asymptote-3.05/0000755000000000000000000000000015031566777012205 5ustar rootrootasymptote-3.05/tr.cc0000644000000000000000000002376015031566105013132 0ustar rootroot/* This file is released under version 2 of the GNU Library General Public * License (see the files LICENSE.LIBRARY and LICENSE). */ /* $Id: tr.c,v 1.9 1998/01/29 16:56:54 brianp Exp $ */ /* * $Log: tr.c,v $ * Revision 1.9 1998/01/29 16:56:54 brianp * allow trOrtho() and trFrustum() to be called at any time, minor clean-up * * Revision 1.8 1998/01/28 19:47:39 brianp * minor clean-up for C++ * * Revision 1.7 1997/07/21 17:34:38 brianp * added tile borders * * Revision 1.6 1997/07/21 15:47:35 brianp * renamed all "near" and "far" variables * * Revision 1.5 1997/04/26 21:23:25 brianp * added trRasterPos3f function * * Revision 1.4 1997/04/26 19:59:36 brianp * set CurrentTile to -1 before first tile and after last tile * * Revision 1.3 1997/04/22 23:51:15 brianp * added WIN32 header stuff, removed tabs * * Revision 1.2 1997/04/19 23:26:10 brianp * many API changes * * Revision 1.1 1997/04/18 21:53:05 brianp * Initial revision * */ /* * Tiled Rendering library * Version 1.1 * Copyright (C) Brian Paul */ #include "common.h" #ifdef HAVE_GL #include #include #include #include #include "tr.h" #ifdef WIN32 #include #endif #define DEFAULT_TILE_WIDTH 256 #define DEFAULT_TILE_HEIGHT 256 #define DEFAULT_TILE_BORDER 0 namespace gl { void frustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal); void ortho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal); } using gl::frustum; using gl::ortho; struct _TRctx { /* Final image parameters */ GLint ImageWidth, ImageHeight; GLenum ImageFormat, ImageType; GLvoid *ImageBuffer; /* Tile parameters */ GLint TileWidth, TileHeight; GLint TileWidthNB, TileHeightNB; GLint TileBorder; GLenum TileFormat, TileType; GLvoid *TileBuffer; /* Projection parameters */ GLboolean Perspective; GLdouble Left; GLdouble Right; GLdouble Bottom; GLdouble Top; GLdouble Near; GLdouble Far; /* Misc */ TRenum RowOrder; GLint Rows, Columns; GLint CurrentTile; GLint CurrentTileWidth, CurrentTileHeight; GLint CurrentRow, CurrentColumn; GLint ViewportSave[4]; }; /* * Misc setup including computing number of tiles (rows and columns). */ static void Setup(TRcontext *tr) { if (!tr) return; tr->Columns = (tr->ImageWidth + tr->TileWidthNB - 1) / tr->TileWidthNB; tr->Rows = (tr->ImageHeight + tr->TileHeightNB - 1) / tr->TileHeightNB; tr->CurrentTile = 0; assert(tr->Columns >= 0); assert(tr->Rows >= 0); } TRcontext *trNew(void) { TRcontext *tr = (TRcontext *) calloc(1, sizeof(TRcontext)); if (tr) { tr->TileWidth = DEFAULT_TILE_WIDTH; tr->TileHeight = DEFAULT_TILE_HEIGHT; tr->TileBorder = DEFAULT_TILE_BORDER; tr->RowOrder = TR_BOTTOM_TO_TOP; tr->CurrentTile = -1; } return (TRcontext *) tr; } void trDelete(TRcontext *tr) { if (tr) free(tr); } void trTileSize(TRcontext *tr, GLint width, GLint height, GLint border) { if (!tr) return; assert(border >= 0); assert(width >= 1); assert(height >= 1); assert(width >= 2*border); assert(height >= 2*border); tr->TileBorder = border; tr->TileWidth = width; tr->TileHeight = height; tr->TileWidthNB = width - 2 * border; tr->TileHeightNB = height - 2 * border; Setup(tr); } void trTileBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image) { if (!tr) return; tr->TileFormat = format; tr->TileType = type; tr->TileBuffer = image; } void trImageSize(TRcontext *tr, GLint width, GLint height) { if (!tr) return; tr->ImageWidth = width; tr->ImageHeight = height; Setup(tr); } void trImageBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image) { if (!tr) return; tr->ImageFormat = format; tr->ImageType = type; tr->ImageBuffer = image; } GLint trGet(TRcontext *tr, TRenum param) { if (!tr) return 0; switch (param) { case TR_TILE_WIDTH: return tr->TileWidth; case TR_TILE_HEIGHT: return tr->TileHeight; case TR_TILE_BORDER: return tr->TileBorder; case TR_IMAGE_WIDTH: return tr->ImageWidth; case TR_IMAGE_HEIGHT: return tr->ImageHeight; case TR_ROWS: return tr->Rows; case TR_COLUMNS: return tr->Columns; case TR_CURRENT_ROW: if (tr->CurrentTile<0) return -1; else return tr->CurrentRow; case TR_CURRENT_COLUMN: if (tr->CurrentTile<0) return -1; else return tr->CurrentColumn; case TR_CURRENT_TILE_WIDTH: return tr->CurrentTileWidth; case TR_CURRENT_TILE_HEIGHT: return tr->CurrentTileHeight; case TR_ROW_ORDER: return (GLint) tr->RowOrder; default: return 0; } } void trRowOrder(TRcontext *tr, TRenum order) { if (!tr) return; if (order==TR_TOP_TO_BOTTOM || order==TR_BOTTOM_TO_TOP) tr->RowOrder = order; } void trOrtho(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { if (!tr) return; tr->Perspective = GL_FALSE; tr->Left = left; tr->Right = right; tr->Bottom = bottom; tr->Top = top; tr->Near = zNear; tr->Far = zFar; } void trFrustum(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { if (!tr) return; tr->Perspective = GL_TRUE; tr->Left = left; tr->Right = right; tr->Bottom = bottom; tr->Top = top; tr->Near = zNear; tr->Far = zFar; } void trPerspective(TRcontext *tr, GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar ) { GLdouble xmin, xmax, ymin, ymax; static const double halfradians=acos(-1.0)/360.0; ymax = zNear * tan(fovy * halfradians); ymin = -ymax; xmin = ymin * aspect; xmax = ymax * aspect; trFrustum(tr, xmin, xmax, ymin, ymax, zNear, zFar); } void trBeginTile(TRcontext *tr) { GLint tileWidth, tileHeight, border; GLdouble left, right, bottom, top; if (!tr) return; if (tr->CurrentTile <= 0) { Setup(tr); /* Save user's viewport, will be restored after last tile rendered */ glGetIntegerv(GL_VIEWPORT, tr->ViewportSave); } /* which tile (by row and column) we're about to render */ if (tr->RowOrder==TR_BOTTOM_TO_TOP) { tr->CurrentRow = tr->CurrentTile / tr->Columns; tr->CurrentColumn = tr->CurrentTile % tr->Columns; } else if (tr->RowOrder==TR_TOP_TO_BOTTOM) { tr->CurrentRow = tr->Rows - (tr->CurrentTile / tr->Columns) - 1; tr->CurrentColumn = tr->CurrentTile % tr->Columns; } else { /* This should never happen */ abort(); } assert(tr->CurrentRow < tr->Rows); assert(tr->CurrentColumn < tr->Columns); border = tr->TileBorder; /* Compute actual size of this tile with border */ if (tr->CurrentRow < tr->Rows-1) tileHeight = tr->TileHeight; else tileHeight = tr->ImageHeight - (tr->Rows-1) * (tr->TileHeightNB) + 2 * border; if (tr->CurrentColumn < tr->Columns-1) tileWidth = tr->TileWidth; else tileWidth = tr->ImageWidth - (tr->Columns-1) * (tr->TileWidthNB) + 2 * border; /* Save tile size, with border */ tr->CurrentTileWidth = tileWidth; tr->CurrentTileHeight = tileHeight; glViewport(0, 0, tileWidth, tileHeight); /* tile size including border */ /* compute projection parameters */ left = tr->Left + (tr->Right - tr->Left) * (tr->CurrentColumn * tr->TileWidthNB - border) / tr->ImageWidth; right = left + (tr->Right - tr->Left) * tileWidth / tr->ImageWidth; bottom = tr->Bottom + (tr->Top - tr->Bottom) * (tr->CurrentRow * tr->TileHeightNB - border) / tr->ImageHeight; top = bottom + (tr->Top - tr->Bottom) * tileHeight / tr->ImageHeight; if (tr->Perspective) frustum(left, right, bottom, top, tr->Near, tr->Far); else ortho(left, right, bottom, top, tr->Near, tr->Far); } int trEndTile(TRcontext *tr) { GLint prevRowLength, prevSkipRows, prevSkipPixels; if (!tr) return 0; assert(tr->CurrentTile>=0); /* be sure OpenGL rendering is finished */ glFlush(); /* save current glPixelStore values */ glGetIntegerv(GL_PACK_ROW_LENGTH, &prevRowLength); glGetIntegerv(GL_PACK_SKIP_ROWS, &prevSkipRows); glGetIntegerv(GL_PACK_SKIP_PIXELS, &prevSkipPixels); /*glGetIntegerv(GL_PACK_ALIGNMENT, &prevAlignment);*/ if (tr->TileBuffer) { GLint srcX = tr->TileBorder; GLint srcY = tr->TileBorder; GLint srcWidth = tr->TileWidthNB; GLint srcHeight = tr->TileHeightNB; glReadPixels(srcX, srcY, srcWidth, srcHeight, tr->TileFormat, tr->TileType, tr->TileBuffer); } if (tr->ImageBuffer) { GLint srcX = tr->TileBorder; GLint srcY = tr->TileBorder; GLint srcWidth = tr->CurrentTileWidth - 2 * tr->TileBorder; GLint srcHeight = tr->CurrentTileHeight - 2 * tr->TileBorder; GLint destX = tr->TileWidthNB * tr->CurrentColumn; GLint destY = tr->TileHeightNB * tr->CurrentRow; /* setup pixel store for glReadPixels */ glPixelStorei(GL_PACK_ROW_LENGTH, tr->ImageWidth); glPixelStorei(GL_PACK_SKIP_ROWS, destY); glPixelStorei(GL_PACK_SKIP_PIXELS, destX); /*glPixelStorei(GL_PACK_ALIGNMENT, 1);*/ /* read the tile into the final image */ glReadPixels(srcX, srcY, srcWidth, srcHeight, tr->ImageFormat, tr->ImageType, tr->ImageBuffer); } /* restore previous glPixelStore values */ glPixelStorei(GL_PACK_ROW_LENGTH, prevRowLength); glPixelStorei(GL_PACK_SKIP_ROWS, prevSkipRows); glPixelStorei(GL_PACK_SKIP_PIXELS, prevSkipPixels); /*glPixelStorei(GL_PACK_ALIGNMENT, prevAlignment);*/ /* increment tile counter, return 1 if more tiles left to render */ tr->CurrentTile++; if (tr->CurrentTile >= tr->Rows * tr->Columns) { /* restore user's viewport */ glViewport(tr->ViewportSave[0], tr->ViewportSave[1], tr->ViewportSave[2], tr->ViewportSave[3]); tr->CurrentTile = -1; /* all done */ return 0; } else return 1; } #endif asymptote-3.05/fundec.cc0000644000000000000000000001677615031566105013762 0ustar rootroot/***** * fundec.h * Andy Hammerlindl 2002/8/29 * * Defines the semantics for defining functions. Both the newexp syntax, and * the abbreviated C-style function definition. *****/ #include "fundec.h" #include "errormsg.h" #include "coenv.h" #include "stm.h" #include "runtime.h" namespace absyntax { using namespace trans; using namespace types; using mem::list; varinit *Default=new definit(nullPos); void formal::prettyprint(ostream &out, Int indent) { prettyname( out, keywordOnly ? "formal (keyword only)" : "formal", indent, getPos() ); base->prettyprint(out, indent+1); if (start) start->prettyprint(out, indent+1); if (defval) defval->prettyprint(out, indent+1); } types::formal formal::trans(coenv &e, bool encodeDefVal, bool tacit) { return types::formal(getType(e,tacit), getName(), encodeDefVal ? (bool) getDefaultValue() : 0, getExplicit()); } types::ty *formal::getType(coenv &e, bool tacit) { types::ty *bt = base->trans(e, tacit); types::ty *t = start ? start->getType(bt, e, tacit) : bt; if (t->kind == ty_void && !tacit) { em.error(getPos()); em << "cannot declare parameters of type void"; return primError(); } return t; } void formal::addOps(coenv &e, record *r) { base->addOps(e, r); if (start) start->addOps(base->trans(e, true), e, r); } void formals::prettyprint(ostream &out, Int indent) { prettyname(out, "formals",indent, getPos()); for (list::iterator p = fields.begin(); p != fields.end(); ++p) (*p)->prettyprint(out, indent+1); } void formals::addToSignature(signature& sig, coenv &e, bool encodeDefVal, bool tacit) { for (list::iterator p = fields.begin(); p != fields.end(); ++p) { formal& f=**p; types::formal tf = f.trans(e, encodeDefVal, tacit); if (f.isKeywordOnly()) sig.addKeywordOnly(tf); else sig.add(tf); } if (rest) { if (!tacit && rest->getDefaultValue()) { em.error(rest->getPos()); em << "rest parameters cannot have default values"; } sig.addRest(rest->trans(e, encodeDefVal, tacit)); } } // Returns the types of each parameter as a signature. // encodeDefVal means that it will also encode information regarding // the default values into the signature signature *formals::getSignature(coenv &e, bool encodeDefVal, bool tacit) { signature *sig = new signature; addToSignature(*sig,e,encodeDefVal,tacit); return sig; } // Returns the corresponding function type, assuming it has a return // value of types::ty *result. function *formals::getType(types::ty *result, coenv &e, bool encodeDefVal, bool tacit) { function *ft = new function(result); addToSignature(ft->sig,e,encodeDefVal,tacit); return ft; } void formals::addOps(coenv &e, record *r) { for(list::iterator p = fields.begin(); p != fields.end(); ++p) (*p)->addOps(e, r); if (rest) rest->addOps(e, r); } mem::vector *formals::getFields() { auto *lst = new mem::vector(); for (auto frml : fields) { lst->emplace_back(frml->getAbsyntaxType(), frml->getName()); } return lst; } // Another helper class. Does an assignment, but relying only on the // destination for the type. class basicAssignExp : public exp { varEntry *dest; varinit *value; public: basicAssignExp(position pos, varEntry *dest, varinit *value) : exp(pos), dest(dest), value(value) {} void prettyprint(ostream &out, Int indent) { prettyname(out, "basicAssignExp", indent, getPos()); } types::ty *getType(coenv &) { return dest->getType(); } types::ty *trans(coenv &e) { // This doesn't handle overloaded types for the destination. value->transToType(e, getType(e)); dest->encode(WRITE, pos, e.c); return getType(e); } }; void transDefault(coenv &e, position pos, varEntry *v, varinit *init) { // This roughly translates into the statement // if (isDefault(x)) // x=init; // where x is the variable in v and isDefault is a function that tests // whether x is the default argument token. v->encode(READ, pos, e.c); label end = e.c.fwdLabel(); e.c.useLabel(inst::jump_if_not_default, end); init->transToType(e, v->getType()); v->encode(WRITE, pos, e.c); e.c.encodePop(); e.c.defLabel(end); } void formal::transAsVar(coenv &e, Int index) { symbol name = getName(); if (name) { trans::access *a = e.c.accessFormal(index); assert(a); // Suppress error messages because they will already be reported // when the formals are translated to yield the type earlier. types::ty *t = getType(e, true); varEntry *v = new varEntry(t, a, 0, getPos()); // Translate the default argument before adding the formal to the // environment, consistent with the initializers of variables. if (defval) transDefault(e, getPos(), v, defval); e.e.addVar(name, v); } } void formals::trans(coenv &e) { Int index = 0; for (list::iterator p=fields.begin(); p!=fields.end(); ++p) { (*p)->transAsVar(e, index); ++index; } if (rest) { rest->transAsVar(e, index); ++index; } } void fundef::prettyprint(ostream &out, Int indent) { result->prettyprint(out, indent+1); params->prettyprint(out, indent+1); body->prettyprint(out, indent+1); } function *fundef::transType(coenv &e, bool tacit) { bool encodeDefVal=true; return params->getType(result->trans(e, tacit), e, encodeDefVal, tacit); } function *fundef::transTypeAndAddOps(coenv &e, record *r, bool tacit) { result->addOps(e,r); params->addOps(e,r); function *ft=transType(e, tacit); // No function ops to add. return ft; } varinit *fundef::makeVarInit(function *ft) { struct initializer : public varinit { fundef *f; function *ft; initializer(fundef *f, function *ft) : varinit(f->getPos()), f(f), ft(ft) {} void prettyprint(ostream &out, Int indent) { prettyname(out, "initializer", indent, getPos()); } void transToType(coenv &e, types::ty *target) { assert(ft==target); f->baseTrans(e, ft); } }; return new initializer(this, ft); } void fundef::baseTrans(coenv &e, types::function *ft) { string name = id ? string(id) : string(""); // Create a new function environment. coder fc = e.c.newFunction(getPos(), name, ft); coenv fe(fc,e.e); // Translate the function. fe.e.beginScope(); params->trans(fe); body->trans(fe); types::ty *rt = ft->result; if (rt->kind != ty_void && rt->kind != ty_error && !body->returns()) { em.error(body->getPos()); em << "function must return a value"; } fe.e.endScope(); // Put an instance of the new function on the stack. vm::lambda *l = fe.c.close(); e.c.encode(inst::pushclosure); e.c.encode(inst::makefunc, l); } types::ty *fundef::trans(coenv &e) { // We must addOps for the return type and formals. ex: // // new guide[] (guide f(int)) { // return sequence(f, 10); // }; function *ft=transTypeAndAddOps(e, (record *)0, false); assert(ft); baseTrans(e, ft); return ft; } void fundec::prettyprint(ostream &out, Int indent) { prettyindent(out, indent); out << "fundec '" << id << "'\n"; fun.prettyprint(out, indent); } void fundec::trans(coenv &e) { transAsField(e,0); } void fundec::transAsField(coenv &e, record *r) { function *ft = fun.transTypeAndAddOps(e, r, false); assert(ft); createVar(getPos(), e, r, id, ft, fun.makeVarInit(ft)); } } // namespace absyntax asymptote-3.05/ReleaseNotes0000644002154600047050000041442615031551056015356 0ustar bowmanbowmanRelease Notes for Version 3.05 A bug in handling Xasy-generated transforms was fixed. The asymptote.ualberta.ca server was updated to use the https protocal. Double precision integer XDR reads and writes were fixed under UNIX; XDR and binary string reads and writes were implemented. These overloaded virtual file fields were exposed again: singlereal, singleint, signedint, line, word, csv, and dimension. To support MacOS X, the explicit 'gif:' format was removed from the animate call; warning messages were addressed. Reading V3D files with the native Windows build was fixed. Release Notes for Version 3.04 To support transparent backgrounds, the png16malpha driver of Ghostscript 10 is now used as the default pngdriver; use settings.pngdriver="png16m" or settings.pngdriver="pngalpha" for older versions of Ghostscript. The projection-dependence of WebGL shaders was removed for correct rendering of multiple embedded images. A new setting keys outputs WebGL comments to identify each generated object. Unlink issues under MSWindows and compilation issues were addressed. Release Notes for Version 3.03 The xasy setting was fixed. The rename function and --outname setting are supported again under MSWindows. Release Notes for Version 3.02 The documentation was updated. The MSWindows search path was fixed. Random number generators are now initially seeded with std::random_device. The rendering of 3D pixels was fixed. Release Notes for Version 3.01 A workaround was implemented to fix a segmentation fault under MacOS Monterey. Specifying make SILENT_MAKE= yields more verbose build diagnostics. A floating point exception was fixed. Configuration and compilation issues were addressed. Release Notes for Version 3.00 Configuration issues were addressed. Release Notes for Version 2.99 The libtool dependence of configure was removed. Dependencies of gc builds are no longer tracked. The latest boost library is supported. Further build issues were fixed. Release Notes for Version 2.98 Prebuilt Xasy support files are distributed again. Release Notes for Version 2.97 Build issues were fixed. Release Notes for Version 2.96 New keywords autounravel and using were added. Issues with templated imports were fixed. Asymptote now ships with the Boehm garbage collector. Portability fixes were implemented. Release Notes for Version 2.95 Portability fixes were implemented. Release Notes for Version 2.94 Portability fixes were implemented for compiling under MacOS. Release Notes for Version 2.93 A portability issue with a recent version of Ubuntu was addressed. The windows binary is now built natively using CMake. Release Notes for Version 2.92 A bug in unravelling static fields was fixed. ImageMagick arguments were reordered. An Xasy regex bug was fixed. The bytecode interpreter was optimized. The code to ignore duplicate implicit shipouts now accounts for the format. The slide paperwidth and paperheight are now properly updated. Release Notes for Version 2.91 By default, orthographic projections now use center=true; the camera and target are automatically centered within the scene. The surface constructor for triangles was fixed. A bug in the WebGL flatness test was fixed. Triangle group bugs were fixed and now produce compact HTML output. Triangle groups are used for indexed surfaces drawn with the render option tessellate=true. GLSL error reporting was restored. The reported camera up vector was fixed. The map module was fixed. A syntax warning in Xasy was fixed. Improvements were made to the slide module. A bug was fixed in the experimental settings.render=0 mode. The debug option now outputs a traceback. Release Notes for Version 2.90 A bug in the approximate transparency rendering code for GPUs without SSBO support was fixed. Support was added for templated accesses involving imported types, top-level structure types, and static fields. ImageMagick magick convert is now used instead of convert. The add(picture dest, picture src, pair position) function now respects size specifications (backwards incompatible; the previous behaviour can be obtained with add(dest,src.fit(identity),position). The terminal is now reset upon exit. The erase command was fixed. Picture scalings in different dimensions are decoupled again. Flycheck syntax checking support for Emacs was added. Portability issues were addressed. Improvements were made to the documentation, including an introduction to deferred drawing. Release Notes for Version 2.89 Portability fixes were made to allow static builds with or without pkg-config. Static linking of the GSL library is now supported. Redundant templated imports are avoided. Release Notes for Version 2.88 Building against specific static libraries is supported again. An ambiguity in statistics.h was resolved. The output of dvisvgm is optimized by default. PDF 1.5 output is now generated. Release Notes for Version 2.87 Templated imports were implemented. An incorrect dvisvgm optimization is avoided. SVG gradient shading offsets were fixed. Integer are now implicitly formatted with full precision. Inferred assignment of void type is prohibited. An LSP segmentation fault was fixed. Repeated stripping of file extensions is avoided. The --output-directory option of latexmk is supported. The OSMesa compatibility profile is used for offscreen rendering. The fitscreen toggle is fixed. The context menu in Xasy is now only opened for GUI-drawn items. A -v3d option allows embedding V3D content within a PDF file. A workaround was implemented for a MacOS libc++ parsing bug. The documentation was updated. Release Notes for Version 2.86 PDF transfer functions are automatically applied; EPS output suppresses .setblendmode. NaN and inf values can be read in cvs mode. The OpenGL index buffer is properly initialized. WebGL and V3D primitives are used only when unscaled. Bugs in the inversion section of the geometry module were fixed. Portability issues were addressed. Release Notes for Version 2.85 Intersections of 3D paths with Bezier triangles were implemented. A workaround for broken offscreen graphics drivers was implemented. The icon resource file is now pregenerated. Uninitialized variables and a division by zero were fixed. The 3D animation timer and keyboard controls were fixed. A workaround for a linetype bug in the QtSvg library was fixed. Xasy now centers images upon loading. Compilation issues were fixed. The resolution of cputime().change.user was improved. Release Notes for Version 2.84 PDF image compression is now disabled by default for alternative output formats. The default UNIX postscript and PDF viewers were changed to evince. Makefile dependencies were fixed. A Qt compatibility bug was fixed in Xasy. A bug in XDR reads was fixed. A runtime error in the TexHead arrow was fixed. An inversion bug was fixed in the geometry module. A division by zero error in the vectorfield function was fixed. An option to display environment settings was added. The default labelmargin function now accounts for the pen linewidth. The resolution of the wall clock timer was improved. Release Notes for Version 2.83 WebGL triangle groups were fixed. Context menus were added to Xasy objects to allow one to edit the fill type, line type, color, line cap, and optionally add arrowheads. Support for begingroup() and endgroup() was added to Xasy. Scaling in the vectorfield function was fixed. A quotient(x,y) bug when -1 < x/y < 0, introduced in version 2.42, was fixed. Release Notes for Version 2.82 Support for Ghostscript 9.56 was added. Ambiguous functions are listed. The dvisvgmMultipleFiles option is now enabled by default. A bug in generating PDF labels was fixed. The mean color of multicoloured patches is output only for PRC code. Subdivision crack adjustments were disabled for transparent patches. The OpenGL transparency shader was further accelerated. WebGL bounding boxes are now computed by the client upon loading. Version 1.02 of the AsyGL library was released. Release Notes for Version 2.81 Schur decompositions were implemented. A bug in uniform() was fixed. The Xasy bounding box and a crash when opening Xasy files were fixed. The transparency offset buffer is zeroed when GPU compression is unavailable. The surface constructor for solids of revolution was documented. Support for pkg-config was added. Opaque rendering on platforms lacking GL_ARB_fragment_shader_interlock was fixed. Release Notes for Version 2.80 Compression of empty transparent pixel counts and other optimizations were implemented in the transparency shader. A weighted least-squares fit was added. Release Notes for Version 2.79 The transparency shader was further optimized. The tensorshade fillrule was fixed. A compatibility fix was made to xasyBezierInterface.py. A real operator ecast(rational r) was implemented up to maxDenominator=100000. The dvisvgmMultipleFiles option, which speeds up xasy deconstruction with PDF TeX engines, was documented. Release Notes for Version 2.78 The transparency shader was further optimized; an incorrect buffer size and export issues were fixed. A substitute was implemented for a missing strnlen function. Release Notes for Version 2.77 A buffer overflow in the partialsum transparency shader was fixed; the workload distribution over the GPU processors was improved. Release Notes for Version 2.76 WebGL and V3D bounds were fixed, along with the WebGL zoom and viewportshift. Under the Asymptote Web Application, the currentprojection is now persistent; for other WebGL instances, the 'c' keyboard binding can be used to display the currentprojection. The correct defaultfilename is set on reading V3D files from the command line. Portability issues were addressed. Release Notes for Version 2.75 A 2D transparency bug was fixed. Vim support was improved. To support PNG transparency, the default driver was changed from pngalpha to png16m and the pdflatex TeX engine is used instead of latex. A pngdriver option was added. To support WebGL, billboard labels are enabled when configured for offscreen rendering. The subdivision crack work around for PRC output was removed. Compilation without the tirpc library is supported again (but not recommended since the V3D format requires XDR support). Release Notes for Version 2.74 Order-independent transparency is disabled if SSBO support is unavailable. Embedded 3D renderings now work in inline TeX mode. The tiling pen was fixed. Support was added for filling contour plots by quantizing color density images. Unwanted shifting in PDF output when using non-letter size paper was fixed. Due to its limitations, the color.sty package was abandoned in favour of low-level specials. The bounding box contributions of the linejoin and linecap qualifiers are now correctly taken into account. The erase command is inhibited for svg and html output. A crash on save in the lsp server was fixed. Links to the gallery were fixed in the documentation. Release Notes for Version 2.73 The asygl library was updated to support embedding of WebGL and WebGL2 scenes on the same page. Release Notes for Version 2.72 WebGL2 is enabled by default only for examples that use image-based lighting. Multiple output formats in threaded interactive mode are now handled correctly. CPU partial sum indexing is used in the 3D transparency shader if the compute shader fails to compile. Release Notes for Version 2.71 Support for the portable compressed 3D vector file format V3D was added. The default value of settings.prc was changed to false. Efficient order-independent transparency was implemented for modern OpenGL platforms and the OSMesa offscreen rendering engine (with no interactive transparency support for Mac OS X and WebGL). The WebGL library now uses WebGL2 if available. Image-based lighting was implemented. Many bug fixes and improvements were made to Xasy, allowing objects drawn with the graphical editor to be saved to and restored from a .xasy file, as well as being exportable to an .asy file. A function was added to graph a parametric function with control points determined by the specified derivative. The recommended PostScript viewer for MSWindows is now Sumatra PDF. The workflow for generating transparent PDFs and PNGs was fixed. Emacs lasy-mode was patched to work with Emacs >= 23. Support for the Language Server Protocol was added. Compilation with COMPACT=0 is supported again. All threads now return the same error code. A remote command-line interface to http://asymptote.ualberta.ca is now available. Release Notes for Version 2.70 A stack overflow was fixed. Under MSWindows, problems with SVG generation and Xasy installation were fixed. Compiler warning messages were addressed. Release Notes for Version 2.69 A segmentation fault in subpath3 was fixed. The fuzz parameter in bezulate was increased to handle font precision issues. A missing above argument was added in plain_boxes.asy. Scaling bugs in the palette module were fixed. The contour module now respects picture scaling. Bugs in reading null fields were fixed. Orthographic scaling is now consistent with perspective scaling when keepAspect=false. The obsolete everypage package was removed. A compilation issue with LIBCURL and compilation warnings were fixed. Release Notes for Version 2.68 Floating point exceptions in OpenGL libraries are now masked. A normalization used to render tubes was fixed. A Label align(Label,dir) function was added for aligning label normals. A new settings.compress=true option controls PDF image compression. A bool isometry(transform) function was added. Various bugs in the geometry module were fixed. The transpose function ignores uninitialized elements. Null fields are treated as undefined values in cvs mode and in line mode. Uninitialized rendering variables were fixed. A RELEASE variable was added. Logarithmic graphs of surfaces are supported. Files are opened without assuming an asy suffix. Support for Ghostscript 9.53 was implemented. The end argument of Margin functions is now optional. A function cputime().change.clock that returns the high-resolution elapsed wall clock time was added. A --disable-curl option was added. The centering of slides was fixed. Null characters and null strings are supported in the replace function. Configuration without readline support was fixed. In binary mode, an entire file can be read into a string. The getc function now works properly when reading the NUL character. Reproducible builds are supported. Release Notes for Version 2.67 Support was added for importing and inputting URLs. Compilation and 2D SVG to HTML conversion no longer requires the GLM library; 2D html output is fit to the canvas unless settings.absolute=true. Diagnostics for dvisvgm were enabled; SVG clipping was fixed. A -globalread setting (default true) was implemented. Files are opened using the search path, which now includes the examples directory. An invalid array dimensions error was fixed. A WebGL resize event listener was added; the + and - keys now zoom in and out, rather than expanding and shrinking the viewport. Remeshing on export is forced; unnecessary remeshing on zoom in AsyGL is avoided. The triple dir(path3, path3) function was normalized. The repositioning of OpenGL windows was fixed. The copy constructors for path and path3 were fixed. Asymptote errors no longer cause Xasy to hang. A numerical precision issue was fixed. A portable way of skipping whitespace was implemented; casts from empty strings now yield uninitialized values. Interrupt handling under MacOS X was fixed. A devicepixelratio setting was implemented. The error location is displayed in the console. Segmentation faults were fixed. The documentation was updated and the code was reformatted. A hang on exit under MSWindows was fixed. Obsolete encoding modules were removed. Release Notes for Version 2.66 A bug in the Bezier patch bounds was fixed. Vertex and material data are copied from the CPU to GPU only when necessary. The default Headlamp light was brightened. WebGL output is centered in the viewport, extending to the canvas boundary; the precision of planar Bezier surfaces was increased to avoid artifacts. Fullscreen mode has been fixed; the new default maxviewport=(0,0) specifies the screen dimensions. Camera adjustment was fixed. Problems with Xasy and interactive signals under MSWindows were fixed. A background color for both 2D and 3D images can be specified with currentlight.background. Offscreen rendering on headless machines has been reinstated; while the setting offscreen has been removed, one can again configure asy for either onscreen or offscreen rendering. Clipping was removed from the slopefield module. Functions mapArray, mapTemplate, real abs2(pair), and real abs2(triple) were implemented. The new Ghostscript transparency model requires Ghostscript 9.52 or later. The detection of TeX errors was improved. An array segmentation fault was fixed; array dimensions are checked. Flattened monochrome tensor patches with interior internal control points are now drawn as filled cyclic paths. PDF offsets were fixed, along with the auto-reload feature for Acroread. SVG support was improved; 2D images can now be output in HTML format using inline SVG code, to support the Asymptote Web Application, a new cloud service at http://asymptote.ualberta.ca. Release Notes for Version 2.65 A bug in rendering 2D preview images of a 3D scene was fixed. The 100-error TeX limit is gracefully detected, rather than hanging. A more accurate Bezier approximation to the sphere was implemented. An initial perpendicular direction can now be specified for the rotation minimizing frame for a path3; the previous direction is no longer cached between calls. Release Notes for Version 2.64 Discontinuities were removed from the rotation minimizing frame used for constructing tubes. A work around was implemented for an incorrect declaration in obsolete versions of the NetBSD readline header file. Release Notes for Version 2.63 A race condition in the AsyGL library was fixed. Emissive and shininess values can be overridden for vertex colors. Thin Bezier curves can be drawn with lighting enabled. Outline mode for 3D surfaces was fixed; outline and mesh mode were ported to WebGL. Degenerate surface normals were fixed. The octant1, hemisphere, and sphere surfaces were replaced by nondegenerate versions that render faster. The unitcone, unitfrustum, and DefaultHead3 arrowhead were simplified. A robust and more efficient tube routine was implemented; the PRC tube primitive was removed. WebGL compression was achieved by implementing sphere, disk, cylinder, and tube primitives in the AsyGL library. Patches are now split in both directions only when required. If the GNU Readline library is unavailable, the Editline library is used to at least support command-line editing, without history features. An MSDOS configuration issue was fixed. Release Notes for Version 2.62 A hyperbola(point F1, point F2, point M) function was added to the geometry module. Duplicate intersections are avoided. Errors in the texpreamble are handled gracefully, without hanging. Unwanted indentation under LuaLaTex was removed. The WebGL canvas is populated with the design width and height. The WebGL context is stored in the top rather than parent window. To avoid polling, WebGL images now draw directly. Zooming of embedded WebGL images is disabled until activated with a click or touch event, using ESC to cancel activation. WebGL usage comments now suggest embedding as an iframe rather than an object. The obsolete grffile package is no longer used. Typos in the documentation were fixed. Release Notes for Version 2.61 Bugs in the OpenGL driver were fixed. A work around for the WebGL singleton array optimization bug on the Intel GPU was fixed. OpenGL and WebGL attributes are now bound before linking the shaders. Bland's rule is implemented correctly in the simplex solvers. A missing data file was added. Release Notes for Version 2.60 Transparent WebGL backgrounds were fixed. A build issue involving the revision number was fixed. The locatefile function now returns the fully qualified file name. The htmlviewer uses the absolute path for all platforms; it is also used for displaying svg files. SVG output for embedded PNG, JPEG, and external vector EPS and PDF images is supported with the latex TeX engine and dvisvgm 2.8. The simplex solver was optimized. A pad function that pads a picture to a precise size in both directions was introduced. The xasy front end was ported to high-resolutions screens and handles Ctrl-C interrupts correctly. Objects can be positioned finely with the arrow keys while holding down the mouse button. The origin/center order and anchor names were fixed. A front/back detection bug in the solids module was fixed. The grffile package fixes issues with included file names. This release requires Version 1.34 of asymptote.sty (auto-generated). Release Notes for Version 2.59 OpenGL memory allocation and transparency bugs introduced in version 2.54 were fixed. Rendering efficiency was improved. In view of limited GPU resources, only the required material uniforms are passed to each shader. The WebGL vertex and fragment shaders have been moved to the asygl library. Multiple embedded images now share a single WebGL context and shaders, to work around browser limitations. A bug in 3D arrows was fixed. Unavailable material attributes are now ignored. Miscellaneous Python support files were ported to Python3. The obsolete maxvertices setting was removed. Release Notes for Version 2.58 Intersection points in geometry.asy are now returned in currentcoordsys; a numerical precision issue was also fixed. Ambiguous function signatures in geometry.asy are resolved by requiring explicit casts when converting general forms to special cases. The xasy editor selection is now consistent. Building the asymptote.so shared library is supported again. A bug in rendering indexed triangle arrays was fixed. Execution errors in support utilities are now handled gracefully. Due to current limitations of dvisvgm (2.7.4), graphic() can only display SVG output (used by the xasy vector editor) for external vector EPS graphics (embedded images, PDF, PNG, and JPG formats are not yet supported). Building under CYGWIN with X11 is supported again. The --version option lists both enabled and disabled features. The GLX library is explicitly linked if present. Release Notes for Version 2.57 Scenes with lighting disabled are rendered correctly in WebGL. Attempting to output HTML for 2D pictures produces an SVG file. A conditional was removed from the fragment shaders. A viewportshift option was added to the WebGL driver; the home (h) option now forces a remesh. The version number was removed from the local offline copy of asygl. A numerical degeneracy in the conic sections intersection routine was fixed. A workaround for the broken XDR headers under MacOS X was implemented. An issue with animations was fixed. The --version option displays a list of compiled-in features. Release Notes for Version 2.56 An array bounds error was fixed. WebGL output now supports background colors, including transparent backgrounds. Preprocessor conditionals were fixed. Scrolling of webgl images is now disabled within the viewport. Release Notes for Version 2.55 An initialization bug in the OpenGL renderer and portability issues were fixed. Release Notes for Version 2.54 Support for generating and embedding interactive 3D WebGL vector graphics within an HTML file has been added, allowing Asymptote figures to be displayed on modern mobile and desktop browsers. The OpenGL rendering routines were further optimized, yielding higher frame rates and lower memory usage. The view position for perspective projection was fixed. The default value of file word() was fixed. Installation issues were addressed. A new digits setting controls the default output file precision. A hanging pipe was fixed. The popcount function was extended to systems that lack 64-bit integers. The order of PRC quad colours was fixed. If lighting is enabled, vertex colors are now ignored in PRC images; when drawing a surface s, use draw(s,prc() ? nolight : currentlight); to disable lighting manually and recover the old behaviour. Release Notes for Version 2.53 A memory leak and antialiasing artifacts in the 3D rendering engine were fixed. For PRC content, oblique projections are now converted to orthographic projections. Portability issues were addressed. Release Notes for Version 2.52 Under MacOS X, 3D rendering is supported again, the xasy menubar is now visible, and the default PostScript previewer was changed to "open". VISUAL, EDITOR, and OS-specific editor overrides are now supported in xasy. Obsolete code was removed and spelling mistakes were fixed. Release Notes for Version 2.51 Portability fixes for FreeBSD x86 and MacOS X were made. Release Notes for Version 2.50 The Phong-Blinn lighting model was replaced by a physically based rendering model; the ambient attribute was removed. Various portability and build issues were addressed. OpenGL is supported again for both 32-bit and 64-bit MSWindows. Release Notes for Version 2.49 Portability issues and numerical precision issues were fixed. Release Notes for Version 2.48 The OpenGL code was modernized to use GLSL shaders. Transparent triangles of different materials are now sorted before drawing. The viewport option from the light function was removed. A workaround was implemented for the Ghostscript transparency extension -dSAFER bug. Bugs in the simplex method were fixed. Experimental offscreen rendering is now disabled by default due to NVIDIA conflicts. The min, max, minratio, maxratio, and intersection calculations were accelerated. A workaround was implemented for broken Intel GPU drivers under MSWindows. Release Notes for Version 2.47 Further shipout and scaling problems were fixed. Unused files were removed. Multiple-page documents now produce PS instead of EPS output. Release Notes for Version 2.46 The pen width is now accounted for in the bbox function. The relative alignment of a label to a path now transforms correctly with picture rotation. Various shipout issues were fixed. The ghostscript library location from the MSWindows registry is now ignored for compatibility with TeXLive. Release Notes for Version 2.45 The xasy graphical front end for Asymptote has been rewritten to support code reordering, using Qt5 and scalable vector graphics. An uninitialized counter was fixed. A stable=true option was added to sort. The restricted simplex method has been replaced by a complete simplex solver that handles general size constraints. The rpc library has been replaced by the tirpc library. The dvips utility is forced to respect EPS requirements again. The system ghostscript library is now used by default for dvisvgm. Make clean now removes GSL symbols. The MSWindows system path is no longer modified by the installer. A CLZ bug was fixed. Release Notes for Version 2.44 Floating point exceptions are masked again under CYGWIN, pending strtod bug fix (issue #65). Various portability issues were also addressed. Release Notes for Version 2.43 The real modulo operator was fixed. Vector SVG output is now supported for PDF tex engines. Compilation under MacOS X was fixed. Both 32- and 64-bit MSWindows binaries are now available. Release Notes for Version 2.42 Bitreverse and popcount functions were added. An overflow in the modulo operator was fixed. An asymmetry in angle(transform t) was fixed so that angle(yscale(-1))=0. Missing 3D underline characters were fixed. The MSWindows binary is now 64-bit. Release Notes for Version 2.41 The rendering of Bezier patches was improved. Minor improvements were made to perpendicular marks in the geometry package. A perl issue was addressed. Two unwanted temporary files are now removed after TeX processing. EPS output is now supported with all TeX engines. A workaround was implemented for the ImageMagick jpeg black background bug. Release Notes for Version 2.40 A partial workaround for the OpenGL transparency bug was implemented, by presorting transparent triangles of the same material. The examples were updated and a segmentation fault was fixed. Multisample detection, surface rendering, and crack filling algorithms were fixed. The default compilation flags now specify -std=c++11. Release Notes for Version 2.39 A workaround was implemented for the backwards incompatibility in the TeXLive 2016 graphicx package. Empty tick labels in graphs are now avoided. A paletteticks NoTicks option was added. Support for lualatex was improved. Renderers for Bezier patches and curves more efficient than those in the deprecated GLU library were implemented. Release Notes for Version 2.38 An integer division operator # was added. Control points in xasy are now correctly parsed. Longitudinal splitting in the revolution structure of the solids module was fixed. Portability fixes were implemented. The ncurses library is now only required with --enable-readline. A --disable-sigsegv configuration option was added. Release Notes for Version 2.37 The xasy graphical user interface now runs under both Python 2.7 and Python 3. Legacy versions (prior to 9.14) of Ghostscript can be supported by assigning settings.epsdriver="epswrite" (or by setting the environment variable ASYMPTOTE_EPSDRIVER to epswrite). The quiet flag suppresses noninteractive standard output when settings.verbosity <= 1. A progress function was added to the plain_strings module. The smoothcontour3 module was optimized to use Bezier triangles where appropriate, along with a built-in least-squares routine and an improved root finder based on quadratic interpolation. If settings.sysdir is empty, preference is given to a version of kpsewhich in the same directory as the executable for determining the correct sysdir. The handling of degenerate normals of Bezier triangles was fixed. Bugs in forking, integer formatting, dash adjustment, subpaths, and guide reversion were fixed. Version 1.30 of asymptote.sty (auto-generated) and version 0.35 (or later) of media9.sty are now required. Release Notes for Version 2.36 Bezier triangle patches have been implemented in place of degenerate Bezier tensor product patches. Surface rendering was improved. The configuration of the readline and gc libraries was fixed. The asy configuration directory is only created if localhistory=false. Patches are now sorted by projected distance. Animations were fixed by running LaTeX twice. The asy-mode.el headers were updated. Intermittent segmentation faults and floating point exceptions in the OpenGL renderer were fixed. Support for GSL 2.0 was added. A quite nan constant was added. Straight segments are no longer split in bezulate. Segmentation faults in tab completion were fixed. A work around for a clang 3.7.0 compiler bug was implemented. The smoothcontour routine was sped up. Several bugs in the file read routines were fixed. A bug in rest argument signature equivalence was fixed. Threads are no longer used in batch mode, except under MacOS X. A convenience function graphicscale was added for using graphic with the ConTeXt tex engine. The splinetype detection for Spline surfaces was fixed. Release Notes for Version 2.35 A work around was implemented for a ghostscript eps2write bug that forces all postscript to the first page, breaking multiple 3D XeLaTeX and ConTeXt labels. Release Notes for Version 2.34 The readability of named pen colors was improved in the documentation. A surface cone(path3 base, triple vertex) routine was added for constructing an approximate cone over an arbitrary base. A test for Ghostscript 9.14 or later was added to the build process. The documentation was updated. A CYGWIN warning message under Windows 8 was fixed. Release Notes for Version 2.33 A work around was implemented for the missing epswrite driver in ghostscript-9.15. Deconstruction is now always done in the C locale. A work around for a unit change in dvisvgm-1.5.3 was implemented. The path arc(pair B, pair A, pair C, real r) function was fixed. The handling of the boolean condition in parametric surfaces was fixed. The default meshlight was changed to nolight so that mesh lines with positive width appear consistent with the default mesh lines. A nonsquare image dimension error was fixed. The definition of the SimpleHead arrowhead was fixed. The zoom/menu button and play option were fixed. An intersect(path, surface) function was implemented. A smoothcontour3 module written by Charles Staats and leminiscate example were added. The inline asymptote.sty option now works with xelatex. An obsolete workaround for an Adobe Reader transparency artifact was removed. An asylatexdir option was added to support the pdflatex -output-directory option. An aligndir option for aligning the picture to an arbitrary point of the page boundary was added. The garbage collector was updated to gc-7.4.2. The documentation was updated. Release Notes for Version 2.32 The libc++ stringstream workaround was also enabled for FreeBSD. The segment(bool[] b) function was fixed. The side(pair,pair,pair) function was renamed to orient(pair,pair,pair) and an error in its documentation was corrected. New functions orient(triple,triple,triple,triple) and insphere(triple,triple,triple,triple,triple) were implemented. A random number generator incompatibility on some platforms was fixed. Support was removed for the obsolete utility texi2dvi4a2ps. Compiler warnings were suppressed. Release Notes for Version 2.31 Hangs in 3D font generation and also in the "none" tex engine were fixed. Release Notes for Version 2.30 Compilation issues were addressed. A workaround for the broken stringstream container in MacOS 10.9 libc++ was implemented. The OpenGL zoom/menu button was fixed. Release Notes for Version 2.29 The TeX bidirectional pipe was overhauled to support the context tex engine again. The luatex and lualatex tex engines were enabled. The inline option used by the asymptote.sty LaTeX package and the inlineimage option used for generating external PRC files were fixed. Portability issues were addressed. Release Notes for Version 2.28 A locale bug that interfered with the 3D PRC camera transformation was fixed. Minimum OpenGL window constraints were removed in favour of the viewportsize variable. The transform(u,v,O) function, which projects onto the plane spanned by u and v through point O, was fixed. Numerical overflow issues in quadraticroots and cubicroots were fixed. The documentation was updated. Release Notes for Version 2.27 Move Adobe transparency workaround to C++ code to allow use of texpreamble again with the pdflatex tex engine. Release Notes for Version 2.26 The xasy graphical user interface now terminates the asy process on exit. The xasy code editor under MSWindows was fixed; the default code editor is now winpad. Degenerate HookHead and SimpleHead arrows were fixed. Portability issues were addressed. Release Notes for Version 2.25 A superfluous play button in rendered 3D images embedded by recent versions of media9 is now suppressed. The contour.asy module was reverted to a previous stable linearized version. A numerical precision issue in makepen was fixed. A routine for drawing braces was added. Deep recursion is now avoided in guide flattening. A workaround for an Adobe Reader transparency artifact was implemented for the pdflatex and xelatex tex engines. Raw PRC output can now be generated with the "-f prc" command-line option. Vector patches are now sorted to work around opacity artifacts in many rendering engines. The xasy code editor now accepts command-line options. Under MSWindows, the ghostscript library is searched for in both the 32 bit and 64 bit registries. The FAQ and documentation were updated. Release Notes for Version 2.24 A segmentation fault in drawSphere was fixed. Recursive calls to simpson are now supported. The explicit libglapi dependency was removed. A latexmkrc example file that shows how to store figures in a subdirectory is now included. Release Notes for Version 2.23 Compilation without the FFTW library is now supported again. Release Notes for Version 2.22 Self-defined unary operators are now allowed. Formatted strings instead of real values are compared in OmitFormat. The segment(bool[]) function was rewritten to use the more efficient segmentlimits(bool[]) call. Unnecessary buffering of surface and path3 data was removed. Portability tweaks were made. References to out-of-date trembling examples were removed. Vertex-colored triangles now work again in Adobe XI. The transformation of normal vectors was fixed. PostScript extend qualifiers were added for axial and radial shading. The TEXMFMAN environment variable is now used to find the TeXLive sysdir. Release Notes for Version 2.21 Explicitly transformed billboard labels now work correctly again. The alignment point of OpenGL billboard labels was fixed. An extend parameter was added to the axes (default true) and axes3 (default false) routines. A history recall bug was fixed. A typo was corrected in the documentation of the Jacobi elliptic functions sncndn. Release Notes for Version 2.20 A work around was implemented for a dvipdfmx bug that prevents the xelatex tex engine from properly embedding PRC objects. Billboard rotation is now disabled for explicitly transformed labels. Release Notes for Version 2.19 Numerical resolution issues with the PRC camera orientation and viewportshift were fixed. The lighting of NURBS surfaces was fixed. The special 8192 strlen NSIS build was now correctly reinstated, with stubs, to prevent the installer from overwriting Windows PATH environment variables > 1023 bytes. Release Notes for Version 2.18 A compilation issue on MacOSX was addressed. Secondary axes pictures now inherit the size of the primary picture, so that the markthin marker works properly. The special 8192 strlen NSIS build was reinstated to prevent the installer from overwriting extremely long Windows PATH environment variables. Release Notes for Version 2.17 A bug with non-square pen function images was fixed. Autoscaled logarithmic axes were fixed. Offscreen and non-offscreen rendering are now supported in a single binary (requiring OSMesa version 8), with settings.offscreen defaulting to false. The media9 LaTeX style file is now used to embed 3D PRC content instead of movie15. Local 3D coordinates are now used. PRC Part names are no longer generated by default. A bug in bezulate was fixed. A settings.axes3 flag was added to control the visibility of PRC axes. An efficient 3D routine for drawing many triangles, with specified vertices and optional normals or vertex colors, was implemented. Release Notes for Version 2.16 Ticks are no longer autoscaled when the number of major intervals is specified and autoscale is false. Manual tick scaling was fixed. A bug in the palette range was fixed. A division by zero in constructing curved arrows was fixed. A numerical underflow was fixed. A picture bound error was fixed. The current value of currentpen is now always respected in default arguments. A default viewportwidth is no longer imposed for attached images. A routine for computing camera positions was added. The format command is now more consistent with C++ printf formatting. Named arguments can now appear in function calls after rest arguments. The wheel example was improved to support PDF animations. The erase command no longer resets the machine state. Pipes are now used for xasy communication. A new mode parameter to input and output replaces xinput, xoutput, binput, and boutput. The icon directory path for 64-bit MSWindows systems was fixed. Compilation of native CYGWIN binaries is now supported. Release Notes for Version 2.15 A compilation problem under MacOS X was fixed. Release Notes for Version 2.14 Minor problems in the geometry module were fixed. Billboard interaction is now disabled for offscreen rendering. A markthin(path) marker with opacity thinning was implemented. A locale string was added to format(string,int). The copy, map, and sequence functions were generalized to arbitrary depths. Asymptote can now be compiled as a shared library. A tuple operator was added. The draw(revolution) function now defers drawing until the final camera position is known. Nonrendered preview images can now be generated for fitted pictures. String reads from binary files were fixed. An int ascii(string) function and a bool isnan(real) function were implemented. Jacobi elliptic functions were implemented. A quick reference card was added. Compilation and static initialization issues under MacOS X Lion were addressed. Release Notes for Version 2.13 Compilation and installation issues were addressed. Release Notes for Version 2.12 Minor compilation issues were addressed. Release Notes for Version 2.11 A new offscreen (software) 3D rendering option supports rendering on machines that are remote or lack a working video graphics card. Shifted pens now work correctly. The handling of whitespace in word mode file reads was fixed. A transpose argument was added to the pen function image facility, for consistency with the other image functions. The limit calculation of parabola and hyperbola was fixed in the geometry module. Release Notes for Version 2.10 PRC vertex-shading for straight patches was implemented. A general image routine that uses a pen function of two integer parameters was implemented. A 3D pixel routine was added. A temporary expression is now used to avoid side effects in self operators. Keyword-only function arguments were implemented. The sizing routines were recoded. Bugs in drawline and geometry were fixed. The geometry module no longer overloads the built-in circle and ellipse functions. PDF TeX engines are now supported in xasy. Directory prefixes are no longer stripped from .js and .prc file names. The TeXShop instructions were updated. The asymptote.sty LaTeX style file was updated to allow leading spaces before \end{asy} and to introduce a keepAspect keyval option. Segmentation faults were fixed. Unwanted state-dependency was removed from the startTrembling function of the contributed trembling module by introducing a tremble structure (backwards incompatible change); see the example floatingdisk.asy. Release Notes for Version 2.08 Legend markers now work again. Release Notes for Version 2.07 The -P option required by ghostscript 9.00 was added. The limits command now works correctly with reversed axes. The asyinclude command of asymptote.sty was improved so that asy source files do not need to be sent to publishers; the asy extension is now optional. A mktemp function was implemented. Further MSWindows installer problems were addressed. Release Notes for Version 2.06 Compilation problems and build issues were fixed. Release Notes for Version 2.05 Arbitrary depth array constructors were re-instated. Profiling code was added. Spaces within file names and eps file attachments are now supported in inlinetex mode, and interference from any pre-existing aux file is avoided. A new auto-generated version (1.21) of asymptote.sty contributed by Will Robertson features a latexmk-compatible asyinclude command. Path-overwriting bugs in the NSIS MSWindows installer were circumvented. Release Notes for Version 2.04 Subdivision cracks in transparent labels are no longer filled. Warning messages from the FP package are suppressed. MSDOS line terminators are now handled; DOSendl and DOSnewl line terminators were added. Files generated in inlinetex mode can now be renamed without editing their contents (using asymptote.sty version 1.19). The man page was fixed. The documentation of render.merge was fixed. Release Notes for Version 2.03 An optional asydir parameter that allows asy files to be generated in a subdirectory was added to version 1.18 of asymptote.sty; XeLaTeX support was fixed. Nonrendered preview images via render=0 are now implemented. Blank 3D labels were fixed. Problems with arc directions and ellipses in the geometry module were fixed. The definition of the Dotted linetype was improved. Missing pen and margin parameters were added to the blockconnector function calls. Virtual methods were optimized. Makefile dependencies were fixed and autogenerated files are cleaned up. The dependence of the source tarball on perl was removed. Minor improvements were made to the documentation and man page. The Asymptote installation directory is now automatically added to the MSWindows path. Release Notes for Version 2.02 A global latexusage.asy file is no longer generated, in favour of individual latexusage-*.asy files (this is a backwards incompatible change). Global and local values can now be given for both the inline and attach asymptote.sty (version 1.15) options. Underscores were removed from the .pre and .tex file names in inlinetex mode. Latexmk support was added for compiling individually only those figures that have changed; this requires that the inline option be used for 3D figures. The asy() function was fixed. A multiple fraction bar bug in texpath was fixed. Warning messages and portability issues were addressed. A frame label alignment problem was fixed. PDF animations are now supported with the XeLaTeX TeX engine. Release Notes for Version 2.01 The normal vector for perspective projections was fixed. Individual processing of each figure within a LaTeX document is now supported. The fontsize package uses type1cm.sty again since fix-cm.sty does not appear to work as advertised. Uninitialized item bits are cleared. Extended for statements now support the var type. PenMargin is used in drawing a binarytree. Minor optimizations were made. Release Notes for Version 2.00 The construction of 3D TeX labels was sped up greatly. Plain TeX page numbers were suppressed. Dotted 3D lines and 3D sizing problems were fixed. A general search function for sorted structures was implemented; the lexorder functions in math.asy now return strict partial orders. Additional GSL functions were added. The correct PRC units (PostScript pt units, properly called bp) are now displayed in Adobe Reader. Release Notes for Version 1.99 A segmentation fault was fixed. Perspective animations were fixed. A bug in the bezulate topological sorting algorithm was fixed. A framedelay setting was added for working around OpenGL animation rendering buffer overruns. Further optimizations were made. A portability issue was addressed. Release Notes for Version 1.98 Memory usage and garbage collection were greatly improved, and many optimizations were made. Labels are now aligned using the rotational instead of the shiftless part of the transform. A portable CYGWIN memory limit fix was implemented. Noncyclic strokepaths are discarded to work around a bug in gs 8.71. Release Notes for Version 1.97 A new render.labelfill option (enabled by default) fills subdivision cracks in unlighted labels. The dependence on gcc-4.3 was removed. Offscreen detection and zoom bugs in the OpenGL renderer were fixed. Three-dimensional grouping was improved. The symbol table was replaced with a custom hash table. Portability updates were made. The Cygwin memory limit fix for MSWindows now works even on systems that lack a complete Cygwin installation. The examples were updated to exploit the new PRC rendering options. Release Notes for Version 1.96 The viewpoint function and some examples were updated. Release Notes for Version 1.95 The PRC driver has been overhauled to support model tree groups, lossy compression, efficient representations of elementary geometrical objects, and specialized rendering options. More efficient OpenGL thick tubes were implemented; the capping of 3D curves was improved. The SIGQUIT signal was replaced by SIGTERM. Under MSWindows, the 384MB Cygwin memory limit is now automatically disabled by the Asymptote installer. Inferred variable types were added and operator symbols are now pretranslated. Release Notes for Version 1.94 Workarounds for MSWindows registry problems and obsolete runtime libraries were implemented. The SimpleHead arrowhead was fixed. Additional matrix routines and casts were implemented. The pair dir(path, path) routine now returns a unit vector. Variable conflicts coming from the contour module were addressed. A RadialShadeDraw filltype was implemented. A guide bug was fixed. Redundant mismatched version warnings are avoided. Support for fitting one 3D picture within another was added. The documentation was updated. Release Notes for Version 1.93 Portability issues were addressed. Latticeshading bounds and behaviour under svgemulation were fixed. The initial SVG pen was fixed. A parallelogram block was added to the flowchart module. Temporary files are cleaned up even after TeX errors. The GUI export function was fixed; an SVG export option was added. The XeLaTex bounding box was fixed. Spaces in output directory names are now allowed for supporting drivers. One can cd to other directories, preserving the output directory. All output files are written to the directory part of settings.outname; if this is empty, the current directory is used. Release Notes for Version 1.92 Labels work correctly with oblique projections. Transformed Label alignment and pt scalings were fixed. Latticeshading is now properly clipped. The normal and true Circle calculations were fixed. The interface to the simpson integrator and an array index in contour.asy were fixed. In the flowchart module, the implicit cast from a pair to a virtual node was removed in favour of a block constructor. The ode integration routines now return a structure that includes the sampled time values; dynamic timestepping was implemented for solveBVP. New predefined tick modifiers were added. The CLZ and CTZ bit functions were implemented. PRC part names were fixed. The GL library is now explicitly linked. Memory usage was improved by configuring the garbage collector with --enable-large-config. Null 3D paths are ignored. Non-pdf output is supported for PDF tex engines. Portability changes for CYGWIN 1.7 were made. Release Notes for Version 1.91 The precision of the 3D perspective sizing routines were improved. The offset in transformed 3D labels with render=0 was fixed. 3D planar arrowhead gaps were fixed; a duplicate 3D arrow angle factor was removed. Pen width contributions to the box and ellipse envelopes were fixed. A more robust contour algorithm based on paraboloid approximation was implemented. A polargraph routine for arrays was implemented. Default font problems were fixed. The pdfborder={0 0 0} option was added to settings.hyperrefOptions; the hypersetup command is now used to avoid hyperref option clashes. The size of pngalpha images was fixed; the pngalpha driver is used only if antialias=2. The -alpha Off default convert option was removed in favour of convertOptions="-alpha Off". Inlinetex support for xelatex was updated. Picture transformations are now respected by latticeshade. The Bessel functions J and Y were renamed to Jn and Yn. An operator --(block, block) was implemented to simplify the flowchart syntax. The expression % expands to the last result returned at the interactive prompt. The GLU-1.3 library included in the MSWindows distribution was fixed. Release Notes for Version 1.90 SVG axial, radial, and emulated tensor-patch shading were fixed; the dependency on dvisvgm-0.8.7 was documented. Release Notes for Version 1.89 The draw, fill, and clip commands now pass raw SVG code directly to dvisvgm (version 0.8.6 required); zero-length paths are output as circles. Unsupported SVG elements are converted to PNG images; unimplemented SVG features such as Gouraud and tensor-patch shading can be (partially) emulated as vector elements using the -svgemulation option. The control point normalization of rational NURBS surfaces was fixed; 3D NURBS curves are now implemented. A problem with inlinemovie3 was fixed. The linetype pattern is now a real array: for backwards compatibility, a string is still accepted, but the return type of linetype(pen) is now real[] instead of string (backwards incompatible). The split routine was changed so that an empty delimiter splits on spaces, discarding duplicates. The palette routines are now guaranteed to generate at least the specified number of colours. PNG output produces a transparent background. Surface and path3 garbage collection was fixed. Release Notes for Version 1.88 Compilation without OpenGL was fixed. PRC billboard labels were implemented; settings.billboard was renamed to settings.autobillboard and by default enabled for all 3D labels. The surface constructor for embedding labels on surfaces now draws both the top and bottom faces by default. The meshpen, knot, weight, and color arrays are now properly cached. The example fequlogo.asy illustrates how to draw an arbitrary 3D background plane. The intermediate dvi file is now removed when producing SVG output. Improvements were made to the tutorial. Release Notes for Version 1.87 Support for SVG output was added (requires dvisvgm-0.8.4). Billboard labels were implemented for the OpenGL renderer. OpenGL animations were improved: reverse and step menu items were added, along with a framerate setting. An addStereoViews function and example stereoscopic.asy were added. The addViews function was generalized to handle any layout; the default layout was changed from ThreeViewsFR to SixViewsUS. PRC node names are now implemented for curves, surface, labels, and dots. OmitTick was generalized to omit both major and minor ticks. A graphicx.tex workaround was implemented to parse paths properly. A viewportsize bug was fixed. A memory deallocation bug was fixed. The ENDIAN test was fixed. The ucyclic and vcyclic parameters are no longer set for conditional surfaces. The erase() function clears the PostScript canvas again. A projection() function that returns the interactive camera parameters was implemented. A hyperrefOptions setting was implemented. The tutorial was improved. Release Notes for Version 1.86 PRC polygons were optimized. Surface memory usage was reduced. The automatic sizing of NURBS surfaces was fixed. A bug in the radius of curvature computation at nodes was fixed. The configuration test for the GNU readline library was improved. The naming of PRC parts was implemented. Release Notes for Version 1.85 Compilation is now supported again on platforms lacking OpenGL. Missing pen dimensions were added to a 3D picture sizing routine. The labelsurface routine was renamed to surface and extended to surfaces containing a single patch. Release Notes for Version 1.84 The perspective PRC viewportmargin was fixed. Unwanted spaces were removed from (version 1.10 of) asymptote.sty. Support for drawing PRC and OpenGL NURBS surfaces was added. Obsolete code, including an unwanted inline qualifier, was removed. A split structure that can be adapted for splitting intersecting patches was added, along with the example splitpatch.asy. Release Notes for Version 1.83 OpenGL animations, illustrated in glmovie.asy, were implemented. Viewportshift flicker was fixed. An empirical translation between OpenGL and PRC shininess was implemented. Splined parametric surfaces are now used to implement smooth thick lines and tubes. The projected bounding box calculation and angle calculations were fixed. A labelsurface function was added. The Headlamp light is now the default light; a light argument was added to shipout. Patches are now constructed with the usual orientation for a counterclockwise external path; the convention for tensor product shading was updated. Picture environments for TeX clipping are no longer nested. A texpath initialization bug was fixed. An ASYMPTOTE_HOME environment variable was added. Viewing was fixed for file names containing spaces. A picture sizing bug was fixed. An example of an inset graph was added. Type information for variables is now returned at the interactive prompt. Warning message suppression was improved; warnings in Asymptote code can now be disabled. The cyclic member of an array is now writeable; the obsolete cyclicflag and void cyclic(bool) functions were removed. File mode functions are now virtual members; this backwards incompatibility requires that line(file f) be changed to f.line(), etc. Release Notes for Version 1.82 Threaded exports were fixed. The texpath fontsize was fixed for PDF tex engines. A default currentprojection argument was added to transform3(projection). The -gray and -bw settings are now respected in PRC output. A consistent approximation is now used for drawing tube centers. Missing pt units were added to all fontsize examples. Release Notes for Version 1.81 A boolean targetsize option can now be used to draw 3D labels with the apparent size they would have on the target plane. The camera adjustment algorithms were fixed; the autoadjust flag is respected. Missing path3 functions such as endpoint(path3) were added. The doubleclick timeout under MSWindows was fixed. A workaround for a ConTeXT small font bug is illustrated in contextfonts.asy. File associations are now used under MSWindows for psviewer, pdfviewer, display, and animate. Single quotation marks are now allowed in filenames. Deconstruction is now only supported in PNG format; the xformat setting was removed. The example lmfit illustrates Levenberg-Marquardt nonlinear least-squares fitting. Release Notes for Version 1.80 The interface for changing the precision for XDR/binary files was simplified; file parameters can now be queried as virtual members. The zoom/menu action was improved to emulate a double-click and assigned again to the right mouse button; a left-button binding bug was fixed. New settings zoomfactor, zoomstep, spinstep, arcballradius, resizestep, and doubleclick were added. The OpenGL thread is now exited gracefully; idle state and other parameters are properly reset on quitting. Lighting is now initialized only in home(). Animations with global=false were fixed. An improved (and free) psview PostScript viewer is now suggested for MSDOS users. A mechanism for disabling annoying warnings like "writeoverloaded" was implemented. The documentation directory under TeXLive was fixed. Release Notes for Version 1.79 The perp vector calculation in the solids module was fixed. A bug in the mouse motion functions was fixed. A pan action (which differs from shift due to perspective distortion) was added to the OpenGl renderer; the Camera (c) menu item now outputs all camera settings. The default right mouse button mouse binding was changed from "zoom/menu" to "zoom". User-initiated exports no longer cause the renderer to quit. Dynamic time stepping was fixed in the ode module; the "integrate" routines now return the array of computed values. Operators == and != were added for all built-in arithmetic 2D arrays; a segmentation fault was fixed. The etc/fstab kludge for Cygwin 1.7 was removed. The configuration directory under TeXLive is now $TEXMFCONFIG/asymptote. Release Notes for Version 1.78 Thread locking issues were fixed. The linegranularity is now respected when drawing thick curved lines. A bug in FSAL ODE integrators when using a fixed time step was fixed. Missing miterlimit defaults were added. Xasy was updated to use Python 2.6.2 and Imaging-1.1.7b1 (which requires no alpha support patches). Obsolete patches were removed. More TeXLive build issues were addressed: the install-prebuilt target omits texhash and does not attempt to install PNG files for asymptote.info. A configuration problem with --disable-gc was fixed. The 3D mouse bindings are now customizable. Support was added for generating syntax highlighting for the KDE editor Kate. Release Notes for Version 1.77 Splined parametric surfaces were implemented; a bug in the Cartesian splined surface routines was fixed. An ode module for solving ordinary differential equations was added. A bug in maxtimes and mintimes was fixed. A Levenberg-Marquardt nonlinear fitting routine was added. The format command now returns TeX compatible output only in math mode. A path3 label alignment problem was fixed. The MSWindows support for TeXLive 2009 was fixed. Release Notes for Version 1.76 A bezulate bug was fixed. The resolution and caching of texpath were improved; for PDF tex engines, the basealign pen attribute is now respected. Support for OCG layers was added. Lights Headlamp and White were implemented; the predefined adobe light was removed. Holes are now handled in superpath-to-surface constructor when planar=true. A degenerate transform3 issue was fixed. The alignment of rendered and PRC images was improved; the angle for rendering absolute projections was fixed. Inaccurate TeX and ConTeXt font scalings were fixed. A texsize(string, pen=currentpen) function returns the raw TeX dimensions {width,height,depth}. A new version of asymptote.sty (1.07) fixes attach=true mode. Release Notes for Version 1.75 Issues with 3D labels and texpath, both in inlinetex mode and with the ConTeXt TeX engine, were resolved. A bug in bezulate was fixed. A partial workaround was added for the unimplemented -output-directory ConTeXt option (the current directory must still be writeable). The aspect ratio and viewportmargin calculation in module three was improved, with tighter 3D bounds. A bug in the intersections(path3, surface) routine was fixed. Release Notes for Version 1.74 An error in the surface bounding box routines was fixed. Path/surface intersection routines were added. PDF tex engines are now supported for 3D labels and texpath. The new ConTeXT tex engine can be used for both 2D and non-PRC 3D drawings. Projections LeftView, RightView, FrontView, BackView, BottomView, and TopView, along with an addViews function, were implemented. Portability fixes and various updates to support TeXLive builds were made. The dependence on currentprojection in label(Label, path3) was removed. The font command for LaTeX tex engines now requires all four NFSS (encoding, family, series, shape) arguments. Release Notes for Version 1.73 An alternative OpenGL background color can now be specified with the pen currentlight.background. A new textpath command allows 3D labels to be drawn with settings.texengine="none". Minor bugs in the geometry package were fixed. The interface to the vectorfield routines was improved. The autoadjust parameter was removed from orthographic projections; autoadjust=false is now always respected for perspective projections. Optional warn=true arguments were added to the polar, azimuth, colatitude, and latitude functions. A call to reportError interrupts execution again. A segmentation fault that can occur after file mode errors was fixed. Release Notes for Version 1.72 PostScript calculator function shading was implemented. Interactive camera parameters of the native OpenGL renderer can now be queried. The effective camera positions for oblique projections was fixed. Philippe Ivaldi's geometry_dev module was merged into geometry.asy; trembling_pi was added as trembling.asy. The GSL module was expanded. An extrude routine for labels was implemented. Rotated path label alignments were fixed. The alignment of 3D axis labels was fixed. The basealign pen now always typesets "ace" and "acg" at the same location. Arrow endpoint detection was fixed. A sysdir setting was added, along with an --enable-tetex-build configure option. The store argument of saveline is respected again. Left-justified trailingzero alignment was fixed; a signedtrailingzero specifier was added. Boolean conditions on linearly interpolated surfaces now suppress function evaluation. The adaptive algorithm used for rendering thick lines and tubes was improved. An ambiguity in the flowchart module was fixed. A patch is included to work around an MSWindows XP problem with 3Dgetview in the 2009/03/23 version of movie15.sty. A problem with spurious menu interaction zooming was fixed. The asy.bat MSWindows batch file now respects all command-line arguments. Release Notes for Version 1.70 A labelpath3 module for typesetting curved labels in 3D, contributed by Jens Schwaiger, was added. PenMargin2 was defined for use with planar arrowhead types like DefaultHead2. A center=false parameter was added to projections to allow one to automatically center the target within the bounding volume. The ambiguity in the surface function was resolved. Problems with spaces in filenames were fixed. Release Notes for Version 1.69 Internal patch degeneracies were removed by splitting. Bugs in the windingnumber and the intersection routines were fixed. The inside(path) routine was improved; a fillrule argument was added. The bezulate connect routine was improved. Bezulate is now automatically applied to path arrays: surfaces should be constructed directly, without first calling bezulate. A workaround for recent changes in the hyperref package was implemented. The divisor setting was replaced with purge(divisor=0). The calls to baseline in graph.asy were fixed. A miterlimit attribute was added to pens. Animation problems were fixed. Lighting problems with multiple exports and a quit deadlock were fixed. A new version of asymptote.sty (1.06) fixes an undefined \ASYbox. Release Notes for Version 1.68 Support for 3D inline pdf movies was added. Camera adjustment was fixed; the filesurface.asy example illustrates automated camera and target computation. A deadlock in the export loop was fixed. A new version of asymptote.sty (1.05) fixes the definition of \ASYanimategraphics. The handling of intersection fuzz was improved. The baseline routine was generalized. New paragraphs are now allowed in minipage labels. Some minor errors in the documentation were fixed. Release Notes for Version 1.67 Spurious annotation question marks in 3D PDF attachments were fixed; attached images are now printable. The asy environment defined in the new (1.04) version of asymptote.sty supports keyval options width, height, viewportwidth, viewportheight, and attach; the obsolete asyattach environment was removed. The default viewportwidth is the linewidth in inline mode and 0 in attached mode. Planar projected arrows were fixed. Automatic camera adjustment was improved. A minimum viewportsize can now be specified. The control points for cyclic segments produced by texpath were fixed. Overlap issues in planar surface patches were fixed. Surface constructors were simplified: the routine planar has been replaced by surface(path3) and in most cases there is no need to call bezulate directly. An Align constant was added. The parameter limits used in buildcycle were fixed. The intersection routines now respect the fuzz parameter. Segmentation faults involving null cyclic guides were fixed. Subpath now preserves the straight flag. Pictures containing graphs now transform correctly; unextended axes limits and tick selection were improved. Axial and radial shading respect now respect -gray. The animation prefix was fixed. An example of drawing a surface from irregular data was added. A work around was implemented for an intermittent hang on exit in the 3D native renderer. An auto3D option was added for controlling the poster option. The 2008/10/08 version of movie15.sty is now compulsory. The cd %USERPROFILE% command was removed from asy.bat. Release Notes for Version 1.66 An alignment problem with the pdflatex tex engine was fixed. Problems in the animations module were fixed, including a broken ImageMagick layers optimization. Optional direction arguments were added for three-dimensional bars. The appearance and alignment of the planar arrowheads DefaultHead2, HookHead2, and TeXHead2 was improved; they now accept an optional normal argument and respect the filltype. A transverse/longitudinal confusion was fixed in the solids module. The camera adjustment routine was improved and is now controlled by the autoadjust=true option for perspective projections; the user is notified when the camera is moved. The obsolete featpost3D.asy module was removed. Midpoint interpolation was reinstated for drawing contours. The Asymptote license was upgraded to the GNU Lesser General Public License. Release Notes for Version 1.65 The xelatex tex engine was implemented. Bugs in pdflatex output and the xelatex alignment were fixed. Release Notes for Version 1.64 Support was added for XeLaTeX PDF specials. The target point is not forced to be part of the control volume for absolute projections. The directory is now stripped from the animation prefix; generated PDF animations are no longer automatically deleted. New parameters xsize and ysize of the asyinclude function of the slide module are illustrated in interactive 3D examples in intro.asy. A Protein Data Bank example was added to illustrate the generation of predefined views. The slidedemo example was fixed. The license of the PRC code and tools was upgraded from GPL to LGPL. Release Notes for Version 1.63 Support was added for XeLaTeX (which requires a modified version of movie15.sty; note however that PDF specials are not yet implemented in dvipdfmx). The 2D contour routines were generalized to handle nonuiform lattices; interpolation artifacts are now avoided when the midpoint function values are unknown. The ncell parameter for 3D contours was replaced by nmesh. The complex gamma function was implemented. Interactive rendering of preview images is now properly synchronized. The bounding volume is now automatically expanded to include the target position. An interactive 3D surface of revolution example was added to slidedemo; rendered images are now automatically included when fitting non-PRC pictures. Duplicate beginclip/endclip functions in pstoedit.asy were removed and the pstoedit-3.45 patch was updated to fix compilation errors. Errors on EOF after reading 0 values are no longer reported. One-column legends are now handled correctly. Old-style constructors were replaced with operator init. An electromagnetic spectrum example was added. Release Notes for Version 1.62 Outputting PDF format to other directories was fixed. An int hex(string) function that casts a hexadecimal string to an integer and a pen rgb(string) routine that returns a pen corresponding to a given 6-character RGB hexadecimal string were added. In the dot routines, Label arguments were added and minor bugs were fixed. A parametric version of markuniform was added. Release Notes for Version 1.61 A workaround was implemented for a dvips misconfiguration in TeXlive 2008 that introduces unwanted %%BeginPaperSize commands into the EPS output. The -q option was reinstated; the asymptote.py Python module was fixed. The bezulate.asy module now enforces the same zerowinding fillrule as used by dvips. In solids.asy, a warning is issued if the silhouette routine is used in a fully 3d context. The freeglut extensions to support user-specified multisampling values were re-instated. A freeglut segmentation fault triggered by spurious window creation in the export loop was fixed. An aspect ratio problem was fixed. A string[] to int[] ecast was added. A Pentype function was added. The asydir() function was fixed under MSDOS. Release Notes for Version 1.60 An optional bool3 condition was added to the graph functions, allowing one to skip points or segment a graph into distinct branches, based on a user-supplied test (see the example gamma.asy). A gettriple routine was added. The interp function first promotes its pen arguments to the highest colorspace. Export exceptions are now caught gracefully. Under UNIX, xasy can now be run from a write-protected directory again. A work around was implemented for the inability of the movie15.sty package to handle spaces in filenames. Stack overflow diagnostics were improved. A read from pipe failure under MSDOS was fixed. Release Notes for Version 1.59 A missing filltype option for projected 2D arrowheads was added. The scaling of plain TeX fonts was fixed. Examples that mix 3D exporting and viewing now work properly. With the -nothreads option, the main process now waits for 3D exports to finish before proceeding. Conflicts in slide presentations were fixed; the asy(string) function assigns defaultfilename correctly. A bug in processing command-line options was fixed. Release Notes for Version 1.58 Two-dimensional arrowheads are now drawn automatically for 2D projections. ArcArrow3 routines were added. Standard pen arithmetic is now used in all colorspaces, so that interp(pen,pen,real) and Gradient(pen[] p) now work as expected. A Wheel palette was added and is used in the example gamma3 to indicate the phase of the complex Gamma function. A silhouette routine for solids of revolution is illustrated in the examples spheresilhouette.asy and hyperboloidsilhouette.asy. Problems with 3D axis label alignments were fixed. The example scaledgraph illustrates how to factor out an axis scaling. Interactive mode is now exited on EOF, unless exitonEOF=false. Support for open function signatures was added. A conflict between asymptote.sty and the breqn package was fixed. PNG images for the manual are now built in a separate directory so that they don't take precedence over PDF files. A problem with xasy under MSDOS was fixed. Release Notes for Version 1.57 The pdflatex texengine was fixed. The default MSDOS "start-in" directory is now %USERPROFILE%, for compatibility with the MSWindows Vista operating system. Temporary files are now generated in the directory specified by the -outname (-o) command-line option, so that write access to the current directory is no longer required. Various font size problems were fixed. The axis coverage calculation was improved. An object(Label, envelope, ...) constructor was added, along with support for object transformation and alignment. Clipping is now allowed across page boundaries; beginclip(picture, path[]) and endclip(picture) functions were implemented. Release Notes for Version 1.56 A bounding box bug in the latex texengine was fixed. The font scaling is now rounded to the nearest integer. The wait=true argument of shipout was fixed. The documentation of grid3 was fixed; examples of using grid3 with scale(true) were added. The handling of the asydef environment within Emacs lasy-mode was fixed. An asyinclude function for embedding 3D PRC graphs in slides was implemented. Release Notes for Version 1.55 A serious bug in drawing paths of length 0 that broke the dot(pair) routine was fixed. Problems in guide to path and path to guide conversions were fixed. A triple invert(pair) routine was added to invert a pair z onto the projection plane. The obsolete field of view factor was removed. Release Notes for Version 1.54 The filltype of three-dimensional labels is now respected when render=0. Multiple file batch mode under MSWindows was fixed. The reverse(guide) and guide examination routines were fixed. A reverse(guide3) routine was added. Curved cyclic paths of size 1 were fixed. Fork is now used by default under MSWindows pending stable CYGWIN POSIX thread support; this can be overridden with settings.threads=true. The need to remove latexusage_.pre along with latexusage-* and latexusage.aux when switching between latex and pdflatex usage was documented. Release Notes for Version 1.53 Forking problems under Windows 2000 were fixed and MS-DOS style path warnings were suppressed. Problems with PRC projection sizing and the rendering logic were fixed. The toolbar is now enabled by default within the asyattach environment. Two-dimensional transforms no longer prevent three-dimensional labels from being projected onto the initial viewing plane. Out-of-memory errors in the OpenGL renderer are caught again. The new tube module was documented and a trefoilknot example was added. Release Notes for Version 1.52 Support for generating PRC output on bigendian machines was added. Multisampling was improved: by updating the freeglut library to svn version 761, one can now specify an antialiasing pixel width with the parameter multisample, which is now an integer. The asymptote.sty and asycolors.sty files are now installed by default in $TEXMFLOCAL/tex/latex. The OpenGL renderer by default now uses POSIX threads instead of fork. A work around for the nonstandardized signature of gluNurbsCallback on various MacOS platforms was implemented. Planar vertex shading was fixed. A planar argument to surface was added. To work around rendering problems with some graphics cards, the window is now hidden only when iconify=true. A tube module was added. A setlocale segmentation fault was fixed. Now that we require a multithreaded version of the Boehm garbage collector, the installation instructions were updated for using the system version. An optional user=false argument was added to min(picture), max(picture), and size(picture). The dependency of asy-mode.el on the cc-mode.el source file was removed. Release Notes for Version 1.51 A separate multisample setting is used to control screen antialiasing; multisampling is now only enabled when viewing. The problem of multiple glInit calls is fixed. A more conservative multisampling patch for freeglut is supplied. The OpenGL process is now always forked for better performance. The last freeglut extension was removed. Release Notes for Version 1.50 Detection and support for the native glut library on MacOSX now allows Asymptote's adaptive OpenGL renderer to be used on all major platforms. The OpenGL renderer now supports antialiasing; a race condition and export problems were fixed. The new default value of maxtile=(0,0) denotes the screen dimensions. Lighting problems due to incorrect normal orientations were fixed. The up vector for embedded PRC output was fixed. A viewportmargin parameter was added to allow for a larger viewport. An iconify setting was added for UNIX systems that support rendering in an iconified state. An embed option (default true) was added to allow one to suppress the embedding of a rendered preview image. A new version of asymptote.sty (1.01) supports file attachments, which provide a better way of embedding 3D PRC files in a LaTeX document. The latexusage file prefix was renamed from latexusage_ to latexusage-. A numerical precision issue in the surface of revolution constructor was fixed. Support for three-dimensional dimension bars was added; PenMargin3 and DotMargin3 were fixed. The argument put=Above (put=Below) should now be replaced by above=true (above=false); this is a backwards incompatible change. Release Notes for Version 1.49 Issues with surface normals that led to incorrect lighting were fixed. By default, the mean(pen[]) routine now returns an interpolated pen with the minimum opacity of all given pens. A patch reverse(patch) function was added. The settings.keep flag is now handled correctly in texpath and strokepath. A cornermean function for surfaces was added. Several examples that illustrate patch and vertex shading were updated. Release Notes for Version 1.48 High-resolution OpenGL tiled rendering was implemented. Support for vertex-dependent colors was added. Centering of perspective projections was improved. Rendering artifacts in planar surfaces and thick lines were fixed. A Gradient palette that varies linearly over a specified range of pens was added. An improved surface constructor for convex three-dimensional paths was added; the planar constructor should now only be used for nonconvex paths. A DefaultHead2(filltype filltype=Fill) arrowhead was implemented, along with an optional filltype argument for HookHead2. New maxheight, hstretch, and vstretch parameters were added to legend(). A boolean user=true argument was added to the point(picture, pair) function; the framepoint routine was removed in favour of truepoint(picture, pair, user=false). A roundbox envelope routine was added. An antialias setting (default true) was added. A bug in xasy and an incorrect precontrol bug in write(path) was fixed. Compilation with standard glut for systems without freeglut is now supported. Release Notes for Version 1.47 Support for simple obj files and patch-specific surfacepens and meshpens was added. Surface constructors for triangles were added. Three-dimensional margins were implemented. Flat 3D arrowhead types HookHead2 and TeXHead2 were implemented. By default, 3D arrowheads are now always drawn with currentlight. A missing angle parameter in HookHead3 was added. Functions that construct a pen array from a given function and palette were added, as illustrated in the example elevation.asy. A bug in the cyclic path write functions was fixed. A strokepath(path g, pen p) function was implemented. A missing put argument in grid3 and a missing transform for projected 3D mesh lines were fixed. File prefix problems were fixed. Spurious "camera too close" errors were fixed. Tighter three-dimensional bounds are generated. Release Notes for Version 1.46 Support was added for embedding 3D PRC files within LaTeX even when settings.render=0. An error is now signalled if the user tries to render an image without freeglut library support. The Klein bottle example was updated to use lightgray instead of the new default surface color (black). The sphere animation example was updated to work with the new skeleton structure in the solids module. Release Notes for Version 1.45 Bugs in the solids of revolution and graph3 modules were fixed; longitudinal curves are split into front and back pieces. Min and max arguments were added to axes and axes3. Rendering artifacts are now avoided. When render=0, 2D and 3D objects are now sized consistently. The automatic camera adjustment was improved. Bugs in thick three-dimensional lines were fixed; thick lines are now drawn with fewer Bezier patches and 3D Linetype offsets are supported. The appearance of unitcones and arrows was improved. New arrowhead3 types HookHead3 and TeXHead3 were added. The default surface color is now black. New surface and path constructors were added. Secure options can now be queried as read-only settings. Release Notes for Version 1.44 Full interactive 3D support has been added to Asymptote, with the option of generating and embedding 3D PRC data in PDF files or rendering scenes directly with Asymptote's own fast OpenGL-based renderer. The implicit casts from 3D to 2D objects were removed (in favour of call explicit calls to project). A path[][] texpath(string s) routine was added to convert string into the paths that TeX would fill. Add boolean stroke parameter was added for shading (and clipping to) stroked paths. The Circle and Arc routines were fixed. Autoscaling of graph axes limits is now disabled by default. A path3 path3(path p, triple plane(pair)=XYplane) constructor was added; the path3 routines were moved to C++ code. Optimized and robust versions of the intersection, windingnumber, inside, and surface extrema routines were implemented. The lighting routines were replaced by the OpenGL model. Each Asymptote process once again uses a separate currentpen. A segmentation fault and an incorrect parameter in the Delaunay triangulation routine were fixed. This major overhaul of the three-dimensional graphics has necessitated a few backwards incompatibilities. The most significant change involves filldraw: filldraw(polygon(5),red); should be replaced by draw(surface(polygon(5)),red); Also, the solids module has been improved so that revolution a=revolution(O--X+Z,Z); a.filldraw(red,blue); is now more sensibly written as revolution a=revolution(O--X+Z,Z); draw(surface(a),red); draw(a,blue); Release Notes for Version 1.43 A new array(n, value) function returns an array consisting of n copies of value. Conditional drawing of surfaces meshes was implemented. Vector field support was improved. Graph tick selection without autoscaling was improved. By default, all 2D axes are drawn below existing objects. An interface for drawing contours on arbitrary nonoverlapping meshes was added. Optional support for Jonathan Shewchuk's more robust triangulation routines was added. The file precision setting can now be queried. A beep() function was added. The partialsum function now returns an array of the same length as its argument (backwards incompatible). Dash offset and font selection bugs were fixed. Modules to redefine LaTeX named fontsizes for 10pt and 11pt article documentclasses were added. Problems in asy-mode.el were fixed. A problem with label alignment was fixed. The international inch is now used instead of the U.S. survey inch. The code now compiles cleanly under gcc-4.3.0. Release Notes for Version 1.42 A routine was added for projecting a Label onto a given plane; an ambiguity in the three-dimensional scale routine was resolved. An inside(path p, path q, pen fillrule=currentpen) routine was added to determine if one path is strictly within another. Optional arrows were added to the slopefield routines. The movie function now generates multipage PDF animations when format="pdf" and global=true; a fit argument was added to support an optional filled bounding box for each movie frame. Casts were added between the hsv structure and pens. Bad casts from TeX bidirectional pipe are now caught. In inline latex mode, TeX headers are now output only when needed. A bug in the cancellation of text addition in xasy was fixed. The sticky bit is no longer set when creating the ~/.asy directory. The documentation and FAQ were updated. The dot(real[] a, real[] b) routine now returns the dot product of the vectors a and b; this introduced a backwards incompatibility: dot(x,y) should now be replaced with dot(pairs(x,y)). Release Notes for Version 1.41 Python-style array slices were added. The array virtual field A.keys returns the indices of initialized entries. The concat routine can now take an arbitrary number of arguments. The write functions now output nothing for uninitialized values instead of producing an error. A bounding path is stored in the object structure to allow connections to noncardinal boundary points. The buildcycle algorithm was improved. The expression dir(E) is a synonym for E. The visibility of unsplit solid slices is now properly resolved. A drawpen argument was added to FillDraw. The uniform(real a, real b, int n) function returns a uniform partition of [a,b] into n subintervals. Complex exp, log, sin, and cos functions were added. An interface to the internal adaptive simpson integration routine was added. History lines are now stored immediately after input (as well at exit, after stifling). Support for the HSV colorspace was added. The dependence of non-PDF animations on the animate.sty package was removed by renaming animate.asy to animation.asy (PDF animations still need to import animate.asy). Transparency groups are now respected by xasy. TeX diagnostics were improved. An obsolete function for drawing boxes on pictures was removed in favour of draw(Label,box). Release Notes for Version 1.40 Hatch widths for PDF output were fixed by disabling dynamic line width adjustment. A nurb-related bug in solid shading was also fixed. Release Notes for Version 1.39 In the animate module, a constructor bug was fixed and the temporary multipage pdf movie file is deleted by default. Release Notes for Version 1.38 For perspective projection, nonuniform rational B-splines (NURBS) are now approximated by adding additional control points to Bezier curves. Inline PDF movies can be generated directly within LaTeX files (requires animate package, version 2007/11/30 or later). SimpleHead, HookHead, and TeXHead (Computer Modern) arrow styles were added. FillDraw is automatically reduced to Draw for noncyclic paths. Empty clipping bounding boxes were fixed. The xasy diagnostic Console should now work reliably on all platforms. Graph and interpolation array length diagnostics were improved. The axes routines now take optional xlabel, ylabel, and zlabel arguments defaulting to empty strings. The autoformat axes tick label routines now try to add an extra digit of precision. Pen arguments were added to the flowchart block routines. A path&cycle operator was added. The read1, read2, and read3 routines now affect only the current operation. A -c (command) option and exit() command were implemented. Ambiguous expressions are now resolved by interactiveWrite (with a warning). A patch is included for fixing problems with the Asymptote backend for pstoedit-3.45. Release Notes for Version 1.37 The speed and useability of the graphical user interface has been greatly improved, including full transparency support under MSWindows. The intersections routine was fixed, and an optional fuzz parameter was added. A bug in the arrow routines was fixed. The 2D graph routines were improved when autoscaling is disabled, secondary axis bugs were fixed, and the automatic logarithmic axis coverage routine was re-enabled. Degenerate 3D reference vectors are now handled and the default 3D tick directions were improved. The array returned by intersections is now automatically sorted. A patch is applied to avoid out-of-memory segmentation faults with gc-7.0. A history(int n=1) function can be used to return the interactive history. Automatic semicolons are now added to the history. Locale bugs were fixed. A string[] split function was added. Installation, uninstallation, and diagnostics under MSWindows were improved. A marker dot routine was added. The output(s,update=true) function was fixed. Configure now uses a system version of Boehm GC if the recommended local version isn't present. Release Notes for Version 1.36 Recently introduced bugs in the tex(), postscript(), gsave(), and grestore() commands were fixed. Release Notes for Version 1.35 A hang in testing for the intersection of nearly identical paths in solids.asy was fixed. The numeric formatting of setdash arguments was fixed. Release Notes for Version 1.34 An innovative graphical front end to Asymptote (xasy) has been developed. Clipping of labels is done within a picture environment to avoid unwanted page breaks. The default LaTeX font is now package-dependent. The syntax was generalized to allow expressions such as (x). Comments are now supported when reading strings in csv mode. Nesting capacity overflows in arctime were fixed. The autoscaling of graphs for close minimum and maximum values was improved, the default tick format is automatically adjusted to make tick labels unique, and a general trailingzero format string was added. Improved, robust versions of intersect and intersectionpoints were implemented (based on a new routine intersections). A permissions bug was fixed. A filltype argument was added to the dot routines. Printer stack use was optimized by pruning unneeded gsave/grestore commands. Temporary EPS files are now removed in inline PDF mode. A discussion of the 3D generalization of Hobby's algorithm used in Asymptote was added (intro.asy). Release Notes for Version 1.33 Routines to find the 3D and projected 2D bounding boxes of Bezier surfaces were added to the surface module, along with the standard teapot example. Extended for loops were documented. The page numbering of slide presentations with stepping enabled was fixed. The int type is now a long long type (typically a 64-bit integer). Support for reading and writing 64-bit integers in binary and XDR modes and large file support were added. Input files are now opened in input-only mode. Multiple invocations of labelpath now work. A projection bug in the grid3 module was fixed. The search path order was changed: directories specified by the dir configuration variable are now examined before the .asy subdirectory in the user's home directory. User configuration files are ignored during installation. Some bugs in asy-mode.el were fixed. Texput files are removed again. A memory allocation incompatibility in the workaround for old, broken readline libraries was fixed. The framepoint and truepoint routines now work even when an exact picture size estimate is unavailable; a picture scaling bug was fixed. Writing to a file specified with -o /dir/file.eps is allowed again. A quarticroots solver was added, the cubicroots solver was improved, and a complex quadraticroots solver was added. A workaround for broken texi2dvi installations was implemented. Memory leaks were fixed. The garbage collector was update to gc-7.0; upgrading to gv-3.6.3 is also recommended. A segmentation fault in complement was fixed. Release Notes for Version 1.32 A recently introduced segmentation fault in subpath was fixed. The current directory can now be examined with cd() even if globalwrite is false. The cd path is now only written once in interactive mode. Further garbage collection improvements and leak fixes were made. Release Notes for Version 1.31 Garbage collection was dramatically improved, resulting in reduced memory usage and increased speed. The options -compact and -divisor and the function purge() were added to give the user more control over garbage collection. The array virtual member function delete() with no arguments explicitly deletes all elements of the array. An interpolate(real[][] f, pen[] palette) function was added for constructing the pen array needed by the latticeshade routine. A nullpath frame and picture sizing bug was fixed. LaTeX diagnostics were improved. A facility that does not rely on garbage collection finalizers was implemented for closing open files at the end of each asy process. Release Notes for Version 1.30 Constructors were added. Routines to allow access to guide components were added. The three-dimensional projection and contour routines were optimized. A tickmodifier NoZero and ticklabel format NoZeroFormat were added. A simplified gouraudshade interface was added. A linewidth bug was fixed. The array insert and delete routines were generalized. The new array virtual member "initialized" can be used to detect whether an element is initialized. All fonts are now automatically embedded in PDF files. Inline PDF animations now require version 2007/05/24 or later of the animate.sty package. General root solving routines were added. The implicit initializer for files is null. Boolean arguments were added to the image and shading routines to allow one to disable data buffering. The functionality of the readline routine was split into the routines history, readline, and saveline. Many fixes were made to the Emacs asy-mode.el. Release Notes for Version 1.29 Support for drawing surfaces described by the null space of real-valued functions of three variables was added. The dir command now works correctly for degenerate Bezier paths; an optional final argument can be used to examine incoming and outgoing tangent directions. Numerical overflow and precision issues were addressed. A piecewise monotonic spline type and example were added. Optional fillpen and legend entries were added to histogram. The "q" command quits in interactive mode only if there is no top-level variable of that name. Standard input of strings was fixed. Support for transparent PNG images in xasy was added. Animation support was upgraded to use the new animate.sty package rather than the interim pdfanim_temp.sty package. Release Notes for Version 1.28 TeX error handling was improved. A dvipsOptions configuration variable was added. A recently introduced bug in the XDR routine xinput was fixed. Compilation under the upcoming GCC 4.3 release is now supported. Nonglobal PDF animations, where each frame is separately scaled and written to a file, were implemented. Reading from standard input now works correctly even in the absence of a working readline library. A build problem under Fedora Core 5 was fixed. Parallel builds are now supported. Release Notes for Version 1.27 A Hermite spline graph interpolate type was added for smoothly joining sampled functions. The cycle3, tension3, and curl3 keywords were respectively renamed cycle, tension, and curl. Assignments no longer write the value at the prompt. A bug in longitudinal skeleton detection was fixed. The filloutside routine now works with paths that extend beyond the current boundary. The unit n-point cross function returns a cyclic path. The "append" argument of the output function was renamed to "update", which now allows both reads and writes to the data file. Negative arguments to seek mean relative to the end-of-file; a seekeof function was added. PDF animations can now be loaded from an external file. The TeX pipe handshaking was improved. TeXLive 2007 is now supported under MSWindows. A work around was implemented for a MikTeX bug in handling file names containing spaces. Release Notes for Version 1.26 The correct surface normal is now used when calculating lighting; a Klein bottle example was added. The front/back detection of the transverse skeleton of solids of revolution is fixed. A better camera-independent reference value for resolving path3 orientation is used. A 3D midpoint routine was added. Tick values for broken axes can now be autogenerated; broken logarithmic axes are also supported. A 2D aligned axes example was added. A patch that fixes a redisplay bug in gv-3.6.2 is included. Release Notes for Version 1.25 A new picture size routine, which maps specified user coordinates to a given final size, provides a convenient way of forcing the plotted subregion of a graph to have a fixed size. The correct surface normal is chosen when calculating lighting. The comment character can now be escaped when reading strings from data files (but is disabled when reading raw characters with getc). The new word file mode is useful for reading white space-delimited strings. PostScript output files are now explicitly designated as EPSF in the header line. The minimum width and height of flowchart blocks may now be controlled separately. Interpolation and knot theory modules were added. The usage of path vs. guide in the base files was standardized. Release Notes for Version 1.24 Structures now have implicit initializers. PDF animations are supported in inline tex mode by communicating the texpreamble to LaTeX. The asypreamble environment was removed in favour of corresponding Asymptote commands in the asydef environment. Default y tick values were fixed. The binary space partition now works correctly for projections from infinity; an arbitrary target point can be specified for perspective projections. A 3D version of the intersectionpoints routine was added. Unconditional binary logical operators & and | and bitwise integer functions AND, OR, XOR, and NOT were defined; the array boolean operators && and || were renamed to & and |. The PostScript clipping code was fixed. The angle(rotate(x)) routine now always returns x (mod 360). User debugging errors are now cleared. The fontsize package was updated to use fix-cm.sty instead of type1cm.sty. The Microsoft Windows registry is checked for both GPL and AFPL Ghostscript. A workaround was implemented for a pdflatex vertical offset bug. Segmentation faults in the Delaunay triangulation and image codes were fixed. Release Notes for Version 1.23 Microsoft Windows autoconfiguration has been implemented by querying the registry: Asymptote and the applications it depends on may now be installed in any location. The shipout command is allowed to write to other directories if and only if -global is true. An autoimport configuration setting was added. Importing the Gnu Scientific Library (gsl) now works on all platforms. A texpreamble environment to contain the LaTeX preamble for both LaTeX and Asymptote was added to asymptote.sty. A conflict with the French babel packages was fixed. Background picture sizing in the slide presentation package was fixed. Release Notes for Version 1.22 Problems with loading LaTeX packages and slide presentations were fixed. Non-static variables in every loop iteration are now allocated anew. Formatting under locales with nonperiod decimal separators was fixed, along with logarithmic tick labels near the machine epsilon. Concatenation of nullpaths was fixed. New path markers were added and the perpendicular symbol in the geometry module was improved. The skeleton routines in the solids module were split to provide finer control. Routines to facilitate drawing 3d contours were added. Reading portable XDR binary data into arrays works again; functions for reading and writing also in native binary formats were added. The TeX preamble is no longer output in inline mode. The TeX pipe is now aware of a previously generated aux file. Memory leaks were fixed. An inline limit is now imposed on old compilers to speed up compilation. Setlocale warnings are disabled unless debugging is on. A colorspace command for extracting the colorspace of a pen was added. An Asymptote introductory slide presentation was added and a user-written Asymptote tutorial is now cited in the manual. Release Notes for Version 1.21 Expressions entered at the interactive prompt are automatically evaluated and written to stdout. The routine intersectionpoints returns all intersection points of two paths. Bounding box computations of paths drawn with transformed pen nibs were fixed. Transparency and automatic colorspace promotion are supported when shading and drawing images. A grid3 module for drawing 3D grids and a binary tree module were added. Automatic tick computations were improved: the actual tick value is now passed to the ticklabel formatting routine, even for logarithmic axes. A tickmodifier routine gives users complete control over which of the auto-generated ticks actually get drawn. The contour drawing and filling routines were improved. A --where option makes --listvariables show where global functions and variables are declared. Emacs asy-mode was improved, including function source code lookup. An optional labelpath interface to the PSTricks pstextpath macro was implemented for drawing curved labels along paths. In inline latex usage, picture are no longer scaled by default (use \begin{asy}[\the\linewidth] to recover previous default of scaling to line width). A texcommand option was added to override the tex engine command name. The slide presentation module no longer forces pdflatex; bibliography support was added, figuremattpen was reimplemented, and the spurious vertical shifting of bullets was fixed. Compilation under AIX and IRIX systems is supported. Release Notes for Version 1.20 Explicit yaxis label angles were fixed. Loading and including diagnostics under the -vv option were improved. The Emacs asy-mode now respects TeX-electric-sub-and-superscript. The texpath configuration variable and diagnostics were fixed under MSWindows. Low-resolution palettes now display correctly. A routine to fill cyclic contours was added, along with the example fillcontour.asy. A command-line option to change the current working directory was added. The FAQ was updated. Release Notes for Version 1.19 Bezier surfaces were implemented, along with tensor and Coons patch shading. The cylinder function was changed to be consistent with the cone function. The intersect routine now returns an array of two reals. The unitsize, xunitsize, and yunitsize arguments of shipout have been replaced with a unitsize function. The seconds() function now works portably. Minor bugs in inside() were fixed; a winding number routine was added. The movie bounding box is set to the largest bounding box of all pictures. Portable high-quality embedded PDF movies are now supported, as well as portable external movies. An embedded U3D example was added. Alignment positioning transformation was fixed; a Rotate(pair) and a string(real x) routine was added. Flowchart routines and the labelbox and advection examples now work with pictures as well as frames. An add(picture pic=currentpicture, drawer d) wrapper was added; a picture rescaling bug was fixed. Tex error handling was improved. Optional bounds arguments were added to verbatim postscript and tex commands. Writing to only the local directory is allowed unless the -global (or -unsafe) option is specified. A final backslash continues a line on the interactive prompt; a new multiline option is convenient for cutting and pasting code in interactive mode. Clipping now sets the true size coordinates to 0. Memory usage was reduced. The documentation was updated, including a description of how to produce Debian binaries from RPM binaries. Release Notes for Version 1.18 A pen caching problem and clipping bugs were fixed. Bugs in interactive mode and in linemode string reads were fixed. The picture.scale() routine now guards against division by zero. The drawing of surface meshes was fixed. The minbound and maxbound functions were implemented also for arrays. The labelx, labely, xtick, and ytick routines respect the current graph scaling. The asycolors.sty file was updated to remove the pstricks dependency. The slide package now works with both latex and pdflatex; the colordvi dependency was removed. A nativeformat() function returns "eps" or "pdf", depending on the current tex engine. The pdf() and latex() functions are now visible. The usepackage and minilatex modules check for latex mode. Static variable allocation is now discussed in the FAQ. An image histogram and contour example was added. The diatom example was modified to illustrate interaction of fixed-sized and scaled coordinates. Release Notes for Version 1.17 A workaround for a garbage collection bus error under MacOS X was implemented. A uniform histogram routine was added to the stats module. New frequency binning routines were added. The argument order of the nonuniform frequency binning routines was interchanged for consistency (backwards incompatible). The FAQ was updated. Release Notes for Version 1.16 Inline LaTeX mode was fixed. The legend routine was generalized to allow multiple entries per line; an example was added. The truepoint function was renamed framepoint. A function truepoint that works like point but accounts for fixed-sized objects was added. The picture.calculateTransform function now returns the actual transform used for fitting in the case where only an approximate picture size was available. A 2d frequency binning routine was added to the stats module. A memory leak was fixed. Release Notes for Version 1.15 Graphics label bounds and incorrect path bounds in latticeshade were fixed. The LaTeX color package is now used for the latex and pdflatex engines, to keep them informed of the current color. A unitlength of 1pt is now enforced in inlinetex mode. In cases like 2D graphs where only an approximate picture size estimate is available, the transform is adjusted so that the fitted frame meets the size specification. The cube animation and binary space partition were fixed. The determinant of a singular matrix now returns 0 instead of an error. Temporary pdf files are removed. The gv patches were removed since these are included in the long-awaited gv-3.6.2 release. A workaround for a compilation problem under MacOS X 10.3.9 was implemented. A DIN 15 CAD package and new examples were added. Release Notes for Version 1.14 General affine transforms and clipping may be applied to TeX labels; bugs in label alignment transformation were fixed. The TeX engines latex, pdflatex, tex, and pdftex are supported. Separate xunitsize and yunitsize scalings are allowed. Graph axis bound communication was added to allow axes with ticks and unextended axes to be called on an empty picture. Path labels are drawn after the path (to support UnFill). Filltype definitions were standardized; a Draw filltype was added (for drawing a bounding box around a label). New filloutside routines were added. Images can be drawn for irregular mesh contours and two-dimensional pen arrays. Landscape slides automatically enable PDF autorotate option. A MetaPost buildcycle routine was added. Setlocale errors are ignored. The "Cannot write to venn_.tex" error under Windows XP was fixed. Very old readline libraries found on many MacOS X systems are detected. The editing mode asy-mode.el supports Emacs version 21. The option \usepackage[inline]{asymptote} is now supported under both latex and pdflatex. Release Notes for Version 1.13 Image and contour transposition conventions for matrices were standardized; resolution arguments were removed from the matrix contour routines. The bounding box is now correctly calculated for square pen caps. A bug in drawline was fixed. An up argument was added to the projection routines to specify the camera orientation. The definition and documentation of cone was fixed; surface function signatures were consolidated. New 3d examples were added. Legends and markers are now allowed when drawing superpaths. Zero page alignment no longer suppresses labels; bounding box fuzz was removed. Intelligent interactive auto-completion was added. If scroll is negative, an entire page is scrolled. Support for Adobe Reader annotations was added. Write without data arguments now works like write with data arguments. A list function displays all global functions and variables in a module. The Emacs asy-mode.el was improved. A FAQ was added. Release Notes for Version 1.12 PDF transparency was implemented. The documentation of Bezier curves was improved. Bounding box calculations now account for label scaling. A special case of the Step calculation in graph.asy was fixed. The function scroll(int) was changed to a setting; a quit (q) option was added to the scroll facility. To avoid an unwanted ghostscript window, gswin32c (rather than gswin32) is used by default for producing pdf files under MSDOS. Release Notes for Version 1.11 The defaultformat string is used again for graph tick labelling commands instead of an empty format string. A workaround for the broken libsigsegv-2.3 library that caused a premature exit(1) was implemented. An extra blank line at the end of 3D array writes was removed; 3D array transpose and copy functions were added. The realmult routine was moved to runtime and documented. The example embeddedmovie of embedding movies within PDF files was added. Overflow diagnostic messages during mpeg merges are now suppressed. A twice setting was added to resolve LaTeX references. The settings module is now globally accessible. Duplicate trace messages were pruned. Debugger breakpoints can now be set using a matching substring instead of a line number. Conditional breakpoints are now supported. Runtime errors and interrupts no longer reset the interactive environment. Release Notes for Version 1.10 Parametric surfaces were implemented and parametric graphs now respect picture scaling. Fill and FillDraw now work for markers and superpaths. A bug in reading strings from files was fixed. Support for MikTeX 2.5 and Autoconf > 2.59 was added. Asymptote and output filenames can now contain spaces. Interrupts are working again. A line-based debugger was implemented. Release Notes for Version 1.09 The workaround for the gv-3.6.1 option handling bug now supports earlier versions of gv, including gv-3.5.8. By default, Ghostscript version 8.54 is used by the MSWindows version to produce PDF files. Release Notes for Version 1.08 Resolution problems in the contour routines were fixed; null contour labels are now suppressed. Configuration problems were fixed; the malloc configuration checks were removed and the help command again knows the correct location of the manual. In the slides package, some stepping bugs were fixed, an institution field was added to the titlepage, and vbox support (say for aligned equations) was added. A colorless(pen) function that strips pen color attributes was added. A clean copy of the source files is now shipped. Release Notes for Version 1.07 This release implements uniform and irregular mesh contour drawing algorithms: contours can be individually labelled or filled using a colour density palette. The flowchart interface and alignment were improved. A slope fields package was added. The arrow size limiting code was fixed. Some bugs in makepen were fixed. Image and shading functions now respect the -gray, -rgb, -cmyk, and -bw options. Date arithmetic routines were added. Several small bugs in the graph routines were fixed. Custom three-dimensional projections can now be easily constructed. The public keyword is now the default permission modifer. A new keyword, restricted, makes variables readable but not writeable outside the structure in which they are defined (previous this was the default behaviour). A user-transparent work around for the backwards-incompatible command-line options of gv-3.6.1 was implemented. Various configuration problems were addressed to better support the Asymptote rpm for the Fedora Core Extras project. A cputime() function was added. Release Notes for Version 1.06 General flowchart routines and an example were added. Papersizes other than letter now work with -outformat pdf again. Performance was improved by avoiding unnecessary output flushing. An asycolors.sty package was added to make LaTeX aware of CMYK versions of predefined Asymptote colours. The default pdf viewer for MacOS is now "open". The -u option can now be specified multiple times on the command line. Optional x and y margin arguments were added to Fill. A reverse video option was added to slide.asy; titlepage and title by default call newslide, unless the currentpicture is empty. An argument was added to newslide to allow stepping to be turned off for that slide. The slidedemo example now generates any required eps files. A segmentation fault in eval was fixed. Release Notes for Version 1.05 Shaded and skeletal representations of surfaces of rotation were implemented. New oblique projections were added and bugs in the 3D graph routines were fixed. An argument reversal in one of the add routines was fixed. A clipping margin was added to unfill. General determinants were added. Sin, Cos, Tan, aSin, aCos, and aTan, which use degrees, are now built-in functions. The dash adjustment algorithm was improved. The cubicroots solver now works again when R=0. Internal operations are now added for all variable declarations of new arrays and functions. Automatic viewing can easily be turned off under MSDOS. Nonstandard paper sizes are now correctly handled. The C locale is always used when producing postscript patterns. Configuration problems were fixed. The editor customization files asy.vim and asy-mode.el were moved to the Asymptote system directory. Stepping of slide presentations can now be enabled from the command line. Many new tests were implemented. The examples were moved to the examples subdirectory of the documentation directory. RPM files are now released. Release Notes for Version 1.04 A convenient presentation slide package was developed. The misalignment of TeX and PostScript layers was fixed by giving includegraphics the exact bounding box. The overall bounding box was also fixed. The tension atleast command and the clipping of remote labels by unfill near the frame boundary were fixed. Permission checking for types was added. The new point-like truepoint function uses the actual current picture size. Locale support, the ', I, and F format specifiers, and custom pagewidth and pageheight settings were added. A Ticks specifier draws ticks on both sides of the path; format="%" also suppress tick labels for logarithmic axis. The linetype adjustment to the arclength was improved and can now be optionally disabled. Color names were systematized, including texcolors and x11colors. A general purpose user command-line option accepts arbitrary Asymptote code as a string. All duplicate path points in three.asy are now removed. A convenient fixedscaling picture sizing routine was added. Selected special functions from the GNU scientific library, DESTDIR support, and a Python module to access Asymptote commands were added. The legend skip is now based on the actual legend entry height, not the fontsize. A backwards incompatibility was introduced in attach, add, and legends (add and attach take arguments in the same order as label): attach(point(E),legend(20E),UnFill) -> attach(legend(),point(E),20E,UnFill). Release Notes for Version 1.03 Support was added for compiling under gcc-4.1.0. A memory leak in interactive mode was fixed. A procedure for using CJK fonts was documented. The return type of the three-dimensional intersectionpoint routines was fixed. A function for inverting 2D points projected from 3D back onto a specified plane was added, along with a solid geometry package with routines to draw cylinders. New xaxis(triple,real), min(guide3[]), and max(guide3[]) convenience functions were added. A Degrees function like degrees(pair), except that it returns 0 for a (0,0) argument rather than generating an error, was added. Interactive mode (without command-line editing or history) now works even in the absence of the GNU readline library. An upper limit (100000) on the number of calls to intersectcubics per cubic segment was imposed on the intersection routines. The documentation was updated. Release Notes for Version 1.02 Lighting was implemented for surfaces described by functions and matrices. A bug in the positioning of axis labels was fixed. The type of randMax was fixed. Configuration and diagnostics were improved; the "dir" setting in configuration files is respected. Under MSDOS, the configuration file is now %USERPROFILE%/.asy/config.asy; configuration settings now work as documented. On UNIX systems, installation can optionally be performed without root privileges. Errors thrown by the parser while reading the configuration file are now handled gracefully. The patches to pstoedit were removed since they are now included in pstoedit-3.44. Release Notes for Version 1.01 A bug in the surface plot of a matrix was fixed. A workaround was implemented for the broken GNU readline/history library under MacOS. Release Notes for Version 1.00 A pen bounds error was fixed. A bug in the linear equations solver was fixed. Images now transform properly and nonsquare images appear correctly. The legend argument of draw accepts a Label. An interface to the movie15 package for embedding movies, sounds, and 3D objects within a PDF file was added. A bug where nonsolid pen types were ignored was fixed. Missing xpart, ypart, and zpart functions were re-added. A segmentation fault in format was fixed. An interface to the GNU readline function was added to allow editing of input. A complement function was added. A bug in the 2D graph tick selection routines was fixed; xlimits and ylimits no longer crop data by default. For consistency, the "includegraphics" labeling function was renamed to "graphic". Release Notes for Version 0.99 A bus error and compilation error under MacOS X were fixed. If -debug is set, execution continues after the first error. The "make check" code was fixed. The contributed MacOS X binary site is now mentioned in the documentation. Release Notes for Version 0.98 Command-line options and configuration variables were reorganized into an Asymptote settings module, allowing default values to be set in ~/.asy/config.asy (~/.asy/options is obsolete). Command-line options can be negated by prepending -no to the option name. Type-dependent function and record operators are now added to the parent record. Execution stops after the first error in a runnable. Two- and three-dimensional array min/max functions for all ordered builtin types were implemented. Comments are now allowed within 3d data blocks. The base file plain.asy was split into many subfiles. The currentpen nib is respected. Warning messages are suppressed when shipping out an empty picture. The tick computation was fixed when xaxis and yaxis are called with explicit limits. The -t option was removed as it is no longer needed for generating inline tex files. Machine constants are now implemented as variables rather than functions. Release Notes for Version 0.97 An uninitialized pen transform bug was fixed. A workaround was added for a readline incompatibility under MacOS X 10.4.3. Incorrect and missing names for builtin function arguments were fixed. Duplicate functions were removed. Release Notes for Version 0.96 A MetaPost-style makepen function allows the default pen nib to be changed to any polygonal (possibly nonconvex) cyclic path. A unitsize argument was added to the shipout command. Three-dimensional lighting effects were added and illustrated with the Gouraud shading of a sphere. The MidArrow attribute was fixed. Builtin functions now have named arguments. Brackets are now part of the quote syntax. The write command was generalized to allow writing a list of vectors as columns. Drawing to standard output now works even when there are no labels. The -noView command was replace by -nView or -no View. Several segmentation faults were fixed. Custom axis types were documented. Release Notes for Version 0.95 A memory leak was fixed; garbage collection messages are now suppressed unless the -d option is given. In interactive mode, a reset keyword was implemented to restore the environment, except for the scroll setting. The interactive input command now does an automatic reset. A link was added to the GNU readline library documentation for customizing interactive key bindings. A hang in scroll mode on an end-of-file condition was fixed. To reduce LaTeX memory usage, the scalebox macro is used only where required. A legend problem was fixed. The documentation was updated. Release Notes for Version 0.94 A label bug arising from a conflict between some versions of the LaTeX pstricks and graphicx packages was fixed. Embedded LaTeX files are always run in quiet (-noView) mode. Frame loading issues with imported types (for example, with the triangle SAS constructor in the geometry module) was fixed. The command import graph is now an abbreviation for access graph; unravel graph. Release Notes for Version 0.93 The import scheme was completely redesigned, with new keywords access, unravel, from, and include. A true (rather than emulated) interactive mode and runtime imports have been implemented. The default pdf browser is now acroread; the pdf fuzz workaround for gv was removed. The tension3 and curl3 keywords were re-added; a surface graph routine for matrices was implemented. Problems with csv mode were fixed. The function defaultpen() was renamed to resetdefaultpen(). Integer division via quotient(int,int) is now consistent with the modulo (%) operator. Checks for integer overflow and erf, erfc, and gamma functions were added. More descriptive names latticeshade, axialshade, radialshade, and gouraudshade for the shading routines were chosen. Horizontal and vertical label scaling was implemented. Default command line style-parameters can now be stored in ~/.asy/options. The interactive history file is now ~/.asy/history by default unless -localhistory is specified. Outputting to standard output via "-o -" is now allowed. Release Notes for Version 0.92 Clipping now clips labels and all layers of a picture, not just the most recent one. A bug in precontrol and postcontrol was fixed. A ticklabel bug and precision errors at +/-1e-4 were fixed. An example of a "broken" x axis was added. A dot product now requires explicit pair arguments. The implicit cast from real to pen was removed. Straight flags are now preserved when using a path as part of a guide. An UnFill filltype was added for clipping underneath labels and legends. A struct marker was added to support arbitrary marker locations. Directories are no longer stripped from explicit output filenames. A function inside was implemented to test whether a point is inside a cyclic path. The routines inside, quadratic solver, and intersect in math.asy were replaced by internal C++ routines. A robust real cubic root solver was added. A floating point exception in complex powers when base is zero was fixed. Colinearity checks were added to the leastsquares routine. The interface to plane was changed to return a representation of the plane through point O with normal cross(u,v). The routine intersectionpoint was moved to plain.asy and a 3d version was added to three.asy. We now draw over existing TeX layers when doing 3d hidden surface removal. A 3d aspect ratio can now be specified. A gui() function and MSWindows support for xasy was added; this will require renaming "gui(" to "GUI(" in any existing .gui files. The dir argument of picture.fit() was moved to add(frame,pair) and attach(frame,pair): add(pic.fit(E)) -> add(pic.fit(),E). Release Notes for Version 0.91 Fixed GUI transforms: grouping should not depend on deconstruct flag. Release Notes for Version 0.90 Default function arguments are now evaluated in the scope where the function is defined, not in the scope of the caller. The depth handling of deferred TeX labels was fixed. The positioning of 3d axes labels was improved; an example showing tick and axis label rotation was added. A minimum value of fuzz in the intersect routines is enforced to prevent infinite loops. An error in the man page regarding the -t option was fixed. The write function was generalized to handle an arbitrary number of data values. Release Notes for Version 0.89 The processing of GUI files was fixed. User-specified ticks now work also with logarithmic axes. The arguments of LeftTicks and RightTicks were standardized; it is now possible to include a general string(real) routine to typeset each label. Logarithmic axes ranges of less than a decade are no longer upscaled when autoscaling is disabled. All references to the mailing list were removed from the documentation since the forum is now used in its place. The temporary included PostScript file suffix was renamed from "ps" to "eps". Release Notes for Version 0.88 The graph routines were overhauled to support both two- and three- dimensional axes, partitioning them uniformly in tick value space, not with respect to arclength. An empty format string is treated as defaultformat. A fuzz parameter was added to the intersect routines; these routines now work for points. Data file comments were implemented. The perpendicular routine now uses an alignment argument; scale(pair) was removed. An option was added to asymptote.sty to make all LaTeX symbols visible, along with a second optional string to Label for providing a size estimate for undefined labels. Numerous small bugs were fixed; the pstoedit patch was updated. The installation and instructions were improved. An environment variable for every external command was added. The argument order of the axes routines was standardized; a call like xaxis(min,max,"$x$",red,Bottom,LeftTicks); should now be written xaxis("$x$",Bottom,min,max,red,LeftTicks); Release Notes for Version 0.87 This release implements general hidden surface removal using a binary space partition and adds three-dimensional versions of the standard path functions (arclength, subpath, intersect, etc.), along with circle and arc functions. Hidden surfaces in regular mesh surface plots now are properly handled from any camera location. The arclength rather than the length is used for determining default label position on paths; Relative(real) and Relative(pair) functions were added for labelling paths relative to the total arclength and local path direction. Structure constructors and operators == and != were implemented and documented. The permissions of static functions within structures was fixed. A pen argument to filltype Fill to specify an interior pen distinct from the boundary pen was added. For convenience, array push members now return the pushed element. A missing shift in Label.out(frame) was added. The feynman module was updated to include a new function texshipout; MidArrow was moved to plain.asy. The optional position arguments of BeginArrow and related functions were fixed. A numerically robust quadratic equation solver was added. Release Notes for Version 0.86 Fixed make man problems. Release Notes for Version 0.85 A fully three-dimensional, rotationally invariant, generalization of the two-dimensional MetaPost path construction algorithms has been implemented. A tridiagonal solver was added. Adobe's automatic rotation of PDF files was disabled. Cyclic indices are now allowed only on arrays having the virtual cyclic flag set to true. The bug fix in simplex was generalized. An online help option was added to interactive mode; exit is now a synonym for quit. Microsoft Windows resource fields and an icon were added. ASYMPTOTE_DIR can now be a list of directories. Since some files were moved in this release, Microsoft users may wish to first uninstall the previous release to avoid duplicate files. Release Notes for Version 0.84 This release ports Asymptote to the Microsoft Windows operating system; an executable file is distributed. Label parameters are now in a structure called Label, to which strings are implicitly cast, and which can be rotated and shifted with a transform. Automatic sizing under picture transformation was fixed. A bug in the simplex method was fixed. Lattice and Gouraud shading were added. An array append method, virtual transform components, and transform 6-tuple notation were added. A pen and filltype were added to legend. The 2d graph and palette code were cleaned up. An extend option was added to draw ticks across the graph for producing a grid. Problems with nullguide3 were fixed, the arguments of 3d rotate were swapped, and 3d reflections were added. A spurious papersize comment inserted by newer versions of dvips was removed. Pstoedit support was updated. This release introduces a few minor backward incompatibilities. Here is a summary of the main changes: draw("text",(0,0)--(1,1),1.0) -> draw(Label("text",1.0),(0,0)--(1,1)) label("text",90,(0,0)) -> label(rotate(90)*"text",(0,0)) labeldot("text",(0,0)) -> dot("text",(0,0)) labeldot((0,0)) -> dot(Label,(0,0)) labelbox(2mm,2mm,"text",(0,0)) -> box(Label("text",(0,0)),2mm,2mm) xaxis("$x$",0.5) -> xaxis(Label("$x$",0.5)) labelxtick(1) -> xtick(Label,1) Release Notes for Version 0.83 This release extends Asymptote to three dimensions. A triple type (which replaces the old vector type in math.asy) and a guide3 type were added, along with the 3D projection routines in three.asy. Three-dimensional arrays can now be read in line mode, using blank lines as block delimiters. An array pop function was added. Math mode ($ delimiters) were moved to within the "defaultformat" string, to allow use of non-math mode fonts in tick labels (by overriding the default format). A pticklabel option for drawing tick labels with a different pen was added. Routines labelxtick and labelytick were added, and the tick size and shift in xtick were fixed. The autoscaling of unextended axes was fixed. The xline and yline routines were renamed to xequals and yequals, Dot was renamed to dot, Cross was renamed to cross, the function "Angle(pair)" was renamed to "degrees(pair)", and a "Degrees(pair)" function was added to math.asy. The MetaPost --- operator and the replacement :: for the MetaPost ... operator were implemented. A segmentation fault involving controls points with direction specifiers and a bug in "string font(pen)" were fixed. Tensions in straight sections of paths are now handled as in MetaPost. The -l option was reimplemented. Release Notes for Version 0.82 Initializers for structures and general cast operators can be specified. Functions can be called with named (keyword) arguments, in any order. Rest arguments are supported. Size and aspect ratio arguments, which may be specified with "size", were removed from "shipout". The tick routines were standardized; custom tick locations and arrows on axes were implemented. The default frame initializer nullframe was renamed to newframe. A segmentation fault in the file garbage collection code and an optimization-related bug in fill were fixed. Unlike in the C and C++ languages, an assignment in a function argument is now interpreted as an assignment to a parameter of the same name in the function signature, not within the local scope. The command-line option -d may be used to check Asymptote code for cases where a named function argument may be mistaken for a local assignment. Release Notes for Version 0.81 A guide solver bug was fixed, allowing the construction of graphs with a single data point. Compilation under g++-4.0.0 is now supported. Release Notes for Version 0.80 A segmentation fault on the alpha (cxx) and mac platforms was fixed. All members of the picture structure are now deep copied. The latest Boehm garbage collector (version 6.5) is used by default. Release Notes for Version 0.79 Types are now cached to speed up parsing. All outstanding garbage collection issues were addressed. The autoscaling of scaled axes was fixed. Another example of a secondary axis was added to the documentation. A Pythagorean tree example illustrates picture transforms. Release Notes for Version 0.78 A binary search routine was added for sorted arrays. The handling of NAN values was fixed. The "checkaxis" test in graph.asy was improved. A problem with implicit closing of files was fixed. Minor changes were made to support compilation under Cygwin. A workaround for the garbage collection warning about repeated allocation of very large blocks was introduced, along with other miscellaneous garbage collection updates. A configuration option was added to request use of a (slower, multi-theaded) system version of the Boehm garbage collector. Release Notes for Version 0.77 Integer arguments are now converted to real values before dividing and a real quotient is returned. The "quotient(int, int)" function returns the integer part of that result. Garbage collection has been implemented to fix memory leaks. A knot solving bug was fixed. Pen "plabel" vs. "p" issues were addressed. The eval function was renamed to map and the new eval(string) function was documented. The concat function can be used to concatenate two arrays. Complex exponential and logarithmic functions were added. The new function reltime can be used to compute the label position argument for draw. A new geometry module includes a triangle structure and functions to draw interior arcs of triangles and perpendicular symbols. Release Notes for Version 0.76 Installation has been simplified by removing the last remaining dependency on the boost header files. A "plabel" argument was added to "draw" to allow labels and legends to use a different pen than the curve itself. The pen arguments in the axes routines were rearranged to be consistent with "draw". TeX errors in interactive mode and the TeX preamble are now handled properly. New functions "getstring" and "getreal" can get and remember user parameters. Marker frame arrays, a "Mark(int)" function, and "node", "value", and "slope" path computation functions were added. Problems with implicit scaling were addressed. The "without side-effect" warning was removed. An option was added to list all loaded global functions. The documentation of structures was improved. Release Notes for Version 0.75 This release fixes a number of bugs with the new parser controller, including a segmentation fault with the -p option, problems with interactive mode, and problems reading from standard input. The graph module now uses a better default value of axislabelmargin for positioning axis labels. The put argument of the axis routines was moved to the end of the argument list, for consistency with draw. Convenient xline and yline interfaces to the axis routines were added. The definition of the correlation coefficient in the least squares routine was fixed, and a fit function was added to the 'linefit' structure. A linear interpolation (with endpoint extrapolation) and a binary search routine were added to math.asy. Release Notes for Version 0.74 This release fixes a segmentation fault in version 0.73 and also reduces the default number of colors in image palettes to work around PostScript/PDF limitations (that can cause the manual not to print). Release Notes for Version 0.73 A more efficient type-safe union was used to speed up the virtual machine by roughly a factor of 5. New routines "ellipse" and "labelellipse" were added for drawing ovals around frames and labels. The function "bbox(frame)" was renamed "box(frame)". These routines now prepend to the frame for filling with a background color; they also return the boundary as a guide. A workaround was added for a bug in gcc version 3.3 to facilitate compilation under Darwin (MacOS). Many internal coding improvements were made. asymptote-3.05/align.h0000644000000000000000000000630115031566105013431 0ustar rootroot#ifndef __align_h__ #define __align_h__ 1 #ifndef HAVE_POSIX_MEMALIGN #ifdef __GLIBC_PREREQ #if __GLIBC_PREREQ(2,3) #define HAVE_POSIX_MEMALIGN #endif #else #ifdef _POSIX_SOURCE #define HAVE_POSIX_MEMALIGN #endif #endif #endif #ifdef __Array_h__ namespace Array { static const array1 NULL1; static const array2 NULL2; static const array3 NULL3; } #else #ifdef HAVE_POSIX_MEMALIGN #ifdef _AIX extern "C" int posix_memalign(void **memptr, size_t alignment, size_t size); #endif #else namespace Array { // Adapted from FFTW aligned malloc/free. Assumes that malloc is at least // sizeof(void*)-aligned. Allocated memory must be freed with free0. inline int posix_memalign0(void **memptr, size_t alignment, size_t size) { if(alignment % sizeof (void *) != 0 || (alignment & (alignment - 1)) != 0) return EINVAL; void *p0=malloc(size+alignment); if(!p0) return ENOMEM; void *p=(void *)(((size_t) p0+alignment)&~(alignment-1)); *((void **) p-1)=p0; *memptr=p; return 0; } inline void free0(void *p) { if(p) free(*((void **) p-1)); } } #endif namespace Array { template inline void newAlign(T *&v, size_t len, size_t align) { void *mem=NULL; const char *invalid="Invalid alignment requested"; const char *nomem="Memory limits exceeded"; #ifdef HAVE_POSIX_MEMALIGN int rc=posix_memalign(&mem,align,len*sizeof(T)); #else int rc=posix_memalign0(&mem,align,len*sizeof(T)); #endif if(rc == EINVAL) std::cerr << invalid << std::endl; if(rc == ENOMEM) std::cerr << nomem << std::endl; v=(T *) mem; for(size_t i=0; i < len; i++) new(v+i) T; } template inline void deleteAlign(T *v, size_t len) { for(size_t i=len; i-- > 0;) v[i].~T(); #ifdef HAVE_POSIX_MEMALIGN free(v); #else free0(v); #endif } } #endif namespace utils { extern size_t ALIGNMENT; inline size_t ceilquotient(size_t a, size_t b) { return (a+b-1)/b; } inline Complex *ComplexAlign(size_t size) { if(size == 0) return NULL; Complex *v; Array::newAlign(v,size,ALIGNMENT); return v; } // Return a contiguous array v of n aligned buffers of length size. // Deallocate with deleteAlign(v[0]); delete [] v; inline Complex **ComplexAlign(size_t n, size_t size) { if(n == 0 || size == 0) return NULL; Complex **v=new Complex*[n]; size_t Size=ALIGNMENT*ceilquotient(size,ALIGNMENT); Complex *B=ComplexAlign((n-1)*Size+size); for(size_t i=0; i < n; ++i) v[i]=B+i*Size; return v; } inline double *doubleAlign(size_t size) { double *v; Array::newAlign(v,size,ALIGNMENT); return v; } // Return a contiguous array v of n aligned buffers of length size. // Deallocate with deleteAlign(v[0]); delete [] v; inline double **doubleAlign(size_t n, size_t size) { if(n == 0 || size == 0) return NULL; double **v=new double*[n]; size_t Size=ALIGNMENT*ceilquotient(size,ALIGNMENT); double *B=doubleAlign((n-1)*Size+size); for(size_t i=0; i < n; ++i) v[i]=B+i*Size; return v; } // Extend n*sizeof(Complex) to a multiple of ALIGNMENT inline size_t align(size_t n) { return ceilquotient(n*sizeof(Complex),ALIGNMENT)*ALIGNMENT/sizeof(Complex); } template inline void deleteAlign(T *p) { #ifdef HAVE_POSIX_MEMALIGN free(p); #else Array::free0(p); #endif } } #endif asymptote-3.05/errortestBrokenTemplate.asy0000644000000000000000000000025715031566105017576 0ustar rootroot// File to be incorrectly imported from errortest.asy. typedef import(A, B, C); assert(false); // typedef import gives an error if not the first line typedef import(A, B, C); asymptote-3.05/Delaunay.h0000644000000000000000000000060015031566105014075 0ustar rootroot#ifndef DELAUNAY_H #define DELAUNAY_H #include #include #include #include #include "common.h" struct ITRIANGLE{ Int p1, p2, p3; }; struct IEDGE{ Int p1, p2; }; struct XYZ{ double p[2]; // {x,y} Int i; }; Int Triangulate(Int nv, XYZ pxyz[], ITRIANGLE v[], Int &ntri, bool presort=true, bool postsort=true); #endif asymptote-3.05/array.cc0000644000000000000000000001130415031566105013612 0ustar rootroot/***** * array.cc * Andy Hammerlindl 2008/01/26 * * Array type used by virtual machine. *****/ #include "array.h" #include "mod.h" namespace vm { const char *dereferenceNullArray="dereference of null array"; inline void checkBackSlice(Int left, Int right) { if (right < left) // There isn't a clear behaviour for slices of the form A[5:2], so we don't // allow them. (Atleast, not until we can figure out what the behaviour // should be.) vm::error("slice ends before it begins"); } inline size_t sliceIndex(Int in, size_t len) { if (in < 0) // The Python behaviour here would simply be // in += len; // but this is inconsistent with Asymptote issuing an error for A[-1] if A // is a non-cyclic array, so we also issue an error here. vm::error("invalid negative index in slice of non-cyclic array"); if (in < 0) return 0; size_t index = (size_t)in; return index < len ? index : len; } array *array::slice(Int left, Int right) { checkBackSlice(left, right); if (left == right) return new array(); size_t length=size(); if (length == 0) return new array(); if (cycle) { size_t resultLength = (size_t)(right - left); array *result = new array(resultLength); size_t i = (size_t)imod(left, length), ri = 0; while (ri < resultLength) { (*result)[ri] = (*this)[i]; ++ri; ++i; if (i >= length) i -= length; } return result; } else { // Non-cyclic size_t l = sliceIndex(left, length); size_t r = sliceIndex(right, length); size_t resultLength = r - l; array *result = new array(resultLength); std::copy(this->begin()+l, this->begin()+r, result->begin()); return result; } } void array::setNonBridgingSlice(size_t l, size_t r, mem::vector *a) { assert(0 <= l); assert(l <= r); size_t const sliceLength=r-l; size_t asize=a->size(); if (asize == sliceLength) { // In place std::copy(a->begin(), a->end(), this->begin()+l); } else if (asize < sliceLength) { // Shrinking std::copy(a->begin(), a->end(), this->begin()+l); this->erase(this->begin()+(l+a->size()), this->begin()+r); } else { // Expanding // NOTE: As a speed optimization, we could check capacity() to see if the // array can fit the new entries, and build the new array from scratch // (using swap()) if a new allocation is necessary. std::copy(a->begin(), a->begin()+sliceLength, this->begin()+l); this->insert(this->begin()+r, a->begin()+sliceLength, a->end()); } } void array::setBridgingSlice(size_t l, size_t r, mem::vector *a) { size_t len=this->size(); assert(r<=l); assert(r+len-l == a->size()); std::copy(a->begin(), a->begin()+(len-l), this->begin()+l); std::copy(a->begin()+(len-l), a->end(), this->begin()); } void array::setSlice(Int left, Int right, array *a) { checkBackSlice(left, right); // If we are slicing an array into itself, slice in a copy instead, to ensure // the proper result. mem::vector *v = (a == this) ? new mem::vector(*a) : a; size_t length=size(); if (cycle) { if (right == left) { // Notice that assigning to the slice A[A.length:A.length] is the same as // assigning to the slice A[0:0] for a cyclic array. size_t l = (size_t)imod(left, length); setNonBridgingSlice(l, l, v); } else { if (left + (Int) length < right) vm::error("assigning to cyclic slice with repeated entries"); size_t l = (size_t)imod(left, length); // Set r to length instead of zero, so that slices that go to the end of // the array are properly treated as non-bridging. size_t r = (size_t)imod(right, length); if (r == 0) r = length; if (l < r) setNonBridgingSlice(l, r, v); else { if (r + length - l == v->size()) setBridgingSlice(l, r, v); else vm::error("assignment to cyclic slice is not well defined"); } } } else { size_t l=sliceIndex(left, length); size_t r=sliceIndex(right, length); setNonBridgingSlice(l, r, v); } } item copyItemToDepth(item i, size_t depth) { if(depth == 0) return i; array* a=get(i); if(a == 0) vm::error(dereferenceNullArray); return a->copyToDepth(depth); } array *array::copyToDepth(size_t depth) { if (depth == 0) { return this; } else { size_t n=this->size(); array *a=new array(n); a->cycle = this->cycle; for (size_t i=0; i(n), cycle(false) { for (size_t k=0; kfloat casting or the like) } { // line 525 void f(int); f(); } { // line 649 struct point { int x,y; } point p; p = +p; } { // line 1359 int x, f(); (true) ? x : f; } { // line 1359 int a, a(), b, b(); (true) ? a : b; } { // line 1581 int x, f(); x = f; } { // line 1586 int a, a(), b, b(); a = b; } // newexp.cc { // line 34 int f() = new int () { int x = 5; }; } { // line 64 int x = new int; } { // line 72 struct a { struct b { } } new a.b; } // stm.cc { // line 86 5; } { // line 246 break; } { // line 261 continue; } { // line 282 void f() { return 17; } } { // line 288 int f() { return; } } // dec.cc { // line 378 int f() { int x = 5; } int g() { if (true) return 7; } } // env.h { // line 99 struct m {} struct m {} } { // line 109 int f() { return 1; } int f() { return 2; } int x = 1; int x = 2; struct m { int f() { return 1; } int f() { return 2; } int x = 1; int x = 2; } } // env.cc { // line 107 - currently unreachable as no built-ins are currently used // in records. } { // line 140 // Assuming there is a built-in function void abort(string): void f(string); abort = f; } { // line 168 - currently unreachable as no built-in functions are // currently used in records. } { // line 222 int x = "Hello"; } // Test permissions. { struct A { private int x=4; restricted int y=5; private void f() {} restricted void g() {} } A a; a.x; a.x = 4; a.x += 5; a.y = 6; a.y += 7; a.f; a.f(); a.f = new void() {}; a.g = new void() {}; } { struct A { private int x=4; private void f() {} } A a; from a unravel x; from a unravel f; } { struct A { restricted int y=5; restricted void g() {} } A a; from a unravel y,g; y = 6; y += 7; g = new void() {}; } { struct A { private typedef int T; } A.T x; A.T x=4; int y=2; A.T x=y; A.T x=17+3*y; } { struct A { private typedef int T; } from A unravel T; } { struct A { private typedef int T; } A a; a.T x; a.T x=4; int y=2; a.T x=y; a.T x=17+3*y; } { struct A { private typedef int T; } A a; from a unravel T; } // Read-only settings // Ensure that the safe and globalwrite options can't be modified inside the // code. { access settings; settings.safe=false; settings.safe=true; settings.globalwrite=false; settings.globalwrite=true; } { from settings access safe, globalwrite; safe=false; safe=true; globalwrite=false; globalwrite=true; } { from settings access safe as x, globalwrite as y; x=false; x=true; y=false; y=true; } { import settings; settings.safe=false; settings.safe=true; settings.globalwrite=false; settings.globalwrite=true; safe=false; safe=true; globalwrite=false; globalwrite=true; } // Test cases where var is used outside of type inference. { var x; } { var f() { return 4; } } { (var)3; var x = (var)3; int y = (var)3; } { var[] b = new var[] { 1, 2, 3}; var[] b = new int[] { 1, 2, 3}; var[] c = {1, 2, 3}; new var[] { 4, 5, 6}; int[] d = new var[] { 4, 5, 6}; new var; } { int f(var x = 3) { return 0; } } { int f, f(); var g = f; } { struct A { int f, f(); } var g = A.f; A a; var h = a.f; } { int x; for (var i : x) ; } { int x, x(); for (var i : x) ; } { int x, x(); int[] x = {2,3,4}; for (var i : x) ; } { int[] temp={0}; int[] v={0}; temp[v]= v; } // Keyword and rest errors. { int f(string s="" ... int[] a); f(1,2,3 ... new int[] {4,5,6}, "hi"); f(1,2,3 ... new int[] {4,5,6} ... new int[] {7,8,9}); f(... new int[] {4,5,6}, "hi"); f(... new int[] {4,5,6} ... new int[] {7,8,9}); } { int f(... int[] x, int y); int g(... int[] x, int y) { return 7; } int f(string s ... int[] x, int y); int g(string s ... int[] x, int y) { return 7; } int f(int keyword x, int y); int g(int keyword x, int y) { return 7; } int f(int keyword x, int y, string z); int g(int keyword x, int y, string z) { return 7; } int f(real t, int keyword x, int y); int g(real t, int keyword x, int y) { return 7; } int f(real t, int keyword x, int y, string z); int g(real t, int keyword x, int y, string z) { return 7; } } { int f(int notkeyword x); int g(int notkeyword x) { return 7; } int f(real w, int notkeyword x); int g(real w, int notkeyword x) { return 7; } int f(real w, int keyword y, int notkeyword x); int g(real w, int keyword y, int notkeyword x) { return 7; } int f(real w, int notkeyword y, int keyword x); int g(real w, int notkeyword y, int keyword x) { return 7; } int f(int notkeyword x, int y, string z); int g(int notkeyword x, int y, string z) { return 7; } int f(int notkeyword x, int y); int g(int notkeyword x, int y) { return 7; } int f(int notkeyword x, int y, string z); int g(int notkeyword x, int y, string z) { return 7; } int f(real t, int notkeyword x, int y); int g(real t, int notkeyword x, int y) { return 7; } int f(real t, int notkeyword x, int y, string z); int g(real t, int notkeyword x, int y, string z) { return 7; } } // template import errors { // Need to specify new name. access somefilename(T=int); // "as" misspelled access somefilename(T=int) notas somefilename_int; // missing keyword access somefilename(int) as somefilename_int; // Templated import unsupported import somefilename(T=int); // unexpected template parameters access errortestNonTemplate(T=int) as version; } { typedef import(T); // this file isn't accessed as a template import typedef(T); // should be "typedef import" } { // wrong number of parameters access errortestBrokenTemplate(A=int, B=string) as ett_a; // third param incorrectly named access errortestBrokenTemplate(A=int, B=string, T=real) as ett_b; // keywords in wrong order access errortestBrokenTemplate(A=int, C=real, B=string) as ett_c; // errortestBrokenTemplate.asy has extra "typedef import" access errortestBrokenTemplate(A=int, B=string, C=real) as ett_d; // expected template parameters access errortestBrokenTemplate as ett_e; } // autounravel errors { struct A { static static int x; // too many static modifiers autounravel static int y; // no error static autounravel int z; // no error autounravel autounravel int w; // too many autounravel modifiers autounravel static autounravel int v; // too many autounravel modifiers static autounravel static int u; // too many static modifiers autounravel struct B {} // types cannot be autounraveled } } { autounravel int x; // top-level fields cannot be autounraveled } { struct A { autounravel int qaz; autounravel int qaz; // cannot shadow autounravel qaz } } { // Even if the first (implicitly defined) instance of a function is allowed // to be shadowed, the (explicit) shadower cannot itself be shadowed. struct A { autounravel bool alias(A, A); // no error autounravel bool alias(A, A); // cannot shadow autounravel alias } } { // Non-statically nested types cannot be used as template parameters. struct A { struct B { autounravel int x; } access somefilename(T=B) as somefilename_B; } A a; access somefilename(T=a.B) as somefilename_B; access somefilename(T=A.B) as somefilename_B; } { // no error access errortestTemplate(A=int, B=string) as eft; // wrongly ordered names after correct load access errortestTemplate(B=int, A=string) as eft; // completely wrong names after correct load access errortestTemplate(C=int, D=string) as eft; // first name correct, second name wrong access errortestTemplate(A=int, D=string) as eft; // first name wrong, second name correct access errortestTemplate(C=int, B=string) as eft; // too few parameters access errortestTemplate(A=int) as eft; // too many parameters access errortestTemplate(A=int, B=string, C=real) as eft; // templated imports cannot be run directly include errortestTemplate; } // Test more permissions. { struct A { static int x; static int f; static void f(); static struct R {} } struct T { private static from A unravel x; private static from A unravel f; private static from A unravel R; } T.x; // incorrectly accessing private field (int)T.f; // incorrectly accessing overloaded private field T.f(); // incorrectly accessing overloaded private field T.R r; // correctly accessing private type struct U { private static unravel A; } U.x; // incorrectly accessing private field (int)U.f; // incorrectly accessing overloaded private field U.f(); // incorrectly accessing overloaded private field U.R r; // correctly accessing private type } { struct A { static struct B { autounravel int x; } } struct T { private from A unravel B; // x is autounraveled from B } T.x; // incorrectly accessing private field } asymptote-3.05/interact.cc0000644000000000000000000001235015031566105014307 0ustar rootroot/***** * interact.cc * * The glue between the lexical analyzer and the readline library. *****/ #include #include #include #include #include #include #include #include #if !defined(_WIN32) #include #include #else #include #include #define isatty _isatty #endif #include "interact.h" #include "runhistory.h" #include "util.h" #include "errormsg.h" #if !defined(_WIN32) #define _fdopen fdopen #endif using namespace settings; namespace run { void init_readline(bool); } namespace interact { bool interactive=false; bool uptodate=true; int lines=0; bool query=false; bool tty=isatty(STDIN_FILENO); completer *currentCompleter=0; void setCompleter(completer *c) { currentCompleter=c; } char *call_completer(const char *text, int state) { return currentCompleter ? (*currentCompleter)(text, state) : 0; } #if defined(HAVE_READLINE) && defined(HAVE_LIBCURSES) void init_completion() { rl_completion_entry_function=call_completer; rl_completion_append_character='\0'; // Don't add a space after a match. /* // Build a string containing all characters that separate words to be // completed. All characters that can't form part of an identifier are // treated as break characters. static char break_characters[128]; Int j=0; for (unsigned char c=9; c < 128; ++c) if (!isalnum(c) && c != '_') { break_characters[j]=c; ++j; } break_characters[j]='\0'; rl_completer_word_break_characters=break_characters; */ } #endif char *(*Readline)(const char *prompt); char *readverbatimline(const char *prompt) { if(!cin.good()) {cin.clear(); return NULL;} cout << prompt; string s; getline(cin,s); return StrdupMalloc(s); } FILE *fin=NULL; char *readpipeline(const char *prompt) { #if _POSIX_VERSION >= 200809L char *line=NULL; size_t n=0; return getline(&line,&n,fin) >= 0 ? line : NULL; #else const int max_size=256; static char buf[max_size]; ostringstream s; do { if(fgets(buf,max_size-1,fin) == NULL) break; s << buf; } while(buf[std::strlen(buf)-1] != '\n'); return StrdupMalloc(s.str()); #endif } void pre_readline() { int fd=intcast(settings::getSetting("inpipe")); if(fd >= 0) { if(!fin) { fin=_fdopen(fd,"r"); } if(!fin) { cerr << "Cannot open inpipe " << fd << endl; exit(-1); } Readline=readpipeline; } else { #if defined(HAVE_READLINE) && defined(HAVE_LIBCURSES) if(tty) { Readline=readline; } else #endif Readline=readverbatimline; } } void init_readline(bool tabcompletion) { #if defined(HAVE_READLINE) && defined(HAVE_LIBCURSES) rl_bind_key('\t',tabcompletion ? rl_complete : rl_insert); #endif } void init_interactive() { if(settings::xasy) tty=false; #if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES) if(tty) { init_completion(); interact::init_readline(getSetting("tabcompletion")); read_history(historyname.c_str()); } #endif } string simpleline(string prompt) { // Rebind tab key, as the setting tabcompletion may be changed at runtime. pre_readline(); Signal(SIGINT,SIG_IGN); // Get a line from the user. char *line=Readline(prompt.c_str()); Signal(SIGINT,interruptHandler); // Reset scroll count. interact::lines=0; interact::query=tty; // Ignore keyboard interrupts while taking input. errorstream::interrupt=false; if(line) { string s=line; free(line); return s; } else { #if defined(HAVE_READLINE) && defined(HAVE_LIBCURSES) if(!tty || getSetting("exitonEOF")) #endif { cout << endl; throw EofException(); } return ""; } } void addToHistory(string line) { #if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES) // Only add it if it has something other than newlines. if(tty && line.find_first_not_of('\n') != string::npos) { add_history(line.c_str()); } #endif } string getLastHistoryLine() { #if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES) if(tty && history_length > 0) { HIST_ENTRY *entry=history_list()[history_length-1]; if(!entry) { em.compiler(); em << "cannot access last history line"; return ""; } else return entry->line; } else #endif return ""; } void setLastHistoryLine(string line) { #if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES) if(tty) { if (history_length > 0) { HIST_ENTRY *entry=remove_history(history_length-1); if(!entry) { em.compiler(); em << "cannot modify last history line"; } else { free((char *) entry->line); free(entry); } } addToHistory(line); } #endif } void deleteLastLine() { #if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES) if(tty) { HIST_ENTRY *entry=remove_history(history_length-1); if(!entry) { em.compiler(); em << "cannot delete last history line"; } else { free((char *) entry->line); free(entry); } } #endif } void cleanup_interactive() { #if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES) // Write the history file. if(tty) { stifle_history(intcast(getSetting("historylines"))); write_history(historyname.c_str()); } #endif } } // namespace interact asymptote-3.05/opcodes.h0000644000000000000000000000162415031566105013776 0ustar rootroot/***** * opcodes.h * Andy Hammerlindl 2010/10/24 * * A list of the virtual machine opcodes, defined by the macro OPCODE. *****/ /* The first parameter is the name of the opcode. The second parameter is a * character indicating what additional information (if any) is encoded with * the opcode: * x - nothing * n - integer * t - item * b - builtin * l - lambda pointer * o - instruction offset */ OPCODE(nop, 'x') OPCODE(pop,'x') OPCODE(intpush,'n') OPCODE(constpush,'t') OPCODE(varpush,'n') OPCODE(varsave,'n') OPCODE(fieldpush,'n') OPCODE(fieldsave,'n') OPCODE(builtin,'b') OPCODE(jmp,'o') OPCODE(cjmp,'o') OPCODE(njmp,'o') OPCODE(popcall,'x') OPCODE(pushclosure,'x') OPCODE(makefunc,'l') OPCODE(ret,'x') OPCODE(pushframe,'n') OPCODE(popframe,'x') OPCODE(push_default,'x') OPCODE(jump_if_not_default,'o') #ifdef COMBO OPCODE(varpop,'n') OPCODE(fieldpop,'n') OPCODE(gejmp,'o') #endif asymptote-3.05/runlabel.cc0000644000000000000000000003567415031566132014320 0ustar rootroot/***** Autogenerated from runlabel.in; changes will be overwritten *****/ #line 1 "./runtimebase.in" /***** * runtimebase.in * Andy Hammerlindl 2009/07/28 * * Common declarations needed for all code-generating .in files. * *****/ #line 1 "./runlabel.in" /***** * runlabel.in * * Runtime functions for label operations. * *****/ #line 23 "./runtimebase.in" #include "stack.h" #include "types.h" #include "builtin.h" #include "entry.h" #include "errormsg.h" #include "array.h" #include "triple.h" #include "callable.h" #include "opsymbols.h" using vm::stack; using vm::error; using vm::array; using vm::read; using vm::callable; using types::formal; using types::function; using camp::triple; #define PRIMITIVE(name,Name,asyName) using types::prim##Name; #include #undef PRIMITIVE void unused(void *); namespace run { typedef double real; array *copyArray(array *a); array *copyArray2(array *a); array *copyArray3(array *a); double *copyTripleArray2Components(array *a, size_t &N, GCPlacement placement=NoGC); triple *copyTripleArray2C(array *a, size_t &N, GCPlacement placement=NoGC); } function *realRealFunction(); #define CURRENTPEN processData().currentpen #line 19 "runlabel.in" #include "picture.h" #include "drawlabel.h" #include "locate.h" using namespace camp; using namespace vm; using namespace settings; typedef array realarray; typedef array stringarray; typedef array penarray; typedef array patharray; typedef array patharray2; using types::realArray; using types::stringArray; using types::penArray; using types::pathArray; using types::pathArray2; void cannotread(const string& s) { ostringstream buf; buf << "Cannot read from " << s; error(buf); } void cannotwrite(const string& s) { ostringstream buf; buf << "Cannot write to " << s; error(buf); } pair readpair(stringstream& s, double hscale=1.0, double vscale=1.0) { double x,y; s >> y; s >> x; return pair(hscale*x,vscale*y); } string ASYx="/ASYx {( ) print ASYX sub 12 string cvs print} bind def"; string ASYy="/ASYy {( ) print ASYY sub 12 string cvs print} bind def"; string pathforall="{(M) print ASYy ASYx} {(L) print ASYy ASYx} {(C) print ASYy ASYx ASYy ASYx ASYy ASYx} {(c) print} pathforall"; string currentpoint="print currentpoint ASYy ASYx "; string ASYinit="/ASYX currentpoint pop def /ASYY currentpoint exch pop def "; string ASY1="ASY1 {"+ASYinit+"/ASY1 false def} if "; void endpath(std::ostream& ps) { ps << ASY1 << pathforall << " (M) " << currentpoint << "currentpoint newpath moveto} bind def" << endl; } void fillpath(std::ostream& ps) { ps << "/fill {closepath "; endpath(ps); } void showpath(std::ostream& ps) { ps << ASYx << newl << ASYy << newl << "/ASY1 true def" << newl << "/stroke {strokepath "; endpath(ps); fillpath(ps); } array *readpath(const string& psname, bool keep, double hscale=1.0, double vsign=1.0) { double vscale=vsign*hscale; array *PP=new array(0); char *oldPath=NULL; string dir=stripFile(outname()); if(!dir.empty()) { oldPath=getPath(); setPath(dir.c_str()); } mem::vector cmd; cmd.push_back(getSetting("gs")); cmd.push_back("-q"); cmd.push_back("-dBATCH"); cmd.push_back("-P"); if(safe) cmd.push_back("-dSAFER"); #ifdef __MSDOS__ const string null="NUL"; #else const string null="/dev/null"; #endif string psdriver=getSetting("psdriver"); cmd.push_back("-sDEVICE="+psdriver); cmd.push_back("-sOutputFile="+null); cmd.push_back(stripDir(psname)); iopipestream gs(cmd,"gs","Ghostscript"); while(gs.running()) { stringstream buf; string s=gs.readline(); if(s.empty()) break; gs << newl; // Workaround broken stringstream container in libc++. #ifdef _LIBCPP_VERSION for(string::iterator i=s.begin(); i != s.end(); ++i) { if(isalpha(*i) && *i != 'e') {buf << " ";} buf << *i; } #else buf << s; #endif if(verbose > 2) cout << endl; mem::vector nodes; solvedKnot node; bool active=false; array *P=new array(0); PP->push(P); while(!buf.eof()) { char c='>'; buf >> c; if(c == '>') break; switch(c) { case 'M': { node.pre=node.point=readpair(buf,hscale,vscale); node.straight=false; break; } case 'L': { pair point=readpair(buf,hscale,vscale); pair delta=(point-node.point)*third; node.post=node.point+delta; node.straight=true; nodes.push_back(node); active=true; node.pre=point-delta; node.point=point; break; } case 'C': { pair point=readpair(buf,hscale,vscale); pair pre=readpair(buf,hscale,vscale); node.post=readpair(buf,hscale,vscale); node.straight=false; nodes.push_back(node); active=true; node.pre=pre; node.point=point; break; } case 'c': { if(active) { if(node.point == nodes[0].point) nodes[0].pre=node.pre; else { pair delta=(nodes[0].point-node.point)*third; node.post=node.point+delta; nodes[0].pre=nodes[0].point-delta; node.straight=true; nodes.push_back(node); } P->push(path(nodes,nodes.size(),true)); // Discard noncyclic paths nodes.clear(); } active=false; node.straight=false; break; } } } } if(oldPath != NULL) setPath(oldPath); if(!keep) unlink(psname.c_str()); return PP; } // Autogenerated routines: #ifndef NOSYM #include "runlabel.symbols.h" #endif namespace run { #line 214 "./runlabel.in" // void label(picture *f, string *s, string *size, transform t, pair position, pair align, pen p); void gen_runlabel0(stack *Stack) { pen p=vm::pop(Stack); pair align=vm::pop(Stack); pair position=vm::pop(Stack); transform t=vm::pop(Stack); string * size=vm::pop(Stack); string * s=vm::pop(Stack); picture * f=vm::pop(Stack); #line 216 "./runlabel.in" f->append(new drawLabel(*s,*size,t,position,align,p)); } #line 220 "./runlabel.in" // bool labels(picture *f); void gen_runlabel1(stack *Stack) { picture * f=vm::pop(Stack); #line 221 "./runlabel.in" {Stack->push(f->havelabels()); return;} } #line 225 "./runlabel.in" // realarray* texsize(string *s, pen p=CURRENTPEN); void gen_runlabel2(stack *Stack) { pen p=vm::pop(Stack,CURRENTPEN); string * s=vm::pop(Stack); #line 226 "./runlabel.in" texinit(); processDataStruct &pd=processData(); string texengine=getSetting("tex"); setpen(pd.tex,texengine,p); double width,height,depth; texbounds(width,height,depth,pd.tex,*s); array *t=new array(3); (*t)[0]=width; (*t)[1]=height; (*t)[2]=depth; {Stack->push(t); return;} } #line 243 "./runlabel.in" // patharray2* _texpath(stringarray *s, penarray *p); void gen_runlabel3(stack *Stack) { penarray * p=vm::pop(Stack); stringarray * s=vm::pop(Stack); #line 244 "./runlabel.in" size_t n=checkArrays(s,p); if(n == 0) {Stack->push(new array(0)); return;} string prefix=cleanpath(outname()); string psname=auxname(prefix,"ps"); string texname=auxname(prefix,"tex"); string dviname=auxname(prefix,"dvi"); bbox b; string texengine=getSetting("tex"); bool xe=settings::xe(texengine) || settings::lua(texengine) || settings::context(texengine); texfile tex(texname,b,true); tex.miniprologue(); for(size_t i=0; i < n; ++i) { tex.setfont(read(p,i)); if(i != 0) { if(texengine == "context") tex.verbatimline("}\\page\\hbox{%"); else if(texengine == "luatex" || texengine == "tex" || texengine == "pdftex") tex.verbatimline("\\eject"); else tex.verbatimline("\\newpage"); } if(!xe) { tex.verbatimline("\\special{ps:"); tex.verbatimline(ASYx); tex.verbatimline(ASYy); tex.verbatimline("/ASY1 true def"); tex.verbatimline("/show {"+ASY1+ "currentpoint newpath moveto false charpath "+pathforall+ "} bind def"); tex.verbatimline("/V {"+ASY1+"Ry neg Rx 4 copy 4 2 roll 2 copy 6 2 roll 2 copy (M) print ASYy ASYx (L) print ASYy add ASYx (L) print add ASYy add ASYx (L) print add ASYy ASYx (c) print} bind def}"); } tex.verbatimline(read(s,i)+"\\ %"); } tex.epilogue(true); tex.close(); int status=opentex(texname,prefix,!xe); string pdfname,psname2; bool keep=getSetting("keep"); if(!status) { if(xe) { string psdriver=getSetting("psdriver"); pdfname=auxname(prefix,"pdf"); psname2=auxname(prefix+"_","ps"); if(!fs::exists(pdfname)) {Stack->push(new array(n)); return;} std::ofstream ps(psname.c_str(),std::ios::binary); if(!ps) cannotwrite(psname); showpath(ps); mem::vector cmd; cmd.push_back(getSetting("gs")); cmd.push_back("-q"); cmd.push_back("-dNoOutputFonts"); cmd.push_back("-dNOPAUSE"); cmd.push_back("-dBATCH"); if(safe) cmd.push_back("-dSAFER"); cmd.push_back("-sDEVICE="+psdriver); cmd.push_back("-sOutputFile="+psname2); cmd.push_back(pdfname); status=System(cmd,0,true,"gs"); std::ifstream in(psname2.c_str()); ps << in.rdbuf(); ps.close(); } else { if(!fs::exists(dviname)) {Stack->push(new array(n)); return;} mem::vector dcmd; dcmd.push_back(getSetting("dvips")); dcmd.push_back("-R"); dcmd.push_back("-Pdownload35"); dcmd.push_back("-D600"); push_split(dcmd,getSetting("dvipsOptions")); if(verbose <= 2) dcmd.push_back("-q"); dcmd.push_back("-o"+psname); dcmd.push_back(dviname); status=System(dcmd,0,true,"dvips"); } } else error("texpath failed"); if(!keep) { // Delete temporary files. unlink(texname.c_str()); if(!getSetting("keepaux")) unlink(auxname(prefix,"aux").c_str()); unlink(auxname(prefix,"log").c_str()); unlink(xe ? pdfname.c_str() : dviname.c_str()); if(settings::context(texengine)) { unlink(auxname(prefix,"top").c_str()); unlink(auxname(prefix,"tua").c_str()); unlink(auxname(prefix,"tuc").c_str()); unlink(auxname(prefix,"tui").c_str()); } } {Stack->push(xe ? readpath(psname,keep,0.1) : readpath(psname,keep,0.12,-1.0)); return;} } #line 349 "./runlabel.in" // patharray2* textpath(stringarray *s, penarray *p); void gen_runlabel4(stack *Stack) { penarray * p=vm::pop(Stack); stringarray * s=vm::pop(Stack); #line 350 "./runlabel.in" size_t n=checkArrays(s,p); if(n == 0) {Stack->push(new array(0)); return;} string prefix=cleanpath(outname()); string outputname=auxname(prefix,getSetting("textoutformat")); string textname=auxname(prefix,getSetting("textextension")); std::ofstream text(textname.c_str()); if(!text) cannotwrite(textname); for(size_t i=0; i < n; ++i) { text << getSetting("textprologue") << newl << read(p,i).Font() << newl << read(s,i) << newl << getSetting("textepilogue") << endl; } text.close(); string psname=auxname(prefix,"ps"); std::ofstream ps(psname.c_str()); if(!ps) cannotwrite(psname); showpath(ps); mem::vector cmd; cmd.push_back(getSetting("textcommand")); push_split(cmd,getSetting("textcommandOptions")); cmd.push_back(textname); iopipestream typesetter(cmd); typesetter.block(true,false); mem::vector cmd2; cmd2.push_back(getSetting("gs")); cmd2.push_back("-q"); cmd2.push_back("-dNoOutputFonts"); cmd2.push_back("-dNOPAUSE"); cmd2.push_back("-dBATCH"); cmd2.push_back("-P"); if(safe) cmd2.push_back("-dSAFER"); cmd2.push_back("-sDEVICE="+getSetting("psdriver")); cmd2.push_back("-sOutputFile=-"); cmd2.push_back("-"); iopipestream gs(cmd2,"gs","Ghostscript"); gs.block(false,false); // TODO: Simplify by connecting the pipes directly. for(;;) { string out; if(typesetter.isopen()) { typesetter >> out; if(!out.empty()) gs << out; else if(!typesetter.running()) { typesetter.pipeclose(); gs.eof(); } } string out2; gs >> out2; if(out2.empty() && !gs.running()) break; ps << out2; } ps.close(); if(verbose > 2) cout << endl; bool keep=getSetting("keep"); if(!keep) // Delete temporary files. unlink(textname.c_str()); {Stack->push(readpath(psname,keep,0.1)); return;} } #line 423 "./runlabel.in" // patharray* _strokepath(path g, pen p=CURRENTPEN); void gen_runlabel5(stack *Stack) { pen p=vm::pop(Stack,CURRENTPEN); path g=vm::pop(Stack); #line 424 "./runlabel.in" array *P=new array(0); if(g.size() == 0) {Stack->push(P); return;} string prefix=cleanpath(outname()); string psname=auxname(prefix,"ps"); bbox b; psfile ps(psname,false); ps.prologue(b); ps.verbatimline(ASYx); ps.verbatimline(ASYy); ps.verbatimline("/stroke {"+ASYinit+pathforall+"} bind def"); ps.resetpen(); ps.setpen(p); ps.write(g); ps.strokepath(); ps.stroke(p); ps.verbatimline("(M) "+currentpoint); ps.epilogue(); ps.close(); array *a=readpath(psname,getSetting("keep")); {Stack->push(a->size() > 0 ? read(a,0) : a); return;} } } // namespace run namespace trans { void gen_runlabel_venv(venv &ve) { #line 214 "./runlabel.in" addFunc(ve, run::gen_runlabel0, primVoid(), SYM(label), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(s), false, false), formal(primString(), SYM(size), false, false), formal(primTransform(), SYM(t), false, false), formal(primPair(), SYM(position), false, false), formal(primPair(), SYM(align), false, false), formal(primPen(), SYM(p), false, false)); #line 220 "./runlabel.in" addFunc(ve, run::gen_runlabel1, primBoolean(), SYM(labels), formal(primPicture(), SYM(f), false, false)); #line 225 "./runlabel.in" addFunc(ve, run::gen_runlabel2, realArray(), SYM(texsize), formal(primString(), SYM(s), false, false), formal(primPen(), SYM(p), true, false)); #line 243 "./runlabel.in" addFunc(ve, run::gen_runlabel3, pathArray2(), SYM(_texpath), formal(stringArray(), SYM(s), false, false), formal(penArray(), SYM(p), false, false)); #line 349 "./runlabel.in" addFunc(ve, run::gen_runlabel4, pathArray2(), SYM(textpath), formal(stringArray(), SYM(s), false, false), formal(penArray(), SYM(p), false, false)); #line 423 "./runlabel.in" addFunc(ve, run::gen_runlabel5, pathArray(), SYM(_strokepath), formal(primPath(), SYM(g), false, false), formal(primPen(), SYM(p), true, false)); } } // namespace trans asymptote-3.05/runpicture.cc0000644000000000000000000016231315031566132014703 0ustar rootroot/***** Autogenerated from runpicture.in; changes will be overwritten *****/ #line 1 "./runtimebase.in" /***** * runtimebase.in * Andy Hammerlindl 2009/07/28 * * Common declarations needed for all code-generating .in files. * *****/ #line 1 "./runpicture.in" /***** * runpicture.in * * Runtime functions for picture operations. * *****/ #line 23 "./runtimebase.in" #include "stack.h" #include "types.h" #include "builtin.h" #include "entry.h" #include "errormsg.h" #include "array.h" #include "triple.h" #include "callable.h" #include "opsymbols.h" using vm::stack; using vm::error; using vm::array; using vm::read; using vm::callable; using types::formal; using types::function; using camp::triple; #define PRIMITIVE(name,Name,asyName) using types::prim##Name; #include #undef PRIMITIVE void unused(void *); namespace run { typedef double real; array *copyArray(array *a); array *copyArray2(array *a); array *copyArray3(array *a); double *copyTripleArray2Components(array *a, size_t &N, GCPlacement placement=NoGC); triple *copyTripleArray2C(array *a, size_t &N, GCPlacement placement=NoGC); } function *realRealFunction(); #define CURRENTPEN processData().currentpen #line 28 "runpicture.in" #include "picture.h" #include "drawelement.h" #include "path.h" #include "array.h" #include "arrayop.h" #include "drawpath.h" #include "drawfill.h" #include "drawclipbegin.h" #include "drawclipend.h" #include "drawgsave.h" #include "drawgrestore.h" #include "drawgroup.h" #include "drawverbatim.h" #include "drawlabel.h" #include "drawlayer.h" #include "drawimage.h" #include "drawpath3.h" #include "drawsurface.h" using namespace camp; using namespace settings; using namespace vm; typedef array Intarray; typedef array Intarray2; typedef array realarray; typedef array realarray2; typedef array pairarray; typedef array pairarray2; typedef array triplearray; typedef array triplearray2; typedef array patharray; typedef array penarray; typedef array penarray2; typedef callable callablePen; using types::IntArray; using types::IntArray2; using types::realArray; using types::realArray2; using types::pairArray; using types::pairArray2; using types::tripleArray; using types::tripleArray2; using types::pathArray; using types::penArray; using types::penArray2; static transform ZeroTransform=transform(0.0,0.0,0.0,0.0,0.0,0.0); transform getTransform(xmap_t &xmap, picture::nodelist::iterator p) { string s=(*p)->KEY; transform t; // Don't apply xmap without an explicit corresponding key size_t n=s.length(); if(n == 0 || s.substr(n-1) != "1") return t; xmap_t::iterator q=xmap.find(s.substr(0,n-2)); if(q != xmap.end()) { xtransform_t& v=q->second; if(!v.empty()) { t=v.front(); v.pop_front(); } } return t; } function *transformFunction() { return new function(primTransform()); } function *penFunction() { return new function(primPen(),primInt(),primInt()); } // Ignore unclosed begingroups but not spurious endgroups. const char *nobegin="endgroup without matching begingroup"; array *emptyarray=new array(0); array *nop(array *a) { return a; } triple Zero; string defaultformat3="prc"; // Autogenerated routines: #ifndef NOSYM #include "runpicture.symbols.h" #endif namespace run { #line 126 "./runpicture.in" void newPicture(stack *Stack) { #line 127 "./runpicture.in" {Stack->push(new picture()); return;} } #line 131 "./runpicture.in" // bool empty(picture *f); void gen_runpicture1(stack *Stack) { picture * f=vm::pop(Stack); #line 132 "./runpicture.in" {Stack->push(f->null()); return;} } #line 136 "./runpicture.in" // void erase(picture *f); void gen_runpicture2(stack *Stack) { picture * f=vm::pop(Stack); #line 137 "./runpicture.in" f->nodes.clear(); } #line 141 "./runpicture.in" // pair min(picture *f); void gen_runpicture3(stack *Stack) { picture * f=vm::pop(Stack); #line 142 "./runpicture.in" {Stack->push(f->bounds().Min()); return;} } #line 146 "./runpicture.in" // pair max(picture *f); void gen_runpicture4(stack *Stack) { picture * f=vm::pop(Stack); #line 147 "./runpicture.in" {Stack->push(f->bounds().Max()); return;} } #line 151 "./runpicture.in" // pair size(picture *f); void gen_runpicture5(stack *Stack) { picture * f=vm::pop(Stack); #line 152 "./runpicture.in" bbox b=f->bounds(); {Stack->push(b.Max()-b.Min()); return;} } #line 157 "./runpicture.in" // void _draw(picture *f, path g, pen p); void gen_runpicture6(stack *Stack) { pen p=vm::pop(Stack); path g=vm::pop(Stack); picture * f=vm::pop(Stack); #line 158 "./runpicture.in" f->append(new drawPath(g,p)); } #line 162 "./runpicture.in" // void fill(picture *f, patharray *g, pen p=CURRENTPEN, bool copy=true); void gen_runpicture7(stack *Stack) { bool copy=vm::pop(Stack,true); pen p=vm::pop(Stack,CURRENTPEN); patharray * g=vm::pop(Stack); picture * f=vm::pop(Stack); #line 163 "./runpicture.in" array *(*copyarray)(array *a)=copy ? copyArray : nop; f->append(new drawFill(*copyarray(g),false,p)); } #line 168 "./runpicture.in" // void latticeshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray2 *p, transform t=identity, bool copy=true); void gen_runpicture8(stack *Stack) { bool copy=vm::pop(Stack,true); transform t=vm::pop(Stack,identity); penarray2 * p=vm::pop(Stack); pen fillrule=vm::pop(Stack,CURRENTPEN); bool stroke=vm::pop(Stack,false); patharray * g=vm::pop(Stack); picture * f=vm::pop(Stack); #line 171 "./runpicture.in" array *(*copyarray)(array *a)=copy ? copyArray : nop; f->append(new drawLatticeShade(*copyarray(g),stroke,fillrule,*copyarray(p), t)); } #line 177 "./runpicture.in" // void axialshade(picture *f, patharray *g, bool stroke=false, pen pena, pair a, bool extenda=true, pen penb, pair b, bool extendb=true, bool copy=true); void gen_runpicture9(stack *Stack) { bool copy=vm::pop(Stack,true); bool extendb=vm::pop(Stack,true); pair b=vm::pop(Stack); pen penb=vm::pop(Stack); bool extenda=vm::pop(Stack,true); pair a=vm::pop(Stack); pen pena=vm::pop(Stack); bool stroke=vm::pop(Stack,false); patharray * g=vm::pop(Stack); picture * f=vm::pop(Stack); #line 180 "./runpicture.in" array *(*copyarray)(array *a)=copy ? copyArray : nop; f->append(new drawAxialShade(*copyarray(g),stroke,pena,a,extenda,penb,b, extendb)); } #line 186 "./runpicture.in" // void radialshade(picture *f, patharray *g, bool stroke=false, pen pena, pair a, real ra, bool extenda=true, pen penb, pair b, real rb, bool extendb=true, bool copy=true); void gen_runpicture10(stack *Stack) { bool copy=vm::pop(Stack,true); bool extendb=vm::pop(Stack,true); real rb=vm::pop(Stack); pair b=vm::pop(Stack); pen penb=vm::pop(Stack); bool extenda=vm::pop(Stack,true); real ra=vm::pop(Stack); pair a=vm::pop(Stack); pen pena=vm::pop(Stack); bool stroke=vm::pop(Stack,false); patharray * g=vm::pop(Stack); picture * f=vm::pop(Stack); #line 189 "./runpicture.in" array *(*copyarray)(array *a)=copy ? copyArray : nop; f->append(new drawRadialShade(*copyarray(g),stroke,pena,a,ra,extenda, penb,b,rb,extendb)); } #line 195 "./runpicture.in" // void gouraudshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray *p, pairarray *z, Intarray *edges, bool copy=true); void gen_runpicture11(stack *Stack) { bool copy=vm::pop(Stack,true); Intarray * edges=vm::pop(Stack); pairarray * z=vm::pop(Stack); penarray * p=vm::pop(Stack); pen fillrule=vm::pop(Stack,CURRENTPEN); bool stroke=vm::pop(Stack,false); patharray * g=vm::pop(Stack); picture * f=vm::pop(Stack); #line 198 "./runpicture.in" array *(*copyarray)(array *a)=copy ? copyArray : nop; checkArrays(p,z); checkArrays(z,edges); f->append(new drawGouraudShade(*copyarray(g),stroke,fillrule,*copyarray(p), *copyarray(z),*copyarray(edges))); } #line 206 "./runpicture.in" // void gouraudshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray *p, Intarray *edges, bool copy=true); void gen_runpicture12(stack *Stack) { bool copy=vm::pop(Stack,true); Intarray * edges=vm::pop(Stack); penarray * p=vm::pop(Stack); pen fillrule=vm::pop(Stack,CURRENTPEN); bool stroke=vm::pop(Stack,false); patharray * g=vm::pop(Stack); picture * f=vm::pop(Stack); #line 209 "./runpicture.in" array *(*copyarray)(array *a)=copy ? copyArray : nop; size_t n=checkArrays(p,edges); size_t m=checkArray(g); array *z=new array(n); Int k=0; Int in=(Int) n; for(size_t j=0; j < m; ++j) { path *P=read(g,j); assert(P); Int stop=Min(P->size(),in-k); mem::vector& nodes=P->Nodes(); for(Int i=0; i < stop; ++i) (*z)[k++]=nodes[i].point; } checkArrays(p,z); f->append(new drawGouraudShade(*copyarray(g),stroke,fillrule,*copyarray(p), *z,*copyarray(edges))); } #line 230 "./runpicture.in" // void tensorshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray2 *p, patharray *b=NULL, pairarray2 *z=emptyarray, bool copy=true); void gen_runpicture13(stack *Stack) { bool copy=vm::pop(Stack,true); pairarray2 * z=vm::pop(Stack,emptyarray); patharray * b=vm::pop(Stack,NULL); penarray2 * p=vm::pop(Stack); pen fillrule=vm::pop(Stack,CURRENTPEN); bool stroke=vm::pop(Stack,false); patharray * g=vm::pop(Stack); picture * f=vm::pop(Stack); #line 233 "./runpicture.in" array *(*copyarray)(array *a)=copy ? copyArray : nop; array *(*copyarray2)(array *a)=copy ? copyArray2 : nop; size_t n=checkArrays(p,b ? b : g); array& G=*copyarray(g); array& B=b ? *copyarray(b) : G; size_t nz=checkArray(z); if(nz != 0) checkEqual(nz,n); f->append(new drawTensorShade(G,stroke,fillrule,*copyarray2(p),B, *copyarray2(z))); } #line 246 "./runpicture.in" // void functionshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, string shader=emptystring, bool copy=true); void gen_runpicture14(stack *Stack) { bool copy=vm::pop(Stack,true); string shader=vm::pop(Stack,emptystring); pen fillrule=vm::pop(Stack,CURRENTPEN); bool stroke=vm::pop(Stack,false); patharray * g=vm::pop(Stack); picture * f=vm::pop(Stack); #line 249 "./runpicture.in" array *(*copyarray)(array *a)=copy ? copyArray : nop; f->append(new drawFunctionShade(*copyarray(g),stroke,fillrule,shader)); } // Clip a picture to a superpath using the given fill rule. // Subsequent additions to the picture will not be affected by the clipping. #line 256 "./runpicture.in" // void clip(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, bool copy=true); void gen_runpicture15(stack *Stack) { bool copy=vm::pop(Stack,true); pen fillrule=vm::pop(Stack,CURRENTPEN); bool stroke=vm::pop(Stack,false); patharray * g=vm::pop(Stack); picture * f=vm::pop(Stack); #line 258 "./runpicture.in" array *(*copyarray)(array *a)=copy ? copyArray : nop; drawClipBegin *begin=new drawClipBegin(*copyarray(g),stroke,fillrule,true); f->enclose(begin,new drawClipEnd(true,begin)); } #line 264 "./runpicture.in" // void beginclip(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, bool copy=true); void gen_runpicture16(stack *Stack) { bool copy=vm::pop(Stack,true); pen fillrule=vm::pop(Stack,CURRENTPEN); bool stroke=vm::pop(Stack,false); patharray * g=vm::pop(Stack); picture * f=vm::pop(Stack); #line 266 "./runpicture.in" array *(*copyarray)(array *a)=copy ? copyArray : nop; f->append(new drawClipBegin(*copyarray(g),stroke,fillrule,false)); } #line 271 "./runpicture.in" // void endclip(picture *f); void gen_runpicture17(stack *Stack) { picture * f=vm::pop(Stack); #line 272 "./runpicture.in" f->append(new drawClipEnd(false)); } #line 276 "./runpicture.in" // void gsave(picture *f); void gen_runpicture18(stack *Stack) { picture * f=vm::pop(Stack); #line 277 "./runpicture.in" f->append(new drawGsave()); } #line 281 "./runpicture.in" // void grestore(picture *f); void gen_runpicture19(stack *Stack) { picture * f=vm::pop(Stack); #line 282 "./runpicture.in" f->append(new drawGrestore()); } #line 286 "./runpicture.in" // void begingroup(picture *f); void gen_runpicture20(stack *Stack) { picture * f=vm::pop(Stack); #line 287 "./runpicture.in" f->append(new drawBegin()); } #line 291 "./runpicture.in" // void endgroup(picture *f); void gen_runpicture21(stack *Stack) { picture * f=vm::pop(Stack); #line 292 "./runpicture.in" f->append(new drawEnd()); } #line 296 "./runpicture.in" // void _begingroup3(picture *f, string name, real compression, real granularity, bool closed, bool tessellate, bool dobreak, bool nobreak, triple center, Int interaction); void gen_runpicture22(stack *Stack) { Int interaction=vm::pop(Stack); triple center=vm::pop(Stack); bool nobreak=vm::pop(Stack); bool dobreak=vm::pop(Stack); bool tessellate=vm::pop(Stack); bool closed=vm::pop(Stack); real granularity=vm::pop(Stack); real compression=vm::pop(Stack); string name=vm::pop(Stack); picture * f=vm::pop(Stack); #line 299 "./runpicture.in" f->append(new drawBegin3(name,compression,granularity, closed,tessellate,dobreak,nobreak, center,(Interaction) intcast(interaction))); } #line 305 "./runpicture.in" // void endgroup3(picture *f); void gen_runpicture23(stack *Stack) { picture * f=vm::pop(Stack); #line 306 "./runpicture.in" f->append(new drawEnd3()); } #line 310 "./runpicture.in" // void add(picture *dest, picture *src); void gen_runpicture24(stack *Stack) { picture * src=vm::pop(Stack); picture * dest=vm::pop(Stack); #line 311 "./runpicture.in" dest->add(*src); } #line 315 "./runpicture.in" // void prepend(picture *dest, picture *src); void gen_runpicture25(stack *Stack) { picture * src=vm::pop(Stack); picture * dest=vm::pop(Stack); #line 316 "./runpicture.in" dest->prepend(*src); } #line 320 "./runpicture.in" // void postscript(picture *f, string s); void gen_runpicture26(stack *Stack) { string s=vm::pop(Stack); picture * f=vm::pop(Stack); #line 321 "./runpicture.in" f->append(new drawVerbatim(PostScript,s)); } #line 325 "./runpicture.in" // void tex(picture *f, string s); void gen_runpicture27(stack *Stack) { string s=vm::pop(Stack); picture * f=vm::pop(Stack); #line 326 "./runpicture.in" f->append(new drawVerbatim(TeX,s)); } #line 330 "./runpicture.in" // void postscript(picture *f, string s, pair min, pair max); void gen_runpicture28(stack *Stack) { pair max=vm::pop(Stack); pair min=vm::pop(Stack); string s=vm::pop(Stack); picture * f=vm::pop(Stack); #line 331 "./runpicture.in" f->append(new drawVerbatim(PostScript,s,min,max)); } #line 335 "./runpicture.in" // void tex(picture *f, string s, pair min, pair max); void gen_runpicture29(stack *Stack) { pair max=vm::pop(Stack); pair min=vm::pop(Stack); string s=vm::pop(Stack); picture * f=vm::pop(Stack); #line 336 "./runpicture.in" f->append(new drawVerbatim(TeX,s,min,max)); } #line 340 "./runpicture.in" // void texpreamble(string s); void gen_runpicture30(stack *Stack) { string s=vm::pop(Stack); #line 341 "./runpicture.in" string t=s+"\n"; processDataStruct &pd=processData(); pd.TeXpipepreamble.push_back(t); pd.TeXpreamble.push_back(t); } #line 348 "./runpicture.in" // void deletepreamble(); void gen_runpicture31(stack *) { #line 349 "./runpicture.in" if(getSetting("inlinetex")) { unlink(buildname(outname(),"pre").c_str()); } } #line 355 "./runpicture.in" // void _labelpath(picture *f, string s, string size, path g, string justify, pair offset, pen p); void gen_runpicture32(stack *Stack) { pen p=vm::pop(Stack); pair offset=vm::pop(Stack); string justify=vm::pop(Stack); path g=vm::pop(Stack); string size=vm::pop(Stack); string s=vm::pop(Stack); picture * f=vm::pop(Stack); #line 357 "./runpicture.in" f->append(new drawLabelPath(s,size,g,justify,offset,p)); } #line 361 "./runpicture.in" // void texreset(); void gen_runpicture33(stack *) { #line 362 "./runpicture.in" processDataStruct &pd=processData(); pd.TeXpipepreamble.clear(); pd.TeXpreamble.clear(); pd.tex.pipeclose(); } #line 369 "./runpicture.in" // void layer(picture *f); void gen_runpicture34(stack *Stack) { picture * f=vm::pop(Stack); #line 370 "./runpicture.in" f->append(new drawLayer()); } #line 374 "./runpicture.in" // void newpage(picture *f); void gen_runpicture35(stack *Stack) { picture * f=vm::pop(Stack); #line 375 "./runpicture.in" f->append(new drawNewPage()); } #line 379 "./runpicture.in" // void _image(picture *f, realarray2 *data, pair initial, pair final, penarray *palette=NULL, transform t=identity, bool copy=true, bool antialias=false); void gen_runpicture36(stack *Stack) { bool antialias=vm::pop(Stack,false); bool copy=vm::pop(Stack,true); transform t=vm::pop(Stack,identity); penarray * palette=vm::pop(Stack,NULL); pair final=vm::pop(Stack); pair initial=vm::pop(Stack); realarray2 * data=vm::pop(Stack); picture * f=vm::pop(Stack); #line 382 "./runpicture.in" array *(*copyarray)(array *a)=copy ? copyArray : nop; array *(*copyarray2)(array *a)=copy ? copyArray2 : nop; f->append(new drawPaletteImage(*copyarray2(data),*copyarray(palette), t*matrix(initial,final),antialias)); } #line 389 "./runpicture.in" // void _image(picture *f, penarray2 *data, pair initial, pair final, transform t=identity, bool copy=true, bool antialias=false); void gen_runpicture37(stack *Stack) { bool antialias=vm::pop(Stack,false); bool copy=vm::pop(Stack,true); transform t=vm::pop(Stack,identity); pair final=vm::pop(Stack); pair initial=vm::pop(Stack); penarray2 * data=vm::pop(Stack); picture * f=vm::pop(Stack); #line 391 "./runpicture.in" array *(*copyarray2)(array *a)=copy ? copyArray2 : nop; f->append(new drawNoPaletteImage(*copyarray2(data),t*matrix(initial,final), antialias)); } #line 397 "./runpicture.in" // void _image(picture *f, callablePen *F, Int width, Int height, pair initial, pair final, transform t=identity, bool antialias=false); void gen_runpicture38(stack *Stack) { bool antialias=vm::pop(Stack,false); transform t=vm::pop(Stack,identity); pair final=vm::pop(Stack); pair initial=vm::pop(Stack); Int height=vm::pop(Stack); Int width=vm::pop(Stack); callablePen * F=vm::pop(Stack); picture * f=vm::pop(Stack); #line 399 "./runpicture.in" f->append(new drawFunctionImage(Stack,F,width,height, t*matrix(initial,final),antialias)); } #line 404 "./runpicture.in" // string nativeformat(); void gen_runpicture39(stack *Stack) { #line 405 "./runpicture.in" {Stack->push(nativeformat()); return;} } #line 409 "./runpicture.in" // bool latex(); void gen_runpicture40(stack *Stack) { #line 410 "./runpicture.in" {Stack->push(latex(getSetting("tex"))); return;} } #line 414 "./runpicture.in" // bool pdf(); void gen_runpicture41(stack *Stack) { #line 415 "./runpicture.in" {Stack->push(pdf(getSetting("tex"))); return;} } #line 419 "./runpicture.in" // void _shipout(string prefix=emptystring, picture *f, picture *preamble=NULL, string format=emptystring, bool wait=false, bool view=true, transform T=identity); void gen_runpicture42(stack *Stack) { transform T=vm::pop(Stack,identity); bool view=vm::pop(Stack,true); bool wait=vm::pop(Stack,false); string format=vm::pop(Stack,emptystring); picture * preamble=vm::pop(Stack,NULL); picture * f=vm::pop(Stack); string prefix=vm::pop(Stack,emptystring); #line 422 "./runpicture.in" if(prefix.empty()) prefix=outname(); picture *result=new picture; unsigned level=0; xmap_t xmap=processData().xmap; transform Tinv=inverse(T); for(picture::nodelist::iterator p=f->nodes.begin(); p != f->nodes.end(); ++p) { transform t=getTransform(xmap,p); bool Delete=(t == ZeroTransform); if(!Delete && !t.isIdentity()) t=T*t*Tinv; picture *group=new picture; assert(*p); if((*p)->endgroup()) error(nobegin); if((*p)->begingroup()) { ++level; while(p != f->nodes.end() && level) { if(!Delete) { drawElement *e=t.isIdentity() ? *p : (*p)->transformed(t); group->append(e); } ++p; if(p == f->nodes.end()) break; assert(*p); if((*p)->begingroup()) ++level; if((*p)->endgroup()) { if(level) --level; else error(nobegin); } } } if(p == f->nodes.end()) break; assert(*p); if(!Delete) { drawElement *e=t.isIdentity() ? *p : (*p)->transformed(t); group->append(e); result->add(*group); } delete group; } result->shipout(preamble,prefix,format,wait,view); delete result; } #line 470 "./runpicture.in" // void shipout3(string prefix, picture *f, string format=emptystring, real width, real height, real angle, real zoom, triple m, triple M, pair shift, pair margin, realarray2 *t, realarray2 *tup, realarray *background, triplearray *lights, realarray2 *diffuse, realarray2 *specular, bool view=true); void gen_runpicture43(stack *Stack) { bool view=vm::pop(Stack,true); realarray2 * specular=vm::pop(Stack); realarray2 * diffuse=vm::pop(Stack); triplearray * lights=vm::pop(Stack); realarray * background=vm::pop(Stack); realarray2 * tup=vm::pop(Stack); realarray2 * t=vm::pop(Stack); pair margin=vm::pop(Stack); pair shift=vm::pop(Stack); triple M=vm::pop(Stack); triple m=vm::pop(Stack); real zoom=vm::pop(Stack); real angle=vm::pop(Stack); real height=vm::pop(Stack); real width=vm::pop(Stack); string format=vm::pop(Stack,emptystring); picture * f=vm::pop(Stack); string prefix=vm::pop(Stack); #line 476 "./runpicture.in" size_t n=checkArrays(lights,diffuse); checkEqual(n,checkArray(specular)); real *T,*Tup,*Background,*Diffuse,*Specular; triple *Lights; copyArray2C(T,t,true,4); copyArray2C(Tup,tup,true,4); copyArrayC(Background,background); copyArrayC(Lights,lights); copyArray2C(Diffuse,diffuse,false,4,UseGC); copyArray2C(Specular,specular,false,4,UseGC); f->shipout3(prefix,format,width,height,angle,zoom,m,M,shift,margin,T,Tup, Background,n,Lights,Diffuse,Specular,view); delete[] Background; delete[] T; delete[] Tup; } #line 498 "./runpicture.in" // void shipout3(string prefix, picture *f, string format=defaultformat3); void gen_runpicture44(stack *Stack) { string format=vm::pop(Stack,defaultformat3); picture * f=vm::pop(Stack); string prefix=vm::pop(Stack); #line 499 "./runpicture.in" f->shipout3(prefix,format); } #line 503 "./runpicture.in" // void xmap(string key, transform t=identity); void gen_runpicture45(stack *Stack) { transform t=vm::pop(Stack,identity); string key=vm::pop(Stack); #line 504 "./runpicture.in" processDataStruct *P=&processData(); xmap_t &xmap=P->xmap; xmap_t::iterator p=xmap.find(key); if(p != xmap.end()) p->second.push_back(t); else { xtransform_t *v=new xtransform_t(); v->push_back(t); xmap[key]=*v; } P->xmapCount++; } #line 518 "./runpicture.in" // void deconstruct(picture *f, picture *preamble=NULL, transform T=identity); void gen_runpicture46(stack *Stack) { transform T=vm::pop(Stack,identity); picture * preamble=vm::pop(Stack,NULL); picture * f=vm::pop(Stack); #line 519 "./runpicture.in" unsigned level=0; bool first=pdf(getSetting("tex")); string prefix=outname(); const string xformat="svg"; openpipeout(); const string Done="Done"; const string Error="Error"; xmap_t xmap=processData().xmap; transform Tinv=inverse(T); picture *F=new picture(true); for(picture::nodelist::iterator p=f->nodes.begin(); p != f->nodes.end();) { picture *group=new picture; transform t=getTransform(xmap,p); bool Delete=(t == ZeroTransform); if(!Delete && !t.isIdentity()) t=T*t*Tinv; assert(*p); if((*p)->endgroup()) { fprintf(pipeout,"%s\n",Error.c_str()); fflush(pipeout); error(nobegin); } bool clip=false; if((*p)->begingroup()) { string key=(*p)->KEY; ++level; while(p != f->nodes.end() && level) { if(!Delete) { drawElement *e=t.isIdentity() ? *p : (*p)->transformed(t); group->append(e); if((*p)->endclip()) clip=true; } ++p; if(p == f->nodes.end()) break; assert(*p); if((*p)->begingroup()) ++level; if((*p)->endgroup()) { if(level) --level; else { fprintf(pipeout,"%s\n",Error.c_str()); fflush(pipeout); error(nobegin); } if(level == 0) (*p)->KEY=key; } } } if(p != f->nodes.end()) { if(!Delete) { drawElement *e=t.isIdentity() ? *p : (*p)->transformed(t); group->append(e); bbox b=group->bounds(); if(!b.empty && b.right > b.left && b.top > b.bottom) { if((*p)->endclip()) clip=true; if(first) first=false; else F->append(new drawNewPage(b)); F->append(new drawBBox(b)); for(picture::nodelist::iterator g=group->nodes.begin(); !(g == group->nodes.end()); ++g) F->append(*g); fprintf(pipeout,"KEY=%s%d\n",e->KEY.c_str(),clip); const char *oldlocale=setlocale(LC_NUMERIC,NULL); bool override=oldlocale && strcmp(oldlocale,"C") != 0; if(override) { oldlocale=StrdupNoGC(oldlocale); setlocale(LC_NUMERIC,"C"); } fprintf(pipeout,"%g %g %g %g\n",b.left,b.bottom,b.right,b.top); if(override) { setlocale(LC_NUMERIC,oldlocale); delete[] oldlocale; } fflush(pipeout); } } else { drawElement *e=t.isIdentity() ? *p : (*p)->transformed(t); fprintf(pipeout,"KEY=%s2\n",e->KEY.c_str()); fprintf(pipeout,"0 0 0 0\n"); } ++p; } delete group; } string outname=buildname(prefix,xformat); F->shipout(preamble,stripExt(outname),xformat,false,false); fprintf(pipeout,"%s\n",Done.c_str()); fflush(pipeout); delete F; } // Three-dimensional picture and surface operations // Bezier curve #line 634 "./runpicture.in" // void _draw(picture *f, path3 g, triple center=Zero, penarray *p, real opacity, real shininess, real metallic, real fresnel0, Int interaction=0); void gen_runpicture47(stack *Stack) { Int interaction=vm::pop(Stack,0); real fresnel0=vm::pop(Stack); real metallic=vm::pop(Stack); real shininess=vm::pop(Stack); real opacity=vm::pop(Stack); penarray * p=vm::pop(Stack); triple center=vm::pop(Stack,Zero); path3 g=vm::pop(Stack); picture * f=vm::pop(Stack); #line 637 "./runpicture.in" size_t n=g.size(); for(unsigned int i=0; i < n; ++i) f->append(new drawPath3(g.subpath((Int) i,Int(i+1)),center,*p,opacity, shininess,metallic,fresnel0, (Interaction) intcast(interaction))); } // Bezier patch #line 646 "./runpicture.in" // void draw(picture *f, triplearray2 *P, triple center, bool straight, penarray *p, real opacity, real shininess, real metallic, real fresnel0, penarray *colors, Int interaction, Int digits, bool primitive=false); void gen_runpicture48(stack *Stack) { bool primitive=vm::pop(Stack,false); Int digits=vm::pop(Stack); Int interaction=vm::pop(Stack); penarray * colors=vm::pop(Stack); real fresnel0=vm::pop(Stack); real metallic=vm::pop(Stack); real shininess=vm::pop(Stack); real opacity=vm::pop(Stack); penarray * p=vm::pop(Stack); bool straight=vm::pop(Stack); triple center=vm::pop(Stack); triplearray2 * P=vm::pop(Stack); picture * f=vm::pop(Stack); #line 650 "./runpicture.in" f->append(new drawBezierPatch(*P,center,straight,*p,opacity,shininess, metallic,fresnel0,*colors, (Interaction) intcast(interaction), digits,primitive)); } // Bezier triangle #line 658 "./runpicture.in" // void drawbeziertriangle(picture *f, triplearray2 *P, triple center, bool straight, penarray *p, real opacity, real shininess, real metallic, real fresnel0, penarray *colors, Int interaction, Int digits, bool primitive=false); void gen_runpicture49(stack *Stack) { bool primitive=vm::pop(Stack,false); Int digits=vm::pop(Stack); Int interaction=vm::pop(Stack); penarray * colors=vm::pop(Stack); real fresnel0=vm::pop(Stack); real metallic=vm::pop(Stack); real shininess=vm::pop(Stack); real opacity=vm::pop(Stack); penarray * p=vm::pop(Stack); bool straight=vm::pop(Stack); triple center=vm::pop(Stack); triplearray2 * P=vm::pop(Stack); picture * f=vm::pop(Stack); #line 663 "./runpicture.in" f->append(new drawBezierTriangle(*P,center,straight,*p,opacity,shininess, metallic,fresnel0,*colors, (Interaction) intcast(interaction), digits,primitive)); } // General NURBS curve #line 671 "./runpicture.in" // void draw(picture *f, triplearray *P, realarray *knot, realarray *weights=emptyarray, pen p); void gen_runpicture50(stack *Stack) { pen p=vm::pop(Stack); realarray * weights=vm::pop(Stack,emptyarray); realarray * knot=vm::pop(Stack); triplearray * P=vm::pop(Stack); picture * f=vm::pop(Stack); #line 673 "./runpicture.in" f->append(new drawNurbsPath3(*P,knot,weights,p)); } // General NURBS surface #line 678 "./runpicture.in" // void draw(picture *f, triplearray2 *P, realarray *uknot, realarray *vknot, realarray2 *weights=emptyarray, penarray *p, real opacity, real shininess,real metallic, real fresnel0, penarray *colors); void gen_runpicture51(stack *Stack) { penarray * colors=vm::pop(Stack); real fresnel0=vm::pop(Stack); real metallic=vm::pop(Stack); real shininess=vm::pop(Stack); real opacity=vm::pop(Stack); penarray * p=vm::pop(Stack); realarray2 * weights=vm::pop(Stack,emptyarray); realarray * vknot=vm::pop(Stack); realarray * uknot=vm::pop(Stack); triplearray2 * P=vm::pop(Stack); picture * f=vm::pop(Stack); #line 681 "./runpicture.in" f->append(new drawNurbs(*P,uknot,vknot,weights,*p,opacity,shininess, metallic,fresnel0,*colors)); } // Sphere primitive #line 687 "./runpicture.in" // void drawSphere(picture *f, realarray2 *t, bool half=false, penarray *p, real opacity, real shininess, real metallic, real fresnel0, Int type); void gen_runpicture52(stack *Stack) { Int type=vm::pop(Stack); real fresnel0=vm::pop(Stack); real metallic=vm::pop(Stack); real shininess=vm::pop(Stack); real opacity=vm::pop(Stack); penarray * p=vm::pop(Stack); bool half=vm::pop(Stack,false); realarray2 * t=vm::pop(Stack); picture * f=vm::pop(Stack); #line 690 "./runpicture.in" f->append(new drawSphere(*t,half,*p,opacity,shininess,metallic,fresnel0, intcast(type))); } // Cylinder primitive #line 696 "./runpicture.in" // void drawCylinder(picture *f, realarray2 *t, penarray *p, real opacity, real shininess, real metallic, real fresnel0, bool core=false); void gen_runpicture53(stack *Stack) { bool core=vm::pop(Stack,false); real fresnel0=vm::pop(Stack); real metallic=vm::pop(Stack); real shininess=vm::pop(Stack); real opacity=vm::pop(Stack); penarray * p=vm::pop(Stack); realarray2 * t=vm::pop(Stack); picture * f=vm::pop(Stack); #line 699 "./runpicture.in" f->append(new drawCylinder(*t,*p,opacity,shininess,metallic,fresnel0,core)); } // Disk primitive #line 704 "./runpicture.in" // void drawDisk(picture *f, realarray2 *t, penarray *p, real opacity, real shininess, real metallic, real fresnel0); void gen_runpicture54(stack *Stack) { real fresnel0=vm::pop(Stack); real metallic=vm::pop(Stack); real shininess=vm::pop(Stack); real opacity=vm::pop(Stack); penarray * p=vm::pop(Stack); realarray2 * t=vm::pop(Stack); picture * f=vm::pop(Stack); #line 706 "./runpicture.in" f->append(new drawDisk(*t,*p,opacity,shininess,metallic,fresnel0)); } // Tube primitive #line 711 "./runpicture.in" // void drawTube(picture *f, triplearray *g, real width, penarray *p, real opacity, real shininess, real metallic, real fresnel0, triple min, triple max, bool core=false); void gen_runpicture55(stack *Stack) { bool core=vm::pop(Stack,false); triple max=vm::pop(Stack); triple min=vm::pop(Stack); real fresnel0=vm::pop(Stack); real metallic=vm::pop(Stack); real shininess=vm::pop(Stack); real opacity=vm::pop(Stack); penarray * p=vm::pop(Stack); real width=vm::pop(Stack); triplearray * g=vm::pop(Stack); picture * f=vm::pop(Stack); #line 714 "./runpicture.in" f->append(new drawTube(*g,width,*p,opacity,shininess,metallic,fresnel0, min,max,core)); } // Draw pixel #line 720 "./runpicture.in" // void drawpixel(picture *f, triple v, pen p, real width=1.0); void gen_runpicture56(stack *Stack) { real width=vm::pop(Stack,1.0); pen p=vm::pop(Stack); triple v=vm::pop(Stack); picture * f=vm::pop(Stack); #line 721 "./runpicture.in" f->append(new drawPixel(v,p,width)); } // Draw triangles #line 726 "./runpicture.in" // void draw(picture *f, triplearray *v, Intarray2 *vi, triple center=Zero, triplearray *n, Intarray2 *ni, penarray *p, real opacity, real shininess, real metallic, real fresnel0, penarray *c=emptyarray, Intarray2 *ci=emptyarray, Int interaction); void gen_runpicture57(stack *Stack) { Int interaction=vm::pop(Stack); Intarray2 * ci=vm::pop(Stack,emptyarray); penarray * c=vm::pop(Stack,emptyarray); real fresnel0=vm::pop(Stack); real metallic=vm::pop(Stack); real shininess=vm::pop(Stack); real opacity=vm::pop(Stack); penarray * p=vm::pop(Stack); Intarray2 * ni=vm::pop(Stack); triplearray * n=vm::pop(Stack); triple center=vm::pop(Stack,Zero); Intarray2 * vi=vm::pop(Stack); triplearray * v=vm::pop(Stack); picture * f=vm::pop(Stack); #line 731 "./runpicture.in" f->append(new drawTriangles(*v,*vi,center,*n,*ni,*p,opacity,shininess, metallic,fresnel0,*c,*ci, (Interaction) intcast(interaction))); } #line 737 "./runpicture.in" // triple min3(picture *f); void gen_runpicture58(stack *Stack) { picture * f=vm::pop(Stack); #line 738 "./runpicture.in" {Stack->push(f->bounds3().Min()); return;} } #line 742 "./runpicture.in" // triple max3(picture *f); void gen_runpicture59(stack *Stack) { picture * f=vm::pop(Stack); #line 743 "./runpicture.in" {Stack->push(f->bounds3().Max()); return;} } #line 747 "./runpicture.in" // triple size3(picture *f); void gen_runpicture60(stack *Stack) { picture * f=vm::pop(Stack); #line 748 "./runpicture.in" bbox3 b=f->bounds3(); {Stack->push(b.Max()-b.Min()); return;} } #line 753 "./runpicture.in" // pair minratio(picture *f); void gen_runpicture61(stack *Stack) { picture * f=vm::pop(Stack); #line 754 "./runpicture.in" {Stack->push(f->ratio(::min)); return;} } #line 758 "./runpicture.in" // pair maxratio(picture *f); void gen_runpicture62(stack *Stack) { picture * f=vm::pop(Stack); #line 759 "./runpicture.in" {Stack->push(f->ratio(::max)); return;} } #line 763 "./runpicture.in" // bool is3D(picture *f); void gen_runpicture63(stack *Stack) { picture * f=vm::pop(Stack); #line 764 "./runpicture.in" {Stack->push(f->have3D()); return;} } } // namespace run namespace trans { void gen_runpicture_venv(venv &ve) { #line 126 "./runpicture.in" REGISTER_BLTIN(run::newPicture,"newPicture"); #line 131 "./runpicture.in" addFunc(ve, run::gen_runpicture1, primBoolean(), SYM(empty), formal(primPicture(), SYM(f), false, false)); #line 136 "./runpicture.in" addFunc(ve, run::gen_runpicture2, primVoid(), SYM(erase), formal(primPicture(), SYM(f), false, false)); #line 141 "./runpicture.in" addFunc(ve, run::gen_runpicture3, primPair(), SYM(min), formal(primPicture(), SYM(f), false, false)); #line 146 "./runpicture.in" addFunc(ve, run::gen_runpicture4, primPair(), SYM(max), formal(primPicture(), SYM(f), false, false)); #line 151 "./runpicture.in" addFunc(ve, run::gen_runpicture5, primPair(), SYM(size), formal(primPicture(), SYM(f), false, false)); #line 157 "./runpicture.in" addFunc(ve, run::gen_runpicture6, primVoid(), SYM(_draw), formal(primPicture(), SYM(f), false, false), formal(primPath(), SYM(g), false, false), formal(primPen(), SYM(p), false, false)); #line 162 "./runpicture.in" addFunc(ve, run::gen_runpicture7, primVoid(), SYM(fill), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primPen(), SYM(p), true, false), formal(primBoolean(), SYM(copy), true, false)); #line 168 "./runpicture.in" addFunc(ve, run::gen_runpicture8, primVoid(), SYM(latticeshade), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(penArray2(), SYM(p), false, false), formal(primTransform(), SYM(t), true, false), formal(primBoolean(), SYM(copy), true, false)); #line 177 "./runpicture.in" addFunc(ve, run::gen_runpicture9, primVoid(), SYM(axialshade), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(pena), false, false), formal(primPair(), SYM(a), false, false), formal(primBoolean(), SYM(extenda), true, false), formal(primPen(), SYM(penb), false, false), formal(primPair(), SYM(b), false, false), formal(primBoolean(), SYM(extendb), true, false), formal(primBoolean(), SYM(copy), true, false)); #line 186 "./runpicture.in" addFunc(ve, run::gen_runpicture10, primVoid(), SYM(radialshade), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(pena), false, false), formal(primPair(), SYM(a), false, false), formal(primReal(), SYM(ra), false, false), formal(primBoolean(), SYM(extenda), true, false), formal(primPen(), SYM(penb), false, false), formal(primPair(), SYM(b), false, false), formal(primReal(), SYM(rb), false, false), formal(primBoolean(), SYM(extendb), true, false), formal(primBoolean(), SYM(copy), true, false)); #line 195 "./runpicture.in" addFunc(ve, run::gen_runpicture11, primVoid(), SYM(gouraudshade), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(penArray(), SYM(p), false, false), formal(pairArray(), SYM(z), false, false), formal(IntArray(), SYM(edges), false, false), formal(primBoolean(), SYM(copy), true, false)); #line 206 "./runpicture.in" addFunc(ve, run::gen_runpicture12, primVoid(), SYM(gouraudshade), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(penArray(), SYM(p), false, false), formal(IntArray(), SYM(edges), false, false), formal(primBoolean(), SYM(copy), true, false)); #line 230 "./runpicture.in" addFunc(ve, run::gen_runpicture13, primVoid(), SYM(tensorshade), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(penArray2(), SYM(p), false, false), formal(pathArray(), SYM(b), true, false), formal(pairArray2(), SYM(z), true, false), formal(primBoolean(), SYM(copy), true, false)); #line 246 "./runpicture.in" addFunc(ve, run::gen_runpicture14, primVoid(), SYM(functionshade), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(primString(), SYM(shader), true, false), formal(primBoolean(), SYM(copy), true, false)); #line 254 "./runpicture.in" addFunc(ve, run::gen_runpicture15, primVoid(), SYM(clip), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(primBoolean(), SYM(copy), true, false)); #line 264 "./runpicture.in" addFunc(ve, run::gen_runpicture16, primVoid(), SYM(beginclip), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(primBoolean(), SYM(copy), true, false)); #line 271 "./runpicture.in" addFunc(ve, run::gen_runpicture17, primVoid(), SYM(endclip), formal(primPicture(), SYM(f), false, false)); #line 276 "./runpicture.in" addFunc(ve, run::gen_runpicture18, primVoid(), SYM(gsave), formal(primPicture(), SYM(f), false, false)); #line 281 "./runpicture.in" addFunc(ve, run::gen_runpicture19, primVoid(), SYM(grestore), formal(primPicture(), SYM(f), false, false)); #line 286 "./runpicture.in" addFunc(ve, run::gen_runpicture20, primVoid(), SYM(begingroup), formal(primPicture(), SYM(f), false, false)); #line 291 "./runpicture.in" addFunc(ve, run::gen_runpicture21, primVoid(), SYM(endgroup), formal(primPicture(), SYM(f), false, false)); #line 296 "./runpicture.in" addFunc(ve, run::gen_runpicture22, primVoid(), SYM(_begingroup3), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(name), false, false), formal(primReal(), SYM(compression), false, false), formal(primReal(), SYM(granularity), false, false), formal(primBoolean(), SYM(closed), false, false), formal(primBoolean(), SYM(tessellate), false, false), formal(primBoolean(), SYM(dobreak), false, false), formal(primBoolean(), SYM(nobreak), false, false), formal(primTriple(), SYM(center), false, false), formal(primInt(), SYM(interaction), false, false)); #line 305 "./runpicture.in" addFunc(ve, run::gen_runpicture23, primVoid(), SYM(endgroup3), formal(primPicture(), SYM(f), false, false)); #line 310 "./runpicture.in" addFunc(ve, run::gen_runpicture24, primVoid(), SYM(add), formal(primPicture(), SYM(dest), false, false), formal(primPicture(), SYM(src), false, false)); #line 315 "./runpicture.in" addFunc(ve, run::gen_runpicture25, primVoid(), SYM(prepend), formal(primPicture(), SYM(dest), false, false), formal(primPicture(), SYM(src), false, false)); #line 320 "./runpicture.in" addFunc(ve, run::gen_runpicture26, primVoid(), SYM(postscript), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(s), false, false)); #line 325 "./runpicture.in" addFunc(ve, run::gen_runpicture27, primVoid(), SYM(tex), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(s), false, false)); #line 330 "./runpicture.in" addFunc(ve, run::gen_runpicture28, primVoid(), SYM(postscript), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(s), false, false), formal(primPair(), SYM(min), false, false), formal(primPair(), SYM(max), false, false)); #line 335 "./runpicture.in" addFunc(ve, run::gen_runpicture29, primVoid(), SYM(tex), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(s), false, false), formal(primPair(), SYM(min), false, false), formal(primPair(), SYM(max), false, false)); #line 340 "./runpicture.in" addFunc(ve, run::gen_runpicture30, primVoid(), SYM(texpreamble), formal(primString(), SYM(s), false, false)); #line 348 "./runpicture.in" addFunc(ve, run::gen_runpicture31, primVoid(), SYM(deletepreamble)); #line 355 "./runpicture.in" addFunc(ve, run::gen_runpicture32, primVoid(), SYM(_labelpath), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(s), false, false), formal(primString(), SYM(size), false, false), formal(primPath(), SYM(g), false, false), formal(primString(), SYM(justify), false, false), formal(primPair(), SYM(offset), false, false), formal(primPen(), SYM(p), false, false)); #line 361 "./runpicture.in" addFunc(ve, run::gen_runpicture33, primVoid(), SYM(texreset)); #line 369 "./runpicture.in" addFunc(ve, run::gen_runpicture34, primVoid(), SYM(layer), formal(primPicture(), SYM(f), false, false)); #line 374 "./runpicture.in" addFunc(ve, run::gen_runpicture35, primVoid(), SYM(newpage), formal(primPicture(), SYM(f), false, false)); #line 379 "./runpicture.in" addFunc(ve, run::gen_runpicture36, primVoid(), SYM(_image), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(data), false, false), formal(primPair(), SYM(initial), false, false), formal(primPair(), SYM(final), false, false), formal(penArray(), SYM(palette), true, false), formal(primTransform(), SYM(t), true, false), formal(primBoolean(), SYM(copy), true, false), formal(primBoolean(), SYM(antialias), true, false)); #line 389 "./runpicture.in" addFunc(ve, run::gen_runpicture37, primVoid(), SYM(_image), formal(primPicture(), SYM(f), false, false), formal(penArray2(), SYM(data), false, false), formal(primPair(), SYM(initial), false, false), formal(primPair(), SYM(final), false, false), formal(primTransform(), SYM(t), true, false), formal(primBoolean(), SYM(copy), true, false), formal(primBoolean(), SYM(antialias), true, false)); #line 397 "./runpicture.in" addFunc(ve, run::gen_runpicture38, primVoid(), SYM(_image), formal(primPicture(), SYM(f), false, false), formal(penFunction(), SYM(f), false, false), formal(primInt(), SYM(width), false, false), formal(primInt(), SYM(height), false, false), formal(primPair(), SYM(initial), false, false), formal(primPair(), SYM(final), false, false), formal(primTransform(), SYM(t), true, false), formal(primBoolean(), SYM(antialias), true, false)); #line 404 "./runpicture.in" addFunc(ve, run::gen_runpicture39, primString(), SYM(nativeformat)); #line 409 "./runpicture.in" addFunc(ve, run::gen_runpicture40, primBoolean(), SYM(latex)); #line 414 "./runpicture.in" addFunc(ve, run::gen_runpicture41, primBoolean(), SYM(pdf)); #line 419 "./runpicture.in" addFunc(ve, run::gen_runpicture42, primVoid(), SYM(_shipout), formal(primString(), SYM(prefix), true, false), formal(primPicture(), SYM(f), false, false), formal(primPicture(), SYM(preamble), true, false), formal(primString(), SYM(format), true, false), formal(primBoolean(), SYM(wait), true, false), formal(primBoolean(), SYM(view), true, false), formal(primTransform(), SYM(t), true, false)); #line 470 "./runpicture.in" addFunc(ve, run::gen_runpicture43, primVoid(), SYM(shipout3), formal(primString(), SYM(prefix), false, false), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(format), true, false), formal(primReal(), SYM(width), false, false), formal(primReal(), SYM(height), false, false), formal(primReal(), SYM(angle), false, false), formal(primReal(), SYM(zoom), false, false), formal(primTriple(), SYM(m), false, false), formal(primTriple(), SYM(m), false, false), formal(primPair(), SYM(shift), false, false), formal(primPair(), SYM(margin), false, false), formal(realArray2(), SYM(t), false, false), formal(realArray2(), SYM(tup), false, false), formal(realArray(), SYM(background), false, false), formal(tripleArray(), SYM(lights), false, false), formal(realArray2(), SYM(diffuse), false, false), formal(realArray2(), SYM(specular), false, false), formal(primBoolean(), SYM(view), true, false)); #line 498 "./runpicture.in" addFunc(ve, run::gen_runpicture44, primVoid(), SYM(shipout3), formal(primString(), SYM(prefix), false, false), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(format), true, false)); #line 503 "./runpicture.in" addFunc(ve, run::gen_runpicture45, primVoid(), SYM(xmap), formal(primString(), SYM(key), false, false), formal(primTransform(), SYM(t), true, false)); #line 518 "./runpicture.in" addFunc(ve, run::gen_runpicture46, primVoid(), SYM(deconstruct), formal(primPicture(), SYM(f), false, false), formal(primPicture(), SYM(preamble), true, false), formal(primTransform(), SYM(t), true, false)); #line 630 "./runpicture.in" addFunc(ve, run::gen_runpicture47, primVoid(), SYM(_draw), formal(primPicture(), SYM(f), false, false), formal(primPath3(), SYM(g), false, false), formal(primTriple(), SYM(center), true, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(primInt(), SYM(interaction), true, false)); #line 645 "./runpicture.in" addFunc(ve, run::gen_runpicture48, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(center), false, false), formal(primBoolean(), SYM(straight), false, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(penArray(), SYM(colors), false, false), formal(primInt(), SYM(interaction), false, false), formal(primInt(), SYM(digits), false, false), formal(primBoolean(), SYM(primitive), true, false)); #line 657 "./runpicture.in" addFunc(ve, run::gen_runpicture49, primVoid(), SYM(drawbeziertriangle), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(center), false, false), formal(primBoolean(), SYM(straight), false, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(penArray(), SYM(colors), false, false), formal(primInt(), SYM(interaction), false, false), formal(primInt(), SYM(digits), false, false), formal(primBoolean(), SYM(primitive), true, false)); #line 670 "./runpicture.in" addFunc(ve, run::gen_runpicture50, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray(), SYM(p), false, false), formal(realArray(), SYM(knot), false, false), formal(realArray(), SYM(weights), true, false), formal(primPen(), SYM(p), false, false)); #line 677 "./runpicture.in" addFunc(ve, run::gen_runpicture51, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(realArray(), SYM(uknot), false, false), formal(realArray(), SYM(vknot), false, false), formal(realArray2(), SYM(weights), true, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(penArray(), SYM(colors), false, false)); #line 686 "./runpicture.in" addFunc(ve, run::gen_runpicture52, primVoid(), SYM(drawSphere), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(primBoolean(), SYM(half), true, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(primInt(), SYM(type), false, false)); #line 695 "./runpicture.in" addFunc(ve, run::gen_runpicture53, primVoid(), SYM(drawCylinder), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(primBoolean(), SYM(core), true, false)); #line 703 "./runpicture.in" addFunc(ve, run::gen_runpicture54, primVoid(), SYM(drawDisk), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false)); #line 710 "./runpicture.in" addFunc(ve, run::gen_runpicture55, primVoid(), SYM(drawTube), formal(primPicture(), SYM(f), false, false), formal(tripleArray(), SYM(g), false, false), formal(primReal(), SYM(width), false, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(primTriple(), SYM(min), false, false), formal(primTriple(), SYM(max), false, false), formal(primBoolean(), SYM(core), true, false)); #line 719 "./runpicture.in" addFunc(ve, run::gen_runpicture56, primVoid(), SYM(drawpixel), formal(primPicture(), SYM(f), false, false), formal(primTriple(), SYM(v), false, false), formal(primPen(), SYM(p), false, false), formal(primReal(), SYM(width), true, false)); #line 725 "./runpicture.in" addFunc(ve, run::gen_runpicture57, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray(), SYM(v), false, false), formal(IntArray2(), SYM(vi), false, false), formal(primTriple(), SYM(center), true, false), formal(tripleArray(), SYM(n), false, false), formal(IntArray2(), SYM(ni), false, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(penArray(), SYM(c), true, false), formal(IntArray2(), SYM(ci), true, false), formal(primInt(), SYM(interaction), false, false)); #line 737 "./runpicture.in" addFunc(ve, run::gen_runpicture58, primTriple(), SYM(min3), formal(primPicture(), SYM(f), false, false)); #line 742 "./runpicture.in" addFunc(ve, run::gen_runpicture59, primTriple(), SYM(max3), formal(primPicture(), SYM(f), false, false)); #line 747 "./runpicture.in" addFunc(ve, run::gen_runpicture60, primTriple(), SYM(size3), formal(primPicture(), SYM(f), false, false)); #line 753 "./runpicture.in" addFunc(ve, run::gen_runpicture61, primPair(), SYM(minratio), formal(primPicture(), SYM(f), false, false)); #line 758 "./runpicture.in" addFunc(ve, run::gen_runpicture62, primPair(), SYM(maxratio), formal(primPicture(), SYM(f), false, false)); #line 763 "./runpicture.in" addFunc(ve, run::gen_runpicture63, primBoolean(), SYM(is3D), formal(primPicture(), SYM(f), false, false)); } } // namespace trans asymptote-3.05/runstring.cc0000644000000000000000000004542715031566132014544 0ustar rootroot/***** Autogenerated from runstring.in; changes will be overwritten *****/ #line 1 "./runtimebase.in" /***** * runtimebase.in * Andy Hammerlindl 2009/07/28 * * Common declarations needed for all code-generating .in files. * *****/ #line 1 "./runstring.in" /***** * runstring.in * * Runtime functions for string operations. * *****/ #line 23 "./runtimebase.in" #include "stack.h" #include "types.h" #include "builtin.h" #include "entry.h" #include "errormsg.h" #include "array.h" #include "triple.h" #include "callable.h" #include "opsymbols.h" using vm::stack; using vm::error; using vm::array; using vm::read; using vm::callable; using types::formal; using types::function; using camp::triple; #define PRIMITIVE(name,Name,asyName) using types::prim##Name; #include #undef PRIMITIVE void unused(void *); namespace run { typedef double real; array *copyArray(array *a); array *copyArray2(array *a); array *copyArray3(array *a); double *copyTripleArray2Components(array *a, size_t &N, GCPlacement placement=NoGC); triple *copyTripleArray2C(array *a, size_t &N, GCPlacement placement=NoGC); } function *realRealFunction(); #define CURRENTPEN processData().currentpen #line 10 "runstring.in" #include #include #include #include #include #include #include "array.h" using namespace camp; using namespace vm; using namespace settings; typedef array stringarray; typedef array stringarray2; using types::stringArray; using types::stringArray2; namespace types { extern const char *names[]; } namespace run { extern string emptystring; } static const string defaulttimeformat=string("%a %b %d %T %Z %Y"); #ifdef HAVE_STRFTIME static const size_t nTime=256; static char Time[nTime]; #endif void checkformat(const char *ptr, bool intformat) { while(*ptr != '\0') { if(*ptr != '%') /* While we have regular characters, print them. */ ptr++; else { /* We've got a format specifier. */ ptr++; while(*ptr && strchr ("-+ #0'I", *ptr)) /* Move past flags. */ ptr++; if(*ptr == '*') ptr++; else while(isdigit(*ptr)) /* Handle explicit numeric value. */ ptr++; if(*ptr == '.') { ptr++; /* Go past the period. */ if(*ptr == '*') { ptr++; } else while(isdigit(*ptr)) /* Handle explicit numeric value. */ ptr++; } while(*ptr && strchr ("hlL", *ptr)) ptr++; if(*ptr == '%') {++ptr; continue;} else if(*ptr != '\0') { if(intformat) { switch(*ptr) { case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': case 'c': break; default: ostringstream buf; buf << "Invalid format '" << *ptr << "' for type " << types::names[types::ty_Int]; error(buf); break; } } else { switch(*ptr) { case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': break; default: ostringstream buf; buf << "Invalid format '" << *ptr << "' for type " << types::names[types::ty_real]; error(buf); break; } } } break; // Only one argument is allowed. } /* End of else statement */ } } // Autogenerated routines: #ifndef NOSYM #include "runstring.symbols.h" #endif namespace run { // String operations #line 116 "./runstring.in" void emptyString(stack *Stack) { #line 117 "./runstring.in" {Stack->push(emptystring); return;} } #line 122 "./runstring.in" // Int length(string *s); void gen_runstring1(stack *Stack) { string * s=vm::pop(Stack); #line 123 "./runstring.in" {Stack->push((Int) s->length()); return;} } #line 127 "./runstring.in" // Int find(string *s, string t, Int pos=0); void gen_runstring2(stack *Stack) { Int pos=vm::pop(Stack,0); string t=vm::pop(Stack); string * s=vm::pop(Stack); #line 128 "./runstring.in" size_t n=s->find(t,pos); {Stack->push(n == string::npos ? (Int) -1 : (Int) n); return;} } #line 133 "./runstring.in" // Int rfind(string *s, string t, Int pos=-1); void gen_runstring3(stack *Stack) { Int pos=vm::pop(Stack,-1); string t=vm::pop(Stack); string * s=vm::pop(Stack); #line 134 "./runstring.in" size_t n=s->rfind(t,pos); {Stack->push(n == string::npos ? (Int) -1 : (Int) n); return;} } #line 139 "./runstring.in" // string reverse(string s); void gen_runstring4(stack *Stack) { string s=vm::pop(Stack); #line 140 "./runstring.in" reverse(s.begin(),s.end()); {Stack->push(s); return;} } #line 145 "./runstring.in" // string insert(string s, Int pos, string t); void gen_runstring5(stack *Stack) { string t=vm::pop(Stack); Int pos=vm::pop(Stack); string s=vm::pop(Stack); #line 146 "./runstring.in" if ((size_t) pos < s.length()) {Stack->push(s.insert(pos,t)); return;} {Stack->push(s); return;} } #line 152 "./runstring.in" // string substr(string* s, Int pos, Int n=-1); void gen_runstring6(stack *Stack) { Int n=vm::pop(Stack,-1); Int pos=vm::pop(Stack); string* s=vm::pop(Stack); #line 153 "./runstring.in" if ((size_t) pos < s->length()) {Stack->push(s->substr(pos,n)); return;} {Stack->push(emptystring); return;} } #line 159 "./runstring.in" // string erase(string s, Int pos, Int n); void gen_runstring7(stack *Stack) { Int n=vm::pop(Stack); Int pos=vm::pop(Stack); string s=vm::pop(Stack); #line 160 "./runstring.in" if ((size_t) pos < s.length()) {Stack->push(s.erase(pos,n)); return;} {Stack->push(s); return;} } #line 166 "./runstring.in" // string downcase(string s); void gen_runstring8(stack *Stack) { string s=vm::pop(Stack); #line 167 "./runstring.in" std::transform(s.begin(),s.end(),s.begin(),tolower); {Stack->push(s); return;} } #line 172 "./runstring.in" // string upcase(string s); void gen_runstring9(stack *Stack) { string s=vm::pop(Stack); #line 173 "./runstring.in" std::transform(s.begin(),s.end(),s.begin(),toupper); {Stack->push(s); return;} } // returns a string constructed by translating all occurrences of the string // from in an array of string pairs {from,to} to the string to in string s. #line 180 "./runstring.in" // string replace(string *S, stringarray2 *translate); void gen_runstring10(stack *Stack) { stringarray2 * translate=vm::pop(Stack); string * S=vm::pop(Stack); #line 181 "./runstring.in" size_t size=checkArray(translate); for(size_t i=0; i < size; i++) { array *a=read(translate,i); checkArray(a); } size_t pos=0; ostringstream buf; size_t Len=S->length(); while(pos < Len) { for(size_t i=0; i < size;) { array *a=read(translate,i); size_t size2=checkArray(a); if(size2 != 2) error("translation table entry must be an array of length 2"); string* from=read(a,0); size_t len=from->length(); if(len == 0 || S->compare(pos,len,*from,0,len) != 0) {i++; continue;} buf << read(a,1); pos += len; if(pos == Len) {Stack->push(buf.str()); return;} i=0; } buf << S->substr(pos,1); ++pos; } {Stack->push(buf.str()); return;} } #line 211 "./runstring.in" // string format(string *format, Int x, string locale=emptystring); void gen_runstring11(stack *Stack) { string locale=vm::pop(Stack,emptystring); Int x=vm::pop(Stack); string * format=vm::pop(Stack); #line 212 "./runstring.in" ostringstream out; const char *p0=format->c_str(); checkformat(p0,true); const char *p=p0; const char *start=NULL; while(*p != 0) { char curr=*p; if(curr == '%') { p++; if(*p != '%') {start=p-1; break;} } out << *(p++); } if(!start) {Stack->push(out.str()); return;} // Allow at most 1 argument while(*p != 0) { if(*p == '*' || *p == '$') {Stack->push(out.str()); return;} if(isupper(*p) || islower(*p)) {p++; break;} p++; } string f=format->substr(start-p0,p-start); f.insert(p-start-1,"ll"); const char *oldlocale=NULL; if(!locale.empty()) { oldlocale=setlocale(LC_ALL,NULL); if(oldlocale) oldlocale=StrdupNoGC(oldlocale); setlocale(LC_ALL,locale.c_str()); } Int size=snprintf(NULL,0,f.c_str(),x)+1; if(size < 1) size=255; // Workaround for non-C99 compliant systems. char *buf=new char[size]; snprintf(buf,size,f.c_str(),x); out << string(buf); out << p; delete[] buf; if(oldlocale) { setlocale(LC_ALL,oldlocale); delete[] oldlocale; } {Stack->push(out.str()); return;} } #line 266 "./runstring.in" // string format(string *format, bool forcemath=false, string separator, real x, string locale=emptystring); void gen_runstring12(stack *Stack) { string locale=vm::pop(Stack,emptystring); real x=vm::pop(Stack); string separator=vm::pop(Stack); bool forcemath=vm::pop(Stack,false); string * format=vm::pop(Stack); #line 268 "./runstring.in" if(*format == "%") {Stack->push(""); return;} // Temporary workaround for github Issue #29. bool tex=getSetting("tex") != "none"; bool texify=forcemath; ostringstream out; const char *p0=format->c_str(); checkformat(p0,false); const char *phantom="\\phantom{+}"; const char *p=p0; const char *start=NULL; char prev=0; while(*p != 0) { char curr=*p; if(tex && curr == '$' && prev != '\\') texify=true; prev=curr; if(curr == '%') { p++; if(*p != '%') {start=p-1; break;} } out << *(p++); } if(!start) {Stack->push(out.str()); return;} // Allow at most 1 argument while(*p != 0) { if(*p == '*' || *p == '$') {Stack->push(out.str()); return;} if(isupper(*p) || islower(*p)) {p++; break;} p++; } const char *tail=p; string f=format->substr(start-p0,tail-start); const char *oldlocale=NULL; if(!locale.empty()) { oldlocale=setlocale(LC_ALL,NULL); if(oldlocale) oldlocale=StrdupNoGC(oldlocale); setlocale(LC_ALL,locale.c_str()); } Int size=snprintf(NULL,0,f.c_str(),x)+1; if(size < 1) size=255; // Workaround for non-C99 compliant systems. char *buf=new char[size]; snprintf(buf,size,f.c_str(),x); bool trailingzero=f.find("#") < string::npos; bool plus=f.find("+") < string::npos; bool space=f.find(" ") < string::npos; char *q=buf; // beginning of formatted number if(*q == ' ' && texify) { out << phantom; q++; } const char decimal=*(localeconv()->decimal_point); // Remove any spurious sign if(*q == '-' || *q == '+') { p=q+1; bool zero=true; while(*p != 0) { if(!isdigit(*p) && *p != decimal) break; if(isdigit(*p) && *p != '0') {zero=false; break;} p++; } if(zero) { q++; if((plus || space) && texify) out << phantom; } } const char *r=p=q; bool dp=false; while(*r != 0 && (isspace(*r) || isdigit(*r) || *r == decimal \ || *r == '+' || *r == '-')) { if(*r == decimal) dp=true; r++; } if(dp) { // Remove trailing zeros and/or decimal point r--; unsigned n=0; while(r > q && *r == '0') {r--; n++;} if(*r == decimal) {r--; n++;} while(q <= r) out << *(q++); if(!trailingzero) q += n; } bool zero=(r == p && *r == '0') && !trailingzero; // Translate "E+/E-/e+/e-" exponential notation to TeX while(*q != 0) { if(texify && (*q == 'E' || *q == 'e') && (*(q+1) == '+' || *(q+1) == '-')) { if(!zero) out << separator << "10^{"; bool plus=(*(q+1) == '+'); q++; if(plus) q++; if(*q == '-') out << *(q++); while(*q == '0' && (zero || isdigit(*(q+1)))) q++; while(isdigit(*q)) out << *(q++); if(!zero) out << "}"; break; } out << *(q++); } while(*tail != 0) out << *(tail++); delete[] buf; if(oldlocale) { setlocale(LC_ALL,oldlocale); delete[] oldlocale; } {Stack->push(out.str()); return;} } #line 395 "./runstring.in" // Int hex(string s); void gen_runstring13(stack *Stack) { string s=vm::pop(Stack); #line 396 "./runstring.in" istringstream is(s); is.setf(std::ios::hex,std::ios::basefield); Int value; if(is && is >> value && ((is >> std::ws).eof())) {Stack->push(value); return;} ostringstream buf; buf << "invalid hexadecimal cast from string \"" << s << "\""; error(buf); } #line 406 "./runstring.in" // Int ascii(string s); void gen_runstring14(stack *Stack) { string s=vm::pop(Stack); #line 407 "./runstring.in" {Stack->push(s.empty() ? -1 : (unsigned char) s[0]); return;} } #line 411 "./runstring.in" // string string(Int x); void gen_runstring15(stack *Stack) { Int x=vm::pop(Stack); #line 412 "./runstring.in" ostringstream buf; buf << x; {Stack->push(buf.str()); return;} } #line 418 "./runstring.in" // string string(real x, Int digits=DBL_DIG); void gen_runstring16(stack *Stack) { Int digits=vm::pop(Stack,DBL_DIG); real x=vm::pop(Stack); #line 419 "./runstring.in" ostringstream buf; buf.precision(digits); buf << x; {Stack->push(buf.str()); return;} } #line 426 "./runstring.in" // string time(string format=defaulttimeformat); void gen_runstring17(stack *Stack) { string format=vm::pop(Stack,defaulttimeformat); #line 427 "./runstring.in" #ifdef HAVE_STRFTIME const time_t bintime=time(NULL); if(!strftime(Time,nTime,format.c_str(),localtime(&bintime))) {Stack->push(""); return;} {Stack->push(Time); return;} #else {Stack->push(format); return;} #endif } #line 437 "./runstring.in" // string time(Int seconds, string format=defaulttimeformat); void gen_runstring18(stack *Stack) { string format=vm::pop(Stack,defaulttimeformat); Int seconds=vm::pop(Stack); #line 438 "./runstring.in" #ifdef HAVE_STRFTIME const time_t bintime=seconds; if(!strftime(Time,nTime,format.c_str(),localtime(&bintime))) {Stack->push(""); return;} {Stack->push(Time); return;} #else // Avoid unused variable warning messages unused(&seconds); {Stack->push(format); return;} #endif } #line 450 "./runstring.in" // Int seconds(string t=emptystring, string format=emptystring); void gen_runstring19(stack *Stack) { string format=vm::pop(Stack,emptystring); string t=vm::pop(Stack,emptystring); #line 451 "./runstring.in" if (t == "") { auto clock = std::chrono::system_clock::now(); {Stack->push(static_cast( std::chrono::duration_cast( clock.time_since_epoch() ).count() )); return;} } std::tm tmObj = {}; istringstream instream(t); instream.imbue(std::locale("")); instream >> std::get_time(&tmObj,format.c_str()); if(instream.fail()) { {Stack->push(-1); return;} } {Stack->push(static_cast(std::mktime(&tmObj))); return;} } } // namespace run namespace trans { void gen_runstring_venv(venv &ve) { #line 115 "./runstring.in" REGISTER_BLTIN(run::emptyString,"emptyString"); #line 122 "./runstring.in" addFunc(ve, run::gen_runstring1, primInt(), SYM(length), formal(primString(), SYM(s), false, false)); #line 127 "./runstring.in" addFunc(ve, run::gen_runstring2, primInt(), SYM(find), formal(primString(), SYM(s), false, false), formal(primString(), SYM(t), false, false), formal(primInt(), SYM(pos), true, false)); #line 133 "./runstring.in" addFunc(ve, run::gen_runstring3, primInt(), SYM(rfind), formal(primString(), SYM(s), false, false), formal(primString(), SYM(t), false, false), formal(primInt(), SYM(pos), true, false)); #line 139 "./runstring.in" addFunc(ve, run::gen_runstring4, primString(), SYM(reverse), formal(primString(), SYM(s), false, false)); #line 145 "./runstring.in" addFunc(ve, run::gen_runstring5, primString(), SYM(insert), formal(primString(), SYM(s), false, false), formal(primInt(), SYM(pos), false, false), formal(primString(), SYM(t), false, false)); #line 152 "./runstring.in" addFunc(ve, run::gen_runstring6, primString(), SYM(substr), formal(primString(), SYM(s), false, false), formal(primInt(), SYM(pos), false, false), formal(primInt(), SYM(n), true, false)); #line 159 "./runstring.in" addFunc(ve, run::gen_runstring7, primString(), SYM(erase), formal(primString(), SYM(s), false, false), formal(primInt(), SYM(pos), false, false), formal(primInt(), SYM(n), false, false)); #line 166 "./runstring.in" addFunc(ve, run::gen_runstring8, primString(), SYM(downcase), formal(primString(), SYM(s), false, false)); #line 172 "./runstring.in" addFunc(ve, run::gen_runstring9, primString(), SYM(upcase), formal(primString(), SYM(s), false, false)); #line 178 "./runstring.in" addFunc(ve, run::gen_runstring10, primString(), SYM(replace), formal(primString(), SYM(s), false, false), formal(stringArray2(), SYM(translate), false, false)); #line 211 "./runstring.in" addFunc(ve, run::gen_runstring11, primString(), SYM(format), formal(primString(), SYM(format), false, false), formal(primInt(), SYM(x), false, false), formal(primString(), SYM(locale), true, false)); #line 266 "./runstring.in" addFunc(ve, run::gen_runstring12, primString(), SYM(format), formal(primString(), SYM(format), false, false), formal(primBoolean(), SYM(forcemath), true, false), formal(primString(), SYM(separator), false, false), formal(primReal(), SYM(x), false, false), formal(primString(), SYM(locale), true, false)); #line 395 "./runstring.in" addFunc(ve, run::gen_runstring13, primInt(), SYM(hex), formal(primString(), SYM(s), false, false)); #line 406 "./runstring.in" addFunc(ve, run::gen_runstring14, primInt(), SYM(ascii), formal(primString(), SYM(s), false, false)); #line 411 "./runstring.in" addFunc(ve, run::gen_runstring15, primString(), SYM(string), formal(primInt(), SYM(x), false, false)); #line 418 "./runstring.in" addFunc(ve, run::gen_runstring16, primString(), SYM(string), formal(primReal(), SYM(x), false, false), formal(primInt(), SYM(digits), true, false)); #line 426 "./runstring.in" addFunc(ve, run::gen_runstring17, primString(), SYM(time), formal(primString(), SYM(format), true, false)); #line 437 "./runstring.in" addFunc(ve, run::gen_runstring18, primString(), SYM(time), formal(primInt(), SYM(seconds), false, false), formal(primString(), SYM(format), true, false)); #line 450 "./runstring.in" addFunc(ve, run::gen_runstring19, primInt(), SYM(seconds), formal(primString(), SYM(t), true, false), formal(primString(), SYM(format), true, false)); } } // namespace trans asymptote-3.05/runfile.cc0000644000000000000000000004433115031566132014146 0ustar rootroot/***** Autogenerated from runfile.in; changes will be overwritten *****/ #line 1 "./runtimebase.in" /***** * runtimebase.in * Andy Hammerlindl 2009/07/28 * * Common declarations needed for all code-generating .in files. * *****/ #line 1 "./runfile.in" /***** * runfile.in * * Runtime functions for file operations. * *****/ #line 23 "./runtimebase.in" #include "stack.h" #include "types.h" #include "builtin.h" #include "entry.h" #include "errormsg.h" #include "array.h" #include "triple.h" #include "callable.h" #include "opsymbols.h" using vm::stack; using vm::error; using vm::array; using vm::read; using vm::callable; using types::formal; using types::function; using camp::triple; #define PRIMITIVE(name,Name,asyName) using types::prim##Name; #include #undef PRIMITIVE void unused(void *); namespace run { typedef double real; array *copyArray(array *a); array *copyArray2(array *a); array *copyArray3(array *a); double *copyTripleArray2Components(array *a, size_t &N, GCPlacement placement=NoGC); triple *copyTripleArray2C(array *a, size_t &N, GCPlacement placement=NoGC); } function *realRealFunction(); #define CURRENTPEN processData().currentpen #line 10 "runfile.in" #include "fileio.h" #include "callable.h" #include "triple.h" #include "array.h" #include "seconds.h" #if defined(_WIN32) #include #else #include #endif using namespace camp; using namespace settings; using namespace vm; string commentchar="#"; // Autogenerated routines: #ifndef NOSYM #include "runfile.symbols.h" #endif namespace run { #line 31 "./runfile.in" // bool ==(file *a, file *b); void gen_runfile0(stack *Stack) { file * b=vm::pop(Stack); file * a=vm::pop(Stack); #line 32 "./runfile.in" {Stack->push(a == b); return;} } #line 36 "./runfile.in" // bool !=(file *a, file *b); void gen_runfile1(stack *Stack) { file * b=vm::pop(Stack); file * a=vm::pop(Stack); #line 37 "./runfile.in" {Stack->push(a != b); return;} } #line 41 "./runfile.in" void nullFile(stack *Stack) { #line 42 "./runfile.in" {Stack->push(&camp::nullfile); return;} } #line 46 "./runfile.in" // file* input(string name=emptystring, bool check=true, string comment=commentchar, string mode=emptystring); void gen_runfile3(stack *Stack) { string mode=vm::pop(Stack,emptystring); string comment=vm::pop(Stack,commentchar); bool check=vm::pop(Stack,true); string name=vm::pop(Stack,emptystring); #line 48 "./runfile.in" file *f=NULL; if(mode == "binary") f=new ibfile(name,check); else if(mode == "xdr" || mode == "xdrgz") { #ifdef HAVE_LIBTIRPC if(mode == "xdr") f=new ixfile(name,check); else if(mode == "xdrgz") f=new igzxfile(name,check); #else ostringstream buf; buf << name << ": XDR read support not enabled"; error(buf); #endif } else if(mode == "") { char c=comment.empty() ? (char) 0 : comment[0]; f=new camp::ifile(name,c,check); } else { f=NULL; ostringstream buf; buf << name << ": invalid file mode '" << mode << "'"; error(buf); } f->open(); {Stack->push(f); return;} } #line 77 "./runfile.in" // file* output(string name=emptystring, bool update=false, string comment=commentchar, string mode=emptystring); void gen_runfile4(stack *Stack) { string mode=vm::pop(Stack,emptystring); string comment=vm::pop(Stack,commentchar); bool update=vm::pop(Stack,false); string name=vm::pop(Stack,emptystring); #line 79 "./runfile.in" file *f=NULL; if(mode == "pipe") { f=new opipe(name); } else if(mode == "binary") { if(update) f=new iobfile(name); else f=new obfile(name); } else if(mode == "xdr") { #ifdef HAVE_LIBTIRPC if(update) f=new ioxfile(name); else f=new oxfile(name); #else ostringstream buf; buf << name << ": XDR write support not enabled"; error(buf); #endif } else if(mode == "") { if(update) { char c=comment.empty() ? (char) 0 : comment[0]; f=new iofile(name,c); } else f=new ofile(name); } else { f=NULL; ostringstream buf; buf << name << ": invalid file mode '" << mode << "'"; error(buf); } f->open(); if(update) f->seek(0,false); {Stack->push(f); return;} } #line 114 "./runfile.in" // bool eof(file *f); void gen_runfile5(stack *Stack) { file * f=vm::pop(Stack); #line 115 "./runfile.in" {Stack->push(f->eof()); return;} } #line 119 "./runfile.in" // bool eol(file *f); void gen_runfile6(stack *Stack) { file * f=vm::pop(Stack); #line 120 "./runfile.in" {Stack->push(f->eol()); return;} } #line 124 "./runfile.in" // bool error(file *f); void gen_runfile7(stack *Stack) { file * f=vm::pop(Stack); #line 125 "./runfile.in" {Stack->push(f->error()); return;} } #line 129 "./runfile.in" // void clear(file *f); void gen_runfile8(stack *Stack) { file * f=vm::pop(Stack); #line 130 "./runfile.in" f->clear(); } #line 134 "./runfile.in" // void close(file *f); void gen_runfile9(stack *Stack) { file * f=vm::pop(Stack); #line 135 "./runfile.in" f->close(); } #line 139 "./runfile.in" // Int precision(file *f=NULL, Int digits=0); void gen_runfile10(stack *Stack) { Int digits=vm::pop(Stack,0); file * f=vm::pop(Stack,NULL); #line 140 "./runfile.in" if(f == 0) f=&camp::Stdout; {Stack->push(f->precision(digits)); return;} } #line 145 "./runfile.in" // void flush(file *f); void gen_runfile11(stack *Stack) { file * f=vm::pop(Stack); #line 146 "./runfile.in" f->flush(); } #line 150 "./runfile.in" // string getc(file *f); void gen_runfile12(stack *Stack) { file * f=vm::pop(Stack); #line 151 "./runfile.in" char c=0; if(f->isOpen()) f->read(c); {Stack->push(string(1,c)); return;} } #line 157 "./runfile.in" // Int tell(file *f); void gen_runfile13(stack *Stack) { file * f=vm::pop(Stack); #line 158 "./runfile.in" {Stack->push(f->tell()); return;} } #line 162 "./runfile.in" // void seek(file *f, Int pos); void gen_runfile14(stack *Stack) { Int pos=vm::pop(Stack); file * f=vm::pop(Stack); #line 163 "./runfile.in" f->seek(pos,pos >= 0); } #line 167 "./runfile.in" // void seekeof(file *f); void gen_runfile15(stack *Stack) { file * f=vm::pop(Stack); #line 168 "./runfile.in" f->seek(0,false); } #line 172 "./runfile.in" void namePart(stack *Stack) { file f=vm::pop(Stack); #line 173 "./runfile.in" {Stack->push(f.filename()); return;} } #line 177 "./runfile.in" void modePart(stack *Stack) { file f=vm::pop(Stack); #line 178 "./runfile.in" {Stack->push(f.FileMode()); return;} } // Set file dimensions #line 183 "./runfile.in" void dimensionSetHelper(stack *Stack) { file * f=vm::pop(Stack); Int nz=vm::pop(Stack,-1); Int ny=vm::pop(Stack,-1); Int nx=vm::pop(Stack,-1); #line 184 "./runfile.in" f->dimension(nx,ny,nz); {Stack->push(f); return;} } #line 189 "./runfile.in" void dimensionSet(stack *Stack) { file * f=vm::pop(Stack); #line 190 "./runfile.in" {Stack->push(new thunk(new bfunc(dimensionSetHelper),f)); return;} } #line 194 "./runfile.in" void dimensionPart(stack *Stack) { file f=vm::pop(Stack); #line 195 "./runfile.in" array *a=new array(3); (*a)[0]=f.Nx(); (*a)[1]=f.Ny(); (*a)[2]=f.Nz(); {Stack->push(a); return;} } // Set file f to read arrays in line-at-a-time mode #line 204 "./runfile.in" void lineSetHelper(stack *Stack) { file * f=vm::pop(Stack); bool b=vm::pop(Stack,true); #line 205 "./runfile.in" f->LineMode(b); {Stack->push(f); return;} } #line 210 "./runfile.in" void lineSet(stack *Stack) { file * f=vm::pop(Stack); #line 211 "./runfile.in" {Stack->push(new thunk(new bfunc(lineSetHelper),f)); return;} } #line 215 "./runfile.in" void linePart(stack *Stack) { file f=vm::pop(Stack); #line 216 "./runfile.in" {Stack->push(f.LineMode()); return;} } // Set file to read comma-separated values #line 221 "./runfile.in" void csvSetHelper(stack *Stack) { file * f=vm::pop(Stack); bool b=vm::pop(Stack,true); #line 222 "./runfile.in" f->CSVMode(b); {Stack->push(f); return;} } #line 227 "./runfile.in" void csvSet(stack *Stack) { file * f=vm::pop(Stack); #line 228 "./runfile.in" {Stack->push(new thunk(new bfunc(csvSetHelper),f)); return;} } #line 232 "./runfile.in" void csvPart(stack *Stack) { file f=vm::pop(Stack); #line 233 "./runfile.in" {Stack->push(f.CSVMode()); return;} } // Set file to read whitespace-separated values #line 238 "./runfile.in" void wordSetHelper(stack *Stack) { file * f=vm::pop(Stack); bool b=vm::pop(Stack,true); #line 239 "./runfile.in" f->WordMode(b); {Stack->push(f); return;} } #line 244 "./runfile.in" void wordSet(stack *Stack) { file * f=vm::pop(Stack); #line 245 "./runfile.in" {Stack->push(new thunk(new bfunc(wordSetHelper),f)); return;} } #line 249 "./runfile.in" void wordPart(stack *Stack) { file f=vm::pop(Stack); #line 250 "./runfile.in" {Stack->push(f.WordMode()); return;} } // Set file to read/write single precision real XDR values. #line 255 "./runfile.in" void singlerealSetHelper(stack *Stack) { file * f=vm::pop(Stack); bool b=vm::pop(Stack,true); #line 256 "./runfile.in" f->SingleReal(b); {Stack->push(f); return;} } #line 261 "./runfile.in" void singlerealSet(stack *Stack) { file * f=vm::pop(Stack); #line 262 "./runfile.in" {Stack->push(new thunk(new bfunc(singlerealSetHelper),f)); return;} } #line 266 "./runfile.in" void singlerealPart(stack *Stack) { file f=vm::pop(Stack); #line 267 "./runfile.in" {Stack->push(f.SingleReal()); return;} } // Set file to read/write single precision int XDR values. #line 272 "./runfile.in" void singleintSetHelper(stack *Stack) { file * f=vm::pop(Stack); bool b=vm::pop(Stack,true); #line 273 "./runfile.in" f->SingleInt(b); {Stack->push(f); return;} } #line 278 "./runfile.in" void singleintSet(stack *Stack) { file * f=vm::pop(Stack); #line 279 "./runfile.in" {Stack->push(new thunk(new bfunc(singleintSetHelper),f)); return;} } #line 283 "./runfile.in" void singleintPart(stack *Stack) { file f=vm::pop(Stack); #line 284 "./runfile.in" {Stack->push(f.SingleInt()); return;} } // Set file to read/write signed int XDR values. #line 289 "./runfile.in" void signedintSetHelper(stack *Stack) { file * f=vm::pop(Stack); bool b=vm::pop(Stack,true); #line 290 "./runfile.in" f->SignedInt(b); {Stack->push(f); return;} } #line 295 "./runfile.in" void signedintSet(stack *Stack) { file * f=vm::pop(Stack); #line 296 "./runfile.in" {Stack->push(new thunk(new bfunc(signedintSetHelper),f)); return;} } #line 300 "./runfile.in" void signedintPart(stack *Stack) { file f=vm::pop(Stack); #line 301 "./runfile.in" {Stack->push(f.SignedInt()); return;} } // Set file to read an arrayi (i int sizes followed by an i-dimensional array) #line 306 "./runfile.in" void readSetHelper(stack *Stack) { file * f=vm::pop(Stack); Int i=vm::pop(Stack); #line 307 "./runfile.in" switch(i) { case 1: f->dimension(-2); break; case 2: f->dimension(-2,-2); break; case 3: f->dimension(-2,-2,-2); break; default: f->dimension(); } {Stack->push(f); return;} } #line 328 "./runfile.in" void readSet(stack *Stack) { file * f=vm::pop(Stack); #line 329 "./runfile.in" {Stack->push(new thunk(new bfunc(readSetHelper),f)); return;} } // Delete file named s. #line 334 "./runfile.in" // Int delete(string s); void gen_runfile41(stack *Stack) { string s=vm::pop(Stack); #line 335 "./runfile.in" s=outpath(s); Int rc=unlink(s.c_str()); if(rc == 0 && verbose > 0) cout << "Deleted " << s << endl; {Stack->push(rc); return;} } // Rename file "from" to file "to". #line 344 "./runfile.in" // Int rename(string from, string to); void gen_runfile42(stack *Stack) { string to=vm::pop(Stack); string from=vm::pop(Stack); #line 345 "./runfile.in" from=outpath(from); to=outpath(to); Int rc=renameOverwrite(from.c_str(),to.c_str()); if(rc == 0 && verbose > 0) cout << "Renamed " << from << " to " << to << endl; {Stack->push(rc); return;} } // Create a uniquely named temporary file. #line 355 "./runfile.in" // string mktemp(string s); void gen_runfile43(stack *Stack) { string s=vm::pop(Stack); #line 356 "./runfile.in" string baseTemplate=s+"XXXXXX"; char *S=StrdupMalloc(baseTemplate); bool success=true; #if defined(_WIN32) if (_mktemp_s(S,baseTemplate.length()+1) != 0) { success = false; } FILE* fp; if (success && (fopen_s(&fp,S,"w") != 0)) { success = false; } #else int fd=mkstemp(S); if (fd < 0) { success = false; } #endif if(!success) { ostringstream buf; buf << "Could not create unique temporary filename based on " << s; error(buf); } string T(S); free(S); #if defined(_WIN32) bool closeSuccess = fclose(fp) == 0; #else bool closeSuccess = close(fd) == 0; #endif if (!closeSuccess) { ostringstream buf; buf << "Could not finalize temporary file based on " << s; error(buf); } {Stack->push(T); return;} } } // namespace run namespace trans { void gen_runfile_venv(venv &ve) { #line 31 "./runfile.in" addFunc(ve, run::gen_runfile0, primBoolean(), SYM_EQ, formal(primFile(), SYM(a), false, false), formal(primFile(), SYM(b), false, false)); #line 36 "./runfile.in" addFunc(ve, run::gen_runfile1, primBoolean(), SYM_NEQ, formal(primFile(), SYM(a), false, false), formal(primFile(), SYM(b), false, false)); #line 41 "./runfile.in" REGISTER_BLTIN(run::nullFile,"nullFile"); #line 46 "./runfile.in" addFunc(ve, run::gen_runfile3, primFile(), SYM(input), formal(primString(), SYM(name), true, false), formal(primBoolean(), SYM(check), true, false), formal(primString(), SYM(comment), true, false), formal(primString(), SYM(mode), true, false)); #line 77 "./runfile.in" addFunc(ve, run::gen_runfile4, primFile(), SYM(output), formal(primString(), SYM(name), true, false), formal(primBoolean(), SYM(update), true, false), formal(primString(), SYM(comment), true, false), formal(primString(), SYM(mode), true, false)); #line 114 "./runfile.in" addFunc(ve, run::gen_runfile5, primBoolean(), SYM(eof), formal(primFile(), SYM(f), false, false)); #line 119 "./runfile.in" addFunc(ve, run::gen_runfile6, primBoolean(), SYM(eol), formal(primFile(), SYM(f), false, false)); #line 124 "./runfile.in" addFunc(ve, run::gen_runfile7, primBoolean(), SYM(error), formal(primFile(), SYM(f), false, false)); #line 129 "./runfile.in" addFunc(ve, run::gen_runfile8, primVoid(), SYM(clear), formal(primFile(), SYM(f), false, false)); #line 134 "./runfile.in" addFunc(ve, run::gen_runfile9, primVoid(), SYM(close), formal(primFile(), SYM(f), false, false)); #line 139 "./runfile.in" addFunc(ve, run::gen_runfile10, primInt(), SYM(precision), formal(primFile(), SYM(f), true, false), formal(primInt(), SYM(digits), true, false)); #line 145 "./runfile.in" addFunc(ve, run::gen_runfile11, primVoid(), SYM(flush), formal(primFile(), SYM(f), false, false)); #line 150 "./runfile.in" addFunc(ve, run::gen_runfile12, primString(), SYM(getc), formal(primFile(), SYM(f), false, false)); #line 157 "./runfile.in" addFunc(ve, run::gen_runfile13, primInt(), SYM(tell), formal(primFile(), SYM(f), false, false)); #line 162 "./runfile.in" addFunc(ve, run::gen_runfile14, primVoid(), SYM(seek), formal(primFile(), SYM(f), false, false), formal(primInt(), SYM(pos), false, false)); #line 167 "./runfile.in" addFunc(ve, run::gen_runfile15, primVoid(), SYM(seekeof), formal(primFile(), SYM(f), false, false)); #line 172 "./runfile.in" REGISTER_BLTIN(run::namePart,"namePart"); #line 177 "./runfile.in" REGISTER_BLTIN(run::modePart,"modePart"); #line 182 "./runfile.in" REGISTER_BLTIN(run::dimensionSetHelper,"dimensionSetHelper"); #line 189 "./runfile.in" REGISTER_BLTIN(run::dimensionSet,"dimensionSet"); #line 194 "./runfile.in" REGISTER_BLTIN(run::dimensionPart,"dimensionPart"); #line 203 "./runfile.in" REGISTER_BLTIN(run::lineSetHelper,"lineSetHelper"); #line 210 "./runfile.in" REGISTER_BLTIN(run::lineSet,"lineSet"); #line 215 "./runfile.in" REGISTER_BLTIN(run::linePart,"linePart"); #line 220 "./runfile.in" REGISTER_BLTIN(run::csvSetHelper,"csvSetHelper"); #line 227 "./runfile.in" REGISTER_BLTIN(run::csvSet,"csvSet"); #line 232 "./runfile.in" REGISTER_BLTIN(run::csvPart,"csvPart"); #line 237 "./runfile.in" REGISTER_BLTIN(run::wordSetHelper,"wordSetHelper"); #line 244 "./runfile.in" REGISTER_BLTIN(run::wordSet,"wordSet"); #line 249 "./runfile.in" REGISTER_BLTIN(run::wordPart,"wordPart"); #line 254 "./runfile.in" REGISTER_BLTIN(run::singlerealSetHelper,"singlerealSetHelper"); #line 261 "./runfile.in" REGISTER_BLTIN(run::singlerealSet,"singlerealSet"); #line 266 "./runfile.in" REGISTER_BLTIN(run::singlerealPart,"singlerealPart"); #line 271 "./runfile.in" REGISTER_BLTIN(run::singleintSetHelper,"singleintSetHelper"); #line 278 "./runfile.in" REGISTER_BLTIN(run::singleintSet,"singleintSet"); #line 283 "./runfile.in" REGISTER_BLTIN(run::singleintPart,"singleintPart"); #line 288 "./runfile.in" REGISTER_BLTIN(run::signedintSetHelper,"signedintSetHelper"); #line 295 "./runfile.in" REGISTER_BLTIN(run::signedintSet,"signedintSet"); #line 300 "./runfile.in" REGISTER_BLTIN(run::signedintPart,"signedintPart"); #line 305 "./runfile.in" REGISTER_BLTIN(run::readSetHelper,"readSetHelper"); #line 328 "./runfile.in" REGISTER_BLTIN(run::readSet,"readSet"); #line 333 "./runfile.in" addFunc(ve, run::gen_runfile41, primInt(), SYM(delete), formal(primString(), SYM(s), false, false)); #line 343 "./runfile.in" addFunc(ve, run::gen_runfile42, primInt(), SYM(rename), formal(primString(), SYM(from), false, false), formal(primString(), SYM(to), false, false)); #line 354 "./runfile.in" addFunc(ve, run::gen_runfile43, primString(), SYM(mktemp), formal(primString(), SYM(s), false, false)); } } // namespace trans asymptote-3.05/runhistory.in0000644000000000000000000001222715031566105014750 0ustar rootroot/***** * runhistory.in * * Runtime functions for history operations. * *****/ pair => primPair() picture* => primPicture() stringarray* => stringArray() #include "array.h" #include "mathop.h" #include "builtin.h" #if defined(_WIN32) #include #define isatty _isatty #else #include #endif using namespace camp; using namespace settings; using namespace vm; using namespace run; typedef array stringarray; using types::stringArray; namespace camp { bool allowRender=false; } #if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES) #include #include struct historyState { bool store; HISTORY_STATE state; }; typedef mem::map historyMap_t; historyMap_t historyMap; static HISTORY_STATE history_save; // Store a deep copy of the current readline history in dest. void store_history(HISTORY_STATE *dest) { HISTORY_STATE *src=history_get_history_state(); if(src) { *dest=*src; for(Int i=0; i < src->length; ++i) dest->entries[i]=src->entries[i]; free(src); } } stringarray* get_history(Int n) { int N=intcast(n); if(N <= 0) N=history_length; else N=Min(N,history_length); array *a=new array((size_t) N); int offset=history_length-N+1; for(int i=0; i < N; ++i) { HIST_ENTRY *last=history_get(offset+i); string s=last ? last->line : ""; (*a)[i]=s; } return a; } string historyfilename(const string &name) { return historyname+"_"+name; } #endif namespace run { extern string emptystring; #if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES) #endif void cleanup() { #if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES) store_history(&history_save); int nlines=intcast(getSetting("historylines")); for(historyMap_t::iterator h=historyMap.begin(); h != historyMap.end(); ++h) { history_set_history_state(&h->second.state); if(h->second.store) { stifle_history(nlines); write_history(historyfilename(h->first).c_str()); unstifle_history(); } } history_set_history_state(&history_save); #endif #ifdef HAVE_LIBGSL trans::GSLrngFree(); #endif } } // Autogenerated routines: // Return the last n lines of the history named name. stringarray* history(string name, Int n=1) { #if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES) bool newhistory=historyMap.find(name) == historyMap.end(); string filename; if(newhistory) { filename=historyfilename(name); std::ifstream exists(filename.c_str()); if(!exists) return new array(0); } store_history(&history_save); HISTORY_STATE& history=historyMap[name].state; history_set_history_state(&history); if(newhistory) read_history(filename.c_str()); array *a=get_history(n); store_history(&history); history_set_history_state(&history_save); return a; #else unused(&n); return new array(0); #endif } // Return the last n lines of the interactive history. stringarray* history(Int n=0) { #if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES) return get_history(n); #else unused(&n); return new array(0); #endif } // Prompt for a string using prompt, the GNU readline library, and a // local history named name. string readline(string prompt=emptystring, string name=emptystring, bool tabcompletion=false) { bool stdinIsTty=isatty(STDIN_FILENO); bool hasInpipe=getSetting("inpipe") >= 0; if(!(stdinIsTty || hasInpipe)) { return emptystring; } #if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES) interact::init_readline(tabcompletion); store_history(&history_save); bool newhistory=historyMap.find(name) == historyMap.end(); historyState& h=historyMap[name]; HISTORY_STATE& history=h.state; history_set_history_state(&history); if(newhistory) read_history(historyfilename(name).c_str()); static char *line=NULL; /* Return the memory to the free pool if the buffer has already been allocated. */ if(line) { free(line); line=NULL; } /* Get a line from the user. */ bool allowRenderSave=allowRender; allowRender=false; line=readline(prompt.c_str()); allowRender=allowRenderSave; if(!line) cout << endl; history_set_history_state(&history_save); return line ? string(line) : emptystring; #else cout << prompt; string s; getline(cin,s); unused(&tabcompletion); // Avoid unused variable warning message. return s; #endif } // Save a string in a local history named name. // If store=true, store the local history in the file historyfilename(name). void saveline(string name, string value, bool store=true) { #if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES) store_history(&history_save); bool newhistory=historyMap.find(name) == historyMap.end(); historyState& h=historyMap[name]; h.store=store; HISTORY_STATE& history=h.state; history_set_history_state(&history); if(newhistory) read_history(historyfilename(name).c_str()); if(value != "") { add_history(value.c_str()); if(store) { std::ofstream hout(historyfilename(name).c_str(),std::ios::app); hout << value << endl; } } store_history(&history); history_set_history_state(&history_save); #else unused(&store); #endif } asymptote-3.05/drawfill.h0000644000000000000000000001455115031566105014151 0ustar rootroot/***** * drawfill.h * Andy Hammerlindl 2002/06/06 * * Stores a cyclic path that will outline a filled shape in a picture. *****/ #ifndef DRAWFILL_H #define DRAWFILL_H #include "drawelement.h" #include "path.h" namespace camp { class drawFill : public drawSuperPathPenBase { protected: bool stroke; public: void noncyclic() { reportError("non-cyclic path cannot be filled"); } drawFill(const vm::array& src, bool stroke, pen pentype, const string& key="") : drawElement(key), drawSuperPathPenBase(src,pentype), stroke(stroke) { if(!stroke && !cyclic()) noncyclic(); } bool svg() {return true;} // dvisvgm doesn't yet support SVG patterns. bool svgpng() {return pentype.fillpattern() != "";} virtual ~drawFill() {} virtual bool draw(psfile *out); virtual void palette(psfile *out) { penSave(out); penTranslate(out); } virtual void fill(psfile *out) { out->setpen(pentype); if(stroke) out->strokepath(); out->fill(pentype); penRestore(out); }; drawElement *transformed(const transform& t); }; class drawShade : public drawFill { public: drawShade(const vm::array& src, bool stroke, pen pentype, const string& key="") : drawFill(src,stroke,pentype,key) {} void bounds(bbox& b, iopipestream& iopipe, boxvector& vbox, bboxlist& bboxstack) { if(stroke) strokebounds(b); else drawSuperPathPenBase::bounds(b,iopipe,vbox,bboxstack); } bool pdf() { return settings::pdf(settings::getSetting("tex")); } // Shading in SVG is incomplete and not supported at all by dvisvgm --pdf. bool svgpng() {return true;} virtual void beginshade(psfile *out)=0; virtual void shade(psfile *out)=0; bool draw(psfile *out) { if(pentype.invisible() || empty()) return true; palette(out); beginshade(out); writeclippath(out); if(stroke) strokepath(out); out->endpsclip(pentype.Fillrule()); shade(out); out->grestore(); return true; } }; class drawLatticeShade : public drawShade { protected: vm::array pens; const transform T; public: drawLatticeShade(const vm::array& src, bool stroke, pen pentype, const vm::array& pens, const camp::transform& T=identity, const string& key="") : drawShade(src,stroke,pentype,key), pens(pens), T(T) {} void palette(psfile *out) { out->gsave(); } void beginshade(psfile *out) { out->beginlatticeshade(pens,bpath); } void shade(psfile *out) { bbox b; for(size_t i=0; i < size; i++) { path p=vm::read(P,i).transformed(inverse(T)); if(stroke) drawPathPenBase::strokebounds(b,p); else b += p.bounds(); } out->latticeshade(pens,T*matrix(b.Min(),b.Max())); } drawElement *transformed(const transform& t); }; class drawAxialShade : public drawShade { protected: pair a; bool extenda; pen penb; pair b; bool extendb; ColorSpace colorspace; public: drawAxialShade(const vm::array& src, bool stroke, pen pentype, pair a, bool extenda, pen penb, pair b, bool extendb, const string& key="") : drawShade(src,stroke,pentype,key), a(a), extenda(extenda), penb(penb), b(b), extendb(extendb) {} bool svgpng() {return !extenda || !extendb || pdf();} void palette(psfile *out); void beginshade(psfile *out) { out->begingradientshade(true,colorspace,pentype,a,0,penb,b,0); } void shade(psfile *out) { out->gradientshade(true,colorspace,pentype,a,0,extenda,penb,b,0,extendb); } drawElement *transformed(const transform& t); }; class drawRadialShade : public drawAxialShade { protected: double ra; double rb; public: drawRadialShade(const vm::array& src, bool stroke, pen pentype, pair a, double ra, bool extenda, pen penb, pair b, double rb, bool extendb, const string& key="") : drawAxialShade(src,stroke,pentype,a,extenda,penb,b, extendb,key), ra(ra), rb(rb) {} bool svgpng() {return a != b || ra > 0.0 || !extenda || !extendb || pdf();} void beginshade(psfile *out) { out->begingradientshade(false,colorspace,pentype,a,ra,penb,b,rb); } void shade(psfile *out) { out->gradientshade(false,colorspace,pentype,a,ra,extenda,penb,b,rb,extendb); } drawElement *transformed(const transform& t); }; class drawGouraudShade : public drawShade { protected: vm::array pens,vertices,edges; public: drawGouraudShade(const vm::array& src, bool stroke, pen pentype, const vm::array& pens, const vm::array& vertices, const vm::array& edges, const string& key="") : drawElement(key), drawShade(src,stroke,pentype,key), pens(pens), vertices(vertices), edges(edges) {} bool svgpng() {return settings::xasy || !settings::getSetting("svgemulation") || pdf();} void palette(psfile *out) { out->gsave(); } void beginshade(psfile *out) { out->begingouraudshade(pens,vertices,edges); } void shade(psfile *out) { out->gouraudshade(pentype,pens,vertices,edges); } drawElement *transformed(const transform& t); }; class drawTensorShade : public drawShade { protected: vm::array pens,boundaries,z; public: drawTensorShade(const vm::array& src, bool stroke, pen pentype, const vm::array& pens, const vm::array& boundaries, const vm::array& z, const string& key="") : drawShade(src,stroke,pentype,key), pens(pens), boundaries(boundaries), z(z) { } void palette(psfile *out) { out->gsave(); } void beginshade(psfile *out) {} void shade(psfile *out) { out->tensorshade(pentype,pens,boundaries,z); } drawElement *transformed(const transform& t); }; class drawFunctionShade : public drawFill { protected: string shader; public: drawFunctionShade(const vm::array& src, bool stroke, pen pentype, const string& shader, const string& key="") : drawFill(src,stroke,pentype,key), shader(shader) { string texengine=settings::getSetting("tex"); if(!settings::pdf(texengine)) reportError("functionshade is not implemented for the '"+texengine+ "' tex engine"); } virtual ~drawFunctionShade() {} bool draw(psfile *out) {return false;} bool write(texfile *, const bbox&); bool islabel() {return true;} drawElement *transformed(const transform& t); }; } #endif asymptote-3.05/runstring.in0000644000000000000000000002376015031566105014561 0ustar rootroot/***** * runstring.in * * Runtime functions for string operations. * *****/ stringarray2* => stringArray2() #include #include #include #include #include #include #include "array.h" using namespace camp; using namespace vm; using namespace settings; typedef array stringarray; typedef array stringarray2; using types::stringArray; using types::stringArray2; namespace types { extern const char *names[]; } namespace run { extern string emptystring; } static const string defaulttimeformat=string("%a %b %d %T %Z %Y"); #ifdef HAVE_STRFTIME static const size_t nTime=256; static char Time[nTime]; #endif void checkformat(const char *ptr, bool intformat) { while(*ptr != '\0') { if(*ptr != '%') /* While we have regular characters, print them. */ ptr++; else { /* We've got a format specifier. */ ptr++; while(*ptr && strchr ("-+ #0'I", *ptr)) /* Move past flags. */ ptr++; if(*ptr == '*') ptr++; else while(isdigit(*ptr)) /* Handle explicit numeric value. */ ptr++; if(*ptr == '.') { ptr++; /* Go past the period. */ if(*ptr == '*') { ptr++; } else while(isdigit(*ptr)) /* Handle explicit numeric value. */ ptr++; } while(*ptr && strchr ("hlL", *ptr)) ptr++; if(*ptr == '%') {++ptr; continue;} else if(*ptr != '\0') { if(intformat) { switch(*ptr) { case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': case 'c': break; default: ostringstream buf; buf << "Invalid format '" << *ptr << "' for type " << types::names[types::ty_Int]; error(buf); break; } } else { switch(*ptr) { case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': break; default: ostringstream buf; buf << "Invalid format '" << *ptr << "' for type " << types::names[types::ty_real]; error(buf); break; } } } break; // Only one argument is allowed. } /* End of else statement */ } } // Autogenerated routines: // String operations string :emptyString() { return emptystring; } Int length(string *s) { return (Int) s->length(); } Int find(string *s, string t, Int pos=0) { size_t n=s->find(t,pos); return n == string::npos ? (Int) -1 : (Int) n; } Int rfind(string *s, string t, Int pos=-1) { size_t n=s->rfind(t,pos); return n == string::npos ? (Int) -1 : (Int) n; } string reverse(string s) { reverse(s.begin(),s.end()); return s; } string insert(string s, Int pos, string t) { if ((size_t) pos < s.length()) return s.insert(pos,t); return s; } string substr(string* s, Int pos, Int n=-1) { if ((size_t) pos < s->length()) return s->substr(pos,n); return emptystring; } string erase(string s, Int pos, Int n) { if ((size_t) pos < s.length()) return s.erase(pos,n); return s; } string downcase(string s) { std::transform(s.begin(),s.end(),s.begin(),tolower); return s; } string upcase(string s) { std::transform(s.begin(),s.end(),s.begin(),toupper); return s; } // returns a string constructed by translating all occurrences of the string // from in an array of string pairs {from,to} to the string to in string s. string replace(string *S, stringarray2 *translate) { size_t size=checkArray(translate); for(size_t i=0; i < size; i++) { array *a=read(translate,i); checkArray(a); } size_t pos=0; ostringstream buf; size_t Len=S->length(); while(pos < Len) { for(size_t i=0; i < size;) { array *a=read(translate,i); size_t size2=checkArray(a); if(size2 != 2) error("translation table entry must be an array of length 2"); string* from=read(a,0); size_t len=from->length(); if(len == 0 || S->compare(pos,len,*from,0,len) != 0) {i++; continue;} buf << read(a,1); pos += len; if(pos == Len) return buf.str(); i=0; } buf << S->substr(pos,1); ++pos; } return buf.str(); } string format(string *format, Int x, string locale=emptystring) { ostringstream out; const char *p0=format->c_str(); checkformat(p0,true); const char *p=p0; const char *start=NULL; while(*p != 0) { char curr=*p; if(curr == '%') { p++; if(*p != '%') {start=p-1; break;} } out << *(p++); } if(!start) return out.str(); // Allow at most 1 argument while(*p != 0) { if(*p == '*' || *p == '$') return out.str(); if(isupper(*p) || islower(*p)) {p++; break;} p++; } string f=format->substr(start-p0,p-start); f.insert(p-start-1,"ll"); const char *oldlocale=NULL; if(!locale.empty()) { oldlocale=setlocale(LC_ALL,NULL); if(oldlocale) oldlocale=StrdupNoGC(oldlocale); setlocale(LC_ALL,locale.c_str()); } Int size=snprintf(NULL,0,f.c_str(),x)+1; if(size < 1) size=255; // Workaround for non-C99 compliant systems. char *buf=new char[size]; snprintf(buf,size,f.c_str(),x); out << string(buf); out << p; delete[] buf; if(oldlocale) { setlocale(LC_ALL,oldlocale); delete[] oldlocale; } return out.str(); } string format(string *format, bool forcemath=false, string separator, real x, string locale=emptystring) { if(*format == "%") return ""; // Temporary workaround for github Issue #29. bool tex=getSetting("tex") != "none"; bool texify=forcemath; ostringstream out; const char *p0=format->c_str(); checkformat(p0,false); const char *phantom="\\phantom{+}"; const char *p=p0; const char *start=NULL; char prev=0; while(*p != 0) { char curr=*p; if(tex && curr == '$' && prev != '\\') texify=true; prev=curr; if(curr == '%') { p++; if(*p != '%') {start=p-1; break;} } out << *(p++); } if(!start) return out.str(); // Allow at most 1 argument while(*p != 0) { if(*p == '*' || *p == '$') return out.str(); if(isupper(*p) || islower(*p)) {p++; break;} p++; } const char *tail=p; string f=format->substr(start-p0,tail-start); const char *oldlocale=NULL; if(!locale.empty()) { oldlocale=setlocale(LC_ALL,NULL); if(oldlocale) oldlocale=StrdupNoGC(oldlocale); setlocale(LC_ALL,locale.c_str()); } Int size=snprintf(NULL,0,f.c_str(),x)+1; if(size < 1) size=255; // Workaround for non-C99 compliant systems. char *buf=new char[size]; snprintf(buf,size,f.c_str(),x); bool trailingzero=f.find("#") < string::npos; bool plus=f.find("+") < string::npos; bool space=f.find(" ") < string::npos; char *q=buf; // beginning of formatted number if(*q == ' ' && texify) { out << phantom; q++; } const char decimal=*(localeconv()->decimal_point); // Remove any spurious sign if(*q == '-' || *q == '+') { p=q+1; bool zero=true; while(*p != 0) { if(!isdigit(*p) && *p != decimal) break; if(isdigit(*p) && *p != '0') {zero=false; break;} p++; } if(zero) { q++; if((plus || space) && texify) out << phantom; } } const char *r=p=q; bool dp=false; while(*r != 0 && (isspace(*r) || isdigit(*r) || *r == decimal \ || *r == '+' || *r == '-')) { if(*r == decimal) dp=true; r++; } if(dp) { // Remove trailing zeros and/or decimal point r--; unsigned n=0; while(r > q && *r == '0') {r--; n++;} if(*r == decimal) {r--; n++;} while(q <= r) out << *(q++); if(!trailingzero) q += n; } bool zero=(r == p && *r == '0') && !trailingzero; // Translate "E+/E-/e+/e-" exponential notation to TeX while(*q != 0) { if(texify && (*q == 'E' || *q == 'e') && (*(q+1) == '+' || *(q+1) == '-')) { if(!zero) out << separator << "10^{"; bool plus=(*(q+1) == '+'); q++; if(plus) q++; if(*q == '-') out << *(q++); while(*q == '0' && (zero || isdigit(*(q+1)))) q++; while(isdigit(*q)) out << *(q++); if(!zero) out << "}"; break; } out << *(q++); } while(*tail != 0) out << *(tail++); delete[] buf; if(oldlocale) { setlocale(LC_ALL,oldlocale); delete[] oldlocale; } return out.str(); } Int hex(string s) { istringstream is(s); is.setf(std::ios::hex,std::ios::basefield); Int value; if(is && is >> value && ((is >> std::ws).eof())) return value; ostringstream buf; buf << "invalid hexadecimal cast from string \"" << s << "\""; error(buf); } Int ascii(string s) { return s.empty() ? -1 : (unsigned char) s[0]; } string string(Int x) { ostringstream buf; buf << x; return buf.str(); } string string(real x, Int digits=DBL_DIG) { ostringstream buf; buf.precision(digits); buf << x; return buf.str(); } string time(string format=defaulttimeformat) { #ifdef HAVE_STRFTIME const time_t bintime=time(NULL); if(!strftime(Time,nTime,format.c_str(),localtime(&bintime))) return ""; return Time; #else return format; #endif } string time(Int seconds, string format=defaulttimeformat) { #ifdef HAVE_STRFTIME const time_t bintime=seconds; if(!strftime(Time,nTime,format.c_str(),localtime(&bintime))) return ""; return Time; #else // Avoid unused variable warning messages unused(&seconds); return format; #endif } Int seconds(string t=emptystring, string format=emptystring) { if (t == "") { auto clock = std::chrono::system_clock::now(); return static_cast( std::chrono::duration_cast( clock.time_since_epoch() ).count() ); } std::tm tmObj = {}; istringstream instream(t); instream.imbue(std::locale("")); instream >> std::get_time(&tmObj,format.c_str()); if(instream.fail()) { return -1; } return static_cast(std::mktime(&tmObj)); } asymptote-3.05/seconds.h0000644000000000000000000000443115031566105013777 0ustar rootroot#ifndef __seconds_h__ #define __seconds_h__ 1 #include #if !defined(_WIN32) #include #endif #ifdef _WIN32 #include #define getpid GetCurrentProcessId #endif namespace utils { #ifdef _WIN32 inline double cpuTime() { FILETIME a,b,c,d; return GetProcessTimes(GetCurrentProcess(),&a,&b,&c,&d) != 0 ? (double) (d.dwLowDateTime | ((unsigned long long)d.dwHighDateTime << 32))*100.0 : 0.0; } #else #include #include inline double cpuTime() { #ifdef CLOCK_PROCESS_CPUTIME_ID timespec t; clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&t); return 1.0e9*t.tv_sec+t.tv_nsec; #else struct rusage ru; if(getrusage(RUSAGE_SELF, &ru)) return 0; return 1.0e9*(ru.ru_utime.tv_sec+ru.ru_stime.tv_sec) +1.0e3*(ru.ru_utime.tv_usec+ru.ru_stime.tv_usec); #endif } #endif class stopWatch { std::chrono::time_point Start; public: void reset() { Start=std::chrono::steady_clock::now(); } stopWatch() { reset(); } double nanoseconds(bool reset=false) { auto Stop=std::chrono::steady_clock::now(); double ns=std::chrono::duration_cast (Stop-Start).count(); if(reset) Start=Stop; return ns; } double seconds(bool reset=false) { return 1.0e-9*nanoseconds(reset); } }; class cpuTimer { double start; std::chrono::time_point Start; public: void reset() { start=cpuTime(); Start=std::chrono::steady_clock::now(); } cpuTimer() { reset(); } double nanoseconds(bool reset=false) { auto Stop=std::chrono::steady_clock::now(); double stop=cpuTime(); double ns=std::chrono::duration_cast(Stop-Start).count(); double cputime=stop-start; if((cputime > 0 && cputime < ns) || ns == 0) ns=cputime; if(reset) { Start=Stop; start=stop; } return ns; } double seconds(bool reset=false) { return 1.0e-9*nanoseconds(reset); } }; } // POSIX--style rename that allows overwriting inline int renameOverwrite(const char *oldpath, const char *newpath) { #if defined(_WIN32) return !MoveFileExA( oldpath, newpath, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED); #else return rename(oldpath,newpath); #endif } #endif asymptote-3.05/fftw++.cc0000644000000000000000000000430115031566105013567 0ustar rootroot#include #include #include "fftw++.h" using namespace std; using namespace utils; namespace fftwpp { const double fftw::twopi=2.0*acos(-1.0); bool fftw::wiser=false; // User settings: size_t fftw::effort=FFTW_MEASURE; string wisdomName="wisdom3.txt"; ostringstream wisdomTemp; size_t fftw::maxthreads=1; char *epiphany=NULL; fftw_plan (*fftw::planner)(fftw *f, Complex *in, Complex *out)=Planner; const char *fftw::oddshift="Shift is not implemented for odd nx"; const char *inout= "constructor and call must be both in place or both out of place"; Mfft1d::Table Mfft1d::threadtable; Mrcfft1d::Table Mrcfft1d::threadtable; Mcrfft1d::Table Mcrfft1d::threadtable; static bool Wise=false; void loadWisdom() { if(!Wise) { wisdomTemp << wisdomName << "_" << getpid(); ifstream ifWisdom; ifWisdom.open(wisdomName); ostringstream wisdom; wisdom << ifWisdom.rdbuf(); ifWisdom.close(); const string& s=wisdom.str(); fftw_import_wisdom_from_string(s.c_str()); Wise=true; } } void recall() { if(epiphany) { fftw_import_wisdom_from_string(epiphany); fftw_free(epiphany); epiphany=NULL; } } void saveWisdom() { if(fftw::wiser) { fftw_forget_wisdom(); Wise=false; loadWisdom(); recall(); char *wisdom=fftw_export_wisdom_to_string(); ofstream ofWisdom; ofWisdom.open(wisdomTemp.str().c_str()); ofWisdom << wisdom; fftw_free(wisdom); ofWisdom.close(); renameOverwrite(wisdomTemp.str().c_str(),wisdomName.c_str()); fftw::wiser=false; } } fftw_plan Planner(fftw *F, Complex *in, Complex *out) { loadWisdom(); fftw::effort |= FFTW_WISDOM_ONLY; fftw_plan plan=F->Plan(in,out); fftw::effort &= ~FFTW_WISDOM_ONLY; if(!plan) { char *experience=fftw_export_wisdom_to_string(); fftw_forget_wisdom(); plan=F->Plan(in,out); recall(); epiphany=fftw_export_wisdom_to_string(); fftw_import_wisdom_from_string(experience); fftw_free(experience); static bool first=true; if(first) { atexit(saveWisdom); first=false; } fftw::wiser=true; } return plan; } ThreadBase::ThreadBase() {threads=fftw::maxthreads;} } namespace utils { size_t defaultmpithreads=1; } asymptote-3.05/coder.h0000644000000000000000000002752415031566105013445 0ustar rootroot/***** * coder.h * Andy Hammerlindl 2004/11/06 * * Handles encoding of syntax into programs. Its methods are called by * abstract syntax objects during translation to construct the virtual machine * code. *****/ #ifndef CODER_H #define CODER_H #include "errormsg.h" #include "entry.h" #include "types.h" #include "record.h" #include "frame.h" #include "program.h" #include "util.h" #include "modifier.h" #include "inst.h" namespace trans { using sym::symbol; using types::ty; using types::function; using types::record; using vm::bltin; using vm::inst; using vm::item; #ifdef DEBUG_BLTIN void assertBltinLookup(inst::opcode op, item it); #endif // Labels used by the coder class to denote where in the code a jump // instruction should go to. Label can be used before their exact location is // known. // Declared outside of the coder class, so that it can be declared in exp.h. struct label_t : public gc { vm::program::label location; vm::program::label firstUse; // Most labels are used only once, and so we optimize for that case. We do, // however, have to handle labels which are used multiple times (such as // break locations in a loop), and so a useVector is allocated to store // these if necessary. typedef mem::vector useVector; useVector *moreUses; // Only the constructor is defined. Everything else is handles by methods // of the coder class. label_t() : location(), firstUse(), moreUses(0) {} }; typedef label_t *label; class coder { // The frame of the function we are currently encoding. This keeps // track of local variables, and parameters with respect to the stack. frame *level; // The frame of the enclosing record that the "this" expression yields. ie. // the highest frame that is a record, not a function. frame *recordLevel; // The type of the enclosing record. Also needed for the "this" expression. record *recordType; // Are we translating a codelet? bool isCodelet; // The lambda being constructed. In some cases, this lambda is needed // before full translation of the function, so it is stored, // incomplete, here. vm::lambda *l; // The type of the function being translated. const function *funtype; // The enclosing environment. Null if this is a file-level module. coder *parent; // The mode of encoding, either static or dynamic. sord is used as an // acronym for Static OR Dynamic. // Once something is static, no amount of dynamic modifiers can change // that, so once a stack is EXPLICIT_STATIC, additional modifiers will // be pushed on as EXPLICIT_STATIC. modifier sord; std::stack sord_stack; // What permissions will be given to a new access. // TODO: Ensure private fields don't show up calling lookup for a // record. permission perm; // The function code as its being written. Code points to next place in // array to write. vm::program *program; // Some loops allocate nested frames, in case variables in an // iteration escape in a closure. This stack keeps track of where the // pushframe instructions are, so the size of the frame can be encoded. std::stack pushframeLabels; // Loops need to store labels to where break and continue statements // should pass control. Since loops can be nested, this needs to // be stored as a stack. We also store which of the loops are being encoded // with an additional frame for variables. This is needed to know if the // break and continue statements need to pop the frame. struct loopdata_t : gc { label continueLabel; label breakLabel; bool pushedFrame; loopdata_t(label c, label b) : continueLabel(c), breakLabel(b), pushedFrame(false) {} }; mem::stack loopdata; // Current File Position position curPos; public: // Define a new function coder. If reframe is true, this gives the function // its own frame, which is the usual (sensible) thing to do. It is set to // false for a line-at-a-time codelet, where variables should be allocated in // the lower frame. coder(position pos, string name, function *t, coder *parent, modifier sord = DEFAULT_DYNAMIC, bool reframe=true); // Start encoding the body of the record. The function being encoded // is the record's initializer. coder(position pos, record *t, coder *parent, modifier sord = DEFAULT_DYNAMIC); coder(position pos, string name, modifier sord = DEFAULT_DYNAMIC); coder(const coder&); /* Add a static or dynamic modifier. */ void pushModifier(modifier s) { /* Default setting should only be used in the constructor. */ assert(s != DEFAULT_STATIC && s != DEFAULT_DYNAMIC); /* Non-default static overrules. */ if (s == AUTOUNRAVEL || sord == AUTOUNRAVEL) { sord = AUTOUNRAVEL; } else if (s == EXPLICIT_STATIC || sord == EXPLICIT_STATIC) { sord = EXPLICIT_STATIC; } else { sord = s; } sord_stack.push(sord); } /* Tests if encoding mode is currently static. */ bool isStatic() { switch(sord) { case DEFAULT_STATIC: case EXPLICIT_STATIC: case AUTOUNRAVEL: return true; case DEFAULT_DYNAMIC: case EXPLICIT_DYNAMIC: return false; default: assert(False); return false; } } bool isAutoUnravel() { return sord == AUTOUNRAVEL; } /* Remove a modifier. */ void popModifier() { assert(!sord_stack.empty()); sord_stack.pop(); assert(!sord_stack.empty()); sord = sord_stack.top(); } /* Set/get/clear permissions. */ void setPermission(permission p) { perm = p; } permission getPermission() { return perm; } void clearPermission() { perm = DEFAULT_PERM; } // Says what the return type of the function is. ty *getReturnType() { return funtype->result; } bool isRecord(); // Creates a new coder to handle the translation of a new function. coder newFunction(position pos, string name, function *t, modifier sord=DEFAULT_DYNAMIC); // Creates a new record type. record *newRecord(symbol id); // Create a coder for the initializer of the record. coder newRecordInit(position pos, record *r, modifier sord=DEFAULT_DYNAMIC); // Create a coder for translating a small piece of code. Used for // line-at-a-time mode. coder newCodelet(position pos); frame *getFrame() { if (isStatic() && !isTopLevel()) { frame *result = parent->getFrame(); assert(result); return result; } else return level; } // Tests if the function or record with the given frame is currently under // translation (either by this coder or an ancestor). bool inTranslation(frame *f) { frame *level=this->level; while (level) { if (f==level) return true; level=level->getParent(); } return parent && parent->inTranslation(f); } // Allocates space in the function or record frame for a new local variable. access *allocLocal() { return getFrame()->allocLocal(); } // Get the access in the frame for a specified formal parameter. access *accessFormal(Int index) { // NOTE: This hasn't been extended to handle frames for loops, but is // currently only called when starting to translate a function, where there // can be no loops. return level->accessFormal(index); } // Checks if we are at the top level, which is true for a file-level module or // a codelet. bool isTopLevel() { return parent==0 || isCodelet; } // The encode functions add instructions and operands on to the code array. private: void encode(inst i) { i.pos = curPos; // Static code is put into the enclosing coder, unless we are translating a // codelet. if (isStatic() && !isTopLevel()) { assert(parent); parent->encode(i); } else { program->encode(i); } } // Encode a jump to a not yet known location. vm::program::label encodeEmptyJump(inst::opcode op); public: void encode(inst::opcode op) { inst i; i.op = op; i.pos = nullPos; encode(i); } void encode(inst::opcode op, item it) { #ifdef DEBUG_BLTIN assertBltinLookup(op, it); #endif inst i; i.op = op; i.pos = nullPos; i.ref = it; encode(i); } // Encodes a pop instruction, or merges the pop into the previous // instruction (ex. varsave+pop becomes varpop). void encodePop(); // Puts the requested frame on the stack. If the frame is not that of // this coder or its ancestors, false is returned. bool encode(frame *f); // Puts the frame corresponding to the expression "this" on the stack. bool encodeThis() { assert(recordLevel); return encode(recordLevel); } // Puts the frame corresponding to the parent of 'ent' on the stack. Triggers // an error if 'ent' does not correspond to a record (a.k.a. asy struct) type. bool encodeParent(position pos, trans::tyEntry *ent); // An access that encodes the frame corresponding to "this". access *thisLocation() { assert(recordLevel); return new frameAccess(recordLevel); } // Returns the type of the enclosing record. record *thisType() { return recordType; } // Puts the 'dest' frame on the stack, assuming the frame 'top' is on // top of the stack. If 'dest' is not an ancestor frame of 'top', // false is returned. bool encode(frame *dest, frame *top); // Assigns a handle to the current point in the list of bytecode // instructions and returns that handle. label defNewLabel(); // Sets the handle given by label to the current point in the list of // instructions. label defLabel(label label); // Encodes the address pointed to by the handle label into the // sequence of instructions. This is useful for a jump instruction to // jump to where a label was defined. void useLabel(inst::opcode op, label label); // If an address has to be used for a jump instruction before it is // actually encoded, a handle can be given to it by this function. // When that handle's label is later defined, the proper address will // be inserted into the code where the handle was used. label fwdLabel(); void pushLoop(label c, label b) { loopdata.push(loopdata_t(c,b)); } void popLoop() { loopdata.pop(); } void loopPushesFrame() { assert(!loopdata.empty()); loopdata_t& d = loopdata.top(); d.pushedFrame = true; } bool encodeBreak() { if (loopdata.empty()) return false; else { loopdata_t& d = loopdata.top(); if (d.pushedFrame) encode(inst::popframe); useLabel(inst::jmp,d.breakLabel); return true; } } bool encodeContinue() { if (loopdata.empty()) return false; else { loopdata_t& d = loopdata.top(); if (d.pushedFrame) encode(inst::popframe); useLabel(inst::jmp,d.continueLabel); return true; } } // Returns true if a pushclosure has been encoded since the definition of // the label. bool usesClosureSinceLabel(label l); // Turn a no-op into a jump to bypass incorrect code. void encodePatch(label from, label to); void encodePushFrame() { pushframeLabels.push(program->end()); encode(inst::pushframe, (Int)0); level = new frame("encodePushFrame", level, 0); } void encodePopFrame() { pushframeLabels.top()->ref = level->size(); pushframeLabels.pop(); encode(inst::popframe); level = level->getParent(); } // Adds an entry into the position list, linking the given point in the // source code to the current position in the virtual machine code. This is // used to print positions at runtime. void markPos(position pos); // When translation of the function is finished, this ties up loose ends // and returns the lambda. vm::lambda *close(); // Finishes translating the initializer of a record. void closeRecord(); private: // Non-copyable void operator=(const coder&); }; } // namespace trans #endif asymptote-3.05/symbolmaps.cc0000644000000000000000000006031115031566105014664 0ustar rootroot#include "common.h" #ifdef HAVE_LSP #include "symbolmaps.h" #include "locate.h" #include namespace AsymptoteLsp { [[nodiscard]] bool isVirtualFile(std::string const& filename) { bool isSettings=filename=="settings"; #ifdef HAVE_LIBGSL bool isGSL=filename=="gsl" and settings::getSetting("gsl"); #else bool isGSL=false; #endif return isSettings || isGSL; } std::string getPlainFile() { return std::string((std::string) settings::locateFile("plain", true).c_str()); } positions::positions(filePos const& positionInFile) { add(positionInFile); } void positions::add(const filePos &positionInFile) { auto fileLoc=pos.find(positionInFile.first); if (fileLoc == pos.end()) { pos.emplace(positionInFile.first, std::vector{positionInFile.second}); } else { fileLoc->second.push_back(positionInFile.second); } } ostream& operator <<(std::ostream& os, const SymbolMaps& sym) { os << "var decs:" << endl; for (auto const& s : sym.varDec) { auto const& key=std::get<0>(s); auto const& value=std::get<1>(s); os << key << " " << value.pos.first << ":" << value.pos.second << endl; } return os; } optional SymbolMaps::searchSymbol(posInFile const& inputPos) { // FIXME: can be optimized by binary search. for (auto const& s : usageByLines) { auto const& pos=std::get<0>(s); auto const& syLit=std::get<1>(s); size_t endCharacter = pos.second + syLit.name.length() - 1; bool posMatches = pos.first == inputPos.first and pos.second <= inputPos.second and inputPos.second <= endCharacter; bool isOperator = syLit.name.find("operator ") == 0; if (posMatches and !isOperator) { posInFile endPos(pos.first, endCharacter + 1); return make_optional(std::make_tuple(syLit, pos, endPos)); } } return nullopt; } FunctionInfo& SymbolMaps::addFunDef( std::string const& funcName, posInFile const& position, std::string const& returnType) { auto fit=std::get<0>(funDec.emplace(std::piecewise_construct, std::forward_as_tuple(funcName), std::forward_as_tuple())); fit->second.emplace_back(funcName, position, returnType); return fit->second.back(); } std::pair, SymbolContext*> SymbolContext::searchSymbol(posInFile const& inputPos) { auto currCtxSym = symMap.searchSymbol(inputPos); if (currCtxSym.has_value()) { return make_pair(currCtxSym, this); } // else, not found in currCtx; for (auto& subContext : subContexts) { if (!posLt(inputPos, subContext->contextLoc)) { auto v=subContext->searchSymbol(inputPos); auto subCtxSym=std::get<0>(v);; auto ctx=std::get<1>(v); if (subCtxSym.has_value()) { return make_pair(subCtxSym, ctx); } } } return make_pair(nullopt, nullptr); } SymbolInfo const* SymbolContext::searchVarRaw(std::string const& symbol) const { // local variable declarations auto pt = symMap.varDec.find(symbol); if (pt != symMap.varDec.end()) { return &pt->second; } // otherwise, search parent. return parent != nullptr ? parent->searchVarRaw(symbol) : nullptr; } optional SymbolContext::searchVarDecl( std::string const& symbol, optional const& position) { auto pt = symMap.varDec.find(symbol); if (pt != symMap.varDec.end()) { auto line = std::get<0>(pt->second.pos); auto ch = std::get<1>(pt->second.pos); if ((not position.has_value()) or (!posLt(position.value(), pt->second.pos))) { return std::make_tuple(getFileName().value_or(""), pt->second.pos, std::make_pair(line, ch + symbol.length())); } } auto ptFn = symMap.funDec.find(symbol); if (ptFn != symMap.funDec.end() and !ptFn->second.empty()) { // FIXME: Right now, we have no way of knowing the exact position of the // start of where the function name is. As an example, we do not know // where the exact position of // real testFunction(...) { ... // ^ auto ptValue = ptFn->second[0]; if ((not position.has_value()) or (!posLt(position.value(), ptValue.pos))) { return std::make_tuple(getFileName().value_or(""), ptValue.pos, ptValue.pos); } } // otherwise, search parent. return parent != nullptr ? parent->searchVarDecl(symbol, position) : nullopt; } void SymbolContext::addPlainFile() { std::string plainFile = getPlainFile(); addEmptyExtRef(plainFile); } SymbolContext::SymbolContext(posInFile loc): fileLoc(nullopt), contextLoc(std::move(loc)), parent(nullptr) { addPlainFile(); } SymbolContext::SymbolContext(posInFile loc, std::string filename): fileLoc(std::move(filename)), contextLoc(std::move(loc)), parent(nullptr) { addPlainFile(); } optional SymbolContext::searchVarDeclFull(std::string const& symbol, optional const& position) { std::unordered_set searched; std::unordered_set symbolSearch { symbol }; auto returnVal = _searchVarFull( searched, symbolSearch, [&position](SymbolContext* ctx, std::string const& sym) { return ctx->searchVarDecl(sym, position); }, [](SymbolContext* ctx, std::string const& sym) { return ctx->searchVarDecl(sym); }, fnFromDeclCreateTrav); if (returnVal.has_value()) { return returnVal; } return _searchVarFull( symbol, [](SymbolContext* ctx, std::string const& sym) -> optional { for (auto const& unravelVal : ctx->extRefs.unraveledVals) { if (auto* pctx=ctx->searchStructCtxFull(unravelVal)) { auto retVal = pctx->searchVarDecl(sym); if (retVal.has_value()) { return retVal; } } } return nullopt; }); } std::list SymbolContext::getEmptyRefs() { std::list finalList; for (auto it = extRefs.extFileRefs.begin(); it != extRefs.extFileRefs.end(); it++) { if (it->second == nullptr) { // cerr << it->first << endl; finalList.emplace_back(it); } } for (auto& ctx : subContexts) { finalList.splice(finalList.end(), ctx->getEmptyRefs()); } return finalList; } optional SymbolContext::getFileName() const { if (fileLoc.has_value()) { return fileLoc; } else { return parent == nullptr ? fileLoc : parent->getFileName(); } } optional SymbolContext::searchVarSignatureFull(std::string const& symbol) { std::unordered_set searched; auto retVal = _searchVarFull( symbol, [](SymbolContext const* ctx, std::string const& sym) -> optional { if (auto const* info = ctx->searchVarRaw(sym)) { return info->signature(); } return nullopt; }, fnFromDeclCreateTrav); if (retVal.has_value()) { return retVal; } // else, // search every unravel values possible (not only here, but also in every includes + unravels as well). // If an unravel value match a struct, then see if symbol matches the struct. If yes, return otherwise skip. return _searchVarFull( symbol, [](SymbolContext* ctx, std::string const& sym) -> optional { if (SymbolInfo* info=ctx->searchVarUnravelStructRaw(sym)) { return info->signature(); } return nullopt; }); } SymbolInfo* SymbolContext::searchVarUnravelStructRaw(std::string const& symbol) { return searchVarUnravelStructRaw(symbol, nullopt); } SymbolInfo* SymbolContext::searchVarUnravelStructRaw(std::string const& symbol, optional const& position) { for (auto const& unravelVal : extRefs.unraveledVals) { if (auto* ctx=searchStructCtxFull(unravelVal)) { // ctx points to a struct. auto it=ctx->symMap.varDec.find(symbol); if (it != ctx->symMap.varDec.end()) { if (((not position.has_value()) or (!posLt(position.value(), it->second.pos)))) { return &it->second; } } } } return parent != nullptr ? parent->searchVarUnravelStructRaw(symbol) : nullptr; } std::list SymbolContext::searchFuncUnravelStruct(std::string const& symbol) { std::list finalList; for (auto const& unravelVal : extRefs.unraveledVals) { if (auto* ctx=searchStructCtxFull(unravelVal)) { // ctx points to a struct. auto it=ctx->symMap.funDec.find(symbol); if (it != ctx->symMap.funDec.end() and not it->second.empty()) { std::transform( it->second.begin(), it->second.end(), std::back_inserter(finalList), [](FunctionInfo const& fnInfo) { return fnInfo.signature(); }); } } } if (parent != nullptr) { finalList.splice(finalList.end(), parent->searchFuncUnravelStruct(symbol)); } return finalList; } std::list SymbolContext::searchFuncSignature(std::string const& symbol) { std::list funcSigs; auto pt = symMap.funDec.find(symbol); if (pt != symMap.funDec.end()) { std::transform(pt->second.begin(), pt->second.end(), std::back_inserter(funcSigs), [](FunctionInfo const& fnInfo) { return fnInfo.signature(); }); } if (parent != nullptr) { funcSigs.splice(funcSigs.end(), parent->searchFuncSignature(symbol)); } return funcSigs; } std::list SymbolContext::searchFuncSignatureFull(std::string const& symbol) { auto base_list = _searchAllVarFull( symbol, std::mem_fn(&SymbolContext::searchFuncSignature), fnFromDeclCreateTrav); base_list.splice(base_list.end(), _searchAllVarFull( symbol, std::mem_fn(&SymbolContext::searchFuncUnravelStruct))); return base_list; } optional SymbolContext::searchStructContext(std::string const& tyVal) const { auto stCtx = symMap.typeDecs.find(tyVal); if (stCtx != symMap.typeDecs.end()) { if (auto* stDec = dynamic_cast(stCtx->second.get())) { return make_optional(stDec->ctx); } } return parent != nullptr ? parent->searchStructContext(tyVal) : nullopt; }; optional SymbolContext::searchLitSignature(SymbolLit const& symbol) { if (symbol.scopes.empty()) { return searchVarSignatureFull(symbol.name); } else { auto ctx=std::get<0>(searchLitContext(symbol)); auto isStruct=std::get<1>(searchLitContext(symbol)); if (ctx) { if (isStruct) { // ctx is a struct declaration. should not search beyond this struct. auto varDec=ctx->symMap.varDec.find(symbol.name); return varDec != ctx->symMap.varDec.end() ? optional(varDec->second.signature()) : nullopt; } else { return ctx->searchVarSignatureFull(symbol.name); } } } return nullopt; } std::list SymbolContext::searchLitFuncSignature(SymbolLit const& symbol) { std::list signatures; if (symbol.scopes.empty()) { signatures.splice(signatures.end(), searchFuncSignatureFull(symbol.name)); } else { auto ctx=std::get<0>(searchLitContext(symbol)); auto isStruct=std::get<1>(searchLitContext(symbol)); if (ctx) { if (isStruct) { // ctx is a struct declaration. should not search beyond this struct. auto fnDecs=ctx->symMap.funDec.find(symbol.name); if (fnDecs != ctx->symMap.funDec.end()) { std::transform( fnDecs->second.begin(), fnDecs->second.end(), std::back_inserter(signatures), [&scopes=symbol.scopes](FunctionInfo const& fnInf) { return fnInf.signature(scopes); }); } } else { signatures.splice(signatures.end(), searchFuncSignatureFull(symbol.name)); } } } return signatures; } optional SymbolContext::searchLitPosition( SymbolLit const& symbol, optional const& position) { if (symbol.scopes.empty()) { return searchVarDeclFull(symbol.name, position); } else { auto ctx=std::get<0>(searchLitContext(symbol)); auto isStruct=std::get<1>(searchLitContext(symbol)); if (ctx) // ctx is a struct declaration. should not search beyond this struct. { if (isStruct) { auto varDec=ctx->symMap.varDec.find(symbol.name); if (varDec != ctx->symMap.varDec.end()) { auto line=std::get<0>(varDec->second.pos); auto ch=std::get<1>(varDec->second.pos); return std::make_tuple(ctx->getFileName().value_or(""), varDec->second.pos, std::make_pair(line, ch + symbol.name.length())); } } else { return searchVarDeclFull(symbol.name, position); } } return nullopt; } } std::list SymbolContext::searchLitFuncPositions(SymbolLit const& symbol, optional const& position) { if (symbol.scopes.empty()) { return searchFuncDeclsFull(symbol.name, position); } else { std::list fnDecls; auto v=searchLitContext(symbol); auto ctx=std::get<0>(v); auto isStruct=std::get<1>(v); if (ctx) // ctx is a struct declaration. should not search beyond this struct. { if (isStruct) { auto fnDec=ctx->symMap.funDec.find(symbol.name); if (fnDec != ctx->symMap.funDec.end()) { for (auto const& ptValue : fnDec->second) { fnDecls.emplace_back(getFileName().value_or(""), ptValue.pos, ptValue.pos); } } } else { return searchFuncDeclsFull(symbol.name, position); } } return fnDecls; } } SymbolContext* SymbolContext::searchStructCtxFull(std::string const& symbol) { std::unordered_set searched; optional tyInfo=_searchVarFull( symbol, [](SymbolContext const* ctx, std::string const& sym) -> optional { if (auto const* info = ctx->searchVarRaw(sym)) { return info->type; } return nullopt; }, fnFromDeclCreateTrav); if (not tyInfo.has_value()) { return nullptr; } return _searchVarFull( tyInfo.value(), std::mem_fn(&SymbolContext::searchStructContext)).value_or(nullptr); } optional SymbolContext::searchAccessDecls(std::string const& accessVal) { // fileIdPair includes accessVals auto src=extRefs.fileIdPair.find(accessVal); if (src != extRefs.fileIdPair.end()) { std::string& fileSrc=src->second; auto ctxMap=extRefs.extFileRefs.find(fileSrc); if (ctxMap != extRefs.extFileRefs.end() && ctxMap->second != nullptr) { return ctxMap->second; } } return parent != nullptr ? parent->searchAccessDecls(accessVal) : nullopt; } /** * Fully search context for source structs or source file in access * @param symbol Symbol to search * @return pair of [context, isStruct], where isStruct is true * if the context is a struct, and false if the context is a file from access declaration. * If context is nullptr, isStruct's return does not have defined behavior. */ std::pair SymbolContext::searchLitContext(SymbolLit const& symbol) { if (symbol.scopes.empty()) { // if the symbol is empty, then we can access every variable, not just those in the struct context // and hence should be treated as "not a struct", even if the variable is accessed in the struct. // for example, // int z; struct St { int x; int y=x+z; } // here, x and z can be accessed in the struct context. return std::make_pair(this, false); } else { std::vector scopes(symbol.scopes); bool isStruct=false; // search in struct auto* ctx=searchStructCtxFull(scopes.back()); if (ctx) { isStruct = true; scopes.pop_back(); } else { // search in access declarations ctx =_searchVarFull( scopes.back(), std::mem_fn(&SymbolContext::searchAccessDecls)).value_or(nullptr); if (ctx) { scopes.pop_back(); } } for (auto it = scopes.rbegin(); it != scopes.rend() and ctx != nullptr; it++) { // FIXME: Impelemnt scope searching // example: // varx.vary.varz => go into varx's type context (struct or external file), repeat. // struct and extfile handled very differently // get next variable declaration loc. // assumes struct, hence we do not search entire workspace SymbolContext* newCtx=nullptr; auto locVarDec = ctx->symMap.varDec.find(*it); if (locVarDec != ctx->symMap.varDec.end() and locVarDec->second.type.has_value()) { newCtx = ctx->_searchVarFull( locVarDec->second.type.value(), std::mem_fn(&SymbolContext::searchStructContext) ).value_or(nullptr); } // here, we searched for a struct context and did not find anything. // If we are in a struct context, we hit a dead end. // otherwise, we search for access declaration contexts. if (newCtx == nullptr) { if (isStruct) { return make_pair(nullptr, false); } else { ctx =_searchVarFull( *it, std::mem_fn(&SymbolContext::searchAccessDecls)).value_or(nullptr); } } else { isStruct = true; } ctx = newCtx; } return make_pair(ctx, isStruct); } } std::unordered_set SymbolContext::createTraverseSet() { std::unordered_set traverseSet(extRefs.includeVals); traverseSet.emplace(getPlainFile()); for (auto const& unravelVal : extRefs.unraveledVals) { auto it = extRefs.fileIdPair.find(unravelVal); if (it != extRefs.fileIdPair.end()) { traverseSet.emplace(it->second); } } return traverseSet; } SymbolContext* SymbolContext::getExternalRef(std::string const& symbol) { auto symRef = extRefs.extFileRefs.find(symbol); if (symRef != extRefs.extFileRefs.end()) { return symRef->second; } return parent != nullptr ? parent->getExternalRef(symbol) : nullptr; } std::list SymbolContext::searchFuncDecls(std::string const& symbol) { return searchFuncDecls(symbol, nullopt); } std::list SymbolContext::searchFuncDecls(std::string const& symbol, optional const& position) { std::list funcDecls; auto pt = symMap.funDec.find(symbol); if (pt != symMap.funDec.end()) { for (auto const& fnInfo : pt->second) { if ((not position.has_value()) or (!posLt(position.value(), fnInfo.pos))) { funcDecls.emplace_back(getFileName().value_or(""), fnInfo.pos, fnInfo.pos); } } } if (parent != nullptr) { funcDecls.splice(funcDecls.end(), parent->searchFuncDecls(symbol, position)); } return funcDecls; } std::list SymbolContext::searchFuncDeclsFull(std::string const& symbol, optional const& position) { std::unordered_set searched; auto retVal = _searchAllVarFull( searched, std::unordered_set { symbol }, [&position](SymbolContext* ctx, std::string const& symbol) { return ctx->searchFuncDecls(symbol, position); }, [](SymbolContext* ctx, std::string const& symbol) { return ctx->searchFuncDecls(symbol); }, fnFromDeclCreateTrav); auto retValStruct =_searchAllVarFull( symbol, [](SymbolContext* ctx, std::string const& sym) -> std::list { std::list finalList; for (auto const& unravelVal : ctx->extRefs.unraveledVals) { if (auto* pctx=ctx->searchStructCtxFull(unravelVal)) { finalList.splice(finalList.end(), pctx->searchFuncDecls(sym)); } } return finalList; }); retVal.splice(retVal.end(), std::move(retValStruct)); return retVal; } optional AddDeclContexts::searchVarDecl( std::string const& symbol, optional const& position) { auto pt = additionalDecs.find(symbol); if (pt != additionalDecs.end()) { auto line=std::get<0>(pt->second.pos); auto ch=std::get<1>(pt->second.pos); if ((not position.has_value()) or (!posLt(position.value(), pt->second.pos))) { return std::make_tuple(getFileName().value_or(""), pt->second.pos, std::make_pair(line, ch + symbol.length())); } } return SymbolContext::searchVarDecl(symbol, position); } SymbolInfo const* AddDeclContexts::searchVarRaw(std::string const& symbol) const { auto pt = additionalDecs.find(symbol); return pt != additionalDecs.end() ? &pt->second : SymbolContext::searchVarRaw(symbol); } bool SymbolInfo::operator==(SymbolInfo const& sym) const { return name==sym.name and type==sym.type and pos == sym.pos; } std::string SymbolInfo::signature() const { return type.value_or("") + " " + name + ";"; } std::string FunctionInfo::signature() const { return signature(std::vector()); } std::string FunctionInfo::signature(std::vector const& scopes) const { std::stringstream ss; ss << returnType << " "; for (auto it=scopes.crbegin(); it!=scopes.crend(); it++) { ss << *it << "."; } ss << name << "("; for (auto it = arguments.begin(); it != arguments.end(); it++) { auto const& argtype=std::get<0>(*it); auto const& argname=std::get<1>(*it); ss << argtype; if (argname.has_value()) { ss << " " << argname.value(); } if (std::next(it) != arguments.end()) { ss << ","; } if (std::next(it) != arguments.end() or restArgs.has_value()) { ss << " "; } } if (restArgs.has_value()) { auto const& v=restArgs.value(); auto const& argtype=std::get<0>(v); auto const& argname=std::get<1>(v); ss << "... " << argtype; if (argname.has_value()) { ss << " " << argname.value(); } } ss << ");"; return ss.str(); } } #endif asymptote-3.05/virtualfieldaccess.cc0000644000000000000000000000160515031566105016353 0ustar rootroot/***** * virtualfieldaccess.cc * Andy Hammerlindl 2009/07/23 * * Implements the access subclass used to read and write virtual fields. *****/ #include "virtualfieldaccess.h" #include "coder.h" namespace trans { void virtualFieldAccess::encode(action act, position pos, coder &e) { switch(act) { case CALL: if (caller) { caller->encode(CALL, pos, e); } else { this->encode(READ, pos, e); e.encode(inst::popcall); } return; case READ: assert(getter); getter->encode(CALL, pos, e); return; case WRITE: if (setter) setter->encode(CALL, pos, e); else { em.error(pos); em << "virtual field is read-only"; } return; } } void virtualFieldAccess::encode(action act, position pos, coder &e, frame *) { e.encode(inst::pop); encode(act, pos, e); } } // namespace trans asymptote-3.05/flatguide.h0000644000000000000000000001016115031566105014302 0ustar rootroot/***** * flatguide.h * Andy Hammerlindl 2005/02/23 * * The data structure that builds up a knotlist. This is done by calling in * order the methods to set knots, specifiers, and tensions. * Used by the guide solving routines. * * NOTE: figure out how nullpath{}..a should be handled. *****/ #ifndef FLATGUIDE_H #define FLATGUIDE_H #include "knot.h" #include "guideflags.h" namespace camp { class flatguide { // A cached solution of the path. When traversing through a tree of guides, // if a cycle tag is encountered, then the path is solved up to that point. // If the guide continues from there (which rarely occurs in practice), all of // the control points solved are added as control specifiers, and then solved // into a path again. In the (usual) case that a cycle ends a path, the // cached path avoids this second pass. bool solved; // Used by reverse(guide) to indicate the presence of an unresolved // interior cycle. bool precycle; path p; cvector nodes; // Information before the first knot. For a non-cyclic guide, this is // ignored. For a cyclic guide, it may be useful, but I can't determine a // sensible way to use it yet. tension tout; spec *out; // Information for the next knot to come. tension tin; spec *in; static spec open; tension& tref(side s) { switch (s) { case OUT: return nodes.empty() ? tout : nodes.back().tout; case IN: default: return tin; } } // Returns a reference to a spec* so that it may be assigned. spec*& sref(side s) { switch (s) { case OUT: return nodes.empty() ? out : nodes.back().out; case IN: default: return in; } } void addPre(path& p, Int j); void addPoint(path& p, Int j); void addPost(path& p, Int j); void clearNodes() { nodes.clear(); in=&open; tin=tension(); } void clearPath() { p=path(); solved=false; } void uncheckedAdd(path p, bool allowsolve=true); // Sets solved to false, indicating that the path has been updated since last // being solved. Also, copies a solved path back in as knots and control // specifiers, as it will have to be solved again. void update() { if (solved) { solved=false; clearNodes(); add(p); clearPath(); } } public: flatguide() : solved(true), precycle(false), p(), out(&open), in(&open) {} Int size() const { return (Int) nodes.size(); } knot Nodes(Int i) const { return nodes[i]; } void setTension(tension t, side s) { update(); tref(s)=t; } void setSpec(spec *p, side s) { assert(p); update(); spec *&ref=sref(s); // Control specifiers trump normal direction specifiers. if (!ref || !ref->controlled() || p->controlled()) ref=p; } void add(pair z) { update(); // Push the pair onto the vector as a knot, using the current in-specifier // and in-tension for the in side for the knot. Use default values for the // out side, as those will be set after the point is added. nodes.push_back(knot(z,in,&open,tin,tension())); // Reset the in-spec and in-tension to defaults; tin=tension(); in=&open; } // Reverts to an empty state. void add(path p, bool allowsolve=true) { update(); uncheckedAdd(p,allowsolve); } void clear() { clearNodes(); clearPath(); } void close() { if(!nodes.empty()) { nodes.front().in=in; nodes.front().tin=tin; } } void resolvecycle() { if(!nodes.empty()) nodes.push_back(nodes.front()); } void precyclic(bool b) { precycle=b; } bool precyclic() { return precycle; } // Once all information has been added, release the flat result. simpleknotlist list(bool cycles=false) { if(cycles && !nodes.empty()) close(); return simpleknotlist(nodes,cycles); } // Yield a path from the guide as represented here. path solve(bool cycles=false) { if (solved) return p; else { simpleknotlist l=list(cycles); p=camp::solve(l); solved=true; return p; } } }; } // namespace camp #endif // FLATGUIDE_H asymptote-3.05/knot.cc0000644000000000000000000005351115031566105013455 0ustar rootroot/***** * knot.cc * Andy Hammerlindl 2005/02/10 * * Describes a knot, a point and its neighbouring specifiers, used as an * intermediate structure in solving paths. *****/ #include "knot.h" #include "util.h" #include "angle.h" #include "settings.h" namespace camp { /***** Debugging *****/ //bool tracing_solving=false; template ostream& info(ostream& o, const char *name, cvector& v) { if (settings::verbose > 3) { o << name << ":\n\n"; for(Int i=0; i < (Int) v.size(); ++i) o << v[i] << endl; o << endl; } return o; } ostream& info(ostream& o, string name, knotlist& l) { if (settings::verbose > 3) { o << name << ":\n\n"; for(Int i=0; i < (Int) l.size(); ++i) o << l[i] << endl; if (l.cyclic()) o << "cyclic" << endl; o << endl; } return o; } #define INFO(x) info(cerr,#x,x) /***** Auxillary computation functions *****/ // Computes the relative distance of a control point given the angles. // The name is somewhat misleading as the velocity (with respect to the // variable that parameterizes the path) is relative to the distance // between the knots and even then, is actually three times this. // The routine is based on the velocity function in Section 131 of the MetaPost // code, but differs in that it automatically accounts for the tension and // bounding with tension atleast. double velocity(double theta, double phi, tension t) { static const double VELOCITY_BOUND = 4.0; static const double a = sqrt(2.0); static const double b = 1.0/16.0; static const double c = 1.5*(sqrt(5.0)-1.0); static const double d = 1.5*(3.0-sqrt(5.0)); double st = sin(theta), ct = cos(theta), sf = sin(phi), cf = cos(phi); double denom = t.val * (3.0 + c*ct + d*cf); double r = denom != 0.0 ? (2.0 + a*(st - b*sf)*(sf - b*st)*(ct-cf)) / denom : VELOCITY_BOUND; //cerr << " velocity(" << theta << "," << phi <<")= " << r << endl; if (r > VELOCITY_BOUND) r = VELOCITY_BOUND; // Apply boundedness condition for tension atleast cases. if (t.atleast) { double sine = sin(theta + phi); if ((st >= 0.0 && sf >= 0.0 && sine > 0.0) || (st <= 0.0 && sf <= 0.0 && sine < 0.0)) { double rmax = sf / sine; if (r > rmax) r = rmax; } } return r; } double niceAngle(pair z) { return z.gety() == 0 ? z.getx() >= 0 ? 0 : PI : angle(z); } // Ensures an angle is in the range between -PI and PI. double reduceAngle(double angle) { return angle > PI ? angle - 2.0*PI : angle < -PI ? angle + 2.0*PI : angle; } bool interesting(tension t) { return t.val!=1.0 || t.atleast==true; } bool interesting(spec *s) { return !s->open(); } ostream& operator<<(ostream& out, const knot& k) { if (interesting(k.tin)) out << k.tin << " "; if (interesting(k.in)) out << *k.in << " "; out << k.z; if (interesting(k.out)) out << " " << *k.out; if (interesting(k.tout)) out << " " << k.tout; return out; } eqn dirSpec::eqnOut(Int j, knotlist& l, cvector&, cvector&) { // When choosing the control points, the path will come out the first knot // going straight to the next knot rotated by the angle theta. // Therefore, the angle theta we want is the difference between the // specified heading given and the heading to the next knot. double theta=reduceAngle(given-niceAngle(l[j+1].z-l[j].z)); // Give a simple linear equation to ensure this theta is picked. return eqn(0.0,1.0,0.0,theta); } eqn dirSpec::eqnIn(Int j, knotlist& l, cvector&, cvector&) { double theta=reduceAngle(given-niceAngle(l[j].z-l[j-1].z)); return eqn(0.0,1.0,0.0,theta); } eqn curlSpec::eqnOut(Int j, knotlist& l, cvector&, cvector& psi) { double alpha=l[j].alpha(); double beta=l[j+1].beta(); double chi=alpha*alpha*gamma/(beta*beta); double C=alpha*chi+3-beta; double D=(3.0-alpha)*chi+beta; return eqn(0.0,C,D,-D*psi[j+1]); } eqn curlSpec::eqnIn(Int j, knotlist& l, cvector&, cvector&) { double alpha=l[j-1].alpha(); double beta=l[j].beta(); double chi=beta*beta*gamma/(alpha*alpha); double A=(3-beta)*chi+alpha; double B=beta*chi+3-alpha; return eqn(A,B,0.0,0.0); } spec *controlSpec::outPartner(pair z) { static curlSpec curl; return cz==z ? (spec *)&curl : (spec *)new dirSpec(z-cz); } spec *controlSpec::inPartner(pair z) { static curlSpec curl; return cz==z ? (spec *)&curl : (spec *)new dirSpec(cz-z); } // Compute the displacement between points. The j-th result is the distance // between knot j and knot j+1. struct dzprop : public knotprop { dzprop(knotlist& l) : knotprop(l) {} pair solo(Int) { return pair(0,0); } pair start(Int j) { return l[j+1].z - l[j].z; } pair mid(Int j) { return l[j+1].z - l[j].z; } pair end(Int) { return pair(0,0); } }; // Compute the distance between points, using the already computed dz. This // doesn't use the infomation in the knots, but the knotprop class is useful as // it takes care of the iteration for us. struct dprop : public knotprop { cvector& dz; dprop(knotlist &l, cvector& dz) : knotprop(l), dz(dz) {} double solo(Int j) { return length(dz[j]); } double start(Int j) { return length(dz[j]); } double mid(Int j) { return length(dz[j]); } double end(Int j) { return length(dz[j]); } }; // Compute the turning angles (psi) between points, using the already computed // dz. struct psiprop : public knotprop { cvector& dz; psiprop(knotlist &l, cvector& dz) : knotprop(l), dz(dz) {} double solo(Int) { return 0; } // We set the starting and ending psi to zero. double start(Int) { return 0; } double end(Int) { return 0; } double mid(Int j) { return niceAngle(dz[j]/dz[j-1]); } }; struct eqnprop : public knotprop { cvector& d; cvector& psi; eqnprop(knotlist &l, cvector& d, cvector& psi) : knotprop(l), d(d), psi(psi) {} eqn solo(Int) { assert(False); return eqn(0.0,1.0,0.0,0.0); } eqn start(Int j) { // Defer to the specifier, as it knows the specifics. return dynamic_cast(l[j].out)->eqnOut(j,l,d,psi); } eqn end(Int j) { return dynamic_cast(l[j].in)->eqnIn(j,l,d,psi); } eqn mid(Int j) { double lastAlpha = l[j-1].alpha(); double thisAlpha = l[j].alpha(); double thisBeta = l[j].beta(); double nextBeta = l[j+1].beta(); // Values based on the linear approximation of the curvature coming // into the knot with respect to theta[j-1] and theta[j]. double inFactor = 1.0/(thisBeta*thisBeta*d[j-1]); double A = lastAlpha*inFactor; double B = (3.0 - lastAlpha)*inFactor; // Values based on the linear approximation of the curvature going out of // the knot with respect to theta[j] and theta[j+1]. double outFactor = 1.0/(thisAlpha*thisAlpha*d[j]); double C = (3.0 - nextBeta)*outFactor; double D = nextBeta*outFactor; return eqn(A,B+C,D,-B*psi[j]-D*psi[j+1]); } }; // If the system of equations is homogeneous (ie. we are solving for x in // Ax=0), there is no need to solve for theta; we can just use zeros for the // thetas. In fact, our general solving method may not work in this case. // A common example of this is // // a{curl 1}..{curl 1}b // // which arises when solving a one-length path a..b or in a larger path a // section a--b. bool homogeneous(cvector& e) { for(cvector::iterator p=e.begin(); p!=e.end(); ++p) if (p->aug != 0) return false; return true; } // Checks whether the equation being solved will be solved as a straight // path from the first point to the second. bool straightSection(cvector& e) { return e.size()==2 && e.front().aug==0 && e.back().aug==0; } struct weqn : public eqn { double w; weqn(double pre, double piv, double post, double aug, double w=0) : eqn(pre,piv,post,aug), w(w) {} friend ostream& operator<< (ostream& out, const weqn we) { return out << (eqn &)we << " + " << we.w << " * theta[0]"; } }; weqn scale(weqn q) { assert(q.pre == 0 && q.piv != 0); return weqn(0,1,q.post/q.piv,q.aug/q.piv,q.w/q.piv); } /* Recalculate the equations in the form: * theta[j] + post * theta[j+1] = aug + w * theta[0] * * Used as the first step in solve cyclic equations. */ cvector recalc(cvector& e) { Int n=(Int) e.size(); cvector we; weqn lasteqn(0,1,0,0,1); we.push_back(lasteqn); // As a placeholder. for (Int j=1; j < n; j++) { // Subtract a factor of the last equation so that the first entry is // zero, then procede to scale it. eqn& q=e[j]; lasteqn=scale(weqn(0,q.piv-q.pre*lasteqn.post,q.post, q.aug-q.pre*lasteqn.aug,-q.pre*lasteqn.w)); we.push_back(lasteqn); } // To keep all of the infomation enocoded in the linear equations, we need // to augment the computation to replace our trivial start weqn with a // real one. To do this, we take one more step in the iteration and // compute the weqn for j=n, since n=0 (mod n). { eqn& q=e[0]; we.front()=scale(weqn(0,q.piv-q.pre*lasteqn.post,q.post, q.aug-q.pre*lasteqn.aug,-q.pre*lasteqn.w)); } return we; } double solveForTheta0(cvector& we) { // Solve for theta[0]=theta[n]. // How we do this is essentially to write out the first equation as: // // theta[n] = aug[0] + w[0]*theta[0] - post[0]*theta[1] // // and then use the next equation to substitute in for theta[1]: // // theta[1] = aug[1] + w[1]*theta[0] - post[1]*theta[2] // // and so on until we have an equation just in terms of theta[0] and // theta[n] (which are the same theta). // // The loop invariant maintained is that after j iterations, we have // theta[n]= a + b*theta[0] + c*theta[j] Int n=(Int) we.size(); double a=0,b=0,c=1; for (Int j=0;j backsubCyclic(cvector& we, double theta0) { Int n=(Int) we.size(); cvector thetas; double lastTheta=theta0; for (Int j=1;j<=n;++j) { weqn& q=we[n-j]; assert(q.pre == 0 && q.piv == 1); double theta=-q.post*lastTheta+q.aug+q.w*theta0; thetas.push_back(theta); lastTheta=theta; } reverse(thetas.begin(),thetas.end()); return thetas; } // For the non-cyclic equations, do row operation to put the matrix into // reduced echelon form, ie. calculates equivalent equations but with pre=0 and // piv=1 for each eqn. struct ref : public knotprop { cvector& e; eqn lasteqn; ref(knotlist& l, cvector& e) : knotprop(l), e(e), lasteqn(0,1,0,0) {} // Scale the equation so that the pivot (diagonal) entry is one, and save // the new equation as lasteqn. eqn scale(eqn q) { assert(q.pre == 0 && q.piv != 0); return lasteqn = eqn(0,1,q.post/q.piv,q.aug/q.piv); } eqn start(Int j) { return scale(e[j]); } eqn mid(Int j) { // Subtract a factor of the last equation so that the first entry is // zero, then procede to scale it. eqn& q=e[j]; return scale(eqn(0,q.piv-q.pre*lasteqn.post,q.post, q.aug-q.pre*lasteqn.aug)); } // The end case is the same as the middle case. }; // Once the matrix is in reduced echelon form, we can solve for the values by // back-substitution. This algorithm works from the bottom-up, so backCompute // must be used to get the answer. struct backsub : public knotprop { cvector& e; double lastTheta; backsub(knotlist& l, cvector& e) : knotprop(l), e(e) {} double end(Int j) { eqn& q=e[j]; assert(q.pre == 0 && q.piv == 1 && q.post == 0); double theta=q.aug; lastTheta=theta; return theta; } double mid(Int j) { eqn& q=e[j]; assert(q.pre == 0 && q.piv == 1); double theta=-q.post*lastTheta+q.aug; lastTheta=theta; return theta; } // start is the same as mid. }; // Once the equations have been determined, solve for the thetas. cvector solveThetas(knotlist& l, cvector& e) { if (homogeneous(e)) // We are solving Ax=0, so a solution is zero for every theta. return cvector(e.size(),0); else if (l.cyclic()) { // The knotprop template is unusually unhelpful in this case, so I // won't use it here. The algorithm breaks into three passes on the // object. The old Asymptote code used a two-pass method, but I // implemented this to stay closer to the MetaPost source code. // This might be something to look at for optimization. cvector we=recalc(e); INFO(we); double theta0=solveForTheta0(we); return backsubCyclic(we, theta0); } else { /* Non-cyclic case. */ /* First do row operations to get it into reduced echelon form. */ cvector el=ref(l,e).compute(); /* Then, do back substitution. */ return backsub(l,el).backCompute(); } } // Once thetas have been solved, determine the first control point of every // join. struct postcontrolprop : public knotprop { cvector& dz; cvector& psi; cvector& theta; postcontrolprop(knotlist& l, cvector& dz, cvector& psi, cvector& theta) : knotprop(l), dz(dz), psi(psi), theta(theta) {} double phi(Int j) { /* The third angle: psi + theta + phi = 0 */ return -psi[j] - theta[j]; } double vel(Int j) { /* Use the standard velocity function. */ return velocity(theta[j],phi(j+1),l[j].tout); } // start is the same as mid. pair mid(Int j) { // Put a control point at the relative distance determined by the velocity, // and at an angle determined by theta. return l[j].z + vel(j)*expi(theta[j])*dz[j]; } // The end postcontrol is the same as the last knot. pair end(Int j) { return l[j].z; } }; // Determine the first control point of every join. struct precontrolprop : public knotprop { cvector& dz; cvector& psi; cvector& theta; precontrolprop(knotlist& l, cvector& dz, cvector& psi, cvector& theta) : knotprop(l), dz(dz), psi(psi), theta(theta) {} double phi(Int j) { return -psi[j] - theta[j]; } double vel(Int j) { return velocity(phi(j),theta[j-1],l[j].tin); } // The start precontrol is the same as the first knot. pair start(Int j) { return l[j].z; } pair mid(Int j) { return l[j].z - vel(j)*expi(-phi(j))*dz[j-1]; } // end is the same as mid. }; // Puts solved controls into a protopath starting at the given index. // By convention, the first knot is not coded, as it is assumed to be coded by // the previous section (or it is the first breakpoint and encoded as a special // case). struct encodeControls : public knoteffect { protopath& p; Int k; cvector& pre; cvector& post; encodeControls(protopath& p, Int k, cvector& pre, knotlist& l, cvector& post) : knoteffect(l), p(p), k(k), pre(pre), post(post) {} void encodePre(Int j) { p.pre(k+j)=pre[j]; } void encodePoint(Int j) { p.point(k+j)=l[j].z; } void encodePost(Int j) { p.post(k+j)=post[j]; } void solo(Int) { #if 0 encodePoint(j); #endif } void start(Int j) { #if 0 encodePoint(j); #endif encodePost(j); } void mid(Int j) { encodePre(j); encodePoint(j); encodePost(j); } void end(Int j) { encodePre(j); encodePoint(j); } }; void encodeStraight(protopath& p, Int k, knotlist& l) { pair a=l.front().z; double at=l.front().tout.val; pair b=l.back().z; double bt=l.back().tin.val; pair step=(b-a)/3.0; if (at==1.0 && bt==1.0) { p.straight(k)=true; p.post(k)=a+step; p.pre(k+1)=b-step; p.point(k+1)=b; } else { p.post(k)=a+step/at; p.pre(k+1)=b-step/bt; p.point(k+1)=b; } } void solveSection(protopath& p, Int k, knotlist& l) { if (l.length()>0) { info(cerr, "solving section", l); // Calculate useful properties. cvector dz = dzprop(l) .compute(); cvector d = dprop(l,dz).compute(); cvector psi = psiprop(l,dz).compute(); INFO(dz); INFO(d); INFO(psi); // Build and solve the linear equations for theta. cvector e = eqnprop(l,d,psi).compute(); INFO(e); if (straightSection(e)) // Handle straight section as special case. encodeStraight(p,k,l); else { cvector theta = solveThetas(l,e); INFO(theta); // Calculate the control points. cvector post = postcontrolprop(l,dz,psi,theta).compute(); cvector pre = precontrolprop(l,dz,psi,theta).compute(); // Encode the results into the protopath. encodeControls(p,k,pre,l,post).exec(); } } } // Find the first breakpoint in the knotlist, ie. where we can start solving a // non-cyclic section. If the knotlist is fully cyclic, then this returns // NOBREAK. // This must be called with a knot that has all of its implicit specifiers in // place. const Int NOBREAK=-1; Int firstBreakpoint(knotlist& l) { for (Int j=0;jopen()) return j; return NOBREAK; } // Once a breakpoint, a, is found, find where the next breakpoint after it is. // This must be called with a knot that has all of its implicit specifiers in // place, so that breakpoint can be identified by either an in or out specifier // that is not open. Int nextBreakpoint(knotlist& l, Int a) { // This is guaranteed to terminate if a is the index of a breakpoint. If the // path is non-cyclic it will stop at or before the last knot which must be a // breakpoint. If the path is cyclic, it will stop at or before looping back // around to a which is a breakpoint. Int j=a+1; while (l[j].in->open()) ++j; return j; } // Write out the controls for section of the form // a.. control b and c ..d void writeControls(protopath& p, Int a, knotlist& l) { // By convention, the first point will already be encoded. p.straight(a)=dynamic_cast(l[a].out)->straight; p.post(a)=dynamic_cast(l[a].out)->cz; p.pre(a+1)=dynamic_cast(l[a+1].in)->cz; p.point(a+1)=l[a+1].z; } // Solves a path that has all of its specifiers laid out explicitly. path solveSpecified(knotlist& l) { protopath p(l.size(),l.cyclic()); Int first=firstBreakpoint(l); if (first==NOBREAK) /* We are solving a fully cyclic path, so do it in one swoop. */ solveSection(p,0,l); else { // Encode the first point. p.point(first)=l[first].z; // If the path is cyclic, we should stop where we started (modulo the // length of the path); otherwise, just stop at the end. Int last=l.cyclic() ? first+l.length() : l.length(); Int a=first; while (a!=last) { if (l[a].out->controlled()) { assert(l[a+1].in->controlled()); // Controls are already picked, just write them out. writeControls(p,a,l); ++a; } else { // Find the section a to b and solve it, putting the result (starting // from index a into our protopath. Int b=nextBreakpoint(l,a); subknotlist section(l,a,b); solveSection(p,a,section); a=b; } } // For a non-cyclic path, the end control points need to be set. p.controlEnds(); } return p.fix(); } /* If a knot is open on one side and restricted on the other, this replaces the * open side with a restriction determined by the restriction on the other * side. After this, any knot will either have two open specs or two * restrictions. */ struct partnerUp : public knoteffect { partnerUp(knotlist& l) : knoteffect(l) {} void mid(Int j) { knot& k=l[j]; if (k.in->open() && !k.out->open()) k.in=k.out->inPartner(k.z); else if (!k.in->open() && k.out->open()) k.out=k.in->outPartner(k.z); } }; /* Ensures a non-cyclic path has direction specifiers at the ends, adding curls * if there are none. */ void curlEnds(knotlist& l) { static curlSpec endSpec; if (!l.cyclic()) { if (l.front().in->open()) l.front().in=&endSpec; if (l.back().out->open()) l.back().out=&endSpec; } } /* If a point occurs twice in a row in a knotlist, write in controls * between the two knots at that point (unless it already has controls). */ struct controlDuplicates : public knoteffect { controlDuplicates(knotlist& l) : knoteffect(l) {} void solo(Int) { /* One point ==> no duplicates */ } // start is the same as mid. void mid(Int j) { knot &k1=l[j]; knot &k2=l[j+1]; if (!k1.out->controlled() && k1.z==k2.z) { k1.out=k2.in=new controlSpec(k1.z,true); } } void end(Int) { /* No next point to compare with. */ } }; path solve(knotlist& l) { if (l.empty()) return path(); else { info(cerr, "input knotlist", l); curlEnds(l); controlDuplicates(l).exec(); partnerUp(l).exec(); info(cerr, "specified knotlist", l); return solveSpecified(l); } } // Code for Testing #if 0 path solveSimple(cvector& z) { // The two specifiers used: an open spec and a curl spec for the ends. spec open; // curlSpec curl; // curlSpec curly(2.0); // dirSpec E(0); // dirSpec N(PI/2.0); controlSpec here(pair(150,150)); // Encode the knots as open in the knotlist. cvector nodes; for (cvector::iterator p=z.begin(); p!=z.end(); ++p) { knot k; k.z=*p; k.in=k.out=&open; nodes.push_back(k); } // Substitute in a curl spec for the ends. //nodes.front().out=nodes.back().in=&curl; // Test direction specifiers. //nodes.front().tout=2; //nodes.front().out=nodes.back().in=&curly; //nodes[0].out=nodes[0].in=&E; nodes[1].out=nodes[2].in=&here; simpleknotlist l(nodes,false); return solve(l); } #endif } // namespace camp asymptote-3.05/deconstruct.temp0000644000000000000000000000004615031566612015415 0ustar rootrootKEY=1.5 00 -0.25 -0.25 1.25 1.25 Done asymptote-3.05/wce0000755000000000000000000000073615031566105012700 0ustar rootroot#!/bin/sh printf "Testing errors..." ./asy -q -sysdir base -noautoplain -debug errortest 2> errors.temp result=`diff errors.temp errors` if test "$result" = ""; then echo PASSED. else echo FAILED. echo "$result" exit 1 fi printf "Testing deconstruct..." ./asy -q -sysdir base -outpipe 2 -xasy -c "draw(unitsquare); deconstruct()" 2> deconstruct.temp result=`diff deconstruct.temp deconstruct` if test "$result" = ""; then echo PASSED. else echo FAILED. echo "$result" exit 1 fi asymptote-3.05/texfile.h0000644000000000000000000003266115031566105014007 0ustar rootroot/***** * texfile.h * John Bowman 2003/03/14 * * Encapsulates the writing of commands to a TeX file. *****/ #ifndef TEXFILE_H #define TEXFILE_H #include #include #include #include "common.h" #include "pair.h" #include "bbox.h" #include "pen.h" #include "util.h" #include "interact.h" #include "path.h" #include "array.h" #include "psfile.h" #include "settings.h" #include "asyprocess.h" namespace camp { template void texdocumentclass(T& out, bool pipe=false) { if(settings::latex(settings::getSetting("tex")) && (pipe || !settings::getSetting("inlinetex"))) out << "\\documentclass[12pt]{article}" << newl; } template void texuserpreamble(T& out, mem::list& preamble=processData().TeXpreamble, bool pipe=false) { for(mem::list::iterator p=preamble.begin(); p != preamble.end(); ++p) { out << stripblanklines(*p); if(pipe) out << newl << newl; } } template void latexfontencoding(T& out) { out << "\\makeatletter%" << newl << "\\let\\ASYencoding\\f@encoding%" << newl << "\\let\\ASYfamily\\f@family%" << newl << "\\let\\ASYseries\\f@series%" << newl << "\\let\\ASYshape\\f@shape%" << newl << "\\makeatother%" << newl; } std::unordered_set const latexCharacters = {'#', '$', '%', '&', '\\', '^', '_', '{', '}', '~'}; template void texpreamble(T& out, mem::list& preamble=processData().TeXpreamble, bool pipe=false, bool ASYbox=true) { texuserpreamble(out,preamble,pipe); string texengine=settings::getSetting("tex"); string outPath=stripFile(settings::outname()); if(settings::context(texengine)) out << "\\disabledirectives[system.errorcontext]%" << newl; if(ASYbox) out << "\\newbox\\ASYbox" << newl << "\\newdimen\\ASYdimen" << newl; out << "\\def\\ASYprefix{" << escapeCharacters(outPath, latexCharacters) << "}" << newl << "\\long\\def\\ASYbase#1#2{\\leavevmode\\setbox\\ASYbox=\\hbox{#1}%" << "\\ASYdimen=\\ht\\ASYbox%" << newl << "\\setbox\\ASYbox=\\hbox{#2}\\lower\\ASYdimen\\box\\ASYbox}" << newl; if(!pipe) out << "\\long\\def\\ASYaligned(#1,#2)(#3,#4)#5#6#7{\\leavevmode%" << newl << "\\setbox\\ASYbox=\\hbox{#7}%" << newl << "\\setbox\\ASYbox\\hbox{\\ASYdimen=\\ht\\ASYbox%" << newl << "\\advance\\ASYdimen by\\dp\\ASYbox\\kern#3\\wd\\ASYbox" << "\\raise#4\\ASYdimen\\box\\ASYbox}%" << newl << "\\setbox\\ASYbox=\\hbox{#5\\wd\\ASYbox 0pt\\dp\\ASYbox 0pt\\ht\\ASYbox 0pt\\box\\ASYbox#6}%" << newl << "\\hbox to 0pt{\\kern#1pt\\raise#2pt\\box\\ASYbox\\hss}}%" << newl << "\\long\\def\\ASYalignT(#1,#2)(#3,#4)#5#6{%" << newl << "\\ASYaligned(#1,#2)(#3,#4){%" << newl << settings::beginlabel(texengine) << "%" << newl << "}{%" << newl << settings::endlabel(texengine) << "%" << newl << "}{#6}}" << newl << "\\long\\def\\ASYalign(#1,#2)(#3,#4)#5{" << "\\ASYaligned(#1,#2)(#3,#4){}{}{#5}}" << newl << settings::rawpostscript(texengine) << newl; } // Work around bug in dvips.def: allow spaces in file names. template void dvipsfix(T &out) { if(!settings::pdf(settings::getSetting("tex"))) { out << "\\makeatletter" << newl << "\\def\\Ginclude@eps#1{%" << newl << " \\message{<#1>}%" << newl << " \\bgroup" << newl << " \\def\\@tempa{!}%" << newl << " \\dimen@\\Gin@req@width" << newl << " \\dimen@ii.1bp%" << newl << " \\divide\\dimen@\\dimen@ii" << newl << " \\@tempdima\\Gin@req@height" << newl << " \\divide\\@tempdima\\dimen@ii" << newl << " \\special{PSfile=#1\\space" << newl << " llx=\\Gin@llx\\space" << newl << " lly=\\Gin@lly\\space" << newl << " urx=\\Gin@urx\\space" << newl << " ury=\\Gin@ury\\space" << newl << " \\ifx\\Gin@scalex\\@tempa\\else rwi=\\number\\dimen@\\space\\fi" << newl << " \\ifx\\Gin@scaley\\@tempa\\else rhi=\\number\\@tempdima\\space\\fi" << newl << " \\ifGin@clip clip\\fi}%" << newl << " \\egroup}" << newl << "\\makeatother" << newl; } } template void texdefines(T& out, mem::list& preamble=processData().TeXpreamble, bool pipe=false) { string texengine=settings::getSetting("tex"); bool latex=settings::latex(texengine); bool inlinetex=settings::getSetting("inlinetex"); if(pipe || !inlinetex) { bool lua=settings::lua(texengine); if(latex) { if(lua) { out << "\\edef\\pdfpageattr{\\pdfvariable pageattr}" << newl << "\\ifx\\pdfpagewidth\\undefined\\let\\pdfpagewidth\\paperwidth" << "\\fi" << newl << "\\ifx\\pdfpageheight\\undefined\\let\\pdfpageheight" << "\\paperheight" << "\\fi" << newl << "\\usepackage{graphicx}" << newl; } else { out << "\\let\\paperwidthsave\\paperwidth\\let\\paperwidth\\undefined" << newl << "\\usepackage{graphicx}" << newl << "\\let\\paperwidth\\paperwidthsave" << newl; } } else { if(lua) { out << "\\edef\\pdfpageattr{\\pdfvariable pageattr}" << newl << "\\ifx\\pdfpagewidth\\undefined\\let\\pdfpagewidth\\pagewidth" << "\\fi" << newl << "\\ifx\\pdfpageheight\\undefined\\let\\pdfpageheight" << "\\pageheight" << "\\fi" << newl; } } texpreamble(out,preamble,pipe); } if(pipe) { // Make tex pipe aware of a previously generated aux file. string name=auxname(settings::outname(),"aux"); std::ifstream fin(name.c_str()); if(fin) { std::ofstream fout("texput.aux"); string s; while(getline(fin,s)) fout << s << endl; } } if(latex) { if(!inlinetex) { dvipsfix(out); } if(pipe) { out << "\\begin{document}" << newl; latexfontencoding(out); } } else if(!settings::context(texengine)) { out << "\\input graphicx" << newl // Fix miniltx path parsing bug: << "\\makeatletter" << newl << "\\def\\filename@parse#1{%" << newl << " \\let\\filename@area\\@empty" << newl << " \\expandafter\\filename@path#1/\\\\}" << newl << "\\def\\filename@path#1/#2\\\\{%" << newl << " \\ifx\\\\#2\\\\%" << newl << " \\def\\reserved@a{\\filename@simple#1.\\\\}%" << newl << " \\else" << newl << " \\edef\\filename@area{\\filename@area#1/}%" << newl << " \\def\\reserved@a{\\filename@path#2\\\\}%" << newl << " \\fi" << newl << " \\reserved@a}" << newl << "\\makeatother" << newl; dvipsfix(out); if(!pipe) out << "\\input picture" << newl; } } template bool setlatexfont(T& out, const pen& p, const pen& lastpen) { if(p.size() != lastpen.size() || p.Lineskip() != lastpen.Lineskip()) { out << "\\fontsize{" << p.size()*settings::ps2tex << "}{" << p.Lineskip()*settings::ps2tex << "}\\selectfont%" << newl; return true; } return false; } template bool settexfont(T& out, const pen& p, const pen& lastpen, bool latex) { string font=p.Font(); if(font != lastpen.Font() || (!latex && p.size() != lastpen.size())) { out << font << "%" << newl; return true; } return false; } class texfile : public psfile { protected: bbox box; bool inlinetex; double Hoffset; int level; bool pdf; public: string texengine; texfile(const string& texname, const bbox& box, bool pipe=false); virtual ~texfile(); void prologue(bool deconstruct=false); virtual void beginpage() {} void epilogue(bool pipe=false); virtual void endpage() {} void setpen(pen p); void setfont(pen p); void gsave(bool tex=true); void grestore(bool tex=true); void beginspecial(); void endspecial(); void special(const string &s); void beginraw(); void endraw(); void begingroup() {++level;} void endgroup() {--level;} bool toplevel() {return level == 0;} virtual void beginpicture(const bbox& b); void endpicture(const bbox& b, bool newPage=false); virtual void newpage(const bbox&) { verbatimline(settings::newpage(texengine)); } void BBox(const bbox& b) { bbox B=b.shift(pair(-hoffset(),-voffset())); if(pdf) { if(settings::xe(texengine)) *out << "\\special{pdf: put @thispage <>}%" << newl; else if(settings::context(texengine)) { double width=B.right-B.left; double height=B.top-B.bottom; *out << "\\definepapersize[asy][" << "width=" << width << "bp," << "height=" << height << "bp]%" << newl << "\\setuppapersize[asy][asy]%" << newl << "\\setuplayout[" << "backspace=" << -B.left << "bp," << "topspace=" << B.top-(box.top-box.bottom) << "bp]%" << newl; } else *out << "\\pdfpageattr{/MediaBox [" << B << "]}%" << newl; } } void writepair(pair z) { *out << z; } void miniprologue(); void writeshifted(path p, bool newPath=true); virtual double hoffset() {return Hoffset;} virtual double voffset() {return box.bottom;} // Draws label transformed by T at position z. void put(const string& label, const transform& T, const pair& z, const pair& Align); void beginlayer(string psname, bool postscript); void endlayer(); virtual void Offset(const bbox& box, bool special=false) {}; }; class svgtexfile : public texfile { mem::stack clipstack; size_t clipcount; size_t gradientcount; size_t gouraudcount; size_t tensorcount; bool inspecial; static string nl; pair offset; bool first; bool deconstruct; public: svgtexfile(const string& texname, const bbox& box, bool pipe=false, bool deconstruct=false) : texfile(texname,box,pipe), deconstruct(deconstruct) { inspecial=false; *out << "\\catcode`\\%=12" << newl << "\\def\\percent{%}" << newl << "\\catcode`\\%=14" << newl; first=true; Offset(box); } void Offset(const bbox& b, bool special=false) { box=b; if(special) { texfile::beginpicture(b); pair bboxshift=pair(-2*b.left,b.top-b.bottom); bbox b0=svgbbox(b,bboxshift); *out << "\\special{dvisvgm:bbox f " << b0.left << "bp " << b0.bottom << "bp " << b0.right << "bp " << b0.top << "bp}%" << newl; } Hoffset=inlinetex ? box.right : box.left; offset=pair(box.left,box.top); clipstack=mem::stack(); clipcount=0; gradientcount=0; gouraudcount=0; tensorcount=0; } void beginpicture(const bbox& b) { Offset(b,true); } void newpage(const bbox& b) { if(deconstruct) { if(first) first=false; else endpicture(b,true); beginpicture(b); } } void writeclip(path p, bool newPath=true) { write(p,false); } void dot(path p, pen, bool newPath=true); void writeshifted(pair z) { write(conj(shift(-offset)*z)*settings::ps2tex); } double hoffset() {return Hoffset+offset.getx();} double voffset() {return box.bottom+offset.gety();} void translate(pair z) {} void concat(transform t) {} void beginspecial(bool def=false); void endspecial(); void beginpage() { beginpicture(box); } void endpage() { endpicture(box); } void transform(); void begintransform(); void endtransform(); void clippath(); void beginpath(); void endpath(); void newpath() { beginspecial(); begintransform(); beginpath(); } // Workaround libc++ parsing bug under MacOS. #ifdef __APPLE__ const string sep=" "; #else const string sep=""; #endif void moveto(pair z) { *out << sep << "M"; writeshifted(z); } void lineto(pair z) { *out << sep << "L"; writeshifted(z); } void curveto(pair zp, pair zm, pair z1) { *out << sep << "C"; writeshifted(zp); writeshifted(zm); writeshifted(z1); } void closepath() { *out << sep << "Z"; } string rgbhex(pen p) { p.torgb(); return p.hex(); } void properties(const pen& p); void color(const pen &p, const string& type); void stroke(const pen &p, bool dot=false); void strokepath(); void fillrule(const pen& p, const string& type="fill"); void fill(const pen &p); void begingradientshade(bool axial, ColorSpace colorspace, const pen& pena, const pair& a, double ra, const pen& penb, const pair& b, double rb); void gradientshade(bool axial, ColorSpace colorspace, const pen& pena, const pair& a, double ra, bool extenda, const pen& penb, const pair& b, double rb, bool extendb); void gouraudshade(const pen& p0, const pair& z0, const pen& p1, const pair& z1, const pen& p2, const pair& z2); void begingouraudshade(const vm::array& pens, const vm::array& vertices, const vm::array& edges); void gouraudshade(const pen& pentype, const vm::array& pens, const vm::array& vertices, const vm::array& edges); void beginclip(); void endclip(const pen &p); void endpsclip(const pen &p) {} void setpen(pen p) {if(!inspecial) texfile::setpen(p);} void gsave(bool tex=false); void grestore(bool tex=false); }; } //namespace camp #endif asymptote-3.05/coenv.h0000644000000000000000000000161415031566105013453 0ustar rootroot/***** * coenv.h * Andy Hammerlindl 2004/11/18 * * Bundles the env and coder classes needed in translating the abstract syntax * tree. It also also implements some functions that involve both the env and * coder, such as implicitCast(). *****/ #ifndef COENV_H #define COENV_H #include "env.h" #include "coder.h" namespace trans { class coenv { public: coder &c; env &e; coenv(coder &c, env &e) : c(c), e(e) {} // This is used when an expression of type source needs to be an // expression of type target. // If it is allowed, the casting instructions (if any) will be added. // Otherwise, an appropriate error message will be printed. bool implicitCast(position pos, ty *target, ty *source); bool explicitCast(position pos, ty *target, ty *source); void add(protoenv &source, varEntry *qualifier) { e.add(source, qualifier, c); } }; } // namespace trans #endif asymptote-3.05/cc-mode2.el0000644000000000000000000000352415031566105014105 0ustar rootroot(when (require 'cc-mode nil t) (require 'asy-mode nil t) (defvar my-c-style '((c-basic-offset . 2) (c-tab-always-indent . nil) (c-offsets-alist . ((innamespace nil) (inline-open nil) (case-label +) )) (c-cleanup-list . (brace-else-brace brace-else-if-brace brace-catch-brace empty-defun-braces defun-close-semi)) (c-hanging-braces-alist . ((brace-list-open) (brace-entry-open) (statement-cont) (substatement-open after) (block-close . c-snug-do-while) (extern-lang-open after) (inline-open) (inline-close) (namespace-open after))) (c-hanging-semi&comma-criteria . (c-semi&comma-no-newlines-for-oneline-inliners c-semi&comma-no-newlines-before-nonblanks c-semi&comma-inside-parenlist)) )) (setq c-mode-hook 'c++-mode) (defun c-mode-common-addn() "Additions to c-and-c++-mode." (c-add-style "jcb" my-c-style t) ;; (c-toggle-auto-hungry-state 1) (auto-fill-mode) ) (setq c-mode-common-hook 'c-mode-common-addn) ) asymptote-3.05/drawimage.h0000644000000000000000000000572015031566105014303 0ustar rootroot/***** * drawimage.h * John Bowman * * Stores a image that has been added to a picture. *****/ #ifndef DRAWIMAGE_H #define DRAWIMAGE_H #include "drawelement.h" #include "array.h" namespace camp { class drawImage : public drawElement { protected: transform t; bool antialias; public: drawImage(const transform& t, bool antialias, const string& key="") : drawElement(key), t(t), antialias(antialias) {} virtual ~drawImage() {} void bounds(bbox& b, iopipestream&, boxvector&, bboxlist&) { b += t*pair(0,0); b += t*pair(1,1); } bool svg() {return true;} bool svgpng() {return true;} }; class drawPaletteImage : public drawImage { vm::array image; vm::array palette; public: drawPaletteImage(const vm::array& image, const vm::array& palette, const transform& t, bool antialias, const string& key="") : drawImage(t,antialias,key), image(image), palette(palette) {} virtual ~drawPaletteImage() {} bool draw(psfile *out) { out->gsave(); out->concat(t); out->image(image,palette,antialias); out->grestore(); return true; } drawElement *transformed(const transform& T) { return new drawPaletteImage(image,palette,T*t,antialias,KEY); } }; class drawNoPaletteImage : public drawImage { vm::array image; public: drawNoPaletteImage(const vm::array& image, const transform& t, bool antialias, const string& key="") : drawImage(t,antialias,key), image(image) {} virtual ~drawNoPaletteImage() {} bool draw(psfile *out) { out->gsave(); out->concat(t); out->image(image,antialias); out->grestore(); return true; } drawElement *transformed(const transform& T) { return new drawNoPaletteImage(image,T*t,antialias,KEY); } }; class drawFunctionImage : public drawImage { vm::stack *Stack; vm::callable *f; Int width, height; public: drawFunctionImage(vm::stack *Stack, vm::callable *f, Int width, Int height, const transform& t, bool antialias, const string& key="") : drawImage(t,antialias,key), Stack(Stack), f(f), width(width), height(height) {} virtual ~drawFunctionImage() {} bool draw(psfile *out) { out->gsave(); out->concat(t); out->image(Stack,f,width,height,antialias); out->grestore(); return true; } drawElement *transformed(const transform& T) { return new drawFunctionImage(Stack,f,width,height,T*t,antialias,KEY); } }; class drawRawImage : public drawImage { unsigned char *raw; // For internal use; not buffered, may be overwritten. size_t width,height; public: drawRawImage(unsigned char *raw, size_t width, size_t height, const transform& t, bool antialias, const string& key="") : drawImage(t,antialias,key), raw(raw), width(width), height(height) {} virtual ~drawRawImage() {} bool draw(psfile *out) { out->gsave(); out->concat(t); out->rawimage(raw,width,height,antialias); out->grestore(); return true; } }; } #endif asymptote-3.05/Pipfile0000644000000000000000000000021215031566105013474 0ustar rootroot[[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] [dev-packages] [requires] python_version = "3.6" asymptote-3.05/runpair.h0000644000000000000000000000040015031566132014011 0ustar rootroot/***** Autogenerated from runpair.in; changes will be overwritten *****/ #pragma once namespace run { void pairZero(vm::stack *); void realRealToPair(vm::stack *); void pairNegate(vm::stack *); void pairXPart(vm::stack *); void pairYPart(vm::stack *); } asymptote-3.05/runpair.in0000644000000000000000000001007415031566105014200 0ustar rootroot/***** * runpair.in * * Runtime functions for pair operations. * *****/ pair => primPair() #include "pair.h" using namespace camp; namespace run { extern pair zero; } pair sin(pair z) { return pair(sin(z.getx())*cosh(z.gety()),cos(z.getx())*sinh(z.gety())); } pair exp(pair z) { return exp(z.getx())*expi(z.gety()); } pair gamma(pair z) { static double p[]={0.99999999999980993,676.5203681218851,-1259.1392167224028, 771.32342877765313,-176.61502916214059,12.507343278686905, -0.13857109526572012,9.9843695780195716e-6, 1.5056327351493116e-7}; static int n=sizeof(p)/sizeof(double); static double root2pi=sqrt(2*PI); if(z.getx() < 0.5) return PI/(sin(PI*z)*gamma(1.0-z)); z -= 1.0; pair x=p[0]; for(int i=1; i < n; ++i) x += p[i]/(z+i); pair t=n-1.5+z; return root2pi*pow(t,z+0.5)*exp(-t)*x; } // Autogenerated routines: pair :pairZero() { return zero; } pair :realRealToPair(real x, real y) { return pair(x,y); } pair :pairNegate(pair z) { return -z; } real xpart:pairXPart(pair z) { return z.getx(); } real ypart:pairYPart(pair z) { return z.gety(); } real length(pair z) { return z.length(); } real abs(pair z) { return z.length(); } real abs2(pair z) { return z.abs2(); } pair sqrt(explicit pair z) { return Sqrt(z); } // Return the angle of z in radians. real angle(pair z, bool warn=true) { return z.angle(warn); } // Return the angle of z in degrees in the interval [0,360). real degrees(pair z, bool warn=true) { return principalBranch(degrees(z.angle(warn))); } // Convert degrees to radians. real radians(real degrees) { return radians(degrees); } // Convert radians to degrees. real degrees(real radians) { return degrees(radians); } // Convert radians to degrees in [0,360). real Degrees(real radians) { return principalBranch(degrees(radians)); } real Sin(real deg) { int n=(int) (deg/90.0); if(deg == n*90.0) { int m=n % 4; if(m < 0) m += 4; if(m == 1) return 1; if(m == 3) return -1; return 0.0; } return sin(radians(deg)); } real Cos(real deg) { int n=(int) (deg/90.0); if(deg == n*90.0) { int m=n % 4; if(m < 0) m += 4; if(m == 0) return 1; if(m == 2) return -1; return 0.0; } return cos(radians(deg)); } real Tan(real deg) { int n=(int) (deg/90.0); if(deg == n*90.0) { int m=n % 4; if(m < 0) m += 4; if(m == 1) return HUGE_VAL; if(m == 3) return -HUGE_VAL; return 0.0; } return tan(radians(deg)); } real aSin(real x) { return degrees(asin(x)); } real aCos(real x) { return degrees(acos(x)); } real aTan(real x) { return degrees(atan(x)); } pair unit(pair z) { return unit(z); } pair dir(real degrees) { return expi(radians(degrees)); } pair dir(explicit pair z) { return unit(z); } pair expi(real angle) { return expi(angle); } pair exp(explicit pair z) { return exp(z); } pair log(explicit pair z) { return pair(log(z.length()),z.angle()); } pair sin(explicit pair z) { return sin(z); } pair cos(explicit pair z) { return pair(cos(z.getx())*cosh(z.gety()),-sin(z.getx())*sinh(z.gety())); } // Complex Gamma function pair gamma(explicit pair z) { return gamma(z); } pair conj(pair z) { return conj(z); } pair realmult(pair z, pair w) { return pair(z.getx()*w.getx(),z.gety()*w.gety()); } // To avoid confusion, a dot product requires explicit pair arguments. real dot(explicit pair z, explicit pair w) { return dot(z,w); } // Return the 2D scalar cross product z.x*w.y-z.y*w.x. real cross(explicit pair z, explicit pair w) { return cross(z,w); } pair bezier(pair a, pair b, pair c, pair d, real t) { real onemt=1-t; real onemt2=onemt*onemt; return onemt2*onemt*a+t*(3.0*(onemt2*b+t*onemt*c)+t*t*d); } pair bezierP(pair a, pair b, pair c, pair d, real t) { return 3.0*(t*t*(d-a+3.0*(b-c))+t*(2.0*(a+c)-4.0*b)+b-a); } pair bezierPP(pair a, pair b, pair c, pair d, real t) { return 6.0*(t*(d-a+3.0*(b-c))+a+c)-12.0*b; } pair bezierPPP(pair a, pair b, pair c, pair d) { return 6.0*(d-a)+18.0*(b-c); } asymptote-3.05/guide.cc0000644000000000000000000000217515031566105013577 0ustar rootroot/***** * guide.cc * Andy Hammerlindl 2005/02/23 * *****/ #include "guide.h" namespace camp { multiguide::multiguide(guidevector& v) { // This constructor tests if the first subguide is also a multiguide and, // if possible, uses the same base, extending it beyond what is used. multiguide *rg = v.empty() ? 0 : dynamic_cast(v[0]); if (rg && rg->base->size() == rg->length) { base = rg->base; base->insert(base->end(), v.begin()+1, v.end()); } else base = new guidevector(v); length = base->size(); } void multiguide::flatten(flatguide& g, bool allowsolve) { size_t n=length; if(n > 0) { for(size_t i=0; i+1 < n; ++i) { subguide(i)->flatten(g,allowsolve); if(!allowsolve && subguide(i)->cyclic()) { g.precyclic(true); g.resolvecycle(); } } subguide(n-1)->flatten(g,allowsolve); } } void multiguide::print(ostream& out) const { side lastLoc=JOIN; for(size_t i=0; i < length; ++i) { guide *g = subguide(i); side loc = g->printLocation(); adjustLocation(out,lastLoc,loc); g->print(out); lastLoc=loc; } } } // namespace camp asymptote-3.05/transform.h0000644000000000000000000001422015031566105014351 0ustar rootroot/***** * transform.h * Andy Hammerlindl 2002/05/22 * * The transform datatype stores an affine transformation on the plane * The datamembers are x, y, xx, xy, yx, and yy. A pair (x,y) is * transformed as * x' = t.x + t.xx * x + t.xy * y * y' = t.y + t.yx * x + t.yy * y *****/ #ifndef TRANSFORM_H #define TRANSFORM_H #include #include "pair.h" namespace camp { class transform : public gc { double x; double y; double xx; double xy; double yx; double yy; public: transform() : x(0.0), y(0.0), xx(1.0), xy(0.0), yx(0.0), yy(1.0) {} virtual ~transform() {} transform(double x, double y, double xx, double xy, double yx, double yy) : x(x), y(y), xx(xx), xy(xy), yx(yx), yy(yy) {} double getx() const { return x; } double gety() const { return y; } double getxx() const { return xx; } double getxy() const { return xy; } double getyx() const { return yx; } double getyy() const { return yy; } friend transform operator+ (const transform& t, const transform& s) { return transform(t.x + s.x, t.y + s.y, t.xx + s.xx, t.xy + s.xy, t.yx + s.yx, t.yy + s.yy); } friend transform operator- (const transform& t, const transform& s) { return transform(t.x - s.x, t.y - s.y, t.xx - s.xx, t.xy - s.xy, t.yx - s.yx, t.yy - s.yy); } friend transform operator- (const transform& t) { return transform(-t.x, -t.y, -t.xx, -t.xy, -t.yx, -t.yy); } friend pair operator* (const transform& t, const pair& z) { double x = z.getx(), y = z.gety(); return pair(t.x + t.xx * x + t.xy * y, t.y + t.yx * x + t.yy * y); } // Calculates the composition of t and s, so for a pair, z, // t * (s * z) == (t * s) * z // Can be thought of as matrix multiplication. friend transform operator* (const transform& t, const transform& s) { return transform(t.x + t.xx * s.x + t.xy * s.y, t.y + t.yx * s.x + t.yy * s.y, t.xx * s.xx + t.xy * s.yx, t.xx * s.xy + t.xy * s.yy, t.yx * s.xx + t.yy * s.yx, t.yx * s.xy + t.yy * s.yy); } friend bool operator== (const transform& t1, const transform& t2) { return t1.x == t2.x && t1.y == t2.y && t1.xx == t2.xx && t1.xy == t2.xy && t1.yx == t2.yx && t1.yy == t2.yy; } friend bool operator!= (const transform& t1, const transform& t2) { return !(t1 == t2); } bool isIdentity() const { return x == 0.0 && y == 0.0 && xx == 1.0 && xy == 0.0 && yx == 0.0 && yy == 1.0; } bool isIsometry() const { return xx*xx+xy*xy == 1.0 && xx*yx+xy*yy == 0.0 && yx*yx+yy*yy == 1.0; } bool isNull() const { return x == 0.0 && y == 0.0 && xx == 0.0 && xy == 0.0 && yx == 0.0 && yy == 0.0; } // Calculates the determinant, as if it were a matrix. friend double det(const transform& t) { return t.xx * t.yy - t.xy * t.yx; } // Tells if the transformation is invertible (bijective). bool invertible() const { return det(*this) != 0.0; } friend transform inverse(const transform& t) { double d = det(t); if (d == 0.0) reportError("inverting singular transform"); d=1.0/d; return transform((t.xy * t.y - t.yy * t.x)*d, (t.yx * t.x - t.xx * t.y)*d, t.yy*d, -t.xy*d, -t.yx*d, t.xx*d); } friend ostream& operator<< (ostream& out, const transform& t) { return out << "(" << t.x << "," << t.y << "," << t.xx << "," << t.xy << "," << t.yx << "," << t.yy << ")"; } }; // The common transforms static const transform identity; inline transform shift(pair z) { return transform (z.getx(), z.gety(), 1.0, 0.0, 0.0, 1.0); } inline transform xscale(double s) { return transform (0.0, 0.0, s, 0.0, 0.0, 1.0); } inline transform yscale(double s) { return transform (0.0, 0.0, 1.0, 0.0, 0.0, s); } inline transform scale(double s) { return transform (0.0, 0.0, s, 0.0, 0.0, s); } inline transform scale(double x, double y) { return transform (0.0, 0.0, x, 0.0, 0.0, y); } inline transform scale(pair z) { // Equivalent to multiplication by z. double x = z.getx(), y = z.gety(); return transform (0.0, 0.0, x, -y, y, x); } inline transform slant(double s) { return transform (0.0, 0.0, 1.0, s, 0.0, 1.0); } inline transform rotate(double theta) { double s = sin(theta), c = cos(theta); return transform (0.0, 0.0, c, -s, s, c); } // return rotate(angle(v)) if z != (0,0); otherwise return identity. inline transform rotate(pair z) { double d=z.length(); if(d == 0.0) return identity; d=1.0/d; return transform (0.0, 0.0, d*z.getx(), -d*z.gety(), d*z.gety(), d*z.getx()); } inline transform rotatearound(pair z, double theta) { // Notice the operators are applied from right to left. // Could be optimized. return shift(z) * rotate(theta) * shift(-z); } inline transform reflectabout(pair z, pair w) { if (z == w) reportError("points determining line to reflect about must be distinct"); // Also could be optimized. transform basis = shift(z) * scale(w-z); transform flip = yscale(-1.0); return basis * flip * inverse(basis); } // Return the rotational part of t. inline transform rotation(transform t) { pair z(2.0*t.getxx()*t.getyy(),t.getyx()*t.getyy()-t.getxx()*t.getxy()); if(t.getxx() < 0) z=-z; return rotate(atan2(z.gety(),z.getx())); } // Remove the x and y components, so that the new transform maps zero to zero. inline transform shiftless(transform t) { return transform(0, 0, t.getxx(), t.getxy(), t.getyx(), t.getyy()); } // Return the translational component of t. inline transform shift(transform t) { return transform(t.getx(), t.gety(), 1.0, 0, 0, 1.0); } // Return the translational pair of t. inline pair shiftpair(transform t) { return pair(t.getx(), t.gety()); } inline transform matrix(pair lb, pair rt) { pair size=rt-lb; return transform(lb.getx(),lb.gety(),size.getx(),0,0,size.gety()); } } //namespace camp GC_DECLARE_PTRFREE(camp::transform); #endif asymptote-3.05/win32xdr.cc0000644000000000000000000000332715031566105014162 0ustar rootroot#include "win32xdr.h" #if defined(_WIN32) && defined(HAVE_LIBTIRPC) void w32_xdrstdio_create(Win32XDR* xdrs, FILE* file, uint32_t op) { xdrs->file = file; xdrs->fileMode = op; } void w32_xdr_destroy(Win32XDR* xdrs) { } void w32_xdrmem_create( Win32XDR* xdrs, char* addr, unsigned int size, uint32_t op ) { xdrs->file = nullptr; xdrs->fileMode = op; xdrs->nonFileMem.data = addr; xdrs->nonFileMem.memSize = size; xdrs->nonFileMem.dataCursor = addr; xdrs->fileMode = op; } bool w32_xdr_int16_t(Win32XDR* xdrs, int16_t* ip) { return w32_xdr_u_int16_t(xdrs, reinterpret_cast(ip)); } bool w32_xdr_u_int16_t(Win32XDR* xdrs, uint16_t* ip) { return w32_internal_xdr_u_type(xdrs, ip); } bool w32_xdr_int32_t(Win32XDR* xdrs, int32_t* ip) { return w32_xdr_u_int32_t(xdrs, reinterpret_cast(ip)); } bool w32_xdr_u_int32_t(Win32XDR* xdrs, uint32_t* ip) { return w32_internal_xdr_u_type(xdrs, ip); } bool w32_xdr_int64_t(Win32XDR* xdrs, int64_t* ip) { return w32_xdr_u_int64_t(xdrs, reinterpret_cast(ip)); } bool w32_xdr_u_int64_t(Win32XDR* xdrs, uint64_t* ip) { return w32_internal_xdr_u_type(xdrs, ip); } bool w32_xdr_float(Win32XDR* xdrs, float* ip) { return w32_internal_xdr_u_type(xdrs, ip); } bool w32_xdr_double(Win32XDR* xdrs, double* ip) { return w32_internal_xdr_u_type(xdrs, ip); } bool w32_xdr_char(Win32XDR* xdrs, char* ip) { static_assert(sizeof(char) == sizeof(int8_t)); return w32_xdr_u_char(xdrs, reinterpret_cast(ip)); } bool w32_xdr_u_char(Win32XDR* xdrs, unsigned char* ip) { static_assert(sizeof(unsigned char) == sizeof(uint8_t)); return w32_internal_xdr_u_type(xdrs, ip); } #endif asymptote-3.05/errors0000644000000000000000000003037615031566105013436 0ustar rootrooterrortest.asy: 476.34: unnamed argument after rest argument errortest.asy: 477.37: additional rest argument errortest.asy: 478.28: unnamed argument after rest argument errortest.asy: 479.31: additional rest argument errortest.asy: 482.22: normal parameter after rest parameter errortest.asy: 483.22: normal parameter after rest parameter errortest.asy: 484.31: normal parameter after rest parameter errortest.asy: 485.31: normal parameter after rest parameter errortest.asy: 486.24: normal parameter after keyword-only parameter errortest.asy: 487.24: normal parameter after keyword-only parameter errortest.asy: 488.24: normal parameter after keyword-only parameter errortest.asy: 488.31: normal parameter after keyword-only parameter errortest.asy: 489.24: normal parameter after keyword-only parameter errortest.asy: 489.31: normal parameter after keyword-only parameter errortest.asy: 490.32: normal parameter after keyword-only parameter errortest.asy: 491.32: normal parameter after keyword-only parameter errortest.asy: 492.32: normal parameter after keyword-only parameter errortest.asy: 492.39: normal parameter after keyword-only parameter errortest.asy: 493.32: normal parameter after keyword-only parameter errortest.asy: 493.39: normal parameter after keyword-only parameter errortest.asy: 496.13: expected 'keyword' here errortest.asy: 497.13: expected 'keyword' here errortest.asy: 498.21: expected 'keyword' here errortest.asy: 499.21: expected 'keyword' here errortest.asy: 500.36: expected 'keyword' here errortest.asy: 500.32: normal parameter after keyword-only parameter errortest.asy: 501.36: expected 'keyword' here errortest.asy: 501.32: normal parameter after keyword-only parameter errortest.asy: 502.21: expected 'keyword' here errortest.asy: 503.21: expected 'keyword' here errortest.asy: 504.13: expected 'keyword' here errortest.asy: 505.13: expected 'keyword' here errortest.asy: 506.13: expected 'keyword' here errortest.asy: 507.13: expected 'keyword' here errortest.asy: 508.13: expected 'keyword' here errortest.asy: 509.13: expected 'keyword' here errortest.asy: 510.21: expected 'keyword' here errortest.asy: 511.21: expected 'keyword' here errortest.asy: 512.21: expected 'keyword' here errortest.asy: 513.21: expected 'keyword' here errortest.asy: 12.4: no matching variable 'x.y' errortest.asy: 16.11: no matching variable of name 'z' errortest.asy: 20.3: no matching variable 'x' errortest.asy: 27.3: no type of name 'x' errortest.asy: 28.3: no type of name 'x' errortest.asy: 29.3: no type of name 'x' errortest.asy: 30.10: no type of name 'x' errortest.asy: 32.5: no type of name 'x' errortest.asy: 33.5: no type of name 'x' errortest.asy: 34.5: no type of name 'x' errortest.asy: 35.12: no type of name 'x' errortest.asy: 41.4: no matching variable 'x.y' errortest.asy: 48.6: no matching variable 'm.u.v' errortest.asy: 55.12: no matching field of name 'z' in 'm' errortest.asy: 62.4: no matching variable 'm.z' errortest.asy: 75.4: no matching field or type of name 'u' in 'm' errortest.asy: 77.5: no matching field or type of name 'u' in 'm' errortest.asy: 84.3: expression cannot be used as an address errortest.asy: 89.3: use of variable 'f' is ambiguous errortest.asy: 91.4: use of variable 'm.f' is ambiguous errortest.asy: 97.11: array initializer used for non-array errortest.asy: 98.12: array initializer used for non-array errortest.asy: 103.4: no matching variable 'f.m' errortest.asy: 108.4: no matching variable 'x.m' errortest.asy: 116.12: no matching field of name 'z' in 'point' errortest.asy: 124.4: no matching variable 'p.z' errortest.asy: 132.4: use of variable 'p.f' is ambiguous errortest.asy: 140.4: no matching variable 'p.z' errortest.asy: 151.4: no matching function 'f()' errortest.asy: 152.4: no matching function 'f(string)' errortest.asy: 160.4: cannot call 'void f(int)' without parameters errortest.asy: 168.7: no matching function 'operator +(point)' errortest.asy: 173.10: types in conditional expression do not match errortest.asy: 178.10: type of conditional expression is ambiguous errortest.asy: 183.5: cannot convert 'int()' to 'int' in assignment errortest.asy: 188.5: assignment is ambiguous errortest.asy: 194.24: function must return a value errortest.asy: 200.11: type 'int' is not a structure errortest.asy: 209.3: allocation of struct 'b' is not in a valid scope errortest.asy: 219.3: break statement outside of a loop errortest.asy: 223.3: continue statement outside of a loop errortest.asy: 228.5: function cannot return a value errortest.asy: 234.5: function must return a value errortest.asy: 241.11: function must return a value errortest.asy: 244.11: function must return a value errortest.asy: 290.3: built-in functions cannot be modified errortest.asy: 298.11: cannot cast 'string' to 'int' errortest.asy: 312.4: accessing private field outside of structure errortest.asy: 313.4: accessing private field outside of structure errortest.asy: 314.4: accessing private field outside of structure errortest.asy: 314.4: accessing private field outside of structure errortest.asy: 315.4: modifying non-public field outside of structure errortest.asy: 316.4: modifying non-public field outside of structure errortest.asy: 318.4: accessing private field outside of structure errortest.asy: 319.4: accessing private field outside of structure errortest.asy: 320.4: accessing private field outside of structure errortest.asy: 321.4: modifying non-public field outside of structure errortest.asy: 330.18: no matching types or fields of name 'x' errortest.asy: 331.18: no matching types or fields of name 'f' errortest.asy: 341.3: modifying non-public field outside of structure errortest.asy: 342.3: modifying non-public field outside of structure errortest.asy: 344.3: modifying non-public field outside of structure errortest.asy: 350.4: accessing private field outside of structure errortest.asy: 351.4: accessing private field outside of structure errortest.asy: 353.4: accessing private field outside of structure errortest.asy: 354.4: accessing private field outside of structure errortest.asy: 360.18: no matching types or fields of name 'T' errortest.asy: 367.4: accessing private field outside of structure errortest.asy: 368.4: accessing private field outside of structure errortest.asy: 370.4: accessing private field outside of structure errortest.asy: 371.4: accessing private field outside of structure errortest.asy: 378.18: no matching types or fields of name 'T' errortest.asy: 386.11: modifying non-public field outside of structure errortest.asy: 387.11: modifying non-public field outside of structure errortest.asy: 388.11: modifying non-public field outside of structure errortest.asy: 389.11: modifying non-public field outside of structure errortest.asy: 393.3: modifying non-public field outside of structure errortest.asy: 394.3: modifying non-public field outside of structure errortest.asy: 395.3: modifying non-public field outside of structure errortest.asy: 396.3: modifying non-public field outside of structure errortest.asy: 400.3: modifying non-public field outside of structure errortest.asy: 401.3: modifying non-public field outside of structure errortest.asy: 402.3: modifying non-public field outside of structure errortest.asy: 403.3: modifying non-public field outside of structure errortest.asy: 407.11: modifying non-public field outside of structure errortest.asy: 408.11: modifying non-public field outside of structure errortest.asy: 409.11: modifying non-public field outside of structure errortest.asy: 410.11: modifying non-public field outside of structure errortest.asy: 411.3: modifying non-public field outside of structure errortest.asy: 412.3: modifying non-public field outside of structure errortest.asy: 413.3: modifying non-public field outside of structure errortest.asy: 414.3: modifying non-public field outside of structure errortest.asy: 419.7: inferred variable declaration without initializer errortest.asy: 422.20: cannot cast 'int' to 'var' errortest.asy: 425.4: cannot cast 'int' to 'var' errortest.asy: 426.12: cannot cast 'int' to 'var' errortest.asy: 427.12: cannot cast 'var' to 'int' errortest.asy: 430.25: cannot cast 'int' to 'var' errortest.asy: 430.28: cannot cast 'int' to 'var' errortest.asy: 430.31: cannot cast 'int' to 'var' errortest.asy: 431.13: cannot cast 'int[]' to 'var[]' errortest.asy: 432.14: cannot cast 'int' to 'var' errortest.asy: 432.17: cannot cast 'int' to 'var' errortest.asy: 432.20: cannot cast 'int' to 'var' errortest.asy: 433.15: cannot cast 'int' to 'var' errortest.asy: 433.18: cannot cast 'int' to 'var' errortest.asy: 433.21: cannot cast 'int' to 'var' errortest.asy: 434.13: cannot cast 'var[]' to 'int[]' errortest.asy: 435.3: type 'var' is not a structure errortest.asy: 438.17: cannot cast 'int' to 'var' errortest.asy: 442.7: could not infer type of initializer errortest.asy: 446.7: could not infer type of initializer errortest.asy: 448.7: could not infer type of initializer errortest.asy: 452.16: expression is not an array of inferable type errortest.asy: 457.16: expression is not an array of inferable type errortest.asy: 463.16: expression is not an array of inferable type errortest.asy: 470.7: array expression cannot be used as an address errortest.asy: 519.29: expected 'as' errortest.asy: 521.30: expected 'as' errortest.asy: 523.23: expected typename= errortest.asy: 525.3: Parametrized imports disallowed to reduce naming conflicts. Try 'access () as ;'. errortestNonTemplate.asy: 1.1: expected 'typedef import();' errortest.asy: 527.3: could not load module 'errortestNonTemplate' errortest.asy: 530.3: unexpected 'typedef import' errortest.asy: 531.3: Expected 'typedef import();' errortest.asy: 535.34: too few types passed: got 2, expected 3 errortest.asy: 535.3: could not load module 'errortestBrokenTemplate' errortest.asy: 537.51: template argument name does not match module: passed T, expected C errortest.asy: 537.3: could not load module 'errortestBrokenTemplate' errortest.asy: 539.41: template argument name does not match module: passed C, expected B errortest.asy: 539.3: could not load module 'errortestBrokenTemplate' errortestBrokenTemplate.asy: 5.1: unexpected 'typedef import' errortestBrokenTemplate.asy: 1.1: templated module access requires template parameters errortest.asy: 549.5: too many static modifiers errortest.asy: 552.5: too many autounravel modifiers errortest.asy: 553.5: too many autounravel modifiers errortest.asy: 554.5: too many static modifiers errortest.asy: 555.17: types cannot be autounraveled errortest.asy: 559.3: top-level fields cannot be autounraveled errortest.asy: 564.21: cannot shadow autounravel qaz errortest.asy: 572.22: cannot shadow autounravel alias errortest.asy: 581.27: non-statically nested types cannot be used in templates errortest.asy: 584.26: non-statically nested types cannot be used in templates errortest.asy: 585.26: non-statically nested types cannot be used in templates errortest.asy: 591.28: template argument name does not match module: passed B, expected A errortest.asy: 591.3: could not load module 'errortestTemplate' errortest.asy: 593.28: template argument name does not match module: passed C, expected A errortest.asy: 593.3: could not load module 'errortestTemplate' errortest.asy: 595.35: template argument name does not match module: passed D, expected B errortest.asy: 595.3: could not load module 'errortestTemplate' errortest.asy: 597.28: template argument name does not match module: passed C, expected A errortest.asy: 597.3: could not load module 'errortestTemplate' errortest.asy: 599.28: too few types passed: got 1, expected 2 errortest.asy: 599.3: could not load module 'errortestTemplate' errortest.asy: 601.28: too many types passed: got 3, expected 2 errortest.asy: 601.3: could not load module 'errortestTemplate' errortestTemplate.asy: 1.1: unexpected 'typedef import' errortest.asy: 618.4: accessing private field outside of structure errortest.asy: 619.9: accessing private field outside of structure errortest.asy: 620.4: accessing private field outside of structure errortest.asy: 621.4: accessing private field outside of structure errortest.asy: 625.4: accessing private field outside of structure errortest.asy: 626.9: accessing private field outside of structure errortest.asy: 627.4: accessing private field outside of structure errortest.asy: 628.4: accessing private field outside of structure errortest.asy: 639.4: accessing private field outside of structure asymptote-3.05/drawclipend.h0000644000000000000000000000225515031566105014637 0ustar rootroot/***** * drawclipend.h * John Bowman * * End clip of picture to specified path. *****/ #ifndef DRAWCLIPEND_H #define DRAWCLIPEND_H #include "drawclipbegin.h" #include "path.h" namespace camp { class drawClipEnd : public drawElement { bool grestore; drawClipBegin *partner; public: drawClipEnd(bool grestore=true, drawClipBegin *partner=NULL) : grestore(grestore), partner(partner) {} virtual ~drawClipEnd() {} bool endclip() {return true;} void bounds(bbox& b, iopipestream&, boxvector&, bboxlist& bboxstack) { if(bboxstack.size() < 2) reportError("endclip without matching beginclip"); b.clip(bboxstack.back()); bboxstack.pop_back(); b += bboxstack.back(); bboxstack.pop_back(); } bool endgroup() {return true;} bool svg() {return true;} void save(bool b) { grestore=b; if(partner) partner->save(b); } bool draw(psfile *out) { if(grestore) out->grestore(); return true; } bool write(texfile *out, const bbox& bpath) { out->endgroup(); if(out->toplevel()) out->endpicture(bpath); if(grestore) out->grestore(); return true; } }; } GC_DECLARE_PTRFREE(camp::drawClipEnd); #endif asymptote-3.05/ChangeLog0000644000000000000000000737335615031566105013770 0ustar rootrootcommit 3c4afab991ffcfedaf7e39eab6e4055c98f56457 Author: John Bowman Date: Thu Jul 3 11:37:30 2025 -0700 Add deconstruct test. commit b9aff3a006a5d235472d2bea754926dce7ef7796 Author: John Bowman Date: Thu Jul 3 10:24:57 2025 -0700 Add xdr character test. commit a195e2a5d18de606c7b2242f72fe815f3bec852f Author: John Bowman Date: Wed Jul 2 11:36:11 2025 -0700 Fix memixstream. commit a05e04c7124f3fb3795cf78b9a174e0c431c7473 Author: John Bowman Date: Tue Jul 1 20:28:09 2025 -0700 Simplify make check. commit 39b89dcd3dc490c6d1538d19bad69891c3746c4c Merge: 321f230f5 70f6dec05 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jul 1 17:52:10 2025 -0600 Merge pull request #553 from vectorgraphics/replace-setup-latex-ci-windows CI: Replace custom action with choco for texlive. commit 70f6dec05d850a624c211bd26f2b760a986ab511 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jul 1 17:39:37 2025 -0600 CI: Expand path with texlive in windows CI. commit dd98db5cc1945c2adcb398e676dacf4a91684025 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jul 1 17:38:39 2025 -0600 CMAKE: Add additional notice mssages to options. commit 1548a9fafc777e2fe84abd8fa9866c41b5939408 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jul 1 17:19:39 2025 -0600 CI: specify pdftex explicitly in CI. commit e17d4571c8b8e12d486bb29ce939d2c2ed6c9aae Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jul 1 16:43:58 2025 -0600 CI: Replace custom action with choco for texlive. commit 321f230f5c888ff91dedccaa48487a693fc79b3d Author: John Bowman Date: Tue Jul 1 13:16:51 2025 -0700 Update documentation. commit c5b805600bc92686828612e3ed432511d719e7ff Merge: f27a6537e 5dad4478c Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jul 1 11:04:30 2025 -0600 Merge pull request #552 from vectorgraphics/retry-ghostscript-install-ci CI: Use retry for installing ghoscript. commit 5dad4478cbf472e77e9c2cc4dae45a83ce14286e Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jul 1 10:36:24 2025 -0600 CI: Use retry for installing ghoscript. commit f27a6537e1720ac65cb6d1bd2f8ed24bdbf55b93 Author: John Bowman Date: Tue Jul 1 02:39:47 2025 -0700 Regenerate tests. commit c45a21e9e89df1afedefa8cef235021a2ed4a7d1 Author: John Bowman Date: Tue Jul 1 02:19:19 2025 -0700 Update URL of Asymptote Web Application. commit 359ab1ad8f5954d1ee973ce1cfd00a0951a2bc59 Author: John Bowman Date: Tue Jul 1 02:03:15 2025 -0700 Add XDR tests. commit 42eba5f3f46efac71ed612bf053dca3ddf593c77 Author: John Bowman Date: Tue Jul 1 01:05:20 2025 -0600 Suppress MacOS X warnings. commit fb81149f6c050cfa7af0aa04433a1022becb6f5d Author: John Bowman Date: Tue Jul 1 00:53:47 2025 -0600 Port xstream updates to MacOS X. commit 87386472859f053d193ce586c0dbdafb5bf45f39 Author: John Bowman Date: Mon Jun 30 23:12:17 2025 -0700 Fix last revision. commit 172d021fdcb5805a95f0f93c2359e4cec27bc2ee Author: John Bowman Date: Mon Jun 30 22:15:04 2025 -0700 Fix last revision. commit 0e82219b6f45ef0172be48a49e1c6219c8337338 Author: John Bowman Date: Mon Jun 30 21:44:32 2025 -0700 Restrict optimization pragma to GCC. commit 61a4e86e898353713a73a51cd5a50d6142566bd6 Author: John Bowman Date: Sun Jun 29 23:41:19 2025 -0700 Improve array read tests. commit 14e27840238fd1992c505599c0d1686dc3b5c506 Author: John Bowman Date: Sun Jun 29 23:31:59 2025 -0700 Update documentation. commit 7dbdf992ba26a47f659209c85b33d1bc94d53c63 Author: John Bowman Date: Sun Jun 29 22:58:47 2025 -0700 Reinstate file.singlereal by partially reverting commit 2643b3266bcf097515bb3aa3d8c375f6a55171e2, working around GCC optimization bug. commit b3a2012a707d6c2331967ca55d16fea7b9940df3 Author: John Bowman Date: Sun Jun 29 20:47:11 2025 -0700 Implement XDR and binary string reads. commit 842945d23266092a194ade0c66735d21a5ed5524 Author: John Bowman Date: Thu Jun 26 16:46:28 2025 -0700 Simplify code. commit b52f219a915b10b9d98a9587c8ad44c1553d00ee Author: John Bowman Date: Thu Jun 26 13:29:25 2025 -0700 Simplify code. commit 034380739eb9583999aa7e0145521b4013f9e9e9 Author: John Bowman Date: Thu Jun 26 13:07:59 2025 -0700 Remove unused code. commit 2ed539103d8680f0241eb9a51e7e0c42b0ed5239 Author: John Bowman Date: Thu Jun 26 13:06:52 2025 -0700 Fix 64-bit integer XDR reads and writes under UNIX. commit 6713a8149cb2e2ba740f406ac6294b0106ccc17a Author: John Bowman Date: Thu Jun 26 13:05:51 2025 -0700 Remove obsolete code. commit d28c5c516799acb6ce21e2bd83dfe583e3a5da5f Author: John Bowman Date: Tue Jun 24 09:47:55 2025 -0700 Enforce binary mode for xdr input and output. commit 3396b9bc7291143179b0d5bad9e5da7b6a46a4d4 Author: John Bowman Date: Thu Jun 19 10:37:15 2025 -0700 Remove explicit 'gif:' format from animate call. commit 2f60e660c525c4345f261a2f1d14a54964eb5d48 Author: John Bowman Date: Fri Jun 6 20:28:41 2025 -0700 Respect xmap transforms again. commit a9482f571bd2d672ae5ef085016ca5e875354864 Author: John Bowman Date: Mon Jun 2 13:26:44 2025 -0700 Fix last revision. commit 9df09017a6052bf96f0882d97dffb55c05867dda Author: John Bowman Date: Mon Jun 2 13:18:17 2025 -0700 Increase another CI timeout. commit 513efa6c314c3e81a18341bb39f02da0aff8b0e6 Author: John Bowman Date: Mon Jun 2 10:20:33 2025 -0700 Increase CI timeout. commit a2354f8cea0677b223fdeec8328a8a6261332164 Author: John Bowman Date: Sun May 25 12:20:34 2025 -0700 Clean up build-asymptote-CTAN. commit f3faabf8b067d6daa7016e3438258496759b1857 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon May 26 00:57:15 2025 -0600 REPO: Modify gitignore to exclude .idea everywhere. commit 052983e2eb4801fb6d17ed8d06dac18ae069f384 Author: John Bowman Date: Sun May 25 12:12:12 2025 -0700 Increment version to 3.05. commit 1cfeecfc04efb9f6457a6243b46441d911eba7f2 Author: John Bowman Date: Sat May 24 13:26:14 2025 -0700 Fix last revision. commit f21cd77f3a139d1bce048f2597d04715758cb1ed Author: John Bowman Date: Sat May 24 13:21:55 2025 -0700 List URLs to source code for dynamically linked MSWindows libraries. commit 118dd50b48e6a0de7b80d258ac54d96c4d4bbf1d Author: John Bowman Date: Sat May 24 13:01:02 2025 -0700 Change WebGL KEYS to comments. commit 888c93cb1b2d912cd392e450779d7fcb19a0ddac Author: John Bowman Date: Sat May 24 12:19:24 2025 -0700 Implement settings.keys: optionally add KEYS to WebGL output. commit 585e7894ea788aa467604e83db1dc3b0b544ab35 Author: John Bowman Date: Sat May 24 12:15:23 2025 -0700 Add KEY to cylinder and disk primitives. commit 2622dc2282b5484ca7d305f9ebd6583d517d2bb8 Author: John Bowman Date: Sat May 24 08:18:40 2025 -0700 Restore example. commit ff38310cda44d645255002a693d4c0adf4bd3f19 Author: John Bowman Date: Thu May 22 11:54:41 2025 -0700 Copy version.asy to top-level base directory for testing purposes. commit 201b3ebdd6e889ff252657d8e1307db4aff2afd6 Author: John Bowman Date: Thu May 22 10:53:50 2025 -0700 Fix unlink issues under MSWindows. commit 552844cf477675ace123d862f3a1dffab67fdade Merge: d93212c85 a8d72054d Author: John Bowman Date: Wed May 21 23:21:57 2025 -0700 Merge branch 'master' of github.com:vectorgraphics/asymptote commit d93212c85642efdb8e34ef5f4845b3fecc706c9e Author: John Bowman Date: Wed May 21 23:21:31 2025 -0700 Fix CMake builds. commit a8d72054d039101b8e148e9cb477bdc8fb57ac19 Author: John Bowman Date: Wed May 21 23:06:21 2025 -0700 Update build-asymptote.ps1. commit c005fe1517e6d016f5319d01cbfbe1c176fa1c08 Author: John Bowman Date: Wed May 21 21:54:15 2025 -0700 Update build-gui.yml. commit 095847b91c669ceca06572fda35076c1ad2ffe8c Author: John Bowman Date: Wed May 21 21:22:38 2025 -0700 Remove unused files. commit 579756ca19853a42b6d431f93bc96c3a44f76db9 Author: John Bowman Date: Tue May 20 21:37:25 2025 -0700 Update required setuptools version. commit 66719c732100dc6b34495f6575e7a139cba0edb9 Author: John Bowman Date: Tue May 20 21:33:50 2025 -0700 Update asygl. commit 30afe085fa08ae6c3a5e2d6244b212fd5a1f435e Author: John Bowman Date: Tue May 20 21:32:28 2025 -0700 Remove projection-dependence of shaders for correct rendering of embedded WebGL images. commit 08c4c25ec5b8c76a06ad51c0c0a8250848f6b307 Author: John Bowman Date: Mon May 19 10:31:13 2025 -0700 Revert "Update asygl." This reverts commit 0d13b088207cbbd8942f2eee55287d95a135957b. commit 3c9de631d62c19697c33f1d60b41d59c146f5d77 Author: John Bowman Date: Sun May 18 21:58:45 2025 -0700 Revert "Fix race condition between embedded WebGL scenes." This reverts commit 6ea778325776f1905e96d125b658388af182eb8d. commit 0d13b088207cbbd8942f2eee55287d95a135957b Author: John Bowman Date: Sun May 18 21:43:53 2025 -0700 Update asygl. commit 6ea778325776f1905e96d125b658388af182eb8d Author: John Bowman Date: Sun May 18 21:39:12 2025 -0700 Fix race condition between embedded WebGL scenes. commit ae4edfbd6a96a85d661178f516e183d246045e26 Author: John Bowman Date: Sun May 18 00:31:47 2025 -0700 git subrepo pull (merge) --force LspCpp subrepo: subdir: "LspCpp" merged: "273a4a224" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "273a4a224" git-subrepo: version: "0.4.9" origin: "???" commit: "???" commit dc093856266b7d4024c0711c1d056adec5917609 Author: John Bowman Date: Sat May 17 22:39:12 2025 -0700 Use pngdriver=png16malpha by default. Use ghostscript options "-dTextAlphaBits=4" and "-dGraphicsAlphaBits=4" for pngdriver. commit 88cc6268cf2e5870920ea27aae41be58fea4b69d Author: John Bowman Date: Sun May 11 15:07:01 2025 -0700 Increment version to 3.04. commit 664e2b2e90efcaf1ad0b71ff9d86589d92d0eb49 Author: John Bowman Date: Sun May 11 14:13:58 2025 -0700 Support --outname again in MSWindows build. commit c38d7617f1d61e850fb8ef86aa7e0ed6c6e5f420 Author: John Bowman Date: Sat May 10 17:01:24 2025 -0700 Simplify code. commit e8dcdee86938f21d2efe3c1a1442d4bf6678c34e Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat May 10 17:52:28 2025 -0600 W32: Fix implementation of renameOverwrite by parsing the return value correctly. commit f70c2a83e88d01f6048bf0c031be8263abea240b Author: John Bowman Date: Fri May 9 14:50:39 2025 -0700 Fix last revision. commit 0054f80ebe23f35e30ab16f81ef8c11d3820f7b8 Author: John Bowman Date: Fri May 9 14:40:27 2025 -0700 Fix last revision. commit 5d03a31162eff7271b1107d78124b1204523d9ca Author: John Bowman Date: Fri May 9 14:37:54 2025 -0700 Fix last revision; update FFTW++ files. commit e2c7b2730553876180933e2b4b640902d7d03568 Author: John Bowman Date: Fri May 9 10:42:04 2025 -0700 Port rename to MSWindows. commit acaf12bc3a642eec8c850fd12d32f353b3c94655 Author: John Bowman Date: Fri May 9 10:18:54 2025 -0700 Revert "W32: Replace rename with MoveFileExA on windows to allow overwriting." This reverts commit 1771aa6990c74397380c31d432da7630a8547fdc. commit 177125ffcf4419952ffb8b77b438a014c7e9b315 Author: John Bowman Date: Fri May 2 23:09:50 2025 -0700 Fix xasy setting. commit ee7686077c93e75bca61da337532170f0a310548 Author: John Bowman Date: Tue Apr 29 13:29:44 2025 -0700 Fix last two revisions. commit d9cbac891fde5b1706ae9f643ebd00c20e67b2f2 Author: John Bowman Date: Mon Apr 28 23:22:55 2025 -0700 Add missing setenv argument. commit 219f5b43b5a6da0cc21d87128153ff4d4f40090f Author: John Bowman Date: Mon Apr 28 22:51:07 2025 -0700 Implement setenv and unsetenv for MSWindows. commit e31c4b76781606665f8a575abb7334e10a03e4d9 Author: John Bowman Date: Mon Apr 28 21:56:24 2025 -0700 Remove obsolete code. commit 1767469b548e7ad293d7bfa69ddb482fde8f53b7 Author: John Bowman Date: Mon Apr 28 21:44:26 2025 -0700 Remove obsolete code. commit a4cf3480b540ab6fb9b24f1864d103a9437d6f31 Merge: 3bd2de12b 1771aa699 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Apr 22 01:01:39 2025 -0600 Merge pull request #545 from vectorgraphics/fix-windows-file-rename-override W32: Replace rename with MoveFileExA on windows to allow overwriting. commit 1771aa6990c74397380c31d432da7630a8547fdc Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Apr 21 21:15:57 2025 -0600 W32: Replace rename with MoveFileExA on windows to allow overwriting. commit 3bd2de12b5d900671a18a6a57832cde9af0ce2cf Author: John Bowman Date: Fri Apr 11 22:37:47 2025 -0700 Increment version to 3.03. commit 827761cd8d204f082b0f7b4dd23804a522142c77 Author: John Bowman Date: Fri Apr 11 21:08:33 2025 -0700 Fix 3D pixels. commit de51a196d67e785120b155ecc896bfadfab25ced Author: John Bowman Date: Sat Mar 29 20:41:05 2025 -0700 Document range type. commit 5baa95ba8eb5d22f9ad82c911d3d4e91f7da4a34 Author: John Bowman Date: Sat Mar 29 20:21:01 2025 -0700 Simplify code. commit 28f393d2660d13c2f8c0a6d78c2808b31996e1e8 Author: John Bowman Date: Thu Mar 27 21:51:47 2025 -0700 Initially seed random number generators with std::random_device. commit dba230b2e2566e2f37e9200c30e93384d8f90709 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Mar 27 21:57:30 2025 -0600 RAND: Use mt19937_64 as random engine. commit 34c48768703e205835a7782e1a0b87ab8af9e4dc Author: John Bowman Date: Thu Mar 27 20:26:12 2025 -0700 Generalize rand() to an arbitrary integer interval. commit 57c84e557c35848be522f8924803edc8d57386de Author: John Bowman Date: Thu Mar 27 20:08:50 2025 -0700 Set randMax to intMax. commit 8eebfd08f58ad80bb699972854b3f53ea6909911 Author: John Bowman Date: Wed Mar 26 19:42:03 2025 -0700 Fix typo in documentation of unitrand. commit 109d4e3ff02b8571d34a651f7aa1ec095183bb81 Merge: 0e4fe6547 12718954a Author: John Bowman Date: Sat Mar 22 22:13:52 2025 -0700 Merge pull request #540 from vectorgraphics/539-configure-creates-a-broken-makefile Fix #539: Avoid the use of realpath. commit 12718954af4ae659a9f84dc63f13152a4fe04f08 Author: John Bowman Date: Sat Mar 22 21:49:34 2025 -0700 Fix #539: Avoid the use of realpath. commit 0e4fe6547de55ea2ba1f0d39b723a4ca9a28bd74 Merge: c289e4329 7a4eedac8 Author: John Bowman Date: Fri Mar 21 10:59:23 2025 -0700 Merge pull request #538 from vectorgraphics/fix-msvc-registry-reading. Fix path search algorithm when asy is installed outside the standard directory. commit 7a4eedac80d99f93150a6063544890f6c6ff713d Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Mar 20 20:56:45 2025 -0600 W32: Remove "other" from move constructor. commit 64a61447afbdeacc0d18f93cc02ccc0b22bc743a Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Mar 20 20:56:17 2025 -0600 W32: Change implementation of getEntry so it returns valid value without glob. commit c289e4329b4f14cf855859ce267d9c9d8778b38a Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Mar 19 22:04:53 2025 -0600 PY: Add clarifying remarks to scan-asy-tests-cmake.py. commit bc9364b39a70165f024630cd37d49d5c13f02636 Author: John Bowman Date: Tue Mar 18 20:04:53 2025 -0700 Add executable flag. commit 923e912dd3a70f996ac3afe61cb5f90fe3d8264c Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Mar 18 21:01:02 2025 -0600 CMAKE: Update generated-asy-tests-list.cmake. commit 5ba3a64ce24ef2811426fc8f61d6467f6ddd7412 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Mar 18 21:00:02 2025 -0600 PY: Ignore any empty test directories in scan-asy-tests-cmake.py. commit afda977f80e37e004c689e3fd93e97d5ad531965 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Mar 18 20:59:44 2025 -0600 PY: Add newline to end of each test explicity in scan-asy-tests-cmake.py. commit 79951ab4ef8e447d25bba4d7c5b314a72ed66e8e Author: John Bowman Date: Tue Mar 18 09:11:44 2025 -0700 Fix #537: update documenation regarding default value of keepAspect. commit c1868d4570bfd17311aea0c4e759546c666e757c Merge: 91ef39b8a aac010bf4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Mar 16 20:54:12 2025 -0600 Merge pull request #536 from vectorgraphics/asy-test-scanning Add python script to scan and generate asy test file lists commit aac010bf4c0d68535956106dcc73705029593b4a Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Mar 16 20:09:04 2025 -0600 CI: Add step to check if there are missing asy unit tests in generated/asy-tests-list.cmake. commit 7cceff3385d157f9fd15703f7d23c0ae61a80636 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Mar 16 20:07:14 2025 -0600 CI: Rename lint-non-gui-python-files to misc-sanity-checks. commit c09b13e0d03fb1c0d79f5d2632247bbb6dbfd5fd Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Mar 16 15:23:23 2025 -0600 CMAKE Use generated asy-tests-list.cmake. commit 4dbc28d01c95030373fa549b781157599a3f4224 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Mar 16 15:06:07 2025 -0600 CMAKE: Add generated asy test list file. commit 9d9242ec3abd1c9851d5131d1b6a1ed3c440a903 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Mar 16 15:05:52 2025 -0600 CMAKE: Add script to scan and generate asy test list. commit 907459263a044fe38265fe6eb5f0b2253d86d947 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Mar 16 11:03:21 2025 -0600 REPO: Add .editorconfig to gitignore file. commit 91ef39b8a453fb46503e890c6fb040356c27a959 Merge: 5e43d12df 063d3984b Author: John Bowman Date: Tue Mar 11 21:24:11 2025 -0700 Merge pull request #534 from vectorgraphics/tmp-fix-doc Move operator init doc to the correct section. commit 063d3984b3dd8cb162a019a43976d2c2fa226c32 Author: Charles Staats III Date: Thu Mar 6 12:51:29 2025 -0800 Move operator init doc to the correct section. commit 5e43d12dfd1c25b1aa896ea08e528765a2c32aea Author: John Bowman Date: Sun Mar 2 19:40:32 2025 -0800 git subrepo pull (merge) LspCpp subrepo: subdir: "LspCpp" merged: "222549234" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "11c5053a1" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "b9b059a" commit 68d3bfd4e65cccb35cc3d193e9bb55dc3daf8f81 Author: John Bowman Date: Sat Mar 1 21:29:26 2025 -0800 Remove obsolete code. commit 92376e30115a3ba14e42504e744ca3551af8763b Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Feb 23 21:06:44 2025 -0700 EXR: Move tinyexr.h include to EXRFiels.cc. commit 382b2f115c48b606adc797e90865db4b333aa588 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Feb 23 21:06:31 2025 -0700 TINYEXR: Disable thread usage as it is causing issues with gc. commit b0f8ba5a6460926f28912cd7884df238c1ff5778 Author: John Bowman Date: Sun Feb 23 13:02:41 2025 -0800 Increment version to 3.02. commit 0af1f12b4e50e9662b47254a8241b062442a228f Author: John Bowman Date: Sun Feb 23 12:17:49 2025 -0800 Fix #526: Trying to multiply large integers results in floating-point exception and crash. commit 4c611fa3b2bcae51415a2ab83b1903bac7c5100b Author: John Bowman Date: Sun Feb 23 10:57:43 2025 -0800 Update autogen.sh. commit 79f844e73815505bdfcc3fc2757ae406063d509a Author: John Bowman Date: Sun Feb 23 10:46:35 2025 -0800 Update install-sh. commit 3b759b4b90a09af806ef3c453ab8ccf2f9ac6ba8 Author: John Bowman Date: Sun Feb 23 09:28:42 2025 -0800 git subrepo pull (merge) LspCpp subrepo: subdir: "LspCpp" merged: "1aa7ff654" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "9a46924e7" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "b9b059a" commit d929a3c08aba1158d37f3d17243241dbc28a7c8d Author: John Bowman Date: Sat Feb 22 21:23:13 2025 -0700 Fix segmentation fault under MacOS. commit cefbbaddaeeab925441b002d97b731476f93d808 Author: John Bowman Date: Sat Feb 22 19:46:25 2025 -0800 Remove unused code. commit 63089568927a5fd68efa6dd25e9e8a10fb4ce72e Author: John Bowman Date: Tue Feb 18 11:48:42 2025 -0800 Fix maintainer-clean; update scripts. commit e483a80faaba046f39c2ad8fe32e0dec99ed1c35 Author: John Bowman Date: Tue Feb 18 11:10:16 2025 -0800 Add SILENT_MAKE option (set to @ by default). commit 5e1c3d9a41ab5dc5f72b9947d9ec79555b6caea6 Author: John Bowman Date: Tue Feb 18 10:46:07 2025 -0800 Fix typo in Makefile.in. commit eae8589a8ba557354bf627e6807d73c1c7ab39b7 Author: John Bowman Date: Mon Feb 17 00:04:44 2025 -0800 Increment version to 3.01. commit 6d4b620bfe8895c4e1d1fce7c81e61d499bf765f Author: Charles Staats III Date: Sun Feb 16 21:45:13 2025 -0800 Fix CPPFLAGS. commit edf66a773d0aaf7086e68bc4bcad6409e672e4ba Author: John Bowman Date: Sat Feb 15 11:29:57 2025 -0800 Simplify code. commit fe941345cf1f44a690c16f370d3b4c8db4cdd5c3 Author: John Bowman Date: Fri Feb 14 20:25:08 2025 -0800 Search for glm in current directory; don't require tirpc under FreeBSD. commit a399a7dd6e9784d5d18696e66fd148c453e17ec6 Author: John Bowman Date: Fri Feb 14 14:38:18 2025 -0800 Always look for includes in current directory first. commit 76d289e234c752336333ed9367366059ac978dbd Author: John Bowman Date: Fri Feb 14 10:54:22 2025 -0800 Update asymptote.spec. commit 38e5328c1595d187da029c83d61a18061d55800f Author: John Bowman Date: Fri Feb 14 10:43:37 2025 -0800 Update ax_pthread.m4. commit 8fb038c69868ee0205f8b3852a98167e21fbffe0 Author: John Bowman Date: Fri Feb 14 10:38:18 2025 -0800 Prebuilt missing gc automake files. commit a0c2ea71ef180d391a769d6e78b049571edf0f55 Author: John Bowman Date: Mon Feb 10 16:15:41 2025 -0800 Increment version to 3.00. commit cf4243cb97f7d700a320cb93a0e7a47328c32b35 Author: John Bowman Date: Mon Feb 10 14:44:17 2025 -0800 Fix make maintainer-clean. commit 2f0a7cfb60a6a3475ee52990154ba28244832d17 Author: John Bowman Date: Mon Feb 10 14:24:29 2025 -0800 Update config scripts. commit 214552f58197224a5b3a7efd4a15a6757c90813b Author: John Bowman Date: Mon Feb 10 13:35:08 2025 -0800 Remove libtool dependence from configure. commit 7fe989a89945c93c85e1e3cbb3cec4ce7460e170 Author: John Bowman Date: Mon Feb 10 11:33:00 2025 -0800 git subrepo pull (merge) LspCpp subrepo: subdir: "LspCpp" merged: "84c9831f2" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "aa2d67051" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "b9b059a" commit d31fd43aad1be82b57517fb4f9bab41a8e9575f7 Author: John Bowman Date: Mon Feb 10 01:26:47 2025 -0800 Update install-sh. commit 947c860f9430ef249407d2a051ed2b7e263c29e6 Author: John Bowman Date: Sun Feb 9 13:51:32 2025 -0800 Disable dependency tracking for one-time gc builds. commit cc35f7e78d0dec53c50b8c34f1318500c3e13187 Author: John Bowman Date: Sun Feb 9 11:32:32 2025 -0800 Increment version to 2.99. commit 83de5cbc8268d689b52c07c87927cae3ab94e245 Author: John Bowman Date: Sun Feb 9 10:01:51 2025 -0800 Distribute prebuilt GUI files. commit 23b2d7e2391f1b4a180778d6c1c98f6703fca10e Author: John Bowman Date: Sat Feb 8 22:13:41 2025 -0800 Increment version to 2.98. commit ab5e4e770bd96978ae5b211b752eab81433874c8 Author: John Bowman Date: Sat Feb 8 22:13:00 2025 -0700 Revert "Move -std=c++17 to Makefile." This reverts commit 71b86dfe8d509eceb5ab4adce66b273135c0b4ca. commit 10be59fbd725216c3221c62fa64cac251dcd7131 Author: John Bowman Date: Sat Feb 8 22:11:39 2025 -0700 Revert "Apply -std=c++17 only to C++ compilation." This reverts commit dcc187b1f97b317fc0aa11aac27606dc5aa3ba86. commit 6a0277facfaefa82a001b02e38b074cf1267b431 Author: John Bowman Date: Sat Feb 8 20:57:47 2025 -0800 Fix clang warning. commit dcc187b1f97b317fc0aa11aac27606dc5aa3ba86 Author: John Bowman Date: Sat Feb 8 20:50:39 2025 -0800 Apply -std=c++17 only to C++ compilation. commit 8df48262a3e2a149774f8fdbe0a1a0b315052d51 Author: John Bowman Date: Sat Feb 8 20:41:03 2025 -0800 Fix runtime.pl warnings. commit 71b86dfe8d509eceb5ab4adce66b273135c0b4ca Author: John Bowman Date: Sat Feb 8 19:41:04 2025 -0800 Move -std=c++17 to Makefile. commit 3e1e10f75af1d549c40320c57763690c08b22c62 Author: John Bowman Date: Sat Feb 8 17:30:38 2025 -0800 Allow compilation without libtirpc-devel (not recommended though as this would disable XDR and V3D support). commit 5736020c97ce62282e25d0c94c8bb2793f27c381 Author: John Bowman Date: Sat Feb 8 17:00:20 2025 -0800 Fix symbolic link. commit 46532008179a304c517e0d467d3d1d23d88c8153 Author: John Bowman Date: Sat Feb 8 12:28:25 2025 -0800 Qualify nullptr. commit 0ab6a0d09fac84efbe8d443d782d06f518f1aea2 Author: John Bowman Date: Sat Feb 8 11:26:24 2025 -0800 Fix last revision. commit fd7ae5be14a71d6080a5b7f497551c8c369693b1 Author: John Bowman Date: Sat Feb 8 11:03:46 2025 -0800 Clean up symbolic link and hidden directories. commit 071af187de37bef85987ad4af9e75f31d117cf5b Author: John Bowman Date: Sat Feb 8 10:14:25 2025 -0800 Clean up Python caches. commit ea26e0d22416de4510b6cc5b5f929c3d5a480c57 Author: John Bowman Date: Fri Feb 7 09:24:41 2025 -0800 Remove empty and temporary files and directories. commit e2917d5092263d49f7cb9bbe34dbbb7b74a6ac34 Author: John Bowman Date: Thu Feb 6 22:44:25 2025 -0800 Increment version to 2.97. commit a867372f32b18d9943a5b21430d2652f69e6854b Author: John Bowman Date: Thu Feb 6 23:04:45 2025 -0700 Fix last revision. commit 317e04545e5bbb1cdad3169600e592b40780966d Author: John Bowman Date: Thu Feb 6 20:38:39 2025 -0800 Enforce C++17 standard. commit 9e7a68caf7cdd75c5c29d6845b20abab9f7738e1 Author: John Bowman Date: Thu Feb 6 20:35:19 2025 -0800 Fix #513: libGLX not found. commit 72e4a21c0939cef70b79cda7d3b04066ffa40a25 Author: John Bowman Date: Thu Feb 6 19:59:11 2025 -0800 Add DoubleLineMidArrow to feynman.asy. commit 53693b8deabae750395dacdd6416c1ac2a6b3411 Author: John Bowman Date: Wed Feb 5 19:08:01 2025 -0800 Fix #514: fix erase() when settings.render=0. commit 63137b558638788b0f12fa479629f5e7a5a9a55c Author: John Bowman Date: Tue Feb 4 20:56:31 2025 -0800 Fix listvariables segmentation fault. commit bf45fb80c3ab62d657a0bd1bab15ac8669ed143c Author: John Bowman Date: Tue Feb 4 20:24:58 2025 -0800 Standardize settings. commit 2c49492af03fa38c24b29e493d9d4e69c21ea2e2 Merge: abe03f77f 47c76b583 Author: John Bowman Date: Tue Feb 4 19:59:52 2025 -0800 Merge pull request #519 from vectorgraphics/unify-lsp-ast-files. Move LSP-related absyntax::* functions into lsp*.cc files commit 47c76b5830c9fd55e5fee68a0fbcb71b540f6e08 Author: John Bowman Date: Tue Feb 4 19:47:06 2025 -0800 Standardize auxillary errortest files. commit 8e52525d791a5b771702f7705a2d9fe9c4179527 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Feb 4 18:56:19 2025 -0700 WCE: Use a dedicated errorsNonTempalate.asy for testing templated imports on a non-template files. commit 7e5edf6ff1071f057cbe8282e7e8e537cbc67ee8 Merge: f943e5562 abe03f77f Author: John Bowman Date: Tue Feb 4 17:29:35 2025 -0800 Merge branch 'master' into unify-lsp-ast-files. commit abe03f77f33a30509dee9e8f6d3d73e96657aad3 Author: John Bowman Date: Tue Feb 4 17:28:55 2025 -0800 Update errors. commit 45c2d3a11cf42267d75f7c1350cb53787b2fd975 Author: John Bowman Date: Tue Feb 4 17:26:27 2025 -0800 Qualify path to version.asy. commit f943e55620049390cba424f504efd66d30b20d84 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Feb 4 17:22:22 2025 -0700 LSP: Fix lspstm.cc. commit bb46f22145a3528b82684a24bcdbc883b10cab70 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Feb 4 17:21:47 2025 -0700 LSP: Fix lspfundec.cc. commit 77764a0581c0d7c9e065a185aedf6c09fd033051 Author: John Bowman Date: Mon Feb 3 22:39:16 2025 -0800 Fix include. commit aefbccad0e33bf613f26d70fe1097c0d8138c7d4 Merge: b068bad97 efad9f676 Author: John Bowman Date: Mon Feb 3 22:30:39 2025 -0800 Merge branch 'master' into unify-lsp-ast-files. commit eca17db9487edc1d7299bf0685b400c9b5398b09 Merge: efad9f676 f0de5475d Author: John Bowman Date: Mon Feb 3 22:24:51 2025 -0800 Merge pull request #518 from vectorgraphics/external-asy-keywords-el Use external asy-keywords.el in windows build. commit efad9f676bb2ed0bc67898f0fa834dc40751b0e1 Author: John Bowman Date: Mon Feb 3 22:17:39 2025 -0800 Fix generation of asy-keywords.el. commit 166fdf1f954e4050465f59b319e96f6f3b71435a Author: John Bowman Date: Mon Feb 3 17:15:52 2025 -0800 Improve templated import errors. commit 2643b3266bcf097515bb3aa3d8c375f6a55171e2 Author: John Bowman Date: Thu Jan 30 14:15:03 2025 -0800 Fix compilation warning under -O3; add file read tests. commit b068bad9707830c649584ef0bf4c2994d99a7a2d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Feb 2 02:55:29 2025 -0700 MAKE: Add lspstm to Makefile.in. commit e01df50b38766f17feb13782e9f3d8689eca591a Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Feb 2 02:55:12 2025 -0700 LSP: Move HAVE_LSP functions in stm.cc to lspstm.cc. commit aa559e19d5a3e57a3aa2cf23e2e1b35a0637a31e Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Feb 2 02:31:13 2025 -0700 MAKE: Add lspfundec to Makefile.in. commit 704eb42721ae4cafb0fa8fd7e5d849d0207a69d1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Feb 2 02:29:12 2025 -0700 LSP: Move HAVE_LSP functions in fundec.cc to lspfundec.cc. commit bee996462a61d68ef046b5d9e455af179ea3dd61 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Feb 2 01:46:37 2025 -0700 MAKE: Add lspexp to Makefile.in. commit a5220020df7677e7a1e0f25fdcfce649795ead91 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Feb 2 01:42:25 2025 -0700 LSP: Move HAVE_LSP functions in exp.cc to lspexp.cc. commit c90620f69c785c976963aeb9e93f64298ed7f53f Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Feb 2 01:12:56 2025 -0700 MAKE: Add lspdec to Makefile.in. commit f86bc3b41e0b311cc9a88d0a63ca77fb59d25873 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Feb 2 01:01:40 2025 -0700 LSP: Move HAVE_LSP functions in dec.cc to lspdec.cc. commit c4d16b8facf9a8053e9c1984d2b3853ea7a3709d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Feb 2 00:09:25 2025 -0700 LSP: Fix header include issues on LSP. commit 598ca098060ad4f4acde7fa8fc32b8f4fd29c9ba Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Feb 1 23:49:09 2025 -0700 git subrepo pull (merge) --branch=master LspCpp subrepo: subdir: "LspCpp" merged: "4011f7d77" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "4011f7d77" git-subrepo: version: "0.4.9" origin: "???" commit: "???" commit 17110bda961f0145250c3847c31f82b8d97478b0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Feb 1 23:44:53 2025 -0700 git subrepo pull --branch=master LspCpp subrepo: subdir: "LspCpp" merged: "d5ff0b01b" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "d5ff0b01b" git-subrepo: version: "0.4.9" origin: "???" commit: "???" commit f0de5475d0492fa39917493a72b09fa7e82852ed Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Feb 1 23:21:35 2025 -0700 BUILD: Add asy-keywords.el to the list of requried documentation files for windows build script. commit 420d4b358c9e36f21726d69031269bdd0d76fa21 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Feb 1 23:10:05 2025 -0700 CMAKE: Disable miscfiles generation in msvc/release/with-external-doc-files preset. commit 14e8d64a27c2f37b4eca9c14df44adfa886f6f3b Merge: 184c6cf4f f7cd5ba0d Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Jan 29 22:12:28 2025 -0700 Merge pull request #516 from vectorgraphics/unix-install-cmake Add install targets to cmake build for linux & additional tests to asy commit 184c6cf4fb3f8f88b457741e030ad8f1bfcdd631 Author: John Bowman Date: Wed Jan 29 10:14:32 2025 -0800 Fix error message. commit bfcc7e11e4b4d314e787046cf56a0cd0d80424ab Author: John Bowman Date: Wed Jan 29 10:10:40 2025 -0800 Fix compilation flags. commit f7cd5ba0d874e83d06d54a22bfa623e259a72660 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jan 28 23:07:20 2025 -0700 CI: Simply asy test arguments. commit 82a7653b9f43f33becd4dce3f5aa144f623830fe Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jan 28 23:01:19 2025 -0700 CMAKE: Add check labels to asymptote tests. commit 9b2f8c0641f5bf251f6ffbea4630abd6f039de0b Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jan 28 17:58:13 2025 -0700 CMAKE: Add additional asy tests. commit cee7ccb9f8b1a4a5f20e6601b6ac7936c791183d Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jan 28 17:43:41 2025 -0700 CMAKE: Add manpage to linux-install. commit 96b55da7800b8c0c31dab92e5126c1e18a275ad6 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jan 28 17:39:42 2025 -0700 CMAKE: Add manpage generation to cmake build process. commit 4aad4e7ab798b2d8ac4d44baec2af40f4aa4e533 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jan 28 17:39:33 2025 -0700 PY: Add script for creating manpage. commit cf9f84b0efa108629c359d1174d32f8ddaf9c02f Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jan 28 03:25:33 2025 -0700 CMAKE: Add basic unix install cmake file. commit 18faad766dac7f0fed0438c41eaa31135522b326 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jan 28 03:51:59 2025 -0700 CMAKE: Fix dab7080c37b0bf79fe67e2ca1ea22e5db716a66d. commit dab7080c37b0bf79fe67e2ca1ea22e5db716a66d Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jan 28 00:36:29 2025 -0700 CMAKE: Fix CTAN build on linux with cmake. commit 621dbbeb2be8d2fa5e124051a8e5c5f7291746df Author: John Bowman Date: Sat Jan 25 17:07:50 2025 -0800 Fix #497: Install xasy.py with executable permission. commit 37fb5cfd12162d950445c957d9cd3359d4406d90 Author: John Bowman Date: Sat Jan 25 10:09:07 2025 -0800 Remove trailing whitespace. commit 8d42b82c8d4a175fdb87f2d1996b30f14de26bc3 Merge: ae949e77f 03973ef58 Author: John Bowman Date: Sat Jan 25 10:03:53 2025 -0800 Merge branch 'master' into privacy. commit ae949e77f75e63cfa70d56e89c2d37b8e86eaf09 Merge: 56e144cd8 3683c5260 Author: John Bowman Date: Sat Jan 25 10:02:54 2025 -0800 Combine loops. commit 56e144cd81715e52d4168fb96c90905c2fa6a9c1 Author: Charles Staats III Date: Thu Jan 23 21:03:18 2025 -0800 Make received template parameters private. commit 36ca3b801fb7f8d72865f2440a47e9b4f751003b Author: Charles Staats III Date: Thu Jan 23 20:30:20 2025 -0800 Make fields autounraveled from private types private. commit 290c589c9326a56923a8e164b4ff867aed060cb0 Author: Charles Staats III Date: Thu Jan 23 19:20:52 2025 -0800 Correct private wildcard unraveling. commit 541d889757f5e212c959478e3f7e533b0c7eed86 Author: Charles Staats III Date: Thu Jan 23 18:21:11 2025 -0800 Correct behavior when privately unraveling type. commit 21ca3f0e4ad420a6d59b4d6d12b4d8a0946ef7a9 Author: Charles Staats III Date: Thu Jan 23 18:01:46 2025 -0800 Fix privacy issue with overloaded unravel. commit 6f2eba307373334156e1050fb164a88db692ef50 Author: Charles Staats III Date: Thu Jan 23 17:59:35 2025 -0800 Return to using record in entry rather than frame for permissions. commit ce2ba4f37d75089f5360c956373bd27fc7334517 Author: Charles Staats III Date: Thu Jan 23 15:50:45 2025 -0800 Correct one case of privacy enforcement. commit 3acc7765b3042032ea52acfdd699aed3de69ead1 Author: Charles Staats III Date: Thu Jan 23 14:58:01 2025 -0800 WIP: Working on privacy commit. commit 462446dfa70dceae148d9b5df8bd2313fabc7d70 Author: Charles Staats III Date: Tue Jan 21 21:14:35 2025 -0800 Minor comment improvements. commit 6e0dc363d5db817ce7096fd87ecf5adf2703b370 Author: Charles Staats III Date: Tue Jan 21 16:54:58 2025 -0800 Add errorFreeTestTemplate.asy. commit da7c299309da72c42d7411de67538ad36c8e46da Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 02:19:33 2025 -0700 CI: Rearrange tests so that all tests except gc is run in linux-sanity. commit 104743ca4d7904c74ef0a5e42819211d852e87e2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 02:07:38 2025 -0700 CI: Split latex initializtion into a separate action. commit a0809e0a94a88c439737a69c5c0775e161cc9f3e Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 02:01:37 2025 -0700 CI: Add linux-sanity step to CI. commit bd5ae35a18ea072ce41adeb6253c8054649114f2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 01:39:02 2025 -0700 CMAKE: Remove display names from presets not meant for user. commit 695fa716bee24b2c928bbe36499c8a82dacbbfc9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 01:34:44 2025 -0700 CMAKE: Add compact-zero mode to preset. commit 96984d3fe20b1c77b17ecbca832ab364f737c8a7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 01:29:00 2025 -0700 CMAKE: Rename some profiles for consistency. commit 296f466543646b1ec6a79405a8fee3b17db681cf Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 01:27:01 2025 -0700 CMAKE: Add linux-only flags to presets. commit 3fdbcd35de0721a268a765522aacb04e3242e427 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 01:25:17 2025 -0700 CMAKE: Remove ReleaseWithDebugInfo preset since it's not used often. commit ec91c4a4bc7ae97041c115a8ea8742f3dd8cbb8a Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 00:58:18 2025 -0700 CMAKE: Split cmake build presets. commit 271575796bab091866fa0ed27ac03860abc0dcf3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 00:45:43 2025 -0700 CMAKE: Bump minimum version in json. commit 26fcedc1e26f3dc469ad30b9e8089d8f3afc2235 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 00:35:06 2025 -0700 CMAKE: Add support for COMPACT=0 build mode. commit b465a9a249e1d370650ac899512d74238661f301 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 00:32:13 2025 -0700 CMAKE: Add SET_COMPACT_ZERO option. commit 52a05a2319ff12d3340391c27cdfbbbcc757796e Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Jan 18 13:28:47 2025 -0700 MAKE: Remove additional files from Lsp build process during clean. commit 3605ff0b93bd80c3989ce8d066badb31918f6074 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Jan 18 13:24:43 2025 -0700 AC: Add in LSPCPP_SUPPORT_BOEHM_GC=OFF explicitly to LSP_CMAKE_OPTIONS if gc is off. commit 67f066bde5004643c4c608242a1f7ec3108825a5 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Jan 18 13:24:24 2025 -0700 AC: Change ac_cv_use_gc to enable_gc in lsp configuration. commit 07e207a72c56d15e2805bb09360ec4046f5c24ce Author: John Bowman Date: Thu Jan 16 20:41:34 2025 -0800 Format plain*.asy files. commit cf55d140aa2821eb0b941dc9dcb1a0646d728843 Author: John Bowman Date: Fri Jan 24 21:35:48 2025 -0800 Update documentation. commit 414d57d6d61a69d6345c84d30909a37dc69207b1 Author: Charles Staats III Date: Thu Jan 16 19:53:36 2025 -0800 Improve comment. commit 0db6b3b5962697aeaa3e4741e1d143cbb9cf0366 Author: Charles Staats III Date: Thu Jan 16 19:37:36 2025 -0800 Delete unnecessary comment. commit efcdb3ea715bc9826bb2cb119eb330d61f6487d9 Author: Charles Staats III Date: Fri Jul 26 16:21:12 2024 -0700 Apply type rename after merge. commit ee927accd425e097d48c214f627ba0b61b15efbd Author: Charles Staats III Date: Fri Jul 26 11:26:32 2024 -0700 Switch some modules from `typedef` to `using`. commit 09a787c5e18e2c96b339edecd55da48fa4800084 Author: Charles Staats III Date: Fri Jul 26 11:24:38 2024 -0700 Add comments to justify "using" syntax. commit 99aa297b02e0846132fe14b41c4282c99343be21 Author: Charles Staats III Date: Tue Apr 19 21:08:01 2016 -0700 More formatting fixes. commit e6741efb5ac373172bd3c5c51e43e37ae7a2085c Author: Charles Staats III Date: Tue Apr 19 21:02:19 2016 -0700 Improve formatting of new lines in camp.y commit 2c5a2cb6946112cfd81be0b7512f9ba888dd5b6c Author: Charles Staats III Date: Tue Apr 19 20:52:13 2016 -0700 Add using keyword as typedef alternative. commit d02b1d9df8608646850ae5c98fc6c70759c8e29a Author: Charles Staats III Date: Sat Dec 28 16:33:54 2024 -0800 Unify spellings of two perl variables that should be one. commit 890e39407221ae267f297b612eacc66a2d5b7ccd Author: Charles Staats III Date: Tue Jan 21 16:39:41 2025 -0800 Show error if module is re-imported with wrong param names after correct import. commit c31e102ec19c312a5cceaf6fcd401586daef724b Author: Charles Staats III Date: Tue Jan 21 15:24:58 2025 -0800 Remove unused function from dec.cc. commit 6f69e9a28ea8543bad606e7469a7dd84dc9bd68d Author: Charles Staats III Date: Tue Jan 21 14:55:15 2025 -0800 Change some "0"s to "nullptr". commit 858723a17fdc4026ac975d548313bbdd4c1aa8d2 Author: Charles Staats III Date: Sun Jan 19 20:37:01 2025 -0800 Omit unneeded getLocation() before encode(). commit 5e82af8e66841645356569334795d40cb2c508e3 Author: Charles Staats III Date: Fri Jan 17 17:01:29 2025 -0800 Non-statically nested types cannot be used in templates. commit 34b0f710cd2dbf0cf11c448f7f1431ca6c65a708 Author: Charles Staats III Date: Fri Jan 17 16:32:07 2025 -0800 Move encodeParent into trans::coder class. commit eddd420c2dc06d03b87670e36263364cd308afb8 Author: Charles Staats III Date: Thu Jan 16 15:24:24 2025 -0800 Improve error message. commit 426840a26e67dd50a8061e67b85242752a39b9e8 Author: Charles Staats III Date: Thu Jan 16 15:19:43 2025 -0800 Add comment. commit 5f1775da15b1c49d9b9563cdcfa44c5b6808da0a Author: Charles Staats III Date: Thu Jan 16 15:14:00 2025 -0800 Remove transAsTemplatedRecordBody. commit 201c1404dc24053092ab0fac65b48114b0b507c1 Author: Charles Staats III Date: Thu Jan 16 14:58:31 2025 -0800 Remove `transAsRecordBody` which did very little. commit 27a534dd30390f963fa17490f60976a3d624e50a Author: Charles Staats III Date: Thu Jan 16 14:25:42 2025 -0800 Simplify loadModuleExp class. commit 96e19d4e23be968452fef8851f355caeea4f3739 Author: Charles Staats III Date: Wed Jan 15 22:23:19 2025 -0800 Clean up and document push/pop parents. commit 2693b6d11f8644947368cdf18af64eaeeca59efa Author: Charles Staats III Date: Wed Jan 15 20:29:35 2025 -0800 Clean up code a bit. commit e0e505f6a81fe2cdb48975809540e77800090604 Author: Charles Staats III Date: Wed Jan 15 20:10:38 2025 -0800 Guard boost stacktrace by DEBUG_CSTACKTRACE macro and add comment. commit 57bc300eec90f51f35577cb19a9118211b4b73d1 Author: Charles Staats III Date: Wed Jan 15 16:59:30 2025 -0800 Add test for passing parameters through multiple templated imports. commit aba0a3376f1d3e58a709e049131ddba48380961c Author: Charles Staats III Date: Wed Jan 15 16:53:03 2025 -0800 Apparently working solution (needs refactor). commit 871bfc95ef6a10975ff6c17993b937addd8688c2 Author: Charles Staats III Date: Tue Jan 14 14:23:05 2025 -0800 Add comment. commit eabdd863bc322d2228ba00691b2309862f99a8a5 Author: Charles Staats III Date: Thu Jan 9 20:57:10 2025 -0800 Switch to namedTy from namedTyEntry. commit 6315977004ca2d2495a16be214ddb7907b29fd37 Author: Charles Staats III Date: Wed Jan 8 14:51:51 2025 -0800 Minor improvements to usableInTemplate function. commit 1ce0f05b73e7a43af56609dcf193f97884ff8d79 Author: Charles Staats III Date: Wed Jan 8 10:31:28 2025 -0800 Debugging: Print out translation-time info about specified type. commit 34ed26cf65b08a0b5c40d69d81c6f5f7c2e68c03 Author: Charles Staats III Date: Tue Jan 7 21:32:33 2025 -0800 Untested function `usableInTemplate` added to dec.cc. commit a0b0ce0846244b655776b611b30cff242d39606d Author: Andy Hammerlindl Date: Fri Jan 3 11:33:43 2025 +1100 Being better implementation of templated imports. commit 03973ef58ffb4814f30b5a691bb58f4ecce29059 Merge: 3683c5260 253e90142 Author: John Bowman Date: Sun Jan 19 15:19:19 2025 -0800 Merge pull request #515 from vectorgraphics/fix-build-issues-jan2025 Fix build issues. commit 253e90142bfa7073308b94cbd516fa059f3edf53 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 02:19:33 2025 -0700 CI: Rearrange tests so that all tests except gc is run in linux-sanity. commit 7c504ee74a43ad5d53c73c0bc1c5ace12dbbf1df Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 02:07:38 2025 -0700 CI: Split latex initializtion into a separate action. commit 20bf8d91347e26bd6f4a0c65e7618776563a7b09 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 02:01:37 2025 -0700 CI: Add linux-sanity step to CI. commit 907048c255c55cd0e4d87116cc419b70b27b8e67 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 01:39:02 2025 -0700 CMAKE: Remove display names from presets not meant for user. commit cad6d929e21cc2ecc6e0be158a38190fc39ba484 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 01:34:44 2025 -0700 CMAKE: Add compact-zero mode to preset. commit 63d5c152e58f913892091e6b868f550a24181b16 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 01:29:00 2025 -0700 CMAKE: Rename some profiles for consistency. commit f4008e156f0689dd882c11f896fb1abac4ef40e3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 01:27:01 2025 -0700 CMAKE: Add linux-only flags to presets. commit 906d2c4857b815ac4efa8f8dca118ed60ca17463 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 01:25:17 2025 -0700 CMAKE: Remove ReleaseWithDebugInfo preset since it's not used often. commit 0807361df886367420a3d01e6ff066119b7c4ece Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 00:58:18 2025 -0700 CMAKE: Split cmake build presets. commit 41be8a2445554f01f0e97d0c87ee62444901d3cc Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 00:45:43 2025 -0700 CMAKE: Bump minimum version in json. commit f129628dc98dceb9309e6d3a467679d1f5a220c4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 00:35:06 2025 -0700 CMAKE: Add support for COMPACT=0 build mode. commit 94d86829818ce8d49d86909051d9ec5362880610 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 19 00:32:13 2025 -0700 CMAKE: Add SET_COMPACT_ZERO option. commit 89e55870b08c6ab108d30aaa58669d25afc342c6 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Jan 18 13:28:47 2025 -0700 MAKE: Remove additional files from Lsp build process during clean. commit 2c978af1f69a9b09d8a9d621a47802b6a0dd0b1c Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Jan 18 13:24:43 2025 -0700 AC: Add in LSPCPP_SUPPORT_BOEHM_GC=OFF explicitly to LSP_CMAKE_OPTIONS if gc is off. commit 00e0ccfd2bebdf50ed8bcb831e154a557339c546 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Jan 18 13:24:24 2025 -0700 AC: Change ac_cv_use_gc to enable_gc in lsp configuration. commit 3683c52606fd53adc4b49d3c8645429e16435040 Merge: 4aa41ce83 5b2096a2a Author: John Bowman Date: Thu Jan 16 20:43:06 2025 -0800 Merge branch 'using_typedef'. commit 5b2096a2ae80641b76264b2df2037c3b95824bca Author: John Bowman Date: Thu Jan 16 20:41:34 2025 -0800 Format plain*.asy files. commit b66679ead880464224dd7512547cd1be4206da88 Merge: 129ddc0f8 ef2fd57f7 Author: Charles Staats III Date: Thu Jan 16 20:18:19 2025 -0800 Merge branch 'using_typedef' of https://github.com/vectorgraphics/asymptote into using_typedef commit ef2fd57f781bb37f7f42bebf9d15213510078e7a Author: John Bowman Date: Thu Jan 16 20:18:00 2025 -0800 Update documentation. commit 129ddc0f825a4c0e32c42c6eeec984a63999e727 Author: Charles Staats III Date: Thu Jan 16 19:53:36 2025 -0800 Improve comment. commit 7a3818e937aebee80f271917904503b1a9d3c32d Author: Charles Staats III Date: Thu Jan 16 19:37:36 2025 -0800 Delete unnecessary comment. commit 4aa41ce8300046efa473ef8f1ebe5ea68212fb10 Merge: ed93f99b6 766355606 Author: John Bowman Date: Thu Jan 16 19:26:33 2025 -0800 Merge pull request #510 from vectorgraphics/509-perl-script-has-misspelled-variable-name Unify spellings of two perl variables that should be one. commit e4be79c7500fae335c95b82e042b9297ece1f547 Merge: 7c60d7bec ed93f99b6 Author: Charles Staats III Date: Thu Jan 16 18:13:14 2025 -0800 Merge branch 'master' into using_typedef commit 766355606b9d8753216674461a2aef83bda351d0 Merge: c62a29c8a ed93f99b6 Author: Charles Staats III Date: Thu Jan 16 18:08:26 2025 -0800 Merge branch 'master' into 509-perl-script-has-misspelled-variable-name commit 1c881a27c2637b5b47864f19a6debfcf9e7e5cfc Author: Andy Hammerlindl Date: Fri Jan 3 10:55:17 2025 +1100 Assert type in encodeLevel is a record. commit 4c062b25a506218b94b3bedb2d5b2e9c083cdf66 Merge: 65e472028 5ea9cb326 Author: Charles Staats III Date: Thu Jan 2 15:12:31 2025 -0800 Merge branch '508-error-compiling-nested-template-imports' of https://github.com/vectorgraphics/asymptote into 508-error-compiling-nested-template-imports commit 65e4720283baab39cc365ec82203b26ecc472014 Author: Charles Staats III Date: Wed Jan 1 18:41:19 2025 -0800 Debugging WIP commit 5ea9cb326a92fb62654e348783a3b8352bc663c9 Merge: 65e0876ff ed93f99b6 Author: John Bowman Date: Wed Jan 1 15:50:22 2025 -0800 Merge branch 'master' into 508-error-compiling-nested-template-imports. commit ed93f99b6649e20afd4fd4c2d80e364b98785c93 Author: John Bowman Date: Wed Jan 1 15:47:31 2025 -0800 Fix settings type. commit 65e0876ffc323cb721580c6dcc60f8856a1c5493 Author: John Bowman Date: Sun Dec 29 20:24:06 2024 -0800 Avoid redefining preprocessor macro. commit 429fd699bcc24d099206ca7dd896d96e6be71dda Merge: 4bfd6b754 0c3849387 Author: Charles Staats III Date: Sun Dec 29 20:18:34 2024 -0800 Merge branch 'autounravel' into 508-error-compiling-nested-template-imports commit 0c3849387bb668d258a2f71a13528d1cf70d3e04 Merge: 23e177013 5d8454c61 Author: John Bowman Date: Sun Dec 29 20:04:12 2024 -0800 Merge branch 'master' into autounravel. commit c62a29c8a5dc572ad29362cb2596804bdaa934ac Merge: ef211932b bb5b8780f Author: Charles Staats III Date: Sun Dec 29 09:36:13 2024 -0800 Merge branch 'master' into 509-perl-script-has-misspelled-variable-name commit 5d8454c61df9e4fee383e028061581cd02c0220c Merge: 06d4a678c 7561c251e Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 28 23:12:06 2024 -0700 Merge pull request #512 from vectorgraphics/fix-lsp-warnings-dec2024 Fix LSP warnings for December 2024 commit 7561c251e5e3cb522844c43728c8fe81f10b3804 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 28 22:44:13 2024 -0700 CMAKE: Pass in _WIN32_WINNT to LSP project. commit 70d15e77c0d056f6fa76dc527fa36f50b56e8a3b Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 28 22:44:01 2024 -0700 CMAKE: Fix _WIN32_WINNT macro. commit af76da3f3dde90fa5d76b5f393df5672c18a21e6 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 28 22:41:15 2024 -0700 git subrepo pull --branch=build-enhancements-dec-2024 LspCpp subrepo: subdir: "LspCpp" merged: "1c3beeedd" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "build-enhancements-dec-2024" commit: "1c3beeedd" git-subrepo: version: "0.4.9" origin: "???" commit: "???" commit 97ae331d540258840daccda4376261b787aa4696 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 28 22:40:41 2024 -0700 git subrepo pull (merge) --branch=master LspCpp subrepo: subdir: "LspCpp" merged: "d81801194" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "d81801194" git-subrepo: version: "0.4.9" origin: "???" commit: "???" commit c7d09099a0b2782aa0d1ce1a312abd35e2a68c31 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 28 22:38:26 2024 -0700 REPO: Fix subrepo parent. commit 06d4a678c7d1a3dcd1afde1c53e2010631ecf3fe Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 28 21:09:52 2024 -0700 PY: Change ascii encoding to utf-8. commit bb5b8780f31fed2bd1e7eac5cf3a17027714445e Merge: fc5766d27 e2a029805 Author: charlesstaats Date: Sat Dec 28 22:38:24 2024 -0500 Merge pull request #511 from vectorgraphics/perl2py Convert several perl scripts to python commit e2a029805d2f24cabd1c1e62420bdc7c2dbbec4d Author: Charles Staats III Date: Sat Dec 28 19:18:15 2024 -0800 Delete extra blank line. commit ae69112ed1c9f693fa86199c0cefd33c41df43a9 Author: Charles Staats III Date: Sat Dec 28 19:09:59 2024 -0800 Port long options to asy-list.py. commit 885630517831a2653b9d385e4a38a679a878146c Author: Charles Staats III Date: Sat Dec 28 18:24:41 2024 -0800 Fix alignment of generated C++ comment blocks. commit 354432ac6bf3b45a957b2723af92a4c348f6c796 Merge: 55b8760a5 fc5766d27 Author: Charles Staats III Date: Sat Dec 28 18:09:59 2024 -0800 Merge branch 'master' into perl2py commit 55b8760a538b707bfb60291babd226d391a9bee8 Author: Charles Staats III Date: Sat Dec 28 17:56:50 2024 -0800 Fix a python shebang to python3. commit 56e807a02864a1c3b22168d7e514f2c590c9b0d2 Author: Charles Staats III Date: Sat Dec 28 17:56:04 2024 -0800 Update asy-misc-files.cmake to use keywords.py rather than keywords.pl. commit e74e82bb5bb290e2f8a256a1baec03ff3232dbc1 Author: Charles Staats III Date: Sat Dec 28 17:47:51 2024 -0800 Fix pylint errors. commit 7e52fa705bd0affad93e4e464cb83882e4679b64 Author: Charles Staats III Date: Sat Dec 28 17:28:30 2024 -0800 Sort imports in findsym.py. commit 1628b9f409ac05e271028e40edb187ce00828cfb Author: Charles Staats III Date: Sat Dec 28 17:26:26 2024 -0800 Reformat opsymbols.py with slightly different settings. commit 0a3e0cb123dc969056de146ef6d1e5119cd1d6ff Author: Charles Staats III Date: Sat Dec 28 17:17:35 2024 -0800 Format new python files. commit 0efe596d63da9d372dbe31163b62566f5e20e24f Merge: be5d58e36 5cf1ed445 Author: Charles Staats III Date: Sat Dec 28 16:50:42 2024 -0800 Merge branch 'master' into perl2py commit ef211932bb0907bf7e5c4c82d614f8109cc40585 Author: Charles Staats III Date: Sat Dec 28 16:33:54 2024 -0800 Unify spellings of two perl variables that should be one. commit fc5766d273295067dfdea39ada5cc95dd7ee3584 Author: John Bowman Date: Sat Dec 28 13:13:29 2024 -0800 Add to last revision. commit e54cb453002258c46aa376850a73f4070fe89d88 Author: John Bowman Date: Sat Dec 28 11:15:53 2024 -0800 Access xasy and debug settings as variables. commit 8703e2a6316862dc6dcd6d247c7faf0a91b9fc2f Merge: 5cf1ed445 94ccb43df Author: John Bowman Date: Fri Dec 27 22:48:11 2024 -0800 Merge pull request #507 from vectorgraphics/addr-build-improvements-dec2024 Additional build improvements for december 2024 commit 94ccb43dfd7618d047eeb0d6bc9261a9f4ad25ca Author: John Bowman Date: Fri Dec 27 22:38:21 2024 -0800 Run gc/autogen.sh. commit 492d88321e4c693f57f716c1b481c9316cc4ea6b Author: John Bowman Date: Fri Dec 27 22:25:57 2024 -0800 Update build-asymptote. commit 9a22de4ac344b69fd8e8ccfe1462db662d3b2f52 Author: John Bowman Date: Fri Dec 27 20:30:18 2024 -0800 Remove extra spaces; fix gc compilation; require libtool instead of libtoolize. commit 4bfd6b754a8e5dc810bce84510201bed578c4778 Author: Charles Staats III Date: Fri Dec 27 17:32:51 2024 -0800 Debugging #508: print stack trace. commit 7fbc53c5807e6836260e6cc0a73a73f5227e7cc6 Author: John Bowman Date: Thu Dec 26 20:54:22 2024 -0800 Check for libtoolize. commit 637ba8f6cf939e1367e577108409c6cd3a85ae5e Author: John Bowman Date: Wed Dec 25 22:22:45 2024 -0800 Quote ENABLE_LSP_MACRO. commit 3bcf5fdd5788000ff1c86cdb671afce5037fb376 Author: John Bowman Date: Wed Dec 25 19:36:48 2024 -0800 GC: Update configure.ac. commit 468f63ac40e191951d23523b040a5f5b9f3b3cf0 Author: John Bowman Date: Wed Dec 25 16:17:47 2024 -0800 Remove obsolete code. commit 91d4d8d76f919d9729ff7cb9ef80be42b58c7f2d Author: John Bowman Date: Wed Dec 25 16:00:34 2024 -0800 Update autoconf version. commit 0916cfcb4fb4c3dc8a6a902898b4fb8be2e9b269 Author: John Bowman Date: Wed Dec 25 15:35:18 2024 -0800 Remove obsolete configuration code. commit 23e177013d8d2ee12cbcc16e4ff584c4dfaa6139 Author: Charles Staats III Date: Tue Dec 24 19:15:48 2024 -0800 Fix issue with autounravel overrides of builtin record ops. commit 8405b6616b07cbe856bd409e2d8389581b590b71 Author: John Bowman Date: Tue Dec 24 09:39:09 2024 -0800 GC: Update GC to latest stable release. commit 814739609d95ac1475fc86f0db3161045491ae1a Author: John Bowman Date: Tue Dec 24 09:35:38 2024 -0800 git subrepo clone --force --branch=v8.2.8 https://github.com/ivmai/bdwgc gc subrepo: subdir: "gc" merged: "ee59af372" upstream: origin: "https://github.com/ivmai/bdwgc" branch: "v8.2.8" commit: "ee59af372" git-subrepo: version: "0.4.9" origin: "???" commit: "???" commit e2af319e39aeb939b67edd0c81c9bab80d8276c2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 23 22:05:54 2024 -0700 CMAKE: Change HAVE_GL to HAVE_LIBGL during configuration. commit 3c5828d9b66f487b13f6f96dd71e9203a7b0565e Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 23 19:38:53 2024 -0700 GC: Set +x on autogen.sh. commit 54253b0425e88d3ea2b8cb9bdeac2b5831e21f98 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 23 18:14:03 2024 -0700 MAKE: Support local gc in build process. commit 889ba00a5ab95526c1ee44fa614bc6e640b255fa Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 22 14:52:37 2024 -0700 GUI: Remove click from dev dependency list. commit 2b0f0c33f127b9cdea7d496cf6cf7b720e727607 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 22 14:52:27 2024 -0700 GUI: Remove click from buildtool. commit 203ea75d0c9a7b460309f54296aba105cced8f27 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 22 02:50:59 2024 -0700 git subrepo pull LspCpp subrepo: subdir: "LspCpp" merged: "80e204a4f" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "80e204a4f" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "cce3d93" commit a02ebe837ea4977b7b56f05a6c955e02438c7c12 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 22 02:09:55 2024 -0700 CMAKE: Use subrepo-cloned libatomic_ops and bdwgc for asymptote. commit 92a60fbc9190e8bbdf3c4129f3da9baeaaf39205 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 22 02:09:39 2024 -0700 VCPKG: Remove gc from vcpkg install list. commit b5a6fd02a63debff8830884154f8ea7a8b26ef59 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 22 02:09:25 2024 -0700 REPO: Remove libatomic_ops from ignore list. commit 15cc98d1576ac69a5407b1c465acc6f89514860d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 22 01:15:03 2024 -0700 git subrepo clone --branch=v7.8.2 https://github.com/ivmai/libatomic_ops subrepo: subdir: "libatomic_ops" merged: "4c00f978c" upstream: origin: "https://github.com/ivmai/libatomic_ops" branch: "v7.8.2" commit: "4c00f978c" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "cce3d93" commit 535935c7b9cd0e193281c74916485c1dff4cf867 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 23 03:05:25 2024 -0700 REPO: Unignore gc files. commit e9e4d3359c8288b90439db8d19c0c76246c37a9d Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 23 03:05:09 2024 -0700 REPO: Rename bdwgc to gc. commit daf3d0972286f43d706be64b6929cbbf288f964a Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 21 23:36:41 2024 -0700 git subrepo clone --branch=d1ff06cc503a74dca0150d5e988f2c93158b0cdf https://github.com/ivmai/bdwgc subrepo: subdir: "bdwgc" merged: "d1ff06cc5" upstream: origin: "https://github.com/ivmai/bdwgc" branch: "d1ff06cc503a74dca0150d5e988f2c93158b0cdf" commit: "d1ff06cc5" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "cce3d93" commit 5cf1ed4457f398b1d0c71d6b4b7b12599b685f86 Author: John Bowman Date: Thu Dec 19 11:43:37 2024 -0800 Remove diagnostic. commit be5d58e36fd848f29f8f8f2a07b86a70b995d8fb Author: Charles Staats III Date: Sat Dec 14 18:49:35 2024 -0800 Translate keywords.pl to python. commit 1b157a79685433a9676bd3a6c155e9c6560adbfe Merge: 2735aad23 77ba9cd2b Author: Charles Staats III Date: Sat Dec 14 17:51:30 2024 -0800 Merge branch 'autounravel' of https://github.com/vectorgraphics/asymptote into autounravel commit 2735aad2347a99630560d6833e0de36abf005255 Author: Charles Staats III Date: Sat Dec 14 17:49:52 2024 -0800 Change applyAutoUnravel bool parameter to enum for readability. commit 772e8cb7e41edb38077b3a725a0ecaa188e8bdbf Author: Charles Staats III Date: Sat Dec 14 17:25:10 2024 -0800 More uniform code in addRecordOps function. commit 77ba9cd2bc0746c72caa891f7281be7bee23c2e4 Author: John Bowman Date: Sat Dec 14 11:48:06 2024 -0800 Improve documentation of autounravel. commit b4b9d6e56221d8a35b10adc430f6a7a8402b580a Author: John Bowman Date: Sat Dec 14 11:41:57 2024 -0800 Improve documentation of autounravel. commit d94cb9643d60f3beb77d8d466c5dfacd028cea7f Author: Charles Staats III Date: Sat Dec 14 09:47:55 2024 -0800 Make rational.asy use autounravel. commit 4601cc946d130cc66b3ad8d003061cf994d15502 Merge: a526dfc9a 0c3610e03 Author: Charles Staats III Date: Sat Dec 14 09:11:24 2024 -0800 Merge branch 'autounravel' of https://github.com/vectorgraphics/asymptote into autounravel commit 77f85b7ac80908e5d8471a2e6c83fa79318533a6 Merge: 607b655e9 6e5a08cb3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 14 01:05:32 2024 -0700 Merge pull request #504 from vectorgraphics/bump-vcpkg-version VCPKG: Bump vcpkg baseline version. commit 6e5a08cb3388130ff82f403a9da464cf69a50935 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 14 00:07:47 2024 -0700 git subrepo pull LspCpp subrepo: subdir: "LspCpp" merged: "d12eab466" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "d12eab466" git-subrepo: version: "0.4.9" origin: "???" commit: "???" commit 0c3610e039c3380127014197f83c1c2330f71172 Author: John Bowman Date: Fri Dec 13 23:01:49 2024 -0800 Simplify documentation of autounravel. commit bbd32434aaf4e60dcdd574e6d0f0d34557804206 Author: John Bowman Date: Fri Dec 13 18:57:50 2024 -0800 Update documentation. commit a526dfc9ae21a91304f50dddece178ac88dfa240 Merge: fe4aae516 2686dcaa7 Author: Charles Staats III Date: Fri Dec 13 16:25:42 2024 -0800 Merge branch 'master' into autounravel. commit f99492aa23fa11459d7f347d12cc6fcb3e8101f2 Merge: fe4aae516 607b655e9 Author: John Bowman Date: Fri Dec 13 16:19:53 2024 -0800 Merge branch 'master' into autounravel. commit fe4aae5163c8584a9995357b33721df9c159c69e Author: Charles Staats III Date: Fri Dec 13 16:11:13 2024 -0800 Remove .vscode/c_cpp_properties.json commit 2c34fbcaf9d487f6fd7a9299649dbc9f76860e83 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 12 23:27:22 2024 -0700 VCPKG: Bump vcpkg baseline version. commit 607b655e99a4c7e18a90fc175108cc3b7ea55890 Author: John Bowman Date: Wed Dec 11 11:37:00 2024 -0800 Optimize integer mod. commit 5d546e33962e18cabebc274649bfa02d7ea9ef8f Author: John Bowman Date: Wed Dec 11 11:26:15 2024 -0800 Fix typos in manual. commit 4cc5c30100c16bfc28be5a77302b3e2b81ce266b Author: John Bowman Date: Mon Dec 9 15:40:23 2024 -0800 Add 1D rational array ops. commit 2686dcaa7c72b9cf53065f331b66697c9b308158 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Dec 10 00:23:24 2024 -0700 BUILD: Remove asy-keywords.el from the list of required files in build-asymptote.ps1. commit 329c0d13295f6bafa7599d0144c60f64d564d26f Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 9 21:18:15 2024 -0700 CMAKE: Re-enable generation of misc files in msvc/release-with-external-doc-files preset. commit 57a934a9323fb2b67cb417eacf08d41a0bcfde0b Author: John Bowman Date: Sat Dec 7 12:02:29 2024 -0800 Fix last revision. commit 893121595d45be4ef40f2c0d1509587f7fffa680 Author: John Bowman Date: Thu Dec 5 08:49:02 2024 -0800 Use mask to mod against non-negative powers of two. commit 875384fae1f19cce4f91a66a56ffc9b687408173 Author: Charles Staats III Date: Fri Dec 6 17:45:44 2024 -0800 Translate opsymbols.pl to python. commit 0e4e1916478201f9e720a0e4b09c097fefa59785 Author: Charles Staats III Date: Fri Dec 6 16:22:01 2024 -0800 Migrate findsym.pl to findsym.py. Tested: I used a logging statement in the original `findsym.pl` to check that all of the files written by `findsym.pl` followed the pattern `*symbols.h`. I then checked that after the change, the resulting files differed from the originals by a single character (since the comment now cites `findsym.py` rather than `findsym.pl` as the source). The sole exception was `opsymbols.h`, which had no changes at all since it is generated by a different script. commit 5f99d1f2944e784ca295ba75055c3f50f5bc2d59 Merge: 96e6e3926 d3003d159 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Dec 4 22:31:03 2024 -0700 Merge pull request #502 from vectorgraphics/add-el-files-to-asy-win-setup Add asy-{init,mode,keywords}.el, and other build enhancements commit aa2caec3d96bfd7de9d4b62d8fc04a74d33b256a Author: Charles Staats III Date: Wed Dec 4 17:49:07 2024 -0800 minor improvements to findsym.py commit 5ab20779f4e92121bc4a9d6c389336c427866297 Author: Charles Staats III Date: Wed Dec 4 17:07:56 2024 -0800 minor code improvements commit ae7db8a3e5e023470bc69b5916f42154377d127c Author: Charles Staats III Date: Wed Dec 4 15:44:04 2024 -0800 Remove the empty addFunctionOps functions. commit f5109f1f8320501563c8683e1045be937321c1d7 Author: Charles Staats III Date: Wed Dec 4 15:00:15 2024 -0800 Draft of findsym.py. commit d3003d1596199bbce6bcc3c237964496aae36730 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Dec 3 21:47:30 2024 -0700 CI: Add misc files to linux asymptote package. commit ec649e1c20cd59afe7eb25111fdb175ac71e9e45 Author: Charles Staats III Date: Tue Dec 3 16:34:17 2024 -0800 Convert asy-list.pl to a python script. The comments and python code were originally generated by AI based on the original asy-list.pl code; however, both were subsequently checked and modified by a human to improve both Python coding style and accuracy to the original script. The change was tested by comparing the output of `make asy-keywords.el` before and after the change. The resulting files are identical except for the comment naming the generating script, which was originally asy-list.pl but is now asy-list.py. Thus, the two output files differ by a single character. commit 5818d9f7e360461ffb55e503d72a94512eb5b44c Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 03:56:35 2024 -0700 CI: Download built misc files during asy installer packaging step. commit ffa285470d210fb0f5f28b28477970670bfe3a33 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 03:56:13 2024 -0700 CI: Add building of misc files to build-asy-windows workflow. commit dfbe364cb41f544f1b6675ce517bfc831797b427 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 03:53:50 2024 -0700 CI: Add building of misc files to build-asy-linux workflow. commit 032fb674b1c4bcb7dca918c7ce4977cb2a7f00dc Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 03:13:09 2024 -0700 BUILD: Add asy-keywords.el to required external documentation files in build-asymptote.ps1. commit 5869d017c3b3405537f6004a37ff0ee2be3dbe66 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 03:11:55 2024 -0700 CMAKE: Add ENABLE_MISCFILES_GEN variable to CMakePresets.json. commit 3ced15a05ad2e6ae76285131ad9c97bf6b74bf08 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 02:51:34 2024 -0700 MAKE: Update asy-keywords.el generation to use asy-list.pl's arguments. commit b41ccb0ff2240eed1b0d1f48c5c5a9afecff935a Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 02:46:00 2024 -0700 CMAKE: Add misc files to win32 install target. commit 13981466588ab32c849bb7ae44cb9a3d36c230a0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 02:45:46 2024 -0700 CMAKE: Add build scripts for asy misc files. commit b79ad0b67393e8133de59284430c389512b418a0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 02:45:20 2024 -0700 BUILD: Add long options to asy-list.pl. commit c356d4b62e9e22b1b0a3444bb7426fb7ecce5a07 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 02:44:34 2024 -0700 BUILD: Add script to generate asy.list. commit 49e1b645e4bdeddbbbf39568b8556faf39368318 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 01:09:51 2024 -0700 BUILD: Modify build script to use asydoc directory as destination. commit 7571acfb3b797be4656c81b8c8ca03029d86ec2f Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 00:39:07 2024 -0700 DOCS: Update install documentation to use asydoc. commit e45c3fca19b73996ca49128b727a2544b6673cea Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 00:38:56 2024 -0700 CI: Change download path for asymptote.pdf to asydoc. commit 74fb29f0cdd9ee515da3b3ce5fa4336d5a23e7bc Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 00:37:41 2024 -0700 CMAKE: Change external documentation dir to asydoc. commit b7d068d67ae0e5ae2b6af143942771bb8c445e43 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 2 00:34:35 2024 -0700 CMAKE: Add base/asy-{init,mode}.el to windows setup file. commit 96e6e392693227cce3afd1077d7db8de822c790c Author: John Bowman Date: Sun Dec 1 20:16:14 2024 -0800 Share asy-keywords.el with MSWindows build. commit e81d98429fd814b7e20f659c6d6215aca446d4ef Merge: 8a21f0a96 be02adf7f Author: John Bowman Date: Sun Dec 1 20:00:50 2024 -0800 Merge pull request #500 from vectorgraphics/initPosition Initialize positions to nullPos. commit 8a21f0a96f53c7fa16b56e9a9433e48f56eb697a Merge: 327038c6f ce74561ff Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 1 01:25:25 2024 -0700 Merge pull request #501 from vectorgraphics/fix-py-linter-dec-2024 CI: Fix non-GUI python linter CI workflow. commit ce74561ffec3089afc132d730acae7cf1e836b89 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 1 01:10:35 2024 -0700 CI: Add remarks to check-if-non-gui-py-files-changed step. commit 62ebc749f667c6e637d9266feb0883d11c807efe Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 1 00:36:29 2024 -0700 CI: Fix non-GUI python linter CI workflow. commit be02adf7f2b42a22ead3351e748a2d7b7e45d6f5 Author: Charles Staats III Date: Sat Nov 30 13:01:21 2024 -0800 Initialize positions to nullPos. commit bbd0a7eded35877813b3e820ee707a141d876ce2 Author: Charles Staats III Date: Sat Nov 30 09:14:49 2024 -0800 Use C++17 for static analysis tools in vscode. commit 327038c6f3df340087bd78951d594cba442d7f27 Merge: cb9b4c581 1dfce3088 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 29 03:03:00 2024 -0700 Merge pull request #499 from vectorgraphics/additional-ci-linter Add linting of non-GUI python files to precheck. commit 1dfce3088bebd74a56620fb8f8726aef57bfc661 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 29 02:42:19 2024 -0700 PY: Add documentation for CompileOptions. commit def2504af370f822c1ac2aa752b5f9c74eba9c91 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 29 02:03:51 2024 -0700 CI: Add linting of non-GUI python files to PR precheck workflow. commit 7a5c5a2a00cd27bce7d8b4b77806eaa7a1ff0906 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 29 02:01:32 2024 -0700 CI: Add workflow files for linting non-gui py files. commit 33c5a8b5f928ca8df3ed4428a79b808ac919a2a7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 28 23:13:35 2024 -0700 SH: Add linting scripts for UNIX. commit 9912d518e3bbf9e3dd54391037baaa6ead23a230 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 28 23:11:33 2024 -0700 PY: Fix pylint issues on non-GUI python files. commit 240c57dc58aae72cd7a4d975385b4dd24539ed57 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 28 23:04:13 2024 -0700 PY: Run isort and black on non-GUI python files. commit f864e70cfd76b5e740aff0abf7d8335005c31114 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 28 22:52:51 2024 -0700 PS1: Add powershell scripts for linting python files. commit 4288d8b067fa7572d0332b2d852ba4e596687c09 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 28 22:49:10 2024 -0700 PY: Add script for getting lintable files. commit 671b2bb9d220b979f173a9e7cfcd56030a99d657 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 28 22:28:07 2024 -0700 PY: Add linter configuration files. commit 48410efdb75191c215765480a167f17b54544f73 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 28 21:04:06 2024 -0700 PY: Add requirements.lint.txt. commit cb9b4c5811c8f103c5dceab749441469b7f55ce3 Merge: 595e01868 72ad028e1 Author: John Bowman Date: Thu Nov 28 21:21:46 2024 -0800 Merge pull request #498 from vectorgraphics/use-subrepo-for-cmake CMAKE: Use subrepo directories for cmake builds. commit 595e018686102685fefdeaa34b2c268b021a9c0c Author: John Bowman Date: Thu Nov 28 21:17:53 2024 -0800 Increment version to 2.96. commit 72ad028e110b1c743d08366f7f79f152405d5fd0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 28 20:37:56 2024 -0700 CMAKE: Remove duplicates in arguments passed to gen_preprocessed_depfile.py. commit 5071e0457dc95a8956011ac460867a67a33f399b Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 28 20:12:42 2024 -0700 Revert "temp! Add argument view to gen_preprocessed_depfile." This reverts commit c22912e96803e244ed16a046e60ff49c4a7edade. commit c22912e96803e244ed16a046e60ff49c4a7edade Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 28 20:12:22 2024 -0700 temp! Add argument view to gen_preprocessed_depfile. commit 53ac190b36c6787a162f124279a804f2082d0c57 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 28 19:49:48 2024 -0700 CMAKE: Use subrepo directories for cmake builds. commit 9a07ab8822dffc63cece044327ceeb3b6e7d3ffa Author: John Bowman Date: Thu Nov 28 15:37:18 2024 -0800 Support editline again. commit 38f95276550adbadad55b1efd8353f024289dec3 Author: Charles Staats III Date: Wed Nov 27 18:24:54 2024 -0800 Less hacky handling of operator init. commit d0d8fffb8f558cb5abb1f6da73dea5d8ede06000 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Nov 26 23:30:44 2024 -0700 FMEM: Bump fmem version. commit f8f653299cdf70166ad482ba2f3667e5d2ce564c Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Nov 26 23:00:18 2024 -0700 BUILD: Deactivate python virtual env after build-asymptote.ps1 is done. commit 98c698f56e8e3936085d15d39759c12d74dfcc59 Author: John Bowman Date: Tue Nov 26 16:10:44 2024 -0800 Fix type of Default in map. commit 02788a6129ec93a553919be7cb01750e78309e63 Author: Charles Staats III Date: Tue Nov 26 14:11:18 2024 -0800 Add another test case for builtinOps. This test case checks for the presence of operator== for a nested struct as a field that can be unraveled from the outer struct. If builtinOps were not autounraveled, it would fail without the second call to addRecordOps in recorddec::transAsField. commit d679251f503d405bd2877c45b0a76ba0a27e594f Author: Charles Staats III Date: Tue Nov 26 13:54:39 2024 -0800 Autounravel modes; operator init hack. commit 75eccaccdea24d678607b9f49d29aece12bf03d4 Author: Charles Staats III Date: Mon Nov 25 19:31:21 2024 -0800 Use autounravel for operator init. commit 1b95781e8fb352875ea247d9ca7a4a5be4869850 Author: John Bowman Date: Mon Nov 25 08:52:36 2024 -0800 Remove test file that violates CTAN rules. commit 9b91f6fbd2bbe96391ebb81489efee2bbc5c9059 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 25 02:51:02 2024 -0700 BUILD: Force exit when build-asymptote.ps1 hits an error. commit 4608b094ab2e562924ed5c62ecdda0fe8fad6529 Author: John Bowman Date: Mon Nov 25 01:18:15 2024 -0800 Revert "CMAKE: Use subrepo clones of lspcpp and tinyexr." This reverts commit 99f67caa4fd8847b46afa5b4a0b56180937e15ed. commit d9bea99d53ea1174ca5502fd7de8b95707c67364 Author: John Bowman Date: Sun Nov 24 23:21:05 2024 -0800 Force creation of asygl.js. commit 9e5941ba1bee7d1555b9aa51f37f639d4e1cbeb4 Author: John Bowman Date: Sun Nov 24 20:30:06 2024 -0800 Support building LSP with or without GC. commit adb07aea26e7e89b7b600c8f2811fea64b10c22d Author: John Bowman Date: Sun Nov 24 17:45:44 2024 -0800 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "220a861ca" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "220a861ca" git-subrepo: version: "0.4.9" origin: "???" commit: "???" commit f240306af01490de4880237ba21eff585cb07e52 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Nov 24 15:34:03 2024 -0700 AC: Use LspBuild directory for buidling LSP. The reason for this is CMake produces Makefile, which can collide with asymptote's main makefile. commit 9cef4211d6c32bfbd8f873210fba807fbf4096d5 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Nov 24 15:33:22 2024 -0700 LSP: Support fully non-system GC for LSP build. commit 352c0eb471cb28737383c02d0c88b42a8729af51 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Nov 24 15:29:09 2024 -0700 git subrepo pull LspCpp subrepo: subdir: "LspCpp" merged: "a0dda786" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "a0dda786" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "cce3d93" commit c3ab1a90771772789d09db6f24b63023e7049fad Author: John Bowman Date: Sun Nov 24 14:08:06 2024 -0800 Simplify code. commit 99f67caa4fd8847b46afa5b4a0b56180937e15ed Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Nov 24 14:37:18 2024 -0700 CMAKE: Use subrepo clones of lspcpp and tinyexr. commit 2c6bf08923621793d8952dc5479ff453358edff8 Author: John Bowman Date: Sun Nov 24 13:40:53 2024 -0800 Fix typo. commit 55858fd8cc663e3d8456731ab728a9b6116abf26 Author: John Bowman Date: Sun Nov 24 13:32:49 2024 -0800 Remove empty directory. commit ed77bdf43450365006b371ee8a9f911d7cb06eba Author: John Bowman Date: Sun Nov 24 13:26:50 2024 -0800 Remove tinyexr workflow. commit 6ac8d5f4a74dc11159050141f971972aed70f926 Author: John Bowman Date: Sun Nov 24 13:21:17 2024 -0800 Update tinyexr workflow. commit b60de16bbdb4179f83019e94b2afc201dc188457 Author: John Bowman Date: Sun Nov 24 12:22:15 2024 -0800 Fully support --enable-gc again. commit 7e39f6c3c1ff8686459a2cc156318ab03ee8e7dd Author: John Bowman Date: Sun Nov 24 12:19:31 2024 -0800 Remove .gitmodules from tinyexr; update make clean. commit bf929f7156987bae6bb4e4735ad23e547b9ffc53 Author: John Bowman Date: Sun Nov 24 11:51:05 2024 -0800 Use git subrepo instead of repeatedly refetching external repos. commit ab0560904b3afaef3ba251414bd598d85da8fad1 Author: John Bowman Date: Sun Nov 24 11:20:20 2024 -0800 git subrepo clone --force git@github.com:syoyo/tinyexr subrepo: subdir: "tinyexr" merged: "5fcb4dcb6" upstream: origin: "git@github.com:syoyo/tinyexr" branch: "release" commit: "5fcb4dcb6" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit f77e74c541f74dbd4ca1ef27b3e24d1aeb4115d2 Author: John Bowman Date: Sun Nov 24 11:13:53 2024 -0800 git subrepo clone --force git@github.com:vectorgraphics/LspCpp subrepo: subdir: "LspCpp" merged: "ecb49130a" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "ecb49130a" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit 8d59161a58971df2ca96354c564ab49c47beefef Author: John Bowman Date: Sun Nov 24 10:50:52 2024 -0800 Move external directories to top level source directory. commit f6ca24a5936f2b768fd206c4196fdab8e5a33c95 Author: John Bowman Date: Sat Nov 23 21:58:14 2024 -0800 Fix include. commit ff6b7f0b0483c2d63ff5067f78e8ed45a82864b1 Author: John Bowman Date: Sat Nov 23 21:19:47 2024 -0800 Reorganize INSTALL-VCPKG.md. commit 5ed6b9926984a4536ee34617f40fb4033db40c13 Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Nov 22 15:13:42 2024 -0700 AC: Support GC with LSP build. commit 2bdc2a96b220ed5ba4897cc42d51cf6c41d5ad04 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 22 15:05:34 2024 -0700 AC: Fix compilation with gc and vcpkg in makefile. commit 7d5507ebdc7ee29b3878de529892957150e5534c Author: John Bowman Date: Thu Nov 21 21:48:18 2024 -0800 Add missing separator. commit 1ceb7541e680a9395eaf72d22ef1399bfbc4d17a Author: John Bowman Date: Thu Nov 21 21:40:00 2024 -0800 Read revision for asy-keywords from version.txt. commit 8c33742e767cb7adcca48412bd9d24d23c655028 Author: John Bowman Date: Thu Nov 21 21:33:05 2024 -0800 Revert "Build asy-keywords.el at the same time as version.asy." This reverts commit 8d1ee04795b046813768e7dce91e907e7a0fd141. commit cb59fd1bff20f11a87825762424d71fb54a07f1e Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 21 21:11:21 2024 -0700 CMAKE: Use "CACHE INTERNAL" option for configuring subprojects. commit a14e1f0e5008844fdba824eecc65be154f37029b Author: John Bowman Date: Thu Nov 21 09:47:54 2024 -0800 Reinstate INSTALL. commit 8d1ee04795b046813768e7dce91e907e7a0fd141 Author: John Bowman Date: Thu Nov 21 09:44:00 2024 -0800 Build asy-keywords.el at the same time as version.asy. commit 7e3e493700c6796fbc4d88d24d2d46a12bbfee91 Author: John Bowman Date: Thu Nov 21 09:30:47 2024 -0800 Fix #495: glitch in Makefile.in. commit 2dd68b5960b6d58ca76feb4cccdd09dbddedd00d Author: Charles Staats III Date: Thu Nov 21 09:28:57 2024 -0800 Add comment documenting possibly unneeded line. commit 0573715db1b57fa01bbcf4a4ad8253fdc880300d Author: John Bowman Date: Mon Nov 18 15:14:21 2024 -0800 Simplify code. commit da097adec020c68da722c9421ca019353b5787b4 Author: John Bowman Date: Mon Nov 18 14:42:21 2024 -0800 Support --disable-gc again. commit 7084c2abde5d3a142a969e69691e9cacfb35626a Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Nov 17 23:00:17 2024 -0700 CMAKE: Bump minimum required version to 3.27. commit 9b6f0329c8f3e17e1741ea77d535a952ed3ca1d9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Nov 17 22:44:56 2024 -0700 CMAKE: Append /gc to gc's include paths. commit 7d7c0158adc0874fb355bde7c868033a6dbd4852 Author: John Bowman Date: Sun Nov 17 14:36:27 2024 -0800 Hardwire gc include directory for CMake. commit 8ee400f9a29353434b543103b20cb07c73a2a7b6 Author: John Bowman Date: Sat Nov 16 23:52:09 2024 -0800 Remove unknown pragmas. commit 0c8b655686dc1463d87a9287e22111a582e0e8f6 Author: John Bowman Date: Sat Nov 16 23:46:38 2024 -0800 Fix include paths to Boehm GC header files. commit 830d26d541817aba995c8526c869cab3744c76d2 Author: John Bowman Date: Sat Nov 16 23:20:54 2024 -0800 Disable LSP again if libboost is unavailable. commit a1c5eaa4bd770bff5cba9dec17d278b0b3ff4823 Author: John Bowman Date: Sat Nov 16 23:06:33 2024 -0800 Support sigsegv again. commit 69ee1515ede63df109e14fe49d2d4009b4791727 Author: John Bowman Date: Sat Nov 16 22:59:24 2024 -0800 Use consistent formatting. commit 2696886e8fbd49af2ca113fdb29b46169366f58b Author: John Bowman Date: Fri Nov 15 10:45:48 2024 -0800 Fix #494: Ignore missing PyQt5 module. commit cbbcfd2335a02654acd333f5ff89302586960720 Author: John Bowman Date: Fri Nov 15 10:41:35 2024 -0800 Fix #493: qualify fpclassify namespace. commit cb1a3c9e29cca940f08c9fd2527649a8fa108fab Merge: efb5c8d2e fd4d0019b Author: John Bowman Date: Fri Nov 15 10:37:26 2024 -0800 Merge pull request #492 from vectorgraphics/fix-misc-asy-build-issues-293 Fix additional windows build issues in 2.93 commit fd4d0019b976c8a66db11a7ec85746a4f987763b Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 15 03:07:31 2024 -0700 BUILD: Copy setup file before moving to main directory. commit 733b4f08b45a0f4c819d290c23cc6480b814a8c3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 15 03:04:35 2024 -0700 BUILD: Add "-Force" option to Copy-Item for copying documentation to extfiles. commit efb5c8d2e7fc8b621967fd390e0481e6b18fd6ba Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 15 03:03:13 2024 -0700 CMAKE: Clarify option for offscreen-rendering. commit b368dcd8473a66e1048b612865ea56252e9bf013 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 15 02:08:51 2024 -0700 CXX: Add remark to glew.c. commit 50f47b6ed5566fb3c3ad1edce4f4a4819bf99225 Author: John Bowman Date: Thu Nov 14 09:29:09 2024 -0800 Support --enable-offsreen again. commit 31a9f922690fbfb88539d80ea5913d1061c8ec41 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 14 01:26:59 2024 -0700 BUILD: Copy existing documentation files to extfiles directory. commit a7e55b1bd81a53dbdbbe8de74d198f6291b9def4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 14 01:25:00 2024 -0700 BUILD: Remove deletion of existing asymptote directory in build-asymptote.ps1. commit 4a81317bc9937c553ac1ca25de67b27c54d83820 Author: John Bowman Date: Thu Nov 14 00:24:25 2024 -0800 Increment version to 2.95. commit d851f9c6a85fbc1b5497b9abb6f589d12e1e2c0f Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 14 01:18:21 2024 -0700 BUILD: Clear CMakeCache.txt before building in build-asymptote.ps1. commit 7c3e653852ca09a30bc072de69d9ce626f496b61 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 14 01:10:21 2024 -0700 BUILD: Copy setup file to shared directory once build is done for windows build ps1 script. commit 2d9aa810ecdf52492f98298cdcb6e319e28891e1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 14 01:05:42 2024 -0700 BUILD: Restore asygl's regex in determine_pkg_info.py. commit 3f9cf39aff16ba816039425cff697f8cad62f07c Merge: a3479bbd6 4ce9ccfc3 Author: John Bowman Date: Wed Nov 13 22:01:15 2024 -0800 Merge pull request #490 from vectorgraphics/fix-mac-compile-2-93 Fix compilation issue on macOS commit 4ce9ccfc38cfe6ddf291074fab2acf235b14ed98 Author: John Bowman Date: Wed Nov 13 22:07:06 2024 -0700 Fix Makefile. commit 2b70c29fc590dcdda2136ba2caca1898ffdcda83 Author: John Bowman Date: Wed Nov 13 21:54:49 2024 -0700 Fix BUILD_ROOT_DIRECTORY. commit 59868dd70d7082e7417e54d48fe7a6da9c5f706d Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 13 21:40:45 2024 -0700 BUILD: Fix determine_asy_pkg_info in determine_pkg_info.py. commit f97a50097c5701c0556d7cfbe3f32617b4e2b1ad Author: John Bowman Date: Wed Nov 13 21:33:48 2024 -0700 Back port to Python 3.7.16. commit a3479bbd6155497cb1fd237106bf769557578818 Merge: 952e74a73 db6d3a504 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 13 19:25:27 2024 -0700 Merge pull request #491 from vectorgraphics/re-enable-lsp-windows CMAKE: Re-enable LSP option on windows commit db6d3a50465474ed5e449c876f17ece869590a2a Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 13 18:36:53 2024 -0700 CMAKE: Re-enable LSP option on windows. commit 2c1af56fb4b3c762680f2f3aac1c4072dec685ed Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 13 18:25:43 2024 -0700 MAKE: Add quotation mark to CXX variable for GEN_PREOROCESSED_DEPFILE_BASE_ARGS. commit 952e74a73090dd068ec4e6e9f10da94e82f2f747 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 13 18:22:05 2024 -0700 CI: Fix asy test regex. commit 8cd541dbd016692d47f598b5b1e02d14860134d2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 13 18:57:29 2024 -0700 CI: Run "apt-get update" before installing ghostscript. commit 71b411f18125db9124600bf758d3c5527439bf6d Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 13 18:48:04 2024 -0700 CI: Add ghostscript to windows testing CI. commit 905c39b50b4bb8dfbb122160866473e25413bf7d Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 13 18:46:16 2024 -0700 CI: Add ghostscript to linux testing CI. commit f65ed9a703536aebefc5d98c9831e83107c43753 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 13 18:17:27 2024 -0700 ASY TEST: Add asy.gs.ghostscript test. commit 16b5bd459515d84c75fb176f1ddfa522ae95d5ab Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 13 18:17:17 2024 -0700 ASY TEST: Add -noV option to testing. commit 90b7efa5859f86075c8b2be9f549f8902dc5ee4f Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 13 18:04:28 2024 -0700 REPO: Add tests/out and tests/out.* to ignore list. commit 3b4f20c856a19e244371f7ea3b9663a6409806a9 Author: John Bowman Date: Tue Nov 12 18:53:10 2024 -0800 Address pull request #482. commit d693f5f9928c84170ca23433abe548c848506fe0 Merge: db52be09a fa4774e06 Author: John Bowman Date: Tue Nov 12 18:49:48 2024 -0800 Merge pull request #483 from ccworld1000/patch-2 fix endl commit db52be09a81e2f48c6322db4e8919e51be9727fa Author: John Bowman Date: Mon Nov 11 23:22:05 2024 -0800 Remove unused file. commit 8fbdf7a261417b40e7ddc26c5bf41c3941f0c6e2 Merge: 7cfedab72 d95f595e6 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 21:15:07 2024 -0700 Merge pull request #488 from vectorgraphics/add-cmake-wce-testing Add wce testing to CI & cmake testing commit d95f595e6c4d19b03c8577c874606922f09878dc Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 20:56:50 2024 -0700 CI: Add wce test to CI. commit a1ccc29f8074ee4660aec18e89e070b2897ad1c8 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 20:53:14 2024 -0700 CMAKE: Add wce test for cmake build. commit 7cfedab72409c4c36ac6c100aadbe167f9ef32cb Author: John Bowman Date: Mon Nov 11 19:16:33 2024 -0800 Increment version to 2.94. commit 594ea5fabff99216b9795606227685db3a9be285 Author: John Bowman Date: Mon Nov 11 15:50:43 2024 -0800 Update required setuptools version. commit c5e597d1a17127cf21d582c5c57d970d205c251f Author: John Bowman Date: Mon Nov 11 15:44:05 2024 -0800 Fix Makefile.in. commit a4d12d852e288d66e43d24ec88e2cb6b562fdacd Author: John Bowman Date: Mon Nov 11 15:24:39 2024 -0800 Fix missing dependencies. commit a0bfdd5d73dac863577608e2115c35d8002b0d97 Merge: ce2dfa5d7 5839f0053 Author: John Bowman Date: Mon Nov 11 12:50:41 2024 -0800 Merge branch 'msvc-support-make'. commit 5839f005305446aa51b0efe364305650261eb62f Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 13:48:57 2024 -0700 MAKE: Re-add tests/Makefile. commit ce2dfa5d76eef26877862a81fbfa4283032e6fc6 Merge: 34eb27036 cfa4b387f Author: John Bowman Date: Mon Nov 11 12:49:00 2024 -0800 Merge branch 'msvc-support-make'. commit cfa4b387ffd690863a55b97660a7f4a6120ec855 Author: Supakorn "Jamie" Rassameemasmuang Date: Mon Nov 11 13:47:33 2024 -0700 WCE: Set +x on wce. commit 3424862ad2f7b2f33ce2e85682bca20a514bafe4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 13:46:53 2024 -0700 MAKE: Move wce back to root directory. commit 34eb2703642123f9886b673a8a9f5743afe3292f Author: John Bowman Date: Mon Nov 11 12:44:42 2024 -0800 Restore example. commit 3e030884510819477e9588fecd4285cfb52aae8e Merge: 54955c5af e0ee47fbd Author: John Bowman Date: Mon Nov 11 12:41:39 2024 -0800 Merge branch 'msvc-support-make'. commit e0ee47fbdf08281be6523806094a599e53e71c68 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 13:41:11 2024 -0700 MAKE: Add xasy to asy target. commit 54955c5af723b2a8e7812f039b5b5b4e57099773 Merge: ac9dad0e9 dd281a480 Author: John Bowman Date: Mon Nov 11 12:39:38 2024 -0800 Merge branch 'msvc-support-make'. commit dd281a4806fdd7f9185ea72415070cb0b08031b1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 13:36:55 2024 -0700 GUI: Fix path import for GUI symlink. commit ac9dad0e9e1b28a2ad7e6d2dee8e926057beaa9b Merge: 6df88faca b9e744cfd Author: John Bowman Date: Mon Nov 11 12:29:16 2024 -0800 Merge remote-tracking branch 'origin/msvc-support-make'. commit b9e744cfd9a08c4e404ab598d9a27a6e8fa0b319 Author: Supakorn "Jamie" Rassameemasmuang Date: Mon Nov 11 13:21:56 2024 -0700 XASY: Set +x flag on xasy.py. commit 57f7f976a57a89a8db910e95c1101cbe7b305e5f Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 13:19:21 2024 -0700 GUI: Add current path to xasy. commit fca87415bc500f291ece76784679fe35e23bfee7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 13:06:03 2024 -0700 BUILD: Use top-level directory for acextlibs. commit e9560ad9219d19bd21874307bf6141f2d4618444 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 13:04:59 2024 -0700 BUILD: Use master ref from vectorgraphics/LspCpp. commit bfc3ac9c3b67462f09f443e94ebb0a31f7002e1f Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 12:53:19 2024 -0700 XASY: Remove development helper script as it is not needed anymore. commit e9f7894121d562a3c703f6f28767a6f53afc782e Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 12:46:58 2024 -0700 XASY: Exclude additional dev files in build-asymptote-installer.py. commit 1c51e2dff7f6aef2d4df84622d80dbebf82c5730 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 12:45:43 2024 -0700 XASY: Fix import for xasy. commit ae5b388cd7751401880612f4e5c2f4326d63322d Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 12:41:33 2024 -0700 Revert "XASY: Move xasy files and imports for compatibility with PEP 517 packaging system." This reverts commit 51f58653 commit b2b251eab5c4f09286c683392643cc7e1cf25783 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 11 12:40:17 2024 -0700 Revert "GUI: Fix xasyTransform import." This reverts commit 0c70a3135124788c5faa805f75e0be328be7327b. commit 6df88faca807a0dc4d8041c43ffee0d59e750115 Author: John Bowman Date: Mon Nov 11 10:23:38 2024 -0800 Remove obsolete build script. commit 7e6ad89e9fbacd3c059632dfb4d84586421c15c1 Author: John Bowman Date: Sun Nov 10 13:30:51 2024 -0800 Standardize formatting. commit d18983c5fe851b71f8aeb574389317cc67655e84 Merge: 21d1648f5 dab310c01 Author: John Bowman Date: Sun Nov 10 13:11:43 2024 -0800 Merge branch 'master' into msvc-support-make. commit dab310c018630fb21701e9b1d62c7cf1c701d580 Author: John Bowman Date: Sun Nov 10 12:58:41 2024 -0800 Fix #486: use PACKAGE_NAME, PACKAGE_VERSION, and PACKAGE_BUGREPORT. commit 21d1648f58cfa801f05f0fb0a702012acfa96f27 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 9 21:42:19 2024 -0700 BULID: Fix win32-pre-nsis-installer's latexusage.tex. commit 2a1172adcee3695969d55ed31096795e538a83e7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 9 21:40:42 2024 -0700 REPO: Add additional remark about cmake-build-msvc/release. commit 9359f5fcdd5522e32a09c19522fd06aa4150bc97 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 9 21:33:36 2024 -0700 REPO: Use current asymptote dir for windows building script. commit 55222099ae2614a623b3dd1e3b4f9e748f532bd6 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 9 21:33:22 2024 -0700 REPO: Add additional files to ignore list. commit 424a670db2f12b4a6cf1c758e9f853364914d325 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 9 21:12:52 2024 -0700 REPO: Add tools-cache to ignore list. commit 697604fcc34555930a8a976eb6a43fd5a3a0ba7d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 9 20:55:51 2024 -0700 BUILD: Install remaining documentation files to examples/ directory on windows. commit e557e44ad22e1040126e13599c61ce7ab564feaa Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 9 20:52:54 2024 -0700 BUILD: Move ASY_DOC_ROOT to basic-parameters.cmake. commit 3336ed8ca36cf9c4341bb28c2127c721ab95cc1a Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 9 20:34:12 2024 -0700 BUILD: Replace latexusage.pdf's inclusion with extra doc files. commit 9e3ff98ac897e5a645451c82f0993c9d62c9c26d Author: Charles Staats III Date: Sat Nov 9 17:39:45 2024 -0800 Test double-shadowing when only first shadow is allowed. An implicitly defined autounravel function like 'alias' is allowed to be shadowed. However, if the (explicitly defined) replacement is itself shadowed with another autounravel function, that should produce an error. commit 0d5b2220bdb63583c175c3d49ec04cfe2b25b2c5 Author: Charles Staats III Date: Sat Nov 9 17:32:31 2024 -0800 Test compiler errors for autounravel. commit 10248a12f9c6db810da18bd2e70f33d97c20eee4 Merge: 0c70a3135 03587f0fb Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 9 18:15:11 2024 -0700 Merge remote-tracking branch 'origin' into msvc-support-make commit 94bac8ba470dbba54e90fbc92c4ed07aebd5f3e7 Merge: 16d05bc27 03587f0fb Author: Charles Staats III Date: Sat Nov 9 17:13:48 2024 -0800 Merge branch 'master' into autounravel commit 16d05bc27f01688969e2f616c78a94dcf6ff9154 Author: Charles Staats III Date: Sat Nov 9 17:09:30 2024 -0800 Move functions from .h to .cc file. commit 0c70a3135124788c5faa805f75e0be328be7327b Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 9 17:46:53 2024 -0700 GUI: Fix xasyTransform import. commit 522152e8384a400257a1f9dde7d12d951866f014 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 9 17:44:11 2024 -0700 GUI: Remove cgitb.text import. commit 65b51981fdd6524d0dc1217172a4e32abd40c531 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 9 17:27:49 2024 -0700 REPO: Add .python-version to GUI's ignore list. commit d3e10f087c22ad99db20c1cd8708f648c731bce6 Author: Charles Staats III Date: Thu Nov 7 19:52:58 2024 -0800 Make alias shadowable to fix error. commit 955a0b4ed6a5c385fc9c556e6e4015fbb2ba2ef0 Author: Charles Staats III Date: Thu Nov 7 19:46:23 2024 -0800 Error if one autounravel field cannot shadows another. commit fa4774e06f1f9f2f34af2780c38ee31c4877eb12 Author: CC Date: Fri Oct 25 10:31:49 2024 +0800 fix endl fix endl commit 699627ed39cb8d135a790159c74d9b6fd5461c04 Author: Charles Staats III Date: Thu Oct 24 18:57:54 2024 -0700 Autounravel builtin operators; control autounravel order. commit c407cd81c7baf149474f6c7fb7072fe702bf3402 Author: Charles Staats III Date: Thu Oct 24 18:15:49 2024 -0700 Add test for builtin operators. commit 05cc3ffab5340e551251f9074c12b43beb9f7548 Author: Charles Staats III Date: Sat Oct 12 19:53:25 2024 -0700 Fix behavior when multiple fields autounraveled. commit 03587f0fbdb5b203780186a6c3410d767a4083c3 Author: John Bowman Date: Tue Oct 8 10:32:57 2024 -0700 Increment version to 2.93. commit 9ed0a02a09524bec5add75a13151c36bc742fe8f Merge: 730570ca0 d773ca31b Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Oct 8 02:36:06 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support-make commit 730570ca070fe034123b7dc55f80f49e332413ca Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Oct 8 02:35:11 2024 -0600 XASY: Fix passing in additional asymptote args. commit 8bc6dcf14a559d74f28f5af248070349d9c88eac Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Oct 8 01:13:11 2024 -0600 VCPKG: Bump vcpkg baseline. commit d773ca31bd669e51263748c9e08324f985b31f95 Author: John Bowman Date: Mon Oct 7 10:43:36 2024 -0700 Improve build-asymptote paths. commit c89a69a2fbfb0d67590bf000cf2c0a89a68610ad Merge: f44f70c60 be6cde328 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Oct 3 21:46:49 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support-make commit be6cde3282da117e7dee66f2f6ed269fe66fec91 Author: John Bowman Date: Thu Oct 3 20:46:04 2024 -0700 Prebuild pdf and info files for all source releases. commit f44f70c60d26e8fe05eeb3dbaa185d3bdffb8823 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Oct 3 21:36:44 2024 -0600 BUILD: Copy dll files to CTAN output directory as well in build-asymptote.ps1. commit 0876ddee80b7143a5a7d6deaa15969df1de71e25 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Oct 3 20:26:45 2024 -0600 BUILD: Use ASYMPTOTE_BUILD_SHARED_DIRECTORY for detecting extfilesRoot path. commit 66b0f9dff50e125798e251b5f4b6da6728e974cb Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Oct 3 20:25:28 2024 -0600 BUILD: Use ASYMPTOTE_BUILD_SHARED_DIRECTORY for outputting CTAN file. commit cbc265c1590e8818185ccce341b15766bee29c47 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Oct 1 22:10:11 2024 -0600 BUILD: Fix installation of external documentation files. commit dbeb75375392f9f5967c3f3cd867206e1e4cdb5d Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Oct 1 22:06:33 2024 -0600 CI: Add trailing slash to extfiles during package-asy-install. commit 25eeeb5472cfcb7e5b372a8125c3be30453ed6fd Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Oct 1 22:03:05 2024 -0600 CI: Reconfigure linux with version override information during docgen. commit 4d95214e46d2c0a4b9748727111e2311faf6b9cf Author: John Bowman Date: Mon Sep 30 20:20:38 2024 -0700 Remove duplicate error messages. commit 825eeda1ddb8a58e609283359d0756d143541ab4 Merge: 6a0805946 82c919fb2 Author: John Bowman Date: Mon Sep 30 19:57:32 2024 -0700 Merge branch 'master' into autounravel. commit 6a0805946a28c07e7aa0a4a23b56a978d9fd56c8 Author: Charles Staats III Date: Mon Sep 30 19:30:29 2024 -0700 First draft autounravel doc. commit 99efd94d4dddf0344e8953b1783099e2850377d0 Merge: 14cc566d9 82c919fb2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Sep 29 23:42:19 2024 -0600 Merge remote-tracking branch 'origin/master' into msvc-support-make commit 14cc566d926c8ab1a94ebe7f4904fe8c6a08cca2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Sep 29 23:40:43 2024 -0600 W32: Use checkShellExecuteResult to check displaying files outside help. commit c9f89d622e195bfca39a6d7d9417b642de68f61b Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Sep 29 23:40:13 2024 -0600 W32: Use ShellExecuteA to display asymptote help file in windows if default viewer is not given. commit 6014d9534f43dbe6308f9e247c5f02862977dcd1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Sep 29 23:39:47 2024 -0600 W32: Add helper function to validate ShellExecute/ShellExecuteEx's result. commit 5e27fa3aac41004543bd92fa0e5b7a2c5f6fe07a Author: Charles Staats III Date: Sat Sep 28 17:42:20 2024 -0700 Do not autounravel a type whenever a variable of that type is declared. commit 65c90bff5ee57f07f121acc3ffeb717530d5f9c1 Author: Charles Staats III Date: Sat Sep 28 17:25:34 2024 -0700 Error if autounravel used for type or at top-level. commit 38c56442f50eb5c0663410f4d8fd7b2355fd5346 Author: Charles Staats III Date: Fri Sep 27 16:54:54 2024 -0700 Test autounravel function. commit e810b68cee2c9e207d5d8f1522ed66f67bb36737 Author: Charles Staats III Date: Fri Sep 27 16:47:01 2024 -0700 Apply autounravel modifier to unravel declarations. commit 5dbc7395767284422e24bd0ff17fad6cff0d7cb5 Author: Charles Staats III Date: Thu Sep 26 19:59:07 2024 -0700 Delete some commented-out code. commit 40b26820200d6308547cb999f1eb707e841ccdd1 Author: Charles Staats III Date: Thu Sep 26 19:55:53 2024 -0700 Autounravel fields of type added via unravel. commit 28725aa82924b65d3724d13f2924c8cb7c218b48 Author: Charles Staats III Date: Tue Sep 24 16:02:34 2024 -0700 Passing tests for autounravel parametrized type. commit 42ce1177890d9d1e4ab74d9e3152b2b172411839 Merge: 47a6c8e52 604e0e09f Author: Charles Staats III Date: Tue Sep 24 15:23:04 2024 -0700 Merge branch 'master' into autounravel commit 82c919fb26d44f80ddf13b1b9b5f19f023ca4fd7 Author: John Bowman Date: Sun Sep 22 20:58:05 2024 -0700 Fix revision efc15f4d3cf0f2891ac944d9d0fa3f57a8966fdb. commit ff1c616e8592e130e90f2a50ef3d6d8e676a71be Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Sep 22 14:04:58 2024 -0600 BUILD: Enable usage of installed NSIS if present. commit 88a0a7bd733c84a496257c4b0d4cdb2065798345 Author: John Bowman Date: Wed Sep 18 09:24:29 2024 -0700 Exit gracefully with "qualifier is not a record" instead of aborting. commit 85f29c2f9d0887f3e08e1c21ea75948a76e5080f Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Sep 15 00:54:47 2024 -0600 BUILD: Determine version automatically in build-asymptote.ps1 for windows. commit d83a6d34afbc80bfb67feda456f6b6e8d3e09524 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Sep 14 22:41:54 2024 -0600 CI: Fix determine_asy_version CI stage. commit 8cc0d0a551c50998bee03e891f0aa52f1097e00b Merge: 246790569 c1c5f7613 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Sep 14 22:40:28 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support-make commit 246790569fe2e0ef1c6c3c069991f74595adfcd9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Sep 14 22:36:20 2024 -0600 CI: Use python script to determine asymptote version. commit af02da8c4e3c71b9f52a4042bbf449eb5f20f826 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Sep 14 22:35:10 2024 -0600 PY: Add script to determine asymptote version. commit c1c5f7613f02b5407a6fdb28674c2ba5edad4a01 Author: John Bowman Date: Fri Sep 13 22:42:32 2024 -0700 Update documentation about ignored shipouts. commit c2422a927a23cd61268ee927767aab84b2881790 Author: John Bowman Date: Fri Sep 13 22:36:38 2024 -0700 Account for format when ignoring shipouts that would duplicate implicit shipout. commit 0ce3edd07f471de6697ed9cdf1f0a9021426b2f5 Author: John Bowman Date: Sat Sep 7 13:37:32 2024 -0700 Compute topPos only when needed. commit 32ee049fcefa99e6ec8361435d2ed10dea139032 Author: John Bowman Date: Sat Sep 7 13:34:17 2024 -0700 XASY: Fix xmap regexp. commit 93b8e40f12338ea68ae0de061d679712a7f88941 Author: John Bowman Date: Tue Sep 3 19:28:50 2024 -0700 Check for valid clipping planes. commit 47607f3af7889a75a0ef129313f9ca6b582546ad Author: John Bowman Date: Tue Sep 3 21:58:46 2024 -0700 Fix comment. commit 2a65229976b4a2533011216c611ea21c89825144 Author: John Bowman Date: Tue Sep 3 21:53:57 2024 -0700 Update HOWTO-MSWindows. commit 7c80031204505ca6f16fe5dd7b96b898485a670d Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Sep 3 22:50:51 2024 -0600 BUILD: Move asymptote setup file instead of copying. commit f05b0fe99fee4790ce49a70af15e6e78435d5b71 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Sep 3 22:38:36 2024 -0600 BUILD: Build CTAN asy for windows in build-asymptote.ps1. commit bbfb13aff4e146c8d907d1cfccba1ca8c691b5e3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Sep 3 22:21:56 2024 -0600 CMAKE: Add preset for CTAN for windows. commit 18d96804836250863c7c2b77856eb17d8f96bc13 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Sep 3 22:17:11 2024 -0600 BUILD: Copy installer files to the build root. commit 6e07a11772810168210ec694d4539b1135006bb2 Author: John Bowman Date: Tue Sep 3 20:07:49 2024 -0700 Update shared directory. commit 1707c1fb468243a3c55c2580ff7822972ae6a254 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Sep 3 21:01:49 2024 -0600 BUILD: Add asymptote.pdf to build-asymptote.ps1. commit ee85f42d88aab58a3b7a93353dccd21a6597189e Merge: 1a74d2f3f db6d24267 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Sep 2 16:25:35 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support-make commit 1a74d2f3f4a562cbfd80abf8aba855ee16f6e3d3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Sep 2 16:25:25 2024 -0600 BUILD: Update instructions on building asymptote on windows. commit 3596a172fc64fb486f0f0b33fa54719ca7f607d7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Sep 2 15:37:06 2024 -0600 BUILD: Replace build-asymptote.dos with ps1 script that uses CMake. commit 0385a313ba3e984e1bbff9b81a767cf4393d37fd Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Sep 2 14:16:34 2024 -0600 DOC: Update documentation on handling ninja dependency. commit b26c8a80c9509c6b5f6fb0f7aa3a401eb7d85787 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Sep 2 13:06:35 2024 -0600 CMAKE: Re-add preset for existing asymptote.pdf. commit 85d62e50b2076498796c7c2fe24cfb932692dfe1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Sep 2 13:04:38 2024 -0600 CMAKE: Disable LSP building in msvc/release builds temporarily. See https://developercommunity.visualstudio.com/t/MSVC-Compilation-failed-with-boost-templ/10734959 and https://developercommunity.visualstudio.com/t/C-Syntax-Error-after-upgrading-to-Visu/10724553 . commit fe5b700a7180ff091d21fb97a783e0337e96b7d2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Sep 2 00:21:45 2024 -0600 CMAKE: Modify presets for msvc/release with external docgen to use new cache variables. commit cfec6670dc35615e175f69012f44dc1648a3af44 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Sep 2 00:18:22 2024 -0600 CMAKE: Modify documentation generation options to allow for specify external directory for all files. commit c7fc84be4583bc1de6c6174c2beaed76488c1fae Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Sep 1 23:06:09 2024 -0600 W32: Remove the world "application" from System error. commit cd59c48832654ca4b518e43fedfdfbb1f7475c76 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Sep 1 22:20:11 2024 -0600 DOC: Simplify dependency notes for windows docgen. commit 578de54395a1aa836122b58d2d8244aacc458cc7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Sep 1 22:03:55 2024 -0600 CMAKE: Remvoe SYSDIR from asytest. commit 74cab4c0263972b119c6febaf539a75ade299f00 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Sep 1 21:52:58 2024 -0600 CMAKE: Add option for CTAN build. commit db6d2426749080e7a5035668bb3ffee867a65ec2 Author: John Bowman Date: Sun Sep 1 19:42:53 2024 -0700 Reorder ImageMagick arguments. commit d7f2a95fe274861172c7fe19ddb7fd8269b58ea5 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Sep 1 21:05:05 2024 -0600 CMAKE: Add tests for template tests. commit 81d0ffcb6dccf2172ca69a27618bf333c4608b4f Merge: 080b44472 604e0e09f Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Sep 1 21:01:36 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support-make commit 604e0e09f82116b3dd8c613f8439fb2e994dcd9b Merge: abb6d7076 442b9b6f2 Author: Charles Staats III Date: Thu Aug 29 18:32:42 2024 -0700 Merge remote-tracking branch 'origin/master' into 471-cannot-unravel-static-field-from-imported-type commit abb6d7076ffd3cbd1f4a5896a2dbc207ec55e837 Author: Charles Staats III Date: Thu Aug 29 18:25:40 2024 -0700 Add tests for #471 fix. commit 442b9b6f214c4ccbb59b823e1285da8f24bf0466 Author: John Bowman Date: Thu Aug 29 18:11:40 2024 -0700 Add test for issue #471. commit 21bbaa75e735918046b36aa75af8e700728b5a0c Author: John Bowman Date: Thu Aug 29 17:23:55 2024 -0700 Apply Andy's fix for issue #471: Cannot unravel static field from imported type. commit 080b44472cf59090e16f6a0cef00155714f53105 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 25 18:29:11 2024 -0600 DOC: Clean up documentation for installing on windows. commit 305edb54c6f6ccea0d03d4dfc578ccd73bcfb0a8 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 25 18:03:16 2024 -0600 DOC: Rearrange INSTALL-WIN.md. commit 7db469aa883b3eb37433fc17c8b9b999a09f7bf2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 25 14:54:28 2024 -0600 CI: Use version-override number in building asy's GUI. commit 5f1e67b7e2275a5f9fdc1ca493344cea11602ff5 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 25 15:27:32 2024 -0600 GUI: Add "--version-override" option to buildtool. commit 3f3807ef14733c753895935b7deb428833d4b38d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 25 14:39:16 2024 -0600 CI: Determine asymptote version in pull request precheck step. commit 3173f9d232445a6d9f2e4d3d7f49a4964564761a Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 25 14:39:09 2024 -0600 CMAKE: Allow ASY_VERSION_OVERRIDE environment variable to be used for overriding version. commit 388ff0c46faa359e943e1d005d78d11408eec293 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 25 14:38:42 2024 -0600 NSIS: Rename build installer script param for easier usage. commit 91ddba8f238f05f6dcbaeaf4e3393a172dcb39e7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 25 02:56:28 2024 -0600 CI: Remove packaging step from build-asy-windows. commit 91bd1f50e0c6c786dfb35cee9e77460e5b193e8d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 25 02:05:16 2024 -0600 CI: Add packaging step for asy. commit f92cb6206ff0761ce94cf9b6acbe3fc74a5eef0e Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 25 01:31:54 2024 -0600 CI: Rearrange CI into a single pr-precheck file. commit 0c6c890633dcd284bd7759593aefdbace81f768b Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 25 01:06:51 2024 -0600 CI: Remove on-push CI run. commit 9a8d8f87118f8b77231b5e8225742727ad5353d2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 25 00:59:28 2024 -0600 CI: Add workflow for generating UI files. commit 9e6ab91af1156783baf9940b7a09d0fd7737c125 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 25 00:12:24 2024 -0600 CI: Remove output directory from asy run command in building latexusage. commit 869fb73504a7c72eeaf6de0a110d11f5084761ad Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 24 13:36:55 2024 -0600 CI: Copy latexusage.pdf to build root for TeX Live support. commit 2e964f9531c534208bbdabb8bc6f1ea4e81a0efd Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 24 13:21:37 2024 -0600 CI: Install ghostscript during windows build process. commit 72b032a86d35ce8b1f87d9917fb6de2de5a86e06 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 24 13:07:38 2024 -0600 W32: Add application name to error message. commit 816f51f1d2c722a5379c61d682b00020205e9a9c Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 24 12:49:42 2024 -0600 DOCGEN: Remove "-include-directory" for compatibility with TeX Live. commit 5a4404073b10b77cd77f983a7a45b3d68a50189f Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 24 02:49:39 2024 -0600 CI: Build asymptote's documentation on windows. commit d22c2e0c73b92dcebf92089937e4f7c009a11af9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 24 02:48:56 2024 -0600 CI: Setup TeX Live on windows CI. commit 5ea2f86cb30c185219b42c5c3fe896e4d7e0ae43 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 24 00:37:20 2024 -0600 CI: Replace setup ninja on windows with manual ninja installation. commit 6557661e59511ca9fa65d7b43e9944f5c8b883bf Author: John Bowman Date: Fri Aug 23 20:01:28 2024 -0700 Remove redundant code. commit 91905481ab4d654b053b879d3e314d8254f38f94 Author: John Bowman Date: Thu Aug 22 20:33:11 2024 -0700 Fix typos. commit fb85753c908016b69124b2c435d0b737c05b4e33 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Aug 22 20:55:29 2024 -0600 W32: Add Ws2_32 library to static linking library. commit 47a6c8e52c3fce26ced6306018a1859c5b7e1004 Author: Charles Staats III Date: Thu Aug 22 14:20:26 2024 -0700 WIP: autounravel progress commit a5c2f091761a9145b3869116ef4fa0c78f2ff7d5 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Aug 22 12:40:13 2024 -0600 CI: Transition all github actions to v4. commit 2dda70503521e3fb0cbef19419bbf0bf2293ba69 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Aug 22 12:27:39 2024 -0600 CI: Use Install ninja from apt directly for linux CI. commit 9cc3a2d7f7cebfe429710bf4bdec958fd033ce6c Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Aug 22 02:23:37 2024 -0600 CMAKE: Handle bezier2 and beziercurve separately in docgen. commit 17f1456f9541c8eca642a4b068f529c02240c27a Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Aug 22 02:07:13 2024 -0600 CI: Bundle documentation in package-asymptote-artifacts stage. commit d935806052d4ed36cbfb794a6e4a30f9e1166f1f Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Aug 22 01:30:21 2024 -0600 CI: Use ccache for building asy on linux. commit a6278da9499287bad59d6a8f07a3423022ca0fdf Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Aug 22 01:29:25 2024 -0600 CMAKE: Add ccache to compilation preset. commit b2bb8ca96c58a4b11420c8a49970526b04f1c2a3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Aug 22 01:25:12 2024 -0600 CI: Add ccache to env initialization. commit 7c16b94d344b4a20600f0a9f371aba0e386bd07e Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Aug 22 01:00:24 2024 -0600 CI: Bump actions/cache to v4 on linux. commit 8753ca605c6424da78b9fa7aeb726774eac85fd2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Aug 22 00:17:52 2024 -0600 CI: Add docgen stage to linux CI. commit 1002b337879cf6408bbe0fce8c4631e5082c12bf Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 19 21:47:37 2024 -0600 DOC: Add documentation for generating install file on windows. commit 8b909e6ebdf41fcd07df6600761bd3426e48bcf3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 19 21:10:06 2024 -0600 REPO: Add extfiles to ignore list. commit caeaee5ca8faf7c546736beec6e3d0f4da6adc12 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 19 03:09:28 2024 -0600 VCPKG: Add baseline for manifest file. commit 13b33f2305a2c5aba3a5765506a4d6f4c328fd47 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 19 03:05:23 2024 -0600 CMAKE: Add install prefix to win32 presets. commit b11ca50dd5d142bad8b731832cea2a8b927955a7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 19 02:56:14 2024 -0600 CMAKE: Add asygl.js to list of files to copy. commit a2f29b73ccbd45afbb47606831082e77f538b635 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 19 02:47:30 2024 -0600 CMAKE: Install README, LICENSE, and asy icon files. commit eb4d4905a19b58b44a69b55af6cff66d69653f4a Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 19 02:41:28 2024 -0600 CMAKE: Add additional files to docgen. commit 5dde08d655c3e72f510246c38439aaeafd19d56a Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 19 02:37:11 2024 -0600 CMAKE: Add option to specify or search for pdftex. commit 78ac2bcb8c74cfbcf15f0b2a7674f0c48eb8a51f Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 19 00:22:48 2024 -0600 CMAKE: Copy asymptote.pdf and other documentation files properly after build. commit 006ea9e60aa3017965b9160a10c64bea8b4841e5 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 19 00:22:24 2024 -0600 CMAKE: Move error message for insufficient components to install stage. commit abd23b2d0ff0ce83fcf81ea5fb91e1cf7a1b9b7f Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 19 00:21:52 2024 -0600 CMAKE: Add custom docgen target and list of documentation files. commit 652197730386000f22cdb7df11507c3c85ec7b60 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 19 00:21:29 2024 -0600 CMAKE: Build asymptote.pdf only if ENABLE_ASYMPTOTE_PDF_DOCGEN is true. commit d651f0be009b459475e20a43b8ccd3d7bca716ac Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 19 00:20:29 2024 -0600 CMAKE: Add option to specify external asymptote.pdf file. commit da697b6421c6aa05b44d5316d340595518646195 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 18 23:21:16 2024 -0600 W32: Add helper python script to build installer file. commit d3ef2bfbf1915e89358c4187d55ba415a99db669 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 18 23:15:12 2024 -0600 CMAKE: Fix formatting in options.cmake. commit 0183b01d6d6d8a3ed82abfa049637f247a5e8b95 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 18 13:36:37 2024 -0600 CMAKE: Add additional files to pre-NSIS installation. commit b6d037b9ee900854d3a24894302ab3011caf85d1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 18 01:45:55 2024 -0600 CMAKE: Add draft win32 pre-nsis install script. commit 3ff1332f1eca64b6937d81c8a2a59082a7fc5bb7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 18 01:13:36 2024 -0600 REPO: Add cmake-install-* to ignore list. commit ae75e1ce4c33750df8440b898bb81ba241ba2775 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 18 00:17:44 2024 -0600 CMAKE: Add option to override asymptote version. commit 0e285eb89de8ad5fc886a35901855152adc0a4e9 Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Aug 16 02:41:07 2024 -0600 CMAKE: Add asymptote.pdf build target for linux. commit 6075b61a0b502701449f5cc0737d1811c0de4b86 Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Aug 16 02:32:37 2024 -0600 CMAKE: Fix CDlabel case-sensitive typo. commit 315d7958ca29a6e0e23b2d86789359070d1e5329 Merge: 179655352 c2e57e121 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Aug 16 00:39:56 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support-make commit 17965535285f79f0c5b8296f2526350403bb775a Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Aug 15 23:31:05 2024 -0600 CMAKE: Add docgen target for asymptote.pdf in windows. commit aebd49b7eea14eeb04ec9aa644158ad81b52a862 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Aug 15 21:24:21 2024 -0600 CMAKE: Generate remaining documentation-related asymptote files in docgen. commit f668036f88f1f1b193fb18efee568f51c82ef350 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Aug 15 23:42:15 2024 -0600 CMAKE: Fix incorrect option() usage in options.cmake. commit df956c94d855f8e52887d17e0d1a7739cf6d9c94 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Aug 15 23:30:38 2024 -0600 CMAKE: Determine if the system can build documentation properly. commit e7e7365b8e02f49e534d015e2b5102c90f008e8e Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Aug 16 00:11:18 2024 -0600 CXX: Use _unlink for windows builds. commit c2e57e121a47f9f44d80a2012eec05e949c95d99 Author: John Bowman Date: Thu Aug 15 01:16:14 2024 -0700 Increment version to 2.92. commit 344bbd8514fff4a25cede6be202cee6fdde35988 Author: John Bowman Date: Wed Aug 14 22:43:21 2024 -0700 Fix warning messages in example. commit c4b0cfe1156e53d1d49b2d74a9e90729bf5d6fd7 Author: John Bowman Date: Wed Aug 14 22:04:42 2024 -0700 Remove legacy defaultrender settings from examples. commit 15d31f395333b0bc6fe78b671843a936473a6b9f Author: John Bowman Date: Wed Aug 14 22:01:48 2024 -0700 Update to use magick convert and magick animate. commit a5f800a1f5e183cf36e398e5d934ec4ceb758edf Author: John Bowman Date: Wed Aug 14 21:58:18 2024 -0700 Update introductory talk. commit 35e076eeaf7057db11df777ac41db80532acb768 Merge: 1b8712e8f a058c4b32 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Aug 14 18:06:01 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support-make commit a058c4b32712c63169cabbe8ea4a9b2e4b887203 Author: John Bowman Date: Tue Aug 13 00:45:39 2024 -0700 Improve camera centering when keepAspect=true. commit 46c6537c637a7fcde78d7fd4f5f0ad1f49012642 Author: John Bowman Date: Mon Aug 12 21:59:57 2024 -0700 Simplify projection centering code. commit af6bcf2dc75c11c90822de683e73821d458e6167 Author: John Bowman Date: Mon Aug 12 20:10:54 2024 -0700 Update camera specification in examples. commit 6dc3a2fff039c90742c5656d463fa3b1465e667b Author: John Bowman Date: Mon Aug 12 17:37:55 2024 -0700 Update grid3 module. commit 54b06839c165a8cdbe5179008decf424a385f1ce Author: John Bowman Date: Mon Aug 12 15:53:45 2024 -0700 Document render argument of surface drawing routines. commit 6a1c5d7c138f8908ef96d52c30f354132ddfa813 Author: John Bowman Date: Mon Aug 12 15:53:22 2024 -0700 Add missing projection. commit e572be209f94aaaf7ecba5d1e5128d89bf759080 Author: John Bowman Date: Mon Aug 12 14:59:16 2024 -0700 Use final projection. commit 6dd9e271c37e1dc0f5b2d941e0a3c5d556099e98 Author: John Bowman Date: Mon Aug 12 14:57:59 2024 -0700 Require explicit projection in internal routine autoscale3. commit 6cba1f1da5facb823b86724cb35e9e01314fdd54 Author: John Bowman Date: Mon Aug 12 14:28:24 2024 -0700 Only recenter camera on nontrivial scenes. commit 1b8712e8fecdbd0102ba0af72832f03d82d084a2 Merge: 985084504 b730244a1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 12 15:25:25 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support-make commit b730244a19a1b686138491a0c3c4fd9ea3e7ce00 Author: John Bowman Date: Mon Aug 12 13:43:30 2024 -0700 Update URL. commit 0e5bd5ed9c35c6871b68a08b4909a5d66c1b40f1 Author: John Bowman Date: Mon Aug 12 09:42:40 2024 -0700 Use general projections in graph3.asy. commit 97af20d196b35e7627ae0e8b1f14462b551a7b61 Author: John Bowman Date: Mon Aug 12 04:13:42 2024 -0700 Fix last revision. commit 985084504e91de56d468b6238097616879c6c28f Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 12 01:36:16 2024 -0600 PY: Fix generate_enums.py. commit 3b3f8258eb8daa1e8953b795bf7814db82b2c29d Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 12 01:34:27 2024 -0600 REPO: Add draft version.texi.in. commit 1c5389a4fad9d73d885f15da8e38e0a92a21de05 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 12 01:34:09 2024 -0600 REPO: Unignore version.texi.in. commit 619c4c1dc308096df9c4b6b5206dcc8b20113e43 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 12 01:14:29 2024 -0600 CXX: Fix glrender.cc's args.tup. commit 834efe1548177677f79212b0c6d921f016e13615 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 12 01:13:37 2024 -0600 CXX: Fix error function in asyparser.cc. commit cae051f5a9953e8310bc197a2c54cfe33f9a4ebb Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 12 01:10:15 2024 -0600 CXX: Fix definition in picture.cc. commit 726e71d2c5776d44531cec87128e1b65204ce4a8 Merge: 2aec573d3 560ffb6e4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 12 01:07:14 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support-make commit 2aec573d313e806bc32083efda0b746228cf6b14 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Aug 12 00:45:57 2024 -0600 CMAKE: Add rule for generating options file for doc. commit 560ffb6e408ad5301f26e318594274e7aa08ed3f Author: John Bowman Date: Sun Aug 11 23:34:20 2024 -0700 Make -debug report traceback only on error. commit eb0418fd0fc75f9024f019b0b3c5e7bf931afeb9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 11 20:09:04 2024 -0600 CMAKE: Add target for relevant asymptote files in docgen. commit 2307614f006498aeb73c2db22fbf3ecced03869f Author: John Bowman Date: Sun Aug 11 18:33:03 2024 -0700 Add srand example to documentation. commit a39b6e33590e8e0e8afa2192a905d0389d1ca1e6 Author: John Bowman Date: Sun Aug 11 15:33:25 2024 -0700 Fix reported camera up vector. commit 4f02db56c1e6330db61345e6b12298e882b4e553 Author: John Bowman Date: Sun Aug 11 14:31:56 2024 -0700 Automatically center camera and target within scene by default; change default value of center for orthographics projections to true. commit 9b49913a7b294c322b57b453ad0e5753c18a1cb7 Author: John Bowman Date: Fri Aug 9 12:28:26 2024 -0700 Add url option to figure function in slide.asy. commit 797c84dbb66101306e2321cc378d5ddba3d06d5f Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Aug 7 02:33:44 2024 -0600 CMAKE: Add target for latexusage.pdf. commit 3d3351f8149a5f4814c9f1f7defec92430396a51 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Aug 7 02:28:09 2024 -0600 DOC: Add script to build latexusage. commit 269a346b471067547950d299c8e2e0d395fcd4f7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Aug 7 02:20:03 2024 -0600 W32: Terminate process before exiting program in Win32IoPipeStream. commit 35b37cf5356225c156d657706cd013d5f4a26b55 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Aug 6 23:14:26 2024 -0600 W32: Check if ReadFile is from a closed pipe or not. commit aea92ab1bd68f10c20270d1fc2ac94a3ab104a5d Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Aug 6 10:42:39 2024 -0600 CMAKE: Add target for asy-latex.pdf. commit 715a560bad0d23e4978de3aa8fb599c39180bec3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Aug 6 10:29:50 2024 -0600 CMAKE: Add skeleton for docgen on windows. commit e77cf15e28140cb9332e38e6258ef09932ff9a58 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 4 21:04:08 2024 -0600 MAKE: Add PYFILES dependency to install-asy. commit 4eba858315796cf3f5ea329e2614f4e459406d31 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 4 21:02:47 2024 -0600 MAKE: Add PYFILES to DIST variable. commit 885d64f54a50a5412dd1980f6a70f54011f5acd1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 4 20:55:26 2024 -0600 MAKE: Add doc/version.texi to sty dependency. commit eb47e3b4917201723c74868dd862c3487df248f0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 4 20:50:20 2024 -0600 MAKE: Restore glew to asymptote build dependency. commit fb68546339e920b6269ec6a4403e068638c84f55 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 4 20:41:20 2024 -0600 AC: Add HAVE_ZLIB define universally. commit 70a24707a64658ceeb05d8b7f6ab32d1db7c1e27 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 4 20:31:18 2024 -0600 MAKE: Make uninstall work with updated GUI layout. commit 0921bb6e1918743972bf4b3489de913c23163e7c Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 4 20:26:04 2024 -0600 MAKE: Make install work with updated GUI layout. commit 23513942941fa1bf1b4da5134c0578d764af5357 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Aug 4 20:23:19 2024 -0600 PERL: Make asy-list.pl work with strict Perl. commit 35ec3c2f8d0b504ec28f8661713a96c4404ae439 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 16:23:21 2024 -0600 Make: Use built-in glew for makefile builds. commit 937b6af7b031b16a03ffb798e6814f643ec937d0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 16:21:26 2024 -0600 MAKE: Make gen_preprocessed_depfile.h work with parallel builds. commit 2a6a58f2cdad340fe920b51a6a949ebc1aa1a150 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 15:51:26 2024 -0600 MAKE: Restore autoheader to Makefile.in. commit 85ba9045fd9f7337d990c0405b37bf4fe9379078 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 15:01:34 2024 -0600 GL: Use included glew source for cmake builds. commit 9997b5edb2f593172b37ef3d1a8a8caea3b18a9d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 14:11:59 2024 -0600 MAKE: Make xasy target work with Makefile. commit c3dd075f1586a104380d6a88e73b3aa68013c9ba Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 14:10:53 2024 -0600 GUI: Add xasy.py as a launch shortcut. commit ff0e780834985e1f79542703c7bf2e66a37f1ded Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 13:41:21 2024 -0600 MAKE: Add GUI/xasy* module targets. commit 06dadf46f03a41808e6f439c81299ef878e49ed5 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 13:13:18 2024 -0600 MAKE: Remove LspCpp from Makefile.in. commit c1eab5181057533b30d85dc87cfbf4cd7f7a0469 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 13:10:22 2024 -0600 MAKE: Fix cleaning of acextbuilds. commit 12aed932c289293b9504a5d5a433ebd0e31e9b70 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 12:53:57 2024 -0600 GUI: Add __pycache__ to ignore list. commit 7b895bd208058fb2d7c8754b6496879ba1fc3b56 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 12:50:58 2024 -0600 GUI: Add option to buildVersionMoudle to use specified version. commit 5060c2054424238620339bf11c598b1f53f624fe Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 11:42:41 2024 -0600 GUI: Update buildtool.py to get the version information from configure.ac. commit 7a56512bebceca1fd8b50a0ad4944cf3dde02712 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 11:25:38 2024 -0600 CMAKE: Fetch package version information from configure.ac file. commit 962cd4c4aa2e15fd626c8cfe7834d68ab079944d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 11:17:03 2024 -0600 PY: Add script to fetch package version information from configure.ac. commit b43bf009fd0b67401dd09a7e5a7eb041b98a1fcd Merge: 926b16f81 1a683cb01 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Aug 3 10:29:05 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support-make commit 926b16f81110df438e127af1e9b1c2bbfa6589cf Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Jul 31 12:58:19 2024 -0600 MAKE: Add acextbuilds to clean target. commit 3f35eb894eb1e8b174165b431c7996b3d4330dc7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Jul 31 12:57:34 2024 -0600 REPO: Add acextbuilds to ignore list. commit dca520992423feb07ba18b5ae1e7f6935a983cc0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Jul 31 12:56:59 2024 -0600 MAKE: Build LSP in Makefile. commit 886ce7f414244a3a8534abacc2d4b32e61a288b4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Jul 31 12:56:23 2024 -0600 AC: Make LSP work with autoconf. commit 41f2ef35de9ea1ceeb1640557c587f14879ed871 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Jul 31 12:56:07 2024 -0600 CXX: Ensure HAVE_LSP is visible to CXX files. commit 1a683cb01c6bec7948befe5bfc941a2b1d9de788 Author: John Bowman Date: Wed Jul 31 04:59:54 2024 -0700 Improve camera autoadjust when keepAspect=false. commit 0b69049743dbe0e0aa319534cfffc1a0f6d648d9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Jul 31 00:17:48 2024 -0600 AC: Remove *** from non-urgent messages. commit d70d2747f0a5303c88d002f7e6fc15b468881981 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Jul 31 00:07:44 2024 -0600 MAKE: Ensure version check is called every time. commit 7673f137cfd082c65120dafeeb1ef0285a014d3d Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Jul 31 00:03:24 2024 -0600 CXX: Ensure config.h is directly or indirectly included in all cc files. commit 1426e5b89247200194b8efcf8f46b1cbf9bef26c Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Jul 31 00:02:58 2024 -0600 AC: Reintroduce header config files. commit e734bab10dc394f592afe3d52f057212ee3c4b53 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jul 30 22:01:12 2024 -0600 MAKE: Add revision.o to asy dependency. commit 587ff8958d156ee1d508556ca5b7bde63463ef15 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jul 30 21:47:10 2024 -0600 AC: Set with_vcpkg to default to no. commit e758204a00af4766a3bf06d980752275d0696c07 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jul 30 21:43:15 2024 -0600 AC: Fix test "x$with_vcpkg" != "xno". commit 442fc40da78af9b4f7ab1e7c9b203f2f3d174a31 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jul 30 21:00:38 2024 -0600 REPO: Add fleet files into ignore file list. commit 3f92e6d6ab59131b82b18c04666ed0fc17039819 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jul 30 01:36:42 2024 -0600 CMAKE: Use VERBATIM option only on unix systems for gen_preprocessed_depfile since it was causing problems on github runner and windows. commit 98c49c8c3d9ccf2dfa324d2423d3e5f0b65ced92 Merge: 7a67ba574 e4ef069ed Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jul 30 01:24:30 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support-make commit 7a67ba5747d9981115cfe6193f6a54b29f4b019c Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Jul 29 00:03:01 2024 -0600 MAKE: Add additional generated files to clean list. commit 7f486be1ef9786493285d574b528e765afa9988c Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Jul 29 00:00:22 2024 -0600 MAKE: Split version build target into multiple files. commit 046518d38fae4cd6901d32bf7523c41dea6877ef Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 28 23:42:04 2024 -0600 MAKE: Remove windows-specific routine in Makefile. commit b52e03c4c3ab45e6a926bd78511a925ddcdcda0a Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 28 23:40:19 2024 -0600 REPO: Ignore keywords.h instead of keywords.cc. commit 571466e7aa51edd35e9650158f68cf5aca67fef0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 28 23:39:33 2024 -0600 MAKE: Set makefile build system to be on par with cmake on dependencies. commit 26e8b4971485ef2edcbce7b76fe36dd16fbc48c9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 28 21:39:49 2024 -0600 AC: Fetch tinyexr from github. commit 28d99ceeb855d83f72c263cd6c978e76060f6926 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 28 03:30:27 2024 -0600 CXX: Remove unused #pragma from util.cc. commit 7644a97545a19a50750df90131b0017966a3a7f9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 28 03:04:31 2024 -0600 AC: Always include HAVE_UNORDERED_MAP since we are >= C++11. commit 837810b54d0fbfc9a0943288749ac805491c04a7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 28 23:37:11 2024 -0600 AC: Fetch LSP directly from github. commit 2d547731466e04aced19935f2ffcd059f8704bf9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 28 02:35:25 2024 -0600 AC: Move AC_SUBST to the end of the file as these are changed later on. commit 8a35969828d945934988465476eb3297603e28b7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 28 02:27:13 2024 -0600 REPO: Add *.raw.i to ignore list. commit 3fb5fbb8523f4179ed5df96377102503025e8a38 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 28 02:08:24 2024 -0600 REPO: Add additional conftest files to ignore list. commit 1616c997ac1a79ccd2f1bd44d72c4cbf8a13f130 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 28 02:08:15 2024 -0600 REPO: Add extlibs and extbuilds to ignore list. commit e51fa6224218bfa17f5a6bcdac4a120a818dc5d9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Jul 27 18:56:34 2024 -0600 CXX: Use <> brackets for optional.hpp. commit b14ec24f2360512e85b15a90bd48ed748bb085cb Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Jul 27 17:49:29 2024 -0600 AC: Pass in CXX_STANDARD into makefile. commit 485c5044f784a89b9409942c7bf519193948fb41 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Jul 27 17:49:16 2024 -0600 BUILD: Add options for extra flags in gen_preprocessed_depfile. commit bd43a40a18f5809fc50685fc005a1484dca2a3a1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Jul 26 02:55:47 2024 -0600 PRC: Check for univesal endianness if on platforms with unknown endianness. commit f5f3fdcc3e02021f61084e60827cbf438466d01f Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Jul 26 02:52:15 2024 -0600 PRC: Add endianness check to PRC build target. commit 026289237dbdb943d2034fa55a93aa30cd66bfed Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Jul 26 01:05:45 2024 -0600 REPO: Add confdefs.{h,cc} and conftest.cpp to ignore list. commit 12054fff7ca428401e3452e7fdb76483281c9abb Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 28 23:36:45 2024 -0600 AC: Make configure.ac work with vcpkg. commit 1f7dd2f1b444a5417ecab408cd24df1b3ab27305 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Jul 26 01:01:18 2024 -0600 AC: Make configure.ac work with vcpkg. commit 7c60d7bec543f6dd19086d8395df61b494e424e8 Merge: 2e65241ff e4ef069ed Author: Charles Staats III Date: Sat Jul 27 13:18:58 2024 -0700 Merge branch 'master' into using_typedef commit 2e65241ff33e209c289b28a7a9763fdb541f386d Author: John Bowman Date: Fri Jul 26 18:56:33 2024 -0700 Remove explicit texinfo navigation. commit 35ee58184bfd49605d3867a62828e1d1524b0ae9 Author: Charles Staats III Date: Fri Jul 26 16:21:57 2024 -0700 WIP: Fix asymptote.texi. commit 89f14822ec586f29e049864aa9b6b90ac2e41c60 Author: Charles Staats III Date: Fri Jul 26 16:21:12 2024 -0700 Apply type rename after merge. commit 985175fa00617610e86e5448c9f8a06dc3b04529 Merge: 0227e6da9 472d8ceb6 Author: Charles Staats III Date: Fri Jul 26 15:21:12 2024 -0700 Merge branch 'master' into using_typedef commit 0227e6da925b435121cf5498bf6fa81e8dfa8216 Author: Charles Staats III Date: Fri Jul 26 11:26:32 2024 -0700 Switch some modules from `typedef` to `using`. commit 5bbcbcc52d68306babc38c9c19dde0e06ef1b6c9 Author: Charles Staats III Date: Fri Jul 26 11:24:38 2024 -0700 Add comments to justify "using" syntax. commit 6c51091ad2a619d8947880ddb9c1b00dca77d7c1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Jul 26 00:37:05 2024 -0600 CONFIG: Update config.guess and config.sub. commit 7e31fd8dc3b2b25f157c1a2dad93e082af653b2a Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Jul 26 00:01:39 2024 -0600 XDR: Add HAVE_CONFIG_H in win32xdr.h if present. commit e4ef069ed7e8586c3d6eedd4989eeb91b3ac44bd Author: John Bowman Date: Thu Jul 25 12:18:34 2024 -0700 Improve internal documentation links. commit a8b99a80e307976e30cdeb88543262f82b0559ed Author: John Bowman Date: Thu Jul 25 11:52:41 2024 -0700 Update module map and example to use templated imports (issue #470). commit bdc8a96080518a980e94859ca4a44cb5bbfd0e4b Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Jul 25 01:55:11 2024 -0600 GL: Delete OpenImageIo include as it's not needed anymore. commit d9f23a8a3ffad5f0b9c58e873472445502b3f6f7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Jul 25 00:27:29 2024 -0600 GIT: Add vcpkg_installed to ignore list. commit e51f6aa11fb03151217790643048f3fb3012a6cb Author: John Bowman Date: Tue Jul 23 23:24:30 2024 -0700 Compute normals for tessellated surfaces after transformation. Don't tessellate when settings.render=0. commit abcc187e719a34a490fe67b5bb0391b577821479 Author: John Bowman Date: Tue Jul 23 23:23:22 2024 -0700 Fix settings.render=0. commit 8277a902085f71f6ba0004f1ad6d5be598fcaaf2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jul 23 01:31:46 2024 -0600 AC: Add check for vcpkg. commit 7caa4c47a3274b57c9046766056144bfb922b436 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Jul 22 22:42:07 2024 -0600 AC: Set C++ standard to 17 to match cmake build. commit 853e24d9bc8e287c273f02438fe809bc2fdd09d0 Author: John Bowman Date: Mon Jul 22 13:45:42 2024 -0700 Enable GLSL error reporting again. commit 5f57f90df7a2cd003c8771906049e58b034572cf Merge: 467867e56 0a28468d0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Jul 22 12:08:17 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support-make commit 0a28468d010da5159b1d3cdb921e50b469f629e9 Author: John Bowman Date: Sun Jul 21 20:32:17 2024 -0700 Output triangle group for indexed surfaces given render option tessellate=true. Fix triangle group normals. commit 1f8626d9996fa61ae3be3b1d9469bcb09d15b2f8 Author: John Bowman Date: Sun Jul 21 18:42:08 2024 -0700 Update comment. commit cefa9d615389e34183f0830527ede4318c1cb5d8 Author: John Bowman Date: Sun Jul 21 18:41:41 2024 -0700 Simplify code. commit a2206f5bab482a023144a6ce919096100b851026 Author: John Bowman Date: Fri Jul 19 09:46:24 2024 -0700 Use triangle group array assignments. commit 57c25038f9e1051d7f5c9ca51a59560aa67d317d Author: John Bowman Date: Fri Jul 19 09:40:42 2024 -0700 Update asygl. commit 9399282cf9e1a24fd1ba3f00dcfdc6a790838722 Author: John Bowman Date: Fri Jul 19 09:31:26 2024 -0700 WebGL: Allow triangle data array assignments. commit f80311ae7f35f98ecbfcaa4763305fdd0d95a052 Author: John Bowman Date: Mon Jul 15 23:26:12 2024 -0700 WebGL: Condense triangle groups data. commit 9523b77d98921e13fb958f78b57d57721df30922 Author: John Bowman Date: Mon Jul 15 18:40:18 2024 -0700 Fix issue #467 (arising from backward incompatibility #450): Missing labels in flattened 3D scene (using settings.render=0) after update to version 2.90. commit a65d33455949562694765a5384918da1741f89b4 Author: John Bowman Date: Mon Jul 15 17:40:44 2024 -0700 Update asygl. commit 42b211180d7df8ca08a7d331373a650a74917f5d Author: John Bowman Date: Mon Jul 15 17:37:18 2024 -0700 Fix color normalization. commit 7a9f9ad90a87a26d2814607e96a53ee5a23c13b2 Author: John Bowman Date: Mon Jul 15 17:34:09 2024 -0700 Revert "Fix offscreen triangle groups." This reverts commit 5841f00d6613e9a32aef986520172738e7bb25a8. commit 467867e56e61aa3c3c9aa6e9ee796da557ae9d22 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 14 22:07:46 2024 -0600 MAKE: Restore Make & configure.ac to the latest in master before removal. commit 16de122ad5ab3518f458434483400b4456db3d62 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 14 22:05:17 2024 -0600 CXX: Move ax_pthread.m4 back to root directory. commit a985dae236db05babf7303d6da7edb13984cdd29 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 14 22:00:57 2024 -0600 Revert "MAKE: Remove Makefile and autotools files." This reverts commit f13648ec70031173268fb34b54e097e30a7b21b7. commit 97768309bfd5b6cbde639472d9b4e503fcc87af2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 14 21:58:11 2024 -0600 CXX: Rename process/processutils to asyprocess for consistency. commit 3cf08837b3d0249597dd543e23330f57d70c00e2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 14 21:46:02 2024 -0600 CXX: Move resources and scripts directory to root directory. commit 2005fd40b5fdea6cdc0cc15b75a872996dce7d5d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 14 21:30:32 2024 -0600 CXX: Move src/include/srctemplate files to root directory. commit 20f7f705e870ee57784480f16532edaf8a39ff80 Merge: 2d14741e5 40f83910c Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 14 21:09:58 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support-make commit 40f83910cdf2961adaace41a30450ea5b71c7ad9 Author: John Bowman Date: Sun Jul 14 10:50:38 2024 -0700 Update asygl. commit 9eb6b146226d1d3a3aee39918b528017acfb8793 Author: John Bowman Date: Sun Jul 14 10:49:28 2024 -0700 Fix flatness calculation. commit 5841f00d6613e9a32aef986520172738e7bb25a8 Author: John Bowman Date: Sun Jul 14 08:54:21 2024 -0700 Fix offscreen triangle groups. commit c37fca3f44690d1d90a18dd442e1aef775c206c5 Author: Charles Staats III Date: Fri Jul 12 15:54:09 2024 -0700 Preliminary autounravel. commit b9a6e6b082c968579c605fdab8fe29e76af2b398 Author: Charles Staats III Date: Tue Jul 9 18:03:25 2024 -0700 Hardcoded autounravel structs named TestAuUn. commit 8c6c5ca0e36c298fa5767b9d7699f95f6ecef8e5 Merge: b32786347 472d8ceb6 Author: Charles Staats III Date: Tue Jul 9 13:22:38 2024 -0700 Merge branch 'master' into autounravel commit 2d14741e5805a27f75dc76c4a616f02f6252a5f1 Merge: 030c13a0c 472d8ceb6 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jul 7 20:35:09 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support commit 472d8ceb641a7f6fd6e2246b064b81185485195c Author: John Bowman Date: Sat Jul 6 22:05:06 2024 -0700 Fix triangle constructor. commit 9b25d1d94322fe382087823363dd7833cbdb40ce Author: John Bowman Date: Tue Jul 2 10:46:36 2024 -0700 Fix teapot regularization. commit 2da7afc8b7a5b0406c3b6cd507ce7b21489509c8 Author: John Bowman Date: Mon Jul 1 21:41:32 2024 -0700 Make -d option output call traceback (issue #451). commit 030c13a0cfcf5ae4b7630e3079979a3017355b3f Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Jul 1 21:17:33 2024 -0600 DOC: Update documentation regarding rsvgConverterPath option. commit a33ee4b660319b3335a36c86c6e09966ef99f075 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 16:53:04 2024 -0600 XASY: Add support for custom svg converter path. commit 03b5e658b4fc5c1405ed0695ce663f0466e57140 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Jul 1 00:10:08 2024 -0600 XASY: Fix overriding of settings in xasy. commit 7d744713189b6c0ac1dbff113c6d346c5654f2d9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 16:52:51 2024 -0600 XASY: Add additional functions to settings class. commit abb0b023aab1596d1d049fe05c6deba446ee56fa Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 16:58:33 2024 -0600 XASY: Fix import for xasyversion. commit 103f40aee015fb532995d869ec4f050ee8d9b57d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 16:53:17 2024 -0600 XASY: Clean up Window1 setting initialization. commit 5429a4963e89111159bdeb05f369901f109e0802 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 16:20:24 2024 -0600 W32: Use \x04\n as a terminating character for xasy for all platforms. commit 5bda6e338aa35a1746b7a4626c9e71620f06ef4c Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 13:27:44 2024 -0600 CMAKE: Add asymptote base files not already copied. commit d67b37cb583d73e54b0c5e751c7143caf9d91188 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 13:22:00 2024 -0600 CXX: Rename parser to asyparser to avoid collision with windows' parser.h. commit ca57ccf5b5e3d264049dc8aa176f9c0976e5a256 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 12:58:04 2024 -0600 TEX: Escape path when given to tex. commit 29e01591ac963ad9c31815044677ac48b355a3e6 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 12:57:39 2024 -0600 UTIL: Add escapeCharacters function. commit 6c8ed678980ffeceafebbe69cc5007f23f05d007 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 11:12:59 2024 -0600 CXX: Fix exitHandler from master branch. commit 5e777baf7e8b16096487432d6c0ca6b789b02f1d Merge: b4a7504b8 5dc799289 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 11:10:02 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support commit b4a7504b8bdfb26a3a259d3ff9edcd831251855e Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 11:07:01 2024 -0600 CXX: Use _fdopen when possible. commit 0990ee5d2591424102dd92f7daa1fc186ed51aa0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 01:09:49 2024 -0600 CXX: Extract "inpipe >= 0" check into a separate variable. commit 374c7dcea5e86cab4f094ed15d88ef59a845b8af Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 01:07:38 2024 -0600 CXX: Extract runhistory.in's readline function initial check. commit b4698efdc38843cb99678c3989042332a7075002 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 00:56:11 2024 -0600 LSP: Bump GIT_TAG for LSP repo. commit 80dacad9459ee397cde24d4ebeb13a718d19a3bc Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 30 00:55:49 2024 -0600 CXX: Move major functions in fileio.h to fileio.cc. commit 5dc7992891de07af146317ad053ee56d9ffd938d Author: John Bowman Date: Sat Jun 29 21:13:23 2024 -0700 Update asygl. commit 4d50ea9cf4c76e7489b5d6c49f84f0267aa28ecb Author: John Bowman Date: Sat Jun 29 21:12:37 2024 -0700 AsyGL: Fix stack overflow. commit c7e3109ecc4f6f4b193dca1fb80f8cb3c006c9f6 Author: John Bowman Date: Sat Jun 29 20:58:00 2024 -0700 Revert "Update asygl." This reverts commit 8ef173f593d960e79ca79f916acea149e648c6ce. commit 8ef173f593d960e79ca79f916acea149e648c6ce Author: John Bowman Date: Sat Jun 29 20:21:56 2024 -0700 Update asygl. commit 60d6605333f928420dccdac765925685d81bedab Author: John Bowman Date: Sat Jun 29 20:19:54 2024 -0700 AsyGL: Travel home on initialization. commit da4cf28d54a98253de71615fc4f2dec07aaa8707 Author: John Bowman Date: Sat Jun 29 00:00:53 2024 -0700 Update asygl. commit fb9be22ade7e0ea59d9e4d6ef4485ece2777d95c Author: John Bowman Date: Fri Jun 28 23:53:18 2024 -0700 AsyGL: Initialize all vertices in triangle arrays, even if they are offscreen. commit 9b3c6cafd09457e3e575b770df36003c3ccbbc60 Author: John Bowman Date: Fri Jun 28 22:52:00 2024 -0700 Fix typo. commit efc15f4d3cf0f2891ac944d9d0fa3f57a8966fdb Author: John Bowman Date: Wed Jun 26 14:58:12 2024 -0700 Fix slide margin and landscape mode. commit 7d206b8a70e8c985a67cfe5dddcc455163bde2b7 Author: John Bowman Date: Tue Jun 25 17:56:40 2024 -0700 XASY: Fix SyntaxWarning (issue #464). commit 6e02744a6b93d376e3abe41561d7b0039a8c8d80 Author: John Bowman Date: Tue Jun 25 17:50:36 2024 -0700 Replace each tab in error messages by 1 space (issue #444). commit b016b84079c777364eaa40c20ce5a3d80805980c Author: John Bowman Date: Tue Jun 25 09:29:42 2024 -0700 Fix number of colors for prerendering bezier triangles. commit c1eb726af8eb4afc6c4872fedef0d05b0cd650bd Author: John Bowman Date: Fri Jun 21 13:56:37 2024 -0700 Increment version to 2.91. commit 58246991e2474ffbd1bfe012d5d0a11407da7795 Author: John Bowman Date: Fri Jun 21 10:33:58 2024 -0700 Support latest osmesa.h (issue #433). commit 25eee09b986b2bf373a5bab21be4b0406bc2568a Author: John Bowman Date: Fri Jun 21 00:09:15 2024 -0700 Install shaders without executable bit. commit 74af1955622ae40bbe4edc74cd197049a04684a9 Author: John Bowman Date: Fri Jun 21 00:08:00 2024 -0700 Avoid use of deprecated datetime.utcfromtimestamp function. commit 9cd341a78049695722a25d54be507ffd18cacb15 Author: John Bowman Date: Thu Jun 20 23:30:08 2024 -0700 Update documentation. commit 8455927794379406ea28be52adc7cc65262f9ea7 Author: John Bowman Date: Thu Jun 20 23:21:48 2024 -0700 Omit teapot regularization. commit 5099d297e6a950c8917a21be9bf15d75e7855e6a Author: John Bowman Date: Thu Jun 20 19:04:49 2024 -0700 Fix discussion of deferred drawing. commit b0cba406177a0bbee1428ac2e36f886cccdc5b94 Author: John Bowman Date: Wed Jun 19 23:59:31 2024 -0700 Replace ImageMagick convert by magick convert. commit 4d15930f3a4aa8ca4f4616276678e9b1537c27a4 Author: John Bowman Date: Wed Jun 19 19:00:15 2024 -0700 Fix documentation. commit b2dba448eb7e579f9f1e382c3c22c3e1be439e1c Merge: eca567a53 154a9d938 Author: John Bowman Date: Wed Jun 19 18:43:30 2024 -0700 Merge pull request #439 from jkseppan/flycheck Integrate with flycheck commit eca567a539a7bf2b1beb5a3e1871c9c3db276e94 Author: John Bowman Date: Wed Jun 19 18:37:05 2024 -0700 Apply pull request #452, with a few modifications. commit e36ea98c063075bd48a44410c8de1fc173d354c7 Author: John Bowman Date: Wed Jun 19 17:28:47 2024 -0700 Update documentation. commit 7d063bebcf040ab417c770941676df92b669e13e Author: John Bowman Date: Wed Jun 19 15:11:17 2024 -0700 Replace tabs in error messages by 2 spaces (issue #444). commit 39dff901f9c36de254710b57381dc4b83a636f63 Author: John Bowman Date: Wed Jun 19 13:50:40 2024 -0700 Fix approximate transparency rendering for GPUs without SSBO support (issue #462). commit 99bd09380ddd649d3d6060dda12320e2dc8ed10b Author: John Bowman Date: Wed Jun 19 10:35:08 2024 -0700 Pass PKG_FLAGS to AC_CHECK_LIB (issue # 461). commit 216e2ef85fe61c959d2163f8c7c5f4faca87d840 Author: John Bowman Date: Wed Jun 19 09:41:16 2024 -0700 Change add(picture dest, picture src, pair position) to respect a size specification for src (see issue #450). This change is backwards incompatible only in cases where src is given a size specification; the previous behaviour can then be obtained with add(dest,src.fit(identity()),position). commit 4cbd256f23a940f60b54c1ea4df1fe2febe101dd Author: John Bowman Date: Wed Jun 19 09:40:04 2024 -0700 Fix example. commit c7f016286dffc4cd1805d7541d50e17d05805527 Author: John Bowman Date: Sun Jun 16 23:46:09 2024 -0700 Avoid duplicate code. commit d3ad8b5fd85a0ba900c4933acb013e501e473bb1 Author: John Bowman Date: Sun Jun 16 20:23:45 2024 -0700 Qualify call to glutSetOption. commit 9a776cfe4d3bf6b01c7c5340745aa5b0fc9bd707 Author: John Bowman Date: Sun Jun 16 15:48:31 2024 -0700 Update URL. commit 9cf74052039f62dc4f4c810cd0a0b133d977433d Author: John Bowman Date: Thu Jun 13 17:44:57 2024 -0700 Reset terminal on exit. commit af44b79a8b008c6e2bcc3a422cdc28adb78d25d0 Author: John Bowman Date: Thu Jun 13 08:29:49 2024 -0700 Exit glut gracefully. commit c7250761093ba84f3db1c948d3fc4effcfb8d32a Author: John Bowman Date: Thu Jun 13 08:02:34 2024 -0700 Don't show target for empty pictures. commit 1d4dfcae1950fcfce44ed109260b39f0e6dbb45f Author: John Bowman Date: Wed Jun 12 23:46:42 2024 -0700 Fix erase. commit 237a30626c2167f1269dd2ec8b6910569f569e5f Author: John Bowman Date: Tue Jun 11 23:29:34 2024 -0700 Don't warn if there are no constraints. commit 45912ba5dc3aa458ce25fc04d569fbe430238c13 Author: John Bowman Date: Tue Jun 11 23:29:11 2024 -0700 Only output a 3D picture when not up to date. commit 590b89237b2b2d61d310380313e9e61d2329d22e Author: John Bowman Date: Tue Jun 11 20:09:50 2024 -0700 Decouple scaling of each dimension with a fixed version of the original 2-variable simplex method (see commit 401cf60f89dcddfb6993f7bd25a86b144ec5f3ad and issue #72). commit 8b307db4402ec7ad1bf1d1f3559140acaa4863e2 Author: John Bowman Date: Sun Jun 9 08:15:36 2024 -0700 Fix DEBUG_FRAME warning. commit 1c16640576c9b96926f9f76e06b81f0f68fd1714 Author: John Bowman Date: Sun Jun 9 08:10:30 2024 -0700 Remove unused argument to stack::load. commit 786fc0fb3da2fb0e3f4b1dd94aa3548b4a06ad56 Author: John Bowman Date: Sat Jun 8 23:07:21 2024 -0700 Update documentation of templated imports. commit f153c484aca2ead08683cbfb2a5afbcafef1c703 Author: Charles Staats III Date: Sat Jun 8 19:40:39 2024 -0700 Test template for nested imports. commit 61c6d2be12bfad7239ff4f6733ba1a66b84f4d26 Author: John Bowman Date: Sat Jun 8 19:23:03 2024 -0700 Support templated imports for parameter types defined in imported modules. commit 575ef4298a22e175dc2201b4c91f1cf6f8511a0e Author: John Bowman Date: Tue Jun 4 21:07:41 2024 -0700 Partially revert commit 45b84def56e7c4af6a9f0e9546bf92f90c9a22af. commit 12e20a7be326f05d5e5d7a555a0f9ceb29becce1 Author: Charles Staats III Date: Sun Jun 2 21:27:29 2024 -0700 Add more thorough test of struct template. commit 772a3e4d0efa95367f547159bb86dd9f436abd18 Author: John Bowman Date: Sun Jun 2 17:39:49 2024 -0700 Remove automatic recordInitializer for imported templates; add test. commit b327863476ffeb69000a6c0fa19d425fb664f286 Merge: 122092fa8 be47ce983 Author: Charles Staats III Date: Sun Jun 2 15:28:58 2024 -0700 Merge branch 'rename' into autounravel commit c2ddde9f86e4533fc625997b8bf21791240c6b20 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 2 15:50:02 2024 -0600 XASY: Remove fromBezierPoints. commit 3b8f230e281f6796703de8932f0463474ef4c770 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 2 15:09:32 2024 -0600 XASY: Add --additional-asy-args to xasy. commit 3f6f4361af778517867837b79cc56db28e791935 Author: Charles Staats III Date: Sun Jun 2 13:28:17 2024 -0700 Add import de-duplication tests. commit 600c54f7669d23bf57beaee991773f1b301720ef Author: Charles Staats III Date: Sun Jun 2 12:52:08 2024 -0700 Minor readability improvements. commit 426c06840600852a8a80c493b42b3f9c75a0a9d4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jun 2 12:44:23 2024 -0600 XASY: Use StringIO for xasy2asyCode. commit d22b41fb0e7eaf2290951409abf2f867aa317850 Author: John Bowman Date: Sat Jun 1 23:39:39 2024 -0700 Defer pushing qualified tyEntries until actually loading a templated module. commit 70346afc6d421c5b102a35f7b9bde8109082ef71 Author: John Bowman Date: Sat Jun 1 21:00:12 2024 -0700 Remove unused code. commit 8c9e05a2f239390a3ce0fa9fc236027ac3d8bfb1 Author: John Bowman Date: Sat Jun 1 20:50:57 2024 -0700 Revert "Revert "Initialize structs declared within templated imports."" This reverts commit 315ca8cbe34cee0b5079bd669060b568da7b342a. commit e5590f72c74f43840ae87d411f4791b200a7a3e3 Author: John Bowman Date: Sat Jun 1 20:37:57 2024 -0700 Support templated access with types containing static fields. commit a697a52388f0e07797ac5eaa8d00c419337d0c7b Author: John Bowman Date: Sat Jun 1 19:30:28 2024 -0700 Simplify code. commit 57539e7ae5f20414d936730e57120106a8ef3f44 Author: John Bowman Date: Sat Jun 1 19:28:25 2024 -0700 Simplify code. commit 1e51fe661e819f13446288f2cdb47b7688f499e7 Author: Charles Staats III Date: Sat Jun 1 15:40:15 2024 -0700 Only pop qualifiers for records. commit 45b84def56e7c4af6a9f0e9546bf92f90c9a22af Author: John Bowman Date: Sat Jun 1 13:24:36 2024 -0700 Support templated access with imported and top-level structure types. commit db67e9101801809cc15e4e34de72c8c41a60b18b Author: John Bowman Date: Thu May 30 20:55:20 2024 -0700 Simplify code. commit 6faf168867f0a7dd3930b6cf0d74fc4e3333ddd0 Merge: 7dfdaf3c4 be47ce983 Author: Charles Staats III Date: Thu May 30 19:50:04 2024 -0700 Merge branch 'rename' into template commit be47ce9838e0a92dd026fbb1df0532edca5a2e1a Author: Charles Staats III Date: Wed May 29 22:43:42 2024 -0700 Rename types::tyTy back to types::ty. commit 79f526207906986ac2a86414bdece4dffeb12781 Author: Charles Staats III Date: Wed May 29 22:36:20 2024 -0700 Rename absyntax::ty to absyntax::astType. commit 092fc985e8be1cfd88f2045fe39e981bd110f0be Author: Charles Staats III Date: Wed May 29 22:19:31 2024 -0700 Change some macro-gated ty to tyTy. commit 94451536b4a372c4fb5f15b928377174c8e17311 Author: Charles Staats III Date: Wed May 29 22:13:06 2024 -0700 Change `#if SIMPLE_FRAME` to `#ifdef SIMPLE_FRAME` for consistency. commit 7dfdaf3c418ddb0d2471cea99eb0bcaeaec8c6a7 Merge: ecb912d95 122092fa8 Author: John Bowman Date: Wed May 29 21:02:20 2024 -0700 Merge branch 'master' into template. commit 122092fa8a238ac101e9b7dcd6316be919e069ea Author: John Bowman Date: Wed May 29 20:53:21 2024 -0700 Work around missing pkg-config files. commit 2d3fc31c89786cf7edfb8ee85e02fce60b483570 Author: Charles Staats III Date: Wed May 29 14:51:49 2024 -0700 Rename vm::frame to vm::vmFrame to avoid confusion with trans::frame. commit c2cd04a91d1bc7e1fb8e45737d7d45a22344ca1f Author: Charles Staats III Date: Wed May 29 14:51:13 2024 -0700 Output linebreak in testLib to improve error message readability. commit 3bc8e52d1eedf0956785e6214a462172f5820656 Author: Charles Staats III Date: Wed May 29 12:57:35 2024 -0700 Rename types::ty to types::tyTy to distinguish it from absyntax::ty. commit ecb912d95d3cb9c9595e82f8de8bfaf1dfa9e8ba Merge: 193c933fe 684570c88 Author: John Bowman Date: Tue May 28 10:15:51 2024 -0700 Merge branch 'master' into template. commit 193c933fed79c9d12527ee32f249e7c70812af35 Author: Charles Staats III Date: Tue May 28 10:02:01 2024 -0700 WIP: Correctly qualify tyEntries for template parameters. commit 684570c8872a2e93ef86a6ef456a0599a934bf12 Author: John Bowman Date: Mon May 27 19:50:24 2024 -0700 Ship with pkg.m4 to support pkg-config. commit de439f6d57b43871dbb3d23f5a9ab8c9af9c4ef2 Merge: 518077fd6 e369a22fd Author: John Bowman Date: Thu May 23 22:52:55 2024 -0700 Merge branch 'master' into template. commit e369a22fd851e63c2f1e75b098a572778f932d86 Author: John Bowman Date: Thu May 23 22:52:21 2024 -0700 Support COMPACT=0 again. commit 518077fd67809c0b847982708e7695405d51ea03 Author: John Bowman Date: Thu May 23 21:17:55 2024 -0700 Improve 32 bit integer detection macro. commit c451de132d783606f8aee2c8bd6214f1a972de3e Author: John Bowman Date: Wed May 22 22:04:30 2024 -0700 Remove obsolete code. commit eee7be909c837074d690f5377324940c1c22556b Author: John Bowman Date: Wed May 22 21:57:45 2024 -0700 Revert "Remove obsolete code." This reverts commit 82da5932f7dfa59337840abfec723de14edaee98. commit 82da5932f7dfa59337840abfec723de14edaee98 Author: John Bowman Date: Tue May 21 23:31:34 2024 -0700 Remove obsolete code. commit 652038f70d54f8fce993312063897b7d67e26649 Author: John Bowman Date: Tue May 21 23:21:00 2024 -0700 Avoid particular compile error if Int=int. commit 03916a9cd8a2cab8c6b8ebd48c4b9aa2be03a339 Author: John Bowman Date: Tue May 21 23:12:58 2024 -0700 Revert "Avoid particular compile error if Int=int." This reverts commit 6e8222e13ad71b03376c84f259bf126944beb303. commit 3baf11a2ef131e779dde06356f6c20ac3d4aaded Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue May 21 00:18:35 2024 -0600 XASY: Use windows temp directory directly. commit 51f58653157f5a1a11f98bc10ac3f41c4f18a694 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue May 21 00:17:28 2024 -0600 XASY: Move xasy files and imports for compatibility with PEP 517 packaging system. commit b828e918cf716d1aab2a5c65472c523bc6d3154a Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue May 21 00:02:55 2024 -0600 XASY: Add version generation to build aid script. commit 9c23ab47190f0abcba32b1d82a426adff34cd771 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon May 20 12:48:49 2024 -0600 XASY: Add aid scripts for development. commit 87f8f280897e8fa61b6e7d6ee876f5a536b6efd5 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon May 20 12:43:21 2024 -0600 XASY: Remove duplicate gitignore files in main asy directory. commit dc8b4b85b9c3b3b22fa0831ba005b1750c8082cb Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon May 20 12:30:55 2024 -0600 XASY: Add buildtool script. commit fcac100d96025f6b16e0629c769542eca25a7c6f Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon May 20 12:30:10 2024 -0600 XASY: Add develop requirements. commit 3912b7d779d4135b0a8bb1f92ae326b52336e6c0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat May 18 23:37:16 2024 -0600 XASY: Add gitignore for xasy. commit 2ab4ac960bdd206a190da463647b9def55afb213 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat May 18 20:08:31 2024 -0600 XASY: Remove rsvg-convert from requirements file. commit f16cd641e51e5dde9c28aa4735c7e9be9d1123fc Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat May 18 20:07:35 2024 -0600 XASY: Update requirement versions. commit db9b2954ff472fbda07f95bf1df7e2e6ef8fe687 Merge: b66715648 8fbeeaa6b Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat May 18 20:03:10 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support commit 8fbeeaa6bb7a84be36942b0622294391e46783de Author: John Bowman Date: Fri May 17 16:03:19 2024 -0700 Fix documentation. commit b66715648df3559650101d343f5c34399e90bc8b Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Apr 11 11:32:45 2024 -0600 ASY: Increment version to 2.90 for cmake. commit 9d9d67aab1bc9fd2444e9b40852fc84b8b05ea66 Merge: da0ecbd4e 8b606e7a6 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Apr 10 23:35:31 2024 -0600 Merge pull request #10 from vectorgraphics/msvc-support update msvc support commit 8b606e7a66797d6f8c99283733a7813e0894e00e Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Apr 10 23:02:58 2024 -0600 CMAKE: Fix readline import. commit ee52a02fde8d472adb0c3503624fa50bfc4816c4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Apr 10 22:40:08 2024 -0600 CXX: Change RPC macro to HAVE_LIBTIRPC. commit b2f03f07111984f2466ebac0dc689f15868be925 Merge: da0ecbd4e 8371bce08 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Apr 10 22:17:59 2024 -0600 Merge remote-tracking branch 'origin' into msvc-support commit 154a9d938d5c97aa75e83a88ef3de22444d422a5 Author: Jouni K. Seppänen Date: Fri Apr 5 15:21:57 2024 +0300 Integrate with flycheck Flycheck is the modern way to do on-the-fly syntax checking and linting in Emacs: https://www.flycheck.org/en/latest/index.html This adds a checker if flycheck is loaded. The checker uses the user-defined asy command, with -noV to avoid creating a new viewer, and a temporary file as the output target. commit 8371bce0828789ba8d991a3e57b5314fd9278bf6 Author: John Bowman Date: Sun Mar 24 20:30:32 2024 -0700 Increment version to 2.90. commit 92e96dde395fdb9707bd1bb9960e83146411ffa1 Author: John Bowman Date: Sat Mar 23 14:12:38 2024 -0700 git subrepo pull (merge) --force LspCpp subrepo: subdir: "LspCpp" merged: "87a67d162" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "87a67d162" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit a45d527a2a81bb8662b4ca8a25ed287a739ccfed Author: John Bowman Date: Sat Mar 23 13:58:31 2024 -0700 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "b978a914b" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "b978a914b" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit 6e8222e13ad71b03376c84f259bf126944beb303 Author: Charles Staats III Date: Fri Mar 22 18:45:11 2024 -0700 Avoid particular compile error if Int=int. commit 63359273ebbd562fcd5f269eb08e5ce2d59bd1bf Merge: 4e0d0dcb1 d3f67352c Author: Charles Staats III Date: Fri Mar 22 09:26:47 2024 -0700 Merge branch 'template' of https://github.com/vectorgraphics/asymptote into template commit 315ca8cbe34cee0b5079bd669060b568da7b342a Author: John Bowman Date: Thu Mar 21 22:23:47 2024 -0700 Revert "Initialize structs declared within templated imports." This reverts commit 12baa706a2162acd5a555af922105a4061fbd0f8. commit d3f67352cda9f7ad6cb52eb15b925ec594a923af Author: John Bowman Date: Thu Mar 21 22:21:43 2024 -0700 Update last revision. commit 719c11747ff45acd7f0cf4b8810b4170f74c3b90 Author: John Bowman Date: Thu Mar 21 22:05:05 2024 -0700 Add templated import initialization test. commit 4e0d0dcb17b53f9a427154b0ac6775ed2ba8e2d7 Author: Charles Staats III Date: Thu Mar 21 20:12:38 2024 -0700 Mostly cosmetic changes. commit 84eceac38b494271aaf4063a8c568a3e9f46f20a Author: Charles Staats III Date: Wed Mar 20 14:20:35 2024 -0700 Remove no-longer-needed workaround. commit a2f2984eeed93a70a148f49f1d5ce9ff4be9ddea Author: Charles Staats III Date: Wed Mar 20 14:02:16 2024 -0700 Revert "Initialize structs declared within templated imports." This reverts commit 12baa706a2162acd5a555af922105a4061fbd0f8. commit ce9a9ce520cebbc6ea508e12b53542a0d14a92ea Author: Charles Staats III Date: Wed Mar 20 14:01:37 2024 -0700 Add additional tests from datastructures branch. commit 033715655b4165ba2d00aaf9640bfb9b505d593a Merge: 2bc145021 de239a50c Author: Charles Staats III Date: Tue Mar 19 20:49:33 2024 -0700 Merge branch 'template' of https://github.com/vectorgraphics/asymptote into template commit de239a50c0681502d6405038e649997f49e2d27d Merge: 3429cdc71 337b9f378 Author: John Bowman Date: Tue Mar 19 20:44:00 2024 -0700 Merge branch 'master' into template. commit 337b9f3786c808e746aa0446784821813e5b0f4c Author: John Bowman Date: Tue Mar 19 20:31:40 2024 -0700 Remove spurious parenthesis. commit 2bc1450213574aa01a3c415c3b36f7ffc556cc13 Author: Charles Staats III Date: Mon Mar 18 10:35:45 2024 -0700 Reformat too-long line. commit 3429cdc71e39e53a08f1784137bcbf4fc7599fde Author: John Bowman Date: Sat Mar 16 22:46:10 2024 -0700 Suppress redundant templated imports. commit 459e6267d41a0524c92d4ec1db4d5a0a67fc1080 Author: John Bowman Date: Sat Mar 16 00:10:17 2024 -0700 Enable static builds even if pkg-config is missing; support static linking of gsl library. commit 12baa706a2162acd5a555af922105a4061fbd0f8 Author: John Bowman Date: Fri Mar 15 21:36:36 2024 -0700 Initialize structs declared within templated imports. commit a7e3c81f52eec7044a4a5c0eec492973ede513ab Author: John Bowman Date: Fri Mar 15 20:14:38 2024 -0700 Rename virtual function to v to avoid confusion. commit a8c142c2e21e80f0bfdcb944dccc64787345b029 Author: Charles Staats III Date: Wed Mar 13 20:30:32 2024 -0700 Slight improvement: `new T` now seems to work. commit 7e17096b22d18d133d1bc5916b6e32c0cb24ad10 Author: John Bowman Date: Tue Mar 12 22:48:47 2024 -0700 Restore LDFLAGS; don't look for tirpc under MacOS. commit 90cdfac04e3946638cf790d39e3e163833c1fe18 Author: John Bowman Date: Sun Mar 10 12:00:14 2024 -0700 Define correct preprocessor symbol if static library is unavailable. commit 62bbff376a55116c118b36f54c251992fd75a99b Author: John Bowman Date: Sat Mar 9 16:11:25 2024 -0800 Don't require pkg-config. commit c3d0888ca2b3e15fc2774ef1486cf41cf9f63cf4 Author: John Bowman Date: Fri Mar 8 08:06:31 2024 -0800 Increment version to 2.89. commit 710f205a8f251c206c0204492fb54255f17feaf9 Author: John Bowman Date: Fri Mar 8 00:13:46 2024 -0800 Rename HAVE_RPC_RPC_H to HAVE_LIBTIRPC; add --enable-xdr[=yes] configuration option. commit fa488f4aaf9f72687355855dd7e1db9415b8a29b Author: John Bowman Date: Thu Mar 7 23:09:23 2024 -0800 Support --enable-static again; allow static builds of libtirpc. commit 0e369f784e14183f99c82b63251579bd7c3e3d4d Author: John Bowman Date: Thu Mar 7 22:13:46 2024 -0800 Resolve ambiguity in statistics.h. commit 49eb2e457ad48228415ad596714bfdf19f4c8b30 Author: John Bowman Date: Wed Mar 6 10:30:48 2024 -0800 Remove unused declarations. commit 8e1d621208c054b4a53c05fbc2fd906b3827729c Author: John Bowman Date: Tue Mar 5 11:38:11 2024 -0800 Optimize dvisvgm output by default. commit 89ed2013c4d6fa715adc2067da2116166626ef7b Author: John Bowman Date: Tue Mar 5 09:41:06 2024 -0800 Specify PDF 1.5 instead of 1.4. commit da0ecbd4e2f79eac43283d2e20f24eb7aeaed37c Merge: 091c183d6 00ac5da37 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Feb 29 22:01:19 2024 -0700 Merge pull request #9 from vectorgraphics/msvc-support Update msvc support commit 00ac5da370e5a7db35e465e275a6de607b25171f Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Feb 29 21:23:12 2024 -0700 CI: Add version suffix to windows CI build. commit 22b0a2d43835592297996564793a9967c2e04f21 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Feb 29 12:29:43 2024 -0700 CI: Add version suffix to linux CI build. commit ec303780fb6ce55cf20906470cc23644274d0468 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Feb 29 12:22:07 2024 -0700 CXX: Change process.h to processutils.h since it collides with Windows' existing process.h. commit 943b0d5440449ae9f41f443057ddeb92c35b7512 Merge: 1bf3e0ec4 cd07b1d33 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Feb 29 12:15:52 2024 -0700 Merge branch 'master' into msvc-support commit 1bf3e0ec4bb154f670b6e44f08b3262601eba0b0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Feb 29 12:11:46 2024 -0700 CMAKE: Add documentation for speicfying custom version suffix. commit d05ccd29522b043c74d8992058bf883375b64e07 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Feb 29 12:09:33 2024 -0700 CMAKE: Add support for custom version suffix. commit fd497578538a3b2c589d0a6fea51823a58740a45 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Feb 29 11:29:14 2024 -0700 CMAKE: Bump version. commit cd07b1d33a9a500e7a4a5835ad39168621ed255f Author: John Bowman Date: Wed Feb 28 11:31:53 2024 -0800 Fix documentation. commit b2d7d303271d137e77886bd071749bbbbbbe9c58 Author: John Bowman Date: Wed Feb 28 11:26:37 2024 -0800 Disable dvisvgm optimization by default. commit 39a6232364a8cf27778224ec60327bfd8d9588e7 Author: John Bowman Date: Mon Feb 26 18:06:22 2024 -0800 Increment version to 2.88. commit 1826b3b38064170d2484af6d9a5e5ac2abce9b77 Author: John Bowman Date: Mon Feb 26 16:35:57 2024 -0800 Mark mapArray(string,string) as deprecated. commit 4ec87566c1204c55248ce57e38127fe583ab3337 Author: John Bowman Date: Mon Feb 26 15:50:12 2024 -0800 Improve compiler diagnosic. commit a89edb5736e69186339d1b799eb50a98d13fc7b2 Author: John Bowman Date: Mon Feb 26 15:42:41 2024 -0800 Address issue #421: reduce redundant latexmk runs. commit 3b02ca59cd8f482f42c89d508795879a643d6195 Author: John Bowman Date: Mon Feb 26 15:33:30 2024 -0800 Address issue #424: Add support for latexmk -c. commit 7551b9e67293d2038a6e5d9c75d389a4cd28822a Author: John Bowman Date: Mon Feb 26 11:51:11 2024 -0800 Address issue #422: update .gitignore. commit 27d7d04d2ac279443249465b7090fdb8aea1ee1b Author: John Bowman Date: Mon Feb 26 11:40:56 2024 -0800 Address issue #423: give the temporary rendering window a distinctive name. commit 961f88aa6f754fdb57166cf121b4d707b54d6bcd Author: John Bowman Date: Sun Feb 25 23:19:48 2024 -0800 Add settings.v3d option to embed V3D content within a PDF file. commit 215f32fbf68ed4a2626e37a62552e2c0606744c9 Author: John Bowman Date: Wed Feb 21 00:49:39 2024 -0800 Delete trailing whitespace. commit 80d5e62455a2ad2a20b27acf66a141149f4c1a59 Author: John Bowman Date: Wed Feb 21 00:10:10 2024 -0800 Improve error messages and documentation. commit 542d92da66d913edc425dab33beb3c187cf419f9 Merge: c60f3b513 c551fa24a Author: John Bowman Date: Sun Feb 18 23:50:08 2024 -0800 Merge branch 'master' into template. commit c551fa24a910dad4c456d8970f9a32ea1ebb632f Author: John Bowman Date: Fri Feb 16 22:09:44 2024 -0800 Open context menu only for GUI-drawn items. commit 091c183d6a6c5e5e7e53b87488e11b81b3b4235c Merge: c56482845 585bad046 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Feb 14 21:44:54 2024 -0700 Merge pull request #8 from vectorgraphics/msvc-support Add packaging step to CI. commit 585bad046cb9d8c319d0775bf000551afc9b0041 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Feb 14 11:52:08 2024 -0700 CI: Add package step for windows. commit 315f32d9bbfedee7602b4deb03810a79139fbee2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Feb 14 11:46:29 2024 -0700 CI: Add package step to linux build. commit c60f3b513670f266a33c55dd0e11255d1ebaac8d Author: John Bowman Date: Mon Feb 12 21:24:21 2024 -0800 Rename index to sigHandle. commit b2c27b9c1a71b0b85b27624d33585dbd598810ed Author: John Bowman Date: Mon Feb 12 21:11:37 2024 -0800 Implement and use mem::pair instead of std::pair for importIndex_t. commit 4c731ad2b18686a7e046529a1f3aa26c06cd99b4 Author: Charles Staats III Date: Mon Feb 12 20:28:29 2024 -0800 Address some comments. commit 124722665617a004985dd3a59baaa41a49109611 Merge: 167db8b84 d8fed60a4 Author: Charles Staats III Date: Mon Feb 12 19:43:53 2024 -0800 Merge branch 'master' of https://github.com/vectorgraphics/asymptote into template commit 167db8b845afd10640316d87b893e37ea0bc8617 Author: Charles Staats III Date: Mon Feb 12 16:26:24 2024 -0800 No longer make typeParam copyable. commit be652a26a41501ccb7857d89993f67830302041c Author: Charles Staats III Date: Mon Feb 12 16:10:08 2024 -0800 deduplicate intSymbol and templatedSymbol lookup commit 8a87711cc92c4e0d40f24b7066c4c8c3ddb9df49 Merge: 24c9d6340 df7761482 Author: Charles Staats III Date: Mon Feb 12 13:09:32 2024 -0800 Merge branch 'templateVar' into template commit df77614820d4072a0070d6dbf5e84b84ce92d8e2 Author: Charles Staats III Date: Mon Feb 12 13:05:16 2024 -0800 In debug mode, do not stop trying to parse template file at the first error. commit 24c9d6340f924bd13a6a2700edf61729c90d51f4 Author: Charles Staats III Date: Mon Feb 12 09:52:17 2024 -0800 reword error message commit fa7da7c87ee397795becde4c3024ad7d7606d67f Author: Charles Staats III Date: Mon Feb 12 09:46:19 2024 -0800 Rename getType to getAbsyntaxType commit 363353f4c816c1828e6bb83634604e82c7509ee3 Author: Charles Staats III Date: Mon Feb 12 09:24:58 2024 -0800 Use for(;;) rather than while(true) in C++ for consistency. commit 35c79ac9b513c39a42400b1a5646865b808ea284 Author: Charles Staats III Date: Mon Feb 12 09:10:55 2024 -0800 checkpoint commit dca44de27ef3aad88bae6bf760938e060bb33dc6 Author: Charles Staats III Date: Sun Feb 11 19:22:45 2024 -0800 Switch use of namedTyEntry to pointers commit 566207d2c701114b7b1a71813e7dc4ae69ca70da Author: Charles Staats III Date: Sun Feb 11 18:45:07 2024 -0800 Replace use of std::pair with a new gc-enabled struct. commit 1b9b8ed09b0315284d9cbea0da4dd3050e198623 Merge: 8463465a5 034891bdb Author: Charles Staats III Date: Sun Feb 11 18:20:57 2024 -0800 Merge branch 'template' of https://github.com/vectorgraphics/asymptote into template commit 8463465a5f8c7e93f72d17e51649a3fee0793a8d Author: Charles Staats III Date: Sun Feb 11 18:20:27 2024 -0800 fix errors from previous commit commit 1c2b6dc6d0dbf517f53f48bb1ccd95c95f954969 Author: Charles Staats III Date: Sun Feb 11 18:08:56 2024 -0800 Shorten lines longer than 79 columns. commit 034891bdb505ac9c7ee6c7a668c994110cb81ac3 Author: John Bowman Date: Sat Feb 10 08:56:33 2024 -0800 Ignore map.asy when building asy-keywords.el. commit e58211a522e856a4f93d2ff29da25c00db35feca Author: John Bowman Date: Thu Jan 18 13:14:09 2024 -0800 Address issue #392. commit 91a5acbd6ac78ce44712cb486d5e97cf36077a24 Author: John Bowman Date: Thu Jan 18 12:46:41 2024 -0800 Fix issue #419: suppress duplicate error message. commit bec734026b6af2fe3724cbc3104df9076c07c5ae Author: Charles Staats III Date: Sat Feb 10 13:28:39 2024 -0800 Document templated imports commit 5c811376a71496c2325f31e5aab12eb0b2cc6f16 Author: Charles Staats III Date: Sat Feb 10 13:28:26 2024 -0800 Add wrapperWithEquals.asy (left out of previous commit) commit d8fed60a48d98cd290b14cba614c8d30ad4743ee Author: John Bowman Date: Sat Feb 10 08:56:33 2024 -0800 Ignore map.asy when building asy-keywords.el. commit 647b6c5732ec94a48f0f0b2446f02c86888fe7e7 Author: Charles Staats III Date: Thu Feb 8 15:26:41 2024 -0800 Add TODO comments commit 9498f157a44bd9e96ffcefdde709da20110c2cca Author: Charles Staats III Date: Thu Feb 8 15:22:12 2024 -0800 tests with wrapper commit c564828450c3bcbaf4b5493aab02f8422c3bb0f7 Merge: 44544fc86 e3d8a5cb5 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Feb 7 00:42:05 2024 -0700 Merge pull request #7 from vectorgraphics/msvc-support Update a/ci-staging commit e3d8a5cb53bebca0710eda673eae283e3efaaf31 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Jan 15 23:30:45 2024 -0700 CMAKE: Add Debug compile flag to all debug builds. (cherry picked from commit ccc94a2ac66f88850d6295686701ff1c3cadab81) commit d1973fffa1dd5e29c1738e851c388c368ab2f78c Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jan 9 02:46:25 2024 -0700 clang-format: Add BreakAttributes to formatting. (cherry picked from commit 9c3bccfe8508a0eb425228b1cc63bd010aeb460f) commit c59e820c4b5d528f4ccbd75287f0213b9db027e3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jan 9 02:05:12 2024 -0700 clang-format: Use C++17 as formatting standard. (cherry picked from commit 0ea0878a89bff32ca48b94629c51516e9a0b7e1d) commit accc9032f21964b6a06cb016178195d21bd08d3a Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Feb 4 13:05:39 2024 -0700 CMAKE: Remove redundant asy-base-file target. (cherry picked from commit fda3082675200917795903267d3db07f284dad41) commit e06e7fde332227bfb1818ea5175815abafd98824 Author: John Bowman Date: Thu Jan 18 13:14:09 2024 -0800 Address issue #392. commit 279d9d49e383a80ca0e82d053bc04d387aa3ca12 Author: John Bowman Date: Thu Jan 18 12:46:41 2024 -0800 Fix issue #419: suppress duplicate error message. commit 79fd87c4075031f8a062c0060736d3e366f0f500 Author: John Bowman Date: Tue Jan 16 17:27:00 2024 -0800 Suppress warning message regarding boolean operator. commit e8f7bc100601912298eaaa56758aa6994d1db998 Author: John Bowman Date: Tue Jan 16 17:23:33 2024 -0800 Revert "Fix boolean operator." This reverts commit fffdb62031f4f68007b2721bdd8ef86ef37d8e3d. commit b42f10858fda88dac5f2739fc1e4a0b7d47a9aba Author: John Bowman Date: Mon Jan 8 17:56:46 2024 -0800 Update fftw++.h and seconds.h. commit ee98d7193f93ace9ea168192ec32d31838e34025 Author: Charles Staats III Date: Mon Feb 5 16:48:11 2024 -0800 template-based mapArray (with test but no doc yet) commit ea1f62e404b439528c4c25e390b7438bf4fb81cd Author: Charles Staats III Date: Sun Feb 4 16:39:34 2024 -0800 Add two tests for templates (one of which fails). commit 6c84defa29e4e48e55e39fc75aec83dd746c687f Author: Charles Staats III Date: Sun Jan 21 09:05:09 2024 -0800 More natural error from camp.y. commit 44544fc865ff410e396859f059f9539c0fe60fd7 Merge: 55ee4cd75 f65f80853 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Jan 20 23:12:32 2024 -0700 Merge pull request #6 from vectorgraphics/msvc-support CI: Run apt-get update before installing. commit f65f808536cce3a0cf9a5993f525fbece5f120b7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Jan 20 22:52:24 2024 -0700 CI: Run apt-get update before installing. commit 9810e8b2d175837fd86d2e9051f1b9ab0644b85d Author: Charles Staats III Date: Sat Jan 20 14:33:18 2024 -0800 Added errortest cases to incorrectly import correct template. commit c6e405563c4cabcb6343e483b5fa20824bd4de05 Author: Charles Staats III Date: Sat Jan 20 14:18:00 2024 -0800 Catch 'typedef import' in wrong order; add test for this. commit b627a2f427402d528a96e505222fd09db847d1a7 Author: Charles Staats III Date: Fri Jan 19 15:51:12 2024 -0800 Added some template-related tests to errortest.asy commit 484b430df6edc6d3f2410f840391b7b0172e1164 Author: John Bowman Date: Thu Jan 18 16:10:32 2024 -0800 Respect debug flag. commit dd702e6db7411b65e0265734b563bc56e634e04f Author: John Bowman Date: Thu Jan 18 14:21:04 2024 -0800 Add missing semicolon. commit 45126f4b984492c90ca11a4a93346ce2fe135cbc Author: John Bowman Date: Thu Jan 18 13:14:09 2024 -0800 Address issue #392. commit b96786e3014f6b3f0154e1ccb536cce823702965 Author: John Bowman Date: Thu Jan 18 12:46:41 2024 -0800 Fix issue #419: suppress duplicate error message. commit e7fc3aef8d0715408c95f0e2e6e4bb4da8ab71fb Author: Charles Staats III Date: Wed Jan 17 21:50:52 2024 -0800 better error message for positional template arg commit db40b20dd93c78a1441a4a7d6acd4a4b24888c7a Merge: d34926dfc 5650e0155 Author: Charles Staats III Date: Wed Jan 17 21:27:10 2024 -0800 Merge branch 'template' of https://github.com/vectorgraphics/asymptote into template commit 5650e0155f9b3411483dcc09dc72993f95768281 Author: John Bowman Date: Wed Jan 17 20:15:22 2024 -0800 Use a unique signature hash for identifying templated imports. commit d34926dfc945b03d1c1e8a950597ff2e8d18fa5e Merge: b5d3eb121 c66deaf27 Author: Charles Staats III Date: Wed Jan 17 18:04:05 2024 -0800 Merge remote-tracking branch 'origin/template' into template commit b5d3eb1212ab52edbdc75395cb2ba07ac6cee989 Author: Charles Staats III Date: Wed Jan 17 17:58:17 2024 -0800 Make 'from template access' work; a few changes regarding scopes and error handling commit c66deaf27e846314649f696418cd4cb6d6ba977b Author: John Bowman Date: Wed Jan 17 17:36:17 2024 -0800 Don't process templated imports with mismatched parameters. commit 492506c6009829ef64f738f0ed287c4042865fed Author: Charles Staats III Date: Wed Jan 17 14:57:11 2024 -0800 checkpoint; extraneous errors fixed? commit 50961c069288547c1ca3431a225b274ad34154f2 Merge: 3f55d6eba dd4b63cc1 Author: Charles Staats III Date: Tue Jan 16 18:52:03 2024 -0800 Merge branch 'master' into template Incorporate fix to "from module access (type & method)". commit 3f55d6eba90de078fcdcd1b314a251c5aff48df2 Author: Charles Staats III Date: Tue Jan 16 18:38:13 2024 -0800 checkpoint commit dd4b63cc1f7cf0c9bdb716db9963b4a0de8e7d27 Author: John Bowman Date: Tue Jan 16 17:27:00 2024 -0800 Suppress warning message regarding boolean operator. commit 8652763972c48b7675d7a8707499311c1d1a5030 Author: John Bowman Date: Tue Jan 16 17:23:33 2024 -0800 Revert "Fix boolean operator." This reverts commit fffdb62031f4f68007b2721bdd8ef86ef37d8e3d. commit 23ab319cc4d6a9b2c58ded0e44201a49744031c5 Author: John Bowman Date: Mon Jan 15 20:29:12 2024 -0800 Use signature hash for indexing templated imports. commit 386da6bf46d8f05ba51425a66814dcd2bda0cd65 Author: Charles Staats III Date: Mon Jan 15 19:24:05 2024 -0800 Seemingly working template declaration for the module to receive template parameters. commit 40d262ade847a245fe844733bd55f865d3e55556 Author: Charles Staats III Date: Mon Jan 15 16:11:37 2024 -0800 Syntax to receive template params or supply header commit 6f04389e02b8eae711f200d942b15a05c42b38c1 Author: Charles Staats III Date: Mon Jan 15 14:43:40 2024 -0800 Move 'add symbol' logic closer to module execution commit 3339ac1fe6ac80d4bb3f56c11b3bdd753275b934 Author: John Bowman Date: Sun Jan 14 23:57:41 2024 -0800 Allow multiple templated imports. commit 74ae11c4ff563a9ecc43f39f332f4399c939a44e Author: Charles Staats III Date: Sun Jan 14 13:47:05 2024 -0800 Template params are used on the first import only commit 4afba32597347b225164d284f2985e62c350dcba Author: Charles Staats III Date: Sat Jan 13 16:03:37 2024 -0800 Notation parses but always maps T to pair. commit 0c7fa4112d7ba8eb61ac0b3d83820136fc649af9 Author: Charles Staats III Date: Sat Jan 13 15:41:25 2024 -0800 checkpoint commit 82c24dc684f7250a5e9a290e4459537ee1edc628 Author: Charles Staats III Date: Thu Jan 11 14:32:16 2024 -0800 checkpoint commit 272274b2474264a1f6ba4fa84d6fb94305d71500 Author: John Bowman Date: Mon Jan 8 17:56:46 2024 -0800 Update fftw++.h and seconds.h. commit aa1cb4d1084c2eb54fccb89e1626d3340e948568 Author: Charles Staats III Date: Mon Jan 8 14:35:52 2024 -0800 checkpoint commit df359f5d9a382f48caef4c0dc22c67165a7e182e Author: Charles Staats III Date: Thu Jan 4 15:47:18 2024 -0800 translate decdec to formal commit a9850d7d94a2b65ad3c38d1607d5d3850242a050 Author: Charles Staats III Date: Fri Dec 29 10:12:33 2023 -0800 dummy parse from Andy commit 55ee4cd758034e16b9081619c49a1838edbbe30b Merge: 2e4f39adb 558087253 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 7 02:51:25 2024 -0700 Merge pull request #5 from vectorgraphics/msvc-support Update a/ci-staging commit 5580872533b1b47c55bd45012322a474b1c55803 Merge: 4a69c2eab 2e4f39adb Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 7 02:24:34 2024 -0700 Merge branch 'a/ci-staging' into msvc-support commit 4a69c2eab22be42a66d6c5301ad5c8a69f47f3b5 Merge: 544184aa4 98d66af9f Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Jan 7 02:22:41 2024 -0700 Merge remote-tracking branch 'origin/master' into msvc-support commit 98d66af9f0a7d942ffcf81a21d2d6aa9961bf12d Author: John Bowman Date: Tue Jan 2 17:06:05 2024 -0800 Improve diagnostic. commit 2e4f39adb0c07b88fa78d25808b2cc1501afda2c Merge: 93553dc8b 544184aa4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Jan 1 17:28:39 2024 -0700 Merge pull request #4 from vectorgraphics/msvc-support update msvc support to a/ci-staging commit 544184aa474a33eba1e1ee40af50c372be39649d Merge: 64041044e 8c83a8e87 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Jan 1 17:04:25 2024 -0700 Merge remote-tracking branch 'origin/master' into msvc-support commit 64041044ecfd1419c5d2e1b3dc83149d55ee964d Author: John Bowman Date: Sun Dec 31 22:20:22 2023 -0800 Fix issue #414: restore missing outpath. commit f05eb109fab3e7dc3ca69dee740cbca08e731cd3 Author: John Bowman Date: Sun Dec 31 06:56:58 2023 -0800 Fix issue #412: prevent inferred assignment of void type. commit 35b1d8252140e5e296b043416205d0cc8cfe7df1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Jan 1 12:53:39 2024 -0700 CI: Add unit testing to linux's CI step. (cherry picked from commit 84bb6db450290594d9e679107bb41e90952e3070) commit d693606274e62d344a744ae1cbdf68a39c74f9e4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Jan 1 00:35:59 2024 -0700 CI: Build and run unit tests on windows CI. (cherry picked from commit 0cc5f95d94d3141e464688f4a20ce7aa4370c2d6) commit 93ccd34992a91b5094bb7bfa993b4a03ee34bb1a Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Jan 1 00:08:22 2024 -0700 GTEST: Add cxxtests. prefix to all cmake tests. (cherry picked from commit 1906f45f342b7af2d137519c5b4266853f6504e3) commit 9ae0c37abb62330914f40bffab534c5564c004ba Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Jan 1 00:02:32 2024 -0700 CI: Exclude vcpkg_installed in linux CI to speed up artifact uploading. (cherry picked from commit b2c9ebd822e6c1289e9310288d403a1efeeb6e74) commit 9e958fca4d326354579b74a5bd4a3c042498a5bf Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 31 23:49:12 2023 -0700 CI: Extract windows pwsh initialization to a common variable. (cherry picked from commit c855f06ae8433800bbf05ab570afc95c12df45d4) commit c7d5ded52971f031db574d041b9c88d718a56b98 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 31 23:44:24 2023 -0700 CI: Remove vcpkg cache from configuration artifact since they can be installed by cache. (cherry picked from commit 76c0d5bd94d2ebeff81b81735cef95574f286daf) commit a1af220ff70e602341007e927aae4525e88d6410 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 31 18:04:04 2023 -0700 CXX: Use backported optional for C++14 compatibility. (cherry picked from commit 457688ecc9fb99bdd1fcf846066cbd860107c76d) commit f68e05b9790d61139eb35c2c081a0e9ba237618d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 31 14:26:38 2023 -0700 OPTIONAL: Add Optional backport to build. (cherry picked from commit 9d9c66adc9dc459cffacc0bd0e2e6f5a97e2bcf4) commit 130f4c966981a2d0cea4ca5f372d47fc37cbff0d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 19:49:48 2023 -0700 CMAKE: Add PACKAGE_STRING macro. (cherry picked from commit 56c93531dd01639bf4c888e360330ca073cf608c) commit 054fef7e18deb7679d73e8e0c6bc498e0c7c0ed1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 19:41:15 2023 -0700 CI: Trigger build actions for push from any msvc-* branches. (cherry picked from commit 0b7586c8c13bdeaa3608ca25d59c09901a81e906) commit 6b01ec8d2697309b11262c6ffde8138dc1c3bd29 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 19:39:47 2023 -0700 CXX: Add _USE_MATH_DEFINES to all macros. (cherry picked from commit b5ccc2f1af1f87f48db5c56aacaf85e2455f0b68) commit 8c83a8e8710f245bab9833850fd8381c612ea1b9 Author: John Bowman Date: Mon Jan 1 13:17:56 2024 -0800 Address issue #410: Support latexmk --output-directory. commit 112654bcf832c49ef7b24df4fe0c55d7362174cc Author: John Bowman Date: Sun Dec 31 22:20:22 2023 -0800 Fix issue #414: restore missing outpath. commit 4f4a3276fce7dab6b4ee2199fc90157fe91f9d92 Author: John Bowman Date: Sun Dec 31 06:56:58 2023 -0800 Fix issue #412: prevent inferred assignment of void type. commit 93553dc8bdc772277d181b2f4e176f450f6655c2 Merge: 977b8d31b 5176b7c0e Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 14:48:46 2023 -0700 Merge pull request #3 from jamievlin/ci-windows-impl CI: Add windows CI workflow implementation. commit 5176b7c0efcce567859c0dc7cbaf3bcf03fb1bba Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 14:36:11 2023 -0700 CI: Add artifact uploading to build-windows-msvc-x64. commit de6b05f3bfcbdab726b642eff4c7cae4ce130e55 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 14:19:45 2023 -0700 CMAKE: Ensure all headers are generated before preprocessing file. commit f54890e85012d70213ed7e983fa632000d690f42 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 14:15:09 2023 -0700 CMAKE: Rearrange generated files order. commit 4867141a15d5ca8ef715c3530889f7fd923cf68a Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 14:06:05 2023 -0700 CMAKE: Move generated directory creation to top of generated-files.cmake. commit 69836fa89e0c41148fa38642a9910c6906352525 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 12:57:19 2023 -0700 CI: Trigger CI on either manual dispatch or push to msvc-support. commit 92aeabe0f4127fd7332c2d09b6f8bb6a3b9b92ea Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 11:53:27 2023 -0700 CI: Add windows CI workflow implementation. commit 4ae0f88895253e01ab213871d66e600a7696aa3a Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 11:55:52 2023 -0700 CI: Add initialize windows action file. commit 977b8d31b3a204e8c557ab0c9b86ea0557ef35d6 Merge: 60024dde4 0078b611d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 11:49:07 2023 -0700 Merge pull request #2 from jamievlin/ci-windows add stub windows CI commit 0078b611d34b0ad7b667b6f81ae53e5b29d5c97c Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 11:43:57 2023 -0700 CI: Add stub windows build CI workflow. commit 8d18a50951b1239fb0ca3b000e5772ae5406e6bf Merge: d6e86bd10 60024dde4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 02:40:38 2023 -0700 Merge branch 'a/ci-staging' into msvc-support commit d6e86bd10d4879d576c173e57c1ee53e8f1ccba1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 02:16:56 2023 -0700 CXX: Fix include for picture.cc. commit 60024dde4db321863e04690fabd15a032d2d2e78 Merge: 69c3e4a14 8428d007f Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 02:37:16 2023 -0700 Merge branch 'vectorgraphics:master' into a/ci-staging commit 69c3e4a14110d871d09193443904f419bcded8dd Merge: b468f92ab fdd82c8df Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 02:36:36 2023 -0700 Merge pull request #1 from jamievlin/ci-dev CI test commit fdd82c8df42a1d924071f293acc53ac16a0f0e6c Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 02:16:56 2023 -0700 CXX: Fix include for picture.cc. commit 6c09baa3bb7164f2dc7b0d762b35c098de003acd Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 00:55:25 2023 -0700 CI: Add github actions workflow file. commit a6b3c941959d73352573ba6dfddede8eeac08f48 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 30 01:44:29 2023 -0700 CI: Add actions file. commit 8428d007fb9ea47f9531c679acf6bd8f58dcbba5 Author: John Bowman Date: Thu Dec 28 23:55:02 2023 -0800 Fix typo (issue #411). commit 3cc5728993cd99154c079f4d49522a23665f509f Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 28 20:45:46 2023 -0700 SETTINGS: Remove default adobe acrobat detection for windows pdf viewer. commit dedd5977b4432135be959ffc4a10f7f6f26a26be Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 28 20:45:22 2023 -0700 WIN32: Set all default viewers to empty string commit 9bd6a6e7622583ad4ba0f14f4ab8e47b5683ae5b Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 28 20:43:24 2023 -0700 WIN32: Implement opening general files for display. commit 3ce675093b121cdbc4321b558c05f2e75cd5877b Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 28 20:31:04 2023 -0700 WIN32: Implement opening pdf/eps files with no viewer given. commit d03906428e4dd229e3dcced4e29c594f37a7a3e4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 28 20:29:20 2023 -0700 COM: Initialize COM if under windows. commit 244757a32f7742db001688f15298e6b88980dbe3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 28 13:32:53 2023 -0700 CMAKE: Add Shell32 to windows linking. commit 8d58c4ab4325285a21d4bb29c75119378bf6db1c Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 28 13:30:24 2023 -0700 WIN32: Add support for viewing html file with default browser. commit e69380bcabed61e785c7803d34f0fa84cbc5afd4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 28 13:29:35 2023 -0700 WIN32: Move GetLastError-based reporting to a separate function. commit ab7cbfd8674d042e9a28336a1a4ae0743394ec77 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Dec 27 23:07:02 2023 -0700 UTIL: Clean up SystemWin32. commit a6eb0153fbfac6767bb8274478e6d8d6f228b5b3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Dec 27 23:06:50 2023 -0700 UTIL: Add helper function to check if windows process is running. commit 99d9140a795b9fa09ede51464b05dfab75e3035e Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Dec 27 23:05:32 2023 -0700 WIN32: Query registry only if on windows platform. commit fb48e3bb840d655280118a651d9cfdc51dc520c3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 24 12:31:12 2023 -0700 WIN32: Fix registry query. commit 0838b9364348f0e842d1e0f6f9351ec2c829d172 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 24 12:30:41 2023 -0700 UTIL: Use backslash for stripFile and stripDir on windows. commit 6ce66134b6e2736aeaa276650a4e8ac4167477f0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 24 12:25:49 2023 -0700 DOCS: Move windows-specific notes to INSTALL-WIN.md. commit de4ea998f5ae372f47ad89f038e30e4d3345117b Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 24 02:00:27 2023 -0700 WIN32: Generate more detailed error for win32pipestream. commit 235e84c2b97d25d6cdc1da60ee921e08fc81e628 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 24 02:00:13 2023 -0700 WIN32: Add security attributes to nulfile. commit ba28e876ef5001e2960c82042fd21c540e72688d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 24 01:50:31 2023 -0700 WIN32: Check retcode correctly for System function. commit cedb7c6de8d4b5b531fdfed1479257f439cc7952 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 24 01:49:58 2023 -0700 WIN32: Fix PROCESS_INFORMATION typo for hStdErr. commit 1946a6c9565e44a5f8b1d34e8cb3e3c386473311 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 24 01:49:06 2023 -0700 WIN32: Update checkResult to print windows error. commit bb115360670dcb29730633811a373b3ed19913d7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 24 00:40:57 2023 -0700 WIN32: Fix CreateProcessA's arguments. commit 0b19d8d615b26a33d25291d81f9225a60d56161e Merge: b1e03f7a3 2b4140b09 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Dec 22 23:19:37 2023 -0700 Merge branch 'master' into msvc-support commit cf5f033cbe6fd008052b62033265e4fcc05face8 Merge: 0b07b0db0 2b4140b09 Author: Charles Staats III Date: Fri Dec 22 16:22:06 2023 -0800 Merge branch 'master' into using_typedef commit 2b4140b09ecf2df7312f93c59dff128b1a39c222 Author: John Bowman Date: Wed Dec 20 00:10:13 2023 -0800 Fix outname. commit f25a3a9627adb94eef4d1fbe1c97c4702d8d282f Author: John Bowman Date: Tue Dec 19 23:45:03 2023 -0800 Fix bug #373: avoid repeated stripping of file extensions. commit 3cc421585211a3a55bc9ca90e3eab5db8ee18508 Author: John Bowman Date: Tue Dec 19 23:14:21 2023 -0800 Only output v3d format for 3D files. commit b1e03f7a30bbbb36fb8675c77b176393a8489183 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Dec 19 21:11:46 2023 -0700 clang-format: Change clang-format style. commit f64bd104c950d1ff43176c534f1a126d18265107 Merge: be005add4 081db9d08 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Dec 19 20:44:46 2023 -0700 Merge branch 'master' into msvc-support commit 35c261216d6e45593ccd13155ca0ab31652adaf6 Author: John Bowman Date: Tue Dec 19 19:20:56 2023 -0800 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "1f397e56" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "1f397e56" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit 081db9d0865403a5d82a749e58f035479193ca8a Author: John Bowman Date: Tue Dec 19 19:17:52 2023 -0800 Fix LSP segmentation fault. commit be005add467c7822433f1dc8d2bc69c01b25d52c Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Dec 19 19:35:28 2023 -0700 CMAKE: Fix reserved file name. commit 488d80962c76cc60629f590e34b350459ea59621 Author: John Bowman Date: Mon Dec 18 22:33:47 2023 -0800 Fix bug #405: implicitly format integers with full precision. commit b882b8b4b483834aad94ae3ad36de38831dae7a1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 17 17:14:31 2023 -0700 DOCS: Edit docs to mention quick start scripts. commit 6a670adfa3a88008c62d025e6d67e1e8a063fdfe Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 17 17:08:52 2023 -0700 PWSH: Add quick start script for windows. commit ebfaac3d1e5a54eacded5b7221d9fdd372dbadb9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 17 16:31:08 2023 -0700 WIN32: Ensure compiler is cl for msvc/release* target preset. commit 5e1f0d06d572e50a7c743a7e74aa9b9a6fd49e6a Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 10 14:37:01 2023 -0700 XSTREAM: Move xstream's implementation to a separate file. commit 2b426301fec370c9f28dbec40b8152b33a56c430 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 10 03:13:57 2023 -0700 CMAKE: Enable RPC by default. commit 7df3801dac4472749cb78a053c2d3a190d26e735 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 10 03:05:59 2023 -0700 CMAKE: Add WIN32_LEAN_AND_MEAN to stop winsock.h's inclusion. commit ed70da29b70f6fac76ac3b2d1dccdc3fb84fa155 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 10 02:39:51 2023 -0700 XSTREAM: Make xdr win32 compatible. commit 81fc9d9320c0ed920ab351fc348a71027a276b6c Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 10 02:38:58 2023 -0700 XDR: Add common xdr file. commit fee33e1f020090f2af89790ea4ee0ced96559fc7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 10 02:37:40 2023 -0700 W32-XDR: Add xdr implementation for win32. commit 3ae7c4be102a56a98ff545b7b42a9ce09b1ed099 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 10 02:36:52 2023 -0700 CMAKE: Add fmem for common file-in-memory support. commit 8a1ff0510bfca90afda52a92bb5abd11d250e61b Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Dec 10 01:21:20 2023 -0700 COMMON: Include winsock2.h before any other includes to prevent winsock.h being included. commit 380cc71f3c903d9a37cbc8e43eaea1bdc6ea5351 Merge: 4eca64986 6868ca1a6 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 9 00:47:46 2023 -0700 Merge branch 'master' into msvc-support commit 6868ca1a66611d72f716e57617d1c9c6031d3fe7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Dec 9 00:00:49 2023 -0700 Add LSPCPP_USEGC macro flag in case of gc. commit 4eca64986392c0dadd2eb48fdb720f5dfc735931 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Dec 8 23:49:39 2023 -0700 CMAKE: Add boehm gc flag to lspcpp compilation. commit 9b0e491d5cf0af7e83c97a438b1ed0a3b0900a36 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Dec 8 23:49:11 2023 -0700 LSP: Fix line error in color request handling. commit 59b892c2936514c68167265d0f83a781e8768f9a Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 7 15:00:55 2023 -0700 REPO: Move additional files to misc directory. commit 24fa32a7fc88d580ff280dd82841c95777f3a426 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 7 14:58:18 2023 -0700 CXX: Use std::optional everywhere instead of boost::optional. commit 1a8ae56ed91e5b3e0b98140aef69925bd73cc9b8 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 7 12:47:43 2023 -0700 VCPKG: Add dependencies for LSP. commit 5a041e1d4d84f5a3b6ae4b855154240c3d5e1983 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 7 14:52:52 2023 -0700 CMAKE: Download LspCpp directly from cmake rather than git subrepo. commit 840c13599cff3231761dc8750a87006ccf1eca2d Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 7 12:48:00 2023 -0700 CMAKE: Enable LSP option. commit 75912e49fcfbc2942d1c370218c203a4c5e7c722 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 7 12:47:29 2023 -0700 WSL: Exclude WSL+linux specific options for LSP if compiling outside linux. commit c077d95169cf4cb4946ef174a1bb009559edc27c Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 7 12:46:43 2023 -0700 LSP: Move header files around to avoid Winsock.h include twice error. commit 2529da853acab5b93f2dabb0b8730916be15b97c Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 7 12:43:50 2023 -0700 CMAKE: Add flag to check if compiling under Linux (Not macOS). commit e5f39ecccf9938f87f3ca0000a6511fd18765c8c Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 7 12:43:27 2023 -0700 WIN32: Add _WIN32_WINNT flag for minimum supported windows version. commit 8d47cfa0346c6153ea26352a4942e14365bd8ec3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 7 12:41:43 2023 -0700 MEM: Remove inline flag from stdString. commit f7b7cfa4bd6ae492aafff463d41fb5445cc6866f Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 7 00:03:38 2023 -0700 VS: Remove VS solution files from cudareflect. commit ef635ff641b2d26737bbf87b6dd1320130b5fe69 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 7 00:03:15 2023 -0700 CMAKE: Add asy-cuda-reflect to root asymptote project with options to disable and CUDA check. commit f79960b12f7929b690067236aaa9f970f5ffdfa5 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Dec 7 00:00:36 2023 -0700 CMAKE: Add CMakeLists.txt for asy-cuda-reflect. commit 40cb7b1aa0dd15faf1bb8021cec33aee5907c2a9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Dec 5 20:20:29 2023 -0700 WIN32: Add rc file to win32 binary. commit afa78a1c50a106851281f6399dcc0c020b7c105e Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Dec 5 20:13:39 2023 -0700 REPO: Add windows specific ignore files. commit c45e94ee38f7861743c37bbce2c55eda31b03774 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Dec 5 12:44:31 2023 -0700 DOCS: Update documentation for GCCCOMPAT_CXX_COMPILER_FOR_MSVC. commit 27c2d390036be5ea51e57c19b350e4d20c87debb Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Dec 5 12:39:27 2023 -0700 MSVC: Attempt to automatically locate g++ or clang++ if GCCCOMPAT_CXX_COMPILER_FOR_MSVC is not given. commit b468f92abcc2087ca546c4104c256edf7a9fbc81 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Dec 5 00:04:19 2023 -0700 x86-64: Disable fpu precision setting for ARM+x64 systems. commit db074cd9748a26c891b4a702e0fde228974603c3 Merge: e0e99d71f 4f0b79391 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Dec 4 22:39:06 2023 -0700 Merge branch 'master' into msvc-support commit e0e99d71fbac590c72a7c2eacd1704d3e3815286 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Nov 26 00:03:06 2023 -0700 DOCS: Update instructions regarding VCPKG_ROOT environment variable. commit 04b53182bb3d8d4e47b683ab9511f04d95617f0e Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 25 22:54:34 2023 -0700 ARRAY: Fix out-of-bounds seeking in setNonBridgingSlice. commit 8894763cbfd60cd94c8f5393000e71b8aad448eb Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 24 13:05:35 2023 -0700 REPO: Exclude all vscode files from repo. commit 91abd30c7158f2a8bf6887e2547b9cd154fb04a2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 24 13:05:06 2023 -0700 VSCODE: Remove vscode-specific files. commit 3cd86de4e22e576b3303a0e4f67a9ec535b1b9f6 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 23 21:25:39 2023 -0700 GLRENDER: Specify static_cast directly to stop MSVC's warning. commit 81afc58b29be836117ced6c101698424dfdd1ad0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 23 13:43:05 2023 -0700 CMAKE: Modify asylang test names to use dots for prefixing. commit 6c46d336f145314bdcea0bc70c469a1498974689 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 23 13:21:38 2023 -0700 DOCS: Edit build instructions for msvc build support. commit ed988bb7e620cd01dd0500511bc8b808c66eb051 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 23 13:10:47 2023 -0700 CMAKE: Edit presets file to add msvc presets. commit f1bb27968bda245d3b3a3e8f0851401bdde4af1d Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 23 13:05:40 2023 -0700 CMAKE: Fix win32 warnings on gcc-compat C++ compiler. commit c051134042e7b4a3a404a0315845d939553f7465 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 23 12:26:48 2023 -0700 CMAKE: Include BDWgc::gctba if under windows. commit 350672446d0bb7e63ee421b00a599642973db10d Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 23 12:24:17 2023 -0700 WIN32: Include GC_throw_bad_alloc only for non-windows builds. commit 2e3a9b01a9ab3ab25be8184ca6e3fd4a52d1232a Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 23 12:23:26 2023 -0700 WIN32: Rewrite getEntry to use win32 registry API directly. commit 20eec0dab82c31ae35b582ffc397018c5e692f3e Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 23 12:22:57 2023 -0700 WINDOWS: Add win32-specific utilities functions. commit 5cc05276c24eee371f79d21fc2796e48d005cf41 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 23 12:17:29 2023 -0700 TYPES: Move OPEN to types.cc. commit 7e28ce31298e06ed3b9109283cc7316673f9d11e Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 23 03:12:33 2023 -0700 W32: Add RegKeyWrapper and checkLStatus. commit 6cb34f16527514e82eaa0d25b2603e38cf830f28 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 23 02:31:31 2023 -0700 clang-format: Set column limit to 120. commit 929ebb5707af54c7e017c3bc30ae9147c0b60d3d Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 20 12:01:42 2023 -0700 WIN32: Do not declare file mask if under windows. commit a60607176ce334eed5530aae22e64afa3fca6b22 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 20 11:46:41 2023 -0700 CMAKE: Link to shlwapi for windows builds. commit 335e876c63b614d872db1856394b88870ca0a420 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 20 11:46:15 2023 -0700 RUNFILE: Implement mkstemp for windows. commit 5db542896097e6eb349e0e24fad4f88be642391d Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 20 11:45:45 2023 -0700 WIN32: Do not include linux-specific headers in windows builds. commit 79a6c5b4f0c66f1742fc47f0ca69f23ce0d195ca Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 20 11:13:00 2023 -0700 LOCATE: Use fileExists for locate. commit a10b919dc0fa1e9b018fa672f28a032ddc423fd5 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 20 11:12:04 2023 -0700 UTIL: Add fileExists function for both windows and unix systems. commit c0b8cbb4cccd79fc54b21d022c66e67f09aad40a Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 20 11:11:12 2023 -0700 GAMMA: Use std::tgamma for gamma function. commit 5d68a5a5e01c0af87182443a5fe5233102c3d884 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Nov 20 11:06:02 2023 -0700 WINFLEX: Add --wincompat option for flex args in cmake. commit f08622f522bb5c8027a78896d5b832570ebb77a7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 18 23:09:59 2023 -0700 CXX: Use #pragma message for MSVC compatibility. commit 638c69010d7ea190e2d26c79552bd09e0e7a0fb8 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 18 23:05:28 2023 -0700 MSVC: Remove near/far keyword usage for msvc compatibility. commit 4f0b79391800424a729ccd393f31d01cbb86bbb4 Author: John Bowman Date: Sat Nov 18 19:38:00 2023 -0800 Fix fitscreen. commit fb0c259606b8323e8b5d223f2fe66a485fbe17ac Author: John Bowman Date: Sat Nov 18 16:21:56 2023 -0800 Fix warning message. commit 503e7e62a6bb71167f4d52fb8c90adca7b26af2d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 18 16:58:59 2023 -0700 MSVC: Add option to specify a gcc-compatible C++ compiler for preprocessing. commit 4cac9d295508188871c5fd76b9a3db90fefeca69 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 18 15:46:10 2023 -0700 TEST: Remove tests/makefile. commit 5a553ff0f51e04752745ee721e0af5036538e9f2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 18 15:29:25 2023 -0700 REPO: Add scratch directory for testing. commit 04cc52e6457719aeee1144ea17de03201d5c6605 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 18 15:17:48 2023 -0700 ASY: Add remaining tests to asylang tests. commit 1c85e9b02950b1d08eb81a9bfdfdcb2d4b616ca1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 18 14:22:19 2023 -0700 CMAKE: Disable gtest on clang64-win by default. commit e21bbd08b3432c298b4c49e272a860c86c7ee79a Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 18 13:25:33 2023 -0700 SECONDS: Fix GetProcessTimes() function. commit 62649fe534a7629aac8ed84ba96e895d1921d295 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 18 13:16:52 2023 -0700 GTEST: Add C++ testing platform for asy. commit 1007bd5d1e92e9d41577cf28f1d81fbd3de04fbf Author: John Bowman Date: Sat Nov 18 12:29:00 2023 -0800 Remove unused include. commit 9167ce819797d6ba40d34a3c5466d3e41106fc51 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 18 12:10:25 2023 -0700 ENUMS: Move C++ comments to before enum value for editor assistance. commit 1b3840a6e30987d35c47b1c892b61671c531d30d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 18 12:05:11 2023 -0700 MAIN: Move exit handlers form main to exithandlers. commit 8ea1f89a77fed13639c628991b70909bf2d38c62 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 18 11:45:12 2023 -0700 PTHREAD: Fix gc_stack_base initialization in main.cc. commit f0142d7fc007990f46bdd60cb47e6ce9ca0caeb8 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 18 11:44:49 2023 -0700 MEM: Move memory definitions to memory.cc. commit 27ebd855508279ee7e30d593fd4aa220fa8f84e7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 18 00:11:12 2023 -0700 runtime: Print #line macro correctly. commit 620fa0c2fbfdd648febc672544166960ccae091e Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 17 23:55:40 2023 -0700 testing: Add asy asylang tests. commit 015d74583e1b70f4e3e548db02a512ad898d30a4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 17 23:11:52 2023 -0700 clang-format: Add ReferenceAlignment key. commit 8a7e79afce7639ede06fff6b139e6d759f9ef9a0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 16 12:32:10 2023 -0700 GC: Add include guard for windows build without gc for main.cc. commit b6e9a2c4ab8d06720bd28930b0c12589d7da19d5 Author: John Bowman Date: Wed Nov 15 15:42:37 2023 -0800 Fix URL. commit 567525842001aa4dd40bf0a9e223251601f889c6 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Nov 14 00:20:50 2023 -0700 CMAKE: Split dependencies into multiple features. commit feaddf530400bf6d58e05d10726738813c055d80 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Nov 12 01:30:31 2023 -0700 PTHREAD: Register main thread explicitly if complied under windows. commit 81c0a0564281a4a2273af46bb1cad8cc0a416373 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Nov 12 01:21:30 2023 -0700 CMAKE: Explicitly set library building mode to static for windows. commit 7553e368fe1f7485f1fad450ff01fb31048b36ad Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 11 13:02:45 2023 -0700 DOCS: Add remarks about perl and python3. commit 0e4fbf427ba867c933c52833753e696ced87734b Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 11 12:48:47 2023 -0700 DOCS: Change asy target in cmake build instructions. commit b4617b86868ea03422e980d5a9ac99fdcb187887 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 11 12:48:11 2023 -0700 DOCS: Add documentation for clang64-win build target. commit 7493e0054336847287429482513ffee294acec40 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 11 12:21:38 2023 -0700 CMAKE: Use NOMINMAX for all windows builds. commit f546992f5f1d858aa16155650d4577d78f96386d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 11 12:17:45 2023 -0700 PY3: Fix depfile cxx subprocess call. commit 2a0081a40f631fafdecfc8b5ef23f9eb9939137b Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 11 01:06:33 2023 -0700 CMAKE: Add option for link-time optimization for release builds. commit d8d5c9f350d9f070a1ef7e3712c2b4e716b030d4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 11 01:06:15 2023 -0700 CMAKE: Add release build types for cmake. commit 9645ef9b0d61022a3124c581e723f422f3d9eb49 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 21:23:50 2023 -0700 CMAKE: Add clang64-win/release preset. commit 1eb0f4e075567f89822bd0ce2ae90795b6357f1f Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 21:21:59 2023 -0700 tmp: Disable waiting and some signal functions to get windows compilation working. commit 573f17c2a1979a520f5fb996b6fa8f6afe0c4067 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 21:21:07 2023 -0700 CMAKE: Add options to enable debug mode for gc. commit 703f0443f7e9261f9ffd984191a792a5f0d8c4cd Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 20:31:20 2023 -0700 CMAKE: Remove tinyexr from external-libs (vcpkg). commit e658d6d1a518db94e1cb7ec89affeaf5e56b8e94 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 20:29:29 2023 -0700 TIME: Use std::this_thread::sleep_for instead of nanosleep. commit 52e37142d182b406b9a86929c2b253d5d2218f08 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 20:28:57 2023 -0700 CMAKE: Link tinyexr-impl library to asy. commit 642f1870e960f52054dd93b852afe8461924a158 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 20:28:27 2023 -0700 CMAKE: Move options to before project. commit 3b9d703de007e8fdfbf007681e6b3542407bdfa3 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 20:27:56 2023 -0700 TINYEXR: Remove tinyexr from vcpkg since it is breaking cmake. commit 29d2ac528a22fd3643b7982db106961454e6f29b Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 12:26:50 2023 -0700 Change glrender function to using GLRenderArgs. commit d2868a128335b0d83a4e7c9d979575d0a8d5f1e0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 03:27:59 2023 -0700 CMAKE: Add more detail for ENABLE_GL_COMPUTE_SHADERS option. commit 28db622a2f6cedda7c4f38ea3a0b19f8498860bb Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 03:27:41 2023 -0700 CMAKE: Enable usage of SSBO. commit 32706d03154422223a204b2dac274d0effd304ab Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 03:21:46 2023 -0700 CMAKE: Enable usage of fftw3. commit 1a5fefe10efa0b09b3dcea14bd746b9491f86f06 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 03:21:37 2023 -0700 VCPKG: Add libfftw3. commit ad9261574789feab0a33d7720d2a09fc3aee66e9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 02:47:31 2023 -0700 RUNSTRING: Make time functions work universally. commit 5b5849a9a75f1823e6aec65c52349b2384323571 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 01:56:18 2023 -0700 CMAKE: Add basefile targets for asy. commit 7a57508b7f235544e63880d2b63d8ee0a18b7110 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 01:37:50 2023 -0700 CMAKE: Add options for enabling XDR/RPC. commit c64e19b62f07338cf7589c65e25d9d0497bb0e32 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 01:37:35 2023 -0700 CMAKE: Add codegen for enum files from csv. commit ecc3e6e93ac2f2465cd320176fbcdce087b51fcd Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 01:37:14 2023 -0700 CMAKE: Add dependency to copy_base_file. commit abaf05361faa0d2317cb341be4620595ea6cd231 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 01:12:25 2023 -0700 CMAKE: Move FindPkgConfig to top of external-libs. commit 9e60dfbcdba22fc43a56285c2c67666f5680e1a8 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 10 00:57:46 2023 -0700 PY3: Remove date information from generate_enums. commit a570b3653e9678090f3deb2e3889bf53e026239b Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 9 19:37:02 2023 -0700 PY3: Make c++ compiler error messages visible in gen_preprocessed_depfile. commit e65a1e6b17fea5816047062d3fc2506799010a8e Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 9 19:27:55 2023 -0700 CMAKE: Add presets for quick building. commit 7d4257f2853891621e44fa75621f4520dfacd366 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 9 19:27:46 2023 -0700 CMAKE: Enable usage of opengl in asymptote. commit 90c6d797a26d735267bc6fb0142b1b85fb0a27d8 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 9 19:27:28 2023 -0700 DOCS: Add a quick readme on how to compile with cmake. commit e695e83fb807fbfe917669c37b927d39c726923a Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Nov 9 19:20:14 2023 -0700 VCPKG: Add OpenGL libraries to vcpkg list. commit 978532be7422d7fa1ee41762ffcc1342de4b2c58 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 8 12:08:29 2023 -0700 CLANG64: Fix remaining compile issues on windows clang64. commit fa9359073cea1e0dffdc905645da5cc51c49aead Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 8 12:08:12 2023 -0700 CMAKE: Add options to disable libreadline. commit f978aca1b71d4d16ff337f8833bbf028bf2aac2d Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 8 11:38:17 2023 -0700 REPO: Add ignore directory. commit ca6cbe48df1fa21492057810a355f7e52e2aeeb4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 8 11:36:44 2023 -0700 linux: Fix compile errors for linux. commit 534dedea2074c179442498051f52ecc5afcca336 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 8 11:18:58 2023 -0700 main: Make main.cc compilable with windows clang64. commit 6350cd87aa2d5f8a9fc6a4f7da5c718059663c12 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 8 11:17:59 2023 -0700 runtime: Make runtime work with windows clang64. commit bd59f050ec2ceebc21c9c2bd0a09ebd5a0663abb Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 8 11:17:00 2023 -0700 cmake: Split asy to asy and asycore. commit 2d3e98f55d621b6c4facaca18cc222652d17ab04 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 8 01:38:28 2023 -0700 pipestream: Add win32pipestream for windows as a pipestream re-implementation. commit e093b578c9f8fa409ce181c437f873eb086b6d51 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Nov 8 01:37:58 2023 -0700 WINCMD: Move buildWindowsCmd to win32helpers. commit b706a4fd6718e1aa1b3ce06ca657b60fc54ea4c2 Author: John Bowman Date: Mon Nov 6 23:44:14 2023 -0800 Implement mapArray via mapArrayString. commit 41524fb58214247012fc99661613f2bf94a3d9e9 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 4 19:44:04 2023 -0600 lex/bison: Change eof to isEof to avoid symbol collision. commit ed166a41560ea09734668e8c98a293207a45fa8d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 4 19:23:34 2023 -0600 lex/bison: Change THIS to THIS_TOK to avoid macro collision. commit 515b9aef2358c5b89782797705fcdc822d1fa7fa Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 4 13:26:26 2023 -0600 PARSER: include curl.h before common.h to avoid Windows.h. commit ab9e0c73329f973e73b9c1dfae05e398acce751e Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 4 13:21:48 2023 -0600 EOF: Rename eof to eofException. commit 9fb59b744ef66bd88abe54ab57c02e9892ee5983 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 4 13:10:23 2023 -0600 DRAWLABEL: Make draw() unix/windows compatible. commit 9939dd25a1ae669e01c1fb15a8c0bb6d39f93f2e Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 4 12:55:53 2023 -0600 SETTINGS: Make settings compatible with windows. commit a4a42186fe35913035d6b5bcc08349bfbd828cfa Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 4 12:50:17 2023 -0600 GETOPT: Use vcpkg getopt instead of backports. commit 591e5c10a9bbc37f914d979b7bb298b6ab989f17 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sat Nov 4 12:45:51 2023 -0600 GLEW: Move all of glew into backports. commit e991c19bbb4318201be9e6d8fa11e58ff93c1183 Author: John Bowman Date: Fri Nov 3 23:49:52 2023 -0700 git subrepo pull (merge) --force LspCpp subrepo: subdir: "LspCpp" merged: "3bd6c6dc" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "3bd6c6dc" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit 97af5c4c4d318c8c8642bf596506b79936312c36 Author: John Bowman Date: Fri Nov 3 23:42:04 2023 -0700 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "5f4a5990" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "5f4a5990" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit cfa9a669968a22812b85529f9db9b924451450ec Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 3 14:35:23 2023 -0600 UTIL: Make util.cc win32 compatible. commit e0d4d79a3636f69cf9d978b75036f8e93084013a Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Nov 3 14:34:14 2023 -0600 W32: Add win32helpers utility to asy. commit f9f7e11d69746c5a88b0d95d87a185132d32bdee Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 23:16:39 2023 -0600 MSVC: Add additional /Zc options for msvc compiler. commit 2356520099f62fd7b49ff442161064557547a075 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 23:16:06 2023 -0600 MSVC: Add ciso646 for and/or/not support. commit fb9f05c922a8f9a6c83566a1cf5e9c3b4ddbaf05 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 23:05:33 2023 -0600 CXX: Rename process.h to processutils.h to avoid name collision. commit 179fa49b7049de409730092d357a0bd8a79972c0 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 22:10:08 2023 -0600 GETOPT: Make getopt compatible with C99 and beyond. commit 64ead4713a8e8b4f8ee3254062d424e7b5a51cae Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 15:46:17 2023 -0600 !hack: Add explicitly runtime.h file for msvc codegen stage. commit 5d2ad06fdfcf9c686198a93ffec25f44a9f2a829 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 15:31:40 2023 -0600 REPO: Add visual studio files to ignore list. commit dc38e817f3d88eba5f8f6f68041fe02d6b133628 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 15:01:58 2023 -0600 REPO: Add CMakeUserPresets.json to ignore list. commit e3104efab7ff7a2f1c014b876b6857d3f12fa4aa Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 14:58:46 2023 -0600 CMAKE: Add __MSDOS__ build macro for windows builds. commit 3ee7085978bfd45779e83eb8ec119a4f0077f013 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 14:53:39 2023 -0600 PREPROC: Add python code to properly process msvc source outputs to depfiles and preprocessed files. commit 3f64b1b3513e884f0aa67854c7c44f8572a61b75 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 14:52:35 2023 -0600 MSVC: Exclude non-windows header files properly. commit 40b0234f343eed4268c7b88bad0b3f46fe157257 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 12:54:36 2023 -0600 PIPESTREAM: Use SSIZE_T for msvc compilation. commit 6e2f612089e6e6944a639bb08ce7ad937e22146d Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 12:17:55 2023 -0600 MSVC: Enable NOMINMAX for windows compilation flags. commit 5c3b516087339d68f51b0e005629b95203a1ffcc Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 02:02:18 2023 -0600 MSVC: Work around strings.h for msvc builds. commit 75c394fedebffab5d9ab97b1b07f761496203f43 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 01:55:32 2023 -0600 CMAKE: Properly set __cplusplus variable for version checking. commit b9df13ec7b21e9b1dc97361af38faf42687ef3c1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 01:46:32 2023 -0600 CMAKE: Add handling for c++ standard in preprocessing script. commit 94955792af93477fb0d5a700ff395b53c1e98b31 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 00:53:53 2023 -0600 CMAKE: Use backports/getopt for windows builds. commit 9a294167efe0e40188d07a63d9b41e379f734352 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 00:53:30 2023 -0600 GETOPT: Add CMakeLists.txt for getopt. commit 02a66799b0e7c71753c9ecf5023d6e2a8777eda6 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 00:53:09 2023 -0600 REPO: Reorganize backports directory to better select which packages we need. commit c920ed6eab682aa7b335c838a4049c1289dbccf2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 00:27:52 2023 -0600 CMAKE: Enable usage of Pthreads4W on windows. commit 7b617c172848272d436f06657e75cb7297380d1f Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 00:27:34 2023 -0600 CMAKE: Use the same readline configuration for both windows and unix systems. commit ceffa9e460adcdf6a55552ad1495dad141bb9dbf Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 00:27:04 2023 -0600 CMAKE: Enable usage of pdcurses on windows. commit d9117e43ec8a28500e5da3ce55ee4eb62dd463f2 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 00:26:41 2023 -0600 CMAKE: Download winflexbison if custom binary not given. commit 7ab138ebb4d5f92b25e9de0737b9c59e8553d53c Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 00:26:09 2023 -0600 CMAKE: Add option for custom flex and bison binaries for windows. commit 7da5e12d8c36eb468e6b413c76ca05f790f43acd Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Oct 27 22:53:42 2023 -0600 VCPKG: Use pdcurses for windows build. commit 93f4208727e4db8eb2575f047d812506f6706f2c Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 29 01:31:20 2023 -0600 CMAKE: Fix CMAKE_CXX_STANDARD_REQUIRED. commit 3d97b66fafc25a942ce7493e03a8a585d95c9196 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Oct 26 01:28:15 2023 -0600 CMAKE: Enable usage of eigen. commit ca13bbb32b2d49cafb6dc241b283d92c01627ef4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Oct 26 01:28:00 2023 -0600 VCPKG: Add eigen to package list. commit ef2e02a50770506be3577e228af8033aa135732c Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Oct 26 01:09:57 2023 -0600 CMAKE: Enable usage of gsl. commit ce8350fa0be4f9f52409ef9d5f1b345680f2ae20 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Oct 26 01:09:26 2023 -0600 VCPKG: Add GSL to package list. commit 4f3b07b89f1a1fed6aec659e605ea0e3c2cd39b4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Oct 25 02:12:46 2023 -0600 CMAKE: Enable building with pthreads. commit 770b3ff9e1a70811165757fc5b4da58521488ada Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Oct 25 02:12:27 2023 -0600 VCPKG: Add pthreads to package list. commit 01c4240413b9627393559f153c13538ea2b89ea8 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Oct 25 01:57:27 2023 -0600 CURL: Add check for LIBCURL_VERSION_NUM instead of CURLOPT_XFERINFODATA. commit cae3c911a2f889181b50adb2b6854c91bfc3abe8 Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Oct 25 01:57:04 2023 -0600 CMAKE: Enable using of libcurl. commit 24a59bfc6ee21e0618f1d1995aef49fc543e588b Author: Supakorn 'Jamie' Rassameemasmuang Date: Wed Oct 25 01:56:52 2023 -0600 VCPKG: Add libcurl to vcpkg. commit 32dbc1fa31f14e08b3b7ad7cbf269f4ef0554eac Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Oct 24 23:44:59 2023 -0600 CMAKE: Enable building for libreadline and curses. commit f4774afa33a107de47ebc140e4b0adb33798dff4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Oct 24 23:44:45 2023 -0600 VCPKG: Add curses and readline library. commit af9823a1318199dd4840506a8ee7761b74ab34a5 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Oct 24 23:12:44 2023 -0600 CMAKE: Enable linking of gc. commit 2b8681a390a216b6872af021dda6d70170affa77 Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Oct 24 23:12:32 2023 -0600 VCPKG: Add gc to package list. commit 2e696b8e67b4ef6b923c97057feabad3df05ffcc Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Oct 23 02:00:34 2023 -0600 CMAKE: Copy base files to build directory. commit 3f44dce96a1f30e7f551cc98cac6547b64a89592 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 18:55:23 2023 -0600 CMAKE: Move preprocessed file generation to a python script. commit dd3060306d4dea6196b20756e2ea3ffc14d7895f Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 14:52:11 2023 -0600 CMAKE: Add codegen for revision.cc. commit a4d1ebe3a84e90fcca7c81ac6a6f15a78b175bea Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 14:51:59 2023 -0600 CMAKE: Add ASY_GL_VERSION. commit 3837e3965bc01ad679373b4ef5fbcbb43993f34a Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 14:09:15 2023 -0600 PERL: Fix Fix warnings in perl. commit 82af38ab8d8e730c60c147d347d272dca1009823 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 13:55:57 2023 -0600 CMAKE: Add *.symbols.h to build target. commit b342518d5de29a16ab60baf7a61e04c872c24a84 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 12:35:25 2023 -0600 CMAKE: Add flex+bison files. commit c602f03f4fff1d16e4a402aaef041af9cdb7ddd7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 02:42:08 2023 -0600 CMAKE: Add HAVE_UNORDERED_MAP to compilation macro. commit 600c1b250c3ab6c935c7a4c705724a0c1a823c85 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 02:41:36 2023 -0600 CMAKE: Make include directories work properly in codegen. commit 22c709375c373072fb8e81762f057daa8946617e Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 02:41:13 2023 -0600 ZLIB: Add zlib to cmake lists. commit 72d688bcd27252a01ade37099c724f088699367c Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 02:40:20 2023 -0600 KEYWORDS: Add keywords.h to target. commit bc7f64d9582f12b9a28a72827a932166a095f89b Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 02:40:03 2023 -0600 KEYWORDS: Make keywords.pl work with cmake. commit daf4160a3dc675d06774740411001095ea5df365 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 02:39:40 2023 -0600 EXR: Remove tinyexr from compilation target. commit 7dfcf08a3c02e6466eea8b486f0e937a1e06f12c Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 02:39:18 2023 -0600 VCPKG: Add vcpkg manifest file. commit 84260f414678805e63ce3206c8744ac09636f6b1 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 00:40:34 2023 -0600 CMAKE: Add common functions file. commit a33328d7191053bb51819bddf7f5741cfba29310 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 00:40:12 2023 -0600 CMAKE: Fix ASYMPTOTE_GENERATED_HEADERS. commit f5410edb8973e24ac78b6544d4c0ed94b0d6e61f Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 00:40:00 2023 -0600 CMAKE: Add codegen for allsymbols.h. commit 1fdbe6f201b0abb22eebbe94d4611f4dd4e6b622 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 00:39:26 2023 -0600 PERL: Make findsym work with strict mode. commit 611eab2e467dbc0d0abb1a5a481e129fd858f899 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 00:39:19 2023 -0600 PERL: Add arguments to opsymbols and runtime. commit edc37304fd3c28531397d5bfd8db0be7be5f1c37 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 22 00:33:03 2023 -0600 CC: Fix glrender.cc file. commit 68bb68bd88b19e0c7962203fe0ed451d59aecea4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Thu Oct 19 23:35:25 2023 -0600 CMAKE: Add brief skeleton for using cmake. commit 16afc037b93d603bd8ca5270bbbbb074bc0bbc0e Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Oct 16 00:50:51 2023 -0600 CMAKE: Add pkg-info.cmake for package information. commit ec021ce10d31d8732a96370f84da94f11ed0c939 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Oct 16 00:48:32 2023 -0600 GSL: Add config.h check to gsl.cc. commit 04d9db73670dd307063e2a5361363f5a5a1340a4 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Oct 16 00:21:35 2023 -0600 PERL: Add use strict/warnings to all perl scripts. commit ec2bf90f1597a99869d03314f79f4bb343294325 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 15 03:12:42 2023 -0600 COMMON: Use cstdint uint64 for Int max and min. commit 7066d5bf4423af956b8b526fe22ebdc06e679524 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 15 02:58:36 2023 -0600 PRC: Add CMakeLists to PRC File. commit db6c98d2b8db271f7fad8eee8a42ab22d44ca2e8 Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 15 02:58:26 2023 -0600 PRC: Reorganize structure of PRC library. commit 2878414db8e65036ec3e938a950bb1d58f68ff1c Author: Supakorn 'Jamie' Rassameemasmuang Date: Sun Oct 15 02:58:03 2023 -0600 PRC: Remove Makefile. commit 58343ae0e8297b94ec53227e2b0705ae5d50844a Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Oct 13 23:28:11 2023 -0600 TINYEXR: Remove tinyexr from subrepo. commit 593c5abf8e808c783d59c14d0b216dd53aaf876d Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Oct 13 23:01:17 2023 -0600 DIR: Move file structure around to clean up repository. commit 1f2f2e9399bcf98ddbae73417a0a4c5f8449c535 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Oct 13 22:43:27 2023 -0600 REPO: Add CMake files to ignore list. commit 420bcf146dacb0f0dc52d7b251c2a2be0ca43d1c Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Oct 13 22:41:29 2023 -0600 CMAKE: Add basic CMake build file. commit f13648ec70031173268fb34b54e097e30a7b21b7 Author: Supakorn 'Jamie' Rassameemasmuang Date: Fri Oct 13 22:37:56 2023 -0600 MAKE: Remove Makefile and autotools files. commit 2cb894653a74235788ce33575f9a1af1ea15796b Author: John Bowman Date: Tue Oct 10 23:14:04 2023 -0700 Fix SVG gradient shading offsets (issue #389). commit 75b1ffb846ef59051875147460815f6fab9dfad3 Author: John Bowman Date: Mon Oct 9 23:50:57 2023 -0700 Fix issue #391: Workaround libc++ parsing bug under MacOS. commit 87195dbbf5fd698d7e07a148ff44473336fa141c Author: John Bowman Date: Mon Oct 2 22:58:36 2023 -0700 Simplify bilinear interpolation of surfaces. commit cc79cc5253f4e9963c731f131ea00a3fea6cbc29 Merge: 90bc314c2 25be300d8 Author: Supakorn 'Jamie' Rassameemasmuang Date: Mon Sep 25 16:12:50 2023 -0600 Merge pull request #390 from vectorgraphics/gitattribs Add .gitattributes file to help with windows/wsl build process. commit 90bc314c26833477c871adcebc817ef911190b91 Author: John Bowman Date: Sun Sep 24 10:22:36 2023 -0700 Simplify examples. commit fa97fc830a6f76c8da820981ca7728e54b76f1db Author: John Bowman Date: Sat Sep 23 20:48:06 2023 -0700 Fix documentation of shipout (issue #396). commit 25be300d82227d14b5671241c3b9819c1a874f6e Author: Supakorn Rassameemasmuang Date: Wed Aug 9 11:36:44 2023 -0600 Add .gitattributes file to help with windows/wsl build process. commit aa9f81bad9478bfe8b2ab5fc5376c19c6c79c708 Author: John Bowman Date: Sat Jul 29 23:25:54 2023 -0600 Fix bug 388: Avoid broken dvisvgm reassign-clippaths optimization. commit b069d8158e7921298b38874b4b2600de0fddf497 Merge: 29caaed5e 2a242c545 Author: John Bowman Date: Tue Jun 27 16:31:53 2023 -0600 Merge pull request #383 from cyrilled76/patch-1 Fix doc commit 2a242c545a7c6bf8dc59bcb0bce4cbf66ba8695e Author: cyrilled76 <122608369+cyrilled76@users.noreply.github.com> Date: Tue Jun 27 22:52:30 2023 +0200 Fix doc commit 29caaed5ead5a62787475286afd22e40585b8bb8 Author: John Bowman Date: Wed Jun 14 22:36:35 2023 -0600 Fix --without-lsp (issue #379). commit e9e376538bf3899cd3dbd4ed9bd77ae04460baa9 Author: John Bowman Date: Mon Jun 12 18:25:15 2023 -0600 Increment version to 2.87. commit 6c49014d0055d9dfdeb5dca5fb23a37a3ce1c9e3 Author: John Bowman Date: Tue Jun 6 22:12:03 2023 -0600 Update HOWTO. commit 4d5224cf59d75f08c7360382bf7e7c12167ce35f Author: John Bowman Date: Tue Jun 6 19:59:30 2023 -0600 Update build script. commit 3c359d89cc4bfba685d5c29794af934e08c5329f Author: John Bowman Date: Tue Jun 6 17:15:36 2023 -0600 Fix type. commit 0104aea26bf8f76dc15f717a5ea78e0ff46b659f Author: John Bowman Date: Tue Jun 6 16:26:53 2023 -0600 Fix compilation under MSDOS. commit 13fac7197d9f62f890f3c78d40eda8f5b819c99c Author: John Bowman Date: Tue Jun 6 00:17:26 2023 -0600 Fix boost issues. commit fbe3f431adc74ff6ac307fd4868da8f8b363efaa Author: John Bowman Date: Tue Jun 6 00:00:47 2023 -0600 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "9b0d99d1" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "9b0d99d1" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit 728e00fa9dcc9d13f9fa5da82c2f901420485c61 Author: John Bowman Date: Mon Jun 5 22:47:35 2023 -0600 Fix std::optional compilation issues. commit c18c01677cfbeb3d956633df86a79e984a8f8255 Author: John Bowman Date: Mon Jun 5 22:47:05 2023 -0600 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "1a04514e" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "1a04514e" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit b24fba5df113d4a5e7af41d01011b912916b2a06 Author: John Bowman Date: Mon Jun 5 01:36:17 2023 -0600 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "97ccf8e9" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "97ccf8e9" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit 346ec934bd279beaf1d1605d657fd8e15378022b Author: John Bowman Date: Mon Jun 5 01:10:41 2023 -0600 Work around unavailable clock_gettime under old versions of MacOS. commit 1d7caee225a5fe892c9ba2f7ffff1e63335352fa Author: John Bowman Date: Mon Jun 5 01:10:06 2023 -0600 Fix portability issue with GLSL_VERSION. commit e49ed605f0e13ff75ae21f5b653f3c4b319a33f6 Author: John Bowman Date: Sun Jun 4 22:49:48 2023 -0600 Initialize spin counter; remove remaining gettimeofday calls. commit 59bb7930b9a08c530f66957c5c60f64b07a59374 Author: John Bowman Date: Sun Jun 4 15:53:40 2023 -0600 Update Boehm GC to 8.2.4. commit 4080bee015b099acd933bf40a89d2933c1edbdc2 Author: John Bowman Date: Sun Jun 4 11:58:51 2023 -0600 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "018aaca5" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "018aaca5" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit 267922a9d8d7f9077d6d5bd7260e176cf200d010 Author: John Bowman Date: Sun Jun 4 11:36:51 2023 -0600 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "6874d444" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "6874d444" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit 2d541360013d7357be3258c1ba6ea7ed98ae1e45 Author: John Bowman Date: Sun Jun 4 11:35:18 2023 -0600 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "530bd22e" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "530bd22e" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit bd3813ca7592cc3dba43fa4007ff4f129d668f24 Author: John Bowman Date: Sun Jun 4 10:52:31 2023 -0600 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "6c723f47" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "6c723f47" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit a3f45abc54caf855167b662ffd3717e2ab733289 Author: John Bowman Date: Sun Jun 4 10:51:34 2023 -0600 Revert "Revert "Change boost::optional to std::optional"." This reverts commit d6ddd54262b7bf61830572988e2f4bd953802a28. commit 6cb475a540d695b3fcee20252e2ffac2c8f1adb5 Author: John Bowman Date: Sat Jun 3 15:06:24 2023 -0600 git subrepo pull (merge) LspCpp subrepo: subdir: "LspCpp" merged: "acde1180" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "936b427d" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit d6ddd54262b7bf61830572988e2f4bd953802a28 Author: John Bowman Date: Sat Jun 3 14:55:20 2023 -0600 Revert "Change boost::optional to std::optional". This reverts commit 0de3cfdb930d53d9ea2c03674e8ab228bf31b0d1. commit 5a4f72184e494aafaf5298b0b51f7338d7fb97f0 Author: John Bowman Date: Sat Jun 3 14:42:17 2023 -0600 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "f96a1ac0" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "f96a1ac0" git-subrepo: version: "0.4.6" origin: "???" commit: "???" commit b3345619ab5aad88fcf229591c5a20f0d0864eaa Merge: 5c40136f6 7366fe263 Author: John Bowman Date: Sat Jun 3 12:21:01 2023 -0600 Merge pull request #356 from yarusome/master Fixing bugs in the inversion section of the `geometry` module commit 5c40136f60cbeab6924626085c68cc161d0dae45 Author: John Bowman Date: Sat Jun 3 12:11:23 2023 -0600 Reformat code. commit 4709f6e6956d3f455c127fa5d44debf6f70d027e Merge: 456ae9920 7f5cdf0b2 Author: John Bowman Date: Sat Jun 3 11:59:50 2023 -0600 Merge pull request #377 from LemonBoy/fix-io-read io: Fix reading of NaN and inf values commit 456ae99203a291f9c50128ec55965ad948e11971 Author: John Bowman Date: Fri Jun 2 21:42:12 2023 -0600 Remove lsp option when disabled. commit 214b8969a66af0dde0168ac17e2a343debb7d047 Author: John Bowman Date: Mon May 29 10:33:28 2023 -0600 Remove unused cast. commit 7f5cdf0b2c6aed2e26ff7310aa3d181419a6eea8 Author: LemonBoy Date: Sun May 28 19:09:57 2023 +0200 io: Fix reading of NaN and inf values Previously asymptote would silently stop while trying to read a textual dataset containing inf or nan values, while the language itself is perfectly capable of handling such values. commit 43cf506b5bce0957205650246c8616b97e143133 Author: John Bowman Date: Sun May 14 13:54:15 2023 -0600 Remove unused variables. commit 494e8120ee967aa9c71ae26e2476b5632211b6e2 Author: John Bowman Date: Mon Apr 17 21:23:57 2023 -0600 Fix compilation when configured with --disable-gl. commit 4715fea108852e25cd38a6a74079985f5fe91e7f Author: John Bowman Date: Sat Apr 15 16:31:59 2023 -0600 Suppress .setblendmode for EPS output. commit 700aaec3a6d1fd3a78f04537a61bad82a5f07057 Author: John Bowman Date: Sun Mar 12 00:03:46 2023 -0700 Fix portability issues. commit fffdb62031f4f68007b2721bdd8ef86ef37d8e3d Author: John Bowman Date: Sat Mar 11 23:42:20 2023 -0700 Fix boolean operator. commit da81bd59f89ba8be1131243f680f06ed57fee571 Author: John Bowman Date: Sat Mar 11 23:33:28 2023 -0700 Update config.guess. commit 65165fe1528692980fd52c7f1c3735c7ac5bd2c0 Author: John Bowman Date: Sun Mar 5 20:48:00 2023 -0700 Fix bug #370: automatically apply PDF transfer functions. commit 11c8cc57a4b66e5f04f3ab2f1cfd6f33d2c8d43d Author: John Bowman Date: Mon Feb 20 13:41:10 2023 -0700 Clear initial index buffer. commit 7623f325b1a370851db9559a5a058e552b71a2f6 Author: John Bowman Date: Sun Feb 19 01:32:10 2023 -0700 Fix last revision. commit 0a248a219e44d2945bcc31c5424153ec1ace41bb Author: John Bowman Date: Sun Feb 19 01:28:30 2023 -0700 Only output unscaled primitives. commit e8e88fb4412ce92acf222ceafe18e3be26984b90 Author: John Bowman Date: Wed Feb 8 23:39:44 2023 -0700 Increment version to 2.86. commit 9e242d4e7d6d79656c09d4f6c7c385dd7ea61bb3 Author: John Bowman Date: Wed Feb 8 21:30:27 2023 -0700 Draw dot after drawing path. commit 0dd86a75c53fc8594e8550ac358b95b2daba830b Author: John Bowman Date: Tue Feb 7 19:21:03 2023 -0700 Add example. commit 5b310d898d8ce2d66190b5c3410115781e73f0d3 Author: John Bowman Date: Sun Feb 5 11:07:46 2023 -0700 Fix centering; center image on load. commit 05cb5a04fb894f851253d52fd946658a8a546ff4 Author: John Bowman Date: Sun Feb 5 00:36:41 2023 -0700 XASY: Work around QtSvg pattern bug. commit ed2b2a9a18109e7fb68b0fc15d40289d7bf20680 Author: John Bowman Date: Sat Feb 4 23:58:33 2023 -0700 Fix Makefile. commit a2fd93bd2cf7fa8c0276b00d162a0cf09182ee5e Author: John Bowman Date: Sat Feb 4 22:25:08 2023 -0700 XASY: Update script before exporting. commit a9a35e7aaf4f83c99db14f2e6684108d11fcaae3 Author: John Bowman Date: Wed Feb 1 21:56:53 2023 -0700 Fix bug #367: implement intersection of path3 with Bezier triangle. commit 52c5cda4dca781353d1be0a11ea02f38be516cca Author: John Bowman Date: Wed Feb 1 21:55:34 2023 -0700 Simplify example. commit d3152c29ca4c39cb637a890aed71e3167a3656c5 Author: John Bowman Date: Mon Jan 30 18:30:56 2023 -0700 Improve example. commit c42ce7a03a4f4c98d81bd5757f1e9c9e51d0541d Author: John Bowman Date: Sun Jan 29 09:25:08 2023 -0700 Test errno after nanosleep. commit 0676ac869042030eb76a6585bdc016e54087d842 Author: John Bowman Date: Sun Jan 29 01:21:50 2023 -0700 Fix animation keyboard controls. commit 6c85282196c75fdb7da77517326a7345b5e2c29e Author: John Bowman Date: Sun Jan 29 00:16:58 2023 -0700 Fix animation timer. commit 40011877aa03fd1594ce0de0739f2aa9d0ed3d0d Author: John Bowman Date: Sat Jan 28 21:54:35 2023 -0700 Fix more uninitialized variables. commit ac287ab2984413fd146f87b668cb65795372fe31 Author: John Bowman Date: Sat Jan 28 21:31:01 2023 -0700 Avoid division by zero. commit 28591ba3bebbdc425acb439cefa5f9a0c5e59896 Author: John Bowman Date: Sat Jan 28 21:18:49 2023 -0700 Fix uninitialized variable. commit 070ee4d0b6ba764d7e9d2b238a3780aafde9fbb8 Author: John Bowman Date: Sat Jan 28 16:08:47 2023 -0700 Fix #366: Question about python scripts. commit e68cfb31b17b45dfb12dca4d97c2156e97e21fc8 Author: John Bowman Date: Sat Jan 28 13:47:54 2023 -0700 Update URL. commit 37f21840e26bc41c1602a26c3829daaf26fe1764 Author: John Bowman Date: Sat Jan 28 11:19:31 2023 -0700 Make installing icons_rc.py optional. commit 4a94516e434ba41b11d9f1a18136a699591c751a Author: John Bowman Date: Sat Jan 28 10:58:31 2023 -0700 Retain icons_rc.py. commit c40e2402f87b7a7362dfb9ff8f5341a197bdc82d Author: John Bowman Date: Sat Jan 28 10:42:18 2023 -0700 Pregenerate icons_rc.py. commit a955d6e5dd5bcee68a8fcfa072b26e18ecd8ed64 Author: John Bowman Date: Sat Jan 28 10:13:34 2023 -0700 Improve resolution of cputime().change.user. commit 5d234e8f8e3a17f4c35de63428a193295929ce3e Author: John Bowman Date: Sat Jan 28 10:10:07 2023 -0700 Implement alternatives to CLOCK_THREAD_CPUTIME_ID. commit 63d9f300e782d6242cd4aa00acf7fbc4fd53c2e7 Author: John Bowman Date: Sat Jan 28 08:02:08 2023 -0700 Fix compilation without FFTW. commit 72670f2b7e77a8d6e1b44b82f3a240f75205416b Author: John Bowman Date: Thu Jan 26 22:19:00 2023 -0700 Workaround broken offscreen graphics drivers. commit eb513a46a5da7023cd1c9da1178f6ed7485619f8 Author: John Bowman Date: Tue Jan 24 15:18:23 2023 -0700 Increase initial heapsize under MSDOS. commit 66b92e0f40fa648bd8c5de108ebc9d8990c7d8da Author: John Bowman Date: Mon Jan 23 00:26:07 2023 -0700 Update year in copyright. commit 7dc8177972493e333cb00c6c9ea979a5dad16f44 Author: John Bowman Date: Sun Jan 22 22:27:56 2023 -0700 Add include for usleep. commit ec067315e03ac9b3b19bba3685043188bd2da0e1 Author: John Bowman Date: Sun Jan 22 22:06:10 2023 -0700 Increment version to 2.85. commit 7366fe26314370241c949921389492a4cb862f33 Author: yarusome <97945148+yarusome@users.noreply.github.com> Date: Mon Jan 23 12:15:54 2023 +0800 Fixing the use of `inverse()` commit 430c7a661c060568720f6d65e611a2087ea1dde6 Author: John Bowman Date: Sat Jan 21 22:48:26 2023 -0700 Fix Makefile dependencies. commit 1e0c04c25ddb2dfc9a4f3423628d39ff494e4b32 Author: John Bowman Date: Sat Jan 21 18:05:11 2023 -0700 Revert "Fix Makefile dependency." This reverts commit 826581af2fb2882ab82804e0593217da85ae58bd. commit 826581af2fb2882ab82804e0593217da85ae58bd Author: John Bowman Date: Sat Jan 21 18:01:07 2023 -0700 Fix Makefile dependency. commit 2255877e2ee304c38dee5b7b52d113255c0622fd Author: John Bowman Date: Sat Jan 21 17:48:00 2023 -0700 Revert "Improve last revision." This reverts commit e7d475fa66c429851bbc45bcc0017a3ac5eef02a. commit 4dafd8313cda0aad2a05abfdc91fc30ce88d7385 Author: John Bowman Date: Sat Jan 21 15:12:28 2023 -0700 Add high-resolution clock; update FFT support. commit 56c39a80704b2bb93e808ad74591a8834c3ccca5 Author: John Bowman Date: Sat Jan 21 12:03:49 2023 -0700 Account for linewidth in labelmargin. commit 37f564040bec2ff6059f5c4872950be17586b885 Author: John Bowman Date: Tue Jan 3 20:37:17 2023 -0700 Add option to show summary of environment settings. commit 76f2f4d727261e4e2b466e2ea9d32bb4baf6c466 Author: John Bowman Date: Mon Dec 12 22:19:03 2022 -0700 Avoid division by zero. commit 58af9b461ff373ec32e6d1db869c80cf3b6dd137 Author: yarusome <97945148+yarusome@users.noreply.github.com> Date: Sun Dec 11 13:59:36 2022 +0800 Simplifying the internal use of `inversion` This commit replaces `(real, point, ...)` with `(inversion, ...)` in the parameter list of internally-used functions in the inversion section, and simplifies the initializer definitions of `inversion` using `operator init`. commit 1fcc742a8e372b8280e92573a31542ed3cdc9117 Author: yarusome <97945148+yarusome@users.noreply.github.com> Date: Sun Dec 11 13:19:55 2022 +0800 Fixing the inversion section of the `geometry` module This commit fixes bugs related to coordinate systems in the inversion section, and all the returned `point`s are in `currentcoordsys` now. commit 46d6ea7351699bbed0418ec6d7f2195011178e5a Author: John Bowman Date: Mon Nov 28 20:20:35 2022 -0700 Improve example of multiple shipout. commit dce2e0d3b94b59dddcca6bb95c38548e2021821a Merge: ee0d1a4a8 a42e056e2 Author: John Bowman Date: Sun Nov 13 00:10:12 2022 -0700 Merge pull request #341 from yarusome/master Fixing `inversion inversion(circle, circle)` commit ee0d1a4a80ff0b30383f297f3ab64bebafd1c07c Author: John Bowman Date: Sun Nov 13 00:00:45 2022 -0700 Fix issue #308: runtime error when drawing degenerate path with TexHead arrow. commit 0ff56f1ecaff0f5e6da0acd0e7ff6f152cd52c56 Merge: eb89fd60d 1834e4883 Author: John Bowman Date: Sat Nov 12 23:06:21 2022 -0700 Merge pull request #354 from vectorgraphics/fix-debian-bug-1023920-xasy XASY: Round numpy.float64 to int for Qt compatibiltiy. commit eb89fd60d71a5836b05ae0ed17f7525b2723714d Author: John Bowman Date: Sat Nov 12 22:50:04 2022 -0700 Fix bug in XDR reads due to uninitialized variable. commit 1834e4883a0781944b5eb3e459a35984ad24d14d Author: Supakorn Rassameemasmuang Date: Sat Nov 12 12:22:45 2022 -0700 XASY: Round numpy.float64 to int for Qt compatibiltiy. This fixes Debian bug #1023920 (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1023920). commit a64162166a3b2146902971d87ba2da3af53ebd5e Author: John Bowman Date: Tue Nov 1 21:22:49 2022 -0600 Use Bland's rule even on artificial variables. commit 4f326abc01934c83380ca6e0d399dc5f33819e76 Merge: e7d475fa6 38d018f6b Author: John Bowman Date: Mon Oct 31 15:03:46 2022 -0600 Merge pull request #351 from bmwiedemann/date Allow to override build date with SOURCE_DATE_EPOCH commit 38d018f6bc6d2341718a67193c4cbb99a07be698 Author: Bernhard M. Wiedemann Date: Mon Oct 31 21:46:54 2022 +0100 Allow to override build date with SOURCE_DATE_EPOCH in order to make builds reproducible. See https://reproducible-builds.org/ for why this is good and https://reproducible-builds.org/specs/source-date-epoch/ for the definition of this variable. Signed-off-by: Bernhard M. Wiedemann commit e7d475fa66c429851bbc45bcc0017a3ac5eef02a Author: John Bowman Date: Thu Oct 27 00:21:20 2022 -0600 Improve last revision. commit b5ac744cb044c42a9d2f79a58d37b46444e24caa Author: John Bowman Date: Wed Oct 26 23:57:50 2022 -0600 Fix Makefile dependency. commit 8afff2c11b36ea54edf01b32452550bf12843a93 Author: John Bowman Date: Sun Oct 23 01:15:48 2022 -0600 Terminate phase1 of simplex method once a zero-cost solution is found. commit e7b5c30816f5db7b243222c1c4c10d087294eece Author: John Bowman Date: Sat Oct 22 22:33:15 2022 -0600 Make evince the default UNIX PDF viewer. commit 8bc175d31f77312baea3660e5f29dbc35ab2cbdf Author: John Bowman Date: Fri Oct 21 22:33:36 2022 -0600 Remove spurious tests in glew.c. commit 0d49a356d0ee1d0f579cb224856f0947a3e1cdc3 Author: John Bowman Date: Fri Oct 21 22:20:12 2022 -0600 Check for bison and flex but not libm. commit f495186f075bc3b686aa53bc80def7fbd91edb97 Author: John Bowman Date: Tue Oct 18 00:32:09 2022 -0600 Add diagostic control to rationalSimplex.asy. commit d1a336cd3caaea8cae7bd1cc5a9f98175ba18979 Author: John Bowman Date: Thu Oct 13 17:08:53 2022 -0600 Improve diagnostic in rationalSimplex. commit 20a79dbf5f005bacf3fb55fceb1c33cc8b79c4b8 Author: John Bowman Date: Thu Oct 13 17:04:50 2022 -0600 Update example. commit 0e13fdc3d0226f153d1859db3ec43eb3d2fb2007 Author: John Bowman Date: Sun Oct 9 13:45:34 2022 -0600 Remove obsolete code. commit ea5bb5e69ecdc26a576205825c62c5ede14622cb Author: John Bowman Date: Sun Oct 9 10:55:22 2022 -0600 Change default UNIX postscript viewer to evince; remove remaining references to gsview. commit 6d556b7a78d1680702abcdc0972ecf6c458ced88 Merge: 681daee01 7696801ae Author: John Bowman Date: Fri Sep 30 17:10:52 2022 -0600 Merge branch 'Qt'. commit 681daee01c6832a5d86e79e17018806b433e1805 Author: John Bowman Date: Fri Sep 30 14:44:03 2022 -0600 Remove unused code. commit 7696801ae99fe0654030ccdb805df8ba506907cf Author: chaumont-arch Date: Sat Sep 24 21:39:03 2022 -0600 XASY: Fix arrowhead changing bug. commit 7201430c829e273e4ad3ff13391a87ff9f83b373 Author: John Bowman Date: Wed Sep 21 21:32:07 2022 -0600 Disable PDF image compression for non-pdf output. commit 78662d51f5b9b1b5038cc0e1a41527552f49d181 Author: John Bowman Date: Sat Sep 17 15:31:23 2022 -0600 Clean up more asy-latex files. commit 2c15485d146a43fbf6234d3fa0cec191a1a768b8 Author: John Bowman Date: Sat Sep 17 14:01:30 2022 -0600 Increment version to 2.84. commit 2ac4c5f85acd6b0a04865be937279dc29fadb76e Author: John Bowman Date: Sat Sep 17 11:27:55 2022 -0600 Fix default export extension. commit 40fd9804c037e1424e8e05498ce66f618bce5c58 Author: John Bowman Date: Sat Sep 17 01:17:37 2022 -0600 XASY: Implement color interface. commit f313efb692d567d300cd9e4931ea276cf0d1f74f Author: John Bowman Date: Sat Sep 17 01:01:10 2022 -0600 XASY: Remove obsolete code. commit 288ccc888480326cc6d3d4276498edf331a2bd7b Author: John Bowman Date: Sat Sep 17 00:49:25 2022 -0600 XASY: Implement solid pen; disable unimplemented color interface. commit 5b436a4eb99c50dce13e856c12cda7b7729cf02f Author: John Bowman Date: Fri Sep 16 23:05:54 2022 -0600 XASY: Convert from asy to Qt pattern. commit 2f9dc5be12dca41d2e0413d2c94f0359c60f6919 Merge: f3e3ed1a2 2bf7c010e Author: John Bowman Date: Fri Sep 16 21:19:37 2022 -0600 Merge branch 'Qt'. commit 2bf7c010ef6a46dee4d79b6b2b84ccddd51b0d3c Author: John Bowman Date: Fri Sep 16 21:14:17 2022 -0600 XASY: Fix arrowify bug. commit 6b8e2c390808f67f76e611861caa634188732558 Author: John Bowman Date: Fri Sep 16 15:28:47 2022 -0600 Simplify vectorfield example. commit 14476dda18ae3a6a00d441762505f4d4683eac9b Author: John Bowman Date: Thu Sep 15 23:32:21 2022 -0600 Allow specifying only endpoint of vector in vectorfield. commit 65e039f72730a196ce89eb1d4194e9eaf8a97b43 Author: John Bowman Date: Thu Sep 15 23:24:31 2022 -0600 Fix vectorfield scaling. commit b488009dcb56876362e073780e894307b21864cb Author: John Bowman Date: Thu Sep 15 21:38:11 2022 -0600 Remove diagnostic. commit 32d191daf3832e462b51e6a66df1a4f7ecda10cc Author: John Bowman Date: Thu Sep 15 21:06:03 2022 -0600 Fix vectorfield scaling. commit ef690c9363b3d973f07f20e58a9d6764c8b67c6b Author: John Bowman Date: Sun Sep 11 21:56:54 2022 -0600 Fix integer quotient bug introduced in 1e1e6cbbcfe65b58ead8e04d5e2b302ed011acd8. commit 997f87e375387fcb4fbbda66db62bc2332f42b2c Author: John Bowman Date: Sun Sep 4 22:31:36 2022 -0600 Remove arrows from slopefield; fix scaling in vectorfield routines. commit f3e3ed1a216fa3e31878ac4d6169875099508c80 Author: John Bowman Date: Fri Sep 16 15:28:47 2022 -0600 Simplify vectorfield example. commit 845985e11a46f3406fc80ddf4e22cf5bc0adea3b Author: John Bowman Date: Thu Sep 15 23:32:21 2022 -0600 Allow specifying only endpoint of vector in vectorfield. commit d0be9ddfcb8f004a520bb80f89739fa3378d06e4 Author: John Bowman Date: Thu Sep 15 23:24:31 2022 -0600 Fix vectorfield scaling. commit fd5c3f906f0b5565bddefae6a10f88ecb525796a Author: John Bowman Date: Thu Sep 15 21:38:11 2022 -0600 Remove diagnostic. commit 54e4567585ad4d694cbca6d4fe640e154f67af22 Author: John Bowman Date: Thu Sep 15 21:06:03 2022 -0600 Fix vectorfield scaling. commit 1d0e4cc886b840f87a726b40e6f9626b14568acc Author: John Bowman Date: Sun Sep 11 21:56:54 2022 -0600 Fix integer quotient bug introduced in 1e1e6cbbcfe65b58ead8e04d5e2b302ed011acd8. commit 01c0fad312146968a0fee96ba9282eccff6dc470 Author: John Bowman Date: Sun Sep 4 22:31:36 2022 -0600 Remove arrows from slopefield; fix scaling in vectorfield routines. commit d2a1f5d2984d4e558285426290a8c36d1dd9e18f Author: chaumont-arch Date: Sun Aug 28 23:46:13 2022 -0600 XASY: Fix saving bugs. commit e766b2f8cc069ac8bb28eb74b4ff47b1eaf7a50c Author: chaumont-arch Date: Sat Aug 27 03:12:24 2022 -0600 XASY: Remove debug print statements. commit 6d326fef6aa47d027ae159e9f9aeb60b67a1a657 Merge: bbdba2da4 d48103a9a Author: chaumont-arch Date: Sat Aug 27 03:07:16 2022 -0600 Merge branch 'Qt' of https://github.com/vectorgraphics/asymptote into Qt commit bbdba2da493f0c95caf971d267e67f6f29d2573e Author: chaumont-arch Date: Sat Aug 27 03:07:12 2022 -0600 XASY: Fix arrow dash render issue. commit d48103a9ad3de95caa1ff18ed6f2666128801166 Author: John Bowman Date: Fri Aug 26 00:29:01 2022 -0600 XASY: Apply KEY to begingroup(). commit 2191ec77923ddbdb742abfe9fdcf0f9c1ffa4505 Merge: 539b83671 98a183dcf Author: John Bowman Date: Fri Aug 26 00:13:20 2022 -0600 Merge branch 'master' into Qt. commit 98a183dcfbef510cae7f3ac45438f948fb82758b Author: John Bowman Date: Fri Aug 26 00:08:44 2022 -0600 XASY: Fix begingroup transformation. commit 539b83671f0b4c1c8d1a17565aa025dd130efc2e Author: chaumont-arch Date: Thu Aug 25 01:29:14 2022 -0600 XASY: Fix noncommutativity with arrows and fills. commit a42e056e27e7737695b18fd84842eb481893e531 Author: yarusome <97945148+yarusome@users.noreply.github.com> Date: Wed Aug 24 22:55:15 2022 +0800 Fixed `inversion inversion(circle, circle)` commit 03b46aa391c31f809eae74524ef73b777c1dcc68 Author: John Bowman Date: Mon Aug 22 16:43:42 2022 -0600 Initialize globalObjectCounter to 1. commit c7e925123f538a59d55e6e2a998d87a254ac194a Author: chaumont-arch Date: Sun Aug 21 00:33:36 2022 -0600 XASY: Fix arrow rendering glitch. commit 86bc2acae142bdee83515c31ad8d4f393501b22d Author: chaumont-arch Date: Sun Aug 14 23:05:22 2022 -0600 XASY: Fix layout warning messages. commit 2d243189a39087701ce6450623f0c67860ff8c37 Author: chaumont-arch Date: Sat Aug 13 18:39:52 2022 -0600 XASY: Fix translation arrow issue. commit 21e2e4ea0fe288247999f38eca30d90e6d524f9c Author: John Bowman Date: Thu Aug 11 22:43:58 2022 +0200 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "b6fb8491" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "b6fb8491" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo" commit: "2f68596" commit c9e57ede64853386a5db6ed7e8f2f1b080345c0f Author: John Bowman Date: Thu Aug 11 22:41:45 2022 +0200 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "526e85a5" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "526e85a5" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo" commit: "2f68596" commit a2405537b3da29db4c77403273f18113daeb73b8 Author: John Bowman Date: Thu Aug 11 22:32:43 2022 +0200 Update asygl. commit cf0e0be0be7c0b2be3cf36234d631515c1c5acd9 Author: John Bowman Date: Thu Aug 11 22:30:14 2022 +0200 Fix triangle groups. commit aa0954499ae7cdce7fc131441dff04c09d15076a Author: John Bowman Date: Thu Aug 11 14:50:46 2022 +0200 Add missing file. commit 06d9f8f16828f6f803360aef602251ee680293a7 Author: John Bowman Date: Wed Aug 10 17:08:48 2022 +0200 Remove version number from CTAN top level directory. commit 103f78f49c890ea7d6998355a89b291991b89ddf Author: John Bowman Date: Wed Aug 10 12:42:27 2022 +0200 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "0e34158d" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "0e34158d" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo" commit: "2f68596" commit 4920559af405da4d32bfd86403a32cc0e88677bb Author: John Bowman Date: Wed Aug 10 12:37:08 2022 +0200 git subrepo pull --force LspCpp subrepo: subdir: "LspCpp" merged: "d9cd4f6d" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "d9cd4f6d" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo" commit: "2f68596" commit 8bd894e51d17f39a7c6275d7e23701a3b278c4bb Author: John Bowman Date: Wed Aug 10 11:43:36 2022 +0200 Simplify code. commit f7557e41a68a0580a19c90d775f0d8f2d92de026 Author: John Bowman Date: Sun Aug 7 17:00:31 2022 +0200 Increment version to 2.83. commit 94c770a177aae2dc11e19f70cc9f22ff649d7cea Author: John Bowman Date: Sat Aug 6 22:17:24 2022 +0200 Update asygl. commit 9893d408fec128d76b50e3bef24ef6181beef0bc Author: John Bowman Date: Sat Aug 6 22:12:33 2022 +0200 Use floating point WebGL colors. commit 89dac594687cd2892851a685c52a092e86db85a7 Author: John Bowman Date: Sat Aug 6 06:52:30 2022 +1000 Avoid global variables in AsyGL library. commit a57d71e7f9857ceba05b9d2fc926953d385971b5 Author: chaumont-arch Date: Thu Aug 4 02:00:02 2022 -0600 XASY: Add rough intelligent dash patterns. commit 0ab3eae561e21fcf5a906becf75483291db032d3 Author: John Bowman Date: Wed Aug 3 22:14:33 2022 +0200 Preserve the terminal environment under MSDOS by ignoring the wait flag. commit 87f76fb7e5f3387643491fa123c18cf2be987006 Author: John Bowman Date: Mon Aug 1 23:36:30 2022 +0200 Enforce a unique normal and pen for each vertex in a PRC triangle group. commit f8d9c943899f592b20f9da01b51b223540536a63 Author: chaumont-arch Date: Sat Jul 30 21:50:25 2022 -0600 XASY: Fix arrow swapping bug. commit 8e28af4e33a62630f82652552988c02267821578 Author: John Bowman Date: Fri Jul 29 21:10:05 2022 +0200 Revert "Simplify code." This reverts commit 587a21490bf6d3892ddeab36dc8d8acdd3cec32c. commit 52170aac260c33ead0eddef60c527bcde782348c Author: John Bowman Date: Fri Jul 29 19:19:55 2022 +0200 Fix patch mode. commit b401886d804f4c5e870c69339c50dd76a97f0ea5 Author: John Bowman Date: Fri Jul 29 19:08:18 2022 +0200 Revert "Simplify code." This reverts commit dc9d231185c9b01bd8d32c2bbbc87001caa1f4d8. commit c53b2c5fd4cc2d4bbf4afb071534786c09e70542 Author: John Bowman Date: Fri Jul 29 12:53:45 2022 +0200 Fix segmentation fault. commit 0703107b953e0610a96776d059904af1cfb1c83e Author: John Bowman Date: Fri Jul 29 12:13:03 2022 +0200 Fix segmentation fault. commit e4dcdfbdef66e861d31bfe9ebbe722d66eafb3df Author: chaumont-arch Date: Thu Jul 28 11:47:28 2022 -0600 XASY: Update option menu names to match asymptote. commit b5a059a24c57f866c165d388a37a159a9fd723c7 Author: chaumont-arch Date: Thu Jul 28 11:46:50 2022 -0600 XASY: Add asyPen cap options. commit d6e0c8ae5f4811f1f30ff59db450723fe291f241 Author: chaumont-arch Date: Thu Jul 28 11:44:04 2022 -0600 XASY: Allow arrow pen types. commit b52467ba7f780cdb31a1776e0338388614a21dd3 Author: chaumont-arch Date: Thu Jul 28 01:50:07 2022 -0600 XASY: Preserve shape fill status when arrowifying. commit 3433888b9a26fa85995617bfdc1e51137b198692 Author: John Bowman Date: Thu Jul 28 05:55:22 2022 +1000 Fix defaultfilename for v3d files. commit 12740e6ff703bbab76629f065dd574f6242d130d Author: John Bowman Date: Thu Jul 28 05:45:36 2022 +1000 Revert commented diagnostic. commit ff99318b814d8b02a503897a41269c7bb3ebbb61 Author: chaumont-arch Date: Tue Jul 26 20:54:00 2022 -0600 XASY: Fix line mode menu glitch. commit b2af1e079781e7bc53d7804b1622c0486e484b18 Author: chaumont-arch Date: Tue Jul 26 20:46:05 2022 -0600 XASY: Give opacity hint. commit ec217a2261828eed41835da88c9bfa97af5ec2bc Author: John Bowman Date: Tue Jul 26 20:47:12 2022 +0200 Move v3d specification back to GitHub now that LaTeX markdown is supported. commit cb6aeda7ff3c1ed42bb04ed45ba26ce5061797f1 Author: John Bowman Date: Tue Jul 26 15:18:10 2022 +0200 List ambiguous functions. commit 60df18eea453855571ee4a2cc3f45878a4fe52d9 Merge: fa2844219 4fe6f9fb1 Author: John Bowman Date: Tue Jul 26 04:17:33 2022 -0600 Merge pull request #327 from jamadagni/master Additions to geometry.asy commit fa28442195bd99b9bac87e3ff752953ac57ee172 Author: John Bowman Date: Tue Jul 26 12:05:54 2022 +0200 Remove extraneous include. commit 3514430ddbdbf89e21b560202c06801c42ab590f Author: John Bowman Date: Tue Jul 26 12:05:24 2022 +0200 Optimize dvisvgm output. commit a7588cad36589cc3df2b1bc66123e8c94b681a39 Author: John Bowman Date: Tue Jul 26 11:57:05 2022 +0200 Make dvisvgmMultipleFiles true by default. commit 8f18ae72e3f12db006aabb23a5045c149a9a821a Author: John Bowman Date: Mon Jul 25 14:21:16 2022 -0600 Fix BUG #329: Fraction bars in labels are always black with PDF texengines. commit 9fe061906f7b5d0e334299c917effeb283989237 Author: chaumont-arch Date: Mon Jul 25 01:21:11 2022 -0600 XASY: Add rough version of opacity. commit acb00a464f88dfef0e36046925cd3df24a643e12 Author: chaumont-arch Date: Sat Jul 23 22:17:29 2022 -0600 XASY: Add rough version of pen caps. commit 3878760d3335d907ef6de6b251835eff51274395 Author: chaumont-arch Date: Sat Jul 23 21:53:27 2022 -0600 XASY: Add alpha line styles. commit 9573bc9448c759acd5fa820567d16f90d971acde Author: chaumont-arch Date: Mon Jul 18 10:50:48 2022 -0600 XASY: Fix filled arrow grouping issue. commit d5dfdeba88d17eaccfea41798c4fd3a221d03f6a Author: chaumont-arch Date: Sat Jul 16 22:08:18 2022 -0600 XASY: Add tabs to context menu. commit 4fe6f9fb1633ebcfff637bf2140f042b7d802245 Author: Shriramana Sharma Date: Thu Jul 14 22:34:15 2022 +0530 add fill and filldraw for circle,ellipse,triangle,triangle[] commit 8b8ad63d73e25bc098840c61b16a869184a6cdb2 Author: Shriramana Sharma Date: Thu Jul 14 20:19:38 2022 +0530 add path operator ecast(segment) commit 006cb4c48cae38fdd710a885df0d38fa172ed640 Author: Shriramana Sharma Date: Thu Jul 14 19:57:20 2022 +0530 add path operator cast(triangle), fix points order commit dc9d231185c9b01bd8d32c2bbbc87001caa1f4d8 Author: John Bowman Date: Thu Jul 14 09:22:08 2022 -0600 Simplify code. commit b7db8911e3b2cbcc3c6330312b49acb0e06213b9 Author: Shriramana Sharma Date: Thu Jul 14 19:47:02 2022 +0530 rename geometry.orthocentercenter to geometry.orthocenter commit fb60e629731adba9460cbb9297cf9def84baf897 Author: chaumont-arch Date: Thu Jul 14 01:17:14 2022 -0600 XASY: Fix arrow fill selection. commit de64e70501d4219220d8ecfeebd99effcb07f732 Author: chaumont-arch Date: Thu Jul 14 01:05:34 2022 -0600 XASY: Add hidden code for color options. commit 587a21490bf6d3892ddeab36dc8d8acdd3cec32c Author: John Bowman Date: Wed Jul 13 16:56:14 2022 -0600 Simplify code. commit 55d3dab28f6e3698b020cd6125690e65045c6091 Author: chaumont-arch Date: Wed Jul 13 04:07:01 2022 -0600 XASY: Allow basic arrow curve filling. commit 3961ec5be64d394e86e89d4ca30b176d4b5ecf62 Author: John Bowman Date: Sun Jul 10 10:52:38 2022 -0600 Fix issue #320. commit 694902944ba06f3c77dad9bc0bcc4e465fa7e1d4 Author: John Bowman Date: Sat Jul 9 20:12:27 2022 -0600 Address issue #320. commit e88b4b19b53141cc8a070c2eea1b343b5ae88b0e Author: chaumont-arch Date: Wed Jul 6 23:19:20 2022 -0600 XASY: Fix object rendering error. commit 5794434a3392e8c9da44340c4c5a5ab56d55621c Author: chaumont-arch Date: Wed Jul 6 23:13:19 2022 -0600 XASY: Set size of context menu. commit 33bf1141c1bb787bd5518dcfa9f73a4f48d37dfa Author: John Bowman Date: Wed Jul 6 23:05:40 2022 -0600 Output mean color only for PRC. commit 522aa30a31feeebfab9d9886200fa25c888cf41f Author: chaumont-arch Date: Tue Jul 5 15:16:15 2022 -0600 XASY: Remove deprecated fill changing method. commit ee191384db269c183b116f717fab11cb6ba4684b Author: chaumont-arch Date: Tue Jul 5 15:07:51 2022 -0600 XASY: Add default indicators for arrow options. commit 7cbd28939b01da0f96980864698d7d704c9c1a9c Author: John Bowman Date: Tue Jul 5 00:45:07 2022 -0600 Delete troublesome style file. commit 534d1361a7343dfc653a8b129d3392c0baba68f3 Author: John Bowman Date: Tue Jul 5 00:41:00 2022 -0600 Update asygl. commit 6cea12dfe927edec9aa784ab4b133f9b12ebde1d Author: John Bowman Date: Tue Jul 5 00:36:47 2022 -0600 WebGL: Support backwards compatibility. commit 323eb79327cf179491107d4ec3e3d6e994b324aa Author: John Bowman Date: Mon Jul 4 23:56:02 2022 -0600 WebGL: Compute Bezier curve bounds. commit 482d04bdad8a25d274d1719f6653ff4d4c7b3250 Author: John Bowman Date: Mon Jul 4 17:05:47 2022 -0600 WEBGL: Compute triangle group bounds. commit 72de9111632b3370f362740ab42cb6ce0238888b Author: chaumont-arch Date: Mon Jul 4 11:04:02 2022 -0600 XASY: Show hints for default arrow size and angle. commit 00cd7219a9794f21ecd3209411889b25523322e0 Author: John Bowman Date: Mon Jul 4 00:04:25 2022 -0600 WEBGL: Compute Bezier triangle bounds in WebGL. Remove Min and Max. commit 42bc4a3b4e0f187e265c353fc9e7766cf8165b95 Merge: a45aaa1e9 30ad132f3 Author: John Bowman Date: Sun Jul 3 22:09:06 2022 -0600 Merge branch 'master' into webglbounds. commit 30ad132f3a7dd182792d24a150aaa45de332ee8b Author: John Bowman Date: Sun Jul 3 19:34:37 2022 -0600 Simplify workflow. commit e15ba5b1e764cff6b75520d41c8fb96a03730d4e Author: John Bowman Date: Sun Jul 3 18:56:08 2022 -0600 Fix BUG #319: Rename NOCACHE to NoOutputFonts to address yet another Ghostscript backwards incompatibility (in Ghostscript version 9.56). commit 12a778be453f9319faeac99edfa25c0498bf2024 Merge: d393a76b3 48625bd2b Author: John Bowman Date: Wed Jun 29 13:06:59 2022 -0600 Merge branch 'compute3'. commit 48625bd2b66ca904af42e308c5bf8d0b5571de39 Author: John Bowman Date: Wed Jun 29 13:03:58 2022 -0600 Fix typo. commit e89c84c47bed90bca961e6bd26f8a8e7e3c8c3a0 Author: chaumont-arch Date: Sun Jun 26 23:53:52 2022 -0600 XASY: Fix arrow reflection bug. commit 149229fd5ac11209c9fa1f73d5b0d3ed4c2af7f4 Author: chaumont-arch Date: Sat Jun 25 00:03:29 2022 -0600 XASY: Fix context menu object selection quirks. commit 81c731e85cdd1803921322e7608306ff9109c0d8 Author: chaumont-arch Date: Thu Jun 23 21:47:06 2022 -0600 XASY: Finalize saving fix. commit d531d9e1a96ef2c589b76e38c1a3817cac0d5d95 Author: chaumont-arch Date: Wed Jun 22 00:49:55 2022 -0600 XASY: Progress on saving bug. commit d393a76b3960455b4285806771e705faa54c20d8 Merge: 0669e4fb0 d8cacc97b Author: Supakorn 'Jamie' Rassameemasmuang Date: Tue Jun 21 15:44:12 2022 -0600 Merge pull request #317 from vectorgraphics/dependabot/pip/GUI/numpy-1.22.0 Bump numpy from 1.21.0 to 1.22.0 in /GUI commit d8cacc97b70f35914ba89baf8c564af93af42edc Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Jun 21 21:32:47 2022 +0000 Bump numpy from 1.21.0 to 1.22.0 in /GUI Bumps [numpy](https://github.com/numpy/numpy) from 1.21.0 to 1.22.0. - [Release notes](https://github.com/numpy/numpy/releases) - [Changelog](https://github.com/numpy/numpy/blob/main/doc/HOWTO_RELEASE.rst) - [Commits](https://github.com/numpy/numpy/compare/v1.21.0...v1.22.0) --- updated-dependencies: - dependency-name: numpy dependency-type: direct:production ... Signed-off-by: dependabot[bot] commit d9c5fb35f0f2967f4a9af2a1df65aaa64996f861 Author: chaumont-arch Date: Mon Jun 20 02:40:52 2022 -0600 XASY: Improve how list options are created. commit e395fb2dd6250a78fd6ce8fd134e2cbf6dda9936 Author: chaumont-arch Date: Thu Jun 16 23:17:39 2022 -0600 XASY: Fix text entry bug. commit 134ebc7ff7947248ed281383a7026586d54b6567 Author: chaumont-arch Date: Thu Jun 16 21:20:34 2022 -0600 XASY: Refactor reflection code. commit 63932b2597a406fddbb98763c353fee01aba2524 Author: chaumont-arch Date: Sun Jun 12 23:53:38 2022 -0600 XASY: Refactoring and quality enhancement. commit 8677a0f1a2571f1b38fc1589cf12f6341f69b659 Author: John Bowman Date: Sun Jun 12 10:32:22 2022 -0600 TRANSPARENCY: Save 4 bytes in shuffle array. commit 83e09ca618a9063f0d8c272dd855be9e081c19b1 Author: chaumont-arch Date: Sat Jun 11 20:16:52 2022 -0600 XASY: Make options dynamic. commit 292500e5c8d7762b8a49e62665c07221c3bee395 Author: chaumont-arch Date: Sat Jun 11 20:05:04 2022 -0600 XASY: Add confirm button for the context menu. commit 8097098c7938bcc1acc92e7aa5ca675160f47e23 Author: chaumont-arch Date: Fri Jun 10 21:37:38 2022 -0600 XASY: Add fill type options. commit 6d42edf99fcc672a4f7ab3d098c82eaa76c2e90c Author: chaumont-arch Date: Fri Jun 10 21:23:30 2022 -0600 XASY: Add arrow angle changing options. commit d9d7a49824f5976135d4b82f554a6a6181ee7087 Author: chaumont-arch Date: Fri Jun 10 21:12:42 2022 -0600 XASY: Add arrow sizes. commit a45aaa1e948343e6a6d86391f26f4f132e17e6bd Merge: 5f676ec6a 0669e4fb0 Author: John Bowman Date: Thu Jun 9 19:01:27 2022 -0600 Merge branch 'master' into webglbounds. commit 0669e4fb0fc358ae9555d3db375f3568365b740b Author: John Bowman Date: Thu Jun 9 19:00:57 2022 -0600 Compute tight bounds of Bezier patches and triangles. commit 5f676ec6a4cc13ce7e382f8b5204df700e97e2b4 Author: John Bowman Date: Thu Jun 9 17:35:45 2022 -0600 Compute Bezier patch bounds in WebGL. commit 4f51b82701aea7a9c14b89aa833fa10152f2d8c1 Author: John Bowman Date: Thu Jun 9 17:26:50 2022 -0600 Fix formatting. commit 5d6189436d95bbbf6f443d67cc9744af3338ff89 Author: chaumont-arch Date: Wed Jun 8 17:54:34 2022 -0600 XASY: Fix selection crashing bug. commit ebf5014696e14f74b17b8a6c2ce740c15e15c657 Author: chaumont-arch Date: Wed Jun 8 17:51:54 2022 -0600 XASY: Clean up code used for testing. commit 2879110f7a1ebb3c03cfbb01d68bfc4edbce466a Author: John Bowman Date: Mon Jun 6 21:45:14 2022 -0600 Derive size from offset in blend shader. commit 597d08b0ae468babf8c9a7b956d14c11415c1946 Author: John Bowman Date: Sun Jun 5 13:06:39 2022 -0600 Update to latest prefixsum shader. commit f061f1483550229f592eab9b3e0425a2d6e608c3 Author: chaumont-arch Date: Sun Jun 5 00:55:47 2022 -0600 XASY: Fix arrow style selection bug. commit a2f9702924d4ec7592ba5241a9bc1a40aeb25733 Author: chaumont-arch Date: Sun Jun 5 00:44:26 2022 -0600 XASY: Add more arrow types. commit 75baa00f90034b6de5ccb2dc57b10d723effb4e3 Author: John Bowman Date: Sat Jun 4 21:02:02 2022 -0600 Restore zero shader. commit a95c328913df1d0b6ec0ecdb89dae48577556525 Author: John Bowman Date: Fri Jun 3 00:45:00 2022 -0600 Automatically choose optimal sum2 shader. commit ba6fcdce8f4e90da7944a9ddec6fbd0ab617181e Author: John Bowman Date: Thu Jun 2 16:05:07 2022 -0600 Optimize sum shaders. commit 5db78fbb79c6711d250748e47a08381eff4f9a04 Author: John Bowman Date: Thu Jun 2 09:26:49 2022 -0600 Generalize sum2 shader. commit 70a7c559bbac4e1939552b4228704bdf60a753df Author: John Bowman Date: Wed Jun 1 16:10:04 2022 -0600 Use optimized binomial tree reduce in sum1 shader. commit 9271bd55970b7ba76e265d4dd9a89a932b8981aa Author: chaumont-arch Date: Tue May 31 17:57:06 2022 -0600 XASY: Code improvements and arrow copying setup. commit 98939bfe5406905d51b64ae90ccb56822f6f97c3 Author: chaumont-arch Date: Tue May 31 17:51:19 2022 -0600 XASY: Allow dearrowification. commit d9eab3fb70031cdaa4de8ff14147eb6e895ec317 Author: chaumont-arch Date: Tue May 31 17:12:09 2022 -0600 XASY: Snap focus to canvas when objects change. commit 9b853eead5d61728663ed5c457b4764800a70f17 Author: John Bowman Date: Tue May 31 13:33:33 2022 -0600 Optimize sum1 shader. commit aa4700c2d91fcd17fd1768bd7df45ccd788c20d7 Author: John Bowman Date: Tue May 31 11:58:45 2022 -0600 Revert cd7092db3a5f297df6b735c91b4989caf8e60609. commit be2310a8affc0abf3e8d330489e2ff1f491c3df9 Author: John Bowman Date: Tue May 31 11:20:20 2022 -0600 Fix memory barriers. commit 7df45601fd0e38a252e4c68929ed54d9c286e971 Author: John Bowman Date: Tue May 31 10:45:45 2022 -0600 Fix memory barriers; optimize Hillis-Steele algorithm. commit 64ca0f99828ac592896b524aa79b043101210e24 Author: John Bowman Date: Mon May 30 23:05:02 2022 -0600 Add missing shader. commit 411ffcbc0b0cf626a36ab66bb342656a1e1da2e4 Author: John Bowman Date: Mon May 30 19:00:48 2022 -0600 Finish partial sums. commit fa12530d3f7a7d2e84c330ffa35181df38580831 Author: chaumont-arch Date: Mon May 30 11:59:22 2022 -0600 XASY: Rough version of adding arrowheads. commit 8519ee922db934d05f0945b93ef17e4b24fe6ea2 Author: John Bowman Date: Mon May 30 10:58:37 2022 -0600 Implement bezier(real a, real b, real c, real d, real t). commit a728266f13a123f772294b50e2a58b50c28091ef Author: John Bowman Date: Sun May 29 23:24:34 2022 -0600 Avoid unnecessary differential computations. commit c5ff5bd2628c05dcf52acd6502a851d78cce3510 Author: John Bowman Date: Sun May 29 23:18:15 2022 -0600 Defer fragment buffer resizing as long as possible. commit 952e340b05bbd3b6ad5f191f74e0669a5055c2ac Author: John Bowman Date: Sun May 29 23:06:37 2022 -0600 Fix noGPUindexing. commit 044dc63915cb19f8106f2e8ebb5df91cf15cdf4f Author: John Bowman Date: Sun May 29 22:59:22 2022 -0600 Disable subdivision crack adjustments for transparent patches. commit 8bd698940d42574cbe6c7a3c7170039157b43196 Author: John Bowman Date: Sun May 29 22:46:26 2022 -0600 Fix commit f57b4f8b9ead42f092cb706960bf10b6b8d55e30. commit 8931b432b64b6b90e934bc502c62fffe47a4a8cb Author: John Bowman Date: Sun May 29 22:11:32 2022 -0600 Standardize names. commit bf9e1ee6c40f9de385992ecef5ca0b8c46f3f63b Author: John Bowman Date: Sun May 29 21:55:36 2022 -0600 Improve performance. commit 77d25cd8a9151b5a32ecb6169b5973284a28a955 Author: John Bowman Date: Sun May 29 19:13:12 2022 -0600 Fix maximum depth detection. commit cd7092db3a5f297df6b735c91b4989caf8e60609 Author: John Bowman Date: Sun May 29 15:49:18 2022 -0600 Use atomicCounterExchange to reset compression counter. commit 711b1a1666ae0b622a0a79c6275d4076523bb4ba Author: chaumont-arch Date: Sun May 29 15:18:50 2022 -0600 XASY: Add basic logic for replacing objects. commit e407a7c34129589fcbb0a86d42925592e7d3f8b0 Author: John Bowman Date: Sun May 29 14:42:47 2022 -0600 Finish implementing feedback to CPU. commit f57b4f8b9ead42f092cb706960bf10b6b8d55e30 Author: John Bowman Date: Sun May 29 10:51:02 2022 -0600 Send feedback to CPU. commit 5801785e5729fda77f88fabdd7ddbd0e53a48851 Author: John Bowman Date: Sun May 29 00:57:57 2022 -0600 Revert "Store opaqueDepth in alpha channel of opaqueColor." This reverts commit 431d19384d090f11daeed3dc449dc61d2ed5e309. commit 431d19384d090f11daeed3dc449dc61d2ed5e309 Author: John Bowman Date: Sun May 29 00:04:35 2022 -0600 Store opaqueDepth in alpha channel of opaqueColor. commit a35d30b911d256832fe067f638aec75fdad79814 Author: John Bowman Date: Sat May 28 23:28:28 2022 -0600 Test 2-stage algorithm. commit 64942510ac5d30470cdd22e777cd0b1a38a6ff69 Author: John Bowman Date: Sat May 28 23:00:33 2022 -0600 Test 3-stage algorithm. commit 1c3176bb63ff4ab159bdea150174382c6f6b2b70 Author: chaumont-arch Date: Sat May 28 22:27:39 2022 -0600 XASY: Setup work for adding arrowheads. commit e84bf41ae59bb60cdff9357fc0c7f7faf8933174 Author: John Bowman Date: Sat May 28 11:19:37 2022 -0600 Add const qualifier. commit 0f0a04b64cccd21c656ec7a69565f43cf8e6a7b7 Author: John Bowman Date: Fri May 27 23:26:36 2022 -0600 Implement GPUblockSize. commit 58ddb9f87dcee756366d82b48424c3fe1bac19d9 Author: John Bowman Date: Fri May 27 23:02:11 2022 -0600 Disable GPUcompression by default. commit 7dae0ee579ba48d52d4687b79e87506e989a8ce2 Author: John Bowman Date: Fri May 27 22:48:47 2022 -0600 Use a single improved shader to avoid bank conflicts. commit 4712edd628e9742417b7d83b4d38d2721bae370e Author: John Bowman Date: Wed May 25 09:32:56 2022 -0600 Simplify code. commit 1bfbb8215540524f4182744d836031d2223915ed Author: John Bowman Date: Wed May 25 09:27:17 2022 -0600 Revert "Perform all sums on the GPU." This reverts commit 574eb027cf53064cfb27e8ab09333a7775b2e094. commit f377f169236460849e5507e75f50ea8e3955aeba Author: chaumont-arch Date: Tue May 24 00:05:26 2022 -0600 XASY: Change options based on item type. commit 33cc6fcb9e5ca77a4565db00465345c2b28318d0 Author: chaumont-arch Date: Mon May 23 23:33:53 2022 -0600 XASY: Make reflection relative to object. commit 574eb027cf53064cfb27e8ab09333a7775b2e094 Author: John Bowman Date: Mon May 23 22:59:08 2022 -0600 Perform all sums on the GPU. commit d270aa2012843aa592d2ada3b390ded7c1c3c35f Author: John Bowman Date: Mon May 23 19:28:39 2022 -0600 Implement Hillis-Steele algorithm in second stage. commit b182742a8ac29f1fbf1f37228492a09236c0e0ce Author: John Bowman Date: Mon May 23 17:35:04 2022 -0600 Add another compute shader stage to reduce bandwidth to CPU. commit 85e78f59600fde0f6214212012c80ff539474a13 Author: John Bowman Date: Mon May 23 16:10:44 2022 -0600 Avoid use of localSumBuffer. commit 4d4159b5ec2eafa2bb3ba0837d863690af66ce4e Author: John Bowman Date: Mon May 23 15:30:10 2022 -0600 Use a single compute shader. commit aeabf93463cb35e55e7d86bd2a460f1616d44939 Author: chaumont-arch Date: Sun May 22 23:31:07 2022 -0600 XASY: Fix minor reflection bug. commit ea491e1af487809aeca6832227cc2d5aac7ab9d5 Author: chaumont-arch Date: Sun May 22 23:21:56 2022 -0600 XASY: Add options reflection to context menu. commit 3c38347c7c0c3a55b0677a7089bf3a662d1515fd Author: chaumont-arch Date: Sun May 22 00:51:39 2022 -0600 XASY: Prevent context menu crashing. commit 13aa6344ac37b2303deb1e4e6d6a24d9b260762f Author: John Bowman Date: Thu May 19 20:57:45 2022 -0600 Improve documentation of rotate(real, triple). commit 68ff3758a11c9ab62c517b219cd6321b6c8a17ff Author: chaumont-arch Date: Wed May 18 23:26:19 2022 -0600 XASY: Change filling method. commit e867b1fe04293de229d6c133d7cf21a5a9906b13 Author: chaumont-arch Date: Tue May 17 01:52:30 2022 -0600 XASY: Display icon. commit a6d8511834b0dab1dd3580ec0920fbde5cc76042 Author: chaumont-arch Date: Tue May 17 01:51:30 2022 -0600 XASY: Display icon. commit 0f5cb6b88b5c1e3a68ef42f0b441ed4812aa1392 Author: chaumont-arch Date: Tue May 17 01:32:27 2022 -0600 XASY: Remove redundant menu. commit c1ec3a89279d567cf4a910557546137aac2c0ee3 Author: John Bowman Date: Sat May 14 12:27:51 2022 -0600 Increment version to 2.82. commit 4347e589ed5e4fc4f03d4fdafced28f6345f21a7 Author: chaumont-arch Date: Sat May 14 00:09:48 2022 -0600 XASY: Minor quality improvements to the options window. commit 429a50bc7199fcbc5b081369dcb75f92ba766a87 Author: chaumont-arch Date: Sat May 14 00:01:55 2022 -0600 XASY: Alpha version of context menu. commit 920c0886c23e20db270d04337e59c4d9e069dc63 Author: John Bowman Date: Fri May 13 23:17:54 2022 -0600 Fix CYGWIN warning. commit c895e09915302ae276740f1cc91afd834658ae37 Author: John Bowman Date: Fri May 13 22:31:19 2022 -0600 Fix bug #313: opaque rendering on platforms lacking GL_ARB_fragment_shader_interlock. commit 1c3deeb0cd6bab28ebde0abc9d04c0302fa84713 Author: chaumont-arch Date: Wed May 11 22:59:01 2022 -0600 XASY: Finalize alpha version of fill/unfill. commit 1bb18d1c97b1c05aaff755fbfcc8e4b0a9852776 Author: chaumont-arch Date: Wed May 11 22:48:53 2022 -0600 XASY: Setup work for context menus. commit fc7dac6887136289035eaa4f7f60fcbee1dc3967 Author: John Bowman Date: Wed May 11 18:29:56 2022 -0600 Update documentation. commit d54736762baaf6b675311c0e5791f6aa5792ae57 Author: John Bowman Date: Wed May 11 16:40:43 2022 -0600 Document surface constructor for solids of revolution. commit f910ea19eee9f240045594bf049f363cc8181ac4 Merge: de70a958b 72b0fe368 Author: John Bowman Date: Tue May 10 22:20:00 2022 -0600 Merge branch 'Qt'. commit de70a958b3844210142a9066b20bfce2a62bde4f Author: John Bowman Date: Tue May 10 21:38:21 2022 -0600 Zero offset buffer when required. commit 72b0fe3685729e059337082dcd5585ae7fa20f50 Author: chaumont-arch Date: Sun May 8 22:38:36 2022 -0600 XASY: Fix crashes from opening xasy files. commit a14f4a75cd8f6d0f9cf6c4217e70baa690e4a1ad Author: chaumont-arch Date: Thu May 5 23:11:47 2022 -0600 XASY: Fix bounding box drawing issue. commit 27d52fa7a6356cda473eb24acac77e822c6fb09d Author: John Bowman Date: Tue May 3 12:20:43 2022 -0600 Port to MacOS. commit e23a5527b710aa3cbf83d1d0a682aa5c6a49b62c Author: John Bowman Date: Sun Apr 24 10:24:46 2022 -0600 Fix bug #310: Missing slash in temporary file path. commit 365df5651ce0728fa3607d05ae1396668f374197 Author: John Bowman Date: Sun Apr 10 09:35:38 2022 -0600 Rename example. commit 253349484d7d76aeb639428f02e5c08779fbe094 Author: John Bowman Date: Sun Apr 10 00:31:20 2022 -0600 Add missing typedef. commit 29967ac62cb69bf3e3196b8cdf5e714007eabce2 Author: John Bowman Date: Sun Apr 10 00:20:20 2022 -0600 Fix last commit. commit 6f10abaa6611c52cb8040b5715218287202b5510 Author: John Bowman Date: Sun Apr 10 00:18:32 2022 -0600 Consult pkg-config for readline library. commit 5af8022000bd9d3ab21e7c3548e92e9d59dd3c07 Author: John Bowman Date: Sun Apr 10 00:11:15 2022 -0600 Fix issue #40: Consult pkg-config. commit 4bd54e14498523c06a2e4cecf20e7c4c6851299d Author: John Bowman Date: Fri Apr 8 23:23:37 2022 -0600 Fix issue #309. commit 2ffee49a7e3fe5180a96332d529eae8bfe7a8316 Author: John Bowman Date: Sat Apr 9 14:49:43 2022 +1000 Move global typedef within namespace. commit 8f2ce216a6f5537d74a6b691fcd416a344570007 Author: John Bowman Date: Fri Apr 8 17:03:24 2022 -0600 Implement real Schur decomposition. commit 0f2ad99bcd3b7cb85ba66d4576ada8438da9c288 Author: John Bowman Date: Fri Apr 8 16:23:26 2022 -0600 Implement Schur decomposition. commit 5b705e7dece21fb809a43e25b4e97c1707a21152 Author: John Bowman Date: Tue Apr 5 23:28:53 2022 -0600 Add example; remove empty directories. commit b00f9fc3c2bf1b3b3cb311faf7098c149088e3cb Author: John Bowman Date: Tue Apr 5 21:48:56 2022 -0600 Increment version to 2.81. commit 52f5c99018d24883f6e115ae72beaa88a15d0669 Author: John Bowman Date: Tue Apr 5 11:32:10 2022 -0600 Fix last revision. commit 6992734bf38c28328ba829944596fa43d3d40512 Author: John Bowman Date: Mon Apr 4 23:00:20 2022 -0600 TRANSPARENCY: Restrict number and size of workgroups as needed. commit 561986f58f96e407e92979207d66d4bc864b9556 Author: John Bowman Date: Sun Apr 3 21:56:20 2022 -0600 TRANSPARENCY: Optimize global summation on CPU. commit e80e073ca6e2bfdc06c277ba17544e71533cecf7 Author: John Bowman Date: Tue Mar 29 23:04:53 2022 -0600 TRANSPARENCY: Fix export. commit 0fb93b6435910d57594ab4fc5542efd9e0543103 Author: John Bowman Date: Mon Mar 28 09:44:08 2022 -0600 TRANSPARENCY: Check for empty pixels with -noGPUCOMPRESS. commit 6d3df54aa7801a97ce35824dfa6ffc9109b1a4eb Author: John Bowman Date: Mon Mar 28 09:29:58 2022 -0600 TRANSPARENCY: Fix buffer allocation. commit 36c947e404b55985d949c7d2313e2f94334762f3 Author: John Bowman Date: Mon Mar 28 08:22:31 2022 -0600 TRANSPARENCY: Use no more than 8 SSBOs. commit 5e1c855ab8287c60a278d3ed3eb93e7eca644418 Author: John Bowman Date: Sun Mar 27 13:21:14 2022 -0600 Implement GPUcompress=false option for non-NVIDIA GPU cards. commit 554a81c8898bc97d0d4841178e92f5ee3d2a5f22 Author: John Bowman Date: Sat Mar 26 12:33:24 2022 -0600 Fix commit 56df79e03bb18523f47be46620b7be5e62d92eac. commit 9d0c1b6afea89eeba8c90b54c1f3ee73fd8094a1 Author: John Bowman Date: Sat Mar 26 11:24:03 2022 -0600 TRANSPARENCY: Fix floating point exception. commit 56df79e03bb18523f47be46620b7be5e62d92eac Author: John Bowman Date: Sat Mar 26 10:23:23 2022 -0600 TRANSPARENCY: Fix export when GPUindexing=false. commit 25650a26253bfcc81b4a7d4448f352e41236d392 Author: John Bowman Date: Sat Mar 26 09:52:06 2022 -0600 TRANSPARENCY: Fix segmentation fault. commit 5649ac09e2deb90d4929b34e47677395bac20b48 Author: John Bowman Date: Fri Mar 25 22:17:45 2022 -0600 TRANSPARENCY: Fix atomic counter initialization. commit f88c7598b4b01a1d4c0c0bd5412a48d1a0eb5160 Author: John Bowman Date: Fri Mar 25 00:56:59 2022 -0600 TRANSPARENCY: Transmit maxSize in global sum array. commit 3e0cd170f6fe57e38265fff7547d2374ae05bee6 Author: John Bowman Date: Wed Mar 23 23:29:14 2022 -0600 TRANSPARENCY: Discard empty counts. commit afe3b3291af5d8f02ebb2e286612d90fa96cf7c1 Author: John Bowman Date: Mon Mar 21 09:50:25 2022 -0600 TRANSPARENCY: Fix data format. commit d962523e868ae3240b4196cdaf498337dde34ff3 Author: John Bowman Date: Sun Mar 20 10:43:27 2022 -0600 TRANSPARENCY: Transfer maxSize via globalSum buffer. commit a0c83db864e01587c64c47c96004e62455682ecc Author: John Bowman Date: Sat Mar 19 22:52:32 2022 -0600 TRANSPARENCY: Check ARRAYSIZE on every frame. commit 50aaba78229e7401a1d3863ab3c4184dfc432585 Author: John Bowman Date: Sat Mar 19 22:10:22 2022 -0600 TRANSPARENCY: Don't zero offset buffer. commit 6ac4803bd0c0af840dcf8609087d521883fe46ca Author: John Bowman Date: Sat Mar 19 18:28:38 2022 -0600 TRANSPARENCY: Improve last revision. commit bd35596b24cde31b551ae4c6a3ea02e97ce1f0b1 Author: John Bowman Date: Sat Mar 19 15:13:35 2022 -0600 TRANSPARENCY: Optimize case of one transparent fragment. commit 8b061a48bdf27b5e142bf48869087c73562169fb Author: John Bowman Date: Sat Mar 19 14:46:06 2022 -0600 TRANSPARENCY: Simplify code. commit 9946580b30f18817b09a46ab62fd9e20d113b303 Author: John Bowman Date: Sat Mar 19 14:06:40 2022 -0600 TRANSPARENCY: Fix depth lookup. commit 4c6980c4001d493e83d8ba5d11ba56d9f21c38c9 Author: John Bowman Date: Fri Mar 18 22:50:54 2022 -0600 TRANSPARENCY: Conditionally define uniform. commit 638bb757747216fae868e8a6e152b6eb690c30ce Author: John Bowman Date: Mon Mar 14 12:25:40 2022 -0600 Implement weighted least-squares fit. commit 6afedcba8989cac33ce677387160528d828ea269 Author: John Bowman Date: Sun Mar 13 19:28:03 2022 -0600 TRANSPARENCY: Combine local index and depth into structure. commit fd3d794762fd6e532b916318625d4361f54467bb Author: John Bowman Date: Sun Mar 13 17:15:29 2022 -0600 Remove unused code. commit dbafbb86b583bc1671f6111c7518219efb74de18 Author: John Bowman Date: Sun Mar 13 17:01:26 2022 -0600 Merge conditionals. commit a6e12dda261cad07593c988952b2fe62cf317600 Author: John Bowman Date: Sun Mar 13 14:19:01 2022 -0600 Avoid unnecessary writes to OpaqueDepth SSBO. commit 115e01faf97e2b1cc6b9ba9c8928d80bc0b00aa0 Author: John Bowman Date: Thu Mar 10 12:01:47 2022 -0700 Use UNIX line terminators. commit b007afcc67cf18fd431492f9f2cf449daac10b95 Author: John Bowman Date: Thu Mar 10 11:56:22 2022 -0700 git subrepo commit (merge) LspCpp subrepo: subdir: "LspCpp" merged: "a311aa1d" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "19411f6c" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo" commit: "2f68596" commit 0ce8a977de9a3f01ac63c895d56da4f3848d2035 Author: John Bowman Date: Tue Mar 8 23:56:24 2022 -0700 git subrepo commit (merge) LspCpp subrepo: subdir: "LspCpp" merged: "574c2530" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "95cf6780" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit d12b2dd06788452e0a4fe68b10cc181c6747e42d Author: John Bowman Date: Tue Mar 8 23:36:37 2022 -0700 Remove all invisible files from release. commit 1cc029d5b9f573282f0e36daa12c28366130fce8 Author: John Bowman Date: Mon Mar 7 21:09:49 2022 -0700 LSP: Clean up generated files; fix permissions. commit c7e039c39c71323575a1c80ffc2405ab244339b0 Author: John Bowman Date: Mon Mar 7 20:04:26 2022 -0700 git subrepo commit (merge) LspCpp subrepo: subdir: "LspCpp" merged: "05c9d022" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "b1e44c8f" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit 94fe097db546f1de9e5b43e6b31fe1d2d4e4edaf Author: John Bowman Date: Mon Mar 7 14:23:48 2022 -0700 Increment version to 2.80. commit 70dcf303c069ce3669f5f589aa3642650665278b Author: John Bowman Date: Mon Mar 7 11:40:50 2022 -0700 Improve diagnostic. commit 72e4dd6c5c4561fb489d60e37b8033bfbe8f7e0b Author: John Bowman Date: Mon Mar 7 10:22:23 2022 -0700 Fix diagnostic. commit ca02b6f4a34e8171ce888dbbb732d6705d075653 Author: John Bowman Date: Mon Mar 7 10:03:50 2022 -0700 TRANSPARENCY: Fix export. commit 54ed5ea241a6c58946b0d57a813dbf184cf99413 Author: John Bowman Date: Mon Mar 7 00:18:02 2022 -0700 TRANSPARENCY: Store GPUindexing count in first half of offset SSBO. commit fe52fff8f5d413dd0a34de7a035cfee00d940dc7 Author: John Bowman Date: Sun Mar 6 12:47:55 2022 -0700 TRANSPARENCY: Save an SSBO by storing maxSize in countBuffer. commit bf4e5b66c12868256765bfdc68a91913c4e513f5 Author: John Bowman Date: Sun Mar 6 10:22:31 2022 -0700 TRANSPARENCY: Use a separate count buffer. commit f5989b52a8aa9a8f50c93240ebf28d240508b86f Author: John Bowman Date: Sat Mar 5 22:56:35 2022 -0700 Remove unused uniform. commit 8194c27001d46765cb7914df9751e5aa367a6d51 Author: John Bowman Date: Sat Mar 5 18:15:11 2022 -0700 Reformat. commit d54990432603803f5166eab92cd7a63d53ed696b Author: John Bowman Date: Sat Mar 5 15:46:28 2022 -0700 Use no more than 8 SSBOs; avoid unnecessary count lookup. commit 496c16cbdde3c4d52667d10e248c59ed04c5531f Author: John Bowman Date: Sat Mar 5 12:51:14 2022 -0700 Reduce number of SSBOs by one. commit 616460b1dd97ec326f4cf47a6c01ce4b301efb20 Author: John Bowman Date: Fri Mar 4 23:37:28 2022 -0700 Fix offscreen export. commit 096e6ecadea8279ce0c9d8d1aa2279615f341688 Author: John Bowman Date: Fri Mar 4 20:34:56 2022 -0700 TRANSPARENCY: Define m1 and r only when needed. commit 49b90ca22992f97a9b314d2ac4e2da9b6e17dd40 Author: John Bowman Date: Fri Mar 4 15:55:11 2022 -0700 Fix GPUinterlock=false. commit 4b8738823adfbe292a90f0a6a037b4e9716e95d1 Author: John Bowman Date: Fri Mar 4 10:33:02 2022 -0700 TRANSPARENCY: Set initial (minimum) maxSize to 8. commit 1d530b46f61741e8598dd425301894bb529a77a6 Author: John Bowman Date: Fri Mar 4 03:15:21 2022 -0700 TRANSPARENCY: Remove unused variable. commit 21e44728d8bd82570dd54b7a5a2abfc94b594e88 Author: John Bowman Date: Thu Mar 3 23:39:55 2022 -0700 TRANSPARENCY: Reduce ARRAYSIZE requirement. commit f22a8995636f039280018b6779199aac008fe852 Author: John Bowman Date: Thu Mar 3 22:19:58 2022 -0700 TRANSPARENCY: Choose optimal ARRAYSIZE. commit 43b9472bb85a9b7f72168ebbb2a9fe9472ad2a8f Author: John Bowman Date: Thu Mar 3 13:46:21 2022 -0700 TRANSPARENCY: Sort indices rather than colors. commit c44585b6711d7d2d9194066e2f51055325e52149 Author: John Bowman Date: Fri Feb 25 21:25:06 2022 -0700 TRANSPARENCY: Automatically determine optimal number of work groups. commit 876ada0dff7e8f074eb58433b531de6db7c9ea96 Author: John Bowman Date: Sun Feb 20 22:27:23 2022 -0700 TRANSPARENCY: Avoid unnecessary uniform. commit 258eb141fb034b8ed28f98ce9517249bb032299e Author: John Bowman Date: Sun Feb 20 22:15:21 2022 -0700 TRANSPARENCY: Standardize notation. commit e175bd35ac515c45f0b061ed6ebd12976ef1d6ec Author: John Bowman Date: Sun Feb 20 21:48:32 2022 -0700 TRANSPARENCY: Reorganize buffers. commit 3a80fa70f07145e828a94f2154228d395f6beaac Author: John Bowman Date: Sun Feb 20 15:42:02 2022 -0700 Use fewer (but larger) workgroups for sum2. commit 2a2689c3ddf9c196881b53ce79c809ef8663c783 Author: John Bowman Date: Sun Feb 20 12:57:16 2022 -0700 Improve performance and reduce GPU to CPU communication by adding another summation phase. commit c9e2e9199a7de723e4ef112c603777a90a7015e2 Author: John Bowman Date: Sun Feb 20 00:22:26 2022 -0700 Preprocess global sums on GPU. commit efb89680a9bca82f38fa0ab5c8faf1e5dc584b3e Author: John Bowman Date: Fri Feb 18 17:52:54 2022 -0700 Fix commit 45f445c9c6a8f9d2f5d4c743464113e827b86ec8. commit 365f243576c84a0a55099f7a263222154356ea8e Author: John Bowman Date: Wed Feb 16 23:04:22 2022 -0700 Optimize code. commit 6aea8f369dfa696881627bc1769a2131a9a626ee Author: John Bowman Date: Wed Feb 16 22:56:20 2022 -0700 Simplify code. commit 39fad88b4b2ad2fb3e29d7253d8a6d300cdd9137 Author: John Bowman Date: Wed Feb 16 22:30:44 2022 -0700 TRANSPARENCY: Partially revert commit e2cf1e35d0d9655d63e96c72d9d315522844d704. commit 45f445c9c6a8f9d2f5d4c743464113e827b86ec8 Author: John Bowman Date: Wed Feb 16 14:05:37 2022 -0700 Fix noGPUindexing. commit 78f7513e603b96cf377ea6d0c3edfd8d17fed85c Author: John Bowman Date: Wed Feb 16 12:04:29 2022 -0700 Optimize offset buffer operations. commit c33986dd8ff7c2de982155687193204cbe308897 Author: John Bowman Date: Tue Feb 15 23:13:19 2022 -0700 Account for final pixel. commit e2cf1e35d0d9655d63e96c72d9d315522844d704 Author: John Bowman Date: Mon Feb 14 11:29:28 2022 -0700 Update memory barriers. commit fb36448a1614a942b51598e84897df23e4da59c6 Author: John Bowman Date: Mon Feb 14 10:19:42 2022 -0700 Implement GPUarraySize setting. commit 8bf8455b6e6fba5c64d5316481e37595b485b7ad Author: John Bowman Date: Mon Feb 14 08:36:59 2022 -0700 Avoid negative indices. commit 89bcd66b00ddc1f7279a934fa6521fb12cedfd2d Author: John Bowman Date: Mon Feb 14 00:05:56 2022 -0700 Compute global partial sums on the CPU, including the number of fragments. commit 31001ddf5780071c70f679375b5fbf25ff269117 Author: John Bowman Date: Sun Feb 13 21:30:14 2022 -0700 Remove obsolete code. commit e53b4363cfb8dd6bf3df6207cafaf1e4562f3cda Author: John Bowman Date: Sun Feb 13 00:54:12 2022 -0700 Simplify code. commit 43ee1f02932d1569db65628202461d4e5977fd72 Author: John Bowman Date: Wed Feb 9 16:53:47 2022 -0700 Fix tensorshade fillrule. commit a76b469c94bd4f0d482abfb04b443590672e926e Author: John Bowman Date: Wed Feb 9 16:53:37 2022 -0700 Fix lastrevision. commit 0b595f83adfce03d016b10a0b976b7cd47deab28 Author: John Bowman Date: Wed Feb 9 15:41:37 2022 -0700 XASY: Change QRect to QRectF. commit 3b60274d30e38f06b5e0620598d85ed8ceccb592 Author: John Bowman Date: Sun Feb 6 21:57:32 2022 -0700 Implement GPUlocalSizeX setting. commit e4ff24b20656652c0f4a4f340df6eed6e8b13c9c Author: John Bowman Date: Sun Feb 6 16:10:46 2022 -0700 Restrict last revision to NVIDIA cards. commit 1251f044b4fd4683bca6fbd4de896eb2214ece19 Author: John Bowman Date: Sun Feb 6 15:35:01 2022 -0700 Optimize presum shader. commit fb32ab35ee6f7a61bbffc643df4ef74db39b4e16 Author: John Bowman Date: Sun Feb 6 13:42:54 2022 -0700 Document dvisvgmMultipleFiles=true; option for speeding up xasy deconstruction with PDF TeX engines. commit 166e785ae28fa8dd9943b5261e1d6a4c7e50f6ad Author: John Bowman Date: Sat Feb 5 23:23:17 2022 -0700 Implement real operator ecast(rational r) up to maxDenominator=100000. commit 8959d93ffd8abbf8d7d3ea7edd33f0d6d180c933 Author: John Bowman Date: Sat Feb 5 20:21:25 2022 -0700 Fix issue #301: broken links. commit aecbedad10cf705398dcb9ba2ce60b36b1c2e1dd Author: John Bowman Date: Sat Feb 5 15:42:09 2022 -0700 Remove unused uniform. commit 1922c3ba7daa62370a91b52f0b16cfda1c461efb Author: John Bowman Date: Sat Feb 5 00:23:09 2022 -0700 Increment version to 2.79. commit 83b0213063787b8cfdd68fe274b78b5867e5e9b6 Author: John Bowman Date: Fri Feb 4 23:50:57 2022 -0700 TRANSPARENCY: Implement GPUinterlock setting. commit e0e5788ee755527e658cee689939d960e913d0de Author: John Bowman Date: Fri Feb 4 20:21:17 2022 -0700 Add compiler flag. commit f18094773cc5f5afa0cde79598a5d719af9aca2d Author: John Bowman Date: Fri Feb 4 20:03:23 2022 -0700 Update Boehm GC URL. commit 62df5ed31a3b9e4dcd699290073e18bf9def94e6 Author: John Bowman Date: Fri Feb 4 19:43:33 2022 -0700 Fix warning message; clean up cached file. commit 7e1a64b0f7292429b88561ad187e788b67f4a297 Author: John Bowman Date: Fri Feb 4 12:38:04 2022 -0700 TRANSPARENCY: Fix offscreen rendering; update diagnostics. commit 512dd5c5685a170e6cb906b06843f753382577ca Author: John Bowman Date: Thu Feb 3 22:47:25 2022 -0700 TRANSPARENCY: Fix opaque pixels. commit a491e9a17a6c7ddfd92df7c07d0d249cb983912a Author: John Bowman Date: Thu Feb 3 21:41:47 2022 -0700 Improve formatting. commit f638f2a62477590d2cbe74d22c3b096699cc0a28 Author: John Bowman Date: Thu Feb 3 21:03:00 2022 -0700 TRANSPARENCY: Support GPUs lacking compute shaders or fragment shader interlocks again. commit 11d9e8e22fc8810ebe50910ccc5f79e1df673c07 Author: John Bowman Date: Thu Feb 3 10:45:47 2022 -0700 Remove unused buffer fom partialsum shader. commit 5c70913dac6d2aa98ebf017884209f23ae68033a Author: John Bowman Date: Wed Feb 2 23:59:50 2022 -0700 Eliminate postsum compute shader. commit 2e65c545aec5539256065148fd1ef5f635fd6291 Author: John Bowman Date: Tue Feb 1 23:38:59 2022 -0700 Don't require GL_ARB_fragment_shader_interlock extension. commit fb09f40a1cd3f0f133396e303f72975f6669b9d3 Author: John Bowman Date: Tue Feb 1 00:18:21 2022 -0700 Use fragment shader interlocks for rendering opaque fragments in scenes with transparent objects. commit 2a4e14970d5e7cd8276eb0cd5d1239dd1e26a3e4 Author: John Bowman Date: Sun Jan 30 14:46:33 2022 -0700 TRANSPARENCY: Fix bug #298. commit 2cbfb56dda426557c74008cf4bcdf39478395ed8 Author: John Bowman Date: Tue Jan 25 20:47:03 2022 -0700 TRANSPARENCY: Avoid negative indices. commit 7c986e8a9d144aa5f08934cf50b627c9c1ccad40 Author: John Bowman Date: Tue Jan 25 11:31:12 2022 -0700 TRANSPARENCY: Split up Fragment structure for better performance. commit e52e18ff2587258149829ebd544f6d4ef085a8e1 Author: John Bowman Date: Mon Jan 24 12:13:22 2022 -0700 Check for strnlen and provide a substitute if needed. commit 3914337b0ff8633b99a791213eb9f83abe026fb5 Author: John Bowman Date: Sun Jan 23 22:27:58 2022 -0700 Fix size of offsetBuffer. commit fffe9f0cabd78fa6fe1fefadc53c6975a6a4da66 Author: John Bowman Date: Sun Jan 23 20:18:05 2022 -0700 Optimize processor usage in transparent shaders. commit b3fe6ae082a0c03534b6eaab8403f5a134c6b606 Author: John Bowman Date: Sun Jan 23 12:16:15 2022 -0700 Use unsigned constants in GLSL shaders. commit 5c2c2321941ae82d962e345563422deb5790c326 Author: John Bowman Date: Sat Jan 22 20:39:59 2022 -0700 LSP: Search for local gc.h include. commit 355faf5717deac011cddd82be9110d43e83e462e Author: John Bowman Date: Sat Jan 22 20:09:26 2022 -0700 Remove style file that interferes with GitHub Pages. commit 8eb8c506dce3fcc3c2d90402f603db2f953232c6 Author: John Bowman Date: Sat Jan 22 20:01:46 2022 -0700 Fix last revision. commit c82c40474c66c8ebbb9ce054354b5285ba20e5bc Author: John Bowman Date: Sat Jan 22 19:04:39 2022 -0700 Support --disable-lsp again. commit b8cba1284afbb53d128d611af81d58bbd67f68cd Author: John Bowman Date: Sat Jan 22 18:47:07 2022 -0700 Delete unused directory. commit 88559ebc47f79dd544315186389b3c6ca46522dd Author: John Bowman Date: Sat Jan 22 18:44:00 2022 -0700 Delete unwanted .gitmodules files. commit be55d1df50653550103a53c48e5d49e98b2492bf Author: John Bowman Date: Sat Jan 22 18:34:40 2022 -0700 git subrepo commit (merge) LspCpp subrepo: subdir: "LspCpp" merged: "4727d5ea" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "75a82228" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit 025a6d7b3f478d7d09105af22c6c14903a22cc08 Author: John Bowman Date: Sat Jan 22 18:25:11 2022 -0700 git subrepo commit (merge) LspCpp subrepo: subdir: "LspCpp" merged: "8a263fd1" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "aaf668c7" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit c6aca9ad7722b791f6e30c22bc49185ee572e80e Author: John Bowman Date: Sat Jan 22 18:06:12 2022 -0700 git subrepo commit (merge) LspCpp subrepo: subdir: "LspCpp" merged: "6342b542" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "a9892cd5" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit dda687450b1c7014da1293a04fec49284653e9f1 Author: John Bowman Date: Sat Jan 22 17:16:35 2022 -0700 git subrepo commit (merge) LspCpp subrepo: subdir: "LspCpp" merged: "0aff03be" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "348c5d18" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit 36f776b9e2fc7e9ef7bb6159d228fb5d74fb8497 Author: John Bowman Date: Sat Jan 22 15:26:07 2022 -0700 Update GUI/requirements; remove obsolete Makefile. commit 6850a3de582647954e6243750892ca4e4036e9ff Author: John Bowman Date: Sat Jan 22 15:20:26 2022 -0700 git subrepo commit (merge) LspCpp subrepo: subdir: "LspCpp" merged: "8ec8c0db" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "4096915d" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit 5b2f0fbefb00486d3c26749e57c90e63f2f8f06b Author: John Bowman Date: Sat Jan 22 15:09:56 2022 -0700 Support latest version of LspCpp. commit 9cad0df02737b363d7df4cb610d8e20b0b1580a4 Author: John Bowman Date: Sat Jan 22 11:47:21 2022 -0700 git subrepo commit (merge) LspCpp subrepo: subdir: "LspCpp" merged: "cf90e047" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "4ad5c035" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit 553a1bb5d1edbeef311d792a5cf1c25df54b0b3a Author: John Bowman Date: Sat Jan 22 11:25:37 2022 -0700 Update asymptote.spec. commit 5375fc50eb608e50e5badba8ddcde761f114bdc0 Author: John Bowman Date: Fri Jan 21 22:17:40 2022 -0700 Increment version to 2.78. commit c98c63886b06ac0650c0b25304cb0bae9118a92a Author: John Bowman Date: Fri Jan 21 20:48:27 2022 -0700 Fix URL. commit edc40f1726014f5ea0ce464db4ae70457241cd46 Author: John Bowman Date: Fri Jan 21 16:56:39 2022 -0700 Remove unused code. commit 037e520058d53f5dd02c06b41c656cb65e255e92 Author: John Bowman Date: Fri Jan 21 16:50:46 2022 -0700 Fix buffer overflow in partialsum.glsl; improve workload distibution. commit 868ff0b61fb439d4ce6334aec4b4ea49a32ad9bf Author: John Bowman Date: Thu Jan 20 21:34:53 2022 -0700 Optimize postsum shader. commit 1c6eb60c92a8f25623d6b074f4ab3dcf84d0401d Author: John Bowman Date: Wed Jan 19 23:53:29 2022 -0700 Increment version to 2.77. commit ea218793876b65bbd50a842ede9fd003dcd90978 Author: John Bowman Date: Wed Jan 19 21:56:54 2022 -0700 Implement --disable-threads configure option. commit 9c2c06849def96507147c2cab66e1da9ecd36d1b Author: John Bowman Date: Wed Jan 19 15:11:35 2022 -0700 Update asymptote.spec. commit 96f9ffde0b7a6b3b8f8b2906cd62858bbca64594 Author: John Bowman Date: Wed Jan 19 15:10:10 2022 -0700 Port to OpenBSD. commit 81f988a7679b355edf2a7c3c2c6cf2f7d9ba88e1 Author: John Bowman Date: Wed Jan 19 13:59:59 2022 -0700 Support compilation with editline but not readline installed. commit 07f71cdfd7ecec7cd2a9bac10dc0a432f5ad6b16 Author: John Bowman Date: Wed Jan 19 11:31:11 2022 -0700 Update asygl. commit f5bc40b62a3ed7095aaaea03da43d86fba68d320 Author: John Bowman Date: Wed Jan 19 11:30:08 2022 -0700 Set asyProjection=false if AWA has cleared currentprojection. commit dc6284164c5518bc5e7914db21613d383b784472 Author: John Bowman Date: Wed Jan 19 08:27:37 2022 -0700 Support compilation without OpenGL again. commit 474a2fefda7f46706cb64348c7a96780773bed0d Author: John Bowman Date: Tue Jan 18 22:20:30 2022 -0700 Revert "Update asygl." This reverts commit 58dd3eb5cdbc07eeb28459fb0376e12de0fe8342. commit 58dd3eb5cdbc07eeb28459fb0376e12de0fe8342 Author: John Bowman Date: Tue Jan 18 21:28:36 2022 -0700 Update asygl. commit 602d2864b88f752de06f93ffb9401d201afb741b Author: John Bowman Date: Tue Jan 18 21:25:50 2022 -0700 WebGL: Make currentprojection persistent under AWA, resettable with the h key. commit 2154532907ab2feadaa85132bc36f3333f92e058 Author: John Bowman Date: Mon Jan 17 22:46:48 2022 -0700 Add example of 3D transparency; update credits. commit ea0197ffe7ede6065f49c617b5d4eed53d081b51 Author: John Bowman Date: Mon Jan 17 16:51:26 2022 -0700 Update asygl. commit 737b1474d818fee9a56a9d354d9cdbb72896e36a Author: John Bowman Date: Mon Jan 17 16:45:42 2022 -0700 Fix perspective WebGL zoom; update AWA interface; make home (h key) reset camera. commit 55cef74a3cbf723acb22e94d3fc94bf6d94e5c03 Author: John Bowman Date: Fri Jan 14 21:43:27 2022 -0700 Update asygl. commit d4384284d24de663df078bfdd12bb3cc92d1eb01 Author: John Bowman Date: Fri Jan 14 21:40:40 2022 -0700 Fix WebGL zoom and AWA interface. commit ececb384b5d090b4762669384ef8e23a9c62b47d Author: John Bowman Date: Fri Jan 14 20:59:19 2022 -0700 Update asygl. commit e9ed81a252727b62cdc356675afd1a3ccdfed19f Author: John Bowman Date: Fri Jan 14 20:46:02 2022 -0700 Fix WebGL and v3d bounds, along with orthographic viewportshift. commit 36b3ac4071f60e93eb01d48d87ac406674602363 Author: John Bowman Date: Thu Jan 13 21:44:17 2022 -0700 Port to MacOS X Mojave. commit 4b44415684c5691d5adba94090e65c32f28f6ead Author: John Bowman Date: Thu Jan 13 21:00:24 2022 -0700 Update asygl. commit 11791aeb58b1fef2eddd67137d74f17f6ff00f77 Author: John Bowman Date: Thu Jan 13 20:57:59 2022 -0700 Update AWA camera interface. commit a50bfa364e9615571fca8603887f289c74529c0f Author: John Bowman Date: Thu Jan 13 11:35:32 2022 -0700 Update asymptote.spec. commit ebfb8abf123d7bef8c811267df0e706b5dec6f77 Author: John Bowman Date: Mon Jan 10 22:49:43 2022 -0700 Update asygl. commit 9a3e2c57bacd2692310f74fac49c6fd84ba0f56b Author: John Bowman Date: Mon Jan 10 22:48:36 2022 -0700 Fix WebGL orthographic camera zoom. commit 58c7c1c73de228668058fca14402cc98dfb35232 Author: John Bowman Date: Sun Jan 9 23:55:30 2022 -0700 Update asygl. commit e50bd57eec565f5844e883284ff9dbb9352a0e35 Author: John Bowman Date: Sun Jan 9 23:54:44 2022 -0700 Fix WebGL perspective camera zoom. commit 67af72f3c39072b761d9ff4a2b6a8c79d964cd69 Author: John Bowman Date: Sun Jan 9 16:07:27 2022 -0700 Improve WebGL camera dialogue. commit 8a3ce22eb86a100bcf595eaecca028737dba953a Author: John Bowman Date: Sun Jan 9 12:55:00 2022 -0700 Update asygl. commit 6c78b3774919d8d4cb67ca7ec90fee97334b852a Author: John Bowman Date: Sun Jan 9 12:53:02 2022 -0700 Fix WebGL camera zoom. commit 8aacd2ca1de83c434f642ea94700ffd6753f0a92 Author: John Bowman Date: Sun Jan 9 09:02:05 2022 -0700 Set defaultfilename on reading V3D files from command line. commit 9c33d0c30ce70909819e4347fdb8887f4bf956b7 Author: John Bowman Date: Sun Jan 9 09:01:48 2022 -0700 Update URL. commit 4c5698f614a27809203a2227a0365babf37cd732 Author: John Bowman Date: Sat Jan 8 23:29:34 2022 -0700 Support compilation again without glm-devel library (not recommended, as this will disable both WebGL and V3D support). commit 48f313effd296591c3c44155736ba98f03a68535 Author: John Bowman Date: Sat Jan 8 11:03:55 2022 -0700 Work around undefined PATH_MAX on hurd-i386. commit 11446596bd9dfa23e4520dcf44459f9978097581 Author: John Bowman Date: Sat Jan 8 00:00:06 2022 -0700 Fix v3d currentprojections. commit f94c059c64c75728aeb91baff8c56dac8a119aa9 Author: John Bowman Date: Fri Jan 7 22:04:22 2022 -0700 Update asygl. commit b5796a262ddcab47a4e407cf23b6e00585dbb57d Author: John Bowman Date: Fri Jan 7 21:59:06 2022 -0700 Support 'c' (show camera) WebGL keyboard binding for orthographic projections and offscreen rendering. commit c451c4ade38baeae87a2e2019c489350002f95f5 Author: John Bowman Date: Fri Jan 7 21:41:34 2022 -0700 Update asygl. commit e36c308d119354b43f0cadae2d53bd5fc4a5110d Author: John Bowman Date: Fri Jan 7 21:34:15 2022 -0700 Add 'c' (show camera) keyboard binding to WebGL scenes. commit 59487ff216cf2c425a1e0b356b9f8d09c492f2e2 Author: John Bowman Date: Fri Jan 7 09:01:01 2022 -0700 Update copyright years. commit 4f18f4fcb254a47f76ff832614154051960095fe Author: John Bowman Date: Fri Jan 7 08:15:02 2022 -0700 Fix typo #294. commit c4cd63b759f38a0c9d699713af8e7947dabe7ea0 Author: John Bowman Date: Thu Jan 6 22:37:36 2022 -0700 Update asymptote.spec. commit bfc97490c7c17118bbe106adac7f4de63420c1dc Author: John Bowman Date: Thu Jan 6 22:06:42 2022 -0700 Update dvipdf. commit 41cf587359166f67b481e1fc87bfe6de24fe98ee Author: John Bowman Date: Thu Jan 6 17:07:28 2022 -0700 Increment version to 2.76. commit 587b26dca79cad5a31100a30bee9cc4a9dcd93e8 Author: John Bowman Date: Thu Jan 6 14:15:06 2022 -0700 Use png16m driver by default (override with -pngdriver) and force pdflatex mode to work around issues with pngalpha driver. commit eab735a13a12be5e9b1af44c1764b8e6d8721795 Author: John Bowman Date: Thu Jan 6 13:12:58 2022 -0700 Implement better fix to bug #241. This reverts commit f10c7fd9f54e5e84a7b5287579dbb29ce45aabd3. commit 2defc18699b61f9247d3042f6a504e0ae6871596 Author: John Bowman Date: Thu Jan 6 12:55:08 2022 -0700 Revert "Fix commit 1ce26e54a3fb7e35389b3e9ecf7399cd1c535b66." This reverts commit 166efc83f399a795d2fa221477034e63e8ebb235. commit af52c7800ecef8fda895f604fd9c42d9fbb3ae18 Merge: d7f097c15 123a7300e Author: John Bowman Date: Thu Jan 6 11:08:00 2022 -0700 Merge pull request #293 from tifv/patch-1 Fix documentation typo in geometry.asy commit 123a7300e7c8c36c7e0718f4c8ef50b404e8e2bb Author: July Tikhonov Date: Thu Jan 6 20:13:48 2022 +0300 Fix documentation typo in geometry.asy commit d7f097c15e6431bd42dc9670215e6916be31f8f1 Author: John Bowman Date: Wed Jan 5 23:50:34 2022 -0700 Disable primitives for colored surfaces. commit 74a26c9d627a1b9632fb033e086ed5e76e88b79e Author: John Bowman Date: Wed Jan 5 23:49:43 2022 -0700 Add missing currentlight. commit 509b3e8952a44b043ff58e5355113dee6efbe05a Author: John Bowman Date: Wed Jan 5 23:44:57 2022 -0700 V3D: Fix explicitNI and explicitCI flags. commit c802fe27c172c323280607b6b600ed616711d06f Author: John Bowman Date: Wed Jan 5 23:43:18 2022 -0700 Support specifying v3d files on the Asymptote command line. commit b30b6a88d8c1cd93838bc4c15c0611ab595ebccb Author: John Bowman Date: Wed Jan 5 23:42:36 2022 -0700 Disable png transparency until ghostscript pngalpha supports it again. commit 166efc83f399a795d2fa221477034e63e8ebb235 Author: John Bowman Date: Wed Jan 5 23:42:06 2022 -0700 Fix commit 1ce26e54a3fb7e35389b3e9ecf7399cd1c535b66. commit f2cce72ee4ca799512904137ddf79ba5a585b261 Author: John Bowman Date: Wed Jan 5 14:51:08 2022 -0700 Revert "Merge pull request #157 from ivankokan: Inversion fixes and improvements." This reverts commit 7f8a9987174d1136826541389148caa7a074e242. commit 7f8a9987174d1136826541389148caa7a074e242 Author: John Bowman Date: Wed Jan 5 14:36:49 2022 -0700 Merge pull request #157 from ivankokan: Inversion fixes and improvements. commit c808070eeb7bc1737b1e314c698e92d6c2889145 Merge: 1ce26e54a 9c770c628 Author: John Bowman Date: Wed Jan 5 13:46:17 2022 -0700 Merge pull request #291 from cagprado/improve_vim_syntax Improve vim syntax. commit 1ce26e54a3fb7e35389b3e9ecf7399cd1c535b66 Author: John Bowman Date: Wed Jan 5 13:17:10 2022 -0700 Fix transparency issue in commit f10c7fd9f54e5e84a7b5287579dbb29ce45aabd3. commit 9c770c628c3d8138e1038d172fe3736a59d66a30 Author: Caio Prado Date: Wed Jan 5 17:04:16 2022 +0800 Limit column width of source file commit 571b6aaf5607360f309ea66def8743be8eb6687c Author: Caio Prado Date: Wed Jan 5 16:36:04 2022 +0800 Review delimiter matching rules Unmatched ), ], and } will highlight themselves as errors. Unmatched (, and [ causes highlighted errors later on the next ;, which should be close enough to the source of the error. Unmatched { nested within other delimiters will end up highlighting the extra ) or ]. However, top level unmatched { will not be marked. commit 3cc5ae13cd9325daa14eeccfbfc9e02de215c9fb Author: Caio Prado Date: Wed Jan 5 16:34:04 2022 +0800 Simplify comments highlighting - We don't need asyCommentGroup since it contains only one member - asyCommentStart's only purpose is to avoide further matching on the delimiters, we don't need it as we can use asyComment for that. - asyComment*String don't start with L commit 0b03cdab123063b00955f80713df745be660100d Author: Caio Prado Date: Wed Jan 5 10:35:07 2022 +0800 Review asyNumber highlight Asymptote is simpler than C/C++, we should be able to use a single regexp. However, implicit multiplication may lead to some problems: Constants like 0.1.1 are considered as 0.1 * .1 and compile with a warning about implicit scaling. Since this is potentially dangerous, we add a highlight error when this happens. commit 6b0f27155ae97326483029140c61021bc451856c Author: Caio Prado Date: Wed Jan 5 10:33:55 2022 +0800 Make two flavors of comment strings Since asymptote allows for "string" and 'string', make both of them also allowed inside comments. commit 57ca7624641fa0691bda95a90c1df19d0969310c Author: Caio Prado Date: Wed Jan 5 10:30:25 2022 +0800 Fix regexp of special characters for asyString asyString (double quoted string) will only highlight line breaks and the special \". This fix matching \" without requiring a character before it. commit 456d1815b3d43a6ad80dcdaf945ea3e56d18a8f9 Author: Caio Prado Date: Tue Jan 4 17:22:57 2022 +0800 Cleanup unused highlights (inherited from C syntax file) commit 3e5f7c063bb19fb272b59ce285bcb52d1da3d0b2 Author: Caio Prado Date: Tue Jan 4 16:49:27 2022 +0800 Reorder file sections Order from simple to complex: - keywords - string constants - number constants - comments and comment strings - delimiter errors commit 9ee06a701ba8dc87df56b5bcb859b4dbde0beeff Author: Caio Prado Date: Tue Jan 4 16:38:11 2022 +0800 Rename a few variables Try to be consistent with some naming: asyString for normal strings asyCString for strings that maps C-like escapes (single quoted) asyComment2Strings renamed to asyCommentLStrings following asyCommentL commit d5f765315b44970835874f7305822e1d0afad4bf Author: Caio Prado Date: Tue Jan 4 16:31:25 2022 +0800 Add more keywords for plain, three and color modules commit db3e1c343d8a5dfd69021968e443693982e24097 Author: John Bowman Date: Mon Jan 3 17:33:44 2022 -0700 Enable billboard labels, even when compiled with LIBOSMESA, to support WebGL. Remove subdivision crack work around for obsolete PRC format. commit 827f4188c785a80199c9499122b04256667880bb Author: John Bowman Date: Sun Jan 2 11:15:20 2022 -0700 Support compilation again without tirpc library (not recommended, as this will disable both XDR and V3D support). commit 6e6bf4a083c94d475fa2111967d260c8b623ea2d Author: John Bowman Date: Sun Jan 2 09:15:31 2022 +1100 Increment version to 2.75. commit b2ae0111b8184e26ca0ff990d9d55a13753e6a1b Author: John Bowman Date: Sun Jan 2 07:44:55 2022 +1100 Add linecap and linejoin enums to source code for clarity. commit 1589f4e8733bcd2f3696d6471ebe7bdd08e9f16c Author: John Bowman Date: Sat Jan 1 13:08:01 2022 -0700 Fix lsp crash on save. commit 9fe2167d3fa875d2ac08f60850bab183a25cf58b Author: John Bowman Date: Sat Jan 1 10:41:29 2022 -0700 Update examples. commit 7b76b04637598965f166e77f3948aaa9ae80c803 Author: John Bowman Date: Sat Jan 1 17:28:24 2022 +1100 Fix bug #231. commit 6e359f24dff133f66478179bd2b51ca400cf7937 Author: John Bowman Date: Fri Dec 31 15:24:13 2021 -0700 Fix bug #263. commit 2ee4ca9267d5c2b7415080bd7b074f76e99cc70a Author: Caio Prado Date: Fri Dec 31 16:30:04 2021 +0800 Remove trailing spaces highlighting There are several plugins and alternatives to highlight trailing spaces commit d29fbefaab57f095f41f6851dc5ffe4ce5b4bbcb Author: John Bowman Date: Thu Dec 30 15:27:12 2021 -0700 Fix issue #287. commit e13e777a81379c846a83f3daa7ba5c117b1af797 Author: John Bowman Date: Wed Dec 29 22:58:45 2021 -0700 Workaround issue #206 by abandoning color.sty package for all TeX engines, in favour of low-level specials. commit f10c7fd9f54e5e84a7b5287579dbb29ce45aabd3 Author: John Bowman Date: Wed Dec 29 17:55:09 2021 -0700 Fix bug #241. commit c5edc7fba45c5a1c9cc46aee1c3078b84e1096c7 Author: John Bowman Date: Wed Dec 29 17:36:35 2021 -0700 Use byteinv in writefromRGB. commit 445ba2486c29b69724ad24dba4699631f39903dd Author: John Bowman Date: Wed Dec 29 14:22:23 2021 -0700 Fix bug #286 by implementing better fix to bug #68. commit 10abb84a02abb2aad19704b56a797b46ac41f96d Author: John Bowman Date: Wed Dec 29 10:20:51 2021 -0700 Update links to gallery. commit fd26b0d813c06c92cdab5b2573d33bc4530f722a Author: Caio Prado Date: Wed Dec 29 15:40:45 2021 +0800 Add Dotted to list of constants commit 2c90bff859f9948d20065ae7fd7b048f57e93e89 Author: Caio Prado Date: Wed Dec 29 15:33:16 2021 +0800 Realign code commit 176572fc125d726f2ec9f61ff4a059a5dd9d01d7 Author: Caio Prado Date: Wed Dec 29 15:32:07 2021 +0800 Fix string highlighting Asymptote has two flavors of strings, single and double quoted, each with different escape mapping. commit b02a07991a9c01eba86775fd4680f667dffd4b79 Author: Caio Prado Date: Wed Dec 29 11:02:13 2021 +0800 Add a few missing keywords commit 435700d9ae05e4ec36ab5423401c2d0ea04448ec Author: Caio Prado Date: Wed Dec 29 10:14:38 2021 +0800 Remove tabs and realign the source commit 3154b07e46fc0eb637acf65f17d4d08a991580a2 Author: John Bowman Date: Tue Dec 28 15:26:08 2021 -0700 Disable erase for svg and html output. commit 19d0bce77ac7772d341577ccb26519708caff7e1 Author: John Bowman Date: Mon Dec 27 23:16:05 2021 -0700 Disable order-independent transparency if SSBO support is unavailable. commit f5f62621c96f76f684dcda7ce8949a5285fa5bec Author: John Bowman Date: Mon Dec 27 21:00:48 2021 -0700 Fix issue #285. commit 190ccf2773a599625c45ec3fc3a4fd709d63a555 Author: John Bowman Date: Mon Dec 27 18:23:47 2021 -0700 Increment version to 2.74. commit f28852ba9da596dd61f3755e67bc2a52d76c1fef Author: John Bowman Date: Mon Dec 27 17:40:27 2021 -0700 Update asygl. commit 9217e347a01f1a8f2b095a1aac1d319e12a21306 Author: John Bowman Date: Mon Dec 27 17:37:28 2021 -0700 Look for an existing webgl context if webgl2 is unavailable. commit 72154e5aadd39f9c58586bd0fdc0ac51d68373b7 Author: John Bowman Date: Mon Dec 27 16:43:08 2021 -0700 Update asygl. commit e6359241240166ee8ec48d022ee858313892dfac Author: John Bowman Date: Mon Dec 27 16:40:35 2021 -0700 Support embedding of webgl and webgl2 scenes on the same page. commit 0539672ff6043da10a0afce946be9f1bc1809e65 Author: John Bowman Date: Mon Dec 27 15:20:03 2021 -0700 Revert "Revert webgl2 default in asygl library." This reverts commit 045d59d63b429d28bd133c1a550a36fa1726be60. commit 3f78b81efd7129f0617eff4fcf60d6ab8f670ded Author: John Bowman Date: Mon Dec 27 14:39:24 2021 -0700 Update asygl. commit 045d59d63b429d28bd133c1a550a36fa1726be60 Author: John Bowman Date: Mon Dec 27 14:37:06 2021 -0700 Revert webgl2 default in asygl library. commit 4d04f9d75313e24d8987806b6ecae6f2c3660ac5 Author: John Bowman Date: Mon Dec 27 13:12:53 2021 -0700 Increment version to 2.73. commit d1641723495c25a4cf84da33a477078903c2ef4c Author: John Bowman Date: Mon Dec 27 12:42:11 2021 -0700 Fix MSDOS build script. commit 4700d4983ff030293279af1a87edaa76aaf24169 Author: John Bowman Date: Mon Dec 27 12:20:27 2021 -0700 Fix offscreen rendering. commit 292c58c4a3522a176dc173a41785e6b1027dbb05 Author: John Bowman Date: Mon Dec 27 12:19:21 2021 -0700 Standardize function name. commit f41d05416a79d7ed1d94b4e8e91d814107fe5821 Author: John Bowman Date: Mon Dec 27 12:10:50 2021 -0700 Support compilation without OpenGL again. commit 6fbfb9af1200e3c11d8a1addc31208b13e7e7d2d Author: John Bowman Date: Mon Dec 27 09:18:23 2021 -0700 Fix last revision. commit 02a7e2ef41b6a07387bcd0a2240db7ada758334f Author: John Bowman Date: Mon Dec 27 08:20:37 2021 -0700 Port to clang. commit 61dc2f16e833f8ce42a982ba41650521bcfc0997 Author: John Bowman Date: Mon Dec 27 00:31:54 2021 -0700 Revert "Revert "Disable link-time optimization when rpmbuild compiles Boehm GC."" This reverts commit 5784093ef9a119ec07baf652247c1ddc5864b598. commit 95bb2394d155aa6387a62ec88cf9f32f0e42aedd Author: John Bowman Date: Mon Dec 27 00:28:36 2021 -0700 Update asymptote.spec. commit 5784093ef9a119ec07baf652247c1ddc5864b598 Author: John Bowman Date: Mon Dec 27 00:27:52 2021 -0700 Revert "Disable link-time optimization when rpmbuild compiles Boehm GC." This reverts commit e5f413d9b889175e328ece23d0f17b7a7459deb8. commit 15c101fbb22d40899442779ea5dd9e1d40dc66f1 Author: John Bowman Date: Mon Dec 27 00:23:27 2021 -0700 Update MSDOS build script. commit d670d1fc6684ab72898a9fa290587bdc560745d5 Author: John Bowman Date: Sun Dec 26 23:25:13 2021 -0700 Update asymptote.spec. commit 3aae0c65b207b91f0e3d2b5ed6822a1fa965dea2 Author: John Bowman Date: Sun Dec 26 22:32:34 2021 -0700 Fix multiple output formats in threaded interactive mode; simplify code. commit 4af116e9191211a45adbe69f9ea998a95a4c11e3 Author: John Bowman Date: Sun Dec 26 14:52:16 2021 -0700 Simplify webgl output. commit 187b2bb4bc29b294da4ab30f1eae3be72a7d9730 Author: John Bowman Date: Sun Dec 26 14:50:38 2021 -0700 Restore example. commit d887164de252ab1afb64b07181143b2700235dfd Author: John Bowman Date: Sun Dec 26 14:46:58 2021 -0700 Update asygl. commit 829efda683a36c22b5057336c2523584e2995670 Author: John Bowman Date: Sun Dec 26 14:44:59 2021 -0700 Enable webgl2 by default only for image-based lighting. commit 65408d84d6269f29d9c5d5fb56ebc2d5dc52c3c4 Author: John Bowman Date: Sun Dec 26 13:07:47 2021 -0700 Remove invisible files from CTAN archive. commit 69b4e78c4f94c710dcc45d56aaba0d34896ca54a Author: John Bowman Date: Sun Dec 26 11:56:43 2021 -0700 Fix issue #284: revert to CPU indexing if compute shader compilation fails. commit 23716cdcd6c925662351a74368ddbc1c906793ec Author: John Bowman Date: Sat Dec 25 18:31:50 2021 -0700 Set ibl=false when webgl2=false in HTML file. commit 5d28a10561b2c7a70367fed2df1180ab42d93f10 Author: John Bowman Date: Sat Dec 25 18:21:13 2021 -0700 Add missing newline. commit a2a608868151ac6c1bfa3d957f1db56af4c66cfd Author: John Bowman Date: Sat Dec 25 18:17:05 2021 -0700 Update asygl. commit 8712b3c391f55fd69710f7402470ba20090cbb4b Author: John Bowman Date: Sat Dec 25 18:12:05 2021 -0700 Implement setting for disabling webgl2 in resource-intensive examples. commit c7fa16084909b857d15aca90b137737c629a48db Author: John Bowman Date: Sat Dec 25 09:27:58 2021 -0700 Remove unwanted files. Fix warning. Update README. commit bc331c961715af38f7d1d058273df1c90aa2a4b2 Author: John Bowman Date: Sat Dec 25 01:31:25 2021 -0700 Increment version to 2.72. commit b320257106f4e71db722bb86f9f6f6512ec4251d Author: John Bowman Date: Sat Dec 25 00:47:02 2021 -0700 Revert last commit. commit 21ac0d5289f25ebca72878f01cf334dc8cef492b Author: John Bowman Date: Sat Dec 25 00:34:16 2021 -0700 Update latexusage example. commit 10ffc44e992354ec0fa8fb0b0eb2b8f4f3db0c55 Author: John Bowman Date: Sat Dec 25 00:31:30 2021 -0700 Update example. commit a97127a82c4fb2410f8676ba674d1d665c0cf000 Author: John Bowman Date: Sat Dec 25 00:16:39 2021 -0700 Fix MSDOS Xasy installation. commit 71d25abd29c3108d323acd625d56a320a2fb9e14 Author: John Bowman Date: Fri Dec 24 23:37:58 2021 -0700 Update documentation. commit 55b405472c0cb603829b2216d1901ae3df5bde8a Author: John Bowman Date: Fri Dec 24 23:32:48 2021 -0700 Update diagnostic. commit e1943baa46f882e1556b576b6d793a20525cc41f Author: John Bowman Date: Fri Dec 24 23:14:41 2021 -0700 Reformat. commit cd318ded572ee29051d2b8cd24f69911f44bd58c Author: John Bowman Date: Fri Dec 24 23:13:00 2021 -0700 Port to MSDOS. commit 5263140b82b5306f4485ed822142893fdd878d0e Author: John Bowman Date: Fri Dec 24 22:43:14 2021 -0700 V3D: Add initial material list. commit 59321f61e940937155f0c89d9203d3038e99e2f4 Author: John Bowman Date: Fri Dec 24 21:41:44 2021 -0700 Remove obsolete reference to ocg.sty. commit d21af153506234b038fe944a2de2312b479b8fa0 Author: John Bowman Date: Fri Dec 24 19:56:55 2021 -0700 Update to Boehm gc-8.2.0. commit e5f413d9b889175e328ece23d0f17b7a7459deb8 Author: John Bowman Date: Fri Dec 24 19:02:06 2021 -0700 Disable link-time optimization when rpmbuild compiles Boehm GC. commit e2f5c5d6794fa401f07d3448a7727a260c8a4a03 Author: John Bowman Date: Fri Dec 24 11:46:38 2021 -0700 Fix Makefile.in. commit a19237cf81f905a19a2d10abc912824b7a72afec Author: John Bowman Date: Thu Dec 23 21:59:53 2021 -0700 Document support for the Language Server Protocol. commit 769dd2e257f5161d64f7d4b83a3ecc667fc07836 Author: John Bowman Date: Thu Dec 23 20:46:18 2021 -0700 Disable Language Server Protocol under MSDOS until boost 1.69.0 or later is available for CYGWIN. commit 6b58bf411ee8d4f36989b389cb247a4d6f18aa28 Author: John Bowman Date: Thu Dec 23 20:44:17 2021 -0700 Port to MSDOS. commit 58e42f9ccbf4dc89594f1cc7a649bba811f929df Author: John Bowman Date: Thu Dec 23 05:50:51 2021 -0700 Downgrade to Boehm GC 8.0.4. commit 17ed662797381269f0794da09a86a929f68e797a Author: John Bowman Date: Thu Dec 23 05:36:12 2021 -0700 Work around missing __log_finite function. commit 701f6679a0ed012ee9414ae7be056cee921198e1 Author: John Bowman Date: Thu Dec 23 05:35:22 2021 -0700 git subrepo pull (merge) LspCpp subrepo: subdir: "LspCpp" merged: "b1c5308e" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "9d772e36" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit c1c34559a17c49a15c0f9eb7908b8e322b09962e Author: John Bowman Date: Thu Dec 23 04:44:34 2021 -0700 Downgrade to Boehm GC 8.0.6. commit ac47d91ec2bef01cfa58beb861eb4b6bcc58c4b1 Author: John Bowman Date: Thu Dec 23 00:01:41 2021 -0700 Document command-line interface to http://asymptote.ualberta.ca. commit 863347f183c82f4b64c1e67c34207227c828d179 Author: John Bowman Date: Wed Dec 22 14:02:00 2021 -0700 Document V3D output format specification; fix Makefile dependencies. commit 1210cc36ca7a6d018887e59cc56478a309856804 Author: John Bowman Date: Wed Dec 22 12:50:10 2021 -0700 Support compilation again without XDR. commit c46a45481f3db464115cb091f6c696ccc674ae7c Author: John Bowman Date: Tue Dec 21 11:08:43 2021 -0700 Port to MSDOS. commit 0151a7887fd90a977ca2e8f6c8f1e072d7d6f408 Author: John Bowman Date: Tue Dec 21 00:07:39 2021 -0700 Update configure.ac. commit dfb0dad25d6846802e47b49026de547d558ecc96 Author: John Bowman Date: Mon Dec 20 23:29:56 2021 -0700 Fix typo. commit 20b3bd3020f6547478eea70f307fb3f8c13d5034 Author: John Bowman Date: Mon Dec 20 22:44:10 2021 -0700 Fix Makefile dependency on Boehm GC includes. commit a031db668c7b382979b032fba087a79c493264b4 Author: John Bowman Date: Mon Dec 20 20:34:25 2021 -0700 Fix Makefile dependency. commit d2bdbbda821a807f8ef9622b52263a50a832470d Author: John Bowman Date: Mon Dec 20 18:48:40 2021 -0700 Update to Boehm gc-8.2.0. commit 734cc1b4cd8a464b9780bdf48ca01754eb5d99e7 Author: John Bowman Date: Mon Dec 20 15:11:42 2021 -0700 Replace RETSIGTYPE with void. commit 032127e7c97232468b3bb92e95aad1ae80e99fc5 Author: John Bowman Date: Mon Dec 20 14:59:01 2021 -0700 Update configure.ac. commit 0ab436e4ed8dd9e7cda392bf88216aba551b2525 Author: John Bowman Date: Mon Dec 20 14:30:10 2021 -0700 Fix virtual function signature. commit 2542600b2fb805a7c1ed79604bbccee762ac6709 Author: John Bowman Date: Mon Dec 20 13:50:22 2021 -0700 Fix clang++ warnings. commit acb1f93544b977131caa684205e1492990d1d87e Author: John Bowman Date: Mon Dec 20 13:20:19 2021 -0700 git subrepo pull (merge) LspCpp subrepo: subdir: "LspCpp" merged: "fc6491ae" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "c3ee4473" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit 353c1124aacece2e29240fe7b9b223a2eb5da8e6 Author: John Bowman Date: Mon Dec 20 12:48:59 2021 -0700 git subrepo pull (merge) LspCpp subrepo: subdir: "LspCpp" merged: "bae08636" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "89de4a84" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit 7ec627d96e114196c5abe3f1b73adfafb98048c5 Author: John Bowman Date: Mon Dec 20 12:47:43 2021 -0700 Remove -Llib from OPTS. commit 48eb765869f1a1fb63a6873cdf592137995ff4f3 Author: John Bowman Date: Mon Dec 20 10:29:58 2021 -0700 Port to MacOS X. commit 804c3527ef71140b0de45ef62582d1d7b2a4f742 Author: John Bowman Date: Mon Dec 20 09:14:44 2021 -0700 Enable offscreen viewing. commit 8223db3db7e15670f627f2fe07f19b9419f940ba Author: John Bowman Date: Sun Dec 19 22:11:58 2021 -0700 Revert "Fix hang on display." This reverts commit 9aee221cb61a00c2ef275c4eb0415e7b913b234e. commit 16ba97539f36338fa065c0679631185021be42f1 Author: John Bowman Date: Sun Dec 19 17:54:09 2021 -0700 Fix last revision. commit e4d18621486bc4d5452cfdd3558844fa894eadd7 Author: John Bowman Date: Sun Dec 19 15:04:25 2021 -0700 Fix boost header file dependencies. commit 588d4d204cb0874c1e4a4229c5b8108e9785e049 Author: John Bowman Date: Sun Dec 19 12:04:02 2021 -0700 Undo commit 3f58c24ceb5ef71066fbd6a5b9746bc9638558bd. commit 70e1cfcdb33779813fe4ebd76aabcb14b082b1f4 Author: John Bowman Date: Sun Dec 19 13:57:02 2021 -0700 Remove boost header file dependencies. commit 96e143cd4af5541dac04a4f1220f6aa613af413c Author: John Bowman Date: Sun Dec 19 09:51:18 2021 -0700 Fix git submodule status errors due to empty git subrepo directories. commit ebbdaa960a8824c209d30b0059516469df563a10 Author: John Bowman Date: Sun Dec 19 09:34:10 2021 -0700 Revert "Disable jekyll on GitHub Pages." This reverts commit 044d7837773f2845b1f8257927040d5df986d81d. commit 56fad9d2ad0d0bf6ee626f1952ef5744ab43a6bd Author: John Bowman Date: Sat Dec 18 22:29:55 2021 -0700 Disable orthographic adjustment in commit ab6c72c152ec8ad0e052706ac16023bf044ab550 for PRC output. commit 1a9bd32158e27bb11c134b8dc2521ccb5500872c Author: John Bowman Date: Sat Dec 18 21:16:15 2021 -0700 V3D: Apply lossy setting also to headers; fix xstream xbyte reads. commit d81d2287f3438ef936de2ca72632ac8540cf908b Author: John Bowman Date: Sat Dec 18 20:40:38 2021 -0700 Fix render parameters. Add PRC compression=Single value to approximate single precision, for benchmarking against V3D with settings.lossy. commit 0057b91fd6e47da2f09c8e00cd56c3621b6b510f Author: John Bowman Date: Sat Dec 18 12:33:07 2021 -0700 Simplify code. commit 044d7837773f2845b1f8257927040d5df986d81d Author: John Bowman Date: Sat Dec 18 08:56:42 2021 -0700 Disable jekyll on GitHub Pages. commit d385f531c03e6b2548d4f38bf3b0b07d94e3066d Author: John Bowman Date: Sat Dec 18 08:47:10 2021 -0700 Remove unused binary image. commit a410a2940d93b2ef8ff97458e1bf506e6f5a5fdb Author: John Bowman Date: Sat Dec 18 08:01:14 2021 -0700 Add minimal index.html for GitHub Pages. commit 21519f9d97d15cdc83f27bd869a294b2bc302ca0 Author: John Bowman Date: Sat Dec 18 07:47:20 2021 -0700 Set theme jekyll-theme-cayman commit fd20ee1eb8fbf69e2d7bddfb98728b3d487abda0 Author: John Bowman Date: Sat Dec 18 00:08:57 2021 -0700 PRC: Fix last commit. commit 6f4f179e121eb7002f75cd8ad9fa49244fb9b1ae Author: John Bowman Date: Fri Dec 17 22:39:48 2021 -0700 PRC: Suppress viewing of prc output. commit aee35e71a1ea3cf086dc1fcf104e973f9d4071f0 Author: John Bowman Date: Thu Dec 16 00:07:18 2021 -0700 V3D: Use global explicitNI and explictCI flags for better triangle group compression. commit b2811f9072e39e1172b86a58079bb187f24dd53e Author: John Bowman Date: Wed Dec 15 15:00:32 2021 -0700 V3D: Remove unused parameter. commit 6d686ea349ca7b3a08b4972c88b7c1d2472838b3 Author: John Bowman Date: Tue Dec 14 17:43:29 2021 -0700 V3D: Add on v3d extension if needed. commit e68834bb93296e670eafc3bb084a1831e6cfaaff Author: John Bowman Date: Tue Dec 14 13:47:48 2021 -0700 Check for existence of v3d input file. commit ef941786820e1d10cb06c29dcc4d311550a1057c Author: John Bowman Date: Tue Dec 14 11:44:30 2021 -0700 Fix rendering of triangle groups. commit d3a6d07ed3d63a1bcc9d799ff1d378c6b850e3aa Author: John Bowman Date: Mon Dec 13 22:55:32 2021 -0700 V3D: Fix LightHeader size. commit 10fbb46a8b1f889bab093578439c2af5d380c69e Author: John Bowman Date: Mon Dec 13 17:54:31 2021 -0700 Fix issue #280. commit 7eb3221ee32816207d8f99af26eaf9c2c2fc5654 Author: John Bowman Date: Mon Dec 13 17:51:50 2021 -0700 Fix commit b979946b3e9c7bef55f53421a711c823c5585a8e. commit 297dcd00a1333349bd5e8fe7a49341fe757ab721 Author: John Bowman Date: Mon Dec 13 11:36:04 2021 -0700 git subrepo pull (merge) LspCpp subrepo: subdir: "LspCpp" merged: "0ecc0ecd" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "200001e9" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit 0c78f5d505c86e0483fa86564c95cdccd1936142 Author: John Bowman Date: Mon Dec 13 00:20:42 2021 -0700 Fix last revision. commit fbea3a770be6e95fdcc5040724bbd26b731740b3 Author: John Bowman Date: Mon Dec 13 00:15:30 2021 -0700 Fix compilation for configure --disable-lsp. commit b60ef92ffde1edd6b0a8a589c1a937317dc3a3c2 Merge: 117f64ba0 bc2399563 Author: John Bowman Date: Sun Dec 12 23:30:34 2021 -0700 Merge branch 'lsp'. commit bc2399563cc1325e92cb35eab1ac19c0cd7b593e Author: John Bowman Date: Sun Dec 12 23:22:05 2021 -0700 LSP: Check for boost library and adjust C++ version if needed. commit 725532eada03a5eba8f0364ae32761c6637b6a27 Author: John Bowman Date: Sun Dec 12 20:56:11 2021 -0700 git subrepo clone (merge) git@github.com:vectorgraphics/LspCpp subrepo: subdir: "LspCpp" merged: "47760384" upstream: origin: "git@github.com:vectorgraphics/LspCpp" branch: "master" commit: "47760384" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit 117f64ba06c983e67daacce64391d0521ad9a3ff Author: John Bowman Date: Sun Dec 12 11:18:46 2021 -0700 V3D: Add placeholder 2D types. commit 95c04ac3dea4fd20a7a13a33f767062950796d1e Author: John Bowman Date: Sat Dec 11 22:08:02 2021 -0700 Remove blank comments from v3dheadertypes.csv. commit b979946b3e9c7bef55f53421a711c823c5585a8e Author: John Bowman Date: Sat Dec 11 21:37:18 2021 -0700 Move byteinv to C++ code. commit 82d1eacc0115a3b44a8d2e51e6885228a226b810 Author: John Bowman Date: Sat Dec 11 21:25:24 2021 -0700 Improve make_unique support. commit b0617bb6a1c830498aaaebb37cbbb13fd6b5704a Author: John Bowman Date: Sat Dec 11 18:02:31 2021 -0700 LSP: Port to C++14. commit 6f238b01ae31f81b7a20730b1413077e0837e08c Merge: 895c90e88 5f2f5ba55 Author: John Bowman Date: Sat Dec 11 12:18:57 2021 -0700 Merge branch 'master' into lsp. commit 5f2f5ba5515b6585e49f1c3983be15f71f59411c Author: John Bowman Date: Sat Dec 11 11:47:55 2021 -0700 Port to C++-11. commit f73647c9b9bac0fbdc2a63915968a68b28fa8792 Author: John Bowman Date: Fri Dec 10 23:14:10 2021 -0700 Update documentation and example. commit 0a99516528f94ba5ef447ab075f448080dae7697 Author: John Bowman Date: Fri Dec 10 20:05:22 2021 -0700 Port to C++-14. commit 1b51a78ca2730484282c3f76db40c2781059a106 Author: John Bowman Date: Fri Dec 10 19:01:42 2021 -0700 XASY: Avoid unwanted line offset. commit fac7a3db5e93b6401c63e8faaab479a53e1f337e Author: John Bowman Date: Fri Dec 10 18:07:49 2021 -0700 XASY: Implement -render option. commit 39b596f9253727d2a3c64a18696fe9c80f138f27 Author: John Bowman Date: Fri Dec 10 17:57:56 2021 -0700 XASY: Fix 3D picture sizing. commit 11f0eb133aff09d23428ae53ebc5aa6f001bf317 Author: John Bowman Date: Thu Dec 9 12:16:26 2021 -0700 Fix last revision. commit 3f58c24ceb5ef71066fbd6a5b9746bc9638558bd Author: John Bowman Date: Thu Dec 9 10:46:00 2021 -0700 XASY: Combine 2D and 3D pictures. commit 4d07369721fe15cbf92411c7b6d013f7b76aad9a Author: John Bowman Date: Thu Dec 9 10:42:13 2021 -0700 XASY: Assign initial key to all nodes of a 3D picture. commit c451cf62bcae8234d9074886ebeb6264cdab34b7 Author: John Bowman Date: Thu Dec 9 10:39:17 2021 -0700 Fix infinite loop. commit eb1968c76b3b46cddc03fc5f6e7fd994cb206619 Author: John Bowman Date: Thu Dec 9 10:15:14 2021 -0700 Fix uninitialized variables. commit 303906eff9f4d147d3fcece633928692ac9d6395 Author: John Bowman Date: Wed Dec 8 19:26:47 2021 -0700 Update example. commit 8db6799673c2a1df4bbcdbbb12f8f13283f33b6d Author: John Bowman Date: Wed Dec 8 16:36:37 2021 -0700 Update asygl. commit 611c636b4b2f1e163f65ae93a3973a4df664ae8f Author: John Bowman Date: Wed Dec 8 16:34:46 2021 -0700 Allow embedded webgl and weblg2 contexts to coexist. commit 61262aede26d4b3b940f00cbe7db52a92948f222 Author: John Bowman Date: Wed Dec 8 15:09:24 2021 -0700 Revert "Require EXT_color_buffer_float for webgl2." This reverts commit 12618432904d0ef9ab52a9b6390bf20c015ca7b3. commit b4d6f5f936ea5d09b82d816131aadebeb7543d7f Author: John Bowman Date: Wed Dec 8 12:42:09 2021 -0700 Update asygl. commit 12618432904d0ef9ab52a9b6390bf20c015ca7b3 Author: John Bowman Date: Wed Dec 8 12:38:54 2021 -0700 Require EXT_color_buffer_float for webgl2. commit 0820480eeca20ba83dd0c6dfa12e7f1678dc07da Author: John Bowman Date: Wed Dec 8 12:05:00 2021 -0700 Update asygl. commit 1cfa9d36ce6a0bf1a51265f1f25463ec77a46561 Author: John Bowman Date: Wed Dec 8 12:04:01 2021 -0700 Remove obsolete alerts. commit 23bfe9b348c5e3f186acbf4d8579adac8b4b0bd2 Author: John Bowman Date: Wed Dec 8 11:19:27 2021 -0700 Fix offscreen rendering. commit 5f156092e8fa7924ded2299080fff4260c966686 Author: John Bowman Date: Wed Dec 8 11:05:52 2021 -0700 Delete trailing whitespace. commit 8edad4e3e6c4f2c31b291dbb81cda576d84c7195 Author: John Bowman Date: Wed Dec 8 10:05:50 2021 -0700 XASY: Only edit asy code: wait for editor and then reload. commit be2b3a80c4734f444d6a571159d9b9946dd8c6b1 Author: John Bowman Date: Wed Dec 8 07:57:41 2021 -0700 XASY: Calculate maxKey explicitly. commit 1fd9331d4dc8e3a6d49645a52b42cac0f2942894 Author: John Bowman Date: Tue Dec 7 23:18:43 2021 -0700 XASY: Remove duplicate objects. commit d1d8d9710c641dfd84c5aa4dce3ebde66d41bafe Author: John Bowman Date: Tue Dec 7 21:06:30 2021 -0700 XASY: Update maxKey and globalObjectCounter on loading xasy file. commit 4b123f011329554e602aa945e0c91fbcda802290 Author: John Bowman Date: Tue Dec 7 16:00:12 2021 -0700 Reformat. commit 61798c5a195cafc22eb64fc02675e227ebd83cd8 Author: John Bowman Date: Tue Dec 7 13:01:59 2021 -0700 Restore example. commit f7a84bdad76882658a1248417f418fcb9de47845 Author: John Bowman Date: Tue Dec 7 10:41:00 2021 -0700 XASY: Correctly account for xmap line offset. commit 49371c4f04ebf906904c3242aeb6bbe5985e272e Author: John Bowman Date: Sun Dec 5 22:51:20 2021 -0700 Check array index. commit e8447947f359ce1d832ba42c7c03779de7fd62de Author: John Bowman Date: Sun Dec 5 22:34:42 2021 -0700 Add plus and diamond markers to Mark and MarkFill arrays. commit d66b7c757a87f7a747730ab31fa59e93a4716d8d Author: John Bowman Date: Sun Dec 5 21:15:37 2021 -0700 XASY: Assign correct KEY to 3D images. commit 01c144622b1c880929bb8eadcabd20373aa37093 Author: John Bowman Date: Sun Dec 5 10:52:55 2021 -0700 Simplify code. commit 9d99a2af7f6c690cbe3dde266cf6d3fba20eac24 Author: John Bowman Date: Sun Dec 5 05:53:55 2021 -0700 Delete pictures at end of scope. commit 23b76b2cdd39c57e29dbbd0ac7787fa587ecdcfe Author: John Bowman Date: Sat Dec 4 22:28:57 2021 -0700 Ensure rendering width and height are positive. commit 86245eca5e591b823696a5d8e551a42fcbdbc8aa Author: John Bowman Date: Sat Dec 4 21:34:32 2021 -0700 Embed png images within svg output again. commit efafcec14de4fbf94023705face48e3c5eeb41fe Author: John Bowman Date: Sat Dec 4 15:16:21 2021 -0700 Restore example. commit 1aee785b3fd7d7648644f9727a2605744fe0578d Author: John Bowman Date: Sat Dec 4 14:23:21 2021 -0700 XASY: Support context TeX engine. commit 1f86d94950fb6a9e00fa9e0160b64f7f1c0ffa42 Author: John Bowman Date: Sat Dec 4 08:42:54 2021 -0700 Support luatex TeX engine again. commit ad1365d78a6d41dcabf3ad363b85a4d7b90d68ae Author: John Bowman Date: Fri Dec 3 10:02:32 2021 -0700 XASY: Simplify support for multiple PostScript files on dvisvgm command line. commit 1a32da79a8c674a1b0d5a7060f62a11cdd9facda Author: John Bowman Date: Thu Dec 2 22:02:38 2021 -0700 XASY: Support multiple PostScript files on dvisvgm command line. commit e1d9c115b923dabb42f69c5034d20b9924fb2c9e Author: John Bowman Date: Thu Dec 2 05:28:31 2021 -0700 Delete texput files. commit 92d2ceafbf87a50d70711e4bef0e102f64acd126 Author: John Bowman Date: Thu Dec 2 04:27:43 2021 -0700 XASY: Rename debug flag. commit 35736fbd98a3f9aed49bfca1f195a27e9483a00f Author: John Bowman Date: Thu Dec 2 04:01:33 2021 -0700 XASY: Don't overwrite extension in loadFile. commit 571d1eadab6c5edd743320c7a12f60d971cf58f8 Merge: b47ab4045 20fe8cd80 Author: John Bowman Date: Thu Dec 2 03:41:32 2021 -0700 Merge branch 'Qt'. commit 20fe8cd80ad7bba8745a0515a3f1722d445f463b Author: John Bowman Date: Thu Dec 2 03:38:26 2021 -0700 Revert "XASY: Set up work for adding 3d objects in the interface." This reverts commit 98ba7ecd29378505c57c6579ab9ed06680a4584b. commit b47ab4045cde9113111415a810cf75cc95f3eacf Author: John Bowman Date: Wed Dec 1 22:14:58 2021 -0700 Add example of image-based lighting. commit c01e1750697868bb0f5136c6ebde021a82034834 Author: John Bowman Date: Wed Dec 1 22:12:03 2021 -0700 XASY: Support xelatex and lualatex tex engines again. commit fd584e400cbc982792494e5e0b05b34dcc7ac335 Author: John Bowman Date: Wed Dec 1 21:45:08 2021 -0700 Make bshift return a new bbox. commit 45ddd44e7c39666c62f1058e0472e5fdc1f113f4 Author: John Bowman Date: Wed Dec 1 20:51:02 2021 -0700 Check for cson module; remove obsolete option formats. commit 50c67e8ea73e1053037bf0dfaa67c2a0f6f28bec Author: John Bowman Date: Wed Dec 1 20:29:49 2021 -0700 XASY: Make .asy the default extension again. commit 6504f81c83507a4754701e26668c006a10a13fbe Author: John Bowman Date: Wed Dec 1 19:40:36 2021 -0700 Remove obsolete code. commit d61699ad72f7ee95262cf6831b1618e382eb530a Author: John Bowman Date: Wed Dec 1 19:22:34 2021 -0700 Batch deconstruction. commit bf8956b682d61eaddfeb68e7950769c269cd6e51 Author: John Bowman Date: Wed Dec 1 18:37:23 2021 -0700 XASY: Re-enable rendering of 3D images. commit 2cb129d85a32ae80b0652da1a50f5e6fb717db35 Author: John Bowman Date: Sun Nov 21 22:09:21 2021 -0700 XASY: Fix segmentation fault. commit e5f45896916caf91fd6e304413dd8dcb8477b230 Merge: 2fac9e58b 86954d868 Author: John Bowman Date: Sun Nov 21 17:40:50 2021 -0700 Merge branch 'master' into Qt. commit 2fac9e58b131a3879fa461ca16d25d6f21d63e05 Author: John Bowman Date: Sun Nov 21 17:37:31 2021 -0700 Fix deletion of asy objects. commit 294de4a41db9f2240d2651cb5271cf18cefb2f4e Author: John Bowman Date: Sun Nov 21 16:17:47 2021 -0700 XASY: Remove spurious xmap comments. commit fc0ae4f8a6566fd2b17c4d7de8a4ff8ef4ebcf1e Author: John Bowman Date: Sun Nov 21 15:39:51 2021 -0700 GUI: Retain deleted objects and their keys. commit 86954d8680ae6a6d3e416fa3a7dea56c97e39662 Author: John Bowman Date: Sun Nov 21 00:03:27 2021 -0700 Remove redundant patch from teapot example. commit 1d9322c22f2c3bae7ff87a083ec174f74f7047f7 Author: John Bowman Date: Sat Nov 20 23:52:20 2021 -0700 Update asygl. commit 8fd0a9426a2efd1036f0b38a05059689973d2753 Author: John Bowman Date: Sat Nov 20 23:49:55 2021 -0700 Implement WebGL2 optimizations. commit cf00aca4c825cc37d14938fa0210b948bffd2e67 Author: John Bowman Date: Sat Nov 20 23:48:33 2021 -0700 IBL: Enable image-based-lighting for transparent WebGL objects. commit aa5be72ec60608e1940df034e63602440ace0bf2 Author: John Bowman Date: Sat Nov 20 21:22:15 2021 -0700 Update asygl. commit b21d65aafe245d8ac57e6778dfc1c6132b16089e Author: John Bowman Date: Sat Nov 20 21:21:21 2021 -0700 Fix WebGL errors. commit 242785789a0bd458ca0c798669f41d5cf106d7f4 Author: John Bowman Date: Sat Nov 20 09:59:35 2021 -0700 Improve missing EXR image diagnostic. commit bdd70abb16f23e1e76d3768455805fc3a0ddda15 Author: John Bowman Date: Fri Nov 19 17:59:07 2021 -0700 Fix buffer overflow. commit 194fcc875bdc43b88eb030818b424ac1bff11274 Author: John Bowman Date: Fri Nov 19 16:39:35 2021 -0700 Improve clamping. commit a6c5dfef30582c2ce80c0f8c5b4e0738d927b371 Author: John Bowman Date: Fri Nov 19 15:38:16 2021 -0700 Update diagnostic. commit e91b0f87d347fa1ea7ed98717cb40ab29cb59515 Author: John Bowman Date: Fri Nov 19 14:13:12 2021 -0700 IBL: Move precomputed image files to gitlab. commit 10a602f4de8754a3ea6a9e55d3f87ced11aa40b0 Author: John Bowman Date: Thu Nov 18 23:36:57 2021 -0700 Remove snowyField images. commit 45285c1da090797f8bb28733339ee76de643419e Author: John Bowman Date: Thu Nov 18 23:17:25 2021 -0700 IBL: clamp oversaturated values. commit b182a0d4b72c5511e7aa83629f0f3c7dbac8cf65 Author: John Bowman Date: Thu Nov 18 20:24:23 2021 -0700 IBL: Improve EXR diagnostic. commit 541038fedb724214b2c22858b78df2e7dcd6134a Author: John Bowman Date: Thu Nov 18 14:32:16 2021 -0700 Fix directory permissions. commit c59a4039317b66b3e6091113ee6a408184c65f2a Author: John Bowman Date: Thu Nov 18 14:30:51 2021 -0700 Change default imageURL to https://asymptote.sourceforge.io/ibl. commit c47263d97a92f28bb6ce1554f2c2673d8402f17d Author: John Bowman Date: Wed Nov 17 23:24:11 2021 -0700 Implement int[] sequence(int n, int m, int skip). commit cdfda4400beb12521ddb143a43df3d8aac793e13 Author: John Bowman Date: Wed Nov 17 23:18:47 2021 -0700 CUDA: Add usage information. commit dede658f8fecbec2f62d12255eac534d07dffe32 Author: John Bowman Date: Wed Nov 17 22:56:47 2021 -0700 Fix buffer overflow on small images. commit 166e21507e2191e499c8b4acedddc4eb4fae82bb Author: John Bowman Date: Wed Nov 17 17:32:50 2021 -0700 Update asygl. commit 0a85d36a173fefbfdb2c9a0f42a707990878b307 Author: John Bowman Date: Wed Nov 17 17:32:11 2021 -0700 IBL: Rename default image. commit 2931c7c098ac8d11955a52cf9ac7d83dbf45b7ef Author: John Bowman Date: Wed Nov 17 17:28:24 2021 -0700 IBL: Fix texture alignment. commit 36b88dcfe3934bd505263047ab2d76d86eed0d10 Author: John Bowman Date: Wed Nov 17 13:20:46 2021 -0700 Update asygl. commit e429470b41ef1385869f4e80538520e99327b68d Author: John Bowman Date: Wed Nov 17 13:20:17 2021 -0700 IBL: Port to Safari browser. commit 4904634cce7a015bb5b38f0e3da8ef25cda8d98f Author: John Bowman Date: Wed Nov 17 12:12:09 2021 -0700 Update asygl. commit 971afe2dbd98295a09518d97144b7aa9a00b0594 Author: John Bowman Date: Wed Nov 17 12:10:45 2021 -0700 IBL: Wait for Module.ok. commit de52f109ce7524d8135b689174ea01a07178c67c Author: John Bowman Date: Wed Nov 17 10:24:20 2021 -0700 Update asygl. commit 78ce79108e5ba301b263ab630b11cfcdf500a7d7 Author: John Bowman Date: Wed Nov 17 10:21:43 2021 -0700 IBL: Wait for EXRLoader to become available. commit 1e62b2adc3a9c576cd809354c8b28c88aed9d552 Author: John Bowman Date: Wed Nov 17 09:58:42 2021 -0700 IBL: test single file version of tinyexr. commit df370d54fec4b4defdaf00bc3a6adf9128ffa18f Author: John Bowman Date: Tue Nov 16 23:57:42 2021 -0700 Update asygl. commit 6fde5c414cfa02e3771126a29d7d376d9d0ee414 Author: John Bowman Date: Tue Nov 16 23:55:56 2021 -0700 Standardize location of image-independent refl.exr. commit 7c82febdb56ee320cf7b89c8ce3b68e2ed6fd7aa Author: John Bowman Date: Tue Nov 16 22:58:27 2021 -0700 Fix ibl orientation and offset; re-organize fragment shaders. commit 4b32c102bebd2e95737ba492f42468857a1752b7 Author: John Bowman Date: Tue Nov 16 22:57:30 2021 -0700 CUDA: Fix logic. commit 2f842c4773e56850cc6f1d85a82b120cdbdd5702 Author: John Bowman Date: Tue Nov 16 16:17:01 2021 -0700 Exit gracefully on missing EXR file. commit 11afb32b51e6f4f7508d9063552d266788aa6da8 Author: John Bowman Date: Tue Nov 16 16:15:59 2021 -0700 Separate image name from imageDir and imageURL. commit c69fcaa50d93930451b0828454beedee069ee8ab Author: John Bowman Date: Tue Nov 16 16:15:14 2021 -0700 Fix logic. commit 753e3d13eee10066fb63ab491a008e634ddbc3eb Author: John Bowman Date: Mon Nov 15 22:28:52 2021 -0700 Replace deprecated OpenGL function. commit 53e1291eabc60e9d8cb1bee8481c6fdefdd22ee9 Author: John Bowman Date: Mon Nov 15 21:41:39 2021 -0700 Fix compilation warning. commit 32e5a3a766cc17e26740ad1bf7d93062abc46316 Author: John Bowman Date: Sun Nov 14 22:59:46 2021 -0700 Add tinyexr JavaScript support files. commit 40a222986d8869296975732e9c30298dc66aaf09 Author: John Bowman Date: Sun Nov 14 22:52:57 2021 -0700 Update asygl. commit 11e4f084422311f4049ae30690706f32d5f0e4b2 Author: John Bowman Date: Sun Nov 14 22:45:00 2021 -0700 Add sample IBL files. commit 278261e685996a747f3aca51358293653be87a7c Author: John Bowman Date: Sun Nov 14 22:38:26 2021 -0700 Standardize image-based lighting; port successively halved version to WebGL. commit 9e723d1c0c18d7983c870c987f34ec53df1b5bca Author: John Bowman Date: Sun Nov 14 10:29:00 2021 -0700 Recompile tinyexr.js. commit b048f3ed57ea6700cbf73225e642c23b3c707263 Author: John Bowman Date: Fri Nov 12 11:47:19 2021 -0700 git subrepo pull (merge) cudareflect/tinyexr subrepo: subdir: "cudareflect/tinyexr" merged: "67010eae" upstream: origin: "https://github.com/syoyo/tinyexr" branch: "master" commit: "67010eae" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit 150a1ec3c1460b49a4a7c6940c8ca4ab6b5088c2 Author: John Bowman Date: Fri Nov 12 10:03:17 2021 -0700 Update gl.js. commit a49741358f3f9c9b79bb24dac263c4dec8d1d785 Merge: c7c084b64 568da1148 Author: John Bowman Date: Thu Nov 11 22:05:36 2021 -0700 Merge branch 'master' into cudareflect. commit c7c084b64b93bb3dab3f95a2077e7aa96a132114 Author: John Bowman Date: Wed Sep 1 10:09:16 2021 -0600 Remove obsolete comments. commit 568da1148099379911849355cff8d2afde5ec148 Author: John Bowman Date: Thu Nov 11 21:31:24 2021 -0700 Fix vertex-dependent colors. commit 6c9c98f5969ded7634da1be6e6360c6213253914 Author: John Bowman Date: Tue Nov 9 19:44:32 2021 -0700 V3D: Fix garbage collection. commit 1f3330aa53c1f7b17de27c85f67e89be654d6dd3 Author: John Bowman Date: Mon Nov 8 22:49:27 2021 -0700 Fix commit 263285fa05e0cae294b1ec8abda292407a6eb83b. commit da93b0f2fe7616f9dafddc346da292fe67fa261b Author: John Bowman Date: Mon Nov 8 11:54:51 2021 -0700 Interpolate vertex-dependent colors as floats. commit 12315bf7b99311b434d0662e362012f83b35b76e Author: John Bowman Date: Mon Nov 8 10:36:04 2021 -0700 Restore efficient Bezier rendering engine; fix prerendering for vertex-dependent colors. commit ddeaab0ce72488ea08c05415d5170647f6e8c866 Author: John Bowman Date: Mon Nov 8 10:32:26 2021 -0700 Fix byteinv. commit bf21a3428f7dcf3466fa78a10ab01b1c01fa8486 Author: John Bowman Date: Thu Nov 4 05:21:29 2021 -0600 Allow compilation without OpenGL support again. commit 24ab461a7e2c7768b7735620af723b4d1a04bee3 Author: John Bowman Date: Sun Oct 31 10:45:22 2021 -0600 Standardize AsyGL and v3d; remove alpha channel from light direction. Increment asygl to version 1.01. commit f9e36b082ae4516e143552b685efb5f9860be252 Author: John Bowman Date: Sun Oct 31 10:41:14 2021 -0600 V3D: Mention source file in header comment. commit 9f9b9cfdb450048341f4eac3778e4e1f5999b8a9 Merge: ae624c444 3b3f33bb7 Author: John Bowman Date: Sun Oct 31 09:59:52 2021 -0600 Merge branch 'master' into v3d. commit 3b3f33bb7f0ded94761de6f03497bbadc7169d70 Author: John Bowman Date: Sat Oct 30 21:49:04 2021 -0600 Cache background color. commit 263285fa05e0cae294b1ec8abda292407a6eb83b Author: John Bowman Date: Sat Oct 30 21:40:03 2021 -0600 Keep 2D and 3D pictures separate. commit 4cd7ad1080819d88c1887e4e645124ed94c9a5e8 Author: John Bowman Date: Sat Oct 30 21:39:54 2021 -0600 Fix last revision. commit b9a1aa0b3835ace3cfc0c5978abc75e7e61b1bb0 Author: John Bowman Date: Sat Oct 30 13:48:14 2021 -0600 Clear offset buffer in blend shader. commit 7988a6f01a3e45e9099d89bcdad0ddc8a20f9337 Author: John Bowman Date: Fri Oct 29 17:21:53 2021 -0600 Enforce std430 layout. commit 7257d628a6c49dd982787e05a8778a284c1faaf2 Author: John Bowman Date: Fri Oct 29 00:25:56 2021 -0600 Choose unique buffer names. commit 39be6abe5afbc2cc846ee41b08db6a13a8bd8059 Author: John Bowman Date: Fri Oct 29 00:17:46 2021 -0600 Fix outline and wireframe mode. commit 70e20fc773e68d2fe3ed4da86bb77c218c6bc431 Author: John Bowman Date: Tue Oct 26 22:34:36 2021 -0600 Remove troublesome u qualifiers from preprocessor constants. commit 3724879c8b1ca767c75559406c578df13670d52d Merge: 44a1a06a9 172dda0ba Author: John Bowman Date: Mon Oct 25 22:31:48 2021 -0600 Merge branch 'oit9'. commit 172dda0ba85335690722f17fd1d2131ea2109b86 Author: John Bowman Date: Mon Oct 25 09:53:42 2021 -0600 Use highest available GLSL version; detect compute shaders. commit b52992a66893b34a6d69812b9a900a7822afc2ee Author: John Bowman Date: Mon Oct 25 08:26:55 2021 -0600 Improve check on available number of GPU processors. commit b4e3174a085da72c9af55d044d319a96eba5c3d4 Author: John Bowman Date: Mon Oct 25 00:43:15 2021 -0600 Use CPU indexing for offscreen rendering; add setting GPUindexing=true. Fix exporting. commit a13e84d544c12f10a13e8d5935c1d45fcfb92729 Author: John Bowman Date: Sun Oct 24 17:22:46 2021 -0600 Improve frame rate diagnostic. commit 999c701e41507c7f54863c0a7b4536bb7061d559 Author: John Bowman Date: Sun Oct 24 17:00:34 2021 -0600 Improve shader compilation diagnostics. commit 97ce07d029ab3f6f961e1673ce1db548b0d39d0d Author: John Bowman Date: Sun Oct 24 16:57:32 2021 -0600 Unroll initial loop. commit ae34f5364218ab2b0ce3fc8d95c7614c6b9a6213 Author: John Bowman Date: Sun Oct 24 13:20:47 2021 -0600 Use maximum number of available GPU processors. commit 44a1a06a99e5fd18b5d7557de2c6e3197597d256 Merge: 7f57426f1 025e14b2b Author: John Bowman Date: Sun Oct 24 11:15:13 2021 -0600 Merge pull request #273 from descodess/cleanup-code Cleanup code. commit 025e14b2b58fcd63c70df34f76e1a8af1c783d31 Author: descodess <87569405+descodess@users.noreply.github.com> Date: Sun Oct 24 15:06:34 2021 +0200 fix syntax remove trailing semicolon commit 832a7718661c83d96865a71efc4ace8b6b6796cf Author: descodess <87569405+descodess@users.noreply.github.com> Date: Sun Oct 24 14:54:15 2021 +0200 unify and cleanup code - unify code - cleanup code commit f4ddc1d7d9031189411010932aed3b3a6add867b Author: John Bowman Date: Sat Oct 23 17:10:04 2021 -0600 Fix offscreen rendering. commit 1f916adbd5532786b3d1ffd45cc8a26257976b46 Author: John Bowman Date: Sat Oct 23 16:35:17 2021 -0600 Optimize code. commit 00bc732b403334793bd6c28dcfb678e7c00b3572 Author: John Bowman Date: Sat Oct 23 16:35:17 2021 -0600 Simplify code. commit 5d2717ca3d552023f50d237dceb55c2108213602 Author: John Bowman Date: Sat Oct 23 15:21:17 2021 -0600 Backport HAVE_SSBO case to GLSL 1.50 with extensions; simplify shader calls. commit 82d54b08a1ba9082d022394bb9e3baac4edf087e Author: John Bowman Date: Sat Oct 23 13:37:52 2021 -0600 Remove unused glClearBufferData. commit 0f3904629e4f14d825ac4e26075d7a04c0de9a46 Author: John Bowman Date: Sat Oct 23 13:07:47 2021 -0600 Rename transparentfragment shader to blend shader. commit de5ffab119e32dd93e7aa1b507c69d7052648895 Author: John Bowman Date: Sat Oct 23 12:54:15 2021 -0600 Defer memory barrier as long as possible. commit c567e4b482d2f58eccde51aa510e61a549d49778 Author: John Bowman Date: Sat Oct 23 01:33:43 2021 -0600 Simplify code. commit 152c3c22fae4f5614aa82c520892c5cad61c6a14 Author: John Bowman Date: Sat Oct 23 00:41:41 2021 -0600 Implement presum and postsum shaders with smaller workgroups. commit ca2c624141aae22b68d92e8f729fd01365468d49 Author: John Bowman Date: Fri Oct 22 11:38:01 2021 -0600 Slightly overallocate fragmentBuffer. commit 1fdb1497f1349c3abc3b23f2aac1867c146d2253 Author: John Bowman Date: Fri Oct 22 11:18:55 2021 -0600 Use glGetBufferSubData for better performance. commit 62bcdd35ae8378fd3624e039dc8951a02fa5f81b Author: John Bowman Date: Fri Oct 22 10:00:19 2021 -0600 Add missing column. commit 0cd38189fd8e236c480278f5c1dffc9321f1da5b Author: John Bowman Date: Tue Oct 12 23:25:20 2021 -0600 Detect SSBOs at configure time. commit a6626dc8476d85777b4935e200f80443155cfe3a Author: John Bowman Date: Thu Oct 7 17:01:37 2021 -0600 Fix screen resizing. commit 8b705bda0c1d378e06ccfbe63d23c37f04fddba3 Author: John Bowman Date: Thu Oct 21 21:06:50 2021 -0600 Reduce sharedData size by 1. commit e16b6696a73fea89e247afcc8b3ca3f8fe1124a7 Author: John Bowman Date: Thu Oct 21 17:56:28 2021 -0600 Optimize partial summation. commit 7f57426f17798f6e7b67a3278b7b0123fa8ff188 Author: John Bowman Date: Sun Aug 22 22:59:16 2021 -0600 Disable PRC output by default. commit 5278c0bc9ac8f7aec120d756849db6972fdac7ed Author: John Bowman Date: Fri Oct 1 12:18:52 2021 -0600 Reduce the number of writes. commit 2d5c76615a5656a69947fe52dbedc81d644d589f Author: John Bowman Date: Fri Oct 1 11:59:34 2021 -0600 Fix transparent wireframe mode. commit e4adee2dc5dd930057cd52fe017b56635fa50149 Author: John Bowman Date: Thu Sep 30 22:18:26 2021 -0600 Add missing files. commit c28f97f86e8b58ec5b77e68b041948583081b59a Author: John Bowman Date: Thu Sep 30 18:08:05 2021 -0600 Clear counter array directly on GPU. commit 7bfd346e4570d4feb54ff606d6ac0cc1f868ba5b Author: John Bowman Date: Thu Sep 30 17:19:30 2021 -0600 Compute partial sums on GPU. commit b90c8b2e5fefd1a2a8ffafdc964889c79e0d75c0 Author: John Bowman Date: Tue Sep 28 16:56:07 2021 -0600 Blend transparent objects with background. commit 71aff16107856f58661358b727ba354d30cf0370 Author: John Bowman Date: Mon Sep 27 02:18:26 2021 -0600 Only reallocate zbuffer as needed. Fall back to centroid sorting for legacy GLSL versions. commit 43719418bac6b96a747727a38a012be4b60e63f9 Author: John Bowman Date: Sun Sep 26 01:37:22 2021 -0600 Improve performance by not clearing depth buffer. commit 64224e276958ea86635722a36867830cf44abbf2 Author: John Bowman Date: Sat Sep 25 16:30:58 2021 -0600 Invoke mergeShader once per pixel; sort large fragment lists in place. commit 63df2147cc8406171a9da3b8b36a58bed4c5e38e Author: John Bowman Date: Sat Sep 25 02:22:00 2021 -0600 Compress fragment list. commit 4e711e64b3b24a14f2e2f8c07b637c19cefd6406 Author: John Bowman Date: Fri Sep 24 18:15:35 2021 -0600 Handle errors gracefully. commit 95f5f2cf1b944abc994a8de363723afdcdc3ae66 Author: John Bowman Date: Fri Sep 24 17:51:03 2021 -0600 Remove unused extension. commit 6d43aa48cd703fc90c118d1dd2437919df081748 Author: John Bowman Date: Fri Sep 24 17:03:51 2021 -0600 Remove unused code; reduce GLSL version. commit cf6880d79c87a4ae1a0ecd557be9cfb0de19be35 Author: John Bowman Date: Wed Sep 22 01:41:04 2021 -0600 Implement order-independent transparency up to fixed depth. commit 1a03ddc1990e6c98c668b000447a2d26a9816846 Author: John Bowman Date: Sat Sep 11 22:51:11 2021 -0600 Update example. commit 4a471d9f141325e44af2090a00e7f80daa75d730 Author: John Bowman Date: Tue Sep 7 15:10:03 2021 -0600 Revert "SETTINGS: Implement once option that limits to one shipout." This reverts commit 51be72a7c0dcb66d9dfd54e490a7f9c0dffdfe29. commit acfacda74b6eb1e2c51432700b792e58d41e8703 Author: John Bowman Date: Tue Sep 7 15:09:40 2021 -0600 Revert "SETTINGS: Improve once setting." This reverts commit 863550d54f2fd73907829af9f10e28a158d8d8aa. commit 9aee221cb61a00c2ef275c4eb0415e7b913b234e Author: John Bowman Date: Tue Sep 7 15:08:20 2021 -0600 Fix hang on display. commit 26fee75283f3087df8174610707f437e43123e72 Author: John Bowman Date: Tue Sep 7 14:53:50 2021 -0600 Update FFTW++. commit a21ba3043207290b82d3ef100f12e1f9c80f5799 Author: chaumont-arch Date: Mon Sep 6 20:08:13 2021 -0600 XASY: Fix copy translation bug. commit 302d588b0498a9272152e2e262245d6d2a4d6b60 Author: chaumont-arch Date: Sat Sep 4 20:43:55 2021 -0600 XASY: Fix object copying translation glitch. commit e331cefff6f6136c691a69a0e0292b9f07feba48 Author: John Bowman Date: Wed Sep 1 00:48:47 2021 -0600 Clamp oversaturated values. commit 781c2f8ba80b3a2b5a81103f838a249c7f98794c Author: chaumont-arch Date: Tue Aug 31 23:42:25 2021 -0600 XASY: Change errors with pasting. commit f8359c15510ea5b383347892c85f90e386d78f46 Author: Supakorn Rassameemasmuang Date: Tue Aug 31 15:59:07 2021 -0600 VS: Move linalg.cuh to utils.cuh. commit 4d4e1c433652076ff791942e52e3683a012d380f Author: John Bowman Date: Tue Aug 31 15:58:17 2021 -0600 Add missing file. commit c070d3cd7076c97d41d17f9de93d3a3bdb712d41 Author: John Bowman Date: Tue Aug 31 15:57:25 2021 -0600 Add reference. commit db0ef4c4955dca0853052fa81c9e1c4b01d64fae Author: John Bowman Date: Tue Aug 31 15:54:36 2021 -0600 Rename file. commit 52a4bfbdd063f31abce9adb5c3202d7061c1e6f3 Author: Supakorn Rassameemasmuang Date: Tue Aug 31 15:31:48 2021 -0600 CXX: Include abs2 in the DefaultVec3 function. commit e4e2a750179e8f6d6892ffeb6cc262d2a96a6914 Author: Supakorn Rassameemasmuang Date: Tue Aug 31 15:31:30 2021 -0600 VS: Include simpson.cuh in vcxproj file. commit e0ae066f4968fa980899158ea6759d578479e304 Author: John Bowman Date: Tue Aug 31 00:40:46 2021 -0600 Integrate diffuse image with adaptive simpson integration. commit 79c8e33e7d7fc3f08fb7172de3ca8b96ae11699b Author: John Bowman Date: Mon Aug 30 21:38:52 2021 -0600 Simplify example. commit 37833d712a1993a13a0e0f82a8ae8e8c16a46352 Author: Supakorn Rassameemasmuang Date: Mon Aug 30 19:05:08 2021 -0600 HEADER: Remove any unneeded functions from linalg.cuh. commit 866733b926da9ca839cfb52d305ab4737b64d784 Author: Supakorn Rassameemasmuang Date: Mon Aug 30 18:55:16 2021 -0600 GLM: Migrate internal integraiton code to glm::vec3/mat3. commit 84f678b57544f677592b808678251b21c7d227d2 Author: Supakorn Rassameemasmuang Date: Mon Aug 30 02:37:20 2021 -0600 WEBGL: Add missing closing bracket to fragment shader. commit 39ac3e241f5777f1dba1051d57b922b9755e84c4 Author: Supakorn Rassameemasmuang Date: Mon Aug 30 02:33:50 2021 -0600 CUDA: Use Simpson's method for inner loop also. commit 6d5f8b735f5c0759a1073fe845e24b44b39de045 Author: Supakorn Rassameemasmuang Date: Mon Aug 30 02:19:19 2021 -0600 CUDA: Use a template simpson's method for integration. commit e1165ce48521067074e6ef09062e3df11cd10354 Author: Supakorn Rassameemasmuang Date: Mon Aug 30 01:59:29 2021 -0600 Refine simpson's method for integration. commit a9133135d236bb592814c19e92ddd87dc9e73729 Author: chaumont-arch Date: Mon Aug 30 01:38:03 2021 -0600 XASY: Pasted objects follow mouse. commit 48d25978a7103a1b8485cb80ce4b7297dddcdb96 Author: chaumont-arch Date: Mon Aug 30 01:16:52 2021 -0600 XASY: Fix copy/paste graphical bug. commit d82bb2de9416ce0a209b138c46850e211e5943d3 Author: Supakorn Rassameemasmuang Date: Mon Aug 30 01:11:17 2021 -0600 GLM: Use glm for irradiation generation. commit 2d7af868033a42d6dbf1f0f024db3f3266caa2d7 Author: John Bowman Date: Sat Aug 28 22:36:56 2021 -0600 Fix endpoint. commit d477d8577575831f57ad53ecb8df8bf808d490bc Author: Supakorn Rassameemasmuang Date: Sat Aug 28 18:08:59 2021 -0600 WEBGL: Add support for PBR Texture sampling. commit c7869c3face0d2ab79d8dac49d3c3af12b137a8c Author: John Bowman Date: Sat Aug 28 08:31:37 2021 -0600 Fix last commit. commit 1199f6db6b255f675f855b54ebb8f2d570b68c15 Author: John Bowman Date: Fri Aug 27 23:02:27 2021 -0600 Use Simpson's rule for integration over phi. commit 0cb2bc4b7c2f4ac82d98df80b3460d4b5797be44 Author: Supakorn Rassameemasmuang Date: Fri Aug 27 22:28:34 2021 -0600 REFL: Allow for output size different to input and enable halving of sizes for mipmap. commit 6fce80c00b769c98fc53b5fc317ed31a99bc76a8 Author: Supakorn Rassameemasmuang Date: Fri Aug 27 21:53:24 2021 -0600 CU: Extract integrand to a separate function. commit 77f18124bc5788561990d1d560053e26099c497a Author: Supakorn Rassameemasmuang Date: Fri Aug 27 21:42:49 2021 -0600 CU: Move integration function to a class. commit 89c414a94693d2be041dd9f9623e5e1186351809 Author: Supakorn Rassameemasmuang Date: Fri Aug 27 17:00:57 2021 -0600 CXX: Use C++17 for structured bindings temporarily. commit e07757a43286d883642a2f5013ca0ab60c230e84 Author: John Bowman Date: Fri Aug 27 00:03:40 2021 -0600 Simplify code. commit d1ca5ca3c6400ba26c6da27dc74967c251cf7bdc Author: Supakorn Rassameemasmuang Date: Thu Aug 26 21:08:58 2021 -0600 EXR: Enable PIZ compression by default. commit 150323ec482871cf181aa7d809ee2ed5d6beb5fc Author: John Bowman Date: Thu Aug 26 20:10:02 2021 -0600 Output missing directory. commit 881f038851e9f8c642344205b517e78eb84f33df Author: Supakorn Rassameemasmuang Date: Thu Aug 26 19:49:04 2021 -0600 CXX: Add copying file and extract some functions. commit 15e5b4783c6761592909d1b0048b251bcef8675b Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 25 16:53:29 2021 -0600 GL: Fix texture parameter bindings. commit 7b36e0e262b881f0b7da255e074818c4229ec359 Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 25 16:42:41 2021 -0600 Extract loading IBL Data to a separate function. commit 722723098b87c74d6dfda6c4dfeb2391457950af Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 25 15:55:52 2021 -0600 GLSL: Extract IBL to a separate function. commit 096b673db236faab237f9a922ba78a9a00effc4d Author: chaumont-arch Date: Tue Aug 24 23:59:06 2021 -0600 XASY: Remove debug message. commit 326bc7a96d283849ed4f88fba194985a19b6ddf0 Author: chaumont-arch Date: Tue Aug 24 23:51:31 2021 -0600 XASY: Expand functionality of copy and paste. commit 997e4ee59793d6136aec080368ed66220193b989 Author: Supakorn "Jamie" Rassameemasmuang Date: Tue Aug 24 22:17:39 2021 -0600 GLSL: Update shaders to use IBL. commit 8e8cb4e54072a87c736bd57f40011117a6753c2d Author: Supakorn "Jamie" Rassameemasmuang Date: Tue Aug 24 22:03:25 2021 -0600 GL: Update parameters level. commit 5635f37214c2bd13c94dc52fa38f37e6831f923a Author: Supakorn "Jamie" Rassameemasmuang Date: Tue Aug 24 15:43:20 2021 -0600 GL: Add basic texturing system to asy. commit 6e4fb11ab637a16076edc4673c35a94c7d54f674 Author: chaumont-arch Date: Mon Aug 23 10:17:14 2021 -0600 XASY: Add message for copying unsupported types. commit 1a0127e0f4789974fe6dd8e7c214e7f0d2941bdd Author: chaumont-arch Date: Mon Aug 23 00:50:05 2021 -0600 XASY: Fix major copying bug. commit ae624c444c41b4441b6745e96528b0fe3b1bb79d Author: John Bowman Date: Sun Aug 22 22:59:16 2021 -0600 Disable PRC output by default. commit e3f895e6dcee599193b369b501d72d562161cee6 Author: Supakorn Rassameemasmuang Date: Sun Aug 22 18:58:44 2021 -0600 REFL: Formalize arguments for program. commit df676f0b62ce1b223fb62d509707c7aacd783352 Author: Supakorn Rassameemasmuang Date: Sun Aug 22 17:55:14 2021 -0600 REFL: Add EXR and argument handling. commit 6a136116ddbb664241ac5a7cd2169e9f58f351ca Author: Supakorn Rassameemasmuang Date: Sun Aug 22 17:09:48 2021 -0600 REFL: Update Visual Studio solution to use vcpkg instead of nuget. commit b029cb065cc50bee50e611d9dddcb5e233820f29 Author: chaumont-arch Date: Sat Aug 21 23:48:58 2021 -0600 XASY: Fix crash bug with copying. commit 43bf5ad9483e40b42968fae7650bc624c0c28591 Author: John Bowman Date: Sat Aug 21 23:06:07 2021 -0600 REFL: Port to UNIX. commit ba4a5a979cca422caf5440c519c22ed5b05936a3 Author: John Bowman Date: Sat Aug 21 22:01:29 2021 -0600 git subrepo clone https://github.com/syoyo/tinyexr cudareflectance/tinyexr subrepo: subdir: "cudareflectance/tinyexr" merged: "b0d2abbd" upstream: origin: "https://github.com/syoyo/tinyexr" branch: "master" commit: "b0d2abbd" git-subrepo: version: "0.4.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a04d8c2" commit 283dbec8d3d31b538a397d4c7f8d737561f720a3 Author: John Bowman Date: Sat Aug 21 21:45:23 2021 -0600 THREE: Add missing center transform. commit abbce6ee1dcfc13628eab49cc45ab3e4f4335dc5 Author: Supakorn Rassameemasmuang Date: Sat Aug 21 18:22:53 2021 -0600 REFL: Use importance sampling for pre-computing fresnel values. (Is this the right value?) commit 75d4cdd93180d0d81149b7a9aa5f28e244ba59d9 Author: Supakorn Rassameemasmuang Date: Fri Aug 20 21:32:40 2021 -0600 CUDA: Add error checking to free and intellisense improvements. commit 89dfe5eec19fcec2e8cd1276bff6a5e94e392e11 Author: Supakorn Rassameemasmuang Date: Fri Aug 20 21:32:26 2021 -0600 CUDA: Include a currently (broken) roughness/CosV map to reflectance values. commit 34fafd8d6b08f83fa2f505368593d75d3603ac6f Author: Supakorn Rassameemasmuang Date: Fri Aug 20 17:10:17 2021 -0600 CUDA: Add separate VC++ Irradiance generator code. Note that our goal is to convert this VC++ project build script to a Makefile script and ensure it is compilable under linux. commit f6a8a83ba8f75119fdf9665b397b0992fa00f584 Author: chaumont-arch Date: Thu Aug 19 00:45:47 2021 -0600 XASY: Forbid changing fill status on open curves. commit 5f5e10a1de1aab07e046f9dda5dcec86fdd45e0a Author: John Bowman Date: Thu Aug 19 00:06:05 2021 -0600 Remove diagnostics. commit 3cbb0dbef8873f99fa7f447e337a862769222c2a Author: John Bowman Date: Thu Aug 19 00:03:14 2021 -0600 Avoid duplicate centers. commit 9d2892af776569e465f993c9324135eff612241e Author: John Bowman Date: Tue Aug 17 04:04:58 2021 -0600 Update asygl. commit 4acc17ed4c8f7530dd848ca43e7579a190541a31 Author: John Bowman Date: Tue Aug 17 04:01:27 2021 -0600 Support centerIndex in WebGL triangle groups. commit bcff5923ef657f7ea579179f63b7701208c8e993 Author: John Bowman Date: Tue Aug 17 04:07:56 2021 -0600 V3D: Add billboard support to triangle groups; suppress primitives when prerendering. commit 0817a2f368dcb040d8fb0823df96a3e671782ba6 Author: John Bowman Date: Tue Aug 17 04:04:58 2021 -0600 Update asygl. commit 82aa6d237153b7f3ac60e44b86402f1052c7e7cd Author: John Bowman Date: Tue Aug 17 04:01:27 2021 -0600 Support centerIndex in WebGL triangle groups. commit 22a784d251242440f4cbdaa8ae2349ba031cf8db Merge: b0729f182 791379141 Author: John Bowman Date: Mon Aug 16 17:29:43 2021 -0600 Merge branch 'master' into v3d. commit b0729f182305c81242487207e4be370951ec791f Author: Supakorn Rassameemasmuang Date: Mon Aug 16 13:53:08 2021 -0600 V3D: Render triangle if primtiive flag is >0. commit 5c2379943e53d576dfa301afe20e209161f4eccb Author: Supakorn Rassameemasmuang Date: Mon Aug 16 12:45:56 2021 -0600 V3D: Add center to triangle groups. commit 79137914157f38ce1fb548e26d2a409cc36445d7 Merge: d56f09667 3fdfbd69f Author: John Bowman Date: Mon Aug 16 10:13:34 2021 -0600 Merge branch 'Qt'. commit 8a9407456564b94c087791f51614cfe03a02b0b1 Author: chaumont-arch Date: Sun Aug 15 22:13:42 2021 -0600 XASY: Add alpha version of copy/paste. commit e5ab80073a29e25b3b9d94a96f22f312a79ec9b4 Author: John Bowman Date: Sat Aug 14 02:36:43 2021 -0600 V3D: Simplify and optimize V3D workflow. commit 3d31566beae8f39b12a9b4b83f4627d92dbb0377 Author: Supakorn Rassameemasmuang Date: Fri Aug 13 21:09:20 2021 -0600 V3D: Remove Min/Max from V3D generation. commit 9eefbed0d0c58736f12b67d5df4c2f7590d6b6df Author: John Bowman Date: Fri Aug 13 18:43:54 2021 -0600 Fix prerender resolution. commit 906a5be824a2a7c6b4e800800f11e678d974e543 Author: John Bowman Date: Fri Aug 13 18:18:18 2021 -0600 Make prerender a real setting. commit 7afa49892cd20e38d19c3a18d4d2c956941db0d1 Author: John Bowman Date: Fri Aug 13 17:34:14 2021 -0600 Support reading material triangle arrays. commit d56f09667ca0e9f2b3b6fc4aadfe330e99915a9c Author: John Bowman Date: Fri Aug 13 00:23:05 2021 -0600 PEN: Make byte(double r) map [0,1] to [0,255] uniformly, with 0.5 mapping to 128. commit 98ba7ecd29378505c57c6579ab9ed06680a4584b Author: chaumont-arch Date: Tue Aug 3 00:18:26 2021 -0600 XASY: Set up work for adding 3d objects in the interface. commit 3fdfbd69f7d75fecc4908ec07684553f897d9e47 Author: chaumont-arch Date: Wed Aug 11 22:34:21 2021 -0600 XASY: Remove unreachable code. commit f8fd80407962c18deee37029c764455e0050fc3c Author: John Bowman Date: Wed Aug 11 17:59:25 2021 -0600 Makefile: avoid python dependency in releases. commit 90608841304c3d233cd5194c05eb8783da60bd70 Author: Supakorn Rassameemasmuang Date: Wed Aug 11 17:14:18 2021 -0600 V3D: Add java support for enum generation. commit 7448d4f8789152cd71cd2406d8299320ca37c5eb Author: Supakorn Rassameemasmuang Date: Wed Aug 11 16:55:27 2021 -0600 V3D: Add comment support for enum types. commit 4c633b4c95589cc029da7e99666bd26e7fac74f0 Author: Supakorn Rassameemasmuang Date: Wed Aug 11 16:02:30 2021 -0600 V3D: Enable asy header generation to base/*.asy file. commit f2e2d37759a8514e0f51dc8535fbbe5bf1e061e8 Author: Supakorn Rassameemasmuang Date: Wed Aug 11 15:58:47 2021 -0600 V3D: Move enumheader directories to the asy dir. commit c8ce4c0454d3c4b9a1f39cf854384c87ddaabaf9 Author: Supakorn Rassameemasmuang Date: Wed Aug 11 15:24:36 2021 -0600 V3D: Use gzipped file as the reading mode for V3D. commit 676ee735c0715d1bf89322ea24f12d3e122d65df Author: Supakorn Rassameemasmuang Date: Wed Aug 11 15:24:17 2021 -0600 V3D: Add gzfile as igzxfile option. commit ff9766b6139e60c2db1feb0eed9ba4e28c28c98f Author: Supakorn Rassameemasmuang Date: Wed Aug 11 15:22:55 2021 -0600 V3D: Add memixstream to support input from memory. commit 50a11030172f594158e561b578bf42ba4a060eea Author: John Bowman Date: Wed Aug 11 01:00:05 2021 -0600 V3D: Use global instead of local bounding box for drawTube. commit 8dbffd7305b72a6b5325d064581c0dd01e430478 Author: John Bowman Date: Wed Aug 11 00:59:30 2021 -0600 V3D: Fix WebGL sphere syntax. commit 4b855feb8728f7440219e2502af264a8d2043a6c Author: John Bowman Date: Wed Aug 11 00:25:13 2021 -0600 V3D: Implement light in v3d.asy. commit 60c849655df07657d2f3224afd9a193dda2bc06f Author: John Bowman Date: Tue Aug 10 01:27:47 2021 -0600 V3D: Improve description of lossy setting. commit a55a50c7cedd4a5c5ad7600ae73d1a63fa1f5e64 Author: Supakorn Rassameemasmuang Date: Tue Aug 10 21:23:40 2021 -0600 V3D: Add in light information for v3d. commit 806c67a373c8dda38fc38d8638fe35235c798c55 Author: chaumont-arch Date: Tue Aug 10 21:53:31 2021 -0600 XASY: Add messages upon saving files. commit f921075a3738ab968dc594fcb6bcb29bb0f54e21 Author: Supakorn Rassameemasmuang Date: Tue Aug 10 21:23:40 2021 -0600 V3D: Add in light information for v3d. commit 863550d54f2fd73907829af9f10e28a158d8d8aa Author: John Bowman Date: Tue Aug 10 21:14:59 2021 -0600 SETTINGS: Improve once setting. commit 51be72a7c0dcb66d9dfd54e490a7f9c0dffdfe29 Author: John Bowman Date: Tue Aug 10 20:45:55 2021 -0600 SETTINGS: Implement once option that limits to one shipout. commit e361cf952267d786d462dda40ddcf8d6ddfb584b Author: Supakorn Rassameemasmuang Date: Tue Aug 10 19:35:06 2021 -0600 REPO: Add clang-format file. commit bc75527b354ef090064aa4777f779413a0339a9d Author: John Bowman Date: Tue Aug 10 01:20:10 2021 -0600 V3D: Fix precision, hemisphere alignment, curves, and cores. Add primitve support. commit 0fc1a6bb15667544aecf77c0aafb014c45227742 Author: John Bowman Date: Tue Aug 10 01:16:23 2021 -0600 THREE: Expose drawTube primitive. commit 5acc87fcfea6737a451c97301c52332ca7e8713f Author: Supakorn Rassameemasmuang Date: Mon Aug 9 22:05:46 2021 -0600 V3D: Detect single real in v3d. commit 0d4ae3663c998315ba5c51694631621e7709b650 Author: Supakorn Rassameemasmuang Date: Mon Aug 9 21:55:24 2021 -0600 V3D: Add single precision as an option with -lossy. commit 45303157fed6b5525de65b10ee7206c42668f079 Author: John Bowman Date: Mon Aug 9 21:43:38 2021 -0600 V3D: Fix dependency. commit 486166359a2d6dd02101c9292370973c4827b22e Author: John Bowman Date: Mon Aug 9 21:35:18 2021 -0600 V3D: Simplify code. commit 84ab496c2a4e8e0957fdceb705b62c885b0f8920 Author: Supakorn Rassameemasmuang Date: Mon Aug 9 20:00:27 2021 -0600 V3D: Add gz as an option. commit 2fe8816e92ac59e28f14e8ef0aa7d24b2607dcd3 Author: Supakorn Rassameemasmuang Date: Mon Aug 9 18:26:51 2021 -0600 V3D: Use open_memstream for in-memory files. commit 9da89c31033c68fe8ed414b71725d93fa9206918 Author: chaumont-arch Date: Mon Aug 9 17:44:00 2021 -0600 XASY: Fix changing text labels. commit aceb3d56f81f1552b3ccdc3a12c9eead22cc6984 Author: John Bowman Date: Mon Aug 9 17:14:17 2021 -0600 XASY: Color filledbucket and nodes of curve and polygon icons. commit 2c52f34e4439309cba661ef7d82c3328afcfdf41 Merge: 71cb3f68c a6a23c75f Author: John Bowman Date: Mon Aug 9 16:06:52 2021 -0600 Merge branch 'master' into Qt. commit 7c8b9134cbca36073401b980b34c7870b0922267 Author: Supakorn Rassameemasmuang Date: Mon Aug 9 16:06:30 2021 -0600 V3D: Add memv3dfile option. commit 15fe906d4e07c81fa408a11c58fe04c9c522e15e Author: Supakorn Rassameemasmuang Date: Mon Aug 9 15:17:48 2021 -0600 V3D: Abstractize v3dfile to absv3dfile. commit 2a533bc20aae3b1b50cffd644e81dc00e39de7d8 Author: Supakorn Rassameemasmuang Date: Mon Aug 9 15:17:07 2021 -0600 V3D: Add python as an makefile option. commit 71cb3f68c3ca463eb4ad6515cd25986b86a73d85 Author: chaumont-arch Date: Mon Aug 9 15:02:45 2021 -0600 XASY: Fix saving bug. commit a6a23c75f8b9fd9c126c06509feb638a2eeb808a Author: John Bowman Date: Mon Aug 9 10:29:23 2021 -0600 Rename renderMode to renderDensity. commit 4603ec03cd7bdfa97e8c91559c115049d62593ba Merge: 867f44da7 9c6677a2e Author: John Bowman Date: Mon Aug 9 09:49:17 2021 -0600 Merge branch 'master' into Qt. commit 867f44da7c079b5c35512c3ddb35d23f9887902d Author: chaumont-arch Date: Mon Aug 9 00:38:08 2021 -0600 XASY: Add option to change keymaps. commit 9c6677a2e51a2503be8dd97924a061db47a1b9ee Author: John Bowman Date: Sat Aug 7 10:57:08 2021 -0600 Revert "Disable threads again by default under MSDOS." This reverts commit 29f965b7050b6ffb4da77a73b66d277e76ae77d8. commit 8f07a8bca008738c5ee0ff6f8fa04482f4d69c3d Author: John Bowman Date: Sat Aug 7 00:02:31 2021 -0600 PARSER: Fix declaration of yyparse. commit 787c1c397476890ae20abb0b6ed54d8f99471048 Author: John Bowman Date: Fri Aug 6 23:48:58 2021 -0600 V3D: Standardize names. commit 4b8c2489044c9fba4b2186889ed33bd22576665a Author: John Bowman Date: Fri Aug 6 22:35:44 2021 -0600 XASY: Add renderMode to default xasyconfig.cson. commit 2a5bd095a0492c66e5492cbe8c7523421e0f8e05 Author: John Bowman Date: Fri Aug 6 22:35:18 2021 -0600 Support prerelease suffixes. commit 922ab672ec7bd0e76d597eda23988e02ae7675c4 Author: John Bowman Date: Fri Aug 6 21:33:19 2021 -0600 Port support for 3D rendered xasy pictures to MSDOS. commit 2b2a6926a92ff8022ba3ae7edcf0a0538adfa601 Author: Supakorn Rassameemasmuang Date: Fri Aug 6 21:26:47 2021 -0600 V3D: Add more information to V3D header. commit c267db95d8c6fbf483e0a6a30d460b223d27b5d0 Author: Supakorn Rassameemasmuang Date: Fri Aug 6 21:14:09 2021 -0600 V3D: Add Zoom0 and margin information to v3d. commit 1631e3967dd23bb03c051f060218475c9dfb5f9b Author: Supakorn Rassameemasmuang Date: Fri Aug 6 20:48:30 2021 -0600 V3D: Set camera info in V3D. commit 825fc91b375c160a92fc08573e6fe916daa6b29e Author: Supakorn Rassameemasmuang Date: Fri Aug 6 20:39:50 2021 -0600 V3D: Add Header reading in asy. commit 924c58c89d226cce0b5377ffa2baca2e90a8f96d Author: Supakorn Rassameemasmuang Date: Fri Aug 6 20:28:48 2021 -0600 V3D: Add enum generation for asy. commit 8bbce6486cb265e5b86308ee9ea9d660f83274bc Author: Supakorn Rassameemasmuang Date: Fri Aug 6 20:11:51 2021 -0600 V3D: Output header data. commit e44d572c6f8f0ed7fb8ae8921525b99d693dca1f Author: Supakorn Rassameemasmuang Date: Fri Aug 6 18:27:25 2021 -0600 V3D: Fix V3D Makefile generalization. commit 8dbbf33bcddc584cccdeb8027e58bdda1f8cf64c Author: Supakorn Rassameemasmuang Date: Fri Aug 6 17:39:30 2021 -0600 V3D: Add v3dheadertypes to enum headers. commit 455c5954a351315dec9575fe49ea32d72d7d7d5d Author: Supakorn Rassameemasmuang Date: Fri Aug 6 16:48:03 2021 -0600 V3D: Generalize Makefile rule for enum headers. commit 52a3fe49cb2e7b215beb88a295b3c20a21c75693 Author: Supakorn Rassameemasmuang Date: Fri Aug 6 16:41:06 2021 -0600 V3D: Move csv and generated headers to enumheaders. commit fe5ea8845d6ec6288d021223b01ab5f98cefad65 Author: Supakorn Rassameemasmuang Date: Fri Aug 6 16:19:46 2021 -0600 V3D: Add script for v3dtypes generation from csv. commit 29f965b7050b6ffb4da77a73b66d277e76ae77d8 Author: John Bowman Date: Fri Aug 6 09:00:30 2021 -0600 Disable threads again by default under MSDOS. commit af811ec03dccd4fab73dfe00d78bc9318f8e717f Author: John Bowman Date: Fri Aug 6 08:58:30 2021 -0600 Fix infinite loop on EOF when readline support is disabled. commit 52657aa0f28ffff1b884d09ccbe1f9f9fcef17a6 Author: John Bowman Date: Fri Aug 6 08:10:16 2021 -0600 Fix typo. commit e59b0fadcd1e2ef689f299dbad49f624db1b5469 Author: John Bowman Date: Thu Aug 5 23:19:24 2021 -0600 Update documentation. commit a5eda4eed14198827bcba139206faa0fbcc488d8 Author: John Bowman Date: Thu Aug 5 22:13:18 2021 -0600 Suppress internal Qt diagnostics. commit 0995689e8505f85329b000c50e74daab196e887c Merge: 57b93d551 7dead80b4 Author: John Bowman Date: Thu Aug 5 21:45:03 2021 -0600 Merge branch 'Qt'. commit 7dead80b436bb90ed81090315538b21d20c3cbc0 Author: John Bowman Date: Thu Aug 5 21:34:42 2021 -0600 Revert "XASY: Fix closing bug." This reverts commit 35aaf24d8bdf1db19ea001f88bfe44cecc6ec1ec. commit adc58bc87e608c8f6706115d8a71a0c738ac8b83 Author: John Bowman Date: Thu Aug 5 21:33:45 2021 -0600 Revert "XASY: Fix freehand saving bug." This reverts commit aac59af3405e51726a708b6ca06fb3fc35c5f45b. commit 57b93d5513b734a676a7633ddbf7b33a65fb42bf Author: John Bowman Date: Thu Aug 5 18:06:07 2021 -0600 Revert "XASY: Set up work for adding 3d objects in the interface." This reverts commit bad1b04a2aaf6e21eacf07b046d99e07a839c18f. commit 94651febdff5250fb6bc98393817a578737a8ee4 Merge: 2d4c3cde0 c2f559c8b Author: John Bowman Date: Thu Aug 5 18:05:32 2021 -0600 Merge branch 'Qt'. commit 2d4c3cde07d7498301f337277522c69586deae76 Author: John Bowman Date: Thu Aug 5 15:34:23 2021 -0600 Add missing fuzz parameters to routines that call intersections. commit c2f559c8b7f6083542b650b5f3909e688ffe95be Author: John Bowman Date: Thu Aug 5 12:13:06 2021 -0600 XASY: Remove addressed note. commit aac59af3405e51726a708b6ca06fb3fc35c5f45b Author: chaumont-arch Date: Thu Aug 5 10:33:43 2021 -0600 XASY: Fix freehand saving bug. commit 3850f9948b6d535b61988e5096514890fbb16d4d Author: John Bowman Date: Wed Aug 4 22:05:56 2021 -0600 V3D: Fix color triangle. commit 5c387a68c6912c6434434042b56e3ed35a8fa6af Author: chaumont-arch Date: Wed Aug 4 20:05:02 2021 -0600 XASY: Fix fill status errors for freehand objects. commit 648015672687357ca36f94e503b9d8976a42286b Author: chaumont-arch Date: Wed Aug 4 19:51:32 2021 -0600 XASY: Improves quality of fix to text saving bug. commit e6ac8c6ae41c8bd93f2df18670cd13965f843eb7 Author: chaumont-arch Date: Wed Aug 4 19:42:04 2021 -0600 XASY: Add option to fix text. commit af70420fdfc859862fca6ba760d2b7cda54e67c6 Author: chaumont-arch Date: Wed Aug 4 19:33:13 2021 -0600 XASY: Fix closing bug regarding text. commit 6bd3ad893a819b7020150db5c1ec82195bfe3b27 Author: chaumont-arch Date: Wed Aug 4 19:19:08 2021 -0600 XASY: Fix text saving bug with xasy format. commit 05e5ca886fec7372b0ada8d6305eb2b16efc7c0b Author: Supakorn Rassameemasmuang Date: Wed Aug 4 17:35:04 2021 -0600 V3D: Add generation for triangle lists. commit 7103e5c70ab519927d38b7f9bc549643caa034e8 Author: Supakorn Rassameemasmuang Date: Wed Aug 4 17:27:29 2021 -0600 V3D: Add generation for path lists and pxiel lists. commit 379d8f71a73f900a6b6e3c192ba186d3c8d51332 Author: Supakorn Rassameemasmuang Date: Wed Aug 4 17:14:12 2021 -0600 V3D: Fix surface typo. commit cab1f904c16b490711498a21d7954cfd95aa5e30 Author: Supakorn Rassameemasmuang Date: Wed Aug 4 17:12:02 2021 -0600 V3D: Output Min and Max on bezier patches and triangles. commit 6843d56c53ecc246c1ca8523ccd56723084530bb Author: Supakorn Rassameemasmuang Date: Wed Aug 4 17:08:09 2021 -0600 V3D: Add support for straight patches and triangles. commit 7e49626efc399d7b5581857fc16ab00a5a17936b Author: John Bowman Date: Wed Aug 4 00:48:56 2021 -0600 Fix alignment issues. commit 098789a4f4446125ffa3f16071c1f111d83cd76e Author: John Bowman Date: Wed Aug 4 00:47:40 2021 -0600 V3D: Generate primitives for both v3d and webgl. commit fd7b1f0f8c3e2ead714f30ad88291c782d648e02 Author: Supakorn Rassameemasmuang Date: Tue Aug 3 18:47:10 2021 -0600 V3D: Add triangles and pixel to reading V3D. commit 51eb5ae116173a9e9fdbfd128bd8abf6e16a8d5d Author: Supakorn Rassameemasmuang Date: Tue Aug 3 17:48:30 2021 -0600 V3D: Add pixel and curves to v3dfile.cc. commit 141a1fdde34df2908a0e6723e89142962bb5319e Author: Supakorn Rassameemasmuang Date: Tue Aug 3 17:31:20 2021 -0600 V3D: Add multiple primitives function to importv3d. commit bad1b04a2aaf6e21eacf07b046d99e07a839c18f Author: chaumont-arch Date: Tue Aug 3 00:18:26 2021 -0600 XASY: Set up work for adding 3d objects in the interface. commit 0689fcebfc49ac58f569ca0539a0c3f0134db5ae Author: John Bowman Date: Mon Aug 2 22:31:58 2021 -0600 V3D: Fix pixels. commit 66d0aa1f9b0dbf08e5aabab94fc94589a93347fe Author: John Bowman Date: Mon Aug 2 21:04:49 2021 -0600 V3D: fix hang with -V option. commit e6e9739dd37b9e47fb2af647398d83ee31618b48 Author: chaumont-arch Date: Sun Aug 1 17:27:25 2021 -0600 XASY: Add beta version of changing fill status. commit bb9bfde7ff2e0d881a8d493a9c67a2adf89a8523 Author: John Bowman Date: Sun Aug 1 11:35:26 2021 -0600 Support billboard labels. commit fb90ea9ec15ca2249dab02590a5fe15edcef5b4f Author: John Bowman Date: Sun Aug 1 11:29:32 2021 -0600 Support billboard interaction mode for general patches via render argument. commit 35aaf24d8bdf1db19ea001f88bfe44cecc6ec1ec Author: chaumont-arch Date: Sat Jul 31 22:26:39 2021 -0600 XASY: Fix closing bug. commit 32e4ede32ac0b9b74c5fbd65cd069f1720324348 Author: chaumont-arch Date: Sat Jul 31 22:11:45 2021 -0600 XASY: Change name of render mode. commit a6c2218a87ec02ba11ad96b2b520d40bf0650e9e Author: Supakorn Rassameemasmuang Date: Sat Jul 31 19:20:15 2021 -0600 V3D: Enable generation of surface lists. commit 45447153388fa3bf4ddef89cbc6871de92ebc4cb Author: Supakorn Rassameemasmuang Date: Sat Jul 31 19:14:53 2021 -0600 V3D: Enable reading color data. commit 4ca2bb85002f2cd5fb48d27fba0c533860e91945 Author: Supakorn Rassameemasmuang Date: Sat Jul 31 19:14:40 2021 -0600 V3D: Fix adding color information for v3d. commit 7b929621a7acbd322e6b2580c75cd7d39a5d4aef Author: Supakorn Rassameemasmuang Date: Sat Jul 31 18:44:02 2021 -0600 V3D: Add reading in center information to importv3d. commit 8908226e183dd6b8d71a0035e5e5506855d244c9 Author: Supakorn Rassameemasmuang Date: Sat Jul 31 18:43:44 2021 -0600 V3D: Add center information to v3d file. commit cc3ce0aef490a62b616b16ec9ea8330979b92d04 Author: Supakorn Rassameemasmuang Date: Fri Jul 30 22:00:13 2021 -0600 V3D: Add a draft v3d import script. commit 6d957f4d713ca58fa0a17f9a16ad04c11435ec1b Author: John Bowman Date: Fri Jul 30 18:08:50 2021 -0600 XASY: Standardize case. commit 0c81a76bb5a7546a1e75992c664512dd7b27f3e4 Author: John Bowman Date: Fri Jul 30 17:16:50 2021 -0600 Update demo. commit 4e4e49a9a39a108ab11cebe04309e78632649b5c Author: RubberNoodles Date: Fri Jul 30 13:21:45 2021 -0600 XASY: Fix crash on 'Exporting as Asy' for new files. commit 88a10b46356cf14d1ef91faeea7261f346b3a226 Merge: 63eea2141 9650c9989 Author: RubberNoodles Date: Fri Jul 30 13:16:58 2021 -0600 Merge branch 'Qt' of https://github.com/vectorgraphics/asymptote into Qt. commit 63eea2141b1fbb356542d18a4116969f899f8db0 Author: RubberNoodles Date: Fri Jul 30 12:06:56 2021 -0600 XASY: Add ability to cancel operation if file changed while making new file or loading file. commit 1ca12fe7d1217efb4eb6acc4bc7384fda41c6dbb Author: RubberNoodles Date: Fri Jul 30 11:48:50 2021 -0600 XASY: Change saving asy import file warning dialogue. commit 8b9d0d7e85a1a39e01fa2cb98885513eb73a3d87 Author: RubberNoodles Date: Fri Jul 30 11:45:50 2021 -0600 XASY: Move exportXasy code into xasyFile.py for modularity. commit cbbe012edfba70fdf101716d6e401e58ee72f7ca Author: John Bowman Date: Thu Jul 29 17:58:17 2021 -0600 V3D: Standardize element types. commit 3da65efbabfc69660b1616f28fe27a0582038301 Author: John Bowman Date: Thu Jul 29 17:38:14 2021 -0600 V3D: Update demo. commit 0a8cda8f9d0989c22b6325a841ca595d2197dd2f Author: John Bowman Date: Thu Jul 29 17:00:55 2021 -0600 Update asygl. commit d1c850efb3edd7d5cc07e2233f07358507668e12 Author: John Bowman Date: Thu Jul 29 16:55:39 2021 -0600 ASYGL: Reformat gl.js. commit 8f6820ed364f37e5cb669dd669e21c78111b986c Author: John Bowman Date: Thu Jul 29 16:44:53 2021 -0600 ASYGl: preallocate vertices array in Triangles. commit a5401fe15e3273d24ffa395f7670d74a1cebf7c2 Author: John Bowman Date: Thu Jul 29 17:00:55 2021 -0600 Update asygl. commit 466763c02e5e0e4c005465f463be69076f125927 Author: John Bowman Date: Thu Jul 29 16:55:39 2021 -0600 ASYGL: Reformat gl.js. commit b968e9311ccd087285c105539f8fd9b5f576b00f Author: John Bowman Date: Thu Jul 29 16:54:39 2021 -0600 Port to C++-11. commit f5c34d02ab5cf4514234b8b1dc33ec419c387934 Author: John Bowman Date: Thu Jul 29 16:44:53 2021 -0600 ASYGl: preallocate vertices array in Triangles. commit 9650c9989582f20a02c72668f303c71bab15080a Author: John Bowman Date: Thu Jul 29 11:41:11 2021 -0600 XASY: override outformat rather than entire user config file. commit 63112fceb984838facceef072c87d79d5be76eff Author: John Bowman Date: Thu Jul 29 11:38:20 2021 -0600 XASY: ignore user config file. commit cc7d93f40a7895cfc9599c9ada0f2655f4db7cee Author: John Bowman Date: Thu Jul 29 11:33:02 2021 -0600 Use single quotes. commit bd449cf33f10a9dad41e34b91dbf161ad429d093 Author: RubberNoodles Date: Thu Jul 29 02:00:42 2021 -0600 XASY: Ensure consitency of dialog for found identical files. commit 363acfd36317d6c46fc6fa12c01312bd980d2ad9 Merge: 3d91532e0 9161d8bfa Author: RubberNoodles Date: Thu Jul 29 01:51:40 2021 -0600 Merge branch 'Qt' of https://github.com/vectorgraphics/asymptote into Qt. commit 3d91532e0068d2679eea9f441d52159535d13a34 Author: RubberNoodles Date: Thu Jul 29 01:51:18 2021 -0600 XASY: Xasy file saves asy2psmap + fix actionSave() dialogs. commit 0ac652ef39eff2fbeb2cf31acce4691d4edf701e Author: RubberNoodles Date: Thu Jul 29 01:01:15 2021 -0600 XASY: Make saving xasy the default and remove previous link functionality. commit 9161d8bfae033bf1245785327904735e89ba0e3b Author: chaumont-arch Date: Wed Jul 28 23:30:52 2021 -0600 XASY: Add customizability to 3d rendering. commit feebc7304af30531b2749a5d15d2098531f14067 Author: Supakorn Rassameemasmuang Date: Wed Jul 28 18:32:07 2021 -0600 V3D: Unify v3d and jsfile to reduce code redundancy. commit d5644b3dc7dd8605eabf38be8ab870e5422b86e2 Author: RubberNoodles Date: Wed Jul 28 17:24:05 2021 -0600 XASY: Add ability to Export to Asy straight from file menu. commit 28cf5abe4ca5cd95687d6bfd9f7246ea1d2af811 Author: Supakorn Rassameemasmuang Date: Wed Jul 28 17:14:49 2021 -0600 V3D: Abstractize jsfile to abstract 3d out file. commit a8eb62ffff5002f40220c88522865746a005baed Author: RubberNoodles Date: Wed Jul 28 15:48:33 2021 -0600 XASY: Add ability to export to Asymptote file. commit 8ccc7c9139c022e412258cd4882c777ad3b94cbf Author: RubberNoodles Date: Wed Jul 28 15:07:42 2021 -0600 XASY: Save pen data (color/linewidth) into xasy file. commit 4903f5cd10db64a3cf535f766f44fc43e539c599 Author: RubberNoodles Date: Wed Jul 28 15:06:47 2021 -0600 XASY: Fix labels not being added with color. commit c4c749e854829467bcf0791d0cb9b0844f0acc19 Author: Supakorn Rassameemasmuang Date: Wed Jul 28 14:53:44 2021 -0600 V3D: Fix bezier triangle render function. commit d907057302a43768268b51a70c493cadb1680b37 Author: Supakorn Rassameemasmuang Date: Wed Jul 28 14:47:30 2021 -0600 V3D: Allow baking options in bezier triangles. commit 1cea79b09f410a04a6643e3f7ef846134c15ee01 Author: Supakorn Rassameemasmuang Date: Wed Jul 28 14:43:02 2021 -0600 V3D: Make BezierTriangle function standalone. commit 21ceb4e9c9bc1aef1318af9dad5b68d56e90f910 Author: Supakorn Rassameemasmuang Date: Wed Jul 28 14:11:28 2021 -0600 V3D: Enable baking patches option. commit 20eb389ef5bdb6fde4a4ce57b88fe423d6996b42 Author: Supakorn Rassameemasmuang Date: Wed Jul 28 14:11:15 2021 -0600 V3D: Enable rendering of raw vertexBuffer. commit 478e300281b1348add88364ceee0d89c103e2258 Author: Supakorn Rassameemasmuang Date: Wed Jul 28 13:58:30 2021 -0600 V3D: Encapsulate existing information on render to a parameter struct. commit 45910d98e58b274fb213f0208477c93e66fc5a1a Author: Supakorn Rassameemasmuang Date: Wed Jul 28 00:00:28 2021 -0600 V3D: Simplify V3D specs. commit 399bbb1bc618ccc05a3f7ecf33f574b21cf74c90 Author: RubberNoodles Date: Wed Jul 28 13:38:34 2021 -0600 XASY: Save xasyText to xasy file without going through asy script. commit b4041c7da61e56c27a6f1bad48f9e1174ef27fb4 Author: John Bowman Date: Wed Jul 28 01:03:25 2021 -0600 Add override qualifiers. commit 694b4cd9770eb597a7c19696e7fe997119273f46 Author: John Bowman Date: Wed Jul 28 00:32:44 2021 -0600 Port to clang under MacOS. commit 0a79d4e6f6cbb4f206c7703a02985bccf0926b69 Author: John Bowman Date: Wed Jul 28 00:11:26 2021 -0600 V3D: Infer number of control points from element type. commit b4739fee01e50b97b34fc7df9032afb33a467534 Author: Supakorn Rassameemasmuang Date: Tue Jul 27 22:20:48 2021 -0600 V3D: Allow rendering target to an arbitrary vertexBuffer. commit 12cfa6ed19f7be372faa9a132ff0b5c2d1f60a14 Author: Supakorn Rassameemasmuang Date: Tue Jul 27 18:05:08 2021 -0600 V3D: Dynamically add indices based on if they are distinct or not. commit 01fbf32a46bd1bd28178bb1f647a8243ed0931e3 Author: Supakorn Rassameemasmuang Date: Tue Jul 27 17:46:19 2021 -0600 V3D: Use operator<< for triple and prc::PRCColour. commit c4f171f513b5021c49453e8909d17e2e0039cd53 Author: RubberNoodles Date: Tue Jul 27 16:17:23 2021 -0600 XASY: Make add button naming conventions the same. commit dbac7243b20b8de74827a256146f6ae676c80982 Author: John Bowman Date: Tue Jul 27 09:29:29 2021 -0600 FILE: Fix bug #258: support compilation when COMPACT=0. commit dd0d7033a7c0ec45f3fc1fce12b89f7f0e4b6b43 Author: John Bowman Date: Tue Jul 27 00:48:06 2021 -0600 Patch lasy-mode to work with Emacs >= 23. commit c46633df7ff517701b488d60a55fb51755df6c87 Author: Supakorn Rassameemasmuang Date: Mon Jul 26 19:50:29 2021 -0600 XDR: Add triangles to v3d file. commit 35ee832a48783d2378adb508ca0724b0058de7be Merge: 3a338ba8a 04a5d074d Author: John Bowman Date: Mon Jul 26 17:32:37 2021 -0600 Merge branch 'v3d' of ssh://cascade.math.ualberta.ca/git/asymptote into v3d commit 3a338ba8a4b30c24d9033fa94b8a7eabebd7570e Author: John Bowman Date: Mon Jul 26 17:32:31 2021 -0600 Update v3dstd.md. commit 70e3a5e2e53a3a8d028b8807f8bc5d124ca3ba57 Author: chaumont-arch Date: Mon Jul 26 17:16:10 2021 -0600 XASY: Update icon clicking statuses. commit 0c74479fa00167fa0b5da22e927eb505019eb3f4 Author: chaumont-arch Date: Mon Jul 26 16:32:18 2021 -0600 XASY: Set translate mode to be default state. commit 04a5d074d6496a8eb9bbe4b772d5c27f8cdbfe87 Author: Supakorn Rassameemasmuang Date: Mon Jul 26 16:15:26 2021 -0600 V3D: Add options for other primitives. commit 461d011a67fff47587e5ea4757aebc237cae2446 Author: Supakorn Rassameemasmuang Date: Mon Jul 26 16:15:13 2021 -0600 V3D: Add oxstream values for rvalue. commit 5df8b4e8e430e5808c7da03b37737bc3127c0f32 Author: chaumont-arch Date: Mon Jul 26 16:08:31 2021 -0600 XASY: Fix save prompt mid-edit. commit b64c1f1a95361a0dd0aeeb599418a7647ad3c0f3 Author: Supakorn Rassameemasmuang Date: Mon Jul 26 14:50:32 2021 -0600 V3D: Support bezier triangles. commit cfc1559b82cf43958b56b566656a8b92f7ec2795 Author: Supakorn Rassameemasmuang Date: Mon Jul 26 14:19:14 2021 -0600 MAKE: Add v3dfile to makefile. commit da012aee1fbfa2448fd9dec6a39d465ec7493011 Author: Supakorn Rassameemasmuang Date: Mon Jul 26 14:19:06 2021 -0600 ASY: Set format as v3d in three.asy. commit e8d02dadc8beec57e6fdf6bc2c2929a0a3bd453e Author: Supakorn Rassameemasmuang Date: Mon Jul 26 14:18:53 2021 -0600 V3D: Add support for bezier patches to v3d. commit a42c801b4bd00e36741fdd9f2f64ff9c993c8112 Author: Supakorn Rassameemasmuang Date: Mon Jul 26 14:17:36 2021 -0600 V3D: Add v3dfile class. commit 1fc32e3b49fad691b5c34c2654794aa1d8da3321 Author: Supakorn Rassameemasmuang Date: Mon Jul 26 14:17:04 2021 -0600 XDR: Add vector and array xdr packing. commit 9ead0267da5fbc0b6a1fcad95c4921e1e326d65f Author: RubberNoodles Date: Mon Jul 26 12:16:59 2021 -0600 XASY: Check if file does not exist when loading file from command line. commit d17303f0fd9e14dfbf2923ab580de1fac2b4adf0 Merge: 51367354c 17c8855b0 Author: RubberNoodles Date: Mon Jul 26 12:12:32 2021 -0600 XASY: Merge branch 'Qt' into 'Qt'. commit 51367354ca25fd96fd39f572ae246e47fc345181 Author: RubberNoodles Date: Mon Jul 26 12:10:11 2021 -0600 XASY: Opening files from command line now the same as in-app file loading. commit 6f73ced1b1db27e4880b5aad95682a47325337c6 Author: RubberNoodles Date: Mon Jul 26 11:51:55 2021 -0600 XASY: Change save to open dialog for default .xasy save. commit 17c8855b0acc7b736700ac4f7964486a7106781a Merge: 2a9d492d0 9e6ef1e0b Author: chaumont-arch Date: Mon Jul 26 11:21:12 2021 -0600 Merge branch 'Qt' of https://github.com/vectorgraphics/asymptote into Qt commit 2a9d492d0a1e43806b2c552c4d044edc417af129 Author: chaumont-arch Date: Mon Jul 26 11:20:53 2021 -0600 XASY: Fix magnification error in bezier editor. commit 9e6ef1e0bbf41279563a02fc452c5f957cdc6906 Author: John Bowman Date: Mon Jul 26 11:19:31 2021 -0600 Force rendering of 3D objects. commit af78f0e9d7d2bd19c15854fcaa739ff887734f3a Author: RubberNoodles Date: Mon Jul 26 11:05:46 2021 -0600 XASY: Remove debugging code & prevent .xasy load crash. commit adb4b1d1931ca4450a8833e98294ad78239b1ac4 Author: RubberNoodles Date: Mon Jul 26 00:41:27 2021 -0600 XASY: Handle undo from accepted edits in Edit Mode (i.e. controls/nodes). commit 11af899bc8fd2396c5a511201149bf98371b6f72 Author: RubberNoodles Date: Sat Jul 24 23:51:31 2021 -0600 XASY: Re-add code in 32cdfc22, deleted accidently in 14dfff01. commit 5415ca365f5c4bfee018cfa492d89cbfcab833ee Author: RubberNoodles Date: Sat Jul 24 23:36:34 2021 -0600 XASY: Fix exporting recently made xasy objects to both .asy and .xasy. commit e6541aa352cb6b65a82057b24ad08158bd7804fc Author: RubberNoodles Date: Sat Jul 24 19:56:34 2021 -0600 XASY: Create handler for loading legacy .xasy files. commit 7ff8049248cecd24b1c24139b72abbb8512d3dd5 Author: RubberNoodles Date: Sat Jul 24 19:38:42 2021 -0600 XASY: Add linked .asy file on title when editing .xasy file. commit 52cd9e7c2499fb6c8a6e9a57417a73b73ef31687 Author: RubberNoodles Date: Sat Jul 24 19:09:30 2021 -0600 XASY: Delete duplicate objects if user saved new objects to both .asy and .xasy. commit c854dd2c6bf04d0e3d48c65cc51831a6a281f5b5 Author: RubberNoodles Date: Sat Jul 24 01:54:05 2021 -0600 XASY: Load xasyScript object directly from linked .asy file while loading from .xasy. commit 8a650dc18fdd0989fc1f1879a2952d0dbeef2182 Author: John Bowman Date: Fri Jul 23 23:30:09 2021 -0600 Use pointer for WebGL cursor. commit e2640c1a08838801bed347122b0dfbd3c9b700c0 Author: John Bowman Date: Fri Jul 23 17:32:48 2021 -0600 Add preliminary v3d standard. commit 8c1d863d3c332b91490598c84d9bcc51ff9bb37d Merge: cfd3121e4 c84c526ae Author: John Bowman Date: Fri Jul 23 16:42:22 2021 -0600 Merge branch 'master' into v3d. commit b8d4e3a39f9b5acc99e0219954139f5fe0b64a82 Author: RubberNoodles Date: Fri Jul 23 15:26:50 2021 -0600 XASY: Save .asy objects into linked .asy file when saving via .xasy. commit 14dfff01756801fe1f30f98f9bc6d7683f476b45 Author: RubberNoodles Date: Fri Jul 23 13:19:23 2021 -0600 XASY: Save corresponding .asy file on .xasy save + typo fixes. commit c84c526ae94c420b0555ef33c2c37fc2177f34d7 Author: John Bowman Date: Thu Jul 22 11:35:52 2021 -0600 Update documentation. commit edfcc7bf88f0c1054d77a99bdaaf0d9acc8d1230 Author: chaumont-arch Date: Thu Jul 22 00:31:30 2021 -0600 XASY: Fix some drawing issues with the bezier editor. commit 5d5c43d366f876a28472c71838726294e4086efc Author: chaumont-arch Date: Tue Jul 20 22:07:02 2021 -0600 XASY: Add more possible messages to the status bar. commit 32cdfc22ddbd02f779296db7db72f19713e51b8e Author: chaumont-arch Date: Mon Jul 19 11:13:13 2021 -0600 XASY: Fix closing bug. commit b8b046786d83fcc8f1728c2c084a4718ed8c13b4 Author: chaumont-arch Date: Mon Jul 19 11:08:05 2021 -0600 XASY: Fix Bezier editor transform bug. commit ad84064b6721d033ea95ece4aa7702bd99ed5f29 Merge: 86c8c7924 f69347fe1 Author: John Bowman Date: Mon Jul 19 10:42:16 2021 -0600 Merge branch 'Qt'. commit 86c8c7924bbf1c85d64f2b0939c2f70e5d614044 Author: John Bowman Date: Sat Jul 17 12:43:59 2021 -0600 Fix last revision. commit 92f6ecaed7ed3a90a3a83511fb26b153ce6f6bf6 Author: John Bowman Date: Sat Jul 17 01:08:41 2021 -0600 TRANSPARENCY: Fix bug #253. commit 895c90e88d01515a784be33fc9c7923b1bfbe408 Author: Supakorn "Jamie" Rassameemasmuang Date: Sat Jul 17 00:25:13 2021 -0600 LSP: Properly stop DFS search if getExternalRef is empty (i.e. file does not exist). commit 34782cd981a38d9e7387f3c6a48c98e1905a8688 Author: Supakorn "Jamie" Rassameemasmuang Date: Sat Jul 17 00:17:37 2021 -0600 LSP: Skip BFS step if file fails to parse. commit 0a4009bde77cfaeb5003040f73a92f5e6d4c3013 Author: Supakorn "Jamie" Rassameemasmuang Date: Sat Jul 17 00:15:37 2021 -0600 LSP: Refine checks for virtual files: settings and gsl. commit b16efc20fdb0d22eb51bd2c250a0f924e1772138 Author: John Bowman Date: Fri Jul 16 20:23:24 2021 -0600 Fix segmentation fault. commit 9893e3d6a11d3c1c5169da4fd66d074e54ebf0e5 Author: Supakorn Rassameemasmuang Date: Thu Jul 15 23:23:51 2021 -0600 LSP: Exclude settings from search traversal. commit a939cea6be4b5e31ec0298b8d43a0ce26058a24e Author: John Bowman Date: Thu Jul 15 18:08:42 2021 -0600 Distinguish between std::string and mem::string. commit fa5598cf9efccf17c9a8e2da31ee96d7a1b753d6 Author: John Bowman Date: Thu Jul 15 00:45:42 2021 -0600 Work around null pointers. commit f69347fe1a84d77c7c024e6e453066140c224152 Author: RubberNoodles Date: Wed Jul 14 23:01:15 2021 -0600 XASY: Implement 'New File' functionality. commit ec6fcb25edeba2b88d19d91b05c4eaedbb99a5a5 Author: John Bowman Date: Tue Jul 13 22:26:22 2021 -0600 Make lspport and lsphost environment settings. commit 4dc77c0eed54202ccafdbea6db7a851463e900d4 Merge: 224a60e71 9cae116c1 Author: RubberNoodles Date: Tue Jul 13 15:05:43 2021 -0600 Merge branch 'Qt' of https://github.com/vectorgraphics/asymptote into Qt commit 224a60e7195965740ac3b4e647192a8780c0ac80 Author: RubberNoodles Date: Tue Jul 13 15:05:36 2021 -0600 XASY: Remove window1.ui debugging code. commit 9cae116c1af47da0d237693e541fe20b347f7cb9 Author: chaumont-arch Date: Tue Jul 13 15:02:34 2021 -0600 XASY: Restores fixes with bounding box. commit 33fc5d9246c23ec1dab506fe302cbecf83f90831 Author: chaumont-arch Date: Tue Jul 13 12:35:00 2021 -0600 XASY: Fix tool tip name. commit 158b39a6a3f38d0f04a71a840bcc951940504176 Author: RubberNoodles Date: Tue Jul 13 00:15:29 2021 -0600 XASY: Fix crash on clearing recently opened menu. commit 63be9dc26f51af40d4d9430a29880cc4ce2e9777 Author: Supakorn Rassameemasmuang Date: Mon Jul 12 20:14:19 2021 -0600 LSP: Use unique_ptr instead of manual new/delete initialization of remote end point. commit 5dc62f6c3c445077ff5782c9c3d53511b3fba90e Author: RubberNoodles Date: Mon Jul 12 18:12:26 2021 -0600 XASY: Remove debugging code for .xasy binaries. commit c51dc292f0495aefefc6eff147aadff2204f5094 Author: RubberNoodles Date: Mon Jul 12 18:01:29 2021 -0600 XASY: Include .xasy binary export into main save/load flow. commit bacaf250eadf77a64ad6e4c05cd7a772d5a86868 Author: chaumont-arch Date: Mon Jul 12 16:48:17 2021 -0600 XASY: Fix translation bounding box issue. commit 884f7ccf9e670e848ef7d5a8cdac44641677238b Author: Supakorn Rassameemasmuang Date: Mon Jul 12 14:35:02 2021 -0600 CXX: Set all errors to const& and exceptions from std::exception. commit bfb52602761c2fd0abaf4ac9da54e784828cd765 Author: Supakorn Rassameemasmuang Date: Mon Jul 12 14:31:43 2021 -0600 LSP: Split Asymptote LSP Server into separate stdio/tcp components. commit 5a8403f3e22a568fc0e90c77134a0a36f93f18e5 Author: RubberNoodles Date: Mon Jul 12 14:17:03 2021 -0600 XASY: Include transformations into .xasy binary export/import. commit 15f814e7a6c8d897e10bec86a9dd15937c6abf2e Author: RubberNoodles Date: Mon Jul 12 13:58:48 2021 -0600 XASY: Reverse previous bounding box calculation change. commit 4d38b8ecc211b7ad73910b91d1333aa6a2263a00 Author: John Bowman Date: Mon Jul 12 09:48:52 2021 -0600 Update year. commit ed73fd37a91dd6827a4bf1e9be2bde37f666eaa8 Author: John Bowman Date: Sat Jul 10 23:15:33 2021 -0600 Remove unused code. commit ad6f30f006b1bb277ec7d241c1696073c80a4d34 Author: Supakorn Rassameemasmuang Date: Sat Jul 10 15:26:04 2021 -0600 BUILD: Change C++ standard to -std=c++17. commit e3fc67832f9e3336234de399f8402d16d6ec2270 Author: Supakorn Rassameemasmuang Date: Sat Jul 10 15:24:47 2021 -0600 LSP: Make mem::string explicit in dec.h. commit aa1ff6b608b06642d1103a1f0474c1a7992caa8f Author: RubberNoodles Date: Fri Jul 9 13:04:24 2021 -0600 XASY: Include saving xasyScript and xasyTest while exporting to *.xasy binary. commit 9dfeff919260de7bc32acbd898abf944c7009c7c Author: RubberNoodles Date: Fri Jul 9 13:01:13 2021 -0600 XASY: Break xf.saveFile function into creating and writing the asy string. commit b5da1baeb9fb335d28a802acc2042cb93aa8e612 Author: Supakorn Rassameemasmuang Date: Thu Jul 8 16:37:26 2021 -0600 LSP: Search through struct declarations for functions. commit 4f85dfc3d70a0287dd93141dd0996fd1275e0a29 Author: Supakorn Rassameemasmuang Date: Thu Jul 8 15:50:43 2021 -0600 LSP: Search unravel struct values alongside filenames. commit 7d158258b3ac1e6adc07aa2890d776d361af0854 Author: Supakorn Rassameemasmuang Date: Thu Jul 8 15:44:26 2021 -0600 LSP: Check if unravel values is a fileId. commit 41f9ca54b1cb64ff597fff41f6df08c0662e9c9f Author: chaumont-arch Date: Wed Jul 7 20:47:04 2021 -0600 Fix bounding box pen glitch and remove unused code. commit 74ecf40126466d16c20a26afeab1e84deb321757 Author: RubberNoodles Date: Wed Jul 7 19:46:07 2021 -0600 XASY: Add testing functions for export into .xasy binary. commit 546a841ba755f7696972438016f4b82251d98513 Author: RubberNoodles Date: Wed Jul 7 19:41:57 2021 -0600 XASY: Fix typo and makePenCosmetic issues. commit 7f08ed403043840051fd78a1d93c2e02e6cad3d6 Author: RubberNoodles Date: Wed Jul 7 19:39:41 2021 -0600 XASY: Set-up framework for export to .xasy binary. commit 8a06b5701099e1941d8ea61acfcb27f039619f6a Author: Supakorn Rassameemasmuang Date: Wed Jul 7 15:46:50 2021 -0600 LSP: Search from access declarations for functions. commit 2fbdcbee88202969b31f2c52a4cf344d326c30e7 Merge: cb0f82f3b 20e1d214e Author: Supakorn Rassameemasmuang Date: Wed Jul 7 14:36:20 2021 -0600 Merge branch 'lsp' of github.com:vectorgraphics/asymptote into lsp commit cb0f82f3bc1d60d3217c1ad744b9dd551cc41ee1 Author: Supakorn Rassameemasmuang Date: Wed Jul 7 14:35:07 2021 -0600 LSP: Append the directory of the file to Asymptote's search path. commit 5ff8870351dda4586c6398b1245b10c78674c7b6 Author: Supakorn Rassameemasmuang Date: Wed Jul 7 14:34:19 2021 -0600 LSP: Search "from" access declarations for variables. commit a1038310513b1b4c1025d8e98b30da0d68eeba27 Author: Supakorn Rassameemasmuang Date: Wed Jul 7 14:29:05 2021 -0600 LSP: Enable recording of from declarations access. commit 9460297463f97d30aeba20d0669a24b74713538a Author: Supakorn Rassameemasmuang Date: Wed Jul 7 14:28:32 2021 -0600 LSP: Add general processing list function. commit be32229b074117fc2c44d7023f1162fbff21d78c Author: RubberNoodles Date: Tue Jul 6 17:29:55 2021 -0600 XASY: Replace undo/redo icons. commit ce507966cfd81f01e62fd6a066ae0a307a46e31e Merge: 3726940ad 2fe124e73 Author: RubberNoodles Date: Tue Jul 6 13:38:31 2021 -0600 XASY: Merge bounding box change with last commit. commit 2fe124e733c9d3e9accdf290d2463dbece1975ce Author: chaumont-arch Date: Mon Jul 5 10:46:38 2021 -0600 Fix bounding box branching. commit 20e1d214eb06570fed06aa4b26264a64a50362d8 Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Jul 2 16:37:16 2021 -0600 LSP: Add symbolmaps to Makefile temporarily. commit 9a94a6e4978fa677c5344bdb7c828b523a1eb0bd Author: Supakorn Rassameemasmuang Date: Fri Jul 2 15:35:10 2021 -0600 LSP: Enable symbol context search for access declarations. commit d43f8971b3c9de2bb8a67e33b686dc711910cc29 Author: Supakorn Rassameemasmuang Date: Fri Jul 2 14:35:49 2021 -0600 REPO: Update vscode settings to disable js format and python language server. commit a6a88e866411b88ec8038fc28f5173824c7f3a67 Merge: e38a3c3f7 84451cf2d Author: John Bowman Date: Fri Jul 2 12:51:24 2021 -0600 Merge pull request #255 from Honghe/patch-1 Update asymptote.texi. commit 84451cf2def1d149e6c4b26046263983ac58fd41 Author: Honghe Date: Sat Jul 3 00:00:31 2021 +0800 Update asymptote.texi `GSView 6.0` is end of life. `Sumatra PDF` can auto reload when the `.eps` is changed, and supports latest Ghostcript 9.54+. https://forum.sumatrapdfreader.org/t/ghostscript-not-working-error-loading-on-ps-files/3826 https://github.com/sumatrapdfreader/sumatrapdf/commit/5a295db98381f925aa81d13988ffadf74953b8de commit 2a41b3468a2aeb18575b6cf5e54e1460eac94b72 Author: Supakorn Rassameemasmuang Date: Wed Jun 30 17:17:15 2021 -0600 LSP: Centralize the logging process for LSP. commit 71bfb9ae3c11d31cea544632d7d9439de1cfba9f Author: Supakorn Rassameemasmuang Date: Wed Jun 30 16:40:51 2021 -0600 LSP: Remove filename from update file contents table. commit bfdf27e8c3ec27ac20bf7e317fa683e1a00e0c99 Author: Supakorn Rassameemasmuang Date: Wed Jun 30 16:40:14 2021 -0600 LSP: Start in IO mode without tcp. commit 1a5d0f0e5c9ac0a5c484a18e781252b3dd3a9308 Author: Supakorn Rassameemasmuang Date: Wed Jun 30 16:39:58 2021 -0600 LSP: Add StartIO mode for production. commit 7641b7ff4c18289d464d09b44414600c6dc88212 Author: Supakorn Rassameemasmuang Date: Wed Jun 30 16:38:57 2021 -0600 LSP: Fix the initialization of NullResponse in shutdown request. commit ee5284574753a06d309d39a685db9c740d7a87f8 Author: Supakorn Rassameemasmuang Date: Wed Jun 30 16:24:55 2021 -0600 LSP: Log level based on asymptote verbosity. commit 7131a2a5ef504c5178b875911dfff62f5ed03ab2 Author: Supakorn Rassameemasmuang Date: Wed Jun 30 16:24:20 2021 -0600 LSP: Add onClose and onExit notification. commit 702a2344c7354fbc2dd79abea747d9f8236db9bd Author: Supakorn Rassameemasmuang Date: Tue Jun 29 16:01:19 2021 -0600 LSP: Enable gc thread registration. commit 593e6337348fcca451a16ee64a906b2c80a9b9f1 Author: Supakorn Rassameemasmuang Date: Tue Jun 29 16:01:03 2021 -0600 LSP: Add LSP port and host option for tcp. commit ec04bce3d635af4efd6acc02ea5339104907ad99 Author: Supakorn Rassameemasmuang Date: Tue Jun 29 15:52:19 2021 -0600 LSP: Fetch multiple definitions for functions. commit 3726940ad274b9c6fd96cbb98e5b7e274148ad84 Author: RubberNoodles Date: Tue Jun 29 13:13:28 2021 -0600 XASY: Fix typo on self.ui.txtLineWidth. commit 0fa72a41d4cb04feca7f7be71c2598b11692542f Author: RubberNoodles Date: Tue Jun 29 13:12:43 2021 -0600 XASY: Make bounding box calculation factor in pen line width. commit 7d193e5188cf12035b4d50090e3534abb2e42e69 Author: Supakorn Rassameemasmuang Date: Mon Jun 28 18:49:22 2021 -0600 LSP: Add the file's directory to the search path during symbol map construction. commit 3e161069eeb6c500f9e8cc47b239a9f6f691ed7b Author: Supakorn Rassameemasmuang Date: Mon Jun 28 18:48:53 2021 -0600 LSP: Update file contents on change if applicable. commit 06f7086af1f839e36b69d61c0cfd2329554cbb4a Author: Supakorn Rassameemasmuang Date: Mon Jun 28 18:42:15 2021 -0600 LSP: Enable full search of access and struct symbols. commit df92e1dfd81f33805ce3b59b71b800381dacb47d Author: Supakorn Rassameemasmuang Date: Mon Jun 28 18:38:31 2021 -0600 LSP: Add unravel ids to SymbolMaps. commit 249ce56ae2f13aee520ef22d21a640ce6f42c19b Author: Supakorn Rassameemasmuang Date: Mon Jun 28 18:36:29 2021 -0600 LSP: Move external reference data to a separate struct. commit 97513e53db27f902e9a79b6464751eff71b1c567 Author: Supakorn Rassameemasmuang Date: Mon Jun 28 13:45:50 2021 -0600 PEN: Add rgba function to plain_pens.asy. commit 7f9811bae2afd80dd7efbe92e101145f5b39617a Author: Supakorn Rassameemasmuang Date: Fri Jun 18 22:47:55 2021 -0600 PARSER: Move icode and istring to header for accessibility. commit 0490c9d64ba49fe688cc9521947249c0d7f31e4d Author: Supakorn Rassameemasmuang Date: Fri Jun 18 22:26:20 2021 -0600 LSP: Handle crude document color request. commit 55b8c513140ca0475f786869bb8d516a036b4faf Author: Supakorn Rassameemasmuang Date: Fri Jun 18 22:25:35 2021 -0600 LSP: Extract out the SymContextPtr* fetch process. commit f249b2d8ea8275aba93050b3c82f48629f9b1420 Author: Supakorn Rassameemasmuang Date: Fri Jun 18 22:22:27 2021 -0600 LSP: Clean up SymContextInfo. commit e38a3c3f7318691fadfde0cb3864687f48428aa6 Author: John Bowman Date: Sat Jun 26 16:18:56 2021 -0600 Upgrade from ocgx to ocgx2. commit 8da12dc8ad0f4e56f0c0bd8f7300e9d3d4770572 Author: John Bowman Date: Fri Jun 25 14:23:59 2021 -0600 Upgrade from ocg to ocgx. commit 40022b3d35bd8321be2a86c8fc53bacf69eed787 Author: RubberNoodles Date: Mon Jun 21 22:52:41 2021 -0600 XASY: Change title when file is modified. commit 618d74c8f63bf8d419b40b400be9e4fc3a906d2e Author: RubberNoodles Date: Mon Jun 21 22:28:36 2021 -0600 XASY: Update TODO comments. commit a0b6f422ee0e37705459246ccf04f3f73d538562 Author: RubberNoodles Date: Mon Jun 21 22:17:36 2021 -0600 XASY: Place xasyrecents.txt in ~/.asy folder along with other config files. commit ea62ca6f1e96938200f55125865bd30855cd0149 Author: RubberNoodles Date: Mon Jun 21 22:16:46 2021 -0600 XASY: Fix recently opened QActions from menu not linking to correct file. commit 3cad6938e2d4f8cf03b6e23dfb682e3a433d731d Author: Supakorn Rassameemasmuang Date: Fri Jun 18 22:17:55 2021 -0600 LSP: Add retrieval of color information from exp. commit f9fc032ab1df26434649f6ee0000fbc68750b184 Author: Supakorn Rassameemasmuang Date: Fri Jun 18 22:14:09 2021 -0600 LSP: Fix decid createSymMap with type. commit 3ad2a131e12979daa5cea59bbd012ac8fa70b49f Author: Supakorn Rassameemasmuang Date: Fri Jun 18 22:13:43 2021 -0600 LIB: Update LspCpp library to use boost::optional. commit afa8dfd2c8d87b27ab8e8a678fff46fea0a6dd44 Author: RubberNoodles Date: Thu Jun 17 19:51:32 2021 -0600 XASY: Delete extraneous code on freehand drawing handler. commit faf82d60feca29fdcc5a8ab5d7aec71d09071ead Author: RubberNoodles Date: Thu Jun 17 19:28:24 2021 -0600 XASY: Add placeholder function for freehand draw tool. commit 95e4a77a87a8deb4d9168b65fa36e59c4e06fe78 Author: RubberNoodles Date: Thu Jun 17 18:31:45 2021 -0600 XASY: Connect freehand drawing button on UI to to-be-implemented action handler. commit 75799ae0a1e079429021d7fc8cf402f747155bd2 Author: RubberNoodles Date: Thu Jun 17 18:23:37 2021 -0600 XASY: Change icons.qrc to include brush svg. commit 988439ac7dc406dcd0507b488e741f4b6b474de0 Author: RubberNoodles Date: Thu Jun 17 17:44:14 2021 -0600 XASY: GUI elements for freehand drawing. commit 3c7c07b2c47919c22a93774f8728db9514952e92 Author: RubberNoodles Date: Thu Jun 17 11:27:54 2021 -0600 XASY: Add TODO comment and recent.txt file in config directory. commit 26cc499ee03aa3200531282a67c41d94fffd0394 Author: RubberNoodles Date: Thu Jun 17 11:13:22 2021 -0600 XASY: Open recent class to handle paths commit 0f41b3af1bea5ad1c88c740502ee52b369e922e8 Merge: 8dfb98bc5 0d7992042 Author: RubberNoodles Date: Thu Jun 17 11:11:11 2021 -0600 Merge branch 'Qt' of https://github.com/vectorgraphics/asymptote into Qt commit 8dfb98bc5bb4f5e9acb1a93d358cbe3592506a91 Author: RubberNoodles Date: Thu Jun 17 11:11:03 2021 -0600 XASY: UI elements for menu of recently opened files. commit 0d7992042bf973680d8c5e3b876fba156c885821 Author: chaumont-arch Date: Mon Jun 14 00:00:46 2021 -0600 Fix bounding box sizing issue. commit f0b6d339c51a7d02176400fe2de468b58f4752a0 Author: chaumont-arch Date: Sat Jun 12 01:17:45 2021 -0600 Fix bounding box drawing under scaling. commit 99cadc21e19a82eddbcd54b84b19cf0aa14c70d6 Author: chaumont-arch Date: Sat Jun 12 00:49:01 2021 -0600 Fix line thickness of objects after magnification. commit 48af59ba9e87c530c260886ceb0ec168ed9ea87c Author: Supakorn Rassameemasmuang Date: Fri Jun 11 16:10:30 2021 -0600 LSP: Add createSymMap for range-based for loops. commit 01aefbdb8a911bad63c5d67b05db61990b82d9a9 Author: Supakorn Rassameemasmuang Date: Fri Jun 11 16:10:13 2021 -0600 CXX: Format code files and add attributes. commit 8812cf49fe43371bac49d6480b838e595e87672a Author: Supakorn Rassameemasmuang Date: Fri Jun 11 16:09:08 2021 -0600 LSP: Add signature searching of struct contexts. commit 33db4bbc39ef70f55ff14564dc20ac5407c3d20c Author: chaumont-arch Date: Fri Jun 11 02:32:37 2021 -0600 Fix some scaling bugs. commit 3b7bef84dec6b9b09e294f2d018abae9f6ee4daa Author: Supakorn Rassameemasmuang Date: Mon Jun 7 23:39:10 2021 -0600 LSP: Allow for multiple functions loading in hover request. commit f1f36b434958c125be2c110c81c52ae3266df1b0 Author: RubberNoodles Date: Mon Jun 7 16:31:01 2021 -0600 XASY: Change MainWindow1.erase() to fix crashing after opening a file then undo. commit e8f7946db8ac78ef73a64ff2cfe50daffd6048e2 Author: RubberNoodles Date: Mon Jun 7 15:42:03 2021 -0600 XASY: Make undo/redo menu button available after script object delete. commit 190676f02243ba514a4dad351a5834921d6469a7 Author: RubberNoodles Date: Mon Jun 7 15:01:20 2021 -0600 XASY: Change softDelete key name, and ncrease readibility on UI of addPolyOpt menu. commit 9be0e9269b1dca5eb651bca81b45d46cff046081 Author: RubberNoodles Date: Mon Jun 7 13:01:42 2021 -0600 XASY: Fix undo/redo for deleted objects imported from .asy scripts. commit 170743bcf5a9b00c8173059acdd96227676762e9 Author: RubberNoodles Date: Mon Jun 7 12:06:32 2021 -0600 XASY: Fix untransformed deleted objects not saving commit 5f3e93cd8118118154e97c8d3743998b668bfee8 Author: chaumont-arch Date: Mon Jun 7 09:01:27 2021 -0600 Fix line thickness issue with scaling. commit 21bafac812f6a9d0a28c64666db0572ac6e06ec4 Author: chaumont-arch Date: Fri Jun 4 21:29:55 2021 -0600 Fix exit error on startup. commit 138dc26012377f36b9b8a5a4457e5095a2ee70ae Author: chaumont-arch Date: Fri Jun 4 21:24:24 2021 -0600 Add cancel feature to exit box. commit 74f24be64e1a18b8aa30424400eef5db718186c8 Author: Supakorn Rassameemasmuang Date: Fri Jun 4 15:15:42 2021 -0600 LPS: Enable searching in external file locations. commit a517a4349086d6765bf5b0bb2b7bf383ee01775b Author: Supakorn Rassameemasmuang Date: Fri Jun 4 15:14:43 2021 -0600 LSP: only recurse statements if value is not null. commit aa5f5aecac3e399dda3e39eecfa67b82bc814b0b Author: John Bowman Date: Thu Jun 3 22:13:51 2021 -0600 FILE: Fix bug #247. commit 638206d86745878a746548d9ecc2d5fb1945d725 Author: RubberNoodles Date: Thu Jun 3 21:18:06 2021 -0600 fixed: undo create object crashes if selected object is deleted commit 8e95228aff14dbd37821bca7b519a20d4bcc73f5 Merge: 0442d6c42 c195c1fc4 Author: John Bowman Date: Thu Jun 3 14:03:32 2021 -0600 Merge branch 'Qt'. commit c195c1fc4c5b0631aae84cc75b3b9bf27da677e5 Merge: bbacc4f87 ded4ea860 Author: John Bowman Date: Thu Jun 3 13:55:00 2021 -0600 Merge pull request #249 from vectorgraphics/Qt-macos-accessibility Qt macos accessibility commit ded4ea8607cf1478871d6c1b9b951773b8e177b3 Author: RubberNoodles Date: Thu Jun 3 13:19:57 2021 -0600 accidental change to QMenuBar height commit ea63eb31c5925a01ea3219bead12dc6725201ec6 Author: RubberNoodles Date: Thu Jun 3 13:10:37 2021 -0600 changed git ignore to include python virtual environment commit 0433358c31035f123a8c2d9a0e4f304197b3030f Author: RubberNoodles Date: Thu Jun 3 13:08:38 2021 -0600 Added possibility of keyboard focus on main screen so textbox shortcuts don't override global ones commit bbacc4f870f38222dff57f6de82d053a813b1cea Author: chaumont-arch Date: Thu Jun 3 12:28:04 2021 -0600 Fix issues with checking buttons. commit 0442d6c4230ad48cd793f661812a17a106bfb17d Author: John Bowman Date: Wed Jun 2 17:31:15 2021 -0600 Update example. commit 7a46888f213770564bfbcf38fe63dda320393e1c Author: RubberNoodles Date: Wed Jun 2 13:25:42 2021 -0600 fixed btnAlignX/Y not showing on Mac due to insufficient container width commit 76702591d248278c20260206bd1d8f6bff27993a Author: John Bowman Date: Tue Jun 1 13:13:31 2021 -0600 Force all threads to return error code. commit 0caac12482845a6d450730a76c6fc658c3475505 Author: John Bowman Date: Mon May 31 10:09:39 2021 -0600 Fix Y icon font. commit 4c83ba7857355dca85fc8c2c6bbbb83f8d4e3cd7 Author: John Bowman Date: Mon May 31 10:09:39 2021 -0600 Fix Y icon font. commit 15d3f030d7ec999213a8aaa75b9de42487485a2a Author: chaumont-arch Date: Mon May 31 09:20:51 2021 -0600 Fix saving prompts and add hotkeys. commit 2ae710ed1822dc925f09a4f27ea895b9f7df3bdb Author: Supakorn Rassameemasmuang Date: Thu May 27 15:36:42 2021 -0600 LSP: Simplify hover requests and enable signature lookup. commit b0524e3dd020c76d0a49cb2bdd3cfb6f28131d6c Author: Supakorn Rassameemasmuang Date: Thu May 27 15:35:22 2021 -0600 LSP: Add fromMarkedStr for asymptote labelling. commit 2de9f75df81a4506b8748a58b15f3a99916975b0 Author: Supakorn Rassameemasmuang Date: Thu May 27 15:34:42 2021 -0600 LSP: Build tree on open/save. commit 4b9bebd7df6a74706c803ad2c3ed57f562a32627 Author: Supakorn Rassameemasmuang Date: Thu May 27 15:34:06 2021 -0600 LSP: Allow for type-searching in LSP lookup. commit 8e390ad19a5aab015f1501f07793a49f90ad7c29 Author: Supakorn Rassameemasmuang Date: Thu May 27 15:32:19 2021 -0600 LSP: Add FunctionInfo struct to LSP. commit b94942859d268e7fc12f6e846dfb586f1a7b51a9 Author: Supakorn Rassameemasmuang Date: Thu May 27 15:27:46 2021 -0600 LSP: Support exp statements createSymMap. commit 97926071c5b5e698192dfcd30d0be92df904ff22 Author: John Bowman Date: Thu May 27 14:10:15 2021 -0600 Fix bitwise negation operator. commit d4a09ce89a8d3541ef2f26e844db68f504bef8fe Author: Supakorn Rassameemasmuang Date: Wed May 26 13:57:22 2021 -0600 LSP: Support goto definitions. commit 5000b66451ff5bb88316fe68bc826c79c2894c81 Author: Supakorn Rassameemasmuang Date: Wed May 26 13:55:48 2021 -0600 LSP: Add createSymbolMaps for more statements. commit e312cdf36414011f635329fdece0c45c02033220 Author: John Bowman Date: Mon May 24 23:59:49 2021 -0600 TRANSPARENCY: Fixed bug #245. commit 512c2dfc64a44dfdbc574b689668f9406d74db02 Author: Supakorn Rassameemasmuang Date: Mon May 24 16:13:26 2021 -0600 RUNFILE: Explicitly use camp namespace to avoid conflicts. commit 369e43e3f821952c52cea45d3857300e284e3418 Author: Supakorn Rassameemasmuang Date: Mon May 24 16:12:57 2021 -0600 LSP: Add createSymbols for exp and stm for blocks and symbols. commit f1ae4e1b35cbae7089ee3b2bdbd1e609d3328393 Author: Supakorn Rassameemasmuang Date: Mon May 24 16:11:50 2021 -0600 LSP: Remove lineUsage and use the vector instead. commit b8b7dc4a5b023b452a34839c0fccdbe7cce3aa43 Author: Supakorn Rassameemasmuang Date: Mon May 24 16:10:54 2021 -0600 LSP: Contextualize symbolmaps to support block codes. commit d2e6b12a8faeadccdc056e76a036743e3cdaea0b Author: Supakorn Rassameemasmuang Date: Mon May 24 16:08:05 2021 -0600 LSP: Add lt comparsion for positions. commit 9dac66a12fc7178d88ed0ab7a63544924b9b4018 Author: Supakorn Rassameemasmuang Date: Mon May 24 16:00:55 2021 -0600 LSP: Add explicit operator to std::string. commit 5c35e19aaf39d58f8209b5e4956de8c935c2f355 Author: Supakorn Rassameemasmuang Date: Tue May 18 19:07:26 2021 -0600 LSP: Separete Symbolmaps into a cc file. commit 7376cb1111d319e1eabda96f46270dc6ea9e340c Author: Supakorn Rassameemasmuang Date: Mon May 17 17:04:23 2021 -0600 LSP: Enable Asymptote to start in LSP mode. commit f8014e0ecc8096bfb32d86c767070901b67146de Author: Supakorn Rassameemasmuang Date: Mon May 17 17:03:43 2021 -0600 MAKE: Add temporary new files to Makefile. This is a temporary change, it is meant to be added to a proper place later on. commit f219b8caae79fe131999badfa8435fb0f9995eee Author: Supakorn Rassameemasmuang Date: Mon May 17 17:02:57 2021 -0600 LSP: Add basic LSP server code to Asymptote. commit 930e13f9530f1b8db05f4296369f5bd0da543c74 Author: Supakorn Rassameemasmuang Date: Mon May 17 17:02:21 2021 -0600 LSP: Add crude symmap creation function to absyn. commit 4fe425671a58432291dd5daa0a81996209ab2d5e Author: Supakorn Rassameemasmuang Date: Mon May 17 16:59:08 2021 -0600 LSP: Add crude symbols data table. commit d7327c68d886a8856aa981fd7fca1409b603752c Author: Supakorn Rassameemasmuang Date: Mon May 17 16:56:22 2021 -0600 CXX: Add smart pointers to common.h for future convinence. commit a7ef5ded5503256a7607fd42e8643d4894735e56 Author: Supakorn Rassameemasmuang Date: Mon May 17 16:52:50 2021 -0600 GDB: Add .gdbinit to ignore Boehm and asy signals. commit 2c33f258c58ae7df32139690eee606081cba61ad Author: Supakorn Rassameemasmuang Date: Fri May 14 21:32:48 2021 -0600 Move ifile/tree/core declarations to process.h. commit ffa71972faef1b242cc9141440a0c7210dfe630b Author: chaumont-arch Date: Mon May 10 10:39:53 2021 -0600 fixed y-axis inversion bug in initialized and load-fail states commit c71330188e834f3f4e47452dfd26eb51ec688649 Author: chaumont-arch Date: Mon May 10 10:39:53 2021 -0600 fixed y-axis inversion bug in initialized and load-fail states commit e1eb7e2c3c22caa8052e70b38055ca45420eebe2 Merge: 634e1b8f9 c71d3faf1 Author: John Bowman Date: Thu May 6 22:52:55 2021 -0600 Merge pull request #243 from vectorgraphics/graphwithderiv. Add graphwithderiv function. commit 634e1b8f97e8572d8448053f7f64c24657f3dc64 Author: John Bowman Date: Thu May 6 15:39:40 2021 -0600 Fix bug #229: Duplicate KEY in xasy. commit 0ecf39dbc3509938c568a254cb3acda77b8ac37d Author: John Bowman Date: Thu May 6 14:15:49 2021 -0600 Calculate maxKey. commit cbb05a8e2a46c2c1ab9f081d9ef469da71dbd382 Author: John Bowman Date: Thu May 6 15:39:40 2021 -0600 Fix bug #229: Duplicate KEY in xasy. commit e9c003d4b50402be1009f906dc97f6b8ba89b1f3 Author: John Bowman Date: Thu May 6 14:15:49 2021 -0600 Calculate maxKey. commit fc8b0803744cb892d670455c9d86d56ad348ad04 Merge: b4bf08036 bbb1ed004 Author: John Bowman Date: Thu May 6 09:44:31 2021 -0600 Merge branch 'master' into Qt. commit 986cd0a49e4bcdae31bf3b49af04978c5e7e505b Author: John Bowman Date: Tue May 4 23:29:52 2021 -0600 Begin support for language server protocol. commit bbb1ed004e0962870889e85cf37b3b5ce0ef961b Author: John Bowman Date: Tue Mar 23 08:15:57 2021 -0600 Fix typo in documentation. commit 37295db17c2d7fc305a9c587ac474f4d9da40e0f Author: John Bowman Date: Tue Mar 23 08:12:32 2021 -0600 Fix asyPath in Xasy label editor. commit c2e38436032772e7d4a9ab5b093e0bb9ab03e59d Author: John Bowman Date: Sat Mar 20 10:58:24 2021 -0600 Override Xasy settings upon every load. commit 764e47fe845a27167d5d7f24f69dc454d6da4b24 Author: John Bowman Date: Sun Mar 14 19:33:31 2021 -0600 Increment version to 2.71. commit cef479451a35b8a242d68e45666f97583270df0d Author: John Bowman Date: Sun Mar 14 18:29:38 2021 -0600 Update copyright. commit 80f47d0cf5777ebca07790bc0c8f46881e568a3c Merge: 3cac27568 7a22ce6ae Author: John Bowman Date: Sat Mar 13 12:51:02 2021 -0700 Merge pull request #220 from ellio167/homebrew Add link to brew.sh in MacOS install doc section commit 7a22ce6aea529560805b05da2a81ce59321dce72 Author: Ryan S. Elliott Date: Fri Mar 12 08:23:50 2021 -0600 Add link to brew.sh in MacOS install doc section commit 3cac27568d17d48c71250fa8aad4e2f41aae3707 Author: John Bowman Date: Wed Mar 10 13:19:11 2021 -0700 Fix last revision. commit 38fb7ff28e7e6a6ccc28770bb757ee6fecd66d5a Author: John Bowman Date: Wed Mar 10 13:12:07 2021 -0700 Fix stack overflow (bug #217). commit eedfb87671064f5b0bda066a262895f0544a581a Author: John Bowman Date: Tue Mar 9 13:10:54 2021 -0700 Optimize phi computations in ode.asy. commit e4c50ed8c20d7dc8da5f081773c35d1cb4fde105 Author: John Bowman Date: Sat Feb 27 01:30:53 2021 -0700 Implement real phi4(real x) in ode. commit fe57aee56791a43306ee3bc2b36a0813fcc83474 Author: John Bowman Date: Wed Feb 24 21:22:27 2021 -0700 Use UTF-8 encodings. commit d41e41b63bac1276aa6b5def965acc56188327d4 Author: John Bowman Date: Sun Feb 21 16:24:18 2021 -0700 Remove tmpdir workaround for old versions of dvisvgm (older than 2.10). commit 71d0b51bf94cf78cba1d893ce592fcfd9fc4e628 Author: John Bowman Date: Sun Feb 21 15:52:55 2021 -0700 Fix compiler warning messages. commit 24b51055076bd6340103cc0bed077932234f49f1 Author: John Bowman Date: Sat Feb 20 00:36:47 2021 -0700 Use canonical name for MSWindows temp directory. commit b9f5aa77eac95d201c88f515a79397e7dc95352c Author: John Bowman Date: Sat Feb 20 00:28:58 2021 -0700 Fix tempdir under MSWindows installations that lack CYGWIN. commit 2651bba958b187a0a9b91bfc6c97d437c5088b4c Author: John Bowman Date: Fri Feb 19 21:27:35 2021 -0700 Add asypath option to xasy start menu shortcut. commit cd6155afe411261165aa0d09f579f4768717fb11 Author: John Bowman Date: Fri Feb 19 21:23:28 2021 -0700 Add asypath option to xasy shortcut. commit 2f633ecbe329c811ae76befe827c4ee44b3c03c1 Author: John Bowman Date: Fri Feb 19 01:04:33 2021 -0700 Increment version to 2.70. commit ab6c72c152ec8ad0e052706ac16023bf044ab550 Author: John Bowman Date: Thu Feb 18 09:11:30 2021 -0700 Make orthographic scaling consistent with perspective scaling when keepAspect=false. commit 70aa2bcb08e9f2cc88bef64570d5760430f0891a Merge: a755f7680 4b768e169 Author: John Bowman Date: Mon Feb 8 23:11:04 2021 -0700 Merge pull request #203 from cagprado/fix_image_scaling Fix Gouraud image scaling commit a755f7680687d11bc95b00e83b327c917f76cb77 Merge: 7f96ae660 9347f01dc Author: John Bowman Date: Mon Feb 8 23:04:22 2021 -0700 Merge branch 'cagprado-contour_scaling'. commit 9347f01dcbfd4aa9f77b236259bf3acecb481248 Merge: 7f96ae660 4cd9bf4b6 Author: John Bowman Date: Mon Feb 8 22:56:07 2021 -0700 Merge branch 'contour_scaling' of https://github.com/cagprado/asymptote into cagprado-contour_scaling. commit 7f96ae660b6359c601c8243b279b0146ef4cf7ae Merge: 3c7dffea7 d4a34e7b2 Author: John Bowman Date: Mon Feb 8 22:50:45 2021 -0700 Merge branch 'mojca-static_cast'. commit d4a34e7b287872567bbf65ae36b2f29daf59e67c Author: John Bowman Date: Mon Feb 8 22:44:50 2021 -0700 Subtract 1 before casting to potentially smaller type. commit 36ff9595303524acf076ee11ff746b6a273a65c0 Merge: 3c7dffea7 ad93504e5 Author: John Bowman Date: Mon Feb 8 22:33:06 2021 -0700 Merge branch 'static_cast' of https://github.com/mojca/asymptote into mojca-static_cast. commit 3c7dffea7529c3f9280c52935ad487ad13fa1377 Author: John Bowman Date: Sat Feb 6 17:07:07 2021 -0700 Remove obsolete package everypage. commit dbc74f5b52f9c610324fbc1c2f6ec946be3d8ef1 Author: John Bowman Date: Fri Feb 5 00:20:27 2021 -0700 Fix commit f513ffde5c8540e1b45a93fd0391541a6f4aa2f7. commit 4cd9bf4b60c1d64104c9df81e60d50f15fa63a25 Author: Caio Prado Date: Fri Feb 5 14:33:49 2021 +0800 Make contour respect picture scaling Add (x, y) scaling to the 2D contours routines. commit ad93504e5824181c3a27e8edd3e6fc0d1612e03c Author: Mojca Miklavec Date: Sat Jan 16 14:53:31 2021 +0100 Cast unsigned integers to avoid compiler warnings commit 4b768e169d301afb109e87e56af8cdb2fd634692 Author: Caio Prado Date: Wed Jan 13 11:20:29 2021 +0800 Make Gouraud image respect x and y picture scaling Transforms (x, y) pairs of the unstructured mesh according to the picture scaling in each coordinate. This fix an issue that the picture scaling is ignored when generating the image. commit 1b62e8a4ac702136ca4ecaeb20c022021c3941fb Author: Caio Prado Date: Wed Jan 13 11:06:52 2021 +0800 Fix z scaling in Gouraud image Fix a bug introduced in commit d0269b9d990cbf5677e67d43e9b85a969ef03bb8 in which a comparison is made between scaled and unscaled z values leading to inconsistent palette range when z scale is not the identity. commit 959b76f728f2f31835b7d7c2db98a354c88db337 Author: John Bowman Date: Sat Jan 2 14:35:00 2021 -0700 Add missing HAVE_LIBCURL conditional. commit b2ba3f71bbde5e55b91f267e8b9db433b9a20123 Author: John Bowman Date: Sun Dec 27 07:19:44 2020 -0700 Add missing above argument. commit 743285c30959db265c986cc673ac86709880f387 Author: John Bowman Date: Sun Dec 27 07:14:03 2020 -0700 Remove unused line. commit 1d12797c816b9c21b703fbb361bb6a610335e3cc Author: John Bowman Date: Mon Dec 7 22:02:57 2020 -0700 Increase fuzz in bezulate. commit 27d92380e50d5f7f8467c9a6d1f9db4ef0794993 Author: John Bowman Date: Mon Dec 7 18:02:36 2020 -0700 Fix segmentation fault in subpath3 (cf. commit 213d56942fe5b9ef605e0ccf545527833319348d). commit 7ff0865c34c76d046c13e955893d2cc4c7ec4cbb Author: John Bowman Date: Sun Nov 29 14:32:36 2020 -0700 Fix dual simplex method. commit 19b6edf283fcf9018967575ed9d31fb4e75ff026 Author: John Bowman Date: Sun Nov 22 22:14:01 2020 -0700 Fix warning message. commit 85ded4fe8e4c3b8a0f820bb4bea2d1784875171f Author: John Bowman Date: Sun Nov 22 20:52:08 2020 -0700 Increment version to 2.69. commit 3b88c382bf0dd59daa6427a9fc4f03c246b5d218 Author: John Bowman Date: Sun Nov 22 18:02:21 2020 -0700 Fix normalization in tube rendering. commit 31ab4195580be6ac65ad226d29a568c82147e166 Author: John Bowman Date: Sun Nov 22 15:09:09 2020 -0700 Update freeglut installation instructions. commit 7cedd768019efd0fe435fa7d7a8b281298f4d6ba Author: John Bowman Date: Sun Nov 22 10:34:07 2020 -0700 Work around further floating point exceptions in OpenGL libraries. commit 437aef9cb8ae639727f635b51121a00fdb16423d Author: John Bowman Date: Sun Nov 22 01:29:47 2020 -0700 Add Label align(Label,dir) for aligning Label normal in direction dir. commit df6f1c2641fd51975a11244be7b66c477f73a856 Author: John Bowman Date: Sat Nov 21 22:15:22 2020 -0700 Add settings.compress=true option to control PDF image compression. commit a36959ecbdc74fe83720dd28a009d65e16a0302a Author: John Bowman Date: Sat Nov 21 21:48:36 2020 -0700 Implement bool isometry(transform) function. commit 1108f83337b6d6f2ac33b9fd0bb0fb47c0578065 Author: John Bowman Date: Sat Nov 21 21:18:53 2020 -0700 Fix bug2 #149 and #154 (thanks to Oliver Guibe). commit b1ab048d6cf6b703a992a296c870d3b1c5a63b3e Author: John Bowman Date: Sat Nov 21 20:54:05 2020 -0700 Skip over uninitialized elements of transposed arrays. commit 959cdd4823cb1e61b407878c89a66ae97a90e326 Author: John Bowman Date: Fri Nov 20 23:33:21 2020 -0700 Work around floating point exceptions (FE_INVALID) in OpenGL libraries. commit d541f69d20ed7d7a88e25cfe08323780796439ff Author: John Bowman Date: Thu Nov 19 14:30:13 2020 -0700 Qualify namespace. commit f8de14a7ed23d3496188275092c731f8a0fc9aa5 Author: John Bowman Date: Thu Nov 19 11:51:58 2020 -0700 Restore image enccoding. commit 9606da530260600112145360c3eaadada1ed645f Author: John Bowman Date: Mon Nov 16 09:57:35 2020 -0700 Fix comment. commit f513ffde5c8540e1b45a93fd0391541a6f4aa2f7 Author: John Bowman Date: Mon Nov 16 09:53:28 2020 -0700 Read null fields as undefined values in cvs mode and in line mode. commit 5402f40f5c752ed3069a8102b9a1f46a561bc8b0 Author: John Bowman Date: Sun Nov 15 23:35:42 2020 -0700 Fix warning message. commit e67fba800818c8713165829ee64268c445355da3 Author: John Bowman Date: Sun Nov 15 00:26:51 2020 -0700 Fix more uninitialized variables. commit ea1eca1727d19625c5be8359cd88d38236eb0737 Author: John Bowman Date: Sun Nov 15 00:06:41 2020 -0700 Fix uninitialized variable. commit a9d1f7abf90309502026af608db3aed4cb405ce2 Author: John Bowman Date: Sat Nov 14 23:44:25 2020 -0700 Return unbounded direction in rationalSimplex. commit ac9ece43497c23bba3d0738db5a0fb1e8e7090d8 Author: John Bowman Date: Sun Nov 8 12:49:10 2020 -0700 Fix comment. commit 4d6872d552573ba947d3a524549b159d322ff284 Author: John Bowman Date: Sun Nov 8 12:39:12 2020 -0700 Add RELEASE variable. commit a3d85fb37e5a28e021f417b8355362b03f93b5d1 Author: John Bowman Date: Tue Oct 27 21:49:55 2020 -0600 Always define xStandard in optimal case in rationalSimplex. commit 5ced24a1d9658364e76ddc04a9b61890ee53d543 Author: John Bowman Date: Tue Oct 27 03:18:54 2020 -0600 Support logarithmic graphs of surfaces. commit e688d42e33a521facdb050c77b454b819478d3fd Author: John Bowman Date: Sun Oct 25 23:08:36 2020 -0600 Open files without assuming an asy suffix. commit 3361214340d58235f4dbb8f24017d0cd5d94da72 Author: John Bowman Date: Sun Oct 25 22:24:51 2020 -0600 Use ps2write instead of eps2write where possible, for compatibility with gs 9.53. commit 42b291049920c2a023ab5f3598cc917eb36297ca Merge: e62d04011 d9826965b Author: John Bowman Date: Sun Oct 25 20:18:21 2020 -0600 Merge branch 'spotrh-curl-config', standardized. commit d9826965be5768c417b790fb6ff6ba59aeb89246 Merge: e62d04011 a055a0ae8 Author: John Bowman Date: Sun Oct 25 20:09:49 2020 -0600 Merge branch 'curl-config' of https://github.com/spotrh/asymptote into spotrh-curl-config. commit e62d040114aaadfa9c3a6d6a70cd001cdea11e36 Author: John Bowman Date: Sun Oct 25 20:01:06 2020 -0600 Make end argument of Margin functions optional. commit e5db49aa7b3ede25ae2cf4c08adfe2fe533420b1 Author: John Bowman Date: Sun Oct 25 19:59:54 2020 -0600 Expose solution to standard problem in rationalSimplex. commit 69e5f0cc8ccdb8128319c4cd8c1f13cae01ce82d Author: John Bowman Date: Sat Oct 10 00:11:57 2020 -0600 Make --version indicate if configured for OSMesa software rendering. commit d54e2ac82481e410ffa2bb52a1fb9d217d95eb98 Author: John Bowman Date: Wed Oct 7 17:39:51 2020 -0600 Add high resolution wall clock time. commit a055a0ae813e7ed443b3d48e0822e5e7199bef65 Author: Tom Callaway Date: Fri Oct 2 18:50:51 2020 -0400 add --disable-curl option to prevent curl check and compile without optional URL support commit 27a55b7891214aa0654e7a97207c5ba762ceb1aa Author: John Bowman Date: Mon Sep 14 13:48:03 2020 -0600 Fix centering of slides. commit 576b7333baf56cd833a1098dd85a22af1bbfdafb Author: John Bowman Date: Fri Aug 28 21:56:16 2020 -0600 Support null characters and null strings in replace. commit be534393f9b3404573479dc9851817e6c5fbda94 Author: John Bowman Date: Mon Aug 24 12:59:25 2020 -0600 Disable image encoding in PDF conversion. commit 1fd27cc14606206aba81bf131e0bef36e9329457 Author: John Bowman Date: Sat Aug 22 12:15:26 2020 -0600 Fix extraction of git revision. commit 8dbece952d9ddece1349215243c473bafcc7b4c6 Author: John Bowman Date: Sat Aug 22 09:56:46 2020 -0600 Fix configuration without readline support. commit d6500a226b021edf99002596f7226015950dc6af Author: John Bowman Date: Thu Aug 20 22:47:49 2020 -0600 Allow binary mode to read the entire file into a string. commit 880ef36e9878dfbcdcf28b953d11bfd392805643 Author: John Bowman Date: Thu Aug 20 21:04:51 2020 -0600 Fix getc when reading NUL character. commit e3ac2208915f6c496974a8dc3342861de4f2e2d1 Author: John Bowman Date: Sat Aug 15 12:52:42 2020 -0600 Fix commit 986d64236b299c1643451f4e774170cb8ebcec00. commit 6cea1c06c2054f1b7433e2d01ed6a2ec863b6726 Author: John Bowman Date: Thu Aug 13 16:06:15 2020 -0600 Update URLs. commit af12ec3b6fcca4e273dad4fdd3b431bada30608f Merge: 986d64236 68682879c Author: John Bowman Date: Sun Aug 9 08:29:58 2020 -0600 Merge pull request #170 from bmwiedemann/date Allow to override build date with SOURCE_DATE_EPOCH. commit 68682879ce9704606fb0d46734dfaba4966de9b5 Author: Bernhard M. Wiedemann Date: Sun Aug 9 14:10:55 2020 +0200 Allow to override build date with SOURCE_DATE_EPOCH in order to make builds reproducible. See https://reproducible-builds.org/ for why this is good and https://reproducible-builds.org/specs/source-date-epoch/ for the definition of this variable. Also consistently use ISO 8601 date format to be understood everywhere. This also avoids %B and %h that are locale-dependent. Also use UTC/gmtime to be independent of timezone. Also rewrite the shell `date` calls into perl to avoid trouble with the different date command implementations. This PR was done while working on reproducible builds for openSUSE. commit 986d64236b299c1643451f4e774170cb8ebcec00 Author: John Bowman Date: Sat Aug 8 11:18:38 2020 -0600 Fix last revision. commit 4c06e580baa7051128d3e8ab4b06a0315a1eecd7 Author: John Bowman Date: Sat Aug 8 01:05:57 2020 -0600 Simplify code. commit d2f6e59eb42763c2e9a1f6ca5e057f6bf13991cd Author: John Bowman Date: Thu Aug 6 22:27:33 2020 -0600 Fix last revision. commit 7ae96b7754d1025c02be514e3d31433cce52b609 Author: John Bowman Date: Thu Aug 6 22:05:07 2020 -0600 Remove -0 suffix from git version for tagged releases. commit 610c4624a7ac69ee4ccfedd6075b1cb28c14d7ce Author: John Bowman Date: Wed Aug 5 23:39:05 2020 -0600 Fix last revision. commit dc4243ccd1c5ab766241707ab10f16d7c9738ef7 Author: John Bowman Date: Wed Aug 5 23:34:47 2020 -0600 Backport curlProgress to libCurl < 7.32. commit 94f99a26ab9b72f3a3fbc2239f9e7b529b7166e2 Author: John Bowman Date: Wed Aug 5 22:18:03 2020 -0600 Increment version to 2.68. commit bccdb51e0cfa5b7b7bf5c08c1f9496a7ba9a012d Author: John Bowman Date: Wed Aug 5 17:45:17 2020 -0600 Reformat run*.in files. commit 37bf3ce87aed185a465da781db931a68aff7745d Author: John Bowman Date: Wed Aug 5 17:01:26 2020 -0600 Allow URL requests to be interrupted. commit 92d7b6fe3bbd0d1ee5238ac5d87469e6d17e89f4 Author: John Bowman Date: Wed Aug 5 16:19:42 2020 -0600 Port to MSDOS. commit 9dc14b7b56eeaddae51c5f24012ac51a5faf93f9 Author: John Bowman Date: Wed Aug 5 01:56:15 2020 -0600 Fix hang on quit under MSDOS. commit bfefd605c7eb661f03eba5405795d6dff3e9cd43 Author: John Bowman Date: Tue Aug 4 22:50:32 2020 -0600 Fix readline interrupt handling under MacOS X. commit 1fb62259fe1b94a5b3ef0b44ce7f7d32a3be76b3 Author: John Bowman Date: Tue Aug 4 12:40:53 2020 -0600 Remove xasy link from MSDOS build. commit 5050ce7ee703ef3ec3c4d84cd420a019178c6859 Author: John Bowman Date: Mon Aug 3 14:18:29 2020 -0600 Reformat examples. commit 372ae2ca61bea75271c85549dd166b71d4dc72b4 Author: John Bowman Date: Mon Aug 3 13:59:33 2020 -0600 Indent projection output. commit b552792d5adb112b469ea55e8b95ffc299969ec0 Author: John Bowman Date: Mon Aug 3 13:20:15 2020 -0600 Add C++ and asy indenting and formatting Emacs lisp scripts. commit b03e2ba9dc2287c16869dc51e87fe5715eb3c2d4 Author: John Bowman Date: Sun Aug 2 23:08:08 2020 -0600 Fix last revision. commit 55406a03c263d9a33c22f823110bee247146ffdc Author: John Bowman Date: Sun Aug 2 22:52:47 2020 -0600 Fix compilation without libcurl. commit e0f8c79e64f4b2d14f0dbd6f95472480bd718b72 Author: John Bowman Date: Sun Aug 2 22:50:42 2020 -0600 Reformat base files. commit ef00491a49965e998549a2df0bb6d01fb4bb7d61 Author: John Bowman Date: Sun Aug 2 21:13:13 2020 -0600 Reformat .cc and .h files. commit 5de4352e05ba6a03f95a128b81e702d6a3d27314 Author: John Bowman Date: Sun Aug 2 20:21:07 2020 -0600 Update asygl. commit 98b22e43550672e01cf257f982380efa18f4f92b Author: John Bowman Date: Sun Aug 2 19:15:52 2020 -0600 Document newpage. commit 083efd7710a851e2e33331bcbac9ac42cf4dabe6 Author: John Bowman Date: Sun Aug 2 18:12:45 2020 -0600 Avoid unnecessary remesh on zoom in AsyGL. commit 23c2ac57fd6336eda71251c25a7324732e1433d9 Author: John Bowman Date: Sun Aug 2 18:00:30 2020 -0600 Force remeshing on export. commit bfc7bc0db8ca496f5ea9545024f84749ae3ea636 Author: John Bowman Date: Sun Aug 2 17:50:26 2020 -0600 Fix exporting when devicepixelratio > 1. commit 5e57b75e78b4d596cdc00d3a35a2c8c40df17f90 Author: John Bowman Date: Sat Aug 1 21:02:48 2020 -0600 Implement devicepixelratio setting. commit ef0bb9f3fd39c3528fd963b27c6989c3287faacf Author: John Bowman Date: Sat Aug 1 20:27:52 2020 -0600 Extend URL support to input(). commit 45e8475ce686ca92aad94488c10824fc1f1d044f Author: John Bowman Date: Sat Aug 1 14:41:48 2020 -0600 Support importing URLs. commit 81b4d1e85225fb540c8cf64d733b810ab3ab07d6 Author: John Bowman Date: Fri Jul 31 18:18:57 2020 -0600 Remove obsolete code. commit 2e497032037cff813426a1ece1f42ec1ab924d68 Author: John Bowman Date: Wed Jul 29 22:58:25 2020 -0600 Fix interrupt handling under MacOS X. commit c2c8c095416e766063ad0af943d1a931d14095e0 Author: John Bowman Date: Wed Jul 29 01:52:40 2020 -0600 Implement portable whitespace skipping also for pairs. commit ed3e87bb4795ac6cf648af9b4f12e2418efad11a Author: John Bowman Date: Wed Jul 29 01:35:03 2020 -0600 Implement portable way of skipping whitespace. Make casts from empty strings yield uninitialized values. commit 8ba38823755e09de6463a42396e1db7291276254 Author: John Bowman Date: Tue Jul 28 21:06:49 2020 -0600 Simplify code. commit ad7054342d291ce32f71951b7e7eeea381d29efb Author: John Bowman Date: Tue Jul 28 21:05:19 2020 -0600 Fix numerical precision issue. commit 111cd165f5c7f4a0496a9efbf746d4f2a316a48c Author: John Bowman Date: Mon Jul 27 00:30:18 2020 -0600 Format documentation. commit 9193d9d8ee934b325e575d405631d4fb252b1d8d Merge: ef016d741 013e0cb25 Author: John Bowman Date: Mon Jul 27 00:20:41 2020 -0600 Merge pull request #144 from ivankokan/master Obsolete *encoding modules commit 013e0cb25362e46cecb40ea468aa95e66788dd12 Merge: aa8a5244e ef016d741 Author: Ivan Kokan Date: Mon Jul 27 02:26:20 2020 +0200 Merge branch 'master' into master commit ef016d741c443e8e84ff8248a9622c820813b754 Author: John Bowman Date: Sun Jul 26 17:47:02 2020 -0600 Document that clipping has no notion of depth. commit 1b11525273e0661d3a3f4f8dc988b29982e7f5c2 Author: John Bowman Date: Sun Jul 26 12:15:06 2020 -0600 Fix segmentation fault caused by obsolete code. commit eb1ec4d911ee9b4c3f34a07505183291d3793e6e Author: John Bowman Date: Sun Jul 26 11:34:09 2020 -0600 Update documentation. commit 6473c8487d59a4891c406cd127b3bb2d200ebe62 Author: John Bowman Date: Sun Jul 26 11:02:35 2020 -0600 Simplify code. commit 52b458f036b7f9222a084ffef4e94092342608bf Author: John Bowman Date: Sat Jul 25 20:56:11 2020 -0600 Fix copy constructors for path and path3. commit e5da02595a16d3a6adc60cd9d4589b5cf31b4fd3 Author: John Bowman Date: Sat Jul 25 17:59:27 2020 -0600 Port to MacOS X. commit bb56b10d431a5acd66b28c4a4bb22ba99ef7c1c8 Author: John Bowman Date: Fri Jul 24 00:09:24 2020 -0600 Improve repositioning of OpenGL window. commit 47f463e5a739c02838fd549e7a4dc3b0f8471f21 Author: John Bowman Date: Thu Jul 23 03:39:28 2020 -0600 Always reposition OpenGL window when not fitting to screen. commit 1ba366e2ba2380e17c81df2b6cd4114869745ad4 Author: John Bowman Date: Wed Jul 22 20:19:12 2020 -0600 Normalize triple dir(path3, path3). commit bc0b6499e5f71b36a3177f677db5277078164dbd Author: John Bowman Date: Wed Jul 22 00:39:18 2020 -0600 Prevent xasy from hanging on asy errors. commit dee047a7596538e2012152c52a753938ea9d310b Author: John Bowman Date: Mon Jul 20 00:31:32 2020 -0600 Update asygl. commit 7574872dca70fda79c6cd65e350b57fc135bd794 Author: John Bowman Date: Mon Jul 20 00:28:29 2020 -0600 Make + and - keys zoom in and out, rather than expand and shrink viewport. commit 2066ef194ec9f7c135b165ea8b157e78320306a6 Author: John Bowman Date: Sat Jul 18 22:46:22 2020 -0600 Update asygl. commit 5089b775299a17831a86c4ae38d1081de3e1282a Author: John Bowman Date: Sat Jul 18 22:45:58 2020 -0600 Improve resizing. commit 242615a1b755ea943603daad9aa6060e5f2eca1e Author: John Bowman Date: Sat Jul 18 20:44:53 2020 -0600 Workaround JSON bug by escaping colons. commit 7294cb2bf8a3fc0c182b36c9b1ee8b49cc5a8b3d Author: John Bowman Date: Fri Jul 17 13:07:35 2020 -0600 Update asygl. commit 5a2bd75f8f8ee73c0617896f0d1183fe4c673c05 Author: John Bowman Date: Fri Jul 17 13:06:43 2020 -0600 Fix absolute mode. commit 55e4e0dba58565b91ae1dd1df715b49db339a305 Author: John Bowman Date: Fri Jul 17 12:47:08 2020 -0600 Update asygl. commit ba16a591ca3b924fb1e9db399f4c942d36341d68 Author: John Bowman Date: Fri Jul 17 12:46:45 2020 -0600 Reset initial zoom. commit c47728d59cb3d9a8ffb394cbffb79c2ddc631816 Author: John Bowman Date: Fri Jul 17 12:25:14 2020 -0600 Update asygl. commit e0281de557eb186728d66fd0c183d65a50b8f0b5 Author: John Bowman Date: Fri Jul 17 12:24:18 2020 -0600 Always listen for WebGL resize events. commit 99c614d893cea7dffb9a41c13c20460248944cd2 Author: John Bowman Date: Thu Jul 16 23:23:58 2020 -0600 Document settings.absolute. commit af6c53a9825bc1e2dc73f8aa8a720b299d6a4e6c Author: John Bowman Date: Thu Jul 16 23:00:29 2020 -0600 Fix invalid array dimensions error. commit b5eac1db427fbc956d01b243fffc2b4f20415355 Author: John Bowman Date: Wed Jul 15 11:41:01 2020 -0600 Update example. commit 9c9caaca5c63f04bde69205e0da9e163ee256344 Author: John Bowman Date: Wed Jul 15 02:59:52 2020 -0600 Disable cd with -noglobalread. commit 0278c8841589770d71e2803e57dcfb6ce002cfcf Author: John Bowman Date: Wed Jul 15 01:00:25 2020 -0600 Allow reading from search path even with -noglobalread. commit cf7c0373f82cb7d1de78bb95d7b619e096552628 Author: John Bowman Date: Wed Jul 15 00:13:00 2020 -0600 Add examples directory to search path. commit 516d7847b2a58425c7763bbb0e79eebea7f72c15 Author: John Bowman Date: Tue Jul 14 23:14:10 2020 -0600 Fix inpath. commit 0a5015b2f86a656a8b04d2592a606b68bb6e4d53 Author: John Bowman Date: Tue Jul 14 16:42:20 2020 -0600 Add missing file. commit cde71e2634cd45113f60cd9aec96f0221e1b1d58 Author: John Bowman Date: Tue Jul 14 16:37:57 2020 -0600 Install data file. commit 2056aa9c63bd1bf9fc7f3cdb7415aa7c1cefbe07 Author: John Bowman Date: Tue Jul 14 16:12:41 2020 -0600 Add -globalread setting (default true). commit 246022516af218d6ae4cebf027965479d049b8d9 Author: John Bowman Date: Tue Jul 14 10:57:38 2020 -0600 Open files using search path. commit 2e4762d4381307876a100e42116592d8aba3a75a Author: John Bowman Date: Tue Jul 14 01:56:07 2020 -0600 Reinstate putting clipPath definitions in section, with fix to Gouraud shading. commit 5b5c8aeddfe9e99eec14c30591713f4d128bb8cf Author: John Bowman Date: Tue Jul 14 01:52:54 2020 -0600 Revert "Put clipPath definitions in section." This reverts commit fbf03b07cfbabaeb7be861ac652f4b46fdc0e2cb. commit fbf03b07cfbabaeb7be861ac652f4b46fdc0e2cb Author: John Bowman Date: Tue Jul 14 01:24:40 2020 -0600 Put clipPath definitions in section. commit 62bfac5dc40fe8f9ceefe2f834fdf6febd5971d5 Author: John Bowman Date: Tue Jul 14 00:56:40 2020 -0600 Use distinct clipping IDs. commit 5778d7e16e456bf9caacdadcf354ccfd41aff4c2 Author: John Bowman Date: Tue Jul 14 00:39:31 2020 -0600 Fix svg clipping. commit cd0faa137d52fea979e73b3748986cbcd396f882 Author: John Bowman Date: Mon Jul 13 02:23:24 2020 -0600 Remove unused svg transform. commit 29004b9576e08e6da0aae0df07ea08351e555953 Author: John Bowman Date: Sun Jul 12 16:42:38 2020 -0600 Remove duplicate . commit a2eb67615714aaa43674da43b8e5be8f597dbb1f Author: John Bowman Date: Sun Jul 12 09:34:59 2020 -0600 Support compilation and 2D svg to html conversion without GLM library. commit 89ca60bd9e8ea5b23d7deea2dfdf2d54b8496d25 Author: John Bowman Date: Sat Jul 11 23:50:35 2020 -0600 Display error location in interactive mode when importing files; output to stderr. commit 4c0160df84ee208b7f0b4f6480405299d4ae94d4 Author: John Bowman Date: Sat Jul 11 02:27:54 2020 -0600 Display error location. commit bde2b3f814ffaf77f10bf78352b34f3584523734 Author: John Bowman Date: Fri Jul 10 19:37:51 2020 -0600 Remove body margin and scrollbar. commit 7bb9309de9929be530547de88d1cdeac052f2231 Author: John Bowman Date: Fri Jul 10 12:53:41 2020 -0600 Fit 2D html output to canvas unless settings.absolute=true. commit 497363ecde2cc4856756ed54ae2723799a183674 Author: John Bowman Date: Fri Jul 10 12:49:41 2020 -0600 Show dvisvgm diagnostics. commit 97843dd13d26027a05a108e16f60f910703648b7 Author: John Bowman Date: Thu Jul 9 16:08:10 2020 -0600 Fix tutorial URL. commit b6d53dc435fda60c836606f8d763dbdaf56e8501 Author: John Bowman Date: Thu Jul 9 09:34:10 2020 -0600 Fix format in documentation. commit aa8a5244e46c1d04300513a4107245a3575ceedd Author: ivankokan Date: Thu Jul 9 15:53:58 2020 +0200 Format docs commit 9cca9e9106e6ad4aa89389d25b11712d7ac4edec Merge: e0b8e3def d968c0274 Author: Ivan Kokan Date: Thu Jul 9 15:14:31 2020 +0200 Merge branch 'master' into master commit d968c027432b225800655e508fa00bff2da086b5 Author: John Bowman Date: Thu Jul 9 00:58:10 2020 -0600 Improve logo3. commit 3fd657ee90bc66143b86d7c15a3eb28200e88611 Author: John Bowman Date: Tue Jul 7 23:06:48 2020 -0600 Work around dvisvgm bug. commit 978d0e0d8ce48a7f71d1880dea6454133c8f6698 Author: John Bowman Date: Tue Jul 7 02:01:25 2020 -0600 Increment version to 2.67. commit 695f398ded015ec27835b833f29d220794c45831 Author: John Bowman Date: Mon Jul 6 22:54:59 2020 -0600 Enable PDF transparency for SVG and HTML formats. commit 4ec6f561926704c685739dd77183e2c56929db80 Author: John Bowman Date: Mon Jul 6 22:44:19 2020 -0600 Only implement PDF transparency for PDF formats. commit f030d57672c300689ad4b955f8bd5ab897cfffc9 Author: John Bowman Date: Mon Jul 6 22:34:53 2020 -0600 Remove unused code. commit c1083e547bd5c43c2baf253d5ffbf376aa1b49eb Author: John Bowman Date: Mon Jul 6 20:52:05 2020 -0600 Work around broken signals on MSWindows. commit 6e050f717ffeea7701c9de1e2b8ffe5ff9b9a7cb Author: John Bowman Date: Mon Jul 6 00:04:25 2020 -0600 Fix tempdir. commit a6c626a111b49512bf8e54e4482d3aef47d63555 Author: John Bowman Date: Sun Jul 5 22:20:28 2020 -0600 Update documentation. commit 7b7b491898243d71f190b4ebad02e92805b8d0d1 Author: John Bowman Date: Sun Jul 5 21:34:08 2020 -0600 Document the Asymptote Web Application. commit ef354c08562686b6afdd5aafd6e63fe1edfdf0ef Author: John Bowman Date: Sun Jul 5 20:20:09 2020 -0600 Remove unused variable. commit 6129a12bd26dd018d38cd96c62e8fa74b5cf36a9 Author: John Bowman Date: Sun Jul 5 20:11:27 2020 -0600 Fix pdfreload. commit fa3122974baecf2d7743e87705f3b12c913e560b Author: John Bowman Date: Sun Jul 5 01:44:07 2020 -0600 Use custom tmpdir for dvisvgm to avoid permission conflicts. commit 042ab6b6973dc045ad80a5e99ecf29034f67416b Author: John Bowman Date: Sun Jul 5 00:20:44 2020 -0600 Fix pdfoffsets. commit b081ac0d5b435bcb1531fd8d6211b552f62a8679 Author: John Bowman Date: Sat Jul 4 03:26:15 2020 -0600 Update dependencies. commit bd9c1e2def171eea72ea13f7755a2601da4401f8 Author: John Bowman Date: Fri Jul 3 01:46:42 2020 -0600 Fix fullscreen mode. The default maxviewport value of (0,0) now specifies the screen dimensions. commit 499234d65838272830fc133635729be93474ebfa Author: John Bowman Date: Thu Jul 2 22:55:56 2020 -0600 Remove X-server dependency for offscreen rendering. commit 217bb1c86beaa5daa7dbea6691a9a7afb088c355 Author: John Bowman Date: Thu Jul 2 14:36:45 2020 -0600 Remove obsolete offscreen setting. commit 1ddfc8e10bb10020c77b550217743b9b77f0a845 Author: John Bowman Date: Thu Jul 2 11:35:12 2020 -0600 Add missing conditionals; simplify code. commit c19d2327b109655e9a99c795bc2724738af3fc3c Author: John Bowman Date: Thu Jul 2 11:20:01 2020 -0600 Support offscreen rendering again when configured with --enable-offscreen. commit b800078b4d81c126cf43984b12d876e919292e7c Author: John Bowman Date: Thu Jul 2 00:14:30 2020 -0600 Work around FE_INVALID when using Gallium libGL. commit 6c6267318f959de91711984d192d96846fe11dae Author: John Bowman Date: Mon Jun 29 01:38:31 2020 -0600 Fix warning message. commit 117081fc1c6909080df76502b15dfcb1576cd0c6 Author: John Bowman Date: Mon Jun 29 01:31:13 2020 -0600 Fix warning message. commit d573cbb922fac2f8106e70afdf9637e2ce2d6d36 Author: John Bowman Date: Mon Jun 29 00:48:08 2020 -0600 Fix documentation of mapTemplate. commit 9bdd507eabc2e5f9dbe2b3c2fde74c0552156372 Author: John Bowman Date: Mon Jun 29 00:39:47 2020 -0600 Illustrate how to create parametrized code by implementing a struct mapping keys to values, with a specified default. Also implement mapArray, simplifying the construction of general array mappings. commit 9cdbfd99e9e6bc80055c3929016d7a65e589f690 Author: John Bowman Date: Sat Jun 27 23:35:55 2020 -0600 Redefine map2 to map, T1 to mapFrom and T2 to mapTo. commit 24631469c445b7722566ccfe1b4a91e6cca70c19 Author: John Bowman Date: Fri Jun 26 21:23:38 2020 -0600 Add map2 code for defining T2[] map(T2 f(T1), T1[] a). commit 503273b5f076f3a46083922b6e0f8a892001a763 Author: John Bowman Date: Fri Jun 26 04:31:57 2020 -0600 Fix bug #162: opening .asy file in Xasy crashes on MSWindows. commit 7ddc5b161a2cb3394e6ae0b986c8714fc6ff1e0e Author: John Bowman Date: Thu Jun 25 00:10:46 2020 -0600 Extend currentlight.background to 2D images; by default, use a white background for both 2D and 3D HTML images. commit 61624215084386cbba889dd008c95fcfa3f436e1 Author: John Bowman Date: Wed Jun 24 22:32:49 2020 -0600 Fix 2D html tags. commit 1b8c77abebeb4a3e65d1f30eda6d5b60ffe820f2 Author: John Bowman Date: Mon Jun 22 14:58:38 2020 -0600 Fix xasy svg shading. commit 96cf6bb0c46c830c3676a442900e4bd968e0a50c Author: John Bowman Date: Mon Jun 22 01:38:25 2020 -0600 Fix Windows override in xasyconfig.cson. commit 448695a92747861476497f92e23e6d779596ed16 Author: John Bowman Date: Mon Jun 22 01:24:43 2020 -0600 Implement real abs2(pair) and real abs2(triple). commit 4e76a3267bb44d163378bd50f72eb6340089b469 Author: John Bowman Date: Mon Jun 22 00:04:38 2020 -0600 Fix deconstruction of png images into svg format. commit b1d4da9a0e0d69047df43c15bbe9b22f01ebb0d5 Author: John Bowman Date: Sun Jun 21 18:37:41 2020 -0600 Check array dimensions. commit 1264820193c3d27b79082431762636cb4c19b8ee Author: John Bowman Date: Sun Jun 21 18:02:46 2020 -0600 Fix camera adjustment. commit 0353f3bd5edc99e5f83fdae04f7d14393dfa623d Author: John Bowman Date: Sun Jun 21 16:39:19 2020 -0600 Improve detection of TeX errors. commit d0049ae28dcd4ee1664e27dff18a43dbbc7c8521 Author: John Bowman Date: Sun Jun 21 01:41:57 2020 -0600 Fix CPU to CPU optimization for Bezier curves by rendering one segment at a time. commit 6cafa5abb72d1ab2f69ab6ba9fc8ba7c4417bfe6 Author: John Bowman Date: Sun Jun 21 01:25:41 2020 -0600 Update asygl. commit 6a04bf13097bb8e196bdfcbf1f9c9b30fd5fe4b8 Author: John Bowman Date: Sun Jun 21 01:22:27 2020 -0600 Port CPU to GPU copying optimization to AsyGL library. commit 0fcf4e50d0fdaf43d839d15c8eea7ff99ab4ed71 Author: John Bowman Date: Sat Jun 20 00:01:45 2020 -0600 Update to new Ghostscript transparency model. commit d2e946715241e559433ae56b2cc726901b1474d6 Author: John Bowman Date: Fri Jun 19 19:12:15 2020 -0600 Output 2D html images using inline svg commands. commit 239b54d06b51b52b6fb1d7a929fada19039356a9 Author: John Bowman Date: Thu Jun 18 22:22:22 2020 -0600 Force PNG content to be embedded in SVG output. commit c1215bee4c483b75f547098fc0849e4f5277a404 Author: John Bowman Date: Thu Jun 18 18:55:12 2020 -0600 Fix tensor shading with latex engine and svg outformat. Check for mismatched endspecial. Simplify code. commit cb9a4f90466dac50aeec00bd7dbb91cb609f5c0a Author: John Bowman Date: Thu Jun 18 00:02:18 2020 -0600 Update asygl. commit d56cfbf30c5dfd26abdd13af139f2419ae28b3b1 Author: John Bowman Date: Thu Jun 18 00:01:46 2020 -0600 Fix WebGL shrink and expand. commit bb772d94c88a0968f744a02faadddbc0c4d214a4 Author: John Bowman Date: Wed Jun 17 22:00:11 2020 -0600 Increase WebGL precision of example. commit 55217bf80236b08d820ef235e84478100d094077 Author: John Bowman Date: Wed Jun 17 21:11:05 2020 -0600 Update asygl. commit 31d27c0d7a4dcb36f87ab2aa046371936dc6d176 Author: John Bowman Date: Wed Jun 17 21:10:09 2020 -0600 Extend WebGL viewport to edge of canvas; simplify code. commit 5b6237b879a56a222e9c3689181485646ab4ea51 Author: John Bowman Date: Wed Jun 17 16:04:49 2020 -0600 Update asygl. commit 07b4ae5679569041c070c6f50c0bd8eb3e0a97aa Author: John Bowman Date: Wed Jun 17 16:04:03 2020 -0600 Fix WebGL aspect ratio and centering. commit c209a949e54d90bdf71a4d576602a6b004b894f3 Author: John Bowman Date: Wed Jun 17 10:57:13 2020 -0600 Update asygl. commit 9e93b99175d0aa06535022dbddeaebd7b75f4377 Author: John Bowman Date: Wed Jun 17 10:56:39 2020 -0600 Restore aspect ratio sizing code. commit eb022a5e1fc3c8bc2008e33980a47a99d269159b Author: John Bowman Date: Wed Jun 17 08:30:47 2020 -0600 Update asygl. commit e773510775bf63cfb81fc44077c3651cccf49a9c Author: John Bowman Date: Wed Jun 17 08:27:04 2020 -0600 Center html output in Javascript code. commit d604442f8a09550276cf03721ab3c71047eb9f6b Author: John Bowman Date: Sun Jun 14 02:31:48 2020 -0600 Increase precision of planar Bezier surfaces in WebGL. commit 38a8732d7c292de07142e789a7abf6115a52ed82 Author: John Bowman Date: Tue Jun 2 11:49:16 2020 -0600 Revert "Center html output." This reverts commit 8d6fcc11cbc1118f6f4253efb8766998f83425fe. commit 3546418498d27270de2ea77a8e59a97bc90697ef Author: John Bowman Date: Sun May 24 23:03:01 2020 -0600 Remove clip from slopefield module. commit 8d6fcc11cbc1118f6f4253efb8766998f83425fe Author: John Bowman Date: Sun May 24 21:31:48 2020 -0600 Center html output. commit 56f89ede630ce95f6d0e57c5adf58bc925229ad8 Author: John Bowman Date: Mon May 11 19:46:20 2020 -0600 Force copying of sorted transparent triangles to GPU. commit b44d17ae26dcd0f3d3ea63188f93528230390cfe Author: John Bowman Date: Sun May 10 22:08:53 2020 -0600 Raise logo3 camera. commit b4bf080363fc22960634ce565b5418db28692bd3 Author: Pedram Emami Date: Fri May 8 18:14:45 2020 -0600 Fix typo. commit d9bbb71b151c1ff1ee920045607240ed80ead95f Author: John Bowman Date: Wed May 6 01:00:21 2020 -0600 Brighten default light Headlamp. commit d9b7e5f6759da978831a03be481f5b0712f77ba7 Author: John Bowman Date: Wed May 6 00:11:21 2020 -0600 Fix previous commit. commit a81b3656d2087a9f038fdd3417698d23d0518808 Author: John Bowman Date: Sun May 3 21:25:09 2020 -0600 Fix copying of materials from CPU to GPU. commit d536e5e45d45c7893d6703d8ef9c56c2df0d97b7 Author: John Bowman Date: Sun May 3 10:32:42 2020 -0600 Simplify code. commit a869eb33b2549b19fd67a64031d202a2fb834cd1 Author: John Bowman Date: Sun May 3 01:02:48 2020 -0600 Fix svg output for axialshade and radialshade. commit 90f4700de45c7b5a86c109d004209d8ef688bf88 Author: John Bowman Date: Sun May 3 00:21:51 2020 -0600 Work around dvisvgm --pdf limitations. commit 05faf64b39ec7ac03318a7b4c738cae9d107239a Author: John Bowman Date: Fri May 1 04:31:10 2020 -0600 Copy vertex and material data from CPU to GPU only when necessary. commit 091d66b78d5f6283140d9d3f1ca776629e88360d Author: John Bowman Date: Wed Apr 29 23:27:23 2020 -0600 Make svgemulation=true by default to emulate Gouraud shading in SVG; remove obsolete experimental code. commit ada6af005b220947cd64c534d2f0e64f5b860b24 Author: John Bowman Date: Wed Apr 29 00:20:26 2020 -0600 Improve emulation of SVG Gouraud shading with option -svgemulation. commit fa31a4f26318806e76146fcdf4d5a38493ddcd17 Author: John Bowman Date: Mon Apr 27 09:04:14 2020 -0600 Fix typo in documentation. commit 154d7bbd45c8a2e3c92ed98ffdfb0d9614cab4dd Author: John Bowman Date: Sun Apr 26 18:17:56 2020 -0600 Work around dvisvgm --pdf limitations; fix -fsvg -render=0. commit 90b198134af21c9989e904ee72b78779b7ecbb2d Author: John Bowman Date: Sun Apr 26 15:56:54 2020 -0600 Fix segmentation fault; consolidate error messages. commit 1c15884c9505b3e2b01dfdc1bd21ace199d3b746 Author: John Bowman Date: Sat Apr 25 19:30:15 2020 -0600 Flatten a monochrome tensor patch with interior internal control points to a filled cyclic path. commit cb4c2c03e7cd77adceeab539e0d173798abf9717 Author: John Bowman Date: Sat Apr 25 11:53:07 2020 -0600 Allow dvisvgm --pdf now that version 2.9.1 supports PNG images. commit 3063abbcfcf1d8b8b4fc6b67a37375bfc746f6cc Author: John Bowman Date: Sat Apr 25 08:58:11 2020 -0600 Consistently use dvisvgm -v3 verbosity option. commit 21b9f1a684678f931d56c26ccb8ea7fb11f5769c Author: John Bowman Date: Sat Apr 25 00:08:59 2020 -0600 Fix export of 3D rendered bitmaps to svg. commit e0b8e3def55318505b24cd850b94efa2ac037d0b Author: ivankokan Date: Thu Apr 23 00:38:59 2020 +0200 Update sourceforge URLs in FAQ commit fcd9aeb92d892f97925f6f428a00efd376bd2da7 Author: ivankokan Date: Thu Apr 23 00:32:10 2020 +0200 Update FAQ for international fonts question commit 825488fbb1395202f35b436df146da6f8560a6af Author: ivankokan Date: Thu Apr 23 00:01:44 2020 +0200 CJK package URL commit 285f855a0312465f1c1d96757a5098061d929725 Merge: 354285717 881b585a2 Author: John Bowman Date: Mon Apr 13 14:56:25 2020 -0600 Merge pull request #151 from jsonn/patch-1 Check for libc++ directly, not for the kernel commit 881b585a2f8f0a927ce7d77c59eba0a4774ce98e Author: John Bowman Date: Mon Apr 13 14:55:49 2020 -0600 Update comment. commit 44cb71efe77b4e7e9e12367bebcc39b0eebff767 Author: Joerg Sonnenberger Date: Mon Apr 13 21:49:01 2020 +0200 Check for libc++ directly, not for the kernel commit 35428571776efdcaedcc9f920e927526849727a0 Author: John Bowman Date: Mon Apr 13 10:13:53 2020 -0600 Fix Bezier patch bounds bug introduced in bf3be19f7f1daf5730dabbf5c89e8a4f0f451a7d. commit 7f9480e35619e4cd6e7114cd025603c2e1937586 Author: John Bowman Date: Mon Apr 13 10:10:31 2020 -0600 Revert "Fix export bug." This reverts commit 1566850db2aac0b78ec9806e35af514e7a185e63. commit decb4d5109744545082eb1843dcb2f1a52d4158c Author: John Bowman Date: Fri Apr 3 08:39:40 2020 -0600 Add libtirpc dependency. commit 386b93b6d4770893d01ebc2ba25637546bca9f33 Author: John Bowman Date: Wed Mar 25 22:23:40 2020 -0600 Increment version to 2.66. commit 1566850db2aac0b78ec9806e35af514e7a185e63 Author: John Bowman Date: Tue Mar 24 23:30:17 2020 -0600 Fix export bug. commit 48777621e61327bf6c8e3492739066495693b91c Author: John Bowman Date: Sat Mar 21 23:44:05 2020 -0600 Add triple perp=O argument to rmf(path3, real[] t); don't cache previous perp. commit 5a3fd21eddb4b6416a664581cfa9bf324b8889b1 Author: John Bowman Date: Tue Mar 10 14:56:11 2020 -0600 Detect failure of TeX pipe. commit 40dc7d7b71fa5d02c5558a12b99b13385e460a75 Author: John Bowman Date: Thu Mar 5 18:49:30 2020 -0700 Update documentation. commit 4891f4653598b70f2a9e1f5836f7e7bc2d4187aa Author: John Bowman Date: Thu Mar 5 18:08:42 2020 -0700 Fix typos. commit 4f54a5bedca4fb42418e49960ea8d82a4023e043 Author: John Bowman Date: Thu Mar 5 18:00:46 2020 -0700 Fix typos. commit ce34396977cd41e372180d1cedbd5206891ff314 Author: John Bowman Date: Thu Mar 5 18:00:32 2020 -0700 Update documentation. commit 79ec5d5c2b5bd432709265d53bcbe51d0cafe1ce Merge: c161ffe7b f9bc3f2bb Author: John Bowman Date: Thu Mar 5 14:15:05 2020 -0700 Merge branch 'master' into Qt. commit f9bc3f2bbdbb382a1cbf15b7b977608900b2d804 Author: John Bowman Date: Wed Mar 4 22:44:32 2020 -0700 Update asygl. commit 98f09b5f3bf009702c56ecca6378277c0e0d7e11 Author: John Bowman Date: Wed Mar 4 22:00:02 2020 -0700 Improve nondegenerate sphere. commit cfa1c9f263e911be76719413e10abed2a2ad25cd Author: John Bowman Date: Tue Mar 3 21:44:25 2020 -0700 Increment version to 2.65. commit df95759c3752e7fc902894ce73ba86d91e16a5e9 Merge: 396d060c5 ae3dc713a Author: John Bowman Date: Tue Mar 3 16:52:03 2020 -0700 Merge branch 'master' of github.com:vectorgraphics/asymptote. commit 396d060c5a4b0d2b5782889fd83f191c0d0de7a4 Author: John Bowman Date: Tue Mar 3 16:50:54 2020 -0700 Work around incorrect declaration in NetBSD readline.h v1.33. commit ae3dc713aa789672c931474e467bcca82ae4a73f Author: John Bowman Date: Tue Mar 3 14:44:10 2020 -0700 Add memory to rmf tube basis. commit 23f160e092e1fb7bebe4f3f7e131242791816987 Author: John Bowman Date: Tue Mar 3 00:51:52 2020 -0700 Update examples. commit 52ad58d7c865f029f162f1f40e9c87a09a5ecf4d Author: John Bowman Date: Mon Mar 2 23:36:16 2020 -0700 Increment version to 2.64. commit 6df59d64acb38ad48002d1cae4350ca5cede5267 Author: John Bowman Date: Mon Mar 2 22:15:59 2020 -0700 Increase default output precision to 7. commit 41e51a6302829c2c85af94c50b53e54a9052c7cb Author: John Bowman Date: Mon Mar 2 20:47:10 2020 -0700 Check for editline header. commit 4a2852bb9f609a35e38f032cbc3f401441bf1d6c Author: John Bowman Date: Mon Mar 2 20:13:09 2020 -0700 Fix unused variable warning messages. commit 0dbd4412b4772ffbde89d3feedc26e3ecee1dc62 Author: John Bowman Date: Mon Mar 2 19:55:26 2020 -0700 Support compilation without LIBGLM. commit dc49282bb475174689adcdbe18979ef366e79d4a Author: John Bowman Date: Mon Mar 2 09:11:49 2020 -0700 Fix numerical precision issue in tube subdivision; invert tubethreshold. commit c59833c3fd8ff7c88950bf1ac7dda50a1fb2796a Author: John Bowman Date: Sun Mar 1 22:56:56 2020 -0700 Update asygl. commit 104a2c9db80d702a86f10d6ccd403c1e1c38d88a Author: John Bowman Date: Sun Mar 1 22:54:49 2020 -0700 Fix WebGL cylinder bounds. commit 9f583631684d4f53d5818a70f3db14b747ec9653 Author: John Bowman Date: Sun Mar 1 21:34:35 2020 -0700 Fix warning message. commit f23a3c044ed9fb2ba7e58045f8b785baa31a1d99 Author: John Bowman Date: Sun Mar 1 21:32:20 2020 -0700 Update fftw++. commit 484d45498dc7180a91aba3f62f1ee247fc3210b0 Author: John Bowman Date: Sun Mar 1 18:49:16 2020 -0700 Check for popcount. commit 301f42493376b65ae7127ec7d4f49fc3cb519183 Author: John Bowman Date: Sun Mar 1 11:32:45 2020 -0700 Revert to light=nolight default for drawing a path3. commit f483a0715496e7ae423e38253af2d3c5152013ca Author: John Bowman Date: Sun Mar 1 11:10:46 2020 -0700 Check radius of curvature at both tube ends; simplify code. commit 839c3a85d6a715c06fabccfed990a9959ce83eb5 Author: John Bowman Date: Sat Feb 29 20:11:47 2020 -0700 Update asygl. commit 3ffe64476247b4d3680c9a7ec2d85fd3fe9e012f Author: John Bowman Date: Sat Feb 29 19:44:44 2020 -0700 Port curve lighting to WebGL. commit 9d932516731c26a811b512ed91a7631e5c825344 Merge: ffa4ef3f1 d4285d04f Author: John Bowman Date: Sat Feb 29 17:21:30 2020 -0700 Merge branch 'curvenormal'. commit d4285d04fd982fb7a977b44770cf2c3464bd121c Author: John Bowman Date: Sun Feb 23 22:03:33 2020 -0700 Implement curve lighting. commit ffa4ef3f199dec850a38d52a669464989a0cb32c Author: John Bowman Date: Fri Feb 28 00:29:04 2020 -0700 Make comma optional in stream reads of parenthesized pairs or triples. commit 7f3cebcec4ced07f9e076ece132dd552314f5c17 Author: John Bowman Date: Fri Feb 28 00:10:47 2020 -0700 Fix getc bug. commit 19e5bc0c14e59deff28327db3318469b617a806a Author: John Bowman Date: Wed Feb 26 22:20:36 2020 -0700 Implement 2D and 3D FFTs. commit 00f2621999ede5d11bcf4a6841f76a2b8f9913d0 Author: John Bowman Date: Wed Feb 26 22:18:21 2020 -0700 Return nonempty palettes for undersized requests. commit d5fe9828872b9a38db42bf5bcd4e556c10c7d8b8 Author: John Bowman Date: Sun Feb 23 20:04:32 2020 -0700 Update asygl. commit 384d99a345db43235456f8c2c631ad70c12f9dc5 Author: John Bowman Date: Sun Feb 23 19:59:16 2020 -0700 Add directional flatness test; simplify unitcone and unitfrustum. commit b0db12cdeab174f662b62c31d20af69aaa8b87cc Author: John Bowman Date: Sun Feb 23 17:01:38 2020 -0700 Update asygl. commit 85e78e1ee51a21e294b362e66104706f02bd69d3 Author: John Bowman Date: Sun Feb 23 16:53:39 2020 -0700 Fix primitive subdivision cracks by enforcing bounds on the entire object. commit e50f6dea3d9f1d6a2773e5e6dbf60a508657fe30 Author: John Bowman Date: Sun Feb 23 13:50:48 2020 -0700 Remove obsolete BezierFactor. commit 6ba502a16fd84653edbaba01e683d407d838cf95 Author: John Bowman Date: Sun Feb 23 12:21:15 2020 -0700 Update asygl. commit 975b6c2c474ba1cd0df54974c74379a2784483a0 Author: John Bowman Date: Sun Feb 23 12:13:43 2020 -0700 Fix subdivision crack adjustments. commit 86218eb8ca0fda14515c62687f1a9ae71cf9ed50 Author: John Bowman Date: Sun Feb 23 11:44:25 2020 -0700 Port commit 0d63d91ba66b022ef753fa7cb088e120294b7039 to WebGL. commit 93f45abe9bf89b142a7ecdd517b1b20faffc5512 Author: John Bowman Date: Sat Feb 22 23:31:37 2020 -0700 Reformat. commit 34e78162304f3b989d17a2e0101f8136d8abd1de Author: John Bowman Date: Sat Feb 22 23:23:53 2020 -0700 Improve workcone example. commit 0d63d91ba66b022ef753fa7cb088e120294b7039 Author: John Bowman Date: Sat Feb 22 22:58:30 2020 -0700 Split patches in both directions only when required. commit 716db94b4302b728d2a98a352ccf31afdfca92de Author: John Bowman Date: Sat Feb 22 12:58:09 2020 -0700 Remove redundant Bezier patch flatness test. commit cdbe687ca2faf5e77a7a5fdd8774930f4a1a7ebe Author: John Bowman Date: Sat Feb 22 12:38:36 2020 -0700 Add surface operator cast(surface[] s) for backwards compatibility. commit 5f12a9e9bf4aeea489f614749f05a2b9bb0e8394 Author: John Bowman Date: Sat Feb 22 12:21:49 2020 -0700 Update tube.asy and example. commit 713b2bcc7ab237faaf174b3474f8eb9064dac121 Author: John Bowman Date: Fri Feb 21 21:26:42 2020 -0700 Fix straight Bezier patch bounds bug in commit 59227a95289288cf7f259559bb43e21b02dfff59. commit 59227a95289288cf7f259559bb43e21b02dfff59 Author: John Bowman Date: Fri Feb 21 20:19:16 2020 -0700 Fix WebGL primitive tube bounds. commit 1eee76fad6144b5ca89d4f46d5e51e2abb0894d7 Author: John Bowman Date: Fri Feb 21 09:44:18 2020 -0700 Update asygl. commit dc02c6b64851aa315def86f944e43ce9c842c3b6 Author: John Bowman Date: Fri Feb 21 09:42:05 2020 -0700 Fix degenerate WebGL tube primitive. commit ca6b1cb2ba259bc43948621b607fde9e01768b46 Author: John Bowman Date: Fri Feb 21 09:19:30 2020 -0700 Fix material bug in primitives. commit 36045af736195662ed0019b2910d9b1603329295 Author: John Bowman Date: Fri Feb 21 02:22:37 2020 -0700 Update asygl. commit 60ae5b446350c3938af0702016848cb45be4769d Author: John Bowman Date: Fri Feb 21 02:21:46 2020 -0700 Fix typos in gl.js; temporarily work around unitcylinder primitive bug. commit e761621867b49f3edb21363bff859b904cd9afc8 Author: John Bowman Date: Fri Feb 21 01:31:19 2020 -0700 Temporarily disable offscreen culling of WebGL tubes. commit 89c4c49f4121864db68d83e5a954a557ec9a4791 Author: John Bowman Date: Fri Feb 21 00:03:12 2020 -0700 Update asygl. commit 9833a4300c0318a297899284a9cc49ca11633a09 Author: John Bowman Date: Thu Feb 20 23:43:45 2020 -0700 Implement WebGL tube primitive; remove PRC tube primitive. commit 78be4fe3ad53a6eca98318efd689f5eb1dd68424 Author: John Bowman Date: Mon Feb 17 22:06:53 2020 -0700 Improve tube rendering; simplify DefaultHead3; fix degenerate normal tests. commit ba6f8988132d3f0b82e0d51bd3a49089fc2bb067 Author: John Bowman Date: Mon Feb 17 21:25:27 2020 -0700 Fix test degenerate normals. commit c1a8c0a212aa32eed3a0e78b91ad1abc540795cf Author: ivankokan Date: Wed Feb 12 17:25:00 2020 +0100 Update documentation commit 173d1e8c9d2de43a11053b98f0f964af658a8a02 Author: ivankokan Date: Wed Feb 12 14:35:31 2020 +0100 Remove latin1 module commit 525dbb95a60cc75f7f55075b8d0e1deaba981edf Author: ivankokan Date: Wed Feb 12 14:33:06 2020 +0100 Remove unicode module commit d560eaefbcffe9eb6c26db1d4fd1b365daa5799a Merge: 2898b83f6 9beb5b6c7 Author: Ivan Kokan Date: Wed Feb 12 13:42:05 2020 +0100 Merge pull request #2 from vectorgraphics/master Sync commit c161ffe7b7e4b84a0e0767fd3e881587660cc7a1 Author: Pedram Emami Date: Thu Feb 6 14:05:54 2020 -0700 Pulish the code and include incode documentation commit 9beb5b6c72ce47c8fad8c33f14b78015c9baa40f Author: John Bowman Date: Wed Feb 5 22:26:02 2020 -0700 Fix MSDOS configuration issue. commit 9e2be068ab6d03ed82651ab21d8271c1707eb0bd Author: John Bowman Date: Mon Feb 3 09:07:07 2020 -0700 Update asygl. commit 202291e8a54c356e22885609ade96dfb79bdc360 Author: John Bowman Date: Mon Feb 3 09:02:36 2020 -0700 Add general surface primitives; implement sphere, cylinder, and disk. commit a615e55bec2cddeaecddaac49cc7a00b664260c7 Author: John Bowman Date: Sun Feb 2 10:31:13 2020 -0700 Update URLs in manual. commit bed68b2135d2ca238107977e24c7fd74e11b71ea Author: John Bowman Date: Sat Feb 1 11:36:31 2020 -0700 Fix MacOS X OpenGL diagnostic. commit 890542188cd2071ffa8aac0da1f266bd3e9d35fd Author: John Bowman Date: Thu Jan 30 22:27:37 2020 -0700 Fix arrowheads. commit 229a1ce4dfe12cfbce64f62411d38aff7bc23d66 Author: John Bowman Date: Thu Jan 30 12:24:58 2020 -0700 Update asygl. commit c54573e22bc7e4c6ed226f3c96fdf59df396310c Author: John Bowman Date: Thu Jan 30 12:24:19 2020 -0700 Work around uglify bug. commit af0f23b9fcbe5a86d6504e92a542ec9327a4f13a Author: John Bowman Date: Thu Jan 30 12:13:40 2020 -0700 Revert "Update asygl." This reverts commit aca1a213e5512866ad4658131c6ec49dd24ad920. commit aca1a213e5512866ad4658131c6ec49dd24ad920 Author: John Bowman Date: Thu Jan 30 12:10:46 2020 -0700 Update asygl. commit b6af466ba0a5d87fa1eeb4799f42e360a4b5d968 Author: John Bowman Date: Thu Jan 30 12:08:15 2020 -0700 Implement asygl sphere primitive; remove PRCshininess translation. commit 4283a1dba8b15010ec1f1455d1544f20381425f2 Author: John Bowman Date: Tue Jan 28 23:26:19 2020 -0700 Fix epsilon. commit 60ec71c54ac97a5b5b24987cf663168e713b7ca2 Author: John Bowman Date: Tue Jan 28 16:43:43 2020 -0700 Fix degenerate surface normals. commit 7300f0c37ca036f7b47ea2197026a58f3b1a03d4 Author: Pedram Emami Date: Mon Jan 27 21:17:21 2020 -0700 Apply patch and modify getObjectCode() in xasy2asy.py commit fdf8aeae3c1a11fb04f70674ca060a814fe2b12c Author: John Bowman Date: Wed Jan 22 09:24:35 2020 -0700 Update asygl. commit 85ee50a6b64875ea3c5e6acf8195eb2139916839 Author: John Bowman Date: Wed Jan 22 09:24:03 2020 -0700 Don't delete embedded shaders. commit be28c80bd4aabecfa106de5e897255d4bc03b9e9 Author: John Bowman Date: Wed Jan 22 01:28:58 2020 -0700 Update asygl. commit 136fb78e7f18500cc97867cc36d3dc6a9f2c69b0 Author: John Bowman Date: Wed Jan 22 01:25:50 2020 -0700 Fix billboard labels in wireframe mode. commit 59176146c24186463cc4d981acf760008a111403 Author: John Bowman Date: Wed Jan 22 01:04:06 2020 -0700 Update asygl. commit cafd93a3e58a774d3022c68fd9ab7088346cf4e3 Author: John Bowman Date: Wed Jan 22 01:02:45 2020 -0700 Fix wireframe mode with transparency and indexed triangles. commit 52e5d3f4e21cfdb04ec44667b76d4ae6db8ed387 Author: John Bowman Date: Wed Jan 22 00:34:36 2020 -0700 Update asygl. commit 6ab2b06ad276aff1d71cea3ee9302b7f6771fb42 Author: John Bowman Date: Wed Jan 22 00:34:05 2020 -0700 Fix wireframe modes with transparency. commit 5930496436c9791ae8779b02791ff2fb7e3d3b30 Author: John Bowman Date: Wed Jan 22 00:07:32 2020 -0700 Update asygl. commit 84209ded0c2cace5fd9f104ec3c44a6139dec662 Author: John Bowman Date: Tue Jan 21 19:46:35 2020 -0700 Implement mesh mode in WebGL. commit d4593b6ccd91019edd123d0e867456994022d9e2 Author: John Bowman Date: Mon Jan 20 21:14:55 2020 -0700 Disable OpenGL at compile time if version 3.2 is unavailable under MacOS X. commit ba29f3dc345f69c5e312b1b4969f6ba05f770292 Author: John Bowman Date: Sun Jan 19 18:23:28 2020 -0700 Implement nondegenerate octant1, hemisphere, and sphere (requires 208 instead of 128 control points but generates fewer triangles, renders faster, and avoids transparency artifacts at poles). commit eb33c6bf005144d04003a8d6528d98b36701f55f Author: John Bowman Date: Sat Jan 18 23:30:01 2020 -0700 Fix outline mode. commit 3e155439ed1f587db52f9e2cb756d4cd0b5b6e96 Author: John Bowman Date: Sat Jan 18 17:56:40 2020 -0700 Update config utilities. commit c9ac7a566ebefb4c07e24c6d55e4cd4b7c85d078 Author: John Bowman Date: Sat Jan 18 17:42:03 2020 -0700 Fix assertion. commit bfa91b25f845ffae6fea8d0bc9665024dfd6c9ba Author: John Bowman Date: Sat Jan 18 13:41:05 2020 -0700 Fix include path. commit a0c44e0b438217ad04eb7833a8acc3a7bd571c0f Author: John Bowman Date: Sat Jan 18 13:33:45 2020 -0700 Fallback to Editline if GNU Readline library is unavailable, to at least have command-line editing (without history support). commit bae3845ec61e394c996dffb1256d96094fa80788 Author: John Bowman Date: Sat Jan 18 00:30:08 2020 -0700 Update sourceforge URLs. commit 94460625cfb662ea5ceb1e769208ecc386d115d7 Author: John Bowman Date: Fri Jan 17 07:48:50 2020 -0700 Allow overriding default emissive and shininess values for vertex-dependent colors. commit fb3a60597c869d559e21f6dcfce0f64e7c5e1a1e Author: John Bowman Date: Thu Jan 16 15:01:01 2020 -0700 Fix a6a1ec40a864c27b7ca02336940c24f7a5a53c1a. commit 5aec7d5bd3f569343b250ca2997bb966235f436b Author: John Bowman Date: Thu Jan 16 14:27:16 2020 -0700 Update asygl. commit e7da4b39f67abdd73e42afb02b6107edd16fe856 Author: John Bowman Date: Thu Jan 16 13:48:42 2020 -0700 Update asygl. commit 218f96b42824c6a1dfa70b0289344b0a71fa282f Author: John Bowman Date: Thu Jan 16 13:26:39 2020 -0700 Update asygl. commit a6a1ec40a864c27b7ca02336940c24f7a5a53c1a Author: John Bowman Date: Thu Jan 16 13:24:49 2020 -0700 Avoid race condition. commit 18c8da80a5f780dd2b814844c0f3d132bc525636 Author: John Bowman Date: Tue Jan 14 21:25:42 2020 -0700 Increment version to 2.63. commit fe3aaeb627833abb5a7685781d75bc8b4d0c967e Author: John Bowman Date: Tue Jan 14 14:14:11 2020 -0700 Replace object with iframe in WebGL usage comment. commit ecc6df99d5d549399deea418a85b575f4382fc96 Author: John Bowman Date: Sun Jan 12 22:23:08 2020 -0700 Update asygl. commit 339ae281829782c08d0770457f3cb178660b50eb Author: John Bowman Date: Sun Jan 12 22:13:49 2020 -0700 Disable zooming of embedded WebGL images until activated with a click or touch event, using ESC to cancel activation. commit 83f6f46dd747a7f5ffb70724c96e4df8c7baf422 Author: John Bowman Date: Sun Jan 12 18:14:58 2020 -0700 Fix various HTML warnings. commit 63e57e22672ef485fafbe6cb207e03a4d4d30e66 Author: John Bowman Date: Sun Jan 12 16:48:53 2020 -0700 Use relative paths in asymptote.pdf images. commit 79296236068897d39e112d12eaf98ecaaaebecbc Merge: b3b0d915a 2898b83f6 Author: John Bowman Date: Sun Jan 12 16:42:21 2020 -0700 Merge pull request #126 from ivankokan/master WIP: Hyperbola by foci passing through a point commit b3b0d915aca4f6ceb3e398904e06882d06c8bc1b Author: Lemures Lemniscati Date: Mon Jan 13 08:03:07 2020 +0900 Eliminate one more magic offset -37.01pt (related to #123). (#132) commit cbce9f0777e6c14da2e2aebd02a4a4503ebb0f7b Author: John Bowman Date: Sun Jan 12 14:51:29 2020 -0700 Add end-of-line comments. commit da4cf743b5803ccc09227d543358ef561268c242 Author: John Bowman Date: Sun Jan 12 14:41:27 2020 -0700 Remove import of obsolete grffile package. commit c96a7612a3c3d6c2fec92c0232af721abdf9578d Author: John Bowman Date: Sat Jan 11 22:56:23 2020 -0700 Update asygl. commit 1c0db1574a4b4c45f762e500e2d6b5e8b9c0e17c Author: John Bowman Date: Sat Jan 11 22:54:10 2020 -0700 Avoid WebGL polling. commit 4fe02ea82ec6054f89bd901404d9eba533c8d392 Author: John Bowman Date: Sat Jan 11 14:49:06 2020 -0700 Update asygl. commit 12b212ec97a5ef9fa84157723481ac165cfcaaf1 Author: John Bowman Date: Sat Jan 11 14:48:27 2020 -0700 Store webgl context in top rather than parent window. commit 648fa0336acc70b753bdf61a30588b6aa859a949 Author: John Bowman Date: Fri Jan 10 23:13:37 2020 -0700 Update asygl. commit b206e1bea6bf4b59c480fd0f3f705db4301578a3 Author: John Bowman Date: Fri Jan 10 23:10:25 2020 -0700 Populate canvas style with design width and height. commit 685b9eae1f418757d78d53d3e3408acbb64d14e8 Author: John Bowman Date: Wed Jan 8 19:54:08 2020 -0700 Fix typo in documentation. commit b35aa3a56960f9eb6bbecab2e4b325ee02d3b160 Merge: 374823ebe 8cfac4d98 Author: John Bowman Date: Sun Jan 5 09:49:20 2020 -0700 Merge branch 'master' of github.com:vectorgraphics/asymptote. commit 374823ebedec9a0019e32a20110980650d28a39e Author: John Bowman Date: Sun Jan 5 09:49:03 2020 -0700 Fix documentation of surface tube. commit 8cfac4d98c45505e59794c24e03c9192010616cd Author: Lemures Lemniscati Date: Mon Dec 9 14:48:45 2019 +0900 Fix issue #123 (#131) * Revert "Workaround lualatex bug #123." This reverts commit 41fbc67260971ebd5ab817ac902944d96462f543. Not a lualatex bug, but a wrong assumption in asymptote that \parindent were always 17.61pt. * Fix offset settings where texengine is latex and pdf #123. commit ff4b7ed15b7e5a04f2e5d669a5cdde839dc43e97 Author: John Bowman Date: Sun Dec 8 22:34:52 2019 -0700 Add diagnostic to rationalSimplex. commit 5a15f56a587a9b725c0ad6531598260788ca4677 Author: John Bowman Date: Sat Nov 30 13:32:29 2019 -0700 Fix Bland's rule in iterateDual. commit 51b71e20deb597100963be8ae720124091c9cb99 Author: John Bowman Date: Wed Nov 27 09:31:19 2019 -0700 Remove superfluous semi-colons. commit d4b3051e0a1afc421723539272bba61df1a8b69f Author: John Bowman Date: Tue Nov 26 07:57:25 2019 -0700 Suppress redundant shipout in example. commit 9ea04c5be89ed5d805a21fc0f613cfa04e778b11 Author: John Bowman Date: Tue Nov 26 07:55:43 2019 -0700 Remove non-ASCII characters from geometry.asy. commit 80bc74cbc63f3d98bd15535d451a04cdca41e811 Author: John Bowman Date: Mon Nov 25 19:01:36 2019 -0700 Prevent asy from hanging on texpreamble errors. commit ddf49a3ed614644573673fcf44afa5c1c35279cb Author: John Bowman Date: Mon Nov 25 16:27:08 2019 -0700 Avoid duplicate intersections: don't increase intersection fuzz with depth. commit 14c455c0dd519bc55e3f51bbe6d2e7288b8e48f9 Author: John Bowman Date: Mon Nov 25 11:55:30 2019 -0700 Fix typo in documentation. commit 2898b83f6e50ed08557e130154e087523d97beff Author: ivankokan Date: Mon Nov 25 18:12:53 2019 +0100 Angles considering special cases commit b5455dd04d4a8b71973e03fa973832b5893b689c Author: ivankokan Date: Mon Nov 25 17:16:13 2019 +0100 Remove unnecessary code commit a0aee9784264c7f22de6ac01648de2293de5aec2 Author: ivankokan Date: Mon Nov 25 16:50:11 2019 +0100 Reorder/align some statements commit 41fbc67260971ebd5ab817ac902944d96462f543 Author: John Bowman Date: Sun Nov 24 11:41:56 2019 -0700 Workaround lualatex bug #123. commit ec3c7f09772ebc78880f7a08740e7009e57d20b8 Author: John Bowman Date: Sat Nov 23 00:26:50 2019 -0700 Fix diagnostic. commit 7fbf7c5b0635c6dacaa856901f1c349b95a6c966 Author: John Bowman Date: Sat Nov 23 00:15:20 2019 -0700 Fix example. commit 0f3c966c8b3f905e64c70e005c81679a61289314 Author: ivankokan Date: Fri Nov 22 14:53:19 2019 +0100 hyperbola by foci passing through a point commit 1f6ccfc849a2f920007b270a7cc3c2d4e3a93203 Merge: b050a1b46 1fca842ea Author: Ivan Kokan Date: Fri Nov 22 14:15:24 2019 +0100 Merge pull request #1 from vectorgraphics/master Sync commit 1fca842ea05a0a26afd7df011e2cf6e1d6f70994 Author: John Bowman Date: Sun Nov 17 23:43:12 2019 -0700 Update example. commit 9160692eeafe63b7a73aad62917aec6aa4acd26f Author: John Bowman Date: Sun Nov 17 23:30:30 2019 -0700 Increment version to 2.62. commit 908e69dbbd1912344cea79f08c1eb0e67e5519f9 Author: John Bowman Date: Sun Nov 17 22:26:50 2019 -0700 Fix material attribute. commit e00580292beee7b293288d78f53ba9779dad885e Author: John Bowman Date: Sun Nov 17 11:15:50 2019 -0700 Fix issues on Intel GPU under MSWindows. commit ebe76a4b0b55f94c2e8ee2d239fa34fa7b18703e Author: John Bowman Date: Tue Nov 12 09:58:53 2019 -0700 Set materials before offscreen optimization. commit 114081b38510dd52e08a0fc9508e40f873f8d218 Author: John Bowman Date: Sat Nov 9 09:36:41 2019 -0700 Move piicon.png to examples directory. commit a4fba693380c4d18a978926f17aac6af95ac4a2d Author: John Bowman Date: Sat Nov 9 09:19:43 2019 -0700 Install piicon.png instead of piicon.eps. commit 83e20a685902f7b99cb614d1816f48c01c23be90 Author: John Bowman Date: Sat Nov 9 00:25:04 2019 -0700 Use bindAttribLocation instead of getAttribLocation in OpenGL. commit 0c8bf045706326bbafd94c0225d8714f30c97a93 Author: John Bowman Date: Sat Nov 9 00:07:11 2019 -0700 Update asygl. commit 726b3718b56c067fbe12e1b9d934ad09500b195c Author: John Bowman Date: Sat Nov 9 00:05:46 2019 -0700 Bind color attribute. commit 478292990693ea59cce9028f220be0234b4a591b Author: John Bowman Date: Fri Nov 8 23:27:07 2019 -0700 Fix Bland's rule in rationalSimplex and simplex. commit 399ca406efab1136e8e12f976ffb7ffd7ecf7def Author: John Bowman Date: Thu Nov 7 03:15:27 2019 -0700 Update asygl. commit eb146915adde3fc70adab78182c52f23e318df22 Author: John Bowman Date: Thu Nov 7 03:13:03 2019 -0700 Use bindAttribLocation instead of getAttribLocation in WebGL. commit fb2868c7cdb3a93681ab0af8c293867a1efcdbc9 Author: John Bowman Date: Thu Nov 7 01:44:11 2019 -0700 Work around WebGL singleton array optimization bug on Intel GPU. commit 8ad8fb290dada087b068d518e7dc5fe78d39570f Author: John Bowman Date: Wed Nov 6 00:03:32 2019 -0700 Increment version to 2.61. commit 87dc3554015dccce0cf446e27a703043a9c68460 Author: John Bowman Date: Tue Nov 5 17:11:42 2019 -0700 Revert "Remove obsolete MSDOS Intel GPU workaround." This reverts commit e47b19bb47079c8def40e5f4b5eb7946fec6a0c2. commit 08804433e46c83fc4c38ca7db92f21b9cf70fa90 Author: John Bowman Date: Tue Nov 5 11:25:39 2019 -0700 Convert POSIX filename to MSDOS filename. commit 2d54552ca95cce7eef5d2a46bd19136e76bbaa45 Author: John Bowman Date: Tue Nov 5 00:15:02 2019 -0700 Fix commit 24c7bcbc8b6e2e08938ab1fd088e922a0806251f. commit 6bdf7fc2c23fa27d67c42482d37860d41f377d92 Author: John Bowman Date: Mon Nov 4 23:22:22 2019 -0700 Allow an object to be positioned finely with the arrow keys while holding down the mouse button. Fix origin and center order. Fix anchor names. commit 4a0a2aa6e100fefc4961af95f71a018a18e07ce9 Author: John Bowman Date: Mon Nov 4 23:08:54 2019 -0700 Update asymptote.sty to use grffile. commit a11ea822167aee40c23601c4d9e2391ac2571859 Author: John Bowman Date: Mon Nov 4 21:10:30 2019 -0700 Fix commit 41cc1fa54e638954177314a0add6b2d3a043257f. commit 41cc1fa54e638954177314a0add6b2d3a043257f Author: John Bowman Date: Mon Nov 4 00:21:22 2019 -0700 Use grffile to fix issues with included file names. commit 4dc96555e0f56e387d4f64d26865d1cfdcefc0fd Author: John Bowman Date: Sun Nov 3 00:09:12 2019 -0600 Fix bug #117: Wrong silhouette generated of a cylinder. commit 309c5aa4210a9d06b12b15a5bc3d2c21467827f2 Author: John Bowman Date: Sat Nov 2 20:10:10 2019 -0600 Revert "Reinstate comment about using glOptions=-indirect for old graphics card drivers." This reverts commit 1b752422335ba3991f3e2ad0cf145e141336ccb5. commit 6a13f8a10e9fe420f153670b59b25f235cb0407c Author: John Bowman Date: Sat Nov 2 15:05:22 2019 -0600 Fix returned x array in rationalSimplex; port optimizations to simplex. commit 1b752422335ba3991f3e2ad0cf145e141336ccb5 Author: John Bowman Date: Sat Nov 2 10:55:38 2019 -0600 Reinstate comment about using glOptions=-indirect for old graphics card drivers. commit 24c7bcbc8b6e2e08938ab1fd088e922a0806251f Author: John Bowman Date: Sat Nov 2 00:18:23 2019 -0600 Make locatefile return fully qualified file name; use this for viewing WebGL files. commit c7370db9723c5c5ea2d7d699184ab571d994a9c4 Author: John Bowman Date: Thu Oct 31 03:11:33 2019 -0600 Fix xasy resize. commit dea5702365e018d9972aabec6b0ca1010cb0f586 Author: John Bowman Date: Thu Oct 31 02:31:44 2019 -0600 Port xasy to high-resolution screens. commit 7bf1cf2c8bd9726adb1c3e4fc063413261a4335d Author: John Bowman Date: Thu Oct 31 02:27:46 2019 -0600 Implement pad function that pads a picture to a precise size in both directions. commit cbb8cd4e40fbaec31e12e14d9328d77bcdf6c557 Author: John Bowman Date: Tue Oct 29 21:18:36 2019 -0600 Support SVG output of embedded PNG, JPEG, and external vector PDF images using dvisvgm 2.8. commit b4dab27669302117b1b7c04857b08eb8b13c2406 Author: John Bowman Date: Tue Oct 29 09:02:39 2019 -0600 Fix xasy handling of Ctrl-c. commit 5557453a5f8449b7f93919edcfcc988b7cd345dc Author: John Bowman Date: Mon Oct 28 16:30:01 2019 -0600 Fix basic indices in rationalSimplex. commit 874192f5ae7e9f83f87a9172c8fd1a44f70e1231 Author: John Bowman Date: Mon Oct 28 13:35:50 2019 -0600 Simplify code. commit e40690d60d02de390e8fc62828f3051e4e2fdf9d Author: John Bowman Date: Mon Oct 28 13:32:20 2019 -0600 Fix infeasible test in simplex.asy. commit e3a121b5d592616bbbd0ea6dcb72220a062fddde Author: John Bowman Date: Mon Oct 28 13:05:01 2019 -0600 Move basic variables in rationalSimplex to column 0. commit 343f68ac12b52ae5aa33860c7ba7103f817b594c Author: John Bowman Date: Mon Oct 28 03:26:45 2019 -0600 Check for redundant basis vectors in phase1 of rationalSimplex. commit 1812df7829f5f7fcda6cdca25acedd9b97b3145d Author: John Bowman Date: Sat Oct 26 22:31:13 2019 -0600 Standardize write(rational[]) suffixes. commit 4ace4c826aab8ef389a8db8da4ede379d6d3db45 Author: John Bowman Date: Sat Oct 26 22:25:20 2019 -0600 Fix write(rational) default suffixes. commit 215baa5db338ccc96d57b37c384bbe052576f79b Author: John Bowman Date: Sat Oct 26 22:24:42 2019 -0600 Fix iterateDual(real[][],int,int[]). commit 9efff08def182ff337b0181abe0007d70f171fbf Author: John Bowman Date: Fri Oct 25 20:55:54 2019 -0600 Avoid use of test -o. commit 4abe6fcff760363c0f852b1d79a9a206518477a5 Author: John Bowman Date: Fri Oct 25 19:19:55 2019 -0600 Use htmlviewer to display svg files. commit c120b2ee98ce8983ded8d0119dff3beb6bfab9f3 Author: John Bowman Date: Thu Oct 24 17:19:23 2019 -0600 Fix Makefile.in. commit 06fc2f7bac97523daadf79debb6f33b979a7d4be Author: John Bowman Date: Thu Oct 24 17:09:35 2019 -0600 Simplify Makefile.in. commit 6fe8d14817071258f36c6ac61b772a81b482296b Author: John Bowman Date: Thu Oct 24 17:09:02 2019 -0600 Update asygl. commit 743f5bc77fe6796140f613e8754ed6e1022574a2 Author: John Bowman Date: Thu Oct 24 17:07:34 2019 -0600 Fix transparent background. commit 6ac68161f924e83fd2178c30cbdfd3fd05d63900 Author: John Bowman Date: Wed Oct 23 21:09:57 2019 -0600 Fix revision.cc. commit 7ae1f80cf7fb4cb5abbcc23eef8fa4e591a413fc Author: John Bowman Date: Sat Oct 19 23:42:45 2019 -0600 Increment version to 2.60. commit e47b19bb47079c8def40e5f4b5eb7946fec6a0c2 Author: John Bowman Date: Sat Oct 19 22:36:58 2019 -0600 Remove obsolete MSDOS Intel GPU workaround. commit 64ad659eed5015f568fbfc08a4bf65ee66e429a8 Author: John Bowman Date: Sat Oct 19 20:29:42 2019 -0600 Port to MacOSX. commit 1abf16a851f36541dad9fe29f4ea03701dfd426b Author: John Bowman Date: Sat Oct 19 18:10:47 2019 -0600 Fix warning message. commit e3103ae3464da73a0af4e9e193139b68a4758333 Author: John Bowman Date: Sat Oct 19 17:04:00 2019 -0600 Update asygl. commit c05b1d7fab525a7d7f1a153a0af157fa16f99721 Author: John Bowman Date: Sat Oct 19 16:17:31 2019 -0600 Remove unused code. commit 1af6f8a4adda6fd175b72265fe1a3ddd6d0e95db Author: John Bowman Date: Sat Oct 19 16:12:01 2019 -0600 Fix transparency bug introduced in a05450337791d59966d12fedecb19e73bebc2415. commit f634dfe0a8ddedbc1d575cbbe92dcab1f44c3666 Author: John Bowman Date: Sat Oct 19 15:16:22 2019 -0600 Remove maxvertices setting, which is no longer required; fix materialTable resizing. commit 24feb014dd4bc563d52c8fa6b14c3e097ec3d03a Merge: ea84254a3 8d8031f70 Author: John Bowman Date: Sat Oct 19 12:53:50 2019 -0600 Merge branch 'prune'. commit 8d8031f70536399553293b76b5893f10c3e0354d Author: John Bowman Date: Sat Oct 19 12:27:32 2019 -0600 Don't reserve space for vertexBuffer data. commit eed0d85771f12724655450b2a07bcc3a2de3c8e6 Author: John Bowman Date: Sat Oct 19 02:47:25 2019 -0600 Port WebGl material changes to OpenGL. commit ea84254a34b02cbfb70fb4c312beb1fb57720f68 Author: John Bowman Date: Sat Oct 19 02:05:16 2019 -0600 Make glm happy again. commit 3f7ebd06a25b02aae4491b063744205414fcbcdd Author: John Bowman Date: Sat Oct 19 01:13:50 2019 -0600 Fix nontransparent material index for WebGL indexed triangles. commit 6f74aa05e584c31361db32218d55fb7a99fcf40b Author: John Bowman Date: Fri Oct 18 15:55:28 2019 -0600 Update asygl. commit 8a741d665941592d420eb212005ad0d9b6700a67 Author: John Bowman Date: Fri Oct 18 15:52:51 2019 -0600 Pass only required material uniforms to each shader; simplify code. commit a1ea5e709290fe4055cc81f2673ac4310f4f500f Author: John Bowman Date: Fri Oct 18 02:15:11 2019 -0600 Update asygl. commit c67276f0c8149efb848cf2f6584d861b0659ae55 Author: John Bowman Date: Fri Oct 18 02:13:55 2019 -0600 If needed, use separate material array for transparent elements. commit 984de25753a7d7c337036fa7b4a1f6525422b2e4 Author: John Bowman Date: Fri Oct 18 01:40:30 2019 -0600 Reindex materials only when needed. commit d80ab0d128061ce19651a0bb52923cb07ae81b5f Author: John Bowman Date: Fri Oct 18 01:28:08 2019 -0600 Fix revision 82f7f09542dbe478f173efe64b52e24091ab7144. commit 595397655afd3e6603ead89b57fc923f45bfb44c Author: John Bowman Date: Fri Oct 18 00:34:53 2019 -0600 Revert "Reduce number of materials in elevation.asy." This reverts commit 38a4badac82efbb0632ade0ee2ebaf486b8153dc. commit 82f7f09542dbe478f173efe64b52e24091ab7144 Author: John Bowman Date: Fri Oct 18 00:32:54 2019 -0600 Respect maximum number of uniforms. commit 256a4a88b5d9e5680c15bebbd7594d67bba858a4 Author: John Bowman Date: Thu Oct 17 00:59:43 2019 -0600 Compress WebGL Material parameters into a single vec4. commit bb9232f14a9f672b65cfd9a709b1345580dd3f6a Author: John Bowman Date: Wed Oct 16 22:32:28 2019 -0600 Illustrate Arrow3(position). commit ca863003b8dd6f18cb94feaeaf64eab639d88671 Author: John Bowman Date: Wed Oct 16 22:04:17 2019 -0600 Fix splitpath settings of arrowhead3. commit 292b048048a42b75fe686c98bf550efafea730c0 Author: John Bowman Date: Wed Oct 16 10:50:23 2019 -0600 Upload asygl.js; make minor updates to documentation and formatting. commit 192a328e5b899cc12ad813faf39b096ca3505606 Author: John Bowman Date: Tue Oct 15 23:58:59 2019 -0600 Fix materialAttrib check in OpenGL. commit 1b357c7161606554d394c3dd05d0971edda82993 Author: John Bowman Date: Tue Oct 15 23:56:25 2019 -0600 Update asygl. commit 1a07e8e4f74732c5a7302706df5ec658b30e62cf Author: John Bowman Date: Tue Oct 15 23:43:54 2019 -0600 Fix attributeMaterialIndex check; simplify code. commit 3903d300105d0822208588e144b4f1ad4b822dd8 Author: John Bowman Date: Tue Oct 15 11:55:41 2019 -0600 Revert "Update asygl." This reverts commit 1e14e51305ae550ac4afeb1b259365cf69070783. commit 1e14e51305ae550ac4afeb1b259365cf69070783 Author: John Bowman Date: Tue Oct 15 11:34:56 2019 -0600 Update asygl. commit 22139a4951f8b568354cac72e61f613782799c68 Author: John Bowman Date: Tue Oct 15 11:32:19 2019 -0600 Fix shader sharing; use separate buffers for each canvas. commit 63eabdd7d504be58b4400d999c800c5fc4a444ae Author: John Bowman Date: Tue Oct 15 03:46:41 2019 -0600 Revert "Update asygl." This reverts commit fc5e4423912f59b77a80a656869ded97a47edf60. commit fc5e4423912f59b77a80a656869ded97a47edf60 Author: John Bowman Date: Tue Oct 15 03:39:37 2019 -0600 Update asygl. commit 88a383380d6f340524d0b58f8ce0b32ebe3ca383 Author: John Bowman Date: Tue Oct 15 03:28:18 2019 -0600 Move shaders to asygl library; share shaders and buffers among embedded images. Check for unused WebGL attributes. commit c6db33e7e18c45b52daaed33e10b10e08dabd371 Author: John Bowman Date: Tue Oct 15 02:01:19 2019 -0600 Optimize OpenGL renderer. commit ce57dbdb9a105320888ac9230b10665185febc7e Author: John Bowman Date: Tue Oct 15 00:53:37 2019 -0600 Check for unused GLSL attributes; restrict glFlush workaround to MSDOS. Remove unnecessary code. commit 229f9ca69f9a59e4f393e7f92db027f9bc570325 Author: John Bowman Date: Mon Oct 14 12:15:43 2019 -0600 Update documentation. commit 38a4badac82efbb0632ade0ee2ebaf486b8153dc Author: John Bowman Date: Mon Oct 14 12:01:43 2019 -0600 Reduce number of materials in elevation.asy. commit e0e8e60a15b158c831f5ea1e300ad86486a35481 Author: John Bowman Date: Mon Oct 14 09:00:58 2019 -0600 Simplify example. commit 089e57508c96518c48b9bb3f21cb922710675f37 Author: John Bowman Date: Sun Oct 13 21:52:55 2019 -0600 Update asygl. commit 2642e40cc6b1623ea3998a1274540913d9bae824 Author: John Bowman Date: Sun Oct 13 21:52:28 2019 -0600 Apply WebGL scissors. commit c0a589e08d0078b26443effef18a68da8c53879e Author: John Bowman Date: Sun Oct 13 21:32:43 2019 -0600 Update asygl. commit 4498544f5f53dd9ea21f96485a30cb5d3b6a4656 Author: John Bowman Date: Sun Oct 13 21:30:20 2019 -0600 Fix offscreen viewport. commit 1af5c5ef00aceebb565710e1899f382826db9f8e Author: John Bowman Date: Sun Oct 13 17:25:57 2019 -0600 Update asygl. commit 324d09b31ac582d2b1cd0b9f905b7ac0089ae5dc Author: John Bowman Date: Sun Oct 13 17:20:45 2019 -0600 Organize asygl variables. commit 2508e0574a5fef5074bf5f6a0037d5190d47b0d7 Author: John Bowman Date: Sun Oct 13 15:15:43 2019 -0600 Use a single WebGL rendering context for embedded images. commit 9cc2fdaee9d2efcca12b587f0902b7a89daea0f9 Author: John Bowman Date: Sun Oct 13 15:15:11 2019 -0600 Update asygl. commit 14c00ed4351d108338a24af8dc8c35e3099a987c Author: John Bowman Date: Sat Oct 12 11:15:02 2019 -0600 Port miscellaneous Python support files and example to Python3. commit f80e63cfe85b233560ab9627731ef3fc16701067 Author: John Bowman Date: Fri Oct 11 03:12:52 2019 -0600 Increment version to 2.59. commit bc7fe4b5126184c965fff4d0daaf592b89ef8d01 Author: John Bowman Date: Fri Oct 11 00:27:09 2019 -0600 Initialize all vertices in triangle arrays, even if they are offscreen. commit 7725cbf46e24261f44fbd80e79565c2d69c00a89 Author: John Bowman Date: Thu Oct 10 10:57:17 2019 -0600 Add outdir() convenience function; make asy() respect outdir(); update documentation and example of external EPS vector graphics. commit e6bbc5094209b432b7ed656c1d5ae1bd8b2103e1 Author: John Bowman Date: Thu Oct 10 09:53:42 2019 -0600 Remove unnecessary code. commit 496a76daee4c2177e6ae95425cc86c2d53f9f453 Author: John Bowman Date: Thu Oct 10 09:39:33 2019 -0600 Revert "Make locatefile return fully qualified path." This reverts commit 9817571be16cc925c549a375b186fdc065a42da6. commit f6881300a037ee9706fd6ff49e3ec4bebaf5d52d Author: John Bowman Date: Thu Oct 10 09:00:51 2019 -0600 Switch order of GLEW library when linking. commit 1c671ec2a8bc186686ccdbc0f4eade2086fb6ce0 Author: John Bowman Date: Thu Oct 10 02:19:02 2019 -0600 Fix bug #90: force graphics() to pass fully qualified file name to xasy; due to current limitations of dvisvgm (2.7.4), this only works with vector EPS files (embedded images, PDF, PNG, and JPG formats are not supported). commit 9817571be16cc925c549a375b186fdc065a42da6 Author: John Bowman Date: Thu Oct 10 02:10:37 2019 -0600 Make locatefile return fully qualified path. commit 436af6420b9ac380acc457ad433f1f119187f5f1 Author: John Bowman Date: Thu Oct 10 00:42:08 2019 -0600 Fix numerical precision issue in geometry.asy. commit d59145980eb39a9d06faebdc7a0b40991a1903c9 Author: John Bowman Date: Wed Oct 9 16:13:48 2019 -0600 Distinguish between msdos and cygwin builds. commit d63f1d90e26cfc27d496daee95858ed03b78692a Author: John Bowman Date: Wed Oct 9 09:30:48 2019 -0600 Change intersection points back to currentcoordsys in geometry.asy. commit f3387ed7d069683918356bfdc3bc70098ad75f44 Author: John Bowman Date: Wed Oct 9 00:19:21 2019 -0600 Handle execError gracefully, without killing parent or current process. commit cd22997a274d034d065b9fcf7afd3ff9bddcb22c Author: John Bowman Date: Tue Oct 8 23:11:26 2019 -0600 Resolve ambiguous function signatures in geometry.asy using ecasts to special cases. commit 2e202e2b5eb4265a73bedae080220d89a21d8a97 Author: John Bowman Date: Tue Oct 8 20:46:24 2019 -0600 Support building asymptote.so again. commit 705dc2e1b9f3ba2004a5bc44641bf30daedb502a Author: John Bowman Date: Tue Oct 8 18:12:30 2019 -0600 Make --version option list both enabled and disabled features. commit c62e05ff995b1b3e128668254918cc61c0173f15 Author: John Bowman Date: Tue Oct 8 18:10:51 2019 -0600 Reluctantly change default xasy editor for UNIX to vi. commit a4c4e374e1d51f2eda6c99d95da522ef4ef3986b Author: John Bowman Date: Tue Oct 8 17:04:22 2019 -0600 Consistently use specified xasy editor. commit 31dd51e17946061ebcbe63abdca4fdcf916eb7f5 Author: John Bowman Date: Tue Oct 8 10:44:43 2019 -0600 Fix configuration issues. commit e547942219cdd1ac6b4dc55785e9148cb1eb9a67 Author: John Bowman Date: Tue Oct 8 10:05:07 2019 -0600 Explicitly link with GLX library if present. commit 8536a52466854b17060c40d80b6cf97805349ec4 Author: John Bowman Date: Tue Oct 8 01:15:36 2019 -0600 Increment version to 2.58. commit 45b49582cbcd3188c713b0fce1eda8ca1a459441 Author: John Bowman Date: Tue Oct 8 00:55:18 2019 -0600 Improve feature description. commit 051f1a6386034b5631f9fa64fc293e92e65667e9 Author: John Bowman Date: Tue Oct 8 00:22:52 2019 -0600 Remove unused variables. commit 2a237885ddc65eb8db7fc9a8d2fa51c17a5b25a1 Author: John Bowman Date: Tue Oct 8 00:17:47 2019 -0600 Fix numerical degeneracy in points[] intersectionpoints(bqe bqe1, bqe bqe2) of geometry module. commit b9d73d9aca44db0196e74e3d52895396cf8d7288 Author: John Bowman Date: Tue Oct 8 00:10:35 2019 -0600 Make --version option display compiled-in features. commit 8544d4972958ff35132da346e4ca5a5422eb77ca Author: John Bowman Date: Mon Oct 7 17:48:46 2019 -0600 Update examples. commit 28d26ed92f31224381dfcab4adf54e3b915320b9 Author: John Bowman Date: Mon Oct 7 16:20:59 2019 -0600 Fix animations. commit b4bbb947303dca29e6ac3f45ebd4a34d0d97282e Author: John Bowman Date: Mon Oct 7 15:48:22 2019 -0600 Fix warning message. commit b0b0f33ca9dbdb63cde838c863ee173534ea3295 Author: John Bowman Date: Mon Oct 7 14:28:36 2019 -0700 Workaround broken XDR headers under MacOS X. commit 9d890eca34a9413f2f9f145546d7430acf2e8d7d Author: John Bowman Date: Mon Oct 7 03:28:07 2019 -0600 Update asygl. commit cf3745d5699be73b72f1cac2b355e689dd9c1bb1 Author: John Bowman Date: Mon Oct 7 03:21:43 2019 -0600 Remesh on home. commit 49c6cc075c1f587577c6a6fa1aad130adf5b4666 Author: John Bowman Date: Mon Oct 7 03:11:22 2019 -0600 Fix viewportshift. commit 12739aee501fdb72956b6bc0ceec97dfd2db35d7 Author: John Bowman Date: Mon Oct 7 00:00:26 2019 -0600 Add missing conditional. commit 383bd8479e344c7dd7181808507122a31663a149 Author: John Bowman Date: Sun Oct 6 23:39:39 2019 -0600 Set ASYGLVERSION in configure.ac; install asygl.js. commit 4e60948a42e1a2e8504b3a76b300bc8f00b02d2e Author: John Bowman Date: Sun Oct 6 21:21:00 2019 -0600 Remove version number from offline asygl library; include pruned gl-matrix source file and license in release. commit 56c9b2ec67ed1e0c20d933f2f6414abdaa81412a Author: John Bowman Date: Sun Oct 6 20:26:57 2019 -0600 Update asygl. commit c55b40e0cba6deb6a431affd1fcc6de9968707ec Author: John Bowman Date: Sun Oct 6 20:24:41 2019 -0600 Use unminified pruned gl-matrix source to build asygl (to satisfy Debian rules). commit 353ed86880e1e6e75d6548708b0533bf4ad30655 Author: John Bowman Date: Sun Oct 6 02:22:54 2019 -0600 Update documentation. commit 8307d5ad2f3d37998e87c231b30009b23e47278b Author: John Bowman Date: Sat Oct 5 21:00:00 2019 -0600 Update asygl. commit dbbfca33d40d31bab922e92f92a6f8e80edb319b Author: John Bowman Date: Sat Oct 5 20:58:51 2019 -0600 Implement viewportshift in webgl. commit 562d634042a295db93d5eaa4651df35350b13f7a Author: John Bowman Date: Sat Oct 5 20:23:53 2019 -0600 Update examples. commit e4da7cbd7ef81b2ce81f84b7240602494096fce0 Author: John Bowman Date: Sat Oct 5 16:28:06 2019 -0600 Remove run-time conditional from fragment shader; move initshader caller. commit 88887ac90cd05e56905dbc6f06e81b0d73b992d4 Author: John Bowman Date: Sat Oct 5 14:42:15 2019 -0600 Output svg rather than html for 2D pictures. commit 3e7af8b130b37a606d0941ad30a4824313dfb196 Author: John Bowman Date: Sat Oct 5 14:41:34 2019 -0600 Cap border. commit bd00509cefeb85989ad059f3a8b6993a1ea3be85 Author: John Bowman Date: Sat Oct 5 14:41:19 2019 -0600 Remove unwanted MSDOS terminators. commit 58bbf1171a5479b8f73d504d15ab4566d4578e91 Author: John Bowman Date: Sat Oct 5 14:40:23 2019 -0600 Simplify code. commit bb7a20bfe034c0ffa2e1a64af3535491d9f4c526 Author: John Bowman Date: Sat Oct 5 14:39:14 2019 -0600 Fix light=nolight in WebGL. commit deddebe4b300db59dabf56c5d8ae736ca7007db6 Author: John Bowman Date: Sat Oct 5 14:36:10 2019 -0600 Update asygl. commit f3136218f7a1bcc7c5e2e8da99e423d11d0ae5bf Author: John Bowman Date: Sat Oct 5 14:33:26 2019 -0600 Handle currentlight=nolight in WebGL. commit 12778d70f1d862dfa815f244cd01cccc84039f71 Author: John Bowman Date: Thu Oct 3 11:39:09 2019 -0600 Increment version to 2.57. commit be2e06c3b0c223338cb8b88906ff84db67690e71 Author: John Bowman Date: Thu Oct 3 10:41:51 2019 -0600 Remove suffix argument from build-script. commit b2558d9e829450fee2baa7c5017c505e99c1a53a Author: John Bowman Date: Thu Oct 3 09:49:13 2019 -0600 Update required dvisgm version in documentation. commit 09715350e4873b76339f06de179fb45868037553 Author: John Bowman Date: Wed Oct 2 15:51:20 2019 -0600 Update documentation and example. commit 7614a954e5f4f81ff8dd004475afb2486c5a4fd4 Author: John Bowman Date: Wed Oct 2 00:49:42 2019 -0600 Document physically based rendering and transparent background option for WebGL. commit 499ae43068ae3cb8c31e3e4a94dd0b10a9bae77a Author: John Bowman Date: Wed Oct 2 00:01:03 2019 -0600 Remove unused code. commit c8238140ab01cbe3c960fb55b36d17ba01c98d82 Author: John Bowman Date: Tue Oct 1 22:58:29 2019 -0600 Fix array bounds. commit 6a3d04c27ac85cb862bbe4d9ae7968941da9785b Author: John Bowman Date: Tue Oct 1 21:56:04 2019 -0600 Disable scrolling within viewport. commit 76aebefd6557f5590e61dfbe32b5391176e2e935 Author: John Bowman Date: Tue Oct 1 21:55:25 2019 -0600 Update asygl. commit 0b49c13bfd465d55bdd96baf9ac273ffe98fe10b Author: John Bowman Date: Tue Oct 1 14:46:58 2019 -0600 Update asygl. commit 437223b1a10947e0496a7cf810796d3081cfb2f9 Author: John Bowman Date: Tue Oct 1 14:38:09 2019 -0600 Allow transparent background in webgl. commit f35a22b836d0c4b2fa3f4182ff852c8aeb3cb44d Author: John Bowman Date: Tue Oct 1 09:54:28 2019 -0600 Implement background color in webgl. commit c3b7f41f9be0dcbca35296aa8ff172a99c63c2f8 Author: John Bowman Date: Tue Oct 1 09:54:05 2019 -0600 Update asygl. commit 451be75316e09552b424bf11612db9a0404bbd9f Author: John Bowman Date: Mon Sep 30 23:54:36 2019 -0600 Fix handling of missing glm library. commit 17694a76cfac4212110f5d9ae271e66222f7d2d4 Author: John Bowman Date: Sun Sep 29 16:21:30 2019 -0600 Increment version to 2.56. commit a8198d8ff1c6742469d0b913adaa6645628fc005 Author: John Bowman Date: Sun Sep 29 15:53:20 2019 -0600 Fix MSDOS portability issue. commit 48f83b023681d7d4bbe7364dab146cb5128c520f Author: John Bowman Date: Sun Sep 29 14:58:32 2019 -0600 Fix compilation without OpenGL. commit 74c3182f0b704858a6557da909d7722129aa7042 Author: John Bowman Date: Sun Sep 29 14:41:41 2019 -0600 Fix test for tr1/unordered_map. commit bd1c855c82d1bd19a1b88724d2511a3fa5d6ae34 Author: John Bowman Date: Sun Sep 29 13:51:56 2019 -0600 Tighten up test for std::tr1::unordered_map on legacy systems. commit f6cd098b98fb8c1be1ac1795cc515a734cd8f20b Author: John Bowman Date: Sun Sep 29 12:41:25 2019 -0600 Fix viewMat initialization. commit b13df4e01c8a015f8937e86adf788e6683fccd08 Author: John Bowman Date: Sun Sep 29 04:37:49 2019 -0600 Increment version to 2.55. commit 1c26011ea8a7fdfba9725ae52ac308970bf2df24 Author: John Bowman Date: Sun Sep 29 03:04:36 2019 -0600 Silence Apple's OpenGL deprecation warning. commit bd6cef0ac6a2e4bce49c92a8ecc792473286b7d9 Author: John Bowman Date: Sun Sep 29 03:02:07 2019 -0600 Silence Apple's OpenGL deprecation warning. commit 908bfa8c1114af3098367b8a87866f3a08951d02 Author: John Bowman Date: Sun Sep 29 02:41:34 2019 -0600 If lighting is enabled, ignore specified vertex colors for PRC. To override this backwards incompatibility and recover the previous behaviour, manually disable lighting when drawing a surface s: draw(s,prc() ? nolight : currentlight); commit 5beec3197c5692b45dfe487d55a1d6eaddeb0a6f Author: John Bowman Date: Sun Sep 29 01:22:14 2019 -0600 Ignore null surfaces; restore example. commit 7e2cf9efabb7506649c401ece5f80c4178177b73 Author: John Bowman Date: Sat Sep 28 23:09:43 2019 -0600 Port to MSDOS. commit bcf31e3f3e9ed3fb876312f793d89543f2e70d17 Author: John Bowman Date: Sat Sep 28 02:42:53 2019 -0600 Install webgl files; clean up GUI files on uninstall. commit 1b6150e70bc601c65af304d12f286cc64363557f Author: John Bowman Date: Sat Sep 28 01:54:30 2019 -0600 Document WebGL interface. commit 8c94986e48dcb1d4ec88ff7c0c87f4ac4d5757d3 Author: John Bowman Date: Sat Sep 28 00:13:44 2019 -0600 Use aspect ratio for fitting; adjust arcball radius to account for viewportmargin; make interaction constants asy settings. commit 5c5ce0424f990db9fa8da644bab334b4b74cbe0c Author: John Bowman Date: Sat Sep 28 00:13:16 2019 -0600 Update asygl. commit 3d1242fc2f31aac1d4e5e297feb403b8e1ca1a51 Author: John Bowman Date: Fri Sep 27 18:12:02 2019 -0600 Define absolute in gl.js. commit 77deba7f33213ae0cba2c34b0d26878d0baf28ce Author: John Bowman Date: Fri Sep 27 18:10:49 2019 -0600 Update asygl. commit 9c4690bf1114f9d0526c72619826176c74ad82da Author: John Bowman Date: Fri Sep 27 17:47:01 2019 -0600 Reduce size of asygl by including only required subset of gl-matrix. commit 1208b33104c5b5b7a2a6fc3f3ad9165dfea92909 Author: John Bowman Date: Fri Sep 27 17:43:13 2019 -0600 Update asygl. commit 77206a8af882bd1f7388df810c9c9c30e6b56f06 Author: John Bowman Date: Fri Sep 27 13:04:09 2019 -0600 Expand webgl viewport to fit window; remove webglscale; rename devicepixel to absolute; add WindowTrim. commit 0ca3d60f01986f0ea89ccfd328bf361f29d73680 Author: John Bowman Date: Fri Sep 27 13:02:49 2019 -0600 Update asygl. commit 34977d2b4808156d276bcbb976ed9c9ec5a8b97b Author: John Bowman Date: Fri Sep 27 02:55:05 2019 -0600 Add webglscale and devicepixels options; implement shrink/expand viewport keys. commit 1ddada67255f9e61349bb5d7f2ce667108bba9db Author: John Bowman Date: Fri Sep 27 02:54:17 2019 -0600 Update asygl. commit 9b0f5a6ae6cd37d337ae2637d1c71d289f239c15 Author: John Bowman Date: Thu Sep 26 03:32:37 2019 -0600 Avoid dvipdf dependency for building documentation. commit ff4b38c9e101ece6d2c6ba21e93bc1f7d8c15364 Author: John Bowman Date: Thu Sep 26 03:10:01 2019 -0600 Support --disable-gl again; ignore settings.render for WebGL output; account for devicePixelRatio; increase default viewportmargin to 0.5. commit ff25ef4b12699218459b62273c775b421f8f0fe9 Author: John Bowman Date: Thu Sep 26 03:06:38 2019 -0600 Update asygl. commit 19528ced5dec8cdb502fcb63ffa6ae0b457b2f04 Author: John Bowman Date: Wed Sep 25 22:52:43 2019 -0600 Replace arcball with simpler version backported from webgl; fix RotateX and Y. commit b1f630df463467db272330d9136915681bf1e30c Author: John Bowman Date: Wed Sep 25 21:06:36 2019 -0600 Fix segmentation fault. commit b232cc52137473a9db16f56c2d275c96b9d7f748 Author: John Bowman Date: Wed Sep 25 19:22:57 2019 -0600 Change rotation matrix back to 4x4. commit 848376cb50be96143325607f05e0d7a081f0867c Author: John Bowman Date: Wed Sep 25 11:45:33 2019 -0600 Move webgl files to base directory. commit 0224793b9a347e5d2ca7985e76783bdee2bb598b Author: John Bowman Date: Wed Sep 25 11:15:59 2019 -0600 Fix vector length in normMouse; improve build-asygl. commit 8388736d5dffa20d4a10886de99a08a3e18dc6b5 Author: John Bowman Date: Wed Sep 25 03:32:59 2019 -0600 Add offline WebGL option. commit 37425ee28f676e2da11d9be7052b0dab28ea4c36 Author: John Bowman Date: Wed Sep 25 03:03:22 2019 -0600 Combine javascript libaries for faster loading; remove obsolete files; add asygl environment variable to specify asygl library. commit 9e815e6e659fa873ae5b665566ae3691c8caa57f Author: John Bowman Date: Wed Sep 25 02:59:36 2019 -0600 Add LGPL license; avoid multiple matrix creations; simplify arcball. commit 0f30a12889852d3d9dc83437ed0e19d048128230 Author: John Bowman Date: Tue Sep 24 14:48:39 2019 -0600 Simplify webgl output of indexed triangles. commit 994c14bb4ac4c6bc00b986b5297c267cdb98bb92 Author: John Bowman Date: Tue Sep 24 10:43:25 2019 -0600 By default, use vertex indices for normal and color indices of indexed triangles. commit f5c79f97e5dc64a3183e1e6fd0a8f2a7417c1f7b Author: John Bowman Date: Tue Sep 24 01:06:04 2019 -0600 Include html comments. commit ca37df6f334784f278ac0edf708670c2bdcf49b9 Author: John Bowman Date: Tue Sep 24 00:12:45 2019 -0600 Add viewportmargin setting. commit e2aca7045e65c11e4a1250f99eb9002803ebcdf9 Author: John Bowman Date: Mon Sep 23 23:20:01 2019 -0600 Add missing offscreen checks. commit 6defe942af805b4ff7659f56ea43784a5193ef7b Author: John Bowman Date: Mon Sep 23 23:03:31 2019 -0600 Simplify code. commit 6fe7fc69fe8e49eed45b6acaa59bc2b1dee7ddc2 Author: John Bowman Date: Mon Sep 23 22:48:09 2019 -0600 Add offscreen detection to indexed triangles. commit a8bc5263f72d87ca005d3d97f2a13037770b56ee Author: John Bowman Date: Mon Sep 23 21:54:04 2019 -0600 Simplify code. commit 25b87d0dedc04180e36678963f59d6d0ed075cd2 Author: John Bowman Date: Mon Sep 23 21:37:21 2019 -0600 Fix tiling. commit 1c442690870ffe6499012f799b97a41f6f6a8efc Author: John Bowman Date: Mon Sep 23 21:23:17 2019 -0600 Implement webgl indexed triangles. commit a05450337791d59966d12fedecb19e73bebc2415 Author: John Bowman Date: Mon Sep 23 03:11:35 2019 -0600 Implement faster WebGL and OpenGL rendering, with improved offscreen detection. commit 07ee50be15e9968de2e1a6f70c00392785bb5028 Merge: 4dcd549b9 5e9114304 Author: John Bowman Date: Mon Sep 23 01:27:26 2019 -0600 Merge branch 'master' into webgl. commit 5e91143045a807b6c6ba60a125b4220dad6a65bd Author: John Bowman Date: Mon Sep 23 01:11:37 2019 -0600 Fix default value of file word() and documentation. commit 4dcd549b91ff8afe8855ddc20e6756b1e9c9d42e Author: John Bowman Date: Fri Sep 20 23:01:28 2019 -0600 Simplify code. commit fe2cab3b8086e3de638efc1008f69325f6bac8de Author: John Bowman Date: Fri Sep 20 22:57:39 2019 -0600 Minor optimization. commit 6c30c8662563b66a724a1a0dddae20e60bd497ad Author: John Bowman Date: Fri Sep 20 08:11:05 2019 -0600 Don't test for pow and sqrt which are sometimes implemented in hardware. commit 150d007d0a0c9e5fc40fd85f660a0377aab67b1f Author: John Bowman Date: Thu Sep 19 10:19:21 2019 -0600 Simplify code. commit 902fc9bf7e01b270492a2f51260646b3fdef06f1 Author: John Bowman Date: Thu Sep 19 09:32:18 2019 -0600 Optimize bbox2; rename norender to remesh and add missing return value. commit 077d8fd4e631da44cc93fb4a8c94f55841989dac Author: John Bowman Date: Thu Sep 19 02:49:28 2019 -0600 Fix offscreen detection; discard rendered data once it goes offscreen. commit 49e21b13812931778e1385d82412373723b3b1bf Author: John Bowman Date: Tue Sep 17 23:39:07 2019 -0600 Shrink nonbillboard material buffer by 7%. commit 9177fba6a47e79f9e2c21c5f1f76c483e55a4d02 Author: John Bowman Date: Mon Sep 16 16:46:26 2019 -0600 Conditionally view html file. commit a2bb8be9c68dc825477dd03db772b9a0abbeae02 Author: John Bowman Date: Mon Sep 16 16:18:43 2019 -0600 Optimize bounding box computation. commit a0f04aa0c2971e89161e6c459829edb0aefdca7d Author: John Bowman Date: Mon Sep 16 13:52:35 2019 -0600 Improve OpenGL straight optimization for curves. commit 25a04e41dc579c5a2ef66110500aea587abd09b6 Author: John Bowman Date: Mon Sep 16 13:21:21 2019 -0600 Fix order of PRC and webgl quad colors. commit 73b8974d343dc370ec459acf0bc2718165313b71 Author: John Bowman Date: Mon Sep 16 00:03:39 2019 -0600 Optimize offscreen in bezierpatch.h; remove unused code. commit b9866ef6ab0faa0c713cab7b03fe276257cb5217 Author: John Bowman Date: Sun Sep 15 22:24:41 2019 -0600 Add interface to html viewer. commit 24a3e54cd3e06d89869444eb6c8e07487dafe911 Author: John Bowman Date: Sun Sep 15 21:43:45 2019 -0600 Reformat webgl header and footer. commit 573369c22e52e2b4d3424ef1e0e8e4607572f7b4 Merge: e6580bf30 221e15420 Author: John Bowman Date: Sun Sep 15 18:52:46 2019 -0600 Merge branch 'webgl'. commit 221e154209664025595ab423df0220649c084b5f Author: John Bowman Date: Sun Sep 15 18:50:45 2019 -0600 Optimize straight webgl lines. commit 7b36db5c4d07a7632a613c9652e5480ecaf022cb Author: John Bowman Date: Sun Sep 15 18:33:14 2019 -0600 Fix webgl quad normal. commit 712af1c6a75d2d19d85e8b5a4cd71604bc5feb33 Author: John Bowman Date: Sun Sep 15 18:14:40 2019 -0600 Add straight optimization to webgl. commit a33ade59a16fea0df08ee9b7bbc1d06440b0b859 Author: John Bowman Date: Sun Sep 15 16:28:34 2019 -0600 Implement webgl pixel shader. commit 75ec09fc0bb7195580b57e40657ec0e00d46064e Author: John Bowman Date: Sun Sep 15 12:20:22 2019 -0600 Remove duplicate code. commit e6580bf30d1ecd8f96a4b7e48adfcaa2a5d24fd5 Merge: f40bd919b cc4115dd2 Author: John Bowman Date: Sun Sep 15 01:03:28 2019 -0600 Merge branch 'webgl'. commit cc4115dd23fd4fb69951d5053ce615551b07cc86 Author: John Bowman Date: Sat Sep 14 23:50:33 2019 -0600 Pass asy lighting parameters; don't composite canvas with background. commit f55f0def02b723db059ddc790d29db077986e1ea Author: John Bowman Date: Sat Sep 14 23:46:31 2019 -0600 Use 4x4 viewMat again (for correct lighting under rotation). commit a9146b8722a727d1daa11580609189e2ba3a8bf0 Author: John Bowman Date: Sat Sep 14 18:17:41 2019 -0600 Fix ViewPosition; use a 3x3 view matrix. commit 31d49e55e82774285ac015b16f8969579c43d7c3 Author: John Bowman Date: Sat Sep 14 11:09:55 2019 -0600 Add settings.digits to control default output file precision. commit bd8cd4877ebb7c73cb83a767721dfc858dfe8d57 Author: John Bowman Date: Sat Sep 14 01:00:33 2019 -0600 Standardize matrix names. commit 5ea4aaeae21c21e86535e5d5552a181be7222552 Author: John Bowman Date: Sat Sep 14 00:51:19 2019 -0600 Replace var by let. commit a1fdac350066487d3ffd66733ca59ce6dc11f6ea Author: John Bowman Date: Sat Sep 14 00:49:53 2019 -0600 Further optimize Split3. commit a1a7a736a2e5ea3baaf66eec2d4df27984b2ba36 Author: John Bowman Date: Sat Sep 14 00:46:40 2019 -0600 Optimize split. commit 8b46c31c8ae3d5d681f49d546e1bc8165ac96f0c Author: John Bowman Date: Sat Sep 14 00:31:23 2019 -0600 Add webgl support for Bezier curves. commit 3975ba5416d9708e4c208ef508490571e7bdf985 Author: John Bowman Date: Fri Sep 13 17:42:45 2019 -0600 Detect navigator.vibrate. commit 381f82e9a2e7f220945d83b721832c157d4f4ac6 Author: John Bowman Date: Fri Sep 13 02:51:20 2019 -0600 Indicate shift mode with vibration. commit 9d8b6c4f188ccc7539fb1ab4a6db2439e78567de Author: John Bowman Date: Thu Sep 12 09:59:01 2019 -0600 Remove unused arguments. commit f40bd919b1a2772f8ea696c0004b447ef6f21b11 Merge: a6b553072 76978127a Author: John Bowman Date: Thu Sep 12 09:08:25 2019 -0600 Merge branch 'webgl'. commit 76978127a7d8b3dd68eb44e10ecf5c9c05c53972 Author: John Bowman Date: Thu Sep 12 09:07:57 2019 -0600 Allow for negative dot product. commit a6b5530720e91c8aa3b8ef2798ac24b0e814afec Author: John Bowman Date: Thu Sep 12 00:58:34 2019 -0600 Restore example. commit 56936ea472caf20f8e3d5e5420f35e8d35d62451 Author: John Bowman Date: Thu Sep 12 00:48:50 2019 -0600 Fix arcball radius; improve mobile interaction. commit 3b3b1b2efae71b494eadb4eb4b41fd0f1476d353 Author: John Bowman Date: Thu Sep 12 00:26:20 2019 -0600 Fix arcball numerical precision issues. commit e519ea37e36e4c1027b1b296b28a8d2e946c9f1d Author: John Bowman Date: Wed Sep 11 23:16:09 2019 -0600 Add mobile shift; fix arcball normalization. commit 79abc5f0b321befc032d4eb7d15b75329d202b3a Author: John Bowman Date: Wed Sep 11 19:34:02 2019 -0600 Improve zoom. commit 25e234d15a8ce05874f0951952aed0122532def8 Author: John Bowman Date: Wed Sep 11 11:32:34 2019 -0600 Override scroll bar. commit 86de97f2460dc8a125e18772c31e750251481b22 Author: John Bowman Date: Wed Sep 11 11:08:39 2019 -0600 Implement pinch zoom. commit a9069b5771cf62effa2b6a5f46ac30b5766eb4ca Author: John Bowman Date: Wed Sep 11 00:20:36 2019 -0600 Fix initial projection. commit f37794e9c12fbdd588f9afa8e2400f4c4cae3acd Author: John Bowman Date: Tue Sep 10 23:59:16 2019 -0600 Disable mobile scaling. commit 605c952986ab864f2d6ca8bea0b11fc5cd4ccb0f Author: John Bowman Date: Tue Sep 10 23:58:03 2019 -0600 Disable mobile scaling. commit 2d0ed08cb4fabff9f7b5621feb3853902865d422 Author: John Bowman Date: Tue Sep 10 11:20:46 2019 -0600 Remove scroll bar. commit a3a319b856e16a71b228090ecf24dc735cc7248e Author: John Bowman Date: Tue Sep 10 10:44:59 2019 -0600 Remove webgl directory prefix from link to gl.js; add symbolic link. commit fcc609805e810ffe8e4775cc114297c60319a1de Author: John Bowman Date: Tue Sep 10 10:03:32 2019 -0600 Implement Bezier triangles in webgl. commit c532199499eec51b79c33a8a23d19daddceeeb93 Author: John Bowman Date: Tue Sep 10 08:42:02 2019 -0600 Fix epsilon; move derivative and normal into BezierPatch. commit fa59a4840c2dcbdb54e8188f905460a32745576d Author: John Bowman Date: Tue Sep 10 08:27:53 2019 -0600 Fix undefined variable. commit 1341bf7f83a82780b98826c83f1619794a08a027 Author: John Bowman Date: Tue Sep 10 08:25:53 2019 -0600 Factor code. commit 99b00e26147feae6aff24b94ae83a5ac99c817e7 Author: John Bowman Date: Tue Sep 10 01:20:07 2019 -0600 Begin porting Bezier triangle code to webgl. commit 033ba1eb3a0aca3a46de957c89fad9c33ce8da4b Author: John Bowman Date: Tue Sep 10 00:45:52 2019 -0600 Fix lighting after mode change. commit 2a174661224adc2fbc229b786baef60924761d74 Author: John Bowman Date: Tue Sep 10 00:12:22 2019 -0600 Accumulate onscreen and partially offscreen triangles separately to avoid duplicate rendering. commit 49ea03ddbf861df3edcb3dcdae3922761cb5d785 Author: John Bowman Date: Mon Sep 9 19:40:59 2019 -0600 Clear buffers on construction. commit e3bd396ed745dae9171e44b89d2554ce67e5b0cb Author: John Bowman Date: Mon Sep 9 18:30:00 2019 -0600 Simplify code. commit 5b1b569f3fb253000e7728419d2f9f9612fdc7e8 Author: John Bowman Date: Mon Sep 9 14:07:35 2019 -0600 Fix transparency bug; optimize colorShader and implement generalSHader. commit 61049a4ccd87e0aacd7498dd5c4d3c84960a7d18 Author: John Bowman Date: Mon Sep 9 11:51:27 2019 -0600 Sort transparent webgl triangles (based on centroid; to be improved). commit 0ec8f1841797c62a9a1ea83372f4fcb0880f3c00 Author: John Bowman Date: Mon Sep 9 09:34:28 2019 -0600 Fix missing initialization. commit 40ab227ba04a7e8ea1464af6864a074860e6fc3d Author: John Bowman Date: Mon Sep 9 09:22:53 2019 -0600 Add transparent buffers. commit a401de1b5d3532f6d30c133eed0f4d07a0d8b182 Author: John Bowman Date: Sun Sep 8 23:40:43 2019 -0600 Fix webgl billboard labels. commit 503ba73bb4605ba5030f3d78c71f378ce654031b Author: John Bowman Date: Sun Sep 8 23:17:56 2019 -0600 Avoid depth check in offscreen computations. commit 5c4dcb69f3908b57333ee90af3408cbe857b891a Author: John Bowman Date: Sun Sep 8 21:50:08 2019 -0600 Optimize transpose away. commit a6132b5e1d7a93c43c37d4eb2e238900bc93ff0e Author: John Bowman Date: Sun Sep 8 17:47:34 2019 -0600 Update temporary hard-wired teapot light parameters. commit f2ffc7b52ed3d4a7e375d66fc827f25973afac39 Author: John Bowman Date: Sun Sep 8 17:29:20 2019 -0600 Standardize code. commit f008f017aa1cfce1bb9bb34d91ca8857a20cea7b Author: John Bowman Date: Sun Sep 8 16:12:12 2019 -0600 Remove unwanted code. commit f8c22220b7dee93b97bca2a793df59e6e83ef664 Merge: 4972f9053 f1254f8d7 Author: Supakorn "Jamie" Rassameemasmuang Date: Sun Sep 8 14:39:32 2019 -0600 Merge branch 'webgl' of github.com:vectorgraphics/asymptote into webgl commit 4972f90530c591c09030ae84e1f3118dff2d047d Author: Supakorn "Jamie" Rassameemasmuang Date: Sun Sep 8 14:39:27 2019 -0600 Clean up gl.js again. commit f1254f8d7fa19053fc483231053d16103679a2e9 Merge: cc7eb2765 bad6b6d57 Author: John Bowman Date: Sun Sep 8 14:34:04 2019 -0600 Merge branch 'webgl' of github.com:vectorgraphics/asymptote into webgl. commit cc7eb276596404eba061fee63da9440db518ad03 Author: John Bowman Date: Sun Sep 8 14:28:30 2019 -0600 Optimize bounding box computation; simplify code. commit bad6b6d57c23cddbe4fd823d6ca480997dab65c6 Author: Supakorn "Jamie" Rassameemasmuang Date: Sun Sep 8 14:25:09 2019 -0600 Minor fixes to norm matrix. commit 0c1da0e0dad92876e6254fec9d4625afb09c9614 Author: John Bowman Date: Sun Sep 8 02:36:18 2019 -0600 Batch calls to drawElements. commit 2106227eb55336e1189d99092258730b7583d403 Author: John Bowman Date: Sun Sep 8 01:03:59 2019 -0600 Prepare for batch drawing. commit 108509b7b304267883ac24081f8c7b8149773bab Author: John Bowman Date: Sat Sep 7 21:11:57 2019 -0600 Fix -noautobillboard. commit a9e980f35e2955ec58891850bac3258bb7b9b880 Author: John Bowman Date: Sat Sep 7 20:47:42 2019 -0600 Fix typos. commit 7ffa52cafeed9ff412a4c8dd79f894f6c001de5d Author: John Bowman Date: Sat Sep 7 19:23:48 2019 -0600 Use separate material and center index for each vertex again (to support batch drawing and sorting). commit 17566e437c18c5cba8af049b03e064a0471006a3 Author: John Bowman Date: Sat Sep 7 14:24:13 2019 -0600 Use a 3x3 rotation matrix. commit b57b6298818cb7c561258c5f8f8e8d4724b1f0b2 Author: John Bowman Date: Sat Sep 7 03:52:50 2019 -0600 Simply billboard code and port to webgl. commit 9c34d1e914fc8033f0dce670db80017c40244f66 Author: John Bowman Date: Fri Sep 6 15:08:28 2019 -0600 Enable webgl keyboard input. commit 4cddee557a7ee99117398522b64d532f8e34e9fc Author: John Bowman Date: Fri Sep 6 14:31:46 2019 -0600 Standardize code. commit 3ad3e9447237dba8d2cbd643ecec931ce1c88aef Author: John Bowman Date: Fri Sep 6 13:05:09 2019 -0600 Fix conditional. commit b157bb70ab46e4e67060c838a7aa986c96a9a8a1 Author: John Bowman Date: Fri Sep 6 12:59:21 2019 -0600 Change shaders only when needed; remove duplicate code; improve OpenGL framerate calculation. commit 2b5a4e583a912357b95dd922a414590eae1ec421 Author: John Bowman Date: Fri Sep 6 10:57:51 2019 -0600 Remove extension requirement. commit 52e3053c3b2d9a78e54d24a456b5ac74f1f7f71b Author: John Bowman Date: Fri Sep 6 10:56:36 2019 -0600 Simplify code. commit 309bfd90f3d274d7763de078772faacd7151292a Author: John Bowman Date: Fri Sep 6 03:27:03 2019 -0600 Reduce size of webgl data buffers. commit c33716757576e0534bad2615b1a608bed98059f8 Author: John Bowman Date: Thu Sep 5 10:24:18 2019 -0600 Fix material index for explicit colors; standardize code. commit 1bd14971f286c5c83e0f1732523923d3da08b37f Author: John Bowman Date: Thu Sep 5 03:02:03 2019 -0600 Simplify code. commit f40c3eda4725acecd410cac7243e84053a78d233 Author: John Bowman Date: Thu Sep 5 02:53:35 2019 -0600 Support vertex shading. commit f2e5df6d331708c01f374feef5f70f0d75999c7d Author: John Bowman Date: Wed Sep 4 18:19:47 2019 -0600 Optimize webgl buffers. commit ef1cd85d7183d8399e150fdd8d4633fa8cb7adfd Author: John Bowman Date: Tue Sep 3 22:09:30 2019 -0600 Simplify and optimize code. commit 7b3cd7101983c837c866eaa5540f26718b797d76 Author: John Bowman Date: Tue Sep 3 18:58:12 2019 -0600 Recompute offscreen limits at every render. commit ee547cbd9facf472ea5ef6a504f7103f1aaec51b Author: John Bowman Date: Tue Sep 3 08:26:47 2019 -0600 Optimize shader communication. commit 68f921caf3a603603616f82175916eb768c2161b Author: John Bowman Date: Tue Sep 3 01:11:20 2019 -0600 Reimplement billboard labels to allow remesh suppression. commit 1e2d7c8f77dcd4dbf9cc0e3f7147ef1c492b51f6 Author: John Bowman Date: Tue Sep 3 01:02:10 2019 -0600 Fix typo. commit 7192656cca9bb3607ed5b62b7330e6a7e4e0e97e Author: Supakorn "Jamie" Rassameemasmuang Date: Mon Sep 2 15:19:19 2019 -0600 Fix almost all problem, except for offscreen glitch. commit 173a2c40056c9a23470d2ad8e931a97251471a6e Author: Supakorn "Jamie" Rassameemasmuang Date: Mon Sep 2 14:17:37 2019 -0600 Also reset ship. commit 1bde5bc6489562642c4eaf6e68ac92413ef4fcae Author: Supakorn "Jamie" Rassameemasmuang Date: Mon Sep 2 14:16:54 2019 -0600 Fix zoom clipping issue alongside translation. commit fe8e538c7109073442967cb638af94279788fc86 Author: Supakorn "Jamie" Rassameemasmuang Date: Mon Sep 2 14:01:30 2019 -0600 Add in revised zoom from asy. commit 78044058c643aa5e66bed5c70b0db55a5953b919 Author: John Bowman Date: Sun Sep 1 23:50:54 2019 -0600 Simplify code. commit 144f4615291a6486fdd7c2f16026240f18216538 Author: John Bowman Date: Sun Sep 1 22:02:22 2019 -0600 Output field-of-view angle. commit 1c116f53a002b66b43b315fd2e2730dc1eed6d3e Author: John Bowman Date: Sun Sep 1 20:10:49 2019 -0600 Add missing offscreen code. commit c255024cc0a6d66dd3ce2e5279e1a65fb0b0e828 Author: John Bowman Date: Sun Sep 1 11:57:17 2019 -0600 Compute pMatrix from b and B bounds. commit faf496185b9b48688f9e68b0882f16ec01d5b806 Author: John Bowman Date: Sun Sep 1 11:36:40 2019 -0600 Fix duplicate multiply. commit eb75489e0f7d739b6f2ce707ae3ae7a9176ded19 Author: John Bowman Date: Sun Sep 1 11:35:04 2019 -0600 Port offscreen code to webgl. commit 7a2fe8d7e409f33d19f860083ee71060866d8304 Author: John Bowman Date: Sun Sep 1 03:53:55 2019 -0600 Re-enable remesh suppression with offscreen check. commit fb3e1aa648c78d0c8f3c156b8f68971049c77085 Author: John Bowman Date: Sat Aug 31 19:14:37 2019 -0600 Improve zoom. commit aa2f9e5bcdb6aaf4fc960a0448bbd04c6c174e53 Merge: 115774110 11b7f3b44 Author: John Bowman Date: Sat Aug 31 14:21:25 2019 -0600 Merge branch 'master' into webgl. commit 11b7f3b4400f6c648ad2ccabe9ab06c275fd1f3f Author: John Bowman Date: Sat Aug 31 14:21:16 2019 -0600 Fix pipeclose (cf. 0d057d35cb30d52f33db9f155c880ed8f8a1d7d2). commit 115774110bd39a7609620600999c63eb0823ffb9 Author: John Bowman Date: Sat Aug 31 13:17:52 2019 -0600 Remove unused argument. commit 389543c6b829bab8b8aa1c3f852263d41101079c Author: John Bowman Date: Sat Aug 31 12:57:29 2019 -0600 Optimize and simplify OpenGL shaders. commit 9ce5cfef9a1c6ea054b1d141d8b7d766c0b8f3cb Author: John Bowman Date: Sat Aug 31 03:13:24 2019 -0600 Port to webgl1.0. commit 26f329d066b8b291adf7b63b61301b6f69e288a0 Author: John Bowman Date: Sat Aug 31 00:45:49 2019 -0600 Remove duplicate constants. commit 16a912ce5563f6436094a0f8e2bbb878cadccd9b Author: John Bowman Date: Sat Aug 31 00:39:34 2019 -0600 Support rendering on mobile devices. commit d0e14808336642f9eabc38d66d357bbf13486f4d Author: John Bowman Date: Fri Aug 30 14:38:21 2019 -0600 Fix normals. commit cbccb294ccc2f27a4d0924b3f7337c432e3b98b0 Author: John Bowman Date: Fri Aug 30 14:04:45 2019 -0600 Standardize code. commit 3d4ded0b3b871a6331dd14ae3479ebb1c15ceb8f Author: John Bowman Date: Fri Aug 30 13:40:45 2019 -0600 Simplify normal code. commit b5a083516a854317e9e88e7def584a3f9a907c57 Author: John Bowman Date: Fri Aug 30 01:35:03 2019 -0600 Update normal code. commit 78e4ac384d904e09c05684da6d0eb723878f73bb Author: John Bowman Date: Fri Aug 30 01:18:09 2019 -0600 Remove unused variable. commit 699dd53413ad111d211ed2f616bab85f6162f0cc Author: John Bowman Date: Fri Aug 30 01:16:47 2019 -0600 Update subdivision crack code. commit 9958d795eead1be55e3014fec378695682b5b202 Author: John Bowman Date: Fri Aug 30 00:05:08 2019 -0600 Support webgl output with -V -threads. commit 385c61e1b211b019641c5cd50ce54b71551f7943 Author: John Bowman Date: Thu Aug 29 21:33:58 2019 -0600 Simplify code. commit 35442f0834befc227b88c26ed7deb79e14f7628a Author: John Bowman Date: Thu Aug 29 21:12:10 2019 -0600 Fix nMaterials; remove generated file. commit 1839307bfa3cb7521293ccdd05ec1507cf7ebe53 Author: John Bowman Date: Thu Aug 29 19:47:01 2019 -0600 Revert broken commit "Add back nMaterials." This reverts commit ef0b19a7d1ccd37b80705c0cbaf42f8eb5470b1c. commit ef0b19a7d1ccd37b80705c0cbaf42f8eb5470b1c Author: Supakorn "Jamie" Rassameemasmuang Date: Thu Aug 29 19:24:02 2019 -0600 Add back nMaterials. commit 71d59116a67658e8bb078c79f6f1e59fcf6e1060 Author: Supakorn "Jamie" Rassameemasmuang Date: Thu Aug 29 19:15:54 2019 -0600 Update Author's name. commit 8964dd0782bff658a3f2d475e10c3c38964ef607 Author: Supakorn "Jamie" Rassameemasmuang Date: Thu Aug 29 19:14:55 2019 -0600 Add in authors names. commit afc2a146dd755fc19adbdba7f7aa28aab5a9b45d Merge: 04feea568 306f6df4e Author: Supakorn "Jamie" Rassameemasmuang Date: Thu Aug 29 19:08:19 2019 -0600 Merge branch 'webgl' of github.com:vectorgraphics/asymptote into webgl commit 04feea5687b53250825e77356b5aad4961f17884 Author: Supakorn "Jamie" Rassameemasmuang Date: Thu Aug 29 19:08:14 2019 -0600 Fix vViewPosition. commit 306f6df4e77d854c9890d4a14f8679e7e16f4ebf Merge: 63fb75aff ff8cc6d32 Author: John Bowman Date: Thu Aug 29 19:07:05 2019 -0600 Merge branch 'webgl' of github.com:vectorgraphics/asymptote into webgl commit 63fb75aff713b84b005076aa50d141b2c7d88f3d Author: John Bowman Date: Thu Aug 29 19:06:55 2019 -0600 Move further parameters into BezierPatch class; fix index. commit ff8cc6d326d163de250f28a2557f61701788037c Author: Supakorn "Jamie" Rassameemasmuang Date: Thu Aug 29 19:05:07 2019 -0600 Add in orthographic/persp view directions. commit acb3196c4d37930b0ef6d3fb2bee214222789593 Merge: 60dd5701d ce412f946 Author: Supakorn "Jamie" Rassameemasmuang Date: Thu Aug 29 18:49:49 2019 -0600 Merge conflict. commit 60dd5701d70540245e36d6f3d39594db39f2def6 Author: Supakorn "Jamie" Rassameemasmuang Date: Thu Aug 29 18:49:15 2019 -0600 Make res per class. commit ce412f946f8b4736bcabe6bf2b462dd76bd933e2 Author: John Bowman Date: Thu Aug 29 18:46:40 2019 -0600 Fix resolution. commit 80c920eb626193a2aec793c01a7fb81f405466c2 Author: John Bowman Date: Thu Aug 29 17:58:12 2019 -0600 Pass resolution data to webgl. commit f494c725fb05f8245d1d3833028edb74a23cd184 Author: Supakorn "Jamie" Rassameemasmuang Date: Thu Aug 29 15:46:50 2019 -0600 Remove cpy2web. commit 3037b5620c6263a1b001c45c1bcc029f1e29ed0b Author: Supakorn "Jamie" Rassameemasmuang Date: Thu Aug 29 15:04:23 2019 -0600 Allow for custom vertex structures. commit 88d8ea20543c476bde8d41d8c9132e03b64078c7 Author: John Bowman Date: Thu Aug 29 11:06:17 2019 -0600 Support webgl output with threads. commit 5f47e4e35ddd76d7bcae651aa1ef956e200cb12f Author: Supakorn Rassameemasmuang Date: Wed Aug 28 23:23:29 2019 -0600 Add in blend func. commit 072db3837ccd0526f6bbc3437ec411f1a12fab5d Author: Supakorn Rassameemasmuang Date: Wed Aug 28 23:18:33 2019 -0600 Add in preliminary transparency. commit d1fdc0c19df823ab6bd79420b457197ffc6abcec Author: John Bowman Date: Wed Aug 28 23:10:25 2019 -0600 Remove diagnostic. commit 51c17fc6062f43818eb0e7456bd4e52941875fba Author: John Bowman Date: Wed Aug 28 23:03:01 2019 -0600 Add material index. commit c63b11b282a018eab64aebb87a22e96dbe1d6394 Author: John Bowman Date: Wed Aug 28 21:40:20 2019 -0600 Begin material support. commit 9a31b248de24ad18dc988ca9cbbcc536f4bc9f58 Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 28 17:54:03 2019 -0600 FIx gitignore. commit 864ec8c2519da4a4576be291a554342a0eddd332 Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 28 17:52:35 2019 -0600 Minor cleanups and enable emissive. commit ac2aa94fa9d59a879d84025ca74804812bcf7fa1 Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 28 17:32:58 2019 -0600 Fix float arrays flag. commit 3de4371ce380c2185d7f483f02e2abd48abc55f1 Merge: dc9692dde 2ad31cb32 Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 28 17:31:23 2019 -0600 Merge branch 'webgl' of github.com:vectorgraphics/asymptote into webgl commit dc9692dde857f1e57fc097adee2041443a2b1134 Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 28 17:31:10 2019 -0600 Only create array when needed. commit 2ad31cb325dc8106ce4dc8f711dd1864f3f1ddda Author: John Bowman Date: Wed Aug 28 17:29:42 2019 -0600 Simplify code; remove generated file. commit 3b7616ab660d553032d4f0d35a21d0a4c47ca39d Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 28 17:03:15 2019 -0600 Add a DrawableObject for general drawables. commit 4c06bf02ebba1bd20d30fb00edea9afac2e1e408 Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 28 16:59:05 2019 -0600 Even more refractoring of code. commit 3c831c65c004549b1ad50cf21aae0bb0bf658074 Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 28 16:51:44 2019 -0600 More refractorings of gl.js. commit 00bda50add1752053360384b34a80b519060ee4b Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 28 16:31:59 2019 -0600 Refractor gl.js code. commit c62534e2dac23166a0905bff68a2956f64cc7600 Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 28 15:50:45 2019 -0600 Clean up gl.js. commit f5068d75f0891a5968c98cfe53e352b4def86aef Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 28 15:01:52 2019 -0600 Expose model Matrix transformation and more docs. commit 3d48b756c0f593fb63e54a991ce5e4b1bd0da9ed Author: Supakorn Rassameemasmuang Date: Wed Aug 28 02:50:00 2019 -0600 Add in zooming back. commit 2d362a692aa7105cc7020bba15bde86508dc9006 Author: Supakorn Rassameemasmuang Date: Wed Aug 28 02:20:09 2019 -0600 Reglue back translation routine. commit 53c16fcd22a2f19cbea8f07c7054d1d9519d4806 Merge: 4c9342e9d df4b56997 Author: John Bowman Date: Wed Aug 28 01:41:15 2019 -0600 Merge branch 'master' of github.com:vectorgraphics/asymptote. commit 4c9342e9dd114f4baeb94612f7bc85755aaba0f9 Author: John Bowman Date: Wed Aug 28 01:40:03 2019 -0600 Fix last commit. commit df4b5699744d668ae4cb4367d2ab5f5cf039cc1b Merge: 5b8767247 52d3e4d67 Author: John Bowman Date: Wed Aug 28 01:36:05 2019 -0600 Merge branch 'master' of github.com:vectorgraphics/asymptote commit 5b87672473974e5dc32c2f11b2afd81ffdc22372 Author: John Bowman Date: Wed Aug 28 01:35:54 2019 -0600 Simplify glew compilation. commit b2a6fff4e97192c5bd42b5eed689d3aa0e0c7b14 Merge: 64d3f620d 52d3e4d67 Author: John Bowman Date: Wed Aug 28 01:07:42 2019 -0600 Remove DOS line terminators. commit 52d3e4d670a8ca843302280c7b02462eb672945d Author: John Bowman Date: Wed Aug 28 01:04:23 2019 -0600 Remove spurious DOS line terminators from shader files. commit 64d3f620dc2d49924b1ac9a14cc5c520d2d43d9b Author: John Bowman Date: Tue Aug 27 22:44:54 2019 -0600 Output canvas dimensions; support threads. commit 78e5646fc84ec2609bbe22850ccb82eb568ee8d7 Author: Supakorn "Jamie" Rassameemasmuang Date: Tue Aug 27 17:32:12 2019 -0600 Add in temporary canvas height/width. commit ac8cbda3cc382a0ceb632fe3930cb5351a50468f Merge: 8f7b27118 97e03e6de Author: Supakorn "Jamie" Rassameemasmuang Date: Tue Aug 27 17:27:08 2019 -0600 Merge branch 'webgl' of github.com:vectorgraphics/asymptote into webgl commit 8f7b271188a337569ed5510434cdef82c5c19503 Author: Supakorn "Jamie" Rassameemasmuang Date: Tue Aug 27 17:27:03 2019 -0600 Allow dynamic setting of canvas size. commit 97e03e6de3b7599dc4d78f28438f956c327b94aa Author: John Bowman Date: Tue Aug 27 17:26:32 2019 -0600 Output target to webgl. commit 601ebbadadb2ef652ec4b9062443e412b7a1f314 Author: John Bowman Date: Tue Aug 27 16:52:06 2019 -0600 Fix warning message. commit bff8f83e6b6b72a977a63576e27672d4cb445b8b Author: John Bowman Date: Tue Aug 27 16:36:30 2019 -0600 Compile glew library with -O1 to help out clang compiler. commit ebe09e1b398b244c3a1163e2dea804829fe2d63f Author: Supakorn "Jamie" Rassameemasmuang Date: Tue Aug 27 16:36:22 2019 -0600 Split jsfile into its own cc file. commit d7cfc3e099ff4b094a2b864c3f43559d7257b8ba Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Aug 23 17:27:53 2019 -0600 Change jsfile to handle new p properly. commit 6fc0875e2ed6c3ef9108d0103615d8f1f5264ca7 Merge: 2fe6c372d fa9cfab02 Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Aug 23 17:22:06 2019 -0600 Merge in jsfile changes. commit 2fe6c372d13a67e4da203aeeffec99c0a5725fd2 Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Aug 23 17:20:41 2019 -0600 Add multiple materials detection and shader generation. commit fa9cfab02ccda80ffae9de90f0dcd5291d1a6d14 Author: John Bowman Date: Fri Aug 23 17:16:32 2019 -0600 Add multiple patch support. commit 40aeca47850dd5dd3295abb77d8c3d5c06347624 Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Aug 23 16:10:38 2019 -0600 Add arcball rotation. commit 7325cd22c2ae15edc47dbc3685ea7bed775b1c86 Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Aug 23 14:45:42 2019 -0600 Add in material index data. commit 23846f565b4575b0ac410a9ec2d795ecb2978442 Author: Supakorn Rassameemasmuang Date: Fri Aug 23 00:08:40 2019 -0600 Change resolution and minor cleanups. commit 85b3fd03061bcf3e8d0703295ec32d24a8792111 Author: John Bowman Date: Wed Aug 21 16:37:20 2019 -0600 Add webgl option to glrender. commit 9bfd0c90ef80dfcbd28422cc6348f1bf943a5cd7 Merge: 05461c696 3d7141566 Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 21 16:28:09 2019 -0600 Merge branch 'webgl' of github.com:vectorgraphics/asymptote into webgl commit 05461c6965b795aec295c3d40bbdcb766b652bbf Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 21 16:27:10 2019 -0600 Update settings to prevent autoformat. commit 3d714156611362e7a919c7bdedee31eb52f51ef3 Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 21 16:27:10 2019 -0600 Update .gitignore. commit 3ca5d56f78d8c559cd76f5e3b76b147e58203425 Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 21 16:23:42 2019 -0600 Fix gl.js vertex function. commit 98a67e304b975c141ff16011fa9ea5eee15c671f Merge: 56076839a 7f1fba235 Author: John Bowman Date: Wed Aug 21 15:58:08 2019 -0600 Update webgl files. commit 7f1fba235a28189d306312c09b43352e1d047932 Author: John Bowman Date: Wed Aug 21 10:47:38 2019 -0600 Generalize popcount to systems that lack 64-bit integers. commit 4500dd6b84fae216df649a32c57b70f225883fd1 Author: John Bowman Date: Wed Aug 21 02:53:55 2019 -0600 Update HOWTO-MSWindows. commit c9ee6dc1dbb22d65311639c28ceb5c7bb1391431 Author: John Bowman Date: Wed Aug 21 01:36:17 2019 -0600 Increment version to 2.54. commit 35867d43297d07045d52916bcd3d906f62f7b023 Author: John Bowman Date: Tue Aug 20 22:50:54 2019 -0600 Update example. commit 6570978b49f65c708ea8921ca5fd95a1dab0954b Author: John Bowman Date: Tue Aug 20 22:06:06 2019 -0600 Improve diagnostic about unimplemented feature. commit d741dd1701c53b6ab697b75bc280ced837611669 Author: John Bowman Date: Tue Aug 20 16:49:25 2019 -0600 Fix memory leak. commit 767b059789cd375336d6f2ad42f5c49a9b7d387e Author: John Bowman Date: Tue Aug 20 14:52:15 2019 -0600 Check for lgamma instead of gamma, in both libm and libc. commit d12068ef272111b0831187f2906fecaca1b5fa9d Author: John Bowman Date: Tue Aug 20 14:10:23 2019 -0600 Use gc_allocator_ignore_off_page. commit ea6ec5dc839626629062044ae9291f1289875aeb Author: John Bowman Date: Tue Aug 20 14:03:43 2019 -0600 Only initialize glew once. commit 437acdd38d4c73eaabf8b52f3cec77247b58fe91 Author: John Bowman Date: Tue Aug 20 12:44:19 2019 -0600 Update gc tests. commit f01f7ed4f10ee092be2208e8e3fd63f11d1cd6ce Author: John Bowman Date: Mon Aug 19 03:33:53 2019 -0600 Fix gc struct test. commit bd88b6dcd02dd442a9765195f28502ee9255490c Author: John Bowman Date: Thu Aug 15 23:22:19 2019 -0600 Disable bulky and leaky OpenImageIO library by default. commit 56076839adb43e1a0bc99aa0019a4ff4c275f86b Merge: 464613521 94ac15f88 Author: John Bowman Date: Wed Aug 14 14:51:57 2019 -0600 Begin multiple patch support. commit d84dd8cb79c8b0b85211643427eaa6ad1dba0a99 Author: Supakorn "Jamie" Rassameemasmuang Date: Wed Aug 14 12:15:13 2019 -0600 Add in development WebGL version. commit 4646135212088ec1c2572481c628b58f671b7ac8 Author: John Bowman Date: Wed Aug 14 12:06:51 2019 -0600 Import webgl development files. commit 94ac15f88e5723e38d4e4f3231944b538d8c17ec Author: John Bowman Date: Wed Aug 14 01:36:04 2019 -0600 Fix operator *(transform, revolution). commit fbef675f843d99f46475fbe92a01fe214a03d146 Author: John Bowman Date: Wed Aug 14 00:39:44 2019 -0600 Fix skeletons of transformed solids of revolution. commit f4ac68fd0660655a055c3bc41115e8f8a7752d8c Author: John Bowman Date: Tue Aug 13 19:29:04 2019 -0600 Fix documentation. commit c694474b38ecb4057cb6380441732a6a2bb6018d Author: John Bowman Date: Tue Aug 13 18:02:47 2019 -0600 Add border to OpenGL tiles to remove antialiasing artifacts. commit 74172faf075afc446556df90acf3966931e82679 Author: John Bowman Date: Tue Aug 13 10:24:29 2019 -0600 Remove obsolete MacOS X workaround. commit 05f68ab80e7caa521c967b32ba672fa58bcaae3c Author: John Bowman Date: Mon Aug 12 00:49:22 2019 -0600 Fix DEFINE calls in configure.ac; simplify compilation under CYGWIN. commit 38280e0f75fedc2fe9e9cc1b3e5336d05bba6e56 Author: John Bowman Date: Sun Aug 11 23:56:34 2019 -0600 Prioritize tr/unorderedmap over unorderedmap (for Centos 7). commit 64121726ecd13cda057699758020d7e94c289465 Author: John Bowman Date: Sun Aug 11 23:08:15 2019 -0600 Handle oblique projections as orthographic projections in PRC. commit 557ff750b0043c3bce5fc998bf601211c7bcafa5 Author: John Bowman Date: Sun Aug 11 00:37:06 2019 -0600 Simplify code. commit 7c4367160de72d618382f5a164078a11d9d07edc Author: John Bowman Date: Fri Aug 9 03:30:03 2019 -0600 Increment version to 2.53. commit c1db74235565570e829b865756794a0c5ab0f5fb Author: John Bowman Date: Fri Aug 9 02:23:28 2019 -0600 Fix xasy permissions; update old code. commit b14c49397f59c29929cd21a9da855b1f89b5566a Author: John Bowman Date: Fri Aug 9 01:44:11 2019 -0600 Fix spelling of default. commit 6506b94d5b6d97191ce9e26018c414d4d010e6fa Author: John Bowman Date: Fri Aug 9 01:36:02 2019 -0600 Revert "Prevent xasy menubar from disappearing under MacOS X." This reverts commit 40407fc4644a21e04ad77680939ab48281ad34d8. commit 27d51ec09bb95fe5c18181a807174b65ebbdd487 Author: John Bowman Date: Fri Aug 9 01:33:44 2019 -0600 Support VISUAL, EDITOR, and os-specific xasy editor overrides. commit deebce8021396aa35fb95786099e55c0ee24072c Author: John Bowman Date: Fri Aug 9 01:31:17 2019 -0600 Update documentation. commit b7586ef668e8701b5358da1a1d5ab29e226525fb Author: John Bowman Date: Fri Aug 9 01:30:40 2019 -0600 Use open as default PostScript previewer under MacOS X. commit 40407fc4644a21e04ad77680939ab48281ad34d8 Author: John Bowman Date: Fri Aug 9 01:04:54 2019 -0600 Prevent xasy menubar from disappearing under MacOS X. commit 4f11b34a79a5a95ee6df1cc160502eca1d80ac04 Author: John Bowman Date: Thu Aug 8 19:50:11 2019 -0600 Fix spelling of hexadecimal. commit c79584995e095c4736fae67060618577285f253d Author: John Bowman Date: Thu Aug 8 18:45:05 2019 -0600 Fix GLSL shader initialization on MacOS X. commit 03f7b5ac9e6a814bb5dd720209f68c5eb76933a2 Author: John Bowman Date: Thu Aug 8 18:18:05 2019 -0600 Remove obsolete code. commit 887964b07bc000c7d840d18370cded3561bdd263 Author: John Bowman Date: Wed Aug 7 10:38:46 2019 -0600 Don't attempt to install GUI files if unavailable (due to lack of pyuic5 and pyrcc5). commit c258b9a21580aeb09e68b9109977ee1382b2b3ba Author: John Bowman Date: Tue Aug 6 23:58:18 2019 -0600 Remove obsolete assignment. commit 8a4f415210836d1893e9eb51b0afeebc37c63711 Author: John Bowman Date: Tue Aug 6 19:24:18 2019 -0600 Request OpenGL core profile under MacOS X. commit 6ee0cb2f03140555c09d5a0d9af62c51acd21d33 Author: John Bowman Date: Tue Aug 6 06:00:03 2019 -0600 Remove obsolete code from tr.cc. commit e36a9fc91abe8e9fd55997c86a26d68f16084c03 Author: John Bowman Date: Mon Aug 5 17:02:26 2019 -0600 Increment version to 2.52. commit e0b0d417fb075bc210ce7ddc9f192912e8bab4dd Author: John Bowman Date: Mon Aug 5 16:05:15 2019 -0600 Fix warning messages during MSDOS glew build. commit 5aca47b4bf18d804339f3179680ff564161ec0a2 Author: John Bowman Date: Mon Aug 5 15:37:31 2019 -0600 Update documentation. commit 18385f310b42ae623c16445c6d9fd0cb3d04b986 Author: John Bowman Date: Mon Aug 5 15:06:20 2019 -0600 Pass CPPFLAGS to glew compilation. commit 9427bc84b0bc526a7243a878c4177e7d3d68abfc Author: John Bowman Date: Mon Aug 5 14:25:58 2019 -0600 LONG_LONG_MAX is now called LLONG_MAX. commit 68d5e6143a5a79c1b1f8ec3489cb826ca9a263cc Author: John Bowman Date: Mon Aug 5 14:02:28 2019 -0600 Conditionally compile glew.c without modifying original source. commit 514c2c899382e17095a1fcda124400da6f539d7c Author: John Bowman Date: Mon Aug 5 13:57:41 2019 -0600 Revert "Conditionally compile glew.c." This reverts commit 2c499e90ee421b20dd2a53382396bcb4dc8818f1. commit 50546458facf5c8d09f3fbf41ddfd2d3e5b6bef2 Author: John Bowman Date: Mon Aug 5 13:57:28 2019 -0600 Upgrade CTAN version to -std=c++11. commit 2c499e90ee421b20dd2a53382396bcb4dc8818f1 Author: John Bowman Date: Mon Aug 5 12:14:31 2019 -0600 Conditionally compile glew.c. commit 0f332f7a20509a269f5037e74973803079d72714 Author: John Bowman Date: Mon Aug 5 11:51:47 2019 -0600 Fix glew compilation. commit 04bce42baea1592ecd8a7155915bc4cf5176a267 Author: John Bowman Date: Mon Aug 5 11:41:08 2019 -0600 Add further portability tweaks. commit 0054ed2dc46f367a6c5f516d2b472c92107fb0d5 Author: Mojca Miklavec Date: Mon Aug 5 18:14:46 2019 +0200 Allow overriding binaries in Makefile (#106) commit 45b349053b50d2f7478599b1a81724d0a8974edb Author: John Bowman Date: Sun Aug 4 12:13:03 2019 -0600 Simplify code. commit ce79ba79dc84aa6a5f31ce8fb0239b3ea302f35f Author: John Bowman Date: Sun Aug 4 12:02:55 2019 -0600 Fix OpenImageIO configuration. commit 4c4de50a1dd5fa6e07d0a7893b4bc93719bedf3c Author: John Bowman Date: Sun Aug 4 02:26:07 2019 -0600 Increment version to 2.51. commit a1c421bbf65f1443829a422a8fe2dc329fba7072 Author: John Bowman Date: Sun Aug 4 01:26:38 2019 -0600 Add support for OpenGL under 32-bit MSWindows. commit 85db520f0e8b0bc1ed6d2cad21e8b94c33b001ff Author: John Bowman Date: Sun Aug 4 00:09:18 2019 -0600 Remove unused code. commit 9a473b89f9131170c3c403f16a351083ad8f7e1f Author: John Bowman Date: Sat Aug 3 23:58:56 2019 -0600 Remove ambientpen from example. commit 1720b45b628b0b8ae49370ac27a260317dddf009 Author: Ivan Kokan Date: Sun Aug 4 07:41:34 2019 +0200 Configurable filltype for dot (#43) Add global dotfilltype; update documentation. commit ae3f32685507a92dc1cd26f6d154500a30cd38e7 Author: Ivan Kokan Date: Sun Aug 4 07:39:09 2019 +0200 Dot rendering details (#55) Handle zero-sized dot radii. commit a98cceebf82a2cee9a3526a909fc1435888e81bc Merge: 69218e14b 4bfc78893 Author: John Bowman Date: Sat Aug 3 21:10:42 2019 -0600 Merge pull request #86 from fahasch/master Palettes from matplotlib commit 69218e14b92b8070f87ec9460f982673c8974c65 Author: John Bowman Date: Sat Aug 3 13:57:23 2019 -0600 Fix typo. commit 781e34f265e0b47ca4a3a3444cf01d2e669db833 Author: John Bowman Date: Sat Aug 3 13:49:44 2019 -0600 Port to CYGWIN. commit b4ae8b40c452cad712f1ffbf9f00751a48fa77db Author: John Bowman Date: Sat Aug 3 13:12:12 2019 -0600 Add glm-devel dependency. commit fe965b2a2e81c778a5d0c11b9dfdd0c180796922 Author: John Bowman Date: Sat Aug 3 13:10:08 2019 -0600 Check for pow but don't provide a subsittute. commit 1748a5633a987093f2d410199eebfd2cd999cdf3 Author: John Bowman Date: Sat Aug 3 13:08:27 2019 -0600 Remove spurious diagnostic. commit 2be1ec77c239257f8ccf3a7fa7013dabec4d5b63 Author: John Bowman Date: Sat Aug 3 13:05:44 2019 -0600 Remove incomplete pow substitute. commit 78a4b62302fa4386560c3b3968cabb15c7585a0f Author: John Bowman Date: Sat Aug 3 12:15:54 2019 -0600 Make GC_ATTR_EXPLICIT work around conditional on clang not FreeBSD. commit 743334a0dedbd5b6c8e743cb0c54545fb30c4bfb Author: John Bowman Date: Sat Aug 3 10:07:14 2019 -0600 Work around Boehm gc issue 273 under FreeBSD. commit 359b90a299cc19fcb3c503c3d593e0f2dc5aa4e4 Author: John Bowman Date: Sat Aug 3 02:43:00 2019 -0600 Remove unused code. commit 9d8e1801af9cb433ac179de5462609f1a34922fe Author: John Bowman Date: Sat Aug 3 02:42:13 2019 -0600 Workaround gc and signal issues on FreeBSD. commit ca40beada902c965d53badfb33bd99b1f5459f9d Author: John Bowman Date: Sat Aug 3 02:18:33 2019 -0600 Fix interactive mode. commit a10490793d6c0baffd8dd1fcd8718f45b4158d64 Author: John Bowman Date: Fri Aug 2 21:36:34 2019 -0600 Missing glm header now triggers lack of OpenGL configuration notification. commit 3261c4bd2ea33923376d14611394921d799e2368 Author: John Bowman Date: Fri Aug 2 20:18:29 2019 -0600 Fix pow workaround. commit 059db65f5b5c756fcad8ddf1ad8332358ae41c1d Author: John Bowman Date: Sat Aug 3 10:26:27 2019 +1000 Configuring with --enable-static first tests to see if static library is available. commit cebae1a87628c7ee4f619c9e0e2df85895d98fd7 Author: John Bowman Date: Fri Aug 2 17:02:29 2019 +1000 Remove dependency on glew-devel. commit 06c1776ad3d58440af99aac0e2cc7aaf515aaa13 Author: John Bowman Date: Fri Aug 2 17:00:13 2019 +1000 Add missing GL/glxew.h header. commit f65ed736157ecf58bf395fb622fefd5ca0a0924b Author: John Bowman Date: Fri Aug 2 16:47:51 2019 +1000 Update glew.h references. commit 05a21753fe720d24dc55396e93a3d64a650ae59e Author: John Bowman Date: Fri Aug 2 00:43:57 2019 -0600 Fix glew header location. commit fa1e8192e86b2f364d3d320e144fb1fcde2631cb Author: John Bowman Date: Fri Aug 2 00:23:13 2019 -0600 Add missing glew dependency. commit 5158adb4045d55e72fc0fb3fc99953a688d2f07d Author: John Bowman Date: Fri Aug 2 00:14:24 2019 -0600 Fix detection of glut library. commit fc3d2d13dad21602bddb1bd172113589f50d9f3d Author: John Bowman Date: Fri Aug 2 00:12:22 2019 -0600 Ship version 2.1.0 of glew with asy. commit 2e9bda8a8c6a9b625d73262d1adbc60c6df33054 Author: John Bowman Date: Thu Aug 1 00:28:02 2019 -0600 Fix typo. commit ea5fe75642a3c1a929b70fc1507f628b7c62ab41 Author: John Bowman Date: Thu Aug 1 00:21:40 2019 -0600 Fix missing config.h symbols. commit 273442954154c540bd73d7c906e9a4fed05629b3 Author: John Bowman Date: Wed Jul 31 12:31:31 2019 -0600 Enable static linking of libGLEW. commit 8300225a30975fe61b6ef43c29e8b56b400cfe09 Author: John Bowman Date: Wed Jul 31 12:12:27 2019 -0600 Add option for linking against certain static libraries. commit 3a87ccaf58bc2d3c3875f687fa0725d51d0ee89b Author: John Bowman Date: Tue Jul 30 09:37:25 2019 -0600 Fix confusing signature. commit 714371587643f770febae01cd9a81f87818e28e7 Author: John Bowman Date: Mon Jul 29 23:32:29 2019 -0600 Remove obsolete ambient parameter. commit 2aad7c815d6712bc1c617600c48bfb57f7ae2b8d Author: John Bowman Date: Mon Jul 29 22:39:33 2019 -0600 Fix portability issues. commit 22a23a6c4acb1105653f2b140be20eb5e57a16c6 Author: Supakorn "Jamie" Rassameemasmuang Date: Mon Jul 29 19:44:51 2019 -0600 Fix fragment shader. commit 486071f481eb83fc1f93cff9d2c3d0b97bc4df8e Merge: ffd8ced79 37ca40193 Author: John Bowman Date: Mon Jul 29 19:30:14 2019 -0600 Merge in glpbr. commit 37ca40193bf67f729e0d95a0cdf8b7d5747a98e1 Author: John Bowman Date: Tue Jul 30 11:08:43 2019 +1000 Simplify code. commit 48ef58767aa980cf9fe609c7e2fe14b4b6e8ee6f Author: John Bowman Date: Tue Jul 30 11:04:34 2019 +1000 Implement pixel shader. commit c0584280340c6c7ec1809827246ede7e04b12cd5 Author: John Bowman Date: Tue Jul 30 10:23:48 2019 +1000 Add NORMAL option to shaders. commit 9ceffe0a758b07ace814256a3ee8eeafb7b0de1d Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Jul 26 19:31:36 2019 -0600 Clean up shaders (from b18d965e22d159346c6454f18e80f00ea72418fc). commit 2363fce1f65c43d3c28674ad157a027b8d65a51e Author: John Bowman Date: Tue Jul 30 09:20:21 2019 +1000 Simplify shaders. commit 21016830d75d4313c62cafd972cbe6c6317ceed0 Author: John Bowman Date: Sat Jul 27 17:53:03 2019 -0600 Batch multiple pixels. commit a6494727f7a7f7f8cc371b16d94f7179871325c5 Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Jul 26 20:19:21 2019 -0600 Remesh when reshape. commit ec62821d7b599cc405400893ca245815a111343c Author: John Bowman Date: Sat Jul 27 09:15:10 2019 +1000 Remesh only when needed. commit bc17bfd12f778ec540ea1374506394b226878b2d Author: John Bowman Date: Sat Jul 27 09:13:55 2019 +1000 Update URL. commit 077e196557106919b5926e8753abda2541b83d3a Author: Supakorn "Jamie" Rassameemasmuang Date: Mon Jul 22 14:55:42 2019 -0600 Set explicit ambient and emissive to zero. commit ecd523060fa7c09ea40226ccb322d1cd0c804ca2 Author: John Bowman Date: Fri Jul 19 15:39:32 2019 -0600 Make FPS diagnostic display running mean and standard deviation. commit 76c05aae9ae5f551578d9fd9dea909f025b55527 Author: John Bowman Date: Fri Jun 28 09:38:52 2019 -0600 Remove unused code. commit 42d66ed8c0873583f555cb9c34c3eb741fa9ec48 Author: John Bowman Date: Thu Jun 27 00:27:48 2019 -0600 Fix vertex shading. commit 26e629266fbd885ea86566c2a346e8adc9ce6cd0 Author: John Bowman Date: Thu Jun 27 00:23:24 2019 -0600 Move normMat back to vertex.glsl. commit ffd8ced79178129cf9f463ff96c046d15f0162f3 Author: John Bowman Date: Thu Jun 27 00:18:52 2019 -0600 Move normMat back to vertex.glsl. commit bcbb081d26b4d865cf694edf36147947f21f3f9b Author: John Bowman Date: Wed Jun 26 18:08:01 2019 -0600 Improve numerical precision of normal calculation. commit d75eece8df0b13903d5f544a95ee35638773ac41 Author: John Bowman Date: Wed Jun 26 17:36:22 2019 -0600 Improve numerical precision of normal calculation. commit 7fa7340544d8611647e482b8dbf1209cf9027838 Author: Supakorn "Jamie" Rassameemasmuang Date: Sat Jun 22 14:36:51 2019 -0600 Add outline shaders. commit a31a2e97e9377e87d4a310877f66388a02b235ad Author: Supakorn "Jamie" Rassameemasmuang Date: Sat Jun 22 13:37:02 2019 -0600 Use twosided checking on fragment shader. commit a98ee44c0e9ab87f2a3cb8cc420ca98f856b3d9a Author: Supakorn "Jamie" Rassameemasmuang Date: Sat Jun 22 13:15:21 2019 -0600 Add basic geometry shader. commit bdbadd2a72ca8816932c235f49f4c574cba2dd05 Author: John Bowman Date: Fri Jun 14 08:24:53 2019 -0600 Avoid duplicate definition of RANDOM_MAX. commit b8f24cec48954a3d6ecddf67cfbd3579a4700102 Author: John Bowman Date: Mon Jun 10 08:48:16 2019 -0600 Fix typo in configure.ac. commit df9b9879723ddf19b5c60cb8c7f33cacb80429da Author: John Bowman Date: Fri Jun 7 14:39:18 2019 -0600 Increase default shininess. commit 9548fca8a3209525e7e2aa3f9b2f5569df0a4137 Author: John Bowman Date: Tue Jun 4 18:19:24 2019 -0600 Re-enable transparency. commit 5ccced67c49c7bee57bf794fd1c643b8b7ce3604 Author: John Bowman Date: Tue Jun 4 18:10:08 2019 -0600 Update fragment shader material. commit 76ec999c4bf3606cbccfa1721ebc20a2ab4f8a04 Author: John Bowman Date: Tue Jun 4 17:57:55 2019 -0600 Simplify code. commit a20bfae054ca67b1567531de952a80608955d777 Author: John Bowman Date: Tue Jun 4 17:47:49 2019 -0600 Pack material floats in a vec4. commit 8fd7f10e9590568224daffcff34abee98d8cc0f2 Merge: 81bba72df 549c3665c Author: Supakorn "Jamie" Rassameemasmuang Date: Tue Jun 4 17:46:18 2019 -0600 Merge branch 'glupdate' of github.com:vectorgraphics/asymptote into glupdate commit 81bba72df18e0c389b97da1543956295f67692be Author: Supakorn "Jamie" Rassameemasmuang Date: Tue Jun 4 17:45:52 2019 -0600 Fix material color argument order. commit 549c3665c073877d5a619d4d82b57a3695e6ab1b Author: John Bowman Date: Tue Jun 4 17:07:58 2019 -0600 Fix padding. commit 356e8d01b8066ef014e777c9ec0e41a0997995e8 Author: Supakorn "Jamie" Rassameemasmuang Date: Sat Jun 1 14:58:22 2019 -0600 Minor updates; tried Beckmann NDF. commit 24ccec91a0632d1b8799572339f8805065472f55 Merge: ea6f3787c 71f10dc1f Author: Supakorn "Jamie" Rassameemasmuang Date: Tue May 28 14:43:14 2019 -0600 Merge pull request #97 from vectorgraphics/master. Update glupdate branch from master. commit ea6f3787c17b1fa600093edc27b5823e682d6924 Author: Supakorn "Jamie" Rassameemasmuang Date: Tue May 28 13:34:17 2019 -0600 Update todo. commit 63213532057c29df34b022cdbf2951e8364b9345 Author: Supakorn "Jamie" Rassameemasmuang Date: Mon May 27 20:03:58 2019 -0600 Add in metallic/F0 option. commit 71f10dc1f8ebd3e696f87c220c3e9918ff3b80c1 Author: John Bowman Date: Sun May 26 22:56:21 2019 +1000 Detect gamma instead of sqrt function in libm. commit cc9be83022f3506b4adfc2c8face25532f40880f Merge: f4784eac5 b4884e1a0 Author: Supakorn "Jamie" Rassameemasmuang Date: Sat May 25 15:43:46 2019 -0600 Fix merge. commit f4784eac5f2a6da00a0d7d9b573eedbf836a8fa1 Author: Supakorn "Jamie" Rassameemasmuang Date: Sat May 25 15:35:07 2019 -0600 Minor fix on ndef. commit b4884e1a06b14803332d771fda79d1724ede5882 Author: Supakorn "Jamie" Rassameemasmuang Date: Sat May 25 15:40:13 2019 -0600 Fix matching braces. commit 848beeeaaf30a4323f250113c88bfbdcdc45875b Author: Supakorn "Jamie" Rassameemasmuang Date: Sat May 25 15:35:07 2019 -0600 Make environment map explicit. commit b66b16a184fe1177b2f66b8fbcd9626e2f8858c6 Author: Supakorn "Jamie" Rassameemasmuang Date: Sat May 25 15:22:56 2019 -0600 Minor fixes in OIIO. commit fbc06f15929c395b3714323a67e0e5311e10682b Author: Supakorn "Jamie" Rassameemasmuang Date: Sat May 25 15:17:16 2019 -0600 Enable checking texture flag and experimental IBL. commit 5fcefde8e8d991c74f7d5962776d4a8fc1b9bee9 Author: Supakorn "Jamie" Rassameemasmuang Date: Sat May 18 16:30:22 2019 -0600 Add usegl4 option. commit 06e51e8299f101628d1662fa363cd128a5fb7482 Author: Supakorn "Jamie" Rassameemasmuang Date: Sat May 18 15:22:03 2019 -0600 Add in some notes on image files. commit a2092901986f6453aed451d2849107ad912f9e86 Author: Supakorn "Jamie" Rassameemasmuang Date: Sat May 18 14:56:22 2019 -0600 Add the correct angle formula. commit b61333827cc39a20de3f1abbb032dd3b832c76c2 Author: Supakorn "Jamie" Rassameemasmuang Date: Sun May 12 15:31:12 2019 -0600 Add loading texture. commit 1a35d3c9b5bd8ad9c5f3e74e9da91e9eab4593e3 Author: Supakorn "Jamie" Rassameemasmuang Date: Sun May 12 14:51:25 2019 -0600 Add OpenImageIO library. commit b642331477ce96d38a0cb7b212acbcf2c7291c1a Author: Supakorn "Jamie" Rassameemasmuang Date: Sun May 12 14:35:20 2019 -0600 Add C++ property settings. commit 271020803bbea7704e4325cc618723d4381ef472 Author: Supakorn "Jamie" Rassameemasmuang Date: Sun May 12 14:34:25 2019 -0600 Modify settings. commit d8d814cb6e54dc45532c8c1a896bfe797ca097e6 Author: John Bowman Date: Thu May 9 22:10:26 2019 -0600 Remove unused code. commit 5e9613851a98037de0317b2d5dd30680a594eb55 Author: Supakorn "Jamie" Rassameemasmuang Date: Tue May 7 19:36:56 2019 -0600 Change metallic back to 0. commit ef4d2df309af70ac30e9c4a5659a2bdf9594cd84 Author: Supakorn "Jamie" Rassameemasmuang Date: Tue May 7 19:35:53 2019 -0600 Fix normal flip in double-sided rendering. commit 7767056d25e35bf70f437d1134d5a52e64a81d3e Author: Supakorn "Jamie" Rassameemasmuang Date: Mon May 6 20:59:02 2019 -0600 Add some notes on material changes. commit 29369d96d32424b1bd16f1f0a60e4d883e82c45f Author: Supakorn "Jamie" Rassameemasmuang Date: Mon May 6 20:49:30 2019 -0600 Remove some variables. commit ab452eb2b668f22509c2ff57674c0bc286cbb8aa Author: Supakorn "Jamie" Rassameemasmuang Date: Mon May 6 20:44:14 2019 -0600 Add first version of PBR. commit e02cdd23128913a992e996cc2a7b7070568bc618 Author: Supakorn "Jamie" Rassameemasmuang Date: Sat May 4 23:35:07 2019 -0600 Add debug configuration. commit e37826c1f792a6ba04254eeff56fe63258e293c2 Author: John Bowman Date: Thu May 2 16:38:07 2019 -0600 Fix warning messages. commit 6c6b5c8b02278de815b4351a18d99393b78bd16a Author: John Bowman Date: Thu May 2 16:35:25 2019 -0600 Fix warning messages. commit 7382b5a8016981d5503a3d3442903ac9ddf17e6f Author: John Bowman Date: Thu May 2 16:28:45 2019 -0600 Update fftw++; fix warning message. commit 8f641c83362c04460251f884493b1c3536274192 Merge: abd3f7616 43b43ae8f Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Apr 26 12:35:50 2019 -0600 Merge pull request #94 from vectorgraphics/master Merge master branch into glupdate. commit 43b43ae8fe3b4558a9086bd8343b490502acde4e Author: John Bowman Date: Thu Apr 11 08:28:47 2019 -0600 Improve missing garbage collector instructions. commit 9eed805451ffaff7833ca86bd4a5dbea92cdf9d6 Author: John Bowman Date: Fri Apr 5 06:58:06 2019 -0600 Simplify code. commit 649e87c9a6ad587bf92c6aaf6bd16f2a2153a182 Author: John Bowman Date: Thu Apr 4 18:07:56 2019 -0600 Update GLEW and OSMesa paths for MacOSX. commit 1c8809563ba9f92f560f8da3284994a26c9c6c51 Author: John Bowman Date: Tue Apr 2 11:39:43 2019 -0600 Update build script. commit ead3d5e9ae1e325738606d9f2420b39dfe48e4e0 Author: John Bowman Date: Tue Apr 2 11:11:56 2019 -0600 Increment version to 2.50. commit c53b4ef0bb51b4c022c580f912bbdfe3f2cb7c0b Author: John Bowman Date: Tue Apr 2 10:01:46 2019 -0600 Update build script. commit 74dc51a9d28eefcc1d628aa580da443ceed015c9 Author: John Bowman Date: Tue Apr 2 09:54:01 2019 -0600 Fix fuzz and soccerball example. commit 1f92dbaf87bf93635fdb67f83e57268893707cec Merge: 211c791b7 6fad4a32d Author: John Bowman Date: Sun Mar 31 23:48:48 2019 -0600 Merge branch 'master' of github.com:vectorgraphics/asymptote commit 211c791b7d64ff6c6c3060519b3a8d151835acc8 Author: John Bowman Date: Sun Mar 31 13:10:44 2019 -0600 Update to Boehm gc-8.0.4. commit 6fad4a32d4b786782504b3368d0aa1ce13fbd4d5 Merge: 819de76a7 d1d560934 Author: John Bowman Date: Sun Mar 31 10:23:57 2019 -0600 Merge pull request #92 from mojca/whitespace Convert tabs to spaces in configure.ac. commit 819de76a7e70a382320efa7d0e3f32ee9255c3f4 Author: John Bowman Date: Sun Mar 31 10:08:27 2019 -0600 Remove unused code. commit 2df557185b5b5b335cc7a87cce3dd379cbfcf79a Author: John Bowman Date: Sat Mar 30 10:46:15 2019 -0600 Fix portablity issues; remove unused code. commit d1d560934374c253363567c8f36f2694cd3126c7 Author: Mojca Miklavec Date: Fri Mar 29 21:21:40 2019 +0100 Convert tabs to spaces in configure.ac. commit 404eda801e7f182649a37879c3aa2b7e60b2f143 Author: John Bowman Date: Thu Mar 28 13:26:04 2019 -0600 Address portability issue. commit 6d26cbff78572fe2cb4236eb57f65d59b6c44f31 Author: John Bowman Date: Thu Mar 28 12:53:54 2019 -0600 Fix portabiliity issues. commit ecc393f7e8929beced0d903ca07c12262d27fbaf Author: John Bowman Date: Wed Mar 27 01:33:28 2019 -0600 Increment version to 2.49. commit 54570f91bb95d024cd1ba37e46593f909edf0c62 Author: John Bowman Date: Wed Mar 27 00:35:12 2019 -0600 Update examples. commit 7250a9576345bf7c1abac146871a18e1eaf9b06d Author: John Bowman Date: Wed Mar 27 00:28:18 2019 -0600 Fix fuzz usage. commit cc5346e91bbfa7f81178e04d22d9771157ed189b Author: John Bowman Date: Tue Mar 26 22:11:24 2019 -0600 Apply further workaround for broken MSWindows drivers for Intel GPU. commit f66446d81dd2aa529ed8eb8a8c164e7f7ad4a478 Author: John Bowman Date: Tue Mar 26 20:34:57 2019 -0600 Fix portability issues. commit 8f8011e03b60829a75a5aff6fe0348a07cb318ed Author: John Bowman Date: Mon Mar 25 02:27:16 2019 -0600 Fix Makefile. commit 78eb88e287cb9e7897146c259920ac3832553612 Author: John Bowman Date: Sun Mar 24 15:43:55 2019 -0600 Support --disable-gc again. commit fd5b45ad85d63886f3b72540997acb8bf05f99a5 Author: John Bowman Date: Sun Mar 24 15:30:48 2019 -0600 Document material buffer sizes. commit 26a677733ff91348219775e89542c65130cdf200 Author: John Bowman Date: Sun Mar 24 15:16:17 2019 -0600 Reduce number of shader recompilations. commit 6539c75e327241401bcd532be89250d96179a47b Author: John Bowman Date: Sun Mar 24 15:09:55 2019 -0600 Rename shader files. commit 1833dcf8a1e8c80c27c64a975a23f9b06278105d Author: John Bowman Date: Sun Mar 24 12:22:50 2019 -0600 Fix lighting and material limits. commit 92ab2cf7bbf55e16c4e64cf0c67bb5bd12bff3f9 Author: John Bowman Date: Sat Mar 23 10:38:42 2019 -0600 Fix segmentation fault. commit 5ccc69edaae8b06db323a7db5d4812d89310ed1f Author: John Bowman Date: Fri Mar 22 16:43:38 2019 -0600 Improve example. commit 6e2f7c547a6a0c634e55f7508b4ea4d5325aab72 Author: John Bowman Date: Thu Mar 21 16:52:13 2019 -0600 Fix bug in f82e7672184f0b0ff91efd57a74a60269cd43ca2: update fuzz-dependent quantities. commit 4997b77e6d00dda91adef3741574b7bb41e09d87 Author: John Bowman Date: Sun Feb 24 11:37:54 2019 -0700 Simplify code. commit 1cf5fcb7316084d1d71d12719d75364a0474bc9b Author: John Bowman Date: Fri Feb 8 23:15:37 2019 -0700 Fix deletion of artifical variables; always use Bland's rule. commit a30061c913e099879a1c5250bc65cd7e718bcbce Author: John Bowman Date: Tue Feb 5 06:36:35 2019 +1100 Workaround broken MSWindows drivers for Intel GPU. commit 126a405dccfa51e6c1f1158c2f0084d54013ddc2 Author: John Bowman Date: Tue Feb 5 06:33:02 2019 +1100 Fix drawpath3. commit 649ae913c25ee87dc0ce6226146e063703ddfc9f Author: John Bowman Date: Tue Feb 5 02:02:40 2019 +1100 Place temporary cap on Nmaterials. commit d306a51bb1732cc420b9f1bdea0bc5a75ce820e5 Author: John Bowman Date: Sun Feb 3 19:25:24 2019 -0700 Fix MSDOS configuration. commit f8f4c113dd5ea56c1a3b47b3ad8926fda1792dd6 Author: John Bowman Date: Sun Feb 3 00:26:23 2019 -0700 Implement maxvertices for working around OpenGL queueing limitations. commit b644f8df7bf867991fba1b4bfea3460db564affb Author: John Bowman Date: Sat Feb 2 12:01:17 2019 -0700 Simplify code. commit fe761482993f4c6e0dc22e68a8bb5e8cea553f23 Author: John Bowman Date: Sat Feb 2 11:39:15 2019 -0700 Simplify code. commit 4bfc78893a05e83d6698b349b24c3390872e903d Author: fahasch Date: Sat Feb 2 12:02:42 2019 +0100 Palettes from matplotlib For high quality density plots it is very important to have many well designed colormaps at hand. This module offer over 50 new colormaps. It has sequential colormaps, diverging colormaps, and cyclic colormaps. commit f82e7672184f0b0ff91efd57a74a60269cd43ca2 Author: John Bowman Date: Sun Jan 27 22:08:40 2019 -0700 Speed up min, max, minratio, maxratio, and intersection calculations by increasing fuzz as depth decreases. commit e4283310b3fc84b838f233ee06b0c2b301264cc4 Author: John Bowman Date: Sun Jan 27 20:45:15 2019 -0700 Fix Nmaterials. commit f8cd7d09dd1d3b6a0215338a71909deac4deecc2 Author: John Bowman Date: Sun Jan 27 14:52:01 2019 -0700 Clear material buffer before it reaches GL_MAX_UNIFORM_BLOCK_SIZE. commit 0d057d35cb30d52f33db9f155c880ed8f8a1d7d2 Author: John Bowman Date: Sun Jan 27 14:49:57 2019 -0700 Suppress spurious SIGTERM. commit 8a2f965e64db8d2368abdb9ccd0a176b657b0c76 Author: John Bowman Date: Sat Jan 26 21:21:36 2019 -0700 Restore examples. commit 2a69ec434b6924ef42b2338563b391e763b13ff0 Author: John Bowman Date: Sat Jan 26 21:17:54 2019 -0700 Fix tiling. commit e7519239b74773e1757acf277df9a4f00c50880a Author: John Bowman Date: Sat Jan 26 20:48:41 2019 -0700 Integrate tesselation into batch drawing routine. commit 6673503f8b31a7d0ae9d840176d9a5dbe6dc7248 Author: John Bowman Date: Sat Jan 26 17:22:40 2019 -0700 Sort and draw transparent triangles in one batch. commit 20dd8537d4a48b966c3b81367beaf098e2ce277e Author: John Bowman Date: Sat Jan 26 14:13:57 2019 -0700 Pack explicit shader colors. commit ce1afeef0b1b6ce824ab81a50c1d3a6679fd5285 Author: John Bowman Date: Sat Jan 26 08:51:28 2019 -0700 Implement material index. commit 4fd60c4218faca42ae38fab86b50d56a0ff021a0 Author: John Bowman Date: Wed Jan 23 23:48:50 2019 -0700 Simplify code. commit d27ff2af8eabf82418005a24d5f07fffb502355b Author: John Bowman Date: Wed Jan 23 23:38:25 2019 -0700 Remove hard-coded number of lights. commit a0f18816ee21a814ef8b16e0b0f717c72a37f327 Author: John Bowman Date: Wed Jan 23 22:15:21 2019 -0700 Remove GL_ARB_gpu_shader5 requirement. commit 786f615ea087e0f542f9697c20ad460d5a0fac5b Author: John Bowman Date: Wed Jan 23 20:46:19 2019 -0700 Downgrade to GLSL 1.30. commit 8506a29977e9437851759a59087b433a39f1c44a Merge: 1eb6fd84f f106987c9 Author: John Bowman Date: Wed Jan 23 19:30:40 2019 -0700 Merge branch 'master' into gl330. commit f106987c917bcb2f8b34cfc912fee88112b09bfd Author: John Bowman Date: Wed Jan 23 19:25:23 2019 -0700 Port to MSDOS. commit da5f9d09aa48aabc16ac3aa9c3b5c5632805339d Author: John Bowman Date: Tue Jan 22 20:19:13 2019 -0700 Require OpenGL 4.30. commit 1eb6fd84f009dc32af52802d0445a4442a54a709 Author: John Bowman Date: Tue Jan 22 13:02:50 2019 -0700 Backport to OpenGL 3.3. commit a56ab24fb1fd8092bd67aaf03b29763045bfc19e Author: John Bowman Date: Mon Jan 21 22:35:22 2019 -0700 Update build-asymptote.dos. commit 26e6e567dd6a6d56538e76a1bc426f33ed29d20c Author: John Bowman Date: Mon Jan 21 22:11:51 2019 -0700 Add CYGWIN freeglut-3.0.0 patch. commit f66a3427010389d31135ef0e12a2c11f90952c7e Author: John Bowman Date: Mon Jan 21 21:34:47 2019 -0700 Install and check for shaders. commit fdaeeb5d054b9c9faca7718fd5f695c1baeec722 Author: John Bowman Date: Mon Jan 21 06:40:16 2019 -0700 Port shader to MSDOS. commit 8393599bed33a1063411b9eeffb63b91898a468a Author: John Bowman Date: Mon Jan 21 00:03:42 2019 -0700 Port to MSDOS. commit 8b7207a65f759e98d9b6001aab3660e6670099ec Author: John Bowman Date: Sun Jan 20 23:01:52 2019 -0500 Port to MSDOS. commit 59d7b37b61e628a9daa33dc9d79a74cceee40193 Author: John Bowman Date: Sat Jan 19 10:33:58 2019 -0700 Check for GLEW library during configuration. commit 37943204fdbbcefc995d7d6340e0bd17a3681c84 Author: John Bowman Date: Tue Jan 15 22:45:01 2019 -0700 More portability fixes. commit 652fb33c5c603caf77c9003d7badab95398e30dc Author: John Bowman Date: Tue Jan 15 21:47:06 2019 -0700 Require only c++-11. commit 45edbf3b4a7fcece700576a00f5c46d275154c34 Author: John Bowman Date: Tue Jan 15 17:51:58 2019 -0700 Remove unused code. commit b2b77e004ab3784e6ecc6dbefdeffa50eccb55e3 Author: John Bowman Date: Tue Jan 15 17:40:51 2019 -0700 Remove unused code. commit c9a6a08e1821480670fd8748b91f827c87af2e75 Author: John Bowman Date: Tue Jan 15 17:36:24 2019 -0700 Remove unused include. commit 6ee6e8a6640158b7c85da16ea82e852e0fccebc5 Author: John Bowman Date: Tue Jan 15 15:26:45 2019 -0700 Update asymptote.spec. commit 9b1407e65518be9e8493dfe1a802b18d3052bfdb Author: John Bowman Date: Tue Jan 15 13:17:24 2019 -0700 Update build scripts to Boehm gc 8.0.2. commit 12b3a085dc52b79da46fa9cd6fb7b843980a4a32 Author: John Bowman Date: Tue Jan 15 13:14:02 2019 -0700 Update to Boehm gc 8.0.2. commit abd3f7616ff00e5cc19fb9ebee0ed7f11d4c4367 Author: John Bowman Date: Sun Jan 13 22:00:48 2019 -0700 Use static attributes. commit b7c3a5ec50cf30be6edfc87bfafd1815fd7f16f4 Author: John Bowman Date: Sun Jan 13 21:40:47 2019 -0700 Fix lighting model. Specify all lights in viewport frame. Remove unused code. commit a2fb848f5944c8acca7a3425a5c14d1eaf3526fe Author: John Bowman Date: Sun Jan 13 14:50:08 2019 -0700 Remove dependence on deprecated GLU library. commit ca9a12aac5107ffb21901569289a4e45fa8ff6c7 Author: John Bowman Date: Sun Jan 13 11:13:31 2019 -0700 Implement tesellation (many triangles) in new shader. commit cf60d572922a9708443683b8ffa610063bbca800 Author: John Bowman Date: Sat Jan 12 20:43:02 2019 -0700 Move lighting code out of setUniforms. commit 5126dd3e6eb1432ba0b60214b4a26de7f379e69e Author: John Bowman Date: Sat Jan 12 19:55:08 2019 -0700 Simplify code. commit 16213b13921e57381a87fd2f047c7e1c59458387 Author: John Bowman Date: Sat Jan 12 19:41:29 2019 -0700 Simplify code. commit c95d3ea1deed86a9b0af8db7b9ff81facab00d4c Author: John Bowman Date: Sat Jan 12 19:09:35 2019 -0700 Remove arbitrary limit on number of lights. commit 2caa67789a014fd206bc55fab2587be538f739e0 Author: John Bowman Date: Thu Jan 10 21:06:14 2019 -0700 Fix pixel object. commit 52267dc8b614bbb8138ae6195efb4ceeba1e2e66 Author: John Bowman Date: Wed Jan 9 23:38:04 2019 -0700 Port pixel to new shader. commit 8eacd6dc8b15fe1db7d1fb914f80d6887d9a74df Author: John Bowman Date: Wed Jan 9 21:26:13 2019 -0700 Fix segmentation fault. commit 626521dbed9479d9db083a0b6671acf8c8418282 Author: John Bowman Date: Wed Jan 9 21:16:58 2019 -0700 Move pixel code to drawpath3. commit db3a151d0b71d26c7134b604d972b095ff28adfb Author: John Bowman Date: Wed Jan 9 20:20:23 2019 -0700 Delete buffers on clear. commit 079c558a1f93f6cbff44fe80dfe57b1f4b7e4750 Author: John Bowman Date: Wed Jan 9 15:56:48 2019 -0700 Fix transparency. commit 9d9a790b03f5f276c5241503f2644942e6bc24b9 Author: John Bowman Date: Mon Jan 7 21:22:31 2019 -0700 Remove unused code. commit 0f58cdd6947cffce536a1aa2a96160baf3ea3aca Author: John Bowman Date: Mon Jan 7 21:17:07 2019 -0700 Simplify code. commit e26920c6ac62d6f335daae081428ff334a720c4f Author: John Bowman Date: Mon Jan 7 21:11:49 2019 -0700 Remove unused code. commit 1048f4d87638aaca0793bb8a5c20be1cd630de54 Author: John Bowman Date: Mon Jan 7 20:41:23 2019 -0700 Simplify code. commit ddeca77682ea6ef4da0fddbe7295c11e26b5286b Author: John Bowman Date: Sat Jan 5 22:53:28 2019 -0700 Use Phong-Blinn lighting model in shader. commit 0f43602199fca48d353477504f881acfdb1f426e Author: John Bowman Date: Sat Jan 5 22:52:07 2019 -0700 Update documentation. commit 29f0d3ccfbbbf8d7b0bc1bf81aa95859593288cf Author: John Bowman Date: Sat Jan 5 16:34:20 2019 -0700 Remove unused code. commit 9671ef6f9c6d2ad6f78dc2c0e276fe5012c9509d Author: John Bowman Date: Fri Jan 4 20:11:00 2019 -0700 Remove menu due to incompatibility with new shader. commit d4048f9224de194a6587908b2fb3f01912e0d8ad Author: John Bowman Date: Fri Jan 4 18:49:55 2019 -0700 Port Bezier curves to new shader. commit e13aa6c6c840e6cd45b2e39dace8bba8528a7714 Author: John Bowman Date: Fri Jan 4 12:37:38 2019 -0700 Reinstate sorting of transparent triangles. commit b050a1b46b5c01706465c6fe942aad133499c01d Author: ivankokan Date: Fri Jan 4 16:55:08 2019 +0100 Routines are shifted, hence ordinary numbers are changed + missing keyword explicit commit eb8fe25a71efa3ec8cba807bfd1d30078bdc85c1 Author: John Bowman Date: Fri Jan 4 08:44:26 2019 -0700 Update documentation. commit 68f88a9036b87296918f138a5294d32632f31609 Author: ivankokan Date: Fri Jan 4 16:27:57 2019 +0100 Updated docs with missing void dot(...) commit 28bfc3a3b786de71c0e93069f0d2f3c18d2e7324 Author: John Bowman Date: Fri Jan 4 07:26:00 2019 -0700 Fix tiling. commit 7b1fe1f3f4c173029f1759a5b1c337540e85437f Author: John Bowman Date: Fri Jan 4 07:00:07 2019 -0700 Remove remaining GL_MODELVIEW_MATRIX usages. commit 67873c000568b82a1caa4df5c748dc57bafa878b Author: John Bowman Date: Thu Jan 3 21:04:43 2019 -0700 Remove unused code. commit 6836efe332e30b94c8c41e63899fac3a319a2f16 Author: John Bowman Date: Thu Jan 3 20:57:21 2019 -0700 Do camera calculations in double precision. commit 60d2c0e07174e2050af00236e286bdfac9c191ca Merge: 6d6a65354 aa08fb345 Author: John Bowman Date: Tue Jan 1 21:32:41 2019 -0700 Merge branch 'master' into glupdate. commit aa08fb34573824b7fa939cfaeddce802d8990e03 Author: John Bowman Date: Tue Jan 1 21:27:40 2019 -0700 Disable experimental offscreen rendering by default due to NVIDIA conflicts. commit 44f31905cdaafd6cd64d94be4a487eb4d24b401c Author: John Bowman Date: Fri Dec 28 02:20:16 2018 -0700 Fix ghostscript arguments. commit 60acb54ca61ba808d64aa0e28c1c64c853380083 Merge: d98f3793c 5fb1fecb5 Author: John Bowman Date: Fri Dec 28 01:40:44 2018 -0700 Merge branch 'master' of github.com:vectorgraphics/asymptote. commit d98f3793c4df96dcae238312aac889502912872d Author: John Bowman Date: Fri Dec 28 01:40:11 2018 -0700 Implement workaround for Ghostscript transparency extension -dSAFER bug. commit 5fb1fecb5fa11508c216d2fa39cf4eac247f5254 Author: Supakorn "Jamie" Rassameemasmuang Date: Mon Dec 24 16:44:56 2018 -0700 Add EOL marker. commit 6d6a65354125d6beef1e7115b4f9127f09ee559c Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Dec 21 15:45:15 2018 -0700 Fix last commit on struct data. commit 5655f851d3762a80c559078bba9c9899c37f9c90 Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Dec 21 15:44:52 2018 -0700 Centralize render data exchange. commit 25ccee4d0fb257c223f786bfd151583a32c1aa2b Merge: 25668b728 924bd6b1d Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Dec 21 15:15:25 2018 -0700 Merge branch 'glupdate' of github.com:vectorgraphics/asymptote into glupdate commit 25668b728a8b77c54fa428fb23ceec106e6c2562 Author: Supakorn "Jamie" Rassameemasmuang Date: Fri Dec 21 15:15:21 2018 -0700 Update modelViewMatrix linkage. commit 924bd6b1d9586ff8c2ce15a070826c20a1660be4 Author: John Bowman Date: Fri Dec 21 13:12:43 2018 -0700 Use standard asy search path to locate shaders. commit 0a42fbde8f86592dc888ecc58abf37c4c4d3bc3b Author: Supakorn "Jamie" Rassameemasmuang Date: Thu Dec 20 17:03:58 2018 -0700 Fix ModelView Matrix. commit d1fbe2c9df2b00d7556309a8fd53866fa75a9e8d Author: John Bowman Date: Thu Dec 20 16:15:00 2018 -0700 Fix dual simplex exit conditions. commit 32b00922c75c6c4221b58ed91ff50a2f7ae1cbd0 Author: John Bowman Date: Sat Dec 15 19:10:04 2018 -0700 Add missing dual argument. commit 4da31b4727444458a041c36e9e36ad772614b87c Author: John Bowman Date: Sat Dec 15 19:09:09 2018 -0700 Fix phase1=false and dual modes. commit 634f7476ea373a8dac95c537436fbcf73c7cfdbd Author: John Bowman Date: Sat Dec 15 10:32:46 2018 -0700 Fix phase1=false optimization. Add support for dual simplex method. commit 64f568fe2ef00b8873ff06405d708502a6273d19 Author: John Bowman Date: Thu Dec 13 20:31:27 2018 -0700 Improve diagnostics. commit 3c6736096056c8c26d092c5d71d0987a17b66b41 Author: John Bowman Date: Thu Dec 13 15:38:20 2018 -0700 Fix position of diagnostic. commit 280d717c9c870cf66f01f324472d2de1424aeeab Author: John Bowman Date: Fri Dec 14 07:52:02 2018 +1100 Drive artificial variables out of basis. commit 2113adb6f8ba236eb7ce08d76a464f52e3b3bb3b Merge: 494cf1d0d f3da29c7a Author: John Bowman Date: Tue Dec 4 15:58:18 2018 -0700 Merge branch 'glupdate' of github.com:vectorgraphics/asymptote into glupdate commit f3da29c7a4ab507d998fdb2977956ecdb764c22f Author: Supakorn "Jamie" Rassameemasmuang Date: Tue Dec 4 15:49:49 2018 -0700 Remove glext.h and add GLEW library. commit ffabb72fdf2df5753e9d60535a9eb13fe23534f8 Merge: 0dbed3fc8 632607db0 Author: Supakorn "Jamie" Rassameemasmuang Date: Sun Dec 2 14:17:53 2018 -0700 Merge branch 'master' into glupdate. commit 494cf1d0dc9f567d758377a1dab6f93617d63d10 Merge: 0dbed3fc8 c69fb7d6f Author: John Bowman Date: Tue Nov 27 14:12:14 2018 -0700 Merge branch 'master' into glupdate. commit 0dbed3fc839e868febbecc278ef0d4672aa92314 Author: John Bowman Date: Thu Nov 22 17:18:40 2018 -0700 Reinstate Rotate matrix. commit c69fb7d6f4f9d058c18996b5fb4c6d9f3212b94c Author: John Bowman Date: Wed Nov 14 13:30:52 2018 -0700 Add pivot diagnostics support in rationalSimplex.asy. commit 632607db0ce948d3502d75274e8a12014f0e8aa1 Author: John Bowman Date: Tue Nov 6 10:46:11 2018 -0700 Add diagnostics to rationalSimplex; use Bland's rule. commit 85000d2ee926bae8dbfd79d6b2daa11231fd112f Author: John Bowman Date: Sun Nov 4 09:17:42 2018 -0700 Fix phase1=false for standard-form interface. commit 4867651a75934de3a664acf4ffe14b34d4ee19e4 Author: John Bowman Date: Sun Nov 4 00:48:37 2018 -0600 Update documentation. commit 8e109fe1136926bc48f81a6ea3f44b96e9602967 Author: John Bowman Date: Sun Nov 4 00:46:18 2018 -0600 Fix and re-enable phase1 optimization; add missing rational operators. commit 38a59370dc5ac720c29e1424614a10f7384b943f Author: John Bowman Date: Wed Oct 3 07:24:39 2018 -0600 Port to gc-7.6.8. commit 743dcbd36624b682958c6e6fa5de808b0c871bd7 Author: John Bowman Date: Thu Sep 27 17:16:32 2018 -0600 Fix stroke=true bug. commit 5379d0cec0d774b532bd389c6268711adf2067a5 Author: John Bowman Date: Thu Sep 27 16:25:36 2018 -0600 Minor documentation edits. commit d9ee7b4bfe23f5355f9d62701599af00b242bc79 Merge: c172ffeb3 1b22b1813 Author: John Bowman Date: Wed Sep 26 08:12:35 2018 -0600 Merge branch 'master' of github.com:vectorgraphics/asymptote commit c172ffeb32e1dad161688bac45fd96fe927dafa5 Author: John Bowman Date: Wed Sep 26 08:12:24 2018 -0600 Handle zero counts. commit 1b22b1813f11bb9f9a2a9de7b70ad61eaffd136b Author: Supakorn Rassameemasmuang Date: Wed Sep 12 22:09:19 2018 -0600 Fix latexmkrc for Windows and add author's name. commit e86ee4696b6fb87c3e2cb8da76138867da789409 Author: Supakorn Rassameemasmuang Date: Sat Sep 8 17:39:14 2018 -0600 Fix latexmkrc URL. commit c2e37f99ab05001964c0271c9e693ac86fe88f54 Author: Supakorn Rassameemasmuang Date: Mon Sep 3 19:42:14 2018 -0600 Remove transformations from light direction. commit cf3f4d1e199cd8a9a460f9614446d2675b7fcbbe Author: Supakorn Rassameemasmuang Date: Mon Sep 3 19:20:22 2018 -0600 Add basic blinn/phong model. commit c0640d76ee67f3266a2347e5b2f2bf142a4705e3 Author: Supakorn Rassameemasmuang Date: Mon Sep 3 16:53:03 2018 -0600 Pass in material to GLSL. commit 427ff0d076dbc3f2edd6755d7b667c266a48d35b Author: Supakorn Rassameemasmuang Date: Sun Sep 2 19:35:08 2018 -0600 Add material struct. commit f52101d84f23e7111fc104f77f4e39213ce3a27c Author: Supakorn Rassameemasmuang Date: Sun Sep 2 18:47:27 2018 -0600 Fix trace ignore. commit b335d897196d24aaccdde3e99723e8d212c0d356 Author: Supakorn Rassameemasmuang Date: Sat Sep 1 22:26:17 2018 -0600 Finally add VAO as a requirement. commit d2996cbcac12ed9f5299e25f317d968c0c6e2e3e Author: Supakorn Rassameemasmuang Date: Sat Sep 1 21:27:38 2018 -0600 Fix VBO/EBO binding. commit 1fd9c7d384475bec22098a8e9fac39cb77e43f56 Author: Supakorn Rassameemasmuang Date: Sat Sep 1 17:16:25 2018 -0600 Allow for proper buffer data transfer. commit 83c2b62df0132a310ce3d234fcc7be463b7795d6 Author: John Bowman Date: Fri Aug 31 22:11:50 2018 -0600 Begin development of webgl output. commit adbb32fdd380304839cb401c76ea2ab662edfe65 Merge: 23c4bd2d5 df015058a Author: John Bowman Date: Fri Aug 31 17:57:46 2018 -0600 Merge branch 'webgl'. commit df015058a329bc2c50898673fb77ab63cb684239 Author: John Bowman Date: Fri Aug 31 17:56:58 2018 -0600 Rename webgl files. commit 23c4bd2d53cdc577eeed0cac28d73439eb4f3e84 Merge: c41bc347b 48fc03cf2 Author: John Bowman Date: Fri Aug 31 17:33:40 2018 -0600 Merge branch 'webgl'. commit c41bc347ba6303190d0f5293507640eff7cc7a62 Author: John Bowman Date: Fri Aug 31 17:28:21 2018 -0600 Create index.html commit 48fc03cf2cd9bb8d12de45fdc414daf9dc1e0ca0 Author: John Bowman Date: Fri Aug 31 17:20:41 2018 -0600 Add WebGL files. commit a08121dc7deeda1a1cd3cbacbe52f95deba69ce0 Author: John Bowman Date: Fri Aug 31 12:23:44 2018 -0600 Work around dvisvgm bound box lower threshold. commit fd66ec5e916f1c750ef7cfa7c40fda372fd1ab53 Author: Supakorn Rassameemasmuang Date: Thu Aug 30 17:50:24 2018 -0600 Make rotation use glm::matx. commit 28ea1444cbe53b6e8be16597cb424f76b8a7d131 Author: Supakorn Rassameemasmuang Date: Thu Aug 30 00:35:00 2018 -0600 Get basic shader working. commit 1753e2fcf110add939514c4a743b7612045827bc Author: John Bowman Date: Tue Jul 31 00:47:07 2018 +0200 Increment version to 2.48. commit 67f0c4b2d24adc346d7b616b13298903433c5910 Author: John Bowman Date: Mon Jul 30 23:23:47 2018 +0200 Minor optimization. commit 541b4014c2ad7fd63d845c3ffb6a33a6459c12eb Author: John Bowman Date: Mon Jul 30 23:07:55 2018 +0200 Fix scaling (allow second variable in Simplex method to be negative). commit 28bc9c75a1393cceb0cb719881804615ec09f05f Author: John Bowman Date: Mon Jul 30 11:23:04 2018 +0200 Generate EPS only for single-page documents. commit 89d2c88c2945096e5d765e3d9fe76163f8f553e2 Author: John Bowman Date: Mon Jul 30 10:02:53 2018 +0200 Remove .vscode from releases. commit 39454327d81d169aa48fc25f6397afa0bba83be4 Author: John Bowman Date: Mon Jul 30 09:57:43 2018 +0200 Remove unused files. commit 2157692a4b640473b188cdee545a431fea67e15b Author: John Bowman Date: Mon Jul 30 05:42:26 2018 +0200 Fix uptodate flag; remove spurious directory. commit aba57e58c0292a3298bc132298671814aeb67fc4 Author: John Bowman Date: Mon Jul 30 04:42:23 2018 +0200 Fix URL in README. commit fa2aa36e9cea341aad6ab0e3bf49db93001069c5 Author: John Bowman Date: Mon Jul 30 04:33:10 2018 +0200 Fix bsp module. commit 22d2b8d37da35bf1d0d6a1ddf75e1db32885ede0 Author: John Bowman Date: Sun Jul 29 13:22:04 2018 -0600 Increment version to 2.47. commit 4eee33bc01e444c03242eefbce091bed40d3f835 Author: John Bowman Date: Sun Jul 29 11:29:27 2018 -0600 Fix relative alignment under picture rotation. commit 9edc023b2c37d0ea50972c1ab784ee9e1e100d55 Author: John Bowman Date: Sun Jul 29 01:42:29 2018 -0600 Fix commit 451a260ae50d02867c1e54726a68d8af2c55761d. commit 451a260ae50d02867c1e54726a68d8af2c55761d Author: John Bowman Date: Sat Jul 28 09:35:16 2018 -0600 Fix shipout issues. commit ae6d9d312ab21212216960f56122ffe8e0c7fa2a Author: John Bowman Date: Sat Jul 28 06:24:46 2018 -0600 Account for pen width in bbox. commit 3ea27282e2a79139cd5600ee31b8e1b451eb2d03 Author: John Bowman Date: Fri Jul 27 02:02:17 2018 -0600 Don't use defaultGhostscriptLibrary location in MSWindows registry since TeXLive dvisvgm requires 32-bit version, even on 64-bit platforms. commit 3b49296799c14832747db90150d23067f946683a Author: John Bowman Date: Sat Jul 21 18:00:11 2018 -0600 Increment version to 2.46. commit 19dd6cc8027597d5e2ca25b07db2851d9771f03c Author: John Bowman Date: Sat Jul 21 15:37:27 2018 -0600 Revert "Update path." This reverts commit f63df996a86c935c51e09c47fe9c0aa2a8d7dc2d. commit f63df996a86c935c51e09c47fe9c0aa2a8d7dc2d Author: John Bowman Date: Fri Jul 20 23:09:03 2018 -0600 Update path. commit 1734e7af6a018f27240fddd4e7bf14f569a09522 Author: John Bowman Date: Fri Jul 20 21:33:54 2018 -0600 Improve error message when rsvg-convert is missing. commit abd6347aea2faaa2862e3ebe34c7f85dd820c77d Author: John Bowman Date: Thu Jul 19 15:10:59 2018 -0600 Remove obsolete uuid code. commit b46eed584fea0e625f2cde3dab23c2522d3d2486 Author: John Bowman Date: Thu Jul 19 15:09:10 2018 -0600 Fix saveLocation. commit 87c39ea72263c68d5548da4941eda639f37fce22 Author: Supakorn Rassameemasmuang Date: Thu Jul 19 14:59:32 2018 -0600 Use class instead of instance on item not existing. commit 721cc5cc84abe2351211262670f5091e66f33b7c Merge: ec53a266a 5f95aa824 Author: Supakorn Rassameemasmuang Date: Thu Jul 19 14:56:15 2018 -0600 Merge branch 'master' of github.com:vectorgraphics/asymptote commit ec53a266a170edcd94c8a070f4d5b4a028eba964 Author: Supakorn Rassameemasmuang Date: Thu Jul 19 14:56:11 2018 -0600 Revert venn. commit b88d3d9df356db299150e59d4ee0ef0f5adf82bb Author: Supakorn Rassameemasmuang Date: Thu Jul 19 14:55:10 2018 -0600 Fix script not updating. commit 5f95aa8246f7976dfc17a522b66da4a4179833c1 Author: John Bowman Date: Thu Jul 19 14:52:25 2018 -0600 Simplify build script. commit 779b1b60d7b7fcfa35d48a946fa421db1be54a82 Author: Supakorn Rassameemasmuang Date: Thu Jul 19 14:37:25 2018 -0600 Only write transformation if the rest of transf is not Id. commit 63f054012ad1716c8c0de04521ac0e66b81afadb Author: John Bowman Date: Thu Jul 19 14:28:51 2018 -0600 Remove 'x' key prefix. commit 0e351c95efca60034ec5d9397ab7924bf415f6ca Author: John Bowman Date: Thu Jul 19 14:13:42 2018 -0600 Don't apply xmap without an explicit corresponding key. commit a7026b70bb0793696075d53f1a0dd683073acf82 Author: John Bowman Date: Thu Jul 19 14:01:43 2018 -0600 Update xasy documentation. commit 7e9954d1ab1043f03b5082266b1cef7a44091c89 Author: Supakorn Rassameemasmuang Date: Thu Jul 19 13:58:41 2018 -0600 Fix zooming sign inversion. commit bd333b65cf24379797188e00c961cda229727e0e Author: Supakorn Rassameemasmuang Date: Thu Jul 19 13:39:10 2018 -0600 Add zooming on arrow keys. commit 183b47c0f305f829cacaff28222bd1cf40523130 Author: Supakorn Rassameemasmuang Date: Thu Jul 19 13:10:15 2018 -0600 Hook up/down to selection. commit 7a49eda58677c8d26fa8efbd8f946d80ac560c1a Author: John Bowman Date: Wed Jul 18 14:58:59 2018 -0600 Transform directly from asy to image coordinates. commit 65f66b98a91f4dff78c1f6e769005c20b53e926c Author: Supakorn Rassameemasmuang Date: Mon Jul 16 15:01:00 2018 -0600 Disable fill on open curve. commit 98d364235fdf5073c1dcf2f51c478f21e492de56 Author: Supakorn Rassameemasmuang Date: Mon Jul 16 14:26:53 2018 -0600 Fix repeated asyfying. commit 0ad7327a11094d336057f6d21d99e1385e685c6c Author: Supakorn Rassameemasmuang Date: Sun Jul 15 22:30:36 2018 -0600 Fix line shift by xmap. commit 360e165e00f0c304600a2371af6b5ffefeff89f8 Author: Supakorn Rassameemasmuang Date: Sun Jul 15 21:00:02 2018 -0600 Revert venn. commit 42b192057a798825b8e1f5cf0939072cb4f2c116 Author: Supakorn Rassameemasmuang Date: Sun Jul 15 20:58:31 2018 -0600 Only do change of basis if transform is not Id. commit ef89f277409805f8a7e65ba7b735b9ddb9bee93d Author: Supakorn Rassameemasmuang Date: Sun Jul 15 20:49:13 2018 -0600 Fix transf on different basis. commit 76d1e66db7ecc1a550c73326b4ea34e65a2e4630 Author: Supakorn Rassameemasmuang Date: Sun Jul 15 20:40:36 2018 -0600 Fix key load bug. commit 574c0d96364ccbea81810fcda44cff5b68a35dc6 Author: Supakorn Rassameemasmuang Date: Sun Jul 15 20:23:50 2018 -0600 Fix add label not working. commit 7d6cff54d91e978bd700188d09af2e3da1d66ead Author: Supakorn Rassameemasmuang Date: Sun Jul 15 17:20:15 2018 -0600 Force cleanup asy. commit 815e72d73eaa2af714ce157dc8cbc3363ad92cd5 Author: Supakorn Rassameemasmuang Date: Sun Jul 15 17:14:41 2018 -0600 Fix duplicate key problem. commit b85a7d3b9e8ab18806ceb0ef39cc4f983a55f348 Author: John Bowman Date: Sun Jul 15 14:28:34 2018 -0600 Fix array bounds. commit 2c15d93e8ca19ea73ed1fb4186b3b3fc93520050 Author: John Bowman Date: Sun Jul 15 14:28:16 2018 -0600 Remove duplicate option. commit a070e8a6f9e3a3bef91a09fb0b9e192541a2a6bb Author: John Bowman Date: Sun Jul 15 12:33:42 2018 -0600 Force dvisvgm to be silent. commit a8a7fea89b9ad8f7dbd02dac898301cfb0592257 Author: John Bowman Date: Sat Jul 14 11:31:58 2018 -0600 Don't resize 3D pictures. commit c928c92f88c8b3b0942dc9c12bc8244233045e11 Author: John Bowman Date: Sat Jul 14 10:38:34 2018 -0600 Finish xasy port to MSDOS. commit cd700b4bb9db2b80f77aae8a316a99dd3476c7b4 Author: John Bowman Date: Sat Jul 14 10:38:06 2018 -0600 Redirect cerr to cout again when outpipe=2. commit f0bc292dd796329fdd39679b1852a6bff1159335 Author: John Bowman Date: Sat Jul 14 10:34:17 2018 -0600 Fix segmentation fault. commit cfd3121e4a997376e8cebf3ee6c53cac9ed689c5 Author: John Bowman Date: Fri Jul 13 17:06:40 2018 -0600 Add preliminary test of v3d format. commit e1f68286465d275a5677860950e266288ade44a1 Author: John Bowman Date: Thu Jul 12 15:13:59 2018 -0600 Port xasy to MSDOS. commit 7133ef53816e97ddb3b8e0870ffbfba9b95423b7 Author: Supakorn Rassameemasmuang Date: Wed Jul 11 17:05:36 2018 -0600 Enable cycle control points. commit 1c444f8695301ae16bd8beb20778bd7fc14cc9cf Merge: 92d1e7272 93a679de2 Author: John Bowman Date: Wed Jul 11 16:13:33 2018 -0600 Merge branch 'master' of github.com:vectorgraphics/asymptote commit 93a679de2f2902618546bf86884217c4e8da9041 Author: Supakorn Rassameemasmuang Date: Wed Jul 11 16:13:20 2018 -0600 Set line width inversely proportional to mag. commit 92d1e7272842f751bd3952f13efb365e2d100121 Author: John Bowman Date: Wed Jul 11 16:12:30 2018 -0600 Rename config files and commandPalette default keymap. commit cc93cbe1e79774062ab9fd741469c41e39600959 Author: Supakorn Rassameemasmuang Date: Wed Jul 11 16:04:13 2018 -0600 Correctly fixes scaling with zoom. commit afad348e03eaf2e73cd606e4f008d7316bc52627 Merge: 7f2a28a60 ad6faf30e Author: Supakorn Rassameemasmuang Date: Wed Jul 11 16:02:35 2018 -0600 Merge branch 'master' of github.com:vectorgraphics/asymptote commit 7f2a28a6042a401e314b2d865a16d03f02e91687 Author: Supakorn Rassameemasmuang Date: Wed Jul 11 16:02:32 2018 -0600 Make selection scale with magnification. commit ad6faf30e81d3ea2f58c92536b967f8d7491c4e8 Author: John Bowman Date: Wed Jul 11 15:55:52 2018 -0600 Fix spelling. commit 1f383b4b5301c358b4867b692a26a2c3076e6268 Author: Supakorn Rassameemasmuang Date: Wed Jul 11 15:51:31 2018 -0600 Fix typo again. commit 893f7fc2ee2e044395ead6215e1e53f195c8d82a Author: Supakorn Rassameemasmuang Date: Wed Jul 11 15:51:20 2018 -0600 Fix spelling error. commit 38f428fa9fe837bca5a00df56b94dbf2f842c235 Author: Supakorn Rassameemasmuang Date: Wed Jul 11 15:49:34 2018 -0600 Make filename a little more clear. commit a3f98621376f1c45988dff32191e6da5ad1b53b7 Author: Supakorn Rassameemasmuang Date: Wed Jul 11 15:37:32 2018 -0600 Fix segfault again (?). commit ecb5b2db65438e7ba9c626014925ac291f5c1941 Author: Supakorn Rassameemasmuang Date: Wed Jul 11 15:33:59 2018 -0600 Fix segfault (?). commit ab12f523ac4e6e52e312cd66e9f869c762779e46 Merge: 2d24c9aad feefafd64 Author: Supakorn Rassameemasmuang Date: Wed Jul 11 15:29:04 2018 -0600 Merge in changes. commit feefafd64fdd5abdff99fdbdad523a1687ca34f1 Author: John Bowman Date: Wed Jul 11 13:55:32 2018 -0600 Fix asymptote.spec. commit 935f81064cf10fa83ad49303b0d74ad50cf9856b Author: John Bowman Date: Wed Jul 11 13:49:33 2018 -0600 Fix asymptote.spec. commit e65e004ca8c75e168c6c1ac3a44c609a34754f73 Author: John Bowman Date: Wed Jul 11 13:45:59 2018 -0600 Use install-notexhash for building RPMs. commit bb1cf672f4d99dc1ecdad8826adefd916f1cc9f7 Author: John Bowman Date: Wed Jul 11 12:09:12 2018 -0600 Clean up icons; fix installation problems; port asymptote.py to Python 3. commit 2d24c9aadb12e6a35e7a840b07f20ced68c8e4a6 Author: Supakorn Rassameemasmuang Date: Tue Jul 10 14:34:39 2018 -0600 Remove even more unnessecary code. commit 3cd990f8d5f9bea582c34cb36eaf8da538046ab0 Author: Supakorn Rassameemasmuang Date: Tue Jul 10 14:19:08 2018 -0600 Generate -- instead of.. when using polygon. commit 7edcc2f34fcb7551d23a272d7f1bd0b03d940ee7 Author: John Bowman Date: Tue Jul 10 00:56:06 2018 -0600 Fix duplicate QPainter warning. commit d1dfb2a8af1c4c5a186a5e622cdc2e2fd9c0b90e Author: John Bowman Date: Mon Jul 9 17:29:42 2018 -0600 Reset fileChanged on erase. commit bff496158e93e677e7839e056f5da52129e11e55 Author: Supakorn Rassameemasmuang Date: Mon Jul 9 17:19:43 2018 -0600 Add check before reopening file. commit 2ecb76750fe0ebc120684a076ac3a5b4ab9ce810 Author: John Bowman Date: Sun Jul 8 21:32:22 2018 -0600 Fix asymptote.spec. commit d67ec7242352fd97059022795846394ae36f5cbf Author: John Bowman Date: Sun Jul 8 21:09:06 2018 -0600 Specify python3 explicitly. commit a2f95654b4deb7cbf779e8068090f201aa3468b5 Author: John Bowman Date: Sun Jul 8 20:46:48 2018 -0600 Read in xasy version. commit 94d4cd52647d433b1d13e5a96641c89f07203ebe Merge: de430749d 770eea723 Author: John Bowman Date: Sun Jul 8 17:06:00 2018 -0600 Merge branch 'qthup'. commit 770eea7237d039ee13b9f4b5adaa4a61e8e9297f Author: John Bowman Date: Sun Jul 8 15:27:45 2018 -0600 Erase canvas before opening new file. commit 6dba36575965266b3783f5a2bde8f5a65ab32451 Author: Supakorn Rassameemasmuang Date: Sun Jul 8 13:06:47 2018 -0600 Automatically determine recomputation mode. commit 869d617084192cf799f0ec033b9ea31f74d6e07a Author: Supakorn Rassameemasmuang Date: Sun Jul 8 12:59:14 2018 -0600 Preserve Edit Bezier Mode. commit e8bc45d003f489ccc50fc4461aa19d56da314421 Author: Supakorn Rassameemasmuang Date: Sun Jul 8 12:55:02 2018 -0600 Update .gitignore commit eed85abcd5e3c2347d4ad1ab86a3d8e550cd3f72 Author: John Bowman Date: Sun Jul 8 12:40:09 2018 -0600 Improve informational messages. commit d5de0e972bf7242d2572c2a5a7ff0ded40f85a1e Author: John Bowman Date: Sun Jul 8 11:08:24 2018 -0600 Remove unused code. commit 63be5fe78ea461d3350277799528a78d01069189 Author: John Bowman Date: Sun Jul 8 11:01:25 2018 -0600 Standardize labels. commit 618439764c892c9b9b3b0ecbfc52358d3e0a2646 Author: John Bowman Date: Sun Jul 8 02:39:58 2018 -0600 Add missing actions; remove obsolete code; adjust layout. commit c2a3daa2e8a95ce104f7a8d828a4237274bd0188 Author: John Bowman Date: Sun Jul 8 00:11:27 2018 -0600 Add remaining icons. commit 2f894a654d48bf5479331dfb7b176605b8df0eb5 Author: John Bowman Date: Sat Jul 7 17:30:04 2018 -0600 Add fill bucket icons. commit ae34291ff7f91f19a5b29e8d145600096c1d186f Author: John Bowman Date: Sat Jul 7 10:49:30 2018 -0600 Rerender only when dpi exceeds previous maximum dpi. commit 326766200c3deffe4392d737a92dadbf9591b0d3 Author: John Bowman Date: Fri Jul 6 16:38:38 2018 -0600 Fix clip flag. commit 1797d5f89eaa554d94d34d908e86858ae0d0fdb9 Author: John Bowman Date: Fri Jul 6 16:29:02 2018 -0600 Make rsvg-convert read directly from file. commit 4fdad9b276f93f32164d1ff4da30164720e97b11 Author: John Bowman Date: Fri Jul 6 15:54:11 2018 -0600 Remove unused code. commit cde402ba0d3a491f235b75390fa6232d019eaada Author: Supakorn Rassameemasmuang Date: Fri Jul 6 15:47:13 2018 -0600 Switch from cairo to rsvg. commit 365189781fe14a3b74662a24d7c37424648893f2 Author: Supakorn Rassameemasmuang Date: Fri Jul 6 15:16:39 2018 -0600 Reset current position when click. commit 8d89b3ad95c45507ab958eee08e50cb7a71d6de1 Author: Supakorn Rassameemasmuang Date: Fri Jul 6 14:25:35 2018 -0600 Add more icons. commit e52e4040874c315a50baeaee22858527197e758e Author: Supakorn Rassameemasmuang Date: Thu Jul 5 21:02:59 2018 -0600 Fix recenter not recognizing magnification. commit 54ad8477ed4821a59a8cd08eac741554152f124e Author: Supakorn Rassameemasmuang Date: Thu Jul 5 20:53:48 2018 -0600 Fix zooming transform. commit 9f52c34396577ced844734728ac67278ea2dd21e Author: John Bowman Date: Thu Jul 5 17:18:41 2018 -0600 Fix tooltips. commit c961cabc5ec05e7b0475d54557f298feae6b8dca Author: Supakorn Rassameemasmuang Date: Thu Jul 5 17:00:26 2018 -0600 Remove add widget upon addmode deletion. commit 8543e26542f78f2d334b0eb6580d80cca3bca45e Author: Supakorn Rassameemasmuang Date: Thu Jul 5 16:55:29 2018 -0600 Add remaining icons. commit 2ac5c23f2e1b32103ab49eae7b6797aaa5017512 Author: Supakorn Rassameemasmuang Date: Thu Jul 5 15:32:49 2018 -0600 Enable pan-sensitive zooming. commit bf3cc0b9f763f4bf40cdc569db4d61d3f96a4f35 Author: Supakorn Rassameemasmuang Date: Thu Jul 5 14:51:07 2018 -0600 Enables math mode detection in label. commit b8c2663e0fa1f0b0dc4c6cf41aec6af7aa9cc89e Author: Supakorn Rassameemasmuang Date: Thu Jul 5 14:34:54 2018 -0600 Add centering pan. commit 388907330408dae455768900739219e4a9b3b42f Author: Supakorn Rassameemasmuang Date: Thu Jul 5 13:48:16 2018 -0600 Add svg files. commit 7e9efcd61dcbe7cd0f45f437610e376fa9b4e2f3 Author: John Bowman Date: Wed Jul 4 19:36:24 2018 -0600 Add index entries integral and integration. commit 405ee9a7bc6eb61e0268fc23177eacbcf6563154 Author: Supakorn Date: Tue Jul 3 23:40:02 2018 -0600 Enable centering pan option. commit 046b50a837798f4fa406adb434e2794f5c260a5f Author: Supakorn Date: Tue Jul 3 23:33:57 2018 -0600 Add fuzz to small bounding boxes. commit 15e7d80a69049825de0a8e0c5f88e0aac2076462 Author: Supakorn Date: Tue Jul 3 23:24:57 2018 -0600 Copy text to advanced editor. commit ddc3fd7c15507fa42a9aea8ef0ea4a5d95776b6c Author: John Bowman Date: Tue Jul 3 16:40:36 2018 -0600 Improve and enable Cairo clip-path bug workaround. commit af49fa9dd676f2453ed65aefe6fa6106eab2de9e Author: Supakorn Date: Tue Jul 3 15:08:38 2018 -0600 Round points to 10e6 precision. commit a1086f1f2141a0ed5ca1ee23c0c982cca50d0a50 Author: Supakorn Date: Tue Jul 3 14:58:15 2018 -0600 Add fontsize for label. commit ccc3b79d26559b18d86a95e5bcf02478c1051f33 Author: Supakorn Date: Tue Jul 3 14:24:51 2018 -0600 Enable removal of unneeded clips. commit b6a25e25e9f586a39d9af6b287b0373a4b703dd1 Author: Supakorn Date: Tue Jul 3 14:01:18 2018 -0600 Remove unnessecary braces from label editor. commit b0b8525c6e71cb2643e0c3a96aaea35f2df6ed1d Author: Supakorn Date: Tue Jul 3 13:57:46 2018 -0600 Improve scaling on small labels. commit d21d7c005dee4968a3af58a1de68bb26e0e4ead6 Author: Supakorn Date: Mon Jul 2 15:21:02 2018 -0600 Only insert non-identity keys. commit bd259097ea0c45835110d7d627a0eea174c0d38a Author: Supakorn Date: Mon Jul 2 14:59:31 2018 -0600 Fix label location and more QoL improvments. commit a8c22de51d598fff1b008b8b89ae702d8e0dfd15 Author: John Bowman Date: Mon Jul 2 11:35:44 2018 -0600 Switch xmap to asy coordinates. commit 9ec81262cff36972c91e523dfdc0fdc5a529e3c5 Author: John Bowman Date: Mon Jul 2 08:52:24 2018 -0600 Fix comment. commit 5a0588a23082a406cd718a71c6267d78cb9b4a0b Author: John Bowman Date: Sun Jul 1 21:33:03 2018 -0600 Fix missing KEYs. commit 89ecbf116ccee69453179cdab48b0b633a5ff8bb Merge: 4463b94c5 67c86cd41 Author: John Bowman Date: Sun Jul 1 19:08:33 2018 -0600 Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup commit 4463b94c5c887de3f8c1f269c33d2bc60dfa1979 Author: John Bowman Date: Sun Jul 1 17:12:32 2018 -0600 Resize to initial xasy transform. commit 67c86cd4113f13b275c87d890f5ab48f457808a7 Author: Supakorn Rassameemasmuang Date: Sun Jul 1 14:11:25 2018 -0600 Should fix key not writing. commit 716f8065bfb6d5ce0f0b52f3956df0f92787bb99 Author: John Bowman Date: Sun Jul 1 10:38:24 2018 -0600 Make SaveAs default to current directory. Add Save action. commit 9763a3e172d35b1cb7c093695fcaededd29ca391 Author: John Bowman Date: Sun Jul 1 10:38:24 2018 -0600 Make SaveAs default to current directory. Add Save action. commit 7a2ff7f7017abf753579216bfa1ecd4b429e6576 Author: John Bowman Date: Sun Jul 1 02:52:17 2018 -0600 Handle empty objects. commit 1f35ec3deb126f3e3d4e4b7bbea823336ecd958e Author: John Bowman Date: Sun Jul 1 02:43:25 2018 -0600 Remove obsolete redirection. commit 81d9ab652ce2eb7fb052d0a96f9ea63acc55d21a Author: John Bowman Date: Sun Jul 1 02:39:26 2018 -0600 Update bsp. commit 44ba3d7a149ff97144335ef13a53741a51107272 Author: John Bowman Date: Sun Jul 1 02:30:33 2018 -0600 Handle null simplex problems. commit 943110ab88bb0af227c85cc906777908876888c0 Author: Supakorn Rassameemasmuang Date: Sat Jun 30 21:10:45 2018 -0600 More QoL fixes. commit 6701d59cda39aba6ac5e228401e31b8e2879ab91 Author: Supakorn Rassameemasmuang Date: Sat Jun 30 21:07:07 2018 -0600 Delete Icon commit 5077b81969160b377b0af26f711350531ef19edf Author: Supakorn Rassameemasmuang Date: Sat Jun 30 21:06:59 2018 -0600 Delete Icon commit 97f26873569db365d0f9e5127d362580bbcdabb3 Author: Supakorn Rassameemasmuang Date: Sat Jun 30 21:06:50 2018 -0600 Delete Icon commit be93a35d25f89a4ca801527912a6b21bb24759bb Author: John Bowman Date: Sat Jun 30 20:16:41 2018 -0600 Suppress dvisvgm warnings; use dvisvgm --pdf when available. commit 3bbab66ea27fe2aeecca64b53abd150ab787dee1 Author: John Bowman Date: Sat Jun 30 18:22:54 2018 -0600 Use direct conversion to svg for proper bounding box. commit 92d74369e228512b2270616f79562741856e0b85 Merge: ea4fed159 25fab6554 Author: John Bowman Date: Sat Jun 30 15:42:20 2018 -0600 Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup commit 25fab655437d0128451bae9506d15052fb9a2394 Author: Supakorn Date: Sat Jun 30 14:39:58 2018 -0600 Enable right clicking for ending curve. commit c911d8acd1eb4bb21c452838f3ee7249c80b0e63 Author: Supakorn Date: Sat Jun 30 13:53:16 2018 -0600 Fix Undo/Redo buttons not consistent. commit 11ba4c2c0bcd2938aea757afc10ea5056745f2e4 Author: Supakorn Date: Sat Jun 30 13:48:32 2018 -0600 Update mouse coordinate label unconditionally. commit f92a2da0266970f12e785e07f27a4add2f067850 Author: Supakorn Date: Sat Jun 30 13:45:06 2018 -0600 Hide anchor when not using custom anchor. commit ea4fed159acd44095bce42fc306e64550a42eac6 Author: John Bowman Date: Sat Jun 30 12:30:59 2018 -0600 Remove obsolete code. commit bdb83475c13af0e41909f97af0389148757558b0 Author: John Bowman Date: Sat Jun 30 09:46:40 2018 -0600 Rename _fout to _outpipe and move declaration to plain_shipout.asy. commit 2d49cb19dbbbd5cac38260a32c2df75cd4d2fd10 Author: Supakorn Date: Fri Jun 29 22:21:51 2018 -0600 Fix bezier edit not resetting. commit ede9f4906ed0c82e39833f9d57562c3c9c8b6d25 Author: Supakorn Date: Fri Jun 29 22:08:11 2018 -0600 Save file with asy coords. commit 79c2ce6d847f470760faa70fd5a2e211dcfd5033 Merge: f0d35d4fb 731251c73 Author: Supakorn Date: Fri Jun 29 21:57:28 2018 -0600 Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup commit 731251c7301c1f65f4daa50e75e69aec75a150a1 Author: John Bowman Date: Fri Jun 29 18:32:13 2018 -0600 Use ctrl-D to terminate xasy-to-asy communication. commit f0d35d4fbbf46572baf776b2667e7856c87c8d25 Author: Supakorn Date: Fri Jun 29 17:39:53 2018 -0600 Fix key count missing. commit 14a9a432836617d7282cd6f4aff7b7bb883d35dd Author: Supakorn Date: Fri Jun 29 17:35:49 2018 -0600 Other QoL improvements. commit a8c22c228fdd82347c55a260b38a56ca97d26159 Author: Supakorn Date: Fri Jun 29 17:12:35 2018 -0600 Save file as asy coords instead of postscript. commit 21981780fa0e5237b1b92b7ec39ac8da8f8711ea Author: Supakorn Date: Thu Jun 28 15:45:55 2018 -0600 Add option for editing settings. commit 00347340d591d11e386bf42eadc3496b5d5b2b53 Author: Supakorn Date: Thu Jun 28 15:06:10 2018 -0600 Add experimental antialiasing (may not work at all). commit 36df0f26c942fa3aa994541b6e6c0fdc2748eef0 Author: Supakorn Date: Thu Jun 28 14:33:37 2018 -0600 Add legacy xasy bezier mode. commit 905f58f2c64703371a72641d78465179671c919a Author: Supakorn Date: Thu Jun 28 14:07:24 2018 -0600 Fix cairo dpi bug. commit f2601b75e126b6ee659b75cdd78f12d369d51b7a Author: Supakorn Date: Thu Jun 28 13:53:02 2018 -0600 Make the default linewidth 0.5. commit de430749dfa385b81ad457ed8a3390dad28cf952 Author: John Bowman Date: Thu Jun 28 12:46:35 2018 -0600 Avoid modifying input arrays in rationalSimplex.asy. commit 06aee1b86106f39835889a72a2248ab7c02d3cd7 Author: John Bowman Date: Thu Jun 28 12:45:39 2018 -0600 Overload operator !=. commit 1e39a91779ea25645acb1f6fc20f2b1480e5c8e7 Author: John Bowman Date: Thu Jun 28 11:22:33 2018 -0600 Avoid modifying input arrays. commit ee333cb2e837962b26305dc9e65e306e232c9d3f Author: Supakorn Date: Wed Jun 27 17:30:26 2018 -0600 Add workaround for bounding box flip. commit 6e91ddbe19f4b01649b33dfb4a05c36e029f57a6 Author: Supakorn Date: Wed Jun 27 17:20:51 2018 -0600 Change clip detection to asy. commit 1dedb3885815058ee3067f6402529b6b93a4e0a7 Author: John Bowman Date: Wed Jun 27 16:57:25 2018 -0600 Detect clip; invert images. commit 1b55335147fc4eebe9676c864c9e5e2937c57d67 Author: Supakorn Date: Wed Jun 27 16:28:25 2018 -0600 Enable DPI checking for magnification. commit bfbfafbc406d8e93166468f1058e57a8a7891086 Author: Supakorn Date: Wed Jun 27 13:14:17 2018 -0600 Add custom dpi support. commit b1d540c919da0ec7cb53616e22f84f3de723f997 Author: Supakorn Date: Wed Jun 27 12:43:26 2018 -0600 Add temporary workaround for svg noclip. commit 6c12f7777edb0a2064ae206ea37661461e96a0ec Author: Supakorn Date: Wed Jun 27 02:08:51 2018 -0600 Remove debug messages. commit 999210c14c41ba6737ea31fa03a7c7e003940997 Author: Supakorn Date: Wed Jun 27 02:07:47 2018 -0600 Add svg support dependent on QtSvg. commit 19efab230370f14552d1d17930dd33373f59220d Merge: 96031ea26 50fb809fd Author: John Bowman Date: Wed Jun 27 00:19:54 2018 -0600 Merge branch 'master' into qthup. commit 50fb809fdaf2383385f09884174262964a046156 Author: John Bowman Date: Wed Jun 27 00:17:35 2018 -0600 Use system ghostscript library by default for dvisvgm. commit 96031ea2614dee2a470525ba87d921fbe0291056 Author: John Bowman Date: Tue Jun 26 17:56:19 2018 -0600 Deconstruct to svg format. commit f07fc294bfcf278d72c4cbe14ee95b9c13e22768 Author: Supakorn Date: Tue Jun 26 15:23:09 2018 -0600 Add scrolling functionality. commit c27d0994645a395185aad3cdeb85579e830f45c0 Author: Supakorn Date: Tue Jun 26 13:50:31 2018 -0600 Terminate asy on exit. commit e1f540d4a86fc432b091cff538703a4e2d1eb180 Author: Supakorn Date: Mon Jun 25 17:37:55 2018 -0600 No longer uses asy for zoom. commit a13447f744ec9677e62e5ec09626ec84865068c8 Author: Supakorn Date: Mon Jun 25 16:49:42 2018 -0600 Fix Custom Anchor inconsistency. commit 91c0c648ea8e2384be530380836edd6a0fc563ae Author: Supakorn Date: Mon Jun 25 14:37:10 2018 -0600 Add undo for object creation. commit 4fe6ebb5f7b263aa97358a11d9f24d5f0c6432ac Author: Supakorn Date: Mon Jun 25 12:52:11 2018 -0600 Add Scale mode to bezier editing. commit 0c1a59da64db42d1d961210f9e464cab24ebd6b9 Merge: 4b55a5971 cf2e8c9df Author: Supakorn Date: Mon Jun 25 12:12:57 2018 -0600 Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup commit 4b55a597110461af90b9082a8e1a1caa1dd40b7b Author: Supakorn Date: Mon Jun 25 12:12:54 2018 -0600 More QoL improvements for bezier editor. commit db447ef6ae109bd7c6f3f6b8c74d0513fec7969d Author: Supakorn Date: Mon Jun 25 12:12:43 2018 -0600 Simplify string management. commit cf2e8c9df1b1665b48b85815028b8990d2cc97f3 Merge: 5e612b5dc b757219e2 Author: John Bowman Date: Mon Jun 25 11:19:56 2018 -0600 Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup commit 5e612b5dc66928fa4c9f5152e3a47d3544ed1196 Author: John Bowman Date: Mon Jun 25 11:19:51 2018 -0600 Remove unused prompt. commit b757219e235127134448516c47ad3104e86dc100 Merge: f01a9f115 aa4ee7b78 Author: Supakorn Date: Mon Jun 25 11:03:26 2018 -0600 Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup. commit f01a9f11564532c05d21ac131d4ada7bfff723e1 Author: Supakorn Date: Mon Jun 25 11:00:26 2018 -0600 Change spacing to one for each object. commit aa4ee7b78186e49b35a3a1ed0417f2695be88c1a Author: Supakorn Rassameemasmuang Date: Sat Jun 23 16:11:02 2018 -0600 Delete unneeded files. commit bf52e9ef5c6b2d2bfc34b7f4a3d86d9e4895a6b5 Author: Supakorn Rassameemasmuang Date: Sat Jun 23 16:10:54 2018 -0600 Add early bezier editing mode button. commit 92c3d17e2a059014ddb13ce8ef50a626f396bfe7 Author: Supakorn Rassameemasmuang Date: Sat Jun 23 16:10:25 2018 -0600 Add setup.py file. commit 068d75ce11365caf064cc5e2c8a76e7a3c7a15bf Author: Supakorn Rassameemasmuang Date: Sat Jun 23 15:24:24 2018 -0600 Edit some build files. commit 8f7217ac8df4d721127b6f7487874396f5843c6f Author: Supakorn Rassameemasmuang Date: Sat Jun 23 15:24:15 2018 -0600 Add icon files for easier editing. commit e70d99640450c984344c605a35dae157a58ed264 Author: John Bowman Date: Sat Jun 23 01:33:36 2018 -0600 Remove bounding box in example until xasy support is implemented. commit 3abe5e672a6f9255f382a09b16ed1ee29769ccdd Author: John Bowman Date: Sat Jun 23 01:21:36 2018 -0600 Detect xasy with settings.xasy; reinstate bounding box in example. commit 401cf60f89dcddfb6993f7bd25a86b144ec5f3ad Author: John Bowman Date: Sat Jun 23 00:33:18 2018 -0600 Replace restricted simplex method with general simplex solver. commit 77c3c2bbc8496a1b53bf3b0e5af27501be05b50c Author: John Bowman Date: Fri Jun 22 16:48:33 2018 -0600 Fix xasy mode and keys. commit 0e31fa8c29737941d559bf4e42162212f5f85bb5 Merge: 10d301318 60a35767c Author: John Bowman Date: Fri Jun 22 15:04:58 2018 -0600 Merge branch 'master' into qthup. commit 5ff20563472ab9361826bea32cd4a2635a346550 Author: John Bowman Date: Fri Jun 22 14:53:17 2018 -0600 Force make clean to remove GSL symbols. commit 10d30131851c3e8936f4c0fe62097d6dccaa3b64 Author: Supakorn Date: Fri Jun 22 13:59:59 2018 -0600 Allow for new key replacement. commit febc76cb94e3de54b8f3d01da29f6eb71bf76e25 Merge: 8aeec7ce7 69aaf4fca Author: John Bowman Date: Fri Jun 22 11:36:36 2018 -0600 Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup commit 8aeec7ce7debb2469d2e21efd237123e9943c3b6 Author: John Bowman Date: Fri Jun 22 11:09:14 2018 -0600 Implement interactive xasy mode. commit 728f50856129f4cdcc8f2d30b253aeee243ed6ac Author: John Bowman Date: Fri Jun 22 08:31:54 2018 -0600 Test new xasy mode. commit 69aaf4fca1d01254a43d78b9bed4755990c052a7 Author: Supakorn Date: Thu Jun 21 22:47:48 2018 -0600 Add more bezier editing features. commit a890ec75dd31b8aacc4adcea8f138fafe0b9d504 Author: Supakorn Date: Thu Jun 21 16:51:19 2018 -0600 Add control point editing. commit 7ce567731e2eab843ef2ea5789435d82dc65c69c Author: Supakorn Date: Thu Jun 21 16:26:57 2018 -0600 Allow saving of edited beziers. commit 60a35767c5becaf6f8a5fcd72584a9d3d316b028 Author: John Bowman Date: Thu Jun 21 00:42:08 2018 -0600 Force dvips to respect EPS requirements. commit d36d513b7e060ad476208f2ab9552b4323c45a05 Author: Supakorn Rassameemasmuang Date: Wed Jun 20 15:49:30 2018 -0600 Add early bezier editing. commit b2c25d8ae46ce3ccf9c5e9689dc682ec647780ab Author: John Bowman Date: Tue Jun 19 13:13:49 2018 -0600 Update keydata. commit c6b4d4b1ef81305d4973e3848673f2a77e476c4c Author: John Bowman Date: Tue Jun 19 11:20:11 2018 -0600 Add a flag to identify a user-specified key. commit 88de674b7daeb9efc3e59a1300e4cd3928f22ceb Merge: 3040e29d1 743937250 Author: John Bowman Date: Mon Jun 18 23:41:42 2018 -0600 Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup commit 743937250a7c67dc414ddbd60ee8e2f59c62147d Author: John Bowman Date: Mon Jun 18 23:41:30 2018 -0600 Revert to using interactive mode for xasy. commit 0f044019bdc7c7947c6f58db9ba7d34703c49048 Author: Supakorn Rassameemasmuang Date: Mon Jun 18 23:24:59 2018 -0600 Remove unnessecary icon residues. commit 3040e29d15c97e526faeba5bbbad00f1ec436c17 Author: John Bowman Date: Mon Jun 18 17:05:05 2018 -0600 Revert "Remove obsolete code." This reverts commit 28e91cfec416a135e1a9ba5a32486507e59bf5ec. commit 97ab025569e6cc765d7c4f88a96e49f2628d2930 Author: Supakorn Rassameemasmuang Date: Mon Jun 18 15:21:37 2018 -0600 Unify asymptote process. commit 5e2123d1358e2e34a3149d3d281365c2e43c8dec Author: Supakorn Rassameemasmuang Date: Mon Jun 18 13:37:01 2018 -0600 Add initial bezier curve detailed view. commit c049ce0c2f21c4c9eb86ffaa7bb5b6b163cbc0a8 Merge: e4a169a5a 9d0f460a2 Author: Supakorn Rassameemasmuang Date: Mon Jun 18 12:50:47 2018 -0600 Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup commit e4a169a5a79b7e6499b61ecc852551246a38869e Author: Supakorn Rassameemasmuang Date: Mon Jun 18 12:45:44 2018 -0600 Fix moveMove. commit 9d0f460a251cbad4a2a5ebebf33ebc68633ffcac Author: John Bowman Date: Fri Jun 15 18:25:34 2018 -0600 Fix mouse interaction. commit 3f6584a1fe2f71c754f2e5b8f34f1f2db9b81f24 Author: Supakorn Rassameemasmuang Date: Fri Jun 15 16:44:55 2018 -0600 Minor type hinting. commit 91410b0bb179411ca1245f3f82056f1b4e3eae0f Author: Supakorn Rassameemasmuang Date: Fri Jun 15 16:18:28 2018 -0600 Move export option to menu. commit 8be30f41855c222604a20e771b16d737e907c279 Author: Supakorn Rassameemasmuang Date: Fri Jun 15 15:02:19 2018 -0600 Set fill to disable open buttons. commit 8369f1d2552ca0739444b071804c55d4930d497b Author: Supakorn Rassameemasmuang Date: Fri Jun 15 14:55:46 2018 -0600 Add More modes. commit 2feb57922220320c2167f42cb6194b6fb4daaea6 Author: Supakorn Rassameemasmuang Date: Fri Jun 15 14:21:27 2018 -0600 Fix labels adding. commit fa522058317c2a685b4983dc243319c6a87b33a5 Author: Supakorn Rassameemasmuang Date: Fri Jun 15 13:33:47 2018 -0600 Fix anchor not updating. commit 1fc16f12cabf5a3cec16a6899676b5fd1ead61f0 Author: Supakorn Rassameemasmuang Date: Thu Jun 14 17:52:09 2018 -0600 Add custom anchor. commit bbfb89044d5e4b2e8d5d86e1bddac594e35e72ad Author: Supakorn Rassameemasmuang Date: Thu Jun 14 17:04:12 2018 -0600 Check for mouse down first. commit 6fb39b6dac1ea61f053d98273cf1dd11e984f74a Author: Supakorn Rassameemasmuang Date: Thu Jun 14 16:53:04 2018 -0600 Add hover delete. commit c106bffce3b1c034a251b6a53745b16ddb7bc431 Author: Supakorn Rassameemasmuang Date: Thu Jun 14 16:46:27 2018 -0600 Add hover deletion. commit 2cffe89eaff1b30b797dac3e267b65c60cca94c8 Author: Supakorn Rassameemasmuang Date: Thu Jun 14 16:34:51 2018 -0600 Even more xasy changes. commit ad33e4b69f848af0e4cbaaacfe81b9006a3fd5cb Author: Supakorn Rassameemasmuang Date: Thu Jun 14 15:44:47 2018 -0600 Recompute control points for all nodes. commit 01ac796f6a9ff2ae89622e3faa050c8bcb386549 Author: Supakorn Rassameemasmuang Date: Thu Jun 14 14:04:53 2018 -0600 Other minor bug changes. commit eeba4902c2fc1425351d6a53bd129c67c616fb6c Author: Supakorn Rassameemasmuang Date: Thu Jun 14 13:39:15 2018 -0600 Add more anchor mode. commit 6df104d6060fe5400e9d7618462026f11767bbd8 Author: Supakorn Rassameemasmuang Date: Wed Jun 13 18:13:56 2018 -0600 Add support for hard deletion undo. commit 100ac43d7b9d762e7c5f2b732f7fb47529e666b2 Author: Supakorn Rassameemasmuang Date: Wed Jun 13 16:57:17 2018 -0600 Remove closed path option. commit 0c2b40391218e0923f145d50aacc834fd575fde5 Author: Supakorn Rassameemasmuang Date: Wed Jun 13 16:45:00 2018 -0600 Add some bezier keymaps. commit d6c70960f272c439d6f8e2220e12756194878875 Author: Supakorn Rassameemasmuang Date: Wed Jun 13 15:55:39 2018 -0600 Make code objects a little more informative. commit 86b8a207600a33d509002f6cae016e5551316e53 Author: Supakorn Rassameemasmuang Date: Wed Jun 13 15:42:35 2018 -0600 Update Editor argument system. commit ddb1a2c604eacd69509685e228d4e487ffe48a4e Author: Supakorn Rassameemasmuang Date: Wed Jun 13 15:05:20 2018 -0600 Restore venn. commit c74ca307377f24073973137830bfbb064125ee67 Author: Supakorn Rassameemasmuang Date: Wed Jun 13 15:05:00 2018 -0600 Put back shipout. commit 19e31f55e7f12bcee0b584d21d47e3e4b3e52243 Author: Supakorn Rassameemasmuang Date: Wed Jun 13 15:04:22 2018 -0600 Change arguments to old xasy. commit c8d73f5f33c4c94ccee4397a876906c8eb1558cf Author: Supakorn Rassameemasmuang Date: Wed Jun 13 14:52:33 2018 -0600 Bind delete to delete object. commit b9f5e41419d978c5084870beed3efa21a2a9e09d Author: Supakorn Rassameemasmuang Date: Wed Jun 13 14:43:10 2018 -0600 Update .gitignore commit 9d59dca9b470251e336d63f6df7fa7a2d64603f9 Author: Supakorn Rassameemasmuang Date: Wed Jun 13 14:42:26 2018 -0600 Revamp options system. commit c2827f039043d9077aed43d15604d451a0f79b81 Author: Supakorn Rassameemasmuang Date: Tue Jun 12 22:51:09 2018 -0600 Change deletion mode. commit bd6d4cf68a80d4e335274b2caa32f7045f7591c0 Author: John Bowman Date: Tue Jun 12 16:59:37 2018 -0600 Omit deleted objects on deconstruction. commit 8fcb2b769bf595380360ad7a3aebe1680da53ef1 Author: John Bowman Date: Tue Jun 12 15:37:58 2018 -0600 Ignore EINTR on read from pipe. commit 97f7d0ca87d4d2db1c522a59532cc2b0f7758630 Author: Supakorn Rassameemasmuang Date: Mon Jun 11 18:16:23 2018 -0600 Optimize deletion and options. commit 5a7a08e173fff7a77727aa3236b323a5069c2af3 Author: Supakorn Rassameemasmuang Date: Mon Jun 11 16:39:36 2018 -0600 Add CSON support and basic deletion. commit c639a6b9b0142e5bea61d087a9c22a7eb38bb335 Author: John Bowman Date: Sat Jun 9 13:33:22 2018 -0600 Update three and slide modules. commit ae8f7b0bc3a001fb6dc8a72598f4342979117eb8 Merge: 6cb432ef3 de2c27e04 Author: John Bowman Date: Fri Jun 8 22:23:39 2018 -0600 Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup commit 6cb432ef307bb52184196bc95a386f960a392aa5 Author: John Bowman Date: Fri Jun 8 22:23:32 2018 -0600 Rename map to xmap. commit de2c27e042780e860e4848995241484b2c255602 Author: Supakorn Rassameemasmuang Date: Fri Jun 8 22:15:53 2018 -0600 Allow for top-layer draw for selected objects. commit 55b9c779cf36d7757eb145f2028bb8c328a4ce1e Author: Supakorn Rassameemasmuang Date: Fri Jun 8 17:25:34 2018 -0600 Add map/xmap switching and key counter. commit f54e57e5b8a05da8ddfa1b5a8eb4aa1f939768f9 Author: Supakorn Rassameemasmuang Date: Fri Jun 8 16:42:57 2018 -0600 Add mouse wheel selection modifying. commit 01db5e39b2969fb10142a3b9b9e90c1a9f8826d5 Author: John Bowman Date: Fri Jun 8 15:15:10 2018 -0600 Add identity and zero transform constants. commit 9b065e65c5b42b9fb0aba00ff2874e92d2ae368f Author: John Bowman Date: Fri Jun 8 14:38:16 2018 -0600 Implement RGB(int,int,int) function. commit e3dc24a6810bf35c7a5ae1fb176961b873ed92fd Author: John Bowman Date: Thu Jun 7 21:42:37 2018 -0600 Renenable object deletion. commit 018e17a2e1caeec6552eefd94737b1e24715ee5f Merge: 7b06be2c7 594473ef6 Author: John Bowman Date: Thu Jun 7 21:20:50 2018 -0600 Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup. commit 7b06be2c7e0334081b5540e80e29248afa81cfd3 Author: John Bowman Date: Thu Jun 7 21:20:44 2018 -0600 Support bbox in xasy mode again. commit 594473ef65e616be969e0e212f7c24b201c9aec2 Author: Supakorn Rassameemasmuang Date: Thu Jun 7 14:28:38 2018 -0600 Remove writing of identity transformations. commit dab676e5a6d8182e8958e8d705ce01f90d542d6f Author: John Bowman Date: Wed Jun 6 21:03:56 2018 -0600 Fix KEY order. commit b2197a0e1c094e16b7d06c5cd1492b5898af57ac Author: John Bowman Date: Wed Jun 6 19:16:34 2018 -0600 Remove unwanted spaces. commit 7cef83b715c5dca65178b6f64c717a066c45f981 Author: Supakorn Rassameemasmuang Date: Wed Jun 6 16:25:50 2018 -0600 Cleanup code and add terminal option. commit 027cfb6ebdeeb4af66567a06d2490ce3ae506d27 Author: Supakorn Rassameemasmuang Date: Wed Jun 6 15:42:35 2018 -0600 Change mapping behavior when save. commit 356ec304168863f178e37314cbcca272d8eb3f0e Author: John Bowman Date: Wed Jun 6 14:21:32 2018 -0600 Add default transform to map. commit 9f4c4c60239faa7da04fa177f5dd5e3ec97974a5 Author: John Bowman Date: Wed Jun 6 14:04:12 2018 -0600 Draw xasy objects onto currentpicture in PostScript coordinates. commit 0645b41d5f88085b16f0ba1814e85dd60dce445c Author: John Bowman Date: Wed Jun 6 11:04:22 2018 -0600 Draw xasy objects on a separate frame. commit 8b006fb0b29c6a9da2ac0bc53c03fdd51223f634 Author: Supakorn Rassameemasmuang Date: Tue Jun 5 17:14:43 2018 -0600 Add support for exporting files and other changes. commit 30bd410fad4be3b71ab26e4eddbc64f39b49773f Author: Supakorn Rassameemasmuang Date: Mon Jun 4 17:26:19 2018 -0600 Add early magnification support. commit 41613fa98512a44487c6b5ac687b88f3852e9102 Author: Supakorn Rassameemasmuang Date: Mon Jun 4 13:44:57 2018 -0600 Fix selection issue. commit 3d1ca05ccaaf934a42df038e5b8c5ab098a299b8 Merge: cf2761953 93f367bba Author: Supakorn Rassameemasmuang Date: Mon Jun 4 13:32:05 2018 -0600 Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup commit cf27619534b2f5eec07fda1ec58110ea2d8c11a9 Author: Supakorn Rassameemasmuang Date: Mon Jun 4 13:31:04 2018 -0600 Move transforms to dict[list] model. commit 93f367bba491d01706e656821ccb748067ad2773 Author: John Bowman Date: Sun Jun 3 20:32:07 2018 -0600 Finish passing KEY to transformed elements. commit 34ce667325ce323de441d0bea58b47c0f05751d2 Author: Supakorn Rassameemasmuang Date: Thu May 31 19:31:45 2018 -0600 Show key in status bar message (for debug). commit 75397a5488c0ec3de9d9d24f75e8479b91cc3a14 Author: Supakorn Rassameemasmuang Date: Thu May 31 19:28:01 2018 -0600 Groups objects with the same key. commit 761e3f3275da938a83c7c2ff4c6cd164dd47b134 Author: John Bowman Date: Thu May 31 17:50:19 2018 -0600 Begin passing KEY to transformed elements. commit 221fda26e204542d88a2df73f4392adbaec29f54 Author: Supakorn Rassameemasmuang Date: Thu May 31 16:49:38 2018 -0600 Fix tuple loading of xasy2asy. commit 771bd937375c8a6888873c0acb68b337bea744f9 Author: Supakorn Rassameemasmuang Date: Thu May 31 14:44:31 2018 -0600 Add more functionality for toggle visibility, code adding. commit 308fceb60033262814b6fa843a46f3580f2a4d02 Author: Supakorn Rassameemasmuang Date: Wed May 30 17:27:51 2018 -0600 Add functionality for delete, change order. commit 0a05fccf9e9035568247d3e628d373d9b245ccc0 Author: Supakorn Rassameemasmuang Date: Wed May 30 16:45:42 2018 -0600 Update add bezier mode and file loading. commit 0b08348102fd6be4c4a2b62945b17c46aeb5f978 Author: John Bowman Date: Tue May 29 13:13:07 2018 -0600 Add key support on asy side. commit aed03a1f8db344aa133b3abd7a7d6a386e6f31f3 Author: Supakorn Rassameemasmuang Date: Tue May 29 11:17:10 2018 -0600 Add more bezier options. commit d10a4f89efc4c3a7cf2552425a19cb62a1861491 Author: Supakorn Rassameemasmuang Date: Mon May 28 16:00:55 2018 -0600 Add in-place bezier curve interface. commit 90f82d4a91d7eabf3e13bd034a95df14cfd85fa9 Author: Supakorn Rassameemasmuang Date: Mon May 28 15:32:19 2018 -0600 Update .gitignore. commit 99155d3edc967ce06cfbd7c6c8d892502b2eee82 Author: Supakorn Rassameemasmuang Date: Mon May 28 12:52:57 2018 -0600 Add filling to circles and polygons. commit d04cac4bf67abb52bde752204d76cecec1f3a422 Merge: c489474da 560f683d7 Author: Supakorn Rassameemasmuang Date: Fri May 25 18:52:52 2018 -0600 Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup commit c489474da753207bad06b414df2a36d41efa62c3 Author: Supakorn Rassameemasmuang Date: Fri May 25 18:52:39 2018 -0600 Modify xasyFillShape for qt. commit 560f683d7d089a25ea21bb9b240f7cb34650d878 Author: John Bowman Date: Fri May 25 17:12:47 2018 -0600 Remove obsolete code. commit 17c40ba170f7c359fd6ae3943b6d2a17b4baffd6 Author: Supakorn Rassameemasmuang Date: Fri May 25 14:44:52 2018 -0600 Fix add shape transform bug. commit ac69fc4d0deab73dbfeef21fb88a6e0007b2fec1 Merge: baf37589e f01b1baf5 Author: John Bowman Date: Fri May 25 14:24:58 2018 -0600 Merge branch 'master' into qthup. commit f01b1baf546ed20bf49e5fd56aac4b43b4a1a5e7 Author: John Bowman Date: Fri May 25 14:24:19 2018 -0600 Fix quiet flag. commit baf37589eed095c896099e7cd51e4dfdc1c916a2 Author: John Bowman Date: Fri May 25 04:27:17 2018 -0600 Fix outpipe communication by turning off quiet mode. commit 4deafa3b4a9368d2a8463917eb009bd29b5d5658 Author: John Bowman Date: Thu May 24 18:09:46 2018 -0600 Handshake via pipe. commit 5016356832b2b5939bd45711ae48b95113f27489 Author: John Bowman Date: Thu May 24 16:58:31 2018 -0600 Clean up initial hand shake. commit f78ac62b79949992271c7f893f559ce4b7b77f39 Author: Supakorn Rassameemasmuang Date: Thu May 24 15:38:44 2018 -0600 Change drawing backend to use ordered lists. commit 4f947b99fe88f5e0fc2fed4b42d73a5f914c2a7e Author: Supakorn Rassameemasmuang Date: Wed May 23 15:06:54 2018 -0600 Manually add back labelEditor changes. commit 0bd402f7ffc30fc1f3dd4979965ced0b36c29499 Author: Supakorn Rassameemasmuang Date: Wed May 23 14:22:59 2018 -0600 Manually merge back xasy2asy.py. commit 5caafee6c63ee66473663038ed2bea655dc304b3 Author: Supakorn Rassameemasmuang Date: Wed May 23 14:02:22 2018 -0600 Add back xasyUtils.py. commit fe3482ec33738e7f6d89fda409082d05f6b585cc Author: Supakorn Rassameemasmuang Date: Wed May 23 12:58:33 2018 -0600 Get xasy to wait for asy to start. commit 82cb3f48c6ed3c81af5d62e870adbc6cda27e9d5 Merge: fb2bd13e3 4425e5c5a Author: John Bowman Date: Wed May 23 11:22:07 2018 -0600 Merge branch 'master' into qthup. commit fb2bd13e326e9a040bc578b533a36f23b64ed33c Author: John Bowman Date: Mon May 21 15:09:11 2018 -0600 Remove obsolete code. commit 2d72f98a9316dc49cd55737e8a9b23fc91d5736d Author: John Bowman Date: Sun May 20 22:27:42 2018 -0600 Implement xasyKEY for 3D objects. commit b137bfb6c542ecc1d0341475511e02b8a67849ff Author: John Bowman Date: Sun May 20 22:17:09 2018 -0600 Fix key generation. commit b3e1dc3c0d5fe2bd19936fe1f25e815c0203d2ba Author: John Bowman Date: Sun May 20 10:57:05 2018 -0600 Simplify code. commit 4425e5c5aca12f87fc3f90151913733f8b771834 Author: John Bowman Date: Sat May 19 23:44:45 2018 -0600 Transition from rpc to tirpc library. commit 1c46c6547e63006cfaa49ad9b70846a12b44ea8e Author: John Bowman Date: Sat May 19 11:36:12 2018 -0600 Inhibit exit on pipe EOF only when inpipe is specified (for xasy). commit 28e91cfec416a135e1a9ba5a32486507e59bf5ec Author: John Bowman Date: Sat May 19 11:26:34 2018 -0600 Remove obsolete code. commit a0b453d97991205a8b9a78b0f44b2aa9c10c63b8 Author: John Bowman Date: Sat May 19 06:00:26 2018 -0600 Simplify code. commit 697537dee813ce9523382e4b44a6941b7d55f091 Author: John Bowman Date: Sat May 19 05:57:49 2018 -0600 Use SIGHUP to signal EOF. commit 8c982663371957021be663d6796bbf0db52317c0 Author: John Bowman Date: Fri May 18 23:48:49 2018 -0600 Use a direct pipe read for xasy instead of interactive mode. commit 6082601320a25abd0a9976550707b9eaf67cf9c6 Author: Supakorn Rassameemasmuang Date: Fri May 18 13:48:29 2018 -0600 Preserve pan translation in resize. commit df4c903e109a9ef2a812605526bb93d118921f03 Author: Supakorn Rassameemasmuang Date: Fri May 18 12:30:34 2018 -0600 Allow for flexible resizing. commit a05bdea1a260b0fe86c46e55731ed561d7f6eaae Author: Supakorn Rassameemasmuang Date: Thu May 17 19:27:54 2018 -0600 Fix a critical output dir bug. commit ff19d78558783ec53ac2ba2aaacd0d3916866dbc Author: Supakorn Rassameemasmuang Date: Thu May 17 17:19:33 2018 -0600 Add early label editor preview. commit 442a81ca4147a98535507b097e38bc587bb34ce4 Author: Supakorn Rassameemasmuang Date: Thu May 17 12:46:59 2018 -0600 Migrate asymptote process engine to a contained class. commit 6a6bb0e1126dd02ac45603a75db1f642570d7c48 Author: Supakorn Rassameemasmuang Date: Thu May 17 12:18:01 2018 -0600 Add early translation foundation. commit 0971e4dd2d12705bf92adff52e326246fa65a4cf Author: Supakorn Rassameemasmuang Date: Wed May 16 15:27:07 2018 -0600 Fix align mode in label widget. commit f698e26621b500d06d46731dc8c9865b06a247c2 Author: Supakorn Rassameemasmuang Date: Wed May 16 14:50:17 2018 -0600 Add advanced label editor. commit d03660d2fbcff4dc1ed48b99ea1353db2c3e1db3 Author: Supakorn Rassameemasmuang Date: Tue May 15 17:34:23 2018 -0600 Optimize string concatenation to use mutable string. commit 46b7b040f0a0d00f99da26718f7d3cc797826e05 Author: Supakorn Rassameemasmuang Date: Tue May 15 16:09:59 2018 -0600 Add early label adding. commit d0860eb41adf13170079ae0f60da21f9f0ea58e4 Author: Supakorn Rassameemasmuang Date: Tue May 15 14:34:03 2018 -0600 Add test label support. commit 14e8314dd7425874f36780e4109626cec2589b72 Author: Supakorn Rassameemasmuang Date: Mon May 14 18:56:13 2018 -0600 Early migration to key-based transform (incomplete). commit cb034388031e39a6e7aeb07f31fb8744a5406b74 Author: Supakorn Rassameemasmuang Date: Fri May 11 16:15:10 2018 -0600 Add argument support. commit 37f670816e7fc8ba23ea041d7ce18ebf16d35d8f Author: John Bowman Date: Fri May 11 14:43:37 2018 -0600 Disable startScript and endScript. commit 436b50fe3b73a5191f0679a9666d899da35697d2 Author: John Bowman Date: Fri May 11 14:41:26 2018 -0600 Revert test code. commit 4acdd9ab9a524ec148c7fa8d75edf3652f354de4 Author: Supakorn Rassameemasmuang Date: Fri May 11 13:51:41 2018 -0600 Update .gitignore. commit 05287cec1a12e77fd35a58a7dc534798add32735 Author: Supakorn Rassameemasmuang Date: Fri May 11 13:51:06 2018 -0600 Remove asydev. commit 872ceac1642c01f3fe9370170bdaee654c1113cc Author: Supakorn Rassameemasmuang Date: Fri May 11 13:50:15 2018 -0600 Update .gitignore. commit de30993530af475d8fde3484d5bbe4f7c1dce339 Author: John Bowman Date: Fri May 11 13:42:44 2018 -0600 Remove unwanted file. commit 198d8589a70618071340969ae76d0c2c9534ea12 Author: John Bowman Date: Fri May 11 00:38:26 2018 -0600 Simplify code; move global variables to processDataStruct. commit f718e5eaaeca1a0938068b0dcfc97af2bc5cc912 Author: Supakorn Rassameemasmuang Date: Thu May 10 16:52:51 2018 -0600 Adding some testing flags. commit fae1d6192b61f3c5a2e5dca553d5b45dd240e030 Author: Supakorn Rassameemasmuang Date: Thu May 10 16:03:15 2018 -0600 Add preliminary trasnform migration to key. commit f0d593d9953ee3fa69f3fee6a2336a56a5cd02e9 Author: Supakorn Rassameemasmuang Date: Thu May 10 15:21:01 2018 -0600 Add basic key recognition. commit 9ebbcfaa7cc3f57d18432ef11c6746569f057754 Author: John Bowman Date: Wed May 9 19:19:01 2018 -0600 Write KEY to outpipe. commit db66c57b242c83541abea7eb0201f87d13a648dc Author: Supakorn Rassameemasmuang Date: Wed May 9 17:34:09 2018 -0600 Add preliminary key support (Still a hot mess...) commit c46f5b3886e0285a5eb535ffa2d3ebf44644dd89 Author: John Bowman Date: Wed May 9 14:44:05 2018 -0600 Add virtual KEY argument to all functions for xasy. commit 0103b665ebdca12c348886c18eafd751fe6901b4 Author: Supakorn Rassameemasmuang Date: Mon May 7 16:35:13 2018 -0600 More Quality of life improvements for color dialog. commit 345ba41986af818577cf60dc61e8aeb26a35bc1b Author: Supakorn Rassameemasmuang Date: Mon May 7 15:30:11 2018 -0600 Update gitignore. commit 67cbfd41508f79b79a91f2fca693e1ec5cdd95e0 Author: Supakorn Rassameemasmuang Date: Mon May 7 15:19:20 2018 -0600 Add pen support. commit ab412a711d8836fb47399fd4380665288502de8f Author: Supakorn Rassameemasmuang Date: Mon May 7 14:52:21 2018 -0600 Add color support. commit b52cf9dc210c9d48fd1d20182d667a11dc013c47 Author: Supakorn Rassameemasmuang Date: Mon May 7 13:26:33 2018 -0600 Fix inscribed polygon mode. commit d86e0ad3ec666f2d0516b97d72c0b5e7710dd3ca Author: Supakorn Rassameemasmuang Date: Fri May 4 18:24:35 2018 -0600 Add preliminary options for Polygon adding. commit 234483ccc8a13b8d318b7d09c3e38dfe353f696f Author: Supakorn Rassameemasmuang Date: Fri May 4 15:27:08 2018 -0600 Update UI for more options. commit 82cdb14e492e428b3e83c3aa489a448f31a8a746 Author: Supakorn Rassameemasmuang Date: Fri May 4 14:56:44 2018 -0600 Add in-place preliminary polygon adding. commit 51bd11364219e7503622704ae297e3f7f0643cac Author: Supakorn Rassameemasmuang Date: Thu May 3 16:39:23 2018 -0600 Add interface for polygon adding. commit 3b1f8f08d7404b2143015468b0b0bcdd51bae93b Author: Supakorn Rassameemasmuang Date: Thu May 3 15:38:11 2018 -0600 Add preliminary in-screen object creation. commit 003d2fa4b41bb1c12c9de1503083267395d4ff5e Author: Supakorn Rassameemasmuang Date: Wed May 2 16:25:43 2018 -0600 Add exscribed (right word?) polygon handling commit 27470ffb04cc5b446e906e327dab976713c94309 Author: Supakorn Rassameemasmuang Date: Wed May 2 15:43:09 2018 -0600 Add support for primtive polygons. commit 34a182db3e5f611f794319ef6c2485594f3487a6 Author: Supakorn Rassameemasmuang Date: Wed May 2 15:10:29 2018 -0600 Add adding circles. commit 8258bb93752a2d888e583f307d13bb4ef727aee6 Merge: 7c18f2ea1 d09e7fce2 Author: John Bowman Date: Wed May 2 08:28:05 2018 -0600 Merge pull request #70 from rgxgr/patch-1 Correct words order to avoid confusing commit d09e7fce20722e2e7d65692b915c4cef9a33bb2c Author: rgxgr <33611071+rgxgr@users.noreply.github.com> Date: Wed May 2 20:08:14 2018 +0800 Correct words order to avoid confusing commit 7f758672b3c9d39707379d030f9d8c7bc33a48cc Author: Supakorn Rassameemasmuang Date: Tue May 1 17:09:33 2018 -0600 Merge settings management into original Shardt code. commit b9754484ce5ef55fb9415731512362615a431778 Merge: 75b227048 7c18f2ea1 Author: John Bowman Date: Tue May 1 12:03:43 2018 -0600 Merge branch 'master' into qt. commit 7c18f2ea15c289fbdd6e4f91c69110f5a0c159b8 Author: John Bowman Date: Sat Apr 28 12:08:11 2018 -0600 Rename i386 to i386_32 to give preference to 64-bit binary. commit 9079934b3424157942736bbe1a15afd1dbf5836c Author: John Bowman Date: Sat Apr 28 11:39:48 2018 -0600 Do not modify system path. commit 799bf2dfc67869606056633c3a8ce4313b45d058 Author: John Bowman Date: Sat Apr 28 11:10:47 2018 -0600 Revert "Workaround NSIS EnvVarUpdate bug that truncates long paths." This reverts commit 8e932eb10a822d4e927b3b9dbecb313e135ee267. commit 8e932eb10a822d4e927b3b9dbecb313e135ee267 Author: John Bowman Date: Fri Apr 27 16:22:08 2018 -0600 Workaround NSIS EnvVarUpdate bug that truncates long paths. commit 21e497260a55dbe4e4b111198aa26115564669ce Author: John Bowman Date: Sat Apr 14 08:31:47 2018 -0600 Fix sort. commit 2bfec3147f4308fa6e206ec624574e3156f43fd2 Author: John Bowman Date: Fri Apr 13 10:11:31 2018 -0600 Add option to use unstable sort in favour of less(T i, T j) ordering. commit 20ff31c0444c901c2b0486127f3c4df2b9832df8 Merge: 1a50ee634 2fd03c669 Author: John Bowman Date: Wed Apr 11 17:51:11 2018 -0600 Merge branch 'master' of github.com:vectorgraphics/asymptote commit 1a50ee634cb58dbb4d9395ba90d7a795e63512d1 Author: John Bowman Date: Wed Apr 11 17:49:52 2018 -0600 Update README commit 2fd03c6695627387db19f993ac93e926b9b63eb7 Author: John Bowman Date: Sun Apr 8 12:26:42 2018 -0600 Fix uninitialized counter. commit 4d0771442074af020b7fc929e929629e0bcbbdee Author: John Bowman Date: Sat Apr 7 23:51:06 2018 -0600 Increment version to 2.45. commit 878f944b9ee540c77c83f2cc61d6a97c22298553 Author: John Bowman Date: Sat Apr 7 20:56:45 2018 -0600 Fix portability issues. commit 1879deff46664834bad1a6bce926ce9d58baabbb Author: John Bowman Date: Sat Apr 7 20:49:47 2018 -0600 Fix CLZ bug on CYGWIN. commit 2c70c1d965fb0b9fa92f97db2484d3ba4c184f40 Author: John Bowman Date: Sat Apr 7 20:23:08 2018 -0600 Disable trapping of floating point exceptions under CYGWIN due to strtod bug with real x=121645100408832000.0." commit 994052a59795255dc87882a3d71f4104dd041f70 Author: John Bowman Date: Fri Apr 6 17:19:45 2018 -0600 Improve usleep declaration. commit 6b974b3df56cd81b2960774441dd2e647bdf52da Author: John Bowman Date: Fri Apr 6 17:18:50 2018 -0600 Make POSIX definition conditional to CYGWIN. commit e81df002635e1391bb540fd751cd019041e8e314 Author: John Bowman Date: Fri Apr 6 16:53:21 2018 -0600 Disable unused code. Redirect "make test". commit 633813249c393938f2a8ca6d3715638f83710d74 Author: John Bowman Date: Thu Apr 5 22:32:04 2018 -0600 Remove unused code. commit 052fd69055b077537a0701711387d4005ef6cd3b Author: John Bowman Date: Thu Apr 5 22:27:48 2018 -0600 Increment version to 2.44. commit f91ccd81f6f33f927f88724e23afb75988c56692 Author: John Bowman Date: Thu Apr 5 21:21:39 2018 -0600 Replace symbolic link; update copyright. commit 69c6d33934672d86f94469325327e7e0862e4c72 Author: John Bowman Date: Thu Apr 5 20:29:03 2018 -0600 Fix MSWindows build script. commit 1ad3fcca0a38fdf6020ba9a00d9a09a12a0dea31 Author: John Bowman Date: Thu Apr 5 18:49:09 2018 -0600 Update build scripts. commit 66327ad373064731bcbda74a2873353a77f6eaf7 Author: John Bowman Date: Thu Apr 5 16:48:54 2018 -0600 Fix configure.ac. commit a4331d136126548b86d84ac59617f2a1374d9cc7 Author: John Bowman Date: Thu Apr 5 16:31:15 2018 -0600 Update build scripts. commit e1507613166785005f6f0c59ccc23df1340b9c2b Author: John Bowman Date: Thu Apr 5 08:55:50 2018 -0600 Update config.sub and config.guess. commit 92056e30dd6222eee72088de94c16cce22080104 Author: John Bowman Date: Thu Apr 5 08:55:48 2018 -0600 Update config.sub and config.guess. commit 42faee86b22ba0e051aba4d3df08da670dbe02d8 Author: John Bowman Date: Thu Apr 5 08:53:51 2018 -0600 Rename 64-bit linux binary. commit fcbfb4633bb13103fcf9cf1b399dc917c7a70763 Author: John Bowman Date: Wed Apr 4 16:37:24 2018 -0600 Revert to Boehm GC 7.6.0 due to map compilation issues under MacOS X. commit 125fadda71d2ff4be2c5533a22a18e1f72c336a9 Author: John Bowman Date: Wed Apr 4 09:44:07 2018 -0600 Update to latest Boehm garbage collector. commit d412f0e76cee49975f77849997707399a5719fb1 Author: John Bowman Date: Wed Apr 4 00:59:24 2018 -0600 Support vector svg output for PDF tex engines. commit 986b329d6e3628c768646f2217fa444f4be08ed8 Author: John Bowman Date: Tue Apr 3 21:50:48 2018 -0600 Implement temporary workaround for github Issue #29. commit ce6d0daa38fb334ff23f190b74ba10d0aa241acd Author: John Bowman Date: Tue Apr 3 19:47:40 2018 -0600 Fix real modulo operator. commit 3cdb10262d48640b9ce217896c3da595dd9ab805 Author: John Bowman Date: Tue Apr 3 02:16:30 2018 -0600 Increment version to 2.43. commit 4d0f6ba1b9c6ea2609b145f42ec9a39023e60706 Author: John Bowman Date: Tue Apr 3 00:12:12 2018 -0600 Revert to centroid depth sorting of transparent triangles until splitting code is complete. commit 355b585791bba490a8c0847dc104ef3504180353 Author: John Bowman Date: Mon Apr 2 23:44:04 2018 -0600 Revert to nativeformat EPS for MSWindows. commit ab9623e7777ff1e85f72f326b6ad9771f84290af Author: John Bowman Date: Mon Apr 2 23:37:05 2018 -0600 Fix ode integrator output. commit 440a4e23f492556b6671ad713c92507c4da91d94 Author: John Bowman Date: Mon Apr 2 23:31:44 2018 -0600 Add implementation of rational arithmetic. commit fb83e1d71bad988d081d308dc9a9d1f385871bdc Author: John Bowman Date: Mon Apr 2 23:20:23 2018 -0600 Improve missing texi2vi workaround. commit f10affaa88f9680576f541ff351a3996e502a135 Author: John Bowman Date: Mon Apr 2 22:49:03 2018 -0600 Specify current directory. commit d8d976aee0234524ab5794a75d61f9ea9c9e6d72 Merge: dc276c116 67b844aec Author: John Bowman Date: Mon Apr 2 21:42:51 2018 -0600 Merge branch 'master' of github.com:vectorgraphics/asymptote commit dc276c116e40ef1e485fa456d75d26411d6ac1f4 Author: John Bowman Date: Mon Apr 2 21:36:48 2018 -0600 Check for feenableexcept. commit 67b844aecc03a4b08ff8e9a8152d7cf324b4db22 Author: John Bowman Date: Mon Apr 2 21:36:48 2018 -0600 Check for feenableexcept. commit 13d9a1ec1cf6f6f1478cc4f590f728b0f0561725 Merge: edf060165 bed300ccb Author: John Bowman Date: Mon Apr 2 21:14:51 2018 -0600 Merge pull request #54 from ivankokan/perpendicularmark Properly implemented "square + pen" semantics within perpendicularmark commit edf060165f9014d9aeb23673bf214b5e7b983049 Author: John Bowman Date: Mon Apr 2 20:54:44 2018 -0600 Fix transparent depth test. commit d75d007c08b19787bc59b3efad1337f18b8a1bde Merge: e0dba9d6b 6ce2d6f6c Author: John Bowman Date: Mon Apr 2 13:31:16 2018 -0600 Merge branch 'master' of github.com:vectorgraphics/asymptote commit e0dba9d6b5b00154d08c4eec793ab7cffba96cce Author: John Bowman Date: Mon Apr 2 13:30:59 2018 -0600 Fix missing 3D underline. commit 6ce2d6f6c07e0492a222ec22a78bf7c60f75fd96 Author: John Bowman Date: Wed Mar 28 17:46:50 2018 -0600 Fix issue #62 (invalid string acces). commit afd2d56d1a74a9fbd27c93f79a48947fe33bfd94 Author: John Bowman Date: Sat Mar 24 17:05:23 2018 -0600 Force make clean to clear symbols. commit fc0cc036f6b3733fba8b43bf5068b009fddb6bdc Author: John Bowman Date: Fri Feb 16 12:33:25 2018 -0700 Improve diagnostic. commit 63b2310edefaef37192f596a2b6cfd97d5ce60d1 Author: John Bowman Date: Fri Jan 19 20:18:17 2018 -0700 Inline call to intbits(). commit 5f5a678fcb4d40fe312c511eb32189c410269a73 Merge: c2ca99da1 e9906f89f Author: John Bowman Date: Fri Jan 19 01:06:50 2018 -0700 Merge branch 'master' of github.com:vectorgraphics/asymptote commit c2ca99da1f5587e077cd0e7c367b49d5eae7a172 Author: John Bowman Date: Fri Jan 19 01:05:11 2018 -0700 Fix asymmetry in angle(transform t), so that angle(yscale(-1))=0. commit 9bdc5755535489b81c6fea146aa60463de9cbcc3 Author: John Bowman Date: Fri Jan 12 15:56:37 2018 -0700 Fix path. commit e9906f89fe021471c9f7d7bd375c823ee0ea45d9 Author: John Bowman Date: Fri Jan 12 15:56:37 2018 -0700 Fix path. commit f9cd516793b5d98aba083f2ef79891ccb2319adf Author: John Bowman Date: Fri Jan 12 15:43:28 2018 -0700 Rename directory. commit b0ba7e598eae625ec5d57a214682fe41907c2500 Author: John Bowman Date: Fri Jan 12 15:40:58 2018 -0700 Fix typo. commit a8b346777b7404c480c7f9aa144239ef11288164 Author: John Bowman Date: Fri Jan 12 15:39:04 2018 -0700 Fix HOWTO-MSWindows maintainer documentation. commit bb3eb235fd4da44f56f1eb563ff6c65f48a22606 Author: John Bowman Date: Fri Jan 12 15:38:15 2018 -0700 Update HOWTO-MSWindows maintainer documentation. commit d069591eb886db59bf1bf764b3916e6b907cafd4 Author: John Bowman Date: Fri Jan 12 15:22:10 2018 -0700 Add maintainer build scripts. commit 1e1e6cbbcfe65b58ead8e04d5e2b302ed011acd8 Author: John Bowman Date: Thu Jan 11 14:00:22 2018 -0700 Fix integer division bug (due to overflow). commit 0d172a96ebb5d0c11679dd98af0fa542ff2211b3 Author: John Bowman Date: Tue Jan 9 09:51:04 2018 -0700 Make nativeformat PDF under MSWindows. commit 127affbfc8938f5a7ac835d8f7fb59797b852cb0 Author: John Bowman Date: Tue Jan 9 09:28:25 2018 -0700 Build 64-bit MSWindows binaries. commit eff28605bf5844b3570f43ad4264446c75b1e78c Author: John Bowman Date: Fri Jan 5 15:27:07 2018 -0700 Workaround broken CYGWIN xdr headers. commit bed300ccb079c06c66eee8ff4dd38d4e522bf027 Author: ivankokan Date: Fri Jan 5 18:55:49 2018 +0100 perpendicularmark: properly implemented "square + pen" semantics commit 952dec232e3ea77e820297f38f338fab360186fd Author: John Bowman Date: Fri Jan 5 09:02:49 2018 -0700 Update Boehm garbage collector. commit 715c523b3019a59259c48a0b7f9852ce17b6128a Author: John Bowman Date: Thu Jan 4 22:30:21 2018 -0700 Update CYGWIN port for 64-bit build. commit 75b227048bf39a8f2bd9288d1a4e076119d0e612 Author: Supakorn Rassameemasmuang Date: Thu Jan 4 15:07:17 2018 -0700 Add Polar Grid Form. commit 77ba04a37dd8affd267a267df256326fb42f6f1b Author: Supakorn Rassameemasmuang Date: Tue Jan 2 15:03:01 2018 -0700 Add basic guide drawing system. commit 109a43611f3e2f9da5f5dae5502d8a5b8b299a6a Author: Supakorn Rassameemasmuang Date: Fri Dec 29 21:10:25 2017 -0700 Add basic grid snapping. commit aefccb8c568f772feb2bc59f009da9da3e8a3ff3 Author: Supakorn Rassameemasmuang Date: Fri Dec 29 16:13:31 2017 -0700 Add basic grid toggling commit 0fa0e5ca0c3709c3d3e0722c35ae45a412ea10d4 Author: Supakorn Rassameemasmuang Date: Wed Dec 27 16:53:51 2017 -0700 Add basic grid rendering. commit 6f6b6b1f7ef8393096a57c8c0b370275c11b2270 Author: Supakorn Rassameemasmuang Date: Wed Dec 27 15:22:28 2017 -0700 Update deletion of Bezier points. commit 187e6113e92669d0cb724971694eaa8d7768178e Author: Supakorn Rassameemasmuang Date: Fri Dec 22 21:44:13 2017 -0700 Fix rotationBug - xasy2 now checks if custom anchor is defined or not. commit 005aef0a8c45c8625910363e1159fedcd9fa31b6 Author: John Bowman Date: Mon Dec 18 14:51:43 2017 -0700 Fix segmentation fault. commit f791e93a9d258f03d4cf218f19772c91df4b8b35 Author: John Bowman Date: Fri Dec 8 00:07:19 2017 -0700 Make Bitreverse array static. commit 2f76e4922df68ca7f5c625637cde3d8b6de00801 Author: John Bowman Date: Tue Dec 5 00:30:03 2017 -0700 Update documentation. commit 4d8d83abb664f21e941ded491fe9c99ed605d4a8 Author: John Bowman Date: Mon Dec 4 21:47:35 2017 -0700 Make CLZ(0) return width of int type. commit 732551d1071b8e660fd44974002b5c0fb4dde574 Author: John Bowman Date: Sun Dec 3 11:21:39 2017 -0700 Extend bitreverse and CLZ to long long integers. commit 6dfcb97eb80d384371cbba095ce5e0289ff649f5 Merge: 5709f8fc6 1e314cf9b Author: John Bowman Date: Thu Nov 23 15:33:58 2017 -0700 Merge branch 'master' of github.com:vectorgraphics/asymptote commit 5709f8fc6f1800de36d50e636332355a71d924ba Author: John Bowman Date: Thu Nov 23 15:21:55 2017 -0700 Add forcemath option to format for typesetting within an existing math mode. commit 1e314cf9b58e60b3a4b0fa930d5fe69e3e78653d Author: John Bowman Date: Sat Nov 18 11:13:21 2017 -0700 Remove extraneous declaration. commit 07604b6d32201acbb236b254240f66da167e1a49 Author: John Bowman Date: Thu Nov 16 20:32:08 2017 -0700 Port to latest CYGWIN. commit bdb0c70c984316552298396d0ec75f7b1c40a971 Merge: 9db9467d4 51ababdae Author: John Bowman Date: Fri Nov 3 13:33:10 2017 -0600 Merge branch 'master' of github.com:vectorgraphics/asymptote commit 9db9467d4cc2c7cc2b1b09b2f9bda4ae85a7b188 Author: John Bowman Date: Fri Nov 3 13:25:07 2017 -0600 Implement 32-bit bit reverse. commit 51ababdae0bb1b3b94e87bd4a005af6f4d417b59 Author: John Bowman Date: Thu Oct 26 09:09:57 2017 -0600 Fix offscreen rendering initialization. commit 4e391ced23627e0ba9a318485f20c58d99545f27 Author: prramazi Date: Fri Oct 13 17:08:45 2017 -0600 Fix int type. commit febfdec12079aa673d8f0c66580529c208f3cedb Author: John Bowman Date: Wed Oct 11 11:20:53 2017 -0600 Fix gitignore. commit 41e6e15d4313c7ba02d947ff33d74238304c7033 Author: John Bowman Date: Fri Sep 29 14:00:58 2017 -0600 Correct comment. commit fa3de734be166afe63d0d47cdf546932f7531a5a Author: John Bowman Date: Fri Sep 29 11:39:07 2017 -0600 Implement string[] array(string s) and string operator +(...string[] a). commit 41d41c503c4119638baf7480c189149f6c244628 Author: John Bowman Date: Wed Sep 27 16:47:24 2017 -0600 Add operator <>. commit 21f5e431ff233c8af387e305301f12cfd235c636 Author: John Bowman Date: Mon Sep 25 17:14:37 2017 -0600 Implement int popcount(int) and use it to build a 64-bit int CTZ(int). commit bfc45f91a1f31ad9b9ec35cbdd38614021fe3cf4 Author: ivankokan Date: Mon Sep 25 00:20:40 2017 +0200 dot: global setting dotfilltype introduced (preserving current behavior), docs updated commit 66fc685efa9a161b70e67c9f319d9030b2d2eea9 Author: John Bowman Date: Fri Sep 22 15:20:17 2017 -0600 Implement findall. commit 1d87c4b421c6e1950280eb26681ad229fe98313c Author: Supakorn Rassameemasmuang Date: Mon Sep 4 16:23:21 2017 -0600 Add preliminary keymap & settings support. commit 8e8a2349800a1d245779e023ecc5ede7da38b239 Merge: c4aa7dedf e9584ed2f Author: Supakorn Rassameemasmuang Date: Fri Sep 1 15:28:23 2017 -0600 Merge branch 'qt' of github.com:vectorgraphics/asymptote into qt commit c4aa7dedffc4a7782a75416c787dc7f607a308ea Author: Supakorn Rassameemasmuang Date: Fri Sep 1 15:28:18 2017 -0600 Fix Beizer -> Bezier spelling commit e9584ed2fbaa6ba2bbf98fe78166c4e91a139da4 Author: John Bowman Date: Fri Sep 1 15:27:42 2017 -0600 Update Makefile. commit e76d689c599a22a4441ae7111164bae7ac8f4f60 Author: John Bowman Date: Fri Sep 1 15:27:11 2017 -0600 Update GUI. commit c5e57f4d961d136c4b547ea63026795790bd125e Merge: 355f99d46 15fe0eb71 Author: Supakorn Rassameemasmuang Date: Fri Sep 1 15:26:49 2017 -0600 Merge branch 'qt' of github.com:vectorgraphics/asymptote into qt commit 355f99d469f725e0086313bb27ab66b66d4d48cd Author: Supakorn Rassameemasmuang Date: Fri Sep 1 15:26:43 2017 -0600 Fix merge conflict. commit 15fe0eb716b5f0d92ab8fe7063ca55124a623260 Author: John Bowman Date: Fri Sep 1 15:16:29 2017 -0600 Update. commit 65e540f590ae0a9b552d31fec8eef5980e0f59c9 Merge: 7be28a23c 093568e25 Author: Supakorn Rassameemasmuang Date: Fri Sep 1 15:09:10 2017 -0600 Fix merge conflict. commit 7be28a23c991a0356792adf6304a5e58e0d8f492 Author: Supakorn Rassameemasmuang Date: Fri Sep 1 15:06:29 2017 -0600 Add Point Editor. commit 093568e25e61c860b896497264b19ea4f078c0ac Author: John Bowman Date: Fri Sep 1 15:04:39 2017 -0600 Fix spelling. commit fa2c10cf89b3b2564ee53bc48d46dd6919ba6105 Author: John Bowman Date: Fri Sep 1 14:33:27 2017 -0600 Remove obsolete file. commit 7404f0bca98908521bccdfe9fe5fc84582869deb Author: John Bowman Date: Fri Sep 1 14:31:47 2017 -0600 Add ui entry. commit 0ea7b7aca30f5f0b2e0c17bac97093c797ff3397 Author: Supakorn Rassameemasmuang Date: Tue Aug 29 13:00:50 2017 -0600 Add Beizer Curve Editor. commit 8fde617cc64cdfe44f61e6cc5ef6197ef2cc633c Merge: d664d8870 f1092a70a Author: Supakorn Rassameemasmuang Date: Tue Aug 29 13:00:01 2017 -0600 Merge remote-tracking branch 'origin/qt' into qt commit d664d887042bdbf4fd0a38d34834c6d4282acfd3 Author: Supakorn Rassameemasmuang Date: Tue Aug 29 12:59:42 2017 -0600 Add undo/redo stack. commit f1092a70a211994ddf6bafe488427628e71341a0 Merge: 1ed21e9e5 1eafa765e Author: John Bowman Date: Sat Aug 26 23:39:00 2017 -0600 Merge branch 'qt' of github.com:vectorgraphics/asymptote into qt commit 1ed21e9e55effe8fb917d4a3c9903f07cdd6e228 Author: John Bowman Date: Sat Aug 26 23:38:43 2017 -0600 Add pyUIClass support to Makefile. commit 1eafa765e69ddb869237532ec7e9e828b30993c6 Author: Supakorn Rassameemasmuang Date: Sat Aug 26 23:14:43 2017 -0600 Add Custom Anchor dialog. commit d4e29b99c50c481bd67a46de08da95598730c72f Author: Supakorn Rassameemasmuang Date: Sat Aug 26 23:13:24 2017 -0600 Add panning, added screen transformation layer, custom commands input dialog. commit ade0b6c36cbca1bce9bfc51edefc7657e46d31c6 Author: Supakorn Rassameemasmuang Date: Fri Aug 25 12:58:54 2017 -0600 De-Asyfy transformation, fix local coordinates (temporary), updated matrix dialog. commit 477fdd587d86bb57d8a8080a5a89401f80e6e128 Author: Supakorn Rassameemasmuang Date: Wed Aug 23 14:16:58 2017 -0600 Add icon resource files, Matrix Transform Dialog. commit c460dce5689f9c992e0a80b150b2c67238a39c2e Author: Supakorn Rassameemasmuang Date: Tue Aug 22 17:10:59 2017 -0600 Add quick rendering, toggling of grids, more tooltips. commit 64d74954ef499b36329c5fb958dab4a38c932b52 Author: Supakorn Rassameemasmuang Date: Tue Aug 22 15:54:52 2017 -0600 Add custom Transformation. commit 2f9674524c1d2231b58252b4daafd14aee478b27 Author: Supakorn Rassameemasmuang Date: Mon Aug 21 16:45:27 2017 -0600 Fix translation & Update README. commit fd330a08614549c1497bd969f230837abcec8d7e Author: Supakorn Rassameemasmuang Date: Mon Aug 21 16:40:56 2017 -0600 Transition to final UI, add basic translation, scaling, rotation. commit ab2c346a05cd13fcc6e5c36ec2e9b0a100779e23 Author: Supakorn Rassameemasmuang Date: Sat Aug 19 16:40:07 2017 -0600 Move to new, Final User interface. commit efc9a0013f20fcc39872bbf42b8b1cbdbec91d35 Author: Supakorn Rassameemasmuang Date: Sat Aug 19 15:32:34 2017 -0600 Temporarily remove preCanvasPixmap (as mainCanvas transparency is not wokring for some reason), add grid outline. commit 8988458f8d4f14bfb7b5e85074e7dd18d90fdc31 Author: Supakorn Rassameemasmuang Date: Fri Aug 18 21:32:58 2017 -0600 Add mouse detection, drag translation & deferred buffers. commit f7231be3e560fa40f43e298e4b69b5c03ca0a141 Author: John Bowman Date: Fri Aug 18 14:31:44 2017 -0600 Remove redundant vbox. commit 7c5ba009606fe64da1757bdfebed51f0776a9941 Author: Supakorn Rassameemasmuang Date: Wed Aug 16 15:42:29 2017 -0600 Change PIL to QImage. commit b69b6093485c4b42f03c26134099f54f02b497f8 Author: Supakorn Rassameemasmuang Date: Tue Aug 15 14:42:19 2017 -0600 Rename xasyQt to xasy and original xasy to xasyTk. commit 52b8a33a6129219acb608abcc36248f27596965e Merge: fd134d022 67fe29eb9 Author: Supakorn Rassameemasmuang Date: Tue Aug 15 14:40:50 2017 -0600 Merge branch 'qt' of github.com:vectorgraphics/asymptote into qt commit fd134d02224c30893fc99a993643b641a6025999 Author: Supakorn Rassameemasmuang Date: Tue Aug 15 14:40:44 2017 -0600 added final ui draft commit 27beaff43db806d9169f27ad0e10dd41f2a61299 Author: Supakorn Rassameemasmuang Date: Mon Aug 14 01:00:36 2017 -0600 Add generalized Affine Transform. commit 67fe29eb902d87a6f34b6fbdd01c2a302a6b028c Author: John Bowman Date: Sun Aug 13 21:51:17 2017 -0600 Fix xasyQt. commit c66360fc91837ac6b226ccef33c5bb95bff31bc3 Author: Supakorn Rassameemasmuang Date: Sun Aug 13 16:31:59 2017 -0600 Refractor to have the raw image flipped (for native asy coordinates). commit ad49f711ce684ef85b260cb02c0f51b0558e55ec Author: Supakorn Rassameemasmuang Date: Sun Aug 13 15:56:30 2017 -0600 Add rotation and translation. commit 81434d3f20caec72ebad1ac758958c3ca2d13481 Author: Supakorn Rassameemasmuang Date: Wed Aug 9 00:11:55 2017 -0600 Update .gitignore and move generated files to a separate folder commit 03617244274132af1cad89cf8c3b1617cd2d1f91 Author: Supakorn Rassameemasmuang Date: Tue Aug 8 16:06:18 2017 -0600 Add initial qt xasy. commit 84f4ea3ff0a564698282af8eeb1afae14907e2fe Author: John Bowman Date: Fri Aug 4 15:33:03 2017 -0600 Improve equation support in module slide. commit da7e0f8adee99fadb59623bc3065acae4c523e9b Author: John Bowman Date: Fri Aug 4 16:25:15 2017 -0600 Test of Qt5. commit 1b9692fae4a4f7bd58ea09f37178f7ed598f277d Author: John Bowman Date: Tue Jun 13 15:40:12 2017 -0600 Simplify example. commit 467e7c47c96da5c28aca1713b02bcecf75e7e166 Author: John Bowman Date: Tue Jun 13 15:38:54 2017 -0600 Remove broken empty flag. commit 5ec14a9d6f1f507b616db450896a7f275dd7ff3c Author: John Bowman Date: Thu Apr 6 11:01:23 2017 -0600 Work around quote mangling bug when viewing asymptote.pdf in certain PDF readers. commit 45f532f7b10565f05ff82c6f7b6833ef33a20712 Author: John Bowman Date: Wed Mar 22 02:29:15 2017 -0600 Increment version to 2.42. commit 40f27e1424f6c63aa362f16f3c65b9f3d1d6e723 Author: John Bowman Date: Wed Mar 22 01:56:17 2017 -0600 Always use epsdriver. commit ee57aa9c533e4a71fc20151928e5cf418d4effc5 Author: John Bowman Date: Wed Mar 22 00:29:27 2017 -0600 Update bug reporting URL in README. commit 207695a78f697be391991f5c943543ebeccf4e87 Author: John Bowman Date: Tue Mar 21 23:34:36 2017 -0600 Remove temporary ConTeXt log file. commit a981ce85db27372750fd19aec9d4456d3bc0b21a Author: John Bowman Date: Tue Mar 21 23:19:22 2017 -0600 Support eps output with all TeX engines. Work around Imagemagick black background bug in jpg output. commit 3e42b17ffde9941bf0ad6e24a05f73c788d755b5 Author: John Bowman Date: Mon Mar 20 23:05:31 2017 -0600 Remove temporary pbsdat file. commit dacbf47554b36d0571394b3c4d747405e53f2708 Merge: f34a52dfb c2e4bd599 Author: John Bowman Date: Fri Mar 17 01:48:29 2017 -0600 Merge pull request #38 from ivankokan/master Add improvements for perpendicular marks. commit f34a52dfbebee7100a0d853edda78c99f1e5f2c0 Author: John Bowman Date: Fri Mar 17 01:20:43 2017 -0600 Use different rendering constants for Bezier patches and triangles. Improve flatness test for Bezier triangles. commit 0b59b3b2b2432b3c715eb80f0305c454bd7a9e00 Author: John Bowman Date: Sun Mar 5 14:17:40 2017 -0700 Fix previous commit. commit 9a2b4810156bf34c4257f08dc12595aed9867147 Author: John Bowman Date: Sat Mar 4 18:32:36 2017 -0700 Make perl look in FAQ directory. commit b3322131bebd3a506add235d25ae7ca53ab2efcd Author: John Bowman Date: Thu Mar 2 15:41:45 2017 -0700 Reduce rendering constant back to 0.5. commit 00716297f257c464e97bb0bd6b747c4034bcb97e Author: John Bowman Date: Thu Mar 2 15:10:37 2017 -0700 Remove unused variable. commit 05b6d931d5546359b061e3959817ff8d4936672a Author: John Bowman Date: Thu Mar 2 09:57:58 2017 -0700 Remove out-of-date opengl32.dll and glu32.dll libraries on install. commit 585c158ee53e4d202f1ceda5c12782a06aec57e9 Author: John Bowman Date: Thu Mar 2 00:18:05 2017 -0700 Increment version to 2.41. commit 5a6d3626f3589f7fdc7193dea97ae335ad70b242 Author: John Bowman Date: Wed Mar 1 23:43:49 2017 -0700 Increase adaptive rendering constant to 1.0. commit 35a65e91254f9326e70fcca3c334cc40cb5cb867 Author: John Bowman Date: Wed Mar 1 22:18:51 2017 -0700 Update to more recent system versions of glu32.dll and opengl32.dll libraries, so that UNIX subdivision crack fix also works under MSDOS. commit f846f1d090b8ef8910a891a62b7ddfb945ec8280 Author: John Bowman Date: Wed Mar 1 22:09:50 2017 -0700 Fix multisample detection; remove MSDOS workarounds (tested with freeglut-2.8.1). commit c2e4bd5990b9f3e6963ea80da2eb20d3a48c7a82 Author: ivankokan Date: Wed Mar 1 17:37:51 2017 +0100 markrightangle: margin manipulation removed (it resulted with blank area between the perpendicular mark and a line thinner than currentpen), perpendicular mark now always starts from the "middle" of lines commit 7636977c5c744ba28df9ae21c3dd7530d1beaa5f Author: ivankokan Date: Wed Mar 1 17:37:51 2017 +0100 perpendicularmark: miterjoin added (aesthetic improvement and alignment with existing squarecap) commit 8de2b9cae38a5bdfc29bbe6ee8bec9def0515c5c Author: John Bowman Date: Sat Feb 25 01:45:58 2017 -0700 Use Straightness also for Bezier triangles. commit d4330f044f54bce7122052a8b2e860a39944f58d Author: John Bowman Date: Sat Feb 25 01:31:01 2017 -0700 Optimize Straightness function. commit 8e6fb2dc64f2a7cf43a13f97752f2c5d902f381a Author: John Bowman Date: Fri Feb 24 10:54:48 2017 -0700 Fix straightness test. commit f72338e8be394ab6716a7b488f016bbf7d3123d3 Author: John Bowman Date: Mon Feb 20 11:50:43 2017 -0700 Fix CFLAGS. commit 12af4538ad099cd597c9f6b3c816823fdc0ca7d4 Author: John Bowman Date: Sun Feb 19 11:44:53 2017 -0700 Localize declarations. commit 23a14592eb04fd15a7d062ccc693b225e927a0fe Author: John Bowman Date: Sun Feb 19 11:37:30 2017 -0700 Force draw on color change. commit 6d5ef929f22eb9d7b4f82fe2d828eb6a6b39395f Author: John Bowman Date: Sat Feb 18 20:03:01 2017 -0700 Move compare function to bezierpatch.cc. commit 5da211a76c91fc77111e4ffff2849c14846f95fc Author: John Bowman Date: Wed Feb 15 18:25:34 2017 -0700 Update credits and example. commit 322fba942949338ce0b2a15e6f8a38c5c7f95ff1 Author: John Bowman Date: Wed Feb 15 15:19:55 2017 -0700 Simplify code. commit 9a0372b48f142f6429015f80a18071ee77b796da Author: John Bowman Date: Wed Feb 15 07:52:52 2017 -0700 Revert "Detect material change also for specified vertex colors." This reverts commit c7878da529adde75a929a755dae7a42b2e9a3486. commit c7878da529adde75a929a755dae7a42b2e9a3486 Author: John Bowman Date: Wed Feb 15 07:45:14 2017 -0700 Detect material change also for specified vertex colors. commit af2b9b1592e3849c5e5c986fd92c745076eedb22 Author: John Bowman Date: Tue Feb 14 23:30:51 2017 -0700 Derive drawBezierPatch and drawBezierTriangle from drawSurface. commit 6036e20c654c10dc4514cc95162378578f5f15d5 Author: John Bowman Date: Tue Feb 14 23:29:17 2017 -0700 Don't override command-line CFLAGS. commit 53cd8fef6985ff057380289b58ba721c0bcbe4b0 Author: John Bowman Date: Tue Feb 14 16:52:42 2017 -0700 Work around broken CYGWIN headers. commit 5d2776ee98f73db470c4c02eb8dbb2cf02e01618 Author: John Bowman Date: Tue Feb 14 16:48:15 2017 -0700 Improve subdivision crack filling for Bezier triangles. commit f181de0b91d7fe3d0f009b096e12741fa10ebde2 Author: John Bowman Date: Tue Feb 14 09:27:51 2017 -0700 Update comments. commit 97881b9e66a053fcbec8298f3cd4c47549f1fbc1 Author: John Bowman Date: Mon Feb 13 14:12:20 2017 -0700 Fix warning message. commit 846025fa2fb7293558825b23eff3c87ad9f22e84 Author: John Bowman Date: Mon Feb 13 13:49:42 2017 -0700 Implement transparency workaround also for Bezier triangles. commit 064ad7478a319f0c98aaae524c72b5d068c1b359 Author: John Bowman Date: Mon Feb 13 11:33:35 2017 -0700 Implement transparency workaround also for Bezier triangles. commit 1c8b95b6e6f9bd0773861d233f880ff553f72ed1 Author: John Bowman Date: Mon Feb 13 03:56:02 2017 -0700 Remove unused code. commit f2de95a07077aaf2e4c812f0cd2706be14e4f3b1 Author: John Bowman Date: Mon Feb 13 03:54:10 2017 -0700 Test empty flag in BezierPatch::draw(). commit 64134306851cc52f0fc134a7c6933f79f60149da Author: John Bowman Date: Mon Feb 13 03:45:36 2017 -0700 Simplify code; update example. commit 42ef8903cabfc20ceef8971025d71e5a91458700 Author: John Bowman Date: Mon Feb 13 03:39:20 2017 -0700 Remove unused variable. commit f2964231df4f5220c07db04faccd99d05ac73580 Author: John Bowman Date: Mon Feb 13 03:36:51 2017 -0700 Simplify code. commit e209592e78c8fd8da53ee343768931a6ed23c89b Author: John Bowman Date: Sun Feb 12 23:01:31 2017 -0700 Fix example. commit 0e09443aec3a961b46dc86b1c0a388d203a1f6bb Author: John Bowman Date: Sun Feb 12 22:59:39 2017 -0700 Fix example. commit e9face7d68b591bcd39a0c2a8eddc458bb6910b3 Author: John Bowman Date: Sun Feb 12 22:46:06 2017 -0700 Update examples. commit 31c6630d550fab51331756a4d78bc6f199b226ea Author: John Bowman Date: Sun Feb 12 14:59:39 2017 -0700 Partially work around OpenGL transparency bug by sorting transparent triangles by their centroid depth. commit ca09f95435e91eefcffd15050657e53debc1f829 Author: John Bowman Date: Sun Feb 12 14:52:21 2017 -0700 Fix segmentation fault. commit 8388a6050b59764a1669bd7f56aa8864c4261dfc Author: John Bowman Date: Sat Feb 11 19:49:58 2017 -0700 Update to gc-7.6.0. commit 0eb3950fd75f3ce45617a83ad1f8e30778e14d3b Author: John Bowman Date: Wed Feb 8 12:21:48 2017 -0700 Fix stride. commit 7161eef9c86df2124549a42c0723610ca9e1acee Author: John Bowman Date: Mon Feb 6 16:35:21 2017 -0700 Support compilation without OpenGL. commit 723495103fb4d189f6d1ec1349ecdd01275b89b0 Author: John Bowman Date: Fri Jan 27 14:23:35 2017 -0700 Fix post-release version number. commit 0c0164bdaba74be22c294aebdb880c6798ab6bbc Author: John Bowman Date: Wed Jan 25 00:17:22 2017 -0700 Increment version to 2.40. commit 6895ed3fb866609fae46b01bd6e44b2f2bcf281f Author: John Bowman Date: Tue Jan 24 22:43:43 2017 -0700 Update asymptote.py. commit 51cb6d02c8ce6599ce9975e315308ec99af60d7e Author: John Bowman Date: Tue Jan 24 20:20:11 2017 -0700 Remove unwanted extension from shipout prefix. commit 80b4d2b25e304a4b11c60a28082130d1a17d44dd Author: John Bowman Date: Tue Jan 24 14:24:59 2017 -0700 Use pdf 3D label processor also for luatex and lualatex tex engines. commit e793d86adc45d3738b9b69ad20212f5c9c18c364 Author: John Bowman Date: Tue Jan 24 13:50:47 2017 -0700 Reduce tubegranularity. commit 9366137351acf3cf45cf7c7de563f13d5a39bb95 Author: John Bowman Date: Tue Jan 24 13:37:02 2017 -0700 Make invalid string casts return an uninitialized variable. Add bool initialized(T) function for basic types T. commit 4c744193cc8fdd51d277e9566a114a589772ae4d Author: John Bowman Date: Tue Jan 24 09:28:10 2017 -0700 Move lualatex test into TeX code. commit 9a8586b5f6c9581eb7cb93fe9775e1756de3c5c8 Author: John Bowman Date: Tue Jan 24 09:01:40 2017 -0700 Revert "Remove requirement to call nosetpagesize() when changing to lualatex engine." This reverts commit 70fccdee30727275b3b1cab79da18287837601e2. commit 70fccdee30727275b3b1cab79da18287837601e2 Author: John Bowman Date: Tue Jan 24 08:44:36 2017 -0700 Remove requirement to call nosetpagesize() when changing to lualatex engine. commit 7d9b49adf9e555e13dcea584e74bcd12f9636a49 Author: John Bowman Date: Sat Jan 21 16:59:00 2017 -0700 Reinstate patch outline mode. commit a96ffbbfba55fc69b27b1c6052545bbf99ee23f8 Merge: 0be6f5567 16ae9ee48 Author: John Bowman Date: Sat Jan 21 15:45:27 2017 -0700 Merge branch 'master' of github.com:vectorgraphics/asymptote commit 0be6f55679c4b6cb0f7fe14c22b1f4b676e54d5f Author: John Bowman Date: Sat Jan 21 15:45:17 2017 -0700 Add missing file. commit 1d32440f4abd08287e4b9672c98e41139540607c Author: John Bowman Date: Sat Jan 21 15:43:00 2017 -0700 Split BezierCurver render and draw operations. commit 16ae9ee4892076ca4f1ba20581cfd8001459f4fd Author: John Bowman Date: Sat Jan 21 15:43:00 2017 -0700 Split BezierCurver render and draw operations. commit ee78ea2311ce61048b7e559b6a3f510eb98387c3 Author: John Bowman Date: Sat Jan 21 11:24:49 2017 -0700 Implement Bezier curver renderer. commit fee686ab993af55e63a877c438d2fa233059f079 Author: John Bowman Date: Fri Jan 20 23:25:26 2017 -0700 Fix offscreen array sizes. commit 56326208e7a3f341556bd3d964fffeb8e9cba0a8 Author: John Bowman Date: Fri Jan 20 19:28:07 2017 -0700 Optimize billboard mode. commit eb0da243e2cd1d6738efbad9e549dad8c2bfafc2 Author: John Bowman Date: Wed Jan 18 00:41:22 2017 -0700 Cull offscreen Bezier triangles. commit b57705207c7b62a68ef90dacdfd5919248197135 Author: John Bowman Date: Wed Jan 18 00:20:12 2017 -0700 Cull offscreen subpatches. commit 189c89074852706cc3d8f6648dd30517465e9445 Author: John Bowman Date: Sun Jan 8 14:27:49 2017 -0700 Fix flatness test. commit a524000c1352b11fe4e3aa7d1335cc393841d29e Author: John Bowman Date: Sat Jan 7 21:04:34 2017 -0700 Fix flatness test. commit 168b1f284139482deb8044c4328a10e57fbfec47 Author: John Bowman Date: Sat Jan 7 21:03:13 2017 -0700 Simplify code. commit 12363c3ba5048faca607ab2656e19d26b402b5cd Author: John Bowman Date: Sat Jan 7 19:28:32 2017 -0700 Improve flatness test; simply code. commit 01f66ecfb744df300c04c760d81475b4d1e5450c Author: John Bowman Date: Sat Jan 7 19:18:01 2017 -0700 Fix typo. commit adc9c3a165b8e74ed2728ec0203ce68234629ff3 Author: John Bowman Date: Sat Jan 7 19:16:44 2017 -0700 Add deepyellow synonym for olive color. commit 0b07b0db01be9e2bd24b1e3aeb182c7f9b57327c Author: Charles Staats III Date: Mon Dec 26 18:19:02 2016 -0500 Document using keyword commit 96b017b1a26305700dffc52a80153c799d0f3b4e Merge: 9ab90951e 1cc7f83d7 Author: Charles Staats III Date: Mon Dec 26 17:17:13 2016 -0500 Merge branch 'master' into using_typedef commit c71d3faf1bd0370b6ad3e464e2c0dbed934d15a6 Author: Charles Staats III Date: Mon Dec 26 17:15:00 2016 -0500 Add graphwithderiv function commit 1cc7f83d73cbe2ece3e7e4f0e7640b2ec5cbe684 Author: John Bowman Date: Sat Nov 26 10:56:46 2016 -0700 Remove requirement to call nosetpagesize() after changing TeX engine. commit 33ed6c683a960b0a29951d3c7f8efbb15f64aaaf Author: John Bowman Date: Fri Nov 25 16:50:06 2016 -0700 Implement robust workaround for graphicx.sty bug. commit 967f09a6fd79b84b8803fca8d9871c7f11f4942a Author: John Bowman Date: Mon Nov 14 11:53:44 2016 -0700 Update asymptote.sty to force nosetpagesize also with xelatex TeX engine. commit 988530d0daf78c580ed305d07d0d23e140b2b52d Author: John Bowman Date: Tue Nov 8 10:00:05 2016 -0700 Workaround setpagesize graphicx side effect when using asymptote.sty. commit 866ef9c47bedec14d1584b443bbcf02ba5be5b60 Author: John Bowman Date: Tue Nov 8 01:15:57 2016 -0700 Portably fix graphicx setpagesize bug. commit 27948832401841f1fd4c1ec6fa3f71e5a246dcc0 Author: John Bowman Date: Mon Nov 7 21:49:54 2016 -0700 Fix principalBranch. commit 529bc76b4f31e59332383c3068ef4b5e41c49865 Author: John Bowman Date: Tue Nov 1 00:19:20 2016 -0600 Minor optimization. commit 4aa1ffb19dfac6705a728f6b3ddeda353dee1868 Author: John Bowman Date: Sun Oct 30 02:46:17 2016 -0600 Minor optimization. commit 4e1d019889f5609205ecc2856afacb867ed8b66d Author: John Bowman Date: Wed Oct 26 22:57:10 2016 -0600 Add paletteticks NoTicks option. commit 0a0f231cd247d3341f188fad28f00d29813cdee6 Author: John Bowman Date: Mon Oct 24 23:33:49 2016 -0600 Avoid empty axis labels. commit bd70d164fb84e06f0ff8aa5cb03b08d8adbf688b Author: John Bowman Date: Sun Sep 4 22:06:31 2016 -0600 Implement improved workaround to recent graphicx incompatibilities, which also works with inline TeX mode. commit 2f209f9ed847db0068c0ac85fa6c98571eeb9462 Author: John Bowman Date: Sun Aug 28 23:36:02 2016 -0600 Implement general workarounds for recently introduced graphicx and lualatex backwards incompatibilities. commit afb95149c62f8c27605fc01ae75b9ce1bf678431 Author: John Bowman Date: Fri Aug 26 00:31:58 2016 -0600 Add patched version of plain.asy for TL2016 only. commit 758d08612b2895663947a31f68341caaceaf8a20 Author: John Bowman Date: Tue Aug 23 03:26:28 2016 -0600 Revert "Revert "Revert "Workaround pdflatex pdfpagewidth and pageheight bug in TeXLive 2016.""" This reverts commit 896202ca85c76a5e09c1c68193b3459600586127. commit fe2510c2d5696fa8f259e535b022cae86938c735 Author: John Bowman Date: Mon Aug 15 14:12:30 2016 -0600 Revert "Add gl-matrix javascript library." This reverts commit 9878b4dc4358da80777666dc9cf80e351a80f937. commit 9878b4dc4358da80777666dc9cf80e351a80f937 Author: John Bowman Date: Mon Aug 15 10:20:27 2016 -0600 Add gl-matrix javascript library. commit 896202ca85c76a5e09c1c68193b3459600586127 Author: John Bowman Date: Thu Aug 4 00:07:00 2016 -0400 Revert "Revert "Workaround pdflatex pdfpagewidth and pageheight bug in TeXLive 2016."" This reverts commit b8ef9a8ae04ac345188cb31eab591945cd2a2abf. commit 421b733a96996452bd474b80988741fdb2ece342 Author: John Bowman Date: Thu Aug 4 00:06:29 2016 -0400 Revert "Implement alternative workaround for graphicx pagesize bug." This reverts commit 545f2b55cca742e6df16df2362fba18702171d50. commit 545f2b55cca742e6df16df2362fba18702171d50 Author: John Bowman Date: Wed Aug 3 23:10:17 2016 -0400 Implement alternative workaround for graphicx pagesize bug. commit b8ef9a8ae04ac345188cb31eab591945cd2a2abf Author: John Bowman Date: Wed Aug 3 23:09:25 2016 -0400 Revert "Workaround pdflatex pdfpagewidth and pageheight bug in TeXLive 2016." This reverts commit 61cfa1e299de53c12a6ce08305383aac18ad9216. commit 61cfa1e299de53c12a6ce08305383aac18ad9216 Author: John Bowman Date: Tue Aug 2 23:23:01 2016 -0400 Workaround pdflatex pdfpagewidth and pageheight bug in TeXLive 2016. commit d76f6754b1552eb02dca5ab53ea4836c287c3e53 Author: John Bowman Date: Wed Jul 27 05:35:57 2016 -0600 Generalize palette(real[][], pen[]) to handle nonsquare arrays. commit ff41f2060c00278a13512dd66ca7424d697342c5 Author: John Bowman Date: Sat Jun 4 20:45:28 2016 -0600 Increase overlapedges scaling. commit 689fb9ebecdc859d438808178beb7151a0229698 Author: John Bowman Date: Sat Jun 4 20:03:11 2016 -0600 Revert "Remove obsolete overlapedges flag." This reverts commit 154c47b6962a23404857ada45d3d7b0752f4817e. commit d0c97bff49e5bc2c89ad0b48552b971d163414a5 Author: John Bowman Date: Sat Jun 4 20:00:48 2016 -0600 Fix typo. commit 7ecaf8f43931d728eaf4154092cefaa4d0d0c201 Merge: 692051a28 154c47b69 Author: John Bowman Date: Thu Jun 2 23:11:58 2016 -0600 Merge branch 'patch'. commit 154c47b6962a23404857ada45d3d7b0752f4817e Author: John Bowman Date: Thu Jun 2 22:59:14 2016 -0600 Remove obsolete overlapedges flag. commit 928af116df130df1e75d308c8722682e36b391b5 Author: John Bowman Date: Thu Jun 2 22:57:44 2016 -0600 Standardize flatness tests. commit 3f409fa5c904b82266ca576aa6372493b654dedf Author: John Bowman Date: Thu Jun 2 15:13:17 2016 -0600 Relax flatness test. commit 5dece5cdcd7bad955f1e0836664fe3f572fd75f7 Author: John Bowman Date: Thu Jun 2 13:57:03 2016 -0600 Fix flatness test. commit 12238c7d03bd61aaffcfa5ab47b51d56acadb286 Author: John Bowman Date: Thu Jun 2 12:42:44 2016 -0600 Fix remaining normals. commit 826469f06a43a86fdc56999a88b7fe657797ee1d Author: John Bowman Date: Thu Jun 2 03:16:42 2016 -0600 Fix color order. commit def2d72ac3e8472c5997fada88004765bb581a41 Author: John Bowman Date: Thu Jun 2 03:04:18 2016 -0600 Fix straight case. commit 2323c592d5a2e8fd800ce1e0b9288027dd89c88a Author: John Bowman Date: Thu Jun 2 02:29:19 2016 -0600 Remove unused code. commit 0bdfab4a98dd496fb0f3187edb92bc47e551a423 Author: John Bowman Date: Thu Jun 2 02:02:47 2016 -0600 Simplify code. commit f03dc5c7e6e3007cf9cc8c628daf93f6ff2fe33f Author: John Bowman Date: Wed Jun 1 13:47:31 2016 -0600 Fix subdivion cracks and zero normals. commit fdb20f62a69b5e8244f71025f349baf411e49332 Author: John Bowman Date: Wed May 18 15:08:42 2016 -0600 Add vertex shading. commit 31ba48ca76e1a118fde5812137366ecabca1d3e7 Author: Andrew Bernakevitch Date: Wed May 18 14:35:47 2016 -0600 Add ASCII diagrams of the Bezier patch, including a diagram of the patch and one of the key points on the patch. commit 692051a2849fa4ae074ab565319b2af22a5fc828 Author: John Bowman Date: Tue May 17 10:16:53 2016 -0600 Fix formatting. commit f67594a5df27ec9862c7953c13522f16e8a59387 Author: John Bowman Date: Thu May 12 03:23:35 2016 -0600 Increment version to 2.39. commit 3f044f05ca7f3d30d3f61edcf1d991bd6ccc69dd Author: John Bowman Date: Thu May 12 02:16:25 2016 -0600 Move bug tracking to github. commit b9ca1650f3086a265eb9d39649261680fe032ba5 Author: John Bowman Date: Thu May 12 02:05:12 2016 -0600 Require ncurses library only with --enable-readline. Implement --disable-sigsegv configuration option. commit 4c1ac9da70652934fadfef75181aab7191845327 Author: John Bowman Date: Thu May 12 01:14:03 2016 -0600 Begin implementation of bezier patch renderer. commit da2c3f8c7af68645c6cff8c04f555676413e47ba Author: John Bowman Date: Thu May 12 01:08:40 2016 -0600 Minor optimization. commit 8a956632265c5b540b21249d8411216788812e30 Author: John Bowman Date: Wed May 11 08:55:31 2016 -0600 Use # operator for integer division. commit 11f06b200a9ca5382e2c15d251140e44902f0f04 Author: John Bowman Date: Mon May 9 13:55:55 2016 -0600 Update CXXFLAGS and LDFLAGS documentation. commit 563d53bf8eba994e903e460361f30d93f6a5da14 Author: John Bowman Date: Sun May 8 22:19:25 2016 -0600 Port Makefile.in to Bourne shell. commit 04b86da8e09ed0772d46520e43e4875878aff4f8 Author: John Bowman Date: Sat May 7 20:34:12 2016 -0600 Fix longitudinal splitting in revolution. commit 0d7435b299f721fbe4d788edc3f5334f8bddabb9 Author: John Bowman Date: Fri May 6 20:49:46 2016 -0600 Pass CC and CXX to gc configure. commit a40b6c087091bdc15ffe44d00c51ca15cb1d4877 Merge: 656cf9764 0f1f6d1c7 Author: John Bowman Date: Fri May 6 09:45:34 2016 -0600 Merge pull request #21 from mojca/posix-test Makefile.in: replace 'test ! -e' => 'test ! -s' commit 0f1f6d1c73ebc6b494fc23d76a1f00966de9f5fb Author: Mojca Miklavec Date: Fri May 6 16:49:41 2016 +0200 Makefile.in: replace 'test ! -e' => 'test ! -s' for compatibility with older shell (on systems like Solaris) commit 9ab90951efb23c33f948738b24d40ee6ce14b76d Author: Charles Staats III Date: Tue Apr 19 21:08:01 2016 -0700 More formatting fixes. commit c017602769b807f2f9dbcc59d6e355c9f978fcec Author: Charles Staats III Date: Tue Apr 19 21:02:19 2016 -0700 Improve formatting of new lines in camp.y commit e939bc5faf36c1b6dc0d55f5ac63c1f5c235f9ab Author: Charles Staats III Date: Tue Apr 19 20:52:13 2016 -0700 Add using keyword as typedef alternative. commit 656cf9764dc937aa12bd50fe8dc2e0354c7c5e64 Author: John Bowman Date: Fri Mar 18 16:42:22 2016 -0600 Minor optimization. commit ee9839887c7006a4e5138afe8b039669082c904a Author: Orest Shardt Date: Tue Mar 15 15:14:38 2016 -0400 correct parsing of control points commit 1032cd60aedd0dec0f376410e5fdf525eda65f39 Author: John Bowman Date: Mon Mar 14 17:11:21 2016 -0600 Update copyright and FSF address. commit 24628251a11faf6d4e4ed0034c716cc6b4289cb6 Author: John Bowman Date: Mon Mar 14 01:09:15 2016 -0600 Increment version to 2.38. commit 0240be5ed61de2394cc5cc614a9c4b480f2f51d1 Author: John Bowman Date: Sun Mar 13 23:31:54 2016 -0600 Add missing variable. commit a33a69444b667675706f42653c3620da583e0130 Author: John Bowman Date: Sun Mar 13 21:05:19 2016 -0600 Update diagnostic. commit 3a8360af8637891ad54a6d756026780286c44ea8 Author: John Bowman Date: Sun Mar 13 20:57:00 2016 -0600 Merge port of xasy to Python3, courtesy of Mojca and Orest. commit 48e84c5bc8d62b7f06528682e8fd7275828345e6 Author: John Bowman Date: Sun Mar 13 20:45:07 2016 -0600 Add -P arguments to pngalpha ghostscript driver calls. commit d789c4df72983f70934f702a9ee3ee80fd82b81f Author: John Bowman Date: Sat Mar 12 21:59:02 2016 -0700 Make quiet suppress output unless verbosity > 1. commit 740c8c1df8127012ff983fe9979a096d0f71e81e Author: John Bowman Date: Sat Mar 12 21:26:01 2016 -0700 Make settings.quiet suppress noninteractive standard output when verbose=0. Add progress function. commit bcbf941fdd0fa9db5c3b77d7a3477fa358a291ac Merge: 97f3b6c39 ae0af708d Author: John Bowman Date: Sun Mar 6 22:33:57 2016 -0700 Merge branch 'trianglewithnormals' commit 97f3b6c3958028f16e130af9a76d404b91289a0c Author: John Bowman Date: Sun Mar 6 21:16:03 2016 -0700 Don't require kpsewhich in make check for TeXLive version. commit 121bef8befae717eb00bc550a4e94e05b73a9202 Author: John Bowman Date: Sun Mar 6 21:12:26 2016 -0700 Look for kpsewhich first in the same directory as the asy executable. commit ae0af708d12981318936697c7c289fe71723dabe Merge: 815b7381e 6fc23e01a Author: Charles Staats III Date: Sun Mar 6 20:07:38 2016 -0800 Merge branch 'master' into trianglewithnormals commit 815b7381ec98e7bd8fff428145c4ff37f4c6ef42 Author: Charles Staats III Date: Sun Mar 6 20:04:10 2016 -0800 Revise comments on smoothcontour3 for bezier triangles. commit 6fc23e01ac254e6e016fa2ce37f190a9b3c027c7 Author: John Bowman Date: Sun Mar 6 20:07:15 2016 -0700 Improve script portability. commit ab000e7a922e6f21dc6aabad21e6dfed864acf2b Author: John Bowman Date: Sun Mar 6 18:34:57 2016 -0700 Move compile-time check for epsdriver into environment variable ASYMPTOTE_EPSDRIVER. commit 3cf0adc19ab1ca13ca70dc6e700c6386ccf73e37 Author: John Bowman Date: Sun Mar 6 14:20:31 2016 -0700 Add EPSWRITE compiler flag to support ghostscript versions older than 9.14. commit cbb7e37c1a8ed7168bdfb61b5c48ef775b9dd668 Merge: 900418390 6c1ad05b4 Author: John Bowman Date: Sun Mar 6 10:04:21 2016 -0700 Merge branch 'trianglewithnormals' commit 900418390224e6f56ed33a5df55c0b47e418e1f0 Merge: ce19f613e 9a36fe859 Author: John Bowman Date: Sun Mar 6 09:45:19 2016 -0700 Merge branch 'improverootfinder' commit ce19f613e620c3fd953417301a7d9fd1e4db3a70 Author: John Bowman Date: Sun Mar 6 09:40:49 2016 -0700 Port xasy integer division to Python 3. commit dc788693ea22f5a6bd990a21b357af605f179e27 Author: John Bowman Date: Sun Mar 6 09:36:23 2016 -0700 Port xasy color handling to Python 3. commit c16b1d2a6e320e197d41a8df8698e49810737473 Author: John Bowman Date: Fri Mar 4 23:15:13 2016 -0700 Change CFLAGS to CXXFLAGS in documentation. commit 9a36fe85944c15cbb67c5f1cf777b0bf7e5bd581 Author: John Bowman Date: Sun Feb 28 23:53:11 2016 -0700 Remove default values of fa and fb from _findroot; force margin to (b-a)*1e-3. commit 6c1ad05b445578368eec7d54842f5ae46cac1213 Author: Charles Staats III Date: Sun Feb 28 22:17:37 2016 -0800 Correct spacing in smoothcontour3.asy. Replace tabs by spaces for consistent spacing across editors. commit 4502339c241f74eaf2f02c9315c378f90b44e6a3 Author: Charles Staats III Date: Sun Feb 28 22:03:59 2016 -0800 Document usetriangles option for smoothcontour3. commit 29832acfab74cadeb749926b2db3d3ac5f965515 Author: Charles Staats III Date: Sun Feb 28 21:55:51 2016 -0800 Add smoothcontour3 option to use bezier triangles (default) or not. commit 50b1420e4d9e46982ab124f7319b30bc7e57b358 Author: Charles Staats III Date: Sun Feb 28 20:09:07 2016 -0800 Simplify reversing cyclic array. commit becf736defe152799976999c6ede67e40e5975fd Author: Charles Staats III Date: Sun Feb 28 19:27:19 2016 -0800 Change adaptive rendering constant for bezier triangles. commit fc81a2ed70019cca10eed52b2caa3bff713d0d7f Merge: cd9f87557 e78de7f99 Author: Charles Staats III Date: Sun Feb 28 19:23:17 2016 -0800 Merge remote-tracking branch 'origin' into trianglewithnormals commit 184bea914c95dd92c32380bce6001916607d2482 Author: John Bowman Date: Wed Feb 24 20:56:21 2016 -0700 Move rootfinder interface to math.asy. commit e92e7571479c2024522a882b3ee95a99120c09a5 Author: John Bowman Date: Wed Feb 24 20:40:10 2016 -0700 Reorder tolerance parameter as in original asy code and allow user control of default value. commit e435513b1a4faa461e3ce4387461653374eecf7a Author: John Bowman Date: Tue Feb 23 23:20:56 2016 -0700 Port findroot to C++ code, but reorder tolerance parameter to end of signature, to agree with argument order in calls from smoothcontour3. commit e78de7f99a7b94876805b6eea9b15c7a0c164c96 Author: John Bowman Date: Tue Feb 23 20:40:48 2016 -0700 Implement minor rendering optimization. commit 87c6ee109e9a615a51ebc76d4ea92b959ea4c20d Author: John Bowman Date: Tue Feb 23 19:00:20 2016 -0700 Fix bug #219 Asymptote forks in an uncontrolled way. commit cd9f8755715b8ce7e5b239ecd77fdff4d336411a Merge: e6454cb23 344698e2c Author: John Bowman Date: Tue Feb 16 17:41:59 2016 -0700 Merge branch 'master' into trianglewithnormals commit 344698e2cf2f16379139e8473c4a0970433689e5 Author: John Bowman Date: Tue Feb 16 17:41:21 2016 -0700 Fix epsilon. commit e6454cb2370e412699d467f451519ab89efd3f40 Merge: e5394afc3 75ce99693 Author: John Bowman Date: Tue Feb 16 17:29:10 2016 -0700 Merge branch 'master' into trianglewithnormals commit c3099c59cc61721fa9d08e1cd7ab22ddb0026bb5 Author: John Bowman Date: Tue Feb 16 09:32:10 2016 -0700 Fix epsilon. commit e5394afc350161459e7b78c28fd025f390a2f60e Author: Charles Staats III Date: Sun Feb 14 22:16:08 2016 -0800 Fix overlapedges for triangular patches. commit aa8a94e605e42c9742b880c50a62cf6432309d32 Author: Charles Staats III Date: Sun Feb 14 22:10:49 2016 -0800 Subdivide triangles with bad normals. commit f4f03e779e9e0d7143c98ca7a4f82e41ec3c2d6e Author: Charles Staats III Date: Sun Feb 14 21:57:12 2016 -0800 Make array reversal consistent with path reversal commit 58852de50bba1ee05eef4c7cd1042131006e711d Author: Charles Staats III Date: Sun Feb 14 21:09:17 2016 -0800 Make the orientation of the patches consistent. commit 652f8bbc027dd78d1d2be0f5cb8af24496fea2e5 Author: Charles Staats III Date: Sun Feb 14 17:09:01 2016 -0800 Use quadratic interpolation for rootfinder commit 75ce99693e881bc87a25ee1a57a90e2c8a88c95c Author: John Bowman Date: Fri Feb 12 16:13:26 2016 -0700 Fix bug #217 Reversion of one point guides. commit 213d56942fe5b9ef605e0ccf545527833319348d Author: John Bowman Date: Fri Feb 12 14:43:37 2016 -0700 Fix bug #218 Core dump in subpath routine. commit b7bcfe1c90e491e8fc284ea8e746af85495fb087 Author: John Bowman Date: Wed Feb 10 01:29:02 2016 -0700 Fix str().c_str() bugs. commit 2aed7cc04bb0ab928aa6a7086b977dc90c078a5e Author: John Bowman Date: Tue Feb 9 22:27:30 2016 -0700 Move \ASYdimen to asymptote.sty (version 1.30 now required). Remove support for obsolete media 9 package from 2013. commit 8d0eef70c60ce380f8919f8aa8d45467f2d9c3bd Author: John Bowman Date: Tue Feb 9 18:12:40 2016 -0700 Increase maxrefinements in bezulate. commit 25617a38c05e1cf7e5c0322c3cdb0b53c5f3a909 Author: John Bowman Date: Tue Feb 9 16:50:13 2016 -0700 Fix bug #215 Line adjustment won't work with scaled pens. commit 9ee82946a46323ca939a6ae10d666231486127df Author: John Bowman Date: Sun Feb 7 23:19:06 2016 -0700 Document in the manual that example file names link to the PDF output whereas their .asy extensions link to the corresponding Asymptote code. commit 760fddca0f402acc49894b8cc81056b4b97759be Author: Charles Staats III Date: Sun Feb 7 17:06:50 2016 -0800 Non compiling: start maketriangle function. commit 57d9d51c1bc79c2efe55087e291c35f51790b842 Author: John Bowman Date: Sun Feb 7 17:00:05 2016 -0700 Update copyright date. commit 691e8ef9241001b18dd3e3ad6f667f73da76c41e Author: John Bowman Date: Sun Feb 7 16:57:54 2016 -0700 Fix links in documentation. commit 2ad4f66eda6e71aaf24b15e67c5a1eb5c15332ae Author: John Bowman Date: Sun Feb 7 16:46:58 2016 -0700 Fix links in documentation. commit 7c33a39dbf1b41e29f251a81778019f722a38497 Author: John Bowman Date: Sun Feb 7 16:21:01 2016 -0700 Add links to documentation examples. commit d422d99bd9d22bfa57013fdf8de5d33aa637a71e Author: John Bowman Date: Sun Feb 7 11:12:47 2016 -0700 Fix bug #214 Minor bug in 'format'. commit 4c3480c2e5ae04e644382ceb9fa871206bcfee51 Author: John Bowman Date: Sat Feb 6 23:19:05 2016 -0700 Support --disable-gl again. commit afbd271363fde72afe17f54d5c5a408d24931437 Author: John Bowman Date: Sat Feb 6 17:06:42 2016 -0700 Improve comments in beziertriangle.cc. commit 5569c8d4fd3d84f121362aa18966eb8114cbe88d Author: John Bowman Date: Fri Feb 5 17:47:36 2016 -0700 Simplify code. commit b2d975013dfec4c2163b66286eacb8e6b9a71b56 Merge: a2dc30108 ce719ebe7 Author: Charles Staats III Date: Fri Feb 5 08:34:14 2016 -0800 Merge branch 'trianglewithnormals' of github.com:vectorgraphics/asymptote into trianglewithnormals commit ce719ebe712ae40a4fd31dc5e59b6c1f382cdfca Merge: 30d63a35b 9b9e8f579 Author: John Bowman Date: Thu Feb 4 23:18:11 2016 -0700 Merge branch 'master' into trianglewithnormals commit 9b9e8f579e58ce016754626275d9c03b1dc1cf11 Author: John Bowman Date: Thu Feb 4 23:05:28 2016 -0700 Simplify code. commit ab2042f994b6dd71c204ddaa59124b7f3644ee58 Merge: 5d97e7d70 a873617b4 Author: John Bowman Date: Thu Feb 4 23:03:06 2016 -0700 Merge branch 'master' of github.com:vectorgraphics/asymptote commit 5d97e7d70965fefa3814f09911be2e1a74cf1979 Author: John Bowman Date: Thu Feb 4 22:31:31 2016 -0700 Handle degeneracy in Bezier triangle normal calculation for render=0. commit a2dc30108b3979adb818333771fed8e278bd697c Author: Charles Staats III Date: Thu Feb 4 21:31:58 2016 -0800 Amend one comment. commit 8ec9865cc3fd4bc2cbded6e754ad4670e1920730 Merge: 6ca10836b a873617b4 Author: Charles Staats III Date: Thu Feb 4 21:20:20 2016 -0800 Merge branch 'master' into trianglewithnormals to incorporate bug fix for meshpen with bezier triangles. commit 6ca10836bade3c2540ebfbe4dc0c27ff782ad2f8 Author: Charles Staats III Date: Thu Feb 4 21:15:39 2016 -0800 Add comments documenting the trianglewithnormals function. commit b2efab65fb612318202964ae6fb80b50c925d315 Author: Charles Staats III Date: Thu Feb 4 21:11:31 2016 -0800 Simpler names for normals in trianglewithnormals parameters. commit a873617b4e481ea90c2ebce361932212b4c70df1 Author: Orest Shardt Date: Thu Feb 4 16:35:35 2016 -0500 Fix hex representation of colours commit 26629e8a350204d9fbd9095e5c59ca4bda35f6d9 Author: John Bowman Date: Thu Feb 4 13:24:27 2016 -0700 Fix planar Bezier triangles under render=0. commit 64e1d1ad3777e898febba132ac0aae152882c52d Merge: 03a2310b7 29806bc76 Author: John Bowman Date: Thu Feb 4 01:37:46 2016 -0700 Merge branch 'master' of github.com:vectorgraphics/asymptote commit 03a2310b72610252698115ba3d1ec44b0aba16a5 Author: John Bowman Date: Thu Feb 4 01:34:24 2016 -0700 Use git suffix for development tags and no suffix for release tags. commit 29806bc76d22752c59df49fb776f0a2f935d4331 Author: John Bowman Date: Thu Feb 4 01:34:24 2016 -0700 Use git suffix for development tags and no suffix for release tags. commit 30d63a35b8903e0a7fe45828c62bb4c1a0e0524a Author: Charles Staats III Date: Thu Feb 4 00:04:31 2016 -0800 Modify smoothcontour3 to use bezier triangles when convenient. commit 48b96a7f01add22951ac01806d22de912f9524bc Author: John Bowman Date: Wed Feb 3 16:53:47 2016 -0700 Add "git" suffix to version number for out-of-git builds to avoid confusion with official releases. Simplify Makefile. commit 12d4161bd25c0eda0d95a37437ba774b04a1eacb Author: John Bowman Date: Wed Feb 3 02:44:53 2016 -0700 Increment version to 2.37. commit e469422d232659d27a70527ddffc7f106be89698 Author: John Bowman Date: Wed Feb 3 01:12:14 2016 -0700 Tune subdivision crack correction under MSDOS. commit aa11277764072052888151cd3b0f61e4bf8cfbe1 Author: John Bowman Date: Wed Feb 3 00:36:18 2016 -0700 Fix segmentation faults in tab completion. Disable interrupts during input. commit d4f43f97de2f5f27d6de73c031f89404ecc0c4cd Author: John Bowman Date: Tue Feb 2 23:31:57 2016 -0700 Fix typo. commit 68a30fa19dbb2bd921cb33acc7e8c596372101af Author: John Bowman Date: Tue Feb 2 22:42:03 2016 -0700 Fix typo. commit 69d2e8de9cfb1757de8e731dfb7d9cce00047982 Author: John Bowman Date: Tue Feb 2 22:38:24 2016 -0700 Fix syntax. commit 076c074783d62f9a3215d7fec197c93f1c9b0ba2 Author: John Bowman Date: Tue Feb 2 22:31:31 2016 -0700 Force linking with static termcap library under MSDOS. commit 4584a9d97228811e6799752ff5a2a7b17246f4af Author: John Bowman Date: Tue Feb 2 10:14:02 2016 -0700 Simplify Makefile. commit 51ad22b3d66a3a75cc3034f49faf367320ec2a16 Author: John Bowman Date: Tue Feb 2 10:06:28 2016 -0700 Fix bug #213 glmovie.asy won't autoplay. commit 93d5b9af857e0ad80e606c7d63dbce32447cc892 Author: John Bowman Date: Tue Feb 2 01:59:10 2016 -0700 Simplify exit handler. commit d5e86339507734fd79f4748e9b3545bda20331b4 Author: John Bowman Date: Tue Feb 2 00:19:13 2016 -0700 Support out-of-git builds. commit cd2e963a3df5edbc4637c93cc4af4d643a490ce3 Author: John Bowman Date: Mon Feb 1 17:04:37 2016 -0700 Avoid glutLeaveMainLoop for portability. commit af5a253b6fdebd3c5994ccfee2c9ed9381c40a43 Author: John Bowman Date: Mon Feb 1 01:41:57 2016 -0700 Fix asy version generation. commit 927b4826c4d3590fe0c98eb9e704a834923a41aa Author: John Bowman Date: Sun Jan 31 23:42:31 2016 -0700 Move the genustwo image out of the documentation in case rendering isn't available. commit a637f3da094105154df8d36edb8aa46183d5fb5f Author: John Bowman Date: Sun Jan 31 23:39:22 2016 -0700 Use glutLeaveMainLoop to cleanly exit the renderer. commit 92985cc19f11946fc71648695fdc14efa7af8321 Author: John Bowman Date: Sun Jan 31 22:21:51 2016 -0700 Add OpenGL exit handler. Reinitialize autoplay on re-entry. commit f2b9fb741b4da18224d7ae276348902da6b71595 Author: John Bowman Date: Sun Jan 31 19:17:01 2016 -0700 Allow out-of-git builds. commit c0c7399cbdba43b8a77c2309e62b625371f8efcf Author: John Bowman Date: Sun Jan 31 19:01:34 2016 -0700 Fix revision generation. commit 100a73c67789448b909f4fcb36030d9a945849fa Author: John Bowman Date: Sun Jan 31 18:10:34 2016 -0700 Fix revision generation. commit 0a653376ee359d6854c1a470d40387859cf1eff9 Author: John Bowman Date: Sun Jan 31 17:37:18 2016 -0700 Fix segmentation fault due to zero normals. commit d9038241476195cb30aea8d3d6929c9d9b0e1b15 Author: John Bowman Date: Sun Jan 31 15:50:38 2016 -0700 Move PRC api functions into a new namespace prc. commit 6692b64b6eb470c948dade9e6a58e51b13096021 Author: John Bowman Date: Sun Jan 31 13:19:48 2016 -0700 Add convenience function graphicscale for using graphic with the conTeXt tex engine. commit b1d7e6d6d931b25e226df93cf5a123cd501a06f8 Author: John Bowman Date: Sun Jan 31 12:56:32 2016 -0700 Fix typo in 89fee36fec8a6d04d9c650e35f0170fba3f9ba4d. commit c3805bc4e3efaadec13911839200526734bcb809 Author: John Bowman Date: Sun Jan 31 11:10:04 2016 -0700 Do not override -render command-line option. commit 5909c90c67d3c5ba60de0397aac979ed8bbd6c83 Author: John Bowman Date: Sun Jan 31 11:05:33 2016 -0700 Display GLUT display after batch export. commit 699cf57921476f59b5ba2318c55f639da74717ce Author: John Bowman Date: Sun Jan 31 10:58:00 2016 -0700 Don't use threads in batch mode, except under MacOS X. commit e1eb284ff09fefc23d0eea83d79792bd6d2842e2 Author: John Bowman Date: Sun Jan 31 02:07:16 2016 -0700 Fix build issues. commit 2369d49a178d124d4d46ff0f8194b12ececac9e3 Author: John Bowman Date: Sun Jan 31 01:12:41 2016 -0700 Retain revision.cc. commit 89fee36fec8a6d04d9c650e35f0170fba3f9ba4d Author: John Bowman Date: Sun Jan 31 00:17:34 2016 -0700 Fix bounds calculation for straight nonplanar Bezier patches. Implement a degenerate patch representation, tensor(patch), to support render=0 for Bezier triangles. Optimize straight Bezier triangle bounds computation. Implement remaining Bezier triangle support functions for normals and colors. Keep local work arrays on stack. commit 7c172e08b045497718dd883120c160790c313435 Author: John Bowman Date: Sun Jan 31 00:14:47 2016 -0700 Update dependency documentation. commit c7771bb49a8037ac23d8cc6f6b6cc7fb4fb0fdda Author: John Bowman Date: Sat Jan 30 23:18:35 2016 -0700 Suppress getline compiler warning. commit 504d3e865985f30bbbb3b82cc3da7d1c50a758c8 Author: John Bowman Date: Sat Jan 30 17:32:07 2016 -0700 Fix missing double backslash in asy-mode.el. commit f87cbf83b1ac2c815d9d88e7c79b7e3a33992fb3 Author: John Bowman Date: Sat Jan 30 16:51:13 2016 -0700 Partially revert unintentional global changes in fc3ef0ec22b36083ace789436004ef88452a1feb regarding structure initialization. commit 9259e447295ead5927e4970a0b894e8eb70702c5 Author: John Bowman Date: Sat Jan 30 16:30:09 2016 -0700 Fix bug #208 Quotations are broken. commit 04d236c8d4ff9669ab98f829d278bcba4784584b Author: John Bowman Date: Sat Jan 30 15:44:45 2016 -0700 Fix #207 Infinite loop while reading files with trailing comments. commit 352441c0e661a3d1c9a4f7ff1f17f4c817481530 Author: John Bowman Date: Sat Jan 30 15:32:08 2016 -0700 Respect relevant explicit file dimensions only. commit 37ad3354d905a5fdde964e43a6306642d764b6c7 Author: John Bowman Date: Sat Jan 30 15:25:32 2016 -0700 Respect explicit file dimensions. commit 76a143bf9386df4f26095872f729fe8f23043edc Author: John Bowman Date: Sat Jan 30 11:50:40 2016 -0700 Optimize straight planar Bezier triangles. commit 21ec47af64f6fc0d895f6468a8148e59d3239a06 Author: John Bowman Date: Sat Jan 30 11:09:29 2016 -0700 Fix glrender quit function. commit 92615dd93332698574e6ab583907a3e495ddc554 Author: John Bowman Date: Sat Jan 30 10:27:41 2016 -0700 Fix #206 Bug while reading twodimensional data from file. commit d5a1cdf144ce152ccc520515ace87ca7c22c216e Author: John Bowman Date: Fri Jan 29 22:32:13 2016 -0700 Fix intermittent segmentation fault after export under threads. commit 4650f6153e2722630d177f9a6293e9f49c8ec0aa Author: John Bowman Date: Fri Jan 29 19:26:04 2016 -0700 Fix floating point exception in glrender. Don't iconify window in interactive mode. commit 1625eaca2240a7d04f12f07a456c1c1adea9c641 Author: John Bowman Date: Fri Jan 29 01:24:36 2016 -0700 Fix bug in rest argument signature equivalence. commit e59d44b1f641743f7eea53b18286f8ae71f7ad42 Merge: 3fcb88277 d70ce1214 Author: John Bowman Date: Fri Jan 29 00:58:56 2016 -0700 Merge branch 'master' of github.com:vectorgraphics/asymptote commit 3fcb88277e987140fda7d01b8dc886c2ba55ea2d Author: John Bowman Date: Fri Jan 29 00:57:41 2016 -0700 Implement Bezier triangle vertex shading; simplify notation. commit d70ce12140bcee8f60cf4b14d86345ea1a597d24 Merge: 9a8592962 4cca8cbac Author: John Bowman Date: Thu Jan 28 19:45:53 2016 -0700 Merge pull request #9 from syohex/fix-package Fix package format commit 9a85929623975d23856c6462efaf66c1b645337e Merge: fec79bd94 daa7b97df Author: John Bowman Date: Thu Jan 28 19:45:10 2016 -0700 Merge pull request #10 from purcell/patch-1 [asy-mode.el] Use "Major mode" rather than "Emacs mode" commit daa7b97df59ff24aaef230389c630dfdfa6a34dd Author: Steve Purcell Date: Fri Jan 29 14:21:18 2016 +1300 [asy-mode.el] Use "Major mode" rather than "Emacs mode" Using the work "Emacs" is redundant here. Better to describe this as what it is: a major mode. commit fec79bd94f87e1532ab8f90c46ebeffa8ef68a34 Merge: af459e8a8 799d62d72 Author: John Bowman Date: Thu Jan 28 18:06:22 2016 -0700 Merge branch 'master' of github.com:vectorgraphics/asymptote commit af459e8a8919f67e38894c6430d35bc325c7ba10 Author: John Bowman Date: Thu Jan 28 18:04:36 2016 -0700 Implement billboard interaction for Bezier triangles. Update documentation. commit 799d62d722ba943216dafb4db1f5a89ee9d1ffdc Author: John Bowman Date: Thu Jan 28 18:04:36 2016 -0700 Implement billboard interaction for Bezier triangles. Update documentation. commit 4cca8cbac3aae1b6fc70e3826b1cfafd55353270 Author: Syohei YOSHIDA Date: Thu Jan 28 08:01:22 2016 +0900 Fix package format - Fix footer format - Add missing colon at 'Version' header commit 3bae7f04bc68992f96f1c56f291940946f71d3f5 Author: John Bowman Date: Wed Jan 27 08:22:51 2016 -0700 Rename NaN to more standard nan, consistent with inf. commit 40222e2f183510bbc3e7642ab58abaae107837d7 Merge: 6d148e9d4 e6a9c8c33 Author: John Bowman Date: Wed Jan 27 01:44:30 2016 -0700 Merge pull request #8 from PythonNut/master Fix asy-mode.el headers for use with package.el commit 6d148e9d4cb76e7a62b38cd7917f13f7e6b14241 Merge: 120804c13 b4f5fd7f3 Author: John Bowman Date: Wed Jan 27 01:32:44 2016 -0700 Merge branch 'tpatch' commit 120804c135338ad70ed74c37f6391cf2bd31143b Merge: eeb634e5a dda2736d7 Author: John Bowman Date: Wed Jan 27 01:32:37 2016 -0700 Merge branch 'master' of github.com:vectorgraphics/asymptote commit b4f5fd7f3d7dc8c296e01e21b229f1e80e5e4a9e Author: John Bowman Date: Wed Jan 27 01:32:11 2016 -0700 Remove obsolete comment. commit dda2736d7adc54b42fb063ad04d9818c4dac1cad Merge: e86faf9a9 37a303655 Author: John Bowman Date: Wed Jan 27 01:28:31 2016 -0700 Merge branch 'master' of github.com:vectorgraphics/asymptote commit e86faf9a90abe8546db543ba1decb3db4709a7af Merge: 4243c5afa bb9a29b04 Author: John Bowman Date: Wed Jan 27 01:28:01 2016 -0700 Merge branch 'NaNconstant' commit 4abd683e6bcf1c03254a05d0f80dac2da49b796e Merge: 62f540f32 eeb634e5a Author: John Bowman Date: Wed Jan 27 00:53:10 2016 -0700 Merge branch 'master' into tpatch. commit eeb634e5a0b9eabcc17e04166be66ba536e8f165 Author: John Bowman Date: Wed Jan 27 00:41:18 2016 -0700 Remove unused normal code. commit 37a30365560aa79a4aac37850774fee8c55a526a Author: John Bowman Date: Wed Jan 27 00:20:15 2016 -0700 Move AtA routine to C++ code and matrix leastsquares routine to math.asy. Remove unused code. commit ca322df57721accecf9ae154b68a52700549b15d Author: John Bowman Date: Wed Jan 27 00:18:08 2016 -0700 Fix clang warning regarding std::abs. commit 81a216c7d9d5b7e42782baa7d663f0296ee1aa3b Author: John Bowman Date: Wed Jan 27 00:17:23 2016 -0700 Fix undefined variable. commit 1d3691a096c830a8d9729797bded0432346a80d6 Author: John Bowman Date: Wed Jan 27 00:12:31 2016 -0700 Fix memory deallocation in copyTriples. commit 4243c5afadb408d3f4b2c3dc39ae3648724de812 Author: John Bowman Date: Tue Jan 26 23:58:04 2016 -0700 Use fabs instead of abs in page alignment code. Optimize copyTransform3. commit 46e8944d7118204a3fdfd93df6ab13574ed4817b Author: John Bowman Date: Tue Jan 26 23:28:51 2016 -0700 Work around floating point division bug in clang 3.7.0. commit bb418555390c49b393e5377f695468651f93d6df Author: John Bowman Date: Tue Jan 26 19:48:19 2016 -0700 Fix segmentation fault due to accessing "this" at top level. commit bbd447f3c277a1ebc55163c187bfd223eee93bad Author: John Bowman Date: Mon Jan 25 22:27:01 2016 -0700 Remove fixed outformat and render settings from example. commit 62f540f32b879fac92863909de8eec7fcd911b27 Author: John Bowman Date: Sun Jan 24 23:21:13 2016 -0700 Don't subdivide straight segments. commit bb9a29b0449ec8b7a3a993e45981ea2930a8e07d Author: Charles Staats III Date: Sun Jan 24 19:06:22 2016 -0800 Add constant NaN for quiet real satisfying isnan(NaN) commit 76ee4365d32fd976117768a6b3db5f33d3284225 Author: John Bowman Date: Sun Jan 24 12:26:06 2016 -0700 Fix index entry in documentation. commit cd447e1479be3a9f30f6c476ce5fcb13a03b9cfa Author: John Bowman Date: Sun Jan 24 04:40:39 2016 -0700 Fix segmentation fault on glrender quit after export. commit b585ccab275b35b363382670d2d6a837fc699707 Author: John Bowman Date: Sat Jan 23 21:10:09 2016 -0700 Revert "Allow a user-specified normal function for rendering a bezier triangle." This reverts commit 83d8788e40b091142617e08e9840f2cb95e2147f. commit 8b25b245c67870f5414fe0f2c07295c5b95c8704 Author: John Bowman Date: Sat Jan 23 20:54:44 2016 -0700 Express Bezier triangle as a degenerate Bezier patch. commit e6a9c8c33caf317806ad73d057d9806aef505c48 Author: PythonNut Date: Sat Jan 2 17:20:29 2016 +0000 Fix asy-mode.el headers for use with package.el commit 2d94de48d0567f29f07646b523e1be30cf5e248b Author: John Bowman Date: Mon Dec 7 00:42:20 2015 -0700 Define PERL. commit 2292b4e20cec169b8e49ffd90c266fe0c481280c Merge: 83d8788e4 2f0e11d1d Author: John Bowman Date: Sat Dec 5 11:59:38 2015 -0700 Merge branch 'master' into tpatch commit 2f0e11d1dba5117c9b912713c0ea728e546ca2db Author: John Bowman Date: Sat Dec 5 11:56:51 2015 -0700 Replace perl by $(PERL). commit 098bb7af2fa3b8856942e61d911f29607597ffd8 Author: John Bowman Date: Sat Dec 5 11:49:06 2015 -0700 Fix animations by running LaTeX twice. commit 83d8788e40b091142617e08e9840f2cb95e2147f Author: John Bowman Date: Wed Nov 18 04:02:03 2015 -0700 Allow a user-specified normal function for rendering a bezier triangle. commit 0819e0f712c330016b99b5e41ef44c315da82ea6 Author: John Bowman Date: Tue Nov 17 13:27:01 2015 -0700 Remove remaining instances of Triple type (except one instance in glrender). commit bf3be19f7f1daf5730dabbf5c89e8a4f0f451a7d Author: John Bowman Date: Tue Nov 17 10:56:50 2015 -0700 Remove Triple type from Bezier patches. commit 454d3ff4526b775f4a70de6056d94134c535e070 Author: John Bowman Date: Tue Nov 17 00:50:01 2015 -0700 Begin removal of Triples type. commit 88cb6ae530ae29bd527ccb74d57734ad0f0b45e3 Author: John Bowman Date: Mon Nov 16 00:00:44 2015 -0700 Fix Bezier triangle bounds calculation. commit 78c5a4dc967871262371bc09a752c4f7c3a0982e Merge: 3bdb0da5d 71ff9e769 Author: John Bowman Date: Sun Nov 15 11:47:01 2015 -0700 Merge branch 'master' into tpatch commit 71ff9e769ba5d9995b367201f0d41b7a8dedab9d Author: John Bowman Date: Sat Nov 14 01:25:56 2015 -0700 Support GSL 2.0. commit 3bdb0da5d7762bdc3509cbbd3aadfea392065729 Merge: 342bd39a6 d7d0920cf Author: John Bowman Date: Fri Nov 13 15:22:31 2015 -0700 Merge branch 'master' into tpatch commit d7d0920cfd14460443e9b7324a2f4565803eb882 Author: John Bowman Date: Sun Nov 8 14:01:03 2015 -0700 Update FFTW++ files. commit d98ea127a2e5406695f565b32f0ca108f5d7d652 Author: John Bowman Date: Tue Oct 20 16:49:54 2015 -0600 Sort patches by projected distance. commit 27ff6755e9aa215897582437ffdec4fab802439e Author: John Bowman Date: Sun Oct 18 09:21:25 2015 -0600 Only create initdir if localhistory=false. commit e46e8fde24b98a5ef21e4987c9658eda173c7bcf Author: John Bowman Date: Mon Oct 12 10:32:37 2015 -0600 Fix numerical precision bug in smoothcontour3. commit 342bd39a699140df5a3f14778e8650a674968980 Author: John Bowman Date: Thu Sep 3 02:02:23 2015 -0600 Implement bezier triangles in surfaces. commit ca9e11656fbf984095574d831b7e04a01881c3be Author: John Bowman Date: Wed Sep 2 13:42:10 2015 -0600 Implement patch member functions for Bezier triangles. commit 45fff990d00b3dee968203b10e2cb8515f7a3662 Author: John Bowman Date: Fri Aug 28 18:18:42 2015 -0600 Implement preliminary Bezier triangle constructor. commit 583fa290fc5eedb0a2913d132ad3dc6ea1284672 Author: John Bowman Date: Fri Aug 28 17:51:09 2015 -0600 Use unnormalized normal in degeneracy test. commit 16375adac6c947afa34d6626e40a7872a636bea6 Author: John Bowman Date: Fri Aug 28 17:00:01 2015 -0600 Optimize degenerate normal computations. commit c27701a82588751d407f6558664caa89f520cf44 Author: Jesse Frohlich Date: Fri Aug 28 15:22:57 2015 -0600 Optimizations for degenerate normal computations of Bézier triangles. commit e8232ba4732836b3b12b552d6e2517730d479079 Author: Jesse Frohlich Date: Thu Aug 27 14:49:08 2015 -0600 Add higher-order normal computations for degenerate Bézier triangles. - Depending on the magnitude of the computed normal, higher order derivatives are used as needed. - Normals are now computed relative to the central sub-triangle, which aligns better with the symmetry and (seems to) avoid degeneracies. commit 9607b89ce3b1dd6f41905b3ca7225304a78a4236 Merge: b186e65ab e660681eb Author: Jesse Frohlich Date: Tue Aug 18 10:56:13 2015 -0600 Merge branch 'master' into tpatch commit e660681ebbbd374ce253ac4acfeeb35c915e9681 Author: Jesse Frohlich Date: Tue Aug 18 10:13:02 2015 -0600 Update ignore file to include .dSYM files. commit df296910c6f09b5c32ed6ed21f6a95f6abf31a82 Author: Charles Staats III Date: Sun Aug 16 18:58:58 2015 -0700 Give read-only git command in documentation. commit 6a4cc1c35b18138e29bc1f4adb877479840bea1a Author: Charles Staats III Date: Sun Aug 16 18:21:46 2015 -0700 Remove extraneous import in doc/genustwo.asy. commit acfd5cf8d54dec2bd76eedce85aa1c95c397b25e Author: Charles Staats III Date: Sun Aug 16 18:16:23 2015 -0700 Rename example lemniscate.asy to genusthree.asy and add explanatory comments. commit b186e65abfe84163c2f25a785186998d539b3980 Author: Jesse Frohlich Date: Thu Aug 13 17:34:20 2015 -0600 Simplify test for flatness of a Bezier triangle. Also minor formatting changes and performance optimizations. commit 619e46ba9a321182b6766661b7c17c72036eb55a Author: John Bowman Date: Thu Aug 13 13:45:48 2015 -0600 Fix size3 computation. Use alternative shift for removing subdivision cracks. commit 0f412644c1e3a0a802a3b69b1e23ebbe352dcd55 Author: Jesse Frohlich Date: Wed Aug 12 16:44:28 2015 -0600 Subdivision cracks are only filled when necessary; clean up comments. Only when an edge of a sub-patch transitions from non-flat to flat is the middle vertex shifted to cover the potential crack. commit 6f39592e491ba315065a66d329fa5c9936763e16 Author: John Bowman Date: Tue Aug 11 13:37:18 2015 -0600 Simplify and optimize straightness and flatness tests. commit a5148efe0fcc8ccedc46537c697c2131bb9de356 Author: Jesse Frohlich Date: Tue Aug 11 11:06:29 2015 -0600 Added non-adaptive renderer for Bezier triangles (testing). commit f2dad19906c350e45ea746b363f5b38cacdba51f Author: Charles Staats III Date: Sat Aug 8 10:38:56 2015 -0700 Add documentation for the smoothcontour3 module. commit 75d296d045d374f74a5a55daba15fe0caeed5966 Author: John Bowman Date: Fri Aug 7 14:49:02 2015 -0600 Use vector container for bezier triangle vertices and normals. commit bf4fd0d0e0719295e97ea8befaa4def2cd197dfe Author: John Bowman Date: Thu Aug 6 18:03:19 2015 -0600 Condense code. commit afc9bb50d32bc30a60e8ec14130f459ee3d07324 Merge: 831156114 6d6409960 Author: John Bowman Date: Thu Aug 6 16:59:34 2015 -0600 Merge branch 'master' of github.com:vectorgraphics/asymptote. commit 8791d101a628f7e3d16398f2302f21853d522d2a Author: Jesse Frohlich Date: Thu Aug 6 16:01:54 2015 -0600 Remove old, unused comments. - The function renderBisec() is now gone, as it is severely outdated (and its output mesh does not look as good as render()'s). - Other old commented out tests are removed. commit 83115611436bd41a611ee316e03eeaaae31e0f0a Author: John Bowman Date: Thu Aug 6 00:26:15 2015 -0600 Fix readline and gc configuration. commit 611ecadfcfad2df353278388b99a96521227f8d8 Author: John Bowman Date: Thu Aug 6 15:40:24 2015 -0600 Simplify code. commit 9a719d5a367ea6bb04ccc7d43d1b9d9ef8461ccf Merge: 10b58e6fb 6d6409960 Author: John Bowman Date: Thu Aug 6 15:03:39 2015 -0600 Merge branch 'master' into tpatch. Conflicts: configure.ac commit 10b58e6fb9c66b725c78afa5b18c356deeaa5d70 Author: Jesse Frohlich Date: Thu Aug 6 13:23:20 2015 -0600 Move the computation of normals to reduce redundant computation. Before, normals were computed as triangles were pushed to the indices array. However, this caused the same normals to be needlessly recomputed (up to six times, half of which we cannot avoid without a major overhaul). By moving the normal calculation to occur at the same time as the vertices are added to the buffer, most of the redundant normal computations have been removed. commit 6d6409960d4e1c558fe29e008849354cced4dee4 Author: John Bowman Date: Thu Aug 6 00:26:15 2015 -0600 Fix readline and gc configuration. commit f98f52f1a9f5e235d7d7803d167cdfe02618a8e4 Author: John Bowman Date: Wed Aug 5 23:43:41 2015 -0600 Fix configure. commit b742f1cea57be805f7480bcba9702d33d85c29d5 Author: John Bowman Date: Wed Aug 5 14:08:40 2015 -0600 Fix configure --enable-gc. commit e13974901f1b3fca83f1424056c42a150e03aaf3 Author: John Bowman Date: Wed Aug 5 14:08:40 2015 -0600 Fix configure --enable-gc. commit 36e902acfbee47560473e4a66c4ae921f969bc6e Author: John Bowman Date: Wed Aug 5 12:39:15 2015 -0600 Update to latest beziertriangle.cc. commit f27143b2c09b588397d2a357b6663f9872ab1526 Merge: ce5d022f6 8f3274d4b Author: Jesse Frohlich Date: Wed Aug 5 12:35:30 2015 -0600 Merge branch tpatch of github.com:vectorgraphics/asymptote into tpatch. commit ce5d022f62ed7f836a20832bd502726b6c38f816 Author: Jesse Frohlich Date: Wed Aug 5 12:27:33 2015 -0600 Add missing file beziertriangle.cc; improve bounds checking. The implementation for Bezier triangles now compiles. commit 8f3274d4b9fea2c5afbce309019779c71874f387 Merge: 6510a213c b1041ff1a Author: John Bowman Date: Wed Aug 5 12:20:34 2015 -0600 Merge branch 'master' into tpatch. commit b1041ff1ac39490a5729e3851f760d3a8afc8e54 Author: John Bowman Date: Wed Aug 5 12:19:11 2015 -0600 Update ignored files. commit 18942d691550eeb37826c1fc06e46b7ad361a3c1 Author: John Bowman Date: Wed Aug 5 12:18:11 2015 -0600 Add example. commit 0c9443bed41f84d8c38deac9df0be0c62474ebf4 Merge: 6510a213c 421cd19d0 Author: Jesse Frohlich Date: Wed Aug 5 10:28:02 2015 -0600 Merge changes in master branch to tpatch. commit 421cd19d01577dab0f3b92d89eaf1e1edf6487c2 Merge: ecae5ee66 94fb5fb67 Author: John Bowman Date: Tue Aug 4 18:01:02 2015 -0600 Merge branch 'master' of github.com:vectorgraphics/asymptote commit ecae5ee663aab1a18f4e7ba22c3943df68729f54 Author: John Bowman Date: Tue Aug 4 17:54:37 2015 -0600 Update INSTALL. commit 6510a213c1796ca03fce1c190300be98f2ddc208 Author: John Bowman Date: Tue Aug 4 17:54:37 2015 -0600 Update INSTALL. commit 94fb5fb6792662366f0d0d9587bb2504a71c77bd Merge: 2cb41a4e6 86920ebf9 Author: johncbowman Date: Tue Aug 4 17:14:19 2015 -0600 Merge pull request #1 from phro/ignore Update list of ignore files to include the FAQ. commit 86920ebf9df177045cceaaf77245eefb6d037790 Author: Jesse Frohlich Date: Tue Aug 4 11:52:45 2015 -0600 Update list of ignore files to include the FAQ. commit 5f133444335014674347e56e5bc55f817c3b3cab Author: John Bowman Date: Tue Aug 4 14:19:49 2015 -0600 Implement preliminary Bezier triangle rendering. commit 2cb41a4e63d839fe2588ec08a8f46038cdc7253a Author: John Bowman Date: Mon Aug 3 10:16:26 2015 -0600 Remove unused code; update list of ignored files. commit 535e8daeb3e6c555dca9fc85281dc42f4ac5f74a Author: John Bowman Date: Sat Aug 1 20:46:22 2015 -0600 Convert remaining subversion references to git. commit 651884410a8a408f5d6e3e09c191b51f318d182e Author: John Bowman Date: Sat Aug 1 20:35:58 2015 -0600 Update documentation for git. # doc/png/LaTeX-usage.html commit ce373e1267e1980aca6aefd86822c7daf92cc6d8 Author: Jesse Frohlich Date: Mon Jul 27 14:49:26 2015 -0600 Modified version checking for the conversion of repository to git. - Added a .gitignore for untracked files - Version checking now uses `git describe` instead of `svn info` - Removed references to SVN (except in the documentation). commit 19935165f3617e48f129c5d4f29bca8b4891a885 Author: John Bowman Date: Thu May 21 20:12:50 2015 -0600 Fix bug #192. commit 9dc3510333a92b71d735ed8ed47f33ac7becb368 Author: John Bowman Date: Wed May 20 17:18:25 2015 -0600 Revert 2.35-2. commit ee5e0e6b05d98db0896c5507870d8d5b74fdc294 Author: John Bowman Date: Wed May 20 17:17:48 2015 -0600 Close input file before deleting it. commit 4b00bd5297ad91a56af7c74e59a1854865749e8a Author: John Bowman Date: Tue May 19 18:25:19 2015 -0600 Increment version to 2.36svn. commit 4d0f494686133e553744bf7224e8de9e71a9fe66 Author: John Bowman Date: Tue May 19 16:19:23 2015 -0600 Update documentation. commit 84499463e395a2953059b659afe614a9f207c083 Author: John Bowman Date: Tue May 19 15:43:15 2015 -0600 Work around eps2write bug that forces all postscript to first page, breaking multiple 3D xelatex and context labels. commit 9c773c0f665eaeee061ce44e2bf76b43419b9c24 Author: John Bowman Date: Tue May 19 14:31:06 2015 -0600 Replace duplicate files with symbolic links. commit eb674d6156054584fcc2a462ff4291fb45b65813 Author: John Bowman Date: Mon May 18 13:51:02 2015 -0600 Support rendered 3D context images. commit f77d4b0755136d8cbe09cd4ef6eb4bc34bf1ab79 Author: John Bowman Date: Sun May 17 11:04:51 2015 -0600 Increment version to 2.35svn. commit 58a66182ae47112741ec73b2d6e0f61c9e4f51a3 Author: John Bowman Date: Sat May 16 12:41:33 2015 -0600 Update ghostscript URL. commit ffc1bc4ddbd6b9480e050db5f617f57dfe46f806 Author: John Bowman Date: Thu May 14 00:45:17 2015 -0600 Improve readability of named pen colors documentation. commit a4fd4d552fde1ee9ecdd973d2936439ff4c3585d Author: John Bowman Date: Thu May 14 00:39:39 2015 -0600 Add surface cone(path3 base, triple vertex) to construct an approximate cone over an arbitrary base, courtesy of Charles Staats. commit c09d358301e167f872bcf75c12745a40706c21bd Author: John Bowman Date: Thu May 14 00:07:11 2015 -0600 Update documentation; remove obsolete cygwin patch. commit 4c769e62cd6d96c3f9f67e1c66796325a3513614 Author: John Bowman Date: Wed May 13 09:00:23 2015 -0600 Add test for Ghostscript 9.14 or later. commit ceca1ed11db34ac423d58dbc41a2dddc55872700 Author: John Bowman Date: Sun May 10 23:45:09 2015 -0600 Increment version to 2.34svn. commit a8811fb8386f782a5774a3b102892efc13347a88 Author: John Bowman Date: Sun May 10 22:35:32 2015 -0600 Enable progress reporting if verbose > 1. commit 22bd2d4f493b5afc4d8dc3667995d71194cec4db Author: John Bowman Date: Sun May 10 22:09:46 2015 -0600 Update to gc-7.4.2. commit 48de4019eb5d5539d8bccd9626b93b4e84414656 Author: John Bowman Date: Sun May 10 21:30:56 2015 -0600 Implement aligndir option for aligning picture to arbitrary point of page boundary. commit 6c0219cdba0907038cd935b764cc28159071f685 Author: John Bowman Date: Sun May 10 17:50:49 2015 -0600 Fix default. commit 1ab06dabc6aa79b4a9c7dd0068dbe73076965598 Author: John Bowman Date: Sun May 10 17:47:40 2015 -0600 Add \def\asylatexdir{DIR} option to support pdflatex -output-directory=DIR. commit fd33ea8828db5e2f5bc4b374fed9810b3d5f16f7 Author: John Bowman Date: Fri May 8 12:43:31 2015 -0600 Added Charles Staats' smoothcontour3 module, with example. commit b5c417139db78281c926a91713c418b681b915f0 Author: John Bowman Date: Fri May 8 11:42:00 2015 -0600 Fix definition of SimpleHead. commit 2a34461017a2d05d95e2d1a8768fb248a97487f6 Author: John Bowman Date: Fri May 8 09:01:42 2015 -0600 Remove outdated comments. commit d6b39082b10ff1ca98ff3a32e75734a00f26a467 Author: John Bowman Date: Fri May 8 08:52:49 2015 -0600 Fix image dimensions. commit 87d6aa316273693cc4550c59bc6f31118f6b67d4 Author: John Bowman Date: Fri May 8 08:42:04 2015 -0600 Change default meshlight to nolight so that mesh lines with positive width appear consistent with default single pixel width mesh lines. commit 387f777b59014fbe2dbddcb53767f3413fb30121 Author: John Bowman Date: Thu May 7 19:00:00 2015 -0600 Fix cond handling in parametric surfaces. commit e5a05d458b74767054aa510eeb721ff652243d33 Author: John Bowman Date: Thu May 7 12:25:16 2015 -0600 Fix sign. commit e310c0f312936d878cea4633726a649bbbba5f7f Author: John Bowman Date: Thu May 7 12:22:07 2015 -0600 Fix path arc(pair B, pair A, pair C, real r). commit faa0033acfb6724a7cc1aaa56a0658fbc86a01be Author: John Bowman Date: Sun Apr 26 20:03:36 2015 -0600 Work around backwards incompatible dvisvgm pt to bp unit change on 2014-04-09. commit 9040319f6f982a400450d10f4aff01016a745940 Author: John Bowman Date: Wed Apr 8 16:55:28 2015 -0600 Force deconstruct to use the C locale. commit bc6e637938ef8f55f8e6f4947cc0d3d8c09f6400 Author: John Bowman Date: Mon Apr 6 23:07:04 2015 -0600 Fix mismatched array delete operator. commit 8815ffb186bf0b4237449b4b7a1277abf5751d6d Author: John Bowman Date: Mon Apr 6 18:18:26 2015 -0600 Work around missing epswrite driver in ghostscript-9.15. commit c54a574d1651409338755f5b8053bc5df65f487d Author: John Bowman Date: Thu Mar 26 15:01:22 2015 -0600 Remove obsolete workaround for an Adobe Reader transparency artifact. commit 71be140eb57bd5fdc78184f70085cfc59fd224d4 Author: John Bowman Date: Wed Dec 10 10:29:51 2014 -0600 Fix inline option when importing asymptote.sty with xelatex. commit f96c6012571c7730d8e2f27c25bebe76200a8108 Author: John Bowman Date: Wed Dec 10 10:09:16 2014 -0600 Fix documentation and example. commit d1b3c93701690dadbb6860d4a4ae6aa9cec4bef4 Author: John Bowman Date: Wed Dec 10 10:08:50 2014 -0600 Rename function argument of integrate in ode.asy to correspond to documentation. commit 837732414bad047f36c6bb5f90865f2e369cdb02 Author: John Bowman Date: Wed Dec 10 10:01:12 2014 -0600 Simplify code. commit 5951acaf37553526e3791312b88dfd30d9444bf1 Author: John Bowman Date: Wed Sep 24 15:20:00 2014 -0600 Remove ambiguity from min(guide) and max(guide). commit 3008a5d5e97a17d17f62d14bf415312e9b9bece1 Author: John Bowman Date: Wed Sep 24 14:43:54 2014 -0600 Indexed figures should always be stepped. commit dcaac67c5c1321b8f4d5d60b6333b74908ffe2d2 Author: John Bowman Date: Fri Aug 29 16:44:23 2014 -0600 Fix overlap fuzz parameter. commit 26bd9c01a123125af867a0a9f05d395cd82ed383 Author: John Bowman Date: Fri Jun 20 14:51:28 2014 -0600 Implement and document intersect(path, surface). commit 5264dc6549a4b970494268a9b9e1fc7aad9599db Author: John Bowman Date: Fri Jun 6 16:59:31 2014 -0600 Fix zoom/menu button. Fix play option. commit 5acad030c52fed21506a03dba862e3e703ae2db7 Author: John Bowman Date: Mon May 26 10:57:02 2014 -0600 Implement 2D scalar cross product. Improve documentation of orient and insphere functions. commit 3bb879f344ba646c59666804f665ca2ad1c37f76 Author: John Bowman Date: Fri May 23 00:39:03 2014 -0600 Increment version to 2.33svn. commit aab6ce9a7b4cbb5acd388341e7ed18c93eec447b Author: John Bowman Date: Thu May 22 09:40:58 2014 -0600 Allow overriding CXXFLAGS with CFLAGS so that make CFLAGS="-g" disables optimization (for debugging). commit 673f282372345e1b16afa56621f05c80c90f60cd Author: John Bowman Date: Thu May 22 01:12:56 2014 -0600 Rename side(pair,pair,pair) to orient(pair,pair,pair). Also provide interfaces to orient(triple,triple,triple,triple) and insphere(triple,triple,triple,triple,triple). Fix and update documentation of orient, incircle, and insphere. commit e5cfca855b2103b44863ad14680eba3ffa8e4c50 Author: John Bowman Date: Mon May 19 13:16:29 2014 -0600 Use gs instead of convert to generate latexusage.png. commit 43d4956ed3e03a9eb692f218cddcf590597c0194 Author: John Bowman Date: Mon May 19 08:27:39 2014 -0600 Guard agains random() returning a 16-bit result. commit 887886fda5397d80f841bdc18055a3eba3c9147f Author: John Bowman Date: Mon May 19 00:53:09 2014 -0600 Use random() instead of rand() everywhere. commit e5884384ba49856467921fccee133505007e3024 Author: John Bowman Date: Mon May 19 00:44:20 2014 -0600 Use RANDOM_MAX rather than nonportable RAND_MAX. commit 43e146ccb44494e6ff41a273264d457982a2d4b1 Author: John Bowman Date: Mon May 19 00:43:14 2014 -0600 Fix version mismatches when releases are imported via svn. commit 815c23058dedee81fff90b9703d5470da568999f Author: John Bowman Date: Sun May 18 15:19:31 2014 -0600 Test that unitrand is in [0,1]. commit 35bc98ccc26a9631bfe0c0e803421dac32aff46a Author: John Bowman Date: Sun May 18 12:14:26 2014 -0600 Remove obsolete test for texi2dvi4a2ps. commit 6ce8f7be7c4188702832936aad1963fa43f86bd8 Author: John Bowman Date: Sun May 18 11:16:55 2014 -0600 Suppress compiler warnings. commit c74a6fa979efc2faa65d3a825d8d8dbbdb8e2bce Author: John Bowman Date: Sat May 17 13:24:35 2014 -0600 Document context tex engine. commit cf658a84fa4f9559881f25dbeb52615c63dbaf48 Author: John Bowman Date: Sat May 17 09:54:46 2014 -0600 Enable libc++ workaround also for FreeBSD. commit 1fda160c4ec958643b1db59e5a5ac267fe1fd8cc Author: John Bowman Date: Sat May 17 02:43:23 2014 -0600 Fix segment(bool[] b). commit 906ed8354d900fce7a773918f63cfcc2716eb791 Author: John Bowman Date: Sat May 17 02:02:09 2014 -0600 Increment version to 2.32svn. commit a35298302fafdd633be3684e2206823f584214ad Author: John Bowman Date: Fri May 16 23:32:06 2014 -0600 Fix hangs in 3D font generation and the "none" tex engine. Disable the MacOS 10.9 libc++ workaround on other platforms. commit 8bb07a22fecfb7a45c7263cb3ddc59e696378b1b Author: John Bowman Date: Fri May 16 18:59:29 2014 -0600 Increment version to 2.31svn. commit f3b4f36a04b7811d2da33915a911d8b2d91d4101 Author: John Bowman Date: Fri May 16 16:45:44 2014 -0600 Fix zoom/menu button. commit 1ff6bfaffecd392400c967ced8b099c41e1786e8 Author: John Bowman Date: Fri May 16 15:15:33 2014 -0600 Workaround broken stringstream in MacOS 10.9 libc++. commit 116aed3e51ebc40e616ab8be671b6b546ad6c9ed Author: John Bowman Date: Fri May 16 10:00:52 2014 -0600 Remove optional space. commit d7cf1c526194a0ad4e6302dcd0502bb6f97b1f21 Author: John Bowman Date: Fri May 16 09:45:21 2014 -0600 Add CXXFLAGS. commit 40191b8489e7d0a7353ae095a42def96783a0a6c Author: John Bowman Date: Fri May 16 00:11:20 2014 -0600 Use blocking reads by default. commit ef53cfa578c42f47dba80865b0e55ad490b78f34 Author: John Bowman Date: Thu May 15 22:15:21 2014 -0600 Simplify code. commit 153786ecdf9663ffb8bd81d7740c5b6c54f270ef Author: John Bowman Date: Thu May 15 22:13:58 2014 -0600 Revert temporary division by 0 in transform of a triple workaround. commit 4506f002e141a10036b643bd8fc5148d0a165c09 Author: John Bowman Date: Thu May 15 14:16:42 2014 -0600 Support 3D for all texengines (but prc only for latex texengines). commit f91f293cf477235d1de48237263ebb2e0f4a9354 Author: John Bowman Date: Thu May 15 10:56:24 2014 -0600 Improve TeX pipe interaction. commit 72d872d6e72a8511595179a59b0f01804c5e29ec Author: John Bowman Date: Thu May 15 09:28:22 2014 -0600 Suppress warning messages. commit 2215a2cfd706dbd24fb2094aa3380cb035724fd6 Author: John Bowman Date: Thu May 15 09:09:25 2014 -0600 Fix typo. commit ff2712d3618f318bf6db02e4c648bcc3cb184eb7 Author: John Bowman Date: Thu May 15 08:34:10 2014 -0600 Use standard STL include. commit 8fd6bbe57cf7e66f2c83fc10e074fea292336683 Author: John Bowman Date: Thu May 15 03:22:27 2014 -0600 Increment version to 2.30svn. commit 2e960e254b94517748900132fbc2000eef0bb5f5 Author: John Bowman Date: Thu May 15 01:52:40 2014 -0600 Enable page breaks and 3D OpenGL with ConTeXt TeX engine. commit 5d075b9a5b11339805274fce6f8e2c19281ea4df Author: John Bowman Date: Wed May 14 23:28:38 2014 -0600 Fix inlineimage. commit e5eaf4cff2216fbff79fd8fd0ce3851baaf50e86 Author: John Bowman Date: Wed May 14 22:54:25 2014 -0600 Fix inlinetex. commit 3be75974318793c71bf8ded449200db2c4da40ae Author: John Bowman Date: Wed May 14 19:02:41 2014 -0600 Try to recover from division by 0 in transform of a triple. commit 05dda17c86f49194e00e4a69d1feb43928cda860 Author: John Bowman Date: Wed May 14 18:16:01 2014 -0600 Use list unconditionally. commit d9c4961a64b6dd3de6afe133077121a46aefc7f3 Author: John Bowman Date: Wed May 14 18:03:50 2014 -0600 Fix typos. commit 4158adf56fe355f719357a6bdd96911092265180 Author: John Bowman Date: Wed May 14 17:34:17 2014 -0600 More portability tweaks. commit e4276c4bf1b6c901e92b3c9178639c7446225128 Author: John Bowman Date: Wed May 14 16:44:10 2014 -0600 More portability tweaks. commit f39be071dfe433f17f2320dc696a54de76f1a08c Author: John Bowman Date: Wed May 14 15:49:17 2014 -0600 Simplify code. commit 39595952a0fa67fd389321f31abedf77d09f59a3 Author: John Bowman Date: Wed May 14 15:43:56 2014 -0600 Update reference card. commit 1a0b7b7f7f6ce640645d7425c5a852d2628b76c9 Author: John Bowman Date: Wed May 14 00:06:11 2014 -0600 Remove duplicate variable. commit 6f907f069ad9afe6e196ff3409ad4b77629ddb3d Author: John Bowman Date: Tue May 13 22:51:12 2014 -0600 Reinstate tailequals to support MSDOS in bidirectional tex pipe. commit aa55151ab18c1ae55a6db2cf02438fd3f72fe695 Author: John Bowman Date: Tue May 13 21:04:05 2014 -0600 Improve bidirectional pipe; re-enable context tex engine. commit 1b358479976b72db51759ea295d7195c5fdc641a Author: John Bowman Date: Tue May 13 00:23:51 2014 -0600 Remove support for the ConTeXT tex engine since piping is broken in the latest (mkiv) version. Add support for luatex and lualatex. commit a25e92d4aad28aa4c2e0c9cf3379e8c93b061077 Author: John Bowman Date: Mon May 12 19:38:09 2014 -0600 Update ConTeX support. commit c67f96b85e7ffd05caeb3c2cbc593d553fbfca25 Author: John Bowman Date: Mon May 12 18:59:22 2014 -0600 Portability tweak. commit 539e4b1a6ab1c7adfee52e5d08630ee57df7428a Author: John Bowman Date: Mon May 12 14:12:43 2014 -0600 Remove dependency on \put (contributed by Mojca Miklavec). commit 1b8c235a646a33c38915424adefe7d671e2a07aa Author: John Bowman Date: Sun May 11 17:27:29 2014 -0600 Increment version to 2.29svn. commit a21ae576230fe42f202576d4702337b1e6cb4813 Author: John Bowman Date: Sun May 11 14:56:56 2014 -0600 Reduce number of allowed bezulate refinements to maxrefinements (default 7). commit 4d62b40e408a110bc6aee8b0c536c8244681c2b6 Author: John Bowman Date: Sun May 11 14:55:52 2014 -0600 Avoid numerical overflow in quadraticroots and cubicroots. commit 359e481bae444a08d7b5e3a2899c427b15e477ec Author: John Bowman Date: Sun May 11 10:22:34 2014 -0600 Update splitpatch example. commit 14c8b1ff484d05b023e933de08d0c21db97e4dd0 Author: John Bowman Date: Sat May 10 20:09:33 2014 -0600 Install refs.bib with slidedemo.asy. commit 245f3baeac8ffc6f0988936787f96deab71da748 Author: John Bowman Date: Sat May 10 17:32:43 2014 -0600 Fix locale bug. commit 7acc6ad91a663cfdf7aa8b94541495e7a60ab60e Author: John Bowman Date: Fri May 9 08:52:54 2014 -0600 Remove minimum window constraints (use viewportsize instead). commit 904beb18cea5434833b4e2793102eb83291c726a Author: John Bowman Date: Thu May 8 11:25:35 2014 -0600 Fix discussion of new T. commit a03fd01057e07e258733190f89045e6bacabac70 Author: John Bowman Date: Thu May 8 00:24:42 2014 -0600 Update links. commit aee5114c91da4eda46ecf6ff679b604ffb834ae8 Author: John Bowman Date: Thu May 8 00:15:03 2014 -0600 Work around PRC viewport issue. Simplify OpenGL minsize code. commit 636f9b9ae471dda6dfb2d24192948f0702adc1d8 Author: John Bowman Date: Thu May 8 00:14:01 2014 -0600 Update link. commit 641f0087ca7e984264b1604e77826cc5013ab5f1 Author: John Bowman Date: Wed May 7 11:02:33 2014 -0600 Fix calculation of minimum width and height for OpenGL window. commit 884dbe2975df61c02b1702a8eb1d136f5eb76230 Author: John Bowman Date: Tue May 6 19:26:10 2014 -0600 Fix transform(u,v,O). commit f843adbcf329e75a71f0c3b9feb05ec6bddd0c70 Author: John Bowman Date: Mon May 5 09:58:15 2014 -0600 Add optional parameters to hsplit and vsplit. commit 3e3cf1484ea8838ab1577d9541346e9ca8cb00d0 Author: John Bowman Date: Mon Apr 28 12:10:05 2014 -0600 Increment version to 2.28svn. commit 47b4f65c1723103f158a7d6c93b996007e05975c Author: John Bowman Date: Mon Apr 28 09:46:10 2014 -0600 Move Adobe transparency workaround to C++ code to allow use of texpreamble again with the pdflatex tex engine. commit f6e34a476966f6ef173078f97e9de6b22ec38339 Author: John Bowman Date: Sat Apr 26 13:40:55 2014 -0600 Increment version to 2.27svn. commit ebd0f3956cce6452f03be38f3d8895493b638fef Author: John Bowman Date: Sat Apr 26 10:59:00 2014 -0600 Update flex patch. commit dcdd417934a8cb30186e75cdc4a0bc28c6c0e7e5 Author: John Bowman Date: Sat Apr 26 10:24:56 2014 -0600 Don't test for an svn release if special file svnrevision is missing, so that release code imported via svn still uses the official release version. commit 1b3a42c12d3f0f1b3e5c2338a84e78ccccb27230 Author: John Bowman Date: Fri Apr 25 20:58:03 2014 -0600 Test for POSIX 2008. commit 07156b7672da2a75cca1f2ffe51a794d0651e15b Author: John Bowman Date: Fri Apr 25 20:57:06 2014 -0600 Address portability issue. commit edb7d9e4dead125cfafc12eb9aedfbf4112dd99a Author: John Bowman Date: Fri Apr 25 20:52:07 2014 -0600 Support c++11. commit a0795aee061ca38f664e44ee0812792ee8e7e20e Author: John Bowman Date: Fri Apr 25 09:58:48 2014 -0600 Use unordered_map if __GNUC_PREREQ is not set. commit eae6b2f4e3a0a1924d0f5a9ce4e4812fe14da6e1 Author: John Bowman Date: Tue Apr 22 10:36:57 2014 -0600 Update documentation. commit 68d1882e82485dc25e9ed4d70ee18a1a5393d6e9 Author: John Bowman Date: Tue Apr 22 08:57:14 2014 -0600 Fix degenerate HookHead and SimpleHead arrows. commit 9d3365092484d3b47b770361a33d1e333675f7ee Author: John Bowman Date: Mon Apr 21 22:56:24 2014 -0600 Remove unused files; update references. commit 841020fba6f2052b53e2c7b0781ef23ba4a1f19b Author: John Bowman Date: Mon Apr 21 14:24:14 2014 -0600 Make xasy terminate asy process upon exit. Use winpad as the default code editor under MSWindows. commit b31b715597cf052fec0cdd0fd13eaa2a33a517b6 Author: John Bowman Date: Mon Apr 21 11:08:02 2014 -0600 Fix xasy code editor under MSWindows. commit a498cbda30967e2858db55a499aa7351b9d688f5 Author: John Bowman Date: Sun Apr 20 13:06:53 2014 -0600 Miscellaneous CTAN updates. commit b26e75cd2c6f8e167d182c5ff2ced81988cb594b Author: John Bowman Date: Sun Apr 20 02:57:11 2014 -0600 Increment version to 2.26svn. commit 78a0104496fa647a67847923ee8a05d3fb6d7dd5 Author: John Bowman Date: Sun Apr 20 00:12:08 2014 -0600 Update SVG documentation. commit c1a7c777bea03d4aa17a6759c0a70aa48bc98a56 Author: John Bowman Date: Sat Apr 19 14:21:13 2014 -0600 Fix Boehm gc compatibility issue with compact option. commit 7251dffa726b6747616f18fd1a8f25f4be3ded6d Author: John Bowman Date: Sat Apr 19 14:19:12 2014 -0600 Add brace routine contributed by Charles Staats. commit 9dce9523d3b9f21c95a94c21ec3c55fa74661cfe Author: John Bowman Date: Sat Apr 19 14:12:19 2014 -0600 Allow code editor command line options. commit d183f721ec1db229bd5ee8bc0d77f73b1c5fdef8 Author: John Bowman Date: Sat Apr 19 11:13:02 2014 -0600 Apply noplaybutton workaround only to new versions of media9. Add link to the excellent tutorial written by Charles Staats. commit 61814f95a498757e6fcbb212a1a39a865c5d2ad8 Author: John Bowman Date: Sat Apr 19 09:50:38 2014 -0600 Fix numerical precision issue in makepen. commit 5b6990c4a62afd01161b5cc79489dd8c5f55b93e Author: John Bowman Date: Sat Apr 19 09:26:31 2014 -0600 Re-enable mesh lines. commit b5b752b55ffe4954262faf1efe3e11508efb8217 Author: John Bowman Date: Sat Apr 19 01:32:45 2014 -0600 Update cygwin GLU patch. commit 8eb656d49d49e6a83227e22245864727c023df34 Author: John Bowman Date: Sat Apr 19 00:14:11 2014 -0600 Acknowledge Michail Vidiassov's extensive contributions to the PRC code. commit 925f182004ae3373cfc1165c1f3312beea4dc522 Author: John Bowman Date: Fri Apr 18 13:25:55 2014 -0600 Sort vector patches to work around opacity artifacts in many rendering engines. commit 12b305cc49fc1d5f5ff61649040df4e819d2078e Author: John Bowman Date: Fri Apr 18 11:43:49 2014 -0600 Support raw PRC output with outformat="prc". commit e42598ff80e479e2be07b77091ca7e3639772880 Author: John Bowman Date: Fri Apr 18 10:46:40 2014 -0600 Improve diagnostic when texi2dvi is missing. commit 6e2a9d80b6b3e920a5c2cec24fc1f6d619828b2f Author: John Bowman Date: Fri Apr 18 10:45:43 2014 -0600 Fix inlineimage under pdflatex. commit 3bb80f0dd96f888188435508ca7efba9c25a401c Author: John Bowman Date: Fri Apr 18 09:15:18 2014 -0600 Implement workarounds for Adobe Reader transparency artifact. commit 8554c29a6bd705bd6a974d14ff3bae2051b16394 Author: John Bowman Date: Fri Apr 18 02:04:26 2014 -0600 Update FFT support file. commit fc3ef0ec22b36083ace789436004ef88452a1feb Author: John Bowman Date: Fri Apr 18 01:00:19 2014 -0600 Update documentation. commit 9723f73b960f8be41e47650770cc9efa37275aa9 Author: John Bowman Date: Fri Apr 18 00:30:23 2014 -0600 Update FAQ about changing default arrow size. commit 44d4866109ca922d2a702c634c9e5c5cf6719422 Author: John Bowman Date: Fri Apr 18 00:01:09 2014 -0600 Avoid unwanted play button starting with media9 version 0.35. commit c732e82d4205bb9e14218fc9e309aa0e539a4166 Author: John Bowman Date: Thu Apr 17 23:29:00 2014 -0600 Update fftw++ header file. commit e8d013cfd3e98da6c7f1d5ce14b37b45488f1a8d Author: John Bowman Date: Thu Apr 17 13:32:16 2014 -0600 Revert to version 1.91-39 of contour.asy until paraboloid version is fixed. commit d5ef55a3925c20f18b130599906597270af13d86 Author: John Bowman Date: Wed Apr 16 16:34:54 2014 -0600 Update to Boehm garbage collector gc 7.4.0. commit ae24b1e9aa87ede80a8292730a6a128344b01ca3 Author: John Bowman Date: Wed Apr 16 14:42:22 2014 -0600 Under MSWindows, look for ghostscript library in both 32 bit and 64 bit registries. commit d07dd349ea7dbb3d358ff322e782134fd4ea3ba1 Author: John Bowman Date: Wed Apr 16 14:40:45 2014 -0600 Update examples and documentation. commit b95d4e0d2e968245cf549eb669efe2f2e85c7111 Author: John Bowman Date: Wed Apr 16 14:31:36 2014 -0600 Test that printout is nonnull. commit f9e2147930ae52b83459afeedd55ce3e9d811272 Author: Andy Hammerlindl Date: Sun Dec 29 17:25:58 2013 -0600 Fix an exact match bug. commit 97c2ede0976dd5a81882555097822b2b0e6176cf Author: Andy Hammerlindl Date: Sat Dec 28 17:13:18 2013 -0600 Change multiguide to avoid deep trees in normal use. commit 1f6fcb0caf77259d58c5f513337bb5add23da425 Author: John Bowman Date: Fri Jul 12 12:55:49 2013 -0600 Increment version to 2.25svn. commit 5cc1c36be3f86c9bce5fdf416656561d5b6e7a42 Author: John Bowman Date: Fri Jul 12 10:07:05 2013 -0600 Fix typos in documentation. commit b32749046a796117e1de5eff7756f908aec9225c Author: John Bowman Date: Fri Jul 12 10:06:47 2013 -0600 Fix segmentation fault in drawSphere. commit a9d404fa81617e78363b8c2c44f912be277d061b Author: John Bowman Date: Fri May 31 02:07:49 2013 -0600 Add examples. commit 8100327bca4cb899ef203b47c195232678f91680 Author: John Bowman Date: Thu May 30 15:53:24 2013 -0600 Update link to forum. commit 6f23cbbab14c2463efbb52e6dbc63120798be12d Author: John Bowman Date: Thu May 30 14:32:04 2013 -0600 Add latexmkrc example file that stores figures in a subdirectory. commit 96dbe43981d399c7ad5a72d191ae536308e17884 Author: John Bowman Date: Thu May 30 14:30:38 2013 -0600 Document new SVN repository URL. commit cae60d3655e4b1861793a427528cbf2eded0f498 Author: John Bowman Date: Thu May 30 13:51:33 2013 -0600 Remove explicit libglapi dependency. commit 773ee63dd79b67fac004d6840a7448a52adcd869 Author: John Bowman Date: Mon May 27 19:57:17 2013 -0600 Simplify readpipeline (requires POSIX 2008) again. commit 623fa5662c4faa9bdb78d6e8f8deca4ad464c692 Author: John Bowman Date: Mon May 27 19:52:26 2013 -0600 Restore function pointer to allow recursive calls to simpson. commit 2bedd4ed018f1a144baa299752537a4f05a2238f Author: John Bowman Date: Mon May 27 19:51:11 2013 -0600 Support make -n. commit a5d7e94f6cf4ec32c27b2715f2ef303bf21c317b Author: John Bowman Date: Mon May 20 10:20:59 2013 -0600 Increment version to 2.24svn. commit 8888e9c4e49c59b1aecf89c602ef3294ccd60682 Author: John Bowman Date: Sat May 18 22:38:07 2013 -0600 Allow compilation without fftw again. Revert to previous wisdom file name (.wisdom). Update copyright. commit f01acbf6c75a0ae093790e3303ece0c9c9eaae36 Author: John Bowman Date: Wed May 15 03:10:39 2013 -0600 Increment version to 2.23svn. commit 3e655c3534f42b0782f875636715a6f35eecc1b9 Author: John Bowman Date: Wed May 15 02:33:47 2013 -0600 Fix dependencies. commit d5a39be02b8c2b3008f8fec9c00eef770988dcc7 Author: John Bowman Date: Tue May 14 21:38:27 2013 -0600 Update FFTW header. commit 54876ada4deb700608de1f129ec6d75ba7d99436 Author: John Bowman Date: Tue May 14 21:37:25 2013 -0600 Update documentation. commit c5f20303c569847859b0c4815b2aa46ab199694a Author: John Bowman Date: Tue May 14 21:06:24 2013 -0600 Expose Postscript extend qualifiers for axial and radial shading (setting extend=false can work around certain PDF reader bugs). commit 44d071b5cba3afea9a6285eb3852bca2a18fdcd6 Author: John Bowman Date: Tue May 14 14:39:28 2013 -0600 Fix transformation of normal vectors. Revert back to usual row-major matrix format. commit 0da7a9d5db0f71d4281d5992170afe68797b9501 Author: John Bowman Date: Mon May 13 11:04:57 2013 -0600 Make use of --pipe to enter context interactive mode. commit e21b39b5cb5bc003536d91a8e46eeea92be30a66 Author: John Bowman Date: Mon May 13 09:07:53 2013 -0600 Support Fedora migration from python-imaging to python-pillow. commit 670a1e5a5c918a5bbb2ad92f511728de16a4287b Author: John Bowman Date: Mon May 13 08:16:32 2013 -0600 Fix documentation of irregular contour routine. commit 2e012ef1cb24337a9a80721bcb75ede09ab0da8c Author: John Bowman Date: Mon Apr 8 13:57:50 2013 -0600 Support vertex-colored triangles in Adobe XI. Remove reference to out-of-date trembling examples. commit ebdd5e9f0795cc53a4f44e0f852cdc7a35c4e368 Author: John Bowman Date: Mon Apr 8 13:46:04 2013 -0600 Use TEXMFMAN to find TeXLive sysdir. commit 9a7ea3d064131b8a0bbc7f5eab82a3af52c13181 Author: John Bowman Date: Thu Apr 4 16:16:19 2013 -0600 Temporarily revert 5440 for TeXLive 2013 build systems without Posix 2008. commit 6352888896501bbbe696e737e31f78baaa6a869b Author: Andy Hammerlindl Date: Thu Apr 4 03:10:22 2013 -0600 Add clarification on 2.. versus 2 .. commit fbfa6bd92b6c4901236970f91aa34a42db0c9a1f Author: John Bowman Date: Wed Apr 3 11:29:11 2013 -0600 Make portability tweak. commit 6109a10f5bdf3a19b7683fe9f293e587e4dcba83 Author: John Bowman Date: Mon Apr 1 11:12:12 2013 -0600 Qualify isnan (for solaris). commit 0870b3458fc99f919315a3e4efc77a10a4e9e18b Author: John Bowman Date: Sat Feb 23 06:29:51 2013 -0600 Avoid unnecessary buffering. commit 164de7fbfa01109df9bc4124d739acbb2c734976 Author: John Bowman Date: Sat Feb 23 06:26:04 2013 -0600 Update FFTW++ file. commit ae248b7f0740554792bc9b847352042affdbffe1 Author: John Bowman Date: Sat Feb 23 06:19:12 2013 -0600 Express segment(bool[]) in terms of more efficient segmentlimits(bool[]) function. commit de3d95ba8225bd1b954cb215524e7944de6b83d2 Author: John Bowman Date: Sat Feb 23 06:17:20 2013 -0600 Update FFTW++ headers. commit 41623ead53639d5007bd14ab89d585e29e351169 Author: John Bowman Date: Tue Jan 8 15:18:10 2013 -0600 Recommend freeglut 2.6.0 due to broken menu feature in the 2.8.0 release (and modifier bugs in various patches for this problem). commit 571f18674c41d73b019f03a0acbaa37bd07d069d Author: John Bowman Date: Sun Jan 6 10:42:17 2013 -0600 Remove unused code. Update documentation. commit 3e215b79190c59f73456472454c30677300c891c Author: John Bowman Date: Sat Jan 5 09:09:16 2013 -0600 Allow self-defined unary operators. commit caa6b862447d6fcc71c2714e8c462e33bdba2600 Author: John Bowman Date: Mon Dec 31 09:27:13 2012 -0600 Compare formatted strings instead of real values in OmitFormat. commit c7c4367b58304fc8504c72e5bedb88247917bd05 Author: John Bowman Date: Wed Oct 24 12:33:07 2012 -0600 Update example. commit 54fe52b1e641ef72dac702f8af80182490bcdb8a Author: John Bowman Date: Sat Oct 20 16:32:57 2012 -0600 Use C locale for svn info. commit b52dfbf684b9ee80f4cfa8a505080d49e40d3d83 Author: John Bowman Date: Wed Oct 17 20:11:03 2012 -0600 Temporarily revert to using tan(radians(a)) in numerically unstable arclength calculation in geometry module (note 2.17-29). commit a87a1304c86c659e806749d0e41fba808dc49b43 Author: John Bowman Date: Wed Oct 10 12:20:47 2012 -0600 Increment version to 2.22svn. commit c2d660762e8124689df3cccd179770a3bb785491 Author: John Bowman Date: Sun Oct 7 06:33:22 2012 -0600 Fix typo. commit 6e9e7aef19a11c397a6158b64aaa522ea70620c5 Author: John Bowman Date: Sat Oct 6 00:38:24 2012 -0600 Fix history recall bug. commit 169b5123d6930b64641b898d88feec61e5664bee Author: John Bowman Date: Thu Oct 4 11:53:09 2012 -0600 Add extend parameter to axes (default true) and axes3 (default false) routines. commit 98f645d4563ae9bdd787edc8b27270cdfcf8ce72 Author: John Bowman Date: Sun Sep 30 21:14:47 2012 -0600 Fix alignment point of OpenGL billboard labels. commit 78b66a7f2759a9df1302c25518e34c4424c390b3 Author: John Bowman Date: Thu Sep 27 23:37:22 2012 -0600 Reinstate billboard rotation for explicitly transformed labels. Don't request bbox only in label(frame,Label,triple). commit bd02c41760684d21d1f5664acc7f5fc317fad89e Author: John Bowman Date: Thu Sep 27 17:03:39 2012 -0600 Increment version to 2.21svn. commit c5aa009966d6e1e9d8c30c548260197ae5b3d678 Author: John Bowman Date: Thu Sep 27 15:45:43 2012 -0600 Work around dvipdfmx bug. commit cf498cba13b9c46cefb4394d7651c24a5fcaf6a2 Author: John Bowman Date: Thu Sep 27 12:19:08 2012 -0600 Disable billboard rotation for explicitly transformed labels. commit 3d9cbef946b70536d13c51cf20915ae72deb3f43 Author: John Bowman Date: Tue Sep 25 09:18:30 2012 -0600 Increment version to 2.20svn. commit 194c5091a3e22c107a8c001c34385da562c99e2d Author: John Bowman Date: Tue Sep 25 08:31:54 2012 -0600 Update example. commit e72c486b7f9247b2678905c2b47080e3113d97b9 Author: John Bowman Date: Tue Sep 25 04:49:46 2012 -0600 Fix warning messages. commit a1c622b6b4cc50c4b08d6002fd9e7aac65bd7a77 Author: John Bowman Date: Tue Sep 25 04:30:00 2012 -0600 Pass inverse of modelview matrix directly to media9 to work around numerical resolution issues. Fix PRC viewportshift. commit a9aa1323336d287c24680e5e65895cfb328542dd Author: John Bowman Date: Thu Sep 20 01:58:07 2012 -0600 Fix lighting of NURBS surfaces. commit 61503c988fae7ead6743e2c15ad3ae8c059b5b31 Author: John Bowman Date: Thu Sep 20 00:13:48 2012 -0600 Increment version to 2.19svn. commit 82e909f710a60909610f9b5071e7761ff987c035 Author: John Bowman Date: Wed Sep 19 19:18:37 2012 -0600 Set secondary picture size (so that, for example, markthin works properly). commit 462b7ecee606e5b73cf46ebc6372ea28952866a6 Author: John Bowman Date: Wed Sep 19 19:13:46 2012 -0600 Move include. commit 7cf9c7a91df2d57128d38c23c3eb0248e43c27e0 Author: John Bowman Date: Wed Sep 19 01:47:10 2012 -0600 Update example to mp4. commit 5f7a2a4f564b0b5dd1d644ca7a6b97584dce36d7 Author: John Bowman Date: Tue Sep 18 20:31:13 2012 -0600 Increment version to 2.18svn. commit 07fbb54d9eba448911e475baa05c05fb32dca5c4 Author: John Bowman Date: Tue Sep 18 19:10:38 2012 -0600 Handle 3D degenerate arrows. commit 72b318bc2eec2dab05bd790434924d630b83128b Author: John Bowman Date: Tue Sep 18 13:37:36 2012 -0600 Fix warning message. commit 4a97fee29abc0138e152a87c462d713963de656a Author: John Bowman Date: Tue Sep 18 13:27:25 2012 -0600 Fix warning message. commit afc04ee36aaf1993cdf4c4e1963983aa7768f24e Author: John Bowman Date: Tue Sep 18 13:25:39 2012 -0600 Remove obsolete file reference. commit a6a1ec9e28e58089665ef014c58011e9f3914790 Author: John Bowman Date: Tue Sep 18 13:07:43 2012 -0600 Make tessellation normals optional. Add example and documentation for tessellations. commit 485f28de3f4031d0bed70b122df335c4f6e95676 Author: John Bowman Date: Tue Sep 18 12:56:16 2012 -0600 Add missing -P options to dvipdf (required for media9 support). commit 02a83be7738afbaec3b88291b07c3508917f5d87 Author: John Bowman Date: Tue Sep 18 08:38:11 2012 -0600 Implement improved workaround for media9 preview bug, as suggested by Alexander Grahn. commit 46e0c431344e0aebd48d4714ea83222758b2235d Author: John Bowman Date: Tue Sep 18 02:44:29 2012 -0600 Implement efficient 3D routine for drawing many triangles, with specified vertices and normals and optional vertex colors. commit fb63ec153a6ce50bdf7d13961c44cec1bfec11dd Author: John Bowman Date: Tue Sep 18 02:39:06 2012 -0600 Workaround media9 blank poster image bug under latex+dvips. commit 8e607d1c6b06eb6157d3e44183880474c2809141 Author: John Bowman Date: Mon Sep 17 07:39:11 2012 -0600 Fix warning message. commit 3ca8304aec7b78b01c57d185fa838cd899113acf Author: Andy Hammerlindl Date: Mon Sep 17 00:49:14 2012 -0600 Include stddef for ptrdiff_t. commit 74ff857dd8e876c27f4c704f5f8fcf351a6866ed Author: Andy Hammerlindl Date: Mon Sep 17 00:30:52 2012 -0600 Fix asymptote.so dependencies. commit 3b284903224957834326f7b1323ad62a57ddded5 Author: John Bowman Date: Thu Sep 13 23:49:20 2012 -0600 Add simple vim ftdetect file that set asy filetype for *.asy files. commit f3f87d6a628cde8f2f1164591d929ed9ecb5adea Author: John Bowman Date: Thu Sep 13 23:42:03 2012 -0600 Add condensed binarytree mode (contributed by Gerasimos Dimitriadis). commit 2bfd526b3e68bcf0855f9cd96a8387f38074c205 Author: John Bowman Date: Thu Sep 13 23:23:27 2012 -0600 Add global macros to find the number of a PDF OCG object. commit 4c0a89dc61a79aedbf568acf3f2cd0dd3fdb6a28 Author: John Bowman Date: Thu Sep 13 12:21:09 2012 -0600 Omit redundant billboard group name. commit 35113393aeea57bb6b3640f04771552b24da7184 Author: John Bowman Date: Thu Sep 13 11:04:58 2012 -0600 Fix degenerate arrows (partially revert 1.38-27). commit 961efd0bbfa636ace7093b34367cf94aec58ff94 Author: John Bowman Date: Thu Sep 13 07:40:24 2012 -0600 Mention that media9 v0.13 is required (to support the default 3Dmenu option and billboard labels). commit 6db4bd675805fe732d07027a066d94d6bbde7571 Author: John Bowman Date: Tue Sep 11 13:11:46 2012 -0600 Fix PRC linecap for draw(unitsquare3). commit 759c324ed9426ff3b422d27bcd93144e506a8c13 Author: John Bowman Date: Tue Sep 11 11:09:24 2012 -0600 Fix lighting; consolidate duplicate code. commit 81117f85753d1e69bc32b9a8886d4564f7e9337d Author: John Bowman Date: Tue Sep 11 10:32:35 2012 -0600 Make PRC and OpenGL lighting consistent. Remove asylabels.js (now included in media9 verion 0.12). commit 5d66bf4894766881c08f06b6e05d1aee94d60b93 Author: John Bowman Date: Mon Sep 10 08:58:07 2012 -0600 Simplify media9 inclusion (now that version 0.12 is required). commit f8fa10e6e09c5c441b49cc4d4a27338016e673f5 Author: John Bowman Date: Mon Sep 10 08:49:18 2012 -0600 Make use of 3Dortho and asylabels.js facilities included in version 0.12 of media9. commit 2e877821d1858577c6e780b935d2679eb740c968 Author: John Bowman Date: Mon Sep 10 07:26:03 2012 -0600 Upgrade to media9 version 0.12. commit cee7440cfc1abedad4c91287e4683fe16f2256d3 Author: John Bowman Date: Sun Sep 9 09:17:35 2012 -0600 Add missing file. commit 38eb29960cfd20c550d3e08f44be1bc26a16806e Author: John Bowman Date: Sun Sep 9 04:12:41 2012 -0600 Restore lighting effects for vertex shading. commit f25cd165ecaefdc96b963420a5886c58b6186e46 Author: John Bowman Date: Sun Sep 9 03:43:27 2012 -0600 Fix vertex shading lighting. commit 950367a4dd7aba862951cc87f098b2c53c354e7c Author: John Bowman Date: Sat Sep 8 14:46:13 2012 -0600 Add updated asylabels.js file and future hook. commit c1f70301a20c33fb142c537d6e12b3a1a52184d9 Author: John Bowman Date: Sat Sep 8 14:32:33 2012 -0600 Simplify code. commit f765ea5970eff9960eedbaeb7ae0a65c391bac98 Author: John Bowman Date: Sat Sep 8 10:58:09 2012 -0600 Update FFTW++. commit 5edc7a9350fe1ef6375e5096a911c609a03b5bc7 Author: John Bowman Date: Sat Sep 8 10:15:52 2012 -0600 Consolidate and standardize min(path[]) and max(path[]) functions. commit 3b392b22d785ea9cb4b8d57e074af39cb5619afa Author: John Bowman Date: Fri Sep 7 12:47:56 2012 -0600 Improved media9 patch, thanks to Alexander Grahn. commit 1903b6b5d7496baaaf40fa1fe695bd228c5d56cf Author: John Bowman Date: Wed Aug 29 10:47:45 2012 -0600 Fix Makefile dependencies. commit a070dd5293b14b74f05f0ed6a9f900db017fff62 Author: John Bowman Date: Wed Aug 29 10:46:54 2012 -0600 Add settings.axes3 to control visibility of PRC axis. commit 3a4ff80115e364bc26662e53018bd49e9f4900ab Author: John Bowman Date: Tue Aug 28 09:09:17 2012 -0600 Provide interim media9 bigfile patch. Don't require media9 bigfile support for pdf tex engines. commit 893bda7dd8b5b1a9f4eaeac46020d20ccf939d7d Author: John Bowman Date: Sun Aug 26 13:28:14 2012 -0600 Support prune=false again. commit 6cca962e4b2d6c4e21596f3075754c26ec5f97cf Author: John Bowman Date: Sun Aug 26 13:16:21 2012 -0600 Fix split(" "). commit e295ef3899bd3ff3d05c9ca8854cd965082cc5dc Author: John Bowman Date: Sun Aug 26 03:16:16 2012 -0600 Initialize ASYprefix with output directory. commit 2841f55449b6127d64dd69deea8b046ccc0741a9 Author: John Bowman Date: Sun Aug 26 03:15:15 2012 -0600 Tolerate missing inline option on 3D content embedded within latex files. Cleanup intermediate media9 files. commit 640aead8666318650a79a81549692ba50972377d Author: John Bowman Date: Sun Aug 26 03:10:13 2012 -0600 Cleanly handle missing files. commit 4f23d0888f40ec6d3b0497a95671716cc8d8f5f9 Author: John Bowman Date: Sun Aug 26 03:09:14 2012 -0600 Remove newlines from texpath labels for xasy. commit 1e3776595b93cddd393f635003f1497fa43eb43b Author: John Bowman Date: Fri Aug 24 00:31:17 2012 -0600 Improve formatting. commit 2b16074a5c7352a8557fa039230d60d69b24a0e4 Author: John Bowman Date: Fri Aug 24 00:30:52 2012 -0600 Use prefix for media9 label to avoid duplicate label warnings. Run ghostscript for texpath in the output directory. commit a553e970a3252eff5af1b5f8dd41c14ea1297eeb Author: John Bowman Date: Fri Aug 24 00:27:29 2012 -0600 Add -DSAFER -P default options to improved dvipdf script. commit 25493e086f2277fac51de26ac0c8fbf539ee1761 Author: John Bowman Date: Mon Aug 20 08:45:07 2012 -0600 Fix orthoshift. commit 81189f4950eca8130ed6ce943a9f56f26a38483c Author: John Bowman Date: Sun Aug 19 14:53:13 2012 -0600 Further lighting fixes. commit d7f2a26a8182c3eef3dac187a9a7aa265f156d1a Author: John Bowman Date: Sun Aug 19 14:40:51 2012 -0600 Fix lighting. commit 9d0c4bab62c2c63c80c610199fb088cc3839795c Author: John Bowman Date: Sat Aug 18 07:40:50 2012 -0600 Look for history_list (which seems to be missing from editline) when checking for GNU readline. commit 96d2dce72cb9dae5c357a1ee01f2778e6d317158 Author: John Bowman Date: Fri Aug 17 12:41:23 2012 -0600 Choose a wider connection when searching near the connecting line (patch contributed by Orest). commit fa17cf1e5e0bd2645d937d10abd8a1e0a32d29d0 Author: John Bowman Date: Fri Aug 17 08:07:21 2012 -0600 Update to gc-7.2d. commit ed07190869efe328fa890fef5a9e3dfe06a7ef68 Author: John Bowman Date: Fri Aug 17 08:06:43 2012 -0600 Rename displacement routines. commit 85667a7b7d5459f5202da2975442cc5b60d4be7a Author: John Bowman Date: Wed Aug 15 09:04:24 2012 -0600 Change defaultrender.defaultnames to true. commit dd9d644810f4d40e21762e4b4121a5edd66619d6 Author: John Bowman Date: Wed Aug 15 07:53:45 2012 -0600 Tweak special trigonometric cases to improve PRC compression. commit b58a0817fb572cbd1a373eca07b68e705f9ffa03 Author: John Bowman Date: Wed Aug 15 07:52:54 2012 -0600 Don't autogenerate RPC part names by default. commit d325d11882ce6ba4e511c9b5e52b7025e8b61ea9 Author: John Bowman Date: Wed Aug 15 05:14:26 2012 -0600 Use limits rather than separate xlimits and ylimits commands in examples. commit cd2bc23e0f03be679698d1eec0f6741abe1a8d52 Author: John Bowman Date: Tue Aug 14 19:55:56 2012 -0600 Add missing render argument. commit 07e58c133ace0af75dda15b5a12b1f42b42ece88 Author: John Bowman Date: Tue Aug 14 19:00:45 2012 -0600 Add missing factor to arrowheads. commit aa508f2198ed94dece058fcbc93237334f4cceff Author: John Bowman Date: Tue Aug 14 17:51:38 2012 -0600 Support large PRC files (requires media9 version dated 10 August 2012). commit 5cab138712fe69f06af75a9bb69df29cc440585d Author: John Bowman Date: Fri Aug 10 05:56:58 2012 -0600 Address clang compiler warning. commit 764f6c88d6d75bf927cb79cd5ac49a7fa49c3ee7 Author: John Bowman Date: Fri Aug 10 05:40:09 2012 -0600 Restore label grouping. commit b2faafa9d236db8d96fc669d675e310b6a5422fd Author: John Bowman Date: Thu Aug 9 19:38:52 2012 -0600 Update copyright of reference card. commit 6abad841b8e40df73b0e5c083d26b0146974f8f0 Author: John Bowman Date: Thu Aug 9 10:05:37 2012 -0600 Fix garbage collection issues. commit 0dd753b567c72d1e1c19fb08b29b38b49a8f0684 Author: John Bowman Date: Thu Aug 9 03:41:55 2012 -0600 Work around LaTeX limitation. commit f976570a2b4af01853995f1deb14db7eb4c873d2 Author: John Bowman Date: Thu Aug 9 02:36:28 2012 -0600 Update U3D example. commit f041106d7df65604625260ee98be6142bbcc016e Author: John Bowman Date: Wed Aug 8 22:34:01 2012 -0600 Add simplified version of Michail's local coordinate patch. commit c54405e2889a4f19c6595963eaff5a0c3e3fd1cd Author: John Bowman Date: Wed Aug 8 10:55:30 2012 -0600 Improve support for none TeX engines. commit bbc092255015ac822f298b22ae2c676b4b39e384 Author: John Bowman Date: Tue Jul 31 09:55:09 2012 -0600 Remove unnecessary xelatex detection. commit 2cf8ac929cf7dcecd2fc918d7fda40297c1d977d Author: John Bowman Date: Mon Jul 30 09:58:52 2012 -0600 Remove spurious code. commit f164efc2e27284c87ec8a16c698f24d7fa94ff3e Author: John Bowman Date: Sun Jul 29 23:46:15 2012 -0600 Remove obsolete movie15 patches. commit 92725277aa6c2a7a798bf318dfbee947d37efa4b Author: John Bowman Date: Sun Jul 29 23:44:19 2012 -0600 Remove duplicate code. commit 0fc6f5179d5d60dbb9cae839faed27b169f2443d Author: John Bowman Date: Sun Jul 29 14:46:18 2012 -0600 Upgrade from movie15 to media9 LaTeX style file. commit e3f867dddcd728104d2327d7750a8a3fab392c75 Author: John Bowman Date: Sat Jul 28 00:53:19 2012 -0600 Compile with offscreen rendering if and only if both libOSMesa and libglapi are available. Make settings.offscreen default to false. commit 2d8d5251b15c75efc2d7cca14aafaa7776122900 Author: John Bowman Date: Fri Jul 27 23:45:26 2012 -0600 Support OSMesa version 8 (which allows offscreen and non-offscreen rendering in a single binary). commit d23dfa4f311e79d4f993bfdcd386cb904a20c3fc Author: John Bowman Date: Fri Jul 27 22:59:28 2012 -0600 Fix string length type. commit 8a16ecec4049f1c4fb289a6230173daaf2315e67 Author: John Bowman Date: Fri Jul 27 16:26:37 2012 -0600 Fix typo. commit 1dfbe359691c2d3115702ae22f3cf8a82778debf Author: John Bowman Date: Tue Jun 19 23:47:52 2012 -0600 Fix autoscale3. commit 0cbad923919b8d51a8ec25ac8236315f10eaca66 Author: John Bowman Date: Tue Jun 19 22:42:00 2012 -0600 Partially revert 2.10-2 (which broke autoscaled logarithmic axes). commit 925da6af8b86c303366c47562eb553c3af69f271 Author: John Bowman Date: Mon Jun 4 05:44:19 2012 -0600 Propogate -m64 flag to the linker to fix solaris 64 bit builds (will cause a clang warning message, though). commit 529536b10bcd237cfbc314c8c10b36e3ccf55033 Author: John Bowman Date: Fri Jun 1 10:33:18 2012 -0600 Simplify code. commit 675129797d1260953312d62fb6435172c1414cb8 Author: John Bowman Date: Thu May 31 21:34:02 2012 -0600 Declare strlen. commit 4665de488b0f7dfa0f3fc0f6084564429f633c45 Author: John Bowman Date: Thu May 31 11:24:27 2012 -0600 Fix bug with non-square pen function images. commit c6275331534575aebaa2e5012585548c44e9dfe0 Author: John Bowman Date: Thu May 31 09:46:34 2012 -0600 Increment version to 2.17svn. commit 6cd9addeacb0a9e4ecaf0b780547b059896c8e58 Author: John Bowman Date: Thu May 31 09:41:14 2012 -0600 Revert last commit. commit 54f73bf431250f99e32352dddc905cf18ae8d7e3 Author: John Bowman Date: Thu May 31 07:38:33 2012 -0600 Fix bug with non-square pen function images. commit 0ce955f05eb5e62a79c375534dcc452e260d97a6 Author: John Bowman Date: Wed May 30 13:45:48 2012 -0600 Work around Windows Python bug. commit 7b4a7e8558c528ce20a65c34c193d001bdd57384 Author: John Bowman Date: Wed May 30 11:53:45 2012 -0600 Replace xinput by input(mode="xdr") and xoutput by input(mode="xdr"). Replace binput by input(mode="binary") and xoutput by input(mode="binary"). commit 4b2b3eadba1e359d65d50947a712015cac6096ca Author: John Bowman Date: Wed May 30 10:35:57 2012 -0600 Update setting. commit e59ad4dfb8a5d513ddf2d3b059d208ea5d8afb74 Author: John Bowman Date: Wed May 30 10:24:17 2012 -0600 Workaround limited pipe support in cygwin. commit 895885884808ec83658588d690920bbd8f1c07f7 Author: John Bowman Date: Tue May 29 23:06:58 2012 -0600 Fix type in conditional. commit ec1650e5a37e69af75d8b85dc553d5e9d6893225 Author: John Bowman Date: Tue May 29 10:02:48 2012 -0600 Update diagnostics and documentation. commit c6db7d004b42d3ebb37ab49bb6195dd1960bd371 Author: John Bowman Date: Tue May 29 07:20:20 2012 -0600 Support compilation of native CYGWIN binaries. commit ac67889ea1721b08044cc3c902225cbbb540b0c1 Author: John Bowman Date: Tue May 29 06:12:56 2012 -0600 Fix pair and triple pipe output. commit 5d562c7e4c3db6476f72c191ef55363d06283667 Author: John Bowman Date: Tue May 29 06:09:25 2012 -0600 Simplify opipe formatting. commit 58740141a125132dc1e7927686866f897189fc1a Author: John Bowman Date: Tue May 29 04:30:35 2012 -0600 Work around compiler bug. commit 82e58e812176532fbda581426f0fcf7d443e2e11 Author: John Bowman Date: Tue May 29 03:34:25 2012 -0600 Fix makefile. commit c8f2f7c3b8716787f7cf27854e160fa9d7b0ac01 Author: John Bowman Date: Tue May 29 02:24:29 2012 -0600 Improve msdos build. commit c11f6ae188aeb29182894e0b33484c87ffef4993 Author: John Bowman Date: Tue May 29 02:19:52 2012 -0600 Fix MSDOS makefile dependencies. commit 632ea52a6b16063f1147d1e40a5ef941138db575 Author: John Bowman Date: Tue May 29 00:03:06 2012 -0600 Fix CYGWIN build. commit a4440a1f3a313bd1fdd67df46c57150d3c12a482 Author: John Bowman Date: Mon May 28 23:58:08 2012 -0600 Reinstate -fno-var-tracking option for older compilers. commit f17b8b5b943feda8851978374c1261d07dda9a49 Author: John Bowman Date: Mon May 28 22:42:37 2012 -0600 Support arbitrarily long input lines in xasy. commit 197f07d29b0340ddce9683758876a356de01a1a3 Author: John Bowman Date: Mon May 28 17:29:40 2012 -0600 Remove broken asy path validation code. commit f72e142f5bb7a5c24f166e46d779f9f32b4ccce1 Author: John Bowman Date: Mon May 28 16:30:26 2012 -0600 Fix warning messages. commit 7e073061e95aafa31ada2661524f61fb0a708df7 Author: John Bowman Date: Mon May 28 14:52:16 2012 -0600 Fix portability issues. commit 9a2ee2bc11d2b6d229de97cc2b1b0f3cebbdc330 Author: John Bowman Date: Mon May 28 09:47:51 2012 -0600 Use pipes for xasy communication. commit f7572e5fc91332f6254877b4ba191e7b12a5c3e7 Author: John Bowman Date: Fri May 25 09:04:06 2012 -0600 Improve example. commit 5280aaf5b9f41ab5010cef240e852fe4a7e5d2f8 Author: John Bowman Date: Fri May 25 09:02:15 2012 -0600 Fix division by zero. commit 4760b91ab9e467f1dac0ce4248ecd5d7babc92ff Author: John Bowman Date: Fri May 25 09:00:56 2012 -0600 Don't autoscale ticks when N is specified and autoscale is false. commit a2c299f175bd766d48c0963aab7d6c311ab281b9 Author: John Bowman Date: Fri May 25 08:57:08 2012 -0600 Add new new routine for computing camera positions. commit 65cabae5d0fe4cd36b112879a4dbb0b9ae59d708 Author: John Bowman Date: Thu May 24 22:38:45 2012 -0600 Update to gc-7.2b. commit d281011095af600eaffd39b7b6bec994bc36917d Author: John Bowman Date: Thu May 24 15:49:39 2012 -0600 Respect straight flag in external(). Add partialu and partialv derivatives for patches. Add a general split function. Move split structure into splitpatch example. commit d0269b9d990cbf5677e67d43e9b85a969ef03bb8 Author: John Bowman Date: Sat May 19 22:51:47 2012 -0600 Fix palette range (bug 3487991). commit aebbf37c073de90619b6abf77a129228d18fa3a2 Author: John Bowman Date: Sat May 19 14:38:43 2012 -0600 Remove obsolete --no-var-tracking compilation option. commit 5278d4408c07fdce76a163745279d2e4167fe267 Author: John Bowman Date: Sat May 19 13:44:58 2012 -0600 Remove unused value. commit 7f56277a8a94e0840d4e1f8d4dadd47278c1a4f7 Author: John Bowman Date: Sat May 19 13:21:30 2012 -0600 Block SIGCHLD. commit 6db9f3d39623474f0b21c0bec9945493fb241aff Author: John Bowman Date: Sat May 19 13:20:12 2012 -0600 Force assert to be active. commit 098f9995970cedcb056cbd438c3ad3d100c44107 Author: John Bowman Date: Sat May 19 10:55:16 2012 -0600 Fix manual tick scaling. commit 146ea188fd77609436b3fd8bf56f7c13c6a893a7 Author: John Bowman Date: Sat May 19 09:40:33 2012 -0600 Use currentpen rather than nullpen so that current value of currentpen is respected. commit 6aa2ab11ba05e81c7d9718d0714275ff2ad91bf1 Author: John Bowman Date: Tue May 15 05:54:54 2012 -0600 Add missing file. commit 3ac2531850eb5ab0cc4a7f1fb83a98f9466add34 Author: John Bowman Date: Tue May 15 05:50:40 2012 -0600 Add missing file. commit 0b08ac0f02b38e8e460709b772155841d6b68d1e Author: John Bowman Date: Tue May 15 05:36:47 2012 -0600 Add missing file. commit 898a29e16b50bb77a485cc2dad980ba29172f6c5 Author: John Bowman Date: Tue May 15 05:28:40 2012 -0600 Update POSIX thread support. commit bbe3a92496ff77625e376ef97d748c8fc373ef2f Author: John Bowman Date: Tue May 15 03:49:45 2012 -0600 Fix warning message. commit 92a3e49b5d51348876ec8dbadd0455de4f31187c Author: John Bowman Date: Tue May 15 03:08:30 2012 -0600 Update to gc-7.2. Simplify makefile; fix shared library version. commit 95c12bcf39c54fcf1467d5e3291c07046091e0fa Author: John Bowman Date: Thu May 10 18:06:16 2012 -0600 Fix the erase command so it behaves as documented (no reset). commit 63edda802e6b7102fb239b10bb75a5d84a5ab0d2 Author: John Bowman Date: Thu May 10 15:54:47 2012 -0600 Don't force a default viewportwidth. commit 336fca44455b9a23f0300de0360f05ff872e98a1 Author: John Bowman Date: Thu May 10 15:47:54 2012 -0600 Improve wheel.asy example to allow pdf animations. commit af090550e3e9fdd53e0645631b44e459c6535690 Author: John Bowman Date: Thu May 10 15:27:32 2012 -0600 Fix split structure. commit 55e19362d20a7e6d34abc034579421f477833dc6 Author: John Bowman Date: Wed May 9 13:24:12 2012 -0600 Add NSIS support files. commit f79b31b1cdcc96bbf99863c2f3930eae80ed3650 Author: John Bowman Date: Wed May 9 12:51:37 2012 -0600 Fix icon directory on 64-bit MSWindows systems. commit ac138f0766bf2580e63e147ef682057e548e0b26 Author: John Bowman Date: Wed May 9 12:42:42 2012 -0600 Remove obsolete constructor; update examples. commit d2ff5a4b54ecbb598c6701640dc69e475b2c25d3 Author: John Bowman Date: Wed May 9 12:40:29 2012 -0600 Update documentation. commit 36b874c9bf949602c86d2373399559bf204d86a3 Author: John Bowman Date: Thu May 3 19:39:30 2012 -0600 Make split compute subpatches for each input patch. commit afa172f0b94dfa159afb88049cd70639ebf927ca Author: Andy Hammerlindl Date: Wed Mar 28 20:36:39 2012 -0600 Add picture bounds test. commit 59226ae03dc03ecb85ffe412169946b675ecc2b6 Author: Andy Hammerlindl Date: Wed Mar 28 20:35:51 2012 -0600 Changed name of class to avoid confusion. commit d7b28f36a0ab6c506f62480d125991a802afc32a Author: Andy Hammerlindl Date: Wed Mar 28 18:48:45 2012 -0600 Fix translated bound error. commit bc5c461aee6e3e9e7d8e2cb44ff824b67af70eeb Author: John Bowman Date: Thu Jan 26 10:09:57 2012 -0600 Fix numerical underflow. commit 96720fd56603cc08aba9a2d32614413e3c2d6226 Author: Andy Hammerlindl Date: Wed Dec 28 15:08:25 2011 -0600 Allow named arguments after rest arguments. commit f064b2c18eb998eabb7f6734e3d622f076f2d054 Author: Andy Hammerlindl Date: Wed Dec 28 15:08:00 2011 -0600 Nicer debug output with COMPACT flag. commit 1ba8c8e27540d30d2c07bf94d6ad05255f79e9ea Author: Andy Hammerlindl Date: Wed Dec 28 15:07:37 2011 -0600 Refactor vm::frame allocation. commit 36cfb1471d9dfc76038d7cb8e600178cacd72d1e Author: Will Robertson Date: Sun Dec 18 01:07:26 2011 -0600 fix \CatchFileDef fallback command commit 5584bf2e9c7667776c17261506c4c95ebdc525ed Author: John Bowman Date: Fri Dec 16 02:05:37 2011 -0600 Fix trailing zero removal. commit 36df17bffa1ce7df583b5498e49c25b8e660ed84 Author: John Bowman Date: Sun Dec 11 22:46:58 2011 -0600 Make format more consistent with fprintf; add a defaultseparator argument for typesetting scientific notation. commit 607d1c6a8aa64349ee8222e0d4fb7e51ea1108e3 Author: John Bowman Date: Sat Nov 19 17:08:57 2011 -0600 Work around quote translation problem. commit bd420f563ee8f73ec0d83dc625b7eedf31c4e10f Author: John Bowman Date: Wed Nov 16 19:37:09 2011 -0600 Increment version to 2.16svn. commit 0373fcedf737e0eb031c3b7c0d6249a0365fb8e2 Author: John Bowman Date: Wed Nov 16 15:35:43 2011 -0600 Add missing isnan declaration for MacOS X. commit f45773ebfae0421654c44ff749b4abb5473bb9b9 Author: John Bowman Date: Wed Nov 16 02:55:41 2011 -0600 Increment version to 2.15svn. commit d5f96fa6c1887a0b5ef172b020c33008ab89bc5c Author: John Bowman Date: Wed Nov 16 01:58:35 2011 -0600 Add missing CYGWIN declarations. commit f3a7eab7acf2330bd0db9954965cee63157fe608 Author: John Bowman Date: Wed Nov 16 00:20:57 2011 -0600 Update examples. commit d1910745143903e81841776b1839aae3d3679d8d Author: John Bowman Date: Tue Nov 15 15:23:53 2011 -0600 Fix typo. commit 1bcac6740b1440cc8bf32efd9a8e7e4e2386b721 Author: John Bowman Date: Tue Nov 15 15:18:41 2011 -0600 Move obsolete rotate(explicit pair dir) routine to geometry module. Add quick reference card. commit 519ed6392af531d644338021ad1da7dcca1458fc Author: John Bowman Date: Tue Nov 15 15:17:39 2011 -0600 Fix render=0 bugs. commit 7b3e45ff00039a5d64629a52f69d8c9826062b4c Author: John Bowman Date: Tue Nov 15 14:04:28 2011 -0600 Implement Jacobi elliptic function sndncn(real u, real m), which returns real[] {sn,dn,cn}. commit e65f6c73db51d22c4af1a3ebd647102c7afe811f Author: John Bowman Date: Tue Nov 15 13:36:33 2011 -0600 Implement int ascii(string s). commit f980e86fa2ddb6bc958cc6e6dede75800ba77c2e Author: John Bowman Date: Tue Nov 15 13:27:56 2011 -0600 Added manpage target to build man page only. commit ca0950021320f587a98111af6770910e2fd6392c Author: John Bowman Date: Tue Nov 15 12:45:15 2011 -0600 Add bool isnan(real). commit 61d15d09a399b12373ff3dd8ad472dbd96e0a9bb Author: John Bowman Date: Tue Nov 15 02:45:48 2011 -0600 Fix preview surfaces with render=0. commit fd39ba1b61df82917abef4fd1a5c882895e9f6a9 Author: John Bowman Date: Tue Nov 15 00:55:06 2011 -0600 Fix string reads from binary files. commit e384bc1d78d8d7bb055d47eac5357094e653982b Author: John Bowman Date: Tue Nov 15 00:53:24 2011 -0600 Blank lines are not allowed after \begin{asy}. commit 815254b51b059a8e5cd648731970c6f6b76431ce Author: John Bowman Date: Tue Nov 15 00:00:27 2011 -0600 Generate missing preview images for fitted pictures. commit 2a699d60716d5359aff5c682402778325a8dafa5 Author: John Bowman Date: Mon Nov 14 17:52:20 2011 -0600 Fix draw(revolution). commit 23cba8ca5597ff5ae97e131d6e182edab7b0674d Author: John Bowman Date: Thu Nov 10 18:07:05 2011 -0600 Fix axis bug introduced in 2.14-32. commit b181ebf5775ba5d599b226c89b4445123801b000 Author: John Bowman Date: Fri Sep 30 08:23:17 2011 -0600 Portability fixes. commit b60fabf38153ed38f982c6e0fb7b31ae63444c72 Author: John Bowman Date: Thu Sep 29 22:14:23 2011 -0600 Move lastpen to the end of pen.cc so that it is initialized last. commit 3f33984706db09eccb1911d29f17a09a86b4fa4c Author: Andy Hammerlindl Date: Thu Sep 29 13:32:22 2011 -0600 Change Int to int_typ in policy.h commit 9c18bdd86d9097815f8c25fb48f7dc7cead40cc9 Author: John Bowman Date: Thu Sep 29 08:38:53 2011 -0600 Avoid compiler warnings about virtual function overloading. commit adb2f5a6093f309f71476b390502786fc92f6b24 Author: John Bowman Date: Thu Sep 29 07:54:09 2011 -0600 Avoid further static initialization issues (courtesy of Michail Vidiassov). commit 93e9862311b092b464ab596ea12f37ed1f604e87 Author: John Bowman Date: Thu Sep 29 07:50:13 2011 -0600 Remove extraneous comparison. commit 905b605e3a2ca6ca3d15af85e0b41c058548ab16 Author: John Bowman Date: Thu Sep 29 07:42:10 2011 -0600 Avoid unused function warning message. commit abc896516d0fab7e2cd3324bd5c21633c97852a5 Author: John Bowman Date: Thu Sep 29 07:04:03 2011 -0600 Fix warning messages. commit 454f9b2a5e94451fa2954263a1e0e672d985c195 Author: John Bowman Date: Thu Sep 29 06:25:04 2011 -0600 Fix extended axes. commit c405b32f3f48f7cb881c4438f46aac04c562bf45 Author: John Bowman Date: Wed Sep 28 11:51:42 2011 -0600 Work around static initialization fiasco. commit 835df463a4ff6e50a1bb963a749c6e99a949b437 Author: John Bowman Date: Wed Sep 28 11:17:50 2011 -0600 Fix typo. commit e93d341f5eaf37535e1d1a98cb49ab981a6360ee Author: John Bowman Date: Wed Sep 28 10:49:33 2011 -0600 Update documentation. commit 5200611daa0aa3ee5184200fefa65c68977a0618 Author: John Bowman Date: Wed Sep 28 10:44:41 2011 -0600 Remove unused member. commit 4b7b3d2ab698953f8d8b78d06d12dd43b2606d65 Author: John Bowman Date: Wed Sep 28 10:24:10 2011 -0600 Fix comparison. commit 933d551e410216bb3c8b380a029f6ffea120fb56 Author: John Bowman Date: Wed Sep 28 10:16:20 2011 -0600 Remove extraneous comparisons. commit 863887edfc40854ff581b2cd8788a963516d0fc9 Author: John Bowman Date: Wed Sep 28 10:12:33 2011 -0600 Fix comparison. commit 5e1847bd221ec8b6df63ee9cc20a6f06eaf7f080 Author: Andy Hammerlindl Date: Mon Sep 19 21:18:30 2011 -0600 TRANSJUMP no longer an option. commit 6955d093e68636e943db4e866a26fa037f2e8f8a Author: Andy Hammerlindl Date: Thu Sep 15 16:15:35 2011 -0600 Add 'operator tuple' via EXTRASYMBOL command. commit e2599a170b41495ca9239a3430e0bc9884944a70 Author: John Bowman Date: Thu Sep 15 09:23:55 2011 -0600 Fix build. commit 4e072133999da0c7c4d2323c67a503d6c7a2e227 Author: Andy Hammerlindl Date: Wed Sep 7 20:39:57 2011 -0600 Add operator overloading to aspy. commit 88be1715a04f52c0c98d8836f926e6ea2cd97c92 Author: Andy Hammerlindl Date: Wed Sep 7 18:29:08 2011 -0600 Add 'operator tuple'. commit 2f65f96732ab7045006bea36f95dd030fbf2e6bf Author: Andy Hammerlindl Date: Mon Sep 5 18:01:39 2011 -0600 Can compile Asymptote as a shared library. commit 314c32df054e8e94fdb7e4a3ab36d63b3dfcf630 Author: John Bowman Date: Tue Aug 30 16:10:39 2011 -0600 Generalize copy, map, and sequence functions to arbitrary depths. Add locale string to format(string,int). commit f60d7128a92318a68ea52d72e98f2f020a50851b Author: John Bowman Date: Mon Aug 22 10:46:31 2011 -0600 Improve nullpath handling. commit 7f4aa4dc2cd0bfb309318136062a4368257275a2 Author: John Bowman Date: Mon Aug 22 09:22:55 2011 -0600 Allow draw(nullpath) again. commit 035e97166c51d992fb7821bba57500ebf96c9b5b Author: John Bowman Date: Sun Aug 21 18:31:43 2011 -0600 Update version number. commit 1d46e62d7302e1944634462f1293cb5da3e297d9 Author: John Bowman Date: Sun Aug 21 16:09:54 2011 -0600 Remove portability tweak for MIPS. commit 19376a278ff54761ec08cf7fce188a7412a1a9b2 Author: John Bowman Date: Sun Aug 21 15:09:03 2011 -0600 Specify arbitrary size if MAXPATHLEN is undefined. commit 169a01aa7008f1904ba90620e9dbf3a30b814cef Author: Will Robertson Date: Wed Aug 17 02:51:20 2011 -0600 some missing comment chars in \asyinclude also bumped the version number of the .sty by a minor increment (hope this is okay) commit 99cccab66045a397288043008c16e2661760b321 Author: John Bowman Date: Sat Aug 13 02:50:17 2011 -0600 Build Mark and MarkFill from MarkPath. commit 66e4b3128fef46f9947ba9a377becd0dff2e94ca Author: John Bowman Date: Fri Aug 12 23:50:06 2011 -0600 Implement markthin(path) marker with opacity thinning. commit dc796a6644aa43520df731e9dc5a0c7d8efad14d Author: John Bowman Date: Thu Aug 4 21:48:05 2011 -0600 Update link to cygwin1.dll source code. commit b49f13fdc4e89c6d68a9b2661bb003beb62ef87b Author: John Bowman Date: Tue Jul 12 08:35:36 2011 -0600 Disable billboard interaction for offscreen rendering. commit e91377a416df875948307c281eabe3253e6c8540 Author: Philippe Ivaldi Date: Wed Jun 29 10:09:51 2011 -0600 Fix double drawing of path when showing triangle in geometry.asy commit 0810f9341fefd6a9640d885548e43f4eff317ff8 Author: Philippe Ivaldi Date: Mon Jun 27 16:35:42 2011 -0600 remove trailing char commit c81825912d945d231483dd5514253d78c8c2f797 Author: Philippe Ivaldi Date: Mon Jun 27 11:04:13 2011 -0600 Fix arc orientation in arcfromcenter Enable again arcfromcenter for line (with explicit constraint) Cleaning and improving code commit 56823e66001d1737e46789a0a092f4021c50d603 Author: Philippe Ivaldi Date: Thu Jun 23 08:58:15 2011 -0600 Remove previous modification in geometry.asy commit 96bb297e1528c0587cbdf784d42746820104b4c4 Author: John Bowman Date: Wed Jun 22 20:55:18 2011 -0600 Prebuilt target should not rebuild asy-keywords.el. commit 9793f56e065ba4d9746351f24be21be20ebd75a0 Author: Philippe Ivaldi Date: Mon Jun 20 14:56:04 2011 -0600 Fix inverse(real, point, point) in geometry.asy commit a24beb6a7ff925034b170c9678ce83cc5653af20 Author: John Bowman Date: Sun Jun 19 17:29:55 2011 -0600 Print version number with -vv. commit dc8bf8804a4abee244e0c60cc05025d85092d797 Author: John Bowman Date: Sun Jun 19 13:34:43 2011 -0600 Increment version to 2.14svn. commit f8e0a8e91ce17902d1a63e1648867a42ab40c422 Author: John Bowman Date: Sun Jun 19 07:40:51 2011 -0600 Autodetect memrchr. commit f901f8836f3066777f1724cfe7c9286f4238c06b Author: John Bowman Date: Sun Jun 19 07:31:50 2011 -0600 Make install-prebuilt also install asy-keywords.el. commit d69d4b0f9e9983964a1530aeb8f90e568d283138 Author: John Bowman Date: Sat Jun 18 20:03:42 2011 -0600 Increment version to 2.13svn. commit f9789265ae0f8ed6d09f7c2403121233bbaa8184 Author: John Bowman Date: Sat Jun 18 17:29:56 2011 -0600 Support --disable-gl again. commit bd8211eabbbbbfa98721af242184314d41fa15d9 Author: John Bowman Date: Sat Jun 18 10:55:00 2011 -0600 Include cstring instead of string.h. commit be2e4fdd53804a8efe5a1bb6882da0c855fc1348 Author: John Bowman Date: Sat Jun 18 10:50:11 2011 -0600 Add missing include. commit cd4215443c2e68eebe65e41dd38f06c1d3be33bc Author: John Bowman Date: Sat Jun 18 01:55:15 2011 -0600 Increment version to 2.12svn. commit ecae684548f36119f4216029716ebef377378a3d Author: John Bowman Date: Sat Jun 18 00:40:24 2011 -0600 Update README. commit 1274ea3bdefa8a0feeb5cb9e715b1af4e7958e8a Author: John Bowman Date: Sat Jun 18 00:39:21 2011 -0600 Update copyright. commit 5683c1169105e8d2d4fc6bfa3f9ef8f8c61c9dc3 Author: John Bowman Date: Sat Jun 18 00:35:24 2011 -0600 Add missing install-prebuilt dependency. commit 4c1e1c3ef2654ae238dfa1560b1cfc724d6d5f43 Author: John Bowman Date: Fri Jun 17 17:27:04 2011 -0600 Remove unwanted preprocessor conditionals. commit 0e5e96dd67755957dbb878a7ac16b7c96695d6f7 Author: John Bowman Date: Fri Jun 17 11:50:18 2011 -0600 Fix diagnostic. commit ea082454a2dba0cee29b9a3a442be584b1bdecb9 Author: John Bowman Date: Fri Jun 17 01:56:37 2011 -0600 Fix preprocessor conditional. commit d6d2c9539b55493e5af6f6bb5dd0d9db74c14bc4 Author: John Bowman Date: Fri Jun 17 01:44:31 2011 -0600 Support compilation without GLUT library. commit 48c7204e3b32767ca26e247efb362cc0079d3dde Author: John Bowman Date: Fri Jun 17 01:04:36 2011 -0600 Disable offscreen rendering support by default. commit 5b49d89be10da47f31081cb11c3126f429f4ef9f Author: John Bowman Date: Thu Jun 16 14:25:20 2011 -0600 Don't require LIBGLUT for thread support. commit a1692fce8acc26d53113cd10b987232802856188 Author: John Bowman Date: Thu Jun 16 14:19:21 2011 -0600 Remove unused include. commit 27baaf4d761a1e6ee9c19328a63acc25e5fda05e Author: John Bowman Date: Thu Jun 16 13:13:15 2011 -0600 Add preprocessor conditional for CYGWIN. commit 31be7f0e4cd4bb52846d67e1f1dd8ecf20a54eeb Author: John Bowman Date: Thu Jun 16 00:13:01 2011 -0600 Allow offscreen rendering to be toggled at runtime. commit 372affdfe0543bc92e87ea3413e059b80a058d40 Author: John Bowman Date: Wed Jun 15 15:39:19 2011 -0600 Fix pen shift bounds. commit 99d807b7007f4a902cedd9e1a015f32394247e67 Author: John Bowman Date: Tue Jun 14 16:45:08 2011 -0600 Update README. commit 1fa461a73b642cea346f32ffb9beee5a3677a336 Author: John Bowman Date: Tue Jun 14 16:44:35 2011 -0600 Enable offscreen rendering; address autoconf warning messages. commit 1f34e235228e80d1c7ee1356c902bcfcbfdb50f4 Author: John Bowman Date: Tue Jun 14 13:01:48 2011 -0600 Use tirpc library under CYGWIN. commit 695dbafa436bc1e825ea38afe6d67b9017dd8582 Author: John Bowman Date: Mon Jun 13 15:42:24 2011 -0600 Fix handling of whitespace in word mode. commit 0c3dbafa9226f58f7cd1730ec8ea37dabde36495 Author: John Bowman Date: Mon Jun 13 11:01:30 2011 -0600 Fix implementation of data transpose. commit f6dae43413a31c8dca3136db9092463ec88e12b6 Author: John Bowman Date: Fri Jun 10 04:19:55 2011 -0600 Implement transpose option more efficiently. commit 4ea4c394a4db464247e5118c9c5380b46cac8893 Author: John Bowman Date: Fri Jun 10 03:51:30 2011 -0600 Implement transpose argument for pen function images. commit a1ad1a73b65cdafab966b5f3c05f0400b7e7bebd Author: Philippe Ivaldi Date: Thu Jun 9 16:10:37 2011 -0600 Fix coding style commit aa0c48c1d950aa8752af0734208fe562890a6f32 Author: Philippe Ivaldi Date: Thu Jun 9 11:36:27 2011 -0600 Fix limit calculation of parabola and hyperbola commit 5d76dfbe4f3d772306c18d4ed8d36002461f66e5 Author: John Bowman Date: Mon May 30 09:51:41 2011 -0600 Remove extraneous declaration. commit 892558151c915760ed98d071685c8d7bb35fb025 Author: John Bowman Date: Fri May 27 17:14:44 2011 -0600 Add Orest Shardt's offscreen rendering patch (currently implemented and tested only for UNIX). commit 09f908316f03378cf5ef395359b45d5acebacf64 Author: John Bowman Date: Fri May 27 01:56:19 2011 -0600 Increment version to 2.11svn. commit d9e3abb8c9d6ff909d11180945111a531b9964b7 Author: John Bowman Date: Thu May 26 23:29:46 2011 -0600 Speed up example. commit 0631cca53d0723120b1c88b477ab18f5aa3c27e0 Author: John Bowman Date: Thu May 26 23:25:08 2011 -0600 Use complete userMax/userMin functions. commit 753eb653bfe539e392f1c36f07f1df789a438138 Author: John Bowman Date: Thu May 26 19:43:31 2011 -0600 Fix rendered preview images. commit f1c974625225af462e334d1bd43484508021a6e3 Author: John Bowman Date: Thu May 26 18:21:42 2011 -0600 Increment version to 2.10svn. commit fbb587cbf5578a2695664467a38362dfb524e71b Author: John Bowman Date: Thu May 26 14:06:11 2011 -0600 Add missing index entries. commit dbfd411c9ba5003351c93c86d9fc2f17b78f9391 Author: John Bowman Date: Thu May 26 12:37:41 2011 -0600 Implement void pixel(picture pic=currentpicture, triple v, pen p=currentpen, real width=1); commit 1541a42227d14700cdbdf19a8dfa4946a9aaaf9b Author: John Bowman Date: Thu May 26 02:58:37 2011 -0600 Map [0,1] uniformly to [0,255]. commit 4a2ccb7b31b79862d77cf80b62ea22373b4ab4bd Author: John Bowman Date: Thu May 26 02:50:51 2011 -0600 Don't apply picture transform when computing limits of hyperbola. commit 6ee64567251b6fd3f9cce2eccfc9cf2440a5f1cf Author: John Bowman Date: Thu May 26 01:28:15 2011 -0600 Check that arrays passed to the image routines are rectangular. Implement general pen image routine, along with an example: void image(picture pic=currentpicture, pen f(int,int), int width, int height, pair initial, pair final, bool antialias=false); commit c2c919b3866afd8495640f47989527452d16ad8f Author: John Bowman Date: Thu May 26 01:22:42 2011 -0600 Fix validity test in simplex.asy. commit 8311285017e676b718db670ece10dd55f292aa99 Author: John Bowman Date: Wed May 25 14:46:20 2011 -0600 Simplify code. commit 4595377da618c41abfd1225b2e7c36b0b5441615 Author: John Bowman Date: Wed May 25 14:19:16 2011 -0600 Fix bug in optimized sizing routines. commit 6dce8552f95e7e5bef49becbe3b581ca0e5252cd Author: John Bowman Date: Wed May 25 08:07:29 2011 -0600 Add Michail's recent PRC enhancements. Implement PRC vertex-shading for straight patches. commit 34379b9e3c1913b57db5c87734830f630a833d1f Author: John Bowman Date: Mon May 16 00:06:31 2011 -0600 Eliminate gcc warning about unused yyunput routine. commit e5d3ab2639f3f3b5832ca34893c562dc539befac Author: John Bowman Date: Sun May 15 10:29:31 2011 -0600 Implement keepAspect keyval option in asymptote.sty. commit e5865544385122605c2b031f1a7ca5ef28924fdb Author: John Bowman Date: Sun May 15 08:54:13 2011 -0600 Test for null Label in arrow(). commit c653749f805ad1e5f2fa5f639d45f184941a544c Author: John Bowman Date: Sat May 14 00:52:04 2011 -0600 Check translation table size. commit 48ab45c2229b0eefc131ab54d566c4e9d4cf282f Author: John Bowman Date: Fri May 13 02:51:05 2011 -0600 Don't strip directory for .js and .prc file names. commit 3846842566cd886a8462bd1453d544b6a4865a41 Author: John Bowman Date: Fri May 13 01:45:05 2011 -0600 Support PDF TeX engines in xasy. commit cf93f465fcf39048334c40ca96051c8d97402abd Author: Andy Hammerlindl Date: Wed Apr 13 21:49:11 2011 -0600 Removed old rules. commit 26af240cbcaac8ee9b8225e1496205ec6907d21b Author: John Bowman Date: Wed Apr 6 20:49:10 2011 -0600 Remove unused code. commit cbc4996ce1aef5f513ffeedf838c14608b2fe07a Author: John Bowman Date: Wed Mar 30 09:24:10 2011 -0600 Increment asymptote.sty version. commit 86a45fa5d0aa5196a257b988902ac9bfa2a30033 Author: John Bowman Date: Wed Mar 30 09:21:48 2011 -0600 Allow leading spaces before \end{asy}. commit 619a38cae78e5fb60291972baa5d175f7888f4cd Author: John Bowman Date: Wed Mar 30 09:07:07 2011 -0600 Add step option to indexedfigure. commit 09fbbf7c7b754cad11c5b2b35c7e196d13bded12 Author: John Bowman Date: Wed Mar 30 09:00:57 2011 -0600 Simplify item casts. commit 2b3821e83fab71b9719a636c62cdb10e61970397 Author: John Bowman Date: Fri Mar 11 01:19:33 2011 -0600 Update TeXShopAndAsymptote instructions. commit 55dcb2872bd2b364bc0fde9122e428a1b8705116 Author: Andy Hammerlindl Date: Sun Mar 6 09:18:26 2011 -0600 Add documentation for keyword-only arguments. commit de48fd80cef132745608b6081e19e6b9812b770c Author: Andy Hammerlindl Date: Sun Mar 6 08:58:46 2011 -0600 Add keyword only formals. commit e28db8033261fd944648944918a57497aa080de8 Author: John Bowman Date: Fri Feb 25 00:04:21 2011 -0600 Update example. commit 2a5c7a0b3d54cb3643ab77ca718a1ab9202489b6 Author: Andy Hammerlindl Date: Thu Feb 24 17:17:48 2011 -0600 Fixed assert on array assignment. commit fe1724e28088f72b4f6845240259b8a511d461f6 Author: John Bowman Date: Tue Feb 22 17:45:01 2011 -0600 Avoid overloading built-in circle and ellipse functions. Remove unused code. Fix transform bug in drawline. commit 5a035149cc6b82bc53e867fa7dbb5670113c3bc1 Author: John Bowman Date: Tue Feb 22 17:34:59 2011 -0600 Fix transform bug in drawline. commit 0f6d6d16a04877e8133f8692e766270f2d45bb00 Author: John Bowman Date: Tue Feb 22 17:34:03 2011 -0600 Improve interface to trembling routine. commit 46ff6379757c102758e7c527eb038466d34549ae Author: John Bowman Date: Sat Feb 12 09:28:39 2011 -0600 Remove unused member of drawBegin3. commit 6042454ca398acea0efbfc47d09c300ddb895bc7 Author: John Bowman Date: Sun Feb 6 17:42:39 2011 -0600 Move unit constant into constructor. commit 7c2613352fe970f3ed1e780114db08c5ee389a6e Author: John Bowman Date: Thu Jan 27 13:38:09 2011 -0600 Speed up long long integer multiplication. commit 345eb851c2e49b2017620f34c6e1306abba09df9 Author: John Bowman Date: Tue Jan 25 09:19:29 2011 -0600 Change Int to int. commit d486f3fee70be67c7660d68eb93a730bf78404bc Author: John Bowman Date: Thu Jan 20 08:54:32 2011 -0600 Always output preamble definitions. commit a0d8db72b45ccb2514d0eeb4cd4a10bb57caee49 Author: John Bowman Date: Sat Jan 8 18:08:39 2011 -0600 Update examples. commit 9d8586ba41a6fb37b2515bf4009788aea0a7e8a9 Author: John Bowman Date: Sat Jan 8 16:36:57 2011 -0600 Enable Andy's new sizing routines. commit a07d4ee6172b69d69bbe5348dfa8530212ccd233 Author: John Bowman Date: Thu Dec 30 23:58:29 2010 -0600 Update refactored files. commit 448c94a01985e6152dc7f62c3417efc733cad0d2 Author: John Bowman Date: Mon Dec 27 19:50:38 2010 -0600 Use a temporary expression for self operators to avoid side effects, as suggested by Orest. commit 306f0d9603d3eb97bb0c373597b7b427103a2060 Author: John Bowman Date: Wed Dec 22 06:40:48 2010 -0600 It is no longer necessary to append to an existing preamble. commit d43df1261b0fe3f53dcdee5f0c401fff837ce20c Author: Andy Hammerlindl Date: Tue Nov 30 07:34:19 2010 -0600 Add commented out code in bsp for new sizing routines. commit 5c45929cbd618acca4f76d1f048df99e72c9504b Author: Andy Hammerlindl Date: Tue Nov 30 06:55:53 2010 -0600 No error on userMin of empty data. commit f47e22e7ad395eef6030bed302b035baa21849fe Author: Andy Hammerlindl Date: Mon Nov 29 16:02:26 2010 -0600 Fix merge typo. commit c571692aeb21dfbc7ccdae540645705659604b86 Author: John Bowman Date: Sun Nov 28 11:41:26 2010 -0600 Move limits commands to after draw commands to work with recoded picture sizing routines. commit 2d72b2c0b3c059df0d26ee371c5f185eefd5cd5b Author: John Bowman Date: Sun Nov 28 11:37:44 2010 -0600 Begin to port graph, graph3, and three to use recoded picture sizing routines. commit d9965fbc15ae03569d9639a2731d12cebf1b34a3 Author: John Bowman Date: Sun Nov 28 11:07:58 2010 -0600 Fix unused value warnings. commit c75147a6a0f4bdd9bdca113dd3a91d2e9cca9e4d Author: Andy Hammerlindl Date: Mon Nov 22 19:33:07 2010 -0600 Fix userMin calculation. commit 81579ddd9d1c29b379be8fbd12198f5b8f0e206b Author: Andy Hammerlindl Date: Mon Nov 22 06:41:12 2010 -0600 Add fill paths to userMin calculation. commit 6265d4a32aa110f6eb2d82d3a88bfade0f26e442 Author: John Bowman Date: Sun Nov 21 10:29:59 2010 -0600 Fix definition of heavygrey. commit 8fd4d7688b9c8315d4275996108c051f4550443a Author: Andy Hammerlindl Date: Mon Nov 15 21:17:37 2010 -0600 Emulate old userMin/Max behaviour after transform. commit 815fe39946921fdc7ab677bf02155dd8f6193429 Author: Andy Hammerlindl Date: Mon Nov 15 20:38:23 2010 -0600 Changes to userMin/userMax interface for graph. commit d55f36264e0ed8c14c024dee791fbf91020354dc Author: Andy Hammerlindl Date: Mon Nov 15 20:36:57 2010 -0600 Re-implement userMin/userMax in repicture. commit d4be1ba2e67c506a3bf6af0f94a9a558e648d1b3 Author: John Bowman Date: Mon Nov 15 19:10:19 2010 -0600 Fix horizontal and vertical lines in Drawline. commit 91d758fe53e4b896028553eade4e20c4471bf4b9 Author: John Bowman Date: Sun Nov 14 11:43:27 2010 -0600 Update FAQ. Add integer version of partialsum routines. commit 87ea96ebf5e48282434745bfc9e615ebbcd4de8f Author: Andy Hammerlindl Date: Sat Nov 6 07:19:07 2010 -0600 Fix SIMPLE_FRAME flags. commit d6b0775041f54e4afbe9c060e7cffb553c005977 Author: John Bowman Date: Wed Nov 3 21:22:25 2010 -0600 Increment version to 2.09svn. commit b3951daf804b0e7285f91cdfab2f802d27ef5aa9 Author: John Bowman Date: Tue Nov 2 22:50:12 2010 -0600 Fix incorrect marker optimization in 2.05-45. commit 2de1d3071edf164d188ca6abf1962bde777149ea Author: John Bowman Date: Sat Oct 30 21:40:15 2010 -0600 Increment version to 2.08svn. commit a2c1fe84f6ca6c7184ed790df9093433a2bb63e2 Author: John Bowman Date: Sat Oct 30 19:20:47 2010 -0600 Work around missing CYGWIN prototype. commit 1e4dcd556029147596dd58892fb289353cb13dc3 Author: Andy Hammerlindl Date: Sat Oct 30 12:53:00 2010 -0600 Test while and do loops. commit 9d91b1617ac13f994865701b85d18f8ac401d535 Author: Andy Hammerlindl Date: Sat Oct 30 12:43:15 2010 -0600 Fix loop ordering. commit 396cbf6e8b3e6e83d2731f8af8cc949540ed58dc Author: John Bowman Date: Sat Oct 30 08:56:41 2010 -0600 Implement string mktemp(string). commit 2ea6d9965a38c28021e221832473283c5c19bee0 Author: John Bowman Date: Sat Oct 30 08:53:08 2010 -0600 Improve asyinclude so that asy source file is not required by publisher; make .asy extension optional. commit bdd8423abe94b67360faafce2c51b2c442071f00 Author: Andy Hammerlindl Date: Sat Oct 30 08:00:30 2010 -0600 Experimental closure implementation. commit bf515db31600ef29579f5b4ddff865a86a5ddd11 Author: Andy Hammerlindl Date: Sat Oct 30 06:01:39 2010 -0600 Refactoring of variable access. commit aaf081410074fdddb3ff3e94c62dba6a37f75a9d Author: Andy Hammerlindl Date: Wed Oct 27 18:44:51 2010 -0600 Removes inst::alloc. commit e72cce136c1791711d91098995f3a07dbd3dab7d Author: John Bowman Date: Wed Oct 27 16:51:40 2010 -0600 Add -P option required by gs 9.00. commit 2ba1eecfc8f34a3e784c34d68832fa290a1f6466 Author: Andy Hammerlindl Date: Wed Oct 27 16:30:35 2010 -0600 Allocates closures only when needed. commit 1ece08094f88644a790bd049a46dff9d6304dbf2 Author: Andy Hammerlindl Date: Tue Oct 26 17:35:37 2010 -0600 Don't push a frame on every loop iteration. commit 12e387dd2efd2c88870aad3a4960d0adc6b9e0d2 Author: John Bowman Date: Tue Oct 26 10:36:51 2010 -0600 Make limits work with reversed axes. commit 3ced6d47c7b36dbf6da4a5f5a957d9dce564e648 Author: Andy Hammerlindl Date: Tue Oct 26 08:23:51 2010 -0600 Defines opcodes in a header. commit ba35f6b8ecfabdeefbc5608951c971a6dcff300a Author: Andy Hammerlindl Date: Tue Oct 26 07:40:00 2010 -0600 Additional for loop testing. commit b7f599201df55456545371f0973b1b36aef1fd1c Author: Andy Hammerlindl Date: Mon Oct 25 20:31:29 2010 -0600 Refactoring of texpipe queries. commit 4f8f61d5d5eb32945700a6dad40fffc71a7370f9 Author: Andy Hammerlindl Date: Mon Oct 25 19:53:13 2010 -0600 Removes dead code. commit 4dba0c6d5143633c1071941b6ae6d62a7576ab27 Author: John Bowman Date: Sat Oct 23 19:11:32 2010 -0600 Increment version to 2.07svn. commit a9ff63643fc70a1c0af2c02b582e846241474cf2 Author: John Bowman Date: Sat Oct 23 16:14:41 2010 -0600 Force generation of asymptote.sty when building documentation. commit 6a0189334e67f49427f0bc7e074ef30fe74e5994 Author: John Bowman Date: Tue Oct 19 08:07:30 2010 -0600 Add missing CONST qualifier. commit 0242f30701e0b32525f63a838dbf851ab4076c4e Author: John Bowman Date: Mon Oct 18 19:08:41 2010 -0600 Add missing sty targets. commit 79c6efb8ddb219deeb3c7596cd101f23b98831ac Author: John Bowman Date: Mon Oct 18 02:17:25 2010 -0600 Increment version to 2.06svn. commit 7cabf7209638d0462b3d13f6753cf8d50054c932 Author: John Bowman Date: Sun Oct 17 23:58:30 2010 -0600 Replace asymptote.sty with auto-generated version 1.21 contributed by Will Robertson, with a new latexmk-compatible asyinclude feature. commit 9f0071ef25bc9ee8650f0a9cb947e8b32930f366 Author: John Bowman Date: Sun Oct 17 21:44:20 2010 -0600 In inlinetex mode, avoid interference from pre-existing aux file. commit 4bccec139811be55a82e004cebf40094143f0c1b Author: Andy Hammerlindl Date: Sun Oct 10 08:31:10 2010 -0600 Faster texprocess string matching. commit 78df14ffdfcf926e9e97f658a5fbb27652947489 Author: John Bowman Date: Mon Sep 27 20:59:34 2010 -0600 Remove quotes from textattachfile. commit fd7d89a12f2bc4a79940b60404c5111a4366045d Author: John Bowman Date: Mon Sep 27 01:50:25 2010 -0600 Allow spaces in file names. Support attaching of eps files when using dvips driver. commit 9b2a87833be4c40e39e936e904305686b677d8b3 Author: Andy Hammerlindl Date: Sat Sep 25 22:43:34 2010 -0600 Re-implement label system in coder. commit a6ebf8d91f6f3a4b7088a1c93019d16b6ef2b770 Author: Andy Hammerlindl Date: Fri Sep 24 16:43:08 2010 -0600 Faster fields test. commit 455357f859ad27e19dc8d2726fc490ca9bfda599 Author: Andy Hammerlindl Date: Fri Sep 24 16:42:13 2010 -0600 Optimizations in plain_repicture. commit c75cd8e741ccb1c477ca9116e53dcae4c2b89977 Author: Andy Hammerlindl Date: Fri Sep 24 10:12:24 2010 -0600 Handles default draw calls more efficiently. commit ae1b0856e1390fe5a9e55439b1e0e45ec812b8dc Author: Andy Hammerlindl Date: Fri Sep 24 09:06:05 2010 -0600 Avoid calling xasy commands during shipout. commit 4a3fc4de1f43b6e57852da5400099d6b244ef487 Author: Andy Hammerlindl Date: Fri Sep 24 08:59:21 2010 -0600 Crazy optimizations for plain_bounds. commit ac181cb08d1177dcbb4ba2de39493cc9f76f4800 Author: Andy Hammerlindl Date: Fri Sep 24 08:49:59 2010 -0600 Adds printBytecode function. commit 2f36994507b83ab59c7af94cc4b8fc8cc60dcc5a Author: Andy Hammerlindl Date: Fri Sep 24 08:33:57 2010 -0600 Opcodes for default arguments. commit 6627bacb1282178d1db6844de3fa95d968b4a866 Author: Andy Hammerlindl Date: Fri Sep 24 08:32:42 2010 -0600 Terse position info output by profiler. commit 9f12219807c2f415463e70b0487e42bf6acf7cf3 Author: Andy Hammerlindl Date: Fri Sep 24 08:29:48 2010 -0600 Profiler improvements. Adds timing of builtin function. Now gives output directly readable by kcachegrind. commit ef13d4a9ac4dfcb7ddd020c67f4464d5e0e6e13b Author: Andy Hammerlindl Date: Mon Sep 20 09:26:06 2010 -0600 Use old, deprecated timer for profiling for compatibility. commit ceff1a2df9ddfca7c9ae36028bd190964497d451 Author: Andy Hammerlindl Date: Mon Sep 20 08:36:00 2010 -0600 Change NullLabel to just null. commit 74e42795dbc169747ae792f951d9db5d679e1028 Author: Andy Hammerlindl Date: Mon Sep 20 08:12:23 2010 -0600 Test for clock_gettime support. commit d941ae286429e3e39337cce5ee21ea1f07cb71b5 Author: John Bowman Date: Sun Sep 19 20:20:43 2010 -0600 Handle above argument. commit 26c4c6b2535edd0f2498e8807a78248480cad281 Author: Andy Hammerlindl Date: Sun Sep 19 18:45:23 2010 -0600 Re-implement userMin/userMax. commit d35bbef720993d5dd209415dc16080b4f9e781d0 Author: Andy Hammerlindl Date: Sun Sep 19 17:56:37 2010 -0600 Renamed smartBounds to just bounds. commit 362d4475c79a97d1af12dbe5ba209519045c1855 Author: Andy Hammerlindl Date: Sun Sep 19 17:47:48 2010 -0600 Sizing of transformed path arrays handled in C++. commit 2cdae67be942ea7aa38bcee182fc730c2479476b Author: Andy Hammerlindl Date: Sun Sep 19 17:34:34 2010 -0600 Use NullLabel to avoid Label instantiation. commit 9d8c1c4818957a3460175a80ec95bb4807863d56 Author: Andy Hammerlindl Date: Sun Sep 19 17:04:56 2010 -0600 Add nanosecond counter to profiler. commit 8ea5d15b5f191c0359eb25aa93ac11531fc31ee4 Author: Andy Hammerlindl Date: Sun Sep 19 16:12:17 2010 -0600 Calculate bounds of path arrays in C++. commit a1468cc0d6f8fd946111f13931bfe4076e3a1ab2 Author: Andy Hammerlindl Date: Sat Sep 18 17:51:11 2010 -0600 More efficient calculation of extremes. commit 22c2481b1d549c1730083db70ba4ff6eeaffceca Author: Andy Hammerlindl Date: Sat Sep 18 17:08:14 2010 -0600 Avoid creating arrays of celltype error. commit 7140cd8a66595e42dc68f7b884b3149c37791f95 Author: Andy Hammerlindl Date: Sat Sep 18 16:29:25 2010 -0600 Adds calculation of extremal bounds. commit 6f3e85c39e7785cb0f65d30b531a33e00d3532ce Author: Andy Hammerlindl Date: Fri Sep 17 19:03:15 2010 -0600 Stores paths for sizing data. commit 146a0d496cba471523aea8abdfc30897e78cbb96 Author: Andy Hammerlindl Date: Fri Sep 17 18:21:16 2010 -0600 Reimplementation of transforms of pictures. commit 57a349e72797cbe8b317356040667046f078e44e Author: Andy Hammerlindl Date: Fri Sep 17 18:20:27 2010 -0600 Dump profile to a file. commit cd2c1384e779b5b244ead0b82979a5462d71ee4a Author: Andy Hammerlindl Date: Wed Sep 15 17:41:34 2010 -0600 Adds transformedBounds. commit 5a783605c08bac2a2d1766362c757ca15caf419a Author: Andy Hammerlindl Date: Wed Sep 15 15:52:30 2010 -0600 Adds freezableBounds. commit e95b926afc34136e4a19dcbbac259002b17aa730 Author: Andy Hammerlindl Date: Tue Sep 14 08:34:57 2010 -0600 More sizing refactoring. commit c9d6db1074e8c8b14d31c109ebc79329e0a26d41 Author: Andy Hammerlindl Date: Tue Sep 14 07:43:00 2010 -0600 Minor refactoring. commit d3d14e5aff62f15ae524a93077020a0dea9c40c1 Author: Andy Hammerlindl Date: Tue Sep 14 07:21:37 2010 -0600 Start of refactoring of plain_picture. commit 1495983b9fdb95982df14c7b058d225279d4a46e Author: Andy Hammerlindl Date: Sat Sep 11 16:21:45 2010 -0600 PRESYM is no longer an option. commit 74e0946ad0bcc12e7794d9d4e21958e0b8d9ef28 Author: Andy Hammerlindl Date: Sat Sep 11 16:07:45 2010 -0600 NO_FUNC_OPS is no longer an option. commit e9bedf1ce945afa3ef54a748ffeea0b508d03e84 Author: Andy Hammerlindl Date: Sat Sep 11 16:01:33 2010 -0600 TEST_ADDED_OPS no longer an option. commit 9e31c2c70428c5b9cb466754c5fb537f3408950f Author: Andy Hammerlindl Date: Sat Sep 11 15:54:55 2010 -0600 EXACT_MATCH is no longer an option. commit f062fd5dc49099c581a3cb377e212c603d4f941b Author: Andy Hammerlindl Date: Sat Sep 11 15:49:22 2010 -0600 CALLEE_SEARCH is no longer an option. commit ae118ffa5e19de397071dd191f974feedce172c4 Author: Andy Hammerlindl Date: Sat Sep 11 15:31:32 2010 -0600 FASTCAST no longer an option. commit a4968efea19ceb48b2c1575f30b6f6b94bd5f24a Author: Andy Hammerlindl Date: Sat Sep 11 14:50:43 2010 -0600 Avoid false positives in output testing. commit 632c5f8348d9da9934c49b57d107e2afc6c05035 Author: Andy Hammerlindl Date: Sat Sep 11 14:48:52 2010 -0600 Remove inappropriate comment. commit 9406ca4b9bfebbdab8a230f16c37cd7eef041611 Author: John Bowman Date: Sat Aug 28 09:42:09 2010 -0600 Update documentation. commit 6d62b2bdb1727d7b56b1cdb3401e0454be88c2a4 Author: Andy Hammerlindl Date: Fri Aug 27 21:39:49 2010 -0600 A nascant profiler. commit 6662e7316a3db521d3e0f6e20f4f6c762d19b3c8 Author: Andy Hammerlindl Date: Fri Aug 27 21:36:43 2010 -0600 Also needed for arbitrary depth array constructors. commit 2ba49e0e5a7da7287b7b46c34a29271987cc08fb Author: Andy Hammerlindl Date: Fri Aug 27 21:35:28 2010 -0600 Re-implement arbitrary depth array constructors. commit 4a72a1c8a4584804ed46edc7239d31131f1d288a Author: Andy Hammerlindl Date: Fri Aug 27 21:34:39 2010 -0600 Implement callableAccess. commit a8138ee42767e9b1649a13c47fe6fe1d757352a5 Author: Andy Hammerlindl Date: Fri Aug 27 21:34:08 2010 -0600 Re-implement item printing. commit 9bb04c479be057af191a5686f92c20a881521f44 Author: Andy Hammerlindl Date: Fri Aug 27 16:28:35 2010 -0600 Remove TODO items we have no plans to implement. commit e3962c6fc1f73b44ba66eb846779b4401f3aff98 Author: Andy Hammerlindl Date: Fri Aug 27 16:11:52 2010 -0600 Add TODO item. commit cbf8d06f86ec17a7718d50c226757cdfeea08db2 Author: Andy Hammerlindl Date: Fri Aug 27 11:46:45 2010 -0600 Add TODO item. commit 1cac46da6a8b2f3df3e547a7540bb9c64d777843 Author: John Bowman Date: Fri Aug 20 16:48:08 2010 -0600 Increment version to 2.05svn. commit 0f659e41a2e644c23bed47aa30a88520313275b6 Author: John Bowman Date: Fri Aug 20 00:26:35 2010 -0600 Fix jobname extraction. commit 2c5d9a2a024712f726cf77e390052076ac465289 Author: John Bowman Date: Fri Aug 20 00:25:24 2010 -0600 Avoid hyperref/fp conflicts. commit fd15dba79900ba4d2f5f427575447ebb87c64ad5 Author: John Bowman Date: Thu Aug 19 14:17:55 2010 -0600 Work around MikTeX jobname bug. commit 202e76f8e57b572cf6d7af199af8a1a721a67ac2 Author: John Bowman Date: Thu Aug 19 09:42:38 2010 -0600 Use \jobname in generated TeX files in inlinetex mode (to allow renaming of files). commit bd3ab978ce8f7d88c8005cb3be2fe434286756d7 Author: John Bowman Date: Tue Aug 17 07:14:43 2010 -0600 Make asyprefix work with obsolete versions of graphicx package. commit 41f82fa65bc9929fc3d0c5624e23814199912027 Author: John Bowman Date: Tue Aug 17 06:12:53 2010 -0600 Suppress messages from FP package. commit 461253a561ba8c6dc43c680488c77767632f1f3a Author: John Bowman Date: Fri Aug 13 06:05:44 2010 -0600 Fix documentation of render.merge=default. commit 69335bb2a494fd3ab0d40e8091712681521a6134 Author: John Bowman Date: Fri Aug 13 06:04:46 2010 -0600 Do not fill subdivision cracks in transparent labels. commit d4dba39de0514e82f86b456316fabe6756e1b848 Author: John Bowman Date: Tue Aug 10 13:37:07 2010 -0600 Revert last commit. commit 49a0247274e67d43fc3b6d940154dd1d84d25882 Author: John Bowman Date: Tue Aug 10 13:27:42 2010 -0600 Work around quoting problems with obsolete versions of graphicx.sty. commit f32271c511a95dbfd4ca451fde08d7ca44d642a6 Author: John Bowman Date: Thu Aug 5 13:57:53 2010 -0600 Fix man page. commit 652bdd01d7bf512bd3a3ab96071d54f550327297 Author: John Bowman Date: Thu Aug 5 03:23:38 2010 -0600 Add DOSendl and DOSnewl line xterminators. commit 36c0268bece291c00797a65221e55cb51a5369b2 Author: John Bowman Date: Wed Aug 4 14:56:21 2010 -0600 Handle MSDOS line terminators. commit 86aff539c9d093d0c51b7460e9ca889e4a2b7f68 Author: John Bowman Date: Tue Aug 3 13:10:10 2010 -0600 Increment version to 2.04svn. commit 7c7f66fb477566418d9f45f55c9863068b4e5385 Author: John Bowman Date: Tue Aug 3 06:14:46 2010 -0600 Fix blank 3D labels. commit eb7e475b6b5686bd3d85bcbac24e4bfa56e11a36 Author: John Bowman Date: Tue Aug 3 06:07:51 2010 -0600 Add world map example, courtesy of Jens Schwaiger. commit e5b8f62d73bcd6259fb2dc3efefb00f3a8fb1bda Author: John Bowman Date: Tue Aug 3 02:54:52 2010 -0600 Add latexusage \asydir support for putting asy files in a subdirectory (within which one then runs asy latexusage-*.asy). commit c8ef9049c17281ae495f3de25a65c3f0a2ef5cf1 Author: John Bowman Date: Mon Aug 2 21:28:08 2010 -0600 Fix inlineimage option. commit 102c273d071842d51a2b3036a07aa0af7a9377cc Author: John Bowman Date: Sun Aug 1 01:42:17 2010 -0600 Use $(MAKE) everywhere. commit f304126618eea4c501ec9c014ed9a4e3a82e00c3 Author: John Bowman Date: Sun Aug 1 01:08:42 2010 -0600 Clean up auto-generated files. commit 320f0c323efc4514a746aff1878d708e1e66cdae Author: John Bowman Date: Thu Jul 29 06:26:17 2010 -0600 Add missing pen and margin parameters to blockconnector function calls. commit fd56cadd4fc9075bf2ea95b13b679e321443f1a9 Author: John Bowman Date: Mon Jul 26 11:45:32 2010 -0600 Improve definition of Dotted. commit cf4732530cf046b7a4f0e63109eed5e7f64cb659 Author: Philippe Ivaldi Date: Sun Jul 25 06:48:26 2010 -0600 Implement fix of Olivier commit fb45aa2a5664199f278a62911e1205aa21370dce Author: Philippe Ivaldi Date: Sun Jul 25 06:33:27 2010 -0600 Remove trailing code commit 40d3075aeec88fc1402a0b2948200b01cc810c05 Author: Philippe Ivaldi Date: Sun Jul 25 05:41:48 2010 -0600 Fix casting degenerated ellipse to path commit 365f1a297d9b7275ab282742ee9c25a847d19dba Author: John Bowman Date: Sat Jul 24 00:09:39 2010 -0600 Add missing arguments. commit d0117f4f6844837362ea62b7bb40e7e7e37db16a Author: John Bowman Date: Thu Jul 22 23:30:17 2010 -0600 Fix typo in asymptote.sty. commit d068ce357b537c9322d5072cdab771a8b2b4e5ce Author: John Bowman Date: Thu Jul 22 11:32:23 2010 -0600 Remove unwanted blank lines from asymptote.sty; support XeLaTeX again. commit 5fac5e86473523db335119bffc3a5a4e0ce96783 Author: John Bowman Date: Sat Jul 17 21:24:51 2010 -0600 Support nonrendered preview images via render=0. commit c3f3b373cc80f9886d2ba4fa415b81da22bd0cb9 Author: Andy Hammerlindl Date: Sat Jul 17 13:36:06 2010 -0600 Optimize virtual methods. commit c73e9affc027e1c864c280bb3542ed7de9ccd3ce Author: John Bowman Date: Thu Jul 15 14:36:44 2010 -0600 Fix man page. commit 35039790021f0abe456342d830e55914075ba93f Author: John Bowman Date: Thu Jul 15 14:27:57 2010 -0600 Improve documentation. commit b293b2a70405ead60e25e812419b85f429235c75 Author: John Bowman Date: Tue Jul 13 13:40:55 2010 -0600 Update documentation. commit 49b6a721d1b8a57b74534ba4c51c4fc6cada4142 Author: John Bowman Date: Tue Jul 13 11:29:26 2010 -0600 Update MSWindows documentation on setting environment variables. commit 18e31bb1e82ff8046a79106d3324f5af7d6c846c Author: John Bowman Date: Tue Jul 13 11:24:33 2010 -0600 Automatically add Asymptote installation directory to MSWindows path. commit ab5d13c370add6eb69fab571919836c1a49348cf Author: Philippe Ivaldi Date: Mon Jul 12 16:23:41 2010 -0600 Fix directions with arcs in geometry.asy module commit 9287c8c7bd6bc4265a0b5567acac28788d1e1ae8 Author: John Bowman Date: Mon Jul 12 01:52:22 2010 -0600 Add output test to make check-all. commit 6a71afc7f41faa3cad79a0600c6e66cea3e4abe8 Author: John Bowman Date: Mon Jul 12 01:11:22 2010 -0600 Fix latexusage Makefile dependencies. commit feeb4ded2faedf174c97be5d540f4395803784c3 Author: John Bowman Date: Sun Jul 11 23:33:06 2010 -0600 Fix makefile dependency. commit 35c37874431d99b5b11f8bedad70fbe19469d37c Author: John Bowman Date: Sun Jul 11 22:54:35 2010 -0600 Remove perl dependence from source tarball. commit 4a06ca3d336219fca95c010061b0730b4c09c756 Author: John Bowman Date: Sun Jul 11 09:52:09 2010 -0600 Increment version to 2.03svn. commit 3dd9ad77a525aa8608eeeb44cc18aa3f118d3271 Author: John Bowman Date: Sun Jul 11 01:42:54 2010 -0600 Quote file argument. commit a047e05141ace0ac49176a466a13b6f292ed6bb2 Author: John Bowman Date: Sun Jul 11 00:38:31 2010 -0600 Fix typo. commit ad2403665c0e9decb1a5370c1738e86d9f08a216 Author: Andy Hammerlindl Date: Sat Jul 10 16:33:22 2010 -0600 Changed extended for statement errors. commit e9018da9ba4fa25596fb42396a525a94172a39f5 Author: Andy Hammerlindl Date: Sat Jul 10 15:06:05 2010 -0600 Better error reporting for extended for statement. commit 0f7ef36f919ccad768f447c58dce846860817e93 Author: John Bowman Date: Sat Jul 10 12:03:58 2010 -0600 Add latexmk custom dependency for EPS files. commit 5e4adcf20d3fdae99de2c2565667ed1ea455b9c9 Author: John Bowman Date: Sat Jul 10 10:52:15 2010 -0600 Fix makefile dependency; clean up files. commit b2486208672d373faf72463bda65bd9aa84fc165 Author: John Bowman Date: Sat Jul 10 02:19:57 2010 -0600 Fix asy() command. Delete duplicate example. commit d1f1afa0eb8f348d2ff9e85d8bf2fd3eb8ed8deb Author: John Bowman Date: Sat Jul 10 01:17:53 2010 -0600 Rename *_.pre preamble files to *.pre. In inlinetex mode, rename *_.tex files to *.tex. Allow the inline option to be specified for every figure. Implement a global attach default option. Do not generate a global latexusage.asy file along with the individual latexusage-*.asy files (this is a backwards incompatible change). Add latexmk support for compiling individually only those figures that have changed. commit 06191baaae190da09f18894b01fe70c574534d98 Author: John Bowman Date: Fri Jul 9 08:41:10 2010 -0600 Fix example. commit e0bc424b13aba48adbfaafaa91f3e2b684bdf05e Author: John Bowman Date: Thu Jul 8 12:01:55 2010 -0600 Minor simplification. commit 82bf92094ef0dc187075253682eb76c6468b0859 Author: John Bowman Date: Thu Jul 8 11:56:43 2010 -0600 Simplify texpath. commit d6b02f1be32ff3de9eafbe52e41c8b0e7db87fcf Author: John Bowman Date: Thu Jul 8 10:54:27 2010 -0600 Fix multiple fraction bar bug. commit 5ae9a888f9e3e2955c87684412d3deb1edabc8bc Author: John Bowman Date: Thu Jul 8 10:46:59 2010 -0600 Fix texpath("\relax"). commit 451ed2fa9b8443d3021984c0a698d854c0a3a9b5 Author: John Bowman Date: Wed Jul 7 09:54:38 2010 -0600 More portability fixes. commit 5a8986dd5c9a27cf45c80315ad0e2dec0315a321 Author: John Bowman Date: Wed Jul 7 09:05:00 2010 -0600 Define __GNUC_PREREQ if undefined. commit 6c9ec4ee269de9e2a8299a22580090154e51bd08 Author: John Bowman Date: Wed Jul 7 08:58:43 2010 -0600 More portability fixes. commit 6c47fd14b11a9f429be5196b7b1ac7319541d27e Author: Andy Hammerlindl Date: Wed Jul 7 07:22:38 2010 -0600 Re-implemented sanity checks in venv. commit 55557c59c13a6c289e17e3ebe6a9e809ae89fb58 Author: John Bowman Date: Tue Jul 6 23:45:57 2010 -0600 Fix warning messages/portability issues. commit 8cc169b9e14b775e235eee5c95f0a3bf5dec3fd9 Author: John Bowman Date: Tue Jul 6 15:22:58 2010 -0600 Remove obsolete infinite coordinates. commit 5b9962cd664a61a753b92ce7d771d3495c3be6f4 Author: John Bowman Date: Tue Jul 6 14:57:47 2010 -0600 Revert 1.97-23 for frames. commit d5ae51b2ef75de6ce0d408bf94ce5cf85832602a Author: John Bowman Date: Tue Jul 6 11:57:08 2010 -0600 Fix conflict between asymptote.sty and changebar package. commit a0361fb3ebe1f78e44d8d07f7c24f161f2c6b829 Author: Andy Hammerlindl Date: Mon Jul 5 14:30:12 2010 -0600 Minimized the impact of the NOHASH directive. commit bc7a7f8e7c803f6ea6a42d71892014b5cd42bec8 Author: Andy Hammerlindl Date: Mon Jul 5 13:56:17 2010 -0600 Common sub-expression elimination. commit c979f0b1d691e9035c978cc7a188a91dfda1bc22 Author: Andy Hammerlindl Date: Mon Jul 5 13:53:15 2010 -0600 Removed 'key' class from venv. commit 0f509e143738a758eb31cba0f6c3e1b4979da49d Author: Andy Hammerlindl Date: Mon Jul 5 13:35:19 2010 -0600 Removed dead code. commit 27400cbb97c9454f150a8f05237adcb15daf265e Author: Andy Hammerlindl Date: Mon Jul 5 11:46:23 2010 -0600 Custom hash table in venv. commit 33148865baed677644ec9206e24b751364ab9be1 Author: John Bowman Date: Mon Jul 5 02:44:07 2010 -0600 Support xelatex animations. commit 7205ed148d4663e1a0de4e2f994afd338d3b6a7c Author: John Bowman Date: Mon Jul 5 02:27:26 2010 -0600 Increment version to 2.02svn. commit de30983cb5f4be395ef392096cec503de7433d54 Author: John Bowman Date: Mon Jul 5 01:23:04 2010 -0600 Remove invalid option. commit 26ae5e989036159e6bbb5569be53b30318aed567 Author: John Bowman Date: Mon Jul 5 01:12:29 2010 -0600 Support individual processing of each figure within a LaTeX document. commit c4c98d4a896e3207fd43a815252dbce55bcb7799 Author: John Bowman Date: Mon Jul 5 01:03:52 2010 -0600 Update talk. commit 66c05e3a5bbf6563b3a0c51119853311227987dd Author: John Bowman Date: Mon Jul 5 00:22:55 2010 -0600 Revert to type1cm.sty since fix-cm.sty does not work as advertised. commit a79a7f5d52cbff70be05bf432cb50af1dbda4c64 Author: Andy Hammerlindl Date: Sat Jul 3 16:56:38 2010 -0600 For loop and var documentation. commit 63c28745e65efa3e49a1e91df04baca5d4d7d562 Author: Andy Hammerlindl Date: Sat Jul 3 16:52:23 2010 -0600 Allow var in extended for statement. commit 4b097c00549c6e67fc3e52fa88c58885b454825a Author: John Bowman Date: Sat Jul 3 01:37:08 2010 -0600 Delete old aux file. commit 8282862ccef850c116aced9748f299effd73f573 Author: John Bowman Date: Sat Jul 3 01:32:58 2010 -0600 Use settings.outname(). commit 0ebd3ceefce3fedee8e6405af46ab2ff284d2ce8 Author: Andy Hammerlindl Date: Thu Jul 1 17:05:34 2010 -0600 Enabled transConditionalJump. commit 282c8a98337af10de3ce40133dbe0a1b334638f2 Author: Andy Hammerlindl Date: Thu Jul 1 17:04:30 2010 -0600 Slightly more optimized bytecode. commit c9202c71ecdc432901d86f7608f8e2be7faa607e Author: John Bowman Date: Wed Jun 30 09:24:59 2010 -0600 Update example. commit ad2e01d9abc82576b4b6690c2ae84489400dadea Author: John Bowman Date: Wed Jun 30 03:51:04 2010 -0600 Update lecture. commit 594c0929596014b567855bfcb27120fedd3c64dc Author: John Bowman Date: Wed Jun 30 02:50:12 2010 -0600 Fix normal vector for perspective projections. commit 2fcb49b537e443ec0a1e9cd0ca70d05687e2aa3f Author: John Bowman Date: Wed Jun 30 02:43:26 2010 -0600 Revert 2.01-7. commit e3a210c6c8f490d66fe951998d583dabe1108cba Author: John Bowman Date: Wed Jun 30 02:20:14 2010 -0600 Add new examples. commit 0482f1e30ad4f3cf5a95f1341f974632c84b0f7a Author: John Bowman Date: Tue Jun 29 23:55:45 2010 -0600 Revert docdir changes since they break rpmbuild. commit b8828810887628ff47be1c8b82113458dc315f2a Author: John Bowman Date: Tue Jun 29 23:39:30 2010 -0600 Fix docdir. commit 4f9236b06747902a8ed07cf8d862905294570f18 Author: John Bowman Date: Tue Jun 29 22:53:02 2010 -0600 Use PenMargin in drawing a binarytree. commit 154b2cc14f0d405afd1c88645a6de8e890819072 Author: John Bowman Date: Tue Jun 29 22:49:17 2010 -0600 Check for \r as well as \n terminator. commit ac465c8dbcd10bc76db0b9bd107dd50d98c4b2d1 Author: John Bowman Date: Mon Jun 28 18:45:05 2010 -0600 Support docdir. commit 31785de3fb7ecc03427a8d1280d9348facb32d7c Author: John Bowman Date: Mon Jun 28 08:44:34 2010 -0600 Improve example. commit ce3da01f8c4ae0368a381a38eb1fecbbc02ca4b0 Author: John Bowman Date: Mon Jun 28 08:29:15 2010 -0600 Improve example. commit 9e2af753ee8bb420bd1e8590f72001804c049822 Author: John Bowman Date: Sun Jun 27 17:57:33 2010 -0600 Use values for BoolTruthValue and BoolFalseValue less likely confused with another type. commit faf789e220b79d61046567ecdfa54cadee29d400 Author: John Bowman Date: Sun Jun 27 16:46:03 2010 -0600 Add quasi-type checking for bools. Clear uninitialized item bits. commit ccb5ec5ec57e599454e1c12a5a0be113f185f2f0 Author: John Bowman Date: Fri Jun 25 21:44:33 2010 -0600 Update example. commit 1f8c956bee25307951b95384b40f0f2e00ee645f Author: John Bowman Date: Fri Jun 25 16:29:44 2010 -0600 Increment version to 2.01svn. commit 8c7aad3f741b646e0d779f2df57853123a07c1c2 Author: John Bowman Date: Fri Jun 25 13:27:05 2010 -0600 Fix warning message. commit 5696f65ccdf5c48c09806b172b7d9fde4aa47826 Author: John Bowman Date: Fri Jun 25 12:57:35 2010 -0600 Port to CYGWIN. commit 04da58c5cc915a34d75b5efb73df340345b73348 Author: John Bowman Date: Fri Jun 25 12:09:33 2010 -0600 Add 3D bar graph example. commit 54cca96e42935334c966a78f35994291f2fe546c Author: John Bowman Date: Fri Jun 25 11:49:46 2010 -0600 Update examples. commit f887acf5613925b857b2bc232cdf41c0b9ccecdb Author: John Bowman Date: Fri Jun 25 11:44:08 2010 -0600 Fix viewportmargin. commit d590f18c1ee65fa58abb24490611c9cb0de4d6b1 Author: John Bowman Date: Fri Jun 25 11:14:09 2010 -0600 Fix orthographic sizing. commit 121b68177e60e59716f78d28b8a808f7aad77433 Author: John Bowman Date: Fri Jun 25 02:32:04 2010 -0600 Rename GSL test. commit 10bc45c70c46fb13558e3996e0c5f60972fd1f95 Author: John Bowman Date: Fri Jun 25 02:25:11 2010 -0600 Fix displayed PRC units. commit 92e69381d148da6e6c1daae18d9d278994065264 Author: John Bowman Date: Fri Jun 25 01:08:24 2010 -0600 Remove unused array. commit 6e10720e4a06c53822a01240ea5108df19dbfbfb Author: John Bowman Date: Thu Jun 24 17:01:12 2010 -0600 Fix drawing of 3D thick lines of length 0. commit 13f4f6d20babb1c373b1c479dea510d1886f2f5b Author: John Bowman Date: Thu Jun 24 00:57:58 2010 -0600 Make lexorder in math.asy a strict partial order. Implement int search(T[] a, T key, bool less(T i, T j)). Batch 3D TeX labels. commit b8a4afd8ebfe8af6cb10025fb6d8a6d070dc62da Author: John Bowman Date: Wed Jun 23 00:09:35 2010 -0600 Remove unused code. commit 0ae9d0b1bc726142f2e5be4524756327371f91f2 Author: John Bowman Date: Mon Jun 21 08:54:34 2010 -0600 Suppress plain TeX page numbers. commit a50979917974199334c1173a4e02650ae38e2882 Author: John Bowman Date: Sun Jun 20 12:32:46 2010 -0600 Disable nonportable GSL tests. commit 511739b7fd0f39b51a959bd2da94d85683829bc5 Author: John Bowman Date: Sun Jun 20 12:20:46 2010 -0600 Make gsl optional by moving it to make check-all. commit ccdcbcdbf1bda211a1b2266c77ea2b0e13db9473 Author: John Bowman Date: Sun Jun 20 11:54:27 2010 -0600 More GSL portability fixes. commit 54763841fd01c553679f2894ad57f44c3a629e7c Author: John Bowman Date: Sun Jun 20 09:15:43 2010 -0600 Fix GSL typos; add tests. Restrict make check to a single processor. commit d92c2b5d6f7f2241ea7c296f85e54087d3f40018 Author: John Bowman Date: Sat Jun 19 22:25:10 2010 -0600 Fix preprocessor conditional. commit a1c4f8af41d44d2062e90742d49e21bfc606e603 Author: John Bowman Date: Sat Jun 19 22:16:51 2010 -0600 Fix typo. commit d4feaa7568704870cd449c402de0099c4f544418 Author: John Bowman Date: Sat Jun 19 22:16:08 2010 -0600 Move GSL functions to gsl.cc; implement Elmar's contributed GSL functions. Invoke the C preprocessor in pretranslating symbols. commit 690cfcf0aa780f5981e46360319bd2cfb27219da Author: John Bowman Date: Sat Jun 19 21:51:07 2010 -0600 Add unsigned int constructors. commit 088f6dfe2609b4311b5b04fba4fc600779029f7b Author: John Bowman Date: Sat Jun 19 09:08:34 2010 -0600 Update example. commit a29f0ae6edc9bef2348c6b8a2ef29a0cc7283f15 Author: John Bowman Date: Fri Jun 18 02:44:57 2010 -0600 Increment version to 2.00svn. commit 38c4c0eabbd3036a4e521f9499a51b5d01eef3f0 Author: John Bowman Date: Fri Jun 18 02:07:40 2010 -0600 Fix warning message. commit 06886a79e81b86dabe7154810d4b777e41909222 Author: John Bowman Date: Fri Jun 18 01:01:53 2010 -0600 Update test. commit 4f9950396d0db4476343d9ebe52618a54317fbda Author: John Bowman Date: Fri Jun 18 00:56:06 2010 -0600 Reduce example output. commit 2f4c7ccdd761c3cf94f72e33d0eb43d9300a423d Author: John Bowman Date: Fri Jun 18 00:43:38 2010 -0600 Fix bug in bezulate containmentTree. commit b1e65fac4ecc7602f23553bf41393c2cf036b803 Author: John Bowman Date: Thu Jun 17 14:04:11 2010 -0600 Optimize parametric surface generation. commit 9c0d3c750499848367823e9959e8f5e83d2fad51 Author: John Bowman Date: Thu Jun 17 13:39:00 2010 -0600 Remove --no-var-tracking for major g++ versions < 4. commit 5db587a903d7c2b08079fda22c7d514b07e0e04e Author: John Bowman Date: Wed Jun 16 18:11:49 2010 -0600 Fix perspective animations; update example. commit 9521ce051a606c89cf7333bd476a70cea055e8df Author: Andy Hammerlindl Date: Wed Jun 16 17:08:10 2010 -0600 Removed TODOs in venv that don't need doing. commit 5400903a52273381c371f443d4f24071d95104fd Author: Andy Hammerlindl Date: Wed Jun 16 17:03:56 2010 -0600 Removed value allocation in venv. commit d59254fdc8a40d9483ee81fbf2378ba9e9367230 Author: Andy Hammerlindl Date: Wed Jun 16 16:39:03 2010 -0600 Removed stack of hash tables from venv. commit 7ed665aac3d52908d22eadae8e81a7854282e93f Author: Andy Hammerlindl Date: Wed Jun 16 16:25:59 2010 -0600 Added test based on previous bug. commit 375d5cbeb14fdc63180a2aff83730d5510cf58d6 Author: Andy Hammerlindl Date: Wed Jun 16 16:23:05 2010 -0600 Eliminated string copying in knot.cc. commit 5a994f89782b6b9b1d07b8949c773ddb5f35b362 Author: Andy Hammerlindl Date: Wed Jun 16 16:21:11 2010 -0600 Fixed bug in equalityExp. commit d34affd98f7c402b3a6700390ac6df7eb37d7aa3 Author: John Bowman Date: Wed Jun 16 01:48:07 2010 -0600 Add settings.framedelay for working around OpenGL rendering buffer overflows. commit cae878ae959de8dadcf88e591ceeadb91be24a4e Author: Andy Hammerlindl Date: Tue Jun 15 11:37:52 2010 -0600 Added a (crucial) semi-colon. commit 2a0a9b985da818f5fc4703d42210e623371a2295 Author: John Bowman Date: Tue Jun 15 08:59:21 2010 -0600 Simplify code. commit 2a0b163cc572b5e51f86c8b5772d2e5f331e718c Author: John Bowman Date: Tue Jun 15 08:56:55 2010 -0600 Add example. commit a785cd197d6659dfb8b753d740c75655d25b98f8 Author: John Bowman Date: Mon Jun 14 18:16:05 2010 -0600 Fix segmentation fault. commit 20c67a102647d98789e225d701009d22457d2795 Author: Andy Hammerlindl Date: Mon Jun 14 17:10:17 2010 -0600 Avoid allocating in venv::key. commit 40c16a659eeae1ea6ce8e5dd43275813b6f43396 Author: Andy Hammerlindl Date: Mon Jun 14 17:00:42 2010 -0600 More optimizations. commit 63fd9dd9abe669707d6f3b4df33bd30631d60ed9 Author: John Bowman Date: Mon Jun 14 03:43:38 2010 -0600 Increment version to 1.99svn. commit 4a92fc6fb380f5d1d45d2f00d588dd716dafc8b0 Author: John Bowman Date: Mon Jun 14 02:39:57 2010 -0600 On C99-compliant machines with 64 bit integers, use compact items for the virtual machine, relying on Asymptote's internal type checking (compile with -DCOMPACT=0 to re-enable the type_info data field). This change required restricting T[] array(int n, T value, int depth=intMax) to 0, 1, or 2 dimensional arrays. commit 2d0f355e605d2fb39b0d335c6839a8bc44b1d3e1 Author: John Bowman Date: Mon Jun 14 00:43:24 2010 -0600 Fix definition of undefined. commit dfabcf0c75c88425b46aa49f9288aab2e56dc964 Author: John Bowman Date: Sun Jun 13 16:47:27 2010 -0600 Rename tube to pipe. commit fe9e1ce6dcc9d8b8b867ff4f26dfcccdc8f011e5 Author: John Bowman Date: Sun Jun 13 16:11:19 2010 -0600 Work around bug in gs 8.71: discard noncyclic stokepaths. commit f4ab39b112ff2a8556cb4902b7ec850ed6e09c1c Author: Andy Hammerlindl Date: Sun Jun 13 10:56:15 2010 -0600 Half-exact function matching. commit 1903265f72dbc64945a3521546294a3f8a39d2f6 Author: Andy Hammerlindl Date: Sun Jun 13 10:55:44 2010 -0600 Handle function equality specially. commit a5687d5012cebcbd136e380b4925b5073e69e763 Author: John Bowman Date: Sun Jun 13 10:03:39 2010 -0600 Improve example. commit 6dc39e598c7d266e2d71299f9dd178c35a5e6649 Author: John Bowman Date: Sun Jun 13 09:24:04 2010 -0600 Make heap_chunk_in_mb a multiple of 256MB. commit b0cc9e91e09476eb9cf4674afbabfe1ab6884122 Author: John Bowman Date: Sat Jun 12 12:14:19 2010 -0600 Revert 1.97-6 to 1.97-8. commit d7a18fb86278bd7e41893d4e674d97fdc4a497ba Author: Andy Hammerlindl Date: Sat Jun 12 12:06:29 2010 -0600 Overloading resolution optimizations. commit 5495d822f34c74f1cee29d2c602ba2b66a293203 Author: John Bowman Date: Sat Jun 12 01:24:50 2010 -0600 Improve example. commit 0c380fabf2ab302d854901b1e35a1008c79af990 Author: John Bowman Date: Sat Jun 12 01:15:54 2010 -0600 Align labels with rotational instead of shiftless part of transform. commit 270a7d8f272447c2b129f5d6300acaeac321abb4 Author: John Bowman Date: Sat Jun 12 01:14:29 2010 -0600 Update example. commit d15029ac56688e735505745e832b5383f587aed7 Author: John Bowman Date: Fri Jun 11 23:47:28 2010 -0600 Fix example. commit 42e8e417479615febe47aab2ad38085448fee146 Author: John Bowman Date: Fri Jun 11 23:46:51 2010 -0600 Increment version to 1.98svn. commit 8c440807b7dd480e211a9da99f24a36ed46a8707 Author: John Bowman Date: Fri Jun 11 22:19:24 2010 -0600 Replace M_PI by pi for portability. commit e5a8bbd84e1e16565db23cfedaffe4ed17fe71db Author: John Bowman Date: Fri Jun 11 21:47:41 2010 -0600 Fix warning message. commit 86a090c9e17b835a62e2b420360e4eb5dd9cbe0b Author: John Bowman Date: Fri Jun 11 21:27:14 2010 -0600 Fix typo. commit 4ef4f7fa338d00c22670cfb64ac19c652f432061 Author: John Bowman Date: Fri Jun 11 17:26:38 2010 -0600 Remove tr1 includes. Improve local gc detection. commit 24edeea48989b6754e960c1d5603cee5036135d4 Author: John Bowman Date: Fri Jun 11 14:59:59 2010 -0600 Rename log2 to Log2. commit 47239d2d7bf2ff0a06b40eebbde17bd5e875cb96 Author: John Bowman Date: Fri Jun 11 14:54:47 2010 -0600 Update examples to use merge=true for surfaces. commit 2a13ae2d20c397ebabee66007bd6078dda726116 Author: John Bowman Date: Fri Jun 11 14:53:22 2010 -0600 Remove unused preprocessor conditionals. commit e7d1f1b41b6836782737ddac6243ff85da692135 Author: John Bowman Date: Fri Jun 11 11:51:54 2010 -0600 Fix more memory leaks. commit 1688b329403a4b0feafb6d2668eefabe51437527 Author: John Bowman Date: Fri Jun 11 02:15:51 2010 -0600 Fix more memory leaks. commit b2c5a64ec4a70e12f164b4506f352ac1d561dfa2 Author: John Bowman Date: Fri Jun 11 01:48:05 2010 -0600 Fix PRC memory leak. commit 92959476779f23223923e1f40bee2b094049a288 Author: John Bowman Date: Thu Jun 10 17:09:05 2010 -0600 Remove tr1 (gcc-4.3) dependence, courtesy of Michail. commit 4d9baf01e9f28dcd183bc5b65e4c8faf318d69e3 Author: John Bowman Date: Thu Jun 10 10:24:59 2010 -0600 Add option (default true) to fill subdivision cracks in unlighted labels. Update examples. commit 5841cbfcbd7a8322b6f3fe7f135341613911d562 Author: John Bowman Date: Thu Jun 10 09:28:59 2010 -0600 Add patch to fix MSWindows memory limit. commit 28a24879a57cdb9dc45c05e8cb71a7eb26412d5c Author: John Bowman Date: Thu Jun 10 09:24:16 2010 -0600 Add missing include. commit f63c3894ad06e7ac3b2b3a9f43683c43258980ef Author: John Bowman Date: Wed Jun 9 23:08:24 2010 -0600 Fix typename of symbol. commit 5e4b712e6f785868bc262e723dabd7c2cfdbc300 Author: John Bowman Date: Wed Jun 9 22:00:22 2010 -0600 Add billboard support for Bezier curves. Fix OpenGL zoom flicker. commit c7c24cfe02221ff9794c510128cfab6e314bef9c Author: John Bowman Date: Wed Jun 9 21:01:46 2010 -0600 Update location of heap_chunk_in_mb in Windows registry. commit 833dbe2779e4f348e04bb3b7f0af00216fcdb618 Author: John Bowman Date: Wed Jun 9 16:25:20 2010 -0600 Use a portable integer log2 function. commit b024be7f16ebe43bf7d167c3b89180534801b6be Author: John Bowman Date: Wed Jun 9 16:22:08 2010 -0600 Work around missing readline include. commit 9342ef26ffac0aa70ee49a9f894a36fd95b01c81 Author: Andy Hammerlindl Date: Wed Jun 9 11:39:07 2010 -0600 Don't print non-printable characters. commit 79408482ecc8ca3186596ff40901b10c77699518 Author: John Bowman Date: Wed Jun 9 11:02:20 2010 -0600 Fix offscreen detection (broken in 1.86-1). commit 231eefe4d099f831716ca28c0c44246279fc8310 Author: John Bowman Date: Wed Jun 9 08:57:03 2010 -0600 Fix __GNU_PREREQ. commit 44a0ca929e6b4a198a9e56df226245bc94eb9e64 Author: John Bowman Date: Tue Jun 8 21:38:12 2010 -0600 Require tr1/unordered_map on systems without __GNUC_PREREQ. commit 80b5cc128a5b6396d494eec5e80750040f537c8a Author: John Bowman Date: Tue Jun 8 21:26:55 2010 -0600 Support older g++ compilers. commit 417b376f2a42fa04fd92e26e488f0925f1b17539 Author: John Bowman Date: Tue Jun 8 14:50:38 2010 -0600 Avoid g++ informational message and speed up compilation. commit d5521a7fe9f3c0493a3e5466fc43debe89dbe878 Author: Andy Hammerlindl Date: Tue Jun 8 11:39:49 2010 -0600 Replaced symbol table with custom hash table. commit 6ecbd76f3655d8bf238a97ada0f8d33806e51ffe Author: John Bowman Date: Mon Jun 7 11:29:30 2010 -0600 Emphasize that version 9.0 of Adobe Reader is now required. commit ed089dab2f0fc162aa2dc260d5146e435e5d746f Author: John Bowman Date: Mon Jun 7 10:05:16 2010 -0600 Update grouping. commit 64689d70232b0de6b06b3b454b4bc0e27782864d Author: John Bowman Date: Mon Jun 7 07:55:14 2010 -0600 Acknowledge contributions of Michail Vidiassov (coauthor with Orest Shardt of current PRC driver). commit b1d3c5ddb34cafadf4ed591c67708659262cb640 Author: John Bowman Date: Sun Jun 6 09:58:38 2010 -0600 Increment version to 1.97svn. commit 6f7690585672ce25a358d0e6fc73b254a0a5adf4 Author: John Bowman Date: Sun Jun 6 08:19:42 2010 -0600 Remove M_PI. commit 5f8a121a42bc7e96b339766432f606d6d57c4e74 Author: John Bowman Date: Sun Jun 6 07:40:50 2010 -0600 Update viewpoint, views, and examples. commit c04d65fe48b193db87d533f070b0a886a82e751b Author: John Bowman Date: Sat Jun 5 19:23:09 2010 -0600 Increment version to 1.96svn. commit 1cf0d1c166c74d02dc7b8245903e61cfd6ecb602 Author: John Bowman Date: Sat Jun 5 17:20:23 2010 -0600 Define M_PI. commit ca5899b50fa2590deb9310b29a57f7d76e0ac826 Author: John Bowman Date: Sat Jun 5 11:20:07 2010 -0600 Reformat. commit b5bc276002512428f88dc9e4c553fa74d1400086 Author: John Bowman Date: Sat Jun 5 10:25:26 2010 -0600 Improve interace to render options. commit e339b59145fec3386fa438d069de8a182d409268 Author: John Bowman Date: Sat Jun 5 02:12:43 2010 -0600 Remove tubesectors; simplify tube construction. commit 3e7be8212399aa9ec34f477b581a41aa41317d51 Author: John Bowman Date: Sat Jun 5 01:46:06 2010 -0600 Implement render structure containing PRC rendering parameters. Use begingroup3/endgroup3 consistently for both 3D pictures and frames, respective default rendering parameters. Add render(merge=true) to pipeintersection.asy to improve rendering speed. Improve PRC line capping. Use spheres for curved joints and roundcap. Use a higher resolution disk for squarecap/extendcap. commit fe3832771be157f636227aa7cca3dd9698e2c731 Author: John Bowman Date: Fri Jun 4 21:41:47 2010 -0600 Fix zoom. commit af08815dc768f9f6113ce74a2f9244ab39653dad Author: John Bowman Date: Fri Jun 4 16:46:49 2010 -0600 Expose granularity. commit 9b780a4258761a42ac41f30ca9c0a8f845451fac Author: John Bowman Date: Fri Jun 4 14:53:45 2010 -0600 Remove linesectors. commit 174c0c580925b67bd45d96de7ee1ec7281e342b7 Author: John Bowman Date: Fri Jun 4 14:52:15 2010 -0600 Implement Circular spline type corresponding to Bezier unitcircle approximation. Rename linesectors to tubesectors and change default value to 4. commit fa351463be16edea7e3916acd150f46fc51a59fc Author: John Bowman Date: Fri Jun 4 12:58:16 2010 -0600 Optimize tube spline routines. commit 3b874749207089960c0cc0652cf8278179512b89 Author: John Bowman Date: Fri Jun 4 01:35:59 2010 -0600 Improve group naming. commit f89f165458ba21b2dbc2e1f8b4f4c0ad144527b8 Author: Andy Hammerlindl Date: Wed Jun 2 19:51:22 2010 -0600 Added pre-translation of runtime symbols. commit f5f9bf24b41d0697f8eb8ab12129c3d7413d3069 Author: Andy Hammerlindl Date: Wed Jun 2 15:53:23 2010 -0600 Use pre-translated operator symbols in runtime files. commit aed4b49a60475e53c500e3821e4914c2fdc32d34 Author: Andy Hammerlindl Date: Wed Jun 2 15:38:52 2010 -0600 Use pre-translated operator symbols in builtin.cc. commit e0d130c1b655d159d93d20a4091916138e9eff38 Author: Andy Hammerlindl Date: Wed Jun 2 15:35:23 2010 -0600 Added var documentation. commit f9807d1b253f4070e5324a59d6d4346cf3dcc163 Author: Andy Hammerlindl Date: Wed Jun 2 15:25:28 2010 -0600 Pre-translate operator symbols. commit ba1d886ba1e9d6f1b1a238206daa8c9002d46670 Author: Andy Hammerlindl Date: Wed Jun 2 15:23:49 2010 -0600 Update errors for ambiguous cast to error. commit bd19d89d0d5cee238c40fc015c131d1c20132d6b Author: Andy Hammerlindl Date: Wed Jun 2 15:09:17 2010 -0600 Added a (disabled) experimental function resolution optimization. commit 83ed08e46e7e8332118817cea888160800048d27 Author: John Bowman Date: Wed Jun 2 13:48:16 2010 -0600 Improve 3D line capping. Improve tube center calculation. Remove PRCtube setting. commit 3a9f74da824e24b89d520ef3aa47862042918e50 Author: John Bowman Date: Wed Jun 2 09:59:36 2010 -0600 Use half sphere for PRC tube connectors. Revert to NURBSsphere again now that the rendering problems have been fixed (by using a nonzero granularity). commit ea0c762eb51e9578a61a080acb70e1d31051f35e Author: John Bowman Date: Wed Jun 2 02:51:24 2010 -0600 Complete last revision. commit c60bda8157d04f934526cdd1a37e1bda190f8f4c Author: John Bowman Date: Wed Jun 2 02:45:37 2010 -0600 Expose PRCoptions via begingroup. commit 56d84a0d913c6fffeb4b612cae31329f366556d5 Author: John Bowman Date: Wed Jun 2 01:39:39 2010 -0600 Reduce PDF loading time without sacrificing quality by setting granularity=1.0. commit acf90f95b1e682b25590267be59e45930e088c9c Author: John Bowman Date: Wed Jun 2 01:38:18 2010 -0600 Make PRCsphere the default until numerical transform issues with NURBSsphere are resolved. Add half=false option to PRCsphere. Implement PRCcylinder, PRCdisk, and PRCtube primitives. Use PRC primitives for drawing thick lines. PRC tubes (which may contain cracks) are drawn for curved lines only if PRCtube=true (the default). commit beed6b05dde975d183d865246304c0174086d800 Author: John Bowman Date: Tue Jun 1 14:12:34 2010 -0600 Update errors. commit 6ce405bc4fe399588749de0a04dd5a0058edf8b8 Author: John Bowman Date: Tue Jun 1 14:04:40 2010 -0600 Simplify code. commit a0807779f50bf6494a571bf3a70247dd9dfdff11 Author: Andy Hammerlindl Date: Tue Jun 1 11:39:32 2010 -0600 Added more overloading resolution tests. commit 5398bf7d0f767160dbea5b4143407b87779d1930 Author: Andy Hammerlindl Date: Tue Jun 1 11:30:59 2010 -0600 Added experimental inferred variable types. commit da50aa0fac52e0ece080daf0eb02375c98c6f9aa Author: John Bowman Date: Tue Jun 1 01:59:35 2010 -0600 Fix grouping. Make part names and compression group properties. commit 010aa8a113585cd5ae15d09c6c1c1e4e04fa957a Author: John Bowman Date: Mon May 31 14:28:30 2010 -0600 Remove context list. commit 4b98073813a448c0d45fbdd109e2ee1bf40232e1 Author: John Bowman Date: Sun May 30 21:07:52 2010 -0600 Disable 384MB Cygwin memory limit. commit fc372ba261454e2d54764c1b1d2ff043e1f25c78 Author: John Bowman Date: Sun May 30 02:17:21 2010 -0600 Implement optimized PRCsphere and NURBsphere. commit e11d0d6f70a0240c9a5e547f977a4a76097ae4dc Author: John Bowman Date: Sat May 29 21:39:38 2010 -0600 Replace SIGQUIT by SIGTERM. commit 0af63e2ebc43d50e1ce6cef40639760ecc0b6dc0 Author: John Bowman Date: Sat May 22 22:24:32 2010 -0600 Fix invalid memory access. commit 6ed0fc18676adf59d62d4563abd46889780a4efc Author: John Bowman Date: Wed May 19 23:48:25 2010 -0600 Fix example. commit 395fdda98745710d3e1c89ebeefd1a61af3fe7b5 Author: John Bowman Date: Wed May 19 22:00:44 2010 -0600 Remove granularity setting. commit b7cfa372079fef97b2ed446a67ea2f763d403f5a Author: John Bowman Date: Wed May 19 13:23:56 2010 -0600 Prune duplicate 3D dots. Implement new functions unique and lexorder in math.asy. commit 261b190f196623d8387fe1e660c66c6164bd7ed4 Author: John Bowman Date: Tue May 18 12:35:45 2010 -0600 Add embedder for PRC test. commit cd66b4f1998cc32d3712d984573d50733f31b4a5 Author: John Bowman Date: Tue May 18 12:30:07 2010 -0600 Fix prc dependency. commit 5eb109a6f8b2dd8b7c0c4c2a71e8f13c1f8471f1 Author: John Bowman Date: Tue May 18 10:48:08 2010 -0600 Remove debugging comments. commit c2a82f5e315ac93deb7365978f99207f24efd9fb Author: John Bowman Date: Mon May 17 22:53:48 2010 -0600 Fix compression limit. commit 151e2af3eef2d3843d9b4f4899594651649859bd Author: John Bowman Date: Mon May 17 10:47:00 2010 -0600 Update URLs. commit defd88d9592315ec2e74e914eb6ab8607229e391 Author: John Bowman Date: Mon May 17 08:55:40 2010 -0600 Use Adobe compression factor. commit bf629a87ab69dbec909a922da3b3dd5f6b3f4031 Author: John Bowman Date: Mon May 17 00:46:27 2010 -0600 Distinguish again between the 3D begingroup3/endgroup3 and the 2D begingroup/endgroup pairs. commit ac17585ecdf1084b4e5b2c7035974ee4f10220a3 Author: John Bowman Date: Sun May 16 23:52:15 2010 -0600 Update hyperref comment. commit 99db989fb8c21a62fdbbb3b24554e52917c48171 Author: John Bowman Date: Sun May 16 21:33:37 2010 -0600 Add example of using rendermargin to avoid rendering residue in included 3D images. commit 20cf63692fc6346c3e8d19e0edf111de5313d0d9 Author: John Bowman Date: Sun May 16 19:11:42 2010 -0600 Adjust default tubegranularity; remove spurious line. commit a00cefae26ec2a759bc6cb5d0ff962af596f0f19 Author: John Bowman Date: Sun May 16 17:52:09 2010 -0600 Use a reduced tubegranularity for constructing tubes. commit 749d3510510b36436c90a80e2f82ccf059d87e11 Author: John Bowman Date: Sun May 16 17:24:07 2010 -0600 Fix floating point exception in PRC compression routines. commit 543074437b2d40a122daf6164203058d2d9edfe7 Author: John Bowman Date: Sun May 16 02:50:12 2010 -0600 Add some of Michail's PRC enhancements, including lossy compression of surfaces. commit 2bcd6522db306dd86fafb52b1181c1d33cf742fe Author: John Bowman Date: Thu May 13 21:03:06 2010 -0600 Fix portability issue. commit f0e1ebfba330a539c89ea21cb7931186a7a2dc7f Author: John Bowman Date: Thu May 13 12:46:21 2010 -0600 Remove space. commit 223f3af025bd3bc45521f2b3d47eb795a08e5e43 Author: John Bowman Date: Wed May 12 23:17:46 2010 -0600 Only quote filenames where necessary (e.g. to support obsolete versions of asymptote.sty). commit d25b6c80eb6ac903729b1c5ffd3dbb0966a7b6c2 Author: John Bowman Date: Wed May 12 11:31:23 2010 -0600 Always use 256 bytes for random state array. commit 3bf7af6acb0a932b2efc94265955d1703a9966d3 Author: John Bowman Date: Sat May 8 23:17:36 2010 -0600 Remove unused file. commit 4e69ea886625688e8f31496ea50feed6e4520d92 Author: John Bowman Date: Fri May 7 14:32:28 2010 -0600 Use fftwpp namespace. commit 027f83fd2f98c77ba2a7a3e4aff1625b179a20cc Author: John Bowman Date: Fri May 7 00:43:32 2010 -0600 Update fftw++.h to v1.06. commit 5824e9ad1be409898af11ae9d79668863a89ee33 Author: John Bowman Date: Tue May 4 16:53:28 2010 -0600 Increment version to 1.95svn. commit 86c3c8b10e750576f6faf8bd1e395a73c9656242 Author: John Bowman Date: Tue May 4 14:47:23 2010 -0600 Predefine a default docdir for MSWindows. commit 67f05e202eed106e489f487b2e13dc6f3ce920d9 Author: John Bowman Date: Tue May 4 12:54:30 2010 -0600 Update CYGWIN xdr patch. commit 1b61f7e2d4c5a9938a805eaa9c0de028b284d885 Author: John Bowman Date: Tue May 4 11:18:57 2010 -0600 Document fit3() and remove restriction on projection.center. commit 4b8ddfdb2a838c2f86dbbc1602e29bd100c1af5a Author: John Bowman Date: Tue May 4 01:33:17 2010 -0600 Add missing CYGWIN declarations. commit af4e3100d2fe307cfea6eb656c0245b1f2bd17dd Author: John Bowman Date: Mon May 3 22:52:36 2010 -0600 Document pair dir(path, path). commit 0821c51418077505a97e764e0785a08f10465ba6 Author: John Bowman Date: Mon May 3 22:43:55 2010 -0600 Update documentation of math module. commit 0557500331a5d6077290eb8f6f431a6fdd15aa2b Author: John Bowman Date: Mon May 3 22:08:46 2010 -0600 Use outprefix(). commit 3509d303e536735d2ff415f821786dc7f2ca1960 Author: John Bowman Date: Mon May 3 21:40:17 2010 -0600 Implement matrix negation for arithmetic types. commit acf80ae7b563a67c1de8215b024a62439c32114f Author: John Bowman Date: Mon May 3 14:45:00 2010 -0600 Move pair[][] operator * (pair[][] a, pair[][] b) to C++. commit caaf88c123017e63a52fe4be8c4ddcb0df9d3639 Author: John Bowman Date: Mon May 3 01:56:45 2010 -0600 Add make cleaner target that runs make clean in the doc directory and make distclean everywhere else. Change make clean in doc directory so that it no longer removes asymptote.pdf and CAD.pdf. commit 71d827d19419e8cee54d084dec6da95e54671503 Author: John Bowman Date: Mon May 3 01:52:36 2010 -0600 Add picture.fit3(projection P=currentprojection) and add(picture dest=currentpicture, frame src, triple position) routines. commit a96c644ba6a820bc19018883848db5ce6f97fe90 Author: John Bowman Date: Sun May 2 23:05:10 2010 -0600 Avoid redundant mismatched version warnings. commit cc6fd22c81285fc7af9570658e384f2e204b0a2a Author: John Bowman Date: Sun May 2 22:52:40 2010 -0600 Fix guide bug intoduced in 1.55-2. commit de1591fe4ee05499e0d6b09b74ed5469525cf282 Author: John Bowman Date: Sun May 2 17:22:14 2010 -0600 Use a larger table for generating random numbers. commit 0e1811c2d95aac1bad23bd77d54ced726dff6c48 Author: John Bowman Date: Sun May 2 01:03:23 2010 -0600 Use accurate roots of unity in FFT shift. commit 6896be2016d9367d0321b9fdf3ef4eb7ef3ada6d Author: John Bowman Date: Sat May 1 10:14:10 2010 -0600 Fix fftNormalize. commit d7931ac1f3385ee4cd6fc713b6745cafb8d47a5c Author: John Bowman Date: Sat May 1 08:21:08 2010 -0600 Update documentation of addViews. commit 58dd0e82177b811876ab6266c55407fc54d7d883 Author: John Bowman Date: Thu Apr 29 02:30:10 2010 -0600 Improve fftw interface. commit d846b15bc5d8467814fb258ae93b139759baceb0 Author: John Bowman Date: Tue Apr 27 22:19:50 2010 -0600 Make local variables private. commit 7a1d259bd798091d09ff96e0f9aa1097482c3ad4 Author: John Bowman Date: Mon Apr 26 11:31:24 2010 -0600 Make pair dir(path,path) return a unit vector. commit dbff2e25683dcfdf2edf0c69d5f48870a147c6de Author: John Bowman Date: Mon Apr 26 11:28:15 2010 -0600 Fix return type of dot(pair,pair). commit 9556b5b0c17683511d021f766f82ac5e2f848608 Author: John Bowman Date: Sun Apr 25 22:05:00 2010 -0600 Implement pair dot(pair[] a, pair[] b). commit 1482e3940a184157b05308a4f6f8b160e1544c5c Author: John Bowman Date: Tue Apr 20 10:02:39 2010 -0600 Work around MSWindows registry problems. commit fcf1b66c5d7a33de4fd8f7648f4572b21208acd0 Author: John Bowman Date: Tue Apr 20 09:21:34 2010 -0600 Work around empty docdir. commit 5b874eeb8be118f5264bff3e36bdd040212ddba6 Author: John Bowman Date: Sun Apr 18 10:21:14 2010 -0600 Move shift variable to Execute. commit 6013f494ee9bd39606dc91e2a573e7548787b160 Author: John Bowman Date: Sun Apr 18 08:43:11 2010 -0600 Fix SimpleHead. commit 0d0240ee0398f3e1b267ce2610cc1820c5078bf0 Author: John Bowman Date: Sat Apr 17 23:20:54 2010 -0600 Move basic matrix operators from math.asy to C++ code and implement int and pair versions. Add vector and matrix conjugate operations. commit 6f5c4f6eb7f95524478c4698f77f7d293d357f3d Author: John Bowman Date: Sat Apr 17 17:39:05 2010 -0600 Add casts from int[][] to real[][], int[][] to pair[][], and real[][] to pair[][]. Implement int[][] diagonal(int[]) and pair[][] diagonal(pair[]). commit dec5637db7b47695cc7861a6fa4e44c0facfe3d7 Author: John Bowman Date: Sat Apr 17 16:37:44 2010 -0600 Implement a RadialShadeDraw filltype. commit eb9a39511d09cb90459a73edc3e9eec4538b5d39 Author: John Bowman Date: Sat Apr 17 09:33:56 2010 -0600 Increment version to 1.94svn. commit 1bab031382a4efe3d4ca689b66ac99fb81ce5ff0 Author: John Bowman Date: Fri Apr 16 20:13:15 2010 -0600 Expose outname() to asy. Revert revision 1.93-16 for strings containing spaces. Fix tex(picture). Add deactivatequote and activatequote functions for Babel users. commit 1a5d2311e66293c4050005c31c398bc739d561b0 Author: John Bowman Date: Fri Apr 16 20:00:30 2010 -0600 Redraw screen after export (for MSWindows). commit e63686d696ac00453dc79e14bf8979466d631b3b Author: John Bowman Date: Fri Apr 16 14:00:51 2010 -0600 Move backslash conversion into asy. commit f03e3a5a7150ba3fcdff5a6b4c18e5c49ff7d24a Author: John Bowman Date: Fri Apr 16 13:54:22 2010 -0600 Fix GUI export under MSWindows. commit 9ba6ab15f1b7722d6ab19c533b98a97485605601 Author: John Bowman Date: Fri Apr 16 11:58:48 2010 -0600 Improve camera position. commit 1018a5d12afdc254a364c052fb772d0fce772fa1 Author: John Bowman Date: Fri Apr 16 11:47:15 2010 -0600 Set size. commit 1694cc39454b2f92a3fa72ac24384cec6f9787d1 Author: John Bowman Date: Fri Apr 16 11:06:15 2010 -0600 Fix poster size. commit c178c191b01142455027304b0c3590a1b233acf3 Author: John Bowman Date: Fri Apr 16 10:46:48 2010 -0600 Revert unintended removal of inline option. commit b6952633aefb155e0fc3b1853b3d0c16c627f9c2 Author: John Bowman Date: Fri Apr 16 09:42:26 2010 -0600 Require user to double quote graphics file names containing spaces. commit bc3ae56dab8e42c56641860d38be78a44217ad91 Author: John Bowman Date: Fri Apr 16 09:31:29 2010 -0600 Ensure double quote character is inactive. commit 916180f64f9767fff8ebb6face6d45352952cfe1 Author: John Bowman Date: Fri Apr 16 08:49:27 2010 -0600 Clean up files even after errors. commit 979c9a3c2ce462c9ad2f3cf069b711fca556b99a Author: John Bowman Date: Fri Apr 16 01:00:40 2010 -0600 Fix latticeshading with -svgemulation. commit e7187eccf529ff914af7ead76e4fb6d8b3d85b23 Author: John Bowman Date: Fri Apr 16 00:37:58 2010 -0600 Fix SVG emulation. commit 0f5a9dd4bf43c704d585359260d11668507e0e99 Author: John Bowman Date: Fri Apr 16 00:17:49 2010 -0600 Fix initial SVG pen. commit a58312d7d39b9ff692f76a6273ae56dcaae7426c Author: John Bowman Date: Thu Apr 15 23:44:32 2010 -0600 Fix GUI export; add SVG export. commit d5749daff98e436018e252807041934aceded359 Author: John Bowman Date: Thu Apr 15 23:32:29 2010 -0600 Revert outname construction. commit 0c068d371412591c5beefc6db8ff830cd491a509 Author: John Bowman Date: Thu Apr 15 15:42:29 2010 -0600 Allow spaces in output directory name. All output files are written to the directory part of settings.outname; if this is empty, the current directory is used. Allow cd to other directories, preserving the output directory. commit 2af5f453b921965d21f4574bfd6594f910fafa53 Author: John Bowman Date: Thu Apr 15 00:58:42 2010 -0600 Remove obsolete bug workaround. commit c9f8e9b47015b9ab998125e0c51a57789b82d18a Author: John Bowman Date: Wed Apr 14 16:45:50 2010 -0600 Remove misleading deep qualifier. commit 4a9779a086e1611995265cf8de911ae15b32db95 Author: John Bowman Date: Wed Apr 14 14:28:06 2010 -0600 Add parallelogram block to flowchart module. commit 5737d8b20f5c45b06171b9da96ef443340416ca5 Author: John Bowman Date: Wed Apr 14 12:12:07 2010 -0600 Check for LIBGL on MacOSX. commit c8f5322cc6aecef2401add3effa45d97a22fdff4 Author: John Bowman Date: Tue Apr 13 10:20:24 2010 -0600 Fix preprocessor conditional. commit 418f6ac0683264c1a09d12998973c1f30fcb2a5d Author: John Bowman Date: Tue Apr 13 01:16:51 2010 -0600 Fix latticeshade stroke bounds. commit 42c40bca696b23287533ba39bc68ad7d43335188 Author: John Bowman Date: Mon Apr 12 22:22:29 2010 -0600 Support old versions of gcc again. commit d27450e2e7863586c7735ec233cc226804e457b0 Author: John Bowman Date: Mon Apr 12 01:55:34 2010 -0600 Increment version to 1.93svn. commit f8f609b8bdfcbde84de936d800cad37c063b8fb3 Author: John Bowman Date: Sun Apr 11 09:41:33 2010 -0600 Call init_readline only once. Remove obsolete CYGWIN readline initialization code. commit d035c7bb2e1060d11544e0d2e13143f5eed7793e Author: John Bowman Date: Sun Apr 11 09:34:01 2010 -0600 Fix typo. commit df7fb6ee773ecdd7a8b4a6b42d36944175638225 Author: John Bowman Date: Sun Apr 11 02:26:26 2010 -0600 Fix -lGL detection. commit bd5ac5a5358ddb735d147900bde91359a70db63a Author: John Bowman Date: Sun Apr 11 00:51:59 2010 -0600 More CYGWIN portability changes. commit 89f0c054f4b48540e7871e8be71ff26002ed3169 Author: John Bowman Date: Sat Apr 10 12:43:11 2010 -0600 Fix CYGWIN portability issues. commit 232d920b517418d211825e4b44ace7ed1be7e8da Author: John Bowman Date: Sat Apr 10 11:12:46 2010 -0600 Improve tr1 test. commit c5c85163ff1780a04acfca69983c939b2568656a Author: John Bowman Date: Wed Apr 7 21:19:31 2010 -0600 Add autorotate argument to yaxis. Document assert(bool, string). commit 9810c0fe06212adb96e6596f36bb3acc95432fc3 Author: John Bowman Date: Wed Apr 7 21:15:42 2010 -0600 Fix aspect ratio. commit bd9b2b7bcd7d9ad3664ced34e4914af2bbe7a828 Author: John Bowman Date: Wed Apr 7 16:18:14 2010 -0600 Add projection.normal to represent the normal to the projection plane, which differs from projection.vector() for oblique projections. commit 386bea2ad1f1297bf779f57021a69ca555a80588 Author: John Bowman Date: Wed Apr 7 13:32:07 2010 -0600 Make oblique projections work with billboard labels. commit 73dbd37642d26d5df9d7aaa6bc3a9367f3a0116e Author: John Bowman Date: Wed Apr 7 11:22:14 2010 -0600 Fix latticeshading. commit 503487818fecab50384aae143ac8a5170ddb9465 Author: John Bowman Date: Mon Apr 5 17:56:20 2010 -0600 Fix normal and true Circle calculations. commit 62d120909d49c8fd2f2fdd5eecfeaf9b0f372235 Author: John Bowman Date: Sat Apr 3 17:31:30 2010 -0600 Remove unwanted template. commit cf589ff765402ba5c2b320ffd159b01755e5716d Author: John Bowman Date: Tue Mar 23 21:05:38 2010 -0600 Fix typo. commit 4e6bbf0db6b0bacb3da05bf50a8d4e6a698fdc45 Author: John Bowman Date: Tue Mar 23 20:44:50 2010 -0600 Ignore null 3D paths. commit 25bd144b7fd648fba7275de6679fbfbb19931d24 Author: John Bowman Date: Mon Mar 22 23:03:58 2010 -0600 Fix revision 1.92-28. commit d853172f1a23d32abc709789d253854cf1356e65 Author: John Bowman Date: Sun Mar 21 22:35:06 2010 -0600 Add more predefined tick modifiers. commit 2c3c2a79a16220ac18d64cc3241b6538ccd6cd5d Author: John Bowman Date: Sun Mar 21 19:46:07 2010 -0600 Fix last change. commit fe4953f2f5c077f5b2b8e49e41d5ed94d8541b36 Author: John Bowman Date: Sun Mar 21 19:43:27 2010 -0600 Fix incorrect pt scaling. commit 01721697c8da4d855c560101bdc31e58be40e9b9 Author: John Bowman Date: Sat Mar 20 23:19:37 2010 -0600 Make integrate routines return structure including sampled time values. Enable dynamic timestepping for solveBVP. commit 7227e4f9134b4c3343da4f3a8635abc0671c6e19 Author: John Bowman Date: Fri Mar 19 09:36:21 2010 -0600 Configure Boehm gc with --enable-large-config by default. commit e55618a3367b32ae278c43818caa7f9c83814503 Author: John Bowman Date: Tue Mar 16 17:40:26 2010 -0600 Fix url. commit 282c78e96f3583800368c4b9b793407794084b81 Author: John Bowman Date: Sun Mar 7 10:48:36 2010 -0600 Rename FFTWdelete to deleteAlign. commit 02c9a6b01ef6f2c66f12c70a3740e09a37fc4d46 Author: John Bowman Date: Sun Mar 7 10:45:27 2010 -0600 Rename FFTWComplex to ComplexAlign. commit f498746961e4b72dd85b3296b71d626689f74449 Author: John Bowman Date: Thu Mar 4 13:59:27 2010 -0600 Fix array index. commit 3f4262148bfb4be6514dcc80ff1f4c8e3127439e Author: John Bowman Date: Mon Mar 1 10:07:51 2010 -0600 Make CLZ and CTZ portable. commit 1fad80aed5c6c19cf3ee3aa073992de8bae92729 Author: John Bowman Date: Sun Feb 28 22:54:54 2010 -0600 Implement CLZ and CTZ bit functions. commit a1ee8663ea8a51dad88d7d5dc4710bd34718226c Author: John Bowman Date: Thu Feb 25 16:52:27 2010 -0600 Ignore negative dxmax. commit 155b66150ff2b70f0ab8a54a33f1bfe4c3d0a8dc Author: John Bowman Date: Thu Feb 25 16:50:04 2010 -0600 Fix simpson for a > b and f decreasing. commit 455a749a478ea4ab86832a08de2e7465027a2e1e Author: John Bowman Date: Tue Feb 23 23:14:27 2010 -0600 Fix compilation on systems without OpenGL. commit 22c00b08408f19342212cf17e8bc1dd57468010d Author: John Bowman Date: Tue Feb 23 19:21:35 2010 -0600 Use portable definition of M_PI. commit c8144319f0d38661f859f0da5d5409863fd8f526 Author: John Bowman Date: Sat Feb 20 17:20:15 2010 -0600 Add missing arguments. commit 045941d441e7f37478a1756b836573a0f1116904 Author: John Bowman Date: Fri Feb 19 15:57:19 2010 -0600 Avoid implicit linking of libGL. commit 1bba3a3b88b0c73f4c80e92847e9f804e3520075 Author: John Bowman Date: Thu Feb 18 15:01:16 2010 -0600 Fix odd sized shifts in fftw++.h. commit ef008d597001d57eb0b0c1dc75084123754d9cab Author: John Bowman Date: Mon Feb 15 01:02:06 2010 -0600 Expose Shift functions. commit dad1fab51e6585e6e805c1784dc0bacdd7451db8 Author: John Bowman Date: Sat Feb 13 17:09:35 2010 -0600 Remove ambiguous constructor. commit df3d6aa4983f560ff92408be0f9fd139af831276 Author: Andy Hammerlindl Date: Wed Feb 10 08:14:26 2010 -0600 Minor change to comment. commit 417c566fd0ff23522987844de06c7013173c46b1 Author: Andy Hammerlindl Date: Wed Feb 10 08:13:54 2010 -0600 Changed alignment of slashes in macro. commit ff66cb16cd0fec709507fe54110e34444c8ffede Author: John Bowman Date: Sun Feb 7 16:21:17 2010 -0600 Fix compilation errors. commit baf491e809673492c975a2ad56c06e9501b4eb8d Author: John Bowman Date: Sun Feb 7 16:13:15 2010 -0600 Fix part names. commit 19bfed1a417bc86969786f91a814b4a941625935 Author: John Bowman Date: Sun Feb 7 12:34:19 2010 -0600 Update test code. commit 21911866dd8da04d3bf8b0b79763c38b9a1dec7c Author: John Bowman Date: Fri Feb 5 09:39:23 2010 -0600 Open oPRCFile in binary mode. commit 4bfb8ab6df3a871600411d79aebabd0c7f7b1f89 Author: John Bowman Date: Wed Feb 3 22:03:27 2010 -0600 Fix formatting. commit 03bc073aaff1d1c58247156dc5212617cd535aa6 Author: John Bowman Date: Sat Jan 30 22:04:48 2010 -0600 Fix typo in documentation of singlereal. commit ea2f9a3fe502d818d6d6efb17fa6d8923b3429bc Author: John Bowman Date: Mon Jan 25 21:33:52 2010 -0600 Make FFTW wisdom file name and effort flag public. commit c514c3c99dad4eb2e6c07f6888c8dd7de10344cb Author: John Bowman Date: Mon Jan 25 10:58:39 2010 -0600 Update documentation of fftw++ header file. commit 5a0a7c84a20086416aa66766faf394efd32c7b0b Author: John Bowman Date: Sat Jan 23 12:09:50 2010 -0600 Fix non-pdf output from PDF tex engines. commit fc548df7dbe7df930ca1520d57c3e8dd586cb682 Author: John Bowman Date: Tue Jan 19 22:12:07 2010 -0600 Improve diagnostic. commit 7254feea0ccde20412db7b4d640c941bc866ef46 Author: John Bowman Date: Tue Jan 19 03:50:50 2010 -0600 Remove implicit cast in favour of block constructor. commit 1c0664c196454994b1afa811f84efe1ab1320e9f Author: John Bowman Date: Tue Jan 12 15:31:13 2010 -0600 Improve example. commit 882c2548c71795338e7e14257c6a3e4c7ebd1d32 Author: John Bowman Date: Mon Jan 11 11:41:52 2010 -0600 Fix transformed Label alignment. commit a6deb333bb7da7ab635c1b9bd3b4795d364adf33 Author: John Bowman Date: Sat Jan 9 23:08:23 2010 -0600 Fix typo. commit f6615df2d1e4bfb913f36ab1501495700af940c2 Author: John Bowman Date: Sat Jan 9 23:06:11 2010 -0600 Fix conflicts. commit 784b52a16b58d1c154578229b41772206a5634a0 Author: John Bowman Date: Sat Jan 9 15:40:13 2010 -0600 Avoid uninitialized variable warning. commit 65adeb47bfb8b1779e73028a01d483a35a6aa8e6 Author: John Bowman Date: Sat Jan 9 15:38:02 2010 -0600 Upgrade to latest version of fftw++.h. commit efa08460ee77d46eb51c6f00f61a5820109292e7 Author: John Bowman Date: Sat Jan 9 15:34:31 2010 -0600 Simplify code. commit 295b27aa2a890594af18831f1fa4eb0b5aa27181 Author: John Bowman Date: Thu Dec 31 07:28:23 2009 -0600 Increment version to 1.92svn. commit 6bc9a2023414f230f92959f48c9d4baae6012050 Author: John Bowman Date: Wed Dec 30 23:05:07 2009 -0600 Remove obsolete freeglut patch. commit 19a0ff86a453d6676f1e945394a8ed2b0387dce4 Author: John Bowman Date: Wed Dec 30 14:27:38 2009 -0600 Set default font after \begin{document}. commit 6209c0b018c4ae8d1c3553c8bce67df8cbb1c3cd Author: John Bowman Date: Wed Dec 30 13:46:09 2009 -0600 Support transformations in lattice shading. commit d2e2ea24fc879cb10f4f9f6e5f9b950391086e77 Author: John Bowman Date: Wed Dec 30 13:31:21 2009 -0600 Update links. commit ad664e609896c95d5cd28f1831ce5e301e356247 Author: John Bowman Date: Sat Dec 19 09:18:46 2009 -0600 Untabify. commit be464a2252117e5c40bc95c395c2aec1557703f5 Author: John Bowman Date: Sat Dec 19 09:18:03 2009 -0600 Increase epsilon. commit 7e1e1a3dc2642c96f9ed814e36a961e6e4411ba3 Author: John Bowman Date: Sat Dec 12 12:33:40 2009 -0600 Replace "nonselfintersecting" by more standard term "simple". commit 44fbd7151a135685d2c894e01107397cd27e92b0 Author: John Bowman Date: Fri Dec 11 18:34:20 2009 -0600 Use a more robust contour algorithm based on approximating the function as a paraboloid, courtesy of Chris Savage. commit 6f69480a190ae9f049b94f644ec6a4825082aef0 Author: John Bowman Date: Fri Dec 11 17:21:04 2009 -0600 Avoid casting to path[] in write(guide[]). commit 733f624a1287b8c74c506b3bd59c77368e8219c1 Author: John Bowman Date: Sun Dec 6 00:13:51 2009 -0600 More example updates. commit 3bab1b8e5f417e4c10f363415997f520b0281bdf Author: John Bowman Date: Sat Dec 5 23:55:34 2009 -0600 Minor example updates. commit e74e417ed8f85648dc9ae54edb4b3c1399f49809 Author: John Bowman Date: Sat Dec 5 23:35:57 2009 -0600 Implement operator --(block, block) to simplify flowchart syntax. commit 2b0109e94a472b70f698b91ffa812ecb9766d285 Author: John Bowman Date: Sat Dec 5 13:40:40 2009 -0600 Add change missed in previous revision. commit 583bd0f3d3df48a3ae8cb15cb7a9976508548011 Author: John Bowman Date: Sat Dec 5 13:39:48 2009 -0600 Improve precision of minratio and maxratio routines. commit ce7b617314c9166c582adaf4efed415774e42b73 Author: John Bowman Date: Wed Dec 2 22:50:16 2009 -0600 Fix transformed 3D labels under -render=0. commit f6eb7355fb4a362ab97dcd0e5a370f93440408db Author: John Bowman Date: Wed Dec 2 12:14:49 2009 -0600 Revert last revision. commit b38ca30bf706db72a78d0fe00c4295885cb115d0 Author: John Bowman Date: Wed Dec 2 12:10:16 2009 -0600 Retune HookHead2. commit de56960ac36ea7e5ce2b39e38a569ae007d4b91a Author: John Bowman Date: Wed Dec 2 12:00:26 2009 -0600 Fix 3D planar arrowhead gap. commit d266b2c68c4b14631bb54ac1b9f24195fb9d32a1 Author: Philippe Ivaldi Date: Tue Dec 1 11:13:58 2009 -0600 Fix ellispe arc defined by abscesses when angle of ellispe is not zero. commit e17f928c56c2a92f4da55cbc961b245fc96ebe47 Author: John Bowman Date: Tue Dec 1 01:50:44 2009 -0600 Remove duplicate arrow angle scale factor. commit 21ab8e75dae93f012bec82b02b382aced39ad538 Author: John Bowman Date: Tue Dec 1 01:49:20 2009 -0600 Fix offset in transformed 3D labels with render=0. commit f26e5a96e68d1b598c6b06753f6733c30f22b19a Author: John Bowman Date: Sun Nov 29 22:21:35 2009 -0600 Revert 1.91-23. commit f1b58b43b3c051303d426f4e66f52361df3bcb3b Author: John Bowman Date: Sun Nov 29 13:17:32 2009 -0600 Fix pen size contributions to box and ellipse. commit ad867668187d1da48dee070b4445a057e7fdbedc Author: John Bowman Date: Sun Nov 29 12:59:29 2009 -0600 Update inlinetex support for xelatex. Load hyperref before patches/movie15_dvipdfmx.sty (renamed to movie.sty) under xelatex. commit bba661d24028af3e17488c3bc003dd3e854cd06e Author: John Bowman Date: Sat Nov 28 13:10:12 2009 -0600 commit 08a2b148c05d41f903ac401f83f6689b38c9525e Author: John Bowman Date: Fri Nov 27 17:50:55 2009 -0600 Move convert options before geometry. commit b771b0d77e280d8a16cdb0e2c590cc30cae718c3 Author: John Bowman Date: Fri Nov 27 12:10:41 2009 -0600 Remove -alpha Off default convert option in favour of convertOptions="-alpha Off". commit a751e0f8ba88956ca209ec9ca2f7bf540c17b020 Author: John Bowman Date: Fri Nov 27 11:45:11 2009 -0600 Use pngalpha driver only if antialias=2. Fix size of pngalpha images. commit e6a98e36c1a747f04ae2e442c53c70f14c7c31be Author: John Bowman Date: Thu Nov 26 18:32:36 2009 -0600 Add 3D examples. commit cb81e0a6d5ca377fa5e0f176a6efbcf12a7a1180 Author: John Bowman Date: Thu Nov 26 10:09:58 2009 -0600 Use hypersetup to avoid hyperref option clashes. commit 4958bc1628d5ab089b38a6fa804e396795bc37c0 Author: John Bowman Date: Thu Nov 26 09:31:15 2009 -0600 Reduce memory usage of example. commit a6105bc960e8ff69fb312cfc8ec2dd042c0faf0b Author: John Bowman Date: Thu Nov 26 09:27:20 2009 -0600 Fix braces. commit 3d67fe1cf5ca34f521cbc2b7a65992455fe35522 Author: John Bowman Date: Thu Nov 26 01:55:46 2009 -0600 Improve 3D logo. commit 2eaa852c0148cc9d1234930855a1e76b4a383b71 Author: John Bowman Date: Wed Nov 25 14:21:37 2009 -0600 Change colorslinks to pdfborder={0 0 0} in hyperrefOptions. commit ce77532c7d40b9e354bee36d115d407a19de900b Author: John Bowman Date: Wed Nov 25 10:17:37 2009 -0600 Reduce conflicts by renaming the Bessel functions J and Y to Jn and Yn. commit adbbdbdf423482b977aabe318b471464fdb149ac Author: John Bowman Date: Wed Nov 25 09:56:22 2009 -0600 Add colorlinks to settings.hyperrefOptions. commit 261348d1ccc2094841cca8e1873f9d09173c9f66 Author: Andy Hammerlindl Date: Wed Nov 18 22:38:56 2009 -0600 Added % for the last answer on the interactive prompt. commit 2484f7016690e242356dfa81b1178873825981dc Author: Philippe Ivaldi Date: Wed Nov 18 05:31:57 2009 -0600 Fix horizontal & vertical lines commit 9f3a29d8323c8cc50ed8bed536d610154b8ef5a5 Author: John Bowman Date: Tue Nov 17 12:46:36 2009 -0600 Rename example. commit 9f2225f1aa08a3a153077907d7eddad0d4b31a0e Author: John Bowman Date: Tue Nov 17 12:45:18 2009 -0600 Add example of a polar graph produced from discrete data. commit 5c2fe7c11396ec23328a9bb43f9ad5d360db97f3 Author: John Bowman Date: Tue Nov 17 12:38:24 2009 -0600 Implement operator ..(tensionSpecifier t) and join3(tensionSpecifier t). commit 9b5fa939349b94a7cde0e7eb84f1a274fdcf4360 Author: John Bowman Date: Tue Nov 17 12:12:18 2009 -0600 Implement polargraph(picture pic=currentpicture, real[] r, real[] theta, interpolate join=operator--). commit c8a62c7395f1a48f5c5b6b68c53c47b60beeeaa8 Author: John Bowman Date: Tue Nov 17 11:08:04 2009 -0600 Add Sierpinksi examples, courtesy of the cvgmt group. commit d4c786480b4d9f93b5fec598d164ca2aabc51e34 Author: John Bowman Date: Sat Nov 14 00:59:23 2009 -0600 Improve example. commit dd619b1378bfbb217d50007794a6591c811f6ebf Author: John Bowman Date: Sat Nov 14 00:53:02 2009 -0600 Add example. commit f39aa1796dd3acd99d7ffb873d80d4b310c2d8ad Author: John Bowman Date: Sat Nov 14 00:19:52 2009 -0600 Add check that parametric array for spline interpolation is increasing. commit c7ee92332c676d56eb5b1a5197c218fd5bbc42b6 Author: Andy Hammerlindl Date: Thu Nov 12 22:54:00 2009 -0600 Removed unused lookInTopScope methods. commit 3d58516911511dfab639a321afd7e5e26bb85dd9 Author: John Bowman Date: Mon Nov 9 14:12:20 2009 -0600 Increment version to 1.91svn. commit 77e42713c6bbe652511319b8b373bacafacfa6d2 Author: John Bowman Date: Mon Nov 9 11:02:46 2009 -0600 Document SVG output. commit a00bc7781bee6c2f39e4d9096a571ea3bc8f0b44 Author: John Bowman Date: Mon Nov 9 09:16:15 2009 -0600 Remove preprocessor symbol in preparation for upcoming dvisvgm-0.8.7 release. commit fdfd0d00a8e791f7b4d9cd765cb58cb8769f54fc Author: John Bowman Date: Mon Nov 9 08:57:29 2009 -0600 Fix SVG axial, radial, and emulated tensor-patch shading. commit 8e628ad269ae1d0f921e1ebd11cefde0d61aef8d Author: John Bowman Date: Mon Nov 9 02:36:31 2009 -0600 Increment version to 1.90svn. commit 87d2f40f639d69a126e5ea9385ae582ef143f02e Author: John Bowman Date: Mon Nov 9 01:26:17 2009 -0600 Fix timer argument. commit bd1af45298cbacb90ecc22a4d9c2358212164ed6 Author: John Bowman Date: Mon Nov 9 01:13:46 2009 -0600 Check for uninitialized shading pens. commit 0134dfdf3b3f8c0338f3120c1559b07388cbd188 Author: John Bowman Date: Sun Nov 8 23:14:03 2009 -0600 Implement emulation of Gouraud shading in SVG. commit 396f32a9acea190fe1ac4edbf8a98d894adf2ae2 Author: John Bowman Date: Sun Nov 8 23:12:33 2009 -0600 Add routine that returns the intersection time of the point on the line through p and q that is closest to z. commit 9bc23dcee01574f5e18548de44f795834f049eb9 Author: John Bowman Date: Fri Nov 6 12:55:09 2009 -0600 Improve missing fft diagnostic. commit f3d623e7dea46f3e93ea6f0a8007c21e0b80c64d Author: John Bowman Date: Thu Nov 5 18:08:27 2009 -0600 Reduce PRC NURBS memory usage. commit 61e0a584d00a4b8cf0310e819309d9d669f9cce1 Author: John Bowman Date: Thu Nov 5 17:50:29 2009 -0600 Fix rational NURBS curves; add example. commit 7835fffdbd04dadb20132b830fce0fe60c6072ca Author: John Bowman Date: Wed Nov 4 05:54:57 2009 -0600 Reduce maxangleiterations. commit 6d6b217bc8c6a942def28f2172df23bf978cb5cb Author: John Bowman Date: Wed Nov 4 05:49:55 2009 -0600 Revert to previous value of fuzz in ratio. commit f46da67ff8116f94f667cc746d161b2f17ad75db Author: John Bowman Date: Tue Nov 3 14:29:46 2009 -0600 Port recent changes to CYGWIN commit c5e55a514d847442cf3964f9d5b054ad26b277ee Author: John Bowman Date: Mon Nov 2 22:39:31 2009 -0600 Always generate at least NColors. commit c0a54c9bde7af034c1d9fad7ceb08a048dfc2e8a Author: John Bowman Date: Thu Oct 29 20:17:04 2009 -0600 Implement path3 unstraighten(path3). Increase fuzz in ratio. commit 99338b8ddf43f3d1378c1c550d6f4390d78fd0d9 Author: John Bowman Date: Thu Oct 29 10:16:17 2009 -0600 Add support for NURBS curves. commit 67157c7e7a9daa746fba5f2918e7ce844497554e Author: John Bowman Date: Wed Oct 28 23:44:27 2009 -0600 For SVG output, explicitly draw a circle instead of a length 0 path. commit 0848be7129602a33b549b7580cd4b2f4f31db984 Author: John Bowman Date: Wed Oct 28 02:36:35 2009 -0600 Avoid unnecessary copying of linetype structure. commit 34c8a0e8c0513b2337bec7974b26499b4028ec79 Author: John Bowman Date: Tue Oct 27 10:04:54 2009 -0600 Avoid negative dash patterns. commit beaddd303da81161cfb48fc171e6ef563981bcfc Author: John Bowman Date: Tue Oct 27 02:32:34 2009 -0600 Change linetype pattern from a string to an array of reals: a string is still accepted (for backwards compatibility), but the return type of linetype(pen) is now real[] instead of string (backwards incompatible). Implement native SVG path output (still requires dvisvgm-0.8.6). Implement SVG emulation of tensor patch shading (for a single patch). Change split so that an empty delimiter splits on spaces, discarding duplicate spaces. Add fillrule argument to draw(pic, path[], pen[]). Implement missing add routines. Implement 2D FFT. commit 00e952a57e9f9bbda96353de3373f0d6e5526dde Author: John Bowman Date: Tue Oct 27 01:46:53 2009 -0600 Minor optimization. commit 96fd0fe7e05563cc256fba6c895e064826efd558 Author: John Bowman Date: Mon Oct 26 10:54:05 2009 -0600 Generalize example. commit 05a17fddf40670c0435bea7cce5d82db2b8f1923 Author: John Bowman Date: Mon Oct 26 10:46:27 2009 -0600 Improve example. commit 0dfac9e96a027b8677f8aa708155aa2faea6af25 Author: John Bowman Date: Mon Oct 26 10:44:23 2009 -0600 Simplify example. commit 0380e389da6be2a056ece5e8586985aadf481286 Author: John Bowman Date: Mon Oct 26 10:32:44 2009 -0600 Improve inset graph. commit 37da15cebb919bc42c1ad7c3bc6f14b0470c43d3 Author: John Bowman Date: Fri Oct 23 00:10:48 2009 -0600 Fix rational NURBS sizing; add example. commit 57ebc8ffefa5ac6c3735ec8115fd98ded085dd75 Author: John Bowman Date: Thu Oct 22 23:41:37 2009 -0600 Fix control point normalization of rational NURBS surfaces. commit 0211934ae5bf87c192a68ecac2339d511529812b Author: John Bowman Date: Thu Oct 22 00:29:30 2009 -0600 Enable workaround for dvisvgm bounding box bug (requires dvisvgm-0.8.6). commit 6c63d91654cbe7b929a0750f92749ae71b4c6331 Author: John Bowman Date: Mon Oct 19 14:14:52 2009 -0600 Fix typo. commit 1852ebbdf6968606424c611eba5609abd5dc9107 Author: John Bowman Date: Mon Oct 19 14:13:51 2009 -0600 Fix inlinemovie3. commit 54551fedfb8047a3ca3ca50f0bbfda07a119b85a Author: John Bowman Date: Mon Oct 12 14:44:03 2009 -0600 Resolve ambiguity in arc. commit 1b2b1d9d1de46d07d2cb16ab92ba0dad431985fd Author: John Bowman Date: Mon Oct 12 10:12:13 2009 -0600 Don't garbage collect PRC entities. commit aca4826183e96d9f193883a1373447e59318ab28 Author: John Bowman Date: Sun Oct 11 08:39:19 2009 -0600 Improve colours. commit 2f57f3013c38bce184d9f822fff740155a059292 Author: Orest Shardt Date: Sat Oct 10 15:04:06 2009 -0600 Do not compute vector at (0,0); use a instead. commit 11d22f73ce385277021a7f5aa1dd0acc1d9af68b Author: John Bowman Date: Fri Oct 9 02:13:23 2009 -0600 Convert labelpath to png for svg output. commit 36f156597d65d8381c26fe5c975f0503d88eba68 Author: John Bowman Date: Thu Oct 8 16:28:27 2009 -0600 Add support for passing bbox to dvisvgm (currently disabled; this requires dvisvgm-0.8.6 from http://dvisvgm.hg.sourceforge.net/hgweb/dvisvgm). Fix erase when outputting SVG graphics. commit f480bb7082de70848628ff6bcb6b113a2a24a958 Author: John Bowman Date: Thu Oct 8 14:17:12 2009 -0600 Fix formatting of error messages. commit 4a7cbd42478c92051c16f084f33a949480614f11 Author: John Bowman Date: Wed Oct 7 21:12:37 2009 -0600 Use ghostscript pngalpha driver to produce transparent png files. Produce transparent png files for unsupported SVG elements. commit 9fe5af671b62c0be5dee2c3fc5c65c803b0282be Author: John Bowman Date: Tue Oct 6 21:59:53 2009 -0600 Fix surface and path3 garbage collection. commit 6e1823d47ca88b8f2f7dbc0047134a2f6d108f73 Author: John Bowman Date: Tue Oct 6 21:06:44 2009 -0600 Improve garbage collection. commit 8eb8dd4dd23a2f01cfb83dc13c104ed1f4d63482 Author: John Bowman Date: Mon Oct 5 23:21:23 2009 -0600 Force pdfformat when using a pdflatex texengine with an alternative output format. Force settings.align="B" for non-EPS output formats. commit 039d69203c0c6fa63d33482853450003f5d41dfd Author: John Bowman Date: Sat Oct 3 15:45:21 2009 -0600 Workaround broken curses.h header file on i386-solaris. commit aaf46eaa973bb4574fecfab4b6920435a4cdc556 Author: John Bowman Date: Fri Oct 2 15:54:31 2009 -0600 Fix center table compression under optimization. commit de78b4ca31253167f2f7bf427566342126880513 Author: John Bowman Date: Fri Oct 2 09:03:23 2009 -0600 Document Billboard and Embedded labels (see the example billboard.asy). commit e59a608e691ab1b829843808ba4355428428e334 Author: John Bowman Date: Fri Oct 2 02:51:30 2009 -0600 Add code for removed file. commit c0fc62ca6d83523cdf0e82e41925c1fe54d1b5d2 Author: John Bowman Date: Fri Oct 2 02:50:40 2009 -0600 Increment version to 1.89svn. commit 3d506c981417015fad8b50c58f1c7ae8c5515166 Author: John Bowman Date: Fri Oct 2 01:25:43 2009 -0600 Remove obsolete part name code. commit f771a8671cdfa4caf9effb46f86e44f76465b422 Author: John Bowman Date: Thu Oct 1 21:52:36 2009 -0600 Add Arrow to tutorial example. commit 1a7944b9c943c2488edd366c322b8866a1ee7248 Author: John Bowman Date: Thu Oct 1 21:45:34 2009 -0600 Store center values in a lookup table. commit f016bed702c2b32a3e1351eec8f322c30e7923b2 Author: John Bowman Date: Thu Oct 1 17:37:30 2009 -0600 Implement PRC billboard labels. Rename settings.billboard to settings.autobillboard. Make settings.autobillboard=true by default. commit 3cd6f39dcd3340cdc936c6a2cbe70c642dd402d3 Author: John Bowman Date: Tue Sep 29 17:09:51 2009 -0600 Improve tutorial. commit 83d1250ec4df70d30b3b113e0fb656bb2f7b6682 Author: John Bowman Date: Tue Sep 29 14:59:26 2009 -0600 Improve tutorial. commit 28ec8495d0062c18dea0b6902cffdaa3661f794c Author: John Bowman Date: Tue Sep 29 10:07:11 2009 -0600 Add examples. commit 476b4de0787becd2e1f4ce567b8ea01e637abd61 Author: John Bowman Date: Mon Sep 28 19:42:07 2009 -0600 Fix compilation under -disable-gl. Fix billboard size computation. commit 40e003e12fba455444cf863bafc4f916036e20a9 Author: John Bowman Date: Mon Sep 28 14:27:52 2009 -0600 Add example of arbitrary 3D background plane. commit 956766e1ab552e8ad330f41703728a2539693b29 Author: John Bowman Date: Mon Sep 28 14:21:07 2009 -0600 Cache meshpen, knot, weight, and color arrays. Change bottom=false argument to bottom=true. commit c72533006097421745e15983fd5bd3ad090d2363 Author: John Bowman Date: Mon Sep 28 13:39:58 2009 -0600 Clean up auxiliary dvi file when producing SVG. commit a2aa7a0b9be009c587b5fd6bae57962f53184b03 Author: John Bowman Date: Mon Sep 28 10:16:08 2009 -0600 Add operator * (transform3, obj). commit b3d646dfef5d4326a3aa5bff4745ae713ca5223a Author: John Bowman Date: Mon Sep 28 03:39:58 2009 -0600 Increment version to 1.88svn. commit f13df983c7f9a4db3b2498dcbe56f2a61e1df596 Author: John Bowman Date: Mon Sep 28 01:57:28 2009 -0600 Simplify code. commit 5700ba631f979a809a7b685cbc495f9035725ca8 Author: John Bowman Date: Mon Sep 28 01:30:36 2009 -0600 Implement settings.hyperrefOptions. commit a251ed7aee647f84007449515bf186d241d2ed4e Author: John Bowman Date: Mon Sep 28 01:13:24 2009 -0600 Implement billboard labels in OpenGL renderer (not yet implemented for PRC). commit bff9ef341c1595388e2049760f58a0ab5385b197 Author: John Bowman Date: Sun Sep 27 14:54:59 2009 -0600 Implement framerate option for OpenGL movies. commit f5b6d19deaed77f141de84d40912cd68ec752550 Author: John Bowman Date: Sun Sep 27 14:31:34 2009 -0600 Fix OpenGL animations. commit d571f0bb2a62f666fb46d3c6d82df51c98ab02e3 Author: John Bowman Date: Sat Sep 26 22:50:38 2009 -0600 Implement a projection() function that returns the interactive camera parameters as a projection. commit 0ed8cb015056d1ce22944ca82abf4655420440ca Author: John Bowman Date: Sat Sep 26 22:21:39 2009 -0600 Fix premature memory deallocation bug. commit 28c90d0ce6ece4ef15c31b9b8cb077c3b4d2c7fd Author: John Bowman Date: Sat Sep 26 10:05:26 2009 -0600 Simplify transform3. Add additional functions for inverting paths to 3D. commit 68a46d3ff504f6235e5a2b04f7bb8b4117a13de5 Author: John Bowman Date: Fri Sep 25 14:47:37 2009 -0600 Improve tutorial. commit 005b5d7da149db0da8cb3de5a000e87596a31919 Author: John Bowman Date: Fri Sep 25 11:17:02 2009 -0600 Fix erase. commit 47fdd56f0895eca33d282b2db950df4040051635 Author: John Bowman Date: Fri Sep 25 00:51:29 2009 -0600 Minor documentation improvements. commit 158761286236e4c3ed3493930d0fed5679c8a87a Author: John Bowman Date: Fri Sep 25 00:29:33 2009 -0600 Resize 3D example. commit 93b4686d2ff546fc2dcf705b9c4af5c40a54e8ff Author: John Bowman Date: Fri Sep 25 00:27:33 2009 -0600 Don't modify settings. commit 6b54c2fde17460fd58d1cd08194a92fa174cec18 Author: John Bowman Date: Fri Sep 25 00:08:10 2009 -0600 Fix viewportsize bug. commit 0831668a76a53c0a62e8b49fa69977e4c10b7387 Author: John Bowman Date: Thu Sep 24 23:04:19 2009 -0600 Improve tutorial. commit 413d037c5d3de6e905e0ce13eb711c2eaaaa8f2f Author: John Bowman Date: Thu Sep 24 22:59:37 2009 -0600 Make erase() clear the PostScript canvas again. Implement an interactive erase commmand that does not require parenthesis. commit e99368945ae28cc10e0065912bbf0345e9d060da Author: Philippe Ivaldi Date: Thu Sep 24 17:29:07 2009 -0600 Add support for master tex file to asy-mode.el commit ec61cada1c64452fe97ac0ffd6d0785fabe115c4 Author: John Bowman Date: Thu Sep 24 16:33:47 2009 -0600 Set ucyclic and vcyclic only for surfaces described by a full matrix. commit 6345c5afffd670d231aee5e05ced5662bcea905d Author: John Bowman Date: Wed Sep 23 10:55:31 2009 -0600 Move miniltx path parsing patch into C++ code. commit 970f70cf4fab1dee495bbf9f95c0bfcd077b85d4 Author: John Bowman Date: Tue Sep 22 15:29:30 2009 -0600 Simplify interaction of -outname and prefix argument of shipout. commit 83689ba1321c3019c0af56e8b15304b602ba6ee5 Author: John Bowman Date: Mon Sep 21 21:17:44 2009 -0600 Add patched graphicx.tex file. commit 95dde9cbab250b9e20adb69f1d92f32a2370d5ac Author: John Bowman Date: Mon Sep 21 13:19:12 2009 -0600 Improve indexedfigure API. commit 7fe28533c9d2775911ee9da568fb69d29e9e9d9e Author: John Bowman Date: Sun Sep 20 08:59:36 2009 -0600 Generalize OmitTick to omit both major and minor ticks. commit 4e2c341347215e7aed1d002b169ec176ca1da8b7 Author: John Bowman Date: Sat Sep 19 23:28:23 2009 -0600 Simplify ENDIAN test: avoid redundant flags and support ACTION-IF-UNIVERSAL. commit c7bc6f7711db47756997888d70846b65724787d0 Author: John Bowman Date: Sat Sep 19 23:18:31 2009 -0600 Remove spurious spaces from example. commit 15471a4ff31ff7ae8b8e17c36f92fd44d41b4500 Author: Philippe Ivaldi Date: Sat Sep 19 04:18:26 2009 -0600 Add links to licence commit 99a99b9a5750d3a72ee8ec4641f13c6d0d3df863 Author: John Bowman Date: Fri Sep 18 23:07:43 2009 -0600 Update example. commit 28d308a229977054f066af360635027f500a0f1a Author: John Bowman Date: Fri Sep 18 23:01:27 2009 -0600 Generalize addViews to handle any layout; change the default from ThreeViewsFR to SixViewsUS. commit d20c0989d6f7914f839d67760fa7fa7157dfb012 Author: John Bowman Date: Fri Sep 18 15:48:06 2009 -0600 Increase dvisvgm verbosity level. commit 57254a17d7bfd6f7daa4a948215435ebe7116eef Author: John Bowman Date: Thu Sep 17 23:29:55 2009 -0600 Allow PRC node names for labels and dots. commit 84e20dc1912c59b45231828be24d9b5ef2fdd373 Author: John Bowman Date: Thu Sep 17 22:13:04 2009 -0600 Add stereoscopic example. commit 0e6d64647683c0e8ec650c6ede27f2bfe2fc4a9a Author: John Bowman Date: Thu Sep 17 11:48:06 2009 -0600 Implement addStereoViews. commit 06988fdcfc225a82fa57b85e5763c433e14cad32 Author: John Bowman Date: Thu Sep 17 09:51:24 2009 -0600 Remove obsolete patch. commit 79e893678011406031dcdadc7f903710e17aba16 Author: John Bowman Date: Wed Sep 16 21:38:30 2009 -0600 Add reverse and step actions for OpenGL movies. commit 620b86903c7e0416295ddd4cb0c4210187360d87 Author: John Bowman Date: Wed Sep 16 20:43:51 2009 -0600 Make stop pause animation. commit ccdc35f8f4e3504943d62f3fca7dba701ae0c910 Author: John Bowman Date: Wed Sep 16 13:52:14 2009 -0600 Add support for svg output; this requires a DVI-based TeX engine and (preferably patched version of) dvisvgm-0.8.3 from http://dvisvgm.sourceforge.net/ commit b0ba757a3acd232a4b7d604e4d3a6a7976e4bf97 Author: John Bowman Date: Tue Sep 15 21:12:04 2009 -0600 Update links. commit d52ed585466957d4a26c67d06690861b99f9f0da Author: John Bowman Date: Tue Sep 15 13:42:16 2009 -0600 Handle a degenerate axis range. commit c66d26028097560e9e56c88ec96c2c7704df1a6a Author: John Bowman Date: Tue Sep 15 13:18:06 2009 -0600 Handle degenerate palette ranges. commit f9242094efa6d9f49c3b36fd8f4106202d47613f Author: John Bowman Date: Tue Sep 15 04:04:45 2009 -0600 Remove obsolete pstoedit patch, now that pstoedit-3.50 has been released. commit bf8510a58161029ac28abfc8ef02964ae06511d6 Author: John Bowman Date: Sun Sep 6 13:08:25 2009 -0600 Increment version to 1.87svn. commit 1294be62b09d75a8af7c5583d7d31ff7ec1a1d3c Author: John Bowman Date: Sat Sep 5 13:34:57 2009 -0600 Fix uninitialized variable. Add missing name arguments. commit 44dea257993a1d0b8b85dbf8ebee7b92594a2208 Author: John Bowman Date: Sat Sep 5 01:17:23 2009 -0600 Fix string ambiguity. commit e76df5392dfc3f00dc25a901d6251b91d9220161 Author: John Bowman Date: Fri Sep 4 15:36:17 2009 -0600 Remove spurious argument. commit 436701369ae2f53c4573fdaad99d55ec1527ab3b Author: John Bowman Date: Fri Sep 4 15:35:24 2009 -0600 Move begingroup and endgroup to oPRCFile class. commit 2539dc4db71731e27766310f0fdc9dad7e9a52c9 Author: John Bowman Date: Fri Sep 4 15:28:31 2009 -0600 Remove spurious brace. commit 132a6294bc632deb35417c7b5cc6246316d1b886 Author: John Bowman Date: Fri Sep 4 15:27:09 2009 -0600 Add PRC model name support to begingroup3 and endgroup3. commit 4ef5eb3cdce70a1eb8c383444b9efd3c01b5d45d Author: John Bowman Date: Fri Sep 4 10:28:47 2009 -0600 Support naming of PRC parts. commit 8fabefee19a41ea9735b4ec98de1e9385553e9f8 Author: John Bowman Date: Fri Sep 4 05:28:59 2009 -0600 Check for correct version of readline library. commit fbb620ff0ee3a9c5d0a33b4983dd0d51ee732c30 Author: John Bowman Date: Fri Sep 4 05:13:50 2009 -0600 Add -lreadline to $LIBS. commit b89417fbb590c3a3d1645f8fc0d09cb99b0c7623 Author: John Bowman Date: Fri Sep 4 05:06:33 2009 -0600 Fix readline test. commit 9a6132abdb8d529587ee7edb28b5d185c8beead3 Author: John Bowman Date: Fri Sep 4 04:39:43 2009 -0600 Improve GNU readline test. commit 7c7246361d8378fbe01997a1d978a3ea2de20e3d Author: John Bowman Date: Thu Sep 3 12:35:35 2009 -0600 Fix typo. commit 2e2f756209acc727ea0bb95e70c2935da3b74cdf Author: John Bowman Date: Thu Sep 3 12:34:12 2009 -0600 Fix radius of curvature at nodes. commit 262d7c7f6f95b1986fe6a97366fcd3a30611ae84 Author: John Bowman Date: Wed Sep 2 16:39:30 2009 -0600 Reduce NURBS memory usage in polynomial case. commit 240415803877c72d83513e5d70a83559153809a7 Author: John Bowman Date: Wed Sep 2 16:36:06 2009 -0600 Fix NURBS sizing. commit 4f525cec551be4f68f1c2b50cb734ec86d9795de Author: John Bowman Date: Mon Aug 31 02:00:43 2009 -0600 Optimize PRC polygons. Reduce surface memory usage. commit c90bfe48427c48edf00eb6f5d7baddfd7340ae5d Author: John Bowman Date: Fri Aug 21 17:45:52 2009 -0600 Increment version to 1.86svn. commit 6a73c6c84f03bf801c2a3e3e21fd14d96d6086ef Author: John Bowman Date: Fri Aug 21 15:22:51 2009 -0600 Fix typo. commit 6d98b59a38857d7f9e0f5c52cd2514f03eb3ead0 Author: John Bowman Date: Fri Aug 21 15:22:10 2009 -0600 Move remaining picture operations. commit f47a7155eaa39e2218d25563a989246a96e23f92 Author: John Bowman Date: Fri Aug 21 15:21:36 2009 -0600 Rename labelsurface to surface; extend also to surfaces containing a single patch. commit be47838d06af021d2074aa8d09580e2bf19fb965 Author: John Bowman Date: Thu Aug 20 23:08:28 2009 -0600 Add missing pen dimensions to sizing routine. commit e86466c814c27abddcdde8ba534c6b8dd0144fe0 Author: John Bowman Date: Thu Aug 20 22:15:10 2009 -0600 Fix compilation on platforms that lack OpenGL. commit 9bc8505e57fbbb496b4231ad75218e369c91f249 Author: John Bowman Date: Thu Aug 20 08:39:20 2009 -0600 Increment version to 1.85svn. commit 0f99c085bd848e8ea759e8027938d7234b83c62d Author: John Bowman Date: Thu Aug 20 00:47:14 2009 -0600 Fix readline conditionals. commit 78dfab9cb0667c2c7e0907d1393c8223acacfded Author: John Bowman Date: Thu Aug 20 00:26:46 2009 -0600 Split runtime further. commit d2af5f1ac81c368f813006f8dda2f7cff88ff046 Author: John Bowman Date: Wed Aug 19 22:18:19 2009 -0600 Split runtime further. commit fb91344ff828361d467468ab012ad8ce5be3c779 Author: John Bowman Date: Wed Aug 19 22:06:02 2009 -0600 Split runtime.in further. commit 6543e81a99fa39d9b2737f805eb918c36a37681a Author: John Bowman Date: Wed Aug 19 17:23:45 2009 -0600 Start splitting runtime.in. commit 224a0cabc2a2571be7c4e9e82a22c0e14b8cce63 Author: John Bowman Date: Wed Aug 19 07:52:08 2009 -0600 Rename example. commit 79e9aea7b99386a7f939bb820a2d7cdba4ff4ed6 Author: John Bowman Date: Wed Aug 19 01:12:04 2009 -0600 Move new example to examples directory. commit 0ec04f08aa90a6b60d51108d4048299a62b7ebb3 Author: John Bowman Date: Wed Aug 19 01:08:56 2009 -0600 Extend NURBS interface. commit 17363b9b3fbcbaaf91137cc3aa2a3308f8159d35 Author: Andrei Catuneanu Date: Tue Aug 18 22:08:55 2009 -0600 Added structure pertaining to recursive subdivision of patches. Added example of use in surfacesplit.asy. commit d358b2232f83cc0708aa5670098d938e1d21ea57 Author: John Bowman Date: Tue Aug 18 10:30:30 2009 -0600 Remove obsolete function. commit 1b39ef88f10a730c9233ec8d9abeaf53b90d3d12 Author: John Bowman Date: Mon Aug 17 00:16:29 2009 -0600 Move approximate NURBS bounds to C++ code. commit 7f5652be5d1c3df6ab5deabebc66ab60daf4519b Author: John Bowman Date: Sun Aug 16 15:50:08 2009 -0600 Remove inline qualifier. commit c23f68334ca0a21c236498c806a958bb1731b851 Author: John Bowman Date: Sun Aug 16 15:44:05 2009 -0600 Fix perspective PRC viewportmargin. commit 785cbe47263c17d355184a247e64c8de0224aa9b Author: John Bowman Date: Sun Aug 16 14:57:48 2009 -0600 Enable rational NURBS. commit a7bf3625b440fad36f9fb89eee5ce651bdee580d Author: John Bowman Date: Sun Aug 16 14:46:04 2009 -0600 For clarity, use single quotes instead of double quotes. commit 690c54d98e06da6ee8931fb47ad20ad06028a017 Author: John Bowman Date: Sun Aug 16 11:08:20 2009 -0600 Compare to control point bounding box rather than patch bounding box. commit ff6c5bcc60187796e21ef5dc89f7bfde0b7c2e52 Author: John Bowman Date: Sun Aug 16 10:06:11 2009 -0600 Fix comment. commit 9ef12ec3ca7f52064ef0471748ba24c80329e595 Author: John Bowman Date: Sun Aug 16 01:19:43 2009 -0600 Add preliminary NURBS support (so far only implemented for PRC). commit 099ec542b77e480fdbb604222051b7396242ac57 Author: John Bowman Date: Sat Aug 15 20:53:15 2009 -0600 Clarify asymptote.sty license. commit de6005b749685dc44b8ceda243cb22f7be27068f Author: John Bowman Date: Sat Aug 15 09:38:41 2009 -0600 Remove unwanted spaces in asymptote.sty. commit 972dda4fa1cb6f8c816797f06da6c3c5911c8dd9 Author: John Bowman Date: Sat Aug 15 03:01:42 2009 -0600 Increment version to 1.84svn. commit 6634bb81d4d89ee1f824064af635a69215f226d1 Author: John Bowman Date: Sat Aug 15 01:16:08 2009 -0600 Fix dependency. commit 9c1a615f4b4ac132f0bb5c2e68bff26269c46d6e Author: John Bowman Date: Sat Aug 15 00:28:59 2009 -0600 Embed parametric equations on Klein bottle. Add new example. commit 19f934368489b7223888adb889015611188a4f9c Author: John Bowman Date: Sat Aug 15 00:17:32 2009 -0600 Improve diagnostics for missing libz library or texi2dvi program. commit e4b876f284c2df9de310df65112847402748d73b Author: John Bowman Date: Fri Aug 14 23:25:57 2009 -0600 Add light argument to fit() and shipout(). commit 01c20bad45364434a4b532c03f255f5dfde46e33 Author: John Bowman Date: Fri Aug 14 22:36:55 2009 -0600 Remove redundant angle arguments. commit 801972e733d768a3f7bccd0f8a3835b28a7b485b Author: John Bowman Date: Fri Aug 14 21:57:06 2009 -0600 Remove unwanted quotes from LaTeX jobname. commit 76e4f53bb7104026a12e8e2aef525a3ed2d2b27f Author: John Bowman Date: Fri Aug 14 17:05:07 2009 -0600 Fix display of generated file names with spaces. commit 204d3a3d6ad00203b843161aeda0d8f871145ce1 Author: John Bowman Date: Fri Aug 14 09:05:32 2009 -0600 Check only primitive types for virtual file mode members. commit 63535fdc7dc4245437aaef5b88a07ea74ad1dd79 Author: Philippe Ivaldi Date: Fri Aug 14 08:50:49 2009 -0600 Removing duplicated text of license commit f945cbfd799439d8af6b5cd26a4246e15598b108 Author: John Bowman Date: Fri Aug 14 04:19:54 2009 -0600 Restrict file modes to ty_file. commit d8203d9c0b8a4084b36a0b7c9cdc304a731f622a Author: John Bowman Date: Fri Aug 14 04:02:48 2009 -0600 Update tests. commit 31794c39134751f2697bf84eaa42c2019dc13e05 Author: John Bowman Date: Fri Aug 14 03:41:41 2009 -0600 Make file mode functions virtual members; this backwards incompatibility requires that line(file f) be changed to f.line(), etc. commit 4e479144f8f21f35b97ab322c32dd31a82e98d62 Author: John Bowman Date: Thu Aug 13 22:36:05 2009 -0600 Remove obsolete cyclicflag and void cyclic(bool) functions now that the cyclic member of an array is writeable. commit 3b4595b6f31ca06107f589f58b558727135bce96 Author: John Bowman Date: Thu Aug 13 22:06:27 2009 -0600 Don't overwrite viewportmargin. commit 7b97ed0aebb30591dddb10057d198a429e6712bb Author: John Bowman Date: Wed Aug 12 17:33:31 2009 -0600 Check ASYMPTOTE_HOME instead of ~/.asy in search path. commit 761284a25d0f2b2de505d9bfb9decedfe4a278ed Author: John Bowman Date: Wed Aug 12 16:12:31 2009 -0600 Fix texpath initialization. commit 4e5ed7ce97044102c22c48bfd0cce001ae976dca Author: John Bowman Date: Tue Aug 11 01:32:50 2009 -0600 Increase linegranularity. commit 6ddc1c963bea6ab9ffd5a367f61b3c3d183c3983 Author: John Bowman Date: Mon Aug 10 23:38:34 2009 -0600 Fix splitting indices. commit 1606e9a7dc40147924b4378ca982d79e1ec2defe Author: John Bowman Date: Mon Aug 10 22:28:47 2009 -0600 Fix definition of normal in regularize. commit 6d9797048c32dfdfed6f73c225f014f1eee4989f Author: John Bowman Date: Mon Aug 10 21:27:22 2009 -0600 Improve example. commit feb14e5db7ef6a3a4188c4581e06de0e091b9778 Author: John Bowman Date: Mon Aug 10 21:21:17 2009 -0600 Use splined parametric surfaces to implement smooth thick lines. commit 076761589b35f8dc9e9117b97cbd746d36704a4a Author: John Bowman Date: Mon Aug 10 11:28:37 2009 -0600 Don't nest picture environments used for TeX clipping (not used for ConTeXt since the \beginpicture...\endpicture environment is still broken; this only affects the clipping of labels outside the bounding box.). commit 47a5dfc993cdc6f2905315787ad520d091f3b73d Author: John Bowman Date: Sun Aug 9 15:47:06 2009 -0600 Remove private qualifier from rmf. commit 145f90a3130752c459dbc9f66773e3bed3221a02 Author: John Bowman Date: Sun Aug 9 01:34:45 2009 -0600 Copy transformation T in projection.copy(). commit 0b2ab9915bfa3f189a049cd1572859769a49f6fc Author: John Bowman Date: Sun Aug 9 00:49:51 2009 -0600 Construct patches with the usual orientation for a counterclockwise external path; update tensor product shading to be consistent with this more sensible convention (rather than the reversed format described in the Postscript Language Reference Manual). Make the default currentlight=Headlamp for consistency with Adobe Reader; the previous currentlight is now called Viewport. Fix uequals, vequals, and surface indices; implement ucyclic() and vcyclic(). Add rendermargin parameter. Add triple dir(explicit triple) function for consistency. commit a969e6d7692d5007580b988c396d3fcdc7dced5e Author: John Bowman Date: Sat Aug 8 13:00:47 2009 -0600 Tune Headlamp. commit 6c8eb4afb4c8061d820e7a5be87ae7713d24768c Author: John Bowman Date: Thu Aug 6 20:38:26 2009 -0600 Add labelsurface function. Add min(frame, projection) and max(frame, projection). commit cf6cba7dc2ab278123e56c7277f6539340618da5 Author: Andy Hammerlindl Date: Tue Aug 4 11:17:53 2009 -0600 Added more error-checking to runtime.pl. commit 0b5837ac2166cf8175fc3e36da0b2fc81dc8cbf0 Author: John Bowman Date: Tue Aug 4 00:35:17 2009 -0600 Fix projected bounding box calculation and angle calculation. Remove viewportfactor and anglefactor; increase angleprecision. Cache modelview matrix. commit b75fcd0159de28b45e51f0bd96a27ec5388bb110 Author: Andy Hammerlindl Date: Mon Aug 3 13:48:16 2009 -0600 Refactored pushing and popping processData. commit 7ad2c2ef9501444d77fa59c83edbe1d61ef0dfd0 Author: John Bowman Date: Sat Aug 1 14:03:12 2009 -0600 Simplify example. commit 864166dbc8de454da1707813df8b1e61851a1b42 Author: Andy Hammerlindl Date: Fri Jul 31 10:39:57 2009 -0600 Removed TODO items I no longer feel like doing. commit 71d08ceee7cb423100f202635aacaa934b27aa8a Author: Andy Hammerlindl Date: Thu Jul 30 14:22:52 2009 -0600 Removed menv. commit e1c2a656deb5ad0eb2641f3e7cc0b26e47bc880f Author: Andy Hammerlindl Date: Thu Jul 30 13:19:42 2009 -0600 Added support for splitting runtime.in into several files. commit 20d37a73fddd374ac4c7da3387023b3650ba46a8 Author: John Bowman Date: Thu Jul 30 08:44:44 2009 -0600 Rename splinetype.asy to graph_splinetype.asy. commit 4bd1bb0a4e0146ce62e4e295da5178b3a8db29d7 Author: John Bowman Date: Wed Jul 29 00:36:18 2009 -0600 Add uequals and vequals functions for indexed surfaces. commit 694920eee2c4bf681573f2d6fd8636b9650eaa90 Author: John Bowman Date: Wed Jul 29 00:35:28 2009 -0600 Enable getstring with --interactive even if not a tty. commit b077254e708b9c5e15fa7bcdabaa06d2b69ae280 Author: John Bowman Date: Tue Jul 28 01:17:37 2009 -0600 Add surface indices. Add nonuniform parametric surface routine. commit 206cc9c77018c8b1375415b9d9267aecd3bee926 Author: John Bowman Date: Mon Jul 27 14:53:25 2009 -0600 Fix formatting. commit 3408c1abb864c973e888ef8dc0e05a6e0c283fad Author: John Bowman Date: Mon Jul 27 14:25:07 2009 -0600 Separate code to split a path into nondegenerate Coons patches out of surface constructor. commit 8b3cb0c0f8611dda5d4f30496ea5bbbc59a59b3f Author: John Bowman Date: Mon Jul 27 10:17:48 2009 -0600 Generalize extrude. commit fa43efac07167bb002a08313f04e88c7eb287941 Author: Andy Hammerlindl Date: Mon Jul 27 00:24:19 2009 -0600 Removed finished TODO item. commit ca891da0ff3b8208b18a49faedd373fd01087fa8 Author: Andy Hammerlindl Date: Mon Jul 27 00:23:45 2009 -0600 Made more compact bytecode for pushing defualt arguments onto the stack. commit 3767fd75669d72611ea43fff12052c67a9b94470 Author: Andy Hammerlindl Date: Sun Jul 26 23:55:06 2009 -0600 Added detailed output for debugging bytecode. commit 9c2f666980851fa0ef43ded88eaee9b69a5783b2 Author: Andy Hammerlindl Date: Sun Jul 26 14:26:02 2009 -0600 Changed debugging output for DEBUG_STACK. commit 7a6043078e6d0e3a694d396c06a40f4c76bd0a10 Author: John Bowman Date: Sat Jul 25 23:35:36 2009 -0600 Fix typo. commit c76e1b0bb19ce13de0ef2ec895fd7cc1838cd461 Author: John Bowman Date: Sat Jul 25 16:39:31 2009 -0600 Implement empirical translation between OpenGL and PRC shininess. commit 569235a9a37a12341c1753f620ee5bf3d5181672 Author: Andy Hammerlindl Date: Sat Jul 25 10:31:06 2009 -0600 Added preprocessor option to print names of bltin functions. commit db669441b7bbaa6c00365b0731eaba597eeb53a2 Author: Andy Hammerlindl Date: Sat Jul 25 10:12:38 2009 -0600 Changed formatting of interactive write for overloaded variables. commit e89331ee4b555dffa54b40b7afbcb536439ce00a Author: Andy Hammerlindl Date: Sat Jul 25 10:11:39 2009 -0600 Automated definition of IntArray, etc. commit 16d362253bf942ea57a2e03afb19cc8414163df6 Author: John Bowman Date: Sat Jul 25 09:58:38 2009 -0600 Fix viewportshift flicker. commit bce50c71cb98440f42fc015253ea917cde3de926 Author: John Bowman Date: Sat Jul 25 02:05:50 2009 -0600 Embed 2D frame. Improve OpenGL movie generation. commit 884e85d4e6e1a7bb3beca73e40631f8c0fb345bf Author: John Bowman Date: Sat Jul 25 00:41:07 2009 -0600 Remove diagnostic. commit ce79a2da755a5a841ea55d69506fa888f46fdb4f Author: John Bowman Date: Sat Jul 25 00:01:06 2009 -0600 Update documentation on suppressing warnings. commit 0adc924c1215e27b947a5a46d7e047fb77ec490d Author: John Bowman Date: Fri Jul 24 23:57:15 2009 -0600 Allow asy warnings to be disabled. commit a9719315fbce2bf647e957a8f411fc1280d44478 Author: John Bowman Date: Fri Jul 24 23:54:43 2009 -0600 Delete intermediate files. commit 365a52b459701fd79b56ef8be55bb15d5c3795ba Author: John Bowman Date: Fri Jul 24 19:55:40 2009 -0600 Add missing typedef. commit 376acc56e739bc1a0515cbdf582566e71548333b Author: Andy Hammerlindl Date: Fri Jul 24 02:07:57 2009 -0600 Write type info for variables on the interactive prompt. commit c6e1933634f8c31fe56ae22304c5b9df1dd078e4 Author: Andy Hammerlindl Date: Fri Jul 24 01:45:10 2009 -0600 Made overloaded warning for interactive write less scary. commit db2f127e4687928cb72eee8466e5820382a8099f Author: Andy Hammerlindl Date: Fri Jul 24 01:42:07 2009 -0600 Minor changes to virtual fields. commit 603782425a4038c412769400e5a57bcf84c32e4c Author: Andy Hammerlindl Date: Thu Jul 23 19:24:46 2009 -0600 Add automated testing of array virtual fields. commit 6f0cc2df4ffe672177464e483b84bb28fd168a45 Author: Andy Hammerlindl Date: Thu Jul 23 19:20:22 2009 -0600 Implemented writing to virtual fields. commit a5720dbc46b31e1c5449cd9c4b5174609e238ee9 Author: John Bowman Date: Thu Jul 23 11:04:54 2009 -0600 Resolve ambiguity. commit 8bce737332a755c3a5faf42a3c9c5a3472c5dbcb Author: John Bowman Date: Thu Jul 23 01:20:35 2009 -0600 Add support for OpenGL animations (illustrated in glmovie.asy), including new autoplay and loop settings. Implement a portable Signal function based on sigaction. Add example of inset graph to xsin1x.asy. Improve animation fitting to guarantee a single transformation for all pictures. commit 493cef04561098dd7e4c2b59af5ba706cd2e84f3 Author: John Bowman Date: Tue Jul 21 10:59:05 2009 -0600 Extend embed(frame). commit 7e9a0f1ed063d4960784f2680a3ae52e356f7063 Author: John Bowman Date: Tue Jul 21 01:10:31 2009 -0600 Factor 3D fitting routine. commit 818cfaa9fdd0c2ab99ee13f68ac081a7e5d8c049 Author: John Bowman Date: Tue Jul 21 00:14:50 2009 -0600 Remove extra comma. commit 715a347291775ebb0798740c045ee3fd6f57a09d Author: John Bowman Date: Mon Jul 20 21:44:59 2009 -0600 Add missing picture sizing. commit ee449186aadfed17713f23da356f2e08fc87ae6a Author: Andy Hammerlindl Date: Mon Jul 20 15:12:11 2009 -0600 Added routines for stepping through external animations in slides. commit 454f559a21b8f13cab72bbb3a08db18fd0e5fffc Author: John Bowman Date: Mon Jul 20 00:35:29 2009 -0600 Increment version to 1.83svn. commit 4b0abd49ecae0d4b588b0f833c96b0fb18fbe05c Author: John Bowman Date: Sun Jul 19 22:57:37 2009 -0600 Use a consistent approximation for drawing tube centers. commit 01e4df92d03651d9d1ddca4a0418e097a7d2245d Author: John Bowman Date: Sun Jul 19 21:35:45 2009 -0600 Fix threaded exports. commit d65cc05bce215c8f2c526c1258a61964f7de06e2 Author: John Bowman Date: Sat Jul 18 15:26:12 2009 -0600 Respect -gray and -bw in PRC output. commit cdc39ade33395032d0450092fc54b9e6dfd46edc Author: John Bowman Date: Fri Jul 17 23:35:20 2009 -0600 Add default argument to transform3(projection). commit 26b7e01c3c7b1a2cdccc87d21c3feee46c164dcf Author: John Bowman Date: Fri Jul 17 22:19:35 2009 -0600 Fix texpath fontsize with PDF tex engines. commit e02c92524691931d63e66ce02d06e0f65cdb5dd6 Author: John Bowman Date: Fri Jul 17 19:55:57 2009 -0600 Add missing pt units. commit c5e192a6c46139a14e32209bd5167f486f82300f Author: John Bowman Date: Tue Jul 14 00:22:41 2009 -0600 Increment version to 1.82svn. commit d12953b58156403fdaf97b7e0051fb572f937ed9 Author: John Bowman Date: Mon Jul 13 22:36:37 2009 -0600 Fix initial angle calculation. commit 51ced8f17f84f0b445cdf828ea5b8d108239d5ca Author: John Bowman Date: Mon Jul 13 21:18:26 2009 -0600 Improve motion detection. commit e5f571b23a3439d0c7384004ca08bb7d16c6ee92 Author: John Bowman Date: Mon Jul 13 21:02:58 2009 -0600 Reinstate doubleclick motion detection. commit 5b086e6f82a2fa3b410131fe0ce297ee0c88b43d Author: John Bowman Date: Mon Jul 13 20:05:06 2009 -0600 Approximate off-axis projections (viewportshift) in PRC. commit 617b958952c3bab45d4b9d4ea36f3718b03c86ff Author: John Bowman Date: Mon Jul 13 18:55:52 2009 -0600 Remove unused include. commit eec81e59e37eee6ddc766df5d130d4b4ea4a84d0 Author: John Bowman Date: Mon Jul 13 18:51:32 2009 -0600 Fix lineskip units. commit 6f9cd42f8184241f0bbfe7d63f9e64efb25f7a28 Author: John Bowman Date: Mon Jul 13 18:41:39 2009 -0600 Rename minbound(triple[][], triple) to minbezier, etc. commit 10640da89ad9f2909257973207bae3e9643d0adf Author: John Bowman Date: Mon Jul 13 18:02:14 2009 -0600 Remove unused format argument from xasy. commit 75d7edb107496906a76167f8a8139050faef72e3 Author: John Bowman Date: Mon Jul 13 17:50:26 2009 -0600 Remove obsolete GIF deconstruction format and xformat setting. commit ee8e73b0935e740d6eda00b1652bf1730b5475c6 Author: John Bowman Date: Mon Jul 13 17:37:20 2009 -0600 Allow single quotation marks in filenames. commit 97e09e03f3b642361649a8a1a5a6149ff190e321 Author: John Bowman Date: Sun Jul 12 22:47:17 2009 -0600 Simplify code. commit d98d421602cd75c211e8a29a877806fb57ce89eb Author: John Bowman Date: Sun Jul 12 22:31:56 2009 -0600 Simplify code; remove cstdarg dependency. commit ac0c23a7f68737023039908e62a3ebe0c4bf122b Author: John Bowman Date: Sun Jul 12 16:31:02 2009 -0600 Add other missing path3 functions. commit 9c5c9495118edbc521c5c2c2297ea5c729dbf0cc Author: John Bowman Date: Sun Jul 12 14:48:40 2009 -0600 Set executable flag on PostScript files under MSDOS, to allow psviewer="cmd". commit dcf7e30049b9dc61ec6e8d50e01284814d585f88 Author: Andy Hammerlindl Date: Sun Jul 12 12:30:14 2009 -0600 Added beginpoint and endpoint for path3. commit 469e960021b292c2dbd647efc9b4a26c6b13db3d Author: John Bowman Date: Sat Jul 11 00:00:43 2009 -0600 Use "cmd" to request the default MSDOS file association. Change default file association for pdfviewer, display, and animate to cmd. commit d63e6e7da81ab3586cf6b31547f0e2bdd7b7458a Author: John Bowman Date: Fri Jul 10 15:24:29 2009 -0600 Improve illustration of ConTeXT font bug workaround. commit 4974258e557e4c720a4e8d8cabb622cd5b03da63 Author: John Bowman Date: Fri Jul 10 15:22:23 2009 -0600 Fix font units. Add example of ConTeXT bug workaround for fonts smaller than 12pt. commit ed90d4412e83ffee109d532ae2a641a57f57e9a4 Author: John Bowman Date: Thu Jul 9 12:28:50 2009 -0600 Fix doubleclick type. commit dd9dbab9779fc495d312a0cd5b382c2ad023ee73 Author: John Bowman Date: Thu Jul 9 12:25:46 2009 -0600 Change doubleclick setting to an int. commit a613f67ff82583b7363631353ed8559f11ccd478 Author: John Bowman Date: Thu Jul 9 12:20:40 2009 -0600 Use a portable doubleclick timeout. commit df1d4756de58eca4bc639664001f8b17413474aa Author: John Bowman Date: Wed Jul 8 09:33:37 2009 -0600 Add example of lmfit. commit 3b41314ac270ea39a7eac4aaade91407e2bad2e3 Author: John Bowman Date: Tue Jul 7 17:43:32 2009 -0600 Adjust camera again as part of 2D resizing. Respect keepAspect flag. Respect projection.autoadjust. commit 5988fd3e14da597c14892b37f6a2b0acba9c2f86 Author: John Bowman Date: Tue Jul 7 09:26:05 2009 -0600 Fix targetsize. commit 454dceb00c1e0257e8176f52b32a36a0c1f7bf9b Author: John Bowman Date: Tue Jul 7 09:24:59 2009 -0600 Fix 3D labels. commit a8134f0235c78bcfd5e0ee33c29ea83435f03ff7 Author: John Bowman Date: Tue Jul 7 08:17:31 2009 -0600 Add bool targetsize=true to 3D label routines; this forces labels to be drawn with the size they would have on the target plane. commit 300c6a5cae091d3d2a19bff1281e427d7a63ea1e Author: John Bowman Date: Mon Jul 6 21:35:38 2009 -0600 Increment version to 1.81svn. commit 298d4a4c0f6977f75156b1fa1cc193f98acfcd8b Author: John Bowman Date: Mon Jul 6 18:06:06 2009 -0600 Reinstate missing prototypes under CYGWIN commit a6c3aa3f6efc2a7763af915820c4d685d86a9f0c Author: John Bowman Date: Mon Jul 6 17:56:40 2009 -0600 Work around missing RPC definition under CYGWIN. commit 7a144376d3b59c86200bde80aece8ef030628c5b Author: John Bowman Date: Mon Jul 6 17:23:08 2009 -0600 Simplify code. commit f1e5195414fa122338f7f5b6a0a46802e381e9d3 Author: John Bowman Date: Mon Jul 6 15:29:09 2009 -0600 Update asymptote.info in install-prebuilt because of version.texi dependency. commit 209f0b28ac03cac92aeafe3cc364ed1f4c2a7d4a Author: John Bowman Date: Mon Jul 6 14:49:09 2009 -0600 Optionally inform user how to ignore a warning. commit 364b416c18b21fd577e120049b7fab653789614d Author: John Bowman Date: Mon Jul 6 13:43:30 2009 -0600 Make array.default(j=n) delete only entry j. Add warn(string) and nowarn(string) functions, along with settings.warnings Change "PATH" to "LOCATION" in error message. commit bf38d58f02109603cde2ec398855503336524ec7 Author: John Bowman Date: Sun Jul 5 23:02:24 2009 -0600 Mention psview as a better (and free) alternative to gsview for MSDOS users. Update documentation. commit 61ee4dd906defef1def9c318c63029f73b0949c2 Author: John Bowman Date: Sun Jul 5 22:05:56 2009 -0600 Remove obsolete CYGWIN code. commit 166d080355b2116e9166f35082e38afc0ad2bb2e Author: John Bowman Date: Sun Jul 5 19:49:35 2009 -0600 Work around u_quad_t conversion conflict. commit 97282a7e1a0124bba438ebfd1c4a1b81000bde50 Author: John Bowman Date: Sun Jul 5 10:29:05 2009 -0600 Add virtual fields name, mode, line, csv, word, singlereal, singleint, signed to files. Simplify single precision and signed interface routines. commit 9344391260559032440ba5fa38921766990b4365 Author: John Bowman Date: Sun Jul 5 10:10:35 2009 -0600 Add comments. commit 0446ed011f40775e2e9010cff77dfa3935faf765 Author: John Bowman Date: Sat Jul 4 20:39:50 2009 -0600 Fix animations with global=false. commit 1673555daff75b238c2c976afa2666eb08dceb2e Author: John Bowman Date: Sat Jul 4 15:39:12 2009 -0600 Use pthread_join instead of pthread_kill. commit 4d6b4a43ac76fb1c65c073aa3243ad7c15cda627 Author: John Bowman Date: Sat Jul 4 14:29:24 2009 -0600 Minor simplifications. commit 24120285fa1793f743b133edd415adb838a21634 Author: John Bowman Date: Sat Jul 4 13:05:54 2009 -0600 Update to version 1.04. commit 5263c5d789b346f0ba21b70635fd36858f107cd9 Author: John Bowman Date: Sat Jul 4 12:20:09 2009 -0600 Initialize lighting only in home(). commit 577619db29e83abffb14066047d4e1c07666d75d Author: John Bowman Date: Sat Jul 4 12:08:30 2009 -0600 Don't use POSIX timers by default due to portability issues. Call home() before quit to return to idle state and reset parameters. commit 04ca8cf39cd39719e2e2c2763de50d31547e486c Author: John Bowman Date: Sat Jul 4 12:05:07 2009 -0600 Exit GUI gracefully. commit 900998e8de5169fe4b34171d0c35e25e24188d40 Author: John Bowman Date: Sat Jul 4 01:53:43 2009 -0600 Force zoom/menu to be unmodified. Update documentation. commit 5cbbe2af3a21be9c53bfba6e53d9965635571fd6 Author: John Bowman Date: Sat Jul 4 01:32:54 2009 -0600 Fix left-button zoom/menu binding bug. Add new settings zoomfactor, zoomstep, spinstep, arcballradius, resizestep, and doubleclick. Improve doubleclick emulation by adding a timeout (default 200ms). Re-instate default zoom/menu right-button assignment. commit b4a6fb7ee8a9762a4943bf36b271945ce9f4ea93 Author: John Bowman Date: Fri Jul 3 16:43:19 2009 -0600 Enable all warnings when debugging. commit b27871b40d04c6f0432d463605f068322797cd07 Author: John Bowman Date: Fri Jul 3 16:28:54 2009 -0600 Add setting warn that allows one to enable or disable warnings like writeoverloaded. commit d86192bf3218ef996b1332c5f677d9b33d9f7561 Author: John Bowman Date: Fri Jul 3 01:39:13 2009 -0600 Improve interace to routines for setting single precision mode: remove the unused x argument, distinguishing the integer case with a new bool signedint argument before the file. commit 54ec4309d401e90f8e745fc4507c965e46a438e9 Author: John Bowman Date: Thu Jul 2 11:39:13 2009 -0600 Fix TeXLive docdir. commit 7ff6aeba07712c52a90a1f0a1d43f52226cc3b34 Author: John Bowman Date: Thu Jul 2 01:54:52 2009 -0600 Increment version to 1.80svn. commit 42a9cf3fef6c93a45d7d29d9ec9a47afeee9b05c Author: John Bowman Date: Thu Jul 2 00:26:57 2009 -0600 Change default right mouse button assignment from zoom/menu to zoom. commit d8f72fba757ac4c79e0477456758eff09255f5cf Author: John Bowman Date: Wed Jul 1 22:00:57 2009 -0600 Fix docdir under TeXLive. commit 294dfcc007f8c2ac7aabd6291fe7f470e59dae27 Author: John Bowman Date: Wed Jul 1 18:23:47 2009 -0600 Remove unused code. commit 02a790536fcc5096f092e727b3b06588e8520bc1 Author: John Bowman Date: Wed Jul 1 16:32:52 2009 -0600 Add viewportshift support for orthographic projections. commit 819d97e9d7c772bdb813738091a62e80e4c96786 Author: John Bowman Date: Wed Jul 1 02:49:09 2009 -0600 Improve lighting. commit 2209e0017ac6de0a2c360cf1aa4968b15c9be702 Author: John Bowman Date: Wed Jul 1 02:31:58 2009 -0600 Revert orthographic projection and lastzoom changes. commit 8f194513a8e34ebd05a69e46bc3e51e1a16b1560 Author: John Bowman Date: Wed Jul 1 01:06:52 2009 -0600 Don't exit on keystroke-initiated export. Invert internal zoom variable. Add pan (in addition to viewportshift) action to native OpenGL renderer. Output all camera settings as a projection, including mouse actions (pan, rotate, zoom, viewportshift). For convenience, add a zoom argument to perspective and orthographic projections. Add < (shrink) and > (expand) keystrokes. Remove unused code. Remove viewportpadding in favour of viewportmargin. commit 3f698d4ed49b08345dcbacece53fd49c01d97c97 Author: John Bowman Date: Wed Jul 1 00:41:37 2009 -0600 Add operator != for 2D arithmetic arrays. commit 92538e0221579d5c0de78c6042821228116231ab Author: John Bowman Date: Wed Jul 1 00:32:48 2009 -0600 Change integrate routines to output all computed values. commit 6ec413ee850ab4265101513015c1e273df83cff1 Author: John Bowman Date: Sat Jun 27 01:01:04 2009 -0600 Fix perp vector calculation. commit e0cb104ae79f0a46cf76d9d5ec7809d306639629 Author: John Bowman Date: Fri Jun 26 19:21:52 2009 -0600 Reset mouse motion function. commit 82c867354368193d5c3608ae445a8b5c5789d2d5 Author: John Bowman Date: Fri Jun 26 15:52:42 2009 -0600 Fix segmentation fault in operator == (real[][], real[][]). Add operator == (T[][], T[][]) for all builtin arithmetic types. commit d6342c43770749cf0bce45d9d3b5cb281eb99f84 Author: John Bowman Date: Fri Jun 26 00:19:00 2009 -0600 Use $TEXMFCONFIG/asymptote for configuration directory under TeXLive. commit 1745a978c038676dbc229c8c77d3e4b62be7ce5d Author: John Bowman Date: Thu Jun 25 23:42:49 2009 -0600 Remove unused code. commit b6aeddce1a4a386d0409c82b740676ac69deff69 Author: John Bowman Date: Thu Jun 25 02:51:31 2009 -0600 Remove etc/fstab kludge for cygwin 1.7 since it is no longer needed. commit baa70f8bb1dc3c4eab341e7146ade449107fc261 Author: John Bowman Date: Thu Jun 25 01:27:33 2009 -0600 Add E_RK2, E_PC, E_RK3BS exponential integrators. Fix dynamic timestepping; simplify logic. commit 0ebf258b96ffcbbafbdff7523e76fc87831fb3eb Author: John Bowman Date: Wed Jun 24 16:03:23 2009 -0600 Increment version to 1.79svn. commit 5f8b5d48f01b08a8a9d4b5023fdf3aa42f41a1b9 Author: John Bowman Date: Wed Jun 24 13:16:28 2009 -0600 Fix title message (assuming zoom/menu button is unmodified). commit e603921a16b1811549054a010a13f69290411539 Author: John Bowman Date: Wed Jun 24 12:26:15 2009 -0600 Fix align. commit 654514e6bdaf56f21c36339256a6d07dcd504b54 Author: John Bowman Date: Wed Jun 24 12:11:02 2009 -0600 Update documentation. commit 22de6a78ac81daa6ef71fb3f2ed9a4642d7f291c Author: John Bowman Date: Wed Jun 24 11:24:54 2009 -0600 Add support for generating syntax highlighting for the KDE editor Kate. commit 6a083b4d39be153629958a5ff55a3c767f5733af Author: John Bowman Date: Wed Jun 24 11:17:55 2009 -0600 Remove redundant redundancy. commit 36067c1c8840510dc685b4e2582b20e6b645a9e2 Author: John Bowman Date: Wed Jun 24 11:04:49 2009 -0600 Change exit to exit /b (end currently executing batch file). commit ed4b675bce60a1342259cc7c76c67c2c4863f5c7 Author: John Bowman Date: Wed Jun 24 01:54:43 2009 -0600 Implement customizable mouse bindings. commit 1bf2cc08b2c6fca676d231f19e12047c330af170 Author: John Bowman Date: Tue Jun 23 10:15:33 2009 -0600 Use --no-warn option for portability. commit 5441bf90562e8bd0893187540b7d9c838d9485d9 Author: John Bowman Date: Tue Jun 23 03:12:03 2009 -0600 Fix interactive exports. commit b2096edd14a4c809c5092c3256a9c21a53ad158c Author: John Bowman Date: Mon Jun 22 21:23:59 2009 -0600 Increase textwidth and textheight. commit 0151aeea0ad3e944cb2a85a98f10410136f6b7e9 Author: John Bowman Date: Mon Jun 22 13:31:48 2009 -0600 Fix configure --disable-gc. commit 94d5833448064e77a56eadaa5e9a7d70db93682d Author: John Bowman Date: Mon Jun 22 11:48:21 2009 -0600 Fix thread locking. commit 32b9f044fe320f369fab6298993d58f7a01b123a Author: John Bowman Date: Mon Jun 22 07:59:23 2009 -0600 Make the install-prebuilt target omit texhash. commit 018a27c40169212efd9a5edaaa0f2ab571dc355e Author: John Bowman Date: Mon Jun 22 01:27:24 2009 -0600 Clean up patch. commit d4080b995a74b931500406776d4f4d4432973156 Author: John Bowman Date: Mon Jun 22 01:21:28 2009 -0600 Add patch to allow version 2.6.0-rc1 of freeglut.dll to be built under CYGWIN. commit 50b871d00e47490ecbf785c4db1ab712f063bbce Author: John Bowman Date: Mon Jun 22 00:08:19 2009 -0600 Update xasy for Python 2.6.2 and Imaging-1.1.7b1 (which requires no alpha support patches). Remove obsolete patches. Delete obsolete _imagingtk.pyd file. commit 047ceae3c82d49179c08c1ee323d055952c33af5 Author: John Bowman Date: Sun Jun 21 21:24:26 2009 -0600 Prebuilt png files are not included in the CTAN distribution. commit 922d180aa5b5a3ed56cb850007918f2efc1fe3a3 Author: John Bowman Date: Sun Jun 21 12:26:28 2009 -0600 Add missing miterlimit defaults. commit 4aa9693a0386de7f1580d454d460704a98fd9238 Author: John Bowman Date: Fri Jun 19 17:00:10 2009 -0600 Fix mesh mode. commit e34f3e923ba80aa782451d911fbf7ae4f84c307e Author: John Bowman Date: Fri Jun 19 14:39:49 2009 -0600 Add constructors to derived class example. commit 41766c990e17098a8cddfef307378b78614b66e8 Author: John Bowman Date: Fri Jun 19 14:38:37 2009 -0600 Turn off fsal when dynamic=false. Implement E_Euler. commit 990cd520d39bc752ddcac2113d73896385d888a0 Author: John Bowman Date: Fri Jun 19 09:42:23 2009 -0600 Respect linegranularity. commit 14b88602c73f89f0e6a1a2a812836e52e1e0c04c Author: John Bowman Date: Fri Jun 19 09:41:23 2009 -0600 Swap patch and wireframe modes. commit d7c0e9cf1059d90b2c299b27a3d5e3dd2bacc9d5 Author: John Bowman Date: Fri Jun 19 02:37:44 2009 -0600 Increment version to 1.78svn. commit 0c7c91aff000df37072d06044eae2a4fbfdeb56a Author: John Bowman Date: Fri Jun 19 00:53:54 2009 -0600 Document the ode module. commit d1487e6a488f103fd1ff8c86374e58ef1fd4a253 Author: John Bowman Date: Fri Jun 19 00:47:08 2009 -0600 Set viewportmargin=(1,1) in asymptote.sty. Reinstate ceil. commit ba9b67360690d9740adec086c7403ebbf553c095 Author: John Bowman Date: Fri Jun 19 00:45:07 2009 -0600 Update examples. commit d09775d77bf8817ff575d5a26846fbe2110dd50e Author: John Bowman Date: Thu Jun 18 23:30:24 2009 -0600 Implement splined parametric surfaces, based on contribution of Olivier Guibe. commit ce0ad38b305467f0be86836f251d05b0e725a813 Author: John Bowman Date: Thu Jun 18 22:14:48 2009 -0600 Move SIGQUIT earlier. commit ba2a10e95110ee21b2ec273f6e818cc3c0d3a9a7 Author: John Bowman Date: Thu Jun 18 13:48:59 2009 -0600 Remove periodicity check. commit 21b8d67ce07068b361b5abde7107e68304c8e90d Author: John Bowman Date: Thu Jun 18 13:47:22 2009 -0600 Allow different splinetypes in x and y directions. commit 3d3cda1c67371d74998e7df82eb20c4a531be575 Author: John Bowman Date: Thu Jun 18 13:41:12 2009 -0600 Implement FSAL. commit b04da8ad640e088b45cda90625ddf627d644dfdd Author: John Bowman Date: Thu Jun 18 11:28:41 2009 -0600 Implement dynamic time stepping in ode solver. commit 37a0bd8edd843af4e5f8a0fd21ee7ccd37aa6393 Author: John Bowman Date: Wed Jun 17 21:01:13 2009 -0600 Rename --enable-tetex-build to --enable-texlive-build. commit 33fc6ac3ac7e4ad765857c90a3249317a5a26727 Author: John Bowman Date: Wed Jun 17 11:48:42 2009 -0600 Fix autoformat. commit 9612543cc986922931b5a9c8e7bce1c9f048e85f Author: John Bowman Date: Mon Jun 15 05:06:13 2009 -0600 Simplify sysdir code. commit 60a13352e45a5fc394fecea4ba3084b6046e98b5 Author: John Bowman Date: Sat Jun 13 20:54:06 2009 -0600 Strip both LF and CR from kpsewhich commit 6bb98b13f6c2ae4fbadcae8fd2e33754e5351d15 Author: John Bowman Date: Thu Jun 11 20:04:26 2009 -0600 Reinstate viewportfactor. commit 5673458038d38cca8a78acd20b7d7925a44a33b0 Author: John Bowman Date: Thu Jun 11 19:57:21 2009 -0600 Autogenerate default steps. commit 311820988be14d9768e51e62481b06a21d1a605f Author: John Bowman Date: Wed Jun 10 23:41:31 2009 -0600 Set default viewportmargin back to (0,0). commit 2ed3a262adfb64aa2e0a8ef76b78df1e8ffeb186 Author: John Bowman Date: Wed Jun 10 22:45:06 2009 -0600 Rename textoutputtype to textoutformat for consistency. commit bfef6452bad58edfcb2ec41d2bf6d115d5f338e7 Author: John Bowman Date: Wed Jun 10 22:43:53 2009 -0600 Fix reference sizing. commit d05eaaa0ada2d34baeb6a95971206d8dff7fbae6 Author: John Bowman Date: Wed Jun 10 09:42:13 2009 -0600 Fix path3 label alignment. commit 4ee8e0a4d442b6a3ff44fb26776700c5896ec9e8 Author: John Bowman Date: Wed Jun 10 08:04:35 2009 -0600 Fix path3 label alignment. commit ad3568f30b3c97a178095abbf1bff15d1733ce21 Author: John Bowman Date: Tue Jun 9 22:16:39 2009 -0600 Package asy-faq.info.gz. commit 505e12fc8c3bc083f7b52e4c1fc63da6738a5c61 Author: John Bowman Date: Tue Jun 9 21:59:58 2009 -0600 Fix typo. commit e525233fe9a8ee7f0b85b67b50a431cd7a0e7d50 Author: John Bowman Date: Tue Jun 9 21:37:17 2009 -0600 Fix Jacobian. commit 2774d683cc021bad58908387673e54e74ac5570c Author: John Bowman Date: Tue Jun 9 21:18:19 2009 -0600 Move real[]*real[][] to C++ code. Simplify ode module. commit 8a7825f0c4aaae85c01afde00b44a45bd027dde7 Author: John Bowman Date: Tue Jun 9 15:12:29 2009 -0600 Update ode module; extract example. commit 915c133a834355d84847c12360d23bfd01a260bd Author: John Bowman Date: Tue Jun 9 15:10:59 2009 -0600 Fix bug found by Olivier in surface(real[][] f, real[] x, real[] y). commit 22661b59d1018e9b0e6e3d0e730300028377448d Author: John Bowman Date: Sun Jun 7 21:53:40 2009 -0600 Uninstall asy-keywords.el. Update slidedemo. commit 25e8d964eb1cf998cc4c98ff83dcb4ece29707ff Author: John Bowman Date: Sun Jun 7 21:32:37 2009 -0600 Fix build error. commit 159bd8ffceef0180106cef6990bca3276933571e Author: John Bowman Date: Sun Jun 7 20:53:31 2009 -0600 Fix spec file. commit d094315883306c562b7f750dc25010156cad487e Author: John Bowman Date: Sun Jun 7 20:36:06 2009 -0600 Update info location. commit ecb90813a16f7b4a58a7bed4d601848832595e2f Author: John Bowman Date: Sun Jun 7 20:11:06 2009 -0600 Clean up info installation: make install installs info files without png images, make install-all installs info files with png files. commit 06062a8fc1853f82e73e013ac1e18f57f6a48bd5 Author: John Bowman Date: Sun Jun 7 16:51:01 2009 -0600 Install png files with asymptote.info in directory info/asymptote. commit ad20ea83e4eab6b5b25bb80bb8e47031522d90be Author: John Bowman Date: Sun Jun 7 14:36:36 2009 -0600 Install asymptote.info before asy-faq.info so that info asy accesses asymptote.info. commit 40087a5149d47d3e8c2be6e1c47bfc6c88cf8ef4 Author: John Bowman Date: Sun Jun 7 07:52:49 2009 -0600 Resolve ambiguity. commit cd1b5851efd15b8dd7d3cd356bf1d718e0dfa430 Author: John Bowman Date: Sun Jun 7 07:31:41 2009 -0600 Fix mintimes and maxtimes for arbitrary length paths. commit 03075fc3e8a82616ec1bb37798886f38e5cba18e Author: John Bowman Date: Sun Jun 7 07:11:07 2009 -0600 Make format return TeX compatible output only in math mode. commit 57ec1bdc6a61f1f22cafe24b083e410d8eaa3a32 Author: John Bowman Date: Sun Jun 7 06:18:43 2009 -0600 Add Levenberg-Marquardt nonlinear fitting routine, contributed by Philipp Stephani. commit 54db4707a1384f7c0213ca8cce72c0ecca8c19b3 Author: John Bowman Date: Sun Jun 7 06:10:56 2009 -0600 Fix maxtimes for paths where maximum occurs at the endpoint. commit 529869410ebcf3f2f739905d29fc8609055350b4 Author: John Bowman Date: Sat Jun 6 19:09:43 2009 -0600 Improve viewport padding. commit ce41184dee54dc485233ca5c1d4419312bdc5b6d Author: John Bowman Date: Sat Jun 6 09:26:30 2009 -0600 Add links to manual in error message. commit 2e9b064755c3100618bc250ec3b9c370d4a5f917 Author: John Bowman Date: Sat Jun 6 07:52:40 2009 -0600 Add preliminary ode module (untested). commit 1efc68359d7b866f90fba010d2d0fa128de447f6 Author: John Bowman Date: Fri Jun 5 23:47:42 2009 -0600 Increment version to 1.77svn. commit 30fbcf86352e77111c8945011c6bd4bac6ea5a9a Author: John Bowman Date: Fri Jun 5 21:23:37 2009 -0600 Remove texunits (not required). commit af97e49cf8ba73773b2b046529a087179d0d1651 Author: John Bowman Date: Fri Jun 5 21:06:43 2009 -0600 Don't split info files. commit c1a37b437ed1d69d54a1a220be9ea6abb8ac77fc Author: John Bowman Date: Fri Jun 5 20:45:25 2009 -0600 Fix bezulate bug: determine the number of intersections of a path with a line segment directly from the intersections routine. commit c55988dc43897d11d1dc946d23f2c1feb28406b9 Author: John Bowman Date: Fri Jun 5 07:36:55 2009 -0600 Fix typo. commit de2e5ed576d69cfc05ce24b0b8409d2deb21fa8f Author: John Bowman Date: Fri Jun 5 07:06:37 2009 -0600 Restore example. commit dca1b761f0da78fa587725c9f7b9fd2b1782714d Author: John Bowman Date: Thu Jun 4 10:42:35 2009 -0600 Rename inside(int,pen) to interior(int,pen). commit 951e4508787b46b77a53977092ac68203d43eb04 Author: John Bowman Date: Thu Jun 4 10:41:19 2009 -0600 Suppress "cannot find an interior point" warning for degenerate paths. commit bb3f9003a5dd35c528661cb9af8d0aabea64ae47 Author: John Bowman Date: Wed Jun 3 23:19:05 2009 -0600 Implement addAllViews function to exhibit all six standard 3D views. commit 67330fd087eeff0f55154ff4a76e7dc42b19f3c1 Author: John Bowman Date: Wed Jun 3 21:36:49 2009 -0600 Rename adobe light to White; update parameters to agree with PDF32000-1:2008. Add ambient light to Headlamp (other parameters in PDF32000-1:2008 appear to be incorrect). commit a0f189d40ebb7ca2b5e6d8a6e234f3cacf2583ba Author: John Bowman Date: Wed Jun 3 12:55:50 2009 -0600 Turn off light in certain examples to avoid confusion. commit 1b2cfce2ef63671c968f410cf09595e765fd4f49 Author: John Bowman Date: Wed Jun 3 12:48:50 2009 -0600 Fix filename for attach=true mode. Add hiresbb option to includegraphics. commit 688c7c03a9b2a3fa1a4df1091c876cbb6abf3b7b Author: John Bowman Date: Wed Jun 3 12:21:11 2009 -0600 Improve texpath resolution by preshifting. commit d63b55ee4d35163c186d82a686c129c6bac564c5 Author: John Bowman Date: Wed Jun 3 12:02:54 2009 -0600 Make fontsize package conditional on latex(). commit 590f94b98bd139a090dc44116f7aaa783ede1fbf Author: John Bowman Date: Wed Jun 3 12:02:29 2009 -0600 Improve texpath caching. commit 151f07527b00cf79ebb87088d2322dccf1940a69 Author: John Bowman Date: Wed Jun 3 12:01:42 2009 -0600 Fix degenerate transform3. commit 30479826115232ebca80f5fb15fed4186889e443 Author: John Bowman Date: Wed Jun 3 01:50:28 2009 -0600 Add real[] texsize(string, pen=currentpen) command returning raw TeX dimensions {width,height,depth}. commit f75bbab5748fa346edc8c667d02a150ed1b6e0eb Author: John Bowman Date: Wed Jun 3 01:46:42 2009 -0600 Add missing ps2tex scaling. commit 69ab0d6f5d9f0ec4dada3b38ca109e498ee97b0c Author: John Bowman Date: Wed Jun 3 01:45:14 2009 -0600 Make texpath aware of baseline for PDF tex engines. commit 2de4ef194157962c1deedd5617f95dd25b926e69 Author: John Bowman Date: Wed Jun 3 01:42:23 2009 -0600 Simplify alignment. commit e546aac7b42fcac76b3ab656a227642c57517831 Author: John Bowman Date: Tue Jun 2 12:02:03 2009 -0600 Remove unwanted assignments. commit fd784f824ab52137ccc868762c3c23d6f271d4ec Author: John Bowman Date: Tue Jun 2 11:33:59 2009 -0600 Tune headlamp parameters. commit 01e9e6105d2e0c05890a0d3580ce7169657e781e Author: John Bowman Date: Tue Jun 2 11:33:38 2009 -0600 Tune alignment between rendered and PRC images for perspective projections. Fix angle for absolute projection rendering. commit f88101c29df7754a09d0ecc8ee38306032f9fc90 Author: John Bowman Date: Tue Jun 2 10:26:20 2009 -0600 Add headlamp light that approximates 3Dlights=Headlamp. commit 5dd7890aea6db356e0dec4ef687a34dde0d19087 Author: John Bowman Date: Tue Jun 2 01:28:17 2009 -0600 Add hiresbb option to graphic. Remove 2 pixel offset. commit 4dcddca90a911b349f0b8fa3c543cd1adc2282fc Author: John Bowman Date: Tue Jun 2 00:37:23 2009 -0600 Improve rendered and PRC alignment. commit 50388eca0e09c1824b0c134e074a669a9a3d9fa0 Author: John Bowman Date: Mon Jun 1 21:57:28 2009 -0600 Handle holes in surface constructor for superpaths when planar=true. commit 8181e3eebc72966d7e53aa0eb954d53800c25329 Author: John Bowman Date: Mon Jun 1 17:18:19 2009 -0600 Add support for OCG layers. commit eedc3f6fd635d411e871a006356e23e6f90b3866 Author: John Bowman Date: Mon Jun 1 02:43:51 2009 -0600 Increment version to 1.76svn. commit 3566c16a88c716b8f890720759369535a285568c Author: John Bowman Date: Mon Jun 1 00:04:03 2009 -0600 Fix target. commit 32bc3480d0dafe6d475bc5fcb903e07f2e7929ee Author: John Bowman Date: Sun May 31 23:35:47 2009 -0600 Update example. commit c1779f47cb6199df3ea6ba88ef12f3d5c8f4ed53 Author: John Bowman Date: Sun May 31 23:06:06 2009 -0600 Add install-prebuilt target for CTAN distribution. commit f824133509041975553fbe67bf2576b850eb6e5f Author: John Bowman Date: Sun May 31 13:15:28 2009 -0600 Increase fuzz. commit 7122c68b5919d0df45897d20ef6c438a9dc5352e Author: John Bowman Date: Sun May 31 12:01:15 2009 -0600 Revert inadvertent commit. commit d8db8f2edc64c08980988ff6b6edfb783a0a3011 Author: John Bowman Date: Sun May 31 11:59:17 2009 -0600 Fix missing documentclass when texpath is used in inlinetex mode. commit e6cdcb7915197c4cbf1b58855fe76b2d7bcf4f02 Author: John Bowman Date: Sun May 31 11:11:40 2009 -0600 Workaround missing -output-directory option in ConTeXt (current directory must be writeable). commit 6de2ae1ddd58a49734914c967c1d5977ea717cfd Author: John Bowman Date: Sun May 31 10:20:19 2009 -0600 Implement alternative workaround, suggested by Hans Hagen, for ConTeXt switchtobodyfont alignment bug in TeXLive 2008. commit 93e3d78fe71baf37b0fe4d0ae2c716151420af19 Author: John Bowman Date: Sun May 31 10:09:14 2009 -0600 Add --disable-readline and --disable-fftw. commit 285d415e65b9c7c7d79c157d663bb694e286fb75 Author: John Bowman Date: Sun May 31 09:59:40 2009 -0600 Remove font encodings by default. commit 75d01e891bd976179c94a5185d1d8662c1ed5215 Author: John Bowman Date: Sun May 31 01:25:55 2009 -0600 Remove troublesome --purgeall context option (ignored in TeXLive 2008; leads to bad argument #1 to 'match' error with ConTeXT Minimals). commit 9f679ed5eaf47ddb46a546ee4714cbf1634472db Author: John Bowman Date: Sun May 31 01:14:21 2009 -0600 Clean up epilogue. commit bd97f792724d80ed2c53bef9258ce8b31c2c2208 Author: John Bowman Date: Sun May 31 01:13:23 2009 -0600 Fix aspect ratio calculation; tighten anglefactor. Improve viewportmargin handling. commit 0fa9327d407c403447e55b032116c65d25671ce3 Author: John Bowman Date: Sun May 31 00:46:12 2009 -0600 Remove GCLIB_CHECK. commit f06c75435421cee3d1faa1e188fbcb7dc2fc5ad0 Author: John Bowman Date: Sun May 31 00:33:09 2009 -0600 Handle cusps. commit 298d8aa536f119456adb7d9aacab28c81383048d Author: John Bowman Date: Sat May 30 21:54:39 2009 -0600 Remove unused file. commit 8237ff1025cbcd4ac4c60248d8419dfdf01c97a2 Author: John Bowman Date: Sat May 30 10:47:00 2009 -0600 Return a sorted array from intersections(path3, surface). Add intersectionpoints(path3, patch) routine. commit 17c2e0d5cd9f62e569f86292d54c19c932df9014 Author: John Bowman Date: Sat May 30 10:37:10 2009 -0600 Fix intrapatch duplicate point removal in intersections(path,surface). commit 0e14bb76c839af345f01f53d03b69815cab68dd1 Author: John Bowman Date: Fri May 29 09:20:50 2009 -0600 Remove unused interface. commit 957ccc0b6b052f2f86e1957565b7b58cbcf6b96a Author: John Bowman Date: Fri May 29 09:14:39 2009 -0600 Add usetypescript[modern] to texpath. Adjust anglefactor. commit d5509c68aa53526375b640b9a24f271e0f966111 Author: John Bowman Date: Thu May 28 22:36:28 2009 -0600 Add missing brace for context miniprologue used by texpath. commit ad7435c09d8c7e2df18578e5f9f90d33b8827d7c Author: John Bowman Date: Thu May 28 03:26:53 2009 -0600 Increment version to 1.75svn. commit b9d350961270dc36ce7ab75592d4bfe490c071cd Author: John Bowman Date: Thu May 28 01:57:37 2009 -0600 Fix help command under MSWindows commit 43c90a558d3a412fae71a0415d301561907409c2 Author: John Bowman Date: Thu May 28 00:56:30 2009 -0600 Improve appearance of cube example. commit 64adc5adecdcbae9502cb8d38001b2c2ae2db935 Author: John Bowman Date: Thu May 28 00:33:43 2009 -0600 Increase anglefactor. commit be0e2eba11df9da38e068ed6e204677b201b148c Author: John Bowman Date: Thu May 28 00:14:35 2009 -0600 Fix assert; increase fuzz. commit e7fffb6e11f4b61fd3f773cc50db58aa200a8ed3 Author: John Bowman Date: Thu May 28 00:00:27 2009 -0600 Disable PRC output when using ConTeXt engine (due to lack of movie15 equivalent). commit 60223b2f21e367183929a06cea8d11070e302420 Author: John Bowman Date: Wed May 27 23:37:13 2009 -0600 Fix incorrect auxiliary control point in surface bounding box routines. Add path/surface intersections and intersectionpoints routines. commit b8a100ec8889686eaaf69f40ea233d3553903754 Author: John Bowman Date: Wed May 27 10:16:32 2009 -0600 Fix packaging. commit ea25f68f0f294a2568a906ca87832e258c9c1e82 Author: John Bowman Date: Wed May 27 09:47:32 2009 -0600 Package conTeXt files. commit d359199885c11fcea6782cba8fa0d36fb42e47b1 Author: John Bowman Date: Wed May 27 09:30:15 2009 -0600 Revert 1.74-15; ensure consistency of circle and arc. commit 8c8046a93712185098c044acddac237195dcc4d4 Author: John Bowman Date: Wed May 27 08:44:56 2009 -0600 Fix RPM build. commit b4e1016d05067f31015761b7adb00906ef3adeef Author: John Bowman Date: Tue May 26 23:21:51 2009 -0600 Fix diagnostics. commit fa41eae215f40b4938920a1e95b779a2297c6894 Author: John Bowman Date: Tue May 26 22:56:39 2009 -0600 Remove ambiguity in font commands. commit 5b38029712b4a67a372b523f3d9a67fc18fc806d Author: John Bowman Date: Tue May 26 22:55:34 2009 -0600 Increase duplicate fuzz to work around font errors. commit 812e5a12484ed78bb6044716e6aea84c033b3f97 Author: John Bowman Date: Tue May 26 17:57:11 2009 -0600 Add portability fix. commit 51d2a997b312453016f6884b19b2d7bea980c2cd Author: John Bowman Date: Tue May 26 17:46:56 2009 -0600 Remove unused enums. commit dc714bd68848faec6f421b88b7da89bd5020f447 Author: John Bowman Date: Tue May 26 08:23:49 2009 -0600 Fix enum. commit c22bce6986019495a36f2e49be622fd38a1e5161 Author: John Bowman Date: Tue May 26 08:21:02 2009 -0600 Fix preprocessor command. commit 2cf616475d6267d764e0d7debc9fd836139b9f10 Author: John Bowman Date: Tue May 26 02:52:25 2009 -0600 Enable non-PRC 3D context support. commit 71ba0d87410db1ecf377b60f231783759e8cee40 Author: John Bowman Date: Tue May 26 02:25:39 2009 -0600 Support context engine in _texpath; clean up files. commit 1d10efc8ee0c9818eb00d4a46bb46fb023329483 Author: John Bowman Date: Tue May 26 01:30:46 2009 -0600 Cleanup temporary context files. commit c5f46b343da8ea10be2bee947c89a30e962cf793 Author: John Bowman Date: Tue May 26 01:12:05 2009 -0600 Normalize direction. commit 353cf76c084a812c558ef67460009cc5e818e1a7 Author: John Bowman Date: Tue May 26 00:16:53 2009 -0600 Workaround possibly broken header file on i386-solaris with g++ 3.4.3. commit f9494ca94993529747ced00a109516b16dfd159d Author: John Bowman Date: Mon May 25 23:58:24 2009 -0600 Force child to exit when pipe is closed. commit cdadd335d339ff8f9e0140ff5bb20a6aa9a918c9 Author: John Bowman Date: Mon May 25 11:01:50 2009 -0600 Prevent double waiting in pipeclose(). Support PDF tex engines in texpath. commit de43da1d463274e3d8cac3e32b25ed159fabf72b Author: John Bowman Date: Mon May 25 07:18:45 2009 -0600 Don't issue \usemodule[pictex] in inlinetex mode. commit 090c0c4ae9cb651aac3897930554703d610d6504 Author: John Bowman Date: Sun May 24 22:25:12 2009 -0600 Handle zombies in pipestream without using a wrapper, so that one can detect whether the child process has terminated. Simplify, _texpath, textpath, and _strokepath. commit 6015d4b9944ca08604ec775dbbf92f2b4e0fd0b5 Author: John Bowman Date: Sat May 23 22:47:30 2009 -0600 Fix initial context pen. Add usetypescript convenience function. Protect context switchtobodyfont with gsave/grestore to prevent misalignment if font is not found. Improve description of -v option. commit 95a573ec7fe5269f21b844bcd06d710f05172e09 Author: John Bowman Date: Sat May 23 22:44:43 2009 -0600 Fix ylabel rotation. commit cf29666c9accb9fc112877b066d251e7b4e20d0b Author: John Bowman Date: Sat May 23 21:07:40 2009 -0600 Implement a better workaround for lack of a context interactive mode that does not rely on the existence of a null.tex file. Use context-style command-line options. commit 8e1ea31d005c1ab1075befa5f631a7f7dda171c4 Author: John Bowman Date: Sat May 23 11:18:01 2009 -0600 Fix man page generator. commit 0c4c6ee7d904d48e7d22d421c37e2ca920793c1d Author: John Bowman Date: Sat May 23 08:11:52 2009 -0600 Add colo-asy.tex file (contributed by Mojca Miklavec). Remove base/asy-keywords.el in favour of asy-keywords.el. commit f45daa6be9a492d5eed7429d007eff5cde05d4fa Author: John Bowman Date: Fri May 22 18:24:14 2009 -0600 Add unitoctant example. commit b2d3c2f5205169dbbb4200bcb343f0cef4ca3472 Author: John Bowman Date: Fri May 22 14:20:05 2009 -0600 Allow draw(nullpath3,linewidth(0)). commit f45dc9b07cb323314e7ceed18fff87b2a2b185b0 Author: John Bowman Date: Fri May 22 14:09:15 2009 -0600 Use only 2 nodes for arcs of no more than 90 degress. commit 33b2d5403b74c7574e68eaf04ad5b23c1ff2cd3c Author: John Bowman Date: Fri May 22 09:05:16 2009 -0600 Remove unneeded \bye in context support. commit 16ca066028ac8beb816f71d79ce36224f697c285 Author: John Bowman Date: Thu May 21 13:40:02 2009 -0600 Add LeftView, RightView, FrontView, BackView, BottomView, TopView, along with addViews function. commit f3bfaf748a3c0c78faef4cc4728a2b58fa8cd084 Author: John Bowman Date: Thu May 21 01:01:24 2009 -0600 Add example of baseline alignment. commit 90447658740c8e3e3f2dee522cc8b40f6ea0eb64 Author: John Bowman Date: Thu May 21 00:32:14 2009 -0600 Add support for ConTeXt tex engine. commit 558d0dc299421448f3c766ef6bba6b232fad900e Author: John Bowman Date: Wed May 20 19:24:38 2009 -0600 Updates to facilitate TeXLive builds. commit d31c84a64a6fe3dfbb382146a3bc3da22a40e57f Author: John Bowman Date: Wed May 20 00:48:02 2009 -0600 Update example. commit 24544283d531ef68ec5e60f00f106a787f6f7c06 Author: John Bowman Date: Wed May 20 00:03:34 2009 -0600 Add example showing how to render multiple views of the same picture. commit 86b24f2d4bfc4fbda1ce380030333643257bf2f9 Author: John Bowman Date: Tue May 19 23:53:39 2009 -0600 Simplify code. commit 59e65e542e7ec1f41cb53901e70e775f497327c3 Author: John Bowman Date: Tue May 19 23:49:09 2009 -0600 Remove dependence on currentprojection in label(Label, path3). commit 0b05f066e9754a6f541eaa504d09ef74f0d8d29a Author: John Bowman Date: Tue May 19 23:36:08 2009 -0600 Fix another BUILD problem. commit 2602e4b69e66d6f6965c0b9bd9b615bb5ba7713c Author: John Bowman Date: Tue May 19 22:50:14 2009 -0600 Fix build problem. commit 116046ccd5021691f08ae7ccddb76fc8532d8a3a Author: John Bowman Date: Tue May 19 21:29:58 2009 -0600 Remove symbolic links from source distribution. commit 9dd0993b5ad92887deb26496feaef22a6f67d590 Author: John Bowman Date: Mon May 18 23:08:58 2009 -0600 Add enable-gsl[=yes] and enable-gl[=yes] options. Use AS_HELP_STRING. commit afa93385a431d6e72638f2f57f04d2b6c2ee3506 Author: John Bowman Date: Mon May 18 22:47:55 2009 -0600 Fix distclean. commit 8adcdf72dec255e5e274695e507ba8b31a84336c Author: John Bowman Date: Mon May 18 11:08:59 2009 -0600 Increment version to 1.74svn. commit 4da7a1c804c037540abd25ef486a64dee62a1f25 Author: John Bowman Date: Mon May 18 11:08:23 2009 -0600 Revert last change. commit b9d6c02e6b78638ff4fe7fedb7a2fa065188bfe8 Author: John Bowman Date: Mon May 18 11:06:44 2009 -0600 Fix version number. commit bbe2c51e864af5644239ad84154105f578bca363 Author: John Bowman Date: Mon May 18 02:02:35 2009 -0600 Allow sysdir to be overridden on the command line. commit 4ace450116e7a640bb3af9a63cde979a336c380b Author: John Bowman Date: Mon May 18 00:52:28 2009 -0600 Fix texlive build under MSWindows commit 9b6a907ccafb7302f1359292216d397b1d070118 Author: John Bowman Date: Sun May 17 23:10:36 2009 -0600 Support user-specified background color in OpenGL renderer via light constructor. commit 8dab38cc5bfe6e3e9432dc703cd029fc1f362710 Author: John Bowman Date: Sun May 17 21:18:17 2009 -0600 Add textinitialfont environment variable. commit fe2963bd48d61b8e25678fff009ee1e6e345e963 Author: John Bowman Date: Sun May 17 11:41:49 2009 -0600 Call reportFatal in psfile.close(). commit 36a3a976a948d7bd0fa1b80892c43c27ed3370d9 Author: John Bowman Date: Sun May 17 11:22:56 2009 -0600 Don't return after reportError. commit 3a3c79a4ff96d642d776958a562722e3770e73be Author: John Bowman Date: Sun May 17 11:08:10 2009 -0600 Add warn=true arguments to polar, azimuth, colatitude, and latitude. commit dd275da9bd3518b49dd7ac6ecfadb711c5cdf333 Author: John Bowman Date: Sun May 17 01:18:07 2009 -0600 Set default font to groff 12pt Times Roman when settings.tex="none". commit 7a468b6214aa524c6d6039b04f020c750b29ee11 Author: John Bowman Date: Sun May 17 00:52:19 2009 -0600 Add pen support to textpath and example. commit 89c81090b6adbfd7042b48c9890a305a4f4fcc29 Author: John Bowman Date: Sun May 17 00:49:39 2009 -0600 Fix segmentation fault after mode error. commit 5d7c2961040fb175ac01a159a6d86a9f0ef005de Author: John Bowman Date: Sat May 16 23:10:29 2009 -0600 Add textpath command, contributed by Michail Vidiassov. commit f7cbb093bdcd366d04f80896c158971b75a4ecd7 Author: John Bowman Date: Sat May 16 15:21:49 2009 -0600 Update links. commit de1e093f4893ba663f0b309c8684cfdea1cf86c6 Author: John Bowman Date: Sat May 16 10:16:47 2009 -0600 Restore example. commit 3ffc18a55c28366bbbe0e955a24d0858eb1da9d8 Author: Philippe Ivaldi Date: Sat May 16 08:04:32 2009 -0600 trembling.asy: change licence GPL to LGPL. commit 50267997b1e79f1e73026d6e22d735702518e589 Author: Philippe Ivaldi Date: Sat May 16 05:07:49 2009 -0600 geometry.asy: put the compatibility routines commit 37f8df82bea245b18f31a1d742183658313d93ec Author: Philippe Ivaldi Date: Sat May 16 04:52:59 2009 -0600 Fix minor bugs in geometry.asy. Change licence GPL to LGPL. commit 9250b2cb1117934330629dde9bd798898ead99de Author: John Bowman Date: Sat May 16 01:23:23 2009 -0600 Use center=false by default again for orthographic projections. Improve vectorfield routines. Update documentation and FAQ. commit bfa1eaa3e77972c199c5edfd75d410e94d35545d Author: John Bowman Date: Fri May 15 14:32:28 2009 -0600 Respect autoadjust=false. Remove autoadjust parameter from orthographic projections. Center target by default, unless autoadjust=false. commit 3f85494877f2c44aa49fe86f97de42f90bd4b31e Author: John Bowman Date: Fri May 15 08:55:36 2009 -0600 Update documentation of shipout. commit 9ac317ffb071d94af2c82b37225dd18497cdda86 Author: John Bowman Date: Fri May 15 08:31:21 2009 -0600 Increment version to 1.73svn. commit 1f773a2f0aaf702a423adf7eccf893d62a04eac9 Author: John Bowman Date: Thu May 14 17:26:51 2009 -0600 Increment version to 1.73svn. commit 9ce9d03912c53e9f69d99585f95d268924070724 Author: John Bowman Date: Thu May 14 16:03:48 2009 -0600 Increment version to 1.72svn. commit 2fee527c6fff0b94db64e4bbea30c97cd229b355 Author: John Bowman Date: Thu May 14 15:59:18 2009 -0600 Re-introduce portable zombie-free fork. commit af459ca9ae85b53b88b2ba5c902fe265ae64d95e Author: John Bowman Date: Thu May 14 15:05:21 2009 -0600 Detect degenerate paths. commit e09844d2c619aa73bcb76897ae878063bb80448a Author: John Bowman Date: Thu May 14 15:04:56 2009 -0600 Fix ambiguity in extrude. commit 909baef375e0e6c773ec1743f4348833af304a98 Author: John Bowman Date: Thu May 14 12:52:03 2009 -0600 Force HAVE_LIBGLUT on darwin. commit 70d0c0ffd3a03c1bf8d7ac38ebe0248f2d5dac89 Author: John Bowman Date: Thu May 14 11:57:53 2009 -0600 Add patch to workaround problem that shows up in the 2009/03/23 version of movie15.sty. commit e626f36eda7f3693920cc67eeae01d54da45fed7 Author: John Bowman Date: Thu May 14 10:17:15 2009 -0600 Fix spurious zooms due to menu interaction. commit 6fde3ae29fc3a667e2de795b6b4f3dade51a36dd Author: John Bowman Date: Thu May 14 09:33:06 2009 -0600 Detect libGLU. commit d891aabf4a749b753caee840258e57d5451048cc Author: John Bowman Date: Thu May 14 01:47:25 2009 -0600 Change label3 to a routine extrude that returns a surface. commit 142dff3335feed312d6544a9be844c84ad66f2ae Author: John Bowman Date: Thu May 14 01:19:29 2009 -0600 Work around old LGPLv2 license covering tr.h and tr.cc. commit 1b958edc2bebdac4a991d08e6fc7cf4793f586b1 Author: John Bowman Date: Thu May 14 01:00:37 2009 -0600 Report up and target camera parameters. commit 789466cd680580ec92a3bf6fe9fcacc909cb20fe Author: John Bowman Date: Wed May 13 23:21:33 2009 -0600 Generalize extrude. Implement label3 for drawing 3D solid labels (illustrated in label3solid.asy). Remove extra call to bezulate. commit d5f7fe9131eea9cbf0191f77397b711e7855c1f0 Author: John Bowman Date: Wed May 13 23:18:57 2009 -0600 Define mantissaBits. commit 24708486fecbb134a0d42005ad59af4374c01089 Author: John Bowman Date: Wed May 13 23:17:50 2009 -0600 Limit recursion. commit a4f0012e806f96086581871d1d8aa2759d7191e1 Author: John Bowman Date: Wed May 13 11:40:56 2009 -0600 Add menu item (c) Camera to output camera position. commit 6133b9b3dfedab877b8d06458dd316711b514b13 Author: John Bowman Date: Tue May 12 14:24:34 2009 -0600 Make asy.bat respect all command-line arguments. commit 34c82634698f14f0aed162575c652163518fcc06 Author: John Bowman Date: Tue May 12 14:07:54 2009 -0600 Fix axis label alignment. commit 0a71bbd7ac01725fe76ecf1384fe010228d4e4e8 Author: John Bowman Date: Tue May 12 11:21:38 2009 -0600 Update call to ticks. commit 8ea2631aa1767ebfbaab0e4c19859a6a792268d2 Author: John Bowman Date: Tue May 12 11:15:49 2009 -0600 Support optional margins for axes arrows. commit 6cf99cebcdbbad787b7682eb40ca51f1be3b811f Author: John Bowman Date: Tue May 12 10:49:58 2009 -0600 Add trembling module, courtesy of Philippe Ivaldi. commit 99332ce8cad09a9f1862421df940339ddf9a9782 Author: John Bowman Date: Tue May 12 10:44:28 2009 -0600 Fix rotated path label alignments. commit 357799e128c9f3c9c5d7c9607632206cf8681239 Author: John Bowman Date: Tue May 12 02:17:46 2009 -0600 Update comments. commit 7b2ac914dcdf7132ab44b6e45d09a5a9411979ef Author: John Bowman Date: Tue May 12 02:01:22 2009 -0600 Merge in Philippe Ivaldi's geometry module. commit 726157a28e859aa65bdd3e83ca13bf171058eb1e Author: John Bowman Date: Mon May 11 22:28:04 2009 -0600 Update license. commit 1ac2d7244c04ac002cfeb9bccf3173ec923444d6 Author: John Bowman Date: Mon May 11 15:37:12 2009 -0600 Respect store argument of saveline. commit e767385e299dcd779839eccbbb2cef377bee0f57 Author: John Bowman Date: Mon May 11 12:59:15 2009 -0600 Update Ticks3. commit fbcf28b59f70f4125edfd81195fbfb7e22bfa05f Author: John Bowman Date: Mon May 11 12:55:54 2009 -0600 Implement signedtrailingzero. Fix left-justified trailingzero alignment. commit 9430fd06095e2feffb090f4fe7436be1e1259d80 Author: John Bowman Date: Mon May 11 11:39:52 2009 -0600 Resolve ambiguity. commit dbccc13c1b525540ab6c85f6cb91eff11140f1cf Author: John Bowman Date: Mon May 11 10:39:04 2009 -0600 Implement PostScript calculcator function shading and example. Add default fillrule arguments to frame shading routines. commit 182d0b51797762c5a56358f210ad48fe28584439 Author: John Bowman Date: Fri May 8 03:12:28 2009 -0600 Continue splitting when radius of curvature is zero. commit 1f8185d17208adcc64f531f0721c4b8b4848ebc5 Author: John Bowman Date: Fri May 8 02:59:30 2009 -0600 Add Philipp Stephani's GSL updates. commit c705bfc40bdce539c7eddbcf85b2b648ad9b3b1e Author: John Bowman Date: Fri May 8 02:11:46 2009 -0600 Fix link; add missing index entries. commit 3f47835f5813a1270a4de872216d54c1fff68903 Author: John Bowman Date: Fri May 8 01:22:22 2009 -0600 Fix endpoint detection. commit a80b2a2822feb137a416ed65e96a63fd8070302e Author: John Bowman Date: Tue May 5 15:44:20 2009 -0600 Fix write(pen). commit 07d8045cc034bd193a25e1ad0f16729cc2428379 Author: John Bowman Date: Fri May 1 14:42:31 2009 -0600 Improve documentation of shipout. commit 313d85edc3a132e9453fa221f9e55e353a0af08b Author: John Bowman Date: Thu Apr 30 11:52:51 2009 -0600 Fix bounds. commit 2f5229f927702f7486ddaa1081d484540ef47aba Author: John Bowman Date: Thu Apr 30 11:46:33 2009 -0600 Fix comment. commit 61b65cfc1056f40028333c8d358eefcb2fd9889e Author: John Bowman Date: Thu Apr 30 11:45:51 2009 -0600 Improve example. commit ad4bef7f9cc5a2b81bf51f43481251b82581d4dc Author: John Bowman Date: Thu Apr 30 11:44:10 2009 -0600 Add strokepath example. commit c8d5ef4c808d829628757f12f9183badba8eee82 Author: John Bowman Date: Thu Apr 30 09:32:36 2009 -0600 Add twisted tubes example. commit 6e5c3b36b25df3a8d34b4b4ab9cd353cb9deb333 Author: John Bowman Date: Wed Apr 29 16:44:55 2009 -0600 Implement functionshade primitive. commit 647887338fa1d03c1c1a66651f7e0d5b589dc232 Author: John Bowman Date: Mon Apr 27 22:14:04 2009 -0600 Fix numerical resolution problem in label alignment. commit c632ee4a0d60debeb8dcbf6e2d8501b93278d5eb Author: John Bowman Date: Mon Apr 27 19:13:42 2009 -0600 Add sysdir setting. Support automatic determination of sysdir from kpsewhich, if sysdir="". Add configure option --enable-tetex-build to force sysdir="". commit cca905863568c79558f4ba515c4ff330347ea79e Author: John Bowman Date: Mon Apr 27 11:42:19 2009 -0600 Fix effective camera positions for oblique projections. commit 1c4272247ecacabe1c0a75e99c5962ad466b0e41 Author: John Bowman Date: Fri Apr 24 11:41:49 2009 -0600 Abort on write to pipe failed error. commit 3ce25f46d059ba3d4a8cf459da93ce83a901dc3c Author: John Bowman Date: Fri Apr 24 10:55:49 2009 -0600 Generate wheel.mpg earlier. commit 90945287b2d6e9927e916791f93687b97db3ff98 Author: John Bowman Date: Fri Apr 24 10:25:53 2009 -0600 Explicitly check for libGLU. commit 706a6325d723c4c1be10617066fcef573579d1ab Author: John Bowman Date: Fri Apr 24 01:59:54 2009 -0600 Minor optimizations. commit 823b5039b87fa7e6f2e81d482be64d3d97033a45 Author: John Bowman Date: Fri Apr 24 01:52:12 2009 -0600 Simplify dealiasing code. commit 97650dfc4f7abc5ad59211c950af12814ac5b5bc Author: John Bowman Date: Fri Apr 24 00:35:32 2009 -0600 Optimize dealiasing of 3D rendered non-RGB images. commit f165ec0afefae7ecea4e37c9af29fa0a37c9c1be Author: John Bowman Date: Wed Apr 22 11:42:32 2009 -0600 Rename test member function. commit 6a4117c34454fcea9ae36deb1deb8e414671cc6b Author: John Bowman Date: Wed Apr 22 11:33:48 2009 -0600 Add example of defining a builtin asy struct. commit 2619bcb22197f775969cf74592fa7cb8e4ff6be6 Author: John Bowman Date: Wed Apr 22 10:52:30 2009 -0600 Implement value-based addVariable routine. commit 9c8f589aa2d86b1aff40c6728c83e9aaf43f5958 Author: John Bowman Date: Sun Apr 19 13:56:00 2009 -0600 Check recursion depth. commit eb431fe8e6ed67671cc1e3eacfae2de03c2486a6 Author: John Bowman Date: Sun Apr 19 10:34:12 2009 -0600 Continue subdivision tests if zero radius of curvature is encountered. commit 9d592def12e244517181d829faca2adc5cd0b44b Author: John Bowman Date: Sat Apr 18 23:52:51 2009 -0600 Change basealign so that "ace" and "acg" are always typeset at the same location. commit 3744427dbe7812dee4a61d0d0252f699934b12c9 Author: John Bowman Date: Sat Apr 18 16:57:05 2009 -0600 Handle more degenerate cases. commit 8306a21151548caaa0b1ba61af3a989005d2b941 Author: John Bowman Date: Sat Apr 18 15:42:21 2009 -0600 Handle degenerate paths. commit b4bc71fa46ceacf2e234512a90e0bb7eecada7b4 Author: John Bowman Date: Sat Apr 18 15:28:41 2009 -0600 Improve adaptive algorithm used for rendering thick lines and tubes. commit c379f3146746b44906b954321758b806ec6d30af Author: John Bowman Date: Sat Apr 18 06:56:28 2009 -0600 Fix circle ambiguity. commit 8b80557caaa9dd6b97db1374d6a064d0b0b1aa70 Author: John Bowman Date: Fri Apr 17 22:15:06 2009 -0600 Change perspective. commit b413e18e35ca518d0a017110ba285ef55923755b Author: John Bowman Date: Fri Apr 17 22:07:43 2009 -0600 Fix URL. commit b72747f967b0d802b64c8a0c2c51589c7bb59c51 Author: John Bowman Date: Fri Apr 17 22:05:46 2009 -0600 Use parametric mesh. commit 7a10ae1569c2546669841317edcac32ec81ff215 Author: John Bowman Date: Fri Apr 17 21:28:45 2009 -0600 Rename example; use smooth coloring. commit 5254c9cebe241339b2a58944a66974c8680348b8 Author: John Bowman Date: Wed Apr 15 23:35:07 2009 -0600 Add example. commit 6d1a060fb1d619965b0ccc6897232bb24eb282a5 Author: John Bowman Date: Wed Apr 15 23:28:57 2009 -0600 Make boolean condition suppress function evaluation for linearly interpolated surfaces. commit 527ec35a4f884dc8f4f3db61a24a87c24c0e4f85 Author: John Bowman Date: Mon Apr 13 08:48:38 2009 -0600 Add operator +(pen, pen[]) and operator +(pen[], pen) and example. commit 056aa9ccdb8a865d2b90b33eaba2007d0fe65dfe Author: John Bowman Date: Sun Apr 12 23:04:57 2009 -0600 Generate mpg file. commit 757885c24fcc69bb74ae3e1b4f0e2192675b05d2 Author: John Bowman Date: Sun Apr 12 21:32:34 2009 -0600 Produce an animated gif rather than an inline PDF movie (about 1/4 as big). commit 4fe5f1b0e6ec434224996a426351e52049e34cb6 Author: John Bowman Date: Sun Apr 12 17:11:56 2009 -0600 Avoid nullpath3 has no points error when label is given nullpath3. commit 0f936bf8f955acd4aebdd2a952c86a18320d44a4 Author: John Bowman Date: Sat Apr 11 01:32:31 2009 -0600 Set dotgranularity=0 in cube example to force dots to be rendered as spheres. commit 9cf2b91fa3c126cb9fb884e3d57a6ce726c45993 Author: John Bowman Date: Fri Apr 10 22:03:19 2009 -0600 Improve example to use a better (smooth) approximation to a torus. commit 522ed7412ad11b90fcff13eafc39d02c8a351125 Author: John Bowman Date: Fri Apr 10 15:10:27 2009 -0600 Increment version to 1.71svn. commit 3b34b09b00bc857702b2daf751f81905ca6d4858 Author: John Bowman Date: Fri Apr 10 12:57:02 2009 -0600 Add node. commit c7dc01717e31922693fda55e61791cf673068458 Author: John Bowman Date: Fri Apr 10 11:35:11 2009 -0600 Optimize and improve valid range of choose(int n, int k). commit 8309c1f5916ec1e97a77f0a4c4f95e62857e79f6 Author: John Bowman Date: Fri Apr 10 10:48:31 2009 -0600 Update example. commit 58b97e553f6289842ec696ad9651939b50fd5e05 Author: John Bowman Date: Fri Apr 10 09:52:28 2009 -0600 Handle spaces in incoming prefix. Add prefix arguments to fit function. commit bf4d3adb2d37c7ba52677f65cfcc8fd60c398e88 Author: John Bowman Date: Fri Apr 10 09:40:07 2009 -0600 Handle spaces in filenames when using pdflatex. commit a2f84e9d58da5b279e8040134757b447cc280726 Author: John Bowman Date: Fri Apr 10 00:27:03 2009 -0600 Work around animation problems with spaces in filenames. commit 785dea67b0655ccc4f8742e9cbb68efc5119d4c2 Author: John Bowman Date: Thu Apr 9 23:57:44 2009 -0600 Add PenMargin2, etc., for planar arrowhead types like DefaultHead2. commit ddd85786d17a6b9a2cae12774a682982a38db7a2 Author: John Bowman Date: Thu Apr 9 17:57:52 2009 -0600 Add labelpath3 module for typesetting curved labels in 3D and example, courtesy of Jens Schwaiger. commit 11e92513bfe3522596bb6679b6cf2239e40f82f1 Author: John Bowman Date: Thu Apr 9 16:32:17 2009 -0600 Center target of teapot. commit e42cfe2edbcfcd564419d8d86af10f9122746667 Author: John Bowman Date: Thu Apr 9 16:30:01 2009 -0600 Add bool center=false parameter to projections to allow one to automatically center the target within the bounding volume. commit 4606c09664ef8f7144529d3c78831c92160de3eb Author: John Bowman Date: Tue Apr 7 21:05:53 2009 -0600 Fix clipping example. commit 2ccddae8a2610c9e84dc098708a9cc7794190355 Author: John Bowman Date: Tue Apr 7 16:02:10 2009 -0600 Minor update. commit f1fa0d1eeef5508d9e4fa54b281e3d7d4dfe4368 Author: John Bowman Date: Tue Apr 7 16:00:46 2009 -0600 Use locale. commit fd783acf33724de96f7aa6ee71d719341d1779ef Author: John Bowman Date: Tue Apr 7 15:46:44 2009 -0600 More updates. commit 5f329206530828a782bd4b0d078232b9387dc250 Author: John Bowman Date: Tue Apr 7 15:41:08 2009 -0600 Fix typos. commit 4fd4bd5bfa094a0ea7e2caa78d0b58c9f59a2cbc Author: John Bowman Date: Mon Apr 6 15:55:08 2009 -0600 Reserve surface(triple[][] P) for graphing a surface described by a matrix; use surface(patch(P)) instead. commit 58b990d3824d09a231c8a747ac651713146ca122 Author: John Bowman Date: Mon Apr 6 03:39:14 2009 -0600 Work around old compiler bug. commit 5b2a0b5fea94b7852d546799ab2b119e2abe0379 Author: John Bowman Date: Mon Apr 6 03:37:42 2009 -0600 Increment version to 1.70svn. commit 3df96eddb725d40fa18157197e6645109209db8b Author: John Bowman Date: Mon Apr 6 02:02:44 2009 -0600 Add torus animation. commit 751007ecbd03b344dca139eaf9d89767a1e090ee Author: John Bowman Date: Mon Apr 6 01:53:38 2009 -0600 Reduce memory usage. commit d20badd0879006dca0107bd44d1eefc8def4caa5 Author: John Bowman Date: Mon Apr 6 01:07:52 2009 -0600 Force outformat="pdf" when producing PDF animations. commit 91fba1067f0cb496ac6ab02c66247f1bb88bc5b6 Author: John Bowman Date: Mon Apr 6 00:30:10 2009 -0600 Change - delimiter to + for animation frames and preview images. commit 9f143ecebab158f28117bbd9e2496541cda147f1 Author: John Bowman Date: Sun Apr 5 23:36:07 2009 -0600 Move extension routine and infinity constant to C++ code. commit dce7d4684b60fbd49411678e41acd91fe2aae518 Author: John Bowman Date: Sun Apr 5 22:50:15 2009 -0600 Work around hyperref option clash. commit b5c792a1ef897cb3541fbbbfb89a5c72d1f6ae1a Author: John Bowman Date: Sun Apr 5 21:26:41 2009 -0600 Catch handled_errors (e.g. from ~psfile()) during throw handled_error(). commit 4e9be4d6c89ad820c73fc42a231eb10fa4ef2910 Author: John Bowman Date: Sun Apr 5 17:08:33 2009 -0600 Fix more animation prefix issues. commit 9e4c35e7de336022485ae806b38740cd926068ed Author: John Bowman Date: Sun Apr 5 14:19:38 2009 -0600 Keep keep flag. commit 22ae02a38ed6e3ffe30dc921ba51b21612cadeda Author: John Bowman Date: Sun Apr 5 13:21:13 2009 -0600 Move 3D code out of animation.asy. commit a52a6633d81fc3d7d04d14b485d593cd20cf0a35 Author: John Bowman Date: Sun Apr 5 12:02:17 2009 -0600 Fix inline pdf animations with multipage=false. Fix global scaling of 3D animations. Add heatequation and earthmoon examples. commit 443cc79149c736d66ce4d47db1a4a84ab594b101 Author: John Bowman Date: Sat Apr 4 14:26:55 2009 -0600 Minor optimization. commit 152f712891e81f1fecbaa91cc499364d0487cd85 Author: John Bowman Date: Sat Apr 4 14:24:31 2009 -0600 Use a lookup table to compute factorial(int n). commit 2f93f82b0b032cd2c8996c1d28737173a2ab175d Author: John Bowman Date: Sat Apr 4 12:50:14 2009 -0600 Implement miterlimit. commit a41cc4546b6313f99be1b65573182e44318f1093 Author: John Bowman Date: Sat Apr 4 11:26:43 2009 -0600 Fix use of baseline. commit 4eaf887ab95fe68fa9ccf39b94bc1d10c0db0478 Author: John Bowman Date: Sat Apr 4 10:44:00 2009 -0600 Disable old lights for multiple exports. commit fd244ea8555fc0fdb92c87f3388e5c3946f781a9 Author: John Bowman Date: Sat Apr 4 08:44:15 2009 -0600 Fix warning message. commit 7046900634a2fc8d5f5f609175f16b8edc195a1c Author: John Bowman Date: Sat Apr 4 08:41:58 2009 -0600 Add missing conditional. commit 612728718a6fa71065a7dbc3757d772847410e44 Author: John Bowman Date: Sat Apr 4 00:31:39 2009 -0600 Improve example. commit f930ee18a50667ee5b3655a8eda1be651d5006df Author: John Bowman Date: Sat Apr 4 00:24:39 2009 -0600 Remove unnecessary parameter. commit d248a41b7792d2d70167d4b6d3d0495c0989b861 Author: John Bowman Date: Sat Apr 4 00:22:37 2009 -0600 Fix type conflict by replacing settings.divisor with purge(divisor=0); divisor=0 means to use the previously set divisor (which defaults to 2, or the value specified on the command line with the -divisor option). commit 5e50b840f02bf29da1730c72df3d65954afa90e3 Author: John Bowman Date: Fri Apr 3 22:06:22 2009 -0600 Increase orthographic viewportfactor. commit e0963eaad05890f3fda42a3bbbaaa1f65b53db08 Author: John Bowman Date: Thu Apr 2 00:05:50 2009 -0600 Add missing 3D add function. Increase nsamples to 32. Remove nonselfintersecting restriction. commit fccd5702d3caef79ceda7e05806e1a68139a6920 Author: John Bowman Date: Wed Apr 1 02:38:09 2009 -0600 Fix splitting. commit 8cee60600708d3947f899b578400c8a626e0c2e4 Author: John Bowman Date: Tue Mar 31 20:31:48 2009 -0600 Increase fuzz; use static dxmin. commit bb8cbc4f3a32442b4453f8b32a5dafa585a0fde6 Author: John Bowman Date: Tue Mar 31 17:32:16 2009 -0600 Reorder tests. commit 9970a0a8a174f9172cba01cbcb1cc81a94e287e0 Author: John Bowman Date: Tue Mar 31 17:27:53 2009 -0600 Check for triangles first. commit be4fc623d49613c243c098cc38bf8854e83794d1 Author: John Bowman Date: Tue Mar 31 16:54:09 2009 -0600 Split randomly to avoid returning a degenerate patch. commit f53b1dd96ad99531902c70c0a8753b07953c6057 Author: John Bowman Date: Tue Mar 31 16:21:13 2009 -0600 Fix interactive rendering. commit 72ce918958da2a16be791ee2e1d70fd9d83c15f1 Author: John Bowman Date: Tue Mar 31 02:32:14 2009 -0600 Once an internal degeneracy is found, don't check any more boundary cases. commit 069759abc268c4fa3f0c871b141582afd76788ec Author: John Bowman Date: Tue Mar 31 01:45:23 2009 -0600 Increase nsamples. commit 1afb44a8645d304ce33144e2271fc75ba02633c9 Author: John Bowman Date: Tue Mar 31 00:39:32 2009 -0600 Split at the worst boundary degeneracy. commit 82e73caf64ea5ccd2a9b718a67a4323fe5168966 Author: John Bowman Date: Mon Mar 30 12:29:10 2009 -0600 Add unicode option to make new versions of hyperref happy. commit e683a4d1cfd75925b27ff38361e7c7806e84f072 Author: John Bowman Date: Mon Mar 30 08:44:30 2009 -0600 Pass animate the correct file name. commit 1ba731b25bbbe2b5a161e75be0dda0395e795166 Author: John Bowman Date: Sun Mar 29 23:39:56 2009 -0600 Fix floating point exception caused by attempt to split paths of length 0. commit 1a124b08ec44272e3d8591081bfd196bab64c338 Author: John Bowman Date: Sun Mar 29 23:07:13 2009 -0600 Move inside(path, pen fillrule=currentpen) to plain_paths.asy. commit e13cec520205c06c787dfa1a390c07a85e7245de Author: John Bowman Date: Sun Mar 29 20:57:00 2009 -0600 Fix defaultpen(evenodd). commit 180fb560a67a14747113ad4ab033fb348d544390 Author: John Bowman Date: Sun Mar 29 17:00:07 2009 -0600 Fix spurious "undefined" (on curve) return values from windingnumber; optimize handling of straight segments. commit a575a6fc1b88edb18a01616bcf473695c429999c Author: John Bowman Date: Sun Mar 29 14:45:08 2009 -0600 Always define glthread. commit d8f464fc32c76929510f34d41de82117564a8723 Author: John Bowman Date: Sun Mar 29 10:06:33 2009 -0600 Release version 1.06 of asymptote.sty to fix undefined \ASYbox bug. commit 5b996b037bcf7d0f23a1e7e0fe8e161849f85f06 Author: John Bowman Date: Sun Mar 29 00:30:53 2009 -0600 Automatically apply bezulate to path arrays. Surfaces should now be constructed directly from paths (and paths arrays), without first calling bezulate. An array of independent surfaces can still be constructed from a path array using a loop. commit b80b2d3074dcaf68f82fd51571c4475e73548f43 Author: John Bowman Date: Sun Mar 29 00:05:54 2009 -0600 Fix inside(path,pen). commit 6f4f738fb32e1a44cf43c80905308b77aa040c50 Author: John Bowman Date: Sat Mar 28 23:35:26 2009 -0600 Add Orest's connect patch to fix nesting. commit a646731fad5a118d1464a6b62e366b8dffdd956a Author: John Bowman Date: Sat Mar 28 23:11:34 2009 -0600 Specify zerowindingnumber rule. commit 622937c19c1bd66f9c97771f105be7b73e6b33b8 Author: John Bowman Date: Sat Mar 28 23:09:13 2009 -0600 Improve inside(pair); add fillrule argument. commit 9fa25db9be336cf6019063dfea7e959d21a772e4 Author: John Bowman Date: Sat Mar 28 14:21:05 2009 -0600 Remove internal patch degeneracies by splitting. Compute subpatches directly from control points. commit 195cbd6b9daab589520bf8f4319c04f42982a01c Author: John Bowman Date: Sat Mar 28 12:24:17 2009 -0600 Implement factorial and choose functions. commit 6447f273d215e1d4f488650b468de3c250bc7732 Author: John Bowman Date: Sat Mar 28 12:18:16 2009 -0600 Rename example; use orthographic projection. commit 78b068ae1390a2c89329281dfd668595ae9b03f5 Author: John Bowman Date: Sat Mar 28 12:15:09 2009 -0600 Make path(path3, pair(triple)) preserve straight flag. commit 2cb79dbf9585a541058e23047f79c09dd8af150d Author: John Bowman Date: Sat Mar 28 12:08:55 2009 -0600 Fix quit deadlock. commit d8125e4fa7af606cf6fcd7398b3a07b9aa41bad9 Author: John Bowman Date: Sat Mar 28 00:11:09 2009 -0600 Increase fuzz to accomodate italic "k". commit 3a1f5a20fec2b085364dd4da3295f84ab3d52475 Author: Orest Shardt Date: Fri Mar 27 21:56:17 2009 -0600 Fix connect() to ensure that removed regions do not contain an inner curve. Add fuzz to intersections(). commit d4f6dddb855703ed9c11070c985c7bd735bd04be Author: John Bowman Date: Tue Mar 24 21:47:57 2009 -0600 Add surface constructor for multiple surfaces. commit 850b0ed10f2eed93e617b918269739136fc6281f Author: John Bowman Date: Tue Mar 24 21:32:54 2009 -0600 Add intersecting pipes example. Update FAQ. commit ef5e8e4054b63c12b29352c930445d1bbfa59dbf Author: John Bowman Date: Mon Mar 23 03:23:19 2009 -0600 Increment version to 1.69svn. commit e9bd6706f9bedf66c3d997b07707dd54a9eefde7 Author: John Bowman Date: Mon Mar 23 02:07:01 2009 -0600 Update example. commit d73f25a4baa11d6d85364a2fd419f423f09cd032 Author: John Bowman Date: Mon Mar 23 01:45:58 2009 -0600 Illustrate automated camera and target computation. commit d777a813382fac58535de2c8223c80c84dd98bb0 Author: John Bowman Date: Mon Mar 23 01:37:23 2009 -0600 Remove unnecessary index. commit f84b490d11d0cb509d778299a8f180a1ab579264 Author: John Bowman Date: Mon Mar 23 01:34:42 2009 -0600 Add support for and example of generating a 3D inline pdf movie. Remove hyphen from animation file prefix for compatibility with animategraphics. Force multipage=true in inlinetex mode. Update definition of ASYanimategraphics. commit e10b91934bf65fa81f5e8edc34aaf0c720b3152b Author: John Bowman Date: Mon Mar 23 00:31:06 2009 -0600 Fix export deadlock. commit 587aa4f5bb4fb8f2afe4246e7e4d7bce78aa9904 Author: John Bowman Date: Sun Mar 22 21:42:52 2009 -0600 Don't automatically move camera with target. commit ace730baa7577af882835379f5bd4fbe937f9c17 Author: John Bowman Date: Sun Mar 22 12:12:52 2009 -0600 Update example. commit d6667c3934ef2cd795037dd81c2301340520abef Author: John Bowman Date: Sun Mar 22 12:11:41 2009 -0600 Fix camera adjustment. commit d9d5da76552aac77955fbc5066296f8a998eaa72 Author: John Bowman Date: Sat Mar 21 23:54:54 2009 -0600 Allow \par in a label. commit 1e4f2fe939058c6b832bc22903bca649638c665b Author: John Bowman Date: Sat Mar 21 23:49:23 2009 -0600 Update documentation. commit 9cd5a0fe84a5e068af1488f50c39d2b2720fc06d Author: John Bowman Date: Sat Mar 21 23:07:42 2009 -0600 Improve and generalize baseline. commit 74f9e6f899b075ad53f1ebcb6edd01bc57f2f107 Author: John Bowman Date: Fri Mar 20 23:26:20 2009 -0600 Look for exact intersections also when fuzz=0. commit 0638cdbfeabb2a803b09b82dd1471c1ea0876d49 Author: John Bowman Date: Fri Mar 20 22:42:10 2009 -0600 Suppress spurious space. commit 04ae9df43413d6956ed3fbc97cc1e6c8751f48cc Author: John Bowman Date: Fri Mar 20 22:28:18 2009 -0600 Standardize sqrtEpsilon. commit f16441c237fbfa983d69a569fad449d782a8770e Author: John Bowman Date: Fri Mar 20 22:15:40 2009 -0600 Remove unused line. commit 7c3732148f30c6d9f9fa888e6b7f780aa490dc08 Author: John Bowman Date: Fri Mar 20 22:14:19 2009 -0600 Improve handling of intersection fuzz. commit 789ab1c54c66973fcd061dbccdb6b4c397b5bb69 Author: John Bowman Date: Fri Mar 20 14:57:34 2009 -0600 Handle invisible material. commit 5e3b8fdec620ed0e7ed38e01e193269dd97d6fe2 Author: John Bowman Date: Fri Mar 20 14:28:23 2009 -0600 Respect user-specified step value. commit 05b16339d6790f96f0657b38dc194efe1d01f662 Author: John Bowman Date: Thu Mar 19 02:59:14 2009 -0600 Increment version to 1.68svn. commit b8c188a2ff0c6d8acd87da23c27bad9ebb0b42bd Author: John Bowman Date: Thu Mar 19 01:33:53 2009 -0600 Fix 3D animations with render > 0. commit 823eb84ed3fe32c0188596227f1c56c573b46f72 Author: John Bowman Date: Thu Mar 19 00:40:40 2009 -0600 Don't force C:\Documents and Settings\bowman in asy.bat commit 87a2b41240328f478ca8bf3b256e6789930a3abe Author: John Bowman Date: Wed Mar 18 14:18:11 2009 -0600 Remove normal fuzz. commit ce6df332a9c0f9010ccf9d1c9f6e7083b7f539b6 Author: John Bowman Date: Wed Mar 18 02:51:53 2009 -0600 Fix overlap detection internal control points for short paths. commit a8cc7c427cac46ace2db0070645385718a09028f Author: John Bowman Date: Wed Mar 18 01:23:56 2009 -0600 Add file missed from last revision. commit e6766a83c38ada605086a98cf3f06b71eb2b29cc Author: John Bowman Date: Wed Mar 18 01:01:08 2009 -0600 Make intersection routines respect fuzz. commit 9b3a5104ccc45a972fbd776a589f13d8e42f5bde Author: John Bowman Date: Sun Mar 15 17:20:04 2009 -0600 Simplify normal calculation slightly. commit 460b9eed16912fcaa5753bf84679620335c8ca5b Author: John Bowman Date: Sun Mar 15 15:32:07 2009 -0600 Reduce Fuzz. commit 30566f000cf574ac193f65f1a9846d4ebc5f5f39 Author: John Bowman Date: Sun Mar 15 15:01:04 2009 -0600 Allow prc output if render > 0. commit 4cb2f03752fb95986e981e558be71f8d0db7d5a5 Author: John Bowman Date: Sun Mar 15 00:09:54 2009 -0600 Implement settings.auto3D (default true) so that one can disable the poster option of movie15.sty. commit c026e07e6a9067e1b1047f4027849305ae6dbc02 Author: John Bowman Date: Sun Mar 15 00:05:14 2009 -0600 Increase fuzz. commit 594a12ce972e648dc8b66c295fad2d330f6c1444 Author: John Bowman Date: Sat Mar 14 23:23:00 2009 -0600 Detect and fix remaining cases of patch overlap due to normal reversal, using Rolle's theorem and a quartic root solve. commit 3b2700c4a800e6de2eb6ab08e0a7de93e1d38069 Author: John Bowman Date: Sat Mar 14 23:09:29 2009 -0600 Detect numerical roots at infinity; increase Fuzz. commit 8279587db2c825391fc51c85b22db684b3ef1fb7 Author: John Bowman Date: Sat Mar 14 23:00:31 2009 -0600 Make subpath preserve straight flag; optimize splitCubic for straight segments. Fix handling of straight flag in operator &(path,cycleToken); do nothing if path is already cyclic. Implement pair versions of Bezier functions. commit 8361c768a73d9dc693e71b9372db2de0b5c20f7a Author: John Bowman Date: Sat Mar 14 15:25:45 2009 -0600 Fix segmentation faults with operations on guide g=cycle. commit db843913d4afd6861ee0649456ff8008928f506f Author: Orest Shardt Date: Sat Mar 14 11:49:45 2009 -0600 Speed up curve sorting. commit 26c1aa3481dd6878716e8d46f3924b5137f61fce Author: John Bowman Date: Fri Mar 13 15:02:45 2009 -0600 Fix buildcycle endpoints. commit cfe2ab7253439844c47bb0f45a2bfff4b4831df6 Author: Orest Shardt Date: Wed Mar 11 21:44:52 2009 -0600 Use bounding box size to determine whether points are duplicates. commit 110ab7d63f8346830c11276b1c0d4133f5bc825b Author: John Bowman Date: Wed Mar 11 01:47:57 2009 -0600 Force planar flag for arrow construction. commit 2511368422abcb3be6500d2fcc8bea79e031ed12 Author: John Bowman Date: Wed Mar 11 01:33:51 2009 -0600 Remove another degenerate segment. commit e1cf02273301e2a7342006b9aeb6cbf41544d842 Author: John Bowman Date: Wed Mar 11 01:25:36 2009 -0600 Work around bezulate bug by removing degeneracy. commit 42fa995edf293de9162db70a15c3bd3368a79ea9 Author: John Bowman Date: Wed Mar 11 00:18:34 2009 -0600 Fix planar surfaces. commit ad59550839cb6c72c56a6716a94943119db54928 Author: John Bowman Date: Tue Mar 10 23:45:25 2009 -0600 Simplify surface constructors; update documentation. commit f75e88bde5cf608232940a708263d3272b4b3d37 Author: John Bowman Date: Tue Mar 10 22:23:19 2009 -0600 Update examples. commit 374fe5ba6ec9c625e879adcbd4ac575c62001860 Author: John Bowman Date: Tue Mar 10 22:06:09 2009 -0600 Enable poster mode only when there is no rendered preview image. commit e54a57e797193f26b69165636a686337259c7f9b Author: John Bowman Date: Tue Mar 10 21:34:37 2009 -0600 Add termination tests. commit 619a3195f7b333f91189349f8b19a7fabe08a7d6 Author: John Bowman Date: Tue Mar 10 21:34:12 2009 -0600 Increase bezulate fuzz; add termination tests. commit db838100431fe50516bf3ba17b7ccf9d7b7409c8 Author: John Bowman Date: Tue Mar 10 14:04:32 2009 -0600 Add Align constant. commit e12fcc1ca69c59d1d49446c6fa2b91d458634512 Author: John Bowman Date: Tue Mar 10 02:54:16 2009 -0600 Fix most instances of selfoverlapping patches. commit 9cb3e7a170ea796feda2023fc9a9aaa69daf27d0 Author: John Bowman Date: Mon Mar 9 21:38:52 2009 -0600 Make axial and radial shading respect -gray, etc. commit 9e40719812e31103ec3f4a5e39b06148270cc2df Author: John Bowman Date: Mon Mar 9 00:07:48 2009 -0600 Fix texpath control points for cyclic segments; respect straight flag. commit db6f45dc098f8b24df43b0586e4438f241afedeb Author: John Bowman Date: Sun Mar 8 16:11:51 2009 -0600 Slightly simplify normal calculation. commit 71e1c95735a2ba23c19e092415baff80edf4d514 Author: John Bowman Date: Sun Mar 8 12:03:26 2009 -0600 Make default viewportwidth \the\linewidth in inline mode and 0 in attached mode. Document asy environment options in asymptote.sty version 1.04. commit a06740433ebde75644e27f3e9466468c5e1d90a1 Author: John Bowman Date: Sun Mar 8 09:23:09 2009 -0600 Simplify tick calculation. commit 83d2fa180a2bdca1ef8c7ac05a345caa71753215 Author: John Bowman Date: Sun Mar 8 02:18:52 2009 -0600 Improve tick selection. commit f1e40619a13f3ab6a19a0acb8e2f8b1cc75a1577 Author: John Bowman Date: Sun Mar 8 01:02:42 2009 -0600 Colorize example. commit c2c2eb092db44f4e3cbbc5b59c62298d639d0d1d Author: John Bowman Date: Sat Mar 7 21:17:56 2009 -0600 Reinstate original views. commit 81fce38d02dc3158eb728636c8007cd7d8ff9dca Author: John Bowman Date: Sat Mar 7 21:10:03 2009 -0600 Fix camera adjustment. commit 02eb5bcfcca0d0378e385f4137226e8946b2b8ad Author: John Bowman Date: Sat Mar 7 16:23:58 2009 -0600 Support keyval options width, height, viewportwidth, viewportheight, and attach in asy environment asymptote.sty. Remove obsolete asyattach environment. Move viewportsize to plain_picture.asy to support asymptote.sty. commit 24e9b23a742650c682357ecdd303bd10fd57d390 Author: John Bowman Date: Sat Mar 7 12:14:05 2009 -0600 Better fix for unextended axes limits. commit 78581b7e40528f7eb1a42a0517690368931d999f Author: John Bowman Date: Sat Mar 7 10:10:37 2009 -0600 Update documentation of crop. commit c01d0084a1d3156957c997c89100d4d5b57ec8f8 Author: John Bowman Date: Sat Mar 7 02:46:18 2009 -0600 Add example of a surface drawn using irregular data read from a file. commit 9c01ec16add18b92fd50bb4674cbadde10329bb6 Author: John Bowman Date: Sat Mar 7 02:23:39 2009 -0600 Revert last change. commit 47aa02a0fd237e6267d018ddab025fcdb408d3b4 Author: John Bowman Date: Sat Mar 7 01:07:03 2009 -0600 Fix unextended axes limits and tick generation. commit ea3cf29d5dc68f65db8f3c0835c7a7275b035969 Author: John Bowman Date: Sat Mar 7 00:45:35 2009 -0600 Avoid redundant camera adjustment messages. Increase camerafactor to 2 again. commit 38dc72be7a5d0b19888e15e5b64a54efae1d957a Author: John Bowman Date: Sat Mar 7 00:19:49 2009 -0600 Check crop argument. commit 82a5510bd196c1bd13e176ceac37f5a3d52e7d0f Author: John Bowman Date: Fri Mar 6 23:52:12 2009 -0600 Improve automatic camera adjustment: relocate target to the center of the bounding box, if it lies outside, and reposition camera when aspect ratio is not preserved. commit 2311c16d538c5e25467da6aa029a05dbfffe4854 Author: John Bowman Date: Fri Mar 6 01:14:45 2009 -0600 Allow the user to specify a minimum viewportsize. commit 688371c4a8696f5dcc83215f9de890adf14de341 Author: John Bowman Date: Fri Mar 6 01:06:16 2009 -0600 Use a single call to clip in limits. commit 0026ea88a43ca42d078daaf271a611a6fca599be Author: John Bowman Date: Fri Mar 6 00:56:25 2009 -0600 Fix behaviour of xlimits(Crop) and ylimits(Crop) under picture transformation. commit 70429fc62beac0c19e61982cd9bf676db905753d Author: John Bowman Date: Wed Mar 4 03:44:31 2009 -0600 Increase camerafactor. commit ce2861d0882f816900ec6893aedea46a5541899c Author: John Bowman Date: Wed Mar 4 03:18:49 2009 -0600 Improve automatic camera adjustment. commit 729c7308c0db8806392b48506da22d6e9989a459 Author: John Bowman Date: Wed Mar 4 02:09:19 2009 -0600 Work around intermittent hang on exit. commit 0902c55dc095a0147b7a9feb32b20cdfb74f347d Author: John Bowman Date: Tue Mar 3 02:19:52 2009 -0600 Make attached images printable. commit 8c4f30913cf60f1b963fa6b4c34b045d23783a39 Author: John Bowman Date: Mon Mar 2 19:03:03 2009 -0600 Turn poster off when we have our own preview image. Fix viewportmargin. Remove unwanted camera rescaling. commit 990b6ee4eba7a1b9033d87489f15e284de5b823d Author: John Bowman Date: Mon Mar 2 18:49:36 2009 -0600 Fix spurious annotation question marks and print preview problems by removing workaround for BBox bug in obsolete 2008/01/16 version of movie15.sty. The now widely available 2008/10/08 version of movie15.sty is now compulsory. commit 5ad2d615fa2da167e76a7bd784fcd57e8af41bef Author: John Bowman Date: Mon Mar 2 15:45:00 2009 -0600 Fix slanted ticks. commit 9316b6e0aba874d635db72cf538d1cf718741b5e Author: John Bowman Date: Sun Mar 1 23:58:58 2009 -0600 Fix animation prefix. commit ae5315ac620c3aa15e47e16db87cc7b234aec103 Author: John Bowman Date: Sun Mar 1 17:32:54 2009 -0600 Fix planar arrows for 2D projections. commit 30f6e7f858cf09de210fe6d56dae2752c3698c5f Author: John Bowman Date: Sun Mar 1 17:01:58 2009 -0600 Allow one to disable poster option. commit 09782ec523dd2e89001cfc9b2a3ff24b8db314bb Author: John Bowman Date: Fri Feb 27 17:32:54 2009 -0600 Resize example. commit 6556c592c360ab5ab045004a37cc4cf40ebe6bca Author: John Bowman Date: Fri Feb 27 15:43:51 2009 -0600 Don't hide convert errors. commit 2ca31a4e8eaeadcfa8c513fb2b03bc8271a97892 Author: John Bowman Date: Thu Feb 26 23:09:51 2009 -0600 Add example (contributed by Orest Shardt). commit 88ca0f83d5a114a730aa65578e3e19d067771d74 Author: John Bowman Date: Thu Feb 26 17:23:44 2009 -0600 Increment version to 1.67svn. commit dae4c85870f84c1ed6dd1c139d3408d2cac88b34 Author: John Bowman Date: Thu Feb 26 16:00:38 2009 -0600 Fix outprefix. commit 6a5de0c624a8638930b1216b5695886bce86a18f Author: John Bowman Date: Thu Feb 26 10:01:58 2009 -0600 Remove animation optimization by default. Under MSWindows, suppress call to animate since it requires XWindows. commit 99ea30e4d2f14fcbdef3246301c2010e6e1872cd Author: John Bowman Date: Thu Feb 26 08:50:25 2009 -0600 Add optional direction argument to three-dimensional bars. commit a9d59eb9158368824e68c96f5988f279f7dda53e Author: John Bowman Date: Thu Feb 26 08:45:58 2009 -0600 Avoid division by zero when NColors=1. commit 69192fae67050b8588203e1c60b3ab06f86fe26e Author: John Bowman Date: Thu Feb 26 06:45:26 2009 -0600 Fix alignment bug under pdflatex due to missing %. commit 6bb6ecb0218cdf77f474df10bf763c3a89ec111e Author: John Bowman Date: Wed Feb 25 23:04:31 2009 -0600 Change guides into paths; update to LGPL. commit c48ca48643148db89071d9446c8d0a1bc0ef0ef2 Author: John Bowman Date: Wed Feb 25 17:21:27 2009 -0600 Use integer division. commit ee3c6b650e1a91aff74ecba6996da5987af09db7 Author: John Bowman Date: Wed Feb 25 17:07:20 2009 -0600 Remove "named argument may be mistaken for assignment" debugging warning as it discourages the use of named arguments and detracts from the usefulness of the -d option. commit 389c5fb20a8aa07ef5eead1a95832fb657070105 Author: John Bowman Date: Wed Feb 25 16:06:21 2009 -0600 Revert to interpolating function at midpoints. commit 6cc5fc9f62876be9fc734340932fa4fa229808b1 Author: John Bowman Date: Tue Feb 24 10:51:11 2009 -0600 Add optional normal argument to DefaultHead2, HookHead2, and TeXHead2. commit bdbd01b5c6fe36d7e03aa516da5e9880a85ce4b9 Author: John Bowman Date: Tue Feb 24 01:47:00 2009 -0600 Fix Arrow3(TeXHead2). commit 1321c2fd18a8868b4c968ba89dff10858a8879ab Author: John Bowman Date: Tue Feb 24 01:35:08 2009 -0600 Fix alignment of DefaultHead2, HookHead2, and TeXHead2 arrowheads. commit d42d0e22364585fb5f034b151adf3a7b17085c14 Author: John Bowman Date: Mon Feb 23 01:36:02 2009 -0600 Improve thin 3D arrow handling. commit ac890dbbd19be365d45a4b46038ee04fb50dc54c Author: John Bowman Date: Mon Feb 23 00:01:42 2009 -0600 Make filltype a structure to allow extraction of type and pen parameters. Improve the appearance of DefaultHead2, HookHead2, and TeXHead2 (particularly with curved paths); standardize their usage with their 2D counterparts. Fix MidArcArrow(TeXHead) sizing. commit 04c4806b61f68cf9f3df17ce8a6232a33909bca6 Author: John Bowman Date: Sun Feb 22 21:32:38 2009 -0600 Untabify. commit 43e22d83c2f82739550b7b943770a3f30934b1d6 Author: John Bowman Date: Sat Feb 21 21:30:41 2009 -0600 Upgrade license to LPGL, as per email from Philippe. commit 31e799c42b85817afd1eb468269fc7b86dc0fb22 Author: John Bowman Date: Sat Feb 21 17:39:27 2009 -0600 Retune 3D arrow parameters. commit b0667031a8755d08adea8132ddb143d538c7b2bb Author: John Bowman Date: Sat Feb 21 17:03:22 2009 -0600 Upgrade global license from GPL to LPGL (except as noted within individual files). commit 5523eb20c73989293429387cae06319c96e5c5b0 Author: John Bowman Date: Sat Feb 21 16:37:09 2009 -0600 Remove obsolete featpost3D.asy module. commit 64757f0b6dd69ed1e837c0d08ece5877f87af700 Author: John Bowman Date: Sat Feb 21 15:56:33 2009 -0600 Add bool autoadjust=true argument to perspective projection constructors. commit e6f290616e09b9aa44a0b55b9b74299f99eefe4f Author: John Bowman Date: Sat Feb 21 13:26:15 2009 -0600 Fix TeXHead alignment for curved arrows along with endpoint appearance. commit b57f0e9ad0898cfdec851911fbac70ed1c4f5324 Author: John Bowman Date: Sat Feb 21 11:46:29 2009 -0600 Add autoadjust flag to projections to disable automatic camera adjustment (for experts only). commit 431e0a5ec4fddc168199226dd41564e3fdf41a62 Author: John Bowman Date: Sat Feb 21 11:28:25 2009 -0600 Fix transverse vs. longitudinal typo. Add slight hysteresis to camera adjustment. Always notify user if camera is moved, as transverse and longitudinal slices will have to be (manually) recomputed using the new camera position. commit a4e964c92b8dd447c1146e7382b5b3ec72557dd5 Author: John Bowman Date: Sat Feb 21 04:05:32 2009 -0600 Add 3D arrows example. commit fd67a7961ae8a339ca75d8cdbea2ceebef5552ec Author: John Bowman Date: Sat Feb 21 03:21:58 2009 -0600 Fix appearance of TeXHead3 on curved paths. Fix alignment of DefaultHead2, HookHead2, and TeXHead2 arrows. Pass arrowheadpen to 2D arrow routines when settings.render=0. commit 00bc1d73f58646e2f23f5f4cf0149d157c52defd Author: John Bowman Date: Fri Feb 20 18:30:32 2009 -0600 Use abs(camera-target) rather than just the z component for camera adjustment. Add showtarget parameter to projections. commit 014a1d03c801fa803bb5e297279483b097925ca3 Author: Orest Shardt Date: Thu Feb 19 21:14:42 2009 -0600 Improve selecton of perpendicular vector. commit 5b846e76f5ac0313a81dea335d7600710743f482 Author: John Bowman Date: Thu Feb 19 17:46:20 2009 -0600 Fix typo. commit 902f2734304e84a1597f5215a929c20733ba2888 Author: John Bowman Date: Thu Feb 19 12:00:11 2009 -0600 Increment version to 1.66svn. commit 709ad6bb870e69511fa3b402a3477b1f2178e73b Author: John Bowman Date: Thu Feb 19 10:33:22 2009 -0600 Fix pdflatex output. Implement xelatex engine. Fix xelatex alignment. commit 9e19c35fde997a1a4d1a5705469fcbdc415b6fed Author: John Bowman Date: Thu Feb 19 02:19:28 2009 -0600 Increment version to 1.65svn commit 5e85772d82e096c8bc6df52d6f7fff900e60d665 Author: John Bowman Date: Thu Feb 19 01:24:03 2009 -0600 Force shipped=true also for pictures. Install *.view files. commit 844b91404ec12d951246fdf05c3a8998669dbf44 Author: John Bowman Date: Thu Feb 19 00:13:31 2009 -0600 Change default value of ysize parameter of asyinclude. commit 9625ea38a5e8c89861a31cae6ef63ef0b4dc2cdf Author: John Bowman Date: Thu Feb 19 00:08:44 2009 -0600 Add Protein Data Bank example that illustrates how to set predefined views. commit 5cc82637149d0952582edf6849451575fba35f3f Author: John Bowman Date: Wed Feb 18 23:13:48 2009 -0600 Change dots to underscores in movie15.sty file names. commit 9dbbac7fdab37f6967232dda8e299b96b0adc3fd Author: John Bowman Date: Wed Feb 18 22:03:22 2009 -0600 Add text of LGPL license for PRC code; LICENSE is in parent directory. commit a09d1c1a35352d51ab4906aa904a153bce91a10c Author: John Bowman Date: Wed Feb 18 22:01:08 2009 -0600 Upgrade license of PRC code from GPL to LGPL (agreed to by Orest). commit 6f376fee744b97dd4e75672304ed265f145edd79 Author: John Bowman Date: Wed Feb 18 21:27:47 2009 -0600 Update FAQ. commit 1d9c28b6f19f5d762b6aad2e81e4792ce5c311a4 Author: John Bowman Date: Wed Feb 18 20:38:33 2009 -0600 Fix file path. commit 8944f939542c801fd26b986de5593c4c846491d1 Author: John Bowman Date: Wed Feb 18 20:32:41 2009 -0600 Add interactive 3D examples to intro.asy. Make GaussianSurface smooth. commit 9bd9020de556be40f447c0dccc592be0e8965f3a Author: John Bowman Date: Wed Feb 18 16:06:16 2009 -0600 Strip directory from animation prefix. Don't delete generated animation.pdf file. commit e3151ea29894774140164fd929258085db87e513 Author: John Bowman Date: Wed Feb 18 08:58:32 2009 -0600 Add support for xelatex pdf specials, using the "literal" keyword. commit 17dc9dbf0c34cadde1425947ce0417a5ff03b4f7 Author: John Bowman Date: Wed Feb 18 08:38:48 2009 -0600 Generate PythagoreanTree if needed. commit f4fd594c8f0ef695d457ba6cf262d55edcea8b91 Author: John Bowman Date: Tue Feb 17 22:34:10 2009 -0600 Don't force target to be part of control volume for absolute projections. commit 66fd72aecc79a00cf89a6e1f7b990e3b3f667a60 Author: John Bowman Date: Tue Feb 17 22:25:41 2009 -0600 Increment version to 1.64svn. commit 4300efa1d0b99432dfcdc47cc5345bd491478706 Author: John Bowman Date: Tue Feb 17 20:51:20 2009 -0600 Force the target position to be inside the bounding volume. Remove duplicate definition of rectify(triple). commit e3cc6bf9d4d8fa34e2755d0ddaf2636cafc6192a Author: John Bowman Date: Tue Feb 17 17:37:06 2009 -0600 Fix handling of invisible surfaces. commit 26e310e850ea3c9bd5ece5faf3df72217e89b75c Author: John Bowman Date: Tue Feb 17 10:07:42 2009 -0600 Fix synchronization of interactive rendering. commit b797cbbe7c0f43e7bf054acd484110259737abc0 Author: John Bowman Date: Tue Feb 17 02:05:33 2009 -0600 Avoid spurious xelatex warning messages due to null (placeholder) graphics files. Add patched version of movie15.sty for xelatex users' convenience. Simplify embed.asy. commit 6dfbfac2d7e8f1c5234e4bc3d5fda906fb8efe2b Author: John Bowman Date: Tue Feb 17 01:30:54 2009 -0600 Improve guide collection for non-midpoint case. commit 333afac78848c4bddfe2aa42cb2656fa521eec9b Author: John Bowman Date: Sun Feb 15 13:20:10 2009 -0600 Generalize definition of middle to arbitrary quadrilaterals. Avoid need for interpolating function at cell midpoint; use 2 triangles instead. Use nmesh instead of (poorly named) ncell parameter for 3D contours. commit 743db1d76b55182cb33edc23fece8466b85212f5 Author: John Bowman Date: Sun Feb 15 13:13:24 2009 -0600 Handle degenerate and nondegenerate rendering consistently. commit c5fd7b5465551828e93a812e8d07fcba1e5b3396 Author: John Bowman Date: Sat Feb 14 12:22:48 2009 -0600 Implement complex gamma function in C++ code. Add interactive 3D surface of revolution example to slidedemo. commit 85ed3b5790ddf7d44af6bde3000df7d142c7256b Author: John Bowman Date: Sat Feb 14 10:58:01 2009 -0600 Disable graphic generation when view=true. commit 52149357e57a56ecbaee9e594d574bda4749a60e Author: John Bowman Date: Fri Feb 13 01:10:23 2009 -0600 Add 3D (and other multimedia) support for xelatex. commit 1f7c14ac96ae1faa0ea06106b5af567c1593fed0 Author: John Bowman Date: Fri Feb 13 00:54:37 2009 -0600 Improve pdf format detection. commit f394d80486877735f35a21cf17aad38fbbfe1f6d Author: John Bowman Date: Fri Feb 13 00:49:37 2009 -0600 Fix preview generation. commit 2b1016f627b45298cb776e1480eb9adfe60fb7b9 Author: John Bowman Date: Thu Feb 12 23:42:05 2009 -0600 Automatically include rendered images when fitting nonprc pictures. commit 41b476d67efadc14a2ab16e17e0d1ce8b773b326 Author: John Bowman Date: Thu Feb 12 00:24:54 2009 -0600 Patch compilation errors in pstoedit-3.45. commit 78ec096135b4c6a2680c01ac70b890b53654642a Author: John Bowman Date: Thu Feb 12 00:16:52 2009 -0600 Replace old-style constructors with operator init. commit 6136dc64cf325d025f1c26559b1dd327b4d12b83 Author: John Bowman Date: Wed Feb 11 23:01:19 2009 -0600 Add electromagnetic spectrum. Make minor ticks work properly with custom logarithmic axes. commit 137677e8aa6e9763002d2bbdb0bca9d883b99339 Author: John Bowman Date: Wed Feb 11 17:17:38 2009 -0600 Don't report error on eof after reading 0 values from file. commit a6e6b4ed261bfc1146fc9245d3cc77085e26b2c3 Author: John Bowman Date: Wed Feb 11 16:55:26 2009 -0600 Handle one-column legends correctly (patch contributed by Martin Wiebusch). commit bc9f784dff27f6bffd20941b64594f4f5cfc58e8 Author: John Bowman Date: Wed Feb 11 16:33:45 2009 -0600 Fix pstoedit support: remove duplicate beginclip/endclip functions. commit 6b5a85386c4bb8987f7ce9ead2aa542e84383e76 Author: John Bowman Date: Wed Feb 11 01:29:52 2009 -0600 Update unicode documentation. commit e48449c3a41cdbc148fa817dd408f90f9dbb8b68 Author: John Bowman Date: Wed Feb 11 00:22:23 2009 -0600 Support xelatex again. Note that this experimental tex engine does not yet support pdf specials (required for label clipping and label transforms) or the movie15 package (required for 3D PDF files). commit 57fb0bf9cb05e70bafe2b8f1a61f226fa66813b2 Author: John Bowman Date: Mon Feb 9 01:16:59 2009 -0600 Increment version to 1.63svn. commit 05b8f1cdfce4ddd6f7fb064e353720388a8ad314 Author: John Bowman Date: Mon Feb 9 00:00:12 2009 -0600 Implement a pen rgb(string s) routine that returns a pen corresponding to a given 6-character RGB hexidecimal string. commit a68637e6c82f5ce5171931a5c1a5359bb329e86d Author: John Bowman Date: Sun Feb 8 23:14:02 2009 -0600 Reformat C++ files. commit 46c4f8d767fda269a6965fd4594ae938254b9d76 Author: John Bowman Date: Sun Feb 8 22:22:15 2009 -0600 Reformat and untabify base files. commit 5f3974b82a5e114737827bc4fdd9f0cbe405b968 Author: John Bowman Date: Sun Feb 8 11:19:04 2009 -0600 Add Label arguments to more of the dot routines. commit 301c79a5b6c68ca6bc7de0e7ae88177ddbce9f71 Author: John Bowman Date: Sat Feb 7 14:08:26 2009 -0600 Add parametric version of markuniform. commit b08d2bd76c59e4f21bf7f0e9c80ee5b1cd8b8c2f Author: John Bowman Date: Sat Feb 7 00:41:46 2009 -0600 Implement int hex(string s) function that casts a hexidecimal string to an integer. commit 77595bbb56fc7489ccfa2123c3d33b19a43de9a3 Author: John Bowman Date: Fri Feb 6 20:04:56 2009 -0600 Add default picture argument. commit a5f6409777ceb4b76df34caa9d35aedef99ac5f0 Author: John Bowman Date: Thu Feb 5 03:38:31 2009 -0600 Fix asy -f pdf -o temp/venn. commit 1b3d770eb47e9a4fcce6b51aeb9d2ecc08bf8664 Author: John Bowman Date: Thu Feb 5 03:36:16 2009 -0600 Increment version to 1.62svn. commit bdfa3acd0bacbbbb11066c92504369f92e1f5c33 Author: John Bowman Date: Thu Feb 5 02:35:32 2009 -0600 Prevent multiple shipouts in venn example. commit 8a08bc6ad839d86769c40d52fad154afd7f2db9a Author: John Bowman Date: Wed Feb 4 23:43:29 2009 -0600 Change nopapersize.ps to use letterSize/a4size to work with the current MiKTeX version of dvips, which does not support the DVIPSRC environment variable. commit 8e7aebbb838904760d4d728b11818c3c5fa0e761 Author: John Bowman Date: Wed Feb 4 23:14:53 2009 -0600 Indent. commit 530aa12cdb6f173f18653d7ffd99b27bff870efd Author: John Bowman Date: Wed Feb 4 23:13:24 2009 -0600 Fix aspect ratio on re-entry. commit dfd1d4874c066e411710829a0eee9eaa6ffa3c74 Author: John Bowman Date: Wed Feb 4 20:04:07 2009 -0600 Add Pentype function to return a pen of increasing colour and linetype. commit 9bae8efdc88b2842d4dbf27bbc516ed42a306f27 Author: John Bowman Date: Wed Feb 4 18:50:25 2009 -0600 Fix typo in URL. commit b5118109e681c6a3fc30f53a1445ec938bc86dbe Author: John Bowman Date: Wed Feb 4 09:57:55 2009 -0600 Re-enable freeglut extensions to support user-specified multisampling again. commit cf2107e5fc31f77c688d0f3e2b54786ddc2c3559 Author: John Bowman Date: Wed Feb 4 09:47:24 2009 -0600 Destroy any existing export window before entering View mode. commit 871271ee9d21c2f90442a2d6bacb632079832488 Author: John Bowman Date: Wed Feb 4 00:46:20 2009 -0600 Remove spurious \phantom{+}. commit ae4540d47733b206d1de70982125423cc4dde4eb Author: John Bowman Date: Wed Feb 4 00:33:34 2009 -0600 Fix asydir(); under CYGWIN. Add missing CYGWIN prototype. commit 3a9e92a066756fb8ad252fd1935d955054943d37 Author: John Bowman Date: Tue Feb 3 23:53:23 2009 -0600 Remove -P pdf as this breaks file attachments. commit 810f6f845a864d4cddc2dc0d9e7502f6012e678a Author: John Bowman Date: Tue Feb 3 23:32:40 2009 -0600 Fix segmentation fault due to spurious window creation in export loop. commit ee48135b6016801872fd526b8ce26bb843807aa8 Author: John Bowman Date: Tue Feb 3 23:27:54 2009 -0600 Add string[] to int[] ecast. commit 0e66e1673cac08a8bd71ebf49392a7f739a3f010 Author: John Bowman Date: Sat Jan 31 12:49:19 2009 -0600 Fix dvipsOptions. Don't allow dvipsOptions to override -tnopapersize. commit 0cb84fd14cddaf20e930acc24cae3a2f7ee56b28 Author: John Bowman Date: Sat Jan 31 11:18:22 2009 -0600 Update dvipdf to correspond to the latest ghostscript svn source. commit 6e67b82c4e07bfcd7c2ba9ceb26b3a797a2d5e4f Author: John Bowman Date: Sat Jan 31 09:29:42 2009 -0600 Warn that silhouette routine is intended only for 2d projections. commit 764f7f92b8711a5c7da62797d5f3b3c75413a7c8 Author: John Bowman Date: Sat Jan 31 00:22:51 2009 -0600 Enforce the same zerowinding fillrule used by dvips. commit 54342b62220f756c79ec1716bf31c275a4cbeef2 Author: John Bowman Date: Sat Jan 31 00:07:10 2009 -0600 Rename nosize to nopapersize for clarity. commit d0d1e6094c87254a93efd85363a38d95200f4f6a Author: John Bowman Date: Fri Jan 30 23:58:28 2009 -0600 Workaround dvips misconfiguration in TeXlive 2008 (and possibly other new TeX distributions) that introduces unwanted %%BeginPaperSize commands into the EPS output. commit 0200020ab140143bedc07cf27baf8d2c47e3dba7 Author: John Bowman Date: Fri Jan 30 17:26:56 2009 -0600 Reinstate -q (-quiet) option. Update asymptote.py to use -interactive option. commit 93bcf2e4d0bec3afc58066273aeb9f5c2f90fda0 Author: John Bowman Date: Tue Jan 27 15:38:53 2009 -0600 Work around dvips configuration errors on some systems by enforcing no paper type comments. commit 80e59335e7ed42f326c06612f456a904d4acf327 Author: John Bowman Date: Tue Jan 27 09:40:48 2009 -0600 Rename file. commit aae56cc06b6d59a4c1b5dada20b29b739ac93b05 Author: John Bowman Date: Mon Jan 26 23:17:28 2009 -0600 Increment version to 1.61svn. commit f13663d2bf1b956068f6d290284b3c38372a291a Author: John Bowman Date: Mon Jan 26 22:01:00 2009 -0600 Fix surface condition type. commit ac29281656284dd3687db1f6a93b82bae89ec239 Author: John Bowman Date: Mon Jan 26 18:58:00 2009 -0600 Simplify notation. commit 3b01508d946b86c3692173d844b7a9941f47880a Author: John Bowman Date: Mon Jan 26 18:12:17 2009 -0600 Remove diagnostics. commit 4520d29d9414c0dcaf479193c28f48e31184c943 Author: John Bowman Date: Mon Jan 26 18:11:23 2009 -0600 Improved marker alignment. commit faaefc8bccd2ecd01b0e9f0b3e8d4a63f5f512a0 Author: John Bowman Date: Mon Jan 26 17:48:24 2009 -0600 Force a new guide after omitting points in conditional graphs; avoid spurious empty guides. commit caa1af28ceab79157c53a0c758accdd595ee30f4 Author: John Bowman Date: Mon Jan 26 17:00:49 2009 -0600 Improve axis label. commit 101ee3595eeefb53f2ecd6a117019d03ae9db5a9 Author: John Bowman Date: Mon Jan 26 16:59:40 2009 -0600 Simplify example. commit 4c8f0feb77e877116952cba3e86c2afb3a654584 Author: John Bowman Date: Mon Jan 26 16:56:55 2009 -0600 Add floor example. commit 758a700ec3a46e5382e4d95560ec6fdccedd1280 Author: John Bowman Date: Mon Jan 26 13:54:20 2009 -0600 Fix read from pipe failed error under MSDOS. commit 7a24e4671880b20b56e03feb491fb3ce779cd1ad Author: John Bowman Date: Mon Jan 26 00:18:19 2009 -0600 Allow xasy to be run from a write-protected directory under UNIX again by implementing broken (8.3) format tempdir workaround only for MSWindows. commit 5ff176eebba9c7cf103a0aa37f70bf45d8af81ad Author: John Bowman Date: Sun Jan 25 09:58:27 2009 -0600 Catch out of memory errors. commit ecbd15211297bf751e7b42745d6f5b6de475c661 Author: John Bowman Date: Sat Jan 24 22:05:45 2009 -0600 Remove LocalWords from FAQ. commit 2eae4b4154364c1ae70a80a43fedd36f5efa40e5 Author: John Bowman Date: Sat Jan 24 18:46:47 2009 -0600 Recommend svn version of freeglut only for UNIX systems with graphics cards that support multisampling. commit 8b2834aa4ba6d98806f5a723e801d17b0fcc4865 Author: John Bowman Date: Sat Jan 24 18:29:36 2009 -0600 Catch unhandled exception when exporting to write-protected directory. commit 9e307c6e5c7b27a8e2c7545e9034ab377cc7f990 Author: John Bowman Date: Sat Jan 24 16:21:27 2009 -0600 Modify yum instructions for obtaining most recent version of Asymptote. commit 52669b851dcf713cc2f117f1ecdfd674b0c062f0 Author: John Bowman Date: Sat Jan 24 15:57:49 2009 -0600 Use default for bool3 initializer. Change condition array for graphs to bool3[]. Add more bool3 support functions. Reformat base files. commit 50b00f2ce388f9a963744b8110b20fd71debd1e0 Author: John Bowman Date: Sat Jan 24 13:34:04 2009 -0600 Work around inability of movie15.sty package to handle spaces in filenames. commit 23298930e7cdbeee504ef3adb2f06dabd0a52e53 Author: John Bowman Date: Sat Jan 24 12:07:14 2009 -0600 Add gettriple routine. commit 1ee716c8a7303a7e2d2c06ce171948121511b96c Author: John Bowman Date: Sat Jan 24 12:04:57 2009 -0600 Don't regenerate asy-keywords.el with make install-asy. commit 8e884245f07062d284c0248b436fa362567d640a Author: John Bowman Date: Sat Jan 24 11:30:30 2009 -0600 Emphasize that settings.outformat="pdf" must be set before three.asy (or graph3.asy) is imported. commit d8fdc5bc766f7f73cd5c8353be662caaea1504c6 Author: John Bowman Date: Sat Jan 24 11:05:21 2009 -0600 Document and standardize usage of bool3 type. commit df0dc74326a7f04826e91d13a2faa75e76a1e7d7 Author: John Bowman Date: Fri Jan 23 23:38:32 2009 -0600 Simplify and document graph interface routines. Make cond argument of graph a bool3(real) function, to allow one to distinguish between points that should not be plotted and points belonging to a new branch of the graph. commit 2c817b9ca4fe5f5d83cd881bc176e148b2617e5f Author: John Bowman Date: Thu Jan 22 11:13:15 2009 -0600 Simplify example. commit 18db9ab6ace1d69723eae0b738f3da438bb6dc7c Author: John Bowman Date: Thu Jan 22 11:06:32 2009 -0600 Improve branch test. commit 468ba41e50b90e332cd0ee5ac9d854e582996456 Author: John Bowman Date: Thu Jan 22 00:00:55 2009 -0600 Make graph routines return a guide[]. Add casts from guide and path arrays of length 1 to guides and paths, respectively. Add 1/x disconnected graph example. commit 1614388547aaeaba32fb73f2a48ba37314f47a31 Author: John Bowman Date: Wed Jan 21 22:31:18 2009 -0600 Avoid warning message. commit 0c249ad98ae12767a82245b312ae20d80cdc0f51 Author: John Bowman Date: Wed Jan 21 22:24:26 2009 -0600 Use cmyk function. commit 67c42e5be801b4b9c41f39a6aae1942afe2887ac Author: John Bowman Date: Wed Jan 21 22:22:08 2009 -0600 Fix default condition arguments. commit 8ed9d79ad3fc64010518c71afcf44c099e7479fe Author: John Bowman Date: Wed Jan 21 20:26:12 2009 -0600 Remove obsolete +cmyk construct. commit 1456301b60008d69b16d81d27e3bbb12cd1fcd76 Author: John Bowman Date: Wed Jan 21 18:33:26 2009 -0600 Improve stack overflow diagnostics. commit 3aea38afad9ce32a7c69fcc7b7071f3717abdd0e Author: John Bowman Date: Wed Jan 21 13:42:46 2009 -0600 In interp, first promote pens to the same colorspace. commit 5f7181d05ce0428db888ab025b1428e7e6b625a0 Author: John Bowman Date: Tue Jan 20 01:06:34 2009 -0600 Add optional bool cond(real)=null to 2D and 3D graph routines for functions. commit 92218def6d5a2441e8dea3616ac38c8ec1d57ef4 Author: John Bowman Date: Mon Jan 19 01:08:52 2009 -0600 Increment version to 1.60svn. commit f236aa4d54edf39380f4728a05a48da895a22a76 Author: John Bowman Date: Sun Jan 18 23:40:04 2009 -0600 Clean up aux files. Fix aux conflicts in slide.asy. commit 9c29f49996676b34d6e03f172d507d87fb5db1de Author: John Bowman Date: Sun Jan 18 23:05:29 2009 -0600 Unlink texput files from proper directory. Remove any old texput.aux file before creating TeX pipe. commit bb5215873b3c7bd55202b36a00734ee916ee311c Author: John Bowman Date: Sun Jan 18 22:20:57 2009 -0600 Fix defaultfilename in asy(string). commit 1c0a03c7affcd5c71ec3b8f972852af0366ecfc8 Author: John Bowman Date: Sun Jan 18 16:59:34 2009 -0600 Handle nonintersecting paths. commit 001a95cb112128ee6dc26fc6d26a18318a03f85f Author: John Bowman Date: Sun Jan 18 15:54:15 2009 -0600 Add missing final long_opt entry. commit ca6b80ba33c0921714cdc7c8f78b9660f0dfbaea Author: John Bowman Date: Sun Jan 18 13:59:10 2009 -0600 Fix mixed export/View rendering. Wait for pid to finish with -nothreads. commit f03e2bda783aec28a216674f59c5fb08924105c9 Author: John Bowman Date: Sat Jan 17 13:33:51 2009 -0600 Simplify example. commit aaf6df33fa78329e2a12156923c7f59e89a3cde1 Author: John Bowman Date: Sat Jan 17 12:39:15 2009 -0600 Fix plain tex font scaling. commit 86fe7241b7e8f15fa23cc3e0fc0a3027569fa246 Author: John Bowman Date: Tue Jan 13 09:25:51 2009 -0600 Fix typo in manual. commit b71578ce10460a1795aafbc2de6f22f8c9811dd8 Author: John Bowman Date: Tue Jan 13 09:23:56 2009 -0600 Transform margin paths. commit 0b4d1a83478d15f4e7c4c63573d67c3e4751b181 Author: John Bowman Date: Tue Jan 13 09:14:11 2009 -0600 Add missing filltype option for projected 2D arrowheads. commit 059133273986ee197b1a0e05200931e238e7ae6b Author: John Bowman Date: Mon Jan 12 01:49:48 2009 -0600 Clean up html files. commit c56d94c948042b03849953a5ca5b6105e018c87a Author: John Bowman Date: Mon Jan 12 01:48:36 2009 -0600 Generate html files into doc/png. commit 99ce03a0fe5ee871ce058451fe4ec6382bde51d3 Author: John Bowman Date: Mon Jan 12 01:09:38 2009 -0600 Set "Start in" directory for xasy to %USERPROFILE%. commit d32ba1c815176d6686059f51080721fce2bc2671 Author: John Bowman Date: Mon Jan 12 01:02:03 2009 -0600 Increment version to 1.59svn. commit cc304c7d54383cfe52410c0bbdd998086b90eab2 Author: John Bowman Date: Sun Jan 11 23:38:42 2009 -0600 Draw 2D arrowheads when projecting to 2D. commit 516aae17ec5c5ee067e2131bc092431c5042cba9 Author: John Bowman Date: Sun Jan 11 19:06:17 2009 -0600 Cache asy.list. commit c383fdf7bae0d30006a8e825fc1ef7430360e16f Author: John Bowman Date: Sun Jan 11 18:55:54 2009 -0600 Fix include order. commit 5ce54e657c3ff5da1fc6b49cf1722eb009c7f041 Author: John Bowman Date: Sun Jan 11 18:30:14 2009 -0600 Work around incompatibility of latex with DOS directory names. commit 048dccd54fc396f3714ad0f64909dde004d3e56e Author: John Bowman Date: Sun Jan 11 14:00:17 2009 -0600 Port to latest version of CYGWIN glut.h header file. commit 1802826d41afa5ef171a198d120dc36f34119a17 Author: John Bowman Date: Sun Jan 11 11:14:54 2009 -0600 Disable PRC for silhouette examples. commit 747bf389a75a1b072c2a586205da071974137f51 Author: John Bowman Date: Sun Jan 11 11:03:18 2009 -0600 Remove temporary asyinclude file. commit ffff57d132fa5ad68244c301c6a254a01eab29cf Author: John Bowman Date: Sun Jan 11 09:42:47 2009 -0600 Draw a central transverse slice when m=1. Simplify spheresilhouette example. commit 5c7374c594922feab7918007c64934683c727288 Author: John Bowman Date: Sun Jan 11 00:11:57 2009 -0600 Increase example size. commit 6861fffd47dfec4a14b861584a4f5cef5cde1cf3 Author: John Bowman Date: Sun Jan 11 00:09:42 2009 -0600 Add silhouette examples. commit 0047253a56043d6719589ce072cf3096974fdb36 Author: John Bowman Date: Sat Jan 10 19:06:20 2009 -0600 Fix silhouette routine. commit 002ae3d953e36891bec8823e9808ebf120b061aa Author: John Bowman Date: Sat Jan 10 17:08:00 2009 -0600 Fix magnitude of pair axes label alignments. commit 563e3aac0e32cc00f8dc174d74f89078df2d3587 Author: John Bowman Date: Sat Jan 10 12:32:02 2009 -0600 Remove broken axis label alignment adjustment code. commit f0ea749693a65015ada26d0ea5e0b63a29dd65d1 Author: John Bowman Date: Fri Jan 9 23:43:57 2009 -0600 Address nullpath issues. commit 8748b682068b7f19ef11fbcb4fd59777a7e0e4bd Author: John Bowman Date: Thu Jan 8 23:31:58 2009 -0600 Indicate real values with red. commit 17082621236c24715f37e1388468a1c79226bb16 Author: John Bowman Date: Thu Jan 8 23:00:07 2009 -0600 Add Wheel palette and example of complex Gamma function. commit ac4ecce121491bde69d145c85905e7b027f1ec63 Author: John Bowman Date: Thu Jan 8 01:14:48 2009 -0600 Fix conflict with breqn package. commit 6f3303e24634254458f68f64e19b5defe29c5537 Author: John Bowman Date: Tue Jan 6 23:02:00 2009 -0600 Implement ArcArrow3, etc. commit 1ee69c6f1852ff257e5355fdf99bf5d1f12ae4ca Author: John Bowman Date: Mon Jan 5 23:09:35 2009 -0600 Fix interp(pen,pen,real) by reverting to standard pen addition. Fix cmyk(rgb(black)). commit ed6391bbf8700ec50b151f140f52b6c8a0176a59 Author: Andy Hammerlindl Date: Sun Jan 4 14:47:12 2009 -0600 Report errors of arguments in illegal function call. commit c8b92ebe85b4982c8651fe90ba103e08041ab3b0 Author: John Bowman Date: Thu Jan 1 12:34:19 2009 -0600 Add missing file. commit 033502b10640b65185b78cc1e66d54a8562f230e Author: Andy Hammerlindl Date: Wed Dec 31 22:44:59 2008 -0600 Added support for open function signatures. commit 5e34a64ae2238eea776cafb0ec404ea91cb2f67c Author: John Bowman Date: Wed Dec 31 17:29:27 2008 -0600 Exit interactive mode on EOF, unless exitonEOF=false. commit a010f63aeeec0dc8fccf7ae6e885304ba4ae25bf Author: John Bowman Date: Wed Dec 31 16:10:39 2008 -0600 Add copy constructor TODO entry. commit e24c735878e98185646dd22b5404dd142befa5db Author: John Bowman Date: Wed Dec 31 11:01:44 2008 -0600 Add example of factoring out an axis scaling. commit 9e4ba2ebf3374ddaa133355da4ab660a5ca52ee1 Author: John Bowman Date: Wed Dec 31 10:32:10 2008 -0600 Change VERSION from a function to a constant. commit d31f008822443a6438ed7db1913a271629c54b3f Author: John Bowman Date: Wed Dec 31 09:19:16 2008 -0600 Allow compilation without HAVE_LIBGLUT. commit 8d8b497afe39a27026af173f1147fa6704def4d1 Author: John Bowman Date: Tue Dec 30 23:19:29 2008 -0600 Clean up texput files. commit 112eb1d8a921e53d67839aa574eb7d0c27282f98 Author: John Bowman Date: Tue Dec 30 23:10:19 2008 -0600 Revert previous pen changes; make operator + on grayscale pens a maximum operator. commit 93bd6e0aaa83534744a3e5a60f3997afcf67278d Author: John Bowman Date: Tue Dec 30 17:46:26 2008 -0600 Add missing file. commit df1440968b940455e6e8266ae0a6fc963f0e5089 Author: John Bowman Date: Tue Dec 30 17:43:13 2008 -0600 Add dependency. commit 25f258f4c94edebbf063c871a78494b5dea5bf83 Author: John Bowman Date: Tue Dec 30 17:31:36 2008 -0600 Fix pen addition involving colorless pens. commit e811594daaf4cd72706fb3b4989ccbcc9f06bac0 Author: John Bowman Date: Tue Dec 30 17:13:45 2008 -0600 Build png images for manual in a separate directory so that they don't take precedence over pdf files. Center images in manual. Update modified dvipdf. commit c33928376291116ee0b3d27971432a27ffae8a2e Author: John Bowman Date: Tue Dec 30 09:37:34 2008 -0600 Make pen arithmetic consistent across colorspaces. commit 2b16cde3092731214c2734c132375b3400c69b4c Author: John Bowman Date: Fri Dec 26 15:29:53 2008 -0600 Fix error message. commit a7e96860e96b83d42b7f0abe9f1a61c59761a640 Author: John Bowman Date: Sun Dec 14 22:07:10 2008 -0600 Improve tick adjustment. commit f48785900c46a4f7f73f0e5bd38bf18b3c9e4294 Author: John Bowman Date: Sun Dec 14 01:17:54 2008 -0600 Increment version to 1.58svn. commit 69b9c3a90fc92df531cd5b0f0efc821d95e2b376 Author: John Bowman Date: Sun Dec 14 00:53:35 2008 -0600 Use asy.bat instead of asy.exe in MSWindows start menu link. commit a15d3d019d82e1e734ee6961a6adb4a8079f0524 Author: John Bowman Date: Sun Dec 14 00:01:18 2008 -0600 Resolve ambiguity. commit 414f39ea34aa3d2b59bbc69118085f7720c0b03e Author: John Bowman Date: Sat Dec 13 23:50:31 2008 -0600 Fix picture sizing with beginclip/endclip. commit 7acff952eac90aae634e9e341c88e17b53140d78 Author: John Bowman Date: Sat Dec 13 23:12:21 2008 -0600 Add beginclip(picture) and endclip(picture) functions. commit 51c65ed4fc2dfc8890e5e3230975c5da31581f9c Author: John Bowman Date: Sat Dec 13 22:55:58 2008 -0600 Allow clipping across page boundaries. commit 51fa23a6c1f5a1ce9a14ab0fe7021c95a0af45c7 Author: John Bowman Date: Sat Dec 13 13:04:41 2008 -0600 Simplify example. commit 5d68758dec150b173b861bed935b9b007cfda2d3 Author: John Bowman Date: Sat Dec 13 13:02:09 2008 -0600 Add example of aligned objects and envelopes. commit 181fb85c90758a5ba14b73fefbf4fd349e317213 Author: John Bowman Date: Sat Dec 13 13:00:20 2008 -0600 Add object(Label, envelope, ...) constructor. Support object transformation and alignment. commit 89516fc6a26ca4b4ae205810e780d10a66336180 Author: John Bowman Date: Fri Dec 12 22:31:00 2008 -0600 Fix plain tex font size. commit f42c1047ba0cc6b48252e071f52acc33eb6774d7 Author: John Bowman Date: Thu Dec 11 23:19:17 2008 -0600 Improve axis coverage calculation. commit 2a95e16eedfe2f3efff147d5619df51607573b4c Author: John Bowman Date: Wed Dec 10 11:02:14 2008 -0600 Simplify font(string name, real size). commit 354e080d458273533b809bc143d22783f6d9ec3c Author: Andy Hammerlindl Date: Wed Dec 10 10:43:09 2008 -0600 Handle empty history in get/setLastHistoryLine. commit 40d2017d22e98ceee80e5cfbbaa81974fcd8e565 Author: John Bowman Date: Tue Dec 9 03:06:46 2008 -0600 Use defaultfilename in asy(string). commit 45f64bb4bac96f96bae81a74362ab81604911d27 Author: John Bowman Date: Tue Dec 9 02:19:06 2008 -0600 All temporary files are now generated in the directory specified by the -outname command-line option. Make outname a read-only setting. Check if the output directory is writeable. commit f99d9edfe6982095376094b01117fe0a6761bb2a Author: John Bowman Date: Mon Dec 8 21:44:52 2008 -0600 Add diagnostic. commit ecf8129b3978ab5589eb1568bbc471df0c4d6554 Author: John Bowman Date: Mon Dec 8 21:44:17 2008 -0600 Make default MSDOS "start-in" directory %USERPROFILE%. commit 0dffc47a3e72fb3d33d1e4da8ae69135f0143bce Author: John Bowman Date: Mon Dec 8 21:43:28 2008 -0600 Fix diagnostic. commit 8b84cbd701e587bcb0cfda2323cb323b04df5140 Author: John Bowman Date: Mon Dec 8 20:47:47 2008 -0600 Add optional basesize parameter to font. commit bac13dc46d28516dd12bfa067566322a6ae4e65e Author: John Bowman Date: Mon Dec 8 18:15:06 2008 -0600 Fix pdflatex texengine; abandon xelatex support since xelatex does not support pdf specials anyway. commit 9d79a394539ff8bf6044e14878851a2792cda419 Author: Orest Shardt Date: Mon Dec 8 16:44:46 2008 -0600 Handle failure to lauch external editor cleanly. commit c3d171565ecb5af926d0db6922394821928d78ea Author: John Bowman Date: Sun Dec 7 14:57:02 2008 -0600 Update link. commit 28ceef2c78e55bb3a89b3b19dd6c5224583468d0 Author: John Bowman Date: Sat Dec 6 23:28:51 2008 -0600 Update documentation of xasy installation. commit 34260991dd4b8712ccb7393c17762440d15ed9a1 Author: John Bowman Date: Fri Dec 5 22:46:08 2008 -0600 Increment version to 1.57svn. commit 9f29de60f80817e9471bdf3c80889b324d5e339b Author: John Bowman Date: Fri Dec 5 19:33:56 2008 -0600 Fix documentation of grid3. commit af5bb7c379246be9b734d152addfaeca6623b729 Author: John Bowman Date: Fri Dec 5 19:24:27 2008 -0600 Add examples of using grid3 with scale(true). commit 805c95c531aeabdd1749e53c00b943b448bffc8e Author: John Bowman Date: Fri Dec 5 19:24:04 2008 -0600 Fix bounding box bug by clearing \ASYbox dimensions for latex as well as for pdflatex. commit aae84baab6437781971ab08cf395156f2d749f9b Author: John Bowman Date: Fri Dec 5 19:21:06 2008 -0600 Round font scaling to the nearest integer. commit 60a22d13ecea048aa51b9abcba6d80a859db3d4f Author: John Bowman Date: Fri Dec 5 11:27:49 2008 -0600 Add asyinclude function for including 3D PRC graphs in slides. Update grid3 documentation. commit 5b0bc1727b53df6b08e724866a8e9a24f5bbc3fb Author: Philippe Ivaldi Date: Fri Dec 5 03:45:16 2008 -0600 Fix version commit 369a2bc503053e27eafa9d368a80c7f2b17d00e1 Author: Philippe Ivaldi Date: Fri Dec 5 03:36:20 2008 -0600 Fix handling the environment asydef within lasy-mode. commit 3a808696c835bfa983096a26d35fd927b146a3ad Author: John Bowman Date: Thu Dec 4 10:26:58 2008 -0600 Fix shipout(wait=true). commit 89505a37e705405424566f8d6015ee77db0ae55e Author: John Bowman Date: Tue Dec 2 04:24:02 2008 -0600 Increment version to 1.56svn. commit 9354191a7fa1fa719121f331264c931afae0a544 Author: John Bowman Date: Tue Dec 2 01:15:16 2008 -0600 Remove obsolete field of view factor. commit ba00ab847d6f56929a55ca0d87b7c770e8511973 Author: John Bowman Date: Tue Dec 2 01:03:58 2008 -0600 Add user=true argument to 3D point(picture) and size3(picture) routines; add truepoint routine. Add triple invert(pair z, projection P=currentprojection) routine that inverts a pair z onto the projection plane. commit d40482868635407bc38cd7ef6c1c5d49ed2ce38a Author: John Bowman Date: Tue Dec 2 00:41:41 2008 -0600 Fix more guide to path problems. Update guide tests. commit 4aab933ee9204bd7b3436f8db5c402f4e5ba42fa Author: John Bowman Date: Mon Dec 1 12:47:38 2008 -0600 Fix drawing of paths of length 0. commit 97cfcb1a33c55b34161cc2a4896c63fa7edd757d Author: John Bowman Date: Sun Nov 30 21:00:12 2008 -0600 Increment version to 1.55svn. commit f6246129093e76b83e1d69827d44e89aa5f0e56b Author: John Bowman Date: Sun Nov 30 18:19:15 2008 -0600 Document need to remove latexusage_.pre along with latexusage-* and latexusage.aux when switching between latex and pdflatex usage. commit f3be75761c0c5c38bd057278606e433d9292abaa Author: John Bowman Date: Sun Nov 30 17:42:36 2008 -0600 Fix final specifiers in guide examination routines and reverse(guide). Fix reverse(guide3). Control points should trump direction specifiers. commit e1b7c0f1647b7a0036e3d7ea7f58c67ef627599f Author: John Bowman Date: Sun Nov 30 15:07:10 2008 -0600 Add threads setting (default is true except under MSDOS). commit 37c74f79c4c1459f670c509126c10d66b076f8af Author: John Bowman Date: Sun Nov 30 01:17:47 2008 -0600 Fix curved cyclic paths of size 1. commit 7aae1e50d141c77004a71d09b2f8789951c7b558 Author: John Bowman Date: Sun Nov 30 00:46:09 2008 -0600 Add time argument to curlSpecifier to allow access to all curl specifiers. Fix reverse(guide). Add reverse(guide3). commit fd2cd01f27ec1fc5d395524afc805556681de6d5 Author: John Bowman Date: Sat Nov 29 12:51:20 2008 -0600 Fix multiple file batch mode under MSWindows: only query the MSWindows registry once. commit fa4ce6f5ed2cda23b745505ba8da83cbf19a3b03 Author: John Bowman Date: Sat Nov 29 12:50:09 2008 -0600 Fix compilation without HAVE_LIBPTHREAD. Call HideWindow under MSWindows when View=false. commit 0683943b11b4c0aa9b64c9db5f84b16b730c1f5e Author: John Bowman Date: Fri Nov 28 00:51:31 2008 -0600 Respect 3D Label filltype when render=0. commit 61780ff0823f211a56f75df624376eea1aad1b49 Author: John Bowman Date: Thu Nov 27 16:08:09 2008 -0600 Clarify that the native glut library is used instead of freeglut under MacOSX. commit 4b0b143f3f74af43c1dc119e565932382a8e7ba7 Author: John Bowman Date: Thu Nov 27 13:49:29 2008 -0600 Increment version to 1.54svn. commit a19f7125b6a2f9545b2c8d7684efb7c15abd8f9a Author: John Bowman Date: Thu Nov 27 12:39:54 2008 -0600 Set environment variable CYGWIN=nodosfilewarning if it is undefined or empty. Note: this doesn't get uninstalled since it is the "right" default anyway. Rename asy-console.bat to asy.bat. commit b592f16ae13af694ce16a8cbebfde4a8a23e79eb Author: John Bowman Date: Thu Nov 27 01:14:49 2008 -0600 Force CFLAGS="-g -O3" default again. commit fd2a0d22e825647c7405941bd9263473eef2b692 Author: John Bowman Date: Thu Nov 27 01:01:41 2008 -0600 Output diagnostics only if verbose > 1. commit eee37b6bcc222486d7be5e51f23035d48594588f Author: John Bowman Date: Thu Nov 27 00:58:03 2008 -0600 Add minblockwidth, minblockheight, and mincirclediameter parameters. Change Horizontal and Vertical to a nonboolean type flowdir. commit 3e9a71cdaa387f5d0ecdf0f36c41772b6865bc3a Author: John Bowman Date: Wed Nov 26 23:31:46 2008 -0600 Fix PRC projection sizing when up != Z. commit 950302f8a2a4d01d5043a0e9bed644e006b0ca0d Author: John Bowman Date: Wed Nov 26 22:15:36 2008 -0600 Add missing wait. Fix aspect ratio in interactive mode. commit 6b36a704765f6c88d80e3c6232330a8755e9f1d0 Author: John Bowman Date: Wed Nov 26 20:33:53 2008 -0600 Fix rendering logic. commit 3c8a346ab315a8aa57af642ad36788832a441ce5 Author: John Bowman Date: Wed Nov 26 15:46:04 2008 -0600 Minor optimizations. commit 86cea1a75de520b35f6eaf1bc8c8ce0f7c1eb668 Author: John Bowman Date: Wed Nov 26 00:26:30 2008 -0600 Change cyclic flag in the routine where the array is actually constructed. Make minor edits to tube documentation. commit b6f0403bc6809f96add2af2fdfda140a13ebe8a9 Author: John Bowman Date: Tue Nov 25 23:27:21 2008 -0600 Enable the toolbar by default within the asyattach environment. commit 70c5bdd9e6711620c1fb16d4c8553db42c1ffc55 Author: John Bowman Date: Tue Nov 25 22:13:39 2008 -0600 Set CYGWIN=nodosfilewarning in asy rather than in a batch file. commit 4210144b34da47dbe8faa22136d14aef5e5d574d Author: John Bowman Date: Tue Nov 25 22:12:13 2008 -0600 Don't hang on exit from "Cannot execute latex" error. commit 01972838df01c726b045fcc30d4419c102cf928e Author: Philippe Ivaldi Date: Tue Nov 25 17:02:34 2008 -0600 Replace step to relstep in tube.asy, add example of tube, document the package tube.asy commit cda1746f22599bfc912392c9bda0ed9a7f6a5b54 Author: John Bowman Date: Tue Nov 25 15:20:36 2008 -0600 Distinguish between defaulttransform and defaulttransform3, so that label(scale(10)*"text",O) is projected onto the initial viewing plane. commit d19c0bec2c319d5c6f435419788f8ea94980c1da Author: John Bowman Date: Tue Nov 25 14:44:44 2008 -0600 Simplify freeglut svn-761 installation instructions. commit 07819114b9060175fde5b0414222d525a340577b Author: John Bowman Date: Tue Nov 25 13:16:48 2008 -0600 Catch out-of-memory errors in OpenGL renderer. commit e3c10fc46b23f259921c3d4a169e953e3521f6be Author: John Bowman Date: Tue Nov 25 10:09:56 2008 -0600 Disable DOS path syntax warning in version 20080327 of cygwin.dll (which supports pthreads). commit 6f7d32223b5ec3dcbcb75ae20fc358f9e265af5f Author: John Bowman Date: Tue Nov 25 05:06:31 2008 -0600 Increment version to 1.53svn commit 2826efca8dc76e59d4ba70192dce69c84668ed9a Author: John Bowman Date: Tue Nov 25 01:02:46 2008 -0600 Use _exit instead of exit after fork as recommended by man page. Remove remaining piece of old fork wrapper code. commit 35877ed7f1df1410f78ae2fc19dc79fc76449905 Author: John Bowman Date: Tue Nov 25 00:09:26 2008 -0600 Make antialias an integer parameter (default 2). Values bigger than 2 are currently respected only when converting from EPS or PDF formats. commit b6cda52e4df8063b5c0bb12ff3bab9c0850a2626 Author: John Bowman Date: Mon Nov 24 23:30:57 2008 -0600 Don't call fitscreen() during interactive updates. Simplify forking in pipestream.h. commit 4019ae275efaea77130d93ae82568def5a5111c3 Author: John Bowman Date: Mon Nov 24 03:16:55 2008 -0600 Fix multiple file aspect ratio issues. commit 3ccc70e985a7b42a992e89a27e0ef2f71f6e53a2 Author: John Bowman Date: Mon Nov 24 02:57:28 2008 -0600 Fix exporting with -noV. Support machines without working POSIX threads. commit fcad51ead250de2f47b067407fb8829d2932475f Author: John Bowman Date: Sun Nov 23 18:19:34 2008 -0600 Define standard symbol WORDS_BIG_ENDIAN or WORDS_LITTLE_ENDIAN, as appropriate. Add Orest's patch to support PRC output on bigendian machines. commit 2aec609cefdfe288e01d02a76f2fc1ff77fa9151 Author: John Bowman Date: Sun Nov 23 16:47:28 2008 -0600 Use gl::wait routine for thread synchronization. commit 61dbf2a011d73ef468358542909fe2fbde7aa3a1 Author: John Bowman Date: Sun Nov 23 03:00:14 2008 -0600 Support compilation again on systems without glut. commit 4a8226975e5845b0c75b1339f935ec7bec604971 Author: John Bowman Date: Sun Nov 23 01:53:41 2008 -0600 Conditionally include config.h. commit 1665f78ca7e201cc4172435aa6ca2e2c9da9cd05 Author: John Bowman Date: Sun Nov 23 01:53:05 2008 -0600 Rename BIG_ENDIAN to IS_BIG_ENDIAN. commit 4f1141861f7f15050d94baf847f43915c0c7ac0c Author: John Bowman Date: Sun Nov 23 01:43:57 2008 -0600 Add preliminary support for bigendian machines (PRC output is not yet working though). commit 1a589effdc9db55543060fe489c4ef38f1f20fcd Author: John Bowman Date: Sun Nov 23 01:12:57 2008 -0600 Use the main thread for OpenGL rendering to make MacOS happy; run asy in a secondary thread. commit 95f09626b1c294ff4c0d0f480c66e49cc6192965 Author: John Bowman Date: Sat Nov 22 13:29:20 2008 -0600 Add assert. commit 62607706159b5e583cdb034e58229ae7719bce0b Author: John Bowman Date: Sat Nov 22 12:03:14 2008 -0600 Update SVN instructions to not require SSL support. commit d0dc7b89f83820cb783d6aa454904af338da5dc0 Author: John Bowman Date: Sat Nov 22 12:00:27 2008 -0600 Fix bus error. commit 0ae0ab31d39f9c989f9b1cf160f3b5cef1790c44 Author: Philippe Ivaldi Date: Fri Nov 21 17:13:24 2008 -0600 Fix calculation of angle. commit aed1181edf6d26e924fc394baa139ed0f6766244 Author: Philippe Ivaldi Date: Fri Nov 21 08:29:02 2008 -0600 asy-mode.el: define asy keywords properly. commit eaf21ba2f2de354718ea9e460cf79fb0f80bbe0a Author: John Bowman Date: Fri Nov 21 01:55:51 2008 -0600 Add Philippe's tube module. commit f8dda08ef26195f1c9fda68460c0610313b5eaa6 Author: John Bowman Date: Fri Nov 21 01:20:14 2008 -0600 Improve thread synchronization and diagonistics. Remove freeglut-2.4.0-svn759.patch in favour of fixed svn 761. commit a1619e9d4754fd750dc18d26c3d7c05cb6cdc2f3 Author: John Bowman Date: Thu Nov 20 02:40:24 2008 -0600 Implement robust thread locking. Update installation instructions to use the system GC by default, now that we require a multithreaded version. commit cb8a4dfda6950bd6580bf7d8d679dcbf4af767d3 Author: John Bowman Date: Wed Nov 19 19:59:56 2008 -0600 Revert most of 1.52-22 due to a reported segmentation fault and since glutGetModeValues isn't implemented for MSWindows anyway. commit 3903344a1ccb4e74db0f0e30d2b434738dbbe105 Author: John Bowman Date: Wed Nov 19 17:35:07 2008 -0600 Revert 1.52-21. commit 9770f5a89b126bbe256245d3282d186547e35433 Author: John Bowman Date: Wed Nov 19 10:12:32 2008 -0600 Add television test pattern example. commit 41e39c1c8bb087a7bafc400a8175e1eca5a2de8c Author: John Bowman Date: Wed Nov 19 01:19:29 2008 -0600 Simplify multisample negotiation by using glutGetModeValues. Backport code to freeglut-2.4.0. commit 4cbda4d70a31d92544b0a294c881e39a77753f4b Author: John Bowman Date: Wed Nov 19 00:20:29 2008 -0600 Hide window again when View=false, even if iconify=false; commit a97fee3070084e12ca4c38b4c196a7d378cc5485 Author: John Bowman Date: Wed Nov 19 00:08:27 2008 -0600 Add bool3 type that takes on one of the values true, false, or default. Add planar argument to surface. commit b691580fe5c1039f503c64abf410e07958b9ef5e Author: John Bowman Date: Tue Nov 18 23:15:37 2008 -0600 Fix vertex shading order in planar case. commit 94e67f10f05c4c03f0bf8749e57b14993f1938dc Author: John Bowman Date: Tue Nov 18 22:43:51 2008 -0600 Avoid POSIX thread deadlock. Fix rpm latex install directory. commit eb5a9628772285778a7ec869455378c0b65db0a2 Author: John Bowman Date: Tue Nov 18 14:46:51 2008 -0600 Work around nonstandardized signature of gluNurbsCallback on various MacOS platforms. commit 62302ae390ff875904680efef03ea8c264933b66 Author: John Bowman Date: Tue Nov 18 11:46:00 2008 -0600 Use POSIX threads instead of fork in OpenGL renderer. Make multisample an integer; if freeglut is used this parameter controls the multisampling width for screen images. commit a1a69888cbf8616b5d50b8c17286c929b08b59a4 Author: John Bowman Date: Tue Nov 18 08:58:27 2008 -0600 Remove obsolete patch. commit 1bbf033f0430294fcbef2c4f9072251a810c2a8e Author: John Bowman Date: Mon Nov 17 13:12:46 2008 -0600 Install asymptote.sty and asycolors.sty in $TEXMFLOCAL/tex/latex. commit b68290520bd99f33046fe48de39bd63797a2e339 Author: John Bowman Date: Sun Nov 16 18:08:46 2008 -0600 Fix indentation after struct. commit f4598c25e85557a11adda85150e3165fe10b6464 Author: John Bowman Date: Sun Nov 16 17:36:38 2008 -0600 Remove dependency on cc-mode.el source. Allow asy-mode.el to load even without asy-keywords.el. commit debfed2b43a8846d5cfa45c6807cc24585485e24 Author: Philippe Ivaldi Date: Sat Nov 15 13:01:48 2008 -0600 fix markangle orientation. commit 178f9004c67cd5c5e0ff09bb95e36bb8396ea10c Author: John Bowman Date: Sat Nov 15 10:28:48 2008 -0600 Add missing sentence. commit 95882c60c7e43c4f50912eb2e7a90e6431d1e97e Author: John Bowman Date: Sat Nov 15 10:14:20 2008 -0600 Add optional user=false argument to min(picture), max(picture), and size(picture). commit 5c776e96d56817d3d9804af5592f17daac509d60 Author: John Bowman Date: Thu Nov 13 02:28:01 2008 -0600 Fix degenerate thick line caps. commit bffba97a1bcc64dc2100fa0ab36c9359a44e7b5d Author: John Bowman Date: Wed Nov 12 17:51:01 2008 -0600 Don't discard 2D size constraints in draw. commit b34d0cad11f9710f33905394b9e74a0dca4c7edd Author: John Bowman Date: Wed Nov 12 14:59:16 2008 -0600 Reinstate freeglut-2.4.0-svn759.patch which to fix multisampling bugs. commit c22422f84f5b69980179324fb09e209f81a10afd Author: John Bowman Date: Tue Nov 11 20:24:50 2008 -0600 Hide window only if iconify is true. commit 21c68e1ee445763474ceb9e79e2d0ced9ece5475 Author: John Bowman Date: Tue Nov 11 17:09:29 2008 -0600 Fix logic in 1.52-3. commit 9141009fd026462c8fd2a8e3dc863efc6877687e Author: John Bowman Date: Tue Nov 11 17:05:01 2008 -0600 Combine both _GLUfuncptr MacOSX workarounds. commit 4654e4193e6662ca07ad7b9e30eba7a75fe9266a Author: John Bowman Date: Tue Nov 11 13:45:14 2008 -0600 Fix _GLUfuncptr detection. commit 1dcf8cd27103dcf0196718b59d5614b6a0de21b9 Author: John Bowman Date: Tue Nov 11 11:42:51 2008 -0600 Support compilation under MacOSX 10.5. commit 991a86171d82c1a6fc61f9eb30dd5bcfd6591dd1 Author: John Bowman Date: Tue Nov 11 04:31:25 2008 -0600 Increment version to 1.52svn. commit e91483639c4758e9710eac68b397da75e907fefb Author: John Bowman Date: Tue Nov 11 03:34:18 2008 -0600 Wait for completion of rendering. commit 11e8fb881b48ae97f6fa5148dbf6f54c7f44b96e Author: John Bowman Date: Tue Nov 11 02:26:45 2008 -0600 Remove obsolete patches. commit a8b3e58351a07e3303ebc11ee3293e2839ab36d8 Author: John Bowman Date: Tue Nov 11 02:25:59 2008 -0600 Use a more robust patch to enable multisampling in freeglut-2.4.0. commit 144be10c4af5e9927aadce7dc83b6223546595ab Author: John Bowman Date: Tue Nov 11 02:03:48 2008 -0600 Fix warning message. commit 05729b9d81a782ecfbc89603b12e56b725cde318 Author: John Bowman Date: Tue Nov 11 02:00:49 2008 -0600 Change references to freeglut to glut. commit eacbd60287f66505a86f1c1fe949c8c47c055606 Author: John Bowman Date: Tue Nov 11 01:57:27 2008 -0600 Improve memory performance and reduce rendering conflicts by always forking; remove last dependence on freeglut. Don't solicit bug reports for segmentation faults caused by graphics driver bugs (e.g. on memory exhaustion). commit 7892f714e5eac1a29733c0788482dff4b1798b1a Author: John Bowman Date: Tue Nov 11 00:53:34 2008 -0600 Prevent multiple glInit calls. Use a separate multisample setting to control screen antialiasing. commit 7429c3c359094d7af8bf556e8b45427870b6d656 Author: John Bowman Date: Mon Nov 10 21:31:57 2008 -0600 Turn multisampling on only when View is true. commit 2152eadef3a913a0ca76545887f7b9c0425526c5 Author: John Bowman Date: Mon Nov 10 21:15:07 2008 -0600 Increment version to 1.51svn. commit d06765ccc2605e7c49b262790d7118ddd3ef586f Author: John Bowman Date: Mon Nov 10 20:06:43 2008 -0600 Add multisampling patch for freeglut-2.4.0 under CYGWIN. commit 0568dc2f66e5318978d08368708267f6d027f324 Author: John Bowman Date: Mon Nov 10 18:39:40 2008 -0600 Update CYGWIN port. commit c002f91cb9345bafae361ec1f317addff487d894 Author: John Bowman Date: Mon Nov 10 00:46:21 2008 -0600 Control multisampling with antialias flag. Add patch to bring freeglut-2.4.0 up to date, with multisampling support. commit ebfd53b97f08f5033991e3f3ef3638f6e31a1c0f Author: John Bowman Date: Sun Nov 9 16:22:45 2008 -0600 Support multisampling; this requires the latest svn version of freeglut. Support -iconic and mouse wheel with the latest svn version of freeglut. commit e884aecf09f6b77ff59327736d59b43901aa3f30 Author: John Bowman Date: Sun Nov 9 11:05:55 2008 -0600 Don't allow tile size to exceed current window size. commit 6996717e07631160568564c746bb4ef5e9cfe14c Author: John Bowman Date: Sun Nov 9 02:02:17 2008 -0600 Set default value of settings.render in asymptote.sty to 4. commit aa7257237a93f790a8609e053590fb0dda01e595 Author: John Bowman Date: Sun Nov 9 02:00:15 2008 -0600 Illustrate the use of viewportmargin in latexusage.tex. Set the default value of settings.render in asymptote.sty to 4. Update documentation. commit 0d091afa43a93ee525d4af643aa4186e27affd1e Author: John Bowman Date: Sun Nov 9 01:21:06 2008 -0600 Add viewportmargin parameter. commit 429feedf2ba8a6580cb749ca0dc0c2abb8117799 Author: John Bowman Date: Sat Nov 8 18:41:51 2008 -0600 Change Makefile.in to remove latexusage-* instead of latexusage_*. Change put=Above to above=true and put=Below to above=false. Remove constants Above and Below. commit 2e1a65d0a6273ce47712b55b68e8d18c75a71350 Author: John Bowman Date: Sat Nov 8 17:37:34 2008 -0600 Add embed option (default true) to allow one to suppress the embedding of a rendered preview image. Support file attachments in asymptote.sty; this is provides a better method for embedding 3D PRC files in a LaTeX document. Add iconify option. commit 7eff5652e202e7c937a000aa5beb0c1b8c2ad580 Author: John Bowman Date: Fri Nov 7 17:49:58 2008 -0600 Set default maxtile to (0,0). commit 1a18bbcbe2b0b7adff2698498ed3871e5e4eff74 Author: John Bowman Date: Fri Nov 7 16:42:12 2008 -0600 Fix camera roll. Fix divide by zero error. commit 9df48c1fd385adcf6cbe3c4d287be3e7c3404282 Author: John Bowman Date: Fri Nov 7 15:06:46 2008 -0600 Fix rendering with -nofitscreen. commit 7ea8229d843fc2026ad6fb259e15479fab09bfa8 Author: John Bowman Date: Fri Nov 7 10:10:11 2008 -0600 Fix PRC up vector. commit 95a5d718046b7a72949cbc64b4759614331910b3 Author: John Bowman Date: Fri Nov 7 07:26:34 2008 -0600 Fix glut.h path under MacOS. commit af473745f283e163f72c9251767f8f06cd731b8c Author: John Bowman Date: Fri Nov 7 07:17:41 2008 -0600 Fix detection of MacOS. commit 1ee53f746794377380a867022367a08568422a21 Author: John Bowman Date: Fri Nov 7 06:59:21 2008 -0600 Improve documentation of add(picture). commit 2849d018b4c33f66f2fd28541c55d1b3f08c12b9 Author: John Bowman Date: Fri Nov 7 00:51:09 2008 -0600 Add glut compilation support for MacOSX. commit 38c16362fd77cdaa325f9ac9f316e1ad46600fd6 Author: John Bowman Date: Thu Nov 6 16:18:18 2008 -0600 Initialize window to the maximum tile dimensions again. commit ffab9fcaa21a0758ce42242e63ad6d6d5ce26bc6 Author: John Bowman Date: Thu Nov 6 16:07:51 2008 -0600 Change default value of maxtile to (800,800). commit 48c91000d1284b74366c1c02db3ab2ccea70961e Author: John Bowman Date: Thu Nov 6 11:59:16 2008 -0600 Recommend glOptions += " -iconic" for UNIX systems that support this. commit a1d87f3d2af798cc89359c24e9f18260b396e4fe Author: John Bowman Date: Thu Nov 6 11:36:15 2008 -0600 Add interface to runtime view() function. Document use of glOptions=-iconic for UNIX systems. commit 1bea8e8b1790afb55c7899bd3a505dd3dcfca22c Author: John Bowman Date: Thu Nov 6 11:05:59 2008 -0600 Support -glOptions=-iconic for drivers that allow this. commit e766302cdd096972819105b96407d73d06b20e5d Author: John Bowman Date: Thu Nov 6 10:27:46 2008 -0600 Avoid rendering problems caused by iconic option. commit 44f693bf85e7a8c25557d2b1e1510617a2c2c72c Author: John Bowman Date: Thu Nov 6 09:17:16 2008 -0600 Change default value of maxtile to (0,0), which now means to use the screen dimensions. commit 02585cec9a5da7f348c2d9f764396d12edb3b4c4 Author: John Bowman Date: Thu Nov 6 08:52:25 2008 -0600 Use opaque value in glClearColor. commit 2016f42fba27487193258ca2f10392d61220f4cf Author: John Bowman Date: Wed Nov 5 23:00:49 2008 -0600 Add PenMargin3 to example. commit 5c1d8867bffeea5d1600ca80c8f4d0d1755e80fe Author: John Bowman Date: Wed Nov 5 18:21:12 2008 -0600 With -noV, initialize the window to maxtile. commit efeee19d9ffd6e65d3dd86d96d49770c76c3adc1 Author: John Bowman Date: Wed Nov 5 01:43:18 2008 -0600 Avoid glDisable(GL_LIGHTING) due to race condition. Improve Margin3. commit ff627450e4c48ea211403be0bcfb3f80f71c3d77 Author: John Bowman Date: Wed Nov 5 00:07:04 2008 -0600 Add support for three-dimensional dimension bars. commit 9516507db876721489f9f91736db9a4e2f38f79d Author: John Bowman Date: Tue Nov 4 23:58:18 2008 -0600 Simplify window initialization code. commit 8f650920cb66b2f5e56b3bb7801a72f2fe5a436d Author: John Bowman Date: Tue Nov 4 16:43:44 2008 -0600 Fix PenMargin3 and DotMargin3. Make dotsize consistent for pictures and frames. Reinstate wedge example. commit 7eb648da6642d894776564de2c9a8bfd9da2c304 Author: John Bowman Date: Tue Nov 4 14:34:48 2008 -0600 Update hyperref documentation. commit e830469751fcfd89cb4395cb891dfb5258f2956b Author: John Bowman Date: Tue Nov 4 12:40:54 2008 -0600 Standardize triple perp(triple); fix numerical precision issue. commit ca8a5b45a2db729d65c2532a2691b490e166a59d Author: John Bowman Date: Tue Nov 4 00:50:49 2008 -0600 Fix more normal problems. commit a8b7919a2d2f9cae4be11aeb4702d4d3893b5709 Author: John Bowman Date: Tue Nov 4 00:17:51 2008 -0600 Use right-handed transformation. commit c3283a0676baa2893490028da3697d674097bf58 Author: John Bowman Date: Mon Nov 3 03:25:16 2008 -0600 Decrement version to 1.50svn. commit 43f9a40080aa0f92d7c0a3f2edf6774e00550a4e Author: John Bowman Date: Mon Nov 3 03:15:44 2008 -0600 Increment version to 1.51svn. commit 7c35f506cafce37ef53d3c9d74873bee14bc0fd5 Author: John Bowman Date: Mon Nov 3 02:12:27 2008 -0600 Make example look better with render=0. commit 71f88287c1f0c9593d7a9cdacd67d0c79ef16915 Author: John Bowman Date: Mon Nov 3 02:10:44 2008 -0600 Fix example; texpath currently only handles standard font sizes. Fix handling of keep flag in texpath and strokepath. commit 98d0bac42932a98ef39ba65e9347e6a7399b9bd6 Author: John Bowman Date: Mon Nov 3 01:43:59 2008 -0600 Improve example. commit a2d5e32a404f9614564f8382edb6e8ea30176aa5 Author: John Bowman Date: Mon Nov 3 01:38:07 2008 -0600 Fix surface normal calculation. Add patch reverse(patch) function. Improve normal(path3); add normal(triple[]) for polygons. commit cd6f6f555e6ebfef4b5c525c47449670db984eaf Author: John Bowman Date: Sun Nov 2 19:52:42 2008 -0600 Add missing transform of normal vector. commit 6da5b5ed0730a5f4f0a06b093672068d0438686c Author: John Bowman Date: Sun Nov 2 14:50:09 2008 -0600 Document glOptions=-indirect. commit a0ec9291b25648bcf541cca112664054ae9bbadf Author: John Bowman Date: Sun Nov 2 11:17:56 2008 -0600 Change mean(pen[]) to take a more useful opacity function. Add opacity argument to mean(pen[][]). commit 4ac8b16285c8d8c0206d12d6113605ed5c2884cb Author: John Bowman Date: Sun Nov 2 10:33:08 2008 -0600 Reinstate cornermean. Make mean(pen[]) return by default an interpolated pen with the minimum opacity of all given pens. commit 1f468a931dac3a0cc2b2e1a377e54ca7db61993c Author: John Bowman Date: Sun Nov 2 01:45:39 2008 -0600 Use vertex shading. commit 0c429c99b1073a8ce6b694c14024318095a52cbb Author: John Bowman Date: Sun Nov 2 01:33:49 2008 -0600 Update examples. commit 6e170c72fad9f673b8bfb63d420768e4ad7f37c2 Author: John Bowman Date: Sun Nov 2 01:20:19 2008 -0600 Fix example. commit 4a56fe6a909bce1e60ee46dc445e9a7791c17b71 Author: John Bowman Date: Sun Nov 2 01:15:59 2008 -0600 Increment version to 1.49svn. commit a219ddb14baff290277499dd68ad88e11a2ab124 Author: John Bowman Date: Sat Nov 1 23:49:11 2008 -0600 Document how to draw surfaces with patch-dependent or vertex-dependent colors. commit a59df140afed1a63cb1218c7ff492b8d38f20821 Author: John Bowman Date: Sat Nov 1 22:44:33 2008 -0600 Remove old fitscreen code. commit 98d281fb1bf0928779ba66773a671d7a45630f24 Author: John Bowman Date: Sat Nov 1 22:24:42 2008 -0600 Document surface tube(path3 g, real width). commit 0bc94259935834b3f758ae12ced619451664a9c9 Author: John Bowman Date: Sat Nov 1 22:15:11 2008 -0600 Fix incorrect precontrol output in write(path) introduced in 1.91-23. commit 01d8cbea25650200b3372a05fed040cc20de158f Author: John Bowman Date: Sat Nov 1 21:54:00 2008 -0600 Account for perspective scaling in planar test. commit 9f18a4df21d708ecc1b853d815f8a0b8b6419c16 Author: Orest Shardt Date: Sat Nov 1 14:52:41 2008 -0600 Use unstraighten() to obtain control points of straight segments. commit a963ce1eebd5c8a7480fe21ae5e62e8a7cdfa376 Author: John Bowman Date: Sat Nov 1 14:13:16 2008 -0600 Implement path unstraighten(path), which returns a copy of the path with the straight flag turned off. commit 39211adfeab65d1efa31067ac2f4b9c7b9baac11 Author: John Bowman Date: Sat Nov 1 13:36:29 2008 -0600 Specify an angle precision for centering perspective drawings. commit df226e66b5169a42195ada8750aa2a565d6c1839 Author: John Bowman Date: Sat Nov 1 11:52:48 2008 -0600 Increase angleiterations to 4. commit d7e1465437bcd26f21aa19eeb26f224c952806fe Author: John Bowman Date: Sat Nov 1 11:35:33 2008 -0600 Allow odd sized tiles again. commit 48f6d409b7ff5ff23f3667b8e28db1639cabb107 Author: John Bowman Date: Sat Nov 1 10:47:26 2008 -0600 Set surface normals whenever light is on. commit 55ec3b5227b1a32d807217dca0787988352af385 Author: John Bowman Date: Sat Nov 1 10:02:28 2008 -0600 Transpose surface.corners() and surface.map(). Use mean corner pen for patch shading. commit 2378aa429188a396191e49b411907f98e366b06c Author: John Bowman Date: Sat Nov 1 08:58:09 2008 -0600 Increase angleiterations. commit d5865412c18a4cb1835ef7235f583d50dce439c0 Author: Philippe Ivaldi Date: Sat Nov 1 03:43:57 2008 -0600 update examples/projectelevation.asy commit c7ff9b62861a294d57b200b05184414acdab857f Author: John Bowman Date: Sat Nov 1 02:29:24 2008 -0600 Rename cornermap to map and cornermean to mapmean. Add triple[][] corner() and triple[] cornermean(). commit 40905d1a35e5d96c4fd48aad8f04ba161da740d2 Author: John Bowman Date: Sat Nov 1 01:39:32 2008 -0600 Support lighting with vertex shading. Fix surface lighting with render=0. Fix normal(path3). Move rgba pen packing and unpacking functions to plain_pens.asy. Implement pen mean(pen[]). commit b2f7f73429c6bb9bcd70124e3c949e737225eb6f Author: John Bowman Date: Fri Oct 31 21:48:25 2008 -0600 Force tile size to be even. commit 096a399768b73f223951d18a554bc99a589e4872 Author: John Bowman Date: Fri Oct 31 17:48:33 2008 -0600 Make maxviewport and maxtile pairs. commit 4c870db4d37abb95ee7501107dcddea637cc21b7 Author: Philippe Ivaldi Date: Fri Oct 31 17:29:36 2008 -0600 asy-mode: warn cc-mode.el dependency. commit 401638c5ae34cc9f46ea916a2601cedf390c2c8d Author: John Bowman Date: Fri Oct 31 17:18:14 2008 -0600 Support compilation under standard glut for systems without freeglut. commit 00366cc59b2e2ed5a0fa03fc3a80581233e41283 Author: John Bowman Date: Fri Oct 31 15:39:00 2008 -0600 Fix fitscreen toggling. commit 424de2df6076c686c8a8d0ee06c18d5572f151f3 Author: John Bowman Date: Fri Oct 31 15:34:07 2008 -0600 Add tilesize parameter to limit the maximum rendering tile size. commit 4deb82228a5bdfc655cb4b79be27298ffd22a6be Author: John Bowman Date: Fri Oct 31 08:48:04 2008 -0600 Revert last change, which breaks tabbing after struct{}. commit cf324b77f8d2a431235e46c1799c2e27fbe1ba2b Author: Philippe Ivaldi Date: Fri Oct 31 07:36:39 2008 -0600 asy-mode: fix cc-mode code source dependency. commit cb1eeb3561d1cfd47c6724bc2d9962319a12ba80 Author: John Bowman Date: Fri Oct 31 01:12:53 2008 -0600 Simplify construction of elevation-colored surfaces. Add facility for vertex-shaded elevation surfaces. commit 913151d6867b93bb76ea24bcdb717a18a1e39483 Author: John Bowman Date: Thu Oct 30 23:42:55 2008 -0600 Fix initialization and translation issues. Remove unneeded CYGWIN restrictions. commit 277cad8a6b3ee0dc3cefc21c5e72b9a3b407e0c3 Author: John Bowman Date: Thu Oct 30 22:04:53 2008 -0600 Fix orthographic exports. commit 06c7940dbfaa3ca0dcbb8220e5bb4db3a38f19ba Author: John Bowman Date: Thu Oct 30 21:48:52 2008 -0600 Use Brian Paul's tr-1.3 package to support high-resolution OpenGL tiled rendering. Add antialias setting (default true). Change convert to use default antialias setting. commit f75488ec21d55232acfcbc86f165b56078a0600b Author: John Bowman Date: Thu Oct 30 21:16:31 2008 -0600 Add roundbox envelope routine. commit 3b430cd073da9000dff6e358dfa15483cac61ab9 Author: John Bowman Date: Wed Oct 29 22:22:06 2008 -0600 Turn on straight flag only for piecewise straight planar paths. Force straight flag for all obj faces to avoid subdivision cracks. Make normal(path3) return immediately for nonplanar paths. commit ea2035f4d10d6ad2d4958f3264060bb6c19f1101 Author: John Bowman Date: Wed Oct 29 19:39:28 2008 -0600 Change signature of point to pair point(picture, pair, bool user=true) to allow a return value in PostScript coordinates. Remove framepoint in favour of truepoint(picture, pair, user=false). commit a9d36f14667ee3f01ded31a1682b056e99b45080 Author: John Bowman Date: Wed Oct 29 17:10:25 2008 -0600 Add maxheight, hstretch, and vstretch parameters to legend. commit 08d8d9d54b14b50cc18e40c6fe0b39175f14c742 Author: John Bowman Date: Wed Oct 29 11:48:12 2008 -0600 Add defaultbackpen. commit 5e73c1c8753fbaa886e8d14740d1fb54c67d0cb3 Author: Philippe Ivaldi Date: Wed Oct 29 03:42:28 2008 -0600 Add TeX versioning commit b295681be3eadad9b41da9cad9f335c555884dac Author: John Bowman Date: Wed Oct 29 01:28:12 2008 -0600 Support transparency in vertex shading. commit addf84f034546239f5a536ea13aa30f473888ece Author: John Bowman Date: Wed Oct 29 00:50:50 2008 -0600 Support vertex shading in OpenGL renderer. commit 30614123cb946a0fe0bd3eb2906dffcd725d11ad Author: John Bowman Date: Tue Oct 28 17:40:42 2008 -0600 Use centroid rather than the first vertex for splitting surfaces. Rename unpack to real[] rgba(pen) and add inverse function pen rgb(real[]). commit 7701a82ac9563b95bfbbdd5b6752cb3e855c7913 Author: John Bowman Date: Tue Oct 28 01:42:51 2008 -0600 Add a more versatile and more efficient surface constructor for convex and "piecewise-convex" three-dimensional paths; the planar(path3) constructor should now only be used for nonconvex paths. Update examples. commit 90aa53c7cc7b38519cdc75657347e4829f39f565 Author: John Bowman Date: Tue Oct 28 00:53:18 2008 -0600 Implement DefaultHead2(filltype filltype=Fill). Add optional filltype argument to HookHead2. Reduce adaptive thick line constant. commit 5aece89072f9c13499c4e5c209d001a91b56a50b Author: Philippe Ivaldi Date: Mon Oct 27 07:32:59 2008 -0600 add size to parametricelevation.asy commit 36da4de5e2b52e0846ed10d3535f46fa1f1f169b Author: Philippe Ivaldi Date: Sun Oct 26 17:53:47 2008 -0600 revert wrong commit of glrender.cc commit 5888260287059b73d61c68c9d2d19c6a1e028321 Author: Philippe Ivaldi Date: Sun Oct 26 17:46:53 2008 -0600 add size to sphericalharmonic.asy. commit 0598c725bca4e3613bd5d96bfe9f92b99636e6a7 Author: John Bowman Date: Sun Oct 26 17:37:14 2008 -0600 Further adaptive thick line improvements. commit b9c7577bf0d9f2b1f464046f91e9bb30f0ca303c Author: John Bowman Date: Sun Oct 26 15:52:26 2008 -0600 Improve thick line adaptive step routine. commit 0d4fa1edfcaf22f6d0682712488343624e19bf72 Author: John Bowman Date: Sun Oct 26 14:35:58 2008 -0600 Increase 3D margins. commit 9461bf3f0b905d2d2580e2993ec3f6ffaacf4f04 Author: John Bowman Date: Sat Oct 25 22:46:42 2008 -0600 Work around Adobe Reader rendering bugs. commit d26a98ae53cfc26724584790f75d48fc5d54ce9b Author: John Bowman Date: Sat Oct 25 21:57:23 2008 -0600 Support 2D alignment of 3D axis labels. Use more efficient size(pic) routine in legend(). commit 99ded514151ae96c2f969eabc726e91cd5d358e2 Author: John Bowman Date: Sat Oct 25 13:01:28 2008 -0600 Resolve ambiguity in draw(surface). Add Gradient palette that varies linearly over a specified range of pens. Add spherical harmonic example. commit aa912c8197993f03628145caa23915a618718145 Author: John Bowman Date: Sat Oct 25 11:16:48 2008 -0600 Standardize argument names of dir and expi. Add parametric surface with elevation-dependent colouring and no light effects. commit 3ef96452b28a2e2ced13a7e3ad7be52754279268 Author: John Bowman Date: Fri Oct 24 08:31:50 2008 -0600 Fix a numerical precision issue. commit aa83d5256ee460261387c3560d00816d86778675 Author: John Bowman Date: Thu Oct 23 02:18:43 2008 -0600 Increment version to 1.48svn. commit 75578118cf5bc705113c1ae240ff3c19e75bcf04 Author: John Bowman Date: Thu Oct 23 00:48:28 2008 -0600 Add another draw routine for surfaces. commit fdc1eed6b5c60f0dafe7722dc5b1846d85a858db Author: John Bowman Date: Thu Oct 23 00:39:14 2008 -0600 Implement a more robust version of normal(path), returning O if the path is nonplanar. Handle nonplanar obj faces. Add triceratops example. commit 65903677e85e923709ecf9a1b57df596d062f73e Author: John Bowman Date: Wed Oct 22 17:40:56 2008 -0600 Re-enable high-resolution rendering. commit 73ab9efcba8340a762e97c1e1c82e9e847931eaf Author: John Bowman Date: Wed Oct 22 16:59:21 2008 -0600 Remove diagnostic. commit aa8cc010d4a318c68e892c49567ce069abc18a30 Author: John Bowman Date: Wed Oct 22 14:52:20 2008 -0600 Fix strokepath(nullpath). commit f40ae1db9ac65ad4b358ca15ddf829a8277a629c Author: John Bowman Date: Wed Oct 22 14:49:43 2008 -0600 Fix strokepath. commit 17a1189c97f29a63fc1dfba82e2fe6305948e04e Author: John Bowman Date: Wed Oct 22 01:55:06 2008 -0600 Bypass bezulate for paths of length 4. commit c0caed7e85641f07acd04c36ef8aeb2989432045 Author: John Bowman Date: Tue Oct 21 21:05:17 2008 -0600 Use unit normal in planar. commit 4b1f6636bef4a86b158e6d6571761b25c7b672e2 Author: John Bowman Date: Tue Oct 21 20:50:31 2008 -0600 Fix cyclic path bugs in write(path) and write(path3) introduced in 1.45-34. commit caa4444ddc2e242d903c6eef2c33b811d0e1438f Author: John Bowman Date: Tue Oct 21 17:49:30 2008 -0600 Implement HookHead2 and TeXHead2 arrowheads. These are 2D arrowheads lifted to 3D space and aligned according to the initial viewpoint. Add missing angle parameter in HooHead3. Simplify planar. Move arrowheadlight parameter out of Arrow3 and into arrow commands, so that the correct value of currentlight is used. Use tighter values for the margin parameters viewportfactor and anglefactor. Reduce angleiterations to 2. commit c03df01eb051081f035ecc4fdbfa9d88e76dae39 Author: John Bowman Date: Tue Oct 21 13:36:45 2008 -0600 Fit to screen by default. commit 72ee07959783cd6238303cbf614c02287b53fc1d Author: John Bowman Date: Tue Oct 21 11:52:54 2008 -0600 Don't generate spurious "camera too close" errors for projections from infinity. Always use currentlight by default for drawing arrowheads. commit 628f27c4054948ae3b0e83f43334860380a72378 Author: John Bowman Date: Tue Oct 21 09:02:46 2008 -0600 Change text on sample CD label to something more Asymptote related. commit 43251826a66e5d59b537245f03402ee220ef643d Author: John Bowman Date: Tue Oct 21 01:52:33 2008 -0600 Add missing file. commit db6b14e4304b767e2d9f701946e75421a5e5dcbf Author: John Bowman Date: Tue Oct 21 01:22:40 2008 -0600 Add module for reading obj files and example. commit c5c589ecc6513d890c48fb9810d9900b0b543681 Author: John Bowman Date: Mon Oct 20 23:05:56 2008 -0600 Allow an array of meshpens when drawing surfaces. Update documentation. commit ad2f7da5d4b350d624c4de6f79eaf48d4f363443 Author: John Bowman Date: Mon Oct 20 21:48:12 2008 -0600 Move path length tests to surface constructor. Add bool warn=true to planar and normal(path3). Check incoming width and height parameters. commit f0cd7a28153ae2a5c1af3b4000c5e76fc4a2b023 Author: John Bowman Date: Mon Oct 20 16:31:26 2008 -0600 Fix prefix again. commit 7d37902efc2d7bdf386eba8bdc5829ff090fdc65 Author: John Bowman Date: Mon Oct 20 16:19:41 2008 -0600 Implement 3D margins. commit 0bd329a544d339e46112e6a8604f2c9fbc4c21db Author: Andy Hammerlindl Date: Mon Oct 20 12:25:25 2008 -0600 Fixed watch() and unwatch() to use atupdate(). commit 56311b858724cb98c83957efd304795106431fdd Author: John Bowman Date: Mon Oct 20 01:36:47 2008 -0600 Add surface constructors for triangles. commit d0de328928b73dc533bf58c905bfd9996275f05c Author: John Bowman Date: Sun Oct 19 20:54:46 2008 -0600 Add missing transform for projected 3D mesh lines. commit baf1e366451674409dbbf282217dc8c18008878d Author: John Bowman Date: Sun Oct 19 19:47:40 2008 -0600 Use cornermean instead of center. commit 111691e9df8d41241f77121f0ce3ebf8ad1cb692 Author: John Bowman Date: Sun Oct 19 19:26:02 2008 -0600 Add missing put argument. commit f5779a58acced80e808dff0cf15ac79c8b0c7c7a Author: John Bowman Date: Sun Oct 19 17:43:03 2008 -0600 Fix range check in both places; consolidate PostScript code. commit e137c77e2a32a206713a3f7443d688b1e4cd82f7 Author: John Bowman Date: Sun Oct 19 17:27:37 2008 -0600 Fix range check in strokepath (and potentially texpath). commit 7fbd94c2ecd14edd2a913d6688cf89eb1cb2e29a Author: John Bowman Date: Sun Oct 19 16:32:44 2008 -0600 Implement functions that construct a pen array from a given function and palette. Add elevation example. commit a5184d084df93f6298baccf0ce70f69bae24afc1 Author: John Bowman Date: Sun Oct 19 15:22:09 2008 -0600 Add support for using a different surfacepen for each patch. commit 6009d4388f7454fb311d7decc947436c9566f733 Author: John Bowman Date: Sun Oct 19 13:17:34 2008 -0600 Document default pen argument of strokepath. commit 1360af6abbce73279628714c4c3ff048976d79a8 Author: John Bowman Date: Sun Oct 19 10:31:51 2008 -0600 Implement path[] strokepath(path g, pen p), which returns the path array that PostScript would fill in drawing path g with pen p. commit 2740298fede8465a7642bc2a18dea281021d9df6 Author: John Bowman Date: Sat Oct 18 13:53:43 2008 -0600 Increment version to 1.47svn. commit 9bb668cc88ca35249be96f355cbc7b75c45b6d68 Author: John Bowman Date: Sat Oct 18 12:36:00 2008 -0600 Allow one to disable embedding of inline PRC files within LaTeX. commit 84cf6bbf3325e893e010a53c21274357985ead03 Author: John Bowman Date: Sat Oct 18 11:48:45 2008 -0600 Try to produce a preview image of latexusage for the manual. commit 568f4e34ba370328955aee1bc4e8eafb48c861f8 Author: John Bowman Date: Sat Oct 18 11:01:22 2008 -0600 Signal an error if the user tries to render an image without freeglut. Support embedding of 3D PRC files when -render=0. commit 5118c4d0066843a6ba900ae7f956bd822fdbb2bd Author: John Bowman Date: Sat Oct 18 02:48:43 2008 -0600 Update examples. commit 4c7b3ff91a370dac01708dfe0a8c0922d1d6d457 Author: John Bowman Date: Sat Oct 18 02:35:15 2008 -0600 Update example. commit e722dc5cd0da79515c7463cfeb0773a49419939a Author: John Bowman Date: Sat Oct 18 02:30:53 2008 -0600 Increment version to 1.46svn. commit a08904f2e1b719095530bb6586ce57b9bb51f4d6 Author: John Bowman Date: Sat Oct 18 00:46:29 2008 -0600 Add planeproject routines, courtesy of Philippe Ivaldi. commit d01ca3e35f5b66b5adff25cd45aaf760bf4b993e Author: John Bowman Date: Fri Oct 17 23:44:47 2008 -0600 Documentation updates. commit eb9fb24438bc8553b4a5b0adb3c1cc014e4bb0f5 Author: John Bowman Date: Fri Oct 17 21:12:11 2008 -0600 Fix fitting issues. commit 5ae120c2b28d950c09df3b4b4fe3540168bb1d78 Author: John Bowman Date: Fri Oct 17 16:55:36 2008 -0600 Fix handling of minimumsize. commit 450be86ce3a140bbc7e013518e48e29d68ad8631 Author: John Bowman Date: Fri Oct 17 16:07:48 2008 -0600 Increase tolerance of normal(path3). commit 3bb03bf62429777e16aabbb40357ffada91a2aec Author: John Bowman Date: Fri Oct 17 14:11:32 2008 -0600 Standardize embed options; fix labels. commit 918322f8395ac985874b5d0417766e31feed1ba9 Author: John Bowman Date: Fri Oct 17 13:25:17 2008 -0600 Add link to PRC specification. commit 2a794557026dd10ea67fd140a79d8ef9155612c6 Author: John Bowman Date: Fri Oct 17 11:52:14 2008 -0600 Fix dir normalizations. Ignore spurious warnings from degrees. commit 434b5d12403d6b61afba453fe17dbe1366853821 Author: John Bowman Date: Fri Oct 17 11:20:47 2008 -0600 Illustrate use of global TeX macro. commit 7f25fea2532f514f4e2cd0eabc7a7e4cac68f0e9 Author: John Bowman Date: Fri Oct 17 01:26:45 2008 -0600 Document direction invert routine. commit 7d845ac8dfd8a4ce5d23c1363509f5e194abee03 Author: John Bowman Date: Fri Oct 17 01:19:46 2008 -0600 Fix DefaultHead3 size. Update documentation. commit b787b05159710e06c3487a7ce6047dc8a1272006 Author: John Bowman Date: Thu Oct 16 22:32:10 2008 -0600 Add 2D versions of accel and radius of curvature functions. commit bacaedc1bd39ca476fb99b10ab078778851a1bae Author: John Bowman Date: Thu Oct 16 21:48:08 2008 -0600 Fix radius and non-normalized dir functions. commit 23731a6187fa578d96593694e7e8e2b15044533f Author: John Bowman Date: Thu Oct 16 11:37:26 2008 -0600 Fix numerical resolution issue. commit ae5229645dc61337e71c72a53204d0c8c5251147 Author: John Bowman Date: Thu Oct 16 01:08:49 2008 -0600 Add a routine to compute the radius of curvature of a path3 at a point. Improve adaptive thick line algorithm. Add option to suppress normalization of dir functions. Remove secondary camera adjustment call. commit 53437664816df95947bd6b22e7047ca433046498 Author: John Bowman Date: Wed Oct 15 18:12:14 2008 -0600 Minor optimization. commit 1e5ad6e703157c922b9b020c30d2e58c288c9a03 Author: John Bowman Date: Wed Oct 15 18:03:05 2008 -0600 Fix arrow3 sizing. commit 932d58b7843a368a112847c2e166c244c92d3373 Author: John Bowman Date: Wed Oct 15 00:14:19 2008 -0600 Implement triple invert(pair dir, triple v, projection P=currentprojection). Add a 3D arrow routine that accepts a pair direction. commit d39eaeeda70a4bc3973d328897e1b0796d295efb Author: John Bowman Date: Tue Oct 14 23:42:35 2008 -0600 Add HookHead3 and TeXHead3 arrowhead styles. commit 14aaabac9f0337624ee86c74f36b5b2ad7e5442b Author: John Bowman Date: Tue Oct 14 17:16:17 2008 -0600 Optimize 2D arclength calculation for straight segments. commit fe419cd7baea414ffd6f92a17d24afccfb426fdf Author: John Bowman Date: Tue Oct 14 17:15:31 2008 -0600 Fix degenerate perp vector workaround. commit 72c86d263469f4451fc0d3abe803c0d9f15a141c Author: John Bowman Date: Tue Oct 14 17:14:27 2008 -0600 Optimize arclength calculation for straight segments. commit 738a2255ebe0c5a8a2014fdb4fff9e6ec1ab9c43 Author: John Bowman Date: Tue Oct 14 15:24:08 2008 -0600 Fix degenerate perp vectors. commit 3388c706edcf4159ae87503bee618befe94090f3 Author: John Bowman Date: Tue Oct 14 14:21:57 2008 -0600 Fix nullpath and nullpath3 issues. Use user coordinates in camera diagnostics. commit e2d10ddde7df0b81d5ad81c67f9f351865ceafc3 Author: John Bowman Date: Tue Oct 14 11:01:52 2008 -0600 Move surface constructor for surfaces of rotation from solids to three_surfaces. Add surface constructor planar(path3). Add path(path3, pair P(triple)=xypart) constructor. commit fec16d215047435adfa9111632f46c893fcb7d1d Author: John Bowman Date: Mon Oct 13 22:40:10 2008 -0600 Fix degenerate perp vectors. commit b469972c200c0c7c56e89450be844725ee140af0 Author: John Bowman Date: Mon Oct 13 21:49:53 2008 -0600 Improve automatic camera adjustment. commit 47ef47556935f1b4d3aa9165cd8e86103cd7c689 Author: John Bowman Date: Mon Oct 13 20:36:06 2008 -0600 Fix transition between rendering algorithms. Fix handling of currentlight=nolight. Change default light for mesh lines to surface light. commit b7033d26e5e86717787c3d7759d58a696d30246e Author: John Bowman Date: Mon Oct 13 13:28:07 2008 -0600 Fix window sizing problems. Tweak constant. commit 3a01cf4c74883209b8f9b9831715c3491a813bb4 Author: John Bowman Date: Mon Oct 13 10:00:22 2008 -0600 Install externalprc.tex. commit baae1e504001f309073a01c13aeab4856af2fbe3 Author: John Bowman Date: Mon Oct 13 01:26:29 2008 -0600 Avoid cracks in thick lines. Add connector sphere for cyclic paths. commit f94d0b4e62f3360e2a00a9a56384d9972ef9270d Author: John Bowman Date: Mon Oct 13 00:44:45 2008 -0600 Enable linetype offset. commit e7a0ad4062b13b04c2436c45c797ca18dc779a89 Author: John Bowman Date: Sun Oct 12 23:39:48 2008 -0600 Transform computed surface normals. Reduce planar normal constant for accurate rendering. commit c6379e473d1ef3581558b211757da30fd24c71dd Author: John Bowman Date: Sun Oct 12 21:13:04 2008 -0600 Add Orest's patch to make short connections before longer ones. commit 1ebe7b45b06798b414e70cb105f2cf87a502dfb1 Author: John Bowman Date: Sun Oct 12 13:35:26 2008 -0600 Fix rendering of planar surfaces. commit c90bf5333a69acb9349fdd1536c9942189e98151 Author: John Bowman Date: Sun Oct 12 11:33:24 2008 -0600 Fix settings.render=0. commit ff63393e73591bf3b466f8b9bc40da50423d376c Author: John Bowman Date: Sun Oct 12 00:29:13 2008 -0600 Fix freeglut dependency. commit d345f631455b8af7748a32595f61f209b4343c72 Author: John Bowman Date: Sat Oct 11 23:59:50 2008 -0600 Remove texhash dependency from RPM spec file. commit b88d4ff8e42f94497f711834bd636cd051ed7591 Author: John Bowman Date: Sat Oct 11 23:10:17 2008 -0600 Speed up rendering of straight surfaces. commit 81db85450d667bcbfa0cee08f8b7b7a0f4c4da87 Author: John Bowman Date: Sat Oct 11 22:02:50 2008 -0600 Treat duplicate nodes as straight segments. Make write(path) indicate straight segments, consistent with write(path3). commit 2503ca4d1ad2ce82ab46b741f4f5826f577aa56f Author: John Bowman Date: Sat Oct 11 14:48:32 2008 -0600 Size 2D and 3D objects consistently when render=0. commit 62ad2e45a245997657b1a48797fe7aa5dd559191 Author: John Bowman Date: Sat Oct 11 11:09:55 2008 -0600 Respect prefix and format arguments. commit 5caa2cc71777b1bb4da0fddc03e0571a6eb5c360 Author: John Bowman Date: Sat Oct 11 00:14:43 2008 -0600 Fix normal for degenerate paths. commit e0197dd54d4529cfa67ccd52e344f913bdec06b4 Author: John Bowman Date: Fri Oct 10 23:38:12 2008 -0600 Resolve ambiguity. Optimize normal. commit b852780739cd4bb22af63989e38acc517730843d Author: John Bowman Date: Fri Oct 10 23:09:04 2008 -0600 Fix straightness test. Draw a sphere if path3 has length 0 with roundcap but not squarecap or extendcap, consistent with the behaviour of PostScript in 2D. commit e62b0e605a8180dc79da3924b7689cc917eba92a Author: John Bowman Date: Fri Oct 10 21:40:24 2008 -0600 Remove -unsafe option in favour of -nosafe setting. Remove unused code. commit 0497d1c36a9804d5d4cd7ef9dcfb5dd14599d2a8 Author: Andy Hammerlindl Date: Fri Oct 10 19:47:52 2008 -0600 Added testing of permissions. commit 78f09201a89f87fa42e569870f1a204046eb92de Author: Andy Hammerlindl Date: Fri Oct 10 18:47:43 2008 -0600 Added secure options as read-only settings. commit 7b8f87e5a582f369b7ced78f5f1385982e06e8c3 Author: Andy Hammerlindl Date: Fri Oct 10 17:42:54 2008 -0600 Added optional tests to audit the type and application caching. commit 8ccab01d6fe468e730d2a79d32f75df4a1b94f18 Author: John Bowman Date: Fri Oct 10 17:35:57 2008 -0600 Document texpath. Standardize write(path3) formatting. commit 34290dca518ad649093ec17e0bc2cf699b2e9279 Author: John Bowman Date: Fri Oct 10 09:27:34 2008 -0600 Fix example. commit 05daf2ea53e09caaceaf8234cc0258a9fa1fa16e Author: John Bowman Date: Fri Oct 10 09:24:00 2008 -0600 Fix compilation error. commit a0e55c7d1ceb54cde843700161902b663b943abb Author: John Bowman Date: Fri Oct 10 09:22:09 2008 -0600 Add missing return value. commit 60d1a1051c405c20214b8eeb74d37b5ea5cc68a6 Author: John Bowman Date: Fri Oct 10 09:10:00 2008 -0600 Document convert, animate, and system; add args option to animate. Fix segmentation fault in system. commit 575edaeefd1daa8877ff91d3b3c38ffb7823e8dc Author: John Bowman Date: Fri Oct 10 08:18:48 2008 -0600 Add files missing from last revision. commit 4b34812c6222d7639176cb150c4ce0cb61a62197 Author: John Bowman Date: Fri Oct 10 02:45:32 2008 -0600 Make default surface color black now that lighting is on by default (otherwise planar surfaces might not be visible). Add unithemisphere. Draw hemispheres rather than spheres at joints. Simplify linecap code. Use linecap(0) by default for meshlines. Don't draw thin line if opacity of pen is less than 1. commit 63785292a8872eea4482057643ca8d4e313484f5 Author: John Bowman Date: Fri Oct 10 00:58:16 2008 -0600 Add min and max arguments to axes and axes3. commit 19aa769f07f3552b8fcaa172abe2fc3315945bb0 Author: John Bowman Date: Fri Oct 10 00:52:48 2008 -0600 Simplify paths. commit 86afa75132b7408133e32953a1182b2877381534 Author: John Bowman Date: Thu Oct 9 22:12:26 2008 -0600 Allow the specification of fuzz=0 in intersection routines (the new default, fuzz=-1, specifies a fixed multiple of the machine precision). commit 770063a8564a3caeeda2b5daa9d1c5c53c70f08d Author: John Bowman Date: Thu Oct 9 21:34:15 2008 -0600 Fix division by zero error. commit 19c3e714f4aa541026e7f8ce54cf49511d2a3336 Author: Orest Shardt Date: Thu Oct 9 19:23:43 2008 -0600 Improve splitting of triangular patches. commit bb431ae8b39aa8c66bae401438839f4e9e1d259b Author: John Bowman Date: Thu Oct 9 01:23:49 2008 -0600 Fix longitudinal lines in solids.asy. Split longitudinal curves into front and back pieces; add longintudinalpen=frontpen and longintudinalbackpen=backpen. Use longitudinalpen=nullpen instead of longitudinal=false. Make dash lengths in solids.asy consistent between different rendering modes. Fix OpenGL opacity calculation (only for settings.render=0). Set P.ninterpolate to 1 for projections from infinity. Fix 3D dashed lines for degenerate cyclic paths. Increase fuzz in 3D arc and Arc routines. Update cone radix in solids.asy. commit a879e30890cc04c2e386415857144c1260ace1dd Author: John Bowman Date: Wed Oct 8 21:57:16 2008 -0600 Fix arctime for cyclic paths of zero arclength. commit 246b189492f41e694ce067bcc139af0cc2d77332 Author: John Bowman Date: Tue Oct 7 15:50:10 2008 -0600 Reduce number of patches in unitcone. Rename solidcone to unitsolidcone. Improve appearance of straight arrows. Increase fuzz in arrow end tests. commit 7d47f3d7e53f6999ec8ba5e463cd5533c999adf0 Author: John Bowman Date: Tue Oct 7 14:27:36 2008 -0600 Add arrow to NoTicks. commit 2350e092e97f564193df1afa0241b13ab1b8fad1 Author: John Bowman Date: Tue Oct 7 13:57:30 2008 -0600 Fix transverse slices. commit 236f3d2e2acbc367c991d4614deefa37a2063bbc Author: John Bowman Date: Tue Oct 7 12:00:47 2008 -0600 Give user control over slice Arc accuracy. commit 6d460c3889480d4fd88a6e3f3567b0fc27a13566 Author: John Bowman Date: Tue Oct 7 11:32:08 2008 -0600 Increase longitudinal epsilon. commit 0626509ce02f1c0473fcfd481f089c2e6824fd2b Author: John Bowman Date: Mon Oct 6 16:49:30 2008 -0600 Document need for version 2008/01/16 or later of the movie15 package. commit adfd8d95fb575a4e7511cde1170150fc5cccea0e Author: John Bowman Date: Mon Oct 6 16:19:50 2008 -0600 Fix incorrect cast. Resolve ambiguities. commit 691fdeba886be97a0b7fc5c44ebfa0cd73dd48d3 Author: John Bowman Date: Mon Oct 6 12:26:16 2008 -0600 Update documentation. commit bbd1c8040d2e7d645227a729cc923133d9cdf96f Author: John Bowman Date: Mon Oct 6 12:05:43 2008 -0600 Add utility for forcing Adobe Reader to update all currently loaded documents. commit e47173ba27d35777b1edd1d30e95f839901f42e1 Author: John Bowman Date: Mon Oct 6 11:24:49 2008 -0600 Use NUL instead of /dev/null under MSWindows. commit b6e12abbc219dfaf582b24788bd6d11f65183dcd Author: John Bowman Date: Mon Oct 6 05:36:07 2008 -0600 Increment version to 1.45svn. commit 9c86cdd6a32142cca7fe4a443bc36192cba2e098 Author: John Bowman Date: Mon Oct 6 03:48:54 2008 -0600 Update documentation. commit 01ed46270df994548349be0f2e6b112b2f5b9644 Author: John Bowman Date: Mon Oct 6 01:09:53 2008 -0600 Remove settings.tex="pdflatex" from embed.asy and move contents of embedding.asy into this file. Generalize movie15 patch to pdflatex; restore @ catcode to its previous value. Reduce size of manual. commit 987faf990fb1adec72aaf3f72b9176e9ca034cff Author: John Bowman Date: Sun Oct 5 21:20:57 2008 -0600 Fix missing BBox bug in movie15 version 2008/01/16. commit a245d161df6b5603452b42d10a198ffa31666167 Author: John Bowman Date: Sun Oct 5 03:33:08 2008 -0600 Handle degenerate scaling. Fix manual build problems. Update examples and documentation. commit 9c9c3fadd3a230f6d2ecefdd85a6f935ca9e9934 Author: John Bowman Date: Sat Oct 4 23:13:48 2008 -0600 Fix absolute viewpoints. commit d38da2db56425068f34003393540912efc22ab16 Author: John Bowman Date: Sat Oct 4 19:18:49 2008 -0600 Fix example. commit 5662f10ca793475007c144f8e15edb4d7cb9cd8f Author: John Bowman Date: Sat Oct 4 18:18:00 2008 -0600 Fix examples. commit 1e3bbb896eca8318e3c450502f46ca0035713496 Author: John Bowman Date: Sat Oct 4 17:12:05 2008 -0600 Add file missing from last revision. commit 75d1a9ebd17d7a737756dceafdc7def97cb17ed0 Author: John Bowman Date: Sat Oct 4 17:11:37 2008 -0600 Improve definition of unitcone. Make xasy work again with 3D pictures. commit f600479daf9a0ebddfaf68714df208444d76cf4a Author: John Bowman Date: Sat Oct 4 14:53:47 2008 -0600 Remove interp(int,int,real). commit 4aa519732f652230ecaedc8e54cd52fb609a6eda Author: John Bowman Date: Sat Oct 4 11:45:14 2008 -0600 Handle degenerate point in cone. Tweak parameter in thick lines. commit 355a989ef64871ef160394f74f36abb71d79508a Author: John Bowman Date: Sat Oct 4 01:15:46 2008 -0600 Fix cracks in thick lines. Fix projection and clipping. Fix 3D animations. commit 2e9ccd5d05b774d3e21a4b799536510c2b440a95 Author: John Bowman Date: Fri Oct 3 17:21:00 2008 -0600 Force -noprc during documentation builds. commit 8365dfbfa96fd6d787cc7a9a4f2a710a2b3dbc5c Author: Andy Hammerlindl Date: Fri Oct 3 17:07:00 2008 -0600 Fixed matching of defaults for functions with rest arguments. commit dfed4bfb80e49c5fe703a93dded72ccfaa0df450 Author: John Bowman Date: Fri Oct 3 16:32:10 2008 -0600 Make latexusage produce a rendered image by default. commit d53e950205d309c69c2f4558351cf133addf8b12 Author: John Bowman Date: Fri Oct 3 15:49:34 2008 -0600 Respect -noprc. commit f6022f259b33bfe692f0291b7cd4a32f17e609a6 Author: John Bowman Date: Fri Oct 3 04:09:58 2008 -0600 Remove references to obsolete modules. commit 2ce92f4ebdf01e44843b7ad281430135c319a4e1 Author: John Bowman Date: Fri Oct 3 03:43:53 2008 -0600 Restore symmetric clipping planes. Fix embed ambiguity. Update examples. Make preliminary documentation updates. commit bd1cd3509b9156cc0addfe043a5a3e9a33185384 Author: John Bowman Date: Fri Oct 3 01:01:09 2008 -0600 Use a better default for tick and axis label selection. commit 8ce64fdbab5ce351116d5526b5c8e2836a41510c Author: John Bowman Date: Fri Oct 3 00:02:26 2008 -0600 Return a zero scaling when unbounded (revert 1.44-252); see generalaxis3. Rename LeftTicks3 to InTicks, RightTicks3 to OutTicks, and Ticks3 to InOutTicks. commit 2506b0faf7f20bf480fdf5796d5aa37de880d3b0 Author: John Bowman Date: Thu Oct 2 16:47:12 2008 -0600 Remove unused code. commit fbf60a9cd7a93e4ec4f71634f81a009b2eba1e67 Author: John Bowman Date: Thu Oct 2 16:43:22 2008 -0600 Support PRC images even when inlinetex=false. commit 9812fa6d9e85f2c117c9e764e237fc08b9a931a8 Author: John Bowman Date: Thu Oct 2 02:40:10 2008 -0600 Support PRC, with optional rendered preview, in inlinetex mode. commit 3780d2fdfd74873a0a41e92c763992d72b911df3 Author: John Bowman Date: Wed Oct 1 23:50:15 2008 -0600 Work around degenerate up vectors. commit 59235a64322e4d9af3aacf87d82605821486979e Author: John Bowman Date: Wed Oct 1 22:45:06 2008 -0600 Fix perspective projections and clipping. commit 6c4d4326ea56ef3164a4757b533ad7a49eca5724 Author: John Bowman Date: Wed Oct 1 21:34:38 2008 -0600 Fix reference vector indices. commit e18c8f9739b31ce0d8716dd4d34a4affdadc71a8 Author: John Bowman Date: Wed Oct 1 20:56:14 2008 -0600 Support prc with pdflatex. Fix light transforms. Use sequence for array loops. commit d90fb9cab118ea3761dd2c2eca5fc5a9df7864db Author: John Bowman Date: Wed Oct 1 14:07:53 2008 -0600 Support texpath in inlinetex mode. commit 4840f25bc8cc76d5b008baff72b31301c35d97cd Author: John Bowman Date: Wed Oct 1 03:45:46 2008 -0600 Fix sizing of perspective projections by usingd an accurate subdivison algorithm to calculate the optimal field of view angle. Use an accurate projected path3 bound for picture sizing. Optimize projection routines. commit 9b9bf22e4c751ecc7b2405c4028fcafb1b52a7d4 Author: John Bowman Date: Tue Sep 30 11:58:22 2008 -0600 Don't cache projected bounds. commit 889b91cee23aee5799618c789bc8b4daf5fd83bf Author: John Bowman Date: Tue Sep 30 10:59:03 2008 -0600 Fix rendering from an absolute viewpoint. commit 7b811cdad3343f270edbb96afc40c57291aca5f2 Author: John Bowman Date: Tue Sep 30 03:53:15 2008 -0600 Fix picture sizing and clipping plane. commit d0a1de8b34ba2ed05cd1fc0b8a1c0538d17665ea Author: John Bowman Date: Tue Sep 30 02:14:12 2008 -0600 Use a separate frame for preview rendering. commit 4977cb85f158f2e643f2958a7ca1a0e907e31b0b Author: John Bowman Date: Mon Sep 29 19:01:39 2008 -0600 Minor optimizations. commit 12c7b6a47985ae0aa110ca39c575ec87a9a5a6df Author: John Bowman Date: Mon Sep 29 03:39:09 2008 -0600 Limit window to physical screen size under MSWindows due to OS limitations. commit ae0ab2d344985ca2027a223fb009fd67085f66b9 Author: John Bowman Date: Mon Sep 29 02:08:52 2008 -0600 Fix window size checks. commit 51819e119ff82a0e29daaceb67f75a1bba0c5a58 Author: John Bowman Date: Mon Sep 29 01:41:25 2008 -0600 Use gluEndCurve not gluEndSurface. commit 9075f472590c9760a94c247cf5d7d12b162b7e81 Author: John Bowman Date: Mon Sep 29 01:09:16 2008 -0600 Allocate image rather than putting it on the stack. commit 10b0cbf91b825294005d095f37084cf93c30e896 Author: John Bowman Date: Mon Sep 29 00:47:41 2008 -0600 Optimize solids.asy. commit 04e54c5eaaf34b67f3f7054689503c8e4e2e1131 Author: John Bowman Date: Sun Sep 28 23:01:01 2008 -0600 Fix shrink (- or _) and expand (+ or =) keys. commit d168f5736ad199d1b0b7decee1e5a88314639289 Author: John Bowman Date: Sun Sep 28 22:25:20 2008 -0600 Remove unneeded bzero. commit 85d1559a9d219a17ab1ea1676f3771fff60b8675 Author: John Bowman Date: Sun Sep 28 22:22:19 2008 -0600 Port to cygwin. commit c39a492a8574f1d5ab3ab7518466820e110976c8 Author: John Bowman Date: Sun Sep 28 21:46:48 2008 -0600 Fix cygwin configuration. commit 27ef19ce3571c07f47ae25a8547faf10f40f590c Author: John Bowman Date: Sun Sep 28 12:58:51 2008 -0600 Support CYGWIN freeglut configuration. commit 966268d31497e4778bdb659aa180399390fceb88 Author: John Bowman Date: Sun Sep 28 11:56:33 2008 -0600 Avoid redundant transformation for infinite projections. commit 953ad71d6dfd10a0ddafa7ee8540ea6dc7df3fb4 Author: John Bowman Date: Sun Sep 28 11:47:50 2008 -0600 Preserve aspect ratio on export. Work around viewport size driver bugs. commit 5fbdf27645360c0a1effc27dd325d384301e3009 Author: John Bowman Date: Sun Sep 28 03:27:07 2008 -0600 Port to cygwin. Wait until menu disappears before exporting. Right button without motion, in addition to middle button, now brings up menu. Fix export segmentation fault. Fix mesh mode. commit 7edb1c93d655cddc5562dc38ebff6cbdb8736e62 Author: John Bowman Date: Sat Sep 27 10:37:38 2008 -0600 Add missing 2D Arc routiones. Remove unusual handling of negative radii. Update arc and Arc documentation. commit 6abd91a066dbe564210c7c1c4185cc26e782aba9 Author: John Bowman Date: Sat Sep 27 03:17:06 2008 -0600 Render at requested size in interactive mode. Fix transverse slices of solids of revolution. Simplify arc and Arc routines. Check for invalid normal vectors in 3D arc and Arc. commit 36999977922c983da159e435d3f302efd001401b Author: John Bowman Date: Sat Sep 27 00:29:16 2008 -0600 Preliminary changes to support CYGWIN. commit 9314d7e7887d1eb9be676e6a0582e671323bee31 Author: John Bowman Date: Sat Sep 27 00:18:48 2008 -0600 Remove psimage code. commit b449661b1b3f3043852f3a6ce690105425c3aabc Author: John Bowman Date: Fri Sep 26 23:38:00 2008 -0600 Remove obsolete psimage feature (use -render=n instead). commit 8e814f5d9ff6876292ad53206bf47e2e05cb35c4 Author: John Bowman Date: Fri Sep 26 23:33:09 2008 -0600 Fix path3 rendering. Add meshlight option to surface routines. Improve glrender mesh mode. Simplify light constructors. Clean up code. Remove OpenGL license from glrender.cc as the original code has been completely replaced by our own code. Update examples. Remove unused lights.js file. commit b5f168b67aa737a7f11c0a7da3e9546672450255 Author: John Bowman Date: Fri Sep 26 12:53:55 2008 -0600 Make object argument optional in flowchart routines. commit a1cb3ff0719f028623e9a28fe3b21e0ef35ef512 Author: John Bowman Date: Thu Sep 25 00:31:50 2008 -0600 Standardize lightmodel with openGL; support multiple lights. Add viewport option to light to force lights to be fixed in the viewport frame. Communicate non-viewport lights to embedded PRC files. Add +/- expand/shrink keyboard shortcuts. commit 3183cd3346d88442a0f34e86b7092d614faed252 Author: John Bowman Date: Wed Sep 24 03:34:35 2008 -0600 Replace the light model with the one used by openGL. Use nurb routine whenever the surface is not straight and the light is on. Add -nothin option to force pen thin to be set to the initial defaultpen. Support custom embedded javascript files via a script option to shipout; add lights.js example. commit d310ac530844a01f943e63a42fe488fdf3e81d1a Author: John Bowman Date: Wed Sep 24 03:25:34 2008 -0600 Set the opacity of the sum of two pens to be the larger of the two opacities, adopting the blending mode of the second pen. commit 900a2509e7e48eeeecfb9244742664462c32d40c Author: John Bowman Date: Tue Sep 23 02:18:57 2008 -0600 Fix more material vs. pen problems. Improve degenerate normal test. commit 19f717837954a62b9b6f5bc133dabddd929c2da8 Author: John Bowman Date: Mon Sep 22 23:16:10 2008 -0600 If the render value is negative, use 4 times its absolute value for rendering eps and pdf formats and 2 times its absolute value for rendering other formats. Turn light off for drawing meshes. Specify light coordinates in viewport frame. Fix line colors. Provide an optimized patch constructor for quadrilaterals. commit 46b54b99f4060c19d23fc9cb5814dc1391324628 Author: John Bowman Date: Mon Sep 22 17:24:11 2008 -0600 Remove preview option in favour of render=n > 0. Fix line material defaults. Viewer is no longer updated by erase() since we don't know whether the original picture was 2D or 3D and reloading acroread is slow. Spurious shipouts arising from cameralink are now suppressed. commit c9f40fcc55c2c9354330749bf8208ceb3640b595 Author: John Bowman Date: Mon Sep 22 14:51:56 2008 -0600 Add option -preview to render 3D preview image. commit fac8c870a1e483c08963f7d794936f4f99ed6b3d Author: John Bowman Date: Mon Sep 22 11:52:56 2008 -0600 Remove obsolete outward flag. commit 790ac4aecde366b2f22c77aab5f9540c2ce6a236 Author: John Bowman Date: Mon Sep 22 09:05:17 2008 -0600 Revert last change. commit d9f599e28adbf465adb9fd685e467da4a53e8be0 Author: John Bowman Date: Mon Sep 22 09:03:50 2008 -0600 Suppress another unnecessary warning. commit 8106ef18917d33c053c69d885417e76c1b30c7ff Author: John Bowman Date: Mon Sep 22 08:45:44 2008 -0600 Suppress unnecessary warnings from automatic picture sizing. commit f03f00939aba56d9e4fe4f58d61ac3d74f6a3bbd Author: John Bowman Date: Mon Sep 22 03:05:03 2008 -0600 Support orthographic projections in PRC. Fix definition of emissive. Transform currentlight correctly in shipout3. commit 6b10a32eacf8291eca8e3bbfb60a7abfac24a847 Author: John Bowman Date: Sun Sep 21 14:43:48 2008 -0600 Fix orthographic and oblique clipping. commit cd2ead2066972765f47086fd2d169954230f0ae9 Author: Orest Shardt Date: Sun Sep 21 14:10:34 2008 -0600 Fix z rotation. commit b8662acce03a7f8f6f663705b6ee264e31ec490d Author: John Bowman Date: Sun Sep 21 13:34:37 2008 -0600 Support compilation without freeglut. commit 34ee9b3a14f79efb2524e63929d3585450bb6854 Author: John Bowman Date: Sun Sep 21 11:33:45 2008 -0600 Fix normal0. commit f79f8e84dec627eb3f1adcad2b0cb520d87d8924 Author: John Bowman Date: Sun Sep 21 11:32:55 2008 -0600 Add optimized vertex normal routines. Add fuzz to arrow position test. commit 6c368a1e776dd57fcc89b986d4dccf9d219ade4b Author: John Bowman Date: Sun Sep 21 00:57:00 2008 -0600 Fix includes. commit 356eaf53fb4cb3f795185b8b5bb431f0a5af903d Author: John Bowman Date: Sun Sep 21 00:52:01 2008 -0600 Fix glOrtho parameters. commit 1a022b26985d53b7be158756fdfe1dc610fe4a7e Author: John Bowman Date: Sat Sep 20 23:59:37 2008 -0600 Improve surface culling. Use GLUnurb for rendering a path3 (unless it is piecewise straight). commit af0b8965ea4d0a46eaf0efdb032e8090607de630 Author: Orest Shardt Date: Sat Sep 20 14:20:06 2008 -0600 Undo renaming of slidemovies.asy. commit f4acd62482a50ef7ec3a614a3e4262d11b0034a0 Author: John Bowman Date: Fri Sep 19 22:55:58 2008 -0600 Adjust rendering constants. commit e51d2f144c16a99b6e65eb08aa52654877b98109 Author: John Bowman Date: Fri Sep 19 22:36:16 2008 -0600 Update convert options; add convertOptions setting. commit de8c612435501b4bfd160adc6213b83602eb9703 Author: John Bowman Date: Fri Sep 19 14:58:20 2008 -0600 Allow compilation without freeglut library. Fix width and height sizing. commit 512c14d4c3aad03906ef62376ed7bea0106c92fa Author: John Bowman Date: Fri Sep 19 13:36:35 2008 -0600 Use render setting for convert. commit c2c5ad1d9043daae40db4df06295ae4405eca4c2 Author: John Bowman Date: Fri Sep 19 13:08:14 2008 -0600 Add antialias=false option to image routines. commit 5c675ac18ab4fbddc1233f8395ed3da286d12bba Author: John Bowman Date: Fri Sep 19 12:44:53 2008 -0600 Improve configuration diagnostics. commit e5a0f320946b4efdaa1e5f19ab961e3892fec445 Author: John Bowman Date: Fri Sep 19 01:59:23 2008 -0600 Don't dealias last column of pixels. commit e072aff3638f8f23a30feb3ef7b2dd9b5430bb2a Author: John Bowman Date: Fri Sep 19 01:55:18 2008 -0600 Fix segmentation fault: don't dealias the top row of pixels. commit 8c29b6213d34ac0113a7804b84dafe9923eb6c99 Author: John Bowman Date: Fri Sep 19 01:20:05 2008 -0600 Support antialiasing of all images. commit 9186b72c973070bc2479f036a4a29e1e359975ec Author: John Bowman Date: Fri Sep 19 01:10:51 2008 -0600 Support inline antialiasing. commit 18d37540940bee3fb91146a53fdce9be60893840 Author: John Bowman Date: Thu Sep 18 23:18:41 2008 -0600 Improve rendering options. commit b438f03c022db3d669be8f6b4a04f45e04183808 Author: John Bowman Date: Thu Sep 18 12:25:57 2008 -0600 Antialias export images. commit 429d37d34f8e8b6cb1356afabeb85df36316fe6a Author: John Bowman Date: Thu Sep 18 12:11:57 2008 -0600 Fix export. commit 6e62cb14a4c1001e0412ac439d8a5e0be46d2828 Author: John Bowman Date: Thu Sep 18 03:47:05 2008 -0600 Simplify and optimize surface rendering. commit d86c200e1a646282a44582c6a392918aecf53b21 Author: John Bowman Date: Thu Sep 18 02:23:07 2008 -0600 Always use nurb rendering algorithm (with callback) for degenerate patches when the light is on. commit b0edb45297df294e72a11e8a9a046d072a069520 Author: John Bowman Date: Thu Sep 18 00:17:53 2008 -0600 Fix rendering artifacts at degenerate control points. Improve unitcone. commit 474f0747c777b9f1ebc921df4261adbe1a26d57e Author: John Bowman Date: Wed Sep 17 08:55:44 2008 -0600 Add a maxviewport setting for working around direct rendering driver bugs. commit d848274e3bbfab5cb07c6f81eac43c4076c5b27c Author: John Bowman Date: Tue Sep 16 23:47:20 2008 -0600 Retune rendering parameters. commit a4b88696b58eb0bbc59bd8e84626368e94a92b5c Author: John Bowman Date: Tue Sep 16 22:28:11 2008 -0600 Add mesh mode menu. commit c46b8b39cbb403c4134c8ce3174f479eb7803bbc Author: John Bowman Date: Tue Sep 16 19:34:29 2008 -0600 Force a minimum rendering window size. commit d939ff4ee61b9d3d3ac69c355a52626ef3b87e16 Author: John Bowman Date: Tue Sep 16 19:06:42 2008 -0600 Allow explicit surface normals to be specified (currently only respected when render=0). commit a4c7d2fcd4cb0886b00743677bf390077490cea2 Author: John Bowman Date: Tue Sep 16 17:42:33 2008 -0600 Work around direct rendering segmentation faults. Improve full screen mode. commit d8252c49470d6ad0ada0562d47aac8838ac8781e Author: John Bowman Date: Tue Sep 16 13:29:55 2008 -0600 Use fullscreen rendering by default. commit 8af536b3f4f210ced538d0ffdc0cb10afb811f17 Author: John Bowman Date: Tue Sep 16 09:21:24 2008 -0600 Remove broken bounding box test optimization. commit 579686b62eba7c13f3b9f9cea06f99dd70507b93 Author: John Bowman Date: Tue Sep 16 02:08:38 2008 -0600 Use hybrid EvalMesh2/NurbSurface rendering algorithm for better speed & accuracy. Remove localsub option. Rename int path3quality back to bool thick. commit 7db8eefb7fef904c05bc958868e25daf62933840 Author: John Bowman Date: Mon Sep 15 23:13:09 2008 -0600 Add toggle fullscreen menu option. Add further keycodes. commit 3cb3b04554dbed6087519ed330b0aca4e422f853 Author: John Bowman Date: Mon Sep 15 17:31:58 2008 -0600 Initialize timer before spinning. commit 6ca3a4020e8d5ca9c8bc45e0e2e6f36a28b49542 Author: John Bowman Date: Mon Sep 15 17:21:28 2008 -0600 Improve spin/arcball interaction. Make the Home menu item reset the zoom. commit 10939a78da05590a21afa5fbcf6a5e9378098f01 Author: John Bowman Date: Mon Sep 15 08:49:52 2008 -0600 Use -render=0 instead of -norender. commit 082dd13f4d48af08c451532f1c128dc75599ecb2 Author: John Bowman Date: Sun Sep 14 22:03:32 2008 -0600 Use a better reference value in path and path3 dir functions. Fix zoom/rotate synchronization. commit 64b7a1dca9805837643a1d50557bd170ffcdb487 Author: John Bowman Date: Sun Sep 14 20:53:45 2008 -0600 Simplify dir(path, real) and dir(path3, real) computations. Fix accel(path3, real). commit 7a28d7c623e781bc4c094b1578d60fd3dd0d0114 Author: John Bowman Date: Sun Sep 14 09:56:50 2008 -0600 Add position parameter to specify initial rendering screen position (negative components indicate relative to screen width or height). commit 54059bba3420f566dbde12d28ba47fd45828d8e3 Author: John Bowman Date: Sun Sep 14 09:23:08 2008 -0600 Add Export and Quit menu items. commit 08c2c32d2ccf4529ce90034d5d87d902c1ea7519 Author: John Bowman Date: Sun Sep 14 03:05:29 2008 -0600 Remove remaining scale3D factor; retune adaptive constants. commit 27254d610032645a3876f7ea35e04540f59378d0 Author: John Bowman Date: Sun Sep 14 02:44:01 2008 -0600 Move PRC cm scaling to a more sensible place. commit 83febd4929fd9d8a49b1d7fa5e254989537b4742 Author: John Bowman Date: Sun Sep 14 01:10:13 2008 -0600 Fix oblique transformations. Rename linequality to path3quality. commit 194182305179b22ee098a99f94cbb0b1ba7f6f7e Author: John Bowman Date: Sat Sep 13 22:18:15 2008 -0600 Add menu (middle mouse button) with Home and Spin options. commit 7bf3f93c0c2e1c297a9738724ca8e8229ddcc22b Author: John Bowman Date: Sat Sep 13 17:57:35 2008 -0600 Support interactive rendering. Remove obsolete Wait and NoWait keywords. commit ec3bccb1adea541766b4ee11ac3839ba53035120 Author: John Bowman Date: Sat Sep 13 13:14:55 2008 -0600 Add linequality and twosided settings. commit 58df06a1991ea331a0fb6eb42f5144ec52eebd0b Author: John Bowman Date: Sat Sep 13 09:43:03 2008 -0600 Compute surface bounds for transformed frames correctly. Speed up rendering by drawing only the surfaces and paths within the field of view. commit a87f2cd1a8d4366040d840542c7834de386ed3ff Author: John Bowman Date: Fri Sep 12 21:48:33 2008 -0600 Fix mouse button zoom. Improve mouse bindings. commit f34bc01af1562c829bef378a1ea983a470777e58 Author: John Bowman Date: Fri Sep 12 17:04:16 2008 -0600 More zoom improvements. commit 1d70efd24bc6b655b7dde06ebe7e8149b413a7c4 Author: John Bowman Date: Fri Sep 12 16:23:47 2008 -0600 Zoom on center of window; improve resizing. commit e0d7d872299e724140c941cc6209b8c30ed0d63d Author: John Bowman Date: Fri Sep 12 00:42:43 2008 -0600 Account for field of view factor of 0.6 (from javascript). commit 1306945bedc1d5c7af28498b69be3f1e069ff1d1 Author: John Bowman Date: Wed Sep 10 01:45:00 2008 -0600 Compress all images and encode them with ASCII85. commit bd2d8423cdef245203d3b22a6c135f026f4aef8d Author: John Bowman Date: Tue Sep 9 10:56:31 2008 -0600 Force use of new c-lang-defconst for proper indentation after struct. commit 134e9e374555b88b0f9f70318d87dcab43d12d43 Author: John Bowman Date: Tue Sep 9 02:57:38 2008 -0600 Fix add. commit 53105d5aa0782312daee014be542fd9f6c8d0f43 Author: John Bowman Date: Tue Sep 9 02:38:47 2008 -0600 Compress rendered images with zlib. commit 027634cd45f7170a67372e488bb386e89cfdd352 Author: John Bowman Date: Tue Sep 9 00:42:32 2008 -0600 Support rendering into other colorspaces. commit e9c85db11e45ee1bf7d14426790031c82c370013 Author: John Bowman Date: Mon Sep 8 23:51:16 2008 -0600 Fix zoom-dependence of arcball radius. Fix rendering problems with mixed 2D+3D drawings (ignore 2D drawing). commit a5412018d8c485ead475553bdcb10730fa7df778 Author: John Bowman Date: Mon Sep 8 23:19:00 2008 -0600 Fix segmentation fault if renderer ends abnormally. Use color instead of material for path3 rendering, just as for prc. Add thicklocalsub parameter. Use two-sided lighting model. Fix handling of transparency. commit d6014b1524b34260afcca32d05ad03998b33484e Author: John Bowman Date: Mon Sep 8 02:54:29 2008 -0600 Disable rendering during builds. commit 7c59158cdfb005b0f6a41b3d63cd5893b8cdfa4e Author: John Bowman Date: Mon Sep 8 02:14:24 2008 -0600 Implement openGL-based adaptive-mesh renderer. commit f155070f4befcf23d0ac69ee23a8aa92c497a17c Author: John Bowman Date: Thu Sep 4 22:57:07 2008 -0600 Fix surface orientations. Optimizations array references. commit febc21e3943d082cf131ae39237b6da734a47de5 Author: John Bowman Date: Fri Aug 29 21:53:57 2008 -0600 Allow 2D drawings under 3D drawings. commit a2670bc60d6510d22c015d0726e44be46232d29a Author: John Bowman Date: Fri Aug 29 20:17:36 2008 -0600 Use consistent notation for control points. commit a5ce25ee5cf3e515e1128ec256ad6eb92151d385 Author: John Bowman Date: Fri Aug 29 20:16:18 2008 -0600 Turn off default graph autoscaling. Set extend=false by default for 3D axes. commit f75a43432db7d9737aa380335e4673435c894dcf Author: John Bowman Date: Fri Aug 29 20:14:29 2008 -0600 Rename Bezier/BezierP to bezier/bezierP. commit 3191bd7cfe5f54c04e30b85d086d18cf788abcbb Author: John Bowman Date: Fri Aug 29 12:36:21 2008 -0600 Don't allow curve to reach surface of tube. commit 5f981eaa8ff78e640e37b7e366e56e21faa2053c Author: John Bowman Date: Fri Aug 29 12:35:00 2008 -0600 Fix overflow problem. commit 1e2357150b3fd6ef4242d4b2cd1d7c35014f2880 Author: John Bowman Date: Fri Aug 29 10:12:37 2008 -0600 Re-enable adjustdash for paths. commit f3088a65374528b445033c75f22b6e54782dbf8e Author: John Bowman Date: Fri Aug 29 01:50:34 2008 -0600 Implement add(picture,picture,triple) for adding fixed sized 3D pictures about a point. Simplify arrow definition. Move supplementary 3D routines from plain_picture.asy to three.asy. commit 30d00119bdab6aae028a93248dad91fff9bd7e3c Author: John Bowman Date: Fri Aug 29 01:02:27 2008 -0600 Add pen bounds to arrow routine. commit 4af79abbf8ef1653a58445cdc47d6cbec5c992b3 Author: John Bowman Date: Fri Aug 29 00:54:30 2008 -0600 Uninstall pixel.pdf. commit 0a43bfd1418565080f517542b84989a12ae5e2d4 Author: John Bowman Date: Thu Aug 28 09:00:49 2008 -0600 Fix typo commit edce2abbabdfe99dadb63f1fa681d2e0eae8c4e4 Author: John Bowman Date: Thu Aug 28 09:00:30 2008 -0600 Fix file location. commit f57ae914e78fde268ebe3b1d38720704139dd82d Author: John Bowman Date: Thu Aug 28 01:13:22 2008 -0600 Add missing 3D arrow and dot functions. Workaround singular matrices in align routines. Fix conditional drawing of surfaces. Update examples. Delete gc-7.1FreeBSD.patch as it isn't required any more under 7.0-RELEASE-p2. commit ea94efef01cf69c849c44ed1d9b5c5ebf9a6124e Author: John Bowman Date: Wed Aug 27 23:11:31 2008 -0600 Fix segmentation fault. commit d2cdbdda93b4b675eb31e4fc08d0f516dd05798b Author: John Bowman Date: Wed Aug 27 21:58:08 2008 -0600 Rename dir parameter of axes to align. Check that the sum of all dash lengths is positive. Install pixel.pdf in examples directory. Install silentPrint.js and reload.js in base directory. commit 0f790770ffaeaa8508c85f322745e8c2405abb87 Author: John Bowman Date: Wed Aug 27 21:28:11 2008 -0600 Add surface bicubic spline code (based on code contributed by Oliver Guibe and the method use in Scilab). commit a3aa4c22df9c0bfbd1626379f4a603d70849ea17 Author: John Bowman Date: Wed Aug 27 16:35:04 2008 -0600 Improve the appearance of arrows on cyclic paths. commit 601472905ec1e702f89871b49cf25d3f401c3808 Author: John Bowman Date: Wed Aug 27 16:28:11 2008 -0600 Implement more accurate and efficient version of accel(path3, double). Add missing begingroup3/endgroup3. Fix texengine vs. texcommand confusion. commit 53c8910437384382e8de02f0bd5ba9200a82627f Author: John Bowman Date: Wed Aug 27 15:39:43 2008 -0600 Check for division by 0. commit 4a23a12d76899c342d29e1d0452c7be1b76a90cb Author: John Bowman Date: Wed Aug 27 15:11:48 2008 -0600 Return a unit scaling again when unbounded. commit e37fb5caca7c78b9e88f530caec04e9a41ece07c Author: Orest Shardt Date: Wed Aug 27 14:38:39 2008 -0600 Add header for uint32_t. commit 0444796dae93a99cb289672a23dd2a743ab549a7 Author: John Bowman Date: Wed Aug 27 02:44:35 2008 -0600 Optimize projection routines. Update cube animation. commit efab54ed6c6673db8df6c9af565f70d733f3dbdc Author: John Bowman Date: Wed Aug 27 01:43:40 2008 -0600 Rename keyword. commit 71b99a925bf23a452730458dacd533807ae3591c Author: John Bowman Date: Wed Aug 27 01:32:48 2008 -0600 Update examples. commit b74b79798a55dc0cf45c4cc78c1af1de46f2d763 Author: John Bowman Date: Wed Aug 27 00:59:16 2008 -0600 Try to draw labelled axes on the front boundary. Fix tick directions. Set axis types explicitly since axis members are volatile. commit 63d1e620824e48be38c1cddb7327ea0693be211d Author: John Bowman Date: Tue Aug 26 19:36:34 2008 -0600 Fix path labels. Remove filltype argument from 3D functions. commit 8f8205af5b56fd18077cbbb1bb8e4a5bd659508b Author: John Bowman Date: Tue Aug 26 18:48:43 2008 -0600 Implement 3D dash length adjustment. commit a2d8888a8c56da0288ded34098ee0df6783bf10f Author: John Bowman Date: Tue Aug 26 17:20:16 2008 -0600 Fix granularity; add arrowheadlight(). commit d97cb5a320b7306428c51d410eecd81016df68c9 Author: John Bowman Date: Tue Aug 26 17:18:35 2008 -0600 Make arrowheadlight=nolight by default for non-PRC drawings. commit 761a85828165acffaab4470a86b9b865fc11c283 Author: John Bowman Date: Tue Aug 26 13:41:28 2008 -0600 Move operator * (transform3, triple) to C++ code. Remove align in favour of transpose(transform3); rename transform3 to align. Make arrowhead pen a material. Add arrowheadlight. Add light to PRC draw functions. Check all array pointers. Add operators == and != for pen arrays. commit e4729be39b09068788bb91ce4f02f4dd08cc03f1 Author: John Bowman Date: Tue Aug 26 09:08:01 2008 -0600 Turn off prc flag for documentation builds. commit dac52652851c2e82fc783d4f4a7c0c809976991e Author: John Bowman Date: Tue Aug 26 08:52:08 2008 -0600 Set settings.prc=true by default. Update examples. Check for nullsurface in three_arrows. commit 1a20041faad2f518344cbce7f1a83a43118cdf69 Author: John Bowman Date: Tue Aug 26 08:15:38 2008 -0600 Update example. commit 92d4174af52853cafe91dd47ac44e6b02c1afec1 Author: John Bowman Date: Tue Aug 26 08:00:19 2008 -0600 Add missing file. commit 74c9bb56087292ba86bfd06289c7df288b1f2a26 Author: John Bowman Date: Tue Aug 26 02:07:26 2008 -0600 Speed up 3D graphics by moving path3 to C++ code. Fix 3D bounding box bugs. Remove remaining references to obsolete bbox3 structure. commit 311eecdc5c30b6eb727c8a36c39067d7d1ad1291 Author: John Bowman Date: Tue Aug 26 01:38:13 2008 -0600 Check all three coordinates in path3.bounds(). commit 24e1ad77890db772dbcb88f6beaef7ac24d57a7c Author: Orest Shardt Date: Mon Aug 25 20:45:07 2008 -0600 Add cyclohexane example. commit 86c756d14b4153ab9f706e0b808ba5238a8f2723 Author: John Bowman Date: Mon Aug 25 13:52:20 2008 -0600 Initialize cycle flag. commit e883b0a5b5b3b53a4dc2e63441a05bef682f4a48 Author: John Bowman Date: Mon Aug 25 10:58:46 2008 -0600 Remove duplicate file. commit ade7318c47381953d61941422dc8c3a65a8b01e3 Author: John Bowman Date: Mon Aug 25 10:04:46 2008 -0600 Add settings.thick option for rendering thick PRC lines (default is true). Don't force a mesh to be drawn when nolight is specified. Add Orest's 3D implementation of the Asymptote logo. commit 1eddbf05c1b440abe403a922df18e0302a573854 Author: John Bowman Date: Mon Aug 25 10:01:38 2008 -0600 Use truepoint to attach legend in lineargraph.asy. commit 1b0cfa7dd067ac5a64c8bbd969b60bf38adc2b4e Author: John Bowman Date: Mon Aug 25 03:01:16 2008 -0600 Set both axis types; use symbolic values. commit b1859212d229e190dbca01f94a3427bb53e80f6c Author: John Bowman Date: Mon Aug 25 01:59:44 2008 -0600 Update grid3 to handle Arrow3. Use limits in grid3xyz. commit 738cc4b59239d0f8ab8bc773c777bc127a59f8b0 Author: John Bowman Date: Mon Aug 25 01:11:07 2008 -0600 Use all control points to compute normal vector of surfaces. commit 055eb28cec633c0cdd2f3076a109af7b0fbceb54 Author: John Bowman Date: Sun Aug 24 20:28:36 2008 -0600 Remove unused code. commit 4456085abb8e068d31266ae50ac0cae4485f816e Author: John Bowman Date: Sun Aug 24 14:44:13 2008 -0600 Improve arrow bounding box calculation. Fix 3D arrow positioning. Retune anglefactor for RPC angle calculation. Pass the correct size information to scale and scale3 when resizing. commit 98d4cfccd4abc5a1516e4c0d5f11e0c3f1760831 Author: John Bowman Date: Sat Aug 23 13:58:27 2008 -0600 Implement unitdisk and linecap(0) and linecap(2). commit f8cbc466a67238c45d1917efb200156b896adf35 Author: John Bowman Date: Sat Aug 23 12:21:52 2008 -0600 Support linecap(1) in 3D. Fix PRC mode. commit ef8a94774f4620dde9cfa7605768cbc4491d2c27 Author: John Bowman Date: Sat Aug 23 03:46:16 2008 -0600 Add support for 3D arrows. Set uptodate=false in picture.add. Implement better workaround for missing movie15.sty. commit 01229d149a8e23e88a4ef0ca47f49943f6c06afd Author: John Bowman Date: Sat Aug 23 00:51:45 2008 -0600 Update example. commit f675c8d5343a34eae81c87f68c0c6a35d5fbd145 Author: John Bowman Date: Sat Aug 23 00:46:57 2008 -0600 Implement better workaround to allow nonPRC 3D output in the absence of the movie15.sty package. Rename unitcube to unitbox. Define surfaces unitplane and unitcube. commit a11ac7d619bf15c9ade7661519814172df3119c1 Author: John Bowman Date: Fri Aug 22 23:59:35 2008 -0600 Define pen thin=linewidth(0). Use thin pen by default for mesh lines and skeletons. Generalize revolution constructor based on a graph. Use operator .. in hyperboloid example. commit 207f2d6bf5be358f2949bbdc5fca55db4f535266 Author: Orest Shardt Date: Fri Aug 22 17:47:12 2008 -0600 Fix logo3. commit f7573e67c6c3d1b65551f3b291216481afb8bcfa Author: Orest Shardt Date: Fri Aug 22 17:44:20 2008 -0600 Fix logo3. commit c870f00968b792a0c61a688d2972d8a48d74d9b7 Author: Orest Shardt Date: Fri Aug 22 15:44:28 2008 -0600 Add 3D logo. commit 92df46fa4db0237c2511f627ee2cfa69ce1eba53 Author: Orest Shardt Date: Fri Aug 22 14:21:48 2008 -0600 Improve debugging output. commit 6ebe46c87e42ef22c1e88aa2d04ccbdf9910e18c Author: John Bowman Date: Fri Aug 22 12:35:50 2008 -0600 Use curved slices in solids; reduce the default value of nslice to 12. Standardize solids interface. Fix determinant of align and transform3. Use larger sphere fuzz in tube. commit 83f125398f6f857054569db99512ba0d3f9d7fd2 Author: Philippe Ivaldi Date: Fri Aug 22 08:28:54 2008 -0600 grid3.asy: set default value axis in routine (x/y/z)axis3. commit 7fca21059f9d2d9a2d89778f6eacea74b1de88f3 Author: Philippe Ivaldi Date: Fri Aug 22 08:18:27 2008 -0600 grid3.asy: Renames (Left/Right)Ticks (Left/Right)Ticks3 for consistency. Remove an unnecessary parameter. commit c8146e82c886e7e5691b6842466f436a5b1a8e83 Author: John Bowman Date: Fri Aug 22 01:40:52 2008 -0600 Fix yaxis3 placement. Fix 3D Arc and Circle. commit 7db52703cde3155efa2ce2eed0f8a524f2b4ad90 Author: John Bowman Date: Thu Aug 21 21:09:26 2008 -0600 Add PRCVersion. Work around compiler bug in gcc-3.3.5. commit d62fb8642129bb4d34844728cd1dbc8f21bc9b77 Author: Orest Shardt Date: Thu Aug 21 18:54:51 2008 -0600 Add test for straightness. commit 21ba9cf29583e4baa406cb01e94a2f7ad5603d7b Author: John Bowman Date: Thu Aug 21 09:54:29 2008 -0600 Use unit normals in circle and Circle. commit 661565780cc9b816aa5785e1f7da8408e0c5cc25 Author: John Bowman Date: Thu Aug 21 09:44:34 2008 -0600 Suppress page numbers for TeX engine; also suppress hoffset and voffset in inlinetex mode. commit c86a28332ca26f76ac47abc85a1f2a041952803f Author: John Bowman Date: Thu Aug 21 09:43:15 2008 -0600 Set straight only if no internal patch points are given. commit 902ec3ab6901d6b365edf4b4d2659aa6a1523194 Author: John Bowman Date: Thu Aug 21 03:48:06 2008 -0600 Increase Fuzz to sqrtFuzz in min(surface) and max(surface) C++ routine. Expose granularity parameter to PRC surface drawing routines. Put PRC surface pens and parameters in a material structure. Add straight flag to surface. Speed up thick line drawing by optimizing straight case. Optimize align(triple) and implement its inverse, called transform3(triple). commit bf1a4f5d240e06f134f746d324e47e6cf548c4e7 Author: Orest Shardt Date: Wed Aug 20 22:12:16 2008 -0600 Add check for -X direction. commit e3d6c0b0a8e7862826b6fc85185eb266ee71cf9f Author: John Bowman Date: Wed Aug 20 20:31:24 2008 -0600 Add hook for thick line PRC support. commit c41b0dd60bc8ff3baf506028769117f33f7b47f0 Author: John Bowman Date: Wed Aug 20 17:30:04 2008 -0600 Make linewidth(0) draw the thinnest line supported by the output device. Redefine nullpen to linewidth(0)+invisible. Remove duplicate code. commit 883cb57bca8fbc8f1b7b42543c495c5494cf2f67 Author: John Bowman Date: Wed Aug 20 15:45:25 2008 -0600 Remove extra node from Circle. Add additional surface constructors. Fix transverse skeleton when angle2-angle1 < 360. Make contour3 return a surface. commit 2d191394180b19a0065f7bb3e9dc5f5575bf2bbe Author: John Bowman Date: Wed Aug 20 10:06:35 2008 -0600 Fix Circle and Arc so that they are consistent with circle and arc. commit f558c14315daf2e7fe4181f1751ea8a0362dc4f1 Author: Orest Shardt Date: Wed Aug 20 09:50:53 2008 -0600 Add 3d support for thick lines and arrows. commit 1205eab243d14b10b0ec06e934d836e499e24066 Author: John Bowman Date: Wed Aug 20 03:52:42 2008 -0600 Remove implicit casts from 3D to 2D objects (call project explicitly instead). Overhaul graph3 and grid3 to draw directly in 3D, keeping track of the picture bounds with an interface analogous to the graph2 routines (backwards incompatible). Update contour3 and solids to use new PRC-compatible surface drawing routines. Fix and optimize 3D fitting routines. Fix label bounds. Add functions XY(), etc., to force labels to be upright. Fix invert routine by adding missing shift terms. Make uptodate apply only to currentpicture. Add warn=true argument to solve routines. Simplify flowchartdemo deferred drawing. Move binary space partition code out of three.asy and into bsp.asy. Add operators == and != for real[][] and path3. commit 3ee40d06b68b7082d3f0bd190339eacbc0d398d0 Author: John Bowman Date: Mon Aug 18 01:39:15 2008 -0600 Fix align.is3D flag. commit e0dc3ef17525bfaf071a43826d8d8d52b80c4bee Author: John Bowman Date: Mon Aug 18 01:03:08 2008 -0600 Fix Label diagnostic. commit 4afeb46e9c984b712cbefb568c5b1020bbff0c02 Author: John Bowman Date: Sat Aug 16 12:43:32 2008 -0600 Use settings::outname instead of "out". commit 69507f82fb36dc8a4590e203297b344c53266a47 Author: John Bowman Date: Fri Aug 15 15:08:27 2008 -0600 Fix 3D label sizing. commit 0b5fc01e8e8f65f6a39f42301fc0e0e28045e81d Author: John Bowman Date: Fri Aug 15 14:57:09 2008 -0600 Add operators == and != for path3. commit a76c0951b5de7b43451814fc4f5b9faad55a5dec Author: John Bowman Date: Fri Aug 15 01:13:17 2008 -0600 Use currentprojection by default in min3(picture) and max3(picture). commit ee9b80648f19ae5a9f6b5b206a17b7876857ddfa Author: John Bowman Date: Fri Aug 15 01:02:58 2008 -0600 Remove width and height parameters from embed(picture). In embed(picture), avoid unused 2D bounding box calculation in final call to pic.fit3(). Add embed options to shipout. commit ea9694079a050e7d830d741945d5ab77e6cb2359 Author: John Bowman Date: Thu Aug 14 12:12:57 2008 -0600 Add drawer3 routine that works with pictures instead of frames. Make randompath(n) return a path of length n. Fix and optimize camera transforms. commit 655af38609bfaf91e61e71874138e5037e5b905d Author: John Bowman Date: Thu Aug 14 01:42:05 2008 -0600 Remove remaining "camera too close" messages (no longer needed). commit 2deae6857ebd44ab0b9a43c9849b1d41b49e6b71 Author: John Bowman Date: Thu Aug 14 01:28:15 2008 -0600 Reinstate add(drawer d) function. commit 5a6a1a5c9115b8b8b6785290d9084af15d78996a Author: John Bowman Date: Thu Aug 14 01:12:24 2008 -0600 Add path3 copy constructor. Automatically adjust camera so that entire picture is in front of camera. Add projection argument to shipout. Add min3(pic) and max3(pic) functions. commit 8f2da013574b71990d98eb06778fcfdda372f532 Author: John Bowman Date: Wed Aug 13 08:32:00 2008 -0600 Move projection and picture argument (for double deferred drawing) to drawer3. Fix duplicate calls to tensorshade. Re-enable surface transparency. commit 6cdca45ed0dd7312015b6e60eaa0fe8b15975458 Author: Orest Shardt Date: Tue Aug 12 12:47:25 2008 -0600 Optimize 3d reflection routine. commit be63e490786a206c62cdb4af30e09bf41da300e1 Author: John Bowman Date: Tue Aug 12 09:50:14 2008 -0600 Add realmult(triple,triple). Remove "camera too close" checks. Fix randompath; add randompath3. Add draw(frame,surface) routine. Allow align parameter of Label to be a triple. Make size(picture) return max(pic)-min(pic), as with frames. commit 222a3cab12ff9114fa52a227ed3faaa0409424d7 Author: John Bowman Date: Sun Aug 10 10:48:32 2008 -0600 Add general T[] sort(T[] a, bool compare(T i, T j)) function. commit 573e37cb623310e272858a2f65128b325e71de11 Author: John Bowman Date: Sat Aug 9 08:40:53 2008 -0600 Don't call surface mesh if meshpen == invisible. commit 0f23f79e9d07cbcde959199a6aeff9c88c2d1142 Author: John Bowman Date: Sat Aug 9 00:04:52 2008 -0600 Increase fuzz in min(surface,projection) routine. commit 767e21e544b3fe7352d398e39fb7f387a1ea2416 Author: John Bowman Date: Fri Aug 8 20:01:30 2008 -0600 Fix picture min/max functions. commit 3f8c1151ef1273b72d6ea8d27fd54c151fffcd62 Author: John Bowman Date: Fri Aug 8 19:53:22 2008 -0600 Fix PRC angle computation. Rename reload to pdfreload (now disabled by default); add pdfreloadOptions. Fix empty picture check in max/min. Move default 3d embedding settings to defaultembed3options variable. commit b0ec65b473aa24a1ffabbb82902bcefb99ea7292 Author: John Bowman Date: Fri Aug 8 02:24:25 2008 -0600 Fix empty tests in picture min and max routines. Fix projection in draw(surface). commit 93bcfd14f694222d414d8a4d26b8321284067479 Author: John Bowman Date: Fri Aug 8 01:57:04 2008 -0600 Compute PRC lens angle based on projected picture size. Support lens angle in viewpoint. Simplify embedprc options. commit 3759de7b679583a31118894d55075a46981581ec Author: John Bowman Date: Fri Aug 8 01:40:15 2008 -0600 Fix handling of null deliminted entries in split. commit 84a6f609c8e0e67fb037cace6fe194132e0cd9d6 Author: John Bowman Date: Thu Aug 7 23:28:33 2008 -0600 Fix scale and scale3. commit f42c1b7739e338f8ccb21d5df852ca180b23e7e5 Author: Orest Shardt Date: Thu Aug 7 11:54:41 2008 -0600 Optimize routine for rotation of axes. commit 2c9ed33e906d3cf5e0aa57445790e466e387b5b9 Author: John Bowman Date: Wed Aug 6 14:55:45 2008 -0600 Support meshpen in PRC mode. Avoid duplicate drawing due to inexact bounds. commit 01c5a0080e83e611a0cb5debf81c0907d6d42ab4 Author: John Bowman Date: Wed Aug 6 12:46:50 2008 -0600 Fix supplementary scaling routines. commit 4e64395903561ef7486ec179682b75f29ffb0914 Author: John Bowman Date: Wed Aug 6 12:45:43 2008 -0600 Fix projection transformations. commit 0b72327d31993adc1efe88955facfc1463f5805f Author: Orest Shardt Date: Wed Aug 6 09:53:23 2008 -0600 Fix uint32_t cast. commit daedf0162e1c4ea3829a1b8e616fd718e67b00cc Author: John Bowman Date: Wed Aug 6 08:51:30 2008 -0600 Cache return values of texpath. commit 0f4ea94250d087680f10a7a4d0b86e2aaf8a5341 Author: John Bowman Date: Wed Aug 6 08:16:37 2008 -0600 Apply submitted drawtree patches (Bug IDs 2031338,2031368, and 2031511). commit 714ae4d089cb954f0bc6bd0980a9c48a8f0a8ea0 Author: John Bowman Date: Wed Aug 6 00:57:49 2008 -0600 Remove obsolete call to aspect. commit 5b47296cd82f9f65497b67217ec2e57ec201286a Author: John Bowman Date: Wed Aug 6 00:47:52 2008 -0600 Temporarily revert change to allow svn builds. commit ecb402bacf5601c42ebd518501164228b6f7027b Author: John Bowman Date: Wed Aug 6 00:36:59 2008 -0600 Remove obsolete aspect ratio support from projection routines (use size3 instead). Move diagonal(... real[] a) to runtime code. Add support for alternative PRC materials in surface routines. By default draw 3D labels without lighting effects. Add extra options string to PRC embed functions. Add min3(pen) and max3(pen) functions (only a spherical pen nib is currenty allowed). Remove unused cap functions from plain_picture. Fully implement drawerBound3 routines. Fix transform3 initialization in Label. commit 9de76b20a8db18d9ea9f60ee74891c64bf3d0feb Author: Orest Shardt Date: Tue Aug 5 19:09:40 2008 -0600 Add support for materials in prc. commit 488767e5f7b07a89e6be170a0b5b8ad64c689c0f Author: John Bowman Date: Tue Aug 5 11:12:08 2008 -0600 Make reload load the document if not already active. Improve documentation. commit 901d4f700ef6f5e185cf331b09ad88ee5379f01e Author: John Bowman Date: Tue Aug 5 10:48:27 2008 -0600 Avoid arbitrary default values; set line width to zero since that appears to be the only value implemented by Adobe Reader 8.1.2 and 9.0. commit 309998ffdd956d628adc06785202738d63fd60b3 Author: John Bowman Date: Sun Aug 3 19:50:06 2008 -0600 Support ASYbase in texpath. commit 0ffc48041c612ce5d2e56557ecb69b66f38308c3 Author: John Bowman Date: Sun Aug 3 01:26:56 2008 -0600 Remove quotes from viewerOptions. Optimize piecewisestraight. commit e007b5a8754e64932088592e9f64d576c792d329 Author: John Bowman Date: Sat Aug 2 22:49:09 2008 -0600 Fix straight flag in drawprc. commit e07d8cc9d55e09a26e121fbb918eccd2d3348274 Author: John Bowman Date: Sat Aug 2 22:37:56 2008 -0600 Set straight flag on transformation. commit 1187a1667ce9cf1608e622b8883160d08cce0389 Author: John Bowman Date: Sat Aug 2 20:34:36 2008 -0600 Automatically embed option defaults into descriptions. commit 6e8b02403e60c611139434cfa5b149bb15757f73 Author: John Bowman Date: Sat Aug 2 18:01:40 2008 -0600 Only attempt reload if acroread process is already running; add reloaddelay parameter. commit 8d276fe6595dc91f0d0a0e62c2df506f9df7d25b Author: John Bowman Date: Sat Aug 2 16:18:12 2008 -0600 Add unitcylinder. commit 414782b6cd41885dd4cc39c2dacc4ff581b92f21 Author: John Bowman Date: Sat Aug 2 14:19:23 2008 -0600 Add code to automatically reload pdf files in viewer if settings.reload=true (requires manual installation of reload.js in ~/.adobe/Acrobat/x.x/JavaScripts/). Add psviewerOptions and pdfviewerOptions. commit 160a605a243191fca83ee05c870f7b8a643f0fd0 Author: John Bowman Date: Sat Aug 2 14:11:23 2008 -0600 Simplify solid line pattern. commit 4ed6ac0aac1d82ecb84678a769694ec38367c0cc Author: John Bowman Date: Fri Aug 1 16:59:59 2008 -0600 Fix -psimage -tex pdflatex. commit 21a5a0672220c4743065507eb33e95cb165b7d77 Author: John Bowman Date: Fri Aug 1 15:10:30 2008 -0600 Remove interfering comments; change psimage timeout to 60 seconds. commit c5141442715a3aadfd754fc5448d531d7867ed35 Author: John Bowman Date: Fri Aug 1 10:36:55 2008 -0600 Rename print.js to silentPrint.js; move all other Javascript commands to asy code. Check whether silentPrint is defined. Fix texengine(true). commit 046a88b4bd37306e0d0ecebbe429dd213a3ca51c Author: John Bowman Date: Fri Aug 1 01:58:03 2008 -0600 Add print.js; this should be put in ~/.adobe/Acrobat/8.0/JavaScripts/. Make -psimage give up on waiting for Adobe Reader to finish after 30 seconds. commit b78d73947601327af0a11e92bdd382f8396a6b18 Author: John Bowman Date: Fri Aug 1 01:43:50 2008 -0600 Add -psimage option to dump rasterized postscript image of PRC scene. Force texpath to use latex/tex engine even with -tex pdflatex and -tex pdftex; add texdvicommand to specify an alternative latex/tex to dvi program. Use correct output prefix for intermediate PRC files. commit 7fc7a09c48a5144cc52481165eaf5ebe73f6de30 Author: John Bowman Date: Thu Jul 31 22:23:29 2008 -0600 Remove bulge from unitcube. Implement nolight with boolean variable. Fix sizing of transformed 3D pictures. commit 8fd6b0873e9fbcc1576b9a6bf1241c5cdcd9f5af Author: John Bowman Date: Wed Jul 30 13:14:02 2008 -0600 Use portable constructor for BooleanVar. commit 25ef61001ed9899ec67d813f2d9fb3ceb478e3db Author: John Bowman Date: Wed Jul 30 12:59:23 2008 -0600 Move xasy.conf into ~/.asy directory. commit 22e5cc8c9eaffdd4d7d75e87c9d75fc101597353 Author: John Bowman Date: Wed Jul 30 11:02:46 2008 -0600 Allow separate 2D and 3D picture sizes. Use double deferred drawing for 3D projection to allow control of the 3D aspect ratio and also the width and height of the final projected picture. Remove obsolete cycle3 variable. commit 3bb43749d5c5ca8a475b98f51cff2fbe93d89410 Author: John Bowman Date: Tue Jul 29 16:56:42 2008 -0600 Typeset 3D labels onto projection plane by default. Fix roll computation. Add transform3(triple u, triple v) that maps (X,Y) to (u,v). Add solidcone. commit 323f2d45bd37156a4b4abdf240f001026925947f Author: Orest Shardt Date: Tue Jul 29 14:47:55 2008 -0600 Use cleaner icons. commit 41dc906cbf1b9cdaabcae254a1c44c03539849e1 Author: Orest Shardt Date: Tue Jul 29 12:40:49 2008 -0600 Fix typo. commit 5973e480d9fa04eaff3c8d0b6427672a04f60ea3 Author: Orest Shardt Date: Tue Jul 29 12:38:40 2008 -0600 Describe scene display parameters. commit e6cf737d99947537e211a0ded7ff33ee85feec10 Author: Orest Shardt Date: Tue Jul 29 10:30:42 2008 -0600 Do not freeze while waiting for external editor to close. commit 58725ca2426ded56c568739c3c19df9e6c44655f Author: John Bowman Date: Mon Jul 28 23:53:30 2008 -0600 Fix hang in surface bbox routines. commit e33a8771b9b2d14c1297c68d58f749bea56e8dca Author: John Bowman Date: Mon Jul 28 23:04:58 2008 -0600 Add unit cone. commit 1d18572e5681a912ccad4d8a26b05c0595b4f4a6 Author: John Bowman Date: Mon Jul 28 07:47:31 2008 -0600 Add support for path3 Labels. commit 8ea1129b09d97c7dc2256bc73a91cb1f0822f3ff Author: John Bowman Date: Sun Jul 27 23:09:39 2008 -0600 Fix generation of asy-keywords.el. commit 33386b3f64bb669c90a01e6e617c070c60b97e4e Author: John Bowman Date: Sun Jul 27 22:57:25 2008 -0600 Defer projection of 3D (non-prc) pictures until drawing time. Express currentprojection in terms of user (picture) coordinates. Add missing tensorshade functions. Add casts from object to label and object to frame. commit 02caeaea31659c23bd37b7ad7d43b3d949eba863 Author: John Bowman Date: Sun Jul 27 21:30:54 2008 -0600 Add locale() function to query/set current locale. Add locale string to format(string s, real x). Add string(int) function. Fix locale issues. commit d5d14abe253106269ddfc14c47364ca593572533 Author: John Bowman Date: Sun Jul 27 16:02:26 2008 -0600 Make string(real, int digits=realDigits) use fixed notation. commit ee69ce258d507924f18dd0e7563b7ebfd3f6122c Author: John Bowman Date: Sun Jul 27 00:12:38 2008 -0600 Add three-dimensional Label support. Support adding a three-dimensional frame to a picture (positioned at the origin). Remove three-dimensional add functions in favour of embed. commit d283edb251ce48f1ae6e725315125b72f0976794 Author: John Bowman Date: Sat Jul 26 18:22:39 2008 -0600 Rename surface.asy to three_surface.asy and light.asy to three_light.asy. commit 6876aae1ec52058ff36530fc225880132314cdba Author: John Bowman Date: Sat Jul 26 18:15:03 2008 -0600 Move surface max and min functions to C++ code. Fix three-dimensional label functions. Implement unitsphere as an 8-patch Bezier approximation. Add three-dimensional dot functions. Include surface.asy and light.asy in three.asy. Remove casts from triple to pair and triple[][] to patch. Fix surface normals. commit f76993c733c494f63052fee8650f2a0325a8388d Author: Orest Shardt Date: Sat Jul 26 08:14:27 2008 -0600 Preserve original path's direction for each new region created. commit 2df9113fb0760d067135027d79d0da53aefa30db Author: John Bowman Date: Fri Jul 25 16:53:29 2008 -0600 Fix removeDuplicates. Simplify uncycle. commit 7fc100ae6a07e36590bdc40fc58b896a3899c5cb Author: John Bowman Date: Fri Jul 25 15:38:43 2008 -0600 Use DBL_MANT_DIG for recursion depth limit. commit e7394489eec585a15358f2a1942233ec42a3d6af Author: John Bowman Date: Wed Jul 23 02:16:40 2008 -0600 Generalize picture to handle 3D objects. Rename surface to patch; implement a surface structure to hold an array of patches. Implement simpler, faster surface bounding box routines. Add -prc setting (temporarily set to false) to enable prc output. commit ad0b2823a741e2bdc1ff2ad0cecb92ba16c8f979 Author: John Bowman Date: Wed Jul 23 02:09:52 2008 -0600 Add randompath function. commit 80f81d13ed3bb8984183e431020ada1c7c2229eb Author: John Bowman Date: Wed Jul 23 02:02:59 2008 -0600 Fix height and width units. commit 20076a17a54128ea455d608a52a83cda9acb823c Author: John Bowman Date: Mon Jul 7 00:43:29 2008 -0600 Use bounding box rather than less efficient convex hull test in inside. commit cb11a56fdc8982ab5e88dfa24bdd13e3e74b4fb5 Author: John Bowman Date: Sun Jul 6 22:52:29 2008 -0600 Remove obsolete file. commit 8df94eb01841188da1e38f77073168c8dbe42683 Author: John Bowman Date: Sun Jul 6 17:23:42 2008 -0600 Support compilation of gc-7.1 with gcc-4.3.1 on FreeBSD 4.10-RELEASE-p2. commit 78ad79d4c0038a286eab64e138fd38ba65207ee7 Author: Philippe Ivaldi Date: Sun Jul 6 14:40:28 2008 -0600 Fix the documentation of quarticroots. commit 35a635d26382f0ccb9b552fc7bb824cb343c5233 Author: John Bowman Date: Sat Jul 5 22:21:50 2008 -0600 Minor optimization. commit 367e8ebd63efd180493a68a44eb56ec53c8c071c Author: John Bowman Date: Sat Jul 5 22:11:36 2008 -0600 Remove HAVE_TRIANGLE configuration. commit d5547e4ec09ec39499bcdc8300c226ed9307d524 Author: John Bowman Date: Sat Jul 5 22:05:42 2008 -0600 Port prc code to cygwin. commit 404a75f09df81099bdb9e973dd306111a636f0c7 Author: John Bowman Date: Sat Jul 5 14:11:53 2008 -0600 Port version changes to msdos. commit 31e3f4fafe9fae62ed71b74f3994eb8be7643bac Author: John Bowman Date: Sat Jul 5 13:47:51 2008 -0600 More version fixes. commit 14369b9cfc2fbc21951d3bcc41e14411cccc6e18 Author: John Bowman Date: Sat Jul 5 13:32:18 2008 -0600 Fix version.texi; cleanup temporary files. commit e04d51ef715883a69e1eae296e899f2da8c0a1d5 Author: John Bowman Date: Sat Jul 5 12:54:47 2008 -0600 Add prc dependency. commit bfdc8376f8e2b22b6cb58fa43b3cc71af5f1b084 Author: John Bowman Date: Sat Jul 5 12:52:54 2008 -0600 Create empty svnrevision.cc by default to force update. commit 2f80208862aa04acc1b869ba6be16466d3e4c0cc Author: John Bowman Date: Sat Jul 5 12:42:22 2008 -0600 Remove support for external triangle.shar.gz package now that Delaunay.cc is fixed. commit 1578efdf744d9881bc40a676bac6b848885e156d Author: John Bowman Date: Sat Jul 5 12:26:50 2008 -0600 Include svn revision in version strings. commit cd52c344b783552066e47d77855f1ba0e225cd8f Author: John Bowman Date: Sat Jul 5 11:08:28 2008 -0600 Fix supertriangle computation. commit 3a600d47091011a1a396cbbe73865685a03674ab Author: John Bowman Date: Sat Jul 5 01:32:21 2008 -0600 Add bezier triangulation routines (developed by Orest Shardt). Add support for filled fonts. commit 8422b776c2a1bb3b6e99ffd09eed39a57fad68b3 Author: John Bowman Date: Sat Jul 5 00:37:42 2008 -0600 Fix surface constructor to handle all four intersection cases. commit c2839ecad3c5bb6dea5450bc6765a99fc19eda04 Author: John Bowman Date: Fri Jul 4 15:35:03 2008 -0600 Generalize planar surface constructor to handle a single interior intersection. commit c5e611c89317048f58c01c6fca08420f5cd9c189 Author: John Bowman Date: Fri Jul 4 11:29:01 2008 -0600 Fix check in windingnumber for points on path. commit a4a9a9696f4460a31a0fc817873e72e6098cbc2d Author: Orest Shardt Date: Fri Jul 4 09:56:19 2008 -0600 Fix parameterization interval of PRCline. commit 3866af07751efe3def9fd837c80439b45e0778a0 Author: John Bowman Date: Fri Jul 4 01:09:09 2008 -0600 Add constructor for a (possibly) nonconvex cyclic path that returns an array of surfaces. commit ccb28f918c69c71aa3ea116690974a917add785f Author: John Bowman Date: Thu Jul 3 23:55:01 2008 -0600 Suppress output by size when picture is empty. commit 2a5ea45ee0b656e87e4d71b8ca5185a4fb2fbaf0 Author: John Bowman Date: Thu Jul 3 23:25:31 2008 -0600 Check for coincident subpaths in path.cc to avoid infinite loops. Define restricted int undefined to the the largest odd integer (returned by windingnumber for points on the path). Update documentation. commit 982ba5c059237d9cea33e4b10a699c85384498ce Author: John Bowman Date: Thu Jul 3 15:46:32 2008 -0600 Make windingnumber(g,z) return the largest odd integer when z lies on path g. Make inside return true for points on the boundary. commit 5b165379ca3eaba5cbcbc1be79de33d162d88440 Author: John Bowman Date: Wed Jul 2 15:03:55 2008 -0600 Revert to original version of cubicroots to handle the case where one of the first two roots is near zero. commit 9db5f20ac51580e1246da314b548940486db8c32 Author: John Bowman Date: Wed Jul 2 12:57:21 2008 -0600 Update example. commit ef2aed565e623ce114dc3b95b0e27f5012eabbfa Author: John Bowman Date: Tue Jul 1 22:29:10 2008 -0600 Minor simplification. commit 7f6e70feef498ff8850c3170ca092ce67948ff76 Author: John Bowman Date: Tue Jul 1 20:27:06 2008 -0600 Fix AsyPDF flag. commit a7ae860cfccad51f5ea1b68f41797c37b43ebc4c Author: John Bowman Date: Tue Jul 1 20:11:33 2008 -0600 Support clipping with tex and pdftex TeX engines again (broken since 1.34-26). commit fc997e3d2e29aff462512e06fe045ed3372e1c66 Author: John Bowman Date: Tue Jul 1 20:08:52 2008 -0600 Support xelatex. commit 019c0793143aa77f80ebaa7238b521bf7a614909 Author: John Bowman Date: Tue Jul 1 00:19:54 2008 -0600 Leave cubic root refinement to the user, to avoid potential root interchange problems. commit 9183d9faeb41cb12332b0e63c8d47a83060f60e8 Author: John Bowman Date: Mon Jun 30 22:27:13 2008 -0600 Implement robust inside algorithm based on conditional subdivision and robust orient2d predicate. commit 0ee41c80a2f20c06ac36ceec99df87f8c1b59439 Author: John Bowman Date: Mon Jun 30 17:51:39 2008 -0600 Add option to force PDF output. commit 24dbc91d612d00bea406763efba85f802ea3ee33 Author: John Bowman Date: Mon Jun 30 08:51:03 2008 -0600 Add side and incircle functions. commit ad7a5ca602f3ff77da61d8ecc6dd9b7af30b16b7 Author: John Bowman Date: Sun Jun 29 17:57:25 2008 -0600 Minor optimizations. commit d57cce192cc1c5a390d58c68bf7e3a07901844b2 Author: John Bowman Date: Sun Jun 29 16:33:57 2008 -0600 Correct typo. commit 8aeb44ff5525fdf55e4143b9b77205112b036e59 Author: John Bowman Date: Sun Jun 29 16:30:53 2008 -0600 Fix segmentation fault in default Delaunay triangulation routine. Use Shewcuk's exact predicates in Delaunay triangulation. commit b8d7d2e8f2ea5e5dfefade3caab02bb53d78b7fe Author: John Bowman Date: Sat Jun 28 23:16:00 2008 -0600 Fix incorrect array size documentation of Delaunay.cc that can lead to a segmentation fault. commit c9952eb8c85cc44da35821610563601c6289f6c0 Author: John Bowman Date: Thu Jun 26 00:01:50 2008 -0600 Minor optimization. commit 0ee04f17646c1de38a0ff508303f2c4d1b2a87e5 Author: John Bowman Date: Wed Jun 25 23:19:25 2008 -0600 Try to refine calculated cubic roots with Newton-Raphson iteration. commit 2ad1cec486027bc80ae21d1ba0b5b3f13b8f70dc Author: John Bowman Date: Wed Jun 25 22:40:12 2008 -0600 Simplify cubicroots. commit 4a7b065aa93db97935627739c00326760e7d4a58 Author: John Bowman Date: Wed Jun 25 17:00:22 2008 -0600 Replace ytimes by real[] mintimes(path) and real[] maxtimes(path). commit 9642646492c918276ac2f318c44e07e4c359288a Author: John Bowman Date: Wed Jun 25 16:24:22 2008 -0600 Generalize last fix to an arbitrary axis. commit e2610105e22d30b816c9bb381e411ca323405f93 Author: John Bowman Date: Wed Jun 25 15:04:03 2008 -0600 Handle degenerate cases. commit f06bc755f427058119162f162f1043e6363b67d1 Author: John Bowman Date: Wed Jun 25 00:38:12 2008 -0600 Increase fuzz. commit 473e70480321251eac19268682b7125cf06556b2 Author: John Bowman Date: Wed Jun 25 00:27:11 2008 -0600 Fix numerical resolution problem in windingnumber. commit dfe3717ab63b45d9417603fa1ed12c41ba57e745 Author: John Bowman Date: Tue Jun 24 23:45:50 2008 -0600 Fix relative vs. absolute fuzz. commit cc289caf34ad10914fed9c4d8e6fa4fed9e1fc41 Author: John Bowman Date: Tue Jun 24 23:03:37 2008 -0600 Adjust fuzz to fix remaining resolutions problems in windingnumber. commit bb8f1d22492b52bc0d67781556563402bbcc1053 Author: John Bowman Date: Tue Jun 24 22:36:22 2008 -0600 Reinstate deleted function. commit c13dd963a9146bfb4c185c3aea5ebe3f5314daec Author: John Bowman Date: Tue Jun 24 22:31:12 2008 -0600 Remove dir(path,real,int) since it is only needed internally. commit fdcf601224198de809d246db57de6c07d144ec76 Author: John Bowman Date: Tue Jun 24 22:20:09 2008 -0600 Reinstate old inside function. commit a207300ee6c5fe5ba269c3b32cca7b97df7d25e3 Author: John Bowman Date: Tue Jun 24 17:53:38 2008 -0600 Use lineintersections routine to implement inside. commit bf30f081e382e7c8be0a21aa7740efb40255ef41 Author: John Bowman Date: Tue Jun 24 10:35:12 2008 -0600 Fix windingnumber by using robust predir and postdir functions. Expose dir(path,real,int). commit d063ba0e8ec6ee997f97f6d7fd3d16e726437cd4 Author: John Bowman Date: Mon Jun 23 23:42:18 2008 -0600 Add real[] ytimes(path g) function to return times at which path g reaches its minimum and maximum y extents. commit 68dba699cbba078b15ac7eb7a019da3adb65715f Author: John Bowman Date: Mon Jun 23 22:40:14 2008 -0600 Consolidate bounding box code. commit ecf2d58e5f9978e892ce839ef76ba9b16cd4e696 Author: Orest Shardt Date: Mon Jun 23 18:04:57 2008 -0600 Correct handling of uncompressed files. Add enums to PRC.h commit 42788226294536aeacb5ad384b3dbf0c6eed2eab Author: John Bowman Date: Mon Jun 23 17:48:23 2008 -0600 Increase minimal fuzz in intersections. commit cca5841adf415573f09131f10bfca3cd59e5dd54 Author: John Bowman Date: Mon Jun 23 15:03:49 2008 -0600 Increase fuzz to improve detection of roots at numerical infinity. commit d372e260f74e03df30e5d06f5f5f33330598471c Author: John Bowman Date: Mon Jun 23 11:18:40 2008 -0600 User -dSAFER also for deconstruction into png format. commit 407a627a5d18b773739a9535b486b8a177dd7c49 Author: John Bowman Date: Mon Jun 23 11:00:40 2008 -0600 By default run gs with -dSAFER. commit 450e6baca04165268c9a3d6201fb9b7b67e162ed Author: John Bowman Date: Mon Jun 23 00:41:43 2008 -0600 Fix typo. commit c6b4740c7cae67a452bc2587106948668d648525 Author: John Bowman Date: Mon Jun 23 00:31:13 2008 -0600 Update link. commit 176d2bf970fcdb8b84c74c730b68176a8d433ff6 Author: John Bowman Date: Sun Jun 22 23:26:30 2008 -0600 Merge C++ intersect and intersection routines. Optimize intersection routines for paths containing straight segments. Add function real[] intersections(path p, pair a, pair b, real fuzz=0) to return all intersection times of path p with the (infinite) line through points a and b. commit 3cebe7e04213749fd8aff24514b71a98e2c38ce1 Author: John Bowman Date: Sat Jun 21 19:24:45 2008 -0600 Fix -listvariables. commit 54f25c1c47cf57223211c9a6cde1067ef3275275 Author: John Bowman Date: Sat Jun 21 14:46:23 2008 -0600 Use new intersection routines; handle degenerate cases. commit ba91a4a0fbca4fe8b013ff96b2796737a1133bdb Author: John Bowman Date: Sat Jun 21 14:36:53 2008 -0600 Use a process-specific currentpen. commit fb9a1be407eb4530c7a0522cf8e376bec91b858d Author: John Bowman Date: Sat Jun 21 12:24:39 2008 -0600 Update example. commit 7e3bc9afe99559d02e62060cc32b2eff8e520c90 Author: John Bowman Date: Fri Jun 20 22:49:58 2008 -0600 Fix roll parameter. commit a3a9791aaa03745c4d330db56aa68b8f618da00a Author: John Bowman Date: Fri Jun 20 19:34:56 2008 -0600 Rename intersectionsline to lineintersections. commit 7405937a0cbcb22ab0126eafa9fdd01851e96334 Author: John Bowman Date: Fri Jun 20 16:56:05 2008 -0600 Fix and standardize new intersection routines. commit 39b5991682267b647a5be9167f0da08b64f1269b Author: John Bowman Date: Fri Jun 20 16:12:09 2008 -0600 Improve intersection routines. commit 8e67614b18abf8d494d9c0059a03462d264e3744 Author: John Bowman Date: Fri Jun 20 12:04:45 2008 -0600 Fix front/back detection when rotating about a point. commit 0ce01dce66c71ef19576aa32a300d2564e764b6e Author: John Bowman Date: Fri Jun 20 10:41:31 2008 -0600 Move unitrand to C++ code to avoid dependency on stats.asy. commit 756229ed2e7a006a86858fa05bf4d14b9d507a22 Author: John Bowman Date: Fri Jun 20 10:23:21 2008 -0600 Implement improved version of intersections(point, pair p, pair q) that returns all intersection times with the (infinite) line through p and q. commit d0e1e48d8e3e4af0851d12df372b1a93cdede51c Author: John Bowman Date: Fri Jun 20 01:44:26 2008 -0600 Add routine to compute the intersection times of a path and a line segment. commit 2232265c4efb975d48af1abf1d4e49fb4326c863 Author: John Bowman Date: Fri Jun 20 00:38:55 2008 -0600 Distinguish between updatefunction (used for interactive mode) and exitfunction (used to clean up intermediate files). Don't force settings.outformat="pdf" in three.asy. commit 9abfe35d19f00a082d74c4203f4df401ecdbca32 Author: John Bowman Date: Fri Jun 20 00:07:38 2008 -0600 Simplify nodes(int). commit e08fa80e0385404c4aa369bb64721f86974e217c Author: John Bowman Date: Thu Jun 19 23:42:32 2008 -0600 Change path3 lift(path) to a constructor. Add constructors to surface.asy. Add example of 3D extruded label contributed by Philippe Ivaldi. commit ee1b7f936d02a0b940d7b8a3c9264f416a0efb3e Author: John Bowman Date: Thu Jun 19 22:38:42 2008 -0600 Remove granularity for improved rendering. commit e40f114bb061d80671e602500523e4f6063a08e3 Author: John Bowman Date: Thu Jun 19 15:43:45 2008 -0600 Replace axis call by explicit draw commands. commit 9bf478014f7a15d042c7c6c7e1132bd52047cce8 Author: Orest Shardt Date: Thu Jun 19 15:04:04 2008 -0600 Fix PRCbitStream::getSize(). commit 92647e99c1ded29b5b6e18d559bd344776ad4096 Author: Orest Shardt Date: Thu Jun 19 14:33:11 2008 -0600 Fix decompress(). commit a32f6380b98eb6fedc9e3025b5b6e9a4a75709c2 Author: John Bowman Date: Thu Jun 19 00:24:51 2008 -0600 Fix prc file count issue. Add preliminary support for 3d fonts. commit dee96c003870d0042deb3a35260fed64575971fc Author: John Bowman Date: Wed Jun 18 22:31:55 2008 -0600 Fix projection units. commit 33decaa2420313cb96d2138c11eab92cd6b3f0e6 Author: John Bowman Date: Wed Jun 18 22:12:40 2008 -0600 Add texpath support for alignment and transforms. commit c60cc1ee9480c8c4ddd38fcfb05a705796a09450 Author: John Bowman Date: Wed Jun 18 22:10:43 2008 -0600 Simplify reset. commit 8988b282978699b49e88a25d75b5eb6b81c096f2 Author: Orest Shardt Date: Wed Jun 18 21:00:40 2008 -0600 Fix teapot example commit b9f123de9a79311321d49a08e5a97101e97104ea Author: John Bowman Date: Wed Jun 18 15:17:02 2008 -0600 Avoid opening up an X11 window in texpath; use epswrite device instead. commit 3e4f4446091d06df048b77fc6928a8f4bb029efb Author: John Bowman Date: Wed Jun 18 14:56:22 2008 -0600 Add erase(frame) function. commit ce7f60c6873d3284b1b506d69f06ee604328db47 Author: John Bowman Date: Wed Jun 18 13:02:13 2008 -0600 Make texpath work also with sqrt, fractions, and arrows. Add pen argument to texpath. commit bdae929ff7456f6f140dde137b230a5fcd1520f8 Author: Orest Shardt Date: Wed Jun 18 12:51:32 2008 -0600 Use cm as units of camera properties. commit 32f251b38f548db605b824523050b902c880f367 Author: Orest Shardt Date: Wed Jun 18 11:05:14 2008 -0600 In PRC, always write at least 1 bit of user data. commit cae80ffcdeaec5cbe768a9621e2832c8573d795a Author: John Bowman Date: Wed Jun 18 10:20:19 2008 -0600 Fix formatting. commit c29cb9fd2b4053f46c77cfffe2385a798cd9fc91 Author: John Bowman Date: Wed Jun 18 10:18:11 2008 -0600 Add example of custom mark routine. commit 019788a364d8b80a1c84e284d7f9c37095319d82 Author: John Bowman Date: Wed Jun 18 09:45:35 2008 -0600 Move default currentpen argument to C++ code. commit 37fe2e5767e953bf39d434c7c09d271ee28e5c05 Author: John Bowman Date: Tue Jun 17 22:45:59 2008 -0600 Add boolean stroke parameter to shading (and clipping) routines to shading of (and clipping to) stroked paths. commit a73b07b29768d8e8922cb9d54d52d75efc311c55 Author: John Bowman Date: Tue Jun 17 22:08:40 2008 -0600 Add routine projection perspective(string s) routine to extract current camera parameters from cameralink (Viewpoint). commit a0e14768dac1463db30549ef4faaf39ebbe33985 Author: Orest Shardt Date: Tue Jun 17 13:02:33 2008 -0600 Resize and give the teapot a bottom. commit d0a4e60f6c1e15371d8880b367d377ae178a4fd7 Author: Orest Shardt Date: Tue Jun 17 12:09:30 2008 -0600 Use external editor to edit code. commit f2bf37a0f66d216009c542b2b308b289342ce69e Author: Orest Shardt Date: Mon Jun 16 17:21:07 2008 -0600 Remove unnecessary casts. commit 74e73921e42bfc6a2e71d49e5195be8855cdedf8 Author: Orest Shardt Date: Mon Jun 16 17:19:44 2008 -0600 Remove unnecessary casts. commit 3aebb8fdcb5fbd809b96168d45d6df20cb4fa077 Author: John Bowman Date: Mon Jun 16 13:29:25 2008 -0600 Fix and simplify texpath. commit 7e81e79113a8a0519b96b43ade388f9f8fc7015e Author: John Bowman Date: Mon Jun 16 11:11:55 2008 -0600 Use C locale for formatting embed arguments. commit 1fe8dbbf9792d601a4c10ef53032dc99a6f1ea59 Author: John Bowman Date: Mon Jun 16 11:08:31 2008 -0600 Add path[][] texpath(string s) routine to convert string into the paths that TeX would fill. commit c111c6a7272ce192e277b82a588912d8ab576ef3 Author: John Bowman Date: Mon Jun 16 11:06:41 2008 -0600 Add camera view link. commit 1972a971927ebe07efcebc12fe7b599c78bf3dab Author: John Bowman Date: Mon Jun 16 01:12:34 2008 -0600 Implement better fix for basealign bounding box bug. commit 0a1ef51442178feb8601dd5883c5de6632b4e53f Author: John Bowman Date: Sun Jun 15 17:08:11 2008 -0600 Fix bounding box with basealign pen. commit 4614dd3a78731786032ce032edfa6a70ddc56834 Author: John Bowman Date: Sun Jun 15 10:32:44 2008 -0600 Use static constant. commit 41c8952597ce8e1bd4a03710548564d7937990be Author: John Bowman Date: Sun Jun 15 10:30:17 2008 -0600 For orthographic/oblique projections, move camera further from origin. commit 8ba6d29ded55164d280c533d56f8554e21aff6ce Author: John Bowman Date: Sat Jun 14 10:12:59 2008 -0600 Minor diagnostic improvements. commit 917a8159772c3655f9a30b78d0abe35f8d386233 Author: John Bowman Date: Sat Jun 14 10:04:27 2008 -0600 Avoid dereferencing null function. commit 0d589b66ab74255064c2944dd8a679724acfb719 Author: John Bowman Date: Sat Jun 14 09:34:00 2008 -0600 Fix bug in face routines for orthographic and oblique projections. commit f3de3580086911764db9398e9b515573bc1b3bb8 Author: Orest Shardt Date: Fri Jun 13 17:54:42 2008 -0600 Fix IDs in PRC files. commit 0d1c41d959478fba4160627e30e1082d413c7f8b Author: John Bowman Date: Fri Jun 13 16:12:17 2008 -0600 Get PRC initial camera settings from projection. commit 9776ccfc40c6182d02447c1b934614593bf6e0e3 Author: John Bowman Date: Fri Jun 13 08:15:38 2008 -0600 Clean up temporary files. commit 8eff0d15bca50fe0c914c4cf7b1af4341ae5ccd0 Author: Andy Hammerlindl Date: Fri Jun 13 00:16:39 2008 -0600 Added semicolons. commit a9bb0091a5be8d6da421e80c0316c6dfaced0a0d Author: Andy Hammerlindl Date: Thu Jun 12 22:56:47 2008 -0600 Test access of shadowed variables by higher-order functions. commit 768a9ce6987778508cc84e4e9205b01ff2c6b05f Author: John Bowman Date: Thu Jun 12 22:53:27 2008 -0600 Add support for basic PRC operations (drawpath3 and drawsurface). commit 7a563a4026f3977cbba6d1b829a7211751afa952 Author: John Bowman Date: Thu Jun 12 22:50:22 2008 -0600 Wait for pdfviewer to exit before restarting it. commit 1878b4a8c01e7f846a0218c2bbd10a0596f8e5ec Author: Orest Shardt Date: Thu Jun 12 21:01:36 2008 -0600 Import code that implements support for saving 3D content to PRC files. commit c65204f2e7fe258b244b769f6911065fe1986e0b Author: John Bowman Date: Thu Jun 12 18:10:31 2008 -0600 Since Adobe Acrobat doesn't yet have a file-watching capability, kill a running pdfviewer so that a file can be redrawn in interactive mode. commit f7b8cd27b9cb8765d71b8fcf1d6057875269b0f8 Author: John Bowman Date: Thu Jun 12 10:00:47 2008 -0600 Make asymptote.sty work with the hebrew babel package. commit 2d7fea22b1f0985fe436087b9086e6c9c86cd5fb Author: John Bowman Date: Thu Jun 12 09:16:07 2008 -0600 Add example of downward-pointing logarithmic axis. commit 5f7145480ea60fd683c6c8bf3799042572d5a16e Author: John Bowman Date: Thu Jun 12 03:23:19 2008 -0600 Increment version to 1.44svn. commit fb06937f6dba11a658a56771153fd8986d62ab1a Author: John Bowman Date: Thu Jun 12 01:26:49 2008 -0600 Use international inch also in C++ code. commit a2159fe25921e7dec91b57c630d313698954bdb9 Author: John Bowman Date: Thu Jun 12 00:54:14 2008 -0600 Fix potential segmentation fault in store_history. Move uptodate=true back to the beginning of shipout to avoid a race condition. commit d719abe5c028f2aff2d2b4735bb470228cc1e171 Author: John Bowman Date: Thu Jun 12 00:14:14 2008 -0600 Add modules to redefine LaTeX named fontsizes to correspond to \documentclass[10pt]{article} and \documentclass[11pt]{article}, respectively. commit bf00af247e9d89e4425d66594eb4685231472348 Author: John Bowman Date: Wed Jun 11 15:45:16 2008 -0600 Use international inch conversion factor. commit ea890c4d3874b09bc617088a00ee228a6a9b5c60 Author: John Bowman Date: Tue Jun 10 08:14:59 2008 -0600 Add missing path3[] operator * (transform3 t, path3[] p). commit dc67938febe8c4317574b568fd02f6ac3c7419ac Author: John Bowman Date: Mon Jun 9 00:59:31 2008 -0600 Add optional support for Jonathan Shewchuk's more robust triangulation routines. commit 9474ea5ae10eb7a13cbce94be37de60c6ca07316 Author: John Bowman Date: Sun Jun 8 22:56:41 2008 -0600 Add interface for drawing contours on arbitrary nonoverlapping meshes. commit be71e97dd3937cbff0f077fffe1c0f287bf3ace2 Author: John Bowman Date: Sat Jun 7 22:36:27 2008 -0600 Remove transform return value from add functions in favour of user-supplied add routine. commit 957acf66cd561bcd3bb36f53583a8358b2153ec5 Author: John Bowman Date: Sat Jun 7 10:49:54 2008 -0600 Move draw(path[], pen[]) to plain_picture.asy. commit 29e7f51ffab71cb8cd31f3df70c35ec415b3cb27 Author: Philippe Ivaldi Date: Sat Jun 7 10:02:20 2008 -0600 asy-mode.el: add asy to regexp matching environments with indentation at col 0 for begin/end. commit d195ed234f5abd683c8801f819d48b6827012c41 Author: John Bowman Date: Fri Jun 6 12:18:07 2008 -0600 Remove "paths in concatenation do not meet" also from three.asy. commit c440bcb17349caf9383c7e3240ddb90eb7928b19 Author: John Bowman Date: Fri Jun 6 10:59:22 2008 -0600 Return the transform that maps source coordinates to destination coordinates in add and attach. commit 23ec1d32da754c400c706e8ea6d2c7770ee27992 Author: John Bowman Date: Fri Jun 6 10:56:10 2008 -0600 Move uptodate=true to runtime. Improve diagnostics about incompatible array lengths. commit 6f84918ef12c6f710d71c6bdf7af794b3692b780 Author: John Bowman Date: Fri Jun 6 09:52:43 2008 -0600 Make interrupts set uptodate=true to avoid spurious shipouts. commit 339e753c2f3d351c1ef372c5661a9c7411351641 Author: John Bowman Date: Fri Jun 6 09:51:37 2008 -0600 Fix secondary axis tick selection when automin=false. commit 1027a630c04d8242f270fbffe681dc8bb0c7d43e Author: Andy Hammerlindl Date: Thu Jun 5 15:45:47 2008 -0600 A preliminary proposal for how to defined Asymptote modules in C++. commit 0d4a0eeb383510e60b3b9ac9232113e2eee45702 Author: John Bowman Date: Thu Jun 5 08:58:18 2008 -0600 Allow precision setting to be queried. Write paths to the specified precision setting for a file. commit 3b5a173a2f18ffd46d224702d7041cfa9fb41fad Author: John Bowman Date: Thu Jun 5 08:35:35 2008 -0600 Add expm1 function. commit d7b09d6ccc177c046eb40729cea64852d93d0aa0 Author: John Bowman Date: Thu Jun 5 08:34:21 2008 -0600 Add labels to example. commit 9f514e148d9ad4e771e95fc8474689f7296902e3 Author: John Bowman Date: Wed Jun 4 22:28:22 2008 -0600 Always draw 2D axes below picture by default. commit 23687784eb8136c680bc575e5faaa031c43b2e7e Author: John Bowman Date: Wed Jun 4 21:00:36 2008 -0600 Simplify font variable definitions. commit b1ecdea289fe45a884bf9d62174e33169dd04a69 Author: John Bowman Date: Wed Jun 4 20:34:59 2008 -0600 Restore to correct initial font. commit d154fe783f4b8a0e68246d1c981983108fea48eb Author: John Bowman Date: Wed Jun 4 14:50:26 2008 -0600 Add missing # sign. commit 352b95fbcbde83c2100873428333c42833b96400 Author: Andy Hammerlindl Date: Tue Jun 3 21:54:04 2008 -0600 Removed matchCache entirely. commit 7049c58edd05e29d05a420e5863c0f813930afc1 Author: John Bowman Date: Tue Jun 3 20:14:07 2008 -0600 Handle undefined __GNU_C_PREREQ macros. commit d05f4d6b8db474012a020cadef63c05048c115b5 Author: Andy Hammerlindl Date: Sat May 31 05:55:05 2008 -0600 Disabled matchCaching dur to improperly handled cases. commit 9fa7f2b46ab2a4d2182b284fa2478392be786099 Author: Andy Hammerlindl Date: Sat May 31 05:54:24 2008 -0600 Ideas about unicode. commit 8e5a96428b9aad50a2a5f26bb7c7aad7fc128751 Author: John Bowman Date: Tue May 27 00:36:08 2008 -0600 Work around broken gcc-4.1.2 tr1 headers. commit f11c1186fa36c01c5bbe8f17ac7d53fa47022cca Author: John Bowman Date: Mon May 26 23:41:28 2008 -0600 Port to gcc-4.3.0. commit 1134015c605aeaa9c716e300bdaaa00781297872 Author: John Bowman Date: Mon May 26 15:09:53 2008 -0600 Add beginnings of an ode package. commit 54612197435b4c944be06179afd96f855d650705 Author: John Bowman Date: Thu May 22 01:02:23 2008 -0600 Make partialsum return an array of the same length as its argument (this is a backwards incompatible change). commit 4151c0858ef89f677f105a5cd62024ecc241aeb2 Author: John Bowman Date: Wed May 7 22:52:35 2008 -0600 Update to gc-7.1. commit 3d0927284d1feba4d7ebf1a1c6ec4d6b7d21cdbc Author: John Bowman Date: Wed May 7 22:50:36 2008 -0600 Return immediately for negative sleep arguments. commit 28729a6593b608c87ff01bc4abebe997716fdaa1 Author: John Bowman Date: Wed May 7 22:49:52 2008 -0600 Fix spelling of cardioid. commit 47ba791ced24f6f4b0a53d261f7565577f33082c Author: John Bowman Date: Wed May 7 22:49:21 2008 -0600 Update URL. commit 33a78d50b57103d1799c2b95ab2b8ff5d24b7dac Author: Orest Shardt Date: Mon Apr 28 17:39:58 2008 -0600 Update links to TeX resources. commit cdca5636da68747c65fdbf4a1ad5b13497ebb9b6 Author: John Bowman Date: Sat Mar 29 17:18:30 2008 -0600 Temporary fix for tick directions. commit aeb5c5a9c889d60ddd2dc3ac0fef63b534d5bc46 Author: John Bowman Date: Sat Mar 29 17:17:47 2008 -0600 Add missing index entry for array. commit 253ddb3249b9f7e85bc7035cca787874e513be0a Author: John Bowman Date: Sat Mar 29 17:10:46 2008 -0600 Simplfify examples. commit 1dbb7d413f5c5059d01ddc874b158753ce8cdcb2 Author: John Bowman Date: Sat Mar 29 17:08:57 2008 -0600 Improve bad string cast diagnostics. commit 973ea83a562502f902836cc07293aea9e902141a Author: John Bowman Date: Sat Mar 29 17:08:34 2008 -0600 Add drawing routines for guide[] g. commit f5b8a5fde57dbb1916a68b104de7c4f586ff0d6b Author: John Bowman Date: Sat Mar 29 17:06:54 2008 -0600 Add path[] operator cast(guide[] g) cast. commit a23bee0a918c2e49facf005c2c94f1c482d6e10c Author: John Bowman Date: Sat Mar 29 17:06:20 2008 -0600 Add draw(frame f, guide[] g, pen p=currentpen) routine. commit bcef90c405e0bd4eadef1cae4e41b3fe0cceac7b Author: John Bowman Date: Sat Mar 29 17:04:45 2008 -0600 Simplify definition of endl. commit 5e1ced1a1a427f102db12b1af9ef66cca091281f Author: John Bowman Date: Sat Mar 29 17:03:50 2008 -0600 Move title down slightly. commit 57f08e7a99c24f095155c4a0bf74e97ffd9cc40c Author: John Bowman Date: Sat Mar 29 17:02:59 2008 -0600 Add void beep() function; document flush output suffix. commit 210a2779be4611f9854b6b48f07c0d32bf47b96e Author: John Bowman Date: Sat Mar 29 16:59:31 2008 -0600 Add real[] operator ecast(string[] a). commit bdf817fc6daa43cab0399f03438983b95d77367b Author: John Bowman Date: Wed Mar 26 21:35:28 2008 -0600 Make tickmin a multiple of Step when automin=false. Don't override put=Above default for extended axes. commit 3df525c36624064a784a2dae7b32e4a3a533a115 Author: Andy Hammerlindl Date: Fri Mar 21 21:45:32 2008 -0600 Added array(n, value) function for making arrays of duplicates. commit efdeedfa21d989c7ec6e249105739af76b1407d4 Author: John Bowman Date: Fri Mar 21 09:56:10 2008 -0600 Force the default -D 600 dvips setting for proper label alignment (should have no other effect since we are not using bitmapped fonts). commit 3ba23cae223de6eda4bc3be6975e52c64bb5d578 Author: Orest Shardt Date: Tue Mar 11 21:58:22 2008 -0600 Fix handling of undo/redo while in bezier editing mode. commit e5c96b0445050e3894d40bc13102a8b91075357a Author: John Bowman Date: Tue Mar 11 08:45:01 2008 -0600 Force setdash when offset changes. commit d39b6bf8ffeaed671183ed633253c9292b6ebc37 Author: John Bowman Date: Sun Mar 2 17:19:55 2008 -0600 Make C-c C-c automatically kill a previous running Asymptote process without second-guessing user's intentions. Remove erroneous "Compilation errors,..." message generated by killed processes. commit 96134a7138bb45deb16ebeea24130a93c044375d Author: Philippe Ivaldi Date: Sun Mar 2 05:29:55 2008 -0600 Remove useless code in penimage.asy commit 4e3af91ce1ddcc1853c022f3e7cbfaaaab564b7b Author: John Bowman Date: Sun Mar 2 00:55:37 2008 -0600 Fix gradient. commit 1487f75fbb79143a2ae24c0db4a51fe63d971982 Author: John Bowman Date: Sun Mar 2 00:53:08 2008 -0600 Remove unused import. commit 1301e8134a26abe9727308e39ecc415d2be20171 Author: John Bowman Date: Sun Mar 2 00:49:23 2008 -0600 Improve one-dimensional vector field interface (this change is backwards incompatible). Support two-dimensional and three-dimensional vector fields. commit b4ba032503c86cb8292b34f41c81b0bc8ae7f30e Author: John Bowman Date: Sat Mar 1 18:14:38 2008 -0600 Add example of conditional surface and transparent splitting plane. commit f3d9bf2e97ac2271cca37f21a2bdda47842d964f Author: John Bowman Date: Sat Mar 1 16:38:14 2008 -0600 Implement conditional drawing of surfaces meshes over box(a,b). commit 66eebddd231e21da865cf0e9df34ed5169fa5f82 Author: Philippe Ivaldi Date: Thu Feb 28 05:42:32 2008 -0600 Update asy-mode-version value. commit 342b84ef3a0807ab5ce3fe18df0faf3483f55231 Author: Philippe Ivaldi Date: Thu Feb 28 05:40:49 2008 -0600 Fix critical bug in asy-mode.el: a new Asymptote compilation when a process was running erased the contents of some buffers. commit 027b52858861556cc5e12037c1ff2c9443cc5b85 Author: John Bowman Date: Wed Feb 27 01:25:25 2008 -0600 Increment version to 1.43svn. commit 1447cc01adb0a414ebf6c2182ffc67261e41844b Author: John Bowman Date: Tue Feb 26 23:57:08 2008 -0600 Project labels onto cube faces. commit 8d56775de2013b8977c6e91d157d9ea7e080d179 Author: John Bowman Date: Sun Feb 24 10:32:50 2008 -0600 Don't set sticky bit when creating ~/.asy directory. commit 9fbabd22a74377a0368373ff1830eea8430df812 Author: John Bowman Date: Sun Feb 24 02:18:00 2008 -0600 Add optional arrows to slopefield routines. commit 71660d1deb2a0b127d19057d6e171a2a601de2aa Author: John Bowman Date: Fri Feb 22 15:47:40 2008 -0600 Add routines pairs(real[] x, real[] y) and triples(real[] x, real[] y, real[] z) as a replacement for the obsolete routine dot(picture pic=currentpicture, pair[] x, pair[] y, pen p=currentpen, filltype filltype=Fill); commit fae5c47b53c181310f48923c84a7432a93dda1e1 Author: John Bowman Date: Fri Feb 22 15:11:07 2008 -0600 Remove ambiguity in scale. commit 7eaba4a7e73881f4ad8c6fb6b2efa8758b6f4441 Author: John Bowman Date: Fri Feb 22 13:12:12 2008 -0600 Use the exact derivative of the projection map to project a Label onto a given plane. Remove routine dot(picture pic=currentpicture, pair[] x, pair[] y, pen p=currentpen, filltype filltype=Fill); Add dot(real[] a, real[] b) routine returning the dot product of two vectors. Update documentation. commit 8b4b5f556068b8dc1c358e2380023cdf36fe71ec Author: John Bowman Date: Wed Feb 20 14:35:14 2008 -0600 More guide to path changes. commit 1b0837cc9fd6c26c2c073ea7942f7e9c0ad2290a Author: John Bowman Date: Wed Feb 20 14:30:54 2008 -0600 Minor optimization. commit 66f028e3ddb30f53da918a34665e97f652132e6f Author: John Bowman Date: Wed Feb 20 11:05:24 2008 -0600 Minor optimization. commit 2c30348bc4c5c690bb8100aeb6d35181d9023e4a Author: John Bowman Date: Wed Feb 20 10:53:48 2008 -0600 Simplify code. commit 0596ae2e0e671c999ba530f78ee3b0b27a8cd18c Author: John Bowman Date: Mon Feb 18 14:19:42 2008 -0600 Add fit argument also for nonglobal animations. commit 43c452a4cf07327afc3fd0e9f8c26ea334deedcb Author: John Bowman Date: Mon Feb 18 12:07:11 2008 -0600 Add fit argument to animation routines for adding an optionally filled bounding box to each movie frame. Add newpage(frame) function. commit b93fe4a70c9017ff184f1a53ebc205d436e1a468 Author: John Bowman Date: Mon Feb 18 10:54:28 2008 -0600 Remove unused shipout predeclaration. commit 7d96e60c78920b01057ed98fec08de69e1244f7a Author: John Bowman Date: Sun Feb 17 23:29:37 2008 -0600 Add missing explicit qualifier. commit 69f2ced5ccf41357f53c02e60b71e81ff9a27bde Author: John Bowman Date: Sun Feb 17 23:22:15 2008 -0600 Move definition of currentpen to C++ code. Add int inside(path p, path q, pen fillrule=currentpen) routine. commit cb2994e001b117a4a4e59592041ddb68ec7d7341 Author: John Bowman Date: Sat Feb 16 23:17:40 2008 -0600 Add routine for projecting a Label onto a given plane. commit 1a9da2027d2a553c9da08e29c369791400269024 Author: John Bowman Date: Fri Feb 15 10:43:04 2008 -0600 Fix missing ASYbase declaration. commit 8fd647e96c77710d904dbcd5ea6132c42a05114c Author: Orest Shardt Date: Wed Feb 13 20:21:00 2008 -0600 Fix bug in cancellation of text addition. commit 853850265626e15fd01330a794bc82ec8d58073d Author: John Bowman Date: Wed Feb 13 16:24:27 2008 -0600 Output TeX headers only when needed. commit 84d386a4ce6844c74fdc632b0ad0b21da419106e Author: John Bowman Date: Wed Feb 13 16:21:32 2008 -0600 Mention that transforms can also be applied to Labels. commit d6d464b64985bdb24a0efe48c4bc508ed3eff762 Author: John Bowman Date: Mon Feb 11 15:19:08 2008 -0600 Update two arrow example. commit 9b3ac4667a40ddb9278ff1c1e288327cec8481cf Author: John Bowman Date: Mon Feb 11 14:49:15 2008 -0600 Update documentation of arrowhead styles. Change guides to paths. commit a1df8af391ff6d0e4026fa6c3a3add30726f397a Author: John Bowman Date: Mon Feb 11 14:15:19 2008 -0600 Move documentation of colorless(pen) to a better place. commit f36f2b8361c7223233adf56f4cee046d1f3bb472 Author: John Bowman Date: Mon Feb 11 04:14:56 2008 -0600 Simply and generalize contour value selection code. commit f391e1cb59dc5038024a0c9f5e1eeae96e488458 Author: John Bowman Date: Fri Feb 8 22:58:31 2008 -0600 Make OmitTick do nothing when there are no major ticks. commit accc7ed704192adf8d5a529c40f4a85d9cf410fb Author: Andy Hammerlindl Date: Tue Feb 5 19:25:23 2008 -0600 Fixed typo in slice documentation. commit 89dba98f9ec82d098a5879730fadea5d74a80e3b Author: John Bowman Date: Tue Feb 5 10:01:26 2008 -0600 Avoid division by zero in uniform. commit 3321d9455ef90ee97f768938562ff22c15a875bf Author: John Bowman Date: Sun Feb 3 17:19:39 2008 -0600 Update documentation regarding ImageMagick convert. commit 849d9b02838570b95aa701399bd2f2ce636c93e3 Author: John Bowman Date: Sun Feb 3 17:13:17 2008 -0600 Make movie generate multipage pdf animations when format="pdf" and global=true. Insist on pdflatex in animation.pdf(). commit ad06a8362db44fa8157339841e327bc4b4177b55 Author: John Bowman Date: Sun Feb 3 17:08:56 2008 -0600 Catch bad casts. commit 1009155106bfb79fbf920c5a9a1b1913d6ec0c48 Author: John Bowman Date: Sat Feb 2 11:23:44 2008 -0600 Add casts between hsv structure and pens; reduce angle to [0,360). commit f5ecdd38a3a4cf7f6cde0082b9a68d99645ebab2 Author: John Bowman Date: Sat Feb 2 03:07:55 2008 -0600 Increment version to 1.42svn. commit 270d45cc07ed6be202740548e3460cf16a5a905d Author: John Bowman Date: Sat Feb 2 02:12:22 2008 -0600 Fix type conflict. commit b0d85d8859acb4dd6f7514f96269b1d33c3d5d23 Author: John Bowman Date: Sat Feb 2 01:05:46 2008 -0600 Add support for HSV colorspace. commit 621f260edc533f9ced6fc4984cd908a385fcfd28 Author: John Bowman Date: Thu Jan 31 21:21:25 2008 -0600 Minor edits. commit 075c48e7483fbaab787b4bff3be8d8ab1c45b959 Author: Andy Hammerlindl Date: Wed Jan 30 19:42:11 2008 -0600 Documented slices. commit f003b14f41ee970266a527ddf8255eee6b79c2ae Author: Andy Hammerlindl Date: Wed Jan 30 14:28:01 2008 -0600 Disallow A[5:2] and, for non-cyclic A, A[-1:] to play it safe. commit 609d55caaefb95be16383fdca5bc7e4a46f1530d Author: John Bowman Date: Wed Jan 30 13:24:17 2008 -0600 Change write to output nothing for uninitialized values instead of producing an error. commit 1fd3159d68d7afb253c6b44cc4c8ee50cd9c5f75 Author: John Bowman Date: Wed Jan 30 12:19:58 2008 -0600 Add uniform(real a, real b, int n), which returns a uniform partition of [a,b] into n subintervals. Fix comment. commit 75fbbe945ba00a7207c3816e8d7fd73dac11f73a Author: John Bowman Date: Tue Jan 29 18:53:40 2008 -0600 Store history line immediately after input (as well at exit, after stifling). commit 7fb3c67120d0191ff5b6071fa045491317f24133 Author: John Bowman Date: Tue Jan 29 09:23:30 2008 -0600 Add interface to simpson. commit 0665d10b2d3fe34f7243f2a3db1c087b30609c2f Author: John Bowman Date: Mon Jan 28 13:12:37 2008 -0600 Format. commit 0901dca35916a1a85d935b0f888eaa70396d32f8 Author: John Bowman Date: Mon Jan 28 13:11:43 2008 -0600 Move numerical routines to Mathematical functions section. commit 424dd7052001b15f6f57b0da35ee1268bf22435d Author: John Bowman Date: Mon Jan 28 12:38:09 2008 -0600 Make buildcycle return nullpath if less than two paths are specified. commit dcf34ff2cc982064b00dc5e673a9a2126f99660d Author: John Bowman Date: Mon Jan 28 11:56:44 2008 -0600 Fix typo in documentation of complement. commit f7d9ddabc9ef80d009e5f880d8a4de2f33dcc0af Author: John Bowman Date: Mon Jan 28 11:35:52 2008 -0600 Fix formatting. commit 18586c705f74c214f4d60b44d9f564212c80632d Author: Andy Hammerlindl Date: Sun Jan 27 12:05:40 2008 -0600 Implemented assignment to slices. commit 392074ca90dc8bc379b86e39840620c5ca31e7fe Author: John Bowman Date: Sat Jan 26 17:11:28 2008 -0600 Shred TeX transcripts after each call to drawLabel::wait. commit 3c04ace2e3285c356ee91fc03faecc4379532de0 Author: John Bowman Date: Sat Jan 26 16:57:21 2008 -0600 Output complete TeX diagnostics. commit 3434e16d2ea4b2fc32ede6c4710cfca7b5efea83 Author: John Bowman Date: Sat Jan 26 16:30:24 2008 -0600 Add blank lines between tests. commit 5f1be847debfa4a549ec961bb00996c00ee5264f Author: Andy Hammerlindl Date: Sat Jan 26 16:02:48 2008 -0600 Added null check for array slices. commit 5bcb67c87c7960dda4e3bc8ae3e446719b052d11 Author: John Bowman Date: Sat Jan 26 15:57:19 2008 -0600 Add array. commit cd1f0d3f6fa288b44391233d4b43932ca7967764 Author: John Bowman Date: Sat Jan 26 15:52:05 2008 -0600 Define complex exp, log, sin, and cos functions. commit 2d2c077d551cca549d04295eea745a5b0f7f657c Author: Andy Hammerlindl Date: Sat Jan 26 15:13:57 2008 -0600 Added array slices. commit 45d39c3a8d9332915ece4513d6a03b98872c8f08 Author: John Bowman Date: Sat Jan 26 11:19:22 2008 -0600 Fix file paths. commit fa4d57f8b5f26cb8fb7cfbd9df00efc2e155bbff Author: John Bowman Date: Sat Jan 26 11:14:03 2008 -0600 Remove dependence of non-PDF animations on animate.sty package by renaming animate.sty to animation.sty (PDF animations still need to import animate.sty). commit 2917d9cd47a4caa2ec96ab77a90287709310729c Author: Andy Hammerlindl Date: Sat Jan 26 10:18:56 2008 -0600 Report on error for rest args with default arguments. commit 3b3d6627a6cfba38e11e39830153d1f96978b14d Author: Andy Hammerlindl Date: Sat Jan 26 10:07:52 2008 -0600 Added virtual field A.keys for arrays. concat now take a rest arg. commit 5f88126092e73363d852ff8573d03cac61761d51 Author: John Bowman Date: Fri Jan 25 23:47:18 2008 -0600 Make xasy respect transparency with png xformat. commit 11cfe8261e6a9cd45e922a2a694b28f70ae3eb52 Author: John Bowman Date: Fri Jan 25 20:51:26 2008 -0600 Add drawpen argument to FillDraw. Handle nullpen when drawing arrows. commit f419e0fc124a1487b98e4c36c79831ada12ce073 Author: John Bowman Date: Sun Jan 20 12:58:45 2008 -0600 Store and make use of the bounding path in the object structure to allow connections to noncardinal boundary points. Add constructors to the object structure. Remove obsolete function for drawing boxes on pictures in favour of draw(Label,box). Add dir(explicit pair z) function so that dir(E) is a synonym for E. Update documentation. commit fb19c361b7e1185d22c63079502b9f1863ca452e Author: John Bowman Date: Sat Jan 19 22:28:43 2008 -0600 Add gamma function example. commit 864e65e94d727444a0c3123478b099a132b9a42a Author: John Bowman Date: Sat Jan 19 19:03:13 2008 -0600 Fix typo. commit 91199463ea13f80fa065d66f2194fbda6f28a8e5 Author: John Bowman Date: Sat Jan 19 19:02:16 2008 -0600 Improve buildcycle algorithm. Avoid numerical resolution issues by removing the "paths in concatenation do not meet" error. commit 04e020e6605b64d606d91b26446b8319325a7a27 Author: John Bowman Date: Thu Jan 17 17:29:08 2008 -0600 Add intersection count to node and value routines. commit a19be6b36b0293565e5be8316fdf516ab0470e43 Author: John Bowman Date: Thu Jan 17 17:24:27 2008 -0600 Update example to show how to specify all pen colours. commit ae1481f9b930d27f05564a2dedf4ffdf6012014a Author: Philippe Ivaldi Date: Sat Jan 12 11:53:17 2008 -0600 Fix typo commit 98e2c3eb93ca70fd24329774cfb664dd521f9092 Author: John Bowman Date: Fri Jan 11 22:59:03 2008 -0600 Determine whether unsplit slices are should be drawn as front or back slices. commit b770b4ff836330c71d1dac7038caed808fd588e9 Author: John Bowman Date: Sat Jan 5 12:59:42 2008 -0600 Increment version to 1.41svn. commit fca863691dd2a7cba64c4aaf2cd4e456b70b07d5 Author: John Bowman Date: Sat Jan 5 12:02:27 2008 -0600 Fix nurb-related bug in solid shading. commit 842a3f1261d30bdad98e0bcf8c4a3198beaf2042 Author: John Bowman Date: Sat Jan 5 11:40:31 2008 -0600 Fix PDF hatch width by disabling dynamics line width adjustment when producing pdf format. commit 969bea071468a36ef3a707c81c2d14bdeb0009bd Author: John Bowman Date: Sat Jan 5 10:50:59 2008 -0600 Omit control panel for second movie. commit 204640fad71c60e20420c0c7868e3f15960dc1fc Author: John Bowman Date: Fri Jan 4 22:08:35 2008 -0600 Increment version to 1.40svn. commit 325350659a2678ed008d5a4ebb72b37f5b75e47b Author: John Bowman Date: Fri Jan 4 20:48:57 2008 -0600 Fix inline embedded PDF animations. commit 356ab0f2172a5ae8130443f1c2647295cabb220e Author: John Bowman Date: Fri Jan 4 20:28:04 2008 -0600 Delete intermediate animation file unless keep=true. commit f48f0cc7f09236e5775871c39030bee58560940c Author: John Bowman Date: Fri Jan 4 18:53:32 2008 -0600 Use constructor to initialize animation. commit d02f55428e29bb44d1b06d79c6ad8afb02916165 Author: John Bowman Date: Fri Jan 4 18:23:54 2008 -0600 Increment version to 1.39svn. commit 96b57a131d19deebc84f85a1a6dcd2049823450a Author: John Bowman Date: Fri Jan 4 14:09:26 2008 -0600 Patch to support gcc-4.3. commit 7475cb84d621c8a61982db333e125823fb0bbb33 Author: John Bowman Date: Fri Jan 4 13:53:56 2008 -0600 Move inlinemove.tex to animations directory. commit 1a9d7aff510255ddf0f26c5f310912cd71fe8647 Author: John Bowman Date: Fri Jan 4 13:52:04 2008 -0600 Add argument global to animate constructor. Fix and illustrate inline animations. commit 26cf61ebcfbd55c922c2dde34e694f72846e7f25 Author: John Bowman Date: Thu Jan 3 22:13:31 2008 -0600 Fix ambiguous call to dot(triple[]). commit d43650f6d16d9fb3e4d0ddc50744869fa78ce1ba Author: John Bowman Date: Thu Jan 3 21:15:16 2008 -0600 Support and illustrate embedding of inline pdf files even in absence of [inline] asymptote.sty option. Use multipage mode by default in animate.pdf(). commit c7893eeb3a59a57448864986646b44bfa30437bc Author: John Bowman Date: Thu Jan 3 18:06:40 2008 -0600 Add constructor for animate. Update inline pdf movie documentation. commit 766fd6bf08b41aa47f0573ab64dbd25b103ebfbf Author: John Bowman Date: Thu Jan 3 17:44:30 2008 -0600 Support multipage and inline pdf movies. commit 1454b4566b4aea12277185e3bf95d373bd563b1e Author: Philippe Ivaldi Date: Thu Jan 3 07:59:26 2008 -0600 Fix TeXHead path. commit 1bf4a24c69724b7c2036187e9bf10c67cd2b746f Author: John Bowman Date: Thu Jan 3 00:17:36 2008 -0600 Document arrowhead styles. Rename arrowheadT to arrowhead. Add defaultfilltype to arrowhead. Fix direction bug in TeXhead. commit 1067c1e94097c7b80391998a0428994cfa78f731 Author: Philippe Ivaldi Date: Wed Jan 2 20:12:25 2008 -0600 Provide Computer Modern arrow head. commit 7662c29a905b31ff907910fb114f0d200c4715ea Author: John Bowman Date: Tue Jan 1 16:17:29 2008 -0600 Fix degenerate arrows. commit 6ef4751c7a67f389651557bbd4e2b59397676527 Author: John Bowman Date: Mon Dec 31 00:57:24 2007 -0600 Add arrowhookfactor. commit 3995f096e44ed51ef5fc3a398167bdf6aafcd232 Author: John Bowman Date: Mon Dec 31 00:50:21 2007 -0600 Support alternative arrowhead styles. Add SimpleHead and HookHead arrow styles (courtesy of Philippe Ivaldi). commit 94e73b59ec29229fdfcbab31f6fbf28ac65c4ed3 Author: John Bowman Date: Mon Dec 31 00:46:56 2007 -0600 Automatically reduce FillDraw to Draw for noncyclic paths. commit e48152f9ab707d255a31e094f6cae8d132eba8ec Author: John Bowman Date: Sat Dec 29 11:37:13 2007 -0600 Approximate nonuniform rational B-splines (nurbs) by adding additonal control points to Bezier curves (not yet optimal). Add operator &(path p, cycleToken tok). Update constructors in three.asy. commit e6cf05117c5c832bf234ac9f4acfe5c0155552ea Author: John Bowman Date: Fri Dec 28 12:20:30 2007 -0600 In autoformat, try to add an extra digit of precision. commit ad790766a21e1f85d924c7cd27ddb6256d1f1c17 Author: John Bowman Date: Mon Dec 24 10:42:05 2007 -0600 Handle output from xasy scripts. commit 85d94404c8867f790204a64445a115fbdd4fb07b Author: John Bowman Date: Mon Dec 24 10:06:39 2007 -0600 Have Makefile create symbolic link xasy. commit c0d837d3b193e411db8195007e481dd49433fadb Author: Orest Shardt Date: Sat Dec 22 21:34:02 2007 -0600 Remove need for access to GUI widgets from threads other than main thread. commit 319c53aa393f6f187d5994fd4f47eaa300ab69e8 Author: John Bowman Date: Tue Dec 11 20:01:47 2007 -0600 Add missing figures; remove duplicate line. commit 5db58c2ab9b5db1059eff00dd6e39b8bb6c3552a Author: Andy Hammerlindl Date: Mon Dec 10 12:29:34 2007 -0600 Clear the matchCatch after translating a module, for a modest speed-up. commit 8504b2b12ce9028d8146491f6375e87185b524fc Author: John Bowman Date: Sun Dec 9 23:37:42 2007 -0600 Add optional xlabel and ylabel arguments to axes. Make default xlabel, ylabel, and zlabel arguments of 3D axes routines empty strings. Document axes. Untabify graph3.asy and graph.asy. commit 021b820e636812a8f10cc986a689b4ee196dcb2f Author: John Bowman Date: Sun Dec 9 21:25:55 2007 -0600 Remove unused import. commit 7d109fd4de56e9eb9e5be7e0fe84e07e76e56203 Author: John Bowman Date: Sun Dec 9 17:47:07 2007 -0600 Improve graph and interpolation array length diagnostics. commit 51aeda2f2b10a981416760373819ea77723276f5 Author: Andy Hammerlindl Date: Sun Dec 9 15:10:02 2007 -0600 Resolve ambiguous expressions during interactiveWrite (with a warning). commit 8706cd7cb1cbc7bf5d5214a8004312924a296d04 Author: John Bowman Date: Sun Dec 9 13:15:32 2007 -0600 Implement -c (command) option and exit() command. commit f9d4dd9fd35dba1bc3a8af6fbc38ee92580e61b8 Author: John Bowman Date: Sun Dec 9 11:49:08 2007 -0600 Make read1, read2, and read3 effective only for the current array read. commit fc7724984928fcb5438c804c93f4d1f4547e26e5 Author: John Bowman Date: Sat Dec 8 20:22:01 2007 -0600 Output deconstruction errors to Asymptote Console window. commit 3743326dfa4517531e6830c780c3ad1218b652f5 Author: John Bowman Date: Sat Dec 8 19:16:19 2007 -0600 Handle unclosed begingroups in deconstruct. commit e7ec47ddc06f49296bfd7cdb3ce0266eb05baf43 Author: John Bowman Date: Sat Dec 8 17:37:22 2007 -0600 Add patch to fix several problems with Asymptote backend for pstoedit-3.45. commit 9a8a21225594ea559e60a5ffcdc189dce0f72fe3 Author: John Bowman Date: Sat Dec 8 15:17:13 2007 -0600 Ignore unclosed begingroups (to work around pstoedit problems). commit 3fa9cfc8cfc9398c532a66696177e99f804a66aa Author: John Bowman Date: Sat Dec 8 15:13:07 2007 -0600 Fix empty clipping bbox. commit 01c074e794942e9e7f6d99939cb9be8fedf273a7 Author: John Bowman Date: Sat Dec 8 11:43:45 2007 -0600 Show how to put a header on every page. commit a945de6cdff5da619b67a0da1361f84e520ea201 Author: John Bowman Date: Sun Dec 2 17:29:34 2007 -0600 Improve system gc detection. commit 7982bb03903011ef9d815663b9be57b0a4c7c43d Author: John Bowman Date: Sun Dec 2 11:58:15 2007 -0600 Document \\ -> \\ mapping of double-quoted strings. commit f3c872398182865ab86f8d539407116e6bf97f85 Author: John Bowman Date: Sat Dec 1 16:30:13 2007 -0600 Add default value of (0,0) to center. commit 751ef26e6441331a20c733c2ede1e93ca9e48129 Author: John Bowman Date: Sat Dec 1 16:24:03 2007 -0600 Add pen arguments to flowchart block routines. commit 53353a7061cb3a14bbe29748e2f0b0a84bff52cd Author: John Bowman Date: Wed Nov 28 02:28:22 2007 -0600 Increment version to 1.38svn. commit dbfb3b087153beead06ba3bb7aaaa96202279698 Author: John Bowman Date: Wed Nov 28 01:37:17 2007 -0600 Final Windows tweaks. commit f887aa3b30820f117a5eedb2c03ab6af54a86d39 Author: John Bowman Date: Wed Nov 28 00:05:09 2007 -0600 Remove min since intersections returns a sorted array. commit d22fe9b61925276c50f1d02e795d9eaa387a5063 Author: John Bowman Date: Tue Nov 27 23:41:59 2007 -0600 Document the -x option of xasy. commit 9447249d3b473e643fdd4c1940bc8dba0cb1fa70 Author: John Bowman Date: Tue Nov 27 23:30:09 2007 -0600 Remove debugging test modification. commit 10ed8b40ffe426fa310f8b95dc5116feafe0f2b0 Author: John Bowman Date: Tue Nov 27 23:28:13 2007 -0600 Update GUI installation documentation. commit 3694a2d73a5acd069a1cc2d760e4903600db4ac5 Author: John Bowman Date: Tue Nov 27 23:17:19 2007 -0600 Require Python 2.5 for MSWindows. commit 8a304ea770d0353e64e55807df90977cb459f285 Author: John Bowman Date: Tue Nov 27 23:10:43 2007 -0600 Add version of PIL-1.1.6 patch used for MSDOS. commit bf8152019b302c20f8004f2737f31dad216b66c8 Author: John Bowman Date: Tue Nov 27 22:51:27 2007 -0600 Output diagnostics from Asymptote in separate Tk window. commit d93ac8e965bb7043f8b0ded28dba9e170068d382 Author: John Bowman Date: Tue Nov 27 22:50:28 2007 -0600 Fix active Color button foreground. commit e550c42efb019bb8dc01a3a1469ffce47355541f Author: Orest Shardt Date: Tue Nov 27 18:16:40 2007 -0600 Correct acquisition of lock for colour change. commit 0a49d1c30af474856658ea7b10e94eb75f66354b Author: John Bowman Date: Tue Nov 27 17:23:59 2007 -0600 Add 's' scrolling option. commit aa640e61e64e607504d8059a3e6d7b5bbce8a4de Author: John Bowman Date: Tue Nov 27 02:01:27 2007 -0600 Configure xasy version. commit facbc7d3edab62e709daff555032af4e915aaad5 Author: John Bowman Date: Tue Nov 27 02:00:47 2007 -0600 Turn off scrolling when not a tty. commit 561fe4db56c52dd4777ddf72818d02eef7380f6a Author: John Bowman Date: Mon Nov 26 23:22:08 2007 -0600 Add function to calculate "optimal" number of histogram bins. commit e14fabf18e6241a76fd6b4545abc5093a063f8bc Author: John Bowman Date: Mon Nov 26 18:54:59 2007 -0600 Force outformat="pdf". commit 24e7460045ec96dbff4b3fe4c464ecde0d663009 Author: John Bowman Date: Mon Nov 26 18:54:03 2007 -0600 When determining base points of arrows, always choose the closest intersection points (in terms of arclength) to the apex. commit a3029de1fd8eddec158958869cfdb8281f4a08ce Author: John Bowman Date: Sun Nov 25 22:47:55 2007 -0600 Use a separate flag in indexedTransform to indicate GUI deletion, instead of zeroing out the transform. This produces clearer .asy output and allows deletion of objects to be undone, preserving the image transform, even after a deconstruct() (or by manual editing of the output code). Show asy diagnostics in console window. commit ae4301c408fa50d866a5c58a13254f63fa001e93 Author: John Bowman Date: Sun Nov 25 00:23:19 2007 -0600 Fix scrolling. commit d5a1e13305ec2ef5476f22ad68642ba95f779771 Author: John Bowman Date: Sun Nov 25 00:03:07 2007 -0600 Improve 3d tick default directions. commit 9e5878b08af4d44af61190cb5aa1b510721f3283 Author: John Bowman Date: Sat Nov 24 07:42:14 2007 -0600 Return empty secondary axis picture without warning. commit 8b6d1977cf10a5fb8f895d32ef1673aaffcb4ebb Author: John Bowman Date: Thu Nov 22 09:57:42 2007 -0600 Use unsigned long constant. commit 18fe2570cdb6e6d6faa7398e2d06665dfe5804c0 Author: John Bowman Date: Wed Nov 21 23:03:02 2007 -0600 Move existing releaseLock code, catching exceptions. commit c48aaeec7d7ef98ce4d9cffd750cb817bf9a59db Author: John Bowman Date: Wed Nov 21 18:56:01 2007 -0600 Add transform scale(real x, real y). Add marker dot(pen p=currentpen, filltype filltype=Fill). Add comma terminator. Fix dot(frame f, pair z, pen p=currentpen, filltype filltype=Fill). Update documentation. commit 80b0016f88662ea88a22e152c51a174ed7c68923 Author: John Bowman Date: Wed Nov 21 00:09:32 2007 -0600 Work around ghostscript limitations. commit c9114aaa6633625cd23259716b9c36258b338a9a Author: John Bowman Date: Tue Nov 20 23:42:11 2007 -0600 Ensure originalImage is always defined. commit b5ba12a2bb8b78cb5e0f70caea30d1487fada0f9 Author: John Bowman Date: Tue Nov 20 23:41:00 2007 -0600 Release lock before quitting to allow saving. commit f0f301ee37674d8df4d508139765b63387feec42 Author: Orest Shardt Date: Tue Nov 20 18:52:46 2007 -0600 Switch to selection mode after adding script item. commit a396ba6638109d04ab42594429185eff1705c9a9 Author: John Bowman Date: Tue Nov 20 11:26:25 2007 -0600 Re-enable local directory output check. commit 45066fe4d8bd4f398483a7e401fbade2fb88db92 Author: John Bowman Date: Tue Nov 20 00:00:56 2007 -0600 Fix output(s,update=true) and boutput(s,update=true). Fix segmentation faults for attempted operations on closed files. commit b31f66caad49ff668f0c22d523496e269d8e54c8 Author: Orest Shardt Date: Mon Nov 19 22:00:18 2007 -0600 Change zoom selection method to an OptionMenu commit c01836f9ec61bd0217d9d42649f6c916d9224242 Author: John Bowman Date: Mon Nov 19 21:34:47 2007 -0600 Escape ^. commit fbafcbe0c9cd0622107a25d10329fd3e354307c3 Author: Orest Shardt Date: Mon Nov 19 21:19:13 2007 -0600 Account for magnification during undo/redo of translations commit 192ab586ab9caa2a2d24f99ad98995213e0ef06e Author: John Bowman Date: Mon Nov 19 11:59:03 2007 -0600 Fix typo. commit 33aed5e78b70ef12e3d6a2d0a5c25fc41ab59c9f Author: John Bowman Date: Mon Nov 19 01:22:35 2007 -0600 Move xasy temporary directory deletion code into GUI. Avoid creating a second asy process if one already exists. Ignore ctrl-c interrupts from console. Move image file removal up one function level to avoid busy error under MSWindows. commit 2d1e6478e973e9e0bf2868cbcf8f25def7c16ed7 Author: John Bowman Date: Mon Nov 19 00:25:22 2007 -0600 Add Orest's latest fixes. commit 41fc3423e0284e049f3da096b7e71e87246114b1 Author: John Bowman Date: Sun Nov 18 20:29:19 2007 -0600 Add informational message about use of system gc version. commit 6ea171f7207998d6d24cfb82324cb40bad0aa0ce Author: John Bowman Date: Sun Nov 18 18:41:19 2007 -0600 Make configure use a system version of Boehm GC if recommended local version of gc isn't present. commit 5d98ffd60c7b8a57f7749cc51f7484a25f1d14f5 Author: John Bowman Date: Sun Nov 18 18:28:22 2007 -0600 Append generic configure instructions to INSTALL. commit 666d5a2a12a4c5f8097536a1f958d6e068e4bd40 Author: John Bowman Date: Sun Nov 18 11:02:49 2007 -0600 Put deconstructed files in a temporary directory (removed on exit). commit 47aaf8cba0f64678b56f08a408310dc66234b9eb Author: John Bowman Date: Sun Nov 18 09:54:43 2007 -0600 Move workaround for broken curses.h file to proper place. commit 748c5401c34ff4485c8f3f2133b03e79a9ae4808 Author: John Bowman Date: Sat Nov 17 23:59:59 2007 -0600 Fix secondary axis bugs. commit 0424ec5a5dceb6fc66d7b4ed0e110d32cfc4b51b Author: John Bowman Date: Sat Nov 17 18:03:34 2007 -0600 Fix ctrl-c. commit d19e7442ef512674980b4aa336ca07dfdf24624f Author: Orest Shardt Date: Sat Nov 17 12:47:31 2007 -0600 Provide a way to quickly close xasy from the command line. commit 66f3fc046aa9cdb7b7fd3e25bdbaed726ee30f8e Author: Orest Shardt Date: Sat Nov 17 12:24:42 2007 -0600 Fix bezier editor. Optimize undeletion of items from a script. commit e5a11867c05c469519bd1413ae7a95099ecaf2a0 Author: John Bowman Date: Sat Nov 17 00:12:28 2007 -0600 xasy scripts should put temporary files in current directory, just like asy. commit 994971d0a1ce209668104f8641bc3d88427c51b1 Author: John Bowman Date: Sat Nov 17 00:11:56 2007 -0600 Remove temporary image files. commit fd7bde8d9175b34d41eb26361b2148d5c6c00dc9 Author: John Bowman Date: Fri Nov 16 23:20:39 2007 -0600 Limit maximum number of command-line arguments to ghostscript; render in blocks. commit 24d7c2712f50789d7d76517eeaf056dee159d5ed Author: Orest Shardt Date: Wed Nov 14 22:10:57 2007 -0600 Improve handling of zoom slider. commit af154d06aa4d103cc2219480afcf9123c41e7468 Author: John Bowman Date: Wed Nov 14 21:25:31 2007 -0600 Move declarations. commit 4dd797153e256e8f9557fbfed0385d841f24d1cf Author: John Bowman Date: Wed Nov 14 18:52:35 2007 -0600 Remove unnecessary Tk_PhotoBlank call. commit 8b4fa52a9b8ba5b7ef079eaf12f866bb740d4440 Author: John Bowman Date: Wed Nov 14 00:53:42 2007 -0600 Add PIL_BACKGROUND and PIL_MAX_ALPHA_AREA environment variables for efficient alpha channel rendering. commit 49283a682e943ac7ede746d9afe8f51d58f6b4fa Author: John Bowman Date: Tue Nov 13 21:03:45 2007 -0600 Enable full alpha channel support only for objects of area < 10000 pixels, due to slow Tk alpha channel rendering. commit 07f0b56ae3b969af39abf5fee1c43d5abded1e58 Author: Orest Shardt Date: Tue Nov 13 12:48:04 2007 -0600 Prevent redraw of canvas when zoom handler is invoked but magnification is not changed. commit 23e83f68d846bc4548cd253a9e994c19196c8539 Author: John Bowman Date: Tue Nov 13 02:20:36 2007 -0600 A much better fix for PIL antialiasing and transparency that renders quickly. commit ca627126bd89f96989de930a3049cf89fed87fc0 Author: Orest Shardt Date: Mon Nov 12 18:57:08 2007 -0600 Fix rotation to take into consideration the current magnification commit c36784996337c369338e441633c4205345fa9b7e Author: Orest Shardt Date: Mon Nov 12 16:22:05 2007 -0600 Fix error in handling of magnification in scripts commit fb07c1c3e38daaff5997700abbbee199c160b2f1 Author: John Bowman Date: Mon Nov 12 15:50:58 2007 -0600 Use full precision constants. commit c444b66488de9511b74edbc4649173c984237e39 Author: Orest Shardt Date: Mon Nov 12 15:35:20 2007 -0600 Implement magnification option and zoom feature commit e7cf5e4432837cb3e16daf991a9f4a121f2f43de Author: John Bowman Date: Mon Nov 12 01:28:55 2007 -0600 Replace locale-dependent call to atof() with locale-independent lexical::cast(). commit edb09b23d5688abb9653ca1cf47fa866fd8d34f1 Author: John Bowman Date: Sun Nov 11 23:37:20 2007 -0600 Speed up GUI deconstruction. Make "png" the default value of xformat. commit f691c77aad9bd09ef9835c8f6871b600d29c6864 Author: Orest Shardt Date: Sun Nov 11 21:54:28 2007 -0600 Removed debugging information commit b8ee25d1d087cc339f194f3c685a3c524e770421 Author: John Bowman Date: Wed Nov 7 23:01:26 2007 -0600 Update intersectionspoints. commit 7ba2d08022f92e24275b4a19425bc44f923269d9 Author: John Bowman Date: Wed Nov 7 23:00:15 2007 -0600 Update documentation. commit 9583ff94f4abdbe20a9e57964875baad58b9fe41 Author: John Bowman Date: Wed Nov 7 22:35:19 2007 -0600 Fix bug in intersections. Add optional fuzz parameter to intersections and intersectionpoints. commit dc0ab50b96d1e8853fd81bcd150cf712c59d2352 Author: John Bowman Date: Wed Nov 7 22:03:14 2007 -0600 Add string[] split(string s, string delimiter). commit 4cfbb87b4627726d2c9cb82f0343e266015f7704 Author: John Bowman Date: Sun Nov 4 22:25:35 2007 -0600 Disable readline history when reading from a pipe. commit aabfeb99010b1b561e7c73cfa846b60d0b92d25d Author: John Bowman Date: Sun Nov 4 21:23:02 2007 -0600 Update discussion of MSWindows configuration variables. commit 1c56cdb459bdb211056748e4e3473b0a650ac4a9 Author: John Bowman Date: Sun Nov 4 21:13:34 2007 -0600 More windows installation fixes. commit 905cad8c932a8788a7611181d31ae042a0679a10 Author: John Bowman Date: Sun Nov 4 16:52:41 2007 -0600 Make interactive mode exit with a zero return code. commit c88c34591ffa6bc397987914885b8e5e20e7490f Author: John Bowman Date: Sun Nov 4 16:27:28 2007 -0600 Fix Windows uninstall. Remove hard-wired path. commit 97abc8fe2152ef82a5d807722d702e91891522cd Author: John Bowman Date: Sun Nov 4 10:48:27 2007 -0600 Add missing function. commit e92745417a027f1cdb46d165fb70fd2bad94788d Author: John Bowman Date: Sat Nov 3 16:50:29 2007 -0600 Add real[] abs(pair[]) and real[] abs(triple[]) functions. commit c4d2af3505ee392b9d0ad6871904dd93921a0102 Author: Orest Shardt Date: Sat Nov 3 12:24:00 2007 -0600 Revert change to example. commit 94876755d955c4dd32f37559c678f17e366c75bc Author: Orest Shardt Date: Sat Nov 3 12:05:23 2007 -0600 Prompt user before opening a file if current document was modified. commit 0e6b2b3e7f6f014a1f78bd176f815b87f4bd5c59 Author: John Bowman Date: Fri Nov 2 23:09:45 2007 -0600 Add windows installation fixes. commit 0d2e36675751c0a8db71e65f9e369cf55c8e3fd4 Author: John Bowman Date: Fri Nov 2 16:13:23 2007 -0600 Windows installation tweaks. commit 74e0d0cd5df704c7fd8ab03f349e562014246108 Author: John Bowman Date: Fri Nov 2 10:48:05 2007 -0600 Handle degenerate reference vectors. commit 0075ad14c3ab42375654663c4d657a233d39cf94 Author: John Bowman Date: Sun Oct 28 13:31:35 2007 -0600 Project all reference contributions in direction of maximum contribution, for numerical robustness. commit 72017f7c16e38929719fe4dcfaf87660b3925947 Author: John Bowman Date: Sun Oct 28 12:16:24 2007 -0600 Improve reference vector calculation. commit fb19b1223ae572d421e694d4241c6c65c985943a Author: John Bowman Date: Fri Oct 26 11:29:19 2007 -0600 Respect comments and double quotation marks in whitespace mode (just like cvs mode). commit e8cc7a2e8360cf3a51a579911760b836ea92fe6a Author: Andy Hammerlindl Date: Thu Oct 25 22:19:32 2007 -0600 Test for invalid defvals in rest parameters. commit e4162e78e3184911849a9d8187c430eedaa9670e Author: Andy Hammerlindl Date: Thu Oct 25 22:01:21 2007 -0600 Removed unused code. commit 9157206842acd8ede6c6290a098ed64561fcb0f1 Author: John Bowman Date: Mon Oct 22 10:38:21 2007 -0600 Re-enable automatic logarithmic axis coverage routine. commit 3a92d0fac132773d86f66f1213925b4aedef6d7e Author: John Bowman Date: Fri Oct 19 22:55:13 2007 -0600 Exit more gracefully under MSDOS when execvp fails. commit b5e41991c0a31687e8b750d0fdfff149e48044c2 Author: John Bowman Date: Fri Oct 19 21:34:04 2007 -0600 Implement firstcut and lastcut reliably in terms of a general cut(path p, path knife, int n) routine based on intersections. Increase the duplicate point detection fuzz. Automatically sort the array returned by intersections. commit f831060dd4cfef9b767dee05c3d5689937a2c116 Author: John Bowman Date: Thu Oct 18 15:03:38 2007 -0600 Add patch to avoid segmentation fault with gc-7.0 on out-of-memory error. commit f14d0b6e7448e8567e1c066f0eff7ef37835045e Author: John Bowman Date: Thu Oct 18 14:15:53 2007 -0600 Make history() return the entire stored interactive history. commit 6faa52d45246ff681560085b9d3f0bb42a1e2495 Author: Andy Hammerlindl Date: Wed Oct 17 20:04:02 2007 -0600 Fix adding of automatic semicolons to the history. commit 3ce0333e8749d984db50549f1cd2f54ee4a72d9a Author: Andy Hammerlindl Date: Wed Oct 17 19:59:11 2007 -0600 Fix default args for rest args. commit 8d273ded65db953c1f0830061e5fdea6f798959a Author: John Bowman Date: Tue Oct 16 22:05:12 2007 -0600 Add a routine history(int n=1) that returns the interactive history. Store auto-terminated lines in the interactive history. commit 3e82c2c50fa292781a2befc3c46afa35987409b9 Author: John Bowman Date: Mon Oct 15 09:42:00 2007 -0600 Try to use a smaller Step adjustment. commit a3451647eec45a5d2b4823663f8283cf1dbbaae2 Author: John Bowman Date: Mon Oct 15 00:12:30 2007 -0600 Fix Asymptote path for MSWindows. Make uninstall remove Xasy start menu shortcut. commit a186cc7f9dd113c2fabe9edd3c98cb16b3328a2b Author: John Bowman Date: Sun Oct 14 22:43:33 2007 -0600 Add Nullsoft installation script for MSWindows. commit 32db9170f83b5cf74589febea822cbc3310910e2 Author: John Bowman Date: Sun Oct 14 22:35:13 2007 -0600 Under MSWindows, look for asy files in installation path instead of in uninstall path. commit 6da69898626799d3bfad1e472665db3766418cb8 Author: John Bowman Date: Sun Oct 14 22:24:27 2007 -0600 Try to use at least two major ticks. commit c94d19a62f184771312678070421a6a0a13a9190 Author: John Bowman Date: Sun Oct 14 21:15:41 2007 -0600 Fix title(""). commit f1e3b46122846bb495c02d26c3d391b8c5c13681 Author: John Bowman Date: Thu Oct 11 12:22:12 2007 -0600 Increment version to 1.37svn. commit b87392a79cac3176f047387893845cb5c02179c7 Author: John Bowman Date: Thu Oct 11 11:31:34 2007 -0600 Fix bugs in tex(), postscript(), gsave(), and grestore() commands. commit 4a1e9077f30dd1017819d1d5e2ecd3488a3f7c7a Author: John Bowman Date: Thu Oct 11 03:15:48 2007 -0600 Increment version to 1.36svn. commit 2cc3a721455f91fdca5ae6042490c1e6aa0d941f Author: John Bowman Date: Thu Oct 11 02:21:31 2007 -0600 Fix numeric formatting of setdash arguments. commit 48cfbe4d7f99da1836d6fea1911ad3c8bf65d507 Author: John Bowman Date: Thu Oct 11 01:21:58 2007 -0600 Work around hang in intersect for nearly identical paths by adding some fuzz. commit 788117602481a0a89e5c159704bfef4e16e4a0ee Author: John Bowman Date: Thu Oct 11 00:44:58 2007 -0600 Increment version to 1.35svn. commit 03ef1f2dd0e9b79fc36772d4c2e860972f25e12d Author: John Bowman Date: Wed Oct 10 22:44:16 2007 -0600 Add Cygwin fixes. commit 31eefd4d3857b0fc9eeb34ee36dd362d6b0e5a6b Author: John Bowman Date: Wed Oct 10 15:17:31 2007 -0600 Update GUI documentation. commit 6275cee1287a0dfd35311d6276a519bc582a4495 Author: John Bowman Date: Wed Oct 10 10:59:03 2007 -0600 Make xasy a relative symbolic link. commit 7cd198607408c819e09bfa652ea2909f671dfe83 Author: John Bowman Date: Wed Oct 10 09:00:51 2007 -0600 Update xasy file name. commit f763966f44b977c17f78cc6a8b16a5187bd33d87 Author: John Bowman Date: Wed Oct 10 08:42:59 2007 -0600 Fix typo. commit fc3662f7c79eab71825c995fb96e15bdedb3b7de Author: John Bowman Date: Wed Oct 10 08:36:32 2007 -0600 Install xasy and associated files. commit ababea1854fe43a1d165a003b0a4251ea187357e Author: John Bowman Date: Tue Oct 9 22:12:51 2007 -0600 Update xasy location. commit 4f4ded526e6099b8b2408190591d4fd287d003cd Author: John Bowman Date: Tue Oct 9 22:00:32 2007 -0600 Remove obsolete reference to settings.deconstruct. commit 955c47c6d859c7a857147ce76d482fa53653281e Author: John Bowman Date: Tue Oct 9 21:43:53 2007 -0600 Replace opendot with filltype argument of UnFill to dot routines. commit 4884a568746d707dd424b3dfcf0b9c1e1344df25 Author: John Bowman Date: Tue Oct 9 15:51:51 2007 -0600 Remove intermediate eps files in inline pdf mode. commit 376a4be0b81b3fcea6a7a0d9c8ee07ec41c17eeb Author: John Bowman Date: Tue Oct 9 15:05:23 2007 -0600 Implement an improved, robust version of intersect. Implement intersectionpoints in terms of a new more efficient and robust intersections routine. commit 345de32960a08aef94f76e11bfc0239a172f421f Author: John Bowman Date: Tue Oct 9 15:01:41 2007 -0600 Add trailingzero tick format. commit 80d8ba197e620411729aec8e6ae6e2988508799d Author: John Bowman Date: Sun Oct 7 11:00:47 2007 -0600 Make 1.34-26 changes work with deconstruct. commit 5a47d0a9714054d19b8e774f0407e0f2eb220cc4 Author: John Bowman Date: Fri Oct 5 21:03:57 2007 -0600 Adjust defaultformat for axes to make tick labels unique. Add general trailingzero format string; update examples. commit 5db97dd5e0806f0550a03f36c6dca5403b92365c Author: John Bowman Date: Wed Oct 3 14:22:52 2007 -0600 Improve autoscaling of graphs for close minimum and maximum values. commit 0149f463202c63f414bd5f0144d0f1a7daebeb2c Author: John Bowman Date: Fri Sep 28 12:31:44 2007 -0600 Add example of opendot. commit 30bd682dde07cd1b3eb5b871c530e90ef53e214e Author: John Bowman Date: Fri Sep 28 12:19:18 2007 -0600 Add opendot routines. commit c899e161bc16fe731e9515aa4ba1929acaf14177 Author: Andy Hammerlindl Date: Mon Sep 24 21:11:00 2007 -0600 Changed global.back()-> to processData(). commit 4eaa1727e9a7e4e72fbffb36bf3618555da00c06 Author: Philippe Ivaldi Date: Mon Sep 24 11:20:27 2007 -0600 Defer hard coded commands and options to variables. commit b306d9c7ae185bf62931d835282e814c7c1204ef Author: John Bowman Date: Sun Sep 23 10:45:41 2007 -0600 Fix shipout bug. commit 9c0ad5c96e8c5cf06233b0e7d2432e214d10c2c8 Author: John Bowman Date: Fri Sep 21 10:17:43 2007 -0600 Remove obsolete -q option. commit ea214d26275c2038153b723368c82de1c5ca277a Author: John Bowman Date: Thu Sep 20 22:27:59 2007 -0600 Change default LaTeX font to package-dependent setting. commit 49a976c00b8eba6912cd07d08bbfa85f9932802e Author: John Bowman Date: Wed Sep 19 21:46:56 2007 -0600 Add modification of ncurses patch from mvid. commit 9a633a15cd6a196735c2dd70c42326e49158b145 Author: John Bowman Date: Tue Sep 18 00:10:58 2007 -0600 Avoid nesting capacity overflows in arctime. commit 98fbe3b5a82db6ac64b90b4c9011fe1628ebb1e2 Author: John Bowman Date: Sun Sep 16 20:57:35 2007 -0600 Add new magnification argument to shipout. commit c8254ef8e6546640a8bf2dbd8696572168bcc9d4 Author: John Bowman Date: Sun Sep 16 20:48:23 2007 -0600 Make reportWarning generate a warning message only. commit 4bf55cacf7cea227d314cc0addacb3b59a8ace9c Author: John Bowman Date: Sun Sep 16 20:42:53 2007 -0600 Ignore spurious final blank line when reading strings. commit 2b6f1ed2e728e3019b7d7fe51a2cc46f70a7a958 Author: John Bowman Date: Sun Sep 16 11:44:00 2007 -0600 Fix string csv reads. commit 1babff1085b49a6d234498d80024f13376a95f0b Author: John Bowman Date: Sat Sep 15 22:12:21 2007 -0600 Another comment fix for reading strings. commit 8c4b46cbe8576444eb9239b89322531169970281 Author: John Bowman Date: Sat Sep 15 02:42:12 2007 -0600 Fix example. commit 5f24bb57d0d77aa469d3dc322ec68a0f358df338 Author: John Bowman Date: Sat Sep 15 02:40:06 2007 -0600 Fix typo. commit 192b449209ca8a72ec1890ef029a448085354450 Author: John Bowman Date: Sat Sep 15 02:38:23 2007 -0600 Fix errors in documentation and FAQ. commit e51365a16cc03474c179cfe191008087cccd2b83 Author: John Bowman Date: Fri Sep 14 16:09:19 2007 -0600 Support comments when reading strings in cvs mode. Remove unused file. commit ab9eb1daf63ee6670390a3c937222870dfa32382 Author: John Bowman Date: Wed Sep 12 19:42:40 2007 -0600 Improve description of interativeWrite. commit 94a55d20dfde26954484b9da157f838c38ded005 Author: Andy Hammerlindl Date: Sat Sep 8 11:48:06 2007 -0600 Fixed syntax to allow expressions such as (x); Based on a patch by Orest Shardt. commit 2d320faddc0f743c7bc8bf26f309de70869a686f Author: Andy Hammerlindl Date: Wed Sep 5 16:53:51 2007 -0600 Added interactiveWrite option. commit 3b37adefe45a0fe16882cc5e21bc35f3997803e8 Author: John Bowman Date: Tue Sep 4 21:15:41 2007 -0600 Remove --enable-cplusplus option. Remove unused quiet option. commit 74cd6de443c34c6a37cce5d25f599890f04982e8 Author: Orest Shardt Date: Mon Sep 3 12:01:42 2007 -0600 Implement pen validation commit 3baf769670c61f611e2f6bdfd56755eaaf58bc5d Author: John Bowman Date: Sun Sep 2 23:36:10 2007 -0600 Make deconstruct close bboxout file. commit 3a91e4b10a34161daff8aa042e79c4d682f8d416 Author: John Bowman Date: Sun Sep 2 23:21:29 2007 -0600 Use indexedTransform constructor. commit 5fe7064890f65e40a5b19c25e43329d501fb994b Author: Orest Shardt Date: Sun Sep 2 21:01:09 2007 -0600 Make various bug fixes and improvements. commit 377a44d7fca914f6116cb0c6655f223876ce547b Author: Orest Shardt Date: Sun Sep 2 18:07:55 2007 -0600 Fix documentation request. commit 5911d1ee65db0187c4aa5ddb369175429e8a789d Author: Orest Shardt Date: Sun Sep 2 17:59:21 2007 -0600 Temporarily remove zoom control until feature is implemented. commit 75064e5ff4b5d22382b6ca82d71f48ba037ca8ab Author: Orest Shardt Date: Sun Sep 2 17:46:34 2007 -0600 Improved text in dialogs. Made the loading and saving of files specified on the command line consistent. commit 7e6381b9a659a56db2d9dabe1e2bc516ce0005bf Author: John Bowman Date: Sat Sep 1 22:34:02 2007 -0600 Standardize fillrule argument name. Add support for magnification. Remove unused code. commit f5a10edefe53c276e7fa1546f9e05c6f32c48d11 Author: Andy Hammerlindl Date: Fri Aug 31 20:16:17 2007 -0600 Fixed bug regarding permission lists of types. commit 9e8c5d63e7aba58dc7439fd272b3656d8b08e0e1 Author: Andy Hammerlindl Date: Fri Aug 31 20:15:41 2007 -0600 Corrected documentation. commit 343d697bc89fc2df9d5cce3bfe316918e52e0376 Author: Andy Hammerlindl Date: Fri Aug 31 20:15:16 2007 -0600 Made parameter name more descriptive. commit 0abbb7453f977e5e689a4363fca2d6bf2fb508d9 Author: John Bowman Date: Fri Aug 31 08:35:08 2007 -0600 Use unique keys. commit 08e24d5b904996f5a4d44906129423d024dab66e Author: John Bowman Date: Thu Aug 30 20:15:48 2007 -0600 Check for libcurses only if libncurses is not found. commit c2e2738b9148bbeb5ed91b041a149d06e33b75a2 Author: John Bowman Date: Wed Aug 29 13:56:57 2007 -0600 Use constructor for indexedTransform. commit 8a5bf5734476d80f7092185a5c49c06785fb1343 Author: John Bowman Date: Wed Aug 29 11:22:33 2007 -0600 Fix shipout when inXasyMode is true. commit 351668ee2daa92336da7ed7715a190a612576c2f Author: Orest Shardt Date: Wed Aug 29 09:15:31 2007 -0600 Fix logic for recognizing modified files. Correct the logic for querying user about exporting modified files. commit a264e87e1a9787f4d5b87a8b57bed3878852fd1a Author: John Bowman Date: Wed Aug 29 08:54:00 2007 -0600 Revert to gsave/grestore instead of clipsave/cliprestore due to pen caching assumptions. commit a626ac307bbfcb755732809dcec0cd38a5cf9c90 Author: John Bowman Date: Tue Aug 28 09:30:26 2007 -0600 Enclose tex clip within picture environment to avoid unwanted page breaks. commit 0aa8af84e3f16d0ee7c2cd0769c9a8f015083a75 Author: Orest Shardt Date: Mon Aug 27 15:48:38 2007 -0600 Prevent switching editing mode during incomplete drawing operation. Search for file with .asy extension if no .asy extension provided. commit 3a4df7dabf437b5d076402180c0f7db8ad78a2d8 Author: Philippe Ivaldi Date: Mon Aug 27 15:33:06 2007 -0600 markers.asy: compute golden mean in a static variable. commit 0387fb5da5f095d833108ddd14d0685ab18b9451 Author: Orest Shardt Date: Mon Aug 27 15:23:17 2007 -0600 Remove unneeded whitespace. commit 489f494bcea9bcfa324c9f2e32c852f1a307e5e9 Author: John Bowman Date: Mon Aug 27 11:56:33 2007 -0600 Rename patterns to currentpatterns. Remove preamble option from shipout for consistency with xasy. Make explicit shipouts with options work with xasy. commit cf6c8f2248e6ae21ea6a8ae826f9d0474d495387 Author: John Bowman Date: Mon Aug 27 10:33:40 2007 -0600 Rename xasy.py to xasy. commit b21e623118dd4113638aafe1e3f746a1f7436bbc Author: John Bowman Date: Mon Aug 27 10:24:23 2007 -0600 Update example. commit 5508f52a286ec4d49da60fd84d5c15490c3c26a3 Author: Philippe Ivaldi Date: Sun Aug 26 19:13:14 2007 -0600 marker.asy: uniformize marker sizes and notation. commit 516ff363207c9dd8d2cd5c478c27880b388379f3 Author: John Bowman Date: Sun Aug 26 15:40:25 2007 -0600 Explain how map is a special case of sequence. commit b08fb71bde104e3c1274a4b008f6fbda1713a6a5 Author: John Bowman Date: Sun Aug 26 13:28:09 2007 -0600 Fix documentation of map. commit 3e7ea0f51ddd4619c4cad9d6b5efb34dd68acac3 Author: John Bowman Date: Fri Aug 24 11:00:05 2007 -0600 Simplify logic. commit e704d1a6d00a5486093d2cca45c47d983246557f Author: John Bowman Date: Fri Aug 24 10:59:42 2007 -0600 Make asy -o /dir/ file.asy output to /dir/file.eps. commit f25c6597ee533083af25b199ad54f6c1b1493f86 Author: John Bowman Date: Thu Aug 16 08:23:05 2007 -0600 Add discussion of 3D generalization of Hobby's algorithm. commit 19b53099bb5583c7192e61a8d88e4913ea68b640 Author: John Bowman Date: Tue Aug 14 04:39:42 2007 -0600 Avoid evaluating function outside of [a,b] (due to finite numerical precision). commit c0abe1380e8aa2e9fa17037a88c00f39eb3c1a9a Author: John Bowman Date: Tue Aug 14 02:15:00 2007 -0600 Fix accent. commit dff77b74cee87bf917f14232b130accdc0a3d62c Author: John Bowman Date: Sat Aug 11 04:01:15 2007 -0600 Use \PackageWarning instead of \message. Update list of contributors. commit dc32ed7b66b6f1c588df49457e7e714164e1779f Author: Orest Shardt Date: Thu Aug 9 12:13:42 2007 -0600 Use askopenfilename() instead of askopenfile() Use asksaveasfilename() instead of asksaveasfile() commit ff037a273b0a8da0e30a31d6e3f6c0c5ef21b4f0 Author: Orest Shardt Date: Thu Aug 9 11:00:42 2007 -0600 Disabled tear-offs for improved crossplatform look and feel User is now asked about saving changes when closing a modified file commit c429589301537c5e49c95cf9c811cfff831bf766 Author: John Bowman Date: Thu Aug 9 02:59:28 2007 -0600 Remove old GUI transform support. commit 865d848b082faac6d4f00cdc0913d92615441c9c Author: John Bowman Date: Thu Aug 9 02:34:50 2007 -0600 Add -level option to specify PostScript level (default 3). Use more efficient clipsave/cliprestore commands with -level 3. Optimize printer stack use by pruning unneeded clipsave/cliprestore commands. Avoid nesting of clipsave/cliprestore commands when using UnFill. commit 8d07a22aa46ddf814cdaa633c448d2433d56436d Author: Orest Shardt Date: Tue Aug 7 11:26:04 2007 -0600 Changing the current pen's properties affects selected items commit 40048c0fe0b6bd391463ab84f3570638c9f4c107 Author: John Bowman Date: Tue Aug 7 03:24:10 2007 -0600 Compute pair^int by repeated multiplication, just like real^int. commit 06b5949d2cc85d70e3cfd0811cf705d8afcf8eba Author: Orest Shardt Date: Wed Aug 1 09:39:08 2007 -0600 Removed signals for xasy Switched from GUIop to xformStack in shipout() commit 5c7478245556a81d678b66e2ee49a180353112bf Author: Orest Shardt Date: Tue Jul 31 15:05:37 2007 -0600 Fixed bugs in undo/redo Allowed nested begin/end actionGroups in UndoRedoStack Added forceAddition option to drawOnCanvas Added exitXasyMode() to end of files Implemented undo/redo for single item in a script Implemented undo/redo for clearing of an item's transforms Implemented undo/redo for drawing and deletion of a drawn item Implemented undo/redo for modification of a drawn item commit 8f0fdd8dbb4443da7c31ae8e8c06af8b83774da3 Author: Orest Shardt Date: Mon Jul 30 15:09:11 2007 -0600 Added undo/redo for creation and editing of script items Added undo/redo for raising and lowering of items commit e663da444b6bc1a3f94c7db8277671921a7c8ccd Author: Orest Shardt Date: Mon Jul 30 12:12:29 2007 -0600 Updated headers Modified method for storing undo/redo information for translations Implemented undo/redo for addition and modification of labels commit 93322a02dd16526537f5eaecef606225f0de45df Author: John Bowman Date: Sun Jul 29 17:22:45 2007 -0600 Increment version to 1.34svn. commit 4d5a18c811ee847867902d4553290c4925c3ce5d Author: John Bowman Date: Sun Jul 29 10:25:12 2007 -0600 Fix interactive viewing. commit 2c5bf17ed0f4a2d805b84a946dcae789f78899af Author: John Bowman Date: Sun Jul 29 03:29:03 2007 -0600 Remove extraneous preprocessor definitions. commit a671404751ce001ef2ca619d7ae01d18dac048a1 Author: John Bowman Date: Sun Jul 29 02:36:43 2007 -0600 Add large file support. commit 9099bc38057450a5e1183e942d24ada30431d970 Author: John Bowman Date: Sat Jul 28 13:41:50 2007 -0600 Update list of contributors. commit f39eb8d3113030a3777abab069b17971651db7a8 Author: John Bowman Date: Sat Jul 28 09:53:06 2007 -0600 Open input files in input-only mode. commit e6c2ef521c795f58273d873dfad405ed7f78133e Author: John Bowman Date: Sat Jul 28 09:19:07 2007 -0600 Allow multiple invocations of labelpath. commit ca808b0649e3cff006e73fdae534097766f5848b Author: Orest Shardt Date: Fri Jul 27 14:57:14 2007 -0600 Handle case of script that produces no images. Remove keyboard bindings for main window when using script editor. commit 7c5db3faa9b555a50cd81755816bfe58ff96519d Author: Orest Shardt Date: Fri Jul 27 14:38:23 2007 -0600 Raising and lowering of script items preserves drawing order of all items in script commit ff64471302290d06a56d9e579e93d94a5c69be2e Author: Orest Shardt Date: Fri Jul 27 14:23:57 2007 -0600 Fixed handling of deleted items. commit 342434d25d682a7a8cad1bf139d2088e35ef3f76 Author: John Bowman Date: Fri Jul 27 14:05:08 2007 -0600 Work around old broken compilers. commit 44596544b2f62896a2d60a046e4eef1b96877ba5 Author: John Bowman Date: Fri Jul 27 13:13:41 2007 -0600 Fix conditional. commit 8a48b748d74dc52d5860f403414a0313251b1c9e Author: Orest Shardt Date: Fri Jul 27 11:45:34 2007 -0600 Improved handling of missing asymptote executable on windows commit fa8771204c3378f71da1fa2513cad7e15debfcdd Author: Orest Shardt Date: Fri Jul 27 10:37:56 2007 -0600 Error fixed commit 3f084166c5dea652fb4dccb97315d9134a7d2161 Author: Orest Shardt Date: Fri Jul 27 10:23:52 2007 -0600 Check registry to find asy installation on windows. Add browse button for asy path selection commit ccfe23837d0759e2e726103fffd05b26f147df68 Author: John Bowman Date: Fri Jul 27 10:02:28 2007 -0600 Restrict projection bounding box recursion to a depth of 16. Add teapot example. commit 2ae916421017adc0b6654c1a6b98e9ae42596b6d Author: Orest Shardt Date: Fri Jul 27 09:46:58 2007 -0600 Syntax fix commit 585d78bfbd3b3db5ce1bd630bc9e2e75ff3f4748 Author: John Bowman Date: Fri Jul 27 05:24:13 2007 -0600 Upgrade licence to GPL-3.0. commit 1086bf459bc045c664f277d7c8d52432f1c724af Author: John Bowman Date: Fri Jul 27 03:50:46 2007 -0600 Add complex version of quadraticroots. Add quartic solver. Improve accuracy of cubicroots in degenerate cases. commit f22f92962a269614ea7e166caba5fefb082aab8b Author: John Bowman Date: Fri Jul 27 01:26:24 2007 -0600 Make min and max return (0,0) for an empty picture. commit 049160b1567c4a50a7dfec4535a793bed456d349 Author: John Bowman Date: Fri Jul 27 01:07:31 2007 -0600 Add cast; standardize formatting. commit 1a2c4145835825f5133f9b08e1e1224b9ee57122 Author: John Bowman Date: Fri Jul 27 01:06:24 2007 -0600 Add pair sqrt(pair) function (principal branch). commit ed0d195c14e24f155b1bcf8bcfc8cf072ec7b91e Author: John Bowman Date: Fri Jul 27 01:05:35 2007 -0600 Fix picture scaling. commit 4b00fbe6270ba161ee1481b38e7ff1b63f19dcb8 Author: Andy Hammerlindl Date: Thu Jul 26 09:17:38 2007 -0600 Edited comments. commit ef2ce85c3258b5ef011574f6afa9044c30489fe7 Author: Orest Shardt Date: Wed Jul 25 14:41:31 2007 -0600 Removed unneeded message commit ef44082e820bea38a8f346342a07ad8fdd082d2b Author: Orest Shardt Date: Wed Jul 25 12:50:30 2007 -0600 Fixed rotation of multiple objects commit 8bdee6a20399fef2cb5adf638a096143faf9364f Author: Orest Shardt Date: Wed Jul 25 12:43:59 2007 -0600 Corrected divide-by-zero handling commit c56d3c762babdee25f974634f9d3a2a2094a6636 Author: Orest Shardt Date: Wed Jul 25 12:27:37 2007 -0600 Fixed button width commit 59352469e407a869f3b3525d41370d505704a8d1 Author: Orest Shardt Date: Wed Jul 25 11:11:13 2007 -0600 Fixes for Windows support commit a5de675808ae3b699fe0c1d2d5825942cabd0e8b Author: John Bowman Date: Wed Jul 25 03:28:31 2007 -0600 Remove deconstruct() and gui() in favour of settings.deconstruct. Rename deconstructpic to deconstruct; standardize arguments. commit b268da28048455fa93a62489ce17d496c5ec7161 Author: John Bowman Date: Wed Jul 25 03:07:20 2007 -0600 Revert 1.33-91; update documentation. commit 73af8f210b428dfab4763067ef5f5964894e9965 Author: Orest Shardt Date: Tue Jul 24 15:24:08 2007 -0600 catch unnecessary exception commit 93fde433d8f8716cdd5e3043ea0df51a4eb26309 Author: Orest Shardt Date: Tue Jul 24 14:53:55 2007 -0600 Implemented undo and redo for shifts and rotations commit cd3e162381ba234aad44fd60c093ec68314d303e Author: Orest Shardt Date: Tue Jul 24 11:59:29 2007 -0600 Added skeleton for undo/redo operations commit b22ac1ebe39f1eb4c171e389ed68efaf765186ac Author: Orest Shardt Date: Tue Jul 24 11:58:58 2007 -0600 Added accelerators for menu items commit fa6cd244ae11b082dadb513698dc97b981d350f8 Author: Orest Shardt Date: Tue Jul 24 09:37:47 2007 -0600 Removed unneeded code; fixed export command commit 6dc7ffd7b5f6e59fc67ac892663e743a37a16a4e Author: John Bowman Date: Tue Jul 24 08:40:27 2007 -0600 Turn off readline editing when reading from a pipe. commit bb3f9064985651c2244413744ef56cb2fc4615ee Author: John Bowman Date: Tue Jul 24 03:51:06 2007 -0600 List multiple cubic roots individually in all cases. commit 8e30d4bd07cccbab8615291d904bb43b390c1180 Author: Orest Shardt Date: Mon Jul 23 14:08:12 2007 -0600 Additional parts for implementation of new deconstruction method commit be4bd6e4e13e79793a7c0f1576855b919d013bcc Author: Orest Shardt Date: Mon Jul 23 14:07:03 2007 -0600 Implemented rotation of drawn and scripted items commit 394a24db69248fdd56bc1db737b8dd45b5bfaf23 Author: Orest Shardt Date: Mon Jul 23 14:06:28 2007 -0600 Better parsing for script items commit eed3dc18f4761f37e8a967db84ab0385f81865b5 Author: Orest Shardt Date: Mon Jul 23 14:05:38 2007 -0600 Implemented new, cross-platform image deconstruction method commit acfeb6d23f030cc4b9e6ec416bfaf9528a4d1eec Author: Orest Shardt Date: Mon Jul 23 14:03:34 2007 -0600 Added deconstructpic() for image deconstruction by GUI commit 23d4ce1589592d9b19d1638d471b83c835085b4e Author: Orest Shardt Date: Mon Jul 23 10:31:28 2007 -0600 Various improvements commit 196e50571ea05191713c52a9318ece8bb51b9c45 Author: Andy Hammerlindl Date: Mon Jul 23 10:23:31 2007 -0600 Removed commented out code. commit 4a96f66c911483b536677803ac7a1d24dd2b7a4a Author: John Bowman Date: Mon Jul 23 04:06:01 2007 -0600 Change order of tests. commit bc8702d081b5d08b5533edc18a6e411358ddc603 Author: John Bowman Date: Mon Jul 23 04:04:25 2007 -0600 Detect roots near zero in cubicroots. commit b28193efbfc40b05c5f07a9c82dc75144ae5ce24 Author: John Bowman Date: Sat Jul 21 06:19:10 2007 -0600 Add Radoslav's bbox and bbox3 code for surfaces. commit 99700051cef605c1a6620e6c397cc0492aed1eec Author: John Bowman Date: Thu Jul 19 16:30:26 2007 -0600 Avoid potential uninitialized warnings with -finline-limit=400. commit 9edb7ce84ff4ca2ec7552f617db32ada59fbe30e Author: Andy Hammerlindl Date: Thu Jul 19 15:13:18 2007 -0600 Removed erroneous GC_DECLARE_PTRFREE specifiers. commit d0d35f2c8d4d2f22a2086d988022a63175b2e6c6 Author: John Bowman Date: Thu Jul 19 03:09:39 2007 -0600 Fix cxx errors. commit 9aa0935babeafd92da4e63764be00aa365a9a99d Author: John Bowman Date: Thu Jul 19 02:51:23 2007 -0600 Workaround broken texi2dvi installations. commit 484ba07ac520d8b1add27cf6c96305ac7cca0e1c Author: John Bowman Date: Thu Jul 19 02:17:03 2007 -0600 Trap quotient(intMin,-1). commit 40d6c962a759685d21f8cd70f1001bd90c84cb9c Author: Andy Hammerlindl Date: Wed Jul 18 22:28:58 2007 -0600 Made the NOHASH venv interface compatible with the optimized hashtable venv. commit 37425660c088766be9625f55b69e4c67f8b1cffb Author: Andy Hammerlindl Date: Wed Jul 18 21:37:52 2007 -0600 Added match caching and hashtable presizing optimizations. commit 04b9e380275f804d9dfa8bc65e3c7d06ac4adf41 Author: Andy Hammerlindl Date: Wed Jul 18 21:35:20 2007 -0600 Removed old code. commit 7495bd931d9d30fe73d8dfaffda6b1f64cd3092b Author: John Bowman Date: Wed Jul 18 17:13:02 2007 -0600 Fix page numbering of slide presentations with -u stepping=true. commit c2a76d97a4cca4325b00ff7a2ebf62260d688828 Author: John Bowman Date: Wed Jul 18 17:01:58 2007 -0600 Minor optimization. commit 4035590d60193fc98b0bfec1db8ebfc9d22dd8e9 Author: John Bowman Date: Wed Jul 18 16:39:08 2007 -0600 Remove further duplicate config.h imports. commit b6d3558daf474eb865fb7240bc87fb1267c0cb41 Author: John Bowman Date: Wed Jul 18 16:21:52 2007 -0600 Eliminate multiple config.h includes. commit 67462e2c08283dea13ff469a440f97c5db90e0a4 Author: John Bowman Date: Wed Jul 18 15:52:01 2007 -0600 More cxx fixes. commit df5f4bfbfa7b2d55ba1b0028b8668cd1d198aa5f Author: John Bowman Date: Wed Jul 18 15:42:41 2007 -0600 Fix cxx warnings. commit 6bfe300676c319119e106e3db0b703eb42b2836b Author: John Bowman Date: Wed Jul 18 15:18:25 2007 -0600 Work around missing definitions of LONG_LONG_MAX, etc. commit 53f618d8d624d926fa81cfa99052940ec32e860e Author: John Bowman Date: Wed Jul 18 14:41:30 2007 -0600 Move climits to proper place. commit c6aa8fba639f14657b79508906eee0f5bc346f20 Author: Andy Hammerlindl Date: Wed Jul 18 14:04:29 2007 -0600 Removed unused OP token. commit f09110dbb915f38232bfa0ba49f4d1d7167c4fed Author: Andy Hammerlindl Date: Wed Jul 18 13:29:57 2007 -0600 Changed arrowsize typos in documentation. commit 02536038d7f6513ac143b7d5a78be273a22190e5 Author: John Bowman Date: Wed Jul 18 07:37:15 2007 -0600 Avoid conflict with definitions in types.h. commit 684c472b6dd0913327d0b3ca39841c83415d8d21 Author: John Bowman Date: Wed Jul 18 07:25:15 2007 -0600 Work around quad_t vs. long long conflict on 64 bit machines. commit 3221c225a505b699ec36c3c168007bb1b98d5150 Author: John Bowman Date: Wed Jul 18 06:50:47 2007 -0600 Use LONG_LONG_MAX instead of LLONG_MAX. Add instructions for working around problems with old broken compilers. commit c01737efeb4ef95ca23c2adf54f50198ecfc6350 Author: John Bowman Date: Wed Jul 18 06:21:48 2007 -0600 Further portability fixes. commit c9b909e1e3be56888d7dec5a89538c3f360b78fc Author: John Bowman Date: Wed Jul 18 06:14:24 2007 -0600 Portability fixes. commit b2ca155dcc5e6e279c666f47832e67db2c0b063b Author: John Bowman Date: Wed Jul 18 05:50:11 2007 -0600 Change integer type to Int, which is set default in common.h to long long (typically a 64 bit integer). Add support for reading and writing 64 bit integers in binary and XDR modes. commit fe42bb6368110b595cf3de0f3ff3dc8005d21061 Author: John Bowman Date: Wed Jul 18 05:09:44 2007 -0600 Don't call locateFile with an empty file name. commit cc9594c8d01aded6aed8bb2fa408ce51ed1d9595 Author: John Bowman Date: Wed Jul 18 04:47:45 2007 -0600 Fix code for Bezier example. commit 4ab42cfa3da32e91ea28c6565445eabc9528618c Author: Philippe Ivaldi Date: Tue Jul 17 15:18:50 2007 -0600 grid3.asy: bug fix with perspective projection. commit f52e82d497ee1fde912586a887d48f9a810e03b2 Author: Orest Shardt Date: Mon Jul 16 09:35:44 2007 -0600 Fixed itemEdit index computation commit cd9388368834c6fccb78fb518df21932b4385410 Author: John Bowman Date: Fri Jul 13 17:50:11 2007 -0600 Change search path order: directories specified by the dir configuration variable are now examined before the directory .asy in the user's home directory. Ignore user configuration files during installation. commit 9f5593d688f356e2d7b53b1b4558b340ef39ff3d Author: Philippe Ivaldi Date: Fri Jul 13 09:03:59 2007 -0600 Bug fix in lasy-tags routine. commit ab212166f4effcd1a052b9e3f1efd1742a229b40 Author: Philippe Ivaldi Date: Wed Jul 11 12:30:03 2007 -0600 Defer the copy of LaTeX-mode-map to lasy-mode-map after all personal configurations was loaded. commit d81fee990b21f1f1ebe96bfb532ea00f66afe67e Author: Orest Shardt Date: Wed Jul 11 12:07:48 2007 -0600 Fixed verification of asy pipe creationy commit 20fa659d51a9290e117c7887a0d7a99125f4a59f Author: Philippe Ivaldi Date: Wed Jul 11 08:25:31 2007 -0600 Provide real syntax highlighting support with two-mode-mode for lasy-mode commit e12aeddf054965eaa9e2756cdbcc5c1a773dd2d8 Author: Orest Shardt Date: Mon Jul 9 15:42:28 2007 -0600 Implemented pen parsing for label commands commit 315431b2180215d1910c6a88d53f1a62bcc2efcb Author: Orest Shardt Date: Mon Jul 9 11:55:18 2007 -0600 Implemented raising and lowering of items commit d119a013aeb71c19731a508c5e236d946023956e Author: Orest Shardt Date: Mon Jul 9 09:54:01 2007 -0600 Remove unneeded module commit a215f07bc66eb0456b7d25b9cb9297ea1cfacb61 Author: Orest Shardt Date: Mon Jul 9 09:31:46 2007 -0600 Fix interrupted system call error commit be592ced5c326c5c99f7189c7ffc0d53a23b5b3d Author: John Bowman Date: Mon Jul 9 01:29:17 2007 -0600 Fix texstream destructor so that texput files are removed. commit 49d64b85ad9aded9a7f28ca48a2c57759884ac8b Author: John Bowman Date: Mon Jul 9 00:51:17 2007 -0600 Fix memory allocation incompatibility in workaround for old, broken readline libraries. commit e58ad2c2fd23da91fac3b74f5164808a198e11ab Author: Orest Shardt Date: Sun Jul 8 16:31:16 2007 -0600 Fixed horizontal and vertical motion. commit 08b2d63738cafda319c8a84811c3adf28cba9e5c Author: John Bowman Date: Sun Jul 8 16:02:53 2007 -0600 Add rainbow example. commit b97aad94f3a1ed3e8999c1446d0d2b857eef6ae9 Author: John Bowman Date: Sun Jul 8 13:30:11 2007 -0600 Standardize argument names. commit 6388bfe15c7fe4f40a7a4db3c5aa3ab26a6bad0a Author: John Bowman Date: Sun Jul 8 13:28:58 2007 -0600 Make framepoint (and truepoint) work even when an exact picture size estimate is unavailable. Add boolean argument to deferred drawing routines to allow optimization in cases where an exact picture size estimate is available. commit 1b843fa5045e0b9f58587e4a909444d8635e8875 Author: John Bowman Date: Sun Jul 8 10:22:17 2007 -0600 Allow writing to file specified with -o /dir/file.eps again. commit 98718bd22185b3e9775d9ddca9e63e41dbc6039d Author: John Bowman Date: Sat Jul 7 11:09:58 2007 -0600 Don't reset options after reading configuration file. commit a363cb5945ab03c6ec1abbb5612adf3d32e84939 Author: Orest Shardt Date: Fri Jul 6 21:38:51 2007 -0600 Improved selection mechanism commit b22eabeb71ea04c83cf2fae16015fc1e64d4dbd8 Author: Orest Shardt Date: Fri Jul 6 20:40:09 2007 -0600 Shipouts inside a script no longer interfere with the rest of the document commit 24b4733a6668551fce6c5fc5ea1876bee99b4a2b Author: Orest Shardt Date: Fri Jul 6 18:23:04 2007 -0600 Rename menu entries. commit 2ba6de8350fe44a3440d743c7cf9d752701fd42a Author: Orest Shardt Date: Fri Jul 6 11:10:24 2007 -0600 All labels now deconstructed. Dialogs improved. Fixed duplicate image reception. commit 4e356218f9024fa295da285f3284cf6618f840c3 Author: Orest Shardt Date: Thu Jul 5 15:59:40 2007 -0600 Various improvements commit 4c16dfe7042d9213c66d5fd76bb5a39567c38b68 Author: Orest Shardt Date: Thu Jul 5 15:58:43 2007 -0600 Implemented validation for asy path commit d252319b12998c08f414dc87290ff7b86243db93 Author: Philippe Ivaldi Date: Thu Jul 5 08:36:39 2007 -0600 Minor edit. commit 31f2ac1f97ad807bb7b7bcdea8104bc51feaf757 Author: Philippe Ivaldi Date: Thu Jul 5 07:51:32 2007 -0600 asydef environment content routine uses region instead regexp matcher. Cleaning code. commit cc49a3d40add05bfeca684a75594218fb319f205 Author: John Bowman Date: Wed Jul 4 21:47:39 2007 -0600 Add configuration file loading diagostic. commit 4c9f54802278b6c6e346f69ad384973ed527c979 Author: Orest Shardt Date: Wed Jul 4 18:59:22 2007 -0600 Improved handling of default pen commit ddc78730447e8f34399fc33b0d69282656bd396f Author: Orest Shardt Date: Wed Jul 4 15:49:27 2007 -0600 Fixed docstring commit b8509259097fd3d187a74b0ad41afa5ccd291d1f Author: Orest Shardt Date: Wed Jul 4 15:48:42 2007 -0600 Implemented storage and retrieval of user preferences commit b625d6c5eb5553c9d422c0cc65a280e447249afd Author: Philippe Ivaldi Date: Wed Jul 4 15:36:24 2007 -0600 Write temporary file with region instead of regexp matcher to avoid Stack overflow when compiling a long file within lasy-mode. commit 88ee7632e70b6417a6da160f12266bc6344fa62b Author: John Bowman Date: Wed Jul 4 06:44:17 2007 -0600 Remove completed item. commit db4efd57c4a00f3d4a75cd34ccec83fe44e50115 Author: Orest Shardt Date: Tue Jul 3 16:02:32 2007 -0600 Selecting an item clears the highlight box commit b69d4d409b31f9a84f769c976799764d88bae816 Author: Orest Shardt Date: Tue Jul 3 16:00:01 2007 -0600 Improved handling of already-transformed shapes commit e0da8a2bfdbcaa619973c77df9e3cde2b40f592e Author: Orest Shardt Date: Tue Jul 3 15:25:22 2007 -0600 Fixed incorrect entry in xasyColorPicker commit 30e27ea65ca173679f1e05684bde707134e53f2a Author: Orest Shardt Date: Tue Jul 3 15:21:36 2007 -0600 Improved bezier editing and integration with xasyMainWin commit da060b79e4da279c7daa9d9e8847c344677ccc4e Author: Orest Shardt Date: Tue Jul 3 14:39:42 2007 -0600 Added ability to graphically edit the nodes and control points of a bezier curve commit d6b2e473af81f366e95aa6009f782468c61e18be Author: Orest Shardt Date: Tue Jul 3 14:38:15 2007 -0600 Faster computation of an upper bound for the bezier width commit 2cc213ba2b5e92343acf2a221c029ecae8c53032 Author: John Bowman Date: Tue Jul 3 10:25:49 2007 -0600 Fix --enable-gc-full-debug. commit 795688843fc5d97c3437703614729730823b072f Author: John Bowman Date: Tue Jul 3 10:13:53 2007 -0600 Update to gc-7.0. commit 4efb99a8788ce81891fbba42c073fd4a4099ab82 Author: John Bowman Date: Tue Jul 3 10:06:04 2007 -0600 Add reference to Java-style array iteration. commit d47bfa5fa7c4d1fa08fc196c2be964a5598c6359 Author: John Bowman Date: Tue Jul 3 09:56:07 2007 -0600 Minor edits. commit 85ba69f4073c0cefdee314140060c00737c2c1e2 Author: John Bowman Date: Tue Jul 3 02:24:02 2007 -0600 Minor simplification. commit 65efdbd70eea2c161314e1aa02c3defd83b52b44 Author: Andy Hammerlindl Date: Mon Jul 2 18:32:57 2007 -0600 Added brief comment on extended for loops. commit b0c6f948c5fd6e86731ff30ed93d44bbc1544964 Author: John Bowman Date: Mon Jul 2 17:27:53 2007 -0600 Minor solve optimizations. commit 969a375d079222a94c255fb671d06b73da5cd4f7 Author: John Bowman Date: Mon Jul 2 12:14:51 2007 -0600 Fix memory leak in matrix multiply. commit b985420945a305dd23b762001212a2d8b6510dec Author: Andy Hammerlindl Date: Mon Jul 2 07:11:48 2007 -0600 Simplify extended for loop syntax. commit 47b56663f6d6c385be48df9315af508ba2ef7061 Author: John Bowman Date: Sun Jul 1 23:57:51 2007 -0600 Update to gv-3.6.3. commit 74c83940069561695b0d37f57e963fc689af5297 Author: John Bowman Date: Sat Jun 30 01:11:04 2007 -0600 More garbage collection improvements. commit 77c7be3d5cf9946f4980895261264a8581c55201 Author: Orest Shardt Date: Fri Jun 29 15:37:09 2007 -0600 Fixed syntax commit 32447a8674d2ee71f2bbb8425abbf71f2a31a59a Author: Orest Shardt Date: Fri Jun 29 15:30:29 2007 -0600 Checkin the code for the new GUI that is under development. commit 949ac77506fd75762ff8140f13a84be0e4cbec2c Author: Orest Shardt Date: Fri Jun 29 15:29:21 2007 -0600 Improved the xformStack implementation commit 5a0555f8b830f8cb1ca6286f00e333fc958beccb Author: John Bowman Date: Fri Jun 29 12:45:00 2007 -0600 Fix segmentation fault in complement. commit 6e680f0fbdb18f0982f69a37d8bd8c4329268801 Author: John Bowman Date: Fri Jun 29 02:00:20 2007 -0600 Increment version to 1.33svn. commit a6c037374d3727f1edc772235c47edafe892d3ac Author: John Bowman Date: Fri Jun 29 00:42:03 2007 -0600 More garbage collection tweaks. commit 637178c4f88c3bb2c7768043978af52bb5e5bad3 Author: John Bowman Date: Fri Jun 29 00:23:03 2007 -0600 Fix dependency. commit 6e795c1214befc7d2dfe4135ad9455a81e77c392 Author: John Bowman Date: Fri Jun 29 00:04:58 2007 -0600 Fix make install-all. commit df0fbfe97c5f78c301958e0c1bf6baf3731bafc5 Author: John Bowman Date: Thu Jun 28 23:15:34 2007 -0600 Declare drawverbatim to be atomic. commit 793d631c85af140f16fe907ae87c141d8cf0e351 Author: John Bowman Date: Thu Jun 28 17:20:22 2007 -0600 Fix bug in subpath. commit 0a3a730ae4c6bc87066fa453442c4a1c22eec1e0 Author: John Bowman Date: Thu Jun 28 12:13:02 2007 -0600 Allow cd() and cd("") even if globalwrite is false. Don't write cd path twice in interactive mode. Update diagnostics and documentation. commit 7184ae69bfa3e5848ef1c038105647ce538445cc Author: John Bowman Date: Wed Jun 27 12:09:17 2007 -0600 Fix GC debugging. commit 2c73d879f45bab5cdb1b9fdea0a86b04c5820461 Author: John Bowman Date: Wed Jun 27 11:22:17 2007 -0600 More garbage collection tweaks/leak fixes. commit c5ef7778a8995e21ea5465b4c21bae3d9fffd44e Author: John Bowman Date: Wed Jun 27 02:19:14 2007 -0600 Increment version to 1.32svn. commit 45724947378bcc555730acd7feea73739ef10174 Author: John Bowman Date: Wed Jun 27 00:47:19 2007 -0600 Fix segmentation fault in options processing. commit 5ab07e3d6e08376814a8d8379bca4f4629185c47 Author: John Bowman Date: Wed Jun 27 00:31:52 2007 -0600 Reinstate gc check. commit a9e498e514d7e5e215066a46856e27e8ea7340fd Author: John Bowman Date: Wed Jun 27 00:28:06 2007 -0600 Avoid makefile loops. commit 919890ae6a354669dcb69cc10d38db4965af6ec3 Author: John Bowman Date: Tue Jun 26 23:57:15 2007 -0600 Fix g++ warning. commit efd1d7983cfe16c00edac28321c2187406382f21 Author: John Bowman Date: Tue Jun 26 15:35:03 2007 -0600 Fix cxx warnings. commit 7f2ba53927bfce875c1ed0978eb53ef11de3037f Author: John Bowman Date: Tue Jun 26 15:20:11 2007 -0600 Fix nullpath3 min/max bugs. commit f4bac25045a05b4e8550aa65c8e772128fc1ddfa Author: John Bowman Date: Tue Jun 26 15:17:14 2007 -0600 Fix nullpath max/min bugs. commit b65d874d3d71b488af98e919cd5e5b5e3e79b6c7 Author: John Bowman Date: Tue Jun 26 14:49:05 2007 -0600 Minor path optimizations. commit 9c7a14e42f9187cdd8dc6a221503bf4fdf8e0002 Author: John Bowman Date: Tue Jun 26 14:18:05 2007 -0600 Further garbage collection improvements: move pointers out of pen class. Add bool ==(path,path) operator. Move defaultpen into global; changes to defaultpen in config.asy will no longer be remembered (use the autoimport mechanism instead). Make the identity transform a constant. commit 587d7b6d67c5df5f9a5e2571d36fd55e97bde981 Author: John Bowman Date: Mon Jun 25 17:20:00 2007 -0600 Avoid using a pointer in path class so that it can be allocated atomically by the garbage collector; this dramatically reduces memory usage. commit 70618a0a6877c1408315d47e22d0ee78295c047a Author: John Bowman Date: Mon Jun 25 16:57:22 2007 -0600 Fixed typo. commit 604854663ab4e8277281b836a8935712d7edc95d Author: John Bowman Date: Mon Jun 25 16:41:37 2007 -0600 Fix runaway asy process that occurs when tex pipe cannnot start tex engine. commit 42aeb1f1f09ed1caf2e10e581c84e7bd3d399c94 Author: John Bowman Date: Mon Jun 25 13:41:06 2007 -0600 Fix time without HAVE_STRFTIME. commit f802e0ec54590b9857d87a4d50fb9b34cfe1c446 Author: John Bowman Date: Mon Jun 25 13:39:30 2007 -0600 Fix default time and opacity arguments. commit b10fad39a2e46ff83dc8a3373d71dd907f208a9a Author: John Bowman Date: Mon Jun 25 11:21:36 2007 -0600 Fix minor typos. commit f9330564f1f442e87fe94ee4910847a4a40aceab Author: Andy Hammerlindl Date: Mon Jun 25 09:49:15 2007 -0600 Added Java-style abbreviation for iterating over arrays. Arrays of functions still not fully supported. commit 6f0502df0e18f330fb9945ba3df1aa0261b4b2e3 Author: John Bowman Date: Mon Jun 25 01:46:20 2007 -0600 Further garbage collection tweaks. commit 6fa70cec93fbbf3a86cef64120cbad8646e8f491 Author: John Bowman Date: Mon Jun 25 01:37:20 2007 -0600 Remove virtual destructor introduced in 1.31-44 due to performance penalty. commit 141515a3a661b9abc373344dc90e6f49745440a5 Author: John Bowman Date: Mon Jun 25 01:28:48 2007 -0600 Simplify arrayDeleteHelper, removing unused variable. commit a4a8a7d09534ce8a1cf0fc829047efb74dd5776c Author: John Bowman Date: Mon Jun 25 01:16:49 2007 -0600 Fix --disable-gc. commit 0794504fcf6bfbf5fe96465b9f199b1ad3c82960 Author: John Bowman Date: Mon Jun 25 01:05:39 2007 -0600 Fix warning messages. commit 9ccfc2613c2a1ede2102c83456d13a0214c3e2fe Author: John Bowman Date: Mon Jun 25 00:18:53 2007 -0600 Add header for isatty. commit 7d1c381346c387f9bf9adffecb2411cf9746a653 Author: John Bowman Date: Sun Jun 24 22:19:44 2007 -0600 Revert last commit. commit 22cee29708a566d13fb2baac91f3e3926aa14483 Author: John Bowman Date: Sun Jun 24 22:16:40 2007 -0600 Improve tex diagnostics. commit 816b1fbfe98cbd4210802f063209681a462e10b8 Author: John Bowman Date: Sun Jun 24 21:24:46 2007 -0600 Leave deletion of string last to the garbage collector. Omit spurious call to background(); commit 4f56d5aa58c769e422f48bdcdb651d5a36c99281 Author: John Bowman Date: Sun Jun 24 13:43:20 2007 -0600 Avoid warning messages with -d. commit fcf281b7e249166b8401d8a90ab87be4eea5826a Author: John Bowman Date: Sun Jun 24 13:36:33 2007 -0600 Fix GC preprocessor directives. commit 843c7bba85a7c2a6ad77607547a7e49a3295faaf Author: John Bowman Date: Sun Jun 24 01:55:10 2007 -0600 Further garbage collection tweaks; reinstate no_GCwarn. commit e4de07e434fd3b02c37b464e9851d00bdeda5098 Author: John Bowman Date: Sun Jun 24 01:03:20 2007 -0600 Fix dependencies. commit 29cddf4623d842eb65639d81b06d778cf78444c4 Author: John Bowman Date: Sun Jun 24 00:43:45 2007 -0600 Don't link with libgccpp.a to increase speed, now that garbage collection has been carefully addressed. commit d207452495d83bd9bb36df2c43d28a2b745b6c51 Author: John Bowman Date: Sun Jun 24 00:26:18 2007 -0600 Support ./configure --disable-gc again. commit 24332ff82a2e628a3bfee9d440e5ec3b926393da Author: John Bowman Date: Sun Jun 24 00:08:47 2007 -0600 Re-enable GC_gcollect under MacOS. Update to gc-7.0alpha9 since this yields faster execution times. Change configure --enable-gc=VERSION so that VERSION now must include the "gc" prefix. Remove genv from gc. commit 185554bd03f47f93586410d0a7904f9b12a6358e Author: John Bowman Date: Sat Jun 23 23:03:28 2007 -0600 Move ShipoutNumber into globalData. commit 473ba88ae7fea8b0736e29b506db442937a0cc5e Author: John Bowman Date: Sat Jun 23 16:45:58 2007 -0600 Use separate global variables for each process. commit 513822dceef7052ca9efe81e587821896925914e Author: John Bowman Date: Sat Jun 23 12:42:05 2007 -0600 Deconstruct files on termination. Improve support for garbage collection debugging. commit d8b0ff7f98543fbb573a44a1442931e2964fe782 Author: John Bowman Date: Sat Jun 23 00:58:28 2007 -0600 Close any open files automatically at the end of each asy process (without relying on a finalizer). commit e0c2e7f923b320a04a036527ce675bd885aceb78 Author: John Bowman Date: Fri Jun 22 16:58:19 2007 -0600 Fix segmentation fault introduced in 1.31-23. commit e28133f38f295fc0fde922bb331b2392b7731e83 Author: John Bowman Date: Fri Jun 22 01:23:46 2007 -0600 Improve garbage collection by using GC_DECLARE_PTRFREE statements; use vectors instead of deques everywhere. Change nullPos() to nullPos. commit 9dd6708f1844ca303278016ff1936a1875ac97e7 Author: John Bowman Date: Thu Jun 21 23:41:19 2007 -0600 Document how arbitrary files can be imported in the configuration file. commit 52b24d47a94c2a1e7ad751ae95d7961c9a891fc7 Author: John Bowman Date: Thu Jun 21 23:08:18 2007 -0600 Improve LaTeX diagnostics. commit dcbed2c557ecc629d6e9f84a61358f4c36ee0f35 Author: John Bowman Date: Wed Jun 20 23:14:46 2007 -0600 Remove unused variable. commit 0e26979cc46959684fe2f39527a5ef9883a217a0 Author: John Bowman Date: Wed Jun 20 17:52:58 2007 -0600 Use GC_malloc_ignore_off_page to fix major memory leak in garbage collection of STL containers. Fix minor memory leaks. Make em an errorstream rather than a pointer to one. commit 417f2582667c1d8851e8bcb86aa19ea6b51c62c7 Author: Orest Shardt Date: Wed Jun 20 17:25:31 2007 -0600 Added a new option to enable interactive mode on non-tty input streams. Made the signal option only affect the sending of signals without the side-effect of controlling interactive mode. commit 18b1cd9a00b7080ecea53589b3336ae9d4201b8a Author: Orest Shardt Date: Tue Jun 19 09:55:10 2007 -0600 Modified signal mechanism to send signals for each shipout and at end of each operation. Modified handling of items deleted by GUI: bbox scaled by 0, file deleted, and signal sent. commit c7163f9d5ed3bcf1eeb017f7e5112c38450bcb78 Author: John Bowman Date: Tue Jun 19 09:43:25 2007 -0600 Resolve purge ambiguity. commit dc2b4a56ad79e263e097e5cdeed3e7e07f53b490 Author: Philippe Ivaldi Date: Tue Jun 19 03:44:43 2007 -0600 Fix the filling path according to the margin in the routine markangle. commit a0408c585ec05a353ca2e15066781663033d7ec5 Author: John Bowman Date: Mon Jun 18 22:27:00 2007 -0600 Make the delete virtual member of arrays with no arguments delete all elements of the array (not called clear to avoid the need for adding yet another type-dependent virtual function). commit 4f0e48f95d301a5630af28c16ec925e0c3cc1c06 Author: Philippe Ivaldi Date: Mon Jun 18 16:44:27 2007 -0600 fix typo. commit 5cb4b64e129d881818262c767afff7d45e01947d Author: Philippe Ivaldi Date: Mon Jun 18 16:41:03 2007 -0600 Add option filltype to markangle. commit 89f331e05e66b120fd670442900884efd354073f Author: John Bowman Date: Mon Jun 18 16:01:22 2007 -0600 Handle exceptions in doUnrestirctedList. commit 7f37372c405f4fd80361bad001ef02f37e3b842c Author: John Bowman Date: Mon Jun 18 15:45:57 2007 -0600 Declare shipout before importing plain_xasy. commit 5690b60c62de62d98f6e3c1e0482334e1d12bcfd Author: John Bowman Date: Mon Jun 18 12:18:22 2007 -0600 Change the return type of the array virtual member delete to void. Allow A.delete(0,A.length-1) on empty arrays. commit 65c979a50262609e5fca031dc4cdd6c14b3cf285 Author: John Bowman Date: Mon Jun 18 11:59:33 2007 -0600 Make A.initialized(int n) return false when n is out of bounds, without any warning message. Use A.delete(0,A.length-1) to clear arrays in base files, to help the garbage collector. Add options -compact and -divisor to give the user more control over garbage collection. Implement a purge() function that forces a garbage collection. commit 25c637e4cb5d99d7dcbd8ab3288a51ad98c9aaf4 Author: Orest Shardt Date: Mon Jun 18 11:10:53 2007 -0600 Updated to use Python's subprocess module. commit 146fc1cd81244154daecda352cc895a2011ae3ac Author: John Bowman Date: Sun Jun 17 22:37:33 2007 -0600 Implement better workaround for uninitialized 'this.130' gcc-4.1.2 warning message (cf. 1.22-56). commit 79b2f5a07fd457182ad22f21b40e25e2224f8aa8 Author: John Bowman Date: Thu Jun 14 17:47:22 2007 -0600 Fix typo. commit 3512f0d737398b3ce742ec72d71208f986a54448 Author: John Bowman Date: Thu Jun 14 17:39:46 2007 -0600 Add pen[][] interpolate(real[][] f, pen[] palette) routine for use with latticeshade. Rename palette argument range to bounds to avoid confusion. Use an implicit bounds constructor. commit 2f7b23fa999ea2fb39cc1ca60f0aca67fdc77a7d Author: Orest Shardt Date: Thu Jun 14 15:05:19 2007 -0600 Changed transform push(transform); to void push(transform); to remove output when called in interactive mode. commit 8dcaa58177fff6dd258a74c25408e739388f7aa0 Author: John Bowman Date: Thu Jun 14 14:19:13 2007 -0600 Resolve ambiguity. commit ef75012b02a751b346e56d8a28e46a6160e77b2e Author: John Bowman Date: Thu Jun 14 13:16:25 2007 -0600 Don't call GC_collect under MacOS X, as this can cause bus errors and it doesn't seem to be necessary anyway on this platform. commit 27f248929ad55ecb5d2889d2ab67164605c1bd0b Author: John Bowman Date: Thu Jun 14 11:32:20 2007 -0600 Remove unused line. Add reference. commit c9fca9768ad6b8e2b59870cb0a58e3c49c9af15c Author: Andy Hammerlindl Date: Wed Jun 13 19:47:16 2007 -0600 Minor changes to comments. commit 4e70e1300642aa779d3fe45da0d55e14f13231aa Author: Andy Hammerlindl Date: Wed Jun 13 15:57:37 2007 -0600 Fixed addOps to add fields when possible. commit f54e2aebafa9d46e05e02051c1a3e1885caf7b10 Author: Philippe Ivaldi Date: Wed Jun 13 03:10:21 2007 -0600 Suppress useless code. commit 66c61efa8f470b0663ccba532266ecddaf5c7d84 Author: John Bowman Date: Wed Jun 13 01:42:21 2007 -0600 Increment version to 1.31svn. commit afa57fd86437f39163b3f6e4013ee1e342faafaf Author: John Bowman Date: Tue Jun 12 23:30:11 2007 -0600 Add copy argument to allow one to disable data buffering. commit 6857471c33699c8bac355f7dac013adbdb161692 Author: John Bowman Date: Tue Jun 12 22:42:44 2007 -0600 Add segment routine. Optimize conditional graphs. Add modified sphere animation, courtesy of Olivier Guibe and Philippe Ivaldi. commit bef55d64cd1ac2cd8e853db70915438d6ce7ad93 Author: John Bowman Date: Tue Jun 12 16:56:48 2007 -0600 Remove unused filename. commit 6f932d116ca4c4b8d03866e24e5accf6bfeda7e3 Author: John Bowman Date: Tue Jun 12 16:50:45 2007 -0600 Fix dependency. commit 69b77ebd49abaef1873eee4a7e37db180e0fdb07 Author: John Bowman Date: Tue Jun 12 16:25:57 2007 -0600 Make the implicit initializer for file variables null. commit 9d0fc6bf18efe32d2c6831b964e8af52e61a6127 Author: John Bowman Date: Tue Jun 12 15:57:18 2007 -0600 Use a single box file. commit a946e3cc8a9aa8158670bdb83e2b340e7a130e62 Author: John Bowman Date: Tue Jun 12 15:51:18 2007 -0600 Remove unused box file entry. commit 335e4ee9be80d0a97939d486341131931184f9de Author: John Bowman Date: Tue Jun 12 15:07:24 2007 -0600 Communicate to xasy via a single signal (SIGINT) and status file. commit f7c65d49a1f59f752311ac0e3b3640e19837886d Author: Andy Hammerlindl Date: Tue Jun 12 13:52:42 2007 -0600 Fixed bug introduced by previous bug fix. commit 32c2800ea35bfe896c7f48a7718e59792ca78e2a Author: Philippe Ivaldi Date: Tue Jun 12 13:42:19 2007 -0600 Update documentation. commit e241156d089b9d735b13f9bf6cb3bb6c279d9379 Author: John Bowman Date: Tue Jun 12 11:14:03 2007 -0600 Move definition of interpolate to graph_settings. commit 1bdbf421d7c6bfe13099526295781e6341280878 Author: John Bowman Date: Tue Jun 12 02:23:08 2007 -0600 Add cast of triple[] to guide3[]. commit 33a23676f0ca1d1afba511962752dcf08b9235de Author: John Bowman Date: Tue Jun 12 01:42:32 2007 -0600 Fix shipout format. Remove old PDFanim_temp_Guide references. Fix cxx errors. Document reverse(guide). commit 79c54067909f345fe01096e620384023c518c1cd Author: John Bowman Date: Tue Jun 12 00:08:25 2007 -0600 Simplify shipout signature (to support xasy development). Support internal cycles in guide examination routines. Add reverse(guide). Fix guide tests. commit 6b1c2ed1c24d9cb03a27b0ceba6b40b3e658f1ef Author: John Bowman Date: Mon Jun 11 23:49:48 2007 -0600 Fix typos. commit fd356f45ac4615c71510ec6a150943339de3a435 Author: John Bowman Date: Mon Jun 11 13:18:47 2007 -0600 Exit interactive mode on eof when stdin is not a tty. If -signal is not set and stdin is not a tty, don't use interactive mode. commit 1458d017b58902acfd78b701295ad859b19da36a Author: Philippe Ivaldi Date: Mon Jun 11 08:01:51 2007 -0600 Expand lasy-mode errors management (with Emacs 22 only). Defer all shell redirection to Emacs for supporting most shell. Compatibility running Windows. commit 7aa37aa0845c03e4b37e7a6c811c159491a352d5 Author: John Bowman Date: Sun Jun 10 18:09:37 2007 -0600 Update triangle example to use new simplified constructors. commit f5cbf4d90e602cfb7d3f1cfd9313a5b6e14316e8 Author: John Bowman Date: Sun Jun 10 17:26:31 2007 -0600 Minor edits. commit 89bfca7eabfea4f560ff28a7d7888ed81ff24cab Author: Andy Hammerlindl Date: Sun Jun 10 12:56:11 2007 -0600 Added implicit constructors. Fixed bug with permissions in static methods. commit 0df0e0bf25d565bf41c5a1199a9520c6808b5c3f Author: John Bowman Date: Sun Jun 10 08:01:22 2007 -0600 Add test for newton root solver; fix diagnostics. commit 5a36b41ea5052e2bbc342672ab80206e5e810864 Author: John Bowman Date: Sun Jun 10 07:20:12 2007 -0600 Optimize join. commit 256c7154f067526bf3f934bf44adbbe35b073902 Author: John Bowman Date: Sun Jun 10 00:12:13 2007 -0600 Give preference to GPL over AFPL Ghostscript. commit 99e825675e3b909070d74569af6cafbfce511eff Author: John Bowman Date: Sat Jun 9 23:25:19 2007 -0600 Add Philippe's lasy-mode fixes, including support for tcsh. commit 5b36cb1f2db85f87a749ee601cd9e1edc3c00202 Author: John Bowman Date: Sat Jun 9 12:29:29 2007 -0600 Add bool copy=true argument to picture routines that buffer data. commit 5b2b0bc4b7dfad18d539d1f3a193c23d507e23c7 Author: John Bowman Date: Sat Jun 9 04:10:23 2007 -0600 Improve garbage handling of multiple-file runs. commit 05baac943e890facf204004e80431ef0654bc30b Author: John Bowman Date: Sat Jun 9 02:57:12 2007 -0600 Remove default initializer for files. commit 0c996d014c98728580e98f7725067e55fca3d070 Author: Orest Shardt Date: Fri Jun 8 15:05:15 2007 -0600 switched xformStack from LIFO to FIFO commit e114be63575847d34e2a7d3faf8b4bc4b5389fb4 Author: John Bowman Date: Wed Jun 6 13:09:28 2007 -0600 Revert spurious asy-mode.el commit. commit 37f51484712b4abb246e557115525f4b7137295f Author: John Bowman Date: Wed Jun 6 13:01:46 2007 -0600 Split readline functionality into readline and saveline. commit 881ffa21f9b210d495d78b8d4038d4f4507243ba Author: John Bowman Date: Wed Jun 6 00:38:24 2007 -0600 Allow xformat to be any format supported by convert. commit d2efef6547f3ef83b632940a3c8b076b786ff26e Author: John Bowman Date: Mon Jun 4 22:42:05 2007 -0600 Fix parallel bison and lex processing. commit 763168a3f63580424432841fe379fba929d8b1f8 Author: John Bowman Date: Mon Jun 4 14:53:35 2007 -0600 Rename xasy.asy to plain_xasy.asy and revert other 1.30-48 changes. commit aa19a01eb70f11a9722e43238df6c9372909c61b Author: John Bowman Date: Sun Jun 3 22:15:09 2007 -0600 Improve documentation. commit ba6b456058e0c054b2cf7684b794dc196b1232a8 Author: John Bowman Date: Sun Jun 3 22:10:34 2007 -0600 Add Newton-Raphson iteration and Newton-Raphosn bisection routines. commit d7eec6237db5226eb68b4aae1d81dab759ac98cf Author: John Bowman Date: Sun Jun 3 17:07:52 2007 -0600 Add support for new GUI xformStack (under development). commit bbc47a2c3b1046f405984710b5cc53a837080eaa Author: John Bowman Date: Sun Jun 3 10:33:17 2007 -0600 Require version 2007/05/24 or later of animate.sty package; remove file name padding workaround. commit 3a780fa6f67832a65a0f082a345c2f585fd65217 Author: John Bowman Date: Sat Jun 2 23:20:55 2007 -0600 Generalize history to return an array of the n most recent history values. commit a7bee1f37cbd70a0c8b0c950681ed04d45187fc9 Author: John Bowman Date: Sat Jun 2 22:39:49 2007 -0600 Add gsOptions configuration variable. Force embedding of all fonts in eps files. commit 0c9baa4c098bea8f3d6ad8fddaa7fe972ef2d1db Author: John Bowman Date: Sat Jun 2 17:11:22 2007 -0600 Force all fonts to be embedded in pdf files. commit e91898e61889ad55a7798653056983cefe186d7e Author: John Bowman Date: Sat Jun 2 12:00:40 2007 -0600 Force fixed format for compatibility with pdflatex. commit a183626cf3e2f804378ee2990e4d891c871e037a Author: John Bowman Date: Sat Jun 2 01:30:15 2007 -0600 Fix indentation when byte-compiled cc-mode.elc is used. commit 2baf201ecce79107e5f587f47f3b100b75d4c364 Author: John Bowman Date: Fri Jun 1 18:08:13 2007 -0600 Allow array insert to insert an array of the same type at a given index; insert now returns void. Allow delete to accept an index range and return the last item deleted. Add initialized(int n) array virtual member to detect whether element n is initialized. commit dd65fda0826f2f552d15e8e4ee907090844f046a Author: John Bowman Date: Fri Jun 1 11:04:43 2007 -0600 Split readline functionality into two routines: readline (with argument order now consistent with getstring) and history(string). commit ab4774286f87ec5ca78a2f056566b772afd40e64 Author: Orest Shardt Date: Fri Jun 1 11:01:58 2007 -0600 Fixed typo commit 8096bb5fdf640778ed9715a64a16d89f40788ba5 Author: John Bowman Date: Fri Jun 1 10:01:28 2007 -0600 Implement NoZero and NoZeroFormat with more general OmitTick and OmitFormat routines. commit bf65e98df0c439c14d92cd68260981d935bd0380 Author: John Bowman Date: Thu May 31 14:17:57 2007 -0600 Avoid need to defer linewidth by moving setpen to the proper place. commit 3eaa60ba9b30082526d2d54d755ecf023e599c35 Author: John Bowman Date: Thu May 31 13:53:57 2007 -0600 Omit identity concat commands. Put dynamic linewidth code in /Setlinewidth. commit 7fe4be91e8b7cb1de9424dea14ef4221421aa903 Author: John Bowman Date: Thu May 31 02:21:50 2007 -0600 Fix linewidth. Fix division by zero. commit 74a45e155bfd00a4515f527c27856f9c0b14e527 Author: John Bowman Date: Thu May 31 01:51:14 2007 -0600 Simplify linewidth deferral. commit 193bf8325dbcad9b36fb4cee380d51f66f0aa556 Author: John Bowman Date: Wed May 30 23:25:59 2007 -0600 Defer dynamic linewidth until stroke time in case currentmatrix changes. Improve accuracy of dynamic linewidth calculation. commit f66e8527ba4dc2fcab6b99e2f9bc6f22eb69bc62 Author: John Bowman Date: Wed May 30 23:18:10 2007 -0600 Rename zerotick to zerotickfuzz for clarity. commit a6791aefc4759ebadf7f17503dda4d5138692586 Author: John Bowman Date: Wed May 30 17:53:52 2007 -0600 Make zero detection robust. commit c28626c2078f8c17fed4c5053b0c03fc5caf95e4 Author: Philippe Ivaldi Date: Wed May 30 13:48:10 2007 -0600 Fix numerical precision in the routine NoZero commit e00a7b8073d6dc8bcd86eb764ebee05218bd5a26 Author: John Bowman Date: Wed May 30 13:04:08 2007 -0600 Fix orientation code. commit 88e1d52a06ad38bbf37511a14f2e48a63957b60c Author: John Bowman Date: Wed May 30 12:37:44 2007 -0600 Simplify and optimize normal calculation. commit 9f8598a130268cf74d7ce1ce2ad25be62a0104aa Author: Radoslav Marinov Date: Wed May 30 11:37:58 2007 -0600 Changed the shading approach in base/contour3.asy . commit fe95f910e8de681b23e83f95165302efb4751e72 Author: John Bowman Date: Wed May 30 01:32:47 2007 -0600 Implement simplified (and slightly more efficient) gouraudshade interface. Reduce memory and CPU usage by avoiding duplicate buffering of picture data. commit f76232575f29b9a8d2ca0f010868581751a6d7b8 Author: John Bowman Date: Tue May 29 22:04:36 2007 -0600 Add tickmodifier NoZero and ticklabel format NoZeroFormat. commit 46f6ea1bc3b46c75b82edf3d32a3765ce8e86e40 Author: John Bowman Date: Tue May 29 16:27:53 2007 -0600 New test routines. commit 77d1dd8f3ee01f0e22a61ae5089b7cd4a3edee4c Author: John Bowman Date: Tue May 29 16:08:06 2007 -0600 Move real[][] identity(int n) from math.asy to C++ code; add documentation. Avoid use of loops with join operator. commit b592bc60b2bcbc3c402d58a20090888786ffe65f Author: John Bowman Date: Tue May 29 16:04:44 2007 -0600 Minor optimization. commit 1adc55ad64b08356aa4b98895649d95d7e6c8e90 Author: John Bowman Date: Tue May 29 15:54:23 2007 -0600 Cleaner optimization. commit befaf187a250eaf67d6b435244bd0a7462e265bb Author: John Bowman Date: Mon May 28 18:14:29 2007 -0600 Remove extra loop variable. commit 63980fd23d2cba1835e8bdd76b3f41331ae30bcd Author: John Bowman Date: Mon May 28 18:11:05 2007 -0600 Further optimizations. commit 2e40007fb1e89ac0c5ba843043ae9d54dc810556 Author: John Bowman Date: Mon May 28 16:44:44 2007 -0600 Optimize number of calls to project; change return type of contour. commit 485f5ec8238cb2ad76ff5dc709e5a60f6aebe4fa Author: John Bowman Date: Mon May 28 14:41:27 2007 -0600 Catch unhandled quit exception. Reset scroll lines to zero. Don't exit on interrupt during module load in interactive mode. commit 81dc9114a4f185d3188069048426c11f1d186df5 Author: John Bowman Date: Mon May 28 14:14:22 2007 -0600 Renamed particle to object. Minor optimization. commit 3c46482e8cdd28a52d9c27d620b8c1f605b40b93 Author: John Bowman Date: Mon May 28 11:14:18 2007 -0600 Implement optimized real multdiagonal(real[][] a, real[]b). Speed up project slightly by changing aspect from real[][] to real[]. Make cputime().change return parent+child times. Add write(cputime). commit bfaf0370fc33d5dc9c23305a4fdfa26652aafb9c Author: John Bowman Date: Sun May 27 22:29:01 2007 -0600 Added change.user and change.system fields to cputime(). commit 948490a418a6dfda24c8ffb1e5ca7147e644bdfe Author: John Bowman Date: Sun May 27 22:25:31 2007 -0600 Optimize real[][] * real[]. commit d4803b09765b84dbc7e5cb75d6eb5bd0e30005b5 Author: John Bowman Date: Sun May 27 09:53:28 2007 -0600 Speed up 3D projection by moving matrix-matrix multipy to C++ code. commit cffe5e23420dbd5c84666fbe9f476c814c5f090a Author: John Bowman Date: Sun May 27 01:08:58 2007 -0600 Minor clarification. commit 26d3b69c93b217e6a6381bfef4b9e7a61c01e117 Author: John Bowman Date: Sun May 27 01:03:03 2007 -0600 Simplify, document, and port guide examination routines to three.asy. commit ab9070048364e614a86625a51838ee0d5a44a306 Author: John Bowman Date: Sat May 26 10:13:48 2007 -0600 Fix potential uninitialized variable. commit 270b67554e47b3894a8ae94f4c16e3825dc40a30 Author: John Bowman Date: Thu May 24 02:07:53 2007 -0600 Add bool cyclic(guide) routine. commit a1fd6cd823ff17ed834191d21d98c27bdeddbe2a Author: John Bowman Date: Thu May 24 01:53:03 2007 -0600 Add routines to allow access to guide components. Add upcase and downcase routines. commit 01e48f273dbbd9058a803a8ac6267eb0e4477291 Author: John Bowman Date: Wed May 23 22:48:23 2007 -0600 Document bibtex usage. commit e6a7d6a3938e63411e98be86dec5d048e11ddb49 Author: John Bowman Date: Wed May 23 22:47:47 2007 -0600 Install intro.asy. commit ab8b21e65692d7a75ee9cc8919edd84525ee44e7 Author: John Bowman Date: Wed May 23 22:47:32 2007 -0600 Remove pdf() restriction. commit 10a79c6c34636a7be292c25359cba859e274041d Author: Orest Shardt Date: Wed May 23 15:43:59 2007 -0600 Fixed docs about base64 commit 0958687accac67e691a83e0954d482cf7e8d04d1 Author: John Bowman Date: Mon May 21 21:16:42 2007 -0600 Use projection P; reduce number of calls to project. commit e9c0b6c842d44ada09d14f4307264a3148c60d03 Author: John Bowman Date: Sat May 19 14:16:43 2007 -0600 Reduce resolution. commit 8b490c2e53c7ac1a6e7526c41567151857b4a0f5 Author: John Bowman Date: Sat May 19 14:05:36 2007 -0600 Increment version to 1.30svn. commit ceea165b52e0a38618fbbf9041e04dc1b2f1af69 Author: John Bowman Date: Sat May 19 11:25:04 2007 -0600 Update LocalWords. commit 9b797abba10a36e61a019b6ace4525dbdf4d88cb Author: John Bowman Date: Sat May 19 11:16:54 2007 -0600 Improve description of contour3. commit 9651f6c97ac631429cee38fd736756c73ff25b00 Author: John Bowman Date: Sat May 19 11:08:13 2007 -0600 Speed up tick handler. commit 4f3842489f2a4f21c08385b3e708374633c63752 Author: John Bowman Date: Sat May 19 10:44:24 2007 -0600 Reinstate abbreviation q for quit, unless there exists a top-level variable of this name. commit 8fc806cbe73f7c4b609085e010916b93bc4d0e98 Author: John Bowman Date: Sat May 19 02:02:28 2007 -0600 Use easier-to-use animate.sty package instead of interim pdfanim_temp.sty package for generating pdf animations. commit 2aab5e1bf0488aeefa98a35dbb041dbb7c343665 Author: John Bowman Date: Sat May 19 00:48:09 2007 -0600 Add support for drawing zero-level sets of functions from R^3 to R. commit cb1882390a636614705b1e2d36f6da944d3b429f Author: John Bowman Date: Sat May 19 00:37:10 2007 -0600 Fill in potential gaps between histogram bars when bars=false. commit 99e519ccc5459da7fecff7de3acb1b131d951e78 Author: John Bowman Date: Sat May 19 00:11:06 2007 -0600 Simplify histogram interface. commit 5954c902a8b87765ae93d615bf79bbe011bbdc03 Author: John Bowman Date: Sat May 19 00:09:42 2007 -0600 Fix FillDraw pens. commit d04ada5f9ce0252c0805ff6fe7dd7c462be417ea Author: Andy Hammerlindl Date: Fri May 18 13:35:20 2007 -0600 Minor refactoring. commit b15d658f724fc64c216437821dd086e1b75b99d0 Author: Andy Hammerlindl Date: Fri May 18 13:34:40 2007 -0600 Got rid of annoying "no default init for " message. Fix a boolean flag mixup. commit b5d5b2480a1df2751c8abe7ba4cb8106afd8aadf Author: Orest Shardt Date: Fri May 18 11:08:24 2007 -0600 Acknowledged source of Imaging-1.1.6 patch commit 586bd648c5669f31bf60adb2664d720f7ca0c10d Author: Orest Shardt Date: Fri May 18 11:07:33 2007 -0600 Documented the enabling of PNG format in xasy commit 26b715066b394320c125c417b0d14026e0f47c54 Author: John Bowman Date: Thu May 17 21:51:53 2007 -0600 Remove unused directory. commit 62f5876939694c9ada532324caecacc47a10ad91 Author: John Bowman Date: Thu May 17 21:48:50 2007 -0600 Add default argument. commit 4c752c5186524d5c7bbe4b837f672d193f204d82 Author: Orest Shardt Date: Thu May 17 14:47:36 2007 -0600 Documented use of base64 commit 4eca9e53e681b998fc5a725ccf5e4ba33fdcab04 Author: Orest Shardt Date: Thu May 17 13:45:12 2007 -0600 Provided ability to draw a selection box to select all items in the box. Added item scroll up/down feature. Embedded the toolbar icon images into the source code. commit 05b3142d75defeef2015d7ff241ddfeb7e66ff00 Author: Orest Shardt Date: Thu May 17 13:42:01 2007 -0600 Arrows in icons are now the same style as Asymptote arrows. Transparency of text.gif fixed. commit ef70123f8dec5984ab5e27abaa461663d5c4cbbd Author: John Bowman Date: Thu May 17 09:19:11 2007 -0600 Added support for fillpen, drawpen, and legend entries to histogram. commit 5543f622b8f8087a6ad25ef71ef482ac50c045a7 Author: John Bowman Date: Thu May 17 09:12:11 2007 -0600 Adjust legendline length to account for marker size. commit 594ecf17fc8c156d9135c94463d4e4407d9591f7 Author: John Bowman Date: Thu May 17 09:10:53 2007 -0600 Minor optimization. commit 7e5078686cf17cdfb27f8182a7cf3db6dcb57ebb Author: Orest Shardt Date: Wed May 16 17:28:12 2007 -0600 Improved handling of highlighting when mouse enters and leaves an item. commit ecaabcbbe2937b3f4b4777a1706973ae1820d063 Author: Orest Shardt Date: Wed May 16 15:09:06 2007 -0600 Various improvements to xasy3 made including ability to select and move multiple objects, and fixed the ability to open additional files. commit d1c63b6cd9c1399de497b9cda1d2be0587baade9 Author: Orest Shardt Date: Wed May 16 15:04:29 2007 -0600 Added new icon for xasy3 toolbar. commit 8dcf6de5f2db342913bdeea12f3483495c03d54a Author: Orest Shardt Date: Wed May 16 15:02:55 2007 -0600 Updated Imaging-1.1.6 patch to adhere to conventions of other patches. commit 960b9890f5ce8e944fffa328e950dfc4db529cac Author: John Bowman Date: Wed May 16 07:29:59 2007 -0600 Speed up tickHandler; use default asy xformat. commit 2ca9d106ae96f6a79f7b9f75f204174aeed2146b Author: John Bowman Date: Tue May 15 23:14:35 2007 -0600 Optionally support transparent png deconstruction. Work around half-pixel bounding box bug in Ghostscript pngalpha driver. commit a72b2a6966040de1948eafac30c0b2bed4701ddf Author: Orest Shardt Date: Tue May 15 15:04:55 2007 -0600 Provided a patch to allow better alpha support in the PIL's ImageTk for the new GUI commit 5ce11724695458712b0a013b43d24c3119296b54 Author: John Bowman Date: Tue May 15 15:00:09 2007 -0600 Fix typo. commit fe83e56c0dc3062414a50681305da9bf2fbdcec9 Author: John Bowman Date: Tue May 15 10:37:32 2007 -0600 Fix typo. commit 0ed2fee6c78497a81fa73c24c4414d688db39950 Author: John Bowman Date: Tue May 15 10:36:47 2007 -0600 Fixed comment. commit 763d005d05d17ed653f6a0f61fc29a3b1fb92c0c Author: John Bowman Date: Tue May 15 09:13:34 2007 -0600 Fix increasing(real[],true). commit d38d613d9fddd77ae1787d63518ab0326dd6dc77 Author: John Bowman Date: Tue May 15 08:53:40 2007 -0600 Check that array x is strictly increasing. commit 90a313b01c7db33b5b9d0ea942df6b562d9b34d8 Author: John Bowman Date: Mon May 14 13:20:48 2007 -0600 Implement bidirectional signal handling to new GUI (under development). commit ee9a0615abb8b2da27829ee677a78a0370c2d5da Author: John Bowman Date: Sun May 13 10:07:35 2007 -0600 Generate begin and end figure comments. Documentation updates. commit f252fe5dcd7a4a20aded818080dcd9fdffb72f24 Author: John Bowman Date: Sat May 12 23:02:04 2007 -0600 Explicitly close EPS output file to avoid race condition with gv. commit ce8740b700536e06400f99cd381572621dfe57f1 Author: John Bowman Date: Sat May 12 17:12:57 2007 -0600 Increase arctime precision. commit e9f6461ad86397b18b593f3c815fa4d7680252c2 Author: John Bowman Date: Sat May 12 11:59:20 2007 -0600 Fix remaining numerical resolution problems with dir. Avoid arctime error when goal == L. commit 1bb0f379df706ae156c7023e2f66a6fd16bf60a8 Author: Orest Shardt Date: Sat May 12 09:34:16 2007 -0600 Fixed images for xasy3 commit e1a7b970ce10b948aff74c333edf4bc90caacb50 Author: Orest Shardt Date: Sat May 12 09:31:20 2007 -0600 Images for xasy3 commit 8edbb37bd7e49d1cb2b976f314535d89a4bcd772 Author: Orest Shardt Date: Sat May 12 09:25:40 2007 -0600 Added xasy3 - a new GUI commit 551c851330c0456cf299939923164241f57df5a6 Author: John Bowman Date: Fri May 11 17:23:02 2007 -0600 Documentation updates. commit 4b3131bef0f47d97fcee17473e02ea11a3f97cd1 Author: John Bowman Date: Fri May 11 07:05:05 2007 -0600 Suppress extra newline on standard EOF reads in absence of readline library. commit 60af1069ee62875c165dad1e53e1c6b00d0ff9f4 Author: John Bowman Date: Thu May 10 22:37:15 2007 -0600 Fix standard input of strings. commit e1c445ed7b053f5c9693bf60cff47610ab44b799 Author: John Bowman Date: Thu May 10 14:45:56 2007 -0600 Change SIGUSR to SIGINT and output a final box file to indicate end-of-sequence. commit 79197fc7fae5145c4e9662a47072143279af9789 Author: John Bowman Date: Thu May 10 14:44:57 2007 -0600 Remove "q" as abbreviation for interactive "quit" command now that "write(q)" at the prompt can be written simply as "q". commit 4ce98eea4007a0fe7cf5802622ef719f5afbf528 Author: John Bowman Date: Thu May 10 07:18:45 2007 -0600 Document dot(picture,real[],real[],pen); commit e0993a89087f39b647d2328cc6f18127565fc7f1 Author: John Bowman Date: Thu May 10 07:10:00 2007 -0600 Add piecewise monotonic spline type and example. commit a46a851de05f1b753534b143b19934d2f42c1932 Author: John Bowman Date: Wed May 9 23:05:15 2007 -0600 Use subpath to implement robust dir(path, real) function. commit 3a2e0d8ad1ae707b7d6dfb1d0de8dc4a1db143d8 Author: John Bowman Date: Wed May 9 20:02:21 2007 -0600 Fix endpoint dir(path, real) calculation. commit ef66c2b368d5067eac92ed0da0dddb3b5176df53 Author: John Bowman Date: Wed May 9 18:16:54 2007 -0600 Use datarootdir. commit 1cb07a0c9253787ad9dcf381411767d8bf40bed1 Author: John Bowman Date: Wed May 9 18:15:43 2007 -0600 Support --enable-gc=PREFIX. commit 2a7208768685774e29e9bb0ab8e3b103a49bae28 Author: John Bowman Date: Wed May 9 12:41:48 2007 -0600 When settings.signal=true, write a separate .box file for each object. commit d44ed6462ca2754968dc0fdadb2869f80a95162e Author: John Bowman Date: Wed May 9 11:58:15 2007 -0600 Port 2D dir changes to 3D. Standardize argument names for point, precontrol, postcontrol, dir, and subpath. Avoid numerical overflows in three.asy solver. commit dfacf1bfc1124c5776c12d2ba683ab1222204bdb Author: John Bowman Date: Tue May 8 22:06:12 2007 -0600 Fix definition of dir. Add optional final argument to dir specify incoming and outgoing directions. commit c1244c0331a8731e0c9397c38f9800a488c57854 Author: John Bowman Date: Tue May 8 13:10:09 2007 -0600 Swap xasy signals. commit a0f8582e216ff3816b07b0c077b0be2e3b3d69b8 Author: John Bowman Date: Tue May 8 13:06:40 2007 -0600 Fix URL formatting. commit 7227dc2d4c4956d9d10de01d0f4cbc26d2b97667 Author: John Bowman Date: Tue May 8 04:08:38 2007 -0600 Increment version to 1.29svn commit 8089f96bfc42626f1e7619ff0d7d5e6e4100b173 Author: John Bowman Date: Tue May 8 03:16:55 2007 -0600 Force uptodate to be true just before call to C++ shipout routine. commit c62958d6773ef46f2694ab5efbed4ce8509cb8cb Author: John Bowman Date: Tue May 8 03:09:49 2007 -0600 Swap gc library load order. commit 01c9abc9c59f02bc295960881b71ee91e396181e Author: John Bowman Date: Mon May 7 23:38:33 2007 -0600 Purge standard input after reading in interactive mode. commit 198580292c624fd5cbbecc672a8ca1646cf011bd Author: John Bowman Date: Mon May 7 18:03:27 2007 -0600 Fix segmentation fault in readline() and runaway process on reading EOF from standard input in absence of readline library. commit 044ccbd7b71d7337e043e41b53a8de9c1db3a3f3 Author: John Bowman Date: Mon May 7 17:32:17 2007 -0600 Add GCPPLIB target. commit 928c90747003c115ebef7553151b1e512bc842fb Author: John Bowman Date: Mon May 7 15:21:27 2007 -0600 Support parallel builds. commit 25ca9066d7e2ff60f849f823799967e8105ab5d4 Author: John Bowman Date: Mon May 7 14:36:53 2007 -0600 Use SIGUSR1 and SIGUSR2 to communicate with new version of xasy. commit 62aff1b7496cf0f280670af7e032800bc85ae256 Author: John Bowman Date: Mon May 7 11:51:01 2007 -0600 Simplify and optimize xstream header. commit 9eeb41f829539b54e43b9eaaf23c1d2d22482058 Author: John Bowman Date: Mon May 7 02:04:59 2007 -0600 Add dvipsOptions configuration variable. commit a030a61bb2abf39ec2ef3a6f9aa2d175ebdac7b2 Author: John Bowman Date: Mon May 7 01:32:37 2007 -0600 Fix bug in xinput. commit 3f66b4b2165b32bca62e86a965895812c19294ff Author: John Bowman Date: Sun May 6 22:49:39 2007 -0600 Further parallel documentation build improvements. commit 824ad21409ec9d7015a57d921d9cab8ca1a69ac8 Author: John Bowman Date: Sun May 6 22:39:54 2007 -0600 Improve support for parallel documentation builds. commit e9704d91c1c8f7046fc6d76115edd0e48284078b Author: John Bowman Date: Sun May 6 22:03:35 2007 -0600 Support nonglobal animations, where each frame is scaled and written to a file separately. commit 9aa7a3056a6d64fa7736bdd9e4b05fa9b879a10d Author: John Bowman Date: Sun May 6 21:38:48 2007 -0600 Support gcc version 4.3. commit 449ec2841903aa398eb87f801fbac43c174a1cb9 Author: John Bowman Date: Sun May 6 14:10:08 2007 -0600 Documentation updates. commit adb06d900490737193efc05e339b0291be3aa2b2 Author: John Bowman Date: Sun May 6 13:53:36 2007 -0600 Support parallel documentation builds. commit 6c6fae56f8facec0a0ca8a2e2ee238588b6c56a9 Author: John Bowman Date: Sun May 6 12:03:58 2007 -0600 Remove intro target to avoid problems under Fedora Core 5. commit 0fb4d6f9254d8932a266af94c48a63a041098558 Author: John Bowman Date: Sun May 6 11:31:08 2007 -0600 Improve TeX error handling. commit af3cdf75576976aa5c39d97d329448b0b7937628 Author: John Bowman Date: Sat May 5 21:53:16 2007 -0600 Minor makefile edits. commit bdf7fe2fa5bbfbc4d77cde52d3db7ab7517accfd Author: John Bowman Date: Sat May 5 10:54:13 2007 -0600 Update URL. commit bfed005bb05306b76abd3f61951e467eaf12ebff Author: John Bowman Date: Sat May 5 03:01:44 2007 -0600 Clean up generated files. commit 5e281cf59111b1b3aa7f165bc606164bae4de682 Author: John Bowman Date: Sat May 5 03:00:52 2007 -0600 Increment version to 1.28svn. commit 4445d7145c63c04e73f1cd8d19bc17954ec7548e Author: John Bowman Date: Sat May 5 01:49:44 2007 -0600 Fix warning messages. commit b7d4b1dab520178724f8addb903be4eb910a6e5f Author: John Bowman Date: Sat May 5 01:35:45 2007 -0600 Fix warning messages. commit 198b794abc6a48114e126a23bbac209e5a0b14f8 Author: John Bowman Date: Sat May 5 00:47:58 2007 -0600 Add example showing Hermite spline interpolation and filled cyclic crosses. Fix formatting. commit 2917092e1a17e71124a9abb37b9fefbc2a1934ce Author: John Bowman Date: Sat May 5 00:07:03 2007 -0600 Optimize palette loops. commit febdf53e4e8f7e338d1aca53d9bced32b4ca0eec Author: John Bowman Date: Fri May 4 23:43:14 2007 -0600 Fix data cropping/scaling. commit b1c9f2af191f12847edca78f8247ad6520309e94 Author: John Bowman Date: Fri May 4 23:37:08 2007 -0600 Add modified version of Stefan Knorr's unit n-point cyclic cross, with optional end rounding. commit 91b02a7743013213ec5708a102fbc8a675cbbc59 Author: John Bowman Date: Fri May 4 19:36:04 2007 -0600 Add remaining fix for MSWindows version of TeXLive 2007. commit d7c903686fa3b56ed717f3d22a9a80566365c68f Author: John Bowman Date: Fri May 4 17:35:06 2007 -0600 Work around jobname bug in MiKTeX 2.5 and 2.6: turn stars in file names (resulting from spaces, etc.) into underscores. commit f96e2c68e92fea5054048daa55197975d1d07cc5 Author: John Bowman Date: Fri May 4 10:39:03 2007 -0600 Simplify tex pipe handshaking and improve error detection. Support TeXLive 2007 under MSWindows. commit f69a3cd29fd1a62bd5896075f68d3758fe555307 Author: John Bowman Date: Thu May 3 23:01:43 2007 -0600 Don't allow rotation about the zero vector. Ensure align always returns a right-handed transform (a rotation). Fix longitudinal skeleton detection when axis=-Z. commit 0adaa7180dfd822a832085978313ccdff8f0f8d8 Author: John Bowman Date: Thu May 3 21:47:55 2007 -0600 Add routine to return a diagonal matrix. commit a6e4c818bc820067f4ac3d23f94f03ba31dda98e Author: Andy Hammerlindl Date: Thu May 3 10:22:29 2007 -0600 Removed finished item. commit 3a920b81235d9e48db94758a173640f0e57788ba Author: Andy Hammerlindl Date: Thu May 3 10:15:03 2007 -0600 Fixed typo. commit 97c6d8898719ed96b4297197eb0886a7dfd3dca7 Author: Andy Hammerlindl Date: Thu May 3 10:11:22 2007 -0600 Assign expression are no longer written at the prompt. commit 4166ef82a9eabfbc16d27c9023d55a5dca9d768b Author: John Bowman Date: Wed May 2 18:02:32 2007 -0600 Add -signal option for signalling completion of shipout to xasy. commit 8dbd3e086f6a23de3b50b0b80442e0e405bb661a Author: John Bowman Date: Wed May 2 09:57:30 2007 -0600 Simplify use of join operator. commit feb0b3261b735876333a812f7a69acb39557270a Author: John Bowman Date: Wed May 2 09:56:36 2007 -0600 Change return type of contour routines back to guide[][] both for backwards compatibility and in case user wants to connect smoothly to external noncyclic contours. commit 9069d1c14e2ce94f3819f6c93d7ee075b3850ad1 Author: John Bowman Date: Wed May 2 01:45:46 2007 -0600 Add Hermite spline graph interpolate type for smoothly joining sampled functions. Change return type of contour routines to path[][]. Move splinetype routines to new file splinetype.asy. Add bool increasing(real[] x) routine to math.asy. Optimize image scaling. commit 2afa9d4becfb09f442b9d483c2962bdbb17c5126 Author: John Bowman Date: Wed May 2 01:38:41 2007 -0600 Make guide precision consistent with path precision in diagnostics. commit 96e6c7831a825f65d68e4c451e50976a8213195e Author: Andy Hammerlindl Date: Tue May 1 18:52:48 2007 -0600 Added curlSpecifier. Removed curl3. commit 2767fe88faa931e1a874d7c5c345a63b49c5b126 Author: Andy Hammerlindl Date: Tue May 1 11:37:51 2007 -0600 Added the tensionSpecifier type. Removed tension3. commit 150a86b8b7e7c0517decd116ef158c4dcf409597 Author: John Bowman Date: Mon Apr 30 21:18:41 2007 -0600 Updated documentation regarding change from cycle3 to cycle. commit 5d3c433407d975022fb01b00c61e5e15ed62a934 Author: Andy Hammerlindl Date: Mon Apr 30 00:22:30 2007 -0600 Test for the cycle keyword. commit 13f9a9bb60b14e3b85253e98eb3bcbf86a6720c8 Author: Andy Hammerlindl Date: Sun Apr 29 22:47:46 2007 -0600 Added the cycleToken type. Changed cycle3 to cycle. commit 1999876bb4ec9930ee59ef6d0c1817edbd55e468 Author: Andy Hammerlindl Date: Sun Apr 29 15:05:21 2007 -0600 Use an C Preprocessor X-Macro to create new primitive types. commit 3077361d259b777bcd6292481e2f00bf97868363 Author: Andy Hammerlindl Date: Sat Apr 28 15:56:59 2007 -0600 Remove old, unused source file. commit 9c10a8626a0f6a318bbcc6004d733799f1adcefb Author: John Bowman Date: Sat Apr 28 11:39:37 2007 -0600 Make Bezier curve solid and control lines dashed. commit 2443ceab7a8b6b9c6c6af2cc554f260bddb06ccd Author: John Bowman Date: Sat Apr 28 01:15:13 2007 -0600 Minor optimizations. commit c5f7661b9ce35af5bc2474c6debac680c4b25936 Author: John Bowman Date: Sat Apr 28 00:37:32 2007 -0600 Remove unused array. commit 81e44094a62541c243b2cc9901ce35af6179e692 Author: John Bowman Date: Sat Apr 28 00:34:47 2007 -0600 Use a simpler argument list for clamped splines. commit 5e2e7caad209a5c38576331d8015b3ae98c6ae44 Author: John Bowman Date: Fri Apr 27 20:59:35 2007 -0600 Don't try to build intro.pdf with default install (due to eforms dependency). commit bc2debbdad6e48b58275f98c1142c46ccb9f9348 Author: Andy Hammerlindl Date: Fri Apr 27 08:26:54 2007 -0600 This file hasn't been used in ages commit 53b44dad2fc449bf2326b7c1bb5dd15b260adc10 Author: Andy Hammerlindl Date: Thu Apr 26 07:03:57 2007 -0600 Removed primArray. arrays are not primitive, and the type could only be only erroneously. commit b84e53ba1d2caefd8ce83719ef073eff207d8f1e Author: John Bowman Date: Mon Apr 23 11:09:51 2007 -0600 Rename "append=false" argument of output, boutput, and xoutput to "update=false" and make it allow both reads and writes to the data file. Negative arguments to seek are relative to end of file. Add seekeof(file) to position file pointer to end-of-file. commit 6a31b86036ec819885ad7157669867d0cf4a2ca2 Author: John Bowman Date: Sat Apr 21 21:38:16 2007 -0600 Fix dependencies. commit cc68406e9143ff04ab91d9b48ccdaf3824120e3d Author: John Bowman Date: Sat Apr 21 19:41:32 2007 -0600 Distribute pixel.pdf rather than pixel.ps. commit 857de182af365683ec14ac86b23bbda5c4d8a323 Author: John Bowman Date: Sat Apr 21 18:00:10 2007 -0600 Add ability to load pdf animations from an external file (one frame/page). commit 0f052e45fb2b3da45a7b07472a244b4686183d6f Author: John Bowman Date: Sat Apr 21 14:20:48 2007 -0600 Make filloutside work with paths that extend beyond the current boundary. commit 1d86d57b95501aaee0bb025623ca0dace214dc1d Author: John Bowman Date: Sat Apr 21 10:55:14 2007 -0600 Fix formatting. commit 1a55cbee13565c5b01899832c780dd008afd0fa1 Author: John Bowman Date: Sat Apr 21 10:44:18 2007 -0600 Fix top level indentation of braces. commit ea8ca0f021d2c2986b8be72a4a884b3684714d79 Author: John Bowman Date: Fri Apr 20 23:01:52 2007 -0600 Simplify control panel. commit 05f4d02e471c2f44eb88442085c091eb941e3e36 Author: John Bowman Date: Fri Apr 20 22:51:17 2007 -0600 Added PDF rolling wheel animation. commit debce269ae9cd43e8cc214d1539466982320ddc1 Author: John Bowman Date: Fri Apr 20 22:50:13 2007 -0600 Delete temporary .aux file. commit 858cf4e2c0f46142a8b9a6c7ba6015db3d1b7d58 Author: John Bowman Date: Thu Apr 19 22:53:07 2007 -0600 Increment version to 1.27svn. commit e9bc191d312bde63e038828dbaa89173d1fa063b Author: John Bowman Date: Thu Apr 19 21:36:54 2007 -0600 Rename source and UNIX binary files for compatibility with releaseforge. commit 9a5852c7644742505ed12c8d94a0fcd8d54ca57c Author: John Bowman Date: Thu Apr 19 18:22:10 2007 -0600 Use a better camera-independent reference value for resolving path3 orientation. Check for negative curl values. commit 0d3e6b78a14b0d1f02ca7fe35ce55de72047305d Author: John Bowman Date: Wed Apr 18 18:58:56 2007 -0600 Added patch to gv-3.6.2 to make redisplay work properly (and fix gv security hole). Removed --nowatch option from call to gv. commit d9292e4fbd36a22e00dd09095316c6ce197d6fef Author: John Bowman Date: Sun Apr 15 18:25:39 2007 -0600 Remove unused (and unmatched) %%EndProlog line. commit 7f8db6a7f07ac51a007315a71380e2c53d6480f7 Author: John Bowman Date: Sat Apr 14 10:56:19 2007 -0600 Remove unneeded access settings. commit 8e3086531898dc2fe69f1cbe25163b6d9ad91b7e Author: John Bowman Date: Fri Apr 13 16:48:52 2007 -0600 Support pdflatex texengine. commit 6fb84927ebdc6c0e042ca0b812612abec957f3b6 Author: John Bowman Date: Fri Apr 13 07:46:54 2007 -0600 Improve example. commit 7223247bf194f2d1b077bad907cb773034aa6071 Author: John Bowman Date: Fri Apr 13 07:46:38 2007 -0600 Fix front/back transverse skeleton detection. commit 15be2bfe0c909747b52e12d015227f50b8a53418 Author: John Bowman Date: Thu Apr 12 06:16:58 2007 -0600 New item. commit 9446698168d19e677cd5a2b80c20c36dc7bd8c5a Author: John Bowman Date: Wed Apr 11 21:21:57 2007 -0600 New item. commit 31496173b22bded7a5dfa2443d23046581d891cf Author: John Bowman Date: Tue Apr 10 17:30:34 2007 -0600 Speed up detection code for old versions of gv. commit 84bfb07a6af8defec0ed240c66b3ed0e144b2d69 Author: John Bowman Date: Tue Apr 10 13:44:56 2007 -0600 Add link to online example. commit afe2f1fb251940fbbb3c645c7fb033aaff55007a Author: John Bowman Date: Tue Apr 10 13:29:11 2007 -0600 Add acsc, asec, and acot functions. commit f9a981f384e777b70f9f687a337f98526d20731d Author: John Bowman Date: Tue Apr 10 13:27:09 2007 -0600 Fixed typo. commit a1aaecbeadf18bedc200705f1d5333fa5bf8e9b6 Author: John Bowman Date: Tue Apr 10 13:14:17 2007 -0600 Implement Break tickmodifier to allow broken axes to work with automatic tick generation. Support broken logarithmic axes. commit 0ae96277f78f70fb940c43ab7d4e9bcf5e301843 Author: John Bowman Date: Tue Apr 10 09:29:12 2007 -0600 Autogenerate tick values. commit 34119036d472900f516599c0057b0f5d40836eff Author: John Bowman Date: Mon Apr 9 23:11:29 2007 -0600 Update FAQ. commit 5f65ee1cd809620c5c2b6f28b7c3aca7cd490052 Author: John Bowman Date: Mon Apr 9 23:02:39 2007 -0600 Add aligned axes example. commit ac3cca963cfe3d4b8da8c4482703741471066763 Author: John Bowman Date: Mon Apr 9 19:26:46 2007 -0600 Increment version to 1.26svn. commit 800b9ecf2f7db512f1403b7ee5ba9b3f135a2836 Author: John Bowman Date: Mon Apr 9 16:43:17 2007 -0600 Untabified and standardized indentation of base files. commit 6f5c1bc025be78de3a8b7697720d4f65117dd4f9 Author: John Bowman Date: Mon Apr 9 14:34:45 2007 -0600 Update documentation. commit 978a35b1855f746833c92c6f42cb68cbfd4678c4 Author: John Bowman Date: Mon Apr 9 14:27:36 2007 -0600 Added spline interpolation routines. commit f45ad4098c648fef4889d649ebe701d47a8a0c56 Author: John Bowman Date: Mon Apr 9 11:41:35 2007 -0600 Add Olivier Guibe's interpolation module and example. Remove long examples from the documentation. commit 986a448e0cb005a22c5eadc5570abb757a217432 Author: John Bowman Date: Mon Apr 9 09:45:10 2007 -0600 Document syzygy module. commit e80ec64fb44ba22c33a46961e8334ddb07dc4c21 Author: John Bowman Date: Mon Apr 9 09:35:49 2007 -0600 Remove default initializers. commit 1eeeb6a07e44f8331e54665ad7b92b6df3b2581d Author: John Bowman Date: Mon Apr 9 09:30:08 2007 -0600 Fix surface lighting. commit e613138e71f008bea5167a34aa5e9e014de676ee Author: John Bowman Date: Mon Apr 9 00:27:58 2007 -0600 Update documentation. commit 10a32373996329021cbf79ceef6e0b8b53805822 Author: John Bowman Date: Mon Apr 9 00:26:01 2007 -0600 For parameterized surfaces, rename bool oriented=true to bool outward=false. commit 0544dc63934c2a48bf7647e3ae033f8e881c471a Author: John Bowman Date: Sun Apr 8 23:54:01 2007 -0600 Improve discussion of surface orientation. commit b4ddf284949a3b45c9284de6a70b8a9f350658f9 Author: John Bowman Date: Sun Apr 8 23:27:13 2007 -0600 Document oriented option for drawing surfaces. commit e38a112f2f848020fb656fe0ba122b624e3bf943 Author: John Bowman Date: Sun Apr 8 22:52:43 2007 -0600 Choose locally outward surface normal only for nonorientable surfaces. commit 1eb940f8367a1dfaa27f8b0ce6a54ef9be61622d Author: John Bowman Date: Sun Apr 8 21:41:35 2007 -0600 Make ^^ return a path3[] instead of a guide3[] for consistency with the 2D routines. Remove spurious specifier when writing a guide3. commit 2102439b301dad154e7a0bfb3b1acf67e76e03b3 Author: John Bowman Date: Sun Apr 8 17:43:53 2007 -0600 Document string array reads under line mode. commit eb31e3b3bfd1289bdbb23b307abfb82cf0e40dbf Author: John Bowman Date: Sun Apr 8 17:31:00 2007 -0600 Add white-space string delimiter mode word(file, bool b=true). commit 134e8461c07f07602882ba0a8f0345ddd9f50997 Author: John Bowman Date: Sun Apr 8 12:25:39 2007 -0600 Explicitly write EPSF in output header rather than relying on dvips -E option (which doesn't work for even the first page of multipage documents). commit a146939bda5fbfacffbc62ea05e2fe538e318c8f Author: John Bowman Date: Sat Apr 7 23:21:51 2007 -0600 More guide3 to path3 changes. commit 3fef11043aa5c73e2005076490e32aab76f8a9f2 Author: John Bowman Date: Sat Apr 7 19:40:01 2007 -0600 Revert csv comment changes. commit d190952a8ee8b4009ce39fd1317452d1e196262e Author: John Bowman Date: Sat Apr 7 19:37:09 2007 -0600 Remove spurious diagnostic. commit ddcfae950a3b57e7e732adffe9073f9a08104d13 Author: John Bowman Date: Sat Apr 7 18:43:10 2007 -0600 Standardize path vs. guide. commit 0a2ff0aecd3a54ddc3d83670684860d8962bea4b Author: John Bowman Date: Sat Apr 7 18:42:27 2007 -0600 Update fixed graph size documentation. commit c002cc241415f7f20c12eae447ae7b6108465c65 Author: John Bowman Date: Sat Apr 7 18:41:29 2007 -0600 Added header comment line. commit 034f0ba8b413d7e75cd5929c9116a67cf2f9782b Author: John Bowman Date: Sat Apr 7 18:40:09 2007 -0600 Standardized indentation. commit 3d286f1ad28dfeb14995285e612f6dc1b0b2d330 Author: John Bowman Date: Sat Apr 7 18:38:28 2007 -0600 Allow escaping of comment character in strings. Disable comment character when reading raw characters with getc(file). commit 8bb86ef5431af89f942bfb99596cc39f225e02ea Author: John Bowman Date: Sat Apr 7 02:10:49 2007 -0600 Added -E option to dvips to force it to denote the file as EPSF (we nevertheless discard the computed dvips bounding box information). commit c24dd3e68d82f70181d174d5fa7577c5698731e9 Author: John Bowman Date: Fri Apr 6 16:25:57 2007 -0600 Document reltime, relpoint, and midpoint routines. Add 3D midpoint routine. Standardize path arguments names. commit 389a7ed6ce7db8b3aadd86617076a9d107cefb03 Author: John Bowman Date: Fri Apr 6 00:31:29 2007 -0600 Clean up _slide*_.aux files. commit d8963113b0f5387409812cc06c85ad6d911cc73c Author: John Bowman Date: Fri Apr 6 00:19:31 2007 -0600 Updated intro.asy to Andy's talk at the University of Alberta. Addded syzygy module and knots.asy example. commit a68182f723175d7d1d6e11f64b449358934db02a Author: John Bowman Date: Wed Apr 4 09:16:45 2007 -0600 Choose correct surface normal when calculating lighting. Added Klein bottle example. commit 44c51f23f44b0a2f9853b917cad53d1ae54e06c0 Author: John Bowman Date: Tue Apr 3 23:14:18 2007 -0600 Removed unused sign. commit fcfc8dff3345a7c64404f699c5faf1e99babedaa Author: John Bowman Date: Tue Apr 3 09:22:21 2007 -0600 Remove unused dependency on LaTeX "rotating" package. commit 1144f27dbba5d4734ad8746ebd2e6b227b752973 Author: John Bowman Date: Mon Apr 2 11:29:48 2007 -0600 Clarify nonroot install instructions. commit 112c4a2ae2e4da7d2e88a0cf59b7d14831cfb025 Author: John Bowman Date: Sun Apr 1 13:48:00 2007 -0600 Allow one to control the minimum width and height of flowchart blocks separately. commit 6976bf5a630648ce63974c1d4bcae61e81580d33 Author: John Bowman Date: Sun Apr 1 03:16:23 2007 -0600 Incremented version to 1.25svn. commit eb0466e26e50f623a19e92d6d684e7c2771f533f Author: John Bowman Date: Sun Apr 1 02:37:10 2007 -0600 Fix formatting. commit d90199bc8d3066e009bc306a9983fd1ce6c2791d Author: John Bowman Date: Sun Apr 1 02:33:59 2007 -0600 Simplify makefile. commit 0794098153d3c097dd9be059912e8658b4e28aa6 Author: John Bowman Date: Sun Apr 1 02:24:24 2007 -0600 Fix backslash. commit 3a142a13eb12dee1253557ff936b960e018b9fe8 Author: John Bowman Date: Sun Apr 1 01:57:57 2007 -0600 Fixed typo. commit 38ef4f4978789996ca500ba495f2b4c1be857f76 Author: John Bowman Date: Sun Apr 1 01:51:53 2007 -0600 Fix __CYGWIN__ preprocessor test. commit 77d574f2d4fdc16254540a407a5d1629ec98a6dc Author: John Bowman Date: Sun Apr 1 01:36:06 2007 -0600 Fix binary space partition camera positioning. commit a34cfc8fb00166570506ded46b3d024c95ca7223 Author: John Bowman Date: Sat Mar 31 22:19:34 2007 -0600 Added 3D version of intersectionpoints routine. commit b0c9a79c7c500a149f7c780827aa75fc072c9083 Author: John Bowman Date: Sat Mar 31 20:00:15 2007 -0600 Add optional fixed block size specifiers. commit 40802aaae2756ff7e6668921e6698fa61be9c13c Author: John Bowman Date: Sat Mar 31 13:49:01 2007 -0600 Remove workarounds for real[1][] bug fixed in 1.24-37. commit 57e77ec4271d174065bb0bfdf82b2c6bcc821421 Author: John Bowman Date: Sat Mar 31 13:43:59 2007 -0600 Reimplement display. commit 9799ea22f5867510164c10a54ca80cc63715e9c5 Author: John Bowman Date: Sat Mar 31 10:40:17 2007 -0600 Change && to &. commit 94fd36e90228618768848c0162bab480d14e9c2b Author: John Bowman Date: Sat Mar 31 10:39:02 2007 -0600 Change && to &. commit 33de1657b03bc42320c5eb86c98b1e9e11c45881 Author: John Bowman Date: Sat Mar 31 10:35:47 2007 -0600 Change && to &. commit b71d943ae2d9dcd130b67933eafa2428c078bbac Author: John Bowman Date: Sat Mar 31 10:33:03 2007 -0600 Update fontsize to use fix-cm.sty instead of type1cm.sty. commit 6d18e0cef3231caebc862301faf802311ecb1c40 Author: John Bowman Date: Thu Mar 29 11:37:29 2007 -0600 Clear errors encountered via debugging _eval. commit b882d4513c2afe98f2e0ca3f2b93af3d38969cdc Author: John Bowman Date: Wed Mar 28 12:57:14 2007 -0600 Fix default y tick values. commit 2454bf7bca0d52ee0c11ab9476d50227e176eb70 Author: John Bowman Date: Wed Mar 28 08:52:23 2007 -0600 Update MacOS X binary URL. commit 2b12ce9878dbd75656f6fc8553d82f0b7769b8d7 Author: John Bowman Date: Wed Mar 28 08:07:49 2007 -0600 Make angle(rotate(x)) always return x (mod 360). commit 8ee58e155eec492326e076bff8d8f027eb59c96f Author: John Bowman Date: Tue Mar 27 12:17:00 2007 -0600 Remove spurious line break after syntax errors. commit 6d1584acca30bccab6be9e94670bae9a0daf5d50 Author: John Bowman Date: Tue Mar 27 09:41:53 2007 -0600 Update URL. commit 8506d3604012b3ad4f3e6dea7ae975885427fea6 Author: John Bowman Date: Tue Mar 27 09:34:58 2007 -0600 Fix segmentation fault in Dumoulin's C++ port of Burke's Triangulation routine. commit f14aae102619fb51eadfb85a752f0d397e5dd257 Author: John Bowman Date: Tue Mar 27 08:05:53 2007 -0600 Fixed new real[1][] bug. commit e5c50a3081ca75bfb3a53abbe035c088d35cb565 Author: John Bowman Date: Tue Mar 27 07:36:38 2007 -0600 Added bitwise NOT function. commit c87a4702b5a22089740bca982354de10372f7ea9 Author: John Bowman Date: Tue Mar 27 06:54:12 2007 -0600 Rename intersect arguments to correspond to documentation. commit 24999ddf3c831ed9826e84de4b03d52caea257d6 Author: John Bowman Date: Tue Mar 27 06:53:31 2007 -0600 Fix segmentation fault given real[n][0] data array. commit aaacb7bb0e0b6bc0cdd1f7f07fc1790b58799b2e Author: John Bowman Date: Mon Mar 26 13:28:28 2007 -0600 Added missing tensorshade picture arguments. Fixed ambiguity with "asy plain_picture.asy" test. commit 35554fb9280a9c780d69737f512aabfedcb10a44 Author: John Bowman Date: Mon Mar 26 13:21:56 2007 -0600 Change array op && to &. commit 94c5fb19f5f155d33b121d136a8d7474e4c94420 Author: John Bowman Date: Mon Mar 26 07:41:10 2007 -0600 Use hard-wired postscript-to-tex scaling for clipping, rather than calculating it from defaultmatrix, to support explicit post-scaling of eps figures (e.g. with \includegraphics). commit c08a992e5e0347f07b5683e6bd4984704abaf8c0 Author: John Bowman Date: Mon Mar 26 05:52:05 2007 -0600 Document multidimensional array initialization. commit 075bdcdcee1b2265977c57a9cde43760e1b3b273 Author: Andy Hammerlindl Date: Sun Mar 25 22:56:55 2007 -0600 commit 8ec594d671d9ee9ab1413338acdde4267f09fc30 Author: Andy Hammerlindl Date: Sun Mar 25 22:10:05 2007 -0600 Removed array checking from && and ||. commit 075f7a044afe33940236a9c4c214cfeaad3f17c8 Author: John Bowman Date: Sun Mar 25 01:24:51 2007 -0600 Revert 1.24-20. commit ee2164a96b22a92cf9ed7d619f91715269150189 Author: John Bowman Date: Sun Mar 25 01:05:02 2007 -0600 Document null instances of structures. commit 3b60ad1a87c5abc1ef0787af4aa5451e5a0fd169 Author: John Bowman Date: Sun Mar 25 00:53:13 2007 -0600 Use null initializer for binarytreeNode. commit 34f6924ccfa298c0d26b33db8dba9da749c3a8d6 Author: John Bowman Date: Sun Mar 25 00:23:46 2007 -0600 Added & and | boolean operators which work like && and || except that they always evaluate both arguments. Renamed array boolean operators && and || to & and |. Added AND, OR, and XOR bitwise functions of two integers. commit 9e706d5ee15c8dbf9819b5312822fc7520a01937 Author: John Bowman Date: Sat Mar 24 12:19:48 2007 -0600 Fix intro.pdf target. commit c873f8f32bd379219745c525ece0ca1958d51563 Author: John Bowman Date: Sat Mar 24 11:28:46 2007 -0600 Simplify and improve implementation of figure(). commit 72bbad4b5a7824d4289c68048e7bcd989509c6e1 Author: John Bowman Date: Sat Mar 24 11:28:08 2007 -0600 Use invisible figuremattpen for Asymptote logo. commit 9612c0baa049b7cee97da93edcc6ea2ecbeb3400 Author: John Bowman Date: Sat Mar 24 11:27:25 2007 -0600 Enclose PostScript clipping code with gsave and grestore. commit 343e5997cffbdbfca15be8f76860383c8215f6b4 Author: John Bowman Date: Sat Mar 24 11:25:52 2007 -0600 Move camera for infinite projections. commit 0e54a478c8a5493836cb768177361c27c81b13e0 Author: John Bowman Date: Thu Mar 22 21:41:41 2007 -0600 Allow | as binary operator. Remove || and && from list as they always expand to a ? true : b and a ? b : false. commit 9747370ce3fd2fa51fdf797a8d77e3d63d8a0d44 Author: John Bowman Date: Thu Mar 22 01:34:13 2007 -0600 For infinite projections, move camera to outside of bounding box. commit 93dec9da6affa79af424914424ebcec1653398fa Author: John Bowman Date: Wed Mar 21 06:42:18 2007 -0600 Fix binary space partitioning for projections from infinity (oblique and orthographic). Generalize perspective projection to allow any target point. commit d7a1ebcc32a4f23eb799c49edea0cd80c58948c2 Author: John Bowman Date: Mon Mar 19 01:23:53 2007 -0600 Use local projection consistently in binary space partition splitting. commit edd4e9b3041869b5dc0009e5cb362d6e33a066af Author: John Bowman Date: Sun Mar 18 06:33:03 2007 -0600 Check for tension < 0.75. commit dfd1fe22894aaa0f0b187355e5b2ae3522abc585 Author: John Bowman Date: Wed Mar 14 22:18:10 2007 -0600 Update documentation of the implicit initializer for structures. Remove operator init() initializers that are no longer needed. Initialize Tension in three.asy with sensible defaults. commit 0ecb68b4f3b77fd1209fd7216de26a8ea18a43b6 Author: John Bowman Date: Wed Mar 14 00:47:33 2007 -0600 Support multiple pdf animations in inlinetex mode. commit 3a448743613ea1c0d3b76d3b198277862933777e Author: John Bowman Date: Wed Mar 14 00:46:44 2007 -0600 Minor reorganization. commit a79dad027e794ce6c1ce6bf45e48d667c6292694 Author: John Bowman Date: Wed Mar 14 00:44:28 2007 -0600 Format. commit f37633940d041d83ba87555b72b14448d93c8594 Author: Andy Hammerlindl Date: Tue Mar 13 21:48:12 2007 -0600 Add automatic record initializers after the records are defined. commit 945347dfb0a151559683d2de6d9bb43f32d6a1f0 Author: Andy Hammerlindl Date: Tue Mar 13 21:37:27 2007 -0600 Added note about loop translation. commit 65d305d1d6c8bf8f4c3901abb9a62301d406a55c Author: John Bowman Date: Tue Mar 13 01:23:43 2007 -0600 Input LaTeX preamble only in inline mode. commit bc2eb60aef3d9eb856754d0fb5f78ea39a698c3c Author: John Bowman Date: Tue Mar 13 01:14:55 2007 -0600 Work around pdflatex bug. commit a00caf67c40dc0a3aac245cb48e0570ebb7ef23e Author: John Bowman Date: Tue Mar 13 00:34:06 2007 -0600 In inlinetex mode, communicate the asy texpreamble to TeX via \jobname_.pre. Remove asypreamble environment; corresponding Asymptote commands should now be put in the asydef environment. commit b81e30903180f8e7484a71d3a5bd1b4747f2e4ca Author: John Bowman Date: Sun Mar 11 17:49:13 2007 -0600 Minor updates. commit 5bad764fa7566f1ffd55e21b8d3b21375789a6ac Author: John Bowman Date: Sun Mar 11 12:23:17 2007 -0600 Make Ghostscript dependency explict for MSWindows. Check for GPL Ghostscript as well as AFPL Ghostscript. commit 7f0756bea504dd1757cd36786b24cbf9c77f39c9 Author: John Bowman Date: Sun Mar 11 11:15:00 2007 -0600 Minor clarifications. commit 50f44e45dad41a856c3761a46b32c806bc6a9d56 Author: John Bowman Date: Sun Mar 11 10:30:10 2007 -0600 Simplify MSWindows registry lookup. commit 0f83019e080aa3e30ef15265510874c35566a9ed Author: John Bowman Date: Sat Mar 10 01:52:49 2007 -0600 Incremented version to 1.24svn. commit 41136ee276c09cbebf2adbe85f17b5a2a59c958d Author: John Bowman Date: Sat Mar 10 01:13:56 2007 -0600 Fix cxx warning. commit 48deb18c78765d5d568fe118af97dd32d94296aa Author: John Bowman Date: Sat Mar 10 00:56:52 2007 -0600 Autoconfigure under MSWindows by querying the registry, so that Asymptote and the applications it depends on may now be installed in any location. commit e72fbc666cfe970f1e6f9071282cffd9c0e21839 Author: John Bowman Date: Sat Mar 10 00:52:43 2007 -0600 Check if hint is set before accessing it. commit ef4585636df941aebbcc644da75bf0efe864c0b2 Author: John Bowman Date: Sat Mar 10 00:18:41 2007 -0600 Fix import gsl under MSWindows. commit 96516a2f3962a449794e32c55df6ab829cc39607 Author: John Bowman Date: Thu Mar 8 23:35:13 2007 -0600 Simplify implementation of texpreamble environment. commit 8409e9082abae2880c6b34d6aadc3dbc94b066e6 Author: John Bowman Date: Thu Mar 8 23:03:33 2007 -0600 Fix typo. commit 45214f111b7624a440ce0c06c433473c6d8aadd3 Author: John Bowman Date: Thu Mar 8 22:59:11 2007 -0600 Add empty postenvironment definitions. commit 1ae539fa6b5086c888ffe7ec867f9ae8dc747239 Author: John Bowman Date: Thu Mar 8 22:35:25 2007 -0600 Add texpreamble environment to contain the LaTeX preamble for both LaTeX and Asymptote. commit 7c35840227fb6ed47caaca66151a7c7580aa0558 Author: John Bowman Date: Thu Mar 8 12:44:25 2007 -0600 Remove unused line. commit 3fb97fb770706084c7f861439c4022ed33edc879 Author: John Bowman Date: Thu Mar 8 00:43:48 2007 -0600 Add autoimport option. commit 9067d6a86f046363dcf0866c6c8cf4995da6296f Author: John Bowman Date: Tue Mar 6 12:17:22 2007 -0600 Allow shipout to write to other directories if and only if -global is true. commit d51027228f2c19d7ed6105965ba9ceef86e47feb Author: John Bowman Date: Tue Mar 6 01:25:30 2007 -0600 Ensure colon is catcode other (12) so that TeX includes like \usepackage[frenchb]{babel} don't break inlinetex mode. commit 719b2629105273aee7e305c14c525f490916a69c Author: John Bowman Date: Mon Mar 5 16:05:53 2007 -0600 Fix background picture sizing. commit 5e7740180fd2443186313e1d3ca75f24756fe9a4 Author: John Bowman Date: Mon Mar 5 15:58:47 2007 -0600 Set background size. commit 4e53202a7842f7b70c98b7e9d261b6876b0795a3 Author: John Bowman Date: Mon Mar 5 03:51:51 2007 -0600 Incremented version to 1.23svn. commit e51ba11fadb17a7143209a488946b0afd8022734 Author: John Bowman Date: Mon Mar 5 03:01:16 2007 -0600 Added missing header. commit 43f28e4087ee950538d510d9a0ed3202afaad9d2 Author: John Bowman Date: Mon Mar 5 02:33:43 2007 -0600 Support legends in both forms of 3D contour drawing routines. commit 569ae970d8db7d95d58fdfce5712cf4c23316f41 Author: John Bowman Date: Mon Mar 5 02:31:49 2007 -0600 Support legends in 3D contour drawing routines. commit 2afb1187ff55ec41489dbbb1ea5ae2bbf52b2b0f Author: John Bowman Date: Mon Mar 5 01:58:37 2007 -0600 Add discussion of icomma package. commit e7dff4a2871bac88f3eca8092d03fd0d824e4ee4 Author: John Bowman Date: Mon Mar 5 01:44:32 2007 -0600 Fix format(-0.5) under locales with nonperiod decimal separator. commit 1f32d4f244925636cdc8e3a4ee7bc81e33247757 Author: John Bowman Date: Mon Mar 5 01:17:12 2007 -0600 Mention link page, including user-written Asymptote tutorial. commit 1efe402b1f06f8324bb28baef1afdb5f7ae5fe87 Author: John Bowman Date: Sun Mar 4 13:17:33 2007 -0600 Add predefined markers. commit 8cf34dbca37b1a0591cfd1ab8b25e86d3f6da30f Author: John Bowman Date: Sun Mar 4 12:18:45 2007 -0600 Minor edits. commit 00c3be6095cb906455e9add45fd09a62c2db8bc2 Author: John Bowman Date: Sun Mar 4 12:10:23 2007 -0600 Renamed markuniform(int n, frame center, bool rotated=false) to markinterval(int n=1, frame f, bool rotated=false), which now centers n copies of frame f within uniformly space intervals in arclength along the path, optionally rotated by the angle of the local tangent. commit 6d64c0e317ac554dc59ab485f397a0c35c5f3dc5 Author: John Bowman Date: Sun Mar 4 11:16:14 2007 -0600 Explicitly list intro.asy dependencies. commit 295ef5c7c5d9446ef413ab8c8fdc7c7ccc2670f8 Author: John Bowman Date: Sun Mar 4 01:59:30 2007 -0600 Updated marker documentation. commit 110dcddb82504ce175127fa710e8374fb2812c04 Author: John Bowman Date: Sun Mar 4 01:53:21 2007 -0600 Simplified/standardized markers interface. commit 80159d48f46ea3901eec293db16cae9bc4420fcc Author: John Bowman Date: Sun Mar 4 01:47:51 2007 -0600 Formatting. commit 962832601f3e9e90b6eb8c095387eb870a4a727a Author: John Bowman Date: Sun Mar 4 01:47:38 2007 -0600 Remove bibliography page numbers. Add Asymptote logo to intro.asy. Change clearpage to eject to avoid extra page. commit f8bc8a7b1fb503c436af8186535600ff17be0ec0 Author: John Bowman Date: Sun Mar 4 01:45:34 2007 -0600 Draw minor ticks below palette box. commit a6a66a28cf1e8c392535cfbd6ff6c04da4b72f03 Author: John Bowman Date: Sat Mar 3 22:08:48 2007 -0600 Add short description of slide presentation package. commit 5c84f25b91ffe0e4314f1b964874ad5c05d59d09 Author: John Bowman Date: Sat Mar 3 20:33:03 2007 -0600 Remove directory qualifier. commit 53f814b6cb83a889bdd308363c2d1f9f40872c95 Author: John Bowman Date: Sat Mar 3 20:32:42 2007 -0600 Import pdfanim. commit 737c32260dac29c8bde3515febbed216a644afb3 Author: John Bowman Date: Sat Mar 3 20:31:52 2007 -0600 Check incoming array bounds. commit 6de5f36de58ea78b64c0b8a0d37ea43eb330055a Author: John Bowman Date: Sat Mar 3 18:48:39 2007 -0600 Show page numbers on subsequent bibliography pages. commit ed62ed3343292791f5477d367afdd82e57a0b6f5 Author: John Bowman Date: Sat Mar 3 15:46:09 2007 -0600 Number last page before bibliography. commit e716a018114ce9598ff41ccbd9c0f822d8f8d802 Author: John Bowman Date: Sat Mar 3 15:45:49 2007 -0600 Revert temporary patch. commit 24b6ad1e65d8f31c070120c9d4fd58bdc6b4ca8e Author: John Bowman Date: Sat Mar 3 14:37:29 2007 -0600 Add implicit pen initializer defaultpen. commit 79440c76a089e66c9414a69e53ffa4114c6ac846 Author: John Bowman Date: Sat Mar 3 14:02:54 2007 -0600 Fix concatentation of nullpaths. commit b36b0ff2a8500b758c7eb6e74b0420fb6619d71a Author: John Bowman Date: Sat Mar 3 13:32:32 2007 -0600 Make seconds return -1 instead of 0 on failure, for consistency with UNIX mktime routine. Document workarounds for unimplemented "%Z" time zone specifier to seconds. Improve diagnostic. commit 9d009d9cd6f24e8718bb070443cfb5a5548c99aa Author: Philippe Ivaldi Date: Fri Mar 2 16:06:35 2007 -0600 Minor changes/updates. commit cef22845c934ef9ce1d3b3283a716da51cc1d105 Author: Philippe Ivaldi Date: Fri Mar 2 13:43:16 2007 -0600 Replacing the parameter 'frame markerframe=newframe' by 'marker marker=nomarker' in the routine 'markangle' of 'markers.asy'. commit 14770fb363a0e22d8567bbf2cd12e07317459579 Author: John Bowman Date: Fri Mar 2 01:16:21 2007 -0600 Don't output texpreamble in inline mode. commit 6bf22cd5c542932bcc16a4bd2eb13dc0c4924164 Author: Philippe Ivaldi Date: Thu Mar 1 16:28:33 2007 -0600 Correct typo. commit bbb56abd6df169c548416d28fbacabb496b122a8 Author: Philippe Ivaldi Date: Thu Mar 1 16:15:58 2007 -0600 Documentation of the package markers.asy. commit c51dfc0ef6f4f9a6bb4b0763a8468dbaeee081a8 Author: John Bowman Date: Thu Mar 1 10:01:41 2007 -0600 Added routines to facilitate drawing 3d contours. commit aeb93083ebf797ae7ea89fd8603fe1bc86ce8e04 Author: Philippe Ivaldi Date: Thu Mar 1 09:37:30 2007 -0600 Examples about the modules markers.asy commit 7e9811263c6e476a8319b267e2628d00c4e55aaf Author: Philippe Ivaldi Date: Thu Mar 1 09:12:30 2007 -0600 Others mark routines and markers. commit 5f357b465b01ad8453669cdd0e68cda959a2fe50 Author: John Bowman Date: Wed Feb 28 23:55:57 2007 -0600 Implemented binput and boutput functions for reading and writing in the native (nonportable) machine binary format. commit 619e0eb074bd696e477f554ad39e05a1e2abba59 Author: John Bowman Date: Wed Feb 28 18:54:28 2007 -0600 Document local installation. commit 5abac133b9a2e39f7de51b3e78d7ec2264844c79 Author: John Bowman Date: Wed Feb 28 18:29:42 2007 -0600 Fix uninitialized 'this.130' warning message from gcc 4.1.1 and 4.1.2. commit 589714ecf3020dbd8343d30e2f2b563b4cfcb2a1 Author: John Bowman Date: Wed Feb 28 14:56:44 2007 -0600 Fix bool latex() and pdf(). Remove lscape dependency and need for autorotation in slide.asy. commit a2b08e65ba2025acfd9a783b11228a7e9b9ad033 Author: John Bowman Date: Wed Feb 28 13:40:49 2007 -0600 Reactive begingroup. commit 8346e1f95f11c3bc8eddca970b98d97fc82314d5 Author: John Bowman Date: Wed Feb 28 01:35:32 2007 -0600 Fix cxx errors. commit 5a91b91d46484cabb85106964da62a8474e56124 Author: John Bowman Date: Wed Feb 28 01:28:39 2007 -0600 Remove unused configuration variable AC_HEADER_STDBOOL. commit d90520bc7ce05c294cb459fc7de59aeb7f6ff72e Author: John Bowman Date: Wed Feb 28 01:17:09 2007 -0600 Fix cxx errors. commit 00286c95eb86c6ca13b928d6e896284f4b40e090 Author: John Bowman Date: Wed Feb 28 00:58:30 2007 -0600 Move mem::list out of common.h due to ambiguities under old cxx compiler. commit 4605357c6055cf45d3dcef9ffc22abdaa3ad227f Author: John Bowman Date: Wed Feb 28 00:09:49 2007 -0600 Impose -finline-limit=400 on old (< 4.0.0) compilers to greatly speed up compilation. commit 94461d882cc2220b0a3f1cf90be4266e776efa6d Author: John Bowman Date: Tue Feb 27 21:00:26 2007 -0600 Put global name space qualifications in new common.h file. commit 09c9b3fa75c27d24b1b5c878ac4b168cefbda878 Author: John Bowman Date: Tue Feb 27 11:08:33 2007 -0600 Make tex pipe aware of a previously generated aux file. commit cb136567a0559ceb1e03cbbda415fc09730b92b8 Author: John Bowman Date: Tue Feb 27 09:58:53 2007 -0600 Fix makefile dependencies. commit cd0a6ca21f10584d53ce99755d1b1d613b8e6750 Author: Andy Hammerlindl Date: Tue Feb 27 08:42:56 2007 -0600 Fixed inTranslation to handle frames for loops. commit 3be97ec517574378d66b17fdd56fffa648f4c4b0 Author: John Bowman Date: Tue Feb 27 01:10:31 2007 -0600 Temporarily fix svn builds. commit 1b0ecce40c2506006f6cc50a02c4e627eae7f375 Author: John Bowman Date: Tue Feb 27 00:50:54 2007 -0600 Temporarily disable aux file input. commit 19cbe577536297a610ab82d0594cf319790f8f10 Author: John Bowman Date: Tue Feb 27 00:40:30 2007 -0600 Fix further memory leaks. commit e9d3303233bca786e89f4e93e350ae47bf7d745c Author: John Bowman Date: Mon Feb 26 23:10:23 2007 -0600 Fixed segmentation fault. commit 958c6cef19c04de0233b8c74f225b92622a96832 Author: John Bowman Date: Mon Feb 26 22:53:35 2007 -0600 Possible workaround for Makefile problem on Debian. commit 8d5616d89c2ee990f99f41cd77f09ae0c3033340 Author: John Bowman Date: Mon Feb 26 22:37:06 2007 -0600 Fix memory leaks by using mem::string, mem::istringstream, mem::ostringstream, and mem::stringbuf everywhere. commit c1c5d708a113372efded3d150becdaaf448939e6 Author: Andy Hammerlindl Date: Mon Feb 26 20:03:46 2007 -0600 Explained lifetime of loop variables. commit 0f5fdcb427cb50132a5fd75fcc3ea66afd6c339e Author: John Bowman Date: Mon Feb 26 18:22:21 2007 -0600 Update discussion of local variable allocation in loops. commit 8fa2bbc07e668d81994fe7c5a175785e2c846625 Author: Andy Hammerlindl Date: Mon Feb 26 10:07:53 2007 -0600 Added documentation on static qualifiers in loops. commit 24ebb6ed94fc72834fc65c5810bfb32fc86cb70d Author: Andy Hammerlindl Date: Mon Feb 26 09:41:28 2007 -0600 Removed completed TODO item. commit 1e853994a00f8f03ff38224f72c45938fc5341a6 Author: Andy Hammerlindl Date: Mon Feb 26 09:40:41 2007 -0600 Allocate variables in a loop iteration in their own frame. commit b02f3e9e89a9a238776865964130c6f59acc81b0 Author: John Bowman Date: Mon Feb 26 01:36:35 2007 -0600 Force outputformat to "pdf". commit 9774670154436e67834ffa5aa1bbc318e08e19be Author: John Bowman Date: Mon Feb 26 01:35:40 2007 -0600 Set outformat to pdf. commit aa62a61b2cfd4bbd17921f16efd87361bed9f7d4 Author: John Bowman Date: Mon Feb 26 01:34:34 2007 -0600 Remove unwanted texput.pdf file. commit 1f79220f7fabf8fa77bc793ff6496fd13f3b8ad0 Author: John Bowman Date: Sun Feb 25 12:22:00 2007 -0600 Load color package even for TeX pipe. commit 4704954e697f43814036a265aa24167a44094110 Author: John Bowman Date: Sun Feb 25 12:12:13 2007 -0600 Formatted. commit a22b8a5f2ed5c58ecb71011b002aea4bb18f6cf4 Author: John Bowman Date: Sun Feb 25 12:01:12 2007 -0600 Avoid duplicate .aux file inclusion (and duplicate labels). commit 8457c22a764d521431306d6e5f2ee35f696bfeb1 Author: John Bowman Date: Sun Feb 25 10:54:30 2007 -0600 Removed extra blank lines in tex pipe diagnostics. commit bcd456adaa56865795a56fd79e30c06035eb3906 Author: Philippe Ivaldi Date: Sun Feb 25 09:08:43 2007 -0600 Improve the function 'perpendicular' of geometry.asy. Add operator +(margin,margin) in plain_magin.asy. commit 7e615740d62fb8a03a860096dbe171a24629ad26 Author: John Bowman Date: Sun Feb 25 09:02:11 2007 -0600 Simplified bullet command. commit 39ebe210dbaf2d88b8718f2c133e67b30a3b2976 Author: John Bowman Date: Sat Feb 24 20:47:11 2007 -0600 Load correct base files. commit dd1c4f3889bcf345d3ecc51c073a943cf2e18fb3 Author: John Bowman Date: Sat Feb 24 18:23:36 2007 -0600 Simplify skeleton routine interface. commit a3bef6031cc2d11cacaa9591384e5944e34a5f22 Author: John Bowman Date: Sat Feb 24 18:15:39 2007 -0600 Split skeleton routines to provide finer control. commit 6c5626ec4b4ddfd42d290201f7380d6fced6697a Author: John Bowman Date: Sat Feb 24 10:52:09 2007 -0600 Turn off setlocale warnings when not debugging. commit eb64a46e3c5258f2ab2961806137d68432cff2f8 Author: John Bowman Date: Sat Feb 24 10:51:43 2007 -0600 Use namespace setitings. commit 0e186293fc0ef7e9f1f225a3eeb9352befef0a47 Author: Philippe Ivaldi Date: Sat Feb 24 04:52:50 2007 -0600 Correction of ps/pdf-view-command documentation. commit f04de4b85808c9ea00408d5980193a6c4131e399 Author: John Bowman Date: Thu Feb 22 14:21:01 2007 -0600 Fix hyphens and formatting in man page. commit 87be657999a27707a9f350d12af9c5bc397ffbdd Author: John Bowman Date: Thu Feb 22 14:06:48 2007 -0600 Change autorotation to true. commit 7b0e270e5d124a8461eef2e0bf16358ce23e5704 Author: John Bowman Date: Thu Feb 22 13:49:10 2007 -0600 Updated Debian binary site. commit 7250ad829c9c7ff62af5f6b7becf6e9b87f0831f Author: John Bowman Date: Thu Feb 22 01:36:59 2007 -0600 Generate more missing files. commit 2838d55fb10875f0b1e3a5507a5d56ed5a3fda01 Author: John Bowman Date: Thu Feb 22 01:34:49 2007 -0600 Autogenerate missing files. commit 89d1e10b78ece25ee7d849842c3d1b67d0d21a24 Author: John Bowman Date: Thu Feb 22 01:17:06 2007 -0600 Make eof set fail bit. commit dd617e23ff042a645799765c026d957a26174abb Author: John Bowman Date: Thu Feb 22 01:14:51 2007 -0600 Make eof set fail(). commit c8ef33f8c97613f20661d59e66e8adb203dd3298 Author: John Bowman Date: Thu Feb 22 00:45:12 2007 -0600 Removed duplicate sentence. commit 2d3e33840a04de9dfe992aa7e6918bc2123c0233 Author: John Bowman Date: Thu Feb 22 00:43:07 2007 -0600 Added introductory Asymptote slide presentation (intro.pdf). Added keepaux option to keep intermediate LaTeX aux files. Added example filegraph.asy of graphing columns of data from a file. commit 6d3d08232d56387bf8bf380dd2276e00f5dbca82 Author: John Bowman Date: Wed Feb 21 22:40:34 2007 -0600 Fix logarithmic tick labels near the machine epsilon. commit 7cb527aa0f797fac93c55361a73b681520d79b1a Author: Philippe Ivaldi Date: Wed Feb 21 11:29:15 2007 -0600 typo correction. commit a99f04bf33f835cd01e18992f017c054ecd23a65 Author: John Bowman Date: Wed Feb 21 10:56:54 2007 -0600 Remove alien to deb conversion documentation. commit 38901d8c23decbfa17f315764c8df364bed9b0d6 Author: John Bowman Date: Wed Feb 21 10:47:55 2007 -0600 Support slide bibliography under pdflatex. Add string file(string) which reads file as a string, and verbatim typesetting command. commit d55d529c634b42bbdfb154599846e194077931e4 Author: John Bowman Date: Tue Feb 20 22:52:11 2007 -0600 Added missing space. commit 0db3c87ea569656db60ae7b6c9c14c34d26a9278 Author: John Bowman Date: Tue Feb 20 00:01:03 2007 -0600 Fix typo. commit 67315f9b3532b56be11642bb4658c40bcc8d0660 Author: John Bowman Date: Mon Feb 19 23:52:40 2007 -0600 Added backgroundcolor and foregroundcolor. commit aab77966ac5949fe473ff6ba8283c013f405adbf Author: John Bowman Date: Mon Feb 19 23:51:23 2007 -0600 Implement colorspace command for extracting colorspace of pens. commit e3d25c1625df9a46f7931ca4ee11785cbfa40fef Author: John Bowman Date: Mon Feb 19 23:50:50 2007 -0600 Implement verbatim command. commit 29f7efe9c211530c3644174e85a615802390af83 Author: John Bowman Date: Mon Feb 19 10:58:21 2007 -0600 Incremented version to 1.22svn. commit 530cee38deab33c6bb6f258343780dd50f115064 Author: John Bowman Date: Mon Feb 19 10:08:21 2007 -0600 Fixed cxx warning. commit 71299d099650766e53d29a402955fe21dd802e91 Author: John Bowman Date: Mon Feb 19 09:56:20 2007 -0600 Fixed typo. commit 3d95261cbf08da1f78eeae90649f139955bf0d1f Author: John Bowman Date: Mon Feb 19 09:18:14 2007 -0600 Allow DEFCOLOR when promoting colorspaces. commit 1648096a4682a22040b6b5d25ffcfcc3ae8e9b8c Author: John Bowman Date: Mon Feb 19 01:54:23 2007 -0600 Automatically promote colors to highest colorspace in shading and image routines. Fix grayscale and cmyk latticeshading. Significantly increase speed of image processing by caching bw, gray, rgb, and cmyk settings in a global variable. commit 060ec7b110baba9ce843160f0496e3374d74bbfb Author: John Bowman Date: Mon Feb 19 01:51:41 2007 -0600 Update documentation of Linear scaling type. commit 739e7799707acc2b40df1bdde077f161e3c36212 Author: John Bowman Date: Mon Feb 19 01:50:14 2007 -0600 Check array bounds. commit 68a728cd54aa6f5a2938385a7cadaa978eb55e63 Author: John Bowman Date: Mon Feb 19 01:49:34 2007 -0600 Collect double-vertex contours. Increase epsilon. Fix contour fill routine. Separate contour fill routine from palette computation. commit 8e88b7bece6699bf201b38c3b9014c17b64a9d6a Author: John Bowman Date: Mon Feb 19 01:42:43 2007 -0600 Added Philippe's improved show-function-at-point fix. commit 3296b1030ef1efdcdf4aef9f98a9c8a146356b25 Author: John Bowman Date: Sun Feb 18 13:58:55 2007 -0600 Delete any existing *asy-help* buffer in asy-show-function-at-point. commit b077b3cc360fdd8db29b7000f313cfb06ce657be Author: John Bowman Date: Sat Feb 17 10:37:26 2007 -0600 Improve tick calculation when Step > 0. commit bc65ba3bfa7df77f6595c01157b7c17f8cba7b0c Author: John Bowman Date: Sat Feb 17 09:47:45 2007 -0600 Fix tick calculation. Improve zero detection. commit 7ad2d1586877b6f20100d015ef5eb635774a5c44 Author: John Bowman Date: Sat Feb 17 04:48:15 2007 -0600 Fix tick label scaling. commit c4c4905a39c572319effb6827fcbf9aefba011d6 Author: John Bowman Date: Fri Feb 16 22:19:34 2007 -0600 Remove vv from settings module. commit 8329e569bc7165fa1e527de6b6f7ad1373a27aa7 Author: John Bowman Date: Fri Feb 16 10:23:29 2007 -0600 Resolve -vv ambiguity. commit 09b37eb90a3ac72ce0bcb9961a15f7896d5684d8 Author: Philippe Ivaldi Date: Thu Feb 15 05:00:02 2007 -0600 Fix typo. commit 998c2fa3deac0139446767d0f9f65d274935419a Author: John Bowman Date: Thu Feb 15 00:37:14 2007 -0600 Fix spurious vertical shifting of bullets. Reimplemented figuremattpen. Make bibliography visible in reverse video. commit 9e6233395b63bbc959ffaacd6f319164db6703cf Author: John Bowman Date: Wed Feb 14 15:02:00 2007 -0600 Added --version option. commit c030c15fbca03914b0210fab3470799af5af718c Author: Philippe Ivaldi Date: Wed Feb 14 05:51:45 2007 -0600 bug fix in asy-show-function-at-point commit 9aa9f39611d0e229b6ac79942e73896168ea51e6 Author: John Bowman Date: Wed Feb 14 00:56:41 2007 -0600 Resolve ambiguity in intersectionpoints. commit bec36677558ed0cafb33667d4f0f1a6bafdd4f21 Author: John Bowman Date: Tue Feb 13 23:41:42 2007 -0600 Add rotated option to mark_uniform to rotate marker frames by angle of local tangent. commit 0c4f5d2faeaedf7d632b90520a7bb18df8434632 Author: John Bowman Date: Tue Feb 13 23:40:33 2007 -0600 Ignore empty picture bounds when adding pictures; simplify userBox and userClip. commit d0f942ed145abf11fde2fa9d8477bee8e23d06f9 Author: John Bowman Date: Tue Feb 13 16:08:01 2007 -0600 Update to latest autoconf install-sh and patch it to ignore -p option. commit 98607cc485eaeee9eb2d4c0302472ed7a1c9644e Author: John Bowman Date: Mon Feb 12 22:44:06 2007 -0600 Add an ASYMPTOTE_SITEDIR environment variable listing additional directories to use for generating asy-mode.el keywords. commit aa2f07afb124f788a8907694b27eca8d4e6b3d8d Author: John Bowman Date: Mon Feb 12 22:19:14 2007 -0600 Document new interactive calculator feature: expressions entered at the interactive prompt are automatically evaluated and written to stdout (provided a corresponding write method is defined). commit 4567f5d9838154710e983302f326abe95b76a8d7 Author: John Bowman Date: Mon Feb 12 21:47:36 2007 -0600 Add patch to fix an incorrect Boehm garbage collector prototype in the file gc6.8/include/gc.h (version 6.8). commit 22d41dda2545b641c1a2832345a92b0d391ace23 Author: John Bowman Date: Mon Feb 12 15:53:52 2007 -0600 Added texcommand to allow one to override the tex engine command name. commit 1c62d3d8c1bb514fb97eacf3b07333b80d304ce1 Author: John Bowman Date: Mon Feb 12 13:54:38 2007 -0600 Apply gc6.8 GC_INIT patch for AIX systems. Document gcc3.3.2curses.patch. commit c90f96075d63fbc599687077100c6418a7395710 Author: Philippe Ivaldi Date: Mon Feb 12 09:11:48 2007 -0600 Minor edit. commit c388257e763a4f2ae366b5d744f7779f5fa70429 Author: Philippe Ivaldi Date: Mon Feb 12 08:51:18 2007 -0600 Add brief documentation of lasy-mode, typing correction. commit 37491da9333a05505bbc8e0bbb0f78ba7fa08ddc Author: John Bowman Date: Mon Feb 12 00:04:47 2007 -0600 Fixed cxx warning message. commit fe1ac1c604b6a40966bf995547555fd2e9ec6245 Author: John Bowman Date: Sun Feb 11 23:51:14 2007 -0600 Fix compilation under -DNOHASH. commit e8fe41e5a84de4de2cc1bf3c5246afacf3cddb48 Author: John Bowman Date: Sun Feb 11 23:36:38 2007 -0600 Portability tweaks. commit 1a97f4303dd1bd63c322cb10d755d7dba573cc36 Author: John Bowman Date: Sun Feb 11 22:58:27 2007 -0600 Use more portable context patch. commit 6d0b90232ea1539b61a780bdb8e3235ea63719fe Author: John Bowman Date: Sun Feb 11 22:47:20 2007 -0600 Make patch more portable. commit 0bbc03244b2fa3a5c4793db2f3f7601617fe41e3 Author: Philippe Ivaldi Date: Sun Feb 11 20:07:13 2007 -0600 add (require 'wid-edit) commit 9c7416d268c126574b1e00969e3c49decb5a5f00 Author: Philippe Ivaldi Date: Sun Feb 11 19:55:37 2007 -0600 Links pointing to the files are added when one shows for the command at the cursor by the key binding C-c ? within asy-mode. commit 6da0c5ac38364b2038385d0dc288ea99c24caf38 Author: John Bowman Date: Sun Feb 11 15:32:47 2007 -0600 Add Andy's patch to store positions of definitions in entry class. Add a --where option to make --listvariables show where global functions and variables are declared. commit f7b7688158acd70cdfc1c3f3c32563716fa9c63c Author: Andy Hammerlindl Date: Sun Feb 11 11:32:21 2007 -0600 Fixed typo. commit 4c19d68b2e0e5fff7cf4b5b0f010aa058de60fd8 Author: Philippe Ivaldi Date: Sun Feb 11 08:42:07 2007 -0600 Allow to type when viewing compilation result within lasy-mode. commit 6d12264abfcc6c1dfa3326b9aec75c74bf113e8f Author: John Bowman Date: Sat Feb 10 22:57:26 2007 -0600 Fixed typo. commit b1e2adb3b5dc60d570cf8297cd7add44362efb7a Author: Philippe Ivaldi Date: Sat Feb 10 10:28:02 2007 -0600 Support of the options of the environment asy and better management of the errors within lasy-mode. commit bdb5876f7d51333e90292bab9acb70970a5927ea Author: John Bowman Date: Sat Feb 10 00:36:57 2007 -0600 Revert to gc6.8.tar.gz due to rpmbuild segmentation fault. commit fd4329a37e509b7f47342d4eba7e1f91c1d9d032 Author: John Bowman Date: Fri Feb 9 23:42:54 2007 -0600 Added surface operator * (transform3 t, surface s). commit abd9551f6272a590b9109fddb6c662fa7ec8cb32 Author: John Bowman Date: Fri Feb 9 23:24:08 2007 -0600 Check for out of bounds mesh size and array indices. Use size(frame) function for max(frame)-min(frame). commit 3312cca7b3d00b4902f45347fdd55dd2b0285d7b Author: John Bowman Date: Fri Feb 9 23:18:43 2007 -0600 Check for attempts to create negative-length arrays. commit 769c4d4bd69f1ff1d0d9cf18dc53161e1f40347f Author: John Bowman Date: Fri Feb 9 22:08:29 2007 -0600 Removed unused line. commit c9afe9d8c76477e6bbbb197167584b759e63ab36 Author: John Bowman Date: Fri Feb 9 20:53:22 2007 -0600 Implement an interface for drawing an arbitrary binary tree. commit fba9e659a0cf5f0d916c038ab496888da351f84e Author: John Bowman Date: Fri Feb 9 16:55:23 2007 -0600 Document GNU make requirement. commit 5f58b7ce5a7f53a42a1ae3f32f5728f8debb7a95 Author: John Bowman Date: Fri Feb 9 16:54:18 2007 -0600 Changed capitalization. commit 1ecec67510e605f657c87377ad9cfdd7dee79b2f Author: John Bowman Date: Fri Feb 9 16:46:39 2007 -0600 Ensure curses routines are declared with "C" linkage. commit dc38dd518284ac9e386a2f88cba8e179945c8dab Author: John Bowman Date: Fri Feb 9 15:57:52 2007 -0600 Work around broken curses.h files. commit b1606ac1b54a3bfeae1a50f2e857e9bf0678b236 Author: John Bowman Date: Fri Feb 9 13:37:34 2007 -0600 Renamed patch since this apparently affects both AIX and SGI systems. commit 8c0137405e6e96d01f315f3ac5b15c6764e42cb6 Author: John Bowman Date: Fri Feb 9 01:27:54 2007 -0600 Fixed bounding box computations of paths drawn with transformed pen nibs. Implemented optional labelpath interface to PSTricks pstextpath macro for drawing curved labels along paths. Updated to gc-7.0alpha7. commit bcf82b8e9feaebcb73dbc0d7068fe6ec276d8368 Author: John Bowman Date: Thu Feb 8 18:26:46 2007 -0600 Revert premature changes. commit 35040851ca57497a1dadd0536e6e7cb4e4426e30 Author: John Bowman Date: Thu Feb 8 10:48:07 2007 -0600 Added wait option that waits for all child processes to terminate (to work around emacs child-killing bug). commit 6743274ad35977ff9363d146c5558f8aa707b19a Author: John Bowman Date: Tue Feb 6 14:57:37 2007 -0600 Minor edits. commit 320742785a08abb9fb6b78db95835a2b1abbd9c6 Author: Philippe Ivaldi Date: Tue Feb 6 11:16:33 2007 -0600 Cleaning code, resolution conflict math-mode/lasy-mode, add options for compilation and management of errors. commit 2290dec816dc2a6232f21f30c9317121c7e1ef0b Author: John Bowman Date: Mon Feb 5 08:08:03 2007 -0600 Added patch for old broken gcc3.3.2 curses.h file under AIX. commit 4042666bd1a4988a825ec1849c5677cc230e363b Author: John Bowman Date: Sun Feb 4 19:26:12 2007 -0600 Optimize intersectionpoints. commit 5502059281016c7de55403e44f99d89fe231b2d4 Author: John Bowman Date: Sun Feb 4 19:08:11 2007 -0600 Added routine intersectionpoints(path p, path q) that returns an array of all intersection points of paths p and q. commit 460e2d1f6182b2d97242490eb2adda04a425eb9d Author: John Bowman Date: Sun Feb 4 18:50:53 2007 -0600 Fill squares. commit bb2c743ee8d20e0e30b52670c48b7d18f1dffe10 Author: John Bowman Date: Sun Feb 4 11:21:53 2007 -0600 New items. commit a8f23e8c889e9f1893512712626af44609567d61 Author: John Bowman Date: Sat Feb 3 22:48:07 2007 -0600 Make the user-specified tick functions work consistently with the auto-generated tick routines; the actual tick value is now passed to the ticklabel formatting routine, even in the case of logarithmic axes. Separate the tick generation and drawing routines and add a tickmodifier routine to give users complete control over which of the auto-generated ticks actually get drawn. commit 5622457a7f048fad5382ff935ee48c1226537a5d Author: John Bowman Date: Sat Feb 3 16:38:42 2007 -0600 Add bibliography example to slidedemo. commit 0b89cd153c13bde0ce630345f1e701104bf7570f Author: John Bowman Date: Sat Feb 3 12:48:57 2007 -0600 Add fuzz to textwidth and textheight to avoid overfull vbox. commit ddc5436324f83a005af69b9cd3da9168d293accc Author: John Bowman Date: Sat Feb 3 03:33:38 2007 -0600 Implement slide presentation BibTeX citations and reference list. commit ed82d85f4cc623545ffa56b84960140f180b9eca Author: John Bowman Date: Thu Feb 1 00:41:43 2007 -0600 Set autorotate in PDF landscape mode, rather than forcing pdflatex. commit e0a2cfc3e4f1f843e0b091251262dacc535a80db Author: John Bowman Date: Tue Jan 30 11:35:17 2007 -0600 Leave the pair to angle conversion to dirSpec. commit d0bf991ec29c0f64e674144ad712c71035f377c2 Author: John Bowman Date: Tue Jan 30 03:12:58 2007 -0600 Document skeleton structure. commit a5dbc91b7d38d4a00fd3ac8058d3791295a2f68f Author: John Bowman Date: Tue Jan 30 02:59:34 2007 -0600 Mention Imagemagick dependency in Windows installation notes. commit 9cfcdfd2373f4cecdfc0e14c3094ec2676eca8ac Author: John Bowman Date: Sun Jan 28 20:00:41 2007 -0600 Added Tobias' binary tree module. commit af67f65d329659d8f09f72ddc6e4a0c86bfabbc5 Author: John Bowman Date: Sun Jan 28 15:51:04 2007 -0600 Added Philippe's grid3 contribution for drawing 3D grids. commit 2183fd2b95de35f28ae290475098b348c7393f8c Author: John Bowman Date: Sun Jan 28 12:59:14 2007 -0600 CYGWIN updates. commit bff9813318d27712c88d95b3644c6cbbb3422e91 Author: John Bowman Date: Sun Jan 28 11:29:02 2007 -0600 Make definition of pair I=(0,1) explicit. commit 0676c7ca4c969ea1e5c2a00715bc927e404be527 Author: John Bowman Date: Sat Jan 20 15:15:16 2007 -0600 In inline latex usage, do not scale picture by default. Use \begin{asy}[\the\linewidth] to recover previous default of scaling to line width. commit e1c6822967164b7f84ef8138731f643beea685af Author: John Bowman Date: Thu Jan 18 23:28:21 2007 -0600 Implement transparency for shading and image objects. Allow one to disable Gouraud shading when nsub=1. Allow draw(nullpath3..cycle3). commit 8e6c49af4cc0152189c19102b6af9450b2e38f8f Author: John Bowman Date: Thu Jan 18 04:44:16 2007 -0600 Minor improvements. commit 21d936a6f39423cd9dad1306b64ae505f81b691d Author: Andy Hammerlindl Date: Tue Jan 16 22:00:37 2007 -0600 Automatically write expression statements at the prompt. commit a3ed3d9f8f860be6b58e55aed37301b20834e28f Author: John Bowman Date: Wed Jan 10 18:39:03 2007 -0600 Added missing tickmin and tickmax bounds. commit fe6f7fa300b309fc6a9efac47edb7b58fc227b3a Author: John Bowman Date: Fri Jan 5 15:27:17 2007 -0600 Removed unused code. commit 942c58e014617c5aa10f371666aff13cd62ea820 Author: John Bowman Date: Thu Dec 28 23:56:30 2006 -0600 Incremented version to 1.21svn. commit e93e77fbf5760e54dac1e34a272eaf8e68995cfc Author: John Bowman Date: Thu Dec 28 23:16:22 2006 -0600 Fixed cxx warnings. commit b149b00628a00c8997c83ba17028123f6706ea9f Author: John Bowman Date: Thu Dec 28 22:42:55 2006 -0600 Cleaned up cd diagnostics. commit 0484808a98b46807b50a356938d768156571144f Author: John Bowman Date: Thu Dec 28 22:22:32 2006 -0600 Simplified example. commit f948d9fd2a2e58af5ea2777d795a846efe28e5fc Author: John Bowman Date: Thu Dec 28 22:19:01 2006 -0600 Fixed incorrect offset in palette. Added routine to fill cyclic contours and example. commit fd3d40f61129392f0a95b2ef983b2ec0d30bb6fc Author: John Bowman Date: Thu Dec 28 11:01:47 2006 -0600 Added command-line option to set current directory. commit 57e3dc524f51a3e99872048372017ec97d5c2c15 Author: John Bowman Date: Thu Dec 28 09:55:13 2006 -0600 Generalized example. commit d93a8963d04f5dee344fab4a80d77cb53fbdf75e Author: John Bowman Date: Mon Dec 25 07:15:20 2006 -0600 Updated FAQ. commit e9d78222d9e0718942fb4a68728c73302063e395 Author: John Bowman Date: Mon Dec 25 06:31:43 2006 -0600 Clean up Getenv code. commit fc08f980d32c8ac4ce0ade1571a0542b81a5f417 Author: John Bowman Date: Sat Dec 23 16:51:41 2006 -0600 Fixed texpath and diagnostics under MSWINDOWS. commit 3c0eecc0ed831ffe777369bb4bb091cb94220fe1 Author: John Bowman Date: Sun Dec 17 10:45:04 2006 -0600 Remove texmathp stuff since this duplicates features in >= AUCTeX 11.82. commit feb9da7b8257ef209e3278b2f87b41c59ec2cd52 Author: John Bowman Date: Sat Dec 16 15:44:50 2006 -0600 Make asy-mode respect TeX-electric-sub-and-superscript. commit 0082575ea324c018b1ab5f74db63c9e02b38c9cb Author: John Bowman Date: Thu Dec 14 11:42:16 2006 -0600 Improve loading/including diagnostics. commit 50ac54c6ef5594ab8f8773f6d12a153c7dadc0cd Author: John Bowman Date: Thu Dec 14 10:54:15 2006 -0600 Fixed defaulttransform (e.g. to allow forcing of yaxis label angle). commit a56b9a2c982ddee6627d3b8d547acd4583504096 Author: John Bowman Date: Thu Dec 14 02:32:35 2006 -0600 Optimize real argument point, postcontrol, and precontrol functions. commit d975c6f1f6fd2bcd4c5ae71a892eddb4725763c2 Author: John Bowman Date: Wed Dec 13 16:16:24 2006 -0600 Simplify example. commit 5fe5f889e7f3b60d28f743938f0078a60e51ea2e Author: John Bowman Date: Wed Dec 13 13:06:37 2006 -0600 Improve discussion of Bezier curve subdivision. commit 77e618b22206cc463b4b992cf06214c04b53553b Author: John Bowman Date: Wed Dec 13 02:36:09 2006 -0600 Slow down wheel animation. commit aac2e48a515a1eaacdb8002f8c7653dfd3eb1f24 Author: John Bowman Date: Wed Dec 13 01:18:33 2006 -0600 Incremented version to 1.20svn. commit d7890f4c911721a8888a48dfd2defa9ca322f726 Author: John Bowman Date: Tue Dec 12 19:11:44 2006 -0600 Emphasize that multiline mode is a setting that can be turned on and off within interactive mode. commit 2ae5f0146df9bdb5253ccb392bf56bf20e8e72f5 Author: John Bowman Date: Tue Dec 12 17:17:30 2006 -0600 Minor documentation updates. commit ba0d38fb3bc7f70abafe5f7567177d8d0dc71c20 Author: John Bowman Date: Tue Dec 12 13:01:14 2006 -0600 Make cd() reset path to program startup value. commit 799f9abedc6066e2ffa5d2ef160309808e6ed55e Author: John Bowman Date: Tue Dec 12 12:47:29 2006 -0600 Updated documentation; fixed cd argument renaming. commit 592297a5493a9988cdf9333e37694e731d1e119f Author: John Bowman Date: Tue Dec 12 12:17:43 2006 -0600 Interactive reset should not reset current path. commit 6a918d048a7eb6fb6cc5dc0951c4541de2f04ad0 Author: John Bowman Date: Tue Dec 12 04:05:00 2006 -0600 Shift cylinder so that axis is c--c+h*unit(axis) for consistency with cone and generalized cylinder routine. This change is backwards incompatible. commit 4d3f02e34615f1b18b2e14d065ea5fd392e4cb51 Author: John Bowman Date: Tue Dec 12 03:29:45 2006 -0600 Updated svn instructions. commit 4b2793891d4bde829ede86a2cb802f6fab97b823 Author: John Bowman Date: Tue Dec 12 03:25:22 2006 -0600 Implemented preliminary Bezier surface package. commit 3cbdc8e412cfecab2c25378692dd8bb743c7a461 Author: John Bowman Date: Tue Dec 12 03:09:10 2006 -0600 Require Common Lisp extensions. commit 0be9332591649e2d31655440295b9a4f9d2b3d53 Author: Andy Hammerlindl Date: Fri Dec 8 19:59:58 2006 -0600 Added support for meaningless slashes at ends of lines. commit 75f727b5e8009f1735d22e30d67e25de44e2abd1 Author: John Bowman Date: Fri Dec 8 12:06:02 2006 -0600 Fixed cxx errors. commit 3a3c973590cdc283b9999a06b1a861371ef75550 Author: John Bowman Date: Fri Dec 8 11:12:41 2006 -0600 Andy's port to nonbash shells. commit d04d9e3e929fd00402740e1c2ce40b746da9581b Author: John Bowman Date: Fri Dec 8 03:02:12 2006 -0600 Fix epstopdf conversion of empty or tiny files. commit 087e28c569c90006b21984f3beb45766c1a9778a Author: John Bowman Date: Fri Dec 8 02:46:52 2006 -0600 Improve tex error handling. commit 77bb38ecd311f9df362cde2a070d64bdbb914399 Author: John Bowman Date: Fri Dec 8 02:05:47 2006 -0600 Fix clipping in inline tex mode. commit 082f53960ca57b5dd2624d0362db130cb4742f0f Author: John Bowman Date: Fri Dec 8 01:49:43 2006 -0600 Fixed clipping. commit 1147cc2d94edfd43f5c3a74989558c4bf7be4b24 Author: John Bowman Date: Thu Dec 7 22:41:18 2006 -0600 Fixed inlinetex mode. commit 2482b4e78091adfe4bb41c0346e37dbbd41f2067 Author: John Bowman Date: Wed Dec 6 23:45:16 2006 -0600 Repair tex pipe on missing math mode error. commit 359e08078ca660615441f4bbda493f07ed54aa71 Author: John Bowman Date: Tue Dec 5 15:13:45 2006 -0600 Use path instead of a guide. commit 3f35adc02e203e38bcaf0c1eb809e7da2467c8d8 Author: John Bowman Date: Tue Dec 5 15:13:19 2006 -0600 Remove explicit internal control points. commit 62992e7115c828486cacdd129b501c5280c4edfd Author: John Bowman Date: Tue Dec 5 15:12:37 2006 -0600 Remove bashism. commit 31d267c642b285b910c10ac7c7d36270642bbc6b Author: John Bowman Date: Mon Dec 4 12:38:44 2006 -0600 Standardize flowchart argument names. commit edf855ad0f9cc5b443dd2a2537ade28fad528a88 Author: John Bowman Date: Mon Dec 4 01:37:40 2006 -0600 Simplify flowchart block size calculation. commit eca530722546fb201f7e2c36087668e55ff06f45 Author: John Bowman Date: Mon Dec 4 01:18:33 2006 -0600 Make flowchart routines work with pictures as well as frames. commit e280d4eb846978b79faf2c13072bd8fa42d997e0 Author: Andy Hammerlindl Date: Sun Dec 3 22:57:16 2006 -0600 Added note on backslashes. commit 358cf9043de1378c8c18230b8e4da0d09a1670e7 Author: John Bowman Date: Sun Dec 3 11:46:53 2006 -0600 Renamed object constructor to draw. commit 3521ace7c8d3588a26cc4180731e53a6e14d116e Author: John Bowman Date: Sun Dec 3 11:33:49 2006 -0600 Implement add(picture pic=currentpicture, drawer d); commit 335405299efca708634efa1a8914e849e84f3ade Author: John Bowman Date: Sun Dec 3 10:56:26 2006 -0600 Replace labelframe by existing object structure. commit be667c03682ade8d1a1f4ac5a29d6694c89c1870 Author: John Bowman Date: Sun Dec 3 00:00:26 2006 -0600 Renamed envelope to labelframe and container to envelope. commit 971e339c2404266220d1aa2b3a47937c044b3787 Author: John Bowman Date: Sat Dec 2 23:19:41 2006 -0600 Introduce an envelope structure for supporting picture scaling when drawing boxes around labels. commit 9c6ec1a60ea1fc573b5350b58f2dc771db941c88 Author: John Bowman Date: Sat Dec 2 23:17:56 2006 -0600 Updated to use new intersect routine. commit 1e1903f2ace7734b5f68aab18749129b45caf318 Author: John Bowman Date: Sat Dec 2 23:13:45 2006 -0600 Added fractral tree example. commit d4f5146c773422f65b7a7a652f1723eeb6301f69 Author: John Bowman Date: Sat Dec 2 17:25:09 2006 -0600 Make intersect return an array of reals rather than a pair. In addition to being more logical, this helps avoid confusion between intersect and pair intersectionpoint(). Autogenerate usage info in manual and man page. commit 8f2688c4e68120ff8ed18a41bd28858d1ae9f1b8 Author: Andy Hammerlindl Date: Fri Dec 1 23:10:09 2006 -0600 Backslash now continues a line on the interactive prompt. commit 0a4d35d81ba0ee6578c3d585c823762edc107297 Author: John Bowman Date: Fri Dec 1 21:52:09 2006 -0600 Minor diagnostic improvements. commit 80e67f1986502df4ff6f2bab7374dc220e7d4ccf Author: John Bowman Date: Fri Dec 1 18:33:22 2006 -0600 Fixed compilation failure without GC_DEBUG. commit fc53ce97a16a28720671a41425923a5473a6ff30 Author: Andy Hammerlindl Date: Fri Dec 1 10:08:14 2006 -0600 Added gc debug option. commit f3afd793ab03d434687d893ae74f234cfb177a3a Author: John Bowman Date: Fri Dec 1 09:44:32 2006 -0600 Remove shift from transform in Rotate(pair). commit c6c6cfee767553835b1806317af54d3f63e9be22 Author: Andy Hammerlindl Date: Thu Nov 30 22:52:19 2006 -0600 Added multiline option for prompt. commit a9e4ee9ae1e6867146b34bc45e632947cf85d892 Author: John Bowman Date: Thu Nov 30 09:54:39 2006 -0600 Renamed pdfanim.sty to pdfanim_temp.sty pending 0.53 release of official pdfanim version. Delete temporary image and multipage PDF files used for animations. commit 12f49ce5083e96e35689cc79586b760be46003b2 Author: John Bowman Date: Wed Nov 29 14:36:09 2006 -0600 Added Rotate(pair), fixed alignment positioning transformation. commit 97ce9f2b9fa5bc72ec0ba3e68adb036f88d355de Author: John Bowman Date: Wed Nov 29 14:04:47 2006 -0600 Changed pdfanim version to 0.52A. commit 3c187c1c591152b6416a8646513c1251e61cf454 Author: John Bowman Date: Wed Nov 29 13:00:23 2006 -0600 Split slidedemo.asy into slidedemo.asy and slidemovie.asy. Minor diagnostic and documentation tweaks. commit bb418bf9a852bbf921008ecc37e365a430d97206 Author: John Bowman Date: Wed Nov 29 12:22:35 2006 -0600 Move settings.tex="pdflatex" earlier. commit 298720bfde77c8498325f0f26063be936e039838 Author: John Bowman Date: Wed Nov 29 00:15:49 2006 -0600 Added embedded U3D example. commit d86d918fda1ce14fdbddcca9af50940b3ba2525e Author: John Bowman Date: Tue Nov 28 19:08:46 2006 -0600 Support portable high-quality embedded PDF movies via pdfanim module and portable external movies of other formats via external module. Included enhanced version 0.53 of pdfanim.sty package, with updated documentation. Abort pfdlatex runs with fatal errors and display error. Add optional bounds arguments to verbatim postscript and tex commands. Document how to produce Debian binaries from RPM binaries. Fixed rescaling bug. Allow writing to local directory only; added -global option to override. commit 9c4660b474c5449f69b76cd33ddfec1987469986 Author: Andy Hammerlindl Date: Sun Nov 26 22:50:21 2006 -0600 Free some of the cached data in the abstract syntax tree. commit 0f42d93dbc82bf23f6dec8adc37f7c9e8cad9184 Author: Andy Hammerlindl Date: Sat Nov 25 16:32:18 2006 -0600 Added collapseScope, so empty scopes won't pile up in runnable-at-a-time mode. commit 58ce427f069a2da3eda7d104e7197c02c632b14c Author: John Bowman Date: Fri Nov 17 17:12:36 2006 -0600 Turn off scrolling during debugging. Fixed typo in debugging help. commit 03c6c6068fb90f61624a088a642e484dc0b627b5 Author: John Bowman Date: Fri Nov 17 01:22:16 2006 -0600 Added routine to return an arbitrary point inside a cyclic path g. commit 43c9f351fe406736b2dc2a275ba0283515dc1879 Author: John Bowman Date: Fri Nov 17 01:20:18 2006 -0600 Guard against duplicate nodes in inside(). Speed up inside() by testing for points outside of bounding box. commit 9a327866d951c4b3f6248280a8119c1d222a8034 Author: John Bowman Date: Thu Nov 16 23:24:45 2006 -0600 Fix numerical precision problem in windingnumber routine. commit 577f48d25e9fea4dfb08ba83090d27c753e9af5b Author: Andy Hammerlindl Date: Thu Nov 16 22:14:42 2006 -0600 Reformatted long lines in the code. commit 9a861bce4f1182b5edb00f6b02ae8423cb691b77 Author: Andy Hammerlindl Date: Thu Nov 16 22:03:17 2006 -0600 More string constant formatting. commit fcd109e8c508fb3712e9aa1c3db1e367751466de Author: Andy Hammerlindl Date: Thu Nov 16 21:56:40 2006 -0600 Split string constant to fit on line. (minor) commit 05beb5f4b1648263f022cbdeed9ccf0d5ea690c7 Author: John Bowman Date: Wed Nov 15 18:57:34 2006 -0600 Added string(real x) function. Removed unneeded public qualifiers from documentation. commit 25b8efc835806e797cf729f6717660d0eceef63c Author: John Bowman Date: Wed Nov 15 18:49:19 2006 -0600 Changed == to standard bash = syntax. commit 99174e500e9367159d46911880e6da68aea1f4ca Author: John Bowman Date: Tue Nov 14 23:27:47 2006 -0600 Make winding number of a cyclic path relative to a point visible to users. commit 191093341f48d051baa6b887efa08857594c2049 Author: John Bowman Date: Tue Nov 14 15:40:00 2006 -0600 Added example of cropping to axis limits. commit e778954d5ea29b8874d5b9ac044fd45cf960bfc6 Author: John Bowman Date: Tue Nov 14 15:37:16 2006 -0600 Minor updates. commit 0a71ee69bef119a3aadfe109cc6c8a1d2eb926cc Author: John Bowman Date: Mon Nov 13 23:13:33 2006 -0600 Fixed recently introduced bugs with -o option. commit c87a8031cce6434635653de174e7f959935dec30 Author: John Bowman Date: Mon Nov 13 20:52:15 2006 -0600 Updated examples. commit ee574752f72c6fb17f744fbb2ac2edc47c8af7cd Author: John Bowman Date: Mon Nov 13 20:43:46 2006 -0600 Replace unitsize, xunitsize, and yunitsize arguments of shipout with a independent call to void unitsize(picture pic=currentpicture, real x, real y=x); commit 340f011002f0a7f4e0e047cfecb490702b64db4a Author: John Bowman Date: Mon Nov 13 09:55:17 2006 -0600 Remove unused line. commit bfd594bbf7d80571c8424ad7c2e1267bc339b460 Author: John Bowman Date: Mon Nov 13 09:50:58 2006 -0600 Minor adjustment. commit 728ecea8357736c47a6be76c1c650a9c8dd71c81 Author: John Bowman Date: Mon Nov 13 09:46:54 2006 -0600 Make clipping set truesize coordinate to 0; updated CDlabel to illustrate this fix. commit d851b730623e8c9609470b9e1b93cc4a21ba315c Author: John Bowman Date: Mon Nov 13 09:26:24 2006 -0600 Added umlauts again. commit 151849131a0265f5bcfcb3b1020815fda5ef5589 Author: John Bowman Date: Sun Nov 12 10:45:34 2006 -0600 Minor updates. commit b23fd6682b0e0cf7552d28f9a5ac963b82d988c9 Author: John Bowman Date: Sat Nov 11 23:03:27 2006 -0600 Automatically set the movie bounding box to the largest bounding box of all pictures. Support unitsize, xunitsize, and yunitsize in animations. commit 86e70cd693dca95e361478a3af2e24f77f19a1d3 Author: John Bowman Date: Thu Nov 9 16:00:00 2006 -0600 Update documentation. commit 8c31c2fe98deb2a907d4e00578325db7ea99ca95 Author: John Bowman Date: Thu Nov 9 15:59:31 2006 -0600 Fixed segmentation fault. Add default argument to tensorshade signature. commit 637ed2e58e15704b3d18c5061836405b7c0f2b7a Author: John Bowman Date: Wed Nov 8 23:10:20 2006 -0600 Make seconds() portable (e.g. under CYGWIN). commit 40de37c31ba1bcdce09a59c24a699277cbf1eb1b Author: John Bowman Date: Tue Nov 7 16:51:09 2006 -0600 Minor updates. commit 63259c12dda630e7f03f52e7a4799686245e5765 Author: John Bowman Date: Tue Nov 7 16:27:16 2006 -0600 Overload postRun in iprompt. commit d2e5f03234fae526e4f972b968b200ab536eefac Author: Andy Hammerlindl Date: Tue Nov 7 11:48:58 2006 -0600 Changed a code example to use a variable inside the loop. commit fd27e593c4e00143e9ce10b986e9c339ff727998 Author: John Bowman Date: Tue Nov 7 00:13:11 2006 -0600 Implemented tensor and Coons shading. commit 9b5229cfe22e5deada90a0f3529a4e260e456229 Author: John Bowman Date: Sun Nov 5 03:26:36 2006 -0600 Incremented version to 1.19svn. commit d2680ea19de263f890f1ae59c742f80b48183197 Author: John Bowman Date: Sun Nov 5 01:24:17 2006 -0600 Added example showing interaction of fixed-sized and scaled coordinates. commit 78b54400036a821a936a6554585c98785f9d06f8 Author: John Bowman Date: Sun Nov 5 00:39:41 2006 -0600 Updated FAQ to include discussion of static variable allocation. commit 3838b48d09666a9cd61f3d51c517d3231d65fa2d Author: John Bowman Date: Sat Nov 4 23:38:10 2006 -0600 Make labelx, labely, xtick, and ytick respect graph (e.g. logarithmic) scaling. commit 520a1993a10d6d737022a452ec7f4c566b92fe10 Author: John Bowman Date: Sat Nov 4 18:46:14 2006 -0600 Updated FAQ and documentation. commit 5565a9fca26af7fc9b6c1106e43181a64bcdb454 Author: John Bowman Date: Sat Nov 4 12:49:12 2006 -0600 Treat single reads just like array reads: in line mode, move position past any final eol. commit 26bfa9df7c61d8d2d9540322ed01d6fd65fd30a1 Author: John Bowman Date: Sat Nov 4 02:09:14 2006 -0600 Make bool pdf() and bool latex() visible at asy level. Add string nativeformat(). Update asycolors to remove pstricks dependency. Make slide package work with both latex and pdflatex; remove colordvi dependency. Check for latex mode in usepackage and minilatex. commit d5017510aea05674eb765398f28fb8383bacf077 Author: John Bowman Date: Fri Nov 3 23:25:12 2006 -0600 Fixed clipping (UnFill) problem by avoiding LaTeX \put. commit fef3da8755ee1763e41fb4fe766bcfbbacfb0a6e Author: John Bowman Date: Fri Nov 3 22:55:27 2006 -0600 Fixed pen caching problem. commit 4c522975795e85f99af44f46dc33f651ce3b426c Author: Chris Savage Date: Fri Nov 3 17:14:45 2006 -0600 Updated palette documentation. commit 1dc32fd58eb9f250e9dc463f74e680425685fbb8 Author: John Bowman Date: Fri Nov 3 09:51:19 2006 -0600 Cache a separate copy of pen for tex mode. commit 93b89ea4b2ac84828116cc56a4b2326a82bff2be Author: John Bowman Date: Fri Nov 3 01:59:03 2006 -0600 Fix max(empty array) error message. Implement minbound and maxbound also for arrays of pairs and triples. commit 7210c8cbc06185017b72936fa3ad5bddf0674114 Author: John Bowman Date: Fri Nov 3 01:54:56 2006 -0600 Check for an existing viewer associated with the given outname. commit ae0d6a38b6235e3d12fe8bd22e2a34676851badf Author: John Bowman Date: Fri Nov 3 01:14:25 2006 -0600 Call cleanup, not exitFunction in interactive postRun. Don't tamper with interactive flag: if exitFunction fails, interactive will not get reset and cleanup will not get called at all. commit b40b33ad1de071e35559f1581383bb09878566fa Author: John Bowman Date: Thu Nov 2 20:32:30 2006 -0600 Use bin centers for point array. commit 0f4f5380e1990b0af1dce9b43d63786e80a4177d Author: John Bowman Date: Thu Nov 2 11:43:32 2006 -0600 Added image histogram and contour example. commit da264a977c66ffa098e8dd654cf52724ac8b49ea Author: John Bowman Date: Thu Nov 2 11:08:39 2006 -0600 Fixed drawing of mesh only. commit 7e68cc36102092161c1466d988c3991025d4c7d9 Author: John Bowman Date: Thu Nov 2 11:03:21 2006 -0600 Check for division by zero in scale. commit 8732a8a108ecab5246bbefc18164ba9d77e39dd2 Author: John Bowman Date: Tue Oct 31 02:31:16 2006 -0600 Incremented version to 1.18svn. commit 546eb10956ca560a2342071cf9e02e86e65cb32a Author: John Bowman Date: Tue Oct 31 01:18:54 2006 -0600 Work around garbage collection bus error on MacOS X. Call GC_Init during static initialization. commit 0e39bad178b3d4241d00d5ea2d71ca76f53b3d72 Author: John Bowman Date: Mon Oct 30 13:22:37 2006 -0600 Added a uniform histogram routine. commit c8ec46631eb319c5f3968c94672f85ff39ab42c2 Author: John Bowman Date: Mon Oct 30 12:41:38 2006 -0600 Reverse order of arguments of nonuniform frequency routines for consistency with other uniform frequency routines and image and graph routines. This change is backwards incompatible. commit 1f9e001b45b26919731bba7e3669b7360dbf5de6 Author: John Bowman Date: Sat Oct 28 19:37:26 2006 -0600 Reduce number of mem::string/std::string conversions. commit 4dedf096d6c403fd4b8e64bef059a4fa8c6907ae Author: Chris Savage Date: Fri Oct 27 14:38:42 2006 -0600 Added 1d/2d frequency routines optimized for regular bin sizes. commit 4d258b71d8cc27a5a144a1d7cd587757f157a9c4 Author: John Bowman Date: Fri Oct 27 14:13:39 2006 -0600 Updated FAQ. commit d261c7748eb5a5d30fca3427f71ba6868ad8d82b Author: John Bowman Date: Thu Oct 26 22:27:54 2006 -0600 Improve optimization of 2d frequency routine. commit a315decc03c56ab1d40d2cbb7673980a91c3a918 Author: John Bowman Date: Thu Oct 26 22:13:46 2006 -0600 Declare fixed-sized arrays. commit c5ee060643af0e74301b06ba71f13554f8c68696 Author: John Bowman Date: Thu Oct 26 22:07:18 2006 -0600 Optimized 2d frequency routine. commit 01b0e16a50c45d973102d0a11dfc50ac024ec2d0 Author: John Bowman Date: Wed Oct 25 01:41:55 2006 -0600 Incremented version to 1.17svn. commit f956a35f74398fa0cd234bae657ac7adc92e75f5 Author: John Bowman Date: Wed Oct 25 00:26:11 2006 -0600 Removed page break. commit 358ec2ccaa552bfc4b81bfaefbd015fcad889139 Author: John Bowman Date: Tue Oct 24 23:50:16 2006 -0600 Use pic.scaling in graph.asy. commit 8cd5d1299e29c188a71c373056ddd1d458c7f837 Author: John Bowman Date: Tue Oct 24 23:43:12 2006 -0600 Move using std::string out of header file; pass references to strings. commit 382463c6c5de19741ac199085d96663020cc92b1 Author: John Bowman Date: Tue Oct 24 23:34:58 2006 -0600 Fixed memory leak. commit 3cd61be2f81b5c71ae39ef9e4f2df6fe8975ce29 Author: John Bowman Date: Tue Oct 24 21:50:49 2006 -0600 Updated credits. commit 202b9564ec5af67e301c2ac847e0cd656d511b3c Author: John Bowman Date: Tue Oct 24 21:50:33 2006 -0600 Added 2d version of frequency binning routine. commit d18d193d55d3141e606378bce7a1e6308f9efb58 Author: John Bowman Date: Tue Oct 24 11:28:01 2006 -0600 Added modified version of Mark Henning's multi-line legend routine. Added legend example. Renamed truepoint to framepoint; added truepoint function which works like point but accounts for fixed-sized objects. picture.calculateTransform now returns the actual transform used for fitting in the case where only an approximate picture size was available. commit dd29994627aaa793bc99f5af386829077a581d07 Author: John Bowman Date: Mon Oct 23 12:31:55 2006 -0600 Changed ARCH to i386 since that is the only case that currently applies. commit 267e1456b08c492a1a3b95281e43a93461fe5a90 Author: John Bowman Date: Mon Oct 23 12:30:33 2006 -0600 Fixed \usepackage[inline]{asymptote}. commit ba458755cab79370ecee05ae4b88c57ec0d13f66 Author: John Bowman Date: Sun Oct 22 00:58:10 2006 -0600 Run latex 3 times on CAD. commit 23a246d3f41f6f8d90b4ad09c7c5ec1edc1de08a Author: John Bowman Date: Sun Oct 22 00:50:57 2006 -0600 Remove temporary CAD files. commit 0195e474c857a61ffbe9e31c247bacf085f77abd Author: John Bowman Date: Sun Oct 22 00:41:51 2006 -0600 Incremented version to 1.16svn. commit eb2267f0bde79c1643a9a497dcbc56399255c3c3 Author: John Bowman Date: Sat Oct 21 22:46:25 2006 -0600 Added Mark Henning's 2D CAD package (DIN 15). commit 86a9f3375abfc36e8c22d5a04afd1423254f2529 Author: John Bowman Date: Sat Oct 21 22:23:26 2006 -0600 Document restriction of annotations to tex and latex tex engines. commit e98c80f3bf13c68bc6961276ee095d36eed13c1f Author: John Bowman Date: Sat Oct 21 22:20:13 2006 -0600 Make graphics labels work with tex and pdftex engines. commit e65635f731928541bf1644d4b14ca73abc9e1767 Author: John Bowman Date: Sat Oct 21 21:00:37 2006 -0600 Added CDlabel example to illustrate clipping of graphics. Changed overfull slide error to warning. commit 0f1af03ee09bb4456504740171ef4c5a87af8cf7 Author: John Bowman Date: Sat Oct 21 18:00:29 2006 -0600 Remove temporary pdf files. commit 385df746ac2083154dfcb7fd12690b7d7a0831b3 Author: John Bowman Date: Sat Oct 21 14:24:39 2006 -0600 Fixed cube animation. commit 41a628f6da76a87c739f60ddb86414d0c1bbb62e Author: John Bowman Date: Sat Oct 21 00:17:26 2006 -0600 Force unitlength=1pt in inline tex mode. commit a68585163e3c8e53b0b2134b5029180a094a5eb4 Author: John Bowman Date: Sat Oct 21 00:00:53 2006 -0600 Added further determinant of singular matrix tests. commit 3c8ee5ecb928474319193fa3b55fdbb1a9d3a034 Author: John Bowman Date: Fri Oct 20 23:54:40 2006 -0600 Determinant of a singular matrix should return 0, not an error. commit 041322e8e38d3505b9b103b5659577b8a4256ca1 Author: John Bowman Date: Thu Oct 19 23:56:09 2006 -0600 Use LaTeX color package for latex and pdflatex to keep latex informed of current color. commit e78af7bae702d25262fc2b9156bed250e750d88e Author: John Bowman Date: Thu Oct 19 23:54:14 2006 -0600 Fixed label fuzz. commit d840b87cb8545bf129228c7281157cc84a14ca38 Author: John Bowman Date: Mon Oct 16 17:01:07 2006 -0600 Fixed incorrect path bounds in lattice shade. commit 2c376089985ff5965311e5e5faa7e826d94ba081 Author: John Bowman Date: Mon Oct 16 13:07:45 2006 -0600 Fixed typo. commit 2ffe53fe675079562255b7a0c36b9383c49771c4 Author: John Bowman Date: Mon Oct 16 07:52:33 2006 -0600 Another attempt at fixing compilation problem under MacOS X 10.3.9 (cf. 1.00-1). commit bd66d25af0ec692695d71970e6f59e01b05ee9f2 Author: John Bowman Date: Sun Oct 15 19:40:33 2006 -0600 Fixed compilation problem under MacOS X 10.3.9. Rename configuation variable latex to texpath in documentation. commit 84f6f43b5f6e106c5c8feed712828f2acd74ab50 Author: John Bowman Date: Sun Oct 15 17:00:58 2006 -0600 In cases like 2D graphs where only an approximate picture size estimate is available, adjust the transform so that the fitted frame meets the size specification. The pic.scale() routine (which scales the resulting frame, including fonts and true size objects) can enforce even better compliance in such cases, but should not normally be required. commit 3b07181bd01679b319489beb9f0881ab62ab4e5d Author: John Bowman Date: Sat Oct 14 23:16:14 2006 -0600 Minor clarification. commit 6aafdea6991f4210b613af985ea3e71ceb239dca Author: John Bowman Date: Sat Oct 14 22:42:12 2006 -0600 Remove gv patches since these are all in the long-awaited gv-3.6.2 release. commit 78885a7129643cfa720be9c0e54fe84767164cbc Author: John Bowman Date: Sat Oct 14 22:21:17 2006 -0600 Incremented version to 1.15svn. commit 23589c9ace9c2563f12d5f17d2e5dd57a22649ef Author: John Bowman Date: Sat Oct 14 19:50:30 2006 -0600 Adjusted example. commit d7c69078664b14734ea03564f5b7246918525754 Author: John Bowman Date: Sat Oct 14 19:23:21 2006 -0600 Updated FAQ. commit a5cc66d15032057a4201c26f2bebc957ff77ddce Author: John Bowman Date: Sat Oct 14 19:11:41 2006 -0600 Documented filloutside. commit d3465aa847b9e5fd750c39159ecd272e71130815 Author: John Bowman Date: Sat Oct 14 18:50:37 2006 -0600 Fixed cxx warnings. commit 638a43729ff7bb383be7806103ae1d92b94ca6d2 Author: John Bowman Date: Sat Oct 14 16:45:23 2006 -0600 Added missing space. commit e2d6e51171031947eea40fab2bdbdacecaa01abb Author: John Bowman Date: Sat Oct 14 16:40:18 2006 -0600 Support color fonts for pdftex and pdflatex. commit f544e103151c1d5ed9d06f46768b51fb1930a60b Author: John Bowman Date: Sat Oct 14 16:21:59 2006 -0600 Implement ability to draw images directly from a two-dimensional pen array. commit 9be13bc0a5f9e252a5359c4c3533f0f505a6c353 Author: John Bowman Date: Sat Oct 14 15:26:59 2006 -0600 Fixed label alignment transformation; implemented general scaleless routine. commit 216de7b26d13b939c878a66ddb5d0aabb788fd62 Author: John Bowman Date: Sat Oct 14 02:03:40 2006 -0600 Fix readline test. commit fec76d69c87f40e1661c33824fbc0a67def44ea7 Author: John Bowman Date: Fri Oct 13 23:03:41 2006 -0600 Fix test for readline 4.2. commit 7ac24a54e969bdf31643f6fa4a6776e0afa5cb8a Author: John Bowman Date: Fri Oct 13 22:32:56 2006 -0600 Disable support for readline versions < 4.2. commit 80af472754be7d427e51b62973788afd8de69bf5 Author: John Bowman Date: Fri Oct 13 16:50:51 2006 -0600 Scale label fuzz to height+depth not width. commit 1db6b1f47b1bbcc07b40eb08a51b51774753ecff Author: John Bowman Date: Thu Oct 12 18:01:22 2006 -0600 Define pdfoutput if necessary for older versions of latex. commit b037d295c1f679af879ce10f6be9d67cfa46e8e5 Author: John Bowman Date: Thu Oct 12 17:30:14 2006 -0600 Implement tex and pdftex TeX engines. commit 6fa776eb64ca27b159017315844647f3ad9da44c Author: John Bowman Date: Thu Oct 12 00:05:50 2006 -0600 Implemented more robust label fuzz calculation. commit 4f25e3051841654925b6a34ff1be0b848388bded Author: John Bowman Date: Wed Oct 11 21:48:25 2006 -0600 Crop generated pdf files. Fixed pdf label transforms. commit e2206d1c9d63a5645d7fa6f0326f7f4c8b890c21 Author: John Bowman Date: Wed Oct 11 16:41:37 2006 -0600 Handle files with and without labels consistently under -tex=pdflatex. commit f7c4e4469d334240cd096492f0656ae4a6818972 Author: John Bowman Date: Wed Oct 11 08:43:27 2006 -0600 Added support for Emacs 21 (quickly tested with 21.4.1 only). commit 3201b9e05aa425408230fb4dad2ca670e5523b29 Author: John Bowman Date: Wed Oct 11 01:25:14 2006 -0600 Added support for alternate texengines (currently "latex", "pdflatex", "none"). Support \usepackage[inline]{asymptote} under both latex and pdflatex. Clean up singleton path eps writes. commit 667c624a70cd45de64b3f9aad94f2278464e783f Author: John Bowman Date: Sun Oct 8 15:16:08 2006 -0600 Revert revisions 1.14-54 to 1.14-56 commit 99d7cc9fd7754fd52b81796555b7e23ce5bf5d7f Author: John Bowman Date: Sat Oct 7 14:00:36 2006 -0600 Implemented general label clipping; removed evenoddoverlap and zerowindingoverlap fill rules as this functionality can be achieved at a higher level, using inside(path, pair, pen). Changed bool scale argument of Label structure to Shift, Rotate, Slant, or Scale, which indicates how the Label transforms with the embedding picture. commit 83fd3c1466b160e77dc917f9c4279293714ac2aa Author: John Bowman Date: Fri Oct 6 04:39:26 2006 -0600 Reset x and y boundRoutines after processing. commit 2ea881bdd70f223918b196a2eea0229109914818 Author: John Bowman Date: Wed Oct 4 09:45:16 2006 -0600 Remove obsolete item. commit 591a6809b451364ae03a993f027037e038b2c77a Author: John Bowman Date: Tue Oct 3 22:15:25 2006 -0600 Remove further unneeded instantiations (as of last revision). commit 0c4e6e5cedb64d50e77fe622291688a72f2ce367 Author: Andy Hammerlindl Date: Tue Oct 3 18:53:50 2006 -0600 addOps now add operators as fields (so they can be imported). commit 555d40cc7189645f7c813285feef0a499ae100ab Author: John Bowman Date: Tue Oct 3 17:47:39 2006 -0600 Allow use of UnFill in tick labels. commit 2fe33bde49a3094109de6b371c094445c1be49a5 Author: John Bowman Date: Tue Oct 3 17:30:14 2006 -0600 Simplify general axis routine. commit 510a57c843886458e69b79ab92fe2b23a1976ff4 Author: John Bowman Date: Tue Oct 3 17:22:31 2006 -0600 Simplify call to ticks. commit c9ff5103304cffbd38307aad0e3f2aa9916e3e6b Author: John Bowman Date: Mon Oct 2 22:03:40 2006 -0600 Move Label shift member into transform member. commit 603fae58ba2d8f2a497c32e246d609492c41a077 Author: John Bowman Date: Sun Oct 1 18:12:11 2006 -0600 Implement general label transforms, including slant. Added option to Label to allow labels to scale and slant with pictures and frames. commit 91640a6cc5e16990bcef8b86ad2f3c06f050ef09 Author: John Bowman Date: Sat Sep 30 14:26:05 2006 -0600 Fixed "Cannot write to venn_.tex" error under Windows XP. commit fe6f54c378560c8d56721722195c3664e7ede25c Author: John Bowman Date: Sat Sep 30 10:56:10 2006 -0600 Fixed cxx errors and warnings. commit 025f86561c9729aae69bc805aef03e5c58dbabd9 Author: John Bowman Date: Wed Sep 27 15:58:38 2006 -0600 Fixed transformation of label alignments. commit 67c45c5d79fa438a231d5f48d7c5cfa50a169d2e Author: John Bowman Date: Wed Sep 27 00:22:53 2006 -0600 Make scale set automin and automax settings in autoscaleT. commit a03c2af28e987a3ebbcb07ca7ab7ec92d671c0a8 Author: John Bowman Date: Tue Sep 26 23:41:09 2006 -0600 Added boundRoutine[] bound to autoscaleT. commit 870716863c07e9fc93a7ea4ae38d1050c7103710 Author: John Bowman Date: Tue Sep 26 23:39:37 2006 -0600 Improved graph routines: added xaxis and yaxis bounds communication, allow axes with ticks and unextended axes to be called on an empty picture. commit 55486b03449dc43e3f2e2f671372d7bcbe5b4c47 Author: John Bowman Date: Tue Sep 26 22:18:06 2006 -0600 Simplified example. commit 3f84eb0e5329df55eedcd7816d246269b1acf9e4 Author: John Bowman Date: Mon Sep 25 06:03:16 2006 -0600 Allow for separate xunitsize and yunitsize scalings. commit d25faa5325ac7dd2edd8698a23cb0ac612882a0b Author: John Bowman Date: Sun Sep 24 11:26:11 2006 -0600 Improved documentation of tick extend option. commit 0d8745187ea6224e507d01132176fc30c9e71adc Author: John Bowman Date: Sun Sep 24 09:40:22 2006 -0600 Removed axislabelmargin. commit 351e794c6bc6824c199bc368aff48edf7ac23205 Author: John Bowman Date: Sun Sep 24 00:59:08 2006 -0600 The axislabelmargin setting should only affect alignment perpendicular to the axis. commit 8672a218c4874b5aaba6381dcc7e123b23ee67ec Author: John Bowman Date: Sun Sep 24 00:38:54 2006 -0600 Adjust axis labels only in direction perpendicular to axis. commit 6858464ed091391a79112e8385177d0d24a6834d Author: John Bowman Date: Sat Sep 23 22:32:04 2006 -0600 Draw path label after drawing path. commit d48c0122032cc8591b9c3128f6e6cb117cd6920a Author: John Bowman Date: Thu Sep 21 12:28:57 2006 -0600 Allow Label(Label,pair). commit 55e07408be0540b1fd41119ed03fb92d2b840646 Author: John Bowman Date: Thu Sep 21 12:27:30 2006 -0600 Add partial support for xemacs. commit 833db88dba8d3477533ee8d1a510da2fd58a417a Author: John Bowman Date: Thu Sep 21 01:21:34 2006 -0600 Leave vertical mode before put. commit f1de4247df589333842495b8c675841a1e05c252 Author: John Bowman Date: Thu Sep 21 00:12:10 2006 -0600 Fixed grammatical error. commit 5c39ba9bcd34ab46ba9e62d113e9c7efbb1a11c7 Author: John Bowman Date: Thu Sep 21 00:08:42 2006 -0600 Added Mexican Hat (wavelet) example that nicely illustrates the distinction between guides and paths. commit 627742e5a1accd9977fbef43253dd5f4aef3a0f1 Author: John Bowman Date: Wed Sep 20 08:50:13 2006 -0600 Removed dependency on rotate.tex. commit 59862d5927db13955c04ff0202acbc5174eaddb6 Author: John Bowman Date: Tue Sep 19 23:08:34 2006 -0600 Removed dependence on pstricks. commit 4eca0a5c56aaac730963e3e49adb8dbe09c14434 Author: John Bowman Date: Tue Sep 19 22:12:31 2006 -0600 Added filloutside routines. commit f3d3e51caf55dcc5cd95699b486351eaf660793a Author: John Bowman Date: Mon Sep 18 16:00:15 2006 -0600 Ignore setlocale errors; improved discussion of setlocale in FAQ. commit 19f4c2d00b8b172fe6821cd9764eb7dea5e9c2d2 Author: John Bowman Date: Sun Sep 17 22:32:31 2006 -0600 Fix -aZ -f pdf. commit 76c3b469886016170897af7b9ca21f3e7bcc1918 Author: John Bowman Date: Sun Sep 17 22:18:06 2006 -0600 Standardized filltype definitions and added a Draw filltype (e.g. for drawing a bounding box around a label). commit 3756452ae55dd4c74dec0832efb762b04501bebc Author: John Bowman Date: Sat Sep 16 22:18:03 2006 -0600 Fixed typos in comments. commit 979e5245c77168ad68b2105c07203099c1985fdf Author: John Bowman Date: Sat Sep 16 21:50:16 2006 -0600 Make -p option only effective in noninteractive mode. commit 6353224e8bc253e83b284cc9bdfc776997217d68 Author: John Bowman Date: Sat Sep 16 15:39:41 2006 -0600 Accept ? as alternative to h (help). commit 2d3be54182cabece33b4fd21f18f6d67b688e19d Author: John Bowman Date: Sat Sep 16 15:38:37 2006 -0600 Quit (q) should turn off off debugging mode. commit e67a8fad923d927a19b8a5f725bc7234f04227ee Author: John Bowman Date: Sat Sep 16 15:11:09 2006 -0600 Minor simplifications. commit c819d159f46d10b3446299d1bbdcc328bab67e83 Author: John Bowman Date: Sat Sep 16 15:05:59 2006 -0600 Added irregular mesh image contour routines. Fixed documentation regarding explicits image bounds. commit 2dc1f5f285691a0fb77438f3d0acefa96528fe27 Author: John Bowman Date: Sat Sep 16 15:02:46 2006 -0600 Fixed numerical precision issues; minor optimizations. commit a717ad3169a34b96fed0e04b9ed103ff236ac0a0 Author: John Bowman Date: Sat Sep 16 12:18:45 2006 -0600 Minor optimization. commit a291fe8cbab32f8fb81f5af0a9ec833245b4d734 Author: John Bowman Date: Sat Sep 16 01:32:59 2006 -0600 Fixed docref. commit 31d0253ac49f2a57def70ff23c6a6b6037acc22e Author: John Bowman Date: Sat Sep 16 00:44:13 2006 -0600 Updated FAQ. Improved Makefile. commit 940671ec82f0375f5d77828da85298699b756138 Author: John Bowman Date: Fri Sep 15 21:55:17 2006 -0600 Added contour wrapper for explicit x and y arrays. Standardized contour argument names. commit 255e2305868febb31a1a9123008e451a88749db1 Author: John Bowman Date: Wed Sep 13 20:56:26 2006 -0600 Fixed unhandled exception on startup. commit 348aff80582497d1629b73e8be47d7f2b6a7bcbc Author: Andy Hammerlindl Date: Wed Sep 13 19:40:19 2006 -0600 Ignore keyboard interrupts during readline. commit 609e7ce533c3c383d43870a451a470e5222ee8e5 Author: John Bowman Date: Wed Sep 13 00:25:47 2006 -0600 Modified example. commit 95d6e55978fc10e863c93cce89292fb43ee84803 Author: John Bowman Date: Wed Sep 13 00:24:37 2006 -0600 Generalized axis alignment example. commit c076e75873eeeb081a32c068c4044db9dc9f3185 Author: John Bowman Date: Tue Sep 12 23:45:10 2006 -0600 Fixed axisMin. commit 711cbebdf9ffde7a3ab55fcc4631f0a684d21566 Author: John Bowman Date: Tue Sep 12 23:36:12 2006 -0600 Calculate, don't cache, axis userMin and userMax values. commit 48ac703bc5891cbea3f7645646cf6532a6441b62 Author: John Bowman Date: Tue Sep 12 01:02:42 2006 -0600 Add PDF autorotate option; landscape slides now automatically turn this on. commit 4ba23a29c1915434076022e312479f5b2edf0f22 Author: John Bowman Date: Mon Sep 11 22:24:22 2006 -0600 Added example of buildcycle. commit 27e2b021dc0609a58a6bfe4f15498977d665e258 Author: John Bowman Date: Mon Sep 11 22:20:23 2006 -0600 Port and document MetaPost buildcycle. Document new behaviour of asy -l file... commit f6627a1a9f7d66f92eebdd8990ce2ed03d98b6d6 Author: John Bowman Date: Mon Sep 11 21:45:35 2006 -0600 Allow draw(nullpath) again. commit 19fbdfb19a5222e947593a5af55727b14bd8d1cc Author: John Bowman Date: Sun Sep 10 13:33:24 2006 -0600 Fixed asy path and base directory. commit b8b3928f0b73660c2d7adcf7afcc4ddae3b7fa85 Author: John Bowman Date: Sat Sep 9 21:55:55 2006 -0600 Added type highlighting list to asy-keywords.el and asy-mode.el. Simplified building of asy-keywords.el. commit 034bcce15f75b967c32f10ff5227607818d5c039 Author: Andy Hammerlindl Date: Sat Sep 9 12:26:29 2006 -0600 Refactored interactive prompt. Moved asy code processing from main.cc to process.cc. commit 7f69344edb1918434afc53d5906348bc5f15ae2d Author: John Bowman Date: Fri Sep 8 12:40:18 2006 -0600 Fixed infinite loop on stdin EOF during scrolling. commit af30d135fb36c4f5c4a59808b63d76abd1a44f30 Author: John Bowman Date: Thu Sep 7 21:59:28 2006 -0600 Make last workaround CYGWIN specific. commit 455b64c796b9972676e3e13fc03d2fcb2964e3f8 Author: John Bowman Date: Thu Sep 7 07:56:04 2006 -0600 Work around missing ncurses/term.h symbolic link under CYGWIN. commit 900e00356b7814d4deddfa05ce2c9ab828cfb1c6 Author: John Bowman Date: Wed Sep 6 02:52:45 2006 -0600 Incremented version to 1.14svn. commit 22aa04ae69177659ab25e16dd859775909ebc643 Author: John Bowman Date: Tue Sep 5 22:47:22 2006 -0600 Added path qualifier. commit eff0b45d96d765f9bc81196953aa106b2f7445f0 Author: John Bowman Date: Tue Sep 5 21:17:34 2006 -0600 Standardized indentation of and untabify base files. commit 87a45971cbed4ae9debe673c81d282bb4e606a5c Author: John Bowman Date: Tue Sep 5 10:24:50 2006 -0600 Updated documentation and FAQ. commit de7e13243c0599e4d2bf68faf2896e1f30ed6128 Author: John Bowman Date: Tue Sep 5 10:24:30 2006 -0600 Added html target for building html documentation from main directory. commit 65d163362a2fac264575e6b5159fef0419ae2482 Author: John Bowman Date: Tue Sep 5 00:24:39 2006 -0600 FAQ updates commit 17505d564a43e316c7db22b98d8de5466d25e2d9 Author: John Bowman Date: Mon Sep 4 23:13:53 2006 -0600 Explicitly load asy-mode.el in case an old compiled version exists. commit 9b4cc01e29cbaf9a4d83ceb9a2f8ccaceea31c02 Author: John Bowman Date: Mon Sep 4 23:04:52 2006 -0600 Color name updates. commit 52c3d60b3d4e1f03d90ca5596c2f953134de28ec Author: John Bowman Date: Mon Sep 4 22:29:45 2006 -0600 Project triple to align in call to label and Label. Cast triple to position. commit a264f9641e882d8ee2ccfad8b671cd3fd30168b6 Author: John Bowman Date: Mon Sep 4 22:18:35 2006 -0600 Remove cast from triple to align. commit 7449971fee8995d1d79ce4d27af234385dffd53f Author: John Bowman Date: Mon Sep 4 22:12:03 2006 -0600 Make grep case-sensitive. commit 6f5bf62ecaba03d7fe486758c2362b5f45bbe38a Author: John Bowman Date: Mon Sep 4 01:40:35 2006 -0600 More FAQ updates. commit c9d4473fed4c535c26a7180eb2e62c17a4cbe1eb Author: John Bowman Date: Mon Sep 4 01:36:16 2006 -0600 Updated FAQ. commit f68a35d2db180e3075316488aa782d88def7738c Author: John Bowman Date: Mon Sep 4 01:30:35 2006 -0600 Allow arrowhead to be called with a position type. commit c98c79d93af423d11026df9f646cf2162286b635 Author: John Bowman Date: Mon Sep 4 01:29:06 2006 -0600 Use pTick as default for ptick. commit ad45fdc38f515e56a61419cf508240e8926fdec9 Author: John Bowman Date: Sun Sep 3 12:05:53 2006 -0600 Revert last change. commit adfe519f86f0c3663a65d066b93e54868ef97c19 Author: John Bowman Date: Sun Sep 3 11:49:35 2006 -0600 Close fout immediately to avoid race condition with gv in interactive mode. commit fbb3d9ce12d3860ce18a50ac41c0a7a20c4daf16 Author: John Bowman Date: Sun Sep 3 09:05:31 2006 -0600 Install asy-faq.info with make install-all. commit 297fb1620c281160d3c85a59dfbf3599ae822a46 Author: John Bowman Date: Sun Sep 3 00:01:55 2006 -0600 Fixed cxx warning message. commit 0bfa85f15495c3fe8dedd656e168863f22180f3b Author: John Bowman Date: Sat Sep 2 23:45:44 2006 -0600 Removed ASYMPTOTE_DIR. commit 3f78d4518f580e535f06fd22d57b61494087fc5f Author: John Bowman Date: Sat Sep 2 23:42:37 2006 -0600 Simplified Makefile. commit baeb51d7b703d1f754b75c2257f7039425fad588 Author: John Bowman Date: Sat Sep 2 23:35:46 2006 -0600 Distribute keywords.cc. commit 67fbb198d48c333c138909ff53211389d2ac3a42 Author: John Bowman Date: Sat Sep 2 23:29:35 2006 -0600 Make keywords.pl executable. commit 794538cc5900417ed36eddb1cd6a98a8552b8f5c Author: John Bowman Date: Sat Sep 2 23:20:58 2006 -0600 Added Frequently Asked Questions (FAQ). commit 26f56cf05c6cea469da431248728ba726f347892 Author: John Bowman Date: Sat Sep 2 11:28:41 2006 -0600 Respect scroll setting only in interactive mode. commit c2b071c9fd91e2e54db1960fced5e9d7ae2029c2 Author: John Bowman Date: Sat Sep 2 11:21:14 2006 -0600 Add Philippe's changes to asy-mode.el, including menu and asy-insinuate-latex. Handle shells other than bash in asy-mode.el. Autogenerate asy-keywords.el. commit 1f96b552a2af9bc8f17700d1fca4e7fb7a7223a1 Author: John Bowman Date: Wed Aug 30 21:53:25 2006 -0600 Make annotations with frame transformation; cleaned up @defspecial code. Check for successful PostScript writes. Standardize "Can't" vs. "Cannot". commit e3ff8da6ad620ed763f68efd31c6cb550100649e Author: John Bowman Date: Wed Aug 30 21:48:31 2006 -0600 Simplified calculateTransform logic. commit ab8f9f3e55b9ac3218ae8bdbd0cdae87eae9283c Author: John Bowman Date: Wed Aug 30 21:46:56 2006 -0600 Improved example. commit a8a5186f6b75b1c9ba2baac9a1440744573463d8 Author: John Bowman Date: Wed Aug 30 21:44:46 2006 -0600 Disable magic () parenthesis. commit b82912094da7642a9ba64a51ee59d4d1b74eb150 Author: John Bowman Date: Wed Aug 30 16:35:02 2006 -0600 Prevent exponential notation in %%BoudingBox. commit 8873a0444096d60eec93aed956ff0eae1b94a7a0 Author: Andy Hammerlindl Date: Wed Aug 30 13:11:11 2006 -0600 Test using a local version of asy. commit 587b1fe3d99f40525c5759823c2cc1dd5ed85121 Author: Andy Hammerlindl Date: Wed Aug 30 13:10:08 2006 -0600 Don't run "../asy output/*.asy" as this doesn't test the files properly. commit 0f9e63abbd46730ae29aafeb4ded2b205d222a24 Author: John Bowman Date: Tue Aug 29 21:04:38 2006 -0600 Updated to use gc6.8. commit 993d2ec493e607efed0de08be6ed3823f362d80a Author: John Bowman Date: Tue Aug 29 15:47:24 2006 -0600 Reduce size of generated files. commit 2fb33cd414d9db9b472303954547aefe7c23bc8d Author: John Bowman Date: Tue Aug 29 11:30:15 2006 -0600 More three-dimensional examples. commit 2e296a0cd8bee8936fdd995078fef50b2e5489d5 Author: John Bowman Date: Tue Aug 29 11:29:33 2006 -0600 Fixed definition and documentation of cone. Added longitudinal pen to draw. commit c1b1f17f483abf63e58c9efaf3202062185d22cd Author: John Bowman Date: Tue Aug 29 11:28:51 2006 -0600 Added cast from triple to align. commit 32a32c6b551379c64d93d1362f76c03519600e43 Author: John Bowman Date: Mon Aug 28 22:35:39 2006 -0600 Added up argument to projection routines to specify camera orientation. commit 40b2e7eecec7ffb6cdd384f25dceaf15a7887350 Author: John Bowman Date: Sun Aug 27 20:58:32 2006 -0600 Minor optimization and documentation updates. commit 5caeb44bbe159e5b0474691923a4c1680cedeb37 Author: John Bowman Date: Sun Aug 27 18:53:20 2006 -0600 Cleaned up surface functions. commit c85824f701ac8682dbdee0fe0d24285625882a17 Author: John Bowman Date: Sun Aug 27 18:42:43 2006 -0600 Avoid warning message under -d. commit 312f05fb764fa64334f90a1160aae5fdfbe4a8ae Author: John Bowman Date: Sun Aug 27 14:08:51 2006 -0600 Moved documentation to beginning of file again. commit 5768a90fbe38fa2d72c0343ee49474d2ce712bc3 Author: John Bowman Date: Sun Aug 27 13:44:12 2006 -0600 Disabled magic [] since this makes typing real[] awkward. commit 794ca7d4658dfc8d479b64abe73625edd9fcec7a Author: John Bowman Date: Sat Aug 26 18:29:31 2006 -0600 Removed obsolete comment. commit aebc30038fe13e7e19186f8719dbff5af2eccb1f Author: John Bowman Date: Sat Aug 26 15:44:33 2006 -0600 Don't indent after struct definition without optional ; commit 8f044468d9ddb1a07c41dc8f1742fa6b4c756260 Author: John Bowman Date: Sat Aug 26 12:06:44 2006 -0600 Disable magic {} as this makes grouping existing blocks of code (without going to the trouble of selecting a region) inconvenient. commit 670b6dbe300a6899cb1d71abe669805b627156f9 Author: John Bowman Date: Sat Aug 26 12:01:32 2006 -0600 Fixed indentation of public/private permission modifiers. commit 0b90018f10f19db2a61c316146b05f187618b29f Author: John Bowman Date: Sat Aug 26 11:59:21 2006 -0600 Fixed indentation. commit 71b5a6d5c8f70a04c49bcfbec1ecaea740cd906a Author: John Bowman Date: Sat Aug 26 01:07:35 2006 -0600 Mention two-mode-mode recommended package also in online documentation. commit 00738d2135db51a0e4b2066473620d633d5db0b4 Author: John Bowman Date: Fri Aug 25 22:41:48 2006 -0600 Remove the strict requirement of the two-mode-mode package for minimal functionality of asy-mode.el. commit af2ba24ede5a963d7cec28a301f71ee2560810c9 Author: John Bowman Date: Fri Aug 25 22:14:11 2006 -0600 Replaced asy-mode.el with slight improvement of Philippe Ivaldi's version. commit f662e32020195506b96d1a84ce2248323ff91dd9 Author: John Bowman Date: Thu Aug 24 21:18:05 2006 -0600 Check path[] index. commit e0be7331a932a345d0330c0e331eb75f06fa7116 Author: John Bowman Date: Thu Aug 24 21:13:14 2006 -0600 Allow legends and markers when drawing superpaths. commit 6b81deefb1e8e0e1a888da8549a817ea9aa1fc50 Author: John Bowman Date: Thu Aug 24 11:28:50 2006 -0600 Moved graph settings to separate module graph_settings. Renamed nmesh to ngraph. commit e0c665a6c80a638cf987d01613b355eb7357df0e Author: John Bowman Date: Wed Aug 23 22:47:44 2006 -0600 Removed resolution arguments (nx and ny) from matrix contour routines; instead calculate these from the matrix itself. commit 25db195ca85cdf10b81b0e658f11e28fe087329b Author: John Bowman Date: Tue Aug 22 09:00:55 2006 -0600 Simplify calculation of cyclic path bounding boxes. commit 2a727b5da017e16f669041fe33bce1cfa9b05995 Author: John Bowman Date: Mon Aug 21 22:30:45 2006 -0600 Check that root is in range in bounds(). Implemented general solution for pen padding/capping of paths. commit 1e3e71ddba40dd38a67f0d5a063f593928e29322 Author: John Bowman Date: Sun Aug 20 22:22:33 2006 -0600 Added link to externally contributed examples: http://home.tele2.fr/phivaldi/asymptote commit 1975cd1e4db32ab15af2e7cced813c9425d73aad Author: John Bowman Date: Sun Aug 20 21:56:22 2006 -0600 Account for pen cap contribution to bounding box. commit 0a78726e84976df4d77fd2669e3ed8c477503d28 Author: Andy Hammerlindl Date: Sun Aug 20 00:20:41 2006 -0600 Exclude module accesses (and imports) from listing. commit 2d33137292407d66f099001aeb6fe0a9c7bb7c0c Author: John Bowman Date: Sat Aug 19 22:25:26 2006 -0600 Fixed image transposition. commit 620b0750d6a20baa7aa231ba7e3896cbaec37f5e Author: John Bowman Date: Sat Aug 19 18:13:36 2006 -0600 Discard extra characters after scroll commands (q). If scroll is negative, use one less than number of display lines. commit 331d19e858a08034c8b1f7182c8d8c0edb86dca7 Author: John Bowman Date: Sat Aug 19 09:44:40 2006 -0600 Changed header. commit deeafec561e27c8f9c1cecf9651229670931bbad Author: John Bowman Date: Fri Aug 18 16:07:59 2006 -0600 Standardized image and contour conventions for matrices. commit 3ec15bc65ee01c347de9764251f7ed148c2d5c80 Author: John Bowman Date: Fri Aug 18 15:56:31 2006 -0600 Improved documentation of command-line arguments. commit 98ce04117d410dacd86caa0c155def36cbe0138d Author: John Bowman Date: Fri Aug 18 15:55:57 2006 -0600 Removed unneeded settings qualifiers. commit d637ff179718b8e833ecdfc56394e5c9ed8d1989 Author: John Bowman Date: Fri Aug 18 15:54:35 2006 -0600 Minor optimization. commit b7a92a3b4478fb944e11d1f59bc91585657df406 Author: John Bowman Date: Fri Aug 18 15:52:27 2006 -0600 Changed write without data arguments to work consistently with the forms with data arguments: write(suffix suffix=endl); write(file fout, suffix suffix=none); commit 7bbab69b0cfed3ea636366a3ff30d406480dd6b7 Author: John Bowman Date: Fri Aug 18 14:46:47 2006 -0600 Remove spurious grestore; if no labels move grestore before showpage. commit 5f7cb91504b33716ac5e1c0cb64f3aecde55c2dc Author: John Bowman Date: Thu Aug 17 14:29:46 2006 -0600 Move GCLIBS dependency before others. commit 946e289a36611ab5833be45f544ef9cf097c535a Author: John Bowman Date: Thu Aug 17 12:24:16 2006 -0600 Added missing brace. commit 385b0fcf92fef84a5b216b523885d9b66b81ba47 Author: John Bowman Date: Thu Aug 17 11:41:33 2006 -0600 Added whereDefined() to entry class. Implemented void list(string *s, bool imports=false); to list all global functions and variables in a module named by string s. Removed unneeded init_readline in readline() routine. commit ddcc3110a61f7878e884895b66710f1bd0bb226b Author: John Bowman Date: Wed Aug 16 16:16:45 2006 -0600 Fixed xtick default argument issue. Added 3d tick routines. commit df02809984fd6f70cccb0de55f3139bdfabfb546 Author: John Bowman Date: Wed Aug 16 10:05:37 2006 -0600 Minor edits. commit 880c0f19ddd67a25df6519f5e2d3fd02a1cba7cd Author: John Bowman Date: Wed Aug 16 09:54:54 2006 -0600 Truncate out-of-bounds position parameters in labelaxis. commit 6629405d8a24e54b0214194fefb3d41e191eb186 Author: Andy Hammerlindl Date: Thu Aug 10 00:39:19 2006 -0600 Partially undid last change. commit 5c19f2abc3c0b0965ee16af5cd4e9db0ac440a66 Author: Andy Hammerlindl Date: Thu Aug 10 00:32:54 2006 -0600 Added tabcompletion to documentation. commit ec6f7c14bbb6ee7a675d34e8728930436c28fda5 Author: John Bowman Date: Wed Aug 9 08:21:11 2006 -0600 Simplified texprocess and postprocess signatures. Removed diagnostic. commit c3fab02a80fcfd8e2ff78882050a411f176d6356 Author: John Bowman Date: Wed Aug 9 08:12:20 2006 -0600 Removed bounding box fuzz. commit d191737368a18127796b33fef94399e79ba9e8b0 Author: Andy Hammerlindl Date: Tue Aug 8 15:41:53 2006 -0600 Added intelligent readline auto-completion based on the environment. commit af3d2395c4b72d7342ed0e68872846499fa7159c Author: John Bowman Date: Tue Aug 8 10:27:34 2006 -0600 Documented interp. commit 1be5c206bbf11397d38fb3f8a5dfb6bd396e7f7a Author: John Bowman Date: Tue Aug 8 04:02:56 2006 -0600 Fixed page alignment. commit c70cf49e3504ee60eff3cdccdc4f9314975a55ed Author: John Bowman Date: Mon Aug 7 20:20:15 2006 -0600 Added newl after gsave. commit e0bbdb825112966ffc84648379a4326e09122658 Author: John Bowman Date: Mon Aug 7 14:07:53 2006 -0600 Removed unused code. commit 7553c45742a1653bedcac99f67c8ad29f67aca0f Author: John Bowman Date: Mon Aug 7 09:46:36 2006 -0600 Turn off tab completion after readline. commit 4e5b8682d2ed3405ac13e5a269516abcf0916aaa Author: John Bowman Date: Mon Aug 7 09:36:42 2006 -0600 Simplified interactive mode. commit 337bc7366624b9ece92a35b75e404286c6c52216 Author: John Bowman Date: Mon Aug 7 08:20:46 2006 -0600 Simplified page alignment: -a Z nolonger implies -notex, annotation now works even with negative bounding box coordinates. commit 33092b49f26e37dba2d4f4e29ff3244a9f8eceb4 Author: Andy Hammerlindl Date: Sat Aug 5 00:03:41 2006 -0600 Removed accidentally added debugging output. commit 3c5d840478b8e7df5a7da4164df7921119ecb5c7 Author: Andy Hammerlindl Date: Fri Aug 4 23:56:57 2006 -0600 Fixed horizontal drawline bug. commit 8ff1804d6af0ab6c487d75d144c8be2363fd839a Author: John Bowman Date: Thu Aug 3 06:47:03 2006 -0600 Updated implicit scaling documentation. commit 1c00e823b1efef1b1a213697c8f804f8686e2c96 Author: John Bowman Date: Wed Aug 2 13:02:50 2006 -0600 Check for interrupts on for(;;). commit 15550ffe796c57d5d29ea5ec94590b424dd52954 Author: John Bowman Date: Wed Aug 2 12:46:17 2006 -0600 Removed unneeded %s. commit 6d32da25931610ecbd2a037dabc06daf590b9eb2 Author: John Bowman Date: Wed Aug 2 12:38:03 2006 -0600 Added support for Adobe Reader annotations. commit d29fe7bd1b866038c712a4a361b0bdec3d66f113 Author: Andy Hammerlindl Date: Tue Aug 1 13:17:50 2006 -0600 Improved highlighting of strings and scaling expressions. commit 0acd2b77382036350910ff18bae3df35e509d9db Author: Andy Hammerlindl Date: Tue Aug 1 13:16:51 2006 -0600 Allow empty test expression in for loop. commit 8eeecfa50431a4ead2b53af641e55b841bc0f15c Author: Andy Hammerlindl Date: Tue Aug 1 13:16:21 2006 -0600 Clarified comments. commit 355c37958b6b948bd3590b032373f59872a939f2 Author: John Bowman Date: Tue Aug 1 08:40:11 2006 -0600 Incremented version to 1.13svn. commit 011ccae6de7ae9699aa841dd6bd985526766ca25 Author: John Bowman Date: Tue Aug 1 06:46:11 2006 -0600 Fix cxx warning messages. commit 4c397bc7f375c2b585c69abb7cb51a9ece995994 Author: John Bowman Date: Tue Aug 1 06:32:23 2006 -0600 Use command-line version of ghostscript (gswin32c.exe) under MSDOS to avoid spurious ghostscript window when producing pdf files. commit 83c37ae5865e042bb52b50f7ee8ab366891894e9 Author: John Bowman Date: Mon Jul 31 14:42:09 2006 -0600 Updated. commit 3155feb37eb0b7b66680faa49af3f3030c9d26a2 Author: John Bowman Date: Mon Jul 31 14:23:50 2006 -0600 Simplify pen constructors. commit e292493e7798b572a31cfdc7f9f60be9a5c03d55 Author: John Bowman Date: Mon Jul 31 14:12:33 2006 -0600 Implement transparency. Handle DEFLINE correctly. Change string to mem::string throughout pen class. commit e6704b4d1c7bb2ad26618f2587b1a46183d3a19a Author: John Bowman Date: Mon Jul 31 14:09:15 2006 -0600 Use heavygreen instead of green. commit b58d65ce754bddf6d826d99af97c9a8e7ae67c4e Author: John Bowman Date: Mon Jul 31 14:07:33 2006 -0600 Added equations item. commit 09880dbab3c09f0ff6b6d06469049e1e03834f1f Author: Andy Hammerlindl Date: Sun Jul 30 00:22:40 2006 -0600 Delay call of getName, so that it is only called when the name is used. commit daf07650a774d77f1bc1b319ff2129f93343abab Author: John Bowman Date: Sat Jul 22 13:43:23 2006 -0600 Fixed label fuzz. commit c75cd4332190a6c80206864871c7f098260c815d Author: John Bowman Date: Sat Jul 22 01:10:50 2006 -0600 Minor additions to Help section. commit f95b2c761e1bb5ce5cc1d4194d0c08b0758db1b9 Author: John Bowman Date: Sat Jul 22 01:08:18 2006 -0600 Account for scale in label bounding box calculation. commit 662666896ceec7a86a8acc05bbf714ff017acdf1 Author: John Bowman Date: Sat Jul 22 01:07:15 2006 -0600 Renamed interact() to interactive(). commit 0a7ee04366c0250477d87cd72007e0fcc1cbeb6a Author: John Bowman Date: Sat Jul 22 01:06:34 2006 -0600 Fix Step calculation (special case). commit eae2726d0ce3648e4c77d5d8286c8959e2fef919 Author: John Bowman Date: Sat Jul 22 00:59:44 2006 -0600 Interactive reset should call cleanup, not exitFunction, and set uptodate=true. commit 6083f7f734c0846261a701d3dd2d9aaac3541ece Author: John Bowman Date: Tue Jul 11 15:52:29 2006 -0600 Updated. commit fb46edec56c5921e5ca6cfcb0ef107eb7d135df9 Author: John Bowman Date: Tue Jul 11 15:41:51 2006 -0600 Added default pen argument to Dotted(). commit c4bd8d894fa312bb63b8e4367156266977092b15 Author: John Bowman Date: Sun Jul 9 21:16:08 2006 -0600 Add q option to scroll facility to allow one to terminate scrolled output without causing an execution interrupt. Make scroll a setting instead of a function call. commit 7c5bedb12ad977701955cbf1726782e88ae2f379 Author: John Bowman Date: Sat Jul 8 22:10:25 2006 -0600 Added prefix plain_ to internal plain includes. commit 7da6733491c9eca3c94cd043f288bf09dbe16ed9 Author: John Bowman Date: Fri Jul 7 23:05:42 2006 -0600 Add missing clear() function to remove all breakpoints. commit 9dd7f96ec2a61fdb419445bcffa2a0884006b870 Author: John Bowman Date: Fri Jul 7 23:03:10 2006 -0600 Simplified partialsum. commit 36759e0b95e1af56c6c0d76d1bc11597db2fc5b6 Author: John Bowman Date: Fri Jul 7 11:10:28 2006 -0600 Removed page break. commit d6047df8c3e18d8e1e34788eddbecb97597dced3 Author: John Bowman Date: Fri Jul 7 11:06:25 2006 -0600 Documented ellipse. commit 42c87dac055830e8c87eba709885e75d4d893edd Author: John Bowman Date: Fri Jul 7 10:41:38 2006 -0600 Moved "Drawing Commands" section to immediately follow tutorial. commit ac38dcb2af96edeb8acb95b81c3021499d574b5b Author: John Bowman Date: Thu Jul 6 16:30:18 2006 -0600 Minor documentation improvements. commit c3f6db0826aec5be9bebbe809665c549e1fbe779 Author: John Bowman Date: Thu Jul 6 16:17:13 2006 -0600 Fixed documentation of periodic tridiagonal solver. Minor edits to Bezier curve documentation. commit f64d12cbbd2d0d824653688be0930ecdcf181119 Author: Radoslav Marinov Date: Thu Jul 6 14:05:53 2006 -0600 Added a bezier curves example - /doc/bezier2.asy . commit 7b0e702e928cb8f2f04332fed7e9f10df50eb2df Author: John Bowman Date: Thu Jul 6 10:55:47 2006 -0600 Replace double quotes with single quotes for compatibility with \usepackage{german}. commit 133164c761c28dc86ccdc63b7a12e546a939c7e1 Author: Radoslav Marinov Date: Thu Jul 6 10:55:47 2006 -0600 Added some more information on Bezier curves. commit 4bc34df3158d155b2fe5beefa9ef9e0970755bf0 Author: John Bowman Date: Thu Jul 6 01:05:00 2006 -0600 Incremented version to 1.12svn. commit f8478772f370fba4d278a7b2c3a165c7641819ae Author: John Bowman Date: Thu Jul 6 00:10:14 2006 -0600 Support g++ 3.3.4. commit e9b952ce4ae5900c33584f1ef822d66d775b87c7 Author: John Bowman Date: Wed Jul 5 23:53:55 2006 -0600 Fixed cxx warning messages. commit e12b26bc7e3ff3ae0f7383f9ea69f3df080aef8a Author: John Bowman Date: Wed Jul 5 22:39:14 2006 -0600 Added reference to graph3. commit 60cb8a05d80a51765b53f4d2219e177c4165ee98 Author: John Bowman Date: Wed Jul 5 12:28:58 2006 -0600 Renamed locate to locatefile. commit b289c382769951d33a7d1e86b25a9c0aa1aab70a Author: John Bowman Date: Wed Jul 5 01:15:18 2006 -0600 Debugger enhancements and minor fixes, including conditional breakpoints; renamed remove(string, int) to clear(string, int). Define min(... int[] a) and max(... int[] a). Moved realmult to runtime. commit eb3848d18bc8b2666b7756d0beb6bf53636a9418 Author: John Bowman Date: Sat Jul 1 03:05:34 2006 -0600 Removed spurious write. commit 406eb56dbd70bc4a193fa6418ab86e0ded006bc5 Author: John Bowman Date: Sat Jul 1 03:03:41 2006 -0600 Simplified debugger: removed step, renamed line to step, and make trace toggle. Prune duplicate trace messages. commit 27f83cfb49ff4d0bff6ddaf0ee33875c501a0fd5 Author: John Bowman Date: Sat Jul 1 01:20:21 2006 -0600 Make access settings global. Added twice setting to resolve LaTeX references. Improve embedded movie example. commit 5491a9ba3950418ec02f30c385b92374e8674eee Author: John Bowman Date: Fri Jun 30 11:09:49 2006 -0600 Generate wheel.mpg. Suppress vbv_delay overflow messages during mpeg merge. commit 176ad41299376337a145e9b084fd1d12ed2303c5 Author: John Bowman Date: Fri Jun 30 10:34:52 2006 -0600 Use defaultformat again instead of empty format string. commit 846dfbf82f1d4a1757c0c20048b67710620605cd Author: John Bowman Date: Fri Jun 30 10:27:19 2006 -0600 Improve discussion of stack overflow detection. commit 4fcdfd5f23e825c917fb3a7b5c958ec6d94d5ae9 Author: John Bowman Date: Fri Jun 30 08:35:14 2006 -0600 Added missing file. commit 685c1ede9c52233c3cb2135ee12e986391e6d374 Author: John Bowman Date: Thu Jun 29 22:54:03 2006 -0600 Added 3D array transpose and copy. commit 2c20940ae36d496d660f04d4d360c4bdbe0ff558 Author: John Bowman Date: Thu Jun 29 22:37:03 2006 -0600 Prevent runtime errors and interrupts from resetting interactive environment. commit 6f8a184d15535e00803cb8ac6ffff182459a40ed Author: John Bowman Date: Thu Jun 29 22:35:10 2006 -0600 Removed extra blank line at end of 3D array write. commit 1923d5f328df74f65f9c7cf7850a0d672c18ccb3 Author: John Bowman Date: Thu Jun 29 17:10:05 2006 -0600 Moved introductory material into Tutorial section. commit 860b5da27d21101dc89322659afb376f7d28f1e2 Author: John Bowman Date: Thu Jun 29 11:37:38 2006 -0600 Added prompt and quiet settings. commit 5698e9e1a1cbf3073cc280dfd71eaac62be58313 Author: John Bowman Date: Thu Jun 29 06:20:33 2006 -0600 Don't exit if stack overflow or segmentation fault handlers fail (to workaround broken libsigsegv-2.3; upgrading to libsigsegv-2.4 is recommended). commit 83b1ede25ffc9552e993a5d95613b76760b1130a Author: John Bowman Date: Wed Jun 28 21:59:26 2006 -0600 Renamed Examples section to Tutorial. commit 849359439f21d7b98bcb33eb0cb341a53180fcf5 Author: John Bowman Date: Wed Jun 28 12:40:09 2006 -0600 Removed unused line. commit 194753aa5ef632bbdeda4bc54091b0327559e630 Author: John Bowman Date: Wed Jun 28 12:38:09 2006 -0600 Moved debugger into separate base file debugger.asy. Added void stop(string file, string text); to stop at the first line in file containing the string text. Renamed q (quit) debugger command to x (exit); added q (quit) command that quits debugger and ends execution. Better fix for memory leak. commit 7f95d2aa8d456d4f4ac55fdf66bc1d380359df1c Author: John Bowman Date: Wed Jun 28 10:59:27 2006 -0600 Minor documentation updates. commit 6744bcf2123427cc4c488b9faa08a74c5c28286f Author: Andy Hammerlindl Date: Wed Jun 28 01:24:15 2006 -0600 Ensured that the basis in lookAt() is orthonormal. commit 1e1d21359af6ac9ed84e8a655f85caa8dd15339b Author: John Bowman Date: Wed Jun 28 00:35:12 2006 -0600 Incremented version to 1.11svn. commit 9dedce2a8e0e8aad57168c928a43c4e21c848aaf Author: John Bowman Date: Wed Jun 28 00:03:25 2006 -0600 Add support for spaces in Asymptote and output filenames. commit f4c9eb6456a12db6b0e0ced5d6c7d2baaa574274 Author: John Bowman Date: Tue Jun 27 22:51:10 2006 -0600 Added more quotes. commit 21cc31375595807ed07c4c16f0756c0c0914380a Author: John Bowman Date: Tue Jun 27 22:44:55 2006 -0600 Add more quotes for MSDOS users who like to use spaces in filenames. Remove quotes in diagnostic messages. commit 9481a3783c06307af05591e38a5fdfde0808c5eb Author: John Bowman Date: Tue Jun 27 13:30:09 2006 -0600 Cache source code in debugger. Move debugger help message to immediately before prompt. commit 56a9d58ba74a24b05cea462018490512c164dfab Author: John Bowman Date: Tue Jun 27 12:42:03 2006 -0600 Extended and documented debugger. Fixed string reads of lines containing only whitespace. commit b0c68db03af88951576f316333056c5d9b565acc Author: John Bowman Date: Tue Jun 27 01:47:31 2006 -0600 Fix drawpen. commit b4fa5baaf24bc1217c729461060e9aa5cde234f6 Author: John Bowman Date: Tue Jun 27 01:45:40 2006 -0600 Make default drawpen currentpen again. commit b042abc34e332e4b96fca5595320beb43392ab6a Author: John Bowman Date: Tue Jun 27 01:31:48 2006 -0600 Work around atbreakpoint memory leak. commit ddafc5a4ed46a3f11e6944cf3d9c6d10d3c7708d Author: John Bowman Date: Mon Jun 26 23:25:54 2006 -0600 Make Fill and FillDraw work with markers and superpaths. Minor formatting updates. commit 5e5eb1543ef6f855dd4fe7021ad2629af65efd09 Author: John Bowman Date: Mon Jun 26 22:23:17 2006 -0600 Suppress all errors when quiet=2. Catch handled_error in configuration files. commit 7960b9d402a8e258d465c777ec0183b1d5457062 Author: John Bowman Date: Mon Jun 26 21:14:44 2006 -0600 Added parametric surface example. Distinguish between distances in front of and behind camera. commit 6517027ce7911dfb196eac47ff129ed6e96e8e60 Author: Chris Savage Date: Mon Jun 26 18:02:59 2006 -0600 Implemented parametric surfaces. Surface fill/mesh is no longer drawn for nullpen arguments. commit 5ffd26cdb1c4cccd7de84fe4b6297d5a599dc058 Author: John Bowman Date: Mon Jun 26 16:04:47 2006 -0600 Fixed segmentation fault if atbreakpoint isn't defined. Moved debugger.asy into plain.asy. commit 5c7f6e9573b220bd314fdabd7125837cb1472236 Author: John Bowman Date: Mon Jun 26 02:02:39 2006 -0600 Support compilation under g++-3.3.4. commit e8bd9c1cefa26e967527ea67557848c45c9e0e46 Author: John Bowman Date: Mon Jun 26 01:18:44 2006 -0600 Debugger support. commit 9a1d8ebaeced74c8a153a8cfc4676852623544f0 Author: John Bowman Date: Sun Jun 25 22:13:21 2006 -0600 Implement rudimentary debugger. Fix interrupts. commit e43db21f79abdef7e08101de0878690dbff29288 Author: John Bowman Date: Sun Jun 25 22:10:58 2006 -0600 Suppress stderr for gv workaround. commit 8ce72f2e5b1b30cb24fd00f98b9fb864a87a7dfe Author: John Bowman Date: Sun Jun 25 22:10:14 2006 -0600 Suppress stderr only for gv workaround. commit e63b5160040dbd16a42d1ed523e3e0577530c911 Author: John Bowman Date: Sun Jun 25 19:20:24 2006 -0600 Work around file descriptor problem with MikTeX 2.5. commit dbd425d4bd359edf6c23148c7616ce0631090b4b Author: John Bowman Date: Fri Jun 23 21:03:52 2006 -0600 Added Crop argument. commit fe386dfc9115d32344b5740960089de1fd6a58e3 Author: John Bowman Date: Fri Jun 23 21:02:52 2006 -0600 Added autoconf > 2.59 patch submitted by Chris. commit 146deafd826c99a659888fe7442932a769ed16c9 Author: Chris Savage Date: Fri Jun 23 18:06:33 2006 -0600 Added crop argument to limits to match xlimits. commit 4ba4b2c506db233267faab753776de776d4a43ab Author: Chris Savage Date: Fri Jun 23 18:04:34 2006 -0600 Corrected default crop argument of xlimits. commit 547c1670099a308a0cc8a7775663a4538cd2514f Author: Chris Savage Date: Fri Jun 23 17:08:52 2006 -0600 Added picture argument and use of picture scaling to graph(...) functions that did not previously do this. commit 8584e109743d459f49cb464afda3d3fe96e1636c Author: John Bowman Date: Fri Jun 23 06:12:58 2006 -0600 Changed Docdir to docdir; hopefully this won't conflict with next release of autoconf. Replaced GPL LICENSE with newer version (FSF forgot to bump the version number!). commit 8d111c60d5c8fee35160dfc0a8e53fd62b2e40e4 Author: John Bowman Date: Thu Jun 22 16:35:05 2006 -0600 Incremented version to 1.10svn. commit eb0de75fc9217b6a6b982157fad091a0e3f60bb8 Author: John Bowman Date: Thu Jun 22 13:52:31 2006 -0600 Make gv-3.6.1 bug workaround work with older versions like gv-3.5.8. commit 8ff9ab7deabaa2f6b7b117056fca0a0b8c50a8d2 Author: John Bowman Date: Thu Jun 22 00:19:45 2006 -0600 Updated to MSDOS gs8.54. commit a4d69da3b751629da5f08828082c7c466c079914 Author: John Bowman Date: Thu Jun 22 00:18:51 2006 -0600 Incremented version to 1.09svn. commit 0f24e94fcb206bece1df0307eb9c353c8e900a9a Author: John Bowman Date: Wed Jun 21 22:36:17 2006 -0600 Documented int[][] triangulate(pair[] z); for creating a triangular mesh. commit 349ef2c3f789eb2c5da5cc8e8e34a2ecfeb83fe7 Author: John Bowman Date: Wed Jun 21 21:46:43 2006 -0600 Fixed make distclean. commit 053152254fd41c1c83d83bfc1dd77623abf10d59 Author: John Bowman Date: Wed Jun 21 21:15:32 2006 -0600 Clean up unneeded files. commit f6a46cd80c1f5d8a8c438368f67bdb1a7ff45d0c Author: John Bowman Date: Wed Jun 21 18:13:50 2006 -0600 Fixed warning messages. commit 4eba8344080fd285665a7673788a5fba3559fa4c Author: John Bowman Date: Wed Jun 21 16:41:19 2006 -0600 Removed unneeded public modifiers. commit b8a19d515820713230513415a8eba377a9f3fce2 Author: John Bowman Date: Wed Jun 21 16:35:07 2006 -0600 Added pen colorless(pen) function that strips pen color attributes (useful for avoiding color mixing). Fixed stepping bugs in slide on overfull slide; added institution field to titlepage. commit c026098e41f0ae6c8568bb41f6146592a730c298 Author: John Bowman Date: Tue Jun 20 21:40:06 2006 -0600 Removed AC_FUNC_MALLOC and AC_FUNC_REALLOC as they seem to cause more problems than they solve. Fix help command by reverting broken Docdir change. commit d940254ae30f0b9a5492adb74cf04417784d1eac Author: John Bowman Date: Tue Jun 20 13:12:52 2006 -0600 Increased epsilon to fix corner cases. Suppress null labels. commit 5eb1c97104c77b32837f6e96d1ea96a9859bca3f Author: John Bowman Date: Sun Jun 18 22:32:31 2006 -0600 Incremented version to 1.08svn. commit 1e60c4d32988a7983d208fa0289e71df8bb56bfb Author: John Bowman Date: Sun Jun 18 21:34:40 2006 -0600 Fixed gv workaround. commit b3983451193bb29fa2fe492d385f408d4e159182 Author: John Bowman Date: Sun Jun 18 20:51:25 2006 -0600 Fix cygwin build problems. commit d56acb49f9f969cb5a940a1c7c48a5de241110f6 Author: John Bowman Date: Sun Jun 18 10:39:54 2006 -0600 Add and document contour labels. commit 640ad149422053ee618a7be7bf5aa9636076b88a Author: John Bowman Date: Sun Jun 18 01:37:48 2006 -0600 Updated documentation regarding type-dependent array functions. Fixed example. commit 84088bd182aa527acc3e8d0f0bfa6a56a97c2510 Author: John Bowman Date: Sun Jun 18 01:24:06 2006 -0600 Add imagecontour example. commit ff6887f2c5ab91209aba3956c4d25805f0ad6901 Author: John Bowman Date: Sun Jun 18 01:03:23 2006 -0600 Add improved and simplified version of Chris' palette modifications. commit fcbd8a3c0dcd0d6baa8e5ceaec1c65f823b8f65f Author: John Bowman Date: Sat Jun 17 16:53:00 2006 -0600 Fixed arcarrowsize. commit 7ef1b87ae9df597ccff3c44fd5d65ada8d2d86a0 Author: John Bowman Date: Sat Jun 17 16:49:51 2006 -0600 Fixed and simplified LU decomposition, solve, and determinant. commit 8f9a1b963c39eff23baa5f87d53d1317a780d145 Author: John Bowman Date: Sat Jun 17 04:56:37 2006 -0600 Simplified test. commit ceeda628c34eae8b29464876115aebc0aba7fc58 Author: John Bowman Date: Fri Jun 16 20:09:40 2006 -0600 Optimized solve and inverse. commit f1129650fdf1e1b9a3b9a0d43b3d6979b7fbf501 Author: Radoslav Marinov Date: Fri Jun 16 14:01:41 2006 -0600 Added LU decomposition instead of Gauss-Seidel method in solve. Gauss-Seidel method is still used for finding inverses. Added a test for both. commit 973bab339bb76e8373ad05c952946b826453f035 Author: John Bowman Date: Thu Jun 15 16:33:32 2006 -0600 Renamed Fill filltype to FillDraw and added Fill filltype that only does a fill. Fixed arrowsize capping code and added arrowsizelimit. commit 3b257884e63a16d5f3c488d5ed774acb7f31d5a1 Author: John Bowman Date: Thu Jun 15 14:41:13 2006 -0600 Renamed readable to restricted. commit 651ae218ff630152e4d03bf44b6d5be20e6f47a7 Author: John Bowman Date: Wed Jun 14 15:55:06 2006 -0600 Fine-tune logo. commit 7f1cf6db7f42d205226c05742a347c09701ff4bc Author: John Bowman Date: Wed Jun 14 00:15:22 2006 -0600 Change defaultformat argument of PaletteTicks to "". Fix formatting issues. commit 3e2f27f3847471318a6568e6cda79c5e1b3e4188 Author: Andy Hammerlindl Date: Tue Jun 13 17:23:58 2006 -0600 Added readable keyword, made public the default permission. commit 5dd1e7f9b4440e235a3d77d591c683b8a4c99b55 Author: Radoslav Marinov Date: Tue Jun 13 14:49:16 2006 -0600 Updated documentation for contours. commit 5ef02318e225d6f75bbddb01866f7efe278b92cf Author: John Bowman Date: Tue Jun 13 13:14:18 2006 -0600 Optimized postsorting of triangulate routine. Simplified contour interface. Added nonuniform contour mesh example. commit 9643e0dc524184c8285d73c2351976e5a98f5a11 Author: John Bowman Date: Tue Jun 13 12:34:14 2006 -0600 Make arrowhead and arrowheadbbox public to allow them to be overloaded. commit 9ad6ed85d523118ea068a22769f72d587dda8d2a Author: Radoslav Marinov Date: Tue Jun 13 11:10:27 2006 -0600 Added non-regularly spaced contouring. commit f227e558df95e61472134119242ad9feadb93875 Author: John Bowman Date: Tue Jun 13 01:00:48 2006 -0600 Use random pair for overwrite moves when align=(0,0). commit b257abdab1f08e55f01aa5570a05e785dde0e40b Author: John Bowman Date: Tue Jun 13 00:59:12 2006 -0600 Formatting. commit 8684d471b3697c1630abc8b06bfb74506b49c9ff Author: John Bowman Date: Tue Jun 13 00:54:17 2006 -0600 Fixed secondary logarithmic axes. commit 0346bdb77d0dc2da9d7cf7b8f660f5e487472951 Author: John Bowman Date: Tue Jun 13 00:34:56 2006 -0600 Fixed count computation (for endlabel=false). commit fc50cfec9594716a63f4d6708e3e6dadb75dabfa Author: John Bowman Date: Tue Jun 13 00:25:17 2006 -0600 Fixed alignment of rotated tick labels. commit 2823b5e4594cc35dbf382941754006bea86aa9c4 Author: John Bowman Date: Mon Jun 12 22:37:10 2006 -0600 Implemented more efficient guide collection algorithm. commit d3e000399ca900690fbe10cc7f99820c835f7bb2 Author: John Bowman Date: Mon Jun 12 20:33:17 2006 -0600 Added string option to assert. commit 1fd671831ef34a2e1114bf08a061ff9985c373e0 Author: John Bowman Date: Mon Jun 12 20:30:55 2006 -0600 Standardize "could not load module" error message. commit 51889939c120a4ca97af149784c217ceb7b06115 Author: John Bowman Date: Mon Jun 12 20:29:02 2006 -0600 Use most up-to-date verbose setting for traceback. commit f7f07a661d8b1f8401949d437dac738a7de61050 Author: Radoslav Marinov Date: Mon Jun 12 10:23:59 2006 -0600 Removed copying of unused variable in triangulation routine. commit c80e76f924a4611e1ce9c9b6e11e3bcd7f92d58f Author: John Bowman Date: Sun Jun 11 14:05:28 2006 -0600 Removed executable flag. commit 59f5f5a6ae7a00dea7b006404c1e2881df118c93 Author: John Bowman Date: Sat Jun 10 15:45:17 2006 -0600 Make currentprojection public. commit 29d5586ceb7a1aef6e782a4d124bf3bd672b5575 Author: John Bowman Date: Sat Jun 10 15:42:22 2006 -0600 Import three as public so that currentprojection can be overridden. commit 6ed73746146901f100fd6ecb07a3fe0c8ee549ee Author: Andy Hammerlindl Date: Sat Jun 10 13:55:29 2006 -0600 Added addSaveFunction to extend save and restore. Moved projection code to three.asy. Handle degenerate cases in lookAt(). commit 82ecef1191a366ad0f0b0508663cc5ca013fe4b9 Author: Andy Hammerlindl Date: Sat Jun 10 13:51:57 2006 -0600 Noted built-in modules. commit 25751222b9f06612b95690c9607aff0be31b8ce2 Author: John Bowman Date: Fri Jun 9 22:16:41 2006 -0600 Removed unused subtraction. commit 9981e0a4273b280d7edf66ad2d121c3b7ec7d620 Author: John Bowman Date: Fri Jun 9 22:05:53 2006 -0600 Fix overhead/underhead views. commit d627684544274d7cf3670616a96cd687a80b05d0 Author: John Bowman Date: Fri Jun 9 16:49:33 2006 -0600 Added up argument to lookAt; remove lookAtOrigin in favour of lookAt(O,...). commit 4c9fc4ebfac5c393e8cbfa0c22a2ae32fab47d6b Author: John Bowman Date: Fri Jun 9 12:21:26 2006 -0600 Simply support for custom projections. Reverse arguments of lookAt for clarity. commit f0648e6bf0a78e245f949a6aae289aef6b99b0bd Author: Radoslav Marinov Date: Thu Jun 8 13:49:56 2006 -0600 Fixed a problem with triangulation. commit fb2650817ca533532783708b22602a8b5b85c8d0 Author: John Bowman Date: Wed Jun 7 21:41:09 2006 -0600 Fixed typo in configuration instructions. commit 869f515dc87594e6b50fa2609847ffe4e4facff4 Author: John Bowman Date: Wed Jun 7 17:00:16 2006 -0600 Add Delaunay. commit f200d75273e0bfb0f7ae0bdab84714c45a462ee2 Author: John Bowman Date: Wed Jun 7 16:58:54 2006 -0600 Added Paul Bourke's Delaunay triangulation routine. Removed unneeded copyArray from inside. commit 772fbb1edbde73c41403365263a2adf06b08a443 Author: John Bowman Date: Wed Jun 7 14:22:18 2006 -0600 Fixed typo regarding cone vertex. commit 88e0cf1bdfadaea42f1f660ea8a79fe43ce0695a Author: John Bowman Date: Wed Jun 7 14:02:03 2006 -0600 Fix configuration problems. commit 27e61ce6967c6650650287430cf37e5f6efbb5fc Author: John Bowman Date: Wed Jun 7 03:25:06 2006 -0600 Remove docdir. commit b655d72e4a0551596632fbd31b5128322450b454 Author: John Bowman Date: Wed Jun 7 03:10:45 2006 -0600 Remove unused docdir operations. commit 9610dd75d92ba49c9e448425ea9aa66eef84f0a2 Author: John Bowman Date: Wed Jun 7 03:05:30 2006 -0600 Implement work around for backwards-incompatible command-line options of gv-3.6.1. commit 1c99f965ca672e7a581ad72cb440454e2328b0fc Author: John Bowman Date: Wed Jun 7 02:47:32 2006 -0600 Make docdir if it doesn't exist. commit ea5049ca5be8b6fe15ad71804eaa69363b374320 Author: John Bowman Date: Wed Jun 7 02:27:37 2006 -0600 Fix default configure documentation directory setting. Document inclusion of Asymptote in Fedora Core Extras project. commit db803d3c1d07e1494e24a197a02a6968e3bc5df1 Author: John Bowman Date: Wed Jun 7 01:40:43 2006 -0600 Added --with-docdir=PATH configure option. commit 8cf4582ac520c17579da3f75c57b2e4001759b7b Author: John Bowman Date: Tue Jun 6 23:12:16 2006 -0600 Add object structure for handling frames and Labels on an equal footing. Add a pack routine for building compound frames from a list of objects. Simplify flowchart interface and example; fix frame/Label packing. commit cea422aaa3c107040e20983f2918ead70fb61293 Author: Radoslav Marinov Date: Tue Jun 6 14:46:11 2006 -0600 Added slopefields module. commit 5e6f5135cc6c798defa0ef962b90bc44f120259a Author: John Bowman Date: Tue Jun 6 04:10:20 2006 -0600 Fixed alignment problems, standardized usage. commit 9b09a4901061fe9d5092a8ccb369d1f8b25450e7 Author: Steve Melenchuk Date: Mon Jun 5 12:13:22 2006 -0600 Repair inconsistency in box height being used for vertically centering the header text in flowrectangle. commit 009f43ccc83a73ac803878ac83351593a2acc157 Author: Steve Melenchuk Date: Mon Jun 5 11:52:27 2006 -0600 Tweak vertical margins on flowrectangle with header. commit eac4e8394435700da38568335cb6c3a9dfb7d8c9 Author: Steve Melenchuk Date: Mon Jun 5 09:31:06 2006 -0600 Adjust margins on flowrectangle (both with header and without). commit 63a2536150751be2feafc4457d8e6402fbe29b58 Author: John Bowman Date: Sun Jun 4 21:49:17 2006 -0600 Make makepen fill nodes; fix infinite loops. commit 844fd281ea372e25b043a6e899e8ee32ffa869ba Author: John Bowman Date: Sun Jun 4 14:49:17 2006 -0600 Added missing pen arguments in calls to hatch. commit bd06d2617aa5c40b9a7b7e13eaa3cd6f2c35d24c Author: John Bowman Date: Sat Jun 3 08:04:31 2006 -0600 Fixed documentation of PaletteTicks. Renamed ngraph argument to n for consistency. Renamed straight(path) to piecewisestraight(path) and moved to runtime.in. commit 3aba60d261891a8a6aea2f45d1ba81411fea0470 Author: John Bowman Date: Fri Jun 2 16:20:34 2006 -0600 Draw on frame f. commit 45ce2b17d76b55a1612548fbaec345dc1b21b161 Author: Andy Hammerlindl Date: Wed May 31 13:51:33 2006 -0600 Clarified the non-behaviour of top level static modifiers. commit a74dcf0f7b3e963af33e33071fc38c6afb2b30b3 Author: Andy Hammerlindl Date: Wed May 31 13:42:21 2006 -0600 Added warning for top-level static modifiers. commit 54baf1109570f092424b389f6059c87a1bb74310 Author: John Bowman Date: Wed May 31 12:45:50 2006 -0600 Added flowblock initializer; removed unneeded new picture initializers. Added authors, improved indentation. commit d9198ced6bdf4ff2fab4bc8a58905656a93aa3f2 Author: John Bowman Date: Wed May 31 11:54:36 2006 -0600 Make cputime return a structure. commit 78e73f71620d81fc555f4c27158b75290cb409c2 Author: John Bowman Date: Wed May 31 11:53:38 2006 -0600 Removed unneeded CFLAGS. commit 07b2003ee31ecc0df02a550d0f9705524cc5466a Author: John Bowman Date: Wed May 31 10:34:10 2006 -0600 Fix texinfo dependency. commit d5597dbdbc87dd6f48a7e628eecde5cfb95c6463 Author: John Bowman Date: Wed May 31 10:21:34 2006 -0600 More info updates. commit 649b4aec2d15a36e686e98b30ef91fb7f774363a Author: John Bowman Date: Wed May 31 07:03:42 2006 -0600 Add cputime() function. commit f545c026d79b3cf8059a96200521bd73be1d1dd4 Author: John Bowman Date: Wed May 31 06:24:26 2006 -0600 Use -O3 when building rpms. commit dbd641c869d86b02b6ba3153c41cbd625a13221a Author: John Bowman Date: Wed May 31 06:13:43 2006 -0600 Fix picture scaling computation in dimension example. commit a083bff3445bf9134c9cc5e4020c38f213a6b715 Author: John Bowman Date: Wed May 31 05:18:53 2006 -0600 Improve diagnostics. commit 7b20750384ac20389e1849e32a22c6c4c929f08d Author: John Bowman Date: Tue May 30 01:18:50 2006 -0600 Removed info dir entry in %files section; makedepend should respect cflags. commit 010f667be0917e8ea63c38bc0b894fc8ee8d82b8 Author: John Bowman Date: Tue May 30 00:53:41 2006 -0600 Use make install-all in rpm spec file to install info pages as well. commit 000cb4d5d8afababec8806b7b439143a0389a5ad Author: John Bowman Date: Tue May 30 00:53:15 2006 -0600 Fix make uninstall. commit 60cacc6f428142cb91f9c3e54ae1c4cc5b73d2d7 Author: John Bowman Date: Tue May 30 00:28:36 2006 -0600 Fix installation changes. commit 98f69f91a7c55ce3a90cdbe800365124e6137292 Author: John Bowman Date: Mon May 29 23:58:30 2006 -0600 Update example to use new mesh resolution names. commit aac6c630f447abcd6880c0ae38add2bb8c32e63f Author: John Bowman Date: Mon May 29 23:57:15 2006 -0600 Fix another relative path installation problem. commit 24e32f701448ae0abd7e332aab053bf60d5c062e Author: John Bowman Date: Mon May 29 23:47:36 2006 -0600 Fix installation of system asy files. commit 08b522ff4cabbdaaf70de0c14eddc61e12755b98 Author: John Bowman Date: Mon May 29 23:40:00 2006 -0600 Fix cxx warning message. commit f620740a5af8135c70fbd4e81bd6361cfb64bdc0 Author: John Bowman Date: Mon May 29 23:38:33 2006 -0600 Renamed contour examples. commit fcbd51eb488444cc34e8a967ee73d22b0f3554a4 Author: John Bowman Date: Mon May 29 23:33:18 2006 -0600 Simplified contour interfaces by implicitly casting pen to pen(real). commit 32a0c4c021e8faa02e52de3403d52b0fc4857ad6 Author: John Bowman Date: Mon May 29 22:06:37 2006 -0600 Change package group; request texi2dvi; install asy-init.el. commit 12fbe90c8826f0a4bdd37d53051d1fcd7377e524 Author: John Bowman Date: Mon May 29 22:02:14 2006 -0600 Add emacs/xemacs init file for rpm installation. commit ca219dfe286fe14588199316b44a516aed97ebf2 Author: John Bowman Date: Mon May 29 22:01:05 2006 -0600 Move include shipout earlier. commit 1f2e802856fabc690a106486a3ba4139963e7b57 Author: Radoslav Marinov Date: Mon May 29 15:46:10 2006 -0600 Added new interfaces to contour.asy commit 04c13ec23cf6ab805a13097218c21860a571be28 Author: Radoslav Marinov Date: Mon May 29 15:31:48 2006 -0600 Added basic documentation for contours. commit a03b794e15756e3e0459f4601851d2eef218bc0d Author: John Bowman Date: Sun May 28 22:40:13 2006 -0600 Minor optimizations; standardized mesh arguments (n -> nx, m -> ny). commit af0349baa883f68bdc064f5c20b921880ce4431f Author: John Bowman Date: Sun May 28 18:07:12 2006 -0600 Further optimizations obtained by sorting contour array. commit d5e04e1cee076e6fa542899344643ab02e63ae36 Author: John Bowman Date: Sun May 28 13:12:14 2006 -0600 Optimize. commit 5956312549528c37d03ed6a6aa638f41d64cd72c Author: John Bowman Date: Fri May 26 22:19:37 2006 -0600 Add Jose's patch: list directories in %files section. commit 5bf4a571d99182f39cbf8c7089e13497c8a6e31d Author: Radoslav Marinov Date: Fri May 26 15:32:06 2006 -0600 Fixed a minor bug and added an additional interface option. commit 2dc5e703eafd44944c9056defebcb7f0d62cc4a7 Author: John Bowman Date: Fri May 26 15:12:37 2006 -0600 Make pen argument a function. commit 4aafdb65a959e771b184dc6ffd9ffdf58af6ac1d Author: John Bowman Date: Fri May 26 15:02:09 2006 -0600 Standardized signatures; support contours of matrix data as well as functions. commit a05043c0414b96b2e277655e781c4468a7c012fd Author: John Bowman Date: Fri May 26 11:36:37 2006 -0600 Make images and shading respect -gray, -rgb, -cmyk, and -bw. Make palette.asy use grayscale with -gray. Replace bool mono by settings.gray || settings.bw. commit 492d0924cd96e9fb43f5b7c42f7b42e6f7db8164 Author: John Bowman Date: Fri May 26 08:24:01 2006 -0600 Add date arithmetic routines: time(int seconds, string format=""); seconds(string t="", string format=""); Make time() return the current time in the default UNIX format. commit 0d6b7c6cf6f5f120e7a06024eaf8186aa821c3ac Author: Radoslav Marinov Date: Thu May 25 15:35:50 2006 -0600 Inserted a space between operator and .. . commit 5f1fdbef839ebb2692ca7e7aa3b6cacfa1a2bc7e Author: John Bowman Date: Thu May 25 14:50:32 2006 -0600 Changed 1.07cvs to 1.07svn. commit fb08ae2efca0b373fae51e0d835f9b45e8a8d2ca Author: Radoslav Marinov Date: Thu May 25 13:17:55 2006 -0600 Fixed a formatting issue and a minor bug. commit 18489c1c24083cb89668b9d64893301fb2dc6a2d Author: Radoslav Marinov Date: Thu May 25 11:29:03 2006 -0600 Contour.asy now can choose interpolation operator; default is --. commit eacb2efc49b51b090ce2164ff13c4801e75de347 Author: John Bowman Date: Thu May 25 10:43:46 2006 -0600 Added example of log2 graph. commit c7cccaf9c785a2d500880d5fc98a5f048602697d Author: John Bowman Date: Thu May 25 10:32:56 2006 -0600 Fixed bug in YZero. Handle log graphs bases other than 10. commit 6d948eaee01351978780cd68c59885096bc01a02 Author: John Bowman Date: Thu May 25 05:00:23 2006 -0600 Rename array virtual pull function to delete; handle case with negative argument. Add virtual insert function for arrays. commit e8c13b250ffb7d76bad5771584f374c077d66aca Author: John Bowman Date: Thu May 25 04:20:44 2006 -0600 Added virtual pull function for arrays. commit 329a88e82d4993a278c8672b516fe9b035b7ffba Author: John Bowman Date: Thu May 25 03:44:18 2006 -0600 Fix currentpicture.empty() test. commit 0d0dac1cd60be60a0076b0be059bf10096ee2423 Author: John Bowman Date: Thu May 25 03:07:52 2006 -0600 Standardized argument names. commit 5a8131d6c2bc8bea7859c6cf58d6ba52966aa882 Author: John Bowman Date: Thu May 25 02:55:26 2006 -0600 Formatted. commit e4997b1c1f87258e77414236b182b99b3637f8d5 Author: John Bowman Date: Thu May 25 02:30:13 2006 -0600 Fixed longitudinal skeleton when c != O. commit fcd1d170401623022db843402ad7cb29a4bbd590 Author: John Bowman Date: Thu May 25 02:28:57 2006 -0600 Minor optimizations. commit d214a8ab29f6f395ae29b142f04f0bfaadbec9f1 Author: John Bowman Date: Thu May 25 02:27:52 2006 -0600 Check colorspace argument for all forms of shading. commit cf6077824d89ed8864496d545b6ce584ed8c0abe Author: John Bowman Date: Thu May 25 02:26:56 2006 -0600 Added 3d axes routine. commit 289d41c8ae0a0bcc24fd160a0f1663d2dc7ec5e1 Author: Radoslav Marinov Date: Wed May 24 15:45:34 2006 -0600 Now uses arrays. commit 6c7e8af3ae2984f1cb20bece75a584bbffda3d5a Author: John Bowman Date: Wed May 24 15:08:08 2006 -0600 Handle subpath arguments beyond boundaries. commit 3d113075dbb9f217a024bf099a538b168b78accc Author: John Bowman Date: Wed May 24 11:25:27 2006 -0600 Added outline(). commit 500936a35c334a1d9e7f196819a57462e2a7ae5d Author: John Bowman Date: Wed May 24 01:16:30 2006 -0600 Added reverse(triple[]). commit 072a649884bca1338c9cc74b147e7bee261f937e Author: John Bowman Date: Wed May 24 00:28:55 2006 -0600 Minor optimizations. commit 9ff513320c61a5d555c6844a206f7b7f095a5d11 Author: John Bowman Date: Wed May 24 00:27:59 2006 -0600 Simplified code. commit f1429ac3504544b7d4786f6e6edd80ea656b7f74 Author: John Bowman Date: Tue May 23 22:32:50 2006 -0600 Updated to mention Subversion instead of CVS. commit e4ee3b0940c364a5c241bc96dbfe4c6b7aaa51cc Author: John Bowman Date: Tue May 23 22:27:31 2006 -0600 Updated documentation for Subversion. Fixed list of autogenerated files in slidedemo.asy. Added missing file. commit f1b30214cf29bcd231024f5f574991ddb7e0d5d6 Author: John Bowman Date: Tue May 23 16:36:20 2006 -0600 Clarified comment about duplicate guides. commit b79cd62cf321feb649d66c333e1a4b534b795625 Author: Radoslav Marinov Date: Tue May 23 14:44:18 2006 -0600 basic .. routine commit e7706f3e6130165c7e777a4d52af33154143aff9 Author: John Bowman Date: Tue May 23 11:33:30 2006 -0600 Improved formatting. commit eed452cd06ba19e12fd9a39b933578e654ac49ff Author: Radoslav Marinov Date: Tue May 23 11:26:18 2006 -0600 minor updates to contour.asy commit 5a36430d4a78004a93b423ae9aa40621226d926d Author: John Bowman Date: Tue May 23 10:46:50 2006 -0600 Fixed typo. commit 854961693a69d0cb1b415d03ea2606be4daa890b Author: John Bowman Date: Mon May 22 16:23:43 2006 -0600 Incremented version to 1.07cvs. commit 996168032abd9a766ce2d783be17354747617e5c Author: John Bowman Date: Mon May 22 08:36:57 2006 -0600 Added figuremattpen optional argument. commit eea7a0e9ded8118d99fff985a24dc35445ed9e6d Author: John Bowman Date: Mon May 22 08:36:14 2006 -0600 Fixed syntax. commit a8b82e25d7902945f2081705fb4b3081b1cb7f79 Author: John Bowman Date: Mon May 22 00:17:35 2006 -0600 Renamed old flowchart.asy example to advection.asy. Formatted flowchart.asy base file and example; standardized spellings, etc. commit 8dd6575b7756cc5f90a55f1b1dfadbd58d51cc0f Author: John Bowman Date: Sun May 21 23:38:42 2006 -0600 Updated. commit 631c41e5ff3247612218189a5ccd2972e85ba48f Author: John Bowman Date: Sun May 21 23:38:05 2006 -0600 Restore TeXpipepreamble and TeXpreamble after eval(embedded=false). Restore settings between multiple file runs. commit 7be85d3918e2a665b3723486f43b59e7274c4e1d Author: John Bowman Date: Sun May 21 23:35:52 2006 -0600 More endl to newl changes. commit 4bc38d1758d0601ea5747592ec6b465ab388d492 Author: John Bowman Date: Sun May 21 23:34:29 2006 -0600 Allow alignment checking to be disabled with -DNO_CHECK_ALIGN. commit bea2825f47aa9136c29aa1cdf88ef0f75ccd4455 Author: Steve Melenchuk Date: Sun May 21 14:00:13 2006 -0600 First version of the heavily-cleaned-up (originally externally contributed) flowchart module. A (very simple) demo has been added into examples and the documentation has a section on the module (could the docs be improved for it?). commit f84251f8cf64885ef16c1d3c10ec2ae74d5823cd Author: John Bowman Date: Sun May 21 02:39:14 2006 -0600 Changed quiet=false option to view=true in shipout (backwards incompatible, but rarely used). Removed unused execute(string s, bool embedded=false) function. Added void asy(bool overwrite=false ... string[] s) to conditionally process each file name in array s in a new environment. Moved margin argument of figure in slide.asy to just after options. Make slidedemo.asy generate required files in case they don't exist. commit 5a2f592641f2a82b86b6b73a103ff2113bc39374 Author: John Bowman Date: Sun May 21 02:02:42 2006 -0600 Fixed segmentation fault with a future eval after an eval throws an exception. commit 9a8e1d66275b73f67d167b8f60105b2550df4461 Author: John Bowman Date: Sun May 21 00:38:22 2006 -0600 Make titlepage and title by default call newslide, unless the currentpicture is empty. Added reverse video option to slidedemo.asy. Add an argument to newslide to allow stepping to be turned off for that slide. Updated slidedemo example. commit a47eb26bec02902d3efcd94997b96e5a01fe701b Author: John Bowman Date: Sun May 21 00:34:16 2006 -0600 Add optional x and y margin arguments to Fill. commit 181ab2a6b5811ce4f76eb642be9337cd3fdd66fc Author: John Bowman Date: Sun May 21 00:29:44 2006 -0600 Allow -u to be specified multiple times on command line. Make "open" the default pdf viewer for MacOS. commit 38c9138c931e1f2c6808c54a078e1308be30da8c Author: John Bowman Date: Sun May 21 00:28:15 2006 -0600 Added asycolors.sty package to make LaTeX aware of CMYK versions of predefined Asymptote colours. commit f0ddb7b579a89d99e8dd649548e4de4c064247ed Author: John Bowman Date: Sun May 21 00:24:42 2006 -0600 Fixed -outformat pdf for papersizes like a4 with nonintegral bp dimensions. Improve performance by avoiding unnecessary flushing of output stream. commit c8dd84f63624e80aa56b358c21706ada90cc48a8 Author: John Bowman Date: Fri May 19 17:24:21 2006 -0600 Make fft(real[]) a nop when not configured with fftw. Handle fft(new real[]) gracefully (returns an empty array). commit f9b882aa5d5545bed95c271067ed6422339a4543 Author: Radoslav Marinov Date: Fri May 19 10:31:11 2006 -0600 contour.asy now with guides, supports dashed lines commit e9f6e6bbed1e61cc3a30f8b9164b8880e3a4a541 Author: John Bowman Date: Fri May 19 01:09:38 2006 -0600 Incremented version to 1.06cvs. commit c6deca9111977391e90151813a05cc2fef788649 Author: John Bowman Date: Thu May 18 22:42:16 2006 -0600 Reduced default authorpen fontsize. commit daf49b72e56d986b53fcc3ee11ffec4c6114b43c Author: John Bowman Date: Thu May 18 22:21:02 2006 -0600 Added normal argument to Arc. Standardized arguments to revolution. Updated documentation and examples. commit 79d6d9730dedab0fca16651ce2c0b1f61bc97405 Author: John Bowman Date: Thu May 18 13:43:12 2006 -0600 Added determinant test. commit 4aa6fc20712ea101dc4d5a34d359d2a0be19b83f Author: John Bowman Date: Thu May 18 13:04:15 2006 -0600 Removed unnormalized epsilon from determinant. commit 5eda890c8fc4f08d4fade2e20b773bf47cc9aa31 Author: John Bowman Date: Thu May 18 12:48:10 2006 -0600 Updated documentation: real a[] now constructs internal functions of real[]. commit 56f80f8eaa6efa7e5b313771197a6b8dd43a1da6 Author: Andy Hammerlindl Date: Thu May 18 12:17:29 2006 -0600 addOps for int x[] now implemented. commit 81e637b56a0bf064ade66eb783946ac464233fcd Author: Andy Hammerlindl Date: Thu May 18 11:55:07 2006 -0600 Now add operations for all variable declarations of new arrays and functions. Removed old code. commit 1170b2cd6b0f1e2b5f4bbf6ab352a764a3aa32c8 Author: John Bowman Date: Thu May 18 04:14:06 2006 -0600 Explicitly document -u stepping=true. commit 2fda9b050cd48bed37c4e253c8ad4a1a6a7cb6d0 Author: John Bowman Date: Thu May 18 03:53:10 2006 -0600 Fixed cxx warning. commit 8dd3e7faa0ffc2beb933f5eb8bc2b9aa0b34ab0b Author: John Bowman Date: Thu May 18 03:29:48 2006 -0600 Implemented revolution struct in solid.asy for constructing, drawing, and filling surfaces of revolution. Added surfaces of revolution examples. Ported precontrol and postcontrol resolution fixes to three.asy. Added 3D version of relpoint functions. Fixed normal(path3). Updated documentation. commit 08ebff5c9945585178e6a5a23648a297f9f8bb20 Author: John Bowman Date: Thu May 18 01:03:04 2006 -0600 Added example showing how to scale only selective dimensions. commit d9a8fc9d1ce7884a95320fe1fbcd8bf4f83dcddd Author: John Bowman Date: Wed May 17 23:44:26 2006 -0600 Documented how to call Asymptote from Python. commit 17e102d2ca2835dd8bfb691d4e483a4630288271 Author: John Bowman Date: Wed May 17 23:07:49 2006 -0600 Make location of slidedemo explicit. commit fbe3ea488a0e1f27effe2111057103dccd0d6052 Author: John Bowman Date: Wed May 17 22:46:32 2006 -0600 Reduce infinity to avoid floating point exceptions with --- operator. commit 93dcd881e5b4476ffe07fbf4e7a0ee9199dcf625 Author: John Bowman Date: Wed May 17 22:44:19 2006 -0600 Allow stepping to be enabled from the command line: -u stepping=true. commit 5967b8c34f40538a7aa760c7549eef2e2ae74aa1 Author: John Bowman Date: Wed May 17 22:39:49 2006 -0600 Added y and z autoscale arguments to scale(). commit 383ad013af16211ec6fabeb8c8538d0dd2516f9d Author: John Bowman Date: Wed May 17 22:15:27 2006 -0600 Added example showing how to label an axis with an arbitrary string. commit 14eb8a4d6ecf031dd09ae712eab638dca6aa75fa Author: John Bowman Date: Tue May 16 01:40:57 2006 -0600 Improved test diagnostics by using internal assert(bool) function. commit 1a68bcd0d76c42dc0e9aae4b9b94be57f1612e53 Author: John Bowman Date: Tue May 16 01:37:55 2006 -0600 Added assert(bool) function. commit 6db26721184b3d768d88c67d81cda0483f69ea35 Author: John Bowman Date: Tue May 16 01:36:19 2006 -0600 Fixed cubicroots when R=0. commit 1e633ec2b48093ddebc77de17300b12fcce7d01d Author: John Bowman Date: Tue May 16 01:34:48 2006 -0600 Flush output stream on errors. commit a0feb5badead646e4e5ced4b9ac5397fa1986f8d Author: John Bowman Date: Mon May 15 00:45:38 2006 -0600 Added offset argument to linetype. commit 417c387ca3207020f2e6118773b2492f8ce62d62 Author: John Bowman Date: Sun May 14 14:54:35 2006 -0600 Remove unused argument. commit 6eae114c9ac74bd8e154dc097c73e11ba5571b76 Author: John Bowman Date: Sun May 14 14:48:42 2006 -0600 Move GSL functions into a separate module named gsl. commit f3c570f260ea6bdd68366d262203160d58d15394 Author: John Bowman Date: Sun May 14 14:37:04 2006 -0600 Formatting. commit 3d57dc5a3d4e2aacce91088294f13115b2e54d1f Author: John Bowman Date: Sun May 14 11:29:08 2006 -0600 Removed aclocal and autoconf since Asymptote is distributed with configure. commit c4a7ec511adaed6a1bc966de48503a10c943ba7e Author: Andy Hammerlindl Date: Sat May 13 12:33:45 2006 -0600 Moved addOps for types to builtin.cc. Added support for builtin structures. commit 953b39d4f44cf9a23f623c0f01c26451b557aa95 Author: Andy Hammerlindl Date: Sat May 13 09:52:19 2006 -0600 Fixed typo. commit b232db20cc3cc1a9aafcb1030f14ee86f1750de4 Author: John Bowman Date: Sat May 13 00:53:22 2006 -0600 Removed quiet(bool) in favour of explicit setting. commit 44aa19ad3651fde5c45309d96f216d1a35020e13 Author: John Bowman Date: Sat May 13 00:20:07 2006 -0600 Updated man page. commit 839c7735f217563d6e0a5e2d0c7a7ed493c30f64 Author: John Bowman Date: Fri May 12 23:59:05 2006 -0600 Added RPM spec file, courtesy of Jose Pedro Oliveira. commit 45f04ae52790e8b3adc9a9e6f07a6d55c239f8e7 Author: John Bowman Date: Fri May 12 23:25:56 2006 -0600 Moved asy.vim and asy-mode.el back to /usr/local/share/asymptote, where they really belong. Also put asymptote.py here. Revert default asymptote documentation directory to /usr/local/share/doc/asymptote (removed recently introduced version dependency, which made no sense since the system directory doesn't depend on a version number either: version checking is done in plain.asy). Updated documentation (including new sourceforge cvs instructions). commit dfed1750cf52db95f0d38ed3e031565c37213bbb Author: John Bowman Date: Fri May 12 22:55:57 2006 -0600 Make Arc use degrees rather than radians. commit 411fe8ba53952d16e4d27d6de5d4325fd7d53872 Author: John Bowman Date: Fri May 12 22:54:38 2006 -0600 Fixed obliqueX and obliqueY camera positions. Make obliqueZ a synonym for oblique. Ignore spurious errors from longitude. Added missing (optional) normal argument to arc call. commit e01588feebf9585c9da7fbfe791f0d395b8da16c Author: John Bowman Date: Fri May 12 22:47:41 2006 -0600 Added clipping margin to unfill. commit c273826c1a2281a543103d2f463b1fd72065552b Author: John Bowman Date: Fri May 12 22:46:54 2006 -0600 Added Andy's getApplication bug fix. commit a4d1dd6e26a7384fe0fb8b1d987cd6bf930f164b Author: Radoslav Marinov Date: Fri May 12 15:50:17 2006 -0600 lines of length <80. handles multiple contour lines at once for efficiency. commit 186767d6435ce06ef92b6fc0c119615d2ab6842e Author: John Bowman Date: Fri May 12 15:03:59 2006 -0600 Renamed pen argument. commit baa95c93a27afef3f53b527e2e5a62d5af3fa4cb Author: Radoslav Marinov Date: Fri May 12 13:05:34 2006 -0600 added basic contouring routine commit cd72b2da3607d98aed4546caa20d6d21d717cd31 Author: Radoslav Marinov Date: Fri May 12 12:58:51 2006 -0600 added general determinant commit b1a94105507b3e256c7d9b0aef4bc41dc53bd6dc Author: Steve Melenchuk Date: Fri May 12 10:40:23 2006 -0600 More tests; these ones relate to transforms. commit 6d23e63e5dd82740f7865253f6262023ca7181a7 Author: Steve Melenchuk Date: Fri May 12 10:19:44 2006 -0600 Beginning to expand the arithmetic test. Now classifying as related to what type of data the tests are working with; each file contains several tests related to that type of data. commit c5273d2efcbd68b4a733fc70856cf62bd2b55e92 Author: John Bowman Date: Mon May 8 02:33:45 2006 -0600 Fixed quiet(bool); improve settings diagnostic. commit 0a26a23c326f69e2edcec6c0afbb1b0e09187baf Author: John Bowman Date: Mon May 8 01:50:15 2006 -0600 Removed Degrees and Longitude in favour of degrees(warn=false) and Longitude(warn=false). Moved Sin, Cos, Tan, aSin, aCos, and aTan to runtime.in. Renamed double to real in runtime.in for compatibility with asy code. Moved examples to subdirectory of documentation directory. Don't automatically strip binary when installing. Generalized DESTDIR support. Documented optional packages in INSTALL. commit b0dbd1691f873f66d2219275b176928bebf5ec13 Author: John Bowman Date: Mon May 8 01:36:48 2006 -0600 In dash adjustment, always respect scaling to penwidth (when requested) and draw terminator if close to arclength. commit 759d070b0ebf96f1464095f835c531c946527e9d Author: John Bowman Date: Sat May 6 21:39:22 2006 -0600 Improve ambiguous function signature diagnostics. commit 1241c3dc9554391c43910996334988d9e73816a0 Author: John Bowman Date: Sat May 6 21:35:50 2006 -0600 Turn of listvariables while reading config files. commit 41c68567f03d276a2dbacdc1c6cd389e9d3dc44b Author: John Bowman Date: Sat May 6 04:30:43 2006 -0600 Added Sierpinski gasket example. commit 8a12ce233a5ec25e336b04538ac1b60488e667b7 Author: John Bowman Date: Fri May 5 03:06:16 2006 -0600 Added obligueY projection. commit 5d68d40841e9d2f12fc0e1ea1287e5349b92a94c Author: John Bowman Date: Tue May 2 09:59:46 2006 -0600 Removed oneFileView setting in favour of a new setting multipleView, under control of batchView. Renamed pagewidth/pageheight to paperwidth/paperheight to agree with documentation. Handle cases where paperwidth or paperheight are smaller than corresponding picture dimensions. Handle nonstandard paper sizes when producing pdf files. commit 04789d6abd0fc17be052e915edb297d2341ec45b Author: John Bowman Date: Tue May 2 06:27:12 2006 -0600 Added realDigits (DBL_DIG). commit 86c2dd9a05adf698ab7a7095ac332511b5a8b3c9 Author: John Bowman Date: Mon May 1 21:50:09 2006 -0600 Added string string(real x, int digits) routine to cast a real to a string using precision digits in the C locale. Use string(real x, int digits) instead of the locale-dependent format function for postscript patterns. commit c2508a8c0413f0ddaae21617f48867ae70c4f54c Author: John Bowman Date: Sat Apr 29 07:37:10 2006 -0600 Fixed rotate(real angle, triple u, triple v) when u != 0. commit 3b962333a9e1eb767ffdb611926a5078d381cd67 Author: John Bowman Date: Fri Apr 28 08:08:24 2006 -0600 Added obliqueX projection. commit 44d07a1770b97dffacbb7a7cf854e1e71c631500 Author: John Bowman Date: Fri Apr 28 07:51:59 2006 -0600 Moved fftw header check back to original location. commit 8e8d7c47f290721fde640401472f93ee17022a0f Author: John Bowman Date: Fri Apr 28 06:51:52 2006 -0600 Added missing space after -lgc; moved fftw header checks to header section. commit b567c83e58107d42686526be3f9c7365535f1b52 Author: John Bowman Date: Tue Apr 25 19:29:36 2006 -0600 Apply dvips bounding box fuzz even when producing pdf format. commit 975d6a331bdb381b683cc2ce50a6130d69b2fc63 Author: John Bowman Date: Tue Apr 25 19:24:53 2006 -0600 Fixed argument reversal in signature of one of the add routines. commit 8c636e3bb19e6e72178e35c44aa0e4f1f58f10ff Author: John Bowman Date: Mon Apr 24 02:01:16 2006 -0600 Incremented version to 1.05cvs. commit f395220719b1e90ba1005e92f11c97ae43aa3bab Author: John Bowman Date: Mon Apr 24 00:42:48 2006 -0600 Fixed cxx warnings. commit 26f537049d2cc02c8e0db39d532c19806741b189 Author: John Bowman Date: Mon Apr 24 00:37:11 2006 -0600 Removed unused variable. commit d1b4f19de875de4a717f35670cf1c6ad95b61c06 Author: John Bowman Date: Mon Apr 24 00:03:05 2006 -0600 Move missing file flowchart.asy to correct directory. commit b511ab40d7775365e2771c8222d568378dcda35d Author: John Bowman Date: Sun Apr 23 23:53:36 2006 -0600 Make wce work even if configured with GSL library. Abort make if check fails. commit 7e1867eda3a4326131df1c34cb57ede404a4296a Author: John Bowman Date: Sun Apr 23 23:39:25 2006 -0600 Untabified. commit e22225fe83c49469134b3e57082d798d47060cce Author: John Bowman Date: Sun Apr 23 23:33:26 2006 -0600 Check also if first and second points are uncontrolled duplicates. commit 472aad1e896f59ec2e75b710412d2c08593b04e8 Author: John Bowman Date: Sun Apr 23 23:26:20 2006 -0600 Added parametric functions that accept an arbitrary sampling function. commit 959163958f72b505a48fc7c2a9b1f187384d4b01 Author: John Bowman Date: Sun Apr 23 11:56:09 2006 -0600 Updated poster example to use slide.asy. commit 95f24100042c4828f5dcb882d1f751f603cd91fc Author: John Bowman Date: Sun Apr 23 10:27:25 2006 -0600 Change user variable to a string. Document how arbitrary Asymptote code can be specified on the command line. commit 9dbf4485550c201dd3e81c96c74e90d329ca06ca Author: John Bowman Date: Sun Apr 23 01:24:45 2006 -0600 Added optional background and multiple figures to slide package. Updated documentation. commit 31b409d56aae03e957281fa004fbec0820f20796 Author: John Bowman Date: Sat Apr 22 23:35:38 2006 -0600 Replace infinities in userMax and userMin with boolean flags. commit 6314d3256681fd9e23db836413a4faa80d21b09c Author: John Bowman Date: Sat Apr 22 21:33:29 2006 -0600 Increased bounding box fuzz. commit 31b43d80995b29816e58a277e461b266e2c5d9fe Author: John Bowman Date: Sat Apr 22 21:26:28 2006 -0600 Updated call to add in slide.asy. Implemented fixedscaling(picture, pair min, pair max, pen) routine for using a fixed scaling to map user coordinates in box(min,max) to the desired picture size. Added UpsideDown orientation. Moved min and max of a real argument list to constants.asy. Always pass explicit pageWidth and pageHeight arguments to dvips rather than using the papertype. commit 6d070db2dbe5e1dd3b510d1542b391b68e205278 Author: John Bowman Date: Sat Apr 22 05:03:27 2006 -0600 Fixed dvips bounding box. Added texreset function to reset tex environment. commit a8d0b5c21e918a3fecbc3ab3957685f64640cd88 Author: John Bowman Date: Fri Apr 21 10:47:35 2006 -0600 Added general purpose real user command-line option. Legend skip is now based on the actual legend entry height, rather than on the fontsize. commit 7861589644a7a8180700b47f4e5f8630c99f6c99 Author: John Bowman Date: Fri Apr 21 09:52:06 2006 -0600 Added and documented texcolors and x11colors. commit 6963a617979e355beb5096ac7aacb709fa77da15 Author: John Bowman Date: Thu Apr 20 23:59:59 2006 -0600 Improved linetype adjustment to arclength for short segments. Added optional boolean adjust argument to linetype to allow one to disable linetype adjustment. commit 2821a5e49788fb4bf125b21f7994fdb066149144 Author: John Bowman Date: Thu Apr 20 20:48:40 2006 -0600 Documented pair Scale(picture pic=currentpicture, pair z) function for plotting in unscaled (graph) coordinates. Improved documentation of add for pictures and frames. commit a1a64c99b841d520289ff3ba05602ef4c9346c3a Author: John Bowman Date: Wed Apr 19 23:19:03 2006 -0600 Changed add and attach to take arguments in the same order as label, renaming "origin" to "position" and "dir" to "align". Removed the align argument of legend, which really belongs in the add/attach command. commit 6b07436f331c27ccf302e70b40d0cc6b3ae1644d Author: John Bowman Date: Wed Apr 19 22:54:16 2006 -0600 Fixed arrow alignment. commit ae71d0ff534aaa598eeecc4b2328f998e1bb3d12 Author: John Bowman Date: Wed Apr 19 18:42:40 2006 -0600 Fixed alignment of postscript and tex layers by working around failure of includegraphics command (from LaTeX graphicx package) to respect HiResBoundingBox. commit 7e4cec0e907ae3018a629f29f68dacf583b92e75 Author: John Bowman Date: Wed Apr 19 02:17:56 2006 -0600 Added Python module to allow access to Asymptote commands. commit d4133c9184e4d76ddb0a6ea683c00c83f61178a2 Author: John Bowman Date: Mon Apr 17 02:00:50 2006 -0600 Fixed clipping of remote labels near frame boundary by unfill. commit 67902a31a40b1959277d5087d6f67844d105d745 Author: John Bowman Date: Mon Apr 17 01:38:57 2006 -0600 Improved alignment of tex and postscript layers. commit 77a8a3526ebcaf4a06cace29826155cdaf383531 Author: Andy Hammerlindl Date: Sun Apr 16 16:10:47 2006 -0600 Added permission checking for types. commit a9d41b7349380bc7028e77a684f4d8515e45d782 Author: John Bowman Date: Fri Apr 14 15:19:52 2006 -0600 Make format="%" suppress tick labels for logarithmic axis. commit 9de768b204c984e75d21a5470f37fdcfef0e791d Author: John Bowman Date: Fri Apr 14 02:20:31 2006 -0600 Change standard name for salmon colour to lightred. commit 9ed799f848b51cb572112768198ce8282ed65ef6 Author: John Bowman Date: Fri Apr 14 02:13:08 2006 -0600 Fixed tension atleast (broken in autogenerated code since 0.96). commit e414d6dd897dd359b2517e7868424f0c9a89cf17 Author: John Bowman Date: Thu Apr 13 08:15:24 2006 -0600 Renamed "strong" colors to "heavy". commit 9537c34858bb44219b90550cf78e9b8a7c2a8c4b Author: John Bowman Date: Thu Apr 13 01:12:55 2006 -0600 Display named colours. commit 3a46a1a959f6dca2eb3d3ba701a0f080655741d7 Author: John Bowman Date: Thu Apr 13 00:53:19 2006 -0600 Documented and systematized named colours. commit a61d435ad972ab673ce8338765a3a4d7ac434d13 Author: John Bowman Date: Wed Apr 12 21:08:55 2006 -0600 Respect orientation. commit fe6173ecc4dc6b212b32e7443e1e59a67ed8ef7c Author: John Bowman Date: Wed Apr 12 01:36:26 2006 -0600 Improved implementation of slide.asy. Accept label(frame, Label). commit 2101d2a6059ac6c6333689662bbf2ebcdebd645f Author: John Bowman Date: Mon Apr 10 21:01:47 2006 -0600 Added subitem and automatic slide advance on overflow. commit c6ff6449ce3c1907f130d106a86fee9ec88ba74a Author: John Bowman Date: Mon Apr 10 16:15:55 2006 -0600 Slide presentation package. commit 1a2be9b262fa689fe39ed2fafbde8d8dd1f34c11 Author: John Bowman Date: Mon Apr 10 15:42:51 2006 -0600 Added default orientation variable (initially set to Portrait). Added custom pagewidth and pageheight settings. Moved transforms to runtime.in and Label.asy. Added tex usepackage(string) convenience routine. commit d7c889c669eb4bded0cec30ee293b336f500ef94 Author: John Bowman Date: Mon Apr 10 15:38:02 2006 -0600 Indicated default option values in man page summary. commit 1a6d1d682d620f1d29bc53a0ee69f8ba6ef81b80 Author: John Bowman Date: Sun Apr 9 15:00:12 2006 -0600 Added DESTDIR support: make DESTDIR=DIR will prepend DIR to the installation directories (intended as a temporary location to facilitate the build process only). Added -p option to install (and -m 755 to install asy and install xasy). commit 376cc0d3b0dc34f90d810be20a749dbb345ad88c Author: John Bowman Date: Sun Apr 9 14:51:32 2006 -0600 Fixed name of gsl header in message. commit 56c59eeb1698fdb88c28416048f0b6b47a924e0a Author: John Bowman Date: Sun Apr 9 10:13:40 2006 -0600 In tick bounds estimate, don't warn about unbounded picture scaling. commit 019fffe374c0564d5a640c7d0bd84f097486a2ae Author: John Bowman Date: Sun Apr 9 01:10:31 2006 -0600 Added selected special functions from GNU scientific library, when available (additional special functions can easily be added, on request). commit fed4cd36ff02754c21e628c4911ec5e0dc56cb6d Author: John Bowman Date: Sun Apr 9 00:42:37 2006 -0600 Added Ticks specifier that draws ticks on both sides of path. Fixed miscellaneous errors in the documentation. commit 763c0584aed043adc4439cbb479b37fe110b928c Author: John Bowman Date: Sun Apr 9 00:39:32 2006 -0600 Renamed zeta to unityroot for clarity (and to avoid confusion with Riemann zeta function). commit fe98b1be9e75b114007f196618347a12159df32a Author: John Bowman Date: Sun Apr 9 00:37:42 2006 -0600 Moved newpage() routine to shipout(). commit bc27d517da082381cd412dfffd7a0d0f2876bf1b Author: John Bowman Date: Sun Apr 9 00:36:59 2006 -0600 Added real lineskip() routine (returns lineskip of currentpen). commit e8233efdc79fcc794af3ef00caf0d452b60f79a1 Author: John Bowman Date: Sun Apr 9 00:35:33 2006 -0600 Fix name of fontsize lineskip argument. commit 477a3f338e05e13d53302eeb2dcf7204e49dc85c Author: John Bowman Date: Sun Apr 9 00:34:30 2006 -0600 Remove reliance of replacement readline routine on strdup. commit ce6dcb4d7b09e071875afd1fc1862ad616debc26 Author: John Bowman Date: Thu Apr 6 08:05:17 2006 -0600 Use turn-on-font-lock for Xemacs. commit a4256b4b6849a2656787c5ae4a37717347f0405b Author: John Bowman Date: Wed Apr 5 21:29:56 2006 -0600 Make asy-mode.el ignore global-font-lock-mode for Xemacs. commit 1f6a7d9232e47d07585eef364e48588638f60511 Author: John Bowman Date: Wed Apr 5 21:24:09 2006 -0600 Added locale support and ', I, and F format specifiers. Moved miscellaneous settings code from main.cc to settings.cc. Added default settings to option summary; identity command-line only options. Updated documentation. commit effc2ac2e06f4bce1a32771a206cea8a25b0fe60 Author: John Bowman Date: Wed Apr 5 21:20:58 2006 -0600 Improved picture sizing diagnostics. Added max(picture pic=currentpicture) and min(picture pic=currentpicture) functions. Added pair truepoint(picture pic=currentpicture, pair dir) function that works like point but uses the actual picture size instead of userMin and userMax members. commit 1ca3b76cc03eeb6f6ce650efdcc05304b7acf096 Author: John Bowman Date: Wed Apr 5 21:18:34 2006 -0600 Replace identity() with better approximation pic.calculateTransform() in axis picture bounds calculation. commit 2828a2fc752611197c8da2a888f7f9e163e423a2 Author: John Bowman Date: Wed Apr 5 21:17:03 2006 -0600 Make colorPen[] and monoPen[] public. commit 3d952fa6b146e227f8d603d75409ef5d86df95d4 Author: John Bowman Date: Wed Apr 5 21:16:10 2006 -0600 Fixed typos in comments. commit 0f448702572cd3980c3f235c1cca17a3e2124a68 Author: John Bowman Date: Wed Apr 5 20:22:16 2006 -0600 Incremented version to 1.04cvs. commit 9c25ca1878971b9309e70501e5c6821f1cee9573 Author: John Bowman Date: Thu Mar 30 00:08:56 2006 -0600 Added Degrees function; like degrees(pair) but returns 0 for (0,0) argument. Added minbound and maxbound functions for triples. Moved minbound, maxbound, and Longitude functions to runtime code. Added min(guide3[]) and max(guide3[]) functions. For convenience added xaxis(triple,real) functions, etc. Added solid geometry package with cylinder routines. Updated documentation. commit e2d01d7b8bcaaea02991c16da1ef73008d31c862 Author: John Bowman Date: Wed Mar 29 23:27:11 2006 -0600 Added limit maxIntersectCount=100000 on maximum number of calls to intersectcubics per cubic segment. commit ed639fd2d9e3514f3b9bec4640ddad84a74ef9e0 Author: John Bowman Date: Tue Mar 28 13:33:39 2006 -0600 Removed TODO item regarding extending runnable-at-a-time mode to inner code levels as this is no longer needed. commit 0a94ea6be653be7815838c8027fb1be41aa8a818 Author: John Bowman Date: Mon Mar 27 02:13:26 2006 -0600 Fixed memory leak in interactive mode by using an implementation of reset that is closer to the environment reset used between multiple file runs. commit 8d01320484ef94f77b7b93d8741742d6732558a9 Author: John Bowman Date: Sat Mar 25 23:15:50 2006 -0600 Fixed indentation. commit 141078fde83363b07a92b23f652f044aa2854779 Author: John Bowman Date: Sat Mar 25 23:14:21 2006 -0600 Fixed typos. commit 9e7ebe0d9210cae262a1f2baeb845f8b7e7e6d5c Author: John Bowman Date: Sat Mar 25 11:25:37 2006 -0600 Updated CJK documentation. commit 74c06d44469b037505371944dd4c3059b16859b4 Author: John Bowman Date: Fri Mar 24 22:38:01 2006 -0600 Added real fontsize() routine. Documented real fontsize(pen p=currentpen). Documented use of CJK fonts. commit 5eac404efdabd96157073d429bdf888a0a73ccd9 Author: John Bowman Date: Mon Mar 20 22:48:46 2006 -0600 Implemented interactive mode (without command-line editing and history) even in absence of readline library. Made minor change to System diagnostic messages. Changed invert: triple invert(pair z, triple normal, triple point) projects onto the plane perpendicular to normal and passing through point. Updated Debian URL. commit 80baab724a0b03a9582d20dfc4e081c1fea701b6 Author: John Bowman Date: Sun Mar 19 09:17:07 2006 -0600 Added function triple invert(pair v, real z, projection P=currentprojection) to map v onto (x,y,z) by inverting the projection P onto a constant z plane. Minor documentation updates. commit adf5582b62c1ce0dbda58ded884ff8e8ddc6bd03 Author: John Bowman Date: Fri Mar 17 00:10:58 2006 -0600 Support compilation under gcc-4.1.0. commit ecc6ca00d162c18c264ce94307d6263fc0424d99 Author: John Bowman Date: Tue Mar 14 22:36:32 2006 -0600 Fixed return type of three-dimensional intersectionpoint routines. commit 5ad4c367c698ffd46b95cfdd279472d27a50d32e Author: John Bowman Date: Sun Mar 12 14:21:27 2006 -0600 Incremented version to 1.03cvs. commit d2aa165bc9ed6ca59b0d3251ce36ab769abb59cd Author: John Bowman Date: Sun Mar 12 12:27:03 2006 -0600 Fixed surface lighting colours; respect projection argument. Removed test diagnostic. commit dce74caad4372be9f26b9c8460f1d38d705651e6 Author: Andy Hammerlindl Date: Sun Mar 12 12:17:32 2006 -0600 Added a .ls file to check the presence of large output files before they are deleted. commit e3067cdb667a0c26476544c2454c3a602eb5f336 Author: John Bowman Date: Sun Mar 12 10:05:51 2006 -0600 Avoid need for single quotes around path settings in MSWINDOWS. Fix configuration diagnostics. commit 9e4c90c4a873082d063e7d8ec4e9c762c36c8be9 Author: John Bowman Date: Sat Mar 11 23:03:49 2006 -0600 Documented how to install in alternate locations under MSDOS. Fixed typo in configuration instructions. commit 4b900d75f545a276a637568172024c292120e494 Author: John Bowman Date: Sat Mar 11 17:33:51 2006 -0600 Simplified example. commit 5479aac708d4e8b7ba7839da2bad6e2162b39de8 Author: John Bowman Date: Sat Mar 11 17:16:25 2006 -0600 Implemented surface lighting and example of sinc function. Changed signature of subsampled surface routine (argument nsub now preceeds pairs a and b). Changed light.init constructor into light(triple source, shadefcn shade=defaultshade). Added cast from triple to light. Made currentlight public; added nolight variable. Renamed projectXY to xypart. Added XY() and XYZ() members to bbox3. commit 347ba3f77a171c46a4a47f86e9e355e6a51d86f1 Author: John Bowman Date: Sat Mar 11 16:39:34 2006 -0600 Fixed axis label alignment when sign=-1. commit 430f5c79d6160b8129e3dbc8110107b5d7abd5be Author: John Bowman Date: Fri Mar 10 22:18:54 2006 -0600 Removed pstoedit patches (included in pstoedit-3.44); updated documentation. commit 68bbdf1c1e0a8c77f16277ea5b1641fbaead5d4d Author: John Bowman Date: Fri Mar 10 13:19:57 2006 -0600 Allow make to inherit LDFLAGS from configure. Allow and document installation without root privileges. Document configuring to search for includes and libraries in nonstandard locations. commit 7eeecf79bea1d6c776ec748a77f5b18175cd005f Author: John Bowman Date: Fri Mar 10 00:19:06 2006 -0600 Updated configuration file documentation. commit 4dd2aa63b26b60506a2be4e2979ede3b4d840361 Author: John Bowman Date: Thu Mar 9 21:54:33 2006 -0600 Catch errors thrown by parser while reading configuration file. Recompute search path after reading configuration files and command-line options in case dir was changed. Move MSWindows .asy initialization directory to %USERPROFILE%. commit 3ae7effa9e304cb6fdc44d53e77d9b9b0929c507 Author: John Bowman Date: Tue Mar 7 13:37:44 2006 -0600 Fixed type of randMax. commit c0c45887b143899563cac08bf41ccd125e097b50 Author: John Bowman Date: Tue Mar 7 04:01:26 2006 -0600 Updated pstoedit patch. commit 24f8371b56dace63c14bb05de5f845041e70d657 Author: John Bowman Date: Mon Mar 6 20:29:18 2006 -0600 Incremented version to 1.02cvs. commit fff59e55f51bf1b131c0158612f0c14a9ccad237 Author: John Bowman Date: Mon Mar 6 18:23:18 2006 -0600 Fixed bug in surface plot of a matrix. commit 26a3c93d4252ffed2f35d77596236078638ef05c Author: John Bowman Date: Mon Mar 6 14:58:35 2006 -0600 Incremented version to 1.01cvs. commit 547ee643099012bca1840706696a6aafb34de4da Author: John Bowman Date: Mon Mar 6 10:33:54 2006 -0600 Workaround broken GNU readline/history library on MacOS. commit 11f8e47b6ca52d30122d5314030876436d493627 Author: John Bowman Date: Mon Mar 6 01:10:54 2006 -0600 Fixed cxx warning messages. commit 5405aad4557d43e550de77b5715c5fbd6b9a1d65 Author: John Bowman Date: Mon Mar 6 00:19:09 2006 -0600 Moved detailed discussion of growing list of base modules closer to the end of the documentation. commit 0958bf9aa26afda543a765aaea2ff7c519ea2b54 Author: John Bowman Date: Sun Mar 5 23:52:10 2006 -0600 Updated to use gc6.7 by default. Added RadialShade filltype. commit 5b4e1a2b86ad323af68a5419cebb6bf3a6f3b6b6 Author: John Bowman Date: Sun Mar 5 23:03:49 2006 -0600 Remove blank legend entries. commit 413031e4512016eba1ee554df33381d0d7a9ffa2 Author: John Bowman Date: Sun Mar 5 22:46:24 2006 -0600 Fixed pen bounds (too large by a factor of 2). commit 77f0938b38433a0283f80604ec9aaa99efa076c2 Author: John Bowman Date: Sun Mar 5 21:37:48 2006 -0600 Fixed transformation of palette bar. commit f294a74a102e058defddf05bd3206fdb8de086fc Author: John Bowman Date: Sun Mar 5 19:45:09 2006 -0600 Removed empty picture check in xlimits and ylimits. commit fc66e7bb009b8995b0d64a7393cbe0373e6466c5 Author: John Bowman Date: Sun Mar 5 19:02:27 2006 -0600 Moved linear solve and matrix inversion to C++ code; simplified memory allocation in tridiagonal. Added seek and tell functions for positioning input files. Make images transform properly. Make legend argument to draw a Label type (currently only the string and pen members are used). Added length and skip arguments to frame legend(...). Removed side effects from eol(file). commit b130fda35b1a52f235a195dd3de0dd7c4732aad9 Author: John Bowman Date: Sat Mar 4 22:25:50 2006 -0600 Generate correct #line comments. commit 557106356ca05abe85095d699ee581925a5ed58e Author: Andy Hammerlindl Date: Sat Mar 4 17:17:55 2006 -0600 Log the stdout and stderr of the asy process. Changed the -inlinetex option to -keep so that the calls to external programs (eg. latex and convert) can be diffed. commit 4d1efb04f2b068faf4bcad86e224ff3d762b547c Author: Andy Hammerlindl Date: Sat Mar 4 16:47:12 2006 -0600 Now delete texput.log when the pipe to the tex process is closed (to ensure its deletion with the --inlinetex option). Also delete texput.aux. commit c16e8f35093571eadb9fc2ad97c8e122dcdf6051 Author: John Bowman Date: Fri Mar 3 09:56:54 2006 -0600 Fixed bug in pivot vectorization in solve. commit 2696a99ffefcb7e02e7f074ed271433d66053d8d Author: Andy Hammerlindl Date: Thu Mar 2 13:46:57 2006 -0600 Initial check-in of output testing. commit 1737069935134cd721162e02bd7ddf0026ca9677 Author: John Bowman Date: Wed Mar 1 13:02:39 2006 -0600 Added INCL for enable-gc=system. commit 4ef432c6b3a4a87c62d1830216944a29cffb107b Author: John Bowman Date: Mon Feb 27 01:54:06 2006 -0600 Renamed includegraphics to graphic. Added embed module to interface with LaTeX movie15 package for embedding movies, sounds and 3D objects into a PDF file. Don't attempt to resize unbounded pictures. Output LaTeX pipe diagnostics even when verbose <= 1. Added \begin{document} to LaTeX pipe. commit fe1a3c9b71a9977eb5036bb6caa1e022d412bf0c Author: John Bowman Date: Sun Feb 26 22:59:42 2006 -0600 Added poster example. commit f1031a708321e2a4ee4cb9a977bd7eafd44ce656 Author: John Bowman Date: Sun Feb 19 20:59:50 2006 -0600 Add configuration dir to search path; search for configuration file in standard search paths (in usual order). Remember defaultpen set in configuration file. commit c65d1910f982db63917865e620b63ffedb60f817 Author: John Bowman Date: Sun Feb 19 11:03:00 2006 -0600 Always draw arrows with solid linetype. commit 22e1d9e8edfaf13b75397d582984e57d28673154 Author: John Bowman Date: Sat Feb 18 13:31:50 2006 -0600 Updated MSDOS default of gs8.51 to gs8.53. Changed default for xlimits and ylimits to NoCrop. Work around unused variable warning messages when XDR support is disabled. Cleaned up error calls. Updated documentation. commit 9121a897689e7a165f4d07d74791cf9065bae82f Author: John Bowman Date: Fri Feb 17 22:17:15 2006 -0600 Added missing $(GCLIBS) dependency. commit d1dd9491dfd9e1de33175474104cd258c855a4b2 Author: John Bowman Date: Fri Feb 17 20:57:33 2006 -0600 Added camp.tab.h entry again. commit 44592176ab6ea490b6263f0db7df1537739467ee Author: John Bowman Date: Wed Feb 8 12:45:48 2006 -0600 Removed +solid from Fill and NoFill. commit 46e59ad7cc4837635c0139884318425958e7f31b Author: John Bowman Date: Wed Feb 8 10:06:36 2006 -0600 Added missing xpart, ypart, zpart functions for triples. commit 5160bfc61c05011c6faf32e68dc0c3d43c8abb01 Author: John Bowman Date: Tue Feb 7 23:13:08 2006 -0600 Fixed reversed image dimensions for colour density plots. commit e2d69c4df983d930fba6dedcef4cfcda33902415 Author: John Bowman Date: Tue Feb 7 23:06:39 2006 -0600 Added missing xpart and ypart functions. commit b267a7282f95034c91aafe770836c5bf5c1250b9 Author: John Bowman Date: Mon Feb 6 01:58:25 2006 -0600 Signal an error if write to final output file fails. Removed "camp: " from camp error messages for brevity. commit cee2eadadeb9b24b390f6891d44b9b80b57b0654 Author: John Bowman Date: Sat Jan 28 22:32:32 2006 -0600 Added link to Dario Teixeira's Asymptote and LaTeX Integration Guide. commit d8f583f04cab7bf9f726240b4883765437c9aa64 Author: John Bowman Date: Sat Jan 28 20:43:37 2006 -0600 Added file prefix option to animate and merge. commit 7d50f266a6f64308baf51883375b8a7d3f9e64eb Author: John Bowman Date: Sat Jan 28 04:25:25 2006 -0600 Added index entries. commit 4a735cd696ce941e666a11ae057a32906a0a89d0 Author: John Bowman Date: Sat Jan 28 00:28:16 2006 -0600 Allow format("%",1). commit c24db86c95be49eb723e48bb6c941448a12452f3 Author: John Bowman Date: Sat Jan 28 00:04:49 2006 -0600 Set tickMin to a and tickMax to b if Step is 0. commit 04de94e2035c9de5222e4d4069922d2abc36da91 Author: John Bowman Date: Tue Jan 17 14:17:27 2006 -0600 Added check for empty picture in xlimits and ylimits. commit 712b5eb0a930b2e8adc56a57319b324ee0d14199 Author: John Bowman Date: Tue Jan 17 14:12:17 2006 -0600 Better dependency tracking. Removed MSDOS compiler flag in favour of __CYGWIN__. This will make cygwin defaults identical with those under MSDOS (outside of cygwin). commit f3922a443674409b7f13bf7e29e0754750893b30 Author: John Bowman Date: Tue Jan 17 01:36:01 2006 -0600 Fixed cxx warning. commit 4fc12570232e81d3ec0b574836a8b1f5dc664ebf Author: John Bowman Date: Tue Jan 17 00:45:28 2006 -0600 Added Tom's alternative way of making runtime.pl not update runtime.h. commit 70cb9010affefb9de6368c62e8c0d3c1a83237a9 Author: John Bowman Date: Sat Jan 14 17:20:05 2006 -0600 Documented inlinetex mode. commit 04614dd4dfd09e73f5a43bdbb226de03793b96d1 Author: John Bowman Date: Sat Jan 14 17:10:11 2006 -0600 Updates to feyman.asy: improved photon line, use align structures. commit a4578b4562e08e4dbdeaf7cf1972170f3c3756c8 Author: John Bowman Date: Wed Jan 11 00:40:36 2006 -0600 Added #line directives in runtime.cc. commit c7e91dd947133af7dba43b3d9a5b71fe9c75c39f Author: John Bowman Date: Tue Jan 10 15:18:01 2006 -0600 Fixed segmentation fault when bad format string is given to format. Fixed cast: (pair) "1". commit e231da91a761157ec0b86125bca4cbf99e5d5606 Author: Andy Hammerlindl Date: Fri Jan 6 22:57:38 2006 -0600 Added transform3 multiplication (aliased from math). commit b5f5b26af6060cadd9d7a5f32eed69193300508c Author: John Bowman Date: Tue Jan 3 23:45:46 2006 -0600 Don't exit interactive mode on EOF (ctrl-d). Added tab completion option and default prompt="" to readline. commit ae727f28ea4b40e5610c4dffa2b7d74b3e80c1be Author: John Bowman Date: Tue Jan 3 02:58:20 2006 -0600 Fixed cxx error. commit 2967f17cbcffb744634e099c161849a048d5de45 Author: John Bowman Date: Tue Jan 3 00:16:01 2006 -0600 Changed complement to int[] complement(int[] a, int n); this returns the complement of the integer array a in {1,2,...,n}, so that b[complement(a,b.length)] yields the complement of b[a]. commit 169148ba22e45e28894dfb1b645b3b1f323cdc90 Author: John Bowman Date: Tue Jan 3 00:13:52 2006 -0600 Removed unused line. commit 62e1a9441630b5330418480c365585328c08b243 Author: John Bowman Date: Mon Jan 2 19:52:58 2006 -0600 Added interface to GNU readline library to allow editing with history when reading data from stdin. Updated getstring, getreal, etc. in strings.asy to use this new readline function. Added complement(int[] a, T[] b) function to return the complement of the integer array a in {1,2,...,b.length}, so that b[complement(a,b)] yields the complement of b[a]. Generated dataSettings from a templated struct; added intSetting. Added historylines option (default is still 1000). Added array check to arrayConditional. Updated documentation. commit 11474f0b9840788544f626125735c948364e2341 Author: John Bowman Date: Mon Jan 2 19:25:08 2006 -0600 Formatted. commit 066db4c7a6e4a16d9b0f3158e56542d1fe479f43 Author: John Bowman Date: Sun Jan 1 04:41:06 2006 -0600 Move more initialization code before setOptions. Check em in signal handlers. commit c389e767206e0ab763316088c0703686c896b441 Author: John Bowman Date: Sat Dec 31 12:22:58 2005 -0600 Address compilation problem under MacOS X 10.3.9. commit 705a8a26aa03b2e8399ed01d357650dbd5b61e8d Author: John Bowman Date: Sat Dec 31 00:19:29 2005 -0600 Incremented version to 1.00cvs. commit 84c319d06b4622c6e5a48b413e9b88ec944ce0c7 Author: John Bowman Date: Fri Dec 30 23:35:36 2005 -0600 Minor documentation updates. commit af29f78f7e05d7c62cbf8200a7e9870a0d76e028 Author: John Bowman Date: Fri Dec 30 23:05:36 2005 -0600 Added missing (mem::string). commit ac1ce219f9312b47c56838aff22f05c09776737c Author: John Bowman Date: Fri Dec 30 18:54:53 2005 -0600 Defer initialization of settingsModule to solve race condition. commit 12735254c64c16298956a5738284ea5577763068 Author: John Bowman Date: Fri Dec 30 13:21:12 2005 -0600 Fixed MacOS bus error by initializing GC before calling setOptions. commit 2c2226a75a8dcf2bd47d0ba0c88b91f8f59af4d8 Author: John Bowman Date: Fri Dec 30 13:11:10 2005 -0600 Don't stop running after first error in a runnable if -debug is set. Updated wce. Documented contributed MacOS X binary. commit ef8e3257d908ee6e362c52a8daf8345420b194d6 Author: John Bowman Date: Fri Dec 30 02:56:51 2005 -0600 Incremented version to 0.99cvs. commit 5c0a33a6bf4a3a7fc02e993593fb4711c01529cb Author: John Bowman Date: Fri Dec 30 02:06:29 2005 -0600 Minor documentation updates. commit d2f60e6987dd3f8903161c2a4b5ffacf80ad0110 Author: John Bowman Date: Fri Dec 30 01:54:53 2005 -0600 Fixed compilation problem under g++-3.3.4. Change addConstant to use item. Search in usual paths for config.asy if ~/.asy/config.asy is not found. Convert configuration variable names to lower case. Update diagnostics and documentation: emphasize use of configuration variables instead of system environment variables. commit 936918070c759c2acf207461088e58a98f2d8299 Author: John Bowman Date: Thu Dec 29 21:38:05 2005 -0600 Removed mention of obsolete -t option from documentation, which is no longer required for inline tex mode. commit 5d8128865deb937def2ac52929df17694269380c Author: John Bowman Date: Thu Dec 29 19:52:38 2005 -0600 Fixed cxx errors. commit f90cbe0e5f312817be89fea6abb1a243e5e62e9d Author: John Bowman Date: Thu Dec 29 17:40:42 2005 -0600 Suppress warning messages when shipping out an empty picture. commit a23f08d9f83d6c2119c1b0433678ab1a0b2586a7 Author: John Bowman Date: Thu Dec 29 13:01:06 2005 -0600 Implemented machine constants as variables rather than functions. Added ASYMPTOTE_CONFIG environment variable. Moved ASYMPTOTE_DIR environment variable to settings. Do an initial read of command line in case CONFIG or DIR were specified. commit fd6fe905598d7c3edb14292f2dd69f8d7c0e9f25 Author: John Bowman Date: Thu Dec 29 02:32:35 2005 -0600 Moved ASYMPTOTE_PAPERTYPE to settings. commit 4a498dd004bc95f45bc018a8c2350b357f48fb34 Author: Andy Hammerlindl Date: Thu Dec 29 01:49:29 2005 -0600 Moved argument parsing to avoid writing to memory between a fork and an exec. commit f864cde03b868ef11de14bc9231f0c926d82f737 Author: John Bowman Date: Thu Dec 29 01:24:38 2005 -0600 Moved environment variables into settings. Call doConfig before reading command line options. commit bb0ef295a64fb0c2b0aa6f2ce7ba2ca7a0682f80 Author: John Bowman Date: Wed Dec 28 23:43:14 2005 -0600 Implemented addConstant and pi example. commit 36becc21b83833cebd9aa9a9d32635eee0847610 Author: John Bowman Date: Wed Dec 28 11:16:22 2005 -0600 Removed ~/.asy/options in favour of ~/.asy/config.asy. Add "Including filename" diagostic. Fixed localhistory. Speed up initialization by turning off autoplain when reading configure file. Rename position to align. Updated documentation. commit 5834e1b2207381871eda5557aec935540da9aaf1 Author: John Bowman Date: Wed Dec 28 01:15:07 2005 -0600 Fixed verbose flag. commit c421a124706aee98701afd47f71befae44f1720f Author: John Bowman Date: Wed Dec 28 01:10:28 2005 -0600 Removed -t option, which is no longer needed to produce inline tex code. Removed unused settings code. Added -nov option. Improved formatting of option messages. Hide oneFileView and inlinetex (formerly texmode) from help menu. commit bea64164b4c955599c2ec9c84568e7c73bc1d73c Author: John Bowman Date: Mon Dec 26 15:38:04 2005 -0600 Fixed tick computation in xaxis and yaxis when explicit limits are given. commit d5bd4bb1e99c842d5902fbce82e08df997ce8b43 Author: Andy Hammerlindl Date: Sat Dec 24 19:15:55 2005 -0600 Removed the -n, -no option in favour of -blah/-noblah style negations. commit fd6c9fcdfe15cd2ff5b0d41f9e62fe07918a009c Author: Andy Hammerlindl Date: Sat Dec 24 01:42:42 2005 -0600 Improved error reporting when parsing command line options Autogenerate -help output. commit 89e1d51d872b6d47a8e004872d5f2ff47c5f95d8 Author: Andy Hammerlindl Date: Fri Dec 23 23:39:56 2005 -0600 Added a settings module. Re-implemented command line options to modify variables of the settings module. Added refaccess to access C++ variables as Asymptote variables. commit 999686551a309da198af397405ba458aa344991e Author: John Bowman Date: Wed Dec 21 23:22:04 2005 -0600 Fixed string reads. commit a04661d02bcbc382904e7bf15548fe898ca45aee Author: John Bowman Date: Sat Dec 17 19:12:21 2005 -0600 Check for cvsmode in ignoreComment. commit 2bf654dc2f80c34112b47eab1ff3d44b7e793c7e Author: John Bowman Date: Sat Dec 17 17:29:17 2005 -0600 Allow comments within 3d data blocks. commit aa7c73b6b20b5b37993021ea440ff1ac3a597707 Author: John Bowman Date: Sat Dec 17 15:26:22 2005 -0600 Removed writeP in favour of write. Stop running after first error in a runnable. Standardized write argument names. commit 8025f7ffdd8c5ef01a9db0112190026060c4bc66 Author: John Bowman Date: Sat Dec 17 02:17:37 2005 -0600 Added fonts. commit 2b74c299f57b3960563c99ad06bd40ba1b15f45d Author: John Bowman Date: Sat Dec 17 02:11:45 2005 -0600 Fixed cxx errors and warning messages. commit f548d38f981609aacb0a6d48328e2c7c7a40bce1 Author: John Bowman Date: Sat Dec 17 01:54:31 2005 -0600 Added type-dependent function and record operators to parent record. Cleaned up builtin.cc. Moved two- and three-dimensional array min and max functions to C++ code. Split plain.asy into many subfiles (using include rather than import for speed). commit 301f9346339ea8900fa2a3f2cf25fdc00a786c54 Author: John Bowman Date: Thu Dec 15 14:29:49 2005 -0600 Allow explicit keywords in autogenerated code. Moved default arguments from plain.asy to runtime.in. Respect currentpen nib. commit 96de56b84b0cd1d4d738a23765d299545dadd2ae Author: John Bowman Date: Thu Dec 15 03:58:25 2005 -0600 Incremented version to 0.98cvs. commit 6f306d923970994666cc1a70396929acf74a17d6 Author: John Bowman Date: Thu Dec 15 03:07:14 2005 -0600 Fixed pen transform bug. commit 71c43cf70416c59c7912d75006044a5b82d2629b Author: John Bowman Date: Thu Dec 15 01:36:26 2005 -0600 Make recent readline startup changes compatible with readline-4.0 under UNIX. commit 72217f76828b49b4e0b98b1fbb142535fc1775d4 Author: John Bowman Date: Thu Dec 15 01:13:45 2005 -0600 Added missing names and fixed incorrect names for builtin function arguments. Removed duplicate functions. commit f35731c6d4adab7814eaaed2b450362abbc01c37 Author: John Bowman Date: Wed Dec 14 23:29:34 2005 -0600 Workaround readline incompatibility under MacOS X 10.4.3. commit 499a84432fa5890f57c80b3bc2d564d3aa2b283e Author: John Bowman Date: Wed Dec 14 18:47:01 2005 -0600 Incremented version to 0.97cvs. commit d3aa6c3e78e7d22d0c94383670bcb040f2ecfe21 Author: John Bowman Date: Wed Dec 14 18:08:33 2005 -0600 Make MSDOS binary work under both MSWINDOWS and CYGWIN. commit b87facc189c97cc1439b6c12cdf54a7691fd4d0b Author: John Bowman Date: Wed Dec 14 02:22:10 2005 -0600 Fixed spelling. commit f4542712ae2f33fb6516d07366cc8542e0c08b34 Author: John Bowman Date: Wed Dec 14 02:20:27 2005 -0600 Document that the -V option under MSDOS is the default only when a single file is given. commit 3aaf0cf9cca1f7188b2d5d66d1255a19685e5bf6 Author: John Bowman Date: Wed Dec 14 01:58:29 2005 -0600 Fixed cxx warning messages. commit 5a0d6af86d2fa6b35907d93c3e91b1d50090f01d Author: John Bowman Date: Wed Dec 14 01:52:52 2005 -0600 Allow explicit keyword in builtin function definitions. Added write(file fout=stdout, string s="", explicit T[] x ... T[][]); function for writing a list of vectors as columns. Updated documentation of write routines. commit 1fffa6aaa334b966e563cf409015fbbbc9f65a93 Author: John Bowman Date: Tue Dec 13 23:39:31 2005 -0600 Fix segmentation fault by checking for null arrays in dotsGuide, dashesGuide, and 3d intersect. commit cfd2248d0406efd23f295eeb7b601cb904ca8343 Author: John Bowman Date: Tue Dec 13 16:50:41 2005 -0600 Fixed order of autogenerated newAppendedArray arguments. commit b32c4d54bfda1e3333f010b7ec668691d0765a32 Author: John Bowman Date: Tue Dec 13 16:07:35 2005 -0600 Fixed cxx error and warning messages. Make time(string) simply return format string on systems without strftime. Removed generated files. commit f24b953708c91b82442fb2ed5c9e6c1549909de6 Author: John Bowman Date: Tue Dec 13 14:21:58 2005 -0600 Autogenerate remaining runtime functions, producing runtime.cc and runtime.h. commit e277d1b83a43712c8d408e0b13e222d86514900d Author: John Bowman Date: Mon Dec 12 03:36:28 2005 -0600 Make default transform constructor the identity. Allow operator keyword in autogenerated functions (optional, except for operator *). Autogenerate more runtime functions. commit 2465bb6cd34773be15915a88e5262ef4630dcf98 Author: John Bowman Date: Mon Dec 12 00:06:44 2005 -0600 Fixed comment handling of runtime.pl; added prototype comments. Autogenerate remaining array functions. commit 48634f3dc5ae77e2fde057a969bc32d5722ff28a Author: John Bowman Date: Sun Dec 11 11:58:39 2005 -0600 Autogenerate runtime array operations. commit f65461ccca71521c637487e45edd5e508c0f6184 Author: John Bowman Date: Fri Dec 9 00:12:37 2005 -0600 Autogenerate more runtime functions. commit bacaf2c7b57f5157e763c2f74eea541d29c503fa Author: John Bowman Date: Wed Dec 7 00:48:40 2005 -0600 Updated runtime.pl to generate named arguments and optional default values. Auto-generate many more runtime routines. Use transform and pen instead of transform* and pen* for consistency with other types. commit 61d409c56dc3b07a2bc8de506a9e1126b5f87f9a Author: John Bowman Date: Wed Dec 7 00:37:08 2005 -0600 Fixed recently-introduced memory leak. commit 6c28518f804853391b708d645a6c1d89b5107a25 Author: Andy Hammerlindl Date: Tue Dec 6 15:50:41 2005 -0600 Made brackets part of the syntax for 'quote'. commit e03aeac59aa29d06488bcc37a9dcd6a4dd61d307 Author: John Bowman Date: Tue Dec 6 10:09:49 2005 -0600 Formatting. commit 796aedc5c991f3c50763d596f91c230576e10580 Author: John Bowman Date: Tue Dec 6 01:38:54 2005 -0600 Implement named arguments for builtin functions. commit 94626fe6a780fc144aaddd52cb7a77f99f1377c3 Author: John Bowman Date: Tue Dec 6 01:00:26 2005 -0600 Make translate (-s option) work with eval (requires running codelets). commit 100ffff9ee654c8b180a3cb79cc2891d346427bd Author: Andy Hammerlindl Date: Mon Dec 5 20:05:04 2005 -0600 Fixed sequenced evaluation of packed arguments. commit e28f4672575300ed653846be8ad54d5138fe7f53 Author: John Bowman Date: Mon Dec 5 01:21:12 2005 -0600 Optimized isDefault test. Implemented default function arguments for builtin functions. Made write routines builtin functions. commit 9fef72899d1bfc8509d44f686a5890186da8f0f0 Author: John Bowman Date: Sat Dec 3 23:49:58 2005 -0600 Remove obsolete remark about default function arguments. commit ae200ee9cea5e8ec1d269f70ce7d46584d3db302 Author: John Bowman Date: Sat Dec 3 00:10:00 2005 -0600 Documented makepen, nib, Sin, Cos, Tan, aSin, aCos, aTan, and fontcommand. commit 9ca4e3f824349c79527e89ea95d55b631753a492 Author: John Bowman Date: Fri Dec 2 23:27:03 2005 -0600 Documented BeginPoint, MidPoint, EndPoint. commit 29ef02fceb6eb09421099a3cf49dced64dd66a10 Author: John Bowman Date: Fri Dec 2 10:44:21 2005 -0600 Removed unneeded assignment. commit 9619df2a7117dbb20b93ce4bced704a8080e7c33 Author: John Bowman Date: Fri Dec 2 10:14:28 2005 -0600 Replaced midarrow routine with generalized arrow routine. commit 461f6b1f8b70788fa80f687c62ebef51dfba00b3 Author: John Bowman Date: Fri Dec 2 05:00:36 2005 -0600 Do MidArrow and MidArcArrow size adjustment in PostScript rather than user coordinates. commit 99008e82192e94f15c8dd24b762ca577b6d6765a Author: John Bowman Date: Fri Dec 2 00:19:21 2005 -0600 Added contributed examples and a routine to round the sharp corners of a path. Reordered the list of available modules. commit 8e0a2acb4fb53f752333324c1ab2e1474b429bcb Author: John Bowman Date: Thu Dec 1 21:46:26 2005 -0600 Handle angle(0,0) condition robustly. commit da6dee972819f677202846dc0c7c44890ea00487 Author: John Bowman Date: Thu Dec 1 17:10:59 2005 -0600 Ignore angle(0,0) errors in dirtime. Preserve output precision when outputting paths of any length. Fixed makepen draw routine (makedraw). commit e9932b5bef6de9c5f33357892c2005716c54408b Author: John Bowman Date: Thu Dec 1 00:48:00 2005 -0600 Minor optimization of makepen draw. commit f213452650c95e23eb1d4c4e240eb9ed8d042971 Author: John Bowman Date: Wed Nov 30 23:12:08 2005 -0600 Revert broken optimization of makepen draw. commit eddf45b679520b3705812b7f9c50b6235590f684 Author: John Bowman Date: Wed Nov 30 10:21:12 2005 -0600 Simplified makepen draw; extend to cyclic paths. commit 184116a5754b4c447648cef2987b94db8555fb39 Author: John Bowman Date: Wed Nov 30 02:41:52 2005 -0600 Added MetaPost-like makepen that works for any polygonal (possibly nonconvex) cyclic path. commit 53453a6383207878891947e9e8fbd0193d6a8b08 Author: John Bowman Date: Tue Nov 29 23:03:47 2005 -0600 Call purge after each interactive line to close any files that have gone out of scope. Suppress interactive update on exit. commit 8adaed3f92453ab3328a014020b0d25b1bec5df8 Author: John Bowman Date: Mon Nov 28 19:37:48 2005 -0600 Make estack and sstack static local variables. commit cb82b57275ad49ed6714360f2ba332263536d752 Author: John Bowman Date: Mon Nov 28 19:03:56 2005 -0600 Added filltype to labeltick. commit 5278a780e8c778661eb978be0a27cddbcffadc36 Author: John Bowman Date: Sun Nov 27 23:45:17 2005 -0600 Fix -o - with labels. commit e1062daaaf34b82440f5d1c1eee76f2b5a249d1b Author: John Bowman Date: Sun Nov 27 23:21:02 2005 -0600 Added example of 3d lighting effects for a sphere, using Gouraud shading. When running MSDOS binary under CYGWIN, use UNIX line terminator. commit f41b5c3cbcab52de658277ea8df09ec05df50994 Author: John Bowman Date: Sat Nov 26 17:01:52 2005 -0600 Check for null binary space partition. Move normal==O test to face. commit 461ea503545d77d9279c8066ab6d76c7ca3bdb06 Author: John Bowman Date: Sat Nov 26 14:53:12 2005 -0600 Make -o - work without labels. Document how to pass options to convert. commit e5f090df96cb7378f7f21d0e933d04f29d98b60d Author: John Bowman Date: Fri Nov 25 17:50:23 2005 -0600 Minor improvements. commit 3801d8d59c5e0bf670e1bc2f81ccb817d48a2cb3 Author: John Bowman Date: Fri Nov 25 02:51:13 2005 -0600 Added unitsize argument to shipout command (makes user coordinates represent multiples of unitsize). Suppress final call to exitfunction when exiting interactive mode. commit 8eb2bcf4f65fc9897d5fed34ae591f88e358046a Author: John Bowman Date: Thu Nov 24 00:36:47 2005 -0600 Under MSDOS, turn off the default -V option if more than one file is specified on the command line. Under MSDOS, by default bind Delete and Insert keys to delete-char and overwrite-mode, respectively. commit 23954c9562a97570b63650f5e3ee398741aac9ce Author: John Bowman Date: Wed Nov 23 18:36:54 2005 -0600 Install *.dat and piicon.eps files. commit 61ca520831b2545ba2252dd920b56c8159d04eb1 Author: John Bowman Date: Wed Nov 23 17:37:39 2005 -0600 Always destroy tex pipe at cleanup (e.g., in case a label contains a \gdef command). commit 9e5c05fd948b94ed8ab9bd3d271b7c238b894c47 Author: John Bowman Date: Wed Nov 23 17:35:02 2005 -0600 Unwrap wrapper. commit 2f5737d0b240632ac0081a4e10093f6c51bf1f92 Author: John Bowman Date: Wed Nov 23 14:06:56 2005 -0600 Fixed segmentation fault with unravel and from access in parse diagnostic. commit f41cff6dc7aebfcd7e696115948df31ca41d3229 Author: John Bowman Date: Wed Nov 23 09:53:43 2005 -0600 Documented ImageMagick convert dependency of GUI xasy. commit 7c8c9e83089654262c088b5656b288bc32466bba Author: John Bowman Date: Tue Nov 22 23:04:34 2005 -0600 Renamed -n option to -nV. Used -n (or -no) to negate next option. commit 2d9f17871e1419f6eaa0b8e4934ffc17e51b6974 Author: John Bowman Date: Tue Nov 22 16:25:52 2005 -0600 Use kpsewhich to help find default latex path. commit ee0107095feb9106e2f0155b73467715640f1de4 Author: John Bowman Date: Tue Nov 22 15:29:47 2005 -0600 Improved diagnostics. commit 1880d2bc13025a7a64e8262d5bb8172ac763ed80 Author: John Bowman Date: Tue Nov 22 15:24:25 2005 -0600 Check for module recursion after call to parseFile. commit a46953c709f31a895cb2a3dcd970a2f48ffcccb9 Author: John Bowman Date: Tue Nov 22 14:31:44 2005 -0600 Removed incorrect (and unnecessary) addPoint call from xaxis and yaxis. Made axisT readable outside of graph module. Made standard axis types public. Document custom axis types. commit 777fbf6726d2027abaa18c9631a7b388d46b95d7 Author: John Bowman Date: Tue Nov 22 02:19:48 2005 -0600 Incremented version to 0.96cvs. commit 6fbf74f332f447fb6c31172ffa76ef0462472729 Author: John Bowman Date: Tue Nov 22 01:04:17 2005 -0600 Fixed indentation. commit 364126842df5a60686d9ea3b0b94f8d2c11e7f4f Author: John Bowman Date: Tue Nov 22 00:54:03 2005 -0600 Reimplemented reset keyword in interactive mode to restore the environment except for the setting of scroll(). Interactive input now does an automatic reset. Added link to the GNU readline library documentation for customizing interactive key bindings. Fixed hang in scroll mode on EOF. commit 91eb7c8e328f43b81bedbe0bf9d984789a492e8a Author: John Bowman Date: Tue Nov 22 00:33:20 2005 -0600 Move legend.append to appropriate place. commit dcc0fbe629e3f2372150a4ecdd0693911417b614 Author: John Bowman Date: Mon Nov 21 15:15:15 2005 -0600 Use scalebox only where necessary, to reduce LaTeX memory usage. commit 71c6655d3469e0ade3a93388c52999dc25cb1d2e Author: John Bowman Date: Sun Nov 20 15:50:51 2005 -0600 Plugged remaining memory leak. commit fd9adc8c3a9d73d90c569025161cad7bcdf1d3cf Author: John Bowman Date: Sun Nov 20 12:08:29 2005 -0600 Plug another memory leak. commit 2d466f2c5a379cb4efd0fa0100a6d5f58c0bf5b2 Author: John Bowman Date: Sun Nov 20 11:41:04 2005 -0600 Fixed memory leak. commit 0ae5de9fa205f811259ea403e14b91547358d703 Author: John Bowman Date: Sat Nov 19 12:00:13 2005 -0600 Put GC warnings under control of -d option. commit 26b1022143890e3c35a24e3a74f2af2ae19b4f36 Author: John Bowman Date: Fri Nov 18 23:52:49 2005 -0600 Suppress GC warning messages (in particular: "Repeated allocation of very large block"). commit c3f015919bba9f40bb5bf9f0eacabf2a8f8562c1 Author: John Bowman Date: Fri Nov 18 23:46:59 2005 -0600 Make interactive input command reset the environment. commit 6ca8e3cbdcf189f4539c63b84e9700e7359c15b2 Author: Andy Hammerlindl Date: Thu Nov 17 23:21:02 2005 -0600 Added testing for unravel. commit 3f4f57ca4f67f06bc3961b6c0bcde86eee3ffa77 Author: John Bowman Date: Thu Nov 17 10:31:08 2005 -0600 Removed old documentation. commit d0a40a1fed53391f30dff0134b05b8f852668727 Author: John Bowman Date: Thu Nov 17 01:23:28 2005 -0600 Incremented version to 0.95cvs. commit 2d8ea5ffd849e487f0cefb89f559d387795328dc Author: John Bowman Date: Thu Nov 17 00:14:51 2005 -0600 Changed import graph; to abbrevation for access graph; unravel graph. Also: import graph as graph2d; means access graph as graph2d; unravel graph2d. Updated documentation; removed descriptions of old import scheme. commit 22f1659bb206557ad37971f19040ea5b58b5ae62 Author: John Bowman Date: Wed Nov 16 18:25:21 2005 -0600 Force quiet mode with running embedded latex files. commit ea0b9c27146e6726caf57e10423f8a481db6bd13 Author: John Bowman Date: Wed Nov 16 17:51:06 2005 -0600 Reduce memory usage. commit ef4fae7cd964ab244cfb84fa5e514175e0d3b31d Author: John Bowman Date: Wed Nov 16 17:07:28 2005 -0600 Use a vector instead of a list for estack and sstack. commit 8381834a584566f533598bd2f6fa104fe2f688ab Author: John Bowman Date: Wed Nov 16 15:31:07 2005 -0600 Reverse order of pstricks and graphicx also in asymptote.sty. Fixed formatting. commit d30095a1a85ffa2765fad62d8d4fc9e6ef39df8c Author: Andy Hammerlindl Date: Wed Nov 16 15:05:25 2005 -0600 Slight refactoring. commit 9fc036102ca31b6a710e1d8d8eb2bc7fcb8c4149 Author: John Bowman Date: Wed Nov 16 14:32:30 2005 -0600 Workaround scalebox problem with old versions of pstricks. commit 900a230f59eb035da1e73243c7166e50672f829a Author: Andy Hammerlindl Date: Wed Nov 16 13:03:55 2005 -0600 Fixed frame loading issues with imported types. commit 491ba39a65ee7cedc1ae705130b79aaf930a28de Author: John Bowman Date: Wed Nov 16 03:31:20 2005 -0600 Incremented version to 0.94cvs. commit d2521d022132b4b565b1a23b2fba8ee33c640ab3 Author: John Bowman Date: Wed Nov 16 03:06:51 2005 -0600 Fixed cygwin problem. commit 73dfcc6c2b8d89eae215103dcc2c0eed219ae44e Author: John Bowman Date: Wed Nov 16 02:36:10 2005 -0600 Added mkdir. commit 0f7098206d138babb0ee9b1aad6a420ca8ff88b8 Author: John Bowman Date: Wed Nov 16 02:27:04 2005 -0600 Revert to pstricks colors instead of color.sty due to problems under FreeBSD. commit 1fc8a6ebb4512fc41f3092c118aafbf2747999f5 Author: John Bowman Date: Wed Nov 16 02:14:50 2005 -0600 Workaround missing C99 gamma function under FreeBSD. commit b0988cec31ea4f7c7e5f1948c695e6498cfa33a7 Author: John Bowman Date: Wed Nov 16 01:31:40 2005 -0600 Documentation updates. commit df488ea835383a7ae9bce7d8275d199da678b24b Author: John Bowman Date: Wed Nov 16 01:24:03 2005 -0600 Added new keyword. commit 2f111570bc73f175c124d70c774186b707f8d67d Author: John Bowman Date: Wed Nov 16 01:12:02 2005 -0600 Fixed more cxx warnings. commit a532094aeeecc237a20ccbf3a2c7c0a9271889b6 Author: John Bowman Date: Wed Nov 16 01:09:16 2005 -0600 Fixed cxx errors and warnings. commit 863e8e9a52a68acd3ceb8ef6aa46d29c51b9849a Author: John Bowman Date: Wed Nov 16 01:01:34 2005 -0600 Version template. commit 896307cb58b63bae3d93b6cb1b993528c08acaae Author: John Bowman Date: Wed Nov 16 00:49:51 2005 -0600 Added version check to plain.asy. commit e5d83a5366f243d60e5aecb5c54b13629f1bfc49 Author: John Bowman Date: Wed Nov 16 00:19:59 2005 -0600 Put history in ~/.asy/history by default unless -localhistory is specified. Renamed ~/.asyrc to ~/.asy/options Updated documentation. commit aca9bcc789be34e190316066e9b572030bb92ea3 Author: John Bowman Date: Tue Nov 15 22:03:28 2005 -0600 Read command line style-parameters from $HOME/.asyrc commit f02c09ffb1bc5950237dc3df611a67a809d2bbc5 Author: John Bowman Date: Tue Nov 15 18:50:15 2005 -0600 Removed superfluous static modifiers. commit 978f33ffba7708b7d91c42ed3b271a511d9cb5e1 Author: John Bowman Date: Tue Nov 15 16:07:01 2005 -0600 Added surface graph of matrices. commit cc9ab56c7966061cbc71c97eb5ef2cc9f1c2e385 Author: John Bowman Date: Tue Nov 15 14:51:50 2005 -0600 Importing graph3 should publically import graph and three. commit 1a89f394735cec123b056ae429f290e57f5a078f Author: John Bowman Date: Tue Nov 15 13:06:59 2005 -0600 Implemented horizontal and vertical label scaling. Cleaned up Label code in plain.asy. commit c260f4e541ad2b6ab880668c721565a8e3430ca4 Author: John Bowman Date: Mon Nov 14 14:09:17 2005 -0600 Optimized integer overflow checks. commit 6ae2b69162667e165f20233aa048e5f97e23e142 Author: John Bowman Date: Mon Nov 14 02:16:15 2005 -0600 Added checks for integer overflow. commit f1a0872ddf61bf7dc88c0988382324b92cbe3123 Author: John Bowman Date: Mon Nov 14 01:57:47 2005 -0600 Handle parse errors. commit 236e42291a45e1c178982191ebd88b4b2c03b050 Author: Andy Hammerlindl Date: Sun Nov 13 22:47:56 2005 -0600 Minor edits. commit 44dba419cb16d17fd46c22ad4581bfc8d798d1f0 Author: John Bowman Date: Sun Nov 13 19:47:17 2005 -0600 Documented "from m unravel c as C;" syntax. commit 14bf01cac77e4d4e6a689a732f482976f62e3b6c Author: John Bowman Date: Sun Nov 13 19:34:03 2005 -0600 Minor update. commit 365ac4a73290985835a8672031aafd69f55696fe Author: John Bowman Date: Sun Nov 13 19:30:54 2005 -0600 Documented unravel and include. Updated documentation of execute and eval. commit 0989b855c9c314798258d3bcb1695236c8f57a58 Author: Andy Hammerlindl Date: Sun Nov 13 16:29:51 2005 -0600 Describes new importing system. commit 956cf076a99ba742e11cd2157eb98f9c0739ed1c Author: John Bowman Date: Sun Nov 13 03:11:08 2005 -0600 Fixed memory leak. commit 2bc72e42522e99043b8051ad93d55c0c3da882dd Author: John Bowman Date: Sat Nov 12 23:39:26 2005 -0600 Removed constructor added in error. commit 28e0bae4df0e9568617341e38c7b923d5f357f60 Author: John Bowman Date: Sat Nov 12 23:36:26 2005 -0600 Fixed cxx errors and warnings. commit 5f1ba64a2d4098953380c0d70186f75d27b8f6b0 Author: Andy Hammerlindl Date: Sat Nov 12 16:47:06 2005 -0600 Added venv::add to NOHASH. commit d75a0bd6fd0b1cb4eff4b229875191fbd32b5152 Author: John Bowman Date: Sat Nov 12 16:18:24 2005 -0600 Another workaround for gcc 3.3.4 problems. commit e2e8ccb6f2f541217ec1f0a8d2a165e0471a9531 Author: John Bowman Date: Sat Nov 12 15:57:02 2005 -0600 Workaround problem with gcc-3.3.4. commit aeb6c990724852831ffff52b19b6e86b174093c0 Author: John Bowman Date: Sat Nov 12 15:22:28 2005 -0600 Added erf,erc, and gamma functions. commit 37df4f422e65e3913781aec833e38343605e4f63 Author: John Bowman Date: Sat Nov 12 13:43:42 2005 -0600 Make quotient(int,int) consistent with %. commit b8d59fe592f7024714ec5a77136ff7a9d0023406 Author: John Bowman Date: Sat Nov 12 01:56:01 2005 -0600 Fix **. commit 7d071596999b5d45c79dc76375506edf3d9fb6b3 Author: Andy Hammerlindl Date: Fri Nov 11 18:38:32 2005 -0600 Replaced std::string with mem::string for genv. Moved error reporting associated with 'as'. commit 1b01a81f25eb73d213de73c94373cb3ed3cbe499 Author: John Bowman Date: Fri Nov 11 18:22:40 2005 -0600 Added missing delete. commit 3e9f0d27ede272fb0b4fd9d6180e9edcf4ca5579 Author: John Bowman Date: Fri Nov 11 01:14:34 2005 -0600 Make bounding box computation work with -o -. commit b312e379dcdb1dc5ebe0c9310086d4cb2ec44b91 Author: John Bowman Date: Fri Nov 11 00:37:34 2005 -0600 Allow outputting to standard output with "-o -" command line option. commit 1c14fd2ec513bd332987dec787ad2e48fda7d048 Author: John Bowman Date: Thu Nov 10 23:59:13 2005 -0600 Set default pdf viewer to acroread under UNIX, just like under MSDOS. Removed pdf fuzz (a workaround for a pdf-viewing problem only of gv, not other pdf viewers). commit dc252e27f2dc18f99a09c598434b6ca0a28c6378 Author: Andy Hammerlindl Date: Thu Nov 10 10:02:55 2005 -0600 Refactored argument matching functions. commit acb62c269bc533b57f8db269b0bc843976d2f4b4 Author: John Bowman Date: Thu Nov 10 02:56:24 2005 -0600 Removed old interactive buffer flushing code. commit 49db56fcf5ae55a857fa9ebca24996f0492b513c Author: John Bowman Date: Thu Nov 10 01:58:13 2005 -0600 Choose more descriptive names latticeshade, axialshade, radialshade, and gouraudshade for shading routines. commit 6c2f1163134a5ade41a8db9e221536221f2875c7 Author: John Bowman Date: Thu Nov 10 01:17:56 2005 -0600 Respect final null entry when reading data in cvs mode (fixed). commit 3a89127a1f73df1eae54cdc0cd70df341ab5be51 Author: John Bowman Date: Wed Nov 9 23:53:32 2005 -0600 Flush input buffer every time we enter parser. commit 9e85d17616a91a523f65a239c16aaf229bbf105a Author: John Bowman Date: Wed Nov 9 20:49:29 2005 -0600 Added new keywords; fixed treetest. commit b78fd384f56f2a7e9e9fd0cfb26f1f06698ad8df Author: John Bowman Date: Wed Nov 9 20:35:22 2005 -0600 Documentation updates. commit cf629c85681f9975f907279087136664b9e540f2 Author: Andy Hammerlindl Date: Wed Nov 9 00:36:03 2005 -0600 Extended access and unravel syntax. commit 12a1791ded53de40f11fad39422b712c851e277e Author: John Bowman Date: Tue Nov 8 23:23:54 2005 -0600 Make embedded evals work within exitfunction. commit fb4c073d8a100376af5078d8e83a607545279936 Author: John Bowman Date: Tue Nov 8 23:05:11 2005 -0600 Reimplemented GUI support. commit a1b02245d9d163612c65ce76e25e41951fb9e54b Author: Andy Hammerlindl Date: Tue Nov 8 17:55:03 2005 -0600 Check for infinite recursion when loading modules. Add position info (markTrans) for codelets. commit 8f85cfa41726a8039358d7699edbc2f7f27c5dd7 Author: John Bowman Date: Tue Nov 8 14:30:10 2005 -0600 Renamed defaultpen() to resetdefaultpen and getdefaultpen() to defaultpen(). commit 9e9a8ceb1a95c2ec077c960dcad190c0c25f13bf Author: John Bowman Date: Tue Nov 8 14:11:06 2005 -0600 Updated diagostics. commit 0d092a3d344734b958f5d3b231388c520478a3d8 Author: John Bowman Date: Tue Nov 8 12:58:07 2005 -0600 Re-implemented -p (parse) and -s (translate) options. commit a1ca000656cf8892d798b4fc8132e3835dff02da Author: John Bowman Date: Tue Nov 8 10:39:14 2005 -0600 Corrections from import merge. commit fd5fb6c0df0bbbec952ee8efdff3db1cdb304011 Author: John Bowman Date: Tue Nov 8 03:36:32 2005 -0600 Reimplemented import "file" syntax. Interactive mode updates; reimplemented interactive "input" command. Documented true interactive mode. commit a679f9db485a048f7a093f22d977d455094ff0eb Author: John Bowman Date: Tue Nov 8 01:22:41 2005 -0600 Facilitate optional installation of documentation and examples to different directories. commit 00ecbbcfc69ec7a3c48c5def887fc98a05f389a3 Author: John Bowman Date: Tue Nov 8 01:19:24 2005 -0600 Added missing picture arguments to graph. commit 18696c78fa467a579e6d6c0d9acece649522669a Author: John Bowman Date: Mon Nov 7 23:26:21 2005 -0600 Remaining import updates. commit 14735e983987b664738f9bbab29953a6cdeafd7d Merge: 0b62f7038 9710028ac Author: Andy Hammerlindl Date: Mon Nov 7 10:57:39 2005 -0600 Merged in changes from the import branch. commit 9710028ac2a4550f2494a79fcdb6e441ea28c274 Author: John Bowman Date: Mon Nov 7 00:44:35 2005 -0600 Renamed autonomous argument of eval to embedded. Updated asymptote.sty. commit bd5b3c0031560966eaa9655e4d259b1c1f892544 Author: John Bowman Date: Sun Nov 6 23:01:22 2005 -0600 Optionally allow eval to run within current environment, rather than in an autonomous (distinct) environment. commit 09816a50c49d05c02c7d4d2e0643a1a65963f9a8 Author: John Bowman Date: Sun Nov 6 17:57:25 2005 -0600 Fixed eval so that environment is properly reset. Removed outnameStack. Added animate.asy module to make animations easier. Reimplemented -l (listvariables) option. commit 0b62f70388e8cbc7a7212fe76415f70ac1ffd723 Author: John Bowman Date: Sun Nov 6 17:36:58 2005 -0600 Fixed lexer error. commit fe3ac7ae1dd16b09b629339bda26cfea3be3c502 Author: Andy Hammerlindl Date: Sun Nov 6 10:57:54 2005 -0600 Checks permission of both the qualifier and the field for an unravelled field. Inaccessible (eg. private) fields are not unravelled. Added quote keyword and code type. Refactored doIBatch. commit 36c564c5e4880445b452f486d95c0ff485013781 Author: John Bowman Date: Sat Nov 5 21:45:10 2005 -0600 Removed # and ## as admissible operators. commit 2720837802489b099d25586a32ce0451c9c6f1d4 Author: John Bowman Date: Thu Nov 3 11:44:07 2005 -0600 Temporarily deactive last change. commit cc10f38f1ce5bbe06a3c0cf7314646ffa0d17eb2 Author: John Bowman Date: Thu Nov 3 11:32:41 2005 -0600 Respect final null entry when reading data in cvs mode. commit c9ddd25d7e1c1249f95070d0c1190e40d0707ba6 Author: John Bowman Date: Thu Nov 3 01:34:01 2005 -0600 Fixed memory handling and outname for line at a time mode. Switch over to using line-at-a-time mode. commit af35dac4500855ebb9efbdec808595b3701a8a07 Author: John Bowman Date: Wed Nov 2 23:46:58 2005 -0600 Added infix operators << >> @ @@ $ $$ # ##. New module fontsize.asy supports nonstandard fonts. commit 9fa2770e323fe9a2242a4733b8af3f46991069c7 Author: John Bowman Date: Wed Nov 2 13:00:16 2005 -0600 Reimplemented -laat mode. commit b4529048ec3618cec5a136f6672a8e5105ba0d01 Author: John Bowman Date: Wed Nov 2 01:39:54 2005 -0600 Merged eval with IBatch; removed laat mode. commit 58326a3eca7dfd5f809312c189338af8f2315a3d Author: John Bowman Date: Tue Nov 1 23:41:04 2005 -0600 Reimplemented eval() and execute(). Added shipped flag to save() and restore(). commit 45dd4837a78e3843b65e99b893b5f4f69ca9d173 Author: John Bowman Date: Tue Nov 1 13:28:51 2005 -0600 Fixed picture.empty(). commit d40cf552d16cdca9693b025c1fb1deff1da7d92c Author: John Bowman Date: Tue Nov 1 11:40:11 2005 -0600 Set A=unravel, Q=access, U=import to allow testing until "import into" is implemented. commit 7ea5da6eda5c4b2ae9d6e1d9a8e9444fb6cceaae Author: John Bowman Date: Tue Nov 1 02:06:27 2005 -0600 Gracefully handle errors in loading plain, etc. commit e2b4b9d50b69993f9cf9ccb340088f2b0a37d958 Author: John Bowman Date: Tue Nov 1 02:00:18 2005 -0600 Fixed interactive error handling. commit abeda671cf2e6ca69e45cc2d80df77a9bf1d759c Author: Andy Hammerlindl Date: Mon Oct 31 00:32:21 2005 -0600 Changed ignore permission modifiers to a warning for use with include. commit a43fe979f8a5ee720196d9cd2d7508ae78ebedf9 Author: John Bowman Date: Sun Oct 30 14:27:53 2005 -0600 Minor code cleanup. commit ee6c32d83cc851eba02e78e65c48cdac864817cf Author: John Bowman Date: Sun Oct 30 11:33:52 2005 -0600 In interactive mode, flush input on errors. commit edeb32b334dcbfe4b462f70fc4f93d0bd4ef297c Author: John Bowman Date: Sun Oct 30 04:41:06 2005 -0600 Allow expressions of the form (0,0,0){x,y,z}. commit 90fd95b0d77f94f426566cfe3dc7a1aa434fa74a Author: John Bowman Date: Sun Oct 30 04:34:35 2005 -0600 Removed operator symbols consisting of letters enclosed by colons. commit 7c9208f06dbbc91d397635c1b37f73c7a4a33dd5 Author: Andy Hammerlindl Date: Sat Oct 29 23:14:11 2005 -0600 Added semicolon to include. commit b380e5feb4b448bdd20e5da0f908934df33c9f1c Author: John Bowman Date: Sat Oct 29 21:49:03 2005 -0600 Allow include file as well as include "file". commit 9fa4217964d07baf22ab715898e8f99bc666d8e3 Author: Andy Hammerlindl Date: Sat Oct 29 19:16:58 2005 -0600 Added include, which translates the parse tree of the given file in place. commit c1e9731d8bf713b00e41fe776b3aeed845f4701d Author: Andy Hammerlindl Date: Sat Oct 29 14:03:21 2005 -0600 Added some form of autoloading. Bad importing does not affect the genv dictionary in interactive mode. commit 90060607dfc7092dc72546df88b773d3e1d5f0bb Author: John Bowman Date: Fri Oct 28 23:31:17 2005 -0600 Additional operator symbols can now be formed by enclosing any combination of letters (including the underscore character) in colons. commit a67283022104a1b5accc43d556674afad9f700e3 Author: John Bowman Date: Fri Oct 28 21:56:53 2005 -0600 Re-added tension3 and curl3 operators. commit 9a78050799658c969ab432695f35c3f473132b78 Author: Andy Hammerlindl Date: Fri Oct 28 17:50:38 2005 -0600 Autoplain for interactive mode. commit 56aec06506f45c100cf743c96935ec8f2b0af3cd Author: Andy Hammerlindl Date: Fri Oct 28 17:40:01 2005 -0600 Add environment rollback, for erroneous code in interactive mode. commit c8735012ac180cbdfba25d373bd370739c8a496e Author: John Bowman Date: Fri Oct 28 00:33:34 2005 -0600 Support interactive erase: outputting an empty picture produces an empty file. commit 3d8605ddb94514e5b53e0ac1b06116455d38ffb0 Author: John Bowman Date: Thu Oct 27 22:08:47 2005 -0600 Documentation now refers to Datadir variable rather than /usr/local/share. commit a7b07c58cbc9150960d106cb2b39b1c9b3ce3546 Author: John Bowman Date: Wed Oct 26 22:43:12 2005 -0600 Uptodate flag now does a shipout() as needed. commit b2d73e276904b14b731eafee152f30b44715a34a Author: John Bowman Date: Wed Oct 26 12:28:04 2005 -0600 Fixed typo. commit bb131c1588b70376eece7d7cde471a2c75644430 Author: John Bowman Date: Wed Oct 26 00:38:51 2005 -0600 Removed unused includes. commit b94a3ec4ad8d2dd068cfb88e6fb3ea73f32b780b Author: John Bowman Date: Wed Oct 26 00:34:04 2005 -0600 Remove unused code. commit 19ba7e49064b8f68186cf1895bb08cb54f4b2b54 Author: John Bowman Date: Wed Oct 26 00:09:59 2005 -0600 Fixed interactive mode error handling. Merged in return code fixes from the main branch. commit f334721ec9ac22dac7ac0d32e703eb4ccbce6ec4 Author: John Bowman Date: Tue Oct 25 23:23:02 2005 -0600 [Import] Replaced virtual interactive mode with true interactive mode. commit 2399cd7f0f57dac01ac5532fa6b85313aa517b25 Author: John Bowman Date: Tue Oct 25 11:27:30 2005 -0600 Fixed STL errors and virtual destructor warning. commit 2df11de94ed66efd5466dcba89823f431a6affe6 Author: John Bowman Date: Mon Oct 24 22:54:56 2005 -0600 Return a definite return code (rather than an error count that overflows after 256 errors). Also check for parse and translation errors. A return code of 0 means successful; 1 means a user error occurred; -1 signals a misconfiguration error (pipe, fork, or exec failed). commit d640705f9565091a774e248db1ab8b166418cdad Author: John Bowman Date: Mon Oct 24 22:02:19 2005 -0600 Set default put argument of box and ellipse functions to Above. Use convert instead of dvipng in doc/Makefile. Updated Debian URL. commit 16e5842f629b59e3917f21e6a3825a1206432a2d Author: Andy Hammerlindl Date: Sun Oct 23 21:25:28 2005 -0600 Added more changes in from the main trunk. commit cb193ddaa1db2bdfac90cc8a9522867cd8d5ac9f Author: John Bowman Date: Sun Oct 23 02:15:00 2005 -0600 Incremented version to 0.93cvs. commit f8949272355544fe98b28ef870d503b9f5579e8f Author: John Bowman Date: Sun Oct 23 01:48:50 2005 -0600 Fixed cd diagnostic. commit e91d10d96853361746e44bf87af763a90c99e94a Author: John Bowman Date: Sun Oct 23 00:50:35 2005 -0600 Fixed label bbox bug. commit ba22e55cc25e9fbbf1af7f0f70e64cd52e5e55b3 Author: John Bowman Date: Sat Oct 22 23:15:14 2005 -0600 Fixed intersect fuzz calculation. Implemented means of adjusting 3d aspect ratio. commit 0307afc0e763fae832d552a70a5990d93867640a Author: John Bowman Date: Sat Oct 22 10:49:28 2005 -0600 Updated xasy to generate GUI(int) frames instead of gui(int). commit a2892cbacb27a4b2b353efe0025fce0c65a1b2cb Author: John Bowman Date: Sat Oct 22 04:25:01 2005 -0600 Workaround missing round function under FreeBSD. commit fc2a9f4342f45a7a60f0fcdb1e4d8350e7b28565 Author: John Bowman Date: Sat Oct 22 03:41:04 2005 -0600 Fixed cxx errors. commit 288b512004959a3394b521c5acfd2fb07fe8f655 Author: Andy Hammerlindl Date: Sat Oct 22 02:54:15 2005 -0600 file brokenaxis.asy was added on branch import on 2005-10-24 03:25:28 +0000 commit 06839af15a6bafcd7bbbfeb098fc7961ffd8bcf0 Author: John Bowman Date: Sat Oct 22 02:54:14 2005 -0600 Fixed example. commit 8ddb128c9b7b2f448d4d377cc094b0859ff0b7f2 Author: no-author Date: Sat Oct 22 08:54:14 2005 +0000 This commit was manufactured by cvs2svn to create branch 'import'. commit ecbd779730fbdf6e262c93db163e27bb5ce3153a Author: John Bowman Date: Sat Oct 22 02:51:32 2005 -0600 Added missing example. commit e4be44933a2678abd007ebfd57bddf284492248b Author: John Bowman Date: Sat Oct 22 02:48:56 2005 -0600 Added scaleT Broken and example of broken x axis. commit f19cf665b8285f6e2df069d4cacffce341069dac Author: John Bowman Date: Sat Oct 22 01:45:58 2005 -0600 Moved dir argument of picture.fit() to add(frame,pair) and attach(frame,pair). Added frame align(frame f, pair dir) for aligning frames. commit 51d89c20b4806ab6a1cce8cb480e261da1e9abb2 Author: John Bowman Date: Sat Oct 22 00:03:18 2005 -0600 Implemented a new struct marker to hold marker data, including a general markroutine. Included both the default marknodes routine and a markuniform(int n) routine which draws n markers at evenly spaced intervals along the arclength of the path. commit 564aed3f7bc21cd4939b911f3371d058403e4f8c Author: John Bowman Date: Fri Oct 21 02:12:29 2005 -0600 Don't strip directory from explicit output filenames. commit 6629c2f55134e6b92dc62c4c4eb5d4fccb30538f Author: John Bowman Date: Fri Oct 21 01:23:16 2005 -0600 Documentation updates. commit f47b325d3f0dbc419a08452a2027ccb2047c01c7 Author: John Bowman Date: Thu Oct 20 01:36:43 2005 -0600 Added CPPFLAGS option to configure.ac (equivalent to CFLAGS). Fixed spurious overwrite messages. Added fuzz to label clipping to retain labels exactly on boundary. Moved intersectionpoint to plain.asy and added documentation. Renamed intersection in math.asy to intersect to intersect. Added UnFill filltype for clipping underneath frames, pictures, and labels, with examples. Make save/restore respect currentprojection. Added 3d intersectionpoint routines to three.asy. Added instructions for setting environment variables under MSWindows XP. Removed ymargin=infinity in favour of ymargin=xmargin. Documented use of Cyrillic fonts. Documented that \end{asy} environment must appear on a line by itself. commit 32ad169f5b3542da1ec48e903da457639d8e6f97 Author: Andy Hammerlindl Date: Wed Oct 19 13:37:59 2005 -0600 use is now use=import+explode. commit 0628aa7bb95026a88ff36b26060260f8ed47c439 Author: Andy Hammerlindl Date: Tue Oct 18 17:53:23 2005 -0600 Got line-at-a-time working. commit c78464d5ff2a4a37b335bd09c5a70b57c3a2c389 Author: Andy Hammerlindl Date: Mon Oct 17 19:31:59 2005 -0600 Import can infer the filename. Filenames given as positions are actual files. commit 4e991f81346b0711e3c3c18f65f090f19156fc88 Author: Andy Hammerlindl Date: Mon Oct 17 18:01:27 2005 -0600 Added use declaration. commit 6559104a9581c0e532e291c4166755c451f4a2bf Author: John Bowman Date: Sat Oct 15 03:14:38 2005 -0600 Fix precision errors at +/-1e-4; default format changes to scientific notation here. commit 716e22941007220a14c57ab41e1c6700e01e724d Author: John Bowman Date: Fri Oct 14 22:07:16 2005 -0600 Fixed inside(path,pair). commit db0c6be308eadd2ae2d4b3f81a652c3920574e68 Author: Andy Hammerlindl Date: Fri Oct 14 10:08:45 2005 -0600 Integrated changes from the main branch (tagged changes_for_import_oct_14). commit 7dbede8650a3b614f58004bae0f40332ba936980 Author: John Bowman Date: Fri Oct 14 01:16:49 2005 -0600 Implemented robust real cubic root solver. Removed inside, quadratic solver, and intersect routines from math.asy in place of internal C++ routines. Changed DOUBLE to TWO, etc., to avoid confusion with double roots. Implemented function bool inside(path g, pair z, pen p=currentpen); to test whether a point is inside a cyclic path. Implemented clipping of labels. Added two new fill rules to allow labels centered within the clipped region to overlap the clipping boundary. Clipping now clips all layers of a picture, not just the most recent one. Fixed bug in precontrol and postcontrol. Fixed floating point exception in complex powers when base is zero. Added Floor, Ceil, and Round functions that don't produce floating point exceptions. Made the default axis for logarithmic scaling YEquals(1) and XEquals(1). Made currentpicture the default picture in Scale(pair). Added begingroup/endgroup pairs to filldraw. Changed plane interface to return a representation of the plane through point O with normal cross(u,v). Draw over existing TeX layers when doing 3d hidden surface removal. Added face labels to cube animation. Updated installation instructions. commit 0db8a820cbd178de0f23e83b82f160eebb36ceca Author: Andy Hammerlindl Date: Thu Oct 13 15:39:16 2005 -0600 Grouped common code between record and env into protoenv. commit 166c1812dc1b3f810d98995b463e9bfcc6ac9196 Author: Andy Hammerlindl Date: Thu Oct 13 13:04:36 2005 -0600 Fixed prettyprinting of joinExp. commit adb637f8f99ac50c6fc046819813c33d77ca159b Author: Andy Hammerlindl Date: Thu Oct 13 12:43:16 2005 -0600 More specific error message for casting. commit 72379c9945ccde7a915a2d6d43b8c74de882d651 Author: Andy Hammerlindl Date: Thu Oct 13 12:42:41 2005 -0600 Fixed indenting for parse output. commit 02fa43b7a893bcd08b0459dc4969e3727dd17113 Author: John Bowman Date: Thu Oct 13 09:01:13 2005 -0600 Fixed control point bug introduced by recent straight flag fix. commit 0f9db37a420570090e30b1e2f50c1ec841d505f7 Author: John Bowman Date: Wed Oct 12 16:29:21 2005 -0600 Make default value of picture.keepAspect true. commit a246176ea243b9fb0bff994cdfcdcfd8524f68dd Author: John Bowman Date: Wed Oct 12 14:02:37 2005 -0600 Use picture defaults as default parameters in fit and size functions (locally resolved default function arguments now allow this). commit 822d263fb2742e1347e028dd93a20c0c55ad080d Author: Andy Hammerlindl Date: Wed Oct 12 11:44:23 2005 -0600 Replace ty with tyEntry for type declarations. Allows types to be imported. commit 5e141104cc6d0addcc0f1698d153becd009faf5a Author: Andy Hammerlindl Date: Tue Oct 11 21:24:14 2005 -0600 Edited comment. commit 88ef0077d414e3d97ff769ab5a701e2086e47c0b Author: Andy Hammerlindl Date: Tue Oct 11 19:29:11 2005 -0600 Straight flags are preserved when using a path as part of a guide. commit 35c9020bb49d1076276e30d2ab29db9d9cb379d7 Author: Andy Hammerlindl Date: Fri Oct 7 21:57:39 2005 -0600 Default arguments are evaluated "out-of-order" like variable initializers. commit 0cec99e8ac52736ba80006e83c4885f519e1317b Author: John Bowman Date: Fri Oct 7 14:58:33 2005 -0600 Moved animations to animations subdirectory of examples directory. plane(triple u, triple v, triple O=three.O) now returns the plane through point O with normal cross(u,v) commit 4c88f42245a5c2719976c11f50c7c4ca2828921e Author: John Bowman Date: Fri Oct 7 02:22:25 2005 -0600 Simplified plane(triple, triple, triple). Simplified Pen(int). merge no longer waits for animation to complete. Added rotating cube animation. commit bcba1612f92ef07994d8e5321ce01b138920b551 Author: John Bowman Date: Thu Oct 6 11:46:16 2005 -0600 Fixed formatting. commit 71e36c9d67813b9751474b9833c49c6059e19e9e Author: John Bowman Date: Thu Oct 6 11:17:13 2005 -0600 Added linewidth(). commit 00b525d39bdfc8843306213c8c1b66fafc12e3c0 Author: John Bowman Date: Thu Oct 6 11:11:05 2005 -0600 Removed implicit cast from real to pen; added pen operator +(pen p, real w) and defaultpen(real) instead. To avoid confusion, a dot product now requires explicit pair arguments. commit b5898745ca2f7ac639850dfe8809f3e8fadc8094 Author: John Bowman Date: Thu Oct 6 10:05:56 2005 -0600 Added new 3d surface example. commit 8fae5a35ebe087e3ce13a40eef09a1c1651dd85c Author: John Bowman Date: Wed Oct 5 23:55:15 2005 -0600 Added example of reading column data from a file and a least squares fit. Changed xsize and ysize arguments of size to simply x and y. commit 1b9472f0c0714569f7593412c17fcdd397837fa2 Author: John Bowman Date: Wed Oct 5 19:51:32 2005 -0600 Added keepAspect=Aspect option to size(pic,real). commit ec325dcd7d9c40e9d6b7fa010bfff61103e8701c Author: John Bowman Date: Wed Oct 5 19:44:19 2005 -0600 Added colinearity checks to leastsquares. commit 43e1aa502818297f37cf4b3d0c6ccdcabcda7356 Author: John Bowman Date: Wed Oct 5 01:49:20 2005 -0600 Use local copy of ticklabel and Label context variables. commit 2291108072ebe06f75430eac98a867358ce9ea11 Author: John Bowman Date: Wed Oct 5 00:12:20 2005 -0600 Reduce default axis coverage limit to 80%. commit 40026fc8e6c783b389cd59687f8e7ce7d9498689 Author: John Bowman Date: Tue Oct 4 21:48:00 2005 -0600 Minor documentation updates. commit ef0e9459d9b3b6ea84059cff63b508a71d0abcaf Author: John Bowman Date: Tue Oct 4 16:13:55 2005 -0600 Fixed default location of python under MSDOS. Improved ASYMPTOTE_PYTHON/ASYMPTOTE_XASY diagnostics. commit 14dff5e06fab759643bc6a3dcd3faf613ca687b6 Author: John Bowman Date: Tue Oct 4 15:43:14 2005 -0600 Added Windows support for xasy, including an environment variable for finding Python. Allow GUI mode in interactive mode. Added gui(real x=1) function to turn on GUI mode. commit 9754518eb38a59a3a254758587a18a2346c8be4a Author: John Bowman Date: Tue Oct 4 11:27:41 2005 -0600 Remove intermediate gif files before viewing animation. commit 6d9748b7a805505a51dea16e7238fb96a4a6c60d Author: John Bowman Date: Tue Oct 4 11:20:56 2005 -0600 Added quiet option to override -V command line option, say for producing animated gifs. If the -V option is given, gifmerge now calls animate. commit 6139176d9f0add3e1b59bfb0730a841abb92d851 Author: John Bowman Date: Tue Oct 4 00:30:27 2005 -0600 Incremented version to 0.92cvs. commit fc1dd1de6063a49253a225fdb4e59b793b80e369 Author: John Bowman Date: Mon Oct 3 23:39:06 2005 -0600 Fixed GUI transforms: grouping should not depend on deconstruct flag. commit 2173497579d327808a02fa2b6540324af8967755 Author: John Bowman Date: Mon Oct 3 23:06:24 2005 -0600 Incremented version to 0.91cvs. commit b594c603c24e875e358f0795ec6d2012b5af25fb Author: John Bowman Date: Mon Oct 3 21:24:51 2005 -0600 Flush stdout immediately before calls to fork() to avoid duplicate output. commit 844cd96140044c3f36b98f0095545edc9b2a206d Author: John Bowman Date: Mon Oct 3 02:36:26 2005 -0600 Added Andy's changes to evaluate default function arguments in the defining scope of the function, not in the scope of the caller. commit 459abeea181fd57e4a5f15e6b1951c9120197e53 Author: John Bowman Date: Mon Oct 3 02:20:02 2005 -0600 Generalized write to handle an arbitrary number of data values; improved documentation. Generate standard casts via templates. Added == and != for files. Allow casting of null to file. commit 925ea8080438e0a43970bb23d2fd07f2288d25f0 Author: John Bowman Date: Mon Oct 3 01:08:44 2005 -0600 Readded depth limit to intersect routines to prevent stack overflow. commit c024d3bfcc295da26dbeddc15893550d50817a69 Author: John Bowman Date: Sun Oct 2 15:42:30 2005 -0600 Enforce a minimum value of fuzz in intersect routines to prevent infinite loops. commit f4910c0dd9c43a6ad10fc21f8e12d73a2eafbc05 Author: John Bowman Date: Sun Oct 2 01:20:15 2005 -0600 Fixed depth handling of deferred TeX labels. Fixed error in man page (-t option). Fixed interaction of overwrite(Move) with "%" tick formats. Improved 3d axis label positioning. Added rotate(explicit pair dir) and rotate(explicit triple dir) for rotating text along a line in the direction dir. Updated helix example to illustrate rotated tick and axis labels. commit a4e788568370ce3dab091fc5040e263a7ad8965c Author: John Bowman Date: Fri Sep 30 23:40:32 2005 -0600 Incremented version to 0.90cvs. commit d066ac3daa6ffda6f0ed38c3440c47812f585155 Author: John Bowman Date: Fri Sep 30 22:42:16 2005 -0600 Documented min(frame) and max(frame). commit 3697afe04bc3125fe16db8a066e8c7e73df3f9f4 Author: John Bowman Date: Fri Sep 30 14:55:59 2005 -0600 Don't upscale logarithmic range when automax=false. commit 5f190e85df39833571eb810f5b849c626d3ab3ec Author: John Bowman Date: Fri Sep 30 12:42:28 2005 -0600 Renamed temporary included PostScript file suffix from "ps" to "eps". Removed all references to mailing list, as it is no longer in use. commit 31a4608e9b64f85824aa08b7c1e382c078848123 Author: John Bowman Date: Fri Sep 30 07:50:18 2005 -0600 Fixed .gui processing. Added new example. commit 00afce892ce6bc08cf1da0b16c8d64792a385a3e Author: John Bowman Date: Thu Sep 29 19:53:03 2005 -0600 Allow overriding of ticklabel routine for logarithmic axis; added example. commit e8192130beb7536093032069631ba8c09c5247ae Author: John Bowman Date: Thu Sep 29 18:04:46 2005 -0600 Standardized arguments to LeftTicks, etc. Fixed user-specified logarithmic ticks. commit e0f43b3c6567023fb59e5f7d9ff8848b47c7b972 Author: John Bowman Date: Thu Sep 29 01:50:22 2005 -0600 Incremented version to 0.89cvs. commit 76ffd72cb6b21bb0022f0cb55c88edc59786291a Author: John Bowman Date: Wed Sep 28 23:53:39 2005 -0600 Only build required images. commit da1daa09d06cbeaa628cbf37ddef0e8286cfb473 Author: John Bowman Date: Wed Sep 28 23:37:23 2005 -0600 Minor documentation updates. commit 917f2f1f7027027039643ceba79cedd4b8ac489f Author: John Bowman Date: Wed Sep 28 18:01:47 2005 -0600 Fixed missing label on thinned logarithmic graphs. Documented getstring and getreal. Documented vectorfield and flow example. Fixed cxx warning messages. commit 25e99790fe76f4e401885207dee8ac65637349da Author: John Bowman Date: Wed Sep 28 14:51:47 2005 -0600 Simplified, improved, and documented 3d axes routines. Renamed tickspec to ticklocate. Documented ticklocate. Removed unused symbols from camp.l. Removed spurious nullpaths from :: and ---. Documented deconstruction of guides. commit 0e7db2cd763308121b81cdd43ae3305b277df65d Author: John Bowman Date: Tue Sep 27 01:42:24 2005 -0600 Added a second optional string to Label to provide an estimate for the label size when an undefined label is encountered with the -t option. Fixed box(Label). commit f30bda16e795e11351bffc560b5898f268985bcb Author: John Bowman Date: Mon Sep 26 23:28:56 2005 -0600 Updated pstoedit patch to put brackets around rotated strings. commit 32ca492bf4247f2d27b132ecd11e0efc4067599d Author: John Bowman Date: Mon Sep 26 23:09:02 2005 -0600 Implemented data file comment character (# by default). commit abbfa2473bdc0f43d04ccf88c577b7d10f7cf59d Author: John Bowman Date: Mon Sep 26 09:05:45 2005 -0600 Used scaled epsilon to adjust right-hand axis limit. commit b8517154afba8da5c9722fe4a157459cc22f791b Author: John Bowman Date: Sun Sep 25 23:45:48 2005 -0600 Added fuzz parameter to intersect routines for finding intersections with circular approximations, etc. Also fixed these routines for paths consisting of a single point. Moved 3d intersect routine to C++ for speed. Cache 2d path bounding box. Added 3d version of expi. Increased accuracy of true Arc and Circle to approximately machine precision. Added 3d true Arc and Circle. Added 3d polargraph function. Renamed triple.cc to path3.cc. Added missing triple to path3 cast. Added patch to pstoedit-3.42 to support PNG to EPS conversion. Updated documentation. commit 43e16164cb7ec0d751c3fda881d5c9203edd4f80 Author: John Bowman Date: Sun Sep 25 21:56:47 2005 -0600 Fixed base alignment in new deferred TeX alignment scheme. commit fe5d5004425730bcc21219c5b11d67a2f535378b Author: John Bowman Date: Fri Sep 23 22:04:54 2005 -0600 Fixed shift(c) in 3d circle. commit 3265026ee25f6cd1305e8979e45e80e302ebac29 Author: John Bowman Date: Fri Sep 23 09:42:46 2005 -0600 Fixed "\\". commit 38a5b0c147988711a1c81c4add5c16014e63a0a0 Author: John Bowman Date: Fri Sep 23 01:15:56 2005 -0600 Added missing header. commit d1308e6a739f0adaf981ba90b2d318744afd6659 Author: John Bowman Date: Fri Sep 23 01:07:53 2005 -0600 Make merge use environment variable ASYMPTOTE_CONVERT. commit aedfd3263f31f033055e93799a651d7e11027069 Author: John Bowman Date: Fri Sep 23 01:02:48 2005 -0600 Added an environment variable for the location of every external command. commit 7e7027029f51071c7d3886ef32d34ff17f1445e2 Author: John Bowman Date: Thu Sep 22 23:54:43 2005 -0600 Added vectorfield routine and example. commit 3aa540f69ffce103a15046a8171dedaff62be26c Author: John Bowman Date: Thu Sep 22 23:23:39 2005 -0600 Added [inline] option to asymptote.sty to use inline LaTeX code instead of eps files, making LaTeX symbols visible to the \begin{asy}...\end{asy} environment. In this mode, Asymptote correctly aligns LaTeX symbols defined outside of the \begin{asy}...\end{asy} environment, but treats their size as zero. Added -t option to asy to request inline LaTeX code to be generated. Added modified dvipdf that accepts the dvips -z hyperdvi option. commit 5f8f76b720b722ddb20db9a99cf88c9ec7c18946 Author: John Bowman Date: Wed Sep 21 19:06:07 2005 -0600 Updated axis call. commit 10e4cb072c803e902938ed28f8e83a53cf85d411 Author: John Bowman Date: Wed Sep 21 17:58:34 2005 -0600 Replace system calls to rm/del by unlink(). commit cc1a8fec276e41d87ec44bea9fd1a62a3b40d751 Author: John Bowman Date: Wed Sep 21 02:32:44 2005 -0600 Fixed segmentation fault in straight. Fixed bug in setting straight flag in reverse. Fixed axis label placement for slanted (but straight) axes. Improved tick label positioning with slanted ticks. Simplified 3d axis routines; added autolimits function to implement 3d autoscaling. Don't cache Ticksize and ticksize. Standardized xaxis, yaxis, xequals, yequals calls (Label now appears immediately after picture argument). Check for empty pictures when drawing axes with ticks. Updated documentation and examples. commit 50fb9a5e9d19d59b826469d2092f3bcb86f5273a Author: John Bowman Date: Tue Sep 20 02:39:57 2005 -0600 Overhaul and major clean up of 2d graph module; to support 3d axes, partitioning is now done in tick value space rather than with respect to arclength. Added 3d graph axes (xaxis, yaxis, zaxis, and general axis) and generalaxis3 example. Format "" is now treated as defaultformat (use "%" to suppress labels). Updated gc to 6.6. Under MSDOS, change "rm" to "del" in merge utility. Don't print hints when there is no environment variable. commit da841cbe3ed981768a5b3a538c5034fe6b89b640 Author: Andy Hammerlindl Date: Mon Sep 19 22:53:49 2005 -0600 Added primitive import declaration. commit d1be7e398dbb104d9805583cfe4d3ab2a2e021f4 Author: Andy Hammerlindl Date: Sun Sep 18 13:11:25 2005 -0600 Removed menv from env. Simplified genv. Added load() to stack. commit c66d43934cafb628e4a901adba8feac35779b023 Author: Andy Hammerlindl Date: Fri Sep 16 09:36:50 2005 -0600 Fixed error reporting bug. commit af401fc11fe28f5eb6e9c1fbf8a8d97a94107c2a Author: John Bowman Date: Wed Sep 14 07:46:33 2005 -0600 Changed make to $(MAKE) for portability. commit 37527fbd0b818ae1e318a406256c9f53cc1cb4de Author: John Bowman Date: Wed Sep 14 01:25:28 2005 -0600 Changed nullpath to nullpath3 to avoid ambiguities. Set initial precontrol point and final postcontrol point of noncyclic paths to the corresponding node. Fixed the length of a cyclic path3. commit cc49900491763841bd0c518198e0994425bdc0cc Author: John Bowman Date: Wed Sep 14 01:17:44 2005 -0600 Added snprintf workaround for non-C99 compliant systems. commit c764e77e9f56e069c6025237580959db74c38bea Author: John Bowman Date: Tue Sep 13 09:49:18 2005 -0600 Added missing headers for Solaris/Sparc. commit cb492775d1aa6d57db89518d1b0195674d4c7577 Author: John Bowman Date: Mon Sep 12 19:47:44 2005 -0600 Fixed pair.z and triple.xx bugs. commit 765739db13af97ff1466278103aacaa6d753e1ee Author: John Bowman Date: Mon Sep 12 17:11:54 2005 -0600 Added some comments to graph.asy. commit 16d1381fc2b3e4d6447c6a59690a4c73b583dc9d Author: John Bowman Date: Mon Sep 12 13:40:40 2005 -0600 Optimized matrix times vector. commit 8398b1ea07e57578df9ddfd46c4bf9bd5627fa4c Author: John Bowman Date: Mon Sep 12 11:35:34 2005 -0600 Standardized perpendicular. commit 0b3affcd778551a39888d7258413c01d39fa5ec2 Author: John Bowman Date: Sun Sep 11 23:48:47 2005 -0600 Added 2d & 3d Metapost & operator (like --, but omits the duplicate point). commit 28f4d757bada480db359ee4d003ffe6cfe8b70fe Author: John Bowman Date: Sun Sep 11 00:34:52 2005 -0600 Fixed resolution problems of png figures in html manual. commit 52f67bd463a575127be62eb01e1784e9118c2fba Author: John Bowman Date: Sun Sep 11 00:04:12 2005 -0600 Reorganized installation instructions. commit d70a5b9c9f49e30555ad329e8440eda2ee212db0 Author: John Bowman Date: Sat Sep 10 23:33:39 2005 -0600 Handle errors due nonarray rest formals gracefully. Improved formatting. commit e48861de344a6305262c59e498a2536d91b87c6d Author: John Bowman Date: Sat Sep 10 16:10:36 2005 -0600 Updated list of errors. Changed make test to make check. "make all"/"make install" now build/install asy, asymptote.pdf, and man pages but not asymptote.dvi, asymptote.info, or asymptote.html (use make install-all if you want these too). Documented workaround for broken pdftex installations. commit c4ae0090e4795ba225b32ec40a6182eb3dd04ff6 Author: John Bowman Date: Sat Sep 10 00:38:55 2005 -0600 Removed scale(pair) in favour of scale(abs(z))*rotate(degrees(z)) to avoid confusion with xscale(z.x)*yscale(z.y). commit 5bf75dd48ece31999e8ccdf8f43cfa8f9923c822 Author: John Bowman Date: Fri Sep 9 23:58:11 2005 -0600 Don't cache MidArrow and Bar sizes. commit 63d12a1b39b9e0a85f5bf1582b8f140023ab0560 Author: John Bowman Date: Thu Sep 8 22:24:26 2005 -0600 More intuitive interface: perpendicular(pair z, pair align) now uses an alignment argument. Documented virtual structure functions. Updated documentation to emphasize that face is derived from picture. commit 07af5223c26d25a298cbc74b0f331e9fb0bfc00b Author: John Bowman Date: Thu Sep 8 10:38:27 2005 -0600 Updated Help section. commit 588d950082edb16d84e25be3cbe05e508a7b7752 Author: John Bowman Date: Wed Sep 7 12:13:36 2005 -0600 Updated documentation. commit 566985801e6c0016f03ade1e7db72b5dee3ae8e9 Author: John Bowman Date: Wed Sep 7 08:45:08 2005 -0600 Document structure inheritance. commit e4850df18d08b20a1a0031dc799a1da03d5791d4 Author: John Bowman Date: Wed Sep 7 02:22:17 2005 -0600 Fixed floating point exception problems in axes routines. Check for negative linetype arguments. Minor example updates. commit ee4a1841c89110ed62e8f397ac854e002a530da3 Author: Andy Hammerlindl Date: Tue Sep 6 21:40:47 2005 -0600 Changed indenting. commit 02117670c8e92b45396d72f7d75a66302fd5ff36 Author: John Bowman Date: Tue Sep 6 01:42:51 2005 -0600 Incremented version to 0.88cvs. commit 7381eb69cad5fee52307ccee7f9f5bb09e76d0d8 Author: John Bowman Date: Tue Sep 6 01:01:17 2005 -0600 Minor documentation updates. commit 8426dac2922f320c9369e3c3c879d3c546e7fa66 Author: John Bowman Date: Tue Sep 6 00:26:06 2005 -0600 Fixed cxx warning messages. commit bfa77f49f22c3c1a9905fc66f09218427754b879 Author: John Bowman Date: Mon Sep 5 23:59:01 2005 -0600 Added pen option to filltype to specify an interior pen distinct from the boundary pen. Removed Filltype in patterns in favour of a deferred filltype. Removed explicit size arguments from bbox (as done with shipout some time ago). Updated filltype and 3d documentation. commit 029d2e662b47c387ebebc13fc90260674c9043d0 Author: John Bowman Date: Mon Sep 5 22:01:25 2005 -0600 Implemented general hidden surface removal using a binary space partition. Fixed perspective and orthographic when camera is below the XY plane. Also added perspective(real,real,real) and orthographic(real,real,real) functions. Fixed draw((0,0,0)..(1,0,0)) and draw((0,0,0)). Added convenient 3d circle and arc functions. Added abs(triple) (equivalent to length(triple)). Added Longitude(triple), which ignores errors along +/- Z axis. Ported near_earth and conicurv examples from featpost3D.asy to three.asy. Added == and != for structures (equivalent to alias and !alias, respectively). For convenience, array push members now return the pushed element. Added missing shift in Label.out(frame). Updated documentation. commit 62289d14547a9a96b915e53bb87178dec28a8af5 Author: Andy Hammerlindl Date: Sat Sep 3 20:33:09 2005 -0600 Added permissions back in. commit 89b48c38495c92ae2108c6fa93735932b5177815 Author: Andy Hammerlindl Date: Sat Sep 3 14:05:22 2005 -0600 Added more testing. commit cc9711396b3d99f223d3ce58bb5bc2e3ea129dde Author: Andy Hammerlindl Date: Sat Sep 3 14:04:15 2005 -0600 Refactoring! - most #include "camp.tab.h" lines removed in favor of modifier.h - access now uses actions (READ, WRITE, CALL) to control encoding - fundef and newFunctionExp merged - name refactor, and it also uses actions - permission information moved to varEntry (but not in use yet) commit 8c465e2c865829415c1c60ddd084ec17e27dc73d Author: John Bowman Date: Thu Sep 1 15:26:50 2005 -0600 Moved surface to graph3. Added 3d analogues of 2d graph functions. commit c336fc6032e8eb6146f635de4dc5c5abf32f1150 Author: John Bowman Date: Thu Sep 1 12:52:52 2005 -0600 Added numerically robust quadratic equation solver. Added min(path3) and max(path3) functions. Simplified and documented 3d arc (analogous to 2d arc). Implemented path3 to guide3 cast. commit 72ab08a82b828d1868e45e295d12469115cf9529 Author: John Bowman Date: Thu Sep 1 02:12:51 2005 -0600 Added 3d intersect and dir functions. Added 3d arc function that is consistent with the usual circle approximation. commit 26441f264c21d9376c26c103b4a00d7d1b3d8ccc Author: John Bowman Date: Wed Aug 31 18:26:04 2005 -0600 Removed diagnostic. commit 5599da98c47e89d4ba0058ff96f2ebf53477d13d Author: John Bowman Date: Wed Aug 31 18:23:57 2005 -0600 Documented constructors; changed triangle.asy to use a constructor. commit 360bcfc43026cf5dddbc1692ef35b17b9d6cb28e Author: John Bowman Date: Wed Aug 31 16:58:55 2005 -0600 Fixed permissions for static functions in structs. commit 5279f696adb7332aabb12a394e0b5fcac02eb0c4 Author: John Bowman Date: Wed Aug 31 11:24:46 2005 -0600 Simplified path3 constructor. Added subpicture example. Fixed datagraph example. Minor documentation updates. commit 4f47e8440a219498412fce8e4721ea4f949c40a8 Author: John Bowman Date: Wed Aug 31 01:41:29 2005 -0600 Use same internal structure for path3 as for path, to facilitate port of various path.cc functions to 3d. Added subpath & associated functions. commit fcda858c92f5ca9c20a7ba421e94309fbf56691e Author: John Bowman Date: Tue Aug 30 00:07:16 2005 -0600 Expose Relative(pair) alignment function. Use arclength rather than length for determining default label position on paths. commit 43eb997c76185828eac94dfd1ad2498e2fc30fa9 Author: John Bowman Date: Mon Aug 29 23:24:20 2005 -0600 Added path3 type. Separated project into path3 conversion and projection. Added 3d arclength and arctime functions. commit cc0b4f16dd93c017221d7e082cf10bf012d1cb6c Author: John Bowman Date: Sun Aug 28 23:19:54 2005 -0600 For surface plots on a regular mesh, handle hidden surfaces from any camera location. commit b47a093a96a40b4d58c5fdf86b26b24dda3c2ac6 Author: John Bowman Date: Sun Aug 28 03:16:04 2005 -0600 Added Relative(real) and Relative(pair) functions for labelling paths relative to the total arclength and local path direction. Feynman updates (including new function texshipout); moved MidArrow and added MidArcArrow to plain.asy. Fixed optional position argument of BeginArrow, etc. Update documentation; simplified Makefile. commit 7e30a5847d91c0e08bfed33bd1d0f763f3929302 Author: John Bowman Date: Thu Aug 25 14:44:40 2005 -0600 Incremented version to 0.87cvs. commit b33c29486e4f7697ac6ff8444ac5641f7b8caaa7 Author: John Bowman Date: Thu Aug 25 11:43:04 2005 -0600 Fixed make clean. commit 5ce73d12c6f676e99e9dc392a00a9448c4a8ba77 Author: John Bowman Date: Thu Aug 25 11:35:32 2005 -0600 Fixed problems with make man. commit b8e26eb32eafc8a674fe7e6806ff9656da1839c3 Author: John Bowman Date: Thu Aug 25 11:14:51 2005 -0600 Incremented version to 0.86cvs. commit 0c5f16e4dbde2c1209a417db0a404596396b8705 Author: John Bowman Date: Thu Aug 25 04:10:49 2005 -0600 Makefile tweaks. commit 658c1b7f623d01f6ff7e454f621a819b51442af2 Author: John Bowman Date: Thu Aug 25 03:45:18 2005 -0600 Add hyperlinks to pdf manual; fixed margins. Use imdisplay for ImageMagick display under MSDOS. commit bac5cf8a82384218a78e1743b14c645c2698498a Author: John Bowman Date: Thu Aug 25 01:55:51 2005 -0600 ASYMPTOTE_DIR can now be a list of directories (separated by : under UNIX and ; under MSDOS). Fixed size_t errors. commit 2157ec961f63928fd95ef2b04fa11f851cc1ca66 Author: John Bowman Date: Thu Aug 25 00:38:31 2005 -0600 Added curl3 operator. Implemented 3d generalization of Hobby's Metafont angle calculation that is invariant to rotation and reduces to his 2d splines in the planar case. Removed 3d direction specifiers (no longer required) from circle example in surface.asy. Merged and simplified tridiagonal solvers. When writing paths, output direction angles in degrees. Handle null cyclic arrays. Added min() and max() members of picture to calculate the picture size to date. Updated documentation. commit e685b2a806c0c2bb1c8beda7ead479ae675807f9 Author: John Bowman Date: Tue Aug 23 10:40:35 2005 -0600 Diable automatic rotation of pdf files "based on the predominant orientation of the text on each page". commit 55914553c8440b7b4ac8e2423a5c080a22030948 Author: John Bowman Date: Thu Aug 18 20:24:56 2005 -0600 Include boundary conditions in solution of Dirichlet tridiagonal solver. commit 70a06b0b923c7911fa5fbf8427297b342b8ffa1e Author: John Bowman Date: Thu Aug 18 03:01:56 2005 -0600 Fixed special case of periodic tridiagonal solver. commit 040f50da4445fad17611025aa46b4f5f52bf782b Author: John Bowman Date: Thu Aug 18 02:27:01 2005 -0600 Allow cyclic indices only on arrays with virtual cyclic flag set to true. Added Dirichlet and periodic tridiagonal solvers. commit 94d5472306d9d06618fe428bb8f4c4af8d9566d1 Author: John Bowman Date: Wed Aug 17 01:33:03 2005 -0600 Reduce infinity for tension at least infinity on alpha platform. commit ed54c57b4095c29f9bce4658f313f8f1b23c08c7 Author: John Bowman Date: Wed Aug 17 01:10:37 2005 -0600 Make interactive help work in MSDOS. commit e7d2370d6993de8e00e153dc787cf0a3ab6f14be Author: John Bowman Date: Tue Aug 16 21:58:04 2005 -0600 Added online help option; exit is now a synonym for quit in interactive mode. commit e621bd70a3c91d65c111824db2f36ffe547a314b Author: John Bowman Date: Tue Aug 16 11:21:25 2005 -0600 Improved icon. commit e285c4e78b5b64f4f5a0f80de0eaa1fcd4ef95f7 Author: John Bowman Date: Tue Aug 16 01:37:41 2005 -0600 Fixed MSDOS build; improved icon. commit c3b7054be1c1f937277ac5dcc6c501e776013221 Author: John Bowman Date: Tue Aug 16 00:46:23 2005 -0600 Windows resource template. commit f251f15b694eff9573d0d2da2e3d8214feed9266 Author: John Bowman Date: Tue Aug 16 00:45:31 2005 -0600 Improved configuration; added icon for Microsoft Windows. Updated documentation. commit ef1855a10432ecd48f01762799ecb2044ced1085 Author: Andy Hammerlindl Date: Mon Aug 15 21:56:13 2005 -0600 Generalized bug fix in simplex. commit f2b4d285f723813d8a455af0ccd8145e1f56ece0 Author: John Bowman Date: Sat Aug 13 20:05:49 2005 -0600 Incremented version to 0.85cvs. commit 7b11142da66ef38ec197aa6902196c423fe2270d Author: John Bowman Date: Sat Aug 13 16:04:24 2005 -0600 Added compilation option msdos for producing Microsoft binaries. commit b222335e2e00d5d009e397b0293aa613880df4c1 Author: John Bowman Date: Sat Aug 13 15:23:33 2005 -0600 Removed obsolete file. commit 8a1308cfa9c96aa34e3b0549c9e9aa84f552ddfd Author: John Bowman Date: Sat Aug 13 14:29:43 2005 -0600 Workaround truesize=0 bug in simplex.asy. commit 8c3fb84711ff038d3cfdd98b660dc5fd0605261d Author: John Bowman Date: Sat Aug 13 02:14:40 2005 -0600 Added lattice gradient shading; check pen size in Gouraud shading to avoid segmentation fault. Copy data and palette arrays in palette.asy. commit 92d4165ebc6399b7e19ba73b0106714b55dc1a4f Author: John Bowman Date: Fri Aug 12 22:06:54 2005 -0600 Added 3d reflections. Swapped triple arguments of rotate(real,triple,triple) for consistency with the 2d reflect(pair,pair) syntax. commit 458ddeb5d1b31bd2b4521db28f3e73fd35a6d040 Author: John Bowman Date: Fri Aug 12 18:58:04 2005 -0600 Removed (size_t) array.size() casts as they are no longer needed. commit 8fd359bbc24b543bb02812ce022f16e9098f6bcb Author: John Bowman Date: Fri Aug 12 17:43:09 2005 -0600 Added support for Gouraud shading. Moved nullpath into plain.asy. commit d1124e20942c9936b8496aa81f556523578bd1ee Author: John Bowman Date: Fri Aug 12 14:01:12 2005 -0600 Cleaned up autosize code; more pair to align changes. commit 5b6bcc41a9a5592baceac64eeaa70a9b94432dce Author: John Bowman Date: Fri Aug 12 01:22:26 2005 -0600 Updated example; removed extra instance of defaultformat. commit 2278332d804f2eaf243134bd1ec2fd70667ca657 Author: John Bowman Date: Fri Aug 12 01:04:45 2005 -0600 Put label parameters in a structure called Label, to which a string can be cast, and which can be rotated and shifted (in Postscript coordinates). Updated examples and documentation. Fixed automatic sizing under picture transformation (particularly under rotation) and handling of an unspecified size in one direction (denoted by infinity). Added size(real Size) function that ensures each dimension is no more than Size. Added scale(bool) function for enabling or disabling autoscaling in both directions. Simplified 2d graph and palette code. Added begingroup/endgroup checks. Added array append method. Removed unused duplicate variable check code. Added virtual transform components and transform 6-tuple notation. Added pen and filltype to Legend. Removed labeldot(z) in favour of dot(Label,z). Removed labelbox and labelellipse in favour of box and ellipse. Removed labelxtick and labelytick in favour of xtick and ytick. Updated pstoedit support. commit 0712f98328d85a4b05e28ab7f8ec06fb826089c7 Author: John Bowman Date: Sat Aug 6 22:49:23 2005 -0600 Used cast from path to path[] (superpath) to simply fill and clip code. commit 6b60cb1c02e933391fe6fe71f250fbf4f06b4c76 Author: John Bowman Date: Sat Aug 6 09:18:40 2005 -0600 Remove .asy_input on exit. Disable display (which requires Xwindows) under MSDOS. Minor documentation updates. commit 471947f4346c6a081168c180d3860d0922f8ce35 Author: John Bowman Date: Sat Aug 6 02:26:52 2005 -0600 Added simpler helix example. Moved pticklabel to LeftTicks, etc., as the argument plabel. Added pTick and ptick pen types for drawing big and small ticks with different sizes, bool beginlabel and endlabel for suppressing first and last labels, and extend for drawing ticks across the graph (useful for superimposing a grid on the graph). Improved optional first and last tick/label suppression. commit 2979a61075d1158ef648fe7eddb18661dfaef4a5 Author: John Bowman Date: Fri Aug 5 00:11:15 2005 -0600 MSDOS environment variable tweaks. commit 20ffd949b7ba98ff8d14140b05d69bf9abecd6c2 Author: John Bowman Date: Wed Aug 3 21:19:47 2005 -0600 Fixed MSDOS interactive mode: the postscript viewer child process should exit, not return. Searching for an available postscript viewer is not possible in general (but the desired viewer can be specified with the appropriate environment variable). Added environment variable ASYMPTOTE_GS and drag and drop support. Make -V the default under MSDOS. Added -n (-noView) option. Updated documentation. commit fb19d535f3e2a4b7f6584e0b87433b251e9fee82 Author: Andy Hammerlindl Date: Wed Aug 3 00:40:41 2005 -0600 '' commit 37e9bb19a8f7caa9e0ef71df2d60ab936617256f Author: John Bowman Date: Tue Aug 2 16:56:01 2005 -0600 Port to MSDOS (via CYGWIN). commit 1818887efb3cdb3e028b0f916e85f17b5bbe6e52 Author: John Bowman Date: Sat Jul 30 18:06:58 2005 -0600 Removed unused file. commit 6bd7333155bf70bb3bbdb693c94232edb82c2268 Author: John Bowman Date: Sat Jul 30 18:05:56 2005 -0600 Changed operator :: and operator --- to loops. Simplified fill commands. commit b5520d7fa95220615fb9ef0b78d49ccbbf59b637 Author: John Bowman Date: Thu Jul 28 16:11:45 2005 -0600 Remove %%DocumentPaperSizes: comment inserted by dvips 5.95a. commit cea91fe4920c0a80d363ab8b9922f8a1bb6a8b08 Author: John Bowman Date: Sat Jul 23 20:44:32 2005 -0600 Simplified graph routines. Fixed nullguide3 problems. Began graph3d construction. Updated documentation and examples. commit 3b2bec7369e882e5503024872a5979ad911e63de Author: John Bowman Date: Tue Jul 19 01:21:19 2005 -0600 Updated menus. commit 914bb61f8d933fc7be05d8b3575332d8348abcde Author: John Bowman Date: Tue Jul 19 01:20:58 2005 -0600 Incremented version to 0.84cvs. commit e13ab6c7f082b61bb601f56fa8886aead6ec4e73 Author: John Bowman Date: Tue Jul 19 01:09:04 2005 -0600 Updated error test. commit 63130f923bc2c7e60dc603ab1b96213485b626c6 Author: John Bowman Date: Tue Jul 19 00:20:13 2005 -0600 Changed default angle for oblique projection to 45 degrees. Updated documentation. commit 2749b658316f1d55cabf53a1e04765f1a9f8cbc6 Author: John Bowman Date: Tue Jul 19 00:09:44 2005 -0600 Used existing internal function relativedistance for control point computations. Renamed path3 to flatguide3. Added tension3 specifier. Standardized 3d angles, rotations, and scalings. Added guide3 operator :: and ---. Added write(path[]) and write(guide3[]). Added helix example and updated documentation. commit 937788e4da1af9aea5db0b84b289d06b6513f2c6 Author: John Bowman Date: Mon Jul 18 12:17:33 2005 -0600 Determined correct signs in direction-to-control point calculation; propagate directions across nodes. commit 870b952575d525561fef879d8275535164f45e79 Author: John Bowman Date: Mon Jul 18 00:38:55 2005 -0600 Implement preliminary 3d direction to control point conversion. commit 1ded168026a740e8824a8bd26086cc5c9dbcb089 Author: John Bowman Date: Sun Jul 17 22:52:16 2005 -0600 Move math mode ($ delimiters) to within defaultformat string, to allow use of non-math mode fonts in tick labels (by providing a nondefault format string). commit 2c3bb514f504827b901d46d3a94ef5ebad7f4df7 Author: John Bowman Date: Sun Jul 17 19:20:33 2005 -0600 Fixed bug in string font(pen). Changed Angle(pair) to degrees(pair). Added Degrees(pair). commit 6f9dca898b83e9ff030ba468eddfcb1ac6965bae Author: John Bowman Date: Sun Jul 17 15:36:54 2005 -0600 Allow reading three-dimensional arrays in line mode by recognizing blank lines as block delimiters. commit 7127bd4200705f9633e0ed6347ebb1021abbe74f Author: John Bowman Date: Sun Jul 17 00:56:24 2005 -0600 Added pticklabel option for drawing tick labels with a different pen. commit cc966acccd13aa156df004d167a1d06d14f08fe4 Author: John Bowman Date: Sun Jul 17 00:02:10 2005 -0600 Added labelxtick and labelytick. Fixed tick size and shift in xtick. Updated documentation; added examples. commit 70508236ecc0b0c0ae77808bf78c4d3b855154bf Author: John Bowman Date: Sat Jul 16 19:25:01 2005 -0600 Fixed problems with autoscaling and unextended axes. commit 91bdd8bb360ed9e9e5a09865b3643cec1297582c Author: John Bowman Date: Sat Jul 16 16:11:52 2005 -0600 Renamed internal xequals and yequals routines to yaxisAt and xaxisAt. For clarity, renamed xline and yline routines to xequals and yequals. Added initializers. commit a6ee9fb43c363f80172e53212bc401986648ab90 Author: John Bowman Date: Sat Jul 16 15:27:57 2005 -0600 Disabled -laat while line-at-a-time mode is under construction (due to known segmentation fault). commit 5a6c23c6534033e74d0355aa973bdc6cca9383c3 Author: John Bowman Date: Sat Jul 16 15:25:11 2005 -0600 Added and documented remaining triple functions. Renamed Dot to dot and Cross to cross. commit 48bdb985c239e446172110af446483c9c7c54070 Author: John Bowman Date: Fri Jul 15 23:24:33 2005 -0600 Simplified three.asy; added oblique projection and ^^ operator. Added Metapost --- operator; allow :: to accept a direction specifier. Allow user-defined ++ binary operator (for consistency with -- binary operator). Minor knot velocity optimizations. Added surface example to documentation; updated cube example. Updated documentation; fixed cxx warning messages. commit f55c3d8ce0124a606e60f5a9afc7c80c85129228 Author: Andy Hammerlindl Date: Fri Jul 15 18:08:15 2005 -0600 Fixed crash caused by fixing previous crash. commit c9ee358dfb9c1d7d4649297684d3597b3a3cae38 Author: Andy Hammerlindl Date: Thu Jul 14 23:55:20 2005 -0600 Handle tensions in straight sections of paths as MetaPost does. commit f400a194bc43e83e554339a6fd37da12c6d34155 Author: Andy Hammerlindl Date: Thu Jul 14 23:36:10 2005 -0600 Fixed controls versus direction specifiers crash. commit c4dcf1344fd4a9456d9046f003bf523f1a604abd Author: John Bowman Date: Wed Jul 13 23:49:56 2005 -0600 Added array pop function. Give DIRTAG the same precedence as CONTROLS and TENSION. Added replacement :: for Metapost ... joiner (which selects an inflection-free path where possible). Added 3d direction specifiers, pending 3d conversion to control points... Added triple write and interp functions to plain.asy. commit 2199e1848a4967b147886dacc9ad31fa334092c4 Author: John Bowman Date: Wed Jul 13 12:43:04 2005 -0600 Formatting. commit 4c431fc643f1b1a7decc1cc4f4382f444bc37211 Author: John Bowman Date: Wed Jul 13 10:22:40 2005 -0600 Cleaned up controls. commit 3612779360607dc5917e9f4d02327d015c5e25ea Author: John Bowman Date: Wed Jul 13 02:25:08 2005 -0600 Renamed cycle3 to cycle. commit ac6d8ef05a0d6d73d6fec93449040fe18d80023d Author: John Bowman Date: Wed Jul 13 02:18:10 2005 -0600 Renamed controls3 to controls. commit 75d7070454393e590e98bd198bda1c9e210adb53 Author: John Bowman Date: Wed Jul 13 01:45:11 2005 -0600 Added controls3. commit 121f84f3c3e799a416d30c37275901945812d90d Author: John Bowman Date: Tue Jul 12 22:42:28 2005 -0600 Compute knot solving constants. commit 2b804bf9bd2b3d42cb81f2d97b5494fb99b55b83 Author: John Bowman Date: Tue Jul 12 22:41:55 2005 -0600 Fixed write(guide). commit 487442b4497cc979d325312e3968ee3b0dbb3dbf Author: John Bowman Date: Tue Jul 12 17:54:48 2005 -0600 Allow operator ::. commit becfe77e7d0810f52d278c8f359b6f81e43d8c2c Author: John Bowman Date: Tue Jul 12 14:51:53 2005 -0600 Added explicit check for readline remove_history. commit d65281af33667616aa7fa507e0fb586b2f02de24 Author: John Bowman Date: Tue Jul 12 14:29:30 2005 -0600 Readded installation hint about ancient readline versions. commit cea008852e9f7696fbf067f88ca61d4a212f98d2 Author: John Bowman Date: Tue Jul 12 01:33:20 2005 -0600 Fixed lookAtOrigin. commit 8873f0e6c0a6b6e000834b05aa2e40624fd4f34b Author: John Bowman Date: Mon Jul 11 23:40:32 2005 -0600 Updates to triple and three.asy. Removed unused code. commit c4bb1e07b019f9d20ca4b45f5c3b30a594bf6ead Author: John Bowman Date: Mon Jul 11 17:51:26 2005 -0600 Replaced vector by triple. commit ec576c536aa71d8f61ab36bbd4f70d9609dd71ab Author: John Bowman Date: Mon Jul 11 13:40:51 2005 -0600 Fixed casting error message. commit 2fcfc38e0b95f9389006e17a4db7c5669109b23a Author: John Bowman Date: Mon Jul 11 09:03:05 2005 -0600 Added triple type. commit 8d3006e7e73ca5749593afda62137897b1813df9 Author: Andy Hammerlindl Date: Fri Jul 8 18:07:10 2005 -0600 Graphing tests. commit df0b3e8906aea47212a01d8de43913cac4508eb4 Author: Andy Hammerlindl Date: Fri Jul 8 16:19:37 2005 -0600 Moved laat diagnostic. commit 8482bd7fc31e98344535b1b255cdc4bb7d54a28d Author: Andy Hammerlindl Date: Fri Jul 8 12:23:29 2005 -0600 Proof-of-concept code for true line-at-a-time mode. commit 5070a16600ca4489ebd6010252314d197bd52137 Author: John Bowman Date: Thu Jul 7 16:32:43 2005 -0600 Removed path to pair[] ecast. commit 85c5b9fbf6e1873dcbda8abee85821ef2bc7f1c1 Author: John Bowman Date: Thu Jul 7 14:51:54 2005 -0600 Updated example. commit 702b88ea4ed4a7c2774478ef6e2742de37d25891 Author: John Bowman Date: Thu Jul 7 14:51:10 2005 -0600 Removed explicit pair[] to guide casts in favour of operator --(...) and operator ..(...). commit f12122d7d697977227a55006a6ec0fe7c9c67aaa Author: John Bowman Date: Thu Jul 7 10:40:14 2005 -0600 Fixed default CFLAGS. commit ec04162a4cc57c28005b546366116fbd6b5fff66 Author: John Bowman Date: Thu Jul 7 09:42:18 2005 -0600 Fixed CFLAGS. commit 897655354414af0004023922f087b59e87359078 Author: John Bowman Date: Thu Jul 7 01:42:09 2005 -0600 Updated documentation. commit 96e8dcbefd26513ad7756819b82c620226afbe01 Author: John Bowman Date: Thu Jul 7 01:37:36 2005 -0600 Fixed error in CFLAGS. commit dc004fc8fc0e3827128b836efd9770149697f75e Author: John Bowman Date: Wed Jul 6 20:21:56 2005 -0600 Added implicit pair[] to guide and guide[] casts and explicit path to pair[] casts. Removed unnecessary guide=nullpath argument from graph calls. Renamed LinearInterp to Straight, to correspond to straight(path). Updated nullpath documentation to correspond to new solver. commit 435bc11e0ccd480cdd8e8d7777900a0188de1f2e Author: John Bowman Date: Wed Jul 6 14:50:50 2005 -0600 Removed -version command-line option to avoid ambiguity with -verbose (so that -vv, -vvv etc. will still work). commit 0e1511db2c1e2eb2c28ef6effc3843096c7c014c Author: Andy Hammerlindl Date: Wed Jul 6 09:11:39 2005 -0600 Change NOHASH to use #ifdef. commit d308e9c9ff7ff074165aea3052dbb7aedd353675 Author: Andy Hammerlindl Date: Tue Jul 5 21:26:42 2005 -0600 Three dimensional drawing routines (in development). commit 961c33b0a6cc451667a38b325a511817dc5f5524 Author: Andy Hammerlindl Date: Tue Jul 5 14:25:56 2005 -0600 Join operators now use rest arguments. Fixed a bug in solving empty guides. commit c8462c291d2bab76c1326b5eb6dbc3aaeb0f3d7f Author: Andy Hammerlindl Date: Tue Jul 5 14:24:33 2005 -0600 Combined duplicate code for function defitions. commit 5fbc0b1206bda3f047061e003363da1258804277 Author: John Bowman Date: Mon Jul 4 16:36:50 2005 -0600 Minor documentation updates. commit 9b3476a73d77e000535e974dcdd12012ac1aff8c Author: Andy Hammerlindl Date: Mon Jul 4 11:46:43 2005 -0600 Added back venv::list(). commit b5cde48655d6783eb11682d4a4c93a5021004fcc Author: John Bowman Date: Sun Jul 3 10:16:43 2005 -0600 Added -version command line option. commit d683279f3e5644e1b32f308afc423577e6cfc0e4 Author: John Bowman Date: Sun Jul 3 00:12:58 2005 -0600 Incremented version to 0.83cvs. commit 36064f240706d61dce609de902b06784eb5078ef Author: John Bowman Date: Sat Jul 2 23:02:03 2005 -0600 Updated man page. commit 747b96aed8fa04a140c571d59ef5af95aaca7cad Author: John Bowman Date: Sat Jul 2 22:51:28 2005 -0600 Fixed cxx warning messages. commit c67298c4406af9fa1911e77e25e125b86bb99125 Author: John Bowman Date: Sat Jul 2 22:16:17 2005 -0600 Added -d command-line option to produce extra debugging messages (currently only "named argument may be mistaken for assignment" warning). commit 3d07163a7e068e678aa0cdc012cc69688fb1e0a5 Author: John Bowman Date: Sat Jul 2 21:39:27 2005 -0600 Added arrow option to axes routines. Renamed xlabel and ylabel back to labelx and labely, respectively. commit 8615b39fd4b63a3f6e0e083feb68e2f061d2250c Author: John Bowman Date: Sat Jul 2 16:07:35 2005 -0600 Revert last changes. commit 5a0a45dbd3f057b31fd856b0022f3285ac0a004e Author: John Bowman Date: Sat Jul 2 15:46:09 2005 -0600 Fixed more cxx warning messages. commit 5a14e04b0be64ba665efaf985917eb0b889714f0 Author: John Bowman Date: Sat Jul 2 14:23:42 2005 -0600 Added configure option to detect ext/hash_map and set -DNOHASH accordingly. Fixed cxx warning messages. commit 68032946b747b4dfd1b5e3913a77e33acce913a7 Author: John Bowman Date: Sat Jul 2 12:11:44 2005 -0600 Standardized xtick and ytick routines. Renamed labelx to xlabel and labely to ylabel. commit f3eaf91cbf09737e1c02a6f63c442b03c6bbed0b Author: Andy Hammerlindl Date: Sat Jul 2 11:45:31 2005 -0600 Added NOHASH option to compile on non-gcc compilers. commit 712ee95f04440fc4cea116da8859d056a7e7b6e1 Author: Andy Hammerlindl Date: Sat Jul 2 09:55:32 2005 -0600 Excised from exp.h so that dec.h includes less. commit d41caf49827f36ba3bd2757b6b66a98102e5751b Author: Andy Hammerlindl Date: Sat Jul 2 09:49:23 2005 -0600 Allow dimensions for types in cast expression. commit 98392f1425dc4b258e1c6330d04ce408b0f44a72 Author: John Bowman Date: Sat Jul 2 03:24:05 2005 -0600 Added ability to specify custom tick locations. commit 99ec8fe50925985c7af8f279ed5cfc0ac5b60ae9 Author: John Bowman Date: Fri Jul 1 22:58:28 2005 -0600 Fix warning messages when XDR is disabled. commit 6cc9aff28f9f93fe8f0b7a186f0b0c151908be3f Author: John Bowman Date: Fri Jul 1 22:57:53 2005 -0600 Added more default initializers. commit 263a62cab3e21ffcadb3321b88e1e670ffdee4fb Author: John Bowman Date: Fri Jul 1 18:30:30 2005 -0600 Allow explicit casts to any name. Documented general implicit and explicit casts. commit 93c022eba77fe64edf81f3e1bf1ca6dff9a57edb Author: John Bowman Date: Thu Jun 30 22:57:13 2005 -0600 Documented named function arguments and rest parameters. commit 86ce95c91b1969c3dc687ca24c9c9ceeb17bc3a3 Author: John Bowman Date: Thu Jun 30 20:34:33 2005 -0600 Fixed warning messages; updated bison patch to bison-2.0a. commit d6c19397b1f035d6bc16efa94a8bf41065104b5f Author: John Bowman Date: Thu Jun 30 16:45:32 2005 -0600 Fixed more warning messages. commit 69027f1cd60cee0999ce6bdc9ca17657ff383a85 Author: John Bowman Date: Thu Jun 30 16:42:23 2005 -0600 Fixed cxx errors and warnings. commit a45db697f1d4628d213fc4a9966be95f1319b3e3 Author: John Bowman Date: Thu Jun 30 16:38:14 2005 -0600 Replaced strdup by strcpy. commit 324616f76ed6760212d89eb575aee654b58e4a99 Author: John Bowman Date: Thu Jun 30 12:41:57 2005 -0600 Renamed nullframe to newframe. commit 973f076227f1f9feb36b6cfc10e5d3a66c8d4d76 Author: John Bowman Date: Wed Jun 29 21:04:53 2005 -0600 Fixed memory leak and segmentation fault in fileio garbage collection. commit 65ba1202445428f21aa01072764d1331d581e231 Author: John Bowman Date: Wed Jun 29 20:58:11 2005 -0600 Renamed write function keywords. commit 7687aaf40c4c43f14f9b6a38fc347d9347759250 Author: John Bowman Date: Wed Jun 29 10:15:51 2005 -0600 Extend use of operator init(). commit 7bbc7ffd8f0926263ebe3dcdf3bb533c4211b661 Author: John Bowman Date: Wed Jun 29 09:59:15 2005 -0600 Added default initializer to picture; removed "=new picture" from examples. Documented operator init(). commit 40f98c94b8eebb8d980e1e5a1cb91826b8f074f3 Author: John Bowman Date: Wed Jun 29 09:11:58 2005 -0600 Removed ticksT tag. commit 7f8a16c28ede11e3d766c0076388a9e83f083a9a Author: John Bowman Date: Wed Jun 29 00:38:20 2005 -0600 Fixed memory leak in locateFile. commit 999724c552b1bc6decc328ef2bf7d5e6149e65ff Author: John Bowman Date: Tue Jun 28 16:16:00 2005 -0600 Removed unnecessary semicolons. commit 6a7bafe452621d0d92af547a3d180c5eaf840734 Author: John Bowman Date: Tue Jun 28 15:56:58 2005 -0600 Added virtual destructor. commit 42c406e577ba81982d7cc1e73c1543b55e8d192f Author: John Bowman Date: Tue Jun 28 15:53:29 2005 -0600 Added virtual destructors. commit 06a72c88aae59f5fca97df49c883053519a0eec9 Author: John Bowman Date: Tue Jun 28 14:49:30 2005 -0600 Remove xsize, ysize, and keepAspect from shipout, in favour of size(). commit 6221960d98b1eaacaa0b62a11fa58671218afa15 Author: John Bowman Date: Tue Jun 28 13:58:03 2005 -0600 Added -lgccpp also with --enable-gc=system. commit 0c8071fb5b46edc79cb7eac9b95137efe9c2b9cc Author: Andy Hammerlindl Date: Tue Jun 28 10:12:57 2005 -0600 Put reverse functions back in. commit ef73fd797e874069cb3bae12142687f5664b25bd Author: Andy Hammerlindl Date: Tue Jun 28 10:01:21 2005 -0600 Results of type overhaul: - venv now uses a hashtable to quickly look up variable of a specific type - initializers and casts are now functions in the environment - matching arguments to signatures handled by application class - (side-effects of) expressions are evaulated left-to-right - exp::trans(e, target) split into transToType (which implicitly casts) and transToType (which doesn't) - added keyword and rest arguments - added formal class to types commit 30360c059eb668792eede35aa7e70cc9795fc024 Author: John Bowman Date: Sun Jun 26 16:51:59 2005 -0600 Work around spurious uninitialized warning message under gcc 3.3.3. commit 1fab77145419b3a8c293886316cf0615aa479a31 Author: John Bowman Date: Sun Jun 26 10:51:17 2005 -0600 Code cleanup. commit 7c1f4b8c287ed51690f8f58a72c21475c73e66e7 Author: John Bowman Date: Sun Jun 26 08:43:12 2005 -0600 Allow use of single quotes to prevent system command word splitting on spaces. commit e7d84297b6fa78065f7aec133561e091d4fb0dc9 Author: John Bowman Date: Sat Jun 25 15:49:08 2005 -0600 Fixed bug in fill, due to a numerical precision issue, which shows up with g++-4.00 under optimization. Removed unused routine and declarations. commit b8c2076390a55d40feadb3582c36f6b58d0401b9 Author: John Bowman Date: Sat Jun 25 14:11:19 2005 -0600 Removed unused virtual destructor. commit e5e0222dc27968c1bc861bcf8eddb1824f058464 Author: John Bowman Date: Sat Jun 25 12:33:59 2005 -0600 Simplified tag handling. commit eb5c02ce2b1c8bedee35969a01ead70a9f1aad63 Author: John Bowman Date: Sat Jun 25 00:14:38 2005 -0600 Replace OverwriteT with integer variables. commit 53be12a2dc5107723d622b2dbb5d0adeba1a02fe Author: John Bowman Date: Fri Jun 24 18:58:34 2005 -0600 Simplified coding of endl and tab qualifiers. commit 786d08c54af70163a90e5b3c749ee9f66fafb2e0 Author: John Bowman Date: Thu Jun 23 16:34:34 2005 -0600 Incremented version to 0.82cvs. commit fc3936487524cb3f3b9c3db37dae58da1088be18 Author: John Bowman Date: Thu Jun 23 16:08:48 2005 -0600 Fixed indentation. commit bf638882197f630bc059f313818257b5e55e3ba0 Author: John Bowman Date: Thu Jun 23 15:55:47 2005 -0600 Fixed g++-4.0.0 warning messages. commit ce9963563164d53e3e56606107fc7ec2d8f8242b Author: John Bowman Date: Thu Jun 23 15:54:46 2005 -0600 Fixed cxx compilation error. commit 228fb9f82473fc672420fc8ad15818fc6002ca60 Author: Tom Prince Date: Thu Jun 23 00:45:25 2005 -0600 Cleanup headers. commit b0ce04a0381fd68e46b89e9640008521ed78d268 Author: Tom Prince Date: Wed Jun 22 23:53:11 2005 -0600 Maybe fix GC on darwin. commit 1aca5cb33094f702c4cbba83c8025b88a8db37c3 Author: John Bowman Date: Wed Jun 22 10:54:03 2005 -0600 Replaced writeP in favour of write; added writen entry points for pen, guide, and transform. commit 4aad24ec76db0bcdf85c20c8853dd32d7faf21b8 Author: Andy Hammerlindl Date: Wed Jun 22 10:16:11 2005 -0600 Fixed solving bug. commit 9047174da0fda3e36f2e661e17bf2fb30e821440 Author: John Bowman Date: Tue Jun 21 22:27:52 2005 -0600 Allow graphs with just one data point. commit a4a3810378e465f5512a6b89ac1d248391203947 Author: John Bowman Date: Mon Jun 20 17:03:14 2005 -0600 Feynman updates. commit 0ff48d1cb5a153e4809622ca1c5ddd5d5c834550 Author: Tom Prince Date: Sun Jun 19 23:18:55 2005 -0600 Split up inst.h. commit b3a216a59ca9b04ae5e0f6dbcf4071a9b52fe034 Author: Tom Prince Date: Sun Jun 19 17:53:14 2005 -0600 gcc4 is more const. commit a5ef2fede293c3b425acae8925c611a25c5db257 Author: John Bowman Date: Sun Jun 19 14:16:22 2005 -0600 Incremented version to 0.81cvs. commit 7640c06a07aa590c86937edda50221b828d92fde Author: John Bowman Date: Sun Jun 19 12:08:27 2005 -0600 Upgrade to use Boehm gc6.5 garbage collector. commit 8b0c625a0bf30a0a6d3420408728b3efd9e028b5 Author: John Bowman Date: Sun Jun 19 11:43:34 2005 -0600 Tom's patch to pool segmentation fault. commit 0b4f978f5be4ce481bc36324ce3f9d576c387a9b Author: Tom Prince Date: Sat Jun 18 10:44:58 2005 -0600 Remove obsolete maxStackSize. commit 5ef2d397015ca2b23082eb3b21e20f3862cc7ff1 Author: John Bowman Date: Sat Jun 18 10:27:49 2005 -0600 Deep copy all members of picture. commit 7ca2c12fb5c00511a1d6be5b068c7f74c94a5c06 Author: John Bowman Date: Sat Jun 18 09:59:39 2005 -0600 Quick installation instructions. commit c8bab82babbbe7ca95ca0ebbbfafb8359bdcd87d Author: Tom Prince Date: Sat Jun 18 00:28:36 2005 -0600 Tests. commit 5a3eb6b5360d49f43b8d3a9840117fb6a0457d3d Author: John Bowman Date: Fri Jun 17 23:35:20 2005 -0600 Incremented version to 0.80cvs. commit 659f7d3d6a4e5876c2d7d60a229aa2ec240a2c49 Author: John Bowman Date: Fri Jun 17 22:49:15 2005 -0600 Removed unused features. commit 3e206225f18b9cea342971f9d80cd49b87dad499 Author: John Bowman Date: Fri Jun 17 22:32:31 2005 -0600 Fixed cxx warning messages. commit ae029118e4eeb265e8e7ed33745b973a718c6a90 Author: John Bowman Date: Fri Jun 17 22:06:19 2005 -0600 Check for empty picture in secondary axes routines; added another example of a secondary axis. commit e991c4e70ea5cd8b054c959aab9d7f8fb80b5a40 Author: Tom Prince Date: Fri Jun 17 21:27:16 2005 -0600 Automate testing. commit 7170cdbcd547faac66e18d7338f5bc2ef3ecd5c6 Author: Tom Prince Date: Fri Jun 17 21:21:51 2005 -0600 Change vm::program to holds insts directly. commit 8d97404395b2f98c5e2c68c15b089d761b8b0d01 Author: Tom Prince Date: Fri Jun 17 21:20:48 2005 -0600 Compile genrun.cc seprately. commit 133bca6f546e881329dcedc281fbbe54e07657e5 Author: Tom Prince Date: Fri Jun 17 21:19:51 2005 -0600 Move vm interface to vm.h. commit 908662091c942dfdee84c686e122b3240fa4b13e Author: Tom Prince Date: Fri Jun 17 18:48:32 2005 -0600 Properly collect fileio. commit 7391769e36b96247ffa6ba708e7a4c76605032e0 Author: Tom Prince Date: Thu Jun 16 00:20:47 2005 -0600 item handles GC allocation. commit d03ea3fd7b84cb06f37cab421ea4c54c6e01ea94 Author: John Bowman Date: Thu Jun 16 00:12:16 2005 -0600 Readded 2005-05-26 fix for substr bug. commit a5dd9570b514d7c944f2c29264a9c4b430a24561 Author: Tom Prince Date: Wed Jun 15 23:47:13 2005 -0600 Make evrything use GC (except fileio). commit 879010025056803e415fb28e6bcbe2cfb9180e20 Author: John Bowman Date: Tue Jun 14 22:33:17 2005 -0600 Don't allow a picture to be added to itself. commit 814f0cd08ae74f5621277a9e6a1683693fc3dc51 Author: John Bowman Date: Tue Jun 14 20:30:06 2005 -0600 Backported recent castop.h change to g++ 3.3.4. commit 929a119630125233503a1aa11e335ea3013f8d9a Author: Andy Hammerlindl Date: Tue Jun 14 15:23:42 2005 -0600 Added getType caching. commit 5663c6136190c2ad9c1dd9037b6509fd1977d2dc Author: John Bowman Date: Mon Jun 13 10:28:09 2005 -0600 Reverted gc/gc.h change back to gc.h. commit df6c338131f8dbc1aabbb47f3ba3e34ca55a9201 Author: Tom Prince Date: Sat Jun 11 14:04:12 2005 -0600 Test collecting pens. commit 666663e0b88bbfaffef0e1f37bfb4274a6d89b18 Author: John Bowman Date: Sat Jun 4 13:51:44 2005 -0600 Document type1cm. commit b2a9d4f54135f117e09ddb79cbdc97180a0b6762 Author: John Bowman Date: Tue May 31 23:33:39 2005 -0600 Fixed autoscaling of scaled axes, e.g. Linear(x) with x != 1. commit c12f36fff471f47ccd94d6778f57c673426eeb42 Author: John Bowman Date: Sun May 29 10:06:31 2005 -0600 Added asymmetric Pythagorean tree example. commit 6c9ce87dee6a8700af83fda8b70dc1e78671f170 Author: John Bowman Date: Sun May 29 10:05:48 2005 -0600 Added aSin, aCos, aTan functions. commit 4fd7e3e1ab590d46384fb3e7e13d7bba5008165c Author: John Bowman Date: Fri May 27 16:33:21 2005 -0600 Changes for Debian port. commit 3688cbe0fcfe962cbdbb893b2161fcb293b04f88 Author: John Bowman Date: Fri May 27 15:41:56 2005 -0600 Fixed memory leaks. commit 4804e27a5a9ad3bca0830b384de9b59ed4337818 Author: John Bowman Date: Fri May 27 02:16:14 2005 -0600 Fixed memory leak. commit 4c22b96cea1ca707525c68d06399209dab20f701 Author: John Bowman Date: Fri May 27 00:44:19 2005 -0600 Added Tom's remaining garbage collection changes. commit 8b4e56cc1919f5bb9cc200880bf342710b7340c6 Author: John Bowman Date: Fri May 27 00:09:58 2005 -0600 Garbage collect files on explicit closure and at exit. commit 1043dd6738f0854a18eb06ae2f23049170dafeb2 Author: John Bowman Date: Thu May 26 09:55:30 2005 -0600 Fixed substr bug. commit 1d2aba32ccbe2ffe8d98e63f141aa9135fe3c84f Author: Andy Hammerlindl Date: Fri May 20 10:48:54 2005 -0600 Changed wording in comments. Indenting. commit f78764d8575f157d65c3fb29a57402fdb0f84b3a Author: Tom Prince Date: Thu May 19 23:45:26 2005 -0600 Use mem::string during runtime. Make encode(inst) private. item.h calls new(UseGC). commit 44d7d2eb8118d63d6677640b93df55a686e15876 Author: John Bowman Date: Thu May 19 10:16:48 2005 -0600 Incremented version to 0.79cvs. commit 06ba32ea3cc72df31457fd4cf7251b84afdbb1bd Author: John Bowman Date: Thu May 19 09:15:54 2005 -0600 Disable GC_STRING for now. commit 93e05817f8eacffccf61024f8184a1e174e61b70 Author: John Bowman Date: Wed May 18 23:27:15 2005 -0600 Port to cygwin. commit 05ef90f1dc3f03dcbf91ed112b637ff8ef3b2ff5 Author: John Bowman Date: Wed May 18 14:34:42 2005 -0600 Move file back under control of memory::managed to ensure deconstructor is called. commit 732b7af7652ff7aadd0ff33d677c7991966a4c43 Author: Tom Prince Date: Wed May 18 12:41:26 2005 -0600 Use item for everthing in inst. commit 2b9de84a90affbcca034cd53151e420ee22b68d2 Author: Tom Prince Date: Wed May 18 12:37:44 2005 -0600 Define mem::string. commit 47eb80b05a3c6f3f2d8279dcca3bd44268412840 Author: Tom Prince Date: Wed May 18 12:36:17 2005 -0600 Use coder::encode everywhere. commit 7ca4fa121bcc6842b5242c6fd021a9e26e1a5b0f Author: Tom Prince Date: Wed May 18 10:50:31 2005 -0600 Cleanup memory.h. commit 2fb95aa9a09de3f07dca638d5075e2c9a875f15b Author: John Bowman Date: Wed May 18 09:17:32 2005 -0600 Changed index to strchr for cygwin port. commit ee106d42346f159b5c4a04f9479182ff967f4fc0 Author: John Bowman Date: Wed May 18 09:17:09 2005 -0600 Fixed LIB. commit d0caf2dc14550c4cd0586c7ba95fea9a00cd5ff8 Author: John Bowman Date: Sat May 14 22:29:43 2005 -0600 Check headers earlier. commit baf991ce70cf496154b3806d230714407d80480d Author: John Bowman Date: Sat May 14 22:26:46 2005 -0600 Make --enable-gc=system also check for gc.h. commit 89e15737ee45fd6b2a82a3b6903eb5398a2d11e6 Author: John Bowman Date: Thu May 12 15:56:27 2005 -0600 Workaround "GC Warning: Repeated allocation of very large block" messages. commit dd8ec509559e108b1195377e0cfba98618aff5e3 Author: John Bowman Date: Thu May 12 15:54:42 2005 -0600 Fix NaN handling. commit a6b8695d6aa652eb4185556bee518f8b145f4077 Author: John Bowman Date: Thu May 12 08:56:42 2005 -0600 Better checkaxis test. commit 3e04076b94e311a46ae4b3a0d1e22c2bc66bb273 Author: John Bowman Date: Wed May 11 22:07:40 2005 -0600 Added --enable-gc=system configuration option to use system libgc and libgccp. commit 52a42f6f9e35ea0f38222059e4ccfdbf66b0fe85 Author: John Bowman Date: Wed May 11 03:52:11 2005 -0600 Define traceable_allocator when garbage collection is disabled. commit edd6882d84f7f5b11ddc95614016c7d2f4619ea4 Author: John Bowman Date: Tue May 10 21:52:35 2005 -0600 Added binary search routine. commit ab8884bd75e11e48bf10ce36008affb9202c5cce Author: John Bowman Date: Tue May 10 16:34:50 2005 -0600 Incremented version to 0.78cvs. commit 880ffa76cda64193d3999d076cfe05be83921d00 Author: John Bowman Date: Tue May 10 14:56:30 2005 -0600 Recommitted changes: 2005-05-10 rtprince commit 81b45f905368cd0f8cc87f42d14e132a4154a7de Author: John Bowman Date: Tue May 10 13:56:23 2005 -0600 Revert broken changes: 2005-05-10 rtprince. commit aa6798bedb31788d8a41e5aef90a45e0fd45283f Author: Tom Prince Date: Tue May 10 12:36:42 2005 -0600 Make CVS -lgccpp clean. commit 99948123780c9eddf2e553e818d116a3a5b20cd8 Author: Tom Prince Date: Tue May 10 12:31:32 2005 -0600 Make item use new(UseGC). commit f283b6b03b888608633d18b169ad15ef749507e4 Author: Tom Prince Date: Tue May 10 11:43:15 2005 -0600 Add some tests. commit f338d6ca188330b5a06160a0d393777fb63ae742 Author: John Bowman Date: Tue May 10 11:16:21 2005 -0600 Renamed example. commit 15e66f6f42b64b39deb1df4bffdeb8c4c1bd66ce Author: John Bowman Date: Tue May 10 04:37:53 2005 -0600 Distribute Boehm GC as a separate package. commit 5c9d00f9e02c175e3db240726725e35ae5facf06 Author: John Bowman Date: Mon May 9 23:08:51 2005 -0600 Fixed error in map & multimap. commit d84ef94ce525b66d05d864e5bbe76c014962f520 Author: John Bowman Date: Mon May 9 22:49:00 2005 -0600 Fixed parser leak again. commit e4f9e737d32b0e29b61e29ee7144a0c305be8766 Author: John Bowman Date: Mon May 9 21:57:44 2005 -0600 Fixed broken draw call. commit cde542ef8dc261e00c389e94c4fe0703b89686d9 Author: John Bowman Date: Mon May 9 16:41:16 2005 -0600 More gc string updates. commit 915f14d3423c86ceb4f974b2254f23eddba0129b Author: John Bowman Date: Mon May 9 16:22:25 2005 -0600 Unused file. commit 2b6d60c72af8208812baa28d45c3fed5d03bb057 Author: John Bowman Date: Mon May 9 14:01:57 2005 -0600 Handle out of memory errors gracefully. commit 6cd09e17608cc0276c7106d4fb84f83642b1ca03 Author: Tom Prince Date: Mon May 9 13:22:55 2005 -0600 list is from mem::. commit a2ead4f31103e6e2bdabd1217e5a650bee12ecbf Author: Tom Prince Date: Mon May 9 13:17:32 2005 -0600 Make theStack be mem::deque. commit 5131270c76da87b1f7691b10716c3fde47172d2c Author: John Bowman Date: Mon May 9 10:25:33 2005 -0600 Fixed segmentation fault. commit e66a390c9622e6e64fb1e2a8e1f759afffec290a Author: Tom Prince Date: Mon May 9 05:24:22 2005 -0600 Dont gc non-heap string. commit 0827cba25c7b3504b0cd28b750fc22872757f14c Author: Tom Prince Date: Mon May 9 04:58:00 2005 -0600 Fix makefile. :-( commit e7ad2436de51081564fc88f024b777d693d0c325 Author: Tom Prince Date: Mon May 9 04:56:30 2005 -0600 More gc fixes. commit 5638fbc8b10ad075f66c6bc4037167cf27a28253 Author: Tom Prince Date: Mon May 9 04:34:48 2005 -0600 GC fixes. We dont need mempool. commit a6f50a5ffba0293743b22f668e29c3d52ff3214a Author: John Bowman Date: Mon May 9 03:10:23 2005 -0600 Fixed cxx errors. commit 90060506b1d924116630f43c068f353c43da0c44 Author: John Bowman Date: Mon May 9 02:58:55 2005 -0600 Fixed memory leak in parser and translator. Cleaned up interface to the Boehm garbage collector. commit eff11626bd6dbdc7f4defa3c8597b0bca050592b Author: John Bowman Date: Sun May 8 23:06:28 2005 -0600 Revert 2005-05-09 and 2005-05-08 rtprince changes. commit df3f6816117919c0c9c6c80390956f79df6aad9b Author: Tom Prince Date: Sun May 8 22:16:41 2005 -0600 Fix picture. commit 5770ab65dbc40a56339d22a45cfa6e6174241d78 Author: Tom Prince Date: Sun May 8 21:24:28 2005 -0600 Fix item gc handling. commit 399af8081afc712686314e2ca99584d3fa158023 Author: Tom Prince Date: Sun May 8 21:12:42 2005 -0600 Collect path. commit 6fcf5fda6460ff8048649146d1e92ba4f6306c04 Author: Tom Prince Date: Sun May 8 20:35:08 2005 -0600 Collect transform. commit 8c2eff54bf17ac051dca66442c8b6cd61641e76b Author: Tom Prince Date: Sun May 8 19:56:00 2005 -0600 Create gc_atomic, and make picture use it. commit bc9d351f1e202c481fca3135307ca5895a22e2d7 Author: Tom Prince Date: Sun May 8 19:37:29 2005 -0600 Make pen garbage collected. commit a76ec0dcb389fc456cf186a06885898e1ec40002 Author: Tom Prince Date: Sun May 8 19:34:56 2005 -0600 Make picture and drawElement garabage collected. commit f5980293fd7720f87bfd6184fa0b14e5c4665887 Author: Tom Prince Date: Sun May 8 17:11:34 2005 -0600 Add gc for vm only. (untested) commit f222adf318f319d54cba8c227c5ae840411a021f Author: Tom Prince Date: Sun May 8 17:01:19 2005 -0600 We don't want libgccpp. commit 2fceb9286c372d9123e41fc088664e444a5ea25a Author: Tom Prince Date: Sun May 8 16:57:11 2005 -0600 Re-add pool.h. commit f4ac27b3d7b9622db9e79a468fe24f97ef4df510 Author: Tom Prince Date: Sun May 8 16:55:24 2005 -0600 Revert GC changes. (not tested) commit eb11d81ca9350019c9c895d9e69fe18c82523b5b Author: John Bowman Date: Sun May 8 08:57:01 2005 -0600 Figure for Geometry.asy. commit fc9cbf860d9a0ca997ddba7275cef0d50a963154 Author: John Bowman Date: Sun May 8 00:29:32 2005 -0600 Minor fixes. commit 78245d3817e355c52638694eddf8eef22cdfead3 Author: John Bowman Date: Sun May 8 00:17:30 2005 -0600 Workaround Makefile problem in gc6.3. commit 098e8a231fa9d33aaf9cf6f5483cf97e993b0b2c Author: John Bowman Date: Sun May 8 00:16:45 2005 -0600 Move trace/interrupt check to beginning of virtual machine loop. commit afc1adbc265bb2a53ad8f722f4b07d72fa248c47 Author: John Bowman Date: Sun May 8 00:05:59 2005 -0600 Revert to distributing Boehm GC as tar.gz file. commit 1f663f24a9c43942ce06938a1c573058f1a74454 Author: John Bowman Date: Sat May 7 23:52:27 2005 -0600 Distribute Boehm GC as a tar file rather than tar.gz file. commit 9d56f25d6bdebf45f6b5130ebbfe66b6aa405f91 Author: John Bowman Date: Sat May 7 23:40:14 2005 -0600 Added beginnings of a geometry module, including a triangle structure and functions to draw interior arcs of triangles and perpendicular symbols. commit b40d10e76adcebb53560471b218dc68f869e39f6 Author: John Bowman Date: Sat May 7 21:31:23 2005 -0600 Distribute generated source files. commit 360ce3d468d93ff0a5fa1bdcceecb29359487a77 Author: John Bowman Date: Sat May 7 21:30:48 2005 -0600 Fixed type of argument of dividebyzero. commit dc3a948a255cbabb1899e86bd4bc058f2a776bac Author: John Bowman Date: Sat May 7 21:05:28 2005 -0600 cxx updates. commit dc8d225183a1f02a9cebb3078bd770f645501a4c Author: John Bowman Date: Sat May 7 20:35:51 2005 -0600 DEBUG_STACK updates. commit d08008cdab9cb06362df1f2ebf13cacd1fbdbc4b Author: John Bowman Date: Sat May 7 20:07:39 2005 -0600 Minor garbage collection updates. commit 4d94ce88599400aa221991991f83c5ede8ce1709 Author: John Bowman Date: Sat May 7 11:56:54 2005 -0600 Autoconf backwards compatibility workaround. commit f56e28b3c3b9b297b80e10d42174b5244112dc25 Author: John Bowman Date: Sat May 7 11:50:19 2005 -0600 Renamed COLLECT to USEGC. commit f31faf416554c7e209f36059355b16f01eb47007 Author: John Bowman Date: Sat May 7 11:49:25 2005 -0600 Added configuration to optionally disable garbage collection. commit 45c88ca08a3da13844ddfe0fb5b4a93f19e6f2b1 Author: John Bowman Date: Sat May 7 09:48:46 2005 -0600 Fixed Makefile dependencies. commit 30a705d20fefeece1687429e0cb8470d62919bd2 Author: John Bowman Date: Sat May 7 01:38:08 2005 -0600 Implemented Boehm garbage collection. commit 9d7769ce6f88bc53a74d1372b9587e27f7f7fe84 Author: Andy Hammerlindl Date: Thu May 5 22:32:22 2005 -0600 Fixed solveSection bug. commit 06f40e2f91f484b534961af38a5185a5d9d6b466 Author: John Bowman Date: Thu May 5 13:34:40 2005 -0600 Added missing comma. commit 82fa8089d032fbacb29c7973ef6bbf2cd97d467d Author: John Bowman Date: Thu May 5 13:32:53 2005 -0600 Addressed pen plabel vs p issues. commit d40592205063e8adf7f147a81d091c800b1c24cf Author: John Bowman Date: Thu May 5 01:36:58 2005 -0600 Renamed eval(f(T), T[] A) to map(f(T), T[] A). Documented eval(string) and make eval autoload plain. Implemented T[] concat(T[] A, T[] B) to concatenate two arrays into a new one. commit 4db5971d0cd68808f77feec77f06ec1451a8a2ae Author: John Bowman Date: Thu May 5 00:46:04 2005 -0600 Added pair exp(pair) and pair log(pair). commit 28baf58075cb9ca944dd0ce8458196d7944b1db8 Author: John Bowman Date: Wed May 4 23:35:48 2005 -0600 Make int quotient(int,int) portable. Updated base files to use quotient for integer division. commit db1823ffb4c94ea156aade89dbaa912ff8303d4e Author: John Bowman Date: Wed May 4 23:19:03 2005 -0600 Make int/int return a real, as is normally desired; the new function int quotient(int,int) returns an integer quotient. commit 0a78859e787da1b7e76cb10aa793aec5d3d32d26 Author: John Bowman Date: Wed May 4 21:55:59 2005 -0600 Updated TODO items. commit bbe4c843c51d04977a1bc6b9be897acb31feb5ee Author: John Bowman Date: Wed May 4 21:55:18 2005 -0600 List iterator simplification. commit 3432a63496468bad1eadf3cdd6038e555b236f97 Author: John Bowman Date: Wed May 4 21:44:31 2005 -0600 Added reltime(path, real). commit 42610c12a7bcda076d4d18700f832eabaa629ae8 Author: John Bowman Date: Wed May 4 21:40:58 2005 -0600 Make -l option list available global variables as well as functions. commit 10d1ef281f1d9d5d6eca395da7bb7060ca1de36d Author: John Bowman Date: Tue May 3 22:24:17 2005 -0600 Minor updates. commit dce883a43c8f916ff404af6662355727471522e2 Author: John Bowman Date: Tue May 3 22:23:34 2005 -0600 For portability, explicitly check that input file isn't a directory on systems with stat. commit d5c499a61651cf1621431c65c1524b650024b759 Author: John Bowman Date: Mon May 2 21:14:15 2005 -0600 Added example of a transformable triangle structure. commit 5aaecb40c9d5d75b170995775f3939c6bfd092f9 Author: John Bowman Date: Mon May 2 16:20:02 2005 -0600 Incremented version to 0.77cvs. commit 01495eba409e943a272c0e5458e926bf97d91bad Author: John Bowman Date: Mon May 2 15:27:57 2005 -0600 Added PenMargin. commit 98466a96d92665282ce339397a4aa0cc9c0f1c93 Author: John Bowman Date: Mon May 2 15:20:05 2005 -0600 Added -l option to list available global functions. Documentation default structure constructors. commit 80a5b55488005bfb44bfadf5b1b543638bbe7d61 Author: John Bowman Date: Mon May 2 00:42:53 2005 -0600 Added missing plabel. commit 23072e44c1dab9402078ecabfc5ee1d88bbfb2f7 Author: John Bowman Date: Mon May 2 00:11:49 2005 -0600 Improved error handling in pipestream; wrap fork to avoid zombies. TeX errors should force TeX pipe to be closed. commit 1f2d5b4722b7ac5bb030f149eeb166a99cc0f56b Author: John Bowman Date: Mon May 2 00:09:25 2005 -0600 Updated examples. commit 8f133f4fd77a30c58eca35355e3025e390950841 Author: John Bowman Date: Mon May 2 00:09:10 2005 -0600 Updated documentation. commit 46b5a8b9a9c3f89d7617e6cea768fa1b0d310011 Author: John Bowman Date: Mon May 2 00:08:38 2005 -0600 Don't push a final null entry when reading an array in line mode. commit 5119ce4ff2ddb922ed9c913a18a500e54ba72837 Author: John Bowman Date: Mon May 2 00:07:12 2005 -0600 Fixed grouping in add(pair,frame,frame,group). Added put argument to pic.add, attach, etc. Added plabel argument to draw to allow labels and legends to use a different pen than the curve itself. Rearranged plabel and p arguments in axis routines for consistency. Added getstring and getreal functions. Added Mark, MarkFill frame arrays and Mark(int) function. commit 9ce6ebd16ea51561bf969560568a00f3b5b59d28 Author: John Bowman Date: Mon May 2 00:04:54 2005 -0600 Added node, value, and slope functions for paths. commit 2a5211c33c00af59ea8ec8b03a47b8ab056a6b9c Author: Tom Prince Date: Sat Apr 30 22:38:32 2005 -0600 Make camperror throw instead of queuing. commit 1077eff9ad28f73d8c6fd3717d1de6c0eff7b31b Author: Andy Hammerlindl Date: Sat Apr 30 20:31:09 2005 -0600 '' commit 445aabeee69dbdbb14d19231ff94845d5ed0c8da Author: Andy Hammerlindl Date: Sat Apr 30 16:29:58 2005 -0600 Allowed more implicit scaling. commit a02314294b9d45c57be7bfcd98d834491f54c5e8 Author: Andy Hammerlindl Date: Sat Apr 30 14:49:34 2005 -0600 Changed precedence for implicit scaling. commit ebadfa41910e30b009338d9254352d407b09c1ce Author: John Bowman Date: Mon Apr 25 23:43:36 2005 -0600 Flush exited child processes (zombies) in batch mode. commit f2ddac66cf7bd60c6f789bd100e3bbdd027aaf5a Author: John Bowman Date: Mon Apr 25 23:41:46 2005 -0600 Workaround interactive mode bug introduced by recent changes to main.cc. On multiple file runs, texpreamble should appear before any other commands. commit 9dd78b8a3bef3ead1114749f8e46d99b5269cf7a Author: John Bowman Date: Mon Apr 25 22:21:57 2005 -0600 Added example of 3d featpost3d arc. commit 8bf045189f7f7a0a75871455d90dfaebba9ec547 Author: Tom Prince Date: Sun Apr 24 21:04:01 2005 -0600 Make parseStdin() turn of lex debuging. commit b6c8be9df5782db786b484113d1daf803c5fae16 Author: John Bowman Date: Sun Apr 24 10:44:05 2005 -0600 Added Dotted(pen) function which returns a dotted pen at double the linewidth. commit 1a97fed8e248625d9b902b514afd1eb4d70c9275 Author: John Bowman Date: Sat Apr 23 17:16:57 2005 -0600 Clear existing errors on reading from standard input. commit fc009e52440aad59836f5bda105555a61bca4f7c Author: Tom Prince Date: Sat Apr 23 15:15:33 2005 -0600 Fix interrupt handling. commit 5cd7876fc7e960858f491fb2fa6b1d24803c2f1b Author: Tom Prince Date: Fri Apr 22 11:56:07 2005 -0600 Cleanup. commit 4bdb5c64660e95962e9419a81bacb33fb4a2be4a Author: John Bowman Date: Fri Apr 22 08:43:55 2005 -0600 Fixed compilation error. commit 528a9eb7c36d3a33431b775aa9328c0d3bdcdb09 Author: Tom Prince Date: Fri Apr 22 07:49:16 2005 -0600 Fix segfault. commit 95ad036c40755eea043b9421cf777b4ea7993fe2 Author: John Bowman Date: Fri Apr 22 03:21:09 2005 -0600 Replaced boost::lexical_cast with lexical.h to remove last remaining dependency on boost header files. commit a87c9886fd9fee971c0e9a8a68b599bcf047108a Author: Tom Prince Date: Thu Apr 21 22:51:44 2005 -0600 Cleanup. commit 582654800d5965700998478f02504c1ae6b5a5e6 Author: Tom Prince Date: Thu Apr 21 22:47:56 2005 -0600 Refactoring main.cc. commit 95d2376fcf7bec7c8448a72b5355fc0de65d49c8 Author: Tom Prince Date: Thu Apr 21 21:27:46 2005 -0600 More refactoring in main.cc commit fe8229b7f21ceb84165253cf9fac29a9f3086319 Author: Tom Prince Date: Thu Apr 21 21:03:35 2005 -0600 findextension is used only to strip suffix. So strip it. commit 3125ff977fe4f233f964fd0c24031b68e2180971 Author: Tom Prince Date: Thu Apr 21 13:38:38 2005 -0600 FIx interactive. commit 5a607d6d598487d1ce5b2b506e9c9ee5c6df5c5f Author: Tom Prince Date: Thu Apr 21 00:59:52 2005 -0600 More main.cc cleanup. commit c75d9f85e2ae2cac80eb10729a8e49bd0bb63b0a Author: Tom Prince Date: Thu Apr 21 00:55:02 2005 -0600 Simplify error handling. commit d8509dc2a49f364a4d645689dfb4c29450b3820e Author: Tom Prince Date: Thu Apr 21 00:33:24 2005 -0600 Start pulling appart main(), so it easier to change and understand. Doesn't do much, but gives a a place to start. commit 41c53e7bd2fb7e6b6038cc334aed8510fd12d880 Author: Tom Prince Date: Thu Apr 21 00:07:46 2005 -0600 Update ./wce. commit bc6a93c7d9a48b957f287b8d9772804a47b6a7b1 Author: Tom Prince Date: Wed Apr 20 23:40:57 2005 -0600 Remove warning about side-effects. commit cb5ae20890b4b381c3cf00ee755bb2aad0874eae Author: John Bowman Date: Wed Apr 20 23:17:54 2005 -0600 Incremented version to 0.76cvs. commit 307769f553ac965062a636ae87e7c2f61ea8f881 Author: John Bowman Date: Wed Apr 20 22:41:08 2005 -0600 Documented xline and yline. commit 1e2cdc58e3512a20d051d86f5db98b17165f4a4c Author: John Bowman Date: Wed Apr 20 18:59:59 2005 -0600 More updates. commit 31f55d67bba1b306e55f51fb061548c390465b82 Author: John Bowman Date: Wed Apr 20 18:58:48 2005 -0600 Updated axis call. commit a67f7b32d7c394487f795e397b1c90d80724ff74 Author: John Bowman Date: Wed Apr 20 16:03:54 2005 -0600 Updated binary installation instructions. commit 2807bb7d7d88aab29de67876839750836d4f76d2 Author: John Bowman Date: Wed Apr 20 14:03:36 2005 -0600 Update yaxis call. commit ee9e621e33a17428090bce4abda5eadcd372f461 Author: John Bowman Date: Wed Apr 20 11:53:41 2005 -0600 Consolidated autoload code. Suppressed "could not load" error message in interactive mode. Fixed gcc 3.2 warnings and error message. commit 26f006304e452f273eec22f9760ab372a61b90c1 Author: John Bowman Date: Wed Apr 20 11:51:58 2005 -0600 Added linear interpolation and binary search routines. commit 4fbb8d341cb219fbcbb06426fe4701cada86e41a Author: John Bowman Date: Wed Apr 20 11:49:16 2005 -0600 Moved put argument to axis routines to end of argument list, for consistency with draw. Added xline and yline interfaces to axis routines. commit 4b26843ed13d92b95faf3636add7ac8e61058ed1 Author: Tom Prince Date: Wed Apr 20 11:38:23 2005 -0600 Change stack::run(lambda*) to a free function vm::run. commit c0c1159e73655fbb275c88042d696f7bc5ed95ee Author: Tom Prince Date: Wed Apr 20 11:18:23 2005 -0600 Fix handling of bad parse. commit a2bdb64165581bf56b8a3f296d3fa4c5e1c156cb Author: John Bowman Date: Wed Apr 20 09:51:49 2005 -0600 '' commit f1a1b76217a093a1aef6256cca541fd64e507279 Author: Tom Prince Date: Wed Apr 20 08:31:22 2005 -0600 Refactor doParse(). commit ef94bc661d593da433e7ffefe62576e82ece224d Author: John Bowman Date: Tue Apr 19 22:56:48 2005 -0600 Fixed definition of correlation coefficient; added fit function to linefit struct. commit 38c1a8600dd92883783c42b0903fa4a0e0673ba8 Author: John Bowman Date: Tue Apr 19 19:59:25 2005 -0600 Implemented portable way of testing for directories (but not null files). commit c7bd80f606e4514e6e771255206becc9fb639a62 Author: John Bowman Date: Tue Apr 19 14:55:14 2005 -0600 Fixed stdin handling of parser.cc. commit 461b1d0cf62e21d560a99181cac401f24d3f958e Author: Tom Prince Date: Tue Apr 19 10:08:39 2005 -0600 *** empty log message *** commit 67231f89093d457e34144523f5df91ee9179d80a Author: John Bowman Date: Tue Apr 19 08:05:31 2005 -0600 Fixed more bugs associated with new parser. commit d89c1d9bd4147a4092c649c66385e7dffbc421df Author: John Bowman Date: Tue Apr 19 01:31:02 2005 -0600 filebuf should not be static; fixed error message. commit 1e1ab85794f8d88e80f177589caae6acac902cae Author: John Bowman Date: Tue Apr 19 01:25:18 2005 -0600 Interactive input command now checks for a directory or null file. Print an error if input file can't be loaded. commit cda4516bea221edaa2339a64026e1a6553a26110 Author: John Bowman Date: Mon Apr 18 23:35:01 2005 -0600 Make execute() autoload plain (and any gui file) again. commit e195f1e0c091671f0febfee7de49600f40cb3313 Author: John Bowman Date: Mon Apr 18 23:28:58 2005 -0600 Re-added new parser, with fixes for standard input bugs (including a segmentation fault with -p option). Attempting to read a directory or a null file now returns "error: could not load module" instead of generating an exception. commit 09533e92fde1b398234d49c3cf3ce417e2a0cc90 Author: John Bowman Date: Mon Apr 18 23:24:33 2005 -0600 Changed default value of axislabelmargin to 1. commit 0e2f1993a3e95a94ac377fe22a3a5b070bc3a656 Author: Tom Prince Date: Mon Apr 18 21:59:13 2005 -0600 Don't segfault on -p if we can't parse the file, but don't report an error. commit 3af70e113dcf07a2aa1c6d2fa7d9fa77b2104016 Author: John Bowman Date: Mon Apr 18 21:37:18 2005 -0600 Fixed cxx errors and and warnings; removed unused parser files. commit c8905be27a797dee9279c92d1c5caff98e362b62 Author: John Bowman Date: Mon Apr 18 21:10:28 2005 -0600 Revert to old parser until bugs in new parser are fixed. commit 4aa0fdc1d4eae3d12d6a6272b0d238f7e41fa447 Author: John Bowman Date: Mon Apr 18 00:50:08 2005 -0600 Fixed bug in csv mode when line mode is not set. commit fe1917dfb06755fdc2b20abc72ea1b50946636b0 Author: Tom Prince Date: Fri Apr 15 21:56:04 2005 -0600 runtime.pl updates. Actually use the generated code. commit 71b09f3e6517685436507d8aa2e383286dda1d7d Author: Tom Prince Date: Fri Apr 15 19:52:18 2005 -0600 Typos. commit b5dfef4fc8493cf776971b3a2b93c1739b576cfe Author: Tom Prince Date: Fri Apr 15 19:45:07 2005 -0600 inst.h cleanups. commit 4bad5844e10b0e5cb468b19f58fbdeaad3fb6c1e Author: Tom Prince Date: Fri Apr 15 18:42:28 2005 -0600 Implement type query for vm::item. commit 37eba3e42671869e76f88b9335f073cc9637aa1c Author: Tom Prince Date: Fri Apr 15 18:24:59 2005 -0600 We use item to store string* in inst. commit 82d1da4d0d5420e0252417c1384d7408c269b2a5 Author: Tom Prince Date: Fri Apr 15 17:21:55 2005 -0600 Fixes for runtime.pl script. commit 443ad0a35821d4d6ce45bca04df4272fe34c3499 Author: Tom Prince Date: Fri Apr 15 16:00:18 2005 -0600 Fixes for runtime.pl script. commit 87fe09e70703c07c66eb0b811c2f0245d63bfd3b Author: Tom Prince Date: Fri Apr 15 15:36:25 2005 -0600 Initial runtime.pl script. commit 38f76e10894a6d8450762115e066c09385dc317e Author: Tom Prince Date: Thu Apr 14 11:16:21 2005 -0600 Add eval. commit 18cb497cb2e9f488eaf8910d9c5dadf0d35f62ed Author: Tom Prince Date: Thu Apr 14 11:06:44 2005 -0600 Move interactive logic out of genv to main. commit 5bac10bbd4d407eb506985b7af796dcab599d462 Author: John Bowman Date: Thu Apr 14 07:40:55 2005 -0600 Interactive mode update. commit 60d2b0b790ac486e1952c53d6095e382c4a8194d Author: John Bowman Date: Wed Apr 13 21:43:07 2005 -0600 Incremented version to 0.75cvs. commit 316edfa9afeef1c80437dd321ab1d10cae708e5a Author: John Bowman Date: Wed Apr 13 21:10:38 2005 -0600 Removed figures with shading since from manual since many printers don't understand PostScript 3. commit f90afa0a8d7e062798a95fed2f7b5126c5559263 Author: John Bowman Date: Wed Apr 13 20:42:00 2005 -0600 Reduced default number of colors in images to work around postscript/pdf limitations (this prevented recent manuals from being printed). commit 5e4394905b9e0e82b2e6c605078a5b2e537c060e Author: John Bowman Date: Wed Apr 13 20:09:21 2005 -0600 Fixed segmentation fault in version 0.73. commit 7fe32aa7421f75d291fef1ad9c198648f3eedebe Author: Tom Prince Date: Wed Apr 13 18:48:48 2005 -0600 overloaded::simplify() handles allocation. commit 48c82ff272e05b3261f9400cedf5e1b6800107c2 Author: Tom Prince Date: Wed Apr 13 17:57:38 2005 -0600 Make vm::frames extendable, and make function excplicitly allocate their local variables. This might be a first step towards true interactive support or caching modules from one run to another. commit 104205234175695f554c13863db24a3c70194eb9 Author: John Bowman Date: Wed Apr 13 11:07:58 2005 -0600 Incremented version to 0.74cvs. commit 8b10e5c0d5048747ab3d671896ad4169463631ba Author: John Bowman Date: Wed Apr 13 11:00:39 2005 -0600 Make nullpath static. commit 000be41e1427bbcd86f1dcad074b91f2829bb91b Author: John Bowman Date: Wed Apr 13 09:58:55 2005 -0600 Minor updates. commit 3c6b9228e36e265a21d65a54ea86153b863a5848 Author: John Bowman Date: Wed Apr 13 09:44:54 2005 -0600 Push constructed objects as pointers. commit 3ac7a1842c014483bd0ce489a1176fa6b7106f7a Author: John Bowman Date: Wed Apr 13 09:04:07 2005 -0600 Fixed sign of virtual assembly code line numbers. commit ab5db84bedf07c340eefd9c0f72bf1782d836b5b Author: John Bowman Date: Wed Apr 13 06:21:17 2005 -0600 Fixed more warning messages. commit f41dbb672fbe2f05bab43eb36f4f408e234dcf04 Author: John Bowman Date: Wed Apr 13 05:36:59 2005 -0600 Accept cast of empty string to 0. Use string.empty() everywhere. Minor formatting changes. commit 0ae078e729359512169c0aa16b13a36aacfa1f3d Author: Tom Prince Date: Wed Apr 13 00:36:07 2005 -0600 Don't use boost iterator facade. commit 81641e23ec0ac8e8a022291f49b436e1f454e30e Author: Tom Prince Date: Wed Apr 13 00:16:15 2005 -0600 vm::item doesn't need to be memory::managed, since vm::frame is memory::managed_array. commit 3e39b59448d7c2b0d348ede3311879597100ce30 Author: Tom Prince Date: Wed Apr 13 00:04:31 2005 -0600 Fix absolute filename handling. commit e2d07ca8b0f71aeb4f904295096fea23b8394c27 Author: John Bowman Date: Tue Apr 12 23:41:53 2005 -0600 Fixed more cxx warnings. commit 5e9180ebefbfcf3d44264334874c4864c37db611 Author: John Bowman Date: Tue Apr 12 23:21:02 2005 -0600 Fixed cxx warning messages. commit c34996b55b48be33456a09b8e8bffef6eab6fbf5 Author: John Bowman Date: Tue Apr 12 22:42:21 2005 -0600 Further minor optimizations. commit 33fea10d535c3369052e3078bef76ae00b218280 Author: John Bowman Date: Tue Apr 12 15:36:18 2005 -0600 Removed unused friend declaration. commit 9816dcbe2015e60696c5fe09405fe8bcbbb328ea Author: John Bowman Date: Tue Apr 12 14:26:17 2005 -0600 Replaced boost::any with a much faster type-safe union. commit b4d16cc3936034e92f13d30a447d7502fcbeb36f Author: Tom Prince Date: Tue Apr 12 14:17:09 2005 -0600 mathop's don't need vm::stack. commit d7e8f162b4a84765be14b3e606ee8fff5495fbcc Author: Tom Prince Date: Tue Apr 12 14:08:33 2005 -0600 Move curPos out of vm::stack. commit e2ece8085ce8d724a3083d2f1b6b0653e98928ba Author: Tom Prince Date: Mon Apr 11 19:21:59 2005 -0600 Push empty item instead of (void*)0. commit 363e45400250312be8c1d279f3023d4ca92bbb45 Author: Tom Prince Date: Mon Apr 11 14:42:08 2005 -0600 Seperate parser code from camp.l and genv.cc into parser.{h,cc}. commit 2a34bbe4e752a24048c78ce70065f717097b0e7b Author: Tom Prince Date: Mon Apr 11 14:40:13 2005 -0600 Change ./ to . in searchPath to avoid .//file.asy in messages. commit bac1145753ebaec03fb6b3f5b2241c5654e94eb0 Author: Tom Prince Date: Mon Apr 11 14:28:03 2005 -0600 Reimplement locateFile using std::string. commit 96eb620a356c8ab272184a1c469ec2fd664479d4 Author: John Bowman Date: Sat Apr 9 21:20:51 2005 -0600 Fixed texpreamble for multiple files and latex asy environment. commit 38d3c03b695d85569badcfe9fb9aeb4610c56508 Author: John Bowman Date: Sat Apr 9 16:26:50 2005 -0600 Removed nonscalable fonts. commit a1eb8324978e3f0b33de9661a4f9dfb6a110fd94 Author: John Bowman Date: Fri Apr 8 23:52:01 2005 -0600 box(frame), ellipse(frame), labelbox(frame), labelellipse(frame) now return the boundary as a guide. box(frame) and ellipse(frame) prepend to frame for filling with a background colour, as illustrated in hierarchy.asy. commit 3d0f99fbb29df1712b89770aea609b48125722fa Author: John Bowman Date: Fri Apr 8 14:54:13 2005 -0600 Example of labelellipse. commit 38150cacf871ccce9229949a2d554aef1961d2dc Author: John Bowman Date: Fri Apr 8 14:52:47 2005 -0600 Added ellipse(frame) and labelellipse(frame,string,position). Renamed bbox(frame) to box(frame) for consistency. commit bfe1bee3fb0c1517a66b579cdbea6f1e733585fb Author: John Bowman Date: Fri Apr 8 14:34:04 2005 -0600 Workaround for bug in build 1671 of gcc (version 3.3 20030304) under Darwin (MacOS). commit 1b488993fb4b2441b516b1f2751fa0fac0440df4 Author: Tom Prince Date: Wed Apr 6 20:39:19 2005 -0600 Cache *ip as reference rather than pointer. commit e0db3be7f2b80020578b4635757f7c8f5d944dfd Author: John Bowman Date: Wed Apr 6 15:46:08 2005 -0600 Added check to interrupt handler. commit 4354256eafa91c99d25dba3c69eca65e512547a8 Author: John Bowman Date: Wed Apr 6 14:01:41 2005 -0600 Fixed cxx warning messages. commit 296d16b5e2ef1aa8ec4a4a49e7b318bc894b8707 Author: John Bowman Date: Wed Apr 6 13:47:25 2005 -0600 Optimized main loop. commit c39ce074bb8014113bb9ec840940e614e42413e2 Author: Tom Prince Date: Wed Apr 6 00:20:40 2005 -0600 Use error from stack.cc instead of calling em->runtime directly. commit b6f76a0cdf5a809f9b1ea8d924fe28ed9938c148 Author: John Bowman Date: Tue Apr 5 22:53:43 2005 -0600 minor optimizations commit da6b2f87a556f0284e5f9809660702ad308f2797 Author: John Bowman Date: Tue Apr 5 19:31:54 2005 -0600 Reformatted. commit 59fe028e67d4a3b84275fd9816158ba2516c31c1 Author: Tom Prince Date: Tue Apr 5 11:46:44 2005 -0600 Operator precedence fix. commit e1d84cb8c07ca8562701bd2d6ff61286fb14f95e Author: Tom Prince Date: Tue Apr 5 08:42:47 2005 -0600 We don't use stack:ip any more. commit 66fcbb23572787b34cc11179118b76d458ea0f70 Author: Tom Prince Date: Tue Apr 5 08:39:25 2005 -0600 Reapply curPos patch. commit 59bedfb4736163ad1120e4eb920a3e10cf3383c2 Author: Tom Prince Date: Tue Apr 5 08:38:12 2005 -0600 Fix interactive error reporting. commit 8bd8b52a44235a69ee721600aad0b333c862f364 Author: Tom Prince Date: Tue Apr 5 01:15:37 2005 -0600 Track line numbers in position instead of fileinfo. commit 83faf517c935524837f4a50a1ad67b64b5babfce Author: Tom Prince Date: Tue Apr 5 01:13:43 2005 -0600 Don't access program.encode directly. commit a9d21f618d29a440b461d9da1b97084990329c6d Author: John Bowman Date: Mon Apr 4 14:22:06 2005 -0600 prepend should insert after beginning of layer commit caa47b3c4d394f7354307b1500d6086a05542b89 Author: John Bowman Date: Mon Apr 4 14:07:22 2005 -0600 Make empty() use nodes.empty() rather than nodes.size(). STL list portability fixes. commit 37bd8bfcf6ace390213d77ca1c584710c581b5f1 Author: John Bowman Date: Mon Apr 4 10:29:54 2005 -0600 Ignore crop() on an empty picture. commit 2ba6652285a4da64838decebe8a391b145a17b14 Author: John Bowman Date: Mon Apr 4 00:21:02 2005 -0600 Incremented version to 0.73cvs. commit e148d97f5d334b8c9101cc5e712bfdf43378b791 Author: John Bowman Date: Sun Apr 3 23:32:55 2005 -0600 Removed spurious blank tracing lines. commit 36d887d4c3996d03601515d384a66b4a8e5851ab Author: John Bowman Date: Sun Apr 3 23:06:37 2005 -0600 Revert fileposition changes again, due to segmentation fault with -vvvvv. Moved line-number tracing code into main loop. Avoid the need for the lastpos variable by moving stack s out of main loop in main.cc. commit d6dc468977be2cb8d78ad3cc934ea6848297edde Author: John Bowman Date: Sun Apr 3 21:33:06 2005 -0600 Reinstated new file position code w/segmentation fault bug fixed. commit 5016c706f314fd3edae339e179a0aae3fa4e56ac Author: John Bowman Date: Sun Apr 3 20:18:15 2005 -0600 Backout 2005-03-17 runtime file position changes to avoid a segmentation fault. commit a662c972a14f054fb8020b901dda548395fb08b1 Author: John Bowman Date: Sat Apr 2 22:38:47 2005 -0600 Check for space format specifier as well as plus in format(string,real). commit fa2c52036aec09d39c41660d615bc8478ea7adee Author: John Bowman Date: Sat Apr 2 22:21:30 2005 -0600 Removed deconstruct flag from picture in favour of group option to picture and frame add routines. Updated documentation. commit e5e5b81d881e8330e0800c9ed4f7062ac4f06215 Author: John Bowman Date: Sat Apr 2 17:29:41 2005 -0600 Added missing file. commit 519fb5f6221bea0b6a25b307b53cfc61b87aedd0 Author: John Bowman Date: Sat Apr 2 17:17:16 2005 -0600 Reimplemented deconstruction at a lower level to allow both pictures and frames to be deconstructed (or grouped with begingroup/endgroup). Deconstruction now works properly with clipping and erasing. commit 2eba6f6c6a39ff2db84ae9ca2a8700250a90c47b Author: John Bowman Date: Fri Apr 1 22:22:03 2005 -0600 Check that drawLabel::bounds is called before drawLabel::write. Remove unused setup code. commit 7c08dfff446cecac5832f32f94676ec2c565a33e Author: John Bowman Date: Fri Apr 1 12:37:28 2005 -0600 Added attach(pair,picture,frame) to automatically increase the picture size to accomodate adding a frame about a user coordinate. Added warning about erasing deconstructed pictures. Updated lineargraph and documentation to use attach. commit ec22ed8430fe48a777e50d0eabdd6068d2b97923 Author: John Bowman Date: Thu Mar 31 23:14:38 2005 -0600 Reset bounding box when prepending. commit 70a385b41d057ae2b2d4654d4443cd792c88cdb1 Author: John Bowman Date: Thu Mar 31 22:47:16 2005 -0600 Fixed label alignment vs. positioning transformation problem. Removed frame labelBox() in favour of void labelbox(frame); updated example. Make logarithmic checks in autoscale conditional. xlimits and ylimits now adjust deferred drawing bounds. Simplified bboxstack handling. Updated "errors" list. commit 218a1aec30e912b2163aa99d01b72e06f2884c71 Author: John Bowman Date: Thu Mar 31 15:37:05 2005 -0600 Revert configuration to only require boost headers. commit 52ca63f613a70900b70ceceb7487a23ba2e1bf75 Author: John Bowman Date: Thu Mar 31 13:15:17 2005 -0600 Backout boost fixes. commit 8f6948bbed2dec4684a2cc9250f4082703bf8340 Author: Tom Prince Date: Thu Mar 31 13:08:04 2005 -0600 Revert boost::filesystem changes. commit eb6083d2e0151c7eb1744d2e331e37ecdf3b61d4 Author: John Bowman Date: Thu Mar 31 01:22:29 2005 -0600 Added explicit linear equation solver; used to handle general matrix inversion. Fixed return type of real[][] * real[]. Hard coded 2x2 and 3x3 determinants. Update documentation. commit aaed4d5294abe74371a37b7a553a2db7be5e55c1 Author: John Bowman Date: Wed Mar 30 19:06:36 2005 -0600 Fixed cxx warning message. commit bf7b8df5f764ae59371c2aa91b77c07fa323a001 Author: John Bowman Date: Wed Mar 30 18:54:42 2005 -0600 Minor updates. commit 102a82598df9eebad1f7e92a59e5d2f2c0973704 Author: John Bowman Date: Wed Mar 30 18:15:06 2005 -0600 Added portable version of boost::filesystem for systems without boost library, in particular for linux-alpha cxx compiler. commit 203e724f777b81f73cf16f49d4833c54573281bb Author: John Bowman Date: Mon Mar 28 21:22:47 2005 -0600 Updated documentation. commit 26bfdbd489bd80c70c00d24d2b3eab19b5ad4e64 Author: John Bowman Date: Mon Mar 28 21:06:24 2005 -0600 Allow compatibility with older versions of autoconf. commit e93fb2dd08b2ea3c6ef7510369f5837e7c0dc489 Author: John Bowman Date: Mon Mar 28 17:11:35 2005 -0600 Updated configuration and documentation regarding boost-1.32.0 library. Improved format(string,real). Generalized histogram and changed order of arguments of frequency and histogram (bin boundaries are now given before the data). Fixed problems with Log(false,false). commit ea08512c386ea0e3068a3fcbc69ebe610d05371a Author: John Bowman Date: Fri Mar 25 11:56:40 2005 -0600 Cache drawelement bbox contributions where possible. Make bboxstack local to picture frame. commit 38b3478ce4eb79d069db1f492b937898c3b5b5dc Author: Tom Prince Date: Thu Mar 24 23:46:41 2005 -0600 We generate .png's. commit 36945d15e89b3f8799ebbc7e75d22bdf947de965 Author: Tom Prince Date: Thu Mar 24 20:51:59 2005 -0600 Don't have symbolToFile anymore. commit 9142a4fb926e4fbf87925d46dd9d568487af9335 Author: Tom Prince Date: Thu Mar 24 19:00:39 2005 -0600 Use boost::filesystem for find files to parse. Move file locating logic to locate.{cc,h}. commit 93557aea87b06de332ab234a23b7aceeb32be86a Author: John Bowman Date: Thu Mar 24 18:34:14 2005 -0600 Simplified legend examples. commit 8bae1619df7f3e202d595eebce4b549bcc0691a5 Author: John Bowman Date: Thu Mar 24 08:35:06 2005 -0600 Workaround makeinfo indentation bug. commit a20cafa013be9b196bd9d0d16e3fb99ae455a1e0 Author: John Bowman Date: Thu Mar 24 08:02:51 2005 -0600 Fixed typos. commit c3ba5df64f4fe77a8bc60a4e151da7a597832404 Author: John Bowman Date: Wed Mar 23 20:49:30 2005 -0600 Simplified example. commit 3638add962f94d5a7ab9b67836651af7cd9a8362 Author: Tom Prince Date: Wed Mar 23 20:13:13 2005 -0600 Have main load plain.asy and ${outname}.gui explicitly, rather than doing it implicitly in genv::genv(). commit be8225df1cfcc4b92d44e9fce54cd6562538f921 Author: John Bowman Date: Wed Mar 23 14:25:54 2005 -0600 optimized crop() commit d2e19f53b74698fc8711cfc20ca1940602998322 Author: Tom Prince Date: Wed Mar 23 11:14:24 2005 -0600 *** empty log message *** commit 3d72ae80c6a6ea6c1a2c58b5e5c086b8c920dd24 Author: John Bowman Date: Tue Mar 22 23:27:53 2005 -0600 Incremented version to 0.72cvs. commit 9713361a9c50528eff627030657649e2e7693d7d Author: John Bowman Date: Tue Mar 22 23:03:18 2005 -0600 Document leastsquare routine. commit 82c080b20250de2b5065be142f890c7a7fa1409a Author: John Bowman Date: Tue Mar 22 22:50:22 2005 -0600 Removed obsolete files. commit dd5dbfceb01f48c9a1119b93469cad6c05b7e0ed Author: John Bowman Date: Tue Mar 22 22:32:58 2005 -0600 Documented save() and restore(). Renamed linetest.asy to lines.asy. commit decbe43f004ee675a248521b2ffb487498541e74 Author: John Bowman Date: Tue Mar 22 21:51:41 2005 -0600 Added and documented Andy's drawline routine. commit 50858377e0e544f796e4ca2a5a8e87f090a03aa3 Author: Andy Hammerlindl Date: Tue Mar 22 21:43:51 2005 -0600 Added saving and restoring of the graphics state. commit c4a6cf35979b776be9c87ea2a94316662d90e5ec Author: John Bowman Date: Tue Mar 22 21:14:57 2005 -0600 Cache picture bounds. commit 6c8f487edf8437f5b644b60ee966c6ccceb53fd7 Author: John Bowman Date: Tue Mar 22 17:30:09 2005 -0600 Reinstated crop; use current value of userMin/userMax in xlimits and ylimits. commit e287b942d25b5c25a33ddaca210d5d6cc1660a2c Author: John Bowman Date: Tue Mar 22 15:05:30 2005 -0600 Added further legend example. commit 2608c42e32a1e9d5231cec42cd0a1316ce6e17e3 Author: Tom Prince Date: Tue Mar 22 10:25:12 2005 -0600 cxx doesn't like const objects in containers. commit de8cfe019ed7d54db013879124b035faa48a975c Author: John Bowman Date: Tue Mar 22 09:21:43 2005 -0600 Document alternative for legend fitting. commit 17d2b4039eff53dc9a683c3b31ba3e62a1ac4153 Author: John Bowman Date: Tue Mar 22 00:10:38 2005 -0600 More cxx warnings fixed. commit 37dee37bf464d8f25ea1de2733a1bc78629b6b23 Author: John Bowman Date: Mon Mar 21 23:56:46 2005 -0600 Fixed g++ warning messages. commit 534a66210790997c8a37bca0f481dcdc62cbd651 Author: John Bowman Date: Mon Mar 21 23:54:01 2005 -0600 Fixed warnings/errors under cxx. commit 65e4f31b4647b63d4cdf6f4874c6aa9fb73b248e Author: Tom Prince Date: Mon Mar 21 23:37:08 2005 -0600 Move vm::item to its own file. commit d3363bdad6baecad5c1960e35f26b9fa7a72a57e Author: Tom Prince Date: Mon Mar 21 23:32:30 2005 -0600 Header file cleanup. commit 5efd8d91def53af4ac8c74fd53944d87ca2a9e77 Author: John Bowman Date: Mon Mar 21 23:17:08 2005 -0600 Make legend a separate picture that can be positioned and aligned like any other picture (see lineargraph.asy example). The legend must now be explicitly added to the picture, for example, with add(point(E),legend(20E)); Palette also now returns a new picture. commit abde5ee31a1ee9014bf78832a4ebb6ad68db1f9c Author: John Bowman Date: Mon Mar 21 22:02:56 2005 -0600 Updated move limits to be compatible with SW alignment. commit a89a01614b66946253fc2324154744bc5eb93a61 Author: Tom Prince Date: Mon Mar 21 17:28:54 2005 -0600 Use free function vm::pop instead of vm::stack::pop. commit 7337e906dec5de1d9dd59e13df99914e0492b690 Author: Tom Prince Date: Mon Mar 21 17:27:31 2005 -0600 std::equal is much faster than explicit iteration. commit 1100fa20b52c550cf8802943ec4e552c2e298fa7 Author: Andy Hammerlindl Date: Mon Mar 21 13:31:47 2005 -0600 Replaced the implementation of solving guides into paths. Refactored the abstract syntax of operators. commit f9ff6a61a29c8df50659f730f98be728830c3e22 Author: John Bowman Date: Mon Mar 21 12:04:22 2005 -0600 Changed marker filltype default to NoFill. Introduced Above/Below and Crop/NoCrop variables. commit 9e96f3aa2e744d9561c4d13d8cc3a9ef983a7200 Author: John Bowman Date: Mon Mar 21 12:03:57 2005 -0600 Code cleanup. commit 9e6f2a3f6c0099ec6642567d96932f63683cd836 Author: Tom Prince Date: Mon Mar 21 11:06:20 2005 -0600 memory::insert(poolitem) was eating most of the runtime. Use std::deque instead of std::set. commit 4ad3c0531e5651b82d52ba87a77e9bd24c469b58 Author: John Bowman Date: Mon Mar 21 03:23:10 2005 -0600 Prepend only nonextended axes in current layer. Fixed xlimits and ylimits; removed obsolete crop() routine. Updated documentation. commit 8d5dfdfef662e70079daca1ab2d7eacde8aa157a Author: John Bowman Date: Sun Mar 20 19:48:04 2005 -0600 Draw axis on top of cardiod. commit 9c65b619f46aafa4f1740a246d5822f2759fa478 Author: John Bowman Date: Sun Mar 20 18:33:14 2005 -0600 By default, draw axes before other objects in current layer. Fixed frame alignment scaling. commit 50427ac154c38238346d706ca405a9c27fa94c3c Author: Tom Prince Date: Sun Mar 20 18:32:39 2005 -0600 Add include guards. commit 2559e39aa5e57726af10cbce4aa18fe4b072f3f9 Author: John Bowman Date: Sun Mar 20 18:12:50 2005 -0600 Added least-squares fit. commit d5790371c28c11ad3fb59e9639fa793d8774f897 Author: Tom Prince Date: Sun Mar 20 18:03:45 2005 -0600 Use free function vm::pop instead of vm::stack::pop. commit 2f9c6d87b5cbcafbd133f2778c902b6946630047 Author: John Bowman Date: Sat Mar 19 02:26:51 2005 -0600 Added append boolean option to output and xoutput. Omit "runtime" from error(). Added frame marker(path g, pen p=currentpen). commit 2930373bc264af10e3d75bd2e235f13c1a110cf8 Author: Tom Prince Date: Fri Mar 18 16:41:29 2005 -0600 Rename namespace mempool to memory. commit 6cc71345e7d4f8cee34a4dc04a64cc34c31a5b50 Author: Tom Prince Date: Fri Mar 18 16:23:24 2005 -0600 Add file headers to castop.h, mathop.h. commit 80e51aa8fea171856bab468c3e2da0ede814bbb1 Author: Tom Prince Date: Fri Mar 18 16:17:06 2005 -0600 Move all template runtime code into dedicated files castop.h and mathop.h. Cleanup all refrences to stack.h, so it isn't needlessly included. commit b6bfe0819d57b214d867d97667cc136795c66c0f Author: Tom Prince Date: Fri Mar 18 15:33:24 2005 -0600 Header include cleanup. commit 80effa0d6bb808717f83af951713fefa158962cf Author: John Bowman Date: Fri Mar 18 00:08:01 2005 -0600 Allow one to turn on autoscaling again with xlimits(infinity,infinity), etc. Accept an overall scaling of frame alignment shifts. commit 51d64fc33109cb620b83f7ea178af6c087bff5c0 Author: John Bowman Date: Thu Mar 17 23:32:30 2005 -0600 Fixed interaction of new automin/automax scale flags with xlimits/ylimits. Use a small tick by default for unlabelled intermediate decade ticks. commit 52e53208a208b0e56ff90abbbf3b9be38a2c02a7 Author: Tom Prince Date: Thu Mar 17 17:41:41 2005 -0600 Remove UNALIAS, since it is no longer needed. commit 397d1bf1f4f50b93574cb180a183c960774997f9 Author: Tom Prince Date: Thu Mar 17 17:33:16 2005 -0600 Simplify runtime file position reporting. commit 2e6f6c8542028bc6a00e040fbc2b86eb566d6cc9 Author: Tom Prince Date: Thu Mar 17 16:26:35 2005 -0600 Start refactoring stack::run. commit e84e3416c48b1dcc8a721d9e2878232748196081 Author: Tom Prince Date: Thu Mar 17 16:24:34 2005 -0600 Replace inst::alloc with inst::makefunc + inst::popcall. commit d7eba25b48d76a51b2b1b782304f6ef524dacf16 Author: Tom Prince Date: Thu Mar 17 16:16:44 2005 -0600 stack::globals is obsolete. Get rid of it. commit 20a985d093f7b8df432a47b88ee3cf7ef9e0b970 Author: Tom Prince Date: Wed Mar 16 23:38:04 2005 -0600 Fix return breakage. commit 0b5a5e6156eb4c79c6db84d48e2cf8c058a06586 Author: John Bowman Date: Wed Mar 16 23:09:05 2005 -0600 Don't draw logarithmic subticks by default when number of big ticks > 2. commit d5c5be3576859a1bbe7ed82d52cb1d8763c8c571 Author: John Bowman Date: Wed Mar 16 23:01:16 2005 -0600 Show 10 subticks by default for thinned logarithmic graphs. commit e10e7227dfc2f8207a0d50e08e6a30d7c874de78 Author: John Bowman Date: Wed Mar 16 22:17:20 2005 -0600 Fixed interactive line number reporting for files that are input. commit be0831999916b554453bb60f96d94adb69156270 Author: John Bowman Date: Wed Mar 16 16:32:31 2005 -0600 Fixed more cxx warning messages. commit 0b1916bf9c61187d2d9d2c5cbed0c4a49712443b Author: John Bowman Date: Wed Mar 16 15:52:12 2005 -0600 Fixed cxx unused variable warning messages. commit d4c280afadf164fe1539250a0dcdb1ca4e49ae63 Author: John Bowman Date: Wed Mar 16 15:35:40 2005 -0600 Added frame alignment (analogous to label alignment) for positioning frames on picture. Generalized and simplified palette bar interface by using frame alignment. Renamed addabout to add, drawabout to draw, fillabout to fill, and filldrawabout to filldraw. Updated documentation; added examples of frame alignment and histograms. commit 1289a2376a96ec8ec157bb6a794dce806be47808 Author: Tom Prince Date: Wed Mar 16 13:12:31 2005 -0600 A record (and module) is just a function that allows you to access its variables after it is done. Implement them this way. commit 062f45417029bba8694775bd9ca8450ec5c3b640 Author: Tom Prince Date: Wed Mar 16 11:44:40 2005 -0600 We don't use opcodes for functions any more, so remove instAccess. commit 5fb48426cf966b45cbd368c7f7cc5a0b40d23ff1 Author: John Bowman Date: Tue Mar 15 23:39:30 2005 -0600 Documented bool empty(frame). commit bfe787b7e336948ca51c21277dfd5c472b772779 Author: John Bowman Date: Tue Mar 15 23:26:58 2005 -0600 Changed arithmetic opcodes to functions. commit ee5d5b58d89b0a31b66ffab6bb610beac948cdcf Author: Tom Prince Date: Tue Mar 15 22:05:15 2005 -0600 We don't treat files specially, so get rid of class. commit 9db8586587d8c24499e0650400e4b90263c2c774 Author: John Bowman Date: Tue Mar 15 14:54:29 2005 -0600 Moved interrupt check into main loop. commit 6330fd67d2b69f53825b092e60afaaff12453044 Author: Tom Prince Date: Tue Mar 15 12:26:47 2005 -0600 The only symbols should be coming from symbol::trans(). commit eadcc002fb7d0cd06ead3e3744077c461ce12912 Author: Tom Prince Date: Tue Mar 15 12:25:12 2005 -0600 Use get<>() instead of any_cast<>(). commit afe9283bc03ed01aa5ed7987d3a5396ce045c72f Author: Tom Prince Date: Tue Mar 15 12:10:03 2005 -0600 Use $(OPTS) instead of $(OPT), which doesn't exsist. commit 4b10272ee1cecf6d708877603c95c8f107ff688d Author: John Bowman Date: Mon Mar 14 22:49:40 2005 -0600 Incremented version to 0.71cvs. commit 4dcca5a6ee04e4f29421bd24499152aa96fe4a40 Author: John Bowman Date: Mon Mar 14 22:33:12 2005 -0600 Added missing #endif. commit 383b26609aa5102f7d342736bfef372d4c21c6ce Author: John Bowman Date: Mon Mar 14 22:32:02 2005 -0600 Fixed preprocessor conditionals. commit 0e07ff07bb3f2137aa47507892c4ab24c168b0e3 Author: John Bowman Date: Mon Mar 14 22:18:31 2005 -0600 Fixed dummy fpu exception support for machines lacking C99 fenv routines. commit 2e0ab93f26d039a7cba2e13cd6464c747e9b3ea7 Author: John Bowman Date: Mon Mar 14 21:48:27 2005 -0600 Removed reference to deleted xdr files. Added gv sigint.patch to prevent interactive interrupts from closing the gv window. commit 80ce8944a5b5832e3f1e1d4ffbf7fea40b54f33d Author: John Bowman Date: Mon Mar 14 21:46:14 2005 -0600 Added missing prototypes for cxx compiler. commit 63779cce323b91fa6281ba6bd068650097a3a762 Author: John Bowman Date: Mon Mar 14 21:31:12 2005 -0600 Improved error and interrupt (ctrl-c) handling in interactive mode. Mask floating point errors by default in interactive mode. By first issuing an explicit reset command, code can now be entered prior to executing an interactive input commands. Added scroll(int n) and string cd(string) commands. Added Jn and Yn Bessel functions. commit ec1b3228b405a1a100345c0efe421798b096da6e Author: John Bowman Date: Sun Mar 13 22:38:38 2005 -0600 Fixed bug in extension with a robust (and faster) parametric solver. commit a7c355ff72ea19fd57cc3e1989875beb792ca9c3 Author: John Bowman Date: Sat Mar 12 05:25:01 2005 -0600 Added -bw option to convert all colors to black and white. Removed double(file) in favour of single(file,false); also added csv(file,false) and linemode(file,false). commit d0f6dd2c556dd61fa48a2eb28a531d9016a40cf5 Author: John Bowman Date: Sat Mar 12 04:19:52 2005 -0600 Minor change to palette interface. Replaced image.asy with more compact example to reduce distributed file sizes. commit efb59b62abef788b02fb99676f9d3fb79ef69d03 Author: John Bowman Date: Sat Mar 12 02:22:59 2005 -0600 Removed textpen argument from image labels. commit c041cbd3576922d0756468e12bc919a6c346d724 Author: John Bowman Date: Sat Mar 12 01:57:32 2005 -0600 Fixed image support for pstoedit asy backend. commit 035fe65aa42f296fe516a61c46fbf25938bbb7ca Author: John Bowman Date: Thu Mar 10 19:01:45 2005 -0600 Thin crowded logarithmic axis. commit 4d60967bba5f19dc2b2538cb02a42f4cfa8ad394 Author: John Bowman Date: Thu Mar 10 17:20:02 2005 -0600 Updated examples to use XEquals rather than xequals. commit 4d127046c1aeaf8bebc840ed2ed09893e006b96f Author: John Bowman Date: Thu Mar 10 17:12:52 2005 -0600 Generalized secondary axes to handle any scaling (e.g. logarithmic) and removed the two bool options (no longer needed). Improved tick divisor calculation when automin=false and automax=false. Added and documented file double(file) to complement file single(file) for setting the precision of real XDR reads and writes. Cleaned up automin and automax in scaleT and autoscaleT. commit 6e65c7e185989b36577c5c93892e246c4795f246 Author: John Bowman Date: Thu Mar 10 08:21:59 2005 -0600 Removed unneeded -I- compilation flag. commit 595553923d62ae661cfb3d0aa2b40dccd6a1fe55 Author: John Bowman Date: Wed Mar 9 23:53:24 2005 -0600 Incremented version to 0.70cvs. commit 477df127590bb09da07214bcb04c7c1f84a9ca94 Author: John Bowman Date: Wed Mar 9 23:34:58 2005 -0600 Install xdr image in examples directory. commit a235c2ad03054ff8c75e5386ac8c5e9f0b6fd5ed Author: John Bowman Date: Wed Mar 9 23:21:56 2005 -0600 Fixed warning message. commit b049cd6f95bad9bb455aaae5e88778b2d83b39c5 Author: John Bowman Date: Wed Mar 9 22:53:55 2005 -0600 Fixed font. commit 004fbe06c5160327d3e0d57e285bceca1d4309db Author: John Bowman Date: Wed Mar 9 22:44:32 2005 -0600 Recommended use of XEquals and YEquals axes over internal xequals and yequals routines. commit aed4ec201a50e40d2eb0215defb879fccab7dfde Author: John Bowman Date: Wed Mar 9 22:20:38 2005 -0600 Suppressed misleading warning message. commit 57fa041fe8d124e9e1dad7125ae5220686fa8a45 Author: John Bowman Date: Wed Mar 9 21:47:55 2005 -0600 New example. commit 143a26dcb567685d0ce5929e89dcb4b8b23f413d Author: John Bowman Date: Wed Mar 9 21:42:55 2005 -0600 Fixed numerical precision bug in extension (in math.asy, reported by Gao). commit 3c3f932905cf0868c195752793d10c6df1a03daa Author: John Bowman Date: Wed Mar 9 21:07:45 2005 -0600 Fixed secondary axis tick selection; Improved tick selection for crowded axis when automin or automax=false. Added n-point unit cross routine. Added Grayscale and Rainbow palettes. Documented color density images, palettes, and mark option to draw routine, with examples. commit 8b0eaeda7aaca5029fa1f0924520cd06fe30d303 Author: John Bowman Date: Tue Mar 8 23:34:28 2005 -0600 Slightly reduce default number of colors to workaround gs pdf limitations. commit 6d2e05fe3e90fdb73704ea448f7dbfd339f5bcfe Author: John Bowman Date: Mon Mar 7 23:56:26 2005 -0600 Added missing file. commit 74f2191aa08dc4fdfb950d6d6f10e99cb1b1f72e Author: John Bowman Date: Mon Mar 7 23:31:44 2005 -0600 Added support for generating image density plots and palettes. Added support for data markers, including cross, plus, and polygon markers. Added min and max functions for 2d and 3d arrays. Fixed tick divisors in secondary axes. Deep copy path arrays to avoid suprises. Fixed limits() in graph.asy. Respect "#" in format strings (allows trailing zeros). commit e9c130603cd14c2f9261748346df2ee80a32b3a6 Author: John Bowman Date: Sat Mar 5 13:16:18 2005 -0600 More general example of secondary axis. commit eef695ff4e84a60a0fa0d58cc0a818b9d2c33f7e Author: John Bowman Date: Sat Mar 5 13:14:54 2005 -0600 Fixed secondary axes bug; xlimits, ylimits, and limits now use properly scaled user values. commit 1469b143e3743035b7ffe4304bfbba9c061de31e Author: John Bowman Date: Sun Feb 27 21:51:58 2005 -0600 Minor optimizations. commit 16be11de9bfed8e2983390a7d1707c7c8a5b2b8e Author: John Bowman Date: Sun Feb 27 12:40:32 2005 -0600 Adjusted margins so that arrows all have same length. commit 8940ceb61e0415275a2b7265b27a3fe34fcb7c6a Author: John Bowman Date: Sun Feb 27 12:23:50 2005 -0600 Updates to support Microsoft Windows. commit dc010b20c1564f1a064b8cff721693a095136ece Author: John Bowman Date: Sun Feb 27 10:49:10 2005 -0600 Fixed finite(pair). commit e2452b93245390c6864dd50a65a0fdbd2d24e361 Author: John Bowman Date: Sun Feb 27 06:29:47 2005 -0600 Incremented version to 0.69cvs. commit 284f5e02bf7f045ab6821cc1c26ba10ab7f0c0e8 Author: John Bowman Date: Sun Feb 27 05:59:56 2005 -0600 Added Andy's constraint removal code for even better simplex optimization. commit 9e276662765e27ac0b8f8bc53e9ea0885598edb7 Author: John Bowman Date: Sat Feb 26 23:14:35 2005 -0600 Updated to use Margin rather than subpath. commit 9f1d95c1a9fa14497433f86fa5e523cae1d28b3d Author: John Bowman Date: Sat Feb 26 23:00:33 2005 -0600 Incremented version to 0.68cvs. commit e1193e95f3a895b2436d75d50f8f73d69607de77 Author: John Bowman Date: Sat Feb 26 20:48:49 2005 -0600 Initialize font explicitly to ensure compatibility between tex pipe and final latex processing and to ensure tex pipe font is properly reinitialized. If picture cannot be fit to requested size, scale size by sqrt(2) and retry. Added gv-3.6.1 patches; updated documentation. Modified pstoedit patch to remove unneeded shipout(). commit f1526a9885d8746dfbccefc4a3f3d48816535145 Author: John Bowman Date: Sat Feb 26 15:55:50 2005 -0600 arrowsize updates commit ba482f250756a7ee89fc7df79392230497bab022 Author: John Bowman Date: Sat Feb 26 02:23:43 2005 -0600 Removed superflous constraints before solving linear programming problem. commit aacb768217a0a0ddf10d7b2a55e9d8da8462bf75 Author: John Bowman Date: Fri Feb 25 23:51:35 2005 -0600 Check that r.c >= 0 in selectVar (this guarantees that r.t[col] < 0). commit 68f312a4eaca8c4925e21ba8d3436c3126d3a79b Author: John Bowman Date: Fri Feb 25 21:31:21 2005 -0600 Optimized simplex pivoting. Made global constants static. Fixed recently introduced error in relative(picture, pair). commit 0abdc841e8ec1ad324258ab524cab6c7d80469e4 Author: John Bowman Date: Fri Feb 25 12:11:52 2005 -0600 Minor errorbar updates. commit 1913234e5ee42aa76300e99a70b0792902a8d2ee Author: John Bowman Date: Fri Feb 25 12:11:20 2005 -0600 arrowsize updates commit df425036e10f798c76c6365bb24829756bbebf5f Author: John Bowman Date: Tue Feb 22 00:41:54 2005 -0600 Incremented version to 0.67cvs. commit 28f501a320b2177f7f89546088c3099dba9414eb Author: John Bowman Date: Mon Feb 21 23:41:21 2005 -0600 Improved selection highlighting in GUI. commit 5c106d79c1aef1fd3bd9d9d91d93a1e0013d428d Author: John Bowman Date: Mon Feb 21 00:12:23 2005 -0600 Put quotes around outputted font command string. Set camp::TeXcontaminated to false upon decontaminating. commit a861c5bd3d1d6333fcde9290442726b3b06bc538 Author: John Bowman Date: Sun Feb 20 22:57:04 2005 -0600 Moved interactive rejectline code back into main.cc. commit 16e08c8092a9c7e639629cd36870c407dcde1f1e Author: John Bowman Date: Sun Feb 20 22:16:09 2005 -0600 Moved cleanup functions into exitFunction. commit 4c195053d81f69264b9421d77302fae11dbdb7bc Author: John Bowman Date: Sun Feb 20 21:41:20 2005 -0600 Added atexit function. A shipout() command is added implicitly at file exit if no previous shipout commands have been executed. The examples were updated to remove any unnecessary shipout() calls. Used atexit to clean up asymptote.sty and interactive mode. Files with no drawing commands now work with -f pdf. commit 503dbcab8b4dc6b733411ef0e9ac21074ecffa48 Author: John Bowman Date: Sun Feb 20 03:07:38 2005 -0600 Fixed (logarithmic and other) scalings of XEquals and YEquals axes and errorbars. commit 7547285f427c4996be8f1dadc0dd5af8c1d7536c Author: John Bowman Date: Sun Feb 20 02:28:25 2005 -0600 Fixed typo. commit 604d36b68a3f98a069991f0983d6b31807cdbb9b Author: John Bowman Date: Sun Feb 20 02:25:04 2005 -0600 Incremented version to 0.66cvs. commit ad29e30984369623437ef0fa56d92524a1288668 Author: John Bowman Date: Sun Feb 20 01:47:46 2005 -0600 Fixed location of latexusage.tex. commit 0558d6d8a9e537a64e6d9b7c831d7e0bd112faa5 Author: John Bowman Date: Sun Feb 20 01:39:25 2005 -0600 Incremented version to 0.65cvs. commit cfcc1092d054a6061a4f73f9fd5143210e7b1941 Author: John Bowman Date: Sun Feb 20 00:28:21 2005 -0600 Fixed typos in example. commit e516236e2a4ffc85d6d0c090a80fd81ad672dec1 Author: John Bowman Date: Sun Feb 20 00:19:39 2005 -0600 Updated examples. commit a59e528a1131c3a2907deed7ee227e0ef74d6f0b Author: John Bowman Date: Sun Feb 20 00:00:14 2005 -0600 Linewidth change. commit ff81aec247f38be5090c29d298cfefeae69e157c Author: John Bowman Date: Sat Feb 19 23:57:01 2005 -0600 Added DotMargin margin qualifier. Updated examples to use margins. commit 66f4587e49213cfd0cd2cbcbbef58655199716f2 Author: John Bowman Date: Sat Feb 19 22:40:42 2005 -0600 Added errorbar routines to graph.asy. Changed arrowhead and dimension bar default size specifiers: arrowsize to arrowsize(pen p=currentpen), arcarrowsize to arcarrowsize(pen p=currentpen), barsize to barsize(pen p=currentpen). commit 9fadc21370ae167e70248a450697484588319944 Author: John Bowman Date: Sat Feb 19 19:29:46 2005 -0600 Fixed bug in eval(f(T), T[] A). commit 8b4466afa40e9e7cc5e9db290adf4935989ca988 Author: John Bowman Date: Sat Feb 19 12:35:38 2005 -0600 Documented real[] A vs. real A[] issue. commit 67e6e3ceaabcbf04544194124c85ecd5c0a074e4 Author: John Bowman Date: Sat Feb 19 11:50:51 2005 -0600 Documented and improved margin routines. Included correct latexusage file in documentation. commit 9498e0af1d4f38f833b52f3620ab24d089dee94c Author: John Bowman Date: Sat Feb 19 00:32:16 2005 -0600 Added Margin, PenMargin, and TrueMargin drawing qualifiers. Fixed name conflicts between asymptote.sty and comment.sty. Install latexusage.tex with examples. commit 38bb78c422e9bd2d3675046a467f6252ebd14678 Author: John Bowman Date: Fri Feb 18 16:07:55 2005 -0600 Fix diagnostic. commit 29aff167ca03ef67f70ac1b62d1b98c9dac71606 Author: John Bowman Date: Fri Feb 18 15:13:16 2005 -0600 Fixed segmentation fault in anonymous function diagnostic. commit 9047b90269425c9cfc3b9b5cde15fa9d77caec73 Author: John Bowman Date: Fri Feb 18 03:32:37 2005 -0600 Incremented version to 0.64cvs. commit fcd9f40af610b0609d9c9f4cf6f41fa24e430a64 Author: John Bowman Date: Fri Feb 18 02:54:40 2005 -0600 Reset lastpen on every call to texinit. commit e03473a1d037f7527a28bda91860a854fd41bfe0 Author: John Bowman Date: Fri Feb 18 02:32:44 2005 -0600 Fixed harmless typo. commit debec9e2457a43185d6fd8eabd325bd73f609e21 Author: John Bowman Date: Fri Feb 18 02:28:13 2005 -0600 Incremented version to 0.63cvs. commit 8db8d6d2443535dc5767219c703b6df6ca66ec18 Author: John Bowman Date: Fri Feb 18 01:27:57 2005 -0600 Fixed shading colorspace & fillrule/baseline output strings; removed unwanted space from gsave/grestore. commit 9bf7f08f84a6cade9d9fd51998411615b4afd1b9 Author: John Bowman Date: Fri Feb 18 00:38:20 2005 -0600 Added basealign pen type to align labels using the TeX baseline, if applicable, rather than using the full bounding box. (The default continues to be nobasealign). Documentation improved in several areas. commit 28a03b437f7c1e00608b6c2f907c60fe2f2ee616 Author: John Bowman Date: Thu Feb 17 08:57:51 2005 -0600 Added missing include. commit 6eef3163b0df65b4befb9c1d7e4e86c81ebf62cb Author: John Bowman Date: Thu Feb 17 01:02:35 2005 -0600 Simple example of label positioning. commit 8ffd567418105a39206bf034ea3ec903c5735278 Author: John Bowman Date: Thu Feb 17 00:56:21 2005 -0600 Corrected index entry. commit 5d3675110563d25e16b6f9c8079661425c1edfaf Author: John Bowman Date: Thu Feb 17 00:54:19 2005 -0600 Workaround broken cxx linux-alpha headers. commit 7f051aef9efdc4169d33bf295471e63d492d94a3 Author: John Bowman Date: Thu Feb 17 00:38:29 2005 -0600 EPS files (and other formats supported by \includegraphics) can now be included and positioned just like any other LaTeX label (the include function has been changed to return a string containing an includegraphics command that can be used with label). Added image support to pstoedit backend. Fixed compilation problems under Solaris. Updated documentation. commit fa4a2ff2a63cae4e99ba06d3aad15ab8b8033640 Author: Tom Prince Date: Wed Feb 16 11:43:22 2005 -0600 CFLAGS is already subst'd by AC_PROG_CC. CXX defaults to g++ if it is available (AC_PROG_CXX). Define CC in Makefile if we get it from AC_PROG_CC. commit 733007c5d36fa7bf65d9aef914e28b1a82152b2a Author: John Bowman Date: Wed Feb 16 11:42:33 2005 -0600 Changed namespace absyn to absyntax to avoid conflicts with class of same name under some compilers. commit b05b2ab708733bd5da94b3868e36d174deb55394 Author: John Bowman Date: Wed Feb 16 11:24:02 2005 -0600 Namespace as -> absyn. commit fe7b0ca63585732565f21c040bc2a6b266276c94 Author: John Bowman Date: Wed Feb 16 11:18:44 2005 -0600 Namespace as -> absyn. commit 3778ce248900af52939f5baa8db7e9dd18593603 Author: John Bowman Date: Wed Feb 16 11:14:02 2005 -0600 Renamed namespace "as" to "absyn" to work around Solaris namespace pollution. Added CXX=g++ to configure.ac and removed -DNDEBUG flag. commit 797f13b0fc7dd233f0248a7aaf4f9a6218f38abb Author: John Bowman Date: Tue Feb 15 22:23:14 2005 -0600 Clip should insert beginclip at beginning of current layer. commit 462f2955efdba755a3df16924dd41d216bbf2e62 Author: John Bowman Date: Tue Feb 15 17:46:32 2005 -0600 Reinstated underlying frame clipping for picture clipping (with transform bug fix), allowing picture unfill to be properly implemented (using frame unfill). Moved beginclip, endclip, gsave, and grestore to pstoedit.asy. Fixed remaining gsave/grestore bugs in Asymptote backend to pstoedit. commit 303435f4e3c52d1b38f5d31a32685dff9ea71a6e Author: John Bowman Date: Tue Feb 15 02:01:03 2005 -0600 Code clean up; added pair min(path[]) and max(path[]) functions. commit 6260496285c2a9c87e6d7891e8021c4134ab55b8 Author: John Bowman Date: Mon Feb 14 23:25:28 2005 -0600 Incremented version to 0.62cvs. commit ed62a98eee707e36126ee3acc513bb11763c0b5e Author: John Bowman Date: Mon Feb 14 21:39:00 2005 -0600 New examples. commit b7b089209392247a58749f86a76e5e5c356589c9 Author: John Bowman Date: Mon Feb 14 20:57:01 2005 -0600 Added PostScript grestore/gsave objects. commit 3a83a424a915fdf048da7ab98b60bd081a65696b Author: John Bowman Date: Mon Feb 14 20:54:11 2005 -0600 Fixed spelling and grammar. commit 8ac3bec8f6df31f5f83f22eb07b5eb55842b343f Author: John Bowman Date: Mon Feb 14 19:01:27 2005 -0600 Added Asymptote backend and support for pstoedit, including native clipping and subpaths. Added Postscript font and scaled TeX font support. commit 7009ba7329eeca33c7dc4d176639ddc104e276f6 Author: John Bowman Date: Sun Feb 13 15:57:10 2005 -0600 Added warning message and documentation about clipping deconstructed objects. commit 6aa5b38b9a6e94362fc66fd753e6bf7a0a974138 Author: John Bowman Date: Sun Feb 13 15:36:46 2005 -0600 Added -gray option. commit df0db34958b4ec086fa2a317ecb7dd79306bf6fd Author: John Bowman Date: Sun Feb 13 12:21:41 2005 -0600 Install documentation examples and data files in examples directory. commit ccc354b08dc5706fe0383ee6ea2b072f827bf975 Author: John Bowman Date: Sun Feb 13 12:08:12 2005 -0600 Reimplemented picture clipping to fix transformation and layering of clipped pictures. Use correct font and fontsize for computing label bounding boxes. Use -O0 for producing dependency data. commit e9464de788fc1d24dd60aae8937f41b855c322f0 Author: John Bowman Date: Sat Feb 12 03:26:46 2005 -0600 Added background variable. commit 22252bdf84499d5ecdf09809d857700722257cb1 Author: John Bowman Date: Sat Feb 12 03:21:42 2005 -0600 Added drawing, filling, and clipping of compound paths built up with a pen lift (moveto) operator ^^ instead of --. Added functions to unfill a region to transparent background. Added zerowinding and evenodd pen types for filling and clipping. Introduced pen types squarecap, roundcap, extendcap, miterjoin, roundjoin, beveljoin to replace linecap(Square) calls, etc. Added checker pattern. Added LaTeX NFSS and TeX fonts and ability to override default baselineskip. Fixed bug in LaTeX rotation angle output format. Added contributed tree drawing script and example. Updated documentation. commit d367e8c404772a6dd98e54466742fe8b12fa8a12 Author: John Bowman Date: Wed Feb 9 09:08:27 2005 -0600 Editing mode updates. commit 51dd70f15ee70c193ca5d9c6e9869fb2fcb553fd Author: John Bowman Date: Wed Feb 9 08:40:20 2005 -0600 Renamed labelframe to labelBox; added labelbox(frame). commit 9716d767e81de011dd47e9ecfeb2273cd2777337 Author: John Bowman Date: Tue Feb 8 23:46:20 2005 -0600 added labelframe and point(frame,dir) routines. commit 83cd63b559666d92876804f3999e996a54ca0c2a Author: Andy Hammerlindl Date: Tue Feb 8 15:45:32 2005 -0600 Changed string highlighting to recognize double \ escapes. commit 9bfdac4ea0f8b8d539402178c609761977b5a374 Author: John Bowman Date: Sat Feb 5 15:43:28 2005 -0600 Updated documentation and pattern examples. commit 673598b4cbfb40510d58a38fe50bdb9a222b9459 Author: John Bowman Date: Fri Feb 4 22:49:13 2005 -0600 Added brick pattern. commit 19ff72f4ba6f49669117bf4bad71b7427c25c9d4 Author: John Bowman Date: Fri Feb 4 16:15:16 2005 -0600 Added bool option to linetype to disable automatic scaling of linetype parameters with pen size. Fixed segmentation fault and float point exception in adjust_dash in drawpath.cc. Added bbox(Background) option for producing a nontransparent background. Moved simplified pattern routines and builtin patterns hatch, crosshatch, and tile to patterns.asy. Updated examples and documentation. commit 0a798b5693fd153883bd81789e8f7152a312cd71 Author: John Bowman Date: Thu Feb 3 21:05:37 2005 -0600 Fixed recently broken interact mode. commit d0302683ce91faa71fe83e1b9ce0021042916f2e Author: John Bowman Date: Thu Feb 3 13:18:20 2005 -0600 Moved default CFLAGS into configure.ac commit 7d40090cb009bca42e096cf60ca2b0d974fab4d1 Author: John Bowman Date: Wed Feb 2 13:16:31 2005 -0600 Fixed optimization flags (revert last change). commit 13fb05dc4824fb5677f386db5ba37068ee6e41dc Author: Tom Prince Date: Wed Feb 2 08:40:53 2005 -0600 Stanardize CFLAGS handling. commit fe1ee205fbe6928e6c9116fb5a6e7df5f253c823 Author: John Bowman Date: Wed Feb 2 06:16:25 2005 -0600 Fixed header problems under FreeBSD. commit 21def4fc8e07c0d718e73e1bb6cbf593a9823c34 Author: John Bowman Date: Wed Feb 2 00:54:33 2005 -0600 Incremented version to 0.61cvs. commit 3b6044c76830ccc27e5599c7f4184d5a050bc12f Author: John Bowman Date: Wed Feb 2 00:10:58 2005 -0600 Interactive mode automatically restarts ASYMPTOTE_PSVIEWER in case it exited. commit 597bcc238bdf57c1c5ee7b0be185a34d49c08304 Author: John Bowman Date: Wed Feb 2 00:07:24 2005 -0600 Added picture grid(int Nx, int Ny, pen p=currentpen) function for generating square lattices. commit cc7582773ec89abf83d53951301b9a849f6c958e Author: John Bowman Date: Wed Feb 2 00:04:57 2005 -0600 Simplified binary installation instructions; updated hatch.asy listing. commit c51f05c9af30d87e7f49f9a6ce27416e150a9327 Author: Tom Prince Date: Tue Feb 1 10:03:21 2005 -0600 Fix path solving. Strange place for a bug. commit 4046420fa38047ab48a6f9114d79f1b133844993 Author: John Bowman Date: Tue Feb 1 02:52:50 2005 -0600 Removed extra newline from diagnostic. commit d6c7d56a81c74dca0467f15941229101ceafaa28 Author: John Bowman Date: Tue Feb 1 01:43:33 2005 -0600 Fixed namespace/function conflicts. commit c9e796e9e170a82bc486199ba7716c64db6b99f2 Author: John Bowman Date: Tue Feb 1 01:33:26 2005 -0600 Fixed interactive mode to suppress standard I/O also from static imports. commit 2566e42a9a29888574606c717e01b459515eb122 Author: John Bowman Date: Mon Jan 31 21:41:57 2005 -0600 Fix rfind(string s, string t) and update documentation of string functions. commit 81522814d5593ac2f99a96b1f6827684f56a740b Author: John Bowman Date: Mon Jan 31 18:42:04 2005 -0600 Add facility for checking to see if a file exists, using bool error(file). commit 2d7bc86ef31d922d01e19e7bd7323d8a0e36c48c Author: John Bowman Date: Mon Jan 31 16:15:48 2005 -0600 Fixed multiple interactive shipouts in graphs with legends. commit d5510487a847ffbe3270d74042c68de4c2c88dca Author: John Bowman Date: Mon Jan 31 00:21:33 2005 -0600 Interactive mode now supports inputting files with multiple shipouts. Interactive mode disables deconstruction (xasy). commit c56e2e4c3b36897baa56333df2e5d8f481b20744 Author: John Bowman Date: Sun Jan 30 23:17:47 2005 -0600 Fixed endl and tab in plain.asy to produce C strings. Fixed recently broken include command. Renamed internal symbol ASYalign to more meaningful ASYbase in baseline. commit 872c389229301cfc209e2c0349503cf8d240d9b4 Author: John Bowman Date: Sun Jan 30 22:46:28 2005 -0600 Put file back into mempool by making typein and typeout variables rather than pointers. commit 18b1fef96c161127ea53f9f4780b131d4e2b4942 Author: John Bowman Date: Sun Jan 30 18:44:14 2005 -0600 Updated examples to use math.arc routine. commit d41eb28ef472b8ba83c21468b0b48d808feaa39c Author: John Bowman Date: Sun Jan 30 16:55:47 2005 -0600 Allow optional Asymptote commands to be specified on the same line as interactive input command. commit 5f5586572db63c8bc186ca36f5edc9b9dea978e9 Author: John Bowman Date: Sun Jan 30 12:15:01 2005 -0600 Buffer stdin in interactive mode. Changed Import to input, which includes code directly into Asymptote, so that the user has access to the same environment that the code sees. Cleaned up fileio and removed it from mempool due to conflict with iostream routines. commit b1d64a589218c621786a1af426d581c009a9e207 Author: John Bowman Date: Fri Jan 28 21:04:41 2005 -0600 Add baseline TeX code back into texfile.h from plain.asy. commit c9a85dae7aa090f26d84e035128594d78c1385e5 Author: John Bowman Date: Fri Jan 28 03:54:10 2005 -0600 Incremented version to 0.60cvs. commit 82e18a2effb5642baa92e296f1be7fe4b9cf60ee Author: John Bowman Date: Fri Jan 28 02:21:34 2005 -0600 Makedepend updates. commit e134133f3b4d137d42c842e3871e928c17e104a2 Author: John Bowman Date: Fri Jan 28 02:09:05 2005 -0600 More makefile tweaks. commit 71b7187f832f9726abd1f4ce7f7fa2402352e333 Author: John Bowman Date: Fri Jan 28 01:40:32 2005 -0600 Final makefile updates. commit 5ee54ce48e3536f51119f7ed27986f988558e4dd Author: John Bowman Date: Fri Jan 28 01:15:07 2005 -0600 Automatically check for broken rpc/xdr headers. commit 5dd8676e496112918d515d521ac1e5d76e0a7e58 Author: John Bowman Date: Fri Jan 28 00:01:20 2005 -0600 Fixed bounds to be consistent with behaviour of new quadratic solver. commit a6fae99ab1ab2214c4c0fb328d4248dd0ccd333b Author: John Bowman Date: Thu Jan 27 23:41:06 2005 -0600 Implemented robust, accurate quadratic equation solver (used in dirtime). commit 7deacc022138293f1b7ea337c6f3dadf15bd23d3 Author: John Bowman Date: Thu Jan 27 17:20:26 2005 -0600 Added getopt for systems without full GNU getopt support (e.g. cygwin, FreeBSD). Use "make all/make install" to produce/install both asy and man pages. commit d907ef68414f53dccfaf4726944fa072c265ad61 Author: Tom Prince Date: Thu Jan 27 01:30:12 2005 -0600 Better? quadratic routine. commit 34e5884ceacd46acd76abcc6debf987fc12a9d83 Author: Tom Prince Date: Wed Jan 26 12:06:22 2005 -0600 Use solveQuadratic for path::bounds as well. commit 697e218e413621cb7b0a78378df21562a92020bd Author: Tom Prince Date: Wed Jan 26 11:44:00 2005 -0600 Fix fuzz case in cubic dir. commit f8b8d7dab36c025d9d81714098c5d4fc6e992812 Author: Tom Prince Date: Wed Jan 26 11:37:55 2005 -0600 Duplicate code. commit e15a948eb7498d2ffa9c1c25fb65cdb617652e10 Author: John Bowman Date: Wed Jan 26 10:47:50 2005 -0600 Added fuzz to fix dirtime(unitcircle,dir(-45)) bug under make OPT=-g. commit 12eae75206190bbeb7ea03e695888e13d1e29d9f Author: John Bowman Date: Wed Jan 26 02:14:32 2005 -0600 Implemented all ANSI C character string escape sequences for C strings. Removed all escape sequences from TeX strings except for \", which maps to ". Added support for LaTeX babel package. Improved arc so that it coincides exactly with circle approximation for all angles. Added triangle arc routine to math.asy. Renamed gray to lightgray in the example files. commit ef94f1c7970998ed0489cb0ef1f071a37cf40df2 Author: John Bowman Date: Tue Jan 25 10:02:15 2005 -0600 Fixed explicit keyword (broken in dec.cc 1.8 on 2005-01-19). commit f1463209178ca79e93fbb7cc03f98ad04da070b7 Author: John Bowman Date: Sat Jan 22 02:55:26 2005 -0600 Renamed gray to lightgray; gray now means gray(0.5). Added colorPens and monoPens lists and boolean variable mono. commit a38f9e67b9ed8397b7404aad29d8213482dc185c Author: John Bowman Date: Sat Jan 22 01:14:42 2005 -0600 TRANSPARENT pen now has higher precedence that DEFCOLOR; also output "invisible" for this pen color. commit c0e19513dd8c5bc30401fb4b46e32285fdba45fb Author: John Bowman Date: Sat Jan 22 00:48:56 2005 -0600 Added checks on string position arguments. commit 6eb71920bb2d13c58629cd0c3edb21a3f4d4bc4e Author: Tom Prince Date: Fri Jan 21 07:44:46 2005 -0600 Handle invalid numbers gracefully. commit 004abb085554db987aaa582ce22bd2576470aab6 Author: John Bowman Date: Thu Jan 20 22:35:54 2005 -0600 Fixed cstring so that '\\' produces a backslash. commit aaaa207f4efee701f9e6455ef5faa481ad54888b Author: Tom Prince Date: Thu Jan 20 16:35:38 2005 -0600 Add C-style strings delimited by '. (e.g. '\n' instead of "\\n"). commit 53d04784fd7da27cb52c6b8e415a45ab1d893e2a Author: John Bowman Date: Thu Jan 20 04:14:02 2005 -0600 More arc improvements. commit 25ecd5c73477c683e502ff7c975c22b18a61f943 Author: John Bowman Date: Thu Jan 20 02:19:33 2005 -0600 Pdf updates. Added new arc routine and point/path utility functions. Added new examples and updates to feynman.asy. commit 8d06235ab386b7d48d2fadae59784a0e0ec0be33 Author: Tom Prince Date: Tue Jan 18 23:48:12 2005 -0600 *** empty log message *** commit f005d31b9780cbc30358ddbffc36c40e58f97348 Author: Tom Prince Date: Tue Jan 18 23:44:26 2005 -0600 Get rid of as::defaultExp, and store varinit* in signature instead. commit ac31ba07570ebdd6ecad5b8afd3b2dabf590ec33 Author: John Bowman Date: Tue Jan 18 23:38:39 2005 -0600 Minor bbox fuzz and alignment adjustments; fixed xasy alignment. commit e039fece159045e5d1bda711994fb98e06ddb0ec Author: John Bowman Date: Tue Jan 18 21:49:33 2005 -0600 Implementation of explicit keyword. commit ddeaaa28a0f5c2e26a3c805be6c6b49b9e86ca6f Author: Tom Prince Date: Tue Jan 18 21:16:10 2005 -0600 Oops. commit 8330481475bd533d754e87dd1b8650edbb379322 Author: Tom Prince Date: Tue Jan 18 21:14:34 2005 -0600 Fix makefile breakage. commit 9d18f68c3678138173cba1f115ec632a8e33a1be Author: Tom Prince Date: Tue Jan 18 21:07:13 2005 -0600 Don't rebuild asy if we don't need to. commit 61bb4a0506a9d7fa46840068bfd5b048b81d167b Author: Tom Prince Date: Tue Jan 18 19:33:16 2005 -0600 version.texi is autogenerated. commit 0b3dabb95ab57f0e71bf09251eddd761366f4a61 Author: Tom Prince Date: Tue Jan 18 12:25:05 2005 -0600 Make explicit a keyword to detect breakage. commit d2bcab30bdcb21e576b010b96450d86a1988869f Author: John Bowman Date: Tue Jan 18 01:24:50 2005 -0600 Inhibit output of null labels. commit 807c48f5f8381756758ae06feeabb17a4f9a8464 Author: John Bowman Date: Mon Jan 17 18:30:20 2005 -0600 Fixed antialiasing and gv -watch problems. commit 843c617b2423d9135ecd84c9f3b2762b96529363 Author: John Bowman Date: Mon Jan 17 16:11:34 2005 -0600 Incremented version to 0.59cvs. commit 6324cafe2759553d86759a9a61e03c30eb4757da Author: John Bowman Date: Sun Jan 16 22:43:30 2005 -0600 Updated new examples. commit fc09c78aadca65c061ecdab83c86f9f1a9433f10 Author: John Bowman Date: Sun Jan 16 22:35:30 2005 -0600 Fixed formatting. commit 696c6a83b7b0bd82b62220923f4f9c8b468da1a3 Author: John Bowman Date: Sun Jan 16 22:16:23 2005 -0600 Fixed warning message about unused variable. commit f7f31e8da553d0c4812d8cf548a1fa940597e61f Author: John Bowman Date: Sun Jan 16 21:54:49 2005 -0600 Added new entry. commit 5f23c77fa668e791364343dbb46ca120927c0beb Author: John Bowman Date: Sun Jan 16 21:45:57 2005 -0600 The default linetype, linewidth, fontsize, color, linecap, linejoin, and overwrite mode can now all be changed with the routine defaultpen(pen). Removed unused pen defaultpen() in favour of void defaultpen(), which resets all pen default attributes to their startup values. commit e2ecafd9b096d7e4a75010fecd60c45d2a600806 Author: John Bowman Date: Sun Jan 16 01:26:46 2005 -0600 Added missing == and != operators for struct tree. commit 412e97c76d466ae84a4e56ec076ca29c00999ae0 Author: John Bowman Date: Sun Jan 16 01:15:54 2005 -0600 Replaced defaultlinewidth and defaultfontsize commands with defaultpen(pen). Moved reset() into plain.asy. commit 179dcd0adea6b670da41fe33f84bf11cd6e3e205 Author: John Bowman Date: Sun Jan 16 00:11:03 2005 -0600 Added configure option to detect xdr/rpc header files. commit f9a3b185bc891daa6fd7d66f6d3233b730f5a152 Author: John Bowman Date: Sat Jan 15 18:45:32 2005 -0600 Fixed 2d graph bugs 1102574 and 1102396 and related bugs. Added XEquals and YEquals axis types. Allow all axis types to optionally extend to dimensions of picture; updated documentation. Simplified routine for drawing perpendicular symbols in math.asy. commit 76ac05ba021c34a68832d247b270e01ce4220a24 Author: Tom Prince Date: Fri Jan 14 15:30:51 2005 -0600 Store operands with opcode, rather than in the following inst. commit aef57d9197897694e6911f627c80a61d19080087 Author: Tom Prince Date: Wed Jan 12 12:45:37 2005 -0600 markTrans and markTransAsField are utility functions that don't need to be redefined. commit e1087baecb7ef73eff4d934cd25f027d6c4aed70 Author: Tom Prince Date: Wed Jan 12 12:36:53 2005 -0600 Clean up header file dependencies. commit c724002d32be1004787b82212cacbe4582f19ef9 Author: John Bowman Date: Wed Jan 12 11:17:35 2005 -0600 Made currentpen static. commit 1352343c1a7709c47e4fce15e68c521b1c22265f Author: John Bowman Date: Tue Jan 11 22:42:27 2005 -0600 Use $(MAKE) rather than make everywhere within Makefile. commit 5e84364254a41a0fe7d0a6cd12309885ee580beb Author: John Bowman Date: Tue Jan 11 22:14:09 2005 -0600 Increment version to 0.58cvs. commit 54eaa3dc057e3196c84465af73df75931ab6eee7 Author: John Bowman Date: Tue Jan 11 21:52:01 2005 -0600 Removed direction(path, real) and direction(path, int) in favour of dir(path, real t=1) and dir(path, int t=1). Added examples. commit c1a18de5cc1f5e30109c2ebe9712947c6420abc3 Author: John Bowman Date: Tue Jan 11 17:29:22 2005 -0600 Made overwrite mode a pen attribute; updated documentation. commit a5ccb6bc1b3a58cb9b44ae349b42ac4888ebceb9 Author: Tom Prince Date: Tue Jan 11 13:31:37 2005 -0600 symbol::trans accepts a std::string not a char*. commit 4d2e3f5c77081c4d761bae7df317606808b372f1 Author: Tom Prince Date: Tue Jan 11 13:30:26 2005 -0600 Fix typo in comment. commit 08c6e5a90e6d18b3dd4a9566ef9d61069bfa6e42 Author: John Bowman Date: Tue Jan 11 02:55:28 2005 -0600 Fixed infinite loop bug in overwrite mode. Added synonym dir(path,int) for direction(path,int), etc. commit 0255eb36c53d59fb955edd23c57cd8003202de08 Author: John Bowman Date: Mon Jan 10 22:04:30 2005 -0600 Fixed rgb to cmyk routine and added cmyk to rgb routine. Added -cmyk and -rgb command options. Made labelx and labely routines position labels consistently with axis routines by default. Generalized baseline routine and moved from texfile.cc into plain.asy. Adjusted logo for new labeling system. commit 9db1f8cf0de5a928a03399df79b7e8316ba340f6 Author: John Bowman Date: Sun Jan 9 18:10:02 2005 -0600 Increment version to 0.57cvs. commit c8cda1546a2579b1dbfd24b6d15abd49506e3bb9 Author: John Bowman Date: Sun Jan 9 17:16:50 2005 -0600 Make PSViewer and PDFViewer search conform to documented behaviour. commit 94572dc2968e18d4572302af3f830a66c7af8620 Author: John Bowman Date: Sun Jan 9 15:43:21 2005 -0600 Implemented radial gradient shading; updated documentation. commit 0f7766c8f6779ad7c5468be9945f2887a8be5ab1 Author: John Bowman Date: Sun Jan 9 12:35:09 2005 -0600 Make patterns work with xasy. An explicit picture is now required in order to specify preamble to shipout. Added scientific diagram and graphs to documentation to illustrate the minipage function, secondary axes, and the drawabout function. The new real[[] colors(pen) function returns the color components of a pen. commit cd537b6768ade3f2cdb7ba912ade0af6279021cd Author: John Bowman Date: Sun Jan 9 03:02:17 2005 -0600 Added tiling patterns and gradient shading. Added linecap and linejoin pen specifiers. Updated documentation with examples of new features. commit aaf64a2145422d16d037ee04b07ce2554ea79cfa Author: John Bowman Date: Thu Jan 6 21:47:04 2005 -0600 Minor interp and secondary axis updates. commit a373e2dcb2a74ee31114e131de29bfcb014e2541 Author: John Bowman Date: Thu Jan 6 16:28:55 2005 -0600 New postscript-coordinate shift option for label routines; pictures added to pictures now transform properly; updated documentation. commit 82c0764670b6a7f37ace3f5dda4875ee7ad05cf6 Author: John Bowman Date: Thu Jan 6 04:20:46 2005 -0600 Added secondary axis facility; fixed scaling bug. commit cf18a044a97393249e58865a01dbe5ed28308d56 Author: John Bowman Date: Thu Jan 6 04:19:12 2005 -0600 minor formatting. commit 0496fd3486693a313fe88a9a359839cfe21659db Author: John Bowman Date: Thu Jan 6 04:17:36 2005 -0600 Removed unused currentframe variable; updated documentation. commit 0c452d1f963e32f6e926bca7ec00fc396db2cb19 Author: John Bowman Date: Wed Jan 5 17:19:22 2005 -0600 Further csv and linemode updates. commit f14fd7bedf633f95bf0239e826dfbe5e5e380a58 Author: John Bowman Date: Wed Jan 5 10:21:16 2005 -0600 Fixed cvs+line mode bugs. commit 5ab4963be063b0f7d2dd775568187bde9ac900af Author: John Bowman Date: Wed Jan 5 10:20:56 2005 -0600 label positioning update commit 19e601b4bea4a9f290fb14f843e643da29f8c863 Author: John Bowman Date: Wed Jan 5 10:20:26 2005 -0600 minor formatting. commit 62e16369244e6571bcd88a369506fc3f1d4ade76 Author: John Bowman Date: Wed Jan 5 01:01:23 2005 -0600 Updated documentation. commit f63d68663956b533252bc0a78249e42d3696f20d Author: John Bowman Date: Wed Jan 5 00:38:08 2005 -0600 Fixed "label with arrow" routine. Removed outarrow in favour of drawabout. Updated documentation regarding new optional position argument of path labels (draw and drawabout). commit 40922670c83aac9b39075818d3bb7526cfd9f5d2 Author: John Bowman Date: Tue Jan 4 22:00:13 2005 -0600 Align labels before adding label bounding box fuzz. commit 1caf33aa48700401e8dab5c1935e8371e9075974 Author: John Bowman Date: Tue Jan 4 21:58:24 2005 -0600 Use math italic axis labels. commit 6dde5903fd8d69da16ac521a882378962fb28355 Author: John Bowman Date: Tue Jan 4 13:07:41 2005 -0600 Updated. commit e6b8f714ddbcedc1ccec4f01ddc619d9c38ccc25 Author: John Bowman Date: Tue Jan 4 13:05:08 2005 -0600 Added function name to "cannot call...with" error messages. commit 4a3368cbfb9236718c1b1a7b230cf1edb71aa4f1 Author: John Bowman Date: Tue Jan 4 01:34:48 2005 -0600 Improved and tightened label bounding box calculation. commit c8261d01c8415dea7b1fea9889fbf944819d9481 Author: John Bowman Date: Tue Jan 4 01:32:19 2005 -0600 Made "cannot call type...with" diagnostic easier to read. commit b82e62c0d0854c00c26077d2385598fb04594b75 Author: John Bowman Date: Tue Dec 28 09:21:41 2004 -0600 label and arrow adjustments commit 00d5f86a020491c3073e6dda1d230dcb0dd475fd Author: John Bowman Date: Mon Dec 27 02:01:56 2004 -0600 Added minipage and outarrow routines. commit 9419fe6b15870e2957e644a3a9ee2d1f0299401b Author: John Bowman Date: Sun Dec 26 19:55:48 2004 -0600 Fixed TeX pipestream embedded newline & diagnostic problems. commit 561d061bf19dc2362472501129e1ebc015fabd26 Author: John Bowman Date: Sun Dec 26 14:20:02 2004 -0600 implement scaling of pic.userMin and pic.userMax. commit 64d80cf6a37510d81393daf0f942476fcd1dbadd Author: John Bowman Date: Wed Dec 22 23:01:33 2004 -0600 Added newpage() command. commit f9cdb946b50ac96b37efbc3b4dfaa68ae2fc590b Author: John Bowman Date: Wed Dec 22 19:16:14 2004 -0600 Improved and simplified label code. commit 892d597f69da58ba3ba5b67429e1235acb6d1afc Author: John Bowman Date: Wed Dec 22 15:06:19 2004 -0600 More label updates. commit 4659686d9b2805523740b67f193e5b3c37c7d0fa Author: John Bowman Date: Wed Dec 22 04:01:04 2004 -0600 Label updates. commit 2d7b642ffe65007488bfc592c1507b63e085aa6a Author: John Bowman Date: Tue Dec 21 02:07:25 2004 -0600 Improved label bounding boxes. commit 2ec3be9a1f88fb33e8eb9262ce8952023a3253a4 Author: John Bowman Date: Sun Dec 19 22:00:22 2004 -0600 Account for depth in label alignment code. commit 5bdeee5c93e43828cd8aa635cb3b3569bc56e39d Author: John Bowman Date: Fri Dec 17 12:35:21 2004 -0600 Fine tuning of label offset (dependent on pdf/-B). commit 68795714227237c2a8b801c94655b17fd68aa3a0 Author: John Bowman Date: Thu Dec 16 22:17:16 2004 -0600 Increment version to 0.56cvs. commit c1848c51139c559fa78b22188ffeeca159159393 Author: John Bowman Date: Thu Dec 16 17:52:04 2004 -0600 Force use of bison (not yacc). commit 733caf46643c96adcf045194ace7a8e07d796740 Author: John Bowman Date: Thu Dec 16 17:32:16 2004 -0600 Fixed warning messages. commit 46d94ddec5bf8cae60d4fbefe41d22599cc75b8d Author: John Bowman Date: Thu Dec 16 17:26:09 2004 -0600 ispell updates commit 16a8cb94f1d988c8c9c692d650969a41e4203f30 Author: John Bowman Date: Thu Dec 16 17:21:08 2004 -0600 Documentation updates. commit 8d0c569a4a72ae24dfe71dea21bcb1d5ee008aa3 Author: John Bowman Date: Thu Dec 16 17:05:14 2004 -0600 Improved latex diagnostics. commit 01c3773cac71bca3bb99dfb3f7d0b25d44d6bf7c Author: John Bowman Date: Thu Dec 16 13:14:58 2004 -0600 Updated documentation. commit 14362d4f7e3ca6d9d0e40fab297a8ee5716ea04e Author: John Bowman Date: Thu Dec 16 12:45:54 2004 -0600 Contributed examples. commit 43708329adf0949d989844f64cc450b7fa7ac3e3 Author: John Bowman Date: Thu Dec 16 10:11:08 2004 -0600 Added cuttings global variable. commit 609ddb221c006700de7c30e4889adb8e7c0ed65e Author: John Bowman Date: Wed Dec 15 23:42:14 2004 -0600 Moved metapost compatibility routines to separate file. commit 9a92f1894780cec1d9534486c95e6efeb0372e3a Author: John Bowman Date: Wed Dec 15 22:52:04 2004 -0600 Perhaps a more sensible alternative to Metapost cutbefore/cutafter/cuttings. commit b88706095832297bcd9e463186774609d0708e59 Author: John Bowman Date: Wed Dec 15 10:31:40 2004 -0600 updated coordinate commit ea0e02d149d6aece9779f489aad5786c6b259364 Author: John Bowman Date: Wed Dec 15 10:30:10 2004 -0600 Added translator name. commit 4bfe6a48fb575f02c0c98d856312f62620096158 Author: John Bowman Date: Wed Dec 15 10:26:31 2004 -0600 Added before(path,path) and after(path,path); documented cutbefore and cutafter and changed them to work always according to these specificiations. commit 247f2c248f437b9379881e211a964ecafc232749 Author: John Bowman Date: Tue Dec 14 18:39:21 2004 -0600 Fixed bug [ 1084667 ] asydef environment. commit d4ef44de4281cca95cdb72f4dcb9922d2c4acd7f Author: John Bowman Date: Tue Dec 14 18:24:27 2004 -0600 Fixed bug [ 1084641 ] problem with defaultfontsize. commit a4e65629f8a48ea09e5e0cbbc7d062385eb1e66c Author: John Bowman Date: Tue Dec 14 13:02:12 2004 -0600 In texPreamble: replaced newlines with spaces as they can break bidirectional TeX pipe. commit d6c73c7eaefcd11cb92cd75d52a30ee2d9e7651f Author: John Bowman Date: Mon Dec 13 13:01:12 2004 -0600 Simplified axis capping. commit fb95bf6850216bc1d903af28a9a8005853863128 Author: John Bowman Date: Mon Dec 13 11:30:01 2004 -0600 Fix override of axis label positioning. commit f1a5727ccfb4e9f723bf1acd11347d3fdaf79ad2 Author: John Bowman Date: Mon Dec 13 00:55:30 2004 -0600 Fixed bug 1084016: error in bounding box computation. commit 23b64ac7a6602335900098e1640768dc0ed941f5 Author: John Bowman Date: Sun Dec 12 18:05:09 2004 -0600 Partial port of featpost 3D package for MetaPost. commit 320e428228b01938b5e69ccd6b82d205ea6f52ca Author: John Bowman Date: Sun Dec 12 18:04:06 2004 -0600 Added operator == and != for vector class. Added interp routine for pairs, vectors, and pens. Added pen background=white, unfill, cutbefore, and cutafter. Documentation updates. commit 608a705714b209ca86cbf3621ac2194659ca4c99 Author: John Bowman Date: Sun Dec 12 17:59:33 2004 -0600 Changed default structure operator == to alias (as with arrays) to allow user-defined == operators on structures. Also removed != in favour of !alias. commit 79a7f7cc6d694897096ad895e0ddf8efa86cb61c Author: John Bowman Date: Sat Dec 11 14:59:39 2004 -0600 Handle invalid operators cleanly. commit fdd1a3d7fa0609fdbea0b4909b6538c95e43f207 Author: John Bowman Date: Fri Dec 10 18:32:52 2004 -0600 Updated bug report address. commit 7a57e3d9ab684bcda09d72c5991246bb8bccbeae Author: John Bowman Date: Fri Dec 10 17:10:39 2004 -0600 Fixed nullpath bugs. commit 6e27209f37882761c0f6a74ae1a209a8a462baad Author: John Bowman Date: Fri Dec 10 17:10:21 2004 -0600 Installation updates commit cbdb816fe0b86d3e4a7f071b15486be6429e402f Author: John Bowman Date: Fri Dec 10 12:17:20 2004 -0600 Make info and man directories if missing. commit f21a0af80d2556dda3c38ee9a0364330a42e2c15 Author: John Bowman Date: Fri Dec 10 11:57:18 2004 -0600 Added missing include. commit c0e2fe27a9127d79235dcb0032dbefe077c20215 Author: John Bowman Date: Fri Dec 10 11:55:11 2004 -0600 Simplified configuration. commit 9496f9fa0cb6577c20b2ea25098cb0bb4fabfd0d Author: John Bowman Date: Thu Dec 9 23:32:49 2004 -0600 Documentation updates. commit 844078449f34d728658e81a22ac49dfb22239aa8 Author: Andy Hammerlindl Date: Thu Dec 9 12:41:11 2004 -0600 Fixed tension atleast bug. commit 21a37d0bb0de1e76cebfed3b9fe787091cff8a9e Author: John Bowman Date: Sun Dec 5 12:32:56 2004 -0600 Improved axis label sizing. commit 57a8d747c34cd815620c43fb83f87c40c21cad04 Author: John Bowman Date: Sun Dec 5 12:31:11 2004 -0600 Remove signal(SIGCHLD, SIG_IGN): there are no remaining problems with zombies, and it causes other problems with gv. commit 0082483b02988e1ef08d8a75006c59504bbd54fd Author: John Bowman Date: Sun Dec 5 11:38:47 2004 -0600 Fixed typo. commit d1d3ee0f2fcedbb0e03d2ce4e29c54c02f2dc247 Author: John Bowman Date: Sun Dec 5 04:26:52 2004 -0600 Increment version to 0.55cvs. commit e6ed67fbf2e30e2e96ddb7a3b974203f52d8858b Author: John Bowman Date: Sun Dec 5 03:19:43 2004 -0600 Fixed graph sizing routines; added legendsize routine (useful for compensating for space taken up by external legend); the default width in asymptote.sty is now the full line width. commit 19ff04b4ed6b980c753b803ce43a70c7d8d2a529 Author: John Bowman Date: Sun Dec 5 03:10:08 2004 -0600 Added missing mkdir. commit 65acc41943ca624b0459c6e7863b7f4ac002e2ca Author: John Bowman Date: Sat Dec 4 17:07:57 2004 -0600 Center EPS figures on page by default. Added support for a4 paper as well as letter. Default postscript offset is now 0,0. Option -B (-T) aligns to bottom (top) of page. commit d3b7d14ad20d9b156f56738034eef6fb5687e2ea Author: John Bowman Date: Sat Dec 4 15:15:09 2004 -0600 Applied Hubert Chan's installation patch for Debian. Moved examples, asy.vim, and asy-mode.el to /usr/local/share/doc/asymptote/ asymptote/asymptote.sty is now installed in /usr/share/texmf/tex/latex/ (./configure --with-latex=PATH to override). Fixed typos; updated documentation and changed documentation license from GFDL to GPL in view of Debian position statement: http://people.debian.org/~srivasta/Position_Statement.xhtml Added man pages asy.1 and xasy.1x kindly provided by Hubert. commit 7d2f6d6fa49034e0598f05cac3e11ca86c509cfe Author: John Bowman Date: Sat Dec 4 14:42:17 2004 -0600 Fixed -with-latex=PATH. commit c943ad90d0ac2f8fed5350309228bc5cc83390fb Author: John Bowman Date: Sat Dec 4 14:03:09 2004 -0600 Added --with-latex=PATH configuration option. commit a30de76dc85ad5bf91bcb1a48798f4da3a2c81be Author: John Bowman Date: Sat Dec 4 00:15:57 2004 -0600 Implemented better estimate for graph axis space requirements for more accurate graph sizing. Added Portrait, Landscape, and Seascape shipout orientations. commit 2aec4bf868dc89eb7e06cc312fbf025c359ef275 Author: John Bowman Date: Fri Dec 3 12:15:14 2004 -0600 Bounding box & diagnostic tweaks. commit 285d1fe69feae78bb63d1f0381c808b51ac7db17 Author: John Bowman Date: Fri Dec 3 08:52:52 2004 -0600 Added missing header to make cxx compiler happy. commit cb5ef6cb8974e01b38d54df21cb67363faded74a Author: John Bowman Date: Fri Dec 3 08:31:00 2004 -0600 Reworked dvips and gs pdfwrite interface: do a post-bbox correction rather than using dvips -E (which ignores postscript label rotation). Align figures to top-left corner (unless the new -b option is given, in which case the bottom-left corner is used), to allow for direct printing of the generated EPS files. User can override default offset of 18bp. Updated documentation. commit 81af3cccfbc4df4288150cc2610649fcd7cde843 Author: John Bowman Date: Fri Dec 3 08:23:35 2004 -0600 Adjusted label alignment. commit 4aaa2cdefca7c4e99f635baef5e613792a560889 Author: John Bowman Date: Thu Dec 2 12:54:48 2004 -0600 Reinstate label bounding box determination; xequals and yequals routines will still work as expected if crop is called. commit 6edc66fadf3d00871d2ec0be1451af8c1fe35116 Author: John Bowman Date: Thu Dec 2 03:00:42 2004 -0600 Use dvips -E (encapsulation; this works now that bbox coordinates are non-negative) instead of -T (pagesize) to fix compatibility problems in the final postscript output. Made corresponding adjustments to printer offset code. Added support and documentation for using Postscript viewers other than gv. Fixed filename extension detection so that filenames containing ./ and ../ work correctly. commit 3a0267f4b9f5facd271d9106fe145fbfbe80bc4e Author: John Bowman Date: Thu Dec 2 02:54:00 2004 -0600 Fixed typo. commit c09cb8a65f3eeb409285cae3c722938cf8debff0 Author: John Bowman Date: Wed Dec 1 10:56:39 2004 -0600 Patches for bison, flex, and gv-3.5.8 now in patches directory. commit 92e5b28cd0bb6148653040bfc80d9acda90b8601 Author: John Bowman Date: Wed Dec 1 10:52:27 2004 -0600 Arrow and bars should always be drawn with solid linetype. commit db3c6e1299be872a321662d775e166ad9b751dd2 Author: John Bowman Date: Tue Nov 30 18:50:49 2004 -0600 Changed dots(pair[]) to dot(pair[]); added graph(pair(real),real,real). commit e31faae2c7a1315c9a5de99a8599173cce784bfa Author: John Bowman Date: Tue Nov 30 15:03:29 2004 -0600 Fixed typo. commit 4bab7c466503339267efdc8e069e4f8a56a14d9e Author: John Bowman Date: Tue Nov 30 14:53:16 2004 -0600 Simplified dot drawing function, distinguished it from Dot product, and updated documentation and examples. commit f9308bfd3717313c829d72d6656274cbcc2ddf00 Author: John Bowman Date: Tue Nov 30 09:00:14 2004 -0600 Added array diagnostics. commit 98217e95781cfbd4e93190af5679f7ea8c783f73 Author: John Bowman Date: Mon Nov 29 02:29:29 2004 -0600 Added qualifier. commit 08f4525440924eaf85789f1dd36c47ea938bbfde Author: John Bowman Date: Mon Nov 29 02:20:52 2004 -0600 Resolved infinite import recursion bug [24Nov04] by using libsigsegv to distinguish between stack overflows and real segmentation violations (due to C++ programming errors). commit 569040e16f23def486223a2f8a5f084ae76d8ea5 Author: John Bowman Date: Sun Nov 28 17:22:15 2004 -0600 Deferred drawing should respect clipping bounds. commit 72ef182760c1e9578353dd694a726b762475853a Author: John Bowman Date: Sun Nov 28 16:01:11 2004 -0600 Removed obsolete label bbox code from xequals and yequals to make them work correctly. commit c6b45485728c0e652cc1764479fa0c235c220fbb Author: John Bowman Date: Sat Nov 27 22:55:25 2004 -0600 Updated documentation. commit 02e65f5c0716c70809c8a95243a4cc2b2998a53b Author: John Bowman Date: Sat Nov 27 22:08:47 2004 -0600 Improved dot(): if dotsize not specified, use linewidth(pen)*dotfactor. commit d2cc042489e63ebb765ce7e6b3299e68a8ba1789 Author: John Bowman Date: Sat Nov 27 22:02:04 2004 -0600 Implement implicit cast from real to pen linewidth. commit fab6a02bf7945e31a431bc9d3a4d4cf51df44307 Author: John Bowman Date: Sat Nov 27 22:01:28 2004 -0600 Cleaned up pen code. commit 4205a65a204c8627acdd2b574c9930df98a409dd Author: John Bowman Date: Sat Nov 27 10:13:32 2004 -0600 tex() not layer() should force label processing. commit ea4fda59c7b4ff4c281379600f2b75c905fa1a30 Author: John Bowman Date: Fri Nov 26 19:23:49 2004 -0600 Increment version to 0.54. commit 21010d8460c5f1d5cc9e106592b087d92c9a7273 Author: John Bowman Date: Fri Nov 26 18:19:53 2004 -0600 Added preliminary 3d graphics routines & documentation. commit 497764f5fdbbf2012aaffc6606a0708c87309988 Author: John Bowman Date: Fri Nov 26 17:37:42 2004 -0600 Added Bug 24Nov04. commit 0b9c4a1496e99f3c592697c7d7b7b6ef6c6af41a Author: John Bowman Date: Fri Nov 26 17:01:19 2004 -0600 Fixed transform bug (yx->xy) reported by Jacques. commit c8b620eaa7f84e6ded045e55ae623dcc91db5b1e Author: John Bowman Date: Fri Nov 26 13:44:02 2004 -0600 Makefile for doc directory. commit 3b421e3fab2572473a6636e6ec4fedfb1ddf09aa Author: John Bowman Date: Fri Nov 26 12:58:25 2004 -0600 Math and documentation updates. commit af96406cc03aa4fe42509ded49e0c82a24861b12 Author: John Bowman Date: Thu Nov 25 22:22:39 2004 -0600 Fixed intersect(vector,vector,vector,vector); commit 8dab8f056f0a2ceaa6f21956a98e451559ee8a53 Author: John Bowman Date: Thu Nov 25 13:00:37 2004 -0600 Handle out of bounds indices properly in straight(path,int). commit b19ec7c936c3fd765992e1157e491f643bf08de4 Author: John Bowman Date: Thu Nov 25 10:31:25 2004 -0600 Fixed intersect(vector,vector,vector,vector). commit 131d60d368782480e5f767c0b8060b4373b0a70c Author: John Bowman Date: Wed Nov 24 23:21:41 2004 -0600 Avoid duplicate import messages when verbose > 1. commit 610c16529cea2a4ff77262c49e4404b0b4fef395 Author: John Bowman Date: Tue Nov 23 13:27:50 2004 -0600 Make layer() work also when there are no labels. commit 6fec2af78eeee9ccb6ceb6e2572ef371028bb5d6 Author: John Bowman Date: Tue Nov 23 12:41:35 2004 -0600 Fixed bbox function; added dot product for pairs and vectors. commit d058ed95ec698e5d29d7201f57018b166bad99f4 Author: John Bowman Date: Tue Nov 23 10:33:58 2004 -0600 Added missing xor boolean binary operator. commit 723d63cc3c14965550a0d4a1f8c24c0b57b9bb91 Author: John Bowman Date: Tue Nov 23 10:31:20 2004 -0600 add(picture, picture) now adjusts userMin and userMax. commit c5910e2d5349db115723dc52c67161d0a68d7621 Author: John Bowman Date: Sun Nov 21 17:31:02 2004 -0600 Ignore attempts to close stdin and stdout. commit 0a5e346e5552a7bc180051e67f3264c62ad9cc97 Author: John Bowman Date: Sun Nov 21 17:05:42 2004 -0600 Fixed nullFile. commit 8e66bee71948d945acb35aa2d573a9168a83adab Author: John Bowman Date: Sun Nov 21 12:19:31 2004 -0600 Simplified configuration; documented GNU_GETOPT_H. commit db7cd2366884368bf28a72e05047df64ea84fc0a Author: John Bowman Date: Sun Nov 21 11:41:27 2004 -0600 renamed camp::stdout to camp::Stdout to make FreeBSD happy. commit 6a4f52a0f03b9b9bf5e73358b0c39875046466d9 Author: John Bowman Date: Sun Nov 21 11:10:22 2004 -0600 Added reference to mailing list. commit 0f135b435e70580b46aa8992faa19072c312be03 Author: John Bowman Date: Sun Nov 21 11:05:10 2004 -0600 Removed email addresses. commit b9c2b04d177b4a8cf872be63603fc2505139f6c8 Author: John Bowman Date: Sun Nov 21 10:52:23 2004 -0600 Fixed formatting. commit 801eb67d0d9f69b0642f4a8955204aff00eb0b16 Author: John Bowman Date: Sun Nov 21 10:36:15 2004 -0600 updated distclean commit bc7d4f892bea91e37cd8771a74be6154324d6f68 Author: John Bowman Date: Sun Nov 21 02:39:36 2004 -0600 Fixed memory leaks. commit 84f8442033be2736dae165d29a711d783a13a41f Author: John Bowman Date: Sun Nov 21 02:03:42 2004 -0600 Fixed memory leak. commit 91ce66042763624421e9842d28ef71bc6af0e8e5 Author: John Bowman Date: Sun Nov 21 00:29:49 2004 -0600 Readline library should be reasonably up-to-date (Version 4.3 and 5.0 have both been tested; asy won't even compile with very old versions). commit a9cf50c561bb4025ea970151a5b25e45e45e3425 Author: John Bowman Date: Sun Nov 21 00:20:56 2004 -0600 Template used to extract texinfo version from configure.ac. commit f2f566f48fcf2c153a6563726677f9a50f65469c Author: John Bowman Date: Sun Nov 21 00:19:58 2004 -0600 More FreeBSD tweaks. commit 1b62f5150641e6b7aca7359610d948d875aacb86 Author: John Bowman Date: Sun Nov 21 00:19:17 2004 -0600 Revert stdout optimization. commit 7ce475cda9d27c16ff719db8a41f3cd1d23ef0b5 Author: John Bowman Date: Sat Nov 20 21:22:59 2004 -0600 Fixed typo. commit cd879a5a3bfed30699894b2060ffd82f642e0c47 Author: John Bowman Date: Sat Nov 20 21:21:09 2004 -0600 make install-all now depends on all commit 5dc6a42dc07ee535bbb095baa92e704f36209337 Author: John Bowman Date: Sat Nov 20 19:46:41 2004 -0600 Port to FreeBSD 4.10-RELEASE-p2 with gcc34. commit a4107efb6bd1b449e1b8fcc0c63112f1da1cdea0 Author: John Bowman Date: Sat Nov 20 15:51:57 2004 -0600 Patches for clean compilation under CXX and other compilers. commit 88d63e93cf27e0af8acd8f4c026ab709479660e8 Author: John Bowman Date: Sat Nov 20 12:51:31 2004 -0600 include tweaks commit fa8719f36c73bbca73ce75f857531e8d2db35348 Author: John Bowman Date: Sat Nov 20 12:00:20 2004 -0600 Menu updates. commit adc7d6279f193edad3d72a798a938214999a26c3 Author: John Bowman Date: Sat Nov 20 11:36:52 2004 -0600 Fixed up discussion of static vs. dynamic commit f33671066cc96d5d95a098a5abe0656d9d8c5813 Author: John Bowman Date: Fri Nov 19 22:53:36 2004 -0600 Check if file is closed before doing any reads or writes. commit f6b7f7bc42965730d51de5c9aadf66b8d94e8075 Author: John Bowman Date: Fri Nov 19 22:53:29 2004 -0600 Added sentence about linetype-adjustment based on arclength of path. commit 12c0a82afdafc91e5c5170ffc4a53edf8c62f88a Author: John Bowman Date: Fri Nov 19 16:29:52 2004 -0600 Default width of figures included with asymptote.sty is now 0.9\linewidth. commit 878455b6e5d0c597921832e49d7136535ac13f3f Author: Andy Hammerlindl Date: Fri Nov 19 16:24:25 2004 -0600 *** empty log message *** commit 6eea86bfcd0adea30d3f86f77a9ede20aa1df0dc Author: John Bowman Date: Fri Nov 19 16:13:03 2004 -0600 Bug 2004-17-11 fixed. commit 36838d7981d3987c4e746559e0cce70a9225f95f Author: Andy Hammerlindl Date: Fri Nov 19 14:50:59 2004 -0600 New classes from the env -> env and coder split. commit fcb3de9fddd82fcb22fcdc53d5ba2e7bff56f08f Author: Andy Hammerlindl Date: Fri Nov 19 14:49:45 2004 -0600 Split the env class into env and coder, and added coenv. Added "self-importing". commit 9d6ebe01c90e679a41471af70c9d7ed79c559655 Author: John Bowman Date: Fri Nov 19 13:29:35 2004 -0600 Figures included via asymptote.sty are now fully independent; updated documentation. commit 52cd2cc10e20913f21d2fa3584b96f5ba19a1f33 Author: John Bowman Date: Fri Nov 19 09:18:14 2004 -0600 Remove dependency of graph.asy on math.asy; added builtin real abs(pair) and int sgn(real) functions. commit 40eb013f88e09d3faee9450e4251e64815b98013 Author: John Bowman Date: Thu Nov 18 23:26:45 2004 -0600 Renamed includegraphics to include. commit f5364450443b6e5665eab99d3daa1702e2f74858 Author: John Bowman Date: Thu Nov 18 16:50:06 2004 -0600 Added BUGS file. commit 97160f4c77f2be1d111061ee47bd3e9800a245e8 Author: John Bowman Date: Thu Nov 18 14:09:11 2004 -0600 Added layer function. commit 576f5152045b83fe681e81e129b6bdcdc2405255 Author: John Bowman Date: Thu Nov 18 14:05:11 2004 -0600 Added layer and includegraphics functions. commit d0aac5aa876b29ac907e4979c830e9d9829f1405 Author: John Bowman Date: Thu Nov 18 14:04:01 2004 -0600 Added install-all target. commit 1362c4f2073bbd5f1dcc8dfadad51a44b30261ac Author: John Bowman Date: Wed Nov 17 22:16:20 2004 -0600 Fixed typo. commit 985b1d486350fc6e2be207b6c718163ef11c5528 Author: John Bowman Date: Wed Nov 17 11:54:37 2004 -0600 Minor optimizations. commit 608bd681d814f599738c3d132afca3ceb2123012 Author: John Bowman Date: Tue Nov 16 23:32:01 2004 -0600 Removed unused dynamic keyword. commit 51ba77aac1c609ed242c6d68c36d3fd096f0edfe Author: John Bowman Date: Tue Nov 16 16:25:06 2004 -0600 Fixed bug: (path) (nullpath--(0,0)--(100,0)--cycle) was missing final node. commit 418ee6a6c51185817ead6fcbc45fb02cf724ccae Author: John Bowman Date: Mon Nov 15 12:10:37 2004 -0600 Switched from jpg to png images. commit 5bac11e119d1fbffd620ee85e54819912543bded Author: John Bowman Date: Mon Nov 15 00:23:59 2004 -0600 Make variables in file-level modules dynamic by default, like everywhere else. commit b71ff38c28b119ba7f758db7b5b0c1a775258062 Author: John Bowman Date: Sun Nov 14 23:52:36 2004 -0600 Support old versions of install-info. commit 31df852a681c3a7512a1f400ff160cad83201fa0 Author: Andy Hammerlindl Date: Sun Nov 14 20:17:32 2004 -0600 Changed error message for static vs. dynamic errors. commit b812243f2e2ec390c6d91bdba80ae5bd29055174 Author: John Bowman Date: Sun Nov 14 18:48:09 2004 -0600 Moved Legend[] legend inside picture structure; shipout(frame) now adds gui() entries and legend; shipout always deconstructs its picture argument. commit 2f3ce72638f7345515478e7fd1239986cb7ef7bd Author: John Bowman Date: Sun Nov 14 18:45:13 2004 -0600 Fixed compiler warning message if HAVE_LIBFFTW3 is undefined. commit d6329e24d8d9ef6fb4bced54ad2c0e0fa25f1504 Author: John Bowman Date: Sun Nov 14 18:43:30 2004 -0600 removed unnecessary vm:: qualifier commit ec3cc188f1f87ee29ff8fb8a03074c0afffa3680 Author: Andy Hammerlindl Date: Sun Nov 14 18:23:21 2004 -0600 Refactored the equivalent type function. commit 95180b35c3df1f18ee05fd66e02d1ae43d99c343 Author: John Bowman Date: Sun Nov 14 18:12:55 2004 -0600 Added unistd.h include. commit 47d1a0c525b4c8799b0e4443aa61949e9af32254 Author: John Bowman Date: Fri Nov 12 19:55:36 2004 -0600 Increment version. commit b0ed6c9b5514a5e02abfd3be9bf7ab26091169ca Author: John Bowman Date: Fri Nov 12 16:19:44 2004 -0600 release: Version 0.52 commit 616c4d1abc667a430d0768709949bebc24956790 Author: John Bowman Date: Fri Nov 12 15:59:54 2004 -0600 Made import graph local to each figure in latexusage. commit ba5d7f3060b087454a02bd2f7f79487ee2c4edf1 Author: John Bowman Date: Fri Nov 12 15:03:05 2004 -0600 added call to crop commit 6a34a72588eb300f57f899f4ced21aa9b6f5d57b Author: John Bowman Date: Fri Nov 12 14:51:33 2004 -0600 Documentation updates commit 5470c04f907ab9f832734e96914662aed35b0c4b Author: John Bowman Date: Fri Nov 12 12:54:34 2004 -0600 Allow qualification of variables in imported modules with (quoted) nonalphanumeric names; added ISO 8859-1 support (latin1). commit 5d19c564436dd1f96d86293ec8fc9f439aa5fb94 Author: John Bowman Date: Fri Nov 12 01:19:36 2004 -0600 Improved xlimits, ylimits, limits routines. Added crop routine. commit 365495bb65ef64683118cede97ca47adcd56b3b2 Author: John Bowman Date: Fri Nov 12 00:18:59 2004 -0600 Fixed various graph scaling problems. commit 39820dcee67bcb5d1817c60bda996d00bc348152 Author: John Bowman Date: Wed Nov 10 11:49:27 2004 -0600 minor formatting changes commit 97ec1247f54a8a0b5357118b6734352eca9a34a0 Author: John Bowman Date: Wed Nov 10 11:32:05 2004 -0600 Encapsulated global graph scaling variables within picture; updated documentation. commit 83b65356fb2a5b1f9d8c92c0762a3bc2f744fedc Author: John Bowman Date: Tue Nov 9 12:45:09 2004 -0600 fixed missing word on first page commit cd6c145e4a962015b614c18d939140d40f2b5dce Author: John Bowman Date: Tue Nov 9 12:44:22 2004 -0600 Added dots(pair); fixed division by zero in arrowhead for degenerate paths. commit e699111cfa5bfbf41c9fb574bde171a093536809 Author: John Bowman Date: Tue Nov 9 01:55:45 2004 -0600 Increment version. commit 31c13bbe9d051c54aac6051cfda68612df499d33 Author: John Bowman Date: Tue Nov 9 00:08:08 2004 -0600 Missing description commit c62bec9c482884523ccadd379edd34f67c5e4d2b Author: John Bowman Date: Mon Nov 8 23:54:35 2004 -0600 fixed missing @code commit d8ea0103c797070c787f5f890c4b2401690a2945 Author: John Bowman Date: Mon Nov 8 23:34:47 2004 -0600 moved to doc/ commit 3ddefd4eff344e676e2a8a9f5e19cd32ed9aa0eb Author: John Bowman Date: Mon Nov 8 23:28:34 2004 -0600 Fixed problems with installation of base files from cvs. commit da8c687ac5ec2be2c818d84c9e97e723f485a26a Author: John Bowman Date: Mon Nov 8 23:10:40 2004 -0600 updated cvsignore entries commit dba6643b3b853fce3f2de5e41e47ed8b71cf099b Author: John Bowman Date: Mon Nov 8 22:50:37 2004 -0600 Added optimization flags. commit 0436f92dcb74953fc3bb748230e5a29d0730fd1d Author: John Bowman Date: Mon Nov 8 22:50:04 2004 -0600 Added optimization flags. commit db450befc0d01549b9c53af8fc5646c6d110d574 Author: John Bowman Date: Mon Nov 8 22:37:03 2004 -0600 Added instructions for asy-mode.el and asy.vim. commit a0e9333119818dc1592791a5078676cae36eca2c Author: John Bowman Date: Mon Nov 8 18:48:55 2004 -0600 unicode updates commit d0f20f5cfc0e9d958ab4a0793e1e0cccbec31d65 Author: John Bowman Date: Mon Nov 8 13:18:05 2004 -0600 Corrected local value of ASYMPTOTE_DIR commit b3857ef4fae8c20e1fbc4852c302fc44a1988cc2 Author: John Bowman Date: Mon Nov 8 12:22:32 2004 -0600 Fixed warning messages. commit 2adbb10378f06aecb049da9b6da02ed9b23bd0fb Author: John Bowman Date: Mon Nov 8 12:11:03 2004 -0600 Update cvs version commit a83b4974fc41dde098be1a222b4240ce0ea8feaa Author: John Bowman Date: Mon Nov 8 12:06:53 2004 -0600 Asymptote logo commit b345871de175eed69610a6ac96996f67b1c07a8f Author: John Bowman Date: Mon Nov 8 12:03:15 2004 -0600 Updated README and URL. commit 5c97b1a8b45f7ba5370f381ee53e948353a7daba Author: John Bowman Date: Mon Nov 8 11:52:02 2004 -0600 Example of latex usage. commit d71e3c7017fa75e11f4c0228caf1123553006cda Author: John Bowman Date: Mon Nov 8 11:39:13 2004 -0600 displayed equation example commit 7021ba702776cc5e337025f1625803e4067d376d Author: John Bowman Date: Mon Nov 8 11:35:58 2004 -0600 updates to localwords commit d4199ebd8601704b3e1e0b6f54d1fcdf3430b478 Author: John Bowman Date: Mon Nov 8 11:31:39 2004 -0600 typo fixed commit 377185edb2c7dca51b3b3f00504e72d065495b97 Author: John Bowman Date: Mon Nov 8 11:28:23 2004 -0600 Final documentation updates. commit 50806de05e5b6c19b0df9345e278c8259ebafeb0 Author: John Bowman Date: Mon Nov 8 11:23:09 2004 -0600 make install-man no longer does a make man commit c751286c5070b8f4e40909cbf54bdc7266a49982 Author: John Bowman Date: Mon Nov 8 11:21:30 2004 -0600 Final tweaks before release. commit d113158cdd9b36e3c45a4db4d39dbc2b91144aa1 Author: John Bowman Date: Mon Nov 8 00:24:38 2004 -0600 Updates to facilitate building info pages and figures. commit c3d8c3b7da2f6ceb84900a4e26618e8533092b08 Author: John Bowman Date: Mon Nov 8 00:23:30 2004 -0600 Updated documentation. commit eef5bb1c1657e77885799591cf982d1dbd6ab608 Author: John Bowman Date: Sun Nov 7 23:22:17 2004 -0600 Updated documentation commit d09249b9dfed161600e6c1aa332721b9e8b0c6c4 Author: John Bowman Date: Sun Nov 7 23:05:05 2004 -0600 Fixed interactive mode. commit 93a889f31435adc3851b081cd0709f55e2031688 Author: John Bowman Date: Sun Nov 7 17:02:25 2004 -0600 Example of multiple data graphs with secondary axis. commit 87cef6cf1df4f16b971dc52eb4f5c52d39d49e9b Author: John Bowman Date: Sun Nov 7 16:32:44 2004 -0600 Fixed menus. commit 5a97218e8c5371f76d23d0304e8336dc62f07f79 Author: John Bowman Date: Sun Nov 7 16:31:19 2004 -0600 Added a reset() function to restore settings to startup defaults. commit 2c124d11951789640019cdb62fb9062f22700db2 Author: John Bowman Date: Sun Nov 7 16:28:30 2004 -0600 Formatting of comments. commit 048da481e7e14b7d937a8db3e2349212c5864163 Author: John Bowman Date: Sun Nov 7 16:27:32 2004 -0600 Documentation updates. commit 0b26fa75ab89038ac2950312e78b95e68641205e Author: John Bowman Date: Sun Nov 7 01:08:29 2004 -0600 Added missing functions; removed pt from plain.asy; updated documentation commit 7803748c35eb80c46c1175517f31fb20cfc7ece7 Author: John Bowman Date: Fri Nov 5 11:16:40 2004 -0600 Added GNU public LICENSE. commit 2b333b9b4907b6c2a9200e8ddc89b9a09d7d0e66 Author: John Bowman Date: Fri Nov 5 11:13:47 2004 -0600 Documentation updates. commit 45357092d3ebf51f9b0c7d82e1a05610abf5f565 Author: John Bowman Date: Fri Nov 5 00:37:35 2004 -0600 Updated documentation. commit 82153ab432256c8e32d48ffc98e12b2bf41a7576 Author: John Bowman Date: Thu Nov 4 00:45:40 2004 -0600 Documentation updates. commit c9dd522eca27b074b3f04f5f2799e02c2adb7933 Author: John Bowman Date: Tue Nov 2 23:20:51 2004 -0600 Allow negative array indices in arrayIntArray as in arrayRead and arrayWrite. commit fec561b75b55c779d89eca9c9ea6dce758df8eb1 Author: John Bowman Date: Tue Nov 2 23:13:26 2004 -0600 Allow assignment to array indices [-len,-1]; handle negative array indices in sequence routines. commit 962962b19d4ce3af442a461f5051f3eb856bd299 Author: John Bowman Date: Tue Nov 2 13:10:24 2004 -0600 Added missing pen transformation code. commit d3e2ac4b4a0af6bdeaee28bb5742844928f24026 Author: John Bowman Date: Mon Nov 1 11:23:54 2004 -0600 minor updates commit a1457afb992cf18a85a8cce07ff9306cae5a282f Author: John Bowman Date: Sun Oct 31 23:27:35 2004 -0600 Check for boost header files; updated documentation. commit fab31bbeb056e157742e94531443b8b82218d465 Author: John Bowman Date: Thu Oct 28 23:04:37 2004 -0600 Updated documentation. commit 7b66b69511f9b742bcc674e47101a71e9b670326 Author: John Bowman Date: Thu Oct 28 23:04:20 2004 -0600 Make -O work when dvips isn't used. commit 873b67e55dfad98287e13941e79984c0e64d688a Author: John Bowman Date: Thu Oct 28 15:26:57 2004 -0600 Sean Healy's logo implemented in Asymptote. commit 83660c66186bfc76ccdc858aafda6ab89d05cd08 Author: John Bowman Date: Tue Oct 26 09:05:04 2004 -0600 Initial version. commit 23e61146aa827a5faa4b94fa47506277a365005b Author: John Bowman Date: Tue Oct 26 07:38:06 2004 -0600 Removed unwanted cvs files. commit 35fdf59891ddb8786fe964d9f945f995088680cd Author: John Bowman Date: Tue Oct 26 07:31:01 2004 -0600 Set version = 0.50. commit b0bf033492246c01f5262a7ec4a44255675127d7 Author: John Bowman Date: Tue Oct 26 07:29:34 2004 -0600 Fixed warning message if HAVE_STRTIME == 0 commit c4702ee14e622bba47870ced5e25270f550d7c0f Author: John Bowman Date: Tue Oct 26 07:27:12 2004 -0600 Initial revision. [[This repository was converted from Subversion to git on 2015-07-27 by Jesse Frohlich . Junk commits generated by cvs2svn have been removed and commit references have been mapped into a uniform VCS-independent syntax.]] asymptote-3.05/drawpath.h0000644000000000000000000000123515031566105014152 0ustar rootroot/***** * drawpath.h * Andy Hammerlindl 2002/06/06 * * Stores a path that has been added to a picture. *****/ #ifndef DRAWPATH_H #define DRAWPATH_H #include "drawelement.h" #include "path.h" namespace camp { class drawPath : public drawPathPenBase { public: drawPath(path src, pen pentype, const string& key="") : drawElement(key), drawPathPenBase(src,pentype) {} virtual ~drawPath() {} void bounds(bbox& b, iopipestream&, boxvector&, bboxlist&) { strokebounds(b,p); } bool svg() {return true;} bool draw(psfile *out); drawElement *transformed(const transform& t); }; pen adjustdash(pen& p, double arclength, bool cyclic); } #endif asymptote-3.05/generate_asy_ver_info.py0000644000000000000000000000420515031566105017076 0ustar rootroot#!/usr/bin/env python3 __doc__ = """ Determines asymptote version for release, or with git info for development """ __author__ = "Supakorn 'Jamie' Rassameemasmuang " import pathlib import re import subprocess from argparse import ArgumentParser from subprocess import CalledProcessError from determine_pkg_info import determine_asy_pkg_info def parse_args(): parser = ArgumentParser() parser.add_argument( "--base-version", type=str, help="Base version string. If blank, this information is " + "fetched from configure.ac", ) version_mode = parser.add_mutually_exclusive_group() version_mode.add_argument("--version-for-release", action="store_true") version_mode.add_argument( "--version-with-git-info", action="store_true", help="Includes number of commits since last tag, if directory is a git repo. " + "If commit information cannot be determined, reverts to baseline version", ) return parser.parse_args() def determine_version_for_release(version_base: str): git_string = "git" if version_base.endswith("git"): return version_base[: -len(git_string)] return version_base def determine_version_with_git_info(version_base: str): try: long_description = subprocess.run( ["git", "describe", "--long"], cwd=pathlib.Path(__file__).parent, check=True, stderr=subprocess.DEVNULL, stdout=subprocess.PIPE, text=True, ) except CalledProcessError: return version_base first_version_base = re.sub(r"git-([0-9]*)-g.*", r"-\1", long_description.stdout) return re.sub(r"-0-g.*", r"", first_version_base) def main(): args = parse_args() version_base = args.base_version or determine_asy_pkg_info()["version-base"] if args.version_for_release: version = determine_version_for_release(version_base) elif args.version_with_git_info: version = determine_version_with_git_info(version_base) else: version = version_base print(version, end="") if __name__ == "__main__": main() asymptote-3.05/stack.h0000644000000000000000000000646515031566105013457 0ustar rootroot/***** * stack.h * Andy Hammerlindl 2002/06/27 * * The general stack machine used to run compiled camp code. *****/ #ifndef STACK_H #define STACK_H #include #include "errormsg.h" #include "vm.h" #include "item.h" #include "absyn.h" namespace vm { struct func; class program; struct lambda; class importInitMap; struct bpinfo : public gc { fileinfo f; absyntax::runnable *r; bpinfo(const string& filename, size_t lineNum, absyntax::runnable *r=NULL) : f(fileinfo(filename,lineNum)), r(r) {} }; inline bool operator == (const bpinfo& a, const bpinfo& b) { return a.f == b.f; } extern mem::list bplist; class runnable; extern bool indebugger; class stack { public: using vars_t = vmFrame*; struct importInitMap { virtual ~importInitMap() {} virtual lambda *operator[](string) = 0; }; private: // stack for operands using stack_t = mem::vector; stack_t theStack; void draw(ostream& out); // The initializer functions for imports, indexed by name. importInitMap *initMap; // The stack stores a map of initialized imported modules by name, so that // each module is initialized only once and each import refers to the same // instance. using importInstanceMap = mem::map; importInstanceMap instMap; // One can associate an environment to embedded code while running. trans::coenv *e; // Debugger variables: char debugOp; position lastPos, breakPos; bool newline; // Move arguments from stack to frame. void marshall(size_t args, stack::vars_t vars); public: stack() : e(0), debugOp(0), lastPos(nullPos), breakPos(nullPos), newline(false) {}; virtual ~stack() {}; void setInitMap(importInitMap *i) { initMap=i; } void setEnvironment(trans::coenv *e) { this->e=e; } trans::coenv *getEnvironment() { return e; } // Runs a lambda. If vars is non-null, it is used to store the variables of // the lambda. Otherwise, the method allocates a closure only if needed. void runWithOrWithoutClosure(lambda *l, vars_t vars, vars_t parent); // Executes a function on top of the stack. void run(func *f); void breakpoint(absyntax::runnable *r=NULL); void debug(); // Put an import (indexed by filename and optional template // parameter signature) on top of the stack, initializing it if necessary. void loadModule(string index, Int numPushedParents = 0); // These are so that built-in functions can easily manipulate the stack void push(item next) { theStack.push_back(next); } template void push(T next) { push((item)next); } item top() { return theStack.back(); } item pop() { item ret = theStack.back(); theStack.pop_back(); return ret; } template T pop() { return get(pop()); } }; inline item pop(stack* s) { return s->pop(); } template inline T pop(stack* s) { return get(pop(s)); } template inline T pop(stack* s, T defval) { item it=pop(s); return isdefault(it) ? defval : get(it); } class interactiveStack : public stack { vars_t globals; size_t globals_size; public: interactiveStack(); // Run a codelet, a small piece of code that uses globals as its frame. void run(lambda *codelet); }; } // namespace vm #endif // STACK_H asymptote-3.05/settings.cc0000644000000000000000000016115415031566105014345 0ustar rootroot/***** * settings.cc * Andy Hammerlindl 2004/05/10 * * Declares a list of global variables that act as settings in the system. *****/ #include #include #include #include #include #include #include #include #if defined(_WIN32) #include #include #define isatty _isatty #else #include #endif #include "common.h" #if HAVE_GNU_GETOPT_H #include #else #include "getopt.h" #endif #include "util.h" #include "settings.h" #include "interact.h" #include "locate.h" #include "lexical.h" #include "record.h" #include "env.h" #include "item.h" #include "refaccess.h" #include "pipestream.h" #include "array.h" #include "glrender.h" #ifdef HAVE_LIBCURSES extern "C" { #ifdef HAVE_NCURSES_CURSES_H #define USE_SETUPTERM #include #include #elif HAVE_NCURSES_H #define USE_SETUPTERM #include #include #elif HAVE_CURSES_H #include #if defined(HAVE_TERM_H) #define USE_SETUPTERM #include #endif #endif } #endif // Workaround broken curses.h files: #ifdef clear #undef clear #endif // Workaround broken header file on i386-solaris with g++ 3.4.3. #ifdef erase #undef erase #endif using vm::item; using trans::itemRefAccess; using trans::refAccess; using trans::varEntry; using vm::array; void runFile(const string& filename); namespace settings { using camp::pair; #ifdef HAVE_LIBGLM const bool havegl=true; #else const bool havegl=false; #endif #if !defined(_WIN32) mode_t mask; #endif string systemDir=ASYMPTOTE_SYSDIR; string defaultPSdriver="ps2write"; string defaultEPSdriver="eps2write"; string defaultPNGdriver="png16malpha"; // pngalpha has issues at high resolutions string defaultAsyGL="https://vectorgraphics.github.io/asymptote/base/webgl/asygl-"+ string(AsyGLVersion)+".js"; #if !defined(_WIN32) bool msdos=false; string HOME="HOME"; string docdir=ASYMPTOTE_DOCDIR; const char pathSeparator=':'; #ifdef __APPLE__ string defaultPSViewer="open"; string defaultPDFViewer="open"; string defaultHTMLViewer="open"; #else string defaultPSViewer="evince"; string defaultPDFViewer="evince"; string defaultHTMLViewer="google-chrome"; #endif string defaultGhostscript="gs"; string defaultGhostscriptLibrary=""; string defaultDisplay="display"; string defaultAnimate="magick"; void queryRegistry() {} const string dirsep="/"; #else bool msdos=true; string HOME="USERPROFILE"; string docdir="c:\\Program Files\\Asymptote"; const char pathSeparator=';'; string defaultPSViewer; //string defaultPDFViewer="AcroRd32.exe"; string defaultPDFViewer; string defaultHTMLViewer; string defaultGhostscript; string defaultGhostscriptLibrary; string defaultDisplay; //string defaultAnimate="magick"; string defaultAnimate=""; const string dirsep="\\"; /** * Use key to look up an entry in the MSWindows registry, * @param baseRegLocation base location for a key * @param key Key to look up, respecting wild cards. Note that wildcards * only support single-level glob. Recursive globs are not supported. * @param value Value to look up * @remark Wildcards can only be in keys, not in the final value * @return Entry value, or nullopt if not found */ optional getEntry(HKEY const& baseRegLocation, string const& key, string const& value) { string path= key; if (key.find('\\') == 0) { path= path.substr(1);// strip the prefix separator } size_t const star= path.find('*'); if (star == string::npos) { // absolute path, can return right away DWORD dataSize= 0; if (RegGetValueA( baseRegLocation, path.c_str(), value.c_str(), RRF_RT_REG_SZ, nullptr, nullptr, &dataSize ) != ERROR_SUCCESS) { return nullopt; } mem::vector outputBuffer(dataSize); if (RegGetValueA( baseRegLocation, path.c_str(), value.c_str(), RRF_RT_REG_SZ, nullptr, outputBuffer.data(), &dataSize ) != ERROR_SUCCESS) { return nullopt; } return make_optional( reinterpret_cast(outputBuffer.data()) ); } // has a glob, search until we find one string const prefix= path.substr(0, star); string const pathSuffix= path.substr(star + 1); // open the key in prefix camp::w32::RegKeyWrapper directoryWithPrefix; if (RegOpenKeyExA( baseRegLocation, prefix.c_str(), 0, KEY_READ, directoryWithPrefix.put() ) != ERROR_SUCCESS) { return nullopt;// prefix path does not exist, or some other error } DWORD numSubKeys= 0; DWORD longestSubkeySize= 0; // querying # of subkeys + their longest path length if (RegQueryInfoKeyA( directoryWithPrefix.getKey(), nullptr, nullptr, nullptr, &numSubKeys, &longestSubkeySize, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr ) != ERROR_SUCCESS) { return nullopt; } mem::vector subkeyBuffer(longestSubkeySize + 1); for (DWORD i= 0; i < numSubKeys; ++i) { DWORD cchValue= longestSubkeySize + 1; // get subkey's name if (RegEnumKeyExA( directoryWithPrefix.getKey(), i, subkeyBuffer.data(), &cchValue, nullptr, nullptr, nullptr, nullptr ) != ERROR_SUCCESS) { continue; } // open the subkey camp::w32::RegKeyWrapper searchKey; if (RegOpenKeyExA( directoryWithPrefix.getKey(), subkeyBuffer.data(), 0, KEY_READ, searchKey.put() ) != ERROR_SUCCESS) { continue; } // do a recursive search starting at the opened key if (auto retResult= getEntry(searchKey.getKey(), pathSuffix, value); retResult.has_value()) { return retResult; } } return nullopt; } // Use key to look up an entry in the MSWindows registry, respecting wild cards string getEntry(const string& key, const string& value) { for (HKEY const keyToSearch : {HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER}) { camp::w32::RegKeyWrapper baseRegKey; if (RegOpenKeyExA(keyToSearch, "SOFTWARE", 0, KEY_READ, baseRegKey.put()) != ERROR_SUCCESS) { baseRegKey.release(); continue; } optional entry= getEntry(baseRegKey.getKey(), key, value); if (entry.has_value()) { return entry.value(); } } return ""; } void queryRegistry() { defaultGhostscriptLibrary= getEntry(R"(GPL Ghostscript\*)", "GS_DLL"); if (defaultGhostscriptLibrary.empty()) defaultGhostscriptLibrary= getEntry(R"(AFPL Ghostscript\*)", "GS_DLL"); string gslib= stripDir(defaultGhostscriptLibrary); defaultGhostscript= stripFile(defaultGhostscriptLibrary) + ((gslib.empty() || gslib.substr(5, 2) == "32") ? "gswin32c.exe" : "gswin64c.exe"); string const s= getEntry( R"(Microsoft\Windows\CurrentVersion\App Paths\Asymptote)", "Path" ); if (!s.empty()) { docdir= s; } // An empty systemDir indicates a TeXLive build if (!systemDir.empty() && !docdir.empty()) systemDir= docdir; } #endif // The name of the program (as called). Used when displaying help info. char *argv0; Int verbose; bool debug; bool xasy; bool keys; bool quiet=false; // Conserve memory at the expense of speed. bool compact; // Colorspace conversion flags (stored in global variables for efficiency). bool gray; bool bw; bool rgb; bool cmyk; // Disable system calls. bool safe=true; // Enable reading from other directories bool globalRead=true; // Enable writing to (or changing to) other directories bool globalWrite=false; bool globalwrite() {return globalWrite || !safe;} bool globalread() {return globalRead || !safe;} const string suffix="asy"; const string guisuffix="gui"; const string standardprefix="out"; string initdir; string historyname; // Local versions of the argument list. int argCount = 0; char **argList = 0; typedef ::option c_option; types::dummyRecord *settingsModule; types::record *getSettingsModule() { return settingsModule; } void noWarn(const string& s) { array *Warn=getSetting("suppress"); size_t size=checkArray(Warn); if(s.empty()) return; for(size_t i=0; i < size; i++) if(vm::read(Warn,i) == s) return; Warn->push(s); } void Warn(const string& s) { array *Warn=getSetting("suppress"); size_t size=checkArray(Warn); for(size_t i=0; i < size; i++) if(vm::read(Warn,i) == s) (*Warn).erase((*Warn).begin()+i,(*Warn).begin()+i+1); } bool warn(const string& s) { if(debug) return true; array *Warn=getSetting("suppress"); size_t size=checkArray(Warn); for(size_t i=0; i < size; i++) if(vm::read(Warn,i) == s) return false; return true; } // The dictionaries of long options and short options. struct option; typedef mem::map optionsMap_t; optionsMap_t optionsMap; typedef mem::map codeMap_t; codeMap_t codeMap; struct option : public gc { string name; char code; // Command line option, i.e. 'V' for -V. bool argument; // If it takes an argument on the command line. This is set // based on whether argname is empty. string argname; // The argument name for printing the description. string desc; // One line description of what the option does. bool cmdlineonly; // If it is only available on the command line. string Default; // A string containing an optional default value. option(string name, char code, string argname, string desc, bool cmdlineonly=false, string Default="") : name(name), code(code), argument(!argname.empty()), argname(argname), desc(desc), cmdlineonly(cmdlineonly), Default(Default) {} virtual ~option() {} // Builds this option's contribution to the optstring argument of get_opt(). virtual string optstring() { if (code) { string base; base.push_back(code); if(argument) base.push_back(':'); return base; } else return ""; } // Sets the contribution to the longopt array. virtual void longopt(c_option &o) { o.name=name.c_str(); o.has_arg=argument ? 1 : 0; o.flag=0; o.val=0; } // Add to the dictionaries of options. virtual void add() { optionsMap[name]=this; if (code) codeMap[code]=this; } // Set the option from the command-line argument. Return true if the option // was correctly parsed. virtual bool getOption() = 0; void error(string msg) { cerr << endl << argv0 << ": "; if (code) cerr << "-" << code << " "; cerr << "(-" << name << ") " << msg << endl; } // The "-f,-outformat format" part of the option. virtual string describeStart() { ostringstream ss; if (code) ss << "-" << code << ","; ss << "-" << name; if (argument) ss << " " << argname; return ss.str(); } // Outputs description of the command for the -help option. virtual void describe(char option) { // Don't show the option if it has no desciption. if(!hide() && ((option == 'h') ^ env())) { const unsigned WIDTH=22; string start=describeStart(); cerr << std::left << std::setw(WIDTH) << start; if (start.size() >= WIDTH) { cerr << endl; cerr << std::left << std::setw(WIDTH) << ""; } cerr << " " << desc; if(cmdlineonly) cerr << "; command-line only"; if(Default != "") { if(!desc.empty()) cerr << " "; cerr << Default; } cerr << endl; } } virtual void reset() { } virtual bool env() {return false;} virtual bool hide() {return false;} }; const string noarg; struct setting : public option { types::ty *t; private: trans::permission perm; bool added; // Flag the setting as secure, so that it can only be set on the command-line, // though it can still be read in Asymptote code. void secure() { assert(!added); perm = trans::RESTRICTED; } public: setting(string name, char code, string argname, string desc, types::ty *t, string Default) : option(name, code, argname, desc, false,Default), t(t), perm(trans::PUBLIC), added(false) {} void reset() = 0; virtual trans::access *buildAccess() = 0; // Add to the dictionaries of options and to the settings module. virtual void add() { assert(!added); option::add(); settingsModule->add(name, t, buildAccess(), perm); added=true; } friend void addSecureSetting(setting *s) { s->secure(); s->add(); } }; struct itemSetting : public setting { item defaultValue; item value; itemSetting(string name, char code, string argname, string desc, types::ty *t, item defaultValue, string Default="") : setting(name, code, argname, desc, t, Default), defaultValue(defaultValue) {reset();} void reset() { value=defaultValue; } trans::access *buildAccess() { return new itemRefAccess(&(value)); } }; item& Setting(string name) { itemSetting *s=dynamic_cast(optionsMap[name]); if(!s) { cerr << "Cannot find setting named '" << name << "'" << endl; exit(-1); } return s->value; } struct boolSetting : public itemSetting { boolSetting(string name, char code, string desc, bool defaultValue=false) : itemSetting(name, code, noarg, desc, types::primBoolean(), (item)defaultValue, defaultValue ? "[true]" : "[false]") {} bool getOption() { value=(item)true; return true; } option *negation(string name) { struct negOption : public option { boolSetting &base; bool hide() {return true;} negOption(boolSetting &base, string name) : option(name, 0, noarg, ""), base(base) {} bool getOption() { base.value=(item)false; return true; } }; return new negOption(*this, name); } void add() { setting::add(); negation("no"+name)->add(); if (code) { string nocode="no"; nocode.push_back(code); negation(nocode)->add(); } } // Set several related boolean options at once. Used for view and trap which // have batch and interactive settings. struct multiOption : public option { typedef mem::list setlist; setlist set; multiOption(string name, char code, string desc) : option(name, code, noarg, desc, true) {} void add(boolSetting *s) { set.push_back(s); } void setValue(bool value) { for (setlist::iterator s=set.begin(); s!=set.end(); ++s) (*s)->value=(item)value; } bool getOption() { setValue(true); return true; } option *negation(string name) { struct negOption : public option { multiOption &base; bool hide() {return true;} negOption(multiOption &base, string name) : option(name, 0, noarg, ""), base(base) {} bool getOption() { base.setValue(false); return true; } }; return new negOption(*this, name); } void add() { option::add(); negation("no"+name)->add(); if (code) { string nocode="no"; nocode.push_back(code); negation(nocode)->add(); } for (multiOption::setlist::iterator s=set.begin(); s!=set.end(); ++s) (*s)->add(); } }; }; typedef boolSetting::multiOption multiOption; struct argumentSetting : public itemSetting { argumentSetting(string name, char code, string argname, string desc, types::ty *t, item defaultValue) : itemSetting(name, code, argname, desc, t, defaultValue) { assert(!argname.empty()); } }; struct stringSetting : public argumentSetting { stringSetting(string name, char code, string argname, string desc, string defaultValue="") : argumentSetting(name, code, argname, desc == "" ? "["+defaultValue+"]" : desc+(defaultValue.empty() ? "" : " ["+defaultValue+"]"), types::primString(), (item)defaultValue) {} bool getOption() { value=(item)(string)optarg; return true; } }; struct userSetting : public argumentSetting { userSetting(string name, char code, string argname, string desc, string defaultValue="") : argumentSetting(name, code, argname, desc, types::primString(), (item)defaultValue) {} bool getOption() { string s=vm::get(value)+string(optarg); s.push_back(';'); value=(item) s; return true; } }; struct warnSetting : public option { warnSetting(string name, char code, string argname, string desc) : option(name, code, argname, desc, true) {} bool getOption() { Warn(string(optarg)); return true; } option *negation(string name) { struct negOption : public option { warnSetting &base; bool hide() {return true;} negOption(warnSetting &base, string name, string argname) : option(name, 0, argname, ""), base(base) {} bool getOption() { noWarn(string(optarg)); return true; } }; return new negOption(*this, name, argname); } void add() { option::add(); negation("no"+name)->add(); if (code) { string nocode="no"; nocode.push_back(code); negation(nocode)->add(); } } }; string GetEnv(string s, string Default) { transform(s.begin(), s.end(), s.begin(), toupper); string t=Getenv(("ASYMPTOTE_"+s).c_str(),msdos); return t.empty() ? Default : t; } struct envSetting : public stringSetting { envSetting(string name, string Default) : stringSetting(name, 0, " ", "", GetEnv(name,Default)) {} bool env() {return true;} }; template struct dataSetting : public argumentSetting { string text; dataSetting(const char *text, string name, char code, string argname, string desc, types::ty *type, T defaultValue) : argumentSetting(name, code, argname, desc, type, (item)defaultValue), text(text) {} bool getOption() { try { value=(item)lexical::cast(optarg); } catch (lexical::bad_cast&) { error("option requires " + text + " as an argument"); return false; } return true; } }; template string description(string desc, T defaultValue) { return desc.empty() ? "" : desc+" ["+String(defaultValue)+"]"; } struct IntSetting : public dataSetting { IntSetting(string name, char code, string argname, string desc, Int defaultValue=0) : dataSetting("an int", name, code, argname, description(desc,defaultValue), types::primInt(), defaultValue) {} }; struct realSetting : public dataSetting { realSetting(string name, char code, string argname, string desc, double defaultValue=0.0) : dataSetting("a real", name, code, argname, description(desc,defaultValue), types::primReal(), defaultValue) {} }; struct pairSetting : public dataSetting { pairSetting(string name, char code, string argname, string desc, pair defaultValue=0.0) : dataSetting("a pair", name, code, argname, description(desc,defaultValue), types::primPair(), defaultValue) {} }; // For setting the alignment of a figure on the page. struct alignSetting : public argumentSetting { alignSetting(string name, char code, string argname, string desc, string defaultValue) : argumentSetting(name, code, argname, description(desc,defaultValue), types::primString(), (item)defaultValue) {} bool getOption() { string str=optarg; if(str == "C" || str == "T" || str == "B" || str == "Z") { value=str; return true; } error("invalid argument for option"); return false; } }; struct stringArraySetting : public itemSetting { stringArraySetting(string name, array *defaultValue) : itemSetting(name, 0, "", "", types::stringArray(), (item) defaultValue) {} bool hide() {return true;} bool getOption() {return true;} }; struct engineSetting : public argumentSetting { engineSetting(string name, char code, string argname, string desc, string defaultValue) : argumentSetting(name, code, argname, description(desc,defaultValue), types::primString(), (item)defaultValue) {} bool getOption() { string str=optarg; if(str == "latex" || str == "pdflatex" || str == "xelatex" || str == "tex" || str == "pdftex" || str == "luatex" || str == "lualatex" || str == "context" || str == "none") { value=str; return true; } error("invalid argument for option"); return false; } }; template string stringCast(T x) { ostringstream buf; buf.precision(DBL_DIG); buf.setf(std::ios::boolalpha); buf << x; return string(buf.str()); } template struct refSetting : public setting { T *ref; T defaultValue; string text; refSetting(string name, char code, string argname, string desc, types::ty *t, T *ref, T defaultValue, const char *text="") : setting(name, code, argname, desc, t, stringCast(defaultValue)), ref(ref), defaultValue(defaultValue), text(text) { reset(); } virtual bool getOption() { try { *ref=lexical::cast(optarg); } catch (lexical::bad_cast&) { error("option requires " + text + " as an argument"); return false; } return true; } virtual void reset() { *ref=defaultValue; } trans::access *buildAccess() { return new refAccess(ref); } }; struct boolrefSetting : public refSetting { boolrefSetting(string name, char code, string desc, bool *ref, bool Default=false) : refSetting(name, code, noarg, desc, types::primBoolean(), ref, Default) {} virtual bool getOption() { *ref=true; return true; } virtual option *negation(string name) { struct negOption : public option { boolrefSetting &base; bool hide() {return true;} negOption(boolrefSetting &base, string name) : option(name, 0, noarg, ""), base(base) {} bool getOption() { *(base.ref)=false; return true; } }; return new negOption(*this, name); } void add() { setting::add(); negation("no"+name)->add(); if (code) { string nocode="no"; nocode.push_back(code); negation(nocode)->add(); } } }; struct compactSetting : public boolrefSetting { compactSetting(string name, char code, string desc, bool *ref, bool Default=false) : boolrefSetting(name,code,desc,ref,Default) {} bool getOption() { mem::compact(1); return boolrefSetting::getOption(); } option *negation(string name) { mem::compact(0); return boolrefSetting::negation(name); } }; struct incrementSetting : public refSetting { incrementSetting(string name, char code, string desc, Int *ref) : refSetting(name, code, noarg, desc, types::primInt(), ref, 0) {} bool getOption() { // Increment the value. ++(*ref); return true; } option *negation(string name) { struct negOption : public option { incrementSetting &base; bool hide() {return true;} negOption(incrementSetting &base, string name) : option(name, 0, noarg, ""), base(base) {} bool getOption() { if(*base.ref) --(*base.ref); return true; } }; return new negOption(*this, name); } void add() { setting::add(); negation("no"+name)->add(); if (code) { string nocode="no"; nocode.push_back(code); negation(nocode)->add(); } } }; struct incrementOption : public option { Int *ref; Int level; incrementOption(string name, char code, string desc, Int *ref, Int level=1) : option(name, code, noarg, desc, true), ref(ref), level(level) {} bool hide() {return true;} bool getOption() { // Increment the value. (*ref) += level; return true; } }; void addOption(option *o) { o->add(); } void version() { cerr << PACKAGE_NAME << " version " << REVISION << " [(C) 2004 Andy Hammerlindl, John C. Bowman, Tom Prince]" << endl; } void usage(const char *program) { version(); cerr << "\t\t\t" << "https://asymptote.sourceforge.io/" << endl << "Usage: " << program << " [options] [file ...]" << endl; } void reportSyntax() { cerr << endl; usage(argv0); cerr << endl << "Type '" << argv0 << " -h' for a description of options." << endl; exit(1); } void displayOptions(char code) { cerr << endl; if(code == 'h') cerr << "Options (negate boolean options by replacing - with -no): " << endl << endl; else cerr << "Environment settings: " << endl << endl; for (optionsMap_t::iterator opt=optionsMap.begin(); opt!=optionsMap.end(); ++opt) opt->second->describe(code); } struct helpOption : public option { helpOption(string name, char code, string desc) : option(name, code, noarg, desc, true) {} bool getOption() { usage(argv0); displayOptions(code); cerr << endl; exit(0); // Unreachable code. return true; } }; struct versionOption : public option { versionOption(string name, char code, string desc) : option(name, code, noarg, desc, true) {} bool disabled; const void feature(const char *s, bool enabled) { if(enabled ^ disabled) cerr << s << endl; } void features(bool enabled) { disabled=!enabled; cerr << endl << (disabled ? "DIS" : "EN") << "ABLED OPTIONS:" << endl; bool glm=false; bool gl=false; bool ssbo=false; bool gsl=false; bool fftw3=false; bool eigen=false; bool xdr=false; bool curl=false; bool lsp=false; bool readline=false; bool editline=false; bool sigsegv=false; bool usegc=false; bool usethreads=false; #if HAVE_LIBGLM glm=true; #endif #ifdef HAVE_GL gl=true; #endif #ifdef HAVE_SSBO ssbo=true; #endif #ifdef HAVE_LIBGSL gsl=true; #endif #ifdef HAVE_LIBFFTW3 fftw3=true; #endif #ifdef HAVE_EIGEN_DENSE eigen=true; #endif #ifdef HAVE_LIBTIRPC xdr=true; #endif #ifdef HAVE_LIBCURL curl=true; #endif #ifdef HAVE_LSP lsp=true; #endif #ifdef HAVE_LIBCURSES #ifdef HAVE_LIBREADLINE readline=true; #else #ifdef HAVE_LIBEDIT editline=true; #endif #endif #endif #ifdef HAVE_LIBSIGSEGV sigsegv=true; #endif #ifdef USEGC usegc=true; #endif #ifdef HAVE_PTHREAD usethreads=true; #endif feature("V3D 3D vector graphics output",glm && xdr); feature("WebGL 3D HTML rendering",glm); #ifdef HAVE_LIBOSMESA feature("OpenGL 3D OSMesa offscreen rendering",gl); #else feature("OpenGL 3D OpenGL rendering",gl); #endif feature("SSBO GLSL shader storage buffer objects",ssbo); feature("GSL GNU Scientific Library (special functions)",gsl); feature("FFTW3 Fast Fourier transforms",fftw3); feature("Eigen Eigenvalue library",eigen); feature("XDR External Data Representation (portable binary file format for V3D)",xdr); feature("CURL URL support",curl); feature("LSP Language Server Protocol",lsp); feature("Readline Interactive history and editing",readline); if(!readline) feature("Editline interactive editing (Readline is unavailable)",editline); feature("Sigsegv Distinguish stack overflows from segmentation faults", sigsegv); feature("GC Boehm garbage collector",usegc); feature("threads Render OpenGL in separate thread",usethreads); } bool getOption() { version(); features(1); features(0); exit(0); // Unreachable code. return true; } }; struct divisorOption : public option { divisorOption(string name, char code, string argname, string desc) : option(name, code, argname, desc) {} bool getOption() { try { #ifdef USEGC Int n=lexical::cast(optarg); if(n > 0) GC_set_free_space_divisor((GC_word) n); #endif } catch (lexical::bad_cast&) { error("option requires an int as an argument"); return false; } return true; } }; // For security reasons, these options aren't fields of the settings module. struct stringOption : public option { char **variable; stringOption(string name, char code, string argname, string desc, char **variable) : option(name, code, argname, desc, true), variable(variable) {} bool getOption() { *variable=optarg; return true; } }; string build_optstring() { string s; for (codeMap_t::iterator p=codeMap.begin(); p !=codeMap.end(); ++p) s +=p->second->optstring(); return s; } c_option *build_longopts() { size_t n=optionsMap.size(); c_option *longopts=new(UseGC) c_option[n+1]; Int i=0; for (optionsMap_t::iterator p=optionsMap.begin(); p !=optionsMap.end(); ++p, ++i) p->second->longopt(longopts[i]); longopts[n].name=NULL; longopts[n].has_arg=0; longopts[n].flag=NULL; longopts[n].val=0; return longopts; } void resetOptions() { for(optionsMap_t::iterator opt=optionsMap.begin(); opt != optionsMap.end(); ++opt) if(opt->first != "config" && opt->first != "dir" && opt->first != "sysdir") opt->second->reset(); } void getOptions(int argc, char *argv[]) { bool syntax=false; optind=0; string optstring=build_optstring(); //cerr << "optstring: " << optstring << endl; c_option *longopts=build_longopts(); int long_index = 0; errno=0; for(;;) { int c = getopt_long_only(argc,argv, optstring.c_str(), longopts, &long_index); if (c == -1) break; if (c == 0) { const char *name=longopts[long_index].name; //cerr << "long option: " << name << endl; if (!optionsMap[name]->getOption()) syntax=true; } else if (codeMap.find((char)c) != codeMap.end()) { //cerr << "char option: " << (char)c << endl; if (!codeMap[(char)c]->getOption()) syntax=true; } else { syntax=true; } errno=0; } if (syntax) reportSyntax(); } #ifdef USEGC void no_GCwarn(char *, GC_word) { } #endif array* stringArray(const char **s) { size_t count=0; while(s[count]) ++count; array *a=new array(count); for(size_t i=0; i < count; ++i) (*a)[i]=string(s[i]); return a; } void initSettings() { static bool initialize=true; if(initialize) { #if defined(_WIN32) queryRegistry(); #endif initialize=false; } settingsModule=new types::dummyRecord(symbol::literalTrans("settings")); // Default mouse bindings // LEFT: rotate // SHIFT LEFT: zoom // CTRL LEFT: shift // ALT LEFT: pan const char *leftbutton[]={"rotate","zoom","shift","pan",NULL}; // MIDDLE: const char *middlebutton[]={NULL}; // RIGHT: zoom // SHIFT RIGHT: rotateX // CTRL RIGHT: rotateY // ALT RIGHT: rotateZ const char *rightbutton[]={"zoom","rotateX","rotateY","rotateZ",NULL}; // WHEEL_UP: zoomin const char *wheelup[]={"zoomin",NULL}; // WHEEL_DOWN: zoomout const char *wheeldown[]={"zoomout",NULL}; addOption(new stringArraySetting("leftbutton", stringArray(leftbutton))); addOption(new stringArraySetting("middlebutton", stringArray(middlebutton))); addOption(new stringArraySetting("rightbutton", stringArray(rightbutton))); addOption(new stringArraySetting("wheelup", stringArray(wheelup))); addOption(new stringArraySetting("wheeldown", stringArray(wheeldown))); addOption(new stringArraySetting("suppress", new array)); addOption(new warnSetting("warn", 0, "str", "Enable warning")); multiOption *view=new multiOption("View", 'V', "View output"); view->add(new boolSetting("batchView", 0, "View output in batch mode", msdos)); view->add(new boolSetting("multipleView", 0, "View output from multiple batch-mode files", false)); view->add(new boolSetting("interactiveView", 0, "View output in interactive mode", true)); addOption(view); addOption(new stringSetting("outformat", 'f', "format", "Convert each output file to specified format", "")); addOption(new boolSetting("svgemulation", 0, "Emulate unimplemented SVG shading", true)); addOption(new boolSetting("prc", 0, "Embed 3D PRC graphics in PDF output", false)); addOption(new boolSetting("v3d", 0, "Embed 3D V3D graphics in PDF output", false)); addOption(new boolSetting("toolbar", 0, "Show 3D toolbar in PDF output", true)); addOption(new boolSetting("axes3", 0, "Show 3D axes in PDF output", true)); addOption(new boolSetting("ibl", 0, "Enable environment map image-based lighting", false)); addOption(new stringSetting("image", 0,"str","Environment image name","snowyField")); addOption(new stringSetting("imageDir", 0,"str","Environment image library directory","ibl")); addOption(new stringSetting("imageURL", 0,"str","Environment image library URL","https://vectorgraphics.gitlab.io/asymptote/ibl")); addOption(new realSetting("render", 0, "n", "Render 3D graphics using n pixels per bp (-1=auto)", havegl ? -1.0 : 0.0)); addOption(new realSetting("devicepixelratio", 0, "n", "Ratio of physical to logical pixels", 1.0)); addOption(new IntSetting("antialias", 0, "n", "Antialiasing width for rasterized output", 2)); addOption(new IntSetting("multisample", 0, "n", "Multisampling width for screen images", 4)); addOption(new boolSetting("twosided", 0, "Use two-sided 3D lighting model for rendering", true)); addOption(new boolSetting("GPUindexing", 0, "Compute indexing partial sums on GPU", true)); addOption(new boolSetting("GPUinterlock", 0, "Use fragment shader interlock", true)); addOption(new boolSetting("GPUcompress", 0, "Compress GPU transparent fragment counts", false)); addOption(new IntSetting("GPUlocalSize", 0, "n", "Compute shader local size", 256)); addOption(new IntSetting("GPUblockSize", 0, "n", "Compute shader block size", 8)); addOption(new pairSetting("position", 0, "pair", "Initial 3D rendering screen position")); addOption(new pairSetting("maxviewport", 0, "pair", "Maximum viewport size",pair(0,0))); addOption(new pairSetting("viewportmargin", 0, "pair", "Horizontal and vertical 3D viewport margin", pair(0.5,0.5))); addOption(new boolSetting("webgl2", 0, "Use webgl2 if available", false)); addOption(new boolSetting("absolute", 0, "Use absolute WebGL dimensions", false)); addOption(new pairSetting("maxtile", 0, "pair", "Maximum rendering tile size",pair(1024,768))); addOption(new boolSetting("iconify", 0, "Iconify rendering window", false)); addOption(new boolSetting("thick", 0, "Render thick 3D lines", true)); addOption(new boolSetting("thin", 0, "Render thin 3D lines", true)); addOption(new boolSetting("autobillboard", 0, "3D labels always face viewer by default", true)); addOption(new boolSetting("threads", 0, "Use POSIX threads for 3D rendering", true)); addOption(new boolSetting("fitscreen", 0, "Fit rendered image to screen", true)); addOption(new boolSetting("interactiveWrite", 0, "Write expressions entered at the prompt to stdout", true)); addOption(new helpOption("help", 'h', "Show summary of options")); addOption(new helpOption("environment", 'e', "Show summary of environment settings")); addOption(new versionOption("version", 0, "Show version")); addOption(new pairSetting("offset", 'O', "pair", "PostScript offset")); addOption(new pairSetting("aligndir", 0, "pair", "Directional page alignment (overrides align)")); addOption(new alignSetting("align", 'a', "C|B|T|Z", "Center, Bottom, Top, or Zero page alignment", "C")); addOption(new boolrefSetting("debug", 'd', "Enable debugging messages and traceback",&debug)); addOption(new incrementSetting("verbose", 'v', "Increase verbosity level (can specify multiple times)", &verbose)); // Resolve ambiguity with --version addOption(new incrementOption("vv", 0,"", &verbose,2)); addOption(new incrementOption("novv", 0,"", &verbose,-2)); addOption(new boolSetting("keep", 'k', "Keep intermediate files")); addOption(new boolSetting("keepaux", 0, "Keep intermediate LaTeX .aux files")); addOption(new engineSetting("tex", 0, "engine", "latex|pdflatex|xelatex|lualatex|tex|pdftex|luatex|context|none", "latex")); addOption(new boolSetting("twice", 0, "Run LaTeX twice (to resolve references)")); addOption(new boolSetting("inlinetex", 0, "Generate inline TeX code")); addOption(new boolSetting("embed", 0, "Embed rendered preview image", true)); addOption(new boolSetting("auto3D", 0, "Automatically activate 3D scene", true)); addOption(new boolSetting("autoplay", 0, "Autoplay 3D animations", false)); addOption(new boolSetting("loop", 0, "Loop 3D animations", false)); addOption(new boolSetting("interrupt", 0, "", false)); addOption(new boolSetting("animating", 0, "", false)); addOption(new boolSetting("reverse", 0, "reverse 3D animations", false)); addOption(new boolSetting("inlineimage", 0, "Generate inline embedded image")); addOption(new boolSetting("compress", 0, "Compress images in PDF output", true)); addOption(new boolSetting("parseonly", 'p', "Parse file")); addOption(new boolSetting("translate", 's', "Show translated virtual machine code")); addOption(new boolSetting("tabcompletion", 0, "Interactive prompt auto-completion", true)); addOption(new realSetting("prerender", 0, "resolution", "Prerender V3D objects (0 implies vector output)", 0)); addOption(new boolSetting("lossy", 0, "Use single precision for V3D reals", false)); addOption(new boolSetting("listvariables", 'l', "List available global functions and variables")); addOption(new boolSetting("where", 0, "Show where listed variables are declared")); multiOption *mask=new multiOption("mask", 'm', "Mask fpu exceptions"); mask->add(new boolSetting("batchMask", 0, "Mask fpu exceptions in batch mode", false)); mask->add(new boolSetting("interactiveMask", 0, "Mask fpu exceptions in interactive mode", true)); addOption(mask); addOption(new boolrefSetting("bw", 0, "Convert all colors to black and white",&bw)); addOption(new boolrefSetting("gray", 0, "Convert all colors to grayscale", &gray)); addOption(new boolrefSetting("rgb", 0, "Convert cmyk colors to rgb",&rgb)); addOption(new boolrefSetting("cmyk", 0, "Convert rgb colors to cmyk",&cmyk)); addSecureSetting(new boolrefSetting("safe", 0, "Disable system call", &safe, true)); addSecureSetting(new boolrefSetting("globalwrite", 0, "Allow write to other directory", &globalWrite, false)); addSecureSetting(new boolrefSetting("globalread", 0, "Allow read from other directory", &globalRead, true)); addSecureSetting(new stringSetting("outname", 'o', "name", "Alternative output directory/file prefix")); addOption(new stringOption("cd", 0, "directory", "Set current directory", &startpath)); addOption(new compactSetting("compact", 0, "Conserve memory at the expense of speed", &compact)); addOption(new divisorOption("divisor", 0, "n", "Garbage collect using purge(divisor=n) [2]")); addOption(new stringSetting("prompt", 0,"str","Prompt","> ")); addOption(new stringSetting("prompt2", 0,"str", "Continuation prompt for multiline input ", "..")); addOption(new boolSetting("multiline", 0, "Input code over multiple lines at the prompt")); addOption(new boolrefSetting("xasy", 0, "Interactive mode for xasy",&xasy)); addOption(new boolrefSetting("keys", 0, "Generate WebGL keys",&keys)); addOption(new boolSetting("lsp", 0, "Interactive mode for the Language Server Protocol")); addOption(new envSetting("lspport", "")); addOption(new envSetting("lsphost", "127.0.0.1")); addOption(new boolSetting("wsl", 0, "Run asy under the Windows Subsystem for Linux")); addOption(new boolSetting("wait", 0, "Wait for child processes to finish before exiting")); addOption(new IntSetting("inpipe", 0, "n","Input pipe",-1)); addOption(new IntSetting("outpipe", 0, "n","Output pipe",-1)); addOption(new boolSetting("exitonEOF", 0, "Exit interactive mode on EOF", true)); addOption(new boolSetting("quiet", 'q', "Suppress welcome text and noninteractive stdout")); addOption(new boolSetting("localhistory", 0, "Use a local interactive history file")); addOption(new IntSetting("historylines", 0, "n", "Retain n lines of history",1000)); addOption(new IntSetting("scroll", 0, "n", "Scroll standard output n lines at a time",0)); addOption(new IntSetting("level", 0, "n", "Postscript level",3)); addOption(new boolSetting("autoplain", 0, "Enable automatic importing of plain", true)); addOption(new boolSetting("autorotate", 0, "Enable automatic PDF page rotation", false)); addOption(new boolSetting("offline", 0, "Produce offline html files",false)); addOption(new boolSetting("pdfreload", 0, "Automatically reload document in pdfviewer", false)); addOption(new IntSetting("pdfreloaddelay", 0, "usec", "Delay before attempting initial pdf reload" ,750000)); addOption(new stringSetting("autoimport", 0, "str", "Module to automatically import")); addOption(new userSetting("command", 'c', "str", "Command to autoexecute")); addOption(new userSetting("user", 'u', "str", "General purpose user string")); addOption(new realSetting("zoomfactor", 0, "factor", "Zoom step factor", 1.05)); addOption(new realSetting("zoomPinchFactor", 0, "n", "WebGL zoom pinch sensitivity", 10)); addOption(new realSetting("zoomPinchCap", 0, "limit", "WebGL maximum zoom pinch", 100)); addOption(new realSetting("zoomstep", 0, "step", "Mouse motion zoom step", 0.1)); addOption(new realSetting("shiftHoldDistance", 0, "n", "WebGL touch screen distance limit for shift mode", 20)); addOption(new realSetting("shiftWaitTime", 0, "ms", "WebGL touch screen shift mode delay", 200)); addOption(new realSetting("vibrateTime", 0, "ms", "WebGL shift mode vibrate duration", 25)); addOption(new realSetting("spinstep", 0, "deg/s", "Spin speed", 60.0)); addOption(new realSetting("framerate", 0, "frames/s", "Animation speed", 30.0)); addOption(new realSetting("resizestep", 0, "step", "Resize step", 1.2)); addOption(new IntSetting("digits", 0, "n", "Default output file precision", 7)); addOption(new realSetting("paperwidth", 0, "bp", "Default page width")); addOption(new realSetting("paperheight", 0, "bp", "Default page height")); addOption(new stringSetting("dvipsOptions", 0, "str", "")); addOption(new stringSetting("dvisvgmOptions", 0, "str", "", "--optimize")); addOption(new boolSetting("dvisvgmMultipleFiles", 0, "dvisvgm supports multiple files", true)); addOption(new stringSetting("convertOptions", 0, "str", "")); addOption(new stringSetting("gsOptions", 0, "str", "")); addOption(new stringSetting("htmlviewerOptions", 0, "str", "")); addOption(new stringSetting("psviewerOptions", 0, "str", "")); addOption(new stringSetting("pdfviewerOptions", 0, "str", "")); addOption(new stringSetting("pdfreloadOptions", 0, "str", "")); addOption(new stringSetting("glOptions", 0, "str", "")); addOption(new stringSetting("hyperrefOptions", 0, "str", "","setpagesize=false,unicode,pdfborder=0 0 0")); addOption(new envSetting("config","config."+suffix)); addOption(new envSetting("htmlviewer", defaultHTMLViewer)); addOption(new envSetting("pdfviewer", defaultPDFViewer)); addOption(new envSetting("psviewer", defaultPSViewer)); addOption(new envSetting("gs", defaultGhostscript)); addOption(new envSetting("libgs", defaultGhostscriptLibrary)); addOption(new envSetting("epsdriver", defaultEPSdriver)); addOption(new envSetting("psdriver", defaultPSdriver)); addOption(new envSetting("pngdriver", defaultPNGdriver)); addOption(new envSetting("asygl", defaultAsyGL)); addOption(new envSetting("texpath", "")); addOption(new envSetting("texcommand", "")); addOption(new envSetting("dvips", "dvips")); addOption(new envSetting("dvisvgm", "dvisvgm")); addOption(new envSetting("convert", "magick")); addOption(new envSetting("display", defaultDisplay)); addOption(new envSetting("animate", defaultAnimate)); addOption(new envSetting("papertype", "letter")); addOption(new envSetting("dir", "")); addOption(new envSetting("sysdir", systemDir)); addOption(new envSetting("textcommand","groff")); addOption(new envSetting("textcommandOptions","-e -P -b16")); addOption(new envSetting("textextension", "roff")); addOption(new envSetting("textoutformat", "ps")); addOption(new envSetting("textprologue", ".EQ\ndelim $$\n.EN")); addOption(new envSetting("textinitialfont", ".fam T\n.ps 12")); addOption(new envSetting("textepilogue", ".bp")); } // Access the arguments once options have been parsed. int numArgs() { return argCount; } char *getArg(int n) { return argList[n]; } void setInteractive() { if(xasy && getSetting("outpipe") < 0) { cerr << "Missing outpipe." << endl; exit(-1); } bool lspmode=getSetting("lsp"); if(numArgs() == 0 && !getSetting("listvariables") && getSetting("command").empty() && (isatty(STDIN_FILENO) || xasy || lspmode)) interact::interactive=true; if(getSetting("localhistory")) historyname=string(getPath())+dirsep+"."+suffix+"_history"; else { #if defined(_WIN32) bool mkdirResult = CreateDirectoryA(initdir.c_str(), nullptr); bool mkdirSuccess = mkdirResult || GetLastError() == ERROR_ALREADY_EXISTS; #else int mkdirResult = mkdir(initdir.c_str(),0777); bool mkdirSuccess = mkdirResult == 0 || errno == EEXIST; #endif if(!mkdirSuccess) cerr << "failed to create directory "+initdir+"." << endl; historyname=initdir+"/history"; } if(!quiet && verbose > 1) cerr << "Using history " << historyname << endl; } bool view() { if (interact::interactive) return getSetting("interactiveView"); else return getSetting("batchView") && (numArgs() == 1 || getSetting("multipleView")); } bool trap() { if (interact::interactive) return !getSetting("interactiveMask"); else return !getSetting("batchMask"); } string outname() { string name=getSetting("outname"); if(name.empty() && interact::interactive) return standardprefix; if(msdos) backslashToSlash(name); return name; } string lookup(const string& symbol) { string s; mem::vector cmd; string kpsewhich="kpsewhich"; string fullname=stripFile(argv0)+kpsewhich; std::ifstream exists(fullname.c_str()); if(!exists) fullname=kpsewhich; cmd.push_back(fullname); cmd.push_back("--var-value="+symbol); iopipestream pipe(cmd); pipe >> s; size_t n=s.find('\r'); if(n != string::npos) s.erase(n,1); n=s.find('\n'); if(n != string::npos) s.erase(n,1); return s; } void initDir() { if(getSetting("sysdir").empty()) { string s=lookup("TEXMFMAIN"); if(s.size() > 1) { string texmf=s+dirsep; docdir=texmf+"doc"+dirsep+"asymptote"; Setting("sysdir")=texmf+"asymptote"; s=lookup("ASYMPTOTE_HOME"); if(s.size() > 1) initdir=s; } } if(initdir.empty()) initdir=Getenv("ASYMPTOTE_HOME",msdos); if(initdir.empty()) initdir=Getenv(HOME.c_str(),msdos)+dirsep+"."+suffix; #if defined(_WIN32) DWORD dirAttrib = GetFileAttributesA(initdir.c_str()); bool dirExists = dirAttrib != INVALID_FILE_ATTRIBUTES && ((dirAttrib & FILE_ATTRIBUTE_DIRECTORY) != 0); #else bool dirExists = access(initdir.c_str(),F_OK) == 0; #endif if(dirExists) { if(!quiet && verbose > 1) cerr << "Using configuration directory " << initdir << endl; } } void setPath() { searchPath.clear(); searchPath.push_back("."); string asydir=getSetting("dir"); if(asydir != "") { size_t p,i=0; while((p=asydir.find(pathSeparator,i)) < string::npos) { if(p > i) searchPath.push_back(asydir.substr(i,p-i)); i=p+1; } if(i < asydir.length()) searchPath.push_back(asydir.substr(i)); } #if defined(_WIN32) DWORD dirAttrib = GetFileAttributesA(initdir.c_str()); bool dirExists = dirAttrib != INVALID_FILE_ATTRIBUTES && ((dirAttrib & FILE_ATTRIBUTE_DIRECTORY) != 0); #else bool dirExists = access(initdir.c_str(),F_OK) == 0; #endif if(dirExists) searchPath.push_back(initdir); string sysdir=getSetting("sysdir"); if(sysdir != "") searchPath.push_back(sysdir); searchPath.push_back(docdir+"/examples"); } void SetPageDimensions() { string paperType=getSetting("papertype"); if(paperType.empty() && getSetting("paperwidth") != 0.0 && getSetting("paperheight") != 0.0) return; if(paperType == "letter") { Setting("paperwidth")=8.5*inches; Setting("paperheight")=11.0*inches; } else { Setting("paperwidth")=21.0*cm; Setting("paperheight")=29.7*cm; if(paperType != "a4") { cerr << "Unknown paper size \'" << paperType << "\'; assuming a4." << endl; Setting("papertype")=string("a4"); } } } bool xe(const string& texengine) { return texengine == "xelatex"; } bool lua(const string& texengine) { return texengine == "luatex" || texengine == "lualatex"; } bool context(const string& texengine) { return texengine == "context"; } bool pdf(const string& texengine) { return texengine == "pdflatex" || texengine == "pdftex" || xe(texengine) || lua(texengine) || context(texengine); } bool latex(const string& texengine) { return texengine == "latex" || texengine == "pdflatex" || texengine == "xelatex" || texengine == "lualatex"; } string nativeformat() { return pdf(getSetting("tex")) ? "pdf" : "eps"; } string defaultformat() { string format=getSetting("outformat"); return (format.empty()) ? nativeformat() : format; } // TeX special command to set up currentmatrix for typesetting labels. const char *beginlabel(const string& texengine) { if(pdf(texengine)) return xe(texengine) ? "\\special{pdf:literal q #5 0 0 cm}" : "\\special{pdf:q #5 0 0 cm}"; else return "\\special{ps:gsave currentpoint currentpoint translate [#5 0 0] " "concat neg exch neg exch translate}"; } // TeX special command to restore currentmatrix after typesetting labels. const char *endlabel(const string& texengine) { if(pdf(texengine)) return xe(texengine) ? "\\special{pdf:literal Q}" : "\\special{pdf:Q}"; else return "\\special{ps:currentpoint grestore moveto}"; } // TeX macro to typeset raw postscript code const char *rawpostscript(const string& texengine) { if(pdf(texengine)) return "\\def\\ASYraw#1{#1}"; else return "\\def\\ASYraw#1{\n" "currentpoint currentpoint translate matrix currentmatrix\n" "100 12 div -100 12 div scale\n" "#1\n" "setmatrix neg exch neg exch translate}"; } // TeX macro to begin picture const char *beginpicture(const string& texengine) { if(latex(texengine)) return "\\begin{picture}"; if(context(texengine)) return ""; else return "\\picture"; } // TeX macro to end picture const char *endpicture(const string& texengine) { if(latex(texengine)) return "\\end{picture}%"; else if(context(texengine)) return "%"; else return "\\endpicture%"; } // TeX macro to begin new page. const char *newpage(const string& texengine) { if(latex(texengine)) return "\\newpage"; else if(context(texengine)) return "}\\page\\hbox{%"; else return "\\eject"; } // Begin TeX special command. const char *beginspecial(const string& texengine) { if(pdf(texengine)) return xe(texengine) ? "\\special{pdf:literal " : "\\special{pdf:"; else return "\\special{ps:"; } // End TeX special command. const char *endspecial() { return "}%"; } string texcommand() { string command=getSetting("texcommand"); return command.empty() ? getSetting("tex") : command; } string texprogram() { string path=getSetting("texpath"); string engine=texcommand(); return path.empty() ? engine : (string) (path+"/"+engine); } Int getScroll() { Int scroll=settings::getSetting("scroll"); if(scroll < 0) { #ifdef HAVE_LIBCURSES static char *terminal=NULL; if(!terminal) terminal=getenv("TERM"); if(terminal) { #if defined(USE_SETUPTERM) int error=setupterm(terminal,1,&error); if(error == 0) scroll=lines > 2 ? lines-1 : 1; else #endif scroll=0; } else scroll=0; #else scroll=0; #endif } return scroll; } void doConfig(string file) { bool autoplain=getSetting("autoplain"); bool listvariables=getSetting("listvariables"); if(autoplain) Setting("autoplain")=false; // Turn off for speed. if(listvariables) Setting("listvariables")=false; runFile(file); if(autoplain) Setting("autoplain")=true; if(listvariables) Setting("listvariables")=true; } void setOptions(int argc, char *argv[]) { argv0=argv[0]; cout.precision(DBL_DIG); // Build settings module. initSettings(); // Read command-line options initially to obtain config, dir, sysdir, // verbose, and quiet. getOptions(argc,argv); quiet=getSetting("quiet"); // Make configuration and history directory initDir(); Int Verbose=verbose; string sysdir=getSetting("sysdir"); resetOptions(); // Read user configuration file. setPath(); string filename=getSetting("config"); if(!filename.empty()) { string file=locateFile(filename); if(!file.empty()) { if(!quiet && Verbose > 1) cerr << "Loading " << filename << " from " << file << endl; doConfig(file); } } // Read command-line options again to override configuration file defaults. getOptions(argc,argv); if(getSetting("outpipe") == 2) // Redirect cerr to cout std::cerr.rdbuf(std::cout.rdbuf()); Setting("sysdir")=sysdir; if(docdir.empty()) docdir=getSetting("dir"); #ifdef USEGC if(verbose == 0 && !debug) GC_set_warn_proc(no_GCwarn); #endif if(setlocale (LC_ALL, "") == NULL && debug) perror("setlocale"); // Set variables for the file arguments. argCount = argc - optind; argList = argv + optind; // Recompute search path. setPath(); if(getSetting("paperwidth") != 0.0 && getSetting("paperheight") != 0.0) Setting("papertype")=string(""); SetPageDimensions(); setInteractive(); } } asymptote-3.05/runtimebase.in0000644000000000000000000000247515031566105015044 0ustar rootroot/***** * runtimebase.in * Andy Hammerlindl 2009/07/28 * * Common declarations needed for all code-generating .in files. * *****/ // Basic types need by almost all .in files. // Use Void f() instead of void f() to force an explicit Stack argument. void => primVoid() Void => primVoid() Int => primInt() bool => primBoolean() double => primReal() real => primReal() string* => primString() string => primString() #include "stack.h" #include "types.h" #include "builtin.h" #include "entry.h" #include "errormsg.h" #include "array.h" #include "triple.h" #include "callable.h" #include "opsymbols.h" using vm::stack; using vm::error; using vm::array; using vm::read; using vm::callable; using types::formal; using types::function; using camp::triple; #define PRIMITIVE(name,Name,asyName) using types::prim##Name; #include #undef PRIMITIVE void unused(void *); namespace run { typedef double real; array *copyArray(array *a); array *copyArray2(array *a); array *copyArray3(array *a); double *copyTripleArray2Components(array *a, size_t &N, GCPlacement placement=NoGC); triple *copyTripleArray2C(array *a, size_t &N, GCPlacement placement=NoGC); } function *realRealFunction(); #define CURRENTPEN processData().currentpen asymptote-3.05/fpu.h0000644000000000000000000000121615031566105013131 0ustar rootroot#ifndef FPU_H #define FPU_H #ifdef __GNU_VISIBLE #undef __GNU_VISIBLE #define __GNU_VISIBLE 1 #endif #include "common.h" #ifdef HAVE_FEENABLEEXCEPT #include inline int fpu_exceptions() { int excepts=0; #ifdef FE_INVALID excepts |= FE_INVALID; #endif #ifdef FE_DIVBYZERO excepts |= FE_DIVBYZERO; #endif #ifdef FE_OVERFLOW excepts |= FE_OVERFLOW; #endif return excepts; } inline void fpu_trap(bool trap=true) { // Conditionally trap FPU exceptions on NaN, zero divide and overflow. if(trap) feenableexcept(fpu_exceptions()); else fedisableexcept(fpu_exceptions()); } #else inline void fpu_trap(bool=true) {} #endif #endif asymptote-3.05/LICENSE.LESSER0000644000000000000000000001672715031566105014204 0ustar rootroot GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. asymptote-3.05/abs3doutfile.h0000644000000000000000000000433115031566105014724 0ustar rootroot#ifndef ABS3DOUTFILE_H #define ABS3DOUTFILE_H #include "common.h" #include "triple.h" #include "prcfile.h" #include "material.h" namespace camp { inline bool distinct(const uint32_t *I, const uint32_t *J) { return I[0] != J[0] || I[1] != J[1] || I[2] != J[2]; } class abs3Doutfile : public gc { protected: bool singleprecision; string KEY; public: abs3Doutfile(bool singleprecision=false) : singleprecision(singleprecision), KEY("") {} virtual ~abs3Doutfile()=default; void setKEY(const string& KEY) {this->KEY=KEY;} virtual void close()=0; virtual void addPatch(triple const* controls, prc::RGBAColour const* c)=0; virtual void addStraightPatch( triple const* controls, prc::RGBAColour const* c)=0; virtual void addBezierTriangle( triple const* controls, prc::RGBAColour const* c)=0; virtual void addStraightBezierTriangle( triple const* controls, prc::RGBAColour const* c)=0; #ifdef HAVE_LIBGLM virtual void addMaterial(Material const& mat)=0; #endif virtual void addSphere(triple const& center, double radius)=0; virtual void addHemisphere(triple const& center, double radius, double const& polar, double const& azimuth)=0; virtual void addCylinder(triple const& center, double radius, double height, double const& polar, const double& azimuth, bool core)=0; virtual void addDisk(triple const& center, double radius, double const& polar, const double& azimuth)=0; virtual void addTube(const triple* g, double width, bool core)=0; virtual void addTriangles(size_t nP, const triple* P, size_t nN, const triple* N, size_t nC, const prc::RGBAColour* C, size_t nI, const uint32_t (* PI)[3], const uint32_t (* NI)[3], const uint32_t (* CI)[3])=0; virtual void addCurve(const triple& z0, const triple& c0, const triple& c1, const triple& z1)=0; virtual void addCurve(const triple& z0, const triple& z1)=0; virtual void addPixel(const triple& z0, double width)=0; virtual void precision(int digits)=0; }; } #endif asymptote-3.05/runarray.cc0000644000000000000000000022600315031566132014343 0ustar rootroot/***** Autogenerated from runarray.in; changes will be overwritten *****/ #line 1 "./runtimebase.in" /***** * runtimebase.in * Andy Hammerlindl 2009/07/28 * * Common declarations needed for all code-generating .in files. * *****/ #line 1 "./runarray.in" /***** * runarray.in * * Runtime functions for array operations. * *****/ #line 23 "./runtimebase.in" #include "stack.h" #include "types.h" #include "builtin.h" #include "entry.h" #include "errormsg.h" #include "array.h" #include "triple.h" #include "callable.h" #include "opsymbols.h" using vm::stack; using vm::error; using vm::array; using vm::read; using vm::callable; using types::formal; using types::function; using camp::triple; #define PRIMITIVE(name,Name,asyName) using types::prim##Name; #include #undef PRIMITIVE void unused(void *); namespace run { typedef double real; array *copyArray(array *a); array *copyArray2(array *a); array *copyArray3(array *a); double *copyTripleArray2Components(array *a, size_t &N, GCPlacement placement=NoGC); triple *copyTripleArray2C(array *a, size_t &N, GCPlacement placement=NoGC); } function *realRealFunction(); #define CURRENTPEN processData().currentpen #line 23 "runarray.in" #include "array.h" #include "arrayop.h" #include "triple.h" #include "path3.h" #include "Delaunay.h" #include "glrender.h" #ifdef HAVE_LIBFFTW3 #include "fftw++.h" static const char *rectangular="matrix must be rectangular"; #else static const char *installFFTW= "Please install fftw3, then ./configure; make"; #endif #ifdef HAVE_EIGEN_DENSE #include typedef std::complex Complex; static const char *square="matrix must be square"; using Eigen::MatrixXd; using Eigen::MatrixXcd; using Eigen::RealSchur; using Eigen::ComplexSchur; #else static const char *installEIGEN= "Please install eigen3, then ./configure; make"; #endif using namespace camp; using namespace vm; namespace run { extern pair zero; } typedef array boolarray; typedef array Intarray; typedef array Intarray2; typedef array realarray; typedef array realarray2; typedef array realarray3; typedef array pairarray; typedef array pairarray2; typedef array pairarray3; typedef array triplearray2; using types::booleanArray; using types::IntArray; using types::IntArray2; using types::realArray; using types::realArray2; using types::realArray3; using types::pairArray; using types::pairArray2; using types::pairArray3; using types::tripleArray2; typedef callable callableReal; void outOfBounds(const char *op, size_t len, Int n) { ostringstream buf; buf << op << " array of length " << len << " with out-of-bounds index " << n; error(buf); } inline item& arrayRead(array *a, Int n) { size_t len=checkArray(a); bool cyclic=a->cyclic(); if(cyclic && len > 0) n=imod(n,len); else if(n < 0 || n >= (Int) len) outOfBounds("reading",len,n); return (*a)[(unsigned) n]; } // Helper function to create deep arrays. static array* deepArray(Int depth, Int *dims) { assert(depth > 0); if (depth == 1) { return new array(dims[0]); } else { Int length = dims[0]; depth--; dims++; array *a = new array(length); for (Int index = 0; index < length; index++) { (*a)[index] = deepArray(depth, dims); } return a; } } namespace run { array *Identity(Int n) { size_t N=(size_t) n; array *c=new array(N); for(size_t i=0; i < N; ++i) { array *ci=new array(N); (*c)[i]=ci; for(size_t j=0; j < N; ++j) (*ci)[j]=0.0; (*ci)[i]=1.0; } return c; } } static const char *incommensurate="Incommensurate matrices"; static const char *singular="Singular matrix"; static const char *invalidarraylength="Invalid array length: "; static size_t *pivot,*Row,*Col; bound_double *bounddouble(int N) { if(N == 16) return bound; if(N == 10) return boundtri; ostringstream buf; buf << invalidarraylength << " " << N; error(buf); return NULL; } bound_triple *boundtriple(int N) { if(N == 16) return bound; if(N == 10) return boundtri; ostringstream buf; buf << invalidarraylength << " " << N; error(buf); return NULL; } static inline void inverseAllocate(size_t n) { pivot=new size_t[n]; Row=new size_t[n]; Col=new size_t[n]; } static inline void inverseDeallocate() { delete[] pivot; delete[] Row; delete[] Col; } namespace run { array *copyArray(array *a) { size_t size=checkArray(a); array *c=new array(size); for(size_t i=0; i < size; i++) (*c)[i]=(*a)[i]; return c; } array *copyArray2(array *a) { size_t size=checkArray(a); array *c=new array(size); for(size_t i=0; i < size; i++) { array *ai=read(a,i); size_t aisize=checkArray(ai); array *ci=new array(aisize); (*c)[i]=ci; for(size_t j=0; j < aisize; j++) (*ci)[j]=(*ai)[j]; } return c; } double *copyTripleArray2Components(array *a, size_t &N, GCPlacement placement) { size_t n=checkArray(a); N=0; for(size_t i=0; i < n; i++) N += checkArray(read(a,i)); double *A=(placement == NoGC) ? new double [3*N] : new(placement) double[3*N]; double *p=A; for(size_t i=0; i < n; i++) { array *ai=read(a,i); size_t m=checkArray(ai); for(size_t j=0; j < m; j++) { triple v=read(ai,j); *p=v.getx(); *(p+N)=v.gety(); *(p+2*N)=v.getz(); ++p; } } return A; } triple *copyTripleArray2C(array *a, size_t &N, GCPlacement placement) { size_t n=checkArray(a); N=0; for(size_t i=0; i < n; i++) N += checkArray(read(a,i)); triple *A=(placement == NoGC) ? new triple [N] : new(placement) triple[N]; triple *p=A; for(size_t i=0; i < n; i++) { array *ai=read(a,i); size_t m=checkArray(ai); for(size_t j=0; j < m; j++) *(p++)=read(ai,j); } return A; } triple operator *(const array& t, const triple& v) { size_t n=checkArray(&t); if(n != 4) error(incommensurate); array *t0=read(t,0); array *t1=read(t,1); array *t2=read(t,2); array *t3=read(t,3); if(checkArray(t0) != 4 || checkArray(t1) != 4 || checkArray(t2) != 4 || checkArray(t3) != 4) error(incommensurate); double x=v.getx(); double y=v.gety(); double z=v.getz(); double f=read(t3,0)*x+read(t3,1)*y+read(t3,2)*z+ read(t3,3); if(f == 0.0) run::dividebyzero(); f=1.0/f; return triple((read(t0,0)*x+read(t0,1)*y+read(t0,2)*z+ read(t0,3))*f, (read(t1,0)*x+read(t1,1)*y+read(t1,2)*z+ read(t1,3))*f, (read(t2,0)*x+read(t2,1)*y+read(t2,2)*z+ read(t2,3))*f); } template array *mult(array *a, array *b) { size_t n=checkArray(a); size_t nb=checkArray(b); size_t na0=n == 0 ? 0 : checkArray(read(a,0)); if(na0 != nb) error(incommensurate); size_t nb0=nb == 0 ? 0 : checkArray(read(b,0)); array *c=new array(n); T *A,*B; copyArray2C(A,a,false); copyArray2C(B,b,false); for(size_t i=0; i < n; ++i) { T *Ai=A+i*nb; array *ci=new array(nb0); (*c)[i]=ci; for(size_t j=0; j < nb0; ++j) { T sum=T(); size_t kj=j; for(size_t k=0; k < nb; ++k, kj += nb0) sum += Ai[k]*B[kj]; (*ci)[j]=sum; } } delete[] B; delete[] A; return c; } // Compute transpose(A)*A where A is an n x m matrix. template array *AtA(array *a) { size_t n=checkArray(a); size_t m=n == 0 ? 0 : checkArray(read(a,0)); array *c=new array(m); T *A; copyArray2C(A,a,false); for(size_t i=0; i < m; ++i) { array *ci=new array(m); (*c)[i]=ci; for(size_t j=0; j < m; ++j) { T sum=T(); size_t kj=j; size_t ki=i; for(size_t k=0; k < n; ++k, kj += m, ki += m) sum += A[ki]*A[kj]; (*ci)[j]=sum; } } delete[] A; return c; } double norm(double *a, size_t n) { if(n == 0) return 0.0; double M=fabs(a[0]); for(size_t i=1; i < n; ++i) M=::max(M,fabs(a[i])); return M; } double norm(triple *a, size_t n) { if(n == 0) return 0.0; double M=a[0].abs2(); for(size_t i=1; i < n; ++i) M=::max(M,a[i].abs2()); return sqrt(M); } // Transpose an n x n matrix in place. void transpose(double *a, size_t n) { for(size_t i=1; i < n; i++) { for(size_t j=0; j < i; j++) { size_t ij=n*i+j; size_t ji=n*j+i; double temp=a[ij]; a[ij]=a[ji]; a[ji]=temp; } } } // Invert an n x n array in place. void inverse(double *M, size_t n) { if(n == 2) { real a=M[0]; real b=M[1]; real c=M[2]; real d=M[3]; real det=a*d-b*c; if(det == 0.0) error(singular); det=1.0/det; M[0]=d*det; M[1]=-b*det; M[2]=-c*det; M[3]=a*det; return; } if(n == 3) { real a=M[0], b=M[1], c=M[2]; real d=M[3], e=M[4], f=M[5]; real g=M[6], h=M[7], i=M[8]; real A=e*i-f*h; real B=f*g-d*i; real C=d*h-e*g; real det=a*A+b*B+c*C; if(det == 0.0) error(singular); det=1.0/det; M[0]=A*det; M[1]=(c*h-b*i)*det; M[2]=(b*f-c*e)*det; M[3]=B*det; M[4]=(a*i-c*g)*det; M[5]=(c*d-a*f)*det; M[6]=C*det; M[7]=(b*g-a*h)*det; M[8]=(a*e-b*d)*det; return; } inverseAllocate(n); for(size_t i=0; i < n; i++) pivot[i]=0; size_t col=0, row=0; // This is the main loop over the columns to be reduced. for(size_t i=0; i < n; i++) { real big=0.0; // This is the outer loop of the search for a pivot element. for(size_t j=0; j < n; j++) { double *aj=M+n*j; if(pivot[j] != 1) { for(size_t k=0; k < n; k++) { if(pivot[k] == 0) { real temp=fabs(aj[k]); if(temp >= big) { big=temp; row=j; col=k; } } else if(pivot[k] > 1) { inverseDeallocate(); error(singular); } } } } ++(pivot[col]); // Interchange rows, if needed, to put the pivot element on the diagonal. double *acol=M+n*col; if(row != col) { double *arow=M+n*row; for(size_t k=0; k < n; k++) { real temp=arow[k]; arow[k]=acol[k]; acol[k]=temp; } } Row[i]=row; Col[i]=col; // Divide the pivot row by the pivot element. real denom=acol[col]; if(denom == 0.0) { inverseDeallocate(); error(singular); } real pivinv=1.0/denom; acol[col]=1.0; for(size_t k=0; k < n; k++) acol[k]=acol[k]*pivinv; // Reduce all rows except for the pivoted one. for(size_t k=0; k < n; k++) { if(k != col) { double *ak=M+n*k; real akcol=ak[col]; ak[col]=0.0; for(size_t j=0; j < n; j++) ak[j] -= acol[j]*akcol; } } } // Unscramble the inverse matrix in view of the column interchanges. for(size_t k=n; k > 0;) { k--; size_t r=Row[k]; size_t c=Col[k]; if(r != c) { for(size_t j=0; j < n; j++) { double *aj=M+n*j; real temp=aj[r]; aj[r]=aj[c]; aj[c]=temp; } } } inverseDeallocate(); } } callable *Func; stack *FuncStack; double wrapFunction(double x) { FuncStack->push(x); Func->call(FuncStack); return pop(FuncStack); } callable *compareFunc; bool compareFunction(const vm::item& i, const vm::item& j) { FuncStack->push(i); FuncStack->push(j); compareFunc->call(FuncStack); return pop(FuncStack); } // Crout's algorithm for computing the LU decomposition of a square matrix. // cf. routine ludcmp (Press et al., Numerical Recipes, 1991). Int LUdecompose(double *a, size_t n, size_t* index, bool warn=true) { double *vv=new double[n]; Int swap=1; for(size_t i=0; i < n; ++i) { double big=0.0; double *ai=a+i*n; for(size_t j=0; j < n; ++j) { double temp=fabs(ai[j]); if(temp > big) big=temp; } if(big == 0.0) { delete[] vv; if(warn) error(singular); else return 0; } vv[i]=1.0/big; } for(size_t j=0; j < n; ++j) { for(size_t i=0; i < j; ++i) { double *ai=a+i*n; double sum=ai[j]; for(size_t k=0; k < i; ++k) { sum -= ai[k]*a[k*n+j]; } ai[j]=sum; } double big=0.0; size_t imax=j; for(size_t i=j; i < n; ++i) { double *ai=a+i*n; double sum=ai[j]; for(size_t k=0; k < j; ++k) sum -= ai[k]*a[k*n+j]; ai[j]=sum; double temp=vv[i]*fabs(sum); if(temp >= big) { big=temp; imax=i; } } double *aj=a+j*n; double *aimax=a+imax*n; if(j != imax) { for(size_t k=0; k < n; ++k) { double temp=aimax[k]; aimax[k]=aj[k]; aj[k]=temp; } swap *= -1; vv[imax]=vv[j]; } if(index) index[j]=imax; if(j != n) { double denom=aj[j]; if(denom == 0.0) { delete[] vv; if(warn) error(singular); else return 0; } for(size_t i=j+1; i < n; ++i) a[i*n+j] /= denom; } } delete[] vv; return swap; } namespace run { void dividebyzero(size_t i) { ostringstream buf; if(i > 0) buf << "array element " << i << ": "; buf << "Divide by zero"; error(buf); } void integeroverflow(size_t i) { ostringstream buf; if(i > 0) buf << "array element " << i << ": "; buf << "Integer overflow"; error(buf); } } // Autogenerated routines: #ifndef NOSYM #include "runarray.symbols.h" #endif namespace run { // Create an empty array. #line 610 "./runarray.in" void emptyArray(stack *Stack) { #line 611 "./runarray.in" {Stack->push(new array(0)); return;} } // Create a new array (technically a vector). // This array will be multidimensional. First the number of dimensions // is popped off the stack, followed by each dimension in reverse order. // The array itself is technically a one dimensional array of one // dimension arrays and so on. #line 620 "./runarray.in" void newDeepArray(stack *Stack) { Int depth=vm::pop(Stack); #line 621 "./runarray.in" assert(depth > 0); Int *dims = new Int[depth]; for (Int index = depth-1; index >= 0; index--) { Int i=pop(Stack); if(i < 0) error("cannot create a negative length array"); dims[index]=i; } array *a=deepArray(depth, dims); delete[] dims; {Stack->push(a); return;} } // Creates an array with elements already specified. First, the number // of elements is popped off the stack, followed by each element in // reverse order. #line 640 "./runarray.in" void newInitializedArray(stack *Stack) { Int n=vm::pop(Stack); #line 641 "./runarray.in" assert(n >= 0); array *a = new array(n); for (Int index = n-1; index >= 0; index--) (*a)[index] = pop(Stack); {Stack->push(a); return;} } // Similar to newInitializedArray, but after the n elements, append another // array to it. #line 654 "./runarray.in" void newAppendedArray(stack *Stack) { Int n=vm::pop(Stack); array* tail=vm::pop(Stack); #line 655 "./runarray.in" assert(n >= 0); array *a = new array(n); for (Int index = n-1; index >= 0; index--) (*a)[index] = pop(Stack); copy(tail->begin(), tail->end(), back_inserter(*a)); {Stack->push(a); return;} } // Produce an array of n deep copies of value. // typeDepth is the true depth of the array determined at compile-time when the // operations for the array type are added. This typeDepth argument is // automatically pushed on the stack and is not visible to the user. #line 672 "./runarray.in" void copyArrayValue(stack *Stack) { Int typeDepth=vm::pop(Stack); Int depth=vm::pop(Stack,Int_MAX); item value=vm::pop(Stack); Int n=vm::pop(Stack); #line 673 "./runarray.in" if(n < 0) error("cannot create a negative length array"); if(depth < 0) error("cannot copy to a negative depth"); if(depth > typeDepth) depth=typeDepth; {Stack->push(new array((size_t) n, value, depth)); return;} } // Deep copy of array. // typeDepth is the true depth of the array determined at compile-time when the // operations for the array type are added. This typeDepth argument is // automatically pushed on the stack and is not visible to the user. #line 684 "./runarray.in" void copyArray(stack *Stack) { Int typeDepth=vm::pop(Stack); Int depth=vm::pop(Stack,Int_MAX); array * a=vm::pop(Stack); #line 685 "./runarray.in" if(a == 0) vm::error(dereferenceNullArray); if(depth < 0) error("cannot copy to a negative depth"); if(depth > typeDepth) depth=typeDepth; {Stack->push(a->copyToDepth(depth)); return;} } // Read an element from an array. Checks for initialization & bounds. #line 693 "./runarray.in" void arrayRead(stack *Stack) { Int n=vm::pop(Stack); array * a=vm::pop(Stack); #line 694 "./runarray.in" item& i=arrayRead(a,n); if (i.empty()) { ostringstream buf; buf << "read uninitialized value from array at index " << n; error(buf); } {Stack->push(i); return;} } // Slice a substring from an array. #line 705 "./runarray.in" void arraySliceRead(stack *Stack) { Int right=vm::pop(Stack); Int left=vm::pop(Stack); array * a=vm::pop(Stack); #line 706 "./runarray.in" checkArray(a); {Stack->push(a->slice(left, right)); return;} } // Slice a substring from an array. This implements the cases a[i:] and a[:] // where the endpoint is not given, and assumed to be the length of the array. #line 713 "./runarray.in" void arraySliceReadToEnd(stack *Stack) { Int left=vm::pop(Stack); array * a=vm::pop(Stack); #line 714 "./runarray.in" size_t len=checkArray(a); {Stack->push(a->slice(left, (Int)len)); return;} } // Read an element from an array of arrays. Check bounds and initialize // as necessary. #line 721 "./runarray.in" void arrayArrayRead(stack *Stack) { Int n=vm::pop(Stack); array * a=vm::pop(Stack); #line 722 "./runarray.in" item& i=arrayRead(a,n); if (i.empty()) i=new array(0); {Stack->push(i); return;} } // Write an element to an array. Increase size if necessary. // TODO: Add arrayWriteAndPop #line 730 "./runarray.in" void arrayWrite(stack *Stack) { item value=vm::pop(Stack); Int n=vm::pop(Stack); array * a=vm::pop(Stack); #line 731 "./runarray.in" size_t len=checkArray(a); bool cyclic=a->cyclic(); if(cyclic && len > 0) n=imod(n,len); else { if(cyclic) outOfBounds("writing cyclic",len,n); if(n < 0) outOfBounds("writing",len,n); if(len <= (size_t) n) a->resize(n+1); } (*a)[n] = value; {Stack->push(value); return;} } #line 745 "./runarray.in" void arraySliceWrite(stack *Stack) { array * src=vm::pop(Stack); Int right=vm::pop(Stack); Int left=vm::pop(Stack); array * dest=vm::pop(Stack); #line 746 "./runarray.in" checkArray(src); checkArray(dest); dest->setSlice(left, right, src); {Stack->push(src); return;} } #line 753 "./runarray.in" void arraySliceWriteToEnd(stack *Stack) { array * src=vm::pop(Stack); Int left=vm::pop(Stack); array * dest=vm::pop(Stack); #line 754 "./runarray.in" checkArray(src); size_t len=checkArray(dest); dest->setSlice(left, (Int) len, src); {Stack->push(src); return;} } // Returns the length of an array. #line 762 "./runarray.in" void arrayLength(stack *Stack) { array * a=vm::pop(Stack); #line 763 "./runarray.in" {Stack->push((Int) checkArray(a)); return;} } // Returns an array of integers representing the keys of the array. #line 768 "./runarray.in" void arrayKeys(stack *Stack) { array * a=vm::pop(Stack); #line 769 "./runarray.in" size_t size=checkArray(a); array *keys=new array(); for (size_t i=0; ipush((Int)i); } {Stack->push(keys); return;} } // Return the cyclic flag for an array. #line 783 "./runarray.in" void arrayCyclicFlag(stack *Stack) { array * a=vm::pop(Stack); #line 784 "./runarray.in" checkArray(a); {Stack->push(a->cyclic()); return;} } #line 789 "./runarray.in" void arraySetCyclicFlag(stack *Stack) { array * a=vm::pop(Stack); bool b=vm::pop(Stack); #line 790 "./runarray.in" checkArray(a); a->cyclic(b); {Stack->push(b); return;} } // Check to see if an array element is initialized. #line 797 "./runarray.in" void arrayInitializedHelper(stack *Stack) { array * a=vm::pop(Stack); Int n=vm::pop(Stack); #line 798 "./runarray.in" size_t len=checkArray(a); bool cyclic=a->cyclic(); if(cyclic && len > 0) n=imod(n,len); else if(n < 0 || n >= (Int) len) {Stack->push(false); return;} item&i=(*a)[(unsigned) n]; {Stack->push(!i.empty()); return;} } // Returns the initialize method for an array. #line 808 "./runarray.in" void arrayInitialized(stack *Stack) { array * a=vm::pop(Stack); #line 809 "./runarray.in" {Stack->push(new thunk(new bfunc(arrayInitializedHelper),a)); return;} } // The helper function for the cyclic method that sets the cyclic flag. #line 814 "./runarray.in" void arrayCyclicHelper(stack *Stack) { array * a=vm::pop(Stack); bool b=vm::pop(Stack); #line 815 "./runarray.in" checkArray(a); a->cyclic(b); } // Set the cyclic flag for an array. #line 821 "./runarray.in" void arrayCyclic(stack *Stack) { array * a=vm::pop(Stack); #line 822 "./runarray.in" {Stack->push(new thunk(new bfunc(arrayCyclicHelper),a)); return;} } // The helper function for the push method that does the actual operation. #line 827 "./runarray.in" void arrayPushHelper(stack *Stack) { array * a=vm::pop(Stack); item x=vm::pop(Stack); #line 828 "./runarray.in" checkArray(a); a->push(x); {Stack->push(x); return;} } // Returns the push method for an array. #line 835 "./runarray.in" void arrayPush(stack *Stack) { array * a=vm::pop(Stack); #line 836 "./runarray.in" {Stack->push(new thunk(new bfunc(arrayPushHelper),a)); return;} } // The helper function for the append method that appends b to a. #line 841 "./runarray.in" void arrayAppendHelper(stack *Stack) { array * a=vm::pop(Stack); array * b=vm::pop(Stack); #line 842 "./runarray.in" checkArray(a); size_t size=checkArray(b); for(size_t i=0; i < size; i++) a->push((*b)[i]); } // Returns the append method for an array. #line 850 "./runarray.in" void arrayAppend(stack *Stack) { array * a=vm::pop(Stack); #line 851 "./runarray.in" {Stack->push(new thunk(new bfunc(arrayAppendHelper),a)); return;} } // The helper function for the pop method. #line 856 "./runarray.in" void arrayPopHelper(stack *Stack) { array * a=vm::pop(Stack); #line 857 "./runarray.in" size_t asize=checkArray(a); if(asize == 0) error("cannot pop element from empty array"); {Stack->push(a->pop()); return;} } // Returns the pop method for an array. #line 865 "./runarray.in" void arrayPop(stack *Stack) { array * a=vm::pop(Stack); #line 866 "./runarray.in" {Stack->push(new thunk(new bfunc(arrayPopHelper),a)); return;} } // The helper function for the insert method. #line 871 "./runarray.in" void arrayInsertHelper(stack *Stack) { array * a=vm::pop(Stack); array * x=vm::pop(Stack); Int i=vm::pop(Stack); #line 872 "./runarray.in" size_t asize=checkArray(a); checkArray(x); if(a->cyclic() && asize > 0) i=imod(i,asize); if(i < 0 || i > (Int) asize) outOfBounds("inserting",asize,i); (*a).insert((*a).begin()+i,(*x).begin(),(*x).end()); } // Returns the insert method for an array. #line 882 "./runarray.in" void arrayInsert(stack *Stack) { array * a=vm::pop(Stack); #line 883 "./runarray.in" {Stack->push(new thunk(new bfunc(arrayInsertHelper),a)); return;} } // Returns the delete method for an array. #line 888 "./runarray.in" void arrayDelete(stack *Stack) { array * a=vm::pop(Stack); #line 889 "./runarray.in" {Stack->push(new thunk(new bfunc(arrayDeleteHelper),a)); return;} } #line 893 "./runarray.in" void arrayAlias(stack *Stack) { array * b=vm::pop(Stack); array * a=vm::pop(Stack); #line 894 "./runarray.in" {Stack->push(a==b); return;} } // Return array formed by indexing array a with elements of integer array b #line 899 "./runarray.in" void arrayIntArray(stack *Stack) { array * b=vm::pop(Stack); array * a=vm::pop(Stack); #line 900 "./runarray.in" size_t asize=checkArray(a); size_t bsize=checkArray(b); array *r=new array(bsize); bool cyclic=a->cyclic(); for(size_t i=0; i < bsize; i++) { Int index=read(b,i); if(cyclic && asize > 0) index=imod(index,asize); else if(index < 0 || index >= (Int) asize) outOfBounds("reading",asize,index); (*r)[i]=(*a)[index]; } {Stack->push(r); return;} } // returns the complement of the integer array a in {0,2,...,n-1}, // so that b[complement(a,b.length)] yields the complement of b[a]. #line 918 "./runarray.in" // Intarray* complement(Intarray *a, Int n); void gen_runarray32(stack *Stack) { Int n=vm::pop(Stack); Intarray * a=vm::pop(Stack); #line 919 "./runarray.in" size_t asize=checkArray(a); array *r=new array(0); bool *keep=new bool[n]; for(Int i=0; i < n; ++i) keep[i]=true; for(size_t i=0; i < asize; ++i) { Int j=read(a,i); if(j >= 0 && j < n) keep[j]=false; } for(Int i=0; i < n; i++) if(keep[i]) r->push(i); delete[] keep; {Stack->push(r); return;} } // Generate the sequence {f(i) : i=0,1,...n-1} given a function f and integer n #line 936 "./runarray.in" void arraySequence(stack *Stack) { Int n=vm::pop(Stack); callable * f=vm::pop(Stack); #line 937 "./runarray.in" if(n < 0) n=0; array *a=new array(n); for(Int i=0; i < n; ++i) { Stack->push(i); f->call(Stack); (*a)[i]=pop(Stack); } {Stack->push(a); return;} } // Return the array {0,1,...n-1} #line 949 "./runarray.in" // Intarray* sequence(Int n); void gen_runarray34(stack *Stack) { Int n=vm::pop(Stack); #line 950 "./runarray.in" if(n < 0) n=0; array *a=new array(n); for(Int i=0; i < n; ++i) { (*a)[i]=i; } {Stack->push(a); return;} } // Apply a function to each element of an array #line 960 "./runarray.in" void arrayFunction(stack *Stack) { array * a=vm::pop(Stack); callable * f=vm::pop(Stack); #line 961 "./runarray.in" size_t size=checkArray(a); array *b=new array(size); for(size_t i=0; i < size; ++i) { Stack->push((*a)[i]); f->call(Stack); (*b)[i]=pop(Stack); } {Stack->push(b); return;} } #line 972 "./runarray.in" void arraySort(stack *Stack) { bool stable=vm::pop(Stack,true); callable * less=vm::pop(Stack); array * a=vm::pop(Stack); #line 973 "./runarray.in" array *c=copyArray(a); compareFunc=less; FuncStack=Stack; if(stable) stable_sort(c->begin(),c->end(),compareFunction); else sort(c->begin(),c->end(),compareFunction); {Stack->push(c); return;} } #line 982 "./runarray.in" void arraySearch(stack *Stack) { callable * less=vm::pop(Stack); item key=vm::pop(Stack); array * a=vm::pop(Stack); #line 983 "./runarray.in" size_t size=a->size(); compareFunc=less; FuncStack=Stack; if(size == 0 || compareFunction(key,(*a)[0])) {Stack->push(-1); return;} size_t u=size-1; if(!compareFunction(key,(*a)[u])) {Stack->push(Intcast(u)); return;} size_t l=0; while (l < u) { size_t i=(l+u)/2; if(compareFunction(key,(*a)[i])) u=i; else if(compareFunction(key,(*a)[i+1])) {Stack->push(Intcast(i)); return;} else l=i+1; } {Stack->push(0); return;} } #line 1001 "./runarray.in" // bool all(boolarray *a); void gen_runarray38(stack *Stack) { boolarray * a=vm::pop(Stack); #line 1002 "./runarray.in" size_t size=checkArray(a); bool c=true; for(size_t i=0; i < size; i++) if(!get((*a)[i])) {c=false; break;} {Stack->push(c); return;} } #line 1010 "./runarray.in" // boolarray* !(boolarray* a); void gen_runarray39(stack *Stack) { boolarray* a=vm::pop(Stack); #line 1011 "./runarray.in" size_t size=checkArray(a); array *c=new array(size); for(size_t i=0; i < size; i++) (*c)[i]=!read(a,i); {Stack->push(c); return;} } #line 1019 "./runarray.in" // Int sum(boolarray *a); void gen_runarray40(stack *Stack) { boolarray * a=vm::pop(Stack); #line 1020 "./runarray.in" size_t size=checkArray(a); Int sum=0; for(size_t i=0; i < size; i++) sum += read(a,i) ? 1 : 0; {Stack->push(sum); return;} } #line 1028 "./runarray.in" void arrayConcat(stack *Stack) { array * a=vm::pop(Stack); #line 1029 "./runarray.in" // a is an array of arrays to be concatenated together. // The signature is // T[] concat(... T[][] a); size_t numArgs=checkArray(a); size_t resultSize=0; for (size_t i=0; i < numArgs; ++i) { resultSize += checkArray(a->read(i)); } array *result=new array(resultSize); size_t ri=0; for (size_t i=0; i < numArgs; ++i) { array *arg=a->read(i); size_t size=checkArray(arg); for (size_t j=0; j < size; ++j) { (*result)[ri]=(*arg)[j]; ++ri; } } {Stack->push(result); return;} } #line 1056 "./runarray.in" void array2Transpose(stack *Stack) { array * a=vm::pop(Stack); #line 1057 "./runarray.in" size_t asize=checkArray(a); array *c=new array(0); size_t csize=0; for(size_t i=0; i < asize; i++) { size_t ip=i+1; array *ai=read(a,i); size_t aisize=checkArray(ai); if(c->size() < aisize) { c->resize(aisize); for(size_t j=csize; j < aisize; j++) (*c)[j]=new array(0); csize=aisize; } for(size_t j=0; j < aisize; j++) { if(!(*ai)[j].empty()) { array *cj=read(c,j); if(checkArray(cj) < ip) cj->resize(ip); (*cj)[i]=(*ai)[j]; } } } {Stack->push(c); return;} } // a is a rectangular 3D array; perm is an Int array indicating the type of // permutation (021 or 120, etc; original is 012). // Transpose by sending respective members to the permutated locations: // return the array obtained by putting a[i][j][k] into position perm{ijk}. #line 1086 "./runarray.in" void array3Transpose(stack *Stack) { array * perm=vm::pop(Stack); array * a=vm::pop(Stack); #line 1087 "./runarray.in" const size_t DIM=3; if(checkArray(perm) != DIM) { ostringstream buf; buf << "permutation array must have length " << DIM; error(buf); } size_t* size=new size_t[DIM]; for(size_t i=0; i < DIM; ++i) size[i]=DIM; for(size_t i=0; i < DIM; ++i) { Int p=read(perm,i); size_t P=(size_t) p; if(p < 0 || P >= DIM) { ostringstream buf; buf << "permutation index out of range: " << p; error(buf); } size[P]=P; } for(size_t i=0; i < DIM; ++i) if(size[i] == DIM) error("permutation indices must be distinct"); static const char *rectangular= "3D transpose implemented for rectangular matrices only"; size_t isize=size[0]=checkArray(a); array *a0=read(a,0); size[1]=checkArray(a0); array *a00=read(a0,0); size[2]=checkArray(a00); for(size_t i=0; i < isize; i++) { array *ai=read(a,i); size_t jsize=checkArray(ai); if(jsize != size[1]) error(rectangular); for(size_t j=0; j < jsize; j++) { array *aij=read(ai,j); if(checkArray(aij) != size[2]) error(rectangular); } } size_t perm0=(size_t) read(perm,0); size_t perm1=(size_t) read(perm,1); size_t perm2=(size_t) read(perm,2); size_t sizep0=size[perm0]; size_t sizep1=size[perm1]; size_t sizep2=size[perm2]; array *c=new array(sizep0); for(size_t i=0; i < sizep0; ++i) { array *ci=new array(sizep1); (*c)[i]=ci; for(size_t j=0; j < sizep1; ++j) { array *cij=new array(sizep2); (*ci)[j]=cij; } } size_t* i=new size_t[DIM]; for(i[0]=0; i[0] < size[0]; ++i[0]) { array *a0=read(a,i[0]); for(i[1]=0; i[1] < size[1]; ++i[1]) { array *a1=read(a0,i[1]); for(i[2]=0; i[2] < size[2]; ++i[2]) { array *c0=read(c,i[perm0]); array *c1=read(c0,i[perm1]); (*c1)[i[perm2]]=read(a1,i[2]); } } } delete[] i; delete[] size; {Stack->push(c); return;} } // Find the index of the nth true value in a boolean array or -1 if not found. // If n is negative, search backwards. #line 1171 "./runarray.in" // Int find(boolarray *a, Int n=1); void gen_runarray44(stack *Stack) { Int n=vm::pop(Stack,1); boolarray * a=vm::pop(Stack); #line 1172 "./runarray.in" size_t size=checkArray(a); Int j=-1; if(n > 0) for(size_t i=0; i < size; i++) if(read(a,i)) { n--; if(n == 0) {j=(Int) i; break;} } if(n < 0) for(size_t i=size; i > 0;) if(read(a,--i)) { n++; if(n == 0) {j=(Int) i; break;} } {Stack->push(j); return;} } // Find all indices of true values in a boolean array. #line 1189 "./runarray.in" // Intarray* findall(boolarray *a); void gen_runarray45(stack *Stack) { boolarray * a=vm::pop(Stack); #line 1190 "./runarray.in" size_t size=checkArray(a); array *b=new array(0); for(size_t i=0; i < size; i++) { if(read(a,i)) { b->push((Int) i); } } {Stack->push(b); return;} } // construct vector obtained by replacing those elements of b for which the // corresponding elements of a are false by the corresponding element of c. #line 1203 "./runarray.in" void arrayConditional(stack *Stack) { array * c=vm::pop(Stack); array * b=vm::pop(Stack); array * a=vm::pop(Stack); #line 1204 "./runarray.in" size_t size=checkArray(a); array *r=new array(size); if(b && c) { checkArrays(a,b); checkArrays(b,c); for(size_t i=0; i < size; i++) (*r)[i]=read(a,i) ? (*b)[i] : (*c)[i]; } else { r->clear(); if(b) { checkArrays(a,b); for(size_t i=0; i < size; i++) if(read(a,i)) r->push((*b)[i]); } else if(c) { checkArrays(a,c); for(size_t i=0; i < size; i++) if(!read(a,i)) r->push((*c)[i]); } } {Stack->push(r); return;} } // Return an n x n identity matrix. #line 1228 "./runarray.in" // realarray2* identity(Int n); void gen_runarray47(stack *Stack) { Int n=vm::pop(Stack); #line 1229 "./runarray.in" {Stack->push(Identity(n)); return;} } // Return the inverse of an n x n matrix a using Gauss-Jordan elimination. #line 1234 "./runarray.in" // realarray2* inverse(realarray2 *a); void gen_runarray48(stack *Stack) { realarray2 * a=vm::pop(Stack); #line 1235 "./runarray.in" size_t n=checkArray(a); double *A; copyArray2C(A,a,true,0,NoGC); inverse(A,n); a=copyCArray2(n,n,A); delete[] A; {Stack->push(a); return;} } // Solve the linear equation ax=b by LU decomposition, returning the // solution x, where a is an n x n matrix and b is an array of length n. // If no solution exists, return an empty array. #line 1248 "./runarray.in" // realarray* solve(realarray2 *a, realarray *b, bool warn=true); void gen_runarray49(stack *Stack) { bool warn=vm::pop(Stack,true); realarray * b=vm::pop(Stack); realarray2 * a=vm::pop(Stack); #line 1249 "./runarray.in" size_t n=checkArray(a); if(n == 0) {Stack->push(new array(0)); return;} size_t m=checkArray(b); if(m != n) error(incommensurate); real *A; copyArray2C(A,a); size_t *index=new size_t[n]; if(LUdecompose(A,n,index,warn) == 0) {Stack->push(new array(0)); return;} array *x=new array(n); real *B; copyArrayC(B,b); for(size_t i=0; i < n; ++i) { size_t ip=index[i]; real sum=B[ip]; B[ip]=B[i]; real *Ai=A+i*n; for(size_t j=0; j < i; ++j) sum -= Ai[j]*B[j]; B[i]=sum; } for(size_t i=n; i > 0;) { --i; real sum=B[i]; real *Ai=A+i*n; for(size_t j=i+1; j < n; ++j) sum -= Ai[j]*B[j]; B[i]=sum/Ai[i]; } for(size_t i=0; i < n; ++i) (*x)[i]=B[i]; delete[] index; delete[] B; delete[] A; {Stack->push(x); return;} } // Solve the linear equation ax=b by LU decomposition, returning the // solution x, where a is an n x n matrix and b is an n x m matrix. // If no solution exists, return an empty array. #line 1301 "./runarray.in" // realarray2* solve(realarray2 *a, realarray2 *b, bool warn=true); void gen_runarray50(stack *Stack) { bool warn=vm::pop(Stack,true); realarray2 * b=vm::pop(Stack); realarray2 * a=vm::pop(Stack); #line 1302 "./runarray.in" size_t n=checkArray(a); if(n == 0) {Stack->push(new array(0)); return;} if(checkArray(b) != n) error(incommensurate); size_t m=checkArray(read(b,0)); real *A,*B; copyArray2C(A,a); copyArray2C(B,b,false); size_t *index=new size_t[n]; if(LUdecompose(A,n,index,warn) == 0) {Stack->push(new array(0)); return;} array *x=new array(n); for(size_t i=0; i < n; ++i) { real *Ai=A+i*n; real *Bi=B+i*m; real *Bip=B+index[i]*m; for(size_t k=0; k < m; ++k) { real sum=Bip[k]; Bip[k]=Bi[k]; size_t jk=k; for(size_t j=0; j < i; ++j, jk += m) sum -= Ai[j]*B[jk]; Bi[k]=sum; } } for(size_t i=n; i > 0;) { --i; real *Ai=A+i*n; real *Bi=B+i*m; for(size_t k=0; k < m; ++k) { real sum=Bi[k]; size_t jk=(i+1)*m+k; for(size_t j=i+1; j < n; ++j, jk += m) sum -= Ai[j]*B[jk]; Bi[k]=sum/Ai[i]; } } for(size_t i=0; i < n; ++i) { real *Bi=B+i*m; array *xi=new array(m); (*x)[i]=xi; for(size_t j=0; j < m; ++j) (*xi)[j]=Bi[j]; } delete[] index; delete[] B; delete[] A; {Stack->push(x); return;} } // Compute the determinant of an n x n matrix. #line 1364 "./runarray.in" // real determinant(realarray2 *a); void gen_runarray51(stack *Stack) { realarray2 * a=vm::pop(Stack); #line 1365 "./runarray.in" real *A; copyArray2C(A,a); size_t n=checkArray(a); real det=LUdecompose(A,n,NULL,false); size_t n1=n+1; for(size_t i=0; i < n; ++i) det *= A[i*n1]; delete[] A; {Stack->push(det); return;} } #line 1380 "./runarray.in" // realarray* *(realarray2 *a, realarray *b); void gen_runarray52(stack *Stack) { realarray * b=vm::pop(Stack); realarray2 * a=vm::pop(Stack); #line 1381 "./runarray.in" size_t n=checkArray(a); size_t m=checkArray(b); array *c=new array(n); real *B; copyArrayC(B,b); for(size_t i=0; i < n; ++i) { array *ai=read(a,i); if(checkArray(ai) != m) error(incommensurate); real sum=0.0; for(size_t j=0; j < m; ++j) sum += read(ai,j)*B[j]; (*c)[i]=sum; } delete[] B; {Stack->push(c); return;} } #line 1399 "./runarray.in" // realarray* *(realarray *a, realarray2 *b); void gen_runarray53(stack *Stack) { realarray2 * b=vm::pop(Stack); realarray * a=vm::pop(Stack); #line 1400 "./runarray.in" size_t n=checkArray(a); if(n != checkArray(b)) error(incommensurate); real *A; copyArrayC(A,a); array **B=new array*[n]; array *bk=read(b,0); B[0]=bk; size_t m=bk->size(); for(size_t k=1; k < n; k++) { array *bk=read(b,k); if(bk->size() != m) error(incommensurate); B[k]=bk; } array *c=new array(m); for(size_t i=0; i < m; ++i) { real sum=0.0; for(size_t k=0; k < n; ++k) sum += A[k]*read(B[k],i); (*c)[i]=sum; } delete[] B; delete[] A; {Stack->push(c); return;} } #line 1428 "./runarray.in" // Intarray2* *(Intarray2 *a, Intarray2 *b); void gen_runarray54(stack *Stack) { Intarray2 * b=vm::pop(Stack); Intarray2 * a=vm::pop(Stack); #line 1429 "./runarray.in" {Stack->push(mult(a,b)); return;} } #line 1433 "./runarray.in" // realarray2* *(realarray2 *a, realarray2 *b); void gen_runarray55(stack *Stack) { realarray2 * b=vm::pop(Stack); realarray2 * a=vm::pop(Stack); #line 1434 "./runarray.in" {Stack->push(mult(a,b)); return;} } #line 1438 "./runarray.in" // pairarray2* *(pairarray2 *a, pairarray2 *b); void gen_runarray56(stack *Stack) { pairarray2 * b=vm::pop(Stack); pairarray2 * a=vm::pop(Stack); #line 1439 "./runarray.in" {Stack->push(mult(a,b)); return;} } #line 1443 "./runarray.in" // triple *(realarray2 *t, triple v); void gen_runarray57(stack *Stack) { triple v=vm::pop(Stack); realarray2 * t=vm::pop(Stack); #line 1444 "./runarray.in" {Stack->push(*t*v); return;} } #line 1448 "./runarray.in" // realarray2* AtA(realarray2 *a); void gen_runarray58(stack *Stack) { realarray2 * a=vm::pop(Stack); #line 1449 "./runarray.in" {Stack->push(AtA(a)); return;} } #line 1453 "./runarray.in" // pair project(triple v, realarray2 *t); void gen_runarray59(stack *Stack) { realarray2 * t=vm::pop(Stack); triple v=vm::pop(Stack); #line 1454 "./runarray.in" size_t n=checkArray(t); if(n != 4) error(incommensurate); array *t0=read(t,0); array *t1=read(t,1); array *t3=read(t,3); if(checkArray(t0) != 4 || checkArray(t1) != 4 || checkArray(t3) != 4) error(incommensurate); real x=v.getx(); real y=v.gety(); real z=v.getz(); real f=read(t3,0)*x+read(t3,1)*y+read(t3,2)*z+ read(t3,3); if(f == 0.0) dividebyzero(); f=1.0/f; {Stack->push(pair((read(t0,0)*x+read(t0,1)*y+read(t0,2)*z+ read(t0,3))*f, (read(t1,0)*x+read(t1,1)*y+read(t1,2)*z+ read(t1,3))*f)); return;} } // Compute the dot product of vectors a and b. #line 1479 "./runarray.in" // real dot(realarray *a, realarray *b); void gen_runarray60(stack *Stack) { realarray * b=vm::pop(Stack); realarray * a=vm::pop(Stack); #line 1480 "./runarray.in" size_t n=checkArrays(a,b); real sum=0.0; for(size_t i=0; i < n; ++i) sum += read(a,i)*read(b,i); {Stack->push(sum); return;} } // Compute the complex dot product of vectors a and b. #line 1489 "./runarray.in" // pair dot(pairarray *a, pairarray *b); void gen_runarray61(stack *Stack) { pairarray * b=vm::pop(Stack); pairarray * a=vm::pop(Stack); #line 1490 "./runarray.in" size_t n=checkArrays(a,b); pair sum=zero; for(size_t i=0; i < n; ++i) sum += read(a,i)*conj(read(b,i)); {Stack->push(sum); return;} } // Solve the problem L\inv f, where f is an n vector and L is the n x n matrix // // [ b[0] c[0] a[0] ] // [ a[1] b[1] c[1] ] // [ a[2] b[2] c[2] ] // [ ... ] // [ c[n-1] a[n-1] b[n-1] ] #line 1505 "./runarray.in" // realarray* tridiagonal(realarray *a, realarray *b, realarray *c, realarray *f); void gen_runarray62(stack *Stack) { realarray * f=vm::pop(Stack); realarray * c=vm::pop(Stack); realarray * b=vm::pop(Stack); realarray * a=vm::pop(Stack); #line 1506 "./runarray.in" size_t n=checkArrays(a,b); checkEqual(n,checkArray(c)); checkEqual(n,checkArray(f)); array *up=new array(n); array& u=*up; if(n == 0) {Stack->push(up); return;} // Special case: zero Dirichlet boundary conditions if(read(a,0) == 0.0 && read(c,n-1) == 0.0) { real temp=read(b,0); if(temp == 0.0) dividebyzero(); temp=1.0/temp; real *work=new real[n]; u[0]=read(f,0)*temp; work[0]=-read(c,0)*temp; for(size_t i=1; i < n; i++) { real temp=(read(b,i)+read(a,i)*work[i-1]); if(temp == 0.0) {delete[] work; dividebyzero();} temp=1.0/temp; u[i]=(read(f,i)-read(a,i)*read(u,i-1))*temp; work[i]=-read(c,i)*temp; } for(size_t i=n-1; i >= 1; i--) u[i-1]=read(u,i-1)+work[i-1]*read(u,i); delete[] work; {Stack->push(up); return;} } real binv=read(b,0); if(binv == 0.0) dividebyzero(); binv=1.0/binv; if(n == 1) {u[0]=read(f,0)*binv; {Stack->push(up); return;}} if(n == 2) { real factor=(read(b,0)*read(b,1)- read(a,0)*read(c,1)); if(factor== 0.0) dividebyzero(); factor=1.0/factor; real temp=(read(b,0)*read(f,1)- read(c,1)*read(f,0))*factor; u[0]=(read(b,1)*read(f,0)- read(a,0)*read(f,1))*factor; u[1]=temp; {Stack->push(up); return;} } real *gamma=new real[n-2]; real *delta=new real[n-2]; gamma[0]=read(c,0)*binv; delta[0]=read(a,0)*binv; u[0]=read(f,0)*binv; real beta=read(c,n-1); real fn=read(f,n-1)-beta*read(u,0); real alpha=read(b,n-1)-beta*delta[0]; for(size_t i=1; i <= n-3; i++) { real alphainv=read(b,i)-read(a,i)*gamma[i-1]; if(alphainv == 0.0) {delete[] gamma; delete[] delta; dividebyzero();} alphainv=1.0/alphainv; beta *= -gamma[i-1]; gamma[i]=read(c,i)*alphainv; u[i]=(read(f,i)-read(a,i)*read(u,i-1))*alphainv; fn -= beta*read(u,i); delta[i]=-read(a,i)*delta[i-1]*alphainv; alpha -= beta*delta[i]; } real alphainv=read(b,n-2)-read(a,n-2)*gamma[n-3]; if(alphainv == 0.0) {delete[] gamma; delete[] delta; dividebyzero();} alphainv=1.0/alphainv; u[n-2]=(read(f,n-2)-read(a,n-2)*read(u,n-3)) *alphainv; beta=read(a,n-1)-beta*gamma[n-3]; real dnm1=(read(c,n-2)-read(a,n-2)*delta[n-3])*alphainv; real temp=alpha-beta*dnm1; if(temp == 0.0) {delete[] gamma; delete[] delta; dividebyzero();} u[n-1]=temp=(fn-beta*read(u,n-2))/temp; u[n-2]=read(u,n-2)-dnm1*temp; for(size_t i=n-2; i >= 1; i--) u[i-1]=read(u,i-1)-gamma[i-1]*read(u,i)-delta[i-1]*temp; delete[] delta; delete[] gamma; {Stack->push(up); return;} } // Root solve by Newton-Raphson #line 1603 "./runarray.in" // real newton(Int iterations=100, callableReal *f, callableReal *fprime, real x, bool verbose=false); void gen_runarray63(stack *Stack) { bool verbose=vm::pop(Stack,false); real x=vm::pop(Stack); callableReal * fprime=vm::pop(Stack); callableReal * f=vm::pop(Stack); Int iterations=vm::pop(Stack,100); #line 1605 "./runarray.in" static const real fuzz=1000.0*DBL_EPSILON; Int i=0; size_t oldPrec=0; if(verbose) oldPrec=cout.precision(DBL_DIG); real diff=DBL_MAX; real lastdiff; do { real x0=x; Stack->push(x); fprime->call(Stack); real dfdx=pop(Stack); if(dfdx == 0.0) { x=DBL_MAX; break; } Stack->push(x); f->call(Stack); real fx=pop(Stack); x -= fx/dfdx; lastdiff=diff; if(verbose) cout << "Newton-Raphson: " << x << endl; diff=fabs(x-x0); if(++i == iterations) { x=DBL_MAX; break; } } while (diff != 0.0 && (diff < lastdiff || diff > fuzz*fabs(x))); if(verbose) cout.precision(oldPrec); {Stack->push(x); return;} } // Root solve by Newton-Raphson bisection // cf. routine rtsafe (Press et al., Numerical Recipes, 1991). #line 1651 "./runarray.in" // real newton(Int iterations=100, callableReal *f, callableReal *fprime, real x1, real x2, bool verbose=false); void gen_runarray64(stack *Stack) { bool verbose=vm::pop(Stack,false); real x2=vm::pop(Stack); real x1=vm::pop(Stack); callableReal * fprime=vm::pop(Stack); callableReal * f=vm::pop(Stack); Int iterations=vm::pop(Stack,100); #line 1653 "./runarray.in" static const real fuzz=1000.0*DBL_EPSILON; size_t oldPrec=0; if(verbose) oldPrec=cout.precision(DBL_DIG); Stack->push(x1); f->call(Stack); real f1=pop(Stack); if(f1 == 0.0) {Stack->push(x1); return;} Stack->push(x2); f->call(Stack); real f2=pop(Stack); if(f2 == 0.0) {Stack->push(x2); return;} if((f1 > 0.0 && f2 > 0.0) || (f1 < 0.0 && f2 < 0.0)) { ostringstream buf; buf << "root not bracketed, f(x1)=" << f1 << ", f(x2)=" << f2 << endl; error(buf); } real x=0.5*(x1+x2); real dxold=fabs(x2-x1); if(f1 > 0.0) { real temp=x1; x1=x2; x2=temp; } if(verbose) cout << "midpoint: " << x << endl; real dx=dxold; Stack->push(x); f->call(Stack); real y=pop(Stack); Stack->push(x); fprime->call(Stack); real dy=pop(Stack); Int j; for(j=0; j < iterations; j++) { if(((x-x2)*dy-y)*((x-x1)*dy-y) >= 0.0 || fabs(2.0*y) > fabs(dxold*dy)) { dxold=dx; dx=0.5*(x2-x1); x=x1+dx; if(verbose) cout << "bisection: " << x << endl; if(x1 == x) {Stack->push(x); return;} } else { dxold=dx; dx=y/dy; real temp=x; x -= dx; if(verbose) cout << "Newton-Raphson: " << x << endl; if(temp == x) {Stack->push(x); return;} } if(fabs(dx) < fuzz*fabs(x)) {Stack->push(x); return;} Stack->push(x); f->call(Stack); y=pop(Stack); Stack->push(x); fprime->call(Stack); dy=pop(Stack); if(y < 0.0) x1=x; else x2=x; } if(verbose) cout.precision(oldPrec); {Stack->push((j == iterations) ? DBL_MAX : x); return;} } // Find a root for the specified continuous (but not necessarily // differentiable) function. Whatever value t is returned, it is guaranteed // that t is within [a, b] and within tolerance of a sign change. // An error is thrown if fa and fb are both positive or both negative. // // In this implementation, the binary search is interleaved // with a modified version of quadratic interpolation. // This is a C++ port of the Asymptote routine written by Charles Staats III. #line 1739 "./runarray.in" // real _findroot(callableReal *f, real a, real b, real tolerance, real fa, real fb); void gen_runarray65(stack *Stack) { real fb=vm::pop(Stack); real fa=vm::pop(Stack); real tolerance=vm::pop(Stack); real b=vm::pop(Stack); real a=vm::pop(Stack); callableReal * f=vm::pop(Stack); #line 1741 "./runarray.in" if(fa == 0.0) {Stack->push(a); return;} if(fb == 0.0) {Stack->push(b); return;} const char* oppsign="fa and fb must have opposite signs"; int sign; if(fa < 0.0) { if(fb < 0.0) error(oppsign); sign=1; } else { if(fb > 0.0) error(oppsign); fa=-fa; fb=-fb; sign=-1; } real t=a; real ft=fa; real twicetolerance=2.0*tolerance; while(b-a > tolerance) { t=(a+b)*0.5; Stack->push(t); f->call(Stack); ft=sign*pop(Stack); if(ft == 0.0) {Stack->push(t); return;} // If halving the interval already puts us within tolerance, // don't bother with the interpolation step. if(b-a >= twicetolerance) { real factor=1.0/(b-a); real q_A=2.0*(fa-2.0*ft+fb)*factor*factor; real q_B=(fb-fa)*factor; quadraticroots Q=quadraticroots(q_A,q_B,ft); // If the interpolation somehow failed, continue on to the next binary // search step. This may or may not be possible, depending on what // theoretical guarantees are provided by the quadraticroots function. real root; bool found=Q.roots > 0; if(found) { root=t+Q.t1; if(root <= a || root >= b) { if(Q.roots == 1) found=false; else { root=t+Q.t2; if(root <= a || root >= b) found=false; } } } if(found) { if(ft > 0.0) { b=t; fb=ft; } else { a=t; fa=ft; } t=root; // If the interpolated value is close to one edge of // the interval, move it farther away from the edge in // an effort to catch the root in the middle. real margin=(b-a)*1.0e-3; if(t-a < margin) t=a+2.0*(t-a); else if(b-t < margin) t=b-2.0*(b-t); Stack->push(t); f->call(Stack); ft=sign*pop(Stack); if(ft == 0.0) {Stack->push(t); return;} } } if(ft > 0.0) { b=t; fb=ft; } else if(ft < 0.0) { a=t; fa=ft; } } {Stack->push(a-(b-a)/(fb-fa)*fa); return;} } #line 1833 "./runarray.in" // real simpson(callableReal *f, real a, real b, real acc=DBL_EPSILON, real dxmax=0); void gen_runarray66(stack *Stack) { real dxmax=vm::pop(Stack,0); real acc=vm::pop(Stack,DBL_EPSILON); real b=vm::pop(Stack); real a=vm::pop(Stack); callableReal * f=vm::pop(Stack); #line 1835 "./runarray.in" real integral; if(dxmax <= 0) dxmax=fabs(b-a); callable *oldFunc=Func; Func=f; FuncStack=Stack; if(!simpson(integral,wrapFunction,a,b,acc,dxmax)) error("nesting capacity exceeded in simpson"); Func=oldFunc; {Stack->push(integral); return;} } // Compute the fast Fourier transform of a pair array #line 1848 "./runarray.in" // pairarray* fft(pairarray *a, Int sign=1); void gen_runarray67(stack *Stack) { Int sign=vm::pop(Stack,1); pairarray * a=vm::pop(Stack); #line 1849 "./runarray.in" #ifdef HAVE_LIBFFTW3 unsigned n=(unsigned) checkArray(a); array *c=new array(n); if(n) { Complex *f=utils::ComplexAlign(n); fftwpp::fft1d Forward(n,intcast(sign),f); for(size_t i=0; i < n; i++) { pair z=read(a,i); f[i]=Complex(z.getx(),z.gety()); } Forward.fft(f); for(size_t i=0; i < n; i++) { Complex z=f[i]; (*c)[i]=pair(z.real(),z.imag()); } utils::deleteAlign(f); } #else unused(a); unused(&sign); array *c=new array(0); error(installFFTW); #endif // HAVE_LIBFFTW3 {Stack->push(c); return;} } // Compute the fast Fourier transform of a 2D pair array #line 1879 "./runarray.in" // pairarray2* fft(pairarray2 *a, Int sign=1); void gen_runarray68(stack *Stack) { Int sign=vm::pop(Stack,1); pairarray2 * a=vm::pop(Stack); #line 1880 "./runarray.in" #ifdef HAVE_LIBFFTW3 size_t n=checkArray(a); size_t m=n == 0 ? 0 : checkArray(read(a,0)); array *c=new array(n); Complex *f=utils::ComplexAlign(n*m); fftwpp::fft2d Forward(n,m,intcast(sign),f); if(n) { for(size_t i=0; i < n; ++i) { array *ai=read(a,i); size_t aisize=checkArray(ai); if(aisize != m) error(rectangular); Complex *fi=f+m*i; for(size_t j=0; j < m; ++j) { pair z=read(ai,j); fi[j]=Complex(z.getx(),z.gety()); } } Forward.fft(f); for(size_t i=0; i < n; ++i) { array *ci=new array(m); (*c)[i]=ci; Complex *fi=f+m*i; for(size_t j=0; j < m; ++j) { Complex z=fi[j]; (*ci)[j]=pair(z.real(),z.imag()); } } utils::deleteAlign(f); } #else unused(a); unused(&sign); array *c=new array(0); error(installFFTW); #endif // HAVE_LIBFFTW3 {Stack->push(c); return;} } // Compute the fast Fourier transform of a 3D pair array #line 1925 "./runarray.in" // pairarray3* fft(pairarray3 *a, Int sign=1); void gen_runarray69(stack *Stack) { Int sign=vm::pop(Stack,1); pairarray3 * a=vm::pop(Stack); #line 1926 "./runarray.in" #ifdef HAVE_LIBFFTW3 size_t n=checkArray(a); array *a0=read(a,0); size_t m=n == 0 ? 0 : checkArray(a0); size_t l=m == 0 ? 0 : checkArray(read(a0,0)); array *c=new array(n); Complex *f=utils::ComplexAlign(n*m*l); fftwpp::fft3d Forward(n,m,l,intcast(sign),f); if(n) { for(size_t i=0; i < n; ++i) { array *ai=read(a,i); size_t aisize=checkArray(ai); if(aisize != m) error(rectangular); Complex *fi=f+m*l*i; for(size_t j=0; j < m; ++j) { array *aij=read(ai,j); size_t aijsize=checkArray(aij); if(aijsize != l) error(rectangular); Complex *fij=fi+l*j; for(size_t k=0; k < l; ++k) { pair z=read(aij,k); fij[k]=Complex(z.getx(),z.gety()); } } } Forward.fft(f); for(size_t i=0; i < n; ++i) { array *ci=new array(m); (*c)[i]=ci; Complex *fi=f+m*l*i; for(size_t j=0; j < m; ++j) { array *cij=new array(l); (*ci)[j]=cij; Complex *fij=fi+l*j; for(size_t k=0; k < l; ++k) { Complex z=fij[k]; (*cij)[k]=pair(z.real(),z.imag()); } } } utils::deleteAlign(f); } #else unused(a); unused(&sign); array *c=new array(0); error(installFFTW); #endif // HAVE_LIBFFTW3 {Stack->push(c); return;} } // Compute the real Schur decomposition of a 2D pair array #line 1984 "./runarray.in" // realarray3* _schur(realarray2 *a); void gen_runarray70(stack *Stack) { realarray2 * a=vm::pop(Stack); #line 1985 "./runarray.in" #ifdef HAVE_EIGEN_DENSE size_t n=checkArray(a); MatrixXd A(n,n); RealSchur schur(n); array *S=new array(2); if(n) { for(size_t i=0; i < n; ++i) { array *ai=read(a,i); size_t aisize=checkArray(ai); if(aisize != n) error(square); for(size_t j=0; j < n; ++j) A(i,j)=read(ai,j); } schur.compute(A); MatrixXd U=schur.matrixU(); MatrixXd T=schur.matrixT(); array *u=new array(n); array *t=new array(n); (*S)[0]=u; (*S)[1]=t; for(size_t i=0; i < n; ++i) { array *ui=new array(n); array *ti=new array(n); (*u)[i]=ui; (*t)[i]=ti; for(size_t j=0; j < n; ++j) { (*ui)[j]=U(i,j); (*ti)[j]=T(i,j); } } } #else unused(a); array *S=new array(0); error(installEIGEN); #endif // HAVE_EIGEN_DENSE {Stack->push(S); return;} } // Compute the Schur decomposition of a 2D pair array #line 2032 "./runarray.in" // pairarray3* _schur(pairarray2 *a); void gen_runarray71(stack *Stack) { pairarray2 * a=vm::pop(Stack); #line 2033 "./runarray.in" #ifdef HAVE_EIGEN_DENSE size_t n=checkArray(a); MatrixXcd A(n,n); ComplexSchur schur(n); array *S=new array(2); if(n) { for(size_t i=0; i < n; ++i) { array *ai=read(a,i); size_t aisize=checkArray(ai); if(aisize != n) error(square); for(size_t j=0; j < n; ++j) { pair z=read(ai,j); A(i,j)=Complex(z.getx(),z.gety()); } } schur.compute(A); MatrixXcd U=schur.matrixU(); MatrixXcd T=schur.matrixT(); array *u=new array(n); array *t=new array(n); (*S)[0]=u; (*S)[1]=t; for(size_t i=0; i < n; ++i) { array *ui=new array(n); array *ti=new array(n); (*u)[i]=ui; (*t)[i]=ti; for(size_t j=0; j < n; ++j) { Complex z=U(i,j); Complex w=T(i,j); (*ui)[j]=pair(z.real(),z.imag()); (*ti)[j]=pair(w.real(),w.imag()); } } } #else unused(a); array *S=new array(0); error(installEIGEN); #endif // HAVE_EIGEN_DENSE {Stack->push(S); return;} } #line 2083 "./runarray.in" // Intarray2* triangulate(pairarray *z); void gen_runarray72(stack *Stack) { pairarray * z=vm::pop(Stack); #line 2084 "./runarray.in" size_t nv=checkArray(z); // Call robust version of Gilles Dumoulin's port of Paul Bourke's // triangulation code. XYZ *pxyz=new XYZ[nv+3]; ITRIANGLE *V=new ITRIANGLE[4*nv]; for(size_t i=0; i < nv; ++i) { pair w=read(z,i); pxyz[i].p[0]=w.getx(); pxyz[i].p[1]=w.gety(); pxyz[i].i=(Int) i; } Int ntri; Triangulate((Int) nv,pxyz,V,ntri,true,false); size_t nt=(size_t) ntri; array *t=new array(nt); for(size_t i=0; i < nt; ++i) { array *ti=new array(3); (*t)[i]=ti; ITRIANGLE *Vi=V+i; (*ti)[0]=pxyz[Vi->p1].i; (*ti)[1]=pxyz[Vi->p2].i; (*ti)[2]=pxyz[Vi->p3].i; } delete[] V; delete[] pxyz; {Stack->push(t); return;} } #line 2118 "./runarray.in" // real norm(realarray *a); void gen_runarray73(stack *Stack) { realarray * a=vm::pop(Stack); #line 2119 "./runarray.in" size_t n=checkArray(a); real M=0.0; for(size_t i=0; i < n; ++i) { real x=fabs(vm::read(a,i)); if(x > M) M=x; } {Stack->push(M); return;} } #line 2129 "./runarray.in" // real norm(realarray2 *a); void gen_runarray74(stack *Stack) { realarray2 * a=vm::pop(Stack); #line 2130 "./runarray.in" size_t n=checkArray(a); real M=0.0; for(size_t i=0; i < n; ++i) { vm::array *ai=vm::read(a,i); size_t m=checkArray(ai); for(size_t j=0; j < m; ++j) { real a=fabs(vm::read(ai,j)); if(a > M) M=a; } } {Stack->push(M); return;} } #line 2144 "./runarray.in" // real norm(triplearray2 *a); void gen_runarray75(stack *Stack) { triplearray2 * a=vm::pop(Stack); #line 2145 "./runarray.in" size_t n=checkArray(a); real M=0.0; for(size_t i=0; i < n; ++i) { vm::array *ai=vm::read(a,i); size_t m=checkArray(ai); for(size_t j=0; j < m; ++j) { real a=vm::read(ai,j).abs2(); if(a > M) M=a; } } {Stack->push(sqrt(M)); return;} } #line 2159 "./runarray.in" // real change2(triplearray2 *a); void gen_runarray76(stack *Stack) { triplearray2 * a=vm::pop(Stack); #line 2160 "./runarray.in" size_t n=checkArray(a); if(n == 0) {Stack->push(0.0); return;} vm::array *a0=vm::read(a,0); size_t m=checkArray(a0); if(m == 0) {Stack->push(0.0); return;} triple a00=vm::read(a0,0); real M=0.0; for(size_t i=0; i < n; ++i) { vm::array *ai=vm::read(a,i); size_t m=checkArray(ai); for(size_t j=0; j < m; ++j) { real a=(vm::read(ai,j)-a00).abs2(); if(a > M) M=a; } } {Stack->push(M); return;} } #line 2181 "./runarray.in" // triple minbezier(triplearray2 *P, triple b); void gen_runarray77(stack *Stack) { triple b=vm::pop(Stack); triplearray2 * P=vm::pop(Stack); #line 2182 "./runarray.in" size_t N; real *A=copyTripleArray2Components(P,N); bound_double *B=bounddouble(N); b=triple(B(A,::min,b.getx(),Fuzz*norm(A,N),maxdepth), B(A+N,::min,b.gety(),Fuzz*norm(A+N,N),maxdepth), B(A+2*N,::min,b.getz(),Fuzz*norm(A+2*N,N),maxdepth)); delete[] A; {Stack->push(b); return;} } #line 2193 "./runarray.in" // triple maxbezier(triplearray2 *P, triple b); void gen_runarray78(stack *Stack) { triple b=vm::pop(Stack); triplearray2 * P=vm::pop(Stack); #line 2194 "./runarray.in" size_t N; real *A=copyTripleArray2Components(P,N); bound_double *B=bounddouble(N); b=triple(B(A,::max,b.getx(),Fuzz*norm(A,N),maxdepth), B(A+N,::max,b.gety(),Fuzz*norm(A+N,N),maxdepth), B(A+2*N,::max,b.getz(),Fuzz*norm(A+2*N,N),maxdepth)); delete[] A; {Stack->push(b); return;} } #line 2205 "./runarray.in" // pair minratio(triplearray2 *P, pair b); void gen_runarray79(stack *Stack) { pair b=vm::pop(Stack); triplearray2 * P=vm::pop(Stack); #line 2206 "./runarray.in" size_t N; triple *A=copyTripleArray2C(P,N); real fuzz=Fuzz*norm(A,N); bound_triple *B=boundtriple(N); b=pair(B(A,::min,xratio,b.getx(),fuzz,maxdepth), B(A,::min,yratio,b.gety(),fuzz,maxdepth)); delete[] A; {Stack->push(b); return;} } #line 2217 "./runarray.in" // pair maxratio(triplearray2 *P, pair b); void gen_runarray80(stack *Stack) { pair b=vm::pop(Stack); triplearray2 * P=vm::pop(Stack); #line 2218 "./runarray.in" size_t N; triple *A=copyTripleArray2C(P,N); bound_triple *B=boundtriple(N); real fuzz=Fuzz*norm(A,N); b=pair(B(A,::max,xratio,b.getx(),fuzz,maxdepth), B(A,::max,yratio,b.gety(),fuzz,maxdepth)); delete[] A; {Stack->push(b); return;} } #line 2229 "./runarray.in" // realarray* _projection(); void gen_runarray81(stack *Stack) { #line 2230 "./runarray.in" #ifdef HAVE_GL array *a=new array(14); gl::projection P=gl::camera(); size_t k=0; (*a)[k++]=P.orthographic ? 1.0 : 0.0; triple camera=P.camera; (*a)[k++]=camera.getx(); (*a)[k++]=camera.gety(); (*a)[k++]=camera.getz(); triple up=P.up; (*a)[k++]=up.getx(); (*a)[k++]=up.gety(); (*a)[k++]=up.getz(); triple target=P.target; (*a)[k++]=target.getx(); (*a)[k++]=target.gety(); (*a)[k++]=target.getz(); (*a)[k++]=P.zoom; (*a)[k++]=P.angle; (*a)[k++]=P.viewportshift.getx(); (*a)[k++]=P.viewportshift.gety(); #endif {Stack->push(new array(0)); return;} } } // namespace run namespace trans { void gen_runarray_venv(venv &ve) { #line 609 "./runarray.in" REGISTER_BLTIN(run::emptyArray,"emptyArray"); #line 615 "./runarray.in" REGISTER_BLTIN(run::newDeepArray,"newDeepArray"); #line 637 "./runarray.in" REGISTER_BLTIN(run::newInitializedArray,"newInitializedArray"); #line 652 "./runarray.in" REGISTER_BLTIN(run::newAppendedArray,"newAppendedArray"); #line 668 "./runarray.in" REGISTER_BLTIN(run::copyArrayValue,"copyArrayValue"); #line 680 "./runarray.in" REGISTER_BLTIN(run::copyArray,"copyArray"); #line 692 "./runarray.in" REGISTER_BLTIN(run::arrayRead,"arrayRead"); #line 704 "./runarray.in" REGISTER_BLTIN(run::arraySliceRead,"arraySliceRead"); #line 711 "./runarray.in" REGISTER_BLTIN(run::arraySliceReadToEnd,"arraySliceReadToEnd"); #line 719 "./runarray.in" REGISTER_BLTIN(run::arrayArrayRead,"arrayArrayRead"); #line 728 "./runarray.in" REGISTER_BLTIN(run::arrayWrite,"arrayWrite"); #line 745 "./runarray.in" REGISTER_BLTIN(run::arraySliceWrite,"arraySliceWrite"); #line 753 "./runarray.in" REGISTER_BLTIN(run::arraySliceWriteToEnd,"arraySliceWriteToEnd"); #line 761 "./runarray.in" REGISTER_BLTIN(run::arrayLength,"arrayLength"); #line 767 "./runarray.in" REGISTER_BLTIN(run::arrayKeys,"arrayKeys"); #line 782 "./runarray.in" REGISTER_BLTIN(run::arrayCyclicFlag,"arrayCyclicFlag"); #line 789 "./runarray.in" REGISTER_BLTIN(run::arraySetCyclicFlag,"arraySetCyclicFlag"); #line 796 "./runarray.in" REGISTER_BLTIN(run::arrayInitializedHelper,"arrayInitializedHelper"); #line 807 "./runarray.in" REGISTER_BLTIN(run::arrayInitialized,"arrayInitialized"); #line 813 "./runarray.in" REGISTER_BLTIN(run::arrayCyclicHelper,"arrayCyclicHelper"); #line 820 "./runarray.in" REGISTER_BLTIN(run::arrayCyclic,"arrayCyclic"); #line 826 "./runarray.in" REGISTER_BLTIN(run::arrayPushHelper,"arrayPushHelper"); #line 834 "./runarray.in" REGISTER_BLTIN(run::arrayPush,"arrayPush"); #line 840 "./runarray.in" REGISTER_BLTIN(run::arrayAppendHelper,"arrayAppendHelper"); #line 849 "./runarray.in" REGISTER_BLTIN(run::arrayAppend,"arrayAppend"); #line 855 "./runarray.in" REGISTER_BLTIN(run::arrayPopHelper,"arrayPopHelper"); #line 864 "./runarray.in" REGISTER_BLTIN(run::arrayPop,"arrayPop"); #line 870 "./runarray.in" REGISTER_BLTIN(run::arrayInsertHelper,"arrayInsertHelper"); #line 881 "./runarray.in" REGISTER_BLTIN(run::arrayInsert,"arrayInsert"); #line 887 "./runarray.in" REGISTER_BLTIN(run::arrayDelete,"arrayDelete"); #line 893 "./runarray.in" REGISTER_BLTIN(run::arrayAlias,"arrayAlias"); #line 898 "./runarray.in" REGISTER_BLTIN(run::arrayIntArray,"arrayIntArray"); #line 916 "./runarray.in" addFunc(ve, run::gen_runarray32, IntArray(), SYM(complement), formal(IntArray(), SYM(a), false, false), formal(primInt(), SYM(n), false, false)); #line 935 "./runarray.in" REGISTER_BLTIN(run::arraySequence,"arraySequence"); #line 948 "./runarray.in" addFunc(ve, run::gen_runarray34, IntArray(), SYM(sequence), formal(primInt(), SYM(n), false, false)); #line 959 "./runarray.in" REGISTER_BLTIN(run::arrayFunction,"arrayFunction"); #line 972 "./runarray.in" REGISTER_BLTIN(run::arraySort,"arraySort"); #line 982 "./runarray.in" REGISTER_BLTIN(run::arraySearch,"arraySearch"); #line 1001 "./runarray.in" addFunc(ve, run::gen_runarray38, primBoolean(), SYM(all), formal(booleanArray(), SYM(a), false, false)); #line 1010 "./runarray.in" addFunc(ve, run::gen_runarray39, booleanArray(), SYM_LOGNOT, formal(booleanArray(), SYM(a), false, false)); #line 1019 "./runarray.in" addFunc(ve, run::gen_runarray40, primInt(), SYM(sum), formal(booleanArray(), SYM(a), false, false)); #line 1028 "./runarray.in" REGISTER_BLTIN(run::arrayConcat,"arrayConcat"); #line 1056 "./runarray.in" REGISTER_BLTIN(run::array2Transpose,"array2Transpose"); #line 1082 "./runarray.in" REGISTER_BLTIN(run::array3Transpose,"array3Transpose"); #line 1169 "./runarray.in" addFunc(ve, run::gen_runarray44, primInt(), SYM(find), formal(booleanArray(), SYM(a), false, false), formal(primInt(), SYM(n), true, false)); #line 1188 "./runarray.in" addFunc(ve, run::gen_runarray45, IntArray(), SYM(findall), formal(booleanArray(), SYM(a), false, false)); #line 1201 "./runarray.in" REGISTER_BLTIN(run::arrayConditional,"arrayConditional"); #line 1227 "./runarray.in" addFunc(ve, run::gen_runarray47, realArray2(), SYM(identity), formal(primInt(), SYM(n), false, false)); #line 1233 "./runarray.in" addFunc(ve, run::gen_runarray48, realArray2(), SYM(inverse), formal(realArray2(), SYM(a), false, false)); #line 1245 "./runarray.in" addFunc(ve, run::gen_runarray49, realArray(), SYM(solve), formal(realArray2(), SYM(a), false, false), formal(realArray(), SYM(b), false, false), formal(primBoolean(), SYM(warn), true, false)); #line 1298 "./runarray.in" addFunc(ve, run::gen_runarray50, realArray2(), SYM(solve), formal(realArray2(), SYM(a), false, false), formal(realArray2(), SYM(b), false, false), formal(primBoolean(), SYM(warn), true, false)); #line 1363 "./runarray.in" addFunc(ve, run::gen_runarray51, primReal(), SYM(determinant), formal(realArray2(), SYM(a), false, false)); #line 1380 "./runarray.in" addFunc(ve, run::gen_runarray52, realArray(), SYM_TIMES, formal(realArray2(), SYM(a), false, false), formal(realArray(), SYM(b), false, false)); #line 1399 "./runarray.in" addFunc(ve, run::gen_runarray53, realArray(), SYM_TIMES, formal(realArray(), SYM(a), false, false), formal(realArray2(), SYM(b), false, false)); #line 1428 "./runarray.in" addFunc(ve, run::gen_runarray54, IntArray2(), SYM_TIMES, formal(IntArray2(), SYM(a), false, false), formal(IntArray2(), SYM(b), false, false)); #line 1433 "./runarray.in" addFunc(ve, run::gen_runarray55, realArray2(), SYM_TIMES, formal(realArray2(), SYM(a), false, false), formal(realArray2(), SYM(b), false, false)); #line 1438 "./runarray.in" addFunc(ve, run::gen_runarray56, pairArray2(), SYM_TIMES, formal(pairArray2(), SYM(a), false, false), formal(pairArray2(), SYM(b), false, false)); #line 1443 "./runarray.in" addFunc(ve, run::gen_runarray57, primTriple(), SYM_TIMES, formal(realArray2(), SYM(t), false, false), formal(primTriple(), SYM(v), false, false)); #line 1448 "./runarray.in" addFunc(ve, run::gen_runarray58, realArray2(), SYM(AtA), formal(realArray2(), SYM(a), false, false)); #line 1453 "./runarray.in" addFunc(ve, run::gen_runarray59, primPair(), SYM(project), formal(primTriple(), SYM(v), false, false), formal(realArray2(), SYM(t), false, false)); #line 1478 "./runarray.in" addFunc(ve, run::gen_runarray60, primReal(), SYM(dot), formal(realArray(), SYM(a), false, false), formal(realArray(), SYM(b), false, false)); #line 1488 "./runarray.in" addFunc(ve, run::gen_runarray61, primPair(), SYM(dot), formal(pairArray(), SYM(a), false, false), formal(pairArray(), SYM(b), false, false)); #line 1498 "./runarray.in" addFunc(ve, run::gen_runarray62, realArray(), SYM(tridiagonal), formal(realArray(), SYM(a), false, false), formal(realArray(), SYM(b), false, false), formal(realArray(), SYM(c), false, false), formal(realArray(), SYM(f), false, false)); #line 1602 "./runarray.in" addFunc(ve, run::gen_runarray63, primReal(), SYM(newton), formal(primInt(), SYM(iterations), true, false), formal(realRealFunction(), SYM(f), false, false), formal(realRealFunction(), SYM(fprime), false, false), formal(primReal(), SYM(x), false, false), formal(primBoolean(), SYM(verbose), true, false)); #line 1649 "./runarray.in" addFunc(ve, run::gen_runarray64, primReal(), SYM(newton), formal(primInt(), SYM(iterations), true, false), formal(realRealFunction(), SYM(f), false, false), formal(realRealFunction(), SYM(fprime), false, false), formal(primReal(), SYM(x1), false, false), formal(primReal(), SYM(x2), false, false), formal(primBoolean(), SYM(verbose), true, false)); #line 1731 "./runarray.in" addFunc(ve, run::gen_runarray65, primReal(), SYM(_findroot), formal(realRealFunction(), SYM(f), false, false), formal(primReal(), SYM(a), false, false), formal(primReal(), SYM(b), false, false), formal(primReal(), SYM(tolerance), false, false), formal(primReal(), SYM(fa), false, false), formal(primReal(), SYM(fb), false, false)); #line 1833 "./runarray.in" addFunc(ve, run::gen_runarray66, primReal(), SYM(simpson), formal(realRealFunction(), SYM(f), false, false), formal(primReal(), SYM(a), false, false), formal(primReal(), SYM(b), false, false), formal(primReal(), SYM(acc), true, false), formal(primReal(), SYM(dxmax), true, false)); #line 1847 "./runarray.in" addFunc(ve, run::gen_runarray67, pairArray(), SYM(fft), formal(pairArray(), SYM(a), false, false), formal(primInt(), SYM(sign), true, false)); #line 1878 "./runarray.in" addFunc(ve, run::gen_runarray68, pairArray2(), SYM(fft), formal(pairArray2(), SYM(a), false, false), formal(primInt(), SYM(sign), true, false)); #line 1924 "./runarray.in" addFunc(ve, run::gen_runarray69, pairArray3(), SYM(fft), formal(pairArray3(), SYM(a), false, false), formal(primInt(), SYM(sign), true, false)); #line 1983 "./runarray.in" addFunc(ve, run::gen_runarray70, realArray3(), SYM(_schur), formal(realArray2(), SYM(a), false, false)); #line 2031 "./runarray.in" addFunc(ve, run::gen_runarray71, pairArray3(), SYM(_schur), formal(pairArray2(), SYM(a), false, false)); #line 2083 "./runarray.in" addFunc(ve, run::gen_runarray72, IntArray2(), SYM(triangulate), formal(pairArray(), SYM(z), false, false)); #line 2118 "./runarray.in" addFunc(ve, run::gen_runarray73, primReal(), SYM(norm), formal(realArray(), SYM(a), false, false)); #line 2129 "./runarray.in" addFunc(ve, run::gen_runarray74, primReal(), SYM(norm), formal(realArray2(), SYM(a), false, false)); #line 2144 "./runarray.in" addFunc(ve, run::gen_runarray75, primReal(), SYM(norm), formal(tripleArray2(), SYM(a), false, false)); #line 2159 "./runarray.in" addFunc(ve, run::gen_runarray76, primReal(), SYM(change2), formal(tripleArray2(), SYM(a), false, false)); #line 2181 "./runarray.in" addFunc(ve, run::gen_runarray77, primTriple(), SYM(minbezier), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(b), false, false)); #line 2193 "./runarray.in" addFunc(ve, run::gen_runarray78, primTriple(), SYM(maxbezier), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(b), false, false)); #line 2205 "./runarray.in" addFunc(ve, run::gen_runarray79, primPair(), SYM(minratio), formal(tripleArray2(), SYM(p), false, false), formal(primPair(), SYM(b), false, false)); #line 2217 "./runarray.in" addFunc(ve, run::gen_runarray80, primPair(), SYM(maxratio), formal(tripleArray2(), SYM(p), false, false), formal(primPair(), SYM(b), false, false)); #line 2229 "./runarray.in" addFunc(ve, run::gen_runarray81, realArray(), SYM(_projection)); } } // namespace trans asymptote-3.05/constructor.cc0000644000000000000000000000713115031566105015064 0ustar rootroot/***** * constructor.cc * Andy Hammerlindl 2007/05/12 * * Using * * void operator init() * * as a field in the definition structure named Foo implicitly creates a * function that could be explicitly defined with code similar to * * static Foo Foo() { * Foo a=new Foo; * a.operator init(); * return a; * } * * This function is usable within further code in the structure definition and, * after the end of the structure definition, is carried over into the enclosing * scope so that it lasts as long as the type definition. *****/ #include "stack.h" #include "entry.h" #include "coenv.h" #include "dec.h" #include "newexp.h" namespace absyntax { using namespace trans; using namespace types; // Defined in dec.cc. varEntry *makeVarEntry(position pos, coenv &e, record *r, types::ty *t); bool definesImplicitConstructor(coenv &e, record *r, varEntry *v, symbol id) { if (id == symbol::initsym && r != 0 && v->getType()->kind == ty_function && e.c.isStatic() == false && e.c.isTopLevel() == false) { function *ft=dynamic_cast(v->getType()); if (ft->getResult()->kind == ty_void) return true; } return false; } // Given the coenv of the body of the constructor, encode the neccessary // instructions to make a new initialized object. void transConstructorBody(position pos, coenv &e, record *r, varEntry *init) { assert(r); assert(init); // Create a varEntry to hold the new object. Foo a; varEntry *v=makeVarEntry(pos, e, 0 /* not a field */, r); // Initialize the object. a=new Foo; newRecordExp::transFromTyEntry(pos, e, new tyEntry(r, 0, 0, nullPos)); v->encode(WRITE, pos, e.c); e.c.encodePop(); // Push the args onto the stack. size_t numArgs=init->getSignature()->getNumFormals(); for (size_t i=0; iencode(READ, pos, e.c); } // Push the object on the stack. v->encode(READ, pos, e.c); // Call the 'operator init' field of the object. init->encode(action::CALL, pos, e.c, v->getLevel()); // Push the object again. v->encode(READ, pos, e.c); // Return the initialized object. e.c.encode(inst::ret); } varEntry *constructorFromInitializer(position pos, coenv &e, record *r, varEntry *init) { assert(r); types::function *ft=new types::function(r, init->getSignature()); ostringstream out; ft->printVar(out, symbol::trans("")); // Create a new function environment. coder fc = e.c.newFunction(pos, out.str(), ft); coenv fe(fc,e.e); // Translate the function. fe.e.beginScope(); transConstructorBody(pos, fe, r, init); fe.e.endScope(); // Put an instance of the new function on the stack. vm::lambda *l = fe.c.close(); e.c.encode(inst::pushclosure); e.c.encode(inst::makefunc, l); // Save it into a varEntry. varEntry *v=makeVarEntry(pos, e, r, ft); v->encode(WRITE, pos, e.c); e.c.encodePop(); return v; } void addConstructorFromInitializer(position pos, coenv &e, record *r, varEntry *init) { assert(r); // Constructors are declared statically. e.c.pushModifier(EXPLICIT_STATIC); varEntry *v=constructorFromInitializer(pos, e, r, init); // Add the constructor function under the same name as the record. addVar(e, r, v, r->getName()); // Add to the "post definition environment" of the record, so it will also be // added to the enclosing scope when the record definition ends. r->postdefenv.addVar(r->getName(), v); e.c.popModifier(); } } // namespace absyntax asymptote-3.05/INSTALL0000644000000000000000000002432015031566105013220 0ustar rootrootCompiling Asymptote from a Source Release ========================================= To compile and install Asymptote version x.xx from a source release: gunzip asymptote-x.xx.src.tgz tar -xf asymptote-x.xx.src.tar cd asymptote-x.xx ./configure make all make install The last command requires root privileges. To install without root privileges you should change the first line to ./configure --prefix=$HOME/asymptote If you get errors from a broken texinfo or pdftex installation, simply put https://asymptote.sourceforge.io/asymptote.pdf in the doc directory and repeat the commands make all and make install. For a list of configure options, type configure --help See also the generic configure instructions below. Compiling Asymptote from Git Developmental Source Code ============================================================= To compile from Git developmental source code: git clone https://github.com/vectorgraphics/asymptote cd asymptote ./autogen.sh ./configure make all make install Optional packages: * Fast Fourier Transform library https://www.fftw.org/ Version requirement >= 3.0 * The GNU Scientific Library for numerical analysis: https://www.gnu.org/software/gsl/ ***************************************** Generic Configure Instructions (advanced) ***************************************** The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Here is a another example: /bin/bash ./configure CONFIG_SHELL=/bin/bash Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent configuration-related scripts to be executed by `/bin/bash'. `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other options. Run `configure --help' for more details. asymptote-3.05/runarray.h0000644000000000000000000000264615031566132014212 0ustar rootroot/***** Autogenerated from runarray.in; changes will be overwritten *****/ #pragma once namespace run { void emptyArray(vm::stack *); void newDeepArray(vm::stack *); void newInitializedArray(vm::stack *); void newAppendedArray(vm::stack *); void copyArrayValue(vm::stack *); void copyArray(vm::stack *); void arrayRead(vm::stack *); void arraySliceRead(vm::stack *); void arraySliceReadToEnd(vm::stack *); void arrayArrayRead(vm::stack *); void arrayWrite(vm::stack *); void arraySliceWrite(vm::stack *); void arraySliceWriteToEnd(vm::stack *); void arrayLength(vm::stack *); void arrayKeys(vm::stack *); void arrayCyclicFlag(vm::stack *); void arraySetCyclicFlag(vm::stack *); void arrayInitializedHelper(vm::stack *); void arrayInitialized(vm::stack *); void arrayCyclicHelper(vm::stack *); void arrayCyclic(vm::stack *); void arrayPushHelper(vm::stack *); void arrayPush(vm::stack *); void arrayAppendHelper(vm::stack *); void arrayAppend(vm::stack *); void arrayPopHelper(vm::stack *); void arrayPop(vm::stack *); void arrayInsertHelper(vm::stack *); void arrayInsert(vm::stack *); void arrayDelete(vm::stack *); void arrayAlias(vm::stack *); void arrayIntArray(vm::stack *); void arraySequence(vm::stack *); void arrayFunction(vm::stack *); void arraySort(vm::stack *); void arraySearch(vm::stack *); void arrayConcat(vm::stack *); void array2Transpose(vm::stack *); void array3Transpose(vm::stack *); void arrayConditional(vm::stack *); } asymptote-3.05/virtualfieldaccess.h0000644000000000000000000000443015031566105016214 0ustar rootroot/***** * virtualfieldaccess.h * Andy Hammerlindl 2009/07/23 * * Implements the access subclass used to read and write virtual fields. *****/ #include "access.h" namespace trans { // In code such as // pair z; write(z.x); // to evaluate the expression z.x, first z is pushed onto the stack, then as // it is not a record, instead of accessing its field in the usual way for a // record, a builtin function is called which pops z off the stack and // replaces it with z.x. virtualFieldAccess provides the access for the // virtualField 'x', and 'getter' is the access to the builtin function which // replaces z with z.x. // // If the virtual field z.x were mutable, then setter would access a builtin // function, which pops a real number and then z off of the stack, sets the // z.x to that new value, and puts the value back on the stack. In this case, // pairs are immutable, but other virtual fields may not be. // // Some virtual fields are functions, such as a.push for an array a. In rare // cases, code such as // void f(int) = a.push; // requires an object representing a.push, and so a getter for the field must // be provided. Most of the time, however, these fields are just called. // As an optimization, a caller access can be provided. If this access is // given, then a call to the virtualFieldAccess just translates into a call to // caller. class virtualFieldAccess : public access { access *getter; access *setter; access *caller; public: virtualFieldAccess(access *getter, access *setter = 0, access *caller = 0) : getter(getter), setter(setter) {} virtualFieldAccess(vm::bltin getter, vm::bltin setter = 0, vm::bltin caller = 0) : getter(new bltinAccess(getter)), setter(setter ? new bltinAccess(setter) : 0), caller(caller ? new bltinAccess(caller) : 0) {} void encode(action act, position pos, coder &e); void encode(action act, position pos, coder &e, frame *); // Attempting to WRITE a read-only field will give an error, but if the // error is caught at a higher level, a better error message (including the // name of the field) can be given. This function allows such handling. bool readonly() { return (bool)setter; } }; } // namespace trans asymptote-3.05/runpath3d.cc0000644000000000000000000006256415031566132014422 0ustar rootroot/***** Autogenerated from runpath3d.in; changes will be overwritten *****/ #line 1 "./runtimebase.in" /***** * runtimebase.in * Andy Hammerlindl 2009/07/28 * * Common declarations needed for all code-generating .in files. * *****/ #line 1 "./runpath3d.in" /***** * runpath3.in * * Runtime functions for path3 operations. * *****/ #line 23 "./runtimebase.in" #include "stack.h" #include "types.h" #include "builtin.h" #include "entry.h" #include "errormsg.h" #include "array.h" #include "triple.h" #include "callable.h" #include "opsymbols.h" using vm::stack; using vm::error; using vm::array; using vm::read; using vm::callable; using types::formal; using types::function; using camp::triple; #define PRIMITIVE(name,Name,asyName) using types::prim##Name; #include #undef PRIMITIVE void unused(void *); namespace run { typedef double real; array *copyArray(array *a); array *copyArray2(array *a); array *copyArray3(array *a); double *copyTripleArray2Components(array *a, size_t &N, GCPlacement placement=NoGC); triple *copyTripleArray2C(array *a, size_t &N, GCPlacement placement=NoGC); } function *realRealFunction(); #define CURRENTPEN processData().currentpen #line 17 "runpath3d.in" #include "path3.h" #include "array.h" #include "drawsurface.h" #include "predicates.h" using namespace camp; using namespace vm; typedef array boolarray; typedef array realarray; typedef array realarray2; typedef array triplearray; typedef array triplearray2; using types::booleanArray; using types::realArray; using types::realArray2; using types::tripleArray; using types::tripleArray2; // Autogenerated routines: #ifndef NOSYM #include "runpath3d.symbols.h" #endif namespace run { #line 40 "./runpath3d.in" // path3 path3(triplearray *pre, triplearray *point, triplearray *post, boolarray *straight, bool cyclic); void gen_runpath3d0(stack *Stack) { bool cyclic=vm::pop(Stack); boolarray * straight=vm::pop(Stack); triplearray * post=vm::pop(Stack); triplearray * point=vm::pop(Stack); triplearray * pre=vm::pop(Stack); #line 42 "./runpath3d.in" size_t n=checkArrays(pre,point); checkEqual(n,checkArray(post)); checkEqual(n,checkArray(straight)); mem::vector nodes(n); for(size_t i=0; i < n; ++i) { nodes[i].pre=read(pre,i); nodes[i].point=read(point,i); nodes[i].post=read(post,i); nodes[i].straight=read(straight,i); } {Stack->push(path3(nodes,(Int) n,cyclic)); return;} } #line 57 "./runpath3d.in" void nullPath3(stack *Stack) { #line 58 "./runpath3d.in" {Stack->push(nullpath3); return;} } #line 62 "./runpath3d.in" // bool ==(path3 a, path3 b); void gen_runpath3d2(stack *Stack) { path3 b=vm::pop(Stack); path3 a=vm::pop(Stack); #line 63 "./runpath3d.in" {Stack->push(a == b); return;} } #line 67 "./runpath3d.in" // bool !=(path3 a, path3 b); void gen_runpath3d3(stack *Stack) { path3 b=vm::pop(Stack); path3 a=vm::pop(Stack); #line 68 "./runpath3d.in" {Stack->push(!(a == b)); return;} } #line 72 "./runpath3d.in" // triple point(path3 p, Int t); void gen_runpath3d4(stack *Stack) { Int t=vm::pop(Stack); path3 p=vm::pop(Stack); #line 73 "./runpath3d.in" {Stack->push(p.point((Int) t)); return;} } #line 77 "./runpath3d.in" // triple point(path3 p, real t); void gen_runpath3d5(stack *Stack) { real t=vm::pop(Stack); path3 p=vm::pop(Stack); #line 78 "./runpath3d.in" {Stack->push(p.point(t)); return;} } #line 82 "./runpath3d.in" // triple precontrol(path3 p, Int t); void gen_runpath3d6(stack *Stack) { Int t=vm::pop(Stack); path3 p=vm::pop(Stack); #line 83 "./runpath3d.in" {Stack->push(p.precontrol((Int) t)); return;} } #line 87 "./runpath3d.in" // triple precontrol(path3 p, real t); void gen_runpath3d7(stack *Stack) { real t=vm::pop(Stack); path3 p=vm::pop(Stack); #line 88 "./runpath3d.in" {Stack->push(p.precontrol(t)); return;} } #line 92 "./runpath3d.in" // triple postcontrol(path3 p, Int t); void gen_runpath3d8(stack *Stack) { Int t=vm::pop(Stack); path3 p=vm::pop(Stack); #line 93 "./runpath3d.in" {Stack->push(p.postcontrol((Int) t)); return;} } #line 97 "./runpath3d.in" // triple postcontrol(path3 p, real t); void gen_runpath3d9(stack *Stack) { real t=vm::pop(Stack); path3 p=vm::pop(Stack); #line 98 "./runpath3d.in" {Stack->push(p.postcontrol(t)); return;} } #line 102 "./runpath3d.in" // triple dir(path3 p, Int t, Int sign=0, bool normalize=true); void gen_runpath3d10(stack *Stack) { bool normalize=vm::pop(Stack,true); Int sign=vm::pop(Stack,0); Int t=vm::pop(Stack); path3 p=vm::pop(Stack); #line 103 "./runpath3d.in" {Stack->push(p.dir(t,sign,normalize)); return;} } #line 107 "./runpath3d.in" // triple dir(path3 p, real t, bool normalize=true); void gen_runpath3d11(stack *Stack) { bool normalize=vm::pop(Stack,true); real t=vm::pop(Stack); path3 p=vm::pop(Stack); #line 108 "./runpath3d.in" {Stack->push(p.dir(t,normalize)); return;} } #line 112 "./runpath3d.in" // triple accel(path3 p, Int t, Int sign=0); void gen_runpath3d12(stack *Stack) { Int sign=vm::pop(Stack,0); Int t=vm::pop(Stack); path3 p=vm::pop(Stack); #line 113 "./runpath3d.in" {Stack->push(p.accel(t,sign)); return;} } #line 117 "./runpath3d.in" // triple accel(path3 p, real t); void gen_runpath3d13(stack *Stack) { real t=vm::pop(Stack); path3 p=vm::pop(Stack); #line 118 "./runpath3d.in" {Stack->push(p.accel(t)); return;} } #line 122 "./runpath3d.in" // real radius(path3 p, real t); void gen_runpath3d14(stack *Stack) { real t=vm::pop(Stack); path3 p=vm::pop(Stack); #line 123 "./runpath3d.in" triple v=p.dir(t,false); triple a=p.accel(t); real d=dot(a,v); real v2=v.abs2(); real a2=a.abs2(); real denom=v2*a2-d*d; real r=v2*sqrt(v2); {Stack->push(denom > 0 ? r/sqrt(denom) : 0.0); return;} } #line 134 "./runpath3d.in" // real radius(triple z0, triple c0, triple c1, triple z1, real t); void gen_runpath3d15(stack *Stack) { real t=vm::pop(Stack); triple z1=vm::pop(Stack); triple c1=vm::pop(Stack); triple c0=vm::pop(Stack); triple z0=vm::pop(Stack); #line 135 "./runpath3d.in" triple v=(3.0*(z1-z0)+9.0*(c0-c1))*t*t+(6.0*(z0+c1)-12.0*c0)*t+3.0*(c0-z0); triple a=6.0*(z1-z0+3.0*(c0-c1))*t+6.0*(z0+c1)-12.0*c0; real d=dot(a,v); real v2=v.abs2(); real a2=a.abs2(); real denom=v2*a2-d*d; real r=v2*sqrt(v2); {Stack->push(denom > 0 ? r/sqrt(denom) : 0.0); return;} } #line 146 "./runpath3d.in" // path3 reverse(path3 p); void gen_runpath3d16(stack *Stack) { path3 p=vm::pop(Stack); #line 147 "./runpath3d.in" {Stack->push(p.reverse()); return;} } #line 151 "./runpath3d.in" // path3 subpath(path3 p, Int a, Int b); void gen_runpath3d17(stack *Stack) { Int b=vm::pop(Stack); Int a=vm::pop(Stack); path3 p=vm::pop(Stack); #line 152 "./runpath3d.in" {Stack->push(p.subpath((Int) a, (Int) b)); return;} } #line 156 "./runpath3d.in" // path3 subpath(path3 p, real a, real b); void gen_runpath3d18(stack *Stack) { real b=vm::pop(Stack); real a=vm::pop(Stack); path3 p=vm::pop(Stack); #line 157 "./runpath3d.in" {Stack->push(p.subpath(a,b)); return;} } #line 161 "./runpath3d.in" // Int length(path3 p); void gen_runpath3d19(stack *Stack) { path3 p=vm::pop(Stack); #line 162 "./runpath3d.in" {Stack->push(p.length()); return;} } #line 166 "./runpath3d.in" // bool cyclic(path3 p); void gen_runpath3d20(stack *Stack) { path3 p=vm::pop(Stack); #line 167 "./runpath3d.in" {Stack->push(p.cyclic()); return;} } #line 171 "./runpath3d.in" // bool straight(path3 p, Int t); void gen_runpath3d21(stack *Stack) { Int t=vm::pop(Stack); path3 p=vm::pop(Stack); #line 172 "./runpath3d.in" {Stack->push(p.straight(t)); return;} } #line 176 "./runpath3d.in" // path3 unstraighten(path3 p); void gen_runpath3d22(stack *Stack) { path3 p=vm::pop(Stack); #line 177 "./runpath3d.in" {Stack->push(p.unstraighten()); return;} } // return the maximum distance squared of points c0 and c1 from // the respective internal control points of z0--z1. #line 183 "./runpath3d.in" // real straightness(triple z0, triple c0, triple c1, triple z1); void gen_runpath3d23(stack *Stack) { triple z1=vm::pop(Stack); triple c1=vm::pop(Stack); triple c0=vm::pop(Stack); triple z0=vm::pop(Stack); #line 184 "./runpath3d.in" {Stack->push(Straightness(z0,c0,c1,z1)); return;} } // return the straightness of segment i of path3 g. #line 189 "./runpath3d.in" // real straightness(path3 p, Int t); void gen_runpath3d24(stack *Stack) { Int t=vm::pop(Stack); path3 p=vm::pop(Stack); #line 190 "./runpath3d.in" if(p.straight(t)) {Stack->push(0); return;} {Stack->push(Straightness(p.point(t),p.postcontrol(t),p.precontrol(t+1), p.point(t+1))); return;} } #line 196 "./runpath3d.in" // bool piecewisestraight(path3 p); void gen_runpath3d25(stack *Stack) { path3 p=vm::pop(Stack); #line 197 "./runpath3d.in" {Stack->push(p.piecewisestraight()); return;} } #line 201 "./runpath3d.in" // real arclength(path3 p); void gen_runpath3d26(stack *Stack) { path3 p=vm::pop(Stack); #line 202 "./runpath3d.in" {Stack->push(p.arclength()); return;} } #line 206 "./runpath3d.in" // real arclength(triple z0, triple c0, triple c1, triple z1); void gen_runpath3d27(stack *Stack) { triple z1=vm::pop(Stack); triple c1=vm::pop(Stack); triple c0=vm::pop(Stack); triple z0=vm::pop(Stack); #line 207 "./runpath3d.in" {Stack->push(arcLength(z0,c0,c1,z1)); return;} } #line 211 "./runpath3d.in" // real arctime(path3 p, real dval); void gen_runpath3d28(stack *Stack) { real dval=vm::pop(Stack); path3 p=vm::pop(Stack); #line 212 "./runpath3d.in" {Stack->push(p.arctime(dval)); return;} } #line 216 "./runpath3d.in" // realarray* intersect(path3 p, path3 q, real fuzz=-1); void gen_runpath3d29(stack *Stack) { real fuzz=vm::pop(Stack,-1); path3 q=vm::pop(Stack); path3 p=vm::pop(Stack); #line 217 "./runpath3d.in" bool exact=fuzz <= 0.0; if(fuzz < 0) fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())), ::max(length(q.max()),length(q.min()))); std::vector S,T; real s,t; if(intersections(s,t,S,T,p,q,fuzz,true,exact)) { array *V=new array(2); (*V)[0]=s; (*V)[1]=t; {Stack->push(V); return;} } else {Stack->push(new array(0)); return;} } #line 234 "./runpath3d.in" // realarray2* intersections(path3 p, path3 q, real fuzz=-1); void gen_runpath3d30(stack *Stack) { real fuzz=vm::pop(Stack,-1); path3 q=vm::pop(Stack); path3 p=vm::pop(Stack); #line 235 "./runpath3d.in" bool exact=fuzz <= 0.0; if(fuzz < 0) fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())), ::max(length(q.max()),length(q.min()))); bool single=!exact; real s,t; std::vector S,T; bool found=intersections(s,t,S,T,p,q,fuzz,single,exact); if(!found) {Stack->push(new array(0)); return;} array *V; if(single) { V=new array(1); array *Vi=new array(2); (*V)[0]=Vi; (*Vi)[0]=s; (*Vi)[1]=t; } else { size_t n=S.size(); V=new array(n); for(size_t i=0; i < n; ++i) { array *Vi=new array(2); (*V)[i]=Vi; (*Vi)[0]=S[i]; (*Vi)[1]=T[i]; } } stable_sort(V->begin(),V->end(),run::compare2()); {Stack->push(V); return;} } #line 267 "./runpath3d.in" // realarray* intersect(path3 p, triplearray2 *P, real fuzz=-1); void gen_runpath3d31(stack *Stack) { real fuzz=vm::pop(Stack,-1); triplearray2 * P=vm::pop(Stack); path3 p=vm::pop(Stack); #line 268 "./runpath3d.in" triple *A; copyArray2C(A,P,true,4); if(fuzz <= 0) fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())), norm(A,16)); std::vector T,U,V; bool found=intersections(T,U,V,p,A,fuzz,true); delete[] A; if(found) { array *W=new array(3); (*W)[0]=T[0]; (*W)[1]=U[0]; (*W)[2]=V[0]; {Stack->push(W); return;} } else {Stack->push(new array(0)); return;} } #line 286 "./runpath3d.in" // realarray2* intersections(path3 p, triplearray2 *P, real fuzz=-1); void gen_runpath3d32(stack *Stack) { real fuzz=vm::pop(Stack,-1); triplearray2 * P=vm::pop(Stack); path3 p=vm::pop(Stack); #line 287 "./runpath3d.in" triple *A; copyArray2C(A,P,true,4); if(fuzz <= 0) fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())), norm(A,16)); std::vector T,U,V; intersections(T,U,V,p,A,fuzz,false); delete[] A; size_t n=T.size(); array *W=new array(n); for(size_t i=0; i < n; ++i) { array *Wi=new array(3); (*W)[i]=Wi; (*Wi)[0]=T[i]; (*Wi)[1]=U[i]; (*Wi)[2]=V[i]; } {Stack->push(W); return;} // Sorting will done in asy. } #line 307 "./runpath3d.in" // Int size(path3 p); void gen_runpath3d33(stack *Stack) { path3 p=vm::pop(Stack); #line 308 "./runpath3d.in" {Stack->push(p.size()); return;} } #line 312 "./runpath3d.in" // path3 &(path3 p, path3 q); void gen_runpath3d34(stack *Stack) { path3 q=vm::pop(Stack); path3 p=vm::pop(Stack); #line 313 "./runpath3d.in" {Stack->push(camp::concat(p,q)); return;} } #line 317 "./runpath3d.in" // triple min(path3 p); void gen_runpath3d35(stack *Stack) { path3 p=vm::pop(Stack); #line 318 "./runpath3d.in" {Stack->push(p.min()); return;} } #line 322 "./runpath3d.in" // triple max(path3 p); void gen_runpath3d36(stack *Stack) { path3 p=vm::pop(Stack); #line 323 "./runpath3d.in" {Stack->push(p.max()); return;} } #line 327 "./runpath3d.in" // realarray* mintimes(path3 p); void gen_runpath3d37(stack *Stack) { path3 p=vm::pop(Stack); #line 328 "./runpath3d.in" array *V=new array(3); triple v=p.mintimes(); (*V)[0]=v.getx(); (*V)[1]=v.gety(); (*V)[2]=v.getz(); {Stack->push(V); return;} } #line 337 "./runpath3d.in" // realarray* maxtimes(path3 p); void gen_runpath3d38(stack *Stack) { path3 p=vm::pop(Stack); #line 338 "./runpath3d.in" array *V=new array(3); triple v=p.maxtimes(); (*V)[0]=v.getx(); (*V)[1]=v.gety(); (*V)[2]=v.getz(); {Stack->push(V); return;} } #line 347 "./runpath3d.in" // path3 *(realarray2 *t, path3 g); void gen_runpath3d39(stack *Stack) { path3 g=vm::pop(Stack); realarray2 * t=vm::pop(Stack); #line 348 "./runpath3d.in" {Stack->push(transformed(*t,g)); return;} } #line 352 "./runpath3d.in" // pair minratio(path3 g); void gen_runpath3d40(stack *Stack) { path3 g=vm::pop(Stack); #line 353 "./runpath3d.in" {Stack->push(g.ratio(::min)); return;} } #line 357 "./runpath3d.in" // pair maxratio(path3 g); void gen_runpath3d41(stack *Stack) { path3 g=vm::pop(Stack); #line 358 "./runpath3d.in" {Stack->push(g.ratio(::max)); return;} } // Return a negative (positive) value if a--b--c--cycle is oriented // counterclockwise (clockwise) when viewed from d or zero if all four // points are coplanar. // The value returned is the determinant // |a.x a.y a.z 1| // |b.x b.y b.z 1| // |c.x c.y c.z 1| // |d.x d.y d.z 1| #line 370 "./runpath3d.in" // real orient(triple a, triple b, triple c, triple d); void gen_runpath3d42(stack *Stack) { triple d=vm::pop(Stack); triple c=vm::pop(Stack); triple b=vm::pop(Stack); triple a=vm::pop(Stack); #line 371 "./runpath3d.in" real A[]={a.getx(),a.gety(),a.getz()}; real B[]={b.getx(),b.gety(),b.getz()}; real C[]={c.getx(),c.gety(),c.getz()}; real D[]={d.getx(),d.gety(),d.getz()}; {Stack->push(orient3d(A,B,C,D)); return;} } // Return a positive (negative) value if e lies inside (outside) // the sphere passing through the points a,b,c,d oriented so that // a--b--c--cycle appears in clockwise order when viewed from d // or zero if all five points are cospherical. // The value returned is the determinant // |a.x a.y a.z a.x^2+a.y^2+a.z^2 1| // |b.x b.y b.z b.x^2+b.y^2+b.z^2 1| // |c.x c.y c.z c.x^2+c.y^2+c.z^2 1| // |d.x d.y d.z d.x^2+d.y^2+d.z^2 1| // |e.x e.y e.z e.x^2+e.y^2+e.z^2 1| #line 389 "./runpath3d.in" // real insphere(triple a, triple b, triple c, triple d, triple e); void gen_runpath3d43(stack *Stack) { triple e=vm::pop(Stack); triple d=vm::pop(Stack); triple c=vm::pop(Stack); triple b=vm::pop(Stack); triple a=vm::pop(Stack); #line 390 "./runpath3d.in" real A[]={a.getx(),a.gety(),a.getz()}; real B[]={b.getx(),b.gety(),b.getz()}; real C[]={c.getx(),c.gety(),c.getz()}; real D[]={d.getx(),d.gety(),d.getz()}; real E[]={e.getx(),e.gety(),e.getz()}; {Stack->push(insphere(A,B,C,D,E)); return;} } } // namespace run namespace trans { void gen_runpath3d_venv(venv &ve) { #line 40 "./runpath3d.in" addFunc(ve, run::gen_runpath3d0, primPath3(), SYM(path3), formal(tripleArray(), SYM(pre), false, false), formal(tripleArray(), SYM(point), false, false), formal(tripleArray(), SYM(post), false, false), formal(booleanArray(), SYM(straight), false, false), formal(primBoolean(), SYM(cyclic), false, false)); #line 57 "./runpath3d.in" REGISTER_BLTIN(run::nullPath3,"nullPath3"); #line 62 "./runpath3d.in" addFunc(ve, run::gen_runpath3d2, primBoolean(), SYM_EQ, formal(primPath3(), SYM(a), false, false), formal(primPath3(), SYM(b), false, false)); #line 67 "./runpath3d.in" addFunc(ve, run::gen_runpath3d3, primBoolean(), SYM_NEQ, formal(primPath3(), SYM(a), false, false), formal(primPath3(), SYM(b), false, false)); #line 72 "./runpath3d.in" addFunc(ve, run::gen_runpath3d4, primTriple(), SYM(point), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(t), false, false)); #line 77 "./runpath3d.in" addFunc(ve, run::gen_runpath3d5, primTriple(), SYM(point), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(t), false, false)); #line 82 "./runpath3d.in" addFunc(ve, run::gen_runpath3d6, primTriple(), SYM(precontrol), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(t), false, false)); #line 87 "./runpath3d.in" addFunc(ve, run::gen_runpath3d7, primTriple(), SYM(precontrol), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(t), false, false)); #line 92 "./runpath3d.in" addFunc(ve, run::gen_runpath3d8, primTriple(), SYM(postcontrol), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(t), false, false)); #line 97 "./runpath3d.in" addFunc(ve, run::gen_runpath3d9, primTriple(), SYM(postcontrol), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(t), false, false)); #line 102 "./runpath3d.in" addFunc(ve, run::gen_runpath3d10, primTriple(), SYM(dir), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(t), false, false), formal(primInt(), SYM(sign), true, false), formal(primBoolean(), SYM(normalize), true, false)); #line 107 "./runpath3d.in" addFunc(ve, run::gen_runpath3d11, primTriple(), SYM(dir), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(t), false, false), formal(primBoolean(), SYM(normalize), true, false)); #line 112 "./runpath3d.in" addFunc(ve, run::gen_runpath3d12, primTriple(), SYM(accel), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(t), false, false), formal(primInt(), SYM(sign), true, false)); #line 117 "./runpath3d.in" addFunc(ve, run::gen_runpath3d13, primTriple(), SYM(accel), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(t), false, false)); #line 122 "./runpath3d.in" addFunc(ve, run::gen_runpath3d14, primReal(), SYM(radius), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(t), false, false)); #line 134 "./runpath3d.in" addFunc(ve, run::gen_runpath3d15, primReal(), SYM(radius), formal(primTriple(), SYM(z0), false, false), formal(primTriple(), SYM(c0), false, false), formal(primTriple(), SYM(c1), false, false), formal(primTriple(), SYM(z1), false, false), formal(primReal(), SYM(t), false, false)); #line 146 "./runpath3d.in" addFunc(ve, run::gen_runpath3d16, primPath3(), SYM(reverse), formal(primPath3(), SYM(p), false, false)); #line 151 "./runpath3d.in" addFunc(ve, run::gen_runpath3d17, primPath3(), SYM(subpath), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(a), false, false), formal(primInt(), SYM(b), false, false)); #line 156 "./runpath3d.in" addFunc(ve, run::gen_runpath3d18, primPath3(), SYM(subpath), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(a), false, false), formal(primReal(), SYM(b), false, false)); #line 161 "./runpath3d.in" addFunc(ve, run::gen_runpath3d19, primInt(), SYM(length), formal(primPath3(), SYM(p), false, false)); #line 166 "./runpath3d.in" addFunc(ve, run::gen_runpath3d20, primBoolean(), SYM(cyclic), formal(primPath3(), SYM(p), false, false)); #line 171 "./runpath3d.in" addFunc(ve, run::gen_runpath3d21, primBoolean(), SYM(straight), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(t), false, false)); #line 176 "./runpath3d.in" addFunc(ve, run::gen_runpath3d22, primPath3(), SYM(unstraighten), formal(primPath3(), SYM(p), false, false)); #line 181 "./runpath3d.in" addFunc(ve, run::gen_runpath3d23, primReal(), SYM(straightness), formal(primTriple(), SYM(z0), false, false), formal(primTriple(), SYM(c0), false, false), formal(primTriple(), SYM(c1), false, false), formal(primTriple(), SYM(z1), false, false)); #line 188 "./runpath3d.in" addFunc(ve, run::gen_runpath3d24, primReal(), SYM(straightness), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(t), false, false)); #line 196 "./runpath3d.in" addFunc(ve, run::gen_runpath3d25, primBoolean(), SYM(piecewisestraight), formal(primPath3(), SYM(p), false, false)); #line 201 "./runpath3d.in" addFunc(ve, run::gen_runpath3d26, primReal(), SYM(arclength), formal(primPath3(), SYM(p), false, false)); #line 206 "./runpath3d.in" addFunc(ve, run::gen_runpath3d27, primReal(), SYM(arclength), formal(primTriple(), SYM(z0), false, false), formal(primTriple(), SYM(c0), false, false), formal(primTriple(), SYM(c1), false, false), formal(primTriple(), SYM(z1), false, false)); #line 211 "./runpath3d.in" addFunc(ve, run::gen_runpath3d28, primReal(), SYM(arctime), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(dval), false, false)); #line 216 "./runpath3d.in" addFunc(ve, run::gen_runpath3d29, realArray(), SYM(intersect), formal(primPath3(), SYM(p), false, false), formal(primPath3(), SYM(q), false, false), formal(primReal(), SYM(fuzz), true, false)); #line 234 "./runpath3d.in" addFunc(ve, run::gen_runpath3d30, realArray2(), SYM(intersections), formal(primPath3(), SYM(p), false, false), formal(primPath3(), SYM(q), false, false), formal(primReal(), SYM(fuzz), true, false)); #line 267 "./runpath3d.in" addFunc(ve, run::gen_runpath3d31, realArray(), SYM(intersect), formal(primPath3(), SYM(p), false, false), formal(tripleArray2(), SYM(p), false, false), formal(primReal(), SYM(fuzz), true, false)); #line 286 "./runpath3d.in" addFunc(ve, run::gen_runpath3d32, realArray2(), SYM(intersections), formal(primPath3(), SYM(p), false, false), formal(tripleArray2(), SYM(p), false, false), formal(primReal(), SYM(fuzz), true, false)); #line 307 "./runpath3d.in" addFunc(ve, run::gen_runpath3d33, primInt(), SYM(size), formal(primPath3(), SYM(p), false, false)); #line 312 "./runpath3d.in" addFunc(ve, run::gen_runpath3d34, primPath3(), SYM_AMPERSAND, formal(primPath3(), SYM(p), false, false), formal(primPath3(), SYM(q), false, false)); #line 317 "./runpath3d.in" addFunc(ve, run::gen_runpath3d35, primTriple(), SYM(min), formal(primPath3(), SYM(p), false, false)); #line 322 "./runpath3d.in" addFunc(ve, run::gen_runpath3d36, primTriple(), SYM(max), formal(primPath3(), SYM(p), false, false)); #line 327 "./runpath3d.in" addFunc(ve, run::gen_runpath3d37, realArray(), SYM(mintimes), formal(primPath3(), SYM(p), false, false)); #line 337 "./runpath3d.in" addFunc(ve, run::gen_runpath3d38, realArray(), SYM(maxtimes), formal(primPath3(), SYM(p), false, false)); #line 347 "./runpath3d.in" addFunc(ve, run::gen_runpath3d39, primPath3(), SYM_TIMES, formal(realArray2(), SYM(t), false, false), formal(primPath3(), SYM(g), false, false)); #line 352 "./runpath3d.in" addFunc(ve, run::gen_runpath3d40, primPair(), SYM(minratio), formal(primPath3(), SYM(g), false, false)); #line 357 "./runpath3d.in" addFunc(ve, run::gen_runpath3d41, primPair(), SYM(maxratio), formal(primPath3(), SYM(g), false, false)); #line 362 "./runpath3d.in" addFunc(ve, run::gen_runpath3d42, primReal(), SYM(orient), formal(primTriple(), SYM(a), false, false), formal(primTriple(), SYM(b), false, false), formal(primTriple(), SYM(c), false, false), formal(primTriple(), SYM(d), false, false)); #line 379 "./runpath3d.in" addFunc(ve, run::gen_runpath3d43, primReal(), SYM(insphere), formal(primTriple(), SYM(a), false, false), formal(primTriple(), SYM(b), false, false), formal(primTriple(), SYM(c), false, false), formal(primTriple(), SYM(d), false, false), formal(primTriple(), SYM(e), false, false)); } } // namespace trans asymptote-3.05/psfile.cc0000644000000000000000000004574515031566105013776 0ustar rootroot/***** * psfile.cc * Andy Hammerlindl 2002/06/10 * * Encapsulates the writing of commands to a PostScript file. * Allows identification and removal of redundant commands. *****/ #include #include #include #include #include "psfile.h" #include "settings.h" #include "errormsg.h" #include "array.h" #include "stack.h" using std::ofstream; using std::setw; using vm::array; using vm::read; using vm::stack; using vm::callable; using vm::pop; namespace camp { void checkColorSpace(ColorSpace colorspace) { switch(colorspace) { case DEFCOLOR: case INVISIBLE: reportError("Cannot shade with invisible pen"); case PATTERN: reportError("Cannot shade with pattern"); break; default: break; } } psfile::psfile(const string& filename, bool pdfformat) : filename(filename), pdfformat(pdfformat), pdf(false), buffer(NULL), out(NULL) { if(filename.empty()) out=&cout; else out=new ofstream(filename.c_str()); out->setf(std::ios::boolalpha); if(!out || !*out) reportError("Cannot write to "+filename); } static const char *inconsistent="inconsistent colorspaces"; static const char *rectangular="matrix is not rectangular"; void psfile::writefromRGB(unsigned char r, unsigned char g, unsigned char b, ColorSpace colorspace, size_t ncomponents) { pen p(byteinv(r),byteinv(g),byteinv(b)); p.convert(); if(!p.promote(colorspace)) reportError(inconsistent); write(&p,ncomponents); } inline unsigned char average(unsigned char *a, size_t dx, size_t dy) { return ((unsigned) a[0]+(unsigned) a[dx]+(unsigned) a[dy]+ (unsigned) a[dx+dy])/4; } void psfile::dealias(unsigned char *a, size_t width, size_t height, size_t n, bool convertrgb, ColorSpace colorspace) { // Dealias all but the last row and column of pixels. size_t istop=width-1; size_t jstop=height-1; if(convertrgb) { size_t nwidth=3*width; for(size_t j=0; j < height; ++j) { unsigned char *aj=a+nwidth*j; for(size_t i=0; i < width; ++i) { unsigned char *ai=aj+3*i; if(i < istop && j < jstop) writefromRGB(average(ai,3,nwidth), average(ai+1,3,nwidth), average(ai+2,3,nwidth),colorspace,n); else writefromRGB(ai[0],ai[1],ai[2],colorspace,n); } } } else { size_t nwidth=n*width; for(size_t j=0; j < jstop; ++j) { unsigned char *aj=a+nwidth*j; for(size_t i=0; i < istop; ++i) { unsigned char *ai=aj+n*i; for(size_t k=0; k < n; ++k) ai[k]=average(ai+k,n,nwidth); } } } } void psfile::writeCompressed(const unsigned char *a, size_t size) { uLongf compressedSize=compressBound(size); Bytef *compressed=new Bytef[compressedSize]; if(compress(compressed,&compressedSize,a,size) != Z_OK) reportError("image compression failed"); encode85 e(out); for(size_t i=0; i < compressedSize; ++i) e.put(compressed[i]); } void psfile::close() { if(out) { out->flush(); if(!filename.empty()) { #if defined(_MSC_VER) #else chmod(filename.c_str(),~settings::mask & 0777); #endif if(!out->good()) // Don't call reportError since this may be called on handled_error. reportFatal("Cannot write to "+filename); delete out; out=NULL; } } } psfile::~psfile() { close(); } void psfile::header(bool eps) { Int level=settings::getSetting("level"); *out << "%!PS-Adobe-" << level << ".0"; if(eps) *out << " EPSF-" << level << ".0"; *out << newl; } void psfile::prologue(const bbox& box) { header(true); BoundingBox(box); *out << "%%Creator: " << PACKAGE_NAME << " " << REVISION << newl; time_t t; time(&t); struct tm *tt = localtime(&t); char prev = out->fill('0'); *out << "%%CreationDate: " << tt->tm_year + 1900 << "." << setw(2) << tt->tm_mon+1 << "." << setw(2) << tt->tm_mday << " " << setw(2) << tt->tm_hour << ":" << setw(2) << tt->tm_min << ":" << setw(2) << tt->tm_sec << newl; out->fill(prev); *out << "%%Pages: 1" << newl; *out << "%%Page: 1 1" << newl; if(!pdfformat) *out << "/Setlinewidth {0 exch dtransform dup abs 1 lt {pop 0}{round} ifelse" << newl << "idtransform setlinewidth pop} bind def" << newl; } void psfile::epilogue() { *out << "showpage" << newl; *out << "%%EOF" << newl; } void psfile::setcolor(const pen& p, const string& begin="", const string& end="") { ostringstream buf; if(p.cmyk() && (!lastpen.cmyk() || (p.cyan() != lastpen.cyan() || p.magenta() != lastpen.magenta() || p.yellow() != lastpen.yellow() || p.black() != lastpen.black()))) { buf << begin << p.cyan() << " " << p.magenta() << " " << p.yellow() << " " << p.black(); if(pdf) { *out << buf.str() << " k" << end << newl; *out << buf.str() << " K" << end << newl; } else *out << buf.str() << " setcmykcolor" << end << newl; } else if(p.rgb() && (!lastpen.rgb() || (p.red() != lastpen.red() || p.green() != lastpen.green() || p.blue() != lastpen.blue()))) { buf << begin << p.red() << " " << p.green() << " " << p.blue(); if(pdf) { *out << buf.str() << " rg" << end << newl; *out << buf.str() << " RG" << end << newl; } else *out << buf.str() << " setrgbcolor" << end << newl; } else if(p.grayscale() && (!lastpen.grayscale() || p.gray() != lastpen.gray())) { buf << begin << p.gray(); if(pdf) { *out << begin << p.gray() << " g" << end << newl; *out << begin << p.gray() << " G" << end << newl; } else *out << begin << p.gray() << " setgray" << end << newl; } } bool psfile::transparentFormat(string outputformat) { return (pdftex() && outputformat == "") || outputformat == "pdf" || outputformat == "html" || outputformat == "svg" || outputformat == "png"; } void psfile::setopacity(const pen& p) { if(transparentFormat(settings::getSetting("outformat"))) { if(p.blend() != lastpen.blend()) *out << "/" << p.blend() << " .setblendmode" << newl; if(p.opacity() != lastpen.opacity()) *out << p.opacity() << " .setfillconstantalpha" << newl << p.opacity() << " .setstrokeconstantalpha" << newl; lastpen.settransparency(p); } } void psfile::setpen(pen p) { p.convert(); setopacity(p); if(!p.fillpattern().empty() && p.fillpattern() != lastpen.fillpattern()) *out << p.fillpattern() << " setpattern" << newl; else setcolor(p); // Defer dynamic linewidth until stroke time in case currentmatrix changes. if(p.width() != lastpen.width()) *out << p.width() << (pdfformat ? " setlinewidth" : " Setlinewidth") << newl; if(p.cap() != lastpen.cap()) *out << p.cap() << " setlinecap" << newl; if(p.join() != lastpen.join()) *out << p.join() << " setlinejoin" << newl; if(p.miter() != lastpen.miter()) *out << p.miter() << " setmiterlimit" << newl; const LineType *linetype=p.linetype(); const LineType *lastlinetype=lastpen.linetype(); if(!(linetype->pattern == lastlinetype->pattern) || linetype->offset != lastlinetype->offset) { out->setf(std::ios::fixed); *out << linetype->pattern << " " << linetype->offset << " setdash" << newl; out->unsetf(std::ios::fixed); } lastpen=p; } void psfile::write(const pen& p) { if(p.cmyk()) *out << p.cyan() << " " << p.magenta() << " " << p.yellow() << " " << p.black(); else if(p.rgb()) *out << p.red() << " " << p.green() << " " << p.blue(); else if(p.grayscale()) *out << p.gray(); } void psfile::write(path p, bool newPath) { Int n = p.size(); assert(n != 0); if(newPath) newpath(); pair z0=p.point((Int) 0); // Draw points moveto(z0); for(Int i = 1; i < n; i++) { if(p.straight(i-1)) lineto(p.point(i)); else curveto(p.postcontrol(i-1),p.precontrol(i),p.point(i)); } if(p.cyclic()) { if(p.straight(n-1)) lineto(z0); else curveto(p.postcontrol(n-1),p.precontrol((Int) 0),z0); closepath(); } else { if(n == 1) lineto(z0); } } void psfile::latticeshade(const vm::array& a, const transform& t) { checkLevel(); size_t n=a.size(); if(n == 0) return; array *a0=read(a,0); size_t m=a0->size(); setfirstopacity(*a0); ColorSpace colorspace=maxcolorspace2(a); checkColorSpace(colorspace); size_t ncomponents=ColorComponents[colorspace]; *out << "<< /ShadingType 1" << newl << "/Matrix "; write(t); *out << newl; *out << "/ColorSpace /Device" << ColorDeviceSuffix[colorspace] << newl << "/Function" << newl << "<< /FunctionType 0" << newl << "/Order 1" << newl << "/Domain [0 1 0 1]" << newl << "/Range ["; for(size_t i=0; i < ncomponents; ++i) *out << "0 1 "; *out << "]" << newl << "/Decode ["; for(size_t i=0; i < ncomponents; ++i) *out << "0 1 "; *out << "]" << newl; *out << "/BitsPerSample 8" << newl; *out << "/Size [" << m << " " << n << "]" << newl << "/DataSource <" << newl; for(size_t i=n; i > 0;) { array *ai=read(a,--i); checkArray(ai); size_t aisize=ai->size(); if(aisize != m) reportError(rectangular); for(size_t j=0; j < m; j++) { pen *p=read(ai,j); p->convert(); if(!p->promote(colorspace)) reportError(inconsistent); *out << p->hex() << newl; } } *out << ">" << newl << ">>" << newl << ">>" << newl << "shfill" << newl; } // Axial and radial shading void psfile::gradientshade(bool axial, ColorSpace colorspace, const pen& pena, const pair& a, double ra, bool extenda, const pen& penb, const pair& b, double rb, bool extendb) { checkLevel(); endclip(pena); setopacity(pena); checkColorSpace(colorspace); *out << "<< /ShadingType " << (axial ? "2" : "3") << newl << "/ColorSpace /Device" << ColorDeviceSuffix[colorspace] << newl << "/Coords ["; write(a); if(!axial) write(ra); write(b); if(!axial) write(rb); *out << "]" << newl << "/Extend [" << extenda << " " << extendb << "]" << newl << "/Function" << newl << "<< /FunctionType 2" << newl << "/Domain [0 1]" << newl << "/C0 ["; write(pena); *out << "]" << newl << "/C1 ["; write(penb); *out << "]" << newl << "/N 1" << newl << ">>" << newl << ">>" << newl << "shfill" << newl; } void psfile::gouraudshade(const pen& pentype, const array& pens, const array& vertices, const array& edges) { checkLevel(); endclip(pentype); size_t size=pens.size(); if(size == 0) return; setfirstopacity(pens); ColorSpace colorspace=maxcolorspace(pens); *out << "<< /ShadingType 4" << newl << "/ColorSpace /Device" << ColorDeviceSuffix[colorspace] << newl << "/DataSource [" << newl; for(size_t i=0; i < size; i++) { write(read(edges,i)); write(read(vertices,i)); pen *p=read(pens,i); p->convert(); if(!p->promote(colorspace)) reportError(inconsistent); *out << " "; write(*p); *out << newl; } *out << "]" << newl << ">>" << newl << "shfill" << newl; } void psfile::vertexpen(array *pi, int j, ColorSpace colorspace) { pen *p=read(pi,j); p->convert(); if(!p->promote(colorspace)) reportError(inconsistent); *out << " "; write(*p); } // Tensor-product patch shading void psfile::tensorshade(const pen& pentype, const array& pens, const array& boundaries, const array& z) { checkLevel(); endclip(pentype); size_t size=pens.size(); if(size == 0) return; size_t nz=z.size(); array *p0=read(pens,0); if(checkArray(p0) != 4) reportError("4 pens required"); setfirstopacity(*p0); ColorSpace colorspace=maxcolorspace2(pens); checkColorSpace(colorspace); *out << "<< /ShadingType 7" << newl << "/ColorSpace /Device" << ColorDeviceSuffix[colorspace] << newl << "/DataSource [" << newl; for(size_t i=0; i < size; i++) { // Only edge flag 0 (new patch) is implemented since the 32% data // compression (for RGB) afforded by other edge flags really isn't worth // the trouble or confusion for the user. write(0); path g=read(boundaries,i); if(!(g.cyclic() && g.size() == 4)) reportError("specify cyclic path of length 4"); for(Int j=4; j > 0; --j) { write(g.point(j)); write(g.precontrol(j)); write(g.postcontrol(j-1)); } if(nz == 0) { // Coons patch static double nineth=1.0/9.0; for(Int j=0; j < 4; ++j) { write(nineth*(-4.0*g.point(j)+6.0*(g.precontrol(j)+g.postcontrol(j)) -2.0*(g.point(j-1)+g.point(j+1)) +3.0*(g.precontrol(j-1)+g.postcontrol(j+1)) -g.point(j+2))); } } else { array *zi=read(z,i); if(checkArray(zi) != 4) reportError("specify 4 internal control points for each path"); write(read(zi,0)); write(read(zi,3)); write(read(zi,2)); write(read(zi,1)); } array *pi=read(pens,i); if(checkArray(pi) != 4) reportError("specify 4 pens for each path"); vertexpen(pi,0,colorspace); vertexpen(pi,3,colorspace); vertexpen(pi,2,colorspace); vertexpen(pi,1,colorspace); *out << newl; } *out << "]" << newl << ">>" << newl << "shfill" << newl; } void psfile::write(pen *p, size_t ncomponents) { switch(ncomponents) { case 0: break; case 1: writeByte(byte(p->gray())); break; case 3: writeByte(byte(p->red())); writeByte(byte(p->green())); writeByte(byte(p->blue())); break; case 4: writeByte(byte(p->cyan())); writeByte(byte(p->magenta())); writeByte(byte(p->yellow())); writeByte(byte(p->black())); default: break; } } string filter() { return settings::getSetting("level") >= 3 ? "1 (~>) /SubFileDecode filter /ASCII85Decode filter\n/FlateDecode" : "1 (~>) /SubFileDecode filter /ASCII85Decode"; } void psfile::imageheader(size_t width, size_t height, ColorSpace colorspace) { size_t ncomponents=ColorComponents[colorspace]; *out << "/Device" << ColorDeviceSuffix[colorspace] << " setcolorspace" << newl << "<<" << newl << "/ImageType 1" << newl << "/Width " << width << newl << "/Height " << height << newl << "/BitsPerComponent 8" << newl << "/Decode ["; for(size_t i=0; i < ncomponents; ++i) *out << "0 1 "; *out << "]" << newl << "/ImageMatrix [" << width << " 0 0 " << height << " 0 0]" << newl << "/DataSource currentfile " << filter() << " filter" << newl << ">>" << newl << "image" << newl; } void psfile::image(const array& a, const array& P, bool antialias) { size_t asize=a.size(); size_t Psize=P.size(); if(asize == 0 || Psize == 0) return; array *a0=read(a,0); size_t a0size=a0->size(); if(a0size == 0) return; setfirstopacity(P); ColorSpace colorspace=maxcolorspace(P); checkColorSpace(colorspace); size_t ncomponents=ColorComponents[colorspace]; imageheader(a0size,asize,colorspace); double min=read(a0,0); double max=min; for(size_t i=0; i < asize; i++) { array *ai=read(a,i); size_t size=ai->size(); if(size != a0size) reportError(rectangular); for(size_t j=0; j < size; j++) { double val=read(ai,j); if(val > max) max=val; else if(val < min) min=val; } } double step=(max == min) ? 0.0 : (Psize-1)/(max-min); beginImage(ncomponents*a0size*asize); for(size_t i=0; i < asize; i++) { array *ai=read(a,i); for(size_t j=0; j < a0size; j++) { double val=read(ai,j); size_t index=(size_t) ((val-min)*step+0.5); pen *p=read(P,index < Psize ? index : Psize-1); p->convert(); if(!p->promote(colorspace)) reportError(inconsistent); write(p,ncomponents); } } endImage(antialias,a0size,asize,ncomponents); } void psfile::image(const array& a, bool antialias) { size_t asize=a.size(); if(asize == 0) return; array *a0=read(a,0); size_t a0size=a0->size(); if(a0size == 0) return; setfirstopacity(*a0); ColorSpace colorspace=maxcolorspace2(a); checkColorSpace(colorspace); size_t ncomponents=ColorComponents[colorspace]; imageheader(a0size,asize,colorspace); beginImage(ncomponents*a0size*asize); for(size_t i=0; i < asize; i++) { array *ai=read(a,i); size_t size=ai->size(); if(size != a0size) reportError(rectangular); for(size_t j=0; j < size; j++) { pen *p=read(ai,j); p->convert(); if(!p->promote(colorspace)) reportError(inconsistent); write(p,ncomponents); } } endImage(antialias,a0size,asize,ncomponents); } void psfile::image(stack *Stack, callable *f, Int width, Int height, bool antialias) { if(width <= 0 || height <= 0) return; Stack->push(0); Stack->push(0); f->call(Stack); pen p=pop(Stack); setopacity(p); ColorSpace colorspace=p.colorspace(); checkColorSpace(colorspace); size_t ncomponents=ColorComponents[colorspace]; imageheader(width,height,colorspace); beginImage(ncomponents*width*height); for(Int j=0; j < height; j++) { for(Int i=0; i < width; i++) { Stack->push(j); Stack->push(i); f->call(Stack); pen p=pop(Stack); p.convert(); if(!p.promote(colorspace)) reportError(inconsistent); write(&p,ncomponents); } } endImage(antialias,width,height,ncomponents); } void psfile::outImage(bool antialias, size_t width, size_t height, size_t ncomponents) { if(antialias) dealias(buffer,width,height,ncomponents); if(settings::getSetting("level") >= 3) writeCompressed(buffer,count); else { encode85 e(out); for(size_t i=0; i < count; ++i) e.put(buffer[i]); } } void psfile::rawimage(unsigned char *a, size_t width, size_t height, bool antialias) { pen p(0.0,0.0,0.0); p.convert(); ColorSpace colorspace=p.colorspace(); checkColorSpace(colorspace); size_t ncomponents=ColorComponents[colorspace]; imageheader(width,height,colorspace); count=ncomponents*width*height; if(colorspace == RGB) { buffer=a; outImage(antialias,width,height,ncomponents); } else { beginImage(count); if(antialias) dealias(a,width,height,ncomponents,true,colorspace); else { size_t height3=3*height; for(size_t i=0; i < width; ++i) { unsigned char *ai=a+height3*i; for(size_t j=0; j < height; ++j) { unsigned char *aij=ai+3*j; writefromRGB(aij[0],aij[1],aij[2],colorspace,ncomponents); } } } endImage(false,width,height,ncomponents); } } } //namespace camp asymptote-3.05/impdatum.cc0000644000000000000000000003103715031566105014321 0ustar rootroot#include #include "stack.h" #include "env.h" #include "exp.h" #include "stm.h" #include "refaccess.h" using std::strlen; using namespace absyntax; using namespace trans; using vm::item; using vm::get; #include "policy.h" coenv &coenvInOngoingProcess(); void runInOngoingProcess(absyntax::runnable *r); void runExp(absyntax::exp *e) { absyntax::expStm s(nullPos, e); runInOngoingProcess(&s); } class ImpDatum; class ImpArguments; ImpDatum *datumError(const char *msg); // Expression used for non-item datums. class errorExp : public absyntax::exp { public: errorExp() : exp(nullPos) {} void prettyprint(ostream &out, Int indent) { absyntax::prettyname(out, "errorExp", indent, getPos()); } void complain() { em.error(nullPos); em << "cannot use datum as expression"; } types::ty *getType(coenv &) { return types::primError(); } types::ty *trans(coenv &e) { complain(); return getType(e); } void transAsType(coenv &e, types::ty *target) { complain(); } }; // Abstract base class for Datum types. class ImpDatum { public: virtual operator handle_typ() { return (handle_typ)(this); } virtual int_typ toInt() { datumError("cannot convert to integer"); // Return a weird value that will hopefully be noticed. return -777777; } virtual bool toBool() { datumError("cannot convert to bool"); return false; } virtual double toDouble() { datumError("cannot convert to double"); return -777e77; } virtual string_typ toString() { datumError("cannot convert to string"); string_typ s = { "XXXXX", 5 }; return s; } virtual absyntax::exp *getExp() { datumError("invalid use of datum"); return new errorExp; } // How to access a field of the datum. virtual absyntax::exp *getFieldExp(symbol id) { assert(id); return new fieldExp(nullPos, this->getExp(), id); } virtual ImpDatum *getField(const char *name); virtual ImpDatum *getCell(ImpDatum *index) { return datumError("cannot index datatype"); } virtual void addField(const char *name, ImpDatum *init) { datumError("cannot set field of datatype"); } }; // An ever-growing list of handles, used to avoid garbage collecting the data. // TODO: Implement effective releaseHandle. mem::vector handles; handle_typ wrap(ImpDatum *d) { handle_typ h = (handle_typ)(d); handles.push_back(h); return h; } ImpDatum *unwrap(handle_typ handle) { assert(handle != 0); return (ImpDatum *)(handle); } class ErrorDatum : public ImpDatum { }; error_callback_typ errorCallback = 0; ImpDatum *datumError(const char *msg) { static ErrorDatum ed; if (errorCallback) { string_typ s = { msg, strlen(msg) }; errorCallback(s); } else { cerr << msg << '\n'; } return &ed; } handle_typ imp_copyHandle(handle_typ handle) { //cout << "+"; // For now, don't do anything. return handle; } void imp_releaseHandle() { //cout << "-"; // Do nothing, for now. } // A datum representing a value in Asymptote. Both the runtime representation // of the value and its type are stored. class ItemDatum : public ImpDatum { item i; types::ty *t; public: // Every itemDatum has a fixed (non-overloaded) type, t ItemDatum(types::ty *t) : t(t) { assert(t); assert(t->isNotOverloaded()); assert(t->isNotError()); } // An expression that can be used to get and set the datum. // The value should only be set once, when the datum is created, and not // changed. absyntax::exp *getExp() { // It may be faster to create this once on start, but then the datum will // require more space. For now, we create the access and expression on // demand. return new varEntryExp(nullPos, t, new itemRefAccess(&i)); } int_typ toInt() { // TODO: Decide if we want to use casting. if (t->kind == types::ty_Int) return static_cast(get(i)); else return ImpDatum::toInt(); } bool toBool() { if (t->kind == types::ty_boolean) return get(i); else return ImpDatum::toBool(); } double toDouble() { if (t->kind == types::ty_real) return get(i); else return ImpDatum::toDouble(); } string_typ toString() { if (t->kind == types::ty_string) { // TODO: Fix for strings containing NUL. string *s = get(i); string_typ st = { s->c_str(), s->length() }; return st; } else return ImpDatum::toString(); } }; ItemDatum *ItemDatumFromExp(types::ty *t, absyntax::exp *e) { ItemDatum *d = new ItemDatum(t); assignExp ae(nullPos, d->getExp(), e); runExp(&ae); return d; } ItemDatum *ItemDatumFromInt(int_typ x) { intExp ie(nullPos, static_cast(x)); return ItemDatumFromExp(types::primInt(), &ie); } ItemDatum *ItemDatumFromBool(bool x) { booleanExp be(nullPos, x); return ItemDatumFromExp(types::primBoolean(), &be); } ItemDatum *ItemDatumFromDouble(double x) { realExp re(nullPos, x); return ItemDatumFromExp(types::primReal(), &re); } ItemDatum *ItemDatumFromString(string_typ x) { mem::string s(x.buf, (size_t)x.length); stringExp se(nullPos, s); return ItemDatumFromExp(types::primString(), &se); } // If the interface is asked to return a field which is overloaded, a handle // to and OverloadedDatum is returned. No evaluation actually occurs. The // datum simply consists of the containing datum and the name of the field // requested. Subsequent use of the datum will resolve the overloading (or // report an error). class OverloadedDatum : public ImpDatum { ImpDatum *parent; symbol id; public: OverloadedDatum(ImpDatum *parent, symbol id) : parent(parent), id(id) { assert(parent); assert(id); } absyntax::exp *getExp() { return parent->getFieldExp(id); return new fieldExp(nullPos, parent->getExp(), id); } }; ImpDatum *ImpDatum::getField(const char *name) { coenv &e = coenvInOngoingProcess(); symbol id = symbol::trans(name); absyntax::exp *ex = getFieldExp(id); types::ty *t = ex->getType(e); if (t->isError()) return datumError("no field of that name"); if (t->isOverloaded()) return new OverloadedDatum(this, id); // Create a new datum and assign the variable to it. ItemDatum *d = new ItemDatum(t); assignExp ae(nullPos, d->getExp(), ex); runExp(&ae); return d; } handle_typ imp_handleFromInt(int_typ x) { return wrap(ItemDatumFromInt(x)); } handle_typ imp_handleFromBool(int_typ x) { if (x != 0 && x != 1) return wrap(datumError("invalid boolean value")); return wrap(ItemDatumFromBool(x == 1)); } handle_typ imp_handleFromDouble(double x) { return wrap(ItemDatumFromDouble(x)); } int_typ imp_IntFromHandle(handle_typ handle) { return unwrap(handle)->toInt(); } int_typ imp_boolFromHandle(handle_typ handle) { return unwrap(handle)->toBool() ? 1 : 0; } double imp_doubleFromHandle(handle_typ handle) { return unwrap(handle)->toDouble(); } handle_typ imp_handleFromString(string_typ x) { return wrap(ItemDatumFromString(x)); } string_typ imp_stringFromHandle(handle_typ handle) { return unwrap(handle)->toString(); } handle_typ imp_getField(handle_typ handle, const char *name) { return wrap(unwrap(handle)->getField(name)); } handle_typ imp_getCell(handle_typ handle, handle_typ index) { return wrap(unwrap(handle)->getCell(unwrap(index))); } void imp_addField(handle_typ handle, const char *name, handle_typ init) { unwrap(handle)->addField(name, unwrap(init)); } class ImpArguments /* TODO: gc visible but not collected */ { arglist args; public: ImpArguments() {} void add(const char *name, ImpDatum *arg, arg_rest_option isRest) { assert(isRest == NORMAL_ARG); // TODO: Implement rest. symbol id = (name && name[0]) ? symbol::trans(name) : symbol::nullsym; args.add(arg->getExp(), id); } arglist *getArgs() { return &args; } }; arguments_typ wrapArgs(ImpArguments *args) { return (arguments_typ)(args); } ImpArguments *unwrapArgs(arguments_typ args) { return (ImpArguments *)(args); } arguments_typ imp_newArguments() { return wrapArgs(new ImpArguments); } void imp_releaseArguments(arguments_typ args) { // For now, do nothing. } void imp_addArgument(arguments_typ args, const char *name, handle_typ handle, arg_rest_option isRest) { unwrapArgs(args)->add(name, unwrap(handle), isRest); } ImpDatum *callDatum(ImpDatum *callee, ImpArguments *args) { coenv &e = coenvInOngoingProcess(); callExp callex(nullPos, callee->getExp(), args->getArgs()); types::ty *t = callex.getType(e); if (t->isError()) { // Run for errors. runExp(&callex); em.sync(true); return datumError("invalid call"); } assert(t->isNotOverloaded()); // Calls are never overloaded. if (t->kind == types::ty_void) { // Execute the call and return 0 to indicate void. runExp(&callex); return 0; } else return ItemDatumFromExp(t, &callex); } handle_typ imp_call(handle_typ callee, arguments_typ args) { return wrap(callDatum(unwrap(callee), unwrapArgs(args))); } class GlobalsDatum : public ImpDatum { typedef std::map gmap; gmap base; virtual absyntax::exp *getFieldExp(symbol id) { // Fields of the globals datum are global variables. Use the unqualified // name. return new nameExp(nullPos, id); } virtual void addField(const char *name, ImpDatum *init) { datumError("addField not yet re-implemented"); } }; class ImpState { //ImpArguments *params; ImpDatum *retval; public: ImpState() : retval(0) {} ImpDatum *globals() { return new GlobalsDatum(); } int_typ numParams() { /*if (params) return params->val.size(); else */ { datumError("parameters accessed outside of function"); return 0; } } ImpDatum *getParam(int_typ index) { /*if (params) { if (index >= 0 && index < static_cast(params->val.size())) return params->val[index]; else return datumError("invalid index for parameter"); } else */ { return datumError("parameters accessed outside of function"); } } void setReturnValue(ImpDatum *retval) { /*if (params) { if (this->retval) datumError("return value set more than once"); else this->retval = retval; } else */ { datumError("return value set outside of function"); } } ImpDatum *getReturnValue() { return retval; } }; state_typ wrapState(ImpState *s) { return (state_typ)(s); } ImpState *unwrapState(state_typ s) { return (ImpState *)(s); } handle_typ imp_globals(state_typ state) { return wrap(unwrapState(state)->globals()); } int_typ imp_numParams(state_typ state) { return unwrapState(state)->numParams(); } handle_typ imp_getParam(state_typ state, int_typ index) { return wrap(unwrapState(state)->getParam(index)); } void imp_setReturnValue(state_typ state, handle_typ handle) { unwrapState(state)->setReturnValue(unwrap(handle)); } state_typ cheatState() { return wrapState(new ImpState()); } #if 0 class FunctionDatum : public ImpDatum { function_typ f; void *data; public: FunctionDatum(function_typ f, void *data) : f(f), data(data) {} ImpDatum *call(ImpArguments *args) { ImpState state(args); // Call the function. f(wrapState(&state),data); if (state.getReturnValue()) return state.getReturnValue(); else // TODO: Decide on datum for void return. return 0; } }; #endif handle_typ imp_handleFromFunction(const char *signature, function_typ f, void *data) { // TODO: Re-implement. return 0; //wrap(new FunctionDatum(f, data)); } void imp_setErrorCallback(error_callback_typ callback) { errorCallback = callback; } extern policy_typ imp_policy; policy_typ imp_policy = { /* version = */ 101, imp_copyHandle, imp_releaseHandle, imp_handleFromInt, imp_handleFromBool, imp_handleFromDouble, imp_handleFromString, imp_handleFromFunction, imp_IntFromHandle, imp_boolFromHandle, imp_doubleFromHandle, imp_stringFromHandle, imp_getField, imp_getCell, imp_addField, imp_newArguments, imp_releaseArguments, imp_addArgument, imp_call, imp_globals, imp_numParams, imp_getParam, imp_setReturnValue, imp_setErrorCallback, }; // Defined in process.cc void init(bool resetpath=true); extern "C" { policy_typ *_asy_getPolicy() { return &imp_policy; } state_typ _asy_getState() { static state_typ state = cheatState(); // TODO: Make sure this runs once. char buf[] = "asymptote.so"; char *argv [] = { buf }; settings::setOptions(1,argv); // Ensures uptodate is not used. init(); return state; } } asymptote-3.05/doc/0000755000000000000000000000000015031566777012752 5ustar rootrootasymptote-3.05/doc/CDlabel.asy0000644000000000000000000000100615031566105014734 0ustar rootrootsize(11.7cm,11.7cm); asy(nativeformat(),"logo"); fill(unitcircle^^(scale(2/11.7)*unitcircle), evenodd+rgb(124/255,205/255,124/255)); label(scale(1.1)*minipage( "\centering\scriptsize \textbf{\LARGE {\tt Asymptote}\\ \smallskip \small The Vector Graphics Language}\\ \smallskip \textsc{Andy Hammerlindl, John Bowman, and Tom Prince} https://asymptote.sourceforge.io\\ ",8cm),(0,0.6)); label(graphic("logo","height=7cm"),(0,-0.22)); clip(unitcircle^^(scale(2/11.7)*unitcircle),evenodd); asymptote-3.05/doc/generalaxis3.asy0000644000000000000000000000057015031566105016040 0ustar rootrootimport graph3; size(0,100); path3 g=yscale3(2)*unitcircle3; currentprojection=perspective(10,10,10); axis(Label("C",position=0,align=15X),g,InTicks(endlabel=false,8,end=false), ticklocate(0,360,new real(real v) { path3 h=O--max(abs(max(g)),abs(min(g)))*dir(90,v); return intersect(g,h)[0];}, new triple(real t) {return cross(dir(g,t),Z);})); asymptote-3.05/doc/planes.asy0000644000000000000000000000054215031566105014734 0ustar rootrootsize(6cm,0); import bsp; real u=2.5; real v=1; currentprojection=oblique; path3 y=plane((2u,0,0),(0,2v,0),(-u,-v,0)); path3 l=rotate(90,Z)*rotate(90,Y)*y; path3 g=rotate(90,X)*rotate(90,Y)*y; face[] faces; filldraw(faces.push(y),project(y),yellow); filldraw(faces.push(l),project(l),lightgrey); filldraw(faces.push(g),project(g),green); add(faces); asymptote-3.05/doc/log2graph.asy0000644000000000000000000000064715031566105015345 0ustar rootrootimport graph; size(200,IgnoreAspect); // Base-2 logarithmic scale on y-axis: real log2(real x) {static real log2=log(2); return log(x)/log2;} real pow2(real x) {return 2^x;} scaleT yscale=scaleT(log2,pow2,logarithmic=true); scale(Linear,yscale); real f(real x) {return 1+x^2;} draw(graph(f,-4,4)); yaxis("$y$",ymin=1,ymax=f(5),RightTicks(Label(Fill(white))),EndArrow); xaxis("$x$",xmin=-5,xmax=5,LeftTicks,EndArrow); asymptote-3.05/doc/xasy.1x0000644000000000000000000000156015031566105014173 0ustar rootroot.\" Hey, EMACS: -*- nroff -*- .TH XASY 1x "27 Nov 2007" .SH NAME asy \- script-based vector graphics language .SH SYNOPSIS .B xasy .RI " [-x magnification] [filename]" .SH DESCRIPTION \fBAsymptote\fP is a powerful descriptive vector graphics language for technical drawing, inspired by MetaPost but with an improved C++\-like syntax. Asymptote provides for figures the same high\-quality level of typesetting that LaTeX does for scientific text. .PP \fBxasy\fP is a GUI for Asymptote that allows for final figure adjustments. .SH OPTIONS .TP .B \-x magnification Initial zoom. .SH SEE ALSO Asymptote and xasy are documented fully in the Asymptote Info page. .SH AUTHOR Asymptote was written by Andy Hammerlindl, John Bowman, and Tom Prince. .PP This manual page was written by Hubert Chan for the Debian project (but may be used by others). asymptote-3.05/doc/asy-latex.dtx0000644000000000000000000004331615031566105015372 0ustar rootroot% \iffalse % %<*internal> \begingroup % %<*batchfile> \input docstrip.tex \keepsilent \preamble ____________________________ The ASYMPTOTE package (C) 2003 Tom Prince (C) 2003-2021 John Bowman (C) 2010 Will Robertson Adapted from comment.sty Licence: GPL2+ \endpreamble \nopostamble \askforoverwritefalse \generate{\file{asymptote.sty}{\from{\jobname.dtx}{pkg}}} % %\endbatchfile %<*internal> \generate{\file{\jobname.ins}{\from{\jobname.dtx}{batchfile}}} \edef\tmpa{plain} \ifx\tmpa\fmtname\endgroup\expandafter\bye\fi \endgroup \immediate\write18{makeindex -s gind.ist -o \jobname.ind \jobname.idx} \immediate\write18{makeindex -s gglo.ist -o \jobname.gls \jobname.glo} % % %<*driver> \ProvidesFile{asy-latex.dtx} % %\ProvidesPackage{asymptote} %<*pkg> [2024/02/26 v1.38 Asymptote style file for LaTeX] % % %<*driver> \documentclass{ltxdoc} \EnableCrossrefs \CodelineIndex \begin{document} \DocInput{\jobname.dtx} \end{document} % % \fi % % \GetFileInfo{asy-latex.dtx} % \title{The \textsf{asymptote} package} % \author{% % John Bowman, Tom Prince, and Will Robertson % } % \date{\filedate\qquad\fileversion} % \maketitle % \begin{abstract} % This package provides integration of inline and external Asymptote % graphics within a \LaTeX\ document. % \end{abstract} % % \tableofcontents % % \section{Introduction} % % This is the documentation for the \LaTeX\ package \texttt{asymptote} % which accompanies the Asymptote drawing package. For further details on % Asymptote, please see its documentation in \texttt{asymptote.pdf}. % % \section{User syntax} % % \subsection{Package loading and options} % % The package may take two options at load time: \texttt{inline} or % \texttt{attach}. % These options can also be set at any time with the % \cmd\asysetup\marg{options} command, or specified individually in the % optional argument to each \texttt{asy} environment or \texttt{asyinclude} % command. % % The \texttt{inline} option uses Asymptote's `inline' mode whereby % included graphics have their labels typeset in the environment of the % document they are contained within. Otherwise the Asymptote graphics are % self-contained and their formatting is independent of the document. % % The \texttt{attach} option allows generated graphics to be embedded % within the PDF using the \texttt{attachfile2} package; please load that % package separately if you wish to use it. The \texttt{attach} option % takes precedence over the \texttt{inline} option. % % This package produces quite a number of output files, which by default % are created in the same directory as the \LaTeX\ document that is being % compiled. To keep things more tidy, you can specify an output directory % for these files by defining the \cmd\asydir\ command. For example, if you % wish to store the figure files in the subdirectory \texttt{asytmp/}, the % you would write \verb|\renewcommand\asydir{asytmp}|. % % Alternatively (and tentatively), you may write \verb|dir=asytmp| in % either the \texttt{asy} environment options or the options to % \cmd\asysetup. % % \subsection{Commands for inserting Asymptote graphics} % % The main environment defined by the package is the \texttt{asy} % environment, in which verbatim Asymptote code is placed that will be % compiled for generating a graphic in the document. For example, % \begin{verbatim} % \begin{figure} % \begin{asy}[ ] % % \end{asy} % \caption{...}\label{...} % \end{verbatim} % % If you have Asymptote code in a separate file, you can include it with % the \cmd\asyinclude\oarg{options}\marg{filename}\ command. % % For Asymptote code that should be included in \emph{every} graphic, % define it using the \texttt{asydef} environment. % % \subsection{Graphics options} % % Both the \texttt{asy} environment and the \cmd\asyinclude\ command take % optional parameters for controlling aspects of the graphics creation. In % addition to locally setting \texttt{inline} and \texttt{attach}, the % following options may also be used: % \begin{description} % \item[width] Width of the figure % \item[height] Height of the figure % \item[keepAspect] Maintain aspect ratio [default true] % \item[viewportwidth] Viewport width for 3D figures % \item[viewportheight] Viewport height for 3D figures % \end{description} % These may also be set globally using the \cmd\asysetup\ command. % % \section{Processing the document} % % After running \LaTeX\ on the document, it is necessary to process the % Asymptote graphics so they can be included in the next compilation. The % simplest procedure is a recipe such as % \begin{verbatim} % pdflatex mydoc % asy mydoc-*.asy % pdflatex mydoc % \end{verbatim} % This technique will recompile each graphic every time, however. To only % recompile graphics that have changed, use the \texttt{latexmk} % tool. Asymptote is distributed with a \texttt{latexmkrc} configuration % file; place this file in a place where \texttt{latexmk} will find it and % your document may be compiled, including the \texttt{asy} compilations, % with \texttt{latexmk mydoc} or \texttt{latexmk --pdf mydoc}. % % \section{Implementation} % % \iffalse %<*pkg> % \fi % % \begin{macrocode} \def\Asymptote{{\tt Asymptote}} % \end{macrocode} % % \begin{macrocode} \InputIfFileExists{\jobname.pre}{}{\typeout{No file \jobname.pre.}} % \end{macrocode} % % \subsection{Allocations} % % \paragraph{Allocations} % % \begin{macrocode} \newbox\ASYbox \newdimen\ASYdimen \newcounter{asy} % \end{macrocode} % % \begin{macrocode} \newwrite\AsyStream \newwrite\AsyPreStream % \end{macrocode} % % \begin{macrocode} \newif\ifASYinline \newif\ifASYattach \newif\ifASYkeepAspect \ASYkeepAspecttrue % \end{macrocode} % % \subsection{Packages} % % \begin{macrocode} \RequirePackage{keyval} \RequirePackage{ifthen} \RequirePackage{graphicx} % \end{macrocode} % % \paragraph{Emulating packages} % We cannot assume that Asymptote users have recent % \TeX\ distributions. (E.g., Fedora until recently still shipped teTeX.) % So load \textsf{ifpdf} and \textsf{ifxetex} if they exist; otherwise, % emulate them. % % In due course, delete this code and just load the packages. % \begin{macrocode} \IfFileExists{ifpdf.sty}{ \RequirePackage{ifpdf} }{ \expandafter\newif\csname ifpdf\endcsname \ifx\pdfoutput\@undefined\else \ifcase\pdfoutput\else \pdftrue \fi \fi } % \end{macrocode} % % \begin{macrocode} \IfFileExists{ifxetex.sty}{ \RequirePackage{ifxetex} }{ \expandafter\newif\csname ifxetex\endcsname \ifx\XeTeXversion\@undefined\else \xetextrue \fi } % \end{macrocode} % % \begin{macro}{\CatchFileDef} % Used for \cmd\asyinclude. % Note that the fallback definition is not as robust as the one provided by catchfile. % \begin{macrocode} \IfFileExists{catchfile.sty}{ \RequirePackage{catchfile} }{ \newcommand\CatchFileDef[3]{% \begingroup \everyeof{% \ENDCATCHFILEMARKER \noexpand }% \long\def\@tempa####1\ENDCATCHFILEMARKER{% \endgroup \def##1{####1}% }% ##3% \expandafter\@tempa\@@input ##2\relax } } % \end{macrocode} % \end{macro} % % \paragraph{Ensuring attachfile2 is loaded if [attach] is requested} % \begin{macrocode} \newif\if@asy@attachfile@loaded % \end{macrocode} % % \begin{macrocode} \AtBeginDocument{% \@ifpackageloaded{attachfile2}{\@asy@attachfile@loadedtrue}{}% \let\asy@check@attachfile\asy@check@attachfile@loaded } % \end{macrocode} % % \begin{macrocode} \newcommand\asy@check@attachfile@loaded{% \if@asy@attachfile@loaded\else \PackageError{asymptote}{You must load the attachfile2 package}{^^J% You have requested the [attach] option for some or all of your^^J% Asymptote graphics, which requires the attachfile2 package.^^J% Please load it in the document preamble.^^J% }% \fi } % \end{macrocode} % % \begin{macrocode} \newcommand\asy@check@attachfile{% \AtBeginDocument{\asy@check@attachfile@loaded}% \let\asy@check@attachfile\@empty } % \end{macrocode} % % \paragraph{Macros} % \begin{macrocode} \def\csarg#1#2{\expandafter#1\csname#2\endcsname} % \end{macrocode} % % \subsection{Package options} % % \begin{macrocode} \DeclareOption{inline}{% \ASYinlinetrue } \DeclareOption{attach}{% \asy@check@attachfile \ASYattachtrue } \ProcessOptions* % \end{macrocode} % % \begin{macrocode} \def\asylatexdir{} \def\asydir{} \def\ASYasydir{} \def\ASYprefix{} % \end{macrocode} % % % \subsection{Testing for PDF output} % Note this is not quite the same as \cs{ifpdf}, since we still want PDF % output when using XeTeX. % \begin{macrocode} \newif\ifASYPDF \ifxetex \ASYPDFtrue \else \ifpdf \ASYPDFtrue \fi \fi \ifASYPDF \def\AsyExtension{pdf} \else \def\AsyExtension{eps} \fi % \end{macrocode} % % \subsection{Bug squashing} % % \begin{macrocode} \def\unquoteJobname#1"#2"#3\relax{% \def\rawJobname{#1}% \ifx\rawJobname\empty \def\rawJobname{#2}% \fi } \expandafter\unquoteJobname\jobname""\relax % \end{macrocode} % Work around jobname bug in MiKTeX 2.5 and 2.6: % Turn stars in file names (resulting from spaces, etc.) into minus signs % \begin{macrocode} \def\fixstar#1*#2\relax{% \def\argtwo{#2}% \ifx\argtwo\empty \gdef\Jobname{#1}% \else \fixstar#1-#2\relax \fi } \expandafter\fixstar\rawJobname*\relax % \end{macrocode} % % Work around bug in dvips.def: allow spaces in file names. % \begin{macrocode} \def\Ginclude@eps#1{% \message{<#1>}% \bgroup \def\@tempa{!}% \dimen@\Gin@req@width \dimen@ii.1bp\relax \divide\dimen@\dimen@ii \@tempdima\Gin@req@height \divide\@tempdima\dimen@ii \special{PSfile=#1\space llx=\Gin@llx\space lly=\Gin@lly\space urx=\Gin@urx\space ury=\Gin@ury\space \ifx\Gin@scalex\@tempa\else rwi=\number\dimen@\space\fi \ifx\Gin@scaley\@tempa\else rhi=\number\@tempdima\space\fi \ifGin@clip clip\fi}% \egroup } % \end{macrocode} % % \subsection{Input/Output} % % \begin{macrocode} \immediate\openout\AsyPreStream=\jobname.pre\relax \AtEndDocument{\immediate\closeout\AsyPreStream} % \end{macrocode} % % \begin{macrocode} \def\WriteAsyLine#1{% \immediate\write\AsyStream{\detokenize{#1}}% } % \end{macrocode} % % \begin{macrocode} \def\globalASYdefs{} \def\WriteGlobalAsyLine#1{% \expandafter\g@addto@macro \expandafter\globalASYdefs \expandafter{\detokenize{#1^^J}}% } % \end{macrocode} % % \subsection{Commands for verbatim processing environments} % % \begin{macrocode} \def\ProcessAsymptote#1{% \begingroup \def\CurrentAsymptote{#1}% \let\do\@makeother \dospecials \@makeother\^^L% and whatever other special cases \catcode`\ =10 \endlinechar`\^^M \catcode`\^^M=12 \xAsymptote } % \end{macrocode} % Need lots of comment chars here because \meta{line end} is no longer a % space character. % \begin{macrocode} \begingroup \catcode`\^^M=12 \endlinechar=-1\relax% \gdef\xAsymptote{% \expandafter\ProcessAsymptoteLine% } \gdef\ProcessAsymptoteLine#1^^M{% \def\@tempa{#1}% {% \escapechar=-1\relax% \xdef\@tempb{\string\\end\string\{\CurrentAsymptote\string\}}% }% \ifx\@tempa\@tempb% \edef\next{\endgroup\noexpand\end{\CurrentAsymptote}}% \else% \ThisAsymptote{#1}% \let\next\ProcessAsymptoteLine% \fi% \next% } \endgroup \def\asy@init{% \def\ASYlatexdir{}% \ifx\asylatexdir\empty\else \def\ASYlatexdir{\asylatexdir/}% \fi \ifx\asydir\empty\else \def\ASYasydir{\asydir/}% \fi \def\ASYprefix{\ASYlatexdir\ASYasydir}% } % \end{macrocode} % % \subsection{User interface} % % \begin{macrocode} \newcommand\asy[1][]{% \stepcounter{asy}% \setkeys{ASYkeys}{#1}% % \end{macrocode} % Disable the "inline" option if "attach" is enabled: % \begin{macrocode} \ifASYattach \ASYinlinefalse \fi % \end{macrocode} % % \begin{macrocode} \asy@init \immediate\write\AsyPreStream{% \noexpand\InputIfFileExists{% \ASYprefix\noexpand\jobname-\the\c@asy.pre}{}{}% }% \asy@write@graphic@header \let\ThisAsymptote\WriteAsyLine \ProcessAsymptote{asy}% } % \end{macrocode} % % \begin{macrocode} \def\endasy{% \asy@finalise@stream \asy@input@graphic } % \end{macrocode} % % \begin{macrocode} \def\asy@write@graphic@header{% \immediate\openout\AsyStream=\ASYasydir\jobname-\the\c@asy.asy\relax \gdef\AsyFile{\ASYprefix\Jobname-\the\c@asy}% \immediate\write\AsyStream{% if(!settings.multipleView) settings.batchView=false;^^J% \ifxetex settings.tex="xelatex";^^J% \else\ifASYPDF settings.tex="pdflatex";^^J% \fi\fi \ifASYinline settings.inlinetex=true;^^J% deletepreamble();^^J% \fi defaultfilename="\Jobname-\the\c@asy";^^J% if(settings.render < 0) settings.render=4;^^J% settings.outformat="";^^J% \ifASYattach settings.inlineimage=false;^^J% settings.embed=false;^^J% settings.toolbar=true;^^J% \else settings.inlineimage=true;^^J% settings.embed=true;^^J% settings.toolbar=false;^^J% viewportmargin=(2,2);^^J% \fi \globalASYdefs }% } \def\asy@expand@keepAspect{% \ifASYkeepAspect keepAspect=true% \else keepAspect=false% \fi% } % \end{macrocode} % % \begin{macrocode} \def\asy@finalise@stream{% % \end{macrocode} % Setting \verb|size()|. Only inserted if one of the dimensions is % set explicitly (i.e., if both height and width are not empty). % \begin{macrocode} \ifx\ASYwidth\@empty \ifx\ASYheight\@empty % write nothing! \else \immediate\write\AsyStream{size(0,\ASYheight,\asy@expand@keepAspect);}% \fi \else \ifx\ASYheight\@empty \immediate\write\AsyStream{size(\ASYwidth,0,\asy@expand@keepAspect);}% \else \immediate\write\AsyStream{size(\ASYwidth,\ASYheight,\asy@expand@keepAspect);}% \fi \fi % \end{macrocode} % Setting \verb|viewportsize=()|. Same logic as for \verb|size()|. % \begin{macrocode} \ifx\ASYviewportwidth\@empty \ifx\ASYviewportheight\@empty % write nothing! \else \immediate\write\AsyStream{viewportsize=(0,\ASYviewportheight);}% \fi \else \ifx\ASYviewportheight\@empty \immediate\write\AsyStream{viewportsize=(\ASYviewportwidth,0);}% \else \immediate\write\AsyStream{% viewportsize=(\ASYviewportwidth,\ASYviewportheight);}% \fi \fi \immediate\closeout\AsyStream } % \end{macrocode} % % \begin{macrocode} \def\asy@input@graphic{% \ifASYinline \IfFileExists{"\AsyFile.tex"}{% \catcode`:=12\relax \@@input"\AsyFile.tex"\relax }{% \PackageWarning{asymptote}{file `\AsyFile.tex' not found}% }% \else \IfFileExists{"\AsyFile.\AsyExtension"}{% \ifASYattach \ifASYPDF \IfFileExists{"\AsyFile+0.pdf"}{% \setbox\ASYbox=\hbox{\includegraphics[hiresbb]{\AsyFile+0.pdf}}% }{% \setbox\ASYbox=\hbox{\includegraphics[hiresbb]{\AsyFile.pdf}}% }% \else \setbox\ASYbox=\hbox{\includegraphics[hiresbb]{\AsyFile.eps}}% \fi \textattachfile{\AsyFile.\AsyExtension}{\phantom{\copy\ASYbox}}% \vskip-\ht\ASYbox \indent \box\ASYbox \else \ifASYPDF \includegraphics[hiresbb]{\AsyFile.pdf}% \else \includegraphics[hiresbb]{\AsyFile.eps}% \fi \fi }{% % \end{macrocode} % 3D PRC figures require inline mode. % \begin{macrocode} \IfFileExists{"\AsyFile.tex"}{% \catcode`:=12 \@@input"\AsyFile.tex"\relax }{% \PackageWarning{asymptote}{% file `\AsyFile.\AsyExtension' not found% }% }% }% \fi } % \end{macrocode} % % \begin{macrocode} \def\asydef{% \let\ThisAsymptote\WriteGlobalAsyLine \ProcessAsymptote{asydef}% } % \end{macrocode} % % \begin{macrocode} \newcommand\asyinclude[2][]{% \begingroup \stepcounter{asy}% \setkeys{ASYkeys}{#1}% \ifASYattach \ASYinlinefalse \fi \asy@init \immediate\write\AsyPreStream{% \noexpand\InputIfFileExists{% \ASYprefix\noexpand\jobname-\the\c@asy.pre}{}{}% }% \asy@write@graphic@header \IfFileExists{#2.asy}{% \CatchFileDef\@tempa{#2.asy}{% \let\do\@makeother \dospecials \endlinechar=10\relax }% }{% \IfFileExists{#2}{% \CatchFileDef\@tempa{#2}{% \let\do\@makeother \dospecials \endlinechar=10\relax }% }{% \PackageWarning{asymptote}{file #2 not found}% \def\@tempa{}% }% }% \immediate\write\AsyStream{\unexpanded\expandafter{\@tempa}}% \asy@finalise@stream \asy@input@graphic \endgroup } % \end{macrocode} % % \begin{macrocode} \newcommand{\ASYanimategraphics}[5][]{% \IfFileExists{_#3.pdf}{% \animategraphics[{#1}]{#2}{_#3}{#4}{#5}% }{}% } % \end{macrocode} % % \subsection{Keys for graphics processing} % % \begin{macrocode} \newcommand\asysetup[1]{\setkeys{ASYkeys}{#1}} % \end{macrocode} % % \begin{macrocode} \define@key{ASYkeys}{dir}{% \def\asydir{#1}% } \def\ASYwidth{} \define@key{ASYkeys}{width}{% \edef\ASYwidth{\the\dimexpr#1\relax}% } \def\ASYheight{} \define@key{ASYkeys}{height}{% \edef\ASYheight{\the\dimexpr#1\relax}% } \define@key{ASYkeys}{keepAspect}[true]{% \ifthenelse{\equal{#1}{true}} {\ASYkeepAspecttrue} {\ASYkeepAspectfalse}% } \def\ASYviewportwidth{} \define@key{ASYkeys}{viewportwidth}{% \edef\ASYviewportwidth{\the\dimexpr#1\relax}% } \def\ASYviewportheight{} \define@key{ASYkeys}{viewportheight}{% \edef\ASYviewportheight{\the\dimexpr#1\relax}% } % \end{macrocode} % % \begin{macrocode} \define@key{ASYkeys}{inline}[true]{% \ifthenelse{\equal{#1}{true}} {\ASYinlinetrue} {\ASYinlinefalse}% } \define@key{ASYkeys}{attach}[true]{% \ifthenelse{\equal{#1}{true}} {\ASYattachtrue} {\ASYattachfalse}% } % \end{macrocode} % % \iffalse % % \fi % % \Finale % asymptote-3.05/doc/shadedtiling.asy0000644000000000000000000000040015031566105016102 0ustar rootrootsize(0,100); import patterns; real d=4mm; picture tiling; path square=scale(d)*unitsquare; axialshade(tiling,square,white,(0,0),black,(d,d)); fill(tiling,shift(d,d)*square,blue); add("shadedtiling",tiling); filldraw(unitcircle,pattern("shadedtiling")); asymptote-3.05/doc/gen-asy-options-file.py0000644000000000000000000000166715031566105017270 0ustar rootroot#!/usr/bin/env python3 import argparse import subprocess as sp def parse_args(): parser = argparse.ArgumentParser() parser.add_argument("--asy-executable", type=str, default="asy") parser.add_argument("--output-file", type=str, required=True) return parser.parse_args() def main(): args = parse_args() asy_output = sp.run( [args.asy_executable, "-h"], check=True, stderr=sp.STDOUT, stdout=sp.PIPE, text=True, ) with open(args.output_file, "w", encoding="utf-8") as f: for line in asy_output.stdout.splitlines(): stripped_lines = line.strip() if ( stripped_lines.startswith("Asymptote") or stripped_lines.startswith("http") or stripped_lines.startswith("Usage:") ): continue f.write(line) f.write("\n") if __name__ == "__main__": main() asymptote-3.05/doc/hatch.asy0000644000000000000000000000042715031566105014543 0ustar rootrootsize(0,100); import patterns; add("hatch",hatch()); add("hatchback",hatch(NW)); add("crosshatch",crosshatch(3mm)); real s=1.25; filldraw(unitsquare,pattern("hatch")); filldraw(shift(s,0)*unitsquare,pattern("hatchback")); filldraw(shift(2s,0)*unitsquare,pattern("crosshatch")); asymptote-3.05/doc/join.asy0000644000000000000000000000040515031566105014407 0ustar rootrootsize(300,0); pair[] z=new pair[10]; z[0]=(0,100); z[1]=(50,0); z[2]=(180,0); for(int n=3; n <= 9; ++n) z[n]=z[n-3]+(200,0); path p=z[0]..z[1]---z[2]::{up}z[3] &z[3]..z[4]--z[5]::{up}z[6] &z[6]::z[7]---z[8]..{up}z[9]; draw(p,grey+linewidth(4mm)); dot(z); asymptote-3.05/doc/GaussianSurface.asy0000644000000000000000000000072015031566105016533 0ustar rootrootimport graph3; size(200,0); currentprojection=perspective(10,8,4); real f(pair z) {return 0.5+exp(-abs(z)^2);} draw((-1,-1,0)--(1,-1,0)--(1,1,0)--(-1,1,0)--cycle); draw(arc(0.12Z,0.2,90,60,90,25),ArcArrow3); surface s=surface(f,(-1,-1),(1,1),nx=5,Spline); xaxis3(Label("$x$"),red,Arrow3); yaxis3(Label("$y$"),red,Arrow3); zaxis3(XYZero(extend=true),red,Arrow3); draw(s,lightgray,meshpen=black+thick(),nolight,render(merge=true)); label("$O$",O,-Z+Y,red); asymptote-3.05/doc/leastsquares.asy0000644000000000000000000000176015031566105016171 0ustar rootrootsize(400,200,IgnoreAspect); import graph; import stats; file fin=input("leastsquares.dat").line(); real[][] a=fin; a=transpose(a); real[] t=a[0], rho=a[1]; // Read in parameters from the keyboard: //real first=getreal("first"); //real step=getreal("step"); //real last=getreal("last"); real first=100; real step=50; real last=700; // Remove negative or zero values of rho: t=rho > 0 ? t : null; rho=rho > 0 ? rho : null; scale(Log(true),Linear(true)); int n=step > 0 ? ceil((last-first)/step) : 0; real[] T,xi,dxi; for(int i=0; i <= n; ++i) { real first=first+i*step; real[] logrho=(t >= first & t <= last) ? log(rho) : null; real[] logt=(t >= first & t <= last) ? -log(t) : null; if(logt.length < 2) break; // Fit to the line logt=L.m*logrho+L.b: linefit L=leastsquares(logt,logrho); T.push(first); xi.push(L.m); dxi.push(L.dm); } draw(graph(T,xi),blue); errorbars(T,xi,dxi,red); crop(); ylimits(0); xaxis("$T$",BottomTop,LeftTicks); yaxis("$\xi$",LeftRight,RightTicks); asymptote-3.05/doc/markers2.asy0000644000000000000000000000155515031566105015205 0ustar rootrootsize(10cm,0); import markers; import geometry; import math; pair A=0, B=(1,0), C=(0.7,1), D=(-0.5,0), F=rotate(-90)*(C-B)/2+B; draw(A--B); draw(A--C); pen p=linewidth(1mm); draw(B--C,p); draw(A--D); draw(B--F,p); label("$A$",A,SW); label("$B$",B,S); label("$C$",C,N); dot(Label("$D$",D,S)); dot(Label("$F$",F,N+NW)); markangle(A,C,B); markangle(scale(1.5)*"$\theta$",radius=40,C,B,A,ArcArrow(2mm),1mm+red); markangle(scale(1.5)*"$-\theta$",radius=-70,A,B,C,ArcArrow,green); markangle(Label("$\gamma$",Relative(0.25)),n=2,radius=-30,A,C,B,p=0.7blue+2); markangle(n=3,B,A,C,marker(markinterval(stickframe(n=2),true))); pen RedPen=0.7red+1bp; markangle(C,A,D,RedPen,marker(markinterval(2,stickframe(3,4mm,RedPen),true))); drawline(A,A+dir(A--D,A--C),dotted); perpendicular(B,NE,F-B,size=10mm,1mm+red, TrueMargin(linewidth(p)/2,linewidth(p)/2),Fill(yellow)); asymptote-3.05/doc/asyRefCard.pdf0000644000000000000000000035276715031566761015505 0ustar rootroot%PDF-1.7 %ÐÔÅØ 3 0 obj << /Length 2448 /Filter /FlateDecode >> stream xÚÅZioãÆþî_¡H–Úµ(ÎÅcÝmÝdÚ&þPÀI5²‰å¡’”&ùï}çà!yF”×úŤx¼ó¼÷óýþòlù‘¡¢>¡!ž]nf„ú!£³($~E³ËõìÊû¶y(¶mÕŠù‚ÄÄûIlD-ÊTý¤Þ^¯ç¿^þ¨%!?aLIZ P‰ZàÀ‘õºº®y¡5m½KÛ]-–›]™¶YU6ZÁ³ÈO¢I9H |–P-!+¶UÝÎŒ ïKóx2züÊû%@4%/„EÚÕ"bý{{×Cw@ú|O-AóŠJý^ïraÇ–ø,|QhêuÞèãèѽ'1Â, :°t,^ý–RäQ*Ï)%Ô‚uÊ4ß­ÅŸ`jS:ˆ—€nç€OÔ+Þf…¾"£ y÷säOlꪫi´¿}ØÎá=¡·±"Ĉ8Xµë8t;×7ö_z °£h8ØÞ•w`UtaÃPÆßV¦Ïê»ìJƒÈËÚ k‘æ¼æêÂÓLqÌ_VH ƒh»³ÄãuÆW] Pº ì¥}¢ÀÊ€ãÚ*&Žžï ûØûÍfØëê–vÓZÈÈ,3‡%bŸ†ñž[š–·¢eÛL&c- PÚ¤^©ô¼åùî¸Og‹Çëÿa«Û²Þ2?õ#ßñ–ëjÝÎÁÒá²ê O4K‚]\6í$…Ÿ!¤¥­tqÕU+¼ìšÐ LXUµ>nxÞå«‹AÔ[UUn]uüu¶P–ÖbWzuä1†ó.¶7|—·çÚ³§A"A„"2)+ç°z+®EmW.f˧dõ›1Ç*ÞZ¬«]Ÿ¢ÛZ¤Y¾qÛ1HÀ™µàn;šÜ­ê5ôýµ̳zX2­Šm.îMs‘ºí Yѵ­Eí\=B,Ô²&´L¥Ð©yÚŠZûDVÚÓQãýŽ™Þ÷še"wYc,¨JÜÖ]eò,ÕWß‹ÿfÂ ÙæYiO>iªöf Á®¬ESåº ®µr‡@v«Ì±ºæ@I‚¼ë]¶“®òª6ѯÒmXÚýA“"±¼ËÖíÍ2å[“°K¥cù|Ô›s}^ÛITø$‰¼­(§ å\ E@(&‰w—5˜ž!?¡Éº(pˆ=žg×%Ö™¼¦‡kêeÞBd¬v­hYoü¯ÄdV¬¡þÜ;fÊ&)T¸ Û¥C:mÀŸ)ò;e& {wÔ¼l6U]¸b?~æˆÇK¨‹ ­áX2—¡¥É+7¼¼tÔM*äj31ƒ8S'õÉsÝÒ¾$g¦ßd×7}\§•ñ˜ÃA#ªBRL¬XV§h€¢ˆÇm•­§«÷M¶ÊLÅžgif Èë댻Τ¶¼i]5*$PýĽ0hý´ä@Ou¹ƒg&ýÕ¾O¦/ÊL7ÝOwýÃü·®œDq(i™€–éä'.ú˜z„> ͰH¾ÓÌà‰©á 2.0ð}WƬž„°™„$Y¹©…¸µ '±t5¨ [GÍBŒ@IØ{Àé*œíUþG±¡(oOR…NÖ¸† cÓ÷O–ö”¢Å3ž!.ÇQ%ÆqºÂk¦ñßòҔ쌛âFÝ=ñB?À“)\*Lý( °´¤C_ÿ¾¿Ú —ÿe*æ:‹FœÃJ4ÀÞ—|•>gæX ˼ šÐ€í¹ñ9 5€‚QmLyM{cŽ¥ –½sE„bïD(8KÎõ„$OOCþÁåëFQì½z–uc°î«©üøðb–Š ”]z3!c¦þôÕpúÍg+Ådj†Œ¥{kùÊœ­¸BúIr¤-Oíõƒbš(倧NÛátõY(M·oynP݈{£cVtæÔ­ÇÅÅ`u½|°I ˆîõµûme ‡PfðŒRìkˆ7Ý£æmUOO¬¼¾Yˆ¶£Þ)Ñ/z‡"yo4Ê…>¼Ö‡å”‡­º]3ÌWµ(xV® R%õ¾š¦|ÅTjœÐÃÊØ;ˆ—w:³¿x§ÿÕÌÏ¿˜Ã»iîeÏh sBè}1IËõþ¦€ž6Ëu6ìQOtÌŽÛcÕFgÅO?üìØ0¾¯¿Öºüþû“ÁÜWŽñ=ŒQàurõáßSMJE£Î=ŒíMÓ«ÒV§r1„ä®ÔgohŽ õ˜ÂITÓ̸e7wõ›„úÒ0elå~¡šéÔà=$–Ôk// A¡÷¦Ë«Å¤»À„Ãxò*Å!ñÞ˜@_˜ãks\š¼øJ¥Èô€u¨ƒgmfFˆBá Mg!Ü%±¼‹bŒ"Õîi¢åÛ¢:†æOf£‡¾9Á£ã…0óQÌöÖÁŽuèx·Ï_ÇBä˜E>N€æD~ŒBúó†(¤‹Í^Aý¨P÷Yº-Vqt/Ü·&¬¶RY4™ ‡yl+SØò1ÄÃí1t»Ø¶]Zc½ÔG˜©!*ïôôq7—CWíØ7¸nz”$ÀiЬt‚‚ößÅ”ö«nÌ—™ÿ©+yÍÔÅ™E4ö~›ËíÒíNmf‡µæ¸x ÜÁ[¾6ò_ÏOèÇÖ花è›ÁæpÏLÂÕ­ÈZÇþnH.—ÓÔí2¨_öF½»›Ì6“^õÚí½â­«ÓŸÝÈV‡øí­ ÝÇ?M:¾÷ÝÞHkxRo©ÿ— I˜L‹6+wâbª›-›Fƒ#ôY÷íǺ)B"4õÍfÔP÷¶âéôê’TtE¤;'˜Nan“á$¹ãÓãA÷\íÐSÛ°jåºîøPÕŽ_ ‹g äI@uÀ>fÑ`Á¡Œ*oT–7 ¶Qã¢ìöoNW=Q´ÆC¶Yªh[B`,íÔñ ³ï/Ïþs†L0C3#9M0LýÍÒâìê×`¶†[?Ο$ñìN=X@™†Ê gùì糞½—ÿd±‡'±OY4cr³+6sI¶qÒ¶#ãlxøÀèþ¾hB^äùÒÿy@âãäñ tä$1VïЄøqô"î¡10”nlT!ó¢:ò9Ø­]“l¾ˆvê?|ˆ^RáÝÆìÀÛŒL²QêÓhL/þ2 Ë„É ¯CNYÇáÛEûIHžê]ø ~™Ø¥ØGI<íÝ£#¡Ü«¿åf/è­³Êðº–2øƒëÿ0^2pâSú2€‘O˜ù?‡¾<­v!¬Æ­±Ϭ–Ƽ ±OäèGBê#ŽÒMÚè0åv endstream endobj 15 0 obj << /Length 2941 /Filter /FlateDecode >> stream xÚµ[[›H~Ÿ_ÑO+Zƒ=P\2Ú‡dnÚÙ¬´Úí‡Y% ã²] àîvòß÷œº`pPNg"%mÓUu¾s¿ys÷Íw?SrCÈ2¥Ô¿¹ÛÜä&Ž‚eÇ7wë›wÎëºÎnß95·î~ýîçà&^¦±Gp­w³ Á’"—fb©çœÔÊ´·ôÝ‚¤>Möt¸¥¡ÃÔ°$wŒ›) (³ýÈ6ê|o—.i^b[‚þ‚8Û³¶ò!7㣄NÇ?\Iž#ùrÍÙZ>Xõ±I\>«‘OªÚ&ŸÊ/—Ò¯üI§Ùy=ÏNY ÁöÕ±éÁtf8$ˆ½Ð)ÙÈvÉŒa*ÓNâ¬ùÞ¸# œk•’£Rª[PŒrÆK^nG…[>?]þbÍØAX8⡨±“o4LSçôÞ£^é>Â2¿`å¶Ý™m6‰“)%‡Îr°û9 *iä§¼à¹dç½Gh¶5Ó‹‰MÕR4ÃJÎJ8H¹±ž“Ž Ðˆ‰ÚЗ‡ê€ò¶öáØìž¹çµˆ ’x3ˆ€ B²2€ìB¬\Ka͇„l ˜?â–@ È ´Ì/V«@U³¦ YÛãEhËtìÅh8 Û™£8™1:˜ÄA$œ»rÝàçx}Ÿ£Wœ86\¯Á6ZöÜL^Ìiš¦á4§kv‹ ­e‚ÓI°t¬ÒËow^žë0ß™€tà]ãÒ¦¥#¹ŸÄÞóçîÇk•…±&hÌ®€³LGÖ3(mç;ÖîXÝÓˆ¨zŠ>ï”Á[žü ª£à€üœt'ˆÄcu†YSÖ&´o&ý‚åŒð¹¡™0‡³‰ä)E{ój¸ô¿^¥%ŠÜF.ú×c¾ù§÷‚;n¹ Ÿˆg€"2e.Æ);Ãí=Ôš9› ° ¾ïQ<à4Ï©¹´7 ‡ÌŠ'™Há3â#qaû#+sö†9бtËoɋҀ»Åèî¿Êaø/36AŸòï=«›¯*Ç &›+>ññExÅ9À9žÐã2^_¼÷‹¢Ó ëx¦ê£~—Mqš*ð7c~[uÕØÂD ž8ûì ¹°r·cÉ7U½—HYÝB­Ê¡«›SpfŸ‚Wæ¬ó<Éj˜wd8eõý-tòYѹöcXzÄ€&xñme§½¼*s]'5²`9T3$Ô „üxèÌ Ò0 åi€£Õþêú¯fí±VÂjªºÕ gzc?!‘Xo]^÷ ,žè4pi5õšÕSæ^°“w…g(.>´ÁÓ°¬ÎÄî9û¦ä¹ Vªú„Òcæ’bœ :'tIj».KñW¡­Õº"kë#“ I‹Çk²#|`]_¯8؉U²}-®HÆpˆçl¸MoEGQKÇÜ Q‡ u¡¿ö°Š&[ .lLTcM|ÿŒµïÒÃ"ÎéÌZþ‡®3ÅæÆˆç¢±ÏEͳUÁFjò8T$Šz‰fJÈ¿›Nqî… ¾t¾x úRž— w Zï¼>ŒNË&Ùûó%‰øó÷=dÂØ,dË’åmUχ›¶Îøv׫¾¶î M©³XÌ ÿ {â(ì÷žÜRÏwtÕ' (öÚZ(ÀyÎ[]MKªµ?ÈÉJŇ½Ê¼"ÏrùW c/GG ƒ½¸b;ÚMîÉŸŽŒÄ2Ï€Ìʬ„¿crH‰ó·¹¸UðMÛÁÇÌnî´H@:üý÷9TË%@jº²(k –éÀ}fêYª…ýÕ«—œÍKÌàîÒ½“Ô#æø%X/qS>åKšo3ŒË`Å„+©`3´]휌ÀÓ¦R}3]Ù† fÜÂxFÏöà3‡A:~¡>Õ¬€¬qNÂä5"ntI „5A¹ŽoËÉé,ñ"¡±sXãÖ,+ÜCÆk›za†%?öÌ,ù‘f ?e«¦*Ž8~ÂoÊ•5;b²ƒ‡uìŒGH/ ˜XÇ23ϵSé1k9G«F͡Šʠ\×ê‘"=VºÓÏfŠ êj"¯%tÚï3y©†ß9ZËÂìAºÍA4 »Ëœëzp?8¶’8!â\â< /˜"­&:6P&ÅH|”#œÓÑ1â5Öõä‹Î:fÝ%ÑenöÓ¤£*´èÎòLMDå ®BŸ}¸>Og ’FÉq¼8b¥ûº®«‡J_ÿÏ¡ÙÉ|$¡äŒ€Ãv±Ø½^û~œ:÷¼áXäŠ/*0Ô*.À ï>´¢/ÕšvWWÇíN>n¥Ui'@hÆ£ ÂÆ£¤ðž¡÷ùxCÃtû <:ºžk,×óU`·I×@ãôJ¯K“8€Ž¤(®q¹9ÓÞ€#Il{W~9å³¥a›°6? {Ür“©MÆÌ¢+1l•ÖßçÉ}ºm …}]:lu@{ÍôÂA>žŒ¬…^ê 2ÐXý€fùdRF!^ª÷‹!q*äèþÉj.¹Võ¨®¹&ÃŒO=r¦­5ÿö,/íç?\§wµ£r4D>DBÜ †0¶¹`„ÆEì;N},ØXÁ ESŽŽ)a\ãšgZÂ<ã~&ã¶N.IŸ_y—,gµñ‹žxæYÁ."•—ÕÕÞ0øéÝÚz.ù`.é`b«Þ?ÙÚÈë?è0¿¼¹¨OÆp4¶@ZÉz»Bµ»uW6X~ø×ÿþy‘,&„@bj‹|úd‡„^!•{‘~¿f9ßë@$›63˜0N¨–Šjîìî ‘”‰ŒTÇF^{ùŽÂ6C¡4‰ñXaív®µkî¿¶v’vÀ¹ˆbç6î½Ý¸µÓYó…5M"ègJ½cönv“ «Gú±^`ållÖDsJx‰ÚÓ0C”sf )_Û)ÛÅê9iTmˬΌ øèå3‡>ðµR\ÿx%žsW⑯O˜3E}ó/ 9ÍRH@IêxÙÚZºÊ:kv–R ±óËç^¬ô-ýñ! S±q=Ñ$z†~½œ€ n\ã+6Úòr-=’„qŸ+;«û·è©šö¿yÍÊWÇV›ìÆä î0bm4¯ùã˜Õì¼æ*rÐæ•k[ziâ‡rÇR;@7¾€û‘åmwƒ(ñÛb©GöØŠðcƒcÏ[=ÿXñ±ðƒoÁJ<µî-5ÊžÜÆO’(•+'T@Uù.G’ÅGy‡{nºŒ)…òÅÑOâáê=þMÁ’Â+Íq/†ö—àí¸´àËFV温úš†?¡T˜V%$»q ÐÂ6v‰¾Íîð²…Ã~HzØð›¬%ñ+se[ Rw“íyqºMÇmXÍYã6»L—£u„§ÚXY.[½q×)H).ºPÜMïáoVÕV=ˆ#‘˜Œ©ö_ÉÀ.qÝ·)?]B¤3CS6u ¸áˆk뎫s„Ë ‰njÊ>Cë:w J#Ów’:?TGPq-ðœ•ͬ^ï±ôêá=ÛåÿÜ™kOˆDnƺætçU œóÖÔ3•|u)uVœ¶U)Ü[ϲGAÙnŸ}b²$µžšìùãùÝ"åPuÖVõhj¢Î·› ‰ø¯f ß—‘¯ìÏÇ…ßüt÷ÍÿƒzÞä endstream endobj 18 0 obj << /Length 3012 /Filter /FlateDecode >> stream xÚÕ[[›H~ϯðF-ÖØ (.»j­4Ù‡QFJ¤¼ìf"-†²] pßFóß÷œºܦ¸´»#íKƒªóSç^Õ?zóÓ/”ÌYE”:³O› gï®ü ˜}JgŸ­C\ïæK7t­âWÇbe\ó"¯æ_>ýúÓ/î,XEMp¨=[wE ‘#ó¹k[Çý܉¬õ| Ù|I¬&¡žUläµbÛ=_Ö•|Âs¼RIXÒpZD>‹J:¾•±|[ï~·©='Ö®¤V´¢¾7U^ˆW)›ˆ)r}ߪø#CD£àpEa`æ‹Yä‹ä!É>OþÑ9˜x$ÅW<™ I- È¡6"ã&dZ’Ï㫪˘ow‚v7g~äŸ>«k þúòÆE\â‡Ö³„ÝñЉ šäˆ (èhÃÊ”çq-µ^)Ó¸–£k¾gÆÑðMàÇ:,—ŸÃÇa¹VF 1Õ°þ°ø¸ÉEV4yJ2¶©‡ÊjªšÜÅ1O›ÔNe¤ðç~ZAë‚If>¾su8\4ÙKì 6@ûz éË€'Ä 1¤>#+½BÅ«CÆk½"Í7M‘w…±’c=X|ÅxË7˜Fú¾C¤™|ÍùÞ°E>Æ}Ýñ–´…í÷\å×å‹t¢ôÂjˆyiœ h×ó# SØm~ܯY9¡’˜ß€2ãºóŽ™n×ÃêÞ)ˆ"HçÆ‹Rlߟ¦üxYö¢ï®xª[“ëÑêX–g¶_²íÉS7®¥úISE›#* <°Ä#ÏÒäAöå„3¾L¬¿Ëy áÒ=[0‘)lKeYƒìËìÒ2¾CxÛÅ©³âznC_™®:áåHÑâ>‚í·c¬ãMZ AàˆŠŸ•K_¨u+ŸÔìþ¼:*À•óîÎ ýPÐJ˜S—lÈï4àŽuƒéjX‹m€ÐƒçL¸ê¿Èj÷¦öL·ìsp"ìš·N‘3Ûe”tq%“E9r%ã2™Ôëª<±¨aì¦,öj=òmƦvX¨U} ÇDLIfl1%ôhRŒ]¢“Jϲ‘ìakh)‡@e~_ ´ü•@uåEr'_¥¨wº!Ú¾mË÷OžõÀót儎òQ<ÁݲžƒJ÷R-+9À-¸Quê¢eÞGÔúRµCú&õ1¦yPĉ†Álæ%ÀNÍVB׎Z0Û1ý|¤ê̼ÐY9T†á‹V`èZuçÕ¦(÷çm@…¥yÝŠƒ§ ÇuÄHõ€pGåÄ;® ¾Î·X JéEQ$Ǫê§dq¶À?W5.¡í69üt¥$ÖQ` :ß›FçVõŽMê¹ Y7Ç:£šBÝ#!Ê2æþeyz¸‚§î±‘­yB[Ç}k1ZU‚Ù‚ ‡c ü—K™¹Î†N+Ñ­Ð!u=IýŠeÐâl” õrÑ׃Baä…-¸‹‡1€÷ñAg­Ý9òýße’ܽô~+—!ôI{‘Zéî;R3µ®@ùcgû®êòö­Ñ/ÂjèºV•ŲƒV:›RÔqmZrc¾ÔʦŒÊš²mÉNÛ#q@²".o”K±ö“CEfþ`<¡`&Ý82žŸ¶i‹}km†ƒÂ&S[Oû2oE"uFê!Y#>ã”jRä ˆ!?-SqPޏ. ±…DÄ>éÙÚ5*Ñ«3žt 4+ÃÞq–#§m.W½6㉽I#v¨9ÿ)ª¡³œg'*ä!Å$œ*OØ`¬îÑgÓPnÇõ©µá¹È¥ªE½˜7ökHÆ»F2YüÅB=×*ŸÊe9ÊdÛj)JÿéØä5nvɶ.HWÜ¥óaìæS6}ò_ú®cc;‰•Òù"à $<åÉ zÅ“›28y<(Æs)¬lö“Ÿ¡^àƒ*fˆêNàÊ÷*½•Õá­Žë¶œŽâ?SJz§aà4WþÜ¥w(Ì*@áõÊ¥/™Ü8+OOþa.jÑ=¯ÔÈÚÄ¿ Áu QNàâ†bI຿ŠaòöuÄMÊq­ÖGQ¨Õ‹ƒÜÑ…wÂðpŠž=‰Ët%±£7ø±Ù‹XÏÕ_ËŠøÙ¢|N9{‰¬¡qjƒ§,Ö­Ú,q]Ñ 7 .‰Û^ñ8/jž¨O$î "ÜéJ]Kçšžå-ö+q)ÀcCp+D”ÊwE._ÅY&HÙ¬.M`IBñ¿­Xv¯lX.AÇÅßüëÓ›ÿ[¬0 endstream endobj 32 0 obj << /Length1 1927 /Length2 14360 /Length3 0 /Length 15551 /Filter /FlateDecode >> stream xÚ÷PœÛÒ€  Á]‚3hpww‡à܇Á]ƒ»»»»Kpw îî’à~ÙrÎÞçûÿª{kª˜÷i[ݽºß)Ȉä•h@@1µ-#@XVH‘ÀÀÀLÇÀÀKF¦læ` ü–Lhgo²æú—…°Pßá]&¢ïðn( ²H9Z™Œl\Œì\ &Îÿ‚ì¸"úNfFY:€ÈhK& ²qµ331ux?ç? CJ#'';ÍŸîA+ ™¡¾5@VßÁhõ~¢¡¾%@ dhtpýŸ<¦6\ôôÎÎÎtúVöt ;>J€³™ƒ)@h´sþ( §oü»4:X2€²©™ý_ %±ƒ³¾ð.°43ZÛ¿»8Zíï§”$e_m€ÖËüe@ø»9F:Æÿ†ûÛû@fÖ:났lô­]ͬMÆf–@ÀW1:€¾µÑ†ú–ö w}'}3K}ƒwƒ?S׈ *ôß+ü»>{C;3{:{3Ë?j¤ÿ#Ì{›E­„AVV@k{Ø?ò1³¾÷Ý•þï˵°9[»ÿ‡ŒÍ¬Œÿ(ÃÈц^ÅÚÌÖ()ò·Í»ö™ ÐÀÊÀÀÀÎÆÚ€.†¦ô ìjüSÉø‡ø½Ow Àø½  §™1ðý ÖÝ^ß p°szºÿ[ñ¿ËÈ023tM̬aÿ‰þ.ÿÅï÷ogæÐdx?Fßÿ>i¿O˜ÈÚÒõó?¯˜þ«š”†°$õß%ÿW)$r¸Ó²²h™XŒŒl,ö÷Ïÿ#¯oöwÿò•´68ÿJ÷½OÿIÙéï ø{A(ÿKô>¹@Å?ƒ®ÅÀÊ`øþ‡ñÿó¸ÿéòÿoÊÿˆòÿ:èÿ7#1GKË?õüÿèõ­Ì,]ÿ¶xŸ\G‡÷-½ï‚õÿ5UþµºB K£ÿ«“tÐßAkËÿ¶ÑÌ^ÌÌh$oæ`hú׸ü%WùcÑ,ͬò {³?^-ZF†ÿ£{ß.C‹÷ׇýûLþ©¾/Ïÿ)jm2úc˘ÞoXßÎNßöý’߉àÎø¾ŽF@—?§@Og rxw¼ç 0ÙÁþq£l¬zÁ?D;€^øâЋü—Øôbÿ3€^òbÐËüCœïÃø_âx÷“ÿ‡˜ôŠÿ%Î÷óôÿ¡÷ó þ¡÷(†ÿ¥?zCoô/dÐÿ…ïaÿA–w26û‡ÿÐþ Þ“7ù¾››þ ß[òoã÷¬,ÿ…ïiYýƒï›Foý/|O ô/|?Øæ¿Èònkóþµ¶;ü#eü[úצüãûž•Ý¿ð=+ûÿ"ë{ö@+3C%èŸãYÞÛio©oÿ¯bßo柠ïûGï`jüWçß}ÿ…ïÿÕ¸w×á{=nâÿ ¡¡£Ý{þ¾&Þ'ô?üç{tÂ.̓ ¹ýÍkýÛï«qi÷&xgÉöÔ’)iÝ—ì~8>"B%PV¥ß°»LîA^Ý¥¸X&|q?i©‡ jSh{òxÖQœÞkƒ]œÂ˜Ì?¬ëLJÁ£UØ÷x±õPõµøÐÞ)E–mëÈ(Ÿ‹vïÜ'îR×_º28¿§°_Å& ÷\:C¡®å[ô“,Ç c‹ø“->4ê¥ ÒÏ›ÛYÔ¬É7B©jXÏÓæwM¦È‡9·µre&û.lRl ,ü7¨cÓäîB‡‰RŸÜ‹ Ã7x2ÙC¢†–ýûbç¤U±‰½ä±ìüKhyÓ|d:ÑH»²œ Óì,U 'åä_ë ÝÈŠÅã*I†‹u3ð̼^Hð•bÕÁ¨ttž«tRyÄFaq1FLXÜò¢mwdx±=?|¢/ÓŸ—L0['Y–ûŠ93®”ã)ª8lQŸï®Ùÿ–CWxGkþÁ<È£ÐÁJk«Î…ã³üÄ“|ýaÜÅÙKAg´é°fC5ú †ß²ngðΔÓ+s\#û/I¦ÏBˆgeCRÉ sèVöx*jS Fê§DxÓýüˆ³/g¥ü+ 稧,g@Å0‰8íÙPºoÝ©q<þtß]ŽóL.ÐW“ Žc¾Hœ†¦UŠý~Ãìê¾÷§ ª•ÀVèÉ”´ú)´“ ’š"á:ÕÂG¯Kd㕾v"Á‚u862Ê"Ù¦ ÑAïVçH¨÷1k{®FKÂ×ëøšîmÉhlý+ôš!Y’:Ñ2¬”Ó‚="’gò §í¼óþÔ¦ûN6[ jå„ýDЬ Ì=¹m¯Í÷ƒ/!ä¡)²äµìõ(-(‰Oµìð½=Xd‹šY‰ë¾SuT!uâŸ.óT‡O$ˆD†×Ñ´É\›SÇÇœŽtüè¿=ÉÎ vaè¹3%ùP¶á¨)°ì¹u¸D<ï;l$#JC0ïÜ×Þïw¢ëvpiÆ(¹ˆµíþf™[UèiDG ”‚;¨¼ŽN€ò.ä%,‘ÞÁlA0·®’$vEWÂ…_iô¸'oÏ î½±à;4ËhïY:ECGs©?1hqìáÇ- œ®‰Ф\¨¶Øg¸u%<ï "x·!ˆÌÂçðZ– \L6¸) K4}¨‘‰(fû˜‘8æÐßE¨±ª=¥ž=diòóÃÈ‹Xío”óí–n 9¾\´òml²Kde·é÷EBµ{ék¤D±ƒmÝnœ‰¬Ëž¯‚(Èý á•&|¦B÷A4L¸m‹9 ÒsÞhØW´-ŠSNôà+ü¬é26îRiÝ#lKÒ@¢lÖJ‡|mv¯¶@ÿËlÊ_Zoy83§yé÷ÍóÈ„{¢3¦©Í¿Æe“Àþ£"º¼ßÕîÔIÁÅéŠS°ªØœ– ©E (¹±r9ã#á'ˆ”TŸ:ðCä$qœŠ8Y ÜÚÞBXî¬|‘Ö”ø"ÇÚƒK™Po<ã*&{7‹ëùz_™’ÂZ^ò±VÜ ˜!vàFoh±”U«ÝÛ«`îu%.¢Ãt‚4;€h–BƒÛÛI‘øÏ,ár¿»]Á˜-||¼À¬"f…¸)ÚÔ/ ®Óg%XY‘$7RÐjèµ`\v­§T‡KÖÊUlæˆx^ÂÈÞ‰vìÅÖŸ‹‘zæ=4S·jøX}%#ÐüK3ìšnà]M+M]‰v,TG•†*Ùƒ$áî•M‡ô•ãnÐ×@'þwþ‘•ðjFö*’÷¼Ú³)Ȳ³©1FR÷ZßJËÄ]}šXŒ(7ä¢vðšÝ‰1-´BÚC•ª°)÷à—‚¼¼“÷v7Õ]ï[ª=+— à]9Þo^­‘j¢‡×ì^¡ÆLŸ©–iu„ùÙ’êõᨋEÛ¨f°6‘›Éa”ƒv%ðÙ^»kŒW©p= Q©P<ÜÞF4U:³l{Æ4ò]6Å—•튭ì ×|fpÁŸ‚k€Nÿºô ¹™\<¶jSÔà ½*M!± Žu²ŸV*xéí‡hõB@Ÿv*ÒjBk˳4ù¦çJ•´C3W³;ü% ÙX…›å5,¢6[á“yËUì£]Lè'“¶ B“¤ Ðú*¾ zW»iHAIÛ*ÅÏ ÓÍaËBV]g_n `«~3åÇW,Í©àØ ]-þH5‡Qž¡zî–øâ}E¼ «µžÊ¬4ÊÊÛô4ÑH-»!5FøîÙéXP|Á˜ëÎ|È¥ÐXè¥V‡À²‰ïQø¤¿@ÔÖv)ÞÿšƒEg~zd©sZ$«Oÿ™“~'¿¹kʽb¸( µLƒ¨^WÖnÙr)Šê¢Íü{Væ.ÞRëbhŽüGap“X.k)˜àG™Ö>Û(œøA»sV>Î¥rŠªuRHì@ŒÍßÑÖµd§[“Õhß‡æ½ V>fhÛá±%VsÒâÎ,¾‡Ô~Î˃$¨½Á5Ævvuõ@Ïq?TñÂä±ìÓ•ý…™ Öáƒrn¿²Ð²¸‰¤;ÝÞ÷41Ç'6Ö—ê«4lŽ”õŠ‚ûX™Á†A–ièó$Ы!.)tôë>$ ÄLHLÐý%%ÆÔß“À À~œ#‚½Ž1ÖÑq€k½s4M|ƒŸŒðeA¬×¶â@¬^; î‹9±õÒP¹´E‚ëçôI¿RóÑgÑÀ_Ê”çHUHÙÄu| ÎGkNOu[¤ŸéXŽã¨fíùW`Íîƒ'mÀê ú·µì`"8Ëz75xœ¨KG>UÉï¶%LPã¯p@D¡'â=¸†Ñ¹Ï, d‘ïT)Nð\Ò’Üà ¶#Ìyù,e‚ ŸÑµÅµ¿"Â…S2ˆ…¢HûƒÒM—xŠÏ¡®¯G¿òø£ØŠS¯’c)*l»oY U„\æû˜‡îÜ+Ýpyv¬“þñ¦Ò^7» Ù˜÷‡x!!½s‹|OÑž=¤­` E„qb±”ã3uäê U×É G¯=Ó2‹N'U¨ÙülpŒ#TiµÖ‰ Ž_ÅñÞ=Ìh‘àO(sßžuchÏä–(<“ñ=áæâè®bÔÌÊ0ôógüqyÁýŠøñÊp¼ÆÒ5>°”ÎÏ.äÇù\¸×‡a‹¼‚Ó é³%'˨ "ÇÈ„¬ŽiÙ§à13•R™.^©~õ‹Æ‚l ¸;ƒçÚ&é÷Q"[ÙŽ5‹áeçÏ‘AÍݸMÊð¿W¡KrÄBâkùxÛ‘-r\6†’Fgfí…‘“0Nƒîã5ëgÆÇžDU‰ð°úGµ×£íÑœEß®îË«–NÙZËÔ"àÑ8`ÎêxàÉ\,É}q‹`ç¯+Ͻ„L·y7Åês7ˆ™´Z´iv½gkì€ň–bTý¡ßØŸ—"–õòájl”øÉšÍ|Y'£·‘óë!CJÀ_â®hwˆÛGOâDz9<†?Fèñt–MÅ@¡s‡)˜,÷Éc 3(IÚ1'ÒØ‰à ËßGø~ûêæ:où“òí…¸°ry#ƒ6¹ã×µ¦bšI9‡^bÊ3„Hò¤ôÉØ9p‹ÛäÂæA©¹»¸Yñ{ „Éõ\öû!—dîŠË ¹Ž(/³ÿæ]¹Ø~í² Qó®Ï}°ú†}Å{Ü¡3"{„ßgà{+äÞ@ëŒjj"Ýý¥3‘ÍGó-_ìi5><5‹ <^¼÷s+ºy 9Ø9¦ ù„Ry)Òq nxY²RŸI‡ÖNsÏShÊÉÚôGjSº t¢á¢zþ˜7OHêþ±áëœä #á±ùîÛñ¾Žê<Ÿü~ ÁúX¬œ’º‹d ­h D§¢L)Ì÷WéER%µŠ”°Ùkzy¹ºO:S ÌT Ò7»¾G}/«M”ž³*¥ŽdMˆgHY9~év˜” Û3 7°ÓHgd!ÍeòCO´MLRfï'³¬Ã?"®2’€÷€ZË[š>cHªfÈß-z…41òŽ õßÕ)ègyÁfß§4ÇÿZ¸¬èÓGй¾Dèd—Ís¢m$…Ü@ –‘åvòð8oóZðÇO|Xy5(—÷À³¸ÅôfÉ{= ´÷¤Ré]”.4/J¹2´ÑööJáàé؉îNfnÌ3oÙcÊúN–ÎÉ.7qIêæ­ÓÓ Ág%Ó+#·ÃyçrR×x Ð_ ü4I¨òL)BÇ?>6ÏÙžQeÌ¢xËTz9­ÞÒ2†íLB€¤«è† ­1æHi»µéxD»E¼f6ÝQ:ÝH;ÇØDéuùDÉ={ÚG6ŸÔ³­ ÍóÔ7f<æ5oœÆk›þ£ ]ª¯¬\„Hc¥cNZwxưûî˜b'Wk0‹.ãpJâ¨Y3x, D*ê¦çƒ<û}lÉ(A”"u³¡ÊV¾²ò8E&%a㳨´ŽÑ Y}ñïW¥0:éþÒ,rvÛ ç9ñìÅ´ÇLÒMÕi¹œŽÅWK«6[&-É@ïͤðÖU°ñÎÓ|â`}fÊ>Øl8p9öC)ö:Â?·ÙKöæ¥ëݨD¹±6FƱPô@döhÊüäd˜Ÿ]»?—ª«%ɪ.U{ —Œ?Žf˜t–“Ó i-Î_\mòhÑ÷ú¬Ô«çbTð³Å‚&Ï{·Äu_×}²Ÿç­.ãðokÚNå,‰(f—2/Ÿ~ŠÌµgjÓßíÊ_S~9uzf ,ë•RõžÐäì´*à†>µ‹F´ƒ ŠžŽŸr×»èÌœû­Êù%¥•ǘ³«“¤ÕÍÄ~š…Š_©lR§ðÞ4Ûý¬¹+Y¤&È#Ð|¸“Æ[ÍvË_…vd†NŠ <"^r‚šãË g/Ãz³6q#CxåJ Î6o¢ëô+³*­jÈõ’¤¬—&bVÿ5áüLFánÕý®;ÙaO‡{k8 E ]$˜%˜ÜýŒYiÍc­vg ˜_bs]c¦Ã!͘üäJeBÑW¼Ì^~¬€ç1C×4Š7ì{Qs’.€ÁZ©pQW °‡ÁEvÝ®¢ÌmÁKns S+túµ}¢$Úèm|$>²×&OªZÙÖN·¸:ëQª—¹p=]×}5¿MV\h乨ük™ƒ¶£o*ëþœfսꊿ³.GƒÝBgU’@ ‘ÎBú¬I¿P޵mØŸ ù››'ͨ…ùcoíÆö€àÒ—#j<WW¥Ç”‹øIu·×L«£%f—…ë3i¢ˆ {ǰ©X£°º%^;,áuþ+Ëv¿„1Uo5#×µV)¤èºéC‹Õ†“é{8¥Ö6S¥5é–ÝÊf HŸ…ÇRœ„Ëfƒ-ûKÜêWwð.I÷z=r€’ÍëÜOøZðÜä˜Êoë&Eø8Kî¦ÆÈ«vãÆD~\y Λֈ„ËÜH- €#ÁGi˜T~“Èžr1¶ÇIYÀj9)û¢” Æaú ÁºP׊“•Z&¥GƹN,Xò®ÐW• =—¸™yWŽGxŽ“J*:aQ ›käú7cbVÁ0˜Üý_¶èÇàÚx·jóTª_£d+–çi”.Mt¡uµ²B+iÅGÔçîÝê©Å=b¡sŒucí´EÅcV6ômWÒ#M¢‹¬`æ´d­óÞ’ (ªEjé믗e ÊP¼ÂŒ¶/–+¸WÄÓøùõ¥zU•‘¶^]uW*ÞšLò¬¼6Sõj5˜Â·¦‚= §Üw¥ “ïóám­(Ö‘VÒ]S~7Ý‚DÆõ”K¥„£>®^I¹)ê¯^ÎâË?×¾ä-Ä#/‡Œ¸ ¤ ´½†ÇÉÚLðhFE0Lò¿¹!4”¯£¨J5s-îMú'‹"ÞÐ1ü¦?ÇëCt—Ú"êÔÌ_Vwl, ÁPí<{c¿žÚÝ.ýò¨äâjBV…”‹úÚ­â†8¼*ap©/^%"XuFÊFÊâ ÓÞ€\%eÞÛ.y.'‰%<ŸnÛ O'‚B3PÏç#ë k™Íþ%ÓÊ8޼4ÂØ¿U°oö:P‚²çˆ_‹`Õ½”›ôÏJ`ä =bœ{jPäüüŒ+ÆÜÎg² ­Wzmåüäúa±¼v³S;ÎS†Ú´%µp6H¹^ºØÄfÙ]Sò-‘9xrg´×-)ǦÐbÙÑØíР›]…ç¿[ÛÆõ=âd„×;66r! 1oÚ$>s ˆØÒÄ t߯!i2ËÂ_oÙês˜§G›,ínV†ç>8}jDæÆˆ×©qdXƒ€ÊƒŸËWxÖäuóy)Ï¡’V±µÈ‹÷Û!™Dç?°h©†C ”…ùuö$ާHP=¨&‰@H¬øý²Híµmulöx~ ú$ä"e‡Z`¢nNyMNyÿúsxþʹ¯~›T™‹«W ö£MC®B+?ëE5ö©&¥ý‹œOIdÕÔæ‘J™ìO Ž)‚ÑN… Ô½OÈt=Æl8§ó9½*èc‹ðƒYT{9.;Þ“Y_Í¢õšìèµ A“!J\c$E|ïx¤o÷˜²P› w3à+Mdð%¬¾.%—•f rBËGgwà@5?‚z¦a†—ý§¾¢›­ H÷È9¨.ôã5«rüx¢wPÊõq,"Rmt™,j‡×ËŸö#Ða~éâlJU÷݆Õ|<|ô¼Õü„àÍG„††ßCÊ7Üb¡gqÍô‰€t@Á=‘‘âST„N'ô…Ö.òLrZÐbÀ¼Ü룂@Vßj?àB‘uëx}ªÒd™ÅiìP‚éGNc›¢È†ì8°âÆ3€-$›¤BLÆl×2.ÔXt˄ʧé‘“)‰ã† b±uqØè%¼ÜnŽô™$äYi¨Xû±ÒfFÐË,å(ÆØ™mÖ,&f?¯ÊeÛƒ_X¬XbúÏht[«oŽ•½ž4#Æ4ÏFmQe5sàØµ,^S3à“ çßÃ*ºÍ•N«C¤Ü¸ŒTSº»ê&­@ú̺’á«TQõ„ÐCòý0o:'ráÚΧðó ¦c¥³‚g>ûÞl/3ÈèÄð¨‡ÂÈÂ’ukëá? ªVHü¢hÚ»óÜzÁžÛð¢8.ÁïС°Ì…¨)ðj©>E^ý^EÝeëTjF8v¸™!ý ¸l/5Ídì¿?Zi2éö5„¬ÄÖâ°eò”igj5$— ¥©:Æž ô,.¶i+Í€ñþêŽõ{ØáiÑ(ó©‡ÅÇ]oÂ.WfH»A.“°Ž_ÛC)¬ö¼}ùØ·<ñØ9­|oXz³h +¤DÌ~#hJ%µ(G›„\Ž.ÞE` E7æa´7¦Ü’/ÿ‡jÓž^ÌN0…ì”!Ý“1N+áüD;Ñ"(c‹Lùl^%]A¢•ùO=žq4m@ˆó6ÊH‚Âó*ÆYûȦ™Ä—'{q(û*‡3Mw9hxÀŠÇ¢¸xÌÉfÓï(F:°[ÂdÚrÛîª$(š¤¦I÷ªdæaÛd2´ˆ‘@#€Äï¶!_íN X6>¤…¥Ùÿ>ÿ²rP¢>Þ(6ZqW ÝW×{•>Ë…0lT½é”F€»¦o^jÜ©i¢|îq„xØÛ”I†2:{×qIå¶¾‡b¤›ét±ŸÇ÷2æ!E{h€4#sÝ#É銘Ñ,˜(ô°õÂ6=Z­âàG …†ñH:êøZÈ%tˆlÑù»~ûw8¬oñjÅ«G8Ç€4¦$âÄ#ùa…¢”÷3–©¥PõÇÄ»a‰¹ã¯<ÛDÑkŠí4ê5EFE?§_ÄzÛ%7q»µñ£¹à€]1Ù«äàÏ_ã %^s{Þ>V—º KW›Cà˜ —p^! fµr-[X„R†àW/;ªI„ïѱ!>é N"y=jˆH¬ø£ «ÙÏc(’”Âmãˆ, }–˜5ú’Ì2=¼æš×æJW.-÷¶ ôÝcë3”Mü5n…L$.äÍWyèBìž7w<øa"J2I(W+Øø0ù½Qä0¥íQ¬Wá‰gºèüЯŒe'`bùv+“E^]õ#£¥Òi®¢ÛÕž»³®ïV}VõU]ËÞfɱ¤‚¼&ô"Nl;ÍG’T_Éoyz˜¡@ùõ\ÿHí˜ ²IØ›é|>çAB)‰ÿ±ï}´}‡²^¥ß^h¿ÂEzµõ$‹ÆÇÞ¤*.@õÙ‚Vü[¿ü‹tIü‘‡<³ hmðIýúg¿-éQä™þŽÊ‚Sñ™„¦Ãí tSJ¢©nÜà·À»¢6!^Àø[ðkÐXÍLþþ'ƒô€;n¹Sr…ž$8‹§~iÿçâñæ²–ZéDŠÞ~øßêSëW&NÊOoù;¹†î.©i?ݵÆ&'÷ÊÙ|ÃÁA_²nv3–j8vÿé8«JúXð1„ªí‘½ÚjÁ‘ÓÃ_ìÞ¨ÆÐÄÿ|#¬Z‘š8Û8hŸL¾ðÎýö\xr* =>öMs»¨ 8ZŸpt¾÷ý"0G>ÑIP3¬Ùù¨ŒˆAÿÃN*þš6§Ü’Ö~ò3“^JsLØèªþ ûråÊG¼æJ棡é8>„[œ«%Œ\$:0´J¤ätJd9ÄŠ© Èô 4zL2¸s »…œï—ëç ‰×Ê”:µññq «Õi^‚,ŒÐ¡¨! • ®–×Y®¼ß9Z7àîd©ßC°XZïsvµ‰Öñ~8è- çpœ…=:+CÁfÂãN#«ŠdÇävMx>(î:5¿YTESGè[Ÿ*›ƒÒ±Á>.¼ó]†»|"Cxu©á/”uþ^Ìá%Ù|móì© Ž*’·åÐtÓz¯fçÜk^¸@ž¥ ÅT˜3l%Ø^ì-ÄԨǺx ƒ­ÕNàÈB$_ËI]jf‰US“T”0{54ú]6PqjæØÏ`ÒÙ•#r"7uAÊjì–»~c QãFr_v"Ù]dlƒ,h–%¤§¸<#þdŠ‘µÁŽA×ð½<þLùø™xPÞ‘Ê"ìæä!/÷¦¼Jˆª;­ €ïw…¿¹ªùa]iÞdD£]C¶®6LÜB3kjTÏ÷KÿÈõWÉjµ“–nñO‹B¹ùì„ ú|f&Råm<Üç-!—p×’(Ä–4q:cyú1O!2ÙÙ¯šÌòs!Í•ܺ o„`ñÓ´¯ËÍuMëîvM:ÄfïsÚ¼0™š¬ô0 K¬üÚ÷ǧ.OG¤1õÄO ÚÉNÁøVß;kJ@š#4ÉEot6ÁáR¾áó^ªõŽÆ¤>À,–ÕçŸ÷ÃUg3~LTv­-¸×xTN;ÿB?^íÜœ§àgƒÊ¡”€ì¸æ®Ì9zcYâ Ö•¾V•ïÜ='OÆVäõ ‡ðË¥.2µµ•d*ð×€9Ú“*‘×mßY…@œu#f­F™`|c¶5脎ÊpÝÁç‘ ýù\<z‚úmcŠßã„€Qù„¸¥›œŸÿGÒÊêGËæï¾ãO+‡oåVõºÌòc¾J/Q 俆ŒÈåœhÊ@äÎ[ò±ÄR/Õ?-ˆJCðè\{7V—¢Õ‰Ðµ[KýéWq UH!¥žž@G :NÀÜž}ÄóSŽeǸâÎ>í ±p©Ð^Ð`“Lˆa²Øyû‡JHdƒäëb »WKɲÚÄOöôƒGG2— ûErÑEk¬´ûâUÇ’ì~€p¸ž<7(o¯“ƒŸM5îxjSܶi†@€Î/º‚’ßI¯èZ|sð’ä„sá… (S ¶§ḭ́?&ÖøÚä9è)c¶äV›ê‘ðyÎ Ol` æG‡ß ¤Žh‰Ç;p–„ [·bvöMXFåCüÚro¢"Š}+ÈÓYZr1ý5:/ÕÛë{O§™‘=Âit‹NºÙu›kç|óY–/¶Æ¸Ù~ýbgòêüF3Ä#ŽÈ˜ˆ7èqK+%—Ù¬F[-,3ÂÒMÒßM:G‹ðäÇK¨ó—¢h¼9ãÏœswt½{ÀÐÌP9ƒìŽviûŠó“N=Œ9Ü8HvoM¹÷{` ‚ɰüzLú‡‚/µ›‘±!]…ªÀ”øgJA§s^¨˜]xF2'r(/wÕnpõߥ®½ÚŒ gË­f<‘-‚КAYZñ˜çQ;’KuN‚Óå•mó+m€*;•â8¯Ð’ü}\˜ðb–éîT"V‚#¦«‚2&aeÔǰÕð”ÙØ¯–jÔFæhVn-ňtû¬´‡µ¼a£¤œ’ ^»2d×…FH)nvDZ¤l#®Fp^i³B<*WµÔ=[µ­Ès™_ø! aâiltw7mP§;û‰ÄóØûi_4›³r«\E¬]Y¢œ7?]êÂeÊÆ:Žó–Î3ëè¢áJÑ3p3¡ í& ¸Râ~ìä]M™X÷ÇëÓÐr3?ª‚42×5~ÛÜV炬62Ë·Í–ÿÀ]Â:ªËwáÿìzl«ßDâÖæÝáâmYkº¾ëé¥$¨è„®,u°äHà³+ôÔ~°ÀÌ©ò,· Ð©†l¤ÌkgWfüîûéÙO5ª"~Ä'ŒY#¸!èH%n‡÷Ep–§îÄ3OT+Ù=® Öedø¥9oO6ŽH¨ø#Ñ•¼ïÌÚF¿½zJ"0[ó¾üàó¨˜z&*²ø{kmü$2ëÕ_»³Kïû– -ºœÁø¹¼é5{BÉLÔu:¥mð$Þe·^ ¤Äꪅ  WÄ÷íä@»œÉËR ðÁ™Q@½Tg g¤– W‡/¦h'…¬N¸Ÿ]åIh}`Ï`¹§=³áç_ĉÑW‡"u ¦ý½õöݹ c¾W3C+SñÑR¢ÉßÍ,mjóë^w#K¯(÷ XÅ˲ʤìZv³PSonökç>Ï‚¹%þ—¼Éö8̵dýþtÿŠAò ±á€hkò‰Öxhˆ™'%ã¥õêï”Q‡ óYfü@iòÓùn’NéEÙ^Æ µ.§ZCºP³¡­±)R±ÅN¾•íCƒž%WHíE‹fZ0wùÛêOéôÖ´¬'Öå+"‹Ößo^nL¾ÈǦåƒyÔT¸‰#·Ý`Ê¢s\Ô õû3/*¶‘C˜à¬.‡†¼%#Å|°ÙIÚ•LbÍ0Î ¯ ýÊˈM™+‹x2`'/–cx¦ÓˆÞØBùeåÍ»—¯,FÍbÿ7j¿ü¼-8·×yµo¡kM`Cîtlia½aÂTŠ˜„{ͬ™×eÎVV–¦ûIž>%Mã2DåSY—·äqˆà=½c¡s o _e,Œ·SfæU|\SÖWýa•x&­oäUœ¾3ß—3ˆðkù%Á{¨,s¬ŸL×— îQr¼‡H‹?X£¨ L«0©; Ž2®°Ù…+éÂÔøc¨ö:V §yõª£ÚŘL¹Ú¿V«%1üøêÞKÒ@6£øE6“ 6AÉeò—I\±}; ½µÇ·Bx6˜ù_ñ‹2S2cò)î|o·ž«ºxFf©cÊj‡ d*œªû"ùfÈ=´]x×<‰ rÄ­Z›Æ宯,¬Xyæ†å’¦»äu½ÇD!åÌo~| °såÀHŸO×f£S§7:¨néÁ\(ë[è? ÔÓV{±E3¸WÀ˜tµ…ö»ïN¦x›.:Æ·øÆ)M É{㨅7L÷Õ”‡jLÏ¡ºZÍ-mBJó«‚'(ºò;r¯'ÜÒ$ÚUõ‘´´3ûâœTJÝüh„HCOùo|p„ëŠÏËœ ¡^Ìš^E’ß̾ÞX2­r³aåüTKÈEË,8e÷ ¼•qïçŒn2ÚÀέ§b´–óê“Ü~f•|l6èÁûÝFî’_–y)?¬ø b/Tûj4mÚ´šC|ÝêêÏ)éË—µgqJµ`i^~ùžáÍŒf·Axs ‘^rA.^¡l‡bCóªOV.{ãªV%—-ç0À/!úæø›-Ž#Ÿé.,q(pÔ’¨&–›•Þˆ¼j0Äš|«ÿzQ$’U"R‘‘KŸà5œìUà¸:uô ¹³P7ó» $òÖÚ¿&eÕZ嘨>ÞP—HæVÁþ»N]ˆ"%>géØåyL¹'n·¶>6Mû0•RâÄœ!Œ •ó—¬ßŠÖL}q}ÄÛÑ̉Ïò²WHdþJKë²+bAÇèz†ž¥¼û_I•0¢·—dã1æ¥B $),ÙßÂ}>ÜS9݇~L÷YÝœç;(ý€¹ôª<œkw`”¹ÿæù œîý^­AÚá&S éÜw4·Z‚]Ü Ô”á\ Z©œ£7òOÅ.ᮞ;ë1éÕ’ÝÞšys4mêþR0³±-(¿Óã¾—¸BØ·A^‡«‰±)ÇËóW+¶y‘f£w{º7-Ø~†¼íÔÀò%-$ }¤ÙC¬ôê÷ˆ¼!ÑëéÕtÒ€ vJEÂ6ØZõø /"_¼ž¾BD[Fu¤HTÒ9ß®ˆ¹d=Fdð;* }ß…%j¥`І^Zî[ÝZ,ÑVá–¾Mxöí3>üèÕlêàÍ%Âêeµ6dJ^CY0ÈJ²eöÉ’@µÂ[ì3O6*”NyP¹ î0k¾iNòL°“ó°‡8F™hðçôå—¯U•?8‡’Îg/9q~²K!hºçÊjåßy@eV!Õçâ™äß„>Ó¥w&¬¥6›ðDlí}épI‡Â麛òæÞ%¯DªôkW(EµÈä[$WséÄêÊSqŠŠ™Í>vÏ©ÂBI墉‹‡Áãdf¥ú¦ëS:ŽðHQ ³_'ãØ…tï—ª¹žÑŒ.O7~üþꓤA2>ßv –BüuËôNuçª"õ L o~«·HK|H)RVXB3²W¡Ó7ª€±|žoPì[{ü"Aïj>§ç0¸XŽÕ‡€é¤Ì«â±®”Žnaîñ½Ã§uâU‚y¿ œñZJöœ¤æåföµÌ! Î~ͺõ«"+[ž¶ªÛB°ðVº×‚iA'Ê‹)_êä%O-çõé«P*¸Ÿ0¿Ò6¦Úi Ë?1Ôì¨òÝÙ”²W±gz*žžøp ÄÝ'÷¤$ÜЅD0À üÉüŸç¥ß|ËW™1oŒ:ªùd6˯h.es¹Q¾Cö+8’•\æÑ ?tÚÌŒqê¬#‰ÃhUT#¡q‡ÂVÎð ÙÞÿ³PšüZiö#=¿õ’"HÚÑ¿ šÊ’ÛË8•ª²NÖòû —âwާ´ÅíÜ~ÜöÓ A¸¥AÖìnØÚ/šs?:Ÿ­®v»Pâ~žÑñf]wyñêv¤ù¿•ó³$c¡ãÒQÑ‹ä«hë ,ÝSs!…ÿ‡mÝûµâìÇ^#ƒN®2év¯hæã‘1žèØÍVV°*MqQ]ô|† ‚ò%]bf§Èoeb…+Ë&à‰aßú…Ü£U~ ¦”}M“±i Gf/lheùlê»mš# }‚™:ÜÔ ¦­¸aº|üYI cºéR°|9’ÝNØû¥Ñÿ1^xû…=MWòKoÝ€žÌÄW÷Ãn±_¢¹v±v¦ä??"úw´ÍÅ*ÏA¹óÜæX~„{pÔ>Õ™ úTm”’ÿ=bµ¯é¥H>ebVÎ*.1iC¬Ò!ÔõÓ¬¹ŸJFçó¬µoÙÛAjàpœdE‰G­aä.,^¢­óO@?ýc­!nÍ·”® òÆkÝHTŠÓOŠÎ®ß§EÖ]U ó^÷ž¶|•m%+ç(?"¶ô òY:MæYcò+üÕªý„ÙAnÜWð“ê@OYiì$±¨¤íŒÚïùnᦓ­ï7ù¯Jõüª‹¥EW$2ÚdUãôi𮻆G“†”¾*õ’JÏT‰I¨ùœÍsä_±øàŒAè$4ß›e~Š7Cî7ôDÅòÑ9°¢r#Û¡Üï:6¯š”µæÎ2ûÅ}·Ù9®½GL)zvQƒ"%!ýaZJ ËÔÖå[£)zVÇÀæNHa |ºöèš;ÇN½6Ú9\©ºC±qîwW¾ÐÄœrº¶ÄjÜ7ÎY!÷{ä£RŒ8a4Kâ{>u²¾j³šÚL”t¡/$eldˆ©)¯ÏI74ƒ]ìZ¶h&81$ÈÃÆ*|…À«3 5¨¦sئ±#B´²è¾ø¶Žó~•¸çï>´‹µå R „ƒ]²]+ €bÓ ðpŒÅ÷œwÊ®¬2s‰Éëè—š¬â›xÊ㸤Ì̤eQ¯òa{þq=hÀwå˜,˜J7j­iùi,d$Lè„AZ î¹¾j ɯ˜¦"þqµ+ìó—:ŠÔo“Næþ¾„®és™úë´ÉðsW/ŸàJ…bj[«1¡Ì©È¬¶ðeÜhà—~P“«¼¶…SÇlÄõÏ2ÍîÃ’—¦ò“ßd&XS« PX¤ÜyF›êY™+’3-μiF–µ‡Äzü4͹ö:dÑN4H-ü„gîÀ4¢ª<ì»ð«Ù„tÀOÒb*×ùf/ +×üèëÛZW~Õ&C°Óµ OÓÖƒ]XQAh)Óƒ¾m‡Oä2ŠïÝý.Bס4¨â^ìQ›ué¢S­Ëå•z¯àìmãA‰°š`…úûƒ]é²uå4K¼êM±Çq!a¹j¹ÄÏgÛÂ^TêÏÑÛ«ÜÏ~IE&ü'Å?aÜ+4c>(åðÙžçÝE ×íø”4#õSNÖ¢ýxü¬Í#“ kZb,Œªš„*-Ä;èÓò_>ñôN¬¿ ƒŸt¨{6ý2£ñ ôëøÈšÿ`hPÔ—ªˆá¿×{îk˜t?Ñ Íz^>ÂùåÿeDÿ—ØE6%Brš%{Ò)åjyo{>\·A¹Â ·ù‰èºøûÞ»Gù01D,–CNÖ^ÿE†ºÐ=& !1RÇŸoÜZç®B@ø±–Wÿ³$øãéRÆÌc ¾ÀÚOÜ WÑÆQ·FÖ˜FQvYÍ «J÷u FLÀ„r¦ºãƼ~‡²ÜÌ)/Düºë¨`Kõ##î"gk;Ú¡JnŸBÂGÍ¿Á2Š Œó¦5ˆÐ÷ë­!ÑGœ5MZ¸o`F‰fñh"OW\n!Š,XQWaÄ¿ä>”ÊboZÍâæ¹¢Ëlë2ÚÇ|œ_\­.=&Õ|O-y£Wþ ³œ³Ó7•¤œd®i„J¹)žºüv‰û²™ú*Œà¾Þš#&/°pü’š>š‡H#»Îô"©ômy§®*øZ|6g™a|BLzÕãx4î²ELãK??Kñ'æqŒ†Ÿ§;Ú(0ûàqPJ¼9rr¡ªj¢bÞÂM–˜q7Ubü¦à/JßÔaW(E¼ØE;3Í>Ù°U£!ú[l»|Q…­AÖú´‘‰|mvl — ú¬ƒ…O±¯DÑÿllÖ—ŠÜïþÆO¹Vý3ûÞŒ¿~VÝh‡„nV컲_¾~Ûëþ¸Í~Þ²_3нæ¥f"½ü¶Óç.SÜÃ;[Éý¹¤n=ŸzËj]ÃZA- YÑó°Œa{´¨<­KË-K¼i¢h DIu£©êëÂO–™;¥Áµûç=ôE÷ T‡ ¸álkF¯¦PÁ‹h¨¾†oÁP ¾,kØsdð<“2ÚxX¥ôçâ$L¬ºD©•F®?—úŽ–IûÓr’e7Å2²›,Ÿ™4SyÏ`ô–øc÷yTÔu“Ëg‡¸vj'Ȫ²,ÏÌIlÍÔlU÷]ÓpTÝÛÍuõb(‚–æWþn,©.¾Û‡b·9¿·³d½þE3W endstream endobj 34 0 obj << /Length1 1510 /Length2 7496 /Length3 0 /Length 8500 /Filter /FlateDecode >> stream xÚ·0ì6,Hô½®E´è=z'ºe«ì²V'ˆÞ;½D.jt½-zD÷IÞ÷œóžóÿ3ß7;³û\w{îrÝÏ̲0hérË€áVE8 ÉÍÇ|S—}!x€@~l=(Òò·›Å‚p…ÂaÏþa ‡€€÷2yòÞN¨¸9ø|BÏø„Ÿ~ Pô_†pÄ3€<È ¨óTà0ˆ+6‹ÜÙ µµCÞ_ó¯#€ÍšÀ'**ÌõÇ ãA@­A0€:iqº¿ÑäÐ…[C!H¯ÿ Á&n‡D:?ãåõððà9¹òÀ¶’ì\(Ò q… Ü!`Àï‚ 'È_•ñ`³ôì ®Éuá6H¸8B­!0×{7‚Ü_ÐUVh:C`«ýeÀø»7>¾‡ûÛûw (ì3ÈÚîä ‚yAa¶¨# ©¨ÆƒôDr@0ðoC£+üÞä‚:‚¬î þd(Êh@÷þ]ž«5êŒtåq…:þ.‘÷w˜û.+ÀÀrp'' éŠý;?y(b}ßv/Þ¿&ëƒ{À|þ6PØæw`7g^}ÔÅ ¢,ÿ·É½û?2[ ……„ÄÓÚŽ÷wx=/gÈ%ßoñ}~>Îpg€Í}?¨ äþÛÇä n?Ÿ*þaóñÀPk$À b …aÿ'ú½bó¾>ê 0Þsüýù÷Éìž^`8ÌÑë?ææË«¨#£a¤ÌùWÅÿÖÉÊÂ=>Ü‚¢n~A €_@ |ðûï0Z èßiÿã« ³DÿÊö¾MÿÊØýo°ý½ì€ÿŽ¥¿g-Àö’›Ö÷_|ÿÏTÿãòÿÇðßQþo$ÿß„Ýÿ¨Ùþèÿ?jÔÑëoƒ{Òº!ï@~¿°ÿ55„üµ´²pGðÿꔑ û5Ù:þ»‰PWE¨'¬EZÛýÅ•¿äú¿wÌ ƒhÁ]¡¿7ø?ºûŲv¸8\ï ùG¹ß›ÿ¾Rf ÿ^0~A!yaßø |øî7 ñüCa/ ޼wÜç°#°ÏSxϚߢ?HTÀkýoÄðBÿE¼Žÿ|÷®°@>/üð)€ñxÊõPÀ‹üðºýÞ§áñþW­ÖnÄý²ÿáâ}#þ…ÿ¼,ˆ'Ä{nn-l_ÜrþA†Úƒ{cXb‚eÃð5;·Ï¢Õí#…½2óÕ2âL&ås'ášÛ©ô<ýÏÞÇZŒ°¦$íæ+ßk‹±fìÙQ²Þ‘ü=™šZ,n=éMß_ƒ@´ÚUX²]ÜDðµrŸ{t+yÖô”| ÞÐÞ¬RŹ.çŽÑ6 ,šdɱz;EÁøÉM‹ÉAüÓ`òôl‚8käŽ^%Ûo?F ÀÇx…?öbÊ{±Lßõ%3¥1-Ú)ñàØÙíTòŸâˆڜɩ¢ç^‡ÍëÇ}£Uà&JIj§ìâaZüD –ïÁ¸Ï„OÒ5Ì0Ç(ò¶”¾‡œÎ(Ý 'ÀZìer oQRæ*œ‡¹v[}¥×¥C³ë+ÃÆ°Õ{*æ§iSƧŠL»ê8TÓn= Æ«ÅþÓþøž=A‰«ŒjN¡±jMDð†röj'›ßþ0Qc¢ì#î™ÚDJu˽zÁ¤Æ„óàœ†?rx£×²r«ÆâžšáÅ+yyf*øC>ò‚$øDÿ1ËOj€¿1)/ÔÆÄõ|4ñîlTJ=‰‡¬û9Z‚µF-ÀÕcÑlƒÎ<…¸kôÌ3Z¼PC“!õª Ÿl"žú–úך²>õŽŒ>…ýMÓ½YÆÈÅÇ£»a®¿LT¯M`©E˜bÚÃÝ ÇÞçÕ#Ì©+I†X#ì+Æûplg©ÂÐ>"MJ!LJše혣­$¢U-c£ò¿ÈMé ’ijtÒE¿ü¬ü¥x„WwTT‰qRµÖÔåâoÓê<ä%ª:Î!b=é–vq*¬ü(¥;Ezökgô5ë£H@C¢^]?Ћ«¼ÕÉu¯¤<$Æ$ç°d{ÊT˜þ`ì Ñäa8eêÖv\ìËbß×ÁA¹bIJ)죮B%UFv¬$l¸•ûëëßPÎůÑv-žˆCkx§ækÆg.ø1ÄÂßc|âÄ¾ãø 9a-tÏ­ Üc¶,X©©(ÁÃíOM©?ÊyT#ÅeŸ0ˆd®LJyD cSx8 5^¡»à¿æÉoD§±­6œóíÝNnŽ·Gw:9»“05°¿ŸQ q²Qv/zp,Ø--^þ£)à¬Ôù37“¨Çø=€Cò‘•øóv ~±|±rl‘‹IµÂUö£L­“ªØÐ õömáx‰¯¬½N“Ês‹T´ØÌãä¹ESn”ü¼SžêtmK ²—„‘X§÷RûÝ•ƒî ˜!dÖ¸¸«GwëŠ@“¡˜¸Í{y°Uà” ŒSñªÀÙs¼`b’™˜ˆÑè¬ Þ÷TÝ”K‰Æî".ÕÏïh‚(1×)!E®GOk6 RÙ2ÆXÌö.Þ_§àCÔ\ªÎé•p)ŸÐã TbeÛe§srôŒÂµ6Yü&?ïF¢›¿þÖÉÔÑ%÷RüׯÅÀâ±;ŒåñÝŽßNÈ Vø¨Œ^ÂáëþàG”“ÙØLî׬'°Õ¯}'¡dÇCQRÎ+„ä¦HŸD?åÌ̼eøiõÎZKÿìVIUå;m $#êjGõÅ(1F³ôE8°Ÿkmòïö@wwçŽ}Z¼0=_¿Ê7ÞÝ Bžñü²}I± rþÞÇ‘‡«Ìw´¨B\o¾NÕKburü ˆúJìßßdã䔑d®Úâž—ÔýÎ àt]%rltòãb‘:Jþ4q…GÒ=˜ …†n6¾;yá0L™—«w[ðÅJâ{HjOûmxÚå1dßs|yÞðu^nt¤YÐù»¯:VÐ^•YVrû Jã0 Š,Ó,IFMlÍ:ë[‰ê~YâÁXn£ò4M0Ù¥ž'Eåy‡ñ7Éa¹@ï±Hùü9Üá9Ǭd:œÄ‡b×âvgÖ.Í{Ôg uóyI6C² ½¥ŠÍÝÀâ…¹N=‰†ÐŒ¬ñÑ×oäwPÊÆVüc¡&mèߺ#wö²Öõ”wÍ@,@ýCHZÐRòItM;òV!²F…¢F~Ó)=h‰Á8”­)-tÏ^~ºvý8±y*$vÜ… ,•¾æ~3:V³Ý¸'ÒíÙÆ~‹²|Uñáízë˜M¤k1ç ׄu™ZÃd·ŽÞÆ8½,±^%®q+ ·tIëàÒ0º,žÎ¼™/3‘þ’Û`¹ 3uÖŽþƧƒ&Ljöæ‡LaH¿ A–ÖÃŒ®óÙ û'É{‡–oÝžÏÉ9ý,ãÏ-AÕÇ'¿©2f:93$vbª¼ù2…·ôÍ}*±;–ÄÝ^¤S¹Ø?³{´¡$ØP^±•uÛ?zœý)álZ~ƼæUŠÅå35˪¡Se¥"È:ºäSÄ)ßËa·ÀY¨ÃÐA ©‘ÓÝᱚå¹Ò,%†ëŒ5«“ _Ù쨴V[x |ÊjTÒÆ6wD¥L„Q¨C7l*Y4{"Ùºóš¡ï‚è—ð9ÎÅü°ÓîtŽXý#¼WdÔAÃ%0"…»X­èˆªL0ÕÃH°ˆËCAŽpa•$kq‰wÚêfFÅEíÕ•+ ‡gñã ¡Î;Xê:ˆô/ª·ŒsAßɱ}_| ìbz9Ý—\]ý¸•êý“®‘tÉ1¹SÆnùéfè£ÏÙ³Î"ô{VÐ ÓÏ¢zW?¹ {[÷‰úÞFø>]ÅÆÁ»Rá|÷:ùZ1¶#<~¨1F!48ý#õD¼¾U {)a€¢Îˆs+ƒgÌõâ7ï7Ç"Á6ó\ôŽJO¨w,xËËÓ0F}óž$V.>Ú?ÈZÑ\0VãRÜh¸©wˆœ0\iä‹ïMT ˜CC¬¹óÊÑÇ"àÞÂ8T•Ç!þ®«ibVž¬G{;DÕ1í©žLz¯?&kyÃeL§ JøÉÖ⑞iQ <Å2É’Ó6c)gà„å=ããÿi ”ã˜é¤ô•f—7eX ujü…"Ûá(½ÜäÌZ§ˆ±—[(.Ôªnï&B¡!@™!k&˜3Ì öK°ºù’ZšöжØÇF½kɳÂÏZdè ŒMs èk5(1Z*]]qŒ…@W²©žàã¶znn n~ß^‹mƸ4Îñn‚œ $ø \wÅùzár1î_Í\7ž¾£ˆh®Qüuê&~¥.쮈Êj©ÉT¤•ÓûýR «1Û8qÏeÁiafþfq®[¿À‹žR¨(\3ÏßôYøFvÿ/ÚÓ”À¯ø 3Ë•­Þ2>ði\ŒØ\1hUýúöìdÉþåO( "õh–)¦÷¿ú—¼ £¤Ÿ qͱhïÖ~“¼R<ǤÍd”þ>o„Øûì{ð,µX(@xQaFC¹ |6 }çoÞfïïi«Æ–ô£)¶½X…¦žÄ9#r_Þ¥—u­| c´qyp‰¶<ÒÚV IT –hN®Ÿ‡ˆæÓhû˜Ôc«deYG¬O¥ ›Å7ásë‘9½ÊÙnfàüd{aü,Õë¹ÅðA’}dBPÅxc­¯ç"Î}¡\@ü"s- ÍJî¶IþÖ’§çxµˆ/'frO£55 WØ( m¶´2¦Æò@Ê阖Óiî€Ú˜ —Dq ×¸‚úîx”š{Ÿ™6O\Pê¤Ïß^êÎbt&!cŽl:Ç—¾´\¼»¡Óz´Þ[bàÜNŒ¢èÅLeÏŸ!–ó.]u (PJ aDŸ³ú‹®Æë:íÄOœ}ª@Á? ––ôµ;ÇF¯é—Paì]Í#A¬•¼\T¬ùü[35÷Œ³¯šÓì]YãÂi³þ¸Q(&/H»ŒŒ?†ÏÂ5´ûæÊô_+Q9äâ°-/]þ y¬0>É&·Kj‡Y×z|ì˜ÁCˆ°æJža3´˜—Š2¯¥`4<§T¶iÑdâmé Ûó’û"Ф*òkBðúQP¤«ýš¦œ¥¯Zˆ‚_î˜kí žÚâR œq»õ+eDiø….ojN•«éîrìÞ³áõÖop?…“nz<õuY?Üvæä|I8óB*¥‡Âx‚kH‰¨v%°Pµ=ó,Û+_u¨¤€RÔÁç[™.ІXD€Æ LEø[v+‹?èi”(siˆ©ó?ƒŸ®O2HR…¹æîÆ‘«Å—;ù4Ü\Á+Šì Czºß!‚hÖ·¡0xf½?±âoÞÇ`ÙαdB€±/ƒ¢4°“÷z‡Ç‘åv´Mol’²½óFëéi’xÈ<†¢©Wž„WëÄíœm1ßè9ñiÈÆ3ÍJô¦Š*¥‹Í[ˆ›%<ÆP ª _’¹[Q®^±¯®‘“t„®uÙ,b¡ÇI,Wí¼Õ Çç^l Ic?/ uô|7ÝÔSjêy+ö¦@—Ûž;<ËàÅüU@ŒfžúzËÀÄ“(â íë¨á~oJ‰Jë"0ö›#ådVØxãRùÛ .hävƒäk5+ Léw;4q.¿Æ›+âÝå.ViÉü׃q(él³ïÞ™Î/1¤Ô;þ:'¢>® ]M•žå¥…¢¬|÷ÏŠb¤Žc®WIiâ™ÿœ‘17˜qÂåà|šŠZÛ3fé烓j[a†¹—óOØ;0w¿QÝR¢ÑÀ~å Õú÷‘ý/ßÏ‚IÛy,;’omX¦c^omŸKú1d$½ÑPн²Ä8¦»=©9Õ®+£ï ¸-Ÿ¨ñ°t¶–aë¼~Í.Ùn¿ K$<§yBWÙ]HÎõ½®ìqÓWLáÒYø)@¯íEçµ&Ÿz—:¹déäS³Ý<ùèIeÅÞ…Sb,¦XÉà×Z‡öáÔk­zûwh’æ†r_É ·SêUäâOØô!“Ê–PçN;bQLÏŠmU>£±2¸AºlØzG©Z´ rEX©"£ýŸ$9uÐ;mA>ÄÓ¢=²öní-«[ËļðØñ‘‰ øâx=óñi«šÙ´ó†Xfàõ’5åmÄn‚¶‘^áeϯt÷qe%—'ŠÊ2mBkN/w|˜f#£÷“y#pÓ+aÈYªð˜À|Š®ûœöVqa¢ïvx“»,µÍ›Š2Ÿ²qQŽwµQöhÑÎB¨q£fÂãËEÒÀ2•Õ£/‚ûvE„ë²k´8©ùØôL2¹Gš²›ZÙQÚ$ ™\ä¼ZT®K§®/) Í„œUsÈ)?áMrî®—´ÄQc9äÙ~lC ½V•‹“Ÿ|Êph`üŠM$&©5<{Z$=HȵMÅmd-à;’¡~¢ªJ‚õŽ÷aßÞÑ'PQ‘Öæøê|”2Úž$Ѻ’ ì«ëHÀÛ¥Ï:/„HI9 _æ±.-»yÓ$Z<­öù?[‘¢eÙpãßöÓÞ‰ôË÷¸ ݾÑòêáØ7êWÊNæ§ ×úl"­’â[4M˜mÎðîf³g¶˜d‹WÅÅÎÜ¿AßF W‡'d!Ò— 3¬‘Þ—P«l­Ÿ¾vÌæÔÚžbº¨ÞÍuL™íS;1Ç0yÙR‹â_!êæcæ<êŠþ‚–[<^™ë£ÂDEòŒàñ‘ºxb†ª  'Wa§ˆeËã6kÑËGÛëKä1e¾cRšühqýÏÖ¿}bgôTTR½.¿z»ŽÎu Ö[îÁå3Ö#uK¹ó7éÎá?QªyXúeºûÝÜÒ0!õ¦IÞÏÚYÃÑ7#W  ²Ì¥Òeü:拎ÙÌ:ê( ÷Íe2`~ÙÃÁd¾½\”z¸JÒëõŸv‚ÆèÛ¤Í`ÿó%Âñì«—â¡o·±÷ò*À§v {’L‚Tì=aÜ%„m/†HwaȤêâ<9Ú*ýÒWPæ°,r L¾ZK Û$©s5 µ}óã¸ÅWç=õŠÔhösñ&Òö„/wX-Ç2QQåN«=˜<ÜH®ÏŠÊº[Ûë»;†îm ûgæÈ ·á´4c³ÔN®¢ƒb„aEè°pŠ2J Úï:SÏI$Ts.UÐcU8%¹‘(µ^\A&+b©Ë:“µâæÚ‘µi?¸Ùk6ߎœS}gߥæ†ò«vœ›ì¦[l sø µò)³>£yèñ M=ºnÁ Dc}wÉ€ivU¬k7'Ã͹Šègt lÐØÜ±–ÕÃ\NÜ~WöœÔ«÷žBKX‹àÈïcJãg¿Õ|h—+ÑQ ¬Ö:a¤÷ôµÜ³æ 0izÄà5 ãásW ÉÎ Y¤ú÷†`yÙ–»Ý9©}ÒªÚf#JœŠŸ íU÷^– Hîz<øuûþP€)k,‘/Úòã«ÝwJoxZ–·šºñêz±B¿ŽqhÅë6J­ÕwC±M0^Eñ`“Õ6ÕLy,HJÐiSšQfR [V)h±…éºvýx˜“ñxâŠÂ£¨%BjŸ 7W-Zæ×Ðê,ö‘FˆÓo¥¾>\‹9KRÉã® æXÂÅ#7¹ñ¶«C…¦’ ›0¦æë-*5òA!]0Íh-o‚5E°lìBJtv{“¯#ˆÒHØ–*rvÓ,ûÎ=vc7¾‡³øRð6™Úy kGì»`CkÿŒ2"Q!ýÀ½7 p3ÆÔ‰Á¦±Ò3ˆ—6¦5pà‘ @¦I5;e‹ÈÅ#5Îwk~Hç9G¿Ö¿ìÔ~©•“ÇÙCL'ìÿ“~îÒè«+eÔ©´ôµ¡Y»éÁVõÛ(©ênßOŒòlK¯nLDz¸É®n’…XÝ.Ðm8S[oå¾7·ÄäÍv3¬”Öy¤p/Èq¿Ÿå•Ð µ¾É1V’Õmˆâ‚8J ™wÿÁÔ/‘­ïö=+ùžÆáYf¡éŠïu^5Knñ3”DæZ4TÕ¼¢‰ûã„SÚ͈×N‚Ãú'¤OD\‰-–ð]^‡u”úÖé?{—Ñ£¡U:ãÕWÆ{p¶€aÿM$4±ö)§üò¡ÕˆN²ý8–Uyƒã(ŽERºC§Ç¦é"—žn†IHY›<€ß~ö\„Ân"BX­.÷Õ€§s¥:dñCþ‹Q\#9oƒéç6¹]£ýç]ÛïÕtpž¶æi‹Š —ãyft"ûºxÉK‡~eÓ²¤Þ']X¥îðg­¬GÊØ9Ÿ{çP¬_•€ž«¾—»ZBý^õ’NuÛë%öËB!ÒŒÜDM¾D…§ôÈ÷¢³ˆæñ–A[À:8iæ~»Í¬ÿŠÃv€³Óy}ý è=Y8ùvªUßšÞ~ùÎkv˜ë eæÆ1fÃqgêÕŠïìN¨? \§@µ2Iì¹k©¸ˆ&˜µÍ¸1ëËlK·š¡“;B'.zš£-ÜÎÇÈ´hYmEóA‡yï~³3Ò0·Ío Æ'tôŠY.ø^¹`RFu¢OS–—±½ýçËé’G/œ™å6ivuýzÛœÚᪧs±¹%Ô4¡bµÑâjÚöãÑ}:T5}©\†å[‹%ÌÀç ÛöéÝ»ìGAn§Þxž}1Ç«é-ßÇ™¨a¹RJ Ke¼ªl™ï'©~*ÿ&excV›ª¾ wÓ†hòMtðý®_\·Ë•;ÚÝYèza–gkE5 &¯—ÃTLñ¶~Eâ°úêq9­ìFÚeŠ€—>±-?æªàÓCT—Ô:HŽ"Ãþ„Dk­…‘òþBç|J^nci–ïÊ'Ö|U›¹õXµ"%†ÄÞ¶ÔbÃ8šq g®µøVÒi‚Ötñ-†åYJ•yâã}® ×ÏÏJÝ¨Ž‘–'ÒÖz)¯Å{¤Õ)E{®ñgˆ+;$yÓKû%õÔÚJç(“²|ƒ™ñ8ÕÅP¿Tl‹¸c©¿7ºµ}CR#åJ/Äþ&+­¸ƒÇ²y~³fñUÝ²Š³Ìc7 J£¯ÃIÔ–ty‡,_‰)ÌhîF›Ë BGв29~*0&q~јvQ®ÛX½ÔÏÈÝ oZO6Të4å}í®¢û’ïÿÈïgª endstream endobj 36 0 obj << /Length1 1438 /Length2 6437 /Length3 0 /Length 7422 /Filter /FlateDecode >> stream xÚtT”íÖ6¢¤Jª€„ 3ÀÐÒR 0Ä 0Cw#!Ò ‚„€ ‚”tH‡ŠHˆHƒ|£¾ç¼ç=ÿ¿Ö÷­Yë™g_;ž½ï}]7 £¶¬-Ê®„Bbx ¼`1@^CCEƒxÁ`~b}ÆþLÌbwG#PH±ÿw‡Ã0XL†ÁÆi €ª‡3 Bba10àƒEÿˆr`ž[@ƒPE!áhby”«;ÂÞƒýÌ¿^v"**Ìý;u»#l`H@†q€»`¿hsôP68Æç%Ø%0W1>>///^˜ šån/ÅÁ x!0€. w÷„Û¿4a.ð?“ñ³úô\e‡ñ‚¹Ã,àŒ°#ÑØ ¤-ÜÀ~ÐSQ´\áÈ?Á긿΀ðBþ]î¯ì_…ÈßÉ0”‹+ éƒ@Úvg8 ¥¤Î‹ñÆp0¤í¯@˜3…͇yÂÎ0klÀïÎa€’¬Ãø×xhw„+Í‹F8ÿ‘ïWì)+"måQ..p$Mü«?„;Ü{ì>|6ë„Dy!ýþ2ìH[»_CØz¸ò np…¿B°ñߘ=@Á"Â"Ü €{Û8ðý*¯ïã ÿí„ü‚±ø¹¢\;ìð„ûG쇆yÂŒ»<Àï?ÿ´ˆ!Àaƒ¬áö$ñßÕ±0Üî]¾;ÂxÆr€ýþýfŽ¥—- éìówøïýòßWÓ“Uæú3ñ¿}rr(oÀ‡_àᇂ„±/ÿ,£ CüÕøï\¤ ÀÆÿn{NÿjÙó/°ÿ¥àŸÅ4QXÚÂö¿Yn†‚m°Èÿ™ë¿SþÿUåcù7¤äáìüÛÍþÛÿÿ¸a.gŸ¿°¬õÀ` Âêùß¡Fð?ªÕ€Û"<\þÛ«‚a• ‹´Ç²™"È üƒ#ÐJo¸­6cãð‡3pƒ_ZsF áÚ(4â×å‚̓ÿˇ˜öAc‰ùÇCcÕ†ù½Æ_6«§ö¡ˆ´AÙþ?T€¹»Ã|ˆ±«ÇZPÀ‚U¨-Üû7µ>^$ ƒM°3v(wâ_k†Š|XõºÀ~Á€Ï»-”í¿!?àóþðùü6ÿÑ‹‡»;¶ÙßÂ6ú/û÷‡{ÃmˆßÍ lÄÃëÃ[ëdi½xVßJàídóó¼-± Äô(NX~JÖËÍ™W«Tz× Q²pl×”s;Îû0»ï·Òp¯ÑGðçžÒºý=ëÄ™ËÃ+S)~GtL3¤/p ÒåÄÊÝ{p´écÉ:ˆ¤mí{ôXHýÙêßÌ¥x±ÞªPVhÕl먫ÈQ¿C'jøuYóÒº_úƒš-Ù%!ìsœÙà Í,&5‰¶âd¯Z²¥¾ÁþònúÎØUÏÐÕïÌ‘rEñ~:A‚ZÃ…"’óürÏ­, ?keJù;z…ŒºÔÄýòE©/w¨ÍÎAÆŽ9Rˆ·¨I_e})u@gœ@»ÂD2ò§˜¢ìcül%•tƒÛ^ÎF NP½Ã[\q¾Þ1ÖžòwxZ±8$«ë˜YccÊÃkTŸ¡,ì¦àô²_?z© ÉðÎë)ÙËl‹3pŽD$u΄Ô3ö|¬¼è*ðHyh=TœÖÈe=ó;ã=âõâ> " …´+è bénŽúQIÁðpæ3«â,ÛŒ,{y”È|…_­fLR`Ï)‚ƒj†[¢÷Ð$’÷óléÝü¬—eî}¦0 Îǹ×R Žï1sú"§yž¾i™sç!C‚ʤ4g#r×¢£Ù¾…°â‹ì·ÐãSÿ8[W(ðª03ã_{»Õ3yòDá†ÎLƒÁó‰‡'Öx•ÓTšpmzµC›<ÝpÑÊ­³ƒ¢WßÏYê;ÙJ¹AæÓ+™­­.hMÎ ×O¦Íߤû‡1–{†V³*mÕÕ‹‘w•eœÝ®ù~žÒG7ÌèZ”Û3Ì76r¤"ÌÈuƒ2ÐÏ‘ª0îšù3øë¢ue€c")Z]žn’ ̨L]WˆU±&üy€oy]ˆû‘¤øB,Š{Ló@E#Ç1ÑòÜÓ…³ÊÒOîPXÞ¯ƒ¸¼Ì†K|è­|êœÎR§ ï&:$õa'ùÖ2ž,ùå™¶Xv㙵L® ‡í˜êóþ‚Ýhcl5|åÊȱ‡ ¦L¿«*–ó]À‹™ìýi) :*mmmó ‹Ið¼ñç§+Y.ofk‘1Õ~õ2ôª«>þ™kFh9_§Øú‰¶é›Ý^x/©69ÑhPãÖÑì!eæb´ÉÛž èr9^ñ¹"}Vs±,ȯþ¤)¬ñÐeusÑÈ——¶È~•Ñ1^öÚÝBÿÉQÏG¢pòkn‡C‹½>Jܺޑöveà:;Fo®–ã¤ä¬Ñ%p8N<.C_•r.¯£­H篯´ÿ2ž‰çª¿Ö.C¨Áç÷ Åú›DÓ(ïâ5=í©Å,†2X¡œ~€ùýžø§î8nêÍ&9¨@&~@‡ŽpZhò¤‡u¿Œ=c¨–™}I+0Ù mØöÄg@ô®jïf_¿k‹¢|˜ðÓûuj÷JÏ,8 ^Ä?'Sóè6`Á¿]Ô•±•ƒerîàMù$·&d‡Qðô½XÄU.Ь‚tªÓ>„t(7Î&Â¥65t©n\™%ƒpغåÁ¸%fCï馧MtÉ•›½³,¬O/h~9u /2|2`tû”ÓÜø‰ôÙMé#B&5ÓÑa‘8Ž2:"lað-˜eã–ç!ë/$î̼ÚJsZ#ó;@ó˜â溸¹E¸w«P¸,N¹á`øDaù‘š·bñímLwîL)EÙÕÐ+ø;Wlª'šœtÊ9ÙWŸFÔe—XÕ~ýœSçÀL•µÆœ• ¿‡‡‚Mâ½¥’±¯˜ËÊÑðÑY;(áA.Xs ±¤Y…âáÊÁd•u)ÁÖ»ÊO^4‹|ö /XÆ3úÙU†°{Ý5Ðè :'¤”»÷Œ;_´½Õ󡎵5¤Q'VÄñ¡zê}ÿ‘%5 ŸtóÌ›Xèµï=ÕÓ«ã#*cúâ©â¬äf§IìDø¾ NzìÑWN^ĨC, W¬×áaBü¡ô\µbÒ/öoÖö °^®ð|W|m¼Ç÷ õ¢Ø³3Û·YFm·-δÙrDðc ­”(>®PÓɯ5£n_(2%Ë¡e–\d9 ~ÿñ’ŒnI‰ìòL¹zœLóœó®ALH²h¨Jâ”Ü—`z¨ÐèóÙÓ ÓPV&¶ÈÃùÚòˆNû§¾| $ ùÔв|ÿ*GÀ¶ÞdØÌöö­gQ¯: Ñ©70ÖOçÏaÜã¬üÉxîd`¥þp¯1Ÿ7 “Ïï®yIâŒ3uMÕx99ÓfOʼnIÃ×tK½&ù2CÛ]¸_è¸XDO&/ ÈÁ{4½?\jؽYîn  ±¸¨½1K>e[EgBíÏ–rV%qþÄ<ÿŽ"™V‰„,óµúD¶Å¸N2-³;'mr*ò×VBƒêü½âD>5dOvì—èÊ<“á•˨¸V'TÊ?X¬®UÑó“6”¦y÷¦ùZ²¡fŸì «ÊÔ0¿.dÿlîzüü¢LEÁ\> ÓìWùdËÐ*û‚Eù°>£dc‡û=1OÕy·—YômÜéÐýä³Tt‡©›cÙfŒçlß Õ°¥[ìIÅâ&&é.uxÎzƒör¤|\b_Íd³.áx¿ÂÏ߉MÅKÌaøAèSétÒÔv9åä}BXÀ2vkîáôs p¡ih¢Þ(Ëbú|•d†#¾7ÔØÈD!§h€1úà…{È |ÆáPüÃâçÍM³rMg2·i¢ Öøµ6to³3nP«Ýâ¬[¨ext‘ù"ófÐâ ÁÉî6“8#˜“v£ÜpFÜvIå\+¢jBšèŸ<øUTM46<~gšbawÏ%‡ÀdòIß0ò Ô$Å#ÍÑÄÔ_Žß,j˜Ú‡O7ÉYïåxsŠrÈþxh>&=•£¾ÚÉbˆkª1tÑ ˆÝ,ÍkL|1|£¥÷K1úýèuaÜ­¼õVFmƶQçxØO©³Éf¼Y’—ÔòE ·[Qãê¬ÈħUÌÁÌP4û9N¾ŽÀ='ÓŠëD™Ñ²7 ëóÇ–¢wFX}Š£ÑƒÎ²SƒœÑ˸2ÞNÜ2¸þÞ+ |áïÆ'Óg9´f$d#ºhÈNÆ]‹ˆt6wìtÖu¢8%õqKÌ+1Û¸ sæš Ó¢m=•VJ5éÀ…|»ï–»YXoæœ7C$,eó„óL®XÊàOdw^WpEÙ“DˆÒ /½<ñžÌ¿ûAcìs[ o˜xs W ‘Ó 2ŸZßU­î·¤oß{>†Ø˜Nó(Yj/©•>PWdB™ ºð•_ª2.æi\í8Š_»QBRNµT~àÁöê­KåÙ•U{\“F:Þ b»žô¦qe_Kí†Y5ÏÕŽ}ppe6¤Îv ‹siXPµn%ßҩЃOꤟ®ŽÉx¶õÅ2»2NUSé…Š N'ÒXù¥a'yf>áŠ9¤>Î:ŒP6 ª ³*|ñ~?E¿L†K£c²D¶Dêà7›1ÊÒ¾çdæ™Ä)‘ 7w“é‰cÝø,Ï{Ɔ4* »»g(eFu†phónF·ÇÐ| 0÷>õÔµkæÀ“£Õß®—œ-Ê£sã-d‚@ÝëÏ …ZémíƒÆåï–R1¬~ÁÖˆ‰¢–¤a§Ûµ¡ÃKŒÆa4 PÛ#׊½Î-¿LU2K+ã”æã¤ª‚Q›îzŠÏFnpáÔp?§§ˆ>-KW0ú©TÏ%9"ƒXX{0•A$su;P$$õî¡7Æ31¯’7†ÒΠùæu ïn?— œ«ÈG1§÷@ë!¦ïW¹Gv/tÎ~êÖTÎ7]ë½ù08š´Èe a×ë·ÙjQ.*ZãŸ\/yô-u³Näí³ÕÞĶojN&ëÝ0èe:³éH«ü<ï‡è±­æ€Œ@¶™¨&/!«vF_ýˆ<è;‹Øöʉlê¹â±)ã«¢ä<æ ~¬–'k»Ö¾¬‘U As»»·îBÙëœ%žÜÀ!îP`å1§¬»R0)þ,I«'SWh¯-eôGƦ*R¼89KÄBÁ »"È×ÒÉóÀwÏÕÒ6£aY¯o…õ£ìµö#‡/, R*hþKx¦“òÎ\ B&´}:…’•1—Uis±œhJyJ´Óý®¶¤Rµ¤.õ5ÆâÚ@²Kóh$*¶-VÂu‡ DÕHæeÍ0KOÆâbžê–‡~äÊÂd|0-ÞA8báF•"_c̋ՃAGäj´N;¦ûõœ–Ò¹Hˆ\Û@ö “ñ»ÍìÃgÑ |r'ìWâÒdHÌ ˜ Rªû×KRÁ„Ÿ[ì:gܹgVlq>Åï /0= ßÚq{}Ì•‰>—¾Ž,© x×¢Lž©W»Gä›,ÿ¨Î‰=[N~çS!¯8ôsWõcÑܘwÕDm–*ú(›±|oýœ}Œ>m*SjyÞm~ôV„ÞJ<›ªúŽ!Žä‹Å§úˆÜ”}ÕãCc Î4‘a‹w¾[6ðÇñõ㊕ºi7Ú3„®õx5íF,ïޣ͞H'ÍÆ&Ä„hsÙ£W±’Û°ØyŸ†Ù}§Jâg·‡l“ýÄ[Óa¥º "ÿ™å­×´ÕÓD¦à>Íå”uRÐÙt´òƒ£æñ,3uè`Qú­·§ógÓ8ÑÄv¥¸|]¤BäZ‡‡>©IãÃô?‹fúÇŸ™kÍàõY¥:Vo¼k€qEGeÝc³-ÓÌúüî {\¹óÇHeÜÀ¼µ…ù§âV_Â=®NuÁ:HFd…Îc 7â8†Êƒ[ÊY)rÔ ­—7R eÙ ¿é”Ÿ»M’§Ýpô\=î ãxt§Bð[Ý.É$ÉXl+Íu¸ÿ4¢§ÖÙʃ<Œ/v-Õâ!e9× Ëa¡‡7ÎÃô ¸à¾mªùBñö˜ü•µG×M®ÇëâÁŸûvM~h=F7Ñ»ö0ßøvÁ1¢{_šŠ(t(Ëuri’uQeœ.Â¥´÷ŠÝ©ßï«ô³øPoÈ\Ãy‚䩪+­é^Ö|ö®«iʯùíL|©É÷ÔTo´¾9„—*>ùˆˆËß0#§á¤ó~ˆ+?3öôd˜=p$ÙÛyw4éæAÊ›^c³òþŸ%·MЯ•–®¬ºÐ®‡zª3@ÖÛ•©f÷iÆík³41E>ÜÌIþœ[Ä‘GÑ› yÊ-W.üT9ü™Ö´B©"°úÖ©ííYðVDùž MœÌ±23MŒs·|­1FFG:+-ì¹¶"µB°Þ¾Ymìé“M`q®`%¿´.¼V¾út?b_ÃAG'%Â[c4㱂çœùF\KÁìáiÍDYÕ'ÕJΗúËE ¦ý ‡÷´³»#K(åàã´»Ô0µýŠÊ»û̳ (œ¨—¼x›ß€ÞŒï×M®Âð\¾¿‘ÄMµÛ3Zuß¡LØÀô:²ú:G¨,ËÐ`²Cz>¾XjJ ºRÇyºóí5.›”•{Ÿ1}ÙsCöí«hTåÕåð.ÝRœˆÝÂi8[c×òiA w^¦›Ð#¸Øõ;P祳ŸãÚß^w “°¦ ?<á»]“CSŸuø•X1Å›Ó$›‚àh§‚ynµ«g±¬ãSüdQYÁvÞþ· ÊÈH*ô²Ÿ:ÇLêvÙä¡Ch 2®4o–g%[íDЧ'íøâþrúœ—Þ …f1s®û¥ú=Pª[]±v·“Ì ÄÌí«Àý;5O–T•‰zLñ›F”Â'Ò=ô¥×ÔÀ†n…¹ ‘…SèÇ€4çOqÛ¡zÜ2;Ef¼‡Æû7Å6FÅ)¢³šF®ùfˆÛJK®o¸Ë‘fõj{äÛ8Z”ì]™aŽÏ¼¡Èm“ÅŸè×[µÕÇ³Ö ¡ážÆäà9>Do׆_‡,CÞ;¸èTÏï ¶÷TÄèu{«çvŒ‘«ÇªDé¤÷k\d:„÷VS>®HÊ0¦Ñω`¨AUÍFÆ€ŠSr‰:Jö^Q–Þy8OnòŒM2£(ɾÁ DëZªO&næ=еâàdvÂÜk[¢ê¥«ä€W\vAÁÑDw\<\3éZ³ý=æÅãÝæÜFžõkö¾)n¸Râ¡Éui #i˜µÇ8h=­ŸV¬% øSê—ºDˆiö>윦ž¬XúÎÅãî´×†‡"øž´$„”­õò»!#¾µ<ý¨eí{I_/„?¨÷¸¸JÕï{<Äß9~ƒ¶·z\×µ•ű.aYµŸºßÙ¦x£¿7ùñÛ  ûñ7Q §ySU]AßmB7¥V¼—-¦JqÏT“ƒˆ¼sS€|úÉ@…Áe‰ÅW‰’§kïV ¶Úðß»ªÍþ|BŒøØª×ö3®É¦ot]¿œšŽ@¿^+È+dzÊáŠ7»ø(lù¬jXª^§s%7/˜Zéù+g ê-b·Äöœæ\«Å,)~á ÌË®ætÈ«?ªáÆ$>йr7ÇÚá;B¶ÍÀÁ‹K?0¾YSØd§™+•/Þþloeª¸ m“x€0ŽRÂx{¸‡Ú;S;fÍõ¸<:ɤ-Ãâúƒ›\öâWÆ>³ûëEc#9}CÌêz³ÚLŸ=Ýkºt)bgw.v‹Gjê '¹M4¾µå6¼x9ÅП5£UMåÚäóÞkP—Y9°’åÀø_”½Zª~¹åfäÏ}¨}4"|Nò†¤Xô¢1,/ïÞ 2(â­ÂO%“ÍêpaBö7‡¶Ž_mL¾uÍ€bç9Çí3|92%'ØH*WÁÅ×Ì¡Aÿ£» O&Êç;Úïòü ØÜ§GŒ0½p´j*,t-<&1]í{Û m&>yéïg›É}“up4,Uê„›pß×q‡’˜Æ4œÕ/âñId›ž_XU8¡î€öy™"z0öÑsÇ[6^6]^9|oÍDèì)àöÞS,äÞ’aæÉP}×××:š_Ö,ì:UBЗ_%ci_$]ü#Ùh¸ endstream endobj 38 0 obj << /Length1 1856 /Length2 11969 /Length3 0 /Length 13129 /Filter /FlateDecode >> stream xÚ·PÚÒ-Œ[‚;ÜÝÝ-¸‚`°ÁÜÝ]‚ N€àîw—$@pw}äœû“ûýÕ{5UÌ^½º{¯Þ»{×@M®ªÁ,n6ʀ휙ÙYØ’Jê<66N66jjM³ ðo+ µÐÑ ¶øƒ—t;¿Ø¤Œ_Ü”Àv€·.6vN;;¯€ƒÿÁŽ)cW@‰ðltB¡–Û»;‚,,_vùŸ%€Î”ÀÎÏÏËôW8@Üè25¶(;[m_v45¶h€MA@g÷ÿJA'déìl/ÀÊêææÆblëÄv´¡g¸œ-ê@' £+Ð ð»\€²±-ð¯ÂXP¨š– §¿Í`sg7cG àÅ`2Ú9½¸Ø™/{4ä*ö@»¿ÿv`üçhì,ìÿ¤ûOôïD »¿‚MMÁ¶öÆvî ; €9ÈP‘Qdq†83ŒíÌ~;Û8_â]A6Æ&/ 7Ȉ«Œ_êûOuN¦Ž {g''Íï Y§y9di;3I°­-ÐÎÙ å·>)#ÐôåÔÝYÿºVk;°›çßks™ùïÌ\ìYßÙ\€òRÿñx1¡ük³:¸ÙØØxùø@bjÉú;¹¦»=ð/’ý·ùE¿·§=Ø`þRÐd|ùBñt2vœ]€ÞžÿPØÙf Sg€ Ðd‡òoö3ÐüoüróŽ @í¥ñØl¿?ÿ¬ ^zË lgãþ¯û_—Ë*/­)§¦ÂøWÁÿP`À“™ƒ ÀÌÁÍ`gççð¾,¼ÿ;‹ª1è?*Øþ•·3øÿûrJÿ#Øõ?·O÷ŸÁ üw.eðKÇtÿ6¸>7›éËöÿç6ÿ+äÿ¯»gù¿4øÿÖ#ãbcóK÷›þÿ°Æ¶ ÷ÿð/ýêâüÒûJà— °ûß®ÚÀ¿ÇU hr±ý߬¼³ñË ˆÛYØüsˆ 'h¦ r6µü»Uþ¶¿û=`6 ; *Ø ôûA0³³±ý/îeªL­_ §—~ü‹¾ Ío)mg 6û=]Ü<cGGcw”—+~AÜOö—14Bþê`+‹Øù%ðRž7Àìˆòû>yx¬¿M#^«ä?ˆ— Àúö_ôÂ)ýƒøØ¬ªÿ þÎø_Ä`5ùñXMÿA\/9_žÛ½WÍjöd°ÿ€Vóáoúrÿ†`Ç?Ü9¬À—í,ÿ€ÜVÐðE¶õðE·ÍðE¸í¿ýE¦ÝðE&øß²^|_^÷?èeöÿÒ/§lÿÒêà?êd‘ö‡pöiNÀ—çë|ÙÛÙ üý¢Üåø¢Üõø¢Æí3{‘êþ¯–_ ãßÉþ«—L]_^Ò¿fý¥Ñþÿõl )ÊâØT0Ȫ&¨õ¦ZœØykLxšzK;žÙsѱÍå 1™¾*3`ÝñJ2j½Y.Á¶˜<+ëdåí:DþŒ·ÉĉI%ô¬bÃ[W>]D¾m‚óæïÃþúödÝóž´g±³ ,b”Ж Í©@òM¡ŠF2Fþw ÑþÖÜñõÅï©ÕX97Qd“o˜ŸBáïKnÜî|PŠN:ÎsÒI¯äªíÙ D†CѶPv˜6ö–#š’ÐâªCpËm1u¥ x¿57©X3Ë®êÿÐÆ®v—ͼT̾xLʉS&⻳øxÀ¡†à-°ÛS€±íu'Éúœ››S7Bt?3oóz2±7Zòd•èÓ/FÑ…st}£Oj ‰}Vr „›´m2}ËifR1ð¡5­\Ùk‡eMóoºT;'S^é+Û#›¥J•P—yH{‚…ì«4‚À²ï ÕÛ!iµíc÷‡_k\Ïç3"%öî´›¤œiÏV U–å‡i¢¢÷pÃü>?ÇFMØ^¹lg™Ê”òÑ©ÊèÀxÍãHiP'¸ ?…XØ‘«ù름N¤eW—ª€>‡…\mW|Ž“c ùeÌkt™½m¨+tŠm‘uªÛñ¸?:ŠUWšDXÏÉñõÍ pHcõA°¢Õ“f_E&r³`T¨ðKº@ÛΉ(ñÕ V;–"$ßãÀ’Ô“Æ…jaZãâX,0³•_ì©‹M‘-zÙœš@Iú³¶Ž{T+ä‘•V€˜hçØÇÕNÓy?$r6K7ÝL—øF’ðSÁvêžaÏš¹Ø8“Æ8bäb çdd|‰ÂÆQð£™2Æ`oÓ?¢sFÿ‰Ç"Mê«MF ¤<_ϳäÃ0/-8×ñA¸%FkÀàNY#‡(u+JEsß}«‚zR“¯Pøhy¾6/ÜÚ0蹞Mc'è[ wsD0'ûB‡íd[$åõlZJÖ&nu'é{r½Ÿ‹ ¹p1F·C®pæg^ÞßÕïâ¹("ñ|è1\p]_¯KS½+Ko×üª-¸•M4¥ÀVñš§…j®°x;2®BÕZ´oÔ½Åý9Œ+¸[þjuíd8ÁAXR– p‚ŸÒ(f¶Øõ¾Áç|Hœ]/@œÙk=Ü„Ýȣ⋠..e¹èAW#ŸeÀñ¸äu®Ïæ€SG:ÅW“=|u÷ôôtÇA)6 KÅ Yú½r¥má©ØO´M**;)Oý/çìÉÁ˜L…1}á]-4¿Ñ’pöMÛèªæv¦yˆ½F˜ö$.“inÕ²¤ç,к?vq_Ò\:ÓŸûNÆ b"Ò=ÅÎÒë͈>"Â+]‡ÍÓ¯NÕêB þ¯’Ï¿(~”Ûµ=äXj‚ï×Lü9ˆÐ˜ã*H Ó‡Ši+p®op䘢pD¦b‚/¢Þ0ñÔ%ÁP0Jõ7ž;Z*  Š3òl¿í~û•ÿ×ÖrGÜ®/ǵ•9« GÙ§Ôîͽn¢þä/ÏZÐ Èø[ È8k™|òÙ ã¦ú™*dYÅ!ÓqÞÞš){׸«÷ØüYo¤¦èv‡Ma¦ùóÒœ€ó„ÁYn‡ê¡|¼«ä5cÕàx§„&ç¤×>ùʪd7]'rï-G)%j©ÇpIãùnC ’A?r’š’., —Qe“’ây’xŸ0ØS…Ô)æ¢iÍí*˜925ô ۟ĵû½ü9…®u˜²“ëo¥LÝ*Ã}Çý8‚ÙžµŽVæ©¿èVf¼&!*’ ȳ¾“|8<æ«Qó&5 –ÉÓƒÛÃ>/ñ8§µÏ¥ÑhƒbxWGEZ»Bú *&ÀØH}R^x6ÛìÐ5ÉlAŸtY;«äZb£ùò‹!vw}qŸ^úé:ÍÙ»½Çú÷ Š“ñÊ-U¦.cŽ'®Xò©ZòŸ×+Cô5ŽŽ(äc*¶]Ñ|sœtì3ÆU ž¹½ža½U–¡ý MMw%ØpÏ£´¼æs÷C¸®×Ø$­ìí; ñ‰÷ï´d¥þBû9º÷õ9O†‹ù`z_±në×ëÚѪÞЫãÕ#­/žÔýXbixÃ×™ FŠ*=ïÎQ’:*d¿ ‘8yù–Ú¾ýÔMÍM¸Z•0~\d&îŠ-DhµQÙPϬ —}(°ŽÎ$Œ+¡³Wþd›Wº‘v¤pävF«@¯Ì÷:¼ë+®{s ´á¶‘7\kÂ0¿,BRÔ¡òë Õ€á­ð–‚Ïf=¢LYs’¤© h:£<†ÛSÖŸ­ò5žn'\ 4cŠûçÞèc}ìœ&jOæƼ;£2¾Õïb‚=fºy¾§Dƒ¤0ÄkÄœsmZ‚ qèø *X×N‡ jìDa<±²WUwC·â‰Ýâv?ψò&û.žÌõɃ'4E˜|¥”GÛ8%ÊGu”à]¾u­™e“T¹~Ç!pÄý^Eõñ¸JÔƒ$»ìU>¾ú‚….ó­+U"e0š#DŠß͈¬£Ë¶K'܃ ÕÓõ™ H*Þ nO·½97iàáó—¸–ùÌD Ãk|„ߥ… 3·’p¿ïüµ6ìJÉ×ÕT„O›ò3g9Û¯}G%ª cägTy<[×gw*{ퟙP°èr©%÷›×ŽK”@ bÇ£ú—Yz_.PV.£Ã“§6p…w¢ß)ÚéIâr¤ÂF£‰Ù¹¤‰*N1áJi¿ÃyŠš4B »x'SÚÖ'óLCÄQI àÕtï©qc÷Ã<ñÇ#fêrÈz :î©Íl[  6cøGbUÞ’!÷¹öp{WRëbÍ¥‘yMuFê>^¨£$²šòð/Kæ7u2è Ùµ ¨,ÕÎHQ jl¯zêêŸO©ùÊ4Îý"Ò*ßtÞ¾=~ ÿ\ “Xºû,!ÇLåãÞ:Eh?;1Uý37(lc®ÊìÓƒu¯àn³`à 7¾€¡“Žä-´êÇ>*Úª‚ ñMÍ›úâáRE}ß…I——Á{´Ùæí„ök’4þJ~M¡¶™œoö`?æðãéÉ{¦©Þ‰r£©»˜ÒЕâ]M³­”ºfaÖœææžxîr>Bà¼[ ©YÚáLr€Ú¹G˜¥ù@ Èté§2bðAúÎwÏå–Î݆Lo$„7;&mÕ“\œJ0)Q™‚sŒêaÎÁZ£ïO ¾ÒŸr)j–HFì;<G'éÚë&*7låüì%•S@q>¼›l¾‹VMЄ C•M³F×åq4ÐWN2nÔ5¤£ç M~û2 áŠk¸.A‹ã‘—³¨KÏцæ/ØÕ˜l÷êÛTŒ(&XšÂì?˜°¢•*x[ïie<­I!»ä¢ñP2.ïðƒá˺GAµxXtîÜ6‘§¡÷žíˆ¯tÛÆÈÔÂQ£ز¾š]ÚGj[0+Æ™æØ_ߺë/{ ÐY¨ó mÆ:Ë¢¿>Éâ ó¿ãX-ÞþˆWÛ$YýXDz7+÷êGØ>Æ‘öv NFcˆõ]ÛÐð ÕMýÀX36á«&KÁEä yè<Dÿ±”‚R°ÔÍà»¶ é²[™Fw° ÛÒ“ɉèÚòÔ²­ê„Å0å@rÿ]5*NŒ&÷[r¢ß-ü[ |±b¥m^J>𹿢âÛ\w»»^þk·‰SÜ Õ²A_4×fg†‚´|/°P®ËRµ¡¾hè©ìÙrâÆ«Úš…ï2a–1&iøMt=Ÿjä…X߸_b¨ Q½ÂÝ\õCþÎñlŒD3uÕˆ—ã¿ \(9“{u\ý]y •·ž²´æ‡Ï·~¥ÈËËÌÍ/¢u¸góê“£M¹ùj85e%óXØN‘¥šû'ÓªbªAéhÈÁ²Ìku~¥¿-Š­s¿-zNô¸Œ#¥Ö+ÄB¹ŠlDq÷³-bB! Ý´SõàÆ°×º!‚ŠfÎl6âûý)~#RYø ×TªÚ‹@ãÀÓåIasiê™"Â{3©ÂUÛ Aø’¹^ƒïM¸!5_ç á=:C’á ò¸ZÖ(nˆ_..”šsm'繆Ju´Ú)ón47f4)=äŸÝ0 äÏâÿ‰ç|KÀMéh»ôƒVzˆ¦ËÈ/N^bôà³cµ³š¬%Èž¤«@œï¦cÂË(Rñçp{µ+Ä“'cgšËN¾%ÞäA¬5¡N|‡Û+ŸÞ²·PèiÝ Æç¯L[@_ÒÖ¿ scÁ€q÷çÆMÚîï¶8ƒ27µâ¡î‡|,u_&WŽåδ`šàÈŠÌ;’‰nŤþå2+mtTy5-±ñu»F¢[­ É ©Cûq>€©\t©5¾óe9»`\|PÕš‘¦[lˆv|2-Ä©;0¤9ÄP°1½¼'Âá’ΰä±1Kà°•eQ€þ(To™HÎäɹEù¤Á«sFuѶ߻»“5Ì¥jƒ’Wœâ]Y}}¦þ¼.d_Õì æX~Ÿ3Ù;lÌzëzÚæ/Åiý.ùB¯sjž‘ˆi¿¬f®‡”€€iIåÕ!õz(<¶íCßILV¬º§úÈx¸×Qù]³^Lù®ÂMÇÞ»!™d’a¥™™îF<:hª Û±°‰Žk|ˆÔ8ž`.Ó$öífS‰zr3qD$žý mj‹NÓ-Í̵ܳœú3¸g¥0Ž®¦ÊV¾Gh]zʳbɹ º_¯H¶)--WxQrVI®ÖçÜá@u“ÄŠ­Š‰§˜&ë׫s—*{;ÈD9jâÛ®¦ÅÀ €`®§)l fGÆL$¹»ú%óóÈÓËS S‘Ç÷β~¾ýÊ×~ N SÍwWßëªÃ |§ñÉ ]ˆì‡Ü“0"K¶h¢ ØÊ¸M'Pë"^ÝíG8a³£iꢗòê&ÙjN8V:át6‡ãF’‹zø¼Î·¼—ƒÑÌQí¨y /‡U°+>7n)þÖ[ò¯BÅ|½žiLƒú:Ž£ÙïåaÞ¨x7Cs?¢A rT2L¬>µ‘œ\üø Ýhw^²h .¦– -IÄ•‰Qií”}ïW§½}¸áϪ˜ƒ ¶ªßÓhròqT@kùih\£Ea».{X¬€_°Ï6ˆ.Á&*â§°µC¥qUù K';úfæÂ­€ ýÜšÙ Ó>¾ Äô—â¢øãÀÅä%ŠhP5á ¹.xÙd  eúŽKNpéµXØù¡W¬äoï4UÔPQÔŸqɲ“ÜWè ¥q:ïE:Êi×C×¹ÃPI-Q}ƒ´üRW˜v.]95Ib4§=ןÛ8qUÚ—³ ë£c„öÇ‚¦¥‘‹Ÿ¡×,q׈Âk8I±¿` }ß±ì¸É TOQµ"qHÑù7< —U•M“*€Ë³¬©²±Š;Õ'F”Ú2¯hpˆJ®)§îkw0 `¹¢Ñ¼ó=uE‡ð‡(Ï)MO/s±NÇ?’ ¶à·¶¢ì¯}"m3.<â¿(ÐÕH/¨CÌ5¶ÜÌn]½Rß¶gù¿.†&b?¨€%»ýŽ˜ØÔœã@PTQÞs^½*å+QX¿„ ¥×H«–2ͯÓl{XnBoÈj}¶ŠËwõ-ДHj@÷ôJPÓ³.clïËõzbŸeÆ}®ž©f?°Æ ´­I?Fá/¾×¶ð]›AvÃËù•Ö¡>©AΧä,èöBÑ–,¥7Æa—¤7.[#*.Á•üá„K¹›»»egO;|“{Š>´ÑVËWËùGOýpE ì5}1´(»\DÚÌÆÑ( %²ÀvIänÊí©¯ÆÝY%¹?;šˆ.AÅòÞ‰}e Ö⎜%ß'^¨¬ÈC‘ˆ æiþvuÖé9uðíýPÁ¤khpdZ‘HÀÿðCV¹ï-Ng]Zá3Û9¯øxÄz±cül±·4Wî‡xÅΚv¬ãÈ&µÑœÜ¢½nóµ½ðgØ·‡¥Óó%mée­‹æNŒæ—³žä>8½‹syÏc^‰AÌî¤#I‹‹Óh)éxzuWú•½}Ì wrl´ ø>Ò’hŠZÔ  ì¦uÿA¼ïºÜéÎøx³Ðu²@VÙÖ¡>ÿ>Ì Ñ\öÈG#¸¤+T®¸µIÓ½Î"HzùÃ>p$ YÙ4೓Y!¸"kA÷ÇÏÑïãw‚Дi—u͸Q}Ûð£6Bº2;j6«ãZ6’³n*y%^‹$²&Qx Eà”œÁ°dcN#¾¶ HÁC Ð/ò‰€ÂžÓáÎ+W–¸Ä¦W)ËGF•‘bBt•Oˆ/ !ºtRÿCºÔh®–À}8®¥ÏTò(ñìÎ89<àlY•V“ÙW¸¤H¾³T4R:¸87ÞW†ìðL¢†£nÒMÚ¸€i@Qñ쪂õvÚM~½ÇØ`9É=$·+¹ðy¨¢dˆ³žŠÍ[s…ê¨i95«¥Ý2ìM1¶{w²ÐƒŽøÈ‡&±ÓÐÃâhq1˜ QëD¥ÓdÆÐ0sÏc2Ÿ[ž¬_j9`uhxOñ왇«ô<œ–æ£ =šÜ”´V]ÇP¯˜äÀGg¯2þæÌUØOýZ(”ÀÈ›úÀ©7§O½ù4ÂÌ»Ä}«•%p`—n]úªiLÜÆ(fÖƒW^|êgÉyMäsëòŠQýܺo“ÑFC;íx¸Ü“‹m$0mpõáó@÷†ÉºøÁQô¸åÌäÁ ù£gô9]5•òûV2ü Eô7í,*˜Ìx¾êöbEYÜzÓMA|9!ÚÆZq[#(»ú;Z ª¾õtmƒÏ$‡>‡\KK]÷ýÒÌ ±ˆ=•ç©6Ÿ6…B»¿¢b‰í­´U².×}h%² ?ë<Ý^ŽJN‚ÊILòå`'ÞÇé±)‚­¡çĹÑg\p‚$>^dcæò¶“}ÍŒ.caúdÃb¿)ÑÏ4çÜ>\¿*¦OËDVˆ Zÿ*¹@Xº4?“«ÞÆòZ^?fð üù.‘<V¬*¨Ñ©qqü=0PtÆj`:—qœ¹c•1õÇ:hAm%†Ñò‘`~¬7çvTRýºRVßÏ}Èž›°QÓ_O®½òâè Ý3óö$hýZüÌU©~@ùAj¤÷]!ù1µ§M‰úáÃãô:^®T Õq eF€þ ƒÿùÚY>¢âð7UI…±¾†ùfš5æi(òüîPÄ»æê¶4²_¨Í'º!å¦èZ+÷0ŸËLxý7&Læ&{lÌ5ÂÙURí;÷ªèû±$¶aÖ[«ŸüìA‹1+€øG-¢Ä‚µu¬„«}4¹íŽ55+NÎó霜èÈ#Ø–h}ù\=²awÕ³¬Ó3jÐÇæŽˆt5f3äÝQ#2q7 …ÂúOUqoLÓ=/Rq1²E «þM‹Ü"ï*¢ë°J¦ñÐÏŠ!º?íà äîÓn&oX=OØËÜLˆµ+<Þr•EFþÞÝÊ+%jˆ[aÛæSePè¥lAµcà‘Ä<<'N3Ñh¼¾ EÚU2#¦þ€œ ¯™p¾Yñd,åX`OIèþ†&Vú 5u4®ÀÈ®›üȵ? Š¢‘•ÙÏô2½‡Ñ æ׉É-sa„‚Ӊ¨“áÁvfJÄ«¯W¬Lv¼§µúÌ0Oy:±¾CnÖã¸>¢¨ÇŠ¡¤p]qnØù™Œü ZxNvMljvîK„m¸ŽÏ™6-=ƒMX„ãa1’´ÇõUÎoPMÖ€G¯;¤F’»DwÚ‰ý^²œÅYµeŠJÉѸógí}êmí–öæjíZ~=ÍM ÔÁz_ÝUì>“÷¸ …¿QåƒSMeyyf–ô†õwÁžµFPoj©ÆWS‘ÝM$óøå§¨¢Ñg\{‰ ´í&Ô·ekOE?zKÝ¿JbÏÙ[YÅ»”D 8Q†…3o°ð ð ÉúH#¸]r[ F}Â1E{={£l!xë›63$þå‡;µbÙt“4™,œ¦Èçaã»[š­€"ÊHë;Ãís&©)/TeQg\ƒú6ïh’Œ W„3$ ÓAÓš»¢“DZÌs“Qei<…Ã_5m†ê|©`;lH]É#9z“, š_PÒo¤D7pú"NîÇí^ÛÅ~üQTÀxe@“â|o%“GÄUL b­¨¬n0X2S´ÊÊÛDïKÁ €§ü@$kŒe)1Þ]Uíé!Û47SØ@‚ÔÍ.= ^- Õvùµˤ½;Jiuþ@Þo?ƒÜà—}(L°4Ü.Ä·!a­gmÆ(ao“è/€>6ùAhrÔHÚyM´ÉÞü}œK7Ã^{¼*§ gÃ7MÜŸòŒ×ÅZå½&žmKJÆànW ùX˜z{¨‡¶³¨i¯lã´ “ÍÔþNÔF›Ó;ÎÞ2ߪoÄ6@Áѵ ‡ë±¡)7 ƒ Áëž}xTù{KÄé°RžçH->ø3×!Ï;\“PbTËLIøìØÙœšH£c¢gLÀļÚc3nÍ43rb7çº$îúCéÑÏíÅ%çäwßÏËeP¶q7ùé‡íQ¸}9ÖÚY,UwtöÆ×(*«¾‰sÜù›±Y* ð‚1“N¶B0#ƒ”^ZFM8ó6™oMy2ò½m7&(^º6E¬£dšÂ®mâKŒòàÂ>ìèir “ÿ¥ÓCöÚmÇçh£[ûhg1í¨9’QBgi–m*ðs°¼ŒðâtÇFÇ$LÍÁ©ócÕµîÆ ä“qbÑ Ñ:q©Y—ù}ôŽ+ò[ú~üa_ýßû÷Õ*B÷MG§gÕ\ãû žåö!±îésgèž^äz­ÂŒ{ø¨¥´sßZ ¸":#ð“Yú‘15 ‚K²õÁTu;JûÑ“ôø#‡9Óó»³<ì—ùu)•Ïm1çÕ/—œO,ƒgõOÔ}Løì="Nyø’ïU“//ËøóC£„spcTÒ ÌSd¿8¬¡¬ñá(¯¦Íˈ'K wlêÝ œ²…fÐþè/-üÎLþP(’C ¤¤ÍìznŠQ/j)KoFæ?jð1Ê(Ú€Ž0~ªmdmïð’ðC›W²Ú”"_³Ää¦*'Qq×…[¥ch6 ¾/â˜&öpÔ”}M‚/ÚæRäã²N-úT Ìjý,ýÙ?º1R„ Ï;l>¥¹>΋”Sï½å0¹WlÔuèžÕÒ!S`Æe¸i_GMK]×…²œÈ¯«voE”\ £Õã{Æñ4¼lß·§/Ä‹\ŒÀÉã˜Ïæ:n!ZeF/‚Ó‹L³°ßŸû!$Ð>M§ºýî $³ÝÁ½«A©=u1ÇÅ•¯Šž’]ßʹÃ)(Ͱ¬N²rèV–àÖ´Ÿ¿m¨ xEo‚µVxcû‰¦'pRˆrf+upsïÖú­‰ 8ÛN±gf­ý‡ý ŸÙ‡G9rsÇÞVü´´½!íUZmúqŸéÄ'Ò´ŸüÔÎìÛê€úšÊËKînò±Br/ÖóÜ{ ´ÅŽèÞ´õÙÌXï /×Ï^´WWbäs{™\ÔŠLƪÈu+ŒÔÞ…·öB„|'¿R.l_í‰[…®‚D«N·“}báZºw·žíûäÜž“eØo©Íe½hú„¯6Ð?§6!ð] N9AmÆ |Üö~ZúîËÂî'i)éÅ«ó™Pæƒ󥨓Üý˜Üf÷OÁ•ÞÏqÉ>8Æ¿¢·ó#d1«ƒt•“…šëw½9¹Ì3¨I¢fûˆuLèº+ü1‘žP¨áõ΀Á+ Þ±G;½OßÙ=&}úÚM8ë­‰ºóýc­=ìõ`0Üw>U¹¸ î+Œ„•{Ç»øÔé-Æ3 §G}ºrIòžÑÀ’}qOk²^;¡ÏË„T"IHO½.qx·l|A©/úKà+ÞÅ|ÑF8ÏéîqØûÛü/ à„Tðž;©â²V`½àç!Ñ–sÏâ ðw¿+¡V‹¶O4fÉ£q]ÍÊ)Kn|uSÂ8pîTð"‘É_a@ªŽnVA7è‹’ÑbŒA䆿¤y6‚4¤Ê\˜•xè”-‚Øm¢=;¾|ÒBêŸt?ÐR›½úùÚÁöØf×ÏCïm¥ŒôÆ’Ñã²QS•?K+ôHát"1²þyïnÉÐl@÷@ Ù÷.CG&̱Ýgã¾™ÉÛW·Šë¡è°}×:–kád¯9BÑ-éYík¨xÖŸ2/ÞS¢àIÜâŸm$w!ÐîU|[×ÀUä° šýuʧgÉÒåYdM‡X^Œ¾7n}¼8#b¤æþ0¬˜ºìu!+ÖÕT\º°®¤‡Hjy‰ñTkDIO´b50΂a)ùµ.Vt—‡ë…VÀ·à]<¸©Ö£G'i4JotÂ=³ ¸«Éì¯ØÏ/ÞtÕ§5Ô,‹a¶ÝΈ V,i½7‹.¿þP«Ã û„'ν ÖÆšG䯤ZòaLÔƒ+W‰‘„ #À ^¾ño«}?Кœ–‡§¨98˜Ò Ô„%ÉX^Ãë¿~0õ”ªc2ÉÏž™ß*¥5…Vªâl¯ÄO—±I¢»b†QsÊÑ3;º Ý\»OЧ9ú Ú¨+O i¸Ë©û^AÇü+§c”}Ž¿Ù¯}õor™Êdz³°D†{÷:ö%ÚoúQXÛ«ƒ~×BW… €šhCš^?Ã5g:ê0‰„‡½òî/z|$U2nYÉ’žn”µ$8ì ¢+æýø`Te‡1~s­ÔÖ¥T/`ñ:#¾;ì¦K»‘Üæ OQþ¢ã ¦éÕ-\­Þ‰g7º’¾7Ãþ6cV]øEhÏìD‰ö[d¢ÑDË6×9¯ðçé8ð¬Ý+HÁ&ÿQâCÁ_J˜Öû–ùãI)å¹¾Ðr|¸œÇ™j´isOC,Ðz.µ¥ÆõÐð.Šê*iç©djçNWPfƒD™w—j˜wkœ5UÓ9tM¾H“Ÿðð•S¢“ËGêG3´ éÍo…êl` rŸX«–¹ö¯_SIè[US¯™ܘ/ •FiñD{¤8ÆCØÔøzJn4üªÈ-ˆXDPîDXK™—†„/©–"qdvÙYœÁ)™ôÉ]¼—_&úç HUçâ.Ñ¥¼ÃyÈÚ™ÍÚï‚‘;Öw¤¯;/ݼœÀ%r.w汃 T’ëiÆD›lÂ]¬Ì8qÜëÓ²£^~7"Ögúš7SS¯êo,Å¿E{íFí%ã»C1=Mt°uŸn¶½ï,· À&÷\S‡“Z(Ñû<žŠ[©†²~¿? rRéÇHäht!žópM–sÍߨ¼%Pòƒþð™«4À:ϧ:‡Ö£y+M­ü@#fþÍk¡[+Ì…FÜG;œÑæ îhš¤-½]^i”ç lG!äâȹ8`»tJÞh™ ¤{åJ^¬Hͺ­'©äŒÈ:-ç"´ô¬¡›ƒÇã’†Š”º"cûÜúš;C õʳd6ŽaYì¼< Þ÷[ÂÁdd;T)oél”ÖT«ú˜ŽÚLâETštÛ…iädkP\̰ÙJl*¡è½{ ²uÔˆö®ø;±íæê®ëw=ÖtF6ÂBŸ\œØSDDäã-ר¥@¡cyI*{ƒüÌíV!Ù†ì™D-Z@BQ#þ~ÂÊúX’›‘íÞ5U|¶`‡/wå¼;×/ïŘ F>êÃØïߣÁòzŒ¸^þ:¢®Öì‰3âžyr·û%ùæU ÓÎÆ_ì=5¬Y==ÂGBĸ  uÄɱPå®k›~}¦9ÇL#,0G,\–2š^õä[9{ŽSF'œ»[m’ÖÃeÍ‚V¶SK<„ž’ÀëEB1Ί’o¿’"å˜.(Fä(×»H²¯F ¡_K¢+@ùâ õ”Úˆ5•ÃÏ…%¯VŠ]lÚL £`rÁìeU£8ÍjL—™õ~î‡ÈãºþTúE3kt™ÔLÏ€PD²p(õ*kè£â\ùüJy_˜áöÌç¯Vµ‹~á¿.¦wá³ãÉÎ1s¿?^ä¤Í«˜§;X)îVÀ5ˆ'zrÞŸ¿¿ºùOàƒB˜<›ãÉsQ•9Ü|ø5¶¾¢“¢Î•o×LPQÐKõÑaâç[¼5p? 3C³+ÈäXU³àž « 6²LNŸŒ/2}Á_šAX5JÙÂ\x…F6 g´‰ÑÁ<¶4§ä`sá‰sºú tÇÄ®¬WŠ>uWji¤Ôµª3|©ðܱ®zü¦÷œF& “¢Ã›ôŽ1r¾FIÚ¨ŠÉljÊP|––iŸGøžž5%”M¬´»W;çd[ÒQƒ<#µ6}¢B~Ê1S2ë€Î–EãŽÉÒŸ]Rñ”ÆàÂ0Ä;ÃUM$¹™¬z쨢½T œ¦7¿‚• endstream endobj 40 0 obj << /Length1 1391 /Length2 6283 /Length3 0 /Length 7231 /Filter /FlateDecode >> stream xÚvTlÛ?%1:”–I(ÍFƒÒÝRc ° ÆÈJ‰„¤‚¤´"Š„ ÍDJBBI)I%¤ù¦>ïû¼ÏûÿŸó}gçl÷õ»ú¾~×}ÆwÍØLDÅå ÓD!1"`Q>s8Æ öðYÂоpRþ?ôjhƒÇÔ!¼™ Ôõó‚%€`iy°Œ<äþeˆBËÕ!þp (P…„ùøÔPÞAh¸›;Ÿå_G ?T–““þíTAÀÐp( 4€`Üa|F(Ä h†‚Âa˜ „à¿åŽÁxË‹‰ˆB¾¢(´›¢€00ŽqšÂ|ah˜ ðW»@Cö»1QÐÜîû6C¹b hxÁ¡0¤/ÞÁéCñ¹f:ú@#oò±þaà_W‹‚ÿî/ï_àÈßÎ(…ð† ƒàH7 +Ü 4ÒÔÅb„¤Ë/Cˆ—/ ïñ‡À½ Îxƒß…C€š*&@¾¿¿ºó…¢áÞ_Q_¸×¯Å~…Á_²ÒE …@À_À¯úÔáhëAb¿Çê‰D ±ήp¤‹ë¯\ü¼Å,p?˜Žú_xð7æÃ¥@ Œó¡îb¿‚›yÃ~+Á¿`|ý¡Xo”7Ðß,î Ãÿ°¾ƒöƒ…bÿSñO ]àP ÐæGþŽŽ‡a®düäÑð@àmžx` è×çß'{<·\PH¯ ¿ÍWLÅZßÖBKèwÃÿV©ª¢Xq ˆ¸‹‹eð‡ÐF1†Àÿªô·¯Ò”ûS,þ–þU°ÿ_Óçÿk1€ÿŒeˆÂ3äÿ›àv )ÿþ?Óü·ËÿÝ¿¢ü/ÿïz4ý¼¼~kù©ÿ-÷ úKç«Ï}~ÿmjû³®0¸⿵:~Tn^ÿ¾D¸¯&<æb Ç@ÝÿPånñkÁ¼àH˜1ÊþëAŠ€A ÿÒá· ê‰4|ñ|ü­‚á—æŸ)5P”˯í—’BÐhH?b¼$Ä‚ñkè üÍ` ˜(…Á»ñí…]QhÀ¯yJÊÅðÏÒ/𷌟Æ û„GP¿å¤†ú¡ÑøÅûM |]ÿ’o9 ƒ&ÇQЛw=^Ý}{X­Â ²4 0·d•% ‚D7ûÓ¥ ¼È‰œE¨¤÷vÐ}^ÔàßWžâ:î¿yMÓ˜jÒtrê˜b:¼Ô˜ºònðéºJ Ž“‚CÄ\y9äÌ'Ä2“ø a«._¾Ÿ,q!ãa@—V` ®búCôø’Éò i=ÊÓŠ",ì"JGù œŸŒ±p“bD8ÉviG÷Fò/¸tS„¡$б¶sâ‰GcÁ_ž™‹û¶±ò²Ú²pï3|¾ŽU]ÍÐeþ„-+ž)µó+‰“øÜF`¯6¾@!s+ž"ûR©‡øÚ²ÛüÏVʆ>¤°VlÕTÆÓå3áÊ;UÞDRË+§ ý¼ž;t[ØqÎ †ºWÜ­§OeÔ_?º¼ ®ËsMAaÿF×úþ”?—â—ÖkFÕµh1j.jMƒ×a8W1ÄUvÁø}þ\îkðòö<€^¸£"®è”Â%UXס²ö;+‰ðΠ}¤C! x…™™í£ ;ÅZ¡XO÷ò"£€ÕæÏ>D;ž×…S—•Â}8ï…^åNE*” ŒYŦ ä¦fŒÝçblcà$.¡xàÙ™±Ÿî´ùÀöy}Z§Ø^’5e†`¿Rz-éhÙ×´%+œª%e+ålŒí}Õ+çv¸¬;Ì÷°¥Ú„~|··QR@³ åˆÑ¿áýÁãpc*Ë­¥²+ÉmÞpÏ”'í±¯NmÙµí•(ò­oµV;”ª†®÷Û§Û¢Œ{Í&HK>By·×èžS÷ú©»0EOH$šdª²Úš¹ùIR­æ–vÌ•4ÎÏÝ:ÏKO°\(°ž÷L—aÑÉ~£ÈÇ~º:r0qczÉüÑ…@yØe^¾ Ÿ¹‡Æ:<5" ©ƒ«–ž4¸ å™·£Ó9Œ¶³ºÒîáÛϦÜU¦ªg>ÊÓµò$£œÇýg˜@°»3®=Ú‚MÂŽ'(µwõÒ>Ôø…j0ÇVèJ 0{XçŽÿöEëñ l'øS›²Ë€zX5º%]½ÊÈ6¹L£Wt0ù³Âz*?ŸCY³˜¸e[³@C Û“oqÝ_ùgw6Û¬®¬d—8LÅA,N3qõæúˆ=1ƒ¯&Œ‰úßsDRëMp"^rõ¿,ÎÙ9 rXk÷W©y @iôkrUøsllZ×ëªõîZ½Î{JÖs<¦8¥ÖQѺ.5L•¶·}- `Äa-•êˆi¢«xÂ?ŸxoXRX¤(ÖñýíHS¹’˜iÜâF¦R¢z̧=£ƒþɃJò‘‚ü2ò@Í- ïþç¬W’ %Po竲"mF…@X!CÑã³Úpœâ`lì …üˆúnÝŽN€«ý‡5n_oddu¾x$˜+q¬ q:åQµN$¹?jkø^@ðb_/L0 ¢QéœpïÊÓÕ-žŒ×ùÑ$rl7÷¯IT. <6¢¡”‰ ýìP‹ðc×ÜÊ™è?Ž/H{V†î ½eé çEÌ5l™ô³ê)·F±,­ÝaÁ2îkW}W‹j¬G3ÍÊÛøN³,§d;Z¶‹Ç'BÅö¹¼œõ c5´)-2˜@Ά—Õù¤¢îÓÀPzÖ6 mÞ§uíe·O®§´B ôAÛ˜¥¾9ö©kç”,B‡P'Ê »·i´¾ØõHɽz\ ÷.…ì‘ä†q¿oN1ºà(èís‡aéØBótÇØi×6Ç”éëmÖ"lÛ蟗释_+i¹$¯“ká”ÐÅv!ÒÙe4zô`%,)Ÿ;³T…УªÉЕéÜ|‰{íþ€ì̹k¯ŸÉƒ°~¬ú€«…C*Wɦ=B±>Vªå7ž|á?cd±)&èqG‚Æ­ºLW“Ìæ•üަº¨Îˆ62mq\Õué±Iðäëű÷ “Í SùÝYë©ØZß «»ÈˆÈôV?z/-wî Rå“õ9~ŽÌd_ê@’¦céË©“/Iœ b"n0~#¯»A\Q‚“^Rúº´ŽlUɃÍÉ­~Ä%Üô‹ÍÖ8ˆÝ7 DJ²6zÎ.ó30f¿ñ’ÑU·æM/ÏÛiij֠«D¯gÉí{Ÿmöc6ƒ¾P°Í¢6i„ØÒsˆcæ‹z³ƒ¶ö ÀmõG•¢[˜aú,‘æ-Â>Ê8ûˆ®¸ãËoUc©•32–GHoÛî>·–gsd“y¹”]$âø2à@~…ÃÙ(súöwú-íçoÉFU¬‰¦4Ö›Òº.JZ¸åÝò¬õ)%Ðgí¬Q­\/èñl¤‘Þf\'áï¥å)y„¨h´˜O&_…·P5\ŒÚÎumÉOz5³™F/oiç±{Úÿ@{QšտР7zë0£¾5á¦ì¶”_ØÖÒmy.!-µpù½WšB܆t€¡¶;ë1¶YÖLŒ²Ù`ÈÆÁ`bZH¡ºÂ²‹Q›Ô*ßxhNâGÈ Q¾7∻©¸ÅÂEf¥îS kÏmKëÜítÑLó Í÷-¡è±º 76aùE¯Y\§j›‡Æø.÷DsíßÓ2˜3 UH4îÛVô"øº§OoîÝmóÎ[wñ€Š5Ö:còD~k–À#um±lV~ì8P™›G·Úg'%/gm1 ôˆ'2Ížuã±ß&²ò©ÍÙ¶m(KYl ÜÞ‡ÉW#~²ºÄG¾þʃG¨{¡»ÇîÑ86µ?íNPúJEºýP3­Ña Ût€ì¡7¹åÉîIðEÈ©Ž½­Ë³•Pm-ªeÙÅR—W¹*dûþÕæhæJÁoel-ÙA;WÎèè©ôòh¯ý(£U­®Kûø“dŠjV9rZ«dh†Ü—²R r ¢ M°R6J÷Y&)-½ãSU”ÀÎ ¼wŽÖé ëýÌÅ[ªè»L6³¹_Dz Tm£\vÔØS&u\¾JWÕiNœ Rdüti%òjHíõ—(.q…6Õ#¥­¢·íܦ±ôÕ€v7Ç^á°º“Ÿ>¢!@$êÃ`¦¹ôM¸’u¼óɨ/{¡˜Ÿ°Ü¶sb¢Ñ©‹zýApØúõT}ÛþÐ=ñh«ÝlzÑuÉÒÄ(Ñ­&¾~Áâ!Κ+}ê“!Û¶J5›weî&ZwŸS R«ß2^÷yØÅÍQë¶0¦ç!ýöP‘ó;“:[ž’±ãÅ6fUп«Ÿž¬Z¿_ÏI°?Cñ™c6&ÿ>‚…ÉŒT‘©]äIÂOHJ"ÕÍ; ·MÁÄKS…÷ÓöµÊʨºä¡;ÇÎ[ÑQœåøM¡¾ Æ/y™_L­iy8JŽ åŠ}ƒ%¿[Çq¿âq^  ÖÇæB ¢5à ŸÌ{ßÈ~—o?š‚ysÀq$ÎþÉ| ¶%ºY¼ÛÚÇžRሻʸÃ2›Üpî9Èÿ\ó@.Ê æžrØHq‹º„­I˜©N<»ÖŸù£ßwFö-…ÐÀâ—hêŒtxVÃ䚺̛Þ+ê§MGU»±¤c(×tw.O9A±“akì1Ȱ’,’®ÉQmé٤ꭅJ·u=#°Ø1¤ùÚæµ˜ÑT~'ݾçŸXåDcºM‹úÊ‚Àdd%ß½™ú5?Ž]¯„WD²<ë¯ðkŠ×}é >È–ÛéÑs°’Ñ¿ ä¯ýØê©½*‹ÆÝaÞPK¸ÒMêH~¯rmxñ#UóÝh°[§›°þ£ó÷Ku~u' –.(ó7Ž•¼Ñ¥ÑÀa}[µõço4stIÉ,¥<~ç°¢Õ/sd«‚· 餸PvÒ‹«¡q÷oݱ}]¦y¶w˜n/S—¹ˆ\½w–¾ÜJ£@'w° »ÊãôœeàÔ 3÷õ¡–Z<+7§óÀ´ƒß•žð5˜Vi!}MQˆÌFŒ]Í–é_Eš/“€÷ÇÁŸ3;ÚFÌꦟÜïêŸÅ%ÄLÓ/”—+4…¿(O×'?îîôYà ¤a¬µšó[y§OÔfž™Ÿ+Éï—, ³öœÇ9+, ‡¯4”AäÄAÎËhcŸºzNÆWöËy°’\i‡d~t[q×j©SJ0w–lô…y4¾ûGõŸ5È*…Ó*ÝZ£¿@(•owÞ}¼ÐÑp6Òj³•ÉÜ&3æ`ŠéþnàÔ2i-<Ù{€" .yLA5mh]vþù„”FÍl§ÐÛy¼o¤µç®g{„cÏ™_×5ÝVó»Nq&¦þ€§Ö2ÒwzU÷äîÚˆê Kv°Ñ€y†šý2|´[ìøÝ· «CmIŒ )¤Gí*¼›@z“pþi9Ù]§Ò˜Í›å+µ/}?=ãÄm´çèÒ’µx×u'»öGS3jõ„"¨9„4§wE)ùô>o^|²š¢¥™Z›±²½D•îå0¡+<3Md*I^1 έ} ü¢¸^:ÈÎØŒO¸©9tUk¼ôû³NùW¸ò"—ËW¬c‘!:o÷íûËŠ}ÄVXÀä1§¾ðC^gïŒðÞõ·,œ÷A<½)åÚšë;G57º?Ú0'½è.í+(êºò>²Ã¼ä†lS¯wúS oz©A„\—©Ê‰ùèq5g[12¹’ó8äu^O\%˜qÆwøÁJjô| ÀÄUzo¦:ÈØ5»Í6®!÷Â7{ý™fh&â/—QÔ~¶Ó-$þj¯ ÏÅÌ£QCWD¬$°w/2æËëpíã¢C ¾¸Óy‘ ÎØ pÛPõÌ×[}’þ¥.e\É3­í𤠓™;·7wZœ&scþm‡ 7£°ì,aÜÖá£?'¡3ëý,ÚžnóYß§ÄúæÕ©QÎXÞ뾂މG«5b÷ݧí¾\ÙæeF\·u7Œ »IVSÇóZEKZU©Ž ×-Æps¸Æt½„øtO(α|c0“fR¥™°]»¤}Ëüí ]—fÓÈÆô*oà”7#ÍÕrõaH9tº4ˆlâaÆØ³Â)€EÀéUQú“É~©eʘùBDÿÔ†WߊŸEÃß)"†ëS•ò¥äÎx©XeG½íÄ\a>“R&àH fªš‡h\¦êI÷Ïl+©©ì8×^¦´¾†}^(‘3Ñ_)¸ä1ÖtRO´% ͽ¼`û3å•À³$YïÈ’Û14k ý‚ü•ÜM·¯WúÊ÷ ?A?öÛ駈WÈ*«åF«©"}ÝÆØîîäô»"_•WhOÝr~5P ¡Ü žŒY`bx…ÿs<ødtZLS25yu+Záô3Ô˲gÌ?ŽžŽÑTqºŽö;¦&Û¬·ƒ¬µËù$«… ¦µ‰1›,À¡„öûcäü¡G^á»]So!aªEgÐ $V¨ ›å<¸›ê,{\‰NÒaõ(Y´»BÇ@ìþ†Âb؃¢X›°¯«<)MG?ÒdüôA»Àêòé+‹zŠ” ZL‰ã"µ “Q)¹¼Ô[Ê8ƒÜÇ‹¡)!‡K¶†MÝ?ׯñÌR›|l¦U«ÎÈÕi¼ [F±ÿ¤†ä’Ä/ðê‘Ý!r9±›crOçÉ~`!ÆÉµÎ—˜õ˜Å\éä, $¥SW9ï2„l²ˆt0Å@‹Ñ7º,Ñ-—ÂUšûá\l*º+—ù$)nM…•yŒ3:Š÷m¦YÕzT4¹u¶r}%ˆ_2›FÀÊÙ;¸;›g) „r©ñÐ]×^ç{1J³TKéuNRå¶("ûìý׬ÆâîÅbŸ¬Ö#¬¿ûO·¦ÚzO‰L µ¥ÞDêåÌÊ5èG´3&T 2U:5Š<S… ½$nÿ‘™½ÍRåú0­ýc× c—ðsëÝЭ6Ý(W/Ö¥–u•G?\÷\!Rêjt¼åÒo¼Ü’[ÎÒë%·Å ³8y æØ+KÎ .¼d5©e¼  Øò¸— òù´*–šŸ}+@"Öní‘uî¢JOköÉl§ö/63BRý££¦ÄÁ­I”¹g÷ò\š¥IDe4=Õ–ÅæÀºR.ÙË,°­Î—qÇlQ>‘Uo¹æ ü#ÍÙgÛfs »WC”íšùˆß‘EÃÔ7;y­÷e¡ª?n¸b©Šóy&W_Ù¾CS˜Ö$!óJBM›“Á3dªÁÔËk˜‡r>=^éX¡!×(Ú÷ôX\ÿŒ@zr?dÿ$Uêq &žölÑù~Ò¾FÕ=¹ÝXžvÍ „ÍtùJXˆ¡º÷óLssi[¾ï'CÚPºSÆ£âG°D^ΔÝe `]¨‘£XΔóvö»B‰Î1±9èšääxÅf ÞÌé ‡š;”óÎÛ|ªlʼ.u¼²ü뾩÷ß[AKl.väÅÓ‡ ¯ÿð¡'éÿ,™µŸÌ[(³´ñ¯éx§]Gú†Ù ɪ…¦RJª,—îýª¸à‹Ý¹^_U®LmLOõõäÏ×@mm!u¾Û0+£J–ä8 bCJÍ{#9rC„dù€ÛÜTÜMµhÄ3XNlæzVvbô\BŸ‹M&iÅ-çIwMæÛuS'=Ù—\v‡;[Séá® ÷ýü—Àð[U²L÷¨ƒ¢&ÞäbûìÞÏm¨G¿qxÞ ÖŸ¸kw—€®Z­EÓy{×ËÀ„0ø(WcßBÁŽÎô ‚jÙWªJ‘É9"¾©Üb£ˆUsˇ$ÌÚåÓ6ÌBmÞº¡f€ÙÞWï]V‰è²^›{gB_ª/y$µ‚f&6úªÆŽ·#µ­HTºLÜ\—N;-aìôe‰·?L'‰‘y/Rüóá” ŠÙÁ¬ï&º—ü†ú¼ºZ”ñø Ý’\t¦¾„ ­ð~ÞqÏ0Û亗¯«ìj˜?çFS Êéä«b`){†¦\X¢Ÿ`óE7JJ±&˜‰tZ0õÒ1;>&š»pú ÉC3»ÔšŒ Hºe1SfQì »#È5„z©×9<]ÂïéT~ü²F\-¸Â]òšÅ&¦Í÷KH‹Ä0zUŽ*1GìLFÙ? ¢#Ľ޽ Þ}Ó¯#jfðÈÎ(ör›A‰J«aûº¹Êóãã´i~ÚãroÑÛ_·,^òx„ñÐ*‰ÙðËÛÍJñŽãéÛj‡ðJBYÚŠ|E²†7Ž¥›ÆqÆiÆ^©öé7…¸Ü(7 •ØŠLÒ¹Ëkî¢{d×,«SU×ï"ÒEÔƒŒˆË≋ÃéˆÞœ?<¸ýNÑÓì×¥ùç6„ïïí?&fííJŸ­ŠêxPRwuÇTñm—åË[üÖWô4peS/Uò)pÏŠºr»9¼ß€ò¶kIͦ LH ö¯‰ö4…ZãÏBRXT%Ì¡WÎb¦ä[´gEs^0ˆôIHé^7›ôŽQß?;-k‘5Ì«’HÝQi 4~Qƒ#aÅ‘Bb•8ýÖá9—CÍF›Ó„‹±ÎÏ Ñ%?{º‚)åéh¼¯ôHÒ”Ì3à~·1üú¹B~ T;ô› “Oâù*x8µxhµ5/KK—wþùX¶4k‡õÎIÐø"G…]r¨†ì)ÁWžHÊý`àm›Ê,»õ¯ÇZÍbÕxý][¤ˆ£ª6Œd-ñ½{\·8ŒŠý˜˜äèu휫/ƒšöµ0R–àkº%x ³B›æ-Tú:Óß9qføf:ã¥]ƒ/‡½Ï’Ÿ™Ñ}æ»iÄÊ;)â'Ú±/Þ\ q˜žˆ)> zA1Ô—#·tUˆ Y6ˆÚU™Pا5{ì“3!h0Eø”<Ó£Û(xÕPÛ£Þ­Éå”´bZ„õ¬£Xëë·®¬ZüGæ/ endstream endobj 42 0 obj << /Length1 2356 /Length2 17046 /Length3 0 /Length 18426 /Filter /FlateDecode >> stream xÚŒ·pœ ß7ÛjœmÛ¶ÓXÛFc£±šÆvcÛl’Æ6šÆÎ›sÎýœö~¾oæ}ggv¯ßß¾fɉ•Té…Míöv.ôÌ L<Qy.+ 9¹š¥‹ ð*¹ÐÉÙÒގ羨ÐÈå&fäò.&ooqµ0³˜9x˜9y˜˜,LLÜÿ#hïÄ3r³4È3dìí€Îpä¢öžN–æ.ï^þç@eB `æææ¤û[ l t²41²È¹Xmß=šÙTíM,.žÿe‚ŠÏÂÅŇ‘ÑÝÝÁÈÖ™ÁÞÉ\€šànébP:Ü€¦€¿Ò(ÙÿNŒŽ faéüYÕÞÌÅÝÈ x'ØXšíœß\íLN€wßUi9€¢Ðîa¹èÿ) €™ù_sÿÑþË¥ÝßÊF&&ö¶Fvž–væ3K @QBŽÁÅÃ…`dgú— ‘³ý»¾‘›‘¥‘ñ»Àß$„•Fïùý';g'KggK›¿2düËÌ{‘ÅíLEímmv.ÎpÅ'fé4y¯º'ãßmµ¶³w·óþçÙÌÒÎÔì¯L]Õí,]Òbÿ‘x'Áý¦™]ìLLLœÜÌ #èabÁø—q5OàßÌ¿Éïñûz;Ø;ÌÞSúZšßà¼Ü€'W ¯÷ŸŒÿFpÌÌSK€1ÐÜÒî·õw2ÐìüÞy'K€Óûà1˜þúüû¤÷>[¦öv6ž¿Åÿn.£Š†„¼¤íß ÿ˱÷xÓ³rèYØ™ÌLœLÎ÷ßÿ¶¢ddùŸ(˜~ëJÛ™Ù¸ÿ ö½Jÿ°ÛºOõŸÅ ü·-û÷‰¨~¸.;“Éûóÿó˜ÿ­òÿ7ÝYù¿ øÿŽGÂÕÆæo.Õ_ìÿ×ÈÖÒÆó?ü÷yuuyŸ}yû÷ °ûߢšÀÖUhjéjû¿¹Ò.Fï; lgnóo-%,=€¦J–.&ÿŒÊ?tõ¿ÌÆÒ¨dïlù×AÐ331ý/ÞûV™X¿ ç÷yü›|_šÿv)ngboú×v±°sŒœœŒ<áÞ[üŽØÞÌïkh ôø{‚Œ vö.ï*€÷ô|föNpõ“ƒÀ(òéÄ `ý¸Œb¿7€Qü_ÄÉ `”üXŒR¿;€Qö7z÷ ÷½{ÿq1•~£w+*¿+€Qõ7b0ªýFï‘iýFï‘}üq¿{0ú1¿óŒLÞú›ÿ®kü½çaìddb |?ûf.¿é¬ÿÒÿ™ßïMþEìïÆLìmÞ»÷?6¶¿(¶¶„ðÞVFÓ?à»Ëßápü…]ßÇþ·À{Ì~Ãwƒff–¿ñ_Ü?à{ f*¿có?à»¶ÅïàÞ;cáé`´ûCâö‡9¦÷vYýß«iý|Ï÷OgïŰý ™ßýÃòû‘c´ÿíû]öýøû=‡ßìw]‡÷·Ýµù?ÔÿnÛ{ï§ÃþwYÙÞóv°quþÃþ;ÅñwÿB®@ç¿WíßfrüE´wþ—SVîÿPÿÛ)ó_pú¾î·;¶÷B9Û9[ü!ðný·úûåct±pþ®ÀûN3º¸Ûÿ¡ðnÃõø^l·?à{XîŒÁ»¶Çðݼçð½¸^¿ƒ{·ätúÇÕÝW§÷êºü}ßßËÿà¿_Õ@ ÐniÁÞ„7ت.¸ý¾FÏ~o’Ž|O3šÞ{É©Ãõ :™º:ëÓ†Ó­pòH/ÊêŽ8ÕÐ2Ñ‹÷IKtXëgå¶'Ÿgƒ•™½6¸ÓXƒS'Âõ°øôjBû>/Ž>Öà- ]2乎®\HJyè÷îý’õe+ã¡ {ÊûÕ²ðÏe³ô1êѺÅßÉ¿gÏc“@¹ÐÀР]x ¿¹Cû2õF$“@ ç{ÃZè­½Éû0ïµV¡ÆâÜC†£M~ƒ6>Cá-r˜"óaÑ»¤pÃi­Ã™ƒw?¹W)5 ;µ¡¹Ò×Í£®[ÚM&’µÿ#HÎéh¹Ô%Üÿê™_Y#Q:æA¶Ô¶“ ¯,Ï8•G‚£ÒÈSÒ›\:ÞåÐDŒê½4¥³ñ:^[þ¢Ÿ*”R¸C2–‚‰"fsU¥ðDñÍM­HÆàN µšEBÑ”¾(*²X 6•ÊŽg2]·35­ÔFïŽ-H/ÍÁ©¬’°qr…˜6^.Jã«eI(ôí¾äîÏÆC¦›ˆú–§d•Í­×ñ–¸F(ÀÛ$çܦþõ­ j_·jÖ]-¸HDy·{ðrI…‹ÎÅt³EŒ~†Ów$™§à2(ñŠ,¬\Ëñ–P€hz=iÉO&»fœ»ßŠÆ/Y'p–ó}ÕH¯ƒˆ¥}BW°˜Xõh\pÁ˜KÞæF ìørCóî”~üŠ-×rØ&æ÷JÛµÇn ܵc™^˜ä(ŸÊîQƒ>/ኩŒsÆçAÕ8a?žŽ5`Ëe·õ[šûC¹¾‡µñQËWv‡D‡îðÁ€Ùn@Ä”ðޤ$à'"Wú*š2ëi«NbÚ*™M°Õ|o¥&Hó•ÈT*94g™®³a6ß–¸™<Ê@ú¹žç€˜ªÒä{íÝX̧ƒŠ‰Ïn)£ø±L`bžM+M»?€ìôv™=ñ''è¦_ 6ô¡v~éròÔYr½zˆXÏŒ­ ëdÃii0%ÌéNxg~Ëv ºÊ­Êž¿ä‹CާØ|©)7o‡49,ˆ¼;f÷öÃÞεY4Ü~ÌØf‰#ys*UÐÈm@˜àwjˆÓVAÞv!yôñü3… ÉN­›81Käc{Dp;D¥ª%Õö^U­1Hë“Ûè8ó!s—¬ž¾+ôZu}Á„‹Ñ‘3–Èæœ±_œw·¤gê ‡}¶­±7†V…&#Ö d®<ÍP*eK!‘–âê­(mó_'Q¾ð¶o7Î3褨M[ Å·_Çãv(@|ëkëLh݃«æ²êô‘ž[9M%·o›{.ÍP´ã»T1'MákOÃË™FaI ’¡ »òYšé‘Ìú\|8–u‚±iͽ\·„qôÌÃE})a榥£7fuoáÖŒ¿çóÍ^<^ ¡žxÍoå·à7¾NÌ•âª{¾¨95ÇFü2xNfa+90â˜u.I ;À"†ú®˜ ·\Œ&[¯×ݾrp"‹wgO*ÑEs° Ï ÿhÇìZà`ªs>vfcÝIl£rºëvÅmà‚Ö~h@H† ¥¡óó ê³”öKÎlõ““®ûÍ×öDWòsƒº D}øVpþü]„CŒäïÙᢡfiäô‹+M]õ*íÛ‘Êà`“È.B×cCý|-a¢N ÏØ›ç^ùû»ŸÅfBÒ¨Ðo¾ÕÇ<Ø0âS ‚â!7æXü¨W=ˇÆ·L$!Ó5ŽjŠ zrPºpÂã™÷3P³ýòŸoäc“Cìˉ¾xȵvFEÌú¹ŽêµÌÌ, ‚bpO3Œ” Í5fàE 1Ú߃æH“áéä­~¤“ D+ì^`ÉXB >É}n-­úÐUØ0àçåÍÑUäoû9 ZëVB#2éVT\ÑC&ôÎJ¶(Ø‚Gk¤ü+þütXWcÐAÔòQŠ÷Ž+tbTˆI>ÍoÉPpÙxocÄF£âÕçnU¨ †5ßêDØl›û[§Æ³ñõ×zX4.0µ§Ó:+l6â#öÖ´]`ÝS¤¶Ûwm: FÑl(„ œ6ØÚ™æ€dÔƒÛÛŠMºßÑùàRx»“\˜¯#ŒÚ…›­•èÂ^¹±|?yÎÖYO_Ø-l¿†â †åäþÁçå2dÂJRŸOÛ;z¶ zº±_Yðf!·šH1åßbœ›µˆc8éã‚å‘)ÏÑ_¾Ä-o0 Ò]µ:{Œ|“VÍO…ÈìϺGÓx#Ñ?³âÜcÍuÓ€JO§‚ÈSÓ?—½¥Ï³Œþ5ò3c.‘a‹×Ô›z~ËFÄâ -[Åaœ«:,rçOµÄôp…Û#\Z™´l·V阻8·Šúí̵…jn1b!ú©ñýýÐDÑ+ˆ×dißÎhÍl®w=p¾îsöTóoã0«rà]8a>Êã…yØ67˜ôÞSó'´ÒCD‹ÖÇV‰Ð{`Ypü![ œßØ]Å*ô)w6`_¬€ŽX÷‡Ð=7Å5íTè`:æ>/)‹»š‘{ôRÙ’À€‚ŠÀS;9~tÄqÕ›,—"0ZêÁ.pàÌýœWÉS«°¤,Œi Ú~:?ÿ1ùWàOek*Ìé^ƒ;Õ|Æá±;.£ÏÃä”öËn$ê,±Ä§ÅÖìÊ‚qW_˨÷#“Í)d¾’c |£ÛZ±RÕäe>•pœ§>¦YÑÊ ‰³,³ »T5SHBOõvÔÆ‡­¦Ú4…¸·³!hö~!‘í»Î}È€]`sYQû‡ü;ãM˗ͨŒ`ÓcÀ)”„ª¯Þ_ÚÉX(lÒJ3R*Ü£ËFÀ«0çÝEÄövöõ‚ý¦b·[®ºg‰ŸXƒ¾3Û× Tv뉫ÐñÓ®j:8 ¥Ê#RO爋¨o ¢=ö9NÀÊK†Dÿ¯íX^í/m1Áë=¹‘(’öÑÀ;8ñØE1:a²SÀÔUÚ÷‡ã3ä÷Öô àl#÷öe ÁHp¯òåVKLE4á2’ÒÙb•×[朢ì«nn;3ƒ¤Ê Ø\M¬íÇç?joÏÁ‚:5p‘É.ÇtJï–¹Îùšdí:,âYGJ[VSÊ,u*gtb<* HÚ‹HÏøt³7¯iLT£G­ƒºhef7æ`ˆ²çR™Î;©¿}ËÅsLç^WÇÿ.ƒ,Ä¢£Y%Öê-6À¹ÚFÀÝs‹G)°žs7½÷DÊ|=Ål•Ê3cG{)™G·80E—Œ¹‡îoãüÊÚ¾öIBúMMj3N ?Ä0ä6Ã-«3ù¤tŸ|ŽÁhßT64.¢ÒS^äÁޏCÕÕÚÓ„½vEÌ n¡x’ wänc$XÙ‘b¡¤u¸{®©UÛ„Õšb®}I&7ÍvñJçG·Îça ŸI=‚,töÝq8n™Æá˜Âá›ù…98¦J¤ù/æ—»8=pøîv[]ÞGíÊÂMvàÅ¥-’查¥R¢õ Åj®ìý4²ßšöÚÙx¨Â`ÆtwÔ >A;óuÕç6o¦ô)´nÂÉF8C<¢¬5h¤ÏP£€°ÕusØ"¸/co¬N7XÀ‘FD}cpVûÐÇV5ã"ô|Xèš‘·oøqã;ÖpÛ¨ðÛVÀ•]~¿ãVEw\•äøÏÎ)º Û:°ñâãfnä¹çN©P\áÔyìàÌu¥÷ÎtUnŒ ÆÜ˜B>ƒÒ­Úçu›É/ðfæ9¼Ò¯=É‚y$é+"s sbžÓur§òpâktl&E =>Gp¸¾ HáH{ü5˜Æ²ç,Ïç`í‘Oú{çúšwêœUÊ~@LÒsq™q3FvP–b«Ìõ!¤†ïvB`Èß3¤)0M}Z“ißš±~èH«B U¶*`Ùõ&cÿß"NdpbE@k Âq†¥ +qUp1n0ï r½Ï9¾&»?NÕßW#‹“6ñ éñ*Ðm †k7lÍzkµôñpö—Ñ3_?§ö¥oÚPVÃQŽžIJÑ ñ‚•_YŒ /бVAZ³ã¢¥xëptۗɸ‡'mŽù"ñkμzÑ=ZÙ„ïÇŸk·Öü$L!Ì˘a$'[÷ÉoÁA&K’¾®L­ï¬1{n×X߃*Çtïµ<Û/«¨Íwd–èQ6Ëe†Øh‹JæÖMþy,ÔÛžy@¶¼G5Žß¨/N1]ÿBÞ\K…`&ã1¾£OŸÙ@™\_vÑ„¨h`™ˆ 5 nÇ Ê;ÿˆ†´ªÝüõúE?hnÆ<Ä´V{ŽqÇçëõœÆT‡šÖ.™AfV?sú“ú¤ä¢ä–ÇÐ!#XI]cQµÄÝ=dI=MBLõ‡·ÈK¤‹Ù/òlQÄ[‰®aWºžaßÈv–ÕŒ¹öÆB.ÏÀo³\ÝÄ]brÚ¤6ľŸ®âËá·^rZ@£ŸC¬~„…f…cSÒU,öè‘c-0Jxc, ä íT˜TÇ!OÝx(Œ7»n'ÿ@¼%T;¿‰ç/måÐh¤§½ÕAE_èà'šÅïNž-œ¦< é8/Xƒøß±YË´]1V©*–MÙ}”Ñ%±ÆÝ;÷òfþZ‰“ôí2k2\æYö|)Ñ‚ª3Ï®Ó]}¡0Ì6BfeÐÙ!YºÎPý1¶òÙXç¢EfŸ«8û‚“†„‚$`r2»í>†‚ì—·äÃyQœ ¡MÊ—¾2ê h^ ·Py$ìVèûî¾ÝÛ$UUñ|$9û ëC†—ðþ…¼ !CP”YÕŒhî`þØMCʯšÐᙩ(¬ÔÆd“¬Lÿ5ËŽø!;„ëHÐNÐÎŽsš›×p/ *ªœÉ¾§2ðtÃó *T¨¶²Y«ÑÈTfÑ‘Œ’ i´ìx c—'§0+0“TMÇÎ;—AiK">GÓ­¹üîç·( «˜ÌƒA´Be»A†¾E³v´Öý-°§s²™ˆÓ´ÏέδTO â•ÉÃÌ´¡òŸÏüjÈ÷(íËãÆ¼UifÉÅ*qè&ë;ÕwÑ–”{ÂðŠ¬ ’$xÆë×âÍp!`u¬ziŽ=/¶î!âqQLE}À:2syu#‘ÀRâú郑H îå§عBË/â!…zçnv }'Àþ´õÍA°Qî/¼œ!-EçM/lSGfÁûÓ–´R¹™ÈÔ” ו•¶ŒhAÔ$°ìF{i&ê»s—H¿ï>rãV.¢Z8aMëŒogÔZ`ûñ•7Íuü—FbhEýö#DÞ¢nŽÁïýÒc Ñé¶ôƒBW`s+£qγ:], í°Ñ øq¢KÆ)i´ù–ûþm™y´#Ñ÷åËv¨®¾›Ù_¢«.¢Ï­lÚ1’’ľñ€çÀøF,µ¬Ò0G² ns—Ž8±Ï^TæSõü¦k¬>¢~j©Ô9¨Ý­ÄáÛ¤š;+uxhµÑQÀtíQå¯vÛ3G:9¼½¤<Š_-hp•)Ú½,jæ°½0¼dw™Æ=¢ëÆá7vÕܵ¿^·Ã*½aâ(ÚT„‡ïõH+W£O¯Qÿ°ZY3 sâÚüDáôf\†ŸÆOþ m—µªÄ·Ð×c“WyE¢zx«Ï#ëæöýA˜Wz}v‰¿1¸ (Yâ»Ø¿´tj4+—2E&˜4Fï‚ ¿û’ÅU™–è±1óA<ÛNß!ˡփÌBƒ8ìªÔ©¯ì8ägØÕ-¬ É{ÃØ`a!ù)AZ°.›U)÷&N#rd[Š¿êŸ·fB7RcA÷…Ԭ̓ü•–pCŽ-7Ùóé¨K&†46õJÕ¹96„vúÚªŒ¼cpxkáiñ°ÏÉqï‹LMv`W|ݧäžÀ]¤Ñ;œ=è;©ÓÔª@ÃU(TUŸäJ#LbNÛmŠ7Yî 6o¿‰jJñ¤6»·Ek"Ü潑vªÈ¾gãr™ìN̾Z‡Ùm‚¼SRCÕJŠ4âläsÊžè €@ZæР‹QßõÀÞ‰I]Õ4Yq¡ŠQòPÊ$ß¡wׯÎÈ5Ä®J#*¢b[31Cg÷[<ψÃy™°Š­ J‰š’©¸ëV·ŸMa‰‹“˜xãâRu@û£®Hí·Mcõ²º¡ø½è©ËßÊM î‹Ì5m|ì`äæë`íHĉKÍfêúÙPâ½!Í'Ža´lýú9¹ïú´Ã¡^ ,xö?—¬é´kŠë••È~V$xŠÎ^?¯AæÌ&œôiZØ«°{ ®¥»åö7k¿ Q6œÓvÛz¦±ï ò8äÌb\Á8¶©zNÀ±lÂ|}õášhPpá ŠÎ}½çŸ¬¿ˆ[¾±?ééúH[&;¸’)Ñ7àâÕÏØä¥bàÿ çE—cÓÇÍÚKѯ‹PŽóæùÔOÑ\¡ ÷5¬Á6ßMë½õÄU”å\º*éÊïË5®yPz¢3ÿ= •Þr{ñm.‰Šr÷Q±ª#³GÄxÝÁ³ÙH¸Žä§N= ¢‰dTë/i­ìâÏ%”Ï^±¶©éz•«¶j}ÞSŸ,Ò™ýûµ#Ò¨ «Ñ^ܲ\»q y¾ZOçaãd²ùÛã\ô(½ù}ÏC(?¬ýbûu·V¿ö:ƽæÅ˜ë‡çQŸÿá±z2Z?¨ðåÐ7g¡3§Ö±dv{ß'Ãðì*—º Ÿ0¢¦ÚMeÅÌBr‰ªwý9˜ØHÛ(8>ßÔ³qoTϽÞLl¢íhIV)ª¿©Vkq—æPfPHD“^¨Om iD_wô8A<¨×]Š3FµÊ&ÆQ®sº@¼ Œ·bnöíê ²ç7“Æ›Vˆ|p¶D)_ô§d®ÐÈÊš^¶yÂY¢P}í±ò1ŽBG€/ð{X…ý¬Çá­Ù¤ºßvAq`÷õ˜‹ç¦+ž'´%@¾SÚZæo®ã™Þ¤[ZŒA¬Þˆ½oû‰¸î;]‡á¿¸ÖŸÚ\›ñ2 üëÝÝÌʬA …øCÄŸl¬’]§#dÁÖȸjÏ™eo›IT^3…Œ­Ï“¥@š[l’Âi¨¹é€=ð ‰ÞÜBXè 7Ûý°I aL(²[©@‘]žmà{Û­”hênÕåáû3vûcQ·qÙ€aØP9]ïªüØÀ›ŒCŽvº¼c˜þmS…k¤M†FåÄ×Ú©i¢ÄÕÖïeñ1¤ ì„•žo¬¢›R…sx¤æ×7;dÃ\(u ®ßÜcÌ&Ж„êIì0–OûWÐ\›Á<©h6©ø  ±y¶è‹I\X;4½©á´©ÉVsÍnÝêìõïH±IÅ!ÒOJFNÚ0Á}è$:^¿«Ð¢î‹R(œ°õÍ“çÛ« Ä1Õï^ôAmúýTñ¢ì´@VëSå!ŽªcLXUïS ̲ÒMyóEEaŸ§œ#}ë‡I=õOI[ôÔq˸¡9m ’z;tê6ª|,Ùq.Á"|)bOqG2¯úÉuM~ Ïwqð¾Þ|3`\-£™±Îp˜]Ь¨Ä6¯åý@ ÒÏ3Ž\4Õ‹zË£Žø&gÅ–™µœÐµŽSõâ£i"¦ÖòhºsŠQe>ùO*¾Zš¼/ÜkIrän¦×Í'yEaÌÁ­HMÔ݈J©M£ŽŒ jZ¼a„À˜×`äD5†„ûîÖU(#}¯0û Eë#e5*„‹cˆ6ƒ\,Œ¾Õí‹¶+zcQø i1Òª½{F;+¤sOIŸ:ÍPÜÏÏñÊ‚\j`3ÖW>`n^È,6ÙcY¬ØãêŽÏPþ‚‰ƒôÕ(â™;ŒXòé%\ ²n?:æ‘J£H¹I–õq΂TTó ±Ñê_<qt­eÛ8\á–&•ÇyÉBæZLZs^õÆa$m9žH/íºÄõNDü®H@õ"·ÕYš¥é-1ú…ÿ´¶ ä®ôeGÆýûÜmzlÙËr¬-a·¨¬yê]C䯇¾J{±é ¦”­?×QÝ祒~X‚ ­C»1v†™í Ïfáü;]_?×!î¥YÍ3IHäÃ!ñŒB' yE ‘ëu÷awb†•ÂWôƒC¿æÀ)™‰ÈôG@Œ~‚¬+U|,Xš¸¯œ"ý„=¢A÷þï€õÛT]©;ät©hÃO4 Û¥²üœ%‘Ëcä·—ë=Ž(­#Þð„v„ 5ØaŒ“Íj©¯Z„ð…vsGMusgª Y ³kaØy…NkZ§~í5"U¤–‹•‘ ëé&4Ýþ]l±r¿àpê•åàGøÔ’›i&"üN‹ëqUõ^3¥U°ËM%¬Ó•ëÂr5½àý½Å‘qøcôb¦¨¬5?òAÁòæjz‡8ƾÇDCÙA.NËaÐaï Sí—ÍG—Â÷Æè GÚe0Š@‚/¬}tC…âž§™îaÝô‘Ô6¥Õ¯}ÌÁ Ÿ#ì‹Zd ¦¹ÎÓ.Gù<ÚZ‘ï˜D9c= |{¯¾œƒaÈV21­+±øåævJwmãÔ=huÔR&ÐÊ3ÓÛ_ÚØ.…{bè“eü9¶i1Ù8óþSý ‘¢‡[±˜§Ìeä|’ÉL_\å³ÅçŠu¿€&ö3÷S ÚQrŽLÑÆL0¯Ë’&UuÛ÷dÛ,eð#’À$5? žIñ«¦`2ϹYTý°»Ï×>ºîG ‚´dî^îš·_á¾¼ŠÎô!ƬH`ÍßðšlÛyÌUL¥K:bMìô`„Ø~âÛ©S4:¦_Bà ¾Ø]ý`€úÈÕ@Ê¥ÍïLší5=D§?®ÿ¨ C6¸«e€ÑuÅfö¡•àCÞR7ô[&ì"4¦C6wG|¤“'^˜ dzÇP'LkGtgq¥4À¨÷+6—Ù}¦‡Î®â>£>‰NÑ© “'ï.ºÉ^ySeFe:úGû!ým%øÓl‘}ÿjˆ'º”ï}²9¸˜jq³(^>BõQ"áiãuRÜö²Šá)½>0èK vû£tDÞ>VÆÛúàØ:Mûgëý°åÅ› w<ÛGâž[7*ký¿|…[ S¿¾ÿv×»/ô³\qÝz’Þ_hŸ2©šEë"wu ž!¡æÓ×­9—Wd€J ¤E2¯"~XŠdš{íÌp4NðöbœZÑhmÔ 7ûE;<ÒÎUw²àë7šÊ£|¦G„ªj¸D_Ý;°÷:0YÓö@a²—M‡Ú”èæåüÔ¹hßɱ(½·FhX†ß*1>Ù”åþ½3»–ÀëNµÛÑå@{,³Éõ!^bOR‚PZyFæ~ŠŠ3»ºrPŽÚxZ‡tš`â<ìt.ö"mcÎÊÏ}ÒŒéìgòSòã‚üÝ$ÆHuîG!-åýfâ.…SÇŸ}v8f^s¬a­yñÛ=ƒ/׬;Î@ݧ1ÐÅÖ`­•Y}™‡\%•¡„Æõ¦”üÐɪ“Ïþ˜v¤JÞ¯Øs¹lžH 1êô¥MÖ5cœWHRêC2 Wk ËÄk^ qG´àâ{sò£ŠNÄѽxiQ\ÚX®sVz¨[“ê<Ð¥!m~²”’ÛT¯Æ¹ð럟˜5¨~Úæ“[_'H0iø#|I²ú®ÞµIrÏQ°ò,øãþÛêX½±MÜÓ®]˜àÕö-ÐpOâëSß!0ëð8Tœ\’æ•b…5Ü—uUƒ°º““¼HÀv—hQelR–”AÙòž¤(‘#&…âØb}É [3j|`wI+9¤Zúõˆ€‰'Wt Å[5QŬ<‰ÓêÉéö‹`Ìq„édy•VÁÏÿu$ŽŠ!£ çBÔŠ9UÑ̲ë†þFí¬øÁœ÷‘ 섹b £è'ÍxñÊ“3ɲ\1ßh:Œ4å’ì…§6±ÐÓ·T¢Ž,¿øî@_Nýáþ!%ɉZÁ‰C “.î±2é×ýñ_ܯz€’ü#²$ g‘%MÍE}CîR"E•¯‰6'ãÔçìx;^l1Ü» óÌ­mMÚ•´ÐN`=¿uGàó“†ò+Éo,J ÇÄ­•pvEª>X…ªÂõ3Ÿ~sdTï3‡qdëË-%7dÖ"úް׸ ˆsføõ3ãOÐ6‰…+LpÞ*kžK½Äa‰é•1B3ÿaÌSü 2u„>ÈrmÛÚrýnH¶8yA—yã‚>¥Ê³»±/Ø-˜X±ßTÙNw=¨ÓØnc}C‚xFc®z[ÑIô~Êšðê 5†öœL@ù<¥áO³gòº9Ú©hpüÁæA\—ØR¼øVbHdð3³.?¥ÔfRPõ©û„eiéŒyÞ=ÒwŽ¯ÖŽßÑFYÁ9ÍÄã»Lœ1Åõ³³­F*aêO'yð‡KøàŸù܆Bæ‚Ý…°º³¡+:K2&wdŽ{¹´Ä®•X¢ò£'à¿¢Kf:_òzr¶'ܺ´°ä8À -È}õ–luf÷ÔWG,ÿœ6½Œt=÷³Ä”XÊôc3b+§§H´q‘kÓKvòþZ¸={Í’h­ÓB@ZŸûil#¬ÞÇzŽû`¢íÚŸåøœ/ë ¬ÅLöCÄæ_Uµˆaéê6ß|qÖ®^%1l/Ó™1 R§éRÎeiT¼#oÝ¿Þv¦Ÿðí1YFò i›-çKt÷æ2á”HûmäåzC}U°G•„‹É//VàÑêà‘DEŸløV£ÛÁÊÏ;—¯€u£„Eçê_¿7"!`Û×>ubyí2}cYü‡¡ïàK¥"TÔfr=Ûäl}Õéõ$r µ pï¨÷É÷C9x—dš›Ý®è¡¸ô“ƒ0x!ž‡‡?3)5¡R}ó;x¾#;¾ þS-‚åkž9;þ0W½íÙB ØuD¦S,”‚.7&=ÓÛ­”åZÃØ(ñ浟Ô-²7}FœÒ/Ep}Œh]ånœò:%¹¬ Îc·2½ND5ÄR?MµÃž¤•73ü7ë ºH‹ÌóÏ=½ë)Ê5^-KóK¼v3çÖUØœk¾ Õ{œh-Ò[$(TÄÜ ©xwl'n¨{L¯[árå¡ö?€L.­ÁkÍ[öªz2ƒ10‹–=H<“Ï%zÐÐÆ ¯štØíLlÇÓ¼éDÛURŠép”0N•‰ÅYuóAËhaW{ûrÌÔº ¨Œ|òͳœl42ˆnÚ¼Sù×ο¬ç Ôzqä–¿‰ídŸŸšÌö ¼À`#¹uÀŸ{£S¤Ü™Ì£àÛƒœ<åFóPÏÀÃQ¡å§Aô‹3bðóå Ø!‚}õ¿´€7 ÌS Ôš1¬w˜ ÷X¿¡ gB—û)ßÂCæèÒûò ’~šd×ö´J`פy+½ãºƒ 8?&dzͭH*GÍ5ÐÜé —«†7ÍÒÑ`Œ’ß8÷ÉÙ85­Câµ4CËVÙVÑWŠE”m7>ûŠ>bõô09YŒaßÌáv§ªÈ•ÄÎÚãƒJ3~ ݲ¼Ùé…›Ìm·V”Ía6…ÿõE£y+½p؈ÙëNÙÿR"ôAcÕ»õ’¼ÌÉÜoN›aäçÉZç,DàSÀ]Šš˜¦áØ×¹‚”Ž–ñ6ˆ’nÍd<ÜóKø®0ÔZ„v†3É:Å»{êQx¹29\ø5ÚlŸšµ®N‚Žw_µsRÛ$ªæ÷L†Õ‡ýÑ2Fµª ³ëˆÏEt^»‰fÖ>ÈäX¤tÌ)YM·9w4@Șo&¶Ú µ²Ð|1í”Ú¬¡Ý øžˆ-%«½ØÈìì•ʺ &,²¥m“ýâ56­¨ R\ÔâîY+@΂úÙëõÎY‘0ŒûV‡$"}…Y{ ܺ™ö‡'ÄåŒ]l¯+yy»EcN`І7Û#h`RB€J{BpQæ§tÑà€N‹@ƒD’,âd]]Nq´==”ÿæ_kí‡þLZ$‡Á‚ ÏF`@ÙS¼„:Ƶ@[}Ë4Ì÷S( ý…DŸT³M%È뢩E?Ρ[Ÿ.ÓK= Ãõò=šûežã䟇z—­$RCp©Ñ{ðX8ù•à<Ї•×仂 ZD» Ë ŽýJóÀæ‚õé×ê)³ïgË¡íi2ÁÂ’{ ͶÚgiÏzÙç)›Å‡<‚¤Ýé|cÁà8Êd¸«6TaÝ‚º%=&4æ¦ÙÓðÛÅ.#°áO çDÑ­mW°¹ë¶9ƒ=mhRwj”ú²ÖÐlJ¸çñ¬¡Å¢ºŸÐã´GªXä°‘áØU™¡ò?„µ„ãürLª¾²æ¬Ú 8ÂüÈ־ߣ·¤ŠKö³NÏ2NÙUy>Ü Ï{ä0¦²øÖŠß7§\9Òë¨üX.ãD©aèÎ÷R8ãϪæ3Ó{Q„…N|Þ¾a 0X‚_¢Åª§¨o°–g€I}D1r "ƒi«††ªvìn‰ú.^5Wþ,2­˜Zi_õ‹(yì"àÒȼ¿æzMH îÁýè¦òº§X O_Š $ò:NE•\ÐTÙLÿQO  YïŽ)€ø3­ì×ro°ÛáV‹CLAƒ 7«[‘n¡Ê¨¯ÙÕw±Á%š¡º ߯÷ œ]n­Ñ“áùMË÷îRƦ˜¿Kd ¸¸7VºgškKÅõ›)[(Çh’^øzRµ…ñTY„0ùæ‘›x׊¢ÊQXÙ0uJAMÉ1©¶7DðdKϲúj¦úÝ¢‡ÃˆÙ@Ó1=FåÚŸ´ÔäGä••}š¼=–Û. 4ê“â¸g[Ž%ã½vé,ÍqUæÝ˜8'cá¬ë“ƒŠ¹j©JÒ8¿ª2üOÅ`×7c…ž_È„øœ&+'§ÊO¡†ß>Ôå¥,ÝfÞÏó  ;[‚ ”¶þ<}tð‚HO‚öýqØ®zãy¥Öš¡äßÒ ¯… c8¼â¯é“Ûž!/‡k_¡ÎtpÇ­­ Ýêý_ê´ðE«d06äujþ ›nkoÐ~šRµcC Ây>/Ô‘^¯ÈèÈYQgíGN¨ò+tY7Á”·ábàY–ÕÌSvÊ*íÜaxëL,›ÑÏÍm[Ú ô´€þ22…Yˆ,&ÿCšñ¥/ÿ¯'t»—ÒœPZñ`§ËïÛ lИ4íò |¥¡øH©0¯`§ž˜pÇíÁ²¦,¥…v_-pX±y“’4×÷MW‡ôŽóì\n³¹U‡¹DBìâ½"¨– jAÝu°ó'm?þ°¢C'ÆÏÛ¹8Dl5™5›Ð¯6~_Ðä¡Ú; Cb£ÎxV`©v‰²” ²m›¸¶8©‚¦æküuß_Ç ß@•ÅÁœ}G|IFB…üËÈ©c¤ fZŸm~ íÒ$}œŽòQ/ЈlDL—°ƒà/g^7<±vDÔÿºÚÌÏv=J V`Þ´°î2s±‹C>%‚¤"?‡Ÿ†Ÿ»~þ²R¥ç]̾­?ÞýÐçÁ1®ùãx]ÎwDÚ©_ø§EÂw™~›Ò?ýËÞ‘U²™§›p:ËV2é²ô Œ q ¶ë0ùÙLD{,õ€à>¸Ò&eßKîqR%ìbR|˲œQªg†Xd68P+&<¢Ò¾ÏœªcŒÛ"ž«á2‰~:ÈßpfÖêûâ:C@"ÿ&4jocxª¡¯†ÃveÑig(FÏ,1 uýjÿéNÈòî½OrÌTÅMêÆGnSdøŠªñùÛW•s˜l¾X§p·g¤‰xÞ­H%æ'yDlTkÆ”Ãþ,\eéÛY t?]x·Ž áªLÏ©‡†£y-LôËêê«TR—¾™åùàS rtd?hX™ù% „60oãA°r”m&_œÁ)é9ך0÷`þø$“¶È‘´ßÍÁß?{"¤g±ˆ’±ßC2¡Fök}5ÜŠ¢!¯!SõG¦¬Fà_1ü&vHL •ÎîÚ‡•1kq…ÔÃà¦5 lS‘ÇÞ T]-~"·k¯wF…µeÓ“¥ˆý†\§lmÁæÏÎ ÏN¶Ö(öEh ¤Ü]z{S =›…ËÌçéÚcŠP$ìRƒdˆ99ðc[€¶iÅ£D7i7C®'C¬ˆ«ƒŸë‰¨¯„&èåÀJÖ“ñ} Q÷)“-åðqL`ll™¶ :–AŽsˆRŽE¥Û-$Æ‹8œ[KÌØÄÙlBð®µ-´+En×Îsxcr_Þ-•1"©ßQHÐÆg/!çüQ3rÞs½¤áí,Þ«×–£ÑU3±z?¾óÕLtWæ\û)-ey·¾Xêmô0Aì4}'ZqÞûeÿ­%á)7„}FÚ9‚ÅH¦Í@ëGš ôcc‹š¹>ª$†4s`éII}ÎŽÍð¢M½æÀ7û cG9ÐÁLèQt@%Ö*å$‚rÝ00ÇÊ<Á%¸öˆp1;‡uãÔLHÐìV§È;e€ÎïG˦/º†€øêr&ÒëuµçÙòev-M‰Àeœ¯á¡ÐÛH q[úödTÃ"&n¼-÷[R)Õãn1ZÙ/yÕ"6ËãÓ2¶IEwØYÐÙÏÈñÈ1¯®×Ôí sqÑ·} Ô|Ñ7‹¶ÐɬؙƒÏy³}¶×©þŸè:à>÷Î?,Ä<ÒQÜ)éðÐ ¬¶´Ë¤ $mì7H‡"à ©ÔÃúµýŒ1,‹~ô¶ú:ójÙðáY]!< ðÿ¢Y©‚!Æ.ü‚ ö‘,lÑêPzi"”¡ÀŽä›M(v'ŒÔ=¤€EÜËJÑTí®‡ùר ~þ2•Þcìá²NP¡e«Í›ÀÍjãÊŠ‡ ðµá&ÛRaxuÍÙ\–ÁØ»2«=hµëÍ*'*I\KGB‚ CÜhÀ‡\øøÀàËlCϵÖYNWášo0гãµU¶Ò3UŸM÷ VW&^²X$'+ðÏaŦ kÈÆÞ©«ðd´23#½X*¦­™,-K_¶ót:‡Ïéïg1xrëãµ /ÏÄtÙN>¶tOÖƒxQ ½(Or}èqß,‡XþhéaÑò~uqçîà ‚€ÐÝT1œíÒ«rp£bSAPsWDf+»¢u‡°Ùˉ×ç‚K˜ ÛËiÂ>hå·éò3O$·‡=Àua¨ý†’%õëiÞÝXõOr`@Õ.·ME‡~‘PB&bC…(j Š1šÚ W$w¡³Ä‚F³•v…›ä1¨Å-òF¦èî_t¥Ìª”ÎÙNF1®ùí¹W!ô”ÔxÀÄ]~¸sÏÓdäàzÒÑHÔ’‰ð1º*£6Ø?ž·GPòYOìv³õ?­ekµwr“  1ú®”µŒféÃ8»N—èö D‘ºbªM¼ÆÅíJ5;÷›MU~$lyÈaö£fÙDhχŒSCÙ kRÖA.T«, n“8Ä–°·Ìz¢ôUÝš!âΠþÓ¾ƒ·ùªJ)ðÕÇ™=<ßgõîRÝåz÷;¾}~$P–<¼ù0üsXLåÿUªù/åYÐÆGYœr Å)Cècæò\Ëc¤íÒ%C~rÞáxÌ¿B#Ñ™Y ÁŽ#uÙ]-3`¹¤*”Ði¯'BH…{Wée¤¡‡^Põ¥qšbJeê½äò™`R`¤7ª©ð~‘ÿ"^\ø±pßÂ\á¤<À9µ/£0ó¡qo@¬eñ$Ïç¼6YÞ‘”ÃÅãn¯Ö¤e@k‹È+vó¢ šìfÅY4'–à gA#ÄC{°ƒ·¡ÕùçO"Ól–;Áæ/nN¼ÅŽX´ÊZÿ›Ï°óàt#¸[Ñ„\!Œb„Ï“Ü,‘òd*Š»8ø›Ì|€$'»ÓÞ<Ô$è«,g*9àžJ©F½3”}ºâ¡ 65{Ôw=cÛ8™Gªá²B®C¡­O¾vçw•H Ê/û>×ÏO;ËÜÏet ý‹ÐÁüT#íU¬ÏEÛðà1“G—3Þ1w§æØB®+ 5¶«{Å BWk8‰ùÄbŒæ±&_›×¹4}J…0J>RSÌþII‘¦?¯G’ûƒNI·8©ÕÎ\7(3yeO9Ï™hT€Ñä×/Œ|ŠšL?¯é4+•b8šÅ•NwTõm$Õ¬ˆzËß7[ëz¼ô)êýKÇrö‚ù]Ÿ¤wJ}küo2m.¦è $¤º lŠÙ(V0÷……óÚ2ªÞ¶WNÝŸtqjÊ—½Çi)GúRãÍ¢0Zy¢jÔðúÌÌÀV\ÿ›s×™‹Á‡a·ÞÍ"s•Zn$`’½fb_×¼[sŠÀØÜ.‡È>'å*6(,:OýÅåÝî3ц$Ö­lõðA•1ík´'(g|i70b¸9}>Š ±G•r]°S3Úz ÀË”Êøþ,ï|‚úk9‹Çͽ xܪ_ž-Ñk¥>ŲĽæñê¾Z¨ÀX!ÚAÏÉ\ÊÚ;ÐãX«{¯†(4ög4_Lîæ_ðœ_šjµÌò=cdèë_ ':øŒïÆ„~ªí;S.ÙÇeB|M±%¢|ø'‘ÚÀD •1„[¸ýó"ÖR"‹¢ÜŒx"í¯ã}¿ ¢ãͳýМ{–œ¥°Ìø¬GéAG „øí“ (ròøÞÕ„$9íŶtWô?juß½eߥC¼+Ä¥ïÐKŒ?¹ŽáÓvßö²=R]ºõ’´Á+ÕzúWÛŒzjiÆcâ"Í*Ü™xËŸ†#É7#ÆLGÖ`p®ÿ::Z**#ñ4 @ÙOSú$Fôê@—WñÉê»Øˆç…Xíæå¬ÁL‡W)akŽî{ô,ÛHÞw¥{WQÂ+Ï‚~øÍ‘ᜂOÒXÁÄ5YY©á˜(%ꋈ”`åq¶£öJÝ„[ü= é†s·°:*D&[œÂú+½€Áä­Ó:B%¡ÓН…°Î×ë¹Ï•U¨£5ë{­J"6e±çéìñ­VÁƒ$=‘xÀFC Ö§óÌ „ nÀpÙaNìxè68Dl¢²³Y½¦O Õ_³ZòÌq†€+yµ¡¬ÉÚ×dX}ſĥܝµÐ`&ÌÞ®¬PÏà´t! FųQ©ÙcnÈ Í¥;Hu¥P)¹ëœô‰DÅ…Qâ,m ºƒbÊv-jÌæ•žH_¸Ô$ÏÝ*–—ÿHXU‹&öM%Ó6ŒÇcL7åõröñ¯ÇM x endstream endobj 44 0 obj << /Length1 1378 /Length2 5976 /Length3 0 /Length 6927 /Filter /FlateDecode >> stream xÚvTÓû6Ò)%2RrltªtwI(ŒmÀ€mÀFŒ”NiPJ@D%%¤S‘FZ@)éR¤Eâ?ãyžÿïyßsÞ÷ìœíû¹ïë®Ï}]ß3>.#SQeÚ®FaEÁ@<@UßÔJIA q >>3Ö þ×LÁg÷Ä Ð(ùÿPõ„C°x›‹Çé£Q/7X––Ëȃ@qHî_@´§<@ â€ô4 Ž¡àSE»ã<NÎX|™= ‚°œœŒÈïp€2BP}ÖŽÄW„Bܦh(ŽÅý#…€¢3ë./&æãã„ 1@´§ÓMA€ë 0càžÞpà×Àþg2 ÀÌùc7E;b} žpÞà†€ÂQ|„ ÷à‹Lµõ†îpÔ°Þ€àïÝÀ@ð¿Óýþ•ú BÑHw ‡@9np€¡†ë‹@P°_@ˆ‡xCn<àw瀆²1‚ðïx¨'‹bn¿Fû•Ëê(˜*‰„£°Š_ý©!<áPüµãÄþlÖ…öAùÿ=8"P0Ç_CÀ¼ÜÅÌQ/¸¶Ú_ÞDñ› ÉIKKÊà¸/ÔYìWz3œ;ü·üËŒŸ ÐßípÄD8Âñ?þˆ7€õô‚úÿoÇ?O`0†€bp'Šâ?Ùñf¸ãŸ3~ùž_€ Ï=0ôëóï§»xzÁÐ(7Üà¿÷+¦odb ¢-ügâûTTоQI€¨œ¤,ž®ârYi@à?³A»ý'TåˆÈýiKÿjØûïþþjCðÏ\h§Lç©ÁØ2VIBSúFý4c¼¹×8'@%[zB×Íx.7ß7ÜTQ4qLÁ^øù:X §²ü9ØßÎvz÷u©™û¥h\Fw’Cê©É‚P3Y‹n‰>¤üd“€œÁÆÎ™AàKï[“Ó(w®*sfµ5+²å‹!-Ï.6¶¦QÝ“@{F©;¥òß »D6sJH—¾¼ÌPÿ]©Ëu8´Ý’Ù«j[ò¡ó·Ua7¬–'ÙB}Õ‡®‡‹uÀOäó¹á§HäÍÀ¼®lJ…äŒðŽºiEŒñ—Æ7•0µìÜP®úóa*òŠÌhåæþ<¹CƒŠ©p.©¬ô$[-!­ðUàŒÄ }tÁÅ«§7Ï ·BƳuŒ§Yd6~çÜ0>ðÕ=|²Tóí)ÝTŽm¹[7ÝþAÏÖ`ð eƒ˜UËj…⺧`¼VLùy5¥‚ÄDÁfq´õùÛ4mdø³x®ÀoGD¡JI'+í1Þv’O*‘˜…™â’…õËC„¬£ú¡v€²B ó0˧(*ºëÕ[ð…ŒÍÓ¼«ñžWxÚsç[½Èzd´âÆäÛ‡™”ºë¸;?-±÷Ò¾©'@r`82µˆb¡Ô«Ð×®MؾŸœ«Fr[ßûÒÞÀq%µSÚXÞ®»”ºÇ7×¢WeÜ>]f_ß/û-­_¾Åʯ›gŽÆQ Æ¿4’žRD2žî‘ÿ¨G 'fÕj. ?ìÄ|÷ù±}”: }ÑÕNaOeßmq\W«†=VÈ"Ëp Ýz4Ìòn°ís5KDž„ô‘íÅûsþ±g="RR$;7ƒúBØ;{R4?ë]$-”I«møžºÞJ,£] Lâù(ÔišBVûæòöþÏÆ±ij›LßÛ´líâ©W…ûs,Ëã¸c¦xžoä3.ºÝÌ¥Kõ||æTåy£¼"ð$—OŒôÿzòm­à§S=ÂŽYX?üÀ˜ì®r&× 2û>EÓµŽþì‘oj•}¹Ÿe%¯rßÜy¥ò©¸;Þ9Z…o¹Á1cºªà°cåÙÝK!uìYË’…Bp;Á)7'ãƒ%]e)SGOS¯ÄóÚËü|“žq6¥AÏñ"ïã‰|JLºý+·¢+”ïÔ®ru5娹{|Έö='<¬¯Í"Ÿ²e‹Y£©f—£÷Ám8"å/×5'[rÌ ’ï3 ÎÏjvé9z¥S[û^2É‚3ÛѺ6Õâfù®³½àäüís‡€ êàKšIv^d »¹ÊÆÜ_ød ëôHÁ¢­µW³tøã¾´ò~cG0š\z”·ºª¥7æ=VwqØÕiq“Ͷå`=Ll ".¥SÁimHÏÝöœ}ö.V¡žeûÒ j~Az&¨WTMŠ÷^geÛãq¡Q!]Þ:;ÙìÝBž£ëäõˆ¢0ºÎzfŽ…$³Tuè8e©Hm¸Ã¥Šf \Z¾»ëP¦0D¦Ä¨¹rë’RÅÁU²ƒe&>¦YÛÜvöq¶Ù¾ŸSì{Š Â»~há¦Í£Ó‰Úæ:ÐáÈšWÏ…¼ÍyiþeöºšDíyý¥¢²ò×É oߤÍhwô®Í ­lŒ´š€XÖDzèN¼‘9\× +á:Ý;[âPhàç ,¹è$Ó.²îyƸK×Ç’KÝ×z5<©ª;i¬Þ\¼×IÆ^ÚL,7WÐQ;Ç@ËÃwäCe»×爖3Ü•ýÙkÍѸ™£ñ6NñkÀ眶¨K¦Ów>Knž¥ŸZö°ß 8î›ôÊX´Øß •µD¶ŒËZ¦¹VõÅšb¤ø‹ì}?&í£Y!y2ÖHšòœ¬}a£LŠ”õdR%š)g ¥ºHëžRèue>­É§Do`Ð éÆ"½×ˆº*Â>±„Eïø;¯Ý(ˆ3sáqË:TmfQ—øŒ³f·X€qÀòî.¶ÏHi§kð“mÆ{@]æJ ¹C?WApdò„lU ì¥wÉo…>‰»Uø £@GÔ^hŸ£Äô}T?|ìv¢ïô>¤†Us:ptJü6oÎþ­Ð‡²Žë»Û™ódŒU{žÁNŒãqsi!QVÕ\Ñö¯‚ŽH‘© ^Ìy? ï=!–›­$ñ´¸P¾›6ämëCå¸çiÖÊí¾ª¡âzQ"ñ³8D P‹È&;Ü…h¦Ì!è9õc¥æç´å{"kM)hꎣ—B­;Xn}ãÄò 'Úkáá΂›ŽÛTõöŒ©Æýò‹bö£´Ðï_®£—ÊfîZ†M}¿0n«Rœqâd²žÿhв¡_K\ÇÅ9Î¥&ý°xïì=îÚŒKþºÇÝÎXl¹n.ä;á´w#=óšUÈ‚j¤™ÀËкGùÑ->O:NzS}>܉ì·NW¼â­©RSµ, *¿Ì­Za¶¿Ø½ƒU”<¸Ñú‘4¥× Fp«ï;ÅdQ4Ëšš8W0z•–Jñf\ÃØ÷¼Ó„í±Ð+~ôØûjzéÓ&£Ôô´2á”ÜD’«âîñ.æ JHÕÑoþ È|9¤èé{/ zƒÓ­R¢u)¿ÎüúO&…Á¹â<âýSj-—]îùª©œj@øŸ¬+’D—òt9Ø ’‚Î)ûø¢×µÇã*/ ÙçRºò]í¶çœN_:AÎÖº‘Žîǹ˜Š£ø#i¨—Y&¬÷W‹šŠ—h”ù–ö¿nr¬¨Å„']$¢ê€„ÄMy]'¦ÕÉ9¥óbûÅç@‚ ééfÃ\ ÁèSsÂØ! ¥g°õMׄàY«½­mÕpxpf?÷Æ\}W͘•ÇéQ Ècd‡»öúyãòûöÂ4Jô[Müœñ½—mèï…y…=Ùd¦ð.* R&í°·°ÂGXm]&Ÿ$ËèÚ˜Õ-Õ”4w'—”Írù–%XAs* 3åH,–èÄõŽ¥-ÃÄUS%)/3?hL¹ÖdðF5–>}KEÊ̘Nkq^†Pÿäˆ{øF_¨Ð2³ÒžSòø™ž Ú“ þP‰” Áq_/åÉ|´­h›Kéò|k× ÀS›Î» 7:B(¯¤×_tÿØ«^{;w¡+*}Š Ã>לh³ŸSúê­ÕûÙ ÷!óáñã‘ÏÈ« M˜4@“ÿ+ÑiLLó¬¬oÍÇ)äÒ‚Ïξ ÆèhÔ2˜d¤ºŽeE5§Ý´ 4Jìxp ëýt>õÂíä¿wøkL¡²_P—[©ý‚+mp% ƒÕÄ—R’FsKÏRš¢MØH&¸¤)#¢¢‰EkŠOkö—K]ÂOm¤¢¸¾$S5=+øúTâíF¶oì}ŒÕYÉqž³¶»Tl[#Ì1S"ÚÝ Úéõ¡Ì Hà6¢Ê6 ~RjiXòJ'½ßǃŸõÉ{‘\w­t˜_¿|c\vD/{g¦mÍ?¨¨÷‹hk ïHÚyÀ©@ÆŒQ„¬ÎcxqšÑó6ÚOÂ?a³½‘w.0ŸU¯ê²D¾ü¢³!-Õ–¾Á|¼‘²êÛÌD2øá[W¿÷=‰3÷0²Vã;çVFš¨Ü™Mâ|½Ö¾þ¥š§HŠãÔW©fô»Úc}΂4ù|¥÷¾¸õÛQ\™KËÔ]7a„wKëH-~u–9r¾ä·›I.}dáþÚ}£æÆ\ôÏ»å!©áÙð*ÛB3OdÄ›îéJæòî^Þ™›yë6E>¤})ï>'írµè±é,–ïÖUB©t÷¦©Uk?º‰al…y?š2ûæÌ´M 1'ÓW>;Ƨ¥bº¬ÌÜD§žv?]áù!‚™ÝÄE¼Ê¤­Ü(ù»xÍ™ÐÙškŸvJÓ¬Û´LÙ“?4Ĩ]ö%µyDÕ[`Ð?MpùîC‘m¤ŽÜµÄ)*[¾—Ï”Š#¯ôþDŒH­,Ë×øQ!â†_!íÛì5.ºóƒBÐf†¾uþrµ´£â«ÔǽJ¶ðö¾öÕS³…i‹oŒ2·(/±šH‘™÷èÕWíwÌÒ˜„ýzVø~LŸ(0¸"mŸBú˜/éM“>ÐuÌM–[ɪ}´Eë°$ºóV 5iy´ßmr»CÓ®%GÐ÷Cû‚Ïdr3eKÒõNr¦êYrWë­ƒùÞK¸bÚ£ƒïÙÖ¥Ê!˜ò‚Pæ3?L®G•*/?ÛÕ„K™Ç1ËvõQ m´ÛçɇîñH§¸vZ[—~h(ÏïHÝ yþÊ…L GvwÎ’õ¾¼‡+ªŽ–­Ñr}„º—ªµÈÒ0~ǰ@çòƒ×¢“—ÓgU®íø²ŸhðUé;J£lÓ‰ÚÌSö®±5=w¸%ÐEèµRCJ¾KìÞ¨ó¹“{:¶ƒVÌh?ä$D’¢ýp’LOLºŸ¼78>Ι¹Zv`YM )£|3B’ôÏjø[Ù&b$cO€ì_›k”›iäÁš¿éz™ODÕ3ß–%:ø!#².¿³ªXj`žVŽ 5ÈLY0Ç©Pô2ólË¥ßûäÆyÄ£º‘9‚kª@®ÏÓ@¦¹k-ÞNûÉÃs«XâX± Ù¤éP_GØ¢l‡#L…4z4“y›f”%rx# é™]yü ÒýyÁÖ’Ùò(é}žp»¾‚1úaC¢ErÈÝu¯~ËVÅÉùw¢ÖçIvãacý«pÄä¼ÎèœÐõÑwYÒKM¢¶`ÎÃÅÐNkÏÌ å?6¨‘¥+äwÛÒåž´1¼c¦uú…®Ë+˜œ…X‡?$ÚRDŽܖÆ:îÒdûÛË!ÀŽ4‰·óˆî=‡Q²Æ?‹Œh‹í2Ð*fÔ¹¾ ëX¯«h&%”uzì>ß䤪KV÷jðú½ÚÈ(‘é,_v=ÕöM ³_ßÊÛëý7‰Ý2³h0íi`ë î=ÿ'ý ªÓñ) .Cò^æìN¤Ì «IƒŒ¼Dšþ ˆåsJ¡} 9XxC,i:â9ÍÄ;­‰u¼äâ‰Èƒ @SEY-cö»GT‹Ž41ô"uõÚ/l­Ô\ôÈhä 7ý¾G®Q¬lqkTbRVË8N’˜¶Mz–]`¯p´³C‡È8»Ÿ¸×nDe3Ž ÌN®°†îã»›À«ªœéyÒÖåwoˆ{×D‹²d:’|#©|ùÊÝõVÊ»„A¦‰IúA¿Ó«ŒV¶æßWç eâT!v+ô‘7?m¤tlYp  “Œ¢½¯žxKøú¸fõ.Ù–;=ýQrŒô©ñJÞWÈäÖÎ×Q4¯ïgˆÙˆÞ|IæÞ)újøÚõp¹n_EÉG «ß˜]\4)´æ ¼y5UƒÕ‰¨zp37öT·€-CõÑÑ Éda”Rwîà–Ëçå@XŽÄ ƒŸ»•Nk™pµL÷¼ÝïØI›a#Á>š¾Žž£?Kú—ÕÛLÇÕ‡·aõEf~*Û{›=fž³:Û&h'úÒŠWc‚+‡>¨ ×ó¤õd=>%ÉldkÑø(Aäñþ:®Íñ;Á¬~Ù… ‹Ã½ž›¦ózOE°qAÌŸw½J¨Ï¶I‘燾””n—Ó b×*Fèl7`«ŸÚyMÄÚ·ÌÉk†š¿¬f®QÚûm-Þòðj{ñá9y`kßL•{ {«FooåÎ[§uT ¬™‚JÑÌ3òŸíL}@†Uba-FY&ãçïϲZŽb³k$;C«°q‡1¦ÏÜMÛ64Xw^Uïu·,35 Ïí˜Wn_È”4iÚ³4ÁrM^±‹«Ï¯äš˜½±i¿@*4Ì0/ùþ€ 3ÃÂXí]ñ©F¾¯òƒÕ6gQ=?¥ú_žÓ“vOߊm´¹?ï/®ê•3œÅ“ u._:Kz9Âõ|G;X ZÝá—l¬Î-¦O#épsBMX²B?XÎ,‡Îc‹qÜtï‰ÖôõCtWҾæýÁÖƒ™£‘g㔸»ŽË âž;¸E•ˆ ÷óO0¹ËŽíÏnÕ*>ª ~Ïÿõ»ÀÞ¡gõ3Lº“ü>b'¢>²¡û,¬§™läLpÛÒòIôMW ËvóŠÚïöl‚[î¾_L‹eY#êÆ&%qR% Äù7dSoŸ¬±ˆ´mú ‰(‹ž:Ê lçŽTâ\ï´,É›½_P“¬àtßÈcèŒÚ½·Âœ­,1 /qù¨,÷åðhu˜s^> stream xÚUT”]·¦Å¤A@eèîNIiiÔaf€!f`fèîN QJºD¤¤CBBJB¥;½£~ÿÿÝï¿w­{×»Ö¼ïyvœ½Ï~ž3¬Œº¼ „5ô!Žæä*i˜J„ù„¬¬†0´#ô/Àj E¢`¸ÔsPBBAh ¦ Bcü´p †«#PP((&%(.% ü—#)T¹Á @m> EX•ΞH˜­³Í¿>`N  ¤¤8Ïïp ‚ ƒà@mÚê„Ù r À0(Úó)8dìÐhg)~~www>Š´•ãäºÃÐv@}( ŠtƒB€¿>9AÿtÆ`ÚÁPp„ Ú„„1€# …£0®p Äl4P×ê8C᜵þ8ðÿ:  Ÿà¿Óýý+ þ;#œœApOÜhs„ujñ¡=Ð<@òËäˆB`âAn ˜#Èãð»rð¡‚„ið¯öP`$ÌâCÁµÈÿ+ æ”Uà%„“ŽF~Õ§ CBÁ˜c÷äÿ3Y8ÂîýׇØüjâêÌo‡¹¸BÕ•ÿrÁ@€¿1[((* )&&" „º¡`;þ_é =¡¿‚¿`L¾ÞÎg  ¦ ¨/ÌŠy¼Q 7(t…úzÿwÃ?WAA F­¡¶08àïìjóg>æ4ÀpO(ðëù÷—%†^ÜÑóo÷ßóåW7VPÖ6áþÓñ¿mŠŠ 7¯°WRT(((! —úþ3.öWǪÃm@É?ÕbŽé_»ýEŽ¿ÄÁ üg®G k¡@Ž¿In! *Æüþ¿©þ;äcø¯,ÿÉÿ³ ‡®ŽŽ¿Í¿íÿà r‚9zþå€!­+#mFðÿt5þ­6suúO«:„‚ÜCf^A>‘?8 õæ…èÂÐ`»?”ùƒý’š# ÕE `¿îL”€ÀØ0ú;`¿MPŒ|þ¹¯ Œ€üÒ™¨„D‚<: aæí-ˆ$êñ›É@~>8 bzôÚ €_còc¢î†…±ý†…ü¶¿î2(êâŠÍ¿ @~GLA£ÿ(ìŠDbdù›5˜Zÿµþ}@¡P0`f–±ÒxZ¥@ïÎûuàËRsd‚iW„(šmê•·Ö Õ1ŧò;ýiºÓÅa£“>ô\Û§CmY ©j/ÑX*]+Š»¼9}gm¶Ðûí°xZä ÙN¢Þ=’§æxæìÏL&/CÅÛ…×+Öò¯šQëf’ßNÀ×ǤŒ©ôèX…ìæï8ѦŒ,K覤qäHó箆êFÃW8Ѱ¸ÅÆÚ3Ïó¸ôóó½YÝ]iÂû¹š•båa´”^ŒÙýI=´T‰Yu(,6EÑc¥â”&Ú§0¶\PWÇŒ¹d}ë&D›u#v'ñðaÝCFíü¸ÆƒE㻉r=J$„Ä9tÒŸê=Úìõ›l!ò¼Ìþ%R¥}åsq™‘w½:NÜ<ªHª(¢è?††Uæ’±Ñ7|M¥•Í´ØWÐÜö”>2ã{tèQ[J–j®%ãìât÷ì³ÑÕÃódZŽì8ïþ>Ë€µ‡§ã+ g6°h¤ŽÛ-vT¶ï§ >.,kKêÞhb{õu°»ÐB6¦ÞmÞ>³ ®nâ0Õ¿Ý+U¶›iœÉ¬†37Eô:úþçF\ß«ÁÅ^ÿß¼F:¦o…<ÛGzU~ßqÁ~ÂÏž•!®Ÿ:å^(ˆ!|⺖7^ü,ijiô>¿£ÚÓß¶]¼°9œC‘ ëÚ+çMbáq~·À(Ðk9$W­ÝnU”m{¯;°Ì? ?È.A¨KNFb›§\èhìãµWJýÕ_úž0¼=Ù¤öµp›ï£Q7Þ¼p<”9M7s¶B£ò¼ØÜu^ß7±ÓÀ‘É"ö½ ÃIÇuNbKRåøáµ&ž5ƒoäÄh%›#÷\` ’eºõù“sw@ÅôºÚýË«È@+¿„è”'æ•´M-déÁÊ^™mn€Ì&ƒ-#Ëš 8™1;¥1¨/G xÏ.)¿KØRºÁî­ûÑu<d£)öÌ)C4Ò«0ÂAwˆ”._Dj)™†ìX|8Lìˆ0hGQ¬‰Jo"‚vèr/PæÂeéni{Ü Å’“ÿ›GqO[–·ß¥ÕŒzùÎûȸXSDƸ3ÍÙÝMq$l…‰,­žN ¥‘|¤#tV{ÀâüöHO7 S˜Áö‚Ìù‘ {_J,CûgFË ÉÐOJÆ þJ_ÌüãøìwìÕE)ŽŠ/S{©ð½$ÇAÏ:&2V}riÊ"Ä7{]@Þžèøˆ•݉¶è \®a6,|Ç÷ŒöµÏ9mªîüAðzƒ±êJ76yP®Æg²j÷õÀ=¸d—½v Ï\æö;––èMTnŽžë™÷ ß’g„~9äe3/‹ÖK×C´KD]y°ä"aØæ¶Fòv¢P>‹úE@¢æ–^¡¾ò–Ù\óeOÿw¯îsÃŽCF™p.OjKÅéœwýEï7⺰˜5ž2dƒ g ‹jòã—ŠÝnªdrÅã´% ¿^…/„°-áZ5‰M›ôµ¤o[˜:í™ê?(ðlÈ`TŠBXs’È~hÎYOþ,<ª}cŽ«†#5¤JWã´¼ìÄ hñÇ*ע͸uXÎ~4^³Nl˜ï5B$h~"-²èlµQûhÇù¢ÄEQHNÂ>y:Kž0˜éOö8é¬3Ö¡Æ'M O/¥[·&`óóUU§ ½HD‹U¬ófãœO£äÀ‘ù>Ï56š8Ÿ8º‡³˜3|ÝÉ1N4$«<»aCxß%;÷òÞ%îÊ WüòW"˜s¹– Щÿ hÕ%Ù Ý4²›| ipû$Ãð€9¸aмì¬I`5e€îÊ6¿FÛò+«÷=[Šæ¢ç¦/i?…•€„—q3)L²Þ÷÷|ÙW~U<ÅÃöÆŽ±{&¸82fz„nËå§°@_«yA¬°R€ï'nÜ?1Ñ•ª˜âqB4Ö‡§­,$6z÷b5ŸÎ³ ‘þ^*;tˆ1<†ŒIy(MáļÑÎŽÕn¢ ±ðD±Ýqð5+ñWP=X‰¦©·Ÿ; \ý±º–¦ÈPY±ûÞi—-þÍ›nËïá¯á&ÁAwzÀy«¢l·Å˜®~N%n+OU_¼>™­6Ý{IÎÒ=Ý7[‘½¯L-ç>£Ø`úMùU¢s¥MU4+ÅyÃôJElPŒù½{{‘m£ßi6‹ï¬Ø¥:оˆØ©K°U3¤“…€3iq¬=˜ãú–é.¾»ürG³°y§Qrw}ÓMæ°–Ãc¢kpz€³™‘oñ^ÝÆ§Q“к§KQ$à!‚¾4……ö \÷Âw¶«"©îòX΋ËâÈÊuÚ jå×Árc *B·g'Õ3-ßé¯ö´p÷&th=·‘º™+ˆºI¯Ó, 3jÍ÷á^QÚȘ‘$Ÿg±¾U®æïªvPN¬©zV›üÑ;-‚iÓ|Då(3ÙʇgëRšÃFΧa ¼:0–³tßm¾aÅT¾ÂÖ‘«ì•5íX2yÅ ³t²C»¿ø–T=Md]"Šf‹kF¯¡×÷è ÕußV–òû¤‰÷ P,[+:9O¢Gœ£èÕÇ¢Qìâ«j•f»ï½,Õ]l}Q1Ü’Ùéw»U| Ÿ>Dú2pÂÖte?,¤/d¹>™ï;àÔ¥:¶ìßxmù¾¢ ¾ñ•æ^AÜØ6ý—©®®’CjCEçñ¡@ÊS_\”V™lôHSG⼂uKÛº{a£ñsW3OFÝ)t㣫[)*Õ»„uÂ]1cú¸»­˜[u-+Ï–ÌN9mˆµö­ÂC¬¤gBLŸ¸îÕRfÝj> ‘KÏŸ:%Ô__•!qk|éÃäÖƒ¥e¸5 ¸þ™FátÝpƒæá´—õƒõ•jô—“'™ocÉ••çÞv=xÿ¼°æ• Cà n'Í‘yáôêµ1Ó: /ÝŸa|°ºà$Žº”‹   Æ qÊêÇ]?–¿ÿ¼®Î‰U 7œÝ®´òL“²Axq»”%‰_{}+¬ fd~Þ.BuBq÷ 3ìüÊÍTñÞcéÉì³Ýºˆ¤B Wfûóqnÿ¤Ž’Ò³èõ™%^‰øl,\9«Ãö![ÔˆÈ]QQï©á,ØÖㆎ‚8[ÈÈY¿ó¬}U¾]ðÀwØ ÿfͱ\WªkΓ F±÷¶<7Wê뵜»úéx«ù>†:åI8å½¹’”ºm{W—ùºåT-†Ö$-¤æ$3‹6h… (Œ˜Mâ†ÁÉTMAò:‰,8È—sÕ/*[úx™wº~T¤i”PÉ×U ß^pOÿ1}þy˜WÄÂêö¼MjÌ&ñ‰=!sbrƒ£»wJ±î0… ¢Ö++'÷”íH¾›'˜©ýø*’ˆ”|¹ ƒ|@ª#5¾Ò&wï ó_ %™³­4 Kð=ÇeSéN­jô3»0à ´üQ_½%P›ð”­eºÌIJšð‘”1þб¯U™ŸàBÂêzvQwôDHÿú²ÿ)¬aV¸x! ßn{Ê!ÀÕ9A÷z³%·à<*äêØe"blôQjêv^)•ÕK3™³ñ»+£»”òž›q=½*#ýØÈVÂíoˆ \¢0Ñ ®CNìTÍSñèxIuÞîZ.ÇËN–\Ãâ˜kÐÛa´óÞ!)먓¢6„rh&å<^²L Ìžf¼)Íû³|¢'åŒF-cÕ¾nMª£ÖS´B—÷Þ¼gØ`­Èl9â;<Ü¡’WðpÿAç%½VsÊT¶”íái‚\$Ù¶lÕuƧÅ\†¼þ¤íòÐ>^±RqZÈBõ[&(«Ó¼K‡Ut#Ìn(¬er@‹[CŠxÖò$>š ¢R²Ô[“$LÆŸ¥d{ìMÿÀ}Z–8Ÿ½CðÝvø¬ñ3‹ØûÏ'f;ÑŠM’¦°‰©Á[ZC·Ql“ã­uWÍ«Òážc,ïÒ¶š2„±ß?êå%ousÖ¹¡w°y–~Úê±Üx¦X>&ý0òŠVq帪ùÓOQ¹"V,ßî3Uoe–+6*ê3Žƒ‰ižÓ‚ƒÖgT]úsNÜò‚inXNø½í|¦Æ5 Hm±ì!PŠìšÌåM›»?Q¬?doþéŽC ƒUc2?þæDÒ)¶`„3=QLÌÕaä‹Ý>cVì}²RÀÙTóa‚Õ£)5.åDÂåÂÃ|b$^Ì({®‘YFŽÞ1ßò˜€FfµÆ ·¸ /߸J|òñ¼*µ)ƃ‡×ëXgøè®{Gyø¹§³ôG{ç€|~C‰€´Íp½ŸP9/sF‹gOŸ¯H8*½N øaåWÀ×Ùø6çøÇI!’¯ β‘¹¢žÃÚ{ùb²ÈþJ¡#&Ãh7¥%QžÇWŸ)¤Â»ežÊ›Ç¡;T«C¨¡fGãØXÛDŸ[cU!ÞÆçžÔkõNrEª®;Óøª(üZå±y\ ?¾ý@É)åW•æ´©àw,­wñ¹¹ÎØ&~î\„Oø´\ÍZ+±ÇÔÇyrÆ”{¨K¨²~4F„È,‚§2kÛñ³`c_猬…W¶ó[ž-öûLé¡¶ê8ýɾé«9:Üsî–¤u43·\+Ë^ÕðçdäqÌÊzç·‡wÖ  Ð ùë C¾„Խߚ“%ó¥NˆBJ*Ï1¢i¿2ÞŸÚ‘wwð½3Ö4 ÷ {-Âו'T9¢fŠÏîØàí7õ…O#¾Õ³0kÎCn*â8ÇĽ~[›ˆ¦hž¿‚º¾ír:&†ß ]xž«è$M-:¯#}|ZïC™Šèœ_Iw8?¿vU&¥ÒsľwÔÄa¼P;ìÏ>§ûŒ(ð,äᨚµïÅ€…‰kén¡Œ´Eè.oæ¥'¤<Âk¬Š°\•œÓÃãsvbŒ‘y•gtàHH=»yÓŪSWýlnµÏ—Ǻ*áÞÖ…=áàÖ¤žyÓc¥{§¹ëûDû²b†N_œ­ÇÓ´Õ‚rÍ䯄÷ˆ}|Zç„¥ÙqE¹)òØü?Ædôù§yè4céîSé’p0Ìÿ¼3uð¦°öî’PݺѮ‚_ÉO¯BúiÓ®ŒT‡û2¬sÆ|™ýCç™Ù;2˜Éç´ùsëáŒÖV.©±„\]m­Š^cxÒÝÔo=|×Ûgq§\”c öYœùÍ>£….wÌŠ§VÙæ¤;žÍç3†¸mhyœ½¨ÝýŽ?‰¤H\#ô1ÙØ0÷¤Î‹h£µN¾¦‘+ð,›û4TóܹáÅá–@k¢ë«…$æñƒ£Ó)ls“È^® z˜² çúú¬Z>'2˜™’Ñž¯¬ß4ÏÈ$'.’x„ã:LJ‚“õéÅ„z‚ÆÛ>ÇËñ4DøF XqI?Þ ÃƒWU©Ù, Û»©“ Ü®¾Í-ےؾFÄÃiší†—Üp‚…«/55dÓÎç|•¤Äœ´nðËUF¢‰R`©ÀЍIâÑÍÊä‹bß›õ!ï76YW’HøÛ9S§oVêÁ`Ò¼Hhg&z}É ÐÃÑù j÷Óô×EáßâuÕɶ9–ñPaçf=±ú²DÙ¾¾QöƒVuºŽ}•J'¤ât6R=ºsÍ9ž‘ƒ®c”yu<ÔC·¼ Ó_—W Ó_Ë:”eŸKßsKYÈ `å2£àIMˆùD´*'JQ ]¾íQ¸ç0ádïjÐûXÁ”2k¼S_·Çp9ãe¥ÓVÏmÄ–êÀjÁ,ÀG6Y:ì|Õ´¸õq¿%ñݽç\ ØhÕ¾×>©c-h¥\–‹A}Uùâ²ÞϸW¢3¢ö¶ð¼Å ºcSš7Î’=Õ±]«ØØá9鸇}mmQ¥ “YÕ7cƒv>:·¦Ú6KP¶oÆFj=ŒÝ¢¹JÇ1=¿ÝèGîÕ¾q¼ÈÜœ9Ñg¼· å©\$Aœø’'—eÊääƒTï$,û;µä FîÂg°£>ŸÀ=ùvû¶2‚3þ ‡÷r^ endstream endobj 48 0 obj << /Length1 1637 /Length2 9719 /Length3 0 /Length 10779 /Filter /FlateDecode >> stream xÚ´T”í6,tw %C§ÒÝ Ò0À30t—¤tw#)%Ý t7¨Hƒ Ý Â‡ïûžs<çÿ×ú¾5k=s_»÷½¯}3Шk±KXA-@²Pˆ+;ƒK ¥¢­ àââáàââFc`л:€þ£1è‚`.`(Dø)ÈÜõI&mîúd§…Ý@_( ÌÅàæâú—!& 6w[T8ŠPÈA êäÛØº>¥ù×ÀdÉ °ýåpÁÀ–怊¹«-Èñ)£¥¹@ j ¹zýW&Q[WW'aNNsG(Ìæ%3Àìj й€`î +À掠¿;ã@chÛ‚]þ–kA­]=Ìa À“Àl ‚¸.æî €+Ì äçó§â¿°[º,@6`Ú¢?‰AÖã§áÃÀž€×\Oܸ~ÿþ}2~¢—âàõó¿æË©i¨¨¯£ÂúwÇÿÖIJB=>ì<|vn>.(Äx:øýwusð?epýÇWb ý]íÓ5ý«b÷ÀôÏr0þ;–*ô‰µ ÓHnÄÅÇeùôþ?Sý/—ÿ?†ÿŽò#ùÿ$ëæàð—šé/ýÿGmîvðúÇà‰´n®O  }ZÈÿšêþ^ZØÍñµ ®æO‹ ±y"3;—ƒ‹÷o9ØEì ²R»ZÚþM™¿å:¿WÍ ©C]À¿ß–'/.®ÿÑ=í—¥ýÓûáòÄË¿T §õùï¼2K¨Õï=ãæã˜Ã`æ^hO“~B|àÓBZ<ÿb2€“u}r<õè°†ÂÐ~UHÀiþ[ô7pZüý®‡Óêp‚þ€ÜNëÿÀßü‡–Àióäpþ©}Jäðp:þŸòBþ€O¡þ€¼NØð)²ËÀéú|êÏíø”×ýšŸyþŸôú þ×[ºÁ`OoÍ_«ð4€á¿6Èd‰¶¼µycWÿ¦ã¦V‚܃}{‚›sà,êUoK†Ô}W#XJôöœ§èí’DÏÜÎÛÛ5¼ÜeÍöúD\ö&«¾o…‰–:¬-6Ù|§ðÄî~¸(»qï(uwšñ@¬lˆŽ[4‡<.Äg™‰ÙœO·ç³÷äD_´T_¿·=Fal:àÀ€Ÿˆy‹B"(ȃÿ¦S"»³Z²Nbv®KÞåL|â0‰Rvï6£”›ocàsx=ƒ|ÓIé"{ÿeú÷>~2%³)À,ÃVŸ ÉÏx¦à‹Ž7AL.cZ¢-ššqÊIVíûþÛÄËñh½‡â*–9~)mš˜µäÊìe€@:ŒþýŒÁQö,?eÓb‚cFJ n,BRÁý‘‰A+FÇÎì{M›Ã¢ôÑ3Ô*EIA_Ñ”§sÚUCqK ·D?R,‹ ë­x‚ö2RR#«¡‰›ŽªÏ‘v$^éðø²åù_?¤ ªLñ×_RÎèr5HäÅœ•ßkÖFé.¦¨]Ò ËP ;5¿;3Ñ\…7bÈ#ÿ©¯eŒUÊ Í׃:Eó6 YiŠÝ«Öq<'A øÃlðÆu¡ZD_³åQ2U uÕBÍŒVz•ø¾¬ w)t{×|7þÞ$çÈ “«½ÇþjÁYÉå–¦&Ê‹ºÉa‹Ã3å Ëú–S)¯ö”1|ö+Ç<€âJ—éc·n ö²Ðœšlm®D¤ãO~´7 ŠMª*" Ràä/Ù°®èiô‹¤ñ¦÷›ç[à´ü›÷d©TzÁÎÌ‘žõ’ù“u3Unù{<^ØßxÎ[@n¬&1 lUøÎ$Iíbr\ÛFõl:€œYM“Y¥ ž°•79ÅÇSd÷l­ÈbÆ:¼b»©Ÿoê"+Å“è„I*”^ ˜âÀ(7u’¿h‹ÖaО³0¿± ÷–+—¢Nßn´D Üȼ}E…šΙ§â¤MºïX®:°GÝfÁêmeh—  ÏåíJ¥UÃ?ö ìØ²¡ Ö{sß8<M7O"·®ëïA™°j(Cj>И]Iµm Ä1sP' Øs’²¾}x‹Y8‘dCüò±!¥Â)¡Û¡à›OAØ'K£üþ㨔m†–îª v¹í·Û2Šáoå q¡|"Έq•u±@æÆÆ¼C<\’³VTmôÞ]• &íJ® „`tKùÜÃ!RÒ8n4…(~Wà@F¯–jP|•®`¸È›B»g”Š—Äý4}õöäÔ´Ëî›ð§Mv&WyFÕä€M}0+Ý…)ƒ.Þ#ý0s ëQÇopfvÑËâÐÉ™‘?•:j®::¬ïóç¨T+ôó Zp&^&^|3ù®ú“TAö·fÇÅ…ô´úÐ%×xm™x®atS©Gæüj‘î¡:ø(¾E¾K<˜ÜC˜ÇçkMà¡ÊûÑöªqRw“G¢0$ø"ŒÚ5ÆY™Á¾¦—‘ráUXŠôš&9_c¯I<§š!¸Ì¡”§`bñÅé¿ryÈóû‰±gÌS/ZjÁÐ6cŠ–îj÷´¶žâX!¹!<œç…çßIBÚÄYÅêî2•çù 0·© 4•›O¾TD»äË('Ó¾ˆýZüسæ,Õ<Œ2Šh‰Ï=”O<š¯2c°ÓþB†‰{uš±™^OŒïª¬Ö0÷LS¹ÛA2ÇÜ=Æ"ò³_¶ßM²ÜûI1“Ñ­¨¨—RûŠžÉÆY ³¹–Z•šÌ‹Å9/gœïU‹Ï¹ŸC’óF»Øsã{$šKÉN( H™§)ìfWEÔÎ||úW®´Ç`„”4¶A,y ɇ‹¾¢ªh,"=üóÞ ±R+œS1î¬dpY+¤&cÅ‹íýüÄ÷òõ;s­¥ÓÒìŠwzÀuúEë&†’ÏelWa‡Û—(:‰_\/÷O‘Ò-Íb?ÝŸÜÞû9×ÜàdÜWÜ 2ÌÒ&:’r—$ÉZ ŒÈ.¼ûŒ'Y-ˆ§æ”²”6"RžZTÙSH®Bhž¡taSJÄ'p…£Ú¨B–÷ÞAJ‹šJèww“JêI°Óz*å*HÄ–šìᇭFÉ‚ ›ÔŒ­˜j~goÑ,Š&jÔ… V×Ï4À1kí<0X„é}—:ð7Mïc_K ¥uÄh)y“à¼!¯¸Æ‹^.†lbÏŒÐU¿ Ëg¨QšõÙ¥1&6±*3û7¾xûŠŸ¬:LN)- "çc£ Û¿ùÄŒ”8f1ó…vQÿð†¶…³ŠÈj‘®iMNaÑ4-ËìJìÊ=¦>7ø¡K‰³J+~@èú.×ù·îeRÁ<ÿ´ ½ê"„Hò}þDç§#3¡&ûz†’ëä³ð&NMŒAôùd¼†·zñƒÛ"VÞÞY}—¯íÇ ®¬W˜DfÆ<ŸQšåíÚ^~:Œ9Ê ^Àd*êR¼rêa0=|ŒïD¥_ž,!À’ÆÚòÜñ2JÿZiP{l1ÝS’¢2ºQþÙ¥zøŧ&+Ì} un‰rÁòá8]é ¢¥˜xPŠuîÇvÁ¥€wùàÕq´k/ ÍTžOÌG!›z•%¡ñ,g~Þ’JÓ–vY`‹º%q<˜b±4pf¸OÕÎÖê(BmŒŠвZfê ׎ŠKùvªMñzÕR¾¯åjòJâÔ{Ý(øx)¯_=3 }ú§§WÅ:?þº¬%s—[„{Ú—óRÃ¥:9R3Q%¯l™¢Éál®ý†^+fjÚAËdƒÐsgо›»´Ø×Á¿º²ð~Öm·\Ϊ û  Ww¨…-~6y“ÑÈŒùBáNd-Üm=¾èKˆrþ"Þ·KTöÈû8Ú¾G$!ó]YýQÆ®¹×kII|0ÁúåÉ!5U±b9²Ù6u‹tû:ê T.™h"NÏ£.ÆM¹^ÄÅôeì(\ºöæÉò`nì Ç¤¼áŠûšžëæ Tv)Ðà·þ¯€˜À%½«}BìY·v,‘dËÆr‹ÛŠh­X ~Íóɘ<{8-‰½!^ÏyOktÓ†=ÜÙ­zR)?Àßï®cY ¼úÌ<ÊqÖÏDbй'ßÇr”Ù³Ò4T"VÂTÙžž#Ú]fªŽ”ž—ø= ôºÉÐ9FA.}¹ÀBT›ýe»tü*Íbò±m oFáA÷åWÍmpyÆ­f*r‡‡‚ׇ\­¦ØKÊ®ë±%ÕÜË$G5¬;Òo÷ÚåfßÇ]›µýj<ÏíJëÍ”0ZèUp»¦#œŽ[JŠ9ÉRkCàÜÄ t)ÛC²[_Ù1åTh2r$î0­4¿êÁ˜‚Ü,HèJýEÀ§* mƒ”ŽÏYP¦Bõ:yñ’ÎhíØm¶˜×f µ%ízÙþ¾‘âeFqáØh‡X%{AOÏq POûZçs•E£å\ºRñÔ ’wÑõZ(¢çÀ¼©TÞW’óêkúdfëƒYã.W¯k9 Ú’ýý518LQ1~’bÑÚ¦Nö÷÷˜vñ±ßÎebÜæ¸²~èN„D½Xaž @°e‹í²äÚ¹õ£’R,Ç'»* é9œ¾ö}œEN5ÉÁÔ[°Ê·ä«'˜£€¨‚\uÀ¥]%ÊEQRŸ2d±ÁrÐRÃ)›h~á2Å„ÍÁ«+‰Õ¸“ ¬¥`£¨ÜGˆQJº˜}Áf”å™'‡ÐÖgY'½ÿƒ÷²I=$ —)ZŒu€9æàc¸¯ÞÙ]üä8¬Ôت ^ È Ï»³ŠšNV¦™îŠÛÔMZÅKZ![nÿ©íQ–Ööe}l™QnýQX¢¼Cdß®b–ôº³ ÛQÂd±Ò»Ú#8–«áÙÛA-7µ³í|­W1QùéìÁï\ðt>º+¨eÉf‚Ã{„¾+ob±NNíÓÍ©…7<òXân ¥}z¹Ý ³tÍ(Üû¼ùOCC¶ˆ‚%,?µ¿Ó¸Aa‰%k©_©,ý*S Ý6 ý1ŠC3S¥·KÚ©wuÚ²ŠU¢/^óûÈwÃe97L„º_:>g¡!;#¥Éª“m?ɶ1‚” eV^¾Æ?˜DÚ¨¿a ‰(Iâmk¸ózÀÍüÚ¹+ÖšÚ8WçduíГõ!ätN̲GE¦v †Pß¹PQ@ "c_ç¿çª1\”ƒYì*|Àz3«‡gB¤‘žÜ¦²,ÏàȑٯÆd2/Q‰W=AœÓ>æzçÚnÃnú¼§«7¸MEÓ('”] ¢9øÞ„™&;HùÎŽóÄ?«FtnÅC2ƒ˜Ö· KO Z?ÍRÈé>%Ó“®Qð\>ös÷s²-wú}IoÝïÏ7¾A®mˆýhßF•µWãïTÇV¯äonÊÆ6ÓÌÍË¢-9 ¯3Y Í+ïÿ6ÜÊž Ï‘“î\ŠäÅñ¥µ‹‚Ø>vÁ*µ¿§a÷éº ‰ñž±á[Õû÷wé{ÏLäû´i¶/çqi)éX *ôy>‘@ß~o'%6)îžúY‚¾5˜žÞqr*”£Ñ£í%lh„¨>·ý‹®p/î…áõ!7Õâ »[yÔþôj%#\ª² ª“œºþò—êGň±ÐgÉ¿ÎJyûJ€§¯ì9Ce¤âU üAo&œW¾:4ç­t’s÷ä~1ÞŠm`”®y^í{´¹±ZE'aÿ•&O®þ¨lºŸÖsÃòËKtBõÕÓÎò=Ó1_ÀA }|]!„ •Ó™J?`xY /Ý'öN#¿3 J²Ifå|Wß-Cæâ~£a–’OA´¥I ;l—»“†Ù«®Í`‚Q<Ð ) [AYð­·+õÛs¯´{ɲó/}x/A_Á9ôÌös‚´b.#£B¤âq–…`7EªÛd€¦cÃà~Fõ¹:÷ÑÚöž ò²]N\é¿TÎôÙqÚ[&ÆsÑ|]ŠÛXª'®{Q5 ¶ÛYÆó }?NXúb¨µæ×?éÆþŒÓ‚Ê2Ò~ô7ßÙ(å©Yéö¦Q´Ø053Â@ƒô‚ù:£ºÝŸ¹¾ê¾»§Q”ðB-é3#}aÅHÀx‡É½5¿£lÙ‡—…ÿâ ûÀÑmO³ØmŸtýýžm-éÄð €È.Lä ìšàðªDAÿÖÊì1´bô3¢KÄÏñûH·Ñ=œôª z´ãG˜Æe‡œèÄÑñYÓðÒÏ¿uNä¦NsPs’᥵ÆêX†¿ˆºÏK…—8² ¼ËP5}&&½…Ý:šZC‹÷êÞ1èËV^[˜Ç”!õ›È÷t‹dc^¥l%8}!"h¥÷p‹EJï9…z3…)ç|˜-ý„­¢”1ô t›‚Œ5;õ»KyŒ¯s"õƒä‹gM©KÅÇåYcó£[‡¹}[+Ãéd¦›Íö)dÖgBAa¨Ä©Œ•‡4ktKÝv%W¥«ã!|iE»öm¹ãèl"úWµErŤõKÂòþc{ópLÒk·,oë¼X ‰1¾!СƒWçêµ;‰ZؤHt2èûƒ ¢K m_³²†_ƒ–ø7Ò¥–‘BÖ{Ý…Â,.ÃÈM†smÏæ3ÜøýMIÌ-Rf›Ð œO¯"7Ï}3f°ñóBvËîuiŽ ëcmLÙ¥³—ÌióÆ¢Yˆ±É ƒ”àÖrßÙpÈѱ…ÏÏàžPK³-ZÓš0ùò=†ØJ"E‘ä•ò&Œ“<,A5¢?vÀçÁ·ÿJ`UqúÅ« ¡çW—1ží`cç“í Ù,~®Á}i£‡m8ä“ÔÓËqŒ½R^b'C®›ËõHßúšœóD­\6A]†F “†:Kœ(Wáª9äTסü%löÊ%)¤˜;uúáÈL‚·Ö%‡F9CžÖBR®¦õC¨& Q{ý³¼ -GG^Äù”˜P£Žƒ¦+X,$Ò ã[?Ç~|mo/EA¼¥ü~Mµ„‘3h¹íýîZ[ŽG Dâ7w%›£0·fÛ«[àÙ%["â 7Ø‚GÒ\ŽM-m‘7úF»IM±ZåzT\nÌ!crüþ@´k½:áÇjÆÕÒCŠœ¿àÛúWPìÇm¾#Jꦔ:òOç'“Û’~nþB÷V«>àLúñc”ö„ƒ-ÇÂ\WHµš¯K9É"?FGæ£.yûÙ{ù-ò„m?ÉTðW«Ÿ:æLBÔß-C>L–Åÿ´ÊŸ'Ù*/lŦ3å®à©ý¨ªðqë$=hǶÕûõ—8Æ,RÄŒ¦4v£íKXtMuñ1=Ãd\c€÷JîvwîK¸]çµÁ„»)ñÏ›º=³zAž™sïÊq-™wùF Í5’ð„ °²LpúFàìïOj®³½yÆF\•™7"ô*{Þd‰ÜoSìøøë~÷Ý—¦œ6íSžÚÊ€tŸ‘¬ö®©)¸~qÛMÓŸz¬¤ÛcSJMCÛµÒ2ù…õ¼±UCDUD\jæ\á„# ·ml-ê•5 ô÷^}ç›A0×Ì6mFîÑ•üèR;LáŠxœ _BÏ!oâü eŽÆkÄv´+¶ÜIÜ„þ—Ÿš£¿0Mhøû¬ë‰O¡@ä¨@s{ÈÏÊpÏ}ŒÝ¢¹ª³owdå3Rk_Mß+Éí³b5)©/²ŽŽE¢{d ×f¢8S¤HflnÃ#¼ÏñLá^® ¤QÞ:ž+·ßATXf=¤!k^ŒÛ¸ŽÜœÂ0§2¥©¦Îz´w%gdÔçqw¯ÀïI˯ e‚/º™ßÝØxÞÌ›)?Ô¥¼Í2œK“ªÙÛQ¥8äÓònd™VVkk¦Èñ12É´M¸%WƒºX2óF:—Uóé%oîKäjH”_9~[kývæ„nêÉÔѱó¨ñ@¡úÍîȈÕõÕNÌ`Ò¸ÅÄ÷‰§Y?+Ç8@õ'­6ˆ¥ËlÝ(“™õÕ÷Û4ÛÓ“Šùr¥Öù“ß.NˆºÂ @nŸìÃbªhßÐf~.#—´æÝjA³øá‚—s¬ ÎÀÅ2æN˜K<…E4—_ŠŒÃpʈ‘[‰B •Õîž6kà$_šñyå-Al»¥‹£¢mj7ÐÖZõÓj[3ïn$Þ,2¯/æønBKÔÚ@cùïNÚ‰‡ï_ªª‹ ˆi*òõ½‚m^¡%HpC’?µõóúÂÑf~óÎì,V[>§§½ïxžáÿÞ¶ÿå‡ÉýhȉWƒìk4v"ÊŽÁØiEÝ¥¥ÀÇóeåð ¡Ý<_–žögͯ‹è—qÞʾG{39%4 \Xî†Y/üæy ~,2unÓMC4ŸaŸ¶zœJqYbà¯e:ÏFîE{uö'ú ÏH-9áÖMÚtåËZxä¦9‰ ŸPÐàL­8 ‘D}F¥'xÖñùL²½ÞYBëBñÔ}ãÙ«–¡;Òv[#¿#ôâÍ’ *Ý’G¤~öMíÉG8rájæAi©¡·`.ïWoÌG-|ëì>B1³söCU{$…ü>w\íÊ“_Óü9P\ì«aƒ˜Ÿq!7ªýœ1ûı’‘ú»_;a0E(ù Ápe>~±0–áòsd¡”-d幯!vECõ¹Ý=ÑIT¢Ó³ä^ËHíLù-xüTc+ùÙº6äÛG,4qp¨›ß´¶ê ²‘B=môkgÜM‰Øu^hYóùÜ£IZ’Ý&ÙzžsºN› ]fÅøÇÑ~’£þ4f×샃µY6orÇb§ûÂݹ0+èÏGü´ZoÏ®#uQ5tñIçäN_Ù)R°b¼LI~•^màÃ-ùáYdÎ/ !'9¸&Ï#µ[㉦nüÐÆïÜ~H/R{®â”ê³ã×ÓshR]õË Y ®ñ5k÷'ÑÐĦ ûwceê¦)¶šÁ§Õ‘RßA/h1ȘúLã=U;gdÒ}þF`—Y`R•©¡¾[õéþZ߈õeâ»:ýªjî©{Ú¤÷l¨ B¥šxf›k‡+›’Šò1õÒ÷´Â9¸ûâð¬.p+Ö¼>.*Ãå5E«^hd6é5"Âx+¥ûó¨ƒ\Ó/ ün#CÑ£Åú¨:6hiªŒjÚ"1}Øö)=#qzP¢˜.¯žÉÁŒåÎT͵QÀR’¼å@5¹ê$µu±ûqFEñ¼_ "³Å|o±ÅQÏËL/ÃWÒ%¥^4±ú%pÚâË9}érÙ<+¥âD²ñxÂÉVw]‘ûòø!žÐÕPâ`¬ÃFÇ/v-í-VDOë€ïÔ‡å­rµŽT[XÏ~²9L¦GË “iß a‰bÐ"tº……g–¦äª…ÈÃo’U|%•>¼6´å]/³Bf¹:›‰Ÿð÷9®îÙ7ÃÁ:`Õ¶Ìŵ²N²oí0Ð •Èß´29ß¿;_™“ŠÎH|ÈÙá)g6éÉKW¸‹¨X² æù•q ð‡Ü PÕ;]žyˆ‡ÉÌÁ_^Œ·f&Á N¸¼4W ÍðD ,Åvc}æR2«ø’ï‡ÈæV^¯j':ŽÉ˜uiãÈm“|8í£æ”:b¥i†ý Ól|qå3¥eùŽL'õÛŸàäoòXù_¿Y×’R³U”уîƒéΜ­1jaŠù9v+^µ—×;©µÙQQC¶$Çã»´ŽûܲçëŽO‡ÒÐÉâð ðÉ×Ý"繫Ä*æveEm|ÔQ2 X†òW:ѯÄIÍ)ÐÁßÅFf FN[IÎèDÔÐÞ¾)Õ™ƒ¬\ ô“Á¥Æ¬mVHl¦å¿©Ôt-¶:CKýuÓ¾Âtþ°ÉŒ2ྙ¦2‰<#Ìf !r±Nµ-âzUOÔï+ïu"!ezزÁI·¢­EÊï§ÕÈØ—[c0ÓXË}±ÆR1Ck‘æÙºî”¸2ú.¼ ÏüŽùm?r‚0Z–=÷4ܵտ©](höÍv¥ùsn¯¤ÊZq ‘_ú=Ý*•IèÊzñ^§ ×¹­¤MË|¯™+¥ ±Á5ÆK2É*»–{ëbFÙÉe·^‡¾p=îƒzo¹S`šÚ:¢ÆkÆŽÛ+m¾óV«(¹ZÕiSl½¬ö È µùîeøØXšÊéϽkÎc]<ÛÏU_kÞË Uȯ#iÏu«™ö©Ú 4x+–ŽÁïúÅ| 4Å‚@Ù‘Qš:öb?]u-Ey‰UµWs ¾…Ð ^þöÝMµMgÔà ­ãki5…8ÎèϤóÎdA1UŸ›Vs¾wm%fbxŒBµ:¨Oµ”>… ~¼³Ó¤H’ÜcjvV©¯A‰SMC€ÁÙ4«×¶5+rõ¦<>ù}gÈ'šgVŽÝgÃáüל_y®‚5Æ8-.HßÝõ/Ù0Ï(sbž¼ÉnÀ?äÚ¹¼5ÏšÃ5¨4ÝiØðk3H Jr@…Ó!<îpwM$ d°µÔ~ë#§Ÿ†d ¿˜Ÿ$JÝp†ÄÖ"ÜXÐ8f4Š;,tç¬Í•ûŸ æÑ$pd$üCwøÛzBh¤F¿ô±«Øeúkb3` {î¶Âó³ÕŠAïí199ñ¢ÒpÇÙžy.¢MiïŒ7ÁY2J•0¹¢Ø’ðþ*Nˆ°_|Â+Cu,:wÄ Òž+Çs„q4u …pà"ö2pe:¡å]Iôf¶¯½²ˆ \Ñ} _¥ä’ú0Õ~[•< T—5‰ AÊüNµ:ìc·)òzT{sÙ‰èçó-ïÄà9º/X½ ! åÖÕOMx1­¦hXýPü+DðWЮ⚿0D¾=Î`†ÃùäÒ?Þn“&¾‡«b¨ÂÖ¸ƒ®yÙ…¡¸ QT8¸ûÌ‹¯ ZÅ´­8ô¸­³\üÑx\íZ‚ˆýlÅ¢Ç?ìC€ÐgM hØç²­ÚÝË#?Uð"[¢ %¬ø›h•úÜ{33ƒO«ú£Ïýû™,¥ny5>ŠzKK|öµ}7šÈ³Ü²U p”¹öò“Í+ñ •º»šyâ'»•ù;¦;µù:¬´¡599>½ê¹‘œÐÎTpáÈ‹]мëªôøGÿTXGw·Ý; ,×’§S¶ð-ãW‚Ìõ»sM‚ÝÇëºî=z†çºA\'0•ȯ}éé‚ô/Õæï5›™1}öçŸÉ4¹~Ÿ&‡j/i×I,Ù€ÏIü2¾TÜ—=¿é¸d߉ÙS< d˜Ç'dgûJ¡ìÀMቛéu`[á®ê±-çR>™ZÄ2òÓª"lcã9-×¶Cýã­…/ E©Q„NøðrÎ23Ä”ÙvŒŸÂ>æšo:ô2 H0FíHÚ IãéÙEeÉÁ_ÁÖ•î§'¦,ÌôŠ—„¶þó‚W¿h¦Tõ +ìuߟéhœ¾aªkÇCU}z•* •ëñœÈ™ŠÊ$e·2c©= ë¥IhÎ$èǧ¹ÉöîÞ–Ç øEKÇÚ. à²t®õªd,ÃK Ù¤­‹³$Œ~Í<5–“üØ3`ì=I…@ΧFÃ4gžŸºU~¶™«ÝgÛ¿PMÞJ+Í7fꦶ’ÂݶGyAUv°JZ0¹P©Ç_D•¦7ø^¬h©±á¶hIá5¿²Š6\E_ 'ùIÝ  öL튄É7€bÐxkƒŠÔo®§ O÷ø'ßšRæBØ#¾Ï½8f‡Ù¤"7‚ƒæu{Ž5Ýü\~'ž³‡:÷F’ÝÏR^3ßýÚ¬Ë[‰-QÈ«ü(ÕëgÒWJu öñpB”’Þ(> äq9ŒL,®H¸8!á–±JÀhÏe–ÎWnaLœìÄî™w¡{i¨uîÉìûÑÌoDYRÚ+&+Nâ¥qЦäuÕîàE6àøÅdšk|IÏ*ȡӊCS`äž\–LÿéÂËN"—CNÚ§¯HÈž½°™qÇIÝÞöSs؉Óó¥#lD•nQäèïøo™/ý6w:Ç­œ5~ŽEHBUüRº@$fȾZÕÁ;-"tj.»N.^Ì-žš~2ÄÄ«¨•v?´<¯Év¤‘„xyl,£t^ɸÐMÕ…á:µö2 둆ž5;ÖË^¼Ñ]¿-%˜í­KÒÄÉ(w¼¶ˆ×¨³›gûí]åÛa%?¹›uð¬ÿ]"u£)ÓÉw ©Põ’IR‚h•ð‹ª OžmëŒUo;ìi,Ó‰õ¤ ˆ´Aœ·G¬…¸ƒ›8³^¨†;†»¢Ž9g4›5Šbcâ¥\HvýTpì,i(ÆF 3GäÚp“0"P Š‘›1e·-eÉ¿ÏÖ™6º»cu³¸Ðûì¬X ]Æ9¯ù×`±’’&¶M8WX1ÒS òÅÑ3¯„ç°|XZعžÚ¹¿»“û˜&Ⓝsï{õ0Àê´aŒàìûàÁ–=ú*뽘 endstream endobj 50 0 obj << /Length1 2511 /Length2 10283 /Length3 0 /Length 11728 /Filter /FlateDecode >> stream xÚ¶TZ.,¡ ÝH%C§t§HƒÔ0ÀC ¤´tw‡€´„¤´4H R’Òw<ç|ê9ÿ¿Ö½‹µ†yž7ö›{=µú 6 s{3°¬=ÆdçH©hj 89¹Ù99¹Ðèé5!0[ð?4½6ØÉbúCAÊ l ƒsÒ¦0¸žŠ= èb r€|B@~!NN'§àÿí„Ò¦®s€ ;@Ñ vF£—²wðp‚XZÁàÇüï+€Ä ò³þe°;A@¦P€Š)Ì l?dj xa‚€aÿrÁ(bƒ9qp¸¹¹±›Ú9³Û;Y>cb¸A`V °3ØÉlø™0@ÕÔüwfìhôM+ˆóßü { ˜›©'l! 0Ôná5;à‡^((ÔÀп••ÿV`üSøËÝ?Ö?A ›‚@öv¦PÔ`±Ôd•Ùaî0V€)Ôü§¢©­³=ÜÞÔÕbkjWø+rS€¬Äs€)<ÁÒs9A`ÎìÎÛŸ)rüt¯² Ô\ÊÞÎ …9£ýŒOâÁËîÁñwgm önP¯€jnñ3 s-(ÄѬ ý œBûÍY‚a^NNNnNØvYqüt¯éáþKüIÃ3xåå`ï°€'~±Ãÿ¡y9›º‚0'ð+¯?ÿFh@ À‚ÌÀ–(Úoïplñ7†7ß â0à„ÏÀùóï×·—ðñ2·‡ÚzüVÿ«¿*/”´uXþÎø—LRÒÞàÅÆ `ãâæðòðø¯þíDÝòOœ¿- öÁ¿c…éñºþÓ~ÆVƒ ðo_ªöð™¸!'/'þüô¿Lþÿæû§—ÿÛˆÿ7 Y[Û¿ÄŒÉÿ?bS;ˆ­Ç? ð‘uÁÇ_žÐÿªê€ÿ^Y°9ÄÅî¿R˜)| $ –¶¿Êq–…¸ƒÍÕ!0Õ_ƒñ7­õsÅl!P°º½3äç`rrþGß+ üÞp†Ïã_"0|mþ}¢ doþs¿¸xù¦NN¦hœð1ââåxá‹hvÿk‚ìP{ÜÏîÀÂÞ ígCùx?©¿?€Cê7pHÿBüœÙ߈À¡ü Àeê¿Àñü7âphþF‚½_Hn§ÿÁO7ý…¸á§›Ú9À'íç]ñKîÍÔ€ N »_<×OÞ6ˆ³Íoe¸ ³ß®bf ²q¶5u¶úŹx~ÒNÜpÂɶ[Àþ yÿ¡ÿè_^Ó6`Ø¿ô¹ñÿ1€Wô ñÂCÙÛÂÛÿ+žŸŒÝïJüœ ó? üHðï.ýDŽ.ðÅùU9øÑð–ÛšÚýaOÞâW±üí.´üùbÿ('<Žße‚ßVV`èpò„„õÞM›? <Ñß!òÁ3²ý9׿åð²ü/®ðÇQðû’Ãþw0p]øsú‡ž€Ão1ÜÖþ¤AÿÕà?ì¿ÛÁ >dð§ëU¾¿8ˆýï¢óÀ æ`ëòGÀðWŸÃñwB?‘ Øù¯Mþå›ç'i››ýÑÁÈÇ•ÿ(?^Üß§ñœÁv ïO°ë=á…;q†¿¿Â†g÷Ÿy“û},üBæ€Y9~ÓpÀÜìÿ0€ûpùÂéú„GæöÇ–À­Ýÿ€p÷@xŸ<÷ä vúû¨Ýj 'x£`=;ð+ïø¯Ÿ`°;„67m~m]óºå¢J‚Ìm}„‹³÷(üUgM†Äuóy€”Èå1w~ĬDÇäFÄå2ÞWÉ}ƒ.§Ñ’wj„Ñ\]ËC ³UVï1<Ñ«ge® ¥öv}n¨¹%ÑF~·ñÏLĬއëS[r"O+ÎßYý@a¨ßeÇ@‰Œ@y" ÀøºU"£µB²Zâód›ó‘øÈ^<…ìÖejÏ ï·ÞùRVÈJ*Ùö6¦ƒÒIÆö³”ï|¤J&c€Ïôk2O®cNZ^û3š9©Ç!^’³"‡Õ~Ó‰PjÁ¡Ò¤áT’î«ÄÞ¨œH O/ˆ@±QÐJZ(±à`ÑQåsŠ«žç9/iEu<˜Òy"ÞÑd^ûn(R-'ªg¥HÎ[ÒÔÌÊã;ï#.äȹ!.âôv‡ÓV¶…š0”ÚƒÄj¼l©Õ°ŠeΙ8WøôÅå5¹¸0ÃJúdzáú†,ÑdÂ{ü°ôˆÓ%»7ŠÎºç~oêÔAˆ×"z•H×EùÀ®C1_ihôãJu׿û¤×=Là‡U¨re d´Œ”µ‡—,¹;ÈöõrUÎé î S3Í(¸Êµ=ú°·¸Ø•rnŠw Ý5ÛÂËmo°­¥˜ðñþ1%Ü -…þ˜x>–Ê‘h&T&+úIwŽäÁËëá­ÏòRAèÆŸL‰›tÛ“©‘ í5Ä= H¥HùÂÊ5L±äõV° Æœìxv¥óœíñÓ~•,/XÑo²óÕÛ™Q–¼;°Ó*f`„Pñ]#Nëf¿ÅNhÓžúÍj×>™4®õ,´ÀLåU±á®8÷aÐô¬¦X,㌊ÝdÏ+(ãçUÇAåò!ì9„î]úŠ€hتNl½»’u'c¦ï=‚Iø›YÿNóééSåÆýWªÓ5OŽä& tK5Bu",Ά1|ŽNåH¯«0&‘«ée|Ä##l¦ë(.>=šF¹{}nÑSêu4ˆ ™¨»^ä›9aOLú ÷­¦ö.=£Zøž‘0a¯7¿n3¼®´¯w·7;—„ úáC ‘¨ ~0 ·Ðp6¶• õŸó»ax8ªØÛJ‡Ñ>8Žà(iè:a¤!ÜÕ“Pup?H²Ëk ŒÍp9ŠàWtô#ø[€lðXPó±ôý«‡HÚ»²›.*ÂM5Mo™ù¨‘Œ@eœ bÂuu?ì¦uï*7$ÏŽñBÃ_W¹q¢ÍÜà-=3웾•xƒ5²y·èyø.,¯{‘º¹ZÊ„?Ú§j¿¿­W f ±þ2:-áüµg,[·ððC]쵿UDNösüa[¡˜šº`+‰%TqõC·¼pcž,7×VSœvÝõ5…ôÇÃÑxùg *.ÆË’×j…øË=ƒÃ:;{Ξ Ø÷4z“[éru[úX++Æwì˜?»FíK{æËvq)Çj'|a׋oWù íÍœTw«›‰`6êeøƒRûl×OÔˆJZ7vñ”?x÷Ÿ %µnVj˜àgX+¼ˆ¨½ÊtöÍ>×YGÈ}D伎òµ" qQÔrˆ¿¶@WÛø“ÈîðX‚º#²Æú~¥¸¤g—±«W§s_ýg÷ŽÊ`¿Y¬©Çcýk+F¹+ŸÂÏóºñ$P[›©³PÖ2Œì–x¦{ï1ß·,½“k™¼0¼M©D[ºV§8 `#>*3Y¤`ç™O„pAg."_pÀZ1< æ¯}™7oÅ¿_žêå@ÀlR;'a:= +þ-þ}ÕkT}÷ %nzɲ‰¡85;¥‡z>‰ÚB×´Kví´Šß5ÌÌx0l-"OåA™žÙg6”â?§)eúÒHíð6Ÿ›ê¬š[?wNNË@ÓôÕ¶ógî(câo_C(}|Š}ó0:ÅEOI³È5sÊò»ï Ð`Ø\˜\·æ–›w”* 4égv+zäD ©«6¯É· 3`2Hß^Åër ‰ú5Éë;“­5Z¶Fnê”ö>Ø&™;š²Á!-ÚïuÅ|…–ÛX±…}*1Ýe †“;X”6ÕÌÞŠ>×&ìkÐ;œ~å]Æ¢y¸`޹#Ó›J¨Ú’rèàA€6¹³Åä¼­H \HÛyg}xêôjø)ΈQ“ù¥ë~€ÆóŽJΤóÑkr_¡·¶¦ü¤2X|èÞÖà «ð¾Lhõúî‚a±%]Pè°»ŒË¨4ž}î™S•îÚ¥ÿËš‘t”aV”TT’…™àΦ†É—è©K:Ü! O×3cÛJM¸Ï%ÄD»HöâÑÝ2¿ýìß¶ç.+JêÊRËbêÞŸëÚkýäÝO\vQK}ù¶€ñdS,my2ËãpúHOâwìtЈMé—º}”pë»'^Ñä:^Ì`ë-_“§9:Qu”¢,4ž¤IWoT¦f§¶e]g‡6bË70„Õê̾¼Rb²»4"‚ q.ÇËæYD·»”ÌwמóKÞW×UÔâ#æœÉìž`f•"û7ï*Oº«Òa= ÂàDûòñ^ï*Rþ¶ÑyQ[îÇú0?*öå#utÉ-ØÇ†Rep¹Êãíçs‰k‘ ·#Ý©¢ª´ ßÖùZ@½ z'ê9+ÎʵFÆU¬‰z:qÇ)Býéo*5N:IfsÌ-ƒb¦l%!z;yQýhæïCpÅÈ7}=™™XÈÉ^ÖØ”ÄgÛ&ÉY¶ÿÊH¹Å¶DYŽ´§W³ ˆ¨ÁÑ™îÎ' KL™øXáÑrµ§ƒÛÚÞëŠ/ÞŒªë4Ëa8ð‰ŠÂ ù»Ý‚•¶þÇx2ê©H""?Õ¥¢‰Eß§õ•­‘P™1‡Yùš6ÓÓ'«öd"JóRUWŠXŸ§G-ކ›jÓÏ ‰¿M¢]¬ #¼Ë¦Ý Ó+¥Á!® x§Y¬k Q){Ó·h&Ì9nÝI¢îDV”@y>”Yìý± iMð/Oä9¢œñâB”þƒqƒÔÁ·Ö²SNmöܽ{ ’v¤×4›”Þ b KØêµ%ʼ¸“ž"X¡½mžÌf§!î?{ë€]ûIýnÖÆ’8»E½t¦F±~º~•+ß­é®þJãqب?mcð8:nš5ß½Ið²7k@âÒîÎ[±—º«¤â|Ϩ9;¶1Oƪ±ÃnA‡ñgŠôzÛžù*ª¥,ÇÉ=Å© ظ{©æŒO+x1qälgÎB±Ç{©*õ8pº^—D{C ÐyN‡Ó• °hT2®fGXßL¼coÉÌ{ ÍóE]xXFš»~ÄjTñàã€Ñ1Á¾‡Ó#Ñ ê´7:™Uõt ömµtm_;«~„¥µãÕâ‹ÅZ´ó.®µæ‹+"(l–GÇQ¢fi¢»bçfòHôkã²cñ›/ˆ¬’ŹêŒ:çÜØéÙý#ÉUâpË^ÏÕª\6㇣߯³èzßG#¨7¼v¡lÛS4!àáÑ·C½8>úhœ¬e_¿å…¬`Kº*B¦ñjÑ*$yk‘+–ÔuÁW¹þŒ±T½*ë±æ¼í%%#"1º„Ûj¼ÅƤYÑè„"ºô{F‰œþ^”>J¬b­ zYdw4 eå÷Q„:ím +íºÝÞ3_MYËVXÍõD×hWH/Ó~“mÐS~ùÌHdz×úÃxÐ;íšs•§’ˆÖÄ%Q7òÅ£ï)j®ÛT”å/Ú¾’‰f=6¡iô¿‹¡ƒr=¬QP±>´w¼±Z Æb"šnrü1=ëÁÿ~Š«/áÖ½©¾v¶Ü¼sÎf‚ì±În]o_uâF„´{¿×­=^á¡‚øBS_KÔ ËŒ†ir¹ü*ùÂl_».®Šî†ÀžòÁGýŠû…‘¾¯>·™7…¥@fFl ”“{½± º žú‹*^˜¼T‚¶|l5סxjÉ×…x¦•€„9Çù=aS1¡‚pÑÙ¡ÛS.¬qu7ˆ¿”t«Kû!3°}Ïq6Ü<8´·£ËI)Ç uv)R.è"èTáh>Ñ?Õ°<1Ü-pé—Ótá¨ì™’ÙBdg·ŽÞ‡Ag ø•%•‚Ç,–BÀð¦à[î—»óLuÁÎbÛ~n›"þ7z£ooÅ}®æ0Pí9fZ:C´OCè(bÚO~Ö+¡@ .çfjôxP^¯0Ðß'«ÊÔ–¿H€ht´T@ø´•b©NBÁlÛÒ‚øŽVÅʺémÒÚ,ZhÚØ¢rÊ­[û–MwD,ûdè Ý{UGÿÐÀâƒWöùR/Û]‘ÂËR´…q7±Â`×xΑ†…¥ ¾Åvë磟{mpW>›íOQˆacwBr9L¶M4b†nZ<§Û?-šIFaš ‹–PTúv8uÙáÁdg¨îñNѯô±Æ"í_É—Ú\žäØ)e¯=4¸›‰Õ?OÙNÊÄÃJÇ~ê¨uÄ7Šf($^Ó:Ú"[‚1>®’3ˆ xÊ¥“:c f㎕“äYÛyÞ¬UâgûЇ¶ckÜÈj&.B–Ï-PùÈÖò>ÇOî“‚C$ÓÄíntóÃôͤïCV!¤öÇ–ìØ<ï!I.£â8>±2qF×ÑÞú·|é=Ð72Ä™ƒQí%é]·íå:œ­â*ÌOmî•)'-Ц›pâT ¿=8>þªO³Gïî-_ƒY^~£HÔ,ËÎ?Ì÷ʵÙg‡¼§™hF~Dvk±«PÍ;IŸoZïÛÈcó¡õJúËï1Ò‘C…ªâ±•¾ã­ºMdväÍ—‚Êè×ÃÑŽîD»Ÿõµ 2MíH>rWò{zô´\„»3¹ZæJV`ýìF–±_ ó…qz ˆ•ÀiÜ\dMìÐ#æpf-éOÔý¯œc¸Pk¼1‡ë¼#E©2W«·!¾Ä9/ˆÿ‰lïMÃýK&9äIBu}Pl–ÎG^­ígba 8lNèU¸q ôO$ì†%7üQoó´Méß?!F¶;uæ>â·¡ÏûÖJ£8öî8|ÞL—øæ†¾ŒKåjäø$[=\]A˜k=B`,JsœàµÅÈ{vîN7àJƒ”h ëïu[Gõ²‹KRµ!OQDŒÅI<´pÑ„(¹û—…*oÛ6Ü'O„îò£ZQÝ"#g”~DûžcLOzªõ²°,º%P¼ƒN¬¶ŽÂ´VÏH¨ùn…ƒxÁ£$ :¤@®•~4L§YL¸þÙÙ§bûoÅ‚,îYS„Ã&|é;cœ6‰_BÐ_8sƒwFîC_ •Íeæc–RÒ\ÕÈuÛìJ3To=oÜä^gåCöémÕ)Ng;Ú #˜Ò„úWª¤s£òzüàݰ‹òî°¹“–àO ï­‘*ÞXæ’žáöctW¥¤ ‹ Üî.o_H|¸ºE1nÅk“1òj&( +á´|LáIã ÿ|"t—G5³JQ”((ÛÇ5£ä‰á®³µâ¤&vFÕ¾ÊÔþ¦f2qê =”åmÝ?@?«á_ýu‹{H±y·Irc>ÐGm!'z@¨5”öTáØÂÓL9¢Á•Ý<"IXÀ1é.¸FÈÅQ?z³ü™” ÂêfŸøõŽ ^Šƒ!Tß:dŽ‚¯¾ :óÁÈݺŠxÕÓc»`J½ÌTdÖ•*ï^¥8K7=‡ñ¾{°Aœh»e~¾°æóE­Ô²7}p°›²iºÕ¨w/È¡›¥;q€—˜ÕÐAF_0t2nè6è8>¦Ç®×¤¤€#ka¹kHöðZ$ahȺ âá»×¤l@ LI›™ž·‰>ZåN`) äAÏŠ¿® å ` ;0L÷RäñÌzöØÉ‹g‘×L,J‹°þÓǧѸ™ÓØŽQ†ª"œã´¯tV$]PáOVƒ”å_DÂäRÍ¢œ‘ÁR? ÂÆeiI~ôÑBg–ô:•~l:o,ƒ ,bDå)'}=öÞ¤W{2ÝÊDÑó’%ÕuôiõPÛÑ^%jþíLšJð5ãj ï’ GPFÙ‹qŸ¡•q} ÊV-Q0åîG{4+ïú¼ 99©Ÿ‚5ƒËüÇ4É+ ›…{ÅŠJ½Gî6ßµ†iÚ—8‚”¹ÙÝñÂ:_·6àØ·¼hEêã)j÷SZ;¥>Ôçš›Î3À÷!îq«Ò#D¼ ë@«y²½Öó´ŠFORO=Vê’÷¤˜Ô-§!BçŽ8®ÇüÌx¤qAoœIŒœî'ñÎ{—»ö@Ã7Ëè5n3™áJHNì–KÔ.ýjv;¢ÎyGÕwÞXK’Z‰éA8ým2^=ž¨å7ãÁáyM•t¢sœ{‘ÄÂHo*e¸âñ;ãù.5#»ã•#ê<-65ø& e¿ê&ˆ^=FÁIûTJ[t¼£PÖŸÿŠl6à<ÆÑÆÎ€¿µÁ@¼µUü¸”6 ½ÕÓºÑ[˾8Ç€tF¥çAõÃueÞfeuÝ+ðÝéšmxÏx à(Èn¨MRºßàžt¥Ç–ýF—dbÓX]^ÇBÁµÓ ‚ÌV‹Üž7eAs#Q-Üë *°6KûP£“ñqNq*ݘ’Éæu(}o´ú}oÝJFmztñ `n;ºƒíœ—jìóFZÔ„E—‡ï$MñK™;MÝdP4x`^¨9))Ñ,ÄçþäðM¥Õh>:;Ô‡K¤`Åè}öZ%õìÌ‹s°—1*DýËêwê˜-¯0¬çn}"ˆ¦ŠÉ¾áý/¥„P22x,I¤—(ã a-ÛØØÂ°?AY:ÙöBÉEs_u³¾° ñAÕãQ(‰»Dºõ†ô®£So•л`9¹ UÉ/Äü•Fº3{æ¾!<¾šXž½Ë¢Å ÌPbå$æ¿mÔ,NLUþrfYÏj'«QQPÓ)¤q£IÞ:7@¹ÂY:‘Lò xá<ñ’ïJ÷­‹;ý^O±ä¢,r†ÊêÅllAuéûºœ+pòf³ÉIä³-#ÖÎóÖ§‘<ß,•§ù·N] ¯Ð[4Äì»nœüð6×:e•[^ç ©åYÜu¯S-åTù>zW'ì]³HW£ìg{¿N$£(w˜*½¶í,üœ®º|»Ek@L’¢^/kŒ¡$‹›ôIؼ€›¬¸ãÇâÄ©Ñ4úBU4GåêbÍèqU¡I¿{Ü£ƒI‚0YõÒ£éšBõ”«zpöã5¶ÕŠ.wõ\wñ¾7©'Ö‚©û±óÑ®/—e¤í2ÛTra÷Ùgo©°zP£J h³¢–O‰´p^”tžÐqS½Z›Á—ÀÇÛ4 XÞÌNAIqÒ=Ãî¢dÑ÷\‹œ4\‡´Ô0éD±ùx¸|Kj«Ó°«íë“*Ñí„\B„=«Sa‚Ô 7æ5ç½ÙWè«Å¨¦ÆÍ§;ÐgפøŒÅxÉfv-±éÀe?È.±F,‚í0ÏêöôóWu; ÆBÏ!ˆWœ˜{Tð´¦é㵇˜ñIH ªz CI¥8@\\$4(ùià¥ô[}g°Îfq ÿì·*þ¥¬—ãÌÃÅ”aÃ~q>Ô iAôúr?œU!`"¤×”µ­|7òbFiªå ë"eêVW¡SÝYŽÞPIç/êé*wñu|À6£¬X»«FkIÖµJÔjy¨Vv$Ѿš@…J2¢Öz"aŊȹílQpªoyï¬xHW–¾Ùºcb¹õêÐ 9gNÈ‚÷ii—Ù ç«’ƒ[vºl4žXzÑ‘{G.nLuýGT¯Ls·?Z€õYRÁ>ÛÞ¶bmø,•¼Îù9]NäNä÷ {õ«GY¾M28êCŽüc:¬E.L0‚yèèõ²+3Â'e#ûá³$o{qI©OÅÙX.°Í‚ ƒµg •??÷[ >Ÿ4äÙó‹kòø&£ÿ9ÄÛê,‡y×Ñë=ŽjÌ—w•Yò%ÀÉ0 Dõ™¾Á«S_Þ÷æí퇬½B|NTx«,¡¿Q{’þP(tkC›IöÜÿFƒ µgÕëuZÊAä6Cl¡»Òñ{*Â…t. ²xŸzzíMdTê¦51Ê®ã³Fú°¼Áá>F©ƒEZZÚ¨ióž| Išùö¥± ÷ ¦ê#·  É¥¹¤œI¢V¬ÏV+]‡ëÝzj¨XÎÚd›YÇÛ¤7ã=ž1PË—²Ûb Ò©2Tò3ä+qÛ©zÑSÁÝxÎŠŽ¾PGîb—½]Ó¶?°û4Ú”Ïl¡V°¯ÏWu%-Ÿ§âÇÛuꜽ€´ÜDËÉŒ‡0nÚÚ [Ouf3uo÷JïÅý~¬boøýEééÌ´é’ÀêëϹüž†Âzˆ‘¨Ú}Òo9‘cÖ4_”•y5èj‰‘0X0—3ôæžÆúú•+’2)ÐC-oÅVžK%5™s3zÑ9A{܃›òÈ]墾<ÿIRº#ùRíÓ] ì®Ókº¨ßµãTŸ=l/YdJ³wÉé÷Á…­3æ;)“ؘ¾›Îßø½™À'ã²­ÚìXšçëß¹ÅÇ6Q#Mg½r2@SuNoßFˆÉ(À@Ê¢þÌe.‘í»óTOásU‚ƒ‹ë>(TåGÈKöHAâЂÁƒûü zÕ=´"Òw¬_cÙ©üÚ£ó“¾]û «ÇlÊ[¦(”,ú¬y¼LsG=gÆÞç\´L9OwOQÖã\k›°ûPû´­¼ÄÑ»ÕÐcÙz¶°VÊ$}mÔVKé1+¶na]8Ä×C‰”š3¿f Jªóœ6~5ªìv-C"%YÛl Ô”µËº¢`ÃEɬÝ.Q ””¥¾,{2; £%!aô/ñz¾XÅU¨n- êv¾ØP7›§ûœB¨¿VŠªe}‰='•9t¹‡Ö{·ÑqqÚd7Ħ¸¯$áò áœ•!KÉ€€T ¯ïËë\_zx¨CÚ{*MÃ[£IÍØ<‚¨•Ýz½Ÿ¦ÃÓe˜Ù +ªx¨©ÞÝ 51BL^´ïZíx¶Â âZöÀW åT*õº7È£\õ9"S{‹1²¦¦—O'è˜ÉIo×$åZÄf1*€ >˜±J]TÍý©pŸVËËÀ·ÚÌ‹xyR)9ÀÅ?UœÅR?ËIhy‰ª@³JP¶Ñïé’&`Gj±½Þêi*±°³¯J¨UÃ`ÑÕ¬™áGùœ ~ûªZ÷j”vÖåÛÖæ¹‡¯µå†J}é‹éŸÚÏ€iùS^»zøi8ËZ£““A~>B0À$åÓR™`VUðˆ;Õ›” ߌƒ¨;º3<,·Œ­AÕTþ ´w§%DÏ{|®tmYªÛìÞoѯºrIÞ =©ö³B¯shçZâŠhŠ ¢ø¶—…TÜ–¸áñ–\Ò“Æí%~'­Kyœw¿OáÖÁ‰ýêGeT…î;ßn½qÄt5+5VÉÚ¶z¿¬–ìEŠñ´XWÐ’« ²¯„Ù«EŠ]Oî6ÞiiN£ŽFŸÄÀ¼öCb¦\©g QñGQù.}ÝÊOL`Wbü¹0†œt ©Ïm‚·/QŸE -_“o©Û>r1o©GÓÚ2Ge‰ÆSl‡‰ú¬b~×Ë”–³3³#ß 1nÇ ÆÀÑnÁU?¬kžÞpô{åU¿¢{ð¹¥k²éj”sÒ=H(¦æ|¯K„‰³Snr6“Ó¯ö¸'M,Fñ\d0»ü)‡º¡HÄ®9‘«œŸN-ø|¶Æ1®DÎÅLM¢ðZ7.71t´RYùŽ&ÌÇ‹ÛVpèüÌ¿HE%_CHˬÊlY%±w>Õ÷>‘ ÁyG6ßÿh÷r óyܹ٭{WNÉg]”˜Ô|Ǹ'9£=¹»!iT¹#—åZ&®\oXr½—ç'¯Ï“ù‰>÷†¯æ­wg2h¤äe1}“:|´åßú.sòˆÆ6o„ô[ÅçÚ¾`ÞV º»ByãÃ~Jy^‡RÌ Téá³ï³|êÙDÄÌŠ”'ý$‡è Œ©’ó¨3«¢YwÌtáßGÄ¿ â }?%-Äüe*t¾H9²’êÂ’´r“Ó:Q|:‹gß*+9 D·wý¡Â‚`œˆ4³-Èo£h,¤¡‹™óA•Ã:ÃǨtŸ& ߬sŒT'â3óí¡EÇ*ªHÇÔ»^ò-ß9ßGÎÊþö¹Sãòf‰~ÂAäÜù«Ø•§œÀ£¤U}aVñF+¹ ó:Á2û°å´Ö$熮“Ž2à„•¢eV ’Gä¬Óèì>}ÞÉÊ×îVËʆÁËV3‹0»nàS ÌbFÚô¾á'[½µCªì5.šÐUóÇLžšÁ^µ ¯9p<ÀéŒyÅ$í#ÃÆÕ3V ãR1ÉÒénZã>ONæi’BJ_8ïê¬]“\ªÛöW¦Õ?'Wù†ú!ômÛ÷):œ®&S;§Ñ.Éû÷ñ/w¨{ƒÃ¡)ðä©SðjÊ ²““^¼õÂ’5e©A'tSîÜŒœÔ¾Ë÷ñÚ §\j¨õŠfWÇe ÉàEP„rƒþ²¦Ê­§‰·–,¦²»„E÷í> _­V…“[0o 4 ¥G$ &Öç)J[î)mP]„_Y$Ìêpg†…îÄòè~S&±àž`7z÷r-iDXö©jÊ×ÙJF½Hý®èvw ùŒÜ’n = oZfìºÂwoOÃê…íÒºt¦èøÇI™D0¥”\yJÏqÌB¥ƒYÛ*Ñp–x&¬gžI‹›¹t½åWšî„ èœv¤7û$Õd1©÷A¸~að` 3j5~Ê(™t̽:cù•ªEàL]8{†â5:«Ø“ÊM½#Ÿ©|·Å5Ôˆ%¯:^ð®p!È‚Mþäaµx]\Œ Ã[I#;Õi’B}¨¢3]÷ök¶0¡ aÆo fx?Þ£X—"»Š5Pl¥V‡J§OÐe\ £@ÈÀôjG=r2§…F²¬Ï _†©)<µÚRÞ¢åšGß—ùpGê-æü¤·O«XªºQ­yJ}ßÖÖ¦ÿɺƒ‰6»cÛå˜8™“mÛP†äÕn‹$¾zËÈ„S¬"{Yk² ½ã-ºïí£Cô§å©¨^:’ÄÄ~Ý ôÙí t xgòƒÅÏnÆWaªô±΋DŸþL< ½7NÔ¢óQ$d~;2xFåž´¦(|å­ˆ=S^/nÔËQT2—Õ+ñÝYu^N¿ÈšÛQñ»OŒ‰Meþ?—íN‹ endstream endobj 53 0 obj << /Producer (pdfTeX-1.40.28) /Creator (TeX) /CreationDate (D:20250703135409-07'00') /ModDate (D:20250703135409-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.28 (TeX Live 2025) kpathsea version 6.4.1) >> endobj 11 0 obj << /Type /ObjStm /N 38 /First 285 /Length 2540 /Filter /FlateDecode >> stream xÚíZ]s9}÷¯ÐãnMµ¾¥*jª’0&É@€â¡qšÄ‹· a~ýÞ¹£¶qÀyÚ­Y–nß«sïÑ‘lG‹J(‘ ±BWA(#tJBa’Ê ½ÐZøÊ m„G3×!íÀÚ‡ö`ç£Ðð´ðÑ“?0d+aàŸ/F¡Ox5Â:¯…qà<a‚pUr0)œQf`•pÖ`pQ)0^CcƒðÖEa“ð>Á¤ðÎD°ÎU‰àBQ„PAtxµ$<D¬‚Z‰¨XÑH/¢…%:GX""¯ÁÚÁýûyüõªòE}Ö äîärÖ\ÎZa k‡yØ´“ùtØ´B8hNGõÎäZ¼­`Àƒ¿ô»<>…çÐ?šýþ;yÞoâþ}!÷‰Åè ‹É]À¹èÂú¹ëÎ=+Rîa*êƒgùb:53ñVý`OÈãæz&Þ-‚~Žr+xÌê–^â¹A¹ô³K+K÷ÿÀÒW×+÷ kjQ‡|ËÃYö}Ho•Öz Vô6Tf+nUåÜ–[¼§¶¢0ÑnáÖS[jm“g}gCµ1nKçU…îìÎn&G vaUUe·´³Qm¹Ü²IoVy@Púú•¶\· ö8Dá–G{tÕVZ Vf£Š°Î=®Ó*!Kkõ–GMÁq~‚ãܧª3Ê®ÉEîGƒÉ ® “S Õ\ñ[ÊÇj¿—-rkXô{õ§ñ/¬é˜Âµ#“ÒœMÅ[”±œc<ܧh ꉀ~¸U•×D]zY;ƒ„÷Ë ï´HÎÂ*¬ƒ•…yw”:c± †Ù AvÓP›ûXc@+¨etš¸HÅÂ]å ü†Û`#˜( tÆå­I•€1O”…Ï%§Àe¿´,Ó[R$/«{Þ~¥-×Ö£f…Eá–G| M›a“Z1ÙàRG[ËÄ–&jÚ‰Žt1zìKi)ΞÉCîƒÊù\$Ž’ãR b¯zÞ¦D h\MŽs‹~¯ú4Þc…GEÈéáÒ1— {¶±ÊRSWÆr–q?Û¾MøŠDÜài×mÔK_QüD'µ§TÆ[ZTÜ}ØÌ>R¡húMxIñ”m¬‚&õã ÎU°Ýñ®á6–{dÅó„:å6‡,fáX[ø¹u™?ÒfEË‘zp5³E7ÐaÃPcEª‰9p®Fø ÃV–¤>Ã.K2 I¡Ó-²OÍ[šúŠ‹“Ê©…MNU-†<ìþ2¡eJJ@<ÂÕÊ5+Fr‹ñòYçÒq™xez²g‡¹d™Ca1Xd*ªÓŠò—åäÿíÿL‹ªEÌâ6ó¹5 –n· vÁ­üç.Üà†n„Éæ'TEW¥È’Ç^á²\á&æXhͽÒÊZôÊ-E,=ÐGîkuëþç§»UäÕZC KÇ0:ü¢¸àP1qxç šÁ ñeéRëèÉD7>Ÿ®Á4‰Þ¡!÷#]o8ñ-ðÚ™+i˜WAm |ñÊ}Ñ_FåÜ¢š\›Ü×!òá'x´¬±¯|7µÈOvÖlaéúiµT›r–sÅ}niïŠïðÿƒ¦NGW³É”¿xV_ÀÌóWßìîÿ¶{°s¢*˜×g­°l±C_(Üs^ÜÓP7 ^««w¹ÝñkŸÀr·¾zÔŒÎÎámô‰apîžÂÉýY= ·/ÏÆ÷G³æâ%8‚™“üµè㼞âÿ’ÛrW>{r_>•Ïå y(kù^å©läùáÃH¿3y.Gr,/䥜È+y…ßrŒ›3îMѱœÊV¶ÍÅh8O.e;®Ûs9“³óiÓȹü"¿Ê¿ÿÍ8÷F°:ÓûŠä{iÛ;Ü~öšÓ×d-å¬iãî&kZ¯ÍÚd‚é@Ü3DØCg7AwòèÉÑöC@w°¿Ü2'è›ÈÛЙÛÐÝC*0¾ xF•ð†“‹‹Z^5ÓÑäT^˯=d~dû?úó9 ;ôk€U `Éü °®lh¶Öpý±<–3Çff:}2ŸfªìÈ>¹lðœ .õìËÊý™)ÝL'½ìÄM²³}òôÍ_X÷ð&;a‘­ï$;!­Í"åÝ KL¶ÚÓá˽ƒ‡/Ó*›…¼Á­ôn0ù[+þ@þ!ÊGò (Ü)Ü‘<–'ò5° Îg páý´~lf$i¹Ï¢†$A9»¡Jói^o¤ñØ(sþõê¼¹æüg•;ßËL¨«ñ¼•Ÿä§yÓÎFæÓ|2kÈ–z…°öäô†×ÈÁÚ´õàÅá³ÔÖ£×k6)ˆO²ð©îõx¼ßT Ê÷sâãôzñM‡ãf8¹ú:õ@m$©û/·¼"PëxÊ“œÃ{!Ý*»ž‰õt:ùÂõ<›65Ô–‰4nÚ–z=¨iìá›Ç'Ôãu§œˆ ‘½³Óc½Ì¢¸v¢zÖ]®º“òóò™b7R̓ã'/±´ÇÇëîUÁ÷RQX¯T-¾íÐj<ï7˜Åõé)ËŸ +¯å”• Øßm}y*ëv8!£çÐÇÝ~D½‰á-ý¾ž’â4öä]¿±$5×Ãq}Y?[0lU—m?$N˜’[EêôýxE£n.ÍgÚŽ®7Ô-·æ¤BÌßÏè-Bvê¶¡ŸÕV.Ô=ÚàÏÁô{ÝÞhÚΰlp­ȧu÷Þ½ÎÎ[üyãàK×Ò¥Øn9v¨ÊØ*u±µÛ<öÒ¥q)vXŽíb·º‰6Ý¿Ö-…NßIyÚlºgꇶj9´MEhWDö›Gîßl–"ÿ8ÏtÜ<ôÒ½{…gÊ”±ÍMhý¥î¤K¡Wh¦KŠ›"´ý‰„÷¶¥ÐÐ,ýDÆû‡L?¶[á™ée\»Uù†¤á_´øgsˆ>¶â-ÕÿR†^(±K°[Ãé49°ƒâ þ d`ŸŠ endstream endobj 54 0 obj << /Type /XRef /Index [0 55] /Size 55 /W [1 3 1] /Root 52 0 R /Info 53 0 R /ID [ ] /Length 165 /Filter /FlateDecode >> stream xÚ%ÏKÁ`ÅñsŠRE½ê]U¯-؇‰¡-X‚M˜HØ‚Û#‘؃Y§&r®É/ÿïææ&|À§ªž˜ˆ±ˆÅ@ EŸ¼}lo*2Â!¼Ôf9‘%‹=‰‘pE^„'ŠÂ%QÉÝ®T‰µkU#¶g«:qœ[5ˆÇ˪I¤«\ü?Ó"—;«6¹‰¬:äþdÕ3òúù\á>‰Ù endstream endobj startxref 119895 %%EOF asymptote-3.05/doc/lineargraph0.asy0000644000000000000000000000055615031566105016033 0ustar rootrootimport graph; size(400,200,IgnoreAspect); real Sin(real t) {return sin(2pi*t);} real Cos(real t) {return cos(2pi*t);} draw(graph(Sin,0,1),red,"$\sin(2\pi x)$"); draw(graph(Cos,0,1),blue,"$\cos(2\pi x)$"); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks(trailingzero)); label("LABEL",point(0),UnFill(1mm)); add(legend(),point(E),20E,UnFill); asymptote-3.05/doc/logo.asy0000644000000000000000000000115115031566105014407 0ustar rootrootsize(140,80,IgnoreAspect); picture logo(pair s=0, pen q) { picture pic; pen p=linewidth(2)+fontsize(24pt)+q; real a=-0.4; real b=0.95; real y1=-5; real y2=-3y1/2; path A=(a,0){dir(10)}::{dir(89.5)}(0,y2); draw(pic,A,p); draw(pic,(0,y1){dir(88.3)}::{dir(20)}(b,0),p); real c=0.5*a; pair z=(0,2.5); label(pic,"{\it symptote}",z,0.25*E+0.169S,p); pair w=(0,1.7); draw(pic,intersectionpoint(A,w-1--w)--w,p); draw(pic,(0,y1)--(0,y2),p); draw(pic,(a,0)--(b,0),p); return shift(s)*pic; } pair z=(-0.015,0.08); for(int x=0; x < 10; ++x) add(logo(0.1*x*z,gray(0.04*x))); add(logo(red)); asymptote-3.05/doc/errorbars.asy0000644000000000000000000000162015031566105015451 0ustar rootrootimport graph; picture pic; real xsize=200, ysize=140; size(pic,xsize,ysize,IgnoreAspect); pair[] f={(5,5),(50,20),(90,90)}; pair[] df={(0,0),(5,7),(0,5)}; errorbars(pic,f,df,red); draw(pic,graph(pic,f),"legend", marker(scale(0.8mm)*unitcircle,red,FillDraw(blue),above=false)); scale(pic,true); xaxis(pic,"$x$",BottomTop,LeftTicks); yaxis(pic,"$y$",LeftRight,RightTicks); add(pic,legend(pic),point(pic,NW),20SE,UnFill); picture pic2; size(pic2,xsize,ysize,IgnoreAspect); frame mark; filldraw(mark,scale(0.8mm)*polygon(6),green,green); draw(mark,scale(0.8mm)*cross(6),blue); draw(pic2,graph(pic2,f),marker(mark,markuniform(5))); scale(pic2,true); xaxis(pic2,"$x$",BottomTop,LeftTicks); yaxis(pic2,"$y$",LeftRight,RightTicks); yequals(pic2,55.0,red+Dotted); xequals(pic2,70.0,red+Dotted); // Fit pic to W of origin: add(pic.fit(),(0,0),W); // Fit pic2 to E of (5mm,0): add(pic2.fit(),(5mm,0),E); asymptote-3.05/doc/latexmkrc0000644000000000000000000000046615031566105014656 0ustar rootrootsub asy {return system("asy -o '$_[0]' '$_[0]'");} add_cus_dep("asy","eps",0,"asy"); add_cus_dep("asy","pdf",0,"asy"); add_cus_dep("asy","tex",0,"asy"); push @generated_exts, "pre", "%R-[0-9]*.pdf", "%R-[0-9]*.prc", "%R-[0-9]*.tex", "%R-[0-9]*.out", "%R-[0-9]*.pbsdat", "%R.pbsdat", "%R-[0-9]*.eps", "%R-*.asy"asymptote-3.05/doc/linetype.asy0000644000000000000000000000063715031566105015310 0ustar rootrootvoid testline(real y) { draw((0,y)--(100,y),currentpen+solid); draw((0,y-10)--(100,y-10),currentpen+dotted); draw((0,y-20)--(100,y-20),currentpen+dashed); draw((0,y-30)--(100,y-30),currentpen+longdashed); draw((0,y-40)--(100,y-40),currentpen+dashdotted); draw((0,y-50)--(100,y-50),currentpen+longdashdotted); draw((0,y-60)--(100,y-60),currentpen+Dotted); } currentpen=linewidth(0.5); testline(100); asymptote-3.05/doc/histogram.asy0000644000000000000000000000066715031566105015457 0ustar rootrootimport graph; import stats; size(400,200,IgnoreAspect); int n=10000; real[] a=new real[n]; for(int i=0; i < n; ++i) a[i]=Gaussrand(); draw(graph(Gaussian,min(a),max(a)),blue); // Optionally calculate "optimal" number of bins a la Shimazaki and Shinomoto. int N=bins(a); histogram(a,min(a),max(a),N,normalize=true,low=0,lightred,black,bars=true); xaxis("$x$",BottomTop,LeftTicks); yaxis("$dP/dx$",LeftRight,RightTicks(trailingzero)); asymptote-3.05/doc/cylinderskeleton.asy0000644000000000000000000000012615031566105017026 0ustar rootrootimport solids; size(0,100); revolution r=cylinder(O,1,1.5,Y+Z); draw(r,heavygreen); asymptote-3.05/doc/penfunctionimage.asy0000644000000000000000000000076215031566105017011 0ustar rootrootimport palette; size(200); real fracpart(real x) {return (x-floor(x));} pair pws(pair z) { pair w=(z+exp(pi*I/5)/0.9)/(1+z/0.9*exp(-pi*I/5)); return exp(w)*(w^3-0.5*I); } int N=512; pair a=(-1,-1); pair b=(0.5,0.5); real dx=(b-a).x/N; real dy=(b-a).y/N; pen f(int u, int v) { pair z=a+(u*dx,v*dy); pair w=pws(z); real phase=degrees(w,warn=false); real modulus=w == 0 ? 0: fracpart(log(abs(w))); return hsv(phase,1,sqrt(modulus)); } image(f,N,N,(0,0),(300,300),antialias=true); asymptote-3.05/doc/knots.asy0000644000000000000000000000064115031566105014610 0ustar rootrootimport syzygy; Braid initial; initial.n = 4; initial.add(bp,1); initial.add(bp,0); initial.add(bp,2); initial.add(bp,1); initial.add(phi,2); initial.add(phi,0); Syzygy pp; pp.lsym="\Phi\Phi"; pp.codename="PhiAroundPhi"; pp.number=true; pp.initial=initial; pp.apply(r4b,2,1); pp.apply(r4b,0,0); pp.apply(r4a,1,0); pp.swap(0,1); pp.apply(-r4b,1,0); pp.apply(-r4a,0,1); pp.apply(-r4a,2,0); pp.swap(4,5); pp.draw(); asymptote-3.05/doc/lineargraph.asy0000644000000000000000000000056515031566105015753 0ustar rootrootimport graph; size(250,200,IgnoreAspect); real Sin(real t) {return sin(2pi*t);} real Cos(real t) {return cos(2pi*t);} draw(graph(Sin,0,1),red,"$\sin(2\pi x)$"); draw(graph(Cos,0,1),blue,"$\cos(2\pi x)$"); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks(trailingzero)); label("LABEL",point(0),UnFill(1mm)); attach(legend(),truepoint(E),20E,UnFill); asymptote-3.05/doc/loggrid.asy0000644000000000000000000000057615031566105015110 0ustar rootrootimport graph; size(200,200,IgnoreAspect); real f(real t) {return 1/t;} scale(Log,Log); draw(graph(f,0.1,10),red); pen thin=linewidth(0.5*linewidth()); xaxis("$x$",BottomTop,LeftTicks(begin=false,end=false,extend=true, ptick=thin)); yaxis("$y$",LeftRight,RightTicks(begin=false,end=false,extend=true, ptick=thin)); asymptote-3.05/doc/reloadpdf.tex0000644000000000000000000000054215031566105015416 0ustar rootroot% Tex file for generating the reloadpdf.pdf utility to force Adobe Reader % to reload all currently loaded documents. Usage: % % pdflatex reloadpdf % acroread reloadpdf.pdf % \documentclass{article} \begin{document} \ \pdfannot width 0pt height 0pt { /AA << /PO << /S /JavaScript /JS (try{reload();} catch(e) {} closeDoc(this);) >> >> } \end{document} asymptote-3.05/doc/external-proposal.html0000644000000000000000000004621515031566105017310 0ustar rootroot Asymptote Proposal - External Modules

Asymptote Proposal &mdash External Modules

Overview

External modules allow users to extend Asymptote by calling functions written in another programming language.

Users do this by writing a .asyc file, which contains a mix of Asymptote code and code from another language, say C++. Then, a program is run which produces a .asy file and a C++ source file. The C++ file is compiled to produce a shared library file. Then, the .asy file can be imported in Asymptote to use the externally defined features.

This spec is describes a proposed feature that has not yet been implemented. It is incomplete, and does not address all of the issues involved in implementing the feature.

Example

Let’s look at a simple example that shows off the main features. Asymptote currently doesn’t offer a way to read the contents of a directory. This would be useful if, say, we wanted to make a series of graphs for every .csv file in a directory.

/*****
 * dir.asyc
 * Andy Hammerlindl 2007/09/11
 *
 * An example for the proposed external module support in Asymptote.  This reads
 * the contents of a directory via the POSIX commands.
 *
 * Example usage in asymptote:
 *   access dir;
 *   dir.entry[] entries= dir.open('.');
 *   for (dir.entry e : entries)
 *     write(e.name);
 *****/

// Verbatim code will appear in the c++ or asy file (as specified) interleaved
// in the same order as it appears here.
verbatim c++ {
  #include <sys/types.h>
  #include <dirent.h>
  #include <errno.h>

  // asy.h is included by default (needed for hidden code, anyway).
  // Asymptote-specific types, such as array below, are in the asy namespace.
  using namespace asy;
}

// Define a new opaque type in asy which is internally represented by struct
// dirent *.  This is too messy to expose to users of the module, so define
// everything as private.
private asytype const struct dirent *entry_t;

private int entry_d_ino(entry_t e) {
  return (Int)e->d_ino;
}

private int entry_d_off(entry_t e) {
  return (Int)e->d_off;
}

private int entry_d_reclen(entry_t e) {
  return (Int)e->reclen;
}

private string entry_d_type(entry_t e) {
  return string( /*length*/ 1, e->d_type);
}

private string entry_d_name(entry_t e) {
  return string(e->d_name);
}

// Define an asy structure to expose the information.  These steps are annoying,
// but straightforward, and not too hard to plow through.
verbatim asy {
  struct entry {
    restricted int ino;
    restricted int off;
    restricted int reclen;
    restricted int type;
    restricted string name;

    void operator init(entry_t e) {
      ino=entry_d_ino(e);
      off=entry_d_off(e);
      reclen=entry_d_reclen(e);
      type=entry_d_type(e);
      name=entry_d_name(e);
    }
  }
}


// Given the name of a directory, return an array of entries.  Return 0
// (a null array) on error.
private entry_t[] base_read(string name)
{
  DIR *dir=opendir(name.c_str());

  // TODO: Add standard style of error reporting.
  if (dir == NULL)
    return 0;

  // Create the array structure.
  // array is derived from gc, so will be automatically memory-managed.
  array *a=new array();

  struct dirent *entry;
  while (entry=readdir(dir))
    a->push<struct dirent *>(entry);

  // The loop has exited, either by error, or after reading the entire
  // directory.  Check before closedir(), in case that call resets errno.
  if (errno != 0) {
    closedir(dir);
    return 0;
  }

  closedir(dir);
  return a;
}

verbatim asy {
  private entry[] cleanEntries(entry_t[] raw_entries) {
    if (raw_entries) {
      entry[] entries;
      for (entry_t e : raw_entries)
        entries.push(entry(e));
      return entries;
    }
    return null;
  }

  entry[] read(string name) {
    return cleanEntries(base_read(name));
  }
}

Type Mappings

Types in Asymptote do not directly relate to types in C++, but there is a partial mapping between them. The header file asymptote.h provides typedefs for the primitive asymptote types. For instance string in Asymptote maps to the C++ class asy::string which is a variant of std::string and real to asy::real which is a basic floating point type (probably double). Because int is a reserved word in C++, the Asymptote type int is mapped to asy::Int which is one of the basic signed numeric types in C++ (currently 64 bit). asy::pair is a class that implements complex numbers. In the first version of the external module implementation, these will be the only primitive types with mappings, but eventually all of them will be added.

All Asymptote arrays, regardless of the cell type, are mapped to asy::array * where asy::array is a C++ class. The cells of the array are of the type asy::item which can hold any Asymptote data type. Items can be constructed from any C++ type. Once constructed, the value of an item can be retrieved by the function template<typename T> T get(const item&). Calling get on an item using the wrong type generates a runtime error.

// Examples of using item.
item x((asy::Int)2);
item y(3.4);
item z=new array;
item w=(asy::real)3.4;

cout << get<asy::Int>(x);
cout << get<double>(y);

x=y;  // x now stores a double.
cout << get<double>(x);

cout << get<asy::real>(w);

The asy::array class implements, at a minimum, the methods:

  • size_t size() which returns the number of elements,
  • template <typename T> T read(size_t i) const which returns the i-th element, interpreted as being of type t.
  • template <typename T> void push(item i) adds the item to the end of the array.

It allows access to elements of the array as items by operator[]. We may specify that asy::array be a model of the Random Access Container in the C++ Standard Template Library. It is currently implemented as a subclass of an STL vector.

// Example of a C++ function that doubles the entries in an array of integers.
using namespace asy;

void doubler(array *a) {
  assert(a);
  size_t length=a->size();
  for (size_t i=0; i<length; ++i) {
    Int x=a->read<Int>(i);  // This is shorthand for get<Int>((*a)[i]).
    a[i]=2*x;               // The type of 2*x is also Int, so this will enter
                            // the item as the proper type.
  }
}

Users can map new Asymptote types to their own custom C++ types using Opaque Type Declarations, explained below.

Syntactic Features

A .asyc file is neither an asy file with some C++ in it, nor a C++ with some asy code in it. It can only contain a small number of specific constructs:

  • Comments
  • Function Definitions
  • Verbatim Code Block
  • Opaque Type Declaration

Each component may produce code for either the .asy file, the .cc file, or both. The pieces of code produced by each construct appears in the output file in the same order as the constructs in the .asyc. For example, if a function definition occurs before a verbatim Asymptote code block, we can be sure that the function is defined and can be used in that block. Similarly, if a verbatim C++ block occurs before a function definition, then the body of the function can use features declared in the verbatim section.

Comments

C++/Asymptote style comments using /* */ or // are allowed at the top level. These do not affect the definition of the module, but the implementation may copy them into the .asy and .cc to help explain the resulting code.

Verbatim Code Blocks

Verbatim code, ie. code to be copied directly into the either the output .asy or .cc file can be specified in the .asyc file by enclosing it in a verbatim code block. This starts with the special identifier verbatim followed by either c++ or asy to specify into which file the code will be copied, and then a block of code in braces. When the .asyc file is parsed, the parser keeps track of matching open and close braces inside the verbatim code block, so that the brace at the start of the block can be matched with the one at the end. This matching process will ignore braces occuring in comments and string and character literals.

Open issue

It may prove to be impractical to walk through the code, matching braces. Also, this plan precludes having a verbatim block with an unbalanced number of braces which might be useful, say to start a namespace at the beginning of the C++ file, and end it at the end of the file. As such, it may be useful to have another technique. A really simple idea (with obvious drawbacks) would be to use the first closing braces that occur at the same indentation level as the verbatim keyword (assuming that the code block itself will be indented). Other alternatives are to use more complicated tokens such as %{ and %}, or the shell style <<EOF.

Function Definitions

A function definition given at the top level of the file (and not inside a verbatim block) looks much like a function definition in Asymptote or C++, but is actually a mix of both. The header of the function is given in Asymptote code, and defines how the function will look in the resulting Asymptote module. The body, on the other hand, is given in C++, and defines how the function is implemented in C++. As a simple example, consider:

real sum(real x, real y=0.0) {
  return x+y;
}

Header

The header of the definition gives the name, permission, return type, and parameters of the function. Because the function is defined for use in Asymptote, all of the types are given as Asymptote types.

Permissions

As in pure Asymptote, the function can optionally be given a private, restricted or public permission. If not specified, the permission is public by default. This is the permission that the function will have when it is part of the Asymptote module. The example of sum above specifies no permission, so it is public.

Just as public methods such as plain.draw can be re-assigned by scripts that import the plain module, the current plan is to allow Asymptote code to modify public members of any module, including ones defined using native code. This is in contrast to builtin functions bindings, which cannot be modified.

Return Type

This gives the Asymptote return type of the function. This cannot be an arbitrary Asymptote type, but must one which maps to a C++ type as explained in the type mapping section above. Our example of sum gives real as a return type, which maps to the C++ type asy::real.

Function Name

This gives the name of the function as it will appear in the Asymptote module. In our example, the Asymptote name is sum. The name can be any Asymptote identifier, including operator names, such as operator +.

It is important to note that the Asymptote name has no relation to the C++ name of the function, which may be something strange, such as _asy_func_modulename162. Also, the actual signature and return type of the C++ function may bear no relation to the Asymptote signature. That said, the C++ name of the function may be defined by giving the function name as asyname:cname. Then it can be referred to by other C++ code. The function will be defined with C calling convention, so that its name is not mangled.

Formal Parameters

The function header takes a list of formal parameters. Just as in pure Asymptote code, these can include explicit keywords, type declarations with array and functional types, and rest parameters. Just as with the return type of the function, the type of each of the parameters must map to a C++ type.

Parameters may be given an optional Asymptote name and an optional C++ name. These may be declared in one of six ways as in the following examples:

void f(int)
void f(int name)
void f(int :)
void f(int asyname:)
void f(int :cname)
void f(int asyname:cname)

If the parameter just contains a type, with no identifier, then it has no Asymptote name and no C++ name. If it contains a single name (with no colon), then that name is both the Asymptote and the C++ name. If it contains a colon in the place of an identifier, with an optional name in front of the colon and an optional name behind the colon, than the name in front (if given) is the Asymptote name, and the name behind (if given) is the C++ name.

The Asymptote name can be any Asymptote identifier, including operator names, but the C++ name must be a valid C++ identifier. For instance void f(int operator +) is not allowed, as the parameter would not have a valid C++ name. The examples void f(int operator +:) and void f(int operator +:addop) are allowed.

When called by Asymptote code, named arguments are only matched to the Asymptote names, so for example a function defined by void f(int :x, string x:y) could be called by f(x="hi mom", 4), but one defined by void f(int x, string x:y) could not.

Each formal parameter may take a piece of code as a default value. Because the function is implemented in C++, this code must be given as C++ code. More akin to Asymptote than C++, default arguments may occur for any non-rest parameters, not just those at the end of the list, and may refer to earlier parameters in the list. Earlier parameters are refered to by their C++ names. Example:

void drawbox(pair center, real width, real height=2*width, pen p)
Default arguments are parsed by finding the next comma that is not part of a comment, string literal, or character constant, and is not nested inside parentheses. The C++ code between the equals-sign and the comma is taken as the expression for the default argument.

Body

The body of the function is written as C++ code. When the .asyc file is processed, this C++ code is copied verbatim into an actual C++ function providing the implementation. However, the actual body of the resultant C++ function may contain code other than the body provided by the user. This auxillary code could include instruction to retrieve the arguments of the function from their representation in the Asymptote virtual machine and bind them to local variables with their C++ names. It could also include initialization and finalization code for the function.

In writing code for the function body, one can be assured that all function arguments with C++ names have been bound and are therefore usable in the code. Since all parameters must have Asymptote types that map to C++ types, the types of the paramaters in the body have the type resulting from that mapping.

The return keyword can be used to return the result of the function (or without an expression, if the return type was declared as void). The Asymptote return type must map to a C++ type, and the expression given in the return statement will be implicitly cast to that type.

Since the implementation will likely not use an actual return statement to return the value of the function back to the Asymptote virtual machine, the interpreter of the .asyc file may walk through the code converting return expressions into a special format in the actual implementation of the function.

Opaque Type Declarations

There are a number of mappings between Asymptote and C++ types builtin to the facility. For instance int maps to asy::Int and real to asy::real. Users, however, may want to reference other C++ objects in Asymptote code. This done though opaque type declarations.

An opaque type declaration is given by an optional permission modifier, the keyword asytype, a C++ type, and an Asymptote identifier; in that order.

// Examples
asytype char char;
public asytype const std::list<asy::Int> *intList;
private asytype const struct dirert *entry_t;

This declaration mapping the Asymptote identifier to the C++ type within the module. The permission of the Asymptote type is given by the permission modifier (or public if the modifier is omitted). The type is opaque, in that none of its internal structure is revealed in the Asymptote code. Like any other type, however, objects of this new type can be returned from functions, given as an arguments to functions, and stored in variables, structures and arrays.

In many cases, such as the directory listing example at the start, it will be practical to declare the type as private, and use an Asymptote structure as a wrapper hiding the C++ implementation.

asymptote-3.05/doc/image.asy0000644000000000000000000000062115031566105014532 0ustar rootrootsize(12cm,12cm); import graph; import palette; int n=256; real ninv=2pi/n; real[][] v=new real[n][n]; for(int i=0; i < n; ++i) for(int j=0; j < n; ++j) v[i][j]=sin(i*ninv)*cos(j*ninv); pen[] Palette=BWRainbow(); picture bar; bounds range=image(v,(0,0),(1,1),Palette); palette(bar,"$A$",range,(0,0),(0.5cm,8cm),Right,Palette, PaletteTicks("$%+#.1f$")); add(bar.fit(),point(E),30E); asymptote-3.05/doc/binarytreetest.asy0000644000000000000000000000046215031566105016517 0ustar rootrootimport binarytree; picture pic,pic2; binarytree bt=binarytree(1,2,4,nil,5,nil,nil,0,nil,nil,3,6,nil,nil,7); draw(pic,bt,condensed=false); binarytree st=searchtree(10,5,2,1,3,4,7,6,8,9,15,13,12,11,14,17,16,18,19); draw(pic2,st,blue,condensed=true); add(pic.fit(),(0,0),10N); add(pic2.fit(),(0,0),10S); asymptote-3.05/doc/logticks.asy0000644000000000000000000000047215031566105015273 0ustar rootrootimport graph; size(300,175,IgnoreAspect); scale(Log,Log); draw(graph(identity,5,20)); xlimits(5,20); ylimits(1,100); xaxis("$M/M_\odot$",BottomTop,LeftTicks(DefaultFormat, new real[] {6,10,12,14,16,18})); yaxis("$\nu_{\rm upp}$ [Hz]",LeftRight,RightTicks(DefaultFormat)); asymptote-3.05/doc/colo-asy.tex0000644000000000000000000001037415031566105015210 0ustar rootroot%D \module %D [ file=colo-asy, %D version=2009.05.20, %D title=\CONTEXT\ Color Macros, %D subtitle=\asymptote\ Colors, %D author=\asymptote\ developers, %D date=\currentdate, %D copyright={put something here}] %C %C any copyright notice may go here % call with \setupcolor[asy] \definecolor [cyan] [c=1.00,m=0.00,y=0.00,k=0.00] \definecolor [magenta] [c=0.00,m=1.00,y=0.00,k=0.00] \definecolor [yellow] [c=0.00,m=0.00,y=1.00,k=0.00] \definecolor [black] [c=0.00,m=0.00,y=0.00,k=1.00] \definecolor [white] [c=0.00,m=0.00,y=0.00,k=0.00] \definecolor [gray] [c=0.00,m=0.00,y=0.00,k=0.50] \definecolor [red] [c=0.00,m=1.00,y=1.00,k=0.00] \definecolor [green] [c=1.00,m=0.00,y=1.00,k=0.00] \definecolor [blue] [c=1.00,m=1.00,y=0.00,k=0.00] \definecolor [palered] [c=0.00,m=0.25,y=0.25,k=0.00] \definecolor [palegreen] [c=0.25,m=0.00,y=0.25,k=0.00] \definecolor [paleblue] [c=0.25,m=0.25,y=0.00,k=0.00] \definecolor [palecyan] [c=0.25,m=0.00,y=0.00,k=0.00] \definecolor [palemagenta] [c=0.00,m=0.25,y=0.00,k=0.00] \definecolor [paleyellow] [c=0.00,m=0.00,y=0.25,k=0.00] \definecolor [palegray] [c=0.00,m=0.00,y=0.00,k=0.05] \definecolor [lightred] [c=0.00,m=0.50,y=0.50,k=0.00] \definecolor [lightgreen] [c=0.50,m=0.00,y=0.50,k=0.00] \definecolor [lightblue] [c=0.50,m=0.50,y=0.00,k=0.00] \definecolor [lightcyan] [c=0.50,m=0.00,y=0.00,k=0.00] \definecolor [lightmagenta] [c=0.00,m=0.50,y=0.00,k=0.00] \definecolor [lightyellow] [c=0.00,m=0.00,y=0.50,k=0.00] \definecolor [lightgray] [c=0.00,m=0.00,y=0.00,k=0.10] \definecolor [mediumred] [c=0.00,m=0.75,y=0.75,k=0.00] \definecolor [mediumgreen] [c=0.75,m=0.00,y=0.75,k=0.00] \definecolor [mediumblue] [c=0.75,m=0.75,y=0.00,k=0.00] \definecolor [mediumcyan] [c=0.75,m=0.00,y=0.00,k=0.00] \definecolor [mediummagenta] [c=0.00,m=0.75,y=0.00,k=0.00] \definecolor [mediumyellow] [c=0.00,m=0.00,y=0.75,k=0.00] \definecolor [mediumgray] [c=0.00,m=0.00,y=0.00,k=0.25] \definecolor [heavyred] [c=0.00,m=1.00,y=1.00,k=0.25] \definecolor [heavygreen] [c=1.00,m=0.00,y=1.00,k=0.25] \definecolor [heavyblue] [c=1.00,m=1.00,y=0.00,k=0.25] \definecolor [heavycyan] [c=1.00,m=0.00,y=0.00,k=0.25] \definecolor [heavymagenta] [c=0.00,m=1.00,y=0.00,k=0.25] \definecolor [lightolive] [c=0.00,m=0.00,y=1.00,k=0.25] \definecolor [heavygray] [c=0.00,m=0.00,y=0.00,k=0.75] \definecolor [deepred] [c=0.00,m=1.00,y=1.00,k=0.50] \definecolor [deepgreen] [c=1.00,m=0.00,y=1.00,k=0.50] \definecolor [deepblue] [c=1.00,m=1.00,y=0.00,k=0.50] \definecolor [deepcyan] [c=1.00,m=0.00,y=0.00,k=0.50] \definecolor [deepmagenta] [c=0.00,m=1.00,y=0.00,k=0.50] \definecolor [olive] [c=0.00,m=0.00,y=1.00,k=0.50] \definecolor [deepgray] [c=0.00,m=0.00,y=0.00,k=0.90] \definecolor [darkred] [c=0.00,m=1.00,y=1.00,k=0.75] \definecolor [darkgreen] [c=1.00,m=0.00,y=1.00,k=0.75] \definecolor [darkblue] [c=1.00,m=1.00,y=0.00,k=0.75] \definecolor [darkcyan] [c=1.00,m=0.00,y=0.00,k=0.75] \definecolor [darkmagenta] [c=0.00,m=1.00,y=0.00,k=0.75] \definecolor [darkolive] [c=0.00,m=0.00,y=1.00,k=0.75] \definecolor [darkgray] [c=0.00,m=0.00,y=0.00,k=0.95] \definecolor [orange] [c=0.00,m=0.50,y=1.00,k=0.00] \definecolor [fuchsia] [c=0.00,m=1.00,y=0.50,k=0.00] \definecolor [chartreuse] [c=0.50,m=0.00,y=1.00,k=0.00] \definecolor [springgreen] [c=1.00,m=0.00,y=0.50,k=0.00] \definecolor [purple] [c=0.50,m=1.00,y=0.00,k=0.00] \definecolor [royalblue] [c=1.00,m=0.50,y=0.00,k=0.00] \definecolor [salmon] [c=0.00,m=0.50,y=0.50,k=0.00] \definecolor [brown] [c=0.00,m=1.00,y=1.00,k=0.50] \definecolor [darkbrown] [c=0.00,m=1.00,y=1.00,k=0.75] \definecolor [pink] [c=0.00,m=0.25,y=0.00,k=0.00] \definecolor [palegrey] [c=0.00,m=0.00,y=0.00,k=0.05] \definecolor [lightgrey] [c=0.00,m=0.00,y=0.00,k=0.10] \definecolor [mediumgrey] [c=0.00,m=0.00,y=0.00,k=0.25] \definecolor [grey] [c=0.00,m=0.00,y=0.00,k=0.50] \definecolor [heavygrey] [c=0.00,m=0.00,y=0.00,k=0.50] \definecolor [deepgrey] [c=0.00,m=0.00,y=0.00,k=0.90] \definecolor [darkgrey] [c=0.00,m=0.00,y=0.00,k=0.95] asymptote-3.05/doc/asymptote.sty0000644000000000000000000002315415031566647015541 0ustar rootroot%% %% This is file `asymptote.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% asy-latex.dtx (with options: `pkg') %% ____________________________ %% The ASYMPTOTE package %% %% (C) 2003 Tom Prince %% (C) 2003-2021 John Bowman %% (C) 2010 Will Robertson %% %% Adapted from comment.sty %% %% Licence: GPL2+ %% \ProvidesPackage{asymptote} [2024/02/26 v1.38 Asymptote style file for LaTeX] \def\Asymptote{{\tt Asymptote}} \InputIfFileExists{\jobname.pre}{}{\typeout{No file \jobname.pre.}} \newbox\ASYbox \newdimen\ASYdimen \newcounter{asy} \newwrite\AsyStream \newwrite\AsyPreStream \newif\ifASYinline \newif\ifASYattach \newif\ifASYkeepAspect \ASYkeepAspecttrue \RequirePackage{keyval} \RequirePackage{ifthen} \RequirePackage{graphicx} \IfFileExists{ifpdf.sty}{ \RequirePackage{ifpdf} }{ \expandafter\newif\csname ifpdf\endcsname \ifx\pdfoutput\@undefined\else \ifcase\pdfoutput\else \pdftrue \fi \fi } \IfFileExists{ifxetex.sty}{ \RequirePackage{ifxetex} }{ \expandafter\newif\csname ifxetex\endcsname \ifx\XeTeXversion\@undefined\else \xetextrue \fi } \IfFileExists{catchfile.sty}{ \RequirePackage{catchfile} }{ \newcommand\CatchFileDef[3]{% \begingroup \everyeof{% \ENDCATCHFILEMARKER \noexpand }% \long\def\@tempa####1\ENDCATCHFILEMARKER{% \endgroup \def##1{####1}% }% ##3% \expandafter\@tempa\@@input ##2\relax } } \newif\if@asy@attachfile@loaded \AtBeginDocument{% \@ifpackageloaded{attachfile2}{\@asy@attachfile@loadedtrue}{}% \let\asy@check@attachfile\asy@check@attachfile@loaded } \newcommand\asy@check@attachfile@loaded{% \if@asy@attachfile@loaded\else \PackageError{asymptote}{You must load the attachfile2 package}{^^J% You have requested the [attach] option for some or all of your^^J% Asymptote graphics, which requires the attachfile2 package.^^J% Please load it in the document preamble.^^J% }% \fi } \newcommand\asy@check@attachfile{% \AtBeginDocument{\asy@check@attachfile@loaded}% \let\asy@check@attachfile\@empty } \def\csarg#1#2{\expandafter#1\csname#2\endcsname} \DeclareOption{inline}{% \ASYinlinetrue } \DeclareOption{attach}{% \asy@check@attachfile \ASYattachtrue } \ProcessOptions* \def\asylatexdir{} \def\asydir{} \def\ASYasydir{} \def\ASYprefix{} \newif\ifASYPDF \ifxetex \ASYPDFtrue \else \ifpdf \ASYPDFtrue \fi \fi \ifASYPDF \def\AsyExtension{pdf} \else \def\AsyExtension{eps} \fi \def\unquoteJobname#1"#2"#3\relax{% \def\rawJobname{#1}% \ifx\rawJobname\empty \def\rawJobname{#2}% \fi } \expandafter\unquoteJobname\jobname""\relax \def\fixstar#1*#2\relax{% \def\argtwo{#2}% \ifx\argtwo\empty \gdef\Jobname{#1}% \else \fixstar#1-#2\relax \fi } \expandafter\fixstar\rawJobname*\relax \def\Ginclude@eps#1{% \message{<#1>}% \bgroup \def\@tempa{!}% \dimen@\Gin@req@width \dimen@ii.1bp\relax \divide\dimen@\dimen@ii \@tempdima\Gin@req@height \divide\@tempdima\dimen@ii \special{PSfile=#1\space llx=\Gin@llx\space lly=\Gin@lly\space urx=\Gin@urx\space ury=\Gin@ury\space \ifx\Gin@scalex\@tempa\else rwi=\number\dimen@\space\fi \ifx\Gin@scaley\@tempa\else rhi=\number\@tempdima\space\fi \ifGin@clip clip\fi}% \egroup } \immediate\openout\AsyPreStream=\jobname.pre\relax \AtEndDocument{\immediate\closeout\AsyPreStream} \def\WriteAsyLine#1{% \immediate\write\AsyStream{\detokenize{#1}}% } \def\globalASYdefs{} \def\WriteGlobalAsyLine#1{% \expandafter\g@addto@macro \expandafter\globalASYdefs \expandafter{\detokenize{#1^^J}}% } \def\ProcessAsymptote#1{% \begingroup \def\CurrentAsymptote{#1}% \let\do\@makeother \dospecials \@makeother\^^L% and whatever other special cases \catcode`\ =10 \endlinechar`\^^M \catcode`\^^M=12 \xAsymptote } \begingroup \catcode`\^^M=12 \endlinechar=-1\relax% \gdef\xAsymptote{% \expandafter\ProcessAsymptoteLine% } \gdef\ProcessAsymptoteLine#1^^M{% \def\@tempa{#1}% {% \escapechar=-1\relax% \xdef\@tempb{\string\\end\string\{\CurrentAsymptote\string\}}% }% \ifx\@tempa\@tempb% \edef\next{\endgroup\noexpand\end{\CurrentAsymptote}}% \else% \ThisAsymptote{#1}% \let\next\ProcessAsymptoteLine% \fi% \next% } \endgroup \def\asy@init{% \def\ASYlatexdir{}% \ifx\asylatexdir\empty\else \def\ASYlatexdir{\asylatexdir/}% \fi \ifx\asydir\empty\else \def\ASYasydir{\asydir/}% \fi \def\ASYprefix{\ASYlatexdir\ASYasydir}% } \newcommand\asy[1][]{% \stepcounter{asy}% \setkeys{ASYkeys}{#1}% \ifASYattach \ASYinlinefalse \fi \asy@init \immediate\write\AsyPreStream{% \noexpand\InputIfFileExists{% \ASYprefix\noexpand\jobname-\the\c@asy.pre}{}{}% }% \asy@write@graphic@header \let\ThisAsymptote\WriteAsyLine \ProcessAsymptote{asy}% } \def\endasy{% \asy@finalise@stream \asy@input@graphic } \def\asy@write@graphic@header{% \immediate\openout\AsyStream=\ASYasydir\jobname-\the\c@asy.asy\relax \gdef\AsyFile{\ASYprefix\Jobname-\the\c@asy}% \immediate\write\AsyStream{% if(!settings.multipleView) settings.batchView=false;^^J% \ifxetex settings.tex="xelatex";^^J% \else\ifASYPDF settings.tex="pdflatex";^^J% \fi\fi \ifASYinline settings.inlinetex=true;^^J% deletepreamble();^^J% \fi defaultfilename="\Jobname-\the\c@asy";^^J% if(settings.render < 0) settings.render=4;^^J% settings.outformat="";^^J% \ifASYattach settings.inlineimage=false;^^J% settings.embed=false;^^J% settings.toolbar=true;^^J% \else settings.inlineimage=true;^^J% settings.embed=true;^^J% settings.toolbar=false;^^J% viewportmargin=(2,2);^^J% \fi \globalASYdefs }% } \def\asy@expand@keepAspect{% \ifASYkeepAspect keepAspect=true% \else keepAspect=false% \fi% } \def\asy@finalise@stream{% \ifx\ASYwidth\@empty \ifx\ASYheight\@empty % write nothing! \else \immediate\write\AsyStream{size(0,\ASYheight,\asy@expand@keepAspect);}% \fi \else \ifx\ASYheight\@empty \immediate\write\AsyStream{size(\ASYwidth,0,\asy@expand@keepAspect);}% \else \immediate\write\AsyStream{size(\ASYwidth,\ASYheight,\asy@expand@keepAspect);}% \fi \fi \ifx\ASYviewportwidth\@empty \ifx\ASYviewportheight\@empty % write nothing! \else \immediate\write\AsyStream{viewportsize=(0,\ASYviewportheight);}% \fi \else \ifx\ASYviewportheight\@empty \immediate\write\AsyStream{viewportsize=(\ASYviewportwidth,0);}% \else \immediate\write\AsyStream{% viewportsize=(\ASYviewportwidth,\ASYviewportheight);}% \fi \fi \immediate\closeout\AsyStream } \def\asy@input@graphic{% \ifASYinline \IfFileExists{"\AsyFile.tex"}{% \catcode`:=12\relax \@@input"\AsyFile.tex"\relax }{% \PackageWarning{asymptote}{file `\AsyFile.tex' not found}% }% \else \IfFileExists{"\AsyFile.\AsyExtension"}{% \ifASYattach \ifASYPDF \IfFileExists{"\AsyFile+0.pdf"}{% \setbox\ASYbox=\hbox{\includegraphics[hiresbb]{\AsyFile+0.pdf}}% }{% \setbox\ASYbox=\hbox{\includegraphics[hiresbb]{\AsyFile.pdf}}% }% \else \setbox\ASYbox=\hbox{\includegraphics[hiresbb]{\AsyFile.eps}}% \fi \textattachfile{\AsyFile.\AsyExtension}{\phantom{\copy\ASYbox}}% \vskip-\ht\ASYbox \indent \box\ASYbox \else \ifASYPDF \includegraphics[hiresbb]{\AsyFile.pdf}% \else \includegraphics[hiresbb]{\AsyFile.eps}% \fi \fi }{% \IfFileExists{"\AsyFile.tex"}{% \catcode`:=12 \@@input"\AsyFile.tex"\relax }{% \PackageWarning{asymptote}{% file `\AsyFile.\AsyExtension' not found% }% }% }% \fi } \def\asydef{% \let\ThisAsymptote\WriteGlobalAsyLine \ProcessAsymptote{asydef}% } \newcommand\asyinclude[2][]{% \begingroup \stepcounter{asy}% \setkeys{ASYkeys}{#1}% \ifASYattach \ASYinlinefalse \fi \asy@init \immediate\write\AsyPreStream{% \noexpand\InputIfFileExists{% \ASYprefix\noexpand\jobname-\the\c@asy.pre}{}{}% }% \asy@write@graphic@header \IfFileExists{#2.asy}{% \CatchFileDef\@tempa{#2.asy}{% \let\do\@makeother \dospecials \endlinechar=10\relax }% }{% \IfFileExists{#2}{% \CatchFileDef\@tempa{#2}{% \let\do\@makeother \dospecials \endlinechar=10\relax }% }{% \PackageWarning{asymptote}{file #2 not found}% \def\@tempa{}% }% }% \immediate\write\AsyStream{\unexpanded\expandafter{\@tempa}}% \asy@finalise@stream \asy@input@graphic \endgroup } \newcommand{\ASYanimategraphics}[5][]{% \IfFileExists{_#3.pdf}{% \animategraphics[{#1}]{#2}{_#3}{#4}{#5}% }{}% } \newcommand\asysetup[1]{\setkeys{ASYkeys}{#1}} \define@key{ASYkeys}{dir}{% \def\asydir{#1}% } \def\ASYwidth{} \define@key{ASYkeys}{width}{% \edef\ASYwidth{\the\dimexpr#1\relax}% } \def\ASYheight{} \define@key{ASYkeys}{height}{% \edef\ASYheight{\the\dimexpr#1\relax}% } \define@key{ASYkeys}{keepAspect}[true]{% \ifthenelse{\equal{#1}{true}} {\ASYkeepAspecttrue} {\ASYkeepAspectfalse}% } \def\ASYviewportwidth{} \define@key{ASYkeys}{viewportwidth}{% \edef\ASYviewportwidth{\the\dimexpr#1\relax}% } \def\ASYviewportheight{} \define@key{ASYkeys}{viewportheight}{% \edef\ASYviewportheight{\the\dimexpr#1\relax}% } \define@key{ASYkeys}{inline}[true]{% \ifthenelse{\equal{#1}{true}} {\ASYinlinetrue} {\ASYinlinefalse}% } \define@key{ASYkeys}{attach}[true]{% \ifthenelse{\equal{#1}{true}} {\ASYattachtrue} {\ASYattachfalse}% } asymptote-3.05/doc/fillcontour.asy0000644000000000000000000000164615031566105016020 0ustar rootrootimport graph; import palette; import contour; size(10cm,10cm); pair a=(0,0); pair b=(2pi,2pi); real f(real x, real y) {return cos(x)*sin(y);} int N=200; int Divs=10; int divs=1; int n=Divs*divs; defaultpen(1bp); pen Tickpen=black; pen tickpen=gray+0.5*linewidth(currentpen); pen[] Palette=quantize(BWRainbow(),n); bounds range=image(f,Automatic,a,b,3N,Palette,n); // Major contours real[] Cvals=uniform(range.min,range.max,Divs); draw(contour(f,a,b,Cvals,N,operator --),Tickpen+squarecap+beveljoin); // Minor contours (if divs > 1) real[] cvals; for(int i=0; i < Cvals.length-1; ++i) cvals.append(uniform(Cvals[i],Cvals[i+1],divs)[1:divs]); draw(contour(f,a,b,cvals,N,operator --),tickpen); xaxis("$x$",BottomTop,LeftTicks,above=true); yaxis("$y$",LeftRight,RightTicks,above=true); palette("$f(x,y)$",range,point(SE)+(0.5,0),point(NE)+(1,0),Right,Palette, PaletteTicks("$%+#0.1f$",N=Divs,n=divs,Tickpen,tickpen)); asymptote-3.05/doc/colons.asy0000644000000000000000000000006115031566105014743 0ustar rootrootdraw((0,0){up}::(100,25){right}::(200,0){down}); asymptote-3.05/doc/imagecontour.asy0000644000000000000000000000163215031566105016147 0ustar rootrootimport graph; import palette; import contour; size(10cm,10cm); pair a=(0,0); pair b=(2pi,2pi); real f(real x, real y) {return cos(x)*sin(y);} int N=200; int Divs=10; int divs=1; defaultpen(1bp); pen Tickpen=black; pen tickpen=gray+0.5*linewidth(currentpen); pen[] Palette=BWRainbow(); bounds range=image(f,Automatic,a,b,N,Palette); // Major contours real[] Cvals=uniform(range.min,range.max,Divs); draw(contour(f,a,b,Cvals,N,operator --),Tickpen+squarecap+beveljoin); // Minor contours (if divs > 1) real[] cvals; for(int i=0; i < Cvals.length-1; ++i) cvals.append(uniform(Cvals[i],Cvals[i+1],divs)[1:divs]); draw(contour(f,a,b,cvals,N,operator --),tickpen+squarecap+beveljoin); xaxis("$x$",BottomTop,LeftTicks,above=true); yaxis("$y$",LeftRight,RightTicks,above=true); palette("$f(x,y)$",range,point(SE)+(0.5,0),point(NE)+(1,0),Right,Palette, PaletteTicks("$%+#0.1f$",N=Divs,n=divs,Tickpen,tickpen)); asymptote-3.05/doc/pixel.pdf0000644000000000000000000000532315031566105014552 0ustar rootroot%PDF-1.2 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œËU¨`bnf©gæš[êY€™¡%H~¹‚K>W Ê÷ sendstream endobj 6 0 obj 57 endobj 4 0 obj <
> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 8 0 obj <> endobj 7 0 obj <>/Length 1686>>stream xœí]lU†gÊ…Rü!j"5€LdW`V¬©WJC½¨h´¢RÿÀˆTåçBÀ4µQB/$ ’p‰‚%z£ÒBB°´&rA×ݶœíÏvÚnö·=yŸ«/éì¼_öéÌž™Ý9'LÂ[BÙõÙõÙõÙõÙõÙõÙõÙõÙõÙõÙõÙEbÜø„ì"1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìBùû$5^v¡7~øÛ½ìªsYþ:ÙU£bèeÈ7^v¡7^v¡7^v¡7^v¡7^v¡7^v¡7^v¡7^v¡7^v¡7~øÛmrU‘«Z]UìªÑ®šëª9®*pÕ$WÅðÿ`øˆ(dŠá#¢](†ˆBv¡>" Ù…bøˆ(dŠá#¢](†ˆBv¡>" Ù…bøˆ(dŠá#¢þv[\U⪃‘¯çªBWqÕW-wÕ¹µ60†ÚñàÝ4²ËBvsGvÓÈ. ÙÍÙM#»,d7w†`÷ò¹`2á²›;C°ÛTÔZ{aßU§‚Y—VìÚ2jâüEEÓÆ ðŠ¡"»(²ÛzàØñû[îº÷ÚÔIÎ —å]m »8"í¶ŸÚ×4öž…èa”좈°Û~z÷‘e³ úû{Þ]ýÚ½ø×þƒóÊfâÝÊ.Ž~ì¶7¾Ïéæ…ì¢èÇnÝΧ–^W²‹"«Ý¦.¬Ç9¹ÙE‘Ån{ãÖñOO±ÙEÑ×î¿õ­)µ‡ WÍrÕ%W­pUÆîWeF]5ßU‹\•ùÅÝ4W.Ý{cøˆ(úØm®]ãY9ì¢èm·ù­ñqž•ÓÈ.Š^vÏVÜñfì=È.Š^v_ýmÇu±÷ »(zÚ­ý¡zJü=È.Šv¿´ê¸?sÓÈ.Šîv¿ø®†päÊ.Žnv¿}¡¦(jS²‹"c·mõCeœdEÆîç ÛbûÞ ']U±U÷·ª!Ë+–¹*VÑ7ÞÙ=Y±ãR²‹ÂÙ­ã¿Ñ…좸b·þ«Íñ߯èBvQtÙm[]ú0­ÙEÑe—7¤ dG§Ý3On»•׃ì¢è´ûõ¯¯{]vÛÊKKÞ†ì¢è°ûû¶w™ïƒì¢è°»9¨âvá-ÆOÛm}þ™Û¹]x‹qãÓv÷Ö}È»òãÆ§í¾q'ïN†ç7>e÷ÌšÓÞPä‚qãSv÷þ¼ØõãÆ§ìV'7r{ðãÆ§ì¾w³>vQ7>þórÕtncÜøDØXþ©U(ŒŸ>ø,·Ÿ1n|"|ñê×¹-øŒqãaõÝTÁ0n|"|ì ª`7>N?|#·Ÿ1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n¼ìB1n|"œý½nDÂ0n|"Üø ·¯1n¼ìB1n¼ÎÌPŒ¯QãÆë>3ãÆ'šų¹-øŒqãaå”—¸-øŒqãõí½×„?ýXÎîA O½¿‰þ ¤6®ªÕ%‘¯„-U•z¾ÓWÂdMRÏfûJ˜üc+u^$LêÑ{ “š6Ã_RvÉSÞ)»gžøä&vBzF#Mœá+i»šôÆW†ÁL‚FÇ, :x=¥Ã®^Oéœ}[¯ŸtÍœ¯ƒ×KºV½ÐÁë%]vÛÊÑ5¯\Y¨¾Ž³Ä£@âVŠÛÓ°]çfßȬòXùà*j'"ÿdVhm®Z¼’Ù‰È?ÝVWþfÃÖBC÷•Ñë­×ÈÊ+ºÛ ÖšªÙ+zØmÞ°°x,­‘wzØM¬þÛ®“³?ô´4í8¿~*©‘wzÙ ‚ÚCÏÍ( ´"òN»A]ÍÚLjüÓ×nríÒG­ˆ¼Ó×nêÃwÓõ%3uvö€lvƒ¶úï+“ß‘OV»AûéÝGThð<ÒÉn7í÷³ó‹é ”‘MvÓ~7µ®œW½žµÖôo7õñ{àØá™·-¹A‚G*ÿè › endstream endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000000359 00000 n 0000002314 00000 n 0000000300 00000 n 0000000160 00000 n 0000000015 00000 n 0000000142 00000 n 0000000436 00000 n 0000000407 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [( œæ›eYšÓI„k÷Û)( œæ›eYšÓI„k÷Û)] >> startxref 2472 %%EOF asymptote-3.05/doc/vectorfield.asy0000644000000000000000000000021415031566105015754 0ustar rootrootimport graph; size(100); pair a=(0,0); pair b=(2pi,2pi); path vector(pair z) {return (sin(z.x),cos(z.y));} add(vectorfield(vector,a,b)); asymptote-3.05/doc/asy.1.end0000644000000000000000000000051515031566105014357 0ustar rootroot .SH SEE ALSO Asymptote is documented fully in the asymptote Info page. The manual can also be accessed in interactive mode with the "help" command. .SH AUTHOR Asymptote was written by Andy Hammerlindl, John Bowman, and Tom Prince. .PP This manual page was written by Hubert Chan for the Debian project (but may be used by others). asymptote-3.05/doc/filegraph.asy0000644000000000000000000000035615031566105015416 0ustar rootrootimport graph; size(200,150,IgnoreAspect); file in=input("filegraph.dat").line(); real[][] a=in; a=transpose(a); real[] x=a[0]; real[] y=a[1]; draw(graph(x,y),red); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); asymptote-3.05/doc/brokenaxis.asy0000644000000000000000000000101415031566105015612 0ustar rootrootimport graph; size(200,150,IgnoreAspect); // Break the x axis at 3; restart at 8: real a=3, b=8; // Break the y axis at 100; restart at 1000: real c=100, d=1000; scale(Broken(a,b),BrokenLog(c,d)); real[] x={1,2,4,6,10}; real[] y=x^4; draw(graph(x,y),red,MarkFill[0]); xaxis("$x$",BottomTop,LeftTicks(Break(a,b))); yaxis("$y$",LeftRight,RightTicks(Break(c,d))); label(rotate(90)*Break,(a,point(S).y)); label(rotate(90)*Break,(a,point(N).y)); label(Break,(point(W).x,ScaleY(c))); label(Break,(point(E).x,ScaleY(c))); asymptote-3.05/doc/eetomumu.asy0000644000000000000000000000203315031566105015307 0ustar rootrootimport feynman; // set default line width to 0.8bp currentpen = linewidth(0.8); // scale all other defaults of the feynman module appropriately fmdefaults(); // define vertex and external points real L = 50; pair zl = (-0.75*L,0); pair zr = (+0.75*L,0); pair xu = zl + L*dir(+120); pair xl = zl + L*dir(-120); pair yu = zr + L*dir(+60); pair yl = zr + L*dir(-60); // draw propagators and vertices drawFermion(xu--zl); drawFermion(zl--xl); drawPhoton(zl--zr); drawFermion(yu--zr); drawFermion(zr--yl); drawVertex(zl); drawVertex(zr); // draw momentum arrows and momentum labels drawMomArrow(xl--zl, Relative(left)); label(Label("$k'$",2RightSide), xl--zl); label(Label("$k$",2LeftSide), xu--zl); drawMomArrow(zl--zr, Relative(left)); label(Label("$q$",2RightSide), zl--zr); drawMomArrow(zr--yu, Relative(right)); label(Label("$p'$",2LeftSide), zr--yu); label(Label("$p$",2RightSide), zr--yl); // draw particle labels label("$e^-$", xu, left); label("$e^+$", xl, left); label("$\mu^+$", yu, right); label("$\mu^-$", yl, right); asymptote-3.05/doc/superpath.asy0000644000000000000000000000017315031566105015465 0ustar rootrootsize(0,100); path unitcircle=E..N..W..S..cycle; path g=scale(2)*unitcircle; filldraw(unitcircle^^g,evenodd+yellow,black); asymptote-3.05/doc/elliptic.asy0000644000000000000000000000376215031566105015266 0ustar rootrootstruct curve { real a=0; real b=8; real y2(real x) { return x^3+a*x+b; } real disc() { return -16*(4*a*a*a+27*b*b); } real lowx () { return sqrt(-a/3); } int comps() { if (a < 0) { real x=sqrt(-a/3); return y2(x) < 0 ? 2 : 1; } return 1; } void locus(picture pic=currentpicture, real m, real M, int n=100, pen p=currentpen) { path flip(path p, bool close) { path pp=reverse(yscale(-1)*p)..p; return close ? pp..cycle : pp; } path section(real m, real M, int n) { guide g; real width=(M-m)/n; for(int i=0; i <= n; ++i) { real x=m+width*i; real yy=y2(x); if (yy > 0) g=g..(x,sqrt(yy)); } return g; } if (comps() == 1) { draw(pic,flip(section(m,M,n),false),p); } else { real x=lowx(); // The minimum on x^3+ax+b if (m < x) draw(pic,flip(section(m,min(x,M),n),true),p); if (x < M) draw(pic,flip(section(max(x,m),M,n),false),p); } } pair neg(pair P) { return finite(P.y) ? yscale(-1)*P : P; } pair add(pair P, pair Q) { if (P.x == Q.x && P.x != Q.x) return (0,infinity); else { real lambda=P == Q ? (3*P.x^2+a)/(2*P.y) : (Q.y-P.y)/(Q.x-P.x); real Rx=lambda^2-P.x-Q.x; return (Rx,(P.x-Rx)*lambda-P.y); } } } import graph; import math; size(0,200); curve c; c.a=-1; c.b=4; pair oncurve(real x) { return (x,sqrt(c.y2(x))); } picture output; axes(); c.locus(-4,3,.3red+.7blue); pair P=oncurve(-1),Q=oncurve(1.2); pair PP=c.add(P,P),sum=c.add(P,Q); save(); drawline(P,Q,dashed); drawline(c.neg(sum),sum,dashed); dot("$P$", P, NW); dot("$Q$", Q, SSE); dot(c.neg(sum)); dot("$P+Q$", sum, 2SW); add(output,currentpicture.fit(),(-0.5cm,0),W); restore(); save(); drawline(P,c.neg(PP),dashed); drawline(c.neg(PP),PP,dashed); dot("$P$", P, NW); dot(c.neg(PP)); dot("$2P$", PP, SW); add(output,currentpicture.fit(),(0.5cm,0),E); shipout(output); restore(); asymptote-3.05/doc/png/0000755000000000000000000000000015031566777013536 5ustar rootrootasymptote-3.05/doc/png/asymptote.info0000644000000000000000000173245315031566764016453 0ustar rootrootThis is asymptote.info, produced by makeinfo version 7.2 from asymptote.texi. This file documents ‘Asymptote’, version 3.05. Copyright © 2004-25 Andy Hammerlindl, John Bowman, and Tom Prince. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Lesser General Public License (see the file LICENSE in the top-level source directory). INFO-DIR-SECTION Languages START-INFO-DIR-ENTRY * asymptote: (asymptote/asymptote). Vector graphics language. END-INFO-DIR-ENTRY  File: asymptote.info, Node: Top, Next: Description, Up: (dir) Asymptote ********* This file documents ‘Asymptote’, version 3.05. Copyright © 2004-25 Andy Hammerlindl, John Bowman, and Tom Prince. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Lesser General Public License (see the file LICENSE in the top-level source directory). * Menu: * Description:: What is ‘Asymptote’? * Installation:: Downloading and installing * Tutorial:: Getting started * Drawing commands:: Four primitive graphics commands * Bezier curves:: Path connectors and direction specifiers * Programming:: The ‘Asymptote’ vector graphics language * LaTeX usage:: Embedding ‘Asymptote’ commands within ‘LaTeX’ * Base modules:: Base modules shipped with ‘Asymptote’ * Options:: Command-line options * Interactive mode:: Typing ‘Asymptote’ commands interactively * GUI:: Graphical user interface * Command-Line Interface:: Remote command-line interface * Language server protocol:: Help when writing code * PostScript to Asymptote:: ‘Asymptote’ backend to ‘pstoedit’ * Help:: Where to get help and submit bug reports * Debugger:: Squish those bugs! * Credits:: Contributions and acknowledgments * Index:: General index -- The Detailed Node Listing -- Installation * UNIX binary distributions:: Prebuilt ‘UNIX’ binaries * MacOS X binary distributions:: Prebuilt ‘MacOS X’ binaries * Microsoft Windows:: Prebuilt ‘Microsoft Windows’ binary * Configuring:: Configuring ‘Asymptote’ for your system * Search paths:: Where ‘Asymptote’ looks for your files * Compiling from UNIX source:: Building ‘Asymptote’ from scratch * Editing modes:: Convenient ‘emacs’ and ‘vim’ modes * Git:: Getting the latest development source * Building the documentation:: Building the documentation * Uninstall:: Goodbye, ‘Asymptote’! Tutorial * Drawing in batch mode:: Run ‘Asymptote’ on a text file * Drawing in interactive mode:: Running ‘Asymptote’ interactively * Figure size:: Specifying the figure size * Labels:: Adding ‘LaTeX’ labels * Paths:: Drawing lines and curves Drawing commands * draw:: Draw a path on a picture or frame * fill:: Fill a cyclic path on a picture or frame * clip:: Clip a picture or frame to a cyclic path * label:: Label a point on a picture Programming * Data types:: void, bool, int, real, pair, triple, string * Paths and guides:: Bezier curves * Pens:: Colors, line types, line widths, font sizes * Transforms:: Affine transforms * Frames and pictures:: Canvases for immediate and deferred drawing * Deferred drawing:: Witholding drawing until all data is available * Files:: Reading and writing your data * Variable initializers:: Initialize your variables * Structures:: Organize your data * Operators:: Arithmetic and logical operators * Implicit scaling:: Avoiding those ugly *s * Functions:: Traditional and higher-order functions * Arrays:: Dynamic vectors * Casts:: Implicit and explicit casts * Import:: Importing external ‘Asymptote’ modules * Static:: Where to allocate your variable? Operators * Arithmetic & logical:: Basic mathematical operators * Self & prefix operators:: Increment and decrement * User-defined operators:: Overloading operators Functions * Default arguments:: Default values can appear anywhere * Named arguments:: Assigning function arguments by keyword * Rest arguments:: Functions with a variable number of arguments * Mathematical functions:: Standard libm functions Arrays * Slices:: Python-style array slices Import * Templated imports:: Base modules * plain:: Default ‘Asymptote’ base file * simplex:: Linear programming: simplex method * simplex2:: Two-variable simplex method * math:: Extend ‘Asymptote’'s math capabilities * interpolate:: Interpolation routines * geometry:: Geometry routines * trembling:: Wavy lines * stats:: Statistics routines and histograms * patterns:: Custom fill and draw patterns * markers:: Custom path marker routines * map:: Map keys to values * tree:: Dynamic binary search tree * binarytree:: Binary tree drawing module * drawtree:: Tree drawing module * syzygy:: Syzygy and braid drawing module * feynman:: Feynman diagrams * roundedpath:: Round the sharp corners of paths * animation:: Embedded PDF and MPEG movies * embed:: Embedding movies, sounds, and 3D objects * slide:: Making presentations with ‘Asymptote’ * MetaPost:: ‘MetaPost’ compatibility routines * babel:: Interface to ‘LaTeX’ ‘babel’ package * labelpath:: Drawing curved labels * labelpath3:: Drawing curved labels in 3D * annotate:: Annotate your PDF files * CAD:: 2D CAD pen and measurement functions (DIN 15) * graph:: 2D linear & logarithmic graphs * palette:: Color density images and palettes * three:: 3D vector graphics * obj:: 3D obj files * graph3:: 3D linear & logarithmic graphs * grid3:: 3D grids * solids:: 3D solid geometry * tube:: 3D rotation minimizing tubes * flowchart:: Flowchart drawing routines * contour:: Contour lines * contour3:: Contour surfaces * smoothcontour3:: Smooth implicit surfaces * slopefield:: Slope fields * ode:: Ordinary differential equations Graphical User Interface * GUI installation:: Installing ‘xasy’ * GUI usage:: Using ‘xasy’ to edit objects  File: asymptote.info, Node: Description, Next: Installation, Prev: Top, Up: Top 1 Description ************* ‘Asymptote’ is a powerful descriptive vector graphics language that provides a mathematical coordinate-based framework for technical drawing. Labels and equations are typeset with ‘LaTeX’, for overall document consistency, yielding the same high-quality level of typesetting that ‘LaTeX’ provides for scientific text. By default it produces ‘PostScript’ output, but it can also generate ‘OpenGL’, ‘PDF’, ‘SVG’, ‘WebGL’, ‘V3D’, and legacy ‘PRC’ vector graphics, along with any format that the ‘ImageMagick’ package can produce. You can even try it out in your Web browser without installing it, using the ‘Asymptote Web Application’ It is also possible to send remote commands to this server via the curl utility (*note Command-Line Interface::). A major advantage of ‘Asymptote’ over other graphics packages is that it is a high-level programming language, as opposed to just a graphics program: it can therefore exploit the best features of the script (command-driven) and graphical-user-interface (GUI) methods for producing figures. The rudimentary GUI ‘xasy’ included with the package allows one to move script-generated objects around. To make ‘Asymptote’ accessible to the average user, this GUI is currently being developed into a full-fledged interface that can generate objects directly. However, the script portion of the language is now ready for general use by users who are willing to learn a few simple ‘Asymptote’ graphics commands (*note Drawing commands::). ‘Asymptote’ is mathematically oriented (e.g. one can use complex multiplication to rotate a vector) and uses ‘LaTeX’ to do the typesetting of labels. This is an important feature for scientific applications. It was inspired by an earlier drawing program (with a weaker syntax and capabilities) called ‘MetaPost’. The ‘Asymptote’ vector graphics language provides: • a standard for typesetting mathematical figures, just as TeX/‘LaTeX’ is the de-facto standard for typesetting equations. • ‘LaTeX’ typesetting of labels, for overall document consistency; • the ability to generate and embed 3D vector WebGL graphics within HTML files; • the ability to generate and embed 3D vector PRC graphics within PDF files; • a natural coordinate-based framework for technical drawing, inspired by ‘MetaPost’, with a much cleaner, powerful C++-like programming syntax; • compilation of figures into virtual machine code for speed, without sacrificing portability; • the power of a script-based language coupled to the convenience of a GUI; • customization using its own C++-like graphics programming language; • sensible defaults for graphical features, with the ability to override; • a high-level mathematically oriented interface to the ‘PostScript’ language for vector graphics, including affine transforms and complex variables; • functions that can create new (anonymous) functions; • deferred drawing that uses the simplex method to solve overall size constraint issues between fixed-sized objects (labels and arrowheads) and objects that should scale with figure size; Many of the features of ‘Asymptote’ are written in the ‘Asymptote’ language itself. While the stock version of ‘Asymptote’ is designed for mathematics typesetting needs, one can write ‘Asymptote’ modules that tailor it to specific applications; for example, a scientific graphing module is available (*note graph::). Examples of ‘Asymptote’ code and output, including animations, are available at Clicking on an example file name in this manual, like ‘Pythagoras’, will display the PDF output, whereas clicking on its ‘.asy’ extension will show the corresponding ‘Asymptote’ code in a separate window. Links to many external resources, including an excellent user-written ‘Asymptote’ tutorial can be found at A quick reference card for ‘Asymptote’ is available at  File: asymptote.info, Node: Installation, Next: Tutorial, Prev: Description, Up: Top 2 Installation ************** * Menu: * UNIX binary distributions:: Prebuilt ‘UNIX’ binaries * MacOS X binary distributions:: Prebuilt ‘MacOS X’ binaries * Microsoft Windows:: Prebuilt ‘Microsoft Windows’ binary * Configuring:: Configuring ‘Asymptote’ for your system * Search paths:: Where ‘Asymptote’ looks for your files * Compiling from UNIX source:: Building ‘Asymptote’ from scratch * Editing modes:: Convenient ‘emacs’ and ‘vim’ modes * Git:: Getting the latest development source * Building the documentation:: Building the documentation * Uninstall:: Goodbye, ‘Asymptote’! After following the instructions for your specific distribution, please see also *note Configuring::. We recommend subscribing to new release announcements at Users may also wish to monitor the ‘Asymptote’ forum:  File: asymptote.info, Node: UNIX binary distributions, Next: MacOS X binary distributions, Up: Installation 2.1 UNIX binary distributions ============================= We release both ‘tgz’ and RPM binary distributions of ‘Asymptote’. The root user can install the ‘Linux x86_64’ ‘tgz’ distribution of version ‘x.xx’ of ‘Asymptote’ with the commands: tar -C / -zxf asymptote-x.xx.x86_64.tgz texhash The ‘texhash’ command, which installs LaTeX style files, is optional. The executable file will be ‘/usr/local/bin/asy’) and example code will be installed by default in ‘/usr/local/share/doc/asymptote/examples’. Fedora users can easily install a recent version of ‘Asymptote’ with the command dnf --enablerepo=rawhide install asymptote To install the latest version of ‘Asymptote’ on a Debian-based distribution (e.g. Ubuntu, Mepis, Linspire) follow the instructions for compiling from ‘UNIX’ source (*note Compiling from UNIX source::). Alternatively, Debian users can install one of Hubert Chan's prebuilt ‘Asymptote’ binaries from  File: asymptote.info, Node: MacOS X binary distributions, Next: Microsoft Windows, Prev: UNIX binary distributions, Up: Installation 2.2 MacOS X binary distributions ================================ ‘MacOS X’ users can either compile the ‘UNIX’ source code (*note Compiling from UNIX source::) or install the ‘Asymptote’ binary available at or at Note that many ‘MacOS X’ (and FreeBSD) systems lack the GNU ‘readline’ library. For full interactive functionality, GNU ‘readline’ version 4.3 or later must be installed.  File: asymptote.info, Node: Microsoft Windows, Next: Configuring, Prev: MacOS X binary distributions, Up: Installation 2.3 Microsoft Windows ===================== Users of the ‘Microsoft Windows’ operating system can install the self-extracting ‘Asymptote’ executable ‘asymptote-x.xx-setup.exe’, where ‘x.xx’ denotes the latest version. A working TeX implementation (we recommend or ) will be required to typeset labels. You will also need to install ‘GPL Ghostscript’ version 9.56 or later from . To view ‘PostScript’ output, you can install the program ‘Sumatra PDF’ available from . The ‘ImageMagick’ package from is required to support output formats other than HTML, PDF, SVG, and PNG (*note magick::). The ‘Python 3’ interpreter from is only required if you wish to try out the graphical user interface (*note GUI::). Example code will be installed by default in the ‘examples’ subdirectory of the installation directory (by default, ‘C:\Program Files\Asymptote’).  File: asymptote.info, Node: Configuring, Next: Search paths, Prev: Microsoft Windows, Up: Installation 2.4 Configuring =============== In interactive mode, or when given the ‘-V’ option (the default when running ‘Asymptote’ on a single file under ‘MSDOS’), ‘Asymptote’ will automatically invoke your ‘PostScript’ viewer (‘evince’ under ‘UNIX’) to display graphical output. The ‘PostScript’ viewer should be capable of automatically redrawing whenever the output file is updated. The ‘UNIX’ ‘PostScript’ viewer ‘gv’ supports this (via a ‘SIGHUP’ signal). Users of ‘ggv’ will need to enable ‘Watch file’ under ‘Edit/PostScript Viewer Preferences’. Configuration variables are most easily set as ‘Asymptote’ variables in an optional configuration file ‘config.asy’ (*note configuration file::). For example, the setting ‘pdfviewer’ specifies the location of the PDF viewer. Here are the default values of several important configuration variables under ‘UNIX’: import settings; pdfviewer="acroread"; htmlviewer="google-chrome"; psviewer="evince"; display="display"; animate="animate"; gs="gs"; libgs=""; Under ‘MSDOS’, the viewer settings ‘htmlviewer’, ‘pdfviewer’, ‘psviewer’, ‘display’, and ‘animate’ default to the string ‘cmd’, requesting the application normally associated with each file type. The (installation-dependent) default values of ‘gs’ and ‘libgs’ are determined automatically from the ‘Microsoft Windows’ registry. The ‘gs’ setting specifies the location of the ‘PostScript’ processor ‘Ghostscript’, available from . The configuration variable ‘htmlviewer’ specifies the browser to use to display 3D ‘WebGL’ output. The default setting is ‘google-chrome’ under ‘UNIX’ and ‘cmd’ under ‘Microsoft Windows’. Note that ‘Internet Explorer’ does not support ‘WebGL’; ‘Microsoft Windows’ users should set their default html browser to ‘chrome’ or ‘microsoft-edge’. By default, 2D and 3D ‘HTML’ images expand to the enclosing canvas; this can be disabled by setting the configuration variable ‘absolute’ to ‘true’. On ‘UNIX’ systems, to support automatic document reloading of ‘PDF’ files in ‘Adobe Reader’, we recommend copying the file ‘reload.js’ from the ‘Asymptote’ system directory (by default, ‘/usr/local/share/asymptote’ under ‘UNIX’ to ‘~/.adobe/Acrobat/x.x/JavaScripts/’, where ‘x.x’ represents the appropriate ‘Adobe Reader’ version number. The automatic document reload feature must then be explicitly enabled by putting import settings; pdfreload=true; pdfreloadOptions="-tempFile"; in the ‘Asymptote’ configuration file. This reload feature is not useful under ‘MSDOS’ since the document cannot be updated anyway on that operating system until it is first closed by ‘Adobe Reader’. The configuration variable ‘dir’ can be used to adjust the search path (*note Search paths::). By default, ‘Asymptote’ attempts to center the figure on the page, assuming that the paper type is ‘letter’. The default paper type may be changed to ‘a4’ with the configuration variable ‘papertype’. Alignment to other paper sizes can be obtained by setting the configuration variables ‘paperwidth’ and ‘paperheight’. These additional configuration variables normally do not require adjustment: config texpath texcommand dvips dvisvgm convert asygl Warnings (such as "unbounded" and "offaxis") may be enabled or disabled with the functions warn(string s); nowarn(string s); or by directly modifying the string array ‘settings.suppress’, which lists all disabled warnings. Configuration variables may also be set or overwritten with a command-line option: asy -psviewer=evince -V venn Alternatively, system environment versions of the above configuration variables may be set in the conventional way. The corresponding environment variable name is obtained by converting the configuration variable name to upper case and prepending ‘ASYMPTOTE_’: for example, to set the environment variable ASYMPTOTE_PAPERTYPE="a4"; under ‘Microsoft Windows XP’: 1. Click on the ‘Start’ button; 2. Right-click on ‘My Computer’; 3. Choose ‘View system information’; 4. Click the ‘Advanced’ tab; 5. Click the ‘Environment Variables’ button.  File: asymptote.info, Node: Search paths, Next: Compiling from UNIX source, Prev: Configuring, Up: Installation 2.5 Search paths ================ In looking for ‘Asymptote’ files, ‘asy’ will search the following paths, in the order listed: 1. The current directory; 2. A list of one or more directories specified by the configuration variable ‘dir’ or environment variable ‘ASYMPTOTE_DIR’ (separated by ‘:’ under UNIX and ‘;’ under ‘MSDOS’); 3. The directory specified by the environment variable ‘ASYMPTOTE_HOME’; if this variable is not set, the directory ‘.asy’ in the user's home directory (‘%USERPROFILE%\.asy’ under ‘MSDOS’) is used; 4. The ‘Asymptote’ system directory (by default, ‘/usr/local/share/asymptote’ under ‘UNIX’ and ‘C:\Program Files\Asymptote’ under ‘MSDOS’). 5. The ‘Asymptote’ examples directory (by default, ‘/usr/local/share/doc/asymptote/examples’ under ‘UNIX’ and ‘C:\Program Files\Asymptote\examples’ under ‘MSDOS’).  File: asymptote.info, Node: Compiling from UNIX source, Next: Editing modes, Prev: Search paths, Up: Installation 2.6 Compiling from UNIX source ============================== To compile and install a ‘UNIX’ executable from the source release ‘asymptote-x.xx.src.tgz’ in the subdirectory ‘x.xx’ under execute the commands: gunzip asymptote-x.xx.src.tgz tar -xf asymptote-x.xx.src.tar cd asymptote-x.xx Then compile ‘Asymptote’ with the commands ./configure make all make install Be sure to use GNU ‘make’ (on non-GNU systems this command may be called ‘gmake’). To build the documentation, you may need to install the ‘texinfo-tex’ package. If you get errors from a broken ‘texinfo’ or ‘pdftex’ installation, simply put in the directory ‘doc’ and repeat the command ‘make all’. For a (default) system-wide installation, the last command should be done as the root user. To install without root privileges, change the ‘./configure’ command to ./configure --prefix=$HOME/asymptote One can disable use of the Boehm garbage collector by configuring with ‘./configure --disable-gc’. For a list of other configuration options, say ‘./configure --help’. For example, under ‘MacOS X’, one can tell configure to use the ‘clang’ compilers and look for header files and libraries in nonstandard locations: ./configure CC=clang CXX=clang++ CPPFLAGS=-I/opt/local/include LDFLAGS=-L/opt/local/lib If you are compiling ‘Asymptote’ with ‘gcc’, you will need a relatively recent version (e.g. 3.4.4 or later). For full interactive functionality, you will need version 4.3 or later of the GNU ‘readline’ library. The file ‘gcc3.3.2curses.patch’ in the ‘patches’ directory can be used to patch the broken curses.h header file (or a local copy thereof in the current directory) on some ‘AIX’ and ‘IRIX’ systems. The ‘FFTW’ library is only required if you want ‘Asymptote’ to be able to take Fourier transforms of data (say, to compute an audio power spectrum). The ‘GSL’ library is only required if you require the special functions that it supports. If you don't want to install ‘Asymptote’ system wide, just make sure the compiled binary ‘asy’ and GUI script ‘xasy’ are in your path and set the configuration variable ‘dir’ to point to the directory ‘base’ (in the top level directory of the ‘Asymptote’ source code).  File: asymptote.info, Node: Editing modes, Next: Git, Prev: Compiling from UNIX source, Up: Installation 2.7 Editing modes ================= Users of ‘emacs’ can edit ‘Asymptote’ code with the mode ‘asy-mode’, after enabling it by putting the following lines in their ‘.emacs’ initialization file, replacing ‘ASYDIR’ with the location of the ‘Asymptote’ system directory (by default, ‘/usr/local/share/asymptote’ or ‘C:\Program Files\Asymptote’ under ‘MSDOS’): (add-to-list 'load-path "ASYDIR") (autoload 'asy-mode "asy-mode.el" "Asymptote major mode." t) (autoload 'lasy-mode "asy-mode.el" "hybrid Asymptote/Latex major mode." t) (autoload 'asy-insinuate-latex "asy-mode.el" "Asymptote insinuate LaTeX." t) (add-to-list 'auto-mode-alist '("\\.asy$" . asy-mode)) Particularly useful key bindings in this mode are ‘C-c C-c’, which compiles and displays the current buffer, and the key binding ‘C-c ?’, which shows the available function prototypes for the command at the cursor. For full functionality you should also install the Apache Software Foundation package ‘two-mode-mode’: The hybrid mode ‘lasy-mode’ can be used to edit a LaTeX file containing embedded ‘Asymptote’ code (*note LaTeX usage::). This mode can be enabled within ‘latex-mode’ with the key sequence ‘M-x lasy-mode ’. On ‘UNIX’ systems, additional keywords will be generated from all ‘asy’ files in the space-separated list of directories specified by the environment variable ‘ASYMPTOTE_SITEDIR’. Further documentation of ‘asy-mode’ is available within ‘emacs’ by pressing the sequence keys ‘C-h f asy-mode ’. Fans of ‘vim’ can customize ‘vim’ for ‘Asymptote’ with ‘cp /usr/local/share/asymptote/asy.vim ~/.vim/syntax/asy.vim’ and add the following to their ‘~/.vimrc’ file: augroup filetypedetect au BufNewFile,BufRead *.asy setf asy augroup END filetype plugin on If any of these directories or files don't exist, just create them. To set ‘vim’ up to run the current asymptote script using ‘:make’ just add to ‘~/.vim/ftplugin/asy.vim’: setlocal makeprg=asy\ % setlocal errorformat=%f:\ %l.%c:\ %m Syntax highlighting support for the KDE editor ‘Kate’ can be enabled by running ‘asy-kate.sh’ in the ‘/usr/local/share/asymptote’ directory and putting the generated ‘asymptote.xml’ file in ‘~/.local/share/org.kde.syntax-highlighting/syntax/’.  File: asymptote.info, Node: Git, Next: Building the documentation, Prev: Editing modes, Up: Installation 2.8 Git ======= The following commands are needed to install the latest development version of ‘Asymptote’ using ‘git’: git clone https://github.com/vectorgraphics/asymptote cd asymptote ./autogen.sh ./configure make all make install To compile without optimization On ‘Ubuntu’ systems, you may need to first install the required dependencies: apt-get build-dep asymptote  File: asymptote.info, Node: Building the documentation, Next: Uninstall, Prev: Git, Up: Installation 2.9 Building the documentation ============================== Here are instructions for building the documentation: cd doc make # for both the PDF version doc/asymptote.pdf and the HTML version cd png make # for the HTML version only: doc/png/index.html Note that the ‘HTML’ version cannot be built without executing ‘make’ from ‘doc’ folder first. The ‘asy’ executable is required for compiling the diagrams in the documentation.  File: asymptote.info, Node: Uninstall, Prev: Building the documentation, Up: Installation 2.10 Uninstall ============== To uninstall a ‘Linux x86_64’ binary distribution tar -zxvf asymptote-x.xx.x86_64.tgz | xargs --replace=% rm /% texhash To uninstall all ‘Asymptote’ files installed from a source distribution, use the command make uninstall  File: asymptote.info, Node: Tutorial, Next: Drawing commands, Prev: Installation, Up: Top 3 Tutorial ********** * Menu: * Drawing in batch mode:: Run ‘Asymptote’ on a text file * Drawing in interactive mode:: Running ‘Asymptote’ interactively * Figure size:: Specifying the figure size * Labels:: Adding ‘LaTeX’ labels * Paths:: Drawing lines and curves A concise introduction to ‘Asymptote’ is given here. For a more thorough introduction, see the excellent ‘Asymptote’ tutorial written by Charles Staats: Another ‘Asymptote’ tutorial is available as a wiki, with images rendered by an online Asymptote engine:  File: asymptote.info, Node: Drawing in batch mode, Next: Drawing in interactive mode, Up: Tutorial 3.1 Drawing in batch mode ========================= To draw a line from coordinate (0,0) to coordinate (100,100), create a text file ‘test.asy’ containing draw((0,0)--(100,100)); Then execute the command asy -V test Alternatively, ‘MSDOS’ users can drag and drop ‘test.asy’ onto the Desktop ‘asy’ icon (or make ‘Asymptote’ the default application for the extension ‘asy’). This method, known as _batch mode_, outputs a ‘PostScript’ file ‘test.eps’. If you prefer PDF output, use the command line asy -V -f pdf test In either case, the ‘-V’ option opens up a viewer window so you can immediately view the result: [./diagonal] Here, the ‘--’ connector joins the two points ‘(0,0)’ and ‘(100,100)’ with a line segment.  File: asymptote.info, Node: Drawing in interactive mode, Next: Figure size, Prev: Drawing in batch mode, Up: Tutorial 3.2 Drawing in interactive mode =============================== Another method is _interactive mode_, where ‘Asymptote’ reads individual commands as they are entered by the user. To try this out, enter ‘Asymptote’'s interactive mode by clicking on the ‘Asymptote’ icon or typing the command ‘asy’. Then type draw((0,0)--(100,100)); followed by ‘Enter’, to obtain the above image. At this point you can type further ‘draw’ commands, which will be added to the displayed figure, ‘erase’ to clear the canvas, input test; to execute all of the commands contained in the file ‘test.asy’, or ‘quit’ to exit interactive mode. You can use the arrow keys in interactive mode to edit previous lines. The tab key will automatically complete unambiguous words; otherwise, hitting tab again will show the possible choices. Further commands specific to interactive mode are described in *note Interactive mode::.  File: asymptote.info, Node: Figure size, Next: Labels, Prev: Drawing in interactive mode, Up: Tutorial 3.3 Figure size =============== In ‘Asymptote’, coordinates like ‘(0,0)’ and ‘(100,100)’, called _pairs_, are expressed in ‘PostScript’ "big points" (1 ‘bp’ = 1/72 ‘inch’) and the default line width is ‘0.5bp’. However, it is often inconvenient to work directly in ‘PostScript’ coordinates. The next example produces identical output to the previous example, by scaling the line ‘(0,0)--(1,1)’ to fit a rectangle of width ‘100.5 bp’ and height ‘100.5 bp’ (the extra ‘0.5bp’ accounts for the line width): size(100.5,100.5); draw((0,0)--(1,1)); [./diagonal] One can also specify the size in ‘pt’ (1 ‘pt’ = 1/72.27 ‘inch’), ‘cm’, ‘mm’, or ‘inches’. Two nonzero size arguments (or a single size argument) restrict the size in both directions, preserving the aspect ratio. If 0 is given as a size argument, no restriction is made in that direction; the overall scaling will be determined by the other direction (*note size::): size(0,100.5); draw((0,0)--(2,1),Arrow); [./bigdiagonal] To connect several points and create a cyclic path, use the ‘cycle’ keyword: size(3cm); draw((0,0)--(1,0)--(1,1)--(0,1)--cycle); [./square] For convenience, the path ‘(0,0)--(1,0)--(1,1)--(0,1)--cycle’ may be replaced with the predefined variable ‘unitsquare’, or equivalently, ‘box((0,0),(1,1))’. To make the user coordinates represent multiples of exactly ‘1cm’: unitsize(1cm); draw(unitsquare);  File: asymptote.info, Node: Labels, Next: Paths, Prev: Figure size, Up: Tutorial 3.4 Labels ========== Adding labels is easy in ‘Asymptote’; one specifies the label as a double-quoted ‘LaTeX’ string, a coordinate, and an optional alignment direction: size(3cm); draw(unitsquare); label("$A$",(0,0),SW); label("$B$",(1,0),SE); label("$C$",(1,1),NE); label("$D$",(0,1),NW); [./labelsquare] ‘Asymptote’ uses the standard compass directions ‘E=(1,0)’, ‘N=(0,1)’, ‘NE=unit(N+E)’, and ‘ENE=unit(E+NE)’, etc., which along with the directions ‘up’, ‘down’, ‘right’, and ‘left’ are defined as pairs in the ‘Asymptote’ base module ‘plain’ (a user who has a local variable named ‘E’ may access the compass direction ‘E’ by prefixing it with the name of the module where it is defined: ‘plain.E’).  File: asymptote.info, Node: Paths, Prev: Labels, Up: Tutorial 3.5 Paths ========= This example draws a path that approximates a quarter circle, terminated with an arrowhead: size(100,0); draw((1,0){up}..{left}(0,1),Arrow); [./quartercircle] Here the directions ‘up’ and ‘left’ in braces specify the outgoing and incoming directions at the points ‘(1,0)’ and ‘(0,1)’, respectively. In general, a path is specified as a list of points (or other paths) interconnected with ‘--’, which denotes a straight line segment, or ‘..’, which denotes a cubic spline (*note Bezier curves::). Specifying a final ‘..cycle’ creates a cyclic path that connects smoothly back to the initial node, as in this approximation (accurate to within 0.06%) of a unit circle: path unitcircle=E..N..W..S..cycle; An ‘Asymptote’ path, being connected, is equivalent to a ‘PostScript subpath’. The ‘^^’ binary operator, which requests that the pen be moved (without drawing or affecting endpoint curvatures) from the final point of the left-hand path to the initial point of the right-hand path, may be used to group several ‘Asymptote’ paths into a ‘path[]’ array (equivalent to a ‘PostScript’ path): size(0,100); path unitcircle=E..N..W..S..cycle; path g=scale(2)*unitcircle; filldraw(unitcircle^^g,evenodd+yellow,black); [./superpath] The ‘PostScript’ even-odd fill rule here specifies that only the region bounded between the two unit circles is filled (*note fillrule::). In this example, the same effect can be achieved by using the default zero winding number fill rule, if one is careful to alternate the orientation of the paths: filldraw(unitcircle^^reverse(g),yellow,black); The ‘^^’ operator is used by the ‘box(triple, triple)’ function in the module ‘three’ to construct the edges of a cube ‘unitbox’ without retracing steps (*note three::): import three; currentprojection=orthographic(5,4,2,center=true); size(5cm); size3(3cm,5cm,8cm); draw(unitbox); dot(unitbox,red); label("$O$",(0,0,0),NW); label("(1,0,0)",(1,0,0),S); label("(0,1,0)",(0,1,0),E); label("(0,0,1)",(0,0,1),Z); [./cube] See section *note graph:: (or the online ‘Asymptote’ gallery and external links posted at ) for further examples, including two-dimensional and interactive three-dimensional scientific graphs. Additional examples have been posted by Philippe Ivaldi at .  File: asymptote.info, Node: Drawing commands, Next: Bezier curves, Prev: Tutorial, Up: Top 4 Drawing commands ****************** All of ‘Asymptote’'s graphical capabilities are based on four primitive commands. The three ‘PostScript’ drawing commands ‘draw’, ‘fill’, and ‘clip’ add objects to a picture in the order in which they are executed, with the most recently drawn object appearing on top. The labeling command ‘label’ can be used to add text labels and external EPS images, which will appear on top of the ‘PostScript’ objects (since this is normally what one wants), but again in the relative order in which they were executed. After drawing objects on a picture, the picture can be output with the ‘shipout’ function (*note shipout::). If you wish to draw ‘PostScript’ objects on top of labels (or verbatim ‘tex’ commands; *note tex::), the ‘layer’ command may be used to start a new ‘PostScript/LaTeX’ layer: void layer(picture pic=currentpicture); The ‘layer’ function gives one full control over the order in which objects are drawn. Layers are drawn sequentially, with the most recent layer appearing on top. Within each layer, labels, images, and verbatim ‘tex’ commands are always drawn after the ‘PostScript’ objects in that layer. A page break can be generated with the command void newpage(picture pic=currentpicture); While some of these drawing commands take many options, they all have sensible default values (for example, the picture argument defaults to currentpicture). * Menu: * draw:: Draw a path on a picture or frame * fill:: Fill a cyclic path on a picture or frame * clip:: Clip a picture or frame to a cyclic path * label:: Label a point on a picture  File: asymptote.info, Node: draw, Next: fill, Up: Drawing commands 4.1 draw ======== void draw(picture pic=currentpicture, Label L="", path g, align align=NoAlign, pen p=currentpen, arrowbar arrow=None, arrowbar bar=None, margin margin=NoMargin, Label legend="", marker marker=nomarker); Draw the path ‘g’ on the picture ‘pic’ using pen ‘p’ for drawing, with optional drawing attributes (Label ‘L’, explicit label alignment ‘align’, arrows and bars ‘arrow’ and ‘bar’, margins ‘margin’, legend, and markers ‘marker’). Only one parameter, the path, is required. For convenience, the arguments ‘arrow’ and ‘bar’ may be specified in either order. The argument ‘legend’ is a Label to use in constructing an optional legend entry. Bars ‘bar’ are useful for indicating dimensions. The possible values of ‘bar’ are ‘None’, ‘BeginBar’, ‘EndBar’ (or equivalently ‘Bar’), and ‘Bars’ (which draws a bar at both ends of the path). Each of these bar specifiers (except for ‘None’) will accept an optional real argument that denotes the length of the bar in ‘PostScript’ coordinates. The default bar length is ‘barsize(pen)’. The possible values of ‘arrow’ are ‘None’, ‘Blank’ (which draws no arrows or path), ‘BeginArrow’, ‘MidArrow’, ‘EndArrow’ (or equivalently ‘Arrow’), and ‘Arrows’ (which draws an arrow at both ends of the path). There are also arrow versions with slightly modified default values of ‘size’ and ‘angle’ suitable for curved arrows: ‘BeginArcArrow’, ‘EndArcArrow’ (or equivalently ‘ArcArrow’), ‘MidArcArrow’, and ‘ArcArrows’. For example: draw((0,0)--(1,1),arrow=Arrows); All of the arrow specifiers except for ‘None’ and ‘Blank’ may be given optional arguments, for example: draw((0,0)--(1,1),arrow=Arrow( arrowhead=HookHead,size=3mm,angle=20,filltype=Draw,position=0.9)); The function ‘Arrow’ has the signature arrowbar Arrow(arrowhead arrowhead=DefaultHead, real size=0, real angle=arrowangle, filltype filltype=null, position position=EndPoint) Calling ‘Arrow()’ returns ‘Arrow’, which is an ‘arrowbar’ object. The parameters are: • ‘arrowhead’ can be one of the predefined arrowhead styles ‘DefaultHead’, ‘SimpleHead’, ‘HookHead’, ‘TeXHead’. • real ‘size’ is the arrowhead size in ‘PostScript’ coordinates. The default arrowhead size when drawn with a pen ‘p’ is ‘arrowsize(p)’. • real ‘angle’ is the arrowhead angle in degrees. • filltype ‘filltype’ (*note filltype::), • (except for ‘MidArrow’ and ‘Arrows’) real ‘position’ (in the sense of ‘point(path p, real t)’) along the path where the tip of the arrow should be placed. Margins ‘margin’ can be used to shrink the visible portion of a path by ‘labelmargin(p)’ to avoid overlap with other drawn objects. Typical values of ‘margin’ are: ‘NoMargin’ ‘BeginMargin’ ‘EndMargin’ (equivalently ‘Margin’) ‘Margins’ leaves a margin at both ends of the path. ‘Margin(real begin, real end=begin)’ specify the size of the beginning and ending margin, respectively, in multiples of the units ‘labelmargin(p)’ used for aligning labels. ‘BeginPenMargin’ ‘EndPenMargin’ (equivalently ‘PenMargin’) ‘PenMargins’ ‘PenMargin(real begin, real end=begin)’ specify a margin in units of the pen line width, taking account of the pen line width when drawing the path or arrow. ‘DotMargin’ an abbreviation for ‘PenMargin(-0.5*dotfactor,0.5*dotfactor)’, used to draw from the usual beginning point just up to the boundary of an end dot of width ‘dotfactor*linewidth(p)’. ‘BeginDotMargin’ ‘DotMargins’ work similarly. ‘TrueMargin(real begin, real end=begin)’ specify a margin directly in ‘PostScript’ units, independent of the pen line width. The use of arrows, bars, and margins is illustrated by the examples ‘Pythagoras.asy’ and ‘sqrtx01.asy’. The legend for a picture ‘pic’ can be fit and aligned to a frame with the routine: frame legend(picture pic=currentpicture, int perline=1, real xmargin=legendmargin, real ymargin=xmargin, real linelength=legendlinelength, real hskip=legendhskip, real vskip=legendvskip, real maxwidth=0, real maxheight=0, bool hstretch=false, bool vstretch=false, pen p=currentpen); Here ‘xmargin’ and ‘ymargin’ specify the surrounding x and y margins, ‘perline’ specifies the number of entries per line (default 1; 0 means choose this number automatically), ‘linelength’ specifies the length of the path lines, ‘hskip’ and ‘vskip’ specify the line skip (as a multiple of the legend entry size), ‘maxwidth’ and ‘maxheight’ specify optional upper limits on the width and height of the resulting legend (0 means unlimited), ‘hstretch’ and ‘vstretch’ allow the legend to stretch horizontally or vertically, and ‘p’ specifies the pen used to draw the bounding box. The legend frame can then be added and aligned about a point on a picture ‘dest’ using ‘add’ or ‘attach’ (*note add about::). To draw a dot, simply draw a path containing a single point. The ‘dot’ command defined in the module ‘plain’ draws a dot having a diameter equal to an explicit pen line width or the default line width magnified by ‘dotfactor’ (6 by default), using the specified filltype (*note filltype::) or ‘dotfilltype’ (‘Fill’ by default): void dot(frame f, pair z, pen p=currentpen, filltype filltype=dotfilltype); void dot(picture pic=currentpicture, pair z, pen p=currentpen, filltype filltype=dotfilltype); void dot(picture pic=currentpicture, Label L, pair z, align align=NoAlign, string format=defaultformat, pen p=currentpen, filltype filltype=dotfilltype); void dot(picture pic=currentpicture, Label[] L=new Label[], pair[] z, align align=NoAlign, string format=defaultformat, pen p=currentpen, filltype filltype=dotfilltype); void dot(picture pic=currentpicture, path[] g, pen p=currentpen, filltype filltype=dotfilltype); void dot(picture pic=currentpicture, Label L, pen p=currentpen, filltype filltype=dotfilltype); If the variable ‘Label’ is given as the ‘Label’ argument to the third routine, the ‘format’ argument will be used to format a string based on the dot location (here ‘defaultformat’ is ‘"$%.4g$"’). The fourth routine draws a dot at every point of a pair array ‘z’. One can also draw a dot at every node of a path: void dot(picture pic=currentpicture, Label[] L=new Label[], explicit path g, align align=RightSide, string format=defaultformat, pen p=currentpen, filltype filltype=dotfilltype); See *note pathmarkers:: and *note markers:: for more general methods for marking path nodes. To draw a fixed-sized object (in ‘PostScript’ coordinates) about the user coordinate ‘origin’, use the routine void draw(pair origin, picture pic=currentpicture, Label L="", path g, align align=NoAlign, pen p=currentpen, arrowbar arrow=None, arrowbar bar=None, margin margin=NoMargin, Label legend="", marker marker=nomarker);  File: asymptote.info, Node: fill, Next: clip, Prev: draw, Up: Drawing commands 4.2 fill ======== void fill(picture pic=currentpicture, path g, pen p=currentpen); Fill the interior region bounded by the cyclic path ‘g’ on the picture ‘pic’, using the pen ‘p’. There is also a convenient ‘filldraw’ command, which fills the path and then draws in the boundary. One can specify separate pens for each operation: void filldraw(picture pic=currentpicture, path g, pen fillpen=currentpen, pen drawpen=currentpen); This fixed-size version of ‘fill’ allows one to fill an object described in ‘PostScript’ coordinates about the user coordinate ‘origin’: void fill(pair origin, picture pic=currentpicture, path g, pen p=currentpen); This is just a convenient abbreviation for the commands: picture opic; fill(opic,g,p); add(pic,opic,origin); The routine void filloutside(picture pic=currentpicture, path g, pen p=currentpen); fills the region exterior to the path ‘g’, out to the current boundary of picture ‘pic’. Lattice gradient shading varying smoothly over a two-dimensional array of pens ‘p’, using fill rule ‘fillrule’, can be produced with void latticeshade(picture pic=currentpicture, path g, bool stroke=false, pen fillrule=currentpen, pen[][] p) If ‘stroke=true’, the region filled is the same as the region that would be drawn by ‘draw(pic,g,zerowinding)’; in this case the path ‘g’ need not be cyclic. The pens in ‘p’ must belong to the same color space. One can use the functions ‘rgb(pen)’ or ‘cmyk(pen)’ to promote pens to a higher color space, as illustrated in the example file ‘latticeshading.asy’. Axial gradient shading varying smoothly from ‘pena’ to ‘penb’ in the direction of the line segment ‘a--b’ can be achieved with void axialshade(picture pic=currentpicture, path g, bool stroke=false, pen pena, pair a, bool extenda=true, pen penb, pair b, bool extendb=true); The boolean parameters ‘extenda’ and ‘extendb’ indicate whether the shading should extend beyond the axis endpoints ‘a’ and ‘b’. An example of axial shading is provided in the example file ‘axialshade.asy’. Radial gradient shading varying smoothly from ‘pena’ on the circle with center ‘a’ and radius ‘ra’ to ‘penb’ on the circle with center ‘b’ and radius ‘rb’ is similar: void radialshade(picture pic=currentpicture, path g, bool stroke=false, pen pena, pair a, real ra, bool extenda=true, pen penb, pair b, real rb, bool extendb=true); The boolean parameters ‘extenda’ and ‘extendb’ indicate whether the shading should extend beyond the radii ‘a’ and ‘b’. Illustrations of radial shading are provided in the example files ‘shade.asy’, ‘ring.asy’, and ‘shadestroke.asy’. Gouraud shading using fill rule ‘fillrule’ and the vertex colors in the pen array ‘p’ on a triangular lattice defined by the vertices ‘z’ and edge flags ‘edges’ is implemented with void gouraudshade(picture pic=currentpicture, path g, bool stroke=false, pen fillrule=currentpen, pen[] p, pair[] z, int[] edges); void gouraudshade(picture pic=currentpicture, path g, bool stroke=false, pen fillrule=currentpen, pen[] p, int[] edges); In the second form, the elements of ‘z’ are taken to be successive nodes of path ‘g’. The pens in ‘p’ must belong to the same color space. Illustrations of Gouraud shading are provided in the example file ‘Gouraud.asy’. The edge flags used in Gouraud shading are documented on pages 270-274 of the PostScript Language Reference (3rd edition): Tensor product shading using clipping path ‘g’, fill rule ‘fillrule’ on patches bounded by the n cyclic paths of length 4 in path array ‘b’, using the vertex colors specified in the n \times 4 pen array ‘p’ and internal control points in the n \times 4 array ‘z’, is implemented with void tensorshade(picture pic=currentpicture, path[] g, bool stroke=false, pen fillrule=currentpen, pen[][] p, path[] b=g, pair[][] z=new pair[][]); If the array ‘z’ is empty, Coons shading, in which the color control points are calculated automatically, is used. The pens in ‘p’ must belong to the same color space. A simpler interface for the case of a single patch (n=1) is also available: void tensorshade(picture pic=currentpicture, path g, bool stroke=false, pen fillrule=currentpen, pen[] p, path b=g, pair[] z=new pair[]); One can also smoothly shade the regions between consecutive paths of a sequence using a given array of pens: void draw(picture pic=currentpicture, pen fillrule=currentpen, path[] g, pen[] p); Illustrations of tensor product and Coons shading are provided in the example files ‘tensor.asy’, ‘Coons.asy’, ‘BezierPatch.asy’, and ‘rainbow.asy’. More general shading possibilities are available using TeX engines that produce PDF output (*note texengines::): the routine void functionshade(picture pic=currentpicture, path[] g, bool stroke=false, pen fillrule=currentpen, string shader); shades on picture ‘pic’ the interior of path ‘g’ according to fill rule ‘fillrule’ using the ‘PostScript’ calculator routine specified by the string ‘shader’; this routine takes 2 arguments, each in [0,1], and returns ‘colors(fillrule).length’ color components. Function shading is illustrated in the example ‘functionshading.asy’. The following routine uses ‘evenodd’ clipping together with the ‘^^’ operator to unfill a region: void unfill(picture pic=currentpicture, path g);  File: asymptote.info, Node: clip, Next: label, Prev: fill, Up: Drawing commands 4.3 clip ======== void clip(picture pic=currentpicture, path g, stroke=false, pen fillrule=currentpen); Clip the current contents of picture ‘pic’ to the region bounded by the path ‘g’, using fill rule ‘fillrule’ (*note fillrule::). If ‘stroke=true’, the clipped portion is the same as the region that would be drawn with ‘draw(pic,g,zerowinding)’; in this case the path ‘g’ need not be cyclic. While clipping has no notion of depth (it transcends layers and even pages), one can localize clipping to a temporary picture, which can then be added to ‘pic’. For an illustration of picture clipping, see the first example in *note LaTeX usage::.  File: asymptote.info, Node: label, Prev: clip, Up: Drawing commands 4.4 label ========= void label(picture pic=currentpicture, Label L, pair position, align align=NoAlign, pen p=currentpen, filltype filltype=NoFill) Draw Label ‘L’ on picture ‘pic’ using pen ‘p’. If ‘align’ is ‘NoAlign’, the label will be centered at user coordinate ‘position’; otherwise it will be aligned in the direction of ‘align’ and displaced from ‘position’ by the ‘PostScript’ offset ‘align*labelmargin(p)’. Here, ‘real labelmargin(pen p=currentpen)’ is a quantity used to align labels. In the code below, label("abcdefg",(0,0),align=up,basealign); the baseline of the label will be exactly ‘labelmargin(currentpen)’ ‘PostScript’ units above the center. The constant ‘Align’ can be used to align the bottom-left corner of the label at ‘position’. The Label ‘L’ can either be a string or the structure obtained by calling one of the functions Label Label(string s="", pair position, align align=NoAlign, pen p=nullpen, embed embed=Rotate, filltype filltype=NoFill); Label Label(string s="", align align=NoAlign, pen p=nullpen, embed embed=Rotate, filltype filltype=NoFill); Label Label(Label L, pair position, align align=NoAlign, pen p=nullpen, embed embed=L.embed, filltype filltype=NoFill); Label Label(Label L, align align=NoAlign, pen p=nullpen, embed embed=L.embed, filltype filltype=NoFill); The text of a Label can be scaled, slanted, rotated, or shifted by multiplying it on the left by an affine transform (*note Transforms::). For example, ‘rotate(45)*xscale(2)*L’ first scales ‘L’ in the x direction and then rotates it counterclockwise by 45 degrees. The final position of a Label can also be shifted by a ‘PostScript’ coordinate translation: ‘shift(10,0)*L’. An explicit pen specified within the Label overrides other pen arguments. The ‘embed’ argument determines how the Label should transform with the embedding picture: ‘Shift’ only shift with embedding picture; ‘Rotate’ only shift and rotate with embedding picture (default); ‘Rotate(pair z)’ rotate with (picture-transformed) vector ‘z’. ‘Slant’ only shift, rotate, slant, and reflect with embedding picture; ‘Scale’ shift, rotate, slant, reflect, and scale with embedding picture. To add a label to a path, use void label(picture pic=currentpicture, Label L, path g, align align=NoAlign, pen p=currentpen, filltype filltype=NoFill); By default the label will be positioned at the midpoint of the path. An alternative label position (in the sense of ‘point(path p, real t)’) may be specified as a real value for ‘position’ in constructing the Label. The position ‘Relative(real)’ specifies a location relative to the total arclength of the path. These convenient abbreviations are predefined: position BeginPoint=Relative(0); position MidPoint=Relative(0.5); position EndPoint=Relative(1); Path labels are aligned in the direction ‘align’, which may be specified as an absolute compass direction (pair) or a direction ‘Relative(pair)’ measured relative to a north axis in the local direction of the path. For convenience ‘LeftSide’, ‘Center’, and ‘RightSide’ are defined as ‘Relative(W)’, ‘Relative((0,0))’, and ‘Relative(E)’, respectively. Multiplying ‘LeftSide’ and ‘RightSide’ on the left by a real scaling factor will move the label further away from or closer to the path. A label with a fixed-size arrow of length ‘arrowlength’ pointing to ‘b’ from direction ‘dir’ can be produced with the routine void arrow(picture pic=currentpicture, Label L="", pair b, pair dir, real length=arrowlength, align align=NoAlign, pen p=currentpen, arrowbar arrow=Arrow, margin margin=EndMargin); If no alignment is specified (either in the Label or as an explicit argument), the optional Label will be aligned in the direction ‘dir’, using margin ‘margin’. The function ‘string graphic(string name, string options="")’ returns a string that can be used to include an encapsulated ‘PostScript’ (EPS) file. Here, ‘name’ is the name of the file to include and ‘options’ is a string containing a comma-separated list of optional bounding box (‘bb=llx lly urx ury’), width (‘width=value’), height (‘height=value’), rotation (‘angle=value’), scaling (‘scale=factor’), clipping (‘clip=bool’), and draft mode (‘draft=bool’) parameters. The ‘layer()’ function can be used to force future objects to be drawn on top of the included image: label(graphic("file.eps","width=1cm"),(0,0),NE); layer(); The ‘string baseline(string s, string template="\strut")’ function can be used to enlarge the bounding box of a label to match a given template, so that their baselines will be typeset on a horizontal line. See ‘Pythagoras.asy’ for an example. Alternatively, the pen ‘basealign’ may be used to force labels to respect the TeX baseline (*note basealign::). One can prevent labels from overwriting one another with the ‘overwrite’ pen attribute (*note overwrite::). The structure ‘object’ defined in ‘plain_Label.asy’ allows Labels and frames to be treated in a uniform manner. A group of objects may be packed together into single frame with the routine frame pack(pair align=2S ... object inset[]); To draw or fill a box (or ellipse or other path) around a ‘Label’ and return the bounding object, use one of the routines object draw(picture pic=currentpicture, Label L, envelope e, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill, bool above=true); object draw(picture pic=currentpicture, Label L, envelope e, pair position, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill, bool above=true); Here ‘envelope’ is a boundary-drawing routine such as ‘box’, ‘roundbox’, or ‘ellipse’ defined in ‘plain_boxes.asy’. The function ‘path[] texpath(Label L)’ returns the path array that TeX would fill to draw the Label ‘L’. The ‘string minipage(string s, width=100pt)’ function can be used to format string ‘s’ into a paragraph of width ‘width’. This example uses ‘minipage’, ‘clip’, and ‘graphic’ to produce a CD label: [./CDlabel] size(11.7cm,11.7cm); asy(nativeformat(),"logo"); fill(unitcircle^^(scale(2/11.7)*unitcircle), evenodd+rgb(124/255,205/255,124/255)); label(scale(1.1)*minipage( "\centering\scriptsize \textbf{\LARGE {\tt Asymptote}\\ \smallskip \small The Vector Graphics Language}\\ \smallskip \textsc{Andy Hammerlindl, John Bowman, and Tom Prince} https://asymptote.sourceforge.io\\ ",8cm),(0,0.6)); label(graphic("logo","height=7cm"),(0,-0.22)); clip(unitcircle^^(scale(2/11.7)*unitcircle),evenodd);  File: asymptote.info, Node: Bezier curves, Next: Programming, Prev: Drawing commands, Up: Top 5 Bezier curves *************** Each interior node of a cubic spline may be given a direction prefix or suffix ‘{dir}’: the direction of the pair ‘dir’ specifies the direction of the incoming or outgoing tangent, respectively, to the curve at that node. Exterior nodes may be given direction specifiers only on their interior side. A cubic spline between the node z_0, with postcontrol point c_0, and the node z_1, with precontrol point c_1, is computed as the Bezier curve [(1-t)^3*z_0+3t(1-t)^2*c_0+3t^2(1-t)*c_1+t^3*z_1 for 0 <=t <= 1.] As illustrated in the diagram below, the third-order midpoint (m_5) constructed from two endpoints z_0 and z_1 and two control points c_0 and c_1, is the point corresponding to t=1/2 on the Bezier curve formed by the quadruple (z_0, c_0, c_1, z_1). This allows one to recursively construct the desired curve, by using the newly extracted third-order midpoint as an endpoint and the respective second- and first-order midpoints as control points: [./bezier2] Here m_0, m_1 and m_2 are the first-order midpoints, m_3 and m_4 are the second-order midpoints, and m_5 is the third-order midpoint. The curve is then constructed by recursively applying the algorithm to (z_0, m_0, m_3, m_5) and (m_5, m_4, m_2, z_1). In fact, an analogous property holds for points located at any fraction t in [0,1] of each segment, not just for midpoints (t=1/2). The Bezier curve constructed in this manner has the following properties: • It is entirely contained in the convex hull of the given four points. • It starts heading from the first endpoint to the first control point and finishes heading from the second control point to the second endpoint. The user can specify explicit control points between two nodes like this: draw((0,0)..controls (0,100) and (100,100)..(100,0)); However, it is usually more convenient to just use the ‘..’ operator, which tells ‘Asymptote’ to choose its own control points using the algorithms described in Donald Knuth's monograph, The MetaFontbook, Chapter 14. The user can still customize the guide (or path) by specifying direction, tension, and curl values. The higher the tension, the straighter the curve is, and the more it approximates a straight line. One can change the spline tension from its default value of 1 to any real value greater than or equal to 0.75 (see John D. Hobby, Discrete and Computational Geometry 1, 1986): draw((100,0)..tension 2 ..(100,100)..(0,100)); draw((100,0)..tension 3 and 2 ..(100,100)..(0,100)); draw((100,0)..tension atleast 2 ..(100,100)..(0,100)); In these examples there is a space between ‘2’ and ‘..’. This is needed as ‘2.’ is interpreted as a numerical constant. The curl parameter specifies the curvature at the endpoints of a path (0 means straight; the default value of 1 means approximately circular): draw((100,0){curl 0}..(100,100)..{curl 0}(0,100)); The ‘MetaPost ...’ path connector, which requests, when possible, an inflection-free curve confined to a triangle defined by the endpoints and directions, is implemented in ‘Asymptote’ as the convenient abbreviation ‘::’ for ‘..tension atleast 1 ..’ (the ellipsis ‘...’ is used in ‘Asymptote’ to indicate a variable number of arguments; *note Rest arguments::). For example, compare draw((0,0){up}..(100,25){right}..(200,0){down}); [./dots] with draw((0,0){up}::(100,25){right}::(200,0){down}); [./colons] The ‘---’ connector is an abbreviation for ‘..tension atleast infinity..’ and the ‘&’ connector concatenates two paths, after first stripping off the last node of the first path (which normally should coincide with the first node of the second path).  File: asymptote.info, Node: Programming, Next: LaTeX usage, Prev: Bezier curves, Up: Top 6 Programming ************* * Menu: * Data types:: void, bool, int, real, pair, triple, string * Paths and guides:: Bezier curves * Pens:: Colors, line types, line widths, font sizes * Transforms:: Affine transforms * Frames and pictures:: Canvases for immediate and deferred drawing * Deferred drawing:: Witholding drawing until all data is available * Files:: Reading and writing your data * Variable initializers:: Initialize your variables * Structures:: Organize your data * Operators:: Arithmetic and logical operators * Implicit scaling:: Avoiding those ugly *s * Functions:: Traditional and higher-order functions * Arrays:: Dynamic vectors * Casts:: Implicit and explicit casts * Import:: Importing external ‘Asymptote’ modules * Static:: Where to allocate your variable? * Autounravel:: Adding associated libraries to structures Here is a short introductory example to the ‘Asymptote’ programming language that highlights the similarity of its control structures with those of C, C++, and Java: // This is a comment. // Declaration: Declare x to be a real variable; real x; // Assignment: Assign the real variable x the value 1. x=1.0; // Conditional: Test if x equals 1 or not. if(x == 1.0) { write("x equals 1.0"); } else { write("x is not equal to 1.0"); } // Loop: iterate 10 times for(int i=0; i < 10; ++i) { write(i); } ‘Asymptote’ supports ‘while’, ‘do’, ‘break’, and ‘continue’ statements just as in C/C++. It also supports the Java-style shorthand for iterating over all elements of an array: // Iterate over an array int[] array={1,1,2,3,5}; for(int k : array) { write(k); } In addition, it supports many features beyond the ones found in those languages.  File: asymptote.info, Node: Data types, Next: Paths and guides, Up: Programming 6.1 Data types ============== ‘Asymptote’ supports the following data types (in addition to user-defined types): ‘void’ The void type is used only by functions that take or return no arguments. ‘bool’ a boolean type that can only take on the values ‘true’ or ‘false’. For example: bool b=true; defines a boolean variable ‘b’ and initializes it to the value ‘true’. If no initializer is given: bool b; the value ‘false’ is assumed. ‘bool3’ an extended boolean type that can take on the values ‘true’, ‘default’, or ‘false’. A bool3 type can be cast to or from a bool. The default initializer for bool3 is ‘default’. ‘int’ an integer type; if no initializer is given, the implicit value ‘0’ is assumed. The minimum allowed value of an integer is ‘intMin’ and the maximum value is ‘intMax’. ‘real’ a real number; this should be set to the highest-precision native floating-point type on the architecture. The implicit initializer for reals is ‘0.0’. Real numbers have precision ‘realEpsilon’, with ‘realDigits’ significant digits. The smallest positive real number is ‘realMin’ and the largest positive real number is ‘realMax’. The variables ‘inf’ and ‘nan’, along with the function ‘bool isnan(real x)’ are useful when floating-point exceptions are masked with the ‘-mask’ command-line option (the default in interactive mode). ‘pair’ complex number, that is, an ordered pair of real components ‘(x,y)’. The real and imaginary parts of a pair ‘z’ can read as ‘z.x’ and ‘z.y’. We say that ‘x’ and ‘y’ are virtual members of the data element pair; they cannot be directly modified, however. The implicit initializer for pairs is ‘(0.0,0.0)’. There are a number of ways to take the complex conjugate of a pair: pair z=(3,4); z=(z.x,-z.y); z=z.x-I*z.y; z=conj(z); Here ‘I’ is the pair ‘(0,1)’. A number of built-in functions are defined for pairs: ‘pair conj(pair z)’ returns the conjugate of ‘z’; ‘real length(pair z)’ returns the complex modulus |‘z’| of its argument ‘z’. For example, pair z=(3,4); length(z); returns the result 5. A synonym for ‘length(pair)’ is ‘abs(pair)’. The function ‘abs2(pair z)’ returns |‘z’|^2; ‘real angle(pair z, bool warn=true)’ returns the angle of ‘z’ in radians in the interval [-‘pi’,‘pi’] or ‘0’ if ‘warn’ is ‘false’ and ‘z=(0,0)’ (rather than producing an error); ‘real degrees(pair z, bool warn=true)’ returns the angle of ‘z’ in degrees in the interval [0,360) or ‘0’ if ‘warn’ is ‘false’ and ‘z=(0,0)’ (rather than producing an error); ‘pair unit(pair z)’ returns a unit vector in the direction of the pair ‘z’; ‘pair expi(real angle)’ returns a unit vector in the direction ‘angle’ measured in radians; ‘pair dir(real degrees)’ returns a unit vector in the direction ‘degrees’ measured in degrees; ‘real xpart(pair z)’ returns ‘z.x’; ‘real ypart(pair z)’ returns ‘z.y’; ‘pair realmult(pair z, pair w)’ returns the element-by-element product ‘(z.x*w.x,z.y*w.y)’; ‘real dot(explicit pair z, explicit pair w)’ returns the dot product ‘z.x*w.x+z.y*w.y’; ‘real cross(explicit pair z, explicit pair w)’ returns the 2D scalar product ‘z.x*w.y-z.y*w.x’; ‘real orient(pair a, pair b, pair c);’ returns a positive (negative) value if ‘a--b--c--cycle’ is oriented counterclockwise (clockwise) or zero if all three points are colinear. Equivalently, a positive (negative) value is returned if ‘c’ lies to the left (right) of the line through ‘a’ and ‘b’ or zero if ‘c’ lies on this line. The value returned can be expressed in terms of the 2D scalar cross product as ‘cross(a-c,b-c)’, which is the determinant |a.x a.y 1| |b.x b.y 1| |c.x c.y 1| ‘real incircle(pair a, pair b, pair c, pair d);’ returns a positive (negative) value if ‘d’ lies inside (outside) the circle passing through the counterclockwise-oriented points ‘a,b,c’ or zero if ‘d’ lies on the this circle. The value returned is the determinant |a.x a.y a.x^2+a.y^2 1| |b.x b.y b.x^2+b.y^2 1| |c.x c.y c.x^2+c.y^2 1| |d.x d.y d.x^2+d.y^2 1| ‘pair minbound(pair z, pair w)’ returns ‘(min(z.x,w.x),min(z.y,w.y))’; ‘pair maxbound(pair z, pair w)’ returns ‘(max(z.x,w.x),max(z.y,w.y))’. ‘triple’ an ordered triple of real components ‘(x,y,z)’ used for three-dimensional drawings. The respective components of a triple ‘v’ can read as ‘v.x’, ‘v.y’, and ‘v.z’. The implicit initializer for triples is ‘(0.0,0.0,0.0)’. Here are the built-in functions for triples: ‘real length(triple v)’ returns the length |‘v’| of its argument ‘v’. A synonym for ‘length(triple)’ is ‘abs(triple)’. The function ‘abs2(triple v)’ returns |‘v’|^2; ‘real polar(triple v, bool warn=true)’ returns the colatitude of ‘v’ measured from the z axis in radians or ‘0’ if ‘warn’ is ‘false’ and ‘v=O’ (rather than producing an error); ‘real azimuth(triple v, bool warn=true)’ returns the longitude of ‘v’ measured from the x axis in radians or ‘0’ if ‘warn’ is ‘false’ and ‘v.x=v.y=0’ (rather than producing an error); ‘real colatitude(triple v, bool warn=true)’ returns the colatitude of ‘v’ measured from the z axis in degrees or ‘0’ if ‘warn’ is ‘false’ and ‘v=O’ (rather than producing an error); ‘real latitude(triple v, bool warn=true)’ returns the latitude of ‘v’ measured from the xy plane in degrees or ‘0’ if ‘warn’ is ‘false’ and ‘v=O’ (rather than producing an error); ‘real longitude(triple v, bool warn=true)’ returns the longitude of ‘v’ measured from the x axis in degrees or ‘0’ if ‘warn’ is ‘false’ and ‘v.x=v.y=0’ (rather than producing an error); ‘triple unit(triple v)’ returns a unit triple in the direction of the triple ‘v’; ‘triple expi(real polar, real azimuth)’ returns a unit triple in the direction ‘(polar,azimuth)’ measured in radians; ‘triple dir(real colatitude, real longitude)’ returns a unit triple in the direction ‘(colatitude,longitude)’ measured in degrees; ‘real xpart(triple v)’ returns ‘v.x’; ‘real ypart(triple v)’ returns ‘v.y’; ‘real zpart(triple v)’ returns ‘v.z’; ‘real dot(triple u, triple v)’ returns the dot product ‘u.x*v.x+u.y*v.y+u.z*v.z’; ‘triple cross(triple u, triple v)’ returns the cross product ‘(u.y*v.z-u.z*v.y,u.z*v.x-u.x*v.z,u.x*v.y-v.x*u.y)’; ‘triple minbound(triple u, triple v)’ returns ‘(min(u.x,v.x),min(u.y,v.y),min(u.z,v.z))’; ‘triple maxbound(triple u, triple v)’ returns ‘(max(u.x,v.x),max(u.y,v.y),max(u.z,v.z)’). ‘string’ a character string, implemented using the STL ‘string’ class. Strings delimited by double quotes (‘"’) are subject to the following mappings to allow the use of double quotes in TeX (e.g. for using the ‘babel’ package, *note babel::): • \" maps to " • \\ maps to \\ Strings delimited by single quotes (‘'’) have the same mappings as character strings in ANSI ‘C’: • \' maps to ' • \" maps to " • \? maps to ? • \\ maps to backslash • \a maps to alert • \b maps to backspace • \f maps to form feed • \n maps to newline • \r maps to carriage return • \t maps to tab • \v maps to vertical tab • \0-\377 map to corresponding octal byte • \x0-\xFF map to corresponding hexadecimal byte The implicit initializer for strings is the empty string ‘""’. Strings may be concatenated with the ‘+’ operator. In the following string functions, position ‘0’ denotes the start of the string: ‘int length(string s)’ returns the length of the string ‘s’; ‘int find(string s, string t, int pos=0)’ returns the position of the first occurrence of string ‘t’ in string ‘s’ at or after position ‘pos’, or -1 if ‘t’ is not a substring of ‘s’; ‘int rfind(string s, string t, int pos=-1)’ returns the position of the last occurrence of string ‘t’ in string ‘s’ at or before position ‘pos’ (if ‘pos’=-1, at the end of the string ‘s’), or -1 if ‘t’ is not a substring of ‘s’; ‘string insert(string s, int pos, string t)’ returns the string formed by inserting string ‘t’ at position ‘pos’ in ‘s’; ‘string erase(string s, int pos, int n)’ returns the string formed by erasing the string of length ‘n’ (if ‘n’=-1, to the end of the string ‘s’) at position ‘pos’ in ‘s’; ‘string substr(string s, int pos, int n=-1)’ returns the substring of ‘s’ starting at position ‘pos’ and of length ‘n’ (if ‘n’=-1, until the end of the string ‘s’); ‘string reverse(string s)’ returns the string formed by reversing string ‘s’; ‘string replace(string s, string before, string after)’ returns a string with all occurrences of the string ‘before’ in the string ‘s’ changed to the string ‘after’; ‘string replace(string s, string[][] table)’ returns a string constructed by translating in string ‘s’ all occurrences of the string ‘before’ in an array ‘table’ of string pairs {‘before’,‘after’} to the corresponding string ‘after’; ‘string[] split(string s, string delimiter="")’ returns an array of strings obtained by splitting ‘s’ into substrings delimited by ‘delimiter’ (an empty delimiter signifies a space, but with duplicate delimiters discarded); ‘string[] array(string s)’ returns an array of strings obtained by splitting ‘s’ into individual characters. The inverse operation is provided by ‘operator +(...string[] a)’. ‘string format(string s, int n, string locale="")’ returns a string containing ‘n’ formatted according to the C-style format string ‘s’ using locale ‘locale’ (or the current locale if an empty string is specified), following the behavior of the C function ‘fprintf’), except that only one data field is allowed. ‘string format(string s=defaultformat, bool forcemath=false, string s=defaultseparator, real x, string locale="")’ returns a string containing ‘x’ formatted according to the C-style format string ‘s’ using locale ‘locale’ (or the current locale if an empty string is specified), following the behavior of the C function ‘fprintf’), except that only one data field is allowed, trailing zeros are removed by default (unless ‘#’ is specified), and if ‘s’ specifies math mode or ‘forcemath=true’, TeX is used to typeset scientific notation using the ‘defaultseparator="\!\times\!";’; ‘int hex(string s);’ casts a hexadecimal string ‘s’ to an integer; ‘int ascii(string s);’ returns the ASCII code for the first character of string ‘s’; ‘string string(real x, int digits=realDigits)’ casts ‘x’ to a string using precision ‘digits’ and the C locale; ‘string locale(string s="")’ sets the locale to the given string, if nonempty, and returns the current locale; ‘string time(string format="%a %b %d %T %Z %Y")’ returns the current time formatted by the ANSI C routine ‘strftime’ according to the string ‘format’ using the current locale. Thus time(); time("%a %b %d %H:%M:%S %Z %Y"); are equivalent ways of returning the current time in the default format used by the ‘UNIX’ ‘date’ command; ‘int seconds(string t="", string format="")’ returns the time measured in seconds after the Epoch (Thu Jan 01 00:00:00 UTC 1970) as determined by the ANSI C routine ‘strptime’ according to the string ‘format’ using the current locale, or the current time if ‘t’ is the empty string. Note that the ‘"%Z"’ extension to the POSIX ‘strptime’ specification is ignored by the current GNU C Library. If an error occurs, the value -1 is returned. Here are some examples: seconds("Mar 02 11:12:36 AM PST 2007","%b %d %r PST %Y"); seconds(time("%b %d %r %z %Y"),"%b %d %r %z %Y"); seconds(time("%b %d %r %Z %Y"),"%b %d %r "+time("%Z")+" %Y"); 1+(seconds()-seconds("Jan 1","%b %d"))/(24*60*60); The last example returns today's ordinal date, measured from the beginning of the year. ‘string time(int seconds, string format="%a %b %d %T %Z %Y")’ returns the time corresponding to ‘seconds’ seconds after the Epoch (Thu Jan 01 00:00:00 UTC 1970) formatted by the ANSI C routine ‘strftime’ according to the string ‘format’ using the current locale. For example, to return the date corresponding to 24 hours ago: time(seconds()-24*60*60); ‘int system(string s)’ ‘int system(string[] s)’ if the setting ‘safe’ is false, call the arbitrary system command ‘s’; ‘void asy(string format, bool overwrite=false ... string[] s)’ conditionally process each file name in array ‘s’ in a new environment, using format ‘format’, overwriting the output file only if ‘overwrite’ is true; ‘void abort(string s="")’ aborts execution (with a non-zero return code in batch mode); if string ‘s’ is nonempty, a diagnostic message constructed from the source file, line number, and ‘s’ is printed; ‘void assert(bool b, string s="")’ aborts execution with an error message constructed from ‘s’ if ‘b=false’; ‘void exit()’ exits (with a zero error return code in batch mode); ‘void sleep(int seconds)’ pauses for the given number of seconds; ‘void usleep(int microseconds)’ pauses for the given number of microseconds; ‘void beep()’ produces a beep on the console; As in C/C++, complicated types may be abbreviated with ‘typedef’ or ‘using’. For instance, the line using multipath = path[]; will make ‘multipath’ a type equivalent ‘path[]’, as will the equivalent line typedef path[] multipath; For the most part such type aliasing is a convenience. However, it is required when declaring a function whose return type is a function (see the example in *note Functions::).  File: asymptote.info, Node: Paths and guides, Next: Pens, Prev: Data types, Up: Programming 6.2 Paths and guides ==================== ‘path’ a cubic spline resolved into a fixed path. The implicit initializer for paths is ‘nullpath’. For example, the routine ‘circle(pair c, real r)’, which returns a Bezier curve approximating a circle of radius ‘r’ centered on ‘c’, is based on ‘unitcircle’ (*note unitcircle::): path circle(pair c, real r) { return shift(c)*scale(r)*unitcircle; } If high accuracy is needed, a true circle may be produced with the routine ‘Circle’ defined in the module ‘graph’: import graph; path Circle(pair c, real r, int n=nCircle); A circular arc consistent with ‘circle’ centered on ‘c’ with radius ‘r’ from ‘angle1’ to ‘angle2’ degrees, drawing counterclockwise if ‘angle2 >= angle1’, can be constructed with path arc(pair c, real r, real angle1, real angle2); One may also specify the direction explicitly: path arc(pair c, real r, real angle1, real angle2, bool direction); Here the direction can be specified as CCW (counter-clockwise) or CW (clockwise). For convenience, an arc centered at ‘c’ from pair ‘z1’ to ‘z2’ (assuming ‘|z2-c|=|z1-c|’) in the may also be constructed with path arc(pair c, explicit pair z1, explicit pair z2, bool direction=CCW) If high accuracy is needed, true arcs may be produced with routines in the module ‘graph’ that produce Bezier curves with ‘n’ control points: import graph; path Arc(pair c, real r, real angle1, real angle2, bool direction, int n=nCircle); path Arc(pair c, real r, real angle1, real angle2, int n=nCircle); path Arc(pair c, explicit pair z1, explicit pair z2, bool direction=CCW, int n=nCircle); An ellipse can be drawn with the routine path ellipse(pair c, real a, real b) { return shift(c)*scale(a,b)*unitcircle; } A brace can be constructed between pairs ‘a’ and ‘b’ with path brace(pair a, pair b, real amplitude=bracedefaultratio*length(b-a)); This example illustrates the use of all five guide connectors discussed in *note Tutorial:: and *note Bezier curves::: size(300,0); pair[] z=new pair[10]; z[0]=(0,100); z[1]=(50,0); z[2]=(180,0); for(int n=3; n <= 9; ++n) z[n]=z[n-3]+(200,0); path p=z[0]..z[1]---z[2]::{up}z[3] &z[3]..z[4]--z[5]::{up}z[6] &z[6]::z[7]---z[8]..{up}z[9]; draw(p,grey+linewidth(4mm)); dot(z); [./join] Here are some useful functions for paths: ‘int length(path p);’ This is the number of (linear or cubic) segments in path ‘p’. If ‘p’ is cyclic, this is the same as the number of nodes in ‘p’. ‘int size(path p);’ This is the number of nodes in the path ‘p’. If ‘p’ is cyclic, this is the same as ‘length(p)’. ‘bool cyclic(path p);’ returns ‘true’ iff path ‘p’ is cyclic. ‘bool straight(path p, int i);’ returns ‘true’ iff the segment of path ‘p’ between node ‘i’ and node ‘i+1’ is straight. ‘bool piecewisestraight(path p)’ returns ‘true’ iff the path ‘p’ is piecewise straight. ‘pair point(path p, int t);’ If ‘p’ is cyclic, return the coordinates of node ‘t’ mod ‘length(p)’. Otherwise, return the coordinates of node ‘t’, unless ‘t’ < 0 (in which case ‘point(0)’ is returned) or ‘t’ > ‘length(p)’ (in which case ‘point(length(p))’ is returned). ‘pair point(path p, real t);’ This returns the coordinates of the point between node ‘floor(t)’ and ‘floor(t)+1’ corresponding to the cubic spline parameter ‘t-floor(t)’ (*note Bezier curves::). If ‘t’ lies outside the range [0,‘length(p)’], it is first reduced modulo ‘length(p)’ in the case where ‘p’ is cyclic or else converted to the corresponding endpoint of ‘p’. ‘pair dir(path p, int t, int sign=0, bool normalize=true);’ If ‘sign < 0’, return the direction (as a pair) of the incoming tangent to path ‘p’ at node ‘t’; if ‘sign > 0’, return the direction of the outgoing tangent. If ‘sign=0’, the mean of these two directions is returned. ‘pair dir(path p, real t, bool normalize=true);’ returns the direction of the tangent to path ‘p’ at the point between node ‘floor(t)’ and ‘floor(t)+1’ corresponding to the cubic spline parameter ‘t-floor(t)’ (*note Bezier curves::). ‘pair dir(path p)’ returns dir(p,length(p)). ‘pair dir(path p, path q)’ returns unit(dir(p)+dir(q)). ‘pair accel(path p, int t, int sign=0);’ If ‘sign < 0’, return the acceleration of the incoming path ‘p’ at node ‘t’; if ‘sign > 0’, return the acceleration of the outgoing path. If ‘sign=0’, the mean of these two accelerations is returned. ‘pair accel(path p, real t);’ returns the acceleration of the path ‘p’ at the point ‘t’. ‘real radius(path p, real t);’ returns the radius of curvature of the path ‘p’ at the point ‘t’. ‘pair precontrol(path p, int t);’ returns the precontrol point of ‘p’ at node ‘t’. ‘pair precontrol(path p, real t);’ returns the effective precontrol point of ‘p’ at parameter ‘t’. ‘pair postcontrol(path p, int t);’ returns the postcontrol point of ‘p’ at node ‘t’. ‘pair postcontrol(path p, real t);’ returns the effective postcontrol point of ‘p’ at parameter ‘t’. ‘real arclength(path p);’ returns the length (in user coordinates) of the piecewise linear or cubic curve that path ‘p’ represents. ‘real arctime(path p, real L);’ returns the path "time", a real number between 0 and the length of the path in the sense of ‘point(path p, real t)’, at which the cumulative arclength (measured from the beginning of the path) equals ‘L’. ‘pair arcpoint(path p, real L);’ returns ‘point(p,arctime(p,L))’. ‘real dirtime(path p, pair z);’ returns the first "time", a real number between 0 and the length of the path in the sense of ‘point(path, real)’, at which the tangent to the path has the direction of pair ‘z’, or -1 if this never happens. ‘real reltime(path p, real l);’ returns the time on path ‘p’ at the relative fraction ‘l’ of its arclength. ‘pair relpoint(path p, real l);’ returns the point on path ‘p’ at the relative fraction ‘l’ of its arclength. ‘pair midpoint(path p);’ returns the point on path ‘p’ at half of its arclength. ‘path reverse(path p);’ returns a path running backwards along ‘p’. ‘path subpath(path p, int a, int b);’ returns the subpath of ‘p’ running from node ‘a’ to node ‘b’. If ‘a’ > ‘b’, the direction of the subpath is reversed. ‘path subpath(path p, real a, real b);’ returns the subpath of ‘p’ running from path time ‘a’ to path time ‘b’, in the sense of ‘point(path, real)’. If ‘a’ > ‘b’, the direction of the subpath is reversed. ‘real[] intersect(path p, path q, real fuzz=-1);’ If ‘p’ and ‘q’ have at least one intersection point, return a real array of length 2 containing the times representing the respective path times along ‘p’ and ‘q’, in the sense of ‘point(path, real)’, for one such intersection point (as chosen by the algorithm described on page 137 of ‘The MetaFontbook’). The computations are performed to the absolute error specified by ‘fuzz’, or if ‘fuzz < 0’, to machine precision. If the paths do not intersect, return a real array of length 0. ‘real[][] intersections(path p, path q, real fuzz=-1);’ Return all (unless there are infinitely many) intersection times of paths ‘p’ and ‘q’ as a sorted array of real arrays of length 2 (*note sort::). The computations are performed to the absolute error specified by ‘fuzz’, or if ‘fuzz < 0’, to machine precision. ‘real[] intersections(path p, explicit pair a, explicit pair b, real fuzz=-1);’ Return all (unless there are infinitely many) intersection times of path ‘p’ with the (infinite) line through points ‘a’ and ‘b’ as a sorted array. The intersections returned are guaranteed to be correct to within the absolute error specified by ‘fuzz’, or if ‘fuzz < 0’, to machine precision. ‘real[] times(path p, real x)’ returns all intersection times of path ‘p’ with the vertical line through ‘(x,0)’. ‘real[] times(path p, explicit pair z)’ returns all intersection times of path ‘p’ with the horizontal line through ‘(0,z.y)’. ‘real[] mintimes(path p)’ returns an array of length 2 containing times at which path ‘p’ reaches its minimal horizontal and vertical extents, respectively. ‘real[] maxtimes(path p)’ returns an array of length 2 containing times at which path ‘p’ reaches its maximal horizontal and vertical extents, respectively. ‘pair intersectionpoint(path p, path q, real fuzz=-1);’ returns the intersection point ‘point(p,intersect(p,q,fuzz)[0])’. ‘pair[] intersectionpoints(path p, path q, real fuzz=-1);’ returns an array containing all intersection points of the paths ‘p’ and ‘q’. ‘pair extension(pair P, pair Q, pair p, pair q);’ returns the intersection point of the extensions of the line segments ‘P--Q’ and ‘p--q’, or if the lines are parallel, ‘(infinity,infinity)’. ‘slice cut(path p, path knife, int n);’ returns the portions of path ‘p’ before and after the ‘n’th intersection of ‘p’ with path ‘knife’ as a structure ‘slice’ (if no intersection exist is found, the entire path is considered to be 'before' the intersection): struct slice { path before,after; } The argument ‘n’ is treated as modulo the number of intersections. ‘slice firstcut(path p, path knife);’ equivalent to ‘cut(p,knife,0);’ Note that ‘firstcut.after’ plays the role of the ‘MetaPost cutbefore’ command. ‘slice lastcut(path p, path knife);’ equivalent to ‘cut(p,knife,-1);’ Note that ‘lastcut.before’ plays the role of the ‘MetaPost cutafter’ command. ‘path buildcycle(... path[] p);’ This returns the path surrounding a region bounded by a list of two or more consecutively intersecting paths, following the behavior of the ‘MetaPost buildcycle’ command. ‘pair min(path p);’ returns the pair (left,bottom) for the path bounding box of path ‘p’. ‘pair max(path p);’ returns the pair (right,top) for the path bounding box of path ‘p’. ‘int windingnumber(path p, pair z);’ returns the winding number of the cyclic path ‘p’ relative to the point ‘z’. The winding number is positive if the path encircles ‘z’ in the counterclockwise direction. If ‘z’ lies on ‘p’ the constant ‘undefined’ (defined to be the largest odd integer) is returned. ‘bool interior(int windingnumber, pen fillrule)’ returns true if ‘windingnumber’ corresponds to an interior point according to ‘fillrule’. ‘bool inside(path p, pair z, pen fillrule=currentpen);’ returns ‘true’ iff the point ‘z’ lies inside or on the edge of the region bounded by the cyclic path ‘p’ according to the fill rule ‘fillrule’ (*note fillrule::). ‘int inside(path p, path q, pen fillrule=currentpen);’ returns ‘1’ if the cyclic path ‘p’ strictly contains ‘q’ according to the fill rule ‘fillrule’ (*note fillrule::), ‘-1’ if the cyclic path ‘q’ strictly contains ‘p’, and ‘0’ otherwise. ‘pair inside(path p, pen fillrule=currentpen);’ returns an arbitrary point strictly inside a nondegenerate cyclic path ‘p’ according to the fill rule ‘fillrule’ (*note fillrule::). ‘path[] strokepath(path g, pen p=currentpen);’ returns the path array that ‘PostScript’ would fill in drawing path ‘g’ with pen ‘p’. ‘guide’ an unresolved cubic spline (list of cubic-spline nodes and control points). The implicit initializer for a guide is ‘nullpath’; this is useful for building up a guide within a loop. A guide is similar to a path except that the computation of the cubic spline is deferred until drawing time (when it is resolved into a path); this allows two guides with free endpoint conditions to be joined together smoothly. The solid curve in the following example is built up incrementally as a guide, but only resolved at drawing time; the dashed curve is incrementally resolved at each iteration, before the entire set of nodes (shown in red) is known: size(200); real mexican(real x) {return (1-8x^2)*exp(-(4x^2));} int n=30; real a=1.5; real width=2a/n; guide hat; path solved; for(int i=0; i < n; ++i) { real t=-a+i*width; pair z=(t,mexican(t)); hat=hat..z; solved=solved..z; } draw(hat); dot(hat,red); draw(solved,dashed); [./mexicanhat] We point out an efficiency distinction in the use of guides and paths: guide g; for(int i=0; i < 10; ++i) g=g--(i,i); path p=g; runs in linear time, whereas path p; for(int i=0; i < 10; ++i) p=p--(i,i); runs in quadratic time, as the entire path up to that point is copied at each step of the iteration. The following routines can be used to examine the individual elements of a guide without actually resolving the guide to a fixed path (except for internal cycles, which are resolved): ‘int size(guide g);’ Analogous to ‘size(path p)’. ‘int length(guide g);’ Analogous to ‘length(path p)’. ‘bool cyclic(path p);’ Analogous to ‘cyclic(path p)’. ‘pair point(guide g, int t);’ Analogous to ‘point(path p, int t)’. ‘guide reverse(guide g);’ Analogous to ‘reverse(path p)’. If ‘g’ is cyclic and also contains a secondary cycle, it is first solved to a path, then reversed. If ‘g’ is not cyclic but contains an internal cycle, only the internal cycle is solved before reversal. If there are no internal cycles, the guide is reversed but not solved to a path. ‘pair[] dirSpecifier(guide g, int i);’ This returns a pair array of length 2 containing the outgoing (in element 0) and incoming (in element 1) direction specifiers (or ‘(0,0)’ if none specified) for the segment of guide ‘g’ between nodes ‘i’ and ‘i+1’. ‘pair[] controlSpecifier(guide g, int i);’ If the segment of guide ‘g’ between nodes ‘i’ and ‘i+1’ has explicit outgoing and incoming control points, they are returned as elements 0 and 1, respectively, of a two-element array. Otherwise, an empty array is returned. ‘tensionSpecifier tensionSpecifier(guide g, int i);’ This returns the tension specifier for the segment of guide ‘g’ between nodes ‘i’ and ‘i+1’. The individual components of the ‘tensionSpecifier’ type can be accessed as the virtual members ‘in’, ‘out’, and ‘atLeast’. ‘real[] curlSpecifier(guide g);’ This returns an array containing the initial curl specifier (in element 0) and final curl specifier (in element 1) for guide ‘g’. As a technical detail we note that a direction specifier given to ‘nullpath’ modifies the node on the other side: the guides a..{up}nullpath..b; c..nullpath{up}..d; e..{up}nullpath{down}..f; are respectively equivalent to a..nullpath..{up}b; c{up}..nullpath..d; e{down}..nullpath..{up}f;  File: asymptote.info, Node: Pens, Next: Transforms, Prev: Paths and guides, Up: Programming 6.3 Pens ======== In ‘Asymptote’, pens provide a context for the four basic drawing commands (*note Drawing commands::). They are used to specify the following drawing attributes: color, line type, line width, line cap, line join, fill rule, text alignment, font, font size, pattern, overwrite mode, and calligraphic transforms on the pen nib. The default pen used by the drawing routines is called ‘currentpen’. This provides the same functionality as the ‘MetaPost’ command ‘pickup’. The implicit initializer for pens is ‘defaultpen’. Pens may be added together with the nonassociative binary operator ‘+’. This will add the colors of the two pens. All other non-default attributes of the rightmost pen will override those of the leftmost pen. Thus, one can obtain a yellow dashed pen by saying ‘dashed+red+green’ or ‘red+green+dashed’ or ‘red+dashed+green’. The binary operator ‘*’ can be used to scale the color of a pen by a real number, until it saturates with one or more color components equal to 1. • Colors are specified using one of the following colorspaces: ‘pen gray(real g);’ This produces a grayscale color, where the intensity ‘g’ lies in the interval [0,1], with 0.0 denoting black and 1.0 denoting white. ‘pen rgb(real r, real g, real b);’ This produces an RGB color, where each of the red, green, and blue intensities ‘r’, ‘g’, ‘b’, lies in the interval [0,1]. ‘pen RGB(int r, int g, int b);’ This produces an RGB color, where each of the red, green, and blue intensities ‘r’, ‘g’, ‘b’, lies in the interval [0,255]. ‘pen cmyk(real c, real m, real y, real k);’ This produces a CMYK color, where each of the cyan, magenta, yellow, and black intensities ‘c’, ‘m’, ‘y’, ‘k’, lies in the interval [0,1]. ‘pen invisible;’ This special pen writes in invisible ink, but adjusts the bounding box as if something had been drawn (like the ‘\phantom’ command in TeX). The function ‘bool invisible(pen)’ can be used to test whether a pen is invisible. The default color is ‘black’; this may be changed with the routine ‘defaultpen(pen)’. The function ‘colorspace(pen p)’ returns the colorspace of pen ‘p’ as a string (‘"gray"’, ‘"rgb"’, ‘"cmyk"’, or ‘""’). The function ‘real[] colors(pen)’ returns the color components of a pen. The functions ‘pen gray(pen)’, ‘pen rgb(pen)’, and ‘pen cmyk(pen)’ return new pens obtained by converting their arguments to the respective color spaces. The function ‘colorless(pen=currentpen)’ returns a copy of its argument with the color attributes stripped (to avoid color mixing). A 6-character RGB hexadecimal string can be converted to a pen with the routine pen rgb(string s); • A pen can be converted to a hexadecimal string with ‘string hex(pen p);’ Various shades and mixtures of the grayscale primary colors ‘black’ and ‘white’, RGB primary colors ‘red’, ‘green’, and ‘blue’, and RGB secondary colors ‘cyan’, ‘magenta’, and ‘yellow’ are defined as named colors, along with the CMYK primary colors ‘Cyan’, ‘Magenta’, ‘Yellow’, and ‘Black’, in the module ‘plain’: [./colors] The standard 140 RGB ‘X11’ colors can be imported with the command import x11colors; and the standard 68 CMYK TeX colors can be imported with the command import texcolors; Note that there is some overlap between these two standards and the definitions of some colors (e.g. ‘Green’) actually disagree. ‘Asymptote’ also comes with a ‘asycolors.sty’ ‘LaTeX’ package that defines to ‘LaTeX’ CMYK versions of ‘Asymptote’'s predefined colors, so that they can be used directly within ‘LaTeX’ strings. Normally, such colors are passed to ‘LaTeX’ via a pen argument; however, to change the color of only a portion of a string, say for a slide presentation, (*note slide::) it may be desirable to specify the color directly to ‘LaTeX’. This file can be passed to ‘LaTeX’ with the ‘Asymptote’ command usepackage("asycolors"); The structure ‘hsv’ defined in ‘plain_pens.asy’ may be used to convert between HSV and RGB spaces, where the hue ‘h’ is an angle in [0,360) and the saturation ‘s’ and value ‘v’ lie in ‘[0,1]’: pen p=hsv(180,0.5,0.75); write(p); // ([default], red=0.375, green=0.75, blue=0.75) hsv q=p; write(q.h,q.s,q.v); // 180 0.5 0.75 • Line types are specified with the function ‘pen linetype(real[] a, real offset=0, bool scale=true, bool adjust=true)’, where ‘a’ is an array of real array numbers. The optional parameter ‘offset’ specifies where in the pattern to begin. The first number specifies how far (if ‘scale’ is ‘true’, in units of the pen line width; otherwise in ‘PostScript’ units) to draw with the pen on, the second number specifies how far to draw with the pen off, and so on. If ‘adjust’ is ‘true’, these spacings are automatically adjusted by ‘Asymptote’ to fit the arclength of the path. Here are the predefined line types: pen solid=linetype(new real[]); pen dotted=linetype(new real[] {0,4}); pen dashed=linetype(new real[] {8,8}); pen longdashed=linetype(new real[] {24,8}); pen dashdotted=linetype(new real[] {8,8,0,8}); pen longdashdotted=linetype(new real[] {24,8,0,8}); pen Dotted(pen p=currentpen) {return linetype(new real[] {0,3})+2*linewidth(p);} pen Dotted=Dotted(); [./linetype] The default line type is ‘solid’; this may be changed with ‘defaultpen(pen)’. The line type of a pen can be determined with the functions ‘real[] linetype(pen p=currentpen)’, ‘real offset(pen p)’, ‘bool scale(pen p)’, and ‘bool adjust(pen p)’. • The pen line width is specified in ‘PostScript’ units with ‘pen linewidth(real)’. The default line width is 0.5 bp; this value may be changed with ‘defaultpen(pen)’. The line width of a pen is returned by ‘real linewidth(pen p=currentpen)’. For convenience, in the module ‘plain_pens’ we define void defaultpen(real w) {defaultpen(linewidth(w));} pen operator +(pen p, real w) {return p+linewidth(w);} pen operator +(real w, pen p) {return linewidth(w)+p;} so that one may set the line width like this: defaultpen(2); pen p=red+0.5; • A pen with a specific ‘PostScript’ line cap is returned on calling ‘linecap’ with an integer argument: pen squarecap=linecap(0); pen roundcap=linecap(1); pen extendcap=linecap(2); The default line cap, ‘roundcap’, may be changed with ‘defaultpen(pen)’. The line cap of a pen is returned by ‘int linecap(pen p=currentpen)’. • A pen with a specific ‘PostScript’ join style is returned on calling ‘linejoin’ with an integer argument: pen miterjoin=linejoin(0); pen roundjoin=linejoin(1); pen beveljoin=linejoin(2); The default join style, ‘roundjoin’, may be changed with ‘defaultpen(pen)’.The join style of a pen is returned by ‘int linejoin(pen p=currentpen)’. • A pen with a specific ‘PostScript’ miter limit is returned by calling ‘miterlimit(real)’. The default miterlimit, ‘10.0’, may be changed with ‘defaultpen(pen)’. The miter limit of a pen is returned by ‘real miterlimit(pen p=currentpen)’. • A pen with a specific ‘PostScript’ fill rule is returned on calling ‘fillrule’ with an integer argument: pen zerowinding=fillrule(0); pen evenodd=fillrule(1); The fill rule, which identifies the algorithm used to determine the insideness of a path or array of paths, only affects the ‘clip’, ‘fill’, and ‘inside’ functions. For the ‘zerowinding’ fill rule, a point ‘z’ is outside the region bounded by a path if the number of upward intersections of the path with the horizontal line ‘z--z+infinity’ minus the number of downward intersections is zero. For the ‘evenodd’ fill rule, ‘z’ is considered to be outside the region if the total number of such intersections is even. The default fill rule, ‘zerowinding’, may be changed with ‘defaultpen(pen)’. The fill rule of a pen is returned by ‘int fillrule(pen p=currentpen)’. • A pen with a specific text alignment setting is returned on calling ‘basealign’ with an integer argument: pen nobasealign=basealign(0); pen basealign=basealign(1); The default setting, ‘nobasealign’, which may be changed with ‘defaultpen(pen)’, causes the label alignment routines to use the full label bounding box for alignment. In contrast, ‘basealign’ requests that the TeX baseline be respected. The base align setting of a pen is returned by ‘int basealign(pen p=currentpen)’. For example, in the following image, the baselines of green \pi and \gamma are aligned, while the bottom border of red -\pi and -\gamma are aligned. import fontsize; import three; settings.autobillboard=false; settings.embed=false; currentprojection=orthographic(Z); defaultpen(fontsize(100pt)); dot(O); label("acg",O,align=N,basealign); label("ace",O,align=N,red); label("acg",O,align=S,basealign); label("ace",O,align=S,red); label("acg",O,align=E,basealign); label("ace",O,align=E,red); label("acg",O,align=W,basealign); label("ace",O,align=W,red); picture pic; dot(pic,(labelmargin(),0,0),blue); dot(pic,(-labelmargin(),0,0),blue); dot(pic,(0,labelmargin(),0),blue); dot(pic,(0,-labelmargin(),0),blue); add(pic,O); dot((0,0)); label("acg",(0,0),align=N,basealign); label("ace",(0,0),align=N,red); label("acg",(0,0),align=S,basealign); label("ace",(0,0),align=S,red); label("acg",(0,0),align=E,basealign); label("ace",(0,0),align=E,red); label("acg",(0,0),align=W,basealign); label("ace",(0,0),align=W,red); picture pic; dot(pic,(labelmargin(),0),blue); dot(pic,(-labelmargin(),0),blue); dot(pic,(0,labelmargin()),blue); dot(pic,(0,-labelmargin()),blue); add(pic,(0,0)); [./basealign] Another method for aligning baselines is provided by the ‘baseline’ function (*note baseline::). • The font size is specified in TeX points (1 pt = 1/72.27 inches) with the function ‘pen fontsize(real size, real lineskip=1.2*size)’. The default font size, 12pt, may be changed with ‘defaultpen(pen)’. Nonstandard font sizes may require inserting import fontsize; at the beginning of the file (this requires the ‘type1cm’ package available from and included in recent ‘LaTeX’ distributions). The font size and line skip of a pen can be examined with the routines ‘real fontsize(pen p=currentpen)’ and ‘real lineskip(pen p=currentpen)’, respectively. • A pen using a specific LaTeX NFSS font is returned by calling the function ‘pen font(string encoding, string family, string series, string shape)’. The default setting, ‘font("OT1","cmr","m","n")’, corresponds to 12pt Computer Modern Roman; this may be changed with ‘defaultpen(pen)’. The font setting of a pen is returned by ‘string font(pen p=currentpen)’. Alternatively, one may select a fixed-size TeX font (on which ‘fontsize’ has no effect) like ‘"cmr12"’ (12pt Computer Modern Roman) or ‘"pcrr"’ (Courier) using the function ‘pen font(string name)’. An optional size argument can also be given to scale the font to the requested size: ‘pen font(string name, real size)’. A nonstandard font command can be generated with ‘pen fontcommand(string)’. A convenient interface to the following standard ‘PostScript’ fonts is also provided: pen AvantGarde(string series="m", string shape="n"); pen Bookman(string series="m", string shape="n"); pen Courier(string series="m", string shape="n"); pen Helvetica(string series="m", string shape="n"); pen NewCenturySchoolBook(string series="m", string shape="n"); pen Palatino(string series="m", string shape="n"); pen TimesRoman(string series="m", string shape="n"); pen ZapfChancery(string series="m", string shape="n"); pen Symbol(string series="m", string shape="n"); pen ZapfDingbats(string series="m", string shape="n"); • Starting with the 2018/04/01 release, LaTeX takes UTF-8 as the new default input encoding. However, you can still set different input encoding (so as the font, font encoding or even language context). Here is an example for ‘cp1251’ and Russian language in Cyrillic script (font encoding ‘T2A’): texpreamble("\usepackage[math]{anttor}"); texpreamble("\usepackage[T2A]{fontenc}"); texpreamble("\usepackage[cp1251]{inputenc}"); texpreamble("\usepackage[russian]{babel}"); Support for Chinese, Japanese, and Korean fonts is provided by the CJK package: The following commands enable the CJK song family (within a label, you can also temporarily switch to another family, say kai, by prepending ‘"\CJKfamily{kai}"’ to the label string): texpreamble("\usepackage{CJK} \AtBeginDocument{\begin{CJK*}{GBK}{song}} \AtEndDocument{\clearpage\end{CJK*}}"); • The transparency of a pen can be changed with the command: pen opacity(real opacity=1, string blend="Compatible"); The opacity can be varied from ‘0’ (fully transparent) to the default value of ‘1’ (opaque), and ‘blend’ specifies one of the following foreground-background blending operations: "Compatible","Normal","Multiply","Screen","Overlay","SoftLight", "HardLight","ColorDodge","ColorBurn","Darken","Lighten","Difference", "Exclusion","Hue","Saturation","Color","Luminosity", as described in Tables 136 and 137 of . Since ‘PostScript’ does not support transparency, this feature is only effective with the ‘-f pdf’ output format option; other formats can be produced from the resulting PDF file with the ‘ImageMagick’ ‘magick’ program. Labels are always drawn with an ‘opacity’ of 1. A simple example of transparent filling is provided in the example file ‘transparency.asy’. • ‘PostScript’ commands within a ‘picture’ may be used to create a tiling pattern, identified by the string ‘name’, for ‘fill’ and ‘draw’ operations by adding it to the global ‘PostScript’ frame ‘currentpatterns’, with optional left-bottom margin ‘lb’ and right-top margin ‘rt’. import patterns; void add(string name, picture pic, pair lb=0, pair rt=0); To ‘fill’ or ‘draw’ using pattern ‘name’, use the pen ‘pattern("name")’. For example, rectangular tilings can be constructed using the routines ‘picture tile(real Hx=5mm, real Hy=0, pen p=currentpen, filltype filltype=NoFill)’, ‘picture checker(real Hx=5mm, real Hy=0, pen p=currentpen)’, and ‘picture brick(real Hx=5mm, real Hy=0, pen p=currentpen)’ defined in module ‘patterns’: size(0,90); import patterns; add("tile",tile()); add("filledtilewithmargin",tile(6mm,4mm,red,Fill),(1mm,1mm),(1mm,1mm)); add("checker",checker()); add("brick",brick()); real s=2.5; filldraw(unitcircle,pattern("tile")); filldraw(shift(s,0)*unitcircle,pattern("filledtilewithmargin")); filldraw(shift(2s,0)*unitcircle,pattern("checker")); filldraw(shift(3s,0)*unitcircle,pattern("brick")); [./tile] Hatch patterns can be generated with the routines ‘picture hatch(real H=5mm, pair dir=NE, pen p=currentpen)’, ‘picture crosshatch(real H=5mm, pen p=currentpen)’: size(0,100); import patterns; add("hatch",hatch()); add("hatchback",hatch(NW)); add("crosshatch",crosshatch(3mm)); real s=1.25; filldraw(unitsquare,pattern("hatch")); filldraw(shift(s,0)*unitsquare,pattern("hatchback")); filldraw(shift(2s,0)*unitsquare,pattern("crosshatch")); [./hatch] You may need to turn off aliasing in your ‘PostScript’ viewer for patterns to appear correctly. Custom patterns can easily be constructed, following the examples in module ‘patterns’. The tiled pattern can even incorporate shading (*note gradient shading::), as illustrated in this example (not included in the manual because not all printers support ‘PostScript’ 3): size(0,100); import patterns; real d=4mm; picture tiling; path square=scale(d)*unitsquare; axialshade(tiling,square,white,(0,0),black,(d,d)); fill(tiling,shift(d,d)*square,blue); add("shadedtiling",tiling); filldraw(unitcircle,pattern("shadedtiling")); • One can specify a custom pen nib as an arbitrary polygonal path with ‘pen makepen(path)’; this path represents the mark to be drawn for paths containing a single point. This pen nib path can be recovered from a pen with ‘path nib(pen)’. Unlike in ‘MetaPost’, the path need not be convex: size(200); pen convex=makepen(scale(10)*polygon(8))+grey; draw((1,0.4),convex); draw((0,0)---(1,1)..(2,0)--cycle,convex); pen nonconvex=scale(10)* makepen((0,0)--(0.25,-1)--(0.5,0.25)--(1,0)--(0.5,1.25)--cycle)+red; draw((0.5,-1.5),nonconvex); draw((0,-1.5)..(1,-0.5)..(2,-1.5),nonconvex); [./makepen] The value ‘nullpath’ represents a circular pen nib (the default); an elliptical pen can be achieved simply by multiplying the pen by a transform: ‘yscale(2)*currentpen’. • One can prevent labels from overwriting one another by using the pen attribute ‘overwrite’, which takes a single argument: ‘Allow’ Allow labels to overwrite one another. This is the default behavior (unless overridden with ‘defaultpen(pen)’. ‘Suppress’ Suppress, with a warning, each label that would overwrite another label. ‘SuppressQuiet’ Suppress, without warning, each label that would overwrite another label. ‘Move’ Move a label that would overwrite another out of the way and issue a warning. As this adjustment is during the final output phase (in ‘PostScript’ coordinates) it could result in a larger figure than requested. ‘MoveQuiet’ Move a label that would overwrite another out of the way, without warning. As this adjustment is during the final output phase (in ‘PostScript’ coordinates) it could result in a larger figure than requested. The routine ‘defaultpen()’ returns the current default pen attributes. Calling the routine ‘resetdefaultpen()’ resets all pen default attributes to their initial values.  File: asymptote.info, Node: Transforms, Next: Frames and pictures, Prev: Pens, Up: Programming 6.4 Transforms ============== ‘Asymptote’ makes extensive use of affine transforms. A pair ‘(x,y)’ is transformed by the transform ‘t=(t.x,t.y,t.xx,t.xy,t.yx,t.yy)’ to ‘(x',y')’, where x' = t.x + t.xx * x + t.xy * y y' = t.y + t.yx * x + t.yy * y This is equivalent to the ‘PostScript’ transformation ‘[t.xx t.yx t.xy t.yy t.x t.y]’. Transforms can be applied to pairs, guides, paths, pens, strings, transforms, frames, and pictures by multiplication (via the binary operator ‘*’) on the left (*note circle:: for an example). Transforms can be composed with one another and inverted with the function ‘transform inverse(transform t)’; they can also be raised to any integer power with the ‘^’ operator. The built-in transforms are: ‘transform identity;’ the identity transform; ‘transform shift(pair z);’ translates by the pair ‘z’; ‘transform shift(real x, real y);’ translates by the pair ‘(x,y)’; ‘transform xscale(real x);’ scales by ‘x’ in the x direction; ‘transform yscale(real y);’ scales by ‘y’ in the y direction; ‘transform scale(real s);’ scale by ‘s’ in both x and y directions; ‘transform scale(real x, real y);’ scale by ‘x’ in the x direction and by ‘y’ in the y direction; ‘transform slant(real s);’ maps ‘(x,y)’ -> ‘(x+s*y,y)’; ‘transform rotate(real angle, pair z=(0,0));’ rotates by ‘angle’ in degrees about ‘z’; ‘transform reflect(pair a, pair b);’ reflects about the line ‘a--b’. ‘transform zeroTransform;’ the zero transform; The implicit initializer for transforms is ‘identity()’. The routines ‘shift(transform t)’ and ‘shiftless(transform t)’ return the transforms ‘(t.x,t.y,0,0,0,0)’ and ‘(0,0,t.xx,t.xy,t.yx,t.yy)’ respectively. The function ‘bool isometry(transform t)’ can be used to test if ‘t’ is an isometry (preserves distance).  File: asymptote.info, Node: Frames and pictures, Next: Deferred drawing, Prev: Transforms, Up: Programming 6.5 Frames and pictures ======================= ‘frame’ Frames are canvases for drawing in ‘PostScript’ coordinates. While working with frames directly is occasionally necessary for constructing deferred drawing routines The implicit initializer for frames is ‘newframe’. The function ‘bool empty(frame f)’ returns ‘true’ only if the frame ‘f’ is empty. A frame may be erased with the ‘erase(frame)’ routine. The functions ‘pair min(frame)’ and ‘pair max(frame)’ return the (left,bottom) and (right,top) coordinates of the frame bounding box, respectively. The contents of frame ‘src’ may be appended to frame ‘dest’ with the command void add(frame dest, frame src); or prepended with void prepend(frame dest, frame src); A frame obtained by aligning frame ‘f’ in the direction ‘align’, in a manner analogous to the ‘align’ argument of ‘label’ (*note label::), is returned by frame align(frame f, pair align); ‘picture’ Pictures are high-level structures (*note Structures::) defined in the module ‘plain’ that provide canvases for drawing in user coordinates. The default picture is called ‘currentpicture’. A new picture can be created like this: picture pic; Anonymous pictures can be made by the expression ‘new picture’. The ‘size’ routine specifies the dimensions of the desired picture: void size(picture pic=currentpicture, real x, real y=x, bool keepAspect=pic.keepAspect); If the ‘x’ and ‘y’ sizes are both 0, user coordinates will be interpreted as ‘PostScript’ coordinates. In this case, the transform mapping ‘pic’ to the final output frame is ‘identity()’. If exactly one of ‘x’ or ‘y’ is 0, no size restriction is imposed in that direction; it will be scaled the same as the other direction. If ‘keepAspect’ is set to ‘Aspect’ or ‘true’ (the default), the picture will be scaled with its aspect ratio preserved such that the final width is no more than ‘x’ and the final height is no more than ‘y’. If ‘keepAspect’ is set to ‘IgnoreAspect’ or ‘false’, the picture will be scaled in both directions so that the final width is ‘x’ and the height is ‘y’. To make the user coordinates of picture ‘pic’ represent multiples of ‘x’ units in the x direction and ‘y’ units in the y direction, use void unitsize(picture pic=currentpicture, real x, real y=x); When nonzero, these ‘x’ and ‘y’ values override the corresponding size parameters of picture ‘pic’. The routine void size(picture pic=currentpicture, real xsize, real ysize, pair min, pair max); forces the final picture scaling to map the user coordinates ‘box(min,max)’ to a region of width ‘xsize’ and height ‘ysize’ (when these parameters are nonzero). Alternatively, calling the routine transform fixedscaling(picture pic=currentpicture, pair min, pair max, pen p=nullpen, bool warn=false); will cause picture ‘pic’ to use a fixed scaling to map user coordinates in ‘box(min,max)’ to the (already specified) picture size, taking account of the width of pen ‘p’. A warning will be issued if the final picture exceeds the specified size. A picture ‘pic’ can be fit to a frame and output to a file ‘prefix’.‘format’ using image format ‘format’ by calling the ‘shipout’ function: void shipout(string prefix=defaultfilename, picture pic=currentpicture, orientation orientation=orientation, string format="", bool wait=false, bool view=true, string options="", string script="", light light=currentlight, projection P=currentprojection) The default output format, ‘PostScript’, may be changed with the ‘-f’ or ‘-tex’ command-line options. The ‘options’, ‘script’, and ‘projection’ parameters are only relevant for 3D pictures. If ‘defaultfilename’ is an empty string, the prefix ‘outprefix()’ will be used. A ‘shipout()’ command is added implicitly at file exit. Explicit ‘shipout()’ commands to the same file as the final implicit shipout are ignored. The default page orientation is ‘Portrait’; this may be modified by changing the variable ‘orientation’. To output in landscape mode, simply set the variable ‘orientation=Landscape’ or issue the command shipout(Landscape); To rotate the page by -90 degrees, use the orientation ‘Seascape’. The orientation ‘UpsideDown’ rotates the page by 180 degrees. A picture ‘pic’ can be explicitly fit to a frame by calling frame pic.fit(real xsize=pic.xsize, real ysize=pic.ysize, bool keepAspect=pic.keepAspect); The default size and aspect ratio settings are those given to the ‘size’ command (which default to ‘0’, ‘0’, and ‘true’, respectively). The transformation that would currently be used to fit a picture ‘pic’ to a frame is returned by the member function ‘pic.calculateTransform()’. In certain cases (e.g. 2D graphs) where only an approximate size estimate for ‘pic’ is available, the picture fitting routine frame pic.scale(real xsize=this.xsize, real ysize=this.ysize, bool keepAspect=this.keepAspect); (which scales the resulting frame, including labels and fixed-size objects) will enforce perfect compliance with the requested size specification, but should not normally be required. To draw a bounding box with margins around a picture, fit the picture to a frame using the function frame bbox(picture pic=currentpicture, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill); Here ‘filltype’ specifies one of the following fill types: ‘FillDraw’ Fill the interior and draw the boundary. ‘FillDraw(real xmargin=0, real ymargin=xmargin, pen fillpen=nullpen,’ ‘pen drawpen=nullpen)’ If ‘fillpen’ is ‘nullpen’, fill with the drawing pen; otherwise fill with pen ‘fillpen’. If ‘drawpen’ is ‘nullpen’, draw the boundary with ‘fillpen’; otherwise with ‘drawpen’. An optional margin of ‘xmargin’ and ‘ymargin’ can be specified. ‘Fill’ Fill the interior. ‘Fill(real xmargin=0, real ymargin=xmargin, pen p=nullpen)’ If ‘p’ is ‘nullpen’, fill with the drawing pen; otherwise fill with pen ‘p’. An optional margin of ‘xmargin’ and ‘ymargin’ can be specified. ‘NoFill’ Do not fill. ‘Draw’ Draw only the boundary. ‘Draw(real xmargin=0, real ymargin=xmargin, pen p=nullpen)’ If ‘p’ is ‘nullpen’, draw the boundary with the drawing pen; otherwise draw with pen ‘p’. An optional margin of ‘xmargin’ and ‘ymargin’ can be specified. ‘UnFill’ Clip the region. ‘UnFill(real xmargin=0, real ymargin=xmargin)’ Clip the region and surrounding margins ‘xmargin’ and ‘ymargin’. ‘RadialShade(pen penc, pen penr)’ Fill varying radially from ‘penc’ at the center of the bounding box to ‘penr’ at the edge. ‘RadialShadeDraw(real xmargin=0, real ymargin=xmargin, pen penc,’ ‘pen penr, pen drawpen=nullpen)’ Fill with RadialShade and draw the boundary. For example, to draw a bounding box around a picture with a 0.25 cm margin and output the resulting frame, use the command: shipout(bbox(0.25cm)); A ‘picture’ may be fit to a frame with the background color pen ‘p’, using the function ‘bbox(p,Fill)’. To pad a picture to a precise size in both directions, fit the picture to a frame using the function frame pad(picture pic=currentpicture, real xsize=pic.xsize, real ysize=pic.ysize, filltype filltype=NoFill); The functions pair min(picture pic, user=false); pair max(picture pic, user=false); pair size(picture pic, user=false); calculate the bounds that picture ‘pic’ would have if it were currently fit to a frame using its default size specification. If ‘user’ is ‘false’ the returned value is in ‘PostScript’ coordinates, otherwise it is in user coordinates. The function pair point(picture pic=currentpicture, pair dir, bool user=true); is a convenient way of determining the point on the bounding box of ‘pic’ in the direction ‘dir’ relative to its center, ignoring the contributions from fixed-size objects (such as labels and arrowheads). If ‘user’ is ‘true’ the returned value is in user coordinates, otherwise it is in ‘PostScript’ coordinates. The function pair truepoint(picture pic=currentpicture, pair dir, bool user=true); is identical to ‘point’, except that it also accounts for fixed-size objects, using the scaling transform that picture ‘pic’ would have if currently fit to a frame using its default size specification. If ‘user’ is ‘true’ the returned value is in user coordinates, otherwise it is in ‘PostScript’ coordinates. Sometimes it is useful to draw objects on separate pictures and add one picture to another using the ‘add’ function: void add(picture src, bool group=true, filltype filltype=NoFill, bool above=true); void add(picture dest, picture src, bool group=true, filltype filltype=NoFill, bool above=true); The first example adds ‘src’ to ‘currentpicture’; the second one adds ‘src’ to ‘dest’. The ‘group’ option specifies whether or not the graphical user interface should treat all of the elements of ‘src’ as a single entity (*note GUI::), ‘filltype’ requests optional background filling or clipping, and ‘above’ specifies whether to add ‘src’ above or below existing objects. There are also routines to add a fixed-size picture or frame ‘src’ to another picture ‘dest’ (or ‘currentpicture’) about the user coordinate ‘position’: void add(picture src, pair position, bool group=true, filltype filltype=NoFill, bool above=true); void add(picture dest, picture src, pair position, bool group=true, filltype filltype=NoFill, bool above=true); void add(picture dest=currentpicture, frame src, pair position=0, bool group=true, filltype filltype=NoFill, bool above=true); void add(picture dest=currentpicture, frame src, pair position, pair align, bool group=true, filltype filltype=NoFill, bool above=true); The optional ‘align’ argument in the last form specifies a direction to use for aligning the frame, in a manner analogous to the ‘align’ argument of ‘label’ (*note label::). However, one key difference is that when ‘align’ is not specified, labels are centered, whereas frames and pictures are aligned so that their origin is at ‘position’. Illustrations of frame alignment can be found in the examples *note errorbars:: and *note image::. If you want to align three or more subpictures, group them two at a time: picture pic1; real size=50; size(pic1,size); fill(pic1,(0,0)--(50,100)--(100,0)--cycle,red); picture pic2; size(pic2,size); fill(pic2,unitcircle,green); picture pic3; size(pic3,size); fill(pic3,unitsquare,blue); picture pic; add(pic,pic1.fit(),(0,0),N); add(pic,pic2.fit(),(0,0),10S); add(pic.fit(),(0,0),N); add(pic3.fit(),(0,0),10S); [./subpictures] Alternatively, one can use ‘attach’ to automatically increase the size of picture ‘dest’ to accommodate adding a frame ‘src’ about the user coordinate ‘position’: void attach(picture dest=currentpicture, frame src, pair position=0, bool group=true, filltype filltype=NoFill, bool above=true); void attach(picture dest=currentpicture, frame src, pair position, pair align, bool group=true, filltype filltype=NoFill, bool above=true); To erase the contents of a picture (but not the size specification), use the function void erase(picture pic=currentpicture); To save a snapshot of ‘currentpicture’, ‘currentpen’, and ‘currentprojection’, use the function ‘save()’. To restore a snapshot of ‘currentpicture’, ‘currentpen’, and ‘currentprojection’, use the function ‘restore()’. Many further examples of picture and frame operations are provided in the base module ‘plain’. It is possible to insert verbatim ‘PostScript’ commands in a picture with one of the routines void postscript(picture pic=currentpicture, string s); void postscript(picture pic=currentpicture, string s, pair min, pair max) Here ‘min’ and ‘max’ can be used to specify explicit bounds associated with the resulting ‘PostScript’ code. Verbatim TeX commands can be inserted in the intermediate ‘LaTeX’ output file with one of the functions void tex(picture pic=currentpicture, string s); void tex(picture pic=currentpicture, string s, pair min, pair max) Here ‘min’ and ‘max’ can be used to specify explicit bounds associated with the resulting TeX code. To issue a global TeX command (such as a TeX macro definition) in the TeX preamble (valid for the remainder of the top-level module) use: void texpreamble(string s); The TeX environment can be reset to its initial state, clearing all macro definitions, with the function void texreset(); The routine void usepackage(string s, string options=""); provides a convenient abbreviation for texpreamble("\usepackage["+options+"]{"+s+"}"); that can be used for importing ‘LaTeX’ packages.  File: asymptote.info, Node: Deferred drawing, Next: Files, Prev: Frames and pictures, Up: Programming 6.6 Deferred drawing ==================== It is sometimes desirable to have elements of a fixed absolute size, independent of the picture scaling from user to ‘PostScript’ coordinates. For example, normally one would want the size of a dot created with ‘dot’, the size of the arrowheads created with ‘arrow’ (*note arrows::), and labels to be drawn independent of the scaling. However, because of ‘Asymptote’'s automatic scaling feature (*note Figure size::), the translation between user coordinate and ‘PostScript’ coordinate is not determined until shipout time: size(1cm); dot((0,0)); dot((1,1)); shipout("x"); // at this point, 1 unit coordinate = 1cm dot((2,2)); shipout("y"); // at this point, 1 unit coordinate = 0.5cm It is therefore necessary to defer the drawing of these elements until shipout time. For example, a frame can be added at a specified user coordinate of a picture with the deferred drawing routine ‘add(picture dest=currentpicture, frame src, pair position)’: frame f; fill(f,circle((0,0),1.5pt)); add(f,position=(1,1),align=(0,0)); A deferred drawing routine is an object of type ‘drawer’, which is a function with signature ‘void(frame f, transform t)’. For example, if the drawing routine void d(frame f, transform t){ fill(f,shift(3cm,0)*circle(t*(1,1),2pt)); } is added to ‘currentpicture’ with currentpicture.add(d); a filled circle of radius 2pt will be drawn on currentpicture centered 3cm to the right of user coordinate ‘(1,1)’. The parameter ‘t’ is the affine transformation from user coordinates to ‘PostScript’ coordinates. Even though the actual drawing is deferred, you still need to specify to the ‘Asymptote’ scaling routines that ultimately a fixed-size circle of radius 2pt will be drawn 3cm to the right of user-coordinate (1,1), by adding a frame about (1,1) that extends beyond (1,1) from ‘(3cm-2pt,-2pt)+min(currentpen)’ to ‘(3cm+2pt,2pt)+max(currentpen)’, where we have even accounted for the pen linewidth. The following example will then produce a PDF file 10 cm wide: settings.outformat="pdf"; size(10cm); dot((0,0)); dot((1,1),red); add(new void(frame f, transform t) { fill(f,shift(3cm,0)*circle(t*(1,1),2pt)); }); pair trueMin=(3cm-2pt,-2pt)+min(currentpen); pair trueMax=(3cm+2pt,2pt)+max(currentpen); currentpicture.addPoint((1,1),trueMin); currentpicture.addPoint((1,1),trueMax); Here we specified the minimum and maximum user and truesize (fixed) coordinates of the drawer with the ‘picture’ routine void addPoint(pair user, pair truesize); Alternatively, one can use void addBox(pair userMin, pair userMax, pair trueMin=0, pair trueMax=0) { to specify a bounding box with bottom-left corner ‘t*(1,1)+trueMin’ and top-right corner ‘t*(1,1)+trueMax’, where ‘t’ is the transformation that transforms from user coordinates to ‘PostScript’ coordinates. For more details about deferred drawing, see "Asymptote: A vector graphics language," John C. Bowman and Andy Hammerlindl, TUGBOAT: The Communications of the TeX Users Group, 29:2, 288-294 (2008), .  File: asymptote.info, Node: Files, Next: Variable initializers, Prev: Deferred drawing, Up: Programming 6.7 Files ========= ‘Asymptote’ can read and write text files (including comma-separated value) files and portable XDR (External Data Representation) binary files. An input file can be opened with input(string name="" reading is then done by assignment: file fin=input("test.txt"); real a=fin; If the optional boolean argument ‘check’ is ‘false’, no check will be made that the file exists. If the file does not exist or is not readable, the function ‘bool error(file)’ will return ‘true’. The first character of the string ‘comment’ specifies a comment character. If this character is encountered in a data file, the remainder of the line is ignored. When reading strings, a comment character followed immediately by another comment character is treated as a single literal comment character. If ‘Asymptote’ is compiled with support for ‘libcurl’, ‘name’ can be a URL. Unless the ‘-noglobalread’ command-line option is specified, one can change the current working directory for read operations to the contents of the string ‘s’ with the function ‘string cd(string s)’, which returns the new working directory. If ‘string s’ is empty, the path is reset to the value it had at program startup. When reading pairs, the enclosing parenthesis are optional. Strings are also read by assignment, by reading characters up to but not including a newline. In addition, ‘Asymptote’ provides the function ‘string getc(file)’ to read the next character (treating the comment character as an ordinary character) and return it as a string. A file named ‘name’ can be open for output with file output(string name="", bool update=false, string comment="#", string mode=""); If ‘update=false’, any existing data in the file will be erased and only write operations can be used on the file. If ‘update=true’, any existing data will be preserved, the position will be set to the end-of-file, and both reading and writing operations will be enabled. For security reasons, writing to files in directories other than the current directory is allowed only if the ‘-globalwrite’ (or ‘-nosafe’) command-line option is specified. Reading from files in other directories is allowed unless the ‘-noglobalread’ command-line option is specified. The function ‘string mktemp(string s)’ may be used to create and return the name of a unique temporary file in the current directory based on the string ‘s’. There are two special files: ‘stdin’, which reads from the keyboard, and ‘stdout’, which writes to the terminal. The implicit initializer for files is ‘null’. Data of a built-in type ‘T’ can be written to an output file by calling one of the functions write(string s="", T x, suffix suffix=endl ... T[]); write(file file, string s="", T x, suffix suffix=none ... T[]); write(file file=stdout, string s="", explicit T[] x ... T[][]); write(file file=stdout, T[][]); write(file file=stdout, T[][][]); write(suffix suffix=endl); write(file file, suffix suffix=none); If ‘file’ is not specified, ‘stdout’ is used and terminated by default with a newline. If specified, the optional identifying string ‘s’ is written before the data ‘x’. An arbitrary number of data values may be listed when writing scalars or one-dimensional arrays. The ‘suffix’ may be one of the following: ‘none’ (do nothing), ‘flush’ (output buffered data), ‘endl’ (terminate with a newline and flush), ‘newl’ (terminate with a newline), ‘DOSendl’ (terminate with a DOS newline and flush), ‘DOSnewl’ (terminate with a DOS newline), ‘tab’ (terminate with a tab), or ‘comma’ (terminate with a comma). Here are some simple examples of data output: file fout=output("test.txt"); write(fout,1); // Writes "1" write(fout, endl); // Writes a new line write(fout,"List: ",1,2,3); // Writes "List: 1 2 3" A file may be opened with ‘mode="xdr"’ to read or write double precision (64-bit) reals and single precision (32-bit) integers in Sun Microsystem's XDR (External Data Representation) portable binary format. A file may instead be opened with ‘mode="binary"’ to read or write double precision reals and single precision integers in the native (nonportable) machine binary format. The virtual member functions ‘file singlereal(bool b=true)’ and ‘file singleint(bool b=true)’ may be used to change the precision of real and integer I/O operations, respectively, for an XDR or binary file. Similarly, the function ‘file signedint(bool b=true)’ can be used to modify the signedness of integer reads and writes for an XDR or binary file. Since there are no end-of-line terminators in these formats, reading a string from an XDR or binary file will by default read in the remainder of the file as a string. The virtual member function ‘file word(bool b=true)’ may be used to change this behaviour: a double precision integer specifying the length of the string is first read or written, followed by that many characters. The virtual fields ‘name’, ‘mode’, ‘singlereal’, ‘singleint’, and ‘signedint’ may be used to query these respective states of a file. One can test a file for end-of-file with the boolean function ‘eof(file)’, end-of-line with ‘eol(file)’, and for I/O errors with ‘error(file)’. One can flush the output buffers with ‘flush(file)’, clear a previous I/O error with ‘clear(file)’, and close the file with ‘close(file)’. The function ‘int precision(file file=stdout, int digits=0)’ sets the number of digits of output precision for ‘file’ to ‘digits’, provided ‘digits’ is nonzero, and returns the previous precision setting. The function ‘int tell(file)’ returns the current position in a file relative to the beginning. The routine ‘seek(file file, int pos)’ can be used to change this position, where a negative value for the position ‘pos’ is interpreted as relative to the end-of-file. For example, one can rewind a file ‘file’ with the command ‘seek(file,0)’ and position to the final character in the file with ‘seek(file,-1)’. The command ‘seekeof(file)’ sets the position to the end of the file. Assigning ‘settings.scroll=n’ for a positive integer ‘n’ requests a pause after every ‘n’ output lines to ‘stdout’. One may then press ‘Enter’ to continue to the next ‘n’ output lines, ‘s’ followed by ‘Enter’ to scroll without further interruption, or ‘q’ followed by ‘Enter’ to quit the current output operation. If ‘n’ is negative, the output scrolls a page at a time (i.e. by one less than the current number of display lines). The default value, ‘settings.scroll=0’, specifies continuous scrolling. The routines string getstring(string name="", string default="", string prompt="", bool store=true); int getint(string name="", int default=0, string prompt="", bool store=true); real getreal(string name="", real default=0, string prompt="", bool store=true); pair getpair(string name="", pair default=0, string prompt="", bool store=true); triple gettriple(string name="", triple default=(0,0,0), string prompt="", bool store=true); defined in the module ‘plain’ may be used to prompt for a value from ‘stdin’ using the GNU ‘readline’ library. If ‘store=true’, the history of values for ‘name’ is stored in the file ‘".asy_history_"+name’ (*note history::). The most recent value in the history will be used to provide a default value for subsequent runs. The default value (initially ‘default’) is displayed after ‘prompt’. These functions are based on the internal routines string readline(string prompt="", string name="", bool tabcompletion=false); void saveline(string name, string value, bool store=true); Here, ‘readline’ prompts the user with the default value formatted according to ‘prompt’, while ‘saveline’ is used to save the string ‘value’ in a local history named ‘name’, optionally storing the local history in a file ‘".asy_history_"+name’. The routine ‘history(string name, int n=1)’ can be used to look up the ‘n’ most recent values (or all values up to ‘historylines’ if ‘n=0’) entered for string ‘name’. The routine ‘history(int n=0)’ returns the interactive history. For example, write(output("transcript.asy"),history()); outputs the interactive history to the file ‘transcript.asy’. The function ‘int delete(string s)’ deletes the file named by the string ‘s’. Unless the ‘-globalwrite’ (or ‘-nosafe’) option is enabled, the file must reside in the current directory. The function ‘int rename(string from, string to)’ may be used to rename file ‘from’ to file ‘to’. Unless the ‘-globalwrite’ (or ‘-nosafe’) option is enabled, this operation is restricted to the current directory. The functions int convert(string args="", string file="", string format=""); int animate(string args="", string file="", string format=""); call the ‘ImageMagick’ commands ‘magick’ and ‘animate’, respectively, with the arguments ‘args’ and the file name constructed from the strings ‘file’ and ‘format’.  File: asymptote.info, Node: Variable initializers, Next: Structures, Prev: Files, Up: Programming 6.8 Variable initializers ========================= A variable can be assigned a value when it is declared ‘int x=3;’ where the variable ‘x’ is assigned the value ‘3’. As well as literal constants such as ‘3’, arbitary expressions can be used as initializers, as in ‘real x=2*sin(pi/2);’. A variable is not added to the namespace until after the initializer is evaluated, so for example, in int x=2; int x=5*x; the ‘x’ in the initializer on the second line refers to the variable ‘x’ declared on the first line. The second line, then, declares a variable ‘x’ shadowing the original ‘x’ and initializes it to the value ‘10’. Variables of most types can be declared without an explicit initializer and they will be initialized by the default initializer of that type: • Variables of the numeric types ‘int’, ‘real’, and ‘pair’ are all initialized to zero; variables of type ‘triple’ are initialized to ‘O=(0,0,0)’. • ‘boolean’ variables are initialized to ‘false’. • ‘string’ variables are initialized to the empty string. • ‘transform’ variables are initialized to the identity transformation. • ‘path’ and ‘guide’ variables are initialized to ‘nullpath’. • ‘pen’ variables are initialized to the default pen. • ‘frame’ and ‘picture’ variables are initialized to empty frames and pictures, respectively. • ‘file’ variables are initialized to ‘null’. The default initializers for user-defined array, structure, and function types are explained in their respective sections. Some types, such as ‘code’, do not have default initializers. When a variable of such a type is introduced, the user must initialize it by explicitly giving it a value. The default initializer for any type ‘T’ can be redeclared by defining the function ‘T operator init()’. For instance, ‘int’ variables are usually initialized to zero, but in int operator init() { return 3; } int y; the variable ‘y’ is initialized to ‘3’. This example was given for illustrative purposes; redeclaring the initializers of built-in types is not recommended. Typically, ‘operator init’ is used to define sensible defaults for user-defined types. The special type ‘var’ may be used to infer the type of a variable from its initializer. If the initializer is an expression of a unique type, then the variable will be defined with that type. For instance, var x=5; var y=4.3; var reddash=red+dashed; is equivalent to int x=5; real y=4.3; pen reddash=red+dashed; ‘var’ may also be used with the extended ‘for’ loop syntax. int[] a = {1,2,3}; for (var x : a) write(x);  File: asymptote.info, Node: Structures, Next: Operators, Prev: Variable initializers, Up: Programming 6.9 Structures ============== Users may also define their own data types as structures, along with user-defined operators, much as in C++. By default, structure members are ‘public’ (may be read and modified anywhere in the code), but may be optionally declared ‘restricted’ (readable anywhere but writeable only inside the structure where they are defined) or ‘private’ (readable and writable only inside the structure). In a structure definition, the keyword ‘this’ can be used as an expression to refer to the enclosing structure. Any code at the top-level scope within the structure is executed on initialization. Variables hold references to structures. That is, in the example: struct T { int x; } T foo; T bar=foo; bar.x=5; The variable ‘foo’ holds a reference to an instance of the structure ‘T’. When ‘bar’ is assigned the value of ‘foo’, it too now holds a reference to the same instance as ‘foo’ does. The assignment ‘bar.x=5’ changes the value of the field ‘x’ in that instance, so that ‘foo.x’ will also be equal to ‘5’. The expression ‘new T’ creates a new instance of the structure ‘T’ and returns a reference to that instance. In creating the new instance, any code in the body of the record definition is executed. For example: int Tcount=0; struct T { int x; ++Tcount; } T foo=new T; T foo; Here, ‘new T’ produces a new instance of the class, which causes ‘Tcount’ to be incremented, tracking the number of instances produced. The declarations ‘T foo=new T’ and ‘T foo’ are equivalent: the second form implicitly creates a new instance of ‘T’. That is, after the definition of a structure ‘T’, a variable of type ‘T’ is initialized to a new instance (‘new T’) by default. During the definition of the structure, however, variables of type ‘T’ are initialized to ‘null’ by default. This special behavior is to avoid infinite recursion of creating new instances in code such as struct tree { int value; tree left; tree right; } The expression ‘null’ can be cast to any structure type to yield a null reference, a reference that does not actually refer to any instance of the structure. Trying to use a field of a null reference will cause an error. The function ‘bool alias(T,T)’ checks to see if two structure references refer to the same instance of the structure (or both to ‘null’). In the example at the beginning of this section, ‘alias(foo,bar)’ would return true, but ‘alias(foo,new T)’ would return false, as ‘new T’ creates a new instance of the structure ‘T’. The boolean operators ‘==’ and ‘!=’ are by default equivalent to ‘alias’ and ‘!alias’ respectively, but may be overwritten for a particular type (for example, to do a deep comparison). Here is a simple example that illustrates the use of structures: struct S { real a=1; real f(real a) {return a+this.a;} } S s; // Initializes s with new S; write(s.f(2)); // Outputs 3 S operator + (S s1, S s2) { S result; result.a=s1.a+s2.a; return result; } write((s+s).f(0)); // Outputs 2 It is often convenient to have functions that construct new instances of a structure. Say we have a ‘Person’ structure: struct Person { string firstname; string lastname; } Person joe; joe.firstname="Joe"; joe.lastname="Jones"; Creating a new Person is a chore; it takes three lines to create a new instance and to initialize its fields (that's still considerably less effort than creating a new person in real life, though). We can reduce the work by defining ‘operator init’: struct Person { string firstname; string lastname; void operator init(string firstname, string lastname) { this.firstname=firstname; this.lastname=lastname; } } Person joe=Person("Joe", "Jones"); The use of ‘operator init’ to implicitly define constructors should not be confused with its use to define default values for variables (*note Variable initializers::). Indeed, in the first case, the return type of the ‘operator init’ must be ‘void’ while in the second, it must be the (non-‘void’) type of the variable. Internally, ‘operator init’ implicitly defines a constructor function ‘Person(string,string)’ as follows, where ARGS is ‘string firstname, string lastname’ in this case: struct Person { string firstname; string lastname; static Person Person(ARGS) { Person p=new Person; p.operator init(ARGS); return p; } } which then can be used as: Person joe=Person.Person("Joe", "Jones"); The following is also implicitly generated in the enclosing scope, after the end of the structure definition. from Person unravel Person; It allows us to use the constructor without qualification, otherwise we would have to refer to the constructor by the qualified name ‘Person.Person’. Much like in C++, casting (*note Casts::) provides for an elegant implementation of structure inheritance, including a virtual function ‘v’: struct parent { real x; void operator init(int x) {this.x=x;} void v(int) {write(0);} void f() {v(1);} } void write(parent p) {write(p.x);} struct child { parent parent; real y=3; void operator init(int x) {parent.operator init(x);} void v(int x) {write(x);} parent.v=v; void f()=parent.f; } parent operator cast(child child) {return child.parent;} parent p=parent(1); child c=child(2); write(c); // Outputs 2; p.f(); // Outputs 0; c.f(); // Outputs 1; write(c.parent.x); // Outputs 2; write(c.y); // Outputs 3; For further examples of structures, see ‘Legend’ and ‘picture’ in the ‘Asymptote’ base module ‘plain’.  File: asymptote.info, Node: Operators, Next: Implicit scaling, Prev: Structures, Up: Programming 6.10 Operators ============== * Menu: * Arithmetic & logical:: Basic mathematical operators * Self & prefix operators:: Increment and decrement * User-defined operators:: Overloading operators  File: asymptote.info, Node: Arithmetic & logical, Next: Self & prefix operators, Up: Operators 6.10.1 Arithmetic & logical operators ------------------------------------- ‘Asymptote’ uses the standard binary arithmetic operators. However, when one integer is divided by another, both arguments are converted to real values before dividing and a real quotient is returned (since this is typically what is intended; otherwise one can use the function ‘int quotient(int x, int y)’, which returns greatest integer less than or equal to ‘x/y’). In all other cases both operands are promoted to the same type, which will also be the type of the result: ‘+’ addition ‘-’ subtraction ‘*’ multiplication ‘/’ division ‘#’ integer division; equivalent to ‘quotient(x,y)’. Noting that the ‘Python3’ community adopted our comment symbol (‘//’) for integer division, we decided to reciprocate and use their comment symbol for integer division in ‘Asymptote’! ‘%’ modulo; the result always has the same sign as the divisor. In particular, this makes ‘q*(p # q)+p % q == p’ for all integers ‘p’ and nonzero integers ‘q’. ‘^’ power; if the exponent (second argument) is an int, recursive multiplication is used; otherwise, logarithms and exponentials are used (‘**’ is a synonym for ‘^’). The usual boolean operators are also defined: ‘==’ equals ‘!=’ not equals ‘<’ less than ‘<=’ less than or equals ‘>=’ greater than or equals ‘>’ greater than ‘&&’ and (with conditional evaluation of right-hand argument) ‘&’ and ‘||’ or (with conditional evaluation of right-hand argument) ‘|’ or ‘^’ xor ‘!’ not ‘Asymptote’ also supports the C-like conditional syntax: bool positive=(pi > 0) ? true : false; The function ‘T interp(T a, T b, real t)’ returns ‘(1-t)*a+t*b’ for nonintegral built-in arithmetic types ‘T’. If ‘a’ and ‘b’ are pens, they are first promoted to the same color space. ‘Asymptote’ also defines bitwise functions ‘int AND(int,int)’, ‘int OR(int,int)’, ‘int XOR(int,int)’, ‘int NOT(int)’, ‘int CLZ(int)’ (count leading zeros), ‘int CTZ(int)’ (count trailing zeros), ‘int popcount(int)’ (count bits populated by ones), and ‘int bitreverse(int a, int bits)’ (reverse bits within a word of length bits).  File: asymptote.info, Node: Self & prefix operators, Next: User-defined operators, Prev: Arithmetic & logical, Up: Operators 6.10.2 Self & prefix operators ------------------------------ As in C, each of the arithmetic operators ‘+’, ‘-’, ‘*’, ‘/’, ‘#’, ‘%’, and ‘^’ can be used as a self operator. The prefix operators ‘++’ (increment by one) and ‘--’ (decrement by one) are also defined. For example, int i=1; i += 2; int j=++i; is equivalent to the code int i=1; i=i+2; int j=i=i+1; However, postfix operators like ‘i++’ and ‘i--’ are not defined (because of the inherent ambiguities that would arise with the ‘--’ path-joining operator). In the rare instances where ‘i++’ and ‘i--’ are really needed, one can substitute the expressions ‘(++i-1)’ and ‘(--i+1)’, respectively.  File: asymptote.info, Node: User-defined operators, Prev: Self & prefix operators, Up: Operators 6.10.3 User-defined operators ----------------------------- The following symbols may be used with ‘operator’ to define or redefine operators on structures and built-in types: - + * / % ^ ! < > == != <= >= & | ^^ .. :: -- --- ++ << >> $ $$ @ @@ <> The operators on the second line have precedence one higher than the boolean operators ‘<’, ‘>’, ‘<=’, and ‘>=’. Guide operators like ‘..’ may be overloaded, say, to write a user function that produces a new guide from a given guide: guide dots(... guide[] g)=operator ..; guide operator ..(... guide[] g) { guide G; if(g.length > 0) { write(g[0]); G=g[0]; } for(int i=1; i < g.length; ++i) { write(g[i]); write(); G=dots(G,g[i]); } return G; } guide g=(0,0){up}..{SW}(100,100){NE}..{curl 3}(50,50)..(10,10); write("g=",g); *Note Autounravel::, for an example overloading the ‘+’ operator.  File: asymptote.info, Node: Implicit scaling, Next: Functions, Prev: Operators, Up: Programming 6.11 Implicit scaling ===================== If a numeric literal is in front of certain types of expressions, then the two are multiplied: int x=2; real y=2.0; real cm=72/2.540005; write(3x); write(2.5x); write(3y); write(-1.602e-19 y); write(0.5(x,y)); write(2x^2); write(3x+2y); write(3(x+2y)); write(3sin(x)); write(3(sin(x))^2); write(10cm); This produces the output 6 5 6 -3.204e-19 (1,1) 8 10 18 2.72789228047704 2.48046543129542 283.464008929116  File: asymptote.info, Node: Functions, Next: Arrays, Prev: Implicit scaling, Up: Programming 6.12 Functions ============== * Menu: * Default arguments:: Default values can appear anywhere * Named arguments:: Assigning function arguments by keyword * Rest arguments:: Functions with a variable number of arguments * Mathematical functions:: Standard libm functions ‘Asymptote’ functions are treated as variables with a signature (non-function variables have null signatures). Variables with the same name are allowed, so long as they have distinct signatures. Function arguments are passed by value. To pass an argument by reference, simply enclose it in a structure (*note Structures::). Here are some significant features of ‘Asymptote’ functions: 1. Variables with signatures (functions) and without signatures (nonfunction variables) are distinct: int x, x(); x=5; x=new int() {return 17;}; x=x(); // calls x() and puts the result, 17, in the scalar x 2. Traditional function definitions are allowed: int sqr(int x) { return x*x; } sqr=null; // but the function is still just a variable. 3. Casting can be used to resolve ambiguities: int a, a(), b, b(); // Valid: creates four variables. a=b; // Invalid: assignment is ambiguous. a=(int) b; // Valid: resolves ambiguity. (int) (a=b); // Valid: resolves ambiguity. (int) a=b; // Invalid: cast expressions cannot be L-values. int c(); c=a; // Valid: only one possible assignment. 4. "Higher-order" functions, in other words functions that return functions, are allowed. The return type must be given a signature-free alias with ‘using’ or ‘typedef’: using intop = int(int); // typedef int intop(int); // Equivalent to previous line intop adder(int m) { return new int(int n) {return m+n;}; } intop addby7=adder(7); write(addby7(1)); // Writes 8. 5. One may redefine a function ‘f’, even for calls to ‘f’ in previously declared functions, by assigning another (anonymous or named) function to it. However, if ‘f’ is overloaded by a new function definition, previous calls will still access the original version of ‘f’, as illustrated in this example: void f() { write("hi"); } void g() { f(); } g(); // writes "hi" f=new void() {write("bye");}; g(); // writes "bye" void f() {write("overloaded");}; f(); // writes "overloaded" g(); // writes "bye" 6. Anonymous functions can be used to redefine a function variable that has been declared (and implicitly initialized to the null function) but not yet explicitly defined: void f(bool b); void g(bool b) { if(b) f(b); else write(b); } f=new void(bool b) { write(b); g(false); }; g(true); // Writes true, then writes false. ‘Asymptote’ is the only language we know of that treats functions as variables, but allows overloading by distinguishing variables based on their signatures. Functions are allowed to call themselves recursively. As in C++, infinite nested recursion will generate a stack overflow (reported as a segmentation fault, unless a fully working version of the GNU library ‘libsigsegv’ (e.g. 2.4 or later) is installed at configuration time).  File: asymptote.info, Node: Default arguments, Next: Named arguments, Up: Functions 6.12.1 Default arguments ------------------------ ‘Asymptote’ supports a more flexible mechanism for default function arguments than C++: they may appear anywhere in the function prototype. Because certain data types are implicitly cast to more sophisticated types (*note Casts::) one can often avoid ambiguities by ordering function arguments from the simplest to the most complicated. For example, given real f(int a=1, real b=0) {return a+b;} then ‘f(1)’ returns 1.0, but ‘f(1.0)’ returns 2.0. The value of a default argument is determined by evaluating the given ‘Asymptote’ expression in the scope where the called function is defined.  File: asymptote.info, Node: Named arguments, Next: Rest arguments, Prev: Default arguments, Up: Functions 6.12.2 Named arguments ---------------------- It is sometimes difficult to remember the order in which arguments appear in a function declaration. Named (keyword) arguments make calling functions with multiple arguments easier. Unlike in the C and C++ languages, an assignment in a function argument is interpreted as an assignment to a parameter of the same name in the function signature, _not within the local scope_. The command-line option ‘-d’ may be used to check ‘Asymptote’ code for cases where a named argument may be mistaken for a local assignment. When matching arguments to signatures, first all of the keywords are matched, then the arguments without names are matched against the unmatched formals as usual. For example, int f(int x, int y) { return 10x+y; } write(f(4,x=3)); outputs 34, as ‘x’ is already matched when we try to match the unnamed argument ‘4’, so it gets matched to the next item, ‘y’. For the rare occasions where it is desirable to assign a value to local variable within a function argument (generally _not_ a good programming practice), simply enclose the assignment in parentheses. For example, given the definition of ‘f’ in the previous example, int x; write(f(4,(x=3))); is equivalent to the statements int x; x=3; write(f(4,3)); and outputs 43. Parameters can be specified as "keyword-only" by putting ‘keyword’ immediately before the parameter name, as in ‘int f(int keyword x)’ or ‘int f(int keyword x=77)’. This forces the caller of the function to use a named argument to give a value for this parameter. That is, ‘f(x=42)’ is legal, but ‘f(25)’ is not. Keyword-only parameters must be listed after normal parameters in a function definition. As a technical detail, we point out that, since variables of the same name but different signatures are allowed in the same scope, the code int f(int x, int x()) { return x+x(); } int seven() {return 7;} is legal in ‘Asymptote’, with ‘f(2,seven)’ returning 9. A named argument matches the first unmatched formal of the same name, so ‘f(x=2,x=seven)’ is an equivalent call, but ‘f(x=seven,2)’ is not, as the first argument is matched to the first formal, and ‘int ()’ cannot be implicitly cast to ‘int’. Default arguments do not affect which formal a named argument is matched to, so if ‘f’ were defined as int f(int x=3, int x()) { return x+x(); } then ‘f(x=seven)’ would be illegal, even though ‘f(seven)’ obviously would be allowed.  File: asymptote.info, Node: Rest arguments, Next: Mathematical functions, Prev: Named arguments, Up: Functions 6.12.3 Rest arguments --------------------- Rest arguments allow one to write functions that take a variable number of arguments: // This function sums its arguments. int sum(... int[] nums) { int total=0; for(int i=0; i < nums.length; ++i) total += nums[i]; return total; } sum(1,2,3,4); // returns 10 sum(); // returns 0 // This function subtracts subsequent arguments from the first. int subtract(int start ... int[] subs) { for(int i=0; i < subs.length; ++i) start -= subs[i]; return start; } subtract(10,1,2); // returns 7 subtract(10); // returns 10 subtract(); // illegal Putting an argument into a rest array is called _packing_. One can give an explicit list of arguments for the rest argument, so ‘subtract’ could alternatively be implemented as int subtract(int start ... int[] subs) { return start - sum(... subs); } One can even combine normal arguments with rest arguments: sum(1,2,3 ... new int[] {4,5,6}); // returns 21 This builds a new six-element array that is passed to ‘sum’ as ‘nums’. The opposite operation, _unpacking_, is not allowed: subtract(... new int[] {10, 1, 2}); is illegal, as the start formal is not matched. If no arguments are packed, then a zero-length array (as opposed to ‘null’) is bound to the rest parameter. Note that default arguments are ignored for rest formals and the rest argument is not bound to a keyword. In some cases, keyword-only parameters are helpful to avoid arguments intended for the rest parameter to be assigned to other parameters. For example, here the use of ‘keyword’ is to avoid ‘pnorm(1.0,2.0,0.3)’ matching ‘1.0’ to ‘p’. real pnorm(real keyword p=2.0 ... real[] v) { return sum(v^p)^(1/p); } The overloading resolution in ‘Asymptote’ is similar to the function matching rules used in C++. Every argument match is given a score. Exact matches score better than matches with casting, and matches with formals (regardless of casting) score better than packing an argument into the rest array. A candidate is maximal if all of the arguments score as well in it as with any other candidate. If there is one unique maximal candidate, it is chosen; otherwise, there is an ambiguity error. int f(path g); int f(guide g); f((0,0)--(100,100)); // matches the second; the argument is a guide int g(int x, real y); int g(real x, int x); g(3,4); // ambiguous; the first candidate is better for the first argument, // but the second candidate is better for the second argument int h(... int[] rest); int h(real x ... int[] rest); h(1,2); // the second definition matches, even though there is a cast, // because casting is preferred over packing int i(int x ... int[] rest); int i(real x, real y ... int[] rest); i(3,4); // ambiguous; the first candidate is better for the first argument, // but the second candidate is better for the second one  File: asymptote.info, Node: Mathematical functions, Prev: Rest arguments, Up: Functions 6.12.4 Mathematical functions ----------------------------- ‘Asymptote’ has built-in versions of the standard ‘libm’ mathematical real(real) functions ‘sin’, ‘cos’, ‘tan’, ‘asin’, ‘acos’, ‘atan’, ‘exp’, ‘log’, ‘pow10’, ‘log10’, ‘sinh’, ‘cosh’, ‘tanh’, ‘asinh’, ‘acosh’, ‘atanh’, ‘sqrt’, ‘cbrt’, ‘fabs’, ‘expm1’, ‘log1p’, as well as the identity function ‘identity’. ‘Asymptote’ also defines the order ‘n’ Bessel functions of the first kind ‘Jn(int n, real)’ and second kind ‘Yn(int n, real)’, as well as the gamma function ‘gamma’, the error function ‘erf’, and the complementary error function ‘erfc’. The standard real(real, real) functions ‘atan2’, ‘hypot’, ‘fmod’, ‘remainder’ are also included. The functions ‘degrees(real radians)’ and ‘radians(real degrees)’ can be used to convert between radians and degrees. The function ‘Degrees(real radians)’ returns the angle in degrees in the interval [0,360). For convenience, ‘Asymptote’ defines variants ‘Sin’, ‘Cos’, ‘Tan’, ‘aSin’, ‘aCos’, and ‘aTan’ of the standard trigonometric functions that use degrees rather than radians. We also define complex versions of the ‘sqrt’, ‘sin’, ‘cos’, ‘exp’, ‘log’, and ‘gamma’ functions. The functions ‘floor’, ‘ceil’, and ‘round’ differ from their usual definitions in that they all return an int value rather than a real (since that is normally what one wants). The functions ‘Floor’, ‘Ceil’, and ‘Round’ are respectively similar, except that if the result cannot be converted to a valid int, they return ‘intMax’ for positive arguments and ‘intMin’ for negative arguments, rather than generating an integer overflow. We also define a function ‘sgn’, which returns the sign of its real argument as an integer (-1, 0, or 1). There is an ‘abs(int)’ function, as well as an ‘abs(real)’ function (equivalent to ‘fabs(real)’), an ‘abs(pair)’ function (equivalent to ‘length(pair)’). Asymptote's random number generators can be seeded with ‘srand(int)’. If a negative argument is given to ‘srand’, an internal entropy source is used as a seed. Random numbers are initially seeded with ‘srand(-1)’. The function ‘int rand(int a=0, int b=randMax)’ returns a random integer in [a,b]. The ‘unitrand()’ function returns a random number uniformly distributed in the interval [0,1). A Gaussian random number generator ‘Gaussrand’ and a collection of statistics routines, including ‘histogram’, are provided in the module ‘stats’. The functions ‘factorial(int n)’, which returns n!, and ‘choose(int n, int k)’, which returns n!/(k!(n-k)!), are also defined. When configured with the GNU Scientific Library (GSL), available from , ‘Asymptote’ contains an internal module ‘gsl’ that defines the airy functions ‘Ai(real)’, ‘Bi(real)’, ‘Ai_deriv(real)’, ‘Bi_deriv(real)’, ‘zero_Ai(int)’, ‘zero_Bi(int)’, ‘zero_Ai_deriv(int)’, ‘zero_Bi_deriv(int)’, the Bessel functions ‘I(int, real)’, ‘K(int, real)’, ‘j(int, real)’, ‘y(int, real)’, ‘i_scaled(int, real)’, ‘k_scaled(int, real)’, ‘J(real, real)’, ‘Y(real, real)’, ‘I(real, real)’, ‘K(real, real)’, ‘zero_J(real, int)’, the elliptic functions ‘F(real, real)’, ‘E(real, real)’, and ‘P(real, real)’, the Jacobi elliptic functions ‘real[] sncndn(real,real)’, the exponential/trigonometric integrals ‘Ei’, ‘Si’, and ‘Ci’, the Legendre polynomials ‘Pl(int, real)’, and the Riemann zeta function ‘zeta(real)’. For example, to compute the sine integral ‘Si’ of 1.0: import gsl; write(Si(1.0)); ‘Asymptote’ also provides a few general purpose numerical routines: ‘real newton(int iterations=100, real f(real), real fprime(real), real x, bool verbose=false);’ Use Newton-Raphson iteration to solve for a root of a real-valued differentiable function ‘f’, given its derivative ‘fprime’ and an initial guess ‘x’. Diagnostics for each iteration are printed if ‘verbose=true’. If the iteration fails after the maximum allowed number of loops (‘iterations’), ‘realMax’ is returned. ‘real newton(int iterations=100, real f(real), real fprime(real), real x1, real x2, bool verbose=false);’ Use bracketed Newton-Raphson bisection to solve for a root of a real-valued differentiable function ‘f’ within an interval [‘x1’,‘x2’] (on which the endpoint values of ‘f’ have opposite signs), given its derivative ‘fprime’. Diagnostics for each iteration are printed if ‘verbose=true’. If the iteration fails after the maximum allowed number of loops (‘iterations’), ‘realMax’ is returned. ‘real simpson(real f(real), real a, real b, real acc=realEpsilon, real dxmax=b-a)’ returns the integral of ‘f’ from ‘a’ to ‘b’ using adaptive Simpson integration. ‘cputime cputime()’ returns a structure ‘cputime’ with cumulative CPU times broken down into the fields ‘parent.user’, ‘parent.system’, ‘child.user’, and ‘child.system’, along with the cumulative wall clock time in ‘parent.clock’, all measured in seconds. For convenience, the incremental fields ‘change.user’, ‘change.system’, and ‘change.clock’ indicate the change in the corresponding fields since the last call to ‘cputime()’. The function void write(file file=stdout, string s="", cputime c, string format=cputimeformat, suffix suffix=none); displays the incremental user cputime followed by "u", the incremental system cputime followed by "s", the total user cputime followed by "U", and the total system cputime followed by "S".  File: asymptote.info, Node: Arrays, Next: Casts, Prev: Functions, Up: Programming 6.13 Arrays =========== * Menu: * Slices:: Python-style array slices Appending ‘[]’ to a built-in or user-defined type yields an array. The array element ‘i’ of an array ‘A’ can be accessed as ‘A[i]’. By default, attempts to access or assign to an array element using a negative index generates an error. Reading an array element with an index beyond the length of the array also generates an error; however, assignment to an element beyond the length of the array causes the array to be resized to accommodate the new element. One can also index an array ‘A’ with an integer array ‘B’: the array ‘A[B]’ is formed by indexing array ‘A’ with successive elements of array ‘B’. A convenient Java-style shorthand exists for iterating over all elements of an array; see *note array iteration::. The declaration real[] A; initializes ‘A’ to be an empty (zero-length) array. Empty arrays should be distinguished from null arrays. If we say real[] A=null; then ‘A’ cannot be dereferenced at all (null arrays have no length and cannot be read from or assigned to). Arrays can be explicitly initialized like this: real[] A={0,1,2}; Array assignment in ‘Asymptote’ does a shallow copy: only the pointer is copied (if one copy if modified, the other will be too). The ‘copy’ function listed below provides a deep copy of an array. Every array ‘A’ of type ‘T[]’ has the virtual members • ‘int length’, • ‘bool cyclic’, • ‘int[] keys’, • ‘T push(T x)’, • ‘void append(T[] a)’, • ‘T pop()’, • ‘void insert(int i ... T[] x)’, • ‘void delete(int i, int j=i)’, • ‘void delete()’, and • ‘bool initialized(int n)’. The member ‘A.length’ evaluates to the length of the array. Setting ‘A.cyclic=true’ signifies that array indices should be reduced modulo the current array length. Reading from or writing to a nonempty cyclic array never leads to out-of-bounds errors or array resizing. The member ‘A.keys’ evaluates to an array of integers containing the indices of initialized entries in the array in ascending order. Hence, for an array of length ‘n’ with all entries initialized, ‘A.keys’ evaluates to ‘{0,1,...,n-1}’. A new keys array is produced each time ‘A.keys’ is evaluated. The functions ‘A.push’ and ‘A.append’ append their arguments onto the end of the array, while ‘A.insert(int i ... T[] x)’ inserts ‘x’ into the array at index ‘i’. For convenience ‘A.push’ returns the pushed item. The function ‘A.pop()’ pops and returns the last element, while ‘A.delete(int i, int j=i)’ deletes elements with indices in the range [‘i’,‘j’], shifting the position of all higher-indexed elements down. If no arguments are given, ‘A.delete()’ provides a convenient way of deleting all elements of ‘A’. The routine ‘A.initialized(int n)’ can be used to examine whether the element at index ‘n’ is initialized. Like all ‘Asymptote’ functions, ‘push’, ‘append’, ‘pop’, ‘insert’, ‘delete’, and ‘initialized’ can be "pulled off" of the array and used on their own. For example, int[] A={1}; A.push(2); // A now contains {1,2}. A.append(A); // A now contains {1,2,1,2}. int f(int)=A.push; f(3); // A now contains {1,2,1,2,3}. int g()=A.pop; write(g()); // Outputs 3. A.delete(0); // A now contains {2,1,2}. A.delete(0,1); // A now contains {2}. A.insert(1,3); // A now contains {2,3}. A.insert(1 ... A); // A now contains {2,2,3,3} A.insert(2,4,5); // A now contains {2,2,4,5,3,3}. The ‘[]’ suffix can also appear after the variable name; this is sometimes convenient for declaring a list of variables and arrays of the same type: real a,A[]; This declares ‘a’ to be ‘real’ and implicitly declares ‘A’ to be of type ‘real[]’. In the following list of built-in array functions, ‘T’ represents a generic type. Note that the internal functions ‘alias’, ‘array’, ‘copy’, ‘concat’, ‘sequence’, ‘map’, and ‘transpose’, which depend on type ‘T[]’, are defined only after the first declaration of a variable of type ‘T[]’. ‘new T[]’ returns a new empty array of type ‘T[]’; ‘new T[] {list}’ returns a new array of type ‘T[]’ initialized with ‘list’ (a comma delimited list of elements); ‘new T[n]’ returns a new array of ‘n’ elements of type ‘T[]’. These ‘n’ array elements are not initialized unless they are arrays themselves (in which case they are each initialized to empty arrays); ‘T[] array(int n, T value, int depth=intMax)’ returns an array consisting of ‘n’ copies of ‘value’. If ‘value’ is itself an array, a deep copy of ‘value’ is made for each entry. If ‘depth’ is specified, this deep copying only recurses to the specified number of levels; ‘int[] sequence(int n)’ if ‘n >= 1’ returns the array ‘{0,1,...,n-1}’ (otherwise returns a null array); ‘int[] sequence(int n, int m)’ if ‘m >= n’ returns an array ‘{n,n+1,...,m}’ (otherwise returns a null array); ‘int[] sequence(int n, int m, int skip)’ if ‘m >= n’ returns an array ‘{n,n+1,...,m}’ skipping by ‘skip’ (otherwise returns a null array); ‘T[] sequence(T f(int), int n)’ if ‘n >= 1’ returns the sequence ‘{f_i :i=0,1,...n-1}’ given a function ‘T f(int)’ and integer ‘int n’ (otherwise returns a null array); ‘T[] map(T f(T), T[] a)’ returns the array obtained by applying the function ‘f’ to each element of the array ‘a’. This is equivalent to ‘sequence(new T(int i) {return f(a[i]);},a.length)’; ‘T2[] map(T2 f(T1), T1[] a)’ constructed by running ‘from mapArray(Src=T1, Dst=T2) access map;’, returns the array obtained by applying the function ‘f’ to each element of the array ‘a’; ‘int[] reverse(int n)’ if ‘n >= 1’ returns the array ‘{n-1,n-2,...,0}’ (otherwise returns a null array); ‘int[] complement(int[] a, int n)’ returns the complement of the integer array ‘a’ in ‘{0,1,2,...,n-1}’, so that ‘b[complement(a,b.length)]’ yields the complement of ‘b[a]’; ‘real[] uniform(real a, real b, int n)’ if ‘n >= 1’ returns a uniform partition of ‘[a,b]’ into ‘n’ subintervals (otherwise returns a null array); ‘int find(bool[] a, int n=1)’ returns the index of the ‘n’th ‘true’ value in the boolean array ‘a’ or -1 if not found. If ‘n’ is negative, search backwards from the end of the array for the ‘-n’th value; ‘int[] findall(bool[] a)’ returns the indices of all ‘true’ values in the boolean array ‘a’; ‘int search(T[] a, T key)’ For built-in ordered types ‘T’, searches a sorted array ‘a’ of ‘n’ elements for ‘key’, returning the index ‘i’ if ‘a[i] <= key < a[i+1]’, ‘-1’ if ‘key’ is less than all elements of ‘a’, or ‘n-1’ if ‘key’ is greater than or equal to the last element of ‘a’; ‘int search(T[] a, T key, bool less(T i, T j))’ searches an array ‘a’ for ‘key’ sorted in ascending order such that element ‘i’ precedes element ‘j’ if ‘less(i,j)’ is true; ‘T[] copy(T[] a)’ returns a deep copy of the array ‘a’; ‘T[] concat(... T[][] a)’ returns a new array formed by concatenating the given one-dimensional arrays given as arguments; ‘bool alias(T[] a, T[] b)’ returns ‘true’ if the arrays ‘a’ and ‘b’ are identical; ‘T[] sort(T[] a)’ For built-in ordered types ‘T’, returns a copy of ‘a’ sorted in ascending order; ‘T[][] sort(T[][] a)’ For built-in ordered types ‘T’, returns a copy of ‘a’ with the rows sorted by the first column, breaking ties with successively higher columns. For example: string[][] a={{"bob","9"},{"alice","5"},{"pete","7"}, {"alice","4"}}; // Row sort (by column 0, using column 1 to break ties): write(sort(a)); produces alice 4 alice 5 bob 9 pete 7 ‘T[] sort(T[] a, bool less(T i, T j), bool stable=true)’ returns a copy of ‘a’ sorted in ascending order such that element ‘i’ precedes element ‘j’ if ‘less(i,j)’ is true, subject to (if ‘stable’ is ‘true’) the stability constraint that the original order of elements ‘i’ and ‘j’ is preserved if ‘less(i,j)’ and ‘less(j,i)’ are both ‘false’; ‘T[][] transpose(T[][] a)’ returns the transpose of ‘a’; ‘T[][][] transpose(T[][][] a, int[] perm)’ returns the 3D transpose of ‘a’ obtained by applying the permutation ‘perm’ of ‘new int[]{0,1,2}’ to the indices of each entry; ‘T sum(T[] a)’ for arithmetic types ‘T’, returns the sum of ‘a’. In the case where ‘T’ is ‘bool’, the number of true elements in ‘a’ is returned; ‘T min(T[] a)’ ‘T min(T[][] a)’ ‘T min(T[][][] a)’ for built-in ordered types ‘T’, returns the minimum element of ‘a’; ‘T max(T[] a)’ ‘T max(T[][] a)’ ‘T max(T[][][] a)’ for built-in ordered types ‘T’, returns the maximum element of ‘a’; ‘T[] min(T[] a, T[] b)’ for built-in ordered types ‘T’, and arrays ‘a’ and ‘b’ of the same length, returns an array composed of the minimum of the corresponding elements of ‘a’ and ‘b’; ‘T[] max(T[] a, T[] b)’ for built-in ordered types ‘T’, and arrays ‘a’ and ‘b’ of the same length, returns an array composed of the maximum of the corresponding elements of ‘a’ and ‘b’; ‘pair[] pairs(real[] x, real[] y);’ for arrays ‘x’ and ‘y’ of the same length, returns the pair array ‘sequence(new pair(int i) {return (x[i],y[i]);},x.length)’; ‘pair[] fft(pair[] a, int sign=1)’ returns the unnormalized Fast Fourier Transform of ‘a’ (if the optional ‘FFTW’ package is installed), using the given ‘sign’. Here is a simple example: int n=4; pair[] f=sequence(n); write(f); pair[] g=fft(f,-1); write(); write(g); f=fft(g,1); write(); write(f/n); ‘pair[][] fft(pair[][] a, int sign=1)’ returns the unnormalized two-dimensional Fourier transform of ‘a’ using the given ‘sign’; ‘pair[][][] fft(pair[][][] a, int sign=1)’ returns the unnormalized three-dimensional Fourier transform of ‘a’ using the given ‘sign’; ‘realschur schur(real[][] a)’ returns a struct ‘realschur’ containing a unitary matrix ‘U’ and a quasitriangular matrix ‘T’ such that ‘a=U*T*transpose(U)’; ‘schur schur(pair[][] a)’ returns a struct ‘schur’ containing a unitary matrix ‘U’ and a triangular matrix ‘T’ such that ‘a=U*T*conj(transpose(U))’; ‘real dot(real[] a, real[] b)’ returns the dot product of the vectors ‘a’ and ‘b’; ‘pair dot(pair[] a, pair[] b)’ returns the complex dot product ‘sum(a*conj(b))’ of the vectors ‘a’ and ‘b’; ‘real[] tridiagonal(real[] a, real[] b, real[] c, real[] f);’ Solve the periodic tridiagonal problem L‘x’=‘f’ and return the solution ‘x’, where ‘f’ is an n vector and L is the n \times n matrix [ b[0] c[0] a[0] ] [ a[1] b[1] c[1] ] [ a[2] b[2] c[2] ] [ ... ] [ c[n-1] a[n-1] b[n-1] ] For Dirichlet boundary conditions (denoted here by ‘u[-1]’ and ‘u[n]’), replace ‘f[0]’ by ‘f[0]-a[0]u[-1]’ and ‘f[n-1]-c[n-1]u[n]’; then set ‘a[0]=c[n-1]=0’; ‘real[] solve(real[][] a, real[] b, bool warn=true)’ Solve the linear equation ‘a’x=‘b’ by LU decomposition and return the solution x, where ‘a’ is an n \times n matrix and ‘b’ is an array of length n. For example: import math; real[][] a={{1,-2,3,0},{4,-5,6,2},{-7,-8,10,5},{1,50,1,-2}}; real[] b={7,19,33,3}; real[] x=solve(a,b); write(a); write(); write(b); write(); write(x); write(); write(a*x); If ‘a’ is a singular matrix and ‘warn’ is ‘false’, return an empty array. If the matrix ‘a’ is tridiagonal, the routine ‘tridiagonal’ provides a more efficient algorithm (*note tridiagonal::); ‘real[][] solve(real[][] a, real[][] b, bool warn=true)’ Solve the linear equation ‘a’x=‘b’ and return the solution x, where ‘a’ is an n \times n matrix and ‘b’ is an n \times m matrix. If ‘a’ is a singular matrix and ‘warn’ is ‘false’, return an empty matrix; ‘real[][] identity(int n);’ returns the n \times n identity matrix; ‘real[][] diagonal(... real[] a)’ returns the diagonal matrix with diagonal entries given by a; ‘real[][] inverse(real[][] a)’ returns the inverse of a square matrix ‘a’; ‘real[] quadraticroots(real a, real b, real c);’ This numerically robust solver returns the real roots of the quadratic equation ax^2+bx+c=0, in ascending order. Multiple roots are listed separately; ‘pair[] quadraticroots(explicit pair a, explicit pair b, explicit pair c);’ This numerically robust solver returns the complex roots of the quadratic equation ax^2+bx+c=0; ‘real[] cubicroots(real a, real b, real c, real d);’ This numerically robust solver returns the real roots of the cubic equation ax^3+bx^2+cx+d=0. Multiple roots are listed separately. ‘Asymptote’ includes a full set of vectorized array instructions for arithmetic (including self) and logical operations. These element-by-element instructions are implemented in C++ code for speed. Given real[] a={1,2}; real[] b={3,2}; then ‘a == b’ and ‘a >= 2’ both evaluate to the vector ‘{false, true}’. To test whether all components of ‘a’ and ‘b’ agree, use the boolean function ‘all(a == b)’. One can also use conditionals like ‘(a >= 2) ? a : b’, which returns the array ‘{3,2}’, or ‘write((a >= 2) ? a : null’, which returns the array ‘{2}’. All of the standard built-in ‘libm’ functions of signature ‘real(real)’ also take a real array as an argument, effectively like an implicit call to ‘map’. As with other built-in types, arrays of the basic data types can be read in by assignment. In this example, the code file fin=input("test.txt"); real[] A=fin; reads real values into ‘A’ until the end-of-file is reached (or an I/O error occurs). The virtual member functions ‘line()’, ‘word()’, ‘csv()’, ‘dimension()’, and ‘read()’ of a file are useful for qualifying array reads, while the virtual fields ‘line’, ‘word’, ‘csv’, and ‘dimension’ may be used to query these respective states. If line mode is set with ‘file line(bool b=true)’, then reading will stop once the end of the line is reached: file fin=input("test.txt"); real[] A=fin.line(); Since string reads by default read up to the end of line anyway, line mode normally has no effect on string array reads. However, there is a white-space delimiter mode for reading strings, ‘file word(bool b=true)’, which causes string reads to respect white-space delimiters, instead of the default end-of-line delimiter: file fin=input("test.txt").line().word(); real[] A=fin; Another useful mode is comma-separated-value mode, ‘file csv(bool b=true)’, which causes reads to respect comma delimiters: file fin=input("test.txt").csv(); real[] A=fin; To restrict the number of values read, use the ‘file dimension(int)’ virtual member function: file fin=input("test.txt"); real[] A=fin.dimension(10); This reads 10 values into A, unless end-of-file (or end-of-line in line mode) occurs first. Attempting to read beyond the end of the file will produce a runtime error message. Specifying a value of 0 for the integer limit is equivalent to the previous example of reading until end-of-file (or end-of-line in line mode) is encountered. Two- and three-dimensional arrays of the basic data types can be read in like this: file fin=input("test.txt"); real[][] A=fin.dimension(2,3); real[][][] B=fin.dimension(2,3,4); Sometimes the array dimensions are stored with the data as integer fields at the beginning of an array. Such 1, 2, or 3 dimensional arrays can be read in with the virtual member functions ‘read(1)’, ‘read(2)’, or ‘read(3)’, respectively: file fin=input("test.txt"); real[] A=fin.read(1); real[][] B=fin.read(2); real[][][] C=fin.read(3); One, two, and three-dimensional arrays of the basic data types can be output with the functions ‘write(file,T[])’, ‘write(file,T[][])’, ‘write(file,T[][][])’, respectively.  File: asymptote.info, Node: Slices, Up: Arrays 6.13.1 Slices ------------- Asymptote allows a section of an array to be addressed as a slice using a Python-like syntax. If ‘A’ is an array, the expression ‘A[m:n]’ returns a new array consisting of the elements of ‘A’ with indices from ‘m’ up to but not including ‘n’. For example, int[] x={0,1,2,3,4,5,6,7,8,9}; int[] y=x[2:6]; // y={2,3,4,5}; int[] z=x[5:10]; // z={5,6,7,8,9}; If the left index is omitted, it is taken be ‘0’. If the right index is omitted it is taken to be the length of the array. If both are omitted, the slice then goes from the start of the array to the end, producing a non-cyclic deep copy of the array. For example: int[] x={0,1,2,3,4,5,6,7,8,9}; int[] y=x[:4]; // y={0,1,2,3} int[] z=x[5:]; // z={5,6,7,8,9} int[] w=x[:]; // w={0,1,2,3,4,5,6,7,8,9}, distinct from array x. If A is a non-cyclic array, it is illegal to use negative values for either of the indices. If the indices exceed the length of the array, however, they are politely truncated to that length. For cyclic arrays, the slice ‘A[m:n]’ still consists of the cells with indices in the set [‘m’,‘n’), but now negative values and values beyond the length of the array are allowed. The indices simply wrap around. For example: int[] x={0,1,2,3,4,5,6,7,8,9}; x.cyclic=true; int[] y=x[8:15]; // y={8,9,0,1,2,3,4}. int[] z=x[-5:5]; // z={5,6,7,8,9,0,1,2,3,4} int[] w=x[-3:17]; // w={7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6} Notice that with cyclic arrays, it is possible to include the same element of the original array multiple times within a slice. Regardless of the original array, arrays produced by slices are always non-cyclic. If the left and right indices of a slice are the same, the result is an empty array. If the array being sliced is empty, the result is an empty array. Any slice with a left index greater than its right index will yield an error. Slices can also be assigned to, changing the value of the original array. If the array being assigned to the slice has a different length than the slice itself, elements will be inserted or removed from the array to accommodate it. For instance: string[] toppings={"mayo", "salt", "ham", "lettuce"}; toppings[0:2]=new string[] {"mustard", "pepper"}; // Now toppings={"mustard", "pepper", "ham", "lettuce"} toppings[2:3]=new string[] {"turkey", "bacon" }; // Now toppings={"mustard", "pepper", "turkey", "bacon", "lettuce"} toppings[0:3]=new string[] {"tomato"}; // Now toppings={"tomato", "bacon", "lettuce"} If an array is assigned to a slice of itself, a copy of the original array is assigned to the slice. That is, code such as ‘x[m:n]=x’ is equivalent to ‘x[m:n]=copy(x)’. One can use the shorthand ‘x[m:m]=y’ to insert the contents of the array ‘y’ into the array ‘x’ starting at the location just before ‘x[m]’. For a cyclic array, a slice is bridging if it addresses cells up to the end of the array and then continues on to address cells at the start of the array. For instance, if ‘A’ is a cyclic array of length 10, ‘A[8:12]’, ‘A[-3:1]’, and ‘A[5:25]’ are bridging slices whereas ‘A[3:7]’, ‘A[7:10]’, ‘A[-3:0]’ and ‘A[103:107]’ are not. Bridging slices can only be assigned to if the number of elements in the slice is exactly equal to the number of elements we are assigning to it. Otherwise, there is no clear way to decide which of the new entries should be ‘A[0]’ and an error is reported. Non-bridging slices may be assigned an array of any length. For a cyclic array ‘A’ an expression of the form ‘A[A.length:A.length]’ is equivalent to the expression ‘A[0:0]’ and so assigning to this slice will insert values at the start of the array. ‘A.append()’ can be used to insert values at the end of the array. It is illegal to assign to a slice of a cyclic array that repeats any of the cells.  File: asymptote.info, Node: Casts, Next: Import, Prev: Arrays, Up: Programming 6.14 Casts ========== ‘Asymptote’ implicitly casts ‘int’ to ‘real’, ‘int’ to ‘pair’, ‘real’ to ‘pair’, ‘pair’ to ‘path’, ‘pair’ to ‘guide’, ‘path’ to ‘guide’, ‘guide’ to ‘path’, ‘real’ to ‘pen’, ‘pair[]’ to ‘guide[]’, ‘pair[]’ to ‘path[]’, ‘path’ to ‘path[]’, and ‘guide’ to ‘path[]’, along with various three-dimensional casts defined in module ‘three’. Implicit casts are automatically attempted on assignment and when trying to match function calls with possible function signatures. Implicit casting can be inhibited by declaring individual arguments ‘explicit’ in the function signature, say to avoid an ambiguous function call in the following example, which outputs 0: int f(pair a) {return 0;} int f(explicit real x) {return 1;} write(f(0)); Other conversions, say ‘real’ to ‘int’ or ‘real’ to ‘string’, require an explicit cast: int i=(int) 2.5; string s=(string) 2.5; real[] a={2.5,-3.5}; int[] b=(int []) a; write(stdout,b); // Outputs 2,-3 In situations where casting from a string to a type ‘T’ fails, an uninitialized variable is returned; this condition can be detected with the function ‘bool initialized(T);’ int i=(int) "2.5"; assert(initialized(i),"Invalid cast."); real x=(real) "2.5a"; assert(initialized(x),"Invalid cast."); Casting to user-defined types is also possible using ‘operator cast’: struct rpair { real radius; real angle; } pair operator cast(rpair x) { return (x.radius*cos(x.angle),x.radius*sin(x.angle)); } rpair x; x.radius=1; x.angle=pi/6; write(x); // Outputs (0.866025403784439,0.5) One must use care when defining new cast operators. Suppose that in some code one wants all integers to represent multiples of 100. To convert them to reals, one would first want to multiply them by 100. However, the straightforward implementation real operator cast(int x) {return x*100;} is equivalent to an infinite recursion, since the result ‘x*100’ needs itself to be cast from an integer to a real. Instead, we want to use the standard conversion of int to real: real convert(int x) {return x*100;} real operator cast(int x)=convert; Explicit casts are implemented similarly, with ‘operator ecast’.  File: asymptote.info, Node: Import, Next: Static, Prev: Casts, Up: Programming 6.15 Import =========== While ‘Asymptote’ provides many features by default, some applications require specialized features contained in external ‘Asymptote’ modules. For instance, the lines access graph; graph.axes(); draw x and y axes on a two-dimensional graph. Here, the command looks up the module under the name ‘graph’ in a global dictionary of modules and puts it in a new variable named ‘graph’. The module is a structure, and we can refer to its fields as we usually would with a structure. Often, one wants to use module functions without having to specify the module name. The code from graph access axes; adds the ‘axes’ field of ‘graph’ into the local name space, so that subsequently, one can just write ‘axes()’. If the given name is overloaded, all types and variables of that name are added. To add more than one name, just use a comma-separated list: from graph access axes, xaxis, yaxis; Wild card notation can be used to add all non-private fields and types of a module to the local name space: from graph access *; Similarly, one can add the non-private fields and types of a structure to the local environment with the ‘unravel’ keyword: struct matrix { real a,b,c,d; } real det(matrix m) { unravel m; return a*d-b*c; } Alternatively, one can unravel selective fields: real det(matrix m) { from m unravel a,b,c as C,d; return a*d-b*C; } The command import graph; is a convenient abbreviation for the commands access graph; unravel graph; That is, ‘import graph’ first loads a module into a structure called ‘graph’ and then adds its non-private fields and types to the local environment. This way, if a member variable (or function) is overwritten with a local variable (or function of the same signature), the original one can still be accessed by qualifying it with the module name. Wild card importing will work fine in most cases, but one does not usually know all of the internal types and variables of a module, which can also change as the module writer adds or changes features of the module. As such, it is prudent to add ‘import’ commands at the start of an ‘Asymptote’ file, so that imported names won't shadow locally defined functions. Still, imported names may shadow other imported names, depending on the order in which they were imported, and imported functions may cause overloading resolution problems if they have the same name as local functions defined later. To rename modules or fields when adding them to the local environment, use ‘as’: access graph as graph2d; from graph access xaxis as xline, yaxis as yline; The command import graph as graph2d; is a convenient abbreviation for the commands access graph as graph2d; unravel graph2d; Except for a few built-in modules, such as ‘settings’, all modules are implemented as ‘Asymptote’ files. When looking up a module that has not yet been loaded, ‘Asymptote’ searches the standard search paths (*note Search paths::) for the matching file. The file corresponding to that name is read and the code within it is interpreted as the body of a structure defining the module. If the file name contains nonalphanumeric characters, enclose it with quotation marks: ‘access "/usr/local/share/asymptote/graph.asy" as graph;’ ‘from "/usr/local/share/asymptote/graph.asy" access axes;’ ‘import "/usr/local/share/asymptote/graph.asy" as graph;’ If ‘Asymptote’ is compiled with support for ‘libcurl’, the file name can even be a URL: ‘import "https://raw.githubusercontent.com/vectorgraphics/asymptote/HEAD/doc/axis3.asy" as axis3;’ It is an error if modules import themselves (or each other in a cycle). The module name to be imported must be known at compile time. However, you can import an ‘Asymptote’ module determined by the string ‘s’ at runtime like this: eval("import "+s,true); To conditionally execute an array of asy files, use void asy(string format, bool overwrite ... string[] s); The file will only be processed, using output format ‘format’, if overwrite is ‘true’ or the output file is missing. One can evaluate an ‘Asymptote’ expression (without any return value, however) contained in the string ‘s’ with: void eval(string s, bool embedded=false); It is not necessary to terminate the string ‘s’ with a semicolon. If ‘embedded’ is ‘true’, the string will be evaluated at the top level of the current environment. If ‘embedded’ is ‘false’ (the default), the string will be evaluated in an independent environment, sharing the same ‘settings’ module (*note settings::). One can evaluate arbitrary ‘Asymptote’ code (which may contain unescaped quotation marks) with the command void eval(code s, bool embedded=false); Here ‘code’ is a special type used with ‘quote {}’ to enclose ‘Asymptote code’ like this: real a=1; code s=quote { write(a); }; eval(s,true); // Outputs 1 To include the contents of an existing file ‘graph’ verbatim (as if the contents of the file were inserted at that point), use one of the forms: include graph; ‘include "/usr/local/share/asymptote/graph.asy";’ To list all global functions and variables defined in a module named by the contents of the string ‘s’, use the function void list(string s, bool imports=false); Imported global functions and variables are also listed if ‘imports’ is ‘true’. * Menu: * Templated imports::  File: asymptote.info, Node: Templated imports, Up: Import 6.15.1 Templated imports ------------------------ *Warning:* This feature is experimental: it has known issues and its behavior may change in the future. In Asymptote types are specified when they are imported. The first executable line of any such module must be of the form ‘typedef import()’, where ‘’ is a list of required type parameters. For instance, typedef import(T, S, Number); could be the first line of a module that requires three type parameters. The remaining code in the module can then use ‘T’, ‘S’, and ‘Number’ as types. To import such a module, one must specify the types to be used. For instance, if the module above were named ‘templatedModule’, it could be accessed for types ‘string’, ‘int[]’, and ‘real’ with the import command access templatedModule(T=string, S=int[], Number=real) as templatedModule_string_int_real; Note that this is actually an _access_ command rather than an _import_ command, so a type, function, or variable ‘A’ defined in ‘templatedModule.asy’ would need to be accessed qualified as ‘templatedModule_string_int_real.A’. Alternatively, the module could be imported via a command like from templatedModule(T=string, S=int[], Number=real) access Wrapper_Number as Wrapper_real, operator ==; This command would automatically rename ‘Wrapper_Number’ to ‘Wrapper_real’ and would also allow the use of any ‘operator ==’ overloads defined in the module. Further examples can be found in the ‘tests/template’ subdirectory of the ‘Asymptote’ source directory. Issues: Certain expected operators (such as ‘operator ==’) may only be available for type arguments that are builtin or defined in module ‘plain’.  File: asymptote.info, Node: Static, Next: Autounravel, Prev: Import, Up: Programming 6.16 Static =========== Static qualifiers allocate the memory address of a variable in a higher enclosing level. For a function body, the variable is allocated in the block where the function is defined; so in the code struct s { int count() { static int c=0; ++c; return c; } } there is one instance of the variable ‘c’ for each object ‘s’ (as opposed to each call of ‘count’). Similarly, in int factorial(int n) { int helper(int k) { static int x=1; x *= k; return k == 1 ? x : helper(k-1); } return helper(n); } there is one instance of ‘x’ for every call to ‘factorial’ (and not for every call to ‘helper’), so this is a correct, but ugly, implementation of factorial. Similarly, a static variable declared within a structure is allocated in the block where the structure is defined. Thus, struct A { struct B { static pair z; } } creates one object ‘z’ for each object of type ‘A’ created. In this example, int pow(int n, int k) { struct A { static int x=1; void helper() { x *= n; } } for(int i=0; i < k; ++i) { A a; a.helper(); } return A.x; } there is one instance of ‘x’ for each call to ‘pow’, so this is an ugly implementation of exponentiation. Loop constructs allocate a new frame in every iteration. This is so that higher-order functions can refer to variables of a specific iteration of a loop: void f(); for(int i=0; i < 10; ++i) { int x=i; if(x==5) { f=new void() {write(x);}; } } f(); Here, every iteration of the loop has its own variable ‘x’, so ‘f()’ will write ‘5’. If a variable in a loop is declared static, it will be allocated where the enclosing function or structure was defined (just as if it were declared static outside of the loop). For instance, in: void f() { static int x; for(int i=0; i < 10; ++i) { static int y; } } both ‘x’ and ‘y’ will be allocated in the same place, which is also where ‘f’ is allocated. Statements may also be declared static, in which case they are run at the place where the enclosing function or structure is defined. Declarations or statements not enclosed in a function or structure definition are already at the top level, so static modifiers are meaningless. A warning is given in such a case. Since structures can have static fields, it is not always clear for a qualified name whether the qualifier is a variable or a type. For instance, in: struct A { static int x; } pair A; int y=A.x; does the ‘A’ in ‘A.x’ refer to the structure or to the pair variable. It is the convention in Asymptote that, if there is a non-function variable with the same name as the qualifier, the qualifier refers to that variable, and not to the type. This is regardless of what fields the variable actually possesses.  File: asymptote.info, Node: Autounravel, Prev: Static, Up: Programming 6.17 Autounravel ================ The ‘autounravel’ modifier can be used to automatically unravel a field. This is useful when building an associated library of functions that operate on a structure. For instance, consider a simple implementation of the ‘rational’ structure defined in ‘rational.asy’: struct rational { int p=0, q=1; void operator init(int p, int q) { this.p=p; this.q=q; } } rational operator +(rational a, rational b) { return rational(a.p*b.q+b.p*a.q, a.q*b.q); } To allow ‘rational’ to be used as a type parameter for a templated import that adds instances of ‘rational’, we should move ‘operator +’ into the body of the ‘rational’ structure and add the ‘autounravel’ modifier: struct rational { int p=0, q=1; void operator init(int p, int q) { this.p=p; this.q=q; } autounravel rational operator +(rational a, rational b) { return rational(a.p*b.q+b.p*a.q, a.q*b.q); } } This is almost equivalent to the previous code, but now the ‘+’ operator will be accessible wherever the ‘rational’ structure is. *Currently, types cannot be autounraveled.* Users who encounter a case where this might be useful can submit a feature request at . * Menu: * When fields are autounraveled:: * Where autounravel is legal::  File: asymptote.info, Node: When fields are autounraveled, Next: Where autounravel is legal, Up: Autounravel 6.17.1 When fields are autounraveled ------------------------------------ If a ‘struct’ contains fields (including functions) that are declared with ‘autounravel’, these fields will be unraveled from the ‘struct’ at: • the end of the ‘struct’ definition; • a ‘typedef import’ statement, if the ‘struct’ is the argument for one of the type parameters; • an ‘unravel’ or ‘access’ statement that unravels the ‘struct’ from a module or outer ‘struct’ (for instance, ‘from rational access rational;’ would make the ‘+’ operator available from the ‘struct’ ‘rational’ defined in ‘rational.asy’); • A ‘typedef’ statement like ‘typedef rational.rational rat;’ that renames a ‘struct’.  File: asymptote.info, Node: Where autounravel is legal, Prev: When fields are autounraveled, Up: Autounravel 6.17.2 Where ‘autounravel’ is legal ----------------------------------- The ‘autounravel’ modifier implies ‘static’ and can be used in many of the same places as ‘static’. However, specifying ‘autounravel’ at the top level of a module (i.e., outside of any structure or function) is an error, whereas ‘static’ gives only a warning. (1) In front of a ‘struct’ definition or ‘typedef’ statement, ‘autounravel’ is forbidden because types cannot be autounraveled. While ‘static static’ results in an error, ‘static autounravel’ and ‘autounravel static’ are both legal and have exactly the same effect as ‘autounravel’ alone. ---------- Footnotes ---------- (1) If top-level ‘autounravel’ were allowed, a user might incorrectly assume that the field would be unraveled whenever the module is ‘access’ed. The ‘static’ modifier is allowed at the top level because, while it does nothing, it does not mislead the user.  File: asymptote.info, Node: LaTeX usage, Next: Base modules, Prev: Programming, Up: Top 7 ‘LaTeX’ usage *************** ‘Asymptote’ comes with a convenient ‘LaTeX’ style file ‘asymptote.sty’ (v1.36 or later required) that makes ‘LaTeX’ ‘Asymptote’-aware. Entering ‘Asymptote’ code directly into the ‘LaTeX’ source file, at the point where it is needed, keeps figures organized and avoids the need to invent new file names for each figure. Simply add the line ‘\usepackage{asymptote}’ at the beginning of your file and enclose your ‘Asymptote’ code within a ‘\begin{asy}...\end{asy}’ environment. As with the ‘LaTeX’ ‘comment’ environment, the ‘\end{asy}’ command must appear on a line by itself, with no trailing commands/comments. A blank line is not allowed after ‘\begin{asy}’. The sample ‘LaTeX’ file below, named ‘latexusage.tex’, can be run as follows: latex latexusage asy latexusage-*.asy latex latexusage or pdflatex latexusage asy latexusage-*.asy pdflatex latexusage To switch between using inline Asymptote code with ‘latex’ and ‘pdflatex’ you may first need to remove the files ‘latexusage-*.tex’. An even better method for processing a ‘LaTeX’ file with embedded ‘Asymptote’ code is to use the ‘latexmk’ utility from after putting the contents of in a file ‘latexmkrc’ in the same directory. The command latexmk -pdf latexusage will then call ‘Asymptote’ automatically, recompiling only the figures that have changed. Since each figure is compiled in a separate system process, this method also tends to use less memory. To store the figures in a separate directory named ‘asy’, one can define \def\asydir{asy} in ‘latexusage.tex’. External ‘Asymptote’ code can be included with \asyinclude[]{} so that ‘latexmk’ will recognize when the code is changed. Note that ‘latexmk’ requires ‘perl’, available from . One can specify ‘width’, ‘height’, ‘keepAspect’, ‘viewportwidth’, ‘viewportheight’, ‘attach’, and ‘inline’. ‘keyval’-style options to the ‘asy’ and ‘asyinclude’ environments. Three-dimensional PRC files may either be embedded within the page (the default) or attached as annotated (but printable) attachments, using the ‘attach’ option and the ‘attachfile2’ (or older ‘attachfile’) ‘LaTeX’ package. The ‘inline’ option generates inline ‘LaTeX’ code instead of EPS or PDF files. This makes 2D LaTeX symbols visible to the ‘\begin{asy}...\end{asy}’ environment. In this mode, Asymptote correctly aligns 2D LaTeX symbols defined outside of ‘\begin{asy}...\end{asy}’, but treats their size as zero; an optional second string can be given to ‘Label’ to provide an estimate of the unknown label size. Note that if the ‘latex’ TeX engine is used with the ‘inline’ option, labels might not show up in DVI viewers that cannot handle raw ‘PostScript’ code. One can use ‘dvips’/‘dvipdf’ to produce ‘PostScript’/PDF output (we recommend using the modified version of ‘dvipdf’ in the ‘Asymptote’ patches directory, which accepts the ‘dvips -z’ hyperdvi option). Here now is ‘latexusage.tex’: \documentclass[12pt]{article} % Use this form to include EPS (latex) or PDF (pdflatex) files: %\usepackage{asymptote} % Use this form with latex or pdflatex to include inline LaTeX code by default: \usepackage[inline]{asymptote} % Use this form with latex or pdflatex to create PDF attachments by default: %\usepackage[attach]{asymptote} % Enable this line to support the attach option: %\usepackage[dvips]{attachfile2} \begin{document} % Optional subdirectory for latex files (no spaces): \def\asylatexdir{} % Optional subdirectory for asy files (no spaces): \def\asydir{} \begin{asydef} // Global Asymptote definitions can be put here. settings.prc=true; import three; usepackage("bm"); texpreamble("\def\V#1{\bm{#1}}"); // One can globally override the default toolbar settings here: // settings.toolbar=true; \end{asydef} Here is a venn diagram produced with Asymptote, drawn to width 4cm: \def\A{A} \def\B{\V{B}} %\begin{figure} \begin{center} \begin{asy} size(4cm,0); pen colour1=red; pen colour2=green; pair z0=(0,0); pair z1=(-1,0); pair z2=(1,0); real r=1.5; path c1=circle(z1,r); path c2=circle(z2,r); fill(c1,colour1); fill(c2,colour2); picture intersection=new picture; fill(intersection,c1,colour1+colour2); clip(intersection,c2); add(intersection); draw(c1); draw(c2); //draw("$\A$",box,z1); // Requires [inline] package option. //draw(Label("$\B$","$B$"),box,z2); // Requires [inline] package option. draw("$A$",box,z1); draw("$\V{B}$",box,z2); pair z=(0,-2); real m=3; margin BigMargin=Margin(0,m*dot(unit(z1-z),unit(z0-z))); draw(Label("$A\cap B$",0),conj(z)--z0,Arrow,BigMargin); draw(Label("$A\cup B$",0),z--z0,Arrow,BigMargin); draw(z--z1,Arrow,Margin(0,m)); draw(z--z2,Arrow,Margin(0,m)); shipout(bbox(0.25cm)); \end{asy} %\caption{Venn diagram}\label{venn} \end{center} %\end{figure} Each graph is drawn in its own environment. One can specify the width and height to \LaTeX\ explicitly. This 3D example can be viewed interactively either with Adobe Reader or Asymptote's fast OpenGL-based renderer. To support {\tt latexmk}, 3D figures should specify \verb+inline=true+. It is sometimes desirable to embed 3D files as annotated attachments; this requires the \verb+attach=true+ option as well as the \verb+attachfile2+ \LaTeX\ package. \begin{center} \begin{asy}[height=4cm,inline=true,attach=false,viewportwidth=\linewidth] currentprojection=orthographic(5,4,2); draw(unitcube,blue); label("$V-E+F=2$",(0,1,0.5),3Y,blue+fontsize(17pt)); \end{asy} \end{center} One can also scale the figure to the full line width: \begin{center} \begin{asy}[width=\the\linewidth,inline=true] pair z0=(0,0); pair z1=(2,0); pair z2=(5,0); pair zf=z1+0.75*(z2-z1); draw(z1--z2); dot(z1,red+0.15cm); dot(z2,darkgreen+0.3cm); label("$m$",z1,1.2N,red); label("$M$",z2,1.5N,darkgreen); label("$\hat{\ }$",zf,0.2*S,fontsize(24pt)+blue); pair s=-0.2*I; draw("$x$",z0+s--z1+s,N,red,Arrows,Bars,PenMargins); s=-0.5*I; draw("$\bar{x}$",z0+s--zf+s,blue,Arrows,Bars,PenMargins); s=-0.95*I; draw("$X$",z0+s--z2+s,darkgreen,Arrows,Bars,PenMargins); \end{asy} \end{center} \end{document} [./latexusage]  File: asymptote.info, Node: Base modules, Next: Options, Prev: LaTeX usage, Up: Top 8 Base modules ************** ‘Asymptote’ currently ships with the following base modules: * Menu: * plain:: Default ‘Asymptote’ base file * simplex:: Linear programming: simplex method * simplex2:: Two-variable simplex method * math:: Extend ‘Asymptote’'s math capabilities * interpolate:: Interpolation routines * geometry:: Geometry routines * trembling:: Wavy lines * stats:: Statistics routines and histograms * patterns:: Custom fill and draw patterns * markers:: Custom path marker routines * map:: Map keys to values * tree:: Dynamic binary search tree * binarytree:: Binary tree drawing module * drawtree:: Tree drawing module * syzygy:: Syzygy and braid drawing module * feynman:: Feynman diagrams * roundedpath:: Round the sharp corners of paths * animation:: Embedded PDF and MPEG movies * embed:: Embedding movies, sounds, and 3D objects * slide:: Making presentations with ‘Asymptote’ * MetaPost:: ‘MetaPost’ compatibility routines * babel:: Interface to ‘LaTeX’ ‘babel’ package * labelpath:: Drawing curved labels * labelpath3:: Drawing curved labels in 3D * annotate:: Annotate your PDF files * CAD:: 2D CAD pen and measurement functions (DIN 15) * graph:: 2D linear & logarithmic graphs * palette:: Color density images and palettes * three:: 3D vector graphics * obj:: 3D obj files * graph3:: 3D linear & logarithmic graphs * grid3:: 3D grids * solids:: 3D solid geometry * tube:: 3D rotation minimizing tubes * flowchart:: Flowchart drawing routines * contour:: Contour lines * contour3:: Contour surfaces * smoothcontour3:: Smooth implicit surfaces * slopefield:: Slope fields * ode:: Ordinary differential equations  File: asymptote.info, Node: plain, Next: simplex, Up: Base modules 8.1 ‘plain’ =========== This is the default ‘Asymptote’ base file drawing language (such as the ‘picture’ structure). By default, an implicit ‘private import plain;’ occurs before translating a file and before the first command given in interactive mode. This also applies when translating files for module definitions (except when translating ‘plain’, of course). This means that the types and functions defined in ‘plain’ are accessible in almost all ‘Asymptote’ code. Use the ‘-noautoplain’ command-line option to disable this feature.  File: asymptote.info, Node: simplex, Next: simplex2, Prev: plain, Up: Base modules 8.2 ‘simplex’ ============= This module solves the general linear programming problem using the simplex method.  File: asymptote.info, Node: simplex2, Next: math, Prev: simplex, Up: Base modules 8.3 ‘simplex2’ ============== This module solves a special case of the two-variable linear programming problem used by the module ‘plain’ for automatic sizing of pictures (*note deferred drawing::).  File: asymptote.info, Node: math, Next: interpolate, Prev: simplex2, Up: Base modules 8.4 ‘math’ ========== This module extends ‘Asymptote’'s mathematical capabilities with useful functions such as ‘void drawline(picture pic=currentpicture’ draw the visible portion of the (infinite) line going through ‘P’ and ‘Q’, without altering the size of picture ‘pic’, using pen ‘p’. ‘real intersect(triple P, triple Q, triple n, triple Z);’ returns the intersection time of the extension of the line segment ‘PQ’ with the plane perpendicular to ‘n’ and passing through ‘Z’. ‘triple intersectionpoint(triple n0, triple P0, triple n1, triple P1);’ Return any point on the intersection of the two planes with normals ‘n0’ and ‘n1’ passing through points ‘P0’ and ‘P1’, respectively. If the planes are parallel, return ‘(infinity,infinity,infinity)’. ‘pair[] quarticroots(real a, real b, real c, real d, real e);’ returns the four complex roots of the quartic equation ax^4+bx^3+cx^2+dx+e=0. ‘real time(path g, real x, int n=0, real fuzz=-1)’ returns the ‘n’th intersection time of path ‘g’ with the vertical line through x. ‘real time(path g, explicit pair z, int n=0, real fuzz=-1)’ returns the ‘n’th intersection time of path ‘g’ with the horizontal line through ‘(0,z.y)’. ‘real value(path g, real x, int n=0, real fuzz=-1)’ returns the ‘n’th ‘y’ value of ‘g’ at ‘x’. ‘real value(path g, explicit pair z, int n=0, real fuzz=-1)’ returns the ‘n’th ‘x’ value of ‘g’ at ‘y=z.y’. ‘real slope(path g, real x, int n=0, real fuzz=-1)’ returns the ‘n’th slope of ‘g’ at ‘x’. ‘real slope(path g, explicit pair z, int n=0, real fuzz=-1)’ returns the ‘n’th slope of ‘g’ at ‘y=z.y’. int[][] segment(bool[] b) returns the indices of consecutive true-element segments of bool[] ‘b’. ‘real[] partialsum(real[] a)’ returns the partial sums of a real array ‘a’. ‘real[] partialsum(real[] a, real[] dx)’ returns the partial ‘dx’-weighted sums of a real array ‘a’. ‘bool increasing(real[] a, bool strict=false)’ returns, if ‘strict=false’, whether ‘i > j’ implies ‘a[i] >= a[j]’, or if ‘strict=true’, whether ‘i > j’ implies implies ‘a[i] > a[j]’. ‘int unique(real[] a, real x)’ if the sorted array ‘a’ does not contain ‘x’, insert it sequentially, returning the index of ‘x’ in the resulting array. ‘bool lexorder(pair a, pair b)’ returns the strict lexicographical partial order of ‘a’ and ‘b’. ‘bool lexorder(triple a, triple b)’ returns the strict lexicographical partial order of ‘a’ and ‘b’.  File: asymptote.info, Node: interpolate, Next: geometry, Prev: math, Up: Base modules 8.5 ‘interpolate’ ================= This module implements Lagrange, Hermite, and standard cubic spline interpolation in ‘Asymptote’, as illustrated in the example ‘interpolate1.asy’.  File: asymptote.info, Node: geometry, Next: trembling, Prev: interpolate, Up: Base modules 8.6 ‘geometry’ ============== This module, written by Philippe Ivaldi, provides an extensive set of geometry routines, including ‘perpendicular’ symbols and a ‘triangle’ structure. Link to the documentation for the ‘geometry’ module are posted here: , including an extensive set of examples, , and an index:  File: asymptote.info, Node: trembling, Next: stats, Prev: geometry, Up: Base modules 8.7 ‘trembling’ =============== This module, written by Philippe Ivaldi and illustrated in the example ‘floatingdisk.asy’, allows one to draw wavy lines, as if drawn by hand.  File: asymptote.info, Node: stats, Next: patterns, Prev: trembling, Up: Base modules 8.8 ‘stats’ =========== This module implements a Gaussian random number generator and a collection of statistics routines, including ‘histogram’ and ‘leastsquares’.  File: asymptote.info, Node: patterns, Next: markers, Prev: stats, Up: Base modules 8.9 ‘patterns’ ============== This module implements ‘PostScript’ tiling patterns and includes several convenient pattern generation routines.  File: asymptote.info, Node: markers, Next: map, Prev: patterns, Up: Base modules 8.10 ‘markers’ ============== This module implements specialized routines for marking paths and angles. The principal mark routine provided by this module is markroutine markinterval(int n=1, frame f, bool rotated=false); which centers ‘n’ copies of frame ‘f’ within uniformly space intervals in arclength along the path, optionally rotated by the angle of the local tangent. The ‘marker’ (*note marker::) routine can be used to construct new markers from these predefined frames: frame stickframe(int n=1, real size=0, pair space=0, real angle=0, pair offset=0, pen p=currentpen); frame circlebarframe(int n=1, real barsize=0, real radius=0,real angle=0, pair offset=0, pen p=currentpen, filltype filltype=NoFill, bool above=false); frame crossframe(int n=3, real size=0, pair space=0, real angle=0, pair offset=0, pen p=currentpen); frame tildeframe(int n=1, real size=0, pair space=0, real angle=0, pair offset=0, pen p=currentpen); For convenience, this module also constructs the markers ‘StickIntervalMarker’, ‘CrossIntervalMarker’, ‘CircleBarIntervalMarker’, and ‘TildeIntervalMarker’ from the above frames. The example ‘markers1.asy’ illustrates the use of these markers: [./markers1] This module also provides a routine for marking an angle AOB: void markangle(picture pic=currentpicture, Label L="", int n=1, real radius=0, real space=0, pair A, pair O, pair B, arrowbar arrow=None, pen p=currentpen, margin margin=NoMargin, marker marker=nomarker); as illustrated in the example ‘markers2.asy’. [./markers2]  File: asymptote.info, Node: map, Next: tree, Prev: markers, Up: Base modules 8.11 ‘map’ ========== This module creates a struct parameterized by the types specified in strings ‘key’ and ‘value’, mapping keys to values with a specified default: from map(Key=string, Value=int) access map; map M=map(Default=-1); M.add("z",2); M.add("a",3); M.add("d",4); write(M.lookup("a")); write(M.lookup("y"));  File: asymptote.info, Node: tree, Next: binarytree, Prev: map, Up: Base modules 8.12 ‘tree’ =========== This module implements an example of a dynamic binary search tree.  File: asymptote.info, Node: binarytree, Next: drawtree, Prev: tree, Up: Base modules 8.13 ‘binarytree’ ================= This module can be used to draw an arbitrary binary tree and includes an input routine for the special case of a binary search tree, as illustrated in the example ‘binarytreetest.asy’: import binarytree; picture pic,pic2; binarytree bt=binarytree(1,2,4,nil,5,nil,nil,0,nil,nil,3,6,nil,nil,7); draw(pic,bt,condensed=false); binarytree st=searchtree(10,5,2,1,3,4,7,6,8,9,15,13,12,11,14,17,16,18,19); draw(pic2,st,blue,condensed=true); add(pic.fit(),(0,0),10N); add(pic2.fit(),(0,0),10S); [./binarytreetest]  File: asymptote.info, Node: drawtree, Next: syzygy, Prev: binarytree, Up: Base modules 8.14 ‘drawtree’ =============== This is a simple tree drawing module used by the example ‘treetest.asy’.  File: asymptote.info, Node: syzygy, Next: feynman, Prev: drawtree, Up: Base modules 8.15 ‘syzygy’ ============= This module automates the drawing of braids, relations, and syzygies, along with the corresponding equations, as illustrated in the example ‘knots.asy’.  File: asymptote.info, Node: feynman, Next: roundedpath, Prev: syzygy, Up: Base modules 8.16 ‘feynman’ ============== This module, contributed by Martin Wiebusch, is useful for drawing Feynman diagrams, as illustrated by the examples ‘eetomumu.asy’ and ‘fermi.asy’.  File: asymptote.info, Node: roundedpath, Next: animation, Prev: feynman, Up: Base modules 8.17 ‘roundedpath’ ================== This module, contributed by Stefan Knorr, is useful for rounding the sharp corners of paths, as illustrated in the example file ‘roundpath.asy’.  File: asymptote.info, Node: animation, Next: embed, Prev: roundedpath, Up: Base modules 8.18 ‘animation’ ================ This module allows one to generate animations, as illustrated by the files ‘wheel.asy’, ‘wavepacket.asy’, and ‘cube.asy’ in the ‘animations’ subdirectory of the examples directory. These animations use the ‘ImageMagick’ ‘magick’ program to merge multiple images into a GIF or MPEG movie. The related ‘animate’ module, derived from the ‘animation’ module, generates higher-quality portable clickable PDF movies, with optional controls. This requires installing the module (version 2007/11/30 or later) in a new directory ‘animate’ in the local ‘LaTeX’ directory (for example, in ‘/usr/local/share/texmf/tex/latex/animate’). On ‘UNIX’ systems, one must then execute the command ‘texhash’. The example ‘pdfmovie.asy’ in the ‘animations’ directory, along with the slide presentations ‘slidemovies.asy’ and ‘intro’, illustrate the use of embedded PDF movies. The examples ‘inlinemovie.tex’ and ‘inlinemovie3.tex’ show how to generate and embed PDF movies directly within a ‘LaTeX’ file (*note LaTeX usage::). The member function string pdf(fit fit=NoBox, real delay=animationdelay, string options="", bool keep=settings.keep, bool multipage=true); of the ‘animate’ structure accepts any of the ‘animate.sty’ options, as described here:  File: asymptote.info, Node: embed, Next: slide, Prev: animation, Up: Base modules 8.19 ‘embed’ ============ This module provides an interface to the ‘LaTeX’ package (included with ‘MikTeX’) for embedding movies, sounds, and 3D objects into a PDF document. A more portable method for embedding movie files, which should work on any platform and does not require the ‘media9’ package, is provided by using the ‘external’ module instead of ‘embed’. Examples of the above two interfaces is provided in the file ‘embeddedmovie.asy’ in the ‘animations’ subdirectory of the examples directory and in ‘externalmovie.asy’. For a higher quality embedded movie generated directly by ‘Asymptote’, use the ‘animate’ module along with the ‘animate.sty’ package to embed a portable PDF animation (*note animate::). An example of embedding ‘U3D’ code is provided in the file ‘embeddedu3d’.  File: asymptote.info, Node: slide, Next: MetaPost, Prev: embed, Up: Base modules 8.20 ‘slide’ ============ This module provides a simple yet high-quality facility for making presentation slides, including portable embedded PDF animations (see the file ‘slidemovies.asy’). A simple example is provided in ‘slidedemo.asy’.  File: asymptote.info, Node: MetaPost, Next: babel, Prev: slide, Up: Base modules 8.21 ‘MetaPost’ =============== This module provides some useful routines to help ‘MetaPost’ users migrate old ‘MetaPost’ code to ‘Asymptote’. Further contributions here are welcome. Unlike ‘MetaPost’, ‘Asymptote’ does not implicitly solve linear equations and therefore does not have the notion of a ‘whatever’ unknown. The routine ‘extension’ (*note extension::) provides a useful replacement for a common use of ‘whatever’: finding the intersection point of the lines through ‘P’, ‘Q’ and ‘p’, ‘q’. For less common occurrences of ‘whatever’, one can use the built-in explicit linear equation solver ‘solve’ instead.  File: asymptote.info, Node: babel, Next: labelpath, Prev: MetaPost, Up: Base modules 8.22 ‘babel’ ============ This module implements the ‘LaTeX’ ‘babel’ package in ‘Asymptote’. For example: import babel; babel("german");  File: asymptote.info, Node: labelpath, Next: labelpath3, Prev: babel, Up: Base modules 8.23 ‘labelpath’ ================ This module uses the ‘PSTricks’ ‘pstextpath’ macro to fit labels along a path (properly kerned, as illustrated in the example file ‘curvedlabel.asy’), using the command void labelpath(picture pic=currentpicture, Label L, path g, string justify=Centered, pen p=currentpen); Here ‘justify’ is one of ‘LeftJustified’, ‘Centered’, or ‘RightJustified’. The x component of a shift transform applied to the Label is interpreted as a shift along the curve, whereas the y component is interpreted as a shift away from the curve. All other Label transforms are ignored. This module requires the ‘latex’ tex engine and inherits the limitations of the ‘PSTricks’ ‘\pstextpath’ macro.  File: asymptote.info, Node: labelpath3, Next: annotate, Prev: labelpath, Up: Base modules 8.24 ‘labelpath3’ ================= This module, contributed by Jens Schwaiger, implements a 3D version of ‘labelpath’ that does not require the ‘PSTricks’ package. An example is provided in ‘curvedlabel3.asy’.  File: asymptote.info, Node: annotate, Next: CAD, Prev: labelpath3, Up: Base modules 8.25 ‘annotate’ =============== This module supports PDF annotations for viewing with ‘Adobe Reader’, via the function void annotate(picture pic=currentpicture, string title, string text, pair position); Annotations are illustrated in the example file ‘annotation.asy’. Currently, annotations are only implemented for the ‘latex’ (default) and ‘tex’ TeX engines.  File: asymptote.info, Node: CAD, Next: graph, Prev: annotate, Up: Base modules 8.26 ‘CAD’ ========== This module, contributed by Mark Henning, provides basic pen definitions and measurement functions for simple 2D CAD drawings according to DIN 15. It is documented separately, in the file ‘CAD.pdf’.  File: asymptote.info, Node: graph, Next: palette, Prev: CAD, Up: Base modules 8.27 ‘graph’ ============ This module implements two-dimensional linear and logarithmic graphs, including automatic scale and tick selection (with the ability to override manually). A graph is a ‘guide’ (that can be drawn with the draw command, with an optional legend) constructed with one of the following routines: • guide graph(picture pic=currentpicture, real f(real), real a, real b, int n=ngraph, real T(real)=identity, interpolate join=operator --); guide[] graph(picture pic=currentpicture, real f(real), real a, real b, int n=ngraph, real T(real)=identity, bool3 cond(real), interpolate join=operator --); Returns a graph using the scaling information for picture ‘pic’ (*note automatic scaling::) of the function ‘f’ on the interval [‘T’(‘a’),‘T’(‘b’)], sampling at ‘n’ points evenly spaced in [‘a’,‘b’], optionally restricted by the bool3 function ‘cond’ on [‘a’,‘b’]. If ‘cond’ is: • ‘true’, the point is added to the existing guide; • ‘default’, the point is added to a new guide; • ‘false’, the point is omitted and a new guide is begun. The points are connected using the interpolation specified by ‘join’: • ‘operator --’ (linear interpolation; the abbreviation ‘Straight’ is also accepted); • ‘operator ..’ (piecewise Bezier cubic spline interpolation; the abbreviation ‘Spline’ is also accepted); • ‘linear’ (linear interpolation), • ‘Hermite’ (standard cubic spline interpolation using boundary condition ‘notaknot’, ‘natural’, ‘periodic’, ‘clamped(real slopea, real slopeb)’), or ‘monotonic’. The abbreviation ‘Hermite’ is equivalent to ‘Hermite(notaknot)’ for nonperiodic data and ‘Hermite(periodic)’ for periodic data). • guide graph(picture pic=currentpicture, real x(real), real y(real), real a, real b, int n=ngraph, real T(real)=identity, interpolate join=operator --); guide[] graph(picture pic=currentpicture, real x(real), real y(real), real a, real b, int n=ngraph, real T(real)=identity, bool3 cond(real), interpolate join=operator --); Returns a graph using the scaling information for picture ‘pic’ of the parametrized function (‘x’(t),‘y’(t)) for t in the interval [‘T’(‘a’),‘T’(‘b’)], sampling at ‘n’ points evenly spaced in [‘a’,‘b’], optionally restricted by the bool3 function ‘cond’ on [‘a’,‘b’], using the given interpolation type. • guide graph(picture pic=currentpicture, pair z(real), real a, real b, int n=ngraph, real T(real)=identity, interpolate join=operator --); guide[] graph(picture pic=currentpicture, pair z(real), real a, real b, int n=ngraph, real T(real)=identity, bool3 cond(real), interpolate join=operator --); Returns a graph using the scaling information for picture ‘pic’ of the parametrized function ‘z’(t) for t in the interval [‘T’(‘a’),‘T’(‘b’)], sampling at ‘n’ points evenly spaced in [‘a’,‘b’], optionally restricted by the bool3 function ‘cond’ on [‘a’,‘b’], using the given interpolation type. • guide graph(picture pic=currentpicture, pair[] z, interpolate join=operator --); guide[] graph(picture pic=currentpicture, pair[] z, bool3[] cond, interpolate join=operator --); Returns a graph using the scaling information for picture ‘pic’ of the elements of the array ‘z’, optionally restricted to those indices for which the elements of the boolean array ‘cond’ are ‘true’, using the given interpolation type. • guide graph(picture pic=currentpicture, real[] x, real[] y, interpolate join=operator --); guide[] graph(picture pic=currentpicture, real[] x, real[] y, bool3[] cond, interpolate join=operator --); Returns a graph using the scaling information for picture ‘pic’ of the elements of the arrays (‘x’,‘y’), optionally restricted to those indices for which the elements of the boolean array ‘cond’ are ‘true’, using the given interpolation type. • guide polargraph(picture pic=currentpicture, real f(real), real a, real b, int n=ngraph, interpolate join=operator --); Returns a polar-coordinate graph using the scaling information for picture ‘pic’ of the function ‘f’ on the interval [‘a’,‘b’], sampling at ‘n’ evenly spaced points, with the given interpolation type. • guide polargraph(picture pic=currentpicture, real[] r, real[] theta, interpolate join=operator--); Returns a polar-coordinate graph using the scaling information for picture ‘pic’ of the elements of the arrays (‘r’,‘theta’), using the given interpolation type. An axis can be drawn on a picture with one of the following commands: • void xaxis(picture pic=currentpicture, Label L="", axis axis=YZero, real xmin=-infinity, real xmax=infinity, pen p=currentpen, ticks ticks=NoTicks, arrowbar arrow=None, bool above=false); Draw an x axis on picture ‘pic’ from x=‘xmin’ to x=‘xmax’ using pen ‘p’, optionally labelling it with Label ‘L’. The relative label location along the axis (a real number from [0,1]) defaults to 1 (*note Label::), so that the label is drawn at the end of the axis. An infinite value of ‘xmin’ or ‘xmax’ specifies that the corresponding axis limit will be automatically determined from the picture limits. The optional ‘arrow’ argument takes the same values as in the ‘draw’ command (*note arrows::). The axis is drawn before any existing objects in ‘pic’ unless ‘above=true’. The axis placement is determined by one of the following ‘axis’ types: ‘YZero(bool extend=true)’ Request an x axis at y=0 (or y=1 on a logarithmic axis) extending to the full dimensions of the picture, unless ‘extend’=false. ‘YEquals(real Y, bool extend=true)’ Request an x axis at y=‘Y’ extending to the full dimensions of the picture, unless ‘extend’=false. ‘Bottom(bool extend=false)’ Request a bottom axis. ‘Top(bool extend=false)’ Request a top axis. ‘BottomTop(bool extend=false)’ Request a bottom and top axis. Custom axis types can be created by following the examples in the module ‘graph.asy’. One can easily override the default values for the standard axis types: import graph; YZero=new axis(bool extend=true) { return new void(picture pic, axisT axis) { real y=pic.scale.x.scale.logarithmic ? 1 : 0; axis.value=I*pic.scale.y.T(y); axis.position=1; axis.side=right; axis.align=2.5E; axis.value2=Infinity; axis.extend=extend; }; }; YZero=YZero(); The default tick option is ‘NoTicks’. The options ‘LeftTicks’, ‘RightTicks’, or ‘Ticks’ can be used to draw ticks on the left, right, or both sides of the path, relative to the direction in which the path is drawn. These tick routines accept a number of optional arguments: ticks LeftTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, tickmodifier modify=None, real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen); If any of these parameters are omitted, reasonable defaults will be chosen: ‘Label format’ override the default tick label format (‘defaultformat’, initially "$%.4g$"), rotation, pen, and alignment (for example, ‘LeftSide’, ‘Center’, or ‘RightSide’) relative to the axis. To enable ‘LaTeX’ math mode fonts, the format string should begin and end with ‘$’ *note format::. If the format string is ‘trailingzero’, trailing zeros will be added to the tick labels; if the format string is ‘"%"’, the tick label will be suppressed; ‘ticklabel’ is a function ‘string(real x)’ returning the label (by default, format(format.s,x)) for each major tick value ‘x’; ‘bool beginlabel’ include the first label; ‘bool endlabel’ include the last label; ‘int N’ when automatic scaling is enabled (the default; *note automatic scaling::), divide a linear axis evenly into this many intervals, separated by major ticks; for a logarithmic axis, this is the number of decades between labelled ticks; ‘int n’ divide each interval into this many subintervals, separated by minor ticks; ‘real Step’ the tick value spacing between major ticks (if ‘N’=‘0’); ‘real step’ the tick value spacing between minor ticks (if ‘n’=‘0’); ‘bool begin’ include the first major tick; ‘bool end’ include the last major tick; ‘tickmodifier modify;’ an optional function that takes and returns a ‘tickvalue’ structure having real[] members ‘major’ and ‘minor’ consisting of the tick values (to allow modification of the automatically generated tick values); ‘real Size’ the size of the major ticks (in ‘PostScript’ coordinates); ‘real size’ the size of the minor ticks (in ‘PostScript’ coordinates); ‘bool extend;’ extend the ticks between two axes (useful for drawing a grid on the graph); ‘pen pTick’ an optional pen used to draw the major ticks; ‘pen ptick’ an optional pen used to draw the minor ticks. For convenience, the predefined tickmodifiers ‘OmitTick(... real[] x)’, ‘OmitTickInterval(real a, real b)’, and ‘OmitTickIntervals(real[] a, real[] b)’ can be used to remove specific auto-generated ticks and their labels. The ‘OmitFormat(string s=defaultformat ... real[] x)’ ticklabel can be used to remove specific tick labels but not the corresponding ticks. The tickmodifier ‘NoZero’ is an abbreviation for ‘OmitTick(0)’ and the ticklabel ‘NoZeroFormat’ is an abbrevation for ‘OmitFormat(0)’. It is also possible to specify custom tick locations with ‘LeftTicks’, ‘RightTicks’, and ‘Ticks’ by passing explicit real arrays ‘Ticks’ and (optionally) ‘ticks’ containing the locations of the major and minor ticks, respectively: ticks LeftTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, real[] Ticks, real[] ticks=new real[], real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) • void yaxis(picture pic=currentpicture, Label L="", axis axis=XZero, real ymin=-infinity, real ymax=infinity, pen p=currentpen, ticks ticks=NoTicks, arrowbar arrow=None, bool above=false, bool autorotate=true); Draw a y axis on picture ‘pic’ from y=‘ymin’ to y=‘ymax’ using pen ‘p’, optionally labelling it with a Label ‘L’ that is autorotated unless ‘autorotate=false’. The relative location of the label (a real number from [0,1]) defaults to 1 (*note Label::). An infinite value of ‘ymin’ or ‘ymax’ specifies that the corresponding axis limit will be automatically determined from the picture limits. The optional ‘arrow’ argument takes the same values as in the ‘draw’ command (*note arrows::). The axis is drawn before any existing objects in ‘pic’ unless ‘above=true’. The tick type is specified by ‘ticks’ and the axis placement is determined by one of the following ‘axis’ types: ‘XZero(bool extend=true)’ Request a y axis at x=0 (or x=1 on a logarithmic axis) extending to the full dimensions of the picture, unless ‘extend’=false. ‘XEquals(real X, bool extend=true)’ Request a y axis at x=‘X’ extending to the full dimensions of the picture, unless ‘extend’=false. ‘Left(bool extend=false)’ Request a left axis. ‘Right(bool extend=false)’ Request a right axis. ‘LeftRight(bool extend=false)’ Request a left and right axis. • For convenience, the functions void xequals(picture pic=currentpicture, Label L="", real x, bool extend=false, real ymin=-infinity, real ymax=infinity, pen p=currentpen, ticks ticks=NoTicks, bool above=true, arrowbar arrow=None); and void yequals(picture pic=currentpicture, Label L="", real y, bool extend=false, real xmin=-infinity, real xmax=infinity, pen p=currentpen, ticks ticks=NoTicks, bool above=true, arrowbar arrow=None); can be respectively used to call ‘yaxis’ and ‘xaxis’ with the appropriate axis types ‘XEquals(x,extend)’ and ‘YEquals(y,extend)’. This is the recommended way of drawing vertical or horizontal lines and axes at arbitrary locations. • void axes(picture pic=currentpicture, Label xlabel="", Label ylabel="", bool extend=true, pair min=(-infinity,-infinity), pair max=(infinity,infinity), pen p=currentpen, arrowbar arrow=None, bool above=false); This convenience routine draws both x and y axes on picture ‘pic’ from ‘min’ to ‘max’, with optional labels ‘xlabel’ and ‘ylabel’ and any arrows specified by ‘arrow’. The axes are drawn on top of existing objects in ‘pic’ only if ‘above=true’. • void axis(picture pic=currentpicture, Label L="", path g, pen p=currentpen, ticks ticks, ticklocate locate, arrowbar arrow=None, int[] divisor=new int[], bool above=false, bool opposite=false); This routine can be used to draw on picture ‘pic’ a general axis based on an arbitrary path ‘g’, using pen ‘p’. One can optionally label the axis with Label ‘L’ and add an arrow ‘arrow’. The tick type is given by ‘ticks’. The optional integer array ‘divisor’ specifies what tick divisors to try in the attempt to produce uncrowded tick labels. A ‘true’ value for the flag ‘opposite’ identifies an unlabelled secondary axis (typically drawn opposite a primary axis). The axis is drawn before any existing objects in ‘pic’ unless ‘above=true’. The tick locator ‘ticklocate’ is constructed by the routine ticklocate ticklocate(real a, real b, autoscaleT S=defaultS, real tickmin=-infinity, real tickmax=infinity, real time(real)=null, pair dir(real)=zero); where ‘a’ and ‘b’ specify the respective tick values at ‘point(g,0)’ and ‘point(g,length(g))’, ‘S’ specifies the autoscaling transformation, the function ‘real time(real v)’ returns the time corresponding to the value ‘v’, and ‘pair dir(real t)’ returns the absolute tick direction as a function of ‘t’ (zero means draw the tick perpendicular to the axis). • These routines are useful for manually putting ticks and labels on axes (if the variable ‘Label’ is given as the ‘Label’ argument, the ‘format’ argument will be used to format a string based on the tick location): void xtick(picture pic=currentpicture, Label L="", explicit pair z, pair dir=N, string format="", real size=Ticksize, pen p=currentpen); void xtick(picture pic=currentpicture, Label L="", real x, pair dir=N, string format="", real size=Ticksize, pen p=currentpen); void ytick(picture pic=currentpicture, Label L="", explicit pair z, pair dir=E, string format="", real size=Ticksize, pen p=currentpen); void ytick(picture pic=currentpicture, Label L="", real y, pair dir=E, string format="", real size=Ticksize, pen p=currentpen); void tick(picture pic=currentpicture, pair z, pair dir, real size=Ticksize, pen p=currentpen); void labelx(picture pic=currentpicture, Label L="", explicit pair z, align align=S, string format="", pen p=currentpen); void labelx(picture pic=currentpicture, Label L="", real x, align align=S, string format="", pen p=currentpen); void labelx(picture pic=currentpicture, Label L, string format="", explicit pen p=currentpen); void labely(picture pic=currentpicture, Label L="", explicit pair z, align align=W, string format="", pen p=currentpen); void labely(picture pic=currentpicture, Label L="", real y, align align=W, string format="", pen p=currentpen); void labely(picture pic=currentpicture, Label L, string format="", explicit pen p=currentpen); Here are some simple examples of two-dimensional graphs: 1. This example draws a textbook-style graph of y= exp(x), with the y axis starting at y=0: import graph; size(150,0); real f(real x) {return exp(x);} pair F(real x) {return (x,f(x));} draw(graph(f,-4,2,operator ..),red); xaxis("$x$"); yaxis("$y$",0); labely(1,E); label("$e^x$",F(1),SE); [./exp] 2. The next example draws a scientific-style graph with a legend. The position of the legend can be adjusted either explicitly or by using the graphical user interface (*note GUI::). If an ‘UnFill(real xmargin=0, real ymargin=xmargin)’ or ‘Fill(pen)’ option is specified to ‘add’, the legend will obscure any underlying objects. Here we illustrate how to clip the portion of the picture covered by a label: import graph; size(400,200,IgnoreAspect); real Sin(real t) {return sin(2pi*t);} real Cos(real t) {return cos(2pi*t);} draw(graph(Sin,0,1),red,"$\sin(2\pi x)$"); draw(graph(Cos,0,1),blue,"$\cos(2\pi x)$"); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks(trailingzero)); label("LABEL",point(0),UnFill(1mm)); add(legend(),point(E),20E,UnFill); [./lineargraph0] To specify a fixed size for the graph proper, use ‘attach’: import graph; size(250,200,IgnoreAspect); real Sin(real t) {return sin(2pi*t);} real Cos(real t) {return cos(2pi*t);} draw(graph(Sin,0,1),red,"$\sin(2\pi x)$"); draw(graph(Cos,0,1),blue,"$\cos(2\pi x)$"); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks(trailingzero)); label("LABEL",point(0),UnFill(1mm)); attach(legend(),truepoint(E),20E,UnFill); A legend can have multiple entries per line: import graph; size(8cm,6cm,IgnoreAspect); typedef real realfcn(real); realfcn F(real p) { return new real(real x) {return sin(p*x);}; } for(int i=1; i < 5; ++i) draw(graph(F(i*pi),0,1),Pen(i), "$\sin("+(i == 1 ? "" : (string) i)+"\pi x)$"); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks(trailingzero)); attach(legend(2),(point(S).x,truepoint(S).y),10S,UnFill); [./legend] 3. This example draws a graph of one array versus another (both of the same size) using custom tick locations and a smaller font size for the tick labels on the y axis. import graph; size(200,150,IgnoreAspect); real[] x={0,1,2,3}; real[] y=x^2; draw(graph(x,y),red); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight, RightTicks(Label(fontsize(8pt)),new real[]{0,4,9})); [./datagraph] 4. This example shows how to graph columns of data read from a file. import graph; size(200,150,IgnoreAspect); file in=input("filegraph.dat").line(); real[][] a=in; a=transpose(a); real[] x=a[0]; real[] y=a[1]; draw(graph(x,y),red); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); [./filegraph] 5. The next example draws two graphs of an array of coordinate pairs, using frame alignment and data markers. In the left-hand graph, the markers, constructed with marker marker(path g, markroutine markroutine=marknodes, pen p=currentpen, filltype filltype=NoFill, bool above=true); using the path ‘unitcircle’ (*note filltype::), are drawn below each node. Any frame can be converted to a marker, using marker marker(frame f, markroutine markroutine=marknodes, bool above=true); In the right-hand graph, the unit n-sided regular polygon ‘polygon(int n)’ and the unit n-point cyclic cross ‘cross(int n, bool round=true, real r=0)’ (where ‘r’ is an optional "inner" radius) are used to build a custom marker frame. Here ‘markuniform(bool centered=false, int n, bool rotated=false)’ adds this frame at ‘n’ uniformly spaced points along the arclength of the path, optionally rotated by the angle of the local tangent to the path (if centered is true, the frames will be centered within ‘n’ evenly spaced arclength intervals). Alternatively, one can use markroutine ‘marknodes’ to request that the marks be placed at each Bezier node of the path, or markroutine ‘markuniform(pair z(real t), real a, real b, int n)’ to place marks at points ‘z(t)’ for n evenly spaced values of ‘t’ in ‘[a,b]’. These markers are predefined: marker[] Mark={ marker(scale(circlescale)*unitcircle), marker(polygon(3)),marker(polygon(4)), marker(polygon(5)),marker(invert*polygon(3)), marker(cross(4)),marker(cross(6)),marker(diamond),marker(plus); }; marker[] MarkFill={ marker(scale(circlescale)*unitcircle,Fill),marker(polygon(3),Fill), marker(polygon(4),Fill),marker(polygon(5),Fill), marker(invert*polygon(3),Fill),marker(diamond,Fill) }; The example also illustrates the ‘errorbar’ routines: void errorbars(picture pic=currentpicture, pair[] z, pair[] dp, pair[] dm={}, bool[] cond={}, pen p=currentpen, real size=0); void errorbars(picture pic=currentpicture, real[] x, real[] y, real[] dpx, real[] dpy, real[] dmx={}, real[] dmy={}, bool[] cond={}, pen p=currentpen, real size=0); Here, the positive and negative extents of the error are given by the absolute values of the elements of the pair array ‘dp’ and the optional pair array ‘dm’. If ‘dm’ is not specified, the positive and negative extents of the error are assumed to be equal. import graph; picture pic; real xsize=200, ysize=140; size(pic,xsize,ysize,IgnoreAspect); pair[] f={(5,5),(50,20),(90,90)}; pair[] df={(0,0),(5,7),(0,5)}; errorbars(pic,f,df,red); draw(pic,graph(pic,f),"legend", marker(scale(0.8mm)*unitcircle,red,FillDraw(blue),above=false)); scale(pic,true); xaxis(pic,"$x$",BottomTop,LeftTicks); yaxis(pic,"$y$",LeftRight,RightTicks); add(pic,legend(pic),point(pic,NW),20SE,UnFill); picture pic2; size(pic2,xsize,ysize,IgnoreAspect); frame mark; filldraw(mark,scale(0.8mm)*polygon(6),green,green); draw(mark,scale(0.8mm)*cross(6),blue); draw(pic2,graph(pic2,f),marker(mark,markuniform(5))); scale(pic2,true); xaxis(pic2,"$x$",BottomTop,LeftTicks); yaxis(pic2,"$y$",LeftRight,RightTicks); yequals(pic2,55.0,red+Dotted); xequals(pic2,70.0,red+Dotted); // Fit pic to W of origin: add(pic.fit(),(0,0),W); // Fit pic2 to E of (5mm,0): add(pic2.fit(),(5mm,0),E); [./errorbars] 6. A custom mark routine can be also be specified: import graph; size(200,100,IgnoreAspect); markroutine marks() { return new void(picture pic=currentpicture, frame f, path g) { path p=scale(1mm)*unitcircle; for(int i=0; i <= length(g); ++i) { pair z=point(g,i); frame f; if(i % 4 == 0) { fill(f,p); add(pic,f,z); } else { if(z.y > 50) { pic.add(new void(frame F, transform t) { path q=shift(t*z)*p; unfill(F,q); draw(F,q); }); } else { draw(f,p); add(pic,f,z); } } } }; } pair[] f={(5,5),(40,20),(55,51),(90,30)}; draw(graph(f),marker(marks())); scale(true); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); [./graphmarkers] 7. This example shows how to label an axis with arbitrary strings. import graph; size(400,150,IgnoreAspect); real[] x=sequence(12); real[] y=sin(2pi*x/12); scale(false); string[] month={"Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec"}; draw(graph(x,y),red,MarkFill[0]); xaxis(BottomTop,LeftTicks(new string(real x) { return month[round(x % 12)];})); yaxis("$y$",LeftRight,RightTicks(4)); [./monthaxis] 8. The next example draws a graph of a parametrized curve. The calls to xlimits(picture pic=currentpicture, real min=-infinity, real max=infinity, bool crop=NoCrop); and the analogous function ‘ylimits’ can be uncommented to set the respective axes limits for picture ‘pic’ to the specified ‘min’ and ‘max’ values. Alternatively, the function void limits(picture pic=currentpicture, pair min, pair max, bool crop=NoCrop); can be used to limit the axes to the box having opposite vertices at the given pairs). Existing objects in picture ‘pic’ will be cropped to lie within the given limits if ‘crop’=‘Crop’. The function ‘crop(picture pic)’ can be used to crop a graph to the current graph limits. import graph; size(0,200); real x(real t) {return cos(2pi*t);} real y(real t) {return sin(2pi*t);} draw(graph(x,y,0,1)); //limits((0,-1),(1,0),Crop); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks(trailingzero)); [./parametricgraph] The function guide graphwithderiv(pair f(real), pair fprime(real), real a, real b, int n=ngraph#10); can be used to construct the graph of the parametric function ‘f’ on ‘[a,b]’ with the control points of the ‘n’ Bezier segments determined by the specified derivative ‘fprime’: unitsize(2cm); import graph; pair F(real t) { return (1.3*t,-4.5*t^2+3.0*t+1.0); } pair Fprime(real t) { return (1.3,-9.0*t+3.0); } path g=graphwithderiv(F,Fprime,0,0.9,4); dot(g,red); draw(g,arrow=Arrow(TeXHead)); [./graphwithderiv] The next example illustrates how one can extract a common axis scaling factor. import graph; axiscoverage=0.9; size(200,IgnoreAspect); real[] x={-1e-11,1e-11}; real[] y={0,1e6}; real xscale=round(log10(max(x))); real yscale=round(log10(max(y)))-1; draw(graph(x*10^(-xscale),y*10^(-yscale)),red); xaxis("$x/10^{"+(string) xscale+"}$",BottomTop,LeftTicks); yaxis("$y/10^{"+(string) yscale+"}$",LeftRight,RightTicks(trailingzero)); [./scaledgraph] Axis scaling can be requested and/or automatic selection of the axis limits can be inhibited with one of these ‘scale’ routines: void scale(picture pic=currentpicture, scaleT x, scaleT y); void scale(picture pic=currentpicture, bool xautoscale=true, bool yautoscale=xautoscale, bool zautoscale=yautoscale); This sets the scalings for picture ‘pic’. The ‘graph’ routines accept an optional ‘picture’ argument for determining the appropriate scalings to use; if none is given, it uses those set for ‘currentpicture’. Two frequently used scaling routines ‘Linear’ and ‘Log’ are predefined in ‘graph’. All picture coordinates (including those in paths and those given to the ‘label’ and ‘limits’ functions) are always treated as linear (post-scaled) coordinates. Use pair Scale(picture pic=currentpicture, pair z); to convert a graph coordinate into a scaled picture coordinate. The x and y components can be individually scaled using the analogous routines real ScaleX(picture pic=currentpicture, real x); real ScaleY(picture pic=currentpicture, real y); The predefined scaling routines can be given two optional boolean arguments: ‘automin=false’ and ‘automax=automin’. These default to ‘false’ but can be respectively set to ‘true’ to enable automatic selection of "nice" axis minimum and maximum values. The ‘Linear’ scaling can also take as optional final arguments a multiplicative scaling factor and intercept (e.g. for a depth axis, ‘Linear(-1)’ requests axis reversal). For example, to draw a log/log graph of a function, use ‘scale(Log,Log)’: import graph; size(200,200,IgnoreAspect); real f(real t) {return 1/t;} scale(Log,Log); draw(graph(f,0.1,10)); //limits((1,0.1),(10,0.5),Crop); dot(Label("(3,5)",align=S),Scale((3,5))); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); [./loggraph] By extending the ticks, one can easily produce a logarithmic grid: import graph; size(200,200,IgnoreAspect); real f(real t) {return 1/t;} scale(Log,Log); draw(graph(f,0.1,10),red); pen thin=linewidth(0.5*linewidth()); xaxis("$x$",BottomTop,LeftTicks(begin=false,end=false,extend=true, ptick=thin)); yaxis("$y$",LeftRight,RightTicks(begin=false,end=false,extend=true, ptick=thin)); [./loggrid] One can also specify custom tick locations and formats for logarithmic axes: import graph; size(300,175,IgnoreAspect); scale(Log,Log); draw(graph(identity,5,20)); xlimits(5,20); ylimits(1,100); xaxis("$M/M_\odot$",BottomTop,LeftTicks(DefaultFormat, new real[] {6,10,12,14,16,18})); yaxis("$\nu_{\rm upp}$ [Hz]",LeftRight,RightTicks(DefaultFormat)); [./logticks] It is easy to draw logarithmic graphs with respect to other bases: import graph; size(200,IgnoreAspect); // Base-2 logarithmic scale on y-axis: real log2(real x) {static real log2=log(2); return log(x)/log2;} real pow2(real x) {return 2^x;} scaleT yscale=scaleT(log2,pow2,logarithmic=true); scale(Linear,yscale); real f(real x) {return 1+x^2;} draw(graph(f,-4,4)); yaxis("$y$",ymin=1,ymax=f(5),RightTicks(Label(Fill(white))),EndArrow); xaxis("$x$",xmin=-5,xmax=5,LeftTicks,EndArrow); [./log2graph] Here is an example of "broken" linear x and logarithmic y axes that omit the segments [3,8] and [100,1000], respectively. In the case of a logarithmic axis, the break endpoints are automatically rounded to the nearest integral power of the base. import graph; size(200,150,IgnoreAspect); // Break the x axis at 3; restart at 8: real a=3, b=8; // Break the y axis at 100; restart at 1000: real c=100, d=1000; scale(Broken(a,b),BrokenLog(c,d)); real[] x={1,2,4,6,10}; real[] y=x^4; draw(graph(x,y),red,MarkFill[0]); xaxis("$x$",BottomTop,LeftTicks(Break(a,b))); yaxis("$y$",LeftRight,RightTicks(Break(c,d))); label(rotate(90)*Break,(a,point(S).y)); label(rotate(90)*Break,(a,point(N).y)); label(Break,(point(W).x,ScaleY(c))); label(Break,(point(E).x,ScaleY(c))); [./brokenaxis] 9. ‘Asymptote’ can draw secondary axes with the routines picture secondaryX(picture primary=currentpicture, void f(picture)); picture secondaryY(picture primary=currentpicture, void f(picture)); In this example, ‘secondaryY’ is used to draw a secondary linear y axis against a primary logarithmic y axis: import graph; texpreamble("\def\Arg{\mathop {\rm Arg}\nolimits}"); size(10cm,5cm,IgnoreAspect); real ampl(real x) {return 2.5/sqrt(1+x^2);} real phas(real x) {return -atan(x)/pi;} scale(Log,Log); draw(graph(ampl,0.01,10)); ylimits(0.001,100); xaxis("$\omega\tau_0$",BottomTop,LeftTicks); yaxis("$|G(\omega\tau_0)|$",Left,RightTicks); picture q=secondaryY(new void(picture pic) { scale(pic,Log,Linear); draw(pic,graph(pic,phas,0.01,10),red); ylimits(pic,-1.0,1.5); yaxis(pic,"$\Arg G/\pi$",Right,red, LeftTicks("$% #.1f$", begin=false,end=false)); yequals(pic,1,Dotted); }); label(q,"(1,0)",Scale(q,(1,0)),red); add(q); [./Bode] A secondary logarithmic y axis can be drawn like this: import graph; size(9cm,6cm,IgnoreAspect); string data="secondaryaxis.csv"; file in=input(data).line().csv(); string[] titlelabel=in; string[] columnlabel=in; real[][] a=in; a=transpose(a); real[] t=a[0], susceptible=a[1], infectious=a[2], dead=a[3], larvae=a[4]; real[] susceptibleM=a[5], exposed=a[6], infectiousM=a[7]; scale(true); draw(graph(t,susceptible,t >= 10 & t <= 15)); draw(graph(t,dead,t >= 10 & t <= 15),dashed); xaxis("Time ($\tau$)",BottomTop,LeftTicks); yaxis(Left,RightTicks); picture secondary=secondaryY(new void(picture pic) { scale(pic,Linear(true),Log(true)); draw(pic,graph(pic,t,infectious,t >= 10 & t <= 15),red); yaxis(pic,Right,red,LeftTicks(begin=false,end=false)); }); add(secondary); label(shift(5mm*N)*"Proportion of crows",point(NW),E); [./secondaryaxis] 10. Here is a histogram example, which uses the ‘stats’ module. import graph; import stats; size(400,200,IgnoreAspect); int n=10000; real[] a=new real[n]; for(int i=0; i < n; ++i) a[i]=Gaussrand(); draw(graph(Gaussian,min(a),max(a)),blue); // Optionally calculate "optimal" number of bins a la Shimazaki and Shinomoto. int N=bins(a); histogram(a,min(a),max(a),N,normalize=true,low=0,lightred,black,bars=true); xaxis("$x$",BottomTop,LeftTicks); yaxis("$dP/dx$",LeftRight,RightTicks(trailingzero)); [./histogram] 11. Here is an example of reading column data in from a file and a least-squares fit, using the ‘stats’ module. size(400,200,IgnoreAspect); import graph; import stats; file fin=input("leastsquares.dat").line(); real[][] a=fin; a=transpose(a); real[] t=a[0], rho=a[1]; // Read in parameters from the keyboard: //real first=getreal("first"); //real step=getreal("step"); //real last=getreal("last"); real first=100; real step=50; real last=700; // Remove negative or zero values of rho: t=rho > 0 ? t : null; rho=rho > 0 ? rho : null; scale(Log(true),Linear(true)); int n=step > 0 ? ceil((last-first)/step) : 0; real[] T,xi,dxi; for(int i=0; i <= n; ++i) { real first=first+i*step; real[] logrho=(t >= first & t <= last) ? log(rho) : null; real[] logt=(t >= first & t <= last) ? -log(t) : null; if(logt.length < 2) break; // Fit to the line logt=L.m*logrho+L.b: linefit L=leastsquares(logt,logrho); T.push(first); xi.push(L.m); dxi.push(L.dm); } draw(graph(T,xi),blue); errorbars(T,xi,dxi,red); crop(); ylimits(0); xaxis("$T$",BottomTop,LeftTicks); yaxis("$\xi$",LeftRight,RightTicks); [./leastsquares] 12. Here is an example that illustrates the general ‘axis’ routine. import graph; size(0,100); path g=ellipse((0,0),1,2); scale(true); axis(Label("C",align=10W),g,LeftTicks(endlabel=false,8,end=false), ticklocate(0,360,new real(real v) { path h=(0,0)--max(abs(max(g)),abs(min(g)))*dir(v); return intersect(g,h)[0];})); [./generalaxis] 13. To draw a vector field of ‘n’ arrows evenly spaced along the arclength of a path, use the routine picture vectorfield(path vector(real), path g, int n, bool truesize=false, pen p=currentpen, arrowbar arrow=Arrow); as illustrated in this simple example of a flow field: import graph; defaultpen(1.0); size(0,150,IgnoreAspect); real arrowsize=4mm; real arrowlength=2arrowsize; typedef path vector(real); // Return a vector interpolated linearly between a and b. vector vector(pair a, pair b) { return new path(real x) { return (0,0)--arrowlength*interp(a,b,x); }; } real f(real x) {return 1/x;} real epsilon=0.5; path g=graph(f,epsilon,1/epsilon); int n=3; draw(g); xaxis("$x$"); yaxis("$y$"); add(vectorfield(vector(W,W),g,n,true)); add(vectorfield(vector(NE,NW),(0,0)--(point(E).x,0),n,true)); add(vectorfield(vector(NE,NE),(0,0)--(0,point(N).y),n,true)); [./flow] 14. To draw a vector field of ‘nx’\times‘ny’ arrows in ‘box(a,b)’, use the routine picture vectorfield(path vector(pair), pair a, pair b, int nx=nmesh, int ny=nx, bool truesize=false, real maxlength=truesize ? 0 : maxlength(a,b,nx,ny), bool cond(pair z)=null, pen p=currentpen, arrowbar arrow=Arrow, margin margin=PenMargin) as illustrated in this example: import graph; size(100); pair a=(0,0); pair b=(2pi,2pi); path vector(pair z) {return (sin(z.x),cos(z.y));} add(vectorfield(vector,a,b)); [./vectorfield] 15. The following scientific graphs, which illustrate many features of ‘Asymptote’'s graphics routines, were generated from the examples ‘diatom.asy’ and ‘westnile.asy’, using the comma-separated data in ‘diatom.csv’ and ‘westnile.csv’. [./diatom] [./westnile]  File: asymptote.info, Node: palette, Next: three, Prev: graph, Up: Base modules 8.28 ‘palette’ ============== ‘Asymptote’ can also generate color density images and palettes. The following palettes are predefined in ‘palette.asy’: ‘pen[] Grayscale(int NColors=256)’ a grayscale palette; ‘pen[] Rainbow(int NColors=32766)’ a rainbow spectrum; ‘pen[] BWRainbow(int NColors=32761)’ a rainbow spectrum tapering off to black/white at the ends; ‘pen[] BWRainbow2(int NColors=32761)’ a double rainbow palette tapering off to black/white at the ends, with a linearly scaled intensity. ‘pen[] Wheel(int NColors=32766)’ a full color wheel palette; ‘pen[] Gradient(int NColors=256 ... pen[] p)’ a palette varying linearly over the specified array of pens, using NColors in each interpolation interval; The function ‘cmyk(pen[] Palette)’ may be used to convert any of these palettes to the CMYK colorspace. A color density plot using palette ‘palette’ can be generated from a function ‘f’(x,y) and added to a picture ‘pic’: bounds image(picture pic=currentpicture, real f(real, real), range range=Full, pair initial, pair final, int nx=ngraph, int ny=nx, pen[] palette, int divs=0, bool antialias=false) The function ‘f’ will be sampled at ‘nx’ and ‘ny’ evenly spaced points over a rectangle defined by the points ‘initial’ and ‘final’, respecting the current graphical scaling of ‘pic’. The color space is scaled according to the z axis scaling (*note automatic scaling::). If ‘divs’ > 1, the palette is quantized to ‘divs’-1 values. A ‘bounds’ structure for the function values is returned: struct bounds { real min; real max; // Possible tick intervals: int[] divisor; } This information can be used for generating an optional palette bar. The palette color space corresponds to a range of values specified by the argument ‘range’, which can be ‘Full’, ‘Automatic’, or an explicit range ‘Range(real min, real max)’. (The type ‘range’ is defined in ‘palette.asy’.) Here ‘Full’ specifies a range varying from the minimum to maximum values of the function over the sampling interval, while ‘Automatic’ selects "nice" limits. The examples ‘fillcontour.asy’ and ‘imagecontour.asy’ illustrate how level sets (contour lines) can be drawn on a color density plot (*note contour::). A color density plot can also be generated from an explicit real[][] array ‘data’: bounds image(picture pic=currentpicture, real[][] f, range range=Full, pair initial, pair final, pen[] palette, int divs=0, bool transpose=(initial.x < final.x && initial.y < final.y), bool copy=true, bool antialias=false); If the initial point is to the left and below the final point, by default the array indices are interpreted according to the Cartesian convention (first index: x, second index: y) rather than the usual matrix convention (first index: -y, second index: x). To construct an image from an array of irregularly spaced points and an array of values ‘f’ at these points, use one of the routines bounds image(picture pic=currentpicture, pair[] z, real[] f, range range=Full, pen[] palette) bounds image(picture pic=currentpicture, real[] x, real[] y, real[] f, range range=Full, pen[] palette) An optionally labelled palette bar may be generated with the routine void palette(picture pic=currentpicture, Label L="", bounds bounds, pair initial, pair final, axis axis=Right, pen[] palette, pen p=currentpen, paletteticks ticks=PaletteTicks, bool copy=true, bool antialias=false); The color space of ‘palette’ is taken to be over bounds ‘bounds’ with scaling given by the z scaling of ‘pic’. The palette orientation is specified by ‘axis’, which may be one of ‘Right’, ‘Left’, ‘Top’, or ‘Bottom’. The bar is drawn over the rectangle from ‘initial’ to ‘final’. The argument ‘paletteticks’ is a special tick type (*note ticks::) that takes the following arguments: paletteticks PaletteTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, pen pTick=nullpen, pen ptick=nullpen); The image and palette bar can be fit to a frame and added and optionally aligned to a picture at the desired location: size(12cm,12cm); import graph; import palette; int n=256; real ninv=2pi/n; real[][] v=new real[n][n]; for(int i=0; i < n; ++i) for(int j=0; j < n; ++j) v[i][j]=sin(i*ninv)*cos(j*ninv); pen[] Palette=BWRainbow(); picture bar; bounds range=image(v,(0,0),(1,1),Palette); palette(bar,"$A$",range,(0,0),(0.5cm,8cm),Right,Palette, PaletteTicks("$%+#.1f$")); add(bar.fit(),point(E),30E); [./image] Here is an example that uses logarithmic scaling of the function values: import graph; import palette; size(10cm,10cm,IgnoreAspect); real f(real x, real y) { return 0.9*pow10(2*sin(x/5+2*y^0.25)) + 0.1*(1+cos(10*log(y))); } scale(Linear,Log,Log); pen[] Palette=BWRainbow(); bounds range=image(f,Automatic,(0,1),(100,100),nx=200,Palette); xaxis("$x$",BottomTop,LeftTicks,above=true); yaxis("$y$",LeftRight,RightTicks,above=true); palette("$f(x,y)$",range,(0,200),(100,250),Top,Palette, PaletteTicks(ptick=linewidth(0.5*linewidth()))); [./logimage] One can also draw an image directly from a two-dimensional pen array or a function ‘pen f(int, int)’: void image(picture pic=currentpicture, pen[][] data, pair initial, pair final, bool transpose=(initial.x < final.x && initial.y < final.y), bool copy=true, bool antialias=false); void image(picture pic=currentpicture, pen f(int, int), int width, int height, pair initial, pair final, bool transpose=(initial.x < final.x && initial.y < final.y), bool antialias=false); as illustrated in the following examples: size(200); import palette; int n=256; real ninv=2pi/n; pen[][] v=new pen[n][n]; for(int i=0; i < n; ++i) for(int j=0; j < n; ++j) v[i][j]=rgb(0.5*(1+sin(i*ninv)),0.5*(1+cos(j*ninv)),0); image(v,(0,0),(1,1)); [./penimage] import palette; size(200); real fracpart(real x) {return (x-floor(x));} pair pws(pair z) { pair w=(z+exp(pi*I/5)/0.9)/(1+z/0.9*exp(-pi*I/5)); return exp(w)*(w^3-0.5*I); } int N=512; pair a=(-1,-1); pair b=(0.5,0.5); real dx=(b-a).x/N; real dy=(b-a).y/N; pen f(int u, int v) { pair z=a+(u*dx,v*dy); pair w=pws(z); real phase=degrees(w,warn=false); real modulus=w == 0 ? 0: fracpart(log(abs(w))); return hsv(phase,1,sqrt(modulus)); } image(f,N,N,(0,0),(300,300),antialias=true); [./penfunctionimage] For convenience, the module ‘palette’ also defines functions that may be used to construct a pen array from a given function and palette: pen[] palette(real[] f, pen[] palette); pen[][] palette(real[][] f, pen[] palette);  File: asymptote.info, Node: three, Next: obj, Prev: palette, Up: Base modules 8.29 ‘three’ ============ This module fully extends the notion of guides and paths in ‘Asymptote’ to three dimensions. It introduces the new types guide3, path3, and surface. Guides in three dimensions are specified with the same syntax as in two dimensions except that triples ‘(x,y,z)’ are used in place of pairs ‘(x,y)’ for the nodes and direction specifiers. This generalization of John Hobby's spline algorithm is shape-invariant under three-dimensional rotation, scaling, and shifting, and reduces in the planar case to the two-dimensional algorithm used in ‘Asymptote’, ‘MetaPost’, and ‘MetaFont’ [see J. C. Bowman, Proceedings in Applied Mathematics and Mechanics, 7:1, 2010021-2010022 (2007)]. For example, a unit circle in the XY plane may be filled and drawn like this: import three; size(100); path3 g=(1,0,0)..(0,1,0)..(-1,0,0)..(0,-1,0)..cycle; draw(g); draw(O--Z,red+dashed,Arrow3); draw(((-1,-1,0)--(1,-1,0)--(1,1,0)--(-1,1,0)--cycle)); dot(g,red); [./unitcircle3] and then distorted into a saddle: import three; size(100,0); path3 g=(1,0,0)..(0,1,1)..(-1,0,0)..(0,-1,1)..cycle; draw(g); draw(((-1,-1,0)--(1,-1,0)--(1,1,0)--(-1,1,0)--cycle)); dot(g,red); [./saddle] Module ‘three’ provides constructors for converting two-dimensional paths to three-dimensional ones, and vice-versa: path3 path3(path p, triple plane(pair)=XYplane); path path(path3 p, pair P(triple)=xypart); A Bezier surface, the natural two-dimensional generalization of Bezier curves, is defined in ‘three_surface.asy’ as a structure containing an array of Bezier patches. Surfaces may drawn with one of the routines void draw(picture pic=currentpicture, surface s, int nu=1, int nv=1, material surfacepen=currentpen, pen meshpen=nullpen, light light=currentlight, light meshlight=nolight, string name="", render render=defaultrender); void draw(picture pic=currentpicture, surface s, int nu=1, int nv=1, material[] surfacepen, pen meshpen, light light=currentlight, light meshlight=nolight, string name="", render render=defaultrender); void draw(picture pic=currentpicture, surface s, int nu=1, int nv=1, material[] surfacepen, pen[] meshpen=nullpens, light light=currentlight, light meshlight=nolight, string name="", render render=defaultrender); The parameters ‘nu’ and ‘nv’ specify the number of subdivisions for drawing optional mesh lines for each Bezier patch. The optional ‘name’ parameter is used as a prefix for naming the surface patches in the PRC model tree. Here material is a structure defined in ‘three_light.asy’: struct material { pen[] p; // diffusepen,emissivepen,specularpen real opacity; real shininess; real metallic; real fresnel0; } These material properties are used to implement physically based rendering (PBR) using light properties defined in ‘plain_prethree.asy’ and ‘three_light.asy’: struct light { real[][] diffuse; real[][] specular; pen background=nullpen; // Background color of the canvas. real specularfactor; triple[] position; // Only directional lights are currently implemented. } light Viewport=light(specularfactor=3,(0.25,-0.25,1)); light White=light(new pen[] {rgb(0.38,0.38,0.45),rgb(0.6,0.6,0.67), rgb(0.5,0.5,0.57)},specularfactor=3, new triple[] {(-2,-1.5,-0.5),(2,1.1,-2.5),(-0.5,0,2)}); light Headlamp=light(gray(0.8),specular=gray(0.7), specularfactor=3,dir(42,48)); currentlight=Headlamp; light nolight; The ‘currentlight.background’ (or ‘background’ member of the specified ‘light’) can be used to set the background color for 2D (or 3D) images. The default background is white for ‘HTML’ images and transparent for all other formats. One can request a completely transparent background for 3D ‘WebGL’ images with ‘currentlight.background=black+opacity(0.0);’ ‘render’ A function ‘render()’ may be assigned to the optional ‘render’ parameter allows one to pass specialized rendering options to the surface drawing routines, via arguments such as: bool tessellate; // use tessellated mesh to store straight patches real margin; // shrink amount for rendered OpenGL viewport, in bp. bool partnames; // assign part name indices to compound objects bool defaultnames; // assign default names to unnamed objects interaction interaction; // billboard interaction mode along with the rendering parameters for the legacy PRC format described in ‘three.asy’. Asymptote also supports image-based lighting with the setting ‘settings.ibl=true’. This uses pre-rendered EXR images from the directory specified by ‘-imageDir’ (which defaults to ‘ibl’) or, for ‘WebGL’ rendering, the URL specified by ‘-imageURL’ (which defaults to ). Additional rendered images can be generated on an ‘NVIDIA’ GPU using the ‘reflect’ program in the ‘cudareflect’ subdirectory of the ‘Asymptote’ source directory. Sample Bezier surfaces are contained in the example files ‘BezierSurface.asy’, ‘teapot.asy’, ‘teapotIBL.asy’, and ‘parametricsurface.asy’. The structure ‘render’ contains specialized rendering options documented at the beginning of module ‘three’. The examples ‘elevation.asy’ and ‘sphericalharmonic.asy’ illustrate how to draw a surface with patch-dependent colors. The examples ‘vertexshading.asy’ and ‘smoothelevation.asy’ illustrate vertex-dependent colors, which are supported by ‘Asymptote’'s native ‘OpenGL’/‘WebGL’ renderers and the two-dimensional vector output format (‘settings.render=0’). Since the legacy PRC output format does not support vertex shading of Bezier surfaces, PRC patches are shaded with the mean of the four vertex colors. A surface can be constructed from a cyclic ‘path3’ with the constructor surface surface(path3 external, triple[] internal=new triple[], pen[] colors=new pen[], bool3 planar=default); and then filled: draw(surface(unitsquare3,new triple[] {X,Y,Z,O}),red); draw(surface(O--X{Y}..Y{-X}--cycle,new triple[] {Z}),red); draw(surface(path3(polygon(5))),red,nolight); draw(surface(unitcircle3),red,nolight); draw(surface(unitcircle3,new pen[] {red,green,blue,black}),nolight); The first example draws a Bezier patch and the second example draws a Bezier triangle. The third and fourth examples are planar surfaces. The last example constructs a patch with vertex-specific colors. A three-dimensional planar surface in the plane ‘plane’ can be constructed from a two-dimensional cyclic path ‘g’ with the constructor surface surface(path p, triple plane(pair)=XYplane); and then filled: draw(surface((0,0)--E+2N--2E--E+N..0.2E..cycle),red); Planar Bezier surfaces patches are constructed using Orest Shardt's ‘bezulate’ routine, which decomposes (possibly nonsimply connected) regions bounded (according to the ‘zerowinding’ fill rule) by simple cyclic paths (intersecting only at the endpoints) into subregions bounded by cyclic paths of length ‘4’ or less. A more efficient routine also exists for drawing tessellations composed of many 3D triangles, with specified vertices, and optional normals or vertex colors: void draw(picture pic=currentpicture, triple[] v, int[][] vi, triple[] n={}, int[][] ni=vi, material m=currentpen, pen[] p={}, int[][] pi=vi, light light=currentlight); Here, the triple array ‘v’ lists the (typically distinct) vertices, while the array ‘vi’ contains integer arrays of length 3 containing the indices of the elements in ‘v’ that form the vertices of each triangle. Similarly, the arguments ‘n’ and ‘ni’ contain optional normal data and ‘p’ and ‘pi’ contain optional pen vertex data. If more than one normal or pen is specified for a vertex, the last one is used. An example of this tessellation facility is given in ‘triangles.asy’. Arbitrary thick three-dimensional curves and line caps (which the ‘OpenGL’ standard does not require implementations to provide) are constructed with tube tube(path3 p, real width, render render=defaultrender); this returns a tube structure representing a tube of diameter ‘width’ centered approximately on ‘g’. The tube structure consists of a surface ‘s’ and the actual tube center, path3 ‘center’. Drawing thick lines as tubes can be slow to render, especially with the ‘Adobe Reader’ renderer. The setting ‘thick=false’ can be used to disable this feature and force all lines to be drawn with ‘linewidth(0)’ (one pixel wide, regardless of the resolution). By default, mesh and contour lines in three-dimensions are always drawn thin, unless an explicit line width is given in the pen parameter or the setting ‘thin’ is set to ‘false’. The pens ‘thin()’ and ‘thick()’ defined in ‘plain_pens.asy’ can also be used to override these defaults for specific draw commands. There are six choices for viewing 3D ‘Asymptote’ output: 1. Use the native ‘Asymptote’ adaptive ‘OpenGL’-based renderer (with the command-line option ‘-V’ and the default settings ‘outformat=""’ and ‘render=-1’). On ‘UNIX’ systems with graphics support for multisampling, the sample width can be controlled with the setting ‘multisample’. The ratio of physical to logical screen pixels can be specified with the setting ‘devicepixelratio’. An initial screen position can be specified with the pair setting ‘position’, where negative values are interpreted as relative to the corresponding maximum screen dimension. The default settings import settings; leftbutton=new string[] {"rotate","zoom","shift","pan"}; middlebutton=new string[] {""}; rightbutton=new string[] {"zoom","rotateX","rotateY","rotateZ"}; wheelup=new string[] {"zoomin"}; wheeldown=new string[] {"zoomout"}; bind the mouse buttons as follows: • Left: rotate • Shift Left: zoom • Ctrl Left: shift viewport • Alt Left: pan • Wheel Up: zoom in • Wheel Down: zoom out • Right: zoom • Shift Right: rotate about the X axis • Ctrl Right: rotate about the Y axis • Alt Right: rotate about the Z axis The keyboard bindings are: • h: home • f: toggle fitscreen • x: spin about the X axis • y: spin about the Y axis • z: spin about the Z axis • s: stop spinning • m: rendering mode (solid/patch/mesh) • e: export • c: show camera parameters • p: play animation • r: reverse animation • : step animation • +: expand • =: expand • >: expand • -: shrink • _: shrink • <: shrink • q: exit • Ctrl-q: exit 2. Generate ‘WebGL’ interactive vector graphics output with the the command-line option and ‘-f html’ (or the setting ‘outformat="html"’). The resulting 3D HTML file can then be viewed directly in any modern desktop or mobile browser, or even embedded within another web page: Normally, ‘WebGL’ files generated by ‘Asymptote’ are dynamically remeshed to fit the browser window dimensions. However, the setting ‘absolute=true’ can be used to force the image to be rendered at its designed size (accounting for multiple device pixels per ‘css’ pixel). For specialized applications, the setting ‘keys=true’ can be used to generate an identifying key immediately before the ‘WebGL’ code for each generated object. The default key, the ‘"line:column"’ of the associated function call of the top-level source code, can be overwritten by adding ‘KEY="x"’ as the first argument of the function call, where ‘x’ represents user-supplied text. The interactive ‘WebGL’ files produced by ‘Asymptote’ use the default mouse and (many of the same) key bindings as the ‘OpenGL’ renderer. Zooming via the mouse wheel of a ‘WebGL’ image embedded within another page is disabled until the image is activated by a click or touch event and will remain enabled until the ‘ESC’ key is pressed. By default, viewing the 3D HTML files generated by Asymptote requires network access to download the ‘AsyGL’ rendering library, which is normally cached by the browser for future use. However, the setting ‘offline=true’ can be used to embed this small (about 48kB) library within a stand-alone HTML file that can be viewed offline. 3. Render the scene to a specified rasterized format ‘outformat’ at the resolution of ‘n’ pixels per ‘bp’, as specified by the setting ‘render=n’. A negative value of ‘n’ is interpreted as ‘|2n|’ for EPS and PDF formats and ‘|n|’ for other formats. The default value of ‘render’ is -1. By default, the scene is internally rendered at twice the specified resolution; this can be disabled by setting ‘antialias=1’. High resolution rendering is done by tiling the image. If your graphics card allows it, the rendering can be made more efficient by increasing the maximum tile size ‘maxtile’ to your screen dimensions (indicated by ‘maxtile=(0,0)’. If your video card generates unwanted black stripes in the output, try setting the horizontal and vertical components of ‘maxtiles’ to something less than your screen dimensions. The tile size is also limited by the setting ‘maxviewport’, which restricts the maximum width and height of the viewport. Some graphics drivers support batch mode (‘-noV’) rendering in an iconified window; this can be enabled with the setting ‘iconify=true’. 4. Embed the 3D legacy PRC format in a PDF file and view the resulting PDF file with version ‘9.0’ or later of ‘Adobe Reader’. This requires ‘settings.outformat="pdf"’ and ‘settings.prc=true’, which can be specified by the command-line options ‘-f pdf’ and ‘-f prc’, put in the ‘Asymptote’ configuration file (*note configuration file::), or specified in the script before module ‘three’ (or ‘graph3’) is imported. The ‘media9’ LaTeX package is also required (*note embed::). The example ‘100d.asy’ illustrates how one can generate a list of predefined views (see ‘100d.views’). A stationary preview image with a resolution of ‘n’ pixels per ‘bp’ can be embedded with the setting ‘render=n’; this allows the file to be viewed with other ‘PDF’ viewers. Alternatively, the file ‘externalprc.tex’ illustrates how the resulting PRC and rendered image files can be extracted and processed in a separate ‘LaTeX’ file. However, see *note LaTeX usage:: for an easier way to embed three-dimensional ‘Asymptote’ pictures within ‘LaTeX’. For specialized applications where only the raw PRC file is required, specify ‘settings.outformat="prc"’. The PRC specification is available from 5. Output a V3D portable compressed vector graphics file using ‘settings.outformat="v3d"’, which can be viewed with an external viewer or converted to an alternate 3D format using the Python ‘pyv3d’ library. V3D content can be automatically embedded within a PDF file using the options ‘settings.outformat="pdf"’ and ‘settings.v3d=true’. Alternatively, a V3D file ‘file.v3d’ may be manually embedded within a PDF file using the ‘media9’ ‘LaTeX’ package: \includemedia[noplaybutton,width=100pt,height=200pt]{}{file.v3d}% An online ‘Javascript’-based V3D-aware ‘PDF’ viewer is available at . The V3D specification and the ‘pyv3d’ library are available at . A V3D file ‘file.v3d’ may be imported and viewed by ‘Asymptote’ either by specifying ‘file.v3d’ on the command line asy -V file.v3d or using the ‘v3d’ module and ‘importv3d’ function in interactive mode (or within an ‘Asymptote’ file): import v3d; importv3d("file.v3d"); 6. Project the scene to a two-dimensional vector (EPS or PDF) format with ‘render=0’. Only limited support for hidden surface removal, lighting, and transparency is available with this approach (*note PostScript3D::). Automatic picture sizing in three dimensions is accomplished with double deferred drawing. The maximal desired dimensions of the scene in each of the three dimensions can optionally be specified with the routine void size3(picture pic=currentpicture, real x, real y=x, real z=y, bool keepAspect=pic.keepAspect); A simplex linear programming problem is then solved to produce a 3D version of a frame (actually implemented as a 3D picture). The result is then fit with another application of deferred drawing to the viewport dimensions corresponding to the usual two-dimensional picture ‘size’ parameters. The global pair ‘viewportmargin’ may be used to add horizontal and vertical margins to the viewport dimensions. Alternatively, a minimum ‘viewportsize’ may be specified. A 3D picture ‘pic’ can be explicitly fit to a 3D frame by calling frame pic.fit3(projection P=currentprojection); and then added to picture ‘dest’ about ‘position’ with void add(picture dest=currentpicture, frame src, triple position=(0,0,0)); For convenience, the ‘three’ module defines ‘O=(0,0,0)’, ‘X=(1,0,0)’, ‘Y=(0,1,0)’, and ‘Z=(0,0,1)’, along with a unitcircle in the XY plane: path3 unitcircle3=X..Y..-X..-Y..cycle; A general (approximate) circle can be drawn perpendicular to the direction ‘normal’ with the routine path3 circle(triple c, real r, triple normal=Z); A circular arc centered at ‘c’ with radius ‘r’ from ‘c+r*dir(theta1,phi1)’ to ‘c+r*dir(theta2,phi2)’, drawing counterclockwise relative to the normal vector ‘cross(dir(theta1,phi1),dir(theta2,phi2))’ if ‘theta2 > theta1’ or if ‘theta2 == theta1’ and ‘phi2 >= phi1’, can be constructed with path3 arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=O); The normal must be explicitly specified if ‘c’ and the endpoints are colinear. If ‘r’ < 0, the complementary arc of radius ‘|r|’ is constructed. For convenience, an arc centered at ‘c’ from triple ‘v1’ to ‘v2’ (assuming ‘|v2-c|=|v1-c|’) in the direction CCW (counter-clockwise) or CW (clockwise) may also be constructed with path3 arc(triple c, triple v1, triple v2, triple normal=O, bool direction=CCW); When high accuracy is needed, the routines ‘Circle’ and ‘Arc’ defined in ‘graph3’ may be used instead. See *note GaussianSurface:: for an example of a three-dimensional circular arc. The representation ‘O--O+u--O+u+v--O+v--cycle’ of the plane passing through point ‘O’ with normal ‘cross(u,v)’ is returned by path3 plane(triple u, triple v, triple O=O); A three-dimensional box with opposite vertices at triples ‘v1’ and ‘v2’ may be drawn with the function path3[] box(triple v1, triple v2); For example, a unit box is predefined as path3[] unitbox=box(O,(1,1,1)); ‘Asymptote’ also provides optimized definitions for the three-dimensional paths ‘unitsquare3’ and ‘unitcircle3’, along with the surfaces ‘unitdisk’, ‘unitplane’, ‘unitcube’, ‘unitcylinder’, ‘unitcone’, ‘unitsolidcone’, ‘unitfrustum(real t1, real t2)’, ‘unitsphere’, and ‘unithemisphere’. These projections to two dimensions are predefined: ‘oblique’ ‘oblique(real angle)’ The point ‘(x,y,z)’ is projected to ‘(x-0.5z,y-0.5z)’. If an optional real argument is given, the negative z axis is drawn at this angle in degrees. The projection ‘obliqueZ’ is a synonym for ‘oblique’. ‘obliqueX’ ‘obliqueX(real angle)’ The point ‘(x,y,z)’ is projected to ‘(y-0.5x,z-0.5x)’. If an optional real argument is given, the negative x axis is drawn at this angle in degrees. ‘obliqueY’ ‘obliqueY(real angle)’ The point ‘(x,y,z)’ is projected to ‘(x+0.5y,z+0.5y)’. If an optional real argument is given, the positive y axis is drawn at this angle in degrees. ‘orthographic(triple camera, triple up=Z, triple target=O, real zoom=1, pair viewportshift=0, bool showtarget=true, bool center=true)’ This projects from three to two dimensions using the view as seen at a point infinitely far away in the direction ‘unit(camera)’, orienting the camera so that, if possible, the vector ‘up’ points upwards. Parallel lines are projected to parallel lines. The bounding volume is expanded to include ‘target’ if ‘showtarget=true’. If ‘center=true’, the target will be adjusted to the center of the bounding volume. ‘orthographic(real x, real y, real z, triple up=Z, triple target=O, real zoom=1, pair viewportshift=0, bool showtarget=true, bool center=true)’ This is equivalent to orthographic((x,y,z),up,target,zoom,viewportshift,showtarget,center) The routine triple camera(real alpha, real beta); can be used to compute the camera position with the x axis below the horizontal at angle ‘alpha’, the y axis below the horizontal at angle ‘beta’, and the z axis up. ‘perspective(triple camera, triple up=Z, triple target=O, real zoom=1, real angle=0, pair viewportshift=0, bool showtarget=true, bool autoadjust=true, bool center=autoadjust)’ This projects from three to two dimensions, taking account of perspective, as seen from the location ‘camera’ looking at ‘target’, orienting the camera so that, if possible, the vector ‘up’ points upwards. If ‘autoadjust=true’, the camera will automatically be adjusted to lie outside the bounding volume for all possible interactive rotations about ‘target’. If ‘center=true’, the target will be adjusted to the center of the bounding volume. ‘perspective(real x, real y, real z, triple up=Z, triple target=O, real zoom=1, real angle=0, pair viewportshift=0, bool showtarget=true, bool autoadjust=true, bool center=autoadjust)’ This is equivalent to perspective((x,y,z),up,target,zoom,angle,viewportshift,showtarget, autoadjust,center) The default projection, ‘currentprojection’, is initially set to ‘perspective(5,4,2)’. We also define standard orthographic views used in technical drawing: projection LeftView=orthographic(-X,showtarget=true); projection RightView=orthographic(X,showtarget=true); projection FrontView=orthographic(-Y,showtarget=true); projection BackView=orthographic(Y,showtarget=true); projection BottomView=orthographic(-Z,showtarget=true); projection TopView=orthographic(Z,showtarget=true); The function void addViews(picture dest=currentpicture, picture src, projection[][] views=SixViewsUS, bool group=true, filltype filltype=NoFill); adds to picture ‘dest’ an array of views of picture ‘src’ using the layout projection[][] ‘views’. The default layout ‘SixViewsUS’ aligns the projection ‘FrontView’ below ‘TopView’ and above ‘BottomView’, to the right of ‘LeftView’ and left of ‘RightView’ and ‘BackView’. The predefined layouts are: projection[][] ThreeViewsUS={{TopView}, {FrontView,RightView}}; projection[][] SixViewsUS={{null,TopView}, {LeftView,FrontView,RightView,BackView}, {null,BottomView}}; projection[][] ThreeViewsFR={{RightView,FrontView}, {null,TopView}}; projection[][] SixViewsFR={{null,BottomView}, {RightView,FrontView,LeftView,BackView}, {null,TopView}}; projection[][] ThreeViews={{FrontView,TopView,RightView}}; projection[][] SixViews={{FrontView,TopView,RightView}, {BackView,BottomView,LeftView}}; A triple or path3 can be projected to a pair or path, with ‘project(triple, projection P=currentprojection)’ or ‘project(path3, projection P=currentprojection)’. It is occasionally useful to be able to invert a projection, sending a pair ‘z’ onto the plane perpendicular to ‘normal’ and passing through ‘point’: triple invert(pair z, triple normal, triple point, projection P=currentprojection); A pair ‘z’ on the projection plane can be inverted to a triple with the routine triple invert(pair z, projection P=currentprojection); A pair direction ‘dir’ on the projection plane can be inverted to a triple direction relative to a point ‘v’ with the routine triple invert(pair dir, triple v, projection P=currentprojection). Three-dimensional objects may be transformed with one of the following built-in transform3 types (the identity transformation is ‘identity4’): ‘shift(triple v)’ translates by the triple ‘v’; ‘xscale3(real x)’ scales by ‘x’ in the x direction; ‘yscale3(real y)’ scales by ‘y’ in the y direction; ‘zscale3(real z)’ scales by ‘z’ in the z direction; ‘scale3(real s)’ scales by ‘s’ in the x, y, and z directions; ‘scale(real x, real y, real z)’ scales by ‘x’ in the x direction, by ‘y’ in the y direction, and by ‘z’ in the z direction; ‘rotate(real angle, triple v)’ rotates by ‘angle’ in degrees about the axis ‘O--v’; ‘rotate(real angle, triple u, triple v)’ rotates by ‘angle’ in degrees about the axis ‘u--v’; ‘reflect(triple u, triple v, triple w)’ reflects about the plane through ‘u’, ‘v’, and ‘w’. When not multiplied on the left by a transform3, three-dimensional TeX Labels are drawn as Bezier surfaces directly on the projection plane: void label(picture pic=currentpicture, Label L, triple position, align align=NoAlign, pen p=currentpen, light light=nolight, string name="", render render=defaultrender, interaction interaction= settings.autobillboard ? Billboard : Embedded) The optional ‘name’ parameter is used as a prefix for naming the label patches in the PRC model tree. The default interaction is ‘Billboard’, which means that labels are rotated interactively so that they always face the camera. The interaction ‘Embedded’ means that the label interacts as a normal ‘3D’ surface, as illustrated in the example ‘billboard.asy’. Alternatively, a label can be transformed from the ‘XY’ plane by an explicit transform3 or mapped to a specified two-dimensional plane with the predefined transform3 types ‘XY’, ‘YZ’, ‘ZX’, ‘YX’, ‘ZY’, ‘ZX’. There are also modified versions of these transforms that take an optional argument ‘projection P=currentprojection’ that rotate and/or flip the label so that it is more readable from the initial viewpoint. A transform3 that projects in the direction ‘dir’ onto the plane with normal ‘n’ through point ‘O’ is returned by transform3 planeproject(triple n, triple O=O, triple dir=n); One can use triple normal(path3 p); to find the unit normal vector to a planar three-dimensional path ‘p’. As illustrated in the example ‘planeproject.asy’, a transform3 that projects in the direction ‘dir’ onto the plane defined by a planar path ‘p’ is returned by transform3 planeproject(path3 p, triple dir=normal(p)); The functions surface extrude(path p, triple axis=Z); surface extrude(Label L, triple axis=Z); return the surface obtained by extruding path ‘p’ or Label ‘L’ along ‘axis’. Three-dimensional versions of the path functions ‘length’, ‘size’, ‘point’, ‘dir’, ‘accel’, ‘radius’, ‘precontrol’, ‘postcontrol’, ‘arclength’, ‘arctime’, ‘reverse’, ‘subpath’, ‘intersect’, ‘intersections’, ‘intersectionpoint’, ‘intersectionpoints’, ‘min’, ‘max’, ‘cyclic’, and ‘straight’ are also defined. The routine real[] intersect(path3 p, surface s, real fuzz=-1); returns a real array of length 3 containing the intersection times, if any, of a path ‘p’ with a surface ‘s’. The routine real[][] intersections(path3 p, surface s, real fuzz=-1); returns all (unless there are infinitely many) intersection times of a path ‘p’ with a surface ‘s’ as a sorted array of real arrays of length 3, and triple[] intersectionpoints(path3 p, surface s, real fuzz=-1); returns the corresponding intersection points. Here, the computations are performed to the absolute error specified by ‘fuzz’, or if ‘fuzz < 0’, to machine precision. The routine real orient(triple a, triple b, triple c, triple d); is a numerically robust computation of ‘dot(cross(a-d,b-d),c-d)’, which is the determinant |a.x a.y a.z 1| |b.x b.y b.z 1| |c.x c.y c.z 1| |d.x d.y d.z 1| The result is negative (positive) if ‘a’, ‘b’, ‘c’ appear in counterclockwise (clockwise) order when viewed from ‘d’ or zero if all four points are coplanar. The routine real insphere(triple a, triple b, triple c, triple d, triple e); returns a positive (negative) value if ‘e’ lies inside (outside) the sphere passing through points ‘a,b,c,d’ oriented so that ‘dot(cross(a-d,b-d),c-d)’ is positive, or zero if all five points are cospherical. The value returned is the determinant |a.x a.y a.z a.x^2+a.y^2+a.z^2 1| |b.x b.y b.z b.x^2+b.y^2+b.z^2 1| |c.x c.y c.z c.x^2+c.y^2+c.z^2 1| |d.x d.y d.z d.x^2+d.y^2+d.z^2 1| |e.x e.y e.z e.x^2+e.y^2+e.z^2 1| Here is an example showing all five guide3 connectors: import graph3; size(200); currentprojection=orthographic(500,-500,500); triple[] z=new triple[10]; z[0]=(0,100,0); z[1]=(50,0,0); z[2]=(180,0,0); for(int n=3; n <= 9; ++n) z[n]=z[n-3]+(200,0,0); path3 p=z[0]..z[1]---z[2]::{Y}z[3] &z[3]..z[4]--z[5]::{Y}z[6] &z[6]::z[7]---z[8]..{Y}z[9]; draw(p,grey+linewidth(4mm),currentlight); xaxis3(Label(XY()*"$x$",align=-3Y),red,above=true); yaxis3(Label(XY()*"$y$",align=-3X),red,above=true); [./join3] Three-dimensional versions of bars or arrows can be drawn with one of the specifiers ‘None’, ‘Blank’, ‘BeginBar3’, ‘EndBar3’ (or equivalently ‘Bar3’), ‘Bars3’, ‘BeginArrow3’, ‘MidArrow3’, ‘EndArrow3’ (or equivalently ‘Arrow3’), ‘Arrows3’, ‘BeginArcArrow3’, ‘EndArcArrow3’ (or equivalently ‘ArcArrow3’), ‘MidArcArrow3’, and ‘ArcArrows3’. Three-dimensional bars accept the optional arguments ‘(real size=0, triple dir=O)’. If ‘size=O’, the default bar length is used; if ‘dir=O’, the bar is drawn perpendicular to the path and the initial viewing direction. The predefined three-dimensional arrowhead styles are ‘DefaultHead3’, ‘HookHead3’, ‘TeXHead3’. Versions of the two-dimensional arrowheads lifted to three-dimensional space and aligned according to the initial viewpoint (or an optionally specified ‘normal’ vector) are also defined: ‘DefaultHead2(triple normal=O)’, ‘HookHead2(triple normal=O)’, ‘TeXHead2(triple normal=O)’. These are illustrated in the example ‘arrows3.asy’. Module ‘three’ also defines the three-dimensional margins ‘NoMargin3’, ‘BeginMargin3’, ‘EndMargin3’, ‘Margin3’, ‘Margins3’, ‘BeginPenMargin2’, ‘EndPenMargin2’, ‘PenMargin2’, ‘PenMargins2’, ‘BeginPenMargin3’, ‘EndPenMargin3’, ‘PenMargin3’, ‘PenMargins3’, ‘BeginDotMargin3’, ‘EndDotMargin3’, ‘DotMargin3’, ‘DotMargins3’, ‘Margin3’, and ‘TrueMargin3’. The routine void pixel(picture pic=currentpicture, triple v, pen p=currentpen, real width=1); can be used to draw on picture ‘pic’ a pixel of width ‘width’ at position ‘v’ using pen ‘p’. Further three-dimensional examples are provided in the files ‘near_earth.asy’, ‘conicurv.asy’, and (in the ‘animations’ subdirectory) ‘cube.asy’. Limited support for projected vector graphics (effectively three-dimensional nonrendered ‘PostScript’) is available with the setting ‘render=0’. This currently only works for piecewise planar surfaces, such as those produced by the parametric ‘surface’ routines in the ‘graph3’ module. Surfaces produced by the ‘solids’ module will also be properly rendered if the parameter ‘nslices’ is sufficiently large. In the module ‘bsp’, hidden surface removal of planar pictures is implemented using a binary space partition and picture clipping. A planar path is first converted to a structure ‘face’ derived from ‘picture’. A ‘face’ may be given to a two-dimensional drawing routine in place of any ‘picture’ argument. An array of such faces may then be drawn, removing hidden surfaces: void add(picture pic=currentpicture, face[] faces, projection P=currentprojection); Labels may be projected to two dimensions, using projection ‘P’, onto the plane passing through point ‘O’ with normal ‘cross(u,v)’ by multiplying it on the left by the transform transform transform(triple u, triple v, triple O=O, projection P=currentprojection); Here is an example that shows how a binary space partition may be used to draw a two-dimensional vector graphics projection of three orthogonal intersecting planes: size(6cm,0); import bsp; real u=2.5; real v=1; currentprojection=oblique; path3 y=plane((2u,0,0),(0,2v,0),(-u,-v,0)); path3 l=rotate(90,Z)*rotate(90,Y)*y; path3 g=rotate(90,X)*rotate(90,Y)*y; face[] faces; filldraw(faces.push(y),project(y),yellow); filldraw(faces.push(l),project(l),lightgrey); filldraw(faces.push(g),project(g),green); add(faces); [./planes]  File: asymptote.info, Node: obj, Next: graph3, Prev: three, Up: Base modules 8.30 ‘obj’ ========== This module allows one to construct surfaces from simple obj files, as illustrated in the example files ‘galleon.asy’ and ‘triceratops.asy’.  File: asymptote.info, Node: graph3, Next: grid3, Prev: obj, Up: Base modules 8.31 ‘graph3’ ============= This module implements three-dimensional versions of the functions in ‘graph.asy’. To draw an x axis in three dimensions, use the routine void xaxis3(picture pic=currentpicture, Label L="", axis axis=YZZero, real xmin=-infinity, real xmax=infinity, pen p=currentpen, ticks3 ticks=NoTicks3, arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=false, projection P=currentprojection); Analogous routines ‘yaxis’ and ‘zaxis’ can be used to draw y and z axes in three dimensions. There is also a routine for drawing all three axis: void axes3(picture pic=currentpicture, Label xlabel="", Label ylabel="", Label zlabel="", bool extend=false, triple min=(-infinity,-infinity,-infinity), triple max=(infinity,infinity,infinity), pen p=currentpen, arrowbar3 arrow=None, margin3 margin=NoMargin3, projection P=currentprojection); The predefined three-dimensional axis types are axis YZEquals(real y, real z, triple align=O, bool extend=false); axis XZEquals(real x, real z, triple align=O, bool extend=false); axis XYEquals(real x, real y, triple align=O, bool extend=false); axis YZZero(triple align=O, bool extend=false); axis XZZero(triple align=O, bool extend=false); axis XYZero(triple align=O, bool extend=false); axis Bounds(int type=Both, int type2=Both, triple align=O, bool extend=false); The optional ‘align’ parameter to these routines can be used to specify the default axis and tick label alignments. The ‘Bounds’ axis accepts two type parameters, each of which must be one of ‘Min’, ‘Max’, or ‘Both’. These parameters specify which of the four possible three-dimensional bounding box edges should be drawn. The three-dimensional tick options are ‘NoTicks3’, ‘InTicks’, ‘OutTicks’, and ‘InOutTicks’. These specify the tick directions for the ‘Bounds’ axis type; other axis types inherit the direction that would be used for the ‘Bounds(Min,Min)’ axis. Here is an example of a helix and bounding box axes with ticks and axis labels, using orthographic projection: import graph3; size(0,200); size3(200,IgnoreAspect); currentprojection=orthographic(4,6,3); real x(real t) {return cos(2pi*t);} real y(real t) {return sin(2pi*t);} real z(real t) {return t;} path3 p=graph(x,y,z,0,2.7,operator ..); draw(p,Arrow3); scale(true); xaxis3(XZ()*"$x$",Bounds,red,InTicks(Label,2,2)); yaxis3(YZ()*"$y$",Bounds,red,InTicks(beginlabel=false,Label,2,2)); zaxis3(XZ()*"$z$",Bounds,red,InTicks); [./helix] The next example illustrates three-dimensional x, y, and z axes, without autoscaling of the axis limits: import graph3; size(0,200); size3(200,IgnoreAspect); currentprojection=perspective(dir(75,20)); scale(Linear,Linear,Log); xaxis3("$x$",0,1,red,OutTicks(2,2)); yaxis3("$y$",0,1,red,OutTicks(2,2)); zaxis3("$z$",1,30,red,OutTicks(beginlabel=false)); [./axis3] One can also place ticks along a general three-dimensional axis: import graph3; size(0,100); path3 g=yscale3(2)*unitcircle3; currentprojection=perspective(10,10,10); axis(Label("C",position=0,align=15X),g,InTicks(endlabel=false,8,end=false), ticklocate(0,360,new real(real v) { path3 h=O--max(abs(max(g)),abs(min(g)))*dir(90,v); return intersect(g,h)[0];}, new triple(real t) {return cross(dir(g,t),Z);})); [./generalaxis3] Surface plots of matrices and functions over the region ‘box(a,b)’ in the XY plane are also implemented: surface surface(real[][] f, pair a, pair b, bool[][] cond={}); surface surface(real[][] f, pair a, pair b, splinetype xsplinetype, splinetype ysplinetype=xsplinetype, bool[][] cond={}); surface surface(real[][] f, real[] x, real[] y, splinetype xsplinetype=null, splinetype ysplinetype=xsplinetype, bool[][] cond={}) surface surface(triple[][] f, bool[][] cond={}); surface surface(real f(pair z), pair a, pair b, int nx=nmesh, int ny=nx, bool cond(pair z)=null); surface surface(real f(pair z), pair a, pair b, int nx=nmesh, int ny=nx, splinetype xsplinetype, splinetype ysplinetype=xsplinetype, bool cond(pair z)=null); surface surface(triple f(pair z), real[] u, real[] v, splinetype[] usplinetype, splinetype[] vsplinetype=Spline, bool cond(pair z)=null); surface surface(triple f(pair z), pair a, pair b, int nu=nmesh, int nv=nu, bool cond(pair z)=null); surface surface(triple f(pair z), pair a, pair b, int nu=nmesh, int nv=nu, splinetype[] usplinetype, splinetype[] vsplinetype=Spline, bool cond(pair z)=null); The final two versions draw parametric surfaces for a function f(u,v) over the parameter space ‘box(a,b)’, as illustrated in the example ‘parametricsurface.asy’. An optional splinetype ‘Spline’ may be specified. The boolean array or function ‘cond’ can be used to control which surface mesh cells are actually drawn (by default all mesh cells over ‘box(a,b)’ are drawn). One can also construct the surface generated by rotating a path ‘g’ between ‘angle1’ to ‘angle2’ (in degrees) sampled ‘n’ times about the line ‘c--c+axis’: surface surface(triple c, path3 g, triple axis, int n=nslice, real angle1=0, real angle2=360, pen color(int i, real j)=null); The optional argument ‘color(int i, real j)’ can be used to override the surface color at the point obtained by rotating vertex ‘i’ by angle ‘j’ (in degrees). Surface lighting is illustrated in the example files ‘parametricsurface.asy’ and ‘sinc.asy’. Lighting can be disabled by setting ‘light=nolight’, as in this example of a Gaussian surface: import graph3; size(200,0); currentprojection=perspective(10,8,4); real f(pair z) {return 0.5+exp(-abs(z)^2);} draw((-1,-1,0)--(1,-1,0)--(1,1,0)--(-1,1,0)--cycle); draw(arc(0.12Z,0.2,90,60,90,25),ArcArrow3); surface s=surface(f,(-1,-1),(1,1),nx=5,Spline); xaxis3(Label("$x$"),red,Arrow3); yaxis3(Label("$y$"),red,Arrow3); zaxis3(XYZero(extend=true),red,Arrow3); draw(s,lightgray,meshpen=black+thick(),nolight,render(merge=true)); label("$O$",O,-Z+Y,red); [./GaussianSurface] A mesh can be drawn without surface filling by specifying ‘nullpen’ for the surfacepen. A vector field of ‘nu’\times‘nv’ arrows on a parametric surface ‘f’ over ‘box(a,b)’ can be drawn with the routine picture vectorfield(path3 vector(pair v), triple f(pair z), pair a, pair b, int nu=nmesh, int nv=nu, bool truesize=false, real maxlength=truesize ? 0 : maxlength(f,a,b,nu,nv), bool cond(pair z)=null, pen p=currentpen, arrowbar3 arrow=Arrow3, margin3 margin=PenMargin3) as illustrated in the examples ‘vectorfield3.asy’ and ‘vectorfieldsphere.asy’.  File: asymptote.info, Node: grid3, Next: solids, Prev: graph3, Up: Base modules 8.32 ‘grid3’ ============ This module, contributed by Philippe Ivaldi, can be used for drawing 3D grids. Here is an example (further examples can be found in ‘grid3.asy’ and at ): import grid3; size(8cm,0,IgnoreAspect); currentprojection=orthographic(0.5,1,0.5); scale(Linear, Linear, Log); limits((-2,-2,1),(0,2,100)); grid3(XYZgrid); xaxis3(Label("$x$",position=EndPoint,align=S),Bounds(Min,Min), OutTicks()); yaxis3(Label("$y$",position=EndPoint,align=S),Bounds(Min,Min),OutTicks()); zaxis3(Label("$z$",position=EndPoint,align=(-1,0.5)),Bounds(Min,Min), OutTicks(beginlabel=false)); [./grid3xyz]  File: asymptote.info, Node: solids, Next: tube, Prev: grid3, Up: Base modules 8.33 ‘solids’ ============= This solid geometry module defines a structure ‘revolution’ that can be used to fill and draw surfaces of revolution. The following example uses it to display the outline of a circular cylinder of radius 1 with axis ‘O--1.5unit(Y+Z)’ with perspective projection: import solids; size(0,100); revolution r=cylinder(O,1,1.5,Y+Z); draw(r,heavygreen); [./cylinderskeleton] Further illustrations are provided in the example files ‘cylinder.asy’, ‘cones.asy’, ‘hyperboloid.asy’, and ‘torus.asy’. The structure ‘skeleton’ contains the three-dimensional wireframe used to visualize a volume of revolution: struct skeleton { struct curve { path3[] front; path3[] back; } // transverse skeleton (perpendicular to axis of revolution) curve transverse; // longitudinal skeleton (parallel to axis of revolution) curve longitudinal; }  File: asymptote.info, Node: tube, Next: flowchart, Prev: solids, Up: Base modules 8.34 ‘tube’ =========== This module extends the ‘tube’ surfaces constructed in ‘three_arrows.asy’ to arbitrary cross sections, colors, and spine transformations. The routine surface tube(path3 g, coloredpath section, transform T(real)=new transform(real t) {return identity();}, real corner=1, real relstep=0); draws a tube along ‘g’ with cross section ‘section’, after applying the transformation ‘T(t)’ at ‘point(g,t)’. The parameter ‘corner’ controls the number of elementary tubes at the angular points of ‘g’. A nonzero value of ‘relstep’ specifies a fixed relative time step (in the sense of ‘relpoint(g,t)’) to use in constructing elementary tubes along ‘g’. The type ‘coloredpath’ is a generalization of ‘path’ to which a ‘path’ can be cast: struct coloredpath { path p; pen[] pens(real); int colortype=coloredSegments; } Here ‘p’ defines the cross section and the method ‘pens(real t)’ returns an array of pens (interpreted as a cyclic array) used for shading the tube patches at ‘relpoint(g,t)’. If ‘colortype=coloredSegments’, the tube patches are filled as if each segment of the section was colored with the pen returned by ‘pens(t)’, whereas if ‘colortype=coloredNodes’, the tube components are vertex shaded as if the nodes of the section were colored. A ‘coloredpath’ can be constructed with one of the routines: coloredpath coloredpath(path p, pen[] pens(real), int colortype=coloredSegments); coloredpath coloredpath(path p, pen[] pens=new pen[] {currentpen}, int colortype=coloredSegments); coloredpath coloredpath(path p, pen pen(real)); In the second case, the pens are independent of the relative time. In the third case, the array of pens contains only one pen, which depends of the relative time. The casting of ‘path’ to ‘coloredpath’ allows the use of a ‘path’ instead of a ‘coloredpath’; in this case the shading behavior is the default shading behavior for a surface. An example of ‘tube’ is provided in the file ‘trefoilknot.asy’. Further examples can be found at .  File: asymptote.info, Node: flowchart, Next: contour, Prev: tube, Up: Base modules 8.35 ‘flowchart’ ================ This module provides routines for drawing flowcharts. The primary structure is a ‘block’, which represents a single block on the flowchart. The following eight functions return a position on the appropriate edge of the block, given picture transform ‘t’: pair block.top(transform t=identity()); pair block.left(transform t=identity()); pair block.right(transform t=identity()); pair block.bottom(transform t=identity()); pair block.topleft(transform t=identity()); pair block.topright(transform t=identity()); pair block.bottomleft(transform t=identity()); pair block.bottomright(transform t=identity()); To obtain an arbitrary position along the boundary of the block in user coordinates, use: pair block.position(real x, transform t=identity()); The center of the block in user coordinates is stored in ‘block.center’ and the block size in ‘PostScript’ coordinates is given by ‘block.size’. A frame containing the block is returned by frame block.draw(pen p=currentpen); The following block generation routines accept a Label, string, or frame for their object argument: “rectangular block with an optional header (and padding ‘dx’ around header and body):†block rectangle(object header, object body, pair center=(0,0), pen headerpen=mediumgray, pen bodypen=invisible, pen drawpen=currentpen, real dx=3, real minheaderwidth=minblockwidth, real minheaderheight=minblockwidth, real minbodywidth=minblockheight, real minbodyheight=minblockheight); block rectangle(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real dx=3, real minwidth=minblockwidth, real minheight=minblockheight); “parallelogram block:†block parallelogram(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real dx=3, real slope=2, real minwidth=minblockwidth, real minheight=minblockheight); “diamond-shaped block:†block diamond(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real ds=5, real dw=1, real height=20, real minwidth=minblockwidth, real minheight=minblockheight); “circular block:†block circle(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real dr=3, real mindiameter=mincirclediameter); “rectangular block with rounded corners:†block roundrectangle(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real ds=5, real dw=0, real minwidth=minblockwidth, real minheight=minblockheight); “rectangular block with beveled edges:†block bevel(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real dh=5, real dw=5, real minwidth=minblockwidth, real minheight=minblockheight); To draw paths joining the pairs in ‘point’ with right-angled lines, use the routine: path path(pair point[] ... flowdir dir[]); The entries in ‘dir’ identify whether successive segments between the pairs specified by ‘point’ should be drawn in the ‘Horizontal’ or ‘Vertical’ direction. Here is a simple flowchart example (see also the example ‘controlsystem.asy’): size(0,300); import flowchart; block block1=rectangle(Label("Example",magenta), pack(Label("Start:",heavygreen),"",Label("$A:=0$",blue), "$B:=1$"),(-0.5,3),palegreen,paleblue,red); block block2=diamond(Label("Choice?",blue),(0,2),palegreen,red); block block3=roundrectangle("Do something",(-1,1)); block block4=bevel("Don't do something",(1,1)); block block5=circle("End",(0,0)); draw(block1); draw(block2); draw(block3); draw(block4); draw(block5); add(new void(picture pic, transform t) { blockconnector operator --=blockconnector(pic,t); // draw(pic,block1.right(t)--block2.top(t)); block1--Right--Down--Arrow--block2; block2--Label("Yes",0.5,NW)--Left--Down--Arrow--block3; block2--Right--Label("No",0.5,NE)--Down--Arrow--block4; block4--Down--Left--Arrow--block5; block3--Down--Right--Arrow--block5; }); [./flowchartdemo]  File: asymptote.info, Node: contour, Next: contour3, Prev: flowchart, Up: Base modules 8.36 ‘contour’ ============== This module draws contour lines. To construct contours corresponding to the values in a real array ‘c’ for a function ‘f’ on ‘box(a,b)’, use the routine guide[][] contour(real f(real, real), pair a, pair b, real[] c, int nx=ngraph, int ny=nx, interpolate join=operator --, int subsample=1); The integers ‘nx’ and ‘ny’ define the resolution. The default resolution, ‘ngraph x ngraph’ (here ‘ngraph’ defaults to ‘100’) can be increased for greater accuracy. The default interpolation operator is ‘operator --’ (linear). Spline interpolation (‘operator ..’) may produce smoother contours but it can also lead to overshooting. The ‘subsample’ parameter indicates the number of interior points that should be used to sample contours within each ‘1 x 1’ box; the default value of ‘1’ is usually sufficient. To construct contours for an array of data values on a uniform two-dimensional lattice on ‘box(a,b)’, use guide[][] contour(real[][] f, pair a, pair b, real[] c, interpolate join=operator --, int subsample=1); To construct contours for an array of data values on a nonoverlapping regular mesh specified by the two-dimensional array ‘z’, guide[][] contour(pair[][] z, real[][] f, real[] c, interpolate join=operator --, int subsample=1); To construct contours for an array of values ‘f’ specified at irregularly positioned points ‘z’, use the routine guide[][] contour(pair[] z, real[] f, real[] c, interpolate join=operator --); The contours themselves can be drawn with one of the routines void draw(picture pic=currentpicture, Label[] L=new Label[], guide[][] g, pen p=currentpen); void draw(picture pic=currentpicture, Label[] L=new Label[], guide[][] g, pen[] p); The following simple example draws the contour at value ‘1’ for the function z=x^2+y^2, which is a unit circle: import contour; size(75); real f(real a, real b) {return a^2+b^2;} draw(contour(f,(-1,-1),(1,1),new real[] {1})); [./onecontour] The next example draws and labels multiple contours for the function z=x^2-y^2 with the resolution ‘100 x 100’, using a dashed pen for negative contours and a solid pen for positive (and zero) contours: import contour; size(200); real f(real x, real y) {return x^2-y^2;} int n=10; real[] c=new real[n]; for(int i=0; i < n; ++i) c[i]=(i-n/2)/n; pen[] p=sequence(new pen(int i) { return (c[i] >= 0 ? solid : dashed)+fontsize(6pt); },c.length); Label[] Labels=sequence(new Label(int i) { return Label(c[i] != 0 ? (string) c[i] : "",Relative(unitrand()),(0,0), UnFill(1bp)); },c.length); draw(Labels,contour(f,(-1,-1),(1,1),c),p); [./multicontour] The next examples illustrates how contour lines can be drawn on color density images, with and without palette quantization: import graph; import palette; import contour; size(10cm,10cm); pair a=(0,0); pair b=(2pi,2pi); real f(real x, real y) {return cos(x)*sin(y);} int N=200; int Divs=10; int divs=1; int n=Divs*divs; defaultpen(1bp); pen Tickpen=black; pen tickpen=gray+0.5*linewidth(currentpen); pen[] Palette=quantize(BWRainbow(),n); bounds range=image(f,Automatic,a,b,3N,Palette,n); // Major contours real[] Cvals=uniform(range.min,range.max,Divs); draw(contour(f,a,b,Cvals,N,operator --),Tickpen+squarecap+beveljoin); // Minor contours (if divs > 1) real[] cvals; for(int i=0; i < Cvals.length-1; ++i) cvals.append(uniform(Cvals[i],Cvals[i+1],divs)[1:divs]); draw(contour(f,a,b,cvals,N,operator --),tickpen); xaxis("$x$",BottomTop,LeftTicks,above=true); yaxis("$y$",LeftRight,RightTicks,above=true); palette("$f(x,y)$",range,point(SE)+(0.5,0),point(NE)+(1,0),Right,Palette, PaletteTicks("$%+#0.1f$",N=Divs,n=divs,Tickpen,tickpen)); [./fillcontour] import graph; import palette; import contour; size(10cm,10cm); pair a=(0,0); pair b=(2pi,2pi); real f(real x, real y) {return cos(x)*sin(y);} int N=200; int Divs=10; int divs=1; defaultpen(1bp); pen Tickpen=black; pen tickpen=gray+0.5*linewidth(currentpen); pen[] Palette=BWRainbow(); bounds range=image(f,Automatic,a,b,N,Palette); // Major contours real[] Cvals=uniform(range.min,range.max,Divs); draw(contour(f,a,b,Cvals,N,operator --),Tickpen+squarecap+beveljoin); // Minor contours (if divs > 1) real[] cvals; for(int i=0; i < Cvals.length-1; ++i) cvals.append(uniform(Cvals[i],Cvals[i+1],divs)[1:divs]); draw(contour(f,a,b,cvals,N,operator --),tickpen+squarecap+beveljoin); xaxis("$x$",BottomTop,LeftTicks,above=true); yaxis("$y$",LeftRight,RightTicks,above=true); palette("$f(x,y)$",range,point(SE)+(0.5,0),point(NE)+(1,0),Right,Palette, PaletteTicks("$%+#0.1f$",N=Divs,n=divs,Tickpen,tickpen)); [./imagecontour] Finally, here is an example that illustrates the construction of contours from irregularly spaced data: import contour; size(200); int n=100; real f(real a, real b) {return a^2+b^2;} srand(1); real r() {return 1.1*(rand()/randMax*2-1);} pair[] points=new pair[n]; real[] values=new real[n]; for(int i=0; i < n; ++i) { points[i]=(r(),r()); values[i]=f(points[i].x,points[i].y); } draw(contour(points,values,new real[]{0.25,0.5,1},operator ..),blue); [./irregularcontour] In the above example, the contours of irregularly spaced data are constructed by first creating a triangular mesh from an array ‘z’ of pairs: int[][] triangulate(pair[] z); size(200); int np=100; pair[] points; real r() {return 1.2*(rand()/randMax*2-1);} for(int i=0; i < np; ++i) points.push((r(),r())); int[][] trn=triangulate(points); for(int i=0; i < trn.length; ++i) { draw(points[trn[i][0]]--points[trn[i][1]]); draw(points[trn[i][1]]--points[trn[i][2]]); draw(points[trn[i][2]]--points[trn[i][0]]); } for(int i=0; i < np; ++i) dot(points[i],red); [./triangulate] The example ‘Gouraudcontour.asy’ illustrates how to produce color density images over such irregular triangular meshes. ‘Asymptote’ uses a robust version of Paul Bourke's Delaunay triangulation algorithm based on the public-domain exact arithmetic predicates written by Jonathan Shewchuk.  File: asymptote.info, Node: contour3, Next: smoothcontour3, Prev: contour, Up: Base modules 8.37 ‘contour3’ =============== This module draws surfaces described as the null space of real-valued functions of (x,y,z) or ‘real[][][]’ matrices. Its usage is illustrated in the example file ‘magnetic.asy’.  File: asymptote.info, Node: smoothcontour3, Next: slopefield, Prev: contour3, Up: Base modules 8.38 ‘smoothcontour3’ ===================== This module, written by Charles Staats, draws implicitly defined surfaces with smooth appearance. The purpose of this module is similar to that of ‘contour3’: given a real-valued function f(x,y,z), construct the surface described by the equation f(x,y,z) = 0. The ‘smoothcontour3’ module generally produces nicer results than ‘contour3’, but takes longer to compile. Additionally, the algorithm assumes that the function and the surface are both smooth; if they are not, then ‘contour3’ may be a better choice. To construct the null surface of a function ‘f(triple)’ or ‘ff(real,real,real)’ over ‘box(a,b)’, use the routine surface implicitsurface(real f(triple)=null, real ff(real,real,real)=null, triple a, triple b, int n=nmesh, bool keyword overlapedges=false, int keyword nx=n, int keyword ny=n, int keyword nz=n, int keyword maxdepth=8, bool usetriangles=true); The optional parameter ‘overlapedges’ attempts to compensate for an artifact that can cause the renderer to "see through" the boundary between patches. Although it defaults to ‘false’, it should usually be set to ‘true’. The example ‘genustwo.asy’ illustrates the use of this function. Additional examples, together with a more in-depth explanation of the module's usage and pitfalls, are available at .  File: asymptote.info, Node: slopefield, Next: ode, Prev: smoothcontour3, Up: Base modules 8.39 ‘slopefield’ ================= To draw a slope field for the differential equation dy/dx=f(x,y) (or dy/dx=f(x)), use: picture slopefield(real f(real,real), pair a, pair b, int nx=nmesh, int ny=nx, real tickfactor=0.5, pen p=currentpen, arrowbar arrow=None); Here, the points ‘a’ and ‘b’ are the lower left and upper right corners of the rectangle in which the slope field is to be drawn, ‘nx’ and ‘ny’ are the respective number of ticks in the x and y directions, ‘tickfactor’ is the fraction of the minimum cell dimension to use for drawing ticks, and ‘p’ is the pen to use for drawing the slope fields. The return value is a picture that can be added to ‘currentpicture’ via the ‘add(picture)’ command. The function path curve(pair c, real f(real,real), pair a, pair b); takes a point (‘c’) and a slope field-defining function ‘f’ and returns, as a path, the curve passing through that point. The points ‘a’ and ‘b’ represent the rectangular boundaries over which the curve is interpolated. Both ‘slopefield’ and ‘curve’ alternatively accept a function ‘real f(real)’ that depends on x only, as seen in this example: import slopefield; size(200); real func(real x) {return 2x;} add(slopefield(func,(-3,-3),(3,3),20)); draw(curve((0,0),func,(-3,-3),(3,3)),red); [./slopefield1]  File: asymptote.info, Node: ode, Prev: slopefield, Up: Base modules 8.40 ‘ode’ ========== The ‘ode’ module, illustrated in the example ‘odetest.asy’, implements a number of explicit numerical integration schemes for ordinary differential equations.  File: asymptote.info, Node: Options, Next: Interactive mode, Prev: Base modules, Up: Top 9 Command-line options ********************** Type ‘asy -h’ to see the full list of command-line options supported by ‘Asymptote’: Usage: ../asy [options] [file ...] Options (negate boolean options by replacing - with -no): -GPUblockSize n Compute shader block size [8] -GPUcompress Compress GPU transparent fragment counts [false] -GPUindexing Compute indexing partial sums on GPU [true] -GPUinterlock Use fragment shader interlock [true] -GPUlocalSize n Compute shader local size [256] -V,-View View output; command-line only -absolute Use absolute WebGL dimensions [false] -a,-align C|B|T|Z Center, Bottom, Top, or Zero page alignment [C] -aligndir pair Directional page alignment (overrides align) [(0,0)] -animating [false] -antialias n Antialiasing width for rasterized output [2] -auto3D Automatically activate 3D scene [true] -autobillboard 3D labels always face viewer by default [true] -autoimport str Module to automatically import -autoplain Enable automatic importing of plain [true] -autoplay Autoplay 3D animations [false] -autorotate Enable automatic PDF page rotation [false] -axes3 Show 3D axes in PDF output [true] -batchMask Mask fpu exceptions in batch mode [false] -batchView View output in batch mode [false] -bw Convert all colors to black and white false -cd directory Set current directory; command-line only -cmyk Convert rgb colors to cmyk false -c,-command str Command to autoexecute -compact Conserve memory at the expense of speed false -compress Compress images in PDF output [true] -convertOptions str [] -d,-debug Enable debugging messages and traceback false -devicepixelratio n Ratio of physical to logical pixels [1] -digits n Default output file precision [7] -divisor n Garbage collect using purge(divisor=n) [2] -dvipsOptions str [] -dvisvgmMultipleFiles dvisvgm supports multiple files [true] -dvisvgmOptions str [--optimize] -embed Embed rendered preview image [true] -e,-environment Show summary of environment settings; command-line only -exitonEOF Exit interactive mode on EOF [true] -fitscreen Fit rendered image to screen [true] -framerate frames/s Animation speed [30] -glOptions str [] -globalread Allow read from other directory true -globalwrite Allow write to other directory false -gray Convert all colors to grayscale false -gsOptions str [] -h,-help Show summary of options; command-line only -historylines n Retain n lines of history [1000] -htmlviewerOptions str [] -hyperrefOptions str [setpagesize=false,unicode,pdfborder=0 0 0] -ibl Enable environment map image-based lighting [false] -iconify Iconify rendering window [false] -image str Environment image name [snowyField] -imageDir str Environment image library directory [ibl] -inlineimage Generate inline embedded image [false] -inlinetex Generate inline TeX code [false] -inpipe n Input pipe [-1] -interactiveMask Mask fpu exceptions in interactive mode [true] -interactiveView View output in interactive mode [true] -interactiveWrite Write expressions entered at the prompt to stdout [true] -interrupt [false] -k,-keep Keep intermediate files [false] -keepaux Keep intermediate LaTeX .aux files [false] -keys Generate WebGL keys false -level n Postscript level [3] -l,-listvariables List available global functions and variables [false] -localhistory Use a local interactive history file [false] -loop Loop 3D animations [false] -lossy Use single precision for V3D reals [false] -lsp Interactive mode for the Language Server Protocol [false] -m,-mask Mask fpu exceptions; command-line only -maxtile pair Maximum rendering tile size [(1024,768)] -maxviewport pair Maximum viewport size [(0,0)] -multiline Input code over multiple lines at the prompt [false] -multipleView View output from multiple batch-mode files [false] -multisample n Multisampling width for screen images [4] -offline Produce offline html files [false] -O,-offset pair PostScript offset [(0,0)] -f,-outformat format Convert each output file to specified format -o,-outname name Alternative output directory/file prefix -outpipe n Output pipe [-1] -paperheight bp Default page height [0] -paperwidth bp Default page width [0] -p,-parseonly Parse file [false] -pdfreload Automatically reload document in pdfviewer [false] -pdfreloadOptions str [] -pdfreloaddelay usec Delay before attempting initial pdf reload [750000] -pdfviewerOptions str [] -position pair Initial 3D rendering screen position [(0,0)] -prc Embed 3D PRC graphics in PDF output [false] -prerender resolution Prerender V3D objects (0 implies vector output) [0] -prompt str Prompt [> ] -prompt2 str Continuation prompt for multiline input [..] -psviewerOptions str [] -q,-quiet Suppress welcome text and noninteractive stdout [false] -render n Render 3D graphics using n pixels per bp (-1=auto) [-1] -resizestep step Resize step [1.2] -reverse reverse 3D animations [false] -rgb Convert cmyk colors to rgb false -safe Disable system call true -scroll n Scroll standard output n lines at a time [0] -shiftHoldDistance n WebGL touch screen distance limit for shift mode [20] -shiftWaitTime ms WebGL touch screen shift mode delay [200] -spinstep deg/s Spin speed [60] -svgemulation Emulate unimplemented SVG shading [true] -tabcompletion Interactive prompt auto-completion [true] -tex engine latex|pdflatex|xelatex|lualatex|tex|pdftex|luatex|context|none [latex] -thick Render thick 3D lines [true] -thin Render thin 3D lines [true] -threads Use POSIX threads for 3D rendering [true] -toolbar Show 3D toolbar in PDF output [true] -s,-translate Show translated virtual machine code [false] -twice Run LaTeX twice (to resolve references) [false] -twosided Use two-sided 3D lighting model for rendering [true] -u,-user str General purpose user string -v3d Embed 3D V3D graphics in PDF output [false] -v,-verbose Increase verbosity level (can specify multiple times) 0 -version Show version; command-line only -vibrateTime ms WebGL shift mode vibrate duration [25] -viewportmargin pair Horizontal and vertical 3D viewport margin [(0.5,0.5)] -wait Wait for child processes to finish before exiting [false] -warn str Enable warning; command-line only -webgl2 Use webgl2 if available [false] -where Show where listed variables are declared [false] -wsl Run asy under the Windows Subsystem for Linux [false] -xasy Interactive mode for xasy false -zoomPinchCap limit WebGL maximum zoom pinch [100] -zoomPinchFactor n WebGL zoom pinch sensitivity [10] -zoomfactor factor Zoom step factor [1.05] -zoomstep step Mouse motion zoom step [0.1] All boolean options can be negated by prepending ‘no’ to the option name. If no arguments are given, ‘Asymptote’ runs in interactive mode (*note Interactive mode::). In this case, the default output file is ‘out.eps’. If ‘-’ is given as the file argument, ‘Asymptote’ reads from standard input. If multiple files are specified, they are treated as separate ‘Asymptote’ runs. If the string ‘autoimport’ is nonempty, a module with this name is automatically imported for each run as the final step in loading module ‘plain’. Default option values may be entered as ‘Asymptote’ code in a configuration file named ‘config.asy’ (or the file specified by the environment variable ‘ASYMPTOTE_CONFIG’ or ‘-config’ option). ‘Asymptote’ will look for this file in its usual search path (*note Search paths::). Typically the configuration file is placed in the ‘.asy’ directory in the user's home directory (‘%USERPROFILE%\.asy’ under ‘MSDOS’). Configuration variables are accessed using the long form of the option names: import settings; outformat="pdf"; batchView=false; interactiveView=true; batchMask=false; interactiveMask=true; Command-line options override these defaults. Most configuration variables may also be changed at runtime. The advanced configuration variables ‘dvipsOptions’, ‘hyperrefOptions’, ‘convertOptions’, ‘gsOptions’, ‘htmlviewerOptions’, ‘psviewerOptions’, ‘pdfviewerOptions’, ‘pdfreloadOptions’, ‘glOptions’, and ‘dvisvgmOptions’ allow specialized options to be passed as a string to the respective applications or libraries. The default value of ‘hyperrefOptions’ is ‘setpagesize=false,unicode,pdfborder=0 0 0’. If you insert import plain; settings.autoplain=true; at the beginning of the configuration file, it can contain arbitrary ‘Asymptote’ code. The default output format is EPS for the (default) ‘latex’ and ‘tex’ tex engine and PDF for the ‘pdflatex’, ‘xelatex’, ‘context’, ‘luatex’, and ‘lualatex’ tex engines. Alternative output formats may be produced using the ‘-f’ option (or ‘outformat’ setting). To produce SVG output, you will need ‘dvisvgm’ (version 3.2.1 or later) from , which can display SVG output (used by the ‘xasy’ editor) for embedded EPS, PDF, PNG, and JPEG images included with the ‘graphic()’ function. The generated output is optimized with the default setting ‘settings.dvisvgmOptions="--optimize"’. ‘Asymptote’ can also produce any output format supported by the ‘ImageMagick’ ‘magick’ program (version 7 or later. The optional setting ‘-render n’ requests an output resolution of ‘n’ pixels per ‘bp’. Antialiasing is controlled by the parameter ‘antialias’, which by default specifies a sampling width of 2 pixels. To give other options to ‘magick’, use the ‘convertOptions’ setting or call ‘magick convert’ manually. This example emulates how ‘Asymptote’ produces antialiased ‘tiff’ output at one pixel per ‘bp’: asy -o - venn | magick convert -alpha Off -density 144x144 -geometry 50%x eps:- venn.tiff If the option ‘-nosafe’ is given, ‘Asymptote’ runs in unsafe mode. This enables the ‘int system(string s)’ and ‘int system(string[] s)’ calls, allowing one to execute arbitrary shell commands. The default mode, ‘-safe’, disables this call. A ‘PostScript’ offset may be specified as a pair (in ‘bp’ units) with the ‘-O’ option: asy -O 0,0 file The default offset is zero. The pair ‘aligndir’ specifies an optional direction on the boundary of the page (mapped to the rectangle [-1,1]\times[-1,1]) to which the picture should be aligned; the default value ‘(0,0)’ species center alignment. The ‘-c’ (‘command’) option may be used to execute arbitrary ‘Asymptote’ code on the command line as a string. It is not necessary to terminate the string with a semicolon. Multiple ‘-c’ options are executed in the order they are given. For example asy -c 2+2 -c "sin(1)" -c "size(100); draw(unitsquare)" produces the output 4 0.841470984807897 and draws a unitsquare of size ‘100’. The ‘-u’ (‘user’) option may be used to specify arbitrary ‘Asymptote’ settings on the command line as a string. It is not necessary to terminate the string with a semicolon. Multiple ‘-u’ options are executed in the order they are given. Command-line code like ‘-u x=sqrt(2)’ can be executed within a module like this: real x; usersetting(); write(x); When the ‘-l’ (‘listvariables’) option is used with file arguments, only global functions and variables defined in the specified file(s) are listed. Additional debugging output is produced with each additional ‘-v’ option: ‘-v’ Display top-level module and final output file names. ‘-vv’ Also display imported and included module names and final ‘LaTeX’ and ‘dvips’ processing information. ‘-vvv’ Also output ‘LaTeX’ bidirectional pipe diagnostics. ‘-vvvv’ Also output knot guide solver diagnostics. ‘-vvvvv’ Also output ‘Asymptote’ traceback diagnostics.  File: asymptote.info, Node: Interactive mode, Next: GUI, Prev: Options, Up: Top 10 Interactive mode ******************* Interactive mode is entered by executing the command ‘asy’ with no file arguments. When the ‘-multiline’ option is disabled (the default), each line must be a complete ‘Asymptote’ statement (unless explicitly continued by a final backslash character ‘\’); it is not necessary to terminate input lines with a semicolon. If one assigns ‘settings.multiline=true’, interactive code can be entered over multiple lines; in this mode, the automatic termination of interactive input lines by a semicolon is inhibited. Multiline mode is useful for cutting and pasting ‘Asymptote’ code directly into the interactive input buffer. Interactive mode can be conveniently used as a calculator: expressions entered at the interactive prompt (for which a corresponding ‘write’ function exists) are automatically evaluated and written to ‘stdout’. If the expression is non-writable, its type signature will be printed out instead. In either case, the expression can be referred to using the symbol ‘%’ in the next line input at the prompt. For example: > 2+3 5 > %*4 20 > 1/% 0.05 > sin(%) 0.0499791692706783 > currentpicture > %.size(200,0) > The ‘%’ symbol, when used as a variable, is shorthand for the identifier ‘operator answer’, which is set by the prompt after each written expression evaluation. The following special commands are supported only in interactive mode and must be entered immediately after the prompt: ‘help’ view the manual; ‘erase’ erase ‘currentpicture’; ‘reset’ reset the ‘Asymptote’ environment to its initial state, except for changes to the settings module (*note settings::), the current directory (*note cd::), and breakpoints (*note Debugger::); ‘input FILE’ does an interactive reset, followed by the command ‘include FILE’. If the file name ‘FILE’ contains nonalphanumeric characters, enclose it with quotation marks. A trailing semi-colon followed by optional ‘Asymptote’ commands may be entered on the same line. ‘quit’ exit interactive mode (‘exit’ is a synonym; the abbreviation ‘q’ is also accepted unless there exists a top-level variable named ‘q’). A history of the most recent 1000 (this number can be changed with the ‘historylines’ configuration variable) previous commands will be retained in the file ‘.asy/history’ in the user's home directory (unless the command-line option ‘-localhistory’ was specified, in which case the history will be stored in the file ‘.asy_history’ in the current directory). Typing ‘ctrl-C’ interrupts the execution of ‘Asymptote’ code and returns control to the interactive prompt. Interactive mode is implemented with the GNU ‘readline’ library, with command history and auto-completion. To customize the key bindings, see: The file ‘asymptote.py’ in the ‘Asymptote’ system directory provides an alternative way of entering ‘Asymptote’ commands interactively, coupled with the full power of ‘Python’. Copy this file to your ‘Python path’ and then execute from within ‘Python 3’ the commands from asymptote import * g=asy() g.size(200) g.draw("unitcircle") g.send("draw(unitsquare)") g.fill("unitsquare, blue") g.clip("unitcircle") g.label("\"$O$\", (0,0), SW")  File: asymptote.info, Node: GUI, Next: Command-Line Interface, Prev: Interactive mode, Up: Top 11 Graphical User Interface *************************** * Menu: * GUI installation:: Installing ‘xasy’ * GUI usage:: Using ‘xasy’ to edit objects In the event that adjustments to the final figure are required, the preliminary Graphical User Interface (GUI) ‘xasy’ included with ‘Asymptote’ allows you to move graphical objects and draw new ones. The modified figure can then be saved as a normal ‘Asymptote’ file.  File: asymptote.info, Node: GUI installation, Next: GUI usage, Up: GUI 11.1 GUI installation ===================== As ‘xasy’ is written in the interactive scripting language ‘Python/Qt’, it requires ‘Python’ (), along with the ‘Python’ packages ‘pyqt5’, ‘cson’, and ‘numpy’: pip3 install cson numpy pyqt5 PyQt5.sip Pictures are deconstructed into the SVG image format. Since ‘Qt5’ does not support ‘SVG’ clipping, you will need the ‘rsvg-convert’ utility, which is part of the ‘librsvg2-tools’ package on ‘UNIX’ systems and the ‘librsvg’ package on ‘MacOS X’; under ‘Microsoft Windows’, it is available as Ensure that ‘rsvg-convert’ is available in ‘PATH’, or specify the location of ‘rsvg-convert’ in ‘rsvgConverterPath’ option within ‘xasy’'s settings. Deconstruction of a picture into its components is fastest when using the ‘LaTeX’ TeX engine. The default setting ‘dvisvgmMultipleFiles=true’ speeds up deconstruction under PDF TeX engines.  File: asymptote.info, Node: GUI usage, Prev: GUI installation, Up: GUI 11.2 GUI usage ============== The arrow keys (or mouse wheel) are convenient for temporarily raising and lowering objects within ‘xasy’, allowing an object to be selected. Pressing the arrow keys will pan while the shift key is held and zoom while the control key is held. The mouse wheel will pan while the alt or shift keys is held and zoom while the control key is held. In translate mode, an object can be dragged coarsely with the mouse or positioned finely with the arrow keys while holding down the mouse button. Deconstruction of compound objects (such as arrows) can be prevented by enclosing them within the commands void begingroup(picture pic=currentpicture); void endgroup(picture pic=currentpicture); By default, the elements of a picture or frame will be grouped together on adding them to a picture. However, the elements of a frame added to another frame are not grouped together by default: their elements will be individually deconstructed (*note add::).  File: asymptote.info, Node: Command-Line Interface, Next: Language server protocol, Prev: GUI, Up: Top 12 Command-Line Interface ************************* ‘Asymptote’ code may be sent to the server directly from the command line • SVG output: ‘curl --data-binary 'import venn;' 'asymptote.ualberta.ca:10007?f=svg' | display -’ • HTML output: ‘curl --data-binary @/usr/local/share/doc/asymptote/examples/Klein.asy 'asymptote.ualberta.ca:10007' -o Klein.html’ • V3D output: ‘curl --data-binary 'import teapot;' 'asymptote.ualberta.ca:10007?f=v3d' -o teapot.v3d’ • PDF output with rendered bitmap at 2 pixels per bp: ‘curl --data-binary 'import teapot;' 'asymptote.ualberta.ca:10007?f=pdf' -o teapot.pdf’ • PDF output with rendered bitmap at 4 pixels per bp: ‘curl --data-binary 'import teapot;' 'asymptote.ualberta.ca:10007?f=pdf&render=4' -o teapot.pdf’ • PRC output: ‘curl --data-binary 'import teapot;' 'asymptote.ualberta.ca:10007?f=pdf&prc' -o teapot.pdf’ • PRC output with rendered preview bitmap at 4 pixels per bp: ‘curl --data-binary 'import teapot;' 'asymptote.ualberta.ca:10007?f=pdf&prc&render=4' -o teapot.pdf’ The source code for the command-line interface is available at .  File: asymptote.info, Node: Language server protocol, Next: PostScript to Asymptote, Prev: Command-Line Interface, Up: Top 13 Language server protocol *************************** Under ‘UNIX’ and ‘MacOS X’, ‘Asymptote’ supports features of the Language Server Protocol (LSP) (https://en.wikipedia.org/wiki/Language_Server_Protocol), including function signature and variable matching. Under ‘MSWindows’, ‘Asymptote’ currently supports LSP only when compiled within the ‘Windows Subsystem for Linux’. ‘Emacs’ users can enable the ‘Asymptote’ language server protocol by installing ‘lsp-mode’ using the following procedure: • Add to the ‘.emacs’ initialization file: (require 'package) (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) (package-initialize) • Launch emacs and execute M-x package-refresh-contents M-x package-install and select ‘lsp-mode’. • Add to the ‘.emacs’ initialization file: (require 'lsp-mode) (add-to-list 'lsp-language-id-configuration '(asy-mode . "asymptote")) (lsp-register-client (make-lsp-client :new-connection (lsp-stdio-connection '("asy" "-lsp")) :activation-fn (lsp-activate-on "asymptote") :major-modes '(asy-mode) :server-id 'asyls ) ) • Launch emacs and execute M-x lsp  File: asymptote.info, Node: PostScript to Asymptote, Next: Help, Prev: Language server protocol, Up: Top 14 ‘PostScript’ to ‘Asymptote’ ****************************** The excellent ‘PostScript’ editor ‘pstoedit’ (version 3.50 or later; available from ) includes an ‘Asymptote’ backend. Unlike virtually all other ‘pstoedit’ backends, this driver includes native clipping, even-odd fill rule, ‘PostScript’ subpath, and full image support. Here is an example: ‘asy -V /usr/local/share/doc/asymptote/examples/venn.asy’ pstoedit -f asy venn.eps test.asy asy -V test If the line widths aren't quite correct, try giving ‘pstoedit’ the ‘-dis’ option. If the fonts aren't typeset correctly, try giving ‘pstoedit’ the ‘-dt’ option.  File: asymptote.info, Node: Help, Next: Debugger, Prev: PostScript to Asymptote, Up: Top 15 Help ******* A list of frequently asked questions (FAQ) is maintained at Questions on installing and using ‘Asymptote’ that are not addressed in the FAQ should be sent to the ‘Asymptote’ forum: Including an example that illustrates what you are trying to do will help you get useful feedback. ‘LaTeX’ problems can often be diagnosed with the ‘-vv’ or ‘-vvv’ command-line options. Contributions in the form of patches or ‘Asymptote’ modules can be posted here: To receive announcements of upcoming releases, please subscribe to ‘Asymptote’ at If you find a bug in ‘Asymptote’, please check (if possible) whether the bug is still present in the latest ‘git’ developmental code (*note Git::) before submitting a bug report. New bugs can be reported at To see if the bug has already been fixed, check bugs with Status ‘Closed’ and recent lines in ‘Asymptote’ can be configured with the optional GNU library ‘libsigsegv’, available from , which allows one to distinguish user-generated ‘Asymptote’ stack overflows (*note stack overflow::) from true segmentation faults (due to internal C++ programming errors; please submit the ‘Asymptote’ code that generates such segmentation faults along with your bug report).  File: asymptote.info, Node: Debugger, Next: Credits, Prev: Help, Up: Top 16 Debugger *********** Asymptote now includes a line-based (as opposed to code-based) debugger that can assist the user in following flow control. To set a break point in file ‘file’ at line ‘line’, use the command void stop(string file, int line, code s=quote{}); The optional argument ‘s’ may be used to conditionally set the variable ‘ignore’ in ‘plain_debugger.asy’ to ‘true’. For example, the first 10 instances of this breakpoint will be ignored (the variable ‘int count=0’ is defined in ‘plain_debugger.asy’): stop("test",2,quote{ignore=(++count <= 10);}); To set a break point in file ‘file’ at the first line containing the string ‘text’, use void stop(string file, string text, code s=quote{}); To list all breakpoints, use: void breakpoints(); To clear a breakpoint, use: void clear(string file, int line); To clear all breakpoints, use: void clear(); The following commands may be entered at the debugging prompt: ‘h’ help; ‘c’ continue execution; ‘i’ step to the next instruction; ‘s’ step to the next executable line; ‘n’ step to the next executable line in the current file; ‘f’ step to the next file; ‘r’ return to the file associated with the most recent breakpoint; ‘t’ toggle tracing (‘-vvvvv’) mode; ‘q’ quit debugging and end execution; ‘x’ exit the debugger and run to completion. Arbitrary ‘Asymptote’ code may also be entered at the debugging prompt; however, since the debugger is implemented with ‘eval’, currently only top-level (global) variables can be displayed or modified. The debugging prompt may be entered manually with the call void breakpoint(code s=quote{});  File: asymptote.info, Node: Credits, Next: Index, Prev: Debugger, Up: Top 17 Acknowledgments ****************** Financial support for the development of ‘Asymptote’ was generously provided by the Natural Sciences and Engineering Research Council of Canada, the Pacific Institute for Mathematical Sciences, and the University of Alberta Faculty of Science. We also would like to acknowledge the previous work of John D. Hobby, author of the program ‘MetaPost’ that inspired the development of ‘Asymptote’, and Donald E. Knuth, author of TeX and ‘MetaFont’ (on which ‘MetaPost’ is based). The authors of ‘Asymptote’ are Andy Hammerlindl, John Bowman, and Tom Prince. Sean Healy designed the ‘Asymptote’ logo. Other contributors include Orest Shardt, Jesse Frohlich, Michail Vidiassov, Charles Staats, Philippe Ivaldi, Olivier Guibé, Radoslav Marinov, Jeff Samuelson, Chris Savage, Jacques Pienaar, Mark Henning, Steve Melenchuk, Martin Wiebusch, Stefan Knorr, Supakorn "Jamie" Rassameemasmuang, Jacob Skitsko, Joseph Chaumont, and Oliver Cheng. Pedram Emami developed the ‘Asymptote Web Application’ hosted at :  File: asymptote.info, Node: Index, Prev: Credits, Up: Top Index ***** [index] * Menu: * -: Arithmetic & logical. (line 14) * --: Paths. (line 16) * -- <1>: Self & prefix operators. (line 6) * ---: Bezier curves. (line 84) * -=: Self & prefix operators. (line 6) * -c: Options. (line 222) * -l: Options. (line 241) * -u: Options. (line 232) * -V: Configuring. (line 6) * -V <1>: Drawing in batch mode. (line 16) * :: Arithmetic & logical. (line 61) * ::: Bezier curves. (line 70) * !: Arithmetic & logical. (line 57) * !=: Structures. (line 62) * != <1>: Arithmetic & logical. (line 37) * ?: Arithmetic & logical. (line 61) * ..: Paths. (line 16) * .asy: Search paths. (line 12) * *: Pens. (line 15) * * <1>: Arithmetic & logical. (line 16) * **: Arithmetic & logical. (line 31) * *=: Self & prefix operators. (line 6) * /: Arithmetic & logical. (line 18) * /=: Self & prefix operators. (line 6) * &: Bezier curves. (line 84) * & <1>: Arithmetic & logical. (line 49) * &&: Arithmetic & logical. (line 47) * #: Arithmetic & logical. (line 20) * %: Arithmetic & logical. (line 25) * % <1>: Interactive mode. (line 16) * %=: Self & prefix operators. (line 6) * ^: Arithmetic & logical. (line 29) * ^ <1>: Arithmetic & logical. (line 55) * ^^: Paths. (line 23) * ^=: Self & prefix operators. (line 6) * +: Pens. (line 15) * + <1>: Arithmetic & logical. (line 13) * ++: Self & prefix operators. (line 6) * +=: Self & prefix operators. (line 6) * <: Arithmetic & logical. (line 39) * <=: Arithmetic & logical. (line 41) * ==: Structures. (line 62) * == <1>: Arithmetic & logical. (line 36) * >: Arithmetic & logical. (line 45) * >=: Arithmetic & logical. (line 43) * |: Arithmetic & logical. (line 53) * ||: Arithmetic & logical. (line 51) * 2D graphs: graph. (line 6) * 3D graphs: graph3. (line 6) * 3D grids: grid3. (line 6) * 3D PostScript: three. (line 684) * a4: Configuring. (line 63) * abort: Data types. (line 364) * abs: Data types. (line 65) * abs <1>: Data types. (line 144) * abs <2>: Mathematical functions. (line 35) * abs2: Data types. (line 65) * abs2 <1>: Data types. (line 144) * absolute: Configuring. (line 38) * absolute <1>: three. (line 254) * accel: Paths and guides. (line 126) * accel <1>: Paths and guides. (line 132) * accel <2>: three. (line 585) * access: Import. (line 6) * access <1>: Import. (line 45) * acknowledgments: Credits. (line 6) * acos: Mathematical functions. (line 6) * aCos: Mathematical functions. (line 20) * acosh: Mathematical functions. (line 6) * add: Frames and pictures. (line 205) * add <1>: Frames and pictures. (line 219) * add <2>: three. (line 362) * addViews: three. (line 479) * adjust: Pens. (line 123) * Ai: Mathematical functions. (line 51) * Ai_deriv: Mathematical functions. (line 51) * Airy: Mathematical functions. (line 51) * alias: Structures. (line 62) * alias <1>: Arrays. (line 183) * Align: label. (line 20) * aligndir: Options. (line 214) * all: Arrays. (line 350) * Allow: Pens. (line 416) * and: Bezier curves. (line 56) * AND: Arithmetic & logical. (line 68) * angle: Data types. (line 73) * animate: Configuring. (line 15) * animate <1>: Files. (line 163) * animate <2>: animation. (line 12) * animation: animation. (line 6) * animation <1>: animation. (line 6) * annotate: annotate. (line 6) * antialias: three. (line 281) * antialias <1>: Options. (line 188) * append: Files. (line 38) * append <1>: Arrays. (line 39) * arc: Paths and guides. (line 24) * Arc: Paths and guides. (line 37) * arc <1>: three. (line 373) * ArcArrow: draw. (line 30) * ArcArrow3: three. (line 651) * ArcArrows: draw. (line 30) * ArcArrows3: three. (line 651) * arclength: Paths and guides. (line 153) * arclength <1>: three. (line 585) * arcpoint: Paths and guides. (line 163) * arctime: Paths and guides. (line 157) * arctime <1>: three. (line 585) * arguments: Default arguments. (line 6) * arithmetic operators: Arithmetic & logical. (line 6) * array: Data types. (line 284) * array <1>: Arrays. (line 112) * array iteration: Programming. (line 53) * arrays: Arrays. (line 6) * arrow: Drawing commands. (line 34) * Arrow: draw. (line 26) * arrow <1>: label. (line 77) * arrow keys: Drawing in interactive mode. (line 11) * arrow keys <1>: GUI usage. (line 6) * Arrow3: three. (line 651) * arrowbar: draw. (line 26) * arrowhead: draw. (line 50) * arrows: draw. (line 26) * Arrows: draw. (line 26) * Arrows3: three. (line 651) * as: Import. (line 67) * ascii: Data types. (line 309) * ascii <1>: Data types. (line 309) * asin: Mathematical functions. (line 6) * aSin: Mathematical functions. (line 20) * asinh: Mathematical functions. (line 6) * Aspect: Frames and pictures. (line 45) * assert: Data types. (line 369) * assignment: Programming. (line 28) * asy: Data types. (line 359) * asy <1>: Import. (line 106) * asy-mode: Editing modes. (line 6) * asy.vim: Editing modes. (line 32) * asygl: Configuring. (line 69) * asyinclude: LaTeX usage. (line 42) * Asymptote Web Application: Description. (line 6) * ASYMPTOTE_CONFIG: Options. (line 159) * asymptote.sty: LaTeX usage. (line 6) * asymptote.xml: Editing modes. (line 48) * atan: Mathematical functions. (line 6) * aTan: Mathematical functions. (line 20) * atan2: Mathematical functions. (line 6) * atanh: Mathematical functions. (line 6) * atleast: Bezier curves. (line 56) * attach: Frames and pictures. (line 264) * attach <1>: LaTeX usage. (line 47) * attach <2>: graph. (line 406) * autoadjust: three. (line 448) * autoimport: Options. (line 155) * automatic scaling: graph. (line 710) * automatic scaling <1>: graph. (line 710) * autounravel: Autounravel. (line 6) * axialshade: fill. (line 43) * axis: graph. (line 924) * axis <1>: graph. (line 1006) * axis <2>: graph3. (line 69) * axis <3>: graph3. (line 85) * azimuth: Data types. (line 154) * babel: babel. (line 6) * background: three. (line 76) * background <1>: three. (line 97) * background color: Frames and pictures. (line 168) * BackView: three. (line 472) * Bar: draw. (line 19) * Bar3: three. (line 651) * Bars: draw. (line 19) * Bars3: three. (line 651) * barsize: draw. (line 19) * base modules: Base modules. (line 6) * basealign: Pens. (line 181) * baseline: label. (line 97) * batch mode: Drawing in batch mode. (line 6) * beep: Data types. (line 382) * BeginArcArrow: draw. (line 30) * BeginArcArrow3: three. (line 651) * BeginArrow: draw. (line 26) * BeginArrow3: three. (line 651) * BeginBar: draw. (line 19) * BeginBar3: three. (line 651) * BeginDotMargin: draw. (line 87) * BeginDotMargin3: three. (line 667) * BeginMargin: draw. (line 68) * BeginMargin3: three. (line 667) * BeginPenMargin: draw. (line 76) * BeginPenMargin2: three. (line 667) * BeginPenMargin3: three. (line 667) * BeginPoint: label. (line 62) * Bessel: Mathematical functions. (line 51) * bevel: flowchart. (line 72) * beveljoin: Pens. (line 149) * Bezier curves: Bezier curves. (line 6) * Bezier patch: three. (line 141) * Bezier triangle: three. (line 141) * bezulate: three. (line 159) * Bi: Mathematical functions. (line 51) * Bi_deriv: Mathematical functions. (line 51) * Billboard: three. (line 555) * binary: Files. (line 80) * binary format: Files. (line 80) * binary operators: Arithmetic & logical. (line 6) * binarytree: binarytree. (line 6) * black stripes: three. (line 281) * Blank: draw. (line 26) * block.bottom: flowchart. (line 19) * block.bottomleft: flowchart. (line 19) * block.bottomright: flowchart. (line 19) * block.center: flowchart. (line 24) * block.draw: flowchart. (line 29) * block.left: flowchart. (line 19) * block.position: flowchart. (line 23) * block.right: flowchart. (line 19) * block.top: flowchart. (line 19) * block.topleft: flowchart. (line 19) * block.topright: flowchart. (line 19) * bool: Data types. (line 14) * bool3: Data types. (line 25) * boolean operators: Arithmetic & logical. (line 6) * Bottom: graph. (line 132) * BottomTop: graph. (line 138) * BottomView: three. (line 472) * bounding box: Frames and pictures. (line 168) * bounds: palette. (line 43) * Bounds: graph3. (line 24) * box: Frames and pictures. (line 118) * box <1>: three. (line 395) * box <2>: three. (line 397) * bp: Drawing in batch mode. (line 23) * brace: Paths and guides. (line 51) * break: Programming. (line 49) * breakpoints: Debugger. (line 21) * brick: Pens. (line 338) * broken axis: graph. (line 821) * bug reports: Help. (line 19) * buildcycle: Paths and guides. (line 270) * Button-1: GUI. (line 6) * Button-2: GUI. (line 6) * BWRainbow: palette. (line 15) * BWRainbow2: palette. (line 18) * C string: Data types. (line 217) * CAD: CAD. (line 6) * camera: three. (line 442) * casts: Casts. (line 6) * cbrt: Mathematical functions. (line 6) * cd: Files. (line 26) * ceil: Mathematical functions. (line 26) * Center: label. (line 67) * center: three. (line 425) * checker: Pens. (line 338) * Chinese: Pens. (line 297) * choose: Mathematical functions. (line 39) * Ci: Mathematical functions. (line 51) * circle: Paths and guides. (line 10) * Circle: Paths and guides. (line 18) * circle <1>: three. (line 369) * circle <2>: flowchart. (line 61) * circlebarframe: markers. (line 18) * CJK: Pens. (line 297) * clamped: graph. (line 36) * clang: Compiling from UNIX source. (line 31) * clear: Files. (line 101) * clear <1>: Debugger. (line 23) * clip: clip. (line 6) * CLZ: Arithmetic & logical. (line 68) * cm: Figure size. (line 18) * cmd: Configuring. (line 30) * cmyk: Pens. (line 38) * colatitude: Data types. (line 159) * color: Pens. (line 23) * color <1>: graph3. (line 136) * coloredNodes: tube. (line 25) * coloredpath: tube. (line 18) * coloredSegments: tube. (line 25) * colorless: Pens. (line 57) * colors: Pens. (line 54) * comma: Files. (line 65) * comma-separated-value mode: Arrays. (line 385) * command-line interface: Command-Line Interface. (line 6) * command-line options: Configuring. (line 86) * command-line options <1>: Options. (line 6) * comment character: Files. (line 16) * compass directions: Labels. (line 18) * Compiling from UNIX source: Compiling from UNIX source. (line 6) * complement: Arrays. (line 149) * concat: Arrays. (line 179) * conditional: Programming. (line 28) * conditional <1>: Arithmetic & logical. (line 61) * config: Configuring. (line 69) * config <1>: Options. (line 159) * configuration file: Configuring. (line 15) * configuration file <1>: Options. (line 159) * configuring: Configuring. (line 6) * conj: Data types. (line 62) * constructors: Structures. (line 90) * context: Options. (line 188) * continue: Programming. (line 49) * continue <1>: Debugger. (line 31) * contour: contour. (line 6) * contour3: contour3. (line 6) * controls: Bezier curves. (line 45) * controls <1>: three. (line 6) * controlSpecifier: Paths and guides. (line 397) * convert: Files. (line 163) * convertOptions: Options. (line 174) * Coons shading: fill. (line 78) * copy: Arrays. (line 176) * cos: Mathematical functions. (line 6) * Cos: Mathematical functions. (line 20) * cosh: Mathematical functions. (line 6) * cputime: Mathematical functions. (line 89) * crop: graph. (line 639) * cropping graphs: graph. (line 639) * cross: Data types. (line 106) * cross <1>: Data types. (line 197) * cross <2>: graph. (line 480) * crossframe: markers. (line 22) * crosshatch: Pens. (line 355) * csv: Arrays. (line 367) * csv <1>: Arrays. (line 385) * CTZ: Arithmetic & logical. (line 68) * cubicroots: Arrays. (line 339) * curl: Bezier curves. (line 66) * curl <1>: three. (line 6) * curlSpecifier: Paths and guides. (line 409) * currentlight: three. (line 76) * currentpen: Pens. (line 6) * currentprojection: three. (line 469) * curve: slopefield. (line 20) * custom axis types: graph. (line 141) * custom mark routine: graph. (line 577) * custom tick locations: graph. (line 233) * cut: Paths and guides. (line 251) * cycle: Figure size. (line 29) * cycle <1>: Paths. (line 16) * cycle <2>: three. (line 6) * cyclic: Paths and guides. (line 85) * cyclic <1>: Paths and guides. (line 377) * cyclic <2>: Arrays. (line 39) * cyclic <3>: three. (line 585) * Cyrillic: Pens. (line 291) * dashdotted: Pens. (line 102) * dashed: Pens. (line 102) * data types: Data types. (line 6) * date: Data types. (line 321) * Debian: UNIX binary distributions. (line 19) * debugger: Debugger. (line 6) * declaration: Programming. (line 28) * deconstruct: GUI usage. (line 6) * default arguments: Default arguments. (line 6) * defaultformat: graph. (line 175) * DefaultHead: draw. (line 50) * DefaultHead3: three. (line 651) * defaultpen: Pens. (line 49) * defaultpen <1>: Pens. (line 122) * defaultpen <2>: Pens. (line 127) * defaultpen <3>: Pens. (line 139) * defaultpen <4>: Pens. (line 245) * defaultpen <5>: Pens. (line 416) * defaultpen <6>: Pens. (line 440) * defaultrender: three. (line 46) * deferred drawing: Deferred drawing. (line 6) * deferred drawing <1>: simplex2. (line 6) * degrees: Data types. (line 78) * degrees <1>: Mathematical functions. (line 17) * Degrees: Mathematical functions. (line 17) * delete: Files. (line 158) * delete <1>: Arrays. (line 39) * description: Description. (line 6) * devicepixelratio: three. (line 197) * diagonal: Arrays. (line 324) * diamond: flowchart. (line 54) * diffuse: three. (line 76) * diffusepen: three. (line 66) * dimension: Arrays. (line 367) * dimension <1>: Arrays. (line 390) * dir: Search paths. (line 9) * dir <1>: Data types. (line 90) * dir <2>: Data types. (line 181) * dir <3>: Paths and guides. (line 109) * dir <4>: three. (line 585) * direction specifier: Bezier curves. (line 6) * directory: Files. (line 26) * dirSpecifier: Paths and guides. (line 391) * dirtime: Paths and guides. (line 166) * display: Configuring. (line 15) * do: Programming. (line 49) * DOSendl: Files. (line 65) * DOSnewl: Files. (line 65) * dot: draw. (line 117) * dot <1>: Data types. (line 103) * dot <2>: Data types. (line 194) * dot <3>: Arrays. (line 279) * dot <4>: Arrays. (line 282) * DotMargin: draw. (line 83) * DotMargin3: three. (line 667) * DotMargins: draw. (line 89) * DotMargins3: three. (line 667) * dotted: Pens. (line 102) * double deferred drawing: three. (line 347) * double precision: Files. (line 80) * draw: Drawing commands. (line 34) * draw <1>: draw. (line 6) * draw <2>: draw. (line 147) * Draw: Frames and pictures. (line 148) * draw <3>: three. (line 167) * drawer: Deferred drawing. (line 31) * drawing commands: Drawing commands. (line 6) * drawline: math. (line 9) * drawtree: drawtree. (line 6) * dvips: Configuring. (line 69) * dvipsOptions: Options. (line 174) * dvisvgm: Configuring. (line 69) * dvisvgm <1>: Options. (line 193) * dvisvgmMultipleFiles: GUI installation. (line 24) * dvisvgmOptions: Options. (line 174) * E: Labels. (line 18) * E <1>: Mathematical functions. (line 51) * Editing modes: Editing modes. (line 6) * Ei: Mathematical functions. (line 51) * ellipse: Paths and guides. (line 45) * elliptic functions: Mathematical functions. (line 51) * else: Programming. (line 28) * emacs: Editing modes. (line 6) * embed: embed. (line 6) * Embedded: three. (line 555) * emissivepen: three. (line 66) * empty: Frames and pictures. (line 7) * EndArcArrow: draw. (line 30) * EndArcArrow3: three. (line 651) * EndArrow: draw. (line 26) * EndArrow3: three. (line 651) * EndBar: draw. (line 19) * EndBar3: three. (line 651) * EndDotMargin: draw. (line 89) * EndDotMargin3: three. (line 667) * endl: Files. (line 65) * EndMargin: draw. (line 69) * EndMargin3: three. (line 667) * EndPenMargin: draw. (line 78) * EndPenMargin2: three. (line 667) * EndPenMargin3: three. (line 667) * EndPoint: label. (line 62) * envelope: label. (line 111) * environment variables: Configuring. (line 90) * eof: Files. (line 101) * eof <1>: Arrays. (line 364) * eol: Files. (line 101) * eol <1>: Arrays. (line 364) * EPS: label. (line 85) * EPS <1>: Options. (line 188) * erase: Drawing in interactive mode. (line 11) * erase <1>: Data types. (line 257) * erase <2>: Frames and pictures. (line 7) * erase <3>: Frames and pictures. (line 272) * erf: Mathematical functions. (line 6) * erfc: Mathematical functions. (line 6) * error: Files. (line 16) * error <1>: Files. (line 101) * error bars: graph. (line 531) * errorbars: graph. (line 480) * eval: Import. (line 102) * eval <1>: Import. (line 112) * evenodd: Paths. (line 37) * evenodd <1>: Pens. (line 164) * exit: Data types. (line 373) * exit <1>: Interactive mode. (line 54) * exit <2>: Debugger. (line 56) * exp: Mathematical functions. (line 6) * expi: Data types. (line 86) * expi <1>: Data types. (line 177) * explicit: Casts. (line 6) * explicit casts: Casts. (line 21) * expm1: Mathematical functions. (line 6) * exponential integral: Mathematical functions. (line 51) * extendcap: Pens. (line 139) * extension: Paths and guides. (line 246) * extension <1>: MetaPost. (line 10) * external: embed. (line 11) * extrude: three. (line 579) * F: Mathematical functions. (line 51) * fabs: Mathematical functions. (line 6) * face: three. (line 691) * factorial: Mathematical functions. (line 39) * Fedora: UNIX binary distributions. (line 15) * feynman: feynman. (line 6) * fft: Arrays. (line 249) * fft <1>: Arrays. (line 263) * fft <2>: Arrays. (line 267) * FFTW: Compiling from UNIX source. (line 45) * file: Files. (line 6) * file <1>: Debugger. (line 44) * fill: draw. (line 152) * fill <1>: fill. (line 6) * fill <2>: fill. (line 17) * Fill: Frames and pictures. (line 134) * filldraw: fill. (line 11) * FillDraw: Frames and pictures. (line 124) * filloutside: fill. (line 27) * fillrule: Pens. (line 164) * filltype: Frames and pictures. (line 123) * find: Data types. (line 242) * find <1>: Arrays. (line 158) * findall: Arrays. (line 163) * firstcut: Paths and guides. (line 262) * fit3: three. (line 360) * fixedscaling: Frames and pictures. (line 68) * floor: Mathematical functions. (line 26) * flowchart: flowchart. (line 6) * flush: Files. (line 65) * flush <1>: Files. (line 101) * fmod: Mathematical functions. (line 6) * font: Pens. (line 259) * font <1>: Pens. (line 259) * font <2>: Pens. (line 288) * font encoding: Pens. (line 288) * fontcommand: Pens. (line 272) * fontsize: Pens. (line 245) * for: Programming. (line 28) * format: Data types. (line 290) * format <1>: Options. (line 188) * forum: Help. (line 6) * frame: Frames and pictures. (line 7) * freshnel0: three. (line 66) * from: Import. (line 16) * FrontView: three. (line 472) * function declarations: Functions. (line 82) * Function shading: fill. (line 100) * function shading: fill. (line 100) * functions: Functions. (line 6) * functions <1>: Mathematical functions. (line 6) * functionshade: fill. (line 100) * gamma: Mathematical functions. (line 6) * Gaussrand: Mathematical functions. (line 39) * geometry: geometry. (line 6) * getc: Files. (line 32) * getint: Files. (line 126) * getpair: Files. (line 126) * getreal: Files. (line 126) * getstring: Files. (line 126) * gettriple: Files. (line 126) * git: Git. (line 6) * globalwrite: Files. (line 40) * globalwrite <1>: Files. (line 158) * glOptions: three. (line 281) * glOptions <1>: Options. (line 174) * GNU Scientific Library: Mathematical functions. (line 51) * gouraudshade: fill. (line 63) * Gradient: palette. (line 25) * gradient shading: fill. (line 32) * graph: graph. (line 6) * graph3: graph3. (line 6) * graphic: label. (line 85) * graphic <1>: Options. (line 193) * graphical user interface: GUI. (line 6) * graphwithderiv: graph. (line 670) * gray: Pens. (line 25) * grayscale: Pens. (line 25) * Grayscale: palette. (line 9) * grid: Pens. (line 338) * grid <1>: graph. (line 766) * grid3: grid3. (line 6) * gs: Configuring. (line 15) * GSL: Compiling from UNIX source. (line 45) * gsl: Mathematical functions. (line 51) * gsOptions: Options. (line 174) * GUI: GUI. (line 6) * GUI installation: GUI installation. (line 6) * GUI usage: GUI usage. (line 6) * guide: Paths and guides. (line 315) * guide3: three. (line 6) * hatch: Pens. (line 355) * Headlamp: three. (line 76) * height: LaTeX usage. (line 47) * help: Interactive mode. (line 42) * help <1>: Help. (line 6) * help <2>: Debugger. (line 30) * Hermite: graph. (line 36) * Hermite(splinetype splinetype: graph. (line 36) * hex: Data types. (line 306) * hex <1>: Pens. (line 64) * hexadecimal: Data types. (line 306) * hexadecimal <1>: Pens. (line 62) * hidden surface removal: three. (line 691) * histogram: Mathematical functions. (line 39) * history: Files. (line 151) * history <1>: Interactive mode. (line 54) * historylines: Interactive mode. (line 58) * HookHead: draw. (line 50) * HookHead3: three. (line 651) * Horizontal: flowchart. (line 77) * HTML5: three. (line 246) * htmlviewer: Configuring. (line 15) * htmlviewer <1>: Configuring. (line 38) * htmlviewerOptions: Options. (line 174) * hyperrefOptions: Options. (line 174) * hypot: Mathematical functions. (line 6) * I: Mathematical functions. (line 51) * i_scaled: Mathematical functions. (line 51) * ibl: three. (line 117) * iconify: three. (line 281) * identity: Transforms. (line 24) * identity <1>: Mathematical functions. (line 6) * identity <2>: Arrays. (line 321) * identity4: three. (line 523) * if: Programming. (line 28) * IgnoreAspect: Frames and pictures. (line 50) * image: palette. (line 33) * image <1>: palette. (line 61) * image-based lighting: three. (line 117) * ImageMagick: Configuring. (line 69) * ImageMagick <1>: animation. (line 6) * ImageMagick <2>: Options. (line 188) * images: palette. (line 6) * implicit casts: Casts. (line 6) * implicit linear solver: MetaPost. (line 10) * implicit scaling: Implicit scaling. (line 6) * implicitsurface: smoothcontour3. (line 16) * import: Import. (line 45) * importv3d: three. (line 338) * inches: Figure size. (line 18) * incircle: Data types. (line 120) * include: Import. (line 131) * including images: label. (line 85) * increasing: math. (line 55) * inf: Data types. (line 35) * inheritance: Structures. (line 146) * initialized: Arrays. (line 39) * initializers: Variable initializers. (line 6) * inline: LaTeX usage. (line 47) * InOutTicks: graph3. (line 38) * input: Files. (line 10) * input <1>: Files. (line 12) * input <2>: Interactive mode. (line 45) * input <3>: Interactive mode. (line 49) * input encoding: Pens. (line 288) * insert: Data types. (line 253) * insert <1>: Arrays. (line 39) * inside: Paths and guides. (line 294) * inside <1>: Paths and guides. (line 299) * inside <2>: Paths and guides. (line 305) * insphere: three. (line 614) * inst: Debugger. (line 35) * installation: Installation. (line 6) * int: Data types. (line 30) * integer division: Arithmetic & logical. (line 20) * integral: Mathematical functions. (line 85) * integrate: Mathematical functions. (line 85) * interactive mode: Drawing in interactive mode. (line 6) * interactive mode <1>: Interactive mode. (line 6) * interior: Paths and guides. (line 290) * interp: Arithmetic & logical. (line 64) * interpolate: interpolate. (line 6) * intersect: Paths and guides. (line 195) * intersect <1>: math. (line 13) * intersect <2>: three. (line 585) * intersectionpoint: Paths and guides. (line 238) * intersectionpoint <1>: math. (line 17) * intersectionpoint <2>: three. (line 585) * intersectionpoints: Paths and guides. (line 242) * intersectionpoints <1>: three. (line 585) * intersectionpoints <2>: three. (line 598) * intersections: Paths and guides. (line 206) * intersections <1>: Paths and guides. (line 213) * intersections <2>: three. (line 585) * intersections <3>: three. (line 591) * InTicks: graph3. (line 38) * intMax: Data types. (line 30) * intMin: Data types. (line 30) * inverse: Transforms. (line 16) * inverse <1>: Arrays. (line 327) * invert: three. (line 513) * invisible: Pens. (line 43) * isnan: Data types. (line 35) * J: Mathematical functions. (line 6) * J <1>: Mathematical functions. (line 51) * Japanese: Pens. (line 297) * K: Mathematical functions. (line 51) * k_scaled: Mathematical functions. (line 51) * Kate: Editing modes. (line 48) * KDE editor: Editing modes. (line 48) * keepAspect: Frames and pictures. (line 45) * keepAspect <1>: Frames and pictures. (line 50) * keepAspect <2>: LaTeX usage. (line 47) * keyboard bindings:: three. (line 224) * keys: Arrays. (line 39) * keyword: Named arguments. (line 37) * keyword-only: Named arguments. (line 37) * keywords: Named arguments. (line 6) * Korean: Pens. (line 297) * label: Labels. (line 6) * Label: draw. (line 135) * label <1>: label. (line 6) * Label <1>: label. (line 21) * Label <2>: graph. (line 330) * label <2>: three. (line 549) * labelmargin: label. (line 6) * labelpath: labelpath. (line 6) * labelpath3: labelpath3. (line 6) * labelx: graph. (line 330) * labely: graph. (line 330) * Landscape: Frames and pictures. (line 92) * language context: Pens. (line 288) * language server protocol: Language server protocol. (line 6) * lastcut: Paths and guides. (line 266) * lasy-mode: Editing modes. (line 6) * latex: Options. (line 188) * LaTeX NFSS fonts: Pens. (line 259) * LaTeX usage: LaTeX usage. (line 6) * latexmk: LaTeX usage. (line 30) * latitude: Data types. (line 164) * latticeshade: fill. (line 32) * layer: Drawing commands. (line 16) * leastsquares: stats. (line 6) * leastsquares <1>: graph. (line 947) * Left: graph. (line 269) * LeftRight: graph. (line 275) * LeftSide: label. (line 67) * LeftTicks: graph. (line 160) * LeftTicks <1>: graph. (line 233) * LeftView: three. (line 472) * legend: Drawing commands. (line 34) * legend <1>: draw. (line 99) * legend <2>: graph. (line 424) * Legendre: Mathematical functions. (line 51) * length: Data types. (line 65) * length <1>: Data types. (line 144) * length <2>: Data types. (line 239) * length <3>: Paths and guides. (line 76) * length <4>: Paths and guides. (line 374) * length <5>: Arrays. (line 39) * length <6>: three. (line 585) * letter: Configuring. (line 63) * lexorder: math. (line 63) * lexorder <1>: math. (line 66) * libcurl: Import. (line 94) * libm routines: Mathematical functions. (line 6) * libsigsegv: Functions. (line 103) * libsigsegv <1>: Help. (line 27) * light: three. (line 76) * limits: graph. (line 639) * line: Arrays. (line 364) * line <1>: Arrays. (line 367) * line <2>: Arrays. (line 372) * line mode: Arrays. (line 364) * linear: graph. (line 36) * Linear: graph. (line 710) * linecap: Pens. (line 139) * linejoin: Pens. (line 149) * lineskip: Pens. (line 245) * linetype: Pens. (line 123) * linewidth: Pens. (line 127) * locale: Data types. (line 316) * log: Mathematical functions. (line 6) * Log: graph. (line 710) * log-log graph: graph. (line 744) * log10: Mathematical functions. (line 6) * log1p: Mathematical functions. (line 6) * log2 graph: graph. (line 800) * logarithmic graph: graph. (line 744) * logical operators: Arithmetic & logical. (line 6) * longdashdotted: Pens. (line 102) * longdashed: Pens. (line 102) * longitude: Data types. (line 169) * loop: Programming. (line 28) * LSP: Language server protocol. (line 6) * lualatex: Options. (line 188) * luatex: Options. (line 188) * MacOS X binary distributions: MacOS X binary distributions. (line 6) * MacOS X configuration: Compiling from UNIX source. (line 31) * magick: Configuring. (line 69) * magick <1>: Files. (line 163) * magick <2>: animation. (line 6) * magick <3>: Options. (line 188) * makepen: Pens. (line 391) * map: Arrays. (line 135) * map <1>: Arrays. (line 140) * map <2>: map. (line 6) * Margin: draw. (line 69) * Margin3: three. (line 667) * Margin3 <1>: three. (line 667) * Margins: draw. (line 70) * margins: three. (line 353) * Margins3: three. (line 667) * mark: graph. (line 480) * markangle: markers. (line 35) * marker: graph. (line 480) * markers: markers. (line 6) * marknodes: graph. (line 480) * markuniform: graph. (line 480) * mask: Data types. (line 35) * material: three. (line 66) * math: math. (line 6) * mathematical functions: Mathematical functions. (line 6) * max: Paths and guides. (line 279) * max <1>: Frames and pictures. (line 7) * max <2>: Arrays. (line 230) * max <3>: Arrays. (line 240) * max <4>: three. (line 585) * maxbound: Data types. (line 134) * maxbound <1>: Data types. (line 205) * maxtile: three. (line 281) * maxtimes: Paths and guides. (line 233) * maxviewport: three. (line 281) * metallic: three. (line 66) * MetaPost: MetaPost. (line 6) * MetaPost ... : Bezier curves. (line 70) * MetaPost cutafter: Paths and guides. (line 267) * MetaPost cutbefore: Paths and guides. (line 263) * MetaPost pickup: Pens. (line 6) * MetaPost whatever: MetaPost. (line 10) * Microsoft Windows: Microsoft Windows. (line 6) * MidArcArrow: draw. (line 30) * MidArcArrow3: three. (line 651) * MidArrow: draw. (line 26) * MidArrow3: three. (line 651) * MidPoint: label. (line 62) * midpoint: Paths and guides. (line 180) * min: Paths and guides. (line 275) * min <1>: Frames and pictures. (line 7) * min <2>: Arrays. (line 225) * min <3>: Arrays. (line 235) * min <4>: three. (line 585) * minbound: Data types. (line 131) * minbound <1>: Data types. (line 202) * minipage: label. (line 125) * mintimes: Paths and guides. (line 228) * miterjoin: Pens. (line 149) * miterlimit: Pens. (line 159) * mktemp: Files. (line 48) * mm: Figure size. (line 18) * mobile browser: three. (line 246) * mode: Files. (line 80) * mode <1>: Files. (line 98) * monotonic: graph. (line 36) * mouse: GUI. (line 6) * mouse bindings: three. (line 205) * mouse wheel: GUI usage. (line 6) * Move: Pens. (line 428) * MoveQuiet: Pens. (line 434) * multisample: three. (line 197) * N: Labels. (line 18) * name: Files. (line 98) * named arguments: Named arguments. (line 6) * nan: Data types. (line 35) * natural: graph. (line 36) * new: Structures. (line 6) * new <1>: Arrays. (line 100) * new <2>: Arrays. (line 103) * newframe: Frames and pictures. (line 7) * newl: Files. (line 65) * newpage: Drawing commands. (line 27) * newton: Mathematical functions. (line 69) * newton <1>: Mathematical functions. (line 76) * next: Debugger. (line 41) * nobasealign: Pens. (line 181) * NoFill: Frames and pictures. (line 142) * noglobalread: Files. (line 26) * noglobalread <1>: Files. (line 40) * nolight: three. (line 76) * NoMargin: draw. (line 67) * NoMargin3: three. (line 667) * None: draw. (line 19) * None <1>: draw. (line 26) * none: Files. (line 65) * normal: three. (line 571) * nosafe: Options. (line 209) * NOT: Arithmetic & logical. (line 68) * notaknot: graph. (line 36) * NoTicks: graph. (line 160) * NoTicks3: graph3. (line 38) * null: Structures. (line 6) * nullpen: label. (line 21) * nullpen <1>: Frames and pictures. (line 128) * nullpen <2>: Frames and pictures. (line 137) * O: three. (line 365) * obj: obj. (line 6) * object: label. (line 111) * oblique: three. (line 408) * obliqueX: three. (line 415) * obliqueY: three. (line 421) * obliqueZ: three. (line 408) * ode: ode. (line 6) * offset: Pens. (line 123) * offset <1>: Options. (line 214) * OmitTick: graph. (line 223) * OmitTickInterval: graph. (line 223) * OmitTickIntervals: graph. (line 223) * opacity: Pens. (line 307) * opacity <1>: three. (line 66) * open: Files. (line 12) * OpenGL: three. (line 197) * operator: User-defined operators. (line 6) * operator --: graph. (line 30) * operator ..: graph. (line 33) * operator +(...string[] a).: Data types. (line 284) * operator answer: Interactive mode. (line 35) * operator cast: Casts. (line 38) * operator ecast: Casts. (line 65) * operator init: Variable initializers. (line 6) * operator init <1>: Structures. (line 104) * operators: Operators. (line 6) * options: Options. (line 6) * OR: Arithmetic & logical. (line 68) * orient: Data types. (line 108) * orient <1>: three. (line 602) * orientation: Frames and pictures. (line 92) * orthographic: three. (line 425) * outformat: three. (line 197) * outprefix: Frames and pictures. (line 78) * output: Files. (line 38) * output <1>: Options. (line 188) * OutTicks: graph3. (line 38) * overloading functions: Functions. (line 58) * overwrite: Pens. (line 413) * P: Mathematical functions. (line 51) * pack: label. (line 109) * packing: Rest arguments. (line 30) * pad: Frames and pictures. (line 174) * pair: Figure size. (line 6) * pair <1>: Data types. (line 46) * pairs: Arrays. (line 245) * paperheight: Configuring. (line 63) * papertype: Configuring. (line 63) * paperwidth: Configuring. (line 63) * parallelogram: flowchart. (line 47) * parametric surface: graph3. (line 102) * parametrized curve: graph. (line 639) * partialsum: math. (line 49) * partialsum <1>: math. (line 52) * patch-dependent colors: three. (line 132) * path: Paths. (line 6) * path <1>: Paths and guides. (line 7) * path <2>: three. (line 42) * path <3>: flowchart. (line 77) * path markers: graph. (line 480) * path[]: Paths. (line 23) * path3: three. (line 6) * path3 <1>: three. (line 42) * patterns: Pens. (line 324) * patterns <1>: patterns. (line 6) * PBR: three. (line 74) * PDF: Options. (line 188) * pdflatex: Options. (line 188) * pdfreloadOptions: Options. (line 174) * pdfviewer: Configuring. (line 15) * pdfviewerOptions: Options. (line 174) * pen: Pens. (line 6) * PenMargin: draw. (line 78) * PenMargin2: three. (line 667) * PenMargin3: three. (line 667) * PenMargins: draw. (line 79) * PenMargins2: three. (line 667) * PenMargins3: three. (line 667) * periodic: graph. (line 36) * perl: LaTeX usage. (line 30) * perpendicular: geometry. (line 6) * perspective: three. (line 452) * physically based rendering: three. (line 74) * picture: Frames and pictures. (line 25) * picture alignment: Frames and pictures. (line 219) * picture.add: Deferred drawing. (line 31) * picture.addPoint: Deferred drawing. (line 51) * picture.calculateTransform: Frames and pictures. (line 106) * picture.fit: Frames and pictures. (line 101) * picture.scale: Frames and pictures. (line 111) * piecewisestraight: Paths and guides. (line 92) * pixel: three. (line 674) * Pl: Mathematical functions. (line 51) * plain: plain. (line 6) * planar: three. (line 141) * plane: three. (line 391) * planeproject: three. (line 568) * point: Paths and guides. (line 95) * point <1>: Paths and guides. (line 380) * point <2>: three. (line 585) * polar: Data types. (line 149) * polargraph: graph. (line 89) * polygon: graph. (line 480) * pop: Arrays. (line 39) * Portrait: Frames and pictures. (line 92) * position: three. (line 76) * position <1>: three. (line 197) * postcontrol: Paths and guides. (line 146) * postcontrol <1>: three. (line 585) * postfix operators: Self & prefix operators. (line 19) * postscript: Frames and pictures. (line 285) * PostScript fonts: Pens. (line 275) * PostScript subpath: Paths. (line 23) * pow10: Mathematical functions. (line 6) * prc: three. (line 299) * precision: Files. (line 101) * precontrol: Paths and guides. (line 139) * precontrol <1>: three. (line 585) * prefix operators: Self & prefix operators. (line 6) * private: Structures. (line 6) * programming: Programming. (line 6) * pstoedit: PostScript to Asymptote. (line 6) * psviewer: Configuring. (line 15) * psviewerOptions: Options. (line 174) * pt: Figure size. (line 18) * public: Structures. (line 6) * push: Arrays. (line 39) * Python usage: Interactive mode. (line 72) * quadraticroots: Arrays. (line 330) * quadraticroots <1>: Arrays. (line 335) * quarticroots: math. (line 22) * quick reference: Description. (line 92) * quit: Drawing in interactive mode. (line 11) * quit <1>: Interactive mode. (line 54) * quit <2>: Debugger. (line 53) * quote: Import. (line 120) * quotient: Arithmetic & logical. (line 6) * radialshade: fill. (line 52) * RadialShade: Frames and pictures. (line 160) * RadialShadeDraw: Frames and pictures. (line 164) * radians: Mathematical functions. (line 17) * radius: Paths and guides. (line 135) * radius <1>: three. (line 585) * Rainbow: palette. (line 12) * rand: Mathematical functions. (line 39) * randMax: Mathematical functions. (line 39) * read: Arrays. (line 367) * read <1>: Arrays. (line 407) * reading: Files. (line 12) * reading string arrays: Arrays. (line 377) * readline: Files. (line 143) * real: Data types. (line 35) * realDigits: Data types. (line 35) * realEpsilon: Data types. (line 35) * realMax: Data types. (line 35) * realMin: Data types. (line 35) * realmult: Data types. (line 100) * realschur: Arrays. (line 271) * rectangle: flowchart. (line 34) * recursion: Functions. (line 103) * reference: Description. (line 92) * reflect: Transforms. (line 42) * Relative: label. (line 57) * Relative <1>: label. (line 67) * relpoint: Paths and guides. (line 176) * reltime: Paths and guides. (line 172) * remainder: Mathematical functions. (line 6) * rename: Files. (line 160) * render: three. (line 46) * render <1>: three. (line 197) * render <2>: Options. (line 188) * replace: Data types. (line 270) * resetdefaultpen: Pens. (line 440) * rest arguments: Rest arguments. (line 6) * restore: Frames and pictures. (line 279) * restricted: Structures. (line 6) * return: Debugger. (line 47) * reverse: Data types. (line 266) * reverse <1>: Paths and guides. (line 183) * reverse <2>: Paths and guides. (line 383) * reverse <3>: Arrays. (line 145) * reverse <4>: three. (line 585) * rewind: Files. (line 101) * rfind: Data types. (line 247) * rgb: Pens. (line 30) * rgb <1>: Pens. (line 34) * rgb <2>: Pens. (line 62) * Riemann zeta function: Mathematical functions. (line 51) * Right: graph. (line 272) * RightSide: label. (line 67) * RightTicks: graph. (line 160) * RightTicks <1>: graph. (line 233) * RightView: three. (line 472) * Rotate: label. (line 43) * rotate: three. (line 539) * Rotate(pair z): label. (line 46) * round: Mathematical functions. (line 26) * roundcap: Pens. (line 139) * roundedpath: roundedpath. (line 6) * roundjoin: Pens. (line 149) * roundrectangle: flowchart. (line 66) * RPM: UNIX binary distributions. (line 6) * runtime imports: Import. (line 102) * Russian: Pens. (line 291) * S: Labels. (line 18) * safe: Options. (line 209) * save: Frames and pictures. (line 276) * saveline: Files. (line 143) * Scale: label. (line 52) * scale: Pens. (line 123) * scale <1>: Transforms. (line 34) * scale <2>: Transforms. (line 36) * scale <3>: graph. (line 710) * Scale <1>: graph. (line 727) * scale <4>: three. (line 538) * scale3: three. (line 536) * scaled graph: graph. (line 690) * schur: Arrays. (line 271) * schur <1>: Arrays. (line 275) * scientific graph: graph. (line 387) * scroll: Files. (line 117) * search: Arrays. (line 166) * search <1>: Arrays. (line 172) * search paths: Search paths. (line 6) * Seascape: Frames and pictures. (line 98) * secondary axis: graph. (line 853) * secondaryX: graph. (line 853) * secondaryY: graph. (line 853) * seconds: Data types. (line 330) * seek: Files. (line 101) * seekeof: Files. (line 101) * segment: math. (line 46) * segmentation fault: Help. (line 27) * self operators: Self & prefix operators. (line 6) * sequence: Arrays. (line 118) * settings: Configuring. (line 15) * settings <1>: Options. (line 159) * sgn: Mathematical functions. (line 26) * shading: fill. (line 32) * Shift: label. (line 40) * shift: Transforms. (line 26) * shift <1>: Transforms. (line 28) * shift <2>: Transforms. (line 46) * shift <3>: three. (line 528) * shiftless: Transforms. (line 46) * shininess: three. (line 66) * shipout: Frames and pictures. (line 78) * showtarget: three. (line 425) * Si: Mathematical functions. (line 51) * signedint: Files. (line 80) * signedint <1>: Files. (line 98) * SimpleHead: draw. (line 50) * simplex: simplex. (line 6) * simplex2: simplex2. (line 6) * simpson: Mathematical functions. (line 85) * sin: Mathematical functions. (line 6) * Sin: Mathematical functions. (line 20) * single precision: Files. (line 80) * singleint: Files. (line 80) * singleint <1>: Files. (line 98) * singlereal: Files. (line 80) * singlereal <1>: Files. (line 98) * sinh: Mathematical functions. (line 6) * SixViews: three. (line 487) * SixViewsFR: three. (line 487) * SixViewsUS: three. (line 487) * size: Figure size. (line 6) * size <1>: Paths and guides. (line 81) * size <2>: Paths and guides. (line 371) * size <3>: Frames and pictures. (line 34) * size <4>: Frames and pictures. (line 61) * size <5>: three. (line 585) * size <6>: Options. (line 188) * size3: three. (line 350) * Slant: label. (line 49) * slant: Transforms. (line 38) * sleep: Data types. (line 376) * slice: Paths and guides. (line 251) * slice <1>: Paths and guides. (line 262) * slices: Slices. (line 6) * slide: slide. (line 6) * slope: math. (line 40) * slope <1>: math. (line 43) * slopefield: slopefield. (line 6) * smoothcontour3: smoothcontour3. (line 6) * sncndn: Mathematical functions. (line 51) * solid: Pens. (line 102) * solids: solids. (line 6) * solve: Arrays. (line 299) * solve <1>: Arrays. (line 315) * sort: Arrays. (line 186) * sort <1>: Arrays. (line 190) * sort <2>: Arrays. (line 205) * specular: three. (line 76) * specularfactor: three. (line 76) * specularpen: three. (line 66) * Spline: graph. (line 33) * Spline <1>: graph3. (line 102) * split: Data types. (line 279) * sqrt: Mathematical functions. (line 6) * squarecap: Pens. (line 139) * srand: Mathematical functions. (line 39) * stack overflow: Functions. (line 103) * stack overflow <1>: Functions. (line 103) * stack overflow <2>: Help. (line 27) * static: Static. (line 6) * stats: stats. (line 6) * stdin: Files. (line 52) * stdout: Files. (line 52) * step: Debugger. (line 38) * stickframe: markers. (line 16) * stop: Debugger. (line 10) * straight: Paths and guides. (line 88) * Straight: graph. (line 30) * straight <1>: three. (line 585) * strftime: Data types. (line 321) * strftime <1>: Data types. (line 346) * string: Data types. (line 208) * string <1>: Data types. (line 312) * stroke: fill. (line 36) * stroke <1>: clip. (line 6) * strokepath: Paths and guides. (line 310) * strptime: Data types. (line 330) * struct: Structures. (line 6) * structures: Structures. (line 6) * subpath: Paths and guides. (line 186) * subpath <1>: three. (line 585) * subpictures: Frames and pictures. (line 101) * substr: Data types. (line 262) * sum: Arrays. (line 220) * superpath: Paths. (line 23) * Suppress: Pens. (line 420) * SuppressQuiet: Pens. (line 424) * surface: three. (line 46) * surface <1>: three. (line 117) * surface <2>: three. (line 141) * surface <3>: three. (line 155) * surface <4>: graph3. (line 102) * surface <5>: graph3. (line 131) * SVG: Options. (line 193) * system: Data types. (line 354) * system <1>: Options. (line 209) * syzygy: syzygy. (line 6) * tab: Files. (line 65) * tab completion: Drawing in interactive mode. (line 11) * tan: Mathematical functions. (line 6) * Tan: Mathematical functions. (line 20) * tanh: Mathematical functions. (line 6) * target: three. (line 425) * tell: Files. (line 101) * template: Templated imports. (line 6) * tension: Bezier curves. (line 56) * tension <1>: three. (line 6) * tensionSpecifier: Paths and guides. (line 403) * tensor product shading: fill. (line 78) * tensorshade: fill. (line 78) * tessellation: three. (line 167) * tex: Frames and pictures. (line 293) * tex <1>: Options. (line 188) * TeX fonts: Pens. (line 266) * TeX string: Data types. (line 208) * texcommand: Configuring. (line 69) * TeXHead: draw. (line 50) * TeXHead3: three. (line 651) * texpath: Configuring. (line 69) * texpath <1>: label. (line 122) * texpreamble: Frames and pictures. (line 302) * texreset: Frames and pictures. (line 306) * textbook graph: graph. (line 360) * tgz: UNIX binary distributions. (line 6) * thick: three. (line 179) * thin: three. (line 179) * this: Structures. (line 6) * three: three. (line 6) * ThreeViews: three. (line 487) * ThreeViewsFR: three. (line 487) * ThreeViewsUS: three. (line 487) * tick: graph. (line 330) * ticks: graph. (line 160) * Ticks: graph. (line 160) * Ticks <1>: graph. (line 233) * tildeframe: markers. (line 24) * tile: Pens. (line 338) * tilings: Pens. (line 324) * time: Data types. (line 321) * time <1>: Data types. (line 346) * time <2>: math. (line 26) * time <3>: math. (line 30) * times: Paths and guides. (line 220) * times <1>: Paths and guides. (line 224) * Top: graph. (line 135) * TopView: three. (line 472) * trace: Debugger. (line 50) * trailingzero: graph. (line 175) * transform: Transforms. (line 6) * transform <1>: three. (line 560) * transform3: three. (line 523) * transparency: Pens. (line 307) * transparent: three. (line 97) * transpose: Arrays. (line 212) * transpose <1>: Arrays. (line 215) * tree: tree. (line 6) * trembling: trembling. (line 6) * triangle: geometry. (line 6) * triangles: three. (line 167) * triangulate: contour. (line 189) * tridiagonal: Arrays. (line 286) * trigonometric integrals: Mathematical functions. (line 51) * triple: Data types. (line 137) * TrueMargin: draw. (line 90) * TrueMargin3: three. (line 667) * tube: three. (line 179) * tube <1>: tube. (line 6) * tutorial: Tutorial. (line 6) * type1cm: Pens. (line 245) * typedef: Data types. (line 385) * typedef <1>: Functions. (line 48) * U3D: embed. (line 22) * undefined: Paths and guides. (line 283) * unfill: fill. (line 110) * UnFill: Frames and pictures. (line 153) * UnFill <1>: Frames and pictures. (line 156) * uniform: Arrays. (line 154) * uninstall: Uninstall. (line 6) * unique: math. (line 59) * unit: Data types. (line 83) * unit <1>: Data types. (line 174) * unitbox: Paths. (line 44) * unitbox <1>: three. (line 397) * unitcircle: Paths. (line 17) * unitcircle <1>: Paths. (line 17) * unitcircle <2>: three. (line 365) * unitrand: Mathematical functions. (line 39) * unitsize: Figure size. (line 39) * unitsize <1>: Frames and pictures. (line 56) * UNIX binary distributions: UNIX binary distributions. (line 6) * unpacking: Rest arguments. (line 39) * unravel: Import. (line 29) * up: three. (line 425) * update: Files. (line 38) * UpsideDown: Frames and pictures. (line 92) * UpsideDown <1>: Frames and pictures. (line 99) * URL: Import. (line 94) * usepackage: Frames and pictures. (line 309) * user coordinates: Figure size. (line 39) * user-defined operators: User-defined operators. (line 6) * using: Data types. (line 385) * using <1>: Functions. (line 48) * usleep: Data types. (line 379) * v3d: three. (line 320) * value: math. (line 34) * value <1>: math. (line 37) * var: Variable initializers. (line 55) * variable initializers: Variable initializers. (line 6) * vectorfield: graph. (line 1022) * vectorfield <1>: graph. (line 1061) * vectorfield3: graph3. (line 170) * vectorization: Arrays. (line 343) * verbatim: Frames and pictures. (line 285) * vertex-dependent colors: three. (line 132) * Vertical: flowchart. (line 77) * Viewport: three. (line 76) * viewportheight: LaTeX usage. (line 47) * viewportmargin: three. (line 353) * viewportsize: three. (line 353) * viewportwidth: LaTeX usage. (line 47) * views: three. (line 299) * vim: Editing modes. (line 32) * virtual functions: Structures. (line 146) * void: Data types. (line 10) * W: Labels. (line 18) * warn: Configuring. (line 79) * WebGL: three. (line 246) * whatever: Paths and guides. (line 246) * Wheel: palette. (line 22) * wheel mouse: GUI. (line 6) * while: Programming. (line 49) * White: three. (line 76) * white-space string delimiter mode: Arrays. (line 377) * width: LaTeX usage. (line 47) * windingnumber: Paths and guides. (line 283) * word: Arrays. (line 367) * word <1>: Arrays. (line 377) * write: Files. (line 57) * write <1>: Arrays. (line 416) * X: three. (line 365) * xasy: GUI. (line 6) * xaxis3: graph3. (line 7) * xdr: Files. (line 80) * xelatex: Options. (line 188) * XEquals: graph. (line 265) * xequals: graph. (line 278) * xlimits: graph. (line 639) * XOR: Arithmetic & logical. (line 68) * xpart: Data types. (line 94) * xpart <1>: Data types. (line 185) * xscale: Transforms. (line 30) * xscale3: three. (line 530) * xtick: graph. (line 330) * XY: three. (line 545) * XY <1>: three. (line 560) * XYEquals: graph3. (line 24) * XYZero: graph3. (line 24) * XZEquals: graph3. (line 24) * XZero: graph. (line 260) * XZZero: graph3. (line 24) * Y: Mathematical functions. (line 6) * Y <1>: Mathematical functions. (line 51) * Y <2>: three. (line 365) * yaxis3: graph3. (line 7) * YEquals: graph. (line 128) * yequals: graph. (line 278) * ylimits: graph. (line 639) * ypart: Data types. (line 97) * ypart <1>: Data types. (line 188) * yscale: Transforms. (line 32) * yscale3: three. (line 532) * ytick: graph. (line 330) * YX: three. (line 560) * YZ: three. (line 560) * YZEquals: graph3. (line 24) * YZero: graph. (line 123) * YZZero: graph3. (line 24) * Z: three. (line 365) * zaxis3: graph3. (line 7) * zero_Ai: Mathematical functions. (line 51) * zero_Ai_deriv: Mathematical functions. (line 51) * zero_Bi: Mathematical functions. (line 51) * zero_Bi_deriv: Mathematical functions. (line 51) * zero_J: Mathematical functions. (line 51) * zeroTransform: Transforms. (line 44) * zerowinding: Pens. (line 164) * zeta: Mathematical functions. (line 51) * zpart: Data types. (line 191) * zscale3: three. (line 534) * ZX: three. (line 560) * ZX <1>: three. (line 560) * ZY: three. (line 560)  Tag Table: Node: Top573 Node: Description7655 Node: Installation12070 Node: UNIX binary distributions13215 Node: MacOS X binary distributions14370 Node: Microsoft Windows14982 Node: Configuring16219 Node: Search paths20734 Node: Compiling from UNIX source21826 Node: Editing modes24405 Node: Git26968 Node: Building the documentation27468 Node: Uninstall28034 Node: Tutorial28395 Node: Drawing in batch mode29266 Node: Drawing in interactive mode30173 Node: Figure size31244 Node: Labels32931 Node: Paths33823 Ref: unitcircle34463 Node: Drawing commands36416 Node: draw38284 Ref: arrows39535 Node: fill45841 Ref: gradient shading46923 Node: clip51798 Node: label52575 Ref: Label53489 Ref: baseline57403 Ref: envelope58139 Node: Bezier curves59691 Node: Programming63658 Ref: array iteration65593 Node: Data types65760 Ref: format77398 Node: Paths and guides82388 Ref: circle82650 Ref: extension93002 Node: Pens100195 Ref: fillrule108334 Ref: basealign109292 Ref: transparency114657 Ref: makepen118418 Ref: overwrite119324 Node: Transforms120583 Node: Frames and pictures122678 Ref: size124292 Ref: unitsize125386 Ref: shipout126515 Ref: filltype129001 Ref: add132630 Ref: add about133603 Ref: tex136721 Ref: deferred drawing137632 Node: Deferred drawing137632 Node: Files140923 Ref: cd141958 Ref: scroll147374 Node: Variable initializers150483 Node: Structures153357 Node: Operators159425 Node: Arithmetic & logical159741 Node: Self & prefix operators162279 Node: User-defined operators163139 Node: Implicit scaling164152 Node: Functions164715 Ref: stack overflow168050 Node: Default arguments168336 Node: Named arguments169090 Node: Rest arguments171740 Node: Mathematical functions174897 Node: Arrays181057 Ref: sort189177 Ref: tridiagonal192735 Ref: solve194050 Node: Slices198520 Node: Casts202525 Node: Import204939 Node: Templated imports210581 Node: Static212417 Node: Autounravel215395 Node: When fields are autounraveled216850 Node: Where autounravel is legal217763 Ref: Where autounravel is legal-Footnote-1218593 Node: LaTeX usage218868 Node: Base modules225469 Node: plain228034 Node: simplex228687 Node: simplex2228895 Node: math229193 Node: interpolate232089 Node: geometry232380 Node: trembling233076 Node: stats233353 Node: patterns233624 Node: markers233867 Node: map235767 Node: tree236187 Node: binarytree236371 Node: drawtree237046 Node: syzygy237255 Node: feynman237537 Node: roundedpath237823 Node: animation238113 Ref: animate238561 Node: embed239737 Node: slide240747 Node: MetaPost241090 Node: babel241866 Node: labelpath242114 Node: labelpath3242978 Node: annotate243305 Node: CAD243795 Node: graph244113 Ref: ticks251728 Ref: pathmarkers265916 Ref: marker266390 Ref: markuniform266756 Ref: errorbars268663 Ref: automatic scaling273840 Node: palette285660 Ref: images285782 Ref: image290303 Ref: logimage290824 Ref: penimage291934 Ref: penfunctionimage292197 Node: three292973 Ref: PostScript3D326436 Node: obj328230 Node: graph3328491 Ref: GaussianSurface334518 Node: grid3335696 Node: solids336532 Node: tube337556 Node: flowchart339939 Node: contour344658 Node: contour3351139 Node: smoothcontour3351463 Node: slopefield353230 Node: ode354775 Node: Options355044 Ref: configuration file363540 Ref: settings363540 Ref: texengines364888 Ref: magick364888 Node: Interactive mode368283 Ref: history370512 Node: GUI371883 Node: GUI installation372453 Node: GUI usage373610 Node: Command-Line Interface374677 Node: Language server protocol376122 Node: PostScript to Asymptote377603 Node: Help378432 Node: Debugger380162 Node: Credits382010 Node: Index383268  End Tag Table  Local Variables: coding: utf-8 End: asymptote-3.05/doc/png/Makefile.in0000644000000000000000000000267515031566105015576 0ustar rootrootASYFILES = $(notdir $(filter-out $(wildcard ../latexusage-*.asy),$(wildcard ../*.asy))) SOURCE = ../asymptote.texi ../version.texi ../options ASY = ../asy -dir ../base -config "" -render=0 docdir = $(DESTDIR)@docdir@ infodir = $(DESTDIR)@infodir@ datarootdir = @datarootdir@ INSTALL = @INSTALL@ all: html info %.png: ../%.asy cd .. && $(ASY) -f png -o png/ $(notdir $<) latexusage.png: ../latexusage.pdf gs -q -dNOPAUSE -dBATCH -sDEVICE=pngalpha -dEPSCrop -dSAFER -r72x72 \ -sOutputFile=latexusage.png ../latexusage.pdf index.html: $(SOURCE) $(ASYFILES:.asy=.png) latexusage.png makeinfo --html ../asymptote -o . asymptote.info: $(SOURCE) makeinfo --no-warn --no-split ../asymptote info: $(SOURCE) $(ASYFILES:.asy=.png) latexusage.png makeinfo --no-split ../asymptote ../options: cd .. && $(MAKE) options html: index.html clean: FORCE -rm -f *.png *.html asymptote.info* texput.aux texput.log distclean: FORCE clean -rm -f Makefile install: asymptote.info ${INSTALL} -d -m 755 $(infodir)/asymptote ${INSTALL} -p -m 644 asymptote.info $(infodir)/asymptote -if test -z "$(DESTDIR)"; then \ install-info --infodir=$(infodir) asymptote.info; \ fi install-all: all install ${INSTALL} -p -m 644 *.png $(infodir)/asymptote uninstall: -install-info --remove --infodir=$(infodir) asymptote.info -cd $(infodir)/asymptote && rm -f asymptote.info *.png -rmdir $(infodir)/asymptote FORCE: Makefile: Makefile.in cd ../..; config.status asymptote-3.05/doc/parametricgraph.asy0000644000000000000000000000036015031566105016621 0ustar rootrootimport graph; size(0,200); real x(real t) {return cos(2pi*t);} real y(real t) {return sin(2pi*t);} draw(graph(x,y,0,1)); //limits((0,-1),(1,0),Crop); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks(trailingzero)); asymptote-3.05/doc/colors.asy0000644000000000000000000000312415031566105014752 0ustar rootrootint i=0; int j=0; bool components=false; pen p; void col(... string[] s) { for(int n=0; n < s.length; ++n) { j -= 10; string s=s[n]; eval("p="+s+";",true); if(components) { real[] a=colors(p); for(int i=0; i < a.length; ++i) s += " "+(string) a[i]; } label(s,(i+10,j),E); filldraw(box((i,j-5),(i+10,j+5)),p); } } col("palered"); col("lightred"); col("mediumred"); col("red"); col("heavyred"); col("brown"); col("darkbrown"); j -= 10; col("palegreen"); col("lightgreen"); col("mediumgreen"); col("green"); col("heavygreen"); col("deepgreen"); col("darkgreen"); j -= 10; col("paleblue"); col("lightblue"); col("mediumblue"); col("blue"); col("heavyblue"); col("deepblue"); col("darkblue"); j -= 10; i += 150; j=0; col("palecyan"); col("lightcyan"); col("mediumcyan"); col("cyan"); col("heavycyan"); col("deepcyan"); col("darkcyan"); j -= 10; col("pink"); col("lightmagenta"); col("mediummagenta"); col("magenta"); col("heavymagenta"); col("deepmagenta"); col("darkmagenta"); j -= 10; col("paleyellow"); col("lightyellow"); col("mediumyellow"); col("yellow"); col("lightolive"); col("olive"); col("darkolive"); j -= 10; col("palegray"); col("lightgray"); col("mediumgray"); col("gray"); col("heavygray"); col("deepgray"); col("darkgray"); j -= 10; i += 150; j=0; col("black"); col("white"); j -= 10; col("orange"); col("fuchsia"); j -= 10; col("chartreuse"); col("springgreen"); j -= 10; col("purple"); col("royalblue"); j -= 10; col("Cyan"); col("Magenta"); col("Yellow"); col("Black"); j -= 10; col("cmyk(red)"); col("cmyk(blue)"); col("cmyk(green)"); asymptote-3.05/doc/CAD.tex0000644000000000000000000002372415031566105014054 0ustar rootroot\documentclass{ltxguide} \usepackage{graphicx} \begin{document} \title{Asymptote package CAD.asy\footnote{This document describes version 1.0.}} \author{Mark Henning, Germany\thanks{URL: http://www.markhenning.de}} \date{29 September 2006} \maketitle \tableofcontents \section{Introduction} The package {\tt CAD.asy} provides basic pen definitions and measurement functions for simple 2D CAD drawings according to DIN 15. \section{Important rules for using this package} If a function is declared like this: % \begin{verbatim} void foo(int nParam1, string strParam2) \end{verbatim} % You may call it \verb\foo(0, 'abc');\ or \verb\foo(nParam1=0, strParam2='abc');\. The definitions of the functions in this package may change in future version: the order of the parameters may be changed, new parameters may be inserted. Therefore it is \emph{strongly recommended} always calling the functions \verb\foo(nParam1=0, strParam2='abc');\. \section{Usage} To use the capabilities of the package, import it: % \begin{verbatim} import CAD; \end{verbatim} % All functions are encapsulated in the structure \verb\sCAD\. As the pen definitions may differ depending on the size of your drawing, you have to initialize the structure before drawing: \begin{verbatim} static sCAD Create(int nLineGroup = 1) \end{verbatim} % The parameter \verb\nLineGroup\ depends on the size of your drawing. It specifies the line group to define the pens and thus the width used for the lines. The parameter has to be within the range $[0;3]$. The larger the value, the thicker the lines. Code example: % \begin{quote}\begin{verbatim} sCAD cad = sCAD.Create(); \end{verbatim}\end{quote} The created variable \verb\cad\ then provides the most important pens. Available pens are: % \begin{itemize} \item The pens of group A: \begin{itemize} \item\verb\pA\ \item\verb\pVisibleEdge\ \item\verb\pVisibleContour\ \item\verb\pUsableWindingLength\ \item\verb\pSystemLine\ \item\verb\pDiagramCurve\ \item\verb\pSurfaceStructure\ \end{itemize} \item The pens of group B: \begin{itemize} \item\verb\pB\ \item\verb\pLightEdge\ \item\verb\pMeasureLine\ \item\verb\pMeasureHelpLine\ \item\verb\pMeasureLineBound\ \item\verb\pReferenceLine\ \item\verb\pHatch\ \item\verb\pWindingGround\ \item\verb\pDiagonalCross\ \item\verb\pBendLine\ \item\verb\pProjectionLine\ \item\verb\pGrid\ \end{itemize} \item The pens of group C: \begin{itemize} \item\verb\pC\ \item\verb\pFreehand\ \end{itemize} \item The pens of group E: \begin{itemize} \item\verb\pE\ \item\verb\pSurfaceTreatmentAllowed\ \end{itemize} \item The pens of group F: \begin{itemize} \item\verb\pF\ \item\verb\pInvisibleEdge\ \item\verb\pInvisibleContour\ \end{itemize} \item The pens of group G: \begin{itemize} \item\verb\pG\ \item\verb\pMiddleLine\ \item\verb\pSymmetryLine\ \item\verb\pPartialCircle\ \item\verb\pCircularHole\ \item\verb\pDivisionPlane\ \item\verb\pTransferLine\ \end{itemize} \item The pens of group J: \begin{itemize} \item\verb\pJ\ \item\verb\pCuttingPlane\ \item\verb\pSurfaceTreatmentRequested\ \end{itemize} \item The pens of group K: \begin{itemize} \item\verb\pK\ \item\verb\pContourBeforeDeformation\ \item\verb\pAdjacentPartContour\ \item\verb\pEndShapeRawMaterial\ \item\verb\pContourEligibleType\ \item\verb\pPartInFrontOfCuttingPlane\ \end{itemize} \end{itemize} % All pens of one group are the same. So there is no difference between the pen \verb\pA\ and the pen \verb\pVisibleEdge\. You may use the short names or the descriptive ones. The list of groups is not complete. I had no idea how to implement the pens of group D. For me, group H seems to be obsolete, and there is no group I contained in DIN 15. In the case I did something wrong translating the German names into English, the source file also contains the original German names of each pen. Whenever a drawing function does not allow you to select the pen, the right pen is selected automatically. \begin{verbatim} void MeasureLine(picture pic = currentpicture, Label L, pair pFrom, pair pTo, real dblLeft = 0, real dblRight = 0, real dblRelPosition = 0.5, bool bSmallBound = false) \end{verbatim} % This is the basic function to draw labeled straight measurement lines. \verb\pic\ denotes the picture the line has to be drawn into, \verb\L\ is the label of the line. The pairs \verb\pFrom\ and \verb\pTo\ are the start and the end point of the distance to measure, respectively. Note, that these two points do \emph{not} refer to the start and end point of the line, as it may be longer than the measured distance. The line is extended on its left side (= the part of the line 'before' the start point) by the distance \verb\dblLeft\. On its right side (= the part of the line 'behind' the end point) it is extended by the distance \verb\dblRight\. \verb\dblLeft\ and \verb\dblRight\ must be $\leq 0$. If only one of both values is zero, it is set to the value of the other one, because according to DIN 15 it is not allowed to draw a measurement line asymmetrically. The position of the arrows indicating begin and end of the distance depends on \verb\dblLeft\ and \verb\dblRight\. If both values are 0, the measurement arrows are drawn within the measurement distance. Otherwise they are drawn outside. The parameter \verb\dblRelPosition\ refers to the relative position of the label between the start and end point. This means: The value 0 positions the label at the start point, 0.5 refers to the center between the start and the end point. Finally, the value 1 will position the label at the end point. If \verb\dblLeft\ or \verb\dblRight\ are nonzero, you may position the label at the left side of the start point ($< 0$) or at the right side of the start point ($> 1$). Usually, there is enough space to draw the measurement arrows. If you wish to use small circles instead of the arrows, set \verb\bSmallBound\ to \verb\true\. \begin{verbatim} real GetMeasurementBoundSize(bool bSmallBound = false) \end{verbatim} % Returns the size of the arrow or the small bound circle used for measurement lines. \begin{verbatim} guide GetMeasurementBound(bool bSmallBound = false) \end{verbatim} % Returns the correctly scaled guide of the arrow or the small bound circle used for measurement lines. \begin{verbatim} void MeasureParallel(picture pic = currentpicture, Label L, pair pFrom, pair pTo, real dblDistance, // Variables from MeasureLine real dblLeft = 0, real dblRight = 0, real dblRelPosition = 0.5, bool bSmallBound = false) \end{verbatim} % Usually, measurement lines are placed outside the drawing with reference lines to the measured distance. \verb\pFrom\ and \verb\pTo\ denote the points of the drawing marking the begin and the end of the distance to measure, and not the begin and the end of the measurement line as in the case of the function \verb\MeasureLine\. The measurement line is placed \verb\dblDistance\ away from the distance to measure. If you would be at \verb\pFrom\ and look into the direction \verb\pTo\, it is placed on the left for positive values of \verb\dblDistance\. For negative values, it is positioned on the right. For the meaning of the other parameters see the function \verb\MeasureLine\. \begin{verbatim} guide MakeFreehand(pair pFrom, pair pTo, real dblRelDivisionLength = 12.5, real dblRelDistortion = 2.5, bool bIncludeTo = true) \end{verbatim} % To draw a line between two points, which is not straight, but more like a freehand line, use this function. The pairs \verb\pFrom\ and \verb\pTo\ denote start and end point, respectively. \verb\dblRelDivisionLength\ is the length of the parts, the line is subdivided into. \verb\dblRelDistortion\ is the amount of distortion. Both sizes are given relative to the width of a freehand line. If \verb\bIncludeTo\ is \verb\true\, the point \verb\pTo\ is added to the path. Otherwise it is not. This may be useful for converting a guide containing more than two points to a freehand line. \section{Example} \begin{figure} \includegraphics{CAD1} \caption{Example showing the measurement capabilities and a small freehand line.\label{fig:example1}} \end{figure} To produce figure \ref{fig:example1}, use this code: \begin{quote} \begin{verbatim} import CAD; sCAD cad = sCAD.Create(); // Freehand line draw(g = cad.MakeFreehand(pFrom = (3, -1)*cm, (6, -1)*cm), p = cad.pFreehand); // Standard measurement lines draw(g = box((0, 0)*cm, (1, 1)*cm), p = cad.pVisibleEdge); cad.MeasureParallel(L = "$\sqrt{2}$", pFrom = (0, 1)*cm, pTo = (1, 0)*cm, dblDistance = -15mm); // Label inside, shifted to the right; arrows outside draw(g = box((2, 0)*cm, (3, 1)*cm), p = cad.pVisibleEdge); cad.MeasureParallel(L = "1", pFrom = (2, 1)*cm, pTo = (3, 1)*cm, dblDistance = 5mm, dblLeft = 5mm, dblRelPosition = 0.75); // Label and arrows outside draw(g = box((5, 0)*cm, (5.5, 1)*cm), p = cad.pVisibleEdge); cad.MeasureParallel(L = "0.5", pFrom = (5, 1)*cm, pTo = (5.5, 1)*cm, dblDistance = 5mm, dblLeft = 10mm, dblRelPosition = -1); // Small bounds, asymmetric measurement line draw(g = box((7, 0)*cm, (7.5, 1)*cm), p = cad.pVisibleEdge); cad.MeasureParallel(L = "0.5", pFrom = (7, 1)*cm, pTo = (7.5, 1)*cm, dblDistance = 5mm, dblLeft = 2*cad.GetMeasurementBoundSize( bSmallBound = true), dblRight = 10mm, dblRelPosition = 2, bSmallBound = true); \end{verbatim} \end{quote} \end{document} asymptote-3.05/doc/makepen.asy0000644000000000000000000000044515031566105015074 0ustar rootrootsize(200); pen convex=makepen(scale(10)*polygon(8))+grey; draw((1,0.4),convex); draw((0,0)---(1,1)..(2,0)--cycle,convex); pen nonconvex=scale(10)* makepen((0,0)--(0.25,-1)--(0.5,0.25)--(1,0)--(0.5,1.25)--cycle)+red; draw((0.5,-1.5),nonconvex); draw((0,-1.5)..(1,-0.5)..(2,-1.5),nonconvex); asymptote-3.05/doc/graphwithderiv.asy0000644000000000000000000000033315031566105016477 0ustar rootrootunitsize(2cm); import graph; pair F(real t) { return (1.3*t,-4.5*t^2+3.0*t+1.0); } pair Fprime(real t) { return (1.3,-9.0*t+3.0); } path g=graphwithderiv(F,Fprime,0,0.9,4); dot(g,red); draw(g,arrow=Arrow(TeXHead)); asymptote-3.05/doc/latexusage.tex0000644000000000000000000000606515031566105015626 0ustar rootroot\documentclass[12pt]{article} % Use this form to include EPS (latex) or PDF (pdflatex) files: %\usepackage{asymptote} % Use this form with latex or pdflatex to include inline LaTeX code by default: \usepackage[inline]{asymptote} % Use this form with latex or pdflatex to create PDF attachments by default: %\usepackage[attach]{asymptote} % Enable this line to support the attach option: %\usepackage[dvips]{attachfile2} \begin{document} % Optional subdirectory for latex files (no spaces): \def\asylatexdir{} % Optional subdirectory for asy files (no spaces): \def\asydir{} \begin{asydef} // Global Asymptote definitions can be put here. settings.prc=true; import three; usepackage("bm"); texpreamble("\def\V#1{\bm{#1}}"); // One can globally override the default toolbar settings here: // settings.toolbar=true; \end{asydef} Here is a venn diagram produced with Asymptote, drawn to width 4cm: \def\A{A} \def\B{\V{B}} %\begin{figure} \begin{center} \begin{asy} size(4cm,0); pen colour1=red; pen colour2=green; pair z0=(0,0); pair z1=(-1,0); pair z2=(1,0); real r=1.5; path c1=circle(z1,r); path c2=circle(z2,r); fill(c1,colour1); fill(c2,colour2); picture intersection=new picture; fill(intersection,c1,colour1+colour2); clip(intersection,c2); add(intersection); draw(c1); draw(c2); //draw("$\A$",box,z1); // Requires [inline] package option. //draw(Label("$\B$","$B$"),box,z2); // Requires [inline] package option. draw("$A$",box,z1); draw("$\V{B}$",box,z2); pair z=(0,-2); real m=3; margin BigMargin=Margin(0,m*dot(unit(z1-z),unit(z0-z))); draw(Label("$A\cap B$",0),conj(z)--z0,Arrow,BigMargin); draw(Label("$A\cup B$",0),z--z0,Arrow,BigMargin); draw(z--z1,Arrow,Margin(0,m)); draw(z--z2,Arrow,Margin(0,m)); shipout(bbox(0.25cm)); \end{asy} %\caption{Venn diagram}\label{venn} \end{center} %\end{figure} Each graph is drawn in its own environment. One can specify the width and height to \LaTeX\ explicitly. This 3D example can be viewed interactively either with Adobe Reader or Asymptote's fast OpenGL-based renderer. To support {\tt latexmk}, 3D figures should specify \verb+inline=true+. It is sometimes desirable to embed 3D files as annotated attachments; this requires the \verb+attach=true+ option as well as the \verb+attachfile2+ \LaTeX\ package. \begin{center} \begin{asy}[height=4cm,inline=true,attach=false,viewportwidth=\linewidth] currentprojection=orthographic(5,4,2); draw(unitcube,blue); label("$V-E+F=2$",(0,1,0.5),3Y,blue+fontsize(17pt)); \end{asy} \end{center} One can also scale the figure to the full line width: \begin{center} \begin{asy}[width=\the\linewidth,inline=true] pair z0=(0,0); pair z1=(2,0); pair z2=(5,0); pair zf=z1+0.75*(z2-z1); draw(z1--z2); dot(z1,red+0.15cm); dot(z2,darkgreen+0.3cm); label("$m$",z1,1.2N,red); label("$M$",z2,1.5N,darkgreen); label("$\hat{\ }$",zf,0.2*S,fontsize(24pt)+blue); pair s=-0.2*I; draw("$x$",z0+s--z1+s,N,red,Arrows,Bars,PenMargins); s=-0.5*I; draw("$\bar{x}$",z0+s--zf+s,blue,Arrows,Bars,PenMargins); s=-0.95*I; draw("$X$",z0+s--z2+s,darkgreen,Arrows,Bars,PenMargins); \end{asy} \end{center} \end{document} asymptote-3.05/doc/scaledgraph.asy0000644000000000000000000000054315031566105015730 0ustar rootrootimport graph; axiscoverage=0.9; size(200,IgnoreAspect); real[] x={-1e-11,1e-11}; real[] y={0,1e6}; real xscale=round(log10(max(x))); real yscale=round(log10(max(y)))-1; draw(graph(x*10^(-xscale),y*10^(-yscale)),red); xaxis("$x/10^{"+(string) xscale+"}$",BottomTop,LeftTicks); yaxis("$y/10^{"+(string) yscale+"}$",LeftRight,RightTicks(trailingzero)); asymptote-3.05/doc/asy.10000644000000000000000000002316415031566761013627 0ustar rootroot.\" Hey, EMACS: -*- nroff -*- .TH ASY 1 "1 Dec 2004" .SH NAME asy \- Asymptote: a script-based vector graphics language .SH SYNOPSIS .B asy .RI [ options ] .RI [ file \ ...] .SH DESCRIPTION \fBAsymptote\fP is a powerful descriptive vector graphics language for technical drawings, inspired by MetaPost but with an improved C++-like syntax. Asymptote provides for figures the same high-quality level of typesetting that LaTeX does for scientific text. .SH OPTIONS If no arguments are given, Asymptote runs in interactive mode. .PP If "\-" is given as the file argument, Asymptote reads from standard input. .PP A summary of options is included below. The effect of most options can be negated by prepending .B no to the option name. Default values for most options may also be entered in the file .B .asy/config.asy in the user's home directory using the long form: .PP import settings; batchView=true; .PP For a complete description, see the Info files. .TP .B \-GPUblockSize n Compute shader block size [8]. .TP .B \-GPUcompress Compress GPU transparent fragment counts [false]. .TP .B \-GPUindexing Compute indexing partial sums on GPU [true]. .TP .B \-GPUinterlock Use fragment shader interlock [true]. .TP .B \-GPUlocalSize n Compute shader local size [256]. .TP .B \-V,\-View View output; command-line only. .TP .B \-absolute Use absolute WebGL dimensions [false]. .TP .B \-a,\-align C|B|T|Z Center, Bottom, Top, or Zero page alignment [C]. .TP .B \-aligndir pair Directional page alignment (overrides align) [(0,0)]. -animating [false] .TP .B \-antialias n Antialiasing width for rasterized output [2]. .TP .B \-auto3D Automatically activate 3D scene [true]. .TP .B \-autobillboard 3D labels always face viewer by default [true]. .TP .B \-autoimport str Module to automatically import. .TP .B \-autoplain Enable automatic importing of plain [true]. .TP .B \-autoplay Autoplay 3D animations [false]. .TP .B \-autorotate Enable automatic PDF page rotation [false]. .TP .B \-axes3 Show 3D axes in PDF output [true]. .TP .B \-batchMask Mask fpu exceptions in batch mode [false]. .TP .B \-batchView View output in batch mode [false]. .TP .B \-bw Convert all colors to black and white false. .TP .B \-cd directory Set current directory; command-line only. .TP .B \-cmyk Convert rgb colors to cmyk false. .TP .B \-c,\-command str Command to autoexecute. .TP .B \-compact Conserve memory at the expense of speed false. .TP .B \-compress Compress images in PDF output [true]. -convertOptions str [] .TP .B \-d,\-debug Enable debugging messages and traceback false. .TP .B \-devicepixelratio n Ratio of physical to logical pixels [1]. .TP .B \-digits n Default output file precision [7]. .TP .B \-divisor n Garbage collect using purge(divisor=n) [2]. -dvipsOptions str [] .TP .B \-dvisvgmMultipleFiles dvisvgm supports multiple files [true]. -dvisvgmOptions str [--optimize] .TP .B \-embed Embed rendered preview image [true]. .TP .B \-e,\-environment Show summary of environment settings; command-line only. .TP .B \-exitonEOF Exit interactive mode on EOF [true]. .TP .B \-fitscreen Fit rendered image to screen [true]. .TP .B \-framerate frames/s Animation speed [30]. -glOptions str [] .TP .B \-globalread Allow read from other directory true. .TP .B \-globalwrite Allow write to other directory false. .TP .B \-gray Convert all colors to grayscale false. -gsOptions str [] .TP .B \-h,\-help Show summary of options; command-line only. .TP .B \-historylines n Retain n lines of history [1000]. -htmlviewerOptions str -hyperrefOptions str [setpagesize=false,unicode,pdfborder=0 0 0] .TP .B \-ibl Enable environment map image-based lighting [false]. .TP .B \-iconify Iconify rendering window [false]. .TP .B \-image str Environment image name [snowyField]. .TP .B \-imageDir str Environment image library directory [ibl]. .TP .B \-inlineimage Generate inline embedded image [false]. .TP .B \-inlinetex Generate inline TeX code [false]. .TP .B \-inpipe n Input pipe [-1]. .TP .B \-interactiveMask Mask fpu exceptions in interactive mode [true]. .TP .B \-interactiveView View output in interactive mode [true]. .TP .B \-interactiveWrite Write expressions entered at the prompt to stdout [true]. -interrupt [false] .TP .B \-k,\-keep Keep intermediate files [false]. .TP .B \-keepaux Keep intermediate LaTeX .aux files [false]. .TP .B \-keys Generate WebGL keys false. .TP .B \-level n Postscript level [3]. .TP .B \-l,\-listvariables List available global functions and variables [false]. .TP .B \-localhistory Use a local interactive history file [false]. .TP .B \-loop Loop 3D animations [false]. .TP .B \-lossy Use single precision for V3D reals [false]. .TP .B \-lsp Interactive mode for the Language Server Protocol [false]. .TP .B \-m,\-mask Mask fpu exceptions; command-line only. .TP .B \-maxtile pair Maximum rendering tile size [(1024,768)]. .TP .B \-maxviewport pair Maximum viewport size [(0,0)]. .TP .B \-multiline Input code over multiple lines at the prompt [false]. .TP .B \-multipleView View output from multiple batch-mode files [false]. .TP .B \-multisample n Multisampling width for screen images [4]. .TP .B \-offline Produce offline html files [false]. .TP .B \-O,\-offset pair PostScript offset [(0,0)]. .TP .B \-f,\-outformat format Convert each output file to specified format. .TP .B \-o,\-outname name Alternative output directory/file prefix. .TP .B \-outpipe n Output pipe [-1]. .TP .B \-paperheight bp Default page height [0]. .TP .B \-paperwidth bp Default page width [0]. .TP .B \-p,\-parseonly Parse file [false]. .TP .B \-pdfreload Automatically reload document in pdfviewer [false]. -pdfreloadOptions str [] .TP .B \-pdfreloaddelay usec Delay before attempting initial pdf reload [750000]. -pdfviewerOptions str [] .TP .B \-position pair Initial 3D rendering screen position [(0,0)]. .TP .B \-prc Embed 3D PRC graphics in PDF output [false]. .TP .B \-prerender resolution Prerender V3D objects (0 implies vector output) [0]. .TP .B \-prompt str Prompt [> ]. .TP .B \-prompt2 str Continuation prompt for multiline input [..]. -psviewerOptions str [] .TP .B \-q,\-quiet Suppress welcome text and noninteractive stdout [false]. .TP .B \-render n Render 3D graphics using n pixels per bp (-1=auto) [-1]. .TP .B \-resizestep step Resize step [1.2]. .TP .B \-reverse reverse 3D animations [false]. .TP .B \-rgb Convert cmyk colors to rgb false. .TP .B \-safe Disable system call true. .TP .B \-scroll n Scroll standard output n lines at a time [0]. .TP .B \-shiftHoldDistance n WebGL touch screen distance limit for shift mode [20]. .TP .B \-shiftWaitTime ms WebGL touch screen shift mode delay [200]. .TP .B \-spinstep deg/s Spin speed [60]. .TP .B \-svgemulation Emulate unimplemented SVG shading [true]. .TP .B \-tabcompletion Interactive prompt auto-completion [true]. .TP .B \-tex engine latex|pdflatex|xelatex|lualatex|tex|pdftex|luatex|context|none [latex]. .TP .B \-thick Render thick 3D lines [true]. .TP .B \-thin Render thin 3D lines [true]. .TP .B \-threads Use POSIX threads for 3D rendering [true]. .TP .B \-toolbar Show 3D toolbar in PDF output [true]. .TP .B \-s,\-translate Show translated virtual machine code [false]. .TP .B \-twice Run LaTeX twice (to resolve references) [false]. .TP .B \-twosided Use two-sided 3D lighting model for rendering [true]. .TP .B \-u,\-user str General purpose user string. .TP .B \-v3d Embed 3D V3D graphics in PDF output [false]. .TP .B \-v,\-verbose Increase verbosity level (can specify multiple times) 0. .TP .B \-version Show version; command-line only. .TP .B \-vibrateTime ms WebGL shift mode vibrate duration [25]. .TP .B \-viewportmargin pair Horizontal and vertical 3D viewport margin [(0.5,0.5)]. .TP .B \-wait Wait for child processes to finish before exiting [false]. .TP .B \-warn str Enable warning; command-line only. .TP .B \-webgl2 Use webgl2 if available [false]. .TP .B \-where Show where listed variables are declared [false]. .TP .B \-wsl Run asy under the Windows Subsystem for Linux [false]. .TP .B \-xasy Interactive mode for xasy false. .TP .B \-zoomPinchCap limit WebGL maximum zoom pinch [100]. .TP .B \-zoomPinchFactor n WebGL zoom pinch sensitivity [10]. .TP .B \-zoomfactor factor Zoom step factor [1.05]. .TP .B \-zoomstep step Mouse motion zoom step [0.1]. .SH SEE ALSO Asymptote is documented fully in the asymptote Info page. The manual can also be accessed in interactive mode with the "help" command. .SH AUTHOR Asymptote was written by Andy Hammerlindl, John Bowman, and Tom Prince. .PP This manual page was written by Hubert Chan for the Debian project (but may be used by others). asymptote-3.05/doc/subpictures.asy0000644000000000000000000000052515031566105016023 0ustar rootrootpicture pic1; real size=50; size(pic1,size); fill(pic1,(0,0)--(50,100)--(100,0)--cycle,red); picture pic2; size(pic2,size); fill(pic2,unitcircle,green); picture pic3; size(pic3,size); fill(pic3,unitsquare,blue); picture pic; add(pic,pic1.fit(),(0,0),N); add(pic,pic2.fit(),(0,0),10S); add(pic.fit(),(0,0),N); add(pic3.fit(),(0,0),10S); asymptote-3.05/doc/quartercircle.asy0000644000000000000000000000006115031566105016313 0ustar rootrootsize(100,0); draw((1,0){up}..{left}(0,1),Arrow); asymptote-3.05/doc/datagraph.asy0000644000000000000000000000033215031566105015402 0ustar rootrootimport graph; size(200,150,IgnoreAspect); real[] x={0,1,2,3}; real[] y=x^2; draw(graph(x,y),red); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight, RightTicks(Label(fontsize(8pt)),new real[]{0,4,9})); asymptote-3.05/doc/westnile.asy0000644000000000000000000000332215031566105015303 0ustar rootrootimport graph; size(9cm,8cm,IgnoreAspect); string data="westnile.csv"; file in=input(data).line().csv(); string[] columnlabel=in; real[][] A=in; A=transpose(A); real[] number=A[0], survival=A[1]; path g=graph(number,survival); draw(g); scale(true); xaxis("Initial no.\ of mosquitoes per bird ($S_{M_0}/N_{B_0}$)", Bottom,LeftTicks); xaxis(Top); yaxis("Susceptible bird survival",Left,RightTicks(trailingzero)); yaxis(Right); real a=number[0]; real b=number[number.length-1]; real S1=0.475; path h1=(a,S1)--(b,S1); real M1=interp(a,b,intersect(h1,g)[0]); real S2=0.9; path h2=(a,S2)--(b,S2); real M2=interp(a,b,intersect(h2,g)[0]); labelx("$M_1$",M1); labelx("$M_2$",M2); draw((a,S2)--(M2,S2)--(M2,0),Dotted); draw((a,S1)--(M1,S1)--(M1,0),dashed); pen p=fontsize(10pt); real y3=0.043; path reduction=(M1,y3)--(M2,y3); draw(reduction,Arrow,TrueMargin(0,0.5*(linewidth(Dotted)+linewidth()))); arrow(shift(-20,5)*Label(minipage("\flushleft{\begin{itemize}\item[1.] Estimate proportion of birds surviving at end of season\end{itemize}}",100), align=NNE), (M1,S1),NNE,1cm,p,Arrow(NoFill)); arrow(shift(-24,5)*Label(minipage("\flushleft{\begin{itemize}\item[2.] Read off initial mosquito abundance\end{itemize}}",80),align=NNE), (M1,0),NE,2cm,p,Arrow(NoFill)); arrow(shift(20,0)*Label(minipage("\flushleft{\begin{itemize}\item[3.] Determine desired bird survival for next season\end{itemize}}",90),align=SW), (M2,S2),SW,arrowlength,p,Arrow(NoFill)); arrow(shift(8,-15)*Label(minipage("\flushleft{\begin{itemize}\item[4.] Calculate required proportional reduction in mosquitoes\end{itemize}}",90), align=NW), point(reduction,0.5),NW,1.5cm,p,Arrow(NoFill)); asymptote-3.05/doc/tile.asy0000644000000000000000000000060615031566105014410 0ustar rootrootsize(0,90); import patterns; add("tile",tile()); add("filledtilewithmargin",tile(6mm,4mm,red,Fill),(1mm,1mm),(1mm,1mm)); add("checker",checker()); add("brick",brick()); real s=2.5; filldraw(unitcircle,pattern("tile")); filldraw(shift(s,0)*unitcircle,pattern("filledtilewithmargin")); filldraw(shift(2s,0)*unitcircle,pattern("checker")); filldraw(shift(3s,0)*unitcircle,pattern("brick")); asymptote-3.05/doc/asymptote.texi0000644000000000000000000143545115031566105015670 0ustar rootroot\input texinfo @c -*-texinfo-*- @setfilename asymptote.info @settitle Asymptote: the Vector Graphics Language @include version.texi @finalout @codequoteundirected on @copying This file documents @code{Asymptote}, version @value{VERSION}. @url{https://asymptote.sourceforge.io} Copyright @copyright{} 2004-25 Andy Hammerlindl, John Bowman, and Tom Prince. @quotation Permission is granted to copy, distribute and/or modify this document under the terms of the @acronym{GNU} Lesser General Public License (see the file LICENSE in the top-level source directory). @end quotation @end copying @dircategory Languages @direntry * asymptote: (asymptote/asymptote). Vector graphics language. @end direntry @titlepage @title Asymptote: the Vector Graphics Language @subtitle For version @value{VERSION} @sp 1 @center @image{./logo} @page @vskip 0pt plus 1filll @insertcopying @end titlepage @c So the toc is printed at the start. @contents @ifnottex @node Top @top Asymptote @insertcopying @end ifnottex @menu * Description:: What is @code{Asymptote}? * Installation:: Downloading and installing * Tutorial:: Getting started * Drawing commands:: Four primitive graphics commands * Bezier curves:: Path connectors and direction specifiers * Programming:: The @code{Asymptote} vector graphics language * LaTeX usage:: Embedding @code{Asymptote} commands within @code{LaTeX} * Base modules:: Base modules shipped with @code{Asymptote} * Options:: Command-line options * Interactive mode:: Typing @code{Asymptote} commands interactively * GUI:: Graphical user interface * Command-Line Interface:: Remote command-line interface * Language server protocol:: Help when writing code * PostScript to Asymptote:: @code{Asymptote} backend to @code{pstoedit} * Help:: Where to get help and submit bug reports * Debugger:: Squish those bugs! * Credits:: Contributions and acknowledgments * Index:: General index @detailmenu --- The Detailed Node Listing --- Installation * UNIX binary distributions:: Prebuilt @code{UNIX} binaries * MacOS X binary distributions:: Prebuilt @code{MacOS X} binaries * Microsoft Windows:: Prebuilt @code{Microsoft Windows} binary * Configuring:: Configuring @code{Asymptote} for your system * Search paths:: Where @code{Asymptote} looks for your files * Compiling from UNIX source:: Building @code{Asymptote} from scratch * Editing modes:: Convenient @code{emacs} and @code{vim} modes * Git:: Getting the latest development source * Building the documentation:: Building the documentation * Uninstall:: Goodbye, @code{Asymptote}! Tutorial * Drawing in batch mode:: Run @code{Asymptote} on a text file * Drawing in interactive mode:: Running @code{Asymptote} interactively * Figure size:: Specifying the figure size * Labels:: Adding @code{LaTeX} labels * Paths:: Drawing lines and curves Drawing commands * draw:: Draw a path on a picture or frame * fill:: Fill a cyclic path on a picture or frame * clip:: Clip a picture or frame to a cyclic path * label:: Label a point on a picture Programming * Data types:: void, bool, int, real, pair, triple, string * Paths and guides:: Bezier curves * Pens:: Colors, line types, line widths, font sizes * Transforms:: Affine transforms * Frames and pictures:: Canvases for immediate and deferred drawing * Deferred drawing:: Witholding drawing until all data is available * Files:: Reading and writing your data * Variable initializers:: Initialize your variables * Structures:: Organize your data * Operators:: Arithmetic and logical operators * Implicit scaling:: Avoiding those ugly *s * Functions:: Traditional and higher-order functions * Arrays:: Dynamic vectors * Casts:: Implicit and explicit casts * Import:: Importing external @code{Asymptote} modules * Static:: Where to allocate your variable? Operators * Arithmetic & logical:: Basic mathematical operators * Self & prefix operators:: Increment and decrement * User-defined operators:: Overloading operators Functions * Default arguments:: Default values can appear anywhere * Named arguments:: Assigning function arguments by keyword * Rest arguments:: Functions with a variable number of arguments * Mathematical functions:: Standard libm functions Arrays * Slices:: Python-style array slices Import * Templated imports:: Base modules * plain:: Default @code{Asymptote} base file * simplex:: Linear programming: simplex method * simplex2:: Two-variable simplex method * math:: Extend @code{Asymptote}'s math capabilities * interpolate:: Interpolation routines * geometry:: Geometry routines * trembling:: Wavy lines * stats:: Statistics routines and histograms * patterns:: Custom fill and draw patterns * markers:: Custom path marker routines * map:: Map keys to values * tree:: Dynamic binary search tree * binarytree:: Binary tree drawing module * drawtree:: Tree drawing module * syzygy:: Syzygy and braid drawing module * feynman:: Feynman diagrams * roundedpath:: Round the sharp corners of paths * animation:: Embedded @acronym{PDF} and @acronym{MPEG} movies * embed:: Embedding movies, sounds, and 3D objects * slide:: Making presentations with @code{Asymptote} * MetaPost:: @code{MetaPost} compatibility routines * babel:: Interface to @code{LaTeX} @code{babel} package * labelpath:: Drawing curved labels * labelpath3:: Drawing curved labels in 3D * annotate:: Annotate your @acronym{PDF} files * CAD:: 2D CAD pen and measurement functions (DIN 15) * graph:: 2D linear & logarithmic graphs * palette:: Color density images and palettes * three:: 3D vector graphics * obj:: 3D obj files * graph3:: 3D linear & logarithmic graphs * grid3:: 3D grids * solids:: 3D solid geometry * tube:: 3D rotation minimizing tubes * flowchart:: Flowchart drawing routines * contour:: Contour lines * contour3:: Contour surfaces * smoothcontour3:: Smooth implicit surfaces * slopefield:: Slope fields * ode:: Ordinary differential equations Graphical User Interface * GUI installation:: Installing @code{xasy} * GUI usage:: Using @code{xasy} to edit objects @end detailmenu @end menu @node Description @chapter Description @cindex description @cindex @code{Asymptote Web Application} @code{Asymptote} is a powerful descriptive vector graphics language that provides a mathematical coordinate-based framework for technical drawing. Labels and equations are typeset with @code{LaTeX}, for overall document consistency, yielding the same high-quality level of typesetting that @code{LaTeX} provides for scientific text. By default it produces @code{PostScript} output, but it can also generate @code{OpenGL}, @code{PDF}, @code{SVG}, @code{WebGL}, @code{V3D}, and legacy @code{PRC} vector graphics, along with any format that the @code{ImageMagick} package can produce. You can even try it out in your Web browser without installing it, using the @code{Asymptote Web Application} @url{https://asymptote.ualberta.ca} It is also possible to send remote commands to this server via the curl utility (@pxref{Command-Line Interface}). A major advantage of @code{Asymptote} over other graphics packages is that it is a high-level programming language, as opposed to just a graphics program: it can therefore exploit the best features of the script (command-driven) and graphical-user-interface (@acronym{GUI}) methods for producing figures. The rudimentary @acronym{GUI} @code{xasy} included with the package allows one to move script-generated objects around. To make @code{Asymptote} accessible to the average user, this @acronym{GUI} is currently being developed into a full-fledged interface that can generate objects directly. However, the script portion of the language is now ready for general use by users who are willing to learn a few simple @code{Asymptote} graphics commands (@pxref{Drawing commands}). @code{Asymptote} is mathematically oriented (e.g.@ one can use complex multiplication to rotate a vector) and uses @code{LaTeX} to do the typesetting of labels. This is an important feature for scientific applications. It was inspired by an earlier drawing program (with a weaker syntax and capabilities) called @code{MetaPost}. The @code{Asymptote} vector graphics language provides: @itemize @bullet @item a standard for typesetting mathematical figures, just as @TeX{}/@code{LaTeX} is the de-facto standard for typesetting equations. @item @code{LaTeX} typesetting of labels, for overall document consistency; @item the ability to generate and embed 3D vector @acronym{WebGL} graphics within @acronym{HTML} files; @item the ability to generate and embed 3D vector @acronym{PRC} graphics within @acronym{PDF} files; @item a natural coordinate-based framework for technical drawing, inspired by @code{MetaPost}, with a much cleaner, powerful C++-like programming syntax; @item compilation of figures into virtual machine code for speed, without sacrificing portability; @item the power of a script-based language coupled to the convenience of a @acronym{GUI}; @item customization using its own C++-like graphics programming language; @item sensible defaults for graphical features, with the ability to override; @item a high-level mathematically oriented interface to the @code{PostScript} language for vector graphics, including affine transforms and complex variables; @item functions that can create new (anonymous) functions; @item deferred drawing that uses the simplex method to solve overall size constraint issues between fixed-sized objects (labels and arrowheads) and objects that should scale with figure size; @end itemize Many of the features of @code{Asymptote} are written in the @code{Asymptote} language itself. While the stock version of @code{Asymptote} is designed for mathematics typesetting needs, one can write @code{Asymptote} modules that tailor it to specific applications; for example, a scientific graphing module is available (@pxref{graph}). Examples of @code{Asymptote} code and output, including animations, are available at @quotation @url{https://asymptote.sourceforge.io/gallery/} @end quotation @noindent Clicking on an example file name in this manual, like @code{@uref{https://asymptote.sourceforge.io/gallery/Pythagoras.svg,,Pythagoras}}, will display the @acronym{PDF} output, whereas clicking on its @code{@uref{https://asymptote.sourceforge.io/gallery/Pythagoras.asy,,.asy}} extension will show the corresponding @code{Asymptote} code in a separate window. Links to many external resources, including an excellent user-written @code{Asymptote} tutorial can be found at @quotation @url{https://asymptote.sourceforge.io/links.html} @end quotation @cindex reference @cindex quick reference A quick reference card for @code{Asymptote} is available at @quotation @url{https://asymptote.sourceforge.io/asyRefCard.pdf} @end quotation @node Installation @chapter Installation @cindex installation @menu * UNIX binary distributions:: Prebuilt @code{UNIX} binaries * MacOS X binary distributions:: Prebuilt @code{MacOS X} binaries * Microsoft Windows:: Prebuilt @code{Microsoft Windows} binary * Configuring:: Configuring @code{Asymptote} for your system * Search paths:: Where @code{Asymptote} looks for your files * Compiling from UNIX source:: Building @code{Asymptote} from scratch * Editing modes:: Convenient @code{emacs} and @code{vim} modes * Git:: Getting the latest development source * Building the documentation:: Building the documentation * Uninstall:: Goodbye, @code{Asymptote}! @end menu After following the instructions for your specific distribution, please see also @ref{Configuring}. @noindent We recommend subscribing to new release announcements at @quotation @url{https://sourceforge.net/projects/asymptote} @end quotation @noindent Users may also wish to monitor the @code{Asymptote} forum: @quotation @url{https://sourceforge.net/p/asymptote/discussion/409349} @end quotation @noindent @node UNIX binary distributions @section UNIX binary distributions @cindex UNIX binary distributions @cindex @acronym{RPM} @cindex @code{tgz} We release both @code{tgz} and @acronym{RPM} binary distributions of @code{Asymptote}. The root user can install the @code{Linux x86_64} @code{tgz} distribution of version @code{x.xx} of @code{Asymptote} with the commands: @verbatim tar -C / -zxf asymptote-x.xx.x86_64.tgz texhash @end verbatim @noindent The @code{texhash} command, which installs LaTeX style files, is optional. The executable file will be @code{/usr/local/bin/asy}) and example code will be installed by default in @code{@value{Docdir}/examples}. @noindent @cindex Fedora Fedora users can easily install a recent version of @code{Asymptote} with the command @verbatim dnf --enablerepo=rawhide install asymptote @end verbatim @cindex Debian @noindent To install the latest version of @code{Asymptote} on a Debian-based distribution (e.g.@ Ubuntu, Mepis, Linspire) follow the instructions for compiling from @code{UNIX} source (@pxref{Compiling from UNIX source}). Alternatively, Debian users can install one of Hubert Chan's prebuilt @code{Asymptote} binaries from @quotation @url{https://ftp.debian.org/debian/pool/main/a/asymptote} @end quotation @node MacOS X binary distributions @section MacOS X binary distributions @cindex @code{MacOS X} binary distributions @code{MacOS X} users can either compile the @code{UNIX} source code (@pxref{Compiling from UNIX source}) or install the @code{Asymptote} binary available at @url{https://www.macports.org/} or at @url{https://brew.sh/} @noindent Note that many @code{MacOS X} (and FreeBSD) systems lack the @acronym{GNU} @code{readline} library. For full interactive functionality, @acronym{GNU} @code{readline} version 4.3 or later must be installed. @node Microsoft Windows @section Microsoft Windows @cindex Microsoft Windows Users of the @code{Microsoft Windows} operating system can install the self-extracting @code{Asymptote} executable @code{asymptote-x.xx-setup.exe}, where @code{x.xx} denotes the latest version. A working @TeX{} implementation (we recommend @url{https://www.tug.org/texlive} or @url{https://miktex.org}) will be required to typeset labels. You will also need to install @code{GPL Ghostscript} version 9.56 or later from @url{https://www.ghostscript.com/}. To view @code{PostScript} output, you can install the program @code{Sumatra PDF} available from @url{https://www.sumatrapdfreader.org/}. The @code{ImageMagick} package from @url{https://www.imagemagick.org/script/binary-releases.php} @noindent is required to support output formats other than @acronym{HTML}, @acronym{PDF}, @acronym{SVG}, and @acronym{PNG} (@pxref{magick}). The @code{Python 3} interpreter from @url{https://www.python.org} is only required if you wish to try out the graphical user interface (@pxref{GUI}). @noindent Example code will be installed by default in the @code{examples} subdirectory of the installation directory (by default, @code{C:\Program Files\Asymptote}). @node Configuring @section Configuring @cindex configuring @cindex @code{-V} In interactive mode, or when given the @code{-V} option (the default when running @code{Asymptote} on a single file under @code{MSDOS}), @code{Asymptote} will automatically invoke your @code{PostScript} viewer (@code{evince} under @code{UNIX}) to display graphical output. The @code{PostScript} viewer should be capable of automatically redrawing whenever the output file is updated. The @code{UNIX} @code{PostScript} viewer @code{gv} supports this (via a @code{SIGHUP} signal). Users of @code{ggv} will need to enable @code{Watch file} under @code{Edit/PostScript Viewer Preferences}. @cindex @code{psviewer} @cindex @code{pdfviewer} @cindex @code{htmlviewer} @cindex @code{gs} @cindex @code{display} @cindex @code{animate} @cindex @code{settings} @cindex configuration file Configuration variables are most easily set as @code{Asymptote} variables in an optional configuration file @code{config.asy} (@pxref{configuration file}). For example, the setting @code{pdfviewer} specifies the location of the @acronym{PDF} viewer. Here are the default values of several important configuration variables under @code{UNIX}: @noindent @verbatim import settings; pdfviewer="acroread"; htmlviewer="google-chrome"; psviewer="evince"; display="display"; animate="animate"; gs="gs"; libgs=""; @end verbatim @noindent @cindex @code{cmd} Under @code{MSDOS}, the viewer settings @code{htmlviewer}, @code{pdfviewer}, @code{psviewer}, @code{display}, and @code{animate} default to the string @code{cmd}, requesting the application normally associated with each file type. The (installation-dependent) default values of @code{gs} and @code{libgs} are determined automatically from the @code{Microsoft Windows} registry. The @code{gs} setting specifies the location of the @code{PostScript} processor @code{Ghostscript}, available from @url{https://www.ghostscript.com/}. @noindent @cindex @code{htmlviewer} @cindex @code{absolute} The configuration variable @code{htmlviewer} specifies the browser to use to display 3D @code{WebGL} output. The default setting is @code{google-chrome} under @code{UNIX} and @code{cmd} under @code{Microsoft Windows}. Note that @code{Internet Explorer} does not support @code{WebGL}; @code{Microsoft Windows} users should set their default html browser to @code{chrome} or @code{microsoft-edge}. By default, 2D and 3D @code{HTML} images expand to the enclosing canvas; this can be disabled by setting the configuration variable @code{absolute} to @code{true}. On @code{UNIX} systems, to support automatic document reloading of @code{PDF} files in @code{Adobe Reader}, we recommend copying the file @code{reload.js} from the @code{Asymptote} system directory (by default, @code{@value{Datadir}/asymptote} under @code{UNIX} to @code{~/.adobe/Acrobat/x.x/JavaScripts/}, where @code{x.x} represents the appropriate @code{Adobe Reader} version number. The automatic document reload feature must then be explicitly enabled by putting @verbatim import settings; pdfreload=true; pdfreloadOptions="-tempFile"; @end verbatim @noindent in the @code{Asymptote} configuration file. This reload feature is not useful under @code{MSDOS} since the document cannot be updated anyway on that operating system until it is first closed by @code{Adobe Reader}. The configuration variable @code{dir} can be used to adjust the search path (@pxref{Search paths}). @cindex @code{papertype} @cindex @code{paperwidth} @cindex @code{paperheight} @cindex @code{letter} @cindex @code{a4} By default, @code{Asymptote} attempts to center the figure on the page, assuming that the paper type is @code{letter}. The default paper type may be changed to @code{a4} with the configuration variable @code{papertype}. Alignment to other paper sizes can be obtained by setting the configuration variables @code{paperwidth} and @code{paperheight}. @cindex @code{config} @cindex @code{texpath} @cindex @code{texcommand} @cindex @code{dvips} @cindex @code{dvisvgm} @cindex @code{magick} @cindex @code{ImageMagick} @cindex @code{asygl} These additional configuration variables normally do not require adjustment: @verbatim config texpath texcommand dvips dvisvgm convert asygl @end verbatim @noindent @cindex @code{warn} Warnings (such as "unbounded" and "offaxis") may be enabled or disabled with the functions @verbatim warn(string s); nowarn(string s); @end verbatim @noindent or by directly modifying the string array @code{settings.suppress}, which lists all disabled warnings. @cindex command-line options Configuration variables may also be set or overwritten with a command-line option: @verbatim asy -psviewer=evince -V venn @end verbatim @cindex environment variables Alternatively, system environment versions of the above configuration variables may be set in the conventional way. The corresponding environment variable name is obtained by converting the configuration variable name to upper case and prepending @code{ASYMPTOTE_}: for example, to set the environment variable @verbatim ASYMPTOTE_PAPERTYPE="a4"; @end verbatim @noindent under @code{Microsoft Windows XP}: @enumerate @item Click on the @code{Start} button; @item Right-click on @code{My Computer}; @item Choose @code{View system information}; @item Click the @code{Advanced} tab; @item Click the @code{Environment Variables} button. @end enumerate @node Search paths @section Search paths @cindex search paths In looking for @code{Asymptote} files, @code{asy} will search the following paths, in the order listed: @enumerate @item The current directory; @item @cindex @code{dir} A list of one or more directories specified by the configuration variable @code{dir} or environment variable @code{ASYMPTOTE_DIR} (separated by @code{:} under UNIX and @code{;} under @code{MSDOS}); @item @cindex @code{.asy} The directory specified by the environment variable @code{ASYMPTOTE_HOME}; if this variable is not set, the directory @code{.asy} in the user's home directory (@code{%USERPROFILE%\.asy} under @code{MSDOS}) is used; @item The @code{Asymptote} system directory (by default, @code{@value{Datadir}/asymptote} under @code{UNIX} and @code{C:\Program Files\Asymptote} under @code{MSDOS}). @item The @code{Asymptote} examples directory (by default, @code{@value{Docdir}/examples} under @code{UNIX} and @code{C:\Program Files\Asymptote\examples} under @code{MSDOS}). @end enumerate @node Compiling from UNIX source @section Compiling from UNIX source @cindex Compiling from UNIX source To compile and install a @code{UNIX} executable from the source release @code{asymptote-x.xx.src.tgz} in the subdirectory @code{x.xx} under @url{https://sourceforge.net/projects/asymptote/files/} execute the commands: @verbatim gunzip asymptote-x.xx.src.tgz tar -xf asymptote-x.xx.src.tar cd asymptote-x.xx @end verbatim Then compile @code{Asymptote} with the commands @verbatim ./configure make all make install @end verbatim @noindent Be sure to use @acronym{GNU} @code{make} (on non-@acronym{GNU} systems this command may be called @code{gmake}). To build the documentation, you may need to install the @code{texinfo-tex} package. If you get errors from a broken @code{texinfo} or @code{pdftex} installation, simply put @quotation @url{https://asymptote.sourceforge.io/asymptote.pdf} @end quotation @noindent in the directory @code{doc} and repeat the command @code{make all}. @noindent For a (default) system-wide installation, the last command should be done as the root user. To install without root privileges, change the @code{./configure} command to @verbatim ./configure --prefix=$HOME/asymptote @end verbatim @cindex @code{MacOS X} configuration @cindex @code{clang} One can disable use of the Boehm garbage collector by configuring with @code{./configure --disable-gc}. For a list of other configuration options, say @code{./configure --help}. For example, under @code{MacOS X}, one can tell configure to use the @code{clang} compilers and look for header files and libraries in nonstandard locations: @verbatim ./configure CC=clang CXX=clang++ CPPFLAGS=-I/opt/local/include LDFLAGS=-L/opt/local/lib @end verbatim If you are compiling @code{Asymptote} with @code{gcc}, you will need a relatively recent version (e.g.@ 3.4.4 or later). For full interactive functionality, you will need version 4.3 or later of the @acronym{GNU} @code{readline} library. The file @code{gcc3.3.2curses.patch} in the @code{patches} directory can be used to patch the broken curses.h header file (or a local copy thereof in the current directory) on some @code{AIX} and @code{IRIX} systems. @cindex @code{FFTW} @cindex @code{GSL} The @code{FFTW} library is only required if you want @code{Asymptote} to be able to take Fourier transforms of data (say, to compute an audio power spectrum). The @code{GSL} library is only required if you require the special functions that it supports. If you don't want to install @code{Asymptote} system wide, just make sure the compiled binary @code{asy} and @acronym{GUI} script @code{xasy} are in your path and set the configuration variable @code{dir} to point to the directory @code{base} (in the top level directory of the @code{Asymptote} source code). @node Editing modes @section Editing modes @cindex Editing modes @cindex @code{emacs} @cindex @code{asy-mode} @cindex @code{lasy-mode} Users of @code{emacs} can edit @code{Asymptote} code with the mode @code{asy-mode}, after enabling it by putting the following lines in their @code{.emacs} initialization file, replacing @code{ASYDIR} with the location of the @code{Asymptote} system directory (by default, @code{@value{Datadir}/asymptote} or @code{C:\Program Files\Asymptote} under @code{MSDOS}): @verbatim (add-to-list 'load-path "ASYDIR") (autoload 'asy-mode "asy-mode.el" "Asymptote major mode." t) (autoload 'lasy-mode "asy-mode.el" "hybrid Asymptote/Latex major mode." t) (autoload 'asy-insinuate-latex "asy-mode.el" "Asymptote insinuate LaTeX." t) (add-to-list 'auto-mode-alist '("\\.asy$" . asy-mode)) @end verbatim @noindent Particularly useful key bindings in this mode are @code{C-c C-c}, which compiles and displays the current buffer, and the key binding @code{C-c ?}, which shows the available function prototypes for the command at the cursor. For full functionality you should also install the Apache Software Foundation package @code{two-mode-mode}: @quotation @url{https://github.com/erlyaws/yaws/blob/master/two-mode-mode.el} @end quotation @noindent The hybrid mode @code{lasy-mode} can be used to edit a LaTeX file containing embedded @code{Asymptote} code (@pxref{LaTeX usage}). This mode can be enabled within @code{latex-mode} with the key sequence @code{M-x lasy-mode }. On @code{UNIX} systems, additional keywords will be generated from all @code{asy} files in the space-separated list of directories specified by the environment variable @code{ASYMPTOTE_SITEDIR}. Further documentation of @code{asy-mode} is available within @code{emacs} by pressing the sequence keys @code{C-h f asy-mode }. @cindex @code{vim} @cindex @code{asy.vim} Fans of @code{vim} can customize @code{vim} for @code{Asymptote} with @noindent @code{cp @value{Datadir}/asymptote/asy.vim ~/.vim/syntax/asy.vim} @noindent and add the following to their @code{~/.vimrc} file: @verbatim augroup filetypedetect au BufNewFile,BufRead *.asy setf asy augroup END filetype plugin on @end verbatim If any of these directories or files don't exist, just create them. To set @code{vim} up to run the current asymptote script using @code{:make} just add to @code{~/.vim/ftplugin/asy.vim}: @verbatim setlocal makeprg=asy\ % setlocal errorformat=%f:\ %l.%c:\ %m @end verbatim @cindex @code{KDE editor} @cindex @code{Kate} @cindex @code{asymptote.xml} Syntax highlighting support for the @acronym{KDE} editor @code{Kate} can be enabled by running @code{asy-kate.sh} in the @code{@value{Datadir}/asymptote} directory and putting the generated @code{asymptote.xml} file in @code{~/.local/share/org.kde.syntax-highlighting/syntax/}. @node Git @section Git @cindex git The following commands are needed to install the latest development version of @code{Asymptote} using @code{git}: @verbatim git clone https://github.com/vectorgraphics/asymptote cd asymptote ./autogen.sh ./configure make all make install @end verbatim @noindent To compile without optimization On @code{Ubuntu} systems, you may need to first install the required dependencies: @verbatim apt-get build-dep asymptote @end verbatim @noindent @node Building the documentation @section Building the documentation Here are instructions for building the documentation: @verbatim cd doc make # for both the PDF version doc/asymptote.pdf and the HTML version cd png make # for the HTML version only: doc/png/index.html @end verbatim Note that the @code{HTML} version cannot be built without executing @code{make} from @code{doc} folder first. The @code{asy} executable is required for compiling the diagrams in the documentation. @node Uninstall @section Uninstall @cindex uninstall To uninstall a @code{Linux x86_64} binary distribution @verbatim tar -zxvf asymptote-x.xx.x86_64.tgz | xargs --replace=% rm /% texhash @end verbatim @noindent To uninstall all @code{Asymptote} files installed from a source distribution, use the command @verbatim make uninstall @end verbatim @node Tutorial @chapter Tutorial @cindex tutorial @menu * Drawing in batch mode:: Run @code{Asymptote} on a text file * Drawing in interactive mode:: Running @code{Asymptote} interactively * Figure size:: Specifying the figure size * Labels:: Adding @code{LaTeX} labels * Paths:: Drawing lines and curves @end menu A concise introduction to @code{Asymptote} is given here. For a more thorough introduction, see the excellent @code{Asymptote} tutorial written by Charles Staats: @url{https://asymptote.sourceforge.io/asymptote_tutorial.pdf} Another @code{Asymptote} tutorial is available as a wiki, with images rendered by an online Asymptote engine: @url{https://www.artofproblemsolving.com/wiki/?title=Asymptote_(Vector_Graphics_Language)} @node Drawing in batch mode @section Drawing in batch mode @cindex batch mode To draw a line from coordinate (0,0) to coordinate (100,100), create a text file @code{test.asy} containing @verbatiminclude diagonal.asy @noindent Then execute the command @verbatim asy -V test @end verbatim @noindent Alternatively, @code{MSDOS} users can drag and drop @code{test.asy} onto the Desktop @code{asy} icon (or make @code{Asymptote} the default application for the extension @code{asy}). @noindent @cindex @code{-V} This method, known as @emph{batch mode}, outputs a @code{PostScript} file @code{test.eps}. If you prefer @acronym{PDF} output, use the command line @verbatim asy -V -f pdf test @end verbatim In either case, the @code{-V} option opens up a viewer window so you can immediately view the result: @sp 1 @center @image{./diagonal} @cindex @code{bp} @noindent Here, the @code{--} connector joins the two points @code{(0,0)} and @code{(100,100)} with a line segment. @node Drawing in interactive mode @section Drawing in interactive mode @cindex interactive mode Another method is @emph{interactive mode}, where @code{Asymptote} reads individual commands as they are entered by the user. To try this out, enter @code{Asymptote}'s interactive mode by clicking on the @code{Asymptote} icon or typing the command @code{asy}. Then type @verbatim draw((0,0)--(100,100)); @end verbatim @noindent followed by @code{Enter}, to obtain the above image. @cindex tab completion @cindex arrow keys @cindex erase @cindex quit At this point you can type further @code{draw} commands, which will be added to the displayed figure, @code{erase} to clear the canvas, @verbatim input test; @end verbatim @noindent to execute all of the commands contained in the file @code{test.asy}, or @code{quit} to exit interactive mode. You can use the arrow keys in interactive mode to edit previous lines. The tab key will automatically complete unambiguous words; otherwise, hitting tab again will show the possible choices. Further commands specific to interactive mode are described in @ref{Interactive mode}. @node Figure size @section Figure size @cindex @code{size} @cindex @code{pair} In @code{Asymptote}, coordinates like @code{(0,0)} and @code{(100,100)}, called @emph{pairs}, are expressed in @code{PostScript} "big points" (1 @code{bp} = 1/72 @code{inch}) and the default line width is @code{0.5bp}. However, it is often inconvenient to work directly in @code{PostScript} coordinates. The next example produces identical output to the previous example, by scaling the line @code{(0,0)--(1,1)} to fit a rectangle of width @code{100.5 bp} and height @code{100.5 bp} (the extra @code{0.5bp} accounts for the line width): @verbatim size(100.5,100.5); draw((0,0)--(1,1)); @end verbatim @sp 1 @center @image{./diagonal} @cindex @code{inches} @cindex @code{cm} @cindex @code{mm} @cindex @code{pt} One can also specify the size in @code{pt} (1 @code{pt} = 1/72.27 @code{inch}), @code{cm}, @code{mm}, or @code{inches}. Two nonzero size arguments (or a single size argument) restrict the size in both directions, preserving the aspect ratio. If 0 is given as a size argument, no restriction is made in that direction; the overall scaling will be determined by the other direction (@pxref{size}): @verbatiminclude bigdiagonal.asy @sp 1 @center @image{./bigdiagonal} @cindex @code{cycle} To connect several points and create a cyclic path, use the @code{cycle} keyword: @verbatiminclude square.asy @sp 1 @center @image{./square} @noindent For convenience, the path @code{(0,0)--(1,0)--(1,1)--(0,1)--cycle} may be replaced with the predefined variable @code{unitsquare}, or equivalently, @code{box((0,0),(1,1))}. @cindex user coordinates @cindex @code{unitsize} To make the user coordinates represent multiples of exactly @code{1cm}: @verbatim unitsize(1cm); draw(unitsquare); @end verbatim @noindent @node Labels @section Labels @cindex @code{label} Adding labels is easy in @code{Asymptote}; one specifies the label as a double-quoted @code{LaTeX} string, a coordinate, and an optional alignment direction: @verbatiminclude labelsquare.asy @sp 1 @center @image{./labelsquare} @cindex compass directions @cindex @code{N} @cindex @code{E} @cindex @code{W} @cindex @code{S} @code{Asymptote} uses the standard compass directions @code{E=(1,0)}, @code{N=(0,1)}, @code{NE=unit(N+E)}, and @code{ENE=unit(E+NE)}, etc., which along with the directions @code{up}, @code{down}, @code{right}, and @code{left} are defined as pairs in the @code{Asymptote} base module @code{plain} (a user who has a local variable named @code{E} may access the compass direction @code{E} by prefixing it with the name of the module where it is defined: @code{plain.E}). @node Paths @section Paths @cindex @code{path} This example draws a path that approximates a quarter circle, terminated with an arrowhead: @verbatiminclude quartercircle.asy @sp 1 @center @image{./quartercircle} @noindent Here the directions @code{up} and @code{left} in braces specify the outgoing and incoming directions at the points @code{(1,0)} and @code{(0,1)}, respectively. In general, a path is specified as a list of points (or other paths) interconnected with @cindex @code{cycle} @cindex @code{--} @cindex @code{..} @code{--}, which denotes a straight line segment, or @code{..}, which denotes a cubic spline (@pxref{Bezier curves}). @cindex @code{unitcircle} @anchor{unitcircle} @cindex @code{unitcircle} Specifying a final @code{..cycle} creates a cyclic path that connects smoothly back to the initial node, as in this approximation (accurate to within 0.06%) of a unit circle: @verbatim path unitcircle=E..N..W..S..cycle; @end verbatim @cindex @code{PostScript} subpath @cindex @code{^^} @cindex @code{path[]} @cindex superpath @noindent An @code{Asymptote} path, being connected, is equivalent to a @code{PostScript subpath}. The @code{^^} binary operator, which requests that the pen be moved (without drawing or affecting endpoint curvatures) from the final point of the left-hand path to the initial point of the right-hand path, may be used to group several @code{Asymptote} paths into a @code{path[]} array (equivalent to a @code{PostScript} path): @verbatiminclude superpath.asy @sp 1 @center @image{./superpath} @cindex evenodd @noindent The @code{PostScript} even-odd fill rule here specifies that only the region bounded between the two unit circles is filled (@pxref{fillrule}). In this example, the same effect can be achieved by using the default zero winding number fill rule, if one is careful to alternate the orientation of the paths: @verbatim filldraw(unitcircle^^reverse(g),yellow,black); @end verbatim @cindex @code{unitbox} The @code{^^} operator is used by the @code{box(triple, triple)} function in the module @code{three} to construct the edges of a cube @code{unitbox} without retracing steps (@pxref{three}): @verbatiminclude cube.asy @sp 1 @center @image{./cube} See section @ref{graph} (or the online @code{Asymptote} @uref{https://asymptote.sourceforge.io/gallery,,gallery} and external links posted at @url{https://asymptote.sourceforge.io}) for further examples, including two-dimensional and interactive three-dimensional scientific graphs. Additional examples have been posted by Philippe Ivaldi at @url{https://blog.piprime.fr/asymptote/}. @node Drawing commands @chapter Drawing commands @cindex drawing commands All of @code{Asymptote}'s graphical capabilities are based on four primitive commands. The three @code{PostScript} drawing commands @code{draw}, @code{fill}, and @code{clip} add objects to a picture in the order in which they are executed, with the most recently drawn object appearing on top. The labeling command @code{label} can be used to add text labels and external @acronym{EPS} images, which will appear on top of the @code{PostScript} objects (since this is normally what one wants), but again in the relative order in which they were executed. After drawing objects on a picture, the picture can be output with the @code{shipout} function (@pxref{shipout}). @cindex @code{layer} If you wish to draw @code{PostScript} objects on top of labels (or verbatim @code{tex} commands; @pxref{tex}), the @code{layer} command may be used to start a new @code{PostScript/LaTeX} layer: @verbatim void layer(picture pic=currentpicture); @end verbatim The @code{layer} function gives one full control over the order in which objects are drawn. Layers are drawn sequentially, with the most recent layer appearing on top. Within each layer, labels, images, and verbatim @code{tex} commands are always drawn after the @code{PostScript} objects in that layer. @cindex @code{newpage} A page break can be generated with the command @verbatim void newpage(picture pic=currentpicture); @end verbatim While some of these drawing commands take many options, they all have sensible default values (for example, the picture argument defaults to currentpicture). @cindex legend @cindex @code{draw} @cindex @code{arrow} @menu * draw:: Draw a path on a picture or frame * fill:: Fill a cyclic path on a picture or frame * clip:: Clip a picture or frame to a cyclic path * label:: Label a point on a picture @end menu @node draw @section draw @cindex @code{draw} @verbatim void draw(picture pic=currentpicture, Label L="", path g, align align=NoAlign, pen p=currentpen, arrowbar arrow=None, arrowbar bar=None, margin margin=NoMargin, Label legend="", marker marker=nomarker); @end verbatim Draw the path @code{g} on the picture @code{pic} using pen @code{p} for drawing, with optional drawing attributes (Label @code{L}, explicit label alignment @code{align}, arrows and bars @code{arrow} and @code{bar}, margins @code{margin}, legend, and markers @code{marker}). Only one parameter, the path, is required. For convenience, the arguments @code{arrow} and @code{bar} may be specified in either order. The argument @code{legend} is a Label to use in constructing an optional legend entry. @cindex @code{None} @cindex @code{BeginBar} @cindex @code{EndBar} @cindex @code{Bar} @cindex @code{Bars} @cindex @code{barsize} Bars @code{bar} are useful for indicating dimensions. The possible values of @code{bar} are @code{None}, @code{BeginBar}, @code{EndBar} (or equivalently @code{Bar}), and @code{Bars} (which draws a bar at both ends of the path). Each of these bar specifiers (except for @code{None}) will accept an optional real argument that denotes the length of the bar in @code{PostScript} coordinates. The default bar length is @code{barsize(pen)}. @cindex arrows @anchor{arrows} @cindex @code{arrowbar} @cindex @code{None} @cindex @code{Blank} @cindex @code{BeginArrow} @cindex @code{MidArrow} @cindex @code{EndArrow} @cindex @code{Arrow} @cindex @code{Arrows} The possible values of @code{arrow} are @code{None}, @code{Blank} (which draws no arrows or path), @code{BeginArrow}, @code{MidArrow}, @code{EndArrow} (or equivalently @code{Arrow}), and @code{Arrows} (which draws an arrow at both ends of the path). @cindex @code{BeginArcArrow} @cindex @code{MidArcArrow} @cindex @code{EndArcArrow} @cindex @code{ArcArrow} @cindex @code{ArcArrows} There are also arrow versions with slightly modified default values of @code{size} and @code{angle} suitable for curved arrows: @code{BeginArcArrow}, @code{EndArcArrow} (or equivalently @code{ArcArrow}), @code{MidArcArrow}, and @code{ArcArrows}. For example: @verbatim draw((0,0)--(1,1),arrow=Arrows); @end verbatim All of the arrow specifiers except for @code{None} and @code{Blank} may be given optional arguments, for example: @verbatim draw((0,0)--(1,1),arrow=Arrow( arrowhead=HookHead,size=3mm,angle=20,filltype=Draw,position=0.9)); @end verbatim The function @code{Arrow} has the signature @verbatim arrowbar Arrow(arrowhead arrowhead=DefaultHead, real size=0, real angle=arrowangle, filltype filltype=null, position position=EndPoint) @end verbatim @noindent Calling @code{Arrow()} returns @code{Arrow}, which is an @code{arrowbar} object. The parameters are: @itemize @cindex @code{arrowhead} @cindex @code{DefaultHead} @cindex @code{SimpleHead} @cindex @code{HookHead} @cindex @code{TeXHead} @item @code{arrowhead} can be one of the predefined arrowhead styles @code{DefaultHead}, @code{SimpleHead}, @code{HookHead}, @code{TeXHead}. @item real @code{size} is the arrowhead size in @code{PostScript} coordinates. The default arrowhead size when drawn with a pen @code{p} is @code{arrowsize(p)}. @item real @code{angle} is the arrowhead angle in degrees. @item filltype @code{filltype} (@pxref{filltype}), @item (except for @code{MidArrow} and @code{Arrows}) real @code{position} (in the sense of @code{point(path p, real t)}) along the path where the tip of the arrow should be placed. @end itemize Margins @code{margin} can be used to shrink the visible portion of a path by @code{labelmargin(p)} to avoid overlap with other drawn objects. Typical values of @code{margin} are: @table @code @cindex @code{NoMargin} @item NoMargin @cindex @code{BeginMargin} @item BeginMargin @cindex @code{EndMargin} @cindex @code{Margin} @item EndMargin (equivalently @code{Margin}) @cindex @code{Margins} @item Margins leaves a margin at both ends of the path. @item Margin(real begin, real end=begin) specify the size of the beginning and ending margin, respectively, in multiples of the units @code{labelmargin(p)} used for aligning labels. @cindex @code{BeginPenMargin} @item BeginPenMargin @cindex @code{EndPenMargin} @cindex @code{PenMargin} @item EndPenMargin (equivalently @code{PenMargin}) @cindex @code{PenMargins} @item PenMargins @item PenMargin(real begin, real end=begin) specify a margin in units of the pen line width, taking account of the pen line width when drawing the path or arrow. @cindex @code{DotMargin} @item DotMargin an abbreviation for @code{PenMargin(-0.5*dotfactor,0.5*dotfactor)}, used to draw from the usual beginning point just up to the boundary of an end dot of width @code{dotfactor*linewidth(p)}. @cindex @code{BeginDotMargin} @item BeginDotMargin @cindex @code{EndDotMargin} @cindex @code{DotMargins} @item DotMargins work similarly. @cindex @code{TrueMargin} @item TrueMargin(real begin, real end=begin) specify a margin directly in @code{PostScript} units, independent of the pen line width. @end table The use of arrows, bars, and margins is illustrated by the examples @code{@uref{https://asymptote.sourceforge.io/gallery/Pythagoras.svg,,Pythagoras}@uref{https://asymptote.sourceforge.io/gallery/Pythagoras.asy,,.asy}} and @code{@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/sqrtx01.html,,sqrtx01}@uref{https://asymptote.sourceforge.io/gallery/sqrtx01.asy,,.asy}}. The legend for a picture @code{pic} can be fit and aligned to a frame with the routine: @cindex @code{legend} @verbatim frame legend(picture pic=currentpicture, int perline=1, real xmargin=legendmargin, real ymargin=xmargin, real linelength=legendlinelength, real hskip=legendhskip, real vskip=legendvskip, real maxwidth=0, real maxheight=0, bool hstretch=false, bool vstretch=false, pen p=currentpen); @end verbatim @noindent Here @code{xmargin} and @code{ymargin} specify the surrounding @math{x} and @math{y} margins, @code{perline} specifies the number of entries per line (default 1; 0 means choose this number automatically), @code{linelength} specifies the length of the path lines, @code{hskip} and @code{vskip} specify the line skip (as a multiple of the legend entry size), @code{maxwidth} and @code{maxheight} specify optional upper limits on the width and height of the resulting legend (0 means unlimited), @code{hstretch} and @code{vstretch} allow the legend to stretch horizontally or vertically, and @code{p} specifies the pen used to draw the bounding box. The legend frame can then be added and aligned about a point on a picture @code{dest} using @code{add} or @code{attach} (@pxref{add about}). @cindex @code{dot} To draw a dot, simply draw a path containing a single point. The @code{dot} command defined in the module @code{plain} draws a dot having a diameter equal to an explicit pen line width or the default line width magnified by @code{dotfactor} (6 by default), using the specified filltype (@pxref{filltype}) or @code{dotfilltype} (@code{Fill} by default): @verbatim void dot(frame f, pair z, pen p=currentpen, filltype filltype=dotfilltype); void dot(picture pic=currentpicture, pair z, pen p=currentpen, filltype filltype=dotfilltype); void dot(picture pic=currentpicture, Label L, pair z, align align=NoAlign, string format=defaultformat, pen p=currentpen, filltype filltype=dotfilltype); void dot(picture pic=currentpicture, Label[] L=new Label[], pair[] z, align align=NoAlign, string format=defaultformat, pen p=currentpen, filltype filltype=dotfilltype); void dot(picture pic=currentpicture, path[] g, pen p=currentpen, filltype filltype=dotfilltype); void dot(picture pic=currentpicture, Label L, pen p=currentpen, filltype filltype=dotfilltype); @end verbatim @cindex @code{Label} If the variable @code{Label} is given as the @code{Label} argument to the third routine, the @code{format} argument will be used to format a string based on the dot location (here @code{defaultformat} is @code{"$%.4g$"}). The fourth routine draws a dot at every point of a pair array @code{z}. One can also draw a dot at every node of a path: @verbatim void dot(picture pic=currentpicture, Label[] L=new Label[], explicit path g, align align=RightSide, string format=defaultformat, pen p=currentpen, filltype filltype=dotfilltype); @end verbatim See @ref{pathmarkers} and @ref{markers} for more general methods for marking path nodes. To draw a fixed-sized object (in @code{PostScript} coordinates) about the user coordinate @code{origin}, use the routine @cindex @code{draw} @verbatim void draw(pair origin, picture pic=currentpicture, Label L="", path g, align align=NoAlign, pen p=currentpen, arrowbar arrow=None, arrowbar bar=None, margin margin=NoMargin, Label legend="", marker marker=nomarker); @end verbatim @cindex @code{fill} @node fill @section fill @cindex @code{fill} @verbatim void fill(picture pic=currentpicture, path g, pen p=currentpen); @end verbatim Fill the interior region bounded by the cyclic path @code{g} on the picture @code{pic}, using the pen @code{p}. @cindex @code{filldraw} There is also a convenient @code{filldraw} command, which fills the path and then draws in the boundary. One can specify separate pens for each operation: @verbatim void filldraw(picture pic=currentpicture, path g, pen fillpen=currentpen, pen drawpen=currentpen); @end verbatim @cindex @code{fill} This fixed-size version of @code{fill} allows one to fill an object described in @code{PostScript} coordinates about the user coordinate @code{origin}: @verbatim void fill(pair origin, picture pic=currentpicture, path g, pen p=currentpen); @end verbatim @noindent This is just a convenient abbreviation for the commands: @verbatim picture opic; fill(opic,g,p); add(pic,opic,origin); @end verbatim The routine @cindex @code{filloutside} @verbatim void filloutside(picture pic=currentpicture, path g, pen p=currentpen); @end verbatim @noindent fills the region exterior to the path @code{g}, out to the current boundary of picture @code{pic}. @anchor{gradient shading} @cindex gradient shading @cindex shading @cindex @code{latticeshade} Lattice gradient shading varying smoothly over a two-dimensional array of pens @code{p}, using fill rule @code{fillrule}, can be produced with @verbatim void latticeshade(picture pic=currentpicture, path g, bool stroke=false, pen fillrule=currentpen, pen[][] p) @end verbatim @cindex @code{stroke} If @code{stroke=true}, the region filled is the same as the region that would be drawn by @code{draw(pic,g,zerowinding)}; in this case the path @code{g} need not be cyclic. The pens in @code{p} must belong to the same color space. One can use the functions @code{rgb(pen)} or @code{cmyk(pen)} to promote pens to a higher color space, as illustrated in the example file @code{@uref{https://asymptote.sourceforge.io/gallery/latticeshading.svg,,latticeshading}@uref{https://asymptote.sourceforge.io/gallery/latticeshading.asy,,.asy}}. @cindex @code{axialshade} Axial gradient shading varying smoothly from @code{pena} to @code{penb} in the direction of the line segment @code{a--b} can be achieved with @verbatim void axialshade(picture pic=currentpicture, path g, bool stroke=false, pen pena, pair a, bool extenda=true, pen penb, pair b, bool extendb=true); @end verbatim @noindent The boolean parameters @code{extenda} and @code{extendb} indicate whether the shading should extend beyond the axis endpoints @code{a} and @code{b}. An example of axial shading is provided in the example file @code{@uref{https://asymptote.sourceforge.io/gallery/axialshade.svg,,axialshade}@uref{https://asymptote.sourceforge.io/gallery/axialshade.asy,,.asy}}. @cindex @code{radialshade} Radial gradient shading varying smoothly from @code{pena} on the circle with center @code{a} and radius @code{ra} to @code{penb} on the circle with center @code{b} and radius @code{rb} is similar: @verbatim void radialshade(picture pic=currentpicture, path g, bool stroke=false, pen pena, pair a, real ra, bool extenda=true, pen penb, pair b, real rb, bool extendb=true); @end verbatim @noindent The boolean parameters @code{extenda} and @code{extendb} indicate whether the shading should extend beyond the radii @code{a} and @code{b}. Illustrations of radial shading are provided in the example files @code{@uref{https://asymptote.sourceforge.io/gallery/shade.svg,,shade}@uref{https://asymptote.sourceforge.io/gallery/shade.asy,,.asy}}, @code{@uref{https://asymptote.sourceforge.io/gallery/PDFs/ring.pdf,,ring}@uref{https://asymptote.sourceforge.io/gallery/PDFs/ring.asy,,.asy}}, and @code{@uref{https://asymptote.sourceforge.io/gallery/PDFs/shadestroke.pdf,,shadestroke}@uref{https://asymptote.sourceforge.io/gallery/PDFs/shadestroke.asy,,.asy}}. @cindex @code{gouraudshade} Gouraud shading using fill rule @code{fillrule} and the vertex colors in the pen array @code{p} on a triangular lattice defined by the vertices @code{z} and edge flags @code{edges} is implemented with @verbatim void gouraudshade(picture pic=currentpicture, path g, bool stroke=false, pen fillrule=currentpen, pen[] p, pair[] z, int[] edges); void gouraudshade(picture pic=currentpicture, path g, bool stroke=false, pen fillrule=currentpen, pen[] p, int[] edges); @end verbatim @noindent In the second form, the elements of @code{z} are taken to be successive nodes of path @code{g}. The pens in @code{p} must belong to the same color space. Illustrations of Gouraud shading are provided in the example file @code{@uref{https://asymptote.sourceforge.io/gallery/PDFs/Gouraud.pdf,,Gouraud}@uref{https://asymptote.sourceforge.io/gallery/PDFs/Gouraud.asy,,.asy}}. The edge flags used in Gouraud shading are documented on pages 270--274 of the PostScript Language Reference (3rd edition): @quotation @url{https://www.adobe.com/jp/print/postscript/pdfs/PLRM.pdf} @end quotation @cindex Coons shading @cindex tensor product shading @cindex @code{tensorshade} Tensor product shading using clipping path @code{g}, fill rule @code{fillrule} on patches bounded by the @math{n} cyclic paths of length 4 in path array @code{b}, using the vertex colors specified in the @math{n \times 4} pen array @code{p} and internal control points in the @math{n \times 4} array @code{z}, is implemented with @verbatim void tensorshade(picture pic=currentpicture, path[] g, bool stroke=false, pen fillrule=currentpen, pen[][] p, path[] b=g, pair[][] z=new pair[][]); @end verbatim @noindent If the array @code{z} is empty, Coons shading, in which the color control points are calculated automatically, is used. The pens in @code{p} must belong to the same color space. A simpler interface for the case of a single patch (@math{n=1}) is also available: @verbatim void tensorshade(picture pic=currentpicture, path g, bool stroke=false, pen fillrule=currentpen, pen[] p, path b=g, pair[] z=new pair[]); @end verbatim One can also smoothly shade the regions between consecutive paths of a sequence using a given array of pens: @verbatim void draw(picture pic=currentpicture, pen fillrule=currentpen, path[] g, pen[] p); @end verbatim @noindent Illustrations of tensor product and Coons shading are provided in the example files @code{@uref{https://asymptote.sourceforge.io/gallery/PDFs/tensor.pdf,,tensor}@uref{https://asymptote.sourceforge.io/gallery/PDFs/tensor.asy,,.asy}}, @code{@uref{https://asymptote.sourceforge.io/gallery/PDFs/Coons.pdf,,Coons}@uref{https://asymptote.sourceforge.io/gallery/PDFs/Coons.asy,,.asy}}, @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/BezierPatch.html,,BezierPatch}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/BezierPatch.asy,,.asy}}, and @code{@uref{https://asymptote.sourceforge.io/gallery/PDFs/rainbow.pdf,,rainbow}@uref{https://asymptote.sourceforge.io/gallery/PDFs/rainbow.asy,,.asy}}. @cindex Function shading @cindex function shading @cindex @code{functionshade} More general shading possibilities are available using @TeX{} engines that produce PDF output (@pxref{texengines}): the routine @verbatim void functionshade(picture pic=currentpicture, path[] g, bool stroke=false, pen fillrule=currentpen, string shader); @end verbatim @noindent shades on picture @code{pic} the interior of path @code{g} according to fill rule @code{fillrule} using the @code{PostScript} calculator routine specified by the string @code{shader}; this routine takes 2 arguments, each in [0,1], and returns @code{colors(fillrule).length} color components. Function shading is illustrated in the example @code{@uref{https://asymptote.sourceforge.io/gallery/PDFs/functionshading.pdf,,functionshading}@uref{https://asymptote.sourceforge.io/gallery/PDFs/functionshading.asy,,.asy}}. @cindex unfill The following routine uses @code{evenodd} clipping together with the @code{^^} operator to unfill a region: @verbatim void unfill(picture pic=currentpicture, path g); @end verbatim @node clip @section clip @cindex @code{clip} @cindex @code{stroke} @verbatim void clip(picture pic=currentpicture, path g, stroke=false, pen fillrule=currentpen); @end verbatim Clip the current contents of picture @code{pic} to the region bounded by the path @code{g}, using fill rule @code{fillrule} (@pxref{fillrule}). If @code{stroke=true}, the clipped portion is the same as the region that would be drawn with @code{draw(pic,g,zerowinding)}; in this case the path @code{g} need not be cyclic. While clipping has no notion of depth (it transcends layers and even pages), one can localize clipping to a temporary picture, which can then be added to @code{pic}. For an illustration of picture clipping, see the first example in @ref{LaTeX usage}. @node label @section label @cindex @code{label} @cindex @code{labelmargin} @verbatim void label(picture pic=currentpicture, Label L, pair position, align align=NoAlign, pen p=currentpen, filltype filltype=NoFill) @end verbatim Draw Label @code{L} on picture @code{pic} using pen @code{p}. If @code{align} is @code{NoAlign}, the label will be centered at user coordinate @code{position}; otherwise it will be aligned in the direction of @code{align} and displaced from @code{position} by the @code{PostScript} offset @code{align*labelmargin(p)}. Here, @code{real labelmargin(pen p=currentpen)} is a quantity used to align labels. In the code below, @verbatim label("abcdefg",(0,0),align=up,basealign); @end verbatim @noindent the baseline of the label will be exactly @code{labelmargin(currentpen)} @code{PostScript} units above the center. @cindex @code{Align} The constant @code{Align} can be used to align the bottom-left corner of the label at @code{position}. @cindex @code{nullpen} @cindex @code{Label} @anchor{Label} The Label @code{L} can either be a string or the structure obtained by calling one of the functions @verbatim Label Label(string s="", pair position, align align=NoAlign, pen p=nullpen, embed embed=Rotate, filltype filltype=NoFill); Label Label(string s="", align align=NoAlign, pen p=nullpen, embed embed=Rotate, filltype filltype=NoFill); Label Label(Label L, pair position, align align=NoAlign, pen p=nullpen, embed embed=L.embed, filltype filltype=NoFill); Label Label(Label L, align align=NoAlign, pen p=nullpen, embed embed=L.embed, filltype filltype=NoFill); @end verbatim The text of a Label can be scaled, slanted, rotated, or shifted by multiplying it on the left by an affine transform (@pxref{Transforms}). For example, @code{rotate(45)*xscale(2)*L} first scales @code{L} in the @math{x} direction and then rotates it counterclockwise by 45 degrees. The final position of a Label can also be shifted by a @code{PostScript} coordinate translation: @code{shift(10,0)*L}. An explicit pen specified within the Label overrides other pen arguments. The @code{embed} argument determines how the Label should transform with the embedding picture: @table @code @item Shift @cindex @code{Shift} only shift with embedding picture; @item Rotate @cindex @code{Rotate} only shift and rotate with embedding picture (default); @item Rotate(pair z) @cindex @code{Rotate(pair z)} rotate with (picture-transformed) vector @code{z}. @item Slant @cindex @code{Slant} only shift, rotate, slant, and reflect with embedding picture; @item Scale @cindex @code{Scale} shift, rotate, slant, reflect, and scale with embedding picture. @end table To add a label to a path, use @verbatim void label(picture pic=currentpicture, Label L, path g, align align=NoAlign, pen p=currentpen, filltype filltype=NoFill); @end verbatim @cindex @code{Relative} By default the label will be positioned at the midpoint of the path. An alternative label position (in the sense of @code{point(path p, real t)}) may be specified as a real value for @code{position} in constructing the Label. The position @code{Relative(real)} specifies a location relative to the total arclength of the path. These convenient abbreviations are predefined: @cindex @code{BeginPoint} @cindex @code{MidPoint} @cindex @code{EndPoint} @verbatim position BeginPoint=Relative(0); position MidPoint=Relative(0.5); position EndPoint=Relative(1); @end verbatim @cindex @code{Relative} @cindex @code{LeftSide} @cindex @code{Center} @cindex @code{RightSide} Path labels are aligned in the direction @code{align}, which may be specified as an absolute compass direction (pair) or a direction @code{Relative(pair)} measured relative to a north axis in the local direction of the path. For convenience @code{LeftSide}, @code{Center}, and @code{RightSide} are defined as @code{Relative(W)}, @code{Relative((0,0))}, and @code{Relative(E)}, respectively. Multiplying @code{LeftSide} and @code{RightSide} on the left by a real scaling factor will move the label further away from or closer to the path. A label with a fixed-size arrow of length @code{arrowlength} pointing to @code{b} from direction @code{dir} can be produced with the routine @cindex @code{arrow} @verbatim void arrow(picture pic=currentpicture, Label L="", pair b, pair dir, real length=arrowlength, align align=NoAlign, pen p=currentpen, arrowbar arrow=Arrow, margin margin=EndMargin); @end verbatim If no alignment is specified (either in the Label or as an explicit argument), the optional Label will be aligned in the direction @code{dir}, using margin @code{margin}. @cindex including images @cindex @code{graphic} @cindex @acronym{EPS} The function @code{string graphic(string name, string options="")} returns a string that can be used to include an encapsulated @code{PostScript} (@acronym{EPS}) file. Here, @code{name} is the name of the file to include and @code{options} is a string containing a comma-separated list of optional bounding box (@code{bb=llx lly urx ury}), width (@code{width=value}), height (@code{height=value}), rotation (@code{angle=value}), scaling (@code{scale=factor}), clipping (@code{clip=bool}), and draft mode (@code{draft=bool}) parameters. The @code{layer()} function can be used to force future objects to be drawn on top of the included image: @verbatim label(graphic("file.eps","width=1cm"),(0,0),NE); layer(); @end verbatim @anchor{baseline} @cindex @code{baseline} The @code{string baseline(string s, string template="\strut")} function can be used to enlarge the bounding box of a label to match a given template, so that their baselines will be typeset on a horizontal line. See @code{@uref{https://asymptote.sourceforge.io/gallery/Pythagoras.svg,,Pythagoras}@uref{https://asymptote.sourceforge.io/gallery/Pythagoras.asy,,.asy}} for an example. Alternatively, the pen @code{basealign} may be used to force labels to respect the TeX baseline (@pxref{basealign}). One can prevent labels from overwriting one another with the @code{overwrite} pen attribute (@pxref{overwrite}). The structure @code{object} defined in @code{plain_Label.asy} allows Labels and frames to be treated in a uniform manner. A group of objects may be packed together into single frame with the routine @cindex @code{pack} @verbatim frame pack(pair align=2S ... object inset[]); @end verbatim @noindent @anchor{envelope} @cindex @code{envelope} @cindex @code{object} To draw or fill a box (or ellipse or other path) around a @code{Label} and return the bounding object, use one of the routines @verbatim object draw(picture pic=currentpicture, Label L, envelope e, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill, bool above=true); object draw(picture pic=currentpicture, Label L, envelope e, pair position, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill, bool above=true); @end verbatim @noindent Here @code{envelope} is a boundary-drawing routine such as @code{box}, @code{roundbox}, or @code{ellipse} defined in @code{plain_boxes.asy}. @cindex @code{texpath} The function @code{path[] texpath(Label L)} returns the path array that @TeX{} would fill to draw the Label @code{L}. @cindex @code{minipage} The @code{string minipage(string s, width=100pt)} function can be used to format string @code{s} into a paragraph of width @code{width}. This example uses @code{minipage}, @code{clip}, and @code{graphic} to produce a CD label: @sp 1 @center @image{./CDlabel} @verbatiminclude CDlabel.asy @node Bezier curves @chapter Bezier curves @cindex Bezier curves @cindex direction specifier Each interior node of a cubic spline may be given a direction prefix or suffix @code{@{dir@}}: the direction of the pair @code{dir} specifies the direction of the incoming or outgoing tangent, respectively, to the curve at that node. Exterior nodes may be given direction specifiers only on their interior side. A cubic spline between the node @math{z_0}, with postcontrol point @math{c_0}, and the node @math{z_1}, with precontrol point @math{c_1}, is computed as the Bezier curve @sp 1 @center @image{./bezier,,,(1-t)^3*z_0+3t(1-t)^2*c_0+3t^2(1-t)*c_1+t^3*z_1 for 0 <=t <= 1.} As illustrated in the diagram below, the third-order midpoint (@math{m_5}) constructed from two endpoints @math{z_0} and @math{z_1} and two control points @math{c_0} and @math{c_1}, is the point corresponding to @math{t=1/2} on the Bezier curve formed by the quadruple (@math{z_0}, @math{c_0}, @math{c_1}, @math{z_1}). This allows one to recursively construct the desired curve, by using the newly extracted third-order midpoint as an endpoint and the respective second- and first-order midpoints as control points: @sp 1 @center @image{./bezier2} Here @math{m_0}, @math{m_1} and @math{m_2} are the first-order midpoints, @math{m_3} and @math{m_4} are the second-order midpoints, and @math{m_5} is the third-order midpoint. The curve is then constructed by recursively applying the algorithm to (@math{z_0}, @math{m_0}, @math{m_3}, @math{m_5}) and (@math{m_5}, @math{m_4}, @math{m_2}, @math{z_1}). In fact, an analogous property holds for points located at any fraction @math{t} in @math{[0,1]} of each segment, not just for midpoints (@math{t=1/2}). The Bezier curve constructed in this manner has the following properties: @itemize @bullet @item It is entirely contained in the convex hull of the given four points. @item It starts heading from the first endpoint to the first control point and finishes heading from the second control point to the second endpoint. @end itemize @cindex @code{controls} The user can specify explicit control points between two nodes like this: @verbatim draw((0,0)..controls (0,100) and (100,100)..(100,0)); @end verbatim However, it is usually more convenient to just use the @code{..} operator, which tells @code{Asymptote} to choose its own control points using the algorithms described in Donald Knuth's monograph, The MetaFontbook, Chapter 14. The user can still customize the guide (or path) by specifying direction, tension, and curl values. The higher the tension, the straighter the curve is, and the more it approximates a straight line. @cindex @code{tension} @cindex @code{and} @cindex @code{atleast} One can change the spline tension from its default value of 1 to any real value greater than or equal to 0.75 (see John D. Hobby, Discrete and Computational Geometry 1, 1986): @verbatim draw((100,0)..tension 2 ..(100,100)..(0,100)); draw((100,0)..tension 3 and 2 ..(100,100)..(0,100)); draw((100,0)..tension atleast 2 ..(100,100)..(0,100)); @end verbatim In these examples there is a space between @code{2} and @code{..}. This is needed as @code{2.} is interpreted as a numerical constant. @cindex @code{curl} The curl parameter specifies the curvature at the endpoints of a path (0 means straight; the default value of 1 means approximately circular): @verbatim draw((100,0){curl 0}..(100,100)..{curl 0}(0,100)); @end verbatim @cindex @code{MetaPost ...@ } @cindex @code{::} The @code{MetaPost ...} path connector, which requests, when possible, an inflection-free curve confined to a triangle defined by the endpoints and directions, is implemented in @code{Asymptote} as the convenient abbreviation @code{::} for @code{..tension atleast 1 ..} (the ellipsis @code{...} is used in @code{Asymptote} to indicate a variable number of arguments; @pxref{Rest arguments}). For example, compare @verbatiminclude dots.asy @sp 1 @center @image{./dots} @noindent with @verbatiminclude colons.asy @sp 1 @center @image{./colons} @cindex @code{---} @cindex @code{&} The @code{---} connector is an abbreviation for @code{..tension atleast infinity..} and the @code{&} connector concatenates two paths, after first stripping off the last node of the first path (which normally should coincide with the first node of the second path). @node Programming @chapter Programming @cindex programming @menu * Data types:: void, bool, int, real, pair, triple, string * Paths and guides:: Bezier curves * Pens:: Colors, line types, line widths, font sizes * Transforms:: Affine transforms * Frames and pictures:: Canvases for immediate and deferred drawing * Deferred drawing:: Witholding drawing until all data is available * Files:: Reading and writing your data * Variable initializers:: Initialize your variables * Structures:: Organize your data * Operators:: Arithmetic and logical operators * Implicit scaling:: Avoiding those ugly *s * Functions:: Traditional and higher-order functions * Arrays:: Dynamic vectors * Casts:: Implicit and explicit casts * Import:: Importing external @code{Asymptote} modules * Static:: Where to allocate your variable? * Autounravel:: Adding associated libraries to structures @end menu Here is a short introductory example to the @code{Asymptote} programming language that highlights the similarity of its control structures with those of C, C++, and Java: @cindex declaration @cindex assignment @cindex conditional @cindex loop @cindex @code{if} @cindex @code{else} @cindex @code{for} @verbatim // This is a comment. // Declaration: Declare x to be a real variable; real x; // Assignment: Assign the real variable x the value 1. x=1.0; // Conditional: Test if x equals 1 or not. if(x == 1.0) { write("x equals 1.0"); } else { write("x is not equal to 1.0"); } // Loop: iterate 10 times for(int i=0; i < 10; ++i) { write(i); } @end verbatim @cindex @code{while} @cindex @code{do} @cindex @code{break} @cindex @code{continue} @code{Asymptote} supports @code{while}, @code{do}, @code{break}, and @code{continue} statements just as in C/C++. It also supports the Java-style shorthand for iterating over all elements of an array: @cindex array iteration @anchor{array iteration} @verbatim // Iterate over an array int[] array={1,1,2,3,5}; for(int k : array) { write(k); } @end verbatim @noindent In addition, it supports many features beyond the ones found in those languages. @node Data types @section Data types @cindex data types @code{Asymptote} supports the following data types (in addition to user-defined types): @table @code @item void @cindex @code{void} The void type is used only by functions that take or return no arguments. @item bool @cindex @code{bool} a boolean type that can only take on the values @code{true} or @code{false}. For example: @verbatim bool b=true; @end verbatim @noindent defines a boolean variable @code{b} and initializes it to the value @code{true}. If no initializer is given: @verbatim bool b; @end verbatim @noindent the value @code{false} is assumed. @item bool3 @cindex @code{bool3} an extended boolean type that can take on the values @code{true}, @code{default}, or @code{false}. A bool3 type can be cast to or from a bool. The default initializer for bool3 is @code{default}. @item int @cindex @code{int} @cindex @code{intMin} @cindex @code{intMax} an integer type; if no initializer is given, the implicit value @code{0} is assumed. The minimum allowed value of an integer is @code{intMin} and the maximum value is @code{intMax}. @item real @cindex @code{real} @cindex @code{realMin} @cindex @code{realMax} @cindex @code{realEpsilon} @cindex @code{realDigits} @cindex @code{mask} @cindex @code{inf} @cindex @code{nan} @cindex @code{isnan} a real number; this should be set to the highest-precision native floating-point type on the architecture. The implicit initializer for reals is @code{0.0}. Real numbers have precision @code{realEpsilon}, with @code{realDigits} significant digits. The smallest positive real number is @code{realMin} and the largest positive real number is @code{realMax}. The variables @code{inf} and @code{nan}, along with the function @code{bool isnan(real x)} are useful when floating-point exceptions are masked with the @code{-mask} command-line option (the default in interactive mode). @item pair @cindex @code{pair} complex number, that is, an ordered pair of real components @code{(x,y)}. The real and imaginary parts of a pair @code{z} can read as @code{z.x} and @code{z.y}. We say that @code{x} and @code{y} are virtual members of the data element pair; they cannot be directly modified, however. The implicit initializer for pairs is @code{(0.0,0.0)}. There are a number of ways to take the complex conjugate of a pair: @example pair z=(3,4); z=(z.x,-z.y); z=z.x-I*z.y; z=conj(z); @end example Here @code{I} is the pair @code{(0,1)}. A number of built-in functions are defined for pairs: @table @code @item pair conj(pair z) @cindex @code{conj} returns the conjugate of @code{z}; @item real length(pair z) @cindex @code{length} @cindex @code{abs} @cindex @code{abs2} returns the complex modulus @math{|@code{z}|} of its argument @code{z}. For example, @example pair z=(3,4); length(z); @end example returns the result 5. A synonym for @code{length(pair)} is @code{abs(pair)}. The function @code{abs2(pair z)} returns @math{|@code{z}|^2}; @item real angle(pair z, bool warn=true) @cindex @code{angle} returns the angle of @code{z} in radians in the interval [-@code{pi},@code{pi}] or @code{0} if @code{warn} is @code{false} and @code{z=(0,0)} (rather than producing an error); @item real degrees(pair z, bool warn=true) @cindex @code{degrees} returns the angle of @code{z} in degrees in the interval [0,360) or @code{0} if @code{warn} is @code{false} and @code{z=(0,0)} (rather than producing an error); @item pair unit(pair z) @cindex @code{unit} returns a unit vector in the direction of the pair @code{z}; @item pair expi(real angle) @cindex @code{expi} returns a unit vector in the direction @code{angle} measured in radians; @item pair dir(real degrees) @cindex @code{dir} returns a unit vector in the direction @code{degrees} measured in degrees; @item real xpart(pair z) @cindex @code{xpart} returns @code{z.x}; @item real ypart(pair z) @cindex @code{ypart} returns @code{z.y}; @item pair realmult(pair z, pair w) @cindex @code{realmult} returns the element-by-element product @code{(z.x*w.x,z.y*w.y)}; @item real dot(explicit pair z, explicit pair w) @cindex @code{dot} returns the dot product @code{z.x*w.x+z.y*w.y}; @item real cross(explicit pair z, explicit pair w) @cindex @code{cross} returns the 2D scalar product @code{z.x*w.y-z.y*w.x}; @cindex @code{orient} @item real orient(pair a, pair b, pair c); returns a positive (negative) value if @code{a--b--c--cycle} is oriented counterclockwise (clockwise) or zero if all three points are colinear. Equivalently, a positive (negative) value is returned if @code{c} lies to the left (right) of the line through @code{a} and @code{b} or zero if @code{c} lies on this line. The value returned can be expressed in terms of the 2D scalar cross product as @code{cross(a-c,b-c)}, which is the determinant @verbatim |a.x a.y 1| |b.x b.y 1| |c.x c.y 1| @end verbatim @cindex @code{incircle} @item real incircle(pair a, pair b, pair c, pair d); returns a positive (negative) value if @code{d} lies inside (outside) the circle passing through the counterclockwise-oriented points @code{a,b,c} or zero if @code{d} lies on the this circle. The value returned is the determinant @verbatim |a.x a.y a.x^2+a.y^2 1| |b.x b.y b.x^2+b.y^2 1| |c.x c.y c.x^2+c.y^2 1| |d.x d.y d.x^2+d.y^2 1| @end verbatim @item pair minbound(pair z, pair w) @cindex @code{minbound} returns @code{(min(z.x,w.x),min(z.y,w.y))}; @item pair maxbound(pair z, pair w) @cindex @code{maxbound} returns @code{(max(z.x,w.x),max(z.y,w.y))}. @end table @item triple @cindex @code{triple} an ordered triple of real components @code{(x,y,z)} used for three-dimensional drawings. The respective components of a triple @code{v} can read as @code{v.x}, @code{v.y}, and @code{v.z}. The implicit initializer for triples is @code{(0.0,0.0,0.0)}. Here are the built-in functions for triples: @table @code @item real length(triple v) @cindex @code{length} @cindex @code{abs} @cindex @code{abs2} returns the length @math{|@code{v}|} of its argument @code{v}. A synonym for @code{length(triple)} is @code{abs(triple)}. The function @code{abs2(triple v)} returns @math{|@code{v}|^2}; @item real polar(triple v, bool warn=true) @cindex @code{polar} returns the colatitude of @code{v} measured from the @math{z} axis in radians or @code{0} if @code{warn} is @code{false} and @code{v=O} (rather than producing an error); @item real azimuth(triple v, bool warn=true) @cindex @code{azimuth} returns the longitude of @code{v} measured from the @math{x} axis in radians or @code{0} if @code{warn} is @code{false} and @code{v.x=v.y=0} (rather than producing an error); @item real colatitude(triple v, bool warn=true) @cindex @code{colatitude} returns the colatitude of @code{v} measured from the @math{z} axis in degrees or @code{0} if @code{warn} is @code{false} and @code{v=O} (rather than producing an error); @item real latitude(triple v, bool warn=true) @cindex @code{latitude} returns the latitude of @code{v} measured from the @math{xy} plane in degrees or @code{0} if @code{warn} is @code{false} and @code{v=O} (rather than producing an error); @item real longitude(triple v, bool warn=true) @cindex @code{longitude} returns the longitude of @code{v} measured from the @math{x} axis in degrees or @code{0} if @code{warn} is @code{false} and @code{v.x=v.y=0} (rather than producing an error); @item triple unit(triple v) @cindex @code{unit} returns a unit triple in the direction of the triple @code{v}; @item triple expi(real polar, real azimuth) @cindex @code{expi} returns a unit triple in the direction @code{(polar,azimuth)} measured in radians; @item triple dir(real colatitude, real longitude) @cindex @code{dir} returns a unit triple in the direction @code{(colatitude,longitude)} measured in degrees; @item real xpart(triple v) @cindex @code{xpart} returns @code{v.x}; @item real ypart(triple v) @cindex @code{ypart} returns @code{v.y}; @item real zpart(triple v) @cindex @code{zpart} returns @code{v.z}; @item real dot(triple u, triple v) @cindex @code{dot} returns the dot product @code{u.x*v.x+u.y*v.y+u.z*v.z}; @item triple cross(triple u, triple v) @cindex @code{cross} returns the cross product @code{(u.y*v.z-u.z*v.y,u.z*v.x-u.x*v.z,u.x*v.y-v.x*u.y)}; @item triple minbound(triple u, triple v) @cindex @code{minbound} returns @code{(min(u.x,v.x),min(u.y,v.y),min(u.z,v.z))}; @item triple maxbound(triple u, triple v) @cindex @code{maxbound} returns @code{(max(u.x,v.x),max(u.y,v.y),max(u.z,v.z)}). @end table @item string @cindex @code{string} @cindex @TeX{} string a character string, implemented using the STL @code{string} class. Strings delimited by double quotes (@code{"}) are subject to the following mappings to allow the use of double quotes in @TeX{} (e.g.@ for using the @code{babel} package, @pxref{babel}): @itemize @bullet @item \" maps to " @item \\ maps to \\ @end itemize @cindex @code{C} string Strings delimited by single quotes (@code{'}) have the same mappings as character strings in ANSI @code{C}: @itemize @bullet @item \' maps to ' @item \" maps to " @item \? maps to ? @item \\ maps to backslash @item \a maps to alert @item \b maps to backspace @item \f maps to form feed @item \n maps to newline @item \r maps to carriage return @item \t maps to tab @item \v maps to vertical tab @item \0-\377 map to corresponding octal byte @item \x0-\xFF map to corresponding hexadecimal byte @end itemize The implicit initializer for strings is the empty string @code{""}. Strings may be concatenated with the @code{+} operator. In the following string functions, position @code{0} denotes the start of the string: @table @code @cindex @code{length} @item int length(string s) returns the length of the string @code{s}; @cindex @code{find} @item int find(string s, string t, int pos=0) returns the position of the first occurrence of string @code{t} in string @code{s} at or after position @code{pos}, or -1 if @code{t} is not a substring of @code{s}; @cindex @code{rfind} @item int rfind(string s, string t, int pos=-1) returns the position of the last occurrence of string @code{t} in string @code{s} at or before position @code{pos} (if @code{pos}=-1, at the end of the string @code{s}), or -1 if @code{t} is not a substring of @code{s}; @cindex @code{insert} @item string insert(string s, int pos, string t) returns the string formed by inserting string @code{t} at position @code{pos} in @code{s}; @cindex @code{erase} @item string erase(string s, int pos, int n) returns the string formed by erasing the string of length @code{n} (if @code{n}=-1, to the end of the string @code{s}) at position @code{pos} in @code{s}; @cindex @code{substr} @item string substr(string s, int pos, int n=-1) returns the substring of @code{s} starting at position @code{pos} and of length @code{n} (if @code{n}=-1, until the end of the string @code{s}); @cindex @code{reverse} @item string reverse(string s) returns the string formed by reversing string @code{s}; @item string replace(string s, string before, string after) @cindex @code{replace} returns a string with all occurrences of the string @code{before} in the string @code{s} changed to the string @code{after}; @item string replace(string s, string[][] table) returns a string constructed by translating in string @code{s} all occurrences of the string @code{before} in an array @code{table} of string pairs @{@code{before},@code{after}@} to the corresponding string @code{after}; @cindex @code{split} @item string[] split(string s, string delimiter="") returns an array of strings obtained by splitting @code{s} into substrings delimited by @code{delimiter} (an empty delimiter signifies a space, but with duplicate delimiters discarded); @cindex @code{array} @cindex @code{operator +(...string[] a)}. @item string[] array(string s) returns an array of strings obtained by splitting @code{s} into individual characters. The inverse operation is provided by @code{operator +(...string[] a)}. @anchor{format} @item string format(string s, int n, string locale="") @cindex @code{format} returns a string containing @code{n} formatted according to the C-style format string @code{s} using locale @code{locale} (or the current locale if an empty string is specified), following the behavior of the C function @code{fprintf}), except that only one data field is allowed. @item string format(string s=defaultformat, bool forcemath=false, string s=defaultseparator, real x, string locale="") returns a string containing @code{x} formatted according to the C-style format string @code{s} using locale @code{locale} (or the current locale if an empty string is specified), following the behavior of the C function @code{fprintf}), except that only one data field is allowed, trailing zeros are removed by default (unless @code{#} is specified), and if @code{s} specifies math mode or @code{forcemath=true}, @TeX{} is used to typeset scientific notation using the @code{defaultseparator="\!\times\!";}; @cindex @code{hex} @cindex @code{hexadecimal} @item int hex(string s); casts a hexadecimal string @code{s} to an integer; @cindex @code{ascii} @cindex @code{ascii} @item int ascii(string s); returns the ASCII code for the first character of string @code{s}; @cindex @code{string} @item string string(real x, int digits=realDigits) casts @code{x} to a string using precision @code{digits} and the C locale; @cindex @code{locale} @item string locale(string s="") sets the locale to the given string, if nonempty, and returns the current locale; @item string time(string format="%a %b %d %T %Z %Y") @cindex @code{time} @cindex date @cindex @code{strftime} returns the current time formatted by the ANSI C routine @code{strftime} according to the string @code{format} using the current locale. Thus @verbatim time(); time("%a %b %d %H:%M:%S %Z %Y"); @end verbatim @noindent are equivalent ways of returning the current time in the default format used by the @code{UNIX} @code{date} command; @cindex @code{seconds} @cindex @code{strptime} @item int seconds(string t="", string format="") returns the time measured in seconds after the Epoch (Thu Jan 01 00:00:00 UTC 1970) as determined by the ANSI C routine @code{strptime} according to the string @code{format} using the current locale, or the current time if @code{t} is the empty string. Note that the @code{"%Z"} extension to the POSIX @code{strptime} specification is ignored by the current GNU C Library. If an error occurs, the value -1 is returned. Here are some examples: @verbatim seconds("Mar 02 11:12:36 AM PST 2007","%b %d %r PST %Y"); seconds(time("%b %d %r %z %Y"),"%b %d %r %z %Y"); seconds(time("%b %d %r %Z %Y"),"%b %d %r "+time("%Z")+" %Y"); 1+(seconds()-seconds("Jan 1","%b %d"))/(24*60*60); @end verbatim The last example returns today's ordinal date, measured from the beginning of the year. @cindex @code{time} @cindex @code{strftime} @item string time(int seconds, string format="%a %b %d %T %Z %Y") returns the time corresponding to @code{seconds} seconds after the Epoch (Thu Jan 01 00:00:00 UTC 1970) formatted by the ANSI C routine @code{strftime} according to the string @code{format} using the current locale. For example, to return the date corresponding to 24 hours ago: @verbatim time(seconds()-24*60*60); @end verbatim @cindex @code{system} @item int system(string s) @item int system(string[] s) if the setting @code{safe} is false, call the arbitrary system command @code{s}; @cindex @code{asy} @item void asy(string format, bool overwrite=false ... string[] s) conditionally process each file name in array @code{s} in a new environment, using format @code{format}, overwriting the output file only if @code{overwrite} is true; @cindex @code{abort} @item void abort(string s="") aborts execution (with a non-zero return code in batch mode); if string @code{s} is nonempty, a diagnostic message constructed from the source file, line number, and @code{s} is printed; @cindex @code{assert} @item void assert(bool b, string s="") aborts execution with an error message constructed from @code{s} if @code{b=false}; @cindex @code{exit} @item void exit() exits (with a zero error return code in batch mode); @cindex @code{sleep} @item void sleep(int seconds) pauses for the given number of seconds; @cindex @code{usleep} @item void usleep(int microseconds) pauses for the given number of microseconds; @cindex @code{beep} @item void beep() produces a beep on the console; @end table @cindex @code{typedef} @cindex @code{using} @end table As in C/C++, complicated types may be abbreviated with @code{typedef} or @code{using}. For instance, the line @verbatim using multipath = path[]; @end verbatim will make @code{multipath} a type equivalent @code{path[]}, as will the equivalent line @verbatim typedef path[] multipath; @end verbatim For the most part such type aliasing is a convenience. However, it is required when declaring a function whose return type is a function (see the example in @ref{Functions}). @node Paths and guides @section Paths and guides @table @code @item path @cindex @code{path} a cubic spline resolved into a fixed path. The implicit initializer for paths is @code{nullpath}. @cindex @code{circle} @anchor{circle} For example, the routine @code{circle(pair c, real r)}, which returns a Bezier curve approximating a circle of radius @code{r} centered on @code{c}, is based on @code{unitcircle} (@pxref{unitcircle}): @verbatim path circle(pair c, real r) { return shift(c)*scale(r)*unitcircle; } @end verbatim If high accuracy is needed, a true circle may be produced with the routine @code{Circle} defined in the module @code{graph}: @cindex @code{Circle} @verbatim import graph; path Circle(pair c, real r, int n=nCircle); @end verbatim A circular arc consistent with @code{circle} centered on @code{c} with radius @code{r} from @code{angle1} to @code{angle2} degrees, drawing counterclockwise if @code{angle2 >= angle1}, can be constructed with @cindex @code{arc} @verbatim path arc(pair c, real r, real angle1, real angle2); @end verbatim One may also specify the direction explicitly: @verbatim path arc(pair c, real r, real angle1, real angle2, bool direction); @end verbatim Here the direction can be specified as CCW (counter-clockwise) or CW (clockwise). For convenience, an arc centered at @code{c} from pair @code{z1} to @code{z2} (assuming @code{|z2-c|=|z1-c|}) in the may also be constructed with @verbatim path arc(pair c, explicit pair z1, explicit pair z2, bool direction=CCW) @end verbatim If high accuracy is needed, true arcs may be produced with routines in the module @code{graph} that produce Bezier curves with @code{n} control points: @cindex @code{Arc} @verbatim import graph; path Arc(pair c, real r, real angle1, real angle2, bool direction, int n=nCircle); path Arc(pair c, real r, real angle1, real angle2, int n=nCircle); path Arc(pair c, explicit pair z1, explicit pair z2, bool direction=CCW, int n=nCircle); @end verbatim An ellipse can be drawn with the routine @cindex @code{ellipse} @verbatim path ellipse(pair c, real a, real b) { return shift(c)*scale(a,b)*unitcircle; } @end verbatim A brace can be constructed between pairs @code{a} and @code{b} with @cindex @code{brace} @verbatim path brace(pair a, pair b, real amplitude=bracedefaultratio*length(b-a)); @end verbatim This example illustrates the use of all five guide connectors discussed in @ref{Tutorial} and @ref{Bezier curves}: @verbatiminclude join.asy @sp 1 @center @image{./join} Here are some useful functions for paths: @table @code @cindex @code{length} @item int length(path p); This is the number of (linear or cubic) segments in path @code{p}. If @code{p} is cyclic, this is the same as the number of nodes in @code{p}. @cindex @code{size} @item int size(path p); This is the number of nodes in the path @code{p}. If @code{p} is cyclic, this is the same as @code{length(p)}. @cindex @code{cyclic} @item bool cyclic(path p); returns @code{true} iff path @code{p} is cyclic. @cindex @code{straight} @item bool straight(path p, int i); returns @code{true} iff the segment of path @code{p} between node @code{i} and node @code{i+1} is straight. @cindex @code{piecewisestraight} @item bool piecewisestraight(path p) returns @code{true} iff the path @code{p} is piecewise straight. @cindex @code{point} @item pair point(path p, int t); If @code{p} is cyclic, return the coordinates of node @code{t} mod @code{length(p)}. Otherwise, return the coordinates of node @code{t}, unless @code{t} < 0 (in which case @code{point(0)} is returned) or @code{t} > @code{length(p)} (in which case @code{point(length(p))} is returned). @item pair point(path p, real t); This returns the coordinates of the point between node @code{floor(t)} and @code{floor(t)+1} corresponding to the cubic spline parameter @code{t-floor(t)} (@pxref{Bezier curves}). If @code{t} lies outside the range [0,@code{length(p)}], it is first reduced modulo @code{length(p)} in the case where @code{p} is cyclic or else converted to the corresponding endpoint of @code{p}. @cindex @code{dir} @item pair dir(path p, int t, int sign=0, bool normalize=true); If @code{sign < 0}, return the direction (as a pair) of the incoming tangent to path @code{p} at node @code{t}; if @code{sign > 0}, return the direction of the outgoing tangent. If @code{sign=0}, the mean of these two directions is returned. @item pair dir(path p, real t, bool normalize=true); returns the direction of the tangent to path @code{p} at the point between node @code{floor(t)} and @code{floor(t)+1} corresponding to the cubic spline parameter @code{t-floor(t)} (@pxref{Bezier curves}). @item pair dir(path p) returns dir(p,length(p)). @item pair dir(path p, path q) returns unit(dir(p)+dir(q)). @cindex @code{accel} @item pair accel(path p, int t, int sign=0); If @code{sign < 0}, return the acceleration of the incoming path @code{p} at node @code{t}; if @code{sign > 0}, return the acceleration of the outgoing path. If @code{sign=0}, the mean of these two accelerations is returned. @cindex @code{accel} @item pair accel(path p, real t); returns the acceleration of the path @code{p} at the point @code{t}. @cindex @code{radius} @item real radius(path p, real t); returns the radius of curvature of the path @code{p} at the point @code{t}. @cindex @code{precontrol} @item pair precontrol(path p, int t); returns the precontrol point of @code{p} at node @code{t}. @item pair precontrol(path p, real t); returns the effective precontrol point of @code{p} at parameter @code{t}. @cindex @code{postcontrol} @item pair postcontrol(path p, int t); returns the postcontrol point of @code{p} at node @code{t}. @item pair postcontrol(path p, real t); returns the effective postcontrol point of @code{p} at parameter @code{t}. @cindex @code{arclength} @item real arclength(path p); returns the length (in user coordinates) of the piecewise linear or cubic curve that path @code{p} represents. @cindex @code{arctime} @item real arctime(path p, real L); returns the path "time", a real number between 0 and the length of the path in the sense of @code{point(path p, real t)}, at which the cumulative arclength (measured from the beginning of the path) equals @code{L}. @cindex @code{arcpoint} @item pair arcpoint(path p, real L); returns @code{point(p,arctime(p,L))}. @cindex @code{dirtime} @item real dirtime(path p, pair z); returns the first "time", a real number between 0 and the length of the path in the sense of @code{point(path, real)}, at which the tangent to the path has the direction of pair @code{z}, or -1 if this never happens. @cindex @code{reltime} @item real reltime(path p, real l); returns the time on path @code{p} at the relative fraction @code{l} of its arclength. @cindex @code{relpoint} @item pair relpoint(path p, real l); returns the point on path @code{p} at the relative fraction @code{l} of its arclength. @cindex @code{midpoint} @item pair midpoint(path p); returns the point on path @code{p} at half of its arclength. @cindex @code{reverse} @item path reverse(path p); returns a path running backwards along @code{p}. @cindex @code{subpath} @item path subpath(path p, int a, int b); returns the subpath of @code{p} running from node @code{a} to node @code{b}. If @code{a} > @code{b}, the direction of the subpath is reversed. @item path subpath(path p, real a, real b); returns the subpath of @code{p} running from path time @code{a} to path time @code{b}, in the sense of @code{point(path, real)}. If @code{a} > @code{b}, the direction of the subpath is reversed. @cindex @code{intersect} @item real[] intersect(path p, path q, real fuzz=-1); If @code{p} and @code{q} have at least one intersection point, return a real array of length 2 containing the times representing the respective path times along @code{p} and @code{q}, in the sense of @code{point(path, real)}, for one such intersection point (as chosen by the algorithm described on page 137 of @code{The MetaFontbook}). The computations are performed to the absolute error specified by @code{fuzz}, or if @code{fuzz < 0}, to machine precision. If the paths do not intersect, return a real array of length 0. @cindex @code{intersections} @item real[][] intersections(path p, path q, real fuzz=-1); Return all (unless there are infinitely many) intersection times of paths @code{p} and @code{q} as a sorted array of real arrays of length 2 (@pxref{sort}). The computations are performed to the absolute error specified by @code{fuzz}, or if @code{fuzz < 0}, to machine precision. @cindex @code{intersections} @item real[] intersections(path p, explicit pair a, explicit pair b, real fuzz=-1); Return all (unless there are infinitely many) intersection times of path @code{p} with the (infinite) line through points @code{a} and @code{b} as a sorted array. The intersections returned are guaranteed to be correct to within the absolute error specified by @code{fuzz}, or if @code{fuzz < 0}, to machine precision. @cindex @code{times} @item real[] times(path p, real x) returns all intersection times of path @code{p} with the vertical line through @code{(x,0)}. @cindex @code{times} @item real[] times(path p, explicit pair z) returns all intersection times of path @code{p} with the horizontal line through @code{(0,z.y)}. @cindex @code{mintimes} @item real[] mintimes(path p) returns an array of length 2 containing times at which path @code{p} reaches its minimal horizontal and vertical extents, respectively. @cindex @code{maxtimes} @item real[] maxtimes(path p) returns an array of length 2 containing times at which path @code{p} reaches its maximal horizontal and vertical extents, respectively. @cindex @code{intersectionpoint} @item pair intersectionpoint(path p, path q, real fuzz=-1); returns the intersection point @code{point(p,intersect(p,q,fuzz)[0])}. @cindex @code{intersectionpoints} @item pair[] intersectionpoints(path p, path q, real fuzz=-1); returns an array containing all intersection points of the paths @code{p} and @code{q}. @anchor{extension} @cindex @code{whatever} @cindex @code{extension} @item pair extension(pair P, pair Q, pair p, pair q); returns the intersection point of the extensions of the line segments @code{P--Q} and @code{p--q}, or if the lines are parallel, @code{(infinity,infinity)}. @cindex @code{cut} @cindex @code{slice} @item slice cut(path p, path knife, int n); returns the portions of path @code{p} before and after the @code{n}th intersection of @code{p} with path @code{knife} as a structure @code{slice} (if no intersection exist is found, the entire path is considered to be `before' the intersection): @verbatim struct slice { path before,after; } @end verbatim The argument @code{n} is treated as modulo the number of intersections. @cindex @code{firstcut} @cindex @code{slice} @item slice firstcut(path p, path knife); equivalent to @code{cut(p,knife,0);} @cindex @code{MetaPost cutbefore} Note that @code{firstcut.after} plays the role of the @code{MetaPost cutbefore} command. @cindex @code{lastcut} @item slice lastcut(path p, path knife); equivalent to @code{cut(p,knife,-1);} @cindex @code{MetaPost cutafter} Note that @code{lastcut.before} plays the role of the @code{MetaPost cutafter} command. @cindex @code{buildcycle} @item path buildcycle(... path[] p); This returns the path surrounding a region bounded by a list of two or more consecutively intersecting paths, following the behavior of the @code{MetaPost buildcycle} command. @cindex @code{min} @item pair min(path p); returns the pair (left,bottom) for the path bounding box of path @code{p}. @cindex @code{max} @item pair max(path p); returns the pair (right,top) for the path bounding box of path @code{p}. @cindex @code{windingnumber} @cindex @code{undefined} @item int windingnumber(path p, pair z); returns the winding number of the cyclic path @code{p} relative to the point @code{z}. The winding number is positive if the path encircles @code{z} in the counterclockwise direction. If @code{z} lies on @code{p} the constant @code{undefined} (defined to be the largest odd integer) is returned. @cindex @code{interior} @item bool interior(int windingnumber, pen fillrule) returns true if @code{windingnumber} corresponds to an interior point according to @code{fillrule}. @cindex @code{inside} @item bool inside(path p, pair z, pen fillrule=currentpen); returns @code{true} iff the point @code{z} lies inside or on the edge of the region bounded by the cyclic path @code{p} according to the fill rule @code{fillrule} (@pxref{fillrule}). @cindex @code{inside} @item int inside(path p, path q, pen fillrule=currentpen); returns @code{1} if the cyclic path @code{p} strictly contains @code{q} according to the fill rule @code{fillrule} (@pxref{fillrule}), @code{-1} if the cyclic path @code{q} strictly contains @code{p}, and @code{0} otherwise. @cindex @code{inside} @item pair inside(path p, pen fillrule=currentpen); returns an arbitrary point strictly inside a nondegenerate cyclic path @code{p} according to the fill rule @code{fillrule} (@pxref{fillrule}). @cindex @code{strokepath} @item path[] strokepath(path g, pen p=currentpen); returns the path array that @code{PostScript} would fill in drawing path @code{g} with pen @code{p}. @end table @item guide @cindex @code{guide} an unresolved cubic spline (list of cubic-spline nodes and control points). The implicit initializer for a guide is @code{nullpath}; this is useful for building up a guide within a loop. A guide is similar to a path except that the computation of the cubic spline is deferred until drawing time (when it is resolved into a path); this allows two guides with free endpoint conditions to be joined together smoothly. The solid curve in the following example is built up incrementally as a guide, but only resolved at drawing time; the dashed curve is incrementally resolved at each iteration, before the entire set of nodes (shown in red) is known: @verbatiminclude mexicanhat.asy @sp 1 @center @image{./mexicanhat} We point out an efficiency distinction in the use of guides and paths: @verbatim guide g; for(int i=0; i < 10; ++i) g=g--(i,i); path p=g; @end verbatim @noindent runs in linear time, whereas @verbatim path p; for(int i=0; i < 10; ++i) p=p--(i,i); @end verbatim @noindent runs in quadratic time, as the entire path up to that point is copied at each step of the iteration. The following routines can be used to examine the individual elements of a guide without actually resolving the guide to a fixed path (except for internal cycles, which are resolved): @table @code @cindex @code{size} @item int size(guide g); Analogous to @code{size(path p)}. @cindex @code{length} @item int length(guide g); Analogous to @code{length(path p)}. @cindex @code{cyclic} @item bool cyclic(path p); Analogous to @code{cyclic(path p)}. @cindex @code{point} @item pair point(guide g, int t); Analogous to @code{point(path p, int t)}. @cindex @code{reverse} @item guide reverse(guide g); Analogous to @code{reverse(path p)}. If @code{g} is cyclic and also contains a secondary cycle, it is first solved to a path, then reversed. If @code{g} is not cyclic but contains an internal cycle, only the internal cycle is solved before reversal. If there are no internal cycles, the guide is reversed but not solved to a path. @cindex @code{dirSpecifier} @item pair[] dirSpecifier(guide g, int i); This returns a pair array of length 2 containing the outgoing (in element 0) and incoming (in element 1) direction specifiers (or @code{(0,0)} if none specified) for the segment of guide @code{g} between nodes @code{i} and @code{i+1}. @cindex @code{controlSpecifier} @item pair[] controlSpecifier(guide g, int i); If the segment of guide @code{g} between nodes @code{i} and @code{i+1} has explicit outgoing and incoming control points, they are returned as elements 0 and 1, respectively, of a two-element array. Otherwise, an empty array is returned. @cindex @code{tensionSpecifier} @item tensionSpecifier tensionSpecifier(guide g, int i); This returns the tension specifier for the segment of guide @code{g} between nodes @code{i} and @code{i+1}. The individual components of the @code{tensionSpecifier} type can be accessed as the virtual members @code{in}, @code{out}, and @code{atLeast}. @cindex @code{curlSpecifier} @item real[] curlSpecifier(guide g); This returns an array containing the initial curl specifier (in element 0) and final curl specifier (in element 1) for guide @code{g}. @end table As a technical detail we note that a direction specifier given to @code{nullpath} modifies the node on the other side: the guides @verbatim a..{up}nullpath..b; c..nullpath{up}..d; e..{up}nullpath{down}..f; @end verbatim are respectively equivalent to @verbatim a..nullpath..{up}b; c{up}..nullpath..d; e{down}..nullpath..{up}f; @end verbatim @end table @node Pens @section Pens @cindex @code{pen} @cindex @code{currentpen} @cindex @code{MetaPost pickup} In @code{Asymptote}, pens provide a context for the four basic drawing commands (@pxref{Drawing commands}). They are used to specify the following drawing attributes: color, line type, line width, line cap, line join, fill rule, text alignment, font, font size, pattern, overwrite mode, and calligraphic transforms on the pen nib. The default pen used by the drawing routines is called @code{currentpen}. This provides the same functionality as the @code{MetaPost} command @code{pickup}. The implicit initializer for pens is @code{defaultpen}. @cindex @code{+} @cindex @code{*} Pens may be added together with the nonassociative binary operator @code{+}. This will add the colors of the two pens. All other non-default attributes of the rightmost pen will override those of the leftmost pen. Thus, one can obtain a yellow dashed pen by saying @code{dashed+red+green} or @code{red+green+dashed} or @code{red+dashed+green}. The binary operator @code{*} can be used to scale the color of a pen by a real number, until it saturates with one or more color components equal to 1. @itemize @bullet @item Colors are specified using one of the following colorspaces: @cindex color @table @code @item pen gray(real g); @cindex @code{gray} @cindex grayscale This produces a grayscale color, where the intensity @code{g} lies in the interval [0,1], with 0.0 denoting black and 1.0 denoting white. @item pen rgb(real r, real g, real b); @cindex @code{rgb} This produces an @acronym{RGB} color, where each of the red, green, and blue intensities @code{r}, @code{g}, @code{b}, lies in the interval [0,1]. @item pen RGB(int r, int g, int b); @cindex @code{rgb} This produces an @acronym{RGB} color, where each of the red, green, and blue intensities @code{r}, @code{g}, @code{b}, lies in the interval [0,255]. @item pen cmyk(real c, real m, real y, real k); @cindex @code{cmyk} This produces a @acronym{CMYK} color, where each of the cyan, magenta, yellow, and black intensities @code{c}, @code{m}, @code{y}, @code{k}, lies in the interval [0,1]. @item pen invisible; @cindex @code{invisible} This special pen writes in invisible ink, but adjusts the bounding box as if something had been drawn (like the @code{\phantom} command in @TeX{}). The function @code{bool invisible(pen)} can be used to test whether a pen is invisible. @end table @cindex @code{defaultpen} The default color is @code{black}; this may be changed with the routine @code{defaultpen(pen)}. The function @code{colorspace(pen p)} returns the colorspace of pen @code{p} as a string (@code{"gray"}, @code{"rgb"}, @code{"cmyk"}, or @code{""}). @cindex @code{colors} The function @code{real[] colors(pen)} returns the color components of a pen. The functions @code{pen gray(pen)}, @code{pen rgb(pen)}, and @code{pen cmyk(pen)} return new pens obtained by converting their arguments to the respective color spaces. @cindex @code{colorless} The function @code{colorless(pen=currentpen)} returns a copy of its argument with the color attributes stripped (to avoid color mixing). A 6-character RGB hexadecimal string can be converted to a pen with the routine @cindex @code{rgb} @cindex @code{hexadecimal} @verbatim pen rgb(string s); @end verbatim @item A pen can be converted to a hexadecimal string with @cindex @code{hex} @code{string hex(pen p);} Various shades and mixtures of the grayscale primary colors @code{black} and @code{white}, @acronym{RGB} primary colors @code{red}, @code{green}, and @code{blue}, and @acronym{RGB} secondary colors @code{cyan}, @code{magenta}, and @code{yellow} are defined as named colors, along with the @acronym{CMYK} primary colors @code{Cyan}, @code{Magenta}, @code{Yellow}, and @code{Black}, in the module @code{plain}: @sp 1 @center @image{./colors} The standard 140 @acronym{RGB} @code{X11} colors can be imported with the command @verbatim import x11colors; @end verbatim and the standard 68 @acronym{CMYK} @TeX{} colors can be imported with the command @verbatim import texcolors; @end verbatim Note that there is some overlap between these two standards and the definitions of some colors (e.g.@ @code{Green}) actually disagree. @code{Asymptote} also comes with a @code{asycolors.sty} @code{LaTeX} package that defines to @code{LaTeX} @acronym{CMYK} versions of @code{Asymptote}'s predefined colors, so that they can be used directly within @code{LaTeX} strings. Normally, such colors are passed to @code{LaTeX} via a pen argument; however, to change the color of only a portion of a string, say for a slide presentation, (@pxref{slide}) it may be desirable to specify the color directly to @code{LaTeX}. This file can be passed to @code{LaTeX} with the @code{Asymptote} command @verbatim usepackage("asycolors"); @end verbatim The structure @code{hsv} defined in @code{plain_pens.asy} may be used to convert between @acronym{HSV} and @acronym{RGB} spaces, where the hue @code{h} is an angle in @math{[0,360)} and the saturation @code{s} and value @code{v} lie in @code{[0,1]}: @verbatim pen p=hsv(180,0.5,0.75); write(p); // ([default], red=0.375, green=0.75, blue=0.75) hsv q=p; write(q.h,q.s,q.v); // 180 0.5 0.75 @end verbatim @item Line types are specified with the function @code{pen linetype(real[] a, real offset=0, bool scale=true, bool adjust=true)}, @cindex @code{solid} @cindex @code{dashed} @cindex @code{dotted} @cindex @code{longdashed} @cindex @code{dashdotted} @cindex @code{longdashdotted} where @code{a} is an array of real array numbers. The optional parameter @code{offset} specifies where in the pattern to begin. The first number specifies how far (if @code{scale} is @code{true}, in units of the pen line width; otherwise in @code{PostScript} units) to draw with the pen on, the second number specifies how far to draw with the pen off, and so on. If @code{adjust} is @code{true}, these spacings are automatically adjusted by @code{Asymptote} to fit the arclength of the path. Here are the predefined line types: @verbatim pen solid=linetype(new real[]); pen dotted=linetype(new real[] {0,4}); pen dashed=linetype(new real[] {8,8}); pen longdashed=linetype(new real[] {24,8}); pen dashdotted=linetype(new real[] {8,8,0,8}); pen longdashdotted=linetype(new real[] {24,8,0,8}); pen Dotted(pen p=currentpen) {return linetype(new real[] {0,3})+2*linewidth(p);} pen Dotted=Dotted(); @end verbatim @sp 1 @center @image{./linetype} @cindex @code{defaultpen} The default line type is @code{solid}; this may be changed with @code{defaultpen(pen)}. @cindex @code{linetype} @cindex @code{offset} @cindex @code{scale} @cindex @code{adjust} The line type of a pen can be determined with the functions @code{real[] linetype(pen p=currentpen)}, @code{real offset(pen p)}, @code{bool scale(pen p)}, and @code{bool adjust(pen p)}. @cindex @code{linewidth} @cindex @code{defaultpen} @item The pen line width is specified in @code{PostScript} units with @code{pen linewidth(real)}. The default line width is 0.5 bp; this value may be changed with @code{defaultpen(pen)}. The line width of a pen is returned by @code{real linewidth(pen p=currentpen)}. For convenience, in the module @code{plain_pens} we define @verbatim void defaultpen(real w) {defaultpen(linewidth(w));} pen operator +(pen p, real w) {return p+linewidth(w);} pen operator +(real w, pen p) {return linewidth(w)+p;} @end verbatim so that one may set the line width like this: @verbatim defaultpen(2); pen p=red+0.5; @end verbatim @cindex @code{linecap} @cindex @code{squarecap} @cindex @code{roundcap} @cindex @code{extendcap} @cindex @code{defaultpen} @item A pen with a specific @code{PostScript} line cap is returned on calling @code{linecap} with an integer argument: @verbatim pen squarecap=linecap(0); pen roundcap=linecap(1); pen extendcap=linecap(2); @end verbatim @noindent The default line cap, @code{roundcap}, may be changed with @code{defaultpen(pen)}. The line cap of a pen is returned by @code{int linecap(pen p=currentpen)}. @cindex @code{linejoin} @cindex @code{miterjoin} @cindex @code{roundjoin} @cindex @code{beveljoin} @item A pen with a specific @code{PostScript} join style is returned on calling @code{linejoin} with an integer argument: @verbatim pen miterjoin=linejoin(0); pen roundjoin=linejoin(1); pen beveljoin=linejoin(2); @end verbatim @noindent The default join style, @code{roundjoin}, may be changed with @code{defaultpen(pen)}.The join style of a pen is returned by @code{int linejoin(pen p=currentpen)}. @cindex @code{miterlimit} @item A pen with a specific @code{PostScript} miter limit is returned by calling @code{miterlimit(real)}. The default miterlimit, @code{10.0}, may be changed with @code{defaultpen(pen)}. The miter limit of a pen is returned by @code{real miterlimit(pen p=currentpen)}. @cindex @code{fillrule} @cindex @code{zerowinding} @cindex @code{evenodd} @anchor{fillrule} @item A pen with a specific @code{PostScript} fill rule is returned on calling @code{fillrule} with an integer argument: @verbatim pen zerowinding=fillrule(0); pen evenodd=fillrule(1); @end verbatim @noindent The fill rule, which identifies the algorithm used to determine the insideness of a path or array of paths, only affects the @code{clip}, @code{fill}, and @code{inside} functions. For the @code{zerowinding} fill rule, a point @code{z} is outside the region bounded by a path if the number of upward intersections of the path with the horizontal line @code{z--z+infinity} minus the number of downward intersections is zero. For the @code{evenodd} fill rule, @code{z} is considered to be outside the region if the total number of such intersections is even. The default fill rule, @code{zerowinding}, may be changed with @code{defaultpen(pen)}. The fill rule of a pen is returned by @code{int fillrule(pen p=currentpen)}. @cindex @code{nobasealign} @cindex @code{basealign} @anchor{basealign} @item A pen with a specific text alignment setting is returned on calling @code{basealign} with an integer argument: @verbatim pen nobasealign=basealign(0); pen basealign=basealign(1); @end verbatim @noindent The default setting, @code{nobasealign}, which may be changed with @code{defaultpen(pen)}, causes the label alignment routines to use the full label bounding box for alignment. In contrast, @code{basealign} requests that the @TeX{} baseline be respected. The base align setting of a pen is returned by @code{int basealign(pen p=currentpen)}. For example, in the following image, the baselines of green @math{\pi} and @math{\gamma} are aligned, while the bottom border of red @math{-\pi} and @math{-\gamma} are aligned. @verbatiminclude basealign.asy @sp 1 @center @image{./basealign} Another method for aligning baselines is provided by the @code{baseline} function (@pxref{baseline}). @cindex @code{fontsize} @cindex @code{lineskip} @cindex @code{defaultpen} @cindex @code{type1cm} @item The font size is specified in @TeX{} points (1 pt = 1/72.27 inches) with the function @code{pen fontsize(real size, real lineskip=1.2*size)}. The default font size, 12pt, may be changed with @code{defaultpen(pen)}. Nonstandard font sizes may require inserting @verbatim import fontsize; @end verbatim at the beginning of the file (this requires the @code{type1cm} package available from @quotation @url{http://mirror.ctan.org/macros/latex/contrib/type1cm/} @end quotation and included in recent @code{LaTeX} distributions). The font size and line skip of a pen can be examined with the routines @code{real fontsize(pen p=currentpen)} and @code{real lineskip(pen p=currentpen)}, respectively. @cindex font @cindex @LaTeX{} NFSS fonts @cindex @code{font} @item A pen using a specific @LaTeX{} NFSS font is returned by calling the function @code{pen font(string encoding, string family, string series, string shape)}. The default setting, @code{font("OT1","cmr","m","n")}, corresponds to 12pt Computer Modern Roman; this may be changed with @code{defaultpen(pen)}. The font setting of a pen is returned by @code{string font(pen p=currentpen)}. @cindex @TeX{} fonts Alternatively, one may select a fixed-size @TeX{} font (on which @code{fontsize} has no effect) like @code{"cmr12"} (12pt Computer Modern Roman) or @code{"pcrr"} (Courier) using the function @code{pen font(string name)}. An optional size argument can also be given to scale the font to the requested size: @code{pen font(string name, real size)}. @cindex @code{fontcommand} A nonstandard font command can be generated with @code{pen fontcommand(string)}. @cindex @code{PostScript} fonts A convenient interface to the following standard @code{PostScript} fonts is also provided: @verbatim pen AvantGarde(string series="m", string shape="n"); pen Bookman(string series="m", string shape="n"); pen Courier(string series="m", string shape="n"); pen Helvetica(string series="m", string shape="n"); pen NewCenturySchoolBook(string series="m", string shape="n"); pen Palatino(string series="m", string shape="n"); pen TimesRoman(string series="m", string shape="n"); pen ZapfChancery(string series="m", string shape="n"); pen Symbol(string series="m", string shape="n"); pen ZapfDingbats(string series="m", string shape="n"); @end verbatim @cindex font @cindex font encoding @cindex input encoding @cindex language context @item Starting with the 2018/04/01 release, @LaTeX{} takes UTF-8 as the new default input encoding. However, you can still set different input encoding (so as the font, font encoding or even language context). @cindex Cyrillic @cindex Russian Here is an example for @code{cp1251} and Russian language in Cyrillic script (font encoding @code{T2A}): @verbatim texpreamble("\usepackage[math]{anttor}"); texpreamble("\usepackage[T2A]{fontenc}"); texpreamble("\usepackage[cp1251]{inputenc}"); texpreamble("\usepackage[russian]{babel}"); @end verbatim @noindent @cindex Chinese @cindex Japanese @cindex Korean @cindex CJK Support for Chinese, Japanese, and Korean fonts is provided by the CJK package: @quotation @url{https://ctan.org/pkg/cjk} @end quotation @noindent The following commands enable the CJK song family (within a label, you can also temporarily switch to another family, say kai, by prepending @code{"\CJKfamily@{kai@}"} to the label string): @verbatim texpreamble("\usepackage{CJK} \AtBeginDocument{\begin{CJK*}{GBK}{song}} \AtEndDocument{\clearpage\end{CJK*}}"); @end verbatim @anchor{transparency} @cindex transparency @cindex @code{opacity} @item The transparency of a pen can be changed with the command: @verbatim pen opacity(real opacity=1, string blend="Compatible"); @end verbatim The opacity can be varied from @code{0} (fully transparent) to the default value of @code{1} (opaque), and @code{blend} specifies one of the following foreground--background blending operations: @verbatim "Compatible","Normal","Multiply","Screen","Overlay","SoftLight", "HardLight","ColorDodge","ColorBurn","Darken","Lighten","Difference", "Exclusion","Hue","Saturation","Color","Luminosity", @end verbatim as described in Tables 136 and 137 of @url{https://opensource.adobe.com/dc-acrobat-sdk-docs/standards/pdfstandards/pdf/PDF32000_2008.pdf}. Since @code{PostScript} does not support transparency, this feature is only effective with the @code{-f pdf} output format option; other formats can be produced from the resulting @acronym{PDF} file with the @code{ImageMagick} @code{magick} program. Labels are always drawn with an @code{opacity} of 1. A simple example of transparent filling is provided in the example file @code{@uref{https://asymptote.sourceforge.io/gallery/transparency.svg,,transparency}@uref{https://asymptote.sourceforge.io/gallery/transparency.asy,,.asy}}. @cindex patterns @cindex tilings @item @code{PostScript} commands within a @code{picture} may be used to create a tiling pattern, identified by the string @code{name}, for @code{fill} and @code{draw} operations by adding it to the global @code{PostScript} frame @code{currentpatterns}, with optional left-bottom margin @code{lb} and right-top margin @code{rt}. @verbatim import patterns; void add(string name, picture pic, pair lb=0, pair rt=0); @end verbatim To @code{fill} or @code{draw} using pattern @code{name}, use the pen @code{pattern("name")}. For example, rectangular tilings can be constructed using the routines @code{picture tile(real Hx=5mm, real Hy=0, pen p=currentpen, filltype filltype=NoFill)}, @code{picture checker(real Hx=5mm, real Hy=0, pen p=currentpen)}, and @code{picture brick(real Hx=5mm, real Hy=0, pen p=currentpen)} defined in module @code{patterns}: @cindex grid @cindex tile @cindex checker @cindex brick @verbatiminclude tile.asy @sp 1 @center @image{./tile} @cindex hatch @cindex crosshatch Hatch patterns can be generated with the routines @code{picture hatch(real H=5mm, pair dir=NE, pen p=currentpen)}, @code{picture crosshatch(real H=5mm, pen p=currentpen)}: @verbatiminclude hatch.asy @sp 1 @center @image{./hatch} You may need to turn off aliasing in your @code{PostScript} viewer for patterns to appear correctly. Custom patterns can easily be constructed, following the examples in module @code{patterns}. The tiled pattern can even incorporate shading (@pxref{gradient shading}), as illustrated in this example (not included in the manual because not all printers support @code{PostScript} 3): @verbatiminclude shadedtiling.asy @anchor{makepen} @cindex @code{makepen} @item One can specify a custom pen nib as an arbitrary polygonal path with @code{pen makepen(path)}; this path represents the mark to be drawn for paths containing a single point. This pen nib path can be recovered from a pen with @code{path nib(pen)}. Unlike in @code{MetaPost}, the path need not be convex: @verbatiminclude makepen.asy @sp 1 @center @image{./makepen} The value @code{nullpath} represents a circular pen nib (the default); an elliptical pen can be achieved simply by multiplying the pen by a transform: @code{yscale(2)*currentpen}. @anchor{overwrite} @cindex @code{overwrite} @item One can prevent labels from overwriting one another by using the pen attribute @code{overwrite}, which takes a single argument: @table @code @cindex @code{Allow} @cindex @code{defaultpen} @item Allow Allow labels to overwrite one another. This is the default behavior (unless overridden with @code{defaultpen(pen)}. @cindex @code{Suppress} @item Suppress Suppress, with a warning, each label that would overwrite another label. @cindex @code{SuppressQuiet} @item SuppressQuiet Suppress, without warning, each label that would overwrite another label. @cindex @code{Move} @item Move Move a label that would overwrite another out of the way and issue a warning. As this adjustment is during the final output phase (in @code{PostScript} coordinates) it could result in a larger figure than requested. @cindex @code{MoveQuiet} @item MoveQuiet Move a label that would overwrite another out of the way, without warning. As this adjustment is during the final output phase (in @code{PostScript} coordinates) it could result in a larger figure than requested. @end table @end itemize @cindex @code{defaultpen} @cindex @code{resetdefaultpen} The routine @code{defaultpen()} returns the current default pen attributes. Calling the routine @code{resetdefaultpen()} resets all pen default attributes to their initial values. @node Transforms @section Transforms @cindex @code{transform} @code{Asymptote} makes extensive use of affine transforms. A pair @code{(x,y)} is transformed by the transform @code{t=(t.x,t.y,t.xx,t.xy,t.yx,t.yy)} to @code{(x',y')}, where @verbatim x' = t.x + t.xx * x + t.xy * y y' = t.y + t.yx * x + t.yy * y @end verbatim @noindent This is equivalent to the @code{PostScript} transformation @code{[t.xx t.yx t.xy t.yy t.x t.y]}. Transforms can be applied to pairs, guides, paths, pens, strings, transforms, frames, and pictures by multiplication (via the binary operator @code{*}) on the left (@pxref{circle} for an example). @cindex @code{inverse} Transforms can be composed with one another and inverted with the function @code{transform inverse(transform t)}; they can also be raised to any integer power with the @code{^} operator. The built-in transforms are: @table @code @item transform identity; @cindex @code{identity} the identity transform; @item transform shift(pair z); @cindex @code{shift} translates by the pair @code{z}; @item transform shift(real x, real y); @cindex @code{shift} translates by the pair @code{(x,y)}; @item transform xscale(real x); @cindex @code{xscale} scales by @code{x} in the @math{x} direction; @item transform yscale(real y); @cindex @code{yscale} scales by @code{y} in the @math{y} direction; @item transform scale(real s); @cindex @code{scale} scale by @code{s} in both @math{x} and @math{y} directions; @item transform scale(real x, real y); @cindex @code{scale} scale by @code{x} in the @math{x} direction and by @code{y} in the @math{y} direction; @item transform slant(real s); @cindex @code{slant} maps @code{(x,y)} --> @code{(x+s*y,y)}; @item transform rotate(real angle, pair z=(0,0)); rotates by @code{angle} in degrees about @code{z}; @item transform reflect(pair a, pair b); @cindex @code{reflect} reflects about the line @code{a--b}. @item transform zeroTransform; @cindex @code{zeroTransform} the zero transform; @end table @cindex @code{shift} @cindex @code{shiftless} The implicit initializer for transforms is @code{identity()}. The routines @code{shift(transform t)} and @code{shiftless(transform t)} return the transforms @code{(t.x,t.y,0,0,0,0)} and @code{(0,0,t.xx,t.xy,t.yx,t.yy)} respectively. The function @code{bool isometry(transform t)} can be used to test if @code{t} is an isometry (preserves distance). @node Frames and pictures @section Frames and pictures @table @code @item frame @cindex @code{frame} @cindex @code{newframe} @cindex @code{empty} @cindex @code{erase} @cindex @code{min} @cindex @code{max} Frames are canvases for drawing in @code{PostScript} coordinates. While working with frames directly is occasionally necessary for constructing deferred drawing routines The implicit initializer for frames is @code{newframe}. The function @code{bool empty(frame f)} returns @code{true} only if the frame @code{f} is empty. A frame may be erased with the @code{erase(frame)} routine. The functions @code{pair min(frame)} and @code{pair max(frame)} return the (left,bottom) and (right,top) coordinates of the frame bounding box, respectively. The contents of frame @code{src} may be appended to frame @code{dest} with the command @verbatim void add(frame dest, frame src); @end verbatim or prepended with @verbatim void prepend(frame dest, frame src); @end verbatim A frame obtained by aligning frame @code{f} in the direction @code{align}, in a manner analogous to the @code{align} argument of @code{label} (@pxref{label}), is returned by @verbatim frame align(frame f, pair align); @end verbatim @item picture @cindex @code{picture} Pictures are high-level structures (@pxref{Structures}) defined in the module @code{plain} that provide canvases for drawing in user coordinates. The default picture is called @code{currentpicture}. A new picture can be created like this: @verbatim picture pic; @end verbatim @noindent Anonymous pictures can be made by the expression @code{new picture}. The @code{size} routine specifies the dimensions of the desired picture: @anchor{size} @cindex @code{size} @verbatim void size(picture pic=currentpicture, real x, real y=x, bool keepAspect=pic.keepAspect); @end verbatim If the @code{x} and @code{y} sizes are both 0, user coordinates will be interpreted as @code{PostScript} coordinates. In this case, the transform mapping @code{pic} to the final output frame is @code{identity()}. If exactly one of @code{x} or @code{y} is 0, no size restriction is imposed in that direction; it will be scaled the same as the other direction. @cindex @code{keepAspect} @cindex @code{Aspect} If @code{keepAspect} is set to @code{Aspect} or @code{true} (the default), the picture will be scaled with its aspect ratio preserved such that the final width is no more than @code{x} and the final height is no more than @code{y}. @cindex @code{keepAspect} @cindex @code{IgnoreAspect} If @code{keepAspect} is set to @code{IgnoreAspect} or @code{false}, the picture will be scaled in both directions so that the final width is @code{x} and the height is @code{y}. To make the user coordinates of picture @code{pic} represent multiples of @code{x} units in the @math{x} direction and @code{y} units in the @math{y} direction, use @anchor{unitsize} @cindex @code{unitsize} @verbatim void unitsize(picture pic=currentpicture, real x, real y=x); @end verbatim When nonzero, these @code{x} and @code{y} values override the corresponding size parameters of picture @code{pic}. The routine @cindex @code{size} @verbatim void size(picture pic=currentpicture, real xsize, real ysize, pair min, pair max); @end verbatim forces the final picture scaling to map the user coordinates @code{box(min,max)} to a region of width @code{xsize} and height @code{ysize} (when these parameters are nonzero). Alternatively, calling the routine @cindex @code{fixedscaling} @verbatim transform fixedscaling(picture pic=currentpicture, pair min, pair max, pen p=nullpen, bool warn=false); @end verbatim will cause picture @code{pic} to use a fixed scaling to map user coordinates in @code{box(min,max)} to the (already specified) picture size, taking account of the width of pen @code{p}. A warning will be issued if the final picture exceeds the specified size. A picture @code{pic} can be fit to a frame and output to a file @code{prefix}.@code{format} using image format @code{format} by calling the @code{shipout} function: @anchor{shipout} @cindex @code{shipout} @cindex @code{outprefix} @verbatim void shipout(string prefix=defaultfilename, picture pic=currentpicture, orientation orientation=orientation, string format="", bool wait=false, bool view=true, string options="", string script="", light light=currentlight, projection P=currentprojection) @end verbatim @noindent The default output format, @code{PostScript}, may be changed with the @code{-f} or @code{-tex} command-line options. The @code{options}, @code{script}, and @code{projection} parameters are only relevant for 3D pictures. If @code{defaultfilename} is an empty string, the prefix @code{outprefix()} will be used. A @code{shipout()} command is added implicitly at file exit. Explicit @code{shipout()} commands to the same file as the final implicit shipout are ignored. @cindex @code{orientation} @cindex @code{Portrait} @cindex @code{Landscape} @cindex @code{UpsideDown} The default page orientation is @code{Portrait}; this may be modified by changing the variable @code{orientation}. To output in landscape mode, simply set the variable @code{orientation=Landscape} or issue the command @verbatim shipout(Landscape); @end verbatim @cindex @code{Seascape} To rotate the page by @math{-90} degrees, use the orientation @code{Seascape}. @cindex @code{UpsideDown} The orientation @code{UpsideDown} rotates the page by 180 degrees. @cindex subpictures @cindex @code{picture.fit} A picture @code{pic} can be explicitly fit to a frame by calling @verbatim frame pic.fit(real xsize=pic.xsize, real ysize=pic.ysize, bool keepAspect=pic.keepAspect); @end verbatim The default size and aspect ratio settings are those given to the @code{size} command (which default to @code{0}, @code{0}, and @code{true}, respectively). @cindex @code{picture.calculateTransform} The transformation that would currently be used to fit a picture @code{pic} to a frame is returned by the member function @code{pic.calculateTransform()}. In certain cases (e.g.@ 2D graphs) where only an approximate size estimate for @code{pic} is available, the picture fitting routine @cindex @code{picture.scale} @verbatim frame pic.scale(real xsize=this.xsize, real ysize=this.ysize, bool keepAspect=this.keepAspect); @end verbatim (which scales the resulting frame, including labels and fixed-size objects) will enforce perfect compliance with the requested size specification, but should not normally be required. @cindex @code{box} To draw a bounding box with margins around a picture, fit the picture to a frame using the function @verbatim frame bbox(picture pic=currentpicture, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill); @end verbatim @cindex @code{filltype} @anchor{filltype} Here @code{filltype} specifies one of the following fill types: @table @code @cindex @code{FillDraw} @item FillDraw Fill the interior and draw the boundary. @item FillDraw(real xmargin=0, real ymargin=xmargin, pen fillpen=nullpen, @code{pen drawpen=nullpen)} @cindex @code{nullpen} If @code{fillpen} is @code{nullpen}, fill with the drawing pen; otherwise fill with pen @code{fillpen}. If @code{drawpen} is @code{nullpen}, draw the boundary with @code{fillpen}; otherwise with @code{drawpen}. An optional margin of @code{xmargin} and @code{ymargin} can be specified. @cindex @code{Fill} @item Fill Fill the interior. @cindex @code{nullpen} @item Fill(real xmargin=0, real ymargin=xmargin, pen p=nullpen) If @code{p} is @code{nullpen}, fill with the drawing pen; otherwise fill with pen @code{p}. An optional margin of @code{xmargin} and @code{ymargin} can be specified. @cindex @code{NoFill} @item NoFill Do not fill. @item Draw Draw only the boundary. @cindex @code{Draw} @item Draw(real xmargin=0, real ymargin=xmargin, pen p=nullpen) If @code{p} is @code{nullpen}, draw the boundary with the drawing pen; otherwise draw with pen @code{p}. An optional margin of @code{xmargin} and @code{ymargin} can be specified. @cindex @code{UnFill} @item UnFill Clip the region. @cindex @code{UnFill} @item UnFill(real xmargin=0, real ymargin=xmargin) Clip the region and surrounding margins @code{xmargin} and @code{ymargin}. @cindex @code{RadialShade} @item RadialShade(pen penc, pen penr) Fill varying radially from @code{penc} at the center of the bounding box to @code{penr} at the edge. @cindex @code{RadialShadeDraw} @item RadialShadeDraw(real xmargin=0, real ymargin=xmargin, pen penc, @code{pen penr, pen drawpen=nullpen)} Fill with RadialShade and draw the boundary. @end table @cindex bounding box @cindex background color For example, to draw a bounding box around a picture with a 0.25 cm margin and output the resulting frame, use the command: @verbatim shipout(bbox(0.25cm)); @end verbatim A @code{picture} may be fit to a frame with the background color pen @code{p}, using the function @code{bbox(p,Fill)}. @cindex @code{pad} To pad a picture to a precise size in both directions, fit the picture to a frame using the function @verbatim frame pad(picture pic=currentpicture, real xsize=pic.xsize, real ysize=pic.ysize, filltype filltype=NoFill); @end verbatim The functions @verbatim pair min(picture pic, user=false); pair max(picture pic, user=false); pair size(picture pic, user=false); @end verbatim calculate the bounds that picture @code{pic} would have if it were currently fit to a frame using its default size specification. If @code{user} is @code{false} the returned value is in @code{PostScript} coordinates, otherwise it is in user coordinates. The function @verbatim pair point(picture pic=currentpicture, pair dir, bool user=true); @end verbatim is a convenient way of determining the point on the bounding box of @code{pic} in the direction @code{dir} relative to its center, ignoring the contributions from fixed-size objects (such as labels and arrowheads). If @code{user} is @code{true} the returned value is in user coordinates, otherwise it is in @code{PostScript} coordinates. The function @verbatim pair truepoint(picture pic=currentpicture, pair dir, bool user=true); @end verbatim is identical to @code{point}, except that it also accounts for fixed-size objects, using the scaling transform that picture @code{pic} would have if currently fit to a frame using its default size specification. If @code{user} is @code{true} the returned value is in user coordinates, otherwise it is in @code{PostScript} coordinates. @anchor{add} Sometimes it is useful to draw objects on separate pictures and add one picture to another using the @code{add} function: @cindex @code{add} @verbatim void add(picture src, bool group=true, filltype filltype=NoFill, bool above=true); void add(picture dest, picture src, bool group=true, filltype filltype=NoFill, bool above=true); @end verbatim @noindent The first example adds @code{src} to @code{currentpicture}; the second one adds @code{src} to @code{dest}. The @code{group} option specifies whether or not the graphical user interface should treat all of the elements of @code{src} as a single entity (@pxref{GUI}), @code{filltype} requests optional background filling or clipping, and @code{above} specifies whether to add @code{src} above or below existing objects. There are also routines to add a fixed-size picture or frame @code{src} to another picture @code{dest} (or @code{currentpicture}) about the user coordinate @code{position}: @anchor{add about} @cindex @code{add} @cindex picture alignment @verbatim void add(picture src, pair position, bool group=true, filltype filltype=NoFill, bool above=true); void add(picture dest, picture src, pair position, bool group=true, filltype filltype=NoFill, bool above=true); void add(picture dest=currentpicture, frame src, pair position=0, bool group=true, filltype filltype=NoFill, bool above=true); void add(picture dest=currentpicture, frame src, pair position, pair align, bool group=true, filltype filltype=NoFill, bool above=true); @end verbatim The optional @code{align} argument in the last form specifies a direction to use for aligning the frame, in a manner analogous to the @code{align} argument of @code{label} (@pxref{label}). However, one key difference is that when @code{align} is not specified, labels are centered, whereas frames and pictures are aligned so that their origin is at @code{position}. Illustrations of frame alignment can be found in the examples @ref{errorbars} and @ref{image}. If you want to align three or more subpictures, group them two at a time: @verbatiminclude subpictures.asy @sp 1 @center @image{./subpictures} Alternatively, one can use @code{attach} to automatically increase the size of picture @code{dest} to accommodate adding a frame @code{src} about the user coordinate @code{position}: @cindex @code{attach} @verbatim void attach(picture dest=currentpicture, frame src, pair position=0, bool group=true, filltype filltype=NoFill, bool above=true); void attach(picture dest=currentpicture, frame src, pair position, pair align, bool group=true, filltype filltype=NoFill, bool above=true); @end verbatim @cindex @code{erase} To erase the contents of a picture (but not the size specification), use the function @verbatim void erase(picture pic=currentpicture); @end verbatim @cindex @code{save} To save a snapshot of @code{currentpicture}, @code{currentpen}, and @code{currentprojection}, use the function @code{save()}. @cindex @code{restore} To restore a snapshot of @code{currentpicture}, @code{currentpen}, and @code{currentprojection}, use the function @code{restore()}. Many further examples of picture and frame operations are provided in the base module @code{plain}. @cindex verbatim @cindex @code{postscript} It is possible to insert verbatim @code{PostScript} commands in a picture with one of the routines @verbatim void postscript(picture pic=currentpicture, string s); void postscript(picture pic=currentpicture, string s, pair min, pair max) @end verbatim Here @code{min} and @code{max} can be used to specify explicit bounds associated with the resulting @code{PostScript} code. @anchor{tex} @cindex @code{tex} Verbatim @TeX{} commands can be inserted in the intermediate @code{LaTeX} output file with one of the functions @verbatim void tex(picture pic=currentpicture, string s); void tex(picture pic=currentpicture, string s, pair min, pair max) @end verbatim Here @code{min} and @code{max} can be used to specify explicit bounds associated with the resulting @TeX{} code. To issue a global @TeX{} command (such as a @TeX{} macro definition) in the @TeX{} preamble (valid for the remainder of the top-level module) use: @cindex @code{texpreamble} @verbatim void texpreamble(string s); @end verbatim The @TeX{} environment can be reset to its initial state, clearing all macro definitions, with the function @cindex @code{texreset} @verbatim void texreset(); @end verbatim @cindex @code{usepackage} The routine @verbatim void usepackage(string s, string options=""); @end verbatim provides a convenient abbreviation for @verbatim texpreamble("\usepackage["+options+"]{"+s+"}"); @end verbatim @noindent that can be used for importing @code{LaTeX} packages. @end table @anchor{deferred drawing} @node Deferred drawing @section Deferred drawing @cindex deferred drawing It is sometimes desirable to have elements of a fixed absolute size, independent of the picture scaling from user to @code{PostScript} coordinates. For example, normally one would want the size of a dot created with @code{dot}, the size of the arrowheads created with @code{arrow} (@pxref{arrows}), and labels to be drawn independent of the scaling. However, because of @code{Asymptote}'s automatic scaling feature (@pxref{Figure size}), the translation between user coordinate and @code{PostScript} coordinate is not determined until shipout time: @verbatim size(1cm); dot((0,0)); dot((1,1)); shipout("x"); // at this point, 1 unit coordinate = 1cm dot((2,2)); shipout("y"); // at this point, 1 unit coordinate = 0.5cm @end verbatim @noindent It is therefore necessary to defer the drawing of these elements until shipout time. For example, a frame can be added at a specified user coordinate of a picture with the deferred drawing routine @code{add(picture dest=currentpicture, frame src, pair position)}: @verbatim frame f; fill(f,circle((0,0),1.5pt)); add(f,position=(1,1),align=(0,0)); @end verbatim @cindex @code{picture.add} @cindex @code{drawer} A deferred drawing routine is an object of type @code{drawer}, which is a function with signature @code{void(frame f, transform t)}. For example, if the drawing routine @verbatim void d(frame f, transform t){ fill(f,shift(3cm,0)*circle(t*(1,1),2pt)); } @end verbatim @noindent is added to @code{currentpicture} with @verbatim currentpicture.add(d); @end verbatim @noindent a filled circle of radius 2pt will be drawn on currentpicture centered 3cm to the right of user coordinate @code{(1,1)}. The parameter @code{t} is the affine transformation from user coordinates to @code{PostScript} coordinates. Even though the actual drawing is deferred, you still need to specify to the @code{Asymptote} scaling routines that ultimately a fixed-size circle of radius 2pt will be drawn 3cm to the right of user-coordinate (1,1), by adding a frame about (1,1) that extends beyond (1,1) from @code{(3cm-2pt,-2pt)+min(currentpen)} to @code{(3cm+2pt,2pt)+max(currentpen)}, where we have even accounted for the pen linewidth. The following example will then produce a @acronym{PDF} file 10 cm wide: @cindex @code{picture.addPoint} @verbatim settings.outformat="pdf"; size(10cm); dot((0,0)); dot((1,1),red); add(new void(frame f, transform t) { fill(f,shift(3cm,0)*circle(t*(1,1),2pt)); }); pair trueMin=(3cm-2pt,-2pt)+min(currentpen); pair trueMax=(3cm+2pt,2pt)+max(currentpen); currentpicture.addPoint((1,1),trueMin); currentpicture.addPoint((1,1),trueMax); @end verbatim @noindent Here we specified the minimum and maximum user and truesize (fixed) coordinates of the drawer with the @code{picture} routine @verbatim void addPoint(pair user, pair truesize); @end verbatim @noindent Alternatively, one can use @verbatim void addBox(pair userMin, pair userMax, pair trueMin=0, pair trueMax=0) { @end verbatim @noindent to specify a bounding box with bottom-left corner @code{t*(1,1)+trueMin} and top-right corner @code{t*(1,1)+trueMax}, where @code{t} is the transformation that transforms from user coordinates to @code{PostScript} coordinates. For more details about deferred drawing, see ``Asymptote: A vector graphics language,'' John C. Bowman and Andy Hammerlindl, TUGBOAT: The Communications of the TeX Users Group, 29:2, 288-294 (2008), @noindent @url{https://www.math.ualberta.ca/~bowman/publications/asyTUG.pdf}. @node Files @section Files @cindex @code{file} @code{Asymptote} can read and write text files (including comma-separated value) files and portable @acronym{XDR} (External Data Representation) binary files. @cindex @code{input} An input file can be opened with @verbatim input(string name="" @end verbatim reading is then done by assignment: @cindex open @cindex @code{input} @cindex reading @verbatim file fin=input("test.txt"); real a=fin; @end verbatim @cindex comment character @cindex @code{error} If the optional boolean argument @code{check} is @code{false}, no check will be made that the file exists. If the file does not exist or is not readable, the function @code{bool error(file)} will return @code{true}. The first character of the string @code{comment} specifies a comment character. If this character is encountered in a data file, the remainder of the line is ignored. When reading strings, a comment character followed immediately by another comment character is treated as a single literal comment character. If @code{Asymptote} is compiled with support for @code{libcurl}, @code{name} can be a @acronym{URL}. @anchor{cd} @cindex @code{cd} @cindex @code{noglobalread} @cindex directory Unless the @code{-noglobalread} command-line option is specified, one can change the current working directory for read operations to the contents of the string @code{s} with the function @code{string cd(string s)}, which returns the new working directory. If @code{string s} is empty, the path is reset to the value it had at program startup. @cindex @code{getc} When reading pairs, the enclosing parenthesis are optional. Strings are also read by assignment, by reading characters up to but not including a newline. In addition, @code{Asymptote} provides the function @code{string getc(file)} to read the next character (treating the comment character as an ordinary character) and return it as a string. @cindex @code{output} @cindex @code{update} @cindex append A file named @code{name} can be open for output with @verbatim file output(string name="", bool update=false, string comment="#", string mode=""); @end verbatim @noindent @cindex @code{noglobalread} @cindex @code{globalwrite} If @code{update=false}, any existing data in the file will be erased and only write operations can be used on the file. If @code{update=true}, any existing data will be preserved, the position will be set to the end-of-file, and both reading and writing operations will be enabled. For security reasons, writing to files in directories other than the current directory is allowed only if the @code{-globalwrite} (or @code{-nosafe}) command-line option is specified. Reading from files in other directories is allowed unless the @code{-noglobalread} command-line option is specified. @cindex @code{mktemp} The function @code{string mktemp(string s)} may be used to create and return the name of a unique temporary file in the current directory based on the string @code{s}. @cindex @code{stdin} @cindex @code{stdout} There are two special files: @code{stdin}, which reads from the keyboard, and @code{stdout}, which writes to the terminal. The implicit initializer for files is @code{null}. Data of a built-in type @code{T} can be written to an output file by calling one of the functions @cindex @code{write} @verbatim write(string s="", T x, suffix suffix=endl ... T[]); write(file file, string s="", T x, suffix suffix=none ... T[]); write(file file=stdout, string s="", explicit T[] x ... T[][]); write(file file=stdout, T[][]); write(file file=stdout, T[][][]); write(suffix suffix=endl); write(file file, suffix suffix=none); @end verbatim @cindex @code{none} @cindex @code{flush} @cindex @code{endl} @cindex @code{newl} @cindex @code{DOSendl} @cindex @code{DOSnewl} @cindex @code{tab} @cindex @code{comma} If @code{file} is not specified, @code{stdout} is used and terminated by default with a newline. If specified, the optional identifying string @code{s} is written before the data @code{x}. An arbitrary number of data values may be listed when writing scalars or one-dimensional arrays. The @code{suffix} may be one of the following: @code{none} (do nothing), @code{flush} (output buffered data), @code{endl} (terminate with a newline and flush), @code{newl} (terminate with a newline), @code{DOSendl} (terminate with a DOS newline and flush), @code{DOSnewl} (terminate with a DOS newline), @code{tab} (terminate with a tab), or @code{comma} (terminate with a comma). Here are some simple examples of data output: @verbatim file fout=output("test.txt"); write(fout,1); // Writes "1" write(fout, endl); // Writes a new line write(fout,"List: ",1,2,3); // Writes "List: 1 2 3" @end verbatim @noindent @cindex binary format @cindex single precision @cindex double precision @cindex @code{singlereal} @cindex @code{singleint} @cindex @code{signedint} @cindex @code{mode} @cindex @code{binary} @cindex @code{xdr} A file may be opened with @code{mode="xdr"} to read or write double precision (64-bit) reals and single precision (32-bit) integers in Sun Microsystem's @acronym{XDR} (External Data Representation) portable binary format. A file may instead be opened with @code{mode="binary"} to read or write double precision reals and single precision integers in the native (nonportable) machine binary format. The virtual member functions @code{file singlereal(bool b=true)} and @code{file singleint(bool b=true)} may be used to change the precision of real and integer I/O operations, respectively, for an @acronym{XDR} or binary file. Similarly, the function @code{file signedint(bool b=true)} can be used to modify the signedness of integer reads and writes for an @acronym{XDR} or binary file. Since there are no end-of-line terminators in these formats, reading a string from an @acronym{XDR} or binary file will by default read in the remainder of the file as a string. The virtual member function @code{file word(bool b=true)} may be used to change this behaviour: a double precision integer specifying the length of the string is first read or written, followed by that many characters. @cindex @code{name} @cindex @code{mode} @cindex @code{singlereal} @cindex @code{singleint} @cindex @code{signedint} The virtual fields @code{name}, @code{mode}, @code{singlereal}, @code{singleint}, and @code{signedint} may be used to query these respective states of a file. @cindex @code{eof} @cindex @code{eol} @cindex @code{error} @cindex @code{flush} @cindex @code{clear} @cindex @code{precision} @cindex @code{seek} @cindex @code{tell} @cindex rewind @cindex @code{seekeof} One can test a file for end-of-file with the boolean function @code{eof(file)}, end-of-line with @code{eol(file)}, and for I/O errors with @code{error(file)}. One can flush the output buffers with @code{flush(file)}, clear a previous I/O error with @code{clear(file)}, and close the file with @code{close(file)}. The function @code{int precision(file file=stdout, int digits=0)} sets the number of digits of output precision for @code{file} to @code{digits}, provided @code{digits} is nonzero, and returns the previous precision setting. The function @code{int tell(file)} returns the current position in a file relative to the beginning. The routine @code{seek(file file, int pos)} can be used to change this position, where a negative value for the position @code{pos} is interpreted as relative to the end-of-file. For example, one can rewind a file @code{file} with the command @code{seek(file,0)} and position to the final character in the file with @code{seek(file,-1)}. The command @code{seekeof(file)} sets the position to the end of the file. @cindex @code{scroll} @anchor{scroll} Assigning @code{settings.scroll=n} for a positive integer @code{n} requests a pause after every @code{n} output lines to @code{stdout}. One may then press @code{Enter} to continue to the next @code{n} output lines, @code{s} followed by @code{Enter} to scroll without further interruption, or @code{q} followed by @code{Enter} to quit the current output operation. If @code{n} is negative, the output scrolls a page at a time (i.e. by one less than the current number of display lines). The default value, @code{settings.scroll=0}, specifies continuous scrolling. The routines @cindex @code{getstring} @cindex @code{getint} @cindex @code{getreal} @cindex @code{getpair} @cindex @code{gettriple} @verbatim string getstring(string name="", string default="", string prompt="", bool store=true); int getint(string name="", int default=0, string prompt="", bool store=true); real getreal(string name="", real default=0, string prompt="", bool store=true); pair getpair(string name="", pair default=0, string prompt="", bool store=true); triple gettriple(string name="", triple default=(0,0,0), string prompt="", bool store=true); @end verbatim @noindent defined in the module @code{plain} may be used to prompt for a value from @code{stdin} using the @acronym{GNU} @code{readline} library. If @code{store=true}, the history of values for @code{name} is stored in the file @code{".asy_history_"+name} (@pxref{history}). The most recent value in the history will be used to provide a default value for subsequent runs. The default value (initially @code{default}) is displayed after @code{prompt}. These functions are based on the internal routines @cindex @code{readline} @cindex @code{saveline} @verbatim string readline(string prompt="", string name="", bool tabcompletion=false); void saveline(string name, string value, bool store=true); @end verbatim Here, @code{readline} prompts the user with the default value formatted according to @code{prompt}, while @code{saveline} is used to save the string @code{value} in a local history named @code{name}, optionally storing the local history in a file @code{".asy_history_"+name}. @cindex @code{history} The routine @code{history(string name, int n=1)} can be used to look up the @code{n} most recent values (or all values up to @code{historylines} if @code{n=0}) entered for string @code{name}. The routine @code{history(int n=0)} returns the interactive history. For example, @verbatim write(output("transcript.asy"),history()); @end verbatim @noindent outputs the interactive history to the file @code{transcript.asy}. @cindex @code{delete} @cindex @code{globalwrite} The function @code{int delete(string s)} deletes the file named by the string @code{s}. Unless the @code{-globalwrite} (or @code{-nosafe}) option is enabled, the file must reside in the current directory. @cindex @code{rename} The function @code{int rename(string from, string to)} may be used to rename file @code{from} to file @code{to}. Unless the @code{-globalwrite} (or @code{-nosafe}) option is enabled, this operation is restricted to the current directory. @cindex @code{convert} @cindex @code{magick} @cindex @code{animate} The functions @verbatim int convert(string args="", string file="", string format=""); int animate(string args="", string file="", string format=""); @end verbatim @noindent call the @code{ImageMagick} commands @code{magick} and @code{animate}, respectively, with the arguments @code{args} and the file name constructed from the strings @code{file} and @code{format}. @node Variable initializers @section Variable initializers @cindex variable initializers @cindex @code{operator init} @cindex initializers A variable can be assigned a value when it is declared @code{int x=3;} where the variable @code{x} is assigned the value @code{3}. As well as literal constants such as @code{3}, arbitary expressions can be used as initializers, as in @code{real x=2*sin(pi/2);}. A variable is not added to the namespace until after the initializer is evaluated, so for example, in @verbatim int x=2; int x=5*x; @end verbatim @noindent the @code{x} in the initializer on the second line refers to the variable @code{x} declared on the first line. The second line, then, declares a variable @code{x} shadowing the original @code{x} and initializes it to the value @code{10}. Variables of most types can be declared without an explicit initializer and they will be initialized by the default initializer of that type: @itemize @item Variables of the numeric types @code{int}, @code{real}, and @code{pair} are all initialized to zero; variables of type @code{triple} are initialized to @code{O=(0,0,0)}. @item @code{boolean} variables are initialized to @code{false}. @item @code{string} variables are initialized to the empty string. @item @code{transform} variables are initialized to the identity transformation. @item @code{path} and @code{guide} variables are initialized to @code{nullpath}. @item @code{pen} variables are initialized to the default pen. @item @code{frame} and @code{picture} variables are initialized to empty frames and pictures, respectively. @item @code{file} variables are initialized to @code{null}. @end itemize The default initializers for user-defined array, structure, and function types are explained in their respective sections. Some types, such as @code{code}, do not have default initializers. When a variable of such a type is introduced, the user must initialize it by explicitly giving it a value. The default initializer for any type @code{T} can be redeclared by defining the function @code{T operator init()}. For instance, @code{int} variables are usually initialized to zero, but in @verbatim int operator init() { return 3; } int y; @end verbatim @noindent the variable @code{y} is initialized to @code{3}. This example was given for illustrative purposes; redeclaring the initializers of built-in types is not recommended. Typically, @code{operator init} is used to define sensible defaults for user-defined types. @cindex @code{var} The special type @code{var} may be used to infer the type of a variable from its initializer. If the initializer is an expression of a unique type, then the variable will be defined with that type. For instance, @verbatim var x=5; var y=4.3; var reddash=red+dashed; @end verbatim @noindent is equivalent to @verbatim int x=5; real y=4.3; pen reddash=red+dashed; @end verbatim @code{var} may also be used with the extended @code{for} loop syntax. @verbatim int[] a = {1,2,3}; for (var x : a) write(x); @end verbatim @node Structures @section Structures @cindex @code{struct} @cindex structures @cindex @code{public} @cindex @code{restricted} @cindex @code{private} @cindex @code{this} @cindex @code{new} @cindex @code{null} Users may also define their own data types as structures, along with user-defined operators, much as in C++. By default, structure members are @code{public} (may be read and modified anywhere in the code), but may be optionally declared @code{restricted} (readable anywhere but writeable only inside the structure where they are defined) or @code{private} (readable and writable only inside the structure). In a structure definition, the keyword @code{this} can be used as an expression to refer to the enclosing structure. Any code at the top-level scope within the structure is executed on initialization. Variables hold references to structures. That is, in the example: @verbatim struct T { int x; } T foo; T bar=foo; bar.x=5; @end verbatim The variable @code{foo} holds a reference to an instance of the structure @code{T}. When @code{bar} is assigned the value of @code{foo}, it too now holds a reference to the same instance as @code{foo} does. The assignment @code{bar.x=5} changes the value of the field @code{x} in that instance, so that @code{foo.x} will also be equal to @code{5}. The expression @code{new T} creates a new instance of the structure @code{T} and returns a reference to that instance. In creating the new instance, any code in the body of the record definition is executed. For example: @verbatim int Tcount=0; struct T { int x; ++Tcount; } T foo=new T; T foo; @end verbatim @noindent Here, @code{new T} produces a new instance of the class, which causes @code{Tcount} to be incremented, tracking the number of instances produced. The declarations @code{T foo=new T} and @code{T foo} are equivalent: the second form implicitly creates a new instance of @code{T}. That is, after the definition of a structure @code{T}, a variable of type @code{T} is initialized to a new instance (@code{new T}) by default. During the definition of the structure, however, variables of type @code{T} are initialized to @code{null} by default. This special behavior is to avoid infinite recursion of creating new instances in code such as @verbatim struct tree { int value; tree left; tree right; } @end verbatim The expression @code{null} can be cast to any structure type to yield a null reference, a reference that does not actually refer to any instance of the structure. Trying to use a field of a null reference will cause an error. @cindex alias @cindex @code{==} @cindex @code{!=} The function @code{bool alias(T,T)} checks to see if two structure references refer to the same instance of the structure (or both to @code{null}). In the example at the beginning of this section, @code{alias(foo,bar)} would return true, but @code{alias(foo,new T)} would return false, as @code{new T} creates a new instance of the structure @code{T}. The boolean operators @code{==} and @code{!=} are by default equivalent to @code{alias} and @code{!alias} respectively, but may be overwritten for a particular type (for example, to do a deep comparison). Here is a simple example that illustrates the use of structures: @verbatim struct S { real a=1; real f(real a) {return a+this.a;} } S s; // Initializes s with new S; write(s.f(2)); // Outputs 3 S operator + (S s1, S s2) { S result; result.a=s1.a+s2.a; return result; } write((s+s).f(0)); // Outputs 2 @end verbatim @cindex constructors It is often convenient to have functions that construct new instances of a structure. Say we have a @code{Person} structure: @verbatim struct Person { string firstname; string lastname; } Person joe; joe.firstname="Joe"; joe.lastname="Jones"; @end verbatim @noindent Creating a new Person is a chore; it takes three lines to create a new instance and to initialize its fields (that's still considerably less effort than creating a new person in real life, though). We can reduce the work by defining @code{operator init}: @cindex @code{operator init} @verbatim struct Person { string firstname; string lastname; void operator init(string firstname, string lastname) { this.firstname=firstname; this.lastname=lastname; } } Person joe=Person("Joe", "Jones"); @end verbatim The use of @code{operator init} to implicitly define constructors should not be confused with its use to define default values for variables (@pxref{Variable initializers}). Indeed, in the first case, the return type of the @code{operator init} must be @code{void} while in the second, it must be the (non-@code{void}) type of the variable. Internally, @code{operator init} implicitly defines a constructor function @code{Person(string,string)} as follows, where @var{args} is @code{string firstname, string lastname} in this case: @example struct Person @{ string firstname; string lastname; static Person Person(@var{args}) @{ Person p=new Person; p.operator init(@var{args}); return p; @} @} @end example @noindent which then can be used as: @verbatim Person joe=Person.Person("Joe", "Jones"); @end verbatim The following is also implicitly generated in the enclosing scope, after the end of the structure definition. @verbatim from Person unravel Person; @end verbatim @noindent It allows us to use the constructor without qualification, otherwise we would have to refer to the constructor by the qualified name @code{Person.Person}. @cindex inheritance @cindex virtual functions Much like in C++, casting (@pxref{Casts}) provides for an elegant implementation of structure inheritance, including a virtual function @code{v}: @verbatim struct parent { real x; void operator init(int x) {this.x=x;} void v(int) {write(0);} void f() {v(1);} } void write(parent p) {write(p.x);} struct child { parent parent; real y=3; void operator init(int x) {parent.operator init(x);} void v(int x) {write(x);} parent.v=v; void f()=parent.f; } parent operator cast(child child) {return child.parent;} parent p=parent(1); child c=child(2); write(c); // Outputs 2; p.f(); // Outputs 0; c.f(); // Outputs 1; write(c.parent.x); // Outputs 2; write(c.y); // Outputs 3; @end verbatim For further examples of structures, see @code{Legend} and @code{picture} in the @code{Asymptote} base module @code{plain}. @node Operators @section Operators @cindex operators @menu * Arithmetic & logical:: Basic mathematical operators * Self & prefix operators:: Increment and decrement * User-defined operators:: Overloading operators @end menu @node Arithmetic & logical @subsection Arithmetic & logical operators @cindex arithmetic operators @cindex binary operators @cindex boolean operators @cindex logical operators @cindex @code{quotient} @code{Asymptote} uses the standard binary arithmetic operators. However, when one integer is divided by another, both arguments are converted to real values before dividing and a real quotient is returned (since this is typically what is intended; otherwise one can use the function @code{int quotient(int x, int y)}, which returns greatest integer less than or equal to @code{x/y}). In all other cases both operands are promoted to the same type, which will also be the type of the result: @table @code @cindex @code{+} @item + addition @cindex @code{-} @item - subtraction @cindex @code{*} @item * multiplication @cindex @code{/} @item / division @cindex integer division @cindex @code{#} @item # integer division; equivalent to @code{quotient(x,y)}. Noting that the @code{Python3} community adopted our comment symbol (@code{//}) for integer division, we decided to reciprocate and use their comment symbol for integer division in @code{Asymptote}! @cindex @code{%} @item % modulo; the result always has the same sign as the divisor. In particular, this makes @code{q*(p # q)+p % q == p} for all integers @code{p} and nonzero integers @code{q}. @cindex @code{^} @item ^ @cindex @code{**} power; if the exponent (second argument) is an int, recursive multiplication is used; otherwise, logarithms and exponentials are used (@code{**} is a synonym for @code{^}). @end table The usual boolean operators are also defined: @table @code @cindex @code{==} @item == equals @cindex @code{!=} @item != not equals @cindex @code{<} @item < less than @cindex @code{<=} @item <= less than or equals @cindex @code{>=} @item >= greater than or equals @cindex @code{>} @item > greater than @cindex @code{&&} @item && and (with conditional evaluation of right-hand argument) @cindex @code{&} @item & and @cindex @code{||} @item || or (with conditional evaluation of right-hand argument) @cindex @code{|} @item | or @cindex @code{^} @item ^ xor @cindex @code{!} @item ! not @end table @code{Asymptote} also supports the C-like conditional syntax: @cindex @code{:} @cindex @code{?} @cindex conditional @verbatim bool positive=(pi > 0) ? true : false; @end verbatim @cindex @code{interp} The function @code{T interp(T a, T b, real t)} returns @code{(1-t)*a+t*b} for nonintegral built-in arithmetic types @code{T}. If @code{a} and @code{b} are pens, they are first promoted to the same color space. @cindex @code{AND} @cindex @code{OR} @cindex @code{XOR} @cindex @code{NOT} @cindex @code{CLZ} @cindex @code{CTZ} @code{Asymptote} also defines bitwise functions @code{int AND(int,int)}, @code{int OR(int,int)}, @code{int XOR(int,int)}, @code{int NOT(int)}, @code{int CLZ(int)} (count leading zeros), @code{int CTZ(int)} (count trailing zeros), @code{int popcount(int)} (count bits populated by ones), and @code{int bitreverse(int a, int bits)} (reverse bits within a word of length bits). @node Self & prefix operators @subsection Self & prefix operators @cindex self operators @cindex prefix operators @cindex @code{+=} @cindex @code{-=} @cindex @code{*=} @cindex @code{/=} @cindex @code{%=} @cindex @code{^=} @cindex @code{++} @cindex @code{--} As in C, each of the arithmetic operators @code{+}, @code{-}, @code{*}, @code{/}, @code{#}, @code{%}, and @code{^} can be used as a self operator. The prefix operators @code{++} (increment by one) and @code{--} (decrement by one) are also defined. For example, @verbatim int i=1; i += 2; int j=++i; @end verbatim @noindent is equivalent to the code @verbatim int i=1; i=i+2; int j=i=i+1; @end verbatim @cindex postfix operators However, postfix operators like @code{i++} and @code{i--} are not defined (because of the inherent ambiguities that would arise with the @code{--} path-joining operator). In the rare instances where @code{i++} and @code{i--} are really needed, one can substitute the expressions @code{(++i-1)} and @code{(--i+1)}, respectively. @node User-defined operators @subsection User-defined operators @cindex user-defined operators @cindex @code{operator} The following symbols may be used with @code{operator} to define or redefine operators on structures and built-in types: @verbatim - + * / % ^ ! < > == != <= >= & | ^^ .. :: -- --- ++ << >> $ $$ @ @@ <> @end verbatim @noindent The operators on the second line have precedence one higher than the boolean operators @code{<}, @code{>}, @code{<=}, and @code{>=}. Guide operators like @code{..} may be overloaded, say, to write a user function that produces a new guide from a given guide: @verbatim guide dots(... guide[] g)=operator ..; guide operator ..(... guide[] g) { guide G; if(g.length > 0) { write(g[0]); G=g[0]; } for(int i=1; i < g.length; ++i) { write(g[i]); write(); G=dots(G,g[i]); } return G; } guide g=(0,0){up}..{SW}(100,100){NE}..{curl 3}(50,50)..(10,10); write("g=",g); @end verbatim @xref{Autounravel}, for an example overloading the @code{+} operator. @node Implicit scaling, Functions, Operators, Programming @section Implicit scaling @cindex implicit scaling If a numeric literal is in front of certain types of expressions, then the two are multiplied: @verbatim int x=2; real y=2.0; real cm=72/2.540005; write(3x); write(2.5x); write(3y); write(-1.602e-19 y); write(0.5(x,y)); write(2x^2); write(3x+2y); write(3(x+2y)); write(3sin(x)); write(3(sin(x))^2); write(10cm); @end verbatim This produces the output @verbatim 6 5 6 -3.204e-19 (1,1) 8 10 18 2.72789228047704 2.48046543129542 283.464008929116 @end verbatim @node Functions @section Functions @cindex functions @menu * Default arguments:: Default values can appear anywhere * Named arguments:: Assigning function arguments by keyword * Rest arguments:: Functions with a variable number of arguments * Mathematical functions:: Standard libm functions @end menu @code{Asymptote} functions are treated as variables with a signature (non-function variables have null signatures). Variables with the same name are allowed, so long as they have distinct signatures. Function arguments are passed by value. To pass an argument by reference, simply enclose it in a structure (@pxref{Structures}). Here are some significant features of @code{Asymptote} functions: @enumerate @item Variables with signatures (functions) and without signatures (nonfunction variables) are distinct: @verbatim int x, x(); x=5; x=new int() {return 17;}; x=x(); // calls x() and puts the result, 17, in the scalar x @end verbatim @item Traditional function definitions are allowed: @verbatim int sqr(int x) { return x*x; } sqr=null; // but the function is still just a variable. @end verbatim @item Casting can be used to resolve ambiguities: @verbatim int a, a(), b, b(); // Valid: creates four variables. a=b; // Invalid: assignment is ambiguous. a=(int) b; // Valid: resolves ambiguity. (int) (a=b); // Valid: resolves ambiguity. (int) a=b; // Invalid: cast expressions cannot be L-values. int c(); c=a; // Valid: only one possible assignment. @end verbatim @item ``Higher-order'' functions, in other words functions that return functions, are allowed. The return type must be given a signature-free alias with @code{using} or @code{typedef}: @cindex @code{using} @cindex @code{typedef} @verbatim using intop = int(int); // typedef int intop(int); // Equivalent to previous line intop adder(int m) { return new int(int n) {return m+n;}; } intop addby7=adder(7); write(addby7(1)); // Writes 8. @end verbatim @item @cindex overloading functions One may redefine a function @code{f}, even for calls to @code{f} in previously declared functions, by assigning another (anonymous or named) function to it. However, if @code{f} is overloaded by a new function definition, previous calls will still access the original version of @code{f}, as illustrated in this example: @verbatim void f() { write("hi"); } void g() { f(); } g(); // writes "hi" f=new void() {write("bye");}; g(); // writes "bye" void f() {write("overloaded");}; f(); // writes "overloaded" g(); // writes "bye" @end verbatim @cindex function declarations @item Anonymous functions can be used to redefine a function variable that has been declared (and implicitly initialized to the null function) but not yet explicitly defined: @verbatim void f(bool b); void g(bool b) { if(b) f(b); else write(b); } f=new void(bool b) { write(b); g(false); }; g(true); // Writes true, then writes false. @end verbatim @end enumerate @code{Asymptote} is the only language we know of that treats functions as variables, but allows overloading by distinguishing variables based on their signatures. @cindex @code{libsigsegv} @cindex stack overflow @anchor{stack overflow} @cindex recursion @cindex stack overflow Functions are allowed to call themselves recursively. As in C++, infinite nested recursion will generate a stack overflow (reported as a segmentation fault, unless a fully working version of the @acronym{GNU} library @code{libsigsegv} (e.g.@ 2.4 or later) is installed at configuration time). @node Default arguments @subsection Default arguments @cindex default arguments @cindex arguments @code{Asymptote} supports a more flexible mechanism for default function arguments than C++: they may appear anywhere in the function prototype. Because certain data types are implicitly cast to more sophisticated types (@pxref{Casts}) one can often avoid ambiguities by ordering function arguments from the simplest to the most complicated. For example, given @verbatim real f(int a=1, real b=0) {return a+b;} @end verbatim @noindent then @code{f(1)} returns 1.0, but @code{f(1.0)} returns 2.0. The value of a default argument is determined by evaluating the given @code{Asymptote} expression in the scope where the called function is defined. @node Named arguments @subsection Named arguments @cindex keywords @cindex named arguments It is sometimes difficult to remember the order in which arguments appear in a function declaration. Named (keyword) arguments make calling functions with multiple arguments easier. Unlike in the C and C++ languages, an assignment in a function argument is interpreted as an assignment to a parameter of the same name in the function signature, @emph{not within the local scope}. The command-line option @code{-d} may be used to check @code{Asymptote} code for cases where a named argument may be mistaken for a local assignment. When matching arguments to signatures, first all of the keywords are matched, then the arguments without names are matched against the unmatched formals as usual. For example, @verbatim int f(int x, int y) { return 10x+y; } write(f(4,x=3)); @end verbatim @noindent outputs 34, as @code{x} is already matched when we try to match the unnamed argument @code{4}, so it gets matched to the next item, @code{y}. For the rare occasions where it is desirable to assign a value to local variable within a function argument (generally @emph{not} a good programming practice), simply enclose the assignment in parentheses. For example, given the definition of @code{f} in the previous example, @verbatim int x; write(f(4,(x=3))); @end verbatim @noindent is equivalent to the statements @verbatim int x; x=3; write(f(4,3)); @end verbatim @noindent and outputs 43. @cindex @code{keyword} @cindex keyword-only Parameters can be specified as ``keyword-only'' by putting @code{keyword} immediately before the parameter name, as in @code{int f(int keyword x)} or @code{int f(int keyword x=77)}. This forces the caller of the function to use a named argument to give a value for this parameter. That is, @code{f(x=42)} is legal, but @code{f(25)} is not. Keyword-only parameters must be listed after normal parameters in a function definition. As a technical detail, we point out that, since variables of the same name but different signatures are allowed in the same scope, the code @verbatim int f(int x, int x()) { return x+x(); } int seven() {return 7;} @end verbatim @noindent is legal in @code{Asymptote}, with @code{f(2,seven)} returning 9. A named argument matches the first unmatched formal of the same name, so @code{f(x=2,x=seven)} is an equivalent call, but @code{f(x=seven,2)} is not, as the first argument is matched to the first formal, and @code{int ()} cannot be implicitly cast to @code{int}. Default arguments do not affect which formal a named argument is matched to, so if @code{f} were defined as @verbatim int f(int x=3, int x()) { return x+x(); } @end verbatim @noindent then @code{f(x=seven)} would be illegal, even though @code{f(seven)} obviously would be allowed. @node Rest arguments @subsection Rest arguments @cindex rest arguments Rest arguments allow one to write functions that take a variable number of arguments: @verbatim // This function sums its arguments. int sum(... int[] nums) { int total=0; for(int i=0; i < nums.length; ++i) total += nums[i]; return total; } sum(1,2,3,4); // returns 10 sum(); // returns 0 // This function subtracts subsequent arguments from the first. int subtract(int start ... int[] subs) { for(int i=0; i < subs.length; ++i) start -= subs[i]; return start; } subtract(10,1,2); // returns 7 subtract(10); // returns 10 subtract(); // illegal @end verbatim @cindex packing Putting an argument into a rest array is called @emph{packing}. One can give an explicit list of arguments for the rest argument, so @code{subtract} could alternatively be implemented as @verbatim int subtract(int start ... int[] subs) { return start - sum(... subs); } @end verbatim One can even combine normal arguments with rest arguments: @verbatim sum(1,2,3 ... new int[] {4,5,6}); // returns 21 @end verbatim @noindent @cindex unpacking This builds a new six-element array that is passed to @code{sum} as @code{nums}. The opposite operation, @emph{unpacking}, is not allowed: @verbatim subtract(... new int[] {10, 1, 2}); @end verbatim @noindent is illegal, as the start formal is not matched. If no arguments are packed, then a zero-length array (as opposed to @code{null}) is bound to the rest parameter. Note that default arguments are ignored for rest formals and the rest argument is not bound to a keyword. In some cases, keyword-only parameters are helpful to avoid arguments intended for the rest parameter to be assigned to other parameters. For example, here the use of @code{keyword} is to avoid @code{pnorm(1.0,2.0,0.3)} matching @code{1.0} to @code{p}. @verbatim real pnorm(real keyword p=2.0 ... real[] v) { return sum(v^p)^(1/p); } @end verbatim The overloading resolution in @code{Asymptote} is similar to the function matching rules used in C++. Every argument match is given a score. Exact matches score better than matches with casting, and matches with formals (regardless of casting) score better than packing an argument into the rest array. A candidate is maximal if all of the arguments score as well in it as with any other candidate. If there is one unique maximal candidate, it is chosen; otherwise, there is an ambiguity error. @verbatim int f(path g); int f(guide g); f((0,0)--(100,100)); // matches the second; the argument is a guide int g(int x, real y); int g(real x, int x); g(3,4); // ambiguous; the first candidate is better for the first argument, // but the second candidate is better for the second argument int h(... int[] rest); int h(real x ... int[] rest); h(1,2); // the second definition matches, even though there is a cast, // because casting is preferred over packing int i(int x ... int[] rest); int i(real x, real y ... int[] rest); i(3,4); // ambiguous; the first candidate is better for the first argument, // but the second candidate is better for the second one @end verbatim @node Mathematical functions @subsection Mathematical functions @cindex mathematical functions @cindex functions @cindex @code{libm} routines @cindex @code{sin} @cindex @code{cos} @cindex @code{tan} @cindex @code{asin} @cindex @code{acos} @cindex @code{atan} @cindex @code{exp} @cindex @code{log} @cindex @code{pow10} @cindex @code{log10} @cindex @code{sinh} @cindex @code{cosh} @cindex @code{tanh} @cindex @code{asinh} @cindex @code{acosh} @cindex @code{atanh} @cindex @code{sqrt} @cindex @code{cbrt} @cindex @code{fabs} @cindex @code{expm1} @cindex @code{log1p} @cindex @code{identity} @cindex @code{J} @cindex @code{Y} @cindex @code{gamma} @cindex @code{erf} @cindex @code{erfc} @cindex @code{atan2} @cindex @code{hypot} @cindex @code{fmod} @cindex @code{remainder} @code{Asymptote} has built-in versions of the standard @code{libm} mathematical real(real) functions @code{sin}, @code{cos}, @code{tan}, @code{asin}, @code{acos}, @code{atan}, @code{exp}, @code{log}, @code{pow10}, @code{log10}, @code{sinh}, @code{cosh}, @code{tanh}, @code{asinh}, @code{acosh}, @code{atanh}, @code{sqrt}, @code{cbrt}, @code{fabs}, @code{expm1}, @code{log1p}, as well as the identity function @code{identity}. @code{Asymptote} also defines the order @code{n} Bessel functions of the first kind @code{Jn(int n, real)} and second kind @code{Yn(int n, real)}, as well as the gamma function @code{gamma}, the error function @code{erf}, and the complementary error function @code{erfc}. The standard real(real, real) functions @code{atan2}, @code{hypot}, @code{fmod}, @code{remainder} are also included. @cindex @code{degrees} @cindex @code{radians} @cindex @code{Degrees} The functions @code{degrees(real radians)} and @code{radians(real degrees)} can be used to convert between radians and degrees. The function @code{Degrees(real radians)} returns the angle in degrees in the interval [0,360). @cindex @code{Sin} @cindex @code{Cos} @cindex @code{Tan} @cindex @code{aSin} @cindex @code{aCos} @cindex @code{aTan} For convenience, @code{Asymptote} defines variants @code{Sin}, @code{Cos}, @code{Tan}, @code{aSin}, @code{aCos}, and @code{aTan} of the standard trigonometric functions that use degrees rather than radians. We also define complex versions of the @code{sqrt}, @code{sin}, @code{cos}, @code{exp}, @code{log}, and @code{gamma} functions. @cindex @code{floor} @cindex @code{ceil} @cindex @code{round} @cindex @code{sgn} The functions @code{floor}, @code{ceil}, and @code{round} differ from their usual definitions in that they all return an int value rather than a real (since that is normally what one wants). The functions @code{Floor}, @code{Ceil}, and @code{Round} are respectively similar, except that if the result cannot be converted to a valid int, they return @code{intMax} for positive arguments and @code{intMin} for negative arguments, rather than generating an integer overflow. We also define a function @code{sgn}, which returns the sign of its real argument as an integer (-1, 0, or 1). @cindex @code{abs} There is an @code{abs(int)} function, as well as an @code{abs(real)} function (equivalent to @code{fabs(real)}), an @code{abs(pair)} function (equivalent to @code{length(pair)}). @cindex @code{srand} @cindex @code{rand} @cindex @code{randMax} @cindex @code{unitrand} @cindex @code{Gaussrand} @cindex @code{histogram} @cindex @code{factorial} @cindex @code{choose} Asymptote's random number generators can be seeded with @code{srand(int)}. If a negative argument is given to @code{srand}, an internal entropy source is used as a seed. Random numbers are initially seeded with @code{srand(-1)}. The function @code{int rand(int a=0, int b=randMax)} returns a random integer in [a,b]. The @code{unitrand()} function returns a random number uniformly distributed in the interval [0,1). A Gaussian random number generator @code{Gaussrand} and a collection of statistics routines, including @code{histogram}, are provided in the module @code{stats}. The functions @code{factorial(int n)}, which returns @math{n!}, and @code{choose(int n, int k)}, which returns @math{n!/(k!(n-k)!)}, are also defined. @cindex @acronym{GNU} Scientific Library @cindex @code{gsl} @cindex Airy @cindex Bessel @cindex Legendre @cindex elliptic functions @cindex exponential integral @cindex trigonometric integrals @cindex Riemann zeta function @cindex @code{Ai} @cindex @code{Bi} @cindex @code{Ai_deriv} @cindex @code{Bi_deriv} @cindex @code{zero_Ai} @cindex @code{zero_Bi} @cindex @code{zero_Ai_deriv} @cindex @code{zero_Bi_deriv} @cindex @code{J} @cindex @code{Y} @cindex @code{I} @cindex @code{K} @cindex @code{i_scaled} @cindex @code{k_scaled} @cindex @code{zero_J} @cindex @code{F} @cindex @code{E} @cindex @code{P} @cindex @code{sncndn} @cindex @code{Ei} @cindex @code{Si} @cindex @code{Ci} @cindex @code{Pl} @cindex @code{zeta} When configured with the @acronym{GNU} Scientific Library (GSL), available from @url{https://www.gnu.org/software/gsl/}, @code{Asymptote} contains an internal module @code{gsl} that defines the airy functions @code{Ai(real)}, @code{Bi(real)}, @code{Ai_deriv(real)}, @code{Bi_deriv(real)}, @code{zero_Ai(int)}, @code{zero_Bi(int)}, @code{zero_Ai_deriv(int)}, @code{zero_Bi_deriv(int)}, the Bessel functions @code{I(int, real)}, @code{K(int, real)}, @code{j(int, real)}, @code{y(int, real)}, @code{i_scaled(int, real)}, @code{k_scaled(int, real)}, @code{J(real, real)}, @code{Y(real, real)}, @code{I(real, real)}, @code{K(real, real)}, @code{zero_J(real, int)}, the elliptic functions @code{F(real, real)}, @code{E(real, real)}, and @code{P(real, real)}, the Jacobi elliptic functions @code{real[] sncndn(real,real)}, the exponential/trigonometric integrals @code{Ei}, @code{Si}, and @code{Ci}, the Legendre polynomials @code{Pl(int, real)}, and the Riemann zeta function @code{zeta(real)}. For example, to compute the sine integral @code{Si} of 1.0: @verbatim import gsl; write(Si(1.0)); @end verbatim @code{Asymptote} also provides a few general purpose numerical routines: @table @code @cindex @code{newton} @item @code{real newton(int iterations=100, real f(real), real fprime(real), real x, bool verbose=false);} Use Newton-Raphson iteration to solve for a root of a real-valued differentiable function @code{f}, given its derivative @code{fprime} and an initial guess @code{x}. Diagnostics for each iteration are printed if @code{verbose=true}. If the iteration fails after the maximum allowed number of loops (@code{iterations}), @code{realMax} is returned. @cindex @code{newton} @item @code{real newton(int iterations=100, real f(real), real fprime(real), real x1, real x2, bool verbose=false);} Use bracketed Newton-Raphson bisection to solve for a root of a real-valued differentiable function @code{f} within an interval [@code{x1},@code{x2}] (on which the endpoint values of @code{f} have opposite signs), given its derivative @code{fprime}. Diagnostics for each iteration are printed if @code{verbose=true}. If the iteration fails after the maximum allowed number of loops (@code{iterations}), @code{realMax} is returned. @cindex integral @cindex integrate @cindex @code{simpson} @item @code{real simpson(real f(real), real a, real b, real acc=realEpsilon, real dxmax=b-a)} returns the integral of @code{f} from @code{a} to @code{b} using adaptive Simpson integration. @cindex @code{cputime} @noindent @item @code{cputime cputime()} returns a structure @code{cputime} with cumulative @acronym{CPU} times broken down into the fields @code{parent.user}, @code{parent.system}, @code{child.user}, and @code{child.system}, along with the cumulative wall clock time in @code{parent.clock}, all measured in seconds. For convenience, the incremental fields @code{change.user}, @code{change.system}, and @code{change.clock} indicate the change in the corresponding fields since the last call to @code{cputime()}. The function @verbatim void write(file file=stdout, string s="", cputime c, string format=cputimeformat, suffix suffix=none); @end verbatim @noindent displays the incremental user cputime followed by ``u'', the incremental system cputime followed by ``s'', the total user cputime followed by ``U'', and the total system cputime followed by ``S''. @end table @node Arrays @section Arrays @cindex arrays @menu * Slices:: Python-style array slices @end menu Appending @code{[]} to a built-in or user-defined type yields an array. The array element @code{i} of an array @code{A} can be accessed as @code{A[i]}. By default, attempts to access or assign to an array element using a negative index generates an error. Reading an array element with an index beyond the length of the array also generates an error; however, assignment to an element beyond the length of the array causes the array to be resized to accommodate the new element. One can also index an array @code{A} with an integer array @code{B}: the array @code{A[B]} is formed by indexing array @code{A} with successive elements of array @code{B}. A convenient Java-style shorthand exists for iterating over all elements of an array; see @ref{array iteration}. The declaration @verbatim real[] A; @end verbatim @noindent initializes @code{A} to be an empty (zero-length) array. Empty arrays should be distinguished from null arrays. If we say @verbatim real[] A=null; @end verbatim @noindent then @code{A} cannot be dereferenced at all (null arrays have no length and cannot be read from or assigned to). Arrays can be explicitly initialized like this: @verbatim real[] A={0,1,2}; @end verbatim Array assignment in @code{Asymptote} does a shallow copy: only the pointer is copied (if one copy if modified, the other will be too). The @code{copy} function listed below provides a deep copy of an array. @cindex @code{length} @cindex @code{cyclic} @cindex @code{keys} @cindex @code{push} @cindex @code{append} @cindex @code{pop} @cindex @code{insert} @cindex @code{delete} @cindex @code{initialized} Every array @code{A} of type @code{T[]} has the virtual members @itemize @item @code{int length}, @item @code{bool cyclic}, @item @code{int[] keys}, @item @code{T push(T x)}, @item @code{void append(T[] a)}, @item @code{T pop()}, @item @code{void insert(int i ... T[] x)}, @item @code{void delete(int i, int j=i)}, @item @code{void delete()}, and @item @code{bool initialized(int n)}. @end itemize The member @code{A.length} evaluates to the length of the array. Setting @code{A.cyclic=true} signifies that array indices should be reduced modulo the current array length. Reading from or writing to a nonempty cyclic array never leads to out-of-bounds errors or array resizing. The member @code{A.keys} evaluates to an array of integers containing the indices of initialized entries in the array in ascending order. Hence, for an array of length @code{n} with all entries initialized, @code{A.keys} evaluates to @code{@{0,1,...,n-1@}}. A new keys array is produced each time @code{A.keys} is evaluated. The functions @code{A.push} and @code{A.append} append their arguments onto the end of the array, while @code{A.insert(int i ... T[] x)} inserts @code{x} into the array at index @code{i}. For convenience @code{A.push} returns the pushed item. The function @code{A.pop()} pops and returns the last element, while @code{A.delete(int i, int j=i)} deletes elements with indices in the range [@code{i},@code{j}], shifting the position of all higher-indexed elements down. If no arguments are given, @code{A.delete()} provides a convenient way of deleting all elements of @code{A}. The routine @code{A.initialized(int n)} can be used to examine whether the element at index @code{n} is initialized. Like all @code{Asymptote} functions, @code{push}, @code{append}, @code{pop}, @code{insert}, @code{delete}, and @code{initialized} can be "pulled off" of the array and used on their own. For example, @verbatim int[] A={1}; A.push(2); // A now contains {1,2}. A.append(A); // A now contains {1,2,1,2}. int f(int)=A.push; f(3); // A now contains {1,2,1,2,3}. int g()=A.pop; write(g()); // Outputs 3. A.delete(0); // A now contains {2,1,2}. A.delete(0,1); // A now contains {2}. A.insert(1,3); // A now contains {2,3}. A.insert(1 ... A); // A now contains {2,2,3,3} A.insert(2,4,5); // A now contains {2,2,4,5,3,3}. @end verbatim The @code{[]} suffix can also appear after the variable name; this is sometimes convenient for declaring a list of variables and arrays of the same type: @verbatim real a,A[]; @end verbatim @noindent This declares @code{a} to be @code{real} and implicitly declares @code{A} to be of type @code{real[]}. In the following list of built-in array functions, @code{T} represents a generic type. Note that the internal functions @code{alias}, @code{array}, @code{copy}, @code{concat}, @code{sequence}, @code{map}, and @code{transpose}, which depend on type @code{T[]}, are defined only after the first declaration of a variable of type @code{T[]}. @table @code @cindex @code{new} @item new T[] returns a new empty array of type @code{T[]}; @cindex @code{new} @item new T[] @{list@} returns a new array of type @code{T[]} initialized with @code{list} (a comma delimited list of elements); @item new T[n] returns a new array of @code{n} elements of type @code{T[]}. These @code{n} array elements are not initialized unless they are arrays themselves (in which case they are each initialized to empty arrays); @cindex @code{array} @item T[] array(int n, T value, int depth=intMax) returns an array consisting of @code{n} copies of @code{value}. If @code{value} is itself an array, a deep copy of @code{value} is made for each entry. If @code{depth} is specified, this deep copying only recurses to the specified number of levels; @cindex @code{sequence} @item int[] sequence(int n) if @code{n >= 1} returns the array @code{@{0,1,...,n-1@}} (otherwise returns a null array); @item int[] sequence(int n, int m) if @code{m >= n} returns an array @code{@{n,n+1,...,m@}} (otherwise returns a null array); @item int[] sequence(int n, int m, int skip) if @code{m >= n} returns an array @code{@{n,n+1,...,m@}} skipping by @code{skip} (otherwise returns a null array); @item T[] sequence(T f(int), int n) if @code{n >= 1} returns the sequence @code{@{f_i :i=0,1,...n-1@}} given a function @code{T f(int)} and integer @code{int n} (otherwise returns a null array); @cindex @code{map} @item T[] map(T f(T), T[] a) returns the array obtained by applying the function @code{f} to each element of the array @code{a}. This is equivalent to @code{sequence(new T(int i) @{return f(a[i]);@},a.length)}; @cindex @code{map} @item T2[] map(T2 f(T1), T1[] a) constructed by running @code{from mapArray(Src=T1, Dst=T2) access map;}, returns the array obtained by applying the function @code{f} to each element of the array @code{a}; @cindex @code{reverse} @item int[] reverse(int n) if @code{n >= 1} returns the array @code{@{n-1,n-2,...,0@}} (otherwise returns a null array); @cindex @code{complement} @item int[] complement(int[] a, int n) returns the complement of the integer array @code{a} in @code{@{0,1,2,...,n-1@}}, so that @code{b[complement(a,b.length)]} yields the complement of @code{b[a]}; @cindex @code{uniform} @item real[] uniform(real a, real b, int n) if @code{n >= 1} returns a uniform partition of @code{[a,b]} into @code{n} subintervals (otherwise returns a null array); @cindex @code{find} @item int find(bool[] a, int n=1) returns the index of the @code{n}th @code{true} value in the boolean array @code{a} or -1 if not found. If @code{n} is negative, search backwards from the end of the array for the @code{-n}th value; @cindex @code{findall} @item int[] findall(bool[] a) returns the indices of all @code{true} values in the boolean array @code{a}; @cindex @code{search} @item int search(T[] a, T key) For built-in ordered types @code{T}, searches a sorted array @code{a} of @code{n} elements for @code{key}, returning the index @code{i} if @code{a[i] <= key < a[i+1]}, @code{-1} if @code{key} is less than all elements of @code{a}, or @code{n-1} if @code{key} is greater than or equal to the last element of @code{a}; @cindex @code{search} @item int search(T[] a, T key, bool less(T i, T j)) searches an array @code{a} for @code{key} sorted in ascending order such that element @code{i} precedes element @code{j} if @code{less(i,j)} is true; @cindex @code{copy} @item T[] copy(T[] a) returns a deep copy of the array @code{a}; @cindex @code{concat} @item T[] concat(... T[][] a) returns a new array formed by concatenating the given one-dimensional arrays given as arguments; @cindex @code{alias} @item bool alias(T[] a, T[] b) returns @code{true} if the arrays @code{a} and @code{b} are identical; @cindex @code{sort} @item T[] sort(T[] a) For built-in ordered types @code{T}, returns a copy of @code{a} sorted in ascending order; @cindex @code{sort} @anchor{sort} @item T[][] sort(T[][] a) For built-in ordered types @code{T}, returns a copy of @code{a} with the rows sorted by the first column, breaking ties with successively higher columns. For example: @verbatim string[][] a={{"bob","9"},{"alice","5"},{"pete","7"}, {"alice","4"}}; // Row sort (by column 0, using column 1 to break ties): write(sort(a)); @end verbatim produces @verbatim alice 4 alice 5 bob 9 pete 7 @end verbatim @cindex @code{sort} @item T[] sort(T[] a, bool less(T i, T j), bool stable=true) returns a copy of @code{a} sorted in ascending order such that element @code{i} precedes element @code{j} if @code{less(i,j)} is true, subject to (if @code{stable} is @code{true}) the stability constraint that the original order of elements @code{i} and @code{j} is preserved if @code{less(i,j)} and @code{less(j,i)} are both @code{false}; @cindex @code{transpose} @item T[][] transpose(T[][] a) returns the transpose of @code{a}; @cindex @code{transpose} @item T[][][] transpose(T[][][] a, int[] perm) returns the 3D transpose of @code{a} obtained by applying the permutation @code{perm} of @code{new int[]@{0,1,2@}} to the indices of each entry; @cindex @code{sum} @item T sum(T[] a) for arithmetic types @code{T}, returns the sum of @code{a}. In the case where @code{T} is @code{bool}, the number of true elements in @code{a} is returned; @cindex @code{min} @item T min(T[] a) @item T min(T[][] a) @item T min(T[][][] a) for built-in ordered types @code{T}, returns the minimum element of @code{a}; @cindex @code{max} @item T max(T[] a) @item T max(T[][] a) @item T max(T[][][] a) for built-in ordered types @code{T}, returns the maximum element of @code{a}; @cindex @code{min} @item T[] min(T[] a, T[] b) for built-in ordered types @code{T}, and arrays @code{a} and @code{b} of the same length, returns an array composed of the minimum of the corresponding elements of @code{a} and @code{b}; @cindex @code{max} @item T[] max(T[] a, T[] b) for built-in ordered types @code{T}, and arrays @code{a} and @code{b} of the same length, returns an array composed of the maximum of the corresponding elements of @code{a} and @code{b}; @cindex @code{pairs} @item pair[] pairs(real[] x, real[] y); for arrays @code{x} and @code{y} of the same length, returns the pair array @code{sequence(new pair(int i) @{return (x[i],y[i]);@},x.length)}; @cindex @code{fft} @item pair[] fft(pair[] a, int sign=1) returns the unnormalized Fast Fourier Transform of @code{a} (if the optional @code{FFTW} package is installed), using the given @code{sign}. Here is a simple example: @verbatim int n=4; pair[] f=sequence(n); write(f); pair[] g=fft(f,-1); write(); write(g); f=fft(g,1); write(); write(f/n); @end verbatim @cindex @code{fft} @item pair[][] fft(pair[][] a, int sign=1) returns the unnormalized two-dimensional Fourier transform of @code{a} using the given @code{sign}; @cindex @code{fft} @item pair[][][] fft(pair[][][] a, int sign=1) returns the unnormalized three-dimensional Fourier transform of @code{a} using the given @code{sign}; @cindex @code{realschur} @cindex @code{schur} @item realschur schur(real[][] a) returns a struct @code{realschur} containing a unitary matrix @code{U} and a quasitriangular matrix @code{T} such that @code{a=U*T*transpose(U)}; @cindex @code{schur} @item schur schur(pair[][] a) returns a struct @code{schur} containing a unitary matrix @code{U} and a triangular matrix @code{T} such that @code{a=U*T*conj(transpose(U))}; @cindex @code{dot} @item real dot(real[] a, real[] b) returns the dot product of the vectors @code{a} and @code{b}; @cindex @code{dot} @item pair dot(pair[] a, pair[] b) returns the complex dot product @code{sum(a*conj(b))} of the vectors @code{a} and @code{b}; @anchor{tridiagonal} @cindex @code{tridiagonal} @item real[] tridiagonal(real[] a, real[] b, real[] c, real[] f); Solve the periodic tridiagonal problem @math{L@code{x}=@code{f}} and return the solution @code{x}, where @code{f} is an @math{n} vector and @math{L} is the @math{n \times n} matrix @verbatim [ b[0] c[0] a[0] ] [ a[1] b[1] c[1] ] [ a[2] b[2] c[2] ] [ ... ] [ c[n-1] a[n-1] b[n-1] ] @end verbatim For Dirichlet boundary conditions (denoted here by @code{u[-1]} and @code{u[n]}), replace @code{f[0]} by @code{f[0]-a[0]u[-1]} and @code{f[n-1]-c[n-1]u[n]}; then set @code{a[0]=c[n-1]=0}; @cindex @code{solve} @item real[] solve(real[][] a, real[] b, bool warn=true) Solve the linear equation @math{@code{a}x=@code{b}} by LU decomposition and return the solution @math{x}, where @code{a} is an @math{n \times n} matrix and @code{b} is an array of length @math{n}. For example: @verbatim import math; real[][] a={{1,-2,3,0},{4,-5,6,2},{-7,-8,10,5},{1,50,1,-2}}; real[] b={7,19,33,3}; real[] x=solve(a,b); write(a); write(); write(b); write(); write(x); write(); write(a*x); @end verbatim If @code{a} is a singular matrix and @code{warn} is @code{false}, return an empty array. If the matrix @code{a} is tridiagonal, the routine @code{tridiagonal} provides a more efficient algorithm (@pxref{tridiagonal}); @anchor{solve} @cindex @code{solve} @item real[][] solve(real[][] a, real[][] b, bool warn=true) Solve the linear equation @math{@code{a}x=@code{b}} and return the solution @math{x}, where @code{a} is an @math{n \times n} matrix and @code{b} is an @math{n \times m} matrix. If @code{a} is a singular matrix and @code{warn} is @code{false}, return an empty matrix; @cindex @code{identity} @item real[][] identity(int n); returns the @math{n \times n} identity matrix; @cindex @code{diagonal} @item real[][] diagonal(... real[] a) returns the diagonal matrix with diagonal entries given by a; @cindex @code{inverse} @item real[][] inverse(real[][] a) returns the inverse of a square matrix @code{a}; @cindex @code{quadraticroots} @item @code{real[] quadraticroots(real a, real b, real c);} This numerically robust solver returns the real roots of the quadratic equation @math{ax^2+bx+c=0}, in ascending order. Multiple roots are listed separately; @cindex @code{quadraticroots} @item @code{pair[] quadraticroots(explicit pair a, explicit pair b, explicit pair c);} This numerically robust solver returns the complex roots of the quadratic equation @math{ax^2+bx+c=0}; @cindex @code{cubicroots} @item @code{real[] cubicroots(real a, real b, real c, real d);} This numerically robust solver returns the real roots of the cubic equation @math{ax^3+bx^2+cx+d=0}. Multiple roots are listed separately. @end table @cindex vectorization @code{Asymptote} includes a full set of vectorized array instructions for arithmetic (including self) and logical operations. These element-by-element instructions are implemented in C++ code for speed. Given @verbatim real[] a={1,2}; real[] b={3,2}; @end verbatim @noindent then @code{a == b} and @code{a >= 2} both evaluate to the vector @code{@{false, true@}}. @cindex @code{all} To test whether all components of @code{a} and @code{b} agree, use the boolean function @code{all(a == b)}. One can also use conditionals like @code{(a >= 2) ? a : b}, which returns the array @code{@{3,2@}}, or @code{write((a >= 2) ? a : null}, which returns the array @code{@{2@}}. All of the standard built-in @code{libm} functions of signature @code{real(real)} also take a real array as an argument, effectively like an implicit call to @code{map}. As with other built-in types, arrays of the basic data types can be read in by assignment. In this example, the code @verbatim file fin=input("test.txt"); real[] A=fin; @end verbatim @cindex @code{eof} @cindex @code{eol} @cindex @code{line} @cindex line mode @noindent reads real values into @code{A} until the end-of-file is reached (or an I/O error occurs). @cindex @code{line} @cindex @code{word} @cindex @code{csv} @cindex @code{dimension} @cindex @code{read} The virtual member functions @code{line()}, @code{word()}, @code{csv()}, @code{dimension()}, and @code{read()} of a file are useful for qualifying array reads, while the virtual fields @code{line}, @code{word}, @code{csv}, and @code{dimension} may be used to query these respective states. @cindex @code{line} If line mode is set with @code{file line(bool b=true)}, then reading will stop once the end of the line is reached: @verbatim file fin=input("test.txt"); real[] A=fin.line(); @end verbatim @cindex reading string arrays @cindex @code{word} @cindex white-space string delimiter mode Since string reads by default read up to the end of line anyway, line mode normally has no effect on string array reads. However, there is a white-space delimiter mode for reading strings, @code{file word(bool b=true)}, which causes string reads to respect white-space delimiters, instead of the default end-of-line delimiter: @verbatim file fin=input("test.txt").line().word(); real[] A=fin; @end verbatim @cindex @code{csv} @cindex comma-separated-value mode Another useful mode is comma-separated-value mode, @code{file csv(bool b=true)}, which causes reads to respect comma delimiters: @verbatim file fin=input("test.txt").csv(); real[] A=fin; @end verbatim @cindex @code{dimension} To restrict the number of values read, use the @code{file dimension(int)} virtual member function: @verbatim file fin=input("test.txt"); real[] A=fin.dimension(10); @end verbatim This reads 10 values into A, unless end-of-file (or end-of-line in line mode) occurs first. Attempting to read beyond the end of the file will produce a runtime error message. Specifying a value of 0 for the integer limit is equivalent to the previous example of reading until end-of-file (or end-of-line in line mode) is encountered. Two- and three-dimensional arrays of the basic data types can be read in like this: @verbatim file fin=input("test.txt"); real[][] A=fin.dimension(2,3); real[][][] B=fin.dimension(2,3,4); @end verbatim @noindent @cindex @code{read} Sometimes the array dimensions are stored with the data as integer fields at the beginning of an array. Such 1, 2, or 3 dimensional arrays can be read in with the virtual member functions @code{read(1)}, @code{read(2)}, or @code{read(3)}, respectively: @verbatim file fin=input("test.txt"); real[] A=fin.read(1); real[][] B=fin.read(2); real[][][] C=fin.read(3); @end verbatim @cindex @code{write} One, two, and three-dimensional arrays of the basic data types can be output with the functions @code{write(file,T[])}, @code{write(file,T[][])}, @code{write(file,T[][][])}, respectively. @node Slices @subsection Slices @cindex slices Asymptote allows a section of an array to be addressed as a slice using a Python-like syntax. If @code{A} is an array, the expression @code{A[m:n]} returns a new array consisting of the elements of @code{A} with indices from @code{m} up to but not including @code{n}. For example, @verbatim int[] x={0,1,2,3,4,5,6,7,8,9}; int[] y=x[2:6]; // y={2,3,4,5}; int[] z=x[5:10]; // z={5,6,7,8,9}; @end verbatim If the left index is omitted, it is taken be @code{0}. If the right index is omitted it is taken to be the length of the array. If both are omitted, the slice then goes from the start of the array to the end, producing a non-cyclic deep copy of the array. For example: @verbatim int[] x={0,1,2,3,4,5,6,7,8,9}; int[] y=x[:4]; // y={0,1,2,3} int[] z=x[5:]; // z={5,6,7,8,9} int[] w=x[:]; // w={0,1,2,3,4,5,6,7,8,9}, distinct from array x. @end verbatim If A is a non-cyclic array, it is illegal to use negative values for either of the indices. If the indices exceed the length of the array, however, they are politely truncated to that length. For cyclic arrays, the slice @code{A[m:n]} still consists of the cells with indices in the set [@code{m},@code{n}), but now negative values and values beyond the length of the array are allowed. The indices simply wrap around. For example: @verbatim int[] x={0,1,2,3,4,5,6,7,8,9}; x.cyclic=true; int[] y=x[8:15]; // y={8,9,0,1,2,3,4}. int[] z=x[-5:5]; // z={5,6,7,8,9,0,1,2,3,4} int[] w=x[-3:17]; // w={7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6} @end verbatim Notice that with cyclic arrays, it is possible to include the same element of the original array multiple times within a slice. Regardless of the original array, arrays produced by slices are always non-cyclic. If the left and right indices of a slice are the same, the result is an empty array. If the array being sliced is empty, the result is an empty array. Any slice with a left index greater than its right index will yield an error. Slices can also be assigned to, changing the value of the original array. If the array being assigned to the slice has a different length than the slice itself, elements will be inserted or removed from the array to accommodate it. For instance: @verbatim string[] toppings={"mayo", "salt", "ham", "lettuce"}; toppings[0:2]=new string[] {"mustard", "pepper"}; // Now toppings={"mustard", "pepper", "ham", "lettuce"} toppings[2:3]=new string[] {"turkey", "bacon" }; // Now toppings={"mustard", "pepper", "turkey", "bacon", "lettuce"} toppings[0:3]=new string[] {"tomato"}; // Now toppings={"tomato", "bacon", "lettuce"} @end verbatim If an array is assigned to a slice of itself, a copy of the original array is assigned to the slice. That is, code such as @code{x[m:n]=x} is equivalent to @code{x[m:n]=copy(x)}. One can use the shorthand @code{x[m:m]=y} to insert the contents of the array @code{y} into the array @code{x} starting at the location just before @code{x[m]}. For a cyclic array, a slice is bridging if it addresses cells up to the end of the array and then continues on to address cells at the start of the array. For instance, if @code{A} is a cyclic array of length 10, @code{A[8:12]}, @code{A[-3:1]}, and @code{A[5:25]} are bridging slices whereas @code{A[3:7]}, @code{A[7:10]}, @code{A[-3:0]} and @code{A[103:107]} are not. Bridging slices can only be assigned to if the number of elements in the slice is exactly equal to the number of elements we are assigning to it. Otherwise, there is no clear way to decide which of the new entries should be @code{A[0]} and an error is reported. Non-bridging slices may be assigned an array of any length. For a cyclic array @code{A} an expression of the form @code{A[A.length:A.length]} is equivalent to the expression @code{A[0:0]} and so assigning to this slice will insert values at the start of the array. @code{A.append()} can be used to insert values at the end of the array. It is illegal to assign to a slice of a cyclic array that repeats any of the cells. @node Casts @section Casts @cindex casts @cindex implicit casts @cindex @code{explicit} @code{Asymptote} implicitly casts @code{int} to @code{real}, @code{int} to @code{pair}, @code{real} to @code{pair}, @code{pair} to @code{path}, @code{pair} to @code{guide}, @code{path} to @code{guide}, @code{guide} to @code{path}, @code{real} to @code{pen}, @code{pair[]} to @code{guide[]}, @code{pair[]} to @code{path[]}, @code{path} to @code{path[]}, and @code{guide} to @code{path[]}, along with various three-dimensional casts defined in module @code{three}. Implicit casts are automatically attempted on assignment and when trying to match function calls with possible function signatures. Implicit casting can be inhibited by declaring individual arguments @code{explicit} in the function signature, say to avoid an ambiguous function call in the following example, which outputs 0: @verbatim int f(pair a) {return 0;} int f(explicit real x) {return 1;} write(f(0)); @end verbatim @cindex explicit casts Other conversions, say @code{real} to @code{int} or @code{real} to @code{string}, require an explicit cast: @verbatim int i=(int) 2.5; string s=(string) 2.5; real[] a={2.5,-3.5}; int[] b=(int []) a; write(stdout,b); // Outputs 2,-3 @end verbatim In situations where casting from a string to a type @code{T} fails, an uninitialized variable is returned; this condition can be detected with the function @code{bool initialized(T);} @verbatim int i=(int) "2.5"; assert(initialized(i),"Invalid cast."); real x=(real) "2.5a"; assert(initialized(x),"Invalid cast."); @end verbatim @cindex @code{operator cast} Casting to user-defined types is also possible using @code{operator cast}: @verbatim struct rpair { real radius; real angle; } pair operator cast(rpair x) { return (x.radius*cos(x.angle),x.radius*sin(x.angle)); } rpair x; x.radius=1; x.angle=pi/6; write(x); // Outputs (0.866025403784439,0.5) @end verbatim One must use care when defining new cast operators. Suppose that in some code one wants all integers to represent multiples of 100. To convert them to reals, one would first want to multiply them by 100. However, the straightforward implementation @verbatim real operator cast(int x) {return x*100;} @end verbatim @noindent is equivalent to an infinite recursion, since the result @code{x*100} needs itself to be cast from an integer to a real. Instead, we want to use the standard conversion of int to real: @verbatim real convert(int x) {return x*100;} real operator cast(int x)=convert; @end verbatim @cindex @code{operator ecast} Explicit casts are implemented similarly, with @code{operator ecast}. @node Import @section Import @cindex @code{access} While @code{Asymptote} provides many features by default, some applications require specialized features contained in external @code{Asymptote} modules. For instance, the lines @verbatim access graph; graph.axes(); @end verbatim @noindent draw @math{x} and @math{y} axes on a two-dimensional graph. Here, the command looks up the module under the name @code{graph} in a global dictionary of modules and puts it in a new variable named @code{graph}. The module is a structure, and we can refer to its fields as we usually would with a structure. @cindex @code{from} Often, one wants to use module functions without having to specify the module name. The code @verbatim from graph access axes; @end verbatim @noindent adds the @code{axes} field of @code{graph} into the local name space, so that subsequently, one can just write @code{axes()}. If the given name is overloaded, all types and variables of that name are added. To add more than one name, just use a comma-separated list: @verbatim from graph access axes, xaxis, yaxis; @end verbatim @noindent Wild card notation can be used to add all non-private fields and types of a module to the local name space: @verbatim from graph access *; @end verbatim @cindex @code{unravel} Similarly, one can add the non-private fields and types of a structure to the local environment with the @code{unravel} keyword: @verbatim struct matrix { real a,b,c,d; } real det(matrix m) { unravel m; return a*d-b*c; } @end verbatim Alternatively, one can unravel selective fields: @verbatim real det(matrix m) { from m unravel a,b,c as C,d; return a*d-b*C; } @end verbatim @cindex @code{import} @cindex @code{access} The command @verbatim import graph; @end verbatim is a convenient abbreviation for the commands @verbatim access graph; unravel graph; @end verbatim That is, @code{import graph} first loads a module into a structure called @code{graph} and then adds its non-private fields and types to the local environment. This way, if a member variable (or function) is overwritten with a local variable (or function of the same signature), the original one can still be accessed by qualifying it with the module name. Wild card importing will work fine in most cases, but one does not usually know all of the internal types and variables of a module, which can also change as the module writer adds or changes features of the module. As such, it is prudent to add @code{import} commands at the start of an @code{Asymptote} file, so that imported names won't shadow locally defined functions. Still, imported names may shadow other imported names, depending on the order in which they were imported, and imported functions may cause overloading resolution problems if they have the same name as local functions defined later. @cindex @code{as} To rename modules or fields when adding them to the local environment, use @code{as}: @verbatim access graph as graph2d; from graph access xaxis as xline, yaxis as yline; @end verbatim The command @verbatim import graph as graph2d; @end verbatim is a convenient abbreviation for the commands @verbatim access graph as graph2d; unravel graph2d; @end verbatim Except for a few built-in modules, such as @code{settings}, all modules are implemented as @code{Asymptote} files. When looking up a module that has not yet been loaded, @code{Asymptote} searches the standard search paths (@pxref{Search paths}) for the matching file. The file corresponding to that name is read and the code within it is interpreted as the body of a structure defining the module. If the file name contains nonalphanumeric characters, enclose it with quotation marks: @noindent @code{access "@value{Datadir}/asymptote/graph.asy" as graph;} @noindent @code{from "@value{Datadir}/asymptote/graph.asy" access axes;} @noindent @code{import "@value{Datadir}/asymptote/graph.asy" as graph;} @cindex @acronym{URL} @cindex @acronym{libcurl} If @code{Asymptote} is compiled with support for @code{libcurl}, the file name can even be a @acronym{URL}: @code{import "https://raw.githubusercontent.com/vectorgraphics/asymptote/HEAD/doc/axis3.asy" as axis3;} It is an error if modules import themselves (or each other in a cycle). The module name to be imported must be known at compile time. @cindex runtime imports @cindex @code{eval} However, you can import an @code{Asymptote} module determined by the string @code{s} at runtime like this: @verbatim eval("import "+s,true); @end verbatim @cindex @code{asy} To conditionally execute an array of asy files, use @verbatim void asy(string format, bool overwrite ... string[] s); @end verbatim The file will only be processed, using output format @code{format}, if overwrite is @code{true} or the output file is missing. One can evaluate an @code{Asymptote} expression (without any return value, however) contained in the string @code{s} with: @cindex @code{eval} @verbatim void eval(string s, bool embedded=false); @end verbatim It is not necessary to terminate the string @code{s} with a semicolon. If @code{embedded} is @code{true}, the string will be evaluated at the top level of the current environment. If @code{embedded} is @code{false} (the default), the string will be evaluated in an independent environment, sharing the same @code{settings} module (@pxref{settings}). @cindex @code{quote} One can evaluate arbitrary @code{Asymptote} code (which may contain unescaped quotation marks) with the command @verbatim void eval(code s, bool embedded=false); @end verbatim Here @code{code} is a special type used with @code{quote @{@}} to enclose @code{Asymptote code} like this: @verbatim real a=1; code s=quote { write(a); }; eval(s,true); // Outputs 1 @end verbatim @cindex @code{include} To include the contents of an existing file @code{graph} verbatim (as if the contents of the file were inserted at that point), use one of the forms: @verbatim include graph; @end verbatim @noindent @code{include "@value{Datadir}/asymptote/graph.asy";} To list all global functions and variables defined in a module named by the contents of the string @code{s}, use the function @verbatim void list(string s, bool imports=false); @end verbatim @noindent Imported global functions and variables are also listed if @code{imports} is @code{true}. @menu * Templated imports:: @end menu @node Templated imports @subsection Templated imports @cindex template @strong{Warning:} This feature is experimental: it has known issues and its behavior may change in the future. In Asymptote types are specified when they are imported. The first executable line of any such module must be of the form @code{typedef import()}, where @code{} is a list of required type parameters. For instance, @verbatim typedef import(T, S, Number); @end verbatim @noindent could be the first line of a module that requires three type parameters. The remaining code in the module can then use @code{T}, @code{S}, and @code{Number} as types. To import such a module, one must specify the types to be used. For instance, if the module above were named @code{templatedModule}, it could be accessed for types @code{string}, @code{int[]}, and @code{real} with the import command @verbatim access templatedModule(T=string, S=int[], Number=real) as templatedModule_string_int_real; @end verbatim @noindent Note that this is actually an @emph{access} command rather than an @emph{import} command, so a type, function, or variable @code{A} defined in @code{templatedModule.asy} would need to be accessed qualified as @code{templatedModule_string_int_real.A}. Alternatively, the module could be imported via a command like @verbatim from templatedModule(T=string, S=int[], Number=real) access Wrapper_Number as Wrapper_real, operator ==; @end verbatim @noindent This command would automatically rename @code{Wrapper_Number} to @code{Wrapper_real} and would also allow the use of any @code{operator ==} overloads defined in the module. Further examples can be found in the @code{tests/template} subdirectory of the @code{Asymptote} source directory. Issues: Certain expected operators (such as @code{operator ==}) may only be available for type arguments that are builtin or defined in module @code{plain}. @node Static @section Static @cindex @code{static} Static qualifiers allocate the memory address of a variable in a higher enclosing level. For a function body, the variable is allocated in the block where the function is defined; so in the code @verbatim struct s { int count() { static int c=0; ++c; return c; } } @end verbatim @noindent there is one instance of the variable @code{c} for each object @code{s} (as opposed to each call of @code{count}). Similarly, in @verbatim int factorial(int n) { int helper(int k) { static int x=1; x *= k; return k == 1 ? x : helper(k-1); } return helper(n); } @end verbatim @noindent there is one instance of @code{x} for every call to @code{factorial} (and not for every call to @code{helper}), so this is a correct, but ugly, implementation of factorial. Similarly, a static variable declared within a structure is allocated in the block where the structure is defined. Thus, @verbatim struct A { struct B { static pair z; } } @end verbatim @noindent creates one object @code{z} for each object of type @code{A} created. In this example, @verbatim int pow(int n, int k) { struct A { static int x=1; void helper() { x *= n; } } for(int i=0; i < k; ++i) { A a; a.helper(); } return A.x; } @end verbatim @noindent there is one instance of @code{x} for each call to @code{pow}, so this is an ugly implementation of exponentiation. Loop constructs allocate a new frame in every iteration. This is so that higher-order functions can refer to variables of a specific iteration of a loop: @verbatim void f(); for(int i=0; i < 10; ++i) { int x=i; if(x==5) { f=new void() {write(x);}; } } f(); @end verbatim Here, every iteration of the loop has its own variable @code{x}, so @code{f()} will write @code{5}. If a variable in a loop is declared static, it will be allocated where the enclosing function or structure was defined (just as if it were declared static outside of the loop). For instance, in: @verbatim void f() { static int x; for(int i=0; i < 10; ++i) { static int y; } } @end verbatim @noindent both @code{x} and @code{y} will be allocated in the same place, which is also where @code{f} is allocated. Statements may also be declared static, in which case they are run at the place where the enclosing function or structure is defined. Declarations or statements not enclosed in a function or structure definition are already at the top level, so static modifiers are meaningless. A warning is given in such a case. Since structures can have static fields, it is not always clear for a qualified name whether the qualifier is a variable or a type. For instance, in: @verbatim struct A { static int x; } pair A; int y=A.x; @end verbatim @noindent does the @code{A} in @code{A.x} refer to the structure or to the pair variable. It is the convention in Asymptote that, if there is a non-function variable with the same name as the qualifier, the qualifier refers to that variable, and not to the type. This is regardless of what fields the variable actually possesses. @node Autounravel @section Autounravel @cindex @code{autounravel} The @code{autounravel} modifier can be used to automatically unravel a field. This is useful when building an associated library of functions that operate on a structure. For instance, consider a simple implementation of the @code{rational} structure defined in @code{rational.asy}: @verbatim struct rational { int p=0, q=1; void operator init(int p, int q) { this.p=p; this.q=q; } } rational operator +(rational a, rational b) { return rational(a.p*b.q+b.p*a.q, a.q*b.q); } @end verbatim To allow @code{rational} to be used as a type parameter for a templated import that adds instances of @code{rational}, we should move @code{operator +} into the body of the @code{rational} structure and add the @code{autounravel} modifier: @verbatim struct rational { int p=0, q=1; void operator init(int p, int q) { this.p=p; this.q=q; } autounravel rational operator +(rational a, rational b) { return rational(a.p*b.q+b.p*a.q, a.q*b.q); } } @end verbatim This is almost equivalent to the previous code, but now the @code{+} operator will be accessible wherever the @code{rational} structure is. @strong{Currently, types cannot be autounraveled.} Users who encounter a case where this might be useful can submit a feature request at @uref{https://github.com/vectorgraphics/asymptote/issues}. @node When fields are autounraveled @subsection When fields are autounraveled If a @code{struct} contains fields (including functions) that are declared with @code{autounravel}, these fields will be unraveled from the @code{struct} at: @itemize @item the end of the @code{struct} definition; @item a @code{typedef import} statement, if the @code{struct} is the argument for one of the type parameters; @item an @code{unravel} or @code{access} statement that unravels the @code{struct} from a module or outer @code{struct} (for instance, @code{from rational access rational;} would make the @code{+} operator available from the @code{struct} @code{rational} defined in @code{rational.asy}); @item A @code{typedef} statement like @code{typedef rational.rational rat;} that renames a @code{struct}. @end itemize @node Where autounravel is legal @subsection Where @code{autounravel} is legal The @code{autounravel} modifier implies @code{static} and can be used in many of the same places as @code{static}. However, specifying @code{autounravel} at the top level of a module (i.e., outside of any structure or function) is an error, whereas @code{static} gives only a warning. @footnote{If top-level @code{autounravel} were allowed, a user might incorrectly assume that the field would be unraveled whenever the module is @code{access}ed. The @code{static} modifier is allowed at the top level because, while it does nothing, it does not mislead the user.} In front of a @code{struct} definition or @code{typedef} statement, @code{autounravel} is forbidden because types cannot be autounraveled. While @code{static static} results in an error, @code{static autounravel} and @code{autounravel static} are both legal and have exactly the same effect as @code{autounravel} alone. @node LaTeX usage @chapter @code{LaTeX} usage @cindex @code{LaTeX} usage @cindex @code{asymptote.sty} @code{Asymptote} comes with a convenient @code{LaTeX} style file @code{asymptote.sty} (v1.36 or later required) that makes @code{LaTeX} @code{Asymptote}-aware. Entering @code{Asymptote} code directly into the @code{LaTeX} source file, at the point where it is needed, keeps figures organized and avoids the need to invent new file names for each figure. Simply add the line @code{\usepackage@{asymptote@}} at the beginning of your file and enclose your @code{Asymptote} code within a @code{\begin@{asy@}...\end@{asy@}} environment. As with the @code{LaTeX} @code{comment} environment, the @code{\end@{asy@}} command must appear on a line by itself, with no trailing commands/comments. A blank line is not allowed after @code{\begin@{asy@}}. The sample @code{LaTeX} file below, named @code{latexusage.tex}, can be run as follows: @verbatim latex latexusage asy latexusage-*.asy latex latexusage @end verbatim @noindent or @verbatim pdflatex latexusage asy latexusage-*.asy pdflatex latexusage @end verbatim @noindent To switch between using inline Asymptote code with @code{latex} and @code{pdflatex} you may first need to remove the files @code{latexusage-*.tex}. @cindex @code{latexmk} @cindex @code{perl} An even better method for processing a @code{LaTeX} file with embedded @code{Asymptote} code is to use the @code{latexmk} utility from @quotation @url{http://mirror.ctan.org/support/latexmk/} @end quotation @noindent after putting the contents of @url{https://raw.githubusercontent.com/vectorgraphics/asymptote/HEAD/doc/latexmkrc} in a file @code{latexmkrc} in the same directory. The command @verbatim latexmk -pdf latexusage @end verbatim @noindent will then call @code{Asymptote} automatically, recompiling only the figures that have changed. Since each figure is compiled in a separate system process, this method also tends to use less memory. To store the figures in a separate directory named @code{asy}, one can define @verbatim \def\asydir{asy} @end verbatim in @code{latexusage.tex}. External @code{Asymptote} code can be included with @cindex @code{asyinclude} @verbatim \asyinclude[]{} @end verbatim @noindent so that @code{latexmk} will recognize when the code is changed. Note that @code{latexmk} requires @code{perl}, available from @url{https://www.perl.org/}. @cindex @code{width} @cindex @code{height} @cindex @code{keepAspect} @cindex @code{viewportwidth} @cindex @code{viewportheight} @cindex @code{attach} @cindex @code{inline} One can specify @code{width}, @code{height}, @code{keepAspect}, @code{viewportwidth}, @code{viewportheight}, @code{attach}, and @code{inline}. @code{keyval}-style options to the @code{asy} and @code{asyinclude} environments. Three-dimensional @acronym{PRC} files may either be embedded within the page (the default) or attached as annotated (but printable) attachments, using the @code{attach} option and the @code{attachfile2} (or older @code{attachfile}) @code{LaTeX} package. The @code{inline} option generates inline @code{LaTeX} code instead of @acronym{EPS} or @acronym{PDF} files. This makes 2D LaTeX symbols visible to the @code{\begin@{asy@}...\end@{asy@}} environment. In this mode, Asymptote correctly aligns 2D LaTeX symbols defined outside of @code{\begin@{asy@}...\end@{asy@}}, but treats their size as zero; an optional second string can be given to @code{Label} to provide an estimate of the unknown label size. Note that if the @code{latex} @TeX{} engine is used with the @code{inline} option, labels might not show up in @acronym{DVI} viewers that cannot handle raw @code{PostScript} code. One can use @code{dvips}/@code{dvipdf} to produce @code{PostScript}/@acronym{PDF} output (we recommend using the modified version of @code{dvipdf} in the @code{Asymptote} patches directory, which accepts the @code{dvips -z} hyperdvi option). Here now is @code{latexusage.tex}: @verbatiminclude latexusage.tex @page @image{./latexusage,,25cm} @node Base modules @chapter Base modules @cindex base modules @code{Asymptote} currently ships with the following base modules: @menu * plain:: Default @code{Asymptote} base file * simplex:: Linear programming: simplex method * simplex2:: Two-variable simplex method * math:: Extend @code{Asymptote}'s math capabilities * interpolate:: Interpolation routines * geometry:: Geometry routines * trembling:: Wavy lines * stats:: Statistics routines and histograms * patterns:: Custom fill and draw patterns * markers:: Custom path marker routines * map:: Map keys to values * tree:: Dynamic binary search tree * binarytree:: Binary tree drawing module * drawtree:: Tree drawing module * syzygy:: Syzygy and braid drawing module * feynman:: Feynman diagrams * roundedpath:: Round the sharp corners of paths * animation:: Embedded @acronym{PDF} and @acronym{MPEG} movies * embed:: Embedding movies, sounds, and 3D objects * slide:: Making presentations with @code{Asymptote} * MetaPost:: @code{MetaPost} compatibility routines * babel:: Interface to @code{LaTeX} @code{babel} package * labelpath:: Drawing curved labels * labelpath3:: Drawing curved labels in 3D * annotate:: Annotate your @acronym{PDF} files * CAD:: 2D CAD pen and measurement functions (DIN 15) * graph:: 2D linear & logarithmic graphs * palette:: Color density images and palettes * three:: 3D vector graphics * obj:: 3D obj files * graph3:: 3D linear & logarithmic graphs * grid3:: 3D grids * solids:: 3D solid geometry * tube:: 3D rotation minimizing tubes * flowchart:: Flowchart drawing routines * contour:: Contour lines * contour3:: Contour surfaces * smoothcontour3:: Smooth implicit surfaces * slopefield:: Slope fields * ode:: Ordinary differential equations @end menu @node plain @section @code{plain} @cindex @code{plain} This is the default @code{Asymptote} base file drawing language (such as the @code{picture} structure). By default, an implicit @code{private import plain;} occurs before translating a file and before the first command given in interactive mode. This also applies when translating files for module definitions (except when translating @code{plain}, of course). This means that the types and functions defined in @code{plain} are accessible in almost all @code{Asymptote} code. Use the @code{-noautoplain} command-line option to disable this feature. @node simplex @section @code{simplex} @cindex @code{simplex} This module solves the general linear programming problem using the simplex method. @node simplex2 @section @code{simplex2} @cindex @code{simplex2} @cindex @code{deferred drawing} This module solves a special case of the two-variable linear programming problem used by the module @code{plain} for automatic sizing of pictures (@pxref{deferred drawing}). @node math @section @code{math} @cindex @code{math} This module extends @code{Asymptote}'s mathematical capabilities with useful functions such as @table @code @cindex @code{drawline} @item void drawline(picture pic=currentpicture draw the visible portion of the (infinite) line going through @code{P} and @code{Q}, without altering the size of picture @code{pic}, using pen @code{p}. @cindex @code{intersect} @item real intersect(triple P, triple Q, triple n, triple Z); returns the intersection time of the extension of the line segment @code{PQ} with the plane perpendicular to @code{n} and passing through @code{Z}. @cindex @code{intersectionpoint} @item triple intersectionpoint(triple n0, triple P0, triple n1, triple P1); Return any point on the intersection of the two planes with normals @code{n0} and @code{n1} passing through points @code{P0} and @code{P1}, respectively. If the planes are parallel, return @code{(infinity,infinity,infinity)}. @cindex @code{quarticroots} @item pair[] quarticroots(real a, real b, real c, real d, real e); returns the four complex roots of the quartic equation @math{ax^4+bx^3+cx^2+dx+e=0}. @cindex @code{time} @item real time(path g, real x, int n=0, real fuzz=-1) returns the @code{n}th intersection time of path @code{g} with the vertical line through x. @cindex @code{time} @item real time(path g, explicit pair z, int n=0, real fuzz=-1) returns the @code{n}th intersection time of path @code{g} with the horizontal line through @code{(0,z.y)}. @cindex @code{value} @item real value(path g, real x, int n=0, real fuzz=-1) returns the @code{n}th @code{y} value of @code{g} at @code{x}. @cindex @code{value} @item real value(path g, explicit pair z, int n=0, real fuzz=-1) returns the @code{n}th @code{x} value of @code{g} at @code{y=z.y}. @cindex @code{slope} @item real slope(path g, real x, int n=0, real fuzz=-1) returns the @code{n}th slope of @code{g} at @code{x}. @cindex @code{slope} @item real slope(path g, explicit pair z, int n=0, real fuzz=-1) returns the @code{n}th slope of @code{g} at @code{y=z.y}. @cindex @code{segment} int[][] segment(bool[] b) returns the indices of consecutive true-element segments of bool[] @code{b}. @cindex @code{partialsum} @item real[] partialsum(real[] a) returns the partial sums of a real array @code{a}. @cindex @code{partialsum} @item real[] partialsum(real[] a, real[] dx) returns the partial @code{dx}-weighted sums of a real array @code{a}. @cindex @code{increasing} @item bool increasing(real[] a, bool strict=false) returns, if @code{strict=false}, whether @code{i > j} implies @code{a[i] >= a[j]}, or if @code{strict=true}, whether @code{i > j} implies implies @code{a[i] > a[j]}. @cindex @code{unique} @item int unique(real[] a, real x) if the sorted array @code{a} does not contain @code{x}, insert it sequentially, returning the index of @code{x} in the resulting array. @cindex @code{lexorder} @item bool lexorder(pair a, pair b) returns the strict lexicographical partial order of @code{a} and @code{b}. @cindex @code{lexorder} @item bool lexorder(triple a, triple b) returns the strict lexicographical partial order of @code{a} and @code{b}. @end table @node interpolate @section @code{interpolate} @cindex @code{interpolate} This module implements Lagrange, Hermite, and standard cubic spline interpolation in @code{Asymptote}, as illustrated in the example @code{interpolate1.asy}. @node geometry @section @code{geometry} @cindex @code{geometry} @cindex @code{triangle} @cindex @code{perpendicular} This module, written by Philippe Ivaldi, provides an extensive set of geometry routines, including @code{perpendicular} symbols and a @code{triangle} structure. Link to the documentation for the @code{geometry} module are posted here: @url{https://asymptote.sourceforge.io/links.html}, including an extensive set of examples, @url{https://web.archive.org/web/20201130113133/http://www.piprime.fr/files/asymptote/geometry/}, and an index: @quotation @url{https://web.archive.org/web/20201130113133/http://www.piprime.fr/files/asymptote/geometry/modules/geometry.asy.index.type.html} @end quotation @node trembling @section @code{trembling} @cindex @code{trembling} This module, written by Philippe Ivaldi and illustrated in the example @code{@uref{https://asymptote.sourceforge.io/gallery/floatingdisk.svg,,floatingdisk}@uref{https://asymptote.sourceforge.io/gallery/floatingdisk.asy,,.asy}}, allows one to draw wavy lines, as if drawn by hand. @node stats @section @code{stats} @cindex @code{stats} @cindex @code{leastsquares} This module implements a Gaussian random number generator and a collection of statistics routines, including @code{histogram} and @code{leastsquares}. @node patterns @section @code{patterns} @cindex @code{patterns} This module implements @code{PostScript} tiling patterns and includes several convenient pattern generation routines. @node markers @section @code{markers} @cindex @code{markers} This module implements specialized routines for marking paths and angles. The principal mark routine provided by this module is @verbatim markroutine markinterval(int n=1, frame f, bool rotated=false); @end verbatim @noindent which centers @code{n} copies of frame @code{f} within uniformly space intervals in arclength along the path, optionally rotated by the angle of the local tangent. The @code{marker} (@pxref{marker}) routine can be used to construct new markers from these predefined frames: @cindex @code{stickframe} @verbatim frame stickframe(int n=1, real size=0, pair space=0, real angle=0, pair offset=0, pen p=currentpen); @end verbatim @cindex @code{circlebarframe} @verbatim frame circlebarframe(int n=1, real barsize=0, real radius=0,real angle=0, pair offset=0, pen p=currentpen, filltype filltype=NoFill, bool above=false); @end verbatim @cindex @code{crossframe} @verbatim frame crossframe(int n=3, real size=0, pair space=0, real angle=0, pair offset=0, pen p=currentpen); @end verbatim @cindex @code{tildeframe} @verbatim frame tildeframe(int n=1, real size=0, pair space=0, real angle=0, pair offset=0, pen p=currentpen); @end verbatim For convenience, this module also constructs the markers @code{StickIntervalMarker}, @code{CrossIntervalMarker}, @code{CircleBarIntervalMarker}, and @code{TildeIntervalMarker} from the above frames. The example @code{@uref{https://asymptote.sourceforge.io/gallery/markers1.svg,,markers1}@uref{https://asymptote.sourceforge.io/gallery/markers1.asy,,.asy}} illustrates the use of these markers: @sp 1 @center @image{./markers1} This module also provides a routine for marking an angle @math{AOB}: @cindex @code{markangle} @verbatim void markangle(picture pic=currentpicture, Label L="", int n=1, real radius=0, real space=0, pair A, pair O, pair B, arrowbar arrow=None, pen p=currentpen, margin margin=NoMargin, marker marker=nomarker); @end verbatim @noindent as illustrated in the example @code{@uref{https://asymptote.sourceforge.io/gallery/markers2.svg,,markers2}@uref{https://asymptote.sourceforge.io/gallery/markers2.asy,,.asy}}. @sp 1 @center @image{./markers2} @node map @section @code{map} @cindex @code{map} This module creates a struct parameterized by the types specified in strings @code{key} and @code{value}, mapping keys to values with a specified default: @verbatim from map(Key=string, Value=int) access map; map M=map(Default=-1); M.add("z",2); M.add("a",3); M.add("d",4); write(M.lookup("a")); write(M.lookup("y")); @end verbatim @node tree @section @code{tree} @cindex @code{tree} This module implements an example of a dynamic binary search tree. @node binarytree @section @code{binarytree} @cindex @code{binarytree} This module can be used to draw an arbitrary binary tree and includes an input routine for the special case of a binary search tree, as illustrated in the example @code{@uref{https://asymptote.sourceforge.io/gallery/binarytreetest.svg,,binarytreetest}@uref{https://asymptote.sourceforge.io/gallery/binarytreetest.asy,,.asy}}: @verbatiminclude binarytreetest.asy @sp 1 @center @image{./binarytreetest} @node drawtree @section @code{drawtree} @cindex @code{drawtree} This is a simple tree drawing module used by the example @code{@uref{https://asymptote.sourceforge.io/gallery/treetest.svg,,treetest}@uref{https://asymptote.sourceforge.io/gallery/treetest.asy,,.asy}}. @node syzygy @section @code{syzygy} @cindex @code{syzygy} This module automates the drawing of braids, relations, and syzygies, along with the corresponding equations, as illustrated in the example @code{@uref{https://asymptote.sourceforge.io/gallery/knots.svg,,knots}@uref{https://asymptote.sourceforge.io/gallery/knots.asy,,.asy}}. @node feynman @section @code{feynman} @cindex @code{feynman} This module, contributed by Martin Wiebusch, is useful for drawing Feynman diagrams, as illustrated by the examples @code{@uref{https://asymptote.sourceforge.io/gallery/eetomumu.svg,,eetomumu}@uref{https://asymptote.sourceforge.io/gallery/eetomumu.asy,,.asy}} and @code{@uref{https://asymptote.sourceforge.io/gallery/fermi.svg,,fermi}@uref{https://asymptote.sourceforge.io/gallery/fermi.asy,,.asy}}. @node roundedpath @section @code{roundedpath} @cindex @code{roundedpath} This module, contributed by Stefan Knorr, is useful for rounding the sharp corners of paths, as illustrated in the example file @code{@uref{https://asymptote.sourceforge.io/gallery/roundpath.svg,,roundpath}@uref{https://asymptote.sourceforge.io/gallery/roundpath.asy,,.asy}}. @node animation @section @code{animation} @cindex @code{animation} @cindex @code{magick} @cindex animation @cindex @code{ImageMagick} This module allows one to generate animations, as illustrated by the files @code{@uref{https://asymptote.sourceforge.io/gallery/animations/wheel.gif,,wheel}@uref{https://asymptote.sourceforge.io/gallery/animations/wheel.asy,,.asy}}, @code{@uref{https://asymptote.sourceforge.io/gallery/animations/wavepacket.gif,,wavepacket}@uref{https://asymptote.sourceforge.io/gallery/animations/wavepacket.asy,,.asy}}, and @code{@uref{https://asymptote.sourceforge.io/gallery/animations/cube.gif,,cube}@uref{https://asymptote.sourceforge.io/gallery/animations/cube.asy,,.asy}} in the @code{animations} subdirectory of the examples directory. These animations use the @code{ImageMagick} @code{magick} program to merge multiple images into a @acronym{GIF} or @acronym{MPEG} movie. @cindex @code{animate} @anchor{animate} The related @code{animate} module, derived from the @code{animation} module, generates higher-quality portable clickable @acronym{PDF} movies, with optional controls. This requires installing the module @quotation @url{http://mirror.ctan.org/macros/latex/contrib/animate/animate.sty} @end quotation @noindent (version 2007/11/30 or later) in a new directory @code{animate} in the local @code{LaTeX} directory (for example, in @code{/usr/local/share/texmf/tex/latex/animate}). On @code{UNIX} systems, one must then execute the command @code{texhash}. The example @code{@uref{https://asymptote.sourceforge.io/gallery/animations/pdfmovie.pdf,,pdfmovie}@uref{https://asymptote.sourceforge.io/gallery/animations/pdfmovie.asy,,.asy}} in the @code{animations} directory, along with the slide presentations @code{@uref{https://asymptote.sourceforge.io/gallery/animations/slidemovies.pdf,,slidemovies}@uref{https://asymptote.sourceforge.io/gallery/animations/slidemovies.asy,,.asy}} and @code{@uref{https://asymptote.sourceforge.io/intro.pdf,,intro}}, illustrate the use of embedded @acronym{PDF} movies. The examples @code{inlinemovie.tex} and @code{inlinemovie3.tex} show how to generate and embed @acronym{PDF} movies directly within a @code{LaTeX} file (@pxref{LaTeX usage}). The member function @verbatim string pdf(fit fit=NoBox, real delay=animationdelay, string options="", bool keep=settings.keep, bool multipage=true); @end verbatim @noindent of the @code{animate} structure accepts any of the @code{animate.sty} options, as described here: @quotation @url{http://mirror.ctan.org/macros/latex/contrib/animate/doc/animate.pdf} @end quotation @node embed @section @code{embed} @cindex @code{embed} This module provides an interface to the @code{LaTeX} package (included with @code{MikTeX}) @quotation @url{http://mirror.ctan.org/macros/latex/contrib/media9} @end quotation @noindent for embedding movies, sounds, and 3D objects into a @acronym{PDF} document. @cindex @code{external} A more portable method for embedding movie files, which should work on any platform and does not require the @code{media9} package, is provided by using the @code{external} module instead of @code{embed}. Examples of the above two interfaces is provided in the file @code{embeddedmovie.asy} in the @code{animations} subdirectory of the examples directory and in @code{@uref{https://asymptote.sourceforge.io/gallery/animations/externalmovie.pdf,,externalmovie}@uref{https://asymptote.sourceforge.io/gallery/animations/externalmovie.asy,,.asy}}. For a higher quality embedded movie generated directly by @code{Asymptote}, use the @code{animate} module along with the @code{animate.sty} package to embed a portable @acronym{PDF} animation (@pxref{animate}). @cindex @code{U3D} An example of embedding @code{U3D} code is provided in the file @code{embeddedu3d}. @node slide @section @code{slide} @cindex @code{slide} This module provides a simple yet high-quality facility for making presentation slides, including portable embedded @acronym{PDF} animations (see the file @code{@uref{https://asymptote.sourceforge.io/gallery/animations/slidemovies.pdf,,slidemovies}@uref{https://asymptote.sourceforge.io/gallery/animations/slidemovies.asy,,.asy}}). A simple example is provided in @code{slidedemo.asy}. @node MetaPost @section @code{MetaPost} @cindex @code{MetaPost} This module provides some useful routines to help @code{MetaPost} users migrate old @code{MetaPost} code to @code{Asymptote}. Further contributions here are welcome. @cindex @code{implicit linear solver} @cindex @code{MetaPost whatever} @cindex @code{extension} Unlike @code{MetaPost}, @code{Asymptote} does not implicitly solve linear equations and therefore does not have the notion of a @code{whatever} unknown. The routine @code{extension} (@pxref{extension}) provides a useful replacement for a common use of @code{whatever}: finding the intersection point of the lines through @code{P}, @code{Q} and @code{p}, @code{q}. For less common occurrences of @code{whatever}, one can use the built-in explicit linear equation solver @code{solve} instead. @node babel @section @code{babel} @cindex @code{babel} This module implements the @code{LaTeX} @code{babel} package in @code{Asymptote}. For example: @verbatim import babel; babel("german"); @end verbatim @node labelpath @section @code{labelpath} @cindex @code{labelpath} This module uses the @code{PSTricks} @code{pstextpath} macro to fit labels along a path (properly kerned, as illustrated in the example file @code{@uref{https://asymptote.sourceforge.io/gallery/curvedlabel.svg,,curvedlabel}@uref{https://asymptote.sourceforge.io/gallery/curvedlabel.asy,,.asy}}), using the command @verbatim void labelpath(picture pic=currentpicture, Label L, path g, string justify=Centered, pen p=currentpen); @end verbatim @noindent Here @code{justify} is one of @code{LeftJustified}, @code{Centered}, or @code{RightJustified}. The @math{x} component of a shift transform applied to the Label is interpreted as a shift along the curve, whereas the @math{y} component is interpreted as a shift away from the curve. All other Label transforms are ignored. This module requires the @code{latex} tex engine and inherits the limitations of the @code{PSTricks} @code{\pstextpath} macro. @node labelpath3 @section @code{labelpath3} @cindex @code{labelpath3} This module, contributed by Jens Schwaiger, implements a 3D version of @code{labelpath} that does not require the @code{PSTricks} package. An example is provided in @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/curvedlabel3.html,,curvedlabel3}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/curvedlabel3.asy,,.asy}}. @node annotate @section @code{annotate} @cindex @code{annotate} This module supports @acronym{PDF} annotations for viewing with @code{Adobe Reader}, via the function @verbatim void annotate(picture pic=currentpicture, string title, string text, pair position); @end verbatim @noindent Annotations are illustrated in the example file @code{@uref{https://asymptote.sourceforge.io/gallery/PDFs/annotation.pdf,,annotation}@uref{https://asymptote.sourceforge.io/gallery/PDFs/annotation.asy,,.asy}}. Currently, annotations are only implemented for the @code{latex} (default) and @code{tex} @TeX{} engines. @node CAD @section @code{CAD} @cindex @code{CAD} This module, contributed by Mark Henning, provides basic pen definitions and measurement functions for simple 2D CAD drawings according to DIN 15. It is documented separately, in the file @code{CAD.pdf}. @node graph @section @code{graph} @cindex @code{graph} @cindex 2D graphs This module implements two-dimensional linear and logarithmic graphs, including automatic scale and tick selection (with the ability to override manually). A graph is a @code{guide} (that can be drawn with the draw command, with an optional legend) constructed with one of the following routines: @itemize @item @verbatim guide graph(picture pic=currentpicture, real f(real), real a, real b, int n=ngraph, real T(real)=identity, interpolate join=operator --); guide[] graph(picture pic=currentpicture, real f(real), real a, real b, int n=ngraph, real T(real)=identity, bool3 cond(real), interpolate join=operator --); @end verbatim Returns a graph using the scaling information for picture @code{pic} (@pxref{automatic scaling}) of the function @code{f} on the interval [@code{T}(@code{a}),@code{T}(@code{b})], sampling at @code{n} points evenly spaced in [@code{a},@code{b}], optionally restricted by the bool3 function @code{cond} on [@code{a},@code{b}]. If @code{cond} is: @itemize @bullet @item @code{true}, the point is added to the existing guide; @item @code{default}, the point is added to a new guide; @item @code{false}, the point is omitted and a new guide is begun. @end itemize The points are connected using the interpolation specified by @code{join}: @itemize @bullet @cindex @code{operator --} @cindex @code{Straight} @item @code{operator --} (linear interpolation; the abbreviation @code{Straight} is also accepted); @cindex @code{operator ..} @cindex @code{Spline} @item @code{operator ..} (piecewise Bezier cubic spline interpolation; the abbreviation @code{Spline} is also accepted); @cindex @code{linear} @cindex @code{Hermite} @cindex @code{notaknot} @cindex @code{natural} @cindex @code{periodic} @cindex @code{clamped} @cindex @code{monotonic} @cindex @code{Hermite(splinetype splinetype} @item @code{linear} (linear interpolation), @item @code{Hermite} (standard cubic spline interpolation using boundary condition @code{notaknot}, @code{natural}, @code{periodic}, @code{clamped(real slopea, real slopeb)}), or @code{monotonic}. The abbreviation @code{Hermite} is equivalent to @code{Hermite(notaknot)} for nonperiodic data and @code{Hermite(periodic)} for periodic data). @end itemize @item @verbatim guide graph(picture pic=currentpicture, real x(real), real y(real), real a, real b, int n=ngraph, real T(real)=identity, interpolate join=operator --); guide[] graph(picture pic=currentpicture, real x(real), real y(real), real a, real b, int n=ngraph, real T(real)=identity, bool3 cond(real), interpolate join=operator --); @end verbatim Returns a graph using the scaling information for picture @code{pic} of the parametrized function (@code{x}(@math{t}),@code{y}(@math{t})) for @math{t} in the interval [@code{T}(@code{a}),@code{T}(@code{b})], sampling at @code{n} points evenly spaced in [@code{a},@code{b}], optionally restricted by the bool3 function @code{cond} on [@code{a},@code{b}], using the given interpolation type. @item @verbatim guide graph(picture pic=currentpicture, pair z(real), real a, real b, int n=ngraph, real T(real)=identity, interpolate join=operator --); guide[] graph(picture pic=currentpicture, pair z(real), real a, real b, int n=ngraph, real T(real)=identity, bool3 cond(real), interpolate join=operator --); @end verbatim Returns a graph using the scaling information for picture @code{pic} of the parametrized function @code{z}(@math{t}) for @math{t} in the interval [@code{T}(@code{a}),@code{T}(@code{b})], sampling at @code{n} points evenly spaced in [@code{a},@code{b}], optionally restricted by the bool3 function @code{cond} on [@code{a},@code{b}], using the given interpolation type. @item @verbatim guide graph(picture pic=currentpicture, pair[] z, interpolate join=operator --); guide[] graph(picture pic=currentpicture, pair[] z, bool3[] cond, interpolate join=operator --); @end verbatim Returns a graph using the scaling information for picture @code{pic} of the elements of the array @code{z}, optionally restricted to those indices for which the elements of the boolean array @code{cond} are @code{true}, using the given interpolation type. @item @verbatim guide graph(picture pic=currentpicture, real[] x, real[] y, interpolate join=operator --); guide[] graph(picture pic=currentpicture, real[] x, real[] y, bool3[] cond, interpolate join=operator --); @end verbatim Returns a graph using the scaling information for picture @code{pic} of the elements of the arrays (@code{x},@code{y}), optionally restricted to those indices for which the elements of the boolean array @code{cond} are @code{true}, using the given interpolation type. @item @cindex @code{polargraph} @verbatim guide polargraph(picture pic=currentpicture, real f(real), real a, real b, int n=ngraph, interpolate join=operator --); @end verbatim Returns a polar-coordinate graph using the scaling information for picture @code{pic} of the function @code{f} on the interval [@code{a},@code{b}], sampling at @code{n} evenly spaced points, with the given interpolation type. @item @verbatim guide polargraph(picture pic=currentpicture, real[] r, real[] theta, interpolate join=operator--); @end verbatim Returns a polar-coordinate graph using the scaling information for picture @code{pic} of the elements of the arrays (@code{r},@code{theta}), using the given interpolation type. @end itemize @verbatim @end verbatim An axis can be drawn on a picture with one of the following commands: @itemize @item @verbatim void xaxis(picture pic=currentpicture, Label L="", axis axis=YZero, real xmin=-infinity, real xmax=infinity, pen p=currentpen, ticks ticks=NoTicks, arrowbar arrow=None, bool above=false); @end verbatim Draw an @math{x} axis on picture @code{pic} from @math{x}=@code{xmin} to @math{x}=@code{xmax} using pen @code{p}, optionally labelling it with Label @code{L}. The relative label location along the axis (a real number from [0,1]) defaults to 1 (@pxref{Label}), so that the label is drawn at the end of the axis. An infinite value of @code{xmin} or @code{xmax} specifies that the corresponding axis limit will be automatically determined from the picture limits. The optional @code{arrow} argument takes the same values as in the @code{draw} command (@pxref{arrows}). The axis is drawn before any existing objects in @code{pic} unless @code{above=true}. The axis placement is determined by one of the following @code{axis} types: @table @code @cindex @code{YZero} @item YZero(bool extend=true) Request an @math{x} axis at @math{y}=0 (or @math{y}=1 on a logarithmic axis) extending to the full dimensions of the picture, unless @code{extend}=false. @cindex @code{YEquals} @item YEquals(real Y, bool extend=true) Request an @math{x} axis at @math{y}=@code{Y} extending to the full dimensions of the picture, unless @code{extend}=false. @cindex @code{Bottom} @item Bottom(bool extend=false) Request a bottom axis. @cindex @code{Top} @item Top(bool extend=false) Request a top axis. @cindex @code{BottomTop} @item BottomTop(bool extend=false) Request a bottom and top axis. @end table @cindex custom axis types Custom axis types can be created by following the examples in the module @code{graph.asy}. One can easily override the default values for the standard axis types: @verbatim import graph; YZero=new axis(bool extend=true) { return new void(picture pic, axisT axis) { real y=pic.scale.x.scale.logarithmic ? 1 : 0; axis.value=I*pic.scale.y.T(y); axis.position=1; axis.side=right; axis.align=2.5E; axis.value2=Infinity; axis.extend=extend; }; }; YZero=YZero(); @end verbatim @anchor{ticks} @cindex @code{ticks} @cindex @code{NoTicks} @cindex @code{LeftTicks} @cindex @code{RightTicks} @cindex @code{Ticks} The default tick option is @code{NoTicks}. The options @code{LeftTicks}, @code{RightTicks}, or @code{Ticks} can be used to draw ticks on the left, right, or both sides of the path, relative to the direction in which the path is drawn. These tick routines accept a number of optional arguments: @verbatim ticks LeftTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, tickmodifier modify=None, real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen); @end verbatim If any of these parameters are omitted, reasonable defaults will be chosen: @table @code @item Label format @cindex @code{defaultformat} @cindex @code{trailingzero} override the default tick label format (@code{defaultformat}, initially "$%.4g$"), rotation, pen, and alignment (for example, @code{LeftSide}, @code{Center}, or @code{RightSide}) relative to the axis. To enable @code{LaTeX} math mode fonts, the format string should begin and end with @code{$} @pxref{format}. If the format string is @code{trailingzero}, trailing zeros will be added to the tick labels; if the format string is @code{"%"}, the tick label will be suppressed; @item ticklabel is a function @code{string(real x)} returning the label (by default, format(format.s,x)) for each major tick value @code{x}; @item bool beginlabel include the first label; @item bool endlabel include the last label; @item int N when automatic scaling is enabled (the default; @pxref{automatic scaling}), divide a linear axis evenly into this many intervals, separated by major ticks; for a logarithmic axis, this is the number of decades between labelled ticks; @item int n divide each interval into this many subintervals, separated by minor ticks; @item real Step the tick value spacing between major ticks (if @code{N}=@code{0}); @item real step the tick value spacing between minor ticks (if @code{n}=@code{0}); @item bool begin include the first major tick; @item bool end include the last major tick; @item tickmodifier modify; an optional function that takes and returns a @code{tickvalue} structure having real[] members @code{major} and @code{minor} consisting of the tick values (to allow modification of the automatically generated tick values); @item real Size the size of the major ticks (in @code{PostScript} coordinates); @item real size the size of the minor ticks (in @code{PostScript} coordinates); @item bool extend; extend the ticks between two axes (useful for drawing a grid on the graph); @item pen pTick an optional pen used to draw the major ticks; @item pen ptick an optional pen used to draw the minor ticks. @end table @cindex @code{OmitTick} @cindex @code{OmitTickInterval} @cindex @code{OmitTickIntervals} For convenience, the predefined tickmodifiers @code{OmitTick(... real[] x)}, @code{OmitTickInterval(real a, real b)}, and @code{OmitTickIntervals(real[] a, real[] b)} can be used to remove specific auto-generated ticks and their labels. The @code{OmitFormat(string s=defaultformat ... real[] x)} ticklabel can be used to remove specific tick labels but not the corresponding ticks. The tickmodifier @code{NoZero} is an abbreviation for @code{OmitTick(0)} and the ticklabel @code{NoZeroFormat} is an abbrevation for @code{OmitFormat(0)}. @cindex custom tick locations @cindex @code{LeftTicks} @cindex @code{RightTicks} @cindex @code{Ticks} It is also possible to specify custom tick locations with @code{LeftTicks}, @code{RightTicks}, and @code{Ticks} by passing explicit real arrays @code{Ticks} and (optionally) @code{ticks} containing the locations of the major and minor ticks, respectively: @verbatim ticks LeftTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, real[] Ticks, real[] ticks=new real[], real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) @end verbatim @item @verbatim void yaxis(picture pic=currentpicture, Label L="", axis axis=XZero, real ymin=-infinity, real ymax=infinity, pen p=currentpen, ticks ticks=NoTicks, arrowbar arrow=None, bool above=false, bool autorotate=true); @end verbatim Draw a @math{y} axis on picture @code{pic} from @math{y}=@code{ymin} to @math{y}=@code{ymax} using pen @code{p}, optionally labelling it with a Label @code{L} that is autorotated unless @code{autorotate=false}. The relative location of the label (a real number from [0,1]) defaults to 1 (@pxref{Label}). An infinite value of @code{ymin} or @code{ymax} specifies that the corresponding axis limit will be automatically determined from the picture limits. The optional @code{arrow} argument takes the same values as in the @code{draw} command (@pxref{arrows}). The axis is drawn before any existing objects in @code{pic} unless @code{above=true}. The tick type is specified by @code{ticks} and the axis placement is determined by one of the following @code{axis} types: @table @code @cindex @code{XZero} @item XZero(bool extend=true) Request a @math{y} axis at @math{x}=0 (or @math{x}=1 on a logarithmic axis) extending to the full dimensions of the picture, unless @code{extend}=false. @cindex @code{XEquals} @item XEquals(real X, bool extend=true) Request a @math{y} axis at @math{x}=@code{X} extending to the full dimensions of the picture, unless @code{extend}=false. @cindex @code{Left} @item Left(bool extend=false) Request a left axis. @cindex @code{Right} @item Right(bool extend=false) Request a right axis. @cindex @code{LeftRight} @item LeftRight(bool extend=false) Request a left and right axis. @end table @item @cindex @code{xequals} @cindex @code{yequals} For convenience, the functions @verbatim void xequals(picture pic=currentpicture, Label L="", real x, bool extend=false, real ymin=-infinity, real ymax=infinity, pen p=currentpen, ticks ticks=NoTicks, bool above=true, arrowbar arrow=None); @end verbatim and @verbatim void yequals(picture pic=currentpicture, Label L="", real y, bool extend=false, real xmin=-infinity, real xmax=infinity, pen p=currentpen, ticks ticks=NoTicks, bool above=true, arrowbar arrow=None); @end verbatim can be respectively used to call @code{yaxis} and @code{xaxis} with the appropriate axis types @code{XEquals(x,extend)} and @code{YEquals(y,extend)}. This is the recommended way of drawing vertical or horizontal lines and axes at arbitrary locations. @item @verbatim void axes(picture pic=currentpicture, Label xlabel="", Label ylabel="", bool extend=true, pair min=(-infinity,-infinity), pair max=(infinity,infinity), pen p=currentpen, arrowbar arrow=None, bool above=false); @end verbatim This convenience routine draws both @math{x} and @math{y} axes on picture @code{pic} from @code{min} to @code{max}, with optional labels @code{xlabel} and @code{ylabel} and any arrows specified by @code{arrow}. The axes are drawn on top of existing objects in @code{pic} only if @code{above=true}. @item @verbatim void axis(picture pic=currentpicture, Label L="", path g, pen p=currentpen, ticks ticks, ticklocate locate, arrowbar arrow=None, int[] divisor=new int[], bool above=false, bool opposite=false); @end verbatim This routine can be used to draw on picture @code{pic} a general axis based on an arbitrary path @code{g}, using pen @code{p}. One can optionally label the axis with Label @code{L} and add an arrow @code{arrow}. The tick type is given by @code{ticks}. The optional integer array @code{divisor} specifies what tick divisors to try in the attempt to produce uncrowded tick labels. A @code{true} value for the flag @code{opposite} identifies an unlabelled secondary axis (typically drawn opposite a primary axis). The axis is drawn before any existing objects in @code{pic} unless @code{above=true}. The tick locator @code{ticklocate} is constructed by the routine @verbatim ticklocate ticklocate(real a, real b, autoscaleT S=defaultS, real tickmin=-infinity, real tickmax=infinity, real time(real)=null, pair dir(real)=zero); @end verbatim @noindent where @code{a} and @code{b} specify the respective tick values at @code{point(g,0)} and @code{point(g,length(g))}, @code{S} specifies the autoscaling transformation, the function @code{real time(real v)} returns the time corresponding to the value @code{v}, and @code{pair dir(real t)} returns the absolute tick direction as a function of @code{t} (zero means draw the tick perpendicular to the axis). @item These routines are useful for manually putting ticks and labels on axes (if the variable @code{Label} is given as the @code{Label} argument, the @code{format} argument will be used to format a string based on the tick location): @cindex xtick @cindex ytick @cindex labelx @cindex labely @cindex tick @cindex Label @verbatim void xtick(picture pic=currentpicture, Label L="", explicit pair z, pair dir=N, string format="", real size=Ticksize, pen p=currentpen); void xtick(picture pic=currentpicture, Label L="", real x, pair dir=N, string format="", real size=Ticksize, pen p=currentpen); void ytick(picture pic=currentpicture, Label L="", explicit pair z, pair dir=E, string format="", real size=Ticksize, pen p=currentpen); void ytick(picture pic=currentpicture, Label L="", real y, pair dir=E, string format="", real size=Ticksize, pen p=currentpen); void tick(picture pic=currentpicture, pair z, pair dir, real size=Ticksize, pen p=currentpen); void labelx(picture pic=currentpicture, Label L="", explicit pair z, align align=S, string format="", pen p=currentpen); void labelx(picture pic=currentpicture, Label L="", real x, align align=S, string format="", pen p=currentpen); void labelx(picture pic=currentpicture, Label L, string format="", explicit pen p=currentpen); void labely(picture pic=currentpicture, Label L="", explicit pair z, align align=W, string format="", pen p=currentpen); void labely(picture pic=currentpicture, Label L="", real y, align align=W, string format="", pen p=currentpen); void labely(picture pic=currentpicture, Label L, string format="", explicit pen p=currentpen); @end verbatim @end itemize Here are some simple examples of two-dimensional graphs: @enumerate @cindex textbook graph @item This example draws a textbook-style graph of @math{y=} exp@math{(x)}, with the @math{y} axis starting at @math{y=0}: @verbatiminclude exp.asy @sp 1 @center @image{./exp} @item The next example draws a scientific-style graph with a legend. The position of the legend can be adjusted either explicitly or by using the graphical user interface (@pxref{GUI}). If an @code{UnFill(real xmargin=0, real ymargin=xmargin)} or @code{Fill(pen)} option is specified to @code{add}, the legend will obscure any underlying objects. Here we illustrate how to clip the portion of the picture covered by a label: @cindex scientific graph @verbatiminclude lineargraph0.asy @sp 1 @center @image{./lineargraph0} @cindex @code{attach} To specify a fixed size for the graph proper, use @code{attach}: @verbatiminclude lineargraph.asy @cindex @code{legend} A legend can have multiple entries per line: @verbatiminclude legend.asy @sp 1 @center @image{./legend} @item This example draws a graph of one array versus another (both of the same size) using custom tick locations and a smaller font size for the tick labels on the @math{y} axis. @verbatiminclude datagraph.asy @sp 1 @center @image{./datagraph} @item This example shows how to graph columns of data read from a file. @verbatiminclude filegraph.asy @sp 1 @center @image{./filegraph} @cindex @code{polygon} @cindex @code{cross} @cindex @code{errorbars} @cindex @code{marker} @cindex @code{marknodes} @cindex @code{markuniform} @cindex @code{mark} @cindex path markers @anchor{pathmarkers} @item The next example draws two graphs of an array of coordinate pairs, using frame alignment and data markers. In the left-hand graph, the markers, constructed with @verbatim marker marker(path g, markroutine markroutine=marknodes, pen p=currentpen, filltype filltype=NoFill, bool above=true); @end verbatim using the path @code{unitcircle} (@pxref{filltype}), are drawn below each node. Any frame can be converted to a marker, using @anchor{marker} @verbatim marker marker(frame f, markroutine markroutine=marknodes, bool above=true); @end verbatim In the right-hand graph, the unit @math{n}-sided regular polygon @code{polygon(int n)} and the unit @math{n}-point cyclic cross @code{cross(int n, bool round=true, real r=0)} (where @code{r} is an optional ``inner'' radius) are used to build a custom marker frame. @anchor{markuniform} Here @code{markuniform(bool centered=false, int n, bool rotated=false)} adds this frame at @code{n} uniformly spaced points along the arclength of the path, optionally rotated by the angle of the local tangent to the path (if centered is true, the frames will be centered within @code{n} evenly spaced arclength intervals). Alternatively, one can use markroutine @code{marknodes} to request that the marks be placed at each Bezier node of the path, or markroutine @code{markuniform(pair z(real t), real a, real b, int n)} to place marks at points @code{z(t)} for n evenly spaced values of @code{t} in @code{[a,b]}. These markers are predefined: @verbatim marker[] Mark={ marker(scale(circlescale)*unitcircle), marker(polygon(3)),marker(polygon(4)), marker(polygon(5)),marker(invert*polygon(3)), marker(cross(4)),marker(cross(6)),marker(diamond),marker(plus); }; marker[] MarkFill={ marker(scale(circlescale)*unitcircle,Fill),marker(polygon(3),Fill), marker(polygon(4),Fill),marker(polygon(5),Fill), marker(invert*polygon(3),Fill),marker(diamond,Fill) }; @end verbatim The example also illustrates the @code{errorbar} routines: @verbatim void errorbars(picture pic=currentpicture, pair[] z, pair[] dp, pair[] dm={}, bool[] cond={}, pen p=currentpen, real size=0); void errorbars(picture pic=currentpicture, real[] x, real[] y, real[] dpx, real[] dpy, real[] dmx={}, real[] dmy={}, bool[] cond={}, pen p=currentpen, real size=0); @end verbatim @noindent Here, the positive and negative extents of the error are given by the absolute values of the elements of the pair array @code{dp} and the optional pair array @code{dm}. If @code{dm} is not specified, the positive and negative extents of the error are assumed to be equal. @anchor{errorbars} @cindex error bars @verbatiminclude errorbars.asy @sp 1 @center @image{./errorbars} @cindex custom mark routine @item A custom mark routine can be also be specified: @verbatiminclude graphmarkers.asy @sp 1 @center @image{./graphmarkers} @item This example shows how to label an axis with arbitrary strings. @verbatiminclude monthaxis.asy @sp 1 @center @image{./monthaxis} @item The next example draws a graph of a parametrized curve. @cindex parametrized curve @cindex cropping graphs @cindex @code{xlimits} @cindex @code{ylimits} @cindex @code{limits} @cindex @code{crop} The calls to @verbatim xlimits(picture pic=currentpicture, real min=-infinity, real max=infinity, bool crop=NoCrop); @end verbatim @noindent and the analogous function @code{ylimits} can be uncommented to set the respective axes limits for picture @code{pic} to the specified @code{min} and @code{max} values. Alternatively, the function @verbatim void limits(picture pic=currentpicture, pair min, pair max, bool crop=NoCrop); @end verbatim can be used to limit the axes to the box having opposite vertices at the given pairs). Existing objects in picture @code{pic} will be cropped to lie within the given limits if @code{crop}=@code{Crop}. The function @code{crop(picture pic)} can be used to crop a graph to the current graph limits. @verbatiminclude parametricgraph.asy @sp 1 @center @image{./parametricgraph} @cindex @code{graphwithderiv} The function @verbatim guide graphwithderiv(pair f(real), pair fprime(real), real a, real b, int n=ngraph#10); @end verbatim can be used to construct the graph of the parametric function @code{f} on @code{[a,b]} with the control points of the @code{n} Bezier segments determined by the specified derivative @code{fprime}: @verbatiminclude graphwithderiv.asy @sp 1 @center @image{./graphwithderiv} @cindex scaled graph The next example illustrates how one can extract a common axis scaling factor. @verbatiminclude scaledgraph.asy @sp 1 @center @image{./scaledgraph} @anchor{automatic scaling} @cindex automatic scaling @cindex @code{scale} @cindex @code{Linear} @cindex @code{Log} @cindex automatic scaling Axis scaling can be requested and/or automatic selection of the axis limits can be inhibited with one of these @code{scale} routines: @verbatim void scale(picture pic=currentpicture, scaleT x, scaleT y); void scale(picture pic=currentpicture, bool xautoscale=true, bool yautoscale=xautoscale, bool zautoscale=yautoscale); @end verbatim This sets the scalings for picture @code{pic}. The @code{graph} routines accept an optional @code{picture} argument for determining the appropriate scalings to use; if none is given, it uses those set for @code{currentpicture}. Two frequently used scaling routines @code{Linear} and @code{Log} are predefined in @code{graph}. All picture coordinates (including those in paths and those given to the @code{label} and @code{limits} functions) are always treated as linear (post-scaled) coordinates. Use @cindex @code{Scale} @verbatim pair Scale(picture pic=currentpicture, pair z); @end verbatim to convert a graph coordinate into a scaled picture coordinate. The @math{x} and @math{y} components can be individually scaled using the analogous routines @verbatim real ScaleX(picture pic=currentpicture, real x); real ScaleY(picture pic=currentpicture, real y); @end verbatim The predefined scaling routines can be given two optional boolean arguments: @code{automin=false} and @code{automax=automin}. These default to @code{false} but can be respectively set to @code{true} to enable automatic selection of "nice" axis minimum and maximum values. The @code{Linear} scaling can also take as optional final arguments a multiplicative scaling factor and intercept (e.g.@ for a depth axis, @code{Linear(-1)} requests axis reversal). @cindex logarithmic graph @cindex log-log graph For example, to draw a log/log graph of a function, use @code{scale(Log,Log)}: @verbatiminclude loggraph.asy @sp 1 @center @image{./loggraph} @cindex grid By extending the ticks, one can easily produce a logarithmic grid: @verbatiminclude loggrid.asy @sp 1 @center @image{./loggrid} One can also specify custom tick locations and formats for logarithmic axes: @verbatiminclude logticks.asy @sp 1 @center @image{./logticks} @cindex @code{log2} graph It is easy to draw logarithmic graphs with respect to other bases: @verbatiminclude log2graph.asy @sp 1 @center @image{./log2graph} @cindex broken axis Here is an example of "broken" linear @math{x} and logarithmic @math{y} axes that omit the segments [3,8] and [100,1000], respectively. In the case of a logarithmic axis, the break endpoints are automatically rounded to the nearest integral power of the base. @verbatiminclude brokenaxis.asy @sp 1 @center @image{./brokenaxis} @cindex secondary axis @cindex @code{secondaryX} @cindex @code{secondaryY} @item @code{Asymptote} can draw secondary axes with the routines @verbatim picture secondaryX(picture primary=currentpicture, void f(picture)); picture secondaryY(picture primary=currentpicture, void f(picture)); @end verbatim In this example, @code{secondaryY} is used to draw a secondary linear @math{y} axis against a primary logarithmic @math{y} axis: @verbatiminclude Bode.asy @sp 1 @center @image{./Bode} A secondary logarithmic @math{y} axis can be drawn like this: @verbatiminclude secondaryaxis.asy @sp 1 @center @image{./secondaryaxis} @item Here is a histogram example, which uses the @code{stats} module. @cindex @code{axis} @verbatiminclude histogram.asy @sp 1 @center @image{./histogram} @item Here is an example of reading column data in from a file and a least-squares fit, using the @code{stats} module. @cindex @code{leastsquares} @verbatiminclude leastsquares.asy @sp 1 @center @image{./leastsquares} @item Here is an example that illustrates the general @code{axis} routine. @cindex @code{axis} @verbatiminclude generalaxis.asy @sp 1 @center @image{./generalaxis} @item To draw a vector field of @code{n} arrows evenly spaced along the arclength of a path, use the routine @cindex @code{vectorfield} @verbatim picture vectorfield(path vector(real), path g, int n, bool truesize=false, pen p=currentpen, arrowbar arrow=Arrow); @end verbatim as illustrated in this simple example of a flow field: @verbatiminclude flow.asy @sp 1 @center @image{./flow} @item To draw a vector field of @code{nx}@math{\times}@code{ny} arrows in @code{box(a,b)}, use the routine @cindex @code{vectorfield} @verbatim picture vectorfield(path vector(pair), pair a, pair b, int nx=nmesh, int ny=nx, bool truesize=false, real maxlength=truesize ? 0 : maxlength(a,b,nx,ny), bool cond(pair z)=null, pen p=currentpen, arrowbar arrow=Arrow, margin margin=PenMargin) @end verbatim as illustrated in this example: @verbatiminclude vectorfield.asy @sp 1 @center @image{./vectorfield} @item The following scientific graphs, which illustrate many features of @code{Asymptote}'s graphics routines, were generated from the examples @code{@uref{https://asymptote.sourceforge.io/gallery/2Dgraphs/diatom.svg,,diatom}@uref{https://asymptote.sourceforge.io/gallery/2Dgraphs/diatom.asy,,.asy}} and @code{@uref{https://asymptote.sourceforge.io/gallery/2Dgraphs/westnile.svg,,westnile}@uref{https://asymptote.sourceforge.io/gallery/2Dgraphs/westnile.asy,,.asy}}, using the comma-separated data in @code{@uref{https://asymptote.sourceforge.io/gallery/2Dgraphs/diatom.csv,,diatom.csv}} and @code{@uref{https://asymptote.sourceforge.io/gallery/2Dgraphs/westnile.csv,,westnile.csv}}. @page @sp 1 @center @image{./diatom} @sp 1 @center @image{./westnile,,7.5cm} @end enumerate @page @node palette @section @code{palette} @anchor{images} @cindex images @code{Asymptote} can also generate color density images and palettes. The following palettes are predefined in @code{palette.asy}: @table @code @cindex @code{Grayscale} @item pen[] Grayscale(int NColors=256) a grayscale palette; @cindex @code{Rainbow} @item pen[] Rainbow(int NColors=32766) a rainbow spectrum; @cindex @code{BWRainbow} @item pen[] BWRainbow(int NColors=32761) a rainbow spectrum tapering off to black/white at the ends; @cindex @code{BWRainbow2} @item pen[] BWRainbow2(int NColors=32761) a double rainbow palette tapering off to black/white at the ends, with a linearly scaled intensity. @cindex @code{Wheel} @item pen[] Wheel(int NColors=32766) a full color wheel palette; @cindex @code{Gradient} @item pen[] Gradient(int NColors=256 ... pen[] p) a palette varying linearly over the specified array of pens, using NColors in each interpolation interval; @end table The function @code{cmyk(pen[] Palette)} may be used to convert any of these palettes to the @acronym{CMYK} colorspace. A color density plot using palette @code{palette} can be generated from a function @code{f}(@math{x},@math{y}) and added to a picture @code{pic}: @cindex @code{image} @verbatim bounds image(picture pic=currentpicture, real f(real, real), range range=Full, pair initial, pair final, int nx=ngraph, int ny=nx, pen[] palette, int divs=0, bool antialias=false) @end verbatim The function @code{f} will be sampled at @code{nx} and @code{ny} evenly spaced points over a rectangle defined by the points @code{initial} and @code{final}, respecting the current graphical scaling of @code{pic}. The color space is scaled according to the @math{z} axis scaling (@pxref{automatic scaling}). If @math{@code{divs} > 1}, the palette is quantized to @math{@code{divs}-1} values. A @code{bounds} structure for the function values is returned: @cindex @code{bounds} @verbatim struct bounds { real min; real max; // Possible tick intervals: int[] divisor; } @end verbatim @noindent This information can be used for generating an optional palette bar. The palette color space corresponds to a range of values specified by the argument @code{range}, which can be @code{Full}, @code{Automatic}, or an explicit range @code{Range(real min, real max)}. (The type @code{range} is defined in @code{palette.asy}.) Here @code{Full} specifies a range varying from the minimum to maximum values of the function over the sampling interval, while @code{Automatic} selects "nice" limits. The examples @code{@uref{https://asymptote.sourceforge.io/gallery/2Dgraphs/fillcontour.svg,,fillcontour}@uref{https://asymptote.sourceforge.io/gallery/2Dgraphs/fillcontour.asy,,.asy}} and @code{@uref{https://asymptote.sourceforge.io/gallery/2Dgraphs/imagecontour.svg,,imagecontour}@uref{https://asymptote.sourceforge.io/gallery/2Dgraphs/imagecontour.asy,,.asy}} illustrate how level sets (contour lines) can be drawn on a color density plot (@pxref{contour}). A color density plot can also be generated from an explicit real[][] array @code{data}: @cindex @code{image} @verbatim bounds image(picture pic=currentpicture, real[][] f, range range=Full, pair initial, pair final, pen[] palette, int divs=0, bool transpose=(initial.x < final.x && initial.y < final.y), bool copy=true, bool antialias=false); @end verbatim @noindent If the initial point is to the left and below the final point, by default the array indices are interpreted according to the Cartesian convention (first index: @math{x}, second index: @math{y}) rather than the usual matrix convention (first index: @math{-y}, second index: @math{x}). To construct an image from an array of irregularly spaced points and an array of values @code{f} at these points, use one of the routines @verbatim bounds image(picture pic=currentpicture, pair[] z, real[] f, range range=Full, pen[] palette) bounds image(picture pic=currentpicture, real[] x, real[] y, real[] f, range range=Full, pen[] palette) @end verbatim An optionally labelled palette bar may be generated with the routine @verbatim void palette(picture pic=currentpicture, Label L="", bounds bounds, pair initial, pair final, axis axis=Right, pen[] palette, pen p=currentpen, paletteticks ticks=PaletteTicks, bool copy=true, bool antialias=false); @end verbatim The color space of @code{palette} is taken to be over bounds @code{bounds} with scaling given by the @math{z} scaling of @code{pic}. The palette orientation is specified by @code{axis}, which may be one of @code{Right}, @code{Left}, @code{Top}, or @code{Bottom}. The bar is drawn over the rectangle from @code{initial} to @code{final}. The argument @code{paletteticks} is a special tick type (@pxref{ticks}) that takes the following arguments: @verbatim paletteticks PaletteTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, pen pTick=nullpen, pen ptick=nullpen); @end verbatim The image and palette bar can be fit to a frame and added and optionally aligned to a picture at the desired location: @anchor{image} @verbatiminclude image.asy @sp 1 @center @image{./image} Here is an example that uses logarithmic scaling of the function values: @anchor{logimage} @verbatiminclude logimage.asy @sp 1 @center @image{./logimage} One can also draw an image directly from a two-dimensional pen array or a function @code{pen f(int, int)}: @verbatim void image(picture pic=currentpicture, pen[][] data, pair initial, pair final, bool transpose=(initial.x < final.x && initial.y < final.y), bool copy=true, bool antialias=false); void image(picture pic=currentpicture, pen f(int, int), int width, int height, pair initial, pair final, bool transpose=(initial.x < final.x && initial.y < final.y), bool antialias=false); @end verbatim @noindent as illustrated in the following examples: @anchor{penimage} @verbatiminclude penimage.asy @sp 1 @center @image{./penimage} @anchor{penfunctionimage} @verbatiminclude penfunctionimage.asy @sp 1 @center @image{./penfunctionimage} For convenience, the module @code{palette} also defines functions that may be used to construct a pen array from a given function and palette: @verbatim pen[] palette(real[] f, pen[] palette); pen[][] palette(real[][] f, pen[] palette); @end verbatim @node three @section @code{three} @cindex @code{three} @cindex @code{guide3} @cindex @code{path3} @cindex @code{cycle} @cindex @code{curl} @cindex @code{tension} @cindex @code{controls} This module fully extends the notion of guides and paths in @code{Asymptote} to three dimensions. It introduces the new types guide3, path3, and surface. Guides in three dimensions are specified with the same syntax as in two dimensions except that triples @code{(x,y,z)} are used in place of pairs @code{(x,y)} for the nodes and direction specifiers. This generalization of John Hobby's spline algorithm is shape-invariant under three-dimensional rotation, scaling, and shifting, and reduces in the planar case to the two-dimensional algorithm used in @code{Asymptote}, @code{MetaPost}, and @code{MetaFont} [see J. C. Bowman, Proceedings in Applied Mathematics and Mechanics, 7:1, 2010021-2010022 (2007)]. For example, a unit circle in the @math{XY} plane may be filled and drawn like this: @verbatiminclude unitcircle3.asy @sp 1 @center @image{./unitcircle3} @noindent and then distorted into a saddle: @verbatiminclude saddle.asy @sp 1 @center @image{./saddle} @noindent Module @code{three} provides constructors for converting two-dimensional paths to three-dimensional ones, and vice-versa: @cindex @code{path3} @cindex @code{path} @verbatim path3 path3(path p, triple plane(pair)=XYplane); path path(path3 p, pair P(triple)=xypart); @end verbatim @cindex @code{surface} @cindex @code{render} @cindex @code{defaultrender} A Bezier surface, the natural two-dimensional generalization of Bezier curves, is defined in @code{three_surface.asy} as a structure containing an array of Bezier patches. Surfaces may drawn with one of the routines @verbatim void draw(picture pic=currentpicture, surface s, int nu=1, int nv=1, material surfacepen=currentpen, pen meshpen=nullpen, light light=currentlight, light meshlight=nolight, string name="", render render=defaultrender); void draw(picture pic=currentpicture, surface s, int nu=1, int nv=1, material[] surfacepen, pen meshpen, light light=currentlight, light meshlight=nolight, string name="", render render=defaultrender); void draw(picture pic=currentpicture, surface s, int nu=1, int nv=1, material[] surfacepen, pen[] meshpen=nullpens, light light=currentlight, light meshlight=nolight, string name="", render render=defaultrender); @end verbatim The parameters @code{nu} and @code{nv} specify the number of subdivisions for drawing optional mesh lines for each Bezier patch. The optional @code{name} parameter is used as a prefix for naming the surface patches in the @acronym{PRC} model tree. Here material is a structure defined in @code{three_light.asy}: @cindex @code{material} @cindex @code{diffusepen} @cindex @code{emissivepen} @cindex @code{specularpen} @cindex @code{opacity} @cindex @code{shininess} @cindex @code{metallic} @cindex @code{freshnel0} @verbatim struct material { pen[] p; // diffusepen,emissivepen,specularpen real opacity; real shininess; real metallic; real fresnel0; } @end verbatim @noindent @cindex @code{PBR} @cindex @code{physically based rendering} These material properties are used to implement physically based rendering (PBR) using light properties defined in @code{plain_prethree.asy} and @code{three_light.asy}: @cindex @code{light} @cindex @code{diffuse} @cindex @code{specular} @cindex @code{background} @cindex @code{specularfactor} @cindex @code{position} @cindex @code{currentlight} @cindex @code{Viewport} @cindex @code{White} @cindex @code{Headlamp} @cindex @code{nolight} @verbatim struct light { real[][] diffuse; real[][] specular; pen background=nullpen; // Background color of the canvas. real specularfactor; triple[] position; // Only directional lights are currently implemented. } light Viewport=light(specularfactor=3,(0.25,-0.25,1)); light White=light(new pen[] {rgb(0.38,0.38,0.45),rgb(0.6,0.6,0.67), rgb(0.5,0.5,0.57)},specularfactor=3, new triple[] {(-2,-1.5,-0.5),(2,1.1,-2.5),(-0.5,0,2)}); light Headlamp=light(gray(0.8),specular=gray(0.7), specularfactor=3,dir(42,48)); currentlight=Headlamp; light nolight; @end verbatim @cindex @code{background} @cindex @code{transparent} The @code{currentlight.background} (or @code{background} member of the specified @code{light}) can be used to set the background color for 2D (or 3D) images. The default background is white for @code{HTML} images and transparent for all other formats. One can request a completely transparent background for 3D @code{WebGL} images with @code{currentlight.background=black+opacity(0.0);} @code{render} A function @code{render()} may be assigned to the optional @code{render} parameter allows one to pass specialized rendering options to the surface drawing routines, via arguments such as: @verbatim bool tessellate; // use tessellated mesh to store straight patches real margin; // shrink amount for rendered OpenGL viewport, in bp. bool partnames; // assign part name indices to compound objects bool defaultnames; // assign default names to unnamed objects interaction interaction; // billboard interaction mode @end verbatim along with the rendering parameters for the legacy @acronym{PRC} format described in @code{three.asy}. @cindex image-based lighting @cindex @code{surface} @cindex @code{ibl} Asymptote also supports image-based lighting with the setting @code{settings.ibl=true}. This uses pre-rendered @acronym{EXR} images from the directory specified by @code{-imageDir} (which defaults to @code{ibl}) or, for @code{WebGL} rendering, the @acronym{URL} specified by @code{-imageURL} (which defaults to @url{https://vectorgraphics.gitlab.io/asymptote/ibl}). Additional rendered images can be generated on an @code{NVIDIA} @acronym{GPU} using the @code{reflect} program in the @code{cudareflect} subdirectory of the @code{Asymptote} source directory. Sample Bezier surfaces are contained in the example files @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/BezierSurface.html,,BezierSurface}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/BezierSurface.asy,,.asy}}, @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/teapot.html,,teapot}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/teapot.asy,,.asy}}, @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/teapotIBL.html,,teapotIBL}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/teapotIBL.asy,,.asy}}, and @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/parametricsurface.html,,parametricsurface}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/parametricsurface.asy,,.asy}}. The structure @code{render} contains specialized rendering options documented at the beginning of module @code{three}. @cindex patch-dependent colors @cindex vertex-dependent colors The examples @code{@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/elevation.html,,elevation}@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/elevation.asy,,.asy}} and @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/sphericalharmonic.html,,sphericalharmonic}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/sphericalharmonic.asy,,.asy}} illustrate how to draw a surface with patch-dependent colors. The examples @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/vertexshading.html,,vertexshading}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/vertexshading.asy,,.asy}} and @code{@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/smoothelevation.html,,smoothelevation}@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/smoothelevation.asy,,.asy}} illustrate vertex-dependent colors, which are supported by @code{Asymptote}'s native @code{OpenGL}/@code{WebGL} renderers and the two-dimensional vector output format (@code{settings.render=0}). Since the legacy @acronym{PRC} output format does not support vertex shading of Bezier surfaces, @acronym{PRC} patches are shaded with the mean of the four vertex colors. @cindex @code{surface} @cindex @code{planar} @cindex @code{Bezier patch} @cindex @code{Bezier triangle} A surface can be constructed from a cyclic @code{path3} with the constructor @verbatim surface surface(path3 external, triple[] internal=new triple[], pen[] colors=new pen[], bool3 planar=default); @end verbatim @noindent and then filled: @verbatim draw(surface(unitsquare3,new triple[] {X,Y,Z,O}),red); draw(surface(O--X{Y}..Y{-X}--cycle,new triple[] {Z}),red); draw(surface(path3(polygon(5))),red,nolight); draw(surface(unitcircle3),red,nolight); draw(surface(unitcircle3,new pen[] {red,green,blue,black}),nolight); @end verbatim @noindent The first example draws a Bezier patch and the second example draws a Bezier triangle. The third and fourth examples are planar surfaces. The last example constructs a patch with vertex-specific colors. A three-dimensional planar surface in the plane @code{plane} can be constructed from a two-dimensional cyclic path @code{g} with the constructor @cindex @code{surface} @verbatim surface surface(path p, triple plane(pair)=XYplane); @end verbatim @noindent and then filled: @verbatim draw(surface((0,0)--E+2N--2E--E+N..0.2E..cycle),red); @end verbatim @noindent @cindex @code{bezulate} Planar Bezier surfaces patches are constructed using Orest Shardt's @code{bezulate} routine, which decomposes (possibly nonsimply connected) regions bounded (according to the @code{zerowinding} fill rule) by simple cyclic paths (intersecting only at the endpoints) into subregions bounded by cyclic paths of length @code{4} or less. A more efficient routine also exists for drawing tessellations composed of many 3D triangles, with specified vertices, and optional normals or vertex colors: @cindex @code{draw} @cindex @code{triangles} @cindex @code{tessellation} @verbatim void draw(picture pic=currentpicture, triple[] v, int[][] vi, triple[] n={}, int[][] ni=vi, material m=currentpen, pen[] p={}, int[][] pi=vi, light light=currentlight); @end verbatim Here, the triple array @code{v} lists the (typically distinct) vertices, while the array @code{vi} contains integer arrays of length 3 containing the indices of the elements in @code{v} that form the vertices of each triangle. Similarly, the arguments @code{n} and @code{ni} contain optional normal data and @code{p} and @code{pi} contain optional pen vertex data. If more than one normal or pen is specified for a vertex, the last one is used. An example of this tessellation facility is given in @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/triangles.html,,triangles}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/triangles.asy,,.asy}}. @cindex @code{thin} @cindex @code{thick} @cindex @code{tube} Arbitrary thick three-dimensional curves and line caps (which the @code{OpenGL} standard does not require implementations to provide) are constructed with @verbatim tube tube(path3 p, real width, render render=defaultrender); @end verbatim @noindent this returns a tube structure representing a tube of diameter @code{width} centered approximately on @code{g}. The tube structure consists of a surface @code{s} and the actual tube center, path3 @code{center}. Drawing thick lines as tubes can be slow to render, especially with the @code{Adobe Reader} renderer. The setting @code{thick=false} can be used to disable this feature and force all lines to be drawn with @code{linewidth(0)} (one pixel wide, regardless of the resolution). By default, mesh and contour lines in three-dimensions are always drawn thin, unless an explicit line width is given in the pen parameter or the setting @code{thin} is set to @code{false}. The pens @code{thin()} and @code{thick()} defined in @code{plain_pens.asy} can also be used to override these defaults for specific draw commands. @noindent There are six choices for viewing 3D @code{Asymptote} output: @enumerate @cindex @code{OpenGL} @cindex @code{render} @cindex @code{outformat} @cindex @code{multisample} @cindex @code{devicepixelratio} @cindex @code{position} @item Use the native @code{Asymptote} adaptive @code{OpenGL}-based renderer (with the command-line option @code{-V} and the default settings @code{outformat=""} and @code{render=-1}). On @code{UNIX} systems with graphics support for multisampling, the sample width can be controlled with the setting @code{multisample}. The ratio of physical to logical screen pixels can be specified with the setting @code{devicepixelratio}. An initial screen position can be specified with the pair setting @code{position}, where negative values are interpreted as relative to the corresponding maximum screen dimension. The default settings @cindex mouse bindings @verbatim import settings; leftbutton=new string[] {"rotate","zoom","shift","pan"}; middlebutton=new string[] {""}; rightbutton=new string[] {"zoom","rotateX","rotateY","rotateZ"}; wheelup=new string[] {"zoomin"}; wheeldown=new string[] {"zoomout"}; @end verbatim bind the mouse buttons as follows: @itemize @item Left: rotate @item Shift Left: zoom @item Ctrl Left: shift viewport @item Alt Left: pan @item Wheel Up: zoom in @item Wheel Down: zoom out @item Right: zoom @item Shift Right: rotate about the X axis @item Ctrl Right: rotate about the Y axis @item Alt Right: rotate about the Z axis @end itemize The keyboard bindings are: @cindex keyboard bindings: @itemize @item h: home @item f: toggle fitscreen @item x: spin about the X axis @item y: spin about the Y axis @item z: spin about the Z axis @item s: stop spinning @item m: rendering mode (solid/patch/mesh) @item e: export @item c: show camera parameters @item p: play animation @item r: reverse animation @item : step animation @item +: expand @item =: expand @item >: expand @item -: shrink @item _: shrink @item <: shrink @item q: exit @item Ctrl-q: exit @end itemize @cindex @code{WebGL} @cindex @code{HTML5} @cindex @code{mobile browser} @item Generate @code{WebGL} interactive vector graphics output with the the command-line option and @code{-f html} (or the setting @code{outformat="html"}). The resulting 3D @acronym{HTML} file can then be viewed directly in any modern desktop or mobile browser, or even embedded within another web page: @verbatim @end verbatim @cindex @code{absolute} Normally, @code{WebGL} files generated by @code{Asymptote} are dynamically remeshed to fit the browser window dimensions. However, the setting @code{absolute=true} can be used to force the image to be rendered at its designed size (accounting for multiple device pixels per @code{css} pixel). For specialized applications, the setting @code{keys=true} can be used to generate an identifying key immediately before the @code{WebGL} code for each generated object. The default key, the @code{"line:column"} of the associated function call of the top-level source code, can be overwritten by adding @code{KEY="x"} as the first argument of the function call, where @code{x} represents user-supplied text. The interactive @code{WebGL} files produced by @code{Asymptote} use the default mouse and (many of the same) key bindings as the @code{OpenGL} renderer. Zooming via the mouse wheel of a @code{WebGL} image embedded within another page is disabled until the image is activated by a click or touch event and will remain enabled until the @code{ESC} key is pressed. By default, viewing the 3D @acronym{HTML} files generated by Asymptote requires network access to download the @code{AsyGL} rendering library, which is normally cached by the browser for future use. However, the setting @code{offline=true} can be used to embed this small (about 48kB) library within a stand-alone @acronym{HTML} file that can be viewed offline. @cindex @code{antialias} @cindex @code{maxviewport} @cindex @code{maxtile} @cindex @code{glOptions} @cindex @code{iconify} @cindex @code{black stripes} @item Render the scene to a specified rasterized format @code{outformat} at the resolution of @code{n} pixels per @code{bp}, as specified by the setting @code{render=n}. A negative value of @code{n} is interpreted as @code{|2n|} for @acronym{EPS} and @acronym{PDF} formats and @code{|n|} for other formats. The default value of @code{render} is -1. By default, the scene is internally rendered at twice the specified resolution; this can be disabled by setting @code{antialias=1}. High resolution rendering is done by tiling the image. If your graphics card allows it, the rendering can be made more efficient by increasing the maximum tile size @code{maxtile} to your screen dimensions (indicated by @code{maxtile=(0,0)}. If your video card generates unwanted black stripes in the output, try setting the horizontal and vertical components of @code{maxtiles} to something less than your screen dimensions. The tile size is also limited by the setting @code{maxviewport}, which restricts the maximum width and height of the viewport. Some graphics drivers support batch mode (@code{-noV}) rendering in an iconified window; this can be enabled with the setting @code{iconify=true}. @cindex @code{prc} @cindex @code{views} @item Embed the 3D legacy @acronym{PRC} format in a @acronym{PDF} file and view the resulting @acronym{PDF} file with version @code{9.0} or later of @code{Adobe Reader}. This requires @code{settings.outformat="pdf"} and @code{settings.prc=true}, which can be specified by the command-line options @code{-f pdf} and @code{-f prc}, put in the @code{Asymptote} configuration file (@pxref{configuration file}), or specified in the script before module @code{three} (or @code{graph3}) is imported. The @code{media9} LaTeX package is also required (@pxref{embed}). The example @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/100d.html,,100d}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/pdb.asy,,.asy}} illustrates how one can generate a list of predefined views (see @code{100d.views}). A stationary preview image with a resolution of @code{n} pixels per @code{bp} can be embedded with the setting @code{render=n}; this allows the file to be viewed with other @code{PDF} viewers. Alternatively, the file @code{externalprc.tex} illustrates how the resulting @acronym{PRC} and rendered image files can be extracted and processed in a separate @code{LaTeX} file. However, see @ref{LaTeX usage} for an easier way to embed three-dimensional @code{Asymptote} pictures within @code{LaTeX}. For specialized applications where only the raw @acronym{PRC} file is required, specify @code{settings.outformat="prc"}. The @acronym{PRC} specification is available from @url{https://web.archive.org/web/20081204104459/http://livedocs.adobe.com/acrobat_sdk/9/Acrobat9_HTMLHelp/API_References/PRCReference/PRC_Format_Specification/} @cindex @code{v3d} @item Output a @acronym{V3D} portable compressed vector graphics file using @code{settings.outformat="v3d"}, which can be viewed with an external viewer or converted to an alternate 3D format using the Python @code{pyv3d} library. @acronym{V3D} content can be automatically embedded within a @acronym{PDF} file using the options @code{settings.outformat="pdf"} and @code{settings.v3d=true}. Alternatively, a V3D file @code{file.v3d} may be manually embedded within a @acronym{PDF} file using the @code{media9} @code{LaTeX} package: @verbatim \includemedia[noplaybutton,width=100pt,height=200pt]{}{file.v3d}% @end verbatim An online @code{Javascript}-based V3D-aware @code{PDF} viewer is available at @url{https://github.com/vectorgraphics/pdfv3dReader}. The @acronym{V3D} specification and the @code{pyv3d} library are available at @url{https://github.com/vectorgraphics/v3d}. A @acronym{V3D} file @code{file.v3d} may be imported and viewed by @code{Asymptote} either by specifying @code{file.v3d} on the command line @verbatim asy -V file.v3d @end verbatim or using the @code{v3d} module and @code{importv3d} function in interactive mode (or within an @code{Asymptote} file): @cindex @code{importv3d} @verbatim import v3d; importv3d("file.v3d"); @end verbatim @item Project the scene to a two-dimensional vector (@acronym{EPS} or @acronym{PDF}) format with @code{render=0}. Only limited support for hidden surface removal, lighting, and transparency is available with this approach (@pxref{PostScript3D}). @end enumerate @cindex double deferred drawing Automatic picture sizing in three dimensions is accomplished with double deferred drawing. The maximal desired dimensions of the scene in each of the three dimensions can optionally be specified with the routine @cindex @code{size3} @verbatim void size3(picture pic=currentpicture, real x, real y=x, real z=y, bool keepAspect=pic.keepAspect); @end verbatim @noindent @cindex margins @cindex @code{viewportmargin} @cindex @code{viewportsize} A simplex linear programming problem is then solved to produce a 3D version of a frame (actually implemented as a 3D picture). The result is then fit with another application of deferred drawing to the viewport dimensions corresponding to the usual two-dimensional picture @code{size} parameters. The global pair @code{viewportmargin} may be used to add horizontal and vertical margins to the viewport dimensions. Alternatively, a minimum @code{viewportsize} may be specified. A 3D picture @code{pic} can be explicitly fit to a 3D frame by calling @cindex @code{fit3} @verbatim frame pic.fit3(projection P=currentprojection); @end verbatim @noindent and then added to picture @code{dest} about @code{position} with @cindex @code{add} @verbatim void add(picture dest=currentpicture, frame src, triple position=(0,0,0)); @end verbatim @cindex @code{O} @cindex @code{X} @cindex @code{Y} @cindex @code{Z} @cindex @code{unitcircle} For convenience, the @code{three} module defines @code{O=(0,0,0)}, @code{X=(1,0,0)}, @code{Y=(0,1,0)}, and @code{Z=(0,0,1)}, along with a unitcircle in the XY plane: @verbatim path3 unitcircle3=X..Y..-X..-Y..cycle; @end verbatim @cindex @code{circle} A general (approximate) circle can be drawn perpendicular to the direction @code{normal} with the routine @verbatim path3 circle(triple c, real r, triple normal=Z); @end verbatim @cindex @code{arc} A circular arc centered at @code{c} with radius @code{r} from @code{c+r*dir(theta1,phi1)} to @code{c+r*dir(theta2,phi2)}, drawing counterclockwise relative to the normal vector @code{cross(dir(theta1,phi1),dir(theta2,phi2))} if @code{theta2 > theta1} or if @code{theta2 == theta1} and @code{phi2 >= phi1}, can be constructed with @verbatim path3 arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=O); @end verbatim The normal must be explicitly specified if @code{c} and the endpoints are colinear. If @code{r} < 0, the complementary arc of radius @code{|r|} is constructed. For convenience, an arc centered at @code{c} from triple @code{v1} to @code{v2} (assuming @code{|v2-c|=|v1-c|}) in the direction CCW (counter-clockwise) or CW (clockwise) may also be constructed with @verbatim path3 arc(triple c, triple v1, triple v2, triple normal=O, bool direction=CCW); @end verbatim @noindent When high accuracy is needed, the routines @code{Circle} and @code{Arc} defined in @code{graph3} may be used instead. See @ref{GaussianSurface} for an example of a three-dimensional circular arc. @cindex @code{plane} The representation @code{O--O+u--O+u+v--O+v--cycle} of the plane passing through point @code{O} with normal @code{cross(u,v)} is returned by @verbatim path3 plane(triple u, triple v, triple O=O); @end verbatim A three-dimensional box with opposite vertices at triples @code{v1} and @code{v2} may be drawn with the function @cindex @code{box} @verbatim path3[] box(triple v1, triple v2); @end verbatim @noindent For example, a unit box is predefined as @cindex @code{box} @cindex @code{unitbox} @verbatim path3[] unitbox=box(O,(1,1,1)); @end verbatim @code{Asymptote} also provides optimized definitions for the three-dimensional paths @code{unitsquare3} and @code{unitcircle3}, along with the surfaces @code{unitdisk}, @code{unitplane}, @code{unitcube}, @code{unitcylinder}, @code{unitcone}, @code{unitsolidcone}, @code{unitfrustum(real t1, real t2)}, @code{unitsphere}, and @code{unithemisphere}. @noindent These projections to two dimensions are predefined: @table @code @item oblique @item oblique(real angle) @cindex @code{oblique} @cindex @code{obliqueZ} The point @code{(x,y,z)} is projected to @code{(x-0.5z,y-0.5z)}. If an optional real argument is given, the negative @math{z} axis is drawn at this angle in degrees. The projection @code{obliqueZ} is a synonym for @code{oblique}. @item obliqueX @item obliqueX(real angle) @cindex @code{obliqueX} The point @code{(x,y,z)} is projected to @code{(y-0.5x,z-0.5x)}. If an optional real argument is given, the negative @math{x} axis is drawn at this angle in degrees. @item obliqueY @item obliqueY(real angle) @cindex @code{obliqueY} The point @code{(x,y,z)} is projected to @code{(x+0.5y,z+0.5y)}. If an optional real argument is given, the positive @math{y} axis is drawn at this angle in degrees. @cindex @code{orthographic} @cindex @code{up} @cindex @code{target} @cindex @code{showtarget} @cindex @code{center} @item orthographic(triple camera, triple up=Z, triple target=O, @*@ @ @ @ @ @ @ @ @ @ @ @ @ real zoom=1, pair viewportshift=0, bool showtarget=true, @*@ @ @ @ @ @ @ @ @ @ @ @ @ bool center=true) This projects from three to two dimensions using the view as seen at a point infinitely far away in the direction @code{unit(camera)}, orienting the camera so that, if possible, the vector @code{up} points upwards. Parallel lines are projected to parallel lines. The bounding volume is expanded to include @code{target} if @code{showtarget=true}. If @code{center=true}, the target will be adjusted to the center of the bounding volume. @item orthographic(real x, real y, real z, triple up=Z, triple target=O, @*@ @ @ @ @ @ @ @ @ @ @ @ @ real zoom=1, pair viewportshift=0, bool showtarget=true, @*@ @ @ @ @ @ @ @ @ @ @ @ @ bool center=true) This is equivalent to @verbatim orthographic((x,y,z),up,target,zoom,viewportshift,showtarget,center) @end verbatim The routine @cindex @code{camera} @verbatim triple camera(real alpha, real beta); @end verbatim can be used to compute the camera position with the @math{x} axis below the horizontal at angle @code{alpha}, the @math{y} axis below the horizontal at angle @code{beta}, and the @math{z} axis up. @cindex @code{autoadjust} @item perspective(triple camera, triple up=Z, triple target=O, @*@ @ @ @ @ @ @ @ @ @ @ @ real zoom=1, real angle=0, pair viewportshift=0, @*@ @ @ @ @ @ @ @ @ @ @ @ bool showtarget=true, bool autoadjust=true, @*@ @ @ @ @ @ @ @ @ @ @ @ bool center=autoadjust) @cindex @code{perspective} This projects from three to two dimensions, taking account of perspective, as seen from the location @code{camera} looking at @code{target}, orienting the camera so that, if possible, the vector @code{up} points upwards. If @code{autoadjust=true}, the camera will automatically be adjusted to lie outside the bounding volume for all possible interactive rotations about @code{target}. If @code{center=true}, the target will be adjusted to the center of the bounding volume. @item perspective(real x, real y, real z, triple up=Z, triple target=O, @*@ @ @ @ @ @ @ @ @ @ @ @ real zoom=1, real angle=0, pair viewportshift=0, @*@ @ @ @ @ @ @ @ @ @ @ @ bool showtarget=true, bool autoadjust=true, @*@ @ @ @ @ @ @ @ @ @ @ @ bool center=autoadjust) This is equivalent to @verbatim perspective((x,y,z),up,target,zoom,angle,viewportshift,showtarget, autoadjust,center) @end verbatim @end table @cindex @code{currentprojection} @noindent The default projection, @code{currentprojection}, is initially set to @code{perspective(5,4,2)}. @cindex @code{LeftView} @cindex @code{RightView} @cindex @code{FrontView} @cindex @code{BackView} @cindex @code{BottomView} @cindex @code{TopView} We also define standard orthographic views used in technical drawing: @verbatim projection LeftView=orthographic(-X,showtarget=true); projection RightView=orthographic(X,showtarget=true); projection FrontView=orthographic(-Y,showtarget=true); projection BackView=orthographic(Y,showtarget=true); projection BottomView=orthographic(-Z,showtarget=true); projection TopView=orthographic(Z,showtarget=true); @end verbatim @noindent The function @cindex @code{addViews} @verbatim void addViews(picture dest=currentpicture, picture src, projection[][] views=SixViewsUS, bool group=true, filltype filltype=NoFill); @end verbatim @noindent adds to picture @code{dest} an array of views of picture @code{src} using the layout projection[][] @code{views}. The default layout @code{SixViewsUS} aligns the projection @code{FrontView} below @code{TopView} and above @code{BottomView}, to the right of @code{LeftView} and left of @code{RightView} and @code{BackView}. The predefined layouts are: @cindex @code{ThreeViewsUS} @cindex @code{SixViewsUS} @cindex @code{ThreeViewsFR} @cindex @code{SixViewsFR} @cindex @code{ThreeViews} @cindex @code{SixViews} @verbatim projection[][] ThreeViewsUS={{TopView}, {FrontView,RightView}}; projection[][] SixViewsUS={{null,TopView}, {LeftView,FrontView,RightView,BackView}, {null,BottomView}}; projection[][] ThreeViewsFR={{RightView,FrontView}, {null,TopView}}; projection[][] SixViewsFR={{null,BottomView}, {RightView,FrontView,LeftView,BackView}, {null,TopView}}; projection[][] ThreeViews={{FrontView,TopView,RightView}}; projection[][] SixViews={{FrontView,TopView,RightView}, {BackView,BottomView,LeftView}}; @end verbatim A triple or path3 can be projected to a pair or path, with @code{project(triple, projection P=currentprojection)} or @code{project(path3, projection P=currentprojection)}. It is occasionally useful to be able to invert a projection, sending a pair @code{z} onto the plane perpendicular to @code{normal} and passing through @code{point}: @cindex @code{invert} @verbatim triple invert(pair z, triple normal, triple point, projection P=currentprojection); @end verbatim @noindent A pair @code{z} on the projection plane can be inverted to a triple with the routine @verbatim triple invert(pair z, projection P=currentprojection); @end verbatim @noindent A pair direction @code{dir} on the projection plane can be inverted to a triple direction relative to a point @code{v} with the routine @verbatim triple invert(pair dir, triple v, projection P=currentprojection). @end verbatim @cindex @code{transform3} @cindex @code{identity4} Three-dimensional objects may be transformed with one of the following built-in transform3 types (the identity transformation is @code{identity4}): @table @code @item shift(triple v) @cindex @code{shift} translates by the triple @code{v}; @item xscale3(real x) @cindex @code{xscale3} scales by @code{x} in the @math{x} direction; @item yscale3(real y) @cindex @code{yscale3} scales by @code{y} in the @math{y} direction; @item zscale3(real z) @cindex @code{zscale3} scales by @code{z} in the @math{z} direction; @item scale3(real s) @cindex @code{scale3} scales by @code{s} in the @math{x}, @math{y}, and @math{z} directions; @item scale(real x, real y, real z) @cindex @code{scale} scales by @code{x} in the @math{x} direction, by @code{y} in the @math{y} direction, and by @code{z} in the @math{z} direction; @cindex @code{rotate} @item rotate(real angle, triple v) rotates by @code{angle} in degrees about the axis @code{O--v}; @item rotate(real angle, triple u, triple v) rotates by @code{angle} in degrees about the axis @code{u--v}; @item reflect(triple u, triple v, triple w) reflects about the plane through @code{u}, @code{v}, and @code{w}. @cindex @code{XY} @end table When not multiplied on the left by a transform3, three-dimensional @TeX{} Labels are drawn as Bezier surfaces directly on the projection plane: @cindex @code{label} @verbatim void label(picture pic=currentpicture, Label L, triple position, align align=NoAlign, pen p=currentpen, light light=nolight, string name="", render render=defaultrender, interaction interaction= settings.autobillboard ? Billboard : Embedded) @end verbatim @noindent @cindex @code{Billboard} @cindex @code{Embedded} The optional @code{name} parameter is used as a prefix for naming the label patches in the @acronym{PRC} model tree. The default interaction is @code{Billboard}, which means that labels are rotated interactively so that they always face the camera. The interaction @code{Embedded} means that the label interacts as a normal @code{3D} surface, as illustrated in the example @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/billboard.html,,billboard}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/billboard.asy,,.asy}}. @cindex @code{transform} @cindex @code{XY} @cindex @code{YZ} @cindex @code{ZX} @cindex @code{YX} @cindex @code{ZY} @cindex @code{ZX} Alternatively, a label can be transformed from the @code{XY} plane by an explicit transform3 or mapped to a specified two-dimensional plane with the predefined transform3 types @code{XY}, @code{YZ}, @code{ZX}, @code{YX}, @code{ZY}, @code{ZX}. There are also modified versions of these transforms that take an optional argument @code{projection P=currentprojection} that rotate and/or flip the label so that it is more readable from the initial viewpoint. @cindex @code{planeproject} A transform3 that projects in the direction @code{dir} onto the plane with normal @code{n} through point @code{O} is returned by @verbatim transform3 planeproject(triple n, triple O=O, triple dir=n); @end verbatim @noindent One can use @cindex @code{normal} @verbatim triple normal(path3 p); @end verbatim @noindent to find the unit normal vector to a planar three-dimensional path @code{p}. As illustrated in the example @code{@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/planeproject.html,,planeproject}@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/planeproject.asy,,.asy}}, a transform3 that projects in the direction @code{dir} onto the plane defined by a planar path @code{p} is returned by @verbatim transform3 planeproject(path3 p, triple dir=normal(p)); @end verbatim The functions @cindex @code{extrude} @verbatim surface extrude(path p, triple axis=Z); surface extrude(Label L, triple axis=Z); @end verbatim @noindent return the surface obtained by extruding path @code{p} or Label @code{L} along @code{axis}. @cindex @code{length} @cindex @code{size} @cindex @code{point} @cindex @code{dir} @cindex @code{accel} @cindex @code{radius} @cindex @code{precontrol} @cindex @code{postcontrol} @cindex @code{arclength} @cindex @code{arctime} @cindex @code{reverse} @cindex @code{subpath} @cindex @code{intersect} @cindex @code{intersections} @cindex @code{intersectionpoint} @cindex @code{intersectionpoints} @cindex @code{min} @cindex @code{max} @cindex @code{cyclic} @cindex @code{straight} Three-dimensional versions of the path functions @code{length}, @code{size}, @code{point}, @code{dir}, @code{accel}, @code{radius}, @code{precontrol}, @code{postcontrol}, @code{arclength}, @code{arctime}, @code{reverse}, @code{subpath}, @code{intersect}, @code{intersections}, @code{intersectionpoint}, @code{intersectionpoints}, @code{min}, @code{max}, @code{cyclic}, and @code{straight} are also defined. The routine @cindex @code{intersections} @verbatim real[] intersect(path3 p, surface s, real fuzz=-1); @end verbatim @noindent returns a real array of length 3 containing the intersection times, if any, of a path @code{p} with a surface @code{s}. The routine @verbatim real[][] intersections(path3 p, surface s, real fuzz=-1); @end verbatim @noindent returns all (unless there are infinitely many) intersection times of a path @code{p} with a surface @code{s} as a sorted array of real arrays of length 3, and @cindex @code{intersectionpoints} @verbatim triple[] intersectionpoints(path3 p, surface s, real fuzz=-1); @end verbatim @noindent returns the corresponding intersection points. Here, the computations are performed to the absolute error specified by @code{fuzz}, or if @code{fuzz < 0}, to machine precision. The routine @cindex @code{orient} @verbatim real orient(triple a, triple b, triple c, triple d); @end verbatim @noindent is a numerically robust computation of @code{dot(cross(a-d,b-d),c-d)}, which is the determinant @verbatim |a.x a.y a.z 1| |b.x b.y b.z 1| |c.x c.y c.z 1| |d.x d.y d.z 1| @end verbatim The result is negative (positive) if @code{a}, @code{b}, @code{c} appear in counterclockwise (clockwise) order when viewed from @code{d} or zero if all four points are coplanar. The routine @cindex @code{insphere} @verbatim real insphere(triple a, triple b, triple c, triple d, triple e); @end verbatim @noindent returns a positive (negative) value if @code{e} lies inside (outside) the sphere passing through points @code{a,b,c,d} oriented so that @code{dot(cross(a-d,b-d),c-d)} is positive, or zero if all five points are cospherical. The value returned is the determinant @verbatim |a.x a.y a.z a.x^2+a.y^2+a.z^2 1| |b.x b.y b.z b.x^2+b.y^2+b.z^2 1| |c.x c.y c.z c.x^2+c.y^2+c.z^2 1| |d.x d.y d.z d.x^2+d.y^2+d.z^2 1| |e.x e.y e.z e.x^2+e.y^2+e.z^2 1| @end verbatim Here is an example showing all five guide3 connectors: @verbatiminclude join3.asy @sp 1 @center @image{./join3} @cindex @code{BeginBar3} @cindex @code{EndBar3} @cindex @code{Bar3} @cindex @code{Bars3} @cindex @code{BeginArrow3} @cindex @code{MidArrow3} @cindex @code{EndArrow3} @cindex @code{Arrow3} @cindex @code{Arrows3} @cindex @code{BeginArcArrow3} @cindex @code{MidArcArrow3} @cindex @code{EndArcArrow3} @cindex @code{ArcArrow3} @cindex @code{ArcArrows3} @cindex @code{DefaultHead3} @cindex @code{HookHead3} @cindex @code{TeXHead3} Three-dimensional versions of bars or arrows can be drawn with one of the specifiers @code{None}, @code{Blank}, @code{BeginBar3}, @code{EndBar3} (or equivalently @code{Bar3}), @code{Bars3}, @code{BeginArrow3}, @code{MidArrow3}, @code{EndArrow3} (or equivalently @code{Arrow3}), @code{Arrows3}, @code{BeginArcArrow3}, @code{EndArcArrow3} (or equivalently @code{ArcArrow3}), @code{MidArcArrow3}, and @code{ArcArrows3}. Three-dimensional bars accept the optional arguments @code{(real size=0, triple dir=O)}. If @code{size=O}, the default bar length is used; if @code{dir=O}, the bar is drawn perpendicular to the path and the initial viewing direction. The predefined three-dimensional arrowhead styles are @code{DefaultHead3}, @code{HookHead3}, @code{TeXHead3}. Versions of the two-dimensional arrowheads lifted to three-dimensional space and aligned according to the initial viewpoint (or an optionally specified @code{normal} vector) are also defined: @code{DefaultHead2(triple normal=O)}, @code{HookHead2(triple normal=O)}, @code{TeXHead2(triple normal=O)}. These are illustrated in the example @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/arrows3.html,,arrows3}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/arrows3.asy,,.asy}}. @cindex @code{NoMargin3} @cindex @code{BeginMargin3} @cindex @code{EndMargin3} @cindex @code{Margin3} @cindex @code{Margins3} @cindex @code{BeginPenMargin2} @cindex @code{EndPenMargin2} @cindex @code{PenMargin2} @cindex @code{PenMargins2} @cindex @code{BeginPenMargin3} @cindex @code{EndPenMargin3} @cindex @code{PenMargin3} @cindex @code{PenMargins3} @cindex @code{BeginDotMargin3} @cindex @code{EndDotMargin3} @cindex @code{DotMargin3} @cindex @code{DotMargins3} @cindex @code{Margin3} @cindex @code{TrueMargin3} Module @code{three} also defines the three-dimensional margins @code{NoMargin3}, @code{BeginMargin3}, @code{EndMargin3}, @code{Margin3}, @code{Margins3}, @code{BeginPenMargin2}, @code{EndPenMargin2}, @code{PenMargin2}, @code{PenMargins2}, @code{BeginPenMargin3}, @code{EndPenMargin3}, @code{PenMargin3}, @code{PenMargins3}, @code{BeginDotMargin3}, @code{EndDotMargin3}, @code{DotMargin3}, @code{DotMargins3}, @code{Margin3}, and @code{TrueMargin3}. @cindex @code{pixel} The routine @verbatim void pixel(picture pic=currentpicture, triple v, pen p=currentpen, real width=1); @end verbatim @noindent can be used to draw on picture @code{pic} a pixel of width @code{width} at position @code{v} using pen @code{p}. Further three-dimensional examples are provided in the files @code{@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/near_earth.html,,near_earth}@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/near_earth.asy,,.asy}}, @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/conicurv.html,,conicurv}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/conicurv.asy,,.asy}}, and (in the @code{animations} subdirectory) @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/cube.html,,cube}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/cube.asy,,.asy}}. @anchor{PostScript3D} @cindex 3D @code{PostScript} Limited support for projected vector graphics (effectively three-dimensional nonrendered @code{PostScript}) is available with the setting @code{render=0}. This currently only works for piecewise planar surfaces, such as those produced by the parametric @code{surface} routines in the @code{graph3} module. Surfaces produced by the @code{solids} module will also be properly rendered if the parameter @code{nslices} is sufficiently large. @cindex hidden surface removal @cindex @code{face} In the module @code{bsp}, hidden surface removal of planar pictures is implemented using a binary space partition and picture clipping. A planar path is first converted to a structure @code{face} derived from @code{picture}. A @code{face} may be given to a two-dimensional drawing routine in place of any @code{picture} argument. An array of such faces may then be drawn, removing hidden surfaces: @verbatim void add(picture pic=currentpicture, face[] faces, projection P=currentprojection); @end verbatim Labels may be projected to two dimensions, using projection @code{P}, onto the plane passing through point @code{O} with normal @code{cross(u,v)} by multiplying it on the left by the transform @verbatim transform transform(triple u, triple v, triple O=O, projection P=currentprojection); @end verbatim Here is an example that shows how a binary space partition may be used to draw a two-dimensional vector graphics projection of three orthogonal intersecting planes: @verbatiminclude planes.asy @sp 1 @center @image{./planes} @node obj @section @code{obj} @cindex @code{obj} This module allows one to construct surfaces from simple obj files, as illustrated in the example files @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/galleon.html,,galleon}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/galleon.asy,,.asy}} and @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/triceratops.html,,triceratops}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/triceratops.asy,,.asy}}. @node graph3 @section @code{graph3} @cindex @code{graph3} @cindex 3D graphs This module implements three-dimensional versions of the functions in @code{graph.asy}. @cindex @code{xaxis3} @cindex @code{yaxis3} @cindex @code{zaxis3} To draw an @math{x} axis in three dimensions, use the routine @verbatim void xaxis3(picture pic=currentpicture, Label L="", axis axis=YZZero, real xmin=-infinity, real xmax=infinity, pen p=currentpen, ticks3 ticks=NoTicks3, arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=false, projection P=currentprojection); @end verbatim @noindent Analogous routines @code{yaxis} and @code{zaxis} can be used to draw @math{y} and @math{z} axes in three dimensions. There is also a routine for drawing all three axis: @verbatim void axes3(picture pic=currentpicture, Label xlabel="", Label ylabel="", Label zlabel="", bool extend=false, triple min=(-infinity,-infinity,-infinity), triple max=(infinity,infinity,infinity), pen p=currentpen, arrowbar3 arrow=None, margin3 margin=NoMargin3, projection P=currentprojection); @end verbatim @cindex @code{YZEquals} @cindex @code{XZEquals} @cindex @code{XYEquals} @cindex @code{YZZero} @cindex @code{XZZero} @cindex @code{XYZero} @cindex @code{Bounds} @noindent The predefined three-dimensional axis types are @verbatim axis YZEquals(real y, real z, triple align=O, bool extend=false); axis XZEquals(real x, real z, triple align=O, bool extend=false); axis XYEquals(real x, real y, triple align=O, bool extend=false); axis YZZero(triple align=O, bool extend=false); axis XZZero(triple align=O, bool extend=false); axis XYZero(triple align=O, bool extend=false); axis Bounds(int type=Both, int type2=Both, triple align=O, bool extend=false); @end verbatim @noindent The optional @code{align} parameter to these routines can be used to specify the default axis and tick label alignments. The @code{Bounds} axis accepts two type parameters, each of which must be one of @code{Min}, @code{Max}, or @code{Both}. These parameters specify which of the four possible three-dimensional bounding box edges should be drawn. @cindex @code{NoTicks3} @cindex @code{InTicks} @cindex @code{OutTicks} @cindex @code{InOutTicks} The three-dimensional tick options are @code{NoTicks3}, @code{InTicks}, @code{OutTicks}, and @code{InOutTicks}. These specify the tick directions for the @code{Bounds} axis type; other axis types inherit the direction that would be used for the @code{Bounds(Min,Min)} axis. Here is an example of a helix and bounding box axes with ticks and axis labels, using orthographic projection: @verbatiminclude helix.asy @sp 1 @center @image{./helix} The next example illustrates three-dimensional @math{x}, @math{y}, and @math{z} axes, without autoscaling of the axis limits: @cindex @code{axis} @verbatiminclude axis3.asy @sp 1 @center @image{./axis3} One can also place ticks along a general three-dimensional axis: @cindex @code{axis} @verbatiminclude generalaxis3.asy @sp 1 @center @image{./generalaxis3} @cindex @code{surface} @cindex @code{Spline} @cindex parametric surface Surface plots of matrices and functions over the region @code{box(a,b)} in the @math{XY} plane are also implemented: @verbatim surface surface(real[][] f, pair a, pair b, bool[][] cond={}); surface surface(real[][] f, pair a, pair b, splinetype xsplinetype, splinetype ysplinetype=xsplinetype, bool[][] cond={}); surface surface(real[][] f, real[] x, real[] y, splinetype xsplinetype=null, splinetype ysplinetype=xsplinetype, bool[][] cond={}) surface surface(triple[][] f, bool[][] cond={}); surface surface(real f(pair z), pair a, pair b, int nx=nmesh, int ny=nx, bool cond(pair z)=null); surface surface(real f(pair z), pair a, pair b, int nx=nmesh, int ny=nx, splinetype xsplinetype, splinetype ysplinetype=xsplinetype, bool cond(pair z)=null); surface surface(triple f(pair z), real[] u, real[] v, splinetype[] usplinetype, splinetype[] vsplinetype=Spline, bool cond(pair z)=null); surface surface(triple f(pair z), pair a, pair b, int nu=nmesh, int nv=nu, bool cond(pair z)=null); surface surface(triple f(pair z), pair a, pair b, int nu=nmesh, int nv=nu, splinetype[] usplinetype, splinetype[] vsplinetype=Spline, bool cond(pair z)=null); @end verbatim @noindent The final two versions draw parametric surfaces for a function @math{f(u,v)} over the parameter space @code{box(a,b)}, as illustrated in the example @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/parametricsurface.html,,parametricsurface}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/parametricsurface.asy,,.asy}}. An optional splinetype @code{Spline} may be specified. The boolean array or function @code{cond} can be used to control which surface mesh cells are actually drawn (by default all mesh cells over @code{box(a,b)} are drawn). @cindex @code{surface} One can also construct the surface generated by rotating a path @code{g} between @code{angle1} to @code{angle2} (in degrees) sampled @code{n} times about the line @code{c--c+axis}: @verbatim surface surface(triple c, path3 g, triple axis, int n=nslice, real angle1=0, real angle2=360, pen color(int i, real j)=null); @end verbatim @noindent @cindex @code{color} The optional argument @code{color(int i, real j)} can be used to override the surface color at the point obtained by rotating vertex @code{i} by angle @code{j} (in degrees). @noindent Surface lighting is illustrated in the example files @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/parametricsurface.html,,parametricsurface}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/parametricsurface.asy,,.asy}} and @code{@uref{https://asymptote.sourceforge.io/gallery/3D graphs/sinc.html,,sinc}@uref{https://asymptote.sourceforge.io/gallery/3D graphs/sinc.asy,,.asy}}. Lighting can be disabled by setting @code{light=nolight}, as in this example of a Gaussian surface: @anchor{GaussianSurface} @verbatiminclude GaussianSurface.asy @sp 1 @center @image{./GaussianSurface} @noindent A mesh can be drawn without surface filling by specifying @code{nullpen} for the surfacepen. A vector field of @code{nu}@math{\times}@code{nv} arrows on a parametric surface @code{f} over @code{box(a,b)} can be drawn with the routine @cindex @code{vectorfield3} @verbatim picture vectorfield(path3 vector(pair v), triple f(pair z), pair a, pair b, int nu=nmesh, int nv=nu, bool truesize=false, real maxlength=truesize ? 0 : maxlength(f,a,b,nu,nv), bool cond(pair z)=null, pen p=currentpen, arrowbar3 arrow=Arrow3, margin3 margin=PenMargin3) @end verbatim as illustrated in the examples @code{@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/vectorfield3.html,,vectorfield3}@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/vectorfield3.asy,,.asy}} and @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/vectorfieldsphere.html,,vectorfieldsphere}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/vectorfieldsphere.asy,,.asy}}. @node grid3 @section @code{grid3} @cindex @code{grid3} @cindex 3D grids This module, contributed by Philippe Ivaldi, can be used for drawing 3D grids. Here is an example (further examples can be found in @code{grid3.asy} and at @url{https://web.archive.org/web/20201130113133/http://www.piprime.fr/files/asymptote/grid3/}): @verbatiminclude grid3xyz.asy @sp 1 @center @image{./grid3xyz} @node solids @section @code{solids} @cindex @code{solids} This solid geometry module defines a structure @code{revolution} that can be used to fill and draw surfaces of revolution. The following example uses it to display the outline of a circular cylinder of radius 1 with axis @code{O--1.5unit(Y+Z)} with perspective projection: @verbatiminclude cylinderskeleton.asy @sp 1 @center @image{./cylinderskeleton} Further illustrations are provided in the example files @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/cylinder.html,,cylinder}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/cylinder.asy,,.asy}}, @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/cones.html,,cones}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/cones.asy,,.asy}}, @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/hyperboloid.html,,hyperboloid}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/hyperboloid.asy,,.asy}}, and @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/torus.html,,torus}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/torus.asy,,.asy}}. The structure @code{skeleton} contains the three-dimensional wireframe used to visualize a volume of revolution: @verbatim struct skeleton { struct curve { path3[] front; path3[] back; } // transverse skeleton (perpendicular to axis of revolution) curve transverse; // longitudinal skeleton (parallel to axis of revolution) curve longitudinal; } @end verbatim @node tube @section @code{tube} @cindex @code{tube} This module extends the @code{tube} surfaces constructed in @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/three_arrows.html,,three_arrows}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/three_arrows.asy,,.asy}} to arbitrary cross sections, colors, and spine transformations. The routine @verbatim surface tube(path3 g, coloredpath section, transform T(real)=new transform(real t) {return identity();}, real corner=1, real relstep=0); @end verbatim @noindent draws a tube along @code{g} with cross section @code{section}, after applying the transformation @code{T(t)} at @code{point(g,t)}. The parameter @code{corner} controls the number of elementary tubes at the angular points of @code{g}. A nonzero value of @code{relstep} specifies a fixed relative time step (in the sense of @code{relpoint(g,t)}) to use in constructing elementary tubes along @code{g}. The type @code{coloredpath} is a generalization of @code{path} to which a @code{path} can be cast: @cindex @code{coloredpath} @verbatim struct coloredpath { path p; pen[] pens(real); int colortype=coloredSegments; } @end verbatim @noindent @cindex @code{coloredSegments} @cindex @code{coloredNodes} Here @code{p} defines the cross section and the method @code{pens(real t)} returns an array of pens (interpreted as a cyclic array) used for shading the tube patches at @code{relpoint(g,t)}. If @code{colortype=coloredSegments}, the tube patches are filled as if each segment of the section was colored with the pen returned by @code{pens(t)}, whereas if @code{colortype=coloredNodes}, the tube components are vertex shaded as if the nodes of the section were colored. A @code{coloredpath} can be constructed with one of the routines: @verbatim coloredpath coloredpath(path p, pen[] pens(real), int colortype=coloredSegments); coloredpath coloredpath(path p, pen[] pens=new pen[] {currentpen}, int colortype=coloredSegments); coloredpath coloredpath(path p, pen pen(real)); @end verbatim @noindent In the second case, the pens are independent of the relative time. In the third case, the array of pens contains only one pen, which depends of the relative time. The casting of @code{path} to @code{coloredpath} allows the use of a @code{path} instead of a @code{coloredpath}; in this case the shading behavior is the default shading behavior for a surface. An example of @code{tube} is provided in the file @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/trefoilknot.html,,trefoilknot}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/trefoilknot.asy,,.asy}}. Further examples can be found at @url{https://web.archive.org/web/20201130113133/http://www.piprime.fr/files/asymptote/tube}. @node flowchart @section @code{flowchart} @cindex @code{flowchart} This module provides routines for drawing flowcharts. The primary structure is a @code{block}, which represents a single block on the flowchart. The following eight functions return a position on the appropriate edge of the block, given picture transform @code{t}: @verbatim pair block.top(transform t=identity()); pair block.left(transform t=identity()); pair block.right(transform t=identity()); pair block.bottom(transform t=identity()); pair block.topleft(transform t=identity()); pair block.topright(transform t=identity()); pair block.bottomleft(transform t=identity()); pair block.bottomright(transform t=identity()); @end verbatim @cindex @code{block.top} @cindex @code{block.left} @cindex @code{block.right} @cindex @code{block.bottom} @cindex @code{block.topleft} @cindex @code{block.topright} @cindex @code{block.bottomleft} @cindex @code{block.bottomright} @noindent To obtain an arbitrary position along the boundary of the block in user coordinates, use: @verbatim pair block.position(real x, transform t=identity()); @end verbatim @cindex @code{block.position} @noindent @cindex @code{block.center} The center of the block in user coordinates is stored in @code{block.center} and the block size in @code{PostScript} coordinates is given by @code{block.size}. @noindent A frame containing the block is returned by @verbatim frame block.draw(pen p=currentpen); @end verbatim @cindex @code{block.draw} The following block generation routines accept a Label, string, or frame for their object argument: @table @dfn @item rectangular block with an optional header (and padding @code{dx} around header and body): @cindex @code{rectangle} @verbatim block rectangle(object header, object body, pair center=(0,0), pen headerpen=mediumgray, pen bodypen=invisible, pen drawpen=currentpen, real dx=3, real minheaderwidth=minblockwidth, real minheaderheight=minblockwidth, real minbodywidth=minblockheight, real minbodyheight=minblockheight); block rectangle(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real dx=3, real minwidth=minblockwidth, real minheight=minblockheight); @end verbatim @item parallelogram block: @cindex @code{parallelogram} @verbatim block parallelogram(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real dx=3, real slope=2, real minwidth=minblockwidth, real minheight=minblockheight); @end verbatim @item diamond-shaped block: @cindex @code{diamond} @verbatim block diamond(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real ds=5, real dw=1, real height=20, real minwidth=minblockwidth, real minheight=minblockheight); @end verbatim @item circular block: @cindex @code{circle} @verbatim block circle(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real dr=3, real mindiameter=mincirclediameter); @end verbatim @item rectangular block with rounded corners: @cindex @code{roundrectangle} @verbatim block roundrectangle(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real ds=5, real dw=0, real minwidth=minblockwidth, real minheight=minblockheight); @end verbatim @item rectangular block with beveled edges: @cindex @code{bevel} @verbatim block bevel(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real dh=5, real dw=5, real minwidth=minblockwidth, real minheight=minblockheight); @end verbatim @end table To draw paths joining the pairs in @code{point} with right-angled lines, use the routine: @cindex @code{path} @cindex @code{Horizontal} @cindex @code{Vertical} @verbatim path path(pair point[] ... flowdir dir[]); @end verbatim @noindent The entries in @code{dir} identify whether successive segments between the pairs specified by @code{point} should be drawn in the @code{Horizontal} or @code{Vertical} direction. Here is a simple flowchart example (see also the example @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/controlsystem.html,,controlsystem}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/controlsystem.asy,,.asy}}): @verbatiminclude flowchartdemo.asy @sp 1 @center @image{./flowchartdemo} @node contour @section @code{contour} @cindex @code{contour} This module draws contour lines. To construct contours corresponding to the values in a real array @code{c} for a function @code{f} on @code{box(a,b)}, use the routine @verbatim guide[][] contour(real f(real, real), pair a, pair b, real[] c, int nx=ngraph, int ny=nx, interpolate join=operator --, int subsample=1); @end verbatim @noindent The integers @code{nx} and @code{ny} define the resolution. The default resolution, @code{ngraph x ngraph} (here @code{ngraph} defaults to @code{100}) can be increased for greater accuracy. The default interpolation operator is @code{operator --} (linear). Spline interpolation (@code{operator ..}) may produce smoother contours but it can also lead to overshooting. The @code{subsample} parameter indicates the number of interior points that should be used to sample contours within each @code{1 x 1} box; the default value of @code{1} is usually sufficient. To construct contours for an array of data values on a uniform two-dimensional lattice on @code{box(a,b)}, use @verbatim guide[][] contour(real[][] f, pair a, pair b, real[] c, interpolate join=operator --, int subsample=1); @end verbatim To construct contours for an array of data values on a nonoverlapping regular mesh specified by the two-dimensional array @code{z}, @verbatim guide[][] contour(pair[][] z, real[][] f, real[] c, interpolate join=operator --, int subsample=1); @end verbatim @noindent To construct contours for an array of values @code{f} specified at irregularly positioned points @code{z}, use the routine @verbatim guide[][] contour(pair[] z, real[] f, real[] c, interpolate join=operator --); @end verbatim @noindent The contours themselves can be drawn with one of the routines @verbatim void draw(picture pic=currentpicture, Label[] L=new Label[], guide[][] g, pen p=currentpen); void draw(picture pic=currentpicture, Label[] L=new Label[], guide[][] g, pen[] p); @end verbatim The following simple example draws the contour at value @code{1} for the function @math{z=x^2+y^2}, which is a unit circle: @verbatiminclude onecontour.asy @sp 1 @center @image{./onecontour} The next example draws and labels multiple contours for the function @math{z=x^2-y^2} with the resolution @code{100 x 100}, using a dashed pen for negative contours and a solid pen for positive (and zero) contours: @verbatiminclude multicontour.asy @sp 1 @center @image{./multicontour} The next examples illustrates how contour lines can be drawn on color density images, with and without palette quantization: @verbatiminclude fillcontour.asy @sp 1 @center @image{./fillcontour} @verbatiminclude imagecontour.asy @sp 1 @center @image{./imagecontour} Finally, here is an example that illustrates the construction of contours from irregularly spaced data: @verbatiminclude irregularcontour.asy @sp 1 @center @image{./irregularcontour} In the above example, the contours of irregularly spaced data are constructed by first creating a triangular mesh from an array @code{z} of pairs: @cindex @code{triangulate} @verbatim int[][] triangulate(pair[] z); @end verbatim @verbatiminclude triangulate.asy @sp 1 @center @image{./triangulate} The example @code{@uref{https://asymptote.sourceforge.io/gallery/PDFs/Gouraudcontour.pdf,,Gouraudcontour}@uref{https://asymptote.sourceforge.io/gallery/PDFs/Gouraudcontour.asy,,.asy}} illustrates how to produce color density images over such irregular triangular meshes. @code{Asymptote} uses a robust version of Paul Bourke's Delaunay triangulation algorithm based on the public-domain exact arithmetic predicates written by Jonathan Shewchuk. @node contour3 @section @code{contour3} @cindex @code{contour3} This module draws surfaces described as the null space of real-valued functions of @math{(x,y,z)} or @code{real[][][]} matrices. Its usage is illustrated in the example file @code{@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/magnetic.html,,magnetic}@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/magnetic.asy,,.asy}}. @node smoothcontour3 @section @code{smoothcontour3} @cindex @code{smoothcontour3} This module, written by Charles Staats, draws implicitly defined surfaces with smooth appearance. The purpose of this module is similar to that of @code{contour3}: given a real-valued function @math{f(x,y,z)}, construct the surface described by the equation @math{f(x,y,z) = 0}. The @code{smoothcontour3} module generally produces nicer results than @code{contour3}, but takes longer to compile. Additionally, the algorithm assumes that the function and the surface are both smooth; if they are not, then @code{contour3} may be a better choice. To construct the null surface of a function @code{f(triple)} or @code{ff(real,real,real)} over @code{box(a,b)}, use the routine @cindex @code{implicitsurface} @verbatim surface implicitsurface(real f(triple)=null, real ff(real,real,real)=null, triple a, triple b, int n=nmesh, bool keyword overlapedges=false, int keyword nx=n, int keyword ny=n, int keyword nz=n, int keyword maxdepth=8, bool usetriangles=true); @end verbatim @noindent The optional parameter @code{overlapedges} attempts to compensate for an artifact that can cause the renderer to ``see through'' the boundary between patches. Although it defaults to @code{false}, it should usually be set to @code{true}. The example @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/genustwo.html,,genustwo}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/genustwo.asy,,.asy}} illustrates the use of this function. Additional examples, together with a more in-depth explanation of the module's usage and pitfalls, are available at @url{https://github.com/charlesstaats/smoothcontour3}. @node slopefield @section @code{slopefield} @cindex @code{slopefield} To draw a slope field for the differential equation @math{dy/dx=f(x,y)} (or @math{dy/dx=f(x)}), use: @verbatim picture slopefield(real f(real,real), pair a, pair b, int nx=nmesh, int ny=nx, real tickfactor=0.5, pen p=currentpen, arrowbar arrow=None); @end verbatim @noindent Here, the points @code{a} and @code{b} are the lower left and upper right corners of the rectangle in which the slope field is to be drawn, @code{nx} and @code{ny} are the respective number of ticks in the @math{x} and @math{y} directions, @code{tickfactor} is the fraction of the minimum cell dimension to use for drawing ticks, and @code{p} is the pen to use for drawing the slope fields. The return value is a picture that can be added to @code{currentpicture} via the @code{add(picture)} command. The function @cindex @code{curve} @verbatim path curve(pair c, real f(real,real), pair a, pair b); @end verbatim @noindent takes a point (@code{c}) and a slope field-defining function @code{f} and returns, as a path, the curve passing through that point. The points @code{a} and @code{b} represent the rectangular boundaries over which the curve is interpolated. Both @code{slopefield} and @code{curve} alternatively accept a function @code{real f(real)} that depends on @math{x} only, as seen in this example: @verbatiminclude slopefield1.asy @sp 1 @center @image{./slopefield1} @node ode @section @code{ode} @cindex @code{ode} The @code{ode} module, illustrated in the example @code{@uref{https://raw.githubusercontent.com/vectorgraphics/asymptote/HEAD/examples/odetest.asy,,odetest.asy}}, implements a number of explicit numerical integration schemes for ordinary differential equations. @node Options @chapter Command-line options @cindex options @cindex command-line options Type @code{asy -h} to see the full list of command-line options supported by @code{Asymptote}: @verbatiminclude options All boolean options can be negated by prepending @code{no} to the option name. If no arguments are given, @code{Asymptote} runs in interactive mode (@pxref{Interactive mode}). In this case, the default output file is @code{out.eps}. If @code{-} is given as the file argument, @code{Asymptote} reads from standard input. If multiple files are specified, they are treated as separate @code{Asymptote} runs. @cindex @code{autoimport} If the string @code{autoimport} is nonempty, a module with this name is automatically imported for each run as the final step in loading module @code{plain}. @anchor{configuration file} @cindex configuration file @cindex @code{ASYMPTOTE_CONFIG} @cindex @code{config} @cindex @code{settings} @anchor{settings} Default option values may be entered as @code{Asymptote} code in a configuration file named @code{config.asy} (or the file specified by the environment variable @code{ASYMPTOTE_CONFIG} or @code{-config} option). @code{Asymptote} will look for this file in its usual search path (@pxref{Search paths}). Typically the configuration file is placed in the @code{.asy} directory in the user's home directory (@code{%USERPROFILE%\.asy} under @code{MSDOS}). Configuration variables are accessed using the long form of the option names: @verbatim import settings; outformat="pdf"; batchView=false; interactiveView=true; batchMask=false; interactiveMask=true; @end verbatim Command-line options override these defaults. Most configuration variables may also be changed at runtime. @cindex @code{dvipsOptions} @cindex @code{dvisvgmOptions} @cindex @code{hyperrefOptions} @cindex @code{convertOptions} @cindex @code{gsOptions} @cindex @code{htmlviewerOptions} @cindex @code{psviewerOptions} @cindex @code{pdfviewerOptions} @cindex @code{pdfreloadOptions} @cindex @code{glOptions} The advanced configuration variables @code{dvipsOptions}, @code{hyperrefOptions}, @code{convertOptions}, @code{gsOptions}, @code{htmlviewerOptions}, @code{psviewerOptions}, @code{pdfviewerOptions}, @code{pdfreloadOptions}, @code{glOptions}, and @code{dvisvgmOptions} allow specialized options to be passed as a string to the respective applications or libraries. The default value of @code{hyperrefOptions} is @code{setpagesize=false,unicode,pdfborder=0 0 0}. If you insert @verbatim import plain; settings.autoplain=true; @end verbatim @noindent at the beginning of the configuration file, it can contain arbitrary @code{Asymptote} code. @cindex @code{magick} @cindex @code{output} @cindex @code{format} @cindex @code{ImageMagick} @cindex @code{render} @cindex @code{antialias} @cindex @code{size} @cindex @code{latex} @cindex @code{tex} @cindex @code{pdflatex} @cindex @code{xelatex} @cindex @code{context} @cindex @code{luatex} @cindex @code{lualatex} @cindex @code{EPS} @cindex @code{PDF} @anchor{texengines} @anchor{magick} The default output format is @acronym{EPS} for the (default) @code{latex} and @code{tex} tex engine and @acronym{PDF} for the @code{pdflatex}, @code{xelatex}, @code{context}, @code{luatex}, and @code{lualatex} tex engines. Alternative output formats may be produced using the @code{-f} option (or @code{outformat} setting). @cindex @code{SVG} @cindex @code{dvisvgm} @cindex @code{graphic} To produce @acronym{SVG} output, you will need @code{dvisvgm} (version 3.2.1 or later) from @url{https://dvisvgm.de}, which can display @acronym{SVG} output (used by the @code{xasy} editor) for embedded @acronym{EPS}, @acronym{PDF}, @acronym{PNG}, and @acronym{JPEG} images included with the @code{graphic()} function. The generated output is optimized with the default setting @code{settings.dvisvgmOptions="--optimize"}. @code{Asymptote} can also produce any output format supported by the @code{ImageMagick} @code{magick} program (version 7 or later. The optional setting @code{-render n} requests an output resolution of @code{n} pixels per @code{bp}. Antialiasing is controlled by the parameter @code{antialias}, which by default specifies a sampling width of 2 pixels. To give other options to @code{magick}, use the @code{convertOptions} setting or call @code{magick convert} manually. This example emulates how @code{Asymptote} produces antialiased @code{tiff} output at one pixel per @code{bp}: @verbatim asy -o - venn | magick convert -alpha Off -density 144x144 -geometry 50%x eps:- venn.tiff @end verbatim @cindex @code{nosafe} @cindex @code{safe} @cindex @code{system} If the option @code{-nosafe} is given, @code{Asymptote} runs in unsafe mode. This enables the @code{int system(string s)} and @code{int system(string[] s)} calls, allowing one to execute arbitrary shell commands. The default mode, @code{-safe}, disables this call. @cindex offset @cindex @code{aligndir} A @code{PostScript} offset may be specified as a pair (in @code{bp} units) with the @code{-O} option: @verbatim asy -O 0,0 file @end verbatim @noindent The default offset is zero. The pair @code{aligndir} specifies an optional direction on the boundary of the page (mapped to the rectangle [-1,1]@math{\times}[-1,1]) to which the picture should be aligned; the default value @code{(0,0)} species center alignment. @cindex @code{-c} The @code{-c} (@code{command}) option may be used to execute arbitrary @code{Asymptote} code on the command line as a string. It is not necessary to terminate the string with a semicolon. Multiple @code{-c} options are executed in the order they are given. For example @verbatim asy -c 2+2 -c "sin(1)" -c "size(100); draw(unitsquare)" @end verbatim @noindent produces the output @verbatim 4 0.841470984807897 @end verbatim @noindent and draws a unitsquare of size @code{100}. @cindex @code{-u} The @code{-u} (@code{user}) option may be used to specify arbitrary @code{Asymptote} settings on the command line as a string. It is not necessary to terminate the string with a semicolon. Multiple @code{-u} options are executed in the order they are given. Command-line code like @code{-u x=sqrt(2)} can be executed within a module like this: @verbatim real x; usersetting(); write(x); @end verbatim @cindex @code{-l} When the @code{-l} (@code{listvariables}) option is used with file arguments, only global functions and variables defined in the specified file(s) are listed. Additional debugging output is produced with each additional @code{-v} option: @table @code @item -v Display top-level module and final output file names. @item -vv Also display imported and included module names and final @code{LaTeX} and @code{dvips} processing information. @item -vvv Also output @code{LaTeX} bidirectional pipe diagnostics. @item -vvvv Also output knot guide solver diagnostics. @item -vvvvv Also output @code{Asymptote} traceback diagnostics. @end table @node Interactive mode @chapter Interactive mode @cindex interactive mode Interactive mode is entered by executing the command @code{asy} with no file arguments. When the @code{-multiline} option is disabled (the default), each line must be a complete @code{Asymptote} statement (unless explicitly continued by a final backslash character @code{\}); it is not necessary to terminate input lines with a semicolon. If one assigns @code{settings.multiline=true}, interactive code can be entered over multiple lines; in this mode, the automatic termination of interactive input lines by a semicolon is inhibited. Multiline mode is useful for cutting and pasting @code{Asymptote} code directly into the interactive input buffer. @cindex @code{%} Interactive mode can be conveniently used as a calculator: expressions entered at the interactive prompt (for which a corresponding @code{write} function exists) are automatically evaluated and written to @code{stdout}. If the expression is non-writable, its type signature will be printed out instead. In either case, the expression can be referred to using the symbol @code{%} in the next line input at the prompt. For example: @verbatim > 2+3 5 > %*4 20 > 1/% 0.05 > sin(%) 0.0499791692706783 > currentpicture > %.size(200,0) > @end verbatim @cindex @code{operator answer} The @code{%} symbol, when used as a variable, is shorthand for the identifier @code{operator answer}, which is set by the prompt after each written expression evaluation. The following special commands are supported only in interactive mode and must be entered immediately after the prompt: @table @code @cindex @code{help} @item help view the manual; @item erase erase @code{currentpicture}; @cindex @code{input} @item reset reset the @code{Asymptote} environment to its initial state, except for changes to the settings module (@pxref{settings}), the current directory (@pxref{cd}), and breakpoints (@pxref{Debugger}); @cindex @code{input} @item input FILE does an interactive reset, followed by the command @code{include FILE}. If the file name @code{FILE} contains nonalphanumeric characters, enclose it with quotation marks. A trailing semi-colon followed by optional @code{Asymptote} commands may be entered on the same line. @cindex @code{quit} @cindex @code{exit} @cindex @code{history} @anchor{history} @item quit exit interactive mode (@code{exit} is a synonym; the abbreviation @code{q} is also accepted unless there exists a top-level variable named @code{q}). @cindex @code{historylines} A history of the most recent 1000 (this number can be changed with the @code{historylines} configuration variable) previous commands will be retained in the file @code{.asy/history} in the user's home directory (unless the command-line option @code{-localhistory} was specified, in which case the history will be stored in the file @code{.asy_history} in the current directory). @end table Typing @code{ctrl-C} interrupts the execution of @code{Asymptote} code and returns control to the interactive prompt. Interactive mode is implemented with the @acronym{GNU} @code{readline} library, with command history and auto-completion. To customize the key bindings, see: @url{https://tiswww.case.edu/php/chet/readline/readline.html} @cindex @code{Python} usage The file @code{asymptote.py} in the @code{Asymptote} system directory provides an alternative way of entering @code{Asymptote} commands interactively, coupled with the full power of @code{Python}. Copy this file to your @code{Python path} and then execute from within @code{Python 3} the commands @verbatim from asymptote import * g=asy() g.size(200) g.draw("unitcircle") g.send("draw(unitsquare)") g.fill("unitsquare, blue") g.clip("unitcircle") g.label("\"$O$\", (0,0), SW") @end verbatim @node GUI @chapter Graphical User Interface @cindex graphical user interface @cindex @acronym{GUI} @cindex mouse @cindex wheel mouse @cindex @code{Button-1} @cindex @code{Button-2} @cindex @code{xasy} @menu * GUI installation:: Installing @code{xasy} * GUI usage:: Using @code{xasy} to edit objects @end menu In the event that adjustments to the final figure are required, the preliminary Graphical User Interface (@acronym{GUI}) @code{xasy} included with @code{Asymptote} allows you to move graphical objects and draw new ones. The modified figure can then be saved as a normal @code{Asymptote} file. @node GUI installation @section GUI installation @cindex GUI installation As @code{xasy} is written in the interactive scripting language @code{Python/Qt}, it requires @code{Python} (@url{https://www.python.org}), along with the @code{Python} packages @code{pyqt5}, @code{cson}, and @code{numpy}: @verbatim pip3 install cson numpy pyqt5 PyQt5.sip @end verbatim Pictures are deconstructed into the @acronym{SVG} image format. Since @code{Qt5} does not support @code{SVG} clipping, you will need the @code{rsvg-convert} utility, which is part of the @code{librsvg2-tools} package on @code{UNIX} systems and the @code{librsvg} package on @code{MacOS X}; under @code{Microsoft Windows}, it is available as @url{https://sourceforge.net/projects/tumagcc/files/rsvg-convert-2.40.20.7z} Ensure that @code{rsvg-convert} is available in @code{PATH}, or specify the location of @code{rsvg-convert} in @code{rsvgConverterPath} option within @code{xasy}'s settings. @cindex @code{dvisvgmMultipleFiles} Deconstruction of a picture into its components is fastest when using the @code{LaTeX} TeX engine. The default setting @code{dvisvgmMultipleFiles=true} speeds up deconstruction under @acronym{PDF} TeX engines. @node GUI usage @section GUI usage @cindex GUI usage @cindex arrow keys @cindex mouse wheel @cindex @code{deconstruct} The arrow keys (or mouse wheel) are convenient for temporarily raising and lowering objects within @code{xasy}, allowing an object to be selected. Pressing the arrow keys will pan while the shift key is held and zoom while the control key is held. The mouse wheel will pan while the alt or shift keys is held and zoom while the control key is held. In translate mode, an object can be dragged coarsely with the mouse or positioned finely with the arrow keys while holding down the mouse button. Deconstruction of compound objects (such as arrows) can be prevented by enclosing them within the commands @verbatim void begingroup(picture pic=currentpicture); void endgroup(picture pic=currentpicture); @end verbatim By default, the elements of a picture or frame will be grouped together on adding them to a picture. However, the elements of a frame added to another frame are not grouped together by default: their elements will be individually deconstructed (@pxref{add}). @node Command-Line Interface @chapter Command-Line Interface @cindex command-line interface @code{Asymptote} code may be sent to the @url{https://asymptote.ualberta.ca} server directly from the command line @itemize @bullet @item SVG output: @code{curl --data-binary 'import venn;' 'asymptote.ualberta.ca:10007?f=svg' | display -} @item HTML output: @code{curl --data-binary @@/usr/local/share/doc/asymptote/examples/Klein.asy 'asymptote.ualberta.ca:10007' -o Klein.html} @item V3D output: @code{curl --data-binary 'import teapot;' 'asymptote.ualberta.ca:10007?f=v3d' -o teapot.v3d} @item PDF output with rendered bitmap at 2 pixels per bp: @code{curl --data-binary 'import teapot;' 'asymptote.ualberta.ca:10007?f=pdf' -o teapot.pdf} @item PDF output with rendered bitmap at 4 pixels per bp: @code{curl --data-binary 'import teapot;' 'asymptote.ualberta.ca:10007?f=pdf&render=4' -o teapot.pdf} @item PRC output: @code{curl --data-binary 'import teapot;' 'asymptote.ualberta.ca:10007?f=pdf&prc' -o teapot.pdf} @item PRC output with rendered preview bitmap at 4 pixels per bp: @code{curl --data-binary 'import teapot;' 'asymptote.ualberta.ca:10007?f=pdf&prc&render=4' -o teapot.pdf} @end itemize The source code for the command-line interface is available at @url{https://github.com/vectorgraphics/asymptote-http-server}. @node Language server protocol @chapter Language server protocol @cindex @acronym{LSP} @cindex language server protocol Under @code{UNIX} and @code{MacOS X}, @code{Asymptote} supports features of the @uref{https://en.wikipedia.org/wiki/Language_Server_Protocol,Language Server Protocol (@acronym{LSP})}, including function signature and variable matching. Under @code{MSWindows}, @code{Asymptote} currently supports @acronym{LSP} only when compiled within the @code{Windows Subsystem for Linux}. @code{Emacs} users can enable the @code{Asymptote} language server protocol by installing @code{lsp-mode} using the following procedure: @itemize @bullet @item Add to the @code{.emacs} initialization file: @verbatim (require 'package) (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) (package-initialize) @end verbatim @item Launch emacs and execute @verbatim M-x package-refresh-contents M-x package-install @end verbatim and select @code{lsp-mode}. @item Add to the @code{.emacs} initialization file: @verbatim (require 'lsp-mode) (add-to-list 'lsp-language-id-configuration '(asy-mode . "asymptote")) (lsp-register-client (make-lsp-client :new-connection (lsp-stdio-connection '("asy" "-lsp")) :activation-fn (lsp-activate-on "asymptote") :major-modes '(asy-mode) :server-id 'asyls ) ) @end verbatim @item Launch emacs and execute @verbatim M-x lsp @end verbatim @end itemize @node PostScript to Asymptote @chapter @code{PostScript} to @code{Asymptote} @cindex @code{pstoedit} The excellent @code{PostScript} editor @code{pstoedit} (version 3.50 or later; available from @url{https://sourceforge.net/projects/pstoedit/}) includes an @code{Asymptote} backend. Unlike virtually all other @code{pstoedit} backends, this driver includes native clipping, even-odd fill rule, @code{PostScript} subpath, and full image support. Here is an example: @noindent @code{asy -V @value{Datadir}/doc/asymptote/examples/venn.asy} @verbatim pstoedit -f asy venn.eps test.asy asy -V test @end verbatim @noindent If the line widths aren't quite correct, try giving @code{pstoedit} the @code{-dis} option. If the fonts aren't typeset correctly, try giving @code{pstoedit} the @code{-dt} option. @node Help @chapter Help @cindex help @cindex forum A list of frequently asked questions (@acronym{FAQ}) is maintained at @quotation @url{https://asymptote.sourceforge.io/FAQ} @end quotation @noindent Questions on installing and using @code{Asymptote} that are not addressed in the @acronym{FAQ} should be sent to the @code{Asymptote} forum: @quotation @url{https://sourceforge.net/p/asymptote/discussion/409349} @end quotation @noindent Including an example that illustrates what you are trying to do will help you get useful feedback. @code{LaTeX} problems can often be diagnosed with the @code{-vv} or @code{-vvv} command-line options. Contributions in the form of patches or @code{Asymptote} modules can be posted here: @quotation @url{https://sourceforge.net/p/asymptote/patches} @end quotation @noindent To receive announcements of upcoming releases, please subscribe to @code{Asymptote} at @quotation @url{https://sourceforge.net/projects/asymptote/} @end quotation @cindex bug reports @noindent If you find a bug in @code{Asymptote}, please check (if possible) whether the bug is still present in the latest @code{git} developmental code (@pxref{Git}) before submitting a bug report. New bugs can be reported at @quotation @url{https://github.com/vectorgraphics/asymptote/issues} @end quotation @noindent To see if the bug has already been fixed, check bugs with Status @code{Closed} and recent lines in @quotation @url{https://asymptote.sourceforge.io/ChangeLog} @end quotation @noindent @cindex stack overflow @cindex segmentation fault @cindex @code{libsigsegv} @code{Asymptote} can be configured with the optional @acronym{GNU} library @code{libsigsegv}, available from @url{https://www.gnu.org/software/libsigsegv/}, which allows one to distinguish user-generated @code{Asymptote} stack overflows (@pxref{stack overflow}) from true segmentation faults (due to internal C++ programming errors; please submit the @code{Asymptote} code that generates such segmentation faults along with your bug report). @node Debugger @chapter Debugger @cindex debugger Asymptote now includes a line-based (as opposed to code-based) debugger that can assist the user in following flow control. To set a break point in file @code{file} at line @code{line}, use the command @cindex @code{stop} @verbatim void stop(string file, int line, code s=quote{}); @end verbatim @noindent The optional argument @code{s} may be used to conditionally set the variable @code{ignore} in @code{plain_debugger.asy} to @code{true}. For example, the first 10 instances of this breakpoint will be ignored (the variable @code{int count=0} is defined in @code{plain_debugger.asy}): @verbatim stop("test",2,quote{ignore=(++count <= 10);}); @end verbatim To set a break point in file @code{file} at the first line containing the string @code{text}, use @verbatim void stop(string file, string text, code s=quote{}); @end verbatim @noindent To list all breakpoints, use: @cindex @code{breakpoints} @verbatim void breakpoints(); @end verbatim @noindent To clear a breakpoint, use: @cindex @code{clear} @verbatim void clear(string file, int line); @end verbatim @noindent To clear all breakpoints, use: @verbatim void clear(); @end verbatim The following commands may be entered at the debugging prompt: @table @code @cindex @code{help} @item @code{h} help; @cindex @code{continue} @item @code{c} continue execution; @cindex @code{inst} @item @code{i} step to the next instruction; @cindex @code{step} @item @code{s} step to the next executable line; @cindex @code{next} @item @code{n} step to the next executable line in the current file; @cindex @code{file} @item @code{f} step to the next file; @cindex @code{return} @item @code{r} return to the file associated with the most recent breakpoint; @cindex @code{trace} @item @code{t} toggle tracing (@code{-vvvvv}) mode; @cindex @code{quit} @item @code{q} quit debugging and end execution; @cindex @code{exit} @item @code{x} exit the debugger and run to completion. @end table @noindent Arbitrary @code{Asymptote} code may also be entered at the debugging prompt; however, since the debugger is implemented with @code{eval}, currently only top-level (global) variables can be displayed or modified. The debugging prompt may be entered manually with the call @verbatim void breakpoint(code s=quote{}); @end verbatim @node Credits @chapter Acknowledgments @cindex acknowledgments Financial support for the development of @code{Asymptote} was generously provided by the Natural Sciences and Engineering Research Council of Canada, the Pacific Institute for Mathematical Sciences, and the University of Alberta Faculty of Science. We also would like to acknowledge the previous work of John D. Hobby, author of the program @code{MetaPost} that inspired the development of @code{Asymptote}, and Donald E. Knuth, author of @TeX{} and @code{MetaFont} (on which @code{MetaPost} is based). The authors of @code{Asymptote} are Andy Hammerlindl, John Bowman, and Tom Prince. Sean Healy designed the @code{Asymptote} logo. Other contributors include Orest Shardt, Jesse Frohlich, Michail Vidiassov, Charles Staats, Philippe Ivaldi, Olivier Guib@'e, Radoslav Marinov, Jeff Samuelson, Chris Savage, Jacques Pienaar, Mark Henning, Steve Melenchuk, Martin Wiebusch, Stefan Knorr, Supakorn ``Jamie'' Rassameemasmuang, Jacob Skitsko, Joseph Chaumont, and Oliver Cheng. Pedram Emami developed the @code{Asymptote Web Application} hosted at @url{https://asymptote.ualberta.ca}: @url{https://github.com/vectorgraphics/asymptoteWebApplication} @node Index @unnumbered Index @printindex cp @bye @c LocalWords: randMax Gaussrand asy cindex indices resized LaTeX TK latin au @c LocalWords: latexusage tex bbox PostScript subdirectory gcc emacs ASYDIR @c LocalWords: documentclass usepackage subpath shipout sqrt xN Mx bw AcroRd @c LocalWords: xscale xaxis yaxis BeginBar GIF postprocessing fpu de rpair xy @c LocalWords: ImageMagick cd asymptote Hy 0pt 1filll 's 3D 2D 'asy @c LocalWords: startup natively xasy tkinter VxN yingyang currentpicture toc @c LocalWords: MetaPost MetaFont Hammerlindl Healy texinfo autoload setq setf @c LocalWords: printindex setfilename settitle dircategory direntry titlepage @c LocalWords: vskip filll insertcopying ifnottex detailmenu alist augroup PQ @c LocalWords: bool behavior facto zxf login Debian dev filetypedetect @c LocalWords: FFTW bp readline gv eps args Boehm gc evenoddoverlap png joe @c LocalWords: boolean initializer expi dir xpart ypart STL substring rfind @c LocalWords: pos substr strftime typedef pxref unitcircle yscale Bezier iff @c LocalWords: postcontrol precontrol atleast nullpath arclength arctime rgb @c LocalWords: dirtime currentpen colorspaces grayscale cmyk defaultpen x cx @c LocalWords: linetype longdashed dashdotted longdashdotted linewidth y XP @c LocalWords: fontsize defaultfilename keepAspect IgnoreAspect ise flushleft @c LocalWords: src dest XDR txt getc fout stdin stdout endl eof js prc ni @c LocalWords: Microsystem's eol exponentials postfix sayhi th Ubuntu @c LocalWords: sqr intop addby libm asin acos atan sinh tanh asinh acosh cbrt @c LocalWords: atanh fabs hypot fmod ceil srand dereferenced alice pete sqrtx @c LocalWords: eval fft csv runtime nonalphanumeric labely LeftTicks NoTicks @c LocalWords: RightTicks BottomTop LeftRight Ticksize UTF BufNewFile BufRead @c LocalWords: ticksize subintervals xlimits filetype plugin setlocal makeprg @c LocalWords: ylimits uncommented automin automax cp uninstall reals ecast @c LocalWords: scaleT RightSide yx yy NoAlign legendmargin opic CCW @c LocalWords: arrowbar LeftSide EndBar BeginArrow lly feynman isi showtarget @c LocalWords: EndArrow BeginArcArrow EndArcArrow ArcArrow ArcArrows NoFill @c LocalWords: filldraw fillpen drawpen errorformat bigsquare bezier darkblue @c LocalWords: quartercircle darkgreen lightblue urx ury texpreamble sgn texi @c LocalWords: lineargraph datagraph vertices parametricgraph uncomment ggv @c LocalWords: loggraph generalaxis texhash arrowsize arrowangle arrowlength @c LocalWords: SuppressQuiet MoveQuiet LIBREADLINE config MacOS prebuilt @c LocalWords: ghostview SIGHUP PDF acroread xpdf cutbefore strptime @c LocalWords: libsigsegv intersectionpoint dotfactor vv firstcut pq logticks @c LocalWords: Unisys dvips vvv vvvv vvvvv traceback lastcut cutafter infodir @c LocalWords: zxvf xargs cond polargraph xmin xmax plabel YZero labelling ln @c LocalWords: ymin ymax XZero xequals tickmin tickmax unlabelled se pq pena @c LocalWords: yequals Nobre Barbarosie Schwaiger nearearth conicurv Wiebusch @c LocalWords: unfill posterSize ngraph interpolatetype ctrl dt pic getint Ai @c LocalWords: NNE jxf linecap linejoin unitsquare shadedtiling ei nomarker @c LocalWords: westnile minipage ra penb paletteticks drawline nV FillDraw uv @c LocalWords: susceptibleM flushright secondaryX secondaryY secondaryaxis tt @c LocalWords: titlelabel columnlabel rb xtick ytick labelx XEquals YEquals @c LocalWords: treetest eetomumu fermi backend pstoedit drawtree xFF MSDOS gz @c LocalWords: vimrc CFLAGS verbatiminclude online noindent bezier superpath @c LocalWords: evenodd squarecap roundcap extendcap miterjoin roundjoin NFSS @c LocalWords: beveljoin fillrule zerowinding insideness lineskip cmr pcrr Hx @c LocalWords: AvantGarde Bookman Helvetica NewCenturySchoolBook minbound pdf @c LocalWords: Palatino TimesRoman ZapfChancery ZapfDingbats german basealign @c LocalWords: nondeconstructed backends usr venn labelsquare nobasealign dp @c LocalWords: NoMargin BeginMargin EndMargin BeginPenMargin EndPenMargin dm @c LocalWords: PenMargin PenMargins TrueMargin labelmargin errorbars errorbar @c LocalWords: dpx dpy dmx dmy barsize arrowsize BeginDotMargin DotMargin acc @c LocalWords: EndDotMargin DotMargins NColors BWRainbow colorspace labelled @c LocalWords: PaletteTicks defaultformat leastsquares bjam fprintf endgroup @c LocalWords: begingroup xmargin ymargin pbox box ellipse wget exe Gouraud @c LocalWords: multithreaded newframe init emph nums concat xline yline zpart @c LocalWords: colatitude zscale cosh nullpen MetaFontbook cyclicflag FreeBSD @c LocalWords: nodeps Ghostgum beginlabel endlabel pTick ptick loggrid SAS dy @c LocalWords: currentprojection latticeshading subpictures colinear unitcube @c LocalWords: Autoscaling solveQuadratic MidArrow MidArcArrow Prebuilt url @c LocalWords: pdftex comment getstring getstringprefix getreal defaultS hsv @c LocalWords: ticklocate autoscaleT autoscaling vectorfield autolimits dvi @c LocalWords: zlimits inline dvipdf hyperdvi autoconf gui zerowindingoverlap @c LocalWords: prepended intMax quadraticroots cubicroots filltype prepend dx @c LocalWords: ticklabel popup UnFill markroutine marknodes markuniform erf @c LocalWords: intersectpoint cyrillic mathtext russian brokenaxis Datadir ds @c LocalWords: resetdefaultpen latticeshade axialshade radialshade erfc det @c LocalWords: gouraudshade unescaped nmesh surfacepen getpair MikTeX dw YZ @c LocalWords: meshpen localhistory axisT roundedpath unitsize aSin accel pre @c LocalWords: fontcommand makepen aCos aTan Knorr roundpath BeginPoint nView @c LocalWords: MidPoint EndPoint nmask antialiasing autoplain batchMask libgc @c LocalWords: batchView clearGUI ignoreGUI interactiveMask interactiveView @c LocalWords: listvariables outformat parseonly prepending psviewer nCircle @c LocalWords: pdfviewer papertype tabcompletion noautoplain plugins Teixeira @c LocalWords: embeddedmovie historylines RadialShade penc penr CJK tgz GPL @c LocalWords: legendlinelength legendskip USERPROFILE LDFLAGS currentlight @c LocalWords: subsampled sinc kai AtBeginDocument GBK clearpage lasy texpath @c LocalWords: AtEndDocument zaxis maxbound truepoint paperwidth paperheight @c LocalWords: GSL deriv texcolors fixedscaling UpsideDown texreset slidedemo @c LocalWords: subitem newslide realMin realMax realEpsilon realDigits gsl dh @c LocalWords: obliqueX asycolors monthaxis xautoscale yautoscale zautoscale @c LocalWords: obliqueZ obliqueY cylinderskeleton block llcorner dr py nx CPU @c LocalWords: loc topleft topright bottomleft bottomright flowrectangle UTC @c LocalWords: chartblock flowdiamond flowcircle xlabel BezierSurface el xyz @c LocalWords: flowroundrectangle flowbevel flowpath drawflow blocks ny cpu @c LocalWords: multipleView usersetting mediumgray flowchartdemo ylabel nv xf @c LocalWords: zlabel slopefields cputime roundrectangle slopefield libgccpp @c LocalWords: tickfactor USERNAME writeable imagecontour logimage Dumoulin's @c LocalWords: NoCrop parametricsurface realmult SoftLight HardLight interp @c LocalWords: ColorDodge ColorBurn Ivaldi buildcycle autorotate mexicanhat @c LocalWords: Gouraudcontour pdflatex preconfigured perline linelength hskip @c LocalWords: penimage filloutside legendhskip legendvskip maxwidth CDlabel @c LocalWords: tensorshade MPEG framepoint nonfunction Radoslav Marinov Mepis @c LocalWords: Pienaar Melenchuk finalout Linspire Dpkg sudo dpkg dtx Tcount @c LocalWords: windingnumber clickable pdfmovie dfn du animationdelay fprime @c LocalWords: slidemovies ifdraft embeddedu externalmovie headerpen bodypen @c LocalWords: GaussianSurface multiline binarytree tridiagonal portably AIX @c LocalWords: binarytreetest Henning subsample breakpoint locator wireframe @c LocalWords: labelpath intersectionpoints PSTricks pstextpath curvedlabel @c LocalWords: LeftJustified RightJustified tickmodifier gunzip gmake IRIX dv @c LocalWords: texcommand RET SITEDIR filegraph pathmarkers POSIX binput AOB @c LocalWords: nonportable markinterval stickframe circlebarframe tix @c LocalWords: crossframe tildeframe markangle StickIntervalMarker gswin expm @c LocalWords: CrossIntervalMarker CircleBarIntervalMarker Ghostscript syzygy @c LocalWords: TildeIntervalMarker autoimport calculateTransform bitwise tk @c LocalWords: headersize bodysize minheaderwidth minheaderheight minwidth ZX @c LocalWords: minbodywidth minbodyheight minheight mindiameter reltime PNG @c LocalWords: relpoint Syzygy syzygies seekeof splinetype notaknot slopea ZY @c LocalWords: slopeb nonperiodic circlescale MarkFill ScaleX ScaleY xformat @c LocalWords: onecontour multicontour irregularcontour dvipsOptions saveline @c LocalWords: dirSpecifier controlSpecifier tensionSpecifier atleastflag bsp @c LocalWords: curlSpecifier cputimeformat initializers arbitary redeclaring @c LocalWords: firstname lastname multdiagonal Raphson OmitTick OmitFormat sp @c LocalWords: NoZero NoZeroFormat abbrevation gsOptions namespace redeclared @c LocalWords: atLeast intMin globalwrite quarticroots deconsruct substrings @c LocalWords: usleep currentpatterns trailingzero Orest Shardt DefaultHead @c LocalWords: SimpleHead HookHead TeXHead multipage inlinemovie dxmax @c LocalWords: simpson NoBox truesize autoscale shadestroke recurses mintimes @c LocalWords: nonoverlapping texengine maxtimes maxheight pdb TEXMFCONFIG Jn @c LocalWords: piecewisestraight unitrand graphmarkers antialias nolight newl @c LocalWords: Delaunay Shewchuk convertOptions APPDATA pdfreload tempFile Yn @c LocalWords: pdfreloadOptions deferred OpenGL renderer unitbox 's @c LocalWords: bezulate Shardt's rasterized viewport unitdisk unitplane devel @c LocalWords: unitcylinder unitcone solidcone unitfrustum unitsphere nslices @c LocalWords: DPostScript YZZero externalprc nonrendered nosafe KDE @c LocalWords: unithemisphere versa XYplane xypart unitsolidcone YZEquals xml @c LocalWords: XZEquals XYEquals XZZero XYZero InTicks OutTicks InOutTicks @c LocalWords: fitscreen planeproject strokepath meshlight nullpens arrowdir @c LocalWords: diffusepen emissivepen specularpen arrowbarb keyval @c LocalWords: hstretch vstretch roundbox nonconvex miterlimit basealign cmd @c LocalWords: maxviewport maxtile antialiased sphericalharmonic attachfile @c LocalWords: vertexshading smoothelevation glOptions iconified iconify kate @c LocalWords: psviewerOptions pdfviewerOptions viewportmargin asyattach SVG @c LocalWords: multisampling autogen multisample coloredpath relstep flowdir @c LocalWords: colortype coloredSegments coloredNodes trefoilknot scaledgraph @c LocalWords: minblockwidth minblockheight mincirclediameter nonassociative @c LocalWords: nonintegral gettriple enablerepo hexadecimal XeLaTeX xelatex @c LocalWords: dvipdfmx autoadjust viewportsize viewportwidth viewportheight @c LocalWords: subregions nonsimply functionshade shader floatingdisk TopView @c LocalWords: functionshading maxlength LeftView odetest RadialShadeDraw CLZ @c LocalWords: vectorfieldsphere RightView FrontView BackView BottomView CTZ @c LocalWords: addViews outprefix addAllViews xsplinetype ysplinetype rotateX @c LocalWords: usplinetype vsplinetype leftbutton middlebutton rightbutton @c LocalWords: rotateY rotateZ wheelup zoomin wheeldown zoomout TeXLive pnorm @c LocalWords: viewportshift signedint signedness psview multiplatform nowarn @c LocalWords: singlereal singleint writeoverloaded dvisvg reddash lexorder @c LocalWords: bigdiagonal autobillboard dvisvgm maxtiles hyperrefOptions xdr @c LocalWords: setpagesize pdfborder controlsystem OmitTickInterval SixViews @c LocalWords: OmitTickIntervals tickmodifiers autorotated SixViewsUS latexmk @c LocalWords: ThreeViewsUS ThreeViewsFR SixViewsFR ThreeViews partialsum @c LocalWords: defaultrender Vidiassov latexmkrc mktemp DOSendl DOSnewl perl @c LocalWords: filename asyinclude latemk penfunctionimage Affine decrement @c LocalWords: affine Redisplay redisplay isnan radians defaultseparator Jens @c LocalWords: ascii piecewise arcpoint spacings tilings sncndn resizing @c LocalWords: differentiable vectorization vectorized asydir normals quartic @c LocalWords: wavepacket kerned parametrized specular hyperboloid Bourke's @c LocalWords: Michail 0pt 1filll 's 3D labelpath3 2D graph3 0pt 3D @c LocalWords: grid3 contour3 x86_64 psv a4 freeglut 'load ' 0pt 's @c LocalWords: 'asy 'lasy 'auto 5bp 1cm sqrtx01 4g extenda extendb @c LocalWords: bb llx 2S 100pt 3t bezier2 bool3 x0 angle1 angle2 z1 @c LocalWords: z2 before' struct X11 x11colors type1cm 12pt OT1 5mm @c LocalWords: cmr12 x' y' xsize ysize 25cm s1 s2 neighbourhood u'' @c LocalWords: s'' 3x 5x 3y 602e 2x 2y 3sin 10cm 204e addby7 10x 's @c LocalWords: only'' pow10 log10 expm1 log1p atan2 0pt 1filll 's ' @c LocalWords: x1 x2 graph2d attachfile2 n0 P0 n1 P1 markers1 3D 2D @c LocalWords: interpolate1 markers2 inlinemovie3 media9 U3D T2A 5E @c LocalWords: embeddedu3d curvedlabel3 value2 tickvalue inner'' 2N @c LocalWords: lineargraph0 scalings log2 log2graph 5cm BWRainbow2 @c LocalWords: guide3 path3 unitcircle3 2E 2n noV 100d PostScript3D @c LocalWords: size3 fit3 theta1 phi1 theta2 phi2 v1 v2 unitsquare3 @c LocalWords: t1 t2 5z 5y transform3 identity4 xscale3 yscale3 0pt @c LocalWords: zscale3 scale3 join3 BeginBar3 EndBar3 Bar3 Bars3 's @c LocalWords: BeginArrow3 MidArrow3 EndArrow3 Arrow3 Arrows3 axes3 @c LocalWords: BeginArcArrow3 MidArcArrow3 EndArcArrow3 ArcArrow3 ' @c LocalWords: ArcArrows3 DefaultHead3 HookHead3 TeXHead3 HookHead2 @c LocalWords: DefaultHead2 TeXHead2 arrows3 NoMargin3 BeginMargin3 @c LocalWords: EndMargin3 Margin3 Margins3 BeginPenMargin2 xaxis3 ' @c LocalWords: EndPenMargin2 PenMargin2 PenMargins2 BeginPenMargin3 @c LocalWords: EndPenMargin3 PenMargin3 PenMargins3 BeginDotMargin3 @c LocalWords: EndDotMargin3 DotMargin3 DotMargins3 TrueMargin3 3D @c LocalWords: yaxis3 zaxis3 ticks3 NoTicks3 arrowbar3 type2 axis3 @c LocalWords: generalaxis3 vectorfield3 margin3 grid3xyz 5unit 2D @c LocalWords: slopefield1 144x144 1filll 'load 'asy 'lasy 'auto 4g @c LocalWords: libgs 'load 'asy 'lasy 'auto 5bp 1cm 2S 100pt 3t 5mm @c LocalWords: bracedefaultratio incircle 12pt 25cm 3x 5x 3y 602e ' @c LocalWords: 2x 2y 3sin 10cm 204e 10x 5E offaxis 'load 'lasy ' 3D @c LocalWords: 5cm 2N 2E 2n 100d 5z 5y 5unit dvisvgmOptions 144x144 @c LocalWords: 4g texengines coplanar 0pt 1filll 's 3D 2D 'load 5bp @c LocalWords: insphere cospherical 5unit luatex lualatex 'asy 1cm @c LocalWords: 'lasy 'auto 4g 2S 100pt 3t 12pt 5mm 25cm 3x 5x 3y 2x @c LocalWords: 602e 2y 3sin 10cm 204e 10x 0pt 1filll 2D DCMAKE CXX @c LocalWords: unnormalized 5E 5cm 2N 2E 2n 100d 5z 5y 0pt 1filll ' @c LocalWords: 5unit 144x144 aligndir smoothcontour3 's 3D 2D cmake @c LocalWords: 'load 'asy 'lasy 'auto 5bp 1cm 4g 2S 100pt 3t nan 3x @c LocalWords: 12pt 5mm 25cm 5x 3y 602e 2x 2y 3sin 10cm 204e 10x 4g @c LocalWords: 5E 5cm 2N 2E 2n 100d 5z 5y nz fcommon 'load 'asy 5bp @c LocalWords: 5unit Staats implicitsurface overlapedges maxdepth ' @c LocalWords: through'' genustwo 144x144 0pt 1filll 's 3D 2D 'load @c LocalWords: 'asy 'lasy 'auto 5bp 1cm 4g 2S 100pt 3t 12pt 5mm 3x @c LocalWords: 25cm 5x 3y 602e 2x 2y 3sin 10cm 204e 10x 'lasy 'auto @c LocalWords: 5E 5cm 2N 2E 2n 100d 5z 5y 5unit 144x144 1cm newpage @c LocalWords: Frohlich codequoteundirected center 0pt 1filll 's 3D @c LocalWords: acknowledgments Colors 2D Color WebGL uref x86 dnf @c LocalWords: htmlviewer asygl CPPFLAGS 'load 'asy 'lasy 'auto 5bp @c LocalWords: 1cm labeling dotfilltype 4g color colors centered 2S @c LocalWords: 100pt 3t forcemath gray colorless miter 12pt 5mm 3x @c LocalWords: zeroTransform 25cm Python3 popcount bitreverse 5x 3y @c LocalWords: 602e 2x 2y 3sin 10cm 204e 10x 2S 100pt 3t 12pt 5mm @c LocalWords: findall ax 5a centers 5E 5cm 2N 2E 2n HTML5 html 3x @c LocalWords: logo3 remeshed css 42kB 100d 5z 5y 5unit colored Qt5 @c LocalWords: behavior beveled usetriangles htmlviewerOptions cson @c LocalWords: 144x144 pyqt5 numpy pip3 PyQt5 rsvg librsvg2 1filll @c LocalWords: librsvg Supakorn Jamie'' Rassameemasmuang 2D Docdir @c LocalWords: microsoft 'load 'asy 'lasy 'auto dep 4g isometry 5x @c LocalWords: 5bp 1cm BezierPatch 2S 100pt 3t abs2 12pt cp1251 5mm @c LocalWords: anttor fontenc inputenc 25cm noglobalread 3x 25cm 3y @c LocalWords: 5x 3y 602e 2x 2y 3sin 10cm 204e 10x libcurl 602e 2x @c LocalWords: mapArray 5a parameterized mapTemplate 5E 2N 2y 3sin @c LocalWords: 5cm freshnel0 fresnel0 PBR prethree specularfactor @c LocalWords: renderers 2E ESC AsyGL 48kB 2n 100d 5z 5y 5unit 10cm @c LocalWords: unicode 144x144 Pedram Emami 204e 10x Ai Ai Ai Ai Ai @c LocalWords: Ai Ai Ai 5a 5E 5cm 2N 2E devicepixelratio 48kB 2n 5z @c LocalWords: 100d 5y 5unit 144x144 2004-23 2004-24 top-level 3D @c LocalWords: 1filll Command-line Command-Line command-line 2D 15 @c LocalWords: higher-order User-defined Python-style Templated V3D @c LocalWords: coordinate-based high-quality high-level de-facto 56 @c LocalWords: command-driven graphical-user-interface full-fledged @c LocalWords: script-generated script-based fixed-sized ASYMPTOTE_ @c LocalWords: user-written Debian-based self-extracting disable-gc @c LocalWords: google-chrome installation-dependent microsoft-edge @c LocalWords: ASYMPTOTE_PAPERTYPE Right-click ASYMPTOTE_DIR C-c 72 @c LocalWords: ASYMPTOTE_HOME asymptote-x DCMAKE_INSTALL_PREFIX M-x @c LocalWords: DCMAKE_C_FLAGS texinfo-tex system-wide asy-mode C-h @c LocalWords: lasy-mode add-to-list 'load-path 'asy-mode asy-kate @c LocalWords: 'lasy-mode 'asy-insinuate-latex 'auto-mode-alist 100 @c LocalWords: two-mode-mode latex-mode space-separated apt-get 5bp @c LocalWords: ASYMPTOTE_SITEDIR build-dep Vector_Graphics_Language @c LocalWords: 1cm double-quoted 06 left-hand right-hand even-odd @c LocalWords: two-dimensional three-dimensional 4g fixed-size a--b @c LocalWords: bottom-left 45 10 picture-transformed plain_Label 2S @c LocalWords: comma-separated boundary-drawing plain_boxes 100pt @c LocalWords: z_0 c_0 z_1 c_1 1-t 3t third-order m_5 first-order @c LocalWords: m_0 m_1 m_2 m_3 m_4 second-order 14 75 1986 x-I 360 @c LocalWords: inflection-free Java-style user-defined built-in a-c @c LocalWords: highest-precision floating-point element-by-element @c LocalWords: a--b--c--cycle b-c counterclockwise-oriented 377 01 @c LocalWords: C-style 1970 02 2007 24 60 non-zero z2-c z1-c b-a 68 @c LocalWords: counter-clockwise t-floor 137 P--Q p--q cubic-spline @c LocalWords: two-element non-default 255 6-character 140 180 375 @c LocalWords: plain_pens z--z 12pt 2018 UTF-8 CJKfamily right-top @c LocalWords: foreground--background left-bottom 5mm 90 25 25cm 50 @c LocalWords: end-of-file one-dimensional 64-bit 32-bit C-like i-1 @c LocalWords: end-of-line asy_history_ path-joining 3x 5x 3y 2x 2y @c LocalWords: 602e-19 3sin 10cm 204e-19 non-function 17 L-values @c LocalWords: so-called 10x 34 43 keyword-only 77 42 Keyword-only @c LocalWords: 21 six-element zero-length n-k Ai_deriv Bi_deriv n-1 @c LocalWords: zero_Ai zero_Bi zero_Ai_deriv zero_Bi_deriv i_scaled @c LocalWords: k_scaled zero_J Newton-Raphson real-valued f_i T2 T1 @c LocalWords: out-of-bounds higher-indexed Dst n-2 realschur schur @c LocalWords: quasitriangular 19 33 white-space Python-like 12 103 @c LocalWords: comma-separated-value non-cyclic 107 Non-bridging 5a @c LocalWords: 866025403784439 non-private d-b templatedModule k-1 @c LocalWords: templatedModule_string_int_real Wrapper_Number 36 5E @c LocalWords: Wrapper_real higher-order Three-dimensional log-log @c LocalWords: two-variable true-element higher-quality post-scaled @c LocalWords: polar-coordinate auto-generated textbook-style 1000 @c LocalWords: scientific-style graphwithderiv least-squares 5cm 38 @c LocalWords: 256 32766 32761 divs quantized fillcontour 67 57 48 @c LocalWords: shape-invariant 2010021-2010022 vice-versa ibl EXR @c LocalWords: three_surface three_light plain_prethree image-based @c LocalWords: pre-rendered imageDir imageURL cudareflect teapotIBL @c LocalWords: patch-dependent vertex-dependent O--X 2N--2E--E 561 @c LocalWords: vertex-specific three-dimensions Ctrl-q iframe 321 @c LocalWords: frameborder 48kB stand-alone 2n 100d v3d pyv3d v2-c @c LocalWords: importv3d v1-c O--O u--O v--O v--cycle x-0 5z y-0 5y @c LocalWords: z-0 O--v u--v a-d b-d c-d near_earth c--c nslice 20 @c LocalWords: O--1 5unit three_arrows diamond-shaped right-angled @c LocalWords: 2-y public-domain in-depth field-defining 144x144 'e @c LocalWords: ASYMPTOTE_CONFIG non-writable 200 semi-colon ctrl-C @c LocalWords: asy_history auto-completion Button-1 Button-2 LSP 's @c LocalWords: rsvg-convert librsvg2-tools dvisvgmMultipleFiles lsp @c LocalWords: data-binary 'import lsp-mode 'package melpa 'asyls @c LocalWords: 'package-archives package-initialize package-install @c LocalWords: package-refresh-contents 'lsp-mode make-lsp-client @c LocalWords: 'lsp-language-id-configuration lsp-register-client @c LocalWords: new-connection lsp-stdio-connection activation-fn 3D @c LocalWords: lsp-activate-on major-modes server-id user-generated @c LocalWords: line-based code-based plain_debugger Guib Skitsko 2D @c LocalWords: Chaumont Cheng using 0pt 1filll Witholding simplex2 @c LocalWords: magick 'load 'asy 'lasy 'auto 5bp 1cm 3mm 4g abcdefg @c LocalWords: 2S 100pt 3t multipath nondegenerate 12pt 5mm 25cm 3x @c LocalWords: 5cm 5pt 3cm 2pt addPoint 10cm trueMin trueMax addBox @c LocalWords: userMin userMax 5x 3y 602e 2x 2y 3sin 204e 10x 1e9 @c LocalWords: 5a 5E partnames defaultnames 2N 2E 48kB 2n 100d 5z @c LocalWords: includemedia noplaybutton 200pt Javascript 5y 5unit @c LocalWords: 144x144 rsvgConverterPath 'import MSWindows 'package @c LocalWords: 'lsp fn 'asyls 'e asymptote-3.05/doc/icon.asy0000644000000000000000000000057215031566105014405 0ustar rootrootimport graph; size(30,30,IgnoreAspect); real f(real t) {return t < 0 ? -1/t : -0.5/t;} picture logo(pair s=0, pen q) { picture pic; pen p=linewidth(3)+q; real a=-0.5; real b=1; real eps=0.1; draw(pic,shift((eps,-f(a)))*graph(f,a,-eps),p); real c=0.5*a; pair z=(0,f(c)-f(a)); draw(pic,z+c+eps--z,p); yaxis(pic,p); return shift(s)*pic; } add(logo(red)); asymptote-3.05/doc/diatom.asy0000644000000000000000000000564315031566105014736 0ustar rootrootimport graph; size(15cm,12cm,IgnoreAspect); real minpercent=20; real ignorebelow=0; string data="diatom.csv"; string[] group; int[] begin,end; defaultpen(fontsize(8pt)+overwrite(MoveQuiet)); file in=input(data).line().csv(); string depthlabel=in; string yearlabel=in; string[] taxa=in; group=in; begin=in; real[] depth; int[] year; real[][] percentage; while(true) { real d=in; if(eof(in)) break; depth.push(d); year.push(in); percentage.push(in); } percentage=transpose(percentage); real depthmin=-min(depth); real depthmax=-max(depth); int n=percentage.length; int final; for(int taxon=0; taxon < n; ++taxon) { real[] P=percentage[taxon]; if(max(P) < ignorebelow) continue; final=taxon; } real angle=45; real L=3cm; pair Ldir=L*dir(angle); real ymax=-infinity; real margin=labelmargin(); real location=0; for(int i=0; i < begin.length-1; ++i) end[i]=begin[i+1]-1; end[begin.length-1]=n-1; typedef void drawfcn(frame f); drawfcn[] draw=new drawfcn[begin.length]; pair z0; for(int taxon=0; taxon < n; ++taxon) { real[] P=percentage[taxon]; real maxP=max(P); if(maxP < ignorebelow) continue; picture pic; real x=1; if(maxP < minpercent) x=minpercent/maxP; if(maxP > 100) x=50/maxP; scale(pic,Linear(true,x),Linear(-1)); filldraw(pic,(0,depthmin)--graph(pic,P,depth)--(0,depthmax)--cycle, gray(0.9)); xaxis(pic,Bottom,LeftTicks("$%.3g$",beginlabel=false,0,2),above=true); xaxis(pic,Top,above=true); frame label; label(label,rotate(angle)*TeXify(taxa[taxon]),(0,0),N); pair z=point(pic,N); pair v=max(label); int taxon=taxon; pic.add(new void(frame f, transform t) { pair z1=t*z+v; ymax=max(ymax,z1.y+margin); }); for(int i=0; i < begin.length; ++i) { pair z=point(pic,N); pair v=max(label); if(taxon == begin[i]) { pic.add(new void(frame f, transform t) { pair Z=t*z+v; z0=Z; pair w0=Z+Ldir; }); } else if(taxon == end[i]) { int i=i; pair align=2N; pic.add(new void(frame, transform t) { pair z0=z0; pair z1=t*z+v; pair w1=z1+Ldir; draw[i]=new void(frame f) { path g=z0--(z0.x+(ymax-z0.y)/Tan(angle),ymax)-- (z1.x+(ymax-z1.y)/Tan(angle),ymax)--z1; draw(f,g); label(f,group[i],point(g,1.5),align); }; }); } } add(pic,label,point(pic,N)); if(taxon == 0) yaxis(pic,depthlabel,Left,RightTicks(0,10),above=true); if(taxon == final) yaxis(pic,Right,LeftTicks("%",0,10),above=true); add(shift(location,0)*pic); location += pic.userMax().x; } add(new void(frame f, transform) { for(int i=0; i < draw.length; ++i) draw[i](f); }); for(int i=0; i < year.length; ++i) if(year[i] != 0) label((string) year[i],(location,-depth[i]),E); label("\%",(0.5*location,point(S).y),5*S); asymptote-3.05/doc/helix.asy0000644000000000000000000000064715031566105014571 0ustar rootrootimport graph3; size(0,200); size3(200,IgnoreAspect); currentprojection=orthographic(4,6,3); real x(real t) {return cos(2pi*t);} real y(real t) {return sin(2pi*t);} real z(real t) {return t;} path3 p=graph(x,y,z,0,2.7,operator ..); draw(p,Arrow3); scale(true); xaxis3(XZ()*"$x$",Bounds,red,InTicks(Label,2,2)); yaxis3(YZ()*"$y$",Bounds,red,InTicks(beginlabel=false,Label,2,2)); zaxis3(XZ()*"$z$",Bounds,red,InTicks); asymptote-3.05/doc/legend.asy0000644000000000000000000000061415031566105014710 0ustar rootrootimport graph; size(8cm,6cm,IgnoreAspect); typedef real realfcn(real); realfcn F(real p) { return new real(real x) {return sin(p*x);}; } for(int i=1; i < 5; ++i) draw(graph(F(i*pi),0,1),Pen(i), "$\sin("+(i == 1 ? "" : (string) i)+"\pi x)$"); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks(trailingzero)); attach(legend(2),(point(S).x,truepoint(S).y),10S,UnFill); asymptote-3.05/doc/TeXShopAndAsymptote.pdf0000644000000000000000000023644115031566761017333 0ustar rootroot%PDF-1.7 %ÐÔÅØ 3 0 obj << /Length 1202 /Filter /FlateDecode >> stream xÚVYsÛ6~ϯP·CuLˆ‘žÉƒ›cšLZwjµõÔéLB"kŠà”-'“þöîbA]¦ÉsñxžóF£×U©%fÒ÷!Ãc—ƒOÜY"Qaóí6ßÀU—2UDv¹"»ÑžÝèëå®ÙzÍÚf 'eÝâó¯7nNOJ«\W[#Fa¦Ú»N×Ìdƃ <æ Û1Âu =Q) øz#ö!›Ë¢Âjâ  ÊMùÆ«˜,áÛ\—%eº4GÉÔùÕdÂHæ²#GäÑ+º~(Jk#—¨û{Mà\vªé5YË6~èÎÄfZÆtN$_-ÛöÁXk2ÊÆªch›"ßäÏ„Š©^.!\fK$vÓ}¾”†"tÞPŠû ïz°XUŸ‹šØž”vSÖC©N6$â®çÇei@¶wj_b—3$F6Iu5/«F éYÊ;e5A…ÚU¦‰aËZTmgÙ[õ wï!0!Ķ„ð…êèVVtª¦Áj™+û´±? ¨à ¦§ã‚ÚNÕ€"€´PIšÉ†¿ë”1Ú Y´ÇL §²ÉiªêNÞ–6%¯‹¤—uQ*[å¹^UYŸ@:O»˜ý<‚sF}*©‰[]®:hê‚?@ 4P$˜‘]ÀÚ`R_-óqj™Å”*´¦'ÎŒÄn`y×Õç“I¦îU©kÕ0Y×¥bïdvyùñjf25ŽŒ0ʵƒ¼Û-¾ª¿ 2Áô‡1&±†>ÒFÉÎ>>„ˆ‹¢Ú\ø ãqð·l'3JÛ„\h‡'Ó"Û™Qèd«º,RcïuÕs: ºPë¢5<¼PƒaûÚ nh‹Mˆmø47;c×C˜Ô†ÊõŸ©Ruê`%ïMšO¶¤Ùþ~Ý[S{ûõü¹ýdÿY^~7¹-ªI›Rjp@ãÕé'/ô²¢©äÒ"ÖÉ)?K>\·²UÈùêäô ÿžujýõdˆïeÝèTµísê´÷aˆ©Îæ%dw½uiˆ úºgøÒ»öõÄý‘áÃÓ ‡•ÛT6‹WÔþvê¨"=ÈîþyÉöÙ¿ºo˜?Â?ðûšÀïk̸ýùćog/þ+m"ó endstream endobj 13 0 obj << /Length 1038 /Filter /FlateDecode >> stream xÚVKÛ6¾ï¯0r¢PKÑÓ–Û[›5Кõ¡…7Z¢WD$Q©xÕEþ{g8ôC[¹ÉÁÉyð›×Gÿ¼{x¿M£E›p-vGXfA”¤‹U¾ZìÊÅž¥çgaÈ~W^œ³“ç§°9áZx~²Ù0- ª¡§Ñ>ËÖI"áÁóã5šàF¼ˆb0üP p¾Jcökë´+§aDßÈ–×KØF+Özã8ø"Ÿ¹¹q=1z´÷jïÓî·E”›táÃ'K7I){QÕ`–$Œ·%- :;ø#Z¿ß®âÛ¤„ ?ƒ$NÉQQ5 l³8c?¼Ð—ë‘n\ðÖË4µ¾Ãtë*sÙÝb°õèå [*Ù:t]\S’$)¢Î u~õíu‰K8ò¡6š@Ÿz‰¹ÄåNüõg¥:Ú|„;{8y|1¢ÕRµNßç}ÏGŸ—.øwõ»¹HßäkWIðCk® ®"V¨¦±ÀcºK“pÄŠ¨Ái¢¤R6P¥Y`V(äÉÅ{kq)ƶ½ŸDà¼3]pìUsõjÊ^u~©ÆÉi5¢E ƒí®pÚY§J¸j¨ƒÈ±D'©+W;5ÓjvpP“°¤‹Á]eÎ Àžl‹z(¡Á©õØtF˜!„.ƒxL3(Û0y„ï-HÜÈ;JÑɤ³hºán˜j„©$Nã3ÙhÙtµ°þsVËÏŽ¬;;–`yTçòÊÖ™õ¢$Y UrÖE/ìh§””¶â4—î;‰¢‰IÙÎËSvîg›_\~ïØ¼iÞ'`ÃRÙ»Lý«÷µ00‹ïD¿ŒâÎ|z彑E-¾ÎEûA‹ŽŸù³xån¸©&ªÙ=M¨ðỜž[ᢠÍnò«òAÀ<¼žã¸ë“ÔÀiDë Êã H-ÿOa&aŸè§Ùúôü„:ø —VÏ÷q-#Ü,¡üWcÿö–[0¢-¯PÂyù$¢oÐÐ/·$’¤ëû$‚ÂoHÇAu"‘³W»¸HnI.$»üÚ— éz¡õ=49ôôÚGÑHÎabð–¤yÆþÆW„cplG µ‹å?ä%ëšè@SAÇòÌ<ŽsèóLJ-P–ÊÜ$BìÁ¥oÿ¬Säeú<…Q ïnbÖB×"¬r& Éñ±À¯ƒ£Ý±¥'|,0ƒ_,…É’Dƒ&f):‡¬ÖéÊþmhp%œÏ“4­4 ÏùT¶d ¥k ‰k³µIìI.^8ÑÜLúÞÀIÖ©ÅP‹–7–ªá@f§¢×s´³w²ßVà)ˆ;0âåΆª­»N¶Úî6ƒmî9ºŒCd£Ç¿ù^rÞÛ¨õ¸û?„Œ!Ž¢ ]ãloðψ3ŽQöð¸{øˆÝÆŽ endstream endobj 19 0 obj << /Length1 2060 /Length2 17083 /Length3 0 /Length 18333 /Filter /FlateDecode >> stream xÚŒõP]Û²€ ãnÁ…»»»»»³°àînÁƒ»Cp ‚»»»[p ½÷¹'ûÞÿ¯z¯VÕ\ókÝctIN¬¤J/lfo”°·s¡gf`âˆÊ«03˜˜X˜˜XàÈÉÕ¬\l€ÿÑkœ­ìíxþe ê4vù‰»|ØÉÛÛd\m̬ffN&& ÷ÿÚ;ñČݬÌò {; 3¹¨½ƒ§“•…¥ËÇ2ÿó  2¥0sssÒýí¶:Y™Ûä],¶+šÛTíM­€.žÿ+Ÿ¥‹‹#£»»;ƒ±­3ƒ½“…5ÀÝÊÅ t:¹Í P0¶þS9@ÍÒÊù¹ª½¹‹»±ð!°±2Ú9x¸Ú™‹T¥åŠ@»Œåþ1 ügoÌ Ìÿ ÷ï¿YÙýílljjoë`lçieg0·²%ä\<\èÆvfÛ8Ûø»[Ù›|ü¹1@BX`üQàÊs6u²rpqfp¶²ù«DÆ¿Â|첸™¨½­-ÐÎÅî¯üĬœ€¦ÛîÉøÏÉ~¶³w·óþ˜[Ù™™ÿU„™«£º•£+PZì?&"¸?2   €‰‰‰“›t=L-ÿ ¯æéü[Éü—ø£_o{€ùG@_+sàÇœ·³±àâä ôõþ·â33ÀÌÊÔ`´°²ƒûýC 4ÿ‡?ßÉÊ ËôÑ{̦¿~ÿ}Óÿh/3{;Ï?æŸ/£ºª¼ºº2í?ÿW'"bïð¦gcг°3˜ÿj2ÎßÿFÉØê?iüËWÚÎÜÀýO¶Ûô?»ý§¨þ3Ô€ÿKÁþ£kª?M®ÇÄÎdúñ`þÿÜê»üÿëð¿¢ü¿5ùÿMHÂÕÆæo5Õßúÿµ±­•ç >šÖÕåcäí?ÆÀîÿšjÿZy ™•«íÿÕJ» ‚°…Í·ÑÊYÂÊh¦dåbjùO·ü#WÿkÊl¬ì€JöÎV]+ú£ù?ºÑ2ýüqu8´äß*àÇäüï%ÅíLíÍþ1v€±““±'ÜÇ!;À›ùcÍ€71€‘ÁÎÞåÃðQž/ÀÜÞ î¯å`0 ÿ%ú‡8Œ¢ˆ À(ö‡¸Œâÿ%N&£Äb0Jÿ¡?…?ôá§ø_âúðSúC~ªˆ À¨ö‡>rÑüC1µþÐGLíÿ÷‡¥ñú°4ùC–¦ÿ%ö©½ÍÇfÿ„í/‰­íÿ¿NÑì_È `þ YŒæð/²úŸõ/tûcÎþ—ÞÞÕé_þ&ÿÂõ-ÿdóq–ž–@»Y|Ȭþ…Å~þ~Tdó/ü(×ö~ÜŒÿ õqñ0ÚÿYìÃöã»ô/õG²Ôô1 öÿÚ ælÿU óGjÎÿ—?¥,æbéü×f|dãânÿ/‡Z\ÿ…µ¸ý ?òsÿ×Nx{ü ?Â{þÿkL]œ>> ßXÃò?ü÷÷ôšÂ-/Ø›ò†Xׇ´=Ô ã¹ÓïOðÏ’ïk¦QÓ{/;µ»>!A'S×dm:ýNîAYÛ§ºZ!zõþõ£:¼5Qùç³Ï‹áW•éýŸpKS˜“E¿„¿÷ÀâÓ« ø¼:úh~ÿÚ)CžçèÊ…¤T€öàÞ'éñ½¿|u,la_ù †Cþ¥|†>F=Z/ðÛy¾Iö<6 ” = ê¥òÜÝïYÔÜÉw"™¯´p¾§1¬ÅÞ:[,±ó^ë•j,Î]8d8:Øàw¨cÓÞ"G)2X‹Þ¥ÅkK?øŠ‰réR×èQŽX2k¬T¢ìš{ëÜÆ–;˜÷ò’!”xh{‰ueÍè†N$Š5? £Ð\êX? Ž:ÌEÖÛ~kt›[§â¯pÏ|Ì!j[þ héö~np\ ¿Km}nÙíöÕü&Ø/ˆoáÎL#n©¹¶Ê“I Yî2Ö¥ ”FG¡[qKæz4åóºyÂeÞ)bbÒá‚ìÃ?gÏó¹Šõ­j¼TèØšû´h㎪üÌ¡ðnÒ™zyY„cÉ*n”F•Ÿ)Þý%#ŽR™·Ø8\Îx¹U…É VæI$—°Ã¾t5HVÌ&-Ù»¿X=©äiýÈ]Èp®Q¥þ3ž½P™xï4Š~ü¨1pH$8´û·ÙÑÎïŠ Œc{ÇË*÷‘áØm5Îü/*¹]Ίé’ÂQ`%÷»ó½°&¤gj"nĶÍqÈšjüO»ã]%/îtåÒbä”ÅËòý²Ç|á>ËúKbŽ8µB˜_îšXêÛ¨@²PÖcɳVÁI Û‡›5®ÞpEðTÕ H½¶@zgÆw‰G§wɼmªô¾±õµxÙ£ÓÁm¾R/îdÜlòSEG¾™G¶l¨» 7¬à×eÎ 7O‡Æ DH¡ÛY™Ð&N¥Ee”YrÅ´èï ‰9Ö;^ÙBODq-üÕÎzõèw|¡üz]Ú d›b‚ê'°S/ɹ3’ùÊvƒx‘8{V5ä I9Ä‹Ópr, Xuº9Ÿnw‹ý©‰£ÍCµ‚`L>EÁ€ìòÍS¢ÕÇ¥\© )±Šç‡ÐóÔ}¢ü´õ6%Œ$ƒ\ùÜW/*3"ãRBÑëÍ ÏQG¨1Õ;Õõk~Aj/ñ&бlIbÑÂD‚=)ÎýJ5‚̧æ=Ð^™oâp"~Úȯ‰/›™©Ì&ýïç±íECóãRÖÆ°ååF^ÈfÕqLccmm¦à0Ž‘à gÊ/Lxñ6æy‚~—É)dD^Žô-¾N²®ÌǬÏê¢ V˜ R.UõÓ³¾¿=± ÞüL Éõ6/ôZ[ØÙ܈u3 ï¥[ j/¾×¼` ˜Fá2mT\ËË<Êçj3UŽÅ¹yslb'-è=ôÀœr‡3HXqøïÁ“²Õf´eÖd±O†©»é°$Gd½#DuD$sÚá ÛA©ýroOa ÞÜ*çÕ ª)½ß¹ç=ÂGèÞVpƒü-ŸZ]1¯âC¢hm¼qaîÊ÷ ñ†BæX¬¸R›JÆnÓ^8êㆵ¹ãè:Ì„4å{ƒ1¨5qò´ƒ&a¼Þëåc°Uʬ˜G¼Kùmã³Hˆ¨ÕŠ Š9[Vtm\\ „Á§½a¡¹üzü[B$[O²jù&Ïi_;4cm¨l,ª»³WLfªbÖ‰[ŽÊçSæGõ¶_Ù”™±jÇüÜ;ŽÅ-߯Š ÎŸÏ œÍb3í¼¾vÃ@Wñ,àËåxáèÇ~º,w‚,.(vS눒—ää&“–³z£H^²ÀÛ¶³áð —“Pl¼æ“…Ýÿ¥4^¤+,Œ=â–è¿1cS@qØø ½¿Ø@¹<¢¹2µLÑUÀ( xÃÁÈ`´‚µZžq…5ÉÁí…ãìó–*žÏe…ód¸ÖÍóø±³îÂ,ìZUžà <É ËV¨ºÄbâžDk p)+:Wâb[â‹Õ¯Ã÷“¤úíUðÒr:è¹{à jïH¬³‹W¯%b âç®ýH‘l¼ß¾< "F°iF›>g6Zãre¸q¥=ß]&yºཤó÷n˜&‡³ÿY³™ç>Ä”æôiaU“YÂcò|î(u`ñfû5¦ÑCÃó®qåÓt6‰>©—vê7·ënÄl‚°¯é¿—úKœD¸¿aصh‹V‰2?õ¹”› ‘Þ—rL}VŸ‹’­Í›å-ì:™K´ ”x¢‚‚_ŠV¸‰,åÝÚ.6{«ìy>M¨ByÙ¤i‹ä(ÉOÞíG A+wî*áæk”ŒC7 Õ8.°Üjî#ÇPNœ(¶WjïÛ™þìOVßN2ÍÊÚv¯Ä½È}ªãÌJi´[Eˆxê´¢ùÈ£T|:ä<{7˜ÔL$eŒe@ ¹JÁÂæŽZfã@6Ç¢yVï¾:pªÈmò^¸O¢X’‹62®ÙK#ª¿ÎXbäY­\1œ¤§œÜƒ'AS¾f¥†ysd ømfX(o\¦J®ö]¡U–3®†V%}áTש8óeHû®íLÛèÛV·„Pu¿¤®ôt 7!ª.^pzó}9+Ü5,MYß(ª£,4,½¼åB^¸÷ž’Õ¥[JÍÙGÑñ’g9a—P‡s¬M9·jÜÓ¤Ö{E©åä?·™Îhgh— .#— C•"W˜7:•WÕ¨@à-+Ѹ¹zið9Ód£ÇîÄóÌH®¦PfÕ¸H=ôG¿÷KªÛÎ…ÜæZëA[â-s™?š“­ðû¹s2zÏÀ͵Î&8MúOþ²ûç»KûLt!ﯞ ð0Ä¢¢DQÞX¦0 šþ:M§„LXvð[&¡ÎJifdôÓz¿k&æ2)äø:!P[mÐ|~øe6p=1 ÷¥4ÑšO zy–ºmÖ‹xU„ç†Ý²ºÍµÁ@Ü´Ý-†÷jsáÌÙÂ¥¬†c[¸/CÃÁ—‰oëF™?(y°H…æaøœ@k¾4ð®J. £h£‘°ŠÜ²/ß¼¶îù­Y%×§"b@ "blÓùËã»aÞ¢v6O=»ü·ˆÍƒóUô‹Hh´ØŸUÈxþ¥ÏŒÖE¡[ýËùľFIç¿Ä(4ñ†Ê÷”µ~AIm~;Ds‘.ªjƒõšgXÖÆ¿Z²Ã¨pJA1¼=µ[ ìAìP|ÙuV€¤—C´K‰J„4ÜÀ40 ]µ@OhôËÁˆã1"¬:+• ߸äö5u¯Õ|mH:²éTvø†[Qà?KÝÖ”ýØX|Íà ­ŠC‰`ðãŽgÏB¦ÎZèÝ£â{°8“äïD+ƪ²#XlÙ`Òg5Ê—9(¼9|ñŽxvK{®.6r¢Ì‰Z}öqÜT8ǯ‹}Ž3Å‚{QS^Ì¢ª´]ø…J̽~„Àa0U–qxÖ ™ù•‘dª«ÙF2ÂVà°ò>£­ƒ»,'¨æ+0Ò‡ºwuiÃ8R*¥jKçÇl ›kŒºogßaïm)º:`šx4E;ùôä‘xTfN{¿t6G–üÈ´X¼¦å”ð9“_dyLZ/@Šù@z3ÛúÉiLW9Lβ\›~?ÈOÕéÍÓ˜ ¯¤-Y6?ÅKÈ ƒ¯Q6¥ ‚*ݾ9M… ÷õU>»7¸yXLÊ:¼e×à #Èc-G`ej¡¦&òsjõŠM/EJ )ßáJFí50žÚ|zOÂ+Ó¨y°Y°`WÚDHUŠ"…ï²-áèfÂ…˜-„¯·«QWÎÚc\%LìéÙ¶Ës5K‹žcJ\èq ™d2)ÿ¶ðe›ÑÜ—u3%ó×hÉà.‰dYʧªCJsyçiè9"-MõWß—ßÍ-Ú}1ðs‹äÖãƒÄRQŠRï0Ãã±D†MQ¼Gáõ×þ_wdZÜò‘êõ×HáÈ–¡Ë‘W)E-ÙÓùBT±_ ~žÖv_ %VagÃfW6У§ û›F†ÛØk‚6ÈS]ÇA94#]5Zœ²Óö¶^5bõ±s#¨6j¥”¶É{õߪ#ÞoxÉ¿›Uê9õN*€¯I»àŸp0>2€\²ü¥øÜ(»ùû ï¡ëI® ´Ã%úÀŠGê:¯C1´o•ªÚ¨xL ¡Ññæ8…)Péz´ÕG/ɱ}Õ眚)¥£G§~æ¶ÔBˆ8åµk€½5*ãI  ¶ÓÒÄÊ]­õkK°Í]&á“~–5äžÀjwQJh->Ð|2øõs‹ ï̻W7Ê€A[TÊqÕݱŸcË6ž/DØœ‰˜Úw ¢ß«úm šj$]Ù %3¡—™Kž‘]£çàß¶bÆv.á¶Ø¾Ô1WÙE>‹ ø:@ј—[p[’<•öƒê ]È?-Ìü”ýÍË^Uä>øë'Äž´“ã…p)«¹pЦö'+×Ê€žõ½Þëöé‹ÓTm'”c±»ßF—WùþÁÛGçý’€çÏÜÒZ· æ…eYÓà;ϴhË%Zâ§ßRP†N¶‰»¦zIhdVU9‘ºV´ k`ð /¬W (f–…dh+":ü„A]Aå¿KQÈß'ãp«WÅUÓþô…t»Z.õmâÛù¡`&È$åïÓûÞG ,3 I¹:ÚCLgŒJÉ·¢-Æ–2dž^ˆáß –ÑýÈ•:„•^!be.B¬÷@ÔŒÌÜ#ù%!kj>MK£=ù¶÷Å‚áw¿màÖ™†˜Ì¼Ojk«²ïô7Q§È!¬µ!á¡#xsìW°´Â„$%_^ÈH’Ù6Ùß³¤_Õòš‘$îŸôq_ï æÁ pÁáyÓa»|NTbz}AˆR®sïÊý¯Si”ÙʬC&¼¤-±D¬7Dªc<åÖ&ŸÎVÉ[\d¾B3 Œä+¾Ÿg8ilöàxè×þ€j Þ¹ÈínÔ°É~g·ï@Ñ=ÌŸ’àE¡S (¥D³*‹Ô«SPî–¾–š¿"êTã9Z’¸À:Tx‡‡VÕê^gªã«¤þi¹¥¹ØÎfþCB¬Ù2n•a黵*ä4=a¨»ï+|„ŽB‹8Æ”(èmÍ=¼6|Œ $°Ñ«gî÷%kÛŒ\Ó’ËÙÛ›ö6»Q–„Ÿa¦GwL0¸zŽO¥VBã`xˆ¤²ú ‡4¼QzÈáÚoža Ãg°aùni&_ÌÙF=ï% ˜ Võ¯«a×=‰,sð±å¢Ð;¥ÍÒjñø.ä õâ¬'wêêK ´ÈQ Ç9ž-3kÒâ5k–ÐŽƒðÅYmÎöˆô?„àdÁ%9ãvIª|”§ÂÁÊŸö:×^Î>¡A¾…}ró ªh‘Å<æåó¶mßz„Y/â.UáYúøq¾.è~7k^J|‘ÉÒ[ûŽIX…izº‚ðòˆì5êÒaÍ<=)|èô‰QÝ5]ý†3&ãÖC'Kä {Ý:™¬±Ÿ—ö’©Ò »¶Á§Þ­Åƒ´²*hJû›|«öLá皈*;wØCp÷wИò’Þ…¾¬ïGjÇmë{&ešý0P«Tõ4d€hw¨Ê‡#jŒÈèÄÝPtb§ª^m¯b¾â0 ,§T^a3iQ<#ƈ@_8zk(‡—Þ¨Í5òØkd–,.Íx ,=Îâºf±ê¾RÔxµp¹$epfßÚÖ÷©™1ñ –¥))%În¬Â3í=Íaúz‰aTqù¯‹úC"_vrÉPAô¯XÈù”ìø€[lîÖú’® z›•8¸O‡€X=YÙÃp;%Ž«{Ûyúr¨êßð+îža~iT´)«9(+¨è~‹¼W´/zÕTä(g0Ø®Â">\L=6À­Æ:”…¯^mæ%wY[ýÉy JÛ¢Ù¨Û‚–@ü…ðyBJ„Ôd– ŽÈOò^œ7¶œp(B!uF¢ £ëvÏÌþáѲ_lÉT´YŠUÙngn,`n ÉRS”¶©?Ä*×çííxÜàÌÏ.‰+ÚWéÌûƒÖ –€9|èN»R•—±dR ß`δyÈÖ2),ð‚WÜ i_G²j»=ïp¢R±ëøñ‹é‹†õL5`¤ÚEžIƒrµyŒðÖÀIxîé&iZQÊ©ˆçI"ôQ o9¥eõ‰`×8,p¤4Ûô•2Pw œ½¼@\ê"„W¤)½ŸÔÓÞ­–«Æ5ñ·áu=ÍY£&Õ±£…2Œ7(HWrZäÌôícŒPÞ‰R"„'P¾úÖÁ+6ÑcFq()-yÁi6ȸøŒÓîýó7ºwš,/[C~[R ÿ²_vWƒzR•å¹øÉ:ZKõ&“Í$%åH_>¯Ìk§!Sø.-³úQ¦M;“ÛnöY,ž_3<Ê¥uì1²ö]¢¦sœÃRg(€®v¡Æi:@6I¬'d>m±e½,¤ÿ$ãAM„Ï Äã>«œ*Ç͘·ßÃD9:­Å|‘9ÌÚè/ı˴±_y/¾´b¯·ßÔ Š?’6ôwƒØ'9ǰDJ¥¬  w:\X5¬CX[»ÅÐèíÜßB8ÐêQwYãæð¾Ô „³ø‰d¼$¯9¤¿×"…—TxU£¯Z)%§!ÃåÕ~ïXõÀÇP|aé8æ[ºÉ…â5 ãTN ŠÆ4\Y%7’2Oªóù•H †È@ìm´žfèšæËÅ7⛞ì õ™G£dÑÛì„&!½6Œ7œ !W ‘~É˧‘ÎesÔ›†]þñ_L¿¬J±» —5eÅé„6öÀB"úÒbu›×³/–C{bUæþ™‹šc¾¡ g¥]ç·É䃸}ÍhÀv$mÒŒî3þÚ†ùb’ÃµÊ c'îg÷¾ plÑ‚üÑU¶<ÄL8B"n'ëôÞ«¶»T,&N¢§nd×ÁÇï[ˆ®<Ó ô£û~ÉñR<¸ hMÖœ¡Úä}XG—ð2‡±þæ£|=wðRYwŠ?õ%W¿š.¦]QÐ7Öæ­£Ôûœ¨Ò¡‡ÑL ½,ITŒ‹ºw¿WˆÛâ,»å”…)\íhcaIO=mÏ‚ÃÿLBÎéõ8Ù9UôøíˆX…—zðN¶ÿ"RyX£ÝˆØ+è\‚*|%I‹ƒœ%2A…Ëú“¬sÇÛ¸‚!†Äß÷Ð?°®fÞ£‹wsX„éÎ&Æß) ƒݲIÀ6E’p™áP~ ™¨Ióˆ¥-•Ã5çíÄq•⫞œ¾§}G­ðËw zf ){¿C„k|Ÿ0~/’W_ÐÏ2bžãâ%[p…¡x]iÝ>—Aò<þÈóã»´LÝ1€mÖ–ß0Ùm „N‡6x†) ÒìA“%j/3\È!¼÷IfM»“HÖ\øf'0…•"a<ä4¬ˆ³‹•…S6-¿»”é‰ù¥”׌Lõ²{þÌBn/ü ‡çX®íQ­›öP…«èB­c„d¹®)‘ºWO©ÚÄß‚W1Nz•øM”LµIU¦ã+™õ¤×'pê=G®ToôQ Ê­†ði§Þ+/e?ù„Á VÙPù!>÷fçQÎ÷¢À­.¢y­÷ËrFR;mYŽI×ûzW÷°k™4×¥Äê±W%¦#ܧ|Sqgr"¯9jŽ«s6eDêü)[nb–4;_U¤|wÙaˆ²„ð‚ å•IYIµ„ _r¥,é”þ]ac £C9^p¼GŒD^ÂS:[›¾ µ£í y¨¶O“½ÞЕç(6ŸÞÚ%ÔA6Ï1î+9wõVbñPx÷æ7K¶y~^ªrK` Jv¶âÅ¡&×—éÅ\Úpk¦ÃqBÎÑÑC[ΜgCz·ç•t¨Õ6É17nAI¿-$[W®¼"âv“Ñk*án&“Q¶×“AŸ|Ûâ%7†4ª‚”:ú¦äÎÚÉ‹Ú<ÆýEÛv\?¿ó’RÐ ¸»ñ/•lÚ¦£½ñVŽ»ßcìM ,Ô?\ïíÈ&k+è† O‹Í;ž¾aò¯MsOÊÄ Nk"lás¼êñÈ`qüJ2]»‘aæ3]±æ†ñ,·.j—(pñ•ðoH; ÌkÁœ[O¶Ãàó[Ój‡Æy”å‚Ù6Å„Éà–‹[æVøžUÐÏo®Ã-¹}½XGK¨„Ò­ÒE‰$Ô˜ÇKÆÛ·ƒE$>Äc ç–½`mò b¯³ômFEC¹ÔxgMÀ8·ÅºÖÁ÷îríøA^ÞÑpóÍ4ºù—e»SŽvv-2܃œ^ç|pÙ9|¹‘Á1ÍžôA¶)Ô u`ZaÔÊ{$€ß]΀t^¶‹ªmöwwç<ø¼Žµ—©[¼™É)õ²Ÿ‰ú}O˜‚k‚ïÞEJõÛ Ø¾,÷\Nü ?ßóopCϰϚ¡ <ÖßN¾É/PNR–RÖñZ,E€kîƒ:š~ >{yüÙµMºÆcÀÒýl`óš"í†Ö®·LB÷'Ϻñb$+Oaµ¬åf[LbN²N‚-Ââçšo³à„n}ìs0ŽÚ<_†ymÞ›<¸OÓa>¬ÜÙ€v'VÝÛMÙ„ö·@”nJtké§VT|¦ö î+é¼€žEû5‹p¾4÷´‘g]$sçU볕Dq"ß’ü ²lV¹¹’h`Y•«È†~Ñh_‡«P4HhæjÎy¼vÚzÏ*ÐþÓîskíÜj®´¯‰…÷wƒÁ0ÿGLå0¿skI¼ 5åóävQ¿ÏóF‚7éò*¸»ÅCÖ³®æVcÕghÏôRÙ&}CŠ–_>7Ý‹¡ñw—¾L 7Ÿ*t*Îæqñ?,RÚ®‚>NwÀÈUžÐWÞq Õ‘U:TZC$½ŠCs/S¶W ~m1¶䪮`Þ5…L{KÃ¥†³}5ı÷NÙÇŽØŸ”‰GÞÁ"¿­¼«j˜Ñë^<Û³O"ˆ°€F¿‘ \ ¶5½ìà;©%´ãÅC¾æKA¾±4v¬‘y{ï¦wi®ŠàtP›rÝ`C" úBÎëÍEäŒ5¿5‹ÔÜ.fz_,2ü“Ga3ÏWɧÌ瘿úçnhtlŒÑ”4¦¼}"^ðw–ìõ©ÈKwÌu6Î wð“^.þn„v³ûv§¨°ÙŸÛ»Þ=( ž..`Ÿn¼Üðˆ:àÓ/OFŠù YÂT«' H=Âïj²?ª…¥CUHlöÛ²éÎw¹þÚFÅW!öjRWt6¨»+6É}Ÿàê©VWd6W¬!Ę Ìƒèæ°7t|~P ÇpðêÞÝéeç·‰RQƪ=&F(B¿Vèö/‰1ÐW<šy3QfñÛ§™¢‡•.ç‘ïøoëà{ègêtE;öÙ×rƒ RQüxï\êÁ¨Êý©- ã 9¿Ò‡Tl òS8”hX] ó+@ó¨Ð´#1Ê÷Y×/¢tWÑÔ*35˜ïŸÙh<à'Slt•º0cÚoݰï1)é0î\„ÍÄj¶„f›&ÑcŒpÒ$ß@ž­Ûµ†Êø%=±‹63Oþ¾p Éw³.…劲Ð:¬h?ËQ§¢M]y—BdsäÉW XìO• Yö ‡ÛÖi®£›Â1`:€ÐóO# á÷¼ÞƒR8ý,ÜéÉ×ÏÙ• @®’éˆú2XÒ./ëMü,üIxz7G‘¬Ø/ãXÀ€¨™\#-¯?Æâ/`Û·þi‘ˆ« I.¥påàärÈ„©\ÞÐ ^eLç"Q,;œâ³+®^A®£€M¿¨³<Òä †®v£9/È^é«T@¨MšAüÂPP wªI¥WTÉØ[ØM Jа‡¼lÉFPb®Ì-ÕOR¬G”ã•gâqñõµK°X(ºÉúO]±ƒ)¥ îR¼Õ󰿆Aoãì´5kÑ(PÈßÞøû—*A¯Ûwòº;¾MÊ›b¾¤JEŠ«:¯v\‹€|ÖÄ£ï!w Ñ •¹ƒÑ›¯j¨ËH£yÛØ»ôɳ٦+pË»Én¡äÇ7Ó¨%üT¤ƒI ý˜Q‹¢ñ5êü'è cÍ DĘ#c²š>ؽˆÝOUï²”áPéüüè¥ÚÆM•g6Òg­yk­ ¿ú˜&Y«é.'«ä@ø†(oÛj¿a€þ® çÞ°4¹`¸:zñæô‹¾î黇ÆbovÖ<¿‹­y?êÌì7eÐ:Iº¹KÄañ‹Lðç4o~•5Ï<›™-ÔQGœ>ž„0ÝëÀÎð¸-ØÏŸ1òÔ¾;œ(¿/ <ø3óYáóþÁÚ"ûÛÝ0QTaT&5"¦2) Ô€±zc;—^+`Ñ J€õzí½Õ"šz^GÀ&Þo®2؉("·¼G&/sêòWÏjaF«„¨!º_ŒüBHw‘”‹¦sŒ½c+Xߪ=3¦+²Ôp%›¡ð…»~Ú:èΤžJ à¬ÃÆ9['îhߦ ¤[ÀNµ)©R@¨†5ôç¥KnçBwœ§q³ßX‡ ‘ÙÒڳ쵯ÍÁÔŸm‡Y?q!¯Ó·³^d¤ ÍàÔu8ºaKp,W4ÎnßLÀP @aYž‡qÑÓz“=Yü#OKžsjÕvA/vZT]|J,™1T n¨–^"ô±øT¢MÇmº¸}YKlv/A“†¯rî'Ä…f…[Töúâ Y0òyu :·÷Z§bןʈï’ ä° eôÆð[ ÅÊSŸ9…ÌzÑ žžwøù´ çÖ.«ä¦¤ ÀŠveE¡™ÿ(ü›ìÿ¹š‰Ðñ@c}ËÀw­BÂì_8Äôû®*’ÚÛaðAõ«PÅT(·®»W²O$éTuˆÚ•Шè›j#y©!ͰKÒÓ¹mÞžÿT¾qp9 Ë¢çé­{ ¥J!²Uw}à¤&¥* Ÿ2«ZQ‚ “|廲â1zˆSÔÕù>a @Ŷ£4ÜOˆ†?J¢w­šfÂl˜†žµ8n~á ÒqžÔMØ/ nô]/¡:T‰•uŠæsŠ&Y,’ÖvÁçm°ŠÙ!yí€âA« e¹¹ž%=Å!~1üÞ‹”Ô×ýµ¨‹ õá¡d#xã5Žü+§)~±Ö,”\Ù™C×FŒé5´}è©¢eYp+ÛŠ–"Z»žfç&ë«!07¡Du‰êÅ2ë¦Ú\!íTš šÐ JoÍá|è‘óå$‘áBóφãìäÓÅ%‹î#Ù‡¼sx²Ìb¤Œêähk½ã3Áõ/ΩùŠL²‰éþ*ÊwzJöeAmŸÐânyS+ã8÷‘Ļ @æâл܅÷ñ“ Þ Q~RzjÓEqÊ(ô×eU„¤¨Y>þUnz6[AlÉã–6M>!(ÙÈ…N•ýqäZûšaªÔ7¹ÈÄ@›“cªºÛ¡9L^ •M­€‡siñ)aml)¥Ü ·R¦½ÁéWJ5V« ®!>¢ùjÆòwÃ7)æi; ñ‘–§ßÛ«¼'ìL¼[˜Æyð›ÓôDð~ô¢YYnAŠ@Ô‹ó(:ñ›–– Wü¼† <’$°Q[ö‹”Z¬u¸ªptÛÏUǹéÊÂqIï÷ÜFW‚%Òã!9Þ¨|¡n“æ3 *Y óž°ý=h¤iý)Ôïæ1ÉSKp(,~’Œ±ný®…¿ ߯àÊ×WPO¬ 7MÈV0«§hPdzRjÀõ,±&!¦Y9©UA¯ô_/ÚE¡™ùŠðúKñê ÿ2ŽWF‘’Ø' _ßsq\¿dVXT —n*Á0K üE’BÉZÄK•­œÌž ‹ºj®_1uªØÝ”A·KYbAÊ0ÿ…¢Ê/˦ôgWæ2XÎ1„ìÌ÷—êºQ°I¯sÊ™Nsâ =Õ¹è6x-œ¦å¿æUut;ÔdχÞm3?wã´VþXôÊ}=V¶õ, ”N ñ3;Ö\X¦µþ%Ì'¢í—=ºâ ¶NçèÚ–it/Õ…(“«•mûoñe°¼r«ÖŸéE!ç4Öãú3‚H+O%5*{aÑçB¨T`ãºÖϵ¶¢y…šú¡¢¡ýÜÓß=4ðOD³®­1×Úˆ¤)!¸Â-±±”ÞVdwØw¨éÖK÷øÜ"Ýþ`®ßîßÜÐÔ¿Ÿ¤óßv7hÔ¤ƒ¹/JTÁ ëz#C:|úíÍ[ø.Ã¥û‰6Øe’¥9{Øæp_ ´µÈ׉֩æþÔ‘ãÙˆÀÞÂå7ê¼ùB…£ÂqäèD6`êî}Å—4I¶'[·ñ-‘/Û@6EJ9µÙÉüý gj„x5ôI9­\vš J?1„N}÷éÐs 1Íi‹‚69òî—;^«qsù‹ºÆÆºuÅQ<üÑV˜Z æ”â'mZÊÏ#_È‚™%«Ã.®IÚ@éwÝù1kêR›­oXw½b,|¿ÕlÍ/j;¨ˆêû¼¿°†몡ݎ=?—–ø¤SŠNK°'ûš¾½1Ù3eûÙ=Ø+q)ÖªÂx¹šh{B+ G“|€*’ÏÿÒf”`j:óXRn¶«> JÜ•²{¨Ìh"e÷D®iu¹\Ù*}d,`uU±ØjC‘šEÐý%)Qž›å¼'7š—±-êEŹ'± ÄÌî©@YÛ_Í“ùþ^¢Ê¢&o`2S}y$ üM+­$2)u:D\À˜{凚Ü]®²Q=„2 Ò-*âþÒQqSÁÔ+Ÿ¢Zƒ ®}í>ˆÍoLDšédGŒ£ÓVšRHÀ ¯"ÙeÒu\§‡À£'cVZ ÀJjûnØy÷p‡Ñ‚­Ìâ2îÌv@Ò`m«ÈvºA q­ÝâòÄ–Âj|ýòŽÅKw•PË÷Êɳêç}ÿ8³â̦üøP7ûë¦D'rìÜd¾žMªDÞ'NUIŒrñûÔF·j.¶ó¦8rãé‹ù yͲÒiØyyqµû ŠÍu¦. ª\gDhD-ÓµôÚHhŒ7½´"S&ɦ=ªþû†” ¸=ãÍc¾!cT ÷À’$áý2"­X`xÅ)áÞ=)\Úþ—ꈛî»"†¯WüÆ{¯fÖ YùµO;M!Üa@½\>TÒ”¦MJÞÒ=¨pŽTc¤P¤&éº~ÁÒÐcU`wZ ™v}¥UMy4RNÉ‘¶Ôxó.±bn1¿ùÍïìõñ1ЯZ=R¡¶ß< Ęɽß+Á%u¾ÞÎ(É9³ÌÒƒ»ÆÃÂê&G朔Iˆ½<(zßÿ†k(JvYçzâ`¨t‚>´"'Œ£MT¢²ƒ‚=G%ýmP–°/Ì»‡woÆ}2(™u,×$œ)€©‚§8à ÿ†Î¢ýô+½Š¿!6ÌkÛ¿£ËW­'¯0R;¼òÖÓ`› Òäóg¨Ñ€_”Tüa_ÕJ|ÝE×$ÑDNŸ¨4õöF(úÌLœ¸a轊ü²ˆ¾ßÚQð£ëÙY ñ7Ì^Þ&1U¢}iÎ×^Û©Q¶ à“;ùÕ/Üøå ½CÎ+çÛÚL²ž;h—fû×ü>Üö yÍçVÅoœørÆÄQ+lµÎÖúèx­[êm-NMâ¯ôŽ^Ý£©7>×´Ì^üá ”ÐR³Áso>•g®}oå0ŒEðbŒ[­(.Þ‹ò'Ë!eÉmÝ MŠH;]ažCì«X)}ë1N®³ŽÏ±ø­`àî»@+‰"žñ©ÍBV3]õ¦/ýà àÑÙN…ž¸v¢a&Õ"C"ÜÙFç^ÔËåÛ`~ã\°Œ?¿`Ûã‘Ô,¼»¥ìÖê ·²a9®>/ƒ|õ~‡o=UAŸŒqŠeËyÂHû’Ž“UèóšR·‡+aíšùØ?P!+˜ò ù·™ §o¾»T+ÁÞ>ÌÉFDú@#¨jPñ+dïɉi_|ŽÏS®[=²oO’ì›;#¼åÏ×~¬¯)™z‹•Dè.õ_wx!}ü×7OSZ¢ÕÜ¥º{‡ƒÄ’ŽKÕJ–':t…ö™‡•_è&3HæÀPü}Ü%%úUi#‹ñº€i°›a1E>`?ÙìMLF€â4 Ðö!Tªæ:óeHZê§ÉÙb Ð APoicÉH+,2{ÊOŽZÒ‘j@!ÝSìëPF„¾‘/¡„ ”ˆsY…éíÜ4-Úx2<Ï{‚q#bþ&Q5‹&g1öi½4ºÅìj–<½Ï×Pû^=ŸÍÀy¹™¢TÓöË(Ð{tè±+þxïi.ž|˜&°›.™ÒœÓÎ1¦=Ñä}–²”)‚ÞÑÍY/Ô']“×ì5csúŒ¢¶š˜îÞ£25šDÝC6‰w,¸îÚ{­ÜnŸ3}#9rÞ”²…AžöD^IUbq¦œš©®/°÷äÂYàãí\¼º—Lþ,9®@TŽ’Zyþ«ÂŒ¤“r¾7Žî0€Ay/ȨdöÁBÆ6§d4öÉ…ÌÇa¿ÃÐTÈœ…¾å”¢¶j!ãáÕ ÏÌ@¥Ò%~rƒ8”V&V51“x»±PÅÛŠx¢{Ó5èÚ£ó®¨ÄMÓ7 »JOÝ÷cv!(æÙßÐQûw—,)‹è£ >ÞO¬Ž€bZÖ4¢Ö…¬ V*Gíy×èIMüTø§»œXpÖ¬Þ]²í¨$Zúß;¿ßE¢ïO´M(Ž:k§^=øú+éðc÷ÇêKÅfÚ¾î¼ÞkºTï,Ù…iÐÛP×u*4§LêŽå°—Cƒq™…9ˆŸÅH4)J5:³³ï½1¨0!̶%JœWè§ÑêÒi’B9äˆY3=zõÆáŒ3ÕjäU¼O­oî‚°ºàÈ3Õ†kë¯ Ó§æ#¦a98¿½ˆLìÌCµÝITÔÑ ±5££,oHÖë~wT+7õcÙ-yØ'd>ýÖÍ-æMéltTxZ;?ªâ5xL¾Å«ÿöuf×VÃÌ¡jÏR±Uéí µ%#<Þá )Õ†I û5 ]üÛ<†7»6Ñ^A"7‘#uÌ@{‰ž i‚}qùM)…™†ÉÂ`¿SoƒÖù†¨K’cš—N¢ÛCí[G—}ˆ 25-“gÃϳ+Ë7¦²›ã¢8ú,߃™ïuÉl‡ ørR ŒvbI¡‹:ô.í—~äIlŸ†/ ']€]ÛµUräålhÆžž^2ÿF{ÞæyËk/kÐ|ENu–×ðÎk„2orÛ`ã £<…»[JX´Ô0ýÞ…†¨V”ŽEŠ*Öͺþ¡V”ÎB\àø<¿¿@<‡ÀÇ9iUCÁ%OÈ6Lw"©±£EŸ0J9¤× œ¡!†ç1-2ñ§sxæq¤BÁ*î’®›2K]¼ œ&fszÎuá\¶œ#ñE*T¢4Â-ùݽg)ÒèˆÀ$]²n ]ǵ”Fm ÀT^I{U{JVŒ°Ùú‡ØöVk¹‘xÅ*Îv>£Vèþ¢GÁtîÏr;- dŽþÎwÅ3ÏäÃl8 &PªA±´"v&~黑Hû>Xb‹UÆ·M;=:JÜórîJ,ö=«†:¶ñSáÄš:²÷DÁêæù‰šeZ÷‚©¹yfÈ}ŸAZ’WY a¤TÛl«S÷¹\TõÝM)|TŠ˜eÅë¬?ÜÅ$žfUýTJئ¼:±ÊG0CbÖtÚ·Ù"zD¨›ù]¦»ˆ¾ »]ç].L%#ðêrÙN˰&Øæ•ËïQßµ»À/Rk`ŠÜ½)W«ï¶Ëž±v DåÎe­ ˜¤ÈÙŸLW—6íF$ˆ%ÆÌ“¾†pÔ‚^¤q EsålYõE°NgžÑ÷‰,οл˜·“éµê›ÊË3^T%Æ!r@Ç¡~Í¢.¬_w}C1}´óëjáLð…Q€,r ’Ëã—^v¡DºSXE œLçf°#äþì4ô[d?Ó‚„ÀJ„yƒŠŸ…½Ï:Œ={äL7­^ø"Q qGQqæd¾Óæ+‡#+53kÁB3@¼FŒH¥+¸NкےÇkº0ªêØîB2×-©½³Ž}ºpÏ®ï°Ö«a¸k²Ôô/«bP™à˜Æ½ê,ÈYa‹TªQýÀ¬;žµµU{Ù1eì9½+ÝkMeÄNïǨ;ƒCV­`|›|îŽí…õe- ó`š˜˜ûލ¿:!h'䥿6Ô¾X—äÇe^³G¡×b @ Òs¶ö¸Å|¯d.•콜²€Lψž<ÞòÔ›uê?GY¹€¥¡ŒŸ”CjnŠœü yéÝÂׂhÄÿfú.ÑùubH_ÇÙH!UÕìF=~(BìyUnWfeñý‹Ï{y$æ±p ¶i¿tÞÞ— ;>½tûHþþ–fr`wlÖ„ž?¹€ G]§¥Yp†ÝLÃI0õæ¼ *÷_­ \*¯W[bèbÍÜA¥^°·C­çCÝ `W±Ý¤ Þð@¥’âã †uøò¶4Çê2Ó!;Š0¬,Ã7ÛFÜÁ3þ×_ÉE ¿tTTCU“öƒp+F°™Ãï‹[ˆ&Ý`ÉÞ 80̈àúÊLÖ]û¬mÁAæ%+¶tøVR|ƒr“àÄwÙᣅ™òQ„°Iøžû4ÎàŒr¸°n,ijáÿ|‘²3¶¾´‡†ì´d'žl«Õ³6΂Eë¬&á¡ÕLL± rɵàTL짬$²à6ãœ|(L‚CwÒ[jaEl(AU 宑 ÓUÉûöWúô°áZ£OÁ.×ß@«:±LDb*\ç÷füR”MØŒGØ–éN#•pzª‡›)}åð];ì <ö¬cç=5äGÍ}&~{ÝKO 3ì¡KÓÆ2Ñøð®¨[ûj®Jµk…¬ üã©ê¥P¥ßyUéÌœ7¿dct^K,â=g‰¸Ý Q0¨åpaå÷Þ|I¤ÉÈûÑ8ìN¦wÿ!Šoæ3R¼A§}Õm0ž"ãÚ× Gʺ×çÆó¹ò۬ߢ>Ó~$¨B¸ÐXo¬Ú4 FlœeËH™ž)ùs;gc#*q²;IÃduŽD ”)j=¡æäd\+Ýš`€j©Œ†µNQÖÙž¢ì •Þÿ©C—Ó3îúÒy£Z‰. 5½ß…Š©Hî› ÙiO¥Pœ-ånþ%½•F]fò»˜DYÌ\³ÖL]ÅñÌø±¢BÖÖ±×Î}M}{ù~|‡x¯eã,²!XÖ¸î«Ã¡ÿtý%êso¯»Óù893#®€ó«2›ÑºF¨[=žé¹X²+i<>ª£ŒÍ¯û™àÙâv{,…ÿê¡‚‹ðR«,­ö oºzÛÆ †BâW=31Zê¤IÎëæHI83ŸÒ¯NÞ•ëíLW\[“N·KcÀ=³H«ç’GÐÉtHÞQ™«z368k”‹-@§=XÄcî°Ä8!_6€óŒóôß`ÕN•U½\™xö攵¾¨žÒ(ž¸ZEîè¼ ”^ú qæiçï° –HaŒj·n7+ÖnÁ±hr7-ô@D ºXÎ÷ЇyŠçqòm› ~ôà°P2ÿï_£vØek}ÚƒžþƒÞCÿÆÂX³¸ófö±GÿÑÊ"Á«Rµ±p^2•ñ‡”ø@v$O`U¨t>ÿ×|Z·yB¸e?Õ?¤ƒRx®b(¦Rhœ¶š­ó¼Kª•ügîT—çΆÃß”~QÐYÔ»Ûï¾…Pø°ÂéëH #gh¦ÕùsLZ@ÈŽòþþÃhø> stream xÚ´PØÖ-  în w—àÁ ® 4N»»»‡àî\Áà$w™¹ßÌÜïÿ«Þ«®êîµuísÖ>Ô*êÌbfö& i{°33; ›@BQÀÆÆÉÂÆÆDMýÑÊÙô3µ&âdeøW€t~µI_ãíÁy[;'€G€W€ ÀÁÆÆÿ?ö€$ÐÕÊ  È·ƒœ¨%ì< V–ίmþç/€Î”ÀÎÏÏËôg:@̱2‚Š@gKÝkGS -@ÝÞÔ äìñ_%è-XYÝÜÜX€vN,ö az&€›•³%@ 䂸‚Ì PÚþšŒ‰ðÑÒÊé/»º½¹³¼l­LA`§× °xmP—S(;€À+üÀøÏÙØYØÿ.÷Ÿì? YÿLššÚÛ9ÁV` €¹•- ,­ÀâìîÌ‚ÍþÚ:Ù¿æ]V¶@“×€?™Òbªàë€ÿÏÉbåàìÄâdeûLj¬”y=e)°™„½ìì„ô?I+ÈôõØ=XÿºY°½Øë?ÀÜ lfþÇf.¬`+GœäB^MHÿØ,@În666^~.Èr7µdý£üGПNö?̯øx9Ø;Ì_‡ùX™ƒ^¼œ€® €3ÄäãõoÇ#$vv€™•©3ÀdaFú§ú«dþ~½|ˆ•;@íU{ì¶?>ÿ3x•—™=ØÖãŸð?ï—UU\LSA›ñ¯‰ÿö‰‹Û»¼˜9¹ÌÜì~>>/7Àç¿«¨­þÂíŸT9°¹=€ÿ/²¯§ô?„]ÿsÿtÿÙ zÀ×R²-@÷ÆõÙ¸ÙL_¿ØÿŸ•þgÊÿŸÀÿ¨òÓøÿ&$íbkû§›îOÿÿÇ ´³²õøOÀ«f]œ_õ¯hÿºàÿªúkgAfV.vÿÛ+ç |Ý1°…íßÇhå$må2S±r6µüK,Ù5þX2[+0HÅÞÉêWÀÌÎÆö¿|¯›ejóúr8½*òOèuqþ»¥ØÔÞì ãàæ! Û«8¸¹^쯫hrÿSÃV°½ók àu<€¹=éåá°Šýaú ñX%þF¼\Vù¿€Uíôš§ñâ°jþøÙ¬ºÿ ×šÀ¿'ß+²sxÐoÀß1¯V“?€ÕôoÄõÊâõ!±û§ûë°‚þ_™™ÿ ¹9_‘•ë¿ý¯,ÿ_©[ý ¾r·þ|¥kó/øÊÌö_ð•šÝ?ýuRð¿à+/ûÁ×¾Á×¾Nÿ‚¯}ÿaýšêl ýCûõÆYÝþ]˿à+3× ÇkíÕé ‚ü•ý_‚1u@^ŸÌ?WúUMÿƒÿ|ŸA w)Òò‚½éû`ëúàλZ1b7æ½oB³Ô{ZéôÌ^Ë.—4„úšO±”Ñ>Œµ)ºkÑòß^ÇmaíIªÞOF jÓ{HKSxC“EÇb ƒ¤ˆ$ÌE÷½;zkؼiƒî–§ÎstáCS)À¾sqo,_]ØSݯáù€üT>ã­P2Go’=O@ ïÌLú–ëÌ}îúf+wò…\>Éçg g±—î&Gìý¼ç÷ÊN=„ïu Hß\cOÓx‰¤Êã/z•o@ÆÓæñº&¶ì’Ùmè<÷”Ôî ‡†4Ô“t„¬op䢢7ÚeíJ(á¹²ÏÖä7Üå.xÛLœ˜”­^”my¸Õù÷zr<èpëµÂÔ,qSÈÁýÜa¤Ð¹ 4há…{ÃO1øëúæßǾã4µò£K‘¶uùo[|ªw 8üþ‘btÍ}Dnî\Þs&Üõp‡ÁçìÊ4Ë~¨{ÂÉÌŽÐ:…º©)Pè ¶=%W™‘8 ¯!›Ô冿Ž(†*åSf^g“ ò°‘AýÞ12}VÍAÇ Ò]øàÑN¹Fù‹XMUß'Ì"DY„¸Øû˜°­ <™©-Éu¬°-ùðØgºÐ‚K­ª¾Ë‰/—§…Ìl‚,åêâè(J¶Éغ9Êñ §³ù±ÜĆüý8Ï%Úà¼I#¿xõGVÂüˤ˜6s;að…»¬Ù ÓÜSëUŸiµûOüC":­QFßz莪\;·ÂîÀà ¿Ô-­9ü cP׬…ö‰øÜ³^¼4c³Xôò󴃟çp;ÏM}Å ±àò}˜:r …tDBÌ/héí;yr9G/È©>M€bÖ]#ßµ€¯@æÈuÝMM²#èFËžçpi¨$éZ؃ñ‰Ef QÜé®{ú«(Ïs6ë‘%[=*IñŠœ>tUp´%ú—ëo•YK*Av9*e£=§ïE#Ò·.µý;'x&›Ö«ŒÎð¡w/I‰ùg¨¹v*ôî´;q4<^Ææ –èø·“O1V°¿-ÎI+&õ;”*/ÑÎÉêD43KgðÝg²´A¿L‰¬>}@éÍ@?Lã]ëQM§ÁËâ‚И£O{.b$аS ÅæçÙZ’ã…/òíÑJ~‚™¦$×f+<kͼg<š4ûn ~˜Š3ƒ*2œhQôh>û\?m¸ÛRn wÍ—ÉÍrh•ÂýEνE ·pmòTÇGíǤÅð¿oÍÔ¡ó¡­Æ®'E¹mDäQ„Áœ|ãÎ;~þfš®@êJ¦w¨[®l“åëy:Y‰,T¾î_ߑωnË¥Ïù–^¦7€ßQ‰“IªÑ/ôÎã4†€û×!ù¬U-Wã¶õ›f˜­³½;>6•y3«¬ž;eÚYîEÌa¼ðÝÅš¹ÚYu(’Š÷j½šP'›þ?E(l?Ç(.WNsX`+¬²à„|àM"xhv›Lò£i{S,ñv#/UÓ‡×pÛ&+§ìZþ}¥)*’RO2Ã%êrŒ IÏç¢Íeï¬Ä¹~²p¢Ó‰ê‚´ÑRÛ9¿­$žËL8=DŽå¦©Üx2rÝMW«ÌmÛNojzÍáV4»³öÅŠlR,,!šN ÒJ¼+ùØ~§ô`#ÒÂñúÄ 8X¿e"o/µÀ‚žÆœ±4ñ´8^k¹["„ü0ÿ‘tŽ4¢ß @œˆ§j”—tQ^.dÑ(Ü#.ºD’N!è_€ rãœKZ‡Ê™F÷× mŸÐz‘¨qL™NLIR´@Ãæ¸¦üÙÜxš6®s‡%ȶ{ÌÓ7è Y^œ¡%z–蹺Ñx칄­¡!ü¸ÏJ3³#¿hûôèeQ´®ãù3B^‹w¤›b$$ɇC—n7GІ¯¡æ}J9ï°,kRa WšÚŠ,A÷—ªYø…=&ÜE&iï †µ èà7Ø•‘@ò=‡4‚ %u”)= š*8ìx’½Áw~Þó·vÔ0»&mj·ÞB\BjuDÁ‘-.ß´Œ©EˆÐUùH¯Üd8-HýŸßw"›÷®ÙŽÙ#NµqüFIÒØº¼véáÙN—Xˆ¢&ÔùxM«v=Ld=•k¿ÀNªXöQxŽc„:KP~nb7¾ ú1›;»‡ …;ÊÕÛX!„,Ž5>ò®B8_+‹‹(–àgÁ†'§šLx)¸þ>íÑÕ[ð„aNfyWÔ9ÆQ;4Zxk4ÎA¿Šº–ŽLûÊ5elŸ×‡½‘Ú¶B¬æÃJµ?49O1æÛÔTƒ¤^ ÆÌ‡Í:Û„+#ÜKÚTÂã)Î5c†(ÍtÕe9ýè<ÜjKÌz½tRU?Åä)8à@ bGk…ã(pºÏå#RNJÓÑv¦Såç,,«÷Â(a}᳟„U»ÃhÚˆS‡Ý«÷ŽÇÛ<ÁéhÝá¡6¥µæŽZÌË)¿ƒx#ìÒYn,¬muó d–ÎÄqßD88Š—Ï—=hˆ¥3(ÜoÉOÑNj;¤YgѼʶÞgбL«E\°u”¾1ʧ íÔ`òÐä½û™õ/ˆìuDå€~;YûLte]Ëòq7ê:Œà€¦3Œoo.׳n0[Æ>œ¿g|ŽÒ¿êÞ_ £Û=Ì[—Âpý‹›pѼnæ×h‹•Ý˧..bV“j¥—Ÿ´D7o>¬öqîuaž_ÖT([NÊ‹ gd6t –`ñ»æÎÆ{0#ÐÊÙ9·ÎV ˜)Q¦&+ÌïÕÜóú)BžÌ(ºÔ¡“³üÂ3›Îóàºwù÷óðÕ«%Ͱm–ú‰MÞÕ>hž‡–:§rùXrƒÖe•Â!²UrÅLÊ-<´›Å„[“˜¶ ä¡YHÁ/¡JÊG+Tî@(Ä1å9o5÷˜;èZ(ä›Zt¿xho v•RÔx.®‰.²4û—Ýã¢pŸD@M2Ç%I*4rA–e÷«-KjXÉ ?J1,&jT¨“¢Ü•fGÝ©=îysb¿MÓÇÚ'ó žt̾Ó3äÜÙǘ‡ˆ)>¨˜G‡2ƒ‹Âkœa ¨šŠ#†l-hFgA¥iUè©&ÜfØÓ ÊRˆÜñ¨u-¿ÛºvówÑCßÏŽ¿sÈÊ:&Å`§kUŒEœï\QyÔŒJTvÈv6•0nŸÏÛfËŠ¨÷¯æã®Ô£¤=L g—ÏD¦G!ªÁNž‹H9ÄÆn1 "õkîhé¿q-“~ñù “_ÃØd¶ lhº®Å3„Å&¥;äÌ4ò›¾Òêæ È LÞP5›Ë ÆüLlÅ'Îý̰?œæ¾ î%ï•z„‘TynϽÑ»^ýiØ ^î"ë” ãÞåØPmV»‰ô:ôo5¾L$õÿÞrnÊÆ#]í¡0btΘA꽊ŸÌPw˜’fD/ —šº"%VÑ=Û®Á˜^°‡lj?5ª»?œG“0Ñ̬“×ê UůíN°+ˆ×VLbQÉïÖC7õ\>÷Ÿ·’:àã³áNp ¾i‡Èca&|àÕU¤¦\™ï˱—’ˆÌY;÷ÓŽò °ÒEËåÈäç® ÀC5ñDÆ¥£ 1æ×—AnwŸÜs–¬¾ …7úÕtðwïyöË}¡€ý<Ô ÁÉ(uk+9ˆE¤rÁk8˜¼·H€&‹aVø}ËŠ[¹R=î€ \J}‹.°3Åî~?œ|1²kœ¯Ù“rN#%“ ÒlŠA€¶p‡ƒ"±š6œÁË[Ïl<¼ü¶¦JÑuáˆôÏ»!„Æi úJ56Å€Øl2L/É s78Ll¶›f?gO~[bò3ÙžmGð{G9"LxÉ0j/: Y˜»b¼\·!R×U•Þ;3ÉGº ÷(3ýÖ-›IVÞÊ,?¤øÝLÔaÚÅ<ã·2G)š29,Î`ŠžpxJ16W'LL!éäm« ZDìh~b”`í‚ñsö&è®pBÀÒ^e f<%±²-!~| n¡-C÷‰q:8÷€Æ—•)?²ÚÞg>| ¥Ü«¹XɱàäÄôˆîŠÌbònŠ€x‚Q˜u8JèfiœîÁž„e©Ø#vjV‚ˆŸû œ@<¶áãA 2óíÄḎHõO4Z¸^šÄ PÕð«F/¨åh›%M¬iZ¦H¨{ìIKܹ | Ĭ(í ðší;5%WË%mýÙ †Ò>DäT"(*Äû±­þÌðO§¾©Dvý¾ÖgÉŸßJ»’hÈ#>œ-±` èÓêÜ Å^éFæbÇF„/xïcñÓ |êD[7‡ð¢o5û«vú‚[˜ ܪX{'¬z‘0]$zIþÊj. ü'á=™IäbO¨‡k•¯5LÖZ?’ñÔVª]xQvÜYÛÙ"…FfræR¬òCƒ‰b¬1Œ]ø(ê¹ß5˜Â–Þkhd<)½÷õY-Eoż3Ž!z;†6žzJnÑþÚVãÉÞµøwd.#f¥*µ§ÐÀ»R (hÁ\y5™´›±Æµñ0W»õÝ|êëûþŽÜ†ƒJ! Ÿà§5#޵á9›ß×8Ø4ÇC0ȇïAu2¼‹‰pÅr©wÑ]lªæ½¬í 7ˆ‘ä„§Y9 õmoŽØ$é©÷1 ñ`\Nkëø°[z_›”ÌñeEZ±¨’U5a ’ö ECŸƒP3q—V:·ô‘AÀ¼Œ<úéÜõ6oœ ÷!ûîb+¥hÿ¢J¢éÑÇ8é·æ5»ßïƒ8Ök‹ú¬ ù¼Óp¡Ô$Øî‘Ó\żQ'|_[N‚ýëÂF ¸m|çž»²%Ý(+Þ[Ÿ×ŠÁ>T!~3VWÓoÖE«c™qSÚÄÿ-Q—`³ç]á»î"KuHLJ6©ÄÛpEß`•Ã'C¶xĦhNäµ”ø(ÍIŠ˜¤î& vð‘¬c;Ax8¾ò¸Þšù—~㑺‰eQÃÈGƒÞ€Û Hƒ3ÔðV¾(elÓ }×™Z‹ˆ¯&ÇÿnüÁm<žRÈ´¹Å:wfyÏ-BÄ?¶t†.¬úIiQF× !¨rãöS‚EZ¨ƒWè¬úHÛœì„0Ý×F­®ÙbOï¬ã;šrŠ;5æ …Á<}¸ã¦?ªW Ó>©qO¸2»U3ì)¢/Å…ß_¦²j|F± Ù-”7É#Ì>&Uû ƒ`åµ+KÕÈe‰LGl1èÛ‰Ä÷…y!vñ(¤kGôŽÎçgÁSÄ>ÞÇOð‘Ó>«TÕŸ:Ì…ç{F{=Óf} wG‰8ÅeÌLDúŠ/øKÐy1‘_)s¹w|ÃVN–4ï»Sv¿Ð©½v|{ÿƯˆ]þ[yCÌbmw™‚^FË@Œƒ©Åµè’¯¹k©ß÷±aìàPTTþº¢q†˜AãCoJ‚ó¬xZ*8šSU*xë‹zP[ðÌDЫô¾XЬèÙ…8ˆPýt/Lcc‚uÛ±÷l¸ÈjY{+·í¢$.‹Nûºá,PS«7šB›g”©ÝqÉêçãtç1‘yB·êÃÏqÒÅֳ봜>ë±…ÿ£Öi¸PÕ#\¿_âB*>€f£ÇN1‚šv'o¼!SV¬»wjü‚×A¢2¯P¡«X^¼íúó:KÍ÷¾Ðî…ç}Pl¢«Ê6=¶LÍÓΞ 5z½¹uœ²s€_\ÛÞ­y§˜ Âv>–ðèBnÈV¹O³h¸ÑdKýÎ \Ù¥ÍRz8ªûo‹þµ™Ñ ŒùøïFã9ö­Œ2Êij=]aOI $‡ Lü¦£Ûƒá‚Æî›ª÷‰ÙÚ:Coóõ'Fžáí‡ÈW/c/íÚ5‘ʘŠ?êu^Â./ƒOi!±+_–[¾ 1æ±:5Í0ÑúîS¡_¹œ*É0Ìbnqi…8,¾ËC&Ñð"eŽn. ¾äF‡9®äe •ǽw"ÌÒáò×·¾q½™ío·uÄzé=£¨öÐÂlM¼YƒRöžg_ñÁ{0·ßÂ÷ÂÿVàR®Wg{Agß¹ü?`A”a+…þÓ-©¥µw!˜Ñ?ÚÏáÊl¥AÛ'NRÛ…§ G¹Ì„CT…ºÁZ\¼Û°R[Õvçk;H“«c¥è«áæÃçy¤IÍn¡dõ½Éè "¶ž|úÈÏNpª’T©i^¾2øè=0í–ṩ¥©þC¨6>éÍ%˜ú;QÐŒMÖ}Öó@Ì[Ð\ ÓAÌÀü¹Xá‚tö’M#«‰þõÎA½«Ü÷ÛýQ˜ä7ùªXëX—ÙÐ’usG—6wN©–ÂÍ™Æ! ¹À˜2•Z:_kj•êÐÖ‘Qat¤&-Û…€i˜Œì°Ý¦³ûÏ7°ßÊhz#-]®¡hºÈÄ CßaDÆÌQ?Äò›ê« PÊÐQ®£ n—ßÿ¾n Ýú 7ÚÓ‹“2ƒåK›ÆH™´ëOÜŠ³ÒT®¹-™‘x½BØÃ.³’{+ë¹­ƒÞyø±~b¦bÚ)ž¹ßA=¾¢W¢¡>ÏQ)ð ?¿;ÈÞ@mÖËS¢îMX»ˆ‡r»úË>ãæG*ã'cÊ%@âMÂ'±,á=’ Ãúï„jžÓB昇©ôwÖbß“hÝÃLÄUÌkvŠ gb™f)Ðûó]ç÷ì–å)ê«ëXÕëaFú`„Çù}´IõVÕ8·Ä8•‚ÌŽ)·]¡¤y¥®õNYÐó¿Íê*)J“îôý ·$À.ô&Ç:ûðC˜{&Š…›îÃÖî¬0#Bh#W‡Ç¼h)î:\vì”øü/=òÖÎäkÄJRfã'Ì蔈ä„ó‰Šâfï²k5ME¢Ù;Lë˜Û ·jQn{UÌ 5‹1ËͪsO’1Áùˆ_xÎÁMc˜}Ï€öœ^©eoúSïívqÖ•kaž—C ÜúÜ”]”†ïÐl ÜM#³3^4 çzù+eûùj9F‹&19Ï ¾]\,úÍg]±¨gÂ3Žà‹Ò wE&èLôd›hmäS(­;,ãû±%šÇuÚÆ}wÌ"IIÆ 4: H@Îk/I1÷æ~ªbÀ îB%àlgk5¿Áãó"K°“ÐXjyߢêüL¼“­W©»QŽ…i=”Ùè­óF•‹|d_BW4¹ô ß~wïA2ÄérzR¶â!{vLñJ6í í,ï'ÔI†õiG•wH¿ßYÈ‚ù‹#¦ÈLgv‹”hêð6O·sŽs7`‚PXØZz´¥.ä)-'­ü·SgHóTëbdâ—'Íø(î$˜®Ç¯EïÀ&ï.Ô«]O,Ÿ¾2ûóyL|¯Ûl~þE&tfå´ÚM¡ËfE=¡CñÑj†·=èF(°ñòe(à¢Ó—µJ=(¶MŒOûH–ì Þ¥¡RÖ&=zzƒÂ4ê³·µÂcÓ> ebâž²þ³E¯ +šlë04j6õž­:Yޝöˆè^µA`~;(D?ýÉ¡<³‘fûDqFOm㩲x,â·j(ÖA‚$ý|î@JÑÓgV»¤—ÒÂìÁñn±—¡ê€¡QÖœqpUmdAó9<å“.Ðg® 2~}Vv|Ö},Âçà.🰗4ßÿÆžbÙOxÿÁ„ ήۧmdý×ÉŠ"©ÈÅô|§^®0<¨mP–ýßc0Áûo¶ø(F„Ù|WXÏ¥¼](5 ³AÔ †Vr˜-ÖaUî䂚õܶ¦Ï"…çpöe–{_>Îz‹_ŽN¿:î‹­ŠEùvíý‚ÉHÁ"Š‹ ¬ ×Jº™I5^Mdº9ØÎÏ{íñ›Fé_6ØÅe¯r d"XX¸á¹@©L¢¡#h/ØI–ol€<¸gaº”Œã‘m¶—Q¸•ÞýéÑ矇o>ws´ë'3ägÏ–ÙµsîX—SÂv²~¤WS"Áp™¨Ö.èžHzl ŒAçÀóÿÇÛbÔ’ùA`ÍÉÖ´7ØáéqñJé“%ïGÍìf<žRhRx¬9P®•qÙ¬s{06…ëmäX&s)ãŽk4ãm‡Á ¼o`í£r4ÅýL?.+戵0Ï¡éiòãÁj¥#Ä8*aœ Œûý†«ì Åb^‡”ßÈì8¿*²óîògƒ½‰Èî§DÞQ•78¦^îŸYc|*¹…+cîlQ‰ŒÔÈÄŽ§Æí ô®W¦²»ˆÎ~–l$0j«ªνOÃÒwp&•a—çþ\dÂÊ@¨ÝJìQƒ và ÿ,óéÇG|ÚŸ•JýæÞÚeIÏ2˜ÊUÚ½Yš© ²µå` ’ä¡§Ïv,æù/D›Nu+·½±LG…ÉZFõ£+/q)cWÄäSÒ$Á— …B Q™ÌgQRnÆ%‚Ãã­}r—U¿w¼K߯Öð‹DuI©sUÝV/ äövŽ)Ú½#¼dÆCŠIÈ7ømËXA'1F`[a­Ý7ù°fÄ*Øó+˜•ÜuM JkÕS½Ãñ_'š-9wJ¿f´ÄùÄ™>nûWYbQ(Ó N±ƒ/2#y($ì„ÑØÿ—`“ŽÓ2Õvôç%&|l?²Öy*½Z>ÄUe±̨c¸¨iÀ¯¥(rN½L”_øÜf.Ú /ªmU,©S¯7u2{ñ¶…œçà4î-‰éÛ"È¥¬–G_kµØ¥tÓ¸kAñŽâ=Ùàï+9L¯Øupl®µ äì½ZmÁ®éO®tœê(!r|Ì ·Ù®ÅÍ3Ù¤›]Y@Á"ª$`Sw€ÒÒð„„f?öŽçV ÈŸKw u¢O¡±[ ”Ö Š+ÉY[Éý†- 6Wðªb ™PeÑW°Ô?&2Ür†ší&Tr\±CgÃB€ðcÆ~T¨!•°í˱AC±\rI…~]¶úuˆ;„Í•¯kí´% ÷&,\ZGj–§8•ûu0p¯oR¹×¢v¥ì‚b.@뉑Æ"$z‚N÷AÅYÙ£bW¸Â¼ì^Wdñ8Ù ÷v¤öþ–-Ð7“ð×§¬-žëö ßó|¡@Ø £.#¢&ˆÁdU·ðxoù,p€#‰;ÿ=”†ºußþ’“è”ø-ATäc›õ%‚ˆ VãÙêyÈCF»iÙjó$uDÙ‚²ŒðØL7uê’¾÷U%´&`3þM…ëÖØ9 s˜awñèíÜtïÔŒåm·x:¯¼¼,O£+¹>šáéµX›”E9C£jù™­ês…í<¨’U©„ ŒÀöÙG0>{’IX‹˜U{t¾Ù–DÇa"ªTócËC¬KY 3¼Ÿ=áuýí@Háýqñê %ŒŠn‚ûâ3½ §ò³¡šF86ø®¹Ù¸YT)¹Í“\ß~&ªöy˜­N"#6xæáFAÞÏxpÈq­ò}Ü­#™gQÂA艰 ÿj´ùHÔ¬òOÉ L‡#ÎïGÆãØÅ–Ìqô?>›Á‹”î-MV%¥ê8b—{Qsµ&®Ý£(!GZqµ°rDÝQ‰Åù¦v>í]ˆ¡üÆ)µ ~Ÿ3xÆ ¾cn#›d-ðÝð¨¢eØb, Y±>`6ûe³-àÓ2bZ­Ü)v0 íÃ$[Ï ó¬ ›ÞL@“§ P³a¦DŽdAøjR¸Qÿ®‰ .wtµ ~;}Ã:á—l¦5¬"Nßqs/ÁOï7˜Oyl‹­­ï¸ÂÌÄB(øî*ú6UnÕuÚèú®’¡NX]âo×–àGXê%P†w8 nàÀ7N¯À½péñ€øøxŸ¾ñ&ø]fƒÈðJ = oÎ|ç\^j­oõÔ>Y¦l~œâM ®ÿirªäXì™Ã‹S8ÚÇڻ|cE†’ªwl[¯rÖÆRÉm±èûíò7éqÇ&*”Õï§üTâ/Ÿá#Z¸/†E*©ýLÞÅždÿþÞ!ïøõ9 Ôx4 YMÚ +ϵQ½¾âZwW^Ń{’–r4Ì:áP‰Ðò²ü¶œnÙˉRëºDGQ¢]QÕk[ ˆ@|%Ög6ö VëçªÛÝ«§Oˆ%VÉ0I+™b%÷ÈBÄ~UPQOøl’:ƒª¡¢f ŸQòª§µ8µËÓBÿÈZ¯!qÎKäëô0Ãÿ2£Ã¥³cð|]zõ˜]ûÝ3‚Yü+‘Ù¸Ÿ$„?·­(ˆ´ŸcˆéüLP3Í*4i·n¢Ûì¨ûˆ]ÆbéÒ!¸°S6èÖ÷S“?+|“A¬6º#5cjªFÄbé<¿¡¥>„$úþ9ÆFQgâ¹ø](·N€>JT¹M·jY˜nj÷N Í—fLøŒŠN¤(äÄ쪋Zâ’dÀmîÊc32sÉ×@–bòk¨_vÓxr ºYŽ… E?† Ÿ<)0>SêÖŠl)­åÞ>!’ÛÎàÌ – ð%A9SøC¾óFŒ)Á£³t"EÖè{p¾áÀÿVóR«’ásyÕJÎ.a|!ÓÅôò²¹ÊÐZ£?m»öëi±ÉŸ*–›  ˆ¸!º»©LDÙ¬\òVx·¡C³×7[öP§¿†ÐÖqâ­¯^ÖÏL¹0ymÁvÅüæñÇà%ò8'áV3³ z8¦^·ÍŒc(oÙ)§ÍrŒ«ãLSìñŒŽÒ3½vw RºN…o¥Ö‰ÖnºFyjÀÃÄǰŸzŸ…ô'U•Ú‚ßK²kõ4Š®séNLt!"iŠŸôv`¾à¸›i0«€x³:Ë2½Ì}_R†~9}[ÿÒq)¹®.ÔéR4Mö¤ÜûK/q‘Ÿ+­;Ç|ÊŠÑ‚B¦5Òíå.õB±ÏŒî×v2mÁÆ÷'›F¯²ÖQ“·Ib5eô—çÚôÌâ )|~éP¹ŽŒr uŒÞOò}ÎãRª‘ÆË¼D9øåp>–b·“™Aµ7~g$w-/d‡ß’ß%¦Y£‰º9üeä8+üöˆë96ÐÎýövKU~¢o±U‡s =þÎ_öÌOå$GÃŒœRÞ´bBn±*©¶¤ÕŸ´¥çÛ’”ëÃᇮ€é—þä™|0(;—¹›!Yõq³aÚg%óÉ6®zÿ^«žñ|q*wîÓ¬¨ú´²¥Pã ÷8á éÛj[€ÁÑš+‘žI‡àŠà¾¥œ ëézÞý¢ÜG:oe»bè.P{ 5åô sîë1!Ò)Sƒ£<ßNÁNnÿ'ëŽõ؈gAºEµµ Rƒ~…`C 2ýÓâ̈m¬½ÖXðÛœ÷Ýx)K?w•fßÖ‰GjîŽ:G(w(ó—¯$÷[cúž\9T«ÝÙûÏGX/â3ò£±ªˆ¸î|«÷"$ç•ͧŒºËâó¡JTK„ÒªoHcLùòÃÉŽ˜q‰u3dgõŽôJ4ΑujþU‡¾Ä HÇMù“Ï ÍÛòøÏ*©zvÊA ékh+€þR<ÎeøØÔT)t§:^Ür­ù+ߊ½îÏ×Öáè RÀÂåæÍ.¸§ýFÕï`Æ£cà›¾ý¡Ò“D\˜B-þažƒ´ØŸE¶QJbk˜;ë>¼‡H7hîzQA<ÍÓA”¾öis‹´ê¸<Ì…Ú }¥eæ‚1¤ßGtŠâ­ïû¹yÃKÅvÞÀÚºÐ`7kÊ“ÅåUà–)L ^V½”OÄþp?sá»IöÄc™˜‚dz CTä·:xÀŒÀ´%—UYÚxé.ÜæìÁW‘&¾g•Êzø“&àLñtóPûQqñÃG‡¾óýPè„nAºØ› Y3±K´E&Ê^ªB†æ6Ÿ³´n¹‹u)ÿ‹¯Ùó% ¢‹IBìlÊoI•ȶPœ_ÛŠãÂ;ãG!”Pä;ҬS^ât0-^ǵ3⦮£z] °G¿ÌXÙÀ2Ý.U9+² ÎÇ–C Ø2r<‘€Í/j~÷—ÇÃN—mÙ0XV·Ùß:>/â‰_昲ÏÜL åºçèÕ´µÈ,çI0i¨'ÛÞYÐN‚üÍñè61j¶Ò^êÍ&+óíŽHâŽÈ©’¿v#(¸Í6ûÓ&ÊK˜ÅkÉÞ až¿Å¸¶D†Þtü¶ªÊB÷¡nUº» ìn–hJëm6>2Ñ–’ŸókWó“Ô²¿|öЇ ¦á2šA©(%`”l×OÇ_-z•"[É}B›©@97ÕLï¤Àß»'¼ùüÒCâ· Ð"ÑÛ)-]Pp';»~Ó7Ã~«>½Àz¬«he–‚FBø 9ë,QðâFK0=¿wC²üâC0T»6-ðb šEÉ1ö¶ýmjŸÄD»PÙPŠv;üèÞF×pyýAÝæ­¤B”IyÉ39TÌcŒX,“ÖWëu6‡³¬vBl¿bÚFΔïvql•ž[´šÒ¸g“Zv#³`©?é+°é"—Ùæ.¶…ÀAÅ÷À–žÛ‚8¿á%£°ÛÜp`¥7¡üÖyÓ9Ú ” °]gM.U's„M¿Ù8øÍ­ÊzdDûùSÊ¡âõ‘ì4Úð;½7z†¼ÁxŒÒ«„±È¼»wèói½o¿Ë£$z¹IÒx&<®Äèâ]H Æ¡çCã?˜(:Ë ýæH¢ÉmÊMüü”ÿ¦ö—1n¾â…µ‰†ÞµbI _D?EEŽŒïÅ ¬™¼öXÌ» #ýžÁ;u°¸?Ši'PL%4»2ˆ?T¶Þßêøî'9&ƙƆ!Nz\×áE]ú©¦Noa[×Fi—¯ê‘d€n5ØHwþKòªßúêÛù>Œ€R¦½Ï&„Wø‘ ½šó$»©ô¬'Ä(i~/DÈÇ<ÌÖ&'A¾çL8>i¡×y¡g¬Ÿû'¶”4ïO§3Ñ›âSUVÊ"„rÝ­QùD€3;ª£R²Â£«·Ð€®ç7k'd]Ç^Å:Ç ÍêC‘ïüÆY­aº ¥y½ÓßWXg­¦¢0ê9/Iy(a Érµ…]û¨<×”c—رX¤ ¡ìÌL/'{—¨õΫRÇNx-y—΋”<ßF'€süÔ+çõyüª/ÌF¨qOCS \uXôí(Ê´§„DµDÔÃùåZ:š_F[ O|ÓmÖ¿ŒœÏâN3 %Mîp ·J§zE—ÃPnE´S¦NSÇ¿5þèF¶”m¯XW *ˆeY¨ÛaƒÉâÞÜ¢*Ó‡Šhø¦^zªŒ°P œí§yœ€wF~çoî‰å¥#Òý2hž9V¬ãl‹~9v–öžÓA–Ñtd¹0& ¾`¥ñ$õü]Ȥ­Ý®<¦õ®|;¥;1öñňþƒªÇš¸‹ß9ÝIJôú»<ÞYÊ5xdòáºÕÝÄ \´¼ì.>ÌÒÛ#øÞKÍ\¡–U÷Íy²tQj–å1Ú×u‘8ãñ&Ù &Ó“_?NÚ &9ÍÜ&³yÌÏ5zï&×pýéJï…µýM›Æã‡U,§ø&õÁÇ㻊˜|… #Èi®©±ÝͶÚôfKMǿ֣ðãT=!fª8JI‰”™o‡å|© |GæUÞcGsËù’#Þ3–žZ?÷TÍ.„jâé’X1°Ô°2Pe}XÜ€3 Lò= ×rÍ{š¿\?–Ië×Àº­ý¤‘=û–rzy;ÜgîõÚÆù%ëwfävÎW„éãi/6´äïJøÓ™Ël¹áeP8u‚0•N=Ñü'¢6®5neÛÛ«°`i/1ZÄõh²ÖÓŽUˆzÔµÞ/CœrîvÛèÕËûynÖ ž{Vì2£>ÕЇOE:g'¤ñ¿ïF/†Š`ÇÊ&«L³Æðî`{Æ“®œÄfmŸÏoôuðäºIÏSZþª‘Ml»öi(k³í±LsØY© ¤ÈgØ<™´ž@œ›å‡§G Ïóª\?Rê0›J@gUØMä“rgö׉.‡‡LeÓßÅnÇq.‡ìo3¦ƒÑl|y€È3Ŀۅü¬E£ âûSÐ £â¼„†52vŽŽef‹m¡óF wÄ>ôx¼,•›“^¯¹M^ãw4Ó²ëÍ·¾Ðâ~¢–®ÌÈØ5Ã,æ{Ü/ À¦50VTÀ…ü”…ÛÃ'OoÇ5å ‡°®ª|ëI ®õüQ»~ lù>‰¼{–™^¼õD›üngzõÁÎlŠEñeZëá¥|\r£Îm·­ø¡ËËÒÓz ²Õ žé]•ƒEsò$·ÙÍg¬öocZ±¿ô.-÷ëõ«°áì~ƒq·ùúl¯˜'`Ó"o™(Ol°}6ä: |`7ú«ÐB1\ÍÒœHʤ±W"ÿÅ(äžåä³añæZ™{V˜Ÿz ~î‹câ-±gµçXìíÏ“ˆY¶‰ ©vÖÍ%v®dÿ}‚¦!GP¨ëÖe·ÈÿѺ;aÖ8€íI[ó% 9šÆ«Š®x^=Z•{ö3‡p‹0¥‰àùññ•Aóà^¼ûÑ ]ï‘Á)â7IVaÌ…(Ám¨'¶K®õÞîo7›Çm[•ž8suƒ4iÕ_nPHyiè¹l+‡%aM¼ŸšÐ.´ïw*Ó°œÏÀæÓ:О. ,:õw¾MÇ…`hÖÊ¡µªµøe÷hæ àÿÐW•˜+ªm,)Q§> ¨êÒŒZÞ‡†*Ù°f556Ôš\]FXvEuÍ -r¾x¯Á’…çn0\Wù³A:¼„ÌißçSxBÿ2YNûRúÞÔL[u:l<µ‘N…$(+¸±V(° ÙOzbÕ,éðíÿ—Æ endstream endobj 23 0 obj << /Length1 1684 /Length2 10291 /Length3 0 /Length 11369 /Filter /FlateDecode >> stream xÚ¶PØ-Jpwׯ‚»»[pw§Fºq îÁ5XðàÁÝ]!ÁÝ™™;3÷þ_õ^uÝkËÚgŸ½ö)h)Õ4Y$¬ @YØ…ƒ•] ¥¬ÁÁ`gçbegçD¦¥Õ¹9ÿ2#Óê]\A°à¿¤\€æn/6is·—8eðÆÝÀÁààäàdgp²³ ü'â"6÷Y”Yo ` +2­ÄÉÛdcëöRæ??ô– >æ?ÒŽ@¥9 lîf t|©hiîЄX‚€nÞÿEA/lëææ$ÈÆæééÉjîèÊ q±e`x‚Ül@W ‹Ð ð»a€Š¹#ðÏÎX‘iZ¶ ×?íšk7Os àÅಂ]_2ÜÁV@ÀKq€¦‚@Õ þ3XéÏfÀ_wà`åø›î¯ìßD ðÉæ––G's°7l°9ª²J¬n^nÌs°Õï@sWÈK¾¹‡9ÈÁÜâ%à“›d%Ôæ/ þÕž«¥ ÈÉÍ•Õäð»E¶ß4/·,¶’‚8:Án®È¿Ï' rZ¾\»7ÛŸ“µC<Á>kØÊúwVîNlÚ`³;PAú¯ò?6 €‡O€t½,mÙ~Óky;ÿprü6¿tàçãqX¿4ôY_¾}\Í=€7w ŸÏ¿ÿ98V K7€ÐFþ‡ýÅ ´þ¿ ßä0dÑ€ý÷çï_Æ/ò²‚€¼ÿ ÿc¾lò²r2ŠLvü·ORâðaáâ°pò°¸y|Ü¿ÿfQ3ýu öRÀÖ€ÀŸ‡}¹¥ÿØã¯ùÓÿµ €ÿæR¼ˆ ÿGãFì<ì–/8þŸ•þGÊÿŸÀ³üß4þ¿’uwpøÃMÿ‡ÿÿã6w9xÿð¢Yw·ý+C^¶ü¿¡ºÀ?wVhrwü_¯‚›ùËH€mþ¾F«,È h¥r³´ýS,Úµ/™ Tƒ¸‚~¿*vöÿñ½l–¥ýËËáú¢È?\À—Åùï’2`KˆÕï ãäᘻ¸˜{#³¿‰“‡àÃñ²ŠV@¯?4 `cCÜ^R/íù¬!.È¿'ÊË`“ømúñqØþA|6å€MõoÄÿ©ùâ°iýƒølz#óÐ ‹åßèwÇlVÿ‚6à¿ '€Íú_ð¥¦Í¿àKQÛÁ—N@ÿ‚/…ÿ/…Àÿ‚/… ÿ‚/…œþ_˜]þ_˜]ÿylnÿ@Î*ï?à ÆÒÝÅååiúcu^¦öüÇ;z-‘— –B¡vµ¡í7Õ$ž,»"³´»ºi ,>Ë.îwèÉ UYÁß\®$’‡{0W·eè/ÅW(}~¶Ô#D´~Po»÷}0}¯1½Û†¼4…?0YøS¢®Ÿ ‰”EK|Ï÷ÑÙW'ȦåUçÚÎîüèjù87ž}r^uýe_ÇÂvÕ÷ªxQÊfXâ´c‚Šçhó,²ç ©àÝXȱO¼0æ.¯f±s'Ÿ)Þ¼gBöûÇUäc°ÁùîvþíZ…§k ‘!Ì%öØôkÉý”7‹>%Ÿb0›YG9óßdÿŠB^zCIo²Øëc7¡Ø ýëj#úµ0¼ctï:Ðñä­l»T=bÌžn˜¾œW·H«£:)$i‹ÕÓàªÓ÷fÞýðÍtq>È"mŒýËzKô;<—T\dzAƒœ²?fw/Í¥Âî/'6ù2ýQ.½ü ’úXúèßÔfÅ’åVò?bÂ}UKçû‚±–Ù½—*jcŠxÖÞF„'„î,|» «¥¼u?©ST¢,½I½³8ím בdyK©U­·™zígcï,-Mð ÿý¥Oå#›„OäèM¸FØá-nJÏëmÝùƒKî ý+F¯-Û™öoÜ d ž)Nh#‰Â9Òü 'ú\:ûƒÓŸÈY Sk‘ÚµÆÊ²½Ìß[u¿Ä†œ2kÕÍSX "š­³ŽhYÓðÞaÑ[Ý‘*h@‰ 3”-<<1‡’viÆ~¸¬gʵ1ŸXÑ8¢ú |â(˜Í@:»Y‡A\Ñc*…€ÓïU%"3b•±ùu6Sô=s$JÍõ»Œ£MMU{ÖÀÑŠ—Œf|zÒE—_>M‚¸u‹ x =sËü! …Y¿'‹REÛnÒ=A£°åW3ôQû3n>tûÍžÍwòµ_¯!®“1ÍþAgÑ"oK)*aÖæÎß  <}xï-7t=}‹!â±Ì":Œ&€‹=ø€í/ÞŒc‰™nü©æ´“¦ŠÕ¦Ë\ˆæpÒBYÆÛ&q}‘¢öùï´ë|E. ó ¦ñƒkîoßS",u¡oåætýJ0#%Ãâü$¤ö ÝÄ•y*îë&G)CaølŒQVÃb0áøSJžCœDVUå\‹Î¸¦éh†=ete¥A@cuËt±;æý¼œDÇÕ:Æû‚¢á¶äÏb]}­žõíÀ#7Ê3ß¹ Û!&FæéÇ% =[ožòK.Ú",ÛŒC’u>;fU¯Ùˆ¦ËÕ4-÷Èæ•/нêêÉ~tçz ÚEPñNþ%h‰ ÉÝ¥3­¶+§ÕIåƒ ¤{pÙêÀü/݈«vgüz8–¹ØŠ‚- wïÐÁÌŠ€Ñ#Ìäa±% ÕdGU=²öB¨×d< +òûF¾ ‡Ø[„ëªÞÁÀ]ÆüÝ,vÅQép­ôr”º•P¹©ÑóU­ùãÔûx¾ÅÞ9–¼OO]0O ªÖ™’ 50ÚÓRÖ2ü¬uh ºì>ë[ƒrsŸŽÂ’ö‘p$k®£ÇÃ$q4ˆœ¨mÛÖà±Ð:·M¿E\v*_\-ûjKG¯§—ÏÇ0Ž2ö/ŸtϨy9~É©v!?ÀÛŒáŸdÓÑ"ÂãëЕdsÇEõ¼Ñã ºö×щ©´†˜\ÛJƒÎê»;YZB%†û_Èç·%¾(á¨sœVßî[´é\ÂŒÎ46žü FÇv`bž©éHàŠ›JsÐWPœ&*Þ¿áá)¯†·y ×d#'_9)Eônyö~¥>Œ•%O^xƒqœ#Š¿MúÍú²ÅR]€Üœêë¶#˜à°á~ým‘ ¬‡E‰4o„fRàWYÇÕ(‘‚£PŠ »»øØâ û1Ö«ãû]éOôì%„kÜâz"Ó\–gmÏküµ£õ»ˆöT=76² Û,qq<ßv°4?'ÑÁ0¾ß€Ò!„ÒèÜâºÿxi@÷Ã6N}«ÿ üY‘P¹.Ë Ùb,½£[ æU³û‡(W-ý[…‚rÇ0c«µáϨܸØ8•S—e—ñ1"O-W9î-z"ó9³b„ïëÙŸun牋ÌhpØDß6Zð-ç<ÒÙ}W ‚gŽ¢íBö¹ï§·{¾°®ÌŽq2ˆëVЩh—o‡Ñ DŸ¯$†1±‹È0”12¨¥.؈8Ô3.h®Aßz¶gé'â':¨ëÎy3>™Pœ {ŽL%³S¥7÷F);EÛÃ5ÿôÖ¬™„ G§Ùyµ 3•„åj ØŠ ,¦_è¨þ!Plý“ʩ̀tBc6,•.EÁ‰Ýy12$I{eI˜bÞrçWaíY›ðM‡Wã.†Þ³TFn³òQ„žÒ6U—hiÚZ ›,hl¨AÙ“ÇT:ع0©ƒâÖB°ÞfgѪ1Ý6iö1µœjÂϘ0+14Ú«°K“n™Ó;÷÷dñuLx…s×­Ý.ðL½Xsáð°þ”vâøMÔ\ïÚ™‚ŸRW|”¦á—Ê;[ÅŒoûJ¸é•úÈŽ’*cRqrY‹+¨øØsRít&#[gj ÷Ì^#Ý*|½_uÒ¼~`¬5'%„- ¹¬©`ÔØAìa%"[Ò)fbÓ·ì~†k|™³y¤U›F-õžÀâ¾äsO®i­›Ú›œr8°³£C ß)T/õC’—+WÍÂPn„Ч3ˆ³ÒùŠxM9•Et ^+ÐøN-Ò±´/—‰BeiÔ@Üø±N@”vNpL;M¬°­Â59_ˆÕ"/±÷\Djˆô*Lñ”¶h;þâÜ)¹öˆe»}o¨—þ#]ÁCýC:6K¾IÃwÖ.†ö"F6jY…IM§Þ ¿0 Q#Å ¿ØtÒN}øCuXñGv˜øZùV 'mBð޵زãX~7U¤ßÙÊàY•ˆiãóØ£0?Ô:GÔÝ/ V`UÀv³T@= ;çå ÿ[cB¬?ÉÇà„ ÕóÍ,¿tÜ— KÛãa£‘W\S“1¾ºGã>pH¶éÊïÐØðKt–%;ÙÊ…À‹×^bï< ŒÏ–z|ÕŽPÂ>\%H½}BñfÝí†Æœ³&Ö)˜'†oÞà(F† Î_¦Ý$ÏÕ}ï‰íÃî„l5O#žAõN±_5žýÇàJɇ¦àžn•luûòƒp½\Ä@‡Ö+}o±ì’Ñå/Êe¸D,Û+&U À¢˜ ¦T1±zÔ8‡r9Cªìq)!𮀼ø27¸_ô ê3EØÈ‰3<áëZåç]Ö“·Í–cÒ m°’ˆ³ù׆lRï¯í°UÅh(3!8 U]°Î>ÌOk9(Þ5øÒS‘­ü”4m]ùÖœ31»x+ÞB”ìPÞ ƒº«Íqs<˜1×!¦Wó _¶8“EÇCNV°yë²3w.K ±|Æ‚ÙÃ.Û²_×¥$é„úWLÌté[­©È'5"y ¥yˆÒOVjãÒæa3‘&uïööwŽòÇH'°ì‚µ9äs•PN£'‡JeWUćé,ÅÈLa ç=Ðn-=µ„ÆßÚëE6‚låð)ŽBðšöÁ1­ð‘ Öö“4ûJízqƒ¦ ØAlPf+gkâá»*§¶¦&§†ÕŠô9³Ì÷äË•?E`§·7›%±Ï+ÁðÊ}³{GEVH }¼&¿,ðwûzÕ%Þ·ÔY¯¦÷£àIj+d¦µÅ¥*½¹,UôPt’«ëï° Ùq)îÔ |®nнL0C©· ²‡ ‚pä÷)9âËј^Õ¡É´iÃýžöãdßk1ðJ¿a'G$YÂ~®l„¿€A”¨í›OEÖÀËÉð舗ÒlSîªi½ü.º‚¾÷F7whZ˜XNU›ÛΪ²½ÎŠXšt×HmÔÝTε%˜ªÖ˜:¤’Ç—z ÍiS^Ö_©QËSãàœBÜJÑw{*6?·8· í™Ù$ßzBlYuŒx´”6å~ðÒÉT,§ÛÒC/iÜß. ´þ‘¢hPøSä3Ù¨ñ©¶oú…¨de桦Lˆç·`‘¯p4vÏëÚGtìÞO;Òp½yqðvfyÆdøèz^ZÈcm×ݰ¯ž DAWø#ô*"ôã¯<³| b9f/Ì?é qWUøó$+%ÐøvßrÝo¥x‹|»êˆÏ›ð0ø £ ß5l³ùJð†uìs½iέÏlÎöõµ¿€$ôVž5Œbê–áåÒÍætç[ݨšh‘ì*Y%ÓðRb -*þ¨Aô2d1 V²ÂÂÊï7÷/}ÛQø´ÜG¬-tK¢­,·‹Ÿûƒ¢‹¿FÿBSkfM™»®Z““ú؇ïPħÞÂìÀ®¬ñ€¥6JN€…I¿Øð˜v‡ëzD¹Æö u«+D]é| ÎjQº#Va¤·šèõW1® RÿN 5*û'=àÔWG‚ªé§Â«sfê‹ùh% ¶OÅÈvïY׎CïPœz3ã½¾my•kÆ9zbLØ–l¿`žÇ´mh€$õ‰z7ÕÜ€`”°˜70KQ1ÆíC$”{j–‚úaÔí±ÂP”R‡ö$Þå6‰^½ñ¸dA@ÌË  …|³ã<)ª!ÑÀüí›\Ñìl’íqÍ«ó2ºü‰“ @O=Ev†N×*8mÖ¾züÑÆìÂεühÂv‡„VIUÝ-‘HCå*í+¸¡–4»pÃÔ^ÛH#I™º€Ö‹úG "ôOÕ“ÃàÉÒ^âÖw&ƒ]†(fß@ä’+ï¯ ÇÛ|Ñ!äZä%‰ßâiœ‡dPfàï™s,„Ìgé.‰ckù¿€GcpcZ›‡ŸlP#;®‘_®Ú¾‡³xHï´×üÉš¹óVê™M$¥ÍÄÜåmc¡z ù#ïÇrÞ÷¤s`©ã¾o]ø¦=IL¤u"× Ží¹˜µç‰Ñ‹ÀÊ ‹Ï!³~¹Ià6Ùðx×Ç=ÑC÷ŠÀ+%ð¨î‚šþšŠÇ·ìB7ïW’‚„*¯âÅíRÁÅCFXŠ~‘gyKçL¡^×U×`äÖ·F~9Ûñùª†;õg²# ó-º =ÜÂbñDûkýòáÊD‰Ú¥Ì– ì;‘L¹ýÒxQß.ˆò2üñ6ªÒÏ„ƒ@ãû^ÒfõÎêžÖ%N)²e_›o˨éßĉÓÁøMõˆI’Sš=œ2|±~Reƒ8~òˆ:ǰ‹ª¯ NäÍ:®U6B›r…ÎFIeVM {ïÆˆQ hR£O7!jê Æøƒ~ÊÛMêÄõ“çÑמÝå;ÈFP0õèØ >Œ³ðe4'uÒÏ„f“¼2ªÌlº1sÜ,ñ!1wJß¹,–A©Õ©‰Z?JÒèÆ$øÀQ#+[àh†J]ÇÈò³Þ¬Å¾æ° §Î$ Œ^•¯¹xØZ6&x\Œ“ãßÕK;'mý„P.À)›SÿõÆs"㳉Vælj¯õÙp]Ÿæ²¸ƒŽãH‰` •ß”é$QVËr55ž“=3ò,Ø+ïž@þ 13\ea4Ca#ýA®¡ºnBI§„c=[ù=çœt¢“Ù3PŒñ¸ËããW35·S~í“uÉsüð}^ŒÜù; __ÇòõÚÛ»I[« ñõ²+ë+@ðŠ–ÖëÈ©¥‚±áÅ¡ï6ú¤oÇH´Ãk:êÖí¥óPÅ<ºÈx,ïFRßÑ“®Øžæeõiu9ha¾ÑklHï {åŸzÇ-yê̯þê3¿·\÷øÝ)ÓŠmë€{Áê#Еö_FbH>¦ƒòÜz„ñ²|M‹Ã€³tõvÊ@Ž.0s³×„w¼ NšðVš¢ÉI± õ3#0ª^»¢^ -[‚0¦ŠpxÀܾ—é`Ä”'‘MÅ5å¹2Gg­31‘ïqªÉøROOy؜½Á]ºØO–º$- »‚<ñÌàô-ÿm5 g®F£Ïñ¨ðÊLDuû"É•\4Ú„6#@–.4ôg (O]ç;6}sv–aèÏÅa Ù÷Fî¯î‚§"ön¼íŽoÏ^ç*–͹h¢Çr÷½ÓDœl¾Z1©Qãw® ’%]‰ÇV¹¹µ'óí0ê§°üÅö­~)͘é²bzÁçØÄ’r2ó(‘nÒl5”ê(â=I¶66¯'D.zÚTÖ†oǾ¡)ÒY¬ŠÈ¸âˆYqnXo!êÚHRFgP~à<¯×[jLÚ÷š/Œ³lÐ/„]ýnu ¾s%#œäj»Ê=8Xl_Ó-ð[d1€è÷÷}µ‹9ðkŒ‘óµ5=YÚòî²)Mëƒæq!cB^š|Ð2éx gvôŽOt"Zt¹Šä: ÍÍÊ#ÁÏo|öÈ=nN{š>çJ·6±0¬¨wôm*©ÆÀlfÞì¸=É64“Ž‚ÕÒ­ÊKûU’‰WáN§YåÒNèB•†Û0FœüIézTcÇÑ”BK,˨ƒgý` Þ¸PdɲZŒqüpü¾^t%d A±ü2tŸ%.—‘0@å=®s¯ÈDã¨G!þq¨TZ̦ž.Wvž,?b/*3}5,=]Üç/éAsë)õÿVn~ú¼Ÿ¤¡ª!æ$±›¬Jò¯R¥îÅ‘U¼„¾§¦0<•âf&°­€Í¶uVN¹å¨BwèW‘°­í+8áoAw7› ôµ8o‹ðNÒƒÁ ìí5°—ÉW®ï,Œ†|õ+ß\„âDßõ„°”Ë[5rnàñÿ*‹¿u½lÑ=àø<â8Fˆk(ÈÏ Õ¼ft„B¾%1u×j5ïºa—ƒŒÍÀ¹Ö8&••ú¼ n/É ‰ìÙ@PHd$¿H+µ¾'š¼í¤Õ¸£øDFÅÅ`Ò¨Ëûpó>œ¡o0Áaä-¹uy¢¿HŠÔßðZãý1ØŸþîkàÏòx—®Pèøï`»ªxÉjØ&¯wŠæ~æëÞs^l1&Lš_³{ê.‘©)syÇÇQEô#¹¢Á-¬TÅz§')®âà¶ìZ4FäbªM}g« ˜£gÜëñ)Q熽?Cm+µèUíâ:în/‡Ý}2ñùM/Ò6°?µgÍÌ]j f§­LíÊ!áÚŠ‚›L) ºÓ8BUÌgLbñun Ì)ö¡¡Rî!ÈžžûOìA•BÕ ™Œô|P˜l†كugŸ‘WÛƒxì;cCǘ¾ÜOõÚªðÆåfÌRàÒ"l×=ΧúÌøË௠Jí<éB‘ŽÈé[Ûm¹âÝ݈9rÓ¢ ˆqKsñË&g†(â¹ Ú”÷à—ß2ǹïJøþÒ·tð²QQBÆ3_™Qñ´Õ¡›&èa“î‡Ãµãou—a8Jÿlnvï<–M)Ž~G4x6›žaÝ @W!|ògmÇs ­4Úè(q\“úxæÈù+ΈP¡ ós†ýSüÔMbáÂR¯tÇÝØ2¤Î5¨±Ö’š½hôºã¹´hŒçB#õuI€J¶6æ}®ƒÞz‘Rß²U6zþÖ}5Ô}+ƒï µ¿Ø™9Á  º”)>àÆ;ûB³>/MóóH÷í=êÆA ;ï÷gúBf‰ ©ýþñG®¹t0ügì XGð $?:–ÅÜœ)0Öœ¨Ÿ"ÒKfq+Çn¶ë9‡D½cÀδz-“/eØ<ç¬f‹N,óÓÅØ¤7H}º‘ u´;ìz‹Ôsú+Ë…]ݸS3sªñZ\“ìä[´‹ÜàÔÈ´äýÒ;·¹O g÷!3²îÔ}…ôaÂBŽ`㤆˜mOªâgá2EòˆñÜ{ºßÆADÀöhh­¶ë*>3ÊóÂAù'¬Ð†¢Hé~ )Ÿ¢{åãW¡q¸Þ7àó:ÂûË>rg‡ó—é€oæ¬åŽø“.‘ôØK–äé夢#ÅÕm͙ꟕ†÷öl³)ë]…\§òîUÏcMsÅíeá 6Edz×[LcÕꎷd¯hkê2Võì KTÔRZ¶c5¾[˜8’ úæbO8?ÏYŒ¨u2­²îe ¢ójc„¿ª›mÒ~ÍìØ–¥I?ð½K{Ïzqš@ã;¾¤j  Õá´ãún†ŸŽ:FF‘êÐÛ3$T³™Ð;…ܦ–Ò3éTà kCÜ™&l®¯ äWìâ>¥Rh¯árƒÈS¼6×çð‡2L¢.?4v²ø‘I ¦Ažü3âtß¹?($ò½n´Ä`|ÂstÍ´`ü®;kÝPö®t´„´§eÞÂ\ðÊ®Î+’Çn—vÓr6Dhr‹ÖcÝÿ)çÕNqˈ—Ý+Æ9ß>e¿ÙpvdBºø€¥±2%߬Ñ0êQw¦çîoè ,îöh<©Bµw^sŠ:¸þv×É\ xÕ3_˜–çöc›Ú˜­û)n}çZä›jM5†mÙÅ©Ë/ïé}?!d¤HŽ ·Ë'9êÞ~žR/] h ±g× @„Ö§©„z—ñÁ0E d8\Ñ|xw¶^O³*7Ä0ç øVdçc®„Š&Ô¡~6t:³‡ý¨:©&ëëTËK/4á,ô™ÙæhsŽèhKÕV61"öõ¥å9ó2 ;Æb›bQÊ—¨Ãi0„þǨ²uò²ã²¤ã“FaD4¿¹1*_9Aò’XUuì Å ,ÄWf•Ú±¼ì÷ eЇ讙Ń:ƒ8?£}……ͺÝ÷ý™–öS 1¬ÝHÒà¡÷óD‹ôm÷S^Z²3–¨ÜvZD&÷Bjôü}ò“#ÔÕª&™¸©\‡t++BçIen ö˜m‚Œ_Ës¿™bpÝX(;R¥Þ]7ùÞ Àé¹…ôƒY­ñùö±„&q}, ü=RJµIŸ®@ø'˜l”'Þ–RÌc’‘0¡(ØÞñÖ¼Ìê=ŒôòÛ7v¥;é©{œ{G:¤fØïíNüßΡԴói˜Žev¥R8bx\[-ëÑ2¥‡Á¡ ¼–ªÑwжׅ¢¾u é TCXëZŠ¥Hl0»”oz+—¢’ÂãÏ“ØÞ•_þ ÓÔ^Ø=¨‚pGI¼¬ÍwÛ[»x^‹Š Í«R…ÖçC]&–yNxzáåávS¡^Î…ZŒˆ›È·äGª½ð˜l׾̌ ²8ËÝ“Yí[Ä=É*ÐÍ0ë)ÀʵåÊEq{ÇT-q£Þ\ª F41×?¾¦A}9Mšb(µîÐBØÿ•¸0ˆYFWà„Ž5wÜ$KGB›r‹ðv=/Û+üb¹ ñÄKi–À$âç3¥ vMQQƒ¶“Â¥×Ò4æbõ^pÉædGvKI›W¾!œ†éÛÕ®©rCoQUr¹“vö¼6xâ0:C^·¹^ß JLZøÕ!½WVá1™ÑMÏCN8Ü­‹ôöåQ÷ù:oãJ lõ·§Ês·Ÿù⥵JØ»ÿƒlÔ”z“6¸¯H&+;!A‘Ñ87˜Èï&‹M}IƒHæñ‹·ÓèéÜ܆ǥ º,ý9M e@rWö޲3xLâ>Ç-ºÕk«š¼7Rœ¬"]No¼>~% ±ÿz‹j=H4;ØýcßsaíáÍ8¼SW… ¿Æ^=¢ÕÙúã5^¨ôàÄÞ¬g‘œÑCM™i1ÒÆ†ôkí]ÆãÿÌn$T endstream endobj 25 0 obj << /Length1 1651 /Length2 10456 /Length3 0 /Length 11528 /Filter /FlateDecode >> stream xÚ·PœÛ-Œ»»3¸»C€àNp L€dp ž ! îîîî.‚‡àîö8rï=÷þÕ{5U3ßê^ݽ{ïÕ»¾a ÑÐæ²†Xå!`('·(@FMG‰‡ÀÍÍÇÉÍÍ‹ÆÀ ‚:ÿeGcк¸‚ `Ñ0d\€Ð›¬ô…¨”Ý<|AQ!Qnn/7·È¿ˆQ€¬…;È Æ P†€®h 2'/­ô¥Î¿ÌV,!ö?ÃRŽ@• fµ:¾T´²phC¬@@¨×¥`~e…:‰rqyxxpZ8ºrB\l%XØ ¨@ è tqZþh náü»5N4€ŽÈõ/‡6Äêaá¼@V@°ëKˆØèx©ÐVR¼q‚ÿ"«þE`ü½9Nž§û;úD ðŸÁVVG' °l °9oäU9¡žPv€Øú¢…ƒ+ä%ÞÂÝä`aùBøséy)M€ÅK‡÷çjår‚ºrº‚þè‘ë4/Û,¶–8:ÁPW´?Ö' rZ½ì»×߇k†x€}þ…l@`k›?Ú°vsâÒƒœÝ€J²s^Lhÿ±Ù¡nnna^aÐô´²ãú£€Ž—ðO'Ïæ—ü|œ N›—6€~ àËš«…;uqúùüÓñ߇` ²‚,¶ 0Ú²¿˜6á—ówyÞr¿ÈÀýÇçßO&/ ³†€¼þCÿ󈹤54ÔÔ ÙþnùßNiiˆ'À‡ƒOÀÁ+À àááå½<øýw ÐßëøG¬Øùk¹/ûô¯%»ÿ­æ¿„ðß¹Ô!/ʘÿ#tcnn«—/žÿg¹ÿòÿ§ò?²ü_…þ¿+’wspøÓÏüáÿã·p9xýÍxQ®ôe Ô /³þ_ª>ð¯ÑUZƒÜÿ׫µx™)°í‹¢9xø9¹ùÿ²ƒ\åAž@k ÔÊî/Õüe×ýcÞ@` ÄôÇ óÅÍý?¾—!³²¹E\_¤ù§ ø2Cÿ]Wl±þcØx..^h/gý‚>—í¿!¿€ËÎËÉîåùãÅú|Içøø"\®_F… òÈ àrúOvÁô¢ ˆõ?/+wù|)æúøýä})æùøRÌëð¥˜÷Ÿð¿vÚÊÍÅååÚùs$^Žá_øÏ;ôZ¡-ÎA¬Ä‚ßU·ÜTH‘{plñòcöE\ èoÉ‘ºïhʼº=çËŽ\ê˜ùy»†·Ï[ð\oo@Ämoºê›)J´XÓ‚hc¹Éî;'~·ïªêÆûK¥½ÝÈœlmKtÜ 5àqñzš…˜Ýùt{6uWácCÙu©Ý12SÝ'ÜXt$2‰°0\p«Tjk™t¥ÔôL›½ëÙë±ÃxJùÝÛäÞa^¾Eì° õdò½=L'•‹Ô=‰¯¿»ÉTÌ'Ó []r$÷Ÿ˜/Z‚?0[ºŽhKÒ‰¥)mMœ)žmE+iÙ6(ö¯Á÷&Áˬ}¢=YC•úîiÉ´a*ÆÚ.[б˜¨“ëÍ'ÀTÔU\¬€/.ŠÞ³€*?y\ÅùWÅWµrp2ÎTÇ51m:9—}8¿NCûÜgžgÒ u82È%Ä.ÝJ¹é¯“ünÞÁl%pZ©›ÓÒ­ˆÎ@ƒqzOµO¨—Cá+8~4¢ Ê$L¹çjaâjÀ‹ãÚ‡©<"íﶾˀÌñœ÷õèGš)|ì™Cë O¯´ÀpW¥u²€×¾ûÂQO’e»Sæ=k^íCʘX8a8}™f®„ä»”åŠ; ²™~lܤ3y®~÷‘Äû¡òôœòÅ!íD?é9„R·rÄæsz±ßx¦s´©{Èë’DŸÕÂ]ïW%#”µÛ«ŠzªÝ/éª/@Õ´ô§Uo¢Ð²¾Q×[Ôü,¹³ò…欸„O°È-¶`xÌܯÊí}vU ÌUéfö‘ËöíîJºQ5ñdNK¼³éâM2ÿfLªiŒúýƒ­™3´*ÔÙäx?î¾%,”’Õ«YÛ~Ÿhf,²Âˆõ(ð“!áà‘r1Óíθ“±êG¹Fïk <-‚ËPí žtÅÈr9{-¨… ú§à|Þ#«%{ï(ö¡·ë¬c'^¾ËK” î¹§\ÿ†dŠ6«jWZ–w¯%òáN"o0¶í°KiÔÝ`k]ž¨{½ˆ¨­oNìü–±Á‰Ðô¤µzÿcõ½º]i÷±ù0ÙÒí5¶°ç£Ó` ±Ï\§Wµ©j0M0FÖ ¾ã.½Èä_´lô̳X¾œ Z×G1æ o‹ =Ç(ÔD\ëú…HœPXÅçë.â¿c£xÇe+óÉK1ì¿þdŸ3E½v>eÍWl’n{Þó!wøª?ï•ñ}8Ãjw9剃‡$‘d™O1>o‰KtøïN:†À.zgª <|DÅ#ËÁÀš:g¦çå¢=„Á&8·ñÏÿ.˜IÍÀ¢Å0d¹"¼ø®0#H9ŽÚñ˜0¥ÖeXN“C†sÔõ‹Jý̳ì‡Ò³Zã’@q->âAÂ;k Ã¥±˜}‘fµšUHc‰\z³ÖÕëe°(+]lOÒ;Ëp„å·ú¤ŒAJ§ÇËJ—NiR—ùøv¬…€nv}ÄŠî߸ägWfØ9¸ºöú¼s ŒÛÑPû<6;½Wô…f:¶ùªû unVÞ"’Ǧ5Ó^•Ìb%™¼•ˇ{# 7ï…J‰{Mp.?Œî¹”æ3j&Îs¿mK™”R3I·™5ø%YçiB j¼IþuÖ•¸;þµÌ0ÔðÈ<Ù¡#ù™4(y”“Ó‚G³Æ£ndòS±´øi÷šN&šÃÜVœŒ¹Ìf…M'¾JN!Ôÿ>Œ˜¢ä&G‘”'·EŸHît)ú[ƒEp1¡`èÒH?—ù püý\u«£÷† U8ÞNtÿ%5UvÛŠ"LØž‚óæÈá°¼ Û×Á÷3Fa5WñÍò71¦df^ “W¨ëàëéÊ™4㙇…€5ÑìÄõ¨T&_Ži×@¯Â9Xàæ°l~5÷^.||´ŠïGVn^EâMw–@"˜º©0À½T"–•Æ€‰ûàTÇÆ 7ò~íx¼ÝeELY¬ñÛäÇ5eÞÚ½)/Nž[”M&`V÷ÎŒqÁžZ+T”"öƒmÇj_ßoy6ÇÀ=—¾9¢ªBV(Ô@…ÜM ^•:qg?p¸ ·Wz†v!fDÃ'­Ç.è°õÔþ¶ÔRd¨áç­ºV¡Kp3 · ÙÚq?çfKÌ¥pNV²ŒO»¡Û¡:-Z[_ ÞhÏBî…i Š.®Ò’wcÁ÷Å-›Ûõ*×"˜v¦Âdy‡#ïe.©ì+ƒXìË Å±ëvx÷™éÀ3t ƒ$þÐ3òÞÆuZ¨‰{›.ßÙ sfc×' ýšQœ%ï­ÿI££â»p?çÇæb3 ^"ß áƒÜÁ÷‡Gì«4Ö¯ø!·yfû;a8ââÛ¸„Ѩçɹî)3ŸÃΣq΋W—F…otÞ6šMcí¡wN²ì^‘ćÖï†EŸxf¢q,ëá0eóD‰ý†åÍÃàçÚK¹¯­vê·ÀYZËAJWj¼@Ú’#ÞÎÀøjmkç³gà(âS3MYO0f='Y}`ä==ÝÏ"j©7Ò§jWÓÕoé0>êóÈ»jæ:wý®A|ìyÍL5ñuhîu‘G·úTR°Ÿü²µJã硈#Èþ_Çc MjVÝþû\YG§––Tþ*l„))¼Î?‹mlp5c‚q:ÍhÑÀ¿ T±ç!\¡LÑ;è(%¦¬úøY U¹©Ã!u§÷ë”X‰ ØG¼¤,5Œ@ü; ¶…šë6Û§ì”èÏÁ{m4U¶5˜L6Ý’ÎÕÍáÐùT•,£Ù{èõ%#â$\û+:˜G– ïìÞ_o{½#'Ú£‘å•3ðÐ$æÀôgÔUT‡êÓ:¹?/,´\x V7]*ð_Ë„1£›¦ÕcBëÖŸµL¹óB#GU xÇ>³íضÒÕ÷´³«ù×Dz674k«â¾‘q…šóh𛢧ñÌí¨o#ºß(àF»ºS½óOŠ·/Ö@·¥Øä:!©GšÃ>¿údf¢ C•Q×™è½G¡sÌN¯W8)‚ûnôhÉhµö"ö‡òÙ_`£mµ><;¬é'SÕŒŒÞJÈ„©—Xúwz­Úw ]©èc½l¶˜é8úY¿8Œ–K…ˇßi@qU_ì>Û!Ë'2ÍTÎüª¾¨~wYÉ=o‹üHè8ÀW¥¥šÍµ9SÖ;ƒ×õ´±à©nŸ­s׿­-|[TB ìït§Ã5·ØÀhð33˜»’¹¤ÃþZ'(DÌ£ýéºp†ôûQE‘÷@ËtþÑøž7pö~Å>ÎJÜ»ÿäÒbëVÑ|ÖœžøËî6Úxäžâ¢‚i*EÿYÿqrèagÌB€Õ²™DäA}c>º†q¦ÜïG=]+Ê2ÚœÐ]¨øN—ï]­L®ojÀ̰>Q‡TÒ¹ýÀ “ŽÚ«×Ú“ÁÑe­öÂ6¤Å’Å¿ÏKCFÛ:0¼*\µë;í*íÆ˜«”ÑôI3‹ƒó ‡•ªÚê˜]òâ?YÂûhèæ…a¾ƒ £ñ3¶•‰Hfêesšp ø—Ë¢d™iùˆ©ñKƺRí1ˆÖ¯^›Õ¬” ­ë‹©eüð†>Á©9©õ=µ*œ_¨4Ù÷9vþîVÎϼZ·ÊS«ŸÌ°—ˆST*Àç»R˜•WšÝïžÀpå,+ž0(Ž£Ø„Ç›ø›áaІ¬ÃÎ |b‘›˜ÂãÕéAiø%Ssó¦ñmhõ,~Ùô æÙŒí­xØ«“×kÕ¼ªü}¦íðm³ù`8Óhá5¾Ž“â¯Wy¯¼ê=÷­·têÃ2™=]]êïv­×cn˜V¬æ}Ãf± Òç[’G÷€o:ç¿´‰KÊo®Ñ¤,¡i=嘾_»{B>j¹jjª íã/6ŸIœ–`2M&r±?Ç͵Ý(vÜûK1ì4ðC£ø­p;% ä×+Ü!ÉݬÓc}ÑûZßáT·ÑåJ8 [Þš®§«U!Óá‚ïå-âtvh²¤:•Êl±ƒ¯ÉcZ²3I‹|w¶ú6/õ»•ˆ p¦…Æuß·–^šu"j3 ˜ŸÁ-Ë•¸)öe)«ö[?#þè´ÆA€Ý¦£3—sÿ&s¶]ˆ¤‹ FÁÏ›¾{üÇçÈÊor:w?Õ½ŸI’MG$ ?ÚÒK,» ãJíßH‡xk×Âö–“B¼.ƒuß õd(H¦9ÂO–¨ö=ïÌŸ"9h8–À­C:^*rz f÷òï¢àŸ#u͇íõTO©M#Þ R1°à¥»CC‰wƒz0×=,’…Âzñ«j6GrÏo`I4÷ýÅ¿a—ÿ >÷2±Q4{4SÇòRÔCäZ¡£e¡š}†6 svÐŒ§€<Â=ÓH)}ü÷0¼d.V0d,}#'ÚHJÑqꛓÅ*7…ðí;ãr¶ÒžUöµyÎZ¿n)[ˆÔz¯èw¸f'Œ[ËV ¢(Þá¥[/¥Å½kógáó\f?29`ÚýUÞäß•;j¯( 8ß¼˜°}m¸$°•ÈF6Ù%ò¸Ñ0_Ï=XS`/üë!¼|#䪂Ëù‹Ô`Wü2œì~xã.¿ºt‘ÊYǦ{ÂÛÄ©¤q ?67æ §d×HÜdù ײÃò[‡ÆÔ2¼p­÷±úÒ4Ùq×÷`“>a6%CEwüåªV1]Úþ¯ÔAkQê¤$ˈx'üg)¡ã+¬+H=—â>Fiº‚±6U†ÑñÇŠ@:csµû`®›_±³kE`G»æF…|¹¤V›‚£E*bûÍ2hl;]Ò Ãëaß2ÈsÂF—XõS¬>®æuÎkìPÝeÁ2àÒîbc›Qu_"ô„F߆ԣï¨ÞQJ}¤%@uýb³þÑhÖpRuéÍi^ε—r‰f< E‡,b2L@%+G.{êB˜`Ö\2ãF–œcÒ9˜!šSKaóyT*XU Óß›³Ë›¬O鋦"–T‰\8 (Ô€÷üTsOsK˜Ó‰®6*u™<#V~½Ðá‡eù¼É‡Ù–ÅÅ»ûÑ•…Å¿`á tUøågd*¡VïÂ%€yœ¤÷K_Y?Eìç†ßÔ¶üÔ“Uü\½Zðl¾J6–Á>™vcr™M‚Þ‚ÙS|…M¨Êe2؉[¤gaõiYÕsfêû“lʲš×H>,}BNËÕA— nN?;gQ•“ýÓµ=?*I?˜NÂl¥ûãJ`)NïÉ·YõüP—%”9ù9¢ÞuŸ<Ù ®K$©ú7^n„',%˜ b¤fGþÅQîZÁÉ }&ãj3ÃL¬™lË’˜ jÆØŽÞRUf¼˜”‘&‘úÜF’ÿdSäAni"ákþü@ñmdPÞuGáºNöÇLšÏ–÷DQË+§ØYrÑâIˆ•)™ST+õräÕF-á;uŒKsË 'Êg„¾wA§|ú¿:´ˆî%.žä2°,Cl°Y|Ì›kula{Wü¯>0; ¤#‡¤‡Cƒ¤ 7Uê(yÑ ¬dJ ÕhÍr¢Èˆ¥îœZ"·‰fïÄÛ݉¡=áŠzsi޵G`³\’±¼a-S­=ת_‚¥×¦bQš'ÿ)4I,…ÉíêOˆßÐV†Š(ä–ŠÅ+‹è¾ˆ]Épk ïC¾*@ Ã÷ŸH™Úè1<ôÄýÂ:éñáܳ, .>N-4m7ÈÏMï4‹ E»­Ì˜DU²ýÂ3=ú·àmEmÞÎWõ€Éóãd¦ñ7ä‡8’Ç2´¹›¶Wk!¯E:ž•&K“ßÙ£,ˆ‡¤"•&·[¬ÄS#\­[wI9Ò-®Ûs´x§4lèPc#—ÞøØÐ Ï«–'È͉‚§†…¿Â¼m~Ïá>EÎ{h$³„#§æ³øä°‹ª¢ÁÌÛ/m§C3&®¯®µ{¸œ}«‡ô PÖ$z"Qèäǘ•Û¦Þî?JoDËšT×"èØ£Ï9ÊýŠ=]MìžžTkÈßŸïØ›ªwê†PŽÂ2a éiÎK¤áŸl4pûÅÒaT+ }*o8x äMREæ9³xyߢ!¿aëÌÇr¼Ž¬œõèÌQ¯Dñ õ½v>ÛŠRtæœwCõb› :ÑLK衞_mRD/Ù‰ž¯lá¤jq5Èヷ±Â IÌñÂ7|~²´¾Õ4M¦|KqÒri@1‹)öZVAÊ=½†>TF¹UÄ ˜\ÇÔ1lOQ(JýÌ…—:quì«ûîC”KïžqHB÷¹ØmErA ÁVq—l¤eŽ9ÖS$;Ø:ôÑ¢`@Alj_^j’E%b XÂÏ|åî`…¡ ;ùUd+D!jÁ÷ý÷QvlFä42èÉ*‹­`uª8Ezt)Z~uý°"-ðú9´ÜýIŠæŒðK$Õ¨ß\f½Ÿ>pLþÕz5ŸÊBlÉ9¶°§JU›QÐý¦àsožx–)·¯ùY«¥l©ƒæ²xŽåKÕZÝÔU|ËNDRþìJ¬ù¾¶L"év&çìYš_GvåD=’|!ÏæÍ¿Ý¶%LxUé>öl!›Ó3æ$¸ÝÄG6~m2d:®'ã2è×Þ…Þ¼OZnél]|«ØhîÒ]óe¢ü†¿¸Ç‰ãoÊqç½øöæ\åÌã"üZFÆÙÈ+k}‘š ö¤@öÆœ²Í½›2/‚”Uº'ýah¦ŽŸ¥B³ÜC˜jôéMÔ¥’$vig“¯3µ>ï²B”¡¨õ†d…m„¢}ø´¨ç˜°>C F±¨Tþ= "¡ '(3zV„GºÌ³ áÎ"¢Wa¡5sÇ>ÃSÓΫö2ͬ¾ø‚Zx‡Þ‘©H·!LªBn—SçSV¦­`º¯Ê΢ªù)¤ØRÃÞn¬ î ÌN/Чrý •GæåÔaã¹GU‡Ö?¿wJ‹Ôa +ÌOöI:qò‰¡x9 ÕñÒù—ìcªÀSŸæt\Ɖ\—#'V ˜>Òáüs4¥o[܃Á 'Ék’Œ(Bâ˜ÓÜæ}¶_hç§Ã°+¾Õì5:mëy´R’ZâT×|èz¬wy8#ƒS3ŸÝœG4ýŽªÒŒ&PD¶6ͤ1Ë¿O_¼¼¨LaÐŒìÝ/QÂñÄößã ogŠÆÓL” ÿ­Áª³Ø5¶KQ³&‡˜ —ËP(VÚÉP¾=Q0ïB’Ò0Ço k¦€eN…ÃÝà„œb´^²kw!:̼×w@ÁÔg±bÃ@]~ÕŽ_'êGTÅ+Á1¥gnx•5.çPŽ¢»iÔuÁoÝ{ð…-´kuŒ6xZ§Œo&jÐݸ£‡ó;‡²¨"æ2FYhB¸?œ4ð1q”ûRIFz•w )ÑcVi{KK°kûÜ˲M"ÑSÍôg݈œßdO heØbÕšEÆÊðá†7ÛÖHÜ<«!uꩱ\öÂ&戇•£ØQŠq£´zr'3Ywó|¹ÞÒŦÔÀm~‰©žà¨"7Éãû¸v$4À8j‘ 'ºÕSFíÛ…¸]û5‘§´^\£7Éî£úÏ—œ(Ž^6*äDõÜúàǯ¼}vrªHuH“¿Y½3T±7b½s¨—JèmÄ(g¡œ~Ý®Ÿgʳh«<<ÁZ‡6½ÁBÅ'ã²0Ž˜PœÈ=‘°¿Çƒy™Á‡BcÛƒ¢]Ø ×ñsyù!™:¤É&¹A™š*ÿzƒ”;frÛuhêæÀü ŸòÛèP6XÀ[òŠÌ5OàÃÞÛOkÜ*¤tç›—Ù—@-ÉŠ*˱!ppã:ƒ „ËÍâùX9øšücc{UVbß§'}PzüùFT&ý`æ~š¢õ˜ØÔæÏ'pêÂæ¥ÄrdnÎZ¥ü »¿qf@È¥LX³ÿóÀ¸PLíL”Š,N•õMÔÏ:é±9hÛ°“t†ËOýýcõ Ë@NOê¬Ù|iJÕú(3Ò7·ópé¾fzU¥šú· “”CÍa-…«£"è#œ…Ç{Š5Î×9äì¿{îݛą|:3¼ö8n@yÏpäþÞ_Û…m!°ÃÊcòUÒ¹·Â<‡:E·M<:¹]j„L;–J2­´Ž ³{ÛiEéšOúâ+EAÈ|úXUϹ•¯Õ‘-–×7*9{”aÂG·ß·® ‹m+6§dÓPãð>ýçõ#.O»ryE\z ²âWE>¤úœmI¸Ð_¼ØÊ ÚÕ®ºÎa4MëÇ'2®ñ§Lì~‘f-²­%„»ØºE­J|JÂø]-óÓ¦ Iý-ÁÓ< ÷#Â*yÍη+´1´³Â€´vrwÆþtì·,{AøÜ¾4tŸ G˜ÖL1Ý>Ànº²^jÀOS>‰¡¢ÝóGÀAÝ}L vOg}̼©µ†Ôü.(¾?^"aÆ|•ÏTÔÃñ ÄÊdâ]™4Ó|M»Œ ‰KïÀÅj ÊœpîÉ. ,Ÿü1~™³»9º»!Rñš°È໢ošHÁÄáwIG‡ˆë°|°s‘>Ïíq2ö%+¥®~œŸ`0ß©N†sc˜é\!ƒHÚàt¼ñŠ•{Îm»îåê”ð½âý‘Q¥/Æ”«”&%;ÆV¾¢äTš¯Ä¶ºj¢ŸªFZS=»0‘Ü‚ßõՎͦ2Ù‰ÀbVÍ74ÏÝNh·F÷‘ÇWÈ |5† #ÁM·C)øThªÃ°ï ›Ó[¯TG35ëQS«:ßËäLêN߆Zîm gã!Á(Jt‹Ä»ý&jÈ&Xt.tÞMY颣g¿Ö-årQu(Ú‰âñ£Ú«uwx“+Š]a°.ÜO/'Z¹$#…´Y¶kq×ZÖ¨˜Ü¡’£6F`ÿmn&=_j²|>müû-âfŸ‘ ˜‡mˆ(g·Z?²âhÞÁ¼À1>î© Z8bC2éxMðºq"˜uö¤–ÃPTkÉÆÓ+-`vä‰NߊŠþAoinfÄï7æÇ.ä$“ãl,вR±w8õÜ­Mð¼þÖÝ”Ÿ”¤¢*j¼V²4N+¥}9)HÒ<ž¨DYf—.wØ“ÐàqVžãÖª>JêÖú9o)Hb\¯s¹«V]jYY§x‹p `PÕB ÙÛ/ËL“bù(}§OP~»M¢¶¶t)ÍTºöÓ'%ë`¨¬ß0$ǹìåo¶ÏØ¡–‹_0©¼#ko–6ü)ôë\öê²ú¬ÂÀIбn\3X‚ßß„lo*GGOYùq>`m¢åÌ=cíÒ"‘òÌÐß_-F⎫l'’ó´~ÿ%.Ù/¨¼æm÷sl˜qQÑRr}ÎQ`¹=PÜß±8/:ˆî£Ðá‚ûæI’eŒëôÉ2 …Öy¡«Ûæ°-{)³ xÀ^%êÝÜ£hÓ¶š+óVV´$ëj\¤ q;}/Ò™@…Æ«xË„%$/ää–$=Ê8 œ F'ÀœzÀÃ'DfܾùÄ(0òFdÆœÀ)>†. Ö=”LGáA¯„ŠKñ\¬þ‰ÔEa‘?ÉXÀ[tó˜w€ª {ÃvL÷3†Õ—Þ@sá¼JŠ•ª<;VHŽFi¿3ƒDÀN9Þ@S&ÃtK“)FÕ³2öL’—j&ø”÷#޾«''YŠ—"ØN¸ é è;ä>6%ïyü=´Vð•¸ê ÍÏ]1ªÍ9M÷Yùm¼lÊ*7­ÃêÊ9ÀóØuH•ÐñÇ tszõGàyñ.NhŸâî»ÅË­k²Ë[Ù€i«#Ÿßž‰e~:f´‘BOcƒ™¿°^ ú€õ4Ã;_ 3‰!Óä8òÅ¿]³†-aµ‰y·Ïû=ÔzmýqC¯‡ÛÍÅQâI@§¯¬¶±,˜ Xx·M„žN&µàëGÕáo`kh<:lÒŽ\MHÒí/Xr° Iàƒl¶îMas Èyñp°6Áí ýv½a@¶ÿÎt;ý> stream xÚŒ÷P›‹ÚŠbÅÝàZÜÝÝ]Š‚w×âîPŠSÜ)ww ÅŠC‘Bq8¬µ×¿Ú½ï9g2“äyÝ¿„š\Uã­˜È ( r¿ecfåH(ij²±XY9˜YYÙ©©5mÀöÀÿ£#Rk]\m@ŽüHH¸MÁ¯4ISð« È ïf`ã°qó³ñð³²ØYYùþOäÂ4u·±(1äAŽ@WDj “—‹•5øÕÏÿ}ЙÓØøøx˜þVˆ9]lÌMJ¦`k Ã«GsS{€ÈÜöú/t‚Ö`°? ‹‡‡³©ƒ+3ÈÅJ˜ž àa¶¨].î@ À_)”M€ÿ¤ÆŒH д¶qýCd ö0u^ ö6æ@G×W7G   àÕ;@CN âtü°â˜ÿÀÆÌö¯¹´ÿ2dãø·²©¹9ÈÁÉÔÑËÆÑ `ic¨H+2ƒ=ÁLSG‹¿Mí]A¯ú¦î¦6ö¦f¯‡n S˜¾føO~®æ.6N`WfWû¿rdùËÌk™¥-$@@G°+â_ñIÚ¸Í_ëîÅòOsíAŽ>ÿ‡,m-,ÿJÃÂ͉EËÑÆÙ ('ùÌ+ ñ7Í p±²²òr°€Î §¹5Ë_4½œ€3Ùþ"¿æàçãrX¾¦ô³±¾~ ú¸šº`7 ŸÏŸŒÿFˆll s0À heãˆøÛú+hùüÚO€ëëø±XÿzýûÍðuÂ,@Žö^¿Åÿn1‹¤’¼Œ˜:ã?)ÿËy|ÞrÞ²sp¸8xÜ|Ü¿ÿ¶¢jjóOhÊ9Z‚|ÿ öµJÿ°û?@÷ÏzÐþÛ–2èunºßcþŽ•‹Õüõíÿó°ÿ­òÿoÆÿ²òÿ:æÿ‘´›½ýß|ºÿüÿðMlì½þ‘x[7ðë(^7ÁñEu€ÿY\% …›ÃÿråÀ¦¯» æheÿo!m\¥m<ª6`së¿gã?d­¿öÌÞÆ¨ rµùë²Þ²±²þïu¹Ìí^¯‡ëëHþ;îÎ{”r4Yüµdì\ÜSS/DÖ×Ibçâø°½n£Ðóï!°0;‚À¯*€×ìü– Ä¿ZÊÍ`û‹ôÄ`‘øx_gê7â°Hý‹xØ,²¿7€Eñ7z•Tùñ²XT#‹ÆoÄ `Ñü^ýéþ‹ø^c1ý±±¿º0u5·y­•½ð_:'û_ä×vÙ¸ÚýV}5dö½Š˜™šÛ¹Ú›ºZÿað53Ss =Ðü™ëò&÷_#lÿ!ÛÁÿ%ÏÇñ/ý^‹`þ/âzÈdÿÚåçü‹âàðGНíg±ør¼&l²·7uùCâ5Šß¹sÿ…œÝ^—æ_×h^›moêð‡Îkú–ÀW«?àk¿‹Âùš¼µ—“5Ðñ‰WšÍðµ-vÀ×Äìÿ€¯Yÿáûõ ±ü6ÅñjÉÑÍÁì¯óaõ‡‡×{Èúë‰×'æìל~³_M:½>´ÿ« œlÿPÿ» ¯·ŽÅ èòúpúC”ûoš èw©9_kâdïæú[ïµ*În 0ÐÂìäØ^©4ƒí5ß*\¯a»lþ§Ë¯üÏܱ½úÿÍëId[»çûºé,`Ð ¯6Üþ€¯wÿ¾úõøc|_µ=ÿ€¯æ½þ€¯¥ôþÜ«%o Ë\ý×U1wsy­%øïÃÿzrþÿý=æˆ+‹ sPÛúÐÎÛZ1"·»“BsÔ»:ôo}V\>»Ý£Â¥Ò×äo¸üKéE_Û‘¢»]%{ò9nk„‹hOVëxð}4NTŸÙí@\žÆœ*>k A ~«)ºçûäì«dÝÙ-O]àìÆ‹ªZ„uëÑ/ãÙ0Pñu<|qWm¯†[é±böí{­ØwA¥óÔ…f¹ ø°à·$ð ˜çžhó׿æ0ó§^ÈäýNÞs|ôÑßd»[ð^¯ÒdwýB@E O}9>Cã#~&·äSV»!´”ÇJÏ ±1>@æ;ÖM~Êo (‡‰Çjï²Â'3Nå×ÑÀ¤Û‡Œ³«aâÄPïtŒº„Ïhéá!-S¤ÒZÒo´7péÂh¡ä§ìå³·µs­w|­p|Z?eà=j`¹€¸³Ö"¾.ùá쇭K|µÇûÅ·Ø6»œªÎ§ÏvêÄiÎsÏSãó`¥Ô7TD¸âÔL4t¬â¬fê‘Äë:,Îw5|fïzè FV¥µ¾2;_ì=sžŽëgð* ]WlŒ÷%¯ÖRúgŒëÏõè/{z×ÄÖGÔ éÐH$ÎBdÓ`6í¶/Pðw„©úÝùu%nt÷͘^/Ú2?M¾/X“%kZwÜ{ott;è?2§Ô2Çàéк€»§÷){\ød …Ùe«*ÁÉÒ‡Uò‹/·hå~þa®€áKM—µïÔ4óm©ºÌ·‘Z…yh‡û_Fk4:kx1ëC>¤-EçOÒý„ëg•$¹éÝD« ™# Ò þr¸áyDq5yÄÖ”TTQ£™âÖbeGmÂuëòüê“nó°÷lôt¯¥–Ü*É:?p u8}M—ë,Ù*ŒÖà>–ð8©}~ÏÉj)›9¿Àyîfp‚â¡÷¹/-+o7—½Ó<=;2š¶ú!¶1GÄú*3ºÕ,gë™a…Š*Ñbð£I4@5 9,;Š?"¸à¢œ>®ÜWkæl°ü8Öö®K²©|‹>o‘Þ[Z T•Ã5ñ³3€‘¨¹ø‡-Oõ±èK:î6Ö0=äLä˜& Ä´s$¡ÖÚ´ôaÝMB[ Xj*x¶e½He¦( ïC½´‘ºHÚÛÜÔÜËÞgÜP8£ò‡X(6+›}ö/…œ,%ù­Ý¢•Ûïjy¼¿šzͰÒGµ0ofžÿ Š‘ò Ö£m®¸9⊔6r´íbßþ¼»hŽ}àÁ†üþñvü€#Ð,_Î0"'ºÇ«µž?nü;ŠåbaùÚQLòîÑEÉC™¥Õ u·SრÍ™ )­OyüBýªG峯ž0›–Wòåbl†h»}jòËžétu øBhî}{â)–LHOúý’|X¤ã•ÚÔ„êpTHŸ錨>Ó­lá ‡Û)®õœbU±ùaÆí¥QïõÑIÙæ¸dø&Fš¨ˆùªîˆ4„µµ;=GU‰†7êêÙ%`Œj¸žø(¯ÄN·E†Ä©ö׆èD“êùKéth÷˜ # žÅd* Þº$k†§.àêÙ …Š3ÙåB—íÓ LVJQd»]t¬èmÞ—›œ cÌ™B4Ò¥VÏÑÂ:dÞ“ )Т)lϡРçcäHmª*3ñ+øDkpȰ«£Šr¿Ëßy{¾`„«ûž6ðëÁu€4.³³uFß›=¢üËû`ÓŠ2ñåOZN¥&ÕÕWÛYJ|u°ß±å­fÍ<È·Ó‘Ç;]ûƒF5gS ª%¿@›ðë8“Ø zt$›¼—ÃÀÅÒîöšlZÁö"kjÆËU:ÊFí¿7a|žHºŒ»é+0Á\ÿµ¸”øki@[Fê¹J'S©ÇÖ¶÷«2ª@«{¦ªŒåDåþ&"µ Í ±O(¾Â?³Ä‰Í„_Q·§ìÀ[,÷m©ÇyNOc.ÒÈÝø‚•öÇè¬~¦«¼R‹m{.Z³1³ug¦4Ù_Ì•äÚÞ-eeÇý~™Ë7pÎn¤-Cu‹J)P]W=V‡ó,ÐPÌp S†þÏi˜[í]h£Ý@l§Û±&D¶õ~ ´@ˆº´31ÂiW¥r^Ó˜º/æe&f™Ñìj)ÝÃ*[·{¾¤î㲘m¹6ÌÏ;.¡£Ašl½ÂÒŸác¾xeø¹áî51ª@ïi˜ºoïM¤C¶åáTÈ¿T>{õ}b¦çý –6aLŸ­¥ÀªF ñÆ6Ù#÷}¨6eø4a±¯…”GÏ –#¶vN\zŽ$e`….pþØ^X#¼ªŒ3¤…0À1H6¿ÉƒÖȧn6àð}Îå ý³Íipùùa™n#U'ƒØYRqàsgœÏÚ©I=vò°…G ‘ïR(ŠŒü‹7KKÎ,m—>UhÔ Dæ²Òd1ïûâ͸øA}ôñÈ8ÈbxAž ŸE§o}7ÚôÔX˜[v£k!¡'™š âG G?Náý—áZŸ¼-ý>©ŠüÅy™O[n‰œ|«Â›& ç® –àâ-ÿCTÏí´x0ßK>²¥*‘/ºÌnÃâž–2fRÌ:a™ ¦/xÅíìš|àø,á­¬™ í}+i:‰gñQ•†M>ÌSýŠ"év§\k>áÑ:1? ˜èk†«„ mÂŽplUF›Îœd‹ÍÚ/Ñù6Xù W¶ò¢½†\ž¡ìËÈ÷²ŠÆÉƒã%ƒF7Óû¼±R„Òû%š¢Ú{t¤Òkœâ[e®ÿLì-^¼"Ú¢(F¶Þu·)júè™¶Kd&’°/L1‰“ ù2§÷%ììGÎ"^Ô¡f‰•x£= ÖÊ{>­'é#ù L'Ã^¤Õ7£N“Ö±Ë=“_’Ê.µ x§’½ ÷¿u)†‹4ÞC%ã=ò“*Ä|º¾/Ôy¡×M ½†¡ZŽàÇ3ásÚi”6²ÈŸ$]”W§ƒä6x«ÉpÊIžó~ÆK„V©é‰©¾ætT «RUŒrÐ21P“Â’8–Fx“þ¬[J“¤ÞÕ/5tŒdXÆ®xÞÁ ƒ|!bMÏK3ŽÃ"nŠnò+-™¯5²éŒÞ¢$8­Ë éý™mƒŠ› §Åï!HGpƒÍv×f›‡{ÿ‰ª‹³YÛØØ/WÜerŸ,ÔtS;µñ¯_ ]ø‘4I5Ž•ÑíhŒŽM°2'w×ı}£G²xÀ ¡ü9*;!Шjˆ‡ùy¤é¢ W²û9õñ µ]š)…bX$;79è׎™xþÔäðã¯ïÚW™©¼oëgïÚe‘·`ÍÙ#7j<Ét'a± ØÈEø7q¶0ÚÒvÑqÁ”¤}›¸"Ôm37©V¡ÑÝ@ï¬|àD˜`tÚ>ý^òÚöí}|hÿ‰J(·ûµ·[q‚¨YBÌ‚g£ùຉËWL—/ûÄ(¨r'G°˜ññ«mÆÂðA(lGo® ðwõ¨~„™Ð÷V_Ïôã/ñ¿‰ÆýÑŠaˆt«Ži8--÷IÓÎó<ÛÖÊ,O6Ùž™Ž±gû¬2‡˜9v*ºØÉ¹»âJ7 JØèÐÛ“iÕÇ(iÂÜÐ%{›ô©%¼©íºpø[X6YsMâij ª"0í¼dÈ{G…íÕÚ" RtA ô²üÒ\EE ¾ðc¸¡¾cˆAż¯¸[¸áfK@*{›7wd•>sÉøO,÷¶æGì1$ó•ĘÑ;†f®Þ´ÝÃü»S¦:b™ÂœøŒˆOP%\nBò¤š—÷Õɲ‘8¼ez[-¸Ž­XÓS>uoƒÐ:oïáóÀ/³~ª')à~œ¢RyφTÞ¥á9uâ¯[Ìxï|FMÜÖ_ p"‰ÈšJ¯¨Û8z"ãÃxzß-¸8‡+Ë“5=ÇL]f>HWÛUÕ#5¼¹ìR±íNÿLøicu±NH¸0íZ®´ C_q›‘ö³g®BþBOûb,›·ñä [Ϭ¥¼"®–Rã°Å@¶Yé¸Z*ñYW›¥yËô\¾Kãç$A+{ÿ÷gé‰\z5 SBA»†Çˆ¢‘ÅÆp\ ²®›Á×k8ƒG,—Ûí1ãvÚÄën{VßRž c ûÑrÚ§N§ìŠÞÕt«Èm´ñdO±ø$Áx{½µp™À÷D±$*ü„åK¶m8¸å†Or?ø©H1kš5éc,´ùgasDk5þ (€m$âT?¤ˆ'Á-®Ÿn::ßBEE)…˧ÇéôÐtã´ùêèÓÝ…MË*"ŒˆîELòX¨ô}Ø uÖ‰ 7M¼$¨Y«ÆËãwÅ£†s'e P‡%Íð:\Ú¶åS–{÷&cë½õÂ:ÚÛwÉÑwßIÍæqz˜j¬TiyqF‡+ª?‘ãJÍ‡Ó <‡±á"vÂsFh ~šêì÷‰Ëæª~ñÜQNšjΊ¦Q¨¥x8MÚfã$/Xë²Ý4Ð^—M¿i4*qFœ¢;ûpßÃ%ó)È‹nœ`:i„DDfŒ`‘Îh_©IáCjÃ]kìò·(2Á6m??¸Â:dÊ%Ó³£°VyætpN‹]äÒJâ¶ZP%6¥¢Ÿžœ‚AðÝ@$S×ÜXÆ™ºê8œªàŽ&änrqÊæ±I$xR%2Iu0Ë~<þ—¦Ã;VM¤ RêañÕÝåäz‘7¬)éN/§ÏŠç)ºu(«ßî$SL•aw…Mƒ0]:9—’D î,º*Ò{RöÝk¸° ŽÚs¸€8ý’–êŒ-æBª6P/®•_uyIž³æ§b³¾ HU×(õæÈúVk$÷ÖÖE´(¯‡»áºKÏoÇHKw÷k¿t ¢UØï£^×Ýeî†oÊ.C5¸Qqï¢÷ÎÅ?zºÉ9 áÅõ4­Ð3``Waëüp5 5M3&#ƒ#ó+§ ,q²ç­òK:æŸÏuKŒÁ)l…ìôb‹¨>e·g;æ!Kµ‰•eÞª jcåéKê» dûöʧxËñfX¶#åØPŸÝŒJ¡ñ‰Y7ð9>w;ô A³l¨]\5¸Y^m!^ÐÊ!(Ãul‹Œ`9ÛV\dÒ#ŽÆgÍÕ3æ5ŠaÍL»mw”sÓÈN§Hð-:¸¼ñíãq©Çü)sGÍq)ïòÜ,ø®ÒJƨ·¿±Á¿ÆSõÖ(PaûÛ<^Ϧ޽^˜äX2Åmk ¶ˆe iújÖ†F[’îØwÐAä>Çcí6£fЗçÚ?ßó–Oº+iv4Ší†8~–‘b³o ȧ Æ I ã îp³1ßsø.èh®ïÛ܃ý†JbØ`†Ô&z x‚4KqñP¿Ù5(@Èá+–è-½¥ÇùKnYƒXv4C~«4ïÞÿ›:§ÔÌ CE¤ïb@'_Ý#b£mHªšëƒEžÎ®o ÀÂ'9îï¡Rt¡hßYD(Ü]¹ú±Çø¨‰Ñ{Êát7ãpl8ÜbÕ19 4³¹Í|Iýï“Ù¾ð˜‰ù…åg~TÔWáÞ`A§…2á'›š¿ø ÕØÝ˜XFÚ‰sÁk+Iu-Ôú2®dâå'sT’ƒ7*Bož´öæÛÏ´¬ž-$r^ñÑÏqö#ÌkÈP kÒ)ܦ·HwD…–P ‘ V}Á ’ÎK%£<ÔÖâY Š n¤…)PÅÈh³%µkSÐA¦Íý½—+Ÿpi#)ÛaÉé»jàd•\3²†+ƈ¸œfKì¼û%æ ð © A½ÃÎÝžÊ·Úææ„ÕÙéü3¢š'ÄŒ hGö^-²!ÓÝûb?{ ä¹rÁoR64,7»Éh©Ô¦­1õ<Ç!EîeØšÀE*„ìðQÚ•¸*Šú”rÍ:Ká’Eäš=©!ñiJ¨wÖkùÁ`þaÞHüm U-—bÊ7% ¹·Âϸ )r? Ø",(s0åù~ÐdÊÅC‡QÖ¦¬â6šÍ:Ä1 ˪qÖ¤u-•ü¦ÔõÜ2ÍT¡[‚«Ý³öÍEŒ­”ì¸ôAý uìïÄeù !³–áÐþx§2½ÂóËMÇ‘LùèU;Vv#†PR¼X-"ÐùË&¦‘Ê,&N°¥hû“Û‡ìì6Ðe÷à1:ƒ~Ñ_‰’ CSîÝk”PV&¨N‰˜hÜ_Qj'Qz&eû&òÆâ5›¤Ö¥ó·X¼Èä#Ì—SCDÝ ýÝŠJ7UCgûÙfÝ)%J é¦>f …l¹=Ç­PP+‘Ç‚É%GRÏÂ{ßDõ.gŒóJÚûr´=HûEÜ¢ö»~¸¯†6‹šVÃ1ï Œ7ô›ŒOlÉ?}xNá*®)£Uæõ@SФ†c”âwEŒ¥…n«8+ØJ6-ñĘÒCŽ3ip@¾©›¾¿<;+§0sÝ´qfê'Ôw%é+ËæØëNÓ}¬³\=”àt„¨NÔïZ^ò›ž×ªîßÔäÓBoËó›ÛVp”[²#*'5ñsHH$¨ ºSà7ˆ‰ð uÏG˜&Íáû`ßß+uD7ÿ¢ñSÜstË- ÀÿÈù5_Û`|“‘¹È8Ì쨌 ü«2툹Ùodqh®Ç|æ±Æç{¥ `¶ûÉÍZëî¸÷âU„à=ÒÄEÚðô‡u¾qØoøMA9fÁàæÌÑ *¯ÃéŠÅB퀡N~ïâì¼ð‡õVè<Œë2Õbñ¤}‰‘Áìh•¼# @„cÖ†ÃÀÓx¼öàÉÅ/í°»¡u\“©7oýx¢‚áçqWÞöd3àµÊI|Š÷an ‹ÎØÐhø÷‰ÀE%‘N‰Ð1“{‡ »3¾ˆÏf‡kà CòIù¦žŒ”ÖC±r— ³Þ–"õBǽÁKiÒÌÒ=»­øŽ˜†i!\îSxúLs§ŒA°eØi?Mr¹êÏÖF9Lü¬Ì—ãâx!:´±ô‚oþ`?@Õѽð"ÌŒacᾜ½û'/Õ«•G‹Ø9Rè`0F»÷ŒÇwkó|i5‡ºÈ¼'˜>¹‰¨ ¹zUòœv8®mç´T.ŒÙଧˆ=úPú šEqµy”Eždúê«_-AáK?'›)˜#¿t¾X"Ñ¥²Ÿ¶Ñjñ”Fóó×\Û:dg@#W7Ñ–Àtcs´yb÷ ¸~|¯„ùU@p옰n”éÚ>Ÿo”®äÓÇ'•<Ђ=C 5Î;³.¾\Õ¡æŒD% (‚s)}•$äœ_‚™b®›äÈ„šÒPrdÃ}îVká™vSœÍ½nîˆeEPŽ#¹æví/mo&$ÈÓ'Õñ†gxW6}Žj[î v²~†Æäî-Ñ.¹â¢‹£e$Ò(|ƒ\"dOL+ý¢xSѰÃ?›ùñ–‰<”–ê¦%ÉãVj¯~Â3°ãxF×–Þ%–âe‚¤[&Òù¾uQóK“ƒš¢Š‰üzæZxZƒBàn C0;ºIò‰ñ{~õ­žÙz¦9‚Ã[%oH÷3´DB¿nÂ&SA˜"ʼn¦:^>æ`T•ë¯V»›_w7Y]z± :Õ1ëìá(¿ Øn¯Â*™’eEÓÜúàŸøößùðÒP¿ÀÐÃò&N QÉ^ü±-óòÌ$ãºqQnç;‡h.­‰ŠH(áŽrûK0¡5$T“í¸Þvé½Vd·Üøî±¾c«×UéÕ­u˜Bfÿv+žs{)´Oõ.ôYI‘Gº†Ûôò¯ï“$O—¼Úæù)‚Pš z,*hEñ`3–ŒÆ±Tøœ›fœ8z‚*…¾57š„E‘yÜ+<ÞŠ™JhbÇ•ö vv¦†/Uà]ÆèÍtpë/œ‰]Ô»xVÎÛ°¢Ì£ÝûÍIOsñ`Õî7ç|;ãvh)ˆ;ÓLóÅ«C("Gœ\2BZ´Ãžf¾úÝÆ|¸§R< ËnÍàÆø–¹¢žýí&·WçDÞSlüd(Gu8 î{Q‘gÈàžo¤ÚuX§wã²´j®ñ^S²î7éð2Æ÷¤ãuÁÕ‰)É(eùŠu>U¤êvQ~‡ÑÍÝçšÝð±^®¦þF‘:§Ì¦˜àé7cqô)ÍGc*Œ7nS­tZv")“ €KÁøÝJ3Ý­üBƒ¶O²àpèlÃÈ Yƒ,î1U[¦2€:6„!¥Ø3C®c5JÀE:R€l"-%W¢ÌxúÚéã**FžÙLˆUA…KÊ»””âÅ ¯R1 €ÃYOï Oå¶EŠÂUabœŠì‰Ê˜­øž¡Çsy`®èxqü(k4ñ/Œ"G/lKI\Mî`ì°daß@—¦è”ä¾ÀüW)æ=Ä8ÿÊĮךíBôIyCµ¢hµûeŒ.6ª}¢ß6l:ç[Uã3‹Öìy·c¹|Ÿ¹€«çu áˆtÕ³±ÖÖ¾V^¾È‡€Õð6þ¯bål×Ù&éiÃêdË)÷•ÄE– ÷c<Þ`êx†ÈNœÑ–IsÈ”4f±¾÷)4ˆ`VøTÊ’k65K¢zw‹Inÿ§Ó£æê›ªt!²^|ŠÞ˰j/(@ÒÀ@Ä»ŸH‡áäÍ*Šc›i,›´Û¹€Ì[3gü3uìf×Ü‘²ø²Û8WœÂ‚èø”s¦NÀhwð§·©d«±¤3 C£‹/Ç„ª†1Ø¿TXÍï¯u¸¡¯ ’QX~­ÙkEð­ÛåâÆ|jžÙØ-¼’¬k’òÒ,¯ùà2ÄôO¡öMéÄÈ@f«3~c¶¢^¾×L5ëW5[õÑÂ9ܶ‚dDüv~p>U6ï{NDÊÀŒ2yj§Wý¡ãÎ 3†4ujŸãñÙ Ì¿>Mvyè"Ël£ñ|b!=ä)*”ÀB¦0ðVå& eB5Ú”"Ð%úô§-VTÈèË…;k>9¤7gsM6v­¯_ú AÛú€Ö=×Ûm¦cQy±òæK=®¢hA—pøBA_¹Ôë5ã3Á£Šˆyñv ÞéwOõ·!c”`Oœc¤¯Rh¸§M ˆr&º˜W†40~¬@µp‚ÓTpïn¨@Þð×Î’KNP בÕÚÝjƒzË,áò|”£êkþ™+bóéb&mu)sõJQz©‰x†\ãÀ»„Ý GÊ)äfŽq•ùé[ !½ÓÍp‰tíÄ¥yCðÓ¬¶»Ø!׬Ýf«²tt‘ì%Ï®ÝT°p&ÓwöOý1DP#r™þNHìÉý<è wVO«pß>' G@ž‡­(ò†ÀqÉÖ N«%Ôâµ]DpÞá~À±Y¿µ"³+!lþÌ”‰5Ìå"˜ÙÎÃŒ_Õ:Š®7­uþ8fvq:må°úyZ¹9ŒÖ›RÖ­ËýK£²¾ç-í×»‰‡§Mõí4ŒÔ_{ñ(!% jéÇà÷rd ÔXUF)ÚÙ5ܬ ¨ç™›\:HÑI5£šì¡Eà¸È—éño—ZÑÛ|S¨£ˆÎ‹:òE–È9C¦­€ ™W%’3ž¦šþSPÏ_“{³¸‹óW À5û’ÕéAÛ0&¡ºÃòcŸ â >ÌÑr4Á™Š ÆÎJ¯3ÅÒX8¶E-‘”•ÃײxWËX gŒºô”œRàžkrû+êÞFHÁ6IûŠ­»ªj(G?j5j.´9µW|(wa ÞL3HŒúÚƒÞñ¬7”ý˜ûê\¥g˜úw¾YS6¡Òz^³Jp¤øÐ´^ŠLýfMé'yþD4ò¥{¤W0 ‹Šó%IÖ¥ÇT-Ö`Ê”iN ÜEtLƒ¤Õ$;SÕxZC,ë=£ãïneq‚ölG$·æœÎûµû¬º×ømP‘f¸‘_Š$µ-íéd@Ö€€6ô¯–µ-ˆ¤‰M®=ÝýV\9~W›¶‡ô’EÝL‹­þçèºg&0_C#Ã*Ö)!V½( Ê£G>k©T’7"ÝCE)?øZ&Éfв¬Î]·Å2ëÄ£vX¶¡–­ªÆñ&g¬}\/1(Y®-óB$ë…ÝI‡¯™*ïáyûªÄ’éöB•C‘Þî?¨·3÷Æ<ÎÏÈçîôÅ#Í>¥v&õ[¬(²ÿ¯à«ÃdSÆ&woc÷X:øªÝR;~!e|Ãkx jäËŒ·ovЧ£¯žÀ=ú(Í esêÄ>þoá–íÌãÍÃ-? -ßM© X¨)’‹qéÔ èÈ ª1-T`Ò!¯3ìÚŠP¸¹eÕ2U¢†^Dqùs;_Î\ÔÉæ|¢þÞßAíõèy+ëUOjõ­Yž M¡›'CB3¬ÕIR4㺆×TÃ$^lq“Г´A¾2u>¿ ûòæëö­é0ëgH—¾ÓOØß.‡¿w_ Ð, ɇ%®íyeôe<É«÷ÊzœU`­tGÜ^4²A€UÎ'«8g[Ç}3^5¹DÑ- ™ÐA.[Þ0¡î:5!CDæ6õ#ƇŠ2{)@Ù¥´" ù÷žQŠéØmgV&ùùw|`¼ŒË¸y¤uÅ)¡QäÜÁ]\óÒh¢äjíÁCP¼»ß±\ÑWRìl¯]ÝÎâ×ÜÏdÍÚØòl7~+M Ôd'ˆ[ð 嫘¿hð­¡7ѲÈM¤vëM„ú%:IÑ—Òô|Gˆ ‰¶–2×ÒWêC=Ô¹’¸¸·ÄÍ?fbâßU¯k¹Ìûv&Éõ ëÖ•O?ézÜ’À¦ZŠ<ðcrAé$`Æ•áêTYô—ox3`1S}D™.ƒ”EÀ9 dø¢COF=€è±Ë\kEàv ÓoµG»‹% qCðp#‹'Z„Lñm„RqÙȱ,‚5ÝP®ŽxãùõépDˆÛÜ• JÛOIøE§¯.è ®:‹îøpR:—ÎÚ»ðRO·<”q”`O_¼/ä<Ñò«ŠÚ9ï‰Gø"v‘J‡ù¯ñU{ÿÁéUp[¬q|3»ü^m9¬ùÔUB<…ƒGDêé+çŠ?Ñ‚«ß¿ÉVŒ9Öæžª´#€&wúTtµ6;ËçšHRE,0ͦ´fdµÐ-à Ñ߇‡Ì;ÍYßL8|6ŒØ­H‡³¡z?;9†å(\\‰?†5è0W‡ãİ›§?»*FÝ'gÐJÀŸÞÔJl¶ðfQi2x À?2±%—x%Êyê…þ¤>Ÿ?hvlbh­fèr`Kàjåd˜€‰S±4…ðá#> Ã*£éò¥ò â†Õ2wÒÝV\ŒUjHÃ[ã¢Gfu)$ïþ/Ý<—YóÝtQj¡O¹m­Í½‚¡€¡ö3©»OPì`êJƒ- ¤N%íÙrßöU›•Y³<Ó»9Op?‰Ú‹ê'¿"ï_œ¼¨F+ND¶u­§5`eîáZ𠦓Çú„’©ÕïbuQã\ºç ØGJÕá,.?l=/QæÏ“ŽÂU ÷Cñ1³|Ò¾í{ãÂØ3ì¥h =]}Dös^äFŠCçÇ9Q¤<ÔYkŽýè,CR&üSÔÏiJˆÑY'´°Ôýϱ…®æqXà¸óVú[~ßÐÌqb½_|œ+?™Eü”'d%øÍ£ý!cg4O5šÔ³šNq•Èov‰o¶á+¶¾4š½_i0 rå9u¤¤òçψäoËÍR²£×ôºÓôª°ÑuÐúa˜r‹Ú‚ž&Âî/©ÿv:Û%vŠ+×XÅ~µô‹Ó94³´A¥AÐ"1*Ñz¯VôK;1¬ª(cëX%fÓˆ“äˆo·’Ä&H@8Êà –§”hëRÙC½ì5Y ë!>ºÈ³1~;üóc~”ð›Æö ëkE ö.ØRÞ“þ/'Š–úZv#%ÓR9£!Ô”R£ÅÉð¸¬l°ß[K<“„%ú; }$âÌ>3Ÿ®Ò­Êš ÞƒJÚæ™ÏMáòh*xh^FH l/Ruáú¸×ããY˜J;¥Ñ¹êt&¸^‰²ÒéùnH 2ßr‚±o)Ž“E%oŽàް=:cIN{ÚwYDC®°á2lšªÜÒß}_¦z¬«Â¼V 5 _ƒ$3`p›{K莄ÔÌúøÄ%$…ÚZхʈ©œ.™5e¦Ë8‚pL×J—ѹUÿ‹&¯ÅDÏÎ1…õÂ| q»è“Z·OÝ‹¨MÅUð°iÅÁêxç Éœ¥ô{—“=* žÚŒ ø€I‰ È¡/jáaÐmä–…ö7×GAÎ≸]ùÌì Ô…S’°‚M”@¶–ºý[øLìFrg ïÏA¬–ëüQ$²’O<·¥¤ï´Æ$„!Ùkç6Üü†H½ K(Ǹõ F÷šJ T}É+4}ó½˜.AÓ+X/X¨èêÝj9zÔ=3;¥m¦Z ?½2Ÿ3É7»Wï×àv™Ã’¨v;âKFØ=7öćkÅ"z¿vC÷’;2/=dÕ§’ýAüÑ6¬Ú¿à²O®1±+¹"©q£Œ¥ ^”;”ìƒQE‹’[G ~Ów½Ì: ´0)©$¥ET;ì÷Ó®÷ž¦Hës>‘ âË*³ç@§~pmc»ï[uÄåë°•ÌMDKƒ›ŸzBß »ˆ‘PèUêàkÜÕ :GP‰eçiÅËô>L&@,é¼ Øsjî…¶\=Í màÇEØ'“fŽc8ÍöØž­úÄ¡sZ ¦©ñÓUÀ¢¯G7Qá˜CX˜™»c¹1+4™HÆüC>ÒÞÓ$¬”ç$«kð…¦Wd¸iG»³Ð·qp–B|.¼ÙìŽ>‘À²_köí•§V†ãA¹ºî±Xgp°Là1“Fb½×·„&¹§à©‡ú2Wí{¡’—½gž‡ÇUÒÂïV_iŸ9Œ Ïó•i*@ûeBìĶC;~ ïlOT…cÔ\ÜJh ú¶L$bg‘\B„«¢¹LL6Ü’æ&Õ²#˜4Œ¶@¶ r÷¿³KÖ»@Ûóä(D˯¹'²cëÞIþ#ˆ/ÃŒr•° ¬}"§"ޝ2ŒË&rO·Ø¸ HÅßè ë›Bû{$Ýo5áINÓ$â>•E¾Ù?AZN1}Éež3“Ñwå°äx|`B0ƒÕòa}Ñ… )ú{¯jÏC²!Pó>^yÔµ¦Ëc²ã;Qy­Ir,Fiï5ßBRµÖíºs’ Áûõpëìk£/} g?Õ'9{ûöt »’Wô£CøVsÊmÆ£²†Ê`´#TH¡AäL³¹ÖR±KôéÝKH8bc=GÇÛj ëG· ‚´É“Í~‘ 4Y8*Ã÷¡ÁžH˜?5¡ ‘aIü EȹYö~ñE’Y#ÕW›}8 Õ£hyfëR˜,ªGxÂqUcœÂj,M_Ë_¿’—ƒ¢ª ØJšÐÕ¦Á¡Âü™§6áÖÊBɸEAýä3/s¥>ŽkKû5·Úç‰bÏÿHÚ“Jð¶¹KdþCóxZ ÐqQ—"m5¿ÕefZ­ÓÝ…ÈçšÿòýpõQM~ÑÏÕù[)Ë[ûô/:B +‰° ·¼è=›7–‘SÂ_CßÌÙí0î9ü’©’òVÍÔÜlâí–/óYD!ƒÑ×ÙÚèy†wóÀ6{²/®¿[8 £ô/j¸‹d}'¾ÛÅ'ª÷`GÁ!­>ž¡Å!׿‚ª?ôÈ¿„2t‹Ï*¼n!I1Þ2µÞ:›Í‡Wó<¶,õ-S5)Jú.Æ7*n9ó ¡Á¡.ÿÔü5,$Ër¯¡Z[VlÄ·¸·œ ƒV*²¶'ºŽpƒÁN$p‰LóÂ*Gkø Ýû¢Ìƒx°)½Ö³p|‰ÎÄ»œèÂ’ð5!(‰*šRÁy¹kHŽÀÐgeúèÕ&VWoÆÎ–Ž—<ŠÊÜú¢(ª–kì)‹žùÙy¡ [·-0; ¦¸4æí»ÎqyAâÝÙd¢§©,%ºÕLmŽB/VÓÓÆôÎÌwKÈÌw{0†:)úIÙtZ„rìí45tÁZw¿Ð“GŒthÙ/;bd&M›`‰Ò)làa2úd¿?ÝÉ^e\xú4òÛÏé#ú…D (‹9qWÓ‚Æ*R4œ šV¢Œx%Ò-FÞeхθӹ[¢/àšŒ2Ä—ÿ‘™Ú{+‹¡tYDgp­ÃèÚîÃåv<©–~ÎgÇz‚qvÌÓd‹™°r÷5ëv´EXt0¯þ¿°ïL¾#ˆ‰Ãe\é ÁrÑx£*µ hxIN‹ÎÀyhÌ=Q‹9*ø$ìE¸ÿFTÑx¡é=È:Ƀ³e¤Ló‚§Ma0NŠrXïÎõ‰©ÒaC8ãpöѰçˆÙiÍÅö±S{ߨ6' '†ÑÒ€*Óà}]XÆÁ•œÊÃpëœWcŒç§DÜ›_%{çûhÂ0½œ02'Q-Žw>S‰µú~w±:GF‘•è^´Š/Ÿô|®ØeýL¦¥EÛI4BOd‘+W·º• ‚GhÂ=Ó,}gï&TƒzXˆp§XgÐ}#à b'¿&X5«ß 0fXÝV…É>‘ž›’·eßøYŠmQüTvw¨ÄÊ>u$Û©Í!—2[Àâ=2HKº§Z†Ù¸v^ÊÕ½]ùóbµ=R¤y‰HÀqÿRÒ³¬Zù8âÓî#„º„Ç Ï Ÿiñžf…Ž®ßۮؘž\Ú¬Íí7¥±S—MM¼E¹M†Ìqí¾‘w°´ ƒµ~8QŽÉ“ìôW2>†£²hN‰ãLosÉð–-¥åÆ]h3ô"ÈM›.0hŸÐ ¤¨0¶YYìV‰lú•W3=¡z¿ýfYvêèwqÌŽl§ÓÂþÊ -J„†ôWLXg˜3ãR÷d"Þ]5ÁE³Œ¿a+ñS—>ñ¼ƒ»bŸçË&ºò+&qRÀ9ðz“÷½Ëõ¡‘ïì¡ “è´øûÑÐúˆq©›ùÃTÏÕ~7ƒ;¨Â‡aïóõºF¤¬8ê>S\=|A÷êg¨Or$:6ÏÒyAŒè+éç¢xŒÑ±0bî0å²LDþP´ØMWÓïÊJ&O/ü޼݀U@4>îQë(_ÃÏTrð‰"@&¿•h²‡óÃa¯(Ëû°Ö+WÉ8ÆØP}×·õq4úÝ×Â2.á¸ÇŠ…¼mä á…Ø½ÊE2òDsçª á…%g:–kŽáÈê`Ë<8 æ” ×åÖöE»÷¡S©ÈàlÇ›r‰”'5/×â uVÇOQaâa9RO%è"=ëÑHH¤=:B‹9ø läg±ߥ–ê,¹Õ•K¬äøHÜ[i¢Äfí¯Þëk¥MBY£:‰æµ4ÞÈÂV¿‘5“\ÁK>ü€ÓÍ£ìÏMõ–¥ƒ|`‰’‚ÖVˆ yóÙ~Ü0¸s¬Ü¸½xá'?ÿD¤§Ä¬£Z‚ÇQD¤Òš%N¯bVOHñ?S?‘pÔh[ rú~n´³ùÔݳ¥ KrÕ…@ñ•:Yöpü.™½qs_qÇÚ‡ÛÙ7{,ºG0¿K‡KKwBÎ)߆6Á¢€ 1F#|‹þgÝnµD‘xl±„ù}âw&ŒÜ{¸)ÂPhòòmdswvÝJö;Aw«!460kýŠ)ƒ€öh¨…C=–*ÌZU©†>µ÷Ñ%@lYo‹®‘êÔwt Cœæ(ŸxCé6ØÊ^t]kkòÍ!¡TŠ»ƒ\˜ó—«êÊ7ûž­ºRf¿ÜAýä,¹üßÁåñ¤½*Ïs‡ã$|8 @ÉQÉ¥gÿ›õÂÞGlîõØ`ùzÈhO¾ë.rï ‹É‹{Ð$x´÷tý?µÇ“¹Ð£æ8’ñgàŸçÇÄ>+Y¬!o§x”¶¿¸€F*0PÆ®{=q…tÁjkѦfº¡9—ýfåüqÏâÊÌ< õ I¦òÁ£ —Ë|™Iý½ @8G,Sð­,ŽôŽȹO[¨èÓ¡Ø‹8 ËÍS® ¾è^e‚"O»óÑb;Þ›XdJ(K:ç¡ã}Ɇ@!BäÞ_/ËRáÞ ‰PÛ ñìöMm—•LÖõ>W,#_{Zª!Ô#µ¤žc‘ÆFÕÏ™¡6+øèˆp-b(UªöÌ+ókÖ‚ß[;†úשàM_eQàô³°ú1é„SMRÒUþÊUz„wÛY‘ŠpÕ”–ÁÆG?²™ê§Ëî9†ÖÞ¨á4Ï_‰nôöýgãITËKÏ):%lò‹Ù@Ú;Ê‘.Ǫ_³ÑSv¿¾“zá |‹% ¡ ¬vèô,<[6*õ"É¢‚Slb=ý±ÏÈ=Å>CÀsQ'“æ›Úf9‘üÔÓ,9X}"l¥üq@¸¯ÿ¿,!å§ãß3Ú›G2‹âuÍ —µÿŒÔ¦·PÃÁ0{Óàa+š"p»£ót(J‹­Ê鈬hÙÀàÎhe˜”dR©½b€AתFÀªæF3ï^Ÿ€ ÓK±ƒPOÍ Í“(z)º=4ꈃ¹ÆCêft\ÝiÐidÉöLíu¼õ•›C&H·b÷€vÌôh¬µìž£üÔ¾4<ÿD.Žã^åÂúây¦wÄ۲ӒŇ]z&qC%5®Xàk$VÔYÿö¶mk¶Ëý9& dV;»c³-ÏmÅ@ÇîRò“@Îy·8oœfß”ŸÎpx ÁÑID »×Ë(-û„Fù%^¹ÚµËY×õH-öã¦Ç?8,ÎsSÞY‚eÐRµÀña"¨QÝ– Û©ïîLý”_†A *¶(ÏOVã %Vôãq{æw|mÜÎQ)70Àto&luÔ!'ë¥Ú¡tœ]KW;ò¸K…LƒÕ•dVžÇ>A×ÊMyŸKÑ—ë¢$=)9#®ŸÛ¯JæŽ1ì ödà`ßÚ´ ãÿºÿ9J£Œ.`çé$>ù ÒCñê cRƒƒû›´U È­:ö‹Ô}Qâ`%DÞÍg”9º®{i…Ÿp¢[B*]V?­vqâÑ䆒d—W@¹yQ!@Ùim4Ê+è ióçÒ %ÈÒ[CöJ8Déþ„ôx*~†•N_w¦pIã±ç4Í:c6çøãÒõ–NááÓèC¾äüÛø‚$ÈÉœÊ3Û& ekôPR©—I\ÞY‘-7ØOh]Tj?§®&Á¡mÇ´Ü󋎉àæbÎS \Mn#wßÛ˜ª/M=úÈpœŸ{em)Vœió4ºFÄßýõœLÅMíqTè´=f²x%Äî¿cwLö(h¤#ŸÞXŒÚ—„àá “Ša§Cɲ"÷œº·í“\þI©@»ÝrOP±(Њƒ é¹ÿüX8ŸÌþB@JË{ù=R=¿ÃµÍ/þmvñðŒXöéò)ÅÄ¢°\Ú„†3Â8!Ú )˜½ÜÉõl³”ÞZÖÞa ýl *(ý4™ÁúP„$\áÛe˜Ì"À@DM&­ËÇ"m Çã@G—IxGÙ¼µX -¡ÏË;½>bÚšjD‚[lˆ/jG³?nx‰"üÂXe»))@¬áßö·Œ€ê/J.PT#kÐe@_f~ù”jñˆoS·M©&ÉWÓãi‚ü÷&=&¨î4¤Ld‹yý5v+ånkªˇ54IÖ*~Ú¡„”}Ê”=ý®Ê™¡ä†¼k)™öß!Ì@Œ¸äßM0:ÇÓȲZî›Ò­I–œ*_Ý ~±ogاM^JõÃÇ0_¨‘¹BÈ¥¹TŠÆ|³ò«/EX ùºù]fõ„F-ò8Pòøó|ö´ãCva¥¨…­…Hr1 ‡¨v #Ñ0{jÅ•šN’ÃCá˜@¿4µäˆ^í)žóVÆã¬êmüëï·¤kƒo¿/øøñ§}À•Al+d¼œÒÚœ#¯O!3[Ä~â(™Çõ»7âä ®î¿«.Ñ:þºóô‘G”MÖÁØãžrƒ‚Õ #Ýñc^+I‘=¢øŽ¥Ô2bÚKÒR‰PEö½ÕÑq øúD&]&¾÷¢Äœ3L![e=Æ´ÖóZÕö£¸Ì”ú9<ɨÛÞ”üO5z‹+»¿^^ü<ÙWãBcJ4„¤fÜ!®ÐÝÒö»lvX†æÓ®?«¥ÿTn ëƒkw¹?±€•“Ž78Òayþ'Øü?mÄK#ð7#× ÚümOÁö_©|÷äÞ²Êò{l C%õí6¿q. õØ@øï§õï-á—FÓiÖhb[:9¢ìC@JX_<Šôô°k«òPÀø#®õí]^ŽªWô@5ÕgMƒàan.¼Þì[Üáq+j jÎT·ç©Ï=•˜…QpÚÚV¦ãõ˜’ÊA ŒK©tåmœ­ƒ:ðèNhÝÞ ¡NÌ5ÃÚ ©Ÿçf1Ÿ`q„vW ²z¼WÅÐ.õÄè¨|àmöî1ºœ²‡‡z$§3ñyf7kß;ch£ÃÁ„w›—­ñÄl aªòlh!º/˜½Ã·!Û4h*¢ßÄwÂT×ÐjÚºíQƒÆòfÑÈ2³ŒžBxç5þ¤z%;àIqIëÕ[\±ù™nY)åGÿ˜ÙÎЬ\Ã_„[u¡ê·*ýQÛµm@—ˆ Çà Ž!¤»B´˜:%ö©¤ÙåIP©èÔ£ ÏØH”…¸fP¤øÄܵtH%§¡™ Иkþ"^:ØKó7~HìJñ·3¥ 1oàñR‹MNÛ†2ÁZÿ‡©›G“:ØÀÑä*©$²[#sÙtC0‡2ºqb/*K¹C•¦ Õ:©öd#M®Ÿ·[T¾¬3 l@ÞÓÄÆWeܹpÄ™º`>¨ì8ê„!vPiq‰à6I®®öã‰6[5_l&¹’‘ü‚g‡ø­×©©ÉsV9ãùJ¡r€O[ÇÍZ†Pnà¹;™9စӌl=óe!²s ކ°v\ÔãÚÒK,È¿%¬_'?[Eø]ÛßSÓ$ð_8kó?S<Zc?æÑ@âÒ~¦*µ:œpk3WôZó§åÕÑ8SrîÓ¦LaE´„t' 1hq"ÞÒ^ˆÂÝæˆ„/IV.lU‚©®È›±)O/‚I‘63f:f*~[¹A> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH ý÷ëñ#xÙö?ŸgìÁÜýx]OTÝmÍ$|äìÍœºs_™Iöss îîò®:L;<S›zœ==±×¾«Öf`÷Ù*_µÍð`É«¶ÚŸk3²¾'ióÑ´ž‚}Øý»ù=©½à“í¹ÙM;áà¾7ÃÞr¾›f¶ÆnjÌ-ùeúSÓµOLg~¼À8÷ã ãâþÈ)okà çA„8 ö$`I\èÎ×3`çAfŽã<ÈZ]ƒÂ!‹„ê xNkÇyã¹ãÐð"œ7Á¿ _¥ã“§Ìq âH`òáö•‚nú¥¤kÌÂðRONH=CpB:# =Ñ%8“ˆ88QA~¡!*ÉzÆœøÐäT?!~Ž> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH ý÷ëñ#xÙö?ŸgìÁÜýx]OTÝmÍ$|äìÍœºs_™Iöss îîò®:L;<S›zœ==±×¾«Öf`÷Ù*_µÍð`É«¶ÚŸk3²¾'ióÑ´ž‚}Øý»ù=©½“í¹ÙM;áà¾7ÃÞr¾›f¶ÆnjÌ-ùeúSÓµOLg~¼À8÷ã ãâþÈ)okà çA„8 ö$`I\èÎ×3`çAfŽã<ÈZ]ƒÂ!‹„ê xNkÇyã¹ãÐð"œ7Á¿ _¥ã“§Ìq âH`òáö•‚nú¥¤kÌÂðRONH=CpB:# =Ñ%8“ˆ88QA~¡!*ÉzÆœøÐäT?!~Ž> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvH U„dçCâ°mUªÕ^!1ÝHDI8ô߯Ÿá-Û@ãçñóŒ=˜»¯Û™®Ú½…œ½Ù¡=÷¥¥?w]pw—µåùd›ñÙÚÊVÓìðÄ^û¶Üڑݧ›lÓÔãƒ#ošòx®ìÄúždìGÝöa÷ïö÷¬<õBÍöçú8ÖÍŒ÷½ŽóÝ4s5vSc~É/ÛuÛ<1ñÈ9w…¼©Òö†`~ÑÁ擲CÝTýE Ûƒ´@HVÕåxùïòäo?‡Ñž6Í¡ ’„ÍßÜä0öŸ^áC0é+Û×Í»¿Qæf¶ç®;ZPÁx°^³Ê\Cçýyw²lþÁ+åý³³Lú±@Ue[Ù¡Û•¶ß56H8_³¤(Ömªÿæ®Ø&ªrT¾„¯PGë ‘¡Ã2†wØ`24XXºBX8aÁá ‰…ÃJû‚ÃA¢`R¥Ðˆ è¡¡‡^]wqº&j9)*ÿìú‹v®`‡ÆRò°Ä:(à!bx8ápŒØ÷¹ììׂN)¤ï‰&â>0Ni¼‚qFãÆù?ü‰SÜÖ€'¼ÂYðàNR–È}Â{àfØ{©çx2­¯AÃ! …u x‰k=Ç{ã™çàäàExo"ÿ}žžRÏÉ‘#£¿¯xÛ _J¼Æ °B ¾Cì©bÏ8!ž‘=Ñ%p&r"àD9ú Q¾ gÌ‘T†uà+ägÐG¡N—š£N8O-(7ZRntH¹Ñ ÊŽ(7:¦ÜhE¹Ñšr£1+ôè‹wÏÏ(O:¿Í“.nódømžŒøš'#¿æÉ„”'³ <™ˆòdbÊ“Q”'³¤<™åÉhÊ“1”'“RžLFy29åÉ”§”SžRAyJ%å)]\ïÌÿòý/Þ&xG¯¯^yî{÷ úÇÖ?tðÄÕ½¾Ç]ÛÁ*ÿñùô·£—"ø »s¨s endstream endobj 32 0 obj << /Length 750 /Filter /FlateDecode >> stream xÚmUMoâ0½çWx•ÚÅ$*B²ó!qض*Õj¯˜n$H¢$úï×3Cð²íh<~3~Ï~î~¼ngºj÷v¦9{³C{îK;Kîºàî.kËóÉ6ã³µ•­¦Ýችöm¹µ#»O7Ù¦©ÇÞ4åñ\Ù õ=ÈØºñ8‡Ý¿Ûß³ò4Ö‚Ïöçú8ÖÍŒø½ôí>sIv›dXôËöCÝ6OL xû9Œö´im$lþæ6‡±ÿDŽÁü¥¯l_7ìþ–šÛÚž»îhãÁzÍ*{pþçÝɲù·¯˜÷ÏÎ2‰kA¼Ê¶²C·+m¿k>lp¾fIQ¬ÛTÿíÅT±?LÐØAù>J‡ë ‘¡‹e .1›ÊPbéªpqH I$\kL¸8HbØŒShÄ…r =ôêzŠã51Xò‰Qùg×_¸sµ‚2¥äÄ’òÀ€+Š Ä ŠsˆC:CQŒ}.'c-ð”BbOEðƒuê×+Xg~Â:ÿ?aŠÛàj îB€.U ±$,ð¨›ĨA¦ˆA 2®‚žAÃ%‹˜òâ%Õ"µñ 1ô9h¨M„ _®ñ¤)ELN 1éÀs¥ ×þRÒ3fg =傸aîCÑYj¥ VÑÝà^¬w&L˜Ó=·° ½Ð3â„nqFyÀDŽϠOLüñ5'žpÏZx?iéý¤•÷“^x?éÐûIGÞO:ö~ÒÚûI“‡4ðÑíˆÏ¼Ït~ë3]ÜúÌð[ŸñÕgF~õ™QÞgfá}fBï3yŸ™ØûÌ,½ÏÌÊûÌhï3c¼ÏLê}f2ï3“{Ÿ™Âû,åÞg©ð>K¥÷Yº¸¾Nœ0³`Â^Çayî{7)q ã„ÑW7ö:©»¶ƒ*üሟþS`õRé̯ endstream endobj 33 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇQðÙáÒœÆÆÍ8ß›ñäIßž3d_ƒ “~Ù~hZ÷ÄÄ#çÜ W›ö c Ñü*…Í'qÇÆÕýU;€ºHHV7ÕxýÂwuö÷É»Ïa´ç­;¶ÑzÍæoþpûOÔøÍ_úÚöû`÷_¥ù£Ý¥ëNd0m6¬¶G_ÑÏÿ¼?[6ÿvÆçý³³Lâ·ºª¶¶C·¯l¿w6Zs¾aë²ÜDÖÕÿ%!ãpœ¨™§ò%¼b•l¢µËÜc€Ã¤ ¥¤ÀÈ ¤ÀPÀP«[ ßuªŸñ©_õgß_•ñxû4Ž$Oˇú<X^\NB8 ë\;c®‚šBbMx¹ ùy˜%ÆPÈ 3jok:E q:¹Œ/d4ˆ8ð€Q§4ÈA2="\¤ÂšYˆ+ÀË‹ÔÏsä(Äè5$ YŒ—Èú rŠÀ‘€ƒ~ì+A¿\HÈ•ÐWr߯{ÇNøxoËøŠ‡û• ¿”$¿TL~©ù¥òK¥ä—ÊÈ/¥È/¥ƒ†p˜1ðsòQä£*ÉGÍÉG-ÈG-ÉG“zA>ê„|Ô)ù¨3òQ/ÉG½"µ"µ&µ!uN>ê‚|Ô%ùh8ùhùh$ùhbòÅ,n~á†üá°nË£ºô½ß+¸´p]À¢hœ½íµ®í \ˆÓ†¯—2ú ¯M„Ç endstream endobj 35 0 obj << /Producer (pdfTeX-1.40.28) /Creator (TeX) /CreationDate (D:20250703135409-07'00') /ModDate (D:20250703135409-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.28 (TeX Live 2025) kpathsea version 6.4.1) >> endobj 9 0 obj << /Type /ObjStm /N 21 /First 152 /Length 1607 /Filter /FlateDecode >> stream xÚíXÛrÛ6}×W౎µÄœñdÆ—8q§Ž/‰Sh‰‘XK¢"R‰¯ïî‚’(JNëºÓ§Î˜ðb±Xœ= ¬@* )l”±R å!ÐÖi…×8àPcǽÑP(¥¬P‘PÖÙŽRBÅ ÎÄYh ”Ú(ìÇB;/…FÚHXaT¢„Æh#¼0Ö; ã%. ;ÕÁ“HÙÙÝíÀÅÃ4pš²“*›T¥Ðø¬gYYÌg½¬Dô¬8Éúyº_Ü‹ëÃñ‰ºéàôÎ#ÿdöâ{>BobwWÀ‘!<8B¢F„µH˜ƒè$"­E…hID/p:+zçY%®áá‘€‹ì¾7‹¶B—›ØŸ ¾s­øÇ0¯-fðÿç?n:×Úú.Èu½°Rvå³Úà§Ùz×ö4Þè®>ÒÝDxi»Nxk…ó1jUˆÉ{MZ¶Ó1Yjïbœá”ïâ.KžØk˜_¯ ’®Ö)´¬W–Ü& ùijœä•j& Îm²ÒŒ)hŒ‹øYõÂèJלCZe E,‰ñ€«É ûS’l#¦5[èÅlç“qĘa>ØshÙohcMQ„Vù[¢Çc!4†¼rO1S<‡úIDY‘ä±Z5Z2 ˬ¤¦•Ž9nÙ}s¬o°Çµ"x5ž ‡6h(4ñfa1m.ŽŠz{ņ6 Úi’°ŠÓáFK¤«ÇkÏ­½cRdMxíß:e¤–Ë[*Ÿäzh[jPÀÎêl4äFöX»–SµòQ§Â®[ Ð®Ò û iŒ†‚Ì-î(”ÐZ í#N&µ&N(àÕ˜r葤0òœ–¼,ž°‚Ábê6h<þ"»DS?¢óï 'O»N'\4[i«)¦HóLÅy@Žž¥þÂÌÚ·¢ôZ³ôMVøÈ(rËŽÅ¢Ñ x]ZõÈÑ– ,%•$Ýæ8Ï`Ås?–õÜ¥U[$ày5à™[L‘DeÔPë<…‡EV1‘Ë0&O‹`©Ùàå§‹VrÙ¤ëm`']\Ï®eD?!2¢SÅ+Ôkr›àÊvMcñüÑ¥ŒncblCnj‚gÑkÊÊ[Úˆ ›znÐó™ïŸjžÛôÉ6x£¤m)Ö 7GCDAæö¦q“¢;ÏaVöfù´*fáô.ãÈåùÉååû_NÎd„úQ:(… û|£Ú1‘ØQ\&¢„ Þ«öÊÝ«\‚–éôu–†ØuhÛ‘4x\¥£¼·7Œ2îÏ«lü§uઞc´DÃtF—¬Ÿ`à^ÂÃ;ø Ná.à#\Á'HázÐ+FÅÛñ8…>dð>çø÷%¼†0|˜³ äp#à (&LašÍò¢3(¡‚j8Ë2¨¾0‡¯ð îááç÷QŽhñNݸ3þ‹ï÷÷>¼½bÕvñ$"‹øªÇÿ‰ö‡$¾3¸„ð;Ò–Ž1ð2ôk‰º@²6Džþh0µœøžÍŠ&;J>…×G¯^žýÊìøGØÑa%³Iþ6;öv¬n²­³s '¸µhc]!;½z ˜Š@´¦amG(ý”˜÷OOOÞ}˜/Ž;XÚÖKâ‹ß3öÄŽ4Ë]?º+^b¼mF‘.NÈ"ܵ“qO _‹Ü>%òÓ7¯öÎ(ò‹GK Ž)·ËVâqK¹7u—qã+ó?/(¯áí²œPÖÓ²—çU>êg(V}y‡§ã6íÝ•£´Âí,íe£ìs¤ùfñ.«–j”Ã@»,õ‹Ñ(!ÕÙ—y:‚ì¾7JÇõÛ¨N“ùøÏg>h*zoåeX ‹`ŽˆˆE®¦£y _æE•õoGœ¹2çGˆakƒï›‡ÙoO/Ò;¿­¸KJäu?-3~}nÿl¬mú®Á¯åGù¬¬(‚ªâÛtÙAWó~5,éÓ›^—ßG4ÉÓÑ´Êo j£Ññch|ŽžŽ¦UîZhL Uòíhâ 4òéhÚ…¨ǵá˜u8jÇnÀQO‡Ó®-8ñF®ô·‚c6àl)Ðô ©¤oHs\cù5ï—âšqÓ';ü×úætb…)0³ñéèOí[Ø endstream endobj 36 0 obj << /Type /XRef /Index [0 37] /Size 37 /W [1 3 1] /Root 34 0 R /Info 35 0 R /ID [<22F7A0A15816E35064642EBBC38D00FD> <22F7A0A15816E35064642EBBC38D00FD>] /Length 128 /Filter /FlateDecode >> stream xÚÉ=a…á÷ ƒñ7ãg D"‘Hè¬B7-XŽÎBÔV`%ì@£¾s›'ï½à—A!ƒ ÄU™Ò ÍÈŒ¥í'Ö‰i˜LäUüš&7-Ó6Qc-ÄþÕ—STOÜQ}ñzF ¤ÙiQ'–×Äê‘XcJ›w:w7þÀ Æ endstream endobj startxref 80807 %%EOF asymptote-3.05/doc/CAD1.asy0000644000000000000000000000255715031566105014132 0ustar rootrootimport CAD; sCAD cad=sCAD.Create(); // Freehand line draw(g=cad.MakeFreehand(pFrom=(3,-1)*cm,(6,-1)*cm), p=cad.pFreehand); // Standard measurement lines draw(g=box((0,0)*cm,(1,1)*cm),p=cad.pVisibleEdge); cad.MeasureParallel(L="$\sqrt{2}$", pFrom=(0,1)*cm, pTo=(1,0)*cm, dblDistance=-15mm); // Label inside,shifted to the right; arrows outside draw(g=box((2,0)*cm,(3,1)*cm),p=cad.pVisibleEdge); cad.MeasureParallel(L="1", pFrom=(2,1)*cm, pTo=(3,1)*cm, dblDistance=5mm, dblLeft=5mm, dblRelPosition=0.75); // Label and arrows outside draw(g=box((5,0)*cm,(5.5,1)*cm),p=cad.pVisibleEdge); cad.MeasureParallel(L="0.5", pFrom=(5,1)*cm, pTo=(5.5,1)*cm, dblDistance=5mm, dblLeft=10mm, dblRelPosition=-1); // Small bounds,asymmetric measurement line draw(g=box((7,0)*cm,(7.5,1)*cm),p=cad.pVisibleEdge); cad.MeasureParallel(L="0.5", pFrom=(7,1)*cm, pTo=(7.5,1)*cm, dblDistance=5mm, dblLeft=2*cad.GetMeasurementBoundSize(bSmallBound=true), dblRight=10mm, dblRelPosition=2, bSmallBound=true); asymptote-3.05/doc/diatom.csv0000644000000000000000000000774315031566105014740 0ustar rootroot"sediment depth (cm)","year","Achnanthes minutissima Kuetzing","Anomoeoneis vitrea (Grunow) Ross","Asterionella formosa Hassall","Tabellaria flocculosa (Roth) Kuetzing","Fragilaria cf. tenera","Chaetoceros muelleri/elmorei cysts","Aulacoseira spp. ","Fragilaria capucina var. vaucheriae (Kuetzing)","Fragilaria crotonensis Kitton" "A","B","C" 0,4,6 0,2000,11.6959064327485,9.55165692007797,49.6101364522417,1.364522417154,0,0.974658869395711,0,2.14424951267057,4.09356725146199 10,1998,20.2676864244742,11.2810707456979,34.7992351816444,2.39005736137667,0,0.191204588910134,0.573613766730402,0.382409177820268,7.55258126195029 20,1996,21.1282051282051,33.6410256410256,24,2.35897435897436,0.615384615384615,0,0.205128205128205,0.615384615384615,2.56410256410256 30,1994,25.7620452310718,21.0422812192724,31.3667649950836,2.16322517207473,0.393313667649951,0.393313667649951,0.196656833824975,1.76991150442478,3.73647984267453 40,1992,21.0422812192724,16.5191740412979,42.9695181907571,0.589970501474926,0,0.983284169124877,0.589970501474926,0.393313667649951,1.96656833824975 50,1990,23.1067961165049,24.0776699029126,29.126213592233,1.35922330097087,0,0.970873786407767,0.388349514563107,0.58252427184466,3.30097087378641 60,1988,35.0738916256158,33.3004926108374,4.33497536945813,1.37931034482759,0.591133004926108,1.97044334975369,1.18226600985222,0.985221674876847,2.75862068965517 70,1986,42.2090729783037,33.7278106508876,2.26824457593688,1.38067061143984,0.788954635108481,1.18343195266272,0.591715976331361,1.38067061143984,3.25443786982249 90,1984,34.5098039215686,41.9607843137255,0.196078431372549,2.15686274509804,0.588235294117647,2.74509803921569,0.588235294117647,2.15686274509804,0 95,1982,38.0487804878049,45.4634146341463,0.487804878048781,0.975609756097561,0.975609756097561,0,0.390243902439024,0.390243902439024,0 110,1980,40.1860465116279,41.4883720930233,1.30232558139535,0.837209302325581,0,0.930232558139535,0.372093023255814,0.372093023255814,1.3953488372093 130,1978,39.6501457725948,42.1768707482993,0.291545189504373,0.194363459669582,2.72108843537415,1.55490767735666,0,1.36054421768707,0.777453838678329 150,1972,32.6298701298701,31.4935064935065,1.86688311688312,1.78571428571429,0.162337662337662,13.961038961039,0.162337662337662,1.94805194805195,1.86688311688312 170,1970,30.7692307692308,47.534516765286,0.986193293885602,3.35305719921105,0.19723865877712,1.38067061143984,0,1.18343195266272,0.591715976331361 190,1965,40.5268490374873,37.8926038500507,1.82370820668693,2.63424518743668,0,1.21580547112462,0.405268490374873,1.21580547112462,1.01317122593718 260,1961,40.4494382022472,26.0299625468165,0.468164794007491,1.31086142322097,0.561797752808989,8.05243445692884,0,3.74531835205992,0.374531835205993 280,1950,44.946025515211,11.9725220804711,0.294406280667321,0.785083415112856,16.48675171737,1.96270853778214,0.392541707556428,2.35525024533857,0 290,1942,41.2818096135721,8.29406220546654,0.188501413760603,0.282752120640905,28.6522148916117,0.942507068803016,0.377002827521206,4.33553251649387,0 300,1940,18.0995475113122,12.3076923076923,0,0.180995475113122,40.3619909502262,5.61085972850679,0,2.35294117647059,0 310,1920,28.6844708209693,11.2759643916914,0.593471810089021,3.26409495548961,13.0563798219585,13.2542037586548,0.19782393669634,9.89119683481701,0.989119683481701 320,1915,6.17977528089888,1.31086142322097,4.30711610486891,6.74157303370787,32.7715355805243,34.4569288389513,1.31086142322097,2.62172284644195,0 330,1910,4.03846153846154,0.769230769230769,14.5192307692308,36.4423076923077,5,0.769230769230769,11.1538461538462,0,2.11538461538462 340,1888,7.37148399612027,1.1639185257032,9.40834141610087,31.8137730358875,1.1639185257032,0.969932104752667,14.3549951503395,0.193986420950533,0.969932104752667 400,1763,2.69749518304432,0.192678227360308,24.8554913294798,26.7822736030829,0.385356454720617,2.69749518304432,20.0385356454721,0,1.54142581888247 450,1726,2.37859266600595,0.396432111000991,9.71258671952428,28.5431119920714,0.198216055500496,0.594648166501487,30.5252725470763,0,0.792864222001982 asymptote-3.05/doc/join3.asy0000644000000000000000000000067215031566105014500 0ustar rootrootimport graph3; size(200); currentprojection=orthographic(500,-500,500); triple[] z=new triple[10]; z[0]=(0,100,0); z[1]=(50,0,0); z[2]=(180,0,0); for(int n=3; n <= 9; ++n) z[n]=z[n-3]+(200,0,0); path3 p=z[0]..z[1]---z[2]::{Y}z[3] &z[3]..z[4]--z[5]::{Y}z[6] &z[6]::z[7]---z[8]..{Y}z[9]; draw(p,grey+linewidth(4mm),currentlight); xaxis3(Label(XY()*"$x$",align=-3Y),red,above=true); yaxis3(Label(XY()*"$y$",align=-3X),red,above=true); asymptote-3.05/doc/multicontour.asy0000644000000000000000000000071215031566105016215 0ustar rootrootimport contour; size(200); real f(real x, real y) {return x^2-y^2;} int n=10; real[] c=new real[n]; for(int i=0; i < n; ++i) c[i]=(i-n/2)/n; pen[] p=sequence(new pen(int i) { return (c[i] >= 0 ? solid : dashed)+fontsize(6pt); },c.length); Label[] Labels=sequence(new Label(int i) { return Label(c[i] != 0 ? (string) c[i] : "",Relative(unitrand()),(0,0), UnFill(1bp)); },c.length); draw(Labels,contour(f,(-1,-1),(1,1),c),p); asymptote-3.05/doc/slopefield1.asy0000644000000000000000000000022215031566105015654 0ustar rootrootimport slopefield; size(200); real func(real x) {return 2x;} add(slopefield(func,(-3,-3),(3,3),20)); draw(curve((0,0),func,(-3,-3),(3,3)),red); asymptote-3.05/doc/logimage.asy0000644000000000000000000000074015031566105015236 0ustar rootrootimport graph; import palette; size(10cm,10cm,IgnoreAspect); real f(real x, real y) { return 0.9*pow10(2*sin(x/5+2*y^0.25)) + 0.1*(1+cos(10*log(y))); } scale(Linear,Log,Log); pen[] Palette=BWRainbow(); bounds range=image(f,Automatic,(0,1),(100,100),nx=200,Palette); xaxis("$x$",BottomTop,LeftTicks,above=true); yaxis("$y$",LeftRight,RightTicks,above=true); palette("$f(x,y)$",range,(0,200),(100,250),Top,Palette, PaletteTicks(ptick=linewidth(0.5*linewidth()))); asymptote-3.05/doc/irregularcontour.asy0000644000000000000000000000054515031566105017063 0ustar rootrootimport contour; size(200); int n=100; real f(real a, real b) {return a^2+b^2;} srand(1); real r() {return 1.1*(rand()/randMax*2-1);} pair[] points=new pair[n]; real[] values=new real[n]; for(int i=0; i < n; ++i) { points[i]=(r(),r()); values[i]=f(points[i].x,points[i].y); } draw(contour(points,values,new real[]{0.25,0.5,1},operator ..),blue); asymptote-3.05/doc/flowchartdemo.asy0000644000000000000000000000160115031566105016305 0ustar rootrootsize(0,300); import flowchart; block block1=rectangle(Label("Example",magenta), pack(Label("Start:",heavygreen),"",Label("$A:=0$",blue), "$B:=1$"),(-0.5,3),palegreen,paleblue,red); block block2=diamond(Label("Choice?",blue),(0,2),palegreen,red); block block3=roundrectangle("Do something",(-1,1)); block block4=bevel("Don't do something",(1,1)); block block5=circle("End",(0,0)); draw(block1); draw(block2); draw(block3); draw(block4); draw(block5); add(new void(picture pic, transform t) { blockconnector operator --=blockconnector(pic,t); // draw(pic,block1.right(t)--block2.top(t)); block1--Right--Down--Arrow--block2; block2--Label("Yes",0.5,NW)--Left--Down--Arrow--block3; block2--Right--Label("No",0.5,NE)--Down--Arrow--block4; block4--Down--Left--Arrow--block5; block3--Down--Right--Arrow--block5; }); asymptote-3.05/doc/bigdiagonal.asy0000644000000000000000000000005115031566105015705 0ustar rootrootsize(0,100.5); draw((0,0)--(2,1),Arrow); asymptote-3.05/doc/extra/0000755000000000000000000000000015031566105014056 5ustar rootrootasymptote-3.05/doc/extra/intro.asy0000644000000000000000000005724615031566105015745 0ustar rootrootsettings.tex="pdflatex"; orientation=Landscape; import slide; import three; import animate; bool long=true; usepackage("mflogo"); viewportsize=pagewidth-2pagemargin; usersetting(); // Commands to generate optional bibtex citations: // asy -k intro // bibtex intro_ // asy -k intro bibliographystyle("alpha"); itempen=fontsize(22pt); defaultpen(itempen); viewportmargin=(2,2); titlepage(long ? "Asymptote: The Vector Graphics Language" : "Interactive TeX-Aware 3D Vector Graphics", "John Bowman and Andy Hammerlindl", "Department of Mathematical and Statistical Sciences\\ University of Alberta\\ %and Instituto Nacional de Matem\'atica Pura e Aplicada (IMPA) \smallskip\Green{Collaborators: Orest Shardt, Michail Vidiassov}", "June 30, 2010", "https://asymptote.sourceforge.io/intro.pdf"); title("History"); item("1979: \TeX\ and \MF\ (Knuth)"); item("1986: 2D B\'ezier control point selection (Hobby)"); item("1989: MetaPost (Hobby)"); item("2004: Asymptote"); subitem("2004: initial public release (Hammerlindl, Bowman, \& Prince)"); subitem("2005: 3D B\'ezier control point selection (Bowman)"); subitem("2008: 3D interactive \TeX\ within PDF files (Shardt \& Bowman)"); subitem("2009: 3D billboard labels that always face camera (Bowman)"); subitem("2010: 3D PDF enhancements (Vidiassov \& Bowman)"); title("Statistics (as of June, 2010)"); item("Runs under Linux/UNIX, Mac OS X, Microsoft Windows."); item("4000 downloads/month from primary\hfill\\ {\tt asymptote.sourceforge.io} site alone."); item("80\ 000 lines of low-level C++ code."); item("36\ 000 lines of high-level Asymptote code."); if(long) { title("Vector Graphics"); item("Raster graphics assign colors to a grid of pixels."); figure("pixel.pdf"); item("Vector graphics are graphics which still maintain their look when inspected at arbitrarily small scales."); asyfigure(asywrite(" picture pic; path zoombox(real h) { return box((-h,-h/2),(min(10,h),min(10,h)/2)); } frame zoom(real h, real next=0) { frame f; draw(f, (0,-100){W}..{E}(0,0), Arrow); clip(f, zoombox(h)); if(next > 0) draw(f, zoombox(next)); return scale(100/h)*f; } add(zoom(100), (0,0)); add(zoom(10), (200,0)); add(zoom(1), (400,0)); ")); } title("Cartesian Coordinates"); item("Asymptote's graphical capabilities are based on four primitive commands: {\tt draw}, {\tt label}, {\tt fill}, {\tt clip} \cite{Bowman08}"); asyfilecode("diagonal"); item("units are {\tt PostScript} {\it big points\/} (1 {\tt bp} = 1/72 {\tt inch})"); item("{\tt --} means join the points with a linear segment to create a {\it path}"); item("{\it cyclic\/} path:"); asycode(" draw((0,0)--(100,0)--(100,100)--(0,100)--cycle); "); title("Scaling to a Given Size"); item("{\tt PostScript} units are often inconvenient."); item("Instead, scale user coordinates to a specified final size:"); asyfilecode("square"); item("One can also specify the size in {\tt cm}:"); asycode(" size(3cm,3cm); draw(unitsquare); "); title("Labels"); item("Adding and aligning \LaTeX\ labels is easy:"); asycode(preamble="defaultpen(fontsize("+string(fontsize(itempen))+"));", "size(6cm); draw(unitsquare); label(\"$A$\",(0,0),SW); label(\"$B$\",(1,0),SE); label(\"$C$\",(1,1),NE); label(\"$D$\",(0,1),NW); "); title("2D B\'ezier Splines"); item("Using {\tt ..} instead of {\tt --} specifies a {\it B\'ezier cubic spline}:"); code(" draw(z0 .. controls c0 and c1 .. z1,blue); "); asyfigure(asywrite("defaultpen(fontsize("+string(fontsize(itempen))+")); size(0,7cm); pair z0=(0,0); pair c0=(1,1); pair c1=(2,1); pair z1=(3,0); draw(z0..controls c0 and c1 .. z1,blue); draw(z0--c0--c1--z1,dashed); dot(\"$z_0$\",z0,W,red); dot(\"$c_0$\",c0,NW,red); dot(\"$c_1$\",c1,NE,red); dot(\"$z_1$\",z1,red); ")); equation("(1-t)^3 z_0+3t(1-t)^2 c_0+3t^2(1-t) c_1+t^3 z_1, \qquad t\in [0,1]."); title("Smooth Paths"); item("Asymptote can choose control points for you, using the algorithms of Hobby and Knuth \cite{Hobby86,Knuth86b}:"); string bean=" pair[] z={(0,0), (0,1), (2,1), (2,0), (1,0)}; "; asycode(preamble="size(130,0);",bean+" draw(z[0]..z[1]..z[2]..z[3]..z[4]..cycle, grey+linewidth(5)); dot(z,linewidth(7)); "); item("First, linear equations involving the curvature are solved to find the direction through each knot. Then, control points along those directions are chosen:"); asyfigure(asywrite(preamble="size(130,0);",bean+" path p=z[0]..z[1]..z[2]..z[3]..z[4]..cycle; dot(z); draw(p,lightgrey+linewidth(5)); dot(z); picture output; save(); for(int i=0; i0$ and a shift $b$ so that all of the coordinates when transformed will lie in the interval $[0,S]$."); item("That is, if $u$ and $t$ are the user and truesize components:"); equation("0\le au+t+b \le S."); item("Maximize the variable $a$ subject to a number of inequalities."); item("Use the simplex method to solve the resulting linear programming problem."); if(long) { title("Sizing"); item("Every addition of a coordinate $(t,u)$ adds two restrictions"); equation("au+t+b\ge 0,"); equation("au+t+b\le S,"); remark("and each drawing component adds two coordinates."); item("A figure could easily produce thousands of restrictions, making the simplex method impractical."); item("Most of these restrictions are redundant, however. For instance, with concentric circles, only the largest circle needs to be accounted for."); asyfigure(asywrite(" import palette; size(160,0); pen[] p=Rainbow(NColors=11); for(int i=1; i<10; ++i) { draw(scale(i)*unitcircle, p[i]+linewidth(2)); } ")); title("Redundant Restrictions"); item("In general, if $u\le u'$ and $t\le t'$ then"); equation("au+t+b\le au'+t'+b"); remark("for all choices of $a>0$ and $b$, so"); equation("0\le au+t+b\le au'+t'+b\le S."); item("This defines a partial ordering on coordinates. When sizing a picture, the program first computes which coordinates are maximal (or minimal) and only sends effective constraints to the simplex algorithm."); item("In practice, the linear programming problem will have less than a dozen restraints."); item("All picture sizing is implemented in Asymptote code."); } title("Infinite Lines"); item("Deferred drawing allows us to draw infinite lines."); code("drawline(P, Q);"); asyfigure("elliptic","height=12cm"); title("Helpful Math Notation"); item("Integer division returns a {\tt real}. Use {\tt quotient} for an integer result:"); code("3/4 == 0.75 quotient(3,4) == 0"); item("Caret for real and integer exponentiation:"); code("2^3 2.7^3 2.7^3.2"); item("Many expressions can be implicitly scaled by a numeric constant:"); code("2pi 10cm 2x^2 3sin(x) 2(a+b)"); item("Pairs are complex numbers:"); code("(0,1)*(0,1) == (-1,0)"); title("Function Calls"); item("Functions can take default arguments in any position. Arguments are matched to the first possible location:"); string unitsize="unitsize(0.65cm);"; string preamble="void drawEllipse(real xsize=1, real ysize=xsize, pen p=blue) { draw(xscale(xsize)*yscale(ysize)*unitcircle, p); } "; asycode(preamble=unitsize,preamble+" drawEllipse(2); drawEllipse(red); "); item("Arguments can be given by name:"); asycode(preamble=unitsize+preamble," drawEllipse(xsize=2, ysize=1); drawEllipse(ysize=2, xsize=3, green); "); if(long) { title("Rest Arguments"); item("Rest arguments allow one to write a function that takes an arbitrary number of arguments:"); code(" int sum(... int[] nums) { int total=0; for(int i=0; i < nums.length; ++i) total += nums[i]; return total; } sum(1,2,3,4); // returns 10 sum(); // returns 0 sum(1,2,3 ... new int[] {4,5,6}); // returns 21 int subtract(int start ... int[] subs) { return start - sum(... subs); } "); } title("High-Order Functions"); item("Functions are first-class values. They can be passed to other functions:"); code("import graph; real f(real x) { return x*sin(10x); } draw(graph(f,-3,3,300),red);"); asyfigure(asywrite(" import graph; size(300,0); real f(real x) { return x*sin(10x); } draw(graph(f,-3,3,300),red); ")); if(long) { title("Higher-Order Functions"); item("Functions can return functions:"); equation("f_n(x)=n\sin\left(\frac{x}{n}\right)."); skip(); string preamble=" import graph; size(300,0); "; string graphfunc2=" typedef real func(real); func f(int n) { real fn(real x) { return n*sin(x/n); } return fn; } func f1=f(1); real y=f1(pi); for(int i=1; i<=5; ++i) draw(graph(f(i),-10,10),red); "; code(graphfunc2); string name=asywrite(graphfunc2,preamble=preamble); asy(nativeformat(),name+".asy"); label(graphic(name+"."+nativeformat()),(0.5,0), Fill(figureborder,figuremattpen)); title("Anonymous Functions"); item("Create new functions with {\tt new}:"); code(" path p=graph(new real (real x) { return x*sin(10x); },-3,3,red); func f(int n) { return new real (real x) { return n*sin(x/n); }; }"); item("Function definitions are just syntactic sugar for assigning function objects to variables."); code(" real square(real x) { return x^2; } "); remark("is equivalent to"); code(" real square(real x); square=new real (real x) { return x^2; }; "); title("Structures"); item("As in other languages, structures group together data."); code(" struct Person { string firstname, lastname; int age; } Person bob=new Person; bob.firstname=\"Bob\"; bob.lastname=\"Chesterton\"; bob.age=24; "); item("Any code in the structure body will be executed every time a new structure is allocated..."); code(" struct Person { write(\"Making a person.\"); string firstname, lastname; int age=18; } Person eve=new Person; // Writes \"Making a person.\" write(eve.age); // Writes 18. "); title("Modules"); item("Function and structure definitions can be grouped into modules:"); code(" // powers.asy real square(real x) { return x^2; } real cube(real x) { return x^3; } "); remark("and imported:"); code(" import powers; real eight=cube(2.0); draw(graph(powers.square, -1, 1)); "); } title("Object-Oriented Programming"); item("Functions are defined for each instance of a structure."); code(" struct Quadratic { real a,b,c; real discriminant() { return b^2-4*a*c; } real eval(real x) { return a*x^2 + b*x + c; } } "); item("This allows us to construct ``methods'' which are just normal functions declared in the environment of a particular object:"); code(" Quadratic poly=new Quadratic; poly.a=-1; poly.b=1; poly.c=2; real f(real x)=poly.eval; real y=f(2); draw(graph(poly.eval, -5, 5)); "); title("Specialization"); item("Can create specialized objects just by redefining methods:"); code(" struct Shape { void draw(); real area(); } Shape rectangle(real w, real h) { Shape s=new Shape; s.draw = new void () { fill((0,0)--(w,0)--(w,h)--(0,h)--cycle); }; s.area = new real () { return w*h; }; return s; } Shape circle(real radius) { Shape s=new Shape; s.draw = new void () { fill(scale(radius)*unitcircle); }; s.area = new real () { return pi*radius^2; } return s; } "); title("Overloading"); item("Consider the code:"); code(" int x1=2; int x2() { return 7; } int x3(int y) { return 2y; } write(x1+x2()); // Writes 9. write(x3(x1)+x2()); // Writes 11. "); title("Overloading"); item("{\tt x1}, {\tt x2}, and {\tt x3} are never used in the same context, so they can all be renamed {\tt x} without ambiguity:"); code(" int x=2; int x() { return 7; } int x(int y) { return 2y; } write(x+x()); // Writes 9. write(x(x)+x()); // Writes 11. "); item("Function definitions are just variable definitions, but variables are distinguished by their signatures to allow overloading."); title("Operators"); item("Operators are just syntactic sugar for functions, and can be addressed or defined as functions with the {\tt operator} keyword."); code(" int add(int x, int y)=operator +; write(add(2,3)); // Writes 5. // Don't try this at home. int operator +(int x, int y) { return add(2x,y); } write(2+3); // Writes 7. "); item("This allows operators to be defined for new types."); title("Operators"); item("Operators for constructing paths are also functions:"); code("a.. controls b and c .. d--e"); remark("is equivalent to"); code( "operator --(operator ..(a, operator controls(b,c), d), e)"); item("This allowed us to redefine all of the path operators for 3D paths."); title("Summary"); item("Asymptote:"); subitem("uses IEEE floating point numerics;"); subitem("uses C++/Java-like syntax;"); subitem("supports deferred drawing for automatic picture sizing;"); subitem("supports Grayscale, RGB, CMYK, and HSV colour spaces;"); subitem("supports PostScript shading, pattern fills, and function shading;"); subitem("can fill nonsimply connected regions;"); subitem("generalizes MetaPost path construction algorithms to 3D;"); subitem("lifts \TeX\ to 3D;"); subitem("supports 3D billboard labels and PDF grouping."); bibliography("../examples/refs"); viewportmargin=(2,2); viewportsize=0; defaultpen(0.5); title("\mbox{Asymptote: 2D \& 3D Vector Graphics Language}"); asyinclude("../examples/logo3"); skip(); center("\tt https://asymptote.sourceforge.io"); center("(freely available under the LGPL license)"); // LocalWords: pdflatex mflogo viewportsize pagewidth pagemargin goysr bibtex // LocalWords: itempen defaultrender medskip Orest Shardt Vidiassov MF ezier // LocalWords: Hammerlindl MetaPost PDF hfill LGPL pdf asywrite zoombox LaTeX // LocalWords: asyfilecode PostScript asycode unitsquare beziercurve grey bw // LocalWords: lightgrey zerowinding evenodd sw unitsize drawEllipse nums fn // LocalWords: frac graphfunc func nativeformat figureborder figuremattpen bt // LocalWords: firstname lastname eval eetomumu binarytree filecode datagraph // LocalWords: lineargraph filegraph loggraph secondaryaxis imagecontour ij // LocalWords: tridiagonal Hobbydir nonumber Hobbycontrol th viewportmargin // LocalWords: asyinclude dotpen wheelpoint yequals xaxis yaxis cardsize mc // LocalWords: polargraph filldraw addPoint lightblue truesize le au NColors // LocalWords: drawline unityroot mult oct intang IEEE numerics HSV colour // LocalWords: nonsimply asymptote-3.05/doc/square.asy0000644000000000000000000000006415031566105014751 0ustar rootrootsize(3cm); draw((0,0)--(1,0)--(1,1)--(0,1)--cycle); asymptote-3.05/doc/filegraph.dat0000644000000000000000000000003215031566105015361 0ustar rootroot# x y 50 0 100 0.5 125 2 asymptote-3.05/doc/Hobbycontrol.asy0000644000000000000000000000101115031566105016106 0ustar rootrootsize(200); pair z0=(0,0); pair z1=(0.5,3); pair z2=(2,1); path g=z0..z1..z2; pair d0=dir(g,0); pair d1=dir(g,1); draw(Label("$\omega_0$",1),z0-d0..z0+d0,blue+dashed,Arrow); draw(Label("$\omega_1$",1),z1-d1..z1+1.5d1,blue+dashed,Arrow); draw(z0--interp(z0,z1,1.5),dashed); draw(subpath(g,0,1),blue); draw("$\theta$",arc(z0,0.4,degrees(z1-z0),degrees(d0)),red,Arrow, EndPenMargin); draw("$\phi$",arc(z1,1.05,degrees(z1-z0),degrees(d1)),red,Arrow, EndPenMargin); dot("$z_0$",z0,SW,red); dot("$z_1$",z1,SE,red); asymptote-3.05/doc/mexicanhat.asy0000644000000000000000000000044015031566105015570 0ustar rootrootsize(200); real mexican(real x) {return (1-8x^2)*exp(-(4x^2));} int n=30; real a=1.5; real width=2a/n; guide hat; path solved; for(int i=0; i < n; ++i) { real t=-a+i*width; pair z=(t,mexican(t)); hat=hat..z; solved=solved..z; } draw(hat); dot(hat,red); draw(solved,dashed); asymptote-3.05/doc/externalprc.tex0000644000000000000000000000052715031566105016010 0ustar rootroot% Generate inline PRC images for latex with % asy -inlineimage cube -render=4 % % Generate inline PRC images for pdflatex with % asy -inlineimage cube -render=4 -tex pdflatex % \documentclass[12pt]{article} \input cube.pre \usepackage[bigfiles]{media9} \RequirePackage{asymptote,color,graphicx} \begin{document} \input cube.tex \end{document} asymptote-3.05/doc/flow.asy0000644000000000000000000000113415031566105014417 0ustar rootrootimport graph; defaultpen(1.0); size(0,150,IgnoreAspect); real arrowsize=4mm; real arrowlength=2arrowsize; typedef path vector(real); // Return a vector interpolated linearly between a and b. vector vector(pair a, pair b) { return new path(real x) { return (0,0)--arrowlength*interp(a,b,x); }; } real f(real x) {return 1/x;} real epsilon=0.5; path g=graph(f,epsilon,1/epsilon); int n=3; draw(g); xaxis("$x$"); yaxis("$y$"); add(vectorfield(vector(W,W),g,n,true)); add(vectorfield(vector(NE,NW),(0,0)--(point(E).x,0),n,true)); add(vectorfield(vector(NE,NE),(0,0)--(0,point(N).y),n,true)); asymptote-3.05/doc/TeXShopAndAsymptote.tex0000644000000000000000000000513515031566105017344 0ustar rootroot\documentclass[11pt]{article} \usepackage{geometry} \geometry{letterpaper} \usepackage[parfill]{parskip} \usepackage{graphicx} \usepackage{amssymb} \title{Integrating Asymptote and TeXShop for Mac OS X} \author{Vishaal Rajani \& Cole Zmurchok \\ University of Alberta} \date{\today} \begin{document} \maketitle \begin{enumerate} \item Download Asymptote and place the \emph{asymptote-x.xx.src.tgz} file on the desktop. \item Open Terminal and type the following. Note that you will have to enter the root password for the final command. \begin{verbatim} cd Desktop gunzip asymptote-x.xx.src.tgz tar -xf asymptote-x.xx.src.tar cd asymptote-x.xx ./configure make all sudo make install \end{verbatim} If you get an error at the \verb+./configure+ step, stating that you there is \verb+no acceptable C+ \verb+compiler found in $PATH+, a solution is to download and install Xcode here: \\ \verb+http://developer.apple.com/TOOLS/Xcode/+. \item We now create the engine that will typeset Asymptote in TeXShop. The easiest way to create this engine, which we will call \emph{asyEngine.engine}, is to navigate to \verb+~/Library/TeXShop/Engines+ and duplicate one of the existing \emph{.engine} files. Open the duplicate file and delete the code there. Type the following: \begin{verbatim} #!/bin/sh location=$(dirname "$1") basename="${1%.tex}" #process cd $location pdflatex "$1" asy "${basename}"-*.asy pdflatex "$1" \end{verbatim} Save this file as \emph{asyEngine.engine}. \item Now we set our engine to be executable. In the terminal, navigate to the Engines directory and type: \begin{verbatim} chmod +x asyEngine.engine \end{verbatim} \item Finally, in the terminal, type: \begin{verbatim} defaults write TeXShop OtherTeXExtensions -array-add "asy" \end{verbatim} This last command allows you choose the \emph{asyEngine} option from the drop-down menu when you wish to typeset a document that includes asymptote. \end{enumerate} Now, if you wish to typeset something simple, like the following red line, create a new document in TeXShop and type: \begin{verbatim} \documentclass[letterpaper,12pt]{article} \usepackage{amsmath} \usepackage{amssymb} \usepackage{asymptote} \begin{document} \begin{asy} size(300); draw((0,0)--(1,1),red); \end{asy} \end{document} \end{verbatim} Choose the \emph{asyEngine} option from the drop-down menu and press \emph{Typeset}. Your red line will be created in a PDF Document. On a final note, it is best to avoid using filenames with spaces in them. For example, avoid filenames such as \verb+asy test.tex+ and instead use filenames without spaces, such as \verb+asyTest.tex+. \end{document} asymptote-3.05/doc/build-asymptote-pdf-win.py0000644000000000000000000000111015031566105017762 0ustar rootroot#!/usr/bin/env python3 import argparse import os import subprocess def parse_args(): parser = argparse.ArgumentParser() parser.add_argument("--texify-loc", required=True) parser.add_argument("--texindex-loc", required=True) parser.add_argument("--texi-file", required=True) return parser.parse_args() def main(): args = parse_args() env = os.environ.copy() env["TEXINDEX"] = args.texindex_loc subprocess.run( [args.texify_loc, "--pdf", args.texi_file], env=env, check=True, ) if __name__ == "__main__": main() asymptote-3.05/doc/generalaxis.asy0000644000000000000000000000042515031566105015754 0ustar rootrootimport graph; size(0,100); path g=ellipse((0,0),1,2); scale(true); axis(Label("C",align=10W),g,LeftTicks(endlabel=false,8,end=false), ticklocate(0,360,new real(real v) { path h=(0,0)--max(abs(max(g)),abs(min(g)))*dir(v); return intersect(g,h)[0];})); asymptote-3.05/doc/penimage.asy0000644000000000000000000000033315031566105015235 0ustar rootrootsize(200); import palette; int n=256; real ninv=2pi/n; pen[][] v=new pen[n][n]; for(int i=0; i < n; ++i) for(int j=0; j < n; ++j) v[i][j]=rgb(0.5*(1+sin(i*ninv)),0.5*(1+cos(j*ninv)),0); image(v,(0,0),(1,1)); asymptote-3.05/doc/graphmarkers.asy0000644000000000000000000000136215031566105016141 0ustar rootrootimport graph; size(200,100,IgnoreAspect); markroutine marks() { return new void(picture pic=currentpicture, frame f, path g) { path p=scale(1mm)*unitcircle; for(int i=0; i <= length(g); ++i) { pair z=point(g,i); frame f; if(i % 4 == 0) { fill(f,p); add(pic,f,z); } else { if(z.y > 50) { pic.add(new void(frame F, transform t) { path q=shift(t*z)*p; unfill(F,q); draw(F,q); }); } else { draw(f,p); add(pic,f,z); } } } }; } pair[] f={(5,5),(40,20),(55,51),(90,30)}; draw(graph(f),marker(marks())); scale(true); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); asymptote-3.05/doc/leastsquares.dat0000644000000000000000000001425615031566105016151 0ustar rootroot1 3825 2 4057 3 4217 4 4278 5 4353 6 4483 7 4410 8 4462 9 4626 10 4511 11 4531 12 4450 13 4354 14 4402 15 4489 16 4441 17 4366 18 4443 19 4442 20 4335 21 4292 22 4458 23 4444 24 4426 25 4310 26 4264 27 4263 28 4252 29 4330 30 4304 31 4242 32 4272 33 4284 34 4198 35 4242 36 4096 37 4142 38 4248 39 4186 40 4210 41 4125 42 4134 43 4098 44 4129 45 3960 46 4012 47 4079 48 4038 49 4024 50 3949 51 3996 52 3970 53 4031 54 3895 55 3806 56 3825 57 3850 58 3742 59 3678 60 3589 61 3648 62 3476 63 3490 64 3353 65 3270 66 3134 67 3018 68 2922 69 2801 70 2691 71 2528 72 2460 73 2254 74 2105 75 2009 76 1854 77 1677 78 1562 79 1501 80 1399 81 1244 82 1160 83 1080 84 963 85 879 86 797 87 745 88 701 89 634 90 554 91 532 92 549 93 521 94 466 95 460 96 435 97 412 98 376 99 367 100 350 101 360 102 321 103 302 104 291 105 273 106 261 107 255 108 231 109 245 110 252 111 236 112 227 113 207 114 196 115 199 116 211 117 232 118 220 119 214 120 229 121 213 122 208 123 196 124 218 125 196 126 192 127 178 128 177 129 178 130 179 131 170 132 173 133 170 134 150 135 144 136 149 137 145 138 145 139 139 140 147 141 140 142 128 143 133 144 156 145 136 146 164 147 152 148 140 149 141 150 112 151 108 152 110 153 133 154 118 155 113 156 113 157 108 158 88 159 109 160 97 161 99 162 94 163 97 164 104 165 105 166 118 167 108 168 130 169 126 170 114 171 112 172 107 173 96 174 96 175 102 176 85 177 89 178 93 179 96 180 101 181 82 182 97 183 96 184 94 185 97 186 85 187 79 188 72 189 75 190 63 191 65 192 62 193 54 194 53 195 49 196 55 197 48 198 53 199 46 200 50 201 48 202 50 203 51 204 50 205 49 206 46 207 47 208 44 209 42 210 47 211 45 212 44 213 46 214 43 215 40 216 42 217 41 218 40 219 43 220 41 221 42 222 43 223 40 224 42 225 39 226 41 227 42 228 44 229 40 230 40 231 35 232 38 233 37 234 36 235 34 236 34 237 34 238 36 239 36 240 36 241 37 242 37 243 37 244 36 245 36 246 45 247 43 248 43 249 43 250 49 251 58 252 48 253 50 254 56 255 51 256 50 257 55 258 64 259 55 260 49 261 36 262 36 263 40 264 49 265 37 266 35 267 35 268 33 269 33 270 39 271 35 272 34 273 36 274 32 275 37 276 31 277 31 278 32 279 30 280 32 281 29 282 31 283 30 284 30 285 28 286 27 287 26 288 24 289 25 290 28 291 30 292 29 293 27 294 27 295 27 296 26 297 26 298 28 299 27 300 24 301 22 302 27 303 26 304 25 305 25 306 25 307 26 308 28 309 26 310 25 311 24 312 26 313 25 314 23 315 25 316 24 317 23 318 23 319 24 320 23 321 24 322 22 323 24 324 24 325 24 326 23 327 25 328 24 329 22 330 22 331 23 332 23 333 23 334 21 335 19 336 20 337 22 338 26 339 25 340 24 341 22 342 22 343 23 344 23 345 23 346 20 347 21 348 20 349 21 350 25 351 22 352 22 353 21 354 24 355 24 356 22 357 23 358 26 359 24 360 23 361 22 362 26 363 30 364 27 365 25 366 26 367 26 368 25 369 24 370 24 371 22 372 21 373 20 374 20 375 19 376 20 377 21 378 20 379 20 380 19 381 19 382 19 383 19 384 20 385 20 386 19 387 20 388 20 389 20 390 17 391 18 392 16 393 18 394 32 395 31 396 47 397 57 398 64 399 34 400 42 401 40 402 41 403 35 404 26 405 25 406 25 407 36 408 42 409 55 410 75 411 94 412 87 413 97 414 95 415 101 416 70 417 66 418 66 419 73 420 77 421 89 422 79 423 63 424 66 425 71 426 70 427 49 428 46 429 46 430 43 431 49 432 48 433 44 434 36 435 33 436 28 437 29 438 32 439 31 440 29 441 28 442 29 443 31 444 31 445 33 446 33 447 39 448 44 449 37 450 58 451 64 452 38 453 31 454 36 455 33 456 29 457 34 458 28 459 27 460 23 461 31 462 26 463 21 464 23 465 26 466 21 467 21 468 24 469 24 470 24 471 24 472 26 473 23 474 26 475 20 476 21 477 25 478 21 479 22 480 22 481 23 482 22 483 23 484 22 485 20 486 22 487 20 488 22 489 20 490 24 491 20 492 22 493 19 494 19 495 20 496 19 497 18 498 18 499 17 500 16 501 16 502 17 503 17 504 16 505 17 506 16 507 16 508 16 509 17 510 18 511 17 512 16 513 17 514 16 515 16 516 16 517 17 518 16 519 16 520 16 521 16 522 16 523 16 524 16 525 16 526 16 527 17 528 17 529 18 530 17 531 16 532 15 533 15 534 15 535 15 536 16 537 17 538 16 539 18 540 17 541 17 542 15 543 15 544 15 545 16 546 15 547 15 548 15 549 15 550 15 551 14 552 14 553 14 554 14 555 14 556 14 557 14 558 15 559 14 560 16 561 15 562 16 563 17 564 15 565 14 566 17 567 18 568 17 569 16 570 17 571 14 572 15 573 15 574 15 575 14 576 15 577 14 578 14 579 13 580 13 581 13 582 13 583 13 584 12 585 12 586 13 587 12 588 12 589 12 590 13 591 15 592 16 593 14 594 13 595 14 596 13 597 13 598 13 599 13 600 14 601 13 602 13 603 13 604 14 605 15 606 15 607 15 608 15 609 15 610 15 611 15 612 15 613 15 614 15 615 15 616 14 617 14 618 14 619 14 620 14 621 14 622 14 623 15 624 15 625 15 626 14 627 15 628 14 629 14 630 14 631 14 632 14 633 14 634 13 635 13 636 13 637 13 638 13 639 13 640 13 641 13 642 13 643 13 644 13 645 13 646 13 647 13 648 13 649 13 650 13 651 13 652 13 653 13 654 13 655 13 656 13 657 13 658 13 659 13 660 13 661 13 662 13 663 13 664 13 665 13 666 13 667 13 668 13 669 13 670 13 671 13 672 13 673 13 674 13 675 13 676 13 677 13 678 13 679 12 680 12 681 13 682 13 683 13 684 13 685 12 686 12 687 13 688 13 689 13 690 13 691 13 692 13 693 13 694 13 695 13 696 13 697 13 698 13 699 13 700 13 701 13 702 13 703 13 704 13 705 13 706 13 707 13 708 13 709 13 710 13 711 13 712 13 713 13 714 13 715 13 716 13 717 13 718 13 719 13 720 13 721 13 722 13 723 13 724 13 725 13 726 13 727 13 728 13 729 13 730 13 731 13 732 13 733 13 734 13 735 13 736 13 737 13 738 13 739 13 740 13 741 13 742 13 743 13 744 13 745 13 746 13 747 13 748 13 749 13 750 13 751 13 752 13 753 13 754 13 755 12 756 12 757 12 758 12 759 11 760 12 761 11 762 12 763 11 764 12 765 12 766 12 767 12 768 14 769 14 770 14 771 14 772 12 773 12 774 12 775 13 776 13 777 13 778 12 779 13 780 13 781 13 782 13 783 13 784 13 785 12 786 11 787 11 788 11 789 12 790 13 791 13 792 13 793 12 794 13 795 13 796 13 797 13 798 13 799 12 800 12 801 12 802 12 803 12 804 12 805 11 806 11 807 11 808 12 809 13 810 13 811 12 812 12 813 12 814 12 815 12 816 12 817 12 818 12 819 12 820 13 821 13 822 13 823 13 824 12 825 13 826 12 827 13 828 13 829 13 830 13 831 12 832 12 833 12 834 13 835 13 836 12 837 9 838 9 839 10 840 10 841 11 842 11 843 11 844 12 845 12 846 11 847 12 848 12 849 12 850 12 851 12 852 12 853 12 854 12 855 12 856 11 857 10 858 11 859 12 860 11 861 11 862 11 863 10 864 10 865 10 866 11 867 10 868 10 869 10 870 11 871 11 872 12 873 12 874 12 875 12 876 12 877 12 878 12 879 12 880 12 881 0 882 0 asymptote-3.05/doc/FAQ/0000755000000000000000000000000015031567000013335 5ustar rootrootasymptote-3.05/doc/FAQ/m-post.pl0000644000000000000000000001074215031566105015122 0ustar rootroot## POST output # Copyright (C) 1993-1995 Ian Jackson. # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # It is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with GNU Emacs; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # (Note: I do not consider works produced using these BFNN processing # tools to be derivative works of the tools, so they are NOT covered # by the GPL. However, I would appreciate it if you credited me if # appropriate in any documents you format using BFNN.) sub post_init { open(POST,">$prefix.post"); } sub post_startmajorheading { print POST '='x79,"\n\n"; $post_status= 'h'; &post_text($_[0] ? "Section $_[0]. " : ''); } sub post_startminorheading { print POST '-'x77,"\n\n"; $post_status= 'h'; } sub post_italic { &post_text('*'); } sub post_enditalic { $post_para .= '*'; } sub post_email { &post_text('<'); } sub post_endemail { &post_text('>'); } sub post_ftpon { } sub post_endftpon { } sub post_ftpin { } sub post_endftpin { } sub post_docref { } sub post_enddocref { } sub post_courier { } sub post_endcourier { } sub post_newsgroup { } sub post_endnewsgroup { } sub post_ftpsilent { $post_ignore++; } sub post_endftpsilent { $post_ignore--; } sub post_text { return if $post_ignore; if ($post_status eq '') { $post_status= 'p'; } $post_para .= $_[0]; } sub post_tab { local ($n) = $_[0]-length($post_para); $post_para .= ' 'x$n if $n>0; } sub post_newline { return unless $post_status eq 'p'; &post_writepara; } sub post_writepara { local ($thisline, $thisword, $rest); for (;;) { last unless $post_para =~ m/\S/; $thisline= $post_indentstring; for (;;) { last unless $post_para =~ m/^(\s*\S+)/; unless (length($1) + length($thisline) < 75 || length($thisline) == length($post_indentstring)) { last; } $thisline .= $1; $post_para= $'; } $post_para =~ s/^\s*//; print POST $thisline,"\n"; $post_indentstring= $post_nextindent; last unless length($post_para); } $post_status= ''; $post_para= ''; } sub post_endpara { return unless $post_status eq 'p'; &post_writepara; print POST "\n"; } sub post_endheading { $post_para =~ s/\s*$//; print POST "$post_para\n\n"; $post_status= ''; $post_para= ''; } sub post_endmajorheading { &post_endheading(@_); } sub post_endminorheading { &post_endheading(@_); } sub post_startverbatim { $post_vstatus= $post_status; &post_writepara; } sub post_verbatim { print POST $_[0],"\n"; } sub post_endverbatim { $post_status= $post_vstatus; } sub post_finish { close(POST); } sub post_startindex { $post_status= ''; } sub post_endindex { $post_status= 'p'; } sub post_endindexitem { printf POST " %-11s %-.66s\n",$post_left,$post_para; $post_status= 'p'; $post_para= ''; } sub post_startindexitem { $post_left= $_[1]; } sub post_startindexmainitem { $post_left= $_[1]; print POST "\n" if $post_status eq 'p'; } sub post_startindent { $post_istatus= $post_status; &post_writepara; $post_indentstring= " $post_indentstring"; $post_nextindent= " $post_nextindent"; } sub post_endindent { $post_indentstring =~ s/^ //; $post_nextindent =~ s/^ //; $post_status= $post_istatus; } sub post_startpackedlist { $post_plc=0; } sub post_endpackedlist { &post_newline if !$post_plc; } sub post_packeditem { &post_newline if !$post_plc; &post_tab($post_plc*40+5); $post_plc= !$post_plc; } sub post_startlist { &post_endpara; $post_indentstring= " $post_indentstring"; $post_nextindent= " $post_nextindent"; } sub post_endlist { &post_endpara; $post_indentstring =~ s/^ //; $post_nextindent =~ s/^ //; } sub post_item { &post_newline; $post_indentstring =~ s/ $/* /; } sub post_pageref { &post_text("Q$_[1] \`"); } sub post_endpageref { &post_text("'"); } 1; asymptote-3.05/doc/FAQ/asy-faq.bfnn0000644000000000000000000011770315031566105015561 0ustar rootroot\comment This is the source for the Asymptote FAQ list, in \comment the Bizarre Format With No Name. It is turned into Lout \comment input, HTML, plain ASCII and an Info document by a Perl script. \comment \comment The format and scripts come from the Linux FAQ, by \comment Ian Jackson. \set brieftitle Asymptote FAQ \set author Asymptote \set title Asymptote Frequently Asked Questions \copyto ASCII ASYMPTOTE FREQUENTLY ASKED QUESTIONS `%perl use POSIX; POSIX::strftime("%Y-%m-%d", gmtime($ENV{SOURCE_DATE_EPOCH} || time))` \endcopy \copyto INFO INFO-DIR-SECTION Languages START-INFO-DIR-ENTRY * asymptote FAQ: (asy-faq). Asymptote Frequently Asked Questions. END-INFO-DIR-ENTRY  File: asy-faq.info, Node: Top, Next: Question 1.1, Up: (dir) ASYMPTOTE FREQUENTLY ASKED QUESTIONS `%perl use POSIX; POSIX::strftime("%Y-%m-%d", gmtime($ENV{SOURCE_DATE_EPOCH} || time))` \endcopy This is the list of Frequently Asked Questions about Asymptote (asy). \section Index \index \comment ###################################################################### \section About Asymptote \question 26jun:whatisasy What is Asymptote? Asymptote is a vector graphics language designed for technical graphics, inspired by MetaPost but with IEEE floating-point numerics, native three-dimensional graphics, Grayscale/RGB/CMYK colourspaces, and a C++-like syntax. Unlike MetaPost, it natively supports multiple-segment paths (and hence regions other than simply connected ones), tiling patterns, Gouraud shading, tensor patch shading, and PostScript images. \question 22jun:whereisasy How do I obtain Asymptote? Binary releases are available for Linux, MacOS X, and Microsoft Windows platforms, in addition to full source code, from the website \docref{https://asymptote.sourceforge.io/\}. Many Linux distributions (such as RedHat and Debian) now include an Asymptote package (check your distribution's documentation for further information about this). \question 28jun:beforeasking Where can I ask questions about Asymptote? If you have a question, please try to find an answer in this FAQ, in the extensive Asymptote documentation at \docref{https://asymptote.sourceforge.io/doc/\}, or search the forum: \docref{http://sourceforge.net/forum/forum.php?forum_id=409349\}. \question 02sep:whyasy Why was the name Asymptote chosen? Well, it isn't the perfect graphics package, but we do think it is getting there asymptotically... \question 02sep:whycamp In the internal Asymptote source code, what does the name \courier{camp\} refer to? That was our original tentative name for this project, which stood for "C's Answer to MetaPost" (the language that inspired Asymptote). However, we eventually decided that the name \courier{Asymptote\} better emphasizes the mathematical and graphical nature of this language. \comment ###################################################################### \section Questions about installation and setup \question 26jun:osx Is it possible to install Asymptote on Mac OS X? It is easy to compile Asymptote directly from the source code at \docref{http://sourceforge.net/project/showfiles.php?group_id=120000\} We recommend first upgrading to the latest GNU readline library, unless you don't care about interactive readline support (in which case configure will automatically detect and disable obsolete versions of the readline library). Marius Schamschula also maintains a binary package for various MacOS X platforms \docref{http://www.hmug.org/pub/MacOS_X/X/Applications/Publishing/asymptote\}. \question 26jun:osxbadCPU Why do I get the error \courier{Bad CPU type in executable\} on installing Asymptote from the MAC OS binary? This means either that you have a binary distribution for another MAC architecture, or (according to Marius Schamschula) that you may have a missing library. The simplest solution is to compile Asymptote directly from the official source: \docref{http://sourceforge.net/project/showfiles.php?group_id=120000\}. \question 04nov:brokenpdftex What do I do if I get the error: \courier{Error: pdfetex (file pdftex.cfg): cannot open config file...texinfo.tex appears to be broken\}? Simply put \docref{https://asymptote.sourceforge.io/asymptote.pdf\} in the directory \courier{doc\} and repeat the command \courier{make all\}. Or, if you don't want to build a local copy of the documentation, simply proceed with \courier{make install-asy\}. \question 04nov:brokentexinfo What do I do if I get the error: \courier{! Undefined control sequence. l.6 @copying\}? Either upgrade your \courier{texinfo\} package or follow one of the easy work arounds in \qref brokenpdftex. \question 27jun:latexintegration Is it possible to integrate Asymptote into LaTeX? Yes, see the example latexusage.tex. Dario Teixeira has also written a detailed guide on the topic. You can download it from \docref{http://dario.dse.nl/projects/asylatex/\}. Philippe Ivaldi has contributed an Asymptote mode for Emacs users \docref{https://asymptote.sourceforge.io/doc/Editing-modes.html\}, which includes a \courier{lasy-mode\} that allows one to compile and view the output of one \\begin{asy}...\\end{asy} section at a time. \question 02sep:pdflatex Is it possible to integrate Asymptote into latex or pdflatex? Yes, as of version 1.14, Asymptote supports latex and pdflatex (both in EPS/PDF and inline mode), as illustrated by the example \courier{latexusage.tex\}: \verbatim pdflatex latexusage asy latexusage pdflatex latexusage \endverbatim \question 02sep:tkinterdepend Do I need the \courier{tkinter\} package to install an Asymptote rpm binary? No, you don't need \courier{tkinter\} unless you want to try out the GUI \courier{xasy\}. Try \verbatim rpm -Uvh --nodeps asymptote-x.xx-1.i386.rpm \endverbatim where \courier{x.xx\} represents the version number. \question 26jun:windir What does the path \courier{%USERPROFILE%\\.asy\\config.asy\} mean? That is the way that Microsoft Windows refers to the user profile directory. There's nothing really to understand here, just put your configuration commands in the file \courier{config.asy\} in a new folder \courier{%USERPROFILE%\\.asy\}. \question 25dec:escapechar Why do I get the error "string not terminated" when I try to set \courier{settings.dir="C:\\asymptote\\";\}? The backslash is an escape character here, so \courier{\\"\} is interpreted as a verbatim quotation mark, leaving the string without a terminating quotation mark. Fortunately, this is the only escaped character in double-quoted strings. A final backslash isn't needed here anyway, but should you really want one somewhere, you can say: \courier{settings.dir="C:\\asymptote"+'\\\\';\}. \question 27jun:winglobal How do I change environment variables in Microsoft Windows, for example, in order to change the default PostScript viewer? While it is easier to set the corresponding Asymptote configuration variable in your \courier{config.asy\} file, here is the procedure for changing Microsoft Windows environment variables: Click on the [Start] button * RIGHT-click on 'My Computer' * Choose 'Properties' from the popup menu * Click the 'Advanced' tab * Click the 'Environment Variables' button. \question 02sep:convert Under Microsoft Windows XP, why do I get an error like "Invalid Parameter - 432x432"? This means that ImageMagick wasn't properly installed and you are using the MSDOS convert program rather than the ImageMagick one. Or you may have installed ImageMagick but ran Asymptote from an existing MSDOS window. In that case, simply open a new window and try again. If that doesn't work, check that \verbatim convert --version \endverbatim returns something like \verbatim Version: ImageMagick 6.2.8 06/27/06 Q16 http://www.imagemagick.org \endverbatim \question 26jun:miktex Why does Asymptote freeze upon trying to draw a label with my MikTex installation under Microsoft Windows? Likely, this means that latex and dvips are not in your default path. Try adding the appropriate paths in your \courier{config.asy\} file, for example: \verbatim import settings; latex="C:\Program Files\MiKTeX 2.7\miktex\bin\latex.exe"; dvips="C:\Program Files\MiKTeX 2.7\miktex\bin\dvips.exe"; \endverbatim \comment ##################################################################### \section Questions about paths \question 02sep:tensionsyntax Why do I get a syntax error message when I specify an integer value for the path tension? What is happening here is that \verbatim draw((0,0)..tension 2..(0,50)..(100,100)); \endverbatim is read as \verbatim draw((0,0)..tension 2. .(0,50)..(100,100)); \endverbatim So the first . after the two is treated as a decimal point. Just put a space after the integer tension value: \verbatim draw((0,0)..tension 2 ..(0,50)..(100,100)); \endverbatim \question 27jun:dots Shouldn't dots always be the same size? From the documentation: "The dot command defined in the module plain draws a dot having a diameter equal to an explicit pen linewidth or the default linewidth magnified by dotfactor (6 by default)." Thus, when you use the default pen, the dot will have size 6*linewidth, but when you give a pen with an explicit width specified, you will have a dot of size linewidth. If you want the first case to behave like the second, you may set dotfactor=1. \comment ##################################################################### \section Questions about labels \question 02sep:greek How do I get Greek letters like omega to show up in my labels? In (La)TeX, Greek letters can be obtained in math mode by prepending a backslash to the letter name. So for a omega symbol, use "$\\omega$". Everything between the dollar signs is considered to be a math formula. Uppercase Greek letters can be used by capitalizing the first letter of the name: \verbatim label("$\omega$",(0,0)); label("$\Omega$",(20,0)); \endverbatim \question 29jun:matlabels Can Asymptote use matrices as labels? Yes: \verbatim usepackage("amsmath"); label("$\begin{matrix} 1 & 2 \\\ 1 & 1 \end{matrix}$",(0,0)); \endverbatim \question 27jun:latexpackage How do I tell Asymptote to load a particular LaTeX package, like \courier{mathptmx\}? Put \verbatim usepackage("mathptmx"); \endverbatim at the beginning of your file. Note: to enable the Adobe Times Roman font for text, you will also need to say: \verbatim defaultpen(TimesRoman()); \endverbatim \question 28jun:internatfonts How can I use international fonts in Asymptote labels? See \docref{https://asymptote.sourceforge.io/doc/Pens.html\}. \question 10jul:Fourier How can I use Fourier fonts? \verbatim usepackage("fourier"); defaultpen(font("T1","fut\textfamilyextension","m","n")); \endverbatim \question 26jun:decsep Is there any way to change the default appearance of the decimal separator, using a comma instead of a dot? Just set your locale appropriately: \verbatim locale("it_IT"); usepackage("icomma"); label(format(0.5)); \endverbatim \question 02sep:rotatelabel How can I get a rotated label with the filled box rotated as well so that it fits the text? \verbatim frame f; label(f,"This is some text",white,Fill(blue)); add(rotate(65)*f); \endverbatim \question 02sep:rotatelabel3D How can I rotate labels in a 3D figure? You need to first project the triple to a pair like this: \verbatim import three; size(100,100); draw(rotate(90,project(Z))*"A",O--X); \endverbatim \question 02sep:fixedsize How can I draw some squares and circles of a fixed size and put a label in the middle of them? Fixed-size objects should be drawn on a separate picture and then added to currentpicture. Here is one way (see also \docref{https://asymptote.sourceforge.io/gallery/subpictures.asy\} and \docref{https://asymptote.sourceforge.io/gallery/mosquito.asy\}): \verbatim real u=2cm; picture square; draw(square,scale(u)*shift(-0.5,-0.5)*unitsquare); picture circle; draw(circle,scale(0.5u)*unitcircle); void add(picture pic=currentpicture, Label L, picture object, pair z) { add(pic,object,z); label(pic,L,z); } add("square",square,(0,0)); add("circle",circle,(5cm,0)); \endverbatim \question 27jun:colorssaturation The binary operator * can be used to scale the color of a pen by a real number. Does this scaling factor have to be less than 1? The scaling factor can be greater than 1. But keep in mind that the rgb color components saturate at 1. Try \verbatim write(cyan); write(0.8*cyan); write(1.5*cyan); \endverbatim and you will quickly see what is going on. To get a lighter cyan you can say white+cyan, which yields rgb(0.5,1,1). If you want something even lighter specify the rgb colors directly, for example, rgb(0.9,1,1). Alternatively, work in cmyk colour space, which is nicer in that it handles saturation separately from hue: 0.1*Cyan is light and 0.9*Cyan is dark. You can also say 0.1*cmyk(red). \question 05mar:commadecimalseparator Why is the space after the comma decimal separator in my locale so large? LaTeX is treating the comma as punctuation and not as a decimal separator. The solution is to load the \courier{icomma\} package near the beginning of your file: \verbatim usepackage("icomma"); \endverbatim \question 11mar:hyperref How can I prevent \courier{texpreamble("\\usepackage[pdftex]{hyperref}")\} from changing the page size? \verbatim texpreamble("\usepackage[pdftex,setpagesize=false]{hyperref}"); \endverbatim \comment ##################################################################### \section Questions about arrows \question 02sep:doublearrows How do I draw two arrows at arbitrary positions along a path? Assuming that at least one of the arrowheads is to be filled, you can do this: \verbatim size(200); path g = (0,0)..(1,3)..(3,0); draw(g,Arrow(Relative(0.9))); add(arrow(g,invisible,FillDraw(black),Relative(0.5))); add(arrow(reverse(g),invisible,FillDraw(white,black),Relative(0.9))); \endverbatim If both of the arrowheads are to be drawn with filltype NoFill, one will need to create a specialized version of the arrow routine in \courier{plain_arrows.asy\}: \verbatim void arrow(frame f, arrowhead arrowhead=DefaultHead, path g, pen p=currentpen, real size=0, real angle=arrowangle, filltype filltype=arrowhead.defaultfilltype, position position=EndPoint, bool forwards=true, margin margin=NoMargin, bool center=false); \endverbatim \question 02sep:reversearrow How do I reverse the direction of an arrowhead? Simply reverse the direction of the path. \verbatim path g=((0,0)--(5cm,0)); draw(reverse(g),Arrow(Relative(0.55))); \endverbatim \question 02sep:reversearrow How do I change the size of all arrows? To override the arrowsize you can give every Arrow drawing attribute a real size argument. If you want to do this globally, you can override the pen-dependent arrowsize function like this: \verbatim DefaultHead.size=new real(pen p=currentpen) {return 2mm;}; \endverbatim \question 26jun:arrowhead Can I create other arrowhead styles? Yes, you can build custom arrowheads like this (see the predefined arrowhead styles in \courier{plain_arrows.asy\} for further examples): \verbatim arrowhead DotHead; DotHead.head=new path(path g, position position=EndPoint, pen p=currentpen, real size=0, real angle=arrowangle) { if(size == 0) size=DotHead.size(p); bool relative=position.relative; real position=position.position.x; if(relative) position=reltime(g,position); path r=subpath(g,position,0); pair x=point(r,0); real t=arctime(r,size); pair y=point(r,t); return circle(0.5(x+y),0.5size); }; size(100); draw((0,0)..(1,1)..(2,0),Arrow(DotHead)); dot((2,0),red); \endverbatim If you submit your alternate arrowheads to the Forum or the Patch Tracking System, we'll consider including them in a future release. \comment ##################################################################### \section Questions about 2D graphs \question 02sep:axisticks How can I draw x axis ticks on the right side, with the tick labels on the left side (relative to the axis path)? \verbatim import graph; size(250,200,IgnoreAspect); draw(graph(exp,-1,1),red); xaxis("$x$",RightTicks(Label(align=left))); yaxis("$y$",RightTicks); \endverbatim \question 02sep:axislabel How can I reposition the x axis label to three-quarters along the axis length? \verbatim import graph; size(250,200,IgnoreAspect); draw(graph(exp,-1,1),red); xaxis(Label("$x$",0.75),LeftTicks); yaxis("$y$",RightTicks); \endverbatim \question 02sep:axislabeldown How can I move the x axis label down 10bp? \verbatim import graph; size(250,200,IgnoreAspect); draw(graph(exp,-1,1),red); xaxis(shift(0,-10)*"$x$",LeftTicks); yaxis("$y$",RightTicks); \endverbatim \question 02sep:threeaxispens Can I use different pens for the axis, the axis label, and the tick labels? Yes: \verbatim import graph; size(300,200,IgnoreAspect); xlimits(-50,50); ylimits(0,100); xaxis(Label("$x$",MidPoint,red),Bottom,blue,LeftTicks(green)); yaxis("$y$",Left,RightTicks); \endverbatim \question 02sep:axislabelfont How can I change the font type of the axes label? \verbatim import graph; size(300,200,IgnoreAspect); xlimits(-50,50); ylimits(0,100); xaxis("x",Bottom,Courier("m","n"),LeftTicks); yaxis("$y$",Left,RightTicks); \endverbatim \question 02sep:axisticklabelfont How can I change the font type of the tick labels on an axis? Tick labels are by default typeset in (TeX) math mode, so to use other fonts you need to override the default tick format: \verbatim import graph; size(300,200,IgnoreAspect); xlimits(-50,50); ylimits(0,100); xaxis("$x$",Bottom,LeftTicks("%.4g",Courier("m","n")+fontsize(12))); yaxis("$y$",Left,RightTicks); \endverbatim \question 26jun:overlappingticklabels How can I prevent axes tick labels from rendering on top of each other? Either: (i) give LeftTicks/RightTicks/Ticks the arguments beginlabel=false and/or endlabel=false; (ii) explicitly remove specific ticks and their labels (drawing them manually; see \docref{http://www.github.com/vectorgraphics/asymptote/base/graph.asy\} for the definition of NoZero): \verbatim import graph; size(10cm); real f(real x) {return x^2;} draw(graph(f,-2,2)); xaxis(Ticks(NoZero)); yaxis(Ticks(NoZero)); label("$0$",(0,0),SW); \endverbatim (iii) explicitly remove specific tick labels and draw them manually (see \docref{http://www.github.com/vectorgraphics/asymptote/base/graph.asy\} for the definition of NoZeroFormat): \verbatim import graph; size(10cm); real f(real x) {return x^2;} draw(graph(f,-2,2)); xaxis(Ticks(NoZeroFormat)); yaxis(Ticks(NoZeroFormat)); label("$0$",(0,0),SW); \endverbatim (iv) use the xasy GUI to move overlapping labels; (v) change the Label argument of LeftTicks, RightTicks, or Ticks to: \verbatim Label(currentpen+overwrite(Move)) \endverbatim Solution (v) will move labels that might otherwise overwrite a previous label. Other possible overwrite arguments are Allow (allows overlapping labels; the default), Suppress (an overlapping label will not be written at all), SuppressQuiet, and MoveQuiet. The last two achieve the same result as the non-quiet types, but will not notify you which labels are overlapping. See: \docref{https://asymptote.sourceforge.io/doc/Pens.html\}. In the case of a user-specified tick array, you can change which labels get suppressed/moved by changing the order of array entries. \question 04nov:fixedsizegraphs How do I make the plot region of a graph, ignoring labels and legends, have a fixed size? Either: i) Specify an explicit unitsize, which overrides any call to \courier{size\}: \verbatim unitsize(x=1cm,y=2cm); \endverbatim ii) Explicitly tell Asymptote to map the plot region to a specific size: \verbatim import graph; real[] x={0,1,2,3}; real[] y=x^2; draw(graph(x,y),red); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); size(5cm,5cm,point(SW),point(NE)); label("$f_\mathrm{T}$",point(N),2N); \endverbatim iii) Specify the points in user coordinates that should correspond to a given picture size: \verbatim import graph; size(250,200,IgnoreAspect); draw(graph(exp,-1,1),red); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); fixedscaling((-1.5,-0.5),(1.5,3.5)); \endverbatim In this example, the user coordinate \courier{(-1.5,-0.5)\} will end up being the lower left corner of the figure and \courier{(1.5,3.5)\} will be the upper right corner. You can use this option to ensure multiple figures have the same scaling and same resulting figure size (just ensure the two coordinates given to \courier{fixedscaling()\} leaves room for any labels). See also \docref{https://asymptote.sourceforge.io/doc/Frames-and-pictures.html\}. \question 26jun:graphlimits How can I plot a function f(x) within [0,1]x[0,2] without explicitly calculating the x values for which f(x) hits the boundary? Call \courier{limits\} with the \courier{Crop\} option before drawing the graph: \verbatim import graph; size(250,200,IgnoreAspect); draw(graph(exp,-1,1),red); limits((0,0),(1,2),Crop); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); \endverbatim See also \docref{https://asymptote.sourceforge.io/doc/graph.html\}. \question 26jun:custompalettes Is it possible to define customized palettes? Yes, you may generate your own pen[] array. For example: \verbatim int NColors=32768; pen[] MyPalette=new pen[NColors]; real step=1/(NColors-1.0); // Start at black: rgb(0,0,0) // End at yellow: rgb(1,1,0) for(int i=0; i < NColors; ++i) { real rgval=i*step; MyPalette[i]=rgb(rgval,rgval,0.0); } \endverbatim \question 26jun:factorial Is there an easy way to graph factorial functions nicely? The example below shows a continuous function and two methods for placing markers at integer values of x: \verbatim import graph; size(200,200,IgnoreAspect); real factorial(real t) {return gamma(t+1);} scale(Linear,Log); // Graph the factorial function. draw(graph(factorial,0,10)); // Method 1: Draw nodes, but hide line pair F(int t) {return (t,factorial(t));} // Graph of factorial function from 0 to 10 pair[] z=sequence(F,11); draw(graph(z),invisible,marker(scale(0.8mm)*unitcircle,blue,Fill)); // Method 2: Nongraphing routines require explicit scaling: pair dotloc(int t) {return Scale(F(t));} pair[] dotlocs=sequence(dotloc,11); dot(dotlocs); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); \endverbatim \question 26jun:length How do I indicate that a certain length should be exactly the size I prescribe with no rescaling, within a picture which has its own size? Here's an easy way to do this. \verbatim size(12cm,0); void distance(picture pic=currentpicture, pair A, pair B, Label L="", real n=0, pen p=currentpen) { real d=3mm; path g=A--B; transform T=shift(-n*d*unit(B-A)*I); pic.add(new void(frame f, transform t) { picture opic; path G=T*t*g; draw(opic,Label(L,Center,UnFill(1)),G,p,Arrows(NoFill),Bars,PenMargins); add(f,opic.fit()); }); pic.addBox(min(g),max(g),T*min(p),T*max(p)); } pair A=(0,0), B=(3,3); dot(A); dot(B); distance(A,B,"$\ell$",1); \endverbatim \question 26jun:log2 How can I make the y axis display base-2 logarithmic values? See the example \docref{https://asymptote.sourceforge.io/gallery/2D graphs/log2graph.asy\}. \question 27jun:align How can I align the x axes of two graphs on the same figure? An easy way to do this, if the axes to be aligned have the same scaling and size, is illustrated in the example \docref{https://asymptote.sourceforge.io/gallery/2D graphs/alignedaxis.asy\}. Here is a more general solution to the problem of aligning two arbitrary axes. One fits the second picture to a frame based on the horizontal scaling for the first picture: \verbatim import graph; real width=15cm; real aspect=0.3; picture pic1,pic2; size(pic1,width,aspect*width,IgnoreAspect); size(pic2,width,aspect*width,IgnoreAspect); scale(pic1,false); scale(pic2,false); real xmin1=6; real xmax1=9; real xmin2=8; real xmax2=16; real a1=1; real a2=0.001; real f1(real x) {return a1*sin(x/2*pi);} real f2(real x) {return a2*sin(x/4*pi);} draw(pic1,graph(pic1,f1,xmin1,xmax1)); draw(pic2,graph(pic2,f2,xmin2,xmax2)); xaxis(pic1,Bottom,LeftTicks()); yaxis(pic1,"$f_1(x)$",Left,RightTicks); xaxis(pic2,"$x$",Bottom,LeftTicks(Step=4)); yaxis(pic2,"$f_2(x)$",Left,RightTicks); yequals(pic1,0,Dotted); yequals(pic2,0,Dotted); pair min1=point(pic1,SW); pair max1=point(pic1,NE); pair min2=point(pic2,SW); pair max2=point(pic2,NE); real scale=(max1.x-min1.x)/(max2.x-min2.x); real shift=min1.x/scale-min2.x; transform t1=pic1.calculateTransform(); transform t2=pic2.calculateTransform(); transform T=xscale(scale*t1.xx)*yscale(t2.yy); add(pic1.fit()); real height=truepoint(N,user=false).y-truepoint(S,user=false).y; add(shift(0,-height)*(shift(shift)*pic2).fit(T)); \endverbatim \question 27jun:changeaxis How can I change the direction of the y-axis, such that negatives values are on the upper y-axis? Here is a simple example (see also the example \docref{https://asymptote.sourceforge.io/gallery/2D graphs/diatom.asy\} or the discussion of Linear(-1) in the documentation): \verbatim import graph; size(250,200,IgnoreAspect); scale(Linear,Linear(-1)); draw(graph(log,0.1,10),red); xaxis("$x$",LeftTicks); yaxis("$y$",RightTicks); \endverbatim \question 27jun:functioncolor How can I fill a path with a function that defines the color of each location? Use \courier{functionshade\} with a PDF tex engine, as illustrated by the example {functionshading.asy}. If you want to produce PostScript output, an approximate solution for now would be to superimpose a fine grid and specify colors to \courier{latticeshade\} that depend on position as a single pen[][] lattice. Alternatively, it may be more efficient to use \courier{tensorshade}. \question 27jun:nonexplicitfun Is there a way to draw a function that is not explicitly given, such as (y - 2)^2 = x - 1 ? Yes, use the parametric form \verbatim y=t x=(t-2)^2+1 \endverbatim See the example \docref{https://asymptote.sourceforge.io/gallery/2D graphs/parametricgraph.asy\}. \question 27jun:scalesecondaryaxis Is it possible to reverse or stretch an axis? The real scaling argument to Linear is used to stretch (or reverse) the axis. To see the effect of axis stretching, be sure not to specify IgnoreAspect in the picture size command. A secondary axis has the same length as the primary axis, so stretching cannot have any effect. But one can still reverse the axis, with Linear(-1). \question 02sep:emptymarkers Why can't I use the UnFill option to draw graphs with empty markers? UnFill won't work here because it only affects the local frame the markers are initially drawn on, before being added to currentpicture. Here is a way of achieving the desired effect (assuming a white background): \verbatim import graph; size(10cm,0); pair[] z={(0,0),(0.5,0.5),(1,1)}; path g=graph(z); draw(shift(0,.5)*g,marker(scale(5)*unitcircle,FillDraw(white))); xaxis(BottomTop,LeftTicks); yaxis(LeftRight,RightTicks); \endverbatim \question 02sep:paletterange How can I force several images to use the same palette range (e.g. the entire 0-255 grayscale range)? The palette color space corresponds to a range of values specified by the argument range, which can be \courier{Full\}, \courier{Automatic\} or an explicit range \courier{Range(pair min, pair max)\}. Here \courier{Full} specifies a range varying from the minimum to maximum values of the function over the sampling interval, while \courier{Automatic\} selects "nice" limits. \comment ##################################################################### \section Questions about programming \question 27jun:comporint Is Asymptote an interpreter or a compiler? Asymptote compiles Asymptote commands into its own virtual machine code. It then runs this pseudocode on a virtual machine to produce PostScript code. \question 05sep:framepicture What is the difference between a frame and a picture? Frames are canvases for drawing in PostScript coordinates. While working with frames directly is occasionally necessary for constructing deferred drawing routines, pictures are usually more convenient to work with. See \qref unitsizes. \question 05sep:pathguide What is the difference between a path and a guide? A path is a cubic spline with fixed endpoint conditions. A guide is an unresolved cubic spline (list of cubic-spline nodes and control points). A guide is like a path except that the computation of the cubic spline is deferred until drawing time (when it is resolved into a path); this allows two guides with free endpoint conditions to be joined together smoothly. \question 27jun:picarray What is a convenient way to declare and initialize an array of pictures? You could write yourself a routine such as: \verbatim picture[] picture(int n) { picture[] pic; for(int i=0; i < n; ++i) { pic[i]=new picture; size(pic[i],19cm,0); } return pic; } picture[] pic=picture(6); \endverbatim \question 27jun:genarrays Is there a way to define functions that act on arrays in general (i.e. work for arrays of any type)? Generic types aren't yet implemented. But for now you can at least say \verbatim typedef string T; include F; typedef real T; include F; \endverbatim where \courier{F.asy\} contains some type-dependent code like \verbatim T[] operator $(T A, T B) {return new T[] {A,B};} \endverbatim \question 27jun:cirdep Is there any way to declare structures ahead of their definition, e.g. where struct A performs some operation on struct B, but B contains an A member? Asymptote does not support forward declaration of types. You can, however, nest structures, so that both types are visible for parts of the bodies of both structure definitions. For example: \verbatim struct B { typedef void someroutine(B b); static struct A { someroutine routine; void operator init(someroutine routine) { this.routine=routine; } } string test="Testing"; } typedef B.A A; A a=B.A(new void(B b){write(b.test);}); B b; a.routine(b); \endverbatim \question 04nov:static Where are static variables in for loops allocated? In the example \verbatim void f() { for(int i=0; i < 3; ++i) { static int n; ++n; write(n); } } f(); // Writes 1, 2, 3 \endverbatim the static qualifier means that \courier{n\} is allocated not just outside of the for loop, but also outside the function. This is clear if you call \courier{f\} multiple times; there is still only one instance of \courier{n\}. The "level" of a variable (where it is allocated) has nothing to do with the "scope" of a variable (how long it can be referred to by name). The curly braces enclosing a block affect only a variable's scope, not its level. Static modifiers are meaningless at the top level; they generate a warning and are simply ignored: \verbatim for(int i=0; i < 3; ++i) { static int n; ++n; write(n); } // Writes warning about top-level static modifier and then 1, 1, 1 \endverbatim Since version 1.22, non-static variables allocated in a loop body are allocated anew every iteration. This is only noticable in obscure cases where a variable in a loop is accessed in the closure of a function defined in the loop: \verbatim int f(); for(int i=0; i < 10; ++i) { int j=10*i; if(i == 5) f=new int() {return j;}; } write(f()); // Writes 50 \endverbatim Variables in the body of a loop last as long as that iteration of the loop, unless they are kept alive by a function closure as in the example above. In a function body, variables will last at least as long as the function call, though because of closures and garbage collection, they may last longer than that. If defined at the top level of a file or at the interactive prompt, they will last at least until the end of the file or prompt's run. \question 26jun:debug Is there a debugger for asy? Yes, Asymptote includes a line-based debugger: \docref{https://asymptote.sourceforge.io/doc/Debugger.html\} \question 27jun:patches Do you accept patches for Asymptote? Yes, in fact we would prefer that users submit patches for customized features (to \docref{http://sourceforge.net/tracker/?atid=685685&group_id=120000\}) instead of relying on us to do all of the coding. Development will proceed faster that way. \comment ##################################################################### \section Questions about differences between Asymptote and MetaPost \question 29jun:interp What is the equivalent of the MetaPost c[a,b] interpolation operator? \verbatim interp(a,b,c); \endverbatim \question 02sep:automaticscaling How does picture scaling differ in Asymptote and MetaPost? Asymptote includes an optional facility to do automatic scaling of pictures to achieve a given overall picture size, whereas Metapost only supports manual scaling. Asymptote defers drawing of objects drawn to pictures and distinguishes between true-size objects and objects that should scale with the picture size. The resulting linear programming problem is solved via the Simplex method. See the \docref{https://asymptote.sourceforge.io/gallery/dimension.asy\} example for an example of how deferred drawing is used to accomodate both user and true-size (PostScript) coordinates. \question 02sep:manualscaling How can I avoid automatic scaling of a picture? If you really like Metapost-style manual (hard-wired) scaling either: (i) use the default size(0,0) for the entire picture and do all of the scaling by hand, just like in MetaPost; (ii) draw to a separate picture pic and add(pic.fit()); (iii) use frames. \question 23jun:mp3dots What is the equivalent of MetaPost ... command? The connector \courier{::\} is a macro for tension atleast 1: \verbatim size(100); pair z0=(0,0); pair z1=(1,0.25); pair z2=(2,0); draw(z0{up}::z1{right}::z2{down}); \endverbatim \question 23jun:mppickup What is the equivalent of the MetaPost pickup command? Just say, for example: \verbatim currentpen=red; \endverbatim \question 29aug:whatever What is the equivalent of the MetaPost whatever command? Asymptote does not implicitly solve linear equations and therefore does not have the notion of a \courier{whatever\} unknown. Such a facility could certainly be added (perhaps using the notation \courier{?=\} since \courier{=\} means assignment). However, the most common uses of \courier{whatever\} in MetaPost are covered by functions like \courier{extension\} in \courier{math.asy\}: \verbatim pair extension(pair P, pair Q, pair p, pair q); \endverbatim this returns the intersection point of the extensions of the line segments \courier{PQ\} and \courier{pq\}. We find using routines like \courier{extension\} more explicit and less confusing to new users. But we could be persuaded to add something similar if someone can justify the need. In the meantime, one can always use the explicit built-in linear solver \courier{solve\} (see \docref{https://asymptote.sourceforge.io/doc/solve.html\}), which uses LU decomposition. \question 23jun:lray What is the equivalent for the MetaPost command for \courier{lray - horiz*v - verti*u = whatever*(LightSource - R)\}, a system of three linear equations for three unknowns: \courier{horiz, verti, whatever\}? Since \courier{horiz*v+verti*u\} spans a plane, you could use \verbatim real intersect(vector P, vector Q, vector n, vector Z); \endverbatim to find the intersection time for the line \courier{lray-whatever*(LightSource - R)\} and then extract the three desired values from there. (You'll still need to use the built-in explicit linear solver to solve a 2x2 system to get \courier{horiz\} and \courier{verti\}.) \question 27jun:unitsizes In MetaPost, it is possible to have a drawing remain the same size in different pictures by defining a unit \courier{u\} and explicitly multiply all the coordinates by \courier{u\}. Is there a better way to do this in Asymptote? Yes, Asymptote has a better way: you definitely don't want to manually scale all of your coordinates. To make the user coordinates represent multiples of exactly \courier{1cm\}: \verbatim unitsize(1cm); draw(unitsquare); \endverbatim One can also specify different x and y unit sizes: \verbatim unitsize(x=1cm,y=2cm); draw(unitsquare); \endverbatim Another way is to draw your fixed size object to a frame and add it to currentpicture like this: \verbatim path p=(0,0)--(1,0); frame object; draw(object,scale(100)*p); add(object); add(object,(0,-10)); \endverbatim To understand the difference between frames and pictures, try this: \verbatim size(300,300); path p=(0,0)--(1,0); picture object; draw(object,scale(100)*p); add(object); add(object,(0,-10)); // Adds truesize object to currentpicture \endverbatim \question 28jun:tiles In MetaPost, one could produce tiling pictures by generating a picture, and then clipping the picture to a rectangle of fixed dimensions around the center of the picture. How is that done in Asymptote? If you are using currentpicture the way one would in MetaPost (drawing in raw PostScript coordinates), you can simply do something like: \verbatim fill((0,0)--(100,100)--(200,0)--cycle); pair center(picture pic=currentpicture) {return 0.5*(pic.min()+pic.max());} real height=100; real width=100; pair delta=0.5(width,height); pair c=center(); clip(box(c-delta,c+delta)); \endverbatim However, drawing in PostScript coordinates is often inconvenient. Here's the Asymptote way of doing the same thing, using deferred drawing: \verbatim size(200,100); fill((0,0)--(1,1)--(2,0)--cycle); void clip(picture pic=currentpicture, real width, real height) { pic.clip(new void (frame f, transform) { pair center=0.5(min(f)+max(f)); pair delta=0.5(width,height); clip(f,box(center-delta,center+delta)); }); } clip(100,100); \endverbatim See also the discussion of tilings in the documentation: \docref{https://asymptote.sourceforge.io/doc/Pens.html\}. \comment ###################################################################### \section Questions about output \question 27jun:psviewer How can I disable automatic invocation of the PS viewer after an asy file is done processing? It's actually not on by default, unless you happen to be using Microsoft Windows (because that is what most Microsoft Windows users expect). Microsoft Windows users can turn this feature off with the command-line option -noV or by putting \verbatim import settings; interactiveView=false; batchView=false; \endverbatim in their \courier{config.asy\} file. See \docref{https://asymptote.sourceforge.io/doc/Options.html\}. \question 26jun:jpeg How do I output jpeg images? If you have the ImageMagick convert program installed, simply type \verbatim asy -f jpg test.asy \endverbatim \question 27jun:embedbitmaps Can I embed bitmaps (photos) into my drawings and position and scale them? Convert them to eps format and use the graphic(string) function just like a Label: \verbatim label(graphic("file"),(0,0)); \endverbatim See the example \docref{https://asymptote.sourceforge.io/gallery/orthocenter.asy\} and \docref{https://asymptote.sourceforge.io/doc/label.html\}. \question 28jun:directpdf Does Asymptote support direct PDF output? Yes, PDF output can be produced by the -f pdf option or -tex pdflatex option. This supports transparency, annotations, embedded movies, and U3D/PRC content. \question 28jun:bigpictures How to I produce large pictures of high quality in raster format (e.g. png, giff etc). Try using some of the options to convert, mainly -geometry and -density. For example: \verbatim convert -geometry 1000x3000 example.eps example.png \endverbatim You can also change the default resolution of the image with: \verbatim convert -geometry 1000x3000 -density 300 -units PixelsPerInch example.eps example.png \endverbatim This does not change the number of pixels in the image, but just gives a hint as to how large each pixel should be displayed. If you include the -density option without the -geometry option, convert will keep the image size constant (so a 4cm x 3cm eps figure will generate a 4cm x 3cm png image). \question 28jun:multipage Is it possible to produce multi-page documents with asymptote? Yes, simply call the newpage() function. This is used by the \courier{slide.asy\} package to produce high-quality slide presentations (easier to use than Prosper). \comment Here it ends! asymptote-3.05/doc/FAQ/bfnnconv.pl0000755000000000000000000002216015031566105015514 0ustar rootroot#!/usr/bin/perl -- # Copyright (C) 1993-1995 Ian Jackson. # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # It is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with GNU Emacs; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # (Note: I do not consider works produced using these BFNN processing # tools to be derivative works of the tools, so they are NOT covered # by the GPL. However, I would appreciate it if you credited me if # appropriate in any documents you format using BFNN.) @outputs=('ascii','info','html'); while ($ARGV[0] =~ m/^\-/) { $_= shift(@ARGV); if (m/^-only/) { @outputs= (shift(@ARGV)); } else { warn "unknown option `$_' ignored"; } } $prefix= $ARGV[0]; $prefix= 'stdin' unless length($prefix); $prefix =~ s/\.bfnn$//; if (open(O,"$prefix.xrefdb")) { @xrefdb= ; close(O); } else { warn "no $prefix.xrefdb ($!)"; } $section= -1; for $thisxr (@xrefdb) { $_= $thisxr; chop; if (m/^Q (\w+) ((\d+)\.(\d+)) (.*)$/) { $qrefn{$1}= $2; $qreft{$1}= $5; $qn2ref{$3,$4}= $1; $maxsection= $3; $maxquestion[$3]= $4; } elsif (m/^S (\d+) /) { $maxsection= $1; $sn2title{$1}=$'; } } open(U,">$prefix.xrefdb-new"); for $x (@outputs) { require("./m-$x.pl"); } &call('init'); while (<>) { chop; next if m/^\\comment\b/; if (!m/\S/) { &call('endpara'); next; } if (s/^\\section +//) { $line= $_; $section++; $question=0; print U "S $section $line\n"; $|=1; print "S$section",' 'x10,"\r"; $|=0; &call('endpara'); &call('startmajorheading',"$section", "Section $section", $section<$maxsection ? "Section ".($section+1) : '', $section>1 ? 'Section '.($section-1) : 'Top'); &text($line); &call('endmajorheading'); if ($section) { &call('endpara'); &call('startindex'); for $thisxr (@xrefdb) { $_= $thisxr; chop; if (m/^Q (\w+) (\d+)\.(\d+) (.*)$/) { $ref= $1; $num1= $2; $num2= $3; $text= $4; next unless $num1 == $section; &call('startindexitem',$ref,"Q$num1.$num2","Question $num1.$num2"); &text($text); &call('endindexitem'); } } &call('endindex'); } } elsif (s/^\\question \d{2}[a-z]{3}((:\w+)?) +//) { $line= $_; $question++; $qrefstring= $1; $qrefstring= "q_${section}_$question" unless $qrefstring =~ s/^://; print U "Q $qrefstring $section.$question $line\n"; $|=1; print "Q$section.$question",' 'x10,"\r"; $|=0; &call('endpara'); &call('startminorheading',$qrefstring, "Question $section.$question", $question < $maxquestion[$section] ? "Question $section.".($question+1) : $section < $maxsection ? "Question ".($section+1).".1" : '', $question > 1 ? "Question $section.".($question-1) : $section > 1 ? "Question ".($section-1).'.'.($maxquestion[$section-1]) : 'Top', "Section $section"); &text("Question $section.$question. $line"); &call('endminorheading'); } elsif (s/^\\only +//) { @saveoutputs= @outputs; @outputs=(); for $x (split(/\s+/,$_)) { push(@outputs,$x) if grep($x eq $_, @saveoutputs); } } elsif (s/^\\endonly$//) { @outputs= @saveoutputs; } elsif (s/^\\copyto +//) { $fh= $'; while(<>) { last if m/^\\endcopy$/; while (s/^([^\`]*)\`//) { print $fh $1; m/([^\\])\`/ || warn "`$_'"; $_= $'; $cmd= $`.$1; if($cmd =~ s/^%perl //) { $it= eval($cmd); } else { $it= `$cmd`; chop $it; } print $fh $it; } print $fh $_; } } elsif (m/\\index$/) { &call('startindex'); for $thisxr (@xrefdb) { $_= $thisxr; chop; if (m/^Q (\w+) (\d+\.\d+) (.*)$/) { $ref= $1; $num= $2; $text= $3; &call('startindexitem',$ref,"Q$num","Question $num"); &text($text); &call('endindexitem'); } elsif (m/^S (\d+) (.*)$/) { $num= $1; $text= $2; next unless $num; &call('startindexmainitem',"s_$num", "Section $num.","Section $num"); &text($text); &call('endindexitem'); } else { warn $_; } } &call('endindex'); } elsif (m/^\\call-(\w+) +(\w+)\s*(.*)$/) { $fn= $1.'_'.$2; eval { &$fn($3); }; warn $@ if length($@); } elsif (m/^\\call +(\w+)\s*(.*)$/) { eval { &call($1,$2); }; warn $@ if length($@); } elsif (s/^\\set +(\w+)\s*//) { $svalue= $'; $svari= $1; eval("\$user_$svari=\$svalue"); $@ && warn "setting $svalue failed: $@\n"; } elsif (m/^\\verbatim$/) { &call('startverbatim'); while (<>) { chop; last if m/^\\endverbatim$/; &call('verbatim',$_); } &call('endverbatim'); } else { s/\.$/\. /; &text($_." "); } } print ' 'x25,"\r"; &call('finish'); rename("$prefix.xrefdb-new","$prefix.xrefdb") || warn "rename xrefdb: $!"; exit 0; sub text { local($in,$rhs,$word,$refn,$reft,$fn,$style); $in= "$holdover$_[0]"; $holdover= ''; while ($in =~ m/\\/) { #print STDERR ">$`##$'\n"; $rhs=$'; &call('text',$`); $_= $rhs; if (m/^\w+ $/) { $holdover= "\\$&"; $in= ''; } elsif (s/^fn\s+([^\s\\]*\w)//) { $in= $_; $word= $1; &call('courier'); &call('text',$word); &call('endcourier'); } elsif (s/^tab\s+(\d+)\s+//) { $in= $_; &call('tab',$1); } elsif (s/^nl\s+//) { $in= $_; &call('newline'); } elsif (s/^qref\s+(\w+)//) { $refn= $qrefn{$1}; $reft= $qreft{$1}; if (!length($refn)) { warn "unknown question `$1'"; } $in= "$`\\pageref:$1:$refn:$reft\\endpageref.$_"; } elsif (s/^pageref:(\w+):([^:\n]+)://) { $in= $_; &call('pageref',$1,$2); } elsif (s/^endpageref\.//) { $in= $_; &call('endpageref'); } elsif (s/^(\w+)\{//) { $in= $_; $fn= $1; eval { &call("$fn"); }; if (length($@)) { warn $@; $fn= 'x'; } push(@styles,$fn); } elsif (s/^\}//) { $in= $_; $fn= pop(@styles); if ($fn ne 'x') { &call("end$fn"); } } elsif (s/^\\//) { $in= $_; &call('text',"\\"); } elsif (s,^(\w+)\s+([-A-Za-z0-9.\@:/]*\w),,) { #print STDERR "**$&**$_\n"; $in= $_; $style=$1; $word= $2; &call($style); &call('text',$word); &call("end$style"); } else { warn "unknown control `\\$_'"; $in= $_; } } &call('text',$in); } sub call { local ($fnbase, @callargs) = @_; local ($coutput); for $coutput (@outputs) { if ($fnbase eq 'text' && eval("\@${coutput}_cmds")) { #print STDERR "special handling text (@callargs) for $coutput\n"; $evstrg= "\$${coutput}_args[\$#${coutput}_args].=\"\@callargs\""; eval($evstrg); length($@) && warn "call adding for $coutput (($evstrg)): $@"; } else { $fntc= $coutput.'_'.$fnbase; &$fntc(@callargs); } } } sub recurse { local (@outputs) = $coutput; local ($holdover); &text($_[0]); } sub arg { #print STDERR "arg($_[0]) from $coutput\n"; $cmd= $_[0]; eval("push(\@${coutput}_cmds,\$cmd); push(\@${coutput}_args,'')"); length($@) && warn "arg setting up for $coutput: $@"; } sub endarg { #print STDERR "endarg($_[0]) from $coutput\n"; $evstrg= "\$${coutput}_cmd= \$cmd= pop(\@${coutput}_cmds); ". "\$${coutput}_arg= \$arg= pop(\@${coutput}_args); "; eval($evstrg); length($@) && warn "endarg extracting for $coutput (($evstrg)): $@"; #print STDERR ">call $coutput $cmd $arg< (($evstrg))\n"; $evstrg= "&${coutput}_do_${cmd}(\$arg)"; eval($evstrg); length($@) && warn "endarg running ${coutput}_do_${cmd} (($evstrg)): $@"; } asymptote-3.05/doc/FAQ/Makefile0000644000000000000000000000175015031566105015005 0ustar rootrootBFNNCONV = bfnnconv.pl m-ascii.pl m-html.pl m-info.pl m-lout.pl m-post.pl all: faq faq: $(BFNNCONV) asy-faq.bfnn mkdir -p asy-faq.html perl bfnnconv.pl asy-faq.bfnn perl bfnnconv.pl asy-faq.bfnn clean: FORCE -rm -f *~ core a.out *.lout *.ps *.info *.ascii *.xrefdb *.post -rm -rf *.html install-all: install install: faq install-prebuilt ${INSTALL} -d -m 755 $(docdir) $(docdir)/asy-faq.html ${INSTALL} -p -m 644 asy-faq.ascii $(docdir) ${INSTALL} -p -m 644 asy-faq.html/* $(docdir)/asy-faq.html install-prebuilt: ${INSTALL} -d -m 755 $(infodir) ${INSTALL} -p -m 644 asy-faq.info $(infodir) -if test -z "$(DESTDIR)"; then \ install-info --infodir=$(infodir) asy-faq.info; \ fi install-info: faq install-prebuilt uninstall: uninstall-all uninstall-all: -cd $(docdir)/asy-faq.html && rm -rf *.html -cd $(docdir) && rmdir asy-faq.html && rm asy-faq.ascii -install-info --remove --infodir=$(infodir) asy-faq.info -rm -f $(infodir)/asy-faq.info distclean: FORCE clean FORCE: asymptote-3.05/doc/FAQ/m-lout.pl0000644000000000000000000001373015031566105015120 0ustar rootroot## Lout output # Copyright (C) 1993-1995 Ian Jackson. # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # It is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with GNU Emacs; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # (Note: I do not consider works produced using these BFNN processing # tools to be derivative works of the tools, so they are NOT covered # by the GPL. However, I would appreciate it if you credited me if # appropriate in any documents you format using BFNN.) sub lout_init { open(LOUT,">$prefix.lout"); chop($dprint= `date '+%d %B %Y'`); $dprint =~ s/^0//; } sub lout_startup { local ($lbs) = &lout_sanitise($user_brieftitle); print LOUT <0)*40+5); $lout_plc= !$lout_plc; } sub lout_startlist { &lout_endpara; print LOUT "\@RawIndentedList style {\@Bullet} indent {0.5i} gap {1.1vx}\n"; $lout_styles .= 'l'; $lout_status= ''; } sub lout_endlist { &lout_endpara; print LOUT "\@EndList\n\n"; $lout_styles =~ s/.$//; } sub lout_item { &lout_endpara; print LOUT "\@ListItem{"; $lout_styles.= 'I'; } sub lout_startindex { print LOUT "//0.0fe\n"; } sub lout_endindex { $lout_status='p'; } sub lout_startindexmainitem { $lout_marker= $_[0]; $lout_status= ''; print LOUT "//0.3vx Bold \@Font \@HAdjust { \@HContract { { $_[1] } |3cx {"; $lout_iiendheight= '1.00'; $lout_styles .= 'X'; } sub lout_startindexitem { $lout_marker= $_[0]; print LOUT "\@HAdjust { \@HContract { { $_[1] } |3cx {"; $lout_iiendheight= '0.95'; $lout_styles .= 'X'; } sub lout_endindexitem { print LOUT "} } |0c \@PageOf { $lout_marker } } //${lout_iiendheight}vx\n"; $lout_styles =~ s/.$//; } sub lout_email { &lout_courier; &lout_text('<'); } sub lout_endemail { &lout_text('>'); &lout_endcourier; } sub lout_ftpon { &lout_courier; } sub lout_endftpon { &lout_endcourier; } sub lout_ftpin { &lout_courier; } sub lout_endftpin { &lout_endcourier; } sub lout_docref { } sub lout_enddocref { } sub lout_ftpsilent { $lout_ignore++; } sub lout_endftpsilent { $lout_ignore--; } sub lout_newsgroup { &lout_courier; } sub lout_endnewsgroup { &lout_endcourier; } sub lout_text { return if $lout_ignore; $lout_status= 'p'; $_= &lout_sanitise($_[0]); s/ $/\n/ unless $lout_styles =~ m/[fhX]/; print LOUT $_; } sub lout_tab { local ($size) = $_[0]*0.5; print LOUT " |${size}ft "; } sub lout_newline { print LOUT " //1.0vx\n"; } sub lout_sanitise { local ($in) = @_; local ($out); $in= ' '.$in.' '; $out=''; while ($in =~ m/(\s)(\S*[\@\/|\\\"\^\&\{\}\#]\S*)(\s)/) { $out .= $`.$1; $in = $3.$'; $_= $2; s/[\\\"]/\\$&/g; $out .= '"'.$_.'"'; } $out .= $in; $out =~ s/^ //; $out =~ s/ $//; $out; } sub lout_endpara { return if $lout_status eq ''; if ($lout_styles eq '') { print LOUT "\@LP\n\n"; } elsif ($lout_styles =~ s/I$//) { print LOUT "}\n"; } $lout_status= ''; } sub lout_startverbatim { print LOUT "//0.4f\n\@RawIndentedDisplay lines \@Break". " { {0.7 1.0} \@Scale {Courier Bold} \@Font {\n"; } sub lout_verbatim { $_= $_[0]; s/^\s*//; print LOUT &lout_sanitise($_),"\n"; } sub lout_endverbatim { print LOUT "}\n}\n//0.4f\n"; } 1; asymptote-3.05/doc/FAQ/m-info.pl0000644000000000000000000001277315031566105015076 0ustar rootroot## Info output # Copyright (C) 1993-1995 Ian Jackson. # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # It is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with GNU Emacs; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # (Note: I do not consider works produced using these BFNN processing # tools to be derivative works of the tools, so they are NOT covered # by the GPL. However, I would appreciate it if you credited me if # appropriate in any documents you format using BFNN.) sub info_init { open(INFO,">$prefix.info"); print INFO <'); } sub info_ftpon { } sub info_endftpon { } sub info_ftpin { } sub info_endftpin { } sub info_docref { } sub info_enddocref { } sub info_courier { } sub info_endcourier { } sub info_newsgroup { } sub info_endnewsgroup { } sub info_ftpsilent { $info_ignore++; } sub info_endftpsilent { $info_ignore--; } sub info_text { return if $info_ignore; if ($info_status eq '') { $info_status= 'p'; } $info_para .= $_[0]; } sub info_tab { local ($n) = $_[0]-length($info_para); $info_para .= ' 'x$n if $n>0; } sub info_newline { return unless $info_status eq 'p'; print INFO &info_writepara; } sub info_writepara { local ($thisline, $thisword, $rest, $output); for (;;) { last unless $info_para =~ m/\S/; $thisline= $info_indentstring; for (;;) { last unless $info_para =~ m/^(\s*\S+)/; unless (length($1) + length($thisline) < 75 || length($thisline) == length($info_indentstring)) { last; } $thisline .= $1; $info_para= $'; } $info_para =~ s/^\s*//; $output.= $thisline."\n"; $info_indentstring= $info_nextindent; last unless length($info_para); } $info_status= ''; $info_para= ''; return $output; } sub info_endpara { return unless $info_status eq 'p'; print INFO &info_writepara; print INFO "\n"; } sub info_endheading { $info_para =~ s/\s*$//; print INFO "$info_para\n\n"; $info_status= ''; $info_para= ''; } sub info_endmajorheading { &info_endheading(@_); } sub info_endminorheading { &info_endheading(@_); } sub info_startverbatim { print INFO &info_writepara; } sub info_verbatim { print INFO $_[0],"\n"; } sub info_endverbatim { $info_status= $info_vstatus; } sub info_finish { close(INFO); } sub info_startindex { &info_endpara; $info_moredetail= ''; $info_status= ''; } sub info_endindex { print INFO "$info_moredetail\n" if length($info_moredetail); } sub info_endindexitem { $info_indentstring= sprintf("* %-17s ",$info_label.'::'); $info_nextindent= ' 'x20; local ($txt); $txt= &info_writepara; if ($info_main) { print INFO $label.$txt; $txt =~ s/^.{20}//; $info_moredetail.= $txt; } else { $info_moredetail.= $label.$txt; } $info_indentstring= $info_nextindent= ''; $info_status='p'; } sub info_startindexitem { print INFO "* Menu:\n" if $info_status eq ''; $info_status= ''; $info_label= $_[2]; $info_main= 0; } sub info_startindexmainitem { print INFO "* Menu:\n" if $info_status eq ''; $info_label= $_[2]; $info_main= 1; $info_moredetail .= "\n$_[2], "; $info_status= ''; } sub info_startindent { $info_istatus= $info_status; print INFO &info_writepara; $info_indentstring= " $info_indentstring"; $info_nextindent= " $info_nextindent"; } sub info_endindent { $info_indentstring =~ s/^ //; $info_nextindent =~ s/^ //; $info_status= $info_istatus; } sub info_startpackedlist { $info_plc=0; } sub info_endpackedlist { &info_newline if !$info_plc; } sub info_packeditem { &info_newline if !$info_plc; &info_tab($info_plc*40+5); $info_plc= !$info_plc; } sub info_startlist { $info_istatus= $info_status; print INFO &info_writepara; $info_indentstring= " $info_indentstring"; $info_nextindent= " $info_nextindent"; } sub info_endlist { $info_indentstring =~ s/^ //; $info_nextindent =~ s/^ //; $info_status= $info_lstatus; } sub info_item { &info_newline; $info_indentstring =~ s/ $/* /; } sub info_pageref { &info_text("*Note Question $_[1]:: \`"); } sub info_endpageref { &info_text("'"); } 1; asymptote-3.05/doc/FAQ/asy-faq.info0000644000000000000000000017324015031566767015605 0ustar rootrootInfo file: asy-faq.info, -*-Text-*- produced by bfnnconv.pl from the Bizarre Format With No Name. INFO-DIR-SECTION Languages START-INFO-DIR-ENTRY * asymptote FAQ: (asy-faq). Asymptote Frequently Asked Questions. END-INFO-DIR-ENTRY  File: asy-faq.info, Node: Top, Next: Question 1.1, Up: (dir) ASYMPTOTE FREQUENTLY ASKED QUESTIONS 2025-07-03 This is the list of Frequently Asked Questions about Asymptote (asy). Index * Menu: * Section 1:: About Asymptote * Section 2:: Questions about installation and setup * Section 3:: Questions about paths * Section 4:: Questions about labels * Section 5:: Questions about arrows * Section 6:: Questions about 2D graphs * Section 7:: Questions about programming * Section 8:: Questions about differences between Asymptote and MetaPost * Section 9:: Questions about output Section 1, About Asymptote * Question 1.1:: What is Asymptote? * Question 1.2:: How do I obtain Asymptote? * Question 1.3:: Where can I ask questions about Asymptote? * Question 1.4:: Why was the name Asymptote chosen? * Question 1.5:: In the internal Asymptote source code, what does the name camp refer to? Section 2, Questions about installation and setup * Question 2.1:: Is it possible to install Asymptote on Mac OS X? * Question 2.2:: Why do I get the error Bad CPU type in executable on installing Asymptote from the MAC OS binary? * Question 2.3:: What do I do if I get the error: Error: pdfetex (file pdftex.cfg): cannot open config file...texinfo.tex appears to be broken? * Question 2.4:: What do I do if I get the error: ! Undefined control sequence. l.6 @copying? * Question 2.5:: Is it possible to integrate Asymptote into LaTeX? * Question 2.6:: Is it possible to integrate Asymptote into latex or pdflatex? * Question 2.7:: Do I need the tkinter package to install an Asymptote rpm binary? * Question 2.8:: What does the path %USERPROFILE%\.asy\config.asy mean? * Question 2.9:: Why do I get the error "string not terminated" when I try to set settings.dir="C:\asymptote\";? * Question 2.10:: How do I change environment variables in Microsoft Windows, for example, in order to change the default PostScript viewer? * Question 2.11:: Under Microsoft Windows XP, why do I get an error like "Invalid Parameter - 432x432"? * Question 2.12:: Why does Asymptote freeze upon trying to draw a label with my MikTex installation under Microsoft Windows? Section 3, Questions about paths * Question 3.1:: Why do I get a syntax error message when I specify an integer value for the path tension? * Question 3.2:: Shouldn't dots always be the same size? Section 4, Questions about labels * Question 4.1:: How do I get Greek letters like omega to show up in my labels? * Question 4.2:: Can Asymptote use matrices as labels? * Question 4.3:: How do I tell Asymptote to load a particular LaTeX package, like mathptmx? * Question 4.4:: How can I use international fonts in Asymptote labels? * Question 4.5:: How can I use Fourier fonts? * Question 4.6:: Is there any way to change the default appearance of the decimal separator, using a comma instead of a dot? * Question 4.7:: How can I get a rotated label with the filled box rotated as well so that it fits the text? * Question 4.8:: How can I rotate labels in a 3D figure? * Question 4.9:: How can I draw some squares and circles of a fixed size and put a label in the middle of them? * Question 4.10:: The binary operator * can be used to scale the color of a pen by a real number. Does this scaling factor have to be less than 1? * Question 4.11:: Why is the space after the comma decimal separator in my locale so large? * Question 4.12:: How can I prevent texpreamble("\usepackage[pdftex]{hyperref}") from changing the page size? Section 5, Questions about arrows * Question 5.1:: How do I draw two arrows at arbitrary positions along a path? * Question 5.2:: How do I reverse the direction of an arrowhead? * Question 5.3:: How do I change the size of all arrows? * Question 5.4:: Can I create other arrowhead styles? Section 6, Questions about 2D graphs * Question 6.1:: How can I draw x axis ticks on the right side, with the tick labels on the left side (relative to the axis path)? * Question 6.2:: How can I reposition the x axis label to three-quarters along the axis length? * Question 6.3:: How can I move the x axis label down 10bp? * Question 6.4:: Can I use different pens for the axis, the axis label, and the tick labels? * Question 6.5:: How can I change the font type of the axes label? * Question 6.6:: How can I change the font type of the tick labels on an axis? * Question 6.7:: How can I prevent axes tick labels from rendering on top of each other? * Question 6.8:: How do I make the plot region of a graph, ignoring labels and legends, have a fixed size? * Question 6.9:: How can I plot a function f(x) within [0,1]x[0,2] without explicitly calculating the x values for which f(x) hits the boundary? * Question 6.10:: Is it possible to define customized palettes? * Question 6.11:: Is there an easy way to graph factorial functions nicely? * Question 6.12:: How do I indicate that a certain length should be exactly the size I prescribe with no rescaling, within a picture which has its own size? * Question 6.13:: How can I make the y axis display base-2 logarithmic values? * Question 6.14:: How can I align the x axes of two graphs on the same figure? * Question 6.15:: How can I change the direction of the y-axis, such that negatives values are on the upper y-axis? * Question 6.16:: How can I fill a path with a function that defines the color of each location? * Question 6.17:: Is there a way to draw a function that is not explicitly given, such as (y - 2)^2 = x - 1 ? * Question 6.18:: Is it possible to reverse or stretch an axis? * Question 6.19:: Why can't I use the UnFill option to draw graphs with empty markers? * Question 6.20:: How can I force several images to use the same palette range (e.g. the entire 0-255 grayscale range)? Section 7, Questions about programming * Question 7.1:: Is Asymptote an interpreter or a compiler? * Question 7.2:: What is the difference between a frame and a picture? * Question 7.3:: What is the difference between a path and a guide? * Question 7.4:: What is a convenient way to declare and initialize an array of pictures? * Question 7.5:: Is there a way to define functions that act on arrays in general (i.e. work for arrays of any type)? * Question 7.6:: Is there any way to declare structures ahead of their definition, e.g. where struct A performs some operation on struct B, but B contains an A member? * Question 7.7:: Where are static variables in for loops allocated? * Question 7.8:: Is there a debugger for asy? * Question 7.9:: Do you accept patches for Asymptote? Section 8, Questions about differences between Asymptote and MetaPost * Question 8.1:: What is the equivalent of the MetaPost c[a,b] interpolation operator? * Question 8.2:: How does picture scaling differ in Asymptote and MetaPost? * Question 8.3:: How can I avoid automatic scaling of a picture? * Question 8.4:: What is the equivalent of MetaPost ... command? * Question 8.5:: What is the equivalent of the MetaPost pickup command? * Question 8.6:: What is the equivalent of the MetaPost whatever command? * Question 8.7:: What is the equivalent for the MetaPost command for lray - horiz*v - verti*u = whatever*(LightSource - R), a system of three linear equations for three unknowns: horiz, verti, whatever? * Question 8.8:: In MetaPost, it is possible to have a drawing remain the same size in different pictures by defining a unit u and explicitly multiply all the coordinates by u. Is there a better way to do this in Asymptote? * Question 8.9:: In MetaPost, one could produce tiling pictures by generating a picture, and then clipping the picture to a rectangle of fixed dimensions around the center of the picture. How is that done in Asymptote? Section 9, Questions about output * Question 9.1:: How can I disable automatic invocation of the PS viewer after an asy file is done processing? * Question 9.2:: How do I output jpeg images? * Question 9.3:: Can I embed bitmaps (photos) into my drawings and position and scale them? * Question 9.4:: Does Asymptote support direct PDF output? * Question 9.5:: How to I produce large pictures of high quality in raster format (e.g. png, giff etc). * Question 9.6:: Is it possible to produce multi-page documents with asymptote?  File: asy-faq.info, Node: Section 1, Next: Section 2, Previous: Top, Up: Top About Asymptote * Menu: * Question 1.1:: What is Asymptote? * Question 1.2:: How do I obtain Asymptote? * Question 1.3:: Where can I ask questions about Asymptote? * Question 1.4:: Why was the name Asymptote chosen? * Question 1.5:: In the internal Asymptote source code, what does the name camp refer to?  File: asy-faq.info, Node: Question 1.1, Next: Question 1.2, Previous: Top, Up: Section 1 Question 1.1. What is Asymptote? Asymptote is a vector graphics language designed for technical graphics, inspired by MetaPost but with IEEE floating-point numerics, native three-dimensional graphics, Grayscale/RGB/CMYK colourspaces, and a C++-like syntax. Unlike MetaPost, it natively supports multiple-segment paths (and hence regions other than simply connected ones), tiling patterns, Gouraud shading, tensor patch shading, and PostScript images.  File: asy-faq.info, Node: Question 1.2, Next: Question 1.3, Previous: Question 1.1, Up: Section 1 Question 1.2. How do I obtain Asymptote? Binary releases are available for Linux, MacOS X, and Microsoft Windows platforms, in addition to full source code, from the website https://asymptote.sourceforge.io/. Many Linux distributions (such as RedHat and Debian) now include an Asymptote package (check your distribution's documentation for further information about this).  File: asy-faq.info, Node: Question 1.3, Next: Question 1.4, Previous: Question 1.2, Up: Section 1 Question 1.3. Where can I ask questions about Asymptote? If you have a question, please try to find an answer in this FAQ, in the extensive Asymptote documentation at https://asymptote.sourceforge.io/doc/, or search the forum: http://sourceforge.net/forum/forum.php?forum_id=409349.  File: asy-faq.info, Node: Question 1.4, Next: Question 1.5, Previous: Question 1.3, Up: Section 1 Question 1.4. Why was the name Asymptote chosen? Well, it isn't the perfect graphics package, but we do think it is getting there asymptotically...  File: asy-faq.info, Node: Question 1.5, Next: Question 2.1, Previous: Question 1.4, Up: Section 1 Question 1.5. In the internal Asymptote source code, what does the name camp refer to? That was our original tentative name for this project, which stood for "C's Answer to MetaPost" (the language that inspired Asymptote). However, we eventually decided that the name Asymptote better emphasizes the mathematical and graphical nature of this language.  File: asy-faq.info, Node: Section 2, Next: Section 3, Previous: Section 1, Up: Top Questions about installation and setup * Menu: * Question 2.1:: Is it possible to install Asymptote on Mac OS X? * Question 2.2:: Why do I get the error Bad CPU type in executable on installing Asymptote from the MAC OS binary? * Question 2.3:: What do I do if I get the error: Error: pdfetex (file pdftex.cfg): cannot open config file...texinfo.tex appears to be broken? * Question 2.4:: What do I do if I get the error: ! Undefined control sequence. l.6 @copying? * Question 2.5:: Is it possible to integrate Asymptote into LaTeX? * Question 2.6:: Is it possible to integrate Asymptote into latex or pdflatex? * Question 2.7:: Do I need the tkinter package to install an Asymptote rpm binary? * Question 2.8:: What does the path %USERPROFILE%\.asy\config.asy mean? * Question 2.9:: Why do I get the error "string not terminated" when I try to set settings.dir="C:\asymptote\";? * Question 2.10:: How do I change environment variables in Microsoft Windows, for example, in order to change the default PostScript viewer? * Question 2.11:: Under Microsoft Windows XP, why do I get an error like "Invalid Parameter - 432x432"? * Question 2.12:: Why does Asymptote freeze upon trying to draw a label with my MikTex installation under Microsoft Windows?  File: asy-faq.info, Node: Question 2.1, Next: Question 2.2, Previous: Question 1.5, Up: Section 2 Question 2.1. Is it possible to install Asymptote on Mac OS X? It is easy to compile Asymptote directly from the source code at http://sourceforge.net/project/showfiles.php?group_id=120000 We recommend first upgrading to the latest GNU readline library, unless you don't care about interactive readline support (in which case configure will automatically detect and disable obsolete versions of the readline library). Marius Schamschula also maintains a binary package for various MacOS X platforms http://www.hmug.org/pub/MacOS_X/X/Applications/Publishing/asymptote.  File: asy-faq.info, Node: Question 2.2, Next: Question 2.3, Previous: Question 2.1, Up: Section 2 Question 2.2. Why do I get the error Bad CPU type in executable on installing Asymptote from the MAC OS binary? This means either that you have a binary distribution for another MAC architecture, or (according to Marius Schamschula) that you may have a missing library. The simplest solution is to compile Asymptote directly from the official source: http://sourceforge.net/project/showfiles.php?group_id=120000.  File: asy-faq.info, Node: Question 2.3, Next: Question 2.4, Previous: Question 2.2, Up: Section 2 Question 2.3. What do I do if I get the error: Error: pdfetex (file pdftex.cfg): cannot open config file...texinfo.tex appears to be broken? Simply put https://asymptote.sourceforge.io/asymptote.pdf in the directory doc and repeat the command make all. Or, if you don't want to build a local copy of the documentation, simply proceed with make install-asy.  File: asy-faq.info, Node: Question 2.4, Next: Question 2.5, Previous: Question 2.3, Up: Section 2 Question 2.4. What do I do if I get the error: ! Undefined control sequence. l.6 @copying? Either upgrade your texinfo package or follow one of the easy work arounds in *Note Question 2.3:: `What do I do if I get the error: Error: pdfetex (file pdftex.cfg): cannot open config file...texinfo.tex appears to be broken?'.  File: asy-faq.info, Node: Question 2.5, Next: Question 2.6, Previous: Question 2.4, Up: Section 2 Question 2.5. Is it possible to integrate Asymptote into LaTeX? Yes, see the example latexusage.tex. Dario Teixeira has also written a detailed guide on the topic. You can download it from http://dario.dse.nl/projects/asylatex/. Philippe Ivaldi has contributed an Asymptote mode for Emacs users https://asymptote.sourceforge.io/doc/Editing-modes.html, which includes a lasy-mode that allows one to compile and view the output of one \begin{asy}...\end{asy} section at a time.  File: asy-faq.info, Node: Question 2.6, Next: Question 2.7, Previous: Question 2.5, Up: Section 2 Question 2.6. Is it possible to integrate Asymptote into latex or pdflatex? Yes, as of version 1.14, Asymptote supports latex and pdflatex (both in EPS/PDF and inline mode), as illustrated by the example latexusage.tex: pdflatex latexusage asy latexusage pdflatex latexusage  File: asy-faq.info, Node: Question 2.7, Next: Question 2.8, Previous: Question 2.6, Up: Section 2 Question 2.7. Do I need the tkinter package to install an Asymptote rpm binary? No, you don't need tkinter unless you want to try out the GUI xasy. Try rpm -Uvh --nodeps asymptote-x.xx-1.i386.rpm where x.xx represents the version number.  File: asy-faq.info, Node: Question 2.8, Next: Question 2.9, Previous: Question 2.7, Up: Section 2 Question 2.8. What does the path %USERPROFILE%\.asy\config.asy mean? That is the way that Microsoft Windows refers to the user profile directory. There's nothing really to understand here, just put your configuration commands in the file config.asy in a new folder %USERPROFILE%\.asy.  File: asy-faq.info, Node: Question 2.9, Next: Question 2.10, Previous: Question 2.8, Up: Section 2 Question 2.9. Why do I get the error "string not terminated" when I try to set settings.dir="C:\asymptote\";? The backslash is an escape character here, so \" is interpreted as a verbatim quotation mark, leaving the string without a terminating quotation mark. Fortunately, this is the only escaped character in double-quoted strings. A final backslash isn't needed here anyway, but should you really want one somewhere, you can say: settings.dir="C:\asymptote"+'\\';.  File: asy-faq.info, Node: Question 2.10, Next: Question 2.11, Previous: Question 2.9, Up: Section 2 Question 2.10. How do I change environment variables in Microsoft Windows, for example, in order to change the default PostScript viewer? While it is easier to set the corresponding Asymptote configuration variable in your config.asy file, here is the procedure for changing Microsoft Windows environment variables: Click on the [Start] button * RIGHT-click on 'My Computer' * Choose 'Properties' from the popup menu * Click the 'Advanced' tab * Click the 'Environment Variables' button.  File: asy-faq.info, Node: Question 2.11, Next: Question 2.12, Previous: Question 2.10, Up: Section 2 Question 2.11. Under Microsoft Windows XP, why do I get an error like "Invalid Parameter - 432x432"? This means that ImageMagick wasn't properly installed and you are using the MSDOS convert program rather than the ImageMagick one. Or you may have installed ImageMagick but ran Asymptote from an existing MSDOS window. In that case, simply open a new window and try again. If that doesn't work, check that convert --version returns something like Version: ImageMagick 6.2.8 06/27/06 Q16 http://www.imagemagick.org  File: asy-faq.info, Node: Question 2.12, Next: Question 3.1, Previous: Question 2.11, Up: Section 2 Question 2.12. Why does Asymptote freeze upon trying to draw a label with my MikTex installation under Microsoft Windows? Likely, this means that latex and dvips are not in your default path. Try adding the appropriate paths in your config.asy file, for example: import settings; latex="C:\Program Files\MiKTeX 2.7\miktex\bin\latex.exe"; dvips="C:\Program Files\MiKTeX 2.7\miktex\bin\dvips.exe";  File: asy-faq.info, Node: Section 3, Next: Section 4, Previous: Section 2, Up: Top Questions about paths * Menu: * Question 3.1:: Why do I get a syntax error message when I specify an integer value for the path tension? * Question 3.2:: Shouldn't dots always be the same size?  File: asy-faq.info, Node: Question 3.1, Next: Question 3.2, Previous: Question 2.12, Up: Section 3 Question 3.1. Why do I get a syntax error message when I specify an integer value for the path tension? What is happening here is that draw((0,0)..tension 2..(0,50)..(100,100)); is read as draw((0,0)..tension 2. .(0,50)..(100,100)); So the first . after the two is treated as a decimal point. Just put a space after the integer tension value: draw((0,0)..tension 2 ..(0,50)..(100,100));  File: asy-faq.info, Node: Question 3.2, Next: Question 4.1, Previous: Question 3.1, Up: Section 3 Question 3.2. Shouldn't dots always be the same size? From the documentation: "The dot command defined in the module plain draws a dot having a diameter equal to an explicit pen linewidth or the default linewidth magnified by dotfactor (6 by default)." Thus, when you use the default pen, the dot will have size 6*linewidth, but when you give a pen with an explicit width specified, you will have a dot of size linewidth. If you want the first case to behave like the second, you may set dotfactor=1.  File: asy-faq.info, Node: Section 4, Next: Section 5, Previous: Section 3, Up: Top Questions about labels * Menu: * Question 4.1:: How do I get Greek letters like omega to show up in my labels? * Question 4.2:: Can Asymptote use matrices as labels? * Question 4.3:: How do I tell Asymptote to load a particular LaTeX package, like mathptmx? * Question 4.4:: How can I use international fonts in Asymptote labels? * Question 4.5:: How can I use Fourier fonts? * Question 4.6:: Is there any way to change the default appearance of the decimal separator, using a comma instead of a dot? * Question 4.7:: How can I get a rotated label with the filled box rotated as well so that it fits the text? * Question 4.8:: How can I rotate labels in a 3D figure? * Question 4.9:: How can I draw some squares and circles of a fixed size and put a label in the middle of them? * Question 4.10:: The binary operator * can be used to scale the color of a pen by a real number. Does this scaling factor have to be less than 1? * Question 4.11:: Why is the space after the comma decimal separator in my locale so large? * Question 4.12:: How can I prevent texpreamble("\usepackage[pdftex]{hyperref}") from changing the page size?  File: asy-faq.info, Node: Question 4.1, Next: Question 4.2, Previous: Question 3.2, Up: Section 4 Question 4.1. How do I get Greek letters like omega to show up in my labels? In (La)TeX, Greek letters can be obtained in math mode by prepending a backslash to the letter name. So for a omega symbol, use "$\omega$". Everything between the dollar signs is considered to be a math formula. Uppercase Greek letters can be used by capitalizing the first letter of the name: label("$\omega$",(0,0)); label("$\Omega$",(20,0));  File: asy-faq.info, Node: Question 4.2, Next: Question 4.3, Previous: Question 4.1, Up: Section 4 Question 4.2. Can Asymptote use matrices as labels? Yes: usepackage("amsmath"); label("$\begin{matrix} 1 & 2 \\\ 1 & 1 \end{matrix}$",(0,0));  File: asy-faq.info, Node: Question 4.3, Next: Question 4.4, Previous: Question 4.2, Up: Section 4 Question 4.3. How do I tell Asymptote to load a particular LaTeX package, like mathptmx? Put usepackage("mathptmx"); at the beginning of your file. Note: to enable the Adobe Times Roman font for text, you will also need to say: defaultpen(TimesRoman());  File: asy-faq.info, Node: Question 4.4, Next: Question 4.5, Previous: Question 4.3, Up: Section 4 Question 4.4. How can I use international fonts in Asymptote labels? See https://asymptote.sourceforge.io/doc/Pens.html.  File: asy-faq.info, Node: Question 4.5, Next: Question 4.6, Previous: Question 4.4, Up: Section 4 Question 4.5. How can I use Fourier fonts? usepackage("fourier"); defaultpen(font("T1","fut\textfamilyextension","m","n"));  File: asy-faq.info, Node: Question 4.6, Next: Question 4.7, Previous: Question 4.5, Up: Section 4 Question 4.6. Is there any way to change the default appearance of the decimal separator, using a comma instead of a dot? Just set your locale appropriately: locale("it_IT"); usepackage("icomma"); label(format(0.5));  File: asy-faq.info, Node: Question 4.7, Next: Question 4.8, Previous: Question 4.6, Up: Section 4 Question 4.7. How can I get a rotated label with the filled box rotated as well so that it fits the text? frame f; label(f,"This is some text",white,Fill(blue)); add(rotate(65)*f);  File: asy-faq.info, Node: Question 4.8, Next: Question 4.9, Previous: Question 4.7, Up: Section 4 Question 4.8. How can I rotate labels in a 3D figure? You need to first project the triple to a pair like this: import three; size(100,100); draw(rotate(90,project(Z))*"A",O--X);  File: asy-faq.info, Node: Question 4.9, Next: Question 4.10, Previous: Question 4.8, Up: Section 4 Question 4.9. How can I draw some squares and circles of a fixed size and put a label in the middle of them? Fixed-size objects should be drawn on a separate picture and then added to currentpicture. Here is one way (see also https://asymptote.sourceforge.io/gallery/subpictures.asy and https://asymptote.sourceforge.io/gallery/mosquito.asy): real u=2cm; picture square; draw(square,scale(u)*shift(-0.5,-0.5)*unitsquare); picture circle; draw(circle,scale(0.5u)*unitcircle); void add(picture pic=currentpicture, Label L, picture object, pair z) { add(pic,object,z); label(pic,L,z); } add("square",square,(0,0)); add("circle",circle,(5cm,0));  File: asy-faq.info, Node: Question 4.10, Next: Question 4.11, Previous: Question 4.9, Up: Section 4 Question 4.10. The binary operator * can be used to scale the color of a pen by a real number. Does this scaling factor have to be less than 1? The scaling factor can be greater than 1. But keep in mind that the rgb color components saturate at 1. Try write(cyan); write(0.8*cyan); write(1.5*cyan); and you will quickly see what is going on. To get a lighter cyan you can say white+cyan, which yields rgb(0.5,1,1). If you want something even lighter specify the rgb colors directly, for example, rgb(0.9,1,1). Alternatively, work in cmyk colour space, which is nicer in that it handles saturation separately from hue: 0.1*Cyan is light and 0.9*Cyan is dark. You can also say 0.1*cmyk(red).  File: asy-faq.info, Node: Question 4.11, Next: Question 4.12, Previous: Question 4.10, Up: Section 4 Question 4.11. Why is the space after the comma decimal separator in my locale so large? LaTeX is treating the comma as punctuation and not as a decimal separator. The solution is to load the icomma package near the beginning of your file: usepackage("icomma");  File: asy-faq.info, Node: Question 4.12, Next: Question 5.1, Previous: Question 4.11, Up: Section 4 Question 4.12. How can I prevent texpreamble("\usepackage[pdftex]{hyperref}") from changing the page size? texpreamble("\usepackage[pdftex,setpagesize=false]{hyperref}");  File: asy-faq.info, Node: Section 5, Next: Section 6, Previous: Section 4, Up: Top Questions about arrows * Menu: * Question 5.1:: How do I draw two arrows at arbitrary positions along a path? * Question 5.2:: How do I reverse the direction of an arrowhead? * Question 5.3:: How do I change the size of all arrows? * Question 5.4:: Can I create other arrowhead styles?  File: asy-faq.info, Node: Question 5.1, Next: Question 5.2, Previous: Question 4.12, Up: Section 5 Question 5.1. How do I draw two arrows at arbitrary positions along a path? Assuming that at least one of the arrowheads is to be filled, you can do this: size(200); path g = (0,0)..(1,3)..(3,0); draw(g,Arrow(Relative(0.9))); add(arrow(g,invisible,FillDraw(black),Relative(0.5))); add(arrow(reverse(g),invisible,FillDraw(white,black),Relative(0.9))); If both of the arrowheads are to be drawn with filltype NoFill, one will need to create a specialized version of the arrow routine in plain_arrows.asy: void arrow(frame f, arrowhead arrowhead=DefaultHead, path g, pen p=currentpen, real size=0, real angle=arrowangle, filltype filltype=arrowhead.defaultfilltype, position position=EndPoint, bool forwards=true, margin margin=NoMargin, bool center=false);  File: asy-faq.info, Node: Question 5.2, Next: Question 5.3, Previous: Question 5.1, Up: Section 5 Question 5.2. How do I reverse the direction of an arrowhead? Simply reverse the direction of the path. path g=((0,0)--(5cm,0)); draw(reverse(g),Arrow(Relative(0.55)));  File: asy-faq.info, Node: Question 5.3, Next: Question 5.4, Previous: Question 5.2, Up: Section 5 Question 5.3. How do I change the size of all arrows? To override the arrowsize you can give every Arrow drawing attribute a real size argument. If you want to do this globally, you can override the pen-dependent arrowsize function like this: DefaultHead.size=new real(pen p=currentpen) {return 2mm;};  File: asy-faq.info, Node: Question 5.4, Next: Question 6.1, Previous: Question 5.3, Up: Section 5 Question 5.4. Can I create other arrowhead styles? Yes, you can build custom arrowheads like this (see the predefined arrowhead styles in plain_arrows.asy for further examples): arrowhead DotHead; DotHead.head=new path(path g, position position=EndPoint, pen p=currentpen, real size=0, real angle=arrowangle) { if(size == 0) size=DotHead.size(p); bool relative=position.relative; real position=position.position.x; if(relative) position=reltime(g,position); path r=subpath(g,position,0); pair x=point(r,0); real t=arctime(r,size); pair y=point(r,t); return circle(0.5(x+y),0.5size); }; size(100); draw((0,0)..(1,1)..(2,0),Arrow(DotHead)); dot((2,0),red); If you submit your alternate arrowheads to the Forum or the Patch Tracking System, we'll consider including them in a future release.  File: asy-faq.info, Node: Section 6, Next: Section 7, Previous: Section 5, Up: Top Questions about 2D graphs * Menu: * Question 6.1:: How can I draw x axis ticks on the right side, with the tick labels on the left side (relative to the axis path)? * Question 6.2:: How can I reposition the x axis label to three-quarters along the axis length? * Question 6.3:: How can I move the x axis label down 10bp? * Question 6.4:: Can I use different pens for the axis, the axis label, and the tick labels? * Question 6.5:: How can I change the font type of the axes label? * Question 6.6:: How can I change the font type of the tick labels on an axis? * Question 6.7:: How can I prevent axes tick labels from rendering on top of each other? * Question 6.8:: How do I make the plot region of a graph, ignoring labels and legends, have a fixed size? * Question 6.9:: How can I plot a function f(x) within [0,1]x[0,2] without explicitly calculating the x values for which f(x) hits the boundary? * Question 6.10:: Is it possible to define customized palettes? * Question 6.11:: Is there an easy way to graph factorial functions nicely? * Question 6.12:: How do I indicate that a certain length should be exactly the size I prescribe with no rescaling, within a picture which has its own size? * Question 6.13:: How can I make the y axis display base-2 logarithmic values? * Question 6.14:: How can I align the x axes of two graphs on the same figure? * Question 6.15:: How can I change the direction of the y-axis, such that negatives values are on the upper y-axis? * Question 6.16:: How can I fill a path with a function that defines the color of each location? * Question 6.17:: Is there a way to draw a function that is not explicitly given, such as (y - 2)^2 = x - 1 ? * Question 6.18:: Is it possible to reverse or stretch an axis? * Question 6.19:: Why can't I use the UnFill option to draw graphs with empty markers? * Question 6.20:: How can I force several images to use the same palette range (e.g. the entire 0-255 grayscale range)?  File: asy-faq.info, Node: Question 6.1, Next: Question 6.2, Previous: Question 5.4, Up: Section 6 Question 6.1. How can I draw x axis ticks on the right side, with the tick labels on the left side (relative to the axis path)? import graph; size(250,200,IgnoreAspect); draw(graph(exp,-1,1),red); xaxis("$x$",RightTicks(Label(align=left))); yaxis("$y$",RightTicks);  File: asy-faq.info, Node: Question 6.2, Next: Question 6.3, Previous: Question 6.1, Up: Section 6 Question 6.2. How can I reposition the x axis label to three-quarters along the axis length? import graph; size(250,200,IgnoreAspect); draw(graph(exp,-1,1),red); xaxis(Label("$x$",0.75),LeftTicks); yaxis("$y$",RightTicks);  File: asy-faq.info, Node: Question 6.3, Next: Question 6.4, Previous: Question 6.2, Up: Section 6 Question 6.3. How can I move the x axis label down 10bp? import graph; size(250,200,IgnoreAspect); draw(graph(exp,-1,1),red); xaxis(shift(0,-10)*"$x$",LeftTicks); yaxis("$y$",RightTicks);  File: asy-faq.info, Node: Question 6.4, Next: Question 6.5, Previous: Question 6.3, Up: Section 6 Question 6.4. Can I use different pens for the axis, the axis label, and the tick labels? Yes: import graph; size(300,200,IgnoreAspect); xlimits(-50,50); ylimits(0,100); xaxis(Label("$x$",MidPoint,red),Bottom,blue,LeftTicks(green)); yaxis("$y$",Left,RightTicks);  File: asy-faq.info, Node: Question 6.5, Next: Question 6.6, Previous: Question 6.4, Up: Section 6 Question 6.5. How can I change the font type of the axes label? import graph; size(300,200,IgnoreAspect); xlimits(-50,50); ylimits(0,100); xaxis("x",Bottom,Courier("m","n"),LeftTicks); yaxis("$y$",Left,RightTicks);  File: asy-faq.info, Node: Question 6.6, Next: Question 6.7, Previous: Question 6.5, Up: Section 6 Question 6.6. How can I change the font type of the tick labels on an axis? Tick labels are by default typeset in (TeX) math mode, so to use other fonts you need to override the default tick format: import graph; size(300,200,IgnoreAspect); xlimits(-50,50); ylimits(0,100); xaxis("$x$",Bottom,LeftTicks("%.4g",Courier("m","n")+fontsize(12))); yaxis("$y$",Left,RightTicks);  File: asy-faq.info, Node: Question 6.7, Next: Question 6.8, Previous: Question 6.6, Up: Section 6 Question 6.7. How can I prevent axes tick labels from rendering on top of each other? Either: (i) give LeftTicks/RightTicks/Ticks the arguments beginlabel=false and/or endlabel=false; (ii) explicitly remove specific ticks and their labels (drawing them manually; see http://www.github.com/vectorgraphics/asymptote/base/graph.asy for the definition of NoZero): import graph; size(10cm); real f(real x) {return x^2;} draw(graph(f,-2,2)); xaxis(Ticks(NoZero)); yaxis(Ticks(NoZero)); label("$0$",(0,0),SW); (iii) explicitly remove specific tick labels and draw them manually (see http://www.github.com/vectorgraphics/asymptote/base/graph.asy for the definition of NoZeroFormat): import graph; size(10cm); real f(real x) {return x^2;} draw(graph(f,-2,2)); xaxis(Ticks(NoZeroFormat)); yaxis(Ticks(NoZeroFormat)); label("$0$",(0,0),SW); (iv) use the xasy GUI to move overlapping labels; (v) change the Label argument of LeftTicks, RightTicks, or Ticks to: Label(currentpen+overwrite(Move)) Solution (v) will move labels that might otherwise overwrite a previous label. Other possible overwrite arguments are Allow (allows overlapping labels; the default), Suppress (an overlapping label will not be written at all), SuppressQuiet, and MoveQuiet. The last two achieve the same result as the non-quiet types, but will not notify you which labels are overlapping. See: https://asymptote.sourceforge.io/doc/Pens.html. In the case of a user-specified tick array, you can change which labels get suppressed/moved by changing the order of array entries.  File: asy-faq.info, Node: Question 6.8, Next: Question 6.9, Previous: Question 6.7, Up: Section 6 Question 6.8. How do I make the plot region of a graph, ignoring labels and legends, have a fixed size? Either: i) Specify an explicit unitsize, which overrides any call to size: unitsize(x=1cm,y=2cm); ii) Explicitly tell Asymptote to map the plot region to a specific size: import graph; real[] x={0,1,2,3}; real[] y=x^2; draw(graph(x,y),red); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); size(5cm,5cm,point(SW),point(NE)); label("$f_\mathrm{T}$",point(N),2N); iii) Specify the points in user coordinates that should correspond to a given picture size: import graph; size(250,200,IgnoreAspect); draw(graph(exp,-1,1),red); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); fixedscaling((-1.5,-0.5),(1.5,3.5)); In this example, the user coordinate (-1.5,-0.5) will end up being the lower left corner of the figure and (1.5,3.5) will be the upper right corner. You can use this option to ensure multiple figures have the same scaling and same resulting figure size (just ensure the two coordinates given to fixedscaling() leaves room for any labels). See also https://asymptote.sourceforge.io/doc/Frames-and-pictures.html.  File: asy-faq.info, Node: Question 6.9, Next: Question 6.10, Previous: Question 6.8, Up: Section 6 Question 6.9. How can I plot a function f(x) within [0,1]x[0,2] without explicitly calculating the x values for which f(x) hits the boundary? Call limits with the Crop option before drawing the graph: import graph; size(250,200,IgnoreAspect); draw(graph(exp,-1,1),red); limits((0,0),(1,2),Crop); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); See also https://asymptote.sourceforge.io/doc/graph.html.  File: asy-faq.info, Node: Question 6.10, Next: Question 6.11, Previous: Question 6.9, Up: Section 6 Question 6.10. Is it possible to define customized palettes? Yes, you may generate your own pen[] array. For example: int NColors=32768; pen[] MyPalette=new pen[NColors]; real step=1/(NColors-1.0); // Start at black: rgb(0,0,0) // End at yellow: rgb(1,1,0) for(int i=0; i < NColors; ++i) { real rgval=i*step; MyPalette[i]=rgb(rgval,rgval,0.0); }  File: asy-faq.info, Node: Question 6.11, Next: Question 6.12, Previous: Question 6.10, Up: Section 6 Question 6.11. Is there an easy way to graph factorial functions nicely? The example below shows a continuous function and two methods for placing markers at integer values of x: import graph; size(200,200,IgnoreAspect); real factorial(real t) {return gamma(t+1);} scale(Linear,Log); // Graph the factorial function. draw(graph(factorial,0,10)); // Method 1: Draw nodes, but hide line pair F(int t) {return (t,factorial(t));} // Graph of factorial function from 0 to 10 pair[] z=sequence(F,11); draw(graph(z),invisible,marker(scale(0.8mm)*unitcircle,blue,Fill)); // Method 2: Nongraphing routines require explicit scaling: pair dotloc(int t) {return Scale(F(t));} pair[] dotlocs=sequence(dotloc,11); dot(dotlocs); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks);  File: asy-faq.info, Node: Question 6.12, Next: Question 6.13, Previous: Question 6.11, Up: Section 6 Question 6.12. How do I indicate that a certain length should be exactly the size I prescribe with no rescaling, within a picture which has its own size? Here's an easy way to do this. size(12cm,0); void distance(picture pic=currentpicture, pair A, pair B, Label L="", real n=0, pen p=currentpen) { real d=3mm; path g=A--B; transform T=shift(-n*d*unit(B-A)*I); pic.add(new void(frame f, transform t) { picture opic; path G=T*t*g; draw(opic,Label(L,Center,UnFill(1)),G,p,Arrows(NoFill),Bars,PenMargins); add(f,opic.fit()); }); pic.addBox(min(g),max(g),T*min(p),T*max(p)); } pair A=(0,0), B=(3,3); dot(A); dot(B); distance(A,B,"$\ell$",1);  File: asy-faq.info, Node: Question 6.13, Next: Question 6.14, Previous: Question 6.12, Up: Section 6 Question 6.13. How can I make the y axis display base-2 logarithmic values? See the example https://asymptote.sourceforge.io/gallery/2D graphs/log2graph.asy.  File: asy-faq.info, Node: Question 6.14, Next: Question 6.15, Previous: Question 6.13, Up: Section 6 Question 6.14. How can I align the x axes of two graphs on the same figure? An easy way to do this, if the axes to be aligned have the same scaling and size, is illustrated in the example https://asymptote.sourceforge.io/gallery/2D graphs/alignedaxis.asy. Here is a more general solution to the problem of aligning two arbitrary axes. One fits the second picture to a frame based on the horizontal scaling for the first picture: import graph; real width=15cm; real aspect=0.3; picture pic1,pic2; size(pic1,width,aspect*width,IgnoreAspect); size(pic2,width,aspect*width,IgnoreAspect); scale(pic1,false); scale(pic2,false); real xmin1=6; real xmax1=9; real xmin2=8; real xmax2=16; real a1=1; real a2=0.001; real f1(real x) {return a1*sin(x/2*pi);} real f2(real x) {return a2*sin(x/4*pi);} draw(pic1,graph(pic1,f1,xmin1,xmax1)); draw(pic2,graph(pic2,f2,xmin2,xmax2)); xaxis(pic1,Bottom,LeftTicks()); yaxis(pic1,"$f_1(x)$",Left,RightTicks); xaxis(pic2,"$x$",Bottom,LeftTicks(Step=4)); yaxis(pic2,"$f_2(x)$",Left,RightTicks); yequals(pic1,0,Dotted); yequals(pic2,0,Dotted); pair min1=point(pic1,SW); pair max1=point(pic1,NE); pair min2=point(pic2,SW); pair max2=point(pic2,NE); real scale=(max1.x-min1.x)/(max2.x-min2.x); real shift=min1.x/scale-min2.x; transform t1=pic1.calculateTransform(); transform t2=pic2.calculateTransform(); transform T=xscale(scale*t1.xx)*yscale(t2.yy); add(pic1.fit()); real height=truepoint(N,user=false).y-truepoint(S,user=false).y; add(shift(0,-height)*(shift(shift)*pic2).fit(T));  File: asy-faq.info, Node: Question 6.15, Next: Question 6.16, Previous: Question 6.14, Up: Section 6 Question 6.15. How can I change the direction of the y-axis, such that negatives values are on the upper y-axis? Here is a simple example (see also the example https://asymptote.sourceforge.io/gallery/2D graphs/diatom.asy or the discussion of Linear(-1) in the documentation): import graph; size(250,200,IgnoreAspect); scale(Linear,Linear(-1)); draw(graph(log,0.1,10),red); xaxis("$x$",LeftTicks); yaxis("$y$",RightTicks);  File: asy-faq.info, Node: Question 6.16, Next: Question 6.17, Previous: Question 6.15, Up: Section 6 Question 6.16. How can I fill a path with a function that defines the color of each location? Use functionshade with a PDF tex engine, as illustrated by the example {functionshading.asy}. If you want to produce PostScript output, an approximate solution for now would be to superimpose a fine grid and specify colors to latticeshade that depend on position as a single pen[][] lattice. Alternatively, it may be more efficient to use tensorshade}.  File: asy-faq.info, Node: Question 6.17, Next: Question 6.18, Previous: Question 6.16, Up: Section 6 Question 6.17. Is there a way to draw a function that is not explicitly given, such as (y - 2)^2 = x - 1 ? Yes, use the parametric form y=t x=(t-2)^2+1 See the example https://asymptote.sourceforge.io/gallery/2D graphs/parametricgraph.asy.  File: asy-faq.info, Node: Question 6.18, Next: Question 6.19, Previous: Question 6.17, Up: Section 6 Question 6.18. Is it possible to reverse or stretch an axis? The real scaling argument to Linear is used to stretch (or reverse) the axis. To see the effect of axis stretching, be sure not to specify IgnoreAspect in the picture size command. A secondary axis has the same length as the primary axis, so stretching cannot have any effect. But one can still reverse the axis, with Linear(-1).  File: asy-faq.info, Node: Question 6.19, Next: Question 6.20, Previous: Question 6.18, Up: Section 6 Question 6.19. Why can't I use the UnFill option to draw graphs with empty markers? UnFill won't work here because it only affects the local frame the markers are initially drawn on, before being added to currentpicture. Here is a way of achieving the desired effect (assuming a white background): import graph; size(10cm,0); pair[] z={(0,0),(0.5,0.5),(1,1)}; path g=graph(z); draw(shift(0,.5)*g,marker(scale(5)*unitcircle,FillDraw(white))); xaxis(BottomTop,LeftTicks); yaxis(LeftRight,RightTicks);  File: asy-faq.info, Node: Question 6.20, Next: Question 7.1, Previous: Question 6.19, Up: Section 6 Question 6.20. How can I force several images to use the same palette range (e.g. the entire 0-255 grayscale range)? The palette color space corresponds to a range of values specified by the argument range, which can be Full, Automatic or an explicit range Range(pair min, pair max). Here Full} specifies a range varying from the minimum to maximum values of the function over the sampling interval, while Automatic selects "nice" limits.  File: asy-faq.info, Node: Section 7, Next: Section 8, Previous: Section 6, Up: Top Questions about programming * Menu: * Question 7.1:: Is Asymptote an interpreter or a compiler? * Question 7.2:: What is the difference between a frame and a picture? * Question 7.3:: What is the difference between a path and a guide? * Question 7.4:: What is a convenient way to declare and initialize an array of pictures? * Question 7.5:: Is there a way to define functions that act on arrays in general (i.e. work for arrays of any type)? * Question 7.6:: Is there any way to declare structures ahead of their definition, e.g. where struct A performs some operation on struct B, but B contains an A member? * Question 7.7:: Where are static variables in for loops allocated? * Question 7.8:: Is there a debugger for asy? * Question 7.9:: Do you accept patches for Asymptote?  File: asy-faq.info, Node: Question 7.1, Next: Question 7.2, Previous: Question 6.20, Up: Section 7 Question 7.1. Is Asymptote an interpreter or a compiler? Asymptote compiles Asymptote commands into its own virtual machine code. It then runs this pseudocode on a virtual machine to produce PostScript code.  File: asy-faq.info, Node: Question 7.2, Next: Question 7.3, Previous: Question 7.1, Up: Section 7 Question 7.2. What is the difference between a frame and a picture? Frames are canvases for drawing in PostScript coordinates. While working with frames directly is occasionally necessary for constructing deferred drawing routines, pictures are usually more convenient to work with. See *Note Question 8.8:: `In MetaPost, it is possible to have a drawing remain the same size in different pictures by defining a unit u and explicitly multiply all the coordinates by u. Is there a better way to do this in Asymptote?'.  File: asy-faq.info, Node: Question 7.3, Next: Question 7.4, Previous: Question 7.2, Up: Section 7 Question 7.3. What is the difference between a path and a guide? A path is a cubic spline with fixed endpoint conditions. A guide is an unresolved cubic spline (list of cubic-spline nodes and control points). A guide is like a path except that the computation of the cubic spline is deferred until drawing time (when it is resolved into a path); this allows two guides with free endpoint conditions to be joined together smoothly.  File: asy-faq.info, Node: Question 7.4, Next: Question 7.5, Previous: Question 7.3, Up: Section 7 Question 7.4. What is a convenient way to declare and initialize an array of pictures? You could write yourself a routine such as: picture[] picture(int n) { picture[] pic; for(int i=0; i < n; ++i) { pic[i]=new picture; size(pic[i],19cm,0); } return pic; } picture[] pic=picture(6);  File: asy-faq.info, Node: Question 7.5, Next: Question 7.6, Previous: Question 7.4, Up: Section 7 Question 7.5. Is there a way to define functions that act on arrays in general (i.e. work for arrays of any type)? Generic types aren't yet implemented. But for now you can at least say typedef string T; include F; typedef real T; include F; where F.asy contains some type-dependent code like T[] operator $(T A, T B) {return new T[] {A,B};}  File: asy-faq.info, Node: Question 7.6, Next: Question 7.7, Previous: Question 7.5, Up: Section 7 Question 7.6. Is there any way to declare structures ahead of their definition, e.g. where struct A performs some operation on struct B, but B contains an A member? Asymptote does not support forward declaration of types. You can, however, nest structures, so that both types are visible for parts of the bodies of both structure definitions. For example: struct B { typedef void someroutine(B b); static struct A { someroutine routine; void operator init(someroutine routine) { this.routine=routine; } } string test="Testing"; } typedef B.A A; A a=B.A(new void(B b){write(b.test);}); B b; a.routine(b);  File: asy-faq.info, Node: Question 7.7, Next: Question 7.8, Previous: Question 7.6, Up: Section 7 Question 7.7. Where are static variables in for loops allocated? In the example void f() { for(int i=0; i < 3; ++i) { static int n; ++n; write(n); } } f(); // Writes 1, 2, 3 the static qualifier means that n is allocated not just outside of the for loop, but also outside the function. This is clear if you call f multiple times; there is still only one instance of n. The "level" of a variable (where it is allocated) has nothing to do with the "scope" of a variable (how long it can be referred to by name). The curly braces enclosing a block affect only a variable's scope, not its level. Static modifiers are meaningless at the top level; they generate a warning and are simply ignored: for(int i=0; i < 3; ++i) { static int n; ++n; write(n); } // Writes warning about top-level static modifier and then 1, 1, 1 Since version 1.22, non-static variables allocated in a loop body are allocated anew every iteration. This is only noticable in obscure cases where a variable in a loop is accessed in the closure of a function defined in the loop: int f(); for(int i=0; i < 10; ++i) { int j=10*i; if(i == 5) f=new int() {return j;}; } write(f()); // Writes 50 Variables in the body of a loop last as long as that iteration of the loop, unless they are kept alive by a function closure as in the example above. In a function body, variables will last at least as long as the function call, though because of closures and garbage collection, they may last longer than that. If defined at the top level of a file or at the interactive prompt, they will last at least until the end of the file or prompt's run.  File: asy-faq.info, Node: Question 7.8, Next: Question 7.9, Previous: Question 7.7, Up: Section 7 Question 7.8. Is there a debugger for asy? Yes, Asymptote includes a line-based debugger: https://asymptote.sourceforge.io/doc/Debugger.html  File: asy-faq.info, Node: Question 7.9, Next: Question 8.1, Previous: Question 7.8, Up: Section 7 Question 7.9. Do you accept patches for Asymptote? Yes, in fact we would prefer that users submit patches for customized features (to http://sourceforge.net/tracker/?atid=685685&group_id=120000) instead of relying on us to do all of the coding. Development will proceed faster that way.  File: asy-faq.info, Node: Section 8, Next: Section 9, Previous: Section 7, Up: Top Questions about differences between Asymptote and MetaPost * Menu: * Question 8.1:: What is the equivalent of the MetaPost c[a,b] interpolation operator? * Question 8.2:: How does picture scaling differ in Asymptote and MetaPost? * Question 8.3:: How can I avoid automatic scaling of a picture? * Question 8.4:: What is the equivalent of MetaPost ... command? * Question 8.5:: What is the equivalent of the MetaPost pickup command? * Question 8.6:: What is the equivalent of the MetaPost whatever command? * Question 8.7:: What is the equivalent for the MetaPost command for lray - horiz*v - verti*u = whatever*(LightSource - R), a system of three linear equations for three unknowns: horiz, verti, whatever? * Question 8.8:: In MetaPost, it is possible to have a drawing remain the same size in different pictures by defining a unit u and explicitly multiply all the coordinates by u. Is there a better way to do this in Asymptote? * Question 8.9:: In MetaPost, one could produce tiling pictures by generating a picture, and then clipping the picture to a rectangle of fixed dimensions around the center of the picture. How is that done in Asymptote?  File: asy-faq.info, Node: Question 8.1, Next: Question 8.2, Previous: Question 7.9, Up: Section 8 Question 8.1. What is the equivalent of the MetaPost c[a,b] interpolation operator? interp(a,b,c);  File: asy-faq.info, Node: Question 8.2, Next: Question 8.3, Previous: Question 8.1, Up: Section 8 Question 8.2. How does picture scaling differ in Asymptote and MetaPost? Asymptote includes an optional facility to do automatic scaling of pictures to achieve a given overall picture size, whereas Metapost only supports manual scaling. Asymptote defers drawing of objects drawn to pictures and distinguishes between true-size objects and objects that should scale with the picture size. The resulting linear programming problem is solved via the Simplex method. See the https://asymptote.sourceforge.io/gallery/dimension.asy example for an example of how deferred drawing is used to accomodate both user and true-size (PostScript) coordinates.  File: asy-faq.info, Node: Question 8.3, Next: Question 8.4, Previous: Question 8.2, Up: Section 8 Question 8.3. How can I avoid automatic scaling of a picture? If you really like Metapost-style manual (hard-wired) scaling either: (i) use the default size(0,0) for the entire picture and do all of the scaling by hand, just like in MetaPost; (ii) draw to a separate picture pic and add(pic.fit()); (iii) use frames.  File: asy-faq.info, Node: Question 8.4, Next: Question 8.5, Previous: Question 8.3, Up: Section 8 Question 8.4. What is the equivalent of MetaPost ... command? The connector :: is a macro for tension atleast 1: size(100); pair z0=(0,0); pair z1=(1,0.25); pair z2=(2,0); draw(z0{up}::z1{right}::z2{down});  File: asy-faq.info, Node: Question 8.5, Next: Question 8.6, Previous: Question 8.4, Up: Section 8 Question 8.5. What is the equivalent of the MetaPost pickup command? Just say, for example: currentpen=red;  File: asy-faq.info, Node: Question 8.6, Next: Question 8.7, Previous: Question 8.5, Up: Section 8 Question 8.6. What is the equivalent of the MetaPost whatever command? Asymptote does not implicitly solve linear equations and therefore does not have the notion of a whatever unknown. Such a facility could certainly be added (perhaps using the notation ?= since = means assignment). However, the most common uses of whatever in MetaPost are covered by functions like extension in math.asy: pair extension(pair P, pair Q, pair p, pair q); this returns the intersection point of the extensions of the line segments PQ and pq. We find using routines like extension more explicit and less confusing to new users. But we could be persuaded to add something similar if someone can justify the need. In the meantime, one can always use the explicit built-in linear solver solve (see https://asymptote.sourceforge.io/doc/solve.html), which uses LU decomposition.  File: asy-faq.info, Node: Question 8.7, Next: Question 8.8, Previous: Question 8.6, Up: Section 8 Question 8.7. What is the equivalent for the MetaPost command for lray - horiz*v - verti*u = whatever*(LightSource - R), a system of three linear equations for three unknowns: horiz, verti, whatever? Since horiz*v+verti*u spans a plane, you could use real intersect(vector P, vector Q, vector n, vector Z); to find the intersection time for the line lray-whatever*(LightSource - R) and then extract the three desired values from there. (You'll still need to use the built-in explicit linear solver to solve a 2x2 system to get horiz and verti.)  File: asy-faq.info, Node: Question 8.8, Next: Question 8.9, Previous: Question 8.7, Up: Section 8 Question 8.8. In MetaPost, it is possible to have a drawing remain the same size in different pictures by defining a unit u and explicitly multiply all the coordinates by u. Is there a better way to do this in Asymptote? Yes, Asymptote has a better way: you definitely don't want to manually scale all of your coordinates. To make the user coordinates represent multiples of exactly 1cm: unitsize(1cm); draw(unitsquare); One can also specify different x and y unit sizes: unitsize(x=1cm,y=2cm); draw(unitsquare); Another way is to draw your fixed size object to a frame and add it to currentpicture like this: path p=(0,0)--(1,0); frame object; draw(object,scale(100)*p); add(object); add(object,(0,-10)); To understand the difference between frames and pictures, try this: size(300,300); path p=(0,0)--(1,0); picture object; draw(object,scale(100)*p); add(object); add(object,(0,-10)); // Adds truesize object to currentpicture  File: asy-faq.info, Node: Question 8.9, Next: Question 9.1, Previous: Question 8.8, Up: Section 8 Question 8.9. In MetaPost, one could produce tiling pictures by generating a picture, and then clipping the picture to a rectangle of fixed dimensions around the center of the picture. How is that done in Asymptote? If you are using currentpicture the way one would in MetaPost (drawing in raw PostScript coordinates), you can simply do something like: fill((0,0)--(100,100)--(200,0)--cycle); pair center(picture pic=currentpicture) {return 0.5*(pic.min()+pic.max());} real height=100; real width=100; pair delta=0.5(width,height); pair c=center(); clip(box(c-delta,c+delta)); However, drawing in PostScript coordinates is often inconvenient. Here's the Asymptote way of doing the same thing, using deferred drawing: size(200,100); fill((0,0)--(1,1)--(2,0)--cycle); void clip(picture pic=currentpicture, real width, real height) { pic.clip(new void (frame f, transform) { pair center=0.5(min(f)+max(f)); pair delta=0.5(width,height); clip(f,box(center-delta,center+delta)); }); } clip(100,100); See also the discussion of tilings in the documentation: https://asymptote.sourceforge.io/doc/Pens.html.  File: asy-faq.info, Node: Section 9, Previous: Section 8, Up: Top Questions about output * Menu: * Question 9.1:: How can I disable automatic invocation of the PS viewer after an asy file is done processing? * Question 9.2:: How do I output jpeg images? * Question 9.3:: Can I embed bitmaps (photos) into my drawings and position and scale them? * Question 9.4:: Does Asymptote support direct PDF output? * Question 9.5:: How to I produce large pictures of high quality in raster format (e.g. png, giff etc). * Question 9.6:: Is it possible to produce multi-page documents with asymptote?  File: asy-faq.info, Node: Question 9.1, Next: Question 9.2, Previous: Question 8.9, Up: Section 9 Question 9.1. How can I disable automatic invocation of the PS viewer after an asy file is done processing? It's actually not on by default, unless you happen to be using Microsoft Windows (because that is what most Microsoft Windows users expect). Microsoft Windows users can turn this feature off with the command-line option -noV or by putting import settings; interactiveView=false; batchView=false; in their config.asy file. See https://asymptote.sourceforge.io/doc/Options.html.  File: asy-faq.info, Node: Question 9.2, Next: Question 9.3, Previous: Question 9.1, Up: Section 9 Question 9.2. How do I output jpeg images? If you have the ImageMagick convert program installed, simply type asy -f jpg test.asy  File: asy-faq.info, Node: Question 9.3, Next: Question 9.4, Previous: Question 9.2, Up: Section 9 Question 9.3. Can I embed bitmaps (photos) into my drawings and position and scale them? Convert them to eps format and use the graphic(string) function just like a Label: label(graphic("file"),(0,0)); See the example https://asymptote.sourceforge.io/gallery/orthocenter.asy and https://asymptote.sourceforge.io/doc/label.html.  File: asy-faq.info, Node: Question 9.4, Next: Question 9.5, Previous: Question 9.3, Up: Section 9 Question 9.4. Does Asymptote support direct PDF output? Yes, PDF output can be produced by the -f pdf option or -tex pdflatex option. This supports transparency, annotations, embedded movies, and U3D/PRC content.  File: asy-faq.info, Node: Question 9.5, Next: Question 9.6, Previous: Question 9.4, Up: Section 9 Question 9.5. How to I produce large pictures of high quality in raster format (e.g. png, giff etc). Try using some of the options to convert, mainly -geometry and -density. For example: convert -geometry 1000x3000 example.eps example.png You can also change the default resolution of the image with: convert -geometry 1000x3000 -density 300 -units PixelsPerInch example.eps example.png This does not change the number of pixels in the image, but just gives a hint as to how large each pixel should be displayed. If you include the -density option without the -geometry option, convert will keep the image size constant (so a 4cm x 3cm eps figure will generate a 4cm x 3cm png image).  File: asy-faq.info, Node: Question 9.6, Previous: Question 9.5, Up: Section 9 Question 9.6. Is it possible to produce multi-page documents with asymptote? Yes, simply call the newpage() function. This is used by the slide.asy package to produce high-quality slide presentations (easier to use than Prosper). asymptote-3.05/doc/FAQ/install-sh0000755000000000000000000003253715031566105015360 0ustar rootroot#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: asymptote-3.05/doc/FAQ/m-html.pl0000644000000000000000000002313615031566105015102 0ustar rootroot## HTML output # Copyright (C) 1993-1995 Ian Jackson. # Modified by John Bowman 02Sep06: simply docref usage # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # It is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with GNU Emacs; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # (Note: I do not consider works produced using these BFNN processing # tools to be derivative works of the tools, so they are NOT covered # by the GPL. However, I would appreciate it if you credited me if # appropriate in any documents you format using BFNN.) use POSIX; %saniarray= ('<','lt', '>','gt', '&','amp', '"','quot'); sub html_init { $html_prefix = './'.$prefix; $html_prefix =~ s:^\.//:/:; system('rm','-r',"$html_prefix.html"); system('mkdir',"$html_prefix.html"); open(HTML,">$html_prefix.html/index.html"); print HTML "\n"; print HTML "\n"; $html_needpara= -1; $html_end=''; my $epoch=$ENV{SOURCE_DATE_EPOCH} || time; $html_date=POSIX::strftime("%Y-%m-%d", gmtime($epoch)); $html_year=POSIX::strftime("%Y", gmtime($epoch)); } sub html_startup { print HTML < $user_title

$user_title

END &html_readrefs($_[0]); if (length($user_copyrightref)) { local ($refn) = $qrefn{$user_copyrightref}; if (!length($refn)) { warn "unknown question (copyright) `$user_copyrightref'"; } $refn =~ m/(\d+)\.(\d+)/; local ($s,$n) = ($1,$2); $html_copyrighthref= ($s == $html_sectionn)?'':"section$s.html"; $html_copyrighthref.= "#$qn2ref{$s,$n}"; } } sub html_close { print HTML $html_end,"
\n$user_author\n"; print HTML "- $html_date\n

\n"; print HTML "Extracted from $user_title,\n"; print HTML "" if length($html_copyrighthref); print HTML "Copyright © $html_year $user_copyholder."; print HTML "" if length($html_copyrighthref); print HTML "\n\n"; close(HTML); } sub html_startmajorheading { local ($ref, $this,$next,$back) = @_; local ($nextt,$backt); $this =~ s/^Section /section/; $html_sectionn= $ref; $next =~ s/^Section /section/ && ($nextt= $sn2title{$'}); $back =~ s/^Section /section/ ? ($backt= $sn2title{$'}) : ($back=''); if ($html_sectionn) { &html_close; open(HTML,">$html_prefix.html/$this.html"); print HTML "\n"; print HTML "\n"; $html_end= "
\n"; $html_end.= "Next: $nextt.
\n" if $next; $html_end.= "Back: $backt.
\n" if $back; $html_end.= ""; $html_end.= "Return to contents.

\n"; print HTML < $user_brieftitle - Section $html_sectionn END print HTML "" if $next; print HTML "" if $back; print HTML <

$user_brieftitle - Section $html_sectionn
END $html_needpara= -1; } else { print HTML "\n

\n"; $html_needpara=-1; } } sub html_endmajorheading { print HTML "\n

\n\n"; $html_needpara=-1; } sub html_startminorheading { local ($ref, $this) = @_; $html_needpara=0; $this =~ m/^Question (\d+)\.(\d+)/; local ($s,$n) = ($1,$2); print HTML "\n

\n"; } sub html_endminorheading { print HTML "\n

\n\n"; $html_needpara=-1; } sub html_newsgroup { &arg('newsgroup'); } sub html_endnewsgroup { &endarg('newsgroup'); } sub html_do_newsgroup { print HTML "$_[0]"; } sub html_email { &arg('email'); } sub html_endemail { &endarg('email'); } sub html_do_email { print HTML "$_[0]"; } sub html_courier { print HTML "" ; } sub html_endcourier { print HTML ""; } sub html_italic { print HTML "" ; } sub html_enditalic { print HTML "" ; } sub html_docref { &arg('docref'); } sub html_enddocref { &endarg('docref'); } sub html_do_docref { if (!defined($html_refval{$_[0]})) { # Modified by John Bowman 02Sep06: interpret the argument as an html reference # warn "undefined HTML reference $_[0]"; # $html_refval{$n}='UNDEFINED'; print HTML ""; } else { print HTML ""; } &recurse($_[0]); print HTML ""; } sub html_readrefs { local ($p); open(HTMLREFS,"<$_[0]") || (warn("failed to open HTML refs $_[0]: $!"),return); while() { next if m/^\\\s/; s/\s*\n$//; if (s/^\\prefix\s*//) { $p= $'; next; } elsif (s/^\s*(\S.*\S)\s*\\\s*//) { $_=$1; $v=$'; s/\\\\/\\/g; $html_refval{$_}= $p.$v; } else { warn("cannot understand line in HTML refs >$_<"); } } close(HTMLREFS); } sub html_ftpsilent { &arg('ftpsilent'); } sub html_endftpsilent { &endarg('ftpsilent'); } sub html_do_ftpsilent { if ($_[0] =~ m/:/) { $html_ftpsite= $`; $html_ftpdir= $'.'/'; } else { $html_ftpsite= $_[0]; $html_ftpdir= ''; } } sub html_ftpon { &arg('ftpon'); } sub html_endftpon { &endarg('ftpon'); } sub html_do_ftpon { #print STDERR "ftpon($_[0])\n"; $html_ftpsite= $_[0]; $html_ftpdir= ''; print HTML ""; &recurse($_[0]); print HTML ""; } sub html_ftpin { &arg('ftpin'); } sub html_endftpin { &endarg('ftpin'); } sub html_do_ftpin { #print STDERR "ftpin($_[0])\n"; print HTML ""; &recurse($_[0]); print HTML ""; } sub html_text { print HTML "\n

\n" if $html_needpara > 0; $html_needpara=0; $html_stuff= &html_sanitise($_[0]); while ($html_stuff =~ s/^(.{40,70}) //) { print HTML "$1\n"; } print HTML $html_stuff; } sub html_tab { $htmltabignore++ || warn "html tab ignored"; } sub html_newline { print HTML "
\n" ; } sub html_startverbatim { print HTML "

\n"   ;                       }
sub html_verbatim      { print HTML &html_sanitise($_[0]),"\n";         }
sub html_endverbatim   { print HTML "
\n" ; $html_needpara= -1; } sub html_endpara { $html_needpara || $html_needpara++; } sub html_finish { &html_close; } sub html_startindex { print HTML "
    \n"; } sub html_endindex { print HTML "

\n"; } sub html_startindexitem { local ($ref,$qval) = @_; $qval =~ m/Q(\d+)\.(\d+)/; local ($s,$n) = ($1,$2); print HTML "
  • Q$s.$n. "; $html_indexunhead=''; } sub html_startindexmainitem { local ($ref,$s) = @_; $s =~ m/\d+/; $s= $&; print HTML "

    " if ($s > 1); print HTML "
  • Section $s. "; $html_indexunhead=''; } sub html_endindexitem { print HTML "$html_indexunhead\n"; } sub html_startlist { print HTML "\n"; $html_itemend="
      "; } sub html_endlist { print HTML "$html_itemend\n
    \n"; $html_needpara=-1 } sub html_item { print HTML "$html_itemend\n
  • "; $html_itemend=""; $html_needpara=-1; } sub html_startpackedlist { print HTML "\n"; $html_itemend=""; } sub html_endpackedlist { print HTML "$html_itemend\n\n"; $html_needpara=-1; } sub html_packeditem { print HTML "$html_itemend\n
  • "; $html_itemend=""; $html_needpara=-1; } sub html_startindent { print HTML "
    \n"; } sub html_endindent { print HTML "
    \n"; } sub html_pageref { local ($ref,$sq) = @_; $sq =~ m/(\d+)\.(\d+)/; local ($s,$n) = ($1,$2); print HTML "Q$sq \`"; } sub html_endpageref { print HTML "'"; } sub html_sanitise { local ($in) = @_; local ($out); while ($in =~ m/[<>&"]/) { $out.= $`. '&'. $saniarray{$&}. ';'; $in=$'; } $out.= $in; $out; } 1; asymptote-3.05/doc/FAQ/m-ascii.pl0000644000000000000000000001115615031566105015225 0ustar rootroot## ASCII output # Copyright (C) 1993-1995 Ian Jackson. # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # It is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with GNU Emacs; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # (Note: I do not consider works produced using these BFNN processing # tools to be derivative works of the tools, so they are NOT covered # by the GPL. However, I would appreciate it if you credited me if # appropriate in any documents you format using BFNN.) sub ascii_init { open(ASCII,">$prefix.ascii"); } sub ascii_startmajorheading { print ASCII '='x79,"\n\n"; $ascii_status= 'h'; &ascii_text($_[0] ? "Section $_[0]. " : ''); } sub ascii_startminorheading { print ASCII '-'x79,"\n\n"; $ascii_status= 'h'; } sub ascii_italic { &ascii_text('*'); } sub ascii_enditalic { $ascii_para .= '*'; } sub ascii_email { &ascii_text('<'); } sub ascii_endemail { &ascii_text('>'); } sub ascii_ftpon { } sub ascii_endftpon { } sub ascii_ftpin { } sub ascii_endftpin { } sub ascii_docref { } sub ascii_enddocref { } sub ascii_courier { } sub ascii_endcourier { } sub ascii_newsgroup { } sub ascii_endnewsgroup { } sub ascii_ftpsilent { $ascii_ignore++; } sub ascii_endftpsilent { $ascii_ignore--; } sub ascii_text { return if $ascii_ignore; if ($ascii_status eq '') { $ascii_status= 'p'; } $ascii_para .= $_[0]; } sub ascii_tab { local ($n) = $_[0]-length($ascii_para); $ascii_para .= ' 'x$n if $n>0; } sub ascii_newline { return unless $ascii_status eq 'p'; &ascii_writepara; } sub ascii_writepara { local ($thisline, $thisword, $rest); for (;;) { last unless $ascii_para =~ m/\S/; $thisline= $ascii_indentstring; for (;;) { last unless $ascii_para =~ m/^(\s*\S+)/; unless (length($1) + length($thisline) < 75 || length($thisline) == length($ascii_indentstring)) { last; } $thisline .= $1; $ascii_para= $'; } $ascii_para =~ s/^\s*//; print ASCII $thisline,"\n"; $ascii_indentstring= $ascii_nextindent; last unless length($ascii_para); } $ascii_status= ''; $ascii_para= ''; } sub ascii_endpara { return unless $ascii_status eq 'p'; &ascii_writepara; print ASCII "\n"; } sub ascii_endheading { $ascii_para =~ s/\s*$//; print ASCII "$ascii_para\n\n"; $ascii_status= ''; $ascii_para= ''; } sub ascii_endmajorheading { &ascii_endheading(@_); } sub ascii_endminorheading { &ascii_endheading(@_); } sub ascii_startverbatim { $ascii_vstatus= $ascii_status; &ascii_writepara; } sub ascii_verbatim { print ASCII $_[0],"\n"; } sub ascii_endverbatim { $ascii_status= $ascii_vstatus; } sub ascii_finish { close(ASCII); } sub ascii_startindex { $ascii_status= ''; } sub ascii_endindex { $ascii_status= 'p'; } sub ascii_endindexitem { printf ASCII " %-11s %-.66s\n",$ascii_left,$ascii_para; $ascii_status= 'p'; $ascii_para= ''; } sub ascii_startindexitem { $ascii_left= $_[1]; } sub ascii_startindexmainitem { $ascii_left= $_[1]; print ASCII "\n" if $ascii_status eq 'p'; } sub ascii_startindent { $ascii_istatus= $ascii_status; &ascii_writepara; $ascii_indentstring= " $ascii_indentstring"; $ascii_nextindent= " $ascii_nextindent"; } sub ascii_endindent { $ascii_indentstring =~ s/^ //; $ascii_nextindent =~ s/^ //; $ascii_status= $ascii_istatus; } sub ascii_startpackedlist { $ascii_plc=0; } sub ascii_endpackedlist { &ascii_newline if !$ascii_plc; } sub ascii_packeditem { &ascii_newline if !$ascii_plc; &ascii_tab($ascii_plc*40+5); $ascii_plc= !$ascii_plc; } sub ascii_startlist { &ascii_endpara; $ascii_indentstring= " $ascii_indentstring"; $ascii_nextindent= " $ascii_nextindent"; } sub ascii_endlist { &ascii_endpara; $ascii_indentstring =~ s/^ //; $ascii_nextindent =~ s/^ //; } sub ascii_item { &ascii_newline; $ascii_indentstring =~ s/ $/* /; } sub ascii_pageref { &ascii_text("Q$_[1] \`"); } sub ascii_endpageref { &ascii_text("'"); } 1; asymptote-3.05/doc/asy-latex.pdf0000644000000000000000000062631715031566650015361 0ustar rootroot%PDF-1.7 %ÐÔÅØ 5 0 obj << /Length 1908 /Filter /FlateDecode >> stream xÚ•XYÛ6~ϯÐ[d`­I-ú´Ù¢E…‹Ø¨V¢m!²äêXÇòß;uØ+é‹E‡œ™oíZ;˵~~å.|ßn^Ý?x¡#…ïY›­%=áH)­ ðÖ&³íÍ^¯þÞü ¼rÊû¸V®´“æ|8¶UÛ³ˆ—,Ç$]ÉÐþ´ò}×3*K'ö}‰ŒkO9¡ò­µŒœ(–,÷×j_®ÖJöÛ 8’òŽ ›U$ìêÀ“÷u^¦Ú¬$e†ƒÐþ+/ &ýQ=­Ö@ÑuÛT%Š·‚Ø „qž#K“®ôî]y/ƒÕZÄ~d? GEÈý¸û_Y‘J¨¼‚CBa­•ïDϧ½yjÚ:IÛ¥ýr²-²H(ø VØ£ž7«µŒ_„ø…„kÀ$¶ŸóL[hç%Z½«“6;‰­Úö‹E^š­ôçV×eRðìÍÔ“ ‹r"‰:¹à¥˜u‚£û<Ê“ö)o÷9zÈSvŸߌs}Ëwâ0 мЇx–t\ð9ƒÃ\ (àÀ!#׆ôðÁA1háĆünB©X~V§#;íšÑpŒ¨Ðž£¼@Àa¢À8 HsÄ€™ ’ãtbϤ‚€ØÒ·aðÁ¾Y—â$JI+«$ÙÛ¥ÅÔ§*ôí|%l3l!½`à])Ù­ñ#2m«š™ ·ßC­„t*BqÂ÷ßf°¾Ð Œæ±ö)áù—`#}BþÀºŒ‰Œ‰íGI¤êU¸Ðå‘N:AT¡É{¶-IÓêpLÊ\7&CˆB”5× Ö‚¡Pj¹4ÍêÏ:ååŽ Wz:«µçyöÃ*R6Á ,Û®†ãÌ$Óm’ OÈS!wæÐB'‘ØhxvÞ’_MäL•]t.lÏËyèàÀ:ç˜mçà³g#ü*l¥ Û?2nÎÁÉçqûXŽ1l•$Þîôqÿ7šðûi(.Gx^Q%ãî£ ƒêˆF6ó‰!"GÅã "jEÇOƒŠèòè' ”þ„ÚÌÈ×H¨˜Ð ¥IËDÔÏðçýÝ,Þžðû:9§tv=»“%µIº_pÑÚ“ZÙ{&À\Jš”)± Z»¶¹¾xÒèÖ¬÷ß?ó­ãVgCÛϧ&žöQ(b íŽ_Œò\¶1)p/¨—ž½<7’PÞfÚ_çq!ÝárÏîÐĈ’©Í‘rF§ùGWx:›ƒ+/³.Á.)Š3æ5݃ô¥ò€Ö¯9œ%õŽs8 cÅ_˜4^„É8km¦¬~Îëªì3ÜH¯oKÑez!C¦aÁQ¶c¦ÇÞU5Ü,xYIy+ªq™ÂfIÙ]ƒýR‡‚÷Úþác^óìÀ-Ó<=AõÔO&Y&Y–ñl踜Oõ75jO)þŒ?x$4`àÀË´=E2䀰 sw" •&”ÈMM‰o"×Î!×ã¶Gœ/Êô°~æQRíÒÊÔq€d62¹=¢Üìßñv9åœÿœ’4˜\]8,œ‘,4ºØ®I`Ø z„]—°K€#ŽEÄp ÃJÖ乬iú›'Ó= ÃÅCÈÇpɾ@æÿ‡¢ŒãeÞ .„"Xc¢¦ÕÕwDvït©¡½%ûã)\ÈÜVL}bƒx¢¸ß²¬ßÙ÷®8fá€÷ û§‡™5vu _q‘»XSUØ›¸Í -çí„ýcOïã-÷=D‰;é)ྱX–úË]ænDb£ b‚õçù–¿gd­:> Bo&ë3ôn× Œië pßr¢òÆz¢ÌeÉÉÇkjˆ´ÔDUe’_gcÀ-ɽUÇŒ\paUÞ M }ä½À’ˆµ©jpL—Rµi8ÿíòÖ0%L¡,è¨{ÿ¾äuLd¨ºöصLà ¬ÐÍb ÞÀƒ÷ #§^gÏüO¦ÇAþLo“®hyëÀbP¦µæ„P¾0•Oöõ ´Of”å}[ÕgæH&œ³ï‰ZJx¼àKA~Ó{B^¿'¼o}O ŠsÅWöñæ¥M:s6Â_ n†.$ôfA0ô/‡ØÁ‡èf’Tùð‘Hž(w O•]”Ÿgg|$`[^ ׸M“¦I ±IÙž™Â+ÑàOÐÇ)=çH„é a› ¦÷±@{5.• ¥|1_b¿ïî@ø|ÎÀ«è+Ör'o"Ø­?'¨H³BpY cY*+D¦B”¦%øpÈ¡k¨þ®ëɃ¸DkxgŒk:võ߬©ØÖ5çöp¼Ÿí¿ï.®2obPO<)2^;Õy»\€Ðî “mø +ðuùfÍu=o ú ¦Í¹ñ¡b¹ð]óŠ è ºøG.XhU„í–œŽY‡wrÃX`^如SunÞÆaxãâ úãÙª5Û.wGÿö®¯> stream xÚko›Hð{ñ©PXƒïªJi›ÜõtU+u¥ù°†µ‚ÁÇ#®Uå¿ßÌÎ`’¦ŸØÇ¼vÞƒg­,Ïúõ…Çß·ó¯®ÂÈò}w†Âš/-_J7‘yS×3kžZ×¶pÅÄñ}ÚïÊÍFi=q‚(´—eE‹¬¨uÕdÅŠ¶õ~³mÊFÓvU©í:KêÉÍü÷WW°fîl*¦Èγ?vƒ˜Í×efoTVà*¶u1±}—Ue±¡uC ©þâù²Ð)Á-ðjOW ‘‰í­Jðøv†¶ZñaV¡ŒDa|"ѵQõ~@Úkƒ7 ÑK 8óìNæ¼v""{4ÌQÁSzãbèj¡šlàžè©Ëóí¤œ8’òÖˆ PÛ\%æ±pÖ¬UC«]–çt¿¬ÈÖ´IÊÍ6Ë;p²¯t¡+ņ‚ E6POÚ¤5O Vi í´4|’Ö¼=²wâH)í«I؆@ë¯j³ÍõK¤xð¶îûêjê[1(u*Q©ào^lÜ`ÖùÛ? ½ÊŠoËlÕVúþ ™’=cÝ_Oœüóu¹m²²¨ßÐöfñõÅŸÿ~ü<ÿ4¿$ wŸÞ_¾ã ‹ÔÐïÝÇÇûD†ß\×½Ç}®:7»ÿdL-йǬàKÐ_€ë‚ÍË7Ò^+ãbÆSèúÄG !+¤¼E+!”¢O­· Į̀&h GƆMÄl;QŒ—IÞ¦ Ÿ5ôÝeÍšVÑâøÒIÙ÷Ôè‹ ^³zFa^àõNÙrCN,ìl(Ví›oÏà@Š(ÔF2Á<6Èä~8h“]ãCê8F…œõâ<ôzq.g]LÃE½.Û<¥Ó…a Ö*_Ñ^iõ®†˜ â.Ü1iq»<Ê,X†vâÛx ýÀÒ>pÐà£YÒ8Bª—£ÚH¤.ÓêÕ$;AĪQÀÕè×®°˜2Ów GªÌÛóá¨ðp7Zàn¸(!R‘>M¹#£Lع˜žºål€;zªâÌÁ¾ÑÎPúnt…Ú ׀ɒÀU™çT|ì–-i¾\Ò—@^ÎuÂ1¾aˆUZ¡(\>L.M3ÀàáÀ ©+²K @¤ÝŽæ„ÓÚLEºœv%PËX•]=ù\¡¬Ðëº> 3 _ÔÈ/‹ “¤JF~\`F,8+nÎ"ÁCÑ/ìýc˜àfMÿIºù‘ é¹ԃ߭u¥ŸnT4þÁòP7÷ ôp.¨Ùƒ…ìF抎SÝöØ‘#СgC˜CúÀ›î ˜;ôbÎ&&EËh¼þ æØh ’¹¦6”g[>Þâv*z4D©´Au+=*ŽÿAÛí¥(ËL™´œ0tgÿé=˜Ëù‹ÿ¬;A endstream endobj 37 0 obj << /Length 1244 /Filter /FlateDecode >> stream xÚ­XKoã6¾çWè(k®Hê‰^š¶I‘Aã¢)’d‰Š¹‘%U¢†ÿ{‡9v×–dl/Eq¾gæÚµ^,×úõÊ5ÏŸæWŸoýТ^@¬yC…$´B7@˜ÄÖ<³žlÏ™aL|ûnUlÅJ‡b[$‚W¥ó÷ü·Ï·[ŠCI #l͈‹"âky¬—ØŠPž\ö4#ql?cêe,—ëv³ªE%Øv+_…pf>èÜOïv'”¹Ö û(ö´2¨ç®¬;q—ßò‚ݬy+Z¥çkµ(“CuÃvÛV½©YÕ‰í—J›ƒ„ýGõ6Ibû¾òá̸ƒ{"lœx]€ L•[c3±b°™ý®"D##k$ȱÄ)§cxz‘–¢ƒÎ(Ùû¢Z+¿?ü£3¾uaSû ÁË8„†ATãqL 3­ºR°f›´›ñãÆÐÞ.˜‰µѰd5nbx è}Ãq?lÆ`¹J žƒ3yYð’›_€™‘¤Ë˜ûà=ÆîȯŒÕ×mÍR1n1® Gh¢éØ©lH¢(ŠúD#&Ñîe™JRùûêÔN^X{Ƥј“†‹Èï쟎7ì>I_oûÊ6oI±›°Sz ,ÏÅ’•S`½K`_š¤^òt½;Ss@ 5ðÍÊ‚ÓPqÊgF"Ï®¥/‰ô¥wèËC'0Îuí?ˆÚP2‰BÍ*ËJÈq`'mۭ̼X&Bö^¿v-kZ½~™8$´ßõh K¡®À»‘K#,ê¹(Büe6 ¾øÈ§¾u0ý¨¦g@wˆ¸ö¬IË€¾èT‘EPñ1¶Ÿ]ß½A/èàÛ·jgYÕ$ðîûv§á…| Ì+6z¦…o…^Û.y]KW€žl®ð¨ÁZà¡Òߊ*ÉÌ1Ñ#ËE<—@¡å'ÁƒèOÊSâîñŽy¾f‚­O‚PJá;C=8,&÷3L2çz\ÁtóÎ[öI¯b+¹u3L/€ï+¤F Gp¤ü®Ô«²Žiy(öƒYV°ÞöK”3ÛFHîS-úÚµB”ëz»õ”Œ]{uÀ³2vѩʷ7ò€Eñ0Eµp*YŽZ±Ùm'dîi¶Ì3°§„ó|5ɪhØ*¶®ÁáIœ|TùÓVöDºIR¦ªÅefæÇõÆÃz!P倡1ƒ6N¾üØ•Ð:3fJYÑé1ÇIÎ0{=iÒ²oT€›MÓlF=³ €ü ±A 2leÎ'`ÐaNÂ8Ï.šñ‹2GÕ¡©¹C.Í…>!{È÷eù_²G{aþiùóÈæìñ øîâ2ªèH )ó§Å9Åߣ” Çèþ²k͸҆ºšÆkq©æçD¤K¿°üHäNô¡¹ù£Uô…v^5¦!Ž™¾I\¸´ð2-ºŒ"X:ŒÀõí/ªó¡Q`Z")­yKªHŠbÑs—šÉس‹½’«Û·šQÜOÕfIœÄL4ÕBs"Œû9‰, ¹÷Å!!WeÏ–M¥/lóŒ.]H#LÑT®XJ[ MÆØFgNëðRJ§©d)ïÞSËõ.* {ü …ú#…á\ÌàPý·g€\yaÙ_Í÷7ó«ÐRg endstream endobj 47 0 obj << /Length 961 /Filter /FlateDecode >> stream xÚ¥X[o£8~ï¯@ŠV"£ ƒ/xK§Mwç^uóRu:’‡˜pÖÀL+”ÿ¾&vš´ Æ³ÉClÎ9ß¹}>Šï,ßùëÌ×ë»ùÙÛ+âÅ!Šœyꌽ†NèÀØ™/œ;‘ñýüÃÛ+œÈ‹ ÁÝ›w€pì~“ß%û•ð¢ å¢{º u²ºÊrvÉÒ;tßþ¡„_˜ñ ð½8Ø€(V~°eV.oÖº"³.ö“‰'ÆS+\ñQ]kÇg_./Îç_½ÿ4û|~óqv3¬ûf%gkJ M ßÓ…wš#•órÙ­ –vË´fÅšŽä÷ÝÑHÛDfïY¹°Ì3ÆfMµDÚnñZE#81š¤_~4B6º@ÕMk&öùØî¦Y¹nêñ$€´»3Árúha3êoí…øññ³4N,DKÃÀ‹b¢¤geÕÙØã ŠKëš&cÝÕ7à|<.v¿b7«Ô[9§ ¶Ðg©:»Û‹Þ«“¬“Ö‚ýÛ°ªf}…¼‡ Pà÷º£y.Û¶B–Niõ4Ýš]¥’ê¦Öq ´´`´p^¿ë¨î’'MÁÊÚ†£h&çi–®iò@—Lal÷¨á¦Ý¾qÔ—Z4lÓn,z:@f9«»¥³’¬Xòp`«ïÜÏCïñP³ åûà^3à´a¾`àí«©mç糈Å\«2˜ ÁE+mëš×2Ç·¼QÔQ4•&‘δÚÕ+¦6e£tUmÚïß?ØÔiÔÏ×ÏVô§6·ïÚ—0T¯w}Þ=ñuñRíS.Ô¦â…~ywBó\¤j}â°„mÎw1TJ—‚®WYRý©ÉýjïL&XeRÏ1L×9£{ÌL§7+_!YhÂÑ0£ÅÜljs`°4³Ðþha|" Øð4 Ì^¾¦þʱ ,9‰˜§r¾¨Ÿ,Ì„§ Ÿi"x5|7“Ș$=¤&ËÁöÕĤ†Ö¤*iÁÔ„$GMõ¨A¡€ô*€;”¡E»AÇCr¤²9®Ç¸Ý´܇1‘cËRö w\ÔçIè¡iOb£'—,É©`_·êڬ̳R’¬EºC Âþ¹UÚº«ÝBøí–:”†¿á¤ª»Í5 ÇŠÙ- Rgºà¤Ðcè®OXU©ÐUoÙ- mGÆ-§5{\d¢µÁY*µÕÛèëÒp òù ©ûa@(Ûg‚ ‡w³~!1›Ÿý±‚f endstream endobj 54 0 obj << /Length 1049 /Filter /FlateDecode >> stream xÚ­X[oÛ6~ϯÐ"‹ZÕ© ‹uðŠ5Zt(PËìA‰(››,)¢T;0òßKš´#7šD·}‰Ž.üøÛwèxÖÂò¬wgž¾¾™Ÿ½¼@`….‰PlÍ3 0v#?²"/tÁ'Ö<µ®œØ›ü3ÿò"+vIbùåÕÔ'Ĺ„SšÉËïŸÿ®jš±ÍöA}D€K‚À—ß{ÖÄê=&vñd àÎ|B°CyÊÅdŠ¢ÀÉÊZŸþ¸PFÙ6UÛ(Tä[DðÃGPkÐ?ˆŠrš%ãÊRWìe£ܵìñ+mðd¥­„kòqg›«‚t’eUšõ¹r^Èõ±ÃYq«¡Ö?v¨Ú]¸—çÇI!ÿjFÊOah?ÕgKZÈv>Ê0†ÊÇ–«@!ä\Òù$F½t5£n&å2äéÂ` ºf™rPäQêGô‘}Uøƒˆ,ÛІn pP/Ž€P@ŠOS·Ô r¢97 † uk`&ìç‚Èwø SʘF<#2’òÑÚ‰ñ†ýÙK ¿»ihÁYYlEÐÆ)ø @üÓéÑŠ›ÐCFIx"~äÆñA:-oZ-™ü®MøR C?ƒÈEiØDÌÛâ®bú¾¼)„4Úpnûç6’ojš'›í3W£ ÖÉZï²µáá™Aí„cí¹9ÆÝå}U5÷œ£ážíáì?˜Ä"þñþ%ÿß|}…7âÁ1xÓœnª¤H“¬¡õÓ"OþUæùù¡zfá~cÁééó—œSeýßdЉç$uÙ©²5¢º¹‘õ, V¨ëGöAŒ8q<¸T÷¾,ýÄ~½ï†¯&ÓHLÞÝ,lk½’7IÍÁ®=À¹ÞIîÉÆk ˜^{WSÞæÍaÌfu¹’–˜âUrKù õ˜6·®ø ä&r —êÝJݶ\¯c‹‚çLTœ³¤‹6<·ý“Ú<3qKêE³.Çê;Þƒ"£¦T '4$xx¸#𮡆`GÄÉlN€72ãYšv²d‚ûæ=xñI‚ñd99E+´§Çêø|H&ä¯ĦXœRñ·:!»h¯ÒÞIƒ4d7ËžJ¿°Š»"û¯db'ÉóRö۪ܺÝ%è òýNúÎÍÓ¯n0Àè'Ð;qøÏÛ”ÎÄaÀ£nδ`É“ÝþjÃoF• #í}³Q­ Z‘NÌÑÊÉö3rx“­h1Ó¡œÕôn¶fi³4ALsá¦:¥!ÃýÂRzÌ}¿— üH£ï¢+ð’nL–”-– zlJþhŸSø“aä½eI¾ýô9c9}mƒz(zÓÜïo:„ý<ß¼ÞÇDØ'ÁÂì}öþöðo“o…,Š]‘˜æÁã9"8Zñv~ö…aÓ endstream endobj 60 0 obj << /Length 1112 /Filter /FlateDecode >> stream xÚ¥XÛŽÛ6}߯¬E]ð6M ’6@ Ŷ‹Ðm³‘D¢wíþ÷’¢ä[dŠÞ=¾ÇÝäÈ ì$ 4q* œÄ›ÈÓ —tÅ¥y_o¾0ü•3ŒŠf×þ¥³Ø©X3”á­ Ö]­û{þ¾Ì~¥éJä&ßþ@(Íi{í.xœÄï­ã ÏåçOF8ÈŸH‰ß€­Ij@OŸ' x‘ø-{E}«¼sú—ä?¼}vF áP"i£á›Dc‘ÓÊï¿þ%~×Û «À8Ê üºX‡e¸®P™¡9Wz²˜ ,ãtR ”Qøè:øãð˜ÀÇÆð?fÅÓÓGÃÄH^§0bpwHúNÔ*Ì;Z‚S=Ã(°ç”)ãyÙ qR¨–Jx,S\פ\¨F\ÊqτѲP6¯MuÊwM2é £Ò£È¢¢â”›æ‘ô;1à ±CI÷ ¥únص=UYéF\¡>Çf´9A ôS¾ÄLsª§®pJP®ËѸóæë½È_OOŸÞ*G"I”ñ²R÷Üù?¢Ò’h_Tc“’ñ=ñ”fø›´òpMp‡„¤Ìr!Ké±oj¡Ÿ=v*:î€wè[ï÷ׄE4¨áž•ˆ/<¿ D âwŒEܽØ9µÕXt.¿®ŠÚW-`—#/¶yÛ8ò"[¬ªV?Åî`5k&?6NѪî¨ÇG¾›AË–¯{ÜcËH‰‚wQðYï\àú6éYÑcC‚´ÄKÚ-¥\Ȭ‘6R<Õ}¹iéV0©\žKG§*'µªbT÷ûRIÌsó> stream xÚ¥XmÚ8þ¾¿"Gu| Çym‰žÚ=uuV*w§j»• qÀwySb´ Ä¿1&© Ïn?€?3ž™çñÇZZŽõÇsŸÝÜÞQbvÒÈš¥ñ;ô+t›¸±5K¬Ç! âÑÓìþö. VdÇAà©GÇ„zñð+|'íP»40¹‘¼Z”ëÞ0*r‘Å —ÿñm³ƒ|¨q¿{C:\׊a‰œG4ÐØDÃæ‡PR:”«ÃÄD‘‰‚ôÏe%EYè¹Hõ8`R²ÅÈ ‡«ãS¢Ñ#/`ò¶/'›#&>ª2SÖV˜P¹ýä,½·”áØÑW’ öêµd‹¼~(„©(„Äøc ¿Èsž ©ºx®…ž¼o¶5ÿ,kÎòÞ2î<úãX”|Sùñ©¨ÖòSz'2þq#Ù ˆ]–êy]¦´òœ›û·œ,çc5‡ŠUÃb ´áñýn;£èzq±9¥‡ðO—5«Vb1]q–€h™¡cÝ3.Õ0[‰ò §S©“ü2¿ü å1c ÞC].xóÝZ®b×$ô?,÷,íjÚ+ÍÇs‰ ¸ƒ*´A¾T, Ÿ6Š`P} ¥mþ1˜ÁO.ÄîZ]âB½@|ÊŠåZåGkÏä¤mèe3|ÔEÍ3¶Á¸fàã²mhš­ªÝsÅLÉ»ŽóJUFHrg£§ËéWÇw~F@ŠbÙØù:“¢Êøß‚?Ã2ûÐ4u·çL.VêÞäp ¾ûöíåáp…Ö™Cwh>^\‡^ÿÎK€š 6üÐqÐ>ºoÕÄwmÅÇ; äeªƒ¯çÎVIúBo Çl*°ï5®š’Óõ>´‘ ¦v.ë5¾ŠâëÐ ‡ÃWŠÐDªšVÕ‹E&Ž)šš†0`V ¢´b2èt×Dì.â5œ{êÅG±ù7=8ø­›x&Z:z݃´<-ëœÉÉ¿5Q”ØæÞ%>º(EΖüeêF:Ïç%R÷7ÒÙ{¼¾Ú”„ð>Øžãk;áÉŠ³›ÿ uÏé endstream endobj 72 0 obj << /Length 929 /Filter /FlateDecode >> stream xÚµX[oÚ0~ï¯È*U ¤qlç² ‰Nj§õeð2ÑU Ä ÖrA±»Âªþ÷Ù¹Àh!qÖôÉqðùÎõ;'ÆÔ"ÍÔ¾œ™Õúyvvyfž]mj™†ƒmÍ1mXž6 ´¹nwðcv{ycÍ5<ÛFòè|dAÏÓïD$f¤n°çYEÜ9).Ý^ÈÅgÛ Ù¬ý4˜ü"d}ÅÖdÉŸ”ÌsOû'‘i(bµÇŒ°…õý¾(L%=^³ž‚/Á‹âTA‡f3zH•P@çT!ÃC¨·TSÒÔ)#Æsâ'»DYš'-[ B¡ Xh(LKî–gEîÏÎGÈrtFÿI;ɹ#€sÝŒËÖ¿¥ñvPHД‘œ“ Ú…嚥¤z¨^ðUñÂÕš”Ñ,e•DµŠ®R>ˆŒé’òZ4‡ÄŠ-Rƒ°«qÇ¥_‹ÁH`g|5Aõ¡Ñj Þp¹Gº(êò‡GÔgüœ”iV"ÉšK¡­ôÞ8’­QЃŒÃ¶êßÈEP P.Ÿ'RÓV¥šZ:Ñ»ð˜wǧ;ñEɣǜòŠR"J+Q9T€í^æ&tNÛW8Ÿ$$ >'rSXZÄ‚m§%#êZ6‡1žlvÅ QjÈÐíaÌ@•vÖ>]ùŽ5‚@?9ø—C³ «—"Cðì½Þê¡Þnp #Ùí3DöÓú+N†fÜ6LÂúÔOªVg]V확M9Ìò“š¦•bG¶j¯½ëÞÌ‘£JÔZGÂîºûNMy½ð ›oãÛ«âÚu÷ASæ=p [oêå;øŽ%²S‚zNÁ1f ÍÀý”–ý6¿”L=Îa¡ÂÓÕâòŸÕZó÷ñå=ÅIÐb·Ü—½Œ3F²~q%ݯSÐ@¸–V¾MÑtýÀ'Qî¯Wt©T 6T¸ô–ÿꨠµ ø¯á Éõ†2ΞΫ(ÊW'›óç'•Ò±q3?–>_fùùq ,¹ÏIìoTloáݤŒî+«;éh˜•÷»¿÷^|Ç5 p4‘vÃu«`¸׳³¿˜0¹ endstream endobj 76 0 obj << /Length 935 /Filter /FlateDecode >> stream xÚµXm›8þ¾¿µªŽèjcÞ|R¥Ý»îV=õCt©ªÒ•JÀ$îÃsÍ å¿×v·Ù3«æ”Ø€Ÿ™y<Ïx²V²Þ¡þúçüìõÁVàÐDÖ<³°‡œÐ¬v©5O­…íÑäfþ÷ë«[‘CƒÀÓ¯.¦Äó¨ýo'·ñŠ}Œ+ÁŪ‰ë»¼”…dû&ã6™ú®oÑ/^ÔwWêŽ#Ùî·î¶(d7ÈŠ­H÷¯:C>!kŠ‘CýoèQo\B© ÑQå_ÛÔ ƒ‡ýÐ0ï3ëåŽ×²n^ü~?¾ÜI&j^ˆûä·kÞž]\Š¥Œ“5ES`? ÍÞ^A ¼£P¾ï0ñ;rÊ4 ?º·âµø½Ã5“Ëb×¢_R£7z¸Vƒ¦ G$›mÊVU\®yR/Ö¼bõryÓüäΖDÁpÌÀí ÿïxžMdˆ@ÍÙÔT„Ì™tNXYÃ8‰°9¤ŒC@\3ˆª„²“¬.•©JìÛ§å:²ÈÛqR”w\£‘ýõ-/§-­òìÔ‘2!:|3ÐA@ ÌeššáÉêe™³¬mІŸF™Àg­=ˆÏôÒ£#Ç% „š‡2ïZT=tý(,¬P& :òv2%„س&nhÿÕM>#ì­¶Š¤nZ±·Š2=ñl>Á¶ØpÑOób2u#;eΧ÷Üö̱÷&ª Û:¢Ó$–I‘²/¼Á..0ßsQnåOÎêyÅ61¤Ðp˜`БÙËáV„N‡E6ÐJ?=%ŽöÕÛ¡áÈö€þŒ l äûk=AÄÜØCOÐqé¸Ú‰åJÞ þàríBÊ2}Qy¡F (¨ÀÔ†µçô|Íë‹ûlÓ7>V\²w›boÔýº˜Œ…fc³ªHXýh¨éíNôlb}EìýjjäU°oI‘ç±H{zûóháÞ,n@<㑯Â%[)EWŶ„€a3X-Y™(eJVi AúÂî&“·ì®nT¢¯ûæ%í Qͳ>+ öÌ_Å ‹·G[ƒ‚ýˆˆHí:^¸„@H„ç9Ky܉ð›a_¢g»–‹sX:FfEÁveŸîïõÁxp¤ƒ,Ps vª¬XÆwOÍ}-–"ÎYû‘ ×mxɹbÐQ¯ïõk­?üËô¤?Âaä(Uß‚¨Ïmz°àr~ö‚jÉ endstream endobj 80 0 obj << /Length 884 /Filter /FlateDecode >> stream xÚ¥˜ßoÚ0ÇßûWDB“èilÇ y˜D÷£Ó¶—IEš&†&‹\À*ù±Ä¬­¢üﳡ¢s)%v‰?w>ß÷ÎÂs–Žç|¹òvÏÓ«›;FœÀB6v¦‰C|Ï yà„^à9ÓØ™ õ®çÓo7wqÆn¾yu6"̆ͻíwÏÏø@N~ëOQ=OK©`²,E±’‹É D %Míè¯É\Ãç'Y©ªPW›jj”Ïì(˜²h þ(ÔbeØŸ 1󉂴ýLøGM0çû”yÄyËOÅäj…‹ ·“ã¼*`!źÂÀ; ²x-3X¬Dùžxæ?%¬Å“…<îÈáéãklÉLÜDöc~•?8(óì;™;Hüq9iú¥yèÜ+o³ÃúçÍžl*o·$î Έâ‡X<ˆ%üe&³e­kBZ¨\AS'úܯGœòá€nŸY®¶ƒ$ßd±urXxFà‰…‹ÉøB1²èÂ6á{öZ.Ób)˜IÛ/Ìà¶z¾W%ˆ´6³MO…ÈbˆÛkÇ"QPÖ/ñhpÞ šV"3±–LªÖ •ž§Ê¬Ø¨®b˜ÌÎÔB[–ù¦À Ž+‹š8±œ»‘ß­æ'W?2x\äiªO¤=ŒÛû_"“©>ÏÝV«fÆç³9J~Уïÿ0·ˆœ²ýÐÞ^ù<«¤™·µ[›iê¯ÿ8.Ã¬Ý ‡ˆÎBô NÍWL“ˆfè—»ëïF×#BtùùÏÕõˆ…¦•ÛA·Ëí¬(s= ÃT•®jGüuB—Elç$÷i±@jSÌȼÍ=yÐ~Õ:[̳1áF¤"'V›º>êÖ3ÑÄp,K\†ð3Þ_½4þ¢ ¬·ò–ûçö»“Ü£ŒÕªF!yï¶pdÏ^»l&úÓš–©®ìå€ì/ ¨¦ÉÃËB> stream xÚµTMOÂ@½ó+&!&x`Ù¯îÇMMÄÄ«½äÐÈ+b)ŠÙìwÛ„Úåàiv7;ïͼ— sÀðÐûx÷FcF@ -™‚8Â1’‘‰"TC<ƒÉ€Ir=GcA@!-¯¾N†TëÁ a|fÒ*Ü>=eæ{õQ” “Í¥uMÚ †!ÁHGlÚ…-ÍÍ›ù±߇µ³§,Î^…а³4ž¡á1­MT¯þ\“½›íªè“êR˜<Ùº nÞÚb›BÒ|Ÿ],P¶Ìý››”ÅÆLÃäË“¥^‚¥ÉצÖÃ|n’Üö‰³… òYžoƒù>ìNù¦î2Q…"¦‰/<Ì*}±UÇé _ìUR–Éë"Ä+µ'!ÿí•¢ÝÊ6u‡z¥X(b¸Wªc¬kÎãPÐþ õŽ“RT …(ßÍ!'9÷qïõÝ[l endstream endobj 102 0 obj << /Length1 1790 /Length2 12749 /Length3 0 /Length 13871 /Filter /FlateDecode >> stream xÚ¶PZ. ‚»ûàîîîÜm€ÁaÁ] ¸NÐà`ÁÝ Ü-¸ó¸²»w÷ÿ«Þ«©š9_ë×§»O …š&‹„%Ø$ v‚°p°² ¤T$õ8Øìì\¬ììœH44Z¶пäH4: W7[°“à?,¤\A@È«Ly5T;Ý\^A>Avv';»À¿ Á®‚i ‡­%@… v¹!ÑH½]m­m ¯yþuÐ[08ø˜ÿtH8‚\m-€N ÄäøšÑèÐ[Ø‚ Þÿ‚^Øqdcóôôd:º±‚]­E˜ž¶€È äê²üQ2@èú»4V$€–­Û_ M°Äè ¼ l-@Nn¯.îN– WÀkv€¦‚2à3Èé/cå¿ ˜_€ƒ•ãßáþöþ#­ÓŸÎ@ °£3ÐÉÛÖÉ`e뼓Uf…xA˜@'Ë? nàW ÐÖhþjð'u @VB|­ðïúÜ,\m!n¬n¶ÔÈöG˜×k–q²”;:‚œ nHð“¶uY¼Þ»7Ûß͵w{:ùþ YÙ:YZýQ†¥»3›¶“­‹;HAúo›WÒdÖ €‡—r€¼,lØþH åí úSÉñ‡øµ_g°3Àêµ ¿­èõÉ× è@\ÝAþ¾ÿTü7BâàXÚZ@æ k['¤ÿDƒ¬þ¯ýwµõ²¿Ž€ýÏ¿OƯf vrðþùŸ-fÓ—RS“Òcú»ä+%%Á^_^ ';€ƒƒ—À÷zðÿï8j@Û¿yüÃWÁÉ ø‹îë=ý‹²Çß3@ÿ÷‚0þ;–*øurAúÿ º;»ÅëÇÿó¸ÿéòÿ7åDù¿úÿ2’uwpøSOÿ—ÁÿGt´uðþÛâurÝ!¯[ ~ݧÿ5Õýµº’`ËÿÕ)@€¯» ádíðïk´u“µõYªÙB,lþ—¿äÚ,šƒ­H ìfûÇÓ`á`gÿÝëvYØ¿>n¯3ù§ ôº<ÿRÆÉlùÇ–q¾vèê ôFzmò+âør¼®£%ÈëÏ)°±:!¯.€×âüV`W¤?:ÊË`“øCô°ÉüññØTþ^ð?ˆÀfî ´°½>Vÿȹþ-ÿ«óÿV¼†¶ø7ú£T6ËÀ×p @N›ÕàÈöÚ×Öÿ€Ü6›À׊þiüJÛþÀæðøÊÊñ?ðuoØœþ_Yÿ_y8ÿ¾Òpù|¥áúøJÃíÀöŸËxí&ÄóŸ¡_Yºÿ¾²ôø|eéù'ü¯Þ[¸»º¾¾€nçë`ü ÿùÜ‚@^ ¤…9°…P˜]mXÛmµ±'Ëö˜È4Ͷn‹ï‚ëw÷{4ø†ªÌ_®×)ƒÝË›2ôWâ‹äO¾‡-õðáß’Ô[üM4&·[‘~NàõJÔõ’"’°h‰ïø=¹øéÛ¿iîP¤ÉuqçGSËǾõì‘óªëýº4òan[}§ŠW ùñëKŒv´Qpñ MžyÖ,å[ )#Ö™úÌÕõ4VÎø ¹b’ÿQ W¡¯ÁgìݬÏJ¹§['!5¡é›+¬‘IZ_ɽOŠøó¾%EÑ¿Dæ³ù"ãÃzg•t)Ô\ÃJYD2‚”;°©;s<-2\t,ÆU´täu¾ïiJ䬒*©KL³HlH5õ -™¾w‘uhw0ú%ÆrÄìŽ9’]‹`o´gð>Þ½e+NÊ)Ã¥XA­R-ª¾Ã›ÕÌó—Ñt‹©/ð5ì}Éc-ºa±{cîWq4ZìAöâÇW{0W«ßK:=~*숷4l¨Æ¹Â À0mˆØœ€p>s%5òýcVàÄ—D;.ËâPLûÅ>‹ãèF¢ £;¡~o©wDA2Ù+†6ý”Õ~üUlIýëˆû¤%ƒl<ý‘5Ý9Ðtb”D,3x‹ÿ$[¼/ؤMä^ d`è˜nÂ6l˜^Þ œãNEhp¸äHœÅÛ†( Ð’ë~~_î© °ÆRCèr±YWú<–‹×içQ9ÉðþÔØ­ÆEƒòi¢ªÿ=Õc<褓´)åî Î@)PMþ,ÁU6CøFF1¿öá³ñÚ$«jÀaiÎtµ ‚²"“é$‚ÝtýäYßCi!Ÿü;ÈÈ!]ùLÝ%VX'QAbî=ÑÁ° Þt•Žö@VºI@ŽJ§µðNÜÃþã ¤™U†Äϧ¬Ã ß6C([µå9ÿ=!åÂ$F©¼Ä"_ûœ˜(eYö—,|ÈѧAO!ÆÉíädYYTIÝ­{Ž÷šdϽ0œŒ GÄogF͈£ùõ⿟;h—Á7‡)ä_Šz–ÁmŒX ÒìšN–æ´¯V£¸Yʃd‹RéðšÝvöP§&‚µ,f$kQ!ï cG€ ÔŸ¬k9Z­ÐáöRàÙ÷ùŽÉ€ã&˜ôŸ•ñí0©†)=W9[©Z†]שý¢^&µ°Ž•á““Œ'|ËôŠÍ^î¹{YåR<±Ë·–üÔn9%¬—ë=/Ìí;e«³‘‘ƒUË‹­ì„b-Ũâ(™xÊH»­avâ|ï®0ïVOŽS '‘±™5Õ·Ð8‹ZóÊiéJœ*ÌjÕ£ÂB÷Ð6VZºyØÍ>8·ýf>d[,)4Ò§æ%2d Ö–ùHÕ×­’÷îˆu¼–Uúq]¹jã+Ñãºø­]qíD oQØgêòÛ4pLô)—ŸíƒÌj ¤=³ÕÀ¤ØÓc &ÆÆÙ§a8W¡AÌ®Mö%܇lÌÖÉèc›^—'Ö?ã"<`[Ðt¢ÐãP,")zÌ»¡¡û§õ ¸ÌyîL¬ùnæò~ÀªsKÂT KG¼¥Ugùá²KIû1]…¶–¯³óÄà׬‘+i OŠJq3e]c{zéÑâpuôXŠtlts«ò…•SrÂÑPû÷ŽaèëÜÁ,J/öîª7e¿Ü Åý×÷(çB‘-d™v;Æ;½¬]¯ÜRÄÓD{™.}‡üª"ËpV"òn]ÿ•T| |`‘y©Ò&^ƒ4ªS•¥7Ž^81ʲt£ß-m[^Ä+{Ñ=Û¬¶î…# (l¯êèCó÷n1⢓5‰æôS·,ŸÎ”Çm ÔÀVT9²i”ü>a ‡Ò¾ÓñF2M)ù&Ë75Ê1%¼°YŸF ½äF0ËÆz¹Ö3o†¾Û'ë3ÌÁº.\ÁñÓ~ýµÆ'Ÿ“ÛjÝ ßH×ÓÈ€éŠôm£q*¶.Gnp® ¦0ÿA@†Ôn*R”6+,ªL”Të:Wœÿœ ÈéSOñ† vB9Å]°Ô£¡×ȨW¥S·” U•–í7VŒKÛ[Ýy¶ß¶ÛŒ¡bJf‹ƒÙy= OÄ/þûÖBc µèåIâߣEçä«‚Ê»îNK—F8ÒïYÂo¶spK 1a Ë{Q ìBìø¸zUV¼7|ŠÂv˜×ŠΚÄwî5pÔ$mE/¶& O–<"tdg$lìkÀi•pk™ü°äoaÒaOOßvô‘Fª*©{ pÃø´¾DrÏß8£œøH¥³~™÷/dÿŸŽjÓ[o_ý¼[¥/0{Ç™ÕòT@°äcÎǾ‰<|ÅB ¥SíÛV…xk*enØÂvìߨ@M%}äŽVýý°Õy×"*Ú!Ê)æROš`ùLÇî=ù블 '–êJAÀŽðk%‚˜Ïèá=䌧r™+&Y„<öÇXáÏo°ø%èÝs~†Ÿ×kDy‚b°Ã¾f¹6]¡xaØTÚxSlÚë kTò…+ ßjÙ µ’®pVÀ‡ƒÁ7a±ô•(º–nÚ ·"§Æ÷Óé*~ÓpŸ,oô¿j •Éy¡7q[ÒcüRÛ$iö¥Äs¸3ú0¶¨ä×AJ¿…>=“8¿u½èl™^3n;z]уnÊIÎEŒú†ª)îžsH6f›óM´Lê¡Î¥«”V¯®ÀúY¼e‹ä»–ÅÐïzZŠ’°µÂqñ¹{>î3¼°P %s•É4oá¶U³Z§óX‰ßY¥}›ÿ7¾†K2Q[䈷5 €IGX]f–êT>‰xkµ Ö^–Y•¡¤lxû*³2ÍŒ£6IfÛv½$(¨‘ºšÜ ìµÎ¥À¸ê¾Ð¡n7Ì7ìŠ~zŸf¥-DÈýS›M¨þÖ®å"ñ>¬.áã[ëÖprëÔ_àÕeT Rm"œÎ6›ÈÂÒÖeú™,çÕ^Ë|N]GMh~13`½~-ýû;ɈÄ1S#±X]ȰðÀ{6¡–”Ê ’ Ç•îÊœ †ÊëRœ ™X#×]”®éÉDprá6”÷æ\äƒäÈÇ3£vñEëàýèqE1G€Œ‹ËBrØ%?·ÉÜäÐzǤtN# ðQ€e³ ¹s·b°8«Ì€¢ÞÔŒÅuÑa!Žñ´Õ:$ƒ {‹dáÛÏyXe)hë)$A'sEĈ{åo=.qDÉý®»v<&=o¾ªjèÔ)¢ïVðp×ÎãjiŽÖÇ«±õûRÜ sŸÈ–`#ð¹ûš£6…](u!’FBy%·pÆ_¾À‘Õ^[ zz{ûÉãäù|ÐÀvè>«ü&…KCjÂHbŸv[B²½w†ª7ïÝ0rEŒ@“(û±f |çÁôuèm•²ÔVkÊS é?LÎ'’;ï(V/©©…¾Úí’ÿ#…m¢Wò¬¡û!|Ekb”¬ÎuÁ%i1¢Ò!@"<}Æ9fë§#Rž= 3¶¥ûï%¾ðf•ük¸èqQ=‹²XÒ´Ê!#~¦³Ï¬ƒå¹‰Àƒ5ÍíT!>mš{¡7›Ê(’’f'ûD™îmô† £y Ô¾QJÙôƒc=Œêp¿eïñS÷€muL›2ûnøé‚\hÜ},%ÝocYü¿K’»¹°c¡0gõM~&°«.Ðû§‘ú#Ï&±^$èÚ–á ¦ÂˆE =C‹ÅHʈF2 Þp—NNNU1FE½„VÑ‘Š"2-Ørå÷ÆË˜ÈbGh$÷Yø&Pð²5?sž>}`üÝ+“Üv!ꈘmgÛÁŒýÆ{`X‚¢Œ1w‚nî"nÒB9_F(Í“L®iÃøý“ÿ¬ñ#u|vŽåv-;ù$ø6ânX?­>:ò £ÝOABÐ;lD¾ï†í)órq[^µpÄû­Lw>ù¶:?"êq0 —m0q1ÒÜeÆI€¤Í†Èšl}þ/JN£cæ­ÀéqW} šƒì.cïG}¾Ç…˜ÅŸfÈ5Κb4Ͷ~ÃQw?(C„‘»Ì)>|·Á §¢ ŒÆÉ¯žœÜ«óï;-ÙÌO¤ ªîà­¹‹ó¸öžVäh¡ØœUC»iÐSH„*Ú I;¨Ð©‚ÐÑÎ{(8wÝþž*Ÿq1Ù | Ç˃¾°³š—¦nÚQlÆŠ Gì †\?ûxÏ9Ì0¼Ik‚„˜57§WKa²w䈹àî³ÞPŒÒì­=9etï!­E¾sa™¥ÓçN—HÝ©úü;G} ‘]Ð&«%Í=Ê»èK‘Ð/쎸¦&ê­ß&c0¹¢Ìú™¬¤²ËÉПsh “å~àñkg¦…:ÁÓ¦Ó,ÿÊŽ~N]–¦Y1jÝn´ÙÜýð1ýpe–ɆŸ5‡b°¸^,á…ÛŽ©wdð2/íÔRjd.OèúL®§½úKPA_¯•D}"A^iÝéÈE¦E¦CCù+bÈsÒOqj¿iÝŠô¨éK65Õº·&)\ŒìJW[Áû=OË}M þÓo*÷U¬)§¨yîù›¶[—I¹qJ5ð1+eå Ïf‹!ŒµŽ3äî¤Dp¯¢Ü£-sPAwƒ¿•}jiÂÇU ׳ÈR»ùÙÄø²<Ù2)ìå~Âä%Nf°#}W´ÄôQMÀÞO1&¹eS´Ø¿R#¯vûËhò;„…=7JDìÅ’ÇÞ,=Û‰—«ù‘Ø_ãr‘}>úàæÏ¨÷ôã§R‘]qú……³q`@:¿p§øf|WWã»–mάðšh>Õ±3jŸ€x“î®0¢ŽÊ?”U7n¼#ëº?!@€ó oÇɵ¤YÅFç æÚ²ª¬¸5®9¿žÆNêµ´Œ "xR‘¡›jø#Œ¸3¸¬¯ùѮ¸l65~eìªá®aJõ&z½eàG˜>êAH¢™KíÞŽW7ž÷ŒXMDÌYeˆ¸d~oÂQì)+—¦0XjŸU’&œ²èº9 ßÎ×#è'`ÍÚ#ŸßoAå’Ç‹è‡z_ªwÕýFï61…j˜,Nƒ©ÙB{½ŒTKkš>›¼ñQFÉÄr‰¦¾“òüY3ŠU©÷k­ŸK¸ç¬ÜáÏŒûlê5ÈIÕ¼öŸÏŽS¼.œF ×R£¿-CvPFˆ¹zr‘¡UùöùêÈagÖ9øJ·ç”ê}e„~Ý `šiÜȰ5Ähiðð½»ð#¾ê馪è,TûK•ŽÞ‘gYwì•ZÑ2ýœ;½X6bë9 Zª×ËÇ­ãMŸüX—3}^ Ê}œsy~¨n°ÿ›¤Ž}àší¾á–B±®„°xóÞf†H5ïµXö¾5f45ªÖ\é!V^0»ª›2ÏÕÔØ~‚2ù…ûG–XhÞ9kS{$åp¡LUs_~€C½—Þï1ÏïXÈPÊê7ÛX¾7]i1P2+ñµEŸ B±DŽDZ— ú ¶ßJíæ ¨ Ôù²Æ Û„_‰#íÁ›Ñš-ù´§d‘¯ü@€"l‹ch7lÑó¤ë¡TˆH8°Tᥧ×G£~Ï…Ûy½Œ9»Ž\¢h±!8ȤIÖÚú–ºç ,þKy4àfL›Zµ´aœiqÜ­Y¯|ê}´júlw;œ¦1ß(|º 8i™Epek*ëÂϰ†ïZö&Ý\UúÂŒß ÆáÑ”G¥RÊAÇ7¤E™/'ع´èEÉ%„;ΰl!Ç€ýQûk£ObnŸ‰„_ÜÛ[]óÐ}ó4y\Ïç9ÛqËkþ2ÒV‰"¦ÂÍ=j"Ñ2ªnAÄ•@ªFOì¡-4eD'P×Ò{e‰G=¾nrÏ~ùýpòYó[«æŠRËV C3.\YÐüýW¢È”‡fóu·3âêg_èCAßz3Z€¦óóì J-t~ZB¥þªuñQÒ›‰QƲë¨E¨à—y\Ï5'4òE!ô–À¾¸Ä½âg1ëØnXÕ—©°ÜPµü =qZ…£ˆ½PX+%iš-ãJC£‚‡öÜ_.p–5>ù/q Z:j>Hhj›ÀŒEÅ/1ê_¬(yÄ%¢ów~›»à@“\·ëÎ1꼋#S©€,Î1kžY›"˜7䲿ÿXyÀ"7¤7{ëS·Ç$ç—ˆgešèj,#—°ô è²”k_ìˆ8kÜ âôå%Áƒ¾Zº–­þrQÙ¼ 3p?jÞrãtA£BhI.CL ¨øCG }ýÙÛdo©â¥Éú‹cÀÚg³ZÎè½õ‰¿(¸ ß- E‹TuÛ'KúUô¥Lïôó¦k°ô¨™ÖWE©8Øå ùp àòeÿ4©ÚcíÓ—ùdŒùƒÈ!¯¾L)ñÖçè$ç1aøöq±’'P¿ŒÖÁeÓûR Ã|û[ëÞñâ˜ÜÐIüd Üûʯ.h&5æsgÕí¿7 Ÿ\oŽ~ûU 6aèÀ©ÆK¾ëÒöA\–7?ÊUIË£USóRsC”Û0ªÍ¡ÚNT¤æ2]€¬Jé˜Ì}(¢AR‰ÞH)|tÙŽVIÈ´õà!ŽÞõRÁ÷;¶ÏSïK1·ÝIkQ»V@ªãAÐ9é0âBIɇ#Üú¼|b5l®NhQ«È-³¯—ŽžÞo~–×®u'ù+³#¸€×çûé— §k„Ü[+:R’’Á¥Ê»^£n¦¥å„ôFœC›[í¬ÓËHrb7+ÄÁ ¢¬èz÷ÆFþ}Tt®5çOü˜Ò.ÌI}í´·+è†\*(—ëno{ slØã_»šµP„vOÑ¥„p“¥¥kÜÙW`࿠̨?Šø=ªå1*Ii»$ÚçB%‡nRãˆíÚ·T#£2¨ þ>~#Ñ «î×U@%§ÔÐç;+Ö}n]ž‚š>˜ë«>Œ…’þl mÍo<΃M&§Ф$šÊËÕó(Óþ¸ ÚuL=a—irÿ¸§'È šdý^TzG|¿Ù,_á5ta/Ëg˜H+Õ"V7f¥éн߂.îü;`–úOƒ#+ó‘ÓÑ–Bø›¨ «M¿ßýÆp‘!R8d§ôÔº'îÆEë`€ýŠbåü)ÐA˜Ñ c¤O±>„ð¸-?³ÝŠh–ÑÂí?ñÏ÷?±Œ™š€Jj6üÌ–Ò”•é9Ï|i˜‘½ŽÉ;0òxZÛ|Ñ1Ø‚átš#K‚yêùlË›½™ÚN<Úþ¹Úyœ_)•‘Ë¢Ìe=ß„ßsè7Ô,šâÅ<¦L¥œçsœ–º€cÇñ‘@p¾Ä¼+FàNîLO{À¯ w›„c÷ð ˆ]‰`ô±{Û!±Ë…‘,V¢Âèož´÷“uØ{U„ŹBiß"4zŒ'ÔJñt­7{6OîAÒÇ ºû4¥#(‰¾×Íßÿëw¤…’@y” ;É“/¹¾ç^W)J² Â÷ß0* º8s—JJ¾©8£_ Ä7ÛËä±rá+¶ç?¼ŒUmîÇhÇ/¢ 'ü¾vÜqƒÀ%ŽúJM8Óxÿ‹˜Q¶Ùê²_ß^„ßzx»QN Ù-ö @m ¯ö?N¥ß¨>ž?a°¶Ú”¦™c®â‰Ìñ{"'eLdz”ùÍ·žS«b˜:z÷,Òf:)²ë‡Õ5™DÓ“WÍ6Æ~•Ï+Œ´qà$¸¡¹vÀ;¬W HlǨàf0ŠÈîþoÕÛ”¸²@"=úøÃ_ñæJµTI+-¨¿jé¨xÚX¤<ܤÚQ`šb³àFܾËÍG5WS8婬N’cOÌD|o$Û2e‰†5S}[C8„ôekà‹rŠ-±]§è^!‘º+ÔAš[râ Ù®ûšà<û>ßæ§,[çwŒÖÖ˜¦¦h²Óºè„ÉS ½£6¾¦’ CR¨ê(YUg"uçdÜVÈñ»Ö¶Iu~XÉKAÊ€Çìã÷¸ß{ËM Ab1…ƒWyõæíwã4Z’°Æ–{9á8•]´ˆÒÌù‚ëŸÌùúj¸Ëh½õ)‚ñÍ£µº%½,0< µÇ¨If¤™RæÂ7ŽÔútŽ•^°Ø#çšÐ/7L´þn\\¹Iô´‘eÄ ,GLå»SУå‡TP“(³Ê²¢h—š;á:ÈÁša(§ž7¯n™ñvÏ©ÝDðäÕ•FCÂó JÉßkáYÉîðŽéÃ{—Ê,v`&±ˆdÉôžÊ°ñÒž®L ‰1{+£æ–|‹öœCÞöݼ°uËð"=s|$ Àý0Q%›b·G¸ç¢<èG_Qˆj‰ÉAý~?C¢)œzÚ=Ä=ŒæMü›7rÚèBß÷¢C‘È/“XáüÒ$€?wÈàBP´»~Þ·IofW‚XHßçwÄ‘îÅ]öqÍr3¿ÅO¥ë‹’4šÄo5±wĦw¨øIw1•°Iv˜Î™¤—Ù;NûL âÓôIœÝ•m5+~3Ç_²x@”÷y¬útŽÆ0uU{H Ýá+I ¤dW”^÷óm•éH<›¶ÿÂÿL“¡õŽ®þƒ"g›¦Çv–¬¹fĵ(IC°ÖÁduåÁô%ÚAI–nó¥-n4+4JhV>@¸vÅ»'K;ÕÜc«Høneïw¨+3‚äl e÷½_Ô;ôõ%tRâ|,ô©NÙ1Rúö³ï/Eõ†eÀdœÞåËrŽ‚gëîå^”ô×…ßµØæÌQ¡$Èô‰û/ØÁ·nÒš,oÓŽž'(¾`5%€1ëÛÒ)cñל—ãÆ¦Oë·€ÎÆ¬$ÕØÁÓéЋÃ7Ê3± ¾hœ“¤Ç®Þتƒ¨w~Èàä:¢­ã=ªG)Ó™¶,'lm*TߊU‹GFÅlMÇ9ÉŸ(µ&qîS+K»þA&¢RååªëÊz'N¾…{/ò#g× }·îÑÏ8½6OÖ-bµ ôãE!Y¡Z/P’®ŸD…ûÍΘII¹mE‡Í¡>wc©­£²­ZÞ1C®oÉ ƒïmu5ÞñÐ-rЬc‚j)ÂY7Ç—O5­ÏwÙPÍ$¼ûÕþ*Ø}ýŸ@§f$åzÃrŒ² 3—ïzC§UE€µÄbf>}wÙŽ«“)k+eb}†OÅd_øƒ*â⹊já.e³r“=¾SÀEˆÛ}|¢º Å©@C¥££f€('Z/Îâ§M© †´ÒñÎhÎ9‰Vý’.9œcû”©Ä–“†½WäÌh»s¾x¦sQ’†fDåÜ–(þœêf^Ž6ÿœ€€¹ÆÃë NÉ„Píé›íQWsÞ:´›dþjS§u“íq€)^üñþ Ap½_׉ÍÏ.qV{´ÿršy—F–6!–13ŽJß³Nl–Ú1OÒÉQ™ wd'ä]›*8wH5Á¦ù³“ø3=B¯Ô˜¤‰f¹¿‡±®SßHT3™ âS“Úg«&¡c LÔ‘y¹’Ÿzu&£<ä¿Ï㣒행(ÜcˆÖhäDµBGä-'C)2âÔYSZ5Û-%ê@U[ò$Ù~Þf¹'{‹@‹{¹ÜûcÎ!Eßõlš@cAÜâväÅeDÓâ½æÜ¡_…Þì¦=ðDÂÇʼnuÏ-ÌtæP`d8*t²õ–Ä]y;9®ÔcoÞ’È?˜Ñã¼;¹ÆÙsâm½ŸX”Å›øÂ÷ Rl¿ž,“³Rw-»D¢Ðb“XÀµñ­*&=ætHGíŽqqÀa~î©Xs…ýé§ë9:Ñ ’•¯F•Op›ÀËŸ GUGõζq(¼ü vÃ`:PmW•œ‡`]*Ycý£–fxº5”Õx9K½âªKñ6&û;H7b«½Š]Z³Šö®›ÞU˜¶=_Æñ\”êà/˜ÜÇ=:“BæIùÛØ­¶d®ãCUóªÓˆžÍ~0V-ÎwXßå1MÉvÏ"Ýæö<}è9 hv´Ì…[¹Bg·®ñÒ…Qúçuá.$âãûÔ9okÙÆ„‡Ž“8É~KÍÒzЧôò»…ô° ‹Ca" 7hH$À§ñ¹å 9»–î *aôœ:Ö`Ôµ—Ê/y¦d'tãFÔ°ðí²{ì<ºùâ ðëÈHÂÈxã^6ØmŒÍÎVŸm3Þµ[×àÙm ¢Ï%AO-ä=ÌÇ tKÞ›¢ äùaú~ÖwrÕÆÜkj*ÞÅ<Ü-Uí"PENÒ$L!(÷êi•iÓ§Üî¬8³¶¦6g¾¿Lo]ÁYyŠ&T޵Hî!§k”ý¾ŸïùÜä æÖ¿kï9óJ Õâšûpfßú(k¤Þ°5«× X`6äg"à‚áÍp;â?¤3Ø;ž²+Á¢øôjD+›û?ËÆˆ‡w¢Y¦Ä®®ñ4ö°ILµQPÔ«¼)Ù·§ezÐø*S*VÂ=]±ú/@™…JBLàmF¢¡Û‚¶FKt ó\ v¤ˆ)>Éòø‘2D ŸUg`˜†¥t© ®¼ !ªô,—yÒÚB—¸ÂׇÞp¶šW Oå® tÄj7¸íÙbèg(ë O /øÀ.)œ‚*Íö$éÌ45zäS_† Ô5+3=`½Ò&N±÷p+6á®Â(y”õƒz‰™ÿ!m%DG}®À úÀ »î”kKÐí%2"´ß¬†Ñ4«³Ü®Ï vª…Oý„¡4@¼°P„«¸åW#بap¬!Ò†þ)A)ÁéñëÖGï˜=ûô.µº:Šð"¦l™²ši¾öpQy•~ya,ÄnðÜ“«ó‹ ÊgCò* òß07/uE3íVûSp(+\ 'Wí eí\LǸºð´ Þ)?M ®E¿­E-~äÒìVAÈ–Ž¸š8ù2Õsr>ZnÔ1v* ¢=sÁM®"GÁM,1¦òäžî'îä?LåÕŠÇõî…à?æÐ.2¶.Ìû ³ní_÷L8ý¸ðÊ/BÄB9ñ#L.÷ü‘zºº?&ê¸Ù‡\åì§rÛ„R7:µÂŽãΖõÙè®3Bršýx C†x’–k¬Ø”-j¯£3dœÁz®í&pbaÂoíˆûD:K±ðÄzË9}.•½ZGÍ!;Ýkûx Õi/æ?Xê@ËÒÔ DE¡ŽŒ$Ô£ø•о‚{…ÙMŸ«d(¡ª}àeàÏmŠ›çõåüȺ«Nom–í!$ßaRȘë|Ø<7quõ1ëq7'{­÷š‚¯q¿iâ[ÏÃF^}]ÉP+üÂÜFÕñC&‡r=¶yµqmÃ0ñºß–Ã÷"ÝAí7¥ÂxÒ_û>j']A×*6廃`²Yí9fùÎëZ•Óá—g2¨‡¼“µ4‡¯Ó ØIH~aQyOrE/oIܸ½gÌt“®{dö[¢BÀ{êò+~_ØÀœ¹O…ôÈrb=I”GN—qƸÿBC®?Ñ™§‚𘤠ÕUÈçã> ØêÌ<ËAáѼi×? ÈþÎdJm¬Óžt!ôµÏ%¾§¡]©YàËp&ám~Á/—â ð´NdrØLjoâùuÊAƒýÔ%½¬FÔ‘ð& 9ïÐ&TtåÛÀJÏ^]ÃRç|<§R+Nt(Ÿ``?‘O³ÜËB:€ˆc“™nÏ·óË8µOágÎÁ±Së´-±Bƒ‰1½e t¾Rò>ã›Ä®Ýñ¿3Å81õk¿q«G·§ôdÍŠ!Fë­UM„Í=qp~ 1ýÁ]®äÍ<—’_‚à(ËOðN;dÓúb°HräÐÃå±Ï÷'lž9&ýK® (R´§b={»åØ µ¶vFã¾¶c2H"¤ÔëCªnZA¤ä;…e3a•2 2T7ŽÙÙÕª¨Õ;¨÷­,«aé"É÷ǹ;ydñ¡ÅHó¢-í`–P¬ ¡~þ˜Ûa˜û“·#  Är~¢¹æÏÁüé1êÕº^X.¶¬+P’ Böxý©N×]”obç t®«ðÍÒú=˜Ä¼zÊ&¦öÑ 3œ¤41ù!3ˆ¦VÚ—¨‡V[ÍVþÆ; –Y΂Ã߯\,„݈!\¡ñàý¬ùŽÝxHÜ[)¥n/Ú<ø-YËå‹8Íœ(> Óì„+Îü“Õ'fU§ê3bêby蔂CI¿“S²ûQ‘-ÇŸùmv7âÏŸõFé”aÒÞNc®5%zMìñaéÚÊe'‰ Ðç#Q“ÁˆõßMÝÊœ£ZÙf³üE7|=~l‘yJâ¶sž&+W„øûíÞ·v^wI£ ‹ŠûJ®+ÉúŸäæ{ztR×À€fkˆ›1«w¤Ùå7{sï`bédø ¯ 0Ì|„êõRwä¯ýXªtƒ–­Ÿâi¶Ûlr|æ·÷w[ðù ¼b§«L¥ÜGÇš=’#]ì®w_æe ýÀƪ:ÛuðmSõ’ÙÀ¾Ÿ+`lËÙky‘üu4ºêŸ(Êž@ö°gU1zfvþ|ckq\ ôÆt]$Óò=S³ë ÛŸLñ¨u.³ŸáNp„ÇNª¯ç#kDñÉæÛîÉý…kB{ÞwGådÕí0¤|Ä<þ$ñÕ…eŽ …ÎååQÿ8óJ»´œ='Ío]ÀôçÁ[Zî¹’;æd}I±&` n…gÒ _þÌw¨ŽÜ·/W ï˜õ6‰L¨Edõ£éߟ?taqCÈwÕ¢Âí<ÔüLÀºE²p¿ñÁjÆßk5“{PO.’ #¾º–+}í⾡}Am×ä}ù)ŸXÜ5š6ñ~§Æ‰$®ô'IÑÞ ‡i¬ ÌZšo&>Óhe6u‰…Œ„Y`…ʨû~9ù"Tl¯+·»¨.³­gòX³ „hLê{à»]0±!Y•³*ÖÉT€ mB}ˆŒ* òžD¹_.»¸¢p¯þý:OsG–ÿåÆ ½%rÓ¸z ¹Ô7*ŠVT¨ºJ[~ü<鮑|©Í‰þ!ŸÊ‹SE>ÌGp†‰Ü…~L`7TÀcK¢äÙb²`_ÕØ~(øW)á~‹Îeí¢(8ÿýzÈüýv¸¨Hk ¥€kHE8—i†rœTÚ¯„Uå¬2¥ê)"Ÿ:bÛª†_VB‚†'2ûWrêƒ×¾ÞÅÞÏì«´Õ4•enoUæùýi@ïá+`/##Þa  Óð*åœd XX¨øûÏâKÕë‰W¸8,â=$UéÒæ‰´µðT—–7E#7²»ùEæZklõ?tF䀅Pޏ}ÊOo…zsŠ%íÏ-Vtug— oœ&Þ÷6Ã~âfÂWpS–]ÂþäÒª'ƒ?)Šy:´7øÞóÍKÞ¤™w={ð¨ û#ýéõÒåsÆqa¼ l¥¨:e6eŽÛe¸¢æ V£0ZûB†äÝÂA©_Pùé§£IÛ³·uXâ§Êä.Ç­Û;ÊÉÍÓOrSÅ1nAW’K{ŠQ‡oÐç‰  ð¶…têA)pD[h^” WKz&ñ."¤™ÀQ|€P>ñ3´H`á³’¯¶„Ù: Bå- Ã$9ð3uPf˜Ph&T¹âöÃÊ voǺ÷|gÀîþ`‚Д #‰Óc/îš/®Å.eÆzd’1vÆWlÀb•^Üû~öF‡Q’u÷#E¬k­gkÈ›:£õÙú÷•ké¿h(‰E®`Ó/&±kïMh}¡TKepR3Œ›Ìº%ý~5«M%F÷)¬óWnž€Ý`{O÷£ætC/í#ƒÜ€3ƒdÓ¦3û ŒƒÑ!!ËžØïí'R–øÏ‚ß1ðeð` ßR«+r .hÊDêÏQš'ÞhÈÇãêŽî킾£¤{È5½}Ù¬4Uá™&´TÙˆób¸(Š£“nTûP«Þ ‹É£È5—ðоÿRÀedËû…¼J…T×è]Ù>wþa8oŒæ0ÅFû¤ÌkŸ¶É “T€ÏTlþ$û—²=敜Úx œª*§ôÙQtíë#$þ8‰!˜'³ŸÅÕ†ÔI¬bà»Ï€0›Ó³F+{N+‚~6ÔV«`ršD¤­!®¾"ë´l¥xÍç™}ÞY5Q­º‚r Âr¨7—ͨípˆž³7ÙLüœy…w¿¹Ó‡0½‹éœ,Ê!ž¢@:)R“˜ù¡é¹ñ”·åÃfuò´€OtÙ ùëˆ ®äº¤Ø?RQ"Ñ=ÚÑòm  hlf)æRmò¾LQÅ‘):qd {ñ'+Ñ´øN8ÉS°n ½æø ÷ÌÌÌo#ï“m‘vާ'»Úø#fÓ9iÅ¡¹T( œûýNöÅ&’Šê<'ëô8œ.p€ J±ëþ‹¯›ªLä_Óv3x‰¾Q%"FtÅ•;_9PQŒ½)YÖÐhû”póTêâ졨·«¡‘¸öX+£Ûà^ÁZo61‰¶®°/¶´º{Ãt×aËOBöâݲ#û~÷~Y ¨þôÕç<¾R¤†2‹±š)͆$¤z~·a„#1‰‚bý¡º•ôë>™.ɼ™¾ÕsûኅÀ5‘M1^h×Sä’˜ ,ÑÄ)ÚÑ©ÈÆA¿ªœ>¤FW7[íô@žˆËE Jx`·ž\‰Bx@ëzp€îÌXí¿#F»Â?¢q@‚ôY.b§€6OöG_CZDÌöm až6ò-âEtµºWCyu‹Ú†Õ¾ ê÷<© ªÕi«²òîVETgê{üŽ£€^Fø—…¶1ÛÖ)áȰV·k^L7“ŸLÊS­éÔ~”ØïRºC—ÏU–‡”ŠÊ29TFYá2dQ '©–|zúHûId™\¡ºÿa+Fö fºÛW|ps+Œ™ Óáal݇â#2ц¨oûȼ¯ö¨ÒJ1aÑ\‹<*ª)LUÛòµ7Ô|÷&ÙÈ.Ó~Æ÷§Ÿ&{ Úˆ&§OËçPí†!åoÐ0‡È‰+â cm±‚EkÞ® È]¯þÀ&¢î|“x=ó™® ÝƒÊ]þi‰¹ 1¾Ôµñg›ZCÐ\>:TÛù3+¾þX6®]Á¯Ò­i»Q—ÅÏå+Æ9z2ÏàbžÙޏêøoZöš±,Õð"Y  Ÿl¡­Ý¾³zŠjÚИÇÁD?ß ºð£¸ÖA$<ûßC ­·1òÚÀ-Ï ß]ÏŒÝozýúX£ÐÒ endstream endobj 104 0 obj << /Length1 2055 /Length2 13875 /Length3 0 /Length 15119 /Filter /FlateDecode >> stream xÚõPÚÒ CÐàÁÁÝ]‚Kpw—ww Npwww'$¸{p‚»;<ι’s¿ÿ¯z¯¦jfVëêÞÝ{“+(Ó ™ØÅmmœè™˜x"²ÂÌ,&&V&&8rr“ð?r8r5 ƒ#ÈÖ†ç"@C§w™¨¡Ó»¡¬­ @ÊÙ ÀÌ `æàaæäab°01qÿÇÐÖ jè2È2¤lm€Žpä"¶vî 3s§÷<ÿù  2¦0sssÒýí²:€Œ m²†Næ@ë÷ŒÆ†Ve[cÐÉýBPñ™;9Ùñ02ººº2Z;2Ø:˜ñSÓ\ANæ% #ÐÁhø«d€œ¡5ðߥ1À‘TÌAŽÿR(Ûš:¹:ï+1ÐÆñÝÅÙÆèxÏP–”ÈÛmþe,ó/:À¿›`f`þo¸{ÿd󷳡±±­µ¡;ÈÆ ` ²äÅeœÜœè†6&Z9Ú¾ûº‚¬ Þ þ¦nR¾Wøïú@vNŽ Ž «¿jdü+Ì{›ÅlLDl­­6NŽpñ9ßûîÎøïõ´±uµñü2Ù˜˜þU†‰³£ª ÈÞ()úo›wܙРÀÎÄÄÄÉÁ Ú€nÆæŒ%Pq·þ­dþKü^ƒ·§­Àô½  7Èøþçéhè898½=ÿ©ø_ÇÌ 0;Œ€f ¸?ÑßÅ@Óá÷ów¹´™ÞÇÀô×ç¿ÿtß'ÌÄÖÆÊýùßGÌ('©%$"Cûï’ÿ«¶uxÒ³³èYØ™Ì̬ÜNv&€÷ÿÆQ0ý›Ó_IS[÷¿è¾÷é?”]þ=Tÿ^jÀÿÆ’³}Ÿ\ €êÏ ë0±3¿1ÿ÷¿]þÿMù_Qþ_ýÿ2w¶²ú[Oõ/ƒÿ½¡5ÈÊýßï“ëìô¾²¶ï»`óMÕÿZ]a[+“ÿ«“t2|ß!3«ÿ¶ä(rš(€œŒÍÿ5.ÿ’«þµhV  ‚­#诫@ÏÌÄôtïÛelù~}8¾Ïäß*àûòüoJ1c[“¿¶Œ…`èà`èÇô>J,ììOæ÷u4ºý=ÅF[§wÀ{qÞS[¸¿N”ƒÀ(ô—è_ˆÀ(üqEþ .£è'€Qüb0JüA¬FÉ?è=ƒôÄ `”ÿ/âz¢ð±Uþ w?Õÿ"îw.†Ð;£?è=¦ñÑ_]d4ù|çü/|oã¿ð €ÑôÁ;ySË?<þRÛ:;üÃáÝÄìð¶ù?à;oÐ?à;qËÀwæVÿ€ïÔ­ÿ@æwê62¿»Ú¼OÁ?ôïµØþ²½;ÛþúªÝõ{©vïfûf¼¿XŒöÿ€ïÔÿQó;uÇ?éÿB@à?½›;¾ßKÿÍðNÐÑÊÐñÕ3¿'ýÓÛ÷}gt2wþ£›ï:¹ÚþÃá=†ó?à{\þ@–ws·À÷xîÃÿYcg‡÷§àïkê}Cþƒÿ~w€@7 1ÜÒ¼­1oE]PÇ}ž+ýÎøçòõjzÏ%‡NçG$˜Dêꌀu‡[¡Ä¡>”•m1ªÁe¢Ï£Ö˜Ð¶xÅö'¯gýoJS;íp‹“˜?& Ž„ê>âÓ«îz½Ø{©ù[B´‚wK‘çØ;s!)ä¡Ý»~—p«(û52¿£¸[Í! ÿ\6M¥©ã_¿'Œatòª[Š“c¡j–€/EGv蘤‘?È› §B.à'FVÂV i:³–Eï­yÞP#mŠê«kõÛÅ6ÜsYìïþÉ-Mu9‘B*µi3¹Ý]üœÎ¾ÖOHP³B—Vú(޽¥²! Íweð]Ñî¦Êî%›óÝFŸÆú ¸ ì¢Ü*l ÆÖÈ9;ÌSË|v6/ž ˜_ÊmëU˜Ð+öÆnn!‚êé™…ûM_2î¡J3ö‹µbÏçvûK¡+V ÇŽ"χ¹!˜v"¤ùÍ1†„) c·¶2Ì|ìä2\ª´T>-¾pŽÅ4vé_³iõà3´ÏŸ$:s™À©{|4+âÃyªÑ‡ŒóÀ1…Ks9%Õæü_ æwrÔßZÓ•t3¸¿Cii¥X{cÙ…ÖÆúHêX‡È…øØ¤&îœ Üæà0éà¼˜Ê ¤;@.ÎC&vøËó]^;‰N¯ìA‡à¢¦\Þ%òOî5­ D|f,4VOMùù‚SÂ8ü¨ôƒJ¹$¨m-òûÒtwÚ3™Ý9Z<ñ$ ÁÊw}¤à3§Ö¥wiÆJ¬.í‘0[ F;uø#.´u#}ÍúvÏ[:ÙR‚š¨}uRoUê¬ú²t’]c5Âi^KS®Šó]áù¼üQ=3Æ· â|Ãt N¶‚À=¨Èƒ•éîºÏm´#ejâXÆ»¬¬5#8?¹,àÍõ¡N ­Ú1ö„l`c× Óvšoåz~"Îvóœçk§’e›ðL‚Œ1æS-^DždY~Œ²;TÉÄ\ñäcÿ®/|ܨìóÙx5ÎA]5øX²†FlʭϯpXí +^Pz[ɵ¸›‚–Ø”³ËßAÀåü  K+…}õ€cù Ÿî‹O•^ù ¸*µÏ'Ô5jHn¬$‰lztý Ú‰ÙPèd–ûŽXë4ÐîÃx&3˜Cmbéñõ¿VùéèšÀDô×–‚¸õ~,4©5PTáz*­ä+GÞ·„î"—Ïæb=úT?ÜcCäîS`¨¸q‹÷°LØçùòÖ4ØÊ ÚÙшcÎ4DÒ¡kÄ¥n£Ë»šQtgu5rѱےªÒŸ—¬hZfGñx4ñéùñí†8o[dÚž~.jeýñ©ÿiuópSŽÚn’Ê\0ÆÃèÿ0#¦Cÿ ׹╋¤8N{Ãͪæ èJTŒ²š?’¨jlÚBä#æ%úînO»¹[~8-Õè+týq×å΂Ñarn9#P‹@…š­ÆtžVÞNCÿ«“€=I;FI‹ŒÏ¯U¹x§"+€‰®ÃNÓ„{9 -$›Jÿ ½®d&ö¯Œ*ŽW¶y(Øö!òÕÿD¢KÕ¨:'Æxe Û¤XK¤ë¦9_Ýi”À‘¼oÃ@j®†ÍàX›dÖu!.|(ZŠxz2s{Lr‡Jöi·Ä¿h8‡œeä;Æ?ùŽùœ>ë¯J}| àc¿(„‚WAðp,n8ñv–1H’]ô+ë"á̒8½Ûk¿ü²Êå.ˆð¼¼Œ-ðÊq1 &ìc ÁÇgÍ]ÚM”&KÄAÏßÿ˜Ú cõ­KKš^uìÏÅjߘQz ‹/ìSAlò5®…)g9þHîÿì.ª#ÛðI™ûËâ¹bTÇ\¦ƒéµD±Þ³;{h"éö’ †v°æD5ƦôoåB=ü›ÖÔJY\':.Š|NCÄ&d¯É«‰ðzNŒê¨þ‹îݾÝß±‹a¯*ØZ¥=©—>«‹v˜ð·Ûâ—µÒí–qAAô@dA…8™7£¯Š[R;(Žné($"‘u#¤¢l­ãé;ï7ÿjr,™EiSyäÕ*ÿ­ •Ülƒjl5}ð­ÓÁ7;òÒA©¼Õ=RÅÒ “¿r£îËÉ Â÷T}õC÷“s-\3-ºUƒÉÍo¶ÆƒRcÇÐxÌ{)hm¨ —qÜçàÝHõ0¹ûY š6Ä9(ÐÙ©Œé•©ø,c±|>Øh‚-Êø¨¾áqÎ â–ð¡“îG€N'V:TÅZ‚cª[ÁÑþ¦ìcIæXú‚¸«ïà2Z÷Ò·A«GaŒÐnm÷0bªªU÷[“¥µ–njýñÓ”Žd…‘Õ'ÿ{5ïÓmg#goåç[ú=%r¿ðÝ ›$|)á&|A›]ð7!¦ƒ>ót%qîšl•yÏXª<Š”s²õàX_ž‘kónÜ»·›Ù7‹ž=˜’l„E¼còXñXjAoË_%¶]š  ”y6Žx¤€vJ?F›†ï}·¸ÓËÁ"sFVù4ï´m“›*¯®}ˆ>‚EŸÙèÚœä:${ì&%ÂN~F³$€'¸0]3 ÊMЉÌ¯B- h@PpÅkä.¾™ “kZæË{)yûJb¡Õ®áñ"뀻x(VÝpœ9'óL²O|LcŠM›N ®*ömbø+j϶gÒ)^÷›!ñUøç¯Û¤ƒhO/ðC‰CÎ…XFy-ŒñëÝõ+¤€/ w:¥:F›Ûsd·Ÿ»¨Çb‹p︣ùÒmÑ„UQ–8«rØK·±…›¶•$©õ…܆$ØjÄhÛnŸ˜Ív‹*ìS,?'…GÒ´˜;B¢ª;V¿hŸU¥ý7„hSvœÎ4¹îM»“¾˜¤½}è9 A!w^÷I×>„ÝÏèREŸ-Ãñì\²´L¡­¬xçìlKdÏgÁ Öñüȵªxp4ÜåÚ_ê’h›V 7m¿–úÔ‘»ÒuT8* ÎgÐzM/pz£ËKu„ -á­LFhè…p·i‹°ÐdéLy暎òRìî&~˜´f×ßÀBˆÞÿÝ[’f­KXd‚ß] M^ªƒ-õ™g+±ÖHl/GM7ˆ¹iZíüÁˆ.$TÚVœÉÄ(Ö·íçm4{Í”MBo´Â2ŽÊs¯Œg6µñuM—(Õ¼h„›8bì?'€Q›ýtçH‹:žçþøC¿Ñ1=ë‡rVæ>¡S‰;¼öbjÔᵕ¼áRœçÙ ¥0»p-‚"OÖ{ñWÉ k¶¨å ¹A”N¶ƒ³ ÿúï¨UO¿ë4 ÎV\*ÕØòF.}6âžÈÆ ïÑecŽš%-ñWjÜo2ÒDއ)Ï×3Øçò½­ª&q—Õcuøn?«S8r7(m³†Y”“` ŸBTøYŒ’¸8=K+‘º3wä¶rüW"êIr›&õ9ñ yF0tY”T÷Jß!ôÙ=Ÿ+-ûΓÒe"d^°?YQ¶ÈˆJ:[`Ù€îSÙ^õ5(܉M+=I lV×z'Ì_mìÛ²üS¼¿_ÕMµèµî’œþƒ”êmÓ ÎYFÜ`ãPÌXUȯtwæœg\²yl‡ø=ö¹y¶Gë7-^­\nÒ®£Iùãr`üÜ.Û·õïÚ‹Fdú[¾gû—‡”ÅÖ\O°#O) 2zš)Š\x—› ÷À.Üú,n;ÔWC°µ¿dOÅÞ´Gš*äÛ6ŸøuËÎÐêQÒ¥ rè3þR÷4_:b ›J;µØ«Wöž~=‘ õ€Ÿr Ÿkú¾9oõ±d­ÞÇ#]ÆÓ^HLiÚœŒ:‚ÇCNYJfÕßB/ë{ÂÏ8‚FðØø„ÔÓ*“>“ÒZB LP1ÐR ˜>Tü>Ü[ý…k.½[zo$°P]Ô¡ì{xŸÍ!ä¦ åPëJÉ£˜¡¶æ] ™WÌ\öüØ8ê9ý¿Ü~Ã<"~½j”»~éµÈÛ’g#(éD_ê2Z}Û)hwÊ¿t¿Ü­ß¹¹ 8ó¼rUÔ¦Õ —ŠË³o£mÝ„?Û¶¶¡[·µ3•D°†/Q’ ¨V…¬lÐDªæêK»— Æ*ÉË”F çÁÓý^ L\6€%'à'…~¶G¹ ÄpkÙãɧ0Ø—,°CÆh”·Mn¬Ôà²iÓA I¸}™–ËŽÎN´"‡ì¬¯’y˜ÆÜ„@DqJ,Ó£(v–ôºy¢}›g*m$ç5ÁR†9¯,ïã¨Ru½‘'[xò%˜<¿<ú,ÓÏ÷ƒ(yJ›$Ø ìÓö |ê–§g@TÿõC6 ×ÈOÊ&­ ½cú†äf&ˆ>í¾±FÛûÒê³åGª9!—à·yÃr™!y·t’€Ià)èãÞ+þ¦ç½ÊMãíü(ZF+áœ)tà;úÝø.9¨ u 4uãv‡˜I´ƒà0¬Hß>5:?p2Þ¢ '|¥rtY®^Ñcß–I™lGMÏ0ÑR6øû@QOÃR Þf2›B“álʱ1i1„$J»øÃÂÛ}‘OXàÌó&HHÏÃφbbH+l$ÝE|Ú‡CÞPœ~œä‹m©{~–Œ,’M–a”•Å®F|£Â‰¨·^?y5·¾ÁWu[õˆ{.–ÑaÜfìráQÒñZáçkÙÛ Ö`†a£‹DÔœÒ!qà,{]ªâì×i³ü,õ¼oÝÙõ¼Ö¯Çn«Ìíª›”±ŠíàØ Šib&§êŠÂXÓó›¹Ù+ÎDèh«)›4Y× ¾ x¯!ÄîûÜ–ó5WlÒöa¯‘É޵ܶ/5…³–>’A`bÑ…Ö׳i.•aÕFt}Úineþ›ƒ(šÁ‚Í)ø2XÍ=”D¬#<…Bœ"1>´ú»)]J¤¿…Ô¾;醋®™ v5œgòÛ¢ñw^‡úåqmô«& ¥ï¨ÜAsꤨN.¼&»‰üj Ç ìrWUƒÂ|ì+Gì¢|×ÞÕãÆ¬ú8K­Þ2ö},8’‡DõÉ3$—3=^þòânÚ©¯üF²ÄÿÄ`fp‹+Ì!±÷2x$œHøkA¼®nÉ‘c®)B빎c¯Fô{¦SˆUFòäY~ ‡à]¤á —Ô6Kz&ÂeûÌ-§W›J—‚,Ý 1§½Ö-øÖÇ¥zëK8¥|úBßæm‡ö/µGŽIËaËÏZÅ;e º¯½ºXy|ÄMæÔ£€~¯tSí/eV+!¬¿ü‡µ×C=~ 0 ‹Ï5_ŠÛ“èöM¦Bu®º9l£RNªg{ö[qÅú¸À$æ´Q¦ÑLŠÝý85´sP"ÀaLPÕ)9Ú¥„Jž$n¤ÏàÉ|D¢‰¶¼s·ý e¥ëá…šµxnspºz¿}³õF­WÌ]ã‰PŽÄŒoV0W†Áß]vi}ISÍÕƒs•c/Ÿ5pèêÝ%œKŽöwTÄ:#Ó¤)ñõ®_n5‘œñ0@ùŒ§ÞÃRT>…,5ª|L“Á“ã®—ðùLk8Þi˜Ëø¸ÒNÕ÷× 1<óæÀ]fÞ21¸K°•oÓ9M/í÷2â–²åìn(Gz¡hŒÅ5ió@–¤­_ÐWÙöꦪÝ+k²wr¤Ø•úºfÚ3ÙèʳºJ:‚D¡»/ÛÆ›NÓÌñíæyKO¶oÚýI¤õF¿˜ƒ¸ŽœPzÍnã]Ú¶]/&¡Œº(­—ã°‰ºGU;3ŒQ9:Œ”´Daé÷SΩ=Ö9zL”ol$6ˆãBIRWK¨xЉ›D¼ >à1¢Òsà#+¶ZE“¼ù®FnWG˜ÄÏA}êŒÖ‰}ÃÝ?ð’Å6:˜Î0ÑE°\táX#dçÎiõ8î'î̳ºˆ”}%7dTZаYÜèÍaÑ`Êf«ê!¿êU¹8ðvn²‡]×nµyÄÄâµÈÿÎhlµFé˜J×E sDLŠ`OG¦–1²òO“ÕÓ¶Âhñ‹ î7üÙIÿÝ›q÷—ÌëƒÕ6#‰pX•7j^=£úxãb©|UEß*\Å`—í‰zR@à~ˆWå!í•+Èbø^MähîŒô Z´Ó0ö~inKRPÒá…‡Ýr&pp“°*ŽãÇ`uMÑ@L<- rú² )ôÖÛÖâIÀÉí1Z>ìΔ#p¦Ñ‡êªkŸŸ$OT_•7g–c8%e´2Ø>Z·ô|j§…ú†}rNBš\‡ŽËj~JúªdfóVtbM+ V˜í$J®[O7bà~ãõî\žˆXÞÿP6µ#ZpÓ8Ð?¶p¿¨¸M#BÄ÷ý¥¯I+Ád$W‰ò՘Ʊ@_¹>8®7Œ¨É%V<_Š÷˜‹˜·fiNøŒTÿL†÷So}S\·.Yç6‡qÔé>|o ã5ÉEÃj·± b×|ø3¿¤¬MÁÊn8KžÏË÷^ºîNc¸ø¡œ`²N‡kq±bù¸ÍAdXNø¹V[ñØe©%2iÛ«ZS!iîÆê¡Ú:;^GÉxÄÌžsû“ÄæYËûŒÝ(qëcÎŽûT‰€'ºð_@aSúõ¡ðsŒê^çÕ{°‚Y<˜| ˜kø‹.ãb÷ë]pÿ»»g³6,˜@“qF·ÞõŽ€ëÜluó‡ú&¸ ]$ˆGƒP“–¡iÅýtjŸ…9€¼ÜxQhLÍ!Y#¨ã»i…»… Ä—A1ÌË’‚ûˆû©šûb¬8ò°tù-ÄuÎvÚx5©â4ozõ‹\³bd¨1ôq~æµ)Md¶qnR*n羟 AsÒ/žò)‚ûG%Ȧf§…A×¥_ÂQt¨`C‚Hì ÆoÀ^ͦÈJº‘."1Ã!-ìÜb*=`_O1(戆ƒ¸W@f1W]iÙñD büË,"L°#Ú¡—¿mÒœºr×ͪ„‘‚­ÑÁ„µ=…Ù_âbCýbtw%¢¿Q¦…ƒ=ðYwd~Œ;¬ý­ya$ù«ï'1ò%{Ï9ô“vÕ±x^µUÔ`»ö± {Á‚Cgüþ.-KæËÈ©TŠj³p¦ 錺Ë!IUÍÇVËnì!ÚvÛlk%Â=„‹`Šº *+&°ôýpI-$x³Yix‡§Cƒ¶òýܲcìêžf»g„Û >ÈFiä‘•ú’³ÆÃ[wòD-¥PlÝ¥h°g/ Š)ÚíñÊMyЉCÿ¬“c—ò×nĬØ-{—2of^ó´d}PÿÎaŒU()ÁäÍxRÌæp³ŸÊpi{c³†ã:bµv«D ۽ϊŸ”ŒôŽÞ1Ï|´”¿ÏÛšÀ¥ uäFjy 3Í­zÑyÛÅ–K+El®[Ít­f,–ò#Jd,åa.çHME÷Ñ#†÷MÍH§ƒæï¹÷w®=W‚êY᫲}ë™|nX5o}›=-b౉³à<¡aÂhU`Å;Æ>v"Fy€²¢h:õþf·¯¹Gù05°YíÖÒ£¬”!‚f©ò<ßâÃO. ,áÓÙ÷¸»m¬ø¶õ93E~ae}P³QrW—ûV(ÚvUxŒ RÉÙ`¡IìäÉLej¼Ö‚?~ŸäÙþœx­j«Øï%ŸÅ}èì¡ ­oŸ 3žƒr-ˆY(æø±ÿdcd÷{Èo@ ÷4£!T]¸ mc²ÄfÝì!˜zS1f&!¡õc¼éFÊÖ¹Úäv Cà ¯ŠÆ}!Õš€÷£,4úM±x"^9"9Áô…¼;Qåü~# Ð×÷ÕÅ æ¼NRC9󋘯-ö½ñKµéü÷RK3Sðê<6±ùóTÃüí9ÂÙ«ÒŸ•pQøˆM¥73 ©õ¼ífnÓìÜ?C‰­ä1™C'L•Û¿ LØß@@ØoêÎó˜W»œÌJT–—$Æ€öÔmϸ·ë°‡Ò—c«¾ÂøåHÅ«3þÂ)¶mpyá¶=m ¡õÿúk˺ãþÁDÅÍU¥¢È`ºò‡+*°Øs% ²¸vï3*VSˆ”ÞÂÑ2i8Þn{'þ :+øiZ†¼¸QÙŒœZ@Iþ¤5þVpØ~ Áwêya&·#†ã©¾¨„ÝÖÝÀ‡sÛèü£Q0ã2ßO­7¼"ÏTÒ‚B/¤xåÁRj0N\ ¡¼qn1qé° ÎÕlI·°ýÊ•EÎÂç2†ÝŒ•E“ úƬÎ;Ù;•Jv g ¿EÄ0è*뵕ƒØa·5S€=}9r‹3¼…T7©‹=ØÂ¾vt@¿†ís¤Ðù g’d^ª‚}ë(sf”1¦W¹Hôýqþ¸#’‘Š}«"a•V^Ù@b2|©îwg÷™oe˜ùU2ÜÏâûª0<ëUséN8^=U¶±ç(¸©Â Ëa¿E>W`–Ö’¯ï×ßbG#B•êñÙíÑR±ºUÓÜð³®M†UòX–.Ü‘ÛM­ ‹íXìI“ý:»Í,ëAßcZ‡µ^Æ#Ï¿uÜÊ*~лoý¡×âêW¹Ó%”=ÜLsÁtf"sæ^Fçñ»«_<â"3 ‹­ТˆÁG×; ;ƒiЬÐÈl²¬’¶©¶²|—Wì+jÌx~´zóì¿}õŽþ)½v¼º_ï°?«¬»îâ(+ÜÖßBfÀ=¶³þJˆŸµÕæ»H¬õ£nÄŒ2àr„%*@-eË,%\ÿ0{‰3¼næ;ø‹iÌ×ëgµ;6˜ ×/fóḼ…è y˜=K‡(ôoº'¬{ÍðŸÂ Σ¦’b¾›Ó5 ÷+UF4¶ØFÉ~ ÁR×ÞÆÌÕ+Pg¡‰I¿¡he$õ»ú66¤/Mã8íÐ0-ø" n1wˆ«®¬ë ·Ìg§Ýc—ªÙ†€ßÅ™yæ•üA‚v*>Òž‚“œ=W›£öøøÉÚËÕ|RPëqíÊ‹-+[•‘}e‘0Ë\²ç>ζŠÈ^5éí)WP¹Ô’äÝ;f-É¥¿5¤Zì2×ÜÛ§öxþøÛÿG-ôu£g–1Ñ'ÉØ1v1N{÷¹&°zÍÃÑOÚnŠÕäË—ií>7è[HOR&Œ Ô¸H‹ÕI»:Ka.@ø(7ºìé¼ ú}êˆÎN§ÆÒÕÄŠœÌÉI@÷—ɰ:Σ:ˆ°0G0ï+XP’>l/«¤¾œø‰ëËgt›òÞxÌÒh#ô]öU/,ÝD²AíKÄ8Zv,ÙÚÖ“4e~«LOÔÁFÞâb¿tvûÙ÷ºNf· r ž¨-¥5”=å3ž»à øl¼¼"-5Ég _ææ'|aý‰(ÙIµüæ2¾Èº—JòQ¢B³„ñv—·fA/ž-PXƒè†¹fú»´š^£ïçsúâ UÛ×'›*0é$õ¯îúµ«_%2ý¬ImÇFÜ‹Î>M xStؘ$€Xùò‰.4É ø§ æ‰¯O¶ta}ÀÖ7½‚ž­ã¸I1¶¶£§,ß¾"$œ{'N Ôä†UN.í/ã ðw1ŠÃyËMX/|=Bu‡†¾Å2;~x“yžÌ$—-œ¿èqbmpY=tøu^+ûE)<†¦M¿JЂ]_`†v†HafŒƒw“Ñú)&Ö¡m›•k²?¾Í÷¸ê¨> \¬2ÄÆ¬ 3`ñð´Ö|â(N±¯ÇF¹ãžvq±ÕÍåyþ"¾°•VÔ²þS¤dáSÙðršÕœ,öS®NõdàJ¾Œ1ÅMˆÉ³Qv¢?#d‹]ƒÞv‚7‚ü%õ|ïô ºŽ‚o†2 Ú<™ÞÝãɧ6C>ó•ö)2QêmhRZ"xP¶ÜË|YýRqŽçqxÈuTuù¨ÂÖij îC0ЈƒhUäó¨"},×õ¨9¬úkèLÉYñEƳ"(»ì磌ÎsKÉ­öÑÁ<º.ì#ÎݫΆú†‹NfTU}æ6«T1cй'b×Úa“[½‰+#\ ” Ú¡¢~™ÙÛÑ€eqÁÌØ[á!æÆà{ÛíU ‹ s,êÁåCOåžùŰ{TS•= Å‚aÍžrâË9+øf T©au†H S !ÿªó†M”s~– *|£Ì²ÝKÈ‹Œ[ªz>Ñ86"bB›ð‘D¾bÏÝ}1»^*rÖ¯‚è×A Ré‘›ƒ|âIÃS‰Öý¶äû»0ÕƒWÊ¢Ù^"¦Iî+ƒÓ@Ù+©¸i±`Ë …ø¯7•’JË裫öt Ź$—šu×á«bŠ÷`Ú ŸbbtŠé™E¹#IP¢ÔvÁs­?%Ïö ²„öÚ\x,Ø\SŠ¥–€¹cUþŒ›Æp0P®Ÿñà“t¶.&‰SeDFoî-£å/PëŒ,×E;ÔNS–i¦måôSXmbhb“Xí±®nu24´`×DDŽDÌGçJZ~íÑ#‰ëÇYþ¦hg½NÞ’¥#ó?“B(ߺø%K¾ÛŠ)wb“áGÓ®Ö ±(F4œ•ëê…åþ£—EÔëeFÇôeª”™¿êÏF^¿‰¸[Dè,³@…À¯zj:¿¦mv5ƒÕ,MÎbyrPô,]¾bÛ…V OûKTÅqyǰ€ßÏä|F9!ª®A’ÂmX¡&ö|ó[º;v ¿7­t&á¿äg_oqbfB "ž£`É圢È%5~(Ž…—miÙîÓ«]© A`Ûvûü1#¥+XzñÁ*(ìL®Ê™šÎQNHù^z‚2¡µ|S¹…B~M YÂØ~OãôÕÁ3 iþ£Ì&\@½qC·oôT¢}ÚN~‹3ï°ç¡Åa%«™ÈðÉbÔÏS‰E¦ô¸výlcþ>¯Ä@…W9™âÐâ«:R›òB‘ü™€¤?y; ¯9Þ¨»r“õBù¾n³=JS'Ô—Œ¦ê#ïßa™}OýJþåA•AÅm½„§ËŽMåÚ¼ß=_—3m¯ÆgU… /ŽÌ>A‡ÌêhêÞŒ9}urqúE©ñ%ıHÇêØ‚ƒÝGDTɆ†0C¶ƒE \Å ]ð=íb¯–‘ª³ßŒu®U™ð†˜bZ·èB‹»Q‡O²±[Öí®ùÕ !/U)XË–Ô2®3%9tÒ×Aâ´jÚÔ]%V÷k³ÿM?/³nQ²É·KÉ4ä^¤Õ5”Üãµ$¨™ê•Ð*Ðy¦æ4¶Žpr· IÙ0ì–NÝXXŠ=Ê ¤ÇÝà-wÔì¸7¯÷êÉ"¶þÄå?#: 5›|LÐ?'jT%´Ä‡û¨EŽF ¾ÎŒy¥>(`½ ŠÍ«„ªìQÅIÜÔÒ¦ÓCu9(„bVw­Íx#Õ¾¾7­rÃ:ÍÑÁëÿˆÖ¸¹±R$xœeÚ°²ÙE¿ôYuµÃßþƒ—¨gª±YO{!iÀ¾ƒgÉá‘;føq˜Hu½ ’|eò¤wñêÙFEį˃]ø›ÜePð¦÷¦"”š/”~#ªÞ¡²T Õ࿘ëÞDæâDo3Å¿(V€N• ɸƒ½% 7ðS-àú¶©3”Xzˆ’wÜš¥³1èJìá¶9-4者ŽfÝý53ÇH&ƒy?GêN€³•æ·ÉÕSa¶¸…{Ã6)É~d¥¨L Ž£(㲂W2•¬V¡ËwjH¸xX=i;“W oØë>ýÖt¨ñPˆ3é(¯ž¢…Î.#,où}Uz#Ñ‘,8¾^Ú0äìV¨Ñdaê¤c;u”®s_£ ‰½Þ\Ëÿä„«',iûÐT*bôyÁáäöÞÓ!kÝ#àdPªSÒg:Iƒ‰F„Ì 7´çÂOo~Ëòt/þŸ×7˜Û¦Š{Àæ+‡¹æÏÚñuÙnÕ²d#t@:á`¯Z3˜‰ä«¹ÏÈOò«2Z«6&ÇÛ’ßa’…>° tI`úæÁJÈ8hùÕT†ƒ.hZ)éXùÅ$_rƒ|êœæ†Š ¡ë«Ã>ú»Ü\oQlþ$ÃÈÜ>³ú"C…RÔüDuð&ÜA¤Òãõ>\‰7rô# ¦Ê½8´²àﱬ.¢âëNÛ…\Á²Oø ùuEMÍé1qL)(ªˆbhÕ4`J-xšáG»•¦ö¹ØþÕY7:RÓnÒ8ZŸŒ„"R¿/™PØ<Ô]BQ:r±/#)IÓ¹¼%vL&vg—ѽŸóá ¾Â|VMÁgp8 ]€EÖàz© v'×ðŒYû†×1Û9=‡¬œöAm›#×Ï4ø>y¥‡È÷ƒvÄEhÕ¦ŸÍåpËR Çi½v\Bø".GÍ{ü§^0diXÓyÒ¬‡ —¨{£¾(ÀyüêÁŒY•_³gš@sÎôDPΦ¦Û&¡Rž™¿]´Ó³Xlw/έqä˜|Ü&eêXùþ…®½¶À¹ clÈr^*R@ƈÍx4);ž© t ×å•£úö°."Ôl§›7 7ýûå"fdÖyЍiOöŽâ§tÞàfY]F¯ØJ›ƒðÓMµÃ!©6’/N¦›}6?6³ñ78|‘VDñ¦OB«±Ðq¢çíñ²—t™ÅöËË2^¦…+n¾CÇ¥RSpÞ‘bçÖø›6øZ˜"‘W^“®h/ǘÌüŒøÔ]0H“÷‚;ó•£µáÞÌ5ŠŠJ¾,,:Dx-…bÚÆÈj%’Ý3jàÀÌ®zý1íâÆo¦§n'G3y(Ïþƒt;2tѼ'›–Mƒ¾Ü“ ª‹‚%¨® ?oœ<3ˆPü>•Ž@°#ë¥%!î^Ô½ rZñ_Þv§ŒÐ)l:)E93¨ÂH*fÏkDo4\‰Áw,Ó«q4PÕâ>ua$pQ–Í`¶§“»£NJjê~#žÛ¢&QÓÒóáø–†);ìæãßã#ÑMý4A‡Å¯/‹Áþ’RfQe9W¤p&Ea‰ÔÇìäù¬?;¿äë(HŸúíÁ¬(SÀ—ù¾ « ׬,eSÄÆetíÌÏôgø‰ºá——MÐøàØx$¬b‹±Ó*X¹sþ}BûÑFy)VäH?‹æR‚Â)vš?ã7!ìJHF…cˆræHæmÆ ¬Ë ¡<ÔiѦ÷Øùï = Ñ74Äp3±Eø•¬ýBøíëMÈÙIžœ")ßÄÔ ûÃÏŸÿIëÛïÇXó€|¨^÷ùÉëø—ÞûÈnlyxNêœ^ØIŽï[B÷CÜÕA@ìaߣ_žEÍ.dnõ ŒWý¿¯‚«¤I¹¾¹ï‘„.¨é*«£ÒIÌ—A·88Â>‘æ¯ä˜¸ì©P/ VbŠñÂlE·÷>¤sYûå¤ðV÷4"áèý²é0/LE7ñõKB¦°ïð$hA‰ú=Nš°I”`˜èSyïKÑc‹sê„ó}ÕeDI½‚œò*‡úâxà§ëûéŽtï _&EÁµê¸w8Æ|ç°BôC `{W¬AxA§™+¬“ðà$Šy³žŽÎ#Ç›'qÁ#l©+Î%‚lÒw=Ñ8Á÷Qº\¸¬»Ö•Ò8€³Ê¥VR¢³?àû{MŽLnÜß*¯˜Ž9ò§œ½Åƒ+—ǸÙe‡‰òê¿ΜóÎ Ù\ÙÙŹÉ?Í3H´¦O8FwÔÿ“ˆ€‰YÁ‡Ýõ)‹ù0åÎŒTxý²²•ÆBDÄõZyÕo4†á¾M•õå»5ÍÞ½Ú¶ÌOǃæ(QÆ‹#±Æ²[–Ò×Ñ‹=˜B.î1ÖÒÓÎuï·`ÂàÑøbÇ>„"÷¦ñêæVº¬“¡‹mS®SµÕ—*,0s‘ÝV ü@ä½6’Ø E‚µéß3¯Ã{„ˆ4‰^GüBq¸ QôÙ{ä‚êd5R´Ã@Š©ðÊL‚Y±ayÅãc͸¨é=üyÏc¡å0¨å£,”?—m«‹ûµØ­™N‡Ë(B<äÀ|dö:ßkží­”—"Íך"¯ {Ö|¸ "<·ýÍVÞSÞãͧoºÃÏótñ볃÷„Ï$M´[h_ Ð/]ï¯Nâ<ÁÎKc\ØTôv¥ìò”^fRÕð)§…ëøôX]ÜG-ãBºFfK±îvr Tq÷1G×ú3ù[$Ýã±Êzºm†yªÅd:g”® Mh«­uÍA|ëÂ+ù߃ ˆæ? ¤©¾Â\uâo BB‰·¤£Äˆwà7éËÁñbím3»¤q™ÎØ&A–µöŸrnÚe`$QCïÌâÚ$á*»é 0i‰"Œ'Ûé5¼?{á8óªýw¡“ðY;5æ‘\ b°v^šhX­ë_á*|5®ÏC…óÚ§1|¹[ÖVtú–‰ŠÞæZ1]ð;ÚÇOZýg—µf÷ïÌX+1ƒ Âb—®¢Ízìe{L£fRn¬¼¬µ÷âhEŸ!ÜÖ¸áÏWõs]\\ñ\Z_Æ'8œU÷|^`ÙÀS ÚÜOX$,݈UR§e'—ô2´/ïÖ¯4®KÙ ¡9ëËU»jþÇ3 Ì?#ÿÅŽŠ­‹ÿ6Ù^Q2QœAëw%†éGO;"7o/Ùx0òQÍcÍÛýÚö;A]L4´O‡1ÅEJÙ‡ùÿùjb endstream endobj 106 0 obj << /Length1 1448 /Length2 6897 /Length3 0 /Length 7874 /Filter /FlateDecode >> stream xÚw4œ]×6Ñ‚D¯ÑF”eFï½E] 3Æ £w¢·Ñ;ÑE'z z¢†D ¢¾Iò¼ïó>ïÿ¯õ}ë^kîsívöÞçÚgÝÃÆ¬­Ç#AZA•‘W>^8@ASÞH  ð‚@üllú0W8ô/1Û(ʆDˆÿ‡ vEËÁ®h;M$ æð ø„ÅùDÄA ?$ö/C$J v‡Aš¼5$êBÀ¦€tòBÁlí\ÑÛük à°æð‰‰‰pÿvÈ9BQ0k0  vµƒ:¢w´ÃzHkÔÕë!8$í\]Ä@^°£ /e+ÍÉ ð€¹Út¡.P”;øU0@ ìýS/@ßæòG®‡´qõ£ ´³†"\Ðn@oÐSÕ|Ì` Bsúõü{eަ‰€{ýmþû|J†54¸þTüo¼<ÒàÃ#$ àáøøÄ„"è…ß?Ãhƒa¥úÛWaƒˆýÉݦeìþ8þNÀ?ci!Ѭ…8þ&¹Hdþáû?Sý·Ëÿá¿¢üo$ÿï„”ÝàðßjŽßúÿG v„Á½þ2@“ÖÍ=šHô þÛÔúghå‘pÈëT]Áè1CØÂÿÝD˜‹2Ì ц¹ZÛýáʹÁ¯ƒÃPm¤ ì×¥àáþK‡,kôÅá‚&äo=7ÿÜR a„ü0~!a…{ „>|èI„@=SäE ]Ñ.tq~$Šà×y €r¿D¿‘˜þ‰€V#1Ðú߈ODýDÇqù( ºþ†ÿÈÖÚ …Bëo6¡Kùþ}7@¡žPk‚¹¤µDˆý›·gÕrt<_F¥&Ù¾¦ròøÌ¡ÚÜ.ˆð^rVe<[BȽ|×M²°¦Äq,û‰é§Ïvs^xK¢Në¥ïÕÓºã_Z fǨú?lËÕö1àÓóèËnøþtö}ä€ÕŒÙ¡Æ–ãì&J¤G~æÑ«âYÛW:?6óEg£JXðªt‚'Ö Æ,¨xŠ-×*sšæ>®+Ãí‡dûžÄSÇ'“dÙn˜Ô^pøíÄ ú˜,ó??Ÿö^,×çwé¤e¥5¡aÀ:&g÷‘ÿš¬Fýѧ¤(N-,ºÈ†Áb¦Qºì,XÃÜ1'YúþÃÊ{šoOƒJ‰×ÆÃâ¬uVÙäß}ƒëe·ÓåÔŠOüä{šOà¢Ó¾ù“Ê;ºxOHº"ªP†êÕ¼éÆDœ¨ò{¿V L_õn¿•M, ZìÊ0áäUÝ} >GŠØÚ‰À±ü¨“*JÈ{çÝÆWËE¦P"¤ÿºr‹óëtŒ8̉Ho5:!ÒåÖ¹{ DªC%ªž«ŸÛÚ—3F¤ûÓzuîÞ¬¥¤9$3 šƒgoMä:iŠEš…ÃM³ÎšvkMˆ8Ýú“ôÍ@uР³€¯V4ª5rS@k|’Uµò™ˆ³Ì/«S*§¶:;# ãôªzŠrå=/¶ÅîÚEìaË,a‘&‘QP[ ©Q-z{à'?_ì§·OvR“e20ö²Ì){`¸È¶ VRqU“õœ,Œ‘G&?|ëË×…ˆ³í2ù;Î…(U½§¼G$'HoØ “îÛ·4I<º¬­Pˆ;pî™Êtï 0©|,žKÀ®Ô`ò@ ë Ò9ƒ‚|2²ýkï1[<ÔvûÃÖ—böáNR=$–(êž„hE–!œÉý~1ʲ­À³èÆaQã|\*ä“TY¥ÿ“Ö{FõùC–XîÄz7Ï<$Dé’/h<*==å®°ðïq.3cZaLª2탳‹*ùUJXn“˜|*ãdxUKܘøÈ„ô{+Ñ (°CõÎX„€Ýil+ž=Ð;¤ehÁý”‘1ë-ӭ«¬ÿÍf9‘˜‡Õy§ÆëÈ:];,b+u<úØœ8š"PöÑóIR”jÚ†„q€bº Û"x–ÓÜÙÇ·O:ø>y±_SJi}WRÂæE¶"¿¶}&:g‰{Ñ QÏÇ(ÿmâßÒ¾l-§~•¥üÒ™ [#ûäCq¸Eǹ5ÆÂ,ɉ¼¸¿ˆ&‘ç°ƒ¦#Ÿ¿Úqê†ã“øšA¨"ÞiÛ¤¾äP5H¨"Ô’q*H»ÿÕ×{® l‡Jå|ãÈ,@Hùì;Q§ŒrѨ:Ñpe=`Èò´ ʈOé‘”ôÒ¸rÚ[]È`#âÒæõFŸ-v‘R¿·§À¥§-uÿN§j%còOlÍZFéYIoäöÎr›e ut¾’Ýíl7º¹aEÝ…ˆÜŠ4(rÌóÀTæêà'*¬¥›OõîýÈy¹Fº\M“Çh{bUt*'žð™SPô$çƒ÷ó÷ÒªÙ Žâ«ÙF ¸sáÊÍC-±KEDQØÏŽlØdò‚>ßšô–q† È”®dñ°ó=Q¯ƒÓ¥«oqŒïQíL^ Eã8uEpoઽYŽZD [F5:%3îN¥ LwŒB>ÆlN/âÅ^5Y@>?˜“(-+ºu Ëœ!ieaÚQ>(²n¸adè¾bå‹¶&Š£únœ¢~X\!Y66O,%å«Wχ^®d’r’z <Á_˜Æ86Ÿ†X?ê®×¨ê뙨äa÷B "?]-;¿}L·D;òZ4üü‰è1søÔëò93EZÜ2&(ÕÄ|M=MŠwkpBB¿¿´umŽÑèÕ .Ù‘c)F§=UøÂ|!‚ôãxs™ýy2;oB‡r¬/†¶¹Ec”ˆ2Rç(Ò]à³x0ÿ­ ò­ETê#½h"Jæ½,Æ ¡¾FÕ¬ôúÌ=w„åœM`\Ðʾ'ùDsçAÆ®ð8Ÿ ^:rÿ!´JÁ,<è`b_‡tËa ôýÊùÓ¦ô!Sû'ìBn% ¢Óú^ð×3Z:îµ» ‰•1±k„yár¹vI×ýO¯VéKãêtᶘC'Æ·ìbÓ¨Á“ýñ)ä5moaläøÔW'œùÍŽ–º£gŠ[“áä%ÚÃI^ß«"•í¤X­µîY´Søž]Ä;*¸®lí«”ÂÓõólM¨äÎc¹{œº‘§ yÉZte>ÈÊ>KRz°±JÞ%6‡‡KÈe!ÆöÆäƒ1׋5C‰×@µûnoG÷Ó%޾d cMô)Úªzн¾O‡òx×GmG^¦KS9E•׸ä¯n—©»e1´Û#(Ø>²â)¢™M1“ðÜaFcl÷kÿqtGjöú>S?Ûœûcç9}®dJì­w8’ÄŒë¸Õ©síˆÚÑlÜÖc®8m2G,·=¯íi²h<,kù„‰ßûºª¦”ö‹ÂíPMB»5QF§šÜø¬CƒÛ÷=Èy qn=§ÊÈX lM›…&=a‘”m;pÃb©üâÅ'¹RzñÇ¥c8áã`põ+Ée"a/»SÖV›î}·7…YÎÁ'AlOgQ„f3}ƒ¥WNË,¥îgš™ÕÓ¥Ú‰OüÄów©ûlïÝ¡{ýÒ^w΄Û3£¡w 5ª,ª#É¡|dù¹ËoÀ°cÙjT@Ì ¤¸¦ŽjŸÐÑwö„Ö¶ÙŒÜ_§-{€ÐˆQ€⪠‰±{E͇@©/,Òß?^¿®§›ºlUm™e7-ݳÐ.i<.£R_Ž»žR)€ü¨•å*y•3s•Kþ#¦&<Þ4CÔ©þÄñhœÅ=(ÅÒŒ­Q~€w|½n)Ìó6¬’+ÖZeèúqÉgÁGšèvÚKNÖ«oÙÒæK_}ÞVáŸ=US;3õͯþþO¤¶9Vª éx×È.Q<Á·ÜÇ œíL\?ŒùšÙê!BæuwåJu9–¦x±"/8Ú·ñÒ¥GÒï6¹ ³awpžš‚¢Ø§’zçu¯q°…Òë›75«Öê“ÍþxžÌ#>t¦ÃªÔyÜýõÃÖԷ鬀1Z‘íŸT.s{ÄÝÆ˜u„ÓDšd"9•>ÿ8$âNŨÿbâ4.×Ѷf[ô´c¢$ÿ‰ÏäÉÄf^ú®|¸š>Õ¨>ñþìó–omÄí–´¯C ½#.ßF¡JLæ‚êËoºûdõúŽ)p53’á Â«ÄB ª­xM9EqïDòî'WüO»+”*HûÉ…&ðU¼5¨¬a± oWŠ7UvXÂ}IíÀ‰¬@â¾Yߊ•¸¯O¹V“dGþ=ûôú©”ÝU͵÷Tß1£ÑŸäÑ>58àõ÷'öŒÕ—ùªm“A_È1ôéj¼â'™ù+±*Íõãµ%HTnG÷¸¼W¸cöQ„™ª×ô¨µiãt¹dx“3g<|[z×Ða4ÏVÃeù.Ð &“é-Àƒ±ßci%z[›èñKø0d›qØu¼7µ¨íPö²(?_êQðQ‰ÉÙ‰q;é-cõ!6ÃËÆ¥‚k¸öª%îùvÒ™–Ût|P¾»®K»¬-í3ƒ~*šo•LìœHìYvÈô.:ÎeŸ’ ³_^„öÞ÷¸{N™MÈ' t“±–D´í¿°j‘|X.”Øo¶åº¥­p¢¿>6„äÒðŒTMJ>=§¿Æ`hšÇ3ˆ¾]B†ŸÓdß 3lâÅ˲ì. _¥Î3§³2†Ó<8Ÿ,N›½´Ü½´‚º"Éð‰w™ò1O%À?ì],È»ŸŸ%wâ8ùŠíoÞ£ÛÈIÏXaBzÒI´÷æµ$p¦ö†d¿jM§wOóÉ›J¨ÒÊ %«Ÿ}Ÿ{Yz4(êM0«(×Ò&=ä¶îÌϪ>:Äù¹¥GîXþÞu'†’€Ìd¬†ü«zÍY±eªàD­áœÆ]§—I~5¤ßÌqxFÞÙP,îL½¯S£˜ð€Æ;˜“ªk)¹<,ÈE M4~Q§Âb×C£5ç·YËH»HËÜôM+¡À4Ť@{ôÞ—µ»y•Þ(EŸ¡Í>• ³ôÖǯ¨Í ÄSvµ†iâÉØÅQônÕeUŒ£!›óEðÄzåCšòB™S7. 8q$ªµ­µ.Hª'¯l‘ñ#[¹UßV¹.(•–û;t§Dàûpn,–UÁ*ÉÇ휟¼¸GI¦¥$°‡ƒíJZ#>0kSºCDÒóØûÖ9-{’àáFƒÝGë-¡g3ªo©ˆù²&z:GG ×dáÖºP¶?»©91p!Ûe„šœK|7Û3ŽšxÈ8Tw Ù»SgúhtmÇFÅ óri øäu V®—K…'ž©psw±`×pã475U^/¸Ku†G1{D*ƒcw-BÉɤÃÚȳìŒ_J#øáüeÇÜÄó}†ÿɽÁæ+9Šv6‡­èæÐb3ôö'Î &'ª‡éŠO¿ÔHªEשUS½=Q°Šm~0ß .qœìܺ¦ÿl™k¬´7"QÐ Ð+ó$<Ÿ×çÈ0õÍ{2Ñ2¾CM›¾|ããÏfÝzÔª‡ñ,’÷K´dTÓÔÌ.ÍBZøaæ6¶Ù1ŶkŋȻvçõϘ•Ô©*ÈB*í£}s¸ö‹F«§WžŸª™l¦JŸùìbZ0¸1)'ÚsÐtil bxóLàˆQ޳eí Ãþ2⬰ð8LþåT¹Á–E°áZ÷×ÙðÜã4Iþf…]LxÀãç=è´ '^1D,Šö/ï> Óq*´øª×ˆšÄ=Û‡> L1((§ê|^<Éé8ŽuyŠZ²Å´ŒÞp+¹~™Å»ÆÙi|'€€‚:t"¢slï»\ž>†±ZC—úX 9©9ªö4¹ ‹ôËÀÕKŸÂ9#ÄH{±õqß|[áLâî9õ÷Ô(*³¾šqòùýg“R8ÃâNâ›õB<ƒ¢¹cóÐýÇü=°Ÿ7]î*¦Cv2øóŒ+¸jæ2cÁç£=›qs,u¼ðGƒv‰7¯oõj‚çïp‘YôÆ8¯”MŽy/T€XÅ€c£qÍ„œ¡OLˆGòÕZ—’³ìÄÁyyÒl¥ë [ëˆLr¤ø9 ã鯧dJ{8%ôdf‚4¼mqBÁ¿½>ÔûúšfUAæÊöbX]Èâ:ê_“+OSµ6¸¾·Ç\žé—8¹•|o‹±"+ÙI•ä­Êý]ƒÉáÃíÎÙz5ÙÊÏÓ7n-caß^¬[fcG(-¹­pJ醥öý…ÁWGÑWECr񴌱 \ø’ eGrHŒ±rp.Úñà†ë†^š.ï4I› 75±/ï`÷9]0) «äöç×.DÚ,°kU~–šÉÔëçÑ9Eiß19‰ nçözÓð}³:/#~<€SÈ vÒª‹rÍïþ~šM™’!¤×Þ5ûéA‰h8þuKØ”¯ÙáUp]Pšq¼Öø 4$yªbfBh'°¼q<šB (h}¨ÀB§ö¼L5c§¿5{]ÃÕè>6nôÓÇL˜³‡³å¤nu`£sz©MÖÁTù~¬N(|Ç®Æò¼ÚÀÔ˜‘l½O­ïa‹ ¾Æiû£¬_¬¶ð¸ÝCšYZApMÆ‘¸ÍëÌ84@4»Ù©îÛD&z¤ËÇ|,ÝËx40X3"ŽÉ¾‘°‹‡ßШ~^äPþyù­3þ•]ö óPh¦Buz}í3Á!ÉÙ®ˆåž ˆóËðÔ(•}ÜDBO·GÓ%˜éð5ý¶t´ä-‹Í,^±¹œ „Pft,CÜð!—1†½Î1]+œàã'á£2í¨Wl4Éy!yžïÆ“Úö€lê4pªìá~-e)ç{F…¯áâ+}Š §=Û¼Õ‚oˆÃ/:=:x¬™1¦=5cV^¤š³s(T\Q3ÙGKäÜÔ³»š“öõDØ;ÓÎ_š(¤†‘v“ŠH÷Ðí&s(Q›Ó“èÜUª›QÄ“(¦Œ»ÏN>MS– eþ€¢ã0¤í8+ž¥äg~Ybýì1†.wDZaöÏ/PùIF•Ô˜Ù¶»Íx˜)dM/oüäç䲕ž™Pâ‡Óöó ;;ˆ§N:”ÚúJ¡’P‚<ÔU”cKó÷Þ€<þŽÄ춦Fìn–:‰Éë7 ½t—Â5‚D¬øtqäõFRÃ>?c@§žðÇþ˜3…‘ŸJµœ’$ eMúËÀ5ØðU§·“/ÝʤIªˆ›[é˜Ö% kL0Åe™ôv8fÆ='†EÈR‡È2-‡â°j~ãV ñ&qaª.E`ÃÕJ+¬àɉmìgis ÙÈd\ò‘óÉí¼ eºA!ó£o8Z,|Êf4ºr¤ÝIâö–gMÁ³EM¬„x;l3 8ýQ»pMN©N¯‘ŠC*í Û‰Í/\Ò³¯î¯ HZñ±ø2ŒèÊœºYÝ!fM¬?©Òê4ÉhKú¡ð`ýZ»qG¹ëÎÀé‹]ò®Ê»ïÝî#K¢½Ò^F=³['L#] ˆóW+¦7(–}‹™œí1sƒ9ˆEÍ“WŒùˆdÿ™¥w@.ysõaøzŸ‡NÔ¤:ÑwI²5­öòî7¼\äð]vú†S19` ÒC£¨³·‹r³6¼KÕ\~˜ï;O¿\Qº!*²¡©|á·¼Uò=;W3@ŽV¼†m<`È…L€£0³ÃÝê¨ß$ç@ùûÝa@VËÌ^©t4uÙØ*/¹¯b<¹}y ³àÜP£Ä¨°y$½ÿÌß=)¾Òw‘k…ºÏz™;™cUæó""ÞIXÍ\èá3Z¾©iz¾i÷ºçÇ.~¶x÷ÏNY6-,¶¾…ãï›a¶ü‹çvŒßFnGêMùòd÷ÐI¿qShö¦«ÐÂØ:Ù¨¸Ht`Ø®?K{Æ8fO¿ðc@¥Í@v&À"Æ“]ÜtDÊÓ”Rá ¾ãRm\!_M½Oö‘Ó¸fÇáì¥òv<âÛö…òqUn´/cIòj_¾Ì<ëM¡Bt¹8Ë`_rQ›žâLÞNO‰(”…?äeÜåƒç:¸^yàJ¢Öî€EÕßõw5|’5òý–«z¿ü ²–N:ñÈâxêusG!Ð0Î( d2¶s…§z,oõé¤^²y×FÝ?,ìduФ+úx‹–ÈnOéêÙî56ç>Ì÷Ÿý(Äñ0ñ¾ä=© #kÒ…îæc‘Ÿ‚Çb=´Jä*[ãªÿ8%Î endstream endobj 108 0 obj << /Length1 2461 /Length2 20872 /Length3 0 /Length 22284 /Filter /FlateDecode >> stream xÚŒ¶PZ°-ŠkàÎàîî\ƒ×Áƒ»»»w‚—à·àî®ÁÝáqäžœsÿ¯z¯¨fµ­îÞÝ{‰’ ƒˆ‰PÂäÈÀÂÈÌ “ÿÈ `ffcdffE  Pµp´þ-F PÚ;XØ€xÿe f4t|“‰:¾ÙÉÛ€2NV6 '/ /33€•™™ç mìyâ†Î&yF€Œ è€@!fcëfoafîøFó?_ÔÆ4.ú?Ý"Ö@{ cC@ÞÐÑhýÆhlhP±1¶:ºý'5¿¹££-/“‹‹ £¡µ£½™ =ÀÅÂÑðè´wšþ( `h ü«2F €ª¹…Ã_rSGC{ àM`ea 9¼y8L€ö€7r€Š´@ÑúËXî/zÀß½°0²üîoï?Y€þt646¶±¶5¹Y€Ì¦V@€¢„££«#=Àdò‡¡¡•ƒÍ›¿¡³¡…•¡Ñ›ÁŸ™$D”†oþ]žƒ±½…­££ƒ…Õ%2ýæ­Ë@&b6ÖÖ@£Âù‰[ØßÚîÆô×É~Ù¸€<þ¦ Ó?Š0q²eRYØ9¥Åÿ6y!ü–™ÌÌÌ\P_ /?{6ÕÁ†4'(·éÇ}œØiA˜Çê+8©í%„'`PÞõ|¶óT÷û ÙþC†"ÇΉY)ýÎ¥GÒµ¶·ti8xvGy·’Sñ©t’!J-Rǯhš"×(s‡Æ‘ŽíÌeúúf -{ì•X&ŽÁë(Š­ÐCk5ú~Æ}¥L•Õ¡—W ‡òmx‚ÒCt?Y{Σ¸p¹oÞµ‰¿8‰þË2*ã>kz¥ÅÇPCwµóðB;ËvN ¿};¡º¤CßžT³²E?ݱší3p¿ÝTt¥õF½ÓÔò Á"Ïdí+`IÓüз±Óã±Înep¨á6øKóÝ`ÃÐV§—F‘P¯™ ísíðå%ÞtÂ/Ð¥Ž#@i TúEç$î'hà ~ÿsÑ<–Íff-nènða‚ŽÏóh¯òú3…öõé÷sV.hº¯œ ¯F?¾œàš³}0ȦÎMÿЖ»C¥ÌW¬Ÿ(e:[/Çb/q#–‹ßä˜?ï'/d—–ìÞ™« ×ñw³¼çÉgŠ`Ù¯÷ êá¹1Ùß¼ùöMTóÀFýþ¬Ü%Tt0zC•+07¬ý£ov‡ƒbª¤HÄ×Û­™nx#²cUQgë† U‡­‘ޝO.ô¥ÒâT… ò½²ü!ž ºóâ…ݸU¾ÂXa× ¾¬5mŠwÔ`ï2PW¢)2v— ÉôÛÔÏ_ðDñUTïòÈÜ×Áºç&G¶H~Nl‘{X•ë±÷4ø8"S!­â(Iæ¶|Ó.ר#Ã_LÃWÕ\Dê ªÓ§û€kGÃP¢d°mlÌ‚£GR€‚ªŒU¹B:Œ×Ù„,ËM÷Láâ˜F šUŒkþ o:šàäkâB¡j¿àÇwŸ8“²']%s•AýßðÓÂq·-*)f³Hæ&äXÁ°«µ³ÒÞ_múÐDš}ò‡3Þ¶Å?C…1P“|þ]‰íC.I oõ{ª÷ë/ã"È2(•ŒÐ =5b2£`2Ž¥`”Ý\0±œÕd~êãÝã‡3³R3ø —L%CÈsf.¤‰1.ç*¡äž•¯~6Êü£{£_' ¼¿óg±0—xÂ¥¾ò·XŸÖ5ÜÏg¬šŸ­æ®•øÂÕ×WU¥ â]r%b!êç@k'µ_r»*ñ³³Ì^ 8ŽÝI-¢ ñq¦65zÙË:±°=¦©‰A[¤aÕI9–×LLyݸá;xQè¬Ùúê47ï²+²;“h§ëßJ7çUÖV>aöíGà1¯~»—¹—ÏÖd.Žqöà\ÃIœÕ¹ë@ØgÛ ¦‘²á ÜB&fªNjÊ2.Ëâü¤é¤Ç–’õ0 Ó•ÌjC "t[¢F—¥ îfUdžRÿRÁ)­DNnõxðPÖÈ€½®Ýs8 Œ¸ëǃÕž£d¥0K4ªt¹•ÆM¥w²ñ–/cíÁq_uŠOÍ ™æ¤Mk¡ýŠÔÛ…ômâ•çÇhñšPO¾l"–1 ÎÏ±Û 3³lÇrJ¡’­è±ž«GŒê¡K[Ân+yމ‚ŽXczÁè¢âÍì˜p¡«+ñ>·‰œÉdž͡÷6‹:S䀨€põÕÃ1 s|§f®û=ùñýøm¿/EOù‰AL—Õ V]›Òî5@…þ³´ùO§ý\Që lÞzd¸ùd¸’7Î[ÿŽÅU¡Rq ŽˆCåÂ…²„ápªª2KÒý®˜çŽÀUü6õðs«ô“¹ÂCݬǶ"9…RÎÙxÆÚ¢þkå©üÑ/ëá™àrœ‚rëe# æ…hÚƒ´C؞܄µ&ÓëîL«6 ¥¬¹¼Dê"4*¢rL»ü¥X'è¥bY"ùk·™V|?;©Éšç?Aƒ$`âIá"ÀRÀ¹=>ÎÛÄ¿ïìQŦÞÖ×8ƒ0yñ‘õ´‘GÔGŸú¢ñ~í… ® Ém[~ÿ•Ó÷[Nµ^Û­¡c1œ°"Ëa.S&˜Ä9qâw67"²Ô-cyù¹qÉ^­çmHë²×f÷±H x4«Òûo¤]2‚@¨yuÑ Q¯=ušX¨e•% \úÜS¿Õ¢ÓhXX…m-Qý¥mJ™ŒûmrP¾®wP_qôµG?©‡¾ÇRΩDRUz½vȹGÑÇÛ¾,âØû˜'<4&8aÇFÐYyàÁÝ•ogcõ…M±9Ùð¤Ö” 'ÜqÕF0õ«²G0ú´¾±Ñ–n÷G¡UÆÈÓõÙúóy¬”Ãû•+³aí««óÍç¶Ž„N!#¡U(2*f­[зrs›% 8ê2ËÐX&•X•¸SÍ5zL‰kW÷‹¶¢¶2«èÌ\4š,Z!iÜ/Ižù©³ñ|oȮ̂]5ì øÆ³i§^ØX4\ˆwÐû|œç`Bv넃-Ïß+à%ËrÇÕ~Vj^˜WଠÞ!/ÉÅC.-gñB™ 2o†¿²ât‘‘P¬¿à—…ß9T)PŒÁrNðY´Ê£Ü«¿ÓÜ™«£ZÓXß  ìÈcö“¼àb¦1YÀ[,L:Áeáu‰!p÷÷¸‹HÎd³#¸1^hç¸6m®8²ˆ8•—f¾³cÔfÏW™g5rI¤38–œ(ñpÌ Ä‡kV{ISIˆ¼·¿ñÑqÙ길â¢inJ"è­p|¨YÞOÀD#ÈÖ_nJ–¬¿Ý8;ð¥&ygÕ€>qÂb°ÌíÄxéDw²µ@úp)ÈwFïã>X7A`ÓR¹–ã 9Àœâàÿ~vMƒEÂuìdzÿËÀìÅ:.ªÞUÝíº~ñýD&©.™»7Η"[ç‹N¤LÂà¸Ô›ùÞbF{Qž0rLP£¦X¹ËCc©‰0Ùm17Øøg…éÙ*ðœ)¾üŽ_Ó V~Ô0ˆó‘ —á_ÁùÖ7 M^ʺÁãËQŸÖh[Ãùû¾æ&mõ¢¢—B:t|åᯗŒAû`¤~g¾Þ6ØC©œ0*Qh£ÔÖ³9ñ>À‡¼4¶t‚­õV‰gŽçH+Ê'œÊ`«œéÈ~QãžW!±ðhÀaêº?±XÆ4à]†¡ÆJ%+» Z‰•;â.ù4«Æ)zËJPß‘"Ñkþ©â×lô¡nZ 4ݦ¯n¥‘ÊÕ𡃉:ÊI]ø´¥ËªXçQûz €ý|yƒ€‚` ÕZ…fY®˜J8º©³GÚö…éOš×½èÇšv@¯Öêy‚w…·óš!JW£àjòŽ._"Ϧd:fP¤"©jêÁµ”…GQ¤Ö)ò·_“3:´‹i¸z(ÛŸrÌGA™ïªq4©¦— »¾«vŸS}²÷™^Ke郒 eär±ᨓ…jör~ާ!”×+zÈJÔ¯-é}N7ZíýòÆ:6«Ì×…[2,PËoêõx EsÞ<•[[nÞÍcO¸bI!÷A··y=qHÂè껼i­AÒ¦¶”Ü9\ŸÙ¤c {ĹÍ"‘ˆ‰Gx`Ã1jøh}?:%ÚeÆ!®Ù™9(¥˜3LèÜTŽN§SÊñÛþ€BkD±BçÙä^ǽÿÀ8Ø“üÎt´ßÝ­Ø9€xC¿FÔ½b($;øŠUÈyºâ×eëõ\H÷'pÃ|nÜ™k„ä¥3—X¸;® xMa7]ïó lˆÔò{+ÑÙƒ²xâäLgæûý†p‰Dÿw+k'%Ö µCýMï”\Ù}¥‚r0=Áj<Õñ-IÍb j¢“²‰^q,\>íÞmHéN}Ó†¹cIM=6æP¸ã)µdå’i}¾¬w`‚< ÿnF}U⊩Lì(¨]±É=’ éÐÛèÇKü‘œG—ƒ2ôÁÚ­‚Æ¢7ÜyðÀ²ëF£8B®ç£¨áGQC«‡®µú9sš™¼5òE•Pk»'K§á°èÑ-å(õø>ÅL–Aë½ ¹$^«‰'‡â”¾¥Û³ÊŸšÈa¤ÖŠöP†¥ Ê[á}f4 Î…çA˜ßì“Qõ¯Ž@Ë~]pHíŠO[Ž" Ð rH äˆ/BÐú«XzúAKfñõÞYX}1|QDUãÇŲ¢!«gœÀžïËÄ•q‚‰ûV?”mã‚ñ¾åùLÑtϼ¯/¼`ŠâƒUÁ¥z§×tÍ»í%Sm)ü Ãõ[mÀjfÉ!¾ÑfÌ%e;ˆè’þÄϪTMgY¨|Yü±vø ùm'?G+91–„O=޼/vqs=v“…~BÛãî,b*tùJ,ÝÞDÀAÖD¶o2Éò‹CIVÔçSõäpDÍÀAå&k[Y.pg`¸'M÷Òüªa¸TrùºVÓT%»S”š×Þž½î«b 5ÀÉÏdͤ£_`÷$ÓàÒpÓš;ÅSÙ¸²ûÆ…*ˆÓD†¥uñ}U`Xnd—SÍïÍ‘‡µ•ƒåÌK5vü½Uì_Ü 9òJš’%3ã|DͰ¬Î—#UÄÇ8<øÀÊF¼Nžú"Ƭ¡ˆlÉ`n¤éa¹dÀæiáLXaÐL%m•óì³^M²S÷”{=¥Ô5t䑘ó¡2åT`ÔÖp_ÑoÞüPñ3¤AfÃIú–íÝûrn'·erû‹ä•Ë$'S/c»n:ŽN7o’çÝ™Ìü»Ž#d5úrðvÇš] ^©‹œvÅ ž%ê } ¢ß¡„zû‹Ý8 –`™Óþzƒ$oèÆy{@VPº”–EŒÚ±ó|Ò¸û–ÎúOÑ(7 _ÕÍÆïl8Ÿ×…Z­1dâï°¦Øo -¶æ¤„—cýLÇž?7~d=§0ÚxÌÙgå¡b#Ó º¥ÖöÕÀ,Rø¨…"5øV÷‰K³_f#†ÛѱNu9©üÝèŸÜVKËÆ!h[!Ìn^Ù…>±êvŲK¥ä¥Ï]¤éuŽÛÉmj2RÔŽ/½ßÝÆÇs Ñô\¦Jb³ š‹ËE¸H<ă?ò3±:>Ë÷ö_Ý;ì|õ}üÌ#ýé*Þ4¿$cróuìù‘}áë§GEɨŒ¿6H:Æ»Iie–T¸;5‰*áö¡O-—)'DöeÞÑ}Û ýÑÔ‡¶ˆ&p¬»CÎé\£‚§ªù>Œl §BîË+ûhÑÉžP:ØÕÍÑm÷½¶‰º¤Ü,=Ý–f™äKÁºSc‰]]7Ôà ¸yd/JÙý½Q™{ x‰£ð;¶[ ZZzö¾ü¼° % ¿†¹Á¶|k¨àë\Þà«÷pýX]\fÆóKsó'¯‰"1ûðì>Õ‘}DSœgˆ”üøD%/>èpÒ©VÙ›)²Ñ8Õœd‰Û=¼ç[½éHBu®0Wó—Ñ´˜¯kÌÂøµ±›6Iˆ7˜Ç,1ÎתBÐè©@O0\¼žéCµ?`Ž‹_UÞ"j"F}„Ö»wMßœ±µNê |Ÿw<~yÑÜà0ˆÁ–ðÖOwíŒ €TËòŒ ú_ß()Œ¢6‹Ê)¨Cœ¸·|#øÄ;¨®ÿ1(8ó•‡VšÙ kª^‡Ôcî”Mmѽï|Ði["Ãrx¡ èZi­xˆæCl(7Šÿ“Zaƃ MÅ™zøOL»iÞuK²Â¦ÊeÌPsX»~ÄÂŒV$†&áxYHI®˜-ÒrOåñˆÝÒ‡€Ö…»ƒg¿W~ÜL zx!¯¯iéŒukQ—ÛiÌì™ "knܬv­IÃ|“L†Îr-Q9Á–ñÑ"ŽïÓ=Š'ÌOÇvK–‰¾t‘=û—pÌŠŽ‰ŠÜaç.zYbOpø‹º ±$õÕØØ „”§tåÀ:íåU~µÎO¼Pþ‹KBÆt7ëÕðÇ -Ë¢*<ÁwµàQ¥Y¤Ý³=µfûª­+ÛzF%½p0KÔ5´ä€H˜²»}ÌðÈ„­ = ûònM÷BþÂ`Jlû/|"&ÒbøL¡~^ –pNwŸV(ÃÏá²ìx´#~² ¸s+…*;J#"¥’T=X=Ëصã“ÃNYçÇ¥”¸:±+‰Ž5·5j$Ñ>ÈÇÍé¦ ˆ†mf“£éž³Rð+7ínzïBšëmm Uùä÷“-ö{˜|µu™$³x°øElÇcŸ0¢ærÿéÅ©¢{) ¤¿uŒåV¯ hUVµU.Tø¨]~«hSð¬¡ÈYÊhÒ·QŽ'L²7÷e_D¯{O±bY¬Âqyx6¨… zW…®Q£I»=€tøîó¨”(™Ñ3±·ä=â¾èR¢T(…/“­˜WÛ&6w÷æ½âónàb RlÊ Í„aßmúadsm,1J$øï½Ù`Ùž//—Àƒ:I<±ž2¾&:xB–kͦ¯“ÐRzÓÆ Öæ‰~~§|jÎÈ}Z’åm9{£eŠ÷aÆOê–ûp€¡ GMDIduª¥–a¢+={‘é‡ËÄ E)ûÞ‰ð{%ü…䯴Â-Ã`¿¡âLãg*?í¾RŽÒ¼R§|¢ßS{ÉÜlœ«¸+nô/jhë5¨ìÌ”á<ÀÁª¹“RÂ''®–™êà„s†8I• Ü€òW¶îÑ ®“Љ)I³öSþ¶lÀm¿GÜÆ– Y\>öºÜÖDäJWZïÌ î:µÄró“¿VÐ+Ö˜­Æ¨¨†zrùd†Ø²¸ô™CÂ=Å8cfÝtàAF{jq–ôM ŸÎjé‡ÚH>}7zªM[Vµ8ý©9­ ù Œ[—b±äÕ`–g&ÚD³Zf­äAJ—ÄJk &ìýéøX9³ÜDïgft?åˆWƱ.†à:¦{b.eäø±/NJ‚39Iæ¿…‰†‘| ¥ öØýÁQþcŒ˜|½µ,{ÄŒþ9¢™Zf±#©¡=èÐÝõ“´=.›G #§,r¡Y‘‚¾ô±èÅð¥ EçÄê{.iÚæŸ±ÅÎ;ò†qÎ/C^üé,r^=í¹~[§^/¦wæÂ‡ šb}¥ Qæ“Zî_I>È÷é$wH8™© .*¬7ÃC5ü¬½×<,Úeb›G¯.oN¶ ˆ­Ÿ“Íâ€e°ï›-8bl‘;“ ŸÜö•:w•,rÒ66àwÚŸh…wíh"¸ýñ Î_SNzsĨc¸HIûu»ù¬–!ù÷/!)ùÖõêd[Ÿõçk`¨Üö@çê½EÅb Ç<õwtƒ¼ïñI°R—®:r¡¬8~ú–d“ßDv“¬æ(ÅV'3‰ßä‘ÂrØÃkz~¢¼I4`Í@žJÓ,ÇPxqÊøSÛ<Â[]±uoº«œ¤@dÂ[—¦óJ|TQ${Ã0_JG‹~îÝÈÝz¢eq82ZÉÝÑš%Œa&á3 ·cOʦ¬ÞÙfCö~ß™?¥¤UŠùú…Ëp]Ë È U tK¯l¹ÅÌê}aÿ¸. Ámš)2ÉɈØþÝÝ/€˜âGð Üw¤<Œ Qz=.[§G§²ôÆk)t·Y“ ðïŒÚ)¼¼Í³ nÙ ÒtA-=}AâCªWA'Í%þè¬cùÈC9ïàCýíÚrU‹ef6)ò½é0ÕPbÜÑ‹åÀŸÒh#3ˆ_škºBãÕN^v©}:Öý¹í\lÁ÷mÛƒÁÉ–”'DÁý'ô¾p& ûÂHŠƒ„²nÊ>‚+f6qpSy¯·8>° Œ€&Œ;ÖôÛ!1ƒáÏRrowÍ:î#}5~š•¯ßó"§Ž¤ ÒWDN³¢£¶ÿ{;}Ù¡9úÓƒÉô#¬Æå C1Oà—f“ùú´•‹^JG—·ƒÕá8É+ŠXýŒ¤À[å°t­Ñ‹#½ 2¡çÆYË£*âøç—9hì83l >n)m\ûe1vÜ|„8>Àƒh±DCš¢4–検躄JFЉž’ÝñCM3ûœÇô93{˜üYÇQ猿y‡µ|úzÓ5ŸŸ.×Yÿqþ.£>k,ÖåëÖ[›ÌáÞð¬g£D2³°ÛdTgœ-%Êg±•P:ôÆÞ5 ê>¯ýY'üïÍö>¢a}x¨¥(EL\LÝþ؉‘.‹ž±öŘ˕g‘ñÂ*‹ßÔ«aµž¨Íi¨Ùy`kÂê¡¢Šö1𬠆Š>>¼[¼€»™LHÝ©¦š•xàCV_Wñ#ÛW×q1‘….ó¡NÂ8²dÓ%Õ¸vLåivô«ÛÂN¼Sz%qpÈV0ñ¦ Ž¡÷ëºR{D>DnO¼æ7‰®B¡)Øüøi¸ô|+˜!Ñ)j£xK*ûÓךOï/nä’ºv8ÈØ«Šá–ßë{z4Å|8¡ÌɃªÆIOì&åp¾Ýê˯á§=Ò³½üQpİÉïÒ ÍãSÍø›Nž“jÝ^X'ÔÚ8ØôKhš”X'š˜˜÷‘úa`~ÜúY‹”¹j¿¢¾^•Rð¢%åð8Š–LÏ{Ø¡w|5V14¡(M~!s\óÁø[BjO‘ÂMK À^1¾&®‚eV–n#n¶¨ð³>ÈaSýa_`-õ°ºFv-SÎn¹ûP^ðb~ÜH[Ôeöéâ‹~¢‰†â›S0÷‹¯…0æ¯îºæ20Éî´†¯¹ÏŒà?ßáèUò&ØÅ;îƒL}ßí†æÈAýF¿†¶ü•ò.ÃeE’ýÆ/Í„rÄ" áfO4£Þ-Hè¬Ð¬Øw¬UðaÞ,ù]†+.-®9\=§ >Ü:".1¼B„Àž©¬îÆX5´IÈq(@†h\õáÐS$'(@µŽ ¦bd¡â[Z‹ÿèÍW4#æ†&q²’hX›µglUZŽhÄÿ¹4:qX@;܉PÐ^’iÑîw˜Ùjp+³fhÈÖ¯óÊz2LÈÕ×ñÝŽy8OGAHâÝ¡œ­Zð÷žGëÅ"†â- íæ4V1Y3Û¨´vv·÷T¥?WôÏ·/׋•‡î•R÷Vk0–U‰`Nl꨾ôs—9ÏÑn¨šàÜÐHE^„1ö” LØ}ô­ÝŽä×_1Ö_€bëââ ›5ŽlPê2…Ùš£O›s`ÈyôΑ"Õ½Rã¤éURK9¥÷<‰Ï¯%«ÞKÞ£:Å´PòÆþê·•— ;~UDƒºå„Ó§ˆ%ÛúçbžUýZ.dè¬ÙEtöÚó(™Ó†¯ñC™VE§aüõÈ2¾B[»Ýª'ŠNÏóóØúºŽN„UEDÓù gN GhÇaökÏÆ‹¬ÌiŽÑ"tI¿r#{1w)²•Ñ-—$ú” žÂeGñŒ³6í×’˜óõ •ùw¹gwÇ͘8„pT x`ëÖçe¼Æ!ð©¾Ð@ I=—c1.€Ƈ÷]?ðN#êl’§W·77lsay-qq!Âti?LHáT­½«Ñ‹ñvš\©êJ’qÈK¸ÆyÆH=¯|d; ˆ¯0D¥óêòä,l‰^d«¾Ïëñ“ÈýÖÆw4á«o ]‚÷RñT2ž««$391{Qpv#î‰u¹yó¥ñBå#Ïñ•ÒÝ9Ï_Ò¾VåˆÆdÄÈËQî{Æý’…~5=˵ˆÅD¬?¤åÕ&{úe¦Ô.ü¾íÚ…¿ðíͲäýdj4;K9~ÃR‚ãÖf½¿ßt>@,†Ñ¥ä*Ž@RØùQ(ñù<âÞãR-ÍïWô7¯W–ç,Û B!1zÔÄgUIñ'dL… |(g<lJ~Õ£ E_(Ñ8î…§øÿi¡·Â„T¥·=}ï]/9)WÔ•K›d:B‚¢›Ñ»¡à½œÄfÝñÝø³-iL9=@#[¥ñní}1×ǹhý¡¸,¡÷ $fî‘ðšÅ,ÝßÙ ë…+[”àyî„¿Ö—ÄÒ¨'4Y åÌd|5øŽJÇ_:8žÂoNÍ›…¸&ɨ§ Gò\%+óìð…m^¨ØÁcj\’6¼ŸRÔ¹á*Àõ‚ª¦ŸI mi‹xMGIˆtFü¾ ^­v»yQãù}‹ÂƒÕ!†tRQKå>&µG€[½IÚ†cúzÛ4Ìåü¹©Cp*Â,Æíë’ݳ½}=½hûÏq{g¤àÂO"_µ‹ÉQVðîxI²K¸y9 ¼²œ>zVMn’ÛI×g’Ê>3‰½ö©!o{“fsŠÂ7`O³‚KpX’Ÿ QÚ}~§ Q@|”Ê ‚d^ê qf"úlÁÅKsÜU C Á‰d&/vøøn=.YÐ0ñãNÖÖ>¼ªì‹×樘i£ó–HÚà¹ê3ì‘ñ‘û°¯µÁn%0Jòµä¥ù´OöŒô ‡*V“Ø^þƒ gïlühÔäßK^ÕªŠâ6P"IÒU•=¥ÿN6ônu¢Œ$ OÃMš}⼈¥aù&ùËQíÕTÄ ÿÈÌ®ù§J^Ã%ïèoý˜‰pFBŽPÃfpVÆG+S÷å²¥ÌÕ£+$í@tUÍÛ÷@ï[‰ýd…á)G 5:Ëðsoøaæ;¶^±ÖvY·Gµb¸LG™Â-ÒußÍm?‡òî”§…Äm†As×^Ÿp ƒ°ŒœR칑¹ÍU±ñ;Õâwý'8TûŸ1ÚFºé”¢n1Ýgƒ¥•¦L6Œ>„ú8Ö|ŸZ‰6”{fñœP”µ@מY?ŠŸkyÊ_¥<3)Š “q#‡©ˆv^!ö²Â]†/7H䂸¤•ŽÉÅãGbÞ¯Öÿ¢þ†¿¶2W$üáŽØ˜Í{ x©… ißË`m©9•—T’-2r¢ËÞ ÁÍ œÔxúwIDG;ýcj’>̹_bY‚ÂtÐËjpr•E ¢o}Lep~¤zˆ‰_ÌHâµi¼{Û[VÜã÷ï’†ÏO˜ÏÎZ'7Úlži0Ä­—’ˉºñ¼ ÉÉ[ë€øR¾Ï‰ÛvDç ®…°åœml7:]2…kÔOïù[£ÆfƤª“B…‘­O¼ü¼š† êIFl#ßòÚ›+ÌŸçgÛ?yÚ'Ί{ …<ûŸ$¾jJå‡W™¼c³Õã}äÄ•ýÁ 7ñ Úe©ë£¡³&­\rCŸ'Ýt¿\o,oF]ÈqJ‹a‚e†è:øgˈn«-8×—€i»¡Ú;qúôÇímO¶®_ñQйnö_`—!ÉFÌrY¨ÉimòÔLæí²Ðä;öb‹Ï½²D-ÚàWJq`îvÑúÕl©kuê ùýûp”tqE+¡bÉ#Î\‹PeÑ•TYÅ"]–~®dp×~ S[Z0«Í:Ïj¥-˲bª†ÅYÓ`A_ f:<9½»#ðŽúNÁ_*FÀœõUgWd!Eïø?„-’¼¼Xmڠ㪂¯#®EgJãÏU'd¼ØUcèˆf¿.«–Pí˜i—ñ˜®›_“Ïl {|­«ŠKü˜.y÷wÂ9r ò¼O0æÈ€œµß*Úg2hæYµFî™I6&¿Ì»™Q8­ùq³G$£fÛ@^ÔšòžÁ~nqȾVÓEßjvDþp äý<»Ÿµºâ-¤_ÂRýžTään´FH£h]É’xòtÅb È©š_v ™£QU~4»õ‹úÃ{Ãî)<º6ô&âT(h*ȯÀ؈œPœÇ‹`a;añÎJh…—áIî?[víÍÜöÆùx†ð¼Æ|n”%¹†:U˜WÈ7ü áÎÁGŒ4æAI(Çò+¥™G—ˆ=0.¼§T³ OéÊ< ”þ1ùÖ¿{³Ù—-j^mE-œRoïùò†æ6¹×¡?µƒNÏ e«Ÿû+f#ó k$Õ·ÞuÎ5–]xÄüØI»¦ ðÌ‘åô0L$¿oWŽí;` 3C¹P¹3¤$tŸÍån¨ëf~‰aÒDZÂÌ™ú¸l"¶ÿ´ÉîOíùƒ%š‘ŠÒµ®å³¬ëGÒ‚÷ ´ðÆb¨§_McO-Ôù‹&Åð´8,µÂ13Ö$ªocVô_ Ú¾û+ œÛEÔ·$ŠeË}A2¨9ëH¹^^ùpq6#Ä`×òóøýáÉQxe~~ÑM~uîPóš6H„ ×`ÉHÊ3{8¯D‡ÂÈ4NŠÊ©ç¼9Ê­ –,.•Ê&öâ&™y£f¤ Ç}t÷ œÞàDCÞ óÄÍæ'2yKb›oØñÉ ñPF÷'0U"ð¬P.h X¨6ûéêÑþIÊ«¤§ N`ú;÷Üðá«ùlS‘£$tÏ“|¾-F&?Á,è.9¿4B!ͱ-);ÓaYˆ¯IýäÒ›ˆðšo#¡Ð¹!f³Ï6!¬HqÑH„52”å˜ÙƒL`áÎ[°åuÖ¬?Å_÷¶âsÁ%»#¢¯ø­†^>·Û|)XtÐ(jõT c=`?0ÊÍ…‰æ„-¼:«FÜ;Jf.>JP)D Lu¼l o6g >ABç:Ó<×”-î`%FÚ4ˆ¢Žz”òD5(ZgÛHÑî¸ B«V§—)¬º_0Ìç•#ž°!ªžùsñ3b+ðÇ2'’Ún~oóÞ}}àTF¾×&S9õyÊJÁ@Qž$omRU-ÑaÒ‘G¯kíZݸ»í ¥£fâ®þòQDÄ!iKñ˜µuÉJ2J´ƒâØ×‡Ä‘=»ºdŠ  xÞîXã¼þTy¯Ëµ^9E—î€Yo“Íg¢E +Û&R»ìÄèð^âˆÉRµ})íX4@a«èåÏd­#yÚ0‚¾Te›*sõò‘>–Û9rG/mð£Âµ°Ìk½ice?©C]/™•°Þ ÁR¦J?uwy›zŒò 0®°=yTBt‡¿*$)×/°ÌELI¤ý°"8Æ(ÜTiSäÝüe šŽ<1~0£ x6 Ð' üãŒT<¯å'':ÅׂÀdg6¯ ýÁD¹–iõpë£O,ks ˆŒNdÊóòfóf9sCÅX\@‹}½ôªÝh.cVtëéúE=ÂÚG¿óiöF!(-&Ú§‰¥–*ÑwœAE-œ±¨ï6µA aÞ¼íx­`«ïª¸ýÌø)o¢58”!ã8Kž!Û]?¯ÊØOàæi7ćl Ù~·pŽìÿ6H»'ØkÕ0âMRT4;Í©lL “ü9î½SÊšŠâ?»<ÇÄÒЋ`¼:éî%£eDýyÓRC3›ˆõ}E«ï©h@iüΠ攚Ǵ&óôÚ޳3ƒ¢Ùš"<&èH½,&¡PÆ{9\4h2"-óFmÙ¶ Mxá ¯ÐÇ™óѽ¨§éÎ÷Íå_»Ab?$6” ÌgÒ±¬ Î*äwÜ>«‰|q©¦8ŽkQ–-†rã 9'-'û8ٳŠ»ò$¢%´\qÌ… ¶܈õÉçÔq1Yy+ M^{Ï Ä9bDuï%Ÿq-ŒnÙëe—7£)ã5TŠ ®²ÎÂУzqíã©w¹ƒ²ã)DÊ?wãÉhÌ×Züú^W¸káç? ¾­––!0£¿|í6E»¯«n—Tä†ìèT`ëê¥NØNÀ§ùE±#Å´e14¼~ÚÞÂ[õ²p2Ã8¼*6kS,²!~Û ï,íʦL¨‚²Èá>ÿIz„+`ždÎÁ˜Å=ÿ8?—ŒL Ö,_€³ˆs*ë3¥m²¿–ã=eþúupú‰ØÑåÖ׸ƒ¾ÓËÈ'±V&D-4 Ë¢€Ÿ¢‚LHÊ?潈4Íî!‡{ÌžóÁã>ûE@x¸Ø™›gÃù(Õ& Lhþz9H_DûNcªlnýU~ò!/w§¼Ï³@ƒh* çþäÔQEmƒÅüÃc?íU@úxð©Ñ&+(î¶QrZÚÕ]¤Öˆ)oƒÞê ¨ÃfÂÒwˆ¸Ûq¬]4ø]g¼†ª|%;ʸ+Å ,¸yÒìÙ8 ¢š•ùpŸ¨ˆ»÷m§'8¹ À†Š”Q-ÄòcVèñ“É ‚°în©z°<Ì&ZDtëCωS;×̰üÁ•Ž(˦á’2]éä€'v”3R¨ÔFj >ÙP¦ºj«ÍÓ é}œþØzÎOª¬"¥,æ†ì†t£p|B>I¹¬NÚð¬ñwòäz˜ÅzìÌ\›:ˆ< êìëè¼Ùý }“èóŸq0SàV ¨õ[ßM纜u/sƒY0*ï®¶–ß)0 šŒãLc)ønÎLÌH1tÈÎëvuîg?£ ‹êÇÉ*^^voé"zÇûR´KæÚà(û–}]ƒ¡Xþ^’¶‚8ÆÖü3C Þ¿Ign‹›¢z©=òyx)R"ºü3ŸfF·ªc‰‚<•{p|Õ²C›+»oo\÷EisCZ¶SKƉ|“gƒ’s'ls€qþ† IqÜñ¤‘Ûc'꥕2_Ei$òµã[-„¿ÈuŽŸ‡05Ì‹Ç/ï|´ÐNUBÇÑ|1€õ1»€fŽÝ•¸2·Åï0rÔòA®Ö‰•}ô$\‰eŸüˉ™F…Ûd¯šBéÞ.WÙ[ºTxP"¸C¨rÀ±[W†šãýL†·“,òÆŸÁ–¨¾-,Qrd––f¥n°-Ädæñª #Ž»è{Xúð“=ä"vP’Lg&íÉsRî÷;§[äw2tåvúœw0D2~_/ij Á@ëö‡¤T“ä”z„ª˜òðÂM˜Å¾|šŸudS*žu1à«H-ðl×P—ÔxhÆ8Ò4«ɸWÇ5ƾ›˜‡B(eD2×­åÚ™Õå¤5NÝ|;µå”¤…QpL?òKc.>£Oå¾ ÷¹«¥æÙãôFIt5ödqþ¢ÍE5FuÅ8Ó‘.º)KË=Kì˃PŠj¡ýÑ1ÓYÕ+¶¤\¢ÊV/ãñÎQªíóô€ HUzK®@<º¥—VƵO‹Ë„ ;u?èñdÒ;Dî¾â|m)œ ÕMEzzô¹u }°’¸pNyžA-;Ö®X°trkWqDò‚/%gBN¬Û‹W%ÌRã¨bœ“çU…C6¬w­qÔÃoJ×Xû¢j–U„ö`7ÕÀFä0ŠÅVæŒW¤à»¸vÖÙëÈê£ÂÒ<ìAÝ÷aYƹºÂz!³d‡M@Sˆ"&bàkÓî)èñ§·"GS±¦™Ê»®/ß©ëD'Èâ‘c$ +w(Á["ëµ(ÉûrQæÜQÏÂWÜ—mÀ]¾ÌˆÒÆ]ªË ,‡˜ÇµÐ±Ù¯ð?íxû+¾ÚOô˜ðÖâ%–¦Ìg±À®.ÿG â!&_r¿}”ìagå”WËžpÌeÌðVmòcÏÕÙÜ{®Ðm/…þX ÷Ø ÊI„åìÊ÷nëCbw­Dœ¿¶­uTJ‰1ƒÂÑ ‹²wDÉ-Å% g° _‡hwJ犇=Ä*SîXt7¨à˜è cŸ]''ÈßJ^?E©„ÑÒ_¸Æ»R,0i:ê;lÕ¤+þ¨äÖäÅç9ŽRK.[šÅò}ц«Ê‡ì}ÑœT*[“”Ÿ,žAWôõjäÔ‹¥Yj7‚ÔÍüTê —n¾m¸B§OéšA¯L`dל¢WV–·ÿК.¯ôã{DïZ#—Fåá-M»N:Aï»Xîq&„ˆ4$fÛW®X³SÜnÿ–åaKç^«Î»Æùs0"ïÀÑ=¬ïuIøØï‡ß±¥n†ÓHAìÖO¦.Ù—gÔ³Âk[S²—«¸ò]Eý²æ—6ñC§Ü/O0-E×f ú¹P)é8Fª=J6|Oay*“¨›.è=Lá ú¹Ø¹/û±)ùÐQ0q‰EÖÉŒ$i5±‘¤×¾RÈs.%€à\d‰¸ ¦ØòìY×/&U¡¼ØÃ+îxôtY™G`ʰÊèë#x”2S tÅ“çÔfHÆ.ÜçHʼn&Ä;•Ôµ í<0ÉÁô<0€ÔHý’ɨz—¤¼F(•¬²ÅŽx7„)$u‡&Î…ÞœЩÀ»ûŠ¡Tšå§•¢Ø|•¬$ ù-'8ÏÓù¡ò¡•›‚1¹Öߦñ6ÕUñÌc>¦ÉP Kô»”UÊz½£ý½Û iƒû—Fmµ²•Ú)å+¯ôJoLÇœ—má Fþ­ EE ·¢–Ó—cxÌc˜ìº[%2CiAáþΰݖZ'ñùly>:g ^UUË…^É虂”"tR!Ýê1t^bB‘Sç¨öÿV©êý£D„€«ãìkQª®Ùœ›uÀÀ£C ¢Á ²Ê–§»<ú@ng#ÈZ˜…‚‘U…A{ƒM ‹JÑÿXîèû|É÷öå Æ -YÔ«Ü> b‡/‡d³…²kÖ`Ú“1Î< ˆ#œçédŽ^-¡ÒØD>²¡R¹ô]Ë?›¯dCzé½L jA«;Wázë¤EϘD¡cž8í/"wֺϡâƒ>º»ÊäãRÀ÷~ÒÖ¸3REâÆ¿²VH—› kÃ)™·x%£êC%SÉ “!p“ðÐ ©™š¥ƒØ£%Ô&Ήa%hH›òzuÙ3¿ƒÖ…^ÁÅO#†-±ˆ…F}ÛO@ I)K±cûد¶®||n–ª\¤ÓäK<‹)X»ŽéÎ{¾þ½£,lñ{û±!Ë#5}È„6€îÅ&õ«©pË<´Jµêõ@#lÒ÷_”pη›°·ê,£†ŠÓÙÄÈÎ|ÐŽ4~c¸û½íáŒæÕ -’°Óuß3Ë\ÿ_%æ´çU¸»ÁJÂÔËlö-F¶ä8¹lWøròd”ï“« òéÊ-dž¡¥|¼f¼uÉ:QD-G‘3½çweÇKd=T‰©bŒ æ×«ÿ̈U€u°Ì¯÷â+¥$ B£ÒH„³žÙÃý—+ø—Ò°ïìBYj!= é=¯¥z ÇL–¥;§TÐQÑnᘠ])¢ÖÜc+Æ€bqSoØBr6&Àè\±ì P3Ù¾¢Ô61?¦—“ÛJqøþPMÿвýPáš©}_ÙýŽ>£>"kÁ‹¥Ò›F7‰£’8säpbWŸ»\èé*¶lK¸¹#-›/® ÌcV¨Vi«PòC7Ñ‚Pgtna[´aQ‘‡I~àðácwc:p±V¸…׈kò„åþ÷JÀ¿¬òDYÊx”rK¢Y¿á•i±˜ãªB`1x%+Vå£ÄÊoÓ¼ ä¼`EÜïjoÛ`ÕRBKåÞ‚èi*[Ø)àeÞ¹P˜Ål4óíÓãÔåM¹%íè{bcŠ“C‰Cîªæ.ø¼þƒˆ×´ó_}d—wKú«ÚA°bÚ¥ÿ¢|¨°Š¬Q-ù×TìÈGFxX‰ŠÕ–ÒoíÓÙ4•'Õ’ý÷gD»ÌbÛ—Ÿ‚`Ã%ÕÐDt­•) ûò"¯ËT‰¾ Ïѯ’šÀfJå¬yOn°‰í¢˜Çj  …ý~üóŸùf„û0rY´]E¤éN‰.LÉñ†ëë™Ù†3'Yò¶ÁÇÑ:´¦æH¦™J«ÐÁF— ù‰tÎ)µ’=07 dì“1Æ+q²’Ib8µ î·;ùy·fý1}ÿŠXv5LÃqö÷C lÀм„K³k;K\²¯\l±:ßCL¢2ôÖ™Q€'?W9â)aIÆÏÙè_ºcÜ;í(yÅs¯÷Y@„ªÿÇ.f¼ ºâE ›6,‹I„¤/€Î‹(/óòå¥xBv0'÷‘eî©™SuÇý“x.‹ê·.YN|TêFâ7xJ<º;ä+qÔŸ*°«ž&¯£®jK&ãCjFu.¥}äú¹·?+ÿ#ÔžÿÙÿá0óê5>.!xËÕÊ £(S bÈC+©L6L :õ°€i>Ó›ßF̘۹$U+òð ránÎ1A^ ”àÈ•À ñWR{<›‚¦}eÞÔZ=sÉÉÑø*½Ë'üH‰7åiZ*òî‚Δë Bzv~‡¦º<ˆn½&ôÜr êñ£üc|XÀò+™të6ªR˜˜iýÜ]¹Óݨ…ò+ãaª?Á +ÊÓ˰‘…¯ÊŒ³š›è¬Ê‹Æy¿ñU3à>@+_ô3ÖEV•3O|å³”åÄÄ2ˆÃ5ªêËi»–M²Ã¼7rR JÆÖî‚XªÂ8¯Ø×Ó»{ë0˜H®ˆèm›?3É‚ŠÛFÅ K¾ÁŒ}Hx+â?kÁ•A²—Òt$o^œçÅ@…¸ðEü¨ÎTo‡¦“ZU;þq)åé>Ü“×ÄqùWñÝ"ñ.jCÃní Qáò‚¸ƒ¯ m(¾y;΋¡¢s¾£¨ƒ0¦ýË¿8yqŸ¹Vræ§dÂ*ÏŸ@€†§ZpñèaB°ñ^‘ ü¶-ñÊ=b˜ Ÿzdƒ^¶ÃÉf^Ž#Fk,/„§¡™Î¬‰ H¡eR”,Õ¨^플+ÊÍóveÍáz=øëg*òÊ‘çuƒ…”Lîèý:9òÍèZNÕH*¶vÊfça)‹Q”D™n®FõPþÖwd"å ¨ÔvÄÁô>b Ð2Yùh㌥ÔBš],µòï‚‘Tfr ƒ§$œÂ„'û‹^”ˉ³-?þ‚ºx:ƒÜˆ bíY€¿ÌwŒ´^ûŒ)³ŒwþàŠËÍzkf©!ð)èÜ pMÀ“F˜wå¦ïíüÝ4®CÐä‚ÔSB1¡ º–C}ð{º]mXƱ›{ìMV°Ç4ä|Ðp5àswŸÖŸ aGq­öŸT¾³ [q>í¢ÊÚÍ1n&ø=Léª3´íC¤Ä z˜%Yû ä4çèùŒÉCâöïÙî(Iðò"7ö=%JܳB~'Rã²:zÐGÙÔZ Ó;)>Gh’ëý{¸ k€1ñ5ê„þadퟆú*7Æ9ÜÚBÉü>=´ûŒ>Ù6wS<ÜFNYhË‘ÝvÁ®¨0Z7)kg 2¿›8–PHÿüSÉþ¨¾‚­éYÐýë ¤I4|‚4ôåµn“2ž½KRNõ’·@Mm\‰8¼o‚×ü° ";šGüÅ ŒÃIâ42œ{P heL5{$bi§lß-7£ˆù[„Täz?ÚyŸ@õAXù˜ª` Çç$¸UŸ‚‰b—S—ˆš¿"XêÒãŒ6:¯:…h‡X‰TïšYêÙªßæ¥´7@—úÊ_Î&G¼Z,ü~ÍEÛ¢N;Ó‰äGxϬ+æƒG%Èúº‡wÕŸ.»FuÍhxÜbF›gØð&êk@„[áö•š³˜@kêBq̹ˡ=°×õ|.:ÛšñÀ‚÷Œ ìOÂ`{~¬±Ã.OöWñ«9Œª}‹Ç)%ñTép9-kW5½T@€è/q¥×v-n"ô³0´¯-XÝlîΓc/lž§ ãNHÝÚWˆ‚ÅFbEa‰Ý×Þ^Ö6‹B¢åt¤@ÀœPôãñ="7(2^Èÿµ‚ÒkÏÓÉQ'„¢k‚:ãóÞOWø;¯M­/ü`ÃN^ÚN’ï`¸|Gn ¬PJQ×^›„@šg ’²Ïè[WHõÑì Ü-´Ô`pΑ¥‰Æ½‚(%·Úë@·žÅK²Ãª2ÊÈœ¿ýá0åbP[W4ïE(qMɇÈç{8ŽçTþß4¨Ò,­·ôÍÁ±'3. R³DyØïš¯-iÂØ{Ê ßGñÒ÷„’×?+#ÌÆòêò¡Â zGrlFW¨žy½ƒ>LêðÈ­HÌ©ÓL’Sh×þÁ~*ï0AT@În°È'ÓWQ  ¦‘¨åKû¦°ª7Æ>›§Ôö™Ûü’`_lBÉ]I*åøÄÀ‡~ýF -½5îÁ<À“”¡!ìÇ!i³àí׉ñÂ.! †`ÿr4ð<ÊÞ V òIƒŽ(ñ«oªti™¤F[ì_;ì(àL"]‰¢ÎjÂ!<»ƒ}RŽrž\ò‡©?hÄx?Çà‚$nVº/_¡£ŒvH½²$Zf:ƒV+5ôˆ¡Þ솠åú°b•T_¢ó&š¾ ä©Ð7ÉØ€ZDXq¼¯Ó¢G ÍÀˆË0 €Îôë­_3?=9½Ö/†@˜ÝõNEñþg;||xÁw°»,Iì§¶kZ[ägYÌÑ›]ºSÖpâîþŒã –“V³Ê`Åën°Q$t ÿ!Ÿ¤Rtw1,>1Ìþh1·ñ>ÿ(œÀ°“#[Ij J;ƒ.AÀUÝ»¸¿É6åfZãp8ÄÎ jc^Úuë©l‚\.2 ™‰š£ÂS L]¥„(Êñ–2æ;Ñ›g¡lª:Žå0^þ!¥èU]yJ2pŠ ]Ÿ]þi³GW5ÞWq¤¼˜wmc=v“ÄDB=¥×~åשpW[áøvó¯2λ¿Ê\~‚‹ægExwz ±¦v¿Gëǃ")ð¦n?‘µ0oÖTÄÛèŸnÓ½qÒᇩ۟ÏмþlIË8›‹fV8mä…„­!ÇÍý?™U…p•á]cÕ§@¡ÑŒG’ùB5Kð=óù Ãgi—ÕŠUlÏa„ €Sòú + (f1ÖƒÃ奵ì‡g[¹6ÖFѹag’ÛèÈš!v†3ÂÊ4l+ Ÿ<ïe²ýiu«w hÅbûZ—Œ¹M½ÌÖ®²à:W‘eE¹2]Ä5|>B…¹ÚGÏáWbÓñýjÊh ´®¢Î>Ü%SÄaÝyÑJ,·l­ß¿ÙWõá}h¾'éS¹X8çu¹¡†‰ª¦ß6+:y±›Ìô²ôun§p×;JýJÛTEµ:RzÌ<²™G«Â cÃTˬ§U“´ù<²ú ‡*05׊v¢ãŒwoÂUc«> $z”œ.á3”PØ•ön¹]ÏÔõ½³ƒÐã©£ö*C~0:e—rÊ\’JFÞá]*™ÕÒoÔ¢}†ƾHU¤³ñ¥FX.iŸåYœ˜"~inó 51Ÿ{‡É‚ž6ìöoºãq9-ÐBÛ{½µ[Ó¾ V¤_~c†FïVÔóþß½²Â‚]ƒ¹r9j h³Ô]ôå +ä“”ù8)`/ .ô'›üp üØV;§¡èc´&æõ.Ø@Ù»’GgšÎ®2KœnyDZlq ÐMbül½àÊ’áðááŽÎ© ù—ò­¬ë¾M©}zO,¼oEØ}ƒ¨ †{&žì‹üÁé+#µ÷©ÂOœ[?º­Ó|ö 2ЭÎD VYeÀê ³IHŽûD?Εùœ§ÿçHÕcn½Ÿ1¾º;:LuÏg ´û:’l._¦Wóí§‘ðéêö}˶3LÎP„rmàFC¢/g€6Ι½¢{QDÛ'!Ô ŸUæ6ŠvfOy H´!Ðyót)Ê{"•É$D2‰ž\Ù¨6€Ìþ;{â=Ü|ó‹ë‘'¥˜@­TØDfûÌL“²ËBbv”|¯A®G#W%ª=¤Û‹õ¦Ý n½ÛŽfº+;r`QBJÑŸlZl#݃åpC`uTññ´'íŠÙsCà˜Û9[eU*1p•xºw²Z²¢ÓÛ’¡}!æJ Ý€ÔôH nÇ ß(÷ŽYÄ¥HP×ô?¿Û?‚vÐ?«¾CD \Êp€è¶§¬»ZÕîûÙc¤@ƒ¢—1Ê\°ÕÝ<²U‘ú98üïd ¢yÀzÖ‡¢³1ðÑví4¿i Õf!&q@>(ç*hèË?l½ÛmašB¼Òm>yher‡c**ï‡I猜k(ɯզÝ5á¦}u…†ÇÙÜTFÑ~Á-!CѼVí•%Fzº¯ƒx=Ëu“rOϤÌ䌖\ë¤s‰ƒ&÷‡”ßpGMs #ÿÅ!±s}(Š]ú^]VÚTœK/G$Ÿ8Ä3¬~F“Ã’­ãÏUgdVWSŽ1[yLWÞ[TÚ-¢L¹ä3®œãÓô>¦¹Ey4´@d>z¤*÷Gyhi Ó„‹ø¡ÇùÊHq û™ÂP]0aºDæÃšmçQ‡¹WIÓHX'îŒè]V1áùIQ>Ž…Ú•àé3Qé¨CÀ2ço•®h¨KˆÆ~hÓ´‹ ïÉÓÈŒV‡f‡v:Ï¥E „ÿ9Ú±ùBr'…SçhŒå5mkÒkÀz1¤ÎÈïàhëêj½·rÔÊJa81/Ù]&S |¤i\8§šô²§ÈCÙ‰Pçß¶ÝA®dõ´ÑŸyn·ºlX˜dqâ˜S#“EÊ#„˜tU“ûŒg‹¥Þh¿áÙoŸÕÓa¶}㎠ϙhížWlíi§A4î;Â/lïõî¯Á0bRØx¬‘­Žê¿” )…š3äȫҭåôGÔVèPRfÒ \ø¬«~Pepï™:D/”à>¯¾ÆíÞßpFG&}ˆëÑK/%ã]¨nqYã—œg{7Šâ‚¬me²•¦‘- Ýè˜ei#mã _]á[`ÄN˜³†ÐÐN,Ü­€ÞKÏêÖ c$ž­$fîÛ}úÄù;£lï/fïõ&"2¬Ê¸RÒL£fDÄÚ¥½ÍÉžIƒæAqÂlR”2UÖ/ „þ°©—UÓÛ5ot܃B)·ûÕ¥ù^[ùãR‘‹÷)1c-ãú‹× §ß d¯-ÅúüÃúÌ6´ö·Óx ®Z`Dw÷µ‰† 93eûì&í»b?.‹ý²úN„²ù‚6åOb/æÕ3¢ù“c£å:ô΀EI€4ìVQ:§æL–Ñ:ö7vKL„é»ÁFCkØ®k0«Y¿"¯Ä4¿ìYÄ{Û¬ U`c— ‰[ºæåÅ]”0PeqVÀ­µ]ã‘j†Í,$nŸ>µô¢aþíi).\+A‘í'Ƈh„‚o¾ÊÇÝ +'"¿ùþ‡ªS ®…kt4‘9)[Êu1•ü‹¹@µ:E‘—9Â!Ü·—AäÖ/œ°«j¶ ì‹!aœëÞ¹Ûó‹ µ¶°o)iU endstream endobj 110 0 obj << /Length1 1842 /Length2 11403 /Length3 0 /Length 12564 /Filter /FlateDecode >> stream xÚ´TÚÖ-ŒSÜÝ‚;—âŶ8Á ‚Cq-RܽHqw §¸»+P\‹<Ž|÷œûýÿd.kï¹6=µº»¤…£HÎ eçâ ¤U4¹¸@ ÈJO¯mµýmF¥×A\lÁÂÿ †€L¡/6SèKœŠ# äjàâpñ s n Pè!ÂS7 € @É rA¥—vtò„ØXYC_ÚüÏ_“93€KHH€íÏt€¤bcn ¨˜B­A/ÍMíZŽæ6 ¨ç•`±†B„99ÝÝÝ9L\8!VbÌlw¨5@䂸, P5uý5*=@ÛÚÆå/»–£%ÔݼìmÌA`—— W°xiÐRT¨9À+ÿÀøûl\\ÿ)÷wö…lÀ&›š›;:8™‚=mÀVK{@MN™êe˜‚-þ4µwq|É7u3µ±75{ ø“¹)@NR`ú2àß㹘Clœ ..6öŒÈùG™—S–[H;:8€ÀPÔ?øÉØ@@æ/ÇîÉù×ÍÚÝÁÞK°…åCX¸:qê€mœ]AŠ2‡¼˜Pÿ±Y > ( Ä 9@æÖœ”×ötýéäúÃü2¯·“£Àòe¯%èåÕÛÅÔ €B\A¾Þÿvü7BåâXؘCf +0ê?Õ_Ì Ë¿ðËåCl<ï€/ÚãÿøüçŸá‹¼,Áöžÿ„ÿy¿œjÒrÒ2¬MüŸ””£À›‡ÀÎÍÇð¾ÿ]EÝÔæoÀRÁ–Ž¡¿È¾œÒÿvûûþ™þÞ fÀ×Ru|-ÀôÆßù€æ/_\ÿÏJÿ3åÿOàTù¿iü’sµ·ÿÓÍô§ÿÿã6u°±÷ü;àE³®Ðý«8¾lø‡êþÚY…«Ãÿö*BM_ö@leÿŸc´q‘³ñY¨Û@Í­ÿË_v?–ÌÞ Rwt±ùãU°sÿË÷²Yæv//‡Ë‹"ÿt^ç¿[Ê‚Í-þØ0n>~€)bê‰ |7À›ëe-@jÀÉv„¾¤^ÆóX:BPÿ¸Q~~§Ô¦?‘/€Sé?HàTÿq85ÿA/‘Úÿ §ÞÐ 2ý 8ÍþABNóÿ Þ—*/„Ã?Ñœ§Å¿ €ôø2"ç_ðË +KGWÈ¿2^jZÿ ò8mþ_ØØÿ ¾Ðqør½4ÿ ¾4wü‡ìKìË3þ~!ãô¢`ÇÑåziþ/.\/Í]þáúâtyYêÿx9'{S—±åz©ù¯á^úC­! À A¨»ã¿^æqû|áèþOƒ§òWøÉÆÜyy8ÿ\ìMýþó•<@樋sŽæ¯ƒmkƒÛo«%ÉÜÙwÆD§éwôR™Ù½!®÷˜ÈIÌU™ëkɤ¡oØ+Û²LWKTÞ‡-õÈa­ m¿}Œã4'wÚP&ûÇ?JÖõQ ³kKìú<:ûèØÁ·Àv*Ñç:» bªçãݺ÷Ê{Ôõ•.„ÎíhìVñ¿A{(bÖ‰zP§Îk™‰ VŸ%LÓš ©Ž ÜÃF›SÇ€^°c5ðM´ö~À|ux¿¡YÓD–¢¥ÃË*³Ö=à`U›zhÅcPqæLÉk*Üí`›ÅÿôÒ<ñ¿swÔÅÂÄ6‰¾¡!Pt¿º5)G•ì#a]…ëµP "i4mRfzn Oƒ:Ú€±aíÎ!sFÕ~[Ÿ;êmxßÏmüRÒgɪŠ\ÁLœÏ( ȱ1wMpa›£®„ò›Â2k¸a›Já1OL¡ùzß.F¿^œ°E8J­´¤°ÐUíñÞf«}R>™Î‹á#3ªïÁ.~ÓÊ‚èóK50øÙ»'°æ_:'˶N’ýÛ¹ŽH¬Ãh”âq˜\«Ñ÷ĨßspìwÑnC‚>ôšÄóíú´a;ŽPì¹faÅi’+@K·Ö7v@¸¨k­ÔôÂhÝ;ïíç'â€4Ëí~<’“|JbÅ×ÿ>0yðõ.ˆœLH>ÐÚ?êÃøñÅ ³Ö$1FˆEgœRÌ‘2¥3ËÇ«Nz²mwF®\—€ #U·‚ƨlìLùÞz-p»ÇÛ“_Ÿã ½¦3~sdi}LP¹¤b]jŠúåö¨>míO+Â¥H«f¼ã²ú¹­wPîÆÊµºgû˜ÐlÃv™ŠzûœŸwú#ÇA½ŒÙƒñ~;–›ßÛÄÉrÎ+‚èfü9ÚáÑêŒB¥lü}›*rùæe¸nzÉ‘ÇT†>è—9™“MÑðôî4¬ƒ•oâ© „¼p½o{g˜Sž>³’F8hô2â ño.( å› î0ÊdÂMÒPé Ά›ÓïXŽ[¬J$ãOaˆÄ[›z6žHÕNýh*5Aн"Lçã8°Ib Šúª„èQ….Ü]°»2~bૹ7n5°#ô¡jâz`¯sOàE]jÈÿ-ÎbIµ~ëóiöz’)_öR¾»¿S± l—ñÁkt¼ÙW v-Ö³¶­”U'™Ãœ=–Zö®©­?B'¢GôÑó$š˜ïŠÀ)ñ´Y3Gç¦ùaØÞZ‚÷)1™}#ãK­ ^Ò$TñYÒƒe¤€n“zÅŠJžXÁ_ †¼ìµf·.̱Άÿ‘8µ}Q´Êbù$·žÚþ2~ˆv¯@ñ}£ûx‚³x |¡ô«õÜd]3|£-»Œì/WJ¯ËÍ1PU»Y.0£åÉ»Š>o,údÄÏôP†ë|~6­\ÏßÇ*±ŸñÛLàŸ²NçG|‡Â½¸Þ0‘ó‰’ê톛Îeú–}»º=³î@3¦Ãië|Y.®(C»)ê^9á¥RLKj°1EÁHm|¢gŒß"©·f`~4o}öpŠTJ¬€­â )rQ˜ÿ`*w éc)~ÄC1=úsª„/šÄ3 ÁO^¦xòvQØ_€Q*“ì)kF§ò©mV$·Q}ßÐZñ#8òs<82Â)F± yÓ9ŸXZxÏœ [Ñ›| xÊÜX#k¬ ;‰3-㑘*i{##¤ߥFvg!‰ÖÉuÐóŠDMÛSrn“O¤»J$$Á_h]€éG¶ˆ`rÕë¤R΄‚&ÞÍ%â6¾¯ÓþHs;: ólrä>£,+AQÁðx呦T;N˜ÄAªZèï¨*ñ>‘ïôÑùùÌÞ8ÐÉiwŒÛUo¾:€¸†TH¨€#›\ÇôLèÅI±4).Ýåy¬(üŸ^·£Y"5¯Ø;¢Œ’¶p?¢'èl^\¹vño¥JÏ}¤'í3оbÔ¼Œ µ‚Éqœã¢P)û*?؜&«=5pŽ˜ÜHíMçLÇìÀ ñ6ÇÔ—)¡bK¡¤+30­V @‘Œó³*j$’\ˆ¬½FJùíæ#rÌ<#¿øCí¬%¶9ë¤HTA_ÍD©é–4¼+àËU/k_&Yõf©Ò–Š¿çUr²aB76kúýF}Ü¥1?Ác2ÉáÏŠ‰‹6z#SåÃì,~>ÍöwÝL²G’JÔ<.ˆ ÉüŸ+#èˆoŸJe]êU'£êÍ'JÏ88–ïÄÐþ…OŸgŠit†1´%xTxS1;ÃCí¤Kª-õØ“ƒø#‘YRX9®­líßæB(­¡d±câ<ÂÜ…ÐųEO2¹4jw‘kgªÌãê69•iLoâ/›¯Ó%à{³øJq·^<Õ1V¥”þí*¼>~†\º£ŒßŸDÐzÊ-~v&wyäÎH>šö¥·Žçå?X¬2³gß:F[˜„ççKªÜ«›G…²ƒ?Ç…TAâ i #úí­†¦A%)XûÉf|x“,j²(|Ÿ0jt´­ïIVíÝ:…ÚÈŒ™aïfHF蜤3Òû)°YG˜šUbPfÛ—Ôë~ŒWsÊ€šK›´Îæn3bzký+ùÊ $™úâù”ÒјÑI«ð§E‡Áâ²N11›¦Î8ù‘ï«î~227æ]¤øêûÆ ¯ŠµÁbNÌÈ|M÷#?.Pöm?”mð„¹ÜæäP£ª«˜Îáã‘ÙJñ=±ìö§xl€;$¨ºeÃɨ?‹µæ‚è𯖌šÁ‹]¦h¥b·yùv´•îâÝN=›õÏ£ =›Ð†,BŠå.jc.@ût¯¤Ö»ðÁ=~›-aJâÜu¡1®#RzË«å ŒãpÔ<Ò©ì|sEÎÆ0°t@FUýž´¿âÓʉ|.e©ê²q\Z¥µ° §]O=gÍNDD@‚Q>̘~ˆ.NÜ·Ê24¦I—–»Š\%äâ3¶ÐÆ!AaN¦(Ålù¼œ%d$˜áþÈ’°T ‘ Ö¼Ú/kÀm¦Gö‚mÀwÑðz¿ª6¡Î¯ůÔEý¼j§¾ª“dD2/’Ž‹¡Ùk«8XÊhveὨN‚ò¥Ê'<Ó…äWXÂÛ\w‰çƒ?Lât»’ÎdeárÄͱ‰1çnñÑ¥—SÒjÙMéª*TÜÖ‘Rü$ô© apéC¯ä×§îµ¢[Œ‡½KpÇùf ¶XŒIqœq¤º)69JtäÆÜYm+E ¯!ÀèÆ‚£ óPù¤Øi„ÚqYñŽÎBFûçÛ9ì;ô©ÛÞ¦À5Ž=Y!w3-¸V—>)d¯O›séƒõÔ éÜV§pŸçðùK°7–GÍÍ!©T-çËqz¤\˜~’4ë`ýü‘3®Ø6Þp\ÀŠn5ivBUÉ/›¢BDV|¢ÇzF£#Lˆõ½ÏKÙ²~”ÕÝKPA"l_ÕœË9Å™áàÄøÔˆÎ²ôBªNê€OÄCpkˆþ4†¾°rø}]q‹²Úx܃š6"(Eß <¦„ÀÃ>jJË­ø}ĶH­L=o]²9˜J¤eãgŒRÌÞâΔ4=sÔŒ®„¾Ï8Á:2NôÖ9$ÝÖíªâËÅâ–žó€À,l#9_R*Zqtu²Ý˜fv¤‡“ɤ=lO3ã_ɹ‘ëö¨"Þœ.p`#¿g4È¿î¹|™ƒM>糋+Ä€œÙч¹f ÀÚlô×hÿnb(óEhàîs¾‹„ë '~—详é *&zÛ‘ïG+ô‚¹¯²Uÿ^Åf«·H¨¹Té*PïŒqÔvkë`™Î“C½rJ"‰>$¶A9À6qí¤®å£#­3G(¹ÓÑI{P~ýÁw¹«çÖB,8rôÕ0æHò•UëWdDX{G·ÂÇÈVœ: z/Ñ^ºXW‘&%~Mù”ëáú•‘07‡µuDôWw=m9uSø†å¢êÒ¾Á+ÆÜ+3vWøx ‡ýph¯A5òóñˆ…ŠÉ·Q@ ËnÎÖ¸k”ÈßT$ë'Ù j­-‰×ÑsŸÀþ<ÂWò¶ŸÂn˜?Ø%¥,ª0J~,^Ö“&o]W1ò½7 µP–rmfrOìcÌÊ+±`Ì|ÕŠúàïK{ô;vÚ¨Fù¿‘P•H:ÄO½±¬êý±zĽVýù›Í$O`1”ž<Ï#rr”·Pàã±à÷¦ã`ÿš°Á|>»³ÂOY2îN4e¯mϪ%î+PÆL´4ß7 `ÖpL¹«n=J×ÄÙíxâ•}XsU =`ÄW¨¸a­s*Q¢Y½ÞOªX’z/Äÿ–ã¡@IˆÒrW;ùÊÔ‘ï/=¯~˜Z~ò/ɔ䗽ŽáÐÄΑ„]GÜ HA4×ñQ;/amÑ¡ «‡LŠ.†E|ª$z¬ßã3I*`ÛØäœ95‚¼æ'^8ÅÓÈT—kƒT¾~“g•ê$ê:mŒ5˜œQcú^ïª×1]èå“¡=R¿­«¨²]eɲ^ÌÿyÄ|¯rÉH$%S“oÔݽ’eGk!6üî"™+P7¿Ý&LüG~ ’”eH.IÖ!…f²÷Úz^k4¦Ø\2«¾í¨‚_Ùçbæ†tŒâKÜ2ùe?Dìjg"i£©¤d«WÔšœ8Í„ç™xEy?1fd†{ Gœ°¦Ç£~'ù%RM_ìY·WT È]uÉê=qaUl ]û}æR+ýÂ=_ÝùEù]ZSo´ ‹¹Õ•ÄÂ;K·iÁÕá¼àP !m§·±F8A#ýðÅÁ¹6NMeÜIÊeuµŸº0š-$ö˜5 »Ÿ­Å—Þ9„8‰Óy¤ÙÜwŽêÎ3šV^)n¹ªJ)`1ÁÖÆõéê•DQëóÏ€ÒõÛ.8ý|]n=G³Ò™–}…¸"Ž;€]?\SÃ{‘n\#v/‰öª] ä1<Ãß&’>W‚Ée`XïrP‰ 'CØÎéDN ÙÙ=1r.à$]ž[ \Œ[¨$Õ¼ºÆ¹ÊÐüpWàðÌÿ:(¦ÅM}‹O¾êa{G˜«ÖÒ>V àÛ²³MloÙ.i‡¼•‡+64—²Ù@åÛ(n<ÞT»ýŒøåBŸa¯„‘önlÞ¿:=jî7kÝÐ'î]ã´/RY^n'&ä†Ò†æ¬ûþ“Q­Áõˆ,AÃw •;*dÀ–öЛ¼ù÷£ƒOHŽýTË1­º¨_Ø µßµ_ ,ΙŸ0öAb–¾.6‰²ær@¦Øý‹¾©3/]LgCX¦q6yõBœæérÑÈu¼)Ø£K&¥"È.9Q¡¤ÎK¹iù¨¦&j#>ÎÛ©ˆyk›c<¤ðÓ=­t›?9/|¦T4ï›ØM¢È6ªÐ¿¼æßU¹÷éËé±úpîcp-}WcÎ䨾øŒ4`Ešf/‹uäžÐÔÜ=Ìêåçti±T§o+£ïJ…ŸŸ-ÖBiÆ­ªÀ؉`ÍÏß®Ûh.ë{¶Hî§È‚µp“Þkä!åz¦ÈNobd|ƒOûDf;þ -ÄE|¢žP ©j\¼4Ôöét¦ymè©Djí‰VJ€¿“Á®’MÙeÜe<õF¿ÍD³íG÷ÎÞRIÌÉe-ØÕsš½¿ÚÞ¯uS\½Ù‚kBƒÏÓÀ]ýȂ•©™ùyñÛîÖ%9ßZ¬1Ý$$.Ç4ú‹z5Ó[zõÊÐæÁ!1,Ôy=û$å€Iq¸´¬° §wE׫q_º#­]¯`:(%aCé°££gèïc„Ìß«£ÓÈ3Ѭ¡÷m•Þ=^5„n!uuã'MaÃx… G夰Ò$üð'kÆ_j*ÕÝRˆL‹¿Z"iˆæ’_ʹQðˆÜ2Àj?Ю*‚uùÄÞ㤅TÖ-]W›ë,Œ/$ä2G2Ôœöö’®k÷TkÕšãØeÝЦ5y0¡Y ôÛÅeÚqKfˆí0Õ®î“hzMŠZâD$3ßZÙJ®&0z„™I©[ˆTmMŰMScõä¹Íî8, )QÇÕ°ˆTÖpjÕ ~ƒUòÕ§x·¬É³y/ÉͪdqH³å#Ç"{ÿî„+olú­ªj  Åö·=*kb‚¨*ÜÓ7{b|S9ø˜ÞlÞL‹±"‡±ò¶yÎJ”¬!fÅLHÍþzg@ÕÜžx…RNÁnò€•‘w6G]XÌîóåJSWÂbA‡c}Sæ^ "Íi­ˆ>f¢ç0á¸>Ç€v% šŸ ú…gï_×Ç‚¹v¬X`¯ÉefÖ†?-øÎáþšZ5ÜÓb(±û7w5WÕ[L;óȬ´gÝ‚™n¡r…o΂ÕÜCŸÇqxÎòÇÎÏçýf3.óƒ8´Ò‘X‰$°:"ãÞ÷Nve™é­çQç«®:-˜öüÆ[ƶÛÇ®‚Û¦Qee¢Ñë÷¥!ÂgÕ8;3GØ¢?`âöñ·F²ôÈà ½)ã¤uš^7i@ŸÈ¶³ÞUF¾]/ÅűíO¯÷1€×à¥Ü•!x _øEäøcç^&¨™i 8}¸Yü\§¹]­K!tFfLAqÞþEjVtE„æF3¹G¬ð‘(DXgÒÝr×+³%¨Æ²‹‹Ù1ï:t›ê³ÎY7»†orÕ6wj:ù^o KVòTôy»e:*Ýz‹Ÿ?ϸ™m xå¿t>#švphì[Mv˜`ºU"Ð#‰ø€6wŒlâ %9¨>r“%\ž’Zø M$·úænþQBãØ×¦^Ù©Ür\ôÌWäî£èáœøUä0IÙóè;ƒÿ‰àqùÖo›” ¶¦?¹Ê‹Ô>;t”¹*¹=ÿêÉ÷&Þ‘oòª^¼þüÁr»9ñÔî«>‚ƒnD\UW—´òÑç×ÏÅ._':{Vê/ê¥^Q…R‚óÅŒå§SYÈÕÐ4ÁÈÜ ¥7SËÍ<ó¯£bœžtÍÐéÅH [3Õ£ª‰«Eˆ\‹m‰­›¹%‰¸+À»¤¢gXâd $ªìv,FêÝL”Ï„;ãõÀ½š°¦Ÿÿ{Fú1(ã6òüeÿüÞÇÔÜÙ[;UûK„X"Õ¨/Ÿ‘bU¢õŸ–t4©4,“‚ÃÇ„ ¼ŠPžÊ¯43Xw™zóžyÁµ¥–o–¶óáÛs±Å‚ôeq»6G-„˜<£9¡–ÛB2Óš¹¥Ù˜ìl°Á×!«,§ÂÍüF“ Ͷ™ “Ý$.3b®cÏöÓ*×dS%k…\ïb¾ ož63JM´ÊÝ9|ï9 †?b®ùÁêECú Þwšó 55õÖ®-— g1››i6çM˜Uõïzë¯üÕ¯ãU'9:!\Ü)¨£üZï–?ÉÏàÓÔ !°R¾ë/ÕN®P,*FAØ5¬)'oþVœ~êhœuÝ"*¾€›Ú ¢ŠÚ¥¿÷ ë陸Ô:·Pl^ïÓ»ÕMcùØ7>DØCà€>4’¾¶sQû¦ô©û†7 â( ƒÿ<39‘¹I=Õ†t}aYzóåׯÁ"‹×Íbø‡]ä¬èÜ—§îß«¶áw¢½ö)Ç>j׊o,]ÓÔàÄVâeZÌi"‡~ÕåÛzþ€E_á?9*Ùhÿ–¨Kòiy–#{4ÀíRƒ"÷'Ü{½)2ë÷@\ìIkSÇ0h‘¬ék(ñ³*tkƒîVe¢ù3‰Ü5¯OFëoÄÞÎ ¾®Hô[av!L³Qmb¼¦~2q;-v}Û}ÜŸ"GÕ&{paQÕxÝ:? ” ÙæÌ]ºK·Óé©`háÌÁo•¦¨¦rRUT2³‰È¥O¯­K?Æ—ƒ†ã5{ƒ®Ò`Í­t$eq`T¼K­ôD—ýQ!_•&~P‰J\Èm±y˜XܽAX0n ícázßm¦m|0ýítÎa­q^;sü+»ü6ЫðDDÅ`Û^] ” <Ù€dRÇ'4k/¯cu˜zAF\‘RýíêZ Ü͘±P Ê“«Ò±êÿ I!Æ„„¡å§9õÓá÷‡êˆß¤¥G²©Þ‰G$¨‡s š"߸j”³´(ñ~Ó;’Ý©ÛtZŸNjÅ· å#¤Æu–ÍÄô¤ _Z¡Œ|.þçFé+Æk[®¨XdŠôî3ú!ç/©ÆÌRJ: 3´C÷c¶ÃüL:–<öõð³´µõ­¥@æBw¬ô ¥÷JØ CT°Ë¶&t”UßRzˆ Òé8C¦ <_=ç¿Gªø ÝäÙ©¡ Ft‡©ôjöþEÜxîPMù™ävhbRéðp¿ºüD½/)ÅyÝ;î]u‘Ò±ü#;gø«ñ©«Œœ–œ 2Ap³ñœiÛ6kêVìê¨(El\Çpy]³bš•õ FÔ¦a« âH›ÞW|Êiðµo3¹q„ëÚ‹:ÁËemÐ&&-êÜÖ~xÜ_›Y…™¬jËÃb|Z‚ó-°øÅPà£0Áw±¿¶rS<ùÂŒA¼zgAVª?œÑCWÀ°­ò!óJÉU8G^.lÂ.î©¥îÔ8úK¤1¹ËD§Mï >3Ô^âI¦´æ—Rïx¦¹”¸*:íÜÑü2=`g-°úÇí sͨú\{4{›–Á†Ð ,Æœ–'ìxô«žÏ̽æ Èù&þFs6Ì&)Q‡©äŠÅn¢Eöl­³Ž¬÷—¯ÿyº.Ø}fŒÆ$tCTðí¤óZ{®¯­œ÷ÏOÛ&Œ˜ðXÕ„u9¨!t¶ÍwdªàŒ•­M# !£Ì3ŸqÄ“áþ yÄ¡g. JaKªï©!;pG´°Ôô+“râÎDÆiJ«EÖªc¥Å"æé»$0®ÊÎÚµN¢ûy6²ö›Ø$¿°,Qw]NìUóã?*•#d²¹E՞Ɏ$Q öˆ¸&ã'ÈÑKÆÃž˜jÔˆN!‰&E³<ú ÿ´RÇzGUʯmyUÖðQöããf$‰^Œ,®.=|PÎõ`UúÖ¨(gáÉ´LìW-åCî ‚€Úô½D¦ãÜ‹S²2j7<“éÉO†Øi‰¢–rÍ刼ïÏ\ÏòaÌ” ¢à–Gƒ·¼$¦ò™­qñçâ%åq4Çô&™ 4ßnREhy½&&§à´ŸFP—\§ÈjLzY¢÷§å~ÚE—ÈJ~¸¿môV8;“E`9ÚRéÌ%ß6q F˜ò"Œ[ÿòVüFM¯Í¢ŒîõMç,>¿ï*MTEç>R™tc“8dÑ„k¾ØÌê”3̦Uÿ'”Ìu†ÑÏI,ƒ#èRNÓ(ðÆà‘k–¯m,Ð3ɇÏË;£t…˽9ð2ö V¢ˆž{61LëZÉ —QgŸ£EŸ£‹U’KœšŠYë:Ø‹K‰¦òÅ ‘qé]>Ãyoݨ14±2¿­"IƒGM·rx’C ýAt‰|Bæ‹ 2ü¤.N¢¦Ëu–Îå×ÎàQ¦±° ý¡Àí@dT‹‘ÕpÑù4r[¬œX²ŸEO©uZ§rJ¯pÊDé‰}V¯BBÞ9’ì;ƒy´ Ê+[”ä*ëó[µ)úç;ÓôòÏ¢>Å#hwËŒd§Þ}çèç1È<ŽšSé_ÐR7ºi¼Ç žG@XÔ ^³ÜÉ?W™²5çUv¿#q8:M–QL™}S}å ò4²(b½²B`è’-DLì©fÁá„Ï2 2ôº›¦zTÍ\†7×ñ„¦0_g8ÕÓÄ÷'ù¶¬~éwÞsºÔ5߉x C-ÌÒÿÁ ±ÅŸb9­Û DVzš•|Ÿª(™ï»B¨rêý†ÐNEùUZŸ¼›@²Ù)GF/!¤Ñ+/KªŠÅZ©ï,í6>.mS‹¤¨Ï†Z7'C³;÷dúk‹±'-0LPk¯´íd¥•¢x¡C¡­f™>À,p€&¤Ãö¾ŒÙÙ˜<9^ ‹¿n'±ú²Ò¿¯­ŒaªýÜ–·6ã4ÑŒŒò†uï Éö1L­ãW%„õ×¥D0_í© Ç´šc]‘&o§¥ÍÉZNH~ÎU–P7Îd+LLÍÞ$'Óp¡@UÁA1JÆÀð%KhèoѸþMKæyÖÖÖcus‚òÓ¥--€Œwû5:ú[;“í¨DeÕÄÓ$òIØ úW—@ä­å4¾ðºbAƒÁ΄[39s“ðŽà…Ïyc7 zïB{Ë~Ý¿Ùòƒ É4ôQi–ó2p[”Ðâ,ðÜÝ{$îh!¬Õ.*ÆàÓ}HI§wZDü‚EçMË¥4ÞcÂÇ/Æð3´v’ÊÉö“ÿ¾ÀË+ퟂ{±lŒŸ—áå,Œ}EgNRom`:$ÍuŸµq·¯w–ö!óx¨¨©µÁªì£?yUÆ·2ñ’™&pçrõyÝMhŒXǘÁþ— ºŠ(3Ž–Œù{¸j×ÜÚó6¯ã€ÍÜåë/¬ˆwéœÙášaRç9´KðξoûÅ«Hå3™g1…o=i„ðT–LÄP̪‚±Äw’ô¶êqBŠ6évd®>ºÚÖŠ!/PûåäÍõØ*g3ÙõOò×ËÚsˆ iç_æµÑˆ¸šÞ—ù…u “֠޳õ»C‹åz'ìýßu}èûÀcqÆ6£¯7万ñ~¢ÅÞ[÷D<êò“Pªu.¯áøTi§Ù>²øŠ„Rä r´œý /IºYÓ„ð6Üÿã@Âþf€Áì ´±G?yJ…Õµl÷k{³:ÂÎ(¿äªZyǶ*ZZÒG®éJïßÙT™DÒoF!OE©ä&ýÊx´'*ªÍû6ô‹Ô§Ç.oßÅå÷Rpg²h¬ò,bñO犫~GJP°çCŽ…M®ÅÆËÕœµ¸×”|Êj„ÚÒ@WѺùÛƒ°;PH'ƒbŽV„À®! ü¾žÊ»ï˜’ü²5`oW9AJ?á8hkˆXÔý8¦T)B(מ-P#ÉQs/fþ€ãŠ¥Óœ™†&$6pvFî>ªƒ„âBNfhí,@µ¤Í¨ü} w@ì ç¸cðMßÌ3?ÀeÚ01ÑQJ#ýQ‹Î]ç*ñAí_ÑÜŒ¸Çaä²Ôo“h•À†£YÝYp×úº)Èè;>0hXÿŽÒä§ÓÑ ¥Ë=‹e™EÖ&#DG²Ë‰Ù8ÑXþ/0n8¾šìnvÑõǽu·È‹»aÄ*´¨Ø$a‹1~ ý¯ý¼¥•RVÆ$§Epµ#c0o›—íKÊ›/gèÅqÚðDO²FTÚp¶yØÖNTÄ ¼ôvñ+á}‡z|±}GË›@i³õ§ÌîY†nÃßBœÃk¾³ï°ŸA,”õôµaêB6OªkŒÛË´¥CÛèû¾® ]GÜæaùSÓB?×.ñ …QšaŠÙw»cî+æ ®0£ç|œT…ºÜA*?Õ‘HׄB»IW€×2gÌžë1yj…Y{ùÃt<ôüÂbšøQª Í®º¿‰jq‹ÏŽùµ¯–GzJî# ‚@ù5A2á“EHev7¨*é|}#æ«ØÝj*j3Cɯž]K.x9áå›òÅÖË$j§¶¼ ,½l¹uåßv±7†Cb?ãÒT9kÁᦠ˜œÙc)k˜ðxÁ¯pûE±ßÁ{ñÃõdò? ÷ÄÞ|šBóMPïõ^ífçò©\­ƒÓjà]ÞÑ4DYX<ÝǯS×sƒ%ekb%ݤ+{Â:ÓïýÒËÔ¤ÆâÎtOV­wÿʼ´¸Ü¢ß—iÑœ Ð~”Ÿæ7¶ég|e3úÏGç endstream endobj 112 0 obj << /Length1 1465 /Length2 7334 /Length3 0 /Length 8322 /Filter /FlateDecode >> stream xÚ¶T›Û6 EŠS¤X°ZÜÝÝ5@€@Hpw·–(î…âR(^¤hq)N¡w§|´çÜ{î½ÿ¿Ö÷­¬•¼ÏÌ3³gö~f¿a Q×b“°BX@dpW6NvA ”Š&'ƒƒ›ƒƒ ÀÀ  u…Aþ6t!Î.P\ð?RΰëƒMìúÀSAÀŠn0 '7ó¥ 'Ÿ ‹ƒCà_D„³ P쵪°pˆ €A áèå µ±u}Xæ_@FK& §€ëŸp „Äj †UÀ®¶‡‡-Á0 Â qõú¯ŒÂ¶®®Ž‚ ‡‡;ØÁ…ál#ÊÄ ô€ºÚ5!.gwˆðwÃ@U°ä¯ÎØ @m[¨Ë_v-„µ«Ø|0À –¸ËC„Ü â |X¨¥  Ts„Àÿ"+ÿE`þ½7@NvΧû;úw"(üO0ØÒáà†{Aá6@k( T“Ufwõte‚áV¿‰`˜ â!ì†ÂÀ„?•ƒ²@ðCƒ·çbé utuawÂ~·úæa—eàVRÜÕð»>i¨3ÄòaÛ½@¬=á÷ùXCáVÖ¿›°rséÀ¡Nné¿)&À?6ˆ+—ƒƒƒO€qB<-mA¿Ók{9Bþ89›:ðóqD8­š€øA­!?°;èêìñóùOÇ#''Ð jé ´€Ø@ဲ?˜!Öá‡Ãw†z8´Ç äøýù÷“Ƀ¼¬p˜×?ô?ç Ò—ÑS2Ðfù«ãû$%ž@6nn /P€‡ÈÇ#ôûï,ê`èßUpüª·Fþ*öa—þU°ûßçÏø÷l0ÿ;—*âA´ ã?7æàå°|øâüVúŸÿ?ÿÎòÓøÿ$ëƒýq3þñÿÜ`(ÌëoƒfÝ\ô¯‚x˜øÿRõ ͬ Ä êæð¿^WðÃHÀm`ÿÞF¨‹,Ôb¥uµ´ýK,Ùu~ ‡¨#\ ¿o 'Çÿø&ËÒþáæpyPääapþ{I¸%Âê÷„qñ¾‚Á^Ž!qñò}8FÑ âùGÃ@;áú|hÏhpü>Q~ Hû·éà‚Àÿ  Èò߈óA} È@n Èæ?àC"Ûÿ€™ìÿœ\@ãø_Õ[º9;?Ìï}=´ö/üç²€@+ï2“@ ìñ¬”R³ËØì×íÿHˆRwù!„â`S]ù)£wÞSF+.5ñ´Ã/Þæ¸õGUø,Nú¸ˆø‘Õ +ƒ Q„ÄðÉ´s„^aͯº?Gçˆ(ïѧËM›T­ê»Ï.£1MþAÇÑ"Þ¥&Ô(‹S°“·Æ½Xw… o}¢åú/¢¯pEÜçØD¿` ôÝø‹7aÄX⥚ ›(>[&|ÝZ'ò˜s4ë=œ¡’Ç.>Kã"V팟ÉXYDÄDç¹fNI/aâ²ùx™¾Óh&J\w À¥ôx#‡#°òD°u+àûL°Ãtá陬·™‚GÎÀ¬u øÍæJ`@Å-ƒprœ^¥l«I¸BÕèiùÕKü±˜šÑDyR5f•qÚGչ±gzVE™¬‹“à&~VcqQ’óµÏ ¿ZáÙ܉ӄòvB‰±®nª¡Z~O¿‡”摚 ·øð'ƒFËÍ”ªÌæ¸%0ÁhùÒB&릯>G’ˆÚç½Ö©õ9-ÈE˜Åõ-ºy{Ð`̶’á¬e f´í¾1§ Äç*R¿•näN?÷u•C{6NñÕՄȾSG<+‹ÏšÛÑXEzgT†ÚèÞ>·¬šÍpÄaGJžSœ\VM ëDû…Iuãþ8GÒàü|½€æ4á“5³™Î˜·Sr­çû8¸oó ¿´¼+ñ(Ö3ÐîZê YÜw¥9ö±ígÁ`f»›ÀÕ·õâ}`ÉÍPˆo›¶G¾ÄgǪæ9Ñx¶¢íÙ4ߦԭ¡ñÎïʼn¾‚N!Rœ£?I v`üô»ÎÒ»ÞñfD˹ãÂ(¹Êv{â ¼l¡wjW/"Âê“qÛdlù<É®›Wh_zyÀ`Â@ +UXl‰Bå~e—¬½Ð“ MJÞéyùò-cß7{Ô+Œ‹mÚî¾À æ¼Þ½ ¥AépíÔ÷Xµó¡r_O´§B’¿Û_¢óÍtO²åýê@ùU¯f.ÉT¢3&e-ÃÏ^‹­ Çá³´Ö'7Y´–¸õ¸žP²ú"z8L’P“̑ζeg»}MÉl9â¬]åô|ÎWG:z)õýT óðsÏÜa縺§C[V•3ÕöÓÕþQþ€6ÙS¾VÍPIÑK}®  ½ݘj`sˆé…­4tû¸®³’A­-Tb´•ÏÙF5µ.¡Ð¦TH¨ÁyTuƒºlÑ¢{†28 Õ\=¨ïýåŸ?8ô%Vàžî9ºqqciÎ<–ãÈvù[E^Þ÷Uè6Þ(|o‚lää+"G¥ƒ^ÏMÜÌ×…±³åÊ ¯a“áFñ·H+.ÍZÌÖÈMz’¨=oÙG ûÒcл.²‚ß{;#±í…ÑDù¦k*ë°%’¿Jt}}‰[œf?Ä~~p³!]ÄÈQBºÈ#®/8ÆmyÜr¿È_3X·iOÛui#;ÓbIDèáÝÊÖtÿÎøJ>óÛ$]R$Íö53Ã?ÝP_i|ÇïÙ¿W"U©Í°X ¥¶v T#7¹%D¹hÜÚ*ä¯P9„™X-v xÂCD@Xñõ¬ì,.FäWþÇó,·ú#"šˆ“IóbŒK™t¯¦žšÓ‚D½,øæ²î^ØýP Cg¢‡n ¶xnÆÖ»ÚØç'†¸ ˜Äõ*ò_¨ê¼_cˆ>™cá‘a*cfROž3Ê·Õ1Ok-"\õy|Ê0ˆ'އièMz1ßA˜€éH\ÐÎteó#eÅãV„¿”’íÞ¢jsÆø›ÇÙ)õSsÕÞ7sU¨åAø,»œù8wOü%zÝC@=£*ÉMÀTRS•V:ÿÐHÔ™Ÿ¦ž²ü¾[P¥OÙÊ ¾lõlØÀÕ¿—JËnRÙÐW^§í-MYÌEÉB‡ú0T :œyó>ϵáúÉ-ðX£Xkzo¯îˆaä@±Zj²{ñXÁO¹#.J˨­âÚV)my+¡„‡Qù3å~âvEL2a6{q9- G6,ÙNw4²y¼¢pÃê9ЩÊÐýM7Åó'îbSâ›°é ~çEUÜj;„=ªDdCs}*õ8Pì˨ð•&‡ŸÑ"_úD.E@åªñÇ:Hñçw'ÜcÚ9«:«\r„¨ƒý ?¨ÕœÎ BÞÍU,˜‡a] ጥÁže¤ò¾4ãRÑ#y®@ïûuæ[Ëð\Ù¾(R†f5•ÿñ!”ÆÎå{c;;j³puVÛ3À,G×i¤¦H·ÂWÞ2£:»\ßK.ÜcAWoô“£Ã¦*¸k$¤°å™Öÿ`ï`ú” bl£žQPžØxäÅ´[Gò¸ùI¤˜Q›M;Ãׄo1´QÇÀyÿ'Ѱ‘oÞÊ„)#‚7.Å–­2èÉ"=^_$Ã{52–•Cß™¥ yiftY¢n~)¨ ¶«¥)YwøOLÔjÓg£|LŽÚ]Ëæy¥Ã¾Üø:î·¸ /ŵ´˜ãªº$!1°Ô¯Á{”«.ü°àF„_¼“,åáZ6]¼æŒàû½ÀðD)©û7u!‚དྷä«_X^ìð&­ŸéæO=CoZá, çÍ1¬Reë½uŒ$ðápXMÑ‹§Ñ¾dîQ‹ãø©™/Ih îêTÍÔ ·_y¿®Ÿk>7ðË\)œkS)»%"sg[Ÿ7­T€޳‘c 5&‹‰Õé>y{/gD›9,%Dß[‚^抶ËX¯1^Hˆçm_Ò~Òa=zÕtšf9$! Ð‚*‰9‘wa’z{aG &FO“Ž ¬¯ì@uòaýµ˜ËÇòª&–þêÙÌOCßÒ‘gÍ5³ñtÞÐÂKˆ†ÉK¡OoW³énï$/^ÌEˆÙùÔtÛ×;Ñ¡»Ãy‚—µ™éßÏJáû s„µdš<¯%KJÔ õ/ï0°Z S•Ol |ìŽâ.Ê8Z¡CÄKÀB‘عÑeÔÓ>È#ý†m®Ã)×­Œu=Ú_*»p§*¶Ý÷å…¥¥JƒÑ”;ö•¥‡¶Ð°·Ý°~dÔ†YŽ˜z?äiã<¦=Úüé0žB§Nܰ1ˆµšˆ×ÌÕ¿÷ºÒ±¥±Ñ±~¡HE‚Ç8S—rMä²O³B~²Ö¢¡|2„f5#ý˜%Vn¬Ž¶ïùí‘fZ=7¢îµ Ò“d¤ÌFà‘¯®m=êãäVºÓ©heÍPQqÀî-ûbýAèõ4–cwzœçòšç{­W¸#v{%ëÏX§ðlë뉟E½ëL /¡(Êø¬+x ¥Op‡íC$TºWÏõ ÞjØã‡= PNþr»)ñ:»Q|ð\ÑýŒx+ÝQ;No6åùñµ–7¨÷;½GO²Ì«²h"ƒU˜RïÎe^j²ÿší+Ú˜ñ5íº”BŒ¦tt„ÎÊÔ_r>^ÿ˜Mæþce ‘'ƒºÍ‘ÖM‰nëÁ;K#´PÈ3?È•¢í Ì[¿ÌÍL" _Ö:?)ã}QB8G *ryeOéÛjÜCm-¸ Z®›M1a9+›öI’øþXå.ë ™^âD-’Ú æ9!¨Òä[p(5†ýrñ Ì9·§ƒ°#9Å.ˆæ11/ûQ¬÷D]æ÷sÞâ=%èšÐÐõö9Õhê³HÜ^pÒL$3Sžñ­D¡Oá‘’Æ\ò¼>þ°Ü·GR3åj°)‹g ªE‚©Dá}t ‹¥¥óˆy‰NBÃ7Ȉ‘—÷Í?˜b‡vxŽxòžz®Y~`¹ùÙúe5O0в!‡äܤXXÝ«õ¨8 2Ù8«‰6Æ“iÍjë?úv}1ªXÍ¡¯·2R—íZâô©†¦ß;©œcªê¨ ¢sDYÂFi aÔp­A  ”­fÊõ¼È—ß.„jc:l›‚ŸP7P“Ñì—KvÈøbØþ;;Œƒû¡F½Ç6£Ž®¿D0‘Œ‰Éñ†&]• %Þ¬?÷P‡•ÍP…² ‹Ÿw£½.K¢Ìu†´Ï©=Š7,wIâZݤðPXU¼‘¤&ï\‘¨üfnH/R1‡‘€¿ƒz.ëŒÝmx³G¢a`9Sá¸ñ¢Â¦>Ò4{ùR®œƒÞoüñ‡l§f ´Y›zíTÛOy”åê+yÊÖÉkå‚ e—t4bõðæìÅŠÜOºçß”Ý&;Ž¿¶­è ÔXPÃ-«E§XKlzz)0âûºS —2¹ ûp~,eîó!Œñèï놹6Έ ½]m² ˲Úñ¦”¶)?L‚¤’¿{WÏy«ÒŒ|ÝžˆŠš‘ùjʺ$}‚¬ü¿öÒêË`梽gm÷Ì#}ÚûbŽ[w–þëýÇžâj¼FïÛf'–±åÊ0œÐü뀞ÔäâÕÓÂÌhFS«ÈÎ ï¶éõ€S¿"—£¾"’‘xi8{q.$5å&$‡ë–Á¦¬ä£=âò:1…º,»¿»£¦ËwF èTŠnܲÓfwð½Æ²ÆEˆÞ<¯yœ6±åÀA%<îÁ“Â謒w‡ÃIƒãÛ¦eP«3ö)´¡9ñ×û Òò›0«,¶‹9b™Ç=ÀKó¯$ƒÇ²sø7Á9²èÞÖüõ4rëqƒôë´ÕK­ígº¥f¨ÒÙýAk›‹9/®)1ƒ’¶¾{Òfàj¬©DšŸ¹kÞ 9Ð…p®x¡nZ H­“@nŠK|$Øi¡m!"³;¥:ò<}ömJP'îôÚâ½J@[3ŸÌè€cŸ]¾ò0Ï~]ص¤^µ¤ˆ`xµì‘ùZÙwØ…Ü^²P¿u¥m۩몽§ê%äób6Edºm³X Ë“> ta7½\©Wå{E¶[›x h¯×…^½‰ô¸³„Zd!dµý{Ó,ëäö/<<í«õ†—_;P]s‹”^F±IµSf~Õj ýeí†(^Ò˜‹…ùÏQ=`̲ï@FÇ3ûÎSäµÎï ·`º©R¸À©Ø¥­¨äyMóⵉóÒèÁoÚ¨1§»­ígÞOlÉ¥KÙ#BÝ:„³Pt§3u"Eæ´…>6¯ÍÅ3KÝ’—KßÌt6r Œ_Æ›!ç¯E¡ñ´ö·-2*By.Õ½è*,qX²v`ÍÊ™ %GÂ÷Úà ´ƒÆÇÁ,"@ Gù$>M½€˜Hh•@'–k(zౄ ÁŠœÃ>IoÞî6Õ˲Ûˆ´:×eÚMZc¶‡h7Úž‘LïmAgàw?%^c_í/¬3Æy`Ÿï€ˆÖ_Ë`«¿r·Û/ ¨LØáç5ú?‚Â, endstream endobj 114 0 obj << /Length1 1355 /Length2 6032 /Length3 0 /Length 6966 /Filter /FlateDecode >> stream xÚWTÓ}¿§FŒŽîîn¤„1L`ƒ1`£;$¤ é”)•ii  $îÔç}Ÿû¼÷žsïùŸ³ÿï÷íø|þç Èab.¬ê‚t†i!ha°H nh&ÄE@ 1r ÐŽö„ý‘’­`(_8!÷ßôê(“i@Ð83C$ çç ‹ÀRr`i9 Éþˉ’h@üá.C€ó%ª#½±(¸›;—å_G”–••úíPõ‚¡àP`A»Ã¼p¡O€9 ‡¡±ÿÁ§àŽF{ˉŠˆ@¼|E(7%~!@í0ƒùÂPþ0À¯vF/ØïÆDÈ w¸ï±9ÒAÁ8' Cøâü.0—`®k0ö†!þü1ü5Xüïpyÿ Güv†@¡H/o G¸\áž0€±–ƒ@.¿ !ž¾Hœ?Ä÷„8ã ~h©š ¸þþêΊ‚{£}E|áž¿:ý7dM„‹:ÒË †@û’ÿªOŽ‚AqSÇŠþ^«€úsv…#\\µàâç-j‰€ûøÁt5þ²À‰Èÿ–¹ÁÐI$-# €ù`¨»è¯àXoØo%ø—WH7ÒàŠkw…á^äA¾òƒ…ýwÅ?oä`0ÀEœanpùßÑqb˜ëŸ;nó(8` ýzþ}rÀaˉðÄþmþ{¹¢j†šêÆ‚¿þ·JM ‰ ‹Âb’ ,+ÆBþÅÿ« Ðß¾ºW$@öO±¸)ý«`ÿ¿¶Ï÷1øÿŒe„Ä!àûàö I÷þÃü·Ëÿ†î_Qþ€ÿg=Z~žž¿µ|¿ÔÿC ñ‚{bÿÒãðê‡Æa߉câ?M­aèjsûyý§V Áq@áæùï!Â}µà˜‹  uÿ•?rË_ó„#`&H_ø¯ @ ý‡Ç*¨î£á‹Ãão Gš¦ÔD@‘.¿Ø%&)€ P,9nŸ›$ Œ£¡ óÁQsàÚ ¸"Qä¿ö)% Uý%"ÿGX¨ …#Õïµãrþëþ›Á0%ŸŸEBå£ï4Ew7¨^^Sœ®[çð Í£žùR‘fò×çG®¢¾«f÷_[ú Éw¤²À~´ÝÑB×yßôéÏà3Ç4³Éõ§äo'ÆK·U›_Þ$»!l¡²|îláAØß£,òñ“¡2)¡;x¡i~Yµø:vvÝt£^JŸâ¬jJ8Ù2É>¢â °Ø¹`†™“-|óŠí>†úÍÑ÷iÚÂñKv½4Aòdñ² Û5±”“™Àå 1ß^n[曄G´¯'y‚Ô6³ô˜æ‚—­¢^gÏ0>}ç•öÜä \72;F}þz›8.ÇÇÂ,JH¯›˜´Ú©“îUÁ‘N"Q°¿¤·ŠÑý*Ýáì+dœ¿4ö”n"ª™.çØp¦¿±Ëx{{uc²eLxKS‰J¼-¯Mš¤°.ïy ÷œì¸ÌØ<óZÉ;scåç²]Eã«óïÖ²h “Ø'o_Äÿ¬$9`ݘeð |mгíš>: Þ R¥‘8ªÁuòM!Ÿµ­Å»Ô>© ±ôd5^4¶Ò¯:;Œ=„µ—íß›Ð5`µó žgäŦ±Êœº=Ø3% ‘ûü¼ôÚFð©ºèeQQaËkÖŸo†Ó<¯NÞ‘¬¾¿,æÔžbà'>ºL½ö”QcŒøŠõŒú`¥$Û³ÉÜuß7“Q–,Ì^:ÕWµ|-\_Ùroî×Nç.m´‹½Æx.ÔÇùÍaºÓÝ´7EƒñIävxŒaûÜzÚ¦{سO+Q—ßÞ(Uzcy?²‰çD]Þ/‹,žM³–ß"‘ ½ûalÔDá·Qà,¯U%Ãg¢eCà&4¤_žqH…ôšU2”i‘o@Uîªß¢'¼ÙÊ–gEãÁ@ïöVX4ºæpËLeŠ}>ØóÀO=B´k<0²A¿˜Í‘¨ªŽ.Ä; 7=È•¾}_¼S³ãxºjo',ñ¦,7a¯íWº¬ƒ'š-u­ˆF±9/ï•R½~8ðõäø™ý.šú£ˆ&[à=k¾x®HC£×i­R ¡sšò³=—ê,%õÛàXÉŠå^÷¬+y£/͵™ˆñɺ^(œF›[rÄ ´§oáyAè}6§2¯äÀréú~žÀzêSô¢´é=m«íŒµDéµÐ‘BEâ϶©NI4%»÷c6B¥)69R]¹·Ýxû#à&¨½˜ âî¹eMBä•#F·Ç¤¨¶Â¦ÜÔÕéIZ%Ñ€¡ÇÉ}Æ£¾w·>Ëío4›ÉÇ¢kóÞ2çßtpKkØ¢³}C?sAyŽô ¨º¿ijÁŸß&“X7¹û^õ6dÐ_ 3übD'²Ëñj>/"71„eýr),Ñ÷J»à®tÍÕ)ý.féx±nׂZõ‡oá m/°ŸrdÓŒDO–Ãö§…œz—ÑK­ð%o¯-:ÒvKÚzj÷ö¢é¦Â>î€2ûz=RÁ^ó"MÅŠÞ[ —ˆ¶«4àô¢òTýl¡ö+;‰¨¤çãü‹_¦î‘¤…lE)$?áßz_¦j}P“ȯѷøxHÒº[¡DwRn¿é4Ž’×Ò%,-n3SÏý¤*Làzt§ëh7{)pŒôi[ñäÛ {çÌýC’¯àšÀ}KáüzöUjûç|7ú5ì\øUÎV€Dèð£,~®Çóé †óÙªŠ'’FÜ™Á¦ÙµÔîÕ/hƒoÔ‡=ã·‚î-1Ìu%*†¤fŽKõÞ&xPÊ ó{ãJ¬SOéÍ9ì%åôå8™5ìý¶ÉßïÊP6V&3ô;0ïa\Ì#½ã¯72ƒíñ¨Ï ÃÍî‰Ö~Ž}f¤úí[Ó[ÉS¬nØT·‹)»Èk;_nñßÕ7Ëè †)î.ŽW'8ã;F_¶‚Ì7£_eIvÞ¿íñÆl(e]Éi1.8¥ahèe»Åa÷!rþmQŠÓɰ?‘ë×àwf§©dœ‰Œ$¡ü4$~ _ü¯®jr[VçvÛ'>±–ßNzÈ:¥ª½*õ”{¶¬b#1µÖÄCùå(ö)ö2^"¦“NøûòÊþHº¢º67`Ÿ)«]Åe¾¯‘¸-ôÛ°*ØT&RU8x5ÁìXÛxÐ’šµX~fk­DdµWyµ(ôã oO.çç-&3lnn.jHtÍÝ Ï|†«&PÊpCñ}6Ý'o‡±ñfÖÅnþdAb‚™ÜצCæÖž¦}eíô½éäÍs²ap“"ï~j¾Ðì²{åó¯Q÷æ·Õ]5ó#$OµîN$b³îÁ7^»\a"%™åë å¹øÔkÒP¦&ûDýž$K~²²EvÈüî‡l!)>͸ñýé/Ì9KDþ7èu„’蕦Rb“nIµdp j ´C¹(8ª Jmèõë=‘ý´¾Ø“ºË&ö㎇¨§Xõ£ìþ[=’¬™½n—VøéƒdLëdô+ù2ºõÇ¡ö‡ù;Æìg±Ó©!!Y[?–ÒÉÜИâû<%˜–Ý+Îñ…ͱÄ|1‹“‘^æhk@¦ù¦w0;£3®†ª••š°÷íëÜr%åRkŽ1°¥ÉœÄ–fÂßftdìž¹•-Rjgd¤IeH_\g+˜qÎ&óº"j…Åò-`ümƒT­‚#Ä~Ø=Ìl=Ñp>¨K‹]Zí.Ímëò(o²Ö\èÅ {œªŸ}Ù“iˆTQ2 asŽÑ*¶#Ú¢ûVø×»ˆÇüž€e 7[óÛ,¶Gx)‘'³I]Å™‡._ü3ÙßÚ³-ZTþP[ëɸ‰Ã¥dð%a0Êx!? ý¬bø–¬oŸS±ÀÉè‡.ݦ €} xŽ1„óçå‹ä={ºÂµ`ð±`ñ©SµÌò;ùç.¶Åa¬Cl×W®c ¿Yó2¯í»©â§­qú÷úL èî+2ªTSL°ôŽŸ+ºÃƒîÖtx÷Iå¯Nî\P”f{¥r“›‘Ç|¶yÖÒ•_=É=Q´S¾{Ht} ¸\ª#7˜}=7uèžö=zÝì6§®>×!!*èvb[žÞ´~ÅWÄË¢ß8éV¸Ý°|(y% ^;4p^©ú¬ÿcQ­ÐYÅWþOŒrp–+Ð}w[9ÏžÏõS‘W´ò¤ß‰ Ê|«ï±/Þî³iο‡´÷¸UJ Ãï*z^G$Hûh`”U* L­®Þçmü€¢‘–ZëU_¶FÃa´P©_ÌÆô3–{sh‹(ÎÎ6t62£âcLw®·òñ7ç6)ÙÔµZ…˜µS¤!»L}V$6³Ké?·Ñ7(û 㿆ùC•Ä­¹‹×€>m£ ¹k!d—”ºŒ^þ&¾žous>"§‹’ã+ªow®ìUÂÛTöFí ìIÉ—Ž’ЙSk Лɖ†;5G†!±,GÂd*„_޲Á”ƒ†µ%ý다7˜v<E¿L.¯ÖL©›ÓUÊ›˜ÛĦ¶?ôd÷¶‚˜Æïδ¡f:dv6ØìNÐ:|°q&>¿n"]9ŒíNðögó¨°Xx=ga&|)·{v…½i‰#¡qÙõ¸E‹ঽ²†W`Ò›(¦l¤ nu6|¸8Ï.Ù1âAÈ)1k¿²ÑÓÛÓ#¾,M·M¹_õùRMG˜/Û5Åâ=óúîT þ‡¢èøµÙz—/”4¢[¥§«â¥kwÒJzùnêá›ÁÜw^q`±SëqŒ=ºf¦ÀMÁ0úq9œìØ%ä ÏÔ÷vÆÂˆ·Šeêoоï5¼3£”e”nåªjzújÀ0ñè(É¢±W¹E-áëœÙähGQ‰)}S`uåœ-ob•Åöþá´‰ŠIt.YŒ¶ðà ÀLÖ°'|=°vý[ø:¿8ujÞ®a×wÒ2Ú‡¤˜ëý—V¼¤ée"|Ó¾ §òk#Á«Ž$Æ…3IomOÉ:±iG_=ã6±ž/…ÙìE,N*ºjß”³²¤x»h”-{Wξpx×ÁÛôd¶Œ8°7N?C£Ë`åA@Ú(wxhØIZä59'1rVecÕÍU|ò¾³=¯Ãð¬dß¡üX`°dî‘ìšx"ô ³$Êká=¯æŒ É=–WR‘¹<%(ƒUTFÜ™lf~8ÉWK:÷b„Oˆ1¯Ü8B,€â³‚T±ZæXWí¼n5avý”á…nîÓ­·M‚½H&ÙºœE9êÕakû“xÿT‘kØpUI†Œ~·¯x®Êw¤ø/0ª°‹F÷$KÝ„¦åÄ óâwµ’»h€Ÿüf4vë¾àM«mbÂ~\á[®ŽÍãi¡º÷m4² ’>ѨüÈj|³qñaé¸ê¥‡ A¿Ê0ïødN¬oTlg¬£|'inMý]Ÿ#>ÇÊóö¹/]"órü»‘Œlv“d¬ÊDÎè—"Fûå$Á½oLæ½Bú{Eãýê׸¤U9-«Ÿó·F[ØÏÙb¶u(QȤØâ­ÂÉ#Ñÿƒgâ–™‡v½Ss‚¬BÛÕM³ÏÙ˜™…F¯S|‘®ÆqÓéðž½lT'¡¥m¹hML#ºštVÒ7,Tâ¯Ø±ò96Ÿ]=¾*?ë$eCe"оqxð>j¥W†H„”€f€7:ÍÔZ9\TI¯Hm×:XÝz¡ëE_óW [+]ˆ.• ãÅú:nÝ Û¥ê³3šQÉ,°}òýæ†<—»û’¾ô'.1ùzõåÖ’ÈŸb”ê´÷êSÒ8§ÙìZ°ÕzCB\£Îaý ¶ÑñVÒ ÍjŽþGù‡‰)ØÿðLY)]~]N2nŽ´3¢OžÈt!ÓùLJ°f[}-4Q–木¨ØOè9‚Xîh—OôÁº#£6øÔ#›ýTú}ˆX&<7- ~vYÇ™wfïiæ‘̲ˆ«KG¾µ„Õ40ˆ º Lw;§KèEåûÒŠRÒNBÔÿ U ¾äF¿ìÙKÿÔ"¸aÒ‰/ùn—‡2’Ceèx¿áÀS}rþÁ'êpÖab†9#j®òÁÔ”f ª %!AÕðÖ§^oïÇõ);µ }¸IøÅhfæ^RdWÍA\j»[Y·-8þž\xLèœ/Ý3éîEŸ:H};H/˜úcþÛ^9yþÙ ö}¡m)&? ô“Á¼j#$jþ6Gå¡^SB:g‘ãCöïɇóCËÆÕ'Ä£íº"`™sü¥;º'§ÆoM)ÉM£.Øf`—øÊ4z*õÔð®Æ­FIÆS²¹S†E[…g/; mù£Ä-n¦XL­^>g0î^<ß+plMNQØ‹žÖØ$«¸Ä_qgXaMhg£{I§ðn.²µ Ã*×0=ÆÝuELƒ/¢í¼\±ºv·zšMYSàÁ]0D[Ñ# Ÿ`41zÀe­EÁCBÏZùƒkêgó& 3¡D2UHI ÊVy˜i˜ëôਈö`üû`²¾‘žäý#4Ñ+ï00íÉŽ>_³&ìë:o¾àr✭×]qµwŸî̩޾w&2E§Âñ¸“Bf#9ƒ9Ý^?Э#mŒSÈmÒ4©`Ÿ[åÙtßxDÝ–§Ñ¥¿Ì ’úýU”…UcÐöà=ytÇ¥-üÚØVãÕû/Ýó~Ù)°Y Àš‚Ñ ÉücœĪ[ÏÞ¾[ h¯£)¬¾Ø³9>Ê,Àï.S~Z`xc 툄íØoýµ±_LlËBÑÇϟϪ¿^lÊLn„ò&ßYü¾X²{1@ô@©ÔÛü<ìš×ý>?9¥g®NãTœŽjHDG€Qw6Å8VT]òÑ8ÊYyïžôÏ1•GÊ‚1V’‰3lãÛ×ßÖÕ“«%ÅHu¾úþióüÀ'ìÅíZÉ [o@JhI-éö{9B£—zDô½-9e— oÒªãwW+Pi3!šEêµ›+TÖ÷P¯?fuæ½m;x+"Þ‹ô}ââ­:jö3¤ÙL±h\ûú<ó%‘]¤Û7Ý ç.ªFéad!΄7`;±¢ZÊ”ªíÎ~³þÃ}Õ¥>Ë÷SíÄÆ% Õ,J¼!mk(£gvµ ˜Õ3ãp: ûÅR‚ÍúX5ä@ûëyZ5÷àœ/î+¥ð¾$u©C`ºŒ²S¹à׊<UW´Î4G5”ørÉw- }MÃÇ+›À>\ bÒU«öúœOG‹i;ç jeï­m¿ËDÄÕ=0ïmÇ»áý½³Åýxræ4— Ÿa]±{$õ¸™íŠ’é“XïÈ9¥fžÙ ÄKÄI7jîC¸Ky¤ZÿÀ›õ¶ÇâÌ ÖÛ±©>dh³&A0{¥P’õ‹]1M²¯Û÷ŸÒ6«Jfð² g âIjZ”o«ìƇpçÙÜêÞ'ªqòjÛÆ„%°IéúâgTaóßóÛ1•jøËBûd¿e­TWÔÖ¡mŠúìwí=ÊK¾/dz¼w!m~på'0lJúNõÊ_Ú²ÛÕáÏsz“ÄîKeÃÂ:±ˆåŠt“»“}Á¶KÌ¿'°Œó™‰¼ôêy¿K†É˜#Ý*JA÷ñ*=¾‹æ†'ÓÊ乤·÷÷ëšÙçž?Í"ѳ‘uXÒ+É)©K­õÿ4Øxprõ8Ãò–uÜìÑh·U¥ ~?wló¿|âe‹ endstream endobj 116 0 obj << /Length1 1525 /Length2 7695 /Length3 0 /Length 8716 /Filter /FlateDecode >> stream xÚ¶Tl7Ž€Äèn™toI¥;¥KjŒ#6Í(A)IiQRP@$¤A@ZBBº%•‘oêó>Ïû¼ÿÿ9ßwvÎv_¿+î+~×}Æ}SßHXÑeWC!½…!"` ²®¡$ ƒEÜÜÆo7øÀm G{!PH™ÿÒ+£áPo,¦õÆšé¢@-7 D ‘HÊ€Á@Q0Xú?†(´ Pê‹pꊵPH¸€[å€F89{coùÏÈãB¤¥%…~»Ýáh ŠêB½áîØaP7  †€{ü+ßgooÈÏÏOêî%‚B;Éñ ýÞÎ@C¸í wþ*¨u‡ÿ.LÀ 4vFxýPŽÞ~P4ˆÜ08Ò ëàƒt€£Ø»Fš:À»päc?BÀ¿Z„ˆ@þ÷—÷¯@äog( †r÷€"H' # ¼«¦#âíï-„"~BݼPX¨/áµÇüN TS4B±õýU ððöñB¸ýªô+ ¶ÉªHe”»;éíø•Ÿ  ‡a»ú=VW$ʉùsvD •ààã2A"<}àš*Y`!À?˜Ü(ƒ%¥Á@¸'îsý nàÿ­„ü‚±ùcYc¹å€Bºücþ{¸ SCu sÁßÿ­RRBù1¢’@aQq0JbÁÿŽ¢Eü•ø_M¤# (ý'Yl—þ“°ï_Óçûk1øÿŽ¥‡Â2äû‡àV`q0 ûù¦ùo—ÿ?vÿŠò!øÿæ£æãæö[Ë÷KýÿÑBÝné±|õñÆr_…ÝäÿššÁÿ¬«.Üáãþ¿ZMo(v‘Nn7᥆ð‡;è#¼aΨò7ùµ`n$\å…øõ …!`ðÿè°[sÅ>^X>þVÁ±Kóï+U‘0”ïí—BÑhh;b¬$Ä@°kè÷ÿÍ` H‰òƺ±åQhÀ¯yJˆAŠ¿ ß6èO#b@#Ké¿Q,€òAÿHAHl®·¤ ÔÉØL@^p_ì ò7r ‹`¹ý· ‚¼Ñðÿòc?Ô?1¥€ @8úð¯À|Ðhìúÿ&(¶;ÿ‘¿5p¸?˜š@Án?pyóàýi•"‹Ÿðê ì(÷ªY&¿0f ÝäsNN˜Æ_ù4|}¬˜ÖÛNùeY•ïHašý³Uÿ–0ª!Å ñ"è‡m²áÈj#`r˜þÃÐó-Åê.6bVac…µ KÏ Óû®xõ×Z´¸ó<}¤Èõ hNý:Õý«»Êfú#'V Ö*%´I~”}Ž7‰³ºÿbŒ;ßþÙ8#·0‘õ¾?ÅØÑñ(uîлV² x;^¬c¹ šp68ûÒXÔ«•‰‹É’‘ „£´‘®ÅðSR4W8fåS#ö¥ÇZ=db‰XòN"Yêµ|ÞÍ5§Å“í’º>¤ztÅtúóµK¡òÐ \ñµõà£ÜžPÊ]Ì[u펖Ï%•OßfÑ-IÄ„iqÞd–•=âMeßG?šöe—›fW?dJ¯¸ "c7 S#×}Òår¿Á"xÄ—ÃqQÚ– Ч‘#í*üAì"¤eS^ó… _hÈ:ܦ¸ÎÀÀüI€…ø{`´«sé(®Ë]¿¦/žÛ¸Äû®? Ó'5Ý]-¡ŸLjõ@¸&×Ù¹ìï¯Øµf×´©–›ð£ˆv¿Ö˜í“¸(é9>j›i­‹Ðï5Ž›$h(þµåÚÛ¤|EÖë£â@9)–`@tœ¡Ädiäàs‹t#§Ä¿}¡¸aq~DïìÎÏÜ8È$˧¥|óE×4I†QÍìz9n–Á£¡€IÞ™Uã¬+þÒ:.MîÁ+Ï…ÇúšœÕºÔ)C¦þ®ƒäíþ]Û sïÇfžÒXÎkI8‡í½Zš–uVœ®šì'¡láLBÙOø6ÌÑ‚áÍV—ì‡ù;×Úó»ØÀ)½×`ú•J˜.æGÙùÓZHì×Yõ'¼˜ÈçV‡A•stsšJÅ]ˤÕ^‘¡¤/²[)|Ü6%M QÓÖ:þºfæg_?uu¯ðÍïï¸ï50960^§f5L3ÚÍż3Öq?];^1 IÐyü‘5œ,P{R—Íý5û@Ñ뢧û?&‰m6ë&|«ßPª}?ÕýÙË|Y·wÌßiú+âö˜½Í}NØs>.ç?­Ü^Ö²%>‚‘z¸wÓ/Ôf3…ôŒv²³hÒ7•ïpä–pa8¼ýÛûÑÆB"yaÌòv†|‚Jµ'ܳ-½êY|9+Qµp~^ ‘¿êÎ.ëèKf<}R€êýbEf¸Å˜ #¨'r~YÖ%7Í+›wÿ]·¦ÖkÀѺ?J™ÃË^•'!ƈ˪þ˜v©ØÂ½u4f©÷Q€Sy¤"àw¿AþçµCú络éoó"ñ¥Ë˜oÞâ+^ç¢@N"üŦÆÝ‡Em÷éd·èyl~êË*ÿw‰v‚;¦6Únx샦‰'Ï9T‹¤(Ô)Oó׺V:ßu6+E»4‘¯¿í0Ê´K²²¡`¾zr!XdÃí2çÕWvIV'T„ ¤-¸˜ì/Êj?§eî‘Sä~ÞbÕXsúìøƒ¢CP¶Œ*`ïê¾÷j_ÿSë±ÍŸ$Y&Áè‹|…8âƒ{äê³Öþ…=âÒožÔ#<^@ /òNC8>¶§iºˆ©l­sFài˜ã4ÛèÇAVfÛÁýäb žVsaæ=ôrÌëÁ´S¹•r ö[ã|RÝO×!¾WjWîä²”@ÎV ±3'œM1#¥É—72¾xÍI½'\ž$KOCdÖMmªHÖ÷Ò«üh<«8à\­<šiE©^èêƒGÁ¥È²þGªV÷;§*.'Ù$Ó?Ú’4œFvÆ 1"TPJŸÊåå!¹ðDíéL;²›ÍØ÷jh ÷}öŸØl×[¿•åŒ|Õµÿà/I»úÎH•¾Q¼ª0ínÎäðžÉGyÔ+OÒjJ3+ŠŸé¾­²çzÆâ30èÏã|ô¾sDç|m¹¦½{`ÑPÈ·Rò…ª=Nx×Zƒ¥8­,ó‘\GöYaÖ~×ÄSÚÓBNºFg#jCÅêm9ÑÎ9‚¢»ãònžs|#*_ïFFù¸áݲ fŸéÎá,%Å)²Ók‰>땆S6Ú*¯¾œRº³$[î´¥}—:‡6Ýܹ5–Âg§Õ÷ê3“´HT·aa_I„Ð…°ø›2C§úÄîÜñlˆ>¬,œñÕDÈ@™Oc¬Ök?•!Fˆô~¶™¤ÎÕ5¾šO-®Rè®P†meP}7-ÑÃòÍ‘å›4¤M"!NNvÀwŸì¿]¯õI'®½X2u@×Û–«rE¾ˆŽPëX*oÝ·ÿJ¾@9˜˜ÄÈÿ‚Óç'¼pcvpCàN¥;AW0 ÁÕà˜GwB-ß¾ƒ¿<&ŽàöµÅç¥Ô„ì^DíÜ(T›)Ïö¸ÆˆZh,P¦&©smiMu¥dÜ­‘Ó¼OÆ*¨6s B­ýe§àê³Ù4ùô朙åuÒ4«eÁŸamqÒºñsHNÍsà¬Üz#â8;}'6î¶Úð õ‰ßx/›ÙdÞt•:ÐmÓ›G !ƒ4ßY”ú{‚Ö!DQ?¼Åz\öéaŸ<ÞÝ1±?sö&—j¨míŸUóv¹fÁXÙ3,ô¢/¿°“þcx»q1¯Tc¯GÚs_ WÚ Î}éNYÅK|i¢1Þ e{K¡tñÏ$—kW9„fÎk$~=%rÑŸò•m-tü¦ÕN+û°sóµúà #4-Þ,ŠŒ˜ØÇrF·ßWùmÁOq$j˜^ØL óà*}±´V¶«mÂïXd8Ϋ«ÝpQ8-:Ò:\57ëx§ÿ–ï ‡ö¤¹–65‚¸©Œíý{;ûÍvS€±qßÖÓ¸Û˜ômÆެ-ÄØÉlnk€QÃÕi1óÛŒ,¨oQ… eÁáâñ²°M8Û¨=rž±š¥ßãbpç±tÖ»Ox›°º–󭢺„’|-{W7ˆú ns“–§ïÇ¡`ŒméöPù”bÓµ6â¶]ãPŠï@ÊNµj»ïá iÀiòñÒï¼… ¥°™„“ÓÇ_L»ø-~Ü¡º˜_#é÷^,p˜Þvë[÷1)yÓÆvƒºú”ĽHXÅ„Ò_«Ã&ׯXPï;¼é™"/ÅGpX«¡ªt¤=)¼…ã=yeÅ}û:bs^¼_b©(lTÚ@g=ÿºT_ÍN%Á:š08‡nÉò$ù ÿËD)ðâ{Qä~›u|å÷xÊ} dz𞡟øì ÇÊf–Ôp ••^Nã,ÇöŸ8ž!ß”–©Nß±3X%9œŠZb¤~ƒýs8ôll¤v+%ic7R¶^â%êuÉK†ïgÏÇÉ+ØÇlS’,¶ÚÀæ¥Ü·ªug4ð¼ývÃqmƉø‚ÏÜÂ:§ßCC” /müaÉbHŒ` &Ó~è ÜQò¤™¨IYq)^¶¢§¤Æs®'6q!.Ò¸Ö×Yš˜ª©n0ñ#>ß™#Top°d†~¹L[Ž\ã]l»L&`w÷‘Œø{’Ýíœ'ËÁÉA§«–z&Ý' [79çÉ >5Q(W¥çh¶êCÖP,'$À üØ%.m ²;È_úiCôθôóEÂï¨~Rýum#•û£8Qþ‡£´G‰»T’°D ¥É`£îWÊL‘uu‡‚ òGaìÌŠZëtÜ·ˆïÌ ‡”¸NÐØŠöí¤šÕ¸”5:èÞíha_Á‰]5šq‡—²´st4Í“ ɸ_+“N‰…8öÚ=Œ’Ÿ']M«X°(´FàZg½eÒu.}6Û ç7ÿæ;Ó’bèý÷}J°5å6Rûé¼tÎý6š¸ Úr»áxi˜àk¼¶ïÙ{Œ.]Ãý3ß̼­âNv? WoÕŠptcÚ^mÞRÌúîxè(WQ¦ä*•¨_rsJj¾L«¸µÊ Éd]æÒ]`)/þé¾äÀEXRÂE ŽÃ‡¯M¸IB¡_~TD“ñ±ìú‰E[mfY™ç,+ö´d‡Þʶ뷮ÜIJñ\Ž˜…´ð'’ä\>Ìuh’À‘TkpU^-à@&µÄ²×áOÕ;^Çœ3Gx†W¤×‡±/âø†³Ì·Îçèum)X5qã} Œ„+ÛnËuÐp™IÁ”¾×ñ:bH‹r‘¹7ÞXê}@V'"s‹ƒ ›’ s„Jdk›Y ¶ÃOã>?Yo_¦%R-±¼T¢wEnÉ ³Ïó®¢TÌ<Štåâ çŠ?µ††  wœ¯eˆÙÝxyS"±.1<=µ‡£÷ŸJ_#ÌÜã åh¬A»¿„?ÎØÊìÃLŽýÓag–L\wzú¬»:ãý–!¾¶Ôkv«ÓýÝé´0G°óQÞk`ØŠ+)Úü‡d“ÒÑ}Vïõç϶U"ëm^uCtæ ý¬ráPV)7«Ùï¸é\ Œaoè[Êßל©Ä©’ªsô%-ž\ÀåžÎ)º{TÉØô1>ƒF錃`«‡V°`¾÷»G³“XdI¯ÅÃKhéln;~€‘…Nƒ’¾í½p 3|%êN'Ç5 Ý~3k UIÂö=ÿþ¼D>n€Ç2 Ù7AR'—Èäÿ‘z²{Õg¸Ïæ³Y!‹ÓÇoøÎ­e{J¡ëîÁe¯Úê%cóTâõòœÈóEØì8ºj"¨K^¢I–V©&™½Ð ·Ä™âŒ„;Lh{)lýŸà.\Ùõ«q’ϯ¶$aqï˜Ì•˜yÁC؇Q¯µ;FfŠù\íªÂÎ_¿sÁ«’9]Žw]w›Ç$¤.ˆIGѸ•É3ÜßŸŠ°ŽÇ%¿Öõö€'6rP? )b¤›eu7þzÁ•Zͼ²³ÁùýÓŒa^jèy©‡È½•]“ל.!œò ><ë‰ñyq®ó/1œ}»mP.‰Sck¡—pæÈöè¤{z ÑByWœ0–£¼Í£„óéj–¼`,íyï2ñ¡FG(ÏÙmªNÏ(„ñÆ&½Å—æP¶üŸäzn¯j޶¦ûâ¯CiF7„îs¿ÞºNÓhl¯¦á‘‰“‰ðbòjcdUÎ$õ.ù~þÓí{¾Ê  ü9<ïƒ<¦ÃÀ¶$g¾Œ¹¤7):¥É™™‘ô‘ø¯›«pM´‘ñntß —ž†Ñ(›GµfEµ¢ÅðœtŒ³¿BŸùu[n¬ÕYç„D¹Ï‘] ;ÂʃË¢sãÛRÛ„x×è02| 'òåPí„ §÷··ªJ²^_Ê Jèøx΋"Üx×aß|O;rëÛˆñ¾7Åj:ˆFz}›2è#ÊP¢^QÈò+ a£^æaá3IÒÜÖižßŒ²J«¼ó@§œïò“Ž«€%÷sýüóÜøTØKš†)ØÂ‹kOÍ {&¥ Ïó„lj4kmùþÊΉUž£nø–‘Ÿóº½0(gÎuÜï€drµŸÉš½[QPgâòÄŠªsˆÞ¦^Ù3}=’¡di ˆ/Â@äA\M`¡·jk–ë&åÈMaœ@ºGO…3n0/õGš¶1)®œXg…€÷À{UŽ´}²©ƒ“³-t4c[Þ—ú®aµþñĆå"ãqé+¼Ðͯ†½F^Û·"TJmK•¼%SÏEèå_Æz'ÒèEˆDÙ,4|î+µŸh*ˆ+8Ï>K SýZ›ªâ´?©ûVálÓ‘ø-B"Z†V÷¼ÿýú{㓈:ƒãâ{‚ºùÙ¨°S m­—Û äFA‹!ö‚}3E{™Œý]¼›7 §}ÆC‘ô¶°§ïCÅJÕsYÞY“ÝS^8#íp‡ï1}>YžôdN¡Lƒ“ŸÉT9sÍã\&ÉÍVÞh^Ï“b¦ðàý”&.`våhÞK‰Î´*g¦­^ű( >!Ç똔»èµˆsbÚ õ{p¢„ÏÀŠäˆ¿LޮöÕqƆ]+Uu®jΫÅÂ6Ïå¸Ç;`ë—&…ìen!ÅF<—«Î=£6ïùd¼ r§„ÅÔÏ™&"û2(%ã#­ä*ž6ü o"5)`x[•,ÌAuïãÌÄÞæ‡‘Pwµgŧ¼A ³!¼ç\|{Ù {ö7Ërô¯Sêá´¿õìypð[ÎbÖ,Ëv4#aåN jþÁV£‚È(é9âæÉ¿Fƒ“ü7ëß|î¼;:>tãRšÏ©t´`ö~ ²8;y=jŒ¶™´¿v•ö^ù\ÅÏF˜  „xHAy‹^©÷€£Ž²2G¢SZÊœÝSV­?{0'Ð?ÐÊÍô§åÂÜ Í4ÁãÖ~Û3}å/zÎ[ïóú^'hˆ2‚ÿlg¢~BÝ~ÿõ®8„íQ¡0ùÚlÍ©€îüƒM3¹Ÿø5]S%¼’Þ6R°}Ü¿)%¤ù•Þ:cé$uôÌqNÆ?ôsQ®ÎcLÍû$Mʼnçr? „3Æù~õý §Ï /¥5-‰ct…²n®x]N'ÒÉaµrÉ® 7Ueêm{–K{À_^&Å4@4$)f)<¹óå¼¹Üö¹šU%}Ïîϰ'>V(£‹=:¿¯TF‘ 4¶zµÎÝÂ19v‰1î®OG,²_¶ó¿6uÄû’°¸¼k¼ì,*pÕï‘ý9˜¶ ô„w:æGnëy<&¦nÄ·voà |Nc 6 æì}QY^¹âaíÏèä€ ÷X…L>×ÊÞäV #U[½TÔtFÎ*ÝŒÉY³eŽtÙyÚ÷9ûÞÄg·ŠUgLs¶\U µ„*©»/L¤ÑT/¿ˆ+Ʀ—’¸š3©>‹ª/§'—$_ÁŽ33®¥jéõÎ:0ßYukII Ýü’/J‘RN4ùʶ2ćÍV¾¹æ=«‰pJö©Ê`ÜÌ]á5“koÆP¡b9#!Õ½ûlôôÁ·Ï#É%qël:{N(ô>êµûyäÚz«)¤³—ŒÇvj0÷ç„*ÎwZ œï4?r8rwžÝP2mµÔ>IÒmäá¢nqG2꽫‰{¿åJ’)¬,¬Ôàr!)¡¿x™ù`]­™1þ­½ÍݘY`Ig*ÃmÉÛmIiL|ÅE‘¨è…ã2p}²¾ÖЇ¡g˜^¥üÙ%ô ·[ðs•d÷hùQtßr¾ô‹Ï[?eÝà¡é#Ë4•L“!}‚[ߪ­B#êÐvpœ‹ÏŒ³{ò­ïn¦Ö!ÉmÅJ]ù`˜½ªØzœ-3…ëìd{1.PæTIûIÁ‚GKï+´Q\ 6ÛÈÕ‹ƒá¯õ˜j`ß‹É;ÈE¼ÒÑ k›²fêteZ7ß;Go,&?OÉDê58œÈ´¡¹`<{èoxu¬ºK¨ÄVY{wQa±mm[’Ó@Eñõ¥ïòGm×±bsy$’Õ?ÍÕ‰þ˜YLp0)ƒTDæV®=ÉÂMM.-¢¦fÒï…„®$•þ°c©Û ÜÆG™«Ô¦AB ˆ‰öˆ säõ*×躉ªá]K‚‚•kÚă5\^`<ççÑg¯Ž¿# ÅBÖYtÕKMvfMGc$Å„@^½®æ]‡+2¼ùu.´»' Ø Rïÿ'¿ë endstream endobj 118 0 obj << /Length1 1758 /Length2 12431 /Length3 0 /Length 13551 /Filter /FlateDecode >> stream xÚ´TÜËÒ¯†à\wÜÝÝÝe€ 0ƒ» Áƒ$@pHp î,¸[p‡à~Ù{Ÿ÷œœ÷ûÖºw±Ö𪪫Õ]Õ´”êZ¬ÖPK,âÆÊÁH©h €@.6 …–VìæúÇŠB« rqC!‚ø¥\@n/6i ·—0( èîààpð rð N Pà¡.‚i °5@…  …€\Qh¥ NÞ.`[;·—]þçÀ`Åààcù{9@Âä¶²€T,Üì@Ž/;ZY8´ V`›÷¥`¶sssdg÷ôôd³pteƒºØŠ2²<ÁnvM+ÈÅd ø«\€ª…#èïÂØPhÚv`×ÌZP7O àÅà¶A\_¸C¬A.€—½Z Ê5'äŸ`åXÿ:Ç¿Óýkõ_‰À¿[XYA, Þ`ˆ-Àì¨É*³¹y¹±, ÖZ8¸B_Ö[xX€,,_þn•ÐX¼Ô÷¯ê\­\ÀNn®l®`‡¿*dÿ+ÍË!Ë@¬¥ ŽŽ ˆ›+Ê_ú¤Á. «—S÷fÿûZí!POˆï?ß6`ˆµÍ_%X»;±ë@ÀÎî éE¼˜Pþc³¹x€@ Ÿ'ä yYÙ±ÿ•\ÛÛ ô·“ã/ó‹~_'¨Àæ¥?ØôòÅ×ÕÂpsqùûþéøoBáàXƒ­Ü– [0å?Ù_Ì ›øåæ]À^#àKãq€ýýûË䥷¬¡ïÿ„ÿ}¹ì*òrê²:Ìüo—¤$Ô àËÊ%`åä8€\¼¾—ÿÿ΢nþ— àÖ*@l ľœÒÿöø×í3ük0ÿKúÒ± ÃÜÈ´zùáønó¿—üÿu÷_Yþ/ þ¿õȺ;8üíeøËýÿñZ8‚¼ÿåéWw·—ÞW¾Lä‡êþW5ØÝñ{Ü,^f@bëðïC»Ê‚½@Öê`7+»Zå»Î_憀ԡ®à¿+ø¿|/Seeÿòh¸¾ôãß.ÐËÐü÷–2+¨õ_ÓÅÉà °pq±ðFy¹ââør¼Œ¡5Èëï°³A n/K/åùl .(Ý'/€]â/Ó?$`—ù7ññØ•ÿMüÜvíÿ?€]ÿß$À`·ø½d±ú7ýU»õÈ`ýœv›? Ànû¾lj÷¾¨ÿ/ÛÚÿ/šþÀŽÿAŽ?ðEô|‘áôoä~©Üé¥5¡èæx‘âò¾Hqý_V¸ý/ÊÜÿÀeà‹2Ïÿ ç‹2¯?ðE™÷ßø_7måîâòòÎý=‰/mð?ü÷£ y¬Pæg VB¡o«C[n*%HMA ÿíú½ ‘ÞÁ£ñ!›½‡ÔаžÙ2OUL‘í¢žáeªÞ•ÚCÀ’ ¥•×@wÿ\ĸ‹û¡âTA´˜ìÈïÁ­bsŒ(|þ™¤iÞ¸ ½0g[¼eüf©Ö·W>øY¢ìö«Û­¿ÛÔ¿Q½=ë JX"t[ó7ÂY ~“jä´¿e†i†ŠttöW|ÏéhïŠr°ñÞõ'ö(…{ÀÒ,û~…'³oüŒ!& Sí¡_ÁýÒ{{Ƭ†Jé»ÃþA4.©‰È¤H”V\ÒWÒžC·§{‰ì»“Ç#¾æñÁ»'iq>_x4/¢|Øöv»R²¦ú±eCi˜5&ƶ_ßß_p<|©íX÷EòÑa[þ"3gHFÇ(ÔP6¸ºÄ\ã›Ñ|eœ`éÆÖD$«Zà¢ÃÚ§ðLåui{Äý^Iÿøzœoç|àךëÄôdôÐm¾=š§Ú­³45q•ûÒ<1㌡W $Êx¿JbÓ_ûÐf#L+©*>$š÷”åOøÏèñ~ÿÒ“C(ñ:F‹Wu/:ƒ*’ϼ¹e)Ñ}Z%OëX_ü7x²‡åÉKa1“I*¥µÅCˆÆ!x`ø™½›;sïD+ÉüÅvá]óýÍú¾ªêBM-ÓœüIõ¡ºOá²—{•H mYÕ„µWÔ%¡¡Ëx_ÛCKç$ÆHéÄ»°³·7F6)ü#X×Ó}·¼%`h¾; Þ GÐÿð/œ,Â}kj¼ÿÜÓ$ºáú¸J°í]÷A¤dYª[fOr?m e…¨w÷O(Å×)x#Ž9MÖ»ÒÅZï ̪j°ÿœø*Lš1a~Ò‰nfúÉQhÛý£…!‚—Ë7Êöå×Ê’hR-Ý©0± •¤÷cÕ± )ã-V·>ÂöÚí1bD™ë&”÷ËŸfEW6žúÉcæêCmC“ò&ÃÞŠˆ’rT&)8 ÜQšßÒåêäb¿Ñ2ÈÔ‚‚°·ª‘gÛwÑ€r…¢€Çª 1ÁC¶³í<Àžªu_®IÊ›öžŠ²R‘ã|Á „iÖ’å)r ^Ìø,BÛ%:JC£:a½ds±zšî/Ð\GÊMõ^ØÑƒ#i‘óÑŒT§¥~ªíÍË_= øUÃÅAÜoTwÝ ëŲ0•54Ž~·äÙÝ”‘üx+´u`uabXª #Ú*G¾‡Ã²\& ³h~Í,=\ªò8o*D·q·Õ]+^λqÍfªÈç5®ü²Rñ™ôÕ¹Íýê§”–œNÇÁ5McOEä1M§«Ê³-†€÷'{AÔÜ1:˜û–€†Êê_‚+#ë ¹©–Nk2óÌGx@ìo°VÖúO°Yeʸ6fJJõGÇs±Šl°11þÇ]ÞT Žå”fÔ E^–×N<ªFOLšÞ®©I4‚–ìG5âƒO?”îp}mŠçWÒøÊ')®‘o_¯‹f2v–0ÌÁ£âiô"Gt˜ò’5ÊIŽÕ3JÚdö9DtØ~ù™·ýXÓøµ  ¥ß‰W&'ì ¶¾).J ?%·jó“¾îò`¡¥óå£R RwÕq@›(„døŸ|ÞËþÕ¿Qš·4ë¾ÿz÷-bî’÷gLySÓàÏÅÞQÅðKTu¿‡n[Qz±3«­Ô›ZrÞéZbÐ+Ù§Ã~'æÎFt3[iË*£úʾ?hɲ1¾„_újc×'ýóÁÖv›np—mžCÝ Ñ"¿Y#¢\ñÛ·c^R²Ú_{òô¨Z8Èo*0Ÿ¼Gæ¤C4"©þ•#Xc’pHô³òsqfùÃJÄày1‚Ã|*§è %SLP =q$índ®jÆ )ÜÔ'Qlôßz.¸íH­ƒ0¨ª¾Êó‚Ì•¢ÝçÌðÝ#))—ßub‡®ì~ -»-ÌÀ¼å@Óø\ÎÊåÿ)9bIOËÕ„éÇÜ—¥.A·þgóNÅj!Ë‚Gm{w(%óÔŒ¡IáÕ>$ÜE[’TdЮ*"íÝÈe®Làþ*’‹x¶qèa¡ù2r§ÂjN'xPôkú˜Ž¡ u˜Á€àÒ°]×/*Š™Ob<ØŸ»©þÊýê^#ÚZ¥wK#îâ×-ãÜÏ•šŽSºß cM®bõ‹ü+$©EkaÓ1d“º7K‘VVø§ý'Ž÷ŸÊ®ó[ó¿»kDfODÏ»°¿U;k‰f•¨\ù&&:šîc8°ÀˆÄè3€|Í)9Ìç—Ãoö)$»:(x;Îʦ ™÷ˆWfy…3C=26¬¥âo‰w=_¨z«Rz99lñµõ~Viç&\Ð-ÂjṆø:|ý³Ø-އ:ÐX>h¥‚{ ¼Ì¨æ¦ßžXîûÞaƒS@Èý(ûªo-kM'ãVŸ¬ö™2äø9¯¼1z ¾«ô¬ìïV+ãbƒš²ì”ÿÖË Ç¢ºm†qÆá‡ÓæZ]¼dÓ\é_ç¿Qo½ø÷!Å~Çå)/<´1™úD0+_6o.eŠ3°¾´ï@geUóŽ6åÊ$ÊV 6…Ê4tbÞ—h`™.xñ]r·Š™p†JülÉD²ü‘ï\.4ÿùÑáýïîv~ Ýá‘›qµÅëèowFNxìð&'rh °Ž´Ö‚äfáB®Z÷ÄÒ¸åì!ÔŠ KÑ*½^™Ì½t뤥ÖÚïØrãí²úbíó}ˆÑ–={™sPF“Q0<‰y>95ÿõ VÕj¤Ó-y~n$—‚=d+,þBž¾ÿµ%=(ð°^7î~¹°ÜÑs¢H.ø¦“_Ó mOžNÀ6"é‹èí<Ç0˜|P¯"µ[A¬/5´·f “ä}Wò©÷d°-ÿv¾¨©ê¾îmxç»IÁ7½{ò.o³v^"¥Ž>3ñ7ò¾æ^A;Xq^ç•(f¶Õ¶Æ½ nÇU±Qx{h³A¤×~À£Rö@.m°ç!BÈæ¢³ÿ”ÕËíÛ¢§µš'ØÏ¤  ¹ktúX})8ÄqŒQþâèh´‰ØôC`i4hË3õƒ#“¨QÏœÀnmåq§›%Ÿ â|œÿ·¶oxZ¿dò§G~JbhZ†y!›[Bë˜N?T&× 7Èa¥B%«³ñ>`ð½¡LÐ ÙŸ*}Z5‡¢‰! Ü–GÙùîÈÆØ Hb£(s”_|ó†2hÊÅÓ?ÍVšp}£Þ‡cQS,ä÷ X?¦Š>;nœîïV«†Ú2ô4{íþ’Zµ=Jj~Åí¯NBŤƒ:´~\Ów 7ЈÞê6«Bƒúç¢B/ú–1^¿ý,"äuýÔóí"ãGæã«yJ¹s·êæ9E¢0†×—?8}—Á.1üì)Ö™½¶Â:·³IÃv{:Oþ.ßëáMYUì™#G—a,7jœã=yØ0Ú«,°´[_ljÏ0æ—u“ãäP¶a™YÓ OWóZ ò=S‹ÊDœð‡S~«zíwn”qw-Ÿ ¤çêê?úŸ0ôYs[ÕòQ“ªí ±æs“9ŽDjÛËrðDýb"=CA1vùûEµÛ ’\rh¿…•%+øüÖ³VK`¬Þ$AŒº¡ñ€zäëé ßÈâ{\éi;êLbØ”ïë_gõEŠG[%FS”‡¢&r‹9‹nFQnñeÐKiŽ¡U ¾w"7f8w‘Ó­R@øQgÇ5RTÉ‘l2O˜{ƒ>Ý>z1 ájéÑŒâFòa¼»¥‡FÔûXä€õ—ßNäWévŠ%yɲ§¦aò†!vö®Íå­`DÛqÇ™[1­Ù[5,™NßdïÊ¡Îjl¤Nâ¾Íüò—Ù ÌŸ^ß š»ÛÞ/L™}zX$¯iq@:{³ !êeš¹ƒûUᱚ¼Êù˜pØ¿»vY8ë¶O6²BÚŽzݲªïçþ6(À3šÆÔà›˜zææÕ0€iùf¦sÂ.‘Nw¦@Ù«Q¸}æS}Ž/JÉøÉË(3oe™‡n£ã‰Ì˜ZâÈö#ü Ï(RȘР…ã;¯F¿O½[š…N6ÈL²CÉò¸¸®Ĭ!(LÁ;m½",I4܈>[ö¡–ö§¤bµe|€«úf¶ZT+ÚËí2mS‰#6Ëäµi©¨¤ZøÇæ™X© 5ù®pHQèNÏ7V½?ŠçĤǃ¦.L*n¯Ò··ÚñÓŸ%ûåÄð«ù©j©‹Ý&dn´p&z%7½¡ëûa6»¯+¢¤éRÍH„ŸÐù.Ÿ3TS”é›h'Í8îÛµá×Ëyà½d#¿ÿî]Ã:5^¥—ò‚PVmfœè=ÑÝFŒ[Iº¬9!W.SÝWæ¦_DLIŒ“{KN1z<ÓŸFö¼/}T©¸Câs™- N¨¨"JtÚ<¹åºfÃSF××?×ÌU^rÃY ëµ"€kLßó<€ìœï1¼X=ѾW,Y\œ^ˆ¾rYxÿŒ[ºPLa‘ñ›éž&³õn‹grNÿ/Ý"ǜڸ€–s‰ñ§)Æ£?…MïÌ‚À†tq”/Ÿ%hcÒ· ×áõ±\Ò$&˜¥$Q"dJ§S¥†þŒ’à-jïk+Eºûu÷™}×À'Û9=Äeb# M2Ox¡)Æ|‚;mYƒÕ ÑN ; *ò$íÔ•¡ØÃØk²nJ^'ø1†›šŠtÜE[£á>Ò ×ü ½Ë{É2ßÕ)¯Ž,åUŽöóq`F/b8Uâ>S}PÄwº&Y­ÁiÇu)Ïz p0 ¾ õõ2U}9{25¡¿l«ÅDz$¯ŸrmÙ¢‹,ÁF(8·34S+ÞÊ×Õ þ¼¯(Ôó•¨t– Ë™wNI?HæäÇ0òà V±pÕ]ÚæúwëŸ=vÛXŠïI[ƒãà-LÅq¨"Ix1*€hkþUö¸M÷Bˆ„÷˜».˜zì|”ÿ™›®BZ°ÁZ¶CVXƒÃÌ)ܾ·¦OX2¼nMj!^Å÷©Œ5¸µUGd+d~ãX‡ þè·!*É ŒSÁ <3މFä±”v0ZÑûŽÕœùvOTqËýŒ!Ns©xígjox·Êýq¦PˆŽlåÏ£Õº’¹f^+·†óŽ!òŽšWŽ{þŒŽvÈ͸µ{¸M­àz—µeXHc¦Æç“Àì¹ÚöŽšÑ¶Oö$ßýæóüø‡µª7¸„Ƹcm×/\Yª~noEfu~ê\<²ÖpEÛn±ÿ@vf¦Åâ›PYv&ê;GrJ!]€§ÄßËJêƒK/öñèK¼%%i †¼²ÄxÀ£sÈÎ ðh‘Í&=–rie‰*·]æ©p¤~ÿýÊo/Ô±ȳ‚4´5U¼pê‘>“ªm€ºû¢‘áä?©søãÏ ƒ é´Ñí;¿PžÚ‚Z†@À‘ÀÛwçüaŽÎsé”Q˜œkµ§Oñ¤½E8é¸ÁÍ®Hþ©•21øÊÒrcZLŒâªü<ŒR}‹,„ž—7uéÜ"­S¼T*>n±ŸM%M”3_¹F3)@R*²¥Lw4(ZqŠð5t2+O?EnEV?àXEr.LÔÁzŸ?-4úZ2:µCÖòLvº"9žÿ"¢Ÿ]—ª@–€ ¡ 0¾Œgê Î…²í¥ßi¯_oÍ#Ä(¸zê»~ÃE%æøLÖÑ~þ3N0_±ÜºbǶøB•FѶñ¢ìºé+élðÃä-QrÍ“ä‚ËAläQèåopáÐ9Oµ“Vô«²N©šêgA”`x/Õ+ÍI_©*øð&1oµ&­¶mæ5mjóE¦Ú`¦âr5—‘YATÖê9 ,*Y}Ë$δ^5YfaÀ™zœ^¿6£ ƒE°î³ 9LAU³aÂxîp̽ø‡Ëmj‚YÕ›.U¦±Û‚*…®¥hOaÙãÎâ¡LÒ wifX“Â0 –¢Rg £ãØFñŸE&´Ád…ïH¨•ø¢(²¦öïv4߯gÚsJdˆnÑ‘†˜V/ïiúŒ‹Ø`Gì¥0ÞØ¾•XN¤÷ ·”T·®Ø(0ˆe™¤ÄìÎõ˜ÞrœCU¤Œ¯b.¯bת†è‚Qð×'3ZÔäZ¿“àdV ±> úå#Ë‹,s™`t†™;:i¨ª,MB¶ÑµCaGø&:ÏçTiG”g"ЇAiýîͤ(3Òûfîfïiñâ7+ˆY±?%§ (¾·$]"%c5ÀŽNŽHŠ?‰§,(bõ+¹ÔÔUqáE¶¦Á~s]æY"ÎnúsÄ@ËfÎvõÝ­#Åœðl ðÃçÝ«Ú8Ç–â3¾ÒÌZ{G ¹uÜÄ[Q«„{šOèÙå©æÎ¤Úƒaãe™õéY7oªSà«|—3%ç`þ6×Ù—Ñß¿g§3.¾„°i¥¿b §ÃlŒ7î7éȲÔ[Í¥ü¢ºRà4ÿÆ¢û˜`×â· ižD‘‘ŽA«uBÚ•r<«<'ÃÞš:ÔÀBÉÛ„‰ßÅû5œ¥WGÏïKï(¥3× Ô áöD²‘eTi¸ZŠƒý¶/½ÖÏ^ƒ›b`[Jø!hl¹u'$sø>ú\W¡äM'†&oøua.’Â2sï[ptJ+Þ¯Ù¶X!‚UM˜™ ,à=å³$[íÎy5ß»úOzËióÎ#ÀE!Fgáë·lü“ÈX÷zN€Þ1ËRêÏÐ5p.»§ ʨâ0.Ï#€ŸÍÏú„'?’@‡JüNŒYnªk‡-XÐ̧ú=ú]Õqž«råa{rQ»ÍR¹ó0z½KäßUYçD>BÍÖ+¾N¬Ãbˆ£“>VLU¢ËÁ]QSÿ]‘=,Yö²M—²–¼béô ôÄÍÜÒŽøož> @ý|ápæãô›"KaðHÇÓîÀ¹}#ÿÓòmpzlûÎbf:³™mÛáÅ'“nÙø¢PØY…ðlôÎCöJ’·f‘‹Mš*‡²®­\²­<寨H³® ÆrR-…° Î ¥;x¾ˆWe¾Ÿ™6„*ܧú$Œ2ô+ô¤1ÚšùÈ¢Š ¾z î7£™)7|§Ï·Ät<œq(¦ÐÒ²&݉׉‰y–-%ÉOÚÀšÌºÃx{þs_*b«Mñ"¢‘è¾qù3ivÜ0ÖUÄÆÈUÏ)Ž#Úv°ÎºHNí)w]c±[#•Ê‘>UFÍVz–×k‚H¤‹be“ùˆ—+Õ+ñ;ù?2>^ö_9‰_~U»Ô™ãµ?™‹QKˆ¼Çd.› ê_ôêU êÚìÄzß+bw_:ÿ‹S´õÑà©Ïe©š™Ä?²G‹“ú%ˆQlÇs0àÀÓ]À%&Ë`%ƒà¾@Ý:Ås‚¢û©¯ê:ŒMÄãèsêW÷9¹þ&bQLŸ²—£«2éØ1¶\]2Ór"«ÂU@²xƒǽVך!O‚ñvÅq†¶ZÍa§®Ûºd±4i8”šYå“ðùñ)ˆÞ¦AnÃT¶5tÇ‘b»9ð†Õåú¶{Þ‘Qy¯Ï“‡BpÏ%5^üŒ.—Šh6ÂÊê. FkŠB«ki|eE`³‰ Ú"Å‘ ü“o$!™.r”X:‚ãb”hp©©Hú7»ÉĨÓÞ´ŒÁ]«Ù›7dxi’DÜ«tV‰Fƒ¤Eò:·s eËöSà…Å6Þ×p†Qø­.âœV(ï›zN] ËuâbÑsÚÝ´(wúöËSü\+‡^ò³m ÉþÓîSóÅ1˜žT zõiá÷©ÁøsP±Áç¤<Ôð¹cÍÞ Ü*C½n²½šêvYÝLþ¬3ã‰É¯¬¿‹Å~.øí®“Š Éjö ©*uÎvÑDbÇNŸ‡Š…š[;nW;Èڽі !¿²Ìþ•%I{§gt¦_pûó ¹ÎÒ\Dr?Ÿµ.êÆ6òÑy±­vçºà=/{!ëBÍ!çÏ}øßbw7>÷eü¨ä²¤Úœ<‰Þ+éjöšhŸ«Ø6í‚ãE•üOÚ4¥-|LV Ò9øH÷“¡¸:íWÙ­G^!å’ÑûÃgT㉷~\€`0Mþ6dzUÍ*L¿˜ò½IƒŸ^¢H ;ℵ$‚€Žµ^|ˆbq³æPJC€OÙ‘$¹2r¹³á`îIàõìÌ—/ÕhòJc•Ý´A ‘z™z¾ŽAÐoë ?åÌE¬"ŒÐýKŸZu«“ð6›;u2“ƒâDÞØ¼ÇÉš|™¨[ž°i@SŠMÖ»c¨(âGãÕÖ†R)u™ŠØ½mÇeg9¿ëÑV8=“Cƒ{€¤†“™æßÅ?æN²ç˧á2‰0ëÒP-bà_ S|µµ–—²¾í%°âÒªíEà©OœÝ Ô¯O }7®ýÃv!)û!¬µòž¨/êôÌ¢üïÉ´:±‡£;@N핲ýû“)µaN~È­ÿuÉ?×r¦*õiÉ$»Ñvù±;zd¦{™`z/õ/ÇwS=F‹V”ûÙ~'nö¿«ƒÈ²ê¹æå'ûfÔ,IÝÕîSw¡ðx© Áõ‘’ÄD©±åŠ‘nDi²OG3]*^é”ÔkfÅ”u…]ïçàóAÙêZMôø(â¹ÄtïM×;;Úò$+K…tÚ÷I¤šÖ£W‘¯]ˆìQ§+~Þ“/ !F6NŒ#˜eÁHàè C´Æ^hj¦×öe§C"}y¹õÙr7ßò,öŠåuöôÕ?44“hÚÃìd&ÄQy¶ò!–õçXDká‘lzœ{B…¿ÆéøÆôB‰îP½Ð_I ò[õ'¾A¥<Ú)’PZ4й§ã}¥äp £S«]3`#Žª Z,—Õ/$ùÀDL(ù ާú£‡à1õ3‹V—Ü’H©ôÎÄë×ÿ{­§h¢>µ"ªÖT&éäöƒç¤Ë;C;í1”b•k)œFÛ÷DºíëU–jÍZ²^°Bu(dâÞ ØK3Ü×Ll¥ÈtàÓ[ñG4Õ‹LÙÉ}¿þJ™w®›:P¹l›WÁþa·ZŽŒSpá6|¨0§ðjSƒ}³Ãn¤¶º(¤¥;aÈ Í\ÝõªÅ¶¹Rs ¼ïA,7ÏÏB–vüØ=áìÒÄ‹b-m¯3Pgô]¹¸seJŸfï{óâ™E [ÍÈt{+¿ÍFÛcº@™cÀðT´Øé´lÿ“o)kدleD¾ 8UW¿&hýDTøƒT-+o~ÓoÝ„aVÒ„ù ©dî&År7&¥á‚Ã]ë>œß"bQ3#u‹¨³"´ Ôt†L‰j~ LIUœyûc9Éï]û=‰ÐÛ YÎOó ßIð¼~K+z™r«VÙ(!ï²òð0öî=µ\àDâ‘“t «“9zœHj§4c^´«g¬ZYÑ‹øcQ¨â<éТæhµ°\7¥‘é8-F­P¡Ò¥¤ÓLõ3Yè}•œÝ.3ÆÙ2Ñ|ßzª¤ù=NÄØ'/ðøA7—gï-ƒå' Œ¼ÞGÏìFVÈWâÆ Øô»ŸX8Štx\Ó8)Á7©æ³|ø¡|ZRší0OäX(0%¸HÔ3¿d.ê-é t±µ1´ûT œå oƒiMBh±Û0ŸÙr± ð.zÝoª:v‰ëN‘ø&rOyt$¸9#ê"7äήiJ0xt>y@2˜:FØ&ížr¨å˜ I"*Üý¯É’LipŒ*-ðFƒ“¼ã¸Ûk~ôÒD°RØOÛÑÀfÒŒÎ,x[p2†v·½H+ºŒaF–3>„lûƒ­:¡ß°å‹¼®\úÃGÇ©œñU¦L-a•¼v qŸ‰•Šì\01AùRVD70ñ„Ó>Ž|dîÞèç°"‰áÿ!k§ÙZVº<ˈÇÜ' ˜šFÔœÂwb/QR•= É€G*£k¾?tÂê§–5ÈæÜxÌd+zr10Ñ›„Å[)·‹Œçõdy§!(L‡Drˆ®;;Æ»¤¯û*Àß5ð>†K2Kš¨=Þ¹îùnV·î‰³tƒ_lzìàÔRë ˜x®®„§$!õm õ€åÛJ²†óÞa‡‡àB)|a7{ ¼í37ý»5öÛø¤Sù•›TÀ‡zÉOê] ן¼…È9ß™¼“p$waŠÚ{¾.G.Æ;éºúY.·ñ 43“7Ÿ·Š›ûÂ|H«ïK ýô0—åD¥5MÄG‚®¡:øm4h'73ŸrÔäÉVâ^'sGi4]÷I“q?ÔX¯†í5¯ŸW©»Ñ‚ä·.o3h‚uÞiL–UåŽ?‰^¢°!/ŽÿŽ‹Ýôh•:(Ðô‹‰âD+ð7•ý3ôº{ÚëÛJ@2´·½gIú,“ϦO_1ŠÄ%š£S¥8¿ÝÇïñjg5/>å[êÇ»É,lÜQ®ÑÍÐnô¶;t„‹"P6?0Yññ±aËîЦ·Ûw£áÝÈé€Sbèn‡Yß"úª|dEm‡”¿´A …ñ`ŸoCbžnÛº„wÄdÆ=Ÿó5\ðÒc0H✃<;M„°„‡“—ƒ÷€kM¹ë”®W™¢XF›a™]o㪘B\ìa¥¶.½Éf»óÞP¸io|uï­à`]ý+å"F}gA‡tƒªpàK+A;ç„hNË5rÜ:v…ðh휠Ú[|€Íq™Ù/ú+]ÕzÊHÄã=Œ ºÃpÁ`3çQ× j®ðŠ0¬ÎUA˜Ó"uãA´ê„>ƒSÑW8èÞŒ~'W6|ì}EÌ¿ÆD±2ɈJÊX‡B··ÔðPÃzøÜÙg„Y”~¸89ùk>42Œ2|æ@µMÚ¡íÌ:Åô' pã+zîç•^„6ªøJÂ’L e\6™K‹Å´"ï~b¢ô™çxã—½Ê|ƒöëb“v€½¨öí Ó†°áó/ëm Ò½*Ò o Š™ÙH¥_µÇ¨íƒ·-˜Ôt×ÍtÃw@š3’ëZ¡{F"½ô»R+"–’³úŒfS—‚óõþŠu°ñÝŒdÝ“êÓ³ [׎òÚQì9¦®YEÑOý’Ö·æVÈ»tôsU5«@1Kz„ÄépQuÒúPÉFb'døK"÷\…ä ]Äô¡´ïh™‹iAºÓLm0¬U–±E€‘¥ð-ªÒÆ[TW«dJ¢­±ÈÜ%SºcS”"B= ÉlÇÌmr.u&Ú’«BœEÞaA¯'ÅNd&g³µ½óPÅ—ñÛ±ËèÕ×µz4ˆ%ÄïL9Kߣ³Ò;kP7³%îØ´Ÿà&Ä…X–|­Q΋ôhD0ÚD7¹y?:“[uYñîUÌçGŒ]¤zDüLï šj¸ú•ɟœ–W]f7MfÉHR `’V\E…ÈdQä>X¸û¨vOfØ—pÿfY{ˆH.öºì7ó Ñкâ!„Væ-CÎu£><†Ûµ$²ëzºl äìó ¬ÖÉN#÷¤;5þ1Ê ‡çÍË—`›HõÆj¡p æÇQ&[2û Òq“Ç×ràÚiõ»P¦ñGW HŸX< ŸIPíl CïÖöz ?vnŠEÁ3³þÜ`3ïùµØÅZ\El÷;,-£/}ð1(üi Ì“žÜܘHo‹!,yÂ`L°¾Oœp!Åã†à‚Ö^¾€j‚Åg(Úv]»÷ªÝW©æ7¹£©¿FÇÕ˜y)/ qK~É[¶i"ž:£ pøAW­_Ø»%KÓ]Ÿ<å¥#Ó¢ûyÙ:«96•šZ¼*G Ï3Êf±‡EÄúåÌp½žiš‘wÛM¦ KÓk£r”~mJ‡5nt ;¯M4tã0Û I‘Ï0•Íd,¶œkÆW*®«^U¼ë©¯ËÎÈ•lFÐâ{–ªÁ.áݘšm†z®­E]§ÚXá*uA¯yϾçØáQÛ鼟y€þ ùËà‚—>$M­Éå*Q±ì?|I/·IÓYñÙ8‰{GM’<æ=€uþþ+æÜÛá/K÷%O ½ü6$£‚Šˆ*+Nò${ÊXœt2…þÁj”®g±ófó¿aEvºÓ‰Û‡méQ?^®)»ZQRö‰ŸáÕu°YÍ}?|’¬Y†N÷.ƘúКÑøË|°"+.¥y7—±JØÍñÞã.²¦Î  ·¡’­zغUHŠû 9µûÔ-£û›àFăc‰= ýp»9Œ9í,ŵmÞE­ {.i%öb¢GRzå¤ÙSߨI@rtF ! T91‹m ”Ù"k(rHi s07DF*ë;£sý¾fë¡‘ºji½yE­ï76H¶ ‘¢ÐfÿfØó[.ÒÌ6SX¥¬Åð“nÅ}ÊçLà*Ç«Mª1š:¯æ韰ô¨ÈëmƒMø‘ÊÜåó¸åÐrtnãxFî…§ðªÕ©ïsÔô¸È âHk^%/ WàðÆõ ¢í4…c®M:¡p,s ¨*Ð'Cá=zÆn;ù[–´Á6þ3ÙÁ†lžîK1³ ãøä£ã‘±ÄR^9³ZE‹{¨„}Ò8k8pRj|®œó’:h¿\»À· Ë$»à–FÖ{‹Þ'P¤,X‚¹DS¥íêül’«þyàû‰ª7ž‘Ü U@Ž‘?€ÀZŠ @ìÆÑ§WJßJå)|‡ì›Á‘bþp‚ß8ïåú5ð’':ˆèwWÓ1”PáFîRE•’ìpHê|‡ý¬>®c6/Çá…ì„–y´Î~«¥›øÒú+G$þ›ÖVF+?ü¼¹Ü¨´ÿê¢-¯ðÆ6Jìþè²;º £W{%6þ;ˆ¹‘kÓûQ ,Ó7[\ølñÈZüƪÚ%LÓ{¶õ½'>nƯ# Àqäìµ¢ÒT½˜‹‡\·¨×ë0 F±¸^dñƒgp‰îÏz …ÙöÖ§ÙÕcщB¨z8ÊbÅÒØfüÑÊ‘Å\ù_âƒÈ‰‡nÙ‘Ìhu×çIX¸[™?=@œ WäÙŠXéІTÐ6ZñâÞpҾˎX2ÓéÒiËágn&9ü1ýÃñ6•;_•¥0Ÿ?à; °bm„G²U¼²ýÄ+n?éK‚ %Í<¥ÄÖ.¼·5Œ_~…°ºìi2ÛÙt_ïð:KõZ25-Œ”äÏJÍm™ë‰xí‘ÈÝHã¢k{£Ö%ކ–#<òà•„ ? U¤õÔw<{T¡êût–:=+=;WQÊÞ#¥É˜_ph;e ø”YÊ*™U§z,W?\0,ÂÇö‡ô·Œéì®Í[îÇv p³Ô0ß ŠOž{Û÷:ÎçÏ›7MõûɬGÈé@B—ê÷Õ‡îw5c±+åõ;JÇ–î­³E º±¥éPÊo­èbln­ ™H*‹t™>-¹:?Ø.jÆ¿UH4¾Ã¡ÜNuY|Oûðy‡~Ǖܑq2'˜Yûž¾£¿ÈXqпF)]²ucZÆLºÃ?V{[izà±’;¡U?~BïÂgÛ*ËGÂh6!€®XJÙ~DDïõ%°žDv\; Àø °ajPÕ–ãñ¬Ç·z’qöKsÝâ‹#¬XÐ8fÒÁãäVlxùµcä„8^S×hyÀI”Ó"Ííuùë(kMØ“sïÿuÃLXEî|m Tܯoº&rojò•Ô&'1Ñ×ÚuÆ—+-¡T´B·Œ#Œ¯hÿR¡y×1k+iùUèÝÀ ájŒŽž2uÃÅûÕsª }3í6à°9:áÜÜtôþ’ov¢38¤”T·ÃÁ_™Æ'GeŠ Ù™rÛI$ ÇÔû‘pË’MwM”[‡¢gJºã¾¶ùARUÙ±ØrڌȄûš˜\@•5WVw2}ˆ~äøäë½Ð0z#›€•—9ñŽI˜Ç÷–·—ï‘©;ǶŸ9( 3×}ò÷±éÌ$lswqò½9Úq]×=D3² ˆ‹@4°Þ~+¨Ð‡ANÃ;G¼€Iú.øŽQ‰g¥éi\n§Ó¯ÎÖgë"¨ëcd Ji§¥i74+n]55aOŒhKE€¶ â6ŠB™I’­ØpìÃüЩ´JHzCïü¡½¬‘L{8(ïýë$¡Ÿ—l®_¶àÑò EsÏe÷iOÅÝ"ÈV nœ!®l€wø:Ñø%•jXJ ‰ow$_Ýö=‹+Ì”Áa=ø…þpËÕk1yý>ÝDÛ;ו‘éƒ!m¥Äaf;Ýc[“&ÆÇ{m²¸a´ÃòÅfxn4eÖ‹]#`òpd\lgÝãŠÌP€cŒ,¡ÊÐ2ñ{¡v18Rå‚É}/ÊQý`˜Î¨æ^š¹}=K÷e5“ŒÁób-%CþüvtÅ(ÿ±¥Z¦·®;éáb#™Òö~~As¦” rŽš6Þcº¥ 鑨ˆf¶Üʤ&x>JßË#žm?Ë“.Ê+ÅÔÌÉ;ïÇ»þR SB˜þ„ÔÖõÐX:¢›ÔEvau öbïÅÿäßYSLhGj\Õª5±df„Q8¹ÈNuùj0QF5=·v\ºçž]¤&ï›ÉC9ÖP?¢8¢UÇ…î2RÙ|’SMzÔ:€ò'n7µÇЯ©×fô}pŠˆ}‚±©_<¦ôêò˜á*Nîc ••ËŒÜ:^<Ôtâkºƒ/àG­H¦Ùa—ÎW®í—‘Ê—ù—­Eö¬‹eµeñ—OÌ™_a -Û«I?¨dÿajÈ‚B7ö;¨C'`\Ùþûûz~v&žà²ÂøØÂýÏVÁ°ý £´¶äĶî {MÝs®5JQ·]_5¹$‰²ßù±Ð¤­ŸÙ´^-ÞÇl׿ù„¨ÏH€Ÿ(ðîPsK4%‹©¦j}Œ†™1·=÷fvO`qŸUõ×ÑÔ*ýž÷ Ä©#ëEáâ,´³d7â–‚D=܈P©–]Ñ VRyzïëÑ´›sO®»"°.G¾cg|dèo>Bž4 ˜  ÔïM¥ Ë̵èk]à½1*–…¹Ò·þ3ã×ç`J÷ضßÄ«ðjÜf0ŒÔ–ÈÄëó3Þ¢Ÿ/Pu'‘y×G{VË ¼aLgéâwÊéÎyÅÓêbý‡ÏXuuG6Öxj_/†Åµ‹c˼W —ŽýüÃ'ô­xZ­Ófõø `I­Ã6®a£¢A_æs6çӦ౎°BÕýÆ•ì†JceUñ|IíoG¶ézËW1éYopÚrj”IUÈ}TBgùô\ß¾¨ÚôNÒSñ®º3ÏŒ~4B#3G¿eZ<­N ´0K—|<@ æ¨-cìÀìÔr[*:öþ4ð¡Ä§3œ­7’ÔKyBI¦0Ä;ÇŸÅ4˜8Ìž ÃXßúk5È­vI¼ä<Ê_à}:»ñ¿\SïÊÿ®t/½ endstream endobj 120 0 obj << /Length1 1461 /Length2 6833 /Length3 0 /Length 7810 /Filter /FlateDecode >> stream xÚ·T”k6Œ””€t?,Ö¬ˆˆÇït@ÚâµÃ50Ââ|×ÑìèÀ­¡„Ï•`·G \D¹¹½¼¼¸ÀÎî\p7;IVÀ а´!î7Oˆ ðke@ì ù³# kuÿ+ ·ExÝ Àà j ¹ß¥xÀl nÀ]w@GIÐpÀþ«þàþÀÃÅóŸr²‚Â~'ƒ­­áÎ.`˜fØB €†‚*ÂÁ€a6¿€`'wø]>Ø u[Ý~¤µð݆ös·vƒº ܹܡN¿väþUæî˜åa6²pgg áŽõk>9¨ÄúîÜ}¸ÿ\®# îóûÛ²…Âll­aãá­ƒºz@”äþ`î\Xÿøì @ ƒøˆ+ñ¶¶çþÕ@×Çò;ÈóË}·C€Ÿ ܰ½[µ…Üý`ù¹ƒ=!ÂÍà÷ïÀ[X<<€ ÔXAì 0¬ªß¹!¶Ùw÷ïõL@wôã@¿>ÿy2»c˜ æäóü÷sk«©ËH°ÿYù?A¸7àÇ)Èpò €@H@øï2š`èŸ1þ•ª³…"M{wLOìù‡,ôÁ üw-uøq!Ë?<7 €¬ï¾xþŸÙþ;åÿ俪ü_yþ¿)x89ý޳üøÿÄÁÎP'Ÿ?ˆ;âz îD ¿“ì¡¿”«±z8ÿoT ¾ƒ4ÌÎé? uW€zCl4¡kû¿øò—_ï—Òœ 0ˆ&ÜúëÝpò€@ÿ»“—µãÝûÃýŽ”¿C;õüwKy˜5Üæ—Ìx°›Ø tÇ%^ÀçN6ïß4¸¹`pÄ] p·^` wÃúu§¿zrÛüòý1ynÈ¿L^€Ûö_¦À ýÇ之ºü˸ÿ˜¼w•½›ÿ5±µ‡›Ûp³ên¿íßo Äb55· s¨ kº¨”¦ôâ\ý‚¾°ÔoÔ%€`šÈõ³W½ŸþdÄUÆÒ¦Œ¬?Es²$bxÜŸ’mïbÐÛ´=3x>Y1$ß½,sÀ™×wyÜn¡¶SØ ¥D/?ÜOТ³4A5aN4¿ êà[/_+øÑâ¾n,² 8…gø´É”ˆXéì–mä#Z†%Äg#Sü87“T]%½¡È1иs™¦çä—>Ë&qiŸçæz3{ºSøŽòU:+Ë"ɉ|•i³û_~"'NÈTþàŽÄ$#p&[’È·?Ú‰”Ûÿ}d'ÀJ«óD++Å%åþGkCŠmýº¤=Õúç¢pV/ +®[ãžÀÖ=wì:idбÁŽásÌn{ÿQÏYD!Ÿ`*UÕ+œG¤r6Z…÷¶Jò¼EFƒäóN(~ÛXþ÷]D©xæ­ë.|Ÿ œR$šg^)ö=}ÎmåMRYÛ·ýú±ÅòãT_L»p’ù)³ùc4ΰսÙ&íòYºt`±ÜÔ}~eBÇÞÚÆºY\YÅx¶0E 7úcFÎðk0yý¶w2•b©v8²¢–uòV„á{ÆŠÝV^ô‡à|;èIÌÑóå¡¶5g“Vyþ‚w;¿5Á¦þÓÑ(´—=é$VFKöà^ˆž!FýºÓ¶mRs£õ¬*mŸˆê®.êb¨e1†õ.¤ÅÅ>å€ÊTVõS¯ƒÆÔÏ.Öµ/ö>÷ÝBسš\óæ8?ÊCq×*Å?¾OéßwR—Ne¿tПdÛ¯n·lÖ —ô—³Þ1"ÙÚö|ðùÙ2'{‹×÷©é jânÚ€Å`-˜ÚáebâN¼‡H“Ra-RcèÛQÊÅ5Ž»oÙÞØ‹òë8:Õºdñc¶]aRÂBŽc†Pz~žQ`ÚÔŸ5¦rHÃëñõ’:mz½ Øïš=aD&Ï¢ê&†ß2¦‹¥¸ðjI¨„¹ Õ8䨒OKÉeÞg«ô}Ñ©;qNß “ÄK,H]¥,PuPÚ>3³-ëxØoi^œ,ªU4J™Æ´‹/y¢®FGŠü¬zÄ4û‰‘~*ÇÉë\ap(ÕS'Ð,–êàñð×~(™o"…í MÜ”«TýÝû<U™‚‘qÎ(^­4åœYÕ’d«éë,zÃ̯ȂðíqõdwÄ9£çKw5¤ÚË÷›*ˆÚè.r·óðë)s+q—-y[ž¤û‹[Q.©ílo¶UTÕÚwœ5¦]×ßl‰:—3+¢SÓš^Ì€–M¯Û_ÉL>ÖÃZ$_¤—U†ú õ§c’ þ’öbǤøD±õ1s·j=9§xû¾‚† “ ÊA!í¢›¥‘F´Dhóû7£‹?K#lÏO9tŠkQÛnEzO^ÁÉÛçTt>$¾‰®u)Ä¡å>ÖÐx%*UX˶mª…›¦ÿ!8†Û3²ß¯1k×ÓäŒ%žhSøRd£ÇMK¾˜dôým‘äô¦´¼öÍ»<´O.Âçß- 9*÷mY“âî¿Ò!^ÎE28Hò¶Z:É¢ˆ(ƒ‹Ö5é­£(¯æ f›Ý›þ«Jf,KHCÅH¶×®c¡ë„ƒ¬‘Ô óÚ5(E×3Cé$6´9÷lVrGk‘G EÓÁI9b¹*®Ô‰©'"v{?Ê1$¥º¾%‡ "ÌíNß ñz§¹=Z†ñŠ °|Ø´xiæÅ¥\—{⎙ü˜ÒÆ|9KQ7µmN·šKCÓ±iȶ­úfªSÓÞÔÁȇÌfÚD$5ÃÉR³mZ+FÈßÕÈô+;¦Opü(4¡_B–æ#ºX„í^]œf½L퟿ó¡A7º§óó|K”›­P&õç%‰tBÞ AÛ¹ÚIÒä~ǵÌ^t¡ž¯–$Ý^0#ˆ$Â|–ëh 81&p ¯ãWdF_Ú@ù6™ÂxX5а‹xT.F¼ŒkúrƒÀãF?Týz”þæ&\#%᡺OÅç#þ 2ÁŽHjÂûÐ2Ôƒ­îOÎ &…¿LxCìÖ'£ÿòÌÙÒMòÍ©0¥¾ÎÀÓca?¡GïPôw8r1ÍÏ/<ƒó܆¨âwò„ãöÈL|âÜu4ëo÷å+™8³iï-n„¦-ؘRßû¾Û!e‹¶¿ïNi,gôöAÍ7éÊÍ~†îªÏ{“1ãÚæ?lËœïX-Ô7>õ.j0;ÈÇ·Úâ©gn¡§šæO à(Ó;ZÔ©ÛžPî:ei3{JîQå‡TêVaòÍœ‡]šå+>7ë¢6¬ÛpØjRUòxU˧ ÿ’½ÂLÙX¾¸s@xH¿n´AÑǃ„îØnXˆ½{Å,[X&xâë]}vLàâ3¬0gs+”k×gßï‹Å4ûmMõÝÑë0úÇ×]÷Ø8Uð»]ì⥾©ˆÆe|ÈÅ—Ì+|ÃbòI<ó0ŒhÔ´f&&Û|ƒ‹œoô+3wJ±û€‹ªè‰EWnèdK²Z!=E:(/Ý9îÛ$o~߸ƒe‘Cû8pW½SÅøn  Ö'Hõ-‰Ï(µÂ“ê™ØuWCÆ9};é‹8ƒ&ÃÚÈ#Å’¥oyã’,;V缤ÌÈ]i5¥ë»µbBÊ Xùba§çîÓoHÌZyºZ O®Rg©k½QŒÛ°/ nzYÉt ÏàØ,3çuÒñùÉåêëJnß,:Âî:Ìì]3Òþ2 WÀ?ÿ¸lˆû–8è£m¤Ñ¦«Ã |Y€–eE·Œ‘¿?|¯•òÓ86„MHâ3ÒG5â€âÊ2õ¡DÁÃüG‡Ð[Ô–Ñ™ÆE2½% „¨<쌪Qˆ]ÃÑÒÛOjøê«Ö«|¥é,ËL‡:R’Íœj߇Ç%As•ÈDõ²Oo6ö4¡ g43 ³9â:ìÉ+-WP­®($Äÿµ7se©éeû×¶·­ ˆ§3u7²àü¬ê øC÷ž€ŒayüýŽÆk?·ç÷X”ô¡töé¢ãY#íæìBê'ˆ¹¥G81Á—!´QîÄF'd8=%_ü•ƒŠqk£>ØË6ß#ªÕ=ÁFÈe…êJý˜’§µ7³oX@o[½Z£ŽWà3º{/Ìí´Ÿ>®é“mö®Ñbèc‹œ{&ÓÎs†;ƒ´r‹,¤×\~±!ýÝé ²ÑÊaÁ†ŸiU*H»ûÄ> FâÒI!ÂrHYæ|·z(‚R–Ì{tþ­×‹OëáÛñ%…Yqr‡:Õ(Šr:Ó­ì¬É ºTFÚüð‡Ø!(Kø¿\O!Ö·|ðû¯æMuº|âëqv†0+ÖXºÙ1meéÏ-²Viã`û¦I8:*yq F}òÞv"7@)|ÛX,þAà^ [Dt‡mˆ÷ÃÂñ·bVIDƒÿàÆ~7Ï‘;D"¿(ËK—+%%‰_½i±-Ü‚J¿P¨æ¤ØE ¦öט´\\ _4a7³B[õÿ*Ù¶¿«hUºM÷¯ËTJŸãO/ÜX ã1I(w—S5+¤M¼å[iíøN5s0l¢» Ò)dCUdáØõ‰È†Æ”+9•#@L=UŒÆ—ÕÇ‹¦}I‘4ú€«î ìþÝëRÞ[@* 4þê96ø ¹¸Ï HÍLIÔ.‹ãÁ4x«æá÷ÒÕŽ,Ì òÍk“ª.gŸý%K‡ç%ˆõ¸ør‡§Mÿ ùõ̰Ò$G"èÍÃë .«Â«lß]/‚F4ðÖõö<Ò‘ì¾Ûx²Y‚ÈÎfÀ–jä^.Š%ð‘ÿ,»{4'éÐ… ×¹ûy 7—ôRr&àtA®qè§(J¤ÞjïɬµH¡_¡B~¢©¶!¡%@lƒÁY1ìåÙJ{)µŽ#@±¨g`'¶ßúlèèšcÆdž«c¬Qr;¥4Ó.K‰ãÕs…ÜlúÁ¼[1c¤…±UÙFoñ3%ÑI"Ï[ µä¤Úç@[·cÙãí Û§,e›;F]Û‡¨ßìœJå‘ÙÊ9Þÿ|}Ò… ÒŠÁ” Ìi)?å:Ì»}Òž´‘€ÛÆÏˆLMgëG”®yQ[46k¦¯ýÄöÑ{.ƒjX‚2mFC O ÊõU@íë35¡ÙÆ„€²Ç0sˆ3 iªž?Ã6deÑ}ï"‚ù 5zRÒ\-Ìó2y|ùó:,ø­^­¬@2+vζID™ldG3~Œå%ç àf¾EýH¿…KzzoÖcK¹‡@üv¨§å,A†DÇ;…‘êŠÂV(P»„ÉÜ+ba:zaº1œ/˜4R~®ŒWПÈóäuž¤öpâ•?ÿX ü™5ÁÅõÃ0¯‹ÀME7lå¬ÈÔ«®Eb QÞål“L·À¾ ×'Ë$=߬((™‰dÔå]û íEºäÙÒëXkX¢ÏÝ9hk_âÎTL—ÒÊ)`é)ì%ålœçݬ­M^³?°5/ u­ áÞΈåzT/ø‚.x…t€ºéÓgâ5²Õ„d–BN÷Q.¨mD®4ÑûÙê}°‰Ã'{…£dP_Zʘˆáô²t4ãÏ“juÆâüFºÚ2¡˜{ÌǘkœZ¬c×3‹ “%<àâ™W ’rnÅ< kÎÊ‘jôÇH ÷!ÏY®†åº97x¾’‚Z©w¶«uÎÖÇî¿ùI=¦È¬ª,¦‚eD’ΛE7!øp¬l3Ø*ÓkºòuEvQ†.<Íì£ø!êƒß²œ]5NÍžt‡£X†ƒ µ,,«ž-<jQš0¡ª=²„*¼4_£@Ø›%%ǽ²Uµ}W@PkÚ»V~&§·öõàä)GÙÉ rÛ‡¢Ÿ42|•îdxòÈç/ÎPø=ê!C*øJóqÅsÙ7ªú‡> §š_ù,Ð~x²JÏvï¿­ BŠ#¥qØsï¤ïk`,ËÀ¥zñŠÐc0˜ñÓ!†u¿¡ÊuÜ8µÇêÃ1Œ®ÁBáG •ož½‹HP7ï]É3’§}—4à;­‚Š—Š~Ð(©×*â,\›ÐÉÈ8+‰ŸÔ£.µ×\}©îÐSœ<}MÙ'ëhû¢€Ù‚ €óÅ#/¾Ñ ÐÅ@v1ÃĦýb€.7‡^g]¥]Œ >“ÞØI|ÄWãlé{^´ "àSÔ¹ÿ!gõª¶â+<¶·|Mà-jRgIeG°£ÍK4£ªÕ¦¾ûÆÝØ“OLÇå¤/rR‚©…!­CË&Óõº ³…—¢j2woÞPYœÀš¨Ì¤5ÉH¦kÍÿ¥Z›Nq‘ÔÇd¸.j\§DðÇ´ylþ¡å–lÀ'}µ]ì@1z¶#_å”(¦0ÓÓ£‹×ùz»ªÂûsÛ¬×ò¹QÚš2;9hkßNîþa›¥S%NÙ9yûvJ?¯š²ÚY¢¨-Ù’?É„d¼A¢6õÐ5ðNâøGƒ§lC Ìš ¾13UÝjÝ?¦Þ'Œ£Ol•Þß"íycæfË!)ËíO»ù„6£„Ãk^.GÖ5Nrâë>>Ùw–Œ°”ƒÔ÷m? ÚáQ ü%dLg³hCNO“Ì‹ˆ^Ž1?e¥Ö!”ÒØ4Ñ®sNâCÚ³*f(R¼V‰@ÕÌ^L¤žä5¤°¿zPéÞº—dÕ^” 6ýS³Üg¯_‚£Ÿ~AŽ9Ùþ½‘v¹~½´ö8îˆáîɨß5FñË ™ÔHÎÖïË=WØ_"ŒÃÚtÍL­ÜdW/––†½ù·%Ïœaל¤ÒOÉý|Fù£W٩ٽøu¨ÏGu©T€´SÅÛ ÃnM‚ÄNg ì=šEêcî y~Dö¦ï:óV¼ÆòkìÏ¿>, h ì(½î¶x´}ШskV!ôȸ}trãʼ_‰ ÷ÉŒ@ü 3ÊѱžÿøÙƒ=5¢ _uÚÑËoݰ ¡'‘˜tE±>TëQM’ÍïF²kyA´ 02 O•"Ý—8£Ç¨!¨f~K»2ÑJ q:5ÉY ßO+ìdi¿ 73ÅKáÊ£ˆNéã;(,ä\YÕÛ܆w”¦o6Özªö©Üýӗܹ,ÞˆšÉ.¹æÛm(+ý<Q›ñí@dDìS‹§Ä•¦W>ïäy0!ÇOV^ÎÌÉÚ@?¾Œ ÁV<Ékþ¡¨hÉVÉ‘p<Çä­lÁŸWŸ¢‡ 5·<½òcÌ¥#Ôy¨seÃð š^ù)€ c†O™8$&¥ýréo?å߸íß7’ÿ‰Ñ¸µ]º_W[½^l¬é€î#‡Ã…©º?ÍKht€’/3¯÷øH@³ö_‰n€¶9½¥Æ"WÒÕ¸7Ëe€À~Šÿ•ý£µÄǵɮ͉íL7Ssµ©¤fض;j{6á7dê9ïËŽ¶]ßûÖ8¡¿v•òxÇJø,MÇçf‰Úžuö]‘D溢PjUtìq‹×w%]‡­…¡yí#ö}þóFª Z®yônÝ×ÊÍQ2O¶'U΄ôùž9Ï'ÀÑõñ†(¸S¹{K,¼SCùÔ3ʦ}­½M%s½ÿ²ÚŠÑŒ\Lk«i`+LÿY3aŽÙûð>GrO¿:ºe9ò€Rg­/Ouù0ϞʬŠ9Yγþ诵»ö“{EÒ  šÝ¦ ºÚ=e}kù Ôž&¢P¶½ïäÉ^¹Å{¶"nê(ô“ú~B¬hÑù&Ò“ÜAëeJ /¡Ý31[#[kGeÅ5[«st.¥Xû2©OÒ/ÐÌómê;26½îÓ]òÕïǪ!î«ÅœXÕ87> XÑ’X?î~ŠÞ?Ú–ë@ƒYý°”V@âSÓûFŸ†D™D=ªÔî`ëôΗ8)ï U‘NJ¾:(en¸ú©â=*ť׬¯Z?Žþ¹lÃÏÃ53í—yyRO»½Ô‚e˜Þ\mO0¿p9ÿÕ¢×*ü£Ív®1ŸQ°oþrJnáyêLƒš|—ÓÈìöƒÂ–‘:¾U ÑdSùfy4b‘c6ö*Å®æÚi.fïñ"΄1Ý™¶ï^]±¡-uÛ4ƒó° ÆÇ®#Ï&òœöÓéM…of ë¥ûq®‘C!Þ5— »AøiˆViÜûMèdE•°b¯¨ð­ÀF½-rœrâtaoÿét²Ñ¨½Á'c0¿i-€KÈE†oÀ¯Ìž5B%u*Œ¯dÞ\#œbë È5 ys…òœøi¥ Ð¹¤¥Œ° ­¤‘þ„w\óáÛ8ýµEG /<¢ù-Â=>Ÿ¦F=tõì•m1–(!ÁOY™=ÁÚvY8ö¡Ò&9OØ‘i"˜Ù?'«f+=ù.˜ÓLúÙ;íÛ ªÅ:&aÄ—û¶Pn»r!e¦ùÁÃê|ÙèÃZbg} Ÿû!V‚¡UkÖÿDC"ÔU åéC¡ +]—N§ß–®}ãÈÁ©‹›¼ÄXÄšFX®›/‰fxTc=‘ªÕ«A‰ÛM^#ëÆ‰ÍQ¹Ð–Xfšïü*7_N÷òâÞ8w=ñx„ƒƦþIïÛ—G d¢DlWñÆãO5‡‹§Ó:!‰G6Õ^íj­ ¹N(]ŠLÝÒçÏÑóÛ”æüyâ*êNÐW¢×>¯‰ÈãXù?¶-$  endstream endobj 122 0 obj << /Length1 1475 /Length2 6779 /Length3 0 /Length 7768 /Filter /FlateDecode >> stream xÚtT”k×¶ˆ”€ÒåÒÌÐ%ÝÝ-0 ŒÀ 1t"J# !Ý) ‚twKwƒ ”ćžsÞsÎûÿk}ßzÖzžçÚûÚûÞû¾¯}3Шk±KX Ì¡²8’ÄH©hiø@ 7È…ÅÀ  CÚBÿ²c1èB`¸Ð?RŽP0òÎ& FÞUp€¢³-Ä ñ ø…€@(øá(»À,*Eê„Å …°ww„YY#ïÖùëÀa€ùÙ~‡$ì Ž0P#­¡vw+BÀ¶-Eºÿ+“ˆ5i/ÄÉéêêʶsâ@8Z‰2³\aHk€&Ô êèµüj  ¶ƒþÙ@Ûæô‡C a‰t;Bw[ wº q†[@w«´”jöPødå?l€?7âý'ÝŸÑ¿Á࿃ÁÂÎ w‡Á­–0[(@MV™é†d€á¿ˆ`['Ä]<Ø ³›ß~—ÈJhÀwþÙŸÄftâp‚Ùþê‘óWš»m–[H!ìì p¤Ö¯ú¤aŽPÈݾ»sþy¸6p„+Üó/d ƒ[XþjÃÂÙžSsp†*Hÿɹ3aým³‚"¼@ PÈ €: nkÎ_ h»ÛC;A¿Ìw=x{Ú#ì–wm@½a–л–§Ø @::C½=ÿéø7Â0`µ‚Á±þÎ~g†ZþïÎßæ0ÞÉþzþó÷âNa¸­ûßôßGÌ)­£/¥§ÇúgËÿqJJ"Üžì¼v.^ @[À¼ÿF û³ àß¡ pK@ðjï¶é¯Š]þ”ÓŸóÁ øw.UÄp¡¦¿un äBî^ ÿ³Ú‡üÿDþ+Ëÿªóÿ®HÖÙÖö·ŸéÂÿãÛÁlÝÿdÜ ×y7*ˆ»Q€ÿ7UúÇäª@-`ÎvÿíU@‚ï†AneûŸ„9ÉÂÜ ê0$Äú½üa×ù5i¶08Táûu·ØA@àùîÆ bsw8݉ò· z7=ÿ^RAXü3.^>ØÑ쎼Ó//Àt7P·ß2prÀÈ»À]{ÞK„#Ö¯3äp‚™~#ÐÈ8¡ÿ€‚N»¿át9ÿ€\Nû@^§Ó? €ù7事uÿ ÿU?ÄÙÑñnŒk쮹¿ðï; uƒB°¦'á7/ËßÔŸ—JP¸²¯èfÜ’ä·+ŸŠ¼'Ó±*yÀžÞsqÜb¥¶@[ ñÇ­ìGjPᙡ=‹Ö›¸ àoåÞ,ÞȺntÚ4ÜØrNñib)a);÷C hè—‘½Æøáâµt†®ï‡ÀÂÏ$ëCÉ.ÜWÂ?öÎÏw'uvÄqe(µ•ð½}BFè¡H“ÒÕEF™¤XítQ’÷TªÀ ‡ÞØjÞóäóÄ=?aÔ®dñ-b³QY¡ôQ¼ -Ÿ³wöNu¥ É]€o…eéD#&T"zÊ׃^­ç‰Z¼¡r/ â Ã{3´£äwip3[w?WÊ»yæé?‡Zµ¸`÷FÔ^¥Ì¼y»æõaødoéÙýÌ ºÛüV,/M³“åÒ j?M³m©hR©žñ…FBWë¹Î>öƒTaÑ>îÞå“`é–«Õâ#KãqÉUã¯^¥X;¨÷^JêPVŽ‘'@yéK|e‡4Œ'  ‰3Ö]X{ט©!eú@rˆ“8d­³‘ö+›ûœRôÍóÀò’à“Ì`„;¥I–ù‰Ô`À7Å×M)”îÞ{¤L=òó±‹õÙOtN'̉)‡¾ìã>Í—Ó:$ÈÀûGöó J#:±Cò'|{¹½º]©[^YØT§²3­âÌ—…^͈°7Òí¾—ïFÍbŸ‰Hø‰>&€;Í›HGŽS´Ö·¹Lºƒ‘šOð|1¯;rtS¤Äâl±Š‚ÉŽï2Q?gâšN+:ר¼y­h¯ýøP´#c‘ï9ÿæ2j´yy§Xvͺý³u1šs‡Lt²1­E÷Ú!´çB„ʸ)¥¶o\u_K¿°EÊ”á8zî¡a¬XøpÊ+Mø©³7x$0µã›h_¯}½¡ÕÄ´>â6&ë)òWfÜ^aÀðŸhùC;⋈œ³áýjÚ'er¦ö§%ÛÌ¢ ¬þоË{OŸP/M¬.]Íæ2°Ðd&,_ú4Ž´$1<.¶^ÊÍÑ[è,¼ÔZÔ®BÏ «ž‰M‰š&í®LÃײ'|Iè0hw‹ ©¯»)ylÄΉ¥¥9'ÐÃÌ—¢Í¼šóÍ»êy Ù¾ÖqpCª¡÷7“¾…ž9u9o¬™§-Ä/Ž˜©¼%+Ø-õì;ãj˜Ù‹˜Çd°å_ NްçwW0xà†œgY"^H(°âZJƽc’}>Õ*1´y#7¿Dãê»0¶011¢ÀxuKOâÒéñ’»ß< ®¸Íÿ€»^¼åü©},‘¶•a”ó…ý57G†©Žèý žJO ìB+vñ¨Æz;•YC@¯ïíÏ ÷”O§°ì³l%¦“çx™…>íöËxhÅÆtó³ÿ;á:í£9¡[j=ë¤P Á L¥ K¥Ìª\ÇImbÙ{BËi<ï“‹Ä˲ÉNœýoAWžŸ¨ÃíwÁ:ªO¨7…w¡#Óéû5ù 4Ûúš«ŽóªNÏZ¹Ê‰³RWek·‚è™ßŒížqÔ¶;»ŒVMX:¬~Ÿöpp KÅ›ÎܰWŽŽç†õ±¿µôm‘´¶š-ÿŸøüé[ü•l‘øZöϦ]0¨HÞâû/?—‡öšgr×|>¨ÆyÏ¢f؇OöqxЄaPu€"PÕöÈ©vHdjUhÓÉÃiøvv0 rÙ>=×­èÕ•ZØðÀ£ïë«´9¬ ½K€¹ýWG„*â= îF7AO5¾Jm QªE¼Oòsv.K>·û‡ÛD0ýk„„Ò!8ûçóƒ(ƒgD¥³PŽ $<÷ô[9 3@† ô5ã²²”+ÎF¼~d»Ä«ÏÊAžCZ­¾? ;ÐjjëX äs(ûÍ=ɧ3÷ Ü·/hŽ‚ŽS?´,r§0§%QGƒ¹õ m#uá/©œtS™«Ù…†Ìé°Ô†UWÖÓB’Iìw滬&iÒüËÌðó4ý Bòuô >=¡^Íœ”/+Øñ€øUE{ 3@ÄFbŸnvØi0b©vŠ÷‘¶X•œ“ Ó½ßy§í­»ês³kˆ_²T#7àÀÕÝ„/ˆ}`‘P>µÉ.jÎ[*Î(ÚºÁ#ÄÕoC§Ü=Ò2À»5 &ÆPâ=×F¶†¸¨úzrw+¨§!M+émâ¸Á­IžÖ>7Á&5|nL¶’ò(圢‚<5 yäehŸå þC¾d©­/Yüë“no…ÌBO a àúy´?×…æþ8êןÓDó<Ôb'eOæê¾mù òÆTȾ^û½R¥4fåÊR²t¦.8ùKÄã :6Rxa…nø¾_ÄG,~\å;.pìœÐ.Kœ‚P™>?öÛ½ ¨9Üy˜š\G$T€Mg‹UUß_Ø  ÌH[K ×ßF_ÇÐ['ÞÖt(­ÙD+êö+bü‘ir™ýšÍ@©ÝÉÚ5ú6Ò®n–ûv«ùÂ7ßr‡¢xËšS±ˆnL¿µèš¶7ÛÞ!×H~i-óæ% OçÏÝÁyaü{ÒW?ñ¥Lq¥ËWèè°fŒxéÛ9|<š‚,-L*¶ÂmÞngέ~NjÊT’mׯ¡[ze¶Iâ$Y)hr"× Â…[oüÅ´†$IJÛÿÇcñ¹ÙfG»˜)–ô,.A…_CÚ¢9-ü€Xˆ;2«v"QxÙq­%E~<¦ú*¨\¼"³üú°g4U¤ô5Ïé†[C×@Ãðwù§ë©‘¦·ìdž7$ƒ‘–¡h´@0!¿ÿÿžÄëϤ²Fü7´‹¤ÂF¼©êŸîX<I÷¢5=øÑ¤7ú¢;~½ÖÔÂh·ÀVmþ Äy'½ñF5ÓEX$:‡^(~¯DÕ}ƒ{ \qÔBž-Ítº«:è³”÷…รáS¬ÇÖÔd¤•%´Žöù{¾r ¯Ó2Gh_+ºZ®=XÖ Âú¾¦Ø´º>K5-¾çƒI¶_ž‹¹Já°Å‘¶ OŽûÜô½]?X¦:Íc´€4èS<…³­‡ïÓyL“ÉîºS3Í:i“[í—V¢œyÏ´‰„i}¶ñòdöšÎ…µ5·R6éŒ/ fã^`eâ´%áYâ”9fÜW‹rQ“gó—åh¼©ûò"ÅÛs)<°Wàhy·ãÀÄÇ«c3VzÞÁÇùÄšðÙm#>î2`ˆ,G²ç’lÞœ…R‹Ïñ;9—´o m:sùëRæwçúŒîGâTÌ vTŸ‚„³·6±¸ÛÛ]ãWt *: ´Q9i•W^âd³ØÛÎÆ‰Ò´: ênežF‹çá1®Wâ±csM&;ô³4 Õw5È@=?qL³§B è:ë‹p£lYÆÅ ˜VLˆ™ûÊ8¶OKÊ5ÖtYÎUmß|Èñà§¼±Ú#¨'ô'¬Ãº(f`Üé¹:¸BñZ‘dÿ‘À}³’¿Šáõh½fiä|× *¢ e~ÍBû¡Ë–ýâîåaÓ:æ {“m9J8G[ýÐ½ëžÆX¼¯Ð„Aã×äÙu*¥”hj?Ø`9õÏQH·%UÑ÷ ¼J^鼟‚ê6Š àÅÎNo»›ü<+úQú`TãõÖ1“+^Šù…¢²ÊµŽ2ŒCí§j`ØñºÄ ™ÈŽ{a1c‘–TG^°¯×nÌ.rV§¬/Ú´vè9îÈÞIº:¼’=™v6ft½YÀ‚´¯hÐ@Âgê0æ|ü<µvÛý¥¾šè9‘gI7ÕÔ—¬›××aï"ÝλX«I—4KüÎ/©i¾5“eN(®ë#:£ÂŒ½ÈMÔ¨KXW¦,âDZ·n·f)ŽSåð©5–6¬…=~eô½M¼"MäåÁ [@`¼µ¶rD“ÉG­r4Ø`à\Ml$=Í0Ígղ̿}JÖä ¶jw^ÖçØ”µ³ÀΖ g>þê-_zåƒDPÔ8&ΑuÕ VwmÉ´eÖ“’AJÇÌpAöE–%vHLŠè¨Ë€!õš®?ï#Mgsœ$= T'þ—}RatR‹쟛£íZ%ÑñU?™éÜô+•غj˜Oò¯KÝå_1?Zd|õNRq»/'¿Ê|JÛ’êsoÛä:"EšæÌ%ŽÉî‹ÌA GÕÁóû“†ô'2ŸÒxMnO,;Äpa¾]Iô¤ƒô(|Ø­ë~¥ÒbµË•MÝõXFú>|{œÎl–ßË–·m—úLz…–œS™GLÈ-¢‡ö9´-©ò|ÕȉÐÁ5 É÷Õ÷š¶‡u…Ò§sàGÌI“cÁ„ÊÖMòüÔ.]ÊOèéhÒH*­óݲ牳éª%Þb5¹dâܽèG IŽ›ð2f ÖÜ-•ÿ6ÈAúY5+HëùÏ3j5RF'v ²€ñƒf`%¤×Ú™l|äf#n8È77n4=ag†Ö›3ÆÞH­yŠl¼8Åg•HUè3a‡|¢9uAU;½/Ÿ,>Æéµ[±£À/3š™m“3OÍËr[lââú3µßA‰ñy>Dz’Ó7ú¡GWê1ÎÄë6ŸJ]¡ùoùÐiV”UÒ…§?Ää‹YB¡ ŸÎ !RÛû¹Iå ˜“~A`¸Ì˜{¿ËýÉKpRìGþ ×È7ó‰ÁÍ—UéëƒöCÙXÑxʼ‘. ¿3=PÛ#,ê8O‚}¬O-²B!›Ã»È¢r/éb =ãXPM&ÃÝi-º;ŽßIZåœEó‚žÆö†ñÏ«+^¡³•ªW½OeÃfg{@òÊ»$¬Qsûùx¹=ôÍ·› &ÓNr›JÍ™v#6£¢‹éú=¼ÅåGûýxM³½Ö܆r–ƒÙè§Þ\ãï#îgÊ\^êª+QßÚ$H‹Ÿ3k‡¨¢óR“¯ÚŽý­´W´?óscìpøvÛîÿDäö*ö]ÿPÙ[TÓ1n°ž™%Ë0íWð^šYЋà+yÍ„×ÇÎÂÄÜ<Ùdx";1Ã;¡°Ì8ñÒæ}ŸRÙ¡B@Ð;™ûiï Q¶ßßhMª=wú¾£Ù¤Í=&ƒLo.a=ÎÇm”È™ôO~÷v8¥£Å²‹Éˆ ™ßfF5”‹Ù‚<Šë$/¸3ŠüxIP¸²}¨ÆDÓ6wÈcëºÜšÍÿÊçÙúÂèÕ~{×pÁóàTŸpo/ª¤Âôà%7!” !õà YË ùá€AÑ1š„7V/2¾[ûôrëš÷×îåT¿~Ä¢)ë:#¯°)’M…ÁUàpà†¡Ð ZeQHw6¾hsB¯aCžŸR<`‡iÇ<”’( _’æEÉ»¯åµúüݰê eÜkð玈v²ú vŸ2ž,¹Ôé {­*w-ܶbHFñÚaߤ»“l54/RT&±)ÌÀÀ by›ðêâôéü£¬b<°Â¤Õ·7c±AŽÌs·É¨õgßìÔÖSV L*¶_}ÙfݲÂÎU§#oy§Õ"À­G`9ž«fï• H²2[ÀpǾ ˆÎè«ÍÌIðrœED'>”ñÑk‘óÛMcZK°¬É$ö¿W·‚IÓ_ð_Ù–ß¹‚K~UVÍòmè£uO¦—ê ¹!ÏZ‰¯/ ‹ÖªižêÍB¹Ùù¢ü II¸ ›ˆÓðG¡W7±Õ²øßóVô1Rm1Ë<€ä&>J¬]d©"}ÂM¼DÜ©¿EmõÊú^ùòè¥á»@–´ò°yáª#ʽ›@h!é Ô%ûÛ`eš¼Ô2]h&M(ѳàiè@ôH ŠW|YTÎQÄËýAbùeÆûÄy6¾¨²´4u?Œ°oÈÄÃ%xeŽV—®"T½Ýn2€­%ùtêÀø‘yÌùÓÊ´†Ù¾>þ1Væ&ñVÍu?Âöë[ßfHnWbYɵBúú•xÌ4µ+h27pö9.6‹¡iªrS-:¥²ÒW‹GÙg˜’.§X×–––—böNmUÝ)ý FêðŽƒ§ÕDm’ª'i4ãz Ð•û`Änïw½{¼,%cŸÎÎk)6¯z[Ò«‹c´à€×LX™ÙU@[ÝZU¼ÂQÑEÏŽCþÛ¯5I ´-1Ë( G-ÛNÁ؆¤xðRþã(ÇÓóKmµ) ™›Ž±ý¦\ÁaŸ´ü7uýªßßEKvÙ¿'Vj;gª¡4õo>¦ïP̈±Fxn[&ÅMZN5Rªü¸.ye¨Ç×z+:Ù>%ýžƒ„äSBj¯ #‚âå‰þǽ‹G¾¹¥–tèÂ&¹Ý5VAè³ù ±™áûùÊ—››—WýÛ Æå’/¢ÀÉgØZ¢Þï´-»y •å1éV—DcA¾{°í„°9Vaq*1qfäx¨¦‚"ÚŸ%àÉ¡ª©}Ê#Ý_òßðv|T¯‚[x¨ ñV0qÛì½qÒU¾Fnùñ¡ñkm^ÂKºÑ¦ZÖf¾]íEQ*ÝS qHa0¨É—ÉþмÄhà3¨ŸoUu{­ÐÍâ:ücÃëÆ½ÆF De:À b ¿:„…®jˆÍí”ÝVœìv˜ÌÀ¾ŒϬgԤυ'’ŒÏ©ÒÄÍÅT÷ÖUòéxR±‡~Îy-Dq!ùzŸ?+X>^¨ZæÖÀ¾±˜RZ.œûÍwx†9Üö1H–¼Ïýk„Û.`0$³Ÿ$é ¹@Áü‰† EL¤t¹2ÛÂÅÖÝ èÇR ,'hO³ï¤¯µ¥0’†õ}J°DÏ\[s—4ç=±ïD?çÄúþ’3âûþkuþ†áptå~ÇhCïÀ{?·`T¨”0 '`§­Y¥n)ïñ{i|TË<¢Í ¦=ý$ÿ•Š{¾÷¨=m§]Gä=&ª»°‰ÑÑ<"1PUaÛ·4°ÆŒE™víÞy¼f¼Ôµq3AûC Æqm‰n×õ#‚|võ0 !8š]NÌÚaÓ{Œ·£h&S?Êi¤§ ‡ Gýžˆéæw_„ªœ oŸ aι‹QQ¦š÷¹©úù-v…Ë–[玈vU ôOQ15.Ðä$ŽÎ]})·e1äÝg4m¸W•J÷ã ø#¹3ÅÏ“zátT¢çj$3l¬µ&! þÌɆ̓y©¾ÑœY<^ßKÕziiðÃÄ¥WÜBÙßA¶¢Êv£D¢VçQ¸Å·Qv?LrºóÀé‚Öw}–3ôÉ‹%gµ#Þ”¡M옕RjƒöÇѾb²ŒG®¢Ójè*~59áÞ©LÓ´D÷¤RŒ+ÿÔzòÆéMã(¹`ÄŒFâ|ŠN³óݦ<š(!ª”‡Ìàõ¹l†© Wj—È™½Ð¾²«uš{â6KàU¦¢™ð£kÊÊéðMUXúøz¹úÖÚ´S8ë9”öŸÅ§cÐÓ˜C0•ÉÈý=×F2åx?KÐ}o¯I«bõ7Bn‡rÆ?te>פR·ÈÚØÙ«¯l–CΘ&¢ˆgò¤,N»¦Ñåñ¬–xÎ8nKU÷6ê3ì–ð€_ŒÙ$­œæw:æÁ‰&8½lüÏöj#„KdŽM·P:”yÕRó¦þÔÍ,˜‰øRLv,š1¬Ë]»ÜÉ_xÒڅƪ–·jÔßòñ}÷—,nƃ‡ßS›íœÞþæiAÏ$…v‡i‡@C}JxýË VùdÚÚ:Šš4l>Õý îãaÓ+·U‘úrÌ"Ò<žÓÛ? ³mГâ†Å²å§g?æ}Äòn»Ô¢Ù0˜>¤a­Œv~1¥¾Vtìœ$©8íN3²5¯Ò5µ½¼ ¢©â¦Y&z¦T # àŽlÒW>ÔÂÁKû&¥Ød›éձ頌+¯U®L7L¸yšƒÕ8y›Bˆ9*s%Ö^N–ÓkTLÃû>i «ó^lÌqûóøkcÀH/¾È·ÎO÷î1Dé-âÙŽ=:Ã×ö…÷ÎÓa¸ðÅŒúnø®-xô‘­Y!býSƒ,¤tXÍ>HÈG)nž˜`´'.¾šÉ­µ ÊAÅ@‚†¢GÚE”Á¨qNÎÀéòŠ,n„–”xw¼ªŽ«¼±Žë\°çPMŒŸ±€¸©çÁ·!.”²OÓ¶u{‘†‘J ìMË'+|µ§Þc†&x|rsBÖÜtV‡º­#/ÍV(IaI¨ôs†1ÂçÉûx?¦žš”5x»¯5V¤½ä,Þ깑ѱÅò·â­£ÔÇ–•’ã§Á}”«in-ß&Aé gÊÄ”–ÄÍn†!]5h)?± ô6„ž2(ïU{Yô0%ÙP³ ýSÍ»±Cé¤-ÃÞz=ÅÓo;…¼Y,•.*6\°zúE%Å Íj¢hÀÊ%*ç=\e3ŸgäDçq¬™ÄÀ"[ê• LŸµ7ѦÜÝ’¸ÃÀŸÎux¯ô­ÿ‘. endstream endobj 124 0 obj << /Length1 1419 /Length2 6143 /Length3 0 /Length 7109 /Filter /FlateDecode >> stream xÚxT“ÛÒ6ÒAzï¤÷€ôÞAzoR“ ¤WéM:‚tP@Št¤KoÒ¤(A¿èñÜ{Ïýÿµ¾oe­äÝ3ÏÌžÙó<;Yá`50P#!ê8J((, PÑ5¶ „…E……E98L (äo;!‡Ä EÀ¥ÿ¡â q@¡mª(4PÜ÷‚€¢ ¸4PBZX ",,õ7á) Puð†‚º‚€û8IÈ¡‚ððó„:» Ðûüýàñ€RRü¿ÃJîO(ÈÐu@¹@ÜÑ;‚`c Aùý#·¬ å!-$äãã#èàŽDx:Ëóð| (€ ñô†€¿Zè9¸Cþ´&HÈ0q"ÿr#œP>žÚƒ‚ p$:Ä †xлŒµtúø_`¿ü€?‡ ÿ•îOô¯DPøï`áîá÷ƒÂNP ¯®#ˆòEñàà_@Žwðv€Âрߥ;Ô• èÿô‡yB=PHA$ö«G¡_iÐǬ« ÜÝ!p’ðW}ªPO}î~B†ëGøÀþ^9Aá`§_m€½<„LáЇ^-Õ?´‰ðß6g &,%..@ ¾ ¡_˜øy@~;›Ñ=x <Nè6 AP'úƒ0éà  <½ AÿéøçŠ€¡ Àâ …þ;;Ú qúkž¿'Ô`-Œ¦ üëõ¯'4ÃÀ8Ìïßðß#2ÒV¶T5åûÓò¿œÊÊ_@€€ˆ@@J\Åb€ æ1p€þ©ã?bµàN€Ô_å¢Ïéï’½ÿp€û@xÿÌ¥‡@3àþ7Ñ‹ ƒÐoÀÿ3݇üÿXþ+ËÿJôÿ®HÝ ûíçþ ðÿøÜ¡0¿?4s½Phè"ÐZ€ÿ7Ôò—tu!`¨—û{µPh5(Áь޾÷—ŠT‡úBÀPÈå/Öüe7ý¥71@ ¡¿nt”°ðùÐ"¹¡o$šš¿]´†þ¹¯„ÿ›ˆ˜8ÀÁÓÓÁ=kôJ D« ñýMf€ B‡Ð=œž„¿ D×)äwvôt¹Aз¡êàOì?} ô—ó€¼<=ÑrüMty¯kñ…€—æ ™×——uJŒ>Çq×Ö»b“-bÄPœ O\tðr4f*ÛƒŸÓ>1X¬Œšždä=ºœð}Гºš©YˆÂPØT>(þvÚã a#œ'%žÄn’N1d&µ·Æ¶æJ3Ÿ¿Ž”èÝ~ñ©ä¦ ¹m%µp”“±f2¢” ºö1[²²¯£F,%RxZgy™h™NÞ`>†&^(wÄÓóÛ´NÌyÿþMÞàÀÑ“bí¾ZñçQ”ôTþ÷Y FS‡è©Sòî¿Bbp*‹«Tf$³Ñ—ºGq®bÙK¬~Ÿ-lOõjrÖS ½­ÿh¬Ù«!6/WлzÂd·•kòMˆ˜®%5Ö…¿î »2G-ã|$ës­(¬°›†€ÛеòSwQ^qa©ƒ¹Ü÷(\ÔöÓÝ¥}BN PÄ&C&9ôᙲ¸ŒÅcÔÉ|ùZ6@ÉÀAi …¥Çêºî5z—_ðë³hµÅ4øÙNË›Ž‘Þècû3õLh²EgÎ~ÿ^Ê+-±ó·äf¼jâ¨zíD·ORAÒl°Qa¶A{—†Œ•¢Ôâ[’™(i‘ ù‚‰Î6F–¥t¤RÈ, ¥ÛQ%ó‹åñ±§ra-r’!ÂV¦Žo©$‘ÕoÞ6ìý†c›ìèy,$‚o«]Øeåb_®Çuu/Ú¼Ÿ|½£l9z,1¿Z¨üÃ4ØŽ²âуB§„ï‰_·Ïš>Z(5ÄXÁbÓ»g‚7íž1wZ &2e½ž:èëäÊØöÕlº:Ç>¦tÑb‹(…U7'‰µ©¼¤Ž5µtÐé8kÁ÷ìsj>ûF´¾¹·êa»Ó¤÷Ùã{ÕCeU)×b¤”èæsÝN©l¢³`U⯒ÄSMa"ópA §fÂ-˜‚ö2Mñ¾5ûã–8ò†+ ãó>¦÷”mõLB÷‡üAX¥aê’ß½ Dß}²Ðã§„è®?z´¿mcþQ5L·7ÆòÞZùiT y±eÒÜX±…Ú±ÎȦHëíç­•ÍŒB ­ï =ÕðWw‡}`;‚øòüÊ\ï³QŽZúIÙavkÒ,æÙwÎôÍ,ØõŸ4‚uÈ1\€/XÔ ¿”=Ÿ ⋆«\ÚÊJWz¹ñ#˜¼æá|N“tyºû‡w‚.` L ÞÕ¶£ç¶ÁF5ŸlªÜ£¶ÈÞBË#´«ô‡gYµnÇ¿œ}ù}›î«ù;Ô¬¹Lv÷Ø—¬!/Eî»U(Þ±rÊÙÛ¦Oó7¿~5 rý¨^ÃÊè:•ôÅ®aÄ+™A¥jš+Uô>ßi`]6[úA¬Ò6Bn†hx²âÝVpªÐÛ~G&=¯^nô<Äàfyu×¶êoÍ9´ÓF‡8ÞF*‹¥Øy†ª.„ô$³ŠvüC4£y¤n4 ŽN°m%­K[̪†lŸ¥Ê2°Ö°¦¿7èB4Ü÷{2KÜpèñˆ©VƒS€öDå8’!’èhܲ¶£èPèÀ»'iÒº¨õû"K‹‡~‘â~¶fxT…ìªWâýg£+ÁÞ)süƒìl.¦åº g û ëi¼óÞ$ ´r+@dЦišb‰^ª˜í±hF¬ÉÇI§¶(ƒŸaYtx«>OD#q°Äì§’H‚ ¢’«T#ÿg”§§N»ÑS¶äª.ïÎd·Š²³7”3F÷惮^. Eœ¸TNýV7êì†^̾P´±H¦ÕÃ$r…Óº¥s}ÏM_ŽöðGµâ¼) µâŒÿ½Bíñ*í'7Ì·Ù¼$ø±¬—Yq.®^M,îÌ>@´‡Ù.°¿âŒÿxzbC. ËHÚz…l匈èJÞØ°åÉa5ùØâ@|й^s´4Õ°NÚiÌV$“´“qíe‹aK¨$v’-®,G¾Rì _É6ÙÄžT?ÙÁ9}QIi#„;.3=8¬X8›É÷˜)Jrë¦ä0á^Ùlœý0PE¬W†ñÙ…ù­j÷¸€Ñº°®WB¶õ±Ælykb(¼Û¡2ÇælGaŽŸóðÄUKËr!Où©ãÝkWŽk´;Ö •l °Å28d5ô¸ èIf¼hõ¿èè‘)m°ÊÜéÜò^d‘r#ò#O¤iÒLõóaP^ؤ¹Òó¦¤"ljÞç:úk¨(°q„BÞ—ú°îÔgŽ‹'Œ–ì°zÕ*ý³ó-Ïpg¢ÚÝÅR0WMßÇnFÖf¢7"BŒŽ/‰AÑKÝŒñ‹ïh‰ÜG#k­®ú‹uH$'_Ÿ-%€FO›&TK˜5q¹:š¥oÛ´ß6ðd}Å{XÀ·°²ôËo/-̽EHi§;c/ Ø€'La†{ÃÈu–7Y?u^‰2®.!+¼¯· Æ¦ä· ì¿pÓ3o²|}¨¾(»£Ô¹ëÖ°Ò‡·ftȽ<7i+²ÈA&Œ©t}sàÑŽ?Aº tG̾9¨¼Goø±úyD‘_>e`ZÒ²÷ŠÏ|’K YúÓÕš@‰o_.a¥êî/=?g¦ÙG-Fb]kBr¢– Tw½õ޶Ù4ăˆÊˆð lš€EJ´É¯ãÓù·ë¸·ZÍæ¾¬ÅiTÔÀ$´Í©üW= íå¾k°pUݲДqwÓõeÔG}¦÷z×мä?£ÓgØ«z‹eðžé·uaµCæ8+ã«–S¥¡õèü˜†7ëô‹-J[é­=(XWý„æM‘5†I¨/rB·˜9Ò –·ñ)R™TæTÖ…áã¶MÇr© ä‘À¯H‚²%Lõ}cf^üÚXÝg¦í¦ ˆõ?Ý–ì.•ÿtõ3ÉIík2súôdþaù˜³Ê}ÊiÊçÅ×m9·¤üqÚ?šÄ¨¬ õ£µ¥ dEá”#˜yŸHÅzNÎi=.B¸ÖšjŸSúºµ ðãŽ_ò9ëæ_~!êÓÊ…©ê|6´Â ½h6€#Î:N:¹d§,;×p!@¡K’øB‰Ðx^5±»OÀÑ_J‰™6*Uòì?°Ô üY§bxŸ!Ú0fq\ãÞ è}=/Ž8‘LÐö1t~Ÿà‘Ç ´¥$ œ‹ÉŸèݯ'Ò1‹}töæçõ¥;1Ìa‚؆ƒê@­Ì>¹½Òî…á+(S0ÖÇëóD–<&^)4ÈŽ¶ÉºKƒ‚Ç|ùÏ+‹L?©WÿjziÀÖ®=ÅWÝ1cÙ‘ T®æÎ8LJ‚steœÝð¤z(¸-µ’ãaö/¾ÉØÏQoRšÂ×”n|ñtÝR“Ù˜Ö´Ñ®9Ðâ>ddk9COÂOø”]½âm¦¦êÒ‰ƒ‚Ç žßô“V*ƒUu¹ö°Þ¡AåhÜó¥ó" íE—†GzÖ-ØZ#v{1!*øÇ&4þ«3NÛ²³™éñס·ìï¡¿•Õ€ó÷¹:nÖß³Ûà’†á-?¨!ßÐqs*v8ExÝ—Í&Ûk<ñ^ßë> Ö^1ÈÓ]UXHJ¨Ô=±ù&mN/CEî}'9’, ÇbC'BùN*Al¹e’ Áº–ŒB!«II @ðö+$ÍÖ¹©ÍÖ‹ðT¹i‹¸·oRÅ_Ç…x†è¢äýäj£x7CU°ºÙw¢•<ë‹`\Í—e×§·œ],3é„bqJ P¤˜ç^þ2ÚÎ÷–O§Xd^yñ°í6È\½3ÎÈìõî=¾þªò¨A¡û~x»Pª:›¸©`°ü6.æß;mÃÙaz¶‘Ùêi¹ýÐ/ÈÝÕÃp_Ä}›õ…*Ö1Ÿkqý÷‚A BPû£ÁbäÇÅf£• |5䥯jž¿¾f–ˆk0E†å¼˜¯ôÛþ8ÒŸ†gR¯"v­áé¼aŠÛO&6Æžý$ž3°.©©;ÿQÆ{ª­EÉ‚'{ÄEµ¸ºÞ׸]iQåá›kâ/“Åð/‡¹66†˜cæt‘ú‹) 1î$‚ñÏŸYwÑNe!ôd]ï~ÂÿÁ¶Ýß|N¹HòZ&èéqäÝà|Ð<·ô"$©^á<2j“Ò*û‹vŒs4våÀNIoå6)¥b|žIM:`ŽËáœcP;ÐÞP;èCñ›Í/Õ¨¼´X’ SΛ~I)Á›ùòömGoe_°Z7ŸѰXY 'LêÌ¢Õ@~ î|F ¥¾-­Ð‹J_LÆ56ÕŸ ’¸Š¨¸[—~¨Ö—u3¿r+-®ìĵ¨å yÄ\F“GJÝ+kZþrAoERv]A.ˆ’EËeßedø’9â²ÈSKñ©IÔëmáâgƒã%lNâÝ[ó…¢éo~!+h_H¤.3xÓ?¶ÄŒÂµÌ<ÿqÇáAy¶›Íš­Öo/¡®€ ›ìw5 •Ú8yΖÛ㜦—?1°dp”x&£lk˜¤_™&ú­›Wù¶hC¸¼‹ýÕšÖ ÉÞÏB;}\Èû·„w²Ø_¯Ù‡ HQ õ—~Ôm€„(,ö ïÍÔ5Ýb!;pÙ²‰+s<î&¸Ùmß«¶Û‘¾ÏäÃ&;@1õVÕYOæÕÇÐß/úQ©¯X¡›¢¶ºKŒ*kZôÆ š{ÀÐ*ä¸9Ýw¢k¦N=",ös‚ÏM룈¹”¼SfPå+ÙÔeó™(*º¹úg[‘kUTY_ [yã§³£äy¡akêY8—BÌDK êžE„˜„õÚ´»Áxš©0øk|'ϵHßÃRÍYumòÍ­èEœñC—òÛ­VâSt‘îü«Ó.ÆæVI$X÷é¸^Õ]ŒÈUl½óÑû˜ßà«’Že¿Ô[3ØŠðé³›ŠUŽcÕ^e³ý8ýÍùá)áz'µAn6¹#N Á\7 äáœÊè~èfþ·/ûö#øå©Y-kZâ´*™Ú7*XB>uùîTxÕïFŒß²¿0üÎ2­¢sV|šÒBã›åCð¡«Œ9R½e5‡“ø[Ä–ZšüxT`³Œ=6é‘÷wŽË;˵&Ö‡ y\›ÏaÌ86'¦ ® kÕ¸~qÇ(oß9i/°a —•ŸÕK0[ZÕ3G¾íý(›EX­ï.qŸ“Mq‹—*dݪÚ,úxô=ÑN¹ÜΊ>6NefÙ£½Ö{ÁöãêßvYlI•D½k†6ôs½gj™šEnyú_}4iY½^zOåx÷<÷–u®¿ßdê;6X³â6'öl¤t`Ï=©,‡ãg.ß}³%•R»í§øiàg«éúþï¿ú4e†@™Ç²~ÊŽ•0VNߤ¶cÅÊè·Ÿ3ðÀEØ+^[{0zÇ1?±e_pyR³Ê¯ˆ~nL íëxf;÷"Žg.[ à•~Rkþü•™QEo#©ï›}ü;1†øg>ÊÎS)7Æ7í¹l U°\Çãs™Öú,-¿¹j 8=£{±žnºD¯q{!œ¯ŸŠfdÁúFbQÆŸú9˜Cyv„<Œ†.W—^W±Ñ‰4yf©ARÅ.ùú—êåV'\ øTõ­å_³>l;ƾd8;®3†Qºœ’éüñ¼é1ÈVC6qRjû?У*Š‹Ø¾Þ¼ QÛÃãß„˜‰ÌËéÒ"(y¨BÌ>”HÏ0˜.‰L·ÈcÞ¤±‘vš·= ׿ù:rWßÿ{› ¨åÔ”^mÉy½önqq’2é`On_‚"Ý’.»ñüòÍñ¿’|DkM=.C(Oáz,.{ØÆ)بǻýÒ¤­0-•üs¼YA΄e†áÛŽû€¥ÆùÖSϪoð{=_Tÿ· ¿êj~.U¯]EïŽ7á¸ß&Êõ,{¾Ý%s6X&¤úS3gÆ›j¥|­>{7òúË3¸Ÿo.ýQø@‡XwBÙ¬ÀÛi%V_þ¬+¢Kc z«o»©+b•twÆì˲Ô2·°[r/IÖ@ “Í8§*æúu×E3˜.®âö1² zڻاú:ÞzMHÈÔááä3ý°’S§=+P×Sʉ·`ªõ¬u–ÐJ~V¨`Ú­œ4n¹ïÇœ|· ÑÓÆGÂ\nGu»%= —-ê¶·ü÷ñ†ƒBýG¨v0ŸÜô4.%^y‘‹•§N)“¶\Ÿ>üIfÃ'ó--ý5F${ëB—&”l°h—ièê:Äã˜ÝÍCße•?c®§´5 ¤u¼Ÿ1°ütw®ï‚”ò}U ʼnsÔëSŽcHE•làmç2=7W´øG["£ð#ºŒyŠš¯ƒ³ ¾á^ßnÆ^LiidšŸ‰ìöë$ñŽ'ÚÊ¥Z6mu¥Ld¢3bÔËG(¿´wÑ´§E„¯¼È½eðy¸ÿTè?+éf\åì‹ô€_a­Yp#ªÍɾ'AНDß± Pvu”½ˆ07))\ ˜ í¬o ¿«-IòêVÑsù^wû@WÉ—œ«K¥'!pÎ ©®ãÞêîíß3yöÕoöJøšÉ¸ endstream endobj 126 0 obj << /Length1 1586 /Length2 9843 /Length3 0 /Length 10877 /Filter /FlateDecode >> stream xÚwPÚÖ.îîVî-.Åݵ8’ îÚ¢-^Š»÷â^¼·¢…E‹ëOÏ9÷¿½÷½™÷&3Éþ–¯µ¿µgÂH«©Ã)m±ÊCÀ0N^.€Œš®/€‡‡Ÿ‹‡‡ƒ‘QsþKŽÁ¨tƒ‚ `‘?,dÜ€–°'™¬%ìÉP (»;xù¼ÏEx_ˆððøxx„ÿeqÈZz€lj\eÅ`”¸x»ììaOyþu°X³x……_püåvº¬-Á5K˜=Ðù)£µ¥@b ¼ÿ#‹˜= æ"ÂÍíééÉeé 傸ÙI°r <"rc†ñÝC 6ƒhì¾&ÒøÝÞðAO”¢«ß’æ…áàWAßTµ4ŸÅÌNÝuÜäs‡¢dÉ Ò¾ÛgëPÌ0fTí+*‹n•`$þxÏ€“¨›DL;ÒšW¸ÚçÇ?Õ½ÅAÂjë›_v~ÈØâEiyÑY‹Å$.®¨ÛWD1òY,¾–­ø¾Æþ:ÎõðdŒ%Ï}raØS’¡÷ ËÓØ¦ÄÔ£¶MÇÎÀ"8ƒãÇ•¤}yg1¯ðªœØkbžJMÊÔ8ø‚Ì•M|®ñŒ1ñ>Í'!_™_^šq_êcNÜWšµ__m¸ƒÊM³ì~õ‡ð\ ‰™ÜF2®&‚' XB‰Ý•HV™¾~³ÉWB/°5¨nƒ•›¦^›"wìñóÑœ#Xî–f!ëã 4Lêiœ—V6`ÿ`J²¸ßµ_3„*HÓÕm2îàÆŒ¥ÒMÚ¶Š=6Äé¿xAPiOŸ“LO™†ª;1• ÃBR•§¶Ëœþ¤­}ÏŸ·ä¯fíoÑsš_pœ¦PZeÂm? v3õª¦‡Ï‘:øÇég¸ÎÞêÃÄì¼°)ý¢¿nZÙXšoT"qÌV“ 0žŽ0bo!bG©e÷¡`Ǧ¾–òY˜®…¾^–í„a°¬-ƒ`ÃÛÛ$P"¬W ‡çëM÷.SKÚóŒûd²”CÁ1›úéC>\ãóç‚"q’:Axnô|Mçpðáèøqì¿L:ú‡=H>FÔÆ¬îÏ÷u?è‹›béá ŒŽo­Ç–N¯^Ó! îˆ>ûEÒÙ"ê0¿©úÀ~5ßɤÞ)+fõNà2#D›ÜË~œ6³SwÒ9Ù SÄ\¾a) º¡™t`àzwO(³D:$ñõÊÆm ¿Ë(×§‡?iL–ÂŒŽ†åv¥Ì;¡T²¬jéZ• #ƒU P R¡ªP]]Mß¹Zæë¾oÚ÷ÿ6ا¹4¢Äü -g¿üiñ–šª5Lër˜ïjíŒqrUd.HˆBà»9ÇIéD«]”Ö˜pJ ã+TÐ'Þ `½j¥ùí¢äa¡Ã}º•…ÞîZn©< Lñ_ÀkæV[0µ=hE1\p²=Í缑÷›ô0¥yOÉ"´’q«¹ù„:Ä»¾·–îq›¥NÙè¿ÄB{e9„_ ìS׬˜ÄóÖ=s‹8¨æ‹NÓ$†ÛȕَUh¸lWĤ:Ä7Û(ÉM¡6¹Å \3ãÖkoù£Þ²ÁΧ¬rB>ñžAê©fÞÇlíF¹3ͳúûú>¸ù±vSyåé…9nA5¾žc‰߬Ó÷X˜c»½¾C©¹®]±êþ|£û=Ò™µ°ä‘Yý”÷] ‹èÇ\¾šåƒ½³QÎù«€¤ý¦xçÁc{nÅLZÉs<¯:Ò'¥ÕL³lg ·%½L©£A-WiÛÇ`=‰›£à¼eÆáæ{–É.]Éxòд1."lK^U$®zÏÆQeDø7ÅŠò‡ÝKz™XN ;q RÔJÛV ÝÄZ9…ˆÀÛפÀt%w9¢Pˆ¤<¥æ”`Z7T¸,þm=mÐÙ#·Þ†ÙÜmÀQö/Õ­®þ+¢v¡D{‘}‡g ô ÙïÖT¯…©¸®ªzpýœüðñã±Jë¸Ë¯–?ˆ2§±ðišŠ¡¯ƒ/§j¦¯0œLúdîæƒÖDò“×c2˜ý8§ !Þáij‚ðÀÍÙâ$ þ­\äÄX-ÿb*NaQUòUOž`2˜æSiG…Ä[6Z6 üK#;ÂhÀÚÑD§Û«¨²hˇÉ7kÊ| {_½M¹x¯Ñ6á˜y1Ì<;;p&%{jí0ª·Áv]«?äÙCöÜ’øgIjKÙˆ`0CJwmDUšäY¼ý‘’Âþ—Óðß‘âF5ñ2ûì#N[¯*¬„‡›¿]«k—º…µ¢1ò¨P¬ rm¶Åý´êÓÍK“ñâÐ$v?ÆDb¤ÃèHç%ë›ÿ„f¢¢‡¯´äÓR’½°e{½^ Ý!ëd.M“y*0ñ [’ËŠ¾Å=ÿ¢8~Ù‰è1=rŠ)a˜*qJFÙ?Í´N3õèÐã?rÍméyt\3N°¢æ»…³‡Ù=ɺ{Dw^¿y¼oæŽÅ³jBÀ–-¾'õ‘·x8ÛYÁsi½Ó´ÎÓ^íRºxãRï Ò‘õt&Ö騏ž>Ï@QØZ™ÊúÏãÖ Ò$ °;A&¾““ý<’¶&cƒ †‡N5-͉¶Ñ.“îqÏ¢‹Vî_RÍâãkæªÉR…—ež½ê_›QÂüå—m EÑZ⇣=£·Æ?Yª•X÷æîsçRXYQª°§§ó¹~+·µÅ× ‰ Ãë¶@F¢Ãÿ RŃpGE0{Æî`¢}4c3 ÌK²¬-)Ìx i<¹Z†“œ„ëtÈGÎZÏ$¼!eŸ¯¿ì°{ÈOƒyÿ¶×A[kWÄlÛ+éZçÙ ›ËPÉ3ž¹…]ž3!O"äpˆÑÃݳn½çðyÝïý¥3u»¨Š‘—6¹n0§±º.€ÎÅ}âä|f©íÆ[²ºévwWM(%óšÓ,³ Ö¸þ¨mÆS=¦#8òéĵ{YwK7³Z|y$k{E»¶*îPª5‡¸)rw’ÈÒ‰þ*ª7 D?êAí˜6œèX®‰iGµÉ}LV'Ž2‹ûë⹩uNcw²ÏM"–îƒ~é¤0¾ÃØá’ñjÃÙÛG¼g„‚«M۰™-×Ñʃ…´¯ ŽÖã뇾™è~ÅÚŸ®îUáñ0˜yÈHÛÿ`ÀeÌõ–Ú—‚ìáòŽ\àT—}ŽŒÌÕÖøŒ%í!)š”³Ú:ƒ°Ù¯ïwò°ú6‘ 4äWû¹×¤ÝœÑ÷økI“•*qÆy5ŽÁ~»Î HO:öH?Ÿ}n*ᳬVÛ¹ÂùÝL ¸­ªî€ý€u ‚i&gqÑTÖ´»¬ä‘@°Eyøâ(È_¥­ŽÚš+ë“Ã=éG.yhÜ`ïÞ ìèˆü."! t¹Ñåž]hf2|Œ›*\É]ÒãÒ õ,Ç|¸,&Ï>¬.óùÜ6U¼F2±çœ¹DC\qL°÷<>·ÜºV´˜±` M¹èÿÁŘˆ^#P\P0Ëàf†¡<ÜOß팻S ²Yõ#¢’ ß©o !ÆÖ3MWù/6Ñg²¡-c̾¸‰ßyÍíwÓ ShÈ—4=b@ÒEë)ú“Òñ󳮚˜”ÎdHXle»£¦-yy‹„dù_ᣀïºp|A*Ü ë;*&Ø«ÏbR§†¢ææjTuÔ±{äÅ¿±FÐÒÏ Áý†æÇ§íj’QÌÕ+gµš Ï—E(rK2‹‘3—Lô¤ï:ãmĤÌI‡ëW*1ÖõÃDÕr¾ úÀÔœR@íÊoæækL÷=AÎÝ?zUGŠs/Ö­‹Ôš&s%•*ˆÅP*óªóÛ=£c8î¢eÅcFÅ 4ÛÈDÓ@s,ºðuøYÁwìÂr_¾ðéö¡Ž6Þ–©?ŽÓhyQ7CX9u…}úÎîZüµØ±ÔZŸªÀ€Y'bÇL1Á,Vhˆ?¼ë¸üýÆE‘˜w“×¾Í÷;ݦ׹,^÷P7€ºCó®ÍzÜóŠ5Êœßë\ì¹¶´±= F÷\HJ‡¸¤üæmúü í‡B8³€µ›Ôö[ ––ê‹ý#Â…ÖÓ——%¸\Ó/…¸ñ ³Wн?o¥w6 Àb¬ñ»% åBÖ«= ?ÓzئrÆb÷µ!?"©…®c«î”ð@×|õ=‹'«µáS‘Ïä-twhóP¤»]•‡ª·8À—”qmù¹äe~;[Äç½J$†xS/&ôÚ+ÎÍ»‘µ˜?[œ",Ë}tWÈS ½‹ñÑ5äto¾©û<’¥™}–D6zcÇ ±ì†Š"½õ2ÜG§ ´·œî}Ь§nÜ—£ ™éŒ8ùQuððqgîÅIÓ¹*¿åh©ÌE ÌáØC%0K2-†é÷ROoÈ$Ý U1´ä£¿Á@‹Ct‡y²4ÞÍÒ^¼î'¬­ß-ü1·#Ñ:°AxÅ!ÿ üËÛÔVÑüÞLTÇ[Q/™{…žŽ•zæÖŒrÄU:TÚE;‘òŒôÊJ"渇å-s¶‚%cåý¥ƒ¬¯©5M´f3ù¡cwbRÁVæ£Ê¾ïiûû-eKៃ.hþHÒ„l52š¡â A†‰ÍRf‚CG +¿×2#øžÙ ×A¨¢Q|Så¬Md²¢$è"Ö”øb'e´$¸•ÌN1Ù#|¿Ñ<×”È3T_‡ä($…sY5„~QÍãš"=Ô“¸Œ »Ù²+ þ²Ìí´kÓ†ûÅÇÔåcËçâ$ºÂ¸.ɞфɪiîe§åWN+L;D‘Úo <_ÒæŸ%\Þ‚M„Ø•=L=—kÛEõèßÓœ…®Å¨““u/#´ œ¦GL¬°­ ô‹ûgþÔ{þ®Ê8¶"~_}Èbj­ó Åw÷/w…V‡t•phmTËWIjw(8[f w^-ƒÖ(¾gIzcyßí[…z}±Õ#U}÷Ö_ë²@ 7Bo™óy%piw¡å»IÝ@2ì˜ÖÀ–Üsà°ÉYZ}´-Huýl³ñÞxÆhRuI㤨àÒ[ù£V"+U—&<"ƒ˜á`›=³ ºu5ÒrœŒCšÇ:ið+”É‘®ø·/GŽÉv„àm°+õ~*ò›r û—ÏêÌZv©¼b¦$¬$Cj•>&h„ @°¾mh(—_\Ô=ìĺ¥NOÉ"FŠD Q;¶<ðI¾&ÓMC:ä¸Ñ*2ÚAWj¹Ý «{)·‹¬ÜÁäÖfl…N2\­¡3 :à*/lý™þª¨ÜÚ:•üÓlZ‡ê`Ï@ÊH'~ô‡oöýÆsǵڡDÊŃ ¶i…2Lù· 䛾¢2Ì@'%kCg>GÆüëçy³iLyrΩ¿ÀäH±\Ú ›cÒÀÚ²0¸Áþ‚]¾4ƒg~*¢©5¨¥“€Jl D¯wõ·´×ÄyqƒXؘjcÒçiÓ¢U—óƒQþ8V›üØyÜ|Koß@YYÍK–‘.@¥)ߢ3x‰µûçÏ,dý)•ƒToã›ÐØ ÐLÖ 8qw÷j#²ñS²µ ó͵Ç’Ë}b*ú Ì‘î'dJ]%“ÃAÚör^ˆŽM=¤Ðxºip(Õ.©ê›E½äÝÒ;ÔÌB͈(L™°Ö¬Ó_¬ª3r²‹x=Ë_(ttÆá 0 «Hô2“¨ºâÜ ·g·AÐÏ“ýçý]4ѰrI™¢:M[yÒâ‹#èË\–),2´ó«ð²VÝçhT£é(r¥^ ŒÍ“Fý=G*÷ ¼§é±ßRvr¹aR9\‚§×žb½Z8LNkÄ@¿‡´>,¸*w=ó·£Ö%}½äôŒ¬¨ŠÝ¿D?ŠìÉ8+¦‘76ð˶~Ì£ìqN|Ä™`¹Ež–õí[¬!&3›„ÛÊ Ä—ÀQœÚ“ï°î[T—%–9þ6‹¢Ù…&No†5&“Õ¾A˜¨2&’~ž”¤b¬fO™â,w©àb˜5s±™c.ÚJ±åþŒ”fÎÔ‰ÙV[i²’š“)‘ñØA–žø`[æIie*ágñxGõatHº£pÙ(»8é»åó%‡¤MÌåí ¥Èq  é$ÄÚŒÂ%¦f9úb£ØAëÜÂjÃåÙ#Ò€CTè ¿Áv—6)Ò­ÄÙƒ\ŽU¸-Î «¯Ekƒ®-1|ÿJàE0‹RjxÖD$,ô%ñ¡dÝÞàËίb¹…¨wŽ­77ïè‰ÔÒŠ©—Ä IhÚøŒ/FÔ´9Y‰×tÒüsÀ: n>9'B}å˜¤Éø;†ï¹±ƒÍ=†6õ)W¯âŸ ͇¦•8Ýå¥Týˆ)«ÚÒÆßKX-õdÞ–à¥Fä5ì*ï'˜>ðæ ¾Çßër1hÁ½?jýñ‰ržÒ§¿ô½Æžp; Øì±ÊCQÛú*šÆè.ë=ö<•œÕƒDúÃAŽë.býmø5üÙ‹~Úl/îiÁʇ9©ã:"È,]„ùQZ:7œq˜¿` ì&¾ ˜ððnÖÅaÊ…¿g-&Mµ2Ò¤“²¬sÐkˆÂÅr;©tkß ÆwWOˆË'³+½-f´N?RA¢˜sc"©÷}ÐP¸>ÀÿzOBÏ U”àåXìvʱ-WÊÿöÍ9[=>3ˆsàŒCµWgM.à]q9!XȰÀ†§(‚¸¦‰XÒê݀饱@ŸµÏ,B)ã°Šå¢æàNû}Iº9âzlç&ŠÒE“óúÚA_°é•tŸÈÔ0’ÔO=‚ dc%æO¢jÝýxµØúø‚¨Ò$"á§hôš1+ÂJ5‹¸@Ñ•›ýÃ=+uü̸öJÞY;†€SïâsòÌ“_É(V¬ú­â5vÔÂZ½çJ¥áUð ´'¾É!Á«Œ\ã·ÞÎIÐni†5ZhÅhXÊ&jŽ9ï"‹úØ™â"“74— .B2žIéãá™% Pqœ›!1J.6F‘IÆf&XÕ{ÉúBóNK´Z3›WUý«ô 7K—VJ±û u«02”ü£ôñšÜ”k) ,ÓgHP•Ñn÷ÞüVòø½ËŸ.Ãæ2¸q߈Ï|èV¦éç?:çå4Òò <“={#öV/?.éŒßYªGÒ‘ÿŒ‡jšn†Y;¥ð*oˆ%\HÍ3¿Ô#WùV¸®ÅK[™W®6x²ù:1¶ç>®~+…Œ¸'dÁ¬+”±ÕÁ~îÅóCØþ4Ó¦/Ëò¸V„Ìc}“æÀfÜstô‚ ª|¹è9R˜©…Õô9¬lÙ]ŸDDm§‡8é³®®üdyêw¶Îƒ”DA2¦a 0*¼‘ÍM³ëe™±ù¸à§¥]"89Ï=Ó¼‘93•Æ/R\‚ôVÔÁÆÎI!ØX¾·Ð“öñù©\xû0ñ‡úA-qn\¾šÉ:K%‘ŽÖóhdCñΗøÙã wªs¶¬T>Ƨ±rþWÁä‡Vç#Ì.ùëËàE®£ka ê̻ͮt,"§ï‚Û>9v¸QH8ú(—•z(i"«0ÚY…–â³: ~–$^‘ ­!AôÐL¾2Ò3_l ëÝ9$ „{;+¼øúQ÷çàÏöFÂʮÀ~ýÖbèñ{­eèØëf¢G2Ú–_¯XŽ"zxŸŸ/"êT..ÌNÏeCN=*âJ‹›ŸjÏÐ-ÿùâŸÏ£ê*£Ñxš²Ã ‰4&ê.R'U4ãŠÓ¾@¢–/¶]Ãt §@M_n[à©^V@¿ªV\%‰êñENè˜/i ‰0msDlS’õ4ô¢ _Q§˜Ðs÷åOï§?s|¤÷#HhòïtÆ}‹>)ŽYvLwËôû‹†¹aS~edÛYá×å {Ž“E1¿Q¹|˜ÃãbÉ&†ÁŸéc–9Y"-p ïgóNÃã-Ð÷×ï÷>®2¹«Z‡£·0âÄ,ƒÂ>'þPС9ˆñWR5GzTœ¢þŠÇùžáV4èó›‘4õWð–®[ÈpÙ‘Ã’½è‡Š5·ñU¡[”C·3‚ö3ðÙÕ ÂÀ4œ”AËþ+Ì,WYÅ“Òîˆûä·]e1Ö6—>.u“»‘òMýCœ#%¨8=¼-.äDÅRî½é®q ·ÓÔ† (R¾õk¼ÂWeÕÀ[i¤”c¾ä"ÕÞk³¥ø2ÈH 7^üæ'Ô|¹#—Xû΢vù3ù>‡_!tróá6ÓŽ9Ÿ¯U_ µîó)ÖÁ­L8ôÝ3×6÷ËÐÞxñä:9ûÓ„èbÛ `•ÑU•é³Âg(ˆ/+ª}¬–ù “çF¤le²&¿ƒÚ9Ì@³§=t›VËücÓØ†ˆlï.!RtÇ,Eôw‰p~¢Æjãwb¸²å(DHP5ß\qæÁQ8eTqsö1ï]‡ç°v4E äï xKö|]IÆœMYûs„–Ah)tâsH”P;ïE9|Ë‹L.±Áïz‰ùDv´úUzéý†Le#Š cm¬76‹ei,jŸ/}_:˜÷GÂEôŒÔ‰÷]q½t’(Ôþ‰*ÖÊZwGþ%ÖÚœ¦|Ìœ@bJ‰Ð=Þº¬+4ÞÇ$EoŽ¾Í« 1:Š oÀ±zºM­YP”0a-’¦ž¼þho’ÒÖó7i{}ÃÕ'O`¨c”µœ«´ÛOõÇÒ•øÞ ‰òÝ©¨ª”Ííg®Ï¡ö‹ Ž:§NÁ o`²Òà·¤î™S´W8¶.8³&ý|À°·ó` ‰ˆ°Î†¯n$Îi»÷Fݵ4…ä1Îzá½Yåä9Ùc›‡ËSÒ¢¸ÆÜ­Ëâi™oÅW‚ iz‹-1ï½ }^gxZá»ßà·Ž-‘ ´kávÿ…Ñ,â)Ü?:K,-HœÂ\mÔòþdʤ-’ÚŽ¨+*LÉ•^Â픭̶ûsia¹7ÙàWA¡îaÿÒÂÒ9óügxU&t¢cƒÁ¦ˆúéÑ­WïxTVc≡ð”†g ª}Ämô‡®iÎ\­4ϳêéCÌfÄò×±väݱÐcRc¥¸}‹*(­û2 Z6ƒ àzl~)6 "„ú1·Éê \‹S<כ󎪼6“ß=Œ}ó¥¶ÕOÎæV÷ΩÀy9ÊiÏ-¼piAUµKHPò a{ÎJEF•1yàûàãäïV‡J03ñÈ%™¡Tª‘N ×6AÉg}ò•ŸWFÏD¤6^ÙêÆÏÊŠBžë©'‰áͧPáfg9—Õ`ÅŒ;wµ¿`)j 8’ÊD‹TÛ³¦À Æ Š¨p3›ÜÀln ºúÊ™ªÆJ]Óbýõzí(e}\È-‰'GQ!dU‹Z=w¿ »¯ÉÃÂ{Ë•ã[ÓpúX§ýÁEÀ¹Ñ!Õõðñ l‹‡ôb¦)³$íkJŠý$CÖ Jwt·P{B£·°žkmÏÊ Gá9áN¬âô=î놶TwçäNñ††Oª”¤J“aD>Jù` Êʼ³sÑõkNl6ì«N¥oe ü‹ÚNÂV&¤PjK Œ‰‚V8cF=®WV„Ðu=CÔ°mä(‚Ê颸oGS)€%eÈßÀ˜Ü~áT-°ƒ>°áOòo”eÅ߆²#8‡bW0òyøïU'ó㯴2K6âè‚™ÌxXL6"tõn ©»c¿¹EA½ öE|žg>ÆJº¥ê=&§çh‡@£WR³žu yÝ·Ç~”Ç`x„SÌ™í-ü¡ËKOåð&RÜÜŽf&‘vÎíê áÏYr·9^[QÕ¹¢™›õÚGöèäù¥£¿íyt[Å‚kÖqH,õ9»önÊ̲\RìP{rRúz‡åç7ŒìÌ€½Å×Õ/ÉbHÙÅ2n‡NtJIãÃG@Š£‘~.ÈRÕ _o^2c*é~™{¡†å'6ñ‚‚}jtŠKÅÒå›Öu‚CRy¥Z*åâš©ø*fƒ–úA «ãncz}ìÒ‚ôŽ|ßUâO]xâW‡Û둘Pe4¦BØÎ0AàKq7O\;K†:ö‚I™èoŒ T¤~©ÝIëÂ̼Eã)Ù1áw„u3ôp»H¥6”);XÖy«c£lÌ´áJ%÷ZòûˆI׳lÙcŸå1\jÈŒ¼G¤5M ÐæGM$’·1_–ó}[¤1jBC­pÌH”²CÂ'3p=¶¨¡Ðhêe:®,¦Û(HÜ)Ϊ!c¶#tM¤œøÄy—…64¯á§ƒÙÉÈm á~©léÕ²Ì|(aͱ<¨ù` Ï#YÀP—žYˆÁeöºj]ðε­äaÿ„7ÿÔsX,S+hÀ< €§eo›1ÈœœQª,ëoRv³&ÜÇcÓž¶¿˜Z†GÚÊîñ …ÞªÈåR¼Þ³v3é“G µ#­5M–€ŒÙ ªÜ̦֜Ýé‚V“ö&IÕfë^!¦×ûhb³#ò¯ ;›Â;ðQ%¾œ“¦¸fs÷$Äzx{6£3,Z*™ô WN¯:-Ø™ð›jvYêżµÉ«¤ FbQ“fÝFÙáBaagT²@‡ø…$RènàQVvrúÆ+#ý“óÅÑz_„*tOYê àA,Ã.Ax%^Á#ÒDØaUI…s“~;±CÇÀ-§2Ëùe/eÇð³Ö ÁºjÞ9 ÂY¦Š}§ƒª„í¯q¬÷_=˜JªÒp¢dSÓüQÄ 8^1U áéï5Vlûj\ïÞsЋ™˜ùL fØbcÀ_a `¾{†¢œ™´BÐ9ë68*Qwhôösó©¼:.p(Ép'Ô —"D7ñ@·ýb_ósb°Ü4¡y¯Ñðräc-w*]PUè$?¦ÉåôÖü!C…ÙîÇLËÞ+Ǿw¸ÈdïãÄHº—ð´s€…íŒGç’m‚¬ñÏ »ymn< h©ÖóËßã€-Š(2_ÃË7G*‘‘¾lÌËC6îö{}••r»¦t'ìOQ¯Kr¢)碒?[UÙB÷øþnëEùCr*Ë$#},„—ã]pNuIa…^žb|VÔ~Û»øˆ I³Ÿ¹{ljveá–n*C¥…^umŠ{‹ºh€Ѫû–{WºzÞùÓŸ†xþƒ¤Äf]¨z¶½£¡—³qââRâÕ_JòK(´¤ÌÆÔ)_ï;ÓÒ³øÛãc”Ê};¬³0QÕ¥‘@¬—­]Á3èžMù°=Ú‰!ùë¬?Ü,ˆt^6~uo!_¥XŠXÈÆ‘øÙ@š]ûlÛf¦w†w+~Çð*ñM@8¬°šàÐ6T¸yf¾ÌDz(ªë0OôžSŠ×ímñ4ܘÜ8Q»W°L]††ýNîáe&Ã{.&Æ|ì úQÚÀ–3@JºiìÍ—m»†±>ÜÙ^¡ŸYµ?7j±yŒ­ÒqÞ­’qß_© kÍvi8Jê“o»°™o¬,üxVÿŽ endstream endobj 128 0 obj << /Length1 1935 /Length2 11987 /Length3 0 /Length 13179 /Filter /FlateDecode >> stream xÚµPÚ-Š[‚[ÀàîÜÝ \`p‚‡àNpw‡4¸ÜÝ=·Ç‘{OÎý¿ê½š*fÖjÙݽWo¨ÈTÔ˜DMíŒARv¶&6fV>€¸¢º:+€••ƒ™••…ŠJ ±ý‡G¡úrtÛÙòýæ!îB^8 äÅQÑÎ çl `ã°½ãcãæce°³²òþÇÑΑ t›™rv¶ '*q;{wG°¹äåœÿüКÐØxy¹ÿ ˆÚ€Á&@[€"b²y9Ñh P³3ƒ îÿJA+`Øó±°¸ºº2mœ˜íÍ…è®`ˆ@ärt™þh ´ýÝ3 @Ýìô—AÍÎ â t^k° ÈÖé%ÄÙÖäx9 &«P¶Ùþå¬ð—#àïáØ˜Ùþ›îïè?mÿ š˜ØÙØmÝÁ¶æ3°5 ,¥À qƒ0€¶¦8­ì^â.@°5ÐøÅáÏÒ)Ñ÷àK‡÷çdⶇ81;­ÿè‘å4/c–´5·³±ÙBœPþ¨Oì2y™»;Ëß—kekçjëùd¶55û£ Sg{ [°ƒ3HVâoŸ åÎp±²²òp°@›‰Ë¨»Ûƒþ4²ýA¿ôàíiog0{iä 6½|¡x:]@ˆ£3ÈÛówÿ ÀlƒÌÁ¶(ÿd¡Afá—ûw»tY_äÇ`ýãóß_ú/ 3µ³µvÿÇýÏ+fÑV‘‘ÿ ÃðwËÿ5Š‰Ù¹<™8Lì.nÀ;ÞwïgQ‚ÿ®â·HY[3;ï_žLé?»ü­Ú¿×ƒðï\Jv/ºhÿ‘¹+«É˶ÿg±ÿòÿ§ñ?²ü_eþ¿I9[[ÿi§ýËáÿcÚ€­ÝÿöxÑ­3äeí^6Áö]5A-®"Èìló¿VYðeDmÍ­ÿ;H°“Ø dª†˜Xü©¿h?öÌl R±sÿñ²˜ØXYÿÇö²\&V/¯‡Ó‹$ÿ4^vçß'Jښؙþ±dì\ï@GG ; 닒ع¸žl/Ûh rûSÄf[;ÈKà¥;o€™#ÊWÊË `þAý…Ø,Æ@+'k “ÅY6vŽÚh²™A~£¹þ¦ÿºäÿ&aû‹¶AþåÏËñ_þx,&ÿ¤}™‹éoð%è¿ðÝÈÁùE(ÿ8¼möä°üS;çKîö/ÏØ?/ø7ø2«ß €å÷ì/ÅÙü_‹å·T/«Ìb÷|)ÅþŸ³_|í_ÞWÛ“íoößCà|÷B¿LÒî·ÖÙ^Zqü ¾ÔíôOÀKÙÿsOl/9þÉø"ˆëïÕ½D8ÿ_uù ¾4êúÛå¾D»ý_ªvÿ ¾4êñ'ü—Mœ_ƒüù`¼Hõ?øÏ÷r™ ÌÏØ™ðZÖ~»©%reÚœ¤ÚÖL¦còœwlu¾CCL «L÷_u¼MèÂXÚ”¤½Y }ôuy5‰•9öL*Àâ}ɑ侀Æu;í±\¦ÎîÔA@I óæ-ì%Öðµ§Ø^¢þ¬gQAĪàìV:f¨ÕáR¯¡v²c>]Y,|VkÇy^éaJï–Z?­ï¯‘Ó·ÕŒìékìÑfß0˜¹ºJIç(7tìô#_‡82˜*º|FTr÷ÜYŸ‡»Ô>¼”?<®ÓõÔ5Û@FÙÀ]j[–x vðÆQD þµÃÓá•g™VLYíùÝrìÈ~ÒmÇM­µ·TòÄ 1/!;/µ›j æ²›S¹’·Å Y¯“Nw€`AJc‘Ùá|ç‰ó8{X'™GþÞÃÕ•¸ÞÝ:~¬@–Ë«‘ÔÒ$æX· -%Œ1Ž;3of D¾šï†BDnÑ´Bd¢EêzD1x÷ºÓ°$ûÞ“œ¡æîP°qOè0 nJ'#èÓÔ˜¤I¦t‰&åͲ°) SÓ›·——ÜG$9’¯;4J)ûª‹soúú 5b !ý…½•Ycˆ’ny:žØÃÀàÏJ©.asÕùâZýБhµIÿ¦ŽgôÏeù‚—%ºÃÄßãæõ«(>&ëLvê̹ºõWFÔW÷ùiRKèÆLîC¥QcÕoæ'ç%nù¤â}ëݳÚþ}x9cÉlø8™µ0$CZ¿l»ippÓëúy`R±q’ÞͦioG»" gXèh •Ùq»,ÚÞÌ“U¢ÃëHénæ~¿þKe›…ר8óM¡ª(ÜÊ@•ü¬Mºõ•Áµæ’/~ørŸ'IcÎÙ£T7áòiéÛŒº¤v¢…锎h)ù²xAùÜ"xêÜ¢KŠ÷Ê*haÌüQËÑ2ƒ à ­ê/üÞ5±7_pv,{´µ.%gKI¿årõµØ/F‹É~+XÏSà=gqÛ¿oäd5–I™šæà ‘2ñ´µlcßhF˜1ÁÙ‹ve{ùp3¼Çákœ)«œÖéÞTÃ5¼…j6“]¼t·}p^p_df~DÕnŸ}/>'U&¡¥ñ,þ<]3„æZú¤¶£J£á‘x>š Ú¨eíØñ&¹–*÷›.²›ŒüsŒmЙt¢S‰ðêpþ™&!º< ZÙsB*9ô;p=M³ßïþfŒŸk9=OÅFtªŸ!ëÃì Çò`nlš ið#u4”LjªªÍ΃²ýkUÕ´ñ|q8ƒJ®G^Š_¢Çë Â}b‡”»K}t"±5|…´š4;Œ°ÁPOb=Ò%¯ ˜c‡Õ³ƒ¦ñ´Á¾pèbŒV°E»Ô>£¥’äiÎç-óÚkwÅF§B˜F$Pu´ å“46)wo_ÉÓ ËoL¢Òeb¦K®©(1ò)îy†©qH³«¢‰¼ÓË\f:›6ÀÓŠ¤ñ]Ü»ô‘Âcv°Hþ­M”ùóÞÚXRä:<¯T¡a?RhT^þk#U‘·aËGÎü‡±+ÙFÒëáoNÝ~ƒê?â¡Ê%:`ýø4Èô}À½Ù®-qFÏ{yÅpˆ4Û]Fk]¯ÕÕ?Ë–ÚÊ„‚¬·r0[GbF]Ï2ÂZ¾šÙôKö½š]Б؇¬¢Ñ •j³5ï\•†fi´O”±)ßÁ«£PQ{Ò¾‘ïác?Èóæ´»Éô0a»lH>Lqºr‘„lΚÿú–ÚÍøëK¡é†5ññ²c¢Ì3@9®j§gYIÉöZ§[ú'<¢ƒóIc_õŒb/ src†»K£ÓNt=­®¢ù¡vu„‘—{ n Ù)wÆ{•™è<{ˆåíˆ4êøŠ’.·Ý®‰sAn‰ÛDÆÂÑ»B䣸 ÐψڟNOÒgðC÷Õ ÌÅê¬á°ç#y5¥ä*…ɱtíõ»^-ÀÚZDÌufvÄiÀðøŽMÇydï®´) ×úÞÁÄá?ð‘ȇóW\Þek>S kÅ^ÂQÎóáðÚoÖI˜¦Š’ÌÈ©ÒB¿ÓeR§?æ$Kœp׆2¢Q¬¤…}UŽTy<¨ˆ]ª"JÑkã«NnFA' ºNzÒ*¤ŽUmë–ì;|¥_Ä®à{Ô õîõ¹°õ0.‹Ã,à*1Ž ÿ+kHý£QQ 'V‹Ú£•m•ò%n£÷½Ÿ¦À*›å6xƒûÝî#eg5ºª®°[¬°Íè2š­îü~Ï®™où§à¹÷Ûzɺ¡"ÚMµÁ¡Væ¸öÊ(¶ºW¦÷xჲ#ü-¾*úøX­õçÍxªÐíO { _eaãÉû…Ó2âü®6Å2ÇFûfy¼–¥Ç¾¬,Ÿêñ•ybÛ»Ž`²ZéFª5Š€“ÅF&Ì·†»ŽÙœ¸¡ ù¾†'LÕæùPÍä‡þíæé äù‡·ÊÃQ<¤7§Pέ6g¶R•xq_ÏsÐÈyùY7„ˆ´¾ðÕ~3GgÈç‡OÜ]zÓŽ¶þAJr¤õOác?S³¤Ê­Êj^ÕÂÿlS¶lOj%¬X]Øa¨CÔN;+NH §+¹IN¼è\C,‘;×þp>”ÆSwÔÁÖùˆ`J!§À†'Œ­X×/ŒMÞ“f\8ü¾ø´­Ṳ̀q|2Ó±®µò•€¹õÇÈÓ¤.íJù1A?µísýCS‘<_CD®i§5ÿûË%ÜÞ–Ÿ_Ç­>/;ï˜oùÄ?f‡Ïœ`xÓpZ'ŒÇo‹ÜV¶*Ë®6s¤±xFÀy¸3™:޼qC5#Ên&½Ãâ–[˜9¿ œì¸®SË(Þ¤É$$òð$h>4®ÏŸ4±R1FúØë5‡Âš]Ýõý¦`ăhSv²œ,U= )\µ„r’1ŸÄ¿èˆ%kO *ïhÃZ2§³6¥ïAÙUã:ýˆ3in¡›1} \¬m´ÚLšÓ×fˆtø¥“Gߘññ+Q‡ÇÒWw?ñq‘ $íÜ ¢L ý¯C«6ÎA£ï÷ $™Õëu0§›?¦br„}È©;!ÈB¨#âTÝ'ÿü/¯f¼þàl µØ.H.)J³“º·ÙKS‡ö6ð`\Fy@d'x”ÛTù{îÎ` ƒfx0æ'AåR9þ>'|*DzrEa’d÷ýÙ K^%Y=øä^®H‹éet&½¸°Û-ã)ÜNÆJse[܇þ’ò 2|BÉ© þ·OŸØðÁ›Aéƒ>4@^€õ.qÑdÙ÷-yö¨±¯ú‘Dò÷Dñ®ö£–i¸qÓZl×µü4—Eãðuèc´§>w\Ò¯A<†ÑÀQƒWD¤†È¦I Ö¥êäž$àwU†.Ž”ñr‚ £Íw3ýK,VÍYRÜZ²«”&Ž{'5Ø…š‹Ÿà¼÷+Å¡°GñÖ–E”×õ¿í al›¼M>UU&ET± \kªCoÇåE£®…@F•CbUzS­‡?_©{Ò뱪¿!¡ê[ØÎRÊz]# ÏŸdOð|ü¤pV¯UWº°r+TBØúa9~㜛!¸5m+IêŒßu©ä©…9øšÎÂí–0Seh4TÃ<;•.jÅð¼}J·± ÷M]ä—,¯T8èÖO—ñ*W‹ëªªnP\ö·#¶žÝ ½­+ÜÞ­êhéE/±ÞE»¬!ºMÙô_ý T{‡†w¶sÊ;él'ã€öEÓV7ÇH†CX@¨öÆSÏV&†ø‡d–ŽÁ˜á¦M™g´L=i2@âÙ²ÙéDgÐÒ±©óV˜ºöº˜"’¯Ð¸ç<æ²Ð”—ÒŒ ÏÊFîÞÒéøƒÂt&±Kð+‰©ÏÜëò¯ÈxÄ[£¬¡˜—^ÃØ]’ŒáÕO;‡¸ È7ª °ê”¼ýöSÑà‹$ÌúÌi<ª€Vˆ)$jð±o­Ñ—™ ­mMÀFºÙ%ÒÝœ•W¨°Žœ„m¿àX¯4Z&ÛðZÍ s@LV½1bzÊå'Ö›YµÅÊÅšÒ«|}Äê`ÖŠòÞ jÂÑnSæî}HmŠ‹ÇùnZOÀ(dþœó³QQß0¨Øø:ù«péšJ Û.Éë.úõ<ä¾lè–áŠÛââ¿rB+â/Y;¦9¥ª‰WìÀvýp|}¯;u?e @ÆTÀFYÅ¥¿¢ˆ‰)Ë$ô„7/{ÅlJ‘Ž%Ç{B"ûöE5`¬Ç;;¶è2„LË¢Û-²éÅ/^° ¥t|·9­u‰¨ÙÄóM<< Jï*ôýQ¨¶QÑ®‘œ¡Xå‰Eá”Ãù>6Ïk2þæŸc}DíôÝí Š×e}§»iÆíñŠòI@Oc;ù4ÙÛ @»&"×ió·?9b;§#½bTÛÞ cž•ÒÜ£ï@«ÝÍØÉÎ|ÐëF\ÔϨ›÷‡Gê®êÔYWä>ÅsåUÑ(ñ¸¢+†P!2Hò¹D „ ’Â6M–œû¬Ç ÜðøÇ´_GÕÚ¼¾®íEþ<=-&7vZ;1vêØ¾ý^”ƱӦͯ6ï³»/Àý¤ºT‡¤ Ÿ‰Æ~ú¦vø³¹=µP–Û‘&/•y³µ<§Ui§gåR¨£ú¬Ñ’™õĵ€`&¾£YÕ6~j3Êø¦¹Ù–‰¦$’ŠÁÌ)S%–·cFiÛ‚5ØŸáWÛ# +Uf_þ î‹1„^¦ïl^B€¥`ªx"±§ÆÀ8…µ§u¬SµýÔ2ŒK±/ ²`YkÒSÔôk+÷g…¿Gi¦¸X;ÞvŠßy¹¦[Í#z‡^]/möYœk“zÁàº?iˆ]¬m5q+N½†¡ED *iÂiz«?“ÜÕ~="e¯³f]º¸Jó!²Ï1ö84š¼8ÙßS'#¾}!Æz¡x”ÖªÀÍGV§,1žI´Ï|}™g©ªõ¦§&ó#4Ì,5ª$L¬u®ÍõṠ{·Ð4™l1Ž›¾œÄ%}Éò¿$Ê Jïíô¢¡žZžÎÞûZ!VÁ]üØg§òöTQÅ[£^ÉbðÆ•§õÏbËqÄPcY.¦õ•8Ù›5)àÃG³jXeS#.l4Á6Ì¥…=‡)•3{Ë6ÁÊ ]mm2ž:®–§9½^´.˜]åf³[OÐÂWõ´vInÏìWd¯åVL˜ŠIŠí(æ{H¶æìÐÊ™÷ŸÂÙþQúýc•>±CÐåWªÀ¹ìWÇ•µ‰k=•U¶ÖºâL8ÕŸ\O{6ÜÔ—Ë›·¤ò«ý[´'I6F*þÁîå¢è~l½h–s4ÍE+Š›ÓÒ Ûen·?âÜOÇvhîrÉŠ `.TLÞù¶cCkÇÿ•JîG€Û»ðñé¶F††@ô¬d’†‹ãl‡ê‡w8/Ü}âè1Ö•ï ¶N|ˆšïô~/Â@ËéÃXI{ªŽ°Ÿ5MåÓñ7§ ”¯ÁkwÓûÑya¨.V†û¦.Ž K0éÉ7ë_­µP<{ÑN¨RüØò>¾pˆ¸bº¶Káx²l sk‹¬å¥€˜Ò´šø¾¾¦¸­[ðG7)ü¬^¡< p¼›Jt¦<ÂWZ°nnx2s˜*å#AÍ|\¯L·Ì)2Õy–R0))öE¤»!‹Äk½w~×ÂV)ò0õ^¿šŠ ›¦õø«àŒÜ¹R"„°p«•¿¦å ÛG¾ƒ³5Å&ò;Ë=Š9‡s!%dNZsTrÀª}´¹¶/=ÖÔ—Ü9dó²bˤ‡¾Z-ËSCÅjüi N‚VÌ ÄŸÄì¶#;ȺŸ{~Á.Gc2üôX‡×\©”gcjNwï!ÔÐ-v±`^â•£úôfÔËn,«´Òn,mý`âfúÀŽU“Ò•(’Ny™U Å&g¬Ìà€þÓÊÇtG¥æ~$Ð9)-ç¸ëÌùÒï4öZ# ÚÅÜjÊ\öª§òBãÌ‘šPrôÞÒÓïÒa^üñ›Û–q”ÀÓtçóñ`]ã5Žëa}êjG:$ÿ6=ªÛ<ÂLݾ¼ý8"–D4‰^¿ºAñ]YM«îgFïkCÎ1M_¨ò1Y–ãÉÍLR`K<ñ/ãAËz<›õc(èªN/=Ô:å¬í€Ö<ÅdŒÆ³Ug#ɸHó¡œ_}Ÿ1V86…ð¡å¶ž@„v7É])É4U±—^K=” ©V%^z©K`6ý6Áô†>Ø!ø6®d6$‡À­tØú …±1NþláÞ–ìÑ(Ù§¾ƒø¦`18‹w—b3‹RœçÁÉq#ÚǶßYTê~ôùìçÔõ¬|u8™ký8æFW‹!P/ës‘vúÐ1-€X­jÄV‡@P÷Ããàý>s¿+óÆ3 Û<®¥2}ê˜*Ú’t–~‹Ùóœ¶1* »w§--ÁÐ8AcË{+7»ûædˆ!<ù{Ð[Ÿºz—OáKº;·)Ci8Jv×ÓëRÙðÉ´*ºcňȅ1t1{I$ê·p!ùs¿\!+üÂeDJ9o»g[rK ª•q¢·O—üyÆ °œfêöðß—¼‘gÉ3EWkw /MQ[hŽûh(ý>æ8®]ÙbÌ<Ë•Vü”RÊ•M”>ÛnloÌ|²£Õ½ù.ï•ZªF)Ý>V”n‹¹Œ=-Ÿ1âïXç½Bd™sí*寃ì`H)uðå/ùîЭÑ)2A5©†j'p»¢ãcûžã7*·º-**Ý~>w"ÒCÙ+ýMÈ ó\U±WŠ´ÝÖ?†¿{,5yPöd5£˜=Óúx|T3F§T7ŽIÇн˜¯Çž¿âS€Dp\¬¶rpÎxv3H´RfofKá'€lz¶ÁµÒ)È×€û8?ì\´çm]a*)vl?R©^BÚùªÂúêÂvÒkWzvB#cÝœ¢ýdëѨ·Ÿ”¤^RÇ•´e! Ýz˜ù‡à­å´ž&’:ªÀnZkÎUjymócâ_˜~¢ÏÓ4à˜Ðœ:CØ“ 2ßQ“Äíc­ÃÈHŸXÊõw|ßàöZÑ(âèv„ƺ«+”P]Íç;’.ª-܃(¯Qr ?Ä“³J8éŒ8Ük“Ú¸7§%[>?%½†ª´6o– X˜V) _õA¶)e±¤j¶z·W¤Ž<« ñ-íO$1»hPºÐÇä89êb‹à!¹®ùë—t€e{>3 Ÿån‘þêaî·ÞîøÑHûÓ ²fÇ|b'“ReឃÜÁ„vd{'“W_«"ý´º…Û^•Œˆ‰ V*Pår¡3Â7MY°°v'˜â<‚+#H-ôßÞÛ ©eÛ”þò_, ØUŠœŒóQÚhâj>0t³Q´þܸd Úãçœ!ŠÊ帮UÌJ" ‘= SE#çYP€v -¬óˆ|/äô!-7¤c ÿG9Àa¾»f(îÌN*ÝM+sÑX³¸áz4cÀ‘v¡±Ê'­–N×'7¼FP8Ñ+ •¿[W^_^âíéèÞ&q~äÃ) E¨lôOîgv0ÝމЛ©Ç’‰d]åW’1Ym+°=æ‹À¯O˜µUç î+F ¶¡3ªb¤MöƒÆ¤qõ°¸ƒÊZ,¢óB˜‡óÎÊÓ,l¦—½«/> ¨,˺±4„e—>  ·w7-µS:冞s½ó¡9A¢OWÉÒtµ ÝzÿˆÏ濜QÎO{uª.‰Z0pȉ"׈rê&ƒ÷@pN5-´—Ù/‡EÛ—žÿžCnÃߡτ^^ V‡](™ÞZ%å&D—±Z ‘„ Â>D½Ólp±*³y–;ÂSµ¹h¥€çž1uÒ#êXØ ÄÑ/~"J‹jâ¤],ßI€sI|"–û|z{)GHl9½çk…=y+0rr)ŧrÛúN0¿^x±K|f S²>î6µmŒÁPîÓ{¯L¿•0oJ5E·ÆLâ9…ˆåd€Ú„ù‰Äˆ·ªÒê9sµD72Ë@y£rp†³¬,ô¬hóA–¾üV{s¥ŸÌ$¢Rï)ÍÚSñ»ø§ÂM†íEc)²×W©6$Š•íÅÒ5{âLOåM'õ·ß%4~µŽ¹êÄÛ5&Ad¡¯¼èÉíRçêCE=/. M ´y¯z|žNÐ$ОûÒè°>˸;õ5ôá×Û‰œë΀›Lgœ--Ì­“ûɵ÷êªñD½9jŸÏõÆsÃü“Þ Ô—€|W¯™FÞEû·œé„ñb…–ÑÉå6©ºc±:*J²_ÍÅm1”ñ¿ŠX÷ÿ…£ZAq€ºAHºÝ|SðCxÓQŠV7ÃHã”ß«bsy.o¶.—†hÒwh~Ï}ŽˆNÅß¼d§vŒdÃ†ëø¬0gTïû*úænµaqîE%ŸG½P»ÙÏQL 6§K\=Õsì°¤eZ€ÔóT< †)Pa9ôôùzœž:‘ >»©|¨è&|œè òÉM©õ $g˜Ø•!üp#£(hgäÉ Éjõ¿äʱÅ$îøøë8à"ñ-ònX‚NSf4"ñ[BYuHö5/â»vW€C³¿=E¼áO F ?wŽË*äŸâKé\9zkDŠÂܰ¼ãÈÖ!J\Nb‹á!п¤ô8]ò]„oz‚©ó ³ 8‹à»«¢›ÐriËÐIê©p¾…ŸúÀ)®Q·W_ßJ´ûquÕˆÒIpNÎxmMdâa6ºÙÂ7Ð;Èc¸¨46Qµtž¯/•£m7–²ß‚¡ÅÏ:cͤµÙgÉ4†œÅ¼†ÓDà_y¡!ÅŽJõÒË+Ò}3׿}\ö¤åeàG!BšL+«z5Þ#â^0O}õ-šBÞ®<·²RánL¨4W’Ý÷=¿j¾…B‰v·×zbÿÌvƳ!ÅÒ¹ÝÚ4âa·Í”|¤Uøø³™ný S'f°ÔIvÍÛloûè8ˆïëôòàSåz2Lþ@Ũ÷¦œãŽ|ïCxÚ¿–´ÕÓÌP&}Š:6Ϊ¨:‡50Ìvp| ˆ~µe³`ÏïâÔRxfevr¡c¸燧y2$x·±½nO†A*̶”=Ý/ý²ÈÆÍÆ—†7‡aþš¤r©7»ÏƒÒ&U &”¤Qÿd8DN´´"w¥+N_ùõÇ4ù½ÁªHê™Ú,]…{Iuåoc …`=iÊóAÜAÜr=½^ ÓÎ÷.<Àik¤Ó¼·3‹rªõ]á^L£ž:ÌbD A†Œ”Ä'‚|1Høƒ ‹î0ù FÛ†òr—±l.µ»’vihÿŠ» ÞÇp²;/ÁØeKÎo[Iô_âxÀ+aº ýü\þ¿ ¾´|*ñTǾøRöôµIXþ$e<2Gê;ÁëTTmP×2”#®x%‚—»HŒÝ3Âw-F¿®C«˜Œé¢Êc™Ç1éñ7Þí±Ï+];ô÷pZmIz¯÷æ§u{­ÎRKìsmÝJ~3;Y+•—v,sK¸Ræ‰øžŸÉùvî¡Ð­)@Ê᡼Ê}¤FÄ÷µ`~õ'YÑ0h\ºSmîâ  ®(üücúKAkÀhLà (Ú°¿™ÅÔE5áB‰¾Ñ! Böí¸2d2cÇr%I Ý6eSÙëÇŒüÛv„¿~mµq&ð™]êrÃ;ÓTÊÊxÇY ܨþàèÂÖç{/êhK‚ÆÎ…þJFãS7XwkÁ Yù—ö8Éÿ¾%,áw¾Øë‹ÕªIÒ4 W5ïÑ›Yä9å*ßB‘‡Ç«lÖƒcå^¼·ó l´YHÌýJ™ÈGu¯±vÕ¬'fàÏgn×ÿ”Aq@ Ϩ›ÜfÖº°íÏaÌ+”ip*!­½¸ ŒDŒQ!ð6Íe/šu’Ì…“n·þ|t#ˆ_šYKz0¹åâç‘ÏÆG)rRÐaÓ§¶{£°Zkg%³J±˜s&ª=ˆÌt»µbk°Æå#}>‘Á ÑpÖ4&ÜA‰¦Ð&ö4Ë+Ÿ«p‹T+P9äUÜ NæáŒeÁíDÜ ÔÄ–ŸÚÊ ¬gG]º²@c’ƒoÊ„`δ̪Çœˆž’ÎX|>è"üQ–VJ¡Æ/qŽ\³69›×¦C‰ã÷yÜ-ç´ Ø»î7–­³W þtvV}¬çŠØkõÛågb”_ûàáäãñt£ü‰%Ûv§ ÔˆïM|Wí†4#`]2ù¬=—Iˆƒ¢'Æ%¤ÑHͳ{U Àß1ÆqŒ™é"i…PÓõ>6éuäŒ÷c ¢ÀŠܶø‡__­8%^9 FëÒ1/€~‰tã'yhåÍëE'Ÿ\é=¢vR >¯Ieæue/ƒŽ«Ê×Â^Û¬3YCIM4ëº æÈÀWõ½üï¢?z“ƒ|9_Ït™ÎܾÞÝGdÎÿ%xßS#€…x±EI %t²¥Z~HÑz0C»Ÿ¶\pB=íüiÔ¾NjðÜëv>RW7³<:§U®»B2ª­Ò«)Ã%·ƒqúÔ¸ÐBÅ|K"/æR‘jzïî¬Z‹B‹Ó“ßO/{Pq­Èœ™RT†ö p€}²ÞE+ˆïܯ¥* Gb›°>²ù3†_o³\ ¥Žén²w;"â:«Ù‘Ä}Ï|ônya°¤ÍOœ‡@[_bÉ…f%ëO’Ï“&^¬²çjpJ!§åOæÒ¶%÷þã#ÖC¾Ð*XgPÐÆ¹q•òZÏìá)†~ìx7ÎÎÒtÝçÔv†;1¸7Ù±KTé³]h;_ZÝP¡B[$ÝÆÍ¹³)DzÙÞÃC³…Õ>¡Ù1@2¯r¹è³•K×e†#Âì´mX¼`k¢[Tnç3š=0Îg/[*B*ˆB 7ßÞ9HíÄXº7¨ÁWø+5¾Uä„›+ÑW"˜g€©ñXDÇÂfÑ3'qð õ(‡%ªÀšøg5cð5RV» †w†lcJ‹·N¸»*ÅcíÔiU|6"UL×¹ÒXt˽¹ƒá½lÞ‘>sa¨ò¢·ÙÆÕ~/¸ðç ®„¯”9c) ¬¸©¹ðîF:õÒӬѠ)˜.¢›/ùðªÅo;‰±¨ÚÜ>Ø?—Žˆ+²ýN=†¯±+df§¾$ °Sèo´€ªßþllµûm/.ÅéË6?ý7Nzš:¡ƒDä—Åè¡i Ð*¼ÓƒgR²`ÀÅi?àj劎vrõ0Âöjñà',}q¿ßtÒÿ ëµl endstream endobj 130 0 obj << /Length1 2716 /Length2 17295 /Length3 0 /Length 18843 /Filter /FlateDecode >> stream xÚŒ÷PHÛŠâîNa ¸»Ü‚»; îîî‡Á A‚»îÜÝÝåÌÊ¿Ùýî­:§¨æy]»{(HU„MíŒv¶Î ,ŒÌ¼Q9UU33#33+…*ÈÙø7‰Bèè²³åý—€¨#ÐÈL3rËÉÙÙ>ºXXØ,œ¼,\¼ÌÌVffžÿ´s䈹‚LrŒ€v¶@'$ Q;{G¹…3ØÍÿ}P›ÐXxx¸èÿTÛA&F¶9#g   Ø£‰‘5@ÅÎtöø j~ gg{^&&777F#'F;Gó4ô7³@èttšþH odü+3F$ €ªÈé/ºŠ™³›‘#&XƒL€¶N` [S #ì "- P°Úþ%,û—=àïÚXYþ1÷·ö†@¶*™˜ØÙØÙz€lÍf k @AB–ÑÙÝ™`dkú‡ ‘µ“XßÈÕdmd ø3r#€„°Àœàßé9™8‚ì@Ö¤Èô‡p•ÅmMEíll€¶ÎNHÄ'rš€ËîÁôWg­líÜl½þf [S³?’0u±gR³9¸¥Åþ“~ÓÌÎfffn6Ðt7±`úüª‡=ðOæŸdp>^övö3p@üÉËÉÈpvtúxý›ñ_„ÄÂ0™8Œæ [¤ßÖÁd Ù_Ü|G;@‡<{,æ?þþù¦/S;[kßâö—IF]KTQšî¯Œÿቈع¼8 ¬llvV'7Àç¿F@Áü[SÚÖÌÀóW¬à"ý_¼®·ŸúïÕ ü×–¼xfêß#®ËÌÁlþ`ùÿ<èªüÿ›ï?¬ü¿øÿ$ábmý'›úOþÿÛÈdíñ·xd]œÁã/g^ÛÿÕþµ²r@S‹Íÿr¥Àk lknýOAN w ©"ÈÙÄâÏÁø‹¬öÇŠYƒlŠvN ?Î 3óÿðÀ{eb>7œÀóø' ^›ÿz·5±3ýc¿X98FŽŽFHÌà1båàx±€Ñèþç˜míœÁ*pv>3;G¤?ÊÉ`þƒôâ0‰üF\&Ñ߈À$öñ˜ÄÿA\Ì&‰ßˆÀ$ù±˜¤~#6“ôoÄ`úøc‘ùÀ±ÈþFàXä~#p,ò¿8…78Åßì]ù7{WùÀÞU#°?õßìOã7ûÓüÀþ´þA<`I£ßlÓÈÉ29š¸ØüCï˜+“Õï"þ!ìü[ìÅø7k™X9Y9YüCea§`ìhd´š9ÿ‹Ìñ7ù¯uûÇË_d+ óäyØþ¡ÿ87“8";kðpþ“û›ßÿ1µL¦ÿ‚`—Àß)þ\Àkýð ÄHk#›é€s5ûí,arým„ã¶‹ã¿À"æ¿€ùæܸÀ‹€#ý]7vp},<ì-€¶ÿ’Ó@ÿ‚à°ü÷Õê_\ŠßIp‚s¶þc/óÁ…ûWF,`ß®ØÀžl]lŒÿ86Íÿø`²û#Øø•ð/68/ûßl°I{ðMmûŸN²³üMýoÙÀÑÛÁ7ò¿D9ÿ¤ì~w‹\G{k—å~Ì09ü6.¢ƒ‹3ÐÔøwò<œÿÏßÔÿÂÂ6ñ¯¶°€KñÛXÉ húŸ!ÿ?cÏöùÛ(øar¶pþkDÀÅqv³û—؆ËïÁ^ÿ|Ô8™Ø9þ»Â஺þ ‚Ãqû×Rºÿ ‚½zü ‚»ãù;f°%O ã_üçˆ6qq·ÇùÏ;|~ÿþó=ºMægíLø‚-«ƒ[ï*…‰Ü¶G¦(¶5Òh¼æÛ\Ðà“i*2Wo„“º1–6Å©¯…Hž½›jáÚ•Z½Ÿ â•'¶[æÆñ~Ž ×ô#¾ePÚñ~vðV°‚n‚ìøH‘ãঘ‡}çÖ#é^Ó[²8:»­´SÁ)ƒüT2É£­ðuš"×8k†€ ΙëÌ}úúf +{ì•äc<’ÏQ [¡—ökìýŒçr™*«S'!9¡61ô5Öð¥—È^ÊGü_^ÅEÑ«¿¾0Ó0BÌÙv剘êß0’²2Hþ¢ó½(2ž€àªÈßQZ½˜B8A]§­SØq4œ±É7>ŽŒÃ(V™ðœ¨Ñ'iV2ãÂÊVwÜìV Ò)w™ò7)f™;’‚t¿X¬ºð‰Ð=Õi6Q.eÓøÙU§c!=–·IŸB Ÿ2aw…Øô&KM³Òõæ¾ 9¥BÛ“þXü•Ê×qßA÷´v0)–Ëð£QÐÚ~隌Ïc§#´#σ"Q« 7I§-2€–DŠ¿Æ„7e,kQËŸâ»»Y(|Ÿ¦·ÃMŠšªâÃd”úµ¥¯tŸ¬ÿ†d’[\õCº<_æ›ú)ø/KÛ7m:66éÊs'º÷7gEÃì÷Y?_;Eo´¸–2šÍ<úœmçÀ͆õ¦3Ö^$:SzØ-‚×7ΡLmm?0Â…YŸâLZ\`Œvâã8c¹¶[è¤É [æ,7Ñ‘VÕ,# †¥Œ°S _SáYOKì­á¨²þ´‰¨;‚GKxìJ?Ú6J}¥¡KÜ™’¹Ò8a¡«uµbîiã·Ê¼á®N¤Aàn€¤‡µ’»žkA3f$\>åC¦YÃH©Õ¾¶»weÂÞFiÚ„€gùiHzQw¤S KÂ¥‘×i—8¬<=¸Ïƒëp+¾5.K™j[µ >¢%djÜË$À1“éÌø(ÒÓÌeØãºqå'<ƒÌ³Å‚ï€ÞM|~YãTù#êTÏä”(3OÒ÷ÏE!®ËÚ.­«Ú;dê?ÔIJÜÊïž® ßBµøÁmö¡ðêçA€­G#iº4dåŒáŽ*Å”×¢v>ÍVQ'°í8£“îÄ2økP§®“ëÿ†Aß22oCçgéyDl%OF[9ÊÜŸøbߺÞ$܇G šP T5Î¥/zT|øæ {tŒ9©ã pMOOüö!P}§—­Ø&ýõ;~WàY–€†}Q8ݦõl\—í¯06óœâ÷\?y•º„ê}'Ž\„¦ªÄNÕu‰œT¾%ð½¸ó!}ü^6†úÊ>.ò©ÙCpø%N_tàëâ^µžü“”¤VŽó”áÔ`ô}ÝE|ÙLKŠg³²ÌQh÷¾ý#¸ ø…hÇ£å¥öbæ>/Ö|•[?üsä&¤?ØD÷ëÈm~®Ôĵ\•H'ëóâ*xw¸0êoLÈcîº\¾Ét36<šàiæøP]p·‚`úñcJeÏóñե槢³bû›lQçËå5ìw°.{$úsE†ÄT×H̪~¹(0Ò^ˆ$!œ–¹„PÃn‘sˆm… -C½\¡„wýiÏípc‹Gؽ÷ ¼^E8ßЯ³›Ã­¥j[Ói.Rw¹ã¾›äÙhÚÒGÖ¼KZMEUü Õ½Ì èiR¢%‹<º{½Iã î+3{+Þ¾ò½]ŒÈym×s–ÇvÈ#W$ä]o cÓ™q‹=:æe>Çþyž;å³÷»Óžbv)_v¬“è\Å"kŸùó2Æ»KqD«wÆ!3º|\<÷º½³nÍ`B:2à}Æä}“³ç²y™Kxµ¦óClO—À¯y½dèöfŠ9î]Ä€´…ÞT¥¼žÇ&9À›uq½áéÕw’@„©ÝžÌ/²péýŒäG“D‰¬›wZ_ìb|:„ÓŠF±§Ö¿ÂÑÆ=›‹÷ßa™(›¦šC4ï^ÞgÓH`däÛyc»lé”màÜL+I3˜à’;U¤¬Á(ŸÆ<~ÃHaÜw=¼hÒãÏú|#=æ§ò ]!A4ÒBµÏ] )ù­3ùa`AöØÞI2·ò‰Ü—7¿à™YÙv2V¬c*õó­¾Ë>ð––£#Ë’P/L“Éþ˜Fy}(yûEÅÑò#ùùÙ š×æÕ+r~ßNQkÝ2=0ŠÃÅÕç°ôÿV6Þ’þþY²N±ay1HŸ]G.E÷¸1`ó+äuyxü®‡1g`A÷§¾ÍñBwX‹™4äq€%O½§y?cz÷Só»>ÉÖç‚ȼ‚ÂÅU´$a®G\ŸOÔ¿v½»ÝÚ0)ÝÕˆB5®6uµÆðM i4r\²¢AHÀŠçÍÞÊpâ)ᱚ)ï$‡Æib˜L‚g^’óÞ6 È:§‹˜;lý³=¿þ«•ôa"ÉÒ!‘ôH4{ýDlHlþ§´ŸÊb9Þyo)í«¡–ƒRì ÎLÑ÷Ú–#aØú,Ŷ_]÷ûSÊ/—X~ÝÁ) Úö‹}½'òç~ƒÈ2ÖõÚ9ËŠTùqW„ÄYÏ·É {HbÉ¥¦ ²'7Û⣔ ¤o^O?LqóqbQRÌÖdžRΗãuøJ*Ä1¿…ÌqÉØRJxfÒ6†3 Ó‘¯ƒF€ÿ.KÕuó>pE²¡y= z¶D{Þ»;ŒFœ‡‡œ³ø¸ð냼 X»SFû ¿Àõ8½´x9$èÜ¿ç¸Øá—Ãê#Û€³&6wúÙвÁ5¼D£—tZå‹=äm9\v#;@õÊõ€qd¨+<§µæŽefž­¤¼Ë3ñ©º”¾þ\„d¶±žâÜè Õq¤]MíM{± ™@N..Y³LäνRüŠÀÛ¶þ€¸‰ÌdQ¡‡Î8Ž€Þd^Ö”MïømH+aù2Ò¦ýû ùÀa¬©ÇŠ^©:Þ¢›èÜ%Gpü×,R=ýªÄ¬> ›ƒ;B)¸¨m ^Á2Ï‹qƃäßRPêWçJxÚt¼±ùpt›}í4ô¶Ò†r|ìù¥¸à‘1Õëû!Ú4[w¥ÈU ß—U®,*~6#—9BÍÕ*§cm`kˆRdš£‰(¶VÃA(¸:pâC‘»ã. ×6!wû.÷ÔÑH¨ð)ýB¸0tzÝAæ×•û-Š3yKÁóÕ_¨ÊAÑûB~ÞÅ2Š÷ìÂLáþU ë£YÉYÇŸ'O°ôS—q´·¤xòg{cr+|± “@Á‰ ÒgZ›Ž$¥h rU#ޝ¥¤a¦ÐÙæ#ëãþîô>Áô·‹xÇyŸ%¤lÅÛÞ5|Ö|'Fv?…¦—ùlMN‰Šµö˵QëƒOVN•±Ú£4ŠWú+ׂÀ9ô·É#x ‘ «à*¤¢]@4£/YO¿ßÕ–sö±'›ò#zäÎ|ƒöˆNjj|"å俀…ØË­w¥°Òª¤¨€W—*²ÑÐ(f"h“µéÆKÀ.ç¬ Ì8e,ósÓjK0ô;3‹žú(B/«Iñ]AfláçœÐDÑž,XLÙ²/¨iZ&VÕã°Äˆ×?|L¾r/@ÊŠzWõšQ´j•’ð0FÇ_Ô f\|†lFTÓùΠýPœ ¸9•f§÷yŸã!>–~£G¡:üaø9èlˇ¾K±€ÔÖ¯‹ñ²11Í5Íy{œ+ôö’_‡P¡!¿›¤Jæ®T«> ;tîè:E%Seº„cæ‹5Ý´‘ØVˆªFktΊmµïZͧߨʋï òì)`àO*Ÿôôy­X½Æ°l“Õ®.Pº/Aqq©V¤ŸC¿ïÚf=\³G )ÄÓBàc»NøLsx²Ù¬Í}¾`úy]\QS–MXk€qéÛ±?.iv/yTŸÈžH_Xu PÄñxG‘»Ð¤·%ž%if;°èïõSùmíÅC¶, U€ 1³aó{;Öö5øSEX‘Ѥ¤ÏvÁ^7ºcu.’ï- J©?y2ìY«K]ÿ³+ÿÅ/yElï<áþ'É7VÃÈŒðŠZå?'¦Þ)ð·´‰(g¾¥)ÿfW¶¯~PùãLåe‡¿'0ϨWéK´‹'s¸L±ò€+¤­9_¼×w×k«Ò^¢“ñ-ß¹Û!ýøˆNn¡•–­›†™Fê¹7ßÝÏæ“©ûH(5µ.ZʹhK‰.˜OÝi†ÅOœE;ÜøÌÈX8zôtÌj¬×ö´cv †¥cÍñ>Í8¹­©ÆP–~+Òn|¦ ‘*' u.¢Ôsæ5¢úvsÜþªÌ|3÷=§v¬öq½«~Õ*|‹8ä­##M}²uíMnr¿»A5þ;Áp¥r 6ÖøÏÔÖÅ›‡¨Ä‘;Þ ¿Œ$Rv'ôSÞ~WÎRÃM⟮Ú{TXƒmÌÐëþÞ- K"ôޟ׉vÝ%s‚Ñw]^Y`8»6 d®d0(´ kûè XÑÒÜPj@f>'I$CiÓÓìÜèÙ½ÿTnYb‡üËý«'{C ‹Õ©)ºSò'·b]wTíìnèZÔ}ÝôÏÊõPDy«“GgcÖÃBÓïü3B.—vºëjÉaŠ+ÎFÞG uQ5xM~Õ`ûÊX[Nl«‹œœŸ$zªÕú1i² ¨än94¾XPr¹\–ÂH^©ï!Lw±õÈ=Ýo¬ûvë‡d8ï@1‡UCAIRò÷õ?NÿJö™$8»³X©ûµõÀסÜ/LñɲÒþ!tT”Ï8y]LŸÅ¸èш ë¦é¸ºU‰§aÓ™ò²}óYò$€ÛÑ‘ Ò—4*ß15çI\å#kA™‰!ýˆ"“ß;l<º#z XfÙŸzÏsn§­S™ÝR^‘ØdT7î—Æb°Ê‡è–ANµzžÆ&X¿- Ó£0.„±6ÏZ"á’D ¢isÞ¨ÔYS˜ÏmŸ{ñíSÐ/ KÛžF%†r5Œ,}r5œ³AGê ×̱h,~NýàˆWÕÁÄ$bQ¹’=Z#7Ù™»£@‰@ƹ&'é.¢WÍ•ƒcUX~RÏf $ßõ©@q­»ä$Ä£y¹g¢&/ñ¾×¾µ³ †•Xg"{ þ¨×÷Vzü’[);nÒAI8.e›@³„€8V±4³V›[Lþ!ú%£É(ß¹)zi·g§ âÂuqé×ê‚¢Ã[qryE}ƒù@Óû=תƛ¯dèªÙ¢:€—ïâ6´"·Éo.¬«TŠ©×ú=³@’||ò2ÓÎuN%xi£¶ÛɬP´^qÆuþv•,Pæ}W*öL: ö ]ÝäaŠñ^-C>ĸÔÈï¤a2v²*-©ò3ïn,-¶ÄÎê•ãÓ Úƒ¿7½Q¹Øß‰ ÞmD ¸(Úž)Pá~„!‰$-I¥ÃC.u“Ç[­Ý 0 7ÚIèæ˜%é~KhêÖ ¿¯A¡eÑÏËTøá»v1pZ¢ËKþ}Ž×ä±Ï  —Ç9vš¡JCHÊš¡³v -!Þž’(¥Œœ‹õàôdžÏÞœ¿ @+äŽáâ³šææ£í«”®ƒýRÒ¥E45}˲Êë´±UD °JÝæš.ŸÕéÇÈJ( >}#þ$;\@ÆîºÔTØ=ÿÍÕÿG‹vß5),ÒöÌðÉ㪖ÐldŽ—ß°ëjs<]|Ô¨<­^âHïá„I_–fó]dm$q‘Ç*ËËð0™ƒ:ìXÔô _/P³×¤í‚ Uhkµéúº­¶ŒQÌqÇðçøÕšÛ¤†V‰¥ò"¬È¸p kBdYDh³Ÿ;‚r{þyË´F]˜)Ñæ zºÞpÌ4oMµ%wG“¶”Eä›~EeE‹ÚÍ@=»1‘ñ9˜i\Ŧê#|ßd&Ç4· >­0Ò¸Ìu=°a|ÉYìd2úâÅÛaJæ/üÐ@à:v§§è# FK oå>Èw•kåϹ:‰æ>EÑ<ƒª¯É:!m®—›pGt2¬nSÑPY$gá~»•­HyJ=î•M´shþ˜7®?›ßÿŒØS00ä}\ÕL}djÕ¿ý¦ãˆ)wt©9FÊ: Úaì#•[™ÈI¾ó÷6¢¯þ©~_Ì– ªr WM¦¯šQ¾ëfÊÐ^2¥`>Öb|oDHo5ÿTÍ£}ÃÏìº%ßpõNCF ÕoK)^ψƒ¬SŸ¡\h¬ï½âŸï@”ßIÖ£?6ü‹Ò;Ç{?ÎéÀô:¡$POÒ‰…¹í8³ °Ñ &œä…t”¥žj¼ 6ÒìÎüüCÚº®y7õìïö³ oZPû»¼M ¨š_híÃêSül\2Ÿµ§ Ÿ¾À×’ÛV&ˆAñ€÷‡k!ä*ö3DˆDªðgø&Fañäw;œ)qèçåEC? G”Äð…ÇJƉ©fm‹8aàŠŸ%'7É×ÄF®Ht”Zv¹øåÅ8ÓÌy+ä“‹}â¸ãFÚ\}ò¶´5M^HsSPH.œyî;0\Ú(È4» …ÛÃr‹l|¬ÄŽV»ŽÝ.µù\À–ya+œ>C¹Oo§9Ǹª¤û%œ¸8²?6Ùʾºöc!Ñ6£®ToãÇVór[îRœÖ‹gK·»Tº×¸ò[ž² ÞêE4‹T#F}+ä5j€áAxU¿«—´¯©-6?´º}r·•ý)þ:chCÿ9³7|#ã¯æ™ìð1 {÷סÖ/Õc…²ˆêÊè™)^¢)°Œn{?G]`9relE–:OÄZòº•Ÿ1€X•ñ!<Ô¥ç{…³ìª*œ{ §R9où¢)-ˆ %ª¿Ž.àÍcœÂZšxÙ>÷Jí¨ýÂp°åYŸªÉÐÆ`Ø.†sSä“)-h+y˜OÖ¸¢ž:o*ue¹E¢W1¤¾1NªÒþ™ŒÊÇgðš¾+ºB·å´ØòG¹â[S5„™ßê–œbgËã©â÷‚rN_zÞ6†Dkæc ¥€´«_(PÔ H2 tÇü#—/69“„|n«õ¹ODÅ Þ“0³Ì›.ø'ʘæ÷.L‘up…¾ÍvÉÇ ç{]‰ºä!$·D'—EœÖEu‘ªMÚÉ;g¤Ÿb ‹ó™Fìy00ªB@¢îφ&6íõ¾¸èÊFM’u¦q±æÂ[|ãGn푹$~I² × ÖϯîÂM+Tí™g&™‘ xƒ|žýS5íÌÊqBŒõø1€îø³F'j¬÷(”?W§!’ø Gª SÍÈä‚$H`+wŠÛáq –X´\“x³©dæj/#ź":Zr*h wZLÂni½¨ãšSwiñ™BD^M5d…²C˜˜u*/ö_$kAÚËAjMsÝŒ)±ì0 Í]tRȰ¤ý™8ȳüp§ÈDUHÿµP¥8×zÿý¸Kv3ÈëÓîÀùqá}÷dâö°ÀWÿû F¡|WdïáàØÝHú‹¬ƒZ¦ž]æ>fŒu‡vèaÛ7û«+yMëÌ=Q~ +JeÇU­±*fRN—³Y{[Ò[jCòúkíT”Î6Þ7)‚²t;¹%ô,? M%GŠjÀè/Í_õ1§VÝ“axÚšE$[–j?ŽW{‘¸Xëå” Ë¨˜n¡Öô²|]y'š•´Ìú"ò®N{C×çgL_tšH™™– §·T´ê}SÑÏDeÇþ×Ü=¸«£ÒÕ_æ–ZCÒ™¼'‚‡ V‘ýïKØo:Ÿ©õÕÛG¸Gx¥¼Ré¢ú.ÑNûq»­4äýŒy𯲊·¾p©+g¸3ϵ²¯B ªÉRGb¤þÃßÌ0æµo:¾jü pƒÏ¥Ý¢MF_cO‹UÁhüª–R|_RE&µ¬,÷HÊÞœÌñàW[ÞážÙ§¬ƒQ„ÅwRöf€æçôžyºwD†å,îIW+N·kp·•‡¦ëáa#i@i‘g¶Ð%l žqÎ-ë2&Àöa^o#çÕGfWˆ7Ôv¡Á{wZ¸ß€Û‘²qëùWä§Š‘$ß®Ñ%Ão‰ökÈDš?Òº'°Ž†ròµWìQž2i*ð0€Žv<–¼zù¦²;ï*; *6ËŸ°úÓ–‘WT´×÷ ñÈyßÍqÖ‚vjBå’˯¸§ôR%SQÞ·´ÞÎÊ:u~¬Òï˜}Ù°›–IþŒ²¬ž$Q¶\iµÃ$*°ŽÎi±¦u·}Õ0)Ê ƒùfø2/ƒ¨sC6ôÄðöt(! g‘Rë^y,YK«:ƒ’Õž8?â}~½¨ 2¦¿çTß*16…|6uÃèM«f´õˆE/%ÕÊ›.猆?©â˜@Y#ÂwklÊÏ.nß3¸žü‚ÛÞ7¦Þ¡Ï·Ý…¯)Ü%… :³öÅ´+@)ºAaw…/-Q·¸Ï0‚Hç–øÉ!†ØÖ€ªKã#Ñ‹˜‚èõV;ç|7åaß÷Ð zHÞšf¿Æ4û+rX¢X4“’¡¤¬'Ò©y œg:-®Qñ<Šñ¹ª‚‚¤IªCØBUð–Ú‘‹§UŠW?—¤ž¼<ŽG|CÃÊóë¹;( IÉ!ωÃÓIdº/(ÁPJ›_Ûn§˜»G¾!ÿ[Àì•uÜû­5…ò¤[‡µ†ùXй§hB†o–¡WGx‘ÊxZ‚ö™HYKO* ñгÏů&Ä9Â5Ï+‰ðc+/!’nÉh᜺°ŠUnÐtWß„ Ñ§jð—ýöp_ÝöÆtMðL8JË[÷ip)rX¶[^wjÒ¹û½Ñ)у §Sà·(*Ÿ–Ö)ršgrMEiõ„hž~S¬ ƒvÑ"¿yGýåFêŒ5 —ÞX{—ä´ÂY#ì¢ö®÷2Ì7J2DÒ‚ ¦Tpäöª£UoØŽE¨¯Ú-¹¢.{úg£®Bý9¦fÃ$3R¿À÷°‹ýH’@×m~nø˜ö láã./1&€z}1ú´–êeÑr*å)Ó·oßË £Úæ‚`GÀÌ`žò5„ú³o:Ó¡Ò[ŸÕ'žékÎÁŽœ çO&c‘W ö=W ^úèpwh©×ÄÍñM™(Y3ßìÒ““oj¸F›1E†!q×rË}Yç Ïð {Îvã¥%ï+v$Â9®LVAÓŸƒ?õ 4¶Ÿ í ;MVyýwÂб í´š~Z~Œ\',‚Ð'8e6 ¢0:\“3¯KÊ‘îòô?hkR‚ð,k)3Õ2R_Ež,rä~ljM5ä75HcÝ¿ŠÝÈ‘øFÏÃnbÆø–½Ê?¿›£5”3¼öC+Ýb9û§}ÆÃý3}ߤD×ûS½2ß|™GwóVÑL T C*‹MÛW©–ЀÈÅOÃÀwÅS¹¹kAæuR£½Ú‘ø1¬‡¶-Õ<ðŸìê<œÑÎM {xtX -X¾Ë#_ëá&šêòõ~CõÐ`8ó.4"€¶E$ÏÙß|YíÈ_`©E„¥Ó &Á²ŒÿvcTE°û%Ðmc|y[Ã4“f⥒nv&|†2²­9älÞ¹ÛwšÇò³jp–¬%ÞbÍR¤"1~¹OÒ³ÃôWW¥ÝþŠP†¯sìm«û\¹ Ñ$Üg]^½‚Sç %Ù6Ë£ƒ³_\ÞÀ¿S·éô6·ÍQE@.|À«ýAí„pY§íE sé–ç·!âR©ôì9ß°çd%¦Ä”7 …C0œ®ØM…çÓŒ¨eñ`¡8ÿü…|aœØfæðàΔ©eüIÐóR:¹EÁ\ú ¾üÅËõ\4WXMšÓÂJ×Û×w¶ö#ÕƒŸ÷1šÙémêñÓ°Œ5‰ãé¿°å·Ù¼Ì·²ÀàÈ}É\ýi½¥A¤À¯Aýáµ>;…Ž'Œ VR("/‚›³ï=ónFRiÄŒ:oγš6E²«˜0nbt(Äÿ¡N¾ºöb¸.îÎKß% —Ó„–ÝÅwËc•¶aô‹U|äM´c¤5’WòSŸkï§«c|ý*'è¸:ZevòPÂ*J ÷ÓƒÝôͳ˜ÚfÛ_èýç>‘ñ:o$«ŸP”Í×K±ã±óšžA¦›T€Qh–ã™LÉìæqXl æJˆ å™e’_*…jÔ+• &â-Ê`zsVß̃ù`RáxH¼ôA‘ÀéüýÇÎyiË\;,»R¿‹Éø&Û¶X hVV¤”hÂËÐ>œ~Öãnu(Û¿!Æ£’û˪©„gßðY§çc*—‘1ȱYhôS |›µ!ÛJ¿¡):U^¨É 2z rªüt´¢<ÕÂñ»•ˆ¸w¦m‡å†÷’O7½ÝÄÄ|¾Õ€áß#á£3ÞÐÇ0A¸6›°“a¼­ñó‡v¨«¤õ}åËœ‰Ï‹ Ê…©†f£N´¢Š¨˜VϨôtª¦b6B6çW*}·%r ÍéÁöü(ÿ…ȆJºoüà‹Žø¤J•™Å%€¤(xOm7²Èm}/…Knúü•­‹þ‚bÅX  Õ¹4ÜÉ[šÌŸÈ\áêz Âém¾!A–çæìºÝEúr½-Oâv¦-Æ7SÛó}BÄ‹TM$¾äô¢g¯8Ù}ÏOìTRMÓÔ¶SXØQÅk1ƒ\KòÞ)g#œ$÷–vúŒ#¬kíšK!/¸ã£Þ9âü‰É¬áx…Š‚ÝÅf"Yïä&¢Ì†ÓJÈ äªü`vꉸq™ŠO`˜ñä÷ˆ–8¼z Ù¿*S‘h3Ãv{ìQbœŽ•‹qñ´î´‡ƒ’-EŸ×o†$å_?ûµÔÖ4²Êñ6‰5¨ÚÏ'XÅFœÁaî†APu»Ÿ³é¥£Õ__y%>A· ×Â(øÓs5wó뜓SMS(†úûáDq˜( ÚÙ{ôÌó_xËLÄ«a‚bäy[Ô{—šFˆgohªßÁ’¹óéq#ÅbÇZÕI˜]Ƽ˜‹ð·1 ŸV ‡DÌd+&·ûˆÉEìÞc­Óÿpò“ ê7¦½f­–>Q•ÃÄÕ|Rì=.¥"©ý®R+FpKn‚¡€N ÛÚdЊ©@•§=fá©ÿ•×|f…è´Îá—jõIçÍy€ëíÞ­7­X¨ŸÂ8*ÝYšØç¶ûL.¨Ðc÷sÄ Öš¼×öÕ­:Wšùó´iìHrë 8Wä«#™8w碢Eô¥ËCo¼n[Šš f.Ç{3™"!úQ¸fŸjÃ,´xw–S·½†ÈNNFïr÷ßñsï´ùôì–Ñ.Özß'šª*":ëµD‰ÝG­æÉ©è|S¡ƒB×uÛÞgÊb9î&8’!C¨™åD­¼JcÖo=þðZm|÷‹ß›•x,}c<†îBÚÊe|í?ê„öX›HV!)0­ÜjÔ`?ïhˆÏ%½]—ÏLð}:Îu™Ï(uó _D˜ºÓ)Ü©ï!`ÞÓJl"…M@f!ƒkè>™÷H¶®VK¢?[ëBÇøbÎo$@E~‹koØ~êÓ×vׯ¬p<ÉÙÇü­R%n£Dm±;ü‰Är).€×JŸ•°!Èþ×¼YÃÁ*ò9ãˆ=8Ì«ú~Ø’S(¿Í·ÔÞûkzhTbW²ÛÌû&0YeôÆ.~5×èÃ\„ÌQO-ˆøP[ÔTãÁGÆÐ®l¨õ{|n‡Cd7Îw^ÑðŒ¤ªª!HÓ›èó9]ó¤ŸÈøÛG÷1k'5åçSÍ<3ÊŽXL >ŸÑ\j©'¡u}yrài«»„G‚>Û0[7@ß×(‹Ñ‘3Šëù»ÓœÏ5v…\©®÷è¢~°¶ØrÏpf~ff\.Æ1‚nORÇ×!Y!-©¸€3Qÿj‡ë,Â脬voXþ ëc#¡wÑÞäþ>eÞF¥ÿµïãûŸIv]dã4¼U$f6OJ‡ÕxðF:í4”ºkáÚlƒìcƒñó8Z ê&ãjYã1`ÇÏJ|ºyÂìëpy­=âò„ûÎߌ!pºìyˆ_|ÑñW¡éʶÁVФ£¦…8Ž…ØˆÌšh4WœsåÌÞ—âë‰1~¡›ÆÌ}H·˜Ú‰Îl?M–Þº\Æü„#BJx ßÐÍB3èã¿-úTˆ„¨úXÎRðÂqba?^¾[ïå²[ÁÎÒ ‡ºäó«¡Å\°¾²J¨­Gó ¬2½ÏzÚ Ï§>‡Ëm›L6œ¾ œ0.ËM³\áõáMM¸¹ëì™Ô_•Êѯ¸±Â§ƒmÞ‡À‚zˆ<üv0'>‰$ï„`þ$(›møõP°(óTìçk2¥É·ß‡&·¿ ïàÍ;ŽhÑÎZ­ ðÆQ o­Y³î±Íÿt4t±ÐÂ\ä®Áa°^)gS$ÚzjåýŠý*DVWŽ-fcÃýV ¿If®1Xl!¡‡/A’zHLŸ<ÝâwÄ–OªŒW³4tÈ¥ÿ¶2Ü©/ÆÖóVè Œ¹kÈ#±Jè×·ŸÝˆ½I,‹¢SeyÞ´Õq®üÌ2çmÇH É ôƒ˜v7«€4`;¼³Ð}º¨³j)¨fZ˜WâFšÞ!Ÿ=÷rj­q!\vÅ,îy\`ÃçýôbdÀyÌi3Rø=?ÞGÒ~%ò×ý‡Ë#d¨Ë½m~ì„«ðÔâ*H¿à˜o¥Ø¹>™íuד¬ý¡¬Ž ˜¸µ>é¶ç5ù´,Wí UÓ#³ â¡ú¿}vÁ¾"ÛÜ»é¦@oÃÅbQlm|•È®¢TÊ5p*]‘õC šK>ÔÀFæšÁ}T™‡§™,ÛXŸyÊ}Ñjö!ÔÇÈœÉø˜ÍÍß-JFeéY¦tÈïçÅn+Ë“-œ™òÄb%!óh• ^É/'~+qR»K-’Ρxül}7å¹4­jB€ ’ë[Ü &%.¤"á…‡°b‡îoÃåq‰s8¾ÖP®ï‹Ù ^˜åFâªL’ Ô| – wË<[“™%l²ÛÞs°‹®b‡Ìc$¢·´Xú:u€ÂÕ=êî´…ì“'æó(Jþ|¥Éíõëea6^`C$O?ÃÍôøIµ5E§Õy.erNmäëÏê.V9-9$•JOh‹Òš bà"øÜÎx³{fèÄïÑ+U©CWq¾¼'Q|$õeÀ}ÿ8ò+ßpZ|Œ,”ó‰ñP£šfeïÄŒ6£qTÕ²pØiK‚¶LáI·¡Û^ŸÜg]CŸ·%°»ÖÅ㈬ƒ¿üÄ7:Ùô'Ó= F¼¶&òê’+µ&iðÜåh@Ö]ö‡U\¸±b¿ ¨|á±Ôƒl.©¼<ñŠ‚¯‹ãÈMs‚Á©v%Áá‚B 8V¶àZ3ûKf@†ù–êƒåMéS†ÎHp/±°2iyÿ*è G>»¤p¿û•¨+’c½=9ôû4^á{2Ðøð<äà÷NŠÌà(2Â@cÉü¥Ÿ BzÑ‘ãrÏcyÃÙõé;b^åw½†‹;§7”n ÒÙ¹Ô!4QDÒÖN¢ØÐÒB˜Ä1(õ%¬*Y°Æúœí?r>)0ºïî÷ϸ¼CbC›’зÅ1/…pdoÓù4ëAMÚA\ÏZ$Q9"Štú\¥e•{·˜ ]Þý%ûº<&‰×<Nÿ vöM>¢þ–ʆ¹Ù¤Kj‚¸uܪ¦çÁnÍ"A™Ê ‹ÕÔXQêÇ€d¦ws{ û œª(_yHÞÎÚùΜó‰‡à!öÈZ>-±òõMrÓ`é+(§QìDÒU„¦[wçÁ¢=@ ¥Ï`W÷&!ޝo»sõrÃúyLdœYâ|îÝžå§íé,+ yž‘øËPA–i†Æl#δ¸Û\.·šïÝ¢{T|˾€Üð8 [†!aŸá`OÅsMd©ø‘³:é Ú¬]/­…6æ€?ùê¦#3ä³öLz\O£|¶ÂÃÉYkR+„.BÙ%cR@”ä¨+`"aÙf5pD³[üÈÑ@î§^ŠæQÂ'LjK¡‰‡|My]5¯âpèÍ=—Xfp†ŸžD«"pš—‘lql¸Çf´Âðl—2Î^í“"í¸+'7Ÿª¿¾§R¼LiÇ]9ãp±‚ O&Zàlì’åÅg¾ÇTü™i.³–)‡ÜØÁÆú®ïÒÀT‡Šñ@bØÔÉ÷æà³×í}cn" \FÙ}xÿÀƒlãS9Áçð:–±Z‰¨éûðÌ™ r¦Ã¡Zž½Îeø‡ÁpD_Çk±°wž˜BÎéå·ä±ùW?ň]n!i˜Ê]ˆ¿|˜ {“±ùe«­P£Í+L9AÃ#,9Tk† iÄ÷E›£ù]U¥r í¥êœ8p-Ï1ÑÉïñÙ­U¶¡·„ßW£µÃÐ#5Й㓌S :|fÏœ›âὉp‚-Ä–E¿ä±6C¬ã­¢ŠÓVÕ/·7|ç$ 003ž¶JtÌíež2Ȧ¼É²0µýƒðŸÚ3ʲÃêœ*m<ñЬ²äJ‘Ä·ëÊb7hM‡ñç òöж|ÛOsÙrÔ™qÑR¶ÞPqìÕ”#š¨Â˜«èu}ï­˜ˆm…@èwÊÖ|fPÜÞ’çxBÀ&ÎÓ̆|¿)i”Ì A ¨AþÊœHû!mj†ÂP¶yAýZáË]kLœ[±[½@3eùÅ–&á½dV¬Ç¾Í’¾ï*>ºBŸÂjkõ‡7Aº]?üˆ‘µµ áÒ²v¡Õá½û£Ï$}f¼‘Þ§SœwŒ¯1ÉF0~X‹Écñ'’i¯ÿ²[ +Z@r^ÚR¯Õs2ö¢")ün*/Æî ­UÄ©Öc¼Ï‹–+¬ úÈ4V;ÜdTù¼Üï¾o8UR¿ ݈c’h¬¬Ò‘–ùJÁùæøl‰ðt†Ç#qjÖÔšu0CÂSvíhô(ÞJ²™O Æ+O%X„|½¼ôB¨I샪7½tŒ+‘ h-5G¦È8C|:ç¶@™ÏF}r¼ÉïIè¿+'Ö ”Á7SÎÝ0)1ð&pÏ**¿€I”m7ÌO×Ú`#(—ó9º™’rËEY¥~¶þŠŠ"xîŸÃÚ½.Ç@”‰;iŽÌ¡»'Ìë.1üži[‰3@ñÝG»ŒläcR(”Ér{mŠ…qìXý¥;ö ò†Òw’ Pƒp†ÑÛp©g(êXaª1CüæÜ^þ #¡øaš½Vé‚Q²›X;(ëÕKB.iæ7°{B½[üC(³¾ÚQ¢«œØ%å½Ùvã½2ãŽ#XyX;8cR•öv†ldž#‡.‹Iã»AçOµòû9| ¯<ï†üHàÃöÞ>N†¯Ä¡ã»Ši&›³°û<¼~füâ²ÝáVÿ0b²u 4úÂÀ‘³}EjÖF¢Ïm³“¶;Ãâ¨z=»mTA ª2HÂ×ì@û†ãç„Y„¼°l³‡@Ru"7Q½Ú¯è0ø²q? ý¾Á£Q©”ù‘âÉgçöŒÂú¥'m3h¤`¼ñ:M*'¥ˆŒm<ÞjœÓö–=íÄãHÌS+d1aHþž¥—E4ĶƒY°v1î ™ƒ¨Ç?tB<æÂÂ^°¿÷õîȹ‹Jžž‚ ëG÷ª ®ß&)ÁÕõZ4’æ^Éi4I„ )»KZ_¿õ9˾o¬„å¯oÙ½uÌì&Œºu­xótPFœÍ(”v°sÃ#·PN3®õïzWH,gXè³j{›ƒ»yNɾ ÁÀ üY½¾†HWü±ïÇÊX3Ëꦋ•Á†cŽÅ¯¬ÁãujµO)OG¼˜YVpÝÔH¡ý_PÔüJyálnþ2øòÒ†Ýûp0ˆO[~*7ÏO-p™nßɃ‡c)©'ËÓ>Ñýöð¹B‹!Û†$°´!¼ÓÝdaŽRÖ¢@Â{Óîë(­X%)Nù›síÕg’ÂLd0ˆ Ýâ\©ìÒ0ükœˆd­oªÒõJLÆ—kº¾&—}à±ékÁ±ˆ¨ÂâÅÂõY×ÌM#¯§eÚÀ_Ó‚c3Ï 4¨U Ñ4=O›¾JžÌµxÕáÇ\Žy *ù”USî®K+Ÿ+ä}€àì¼ ×®Èwí:´†›°Ã<}Ùkt"o•ÖpS°LJià‚ìõÀ„ ãÞóüƒÊ>G;õ^nôJÊôBº•¦éý¹.DúRÛü[Zª›e†M~Źtxºhcl3¥‘c‡Kéec.oôéxr“ÚÖÙZ äl´È•ÅÛ®ÏßÊ£7rüE;ÄsªhD¬,.=õš#Da¡^âë½0:³ÇÚgDµ„0Bt›wrjŽÂàZësM'ÉÌT˜ÂT{¤ë ’å¤\Ní:Q‰ú¢Œ[ ý–¯ã"±{>£ÔÎZĸuÒ0¦ŠÁÛâ¹4V¨©05 @a Š_P‘ߪ \az,ÿà–×ËÎi”eßÚºÃ×´¾õõFr&’¼* z€ò»Iºz+ŸYvTœ4䋹K=oúMâû·Ü¥ìv&Ú`V–NÅ”tcAõ]¥ši 2‰¡©op2§K²ïÕrzq|ûïuçD›±êó¾‡/‘×PÔ9Êá@WOK£\È V»~£^L÷¯š…O¢®ÊdÎN[úø•CF“JUÍ‹ÿð“ÎÔáƒÜÞàÕíØ =MäZx“úiëe߃µ¼äÞwñë«ñËr«I|€Pà‹™ª»ÒªÔä[‘y?*[öOéõ‘fžL5‚y3d:ÝäöÂm,ÊäÞhg¶2çΤ‰E¨ >4ê˜ÂÀ¾(‡¼ÒíC¥uLÒ¦dúOkd"öÕL$0n–zkÝq%fÍ{qÇßhÍ슜NE !©ß †2 áÞÏ|”ÜhíÀ³t y2$x;ˆGnã–EøC0R|JUl·™ªºëäÐð#T:(âÚe=ÉT²ÓÒU¡RñëÔ!C©÷e,b^ǹ®´Cnw"\\óDYv7›i]Ã8¾É\RÔ:þ yj›ÿGìÈ-ãÕ}3ÞQ(Ù œJZŸ+ºS*‡š ‹-ªT–ba(Éò‘qÂx™&‚––Ã;¼éc¹­}.æd– §¸’(“f'‘i™ØU-,þßhÇ‘nÓÙ&°ækŽX ;vJþ¯kG†žg ÕÁN†4En’=Lo„ÀIol-H1¥…ÞÑiO}:R¶Ú±ž[ ÷‚åîN²½ñ˜Ð4b´rËŸóÓy•­fíFïÒ&Ïš*~jÜñ–ñ¸³=hªŸ¼RH¢ÿœ#ˆÝw¡†™f¥Ðòa –¡±¿Œqz[™Çž˜†{ë¸s3à4ñPµÔrô(\#ÿEQ‚=ýªŒXª°9©g“ m¾õ¥BÆjĸbS—bÒ´˜ r{­»ÔŠò³sû™Å‹¼*·™t¥.óqËtÇY‰/rˆÅ™Â¹¥g†F¬òdNøÄ(|êÏlÆLAi¥Á¡÷|]Ü­Ð/†‘Ž– šøÚÛ$á0wµÛ·Ú/k>åyo?œÓmÉOëú‘ œÍH¨-©l¹ù…ÑU×4Eö ›[Áž‰ÍÁ&Gve[¤ Å•Ð$ðßvñ—òévI¹¿ç$Ä'¨ú»©çOó7üt)9±9šCo³µó’ˆH½e4ÉÊnœéîk¤?©+ÀQ‰-“àlžOpl~SÎáÝÏ »ÍÛÊâª>0hÔ‘_ƒ:N”²HË%ÔƒLéãZ¾-«%¯&ÄÚ©³Ó Šh%+ ±|OÖ 'fQG¸É”€W-…†.kJè õVìpª6‹Ai£åŬTõE`cWmQäȾ£†@kbEƒõ¨Í ‹”J·wœ£Ó_ ]ïð2÷àKSDšcdVÇü¢oÒŸœùª23ìH¾~ È~0‚ͤô|ÓcÀû¬z7`%ªá58þšÈ&¿ÌÊãèëN ›šo©#ÇTòêyáþÓkí1c^ÄõcâÈ,§è©ÇŠÞ}cA7 ŸýIK]ÌwMk·k’ƒ'Ó§{­— ÆŸ„k×’Üë-á\o¹"G;I‚%ŽJBŠG7‚;?˜ÖÕlá9Êß‹§Ó™íK©Íá Æ‘Ò¶I|'eÙòˆˆö)oЧ¯ÿ1îë3æ„Û„æjŒÚ4î núÝhòí…´¤ ‰ÒÔ“1¦qQaÕ¤Ê-£ùÑÖ ¥¿¾?ã<~n³‚/Âæï=2¡M“4¾ã¯ïˆ{LøÎk‹d]3|x%Vfk¶X,ãÑI𵝂¥œæ‡:¹n†ƒVœžÞÄUA¶xæqÄÍ‹ìO†+R_vóé¶>,Ac´=rZçÅëM_‘““¤’ àT²?†QôjÓ‚7’©fÍ.cœhR\<•O¨,~“<(tÛ[ÜܬÎöó7ÇûP’$«¥É_MÕ}0®ë¸‡æÛI¼A}Ýñ!MN+±®ô^óÍìïW£ü»kÏÞ~6Þ®Óï>Nf¬;bÊC-Ö–©™–c“UÚÐït˜œNÝ …“<•ùZóõ÷í8±ì;á} BËFÀÒÑ­‰ÄŸ_®úX0úÉ"»j6Æ3î\ܘ‹ÉMÏ€Û«DLùNôÀéeQq)ßè)¶dâù?´ÅY\²Ê¥¼^šzæmí@Éë+¨XùýÜß -í·jdåõÅtfÎ8öéA˾ØÂIêr¢ógFcÜe„Û,èÜvS e»ôo?Ög[º™ QJÌ"qÚê†!­/fM²¾®vcT*vÌ€ŠsnÐGÆ\˜€ñhbÿ°¼.øù1è èm/{8ËJ/›†\<Šá]ã È¿®Ñ®œ=Cp>áo›ÂùÌÛõ&ÁMæ‰s ÷½µç擼§Wô©[*rdWsÂY šñÊ ¨wÚÏ7üdð›j`Öf+íTE³|ƒ7Ë d[n†_óÑçpà° ”–›l‰p7þ/ 8äÑû­eÒæ*HŽQø- :«LÁÏÖ½ê%~”McJø3¿M=êKŽº€òu¡C˜kð"åÅ<ÙÞ…çi†c'¦ߢJ#È`’ô¾‡ë¦IÁë,8ªGæ¸1}x®lT¼U02Û$}00ÿœ8ÖËb‚`ÃdÇ‘†ÿŽ‹…ÿx'‚ÔÆ `d¦ñ÷lóc#”0íܵ#²Ô× ‡„<«&l'íù$-ℊ+r¹Ë„\¡/ï‹C] i()sû/6#Ûÿ±Ž$Þ`[oøçºòǃY’ó¾c®%–8‚ cÔ„/ákÔ(J‡,â Œ³þ„[ Á¯í×Þƒ^¼ô/+*Qñ!f Ó‰£b•Èp7„ˆ6 .Ò‹L3\A|œ±sØ!Ñ×þÞ+Ô¶¬ÈØßô(ty80÷Kû™—º•ÏǦr+` ý¢É„’Ï»sȰkŒ®x Ý3èN#~Wüâuðòÿtªï œiÊi”:}ÉOÚÿ„-ð$£úd·( P| ][©#qä,ðóÌ ?®Ï•_ÿ§œèu_ñwsëñ’—æÓê:!.}ŸÙ}xvr Uì¿Í/*jÿßóèMy¨bÜ=>d&Ô:dŠî„P{$¡¬~.Ïå[N9 µ´p¹C‡%_âÉœý+~G,‹¬ÜDN1óuD4ÕìÙá¿ÚëIÔO59e=A¦oFÔsêÞì“ñööÉUXàJu°‚ûL7X ùoɼeV†ÁG‰u<€ßß¸ã¹ØÖ¹üy(‘$!&Ãà!Ÿ§DÚb¹f}ŠÄ,Ñ1@¼G>ůH‚^L‡ñPz£V³y,`c÷rn•ÿ/×µ×Sõ‘¢/Ef&^Qò>ЉÔÄáq ”1ÖìÑz—ÝT›ý§ivY³›¢ÇÜè9ôÎ3Q¸ÅÑ Eø˜0–Ò{ oRã±›UÉ[pó‘š èsk·•/%Åï¹ùR¿0Ô廚(!ÓŠìŽcŤ$ET¼-)©‰‚‡?Ì›ˆ—5þ\Þ£`ïa^¯¡†–ž¿V:˜Y8Wt’T ê¶+ŽšÚ“ûh¹õÉÞ1–ž?Ö±±Œá=6ì¶~Ãj¡P›h)¯Õ|eý¶ è,™Ôj›Ò ‘Ï-W`Á´> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qØmUªÕ^!1ÝH ¤í¿__‚—m ñóøyÆÌÝ·—ÍDUíÎLÂGÎ^͹½t¥™¤ß·§àî.kËËÑ4ýc*S³ç'öÒµåÆôì>]gë¦î,yÝ”‡KeFÖ×$mÞëÆS°»3¿&åq÷GðÉîRúº™pßêþ`I_Î3[d·Eæý4ݹn›'&9ç¶7UÚaãL)l:ŠÛ×MÕ zØê!YU—ý0rßåÑžo>ν9®›},—lúj'Ï}÷á4>Óç®2]ݼ³û[ivjs92V+V™½íhýÿØ ›~éñÊyû8&ÝX®²­Ìù´-M·mÞM°ä|Å–E± LSý7—ЊÝ~¤&–Êçø U´ –2´XÆ(p‹m“¡¦ÂÜÂÂ∠ËXXœ(W°8X&˜LR4â=z¨Åu«kTÌGEåïm7hçáË8KÉc`Iu(à!a <#œG´Ž »>ÃÎn-tJ!]O2Çø`œúñãÌSŒóø#§¸­'œâ,<Ø“L€%q¡O8\Ï€™:Žó 3ht ‡,ª+à9­uçgŽCwËpÞDÿ‚|ŽOžRÇɉ#ɇÛW ºmè—’®1NÃwH=8!õ Á éŒ4ôDCp&q"p¢œüBCT/ôŒ9ñ¡!ɨ~Bü }ÒéîRqÒ‰óTÂçFIŸúܨ™ÏŠ|nTìs£Ÿ¥|neEA¼;~æó¤òÛ<©â6OšßæI‹ÏyÒòsžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçI§>O:óyҹϓ.|žRîó” Ÿ§Tú<¥³ë¹_¾û¥ãmÂKz}öÊK×ÙÑ=·î¡ÃW7æú"ŸÚV¹{ÊÇÿŒž‹à/@̪X endstream endobj 133 0 obj << /Length 741 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qØmUªÕ^!1ÝH ¤í¿__‚—m ñóøyÆÌÝ·—ÍDUíÎLÂGÎ^͹½t¥™¤ß·§àî.kËËÑ4ýc*S³ç'öÒµåÆôì>]gë¦î,yÝ”‡KeFÖ×$mÞëÆS°»3¿&åq÷GÈÉîRúº™pßêþ`I_Î3[d·Eæý4ݹn›'&9ç¶7UÚaãL)l:ŠÛ×MÕ zØê!YU—ý0rßåÑžo>ν9®›},—lúj'Ï}÷á4>Óç®2]ݼ³û[ivjs92V+V™½íhýÿØ ›~éñÊyû8&ÝX®²­Ìù´-M·mÞM°ä|Å–E± LSý7—ЊÝ~¤&–Êçø U´ –2´XÆ(p‹m“¡¦ÂÜÂÂ∠ËXXœ(W°8X&˜LR4â=z¨Åu«kTÌGEåïm7hçáË8KÉc`Iu(à!a <#œG´Ž »>ÃÎn-tJ!]O2Çø`œúñãÌSŒóø#§¸­'œâ,<Ø“L€%q¡O8\Ï€™:Žó 3ht ‡,ª+à9­uçgŽCwËpÞDÿ‚|ŽOžRÇɉ#ɇÛW ºmè—’®1NÃwH=8!õ Á éŒ4ôDCp&q"p¢œüBCT/ôŒ9ñ¡!ɨ~Bü }ÒéîRqÒ‰óTÂçFIŸúܨ™ÏŠ|nTìs£Ÿ¥|neEA¼;~æó¤òÛ<©â6OšßæI‹ÏyÒòsžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçI§>O:óyҹϓ.|žRîó” Ÿ§Tú<¥³ë¹_¾û¥ãmÂKz}öÊK×ÙÑ=·î¡ÃW7æú"ŸÚV¹{ÊÇÿŒž‹à/znªb endstream endobj 134 0 obj << /Length 741 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qØmUªÕ^!1ÝH ¤í¿__‚—m ñóøyÆÌÝ·—ÍDUíÎLÂGÎ^͹½t¥™¤ß·§àî.kËËÑ4ýc*S³ç'öÒµåÆôì>]gë¦î,yÝ”‡KeFÖ×$mÞëÆS°»3¿&åq÷g1Ù]êC_7î[Ý,ç«ifkì¦ÆÜ’Ÿ¦;×móÄÄ#çÜò¦JÛ#<œƒé ƒMGeûº©ºA ÛAZ $«ê²Fî»<ÚÃÀâÍǹ7Çu³oƒå’M_íä¹ï>œÂ‡`úÜU¦«›wv£ÌÎl.§ÓÁ@ãÁjÅ*³· ­÷Û£aÓ¯ ^)o'ä RU¶•9Ÿ¶¥é¶Í» –œ¯Ø²(ViªÿæZ±ÛÔÄRù_¡ŠVÁR†Ën±-`2ÔT˜ÛBXXQÁâ` ‹å Ë“IŠF\ ‡Bµ¸îbu ’ù¨¨ü½íí<\`Gc)y ,©<$¬g„sàˆvàÀ1a×gØÙ­…N)¤ëI&âŒS?^`œùqŠqþä·5ð„ó Bœ…€{’ °$.ô çë°ó SÇqd­‚®AáEBu<§µŽã¼ñÌqèrxΛˆà_¯ÂñÉSê89q$0ùpûJA· ýRÒ5fÀ aø©§'¤ž!8!‘†žhˆÎ$"NN”“_hˆ ò…ž1'>4$ÕÁOˆŸ¡OB:Ý]*N:qžJøÜ(és£BŸ5ó¹Q‘ÏŠ}nTâs£”Ï¢¬(èQƒwÇÏ|žT~›'UÜæIóÛO:öy҉ϓžû<é…Ï“V>OZû<éÔçIg>O:÷yÒ…ÏSÊ}žRáó”JŸ§tv½3÷Ëw¿t¼MxG¯¯^yé:û ºÇÖ=txâêÆ\ßãS{Â*÷qùø·Ñsü$î© endstream endobj 135 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH ý÷ëñ#xÙö?ŸgìÁÜýx]OTÝmÍ$|äìÍœºs_™Iöss îîò®:L;<S›zœ==±×¾«Öf`÷Ù*_µÍð`É«¶ÚŸk3²¾'ióÑ´ž‚}Øý»ù=©½à“í¹ÙM;áà¾7ÃÞr¾›f¶ÆnjÌ-ùeúSÓµOLg~¼À8÷ã ãâþÈ)okà çA„8 ö$`I\èÎ×3`çAfŽã<ÈZ]ƒÂ!‹„ê xNkÇyã¹ãÐð"œ7Á¿ _¥ã“§Ìq âH`òáö•‚nú¥¤kÌÂðRONH=CpB:# =Ñ%8“ˆ88QA~¡!*ÉzÆœøÐäT?!~Ž> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH ý÷ëñ#xÙö?ŸgìÁÜýx]OTÝmÍ$|äìÍœºs_™Iöss îîò®:L;<S›zœ==±×¾«Öf`÷Ù*_µÍð`É«¶ÚŸk3²¾'ióÑ´ž‚}Øý»ù=©½“í¹ÙM;áà¾7ÃÞr¾›f¶ÆnjÌ-ùeúSÓµOLg~¼À8÷ã ãâþÈ)okà çA„8 ö$`I\èÎ×3`çAfŽã<ÈZ]ƒÂ!‹„ê xNkÇyã¹ãÐð"œ7Á¿ _¥ã“§Ìq âH`òáö•‚nú¥¤kÌÂðRONH=CpB:# =Ñ%8“ˆ88QA~¡!*ÉzÆœøÐäT?!~Ž> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvH U„dçCâ°mUªÕ^!1ÝHDI8ô߯Ÿá-Û@ãçñóŒ=˜»¯Û™®Ú½…œ½Ù¡=÷¥¥?w]pw—µåùd›ñÙÚÊVÓìðÄ^û¶Üڑݧ›lÓÔãƒ#ošòx®ìÄúždìGÝöa÷ïö÷¬<õBÍöçú8ÖÍŒ÷½ŽóÝ4s5vSc~É/ÛuÛ<1ñÈ9w…¼©Òö†`~ÑÁ擲CÝTýE Ûƒ´@HVÕåxùïòäo?‡Ñž6Í¡ ’„ÍßÜä0öŸ^áC0é+Û×Í»¿Qæf¶ç®;ZPÁx°^³Ê\Cçýyw²lþÁ+åý³³Lú±@Ue[Ù¡Û•¶ß56H8_³¤(Ömªÿæ®Ø&ªrT¾„¯PGë ‘¡Ã2†wØ`24XXºBX8aÁá ‰…ÃJû‚ÃA¢`R¥Ðˆ è¡¡‡^]wqº&j9)*ÿìú‹v®`‡ÆRò°Ä:(à!bx8ápŒØ÷¹ììׂN)¤ï‰&â>0Ni¼‚qFãÆù?ü‰SÜÖ€'¼ÂYðàNR–È}Â{àfØ{©çx2­¯AÃ! …u x‰k=Ç{ã™çàäàExo"ÿ}žžRÏÉ‘#£¿¯xÛ _J¼Æ °B ¾Cì©bÏ8!ž‘=Ñ%p&r"àD9ú Q¾ gÌ‘T†uà+ägÐG¡N—š£N8O-(7ZRntH¹Ñ ÊŽ(7:¦ÜhE¹Ñšr£1+ôè‹wÏÏ(O:¿Í“.nódømžŒøš'#¿æÉ„”'³ <™ˆòdbÊ“Q”'³¤<™åÉhÊ“1”'“RžLFy29åÉ”§”SžRAyJ%å)]\ïÌÿòý/Þ&xG¯¯^yî{÷ úÇÖ?tðÄÕ½¾Ç]ÛÁ*ÿñùô·£—"ø »s¨s endstream endobj 138 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°ÛªT«½Bbº‘ A!úï×ãGpÙö?ŸgìÁÜýxYOTÝmÍ$|äìÕœºs_™Iöss îîò®:L;ü2¦6õ8{zb/}W­ÍÀî³U¾j›áÁ’Wmµ?×fd}OÒæ½i=û°û7ógRúx²=7û¡i'Ô·fØ[Ê7³Ì–Øçs ~›þÔtíœs[(Ú:ë0p ¦l:ÊÚ5mÝ_”°-tB²º©†ËÈ}W{X¼þ8 æ°jw]¦lúj'OCÿáô=Óç¾6}Ó¾³ûÏÂìÄú|<î D0,—¬6;ÛÏúþµ96ýÆÝ•ñöq4Lº± MUW›ÓqS™~Ó¾› å|ÉÒ²\¦­ÿ›KhÅv7RKås|…*Z© -–1 Üb[Àd¨©0·…°´8¢‚ÅA ‹å i‚É$C#.ÐC¡‡Z\w±ºFÉ|TTýÝôí<\`Gc)y ,©<$¬g„ àˆvàÀ1a×ç²³[ RHדLÄ1>g~¼À8÷ã ãâä”·5ð„ó Bœ…€{’ °$.ô çë°ó 3Çqd­‚®AáEBu<§µŽã¼ñÜqè xΛˆà_¯ÒñÉSæ8q$0ùpûJA· ýRÒ5æÀ aø©§'¤ž!8!‘†žèœIDœœ¨ ¿Ð•ä =cN|hHrªƒŸ?GŸ„tº»Tœtâ<•ð¹QÒçF…>7jæs£"ŸûܨÄçF)ŸEYQУ.Þ?÷yRÅmžTy›'Íoó¤Å×Ozîó¤>OZùO÷yÊ„ÏS&}ž²ÙõÎÜ/ßýÒñ6á½>zÕ¹ïí{èžZ÷Ðá‰kZs}Ý«ÜÇ=ãã?FÏeð‡†§y endstream endobj 139 0 obj << /Length 740 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvH U„dçCâ°ÛªT«½Bbº‘ ‰B8ô߯ß{ .Û@ãçñóŒ=˜»/Û™®Ú½…œ½Ús{éK;Kîºàî.kËËÉ6Ã/k+[M³ç'öÒ·åÖì>Ýd›¦yÓ”ÇKe'Ö÷$cßëÆS`vÿfÿÌÊS¯fûK}êfÆúVGGùf–¹û\b¸à·íÏuÛ<1ñÈ9w…¼©ÒöÎÁ|Á擬CÝTý¨„íAW $«êrGø]žÜIÀâíÇy°§Mshƒ$aóW7yúÔ÷ÌŸûÊöuóÎî? sÛK×-ˆ`ãθtJ!±'™ˆcøÀ8õãŒ3?NaœâOœâ¶<Dg!Àƒ;IXô ôÀÍ0z)rЃÌ@« kÐpÈBQ]^ÒZä 7ž!‡î /½‰ü òU Ÿ<¥Èɉ#“ÜW ºmÐ/%]cXß!õÔÀ ©gœÎÈ€žhŒœIDœ8QN~ACT/ès⃕QøŠøôQ¤ïRsÒ ç©…Ï–>7:ô¹Ñ ŸùÜèØçF+Ÿ­}n4eEƒ=zG~æó¤óÛ<éâ6O†ßæÉˆ¯y2òkžLèód>O&òy2±Ï“Q>OféódV>OFû<ãódRŸ'“ù<™ÜçÉ>O)÷yJ…ÏS*}žÒÅõÎð—¿tx›à½>zå¥ïÝ{ˆO->tðÄÕ½¾Æ]ÛÁ*üà3>ýcÀè¹þ¤C§~ endstream endobj 140 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°ÛªT«½Bbº‘ A!úï×ãGpÙö?ŸgìÁÜýxYOTÝmÍ$|äìÕœºs_™Iöss îîò®:L;ü2¦6õ8{zb/}W­ÍÀî³U¾j›áÁ’Wmµ?×fd}OÒæ½i=û°û7ógRúÅd{nöCÓN8¨oͰ·”of™-±Ï%æü6ý©éÚ'&9ç¶P´uÖ`àL/"Øt”µkÚº¿(a[è „duS —‘û®ö$°xýqÌaÕîº MÙôÕNž†þÃé{¦Ï}mú¦}g÷Ÿ…Ù‰õùx܈` étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qض*Õj¯˜n$HPý÷ëñ#xÙö?ŸgìÁÜýxÝLTÕîÌ$|äìÍôí¹+Í$ý¹=wwY[ž¦ž©L5ÎöOìµkËØ}ºÎÖM=ÙëÃP7ò{=,éÛyf‹ì¶ÈÜ¢_¦ëë¶ybâ‘sn yS¥í6ú`z‘¦£¸}ÝTÝEÛA] $«êr¸ŒÜwy´çÅ›Ï~0Çu³oƒå’Mßìd?tŸNãC0}é*ÓÕÍ»¿•f§6çÓé` ƒñ`µb•ÙÛŽÖÿóöhØô[WÎûçÉ0鯂t•meúÓ¶4ݶù0Á’ó[Å*0Mõß\B+vû‘šX*Ÿã+TÑ*XÊÐb£À-¶L†š s[ ‹#*X,caq¢\Áâ`™`2Iш ôPè¡×]¬®QA2•¶ÝE;XÆÑXJKªC kàá8¢8pLØõ¹ììÖB§Òõ$qŒÆ©/0Îü8Å8ÿ‡?rŠÛxÂy!ÎBÀƒ=ÉXú„óÀõ Øy©ã82ƒVA× pÈ"¡ºžÓZÇqÞxæ8t9¼çMDð/ÈWáøä)uœœ8˜|¸}¥ Û†~)é3à„0|‡ÔSRÏœÎHCOt‰Î$"NN”“_hˆ ò…ž1'>4$ÕÁOˆŸ¡OB:Ý]*N:qžJøÜ(és£BŸ5ó¹Q‘ÏŠ}nTâs£”Ï¢¬(èQù<©ü6Oª¸Í“æ·yÒâkž´üš'ú<é™Ï“Ž|žtìó¤Ÿ'=÷yÒ Ÿ'­|ž´öyÒ©Ï“Î|žtîó¤ Ÿ§”û<¥Âç)•>Oéìzgî—ï~éx›ð’^Ÿ½òÜuöEtÏ­{èðÄÕ¹¾È§ö„Uîãžòñ¿£—"ø ›tª” endstream endobj 142 0 obj << /Length 741 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvH U„dçCâ°mUªÕ^!1ÝHDI8ô߯Ÿá-Û@ãçñóŒ=˜»¯Û™®Ú½…œ½Ù¡=÷¥¥?w]pw—µåùd›ñÙÚÊVÓìðÄ^û¶Üڑݧ›lÓÔãƒ#ošòx®ìÄúždìGÝöa÷ïö÷¬< ƒP³ý¹>Žu3ã@~¯Ç£#};Ï\‘Ý™_ôËöCÝ6OLýwÀè¥þe:ª· endstream endobj 143 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝ۹׬“B|Æœ‚>âþ)þ;ëvÇw%gÏçáí4Œ3‰ä§áô–’>\ ‚‚6ý§ã°¿ õEJ™€õØ7ûÆ8ó 1¿’{Æ~ºðÏ`W(-ú¡;]¾è·Û%=°ùñýxŠ»‡ñe_,—bþ+-OÓ;qü\ÌL}œ†ñUÜÿI--=ž‡·B«•èãKª˜æÿ¾ÝE1ÿpÆ[ÎÓû! Mߊyuû>Û.NÛñ5K)Wb¹Ù¬Š8ö­iÇ[ž_®¹uÊ•MúÑzQ­Š¥Ò)V†€Ú(TØ€àx¿àÞ¢ žjy‹°°!ÀÐÔ•µZÔÀ2àP="¦ZdÔ0\ÃG©R\¡·”).–2*ÎШa!„U¼Ä,†³ÔÛHð° `+jÐÃ.¸5Nα@èâ°èÐVK-àxŸ%ô˜Ü3š% A°YÓ€z¡ÎšÔ>kP#¬³¦õ™5m0W£oš¦Ã¾žj­®§Üý·.†ÐZ¡ŽT$X/©)n)æ#W—„o(æ“oÀRZÞ $K¢p4’ŽZ¶-bâ\­1¦Ü°Jä æP"Gñ‘XÔQ¬‚i/8ºkÉ^€ÂZqŒ:ZsŒ½š9”d š­Bù Ž)ßsLù-ï7½æx˜ÏJ›¡¾Ò`¯ažÉ½)f¥É$†µ’1™¸ dÑŠcªCZCù<£7Ã3JÊgózÌnøþHȰíáÌYÉšäTœ¯a…Šï¯Æ,_»œ-Ÿ—Oë87Ë}êÛKÔ´Ü—Ll¹oKñšò+Êg­JÌâ.¾GZyóº‹Vðc­48¸’ï¼äØWtù]Í:P~`áŒñ±–rZŽq.nÍ1]Ç ÇàSÿæ/©ßP•ýïuö¿7Ùÿ¾Ìþ÷Uö¿·ÙÿÞeÿû:û?Èìÿ ²ÿƒÎþ&û?”Ùÿ!dÿ‡&û¿1y–¦¼ÍH·œn5þ¹ã)º½ÝyšÒ“Bï½x#†1Þž´Ãþ€]ôGoáõñÅ×Mñ?®Xê endstream endobj 144 0 obj << /Length 750 /Filter /FlateDecode >> stream xÚmUMoâ0½çWx•ÚÅ$*B²ó!qض*Õj¯˜n$H¢$úï×3Cð²íh<~3~Ï~î~¼ngºj÷v¦9{³C{îK;Kîºàî.kËóÉ6ã³µ•­¦Ýችöm¹µ#»O7Ù¦©ÇÞ4åñ\Ù õ=ÈØºñ8‡Ý¿Ûß³ò4Ö‚Ïöçú8ÖÍŒø½ôí>sIv›dXôËöCÝ6OL xû9Œö´im$lþæ6‡±ÿDŽÁü¥¯l_7ìþ–šÛÚž»îhãÁzÍ*{pþçÝɲù·¯˜÷ÏÎ2‰kA¼Ê¶²C·+m¿k>lp¾fIQ¬ÛTÿíÅT±?LÐØAù>J‡ë ‘¡‹e .1›ÊPbéªpqH I$\kL¸8HbØŒShÄ…r =ôêzŠã51Xò‰Qùg×_¸sµ‚2¥äÄ’òÀ€+Š Ä ŠsˆC:CQŒ}.'c-ð”BbOEðƒuê×+Xg~Â:ÿ?aŠÛàj îB€.U ±$,ð¨›ĨA¦ˆA 2®‚žAÃ%‹˜òâ%Õ"µñ 1ô9h¨M„ _®ñ¤)ELN 1éÀs¥ ×þRÒ3fg =傸aîCÑYj¥ VÑÝà^¬w&L˜Ó=·° ½Ð3â„nqFyÀDŽϠOLüñ5'žpÏZx?iéý¤•÷“^x?éÐûIGÞO:ö~ÒÚûI“‡4ðÑíˆÏ¼Ït~ë3]ÜúÌð[ŸñÕgF~õ™QÞgfá}fBï3yŸ™ØûÌ,½ÏÌÊûÌhï3c¼ÏLê}f2ï3“{Ÿ™Âû,åÞg©ð>K¥÷Yº¸¾Nœ0³`Â^Çayî{7)q ã„ÑW7ö:©»¶ƒ*üሟþS`õRé̯ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 814 /Length 3722 /Filter /FlateDecode >> stream xÚí[[S[9~÷¯8»µë~«ššª!ÉæÆ¹0©<8ÄÞfl“Éì¯ß¯[²}|ޱ}™Ë:RKêþúS«u0ª’•©¬©|¥¬¬B¥¢A­Ò ®Ò>U*TFéJ«Ê8´èʤXÙÊZÕÓ¡òm© ÚVã}¬Œ®"ä­"Éû*¦TL' fŠ•Rx0˜WEYaM¥µíY…o*«+e”"-g¾1Þ’:XÊb¼ÇZã=s°šÃøà|e!¥ì9ŒOíÐ@JU¡KKtº€ï˜*GS¹‹°ˆW•6P٣݄XySi []Ä·÷=yô…ŠP3UXZ ØU@cÀøˆÉÆ%,«”&È„oëÀ„…z˜Â¨Z%«H€9[aico„œ‹øT>† ^1Á@ž ”©B—IÐSZgTKØ$]•`ªƒ‰L‡q‰L¤v˜&±^‚©žžIEø#AeÂK‹ÅuIöt ³)€ ¹Kb5N( •Äx¥©B ‘ëh…(-ù˜FbÅ# •Š$ò=¥h:‚MUJIš`*¥™$kµá£J4¸äú x ú1}êa– †ƒ„,]Xªðáäèhúgú àêæââS—¨Í¢¤3¸²¨³²Ÿ°s7Õ¡7SÀ&ÛOàÑ&¢Êö¥ÚH]ßÛ†Yûð@EÜÉbñ„Ò¼J”-u j^×Ä‘"Cœ·b^®#æ©ù”†ÉUd&æs"ôéùXϤ¢:”“ñéÑpV}Yöö+q<ü>«z¯e‘ŽMi/µŒ¶“HmÙn&­“u*ö×8r¨• ‚~‡'»|Pǡݨ[}€º¦pÒôß}cBÓ7ÆÝoû-6¹ßb—¯‘õ^÷í7Å7­›È:iû8§6’µ6öØ7òym¯Õý¼âÏ/p¬[ÛâÈýl[~¶÷ó³õ›ïA»d›ð­7’52ö½Ùl^í}Ÿü‡lâ„õõŽÀ;ÛÞé{ï¶8EÝšóƧÔWH57‘µ `*³-˜?ŽtwÓ˘ñ~`¦ÍYÜ–˜Æƒ™i#Ye?xÿP`>èí}X¿UªçSXï6géªlVÙvx¸+Xw%è&(AÞ ” 6dÛ }ÐmZÞ÷ó~ØÔûÛzGãb+f„x?㶈aM0!ô½RÿWjÇÖÍ.š{íŸîñ¸ž÷)³}zŸƒ[27¨Ì­ÚÄ~ÊÉ/×¹%$’Î2Ké\âòMe4}S¯úª´[®{nçú§ÞGϳå2¹ˆž\•H§h•àZŸè¯Ï³§ÐÇmßÈ>½w²e„’¬½K@KnŸÏ*qê~,k‘t®Õ¥¬¥YsÉ+Ögȶq}v]Ÿ2z¡EÑ~V¥Ì-ÙºHW¦¹]Qꎼ´A™]ã" ì-OBF&IˆùĦKþ"‘è $˜ë9¿+ÀG’ˆØUea¥ØÓE .ã•5÷µzÓ*zÿ”';)uÜèTÍ›¹µîc/ý¢%û¢Œ\Hg Èvë¸dßÔ{+°ŠÞþõùS?„:(EoOØA| ó=#9*îÍ;¶£ŒFql@<14&(æ;—E"ò¾EÜ “4‚S¼w­ÀZµ¨óú,c%±%—yÆz¯q$?Ÿí6M7)Ëœµ2¯U—É-ÁR< ’7i¶7 x8²80ﳿéb܃gîkŽ©6ϚǗ4ïNöPY!Kr™ÇôZ‹W¼R ×:*u›r ùŒý¶x*x/Úêc¨5{.{¨0§† ϧÕÂc…=f>Ú{ÒÉr(³„øg8jqùW øŸîó„£ãn¥ÁÙeWÊÀ!ÄðyIÏ‘8H+1Gr 12—:ä}ºÈUŸ€³5ç3ü¤™õ<†žŸ_J*Þnܬk%‰äe–µºTfyúz_M½uŠu}tK‹<« ¤z.s ™$oìlo)I(¡‚Or’›'_K;é/w‰“1ž'·ñØ2{N%JšÁó» 'ýÁf¾<åO¼K—†6k5x²âZ½æ=n]ñ©^ÎQ\áV¥³„áÇäS&;¤Ö› Èu.)F(Í\¼o™ç)¥ÕÄOÊñp~éRÒs´ÄùÙÁ²”vÁu`:åT·á.C\#dÈ»H§œ$Ç×§?šyJž²@t‰Ã¾+õhè #¿”®Y–£…‘ûêRÍ¥ÇÙ<ך֩£Q·ÈYÏçŠcÄù;Ÿt#)òÔ:·Ÿ[•¹%™P$–²¹ß:ÒÃbȽ”⾌P®s Ñ©F‘@#Æ»Båû”yžzIÞ±|†˜Ræ–$Ÿ›OFö²Ï}>"Î2WäLÀ¶Ñ”¯Óhd¥<"Y=Ÿ'Ë3çÒÑh‡qeö,Ç¥’èÔ+Mž'¯ÃЮ¯€„‰-f‰¥FT3ÊÖz³4·YbN~Ž µ–’¹ßJD"lOl5j=Ù€\ç’§‰ôDÌiùÂâ9Î0hL™„¤×>ÍG9(Gi›´£íËu¥ø"ó½DÆy-ržãЧéþ”èw•Wš‡M¸ ,d44©‡/u— ×K 6Ÿ.SãØ£íë6_j}“[ËHn÷PÕ•–Ä7®2²&ŸeèBM©y IM_Ñü¤=ù59,Ü£¤YæŸÀúYÏÞä2·úD2‹,Ÿ Þóõ*ÇÃR/8ix¤æcÎà 8õçùòÈ2·¦ÓÅÙÅÜ$EÀ—Ò/\Š+¯Ö–O45ä˜eMó~[öón£·ü“ D–2v!•û ÇYIÝ\_ö±ºpˆu’sLÎ4U¬Õ4¢)b¶§.­ZÓI m$‡ÂÑ¡´ëÈÑydM>—©$ÑÆd×q¯a0-˜ë\Ò[OÔ%—™R&G„ª·8OT×–çs‘õjÖë-N±Òó{•e]ÇÖ,eÊØÜÎÉFn HSÔ|ìRþSíõ½µÚNO'£ëÙx’ßb½\¢çd÷à`÷Ã?v_í|Pƒ³ie³Ä¿G{ä|õHS*¢<…Où©'OOók4H GgçxŒ¾'hê{¤¨óùlp1:}|uv1¬0ýÑlxùŽ~qÒÊ d%˜ã|0¡·dÅñJ ÄçÉàôëpv1üu6¯OH^œŠ/b(~¿ŽÄ™8#ñU\ˆKq%ÆâZü&&b*fböûX܈oâ÷¿gKöGX©Tý­ßyýü—Ç»/32ºCÈÐÏjh·>22݂̎Ø{b_<ÏÅ ñFˆcñ–°* ð0†æßL]®†€iŒòZ\'£ñ—‚Øtømx%¦£ïbz1˜ž‚ç“ápãwñÇ*’v$Ÿ¼}ÿæeF2uçKî(n2CÆTY5ËocÖÓ½½ÃÃ=˜uصs¬,fIù#~˜ÌòuzµŽO@gL—ØH¯™&‡âˆ©òN¼Øú[¶×éøb|…òòrÐ`UƒXç\Ÿƒ5#ñï†Ñ»v^kyþí~»φ_>_äf~bY®åÆÌÌËQÖhÉÑ&;'~Šÿ 'ãUoÆm¼ùfwwï_ìÍŽÝŽ“w{Šñaœé:¹#þÉn;†Ã2Y[þ /Ðæž?Æ<ƒË¸­ÝË„U §üK¬Mqúðäý‹“cÆ)tàd2ë“¥„3mŒ“ëÀÉ™:N²ŽÓ1Ð9&DǯâzÕ¬­¢ýÎñ«'»oÈ,¿Þ*-!Ê<ˆû£éÞË«†llßí>=¡ý°Ã=:Ì ÑúA ·¥ÂÖEàÈŸÚv^гMÍ­ò«gOöß’éÇ NéÓí-¦?A>æx;ÏYÚ KmÇΖ±lƒ­ÂØá«×;߃££®SÉ«²?éÈî–ýI›€;Úlö†ÎÄ÷«ôVAgïí‡Ý÷Ūp{ ‘8‹[Õu‚ïŒ:XuÉî#¯­zKou_ìœìcNº¼¥ÁÙäi»*JõÝÒ0x Î>¢¤;›fe'kWgõÔ`ùÈ'òª¥[…¥ÇG¿ì¾£cãøy—¥Æ-“½Ïî¬Yêc·¥™œ£Úz]öá·¦O·ŠB'Ï^¼{F–wæ…0”þ!ÂÐÏÙ|ÍN¥Vì¤Ç…¸ÒnŸ"y€ûr"@ž.2¾’cýàž5üífp-\ËöVÂ×-)g!ó d5S[Ew«øöân¬ÏÝŽ ï ¸V˜xopo ñË”û)'Ýÿ\“vç¤û®LOG£ÓÑäôæuÊr§_Å`FéøÔÊÖÙaÃï§ƒËÆUðl2`Ñvæ~1œNsú~sùy8™ŽÎ®~˜ÄlsO__ÜLkýFÉüškæÍÕ,~:ž —Li§¦ãà€¿n>Ïø‘á¨ÁtÈ?×i½äXaÿ· ÿvh4™ÎȽ]^æ L{?ú2;ŸÒÿ±èñøíLùB éíj¾[h*äš Y_WH«…Bɵ2Û+Ô¸¢7õ M}èîRÈ/õYÝ^ŸÆÝº©OºÝau|l[·½>ÛaCŸüÿ++þ²J©­ß^ŸÆ-¬©O‹ÐqU½Ð‡þ笥PØ^¡ÕûSSw+èaok·×fõÔÔ¦Åf;´1mmÒöÚ¬ÞKšÚ¤Í÷zh©cï ›W„†BºEf%åŠFr×h¤¶×¨™Þ75jÑ9…ˆèß [Ý!@7ó¦F®ÑÊ“5µ7˜½C„n&ÐMÂæ!q D‹ý_¡“»ö endstream endobj 145 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇQðÙáÒœÆÆÍ8ß›ñäIßž3d_ƒ “~Ù~hZ÷ÄÄ#çÜ W›ö c Ñü*…Í'qÇÆÕýU;€ºHHV7ÕxýÂwuö÷É»Ïa´ç­;¶ÑzÍæoþpûOÔøÍ_úÚöû`÷_¥ù£Ý¥ëNd0m6¬¶G_ÑÏÿ¼?[6ÿvÆçý³³Lâ·ºª¶¶C·¯l¿w6Zs¾aë²ÜDÖÕÿ%!ãpœ¨™§ò%¼b•l¢µËÜc€Ã¤ ¥¤ÀÈ ¤ÀPÀP«[ ßuªŸñ©_õgß_•ñxû4Ž$Oˇú<X^\NB8 ë\;c®‚šBbMx¹ ùy˜%ÆPÈ 3jok:E q:¹Œ/d4ˆ8ð€Q§4ÈA2="\¤ÂšYˆ+ÀË‹ÔÏsä(Äè5$ YŒ—Èú rŠÀ‘€ƒ~ì+A¿\HÈ•ÐWr߯{ÇNøxoËøŠ‡û• ¿”$¿TL~©ù¥òK¥ä—ÊÈ/¥È/¥ƒ†p˜1ðsòQä£*ÉGÍÉG-ÈG-ÉG“zA>ê„|Ô)ù¨3òQ/ÉG½"µ"µ&µ!uN>ê‚|Ô%ùh8ùhùh$ùhbòÅ,n~á†üá°nË£ºô½ß+¸´p]À¢hœ½íµ®í \ˆÓ†¯—2ú ¯M„Ç endstream endobj 147 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇq5;\šÓظî{3ž<ç»cæcìKŒaÊ/ÛM래xäœû@ájÓža†!š_u°ù¤ìظº¿Ša Éꦯ_ø®Îþ2 y÷9Œö¼uÇ6Z¯ÙüÍcÿ‰ ¢ùK_Û¾qìþ‹2²»tÝÉ‚ ƣ͆Õöè úÙŸ÷gËæß x£¼v–IüAUÕÖvèö•í÷îÃFkÎ7l]–›Èºú¿³$dŽ5óT¾„W¬’M´–Âc™B€{ìp˜”!°ôY ju«á»Nõ3>õ«þìû«2¯bŸÆ±“ä)`âPŸÇkÀ‹€ ÀIèÀ§ckgÌUPSH¬©¯@"7#?³d€Ã 9aFíïm-P§ˆ!.@'—1ð… cƒþ0ê”9¨Sæ G„‹TX3 qxr‘ƒúyŽ…¸ýB£†4 ƒñùA¿AN8pÐ}%è— ¹úJîÛxïxÀÀÉïmù_ñp?0£ä—’ä—ŠÉ/µ ¿TB~©”üRù¥ù¥tÐ3~N>ª‚|T%ù¨9ù¨ù¨%ù¨còQ/ÈG:%uF>ê%ù¨Wä£Vä£Öä£6ä£ÎÉG]º$ ' $ML¾˜ÅÍ/üÃð‚?¶ÑmwT—¾÷kW® X³·­ÖµdáƒëpZ¾ðõRF#üƒÿ endstream endobj 158 0 obj << /Producer (pdfTeX-1.40.28) /Author(\376\377\000\040\000J\000o\000h\000n\000\040\000B\000o\000w\000m\000a\000n\000,\000\040\000T\000o\000m\000\040\000P\000r\000i\000n\000c\000e\000,\000\040\000a\000n\000d\000\040\000W\000i\000l\000l\000\040\000R\000o\000b\000e\000r\000t\000s\000o\000n\000\040)/Title(\376\377\000T\000h\000e\000\040\000a\000s\000y\000m\000p\000t\000o\000t\000e\000\040\000p\000a\000c\000k\000a\000g\000e)/Subject(\376\377\000A\000s\000y\000m\000p\000t\000o\000t\000e\000\040\000s\000t\000y\000l\000e\000\040\000f\000i\000l\000e\000\040\000f\000o\000r\000\040\000L\000a\000T\000e\000X)/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20250703135255-07'00') /ModDate (D:20250703135255-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.28 (TeX Live 2025) kpathsea version 6.4.1) >> endobj 146 0 obj << /Type /ObjStm /N 14 /First 111 /Length 610 /Filter /FlateDecode >> stream xÚ•UÛjÛ@}×WÌcÔÒJ³7íB´%%7Ó8)¡ôA±E"H,#­ú÷Ý•Y’] £9;—3³£1K!Ž€B£Ÿ6  pÍÑ è…ÉR@™‚R’$‚NI&ã$éA©"”rIR:/M/ŠCÑe¨E§§Q²ø³) ùV­m”ÜmŸ¬WˆQò5o wÉãüâòáâãìz±À4òæçE³¬Ë­j@fˆ÷Â˺±³—¼AVWy« “Qò³\Ù— ¦‹ê~].«Uá‹uÐÙÙº|xœÍ¿{BḟZ8àÃù>ÚŒùdc>óü¹h¢dVm)»ŠH¯ zs×âÝ/ËU¿¸S€yàÊ „ gÒ§û}$¸<\ù6A†A´šZü+,b‡OµÏä&+èðä¼Z~º³ymceœl(ÌgŒAõÕ4}€ t߂Ŧ¢ÕyLs2&Wå[iÉ:«!‹B3Z;ƒ”=]½>Œô>}MÕðžnHφlºLɈJS,mY­?¸n`›~‡QÁ-øs¥˜æÊI÷0ŸbİO gyˆ¨¿„}NþÄ>DŒxÇhû´óuI›À)*O'pš ìœ†ÖcÚïçÂeã,Â÷™Mà”]âNÕI5»žg¸¥qfC—㥸iä©h*•žÀi:u[¢­–ègA¥D:Ó•ðµc;lضMrAòVŠc_ç08m[²A9±ºg¹Í_«ç(ìŸ÷-Zƒá2Âé5íÛä¾)n·öµ\»eu»)Ö_|U€]è¿Oà³ endstream endobj 159 0 obj << /Type /XRef /Index [0 160] /Size 160 /W [1 3 1] /Root 157 0 R /Info 158 0 R /ID [<0313FD0B14CE5C31BDF2E87275BC0914> <0313FD0B14CE5C31BDF2E87275BC0914>] /Length 432 /Filter /FlateDecode >> stream xÚ%Ò¹kTaÆáó~,f&£ÑŒ™ì1ÑÑ$îÆ=îfâ¾&.‰ Øä/Hak'´°+ ±°ìRig‘^,QDãùiÞ¹çãÜ;¯™Ùr2K¦\±ÍH‚™ãg‚ÌÀ,LÃM¸ ·¡VÀ X ·àŽ“Åª<ÔÃÜgë‹Ð(ËŠsM°ŠiÜ¥®CÖC‹¬°‡WÃh…µÐëàl‚v™ÏH`#t@ z SÖÞGÊÐÝ0½²ÒBLû ` l–u÷Åt†¹}|µm°UÖ?Ó ŒÂvÙÐd<]0&«Lij°öÂnÙh>{`ì‡q8á†#pŽÁ‡pNÉÆ^ÆÒÓ²‡S‘ÎÈ^Ô>ìYÙbK¤sRÇÓH“Rµ'RUš/Eš’ˆt^zUÛrAúü6ÒEÿ _Gº¤T~é²ÒøûHW”¼‰tUéyí.×”¾¼3¥¯?œoÎ÷ççç×¢óûó·âü›óÚê™S÷Ñ©—Ó´ätœÁªÓµÌÒŒvf´3£˜MÌhbÖ@ë²h]³r½þòÜpÙþ$ÄDf endstream endobj startxref 207391 %%EOF asymptote-3.05/doc/saddle.asy0000644000000000000000000000023515031566105014705 0ustar rootrootimport three; size(100,0); path3 g=(1,0,0)..(0,1,1)..(-1,0,0)..(0,-1,1)..cycle; draw(g); draw(((-1,-1,0)--(1,-1,0)--(1,1,0)--(-1,1,0)--cycle)); dot(g,red); asymptote-3.05/doc/diagonal.asy0000644000000000000000000000003015031566105015220 0ustar rootrootdraw((0,0)--(100,100)); asymptote-3.05/doc/exp.asy0000644000000000000000000000031215031566105014241 0ustar rootrootimport graph; size(150,0); real f(real x) {return exp(x);} pair F(real x) {return (x,f(x));} draw(graph(f,-4,2,operator ..),red); xaxis("$x$"); yaxis("$y$",0); labely(1,E); label("$e^x$",F(1),SE); asymptote-3.05/doc/build-asy-1-file.py0000644000000000000000000000315615031566105016256 0ustar rootroot#!/usr/bin/env python3 import io import re from argparse import ArgumentParser def parse_args(): parser = ArgumentParser() parser.add_argument("--options-file", type=str, required=True) parser.add_argument("--asy-1-begin-file", type=str, required=True) parser.add_argument("--asy-1-end-file", type=str, required=True) parser.add_argument("--out-file", type=str, required=True) return parser.parse_args() def main(): args = parse_args() with open(args.options_file, "r", encoding="utf-8") as optfile: options = [ line.strip() for line in optfile.readlines() if line.strip().startswith("-") ] args_description_extract_regex = re.compile(r"-(.*?) {2}\s*([a-zA-Z0-9].*)") arg_matches = [args_description_extract_regex.match(line) for line in options] escaped_args_with_descs = [ (match.group(1).replace("-", r"\-"), match.group(2)) for match in arg_matches if match is not None ] transformed_args = [ rf""".TP .B \-{arg} {desc}.""" for arg, desc in escaped_args_with_descs ] output = None try: output = io.StringIO() with open(args.asy_1_begin_file, "r", encoding="utf-8") as f: output.write(f.read()) output.write("\n".join(transformed_args)) with open(args.asy_1_end_file, "r", encoding="utf-8") as f: output.write(f.read()) with open(args.out_file, "w", encoding="utf-8") as out_file: out_file.write(output.getvalue()) finally: if output is not None: output.close() if __name__ == "__main__": main() asymptote-3.05/doc/build-latexusage-pdf.py0000644000000000000000000000602115031566105017312 0ustar rootroot#!/usr/bin/env python3 import argparse import contextlib import os import pathlib import shutil import subprocess as sp import sys def parse_args(): parser = argparse.ArgumentParser() parser.add_argument("--build-dir", type=str, default=".") parser.add_argument("--latexusage-name", type=str, default="latexusage") parser.add_argument("--latexusage-source-dir", type=str, required=True) parser.add_argument("--pdflatex-executable", type=str, default="pdflatex") parser.add_argument("--asy-executable", type=str, default="asy") parser.add_argument("--asy-base-dir", type=str, required=True) return parser.parse_args() def print_called_process_error(e: sp.CalledProcessError): if e.stderr is not None: sys.stderr.write("Process stderr:\n") sys.stderr.write(e.stderr) if e.stdout is not None: sys.stderr.write("Process output:\n") sys.stderr.write(e.stdout) sys.stderr.flush() def clean_artifacts(buildroot_path: pathlib.Path, latexusage_file_prefix: str): if (buildroot_path / (latexusage_file_prefix + ".tex")).is_file(): os.remove((buildroot_path / (latexusage_file_prefix + ".tex"))) for asyartifacts in buildroot_path.glob("latexusage-*"): os.remove(asyartifacts) for exts in ["pre", "aux", "out"]: with contextlib.suppress(FileNotFoundError): os.remove(buildroot_path / (latexusage_file_prefix + "." + exts)) def run_pdflatex( pdflatex_exec: str, buildroot_path: pathlib.Path, latexusage_name: str ): sp.run( [pdflatex_exec, latexusage_name + ".tex"], text=True, cwd=buildroot_path, check=True, ) def main(): args = parse_args() buildroot_path = pathlib.Path(args.build_dir) clean_artifacts(buildroot_path, args.latexusage_name) # copy latexusage.pdf to build root, since TeX Live has some issues with # out of source builds shutil.copy2( pathlib.Path(args.latexusage_source_dir) / (args.latexusage_name + ".tex"), buildroot_path / (args.latexusage_name + ".tex"), ) asy_base_dir = pathlib.Path(args.asy_base_dir) asy_base_args = [ args.asy_executable, "-dir", str(asy_base_dir), "-noprc", "-config", '""', "-render=0", "-noV", ] try: # first pdflatex run run_pdflatex(args.pdflatex_executable, buildroot_path, args.latexusage_name) # asy run for asyfile in buildroot_path.glob("latexusage-*.asy"): sp.run( asy_base_args + [str(asyfile.name)], check=True, text=True, cwd=str(buildroot_path), ) # second pdflatex run run_pdflatex(args.pdflatex_executable, buildroot_path, args.latexusage_name) except sp.CalledProcessError as e: print_called_process_error(e) raise finally: # clean up any latexusage-* files clean_artifacts(buildroot_path, args.latexusage_name) if __name__ == "__main__": main() asymptote-3.05/doc/asymptote.pdf0000644000000000000000000457264715031566756015520 0ustar rootroot%PDF-1.7 %ÐÔÅØ 1 0 obj << /Length 587 /Filter /FlateDecode >> stream xÚmTM¢@½ó+z&ÎÁ±?tBL$ñ°ãd4›½*´.‰<øï·_•èÌf’W¯_wÕ«îrðãc;Šòê`GæUŠOÛV×&³£øç¾öƒ¤Ê®[vïÖæ6ïWÛ7ñÑTÙÖvb¯“uYt/N¼.³ó5·½êÿ¢¥=åS‚> stream xÚmTM¢@½ó+z&ÎÁ±?tBL0ñ°ãd4›½*´.‰<Ì¿ß~U¢Îf’W¯_u½ªîvðãc;ZäÕÁŽÌ«Ÿ¶­®MfGñÏ}í I•]/¶ìÞ­ÍmÞ¯¶o⣩²­íÄ0^'ë²è^œx]fçkn{ÕÿEK{*ʇuÄpg6;µÞ$4»¢;»µgZ8, ’ü²M[Tå›P¯RJG¤eWxm½ñ­ž÷ŽE™7·¢â žÒ"/²îÑ7»¸¦‘¼ýj;{Y—ÇÊ‹"1þt‹m×|‘£o¼irÛåI É‘c¶×º>[TÒ›ÏEnn#×ÛûþbÅø¹‘ûÒî«¶BS¬ØEVå¶­÷™möåÉz‘”s…«¹gËüŸµ)gŽÏR©ð133wÄ xAÄbêí;¬ÒaGL6K& 0+‡}&ö"?‘á°(Ò¦Òa/ ¡cì,•!£½¥‰î-fö3¤Ù*IÃx {aªùð”sIC%ÒðhSô¢¨7å£Å}­HÏ=ŤIYƒ¹(îƒêjŧ ÿZóéàü4{ÖØSOØá5˜‡áZ ä®ekxvKº·Ǭü÷…Ü@2aÂ> stream xÚmSÁnâ0½ç+¼$z Ø¨"¤€ÄaKU¢Õ^C<ÐHàDN8ð÷õÌŠV{Hôüæç=üúØS`¾Jñ m}u%ŒÒßE Y]^/`»w¦¶oâÃÕå:1L·ÙÖVÝ‹omy¾èUÿ­àTÙ ÖÃþŽv¹Êó‘DM^ug{¦…Ç‚° ÉpmUÛ7¡^¥”žX[“ÖôÚã{=1î+kܽ¨8 …@iaª²»¯è_^|Ó˜¼¿µ\¶öXq,ÆŸ>ØvîFŽ^‚ñÎp•=‰!9òÌþÚ4gÀêBË¥0pôùÞÞ‹ ˆñs#P~k@hZ+vQÖÚ¦(ÁöA,åRÄÑf€5ÿĦœq8>K¥Â_¸—žX NˆHæžÐÔ3$¤Çž˜{<Ý0Š*¢5cÕ~ÿP÷õʯÂùÝ5WÂ42^!ž0^#žrq‰xƘœE„3xÎü ñ ªz“)cÒgl1BÌîÒ°õ•?ŸXqû!òŠNA‡¨Wš»A*dý1ùÔ)iȧΰÅç“Оó â9ç’†NVf¤¡–kô¯VäaŠžUJü†ôì?%Íš5Ø»bÿTW£=ј«±®–¾Œ¿É5ëñ2éfè&p2pj³V^ócH£Mc†VYxLS7˜E=›þ1âj· ¾gÈÈ endstream endobj 4 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./logo.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 5 0 R /BBox [0 0 140 80] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 6 0 R >>/Font << /R9 9 0 R >> >> /Length 1162 /Filter /FlateDecode >> stream xœå–M‹#7†ïý+êè9l­êS¥k ,ìm's 9-ÉÂb“l6òïC•d3ÓöÅ>4*µõ¾õt©¤oРåo=?Ÿ¶÷Ͼ|߸ÁßÁÇàëÖàÃÆ‚ÂÊ ÜÉà´‰)6 ,}€ ©±7ÅJ$= M >o?mç58mÚóEâ#Ì ‡H#¤@b†qQÌÿóh8º€²¡Gä"kÅsäx¥²³‘/\'³ÓÊ—ZfÃd”نʜïD•=£Yf¯(Ý@ÕØ›!÷JŽn =›ÐÊ~ƨ¡f¢‰@PšIC 3E ƨ”…/ªE ê`Pv¤ÐJp®zŽo+íü†«¬öŠ‹CñQŠ‹€0!·^(ç‹Ctõ~qèù¥ÈúÔ5î‹ÃŒQÃ1˜‹a°‡‘• Å`4OŒ¡É !°ÑLÙgÌWàx[dg¥\%´×›ˆºw‡FpÔto’t ŒŠwˆ{sä,Á„×£ccYfŒ5B @CÑ@¨½ƒ¡1HÔÆ Pü¢:!8š(w¤î•à\ö9Þ–ÚÊ·®³Ú+. æ#81ôô•ÜiŒÂI©0„ Hô'†îJŒLSÖxa˜!"¡UËõçÄûܬÍÓcPÂŽ¸ÈN†ÍfÖÞ燞ëž#ÇÛZo †«¬ö‚ ãú¦QÓ>ª+ª£Kbp”ìa5öÖ‘A©aÏn”ì C…ˆQ£YQè(‘Õ˜Æì5MQFv Ô‹è„ h”iíˆZô8ÞÔyë¥\%´›X[$EUÒ:hTcTË2)aZãÐ-@Û@¶5Zu0CÄ8Î G•=ãpÓ>›LSŒ,æ¤<è¢: 0¶Q »×÷«žÇ›BoÍ«Œöj A©Û<ç‘$*˜ÍB¸£®±·@6Mz l- ‘ æ^IŠÊI@PÀÔf“i†2 ª\T'†^R-2W]ããM·^ ÀUB{± @¨;÷$@³ ò˜G’hî+‘m,¨È%n Ùc”ª5]fŒGç^G‚‚Ã:˜êl0Í0"“М¸È‚>x"p› ÎuÏ‘ãm­£âp•Ö^qqðšZMø,ù[Ï'øáe{ÿ<€Ó{'xùm1"PÉ^NÛχïOïòžÃ䇞Zöt5>œžrwxçÃO„b"|øë©åçf—Ãïû`7?üúô.»°¢_^>n?¾lŸ^]XïwiÞ8Jrñº.•÷{UñX¯ëöw¿Õ²˜;8/q±:oh÷[åûœW¨{}ÖÙô`«ë²s¿ÕX…Z›ë1VëRr¿Ó¾êôqN×íá~«ž>==Ègî÷Û”U¦r:¥ÿü/ŸOŸ¶&„©f endstream endobj 11 0 obj << /Filter /FlateDecode /Length 206 >> stream xœ]AŽ!E÷œ‚ôom!&ÚèÆÅL&£@( i‚íÂÛªÕ…‹Gò€JÕ¯nwØršu÷W'äYÇ”CåÛt¯žõ™/)«~¥CòóËäôWWT·ûqåô(¬W:p\ü×]¹ûï¹é—?¾繺|a54ÆHŠsøz²KÁ9¾~š €ÙM 0¡i$0‘ÔhA`ÑtM`×M;4Ý’Ø­LòîÙ†jéÞa´¿×Êy–HÄ-eþl©L¥UiÎA=.ÛfÀ endstream endobj 15 0 obj << /Length 264 /Filter /FlateDecode >> stream xÚÁNÄ †ï<Åá Pð¦ÑÝh¼h/ÆCSÙîº]ÛjâÛ Å5c8À æûFLGAP!Š`<´=‘Kwì <î7D}æ êtÿá9ÃÕ?†ñDå•^æ]Ôdµö´Îz õ6;Y§Då=ÔÏðHϧ÷þ8sYçEÒÉfŒ°%wEÒZP2łʒÆX*°J ã°0ÖÌ#]déÓžÆqÚ‡Ò@!íoºFFZ¡ÊøÕu¯àrHÌ‚P tß•O‚™+er endstream endobj 22 0 obj << /Length 544 /Filter /FlateDecode >> stream xÚ…SËnÛ0¼û+x¤€ŠæS–zK×m`Fªž’‰¶ H¢AÊ-ü÷%µlìI ´$‡³;³K†høª(ZA*Y¢¦ŸÑi×í«K8)xøÿ’+ÎQ~Åv[ÏæŸ”BŒ’ŠV Õ»˜Ž©‚ Õ-zÂõÁø,BàgÊd§c,qk³œ/psêõ…`ôÙ÷ú>P×TOÓ½î£u‚ü‘í ö/q`gØe û;À™ T‘x{¶¬_µÄ:%%бÿhÀü ’‹¿%'À¤ù0ŽGÿq>ßþ®œx{rÞY·×ÄØ·„Ä$aîì1ê9;³?Ä`ŒW’„/¢Dð p Pòš*zE(ü ¼WoÚ7ùÃ)•9WК›¡=ƒmŸ·}¯]g†¶K&ßÛC²ôÖÆ¶ýì·C:Ú-uV l{Xlœ=yrΉ”tŠTØfj›ë÷Ю²ÀÓÀ” ¼wÛa¯[8-ü›èΟ³RÆöKJqküèÌKhýiÔp=T4·nôqÞÊ€ÚŒeˆZ8J£­ž¶OC«ÝTwìŒ L¥æŽ‡È¯x(Ëõ‘C¹»´u¸ iEª‚ÉäRáÕ÷w:ÖÚ{í€d¥í¶,6§—Î4em=ø”ý™*êµ¾ä Ó &¤åúËÝòáë@fx_NhÕhy§/Ϩƒm˜\ˆ[ãt3ZwÉÙëƒúže‘ endstream endobj 107 0 obj << /Length 1355 /Filter /FlateDecode >> stream xÚí[Koã6¾çWèTP»|‰{kšÍb‹¶»hÜö È²C@² ZÚbóë—4)űI¯Ñ$ŽBvlŠ”çã7óÍp„¨þPÀa2ä4 ²ò.?•ÓÀ¼ùýý²ãjà`eäåèâûë( rÈQ0šJ†<[ ÂG?_¼uóD︠¹±b‚1Ѝ^QÝKèjV…œ‚ô®ÈÉ#PMÌëOÕ,$Ô¹yYè{2SÑ!¡ ë©Ô¯£hH963¡Pý`®òE&żj†åE&«WÝgà‡p€Xl^žþ÷¶¾Å²ÓÞ‚Ê¢ê+mf…(Â̘3˜-ê´(Ò-vÆ‘^ÿÝv¦ óÕSjªQœÒ@];¤ÄRÕ&GBðÇoþVL!܉Y*¿˜÷c±¨¥¸k4(–2Œ¬Nª6?…ǵ__k‡ÉÕ–åР¡w=R»>B­å±µü¯iöñƘ{‰Õ„XèN ðè”M»ƒ¡»m¿ihÒZd²ZT“Úû/1W!NÀ>£Fl_¿õT YuLÁh ¡ jR1úˆè´‘b6uc‚c|:f<ìÛu‚H1ÔM³È¢x“§2Ó¼º7îk®}Y}ï!ÞÉÎv˸‘Ttdn$YÇÇr. ÍťÜȪ4>Š…EÕÈ,÷øÏ nχ‘ÏÔ±5õ»±¨;C—U8Püç¾À„Й˜}#ˆ±3v%À÷¢ö€I/ Žb7ò‰›»ÜBÙˆbÜ‘·¾ÏmîdXœ5e>Óá°^Im7£ 9Wyâ N^«#˜NXgÂT |Á‡ôºï WðB ëzÙbÐ'0&mq‚˜ÂÐ(ä4u%•Žiá«ÁÅô| ?¯Q7ÂI ø®u#¢ëFš…W2]¦Ðû3[ÃHëÇ$`EÒøRmÚ3ëÿiKH lëž’èÓVˆ„ K¹L³Z|ÖïmäR* Xì,AgŽ” }hƒÆµ˜6ÒÚy!<æÅ”÷Áh¯+¸áä(½áÄ“<Iï–ž-/<Éš.{õUˆƒ.ÒÓˆ„éÑE-ò'í·±`ÏÅ£¨_.¾-A¹ÙÔ«JPBãdUY¦³ñÂ#Frç”̧O¢»JEÚJűÕ! µe’žG’ËEÄî‚õØH[å©s|ù9>àü¼ß5ß>=P™ÁóôRdôÒeþ ri¥R#?kñ”ûÄÒöÓ¬“.๠q8˜¸:嘱î'YMeZ–]“Äf£\„¶8ù¬ž“f85G»JUÖuÃ]¥ujsBƒ/!sãØ¯Të£ØóÚ¿”‡1@¯Ç&Ö5Ú=&ñKdUþfê ÓFøÚY¯U^^IDÁn´È*Z¹¯ácÜ+£ÈHŒ…ŽLu}£0!@¦³Å¤’¥ˆ¸ïÛÓ î>ˆ˜ÊÝ”m;ÿ® ŽeþÔÃ0YÝH¯¥qŸ˜=¯É<tcÓöò]å“\ÊÜ2^9tcB’žD/O¢DÅœ¾°m¼E¾cÌë¡9æ{c^”¸ Ù6 þ©e*…}Tmy./j‘â!—Þ È{_ [À1Ìã0Û®¾›Z6[£D½õ÷z»žþLvºÔ¶Sð£MÝeZW^fÅýSl‡Ð?ƒ!`&ï 4OØ©FÛãÄ¥¨ï˼™ñžß™d¾¨¦"K óYµ òä4·ÒZØR?zý‰r† endstream endobj 236 0 obj << /Length 1363 /Filter /FlateDecode >> stream xÚíœ[oÛ6Çßó)ü4ÐRÅ‹(roë¶ Öah]l@¶&faº’ÜÕûô%-É—X‡ÉŠÆV"@Û’hœŸÎÿ\x<‰ÌžÈh’PJ&&7ùE´yµZLÚ?Þþt»ãs`°wäëÙÅ«Ë8žà(”‘Ä“Ùí$Æq(©Ü^o6Ÿ\¡4þ=ûåâÇÙöJ1!\ÒùÀšËP1á‚…˜²vMš#È4àQ„ÞéìvPJÑ7ö¡å£JOŒþŠ03O>¶¯—Ëi@Ò•jÊʼ\ÛÏýê’Óýå®ÉÑ·ædž´‡Ïÿâçž÷ôWؘãÐúWaqnß3ÈLCï1 -ƒ÷µ®‚¹¶ö.ô¼¥q`nÀÖèó3Ó—¹Ø°±ë`f¼‚u&Ç[›ãÖâ?çË,½I›ÖÖõÊÒb‹¯òv=Ó Ãà¸@<9ð’²N¨.§‚¢UqÓ¤eø¡üÅÙó¼+ Ò¤ÂhžØÐ<ðÂѰsÃô­Zeªj±Êu15ª×@‚G¢¯Àü_üã>%QA>Õ‡ÿßTÞGœ­ýÔÀñ1ÀŸŸÙ°#˜àï@ÐEÿ·ºnŽ æ«Ø#Wö j¼çc$d-‘7ª¹Ó¹jR“´dnÝcöâLˆE uf`Ý]ÿ]U)+õk(–“—®ê£XaX×£kì8ÀïAî#ü;“fkH˸ß']PDŽpÙ-ÌN¿W5•lþî“‚Q'åÌ”±‚¹H¼­Š7M‡²j€8DZgrþ†Ec$œ¢÷¢<³¥´Î—™júä?Ý¡2õ,Sš0$¸KLy›^B%Väýcì•]„Ô°Jº wÕ”«¢Ír?Ø_:xGÜ3=GKâ é’̤—Ì?îL]¾QJÛ¥×Ù¼nwE”Ý*ÙÔîÇ´¶þÍž»Å§`½9jë¤o8C“µçó{çï™ñCï,G‹£§ukóL/Tµ‚Å èfP!‘ŒÚ÷±71eœØ÷ÒîûÙÇX¶’ö@±ý#¯iôçW5Ó]ÈÆ´­jµÐýéâð}Ìð“âLöÿŒ ÀûÖ#1GrÛp¢$ oqˆéÆò¯Um%Ä9/Í#FóUÖWÌG¶¶Š5rK<ÖÝ”¦â”|È+¶JÎCF»;_„xXr06’dòà´¤º··O¾F›r’C;ì"$赩x2ýˆÒ· ÆåKîÆ=bú0b0Ž}ÓiíGÁp™n®š»v(½OgpîØ>-]-KÛ½‚梸'rÚaH&Ã^Ì(ºÌuS­½D]¢¸‰nSéü¬#Øïh…aõåGX{ªÂ•U5 ÏòÕÒ³¨–İ/KW¬tÁÁK/Ô£j.ކéòM.]ý£¡!s_ ®ƒ¢±‹ð ùéöÑ­0¬Ü±@F‰ï&0{“†AuÒÿÛñ Nû•Š]Ô)Lý:-Tµv°gÂ[ÿ´ßN’.” F9¯Ô¿0HB¤‡uÖaXi°âáÃTëõëÐø‰·ûØæëMŽ8ïܗàoõºÈUMÎJï¯']˜Ž•¸ ·*WÅ\Ï—ðnD$|Îsšg²Éɰ ˜¡*RûeŸšÒS:KÅCåÏSJ¨Î¯ÁÙ;"¼(ŽÕó&ŽþU¥síy?OÞtxtÇÑÌz£õ{Y7¾o=D/vô©®Õ58!ï½øYyñŽ·£C•YÞŽÄÙ§]çL»YfàI}ÇqLGÈ5cWET” 8^å#ìh"¬ý¿qŸwsßÅ endstream endobj 10 0 obj << /Type /ObjStm /N 100 /First 847 /Length 3875 /Filter /FlateDecode >> stream xÚÅ[[sܸÑ}ׯÀSâ}AÄ…©­Tɶìèû¼+Ų²Þ‹+EÍ`4Œ9ÃY’c[þõ9 €Üñf¼ÉF£q¹,Þ€Ó§  ›ìq,gš ]:f˜p±-˜(˜ÌuÁ„bR˜”Ê1Q2© üÉ™,J´ËñL›òDZ¦„ÅÇ”,q,™*dÁTΔ.42e,þH¦œ0L)¦JN+DŽNšR£a…r割¬Ð™…)€S²Â4ÊYáJêÄtŽç…dZêÄ´Êq]0]PcÍ´¦ö†iãäIa™¶%®Ó%:C“;tÊ™‘P:%ÑI2ˆ¨bFcÆæè¬™qŒ™²Ô' nÈhǬ4ʬ*Ñ9gV ³Æ0’Y áF1ë 3[–ª™B s²'Æ2§‚æ ØÉ”Ìi‡Æ9s6ˆ`Žìf%s%Œe+s·+…ŵf¥Êq4¬„!O¬e¥¦çRƒ Mér€å¬,adGc—“4‰ápGáDQ {NcçàpœhXÑYœ8®p…¼¾ƒÃˆœÐsœ8y…PpXC "ˆáD ã&„Å(a „pð‘È¢,ʓȰ²”9q 3¥‚$:³ta.xŸ¢3C *%H PP…&Žà È«L'”Uæºá ¶$åàß9]ÃD!à“þ ‚ (%Š ,ÌM44µ0DES/kèŒPi{Isòõ×'üÕÝÆ3~¶žµóz}{Ÿ֋…ïüzæ{ö£’¼ßT3Ïý‡YS­øÏÛvð󛆯·«ßõõíšÏÛ¦©:¾ñÝ̯^­pÖWëylÜ´ñ|S²ñ‹!žuõíMûÁwuÿ–ošmÏgíjUñåÝféׄV·sÞ7U¿ä}×òvíùð¾åòóž/ÚmÇõ;Ïûúïý;ôñt]£á¬mÚ5n¯êxÖø¾çþçmÕðÛÎW v¾j<«~Êó'ü)?ãÏøsþW~Îÿÿ?Á¿áßò ~ÉÿÆ_ò+þŠ_ó¿óïøkþ=ÿßtÕì­‚N78TÓÝQ¿Y]Ïên¶]ñíz³ÌÚ΃AÞ¿á3>çÐ…ßò%¯ù?ù[Þð_ó–oøÏ¼ã=ø–¿ãïù~Ç?tŸ$vñjGÒP7sÏo¶Mã~¶…ÍÒù/qSõ×´]½žÆ2ÜóMSoúºçóêöÖ‰éÈÑø4(ò݆Á½šUŒw»­›€X]œ"ˆÓÕ.Ð0œEê#_îã">JÝüzN¦õ«pˆZ]5÷«ª{Ëû_‰]ÛÉãóïç5¼š4Üuèyû~̓ے+6èÏgÛŽ¼ÿŽßÁ¥nºö­_“±{? Þ2ÁÌÚÍ]’ÕÍð´àxD£ñ«6úEÓÞÖ³ªY·Ãè׿­I”ŸóU5#bsKMS˜pò~ü¿‹Î>]U³íàùjKs¨‚m–ižsæç_Ñd™zÞ þ±m>á—¨¯iRt4pº¬šE™nöÓ, †:ž{yœîxÆi•ÓÉ:§ÙòôŒ?)ÅÎg±óÙN糩×ylsÛœï´9ŸÚœ Kþmw›_Äæ;Í/Rƒ©×jÛ õ¦¹ãqž^Ç®×±ëõN×ë©Ï÷ñá«eÛÁ¿|·‚ßß4=¯ÒŽ«¾U[MU0C…i4ƒ}ììw:û©WÛÔ±M½Ó¦žÚx˜aŵ±y›·;ÍÛÔ`ê5¯ßÕt#a;ncÇíNÇíÔã.>‚îÆÛoNþò—°{\ví|‹Uˆ=z~ù‚=_¶ýÐϺz3`×Êr‰¯NøZqáCO±î²GOÿ,sìƒ6Ç–«±ûý)·Ìó?¢Ý7íü?5 P-¤Íßa¹úéÑÛŸ¾bÔ6ì§G¯ükö[B¸ƒìÉ8EÃöã‚ÙÈÎî<»jÃ{ìDÀ|Uc²²G˜«í?2à~5ê–vÆÃó«¼NøÕ)[TMï§íõÌÜ#&@`úrìò¬]'üYÝõÓeÕÑö~Â_Tã•ÄÕwõ|XbƒEÜ—³OÿQÔƒ8-ÿéö~F±ÞØ¢°ú Ølo† Ž„’¤>õÑú0‘Œcu§'oŒ;=sáú]/«[¨ùͱ ôb——¾ÇvK¢¤pç8kõ¸ýÀ~$>ض”àtI›;d}‚Äý5ìB±›¡G8§ $pdhÆ__Üü+lhv¾B¸;=‡Í®üSñ˧Ϡ­ÿ0°7¿É[Ê_ó–ùïáÍO×X²it°_‰ aZ¬¬ðü•¿!qPàGŠ+•ËrÄ ÒªLZ ÊÂõ¨×oô½büúåyüóh9 ›þÏ;úÝ ã8ø,ê°h»[ŸÕíWd”3ì/ÆÄ9«tŽè]ÞË”•ÿÍrý¿SF†ÒÅC4­ÊãAăŒ‡È_EêJÇCôQTDQ¥ˆ(ED)"JQŠˆRD”"¢¥ˆ(EDÑEGQtDÑEGQtDÑEGQLD1ÅDQLD1ÅDQLD±ÅFQlD±ÅFQlD±ÅFQ\DqÅEQ\DqÅEQ\D)#JQʈRF”2¢”¥Œ(eD)ÝoÌžO¦ÂoL&£ÊÌQSÊ )l'3“Ó8Ížçí«–ñ§Ø8Òò‡Ífwžü~¹È¨3dM“p¬Ò½8ŠpR:/3¥R”"p`#Jð)÷Ê=_÷C…Ðâ€Z'é“ÖG‘Ž47+éuH™g%-bÚf…¤×yf´Ú+ýúÛó×?åE~S¯«îŽÎ毻úfK|úûš£ê„h«þbd&ëX›9z‰eufvhg3ï'ôM5»¸"G°Q¢E6ú”&K“Yx³”*>m‹Li¹ŸV\¬GLH\¾«)Ý9”a‹`˜£2˜ì †£À~l2z£©Èd.ö²À¾¿¨o·”µHý$<¨ Á“ÖˆÁ½ò êè½)Å`z¿ð+_u³%~S!*?æ‰@ÐüXÂ'í‘É\a•™ÊÈàþg ¿ÚÔôâƒ,ºvEÇq%‹!ßì‘({|9:“…„Ä )±Ã;²˜Èl±ŸÔÙ¼¥²½C9Hb r4é“þ¹ÈrI/‡±>!wйÃo÷2x^R9 *?¤ÀQËÂéÌ"ž—¦k_Qê¬(Ü^¡·u3O†–>ìJíl»B.sØ*š`dD&ørl&û`G²*ŽDád&Ëýƒr½®c¬w C$ÑÁ/A5I¦­@›Cßëp]˜½R_m‡¶««æ0õ(y ¨^ò4ÀÒd 3N*›Yd×…2˜ûó—®zŸ®^‡è¬âÆDËÎ=Ñ ƒþe¨L– ‘PKD%ª¤³2sö¿£SÓëöj6Ôïüí“Hû|IB“•ïäÛ¤5у)5,÷/YÏ(€ òûúã} ‚Ä;/Å$?äH²GÝ•sYIß‚µÉda™*M¦Í~ù/ªßô‡Ñy”K:?´ÌIW¤“®ôå8¤•Ê©¬ûå^ HUMbƒª+€*T&©R˰´’)­³Ò˜ÿ4ŇéõüÞ*Y y$1îG%1 ·ÄT2:¼™¶p5…íAû”9Hh´“Ô0Ú*qÒSø•ÙŒŠu¤ÂÌÚ+sQß;°µL2ƒ–)pR2§—„Tñ!ÃN¦Dž9µ_ꬩ7R3I j>¨ÄQOY晡 &¼ÐAĘ·_jCkãaÅ’¢,k”4´6…j¶¬@À&-®Õþ0à±ÿXû.¬Ûî?Ð52¨ã1 õ%½"£z=2tâV!ö/—}ù^­îÿ²jÔ< Ÿ4?†ðÉ»‘kªNs´?X&¼Üû÷…j¨BbôíÄ£øàåÇ=j.( VbeHÒÉõ…ÒŸH>öB:Ünëù¡L0ò&82‡ÉŽ\1Ôí/¯/Íþwé—~}(Í“TÒüa%NzZ‘Ií‚dÚ³„uØAö»Ü«®Z÷‹¶[JÛ$;h{¹“ÎéQY€D0ÕÆ·ßÐϰ´ø]ÛÔ³ Ρ,˜ ŸÆd,NaEÖK %Z}æ•€_ø®óÅ<†Å²E"lqL“”ŸÎ¦)bʉϤ¹ÍÁ| ‰ z?¬ÈISì+axø"'¡±Db­ö‹ý{ÕÕÕMããÛz¨«‰}w(å“ üÑYLöÀ&¿Ìå`E•å2+õþèòjè¶]’ì`#Èu.)˜”aÝÅH_òý)ÿÅÆwTëw }“\R÷á… A•³6ËDª„xRjæèSð~3Ÿvõ°\ù¡ž‘«ýþ¤âá蟘ú÷fñ”F3•ñ½þþ*²2gëmÓ¼ù=mö—¯íÖ†ŸTˆ|,f£Ÿeˆ{ƲO*c‘Ùï¯f+cm”Èóté(ÓQ¥c,©ÔL¤Z3‘ŠÍDª6©ÜL¤z3‘ ÎDª8©äL¤š3‘ŠÎDª:©ìL¤º3‘ ÏDª<©ôL¤Ú3‘ŠÏDª>©üL¤ú3‘ ÐDª@©M¤4‘ŠÐDªB© M¤:4‘ ÑDªD©M¤Z4‘ŠÑDªF©M¤z4‘ ÒDªH©$M¤š4‘ŠÒDªJ©,M¤º4‘ ÓDªL©4M¤Ú4‘ŠÓDG™ÆQ¦q”ieG™ÆQÆêG&“wË endstream endobj 336 0 obj << /Length 937 /Filter /FlateDecode >> stream xÚíZMsÓ0½÷Wøèb´ú²Ì­´PÊp` =u8¸Ž’+c;þ=R˜¦‘œ„Æi==ص«zo÷½]5à!ý^„¼ ¢ÂKæ'èîi1õê›Ï'°š7Ô‡÷f¾¼zǘ(ˆPÞhâ1Àæ¾yßhì]ûiš¾Ž>œ¼5¯b?rM3sÇ¢€¨¥4BëEE€¹YUOæ÷'_9BþÙéy=ÈÉæ FÂ=7.¼å·|¸×—=‡¶§Ô4²M¦¾fÞ êH €5Ô‡nê§E¼˜ÙÉ,:à YÁJ7·é††oáæ{g²ª¤#ÝyôR“ê@+XÉ¥ùZ¹äFnr«Y!eŸÌG™Ì$²j7AnºÕÍ·Þ¶Ÿm3bOu;|›Øéa/¼\Ážã$ÔD;4à6¢Ó1é5ý(5 »¦7Ý¥ÊÒqÙçõqåuäÈkÚR«-o\¥=—YÁnÛ ³›#ëÌÍú$S·É,.*õ"ê ýÏ®P¢[.v¹n99KT^©eÑ·Ó]o§¹«Æw’먾0Žúì> stream xÚÅZß·~×_ÁÇö…"‡¿#€ÃE0bMëúaï´9«ÑIi¯ñõ¯Ï7Ô,/iVÚÛ=>S¢¸óÍ73$g¸´!*£lHʺˆ6+Jü½(WÐF£‚A´*·¤’'´NeôÙèUIÜ”5%®lIJ<‚%zþ)+ëë˜Âr1’­ÿ)›÷àMlrЬÁ£É+¢àñ!(òÆ­,D ÂRR« V¶ðࢨz²QÎð˜l•«ºdRŽ2ÿä”ó†½rÁò˜ \ôfesT.îIÊeV5gÐgþ¹(o-4ÄOl¡b•w<¸ò•WqʇrÅ+ŸX2HúìÒÊ–¨| L.ÁŽ gKV…Y<œµŠ Lì T \t ©ÙÆ©˜·ñ*dD^e:»Qe‡Ø P–{¢Æ$ÐÎ)pOQ9ó`‡ŸØònÅà ‡ø(–ÍâŒ*n$gU©èвÖÙÁ²Æ Ÿà]kêðÌ!I¬6ükã'á`kìKð°5 .Fı)Ù-&{ôÁzÎü ÎC'0àfkÙ7?[ëøYŽf‹pÀ'`Øà9Ðã_ …Vð:"j³#Ç"ÌÏ}À€qìêÅ‹ÕúÃÃ]¯Ö/÷ûðZ¿¿¿ê÷ï¶ûŸVëW‡ã¦?ªSÖ|Z­¿ï¯õ’uŸPH#074"©CÀ —êÅ µ~¯Ö9|8¨õkõ§·Ýð¹¿í†íu·û'œöãýþzØö§?«o¾Yáßÿ§‡wE›bG=|0_C k¼.°jHQg¨%KgØ;ä¨]ö“ª¼<»‡¹Ø n¥¿0fó| :%^ÀŒöŽ §]˜Æ}¿Û^÷sqÜÊuaÌæ×@:bÝÀ–¥ ¶ ¢&q¿íNÃ\T¶R]²1u åÓkª|ÔÅMÃþõöîpf¢*¸•ê˜-‚  oõA;ìRÁ9å÷C{·ë†~ëƶ*1—“E‹ÊüY5h>·Ns¦ƒDL'$[ŒŽnzR ¼vÎD\`+ñe!SƒI„Ô)–Nœñ˜¤‘ÚL¯•÷Ãá~ìþÝïfâ+à•ïsqî±#Ô<#!7õÅk?½?þís¿¯ûâ¶ßmNü©;öµyTªßÌcQ-¶ÇWV©Y*Y¸¥fj:ZN¨­†Õ.éõ;=êÔ¬:îú›n¦¸•ªvúš q9â­vžK«Kõ6à<©Îw݇þF¾?u7ýSMð@Q1ÂÃ:ÔöYà™¸…áky„‰‹r¾O/Ô¯ºSuÃías¿{zÖ#Ì¿1&üqåtȯW¡hÔ’ U­ÎÓ»Ôv?Oè¨5ôEl<ÖHÏG¦¸ã•à„;aÞõ_f¢*ÀLuqÐÆ6F€3Ûˆý•ˆ®üGÀ4]A®tGm|2=>$º‘Pe»Èñ5Œ*ñóL\µr]±ñ2ó³Åa_ãC(®4‰ºÝýñîÀ©åLt¼Ò}àÆš¢Ž|P8F³ã‹“à7ýá¶Ž3QäJyqÔÆ 4Ÿ¹ÙLšóú§‘‡c{µÛîof",Еðò°±!T(»3jӛ uÃL%Ú[Ù. 92¥œ4Ž¡L…lú ã®0‘æ:H`¦ºº¶ëRæðòVÉãOýq.¶\é. ÚØFS« ës=M"°vÞ]¾{*S§ë±·€V¦K6–ÈTùÕ͸×RàÀ¢KËD?MA­4El<‘¡>ãGÒf4ð^?]Ú_m÷ÝñaF¶‚]Ù>nãLÈ+âãêä[ezsì~ž‘ð¸ò]´±5Y×÷91Ô3Q²I§éuâô🇛‡™¸ l%»,äÈÔ– m}7*ë°áøš.D~ìö·Ý~®#påº4hc›­.üîN²d>ÔÀÆ0 |<Üï7ýæn†¢@ 83~àÆ:OƬÑ&³éФÛoùeÙa./§vˆñ°qÀÊÌï÷%käylÝtQ‚tõéç›ÂV`+Ûe!SìõJÃÈ4pMÞvÛÍL«ò[™. Ù˜:«³yÜ‚¬Ë:»é"äm?tï§a&²‚\É.ŽÚøÚÌ/µ=KAÇ ÇaWÝÕÓßYY­d—…lLã7ùmy²¤ƒ›FÝ1êŒKò¹r]u䛋.TZúXÊÅ·÷ ØÍÃW™ï3 Ž|ùœÓ¸6qsÔäÜ…mÒg8–:³\fû?b¾V ¹‰Qß«õÿ‡*F%2j¿Û}Ǽ9ì‡*ì OÒtü†KZkå ×N>g¾¬&ŸaüÛ7ŽyS¿AöúÝñpý¾µ~÷úZè¿ êÓoÍñ®»éWëo¡B¿N|ųN‡ûãuÏ]þÜõ¶ßl»W‡/g+EK|• –x×ñ,¢ð<¬øP¾Åªðý§sKÒž©ðݧs¤Ò&i³´åÜ‘WD^yEä‘WD^yEä‘WÎòønÓ¹µÒ’´NZ/m6J›¤ÍÒŠ<1½·ñ½€s+ò¬È³"OÜèÄçΊ<+òHä‘È#‘'¡àHä‘È#‘G"D‰<ñ‡8ñ‡|zúÙk¾å7ODd§È_¦ož¼|=ÏìAyz. ØXƬ•)E¤£ÆN¯€7Çîn¦-FP+ËeÏ´7¥•t1zTÐî¡ޮæZoGàÊuiÐÆ™häÅut+²Ñd§‡Ï³KŒ°•ë²)]÷Šq–:ެéîÃÕ¿fâ) •ç’€¥ ¨,R;z‰ÈA½µ—'ÍL©Ñˆ[‰.ŒÙ¸:—4cì"¥x w»™‹ªÀVªËB¶kXç˺£SùÂîûž(Oóý¯+ ">^ÎçÜ^ŽÀC樚>çî¯fZŒFÔóeà%Ïvø\³…Ä!uáowøùúswœ©ÿímàÅaw!XvÕøÎùôiÖ5òr¤á3ñýõ•à¥A/íSj5_Ð &ýp[)~CÈ ) endstream endobj 350 0 obj << /Type /ObjStm /N 100 /First 889 /Length 1716 /Filter /FlateDecode >> stream xÚÅXÛnÛF}çWì£ûPjﻌ‰§ÒĈ6mšZ¢d¢)PTn_ß3ä’QBºNÙq¸;3g®ËY+®gŠk&„ÇÓ0©-žøïhÝ1h<=³‚ž sJ0%8óïB°Ä@NH&¸s‘Š - ÜB)Ú2Lh]Â2a¬ᘰIÂ3á%­$L$F1%9“ÜA\ &%P•”L* ÍRÁ4L©™´Jë,IY&2™tqòC°"= ñI¦,Pâd¾öØWXµšT8bŸ)¯‰|ÞA¡Åÿ$ë™æ¤Õ& öá)N’iA.C»ä2ÐÂøH9„O"VÊA\RÀ   ²è[(;M_/…V“øO^==Ótpú.AûÆÅ£”MB“€¦só&L p^n›´(R*·Ãôq°¡ýîˆøDÒ„)b1qá,ÑÿfÄn›®tŠõè­û÷‚ŒWZŵPà:ÆÈ¨Œ‚ Ó§çIµ^§åâghl¬í·e:?P«÷–ôUÿLIÚëK¬èxO\,iÀÇ·sºóž¥åj‡þ6«ße5Q›ºjªyU(&Áš!&?Ä„E:$ÿôIÂÃÆœûIKΫms1¯óMC4ý>Ü~\ošª9P©ôÖôaùAæP\4,À¥IÙÅÇЈ9iÈ/Y±9ûtpÿ.A“öz^À-aNpõ’³Ç yš]íV«¬>§yðôΑá®@uy:´‰­ëÜžþÔÙ"o4áõ°½¯w KŽâÄ•–þú’Ä^ÒŸZð~ãpµÈ>ÈÑ;8ú_`OÙ…;ÃLª@“ÓB„/™°½,øð¦iümß {v^Wó‹ ®°Ùùé›]f`¿´»ùÇ'/ž_>~~yÑšt™^íé\-é÷6f%’ëxÛWýTs$ˆ5Gé«IèHv_Žå‘ЫçO_×U^¦õG¢ù¶©ó«ÝçûíL#­¿¦óÄw»îoc#äóºÚVËö<ÿ=/Õû^áÔN4žÊe¾ÚÕy¹êÄöFÜYZϯÛoiÚ\ ¯'0Ö›¼€BâYÖÕšž},·Õ®“Ê71Ž´?F÷ºä£F«#¹'yÓ±1Ú}´Ë‹EPÐ\·¥º¨æ»5ªt¯°nå×YõPQÃëˆór×TužFEº‡¥q›Ôéû`G^¶”6]N†‹ßm<·ëÌo¸R~çHÿ•Y7¢åŸ‚¦¯Ö¢ñ`w•!Åñœ.Íóé‚ܳwÞÍÎ_·‡ËÄîHÅLLKö—yŸâ–íÏ‹¼E:j´_sCGŽ+4û”wsí|‡ 7x`ha´5ŽQ]­êt½ÚÞ÷þê8hi“¶uŽO[ûri:´ÒcµË‡þ¼ao¬#ëÈ–wI–ÛeU¯×Þû¸àà[¶ºÉç Ê-ˆÞ¼=ñUZf5掶á»r ™Ø˜(übÀlÉÇo)Ú<|!ó'YZ êNèBÞÊ endstream endobj 468 0 obj << /Type /ObjStm /N 100 /First 858 /Length 1096 /Filter /FlateDecode >> stream xÚTÉnãF½ë+úÌ÷¾ƒ&1ȆØY¹´­¶L„"’JFóõóŠMR²›BæBVu½W{·¶Žq¦m`Ò1í3?É i§™àô7L…¿cÂì<“\2í9“Æà/˜ |£½bJYèš)«ñ‡ÌéÏ’ÎÓÿ@&Hf8΂bFÁ_0ÌPÜ`™ r£ƒgV³†+˜%b;©ñ×ÌdÌ s–ìŽ9Ä2Ü3G8Á™—ˆ!óŠo jðv¡™·d·,pÒ ˆcD`ì’³@vpr0RQàH¢œz„j„rc¤‡` ˜$% h1V$¤¥ÒÐF‰Œ]QB T,ºBKŒæÐ7¦PAoŒFPÈFƒ®™TøÑ kJP#(uÉ ;ÂP†Aɇ1 “f0 a<  òŒ ‹ |AÝ"¨¥Ê-è–ÊÁøÄØk º£º°'ÂQ—`†€‡ Tš¿1AUJ›ã)‡ žò¡Ýñ”CPÁöï ɉ€Yì’ †L ‡>{Z9ÌÝ`‡$ÇMÀÒq´ ›BÀACpd2¨äà˜Äœ €.Ðy˱²`‹]’ÂØå âXl“´r¨VJÌÓb7¤ÔÄBP‰*-6JJx¶¨M*-vJ*A'ª0O‹J¤ÒvóæØUñ¡N#ͪ©†*ÖÕ§Ôõo7ïÞ±›;vó}{ß²›[öænèŽÃ±Ký[öþýæR/°¿R‡¶› gµ@~èªáyŸ†ê‘2øŠ>u»«c©×í$¶×ߥúi¡ºôT}|ÉÈEüªðû{Ÿº¯·6i»âðº¹ðôÃþPWÕ@°UÍ.ûX3ìïŽÍãPµÍ÷¬ÈÛôõè-v»ã>5ÃDZµüŸã>×òнr^pKýZàò¸`þ‡ç´Ã<ê§—õ^7¯¬XOý¼N£\n ¾,v– Ì·±ŸóÏâÚDÛnX†Hr¹O˜nrçª49]µ¬\C*z¾‚£\V|ÚcÓÅÓ|‹. ôŸÏ©[X¥zÛ籌ïA<³Ò6;úBìZŒ7–9ú¨Ón¾ï_,¼ÿïÓ_d?öq—²#Gú+CAü&öc°}»=Öóü=¼¶TŒªj2!‹¢Ç ëô1cfåJ¾€É‡]ΘQ*ìU3¤îÐÒeØåAÞ¥jwÊÐE+pC—öç—鬖u`§f±ìXÑ|m¥ÒîŸ4¿§³²‚:̈ÃjÞiIy¥þ‡ª‰Ý錺Р춋ÿ‘‹Vvàôé´›::Éæ)š}œöfV T‡ÍߦíaùåAŽMEa;y=«Û/rËêj;šÅò]NCüµí§WnÑÊLJùõÉb¨éø\ãY½ŽT¯ j­M;,—`ÑÊ×üÃíô–C(ïGS^Y\Ùæ: S˜Ï†OW* endstream endobj 619 0 obj << /Type /ObjStm /N 100 /First 852 /Length 1046 /Filter /FlateDecode >> stream xÚ…“ÛnI†ïýˆƒwõyP 1˜HH‹Ä"íÅ ibOœÙ{,{ÌAâá÷¯îNBvšÝwu×W5U•!…SRJh‡C cpXá'<ßÂY bV“ †µdÌÄi#Èï­ À~/”D„"%œ‘B>I(‹|F øn„ªøtB+Ä/´Vg*Ôâ…³RèÞ*aù,ŠC-ÎZaðæ¬ÃÉ÷ L@=¶–çHX˧6؉sÈ!+ܑÀçÜÏ <÷ã%ÚÔ8IxÎçµ1è=h¾;⽕ ç+Qy¼–Žða4Cݹ ap‹RHÜê‚f2~ˆ«¬"—_AFâ<Ѐ(¸‰«¥¸ƒ QŠ%©+À)``ŸPÁÀê 9¼ô‡b&°†x@PÀC}LŠ&ò‘Æw<Ê…Á 2†À`¤³'ͼ2l€›L•x¬„‹Go1oϳ·:L<ݲ‚ØìBf'yuÙQ—6ÀcâÄãö59ôî1bý¼%^"„£[ÈŒ1“Çx´ ƒ]È졨wÈì+¸2î3†Á.d˜¢Çt!*\+… á^±Ì™+pL»¹â–y¦·ƒá)É-ca°‹×ûà1J%¹¨¯$· ea„É“mÝ5ÃÐ<œœˆéG1÷¿÷b:O†ë]Ó<§§“lŽˆþò¯ägcä]íêíµN@¶ L»¼EØû¾k—û„d{\éáò¦P¶Fþ«®ÿº¸®wC‚î®#rÑo†þ°KÜÍåW”¾‡•j_÷ýp}Ÿþ×Û8¦ë·ÍUÛtËÌßÝÇú/sÛlŒ¼¿m‡¶ßdéª?¥‘çýz]o–G]»iøÞgbz±š]½Ú/‘[ß~ˆ$ßKîQŽù§‹C ÍyÚEÝñåÓ¾ÙÝ&ºªåp&ÚÍ~¨»®æBSº’ãWч}½jî…¥—£Ìû¬Ì]a©õ³|ch”ï}½Yð%ÆÐë—Ôîv×ý¢ïrRÍoÿCŽ2è÷ÃÇÅ®ÝÌ =ÿží¿¯·C?ÜTkøñ¿ÁQÞwM·Íá–ÑxQ³æò°Z5ùBŽÉÛ·±ª»fÙyÉÇ oú¯]³\­›ÍP\½eó-E$sD´ËoÇŽ/f¨„=(#ɺ‡eä#&!ÊÈcFlB—‘gŒ¸„<+#Ïñ y^FŽ 9*#ÇŒT 9.#SFH&fZf^D†ó¢ÌœD& |Rf^F&+ü²ÌœF&K|Zf^E&küªÌ|ŽLùs™ù™¬ò2£"“eVeFG&ë¬ËÌYÜ¿¬óY™y™¬óë2s™¬óy™™E&ë<+3o"“u~SfÞF&ëü¶ÌÌ#“už—™w‘I:ÿ¬È endstream endobj 875 0 obj << /Length 2888 /Filter /FlateDecode >> stream xÚÕ]“ÓFò_áG¹‚¾mÄpŠì…\ÆÖØ%Ÿ4Ú]ç×_${¥]y¹¢ Ïô´zzú»g6˜øð/˜¬üÉ"Šæ«x9Ùù­v¼õ(¼ Îz˜?^=zòs’L¾òWÁäj;I‚tžÄIKï*›|ô‚é§«=úéª%”„áWw¶\†“`1ƒ$Æ-©tσ(v»Í’4ô^êzS™£5eÛ£iŸQ8I˜Ì?áž×§ÃÑ–V îÙ¡>ÎÂÕÒ3õ~WžšÒô?K¯œÂ7ÓpáéjÛä¼”¹­¯qUóg<ÞØ²b¤]¥Ž{³¢¹*vÚi^³{e~¬h‡k4yMñÂAÙ½†ÿÌFåÈ3(ˆæAð6%óWe¦PVÏÖªÖÙt¥‰·­ÔAßLiõ‹€+X½Á…}At ”UŠiŠÝDûÞµ&â:¯EBZÿ·Q(q¯´E '™®µeè±ûÝôòF]é?õâ=BAäm§G'ðE#,ìJå93”ÆÂÛ4] ²æÀ©©­.6§é2bj¡w2:©íøS3#× 5íÍn?ƒ“æ†Ïň¹æ]eËrËÈ—G·H¹¯0>$©|@gÑ"½G°¼¸°„°BáËzcðÈpó§Ä^¶úÖ¢2±÷ã‰3½UMnyÝX"ad¹ò=Wnp.ÇÞ{©qPXyŸ)  d×S˜³oZ&`HR渔Dôy/× A– »gä° tØV F~%4 „~ÓvEñ¥Ü.ÃŽŠ<ö=Ø‚¤-¬(·ƒ !Ù õÊ£3!ªŠmW>7µeˆbÀ®BSpG R·ÇSÐ|$ ”c  hˆ{šáúö˜—ƶkC!SÊ)Ü8öSo«•m*”Q e3ô1¥S¦¥E´;±íYVIÁY ‰0.åDìN¡òYæ>3\ ±¥16Rkµ½š¯Ò0ålóê߯‡ÓP·Óƒ¨¶{®´²z ”æµ9ó±:' NFÁY¾ z ÷¡ôL6-üuépã¡ã}|Ùõ½œ…$’@² X"÷ 93» Ù=nSô2©Ÿ±Ã¯»zX†¢Ãð¬éÏO¬©²2ÒÓ¢ù"«çجã7‡hÀM D·;ÐqŠªÁÑ-ÃH®A¨5]IßÚ’«Ò:Ó?ÏÃÒ`ƒöz Γ»bc¬¥„Õû:Þ”ùÀ_Ô„ ¹QÇÁPÇM+Ô“ÃoÞ]``ùÞU‚¸æ~ÉÍSht­ËIõÄë’¤eRVC6t·ù—KÈ­Pqû¶my‰Â€ªyýÁâEƳµT›D¡à_ð§ÜèŠ'Yß^ u OÐ(8•v;œ’2„L}’äz;ÜÜeâ ê¨ÖX]‹rÁ Ð.á‘v%òÞj«ð²`¸˜¯j¯FFìuˆ ÀW¿¹ÅOz±VsÌ].f’/÷îSž2Õ4îS%óÕjuîÇ áÅ0iêS/?Ðñ™ª2žqAƒa“Å•³{>‚´…æTèG¹`Å4ü½"9†«Õ<òÃÉ,œGî&ö'ZIç~Lzà?ž J÷>'Ä}ŒìÇ5 2=ƒ” ¾Iq!\…ó…¿¼p‰V¨‡­Sˆ¥4säL^S0!€^\#ÜÞ,Îõ„óX<3šžBÒ» ¹/ÀÜeÈà„‚`ô‚Èã‹ÓPJ?»ƒ`Æ5¯ÜAr¡¬ÒÞA>:šÿw¬Œc Peßt1x‘PŠå»ª… H/ }Ý•L€½äßk ä?CÕ^æ~˜.ÆØíÐ÷ºˆ kSŒÒûåêí›qõ äºþ¿–Ø»÷øù‹ñCžG)l}ŸÈÆ®2éóLbÉ"¯€ôüT–¢±‡³ãùƒbKä ùÁaÑ>8 ¨—È(Ä%½Lˆë]I:ÐáÀúýIæ1'/ºš…³#™ œ´Ûð{ˆø*T°Õç”%(8ôÊw~BÄÃñô‡†yšåFÚ6—~z—@®ËÉÏŽ~_¥D(ýŽ&w…Ý*á.b•JvAÅòƒSÛ •Œwm*ÛP—*¹ÞÓ Å2™rƒZÒ›ÎèJ™]†Òª‚&‡Š$®_`c‘/Ô]àš³»j“0/Nûì[òÂ}áîŸ÷확HÛîÞ×(1tµúEsÌÝÇ”¸Û¢¿ôѰAa\ÈA†{ðË=Ç|ô†æû~Fy0‰µ\ÜP[·I$U0ô{ ºHî·þþ£Õº;ÊÐü&ñv{Q,*ñmw;'I¿ÿr®Ûьҿ6­ ÆüGbr´/oI vÙ3"LzÆ%÷Œ¹¸ Dq»ïy¬Å‡_þ°ÛBsv.±Ýãdx‘$‡‚rÿ ŸHèj®‹ ¤’5m¥Šß›ÄlºV¥Ä»…Û©txiWµK†ßM·M±qÏÞèå|YDý8̦ÒÊ=ÒtéA)9ñUÁàt(›¶‘Š:Šßo`Õ`f|·Cr¥‡ ÌYraÖò «Ô“·Otâ›™[†^\ò2ߨA–*sV(OË.°IŒ8æ/¡‹u/¨Ì´µ0ÀL]7|)0d RhY‰È˜JPº>·D·:›!õŒAݽ)ù³Ïw@ùÙ_.•<×íµÊœ"Aê=G3íÓìþP£†T– ^ ®¦yèþÄá²vMœäwàû™{§ûàÿE) endstream endobj 885 0 obj << /Length 1090 /Filter /FlateDecode >> stream xÚ¥VKÛ6¾ï¯Ð‘V²¨·ÒSšG¢‚Ô@›‰¶ˆ•%U¤²»ÿ¾3ÊÑ:ve 0`‘ÃápæãÌ7ä^?î•¡—ÇqP&…WïB+ >ÿvÇžŠþBó×ÝÝöcšz< ʰäÞn¿4µ«½ö®ƒ‘ãÆã˜ñ7?IRö^êjTƒQ}·ñ£¢,9‹6_w¿ß}ØÎJ£èF§PsÅ+&°šxY‘> stream xÚ¥YmÛ¸þž_áo•ˆ–(J–ôC.¹¤)²ipÙ )rA!Ë´­F–t¢{ï×w†CÙ²Vôº-Ä|Î çÏhý™ÿüYâÍ–AÀϲý3O¯6Û ~{ûÌ7t.ºÊ_îŸ-Þ„áÌ÷Xâ%þì~3 ýˆ…"<ñ»_Ͼ9Áüûýߟýzbr~£D¤|$2æ3ɸ  JE±`~ HŸ»aÄw¥jÓ¢HÛ¼*QþXS¸ XÀ:õrÓÊf;›ª(ª9_:‡¼œûÎW§ÝIÚÎqÓeÈWÑÖ¦2'æñòš6ßôy¸C·1mÈ0öYèßhɱՔ=Íu[ž¸€xÎ:¥ @ÂK‘ÐE0E DÄf…ÿýØäg>åéçs×wÞA¢}{-Cb.mh<ÌeÉb?a>Gíùƒ…É RR³ÝY\$íöO‹`3…Äè7–D<êä9¿}¼³<ÝÆ—·ÑKÕÆ¦"6Fá~§¯È¦Òå¦jiÚEšËŠÊÒ’9UÆ©:r%Vç}^vG ôcý+&¾­v•;"‡k?±P@jËó„È#;íÌ­Æ»-±y»;§¨>…5\­^L1UÏ6Æ}¥©jÑe…œkFøÞRF¹¢ÕªFW§D§ïqžxZeÖµéªS·'fs7‚|:äœzDYk¹-,:Õ,Š*K‹$–¥é\ùÝ }b‰‰¬ò˜îë^dViIk«zb¬#×ýšƒÆk¹I»¢íéláƒ7¦ 4W»´BZeƒ²j´S¶Ô¾æq|£}µ®š”‚º;?\”úßPóÂ<`} ×Œö˜œ–‡Iª ì)ü7)'ú” úx¼!áÖ¥É+ו%R#ëê¯M 1¼–´sºÓEúÝ’Sh<\":3Á Á>’”XN! ôüÂ4¸`3˧L£6)ý¼–«<-ݼ`ë¹æÑ—R¨ë LÂГlËèÐçUGÞëžO%Ù¬sÌW±äXÌU7’2Cál€ñ ùÒ’¹¼c^¤Ö˜W€ÿÐ(Õ¾Îáx¡á¢Þnª½ÍÞüw_m–Á âƒ÷#L @Â(¬EQd8"²bPÉè-I=Ò²õH¿ŽÚS‹óï0Äro$Ag¤ŠÐB`ßÝX@“PBKA·LŠE‚FgLê‰(¦ÔõsTÁ¤* w šQmø[gÊNcÒðÕ.-ÿbr¹näªË‹öÿÈCA¨$—†eï¬Çø2K&¿ _ˆ­ø²§¹À—›¶fkm>sAÃE]UÅbŸbYƒv;ºì{@fºÀ;ôkšýãâIq+ÄŒ®@Ì;à ìf‹aÎOCŠH(~ºÇÄEžÜ·£.¤¼’+°{ÊÍóôˆ!×sêða Ì=¸È˜o̬ýTBQÚèÖP‹¤S z̈J‰f m^<1W±å-1;GèJ~ÖSðç<„Š™VÐòã–Ó,bÆ—>óñT,jw@>Í#¦ñ|8Ø>Íêªi•Žè ¾[¼¢°ˆß®ÿ™üšþ†êBÿU#Lí&Õv}Ã=> ãÜ ÁÉ)Ö,ð <ꄦ}´§L¶LB* c Úp¢1N#å/Ÿ^›hƒEõ Z¹W$¶H3û£WGN·mqâ¼ýðÙ¦[2Ò5ä…´ëU䫃‚×!ô=RNû¶7ݨÃ"Kåô>Ë&ÍúW„,°éÊŒsN0›ž–Iå£ðŠòÅ]U~ ×A5¦n áŽîtʼE'D<Àrͦ ³7.ÊÁ (çYS©¹î€ñM§úüEï”ëjpçpKÇo>Ï@jNøk-4¸y§åV›–îý…M "úª6O1¼úæk øD1GòtÇÁ©ÜõZè’ÅÆ•ÇV»*­Uµ—OáÕs]6SÓ%õ²ût•l»šÁÁé–”ó¼PòíÇײqjð1’Ô¹ŸXš¸£fªš¼„( bÀ ØNâ‹ôC?PaLÇCQÀÂ$„à‚H3að+m0/š V¿Ò)Ä‹{Œ¬1ª†zý‡Jú<¬åa¡9˜ŒÄSç/¢£‚\Fbæ°Ìõ¸'vÏÔåxÄòÑkÒv[ý@w_ä?-‰—{´Mà?î3žÜðmÿL8¡ã™Ñ…zûüh…Ú]k½\êªq´¢ã4iä4"kšá'Tý«‹ I>ˆ]Z…‡žV E7ñ}矺èv¸$˜Ïç0*å˜õàû—­G7 çíÇ÷·ow•jñƒxÝÚʨ¨NÂÂè ªêè<åŸ|(›ÁSë©ÝùTl˜> ®íùr B~qí›ÔÞ%ãÁÒÒ={`…\,hÖ êŠÂ.Ök¬êÚºkŸ*5U!öºÔˆÚàKœP³ ‡ë¦Ú6©­ýÊOÝ>mûÏ$_¿±ë12qyÊwøG´„q/¸åoh'Âé<3û<¥Hñz½Á'^6VpiÜ…úýÖ•&{ endstream endobj 915 0 obj << /Length 2682 /Filter /FlateDecode >> stream xÚÛŽÛ¶ò=_aäIjYwY ú6Éf‹&]4›¤@ÒZ¢mèvDj½~9ßÞeË^QNXó2$ç~“;sàÏ%Î,ö}; V³´|æ¨Õv;£ÁŸ7Ï\ ·ÀÅò—ûgË·a8s;qwv¿^uŸÍ¾Z¿îX#y;_ø¾oy/æ‹ ­ÛJHVLæu5_x‰ã¬¬`þ÷ýoÏÞÜ =ï±BÈ+h¹N»Á,Z¶ë„ÛýŽã£ a¿.ÜØ$K¶åïÙ6O¿k¨ð T`5,{±õ}FÀÏé즭ËKz|ϵC@°Gaš¦z1'ºÎp½¼Tѵ“²/–Ëý~oçHE©¨°ëv»i›7r‰ÈÍž¯q}Û éð:¯X{X´¼àLpa7»fŒ|P7´‘óêT.@Ž+×jù»¼åÎKÖ´*º¦Á‘U·’vêN6¤ÝMÝ–Lê j¹CmQ§w¬:>ØIäEÄxÔåÝýûßGÅbý4~ÆM¬»×oÿí‘s×úŒ¾1õu-VeLcëîÃøYEî7'tçDûW%§9ðéûß %ÅeK\n”†yqb¹qG]ìɋ̊Œ w¹C3Cô ˜X^áÃ`ªMË•Áâ☃¹ÚQ ¦x¶ïºWô¸‡^ ÀGôøòÒ'zÜ(*P…'H@ŠA˪â@øÔ÷7ô{@JëNÛ€£ØÀ>;bj°f.Û-Ô¨µjx®¶¶-k@KvyÊ ZéDïðŽLݰTƒ%ŽûgÞÑu âëͧ[¿Z#‰«Ý•Cïõb`}oYÙDVªŒÎÊÔ4Z À® ÉZmiÀœ¼0r§kDõ@pß°®=ýJ“–á N(ˆqéàqÑÑë$•µb(,×›Óíê¦|FŒ`xø‚ü<¢ÜÓ¨ÿd@™þâ¸Ê»¶É•tÉÛPÇÕWâP6²–|ÜÜX¾]y37°sO»C/¶#xNáèÙÁ|Fžõk]}sÜ`Ûµyµ5ùÑÄv=.o‘×^pR–Êüa®…æ…V‰ÒE¡‚€é×-Øï¸>ºExˆžš¥›‹ÏyÁ^ÝPxÆ12™äå8{·íªêDäÈcÓ¼¥7G%ÎÀ˹ @p;*9Ž‘©ý¸«20¡ÑgqûýÇ×|4‹Ó (_C/ë* ÖÉÂzô>¸DBTÒ«¿kâúåSw8ßÕB~T‘ÚüôCÎ÷êÒvŒg(±Ñû-þW©$r— vâö§·™¹9W0*îÃo–‹¦`Ú8q}¥v”8¥,ƒ˜ëM1€¼Æ„0DÍŮÆGLJ“”5l]ð3¶×Ða‚z)LðOEZEÊ•\-¡îó‡þI<§l·úüºŠ¾TÐZGùPÆ$Ï€þ¢¿‘~„W\W7LsâB ÎudÄ,]ð{tÃ>q‹1qÌ\îr5 •Š=@lÉÍ™ù·7ï>Ý™Þ À´·+úŒÆ_YŸ „êA&fÜÍÈÚ6³ °ÄÔÜR±‰¨é—W½"Œßÿ…ÉTg›¼à?Àñ ëÁ[Þd¹\D¨?ƒ”( ¬»–oxËÁBÇC©E €KåÌYpŠ5º°òW>xŸ$Ó*1­1>Ãj œ¶K@…FŠ?Lä¨ï8\o0a g…..žöêõ Š£ö„€O9"¢Ñ¤`£(˜¥uµ ììHçÉFÏi„ø«V0Ç1Ù€À›|k3q08TuÎÌpò5½äf¹Ú”19 ’@'g}JÇW^b½#E-méÄH!7{¥!Z^&ýÙædœÁ _AÞ„§9"¨xê·p» Œ0íÕ–TÖ³ƒ‹Âee.—Ô'ÏD‡Nb½ãJ§Â^¹Âð„À)cÀ“JŠŽÐìQ"zW Z0ÐòòXB2JŽÈxžÈ µÖ5–®¦9¬½0ÉhXþ–*mC/ì%+^ŽÄ—£,~ÎÒ¶n9Ëž¿£v'Ë¢‡ÜÖ5ä=‹tÅoDLÑýùØã??׃ñ«X•Cä〠ơ¶ð£ÏùwiïJÛà“Y(‘»šJÝÀž¢ÕŠT A‡Áç½L—ÇO7.‚eL›ääIñ\õ›`F2èBLù-Wƒ\9'k t '€ì„,Ù³|ÜOË̈dlÇ’œ II”êòè‹YÓyï£p¡Â¾å_+ MB»±“&Ùçr7¢‚œ©. FnÏ?æ_8–*Õîs€/ :9æ c¡„A_‡.2®Ï€Â’÷¡l ê!ÿÜ»Áܘ½ÀÞÖT-ÞA–¸é‘‰MœmyTe^ñlÔÒÏ“\?Ѝߣx¢l°÷98/Qo$å,_0»¨²zoÂ)B±os]1ßœð"¼‘>x¾ PP‚ÊS”Y>§­¸¯©PGÎCà30 …nh¦7¯U!Ó´ú) ÛšïºÙÁeÂ|™²—Ì‚jHŒgy¡²Uu|ƒ)ÝH“yØaϼ0¶½8¼ÖdÖЋøX“ùâÒ'͹í‰[wÕ}óÀ*Óº\Nå´±A™¥#A㫬^ëïABí8YG\4O4÷ºíbµB2P”5iÝ(ÝÑôèúý„Ÿ ­PóÁþ0“H™%Ý:0Ô‘Ë®tÝñ2%L]Iø > ºê“PléùÔ'¡ Å_v¢]5¤ÄK±ƒ> stream xÚXmoÛ6þž_aä“ ÔždI~i‘i– P4HŒvEZ ´EÛÚ$R)»Þ¯ß²e‡t»¢@C‘Gò玎z!ü‹z³°7‰ãá,™ö–åUhfëu¿^EVn‚ƒŽäÛùÕO¿¤i/ ‡³põæ«îQó¬÷ÜmX¥yÝÄqŒ^÷I’¿ ¥YQ0KÑŒfa8 Òþ—ùïW÷óÃeéhôZ¡äKµÆgj§É0ŠR«ÊV5/$ËntÝð7x7œ5ˆâa”žI¼¯PMus=м¬~É ~mäÏ-Çí³ádÑþ,‹Á.½áVúD¡g³x«öe¥¥æ®Id)Åç0JÖMmáŠÃI€3šñ8˜orEw‘Â4^q¦›šÓG+ ¤¦A£øª)ìXdà Ž“àÝÓÏïŸüú©\,ù‰© -™ƒ!MÉE B…Á’ Ñi?FNJÂYÐTæ+cšg4Ã`ë$Øïð†ÿíi"‚ëzÃ4$í列X“”Ú+pž=›”È ZÊí6„¿ÚZÙÉej©pÔ*³ ™~›É§Øäìó)ŽÁÐÀ%ÀÉiÍ7¸}–8Â`Û~š¬ÎÙ¢ðlÍòÚã>8¼@ðÇŒFZÒU,û«ATÌ\«”â¬^"ú®˜¶£Ïa*nÅžø²Õ9 FC“é`fkn¯ç§î‰1œØÃ¡êË+ûÍÖÏ1\ù{ ñ1Š£ ã+Öú•žQ}+ñ¦1õµÂ#C Î.¹‰IÃnfaÁë(ûe(®»Œ6€9x73a¥šÒD*Ia£XG#zPô¸Ó&"«Ö‡x´Ûf8²àZûƒÑäÁ|cϱ¾Ð…”|yoÙ¦'®/º+äX&Ö\f·ô©,ñûc—cœu@ _æÊA~Œ/åÇ㳊×z_q/.ã(»È×¢´®ÇžÚ™•mL¥ƒa'üVù¿\ÑÐp eÝÔà3¡¬ƒý ÍrA™7mI†¶ƒ¿Lˆ˜ë6VþÜf÷vðÄ¥˜¾Ë3€ÕÍpLd¾b:`ÃóõFÿÅ)›Ó,Ër´„”í¼ó§V™­BÖ%´{À’C³š5ÿ§ÉM5„U(‘Q€tVrôÕƒ×.ã.…A«U¾v¡­ùWC,K âYäeÛ¼RÎÒ¹ÍÕv]º–@‹-„«ã4¦öëÂå…Ö˜ÑxOF$ü±?ÜkÑ…0¶ÔÝ´$Œ3Ì9¸vív7YÊ~‰ †;v<ÛéVì²ÿ}³„ˆ‰ÙWûùva1!c‘¾&¦»ˆ“czâo}Èšþf¹êÌ1á¨í…œl½j„©ˆÊGJhÛsŒKtm ¥Bu߸¢BÈËòßhZѪÑ$> stream xÚ¥ÛnÛ8ö½_ᇌŒɺ[Nч6M:Y´“ qÚÅ‚–h[[Y4(©‰çë÷J–Ñ60ñrHžûÍÞÈ…?o4sGÓ pfa2J7¯\µ*W#|þðÊÓp6Ú=ÈwóW“Û(y®3sgÞh¾ì_5ÏF߬ë5ÛÖ\Ží ,ÿjl‡adÝ•UÍŠ‚Õ¹(Ƕ?sÝÄŠÇÿ™ÿûÕͼ{,òý ±BÈh%þÈ Œ}Vœ„Ž„„–ïDc;Š}ë‘mÏbcÏ’é8ð¬5`:¬-«×btL0À›9ž¯É»+‰²B‰%~äåŠV–Bêóqÿü7Ø ­·Õn³­E͇žø¦Îw½°àÕï¦K‹U;ÓñÐzÊ  ©«IÅPø­ ·zÍic) À6ž:¼å¿Ó8/ LÖY+Ë"¯jž]!£È™y0&v¦a@Œñœ±Ç®5o¦”¼ûS«¦…,—<­…ܽVw¸ê|z­€èü[ö\õÄRK®’¾!õJ{sÎ+Z¨¶ ©¥DæÈYàšeàάâµ#`"©(5誑ZWqýç8Š,&s¶(¸A:„„A:-Îð®Â¡DüÌ¥(mÅ /râÙ8^¤Ù±á ª&yñ €Áoÿúô0¿Ÿßü÷ýÝg³¦|w#·â[$òŒD³À·v曯̷5e§!_þ¼ûJ#Vff[xm¶ºÌˆÆ§Ç÷÷ƒ§‘(ôÊîØÙÓ® ¯þ4Ù+#N§¤0‰ÅIY-¤Ù¢Æ5¥Ú‹oÓé7nœW„Ú éûO7ÃļF[ù²}:¯ht j%¯Œ*T ÔžØoP£}Ç3­ê°´'˜Ùâ˜Ý ì*Oî´»±©¸üµ¢ñZl8mg`Løª=<³m ¾mýòåñæóÃçûÛ»7¿|~£Ê¸šÄŒ3ª£Ý_Eæ´d'”)ì)Ó ûÂi|Îã‡sªxÔÍX÷ô·=­ÂyÆ—¬)jCpˆ<Ïš4•œ"eŤZ3É'ì1ðb`ßF)7ïI£¿¾BQ>H±’lCܾÍ!ÜáêÁñŸ9Ç,Ëèœ,}ß?'KáÏl³-0þø~pà]|¿•&ù˜Ÿ–¦ Ó ifD•î…:é@iHvg8xJ´á)Ñ—‰'§P¾@ÌáEb>Nmßsbø?s¦³i›jÄ” ^‹Í6/(#[¢—B%6´ šªhdÊ/Èçã²&òÍ©º^9ê™b!ylÊ…õª)P$'$‚ù3O›z–‘ƺ q’#•éj$$/8«ŒÑifuúe?;ÏÏN%S§^ým¢»§^yy”iVÍBå`ç" €âSèD¿VðÜ’ÿpSgæÇgê…ÚîS)sèòŽ.U„­ëz[]M&¤䯸Sòz²•â@XÕ3É%jýÄĬ^®LÂãGuÙ€–TWCœ²=MBÿžUSþCæùÑ ÉEšI:a?/ÍG™<8ª¥œfC']кàcµ–´–ñOꥧ¼^8x1 äüËÒ}>À© ûÁ5½`¯ìØ´F}^öïTf¤­S'×¹™ ¦Ú=sf1*¢ Ønh}øó‹)aKCž4S1H4YêÊãøÞýÑËûÆ;ÀX s©è6JOq”¢ò¬òu„’ŽzˆÁ¢­Ép‘­à™™˜•‘íêí(r[o; šE“€Dˆé9ª2ªÙÓ¦-®T©q!aXÎ7Ùá“’óö&_tᘮºq¹6æƒx–?çåRØð5$d´eªjÿ¡Òü•*Ò)(ØÝ’PØaRØ¢¹âõ€Úr)…¬tSB…Âu¥'Å|8` èUs: N$Ûli$‘Z ûVî:(Næèò^Ø6õ —ï%N2ò£Ä‰âèœÃW°vxÈÝ\xàì;ÿæôÝ~.z@ç‘ `ørßâ_„FìèvÄÉÈy¤HOçÛj ¹®^YݶoèþžO4¿ANL©È°7ÙkØtdÝ*Û“Xªb? >”èêä–ª*\¤2Ç~Ê3N Ç*àê î û>8j§;Ö¢)2zkAÄÒF¦ÚB8b}»«¤JÃ,¡ïÃÕrmÊÖÓÎqaD£yªòBêùé•­Ìaí'Ä1²Ô¶‰F7V®zÞèŽ"а¤;V¨ë„©Ú56 ööVòeþüæ_Øv8]EÊ{Õ}K"pܨΠjqEé'®bÐRÕ­KÚ",¼#¦ñõ†æ+&ʵ!T*   Ð^[#©w¨P~ž„ñ‡9 Žcù>àï]£mk¬íUjRu{{åLÒí0l[’¸€DâŠ*% ;t1¢ëÞ¡ÙâU#Œc«b'm~ 7”¶m¯y±½×ÕÖ— qÑ©ê* <ëK¡ºR¯–¾G™žPº€ƒš£Í¨¥NlFÅÌÀ# Q À!c Ä 0CˆT¨ÔN•Yà kÈãÔm»ñÇ YsÖµ+uÃ}ÜU¸ºÍ½Lw’»Žx€)x†2c2£y—TÉz8g?g“××oˆXš}ýJÓß~Ó ·ß~x|cßM@t; /Ó¢Éô ßkˆ= àR«Æ¬"¢}òƒFºiVç4^¸¯è|ž²ZØ]¥©Qׂ >Äì)'×éœLaK¨lA?UjSìÚµ´÷DdÑ®¬¨±P—;+Çè/'tBs8£H_x†K‚†^Ü ƒ°¹lTa£œ2L.YÚ¢Õ‚”)ª +òšœœbý¸G,±8"bqt@.„NÐC2bÌ¡XÍ©“A;KúîÃÐa]áO}S]qd<ŒÔÁ$ë$ÑÆ$…èœb7Ñ?ÁY›É}'¨8~ÚÈŠWΖÕéÚü2Ëdz"¶ºÃØnJ~À©mI¯RIT=–µ¹èÿx…‹î endstream endobj 796 0 obj << /Type /ObjStm /N 100 /First 852 /Length 2186 /Filter /FlateDecode >> stream xÚÅYÛrÜ6}Ÿ¯À£ó÷ËV*U‰UÎ*±E—D¶×Ô 5âzf8ER‘õ÷9 Ò‘W¢,‘£¬$àÐìnœîÆøh™`>zfX‚i‡F2#ÐæË< &ñDdRbÒ`ŽÔhÃ,HÇdÀ,éÑb\ ¦0”d ÏA¦,æ)‹–ÆSë©ÈTĸVL´F‹õ ˆv˜§=ZŒC"1ÏpÇÞs‚±hi<0ã°ž‰ÌØØËâ ‚Õh±ö´ôUÖ£Å8Ö¶ô]N2KrcGßå,ZÌaÍà1Nr»-ç‹ÚÌ‚—ÐmèñÁZ XMj¥“z¤¶#èhz…@I„Á+Gbx¨Ó[š}FÚB(Ô,ÒmSFx<8Ò=h¦œÐ, ¼r)R#ôa&-Hð™–¤H«U”xLëgQ$Ò”íI ÚŽ0kÄ6F@W!B¯î")VCf¬nŒ£qäºöé”OÁÊZ–ä¤nkñ@#ØYJˬÔô H¨-B«$ôHr‚ƒZƒŒðë4^a룚E‰‡NÂÈœ€z#fÂB4]2§<ÍR°UZ ˆØË¹@bxæ<|0B0çaì'sAÇYT˜ˆg^¬£<^FãÁ`r{h#yò³õNã-¯|$»ãüyöìßß̾ûŽeG,û©:®X¶Çž•‹|Ÿïïªð ûþûÙ³ýaÌÏ ;ÌÏØ_£E‡ùeó2ad‡y9Œy•0ªÃ¼ƼNÝa^c~MÓa~Æ$Œí0ØßÆu˜ß†1‡ ã;Ìá0æ(az= cަ×óñ0æ„0¦×óÉ0æ÷„éõüû0æ„éõüÇ0æ4az=ŸcÞ$L¯ç7Ø· Óëù-afÙñõ¶`ÙA¾,fÙójÓ›¶ññβâ©.ëyÑ$¾JC¯ŠE™ÿX}dï‰qßϰD¹à÷öÃfSa¥w‰1’ȱkeßúÔ¾ŸAšIÒ¼YöcU/ŠºÛC¼'Aæ-{'…áÔdâ$ª¼ägÍúÔîèò¬Më¼,7°ëõpr¸ßý{vÑ¶Ûæ_Y–7×ëm[µ¿ÌWgEÝæ|ž'Õ Éó?ëÞ'HÕjÍ¥£0%¸‚nN¸ð¤Ÿ¿EùÛ$Ï«õ:ß,¾Å’Å„ûÐ~}žÏ‹Ý¤ûrP¯²œÂ‚“›¸ñnPˆ½:¿*7KÚÞÉÓì¬#7`Ye(øQške§ì¿ÇÞQ”%GÉNß¼Óƒ|Û\®VïÇ`^ÀµÓÞ/(þtž—½qûgKòöψ÷ª[Ó³ƒºšø4œ“½,;.>¶·Ýöö wPxÜ Áß>AH ºú¶?Q¡?Q¡?QA}áD=ÊxJ8®)Ë1’GhJ›È‘äp$Aƒ\Öùöâ^—¹çËÀ}:È’´ÕÜ!p*õ'žâNÏçU½,xYeË|µ*êël¤dÚ:žrè8¥ŸF.)Í©ÿ´²\·ù²ªó†7.GJª´ç†ÖíÁ3ûÁtH£bêÿc’;ÉÚ„$½Àˆ ÊÔ}1W˜Ùð‹v½š$š‰po$h:x¡J+RÿidËÃâüy^/øvq~›ÛÂ$޺᪉ü…¾ÍOäõù)t¼DeFÇC=?ÅžŸ¢ìß»¾ßóYÔý¸ïû¦oûuâ'ü§÷=ÿŸ+Ï¡äË9k9ò ’~ ¸'RoÎËåe@µspLÔŠœE†È2·5yß/3¬àœ€‚“kƒoT©?ʱ?wçMÑfÛºú/¶hn<~øˆó2¤O¢Ùú»‰v#S¶(›ùeÓ”Õ&3EyÜ1©‚àVE ¤ÏÑs/ïKí¶åªÏkÎëjMíÉëýSj;±wv$<¡Zɽ"ò2ܦøiÅù’µ‰ƒ•P_sâmS”ÏÛ-_ge¾á0dÖ=fÛªZeë¼Üdù#íQ*ÓÁr£(a6þK&k©¾š ŒF×9È"RÑ¢|ÿ/#öå”"6ôHy—tç©;ʈWWW|Ï·UÝ6ÉŒS%AR##Ýz9†€H©?J–³º¸âÍÅøÌ牿ÔhÓMRa„iR`5Zíå2i¢->®Ê?Çš¾AG ….t¡9]¬*Ä‹D7—c]~Àö$ÆXe ’n1-”–FÁm ]c¥þhe,/ª¦mæu¹m9ʼl¼6¼ƒOÆä›V ©;ZŽær·(Xçu‘c£;¾ºG›©ëÍ)Tãœn¢ÂiTÍÞËq<¦Õô2wjê(ï”¶t:-u¤ËÝ”ö²Òen×ÿ”Rƾÿ ×§’Rõm}‰¤•„/#9¢ÀÙEr%y´È›Ê5Tƒ¿rþ!9RçàÙY¹ÉëëoëbUäMÑðíÅv¼¿;G§FFœM÷ÔÁþkHøÈ;§ÈéJféò¿K¨‘Ÿ˜áKƒN¤ÝsimCÇÙ ní¬à&ê)[ÞSdG$ÌTþ÷éÐÿ|£qöØ¢Ž®6_$äÇå2HäÓÊ!§ÑÌXÍ¥†› ~ê{ЉŸNöwÛT*–h3g›NúÏ€×Ìðå⼯_òyxJ[ÊÕØH˜òZƒìÄb;ÛWåÒóWCÊh®$ýv¤’e O*1½|øÆó6ÆÏ…‘ãn> SúÔäp zZW~÷ ?ÂPégÁtB#I}ïé8*òz~A>ºÍÛ‹ÝïÀ©žU¤Ýh¸Ó`F!Éʱ{“¥ÕWº#ÒêŽeµ˜lÙ> «8ùW£-·‚jp´¨WŒIý'¾ÍȈ£šlR=¬ÀŒ8—:(Tu’~…G÷É®ûwoé—èùbÆ É¥õ7¸¿S4·¯ endstream endobj 939 0 obj << /Length 2485 /Filter /FlateDecode >> stream xÚ¥kÛ¸ñ{~Å"hP¹ˆdÉ’üXôZä’Ý`‹¼uÐÉ¡ %ÚÖE}$µ»¾ýíáP²¼í\‹`#>†œá¼g]„ð/ºX„³8Éü"«ž„fUn.hðñõ“ÈÂùè÷ ^>_§éE‹p],×ý«–ùÅïå–í4—#?Žcor9ò“$õnj¥YY2]ˆzäOa8÷f£_–ÿxrµì¥“ÉR…çɚΓ Š"K Ä;óvLg£ÉÌÛÒTo9 VR|Mæ7ôͽ¬‘Š«À‚m9ËñM¸ó5Œ’Òžú¦¡4f´]""8ÏJZÎÄïÝÓ®ÞŽ"GžlbM€E}D’!A9pXÓN^Hži!÷€6¢%`'p¸âGq¥ôV%*ŽËÀ“iŸ'_ŒL^Ü|¶›éãÍÄcuî>yóÑ}4öÔ^i^)|R`ˆŠO”Í‚Y´ Ò–[eI:õ®¯—ÿ¾wËb%™>â¤PôuiW$ÿ­þävMß=²O44¹GÁ3ËQ'/Ô¾Úi¡¹›T&ü®Œ¨9Mت´£v[3R)š]æ1" P$dßñ%Y5•¬Vk!‘I45ÊßœiF#T9ÅH¥æ‰÷Vã¡„ÝLT»FsšÀSéÛä…ÙO½¡Xàqà TjQ¸ÓL˦Bõ Fþt19!/8ôúöƒGQ_\‘WdÅõ½Âd‡Š„²Ãï DÙáÄ‚ÐĘªkGvæ†+ë¦ÎÐ˨’i{«¶GšXžåƒÔÊ­«7HG˜t'¹¨ÿ¬ix¤Nf¥€ß‚ÜÃ’àŒŽ!™“ÅTäG‘÷k£,²ªÓ®86†9HÄÖPŠÒpf«¢Fq 4¨ˆLí´M=/‘^,‚Åt2µrcïõ§÷A•Ébç°=Ü8vî1óDCW‰_+I3pí Ùí¨#‘PrMƒÖõâ85ºñM#mHÂÅ»Z±,Œ!;I'ì¦Ð(’BêU|Í#7€}Mî|»Ûý®˜ân÷‹~Á𥫆àcVJ~g”¥|ŒÍìŠõáœ}rVg1€,2k£ÅÁœ“71gæ4´8™Nð p$Ž‚ÉÔjÜ$˜üt:ñ®0„ä….ê \5K¼ ™5«Ôjdì"ˆ&6ÿø¤¸4ÁÁDV‡—=^±L¹<|Ủ;8â¾ål¬ˆ| ûî ÐCsÖ —ª‰̯D>ŒÆÄ€9­MÞe¨®A‰ ÿp†®oYQÔèk£å=Ä bw2Z¦©·eiCH¤óiAàn®hˆ:gOu–ñøpWpŠáæ8+‹ß­AâeZøºÅâ/¡û.YÖ#ÉBùí¿^Ý|t#µÂ°oàK—ÌY/f@¶’þŸ¶Òóï0Îáh‘ø&°J˜íiÚJùš5¥~îÆñÚ6ßèvBZI2k“ƤM”“^À‰â¿5¼Î\Ù<@¼õlUvî8ýëÇ«å߆- ø0›§ÞûÚuëÔûôÎÕ3TQw}ë aŽõº£!hŸc܇9p>À›è…R05…Ɇתh£«0]KQ¼³‚`Î:7I-ZŒ¡¸h˜N‹ûŠïX‡v ˆØô5AašŽß¶Ò-¹{Û)µ¡ +§¹,ƶž fLhã™Gñ®¢®ºèˆçÛ)çÛË÷Ë«ßÞ,¯\U Ê9 Ó„ÂH#»$,¹0®¬1ÈÖ‹#Ãunø]Cç„b›™¢@1QaõÞ\î(q¢Æ3 Œ®’I "s¥¨Â?4,âƒñ «ˆÊÝyéomßÎÿƒrµý ëYÛ@tõpﮨÜy&l„4J‹ªøÿ­…<ÑÌ?ß”1þêdÛ¯÷øÌö‹Üe$Ž$Ø÷Ÿqp‡Îµ«}­ÙC·ëhÔ *Û¨¡œ e–çÚV‡ÆÃAC„íh¹Û †ô•ÌNõÉйüH9ɚ͎J‡5dÔz¿ã9×àO†¼&kòçfýŽßcqü†y[Cý 0â)Œ×ë®$ðKG¨¯Þ½ÌT-E´+›q•0õÐó-î(4]lãòp"ì"°Zqê:÷½(ÁHÚè\5.¶½qXçP˜™–uÚ¶¬ “ÜÔ€·W&ºO=“ZÆv­£" OØ œl(³7w Â'›ºCæþÍå¸Þ1N èû¯Òío Ô»6rW8°}Y±o'š!–!Gª/Ü^•tz¼Ö$ãS&fSp—b[ËÓn»ßøNn~‚k±l¦ÅgCw|ŽK)$þTÅôOÏÖ—½³eð,ëÏ«¶,ø/K4î9 endstream endobj 943 0 obj << /Length 1248 /Filter /FlateDecode >> stream xÚ•WÛŽÛ6}߯0Pè.k¥ú4·6é­ó´- Z¢-a%R©­½(úíáзµä¤H8äÌððœ!ÎøÎò`vÇ^žd³¢½ Ìh¿™‘ñëû›ÐÎsa¢{2óõòÆ·XÌÂÀ˃<œ-×§¡–åìÞù®bæýÜãØ‰îæn’,œï…Ò¬i˜®¥˜»Q™“ÍÿXþpóvyH¶ˆ¢¯¬ g~¡¬0HÀ›ÌÒ,ñÂ8¡Ú~Û‰y”9šmçî"ËœªÞT ü3ƒµØÐ¨ºŠÌÙkYËž ]q¬Ú$˽/‘LèÓ’~kR®܇%s¥É.ù#&áìZNú" Q{e4r=(ø^]£IpFÖAM0›Žf3ŽÒ½s7E“Ô mƒÀµÐ]NÑHÁɬ´îÔV@è?òxºéYWÕ…:§¸9½Ô‹K¼¢¤0“NÙéùlÐølxé/¤X×›¡?_NÞ–=ØZñ¤F–'ìsä#Ëy;À$ ‘5]ª~™t%ìVô-;]·õ“mí8ýç ÝàìÏ«Aèa¢ÀZµSš·ê%DÊhØ… Û2Ûß0ŽàHTÖ’FP¹½Ò4x`­™QÖó¿h:%]T%§–ÏEÉEQsõd{ÎÝpK˜ÕP7¥kÂ\œö”¾Ã½¾sÒ÷kŒAZ½]X±Q¢A»Ê MX_é9þÀÀa{¤tÓÓ”î‡(r™» Õ1;|QvXÙAÇ” Ê~ ž8?g~)‹iR†Á"p¾¡‰tÍ"˜RWd™2ÐøåÍ;2÷ņ>ªÏëʵE_”Ï–Xþøé|ý%#öõvÔ]þG½WÒ˜)šÝݱbHà×@´­WéñËèpEÙö’ x'P1½·&nbtšZF…eéysÆéðÀÀk@ÚÐ+’ƒýjØq’¿ýà[^ z²cƒÚD·Îº—íô,q&–ʦÄg&ÚVûÞáØNX¸œÂÈèBí¦Þ‰Ý>°HµUÌiçHŽú¡.ù\@ÐZj7E«Šgni¶úʬ¾F߇—Ûùë ¨}|_èî§ÛÞ±‚A/yÄd ®ÄùT‹aK³¶YúgšL?¤Vµ`ýn4z5œ´­k}C3++÷iû¸~ÖOÝ­·…¿&»§7Oäþ‡~¶¬ß(»Öíy×°‚û‚ú–~ýcâÖ|[±ñÇïø½8Üù¦½ºþ FtéíiIf#ïï'#3‹Ñ€’C_ðK|_ÚÒ”mßžÙ§ßWà|- §ŒÂÿªý]• endstream endobj 948 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./diagonal.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 949 0 R /BBox [0 0 100.5 100.5] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 950 0 R >>>> /Length 64 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌeªPÎe¨àÅe¨Åe àÎe¤gªÂ¹\† ”Êá æ ä!B endstream endobj 954 0 obj << /Length 1693 /Filter /FlateDecode >> stream xÚ­XmoÛ6þž_áo£XÑ«-µ†li»Ö-F¿dCÀH´ÍE5‰Š›¿;%+®äxÃ|;ïõ¹c¼™ Þ,qg« p’0ž¥Å…kvëíŒ&¿¸ð,ÝÊï×Wï£hæ¹Nâ&Þl½™EÞ҉¨ç·Îfw,™ÿ¹þéâݺgùþ™7"åWWÆþÌ[9¾…x%µŒCÇ Bº-˜/¢¥ÏÖó$`­Vµä9Þ,)¨âGNäGôÕõ|„ KU™ÊFÀ"r™,ç~Ìt­æ ³6ÕR•D§•å¹ò¼3g×ÍsQi¥ÅصwĹ!6[ù„Wˆ’.܉Z8óE˜øìý<˜ª‰ŒÓP¨ÚJ¦wªVívGû£r^"eÀaÄ@u½Àñ"ÔÕ;äL|IEžƒþŠé €ì5€DwÆ6«}-µ6z!{@ùžéà‡¯sÑÐÁ­æ\Ï=K½9Ï Áïálé'Nø¯„JG½S„¾Ð瘩1ÇNëªysuÅ;5Fµu*6ªÞ GªÃÁ}§¦Se›‰¸ò"gÙÇU©ÀÖõ¸eCwõše‘ä`Y\aìàÈѨOó(b\æü!v»?6Ã^>J…Ð_ÂTï,‹‚o…¥«E™AØe´êáJKô“ûýÞáµV›ªV`›¢Qù“,·NªŠ+´ÉÕwZê\|Û ÿ‡¹ŸE ¦¾ÿPój'Óæþg^n[°œyäĞР¥ôöðWN¼ìÈñ‚nj><°{¹Ó¬"LT3>pâÉŽ–$.¬21O‰ãùK×€>^± øCÚîi… ÇÌøÊÌ6µ*è(%dPu&K®í1êë^ºF5C¥LR{@?üCÊõXZ‹ž‚[.â‹î>ñÂ\L` œkÑhkJëAˆ,ˆã²DcްìÒnI€iö(ò@ÉÅâHü½=#…×;Â1K‘¶çáB!¤ ^fgH…ÊBI‹Øâ3h‚SØï®s-jð…­ù3Áå¸eý8d¿ÜÞüz;Ž'þÊgm#jÈ~œ¦¼˜è¸£mi†êØ-UMܧ§ø"tỗƒ`ê]ƒÄ§MÀ¾iˆ»ì8Q˜n¾/¬E¯ÄªS"…"Œ”O(Y9õÈýï/ÚÐöHÜ—ycÊŠî=³|¥è£õÃhÐdÚ;ƒÏ(0ÿK«kËËFå¹êAÊÐáù>©Û»RŠïWé‚:Y¼SØÂ¿h™À4ôÞ ÷,¸Ùî›W*õCc¥ðÚhbcgDíO­BbK~óÂΰ/¦¶ž~¬ã7hë©þ&éóÖ´N `…éŽîÛË<§Ùƒ‘QЂg™È¬DŠÄ°m2\'›*çd}òÇ×…‘Œ­Õ¶Å"6é%H±æD°“‹ ’sÁ›Z´ý³ÌË3^:²„VêÐÞ¼í ö?õ,‰ endstream endobj 957 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./diagonal.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 958 0 R /BBox [0 0 100.5 100.5] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 959 0 R >>>> /Length 64 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌeªPÎe¨àÅe¨Åe àÎe¤gªÂ¹\† ”Êá æ ä!B endstream endobj 961 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./bigdiagonal.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 962 0 R /BBox [0 0 200.5 100.5] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 963 0 R >>>> /Length 118 /Filter /FlateDecode >> stream xœ­ŒA B1C÷9EN0¦ÖÎ wúðÁ/Ò.Ä…×—¢÷Â#äA£N}¹ ,—÷' _0ž`¼Cy„E.â‰Q›D5$)œîX¡Ü‘Tg´,RÏŒV%²³ÃÂ]ÜE%Úl~77\ÿô³âŒ73[+ endstream endobj 964 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./square.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 965 0 R /BBox [0 0 85.04 85.04] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 966 0 R >>>> /Length 76 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌeªPÎe¨àÅe¨Åe àÎe¤gªÂ¹\&æz–^œ£sÀ*Qy•\Á\\8iº endstream endobj 969 0 obj << /Length 1591 /Filter /FlateDecode >> stream xÚ•WKsÛ6¾ûWhz‚f$† HQL&‡ô‘6½ô¥KÇÍ"a ‘P0²ò뻋…hÙ!ìv<2Åb±ØÇ· >KáϪtV ‘TùzV·7©§ö» þüù†¾%0.¯8¿ßܼz_3ž&UZñÙæîZÔ¦™Ý²öòèT?_ !˜x=_æyÁ6óuÎgz-óeVUÅŠñtþqóëÍO›ñ´"Ëþ£ZÈù²^«užp‘“^΀JEÎÔ½ª§h"˜;úº}X©çKÎLÛÊ®±bºy¶fNêN5DÒÝ“]ÿ¤,€aèd‹‚¶z7ÐùÀrBŠéûæ|Å ˜¡?ië5B×qÁöÚ9ÝíH )…çí¤7 •°ûÑt@G“Nè|ô2Öê-„Õ2Ëט@Ù]+oPä=zkèQÀ2Æm–WÌ¢’©ZctÖDDc#ëT|x†‹sÈäH‘}РQ¶îõÖ¯c&9þ;f?î  k·¦Ž"ˆ‡ B£Ü)ñrPد³Ï‘¯2 {-x"‰‰˜/‹UÆÞƒßP[1bõW5•1¨U•ð,Àh5™tEµbïì¹=:ãT4mWphm¼!Bt'!Ñç~ïA³nJz ˜Q¤)˜y‘ˆO'7JÆUD! ïßuA,z~;›>q‹òvÄ2"Ä­´HDŽßï 5mÇl]²í1¾õíܳðWe€‰Pï§oáýâyГ^”R¤4êNGTº@>éÆí‰¨müÌ4)"z3„ˆ¬b¿¬A ”ëSxƒÈ›)žæ¿æÎ©‡œyô¥ªèmOb:­Èİ‚_’é?ѬѽªB­—É4\» ˆI7 OM01æ\±¬B-ÀõNÝm<2ßËöš¦êÞ±3Ô˜¯"ƒªÕ(ªWXˆdw°$e¡Âf—„«3…§âW¶b[´Ì™V,ˆ£Êp½Û»zºØÃªG‚…åÒî‚Ç1 6ó°“çnÊÁrîô‡ìvESê~Šo‘æ;6ˆ4äXž Þ8Ø+½ÛStDd2ógeâíC—…Vv½Œ‹Œ§©W×f [’wgzŒ'\üòmB¼Ž¡[™”«]Xy.'ÅÂÿÇ­o&±éå Yc÷a»üy샳¢HÊb¾IøÚ7¯>´bö£¹ùcª%æi s>"K +§£ó`#BŸ—‰ šbkˆ4¶˜HÂwgZ àB¬®~W,­‘+–θï9@~aë[Ò9ÉʘŒìL^D6`’6V£[ÚèX΢½=ÞÕT6Žãœ³ 5¡dñÎt_ †Ó’“k¯ƒŠ|“§Ø§ï†V]J¦'¡Ù1ìý2}¬&D ñÔ^*aH…Šïz];šùpx¼ BüR›h°ŒåiJ6]`e∟Võ_'òzi©ð+< =ôï¬Rˆ”}¸#ZŠáÕÒpÌî"%|éCÚzÂÕ%¼WX7¤|kãzª}"8<À‘:œÔÊ&ÈÒaÅíeÐu¼ô›øÁÿ1)Tgz˜b‚u&áõ€XI‰I“.}ž¥Ηº#ò+éô>Àá¨M1èXoÑ0O›ðœ =‹|ùcäKc¨Ç_€½Œ`oñ˜§ø¥ü¸ÉzÅøå/‚ç)°ñ]º(¼ï; /4;¶I¥wD0Ó¾Ó©Òiê^I¬'ƒ¸s}ÀxÁå£tû`NzD.a(6«H ƒ½á•{y‘Nºä&J’¨Ûÿï>Q˜h’^&^ïGþú¨: » endstream endobj 973 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./labelsquare.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 974 0 R /BBox [0 0 85.04 81.84] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 975 0 R >>/Font << /R9 978 0 R >> >> /Length 186 /Filter /FlateDecode >> stream xœeŽ1kQ„ûùSÞYw÷Þ{ë+c”€æu’J‰!x…¤Èß§r)Â|ÌÀ\©bÔ)G,öÁó7’ÔeÉ·0~Aù K*Í]t0ŽK³¹Ì¦Ô,µd^æÕó·úÄ”g\a·C|à8rÕ°ØWšIÍÙÙ>p?kt‰¢Vh’’úÀ6âÐ=÷OÙ})ž»U¯âž-å÷¶E˜xÔ`¨”‰í„C÷Ò——R»u?•6 ;ìð åh8U endstream endobj 979 0 obj << /Filter /FlateDecode /Length 181 >> stream xœ]O1à Üy?ˆI=F,é’¡UÕöLÄ‚úû 'éÐá,í;Ÿ›~¸1Ù<òb_T¤ÑeZ—-[’#M! ÕJl9W;›$šþfÒû“H¶Ò‘ßùÝÌÔ<rGí»8Z“±”MœHtºó^ Šîo„»`ôÇ&*Í@¥E‡­f`[éE3ðR)j"›Ÿ6õN |æ“vË™bá¯8uM"ýOKª*Iщ/Uñ\ endstream endobj 981 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./quartercircle.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 982 0 R /BBox [0 0 100 101.71] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 983 0 R >>>> /Length 165 /Filter /FlateDecode >> stream xœÅ1NAó~…_`¦gº§Ç/@º ö +q±"àûhµ÷‡“»œÔíÌ£÷Ã^Þ ÷_Kü™ãfŽ/kxµ*FWA V8,åT('ÃR1‘}rù|Pgb·Íîvîë=¬c®©qU"š± 582QIÍ&¨‚Z »Õ¢<Þ<8ß–ƒqz½5Q½¨¬ƒýR_ºÝ>ž)ÿ´ÍÞì¹ñFÛ endstream endobj 986 0 obj << /Length 1211 /Filter /FlateDecode >> stream xÚWYOÜH~çWŒ¢<´•±q»}ñ@’aµ«m²#íJd»Á­õ…Ø(ÿ}»ºzf ØDÜG_UWt᪺HÜEĘ“øñ"-\}ÚÞ,pñõ—#jèlEh(?¬ŽÏƒ`A]'qºX_E­³Å%ù˜ó¦­e3Æ;±lßÈÚŠ}2ôu+yaÙ^’!¡Ôú{ýÛÑj½ÓxÞa³n÷†yAìÞ¦`ŠÏ€þø×2X|ª¾ì©@âóöIàÄöŸ[1#u‹v§uey1ùþˆJŠ*Ku1ÒçIÞçàˆ’Žå^êÛonàºKW}¨mÆ>ÜÐýÆÝnÒû´FdðTdiÙ”p°è-¸Rˆ*ópÓŠ¦à©Èp·‘hœBæ̡E'µõ ¦™øæR¿Æ|嫊 WºÚñÈ/à*Ùw·o§ %K_·(TÜB#Ú÷€ór^ÃU}¨Œ\Ž ƒßiÍŽö—ú*ä¾JêЈ¡ÓkY4¬äÿX˜·ƒcè¶™›ÖÕºÍdÅ{Ñá©B·¸‘ÞH9CÑ˦ØRÕׯë;ž‚£³>Ò´œvâdŠÇžrJBþ'46i ¸¼ŸŠxÖò Ðì·#=>=Œù¡z' ß÷“9¾e¡G>câQH8æQtSƃÞÄ¡ž)g™ð°ŒHÁMª*Nõ‰ìðBhÉÝ=îd5pœu÷eÓ×ýLÚ½W–¹©+ º¦r\µ:Ü  nìá¸ÍêA=ûvPú²9›"ò™¯Å_ÓïUÛз åTPød®™·Ã+ó"yeÒªée]AÕ×…¼©Jóš0“­ŠŽ3ÒÉ,ræÏ6wØÏåÎcR…¨(€öÍÛ³·o–ã×ûÇŸO¹ž0}0LtË´z‰ª;.]–/âú´3Ðpí „®´o6^¨Þ@¬>žãºži5!¶ì(¦.¾Sùª­½‡×ö¢Šä_”˜ wTð6Ãã´.Þux¥‚-t”»™ÌT4«Ó–s…zš;qÉÅé×qÇ ¹XB¾€ˆ‹w«C"49dû¡š7Žáj${õîâ°ð@•jѧð(³Ýä2…g“«& ª‹*,u¿T+S#àè9œxh^OàAmÙT¯dŠH+oòþ€§ñŒ—Ú•B\÷3s?ìåOÿ~<ðC_—Hø6\¶z@½ÖGÙ´nuùLþÉïJ,¡ F$ŠY‰jð*¸¬æ¥Arp4 »:¬6yò­†¤ÀœBu…½V‚ñô¨bU¼œë,¤d5m\•ÛÉ 6†Õ™v ‚JÍ,Î,¿[LÁÜç/UÖ¹¶Óap+Õ8›ºÀ¸1wOõدúœ÷æªiÚhïdifF?B†@ßÄÿ‹Ô&•­šñ¡Ñ*ò¢-uãÏðÒVFD‹r7öà¹àÙkZ=ݶäƒÍ~Ô9¾ÍÇùåãǸaž)³6zæÿ…Ÿ—Õ endstream endobj 989 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./superpath.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 990 0 R /BBox [0 0 100 100] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 991 0 R >>>> /Length 175 /Filter /FlateDecode >> stream xœÕPA! ¼÷={¨PʾÀÄ›úטìA=ø}ÃRXÜh8Ì Ì MhÈ¢ÉG1Í`1Óç2DÞœ«NÈE×°ó(MàS`[/Ø[â5©2'¨¨‰ŠGi‚M^Ë7•ÖŒ£P¼p‘$pÃÕQXfOì¢jî2LmÞü¢¾†úÊKKŸÑ¦¯ÞÒsÝÁþ,8½Àã,Áâ þyé—Ÿ_{žñwï endstream endobj 996 0 obj << /Length 1656 /Filter /FlateDecode >> stream xÚËnÜ6ðî¯ØKn»«ˆ¢ž rHÚ´ME[èÁ±®ÄÕÑJJŠã|}g8”´v%ÛÐAäp8ïùʇ¯2•áeaºÊ¾…šrE‹~»ào ˆÛ3Ì÷W¯~¢÷½ÌÏøêjNêªX]³ŸòÔ)³Þ !˜x½Þ†aÄ®ÖiÈú®1ZVëmeQÌx°¾¹úãâÃÕÈ- ‚§Åú2 Äñj˃ċ¹@äWÉê—æâï É=/|” / ÿ»2 $ëv²B¯9C(gy§›v- ¤âsR×»?¹³èñ™`².–. V©}·|U×$ÌÎÈ\µ$a{K¦Låzÿ@fÁš¾+]—둯½šÔysD]4*R*eus”¥•Œ¸åÂã'Ûup*ñúkøuKÆ!ûäG>ßøðã ª‰§¬‡HÁßðE lC"5Z£Ó_Q.ë°êãγÚðâ •b/ã.V?¢Y}ÁJU+#+$ægLâ/d'ÙèX·ôŸ,þÉç¡**Ý©»Vé¶#@³§ÿc{Y jÖ‡¦5ÓÖªKœéŽ2yS× ÛÀóNƒlóVƒÓívÉXhˆíh t.âî sä„ Ç1+TÝt6Î`ƒzÅ k;#uy°òÐA¥kE«V•GE¢¢ “ˆjóâ¶ç-û2 _"KÞï‡XŸ&1Ц­r›©Á&š èë÷ê»FŒ@ÒPÜ´7 G(8¸¢TxÆY Ð#Þz'»¯Ô|6X1Œ’VÛ3ªxÕE%BáÏ1S …£S³=6€Ý¡ÂBè;i-üwP6‚R‚ÃB׺³…75Ý.º‡'îi¸¥DžN¦Y û¦Ò–J F¯Èì Š¹+Ž!F1‘Ì÷üøøpdsi>ЈêA”G³`KPªX¸jjj¶C6èÒ5Å!š¾.TqQ­O6eTMLm§W³#ùˆ ò‡w­Wä‹–6Úþi>ZU…LñÀNL8)ãÔ„€kRÝ)mG¡P £œ‡Ã(”ø©ŸH#®Ô7yžÓQ ²´Ç6ñQ!Ò endstream endobj 1002 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cube.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1003 0 R /BBox [0 0 133.81 101.82] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1004 0 R >>>> /Length 4628 /Filter /FlateDecode >> stream xœ[KŽl¹nœç*´Z$õ]Ïüî° £j`xàíÁt²êÂ0zÐ,å‘HŠ!’RÿW©Ä¥âŸø÷ûûõOÿ˜åßÿûÕËÿ¼¸üˋ˾jùçW—I2F‘ݨ+—ï#Y£‘¬^¾^{+éÐ2»³>$¼”´ïòõë;_/îtͽSã!™ÒI¥|½†Tj«•Á¸­‡¤5Ò½Ú_?óçרï¿,èϯeÿe¾??õ7ýÿ¼´šÙ`Êü_6»Úÿùõ¿ùçÂÿ¿ªüöÉŸ_¦úþ«ñ~)üË-3ðoÇüùeο¸–õÊ´d–­ÿHÂbm-Ú"¥ÕA}·Ò¦¯uðûÕÚ !ýŽjßÒ¹‰!OÜ™:ü"%*4Ç(M•D[QÞ´Ç.­WêC~¿Úì4ú8’³Ê6ˆ—Ÿz¼_ÿñjI¡Éð`klVHIS¦º7­Í·eº¿_GÒ7µŠ•vªÊEç$©ZZk>ïÚÄÝtëJ½Í¢{Ó˜RÚP·JU×mò~¿Úâºïˆ-¶uRY‡=߯#Ë}¿¦é ¯ÙK›Ûq«©Ç„ik¥jß9Vøa§÷ëß^2mH¥Ýÿñ&Ãõ6Ö*Ò©n]E©O7?+ì¡…; nPëj›±Óî›&õ~¥d má]X¨ÎÅ…«˜RÒiëì…y„ár¼¨¶Yê<àhü¾-|eÍŒÉ ÚÆ>øý’Fý@n4áyf.‹VÃRöÆLPWhö²& B£–ÙÈÔ‡~µ´ ?·Â4&Æi£µë(Óþ¥EÄ­ø~qs]'Í+Jó¯Ô³ÊŠICƒZŽ»DmÞŸîC8ŒEZë*Œ0F G²m£=qÓUF§ÍU~¿†Ríñ ø¨Oª ˜æžà 9v?Üà’½0ø·Mêüt¥¶–<*Õ1š}#& ‰nbl„¯+ ÂÈuUÛBfçÍí`¥O’’¯#‘M{5Ðf[þ‘êNÕqp#Q|"ðæóiB27Qåà…}»ö™âýJÉ]BzöõŒ_ I:%u=8¬ñþ娝×¼˜;mæ&oB[lV/-` ×E‹ÇÁï×nÇØ¡æj]¶§.îˆÛ³)¶Ëã ©>æØæ`®4uÝùÎ0àÂVž³(Sã%,›eCb4, V;7(iˆÁ¾Ÿ# ×ÅÀf§;\˜–=W³706t„Çö\ÍÞÀÆÀ£õ²¨;Yìa˜A`ô4¿`¢Úi©Œ_ Ú|„'¹5”G#Ìy.bûÆ~ð}$sƒŠ«LÐÕ2BœJ“{ÙÃwØûÅú4ÛQ¦ÕÀ–î‡,1™ü n“š¶;û¤mÓdÍÚ¨ËÄu¸%”‰W+k cìQ;KL5Þ¯”tÏ6Øv ò2òdíĈ‹Ü-ºin‹Xµ55×[&Ù¡-¤ƒ¡w£¡³Ò¨±èîŸêÄÙM¡Ä\–¡µQ’Æg?~:ÔÓnßcÈó*5^GÂMht‹¤Š¤‚[õYºs¿«†…tAÂ%ñ™7ñ&;?î/ævZI¼‰9¨UÚ«ìî¶‚G•*‹:Ž¶Ó {`Úi›j$~¿¸/šsޣ۾ž— ËaMh&ófÀ3kÀC6!HÆ ˜„) ”9Œ)ÚHê<Œ) íʇS…˘Ò6í©wD·³> Súö)cb{!cJÆLœŒ™ø¡DJ‚1'cbŽ&ãA™Ò§mÁ¤L,òÃÎ?<ïhõŸbç;È#¬Ô¬Ó|±Ô¶€ÖJ 5ÀtâØî9f/âe5ËOe¶Ä‚àQ™-!éí1‚ q•¥]ÂSú]‘ã…fv, vçAÕ²{„¥’ÕµUHUÊBÐÚÁýØ %:Pܹ‡•<Èj=¬:JÆ@,! è„^];z”oG’^ ãXA¸¼U­ß…d<¹Tööä»R|Që ªæf8ÄÜÕ:)xì‡;ÑàÚá¸GQÌÖÂzH"7Ü­Áµã€)Œb´yMÑ0RôN¸j§¹íLF‡éॶý­¤0‰Ôa}®hàˆ‘–etµcÛZ¤y¡—‹0rðEìEHb#_H¬l†hµ†cÝÛ/°_#Z£ jä9½.BŽ!BQèTÒ.‚‚Ç[›-ïuÿû¡uH¦X‰+šPì¹K·ïOd9ܼ'f†…ã rjòfzl>ÑX‘ëØt0-#Âyj•ûOw[âŠø@~·-°²Ò%8é'< ̳3y«=Š ûؽC93L½>BݲƶPûo¬puê+þ2§ÙGµŸfš"¼3¯c“"÷òâÕy‹dmœk·_¸dUâÍ'“µêTð=A†e¿˜“,gTœ(hM[îl=A[?¬Ø´šëŽ@ ­û$ëD±¶Üh) Oµ˜9&_Í·ï˜[δJM¬o\‘Œ#áº*-ï5c5u.›­†ºS3 œÝú±ç´‰·RÔV!Aš Ê<˜-ùÞ„CƒEMY‘¡ ‹Ý°ž;Á#ÕÕHŒ_l¤nwØØvÓô9°—lŽÇã 8K\Ùk˜À=R²ºsRâ9¢YXip’eÓ¢a/š¶ç±ÊcºÃ#̪&CÒõ}%ÃûòŒšo©ÕLîxpÈ8ØZæs€€ ±= G£Ú~ìR)ùèOÛ àŠÀøA«T×cDc×W ìkd6Ió[ ·/~}âûçø…Ðc@„”QÝW'ª” ëÓb›¡°úîJaFµl˜ îQ‰E«¢ê6²>˜)Šþ‡¤"<Î'Ó5è,̃탢Îsgª÷QºÛ·ÀZvhX‚ï䙱ˇ‹± ÚáI…8ºÓŸoë9iˆj0:éøAؾüÁ¢Ú„­“!¼*!²Ü„°³¬Ûš8@4‡Ðüµ7'lÓ«‚BòõøÖ2Éö¯hèŽÒ'nÆtßn¯ù¢XžP­ÖºûùHî26.F>$¸¸ÙeÜ e³¿>ýhÍVуëÞ)ÉðFný3záJíÏð†÷Ö~ŽP|ã;ñï#‰øÎ/døbŽöà(‰äAØz}ÝG ¥Ïø†çA†+ðœŸx?ãz¢’¿G|?pÄwJ2¾±FX*âÛ àùˆoäßÀüˆïƒO|?$ßç“é”Àñ«?#›ß?ümñ ~ºÉQHNr$ÛNå“!G·‚ü$G²¶'C‘ɪÐÚA¦µ‚½´éæç“¡GÝv“#´!¦ÜäHp¿ª79 üHŽR’ɾ ã&G˜cŒgr„Â28ÏŽw‘ƒDêƒõ?R!Ó¶¤O²Ù²HŽ` €“Á€[nr”&Ï,å‡ Ü-9íIŽd¢®ºçµ uˆìŠ`–›ÁÀXIfG‰Ï¼oV’“%Îì’ÎÏì«èýfGèŒvsŸÐã‘ÉÜm ±†o§ÈŽI ?³#Ùv¾Ÿì(qfGŸz„$³£Ä™a„ÒÍŽ°Š¶nv$s}ZûÓæ#E®Ã§ú¾¤RUÏ­c‡PF/Ƹ ó¢à~´ ¸ ºU+öþxVqÊl‡êÁ·L5¢Ã(!˜Õ1OUk’a÷ØJš…¦L«uÁCÓVnuU`èêúɰâD†+^kÈÛ%Vn×á#ã 8U¶ƒ(ÁxÉ0*ºÐ÷T|a‘GM]ð—3BÔȤV<“ý5¥hà*̽ìò;˜ðÛ°NwùéY4Ú嵕µa1ôŠž´´o4½n:§uÉv…!°/uyïbs#b/#Ð|ÙžÉØi·fGJÛ}®F»£Ì­ŒöÇöëO®ÜÉ2¨\WFC§|àý„x9ôù»åÀóëõ¡åÄ6Öqðû­ÐÇ=#–·È¸VðvÑÅÞù…öUL oJíep¸MÞeO\Êï‹Z‡¤M$NxÓ;›•:c†ŠàÝRíšff†m5Ï4ãó·¶ßb¥‰¡„i™‚ëÉE«÷òÓ×ö*Ç.ÖqÛ8È0Á4úµÈѸìå þf½‹Uöî¶lÜæWòWµ£Ã„g=ËZ)u‘=ÒT{?Ž61Ï;B* k,àÒ75xÏÀeo¿Ûy¿ ­1Ë^“¸ãvùDÙxYÓÆ®†;F?Êþ,¶Â݆]{âû :*:Žj+bjfýe÷4X¡ièßöÎhk"c…ýE {í²‘î„Wµf ãb–Ý–…̱qß¶™~8Áü’3âIÜ‚¨¯’‚&TGÙ8nt–†kL€qÅ›.[C{ÙƒcÊÄèêÏùüî£çã ]ðeSà•^ÔÁDøE#_‚Û/8'Ùö€(uÂl•ŽæЦí%®D_zÛ6…߸¾ýÑ.ª=Èœƒ´H|µ8’j\tp÷ûmLW"°”Ç1ÍSÚ†oõÃÒŽ0× ä¾WpÅý}%ÚÏÚ¤Àøüv1ìñl‘4¹#&.˜@ÓBóâFÍ}$lwªùYv'Ž)Ö…xƆrd>4×cSkX^‚-Ó:B,^]b¶E; x`›1°ÿ‚æ1"ƒhêdã§+©fZ¼Ü„™ np¯‡ë¤åq6Ã7uúªç¤.Žñââa<à¿H ®hï7Ã5sy`Æ/¶íÚ3"ÉþÜó§»±:ÞN^Î ŒÙ{µ¤1³7ˆy³·¨A‚1»j´Iíì“0»]èW3I˜öÁ”‡0;ÚbCaöx¶—ŒypRÎgöª¶ÆäLãÏ×½ž|‰šÎΈ=^¼ÂìØ×|ÿÞÔJ¹dL˜ÊeL˜o*“2ÃÄÁ^ö7‡œ ƒ/»xŽ‚ŽLBùðeÇS%û|&LjK¼8¦L|¨æH‚0ÂÄHý/abÖß ÂìÂV¯%¦—1;²Q»Ôˆºüùc0fo5æHÆìèŠ$cŒyðUãHœ1ÆÄfEj{‹ÀîKÆÄ"Ÿ¶þô…¹gU߇2$(³#nƒûô6Ü¥Ì>üNþŒÓòà¤Ì‹“2¯Ä(ó| ±O//göx®|GŒÐÄI5Ç%Í“¨OlsÒ„Ä"ç1"#iêt¶¹#M¬Ñ ¤ ­lÆCš}„{‚4qš¤yq’æSÒ¼ß çŒíÑ}H³£jGçˆtgæO‡Û‹W2Ó·²Ø#øÄ5é…Fqï$ÖƒãIªSž=Òn¸¢,HnuŒ‡ª.Ù¸·hÛªŠS}H†Ýÿ¬‹¹[Ve߈I{äYnݯ‡ÄÓv<áßvŠ¿ñÂ;;§û:<tÉוÄ>ƒDý+²\9t?.Úž¾:|›ålŽø»¶LQ -û î¶>’»ÄHëO‰¨}#µpg%æûôå—½gfO(¢Þù¾’áÇòìoã²¼2ðÐ…ä±GÆ4Ñ­xèÙËÀ =5Ù@—ËžódÕ ësþ/‰}ʾl…áC‚ÊñŽi3š^x%e¦F߬FŠÚ±èî¥ ô~q²;EcT˰×5£lì›f:@Å]9Nº\BÖ׉³þ~b¯Ú®Ä뺴BÖ}i§[<"íŽÓɠ„¶•²ÑS›}"¤Éxj/&׸[džøám´þõõ¿|v?e endstream endobj 1011 0 obj << /Length 750 /Filter /FlateDecode >> stream xÚTÉnÛ0½û+„  hR¤¶9¤mZ¤‡n1P N²DÛleQ¥è,ýú’¢d+²Ó„™á›áãÌ#±ƒô‡91!0¥‰“o&¨Ê•cï'¸Ãùèog“é‡0t0‚)J±3[KÍ gÞ­³Z1éú„@Î\ŸÒÌÜ„‚­’g¥ëiF÷vöir9ÛíÁ+iä!¯hÄ+е›PË+ßJÉ*UKñ‹åŠ‹ê\Hµ+™Õkžß …õ/× &Ï•Ü2Äo I½©D ÀÖjø_Öfä›'L ÷b0$ßxç%#ì°^!³{ƒÝV\-ÄÃ!w8¡0O²âYh™-XiÀ'§_NOÅVعÞõ+  ì\ïò¹ÆóuÊ0¿s½Ÿ»|£ ?;i$…( ’‘ÔˆczµI÷bòí˜|1¢ZDÔ!†FU-‡kÆ´~Ã4V*Ö¹Þ; H`Ûð¼•Э§½ˆ€:[u¹ºr3Ì…´Qµî–EUòŠ™Œ•;o×/šÇM­„bã[BI qïÿÿ¦ôh?Ò†qѶ «¬,™|´|³ª°{Ð÷Ão'çÚU* 2wœ„èþn¬Yë[¯ÏÜ(VØ@¦ÆçÂIÓˆ8„&Äø…sõh?ò Œ‹¶×JÕÍÙtšõ-†ØÊœ-…\1ÈE7”' š›)bË}i‡© ƒ­~EX糇lS—¬1s)àU^n ^­l³ÒŽñ°WÊ po~Â/ø†UV˜éEĶœ¢@2ÝöL+ðÎØÌ.¨µdlœ€&çL§hµñ„in£­NèúQˆÁEQhò\ ¶ëÙ¹”ëÌlÚïL‹v ÚÁ€Uö±73Nv3Ö…Á?Zûëš—¼¶fCWwn‚¬,¸õ%Ä 4ý'AQü‚"z°¿GĨä=,J±‚5¯¥î'\ʽ>¦Ç{¾ÿ;ÆÑ\ endstream endobj 1017 0 obj << /Length 2578 /Filter /FlateDecode >> stream xÚ­ZÝoã6ß¿"èËÉ@ìZßR‹}HÐíáioq ÐÒ>02cóV–\JÞ$÷×ß|Q’]Ñ›=öÁÔpH‡3¿ùȆWkø^•ë«<ŽWeR\Uûwk¢Úíþù×w¡ð-q9á¼½÷íiz®Wåº ¯îŸ®Ò0\áÐqÝo®‚0Yü~ÿ÷wî‡Ò(zã‘Èù§3‹è*ÌWQ˜&x&H•É*Œ>.Y,Ó, ~°j‡Á³i¶‹eœ§AÕî÷ªÙt(̹Üp±x½ÊRÞ᦮aÉ:Ú'aΦÌ4wÓ½î}Ûë¹ý‚¿t¸El­:ìL¥dÇJÔ£©MotÇe5U§7rnÿOíÑò6kö°èó"*áw÷Y-–Iœ÷;¡÷;«õœÜpÉ0^…iÈ·üØvý/•5‡~ö˨L‚ (1ÊE‰H8Sbv¾$Å%Ïó*¹ö)3 ž ¨Ü³ˆàLÿ‘Umþ;¨ÍfAlí#XFü[W}Ç”¾å[)þ<˜ª?âs Í4³Bk7Úâ1ƒ"YÈ— ¤Ý" L…úÚ!%Ã¥¯<Ç $ý¢«Å2 ŽÀ ¦£ Œà’Iƒšûq%/ÜÃ#ñÈêJ7øü}ýÊLîqþ¤ëet=&¨Ã${Q–™Dؾ=€ÝdqBv3½”XG­yq-k×îí=¯X†¸FÏ?#MWªádçQQ*‚ŒfñQp‚Þú¥_¸D¨Ž§Pšm5ž^®Ê,Êøð–|€c>þâÎìÕVwøëžß±€wœÑ̳!xˆOŒ„”µ  ]€0a§=jƒÉ/9"mtb»Hùm®;ÓTÚ`dÂý6­Ý«šŒ¾žwªwBÊ’g´Å6ÕÁvá5ÓýܽÕV‘OEà~Ù7``u­ò@(ì-'Ü£VÝâW™ uVV¢‹{½A\‹Êàæ©çJr•@ÂsN¸Z9Nñ8õõŒç²—Åñèø18›)PG3…öØŽ=ÅO·‰üO›ÝÎÚ£÷]ãàéØT½iåDzS-r<àb!dz¿f⬔yÓŸlE× ˆ Ü-[•eÄ—ûš^ž¯¨òöÈϦÛñˆ¼,Á'˜¿CþóÌGìu¨±•æ‚7¹óˆÂ­ˆuêÊ9ÛskyÌaÎ>‚Míý‚.ø%rê{RÐrÐÐøú¤è$EÃF¨ßdÐ/RÓL\"e{ý9kõÊáÏ’à´ƒMúØ“¶_ùc00ÿc'ှðy¥ë•íy¨ø§ÑÏ~Q> Ïõíº×ÿò¤;§XÏB‘Ò¿ó¥ÛúÜ3R¾;>ÝàBH…÷ÕÑZÝôBG]~?'ʉéŠ<÷^mƒ„—´ Ó£Cá×V2¦Ž±„ ¹ÃqTµ €¶B‹ŸŒd–)4؆C#L08ÆÜ1…"?œ£5«‹”‹ßM‚ü¢”ÔÃüÙé?Ž’‚ù"¡d ¢â3’Á cǼ t0tFc:Áß'6 '~†ü!/ÅŸKÉÒbü `h„ªÕLØœ±±k†° %£0Nspêà}Ô °Å·Ò먟qo–­cÚTÏÈËñ‡Nؾy%¸Œ”gN7™°‹iÜiªwzBsÝÍ ¾ìx#ÁLBà‹ÕêçƒÚV7Úªž2/àwq-#ã…œo9uFdœBIþߨðëÎÔ˜(¤yе{Tbw2yZ¹¤ùĈ#É |í9 zå¯ö€‚Vå±KS€®3ð84ÚÝ•c$n:óX‹Dý¤ŽuïwõÏ x|U© Ý£žžZ14ý¢ö‡Z_Ÿ?b&O[álÕ8 O§a0ÜÃc˜f:†ÙŸhp=—JO®[kpÂÍxgXþIÛéø}ÓòÀë'_V1<Á‰'þà;H`r‰aÜ“Nçƒ+Ìn=5æžD"¥ ï$/ëÙ,Gßv¤;ä™ÄÇQ¦¹°“òŒ޹ż-s™:N³Scf`.|ù¡ê{k Òœœß ËÓ¾;o##Ê D¾jS™ž÷# “^í=‚mÞ{L…±ÅZ©%ˆüNqÆÛ]Ø ÝÓM‘]¼kÑ?.]ž}£{CsJ<Ê·Y‚ y}|¹$]“ϸüiÞž„É“DŒŽË¼Œƒ4X=ãNapPVíuO) žËÞ@ýNÃa™gylš©Ë|³ÇLîš.œ53üNm'i ’ I]‚ß¾†÷›Äô®ÄHù-á90¾Õ·~xñääEð¡ÙÜzíBËÐv€1ú«äec«Õ³sx¥ZiÅ㠺˂µ”ã|\*þyTr®2qж—UZ*Ÿ\’¹khœ¢˜`’dÁ5žÈÚÄeÙTaðÁ ƒT¹Ò“°€jXpv¼‹~©ô¡gî§Öú{f~kAÉ\¥R‹7ªjÜöÔe¿Bäxj@´=u›GÄ9W‚^%h[7-Åj™»ž<Ç–õ¢Ïé$k¤$ô4Êó/·ÔJ¬Wø íÆ4P¢uÔ®w¸YÔ ¥ÂÁ€jÓó§RšîËÈŠYù×kº!UÏ>‚åH´´\KB7 ’¦å~û€&-ÊK1 —z¡×~%Ô<,³4 nkÕ|ò{²'}”aâ†ÈÑ´ ͶoiyÞ¹Õà.œàÝW¾Û`Úñ“Ùü !…ù€QîÂZ(3F¼L¢ì+ð¹/å:­éÚ˜ÃO¸ìü¥4y)üT§ô“Z‰`¢Ÿ¶JZ×q  N ó6/øî…DtÔôw¯Ö‘G! — Z äH)]wæ:Hÿw㟲g°ØŒ)X1ö d?Žô5:&{ÿÂÇxð©¸Úhr[Ï®mÄM¯)’˜ :@¹ÎmØ ÎõÝüÁE–8¿©¾ÞÒ2ÃdáâZ’ÃyŽÅÒ/{r_–Ë gá‰üûò‡ö©7ÈÂ` ü‰qÿÓÆWDÔ, endstream endobj 1026 0 obj << /Length 1710 /Filter /FlateDecode >> stream xÚ½XKÛ6¾ï¯ðQlU/Êr òlQ`ƒ ñ¡À&Z¢m&²¤ê±Îö×w†CÑÖ®èx 6æs8œù曡ü‰ÿüÉÒ›,ÂÐ]FÉ$=Üxj´ÞM¨ñço7¾^7‡…󳕯×7¿¼glâ{îÒ[ú“õö\Ô:›Ü9oö¼jE=‡aèD/§ó(bÎÛšOƒÄ9ÊbGiy8ð"k¦ó JXèølúeýÇÍ»µ9šÁ•:âÊ(é{ÌF“8‰\?ŒHÓ÷Ó$tJ­©øÎU.^¢°;>ß=÷i÷Ügn²ðiwVóãgyøçÍðǟϱãÏ|ìÌx]—ÇÕ+ü¿Á_µè¡bç’’ü*ÏA§ÀsÊ-üúK§Ý @‘ÊŽÔm*0ß©üìù‘¨ßSQµÔÞÂýFnt§ä~( 1¦ÔVdö­¯s^|³ï=(w?Ð2qÝe'ïqJúŠU+Ë‚ç4Éë]w€)¸TÛÌPü™íC×gd í5Nó†F}Ž»pX$nƃ³Õ²½àÙê÷²üö;4füG¬ÂÃaÆ‹].V7ÛÊ3TË·VUØÂ¾šýÝI}SýÄËì„j®ÃmìŽúܳÿÈ^~ t ~r7f޾–¥moÒŸb ìñ ÔwŒÑøE,»¶×铸D+ÑkG8:`6Õσ~[©ØÏl¯]Õè“Ê-¾Èc¿/Šý¾PÕËf*èËj8© ¯60‰Ì¯ … ÈBøtA]ã¥S÷ù<Ñâ›àï$Ro•8¡œ ¢8Å”¬tÅmFÚ?±iWȶ±çZR ÕšÁ@ìÔ¦ï @»9<ŠÍ·*HÌ÷JØ©àù(ÆâÇ„Ï`úÇ^|~]<àº(Òð4’š1*0³ÿ~£DÅ&ü˜ØŒ4œ¢…F‡RÈ_B4Lm­zðn×ãG™µ{Ô”þù7r<“¦eW 1´×K1’o*+2Œ•|N_EŸ” ‘ù>i*÷JŸ½-ÛçÀ ó;Kßljq/¹þ@’$öj—|?÷\ö"+Û-OÛ²ž zöâ ƒá)Q&dæ§ÓgZ´ÆÒÙÖå[½+`¨k:ÂXÒ×('ê {OAé×»¶|íš–f»ŠF¨(8“ª©¾+2Žþz Q⤥2.Ša®K#”ÂÇ` Xc¬ˆ$µøšÇ~5ÿ Æ endstream endobj 1037 0 obj << /Length 2188 /Filter /FlateDecode >> stream xÚÅÛŽë¶ñý|…¤€ ¬UÑ¢dé~hš¦¤mÐîÛæTU´óÅRfIˆtþéþïþ|ß,—ïä!o™L¯˜L3ŠX“ß詾­í?T<H-DŠ„º½7¯eNVaÊà‚àŸQ¼ºù ¥“Ak¦TMyžg2™ÂC &‘‡Ù’(Ü7'MGþ%Q£UIšzDVïˆn¿ª«bívX¼ÅöÊν1Û3ÜÊ* }ó…T3ê–VAa½±%ц®Exp{?Ô­ýϦ1G;ÆÅƒ£vªŒmA„D,V¡‘‘Š «9 ,Roék÷šÌ/³T"Ðwå•o »wjž-ä2LÏÅ2 Eš²jÅeœZˆœÎ‚Õ4µ3LdOJ<ªÆÁ< øÀ†à0LK‹¦,O­m”Õm<"3-pêÏÔ/êp,u{mßpD˜‰|–ä"Ldò†{èÅ|Äί‰:ñ8Û½ÚÕºå!ÏCÄ|' ýWD¡jÏc²^(ªþŠU!D¸K°ë,Œsù«z1aõš(ùÉÏ}‰Ä ‰ã(~/ ýWD_ÕÕCàm< ãlA¤a‹cd(õN£åb¼ØÖ‡}ŽfcO÷fD€q7v1[U’È1iòc$¤¥ã Ç•fWižØzÀðÔ¨£>»gâ"\}²¦ÒGc¦â%ËÍa“É%Ë„%ÇèéåtË0YoNM£+Ëëw´a*˺è¢×âÎéw%C™ÈK‹¤È‹À/ÖtM˜`tf ¿›az`<»ÔÕÎî™h¿p7îzÌ}û“92’ß0ò4€x"ˆW)Ô‹‹¦ëè†líµÙí-îy¬ëŽ-Ûh»Ù¯·ªl½¶ûí§±í#Æy7è.K»äö‡Ñ°ÑÝÑÀþª§L[Jéïm"KIéƒÎ8öù-ì«ì +]À]L±'X€|sª ,ƒ¥4aô,Žá'ð²Èg°»©4.¼ ¼G>txJg×@™;Ë—ÖÖ+Úpy7Ë1©ÃªmŒniãxæXq€èÍ…ÞªSii ìa‘¤iÑþA«ŠIlðÐ}íj‹ºe|»7mÇSæxZ9žV|X¨“­Êš*Ë3Zܨš®Dí]tBeQN*[ TæVII0`t³^úMЇ¢­Ü4ys(1zõ4ÓV §<½Žë@ãe»¤^º%Xòd®B^‹8O\ô‡Ó?\¦9–®šƒEªüp“²@žô9 ÆÞTÎÛšÏzò’€mu1l"“!3SJÁ0Î!oê¦H¤ýå¢r̘ÁúhM]¹:N:ÞØF¦„>Á¢‚$˜&WÉ&€ $ƒRb… À\3;¤-})‡pÝ¢v]›ë"aŒ·{ ®ž*Ç„.^Qjœ,»˜>¡fòmÇyzN´„⡤š|î¦$Z$zYp±¦/Cè=-ìëÆ|®ÉdПiÕ•A@âiNu Äa¸0py×ù %b«ØfEÙ+æ´ŽÓœß:ü@€å ŸA^ )F|ÆI&dPpÇL3¢!]>‡¸=аNe/!øcœq1{ÎD_xªäˆnÕSq®Žûª(4c)Þ×t8áC1¥YÆ¡RAm¸³1úºº¨ߨIã Ð­.JOm—LÇA’)\‰f1h­š´RWö&Q«¹j}ÀcÍ+Æ~ºãš[í¸ÜM$úÕðc¥ì=𠿝|xý8S¼XÛ;¶{=åùPÊ8Úxo0•3™ª®ÔŒpqoÎŽ„³£Q 17ãê¡SÝûs¨Ñ*¶÷¾Œï­Þ¸à—ú8y¢vz,Nå”eô±TS%n{Å´D[edÛÍ÷n÷‰c%ï–7¡,€Ö?Ÿ\(GÞj†c^õ˱4c pàܰG©ן]~7á`ž²ÕÖNq]µƒ¦#Ÿ rÌo»Š"LA xg穌¡È[µ±¹'· hÎiG-£dÖ1C¹R½dƒMpü½OáâªT@æhäžóB– Òö°#j¸UNeÄAÛòT›‚ZàÏ´´[ß)ÓÐèókýïub^ÌÖtÕMz¾fæ}­ô»ùÃ#zº8÷—°¼¸ ðE|¯5w¥ßOŠâ2ß`¸þgýGüNKe‰ó'KÝ@w±f£ Ù¯|‡‹1¾D#Ÿx²®ôóÅú@IèóˆøoRqníË´4b¼¿•Î0Ùzmì~¡ýÿ¶œÙÿÿÍqoqâ4L#q ÿ†Mæ_³%Ôì ˜OcÔãd)P$Èxxjø€ß¡ ¢©kN3*Ñ'HÇo‘VÍ«`÷' ÷ªL´¾¦)hŸ9ïú¾wòxò…Qý]RþéØ9ô|DP`âr£þÝ&®ÿp#j¦¼ÒXÑÇ»¨ÃV†+á#ß°G¾¨‚AIï/ÔXa#ŒËÒ¥Õýäóœ£0ôü©+Á‹|»Çüêëß…r÷õWãèT„/d–rŸ$W ú©¡úlåï†&5äŠjÄ•¯!aÎ_Mfå)d6,¦éÄ·êL‚ÒŒ£ÑÐS€|žú;ÀIñ¯Šë0 NR-Ûz,FúÊXúÿH×õðß‹Os÷hq¦iÅÕ8W\N”Aáï*t~¥ŒÄÔü¦Ò^ endstream endobj 1048 0 obj << /Length 1945 /Filter /FlateDecode >> stream xڽ˒›8ð>_áÚ®³†¤|È>²µ[ÙGe|sæ ƒŒI0¸ÏŒóõÛ­cä85µ[sp«ÕjµúÝ ›8ðÇ&‘3™{žñpïî…­Ò »cšn„³åOË»ßûþ„9väDl²ÜôY-“ÉÊúy+ö¬¦3Ïó,þf:ãÜ·~©ÄÔ ­ç¬Hi#.w;Q$õtæòÐ÷,6Ÿ>.ÿ¸ûuÙ]í»î2"å¥A_HÆ™ís„Üf'IåË>Ï⬙ßÚ‹fKPzO¿"ÏÒ¢.>fé¶yÈ© ê¦RBxSV;Ñ,¹‡¼¡Õ=¾ dœ1Ïf>]º—šå~ªJ `4¿M–çÍq/ÏW‹¤lZø“ã³·Èuh…™ØÊ`í1îzÀŠGµÂÇíDõ «ú/ôæðæTS0Æ5¬B¨7YYÐ"´™£y]å… Ì®¬ô^* Y‰\)eÆ8˜‹kÕ0’w'›m Zèè&Š x©v®M…èB“ËÚVl;®=-,§¡g<+™2 ]qn=Bàk}r‘ɬξʄvÊ5<$°>ƒºw²B+ÿÌ»VŠÇ?eÝ<ÄU¶oÆ ´R„S@ðSñÇTûÒµHR¶FÔå¹ aâj}Û'ë`äšq/(é-Kñ®ªÀÅTX( 7ºR\íˆà{ øÑ4Y ò¸‘c¥•Àa'S¥§•Ë #«ÞŠDµHõ4…\Âww:¥4ÛüH4*‡ê´LA´J®Så,ÉvPöÀ 0ß©Mh’… ¡OrôåDb²€Eº72ŽmJW®~ȯäCtg P~a69o‹Û&´•¾Ò“ç!VM& ž³q¿2æÑœì…yUD­Ë2ï>H”_äb}›ž\˜ãÙN4^Ƶäå4Ðêqõ¨jH«eah3œGèïó„¬ÅkªƒYå<òÚÙ×í›w³ MçLeùÞ˜ ¼ÅNC¢Û¢˜2j¶BÏØÏS¡¹æÙ÷Ú>RÒÄ7›oRB¯;ƒÄþU¼˜u&U®¬·¨lŽÜç€ôBþWË' eÎ`H–š>?8V!U:Hˆ_Q6ôÎôX-p¶_vWž:[> stream xÚåZKÛF¾ûWèH‡Í7Ì!qÈ"ÁÞ9p| ¨–Ä Erù°<Þ?¿U]Ý|‰-rœÍa±`H6«ëÕÕU_5Å6ü±MdmÇ1#7Ü$—W–­NºyÿÓ+&év@¸P~÷ôêáGÏÛ0ËŒ¬ˆmžŽCVO‡Íãí9.^mwŽãî›íÎu=ãû*ÞÚ¡qMó½HŠË%Îõvg»¡ç,Ü~|úÛ«ž:Ñžm¯Ô)—•ôC×dŽKJ>9HŽ|c—À(àhs.ã*¾p0£Fµ€›?äöAÐðÏ Ï±$ð¦žö-ÍÞëfûFšÒ$n„žžq=óæŒ^ÅWÒ¾>ÇáR$©ÏE›¶îÈ\´cŽÉ<2|/,åϸE.¨ÅÏ1âÏ)®Hä0»$פù.Ö0Kg„sÏŽ1o¼aBÈ8¶ñmN:ñÏñ¥Ì¤‚űS4ÎHSòÁ–'z& £¬ 4òSzàÒÌ4'ŠÎ\Åzè&F~úÝb.½Æ$³Ó üïfè8 q©¨wrŠÍ‘3¦L…|a šv«ƒïš!úJ$õ’¦B3®ŸuK„.ÛyŒ¹ Ä3}æÓ¤÷°¸4®ã§ –ž9…º}Ì"ŧ­çqõÜ Ô—‚®9gÏ4t¬ŠË|!»’çšøÃ¹EN<Ä’#y’VIÆiðš6g9*5„ ¦tGŠŒrp„ 9ÈGR涚݃™°Ò0v@fSèçá{ÝLGŽWa¸30Ép‘†·;f ñ¡Þx¤»#  ½Ã7-ò¨ÓKšÅÕ›9.Ö8Ð>)ölO–›åw˳Ê4iÚŠÓ;xxLÚªây#Ç_Ë1úïNrd_ÝÕMUüÁÀÈqe£Àt|g¼°°’„`Ç5­èNT<Δš7‚d ylªV ²ô2ö72ö·2ö{!Üþ™[…]gàÀÃÿ‡E’iª$øFn%Ÿ=ÕĹ¯-‡8Sk,ÎÓ—CÏñŸ³¬…¸ŒH©i‘פ ÖC©Žcàcg²Ð§’z+"Ž`E™Ö[¥XO `)ÏõLÛY{™¢Ó3NŸ¯v,4}Ç_'Qß;a¹Pê^ßh䆦Íì•IâÆ,©làúMEÌ\-™h.z¢Ë÷½l›]¸N1E|_³ Ë>@(7ßhà>²‚•Hâ Æ,×!"$šæÑŸŠ¶Š[Q%ÃÁÖ„‡¶înÅfËè¾j zÎÕÑÐ8¦Y6 ðn)dIUõ‡=ŸW ÿLÏI‘•¨¹‘‘BæÈéJ"Àº'øÏsšWØÁƳ^¯R¯P¡¸èaRS¥q~j¡øS˜eqÓ¤‰,XØ™›s‰4öhÍóà(aÒòE¶bl"¤~8IÑ Ø‹Ow8"i­çJÈæÕ‹‚ZRŒb/:' ¥¿ë0Ë1­HƒCTðu‚xþºC(>ÊÛRQc_fñMš7Š@ø±(Ø= ÔøßöƒÖÊÖɬþϸyl&#ݶŒš'J`ðXTLÌ¶Ú 0Æû@«i`Â|üÂ;ÝŽA„Ptü‡Ø]J“‚®„ %MÝ&°óê”ö!å„!kwzÆb!´ôç®E¨ÉJ%ÓÈŸ/æióó Úpk+%Ì ‘«áµ°ŸÉ®ojÀÁôJ$V9XÆ ‡QÞ$tƒ×Âpí«`U|CîGM¸Ü(=Sšbž4oj4©e±šƒ͉†š4ü®å›Ží/ž&õn@>{š0f:ª‚ÓÊm…AÜ• (ê¦L‹·èðŸ:¿Qö'§‰ì/ÚZäm¸¸®ýÚÁÃð Ÿiù,ÛÀU£´uÒ '¹ÌvL6Hwe|â²zØõo;p©jˆÈéKŸc¼C–EÝü‰Ž¾Âš^6Dþ ÖÕXÕ³÷üÈ!a%²jbòZ§ê _Š1ŠêÍ7N˜ž­€â€ñÄ$Þ36Ÿ›¦¬ß<<\¯W3>{n&ÅåáŸåC €¸y(ÁÊ:©ÒnÇúáÝ/ï5án>™:fÇ=í6„’×b“‚ÿqka9´I3\Æ“Zòî6ÉÒ²ìžîd0K›Á0Q[Aõ€òÔƒ· PâGé“`Ò:s¬”´Š6?¨P“¨IÀÎRà×›œœëª8æ\“Èœ nåzfd?\À’·¨º—½<½žùÊCÀ»ƒÞ9¿ù‡+‰@X uŠn/-¡«o´\¹~È…_ D .“Á8× Œ·X¾ä'€¼&±2#KŠ4§Ñë9¥Œ7ÑM"0W|d½+ƒ>½ëÈó1Ag 4 J35n›â¨²NãÀ&k\O Ap]·ÛÜ’D‡F‰tÞ_0­G£ø´ïa/ R‚8Ž T\•p¥8¤\âö ÕüVÒ‰}TÍ„Q—FŽ±Â GÄ2UŸ%è+B\ó14‰é‚I9“¯Jqt™ T9«Ö°Ç\šÑU”~ÜŠ æ™Õ…Ì0â˜S|ZJ³xŸñ»ß‚ÿZFøÊ|ðçZl%ö&°a.Ðd}mÓeÑØEÏeC’à'ìW¤Ï™úpªwbHèRǤ–à¾â§¾ ’½•ÈWQ¯eCGr€Ž'mÓ7•Ìë0°R=T,йÿjU—”+<,gH¸@rƒSPX0S‘é»ÚQF³<«_Z‡*¾¾ ¦V„ĸ¡m^`Ú=­.pôKÞM¦þqãêE‘p^ £}ËšÀhXÉÞʸPÓ;|"÷Ñ$Q—ËåTLõB&¼Á†׳Ü"®¤™ú¯ÌvL/ V|¦PΧP”Éðiwd»bO¯“ª¨DO™¾øc…瘑­UJR/)5aJ?û)p…§â!‹x·V¼¤^?aúRŸØÌƱN'I¼ Ò„¥Ðè;þ%åÕ;èËÎ7Þ 4 â% Æ,¿úSŽc{°¶ÁJÝõ‚rS¦òwi¾/®7 ø¾iÙáZ$õ’¦ë>æØ>3­Ð'Ä_ ¡9ñœWâ§.ðÐÿªdoU×é>ÍÒ&ÅžÇ iÚÎ-@¡÷²‰ÅÛ'¡‚í‡fmÓQ¿¯ûA¼{|¤~ø7šÍvš+yÍ9n¤F•<‰m)ëÝ÷?J+#Ë„¶m ж)Û¦‡i5—(îtÓRÆGEew¶ÄŸŽz *~øÜ`‹º²c›'¢æü¥}ÞÿAB@ endstream endobj 934 0 obj << /Type /ObjStm /N 100 /First 934 /Length 3289 /Filter /FlateDecode >> stream xÚÝZ[wÛ6~÷¯À[‡ÄìÉv“8Yï¦u6—6iÒ“CI°Äš’ò%¿~¿EE±(²’œž}!‡À`f0˜ÌÌTÊR–)ÏœÇË0™ ¼-SN³L§Ì¤’ ‰·¢~Ç áiɬ±xkæŒ@¿Àp·'¤d^:|+æ-õƒVjðÎXæËLÊ„è0 €A«¶Àö†iÀ&,!J À[PE‹“$%|ø”ÏDîhÉÔBdtË4s“È,&%¸C"©¸[@g{d—ÆÇp)ä±)“ÓÌ€( æ#³ ,¬c*UòT¤¥Ãtæ¡( {¦dµ`ÚFÑ(o„JÔó‹ŒÝg^±,ƒÂmd06QàïÒ=bcSÊ¡ «!-„ϳ #Dš¦X S…&¬Ô—0DZÀ€îmX¤=‘ $áÑf˜£É²ÌIñs: `0FCû©ÌÙ,âeÌ9¥© #¼$B1—êšùÔ9âá™UÀö¼ÄC@?^Úˆ•1¯ÒH×ÒDëïu”„ìÊDIð ‹è:LE¤°Zï¼°ö™6ԆŅ¥„5ždWdn†Æ*² Û4-'ñ ;÷–f¡âBP¯¦€Jã”a•©‘;I¨IaÊE’ÄÄgìrÐ…PÔïLì"$—Å~Á+±ð€ ÔªÉG:¶[('öîÞÝã«YËîÞeü!Y¥ƒ×>LKe—0¦üóÏ{üI] Ÿ…–½füɃ‡Œ?-ûs]Díùå< #‡=~”ìmàß ßãOCS-êah¢ËǦ_¨ÈïUì5 K«žÉ?Á&¯1–y¿Ä;˜Í*zƒ ÉBÁ„ÞWXG¼=~¯ªG¡îˆ¦ç!DÂ'ž)%…™j+ *¿õl1h#•ÇÅì´¢^ž1þâéQ÷ØŸ´í¼ù‰óqÑNƒdXMy¨ËËü¼áñ1(«ŸæMjÞžW?N«Qˆ$”wH7 ûÛOÊž‰DÀÉTŠ7S™H,²2IÞJÜGÕóŠñlÿqþ<¼|ãZ4X‘uþØk Îq_¾úᾘ²Ù¢,ÿü ޱ&ñˆ áÝlA¬fÝšnkAZ]³ øÉ—Xù+á­M nµqâWp¬V‰6z#žÖ"A0Ø„¦R“|[5¢w´ÂŒö=yÌMª¦m†u1oáÿ°—DÜzë·E5{·í?øI"$¦ˆyB•f?¦î‡4ýx¿T£M(‘TnÍåtÞVÀV`sçãU=¼h=kA 6ÀNò² Ÿ_vhüê²¹Õ²¯ÝéŽR‚­GªÊJ¬t‰Æ6¢E–Z¿· y¯¡¤›ÓIUCRT:Þ¶ è²ÈËd>:ùdÔø¼¤ØÝÚa· v1“ÅÏ­=??Oòº­Næu5(ô©Ê³b6ŽAï¼8-ø?Û¢-Ã?VKþvÿ7ÈPÕoÕù|R ›·óÙxA¡çjì1j³ ÞÇ8C$K›ð¤€¤âKðæ0ösóÁ_þ¢ ñGSÊüÿ©§î,¯Ø,¯øÉkÜFy×Q¾Q$´×S(ën è"¡[¾mú™ˆøEÙ‰¶YbÝZäR¥‹‘TÊ!C1þÆÌäóªóa[œÊO(CÚ-=¢=Z"»K©*Ó‰wÕ,‰úûðGù’8Ä™¥‰D¡­‹BÄtÍ™…hŠ÷×’2ûIÙTk‰âöÙĆ`Fö’ÀÑ”Ja±U*w8V#ì½89 °I²Þ×JòfžÃ2Ÿòw ¸ÊhPòÙb:uSŒg|T•e^óy€ÁÏZžO5ùlÔ!7 Z>'3/ÃIÛAu1ž•2ð¢9åórÑpìXÓœO.ç“0#jE5âM™7þ>Ô¯f’uÞNêø ü‹ŸÀ0xS\ð&œaLˆDg‡UYÍÐ<-:¨ MÃûE^ò1¹>ÿw‹ÐP4áyËø=~Ÿ?à‡ü!ÄÿÅø¿ùøcþ ÿ•ó'ü¿ü)ÆŸóü7þ;É_ñ?ø–yÚ8§ÀNÔek?¿aQ ‹z¸˜òÅ öØ «:@‚rç|À‡|Ä1>æ^ð¿ø)/ù”ÏxÅçü¯yÃ[¾àgüœ_ðKþ>RKŽu÷µÆ©-ÊQàXhùá:[Âb7àW"o™­Ö2¶…²,æMÑðQ>C;Ý‹Vº“ÿ¤ ´(í¤ZÄÅ}6Ìk(o¼(ÊH9Ju|سü£ë^~­Ë#Ô‰Þ‹ñ¡]×rX˜Hµa_Ý,Û:…i^ŸòæŠ ÝÐj¥ˆ÷]ÿ«Q«¦®ô¨:Ÿñh¶dŠ%Æóá¢&ë¿ä—0©A]†)»«‘µ¬È «ùå’W=:¥EÃ#1…U]”Õ¸æ%To×uÄ*ŒP€I°Q“A“ €üFÞ,¢ý×±¯¾òᢠ|º ÊÇ”¾-ý„fi±ËÀÉYV£ jÝá¢üH¾¥è3rŠšüà$/O:–ËÆfå%QQåtr¬YÆA·*+íԤ˃C~¿é°|Ø >\|¸uÔáu8Gk8G+œÃvÂíØwèÇúñúña5jº(Ûb^^òãÎO_tC_tC_¬ }±óªë|>©jØW¨§°ûAÙð|éÀ]w¾66ïØæ+yTCŽ€Ô«!tƒC78¬ «QE‡St8ÅN±Â PìcWuèU‡^­¡WK„Õ¨QqVPC§„E7pÑ \¬ \¬F\vmTÂeßüÕòb¥6æmë(«¼mt†põfÿôÍF¸‰`oöŸ‡—ì1¶„Ø‚v¿wÑØÂžb]àìð2°gÕI{Ž4ŸS}ÄöË|ʆ ?¼M@~‹\°z1Ã>3 ÈÕ– `7†¶wlòEÝ´÷'y\k?Îû¿Ç/Fí„’=:9uZ1—¦Ì µ^)Ñ¥ B§[( s¶ãtÑ;¦tD[ú­<žU¯ªìœbëÍ)¶þæ)¶·×Rl¯o{ÆäÍæ<î Ž¦$”¿ OX(U˜ÝN>Nñ ²:ݧxË«¾Sñú÷(®²ë+ŸéÛW¾ËÎé¥{Ëå»Ói¼DÙµÚr*qŠn€\¢AŸª-£}¢Syc¡q/¼Gt¥B)ÈYhv.µ J,¥éJ ¥•{ ¦kÄw`.ê¬4ƒ‰g‰Çß*‘ð\ºËé›§‚í±^”»Vx´Ä[0›:a£«CáèXøF®1ÛÙYÓ™JlQ(:W¦û+(>U_ÆbGöqhG ò49—¤6Û.Æ\+î ú¸B`Ù÷:ó›™ü·Ž+"âj`‰×™·‹,ñîtBl¸ð»aEBWæÊøÄÁ$  DÓ †Íàq7Ûx¬¶<¡ÖZ‚|èèˆr¨|¾ÂYú8G-R_n{xîeBüJ›ÄÒ›µ‰Tt×—7꫈¶¥HÒù$EÔQðK “ÐN"X¦düÞJ¤ŠÆd^Ìëb’“úƒˆüJÔˆ÷õŸ Û‡‚øg€ÜåR¹ëî$̹“HezÍŸD¿% ½«÷(ëÓ1Ú(¦ LÉ1‹röæm©™ójÑîx- /5ßhì‹ØœœNtüïC&Vd7ïáâúzÛÛÄí”sP€ÛŒ(,v:«o%sk«’öºUI}{«Zʳƒ1Ñ&lã]rÿÂÒJ“0)ûɇè^[XivsdþkÒiãöV7ø­ÚÁoe¶ô[•ö€èÙ½o+½õuow‹/òYB?¡é,‹AØdñû«nQüÉe;ÉÇU7Is6Þv3í%[J+o,%p·ÝWR ¬¬q†‚¢€!+º”öôùuåTbNÒðæ]Ý^Às&í´ÜVÜ^¾¥¸ˆ©Rˆo"n/åçtúeûOš¢P@êb] £*ó‰tÈæ½o.òшʲ|°û.„Ž·]xÓ_vôŸ’D´òÙvÑJÙ£ý*v WÝÕýÇáJÛÛ‡+ÝG)ÝG)ÝG)½ó^!¤MK»ÈIíɬEšhnÎ;æy;¡ûPïZ‹;›ÐÏ„=k­tbåç™obü‰0'LâaWÚƒ°C<c‹lÇÄï¯ë’eÞ¶}’ÓQç­bòRº¥´Fø.ê}{a¯„‘èSËß>Ÿµ]A2ñ3žDÒfÌwÿP¤N^wQ—îࢺwȾÄ6½‹š>‘0=ŽYáôe¸éËpã{ OQlïü¶w~ÛS¶=eÛS¶=eÛS¶=eÛSîþÙò÷5—gá¨&Ñtxfuâå¬ß_×$ó‹"/É Ã-|g%Y/©Gù`Ü7—tÍqþÅ/° endstream endobj 1083 0 obj << /Length 2220 /Filter /FlateDecode >> stream xÚÍYYÛF~÷¯üD-$.ï#Æ<ìf×9`A2@L€C¶$"©m’žL~}êjR’Ù{ØGuuUuU}Õ-åÁÏ_åÞ* C7²Uy|åѨޯ¸ñÃW¯|¡ÛáöŒòß÷¯þù6ŽW¾çæ^î¯îwç¬î«Õƒóå¡8 J¯·a:ÑëmÅÎt±2ç©n÷òeqžÜ`Qç °H=àU÷ ‚ Åo¸!¹ìðh¡÷ãÙMгÞGÅçÛƒ+†yà(T£(qì#™‡_ßyð6þ{¡‚˜âI­ÀÇÚ~Y$(»¦Ó=¸³g ]ÛmT»Ÿ¼'¾^æó²µp8¢Y3pl#« ¡’%ÎÛu:c[5øü¹jþS*@[…aä€ãÚçã4´Št®„¬å/6ÔïÅñÄ®vž7‚$u!¥¬’ sÃø¥Üa¨·gä ùãš)i± 6W‚„qè†yø‰‚ê¹fJ‚¸Eÿ¼ì.Ys¬E¹¤&q°{òx/uv]ÓtszÆ¡Ùo= Yeñ#$UTÛU•%8 lêÓiâŸ_†h\ <ú´¦ƒl"¹&àN%ª,‚Ät°Ã'Ð?Iˆmö›?”î {"  ÁìÕl›*å*‹^™1Qà†7Áì¢7]–­"»BIЂ"ÝÀmöeÜ#‡{†C(áp?w~:Ôb¢9a#Õ¡èÏøH³“CÊ%a¬R'L#8„v©eÇAm_**õq®)¸èBËkã¢kœT -Ö è”X®øèIq„E6@‚ÜÅsÄP;(ë?©= søÒU¦~Ñ…~æ±93âOÈ éA¸™à˜¤5ùVœ"x+K¬xÖT$h}¥7ÕRŒlXÞ‰A­!Wð1àÕþÞœ©cÔu"8ã^É8»^HÙF÷š‚jòRüN×9ì¤üyxWÜ£Têgî=œÍûÍB+™ªµÜwo@^j/bÄk 0l"5Ÿ…{°L}&¿CriNXXkiu}æeµ’ÀÍóüòdÀÏö‚€Ô¼û®û~ +§ï•˜§‡ç“ºìƒ·\TøËЙ¹ ]@§¹Y£¨;d³ì~D³ 8…ÎÀÁÞDS$´¢)N šKÓÞàd (R+äàJ6¿E ºVX—ÊAY‘*È%F¸™mJý§º‘ÖüØ)¥0QZUvøF(¨©1¦"¸»v’ƒ<ðƳ\G³CZÁ%ö­7×ysK´²zéItÃ^ 6.!ëüJ9G¸Ä×-%;üsvŸœâ,†¿VšËìe¼ÐªhX«ë͔܉OW•·­ÒM¹¤Š‚@èþo,¸ªGãEtá3ï(‘â81é—qH¤ü&Ñà­?‚ˆûFfÅöË î^ ,˜ÐâûçæÖLŒ5åø×ÅcY©Ýþõ{ÞÆ£â€3ñxÚì:}ä.¿}Éܦ¶ÅNBOh<ÀÅ6r̲_Äâ$”{,D¹¼ˆåy<ßÍqF®Ïó?ÀŸA¯Ë endstream endobj 1092 0 obj << /Length 2484 /Filter /FlateDecode >> stream xÚÛŽ£Êñ}¿ÂÚ'À€ñ‰ü°{2›‹fV;#åaOÚж;Á€˜ËùúÔ Œmðx£‘†¾TWUWu]íM\øó&+w²\,æ« ž$‡.­ÚÝ„ßÿöÁ¸ÎzŸŸ>üùKNÃÛ Â¥#F“˜*®²Àc8Î_?ƒt!—O’ o¸¨:dp|0©Àš6z (f'tQ~§boIñ•Ðeñ@<7lò$¶£{å„çÀs8öv .¡nŒ™& *W2~†3ÂÀuJ`½fo×:«²³Êš0"ù¿û.¤r œú'Gy"+¾ùRVï*þ05=OÃäÓè¡ü`;î#¸ŒˆeÐ? %(ðMмªm +[rÔFÝH8 S (žÚÓäq”‹ï³²gŠ!x«Qáô™p*&¥øÓf¿ª¥x‘.1­©ä£^ÄNÄkS0Z¨I0T6Ét¾#EÔ2_/:‚Ê; +¼t%« +t~L$7]¢D7«Ÿ ñWµDZlV§š²oŽæ*=Ûí´Gnà³Þ™ü¾Îu_ nçÎò§ÓÓ_M:pv^žö†ŽßçǽQWtâå6ßPJlS«¸gÅ/°”V+ñ¤’Y¦¼ÉitܦÑq¯¸~uˆð Úè¦È¡ó²7TF K½âäXÒÀäÒ^‰@% sjSYS_q]PU—ªÂc`E½ú§m‚%¹¬–¿ê~øÊÒWN‡kØÐú UQ.eôg†+d8GúyaIy¸òjª¡7CjŠ\QSä±¹.¡XU’ÍÁfÿÞ0%›‹¼öŒÛÚ\èGΗi°"­.îY]2Rà ’½­¡rÓÿÈÁØù±¶£Ïf-)1%üÝìöã” _ú¥¹vžÞ¦ïáãQ°×Wó¿Æ#ÑÝX;}(举†‹Î^ýœ­ûwQYÝYUûì φÜt¿tcç+¦xYmÊì CÒˆ·ì=¾«*{®p›ï(A(½hÃ2åŽÚ>‘áÄoaMa'[EÕ %݂ѡ×8'ÒÏwAc©0`ÜÄ#?Ûö] YÙÚâÀ#2%Hh’¬¨Ú`›cwE6ÛßIúÞóâŸ(>ËÔã®0ˆ9P/©ÉôªÓYeþвamÛÀ)Ù=bâø;’<,éØË ÐEÎ;§I§¤0K¼Û^tð£ØZ-ßõ¹ ŠDƒÉø ÿ§PÂ>F,k,'5i“èô¼Pµ`íÖÀÅô iñÐ!Ùý…ÎúãÇ®ÖÁªG›‹¸ü@Ó¥bJ°±úÖ=UÞT5¹7L„y£lo¶þ„ÿeÿ ìÎäýñ2š¯4º±ž’*òðl}ú9šëvÙ w.º–@˜Š¿ÉœC­h# =„ÎùËm3<ǫ̂-=%Xׯ%:JiM"G½æÞ £–%>hPÍeš"Ž´O™c– <[º¹–ÉO¼ÈûÙ œ±œm;¥©º~ˆèo´t²?Ôš u¨Žñ#ðM~…W„€Ú¨cfgU ™#j°¿œ«C×Zé-³¸+°§ñl )X –ˆ%NÔô„ªù YUªŒKà÷ËvpÎMÕæÐ8CG &O²&ÕÎÚ~9 ?šÔˆBŒ"áA þ¥]K$R>¢ª cn•Œc©,kerê®ïN éG¹Y¥KeIO´—ú­ Ë=Šrð‡±zpm7¢hriÜ—Ðm¼âŠßWãé5x³Î²WiÚµíÑÆ¾¶ƒ·q5“;„!¥çzãthýܶ>®"ÜkHàÚBü÷ Y¿ö2QÿTºL×(¨|—éø–n/9 WPRv-Éã{8“Ì”nÀ‹ ëMQdï"å0áÞ©U”öÞ×wé ]% ïPÅß ±QhÁj¡"ã_1ã?k!t¦Þ´•šf¬ð°ÎÝÓL~ÏŒÛf6OÀw¦¼O 2ž*l¢eØÈ/*Øx„caäü¢]Õ?pÄ7 šT~o—¨I¬P¿»”…íYR.îGÒCsP;}K©ët÷bÖÇ­«ËêãÝG60/9Ppºë•‚w¿Ýw‰þìÿ?÷¦€ endstream endobj 1096 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./CDlabel.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1097 0 R /BBox [0 0 331.65 331.65] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R15 1098 0 R >>/Font << /R13 1101 0 R /R11 1104 0 R /R9 1107 0 R /R7 1110 0 R /R17 1112 0 R >> >> /Length 1939 /Filter /FlateDecode >> stream xœíXK¹ ¾×¯Ð±j‘¦ùøÈm9dÁæ°ÈÁ?ƒ?w±ð¿(UU·kÆÈ\ô¡$ÅüÄ¢¨þP¨`þÖçõíôa!-¤ÍËís3ýyVè£ëÉ*ƒŒ)îz8”®',›Æö\_a¹žÎÚ}ù¶Öõ¯'ŠJPyskŸ:Uhr~^ªm“ë‰T;¿«Û²m>àöé¶l{^ªm“ë鎕 刺óÏÊÛ ¡º {Ap¬ê9X%_ýþ»{ðò‡éç5Ó¡Õ.¶•ë”p³ Dûó¨¹ÍïUê.Á} îÚû©·=Ïo× X×lvŽv϶Ö0¹ð{—$ÎççAs›¯ûatÖHæü¼p`[¶=¿Ô[§ë†\ØÙPލQÏ¢¼š>LÔ‹RY×·å§«éÑS+Ì`ì^®^N£`Q! ãÂŽ êåêvúuþq91¸ÍŸöÑç}t»Þï£ßöÑ»£L›Î/öá¿®žLžF!N/N™VÕˉ Ô-ÊÕóé×ùj9ÉüúÅrW@¬ó/K ‰¤!𝗖Æëün‘ùcª5@´ùñÂóÇgˉç÷¯ß¤Ò§å$!Þæ¿¥¸¿{ûj‘ù÷>ÌÑ‹å„áQyøFTLmõ"=;‘$y4\üñírª Ø<æç Xó–‰#·ù¯ÏÎ ·ËIÁ‰½^;0:Z3Ê(¸‹Ì7 ºÕ:¿Yr€m^ñ´ùü|QШ5.4ÿ´œÄZÌOÄZÒàâMæ×çÕo—“hm<ÿ´0Pߴܳ6ÿ±(*É¥«Ï¾X¾ 7L£MÁbWh”ÄœD u¾ZÐŒduªJKqŠ6ÿ}àZy#¢¡²®áÅf4í_/Žj¼(­R¬['—[W ˉ*›{½C0e~*T§ª£÷ ƒ£ášùÍjõùÏRnHó£¥ s¬#ŒùÙ.ºXòya. õÂôîݾö,{±4àfÍf8ã^˜~·ÿ¾ü¸œ¬¿Õü6€›’¯vrô2_³X£ À‹5¯RÈÑîB‹òüf µž'Û¹š~NÊ[yõiªQþ˜¨<™¨ü{Âòxb ¯…0ò¸sb·B„f%Ð ¨E&Y k…Yb ÿ˜6™H@hË2‹©oQHP!¬¶šOaU@ßPÓˆ¶Ä©…¤õ¥·»ÙMrs/ÔѡԺÔ/uP‚©Qy<Ø[ö„HICF¯œ’€ˆX!‹ Y8 —е"˜®4t‘TòAB…ÆE¥ZF†Ò’Š$¡¶t°0=æHÝÛÍê&¸¹èàKªÜÑn%Á\4: ‚p,a`é$4 ‘BD\´irÀµ„2SSîê aÈ$[«XsÁ£¨(pH!Žã¤Á Rn.;ì Aµ(B³â0»Inî…::Ô™¸Öq0AdjšD84 ì+jíD´Ì"ÎöÊÃ… 9"T-ÑjhgL¬2©J‰K¬Eņ5ŒdÂA9™hÀ;l'¢&Pn¿XdŒ«ÙMrs/ÔÑ¡ÎÄݸˆ+Mù ¤5{¬¹·“…wêH@kñ¨˜}¨•hÜúTX«Ã*’š’úbãžÜ›Wl^“ÊMÞ` ÔÃñ £}zs/ÊÁ•ñUÜ èˆµRkeh`}E÷NAÎF•²ókÅ=ÀÌ’Î> stream xœ]‘1nÃ0 EwB7ð·K1`pI– -жP$*ðÙpœ¡·/È$:<Oâÿæp:žê´ÙæcÓo¶L5¯|›ïkb{æËTMëlžÒö4=Ó5.¦9¼Ååûgaëlæòð÷xåæÓy½i3iÎ|[bâ5Ö › ±2\ó¿§vÿ˜8—çWǤŽÉŒ®¸Bfì")@ÉŒ¾%ð­hG à;ÑžÀ÷¢žÀ{Ñ@ àƒèžÀïER?ˆfRŸE )€—­HD)@p¢)@­ÂŽ ìD{R€ K† š×+‰N:xEnÓ}]¹nZ”!L•ÿº\æE¦,×l~œŠ— endstream endobj 1115 0 obj << /Filter /FlateDecode /Length 281 >> stream xœ]‘Anà E÷œ‚ø›`ˆ%k6É&‹VUÛ G^[޳èí«™$]tñ0 ™ßNÇS6Û|¬sþâÍŽS-+ßæûšÙžù2UÓ:[¦¼=M×|M‹ioiùþYØ:[x|ø{ºróé¢î´š<¾-)óšê…ÍÐ0Žd¸–GŠóø¼ê2)€Ëdß’øVÔ‘x'º'ð{ÑD à™¡)@QO Ðy2ChI‚¼v¤a'êI‚^îHB'º'òoèIB/šI‚´ )@(¢L Xt$#™!:R€( ÆH £hO {ækl2XIèˆÍ÷uåºiŒ“Ä3UþKz™©²\‹ù­x‘& endstream endobj 1117 0 obj << /Filter /FlateDecode /Length 266 >> stream xœ]‘=nÃ0 FwB7ðg[?`pI– -жpd*ðÙpœ¡·/H':<OAécu<ŸÎeÚlõ±Îé‹7›§2®|Ÿkb{áëTLÝØqJÛÓtM·a1ÕñmX¾¶9ïþ>ܸúl:Ý©÷š4|_†ÄëP®lz€úœÉpÿÕq¯¸äçUI\$Ó»D à™Þ;RïD)€dúP“„Z´%­¨'^4’i:R€Ð‰HÂA”I‹fR€Éô¤¢ )@lD[R€(ψŽ Ê¢'ˆ^z%!YI诌mz¬+—M'£ÉKâSá¿á-ó"U–Ëh~vƒ†h endstream endobj 1119 0 obj << /Filter /FlateDecode /Length 212 >> stream xœ]1ŽÂ0E{ŸÂ7ÈOñFЦaŠE+Ø {Œ\àX&Ü~å PPºåirº«ÍªÙýØü÷Ȭ;í9¬~°WnŽÝ(7í:ãfÏ·l›.¬&€¦HqòO_ëÀ9<ö- @ß’š†- À°­êI_5 Ôd@`PuC`6U{ÓWIÌ(Á^jÆZöÕM»{)œÙˆ4®Mcâ÷Òòœë”æäÕ?ŽÆiÎ endstream endobj 1121 0 obj << /Filter /FlateDecode /Length 206 >> stream xœ]AŽ!E÷œ‚ô×¶!&ÚèÆÅL&3^¡0,¤ ¶ oo¨ngáâ‘< Rõ«;œŽ§œfÝýÔÉÿñ¬cÊ¡ò}zTÏúÂ×”Õf«Còójrú›+ª;|¹r~Ö[8.þínÜýö›ÍRã§À÷â> stream xÚÕWKÛ6¾ï¯0r¢€•ª%K)|HóhQ,Ò¢ñ!ÀfQÐ2m+‘%¢×ëþúÎp(Yv¤MÚCb±&E‡óüfÌ|ø f™?›G‘—ñt–ïo|³ª¶3šüñóM`é\ t”?-o~xdzÀ÷2? fËÍÕr=»g¯w¢ÑR9nEŒ¿t\ÎcöF 'LÙ±¨¶´‘×û½¨Ö­ã†<#ÎÃò×›·Ëþê8 ¿SF¤üZÈäJÈ$å^q²'©>ù±ÿÁxõµZv|æòЋæöÔr'-éó{7ŒSÖjeµãl%ZY•ÄÎëkoí8 Õrß”BË…°Ÿ@BØ<è(ؘ\xYÆ6‡*×E]9æê\ØÉ †”Iú8´ríj]#§™ÛéD^¤“¬J¡¶eI˜Þ™ÉÜ2ª Sµ¶¢ÒêœÕü<ÑzC£ ‚RX J˯¦q/tާvê„m‹G\”•%¶†¸%^mM£Þ ÝKW(švn‰æX”¥QÑ·Ê‘n½9¸FÀ<5´ÔJàÉŸ¡ qWа«Uñ¬XZ”´†÷xŽ›ÌCöxL^‡j˜d^–òYijo„kGíÈGBöš©Ñè÷˜c[+Ñ^Ë…s/ß'CGý ®™<ÑžÆ#­µ©YVXËÊ'~% FìU ØP ®Ç899iÄÀã¾4¥X(²Ò Õz®Ï@d&(DYl« é‚]{rˆÞ„³¤ÊœaÐâšäv“âhËö’FÉÖÊ•k»³³g–NÊ™‰—޹»‹YÚ6Ð íÇ}/úÃíEwº ÊPÔÁ3Dcõò˜0'’dë 5-žµ¥…ª÷4«‘ŒN¨£*4e?nt¬EUƒ–Š>Ž…ÞÑLO¡£9üHÜä¸oŒ ƒé ¹ü9h9^½Ñ6÷™¢Ë‹·ûeÏÛ! Š}ÈõAMèƒ×êÕgtû¨BÈb øð ã ?‹jš_Qýy'V²œN/d"ÊÒ8èØÓ»ad‚Ê^·QbøÛpŵ'í©•^£ "ØŒ‚S ÈŠ=}Cý®¤ò°Àì­mU}hhjJŽpi34UÛ4PL=FãG#rÜúb\h¥ÐõVváfdÂ(®é«…à,íY£ïXòØçÛòÆH© TgÔ»þeHc°_Œò}Ák"\1I»?Зçy4±¡aæEÕæþa²Ó¸ºn‰ˆˆúe1[Û¶ ¿ Ø*1ªÊ’(-]UfØ@1»²,‹¦•´Ñ-v9œ¡Zzgú ³!À:DÄ~<£ÌëD6#— ì»&ŽJB"UÄ‘|`Eƃú‹¿™ÀIØg' ÍµÍæCk“™ üImHïàˆŒíÁ3î»kή{ J}rz‘/òƒR²Òvý–6È4µK²z”eÝØ“’Àm<Ä×/-UG®¹m% ¯ßPŸ‚/»'øßúy endstream endobj 1133 0 obj << /Length 577 /Filter /FlateDecode >> stream xÚTßo›0~Ï_òÿÀ é´‡tíÒU}تh/ë*9ŽÖ3pÚeUÿ÷Ù˜æGUÓEÜ¿ûî»ã ò ù!o½1!`’¤/°‹6™çŒ›Ùõ¸È£=äÙ|¢ÔCLàyóÕ>Õ|é}÷?æ¬Ö¢ "BˆŸœQ’Pÿ¼aNýYe²dÕ² "œ¤”ø?æWƒ‹ù¶4Åøm¿v*IŠ@Š©1èPJlBü¹DÐ;Wƒ¯;œå|ÝÎèE;„&ûvZùGÜB c^†îaè½lh#<b‡fíÆ‚+¦å½X©¦dÚú •©áëTäRW²(,v]IÍeà qwgý–³¢S€c[ÜæŸì0sG‡S0"#/B ÚsŠ{Q©åò]“-ºpcJC i÷ì}˱“9ž‚-Dq .夔•¬YÖźt”¤f–ãCÃ[D.*³f¬ÓòFÖÚ70o…ú6¦Åo½X=Zózz3»p'¯µs¦í¦¬µÒâÉFíßi>Zµ«S²¢hÊúyä{]mÏ÷<ïµ|\«ÆÙ³†Õ¹ä­ó®Y•­M·‡Õá¿–ÝØ^[þ8­–G}ÉÊR4…¬–Eè"W*¯œu¦ÌeéÃæÖôzUéŒ/f¨\<é0׺nOã˜= ´jÝp»™™R½ÕÆ0LÝ¢‡öÝ‚ÑᢼÀow$s#³¦[ùp˜ ™åúƒ¹9Ã=ÆŒs:J^Èú?¯D¿ù[fûeù A¨PÜ endstream endobj 1135 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./bezier.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1136 0 R /BBox [0 0 305.31 15.45] /Resources << /ProcSet [ /PDF /Text ] /Font << /R13 1138 0 R /R11 1140 0 R /R9 1143 0 R /R7 1146 0 R >> >> /Length 400 /Filter /FlateDecode >> stream xœµ”1OÃ0…™=ó<ÆB9îÎgû¼"±°µÊÖ2ÁÔ‰‰_š¸¡ŽÒÐ"PKÑóó»ûì{·dñð•u·7hßÌ»¡þ¯-Ëno:s¿N–rl»W3ì K >«Xdo»½Ù4ÛÆµ¡!×2¨OÂÏÝ“¹_çÊÃ*œº³inœ‹R¢JËGÙ‡#ˆšBdU*Q¶u%…âçm‚œhP†ˆ¹ûüýïÐ¥¹jÛJþé<±Ä¹ˆm tbí\…NÅsß¹–™!ª6¾ô/„Ù¦$ˆ‚ÓÎxú¡3…ŽäÏѾÆÃã·{Á£ñ"<Ê—áŸÏà 9¥_‡gçZ„D#ÍÂ^{)$O9óŸA:ögZ6/–œ–+Éúß %•B;5¼<¼œ’„J´ü”ú)tJ‰@Îß"HqŠ&ê<Ê9ÒUó"*âüÌw,ŒŒ¥:Yáä*â€Z#±BûÓK·Ë¯â|3rÝåŠàÄ2s¤1fî }ìÌʬÌV~]m endstream endobj 1147 0 obj << /Filter /FlateDecode /Length 181 >> stream xœ]O1à Üy?À@Lj%]2´ªÚ~€€‰B!C_á$:œ¥³}ç³è‡ëbåâQ÷ÂÊCL¾àºlÅ!qЉIÅ}tõ`TÝl3ýÍæ÷'#WÜcØùÝÎ(žJRGî·x\³uXlšu¦ Á0LþotÙc865€Ã:- @ËF•!hÕ¨6­Éü´iwZà3w[)˜*}E©[Ú˜ð÷x^rSqLž}J”\ endstream endobj 1148 0 obj << /Filter /FlateDecode /Length 177 >> stream xœ]O»à Üù ÿAÈCɱ¤K‡VUÛ `"†DÈп¯€¤C‡³t¶ïtWM×Ë•l„êœzacIÜÜÂŒ‹%V7 ­ŠËS­Ò³jºIÿþx„4šÂïrÅêÙ”M]4ÊiܼT$-ÈFÎÅhŒ`HúïÔÁlŽÏ¾œ÷­`ãЉ ·.Q)28dv;uÉ8%<ÚC@йFŽ™âYÂ_Sï|R’f_çØY¸ endstream endobj 1149 0 obj << /Filter /FlateDecode /Length 169 >> stream xœ]1Â0 E÷œÂ7hc*¦*KY@¸@š8U†:QšÜ%¥1|K¶ÿ·ž›á|:³ÏÐÜR0Êà<ÛDKX“!iò,$‚õ&ºZͬ£h†‹ŽÏW$@°ä¶þªgjîx¨¹eL°´Dm(ižHôm«zç” ¶+Ü£ûq!JT¢—ªB> stream xœ]An! E÷œ‚Ì£ª‰4ò&Ýd‘*j{LÄ" "“En_áIºèâ!=À²¿‡ÃñãXòj‡s[·¬6å›Ü–{ bg¹äbF²1‡õiz†«¯f8œ|ýyT±d£¤Í?ýU†/zÓ›q« K”[õAš/1ÀSJl¤ÄOï[Áœž?iÇ @;6íYhßuf ¹«°°™XºŽ¬nìêXœÓI^=ûP=Ý+Œ ÷Ö¤¬ºØ£å"[ªKíUVJ4¿÷ˆfb endstream endobj 1153 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./bezier2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1154 0 R /BBox [0 0 400 140.16] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1155 0 R >>/Font << /R11 1157 0 R /R9 1159 0 R >> >> /Length 460 /Filter /FlateDecode >> stream xœ“;kãP…ûùSÆ…Æóº¯6°,¤‹­Î¤rØ@°Šìýõ‹²d {q1èjæ;gΕ¿IÛßP lw ?þ@Ào|ÁOhßî~‚¥h†^(FVl@,;© hRG(•ñÙ²'²4Nat&-EÇú†ŒïÀx æ'˜«œ:•žjÜmÒîp}ƒÙI;;×¼æb¿ðÑ\q¶_xkn¸µBE$Œµwß^C›KŠ™\c ä^Z-fžF &òØp;‚%j~Ò-7Å/Ôö ½æ†+”4ÛX/×:ÇZ’‘ù4ÂóÉÊU.fç'ÓKZWèÖ›´L»¢ýý_ Ýÿ‡rlð¹†í® •ë_C· [ÉŽFꬆu‡§¿% öV¿Àv'‚‰Jb‘v2c%”±~‡ÃoœØDSßz©!…4£˜{ß~ÜTL!yŽrÍ‹_®òM©D{¸e¿-kl)$+ÑD>˜ïc9·¯¥²F®Ì¼EÆBžJêšR¾•¸0齑¨alñ¬`Ö;À«y¨g¬b¤ü_p]‹D%¢e Êö8ÙøDáúšã,”­dTÊ©Äò8=Lé?jx…Wø3‹f÷ endstream endobj 1160 0 obj << /Filter /FlateDecode /Length 195 >> stream xœ]1Â0 E÷œ"7¨SX*/°t!àiâ  ¤Q(·Gq)ËôœXöO³CгnÎerWžuˆÉ~N¯âX|I™Vûèæ¯Éé6«f´ùöά[í9,~²n.f'³ô¸Éó3[ÇŦ;«€úHqòWÛ¥a ß—$ êÑ€¦jK¶U‘Ī ØUÝ€½©[Ô8ëöÚ½Já4KfÉT³ÄÄ¿oÉS®]š“W#%b& endstream endobj 1161 0 obj << /Filter /FlateDecode /Length 179 >> stream xœ]O1à Ûy?€$é€XÒ%C«ªíC2ô÷—¤CŸä»³e³a¼ŽÁÊ9šê|°Ö¸et‚ÙÒ´ÔzS†Ó,:6ÜtzЖZp;¿ëس¹à¦Ù5&ZX“6u˜HΕtNöïÔí‚ÉŸ¢SÎE§ˆV!8VÙk…à¼×èvêªqMx¢fËBÁ³Æó~MSLUE!Xò žZJ endstream endobj 1164 0 obj << /Length 2290 /Filter /FlateDecode >> stream xÚÅYK“ÛÆ¾ëWð°Jc3x(¥ƒ˱’Ê!©½É>@–D bh<´»Jå¿§{ºäPâJ*§¶¶Ì£_óõcrŸ\eá*‰"‘étµ=¼Ýh»[ÑÿþúBòº ,ÜÌVþp÷⻟ŒYÉPda&Ww÷+#¥ÀÇqÕ]±z¨hýëÝß^¼¹›(¥nd‰+/x¦j%¡¤ÑȤŠS-d¤‰YoL¬‚ÊUÙ®7Qb‚íÐ~XG2(;”ä\hÐJ¡’˜ö¿É·k•ûõF‡QP5øÒ—me[iìzCEI¯öž~súÙ®72Ö2x_mqDݱ"Àœ^9|¢Õï)¦´«>àTÙ,U[nûÊòè±- ¥~dæ,S7À`üÈÚÅsíÞ¹ÿ2ÿõ)ÿ.xöJuÐïKœGkÈHH#É3ö*“N[•…nµ8æUëg‹ËŠiÒœOJ0 i¿­P#87Ê”ÃÏr®š­=TÍŽ§[š¶C¿³ÓhŸ7»’Nð%ŽdA[Nl7 }IݞϠ~Z§Q{"½Å_féŒðD‡ãyOÃýÞ=ÁˆÃHp>Y¼y„ë&u´z‚NNÀ‰ÄA_g&Á×3¶LÎ65Ó‚…ž#5*”$:GwZ+wI N§a«fôïnèOKt—4Ì¢÷HóÁÙ‡°lÈrø0†`GçP5ÁGšÒ«XdI”ℌSÇ ²ˆ8bQB°´Ðq¶š­‚Ô* ª~Oò’Él×o-éÞÚšDã6É5ù4xø¥|?ÂL}¹|9ˆÂg«ô¶Ò>[¥Rh-D‘WDI®Y ÆuØð³0‚èÃ!´<†KÁn©¹IØ »9üv„ZˆÇ¡/ Í;ú%…é)ÀàÉw9)ý>ei"i³2$ cÌ7ß½=H¹úѾø§/ÝÉ|ÄÀùC `î˜Vu=t}›;±49›› Ž0´ç»6?Ð(;Om÷ài˜ì´´ßWm±±mjàòCUœÙÝ­û%4¡÷‚Ã¥õ#XI³…ùÍMæ6’ä4€’ÃvÒò¾µP¤‘‚: >Sptk‰±íL‘î Üa­î &û¼çe"” ¼çMñ,F*2K>U/#GôBõe‚› á‹A2qœ~kKx8©X¤ú VG©sZgn@v¶i§Tm›Âet·Éúd…UŠ¡<ËåþÒ#JÒà5Ö…É(ö¹«¼öJ 6e:pÙ7£ ŒôËGHF§‰þ,£àÀeFñÔŽcjÍʬ½Ú„1ާ‹E Žæu÷XcsÁ‰E±9Û‡mÛõ“|§ŒwbÕ-³½‹¦ÉÕº¤{åIøä#Èá*NÆd¯>›ì1Ô$’/›?—íµò êo_ÎE¬¾¬Rô³0æa÷ãTš[²U«Û’Ný5„u¼`¤ncÔbô¢”ÀZggîžc²{¦ >/³vôGÙA¡Ø#È D€z'KWôÙÜ#¾.ºŠ¥OôªÞ$þ|˜ˆh!9†A$I7òXB u;dÐÒ‚™¤0C^ŠcB0-i ¶$à×톈sx®Åââ®# >Ÿâjââª3^Š8‹•A~<ÖO,ç1*¯w¶…ûÏŽ»öGÏLÊ22¾]¶D|ÀŽ…ÒæÿÁ&úФ|;s“2t ™%ý¼ V"“ê µ~ú±¢úZe|—"Ñ7P—gE¥Ê œ¹»Ô¬µôÖUap5Š»ÝK.2BøÍk»³CGÃÇÖR!P¶ýXSê½­‹ŽiP7+¼¸P¹ý5õ ¶97 $5𣱜B"X-UÔBóYG^½`ÀæŠEwŒöo•1\J~¥­ØðÄ_IÇž´³ßÔ™›eƒ®ÜNNô„Ær1öï¡ã'¶ Âhb0.<ú”]QYAú}VMŸ{§:ÁÂ×o¼C³»cqJYvqÆÚïÔ…@ Èþ®oÂåá!oš±”ÜŸuˆÐ25w^8-è̪’ÊGÐK/îFdY¶”ʘÄo¥8ƒ·ý²sÅg¾«ÓÇ:†òª¹Ô¦\Ôºd‚GÛãËP×´…Ð3Û2ûº€ó÷vh½e²ðé>[Ee‚®Ï[‡(¸4íËœîð8áZDî©:á™Ë?zñÝ+§dÅ=RXlZv&ÕEK×í LÁüšªÛ».<¼;±>Ù•ˆY” ,÷¼³HµÚòàøB½ædÎ~VTLç×–;ÀÞKÇM¸:,dR†òÌA†n÷6g´œ>Ü3´ÊÇc]m«þ¶  zšú(ïˆÈyO‹¢7øßuõÛÌOÑ_ù>m|Þ_´ù†"ü_†.T%òÆ"NÉ0¤R‡Üsò4+Ä8à^ñß…}’ülOê£öäJ­+¸Á={,?C.Zñ">ä5º³2p´mIÃŒþ¢S•#,pa«)VÞÆæ<Ø`Rˆ+hY>ÿ6ï-‰j‚‡}5~Ýt´Ëºî®P ßwO‡coûÒÇÄ›†¼clð€’{‚EM¢8;u4KÖlhté60{ CX567b¾(áÃT¯óݶ­ÞSÐ.˜gCk´PDôüwGyè÷âÛXß×À]›÷/é+yZšÿ(ûü'ü:Èr“ƒ°ª¿ñê¿ìócï<v€¡Ö›Xª öVx"o…‡®¯\ìÆ1=Tyq?îÚ UÁeË$Žy¿wð÷ôk¦þÆD.§4Œ S¦sa¯¥8ä*p Ñ—M/Ϻ3}9Ä}X¸pÖCIyÛ+ÿãºíR endstream endobj 1168 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./dots.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1169 0 R /BBox [0 0 200.5 28.63] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1170 0 R >>>> /Length 98 /Filter /FlateDecode >> stream xœ5‹A €0 ïûŠ}ALJZýàM}B‚ЃxðûÒZYBv’Ý‹*F­ê; ÛÈãFäãã åŒ ‘uJsn.šcR±` ±^MµÅd˜»Ë4ußóovü’;V¼†žº endstream endobj 1171 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./colons.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1172 0 R /BBox [0 0 200.5 25.5] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1173 0 R >>>> /Length 90 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌeªPÎe¨àÅe¨Åe àÎe¤gªÂ¹–)ˆ453Ð342„ò RÉ\†&&&zP¾²$ŒVÌÈÞì endstream endobj 1176 0 obj << /Length 1433 /Filter /FlateDecode >> stream xÚ¥WÝoÛ6Ï_á§AbU%ËNžÖfíZ`ØÖå­ímÑ6YTI:i6ôß}PŠHI?`"ïƒw<ÞýŽL' üÒÉ2™”BÄË|1YïÏ¢Úí„ïßœ¥An‚³#É—×g/^Å$Mâe²L'כ㥮«É‡èÕN¶^ÙéLÓYžÑKõ¯îh냽™f‹H¹é,+Ë4‹²|úéúÝÙo×½Ý"˾ÑA”|ÆÃ4É›Oæ‹Ï#ß½jœ6Í9Ì–ó{²óV‚8zïéôûbºvA[6UX´“ÜÛ y¦È¶µ•¿è½ôäJ Ëd–²û³TÄiÁÞ;Q\Q­ƒšÈ¢?Å´µlÂw²Ùy‚×¢^ òžy²±fÏ#í*µ‘‡:˜»™E$ëCÐ5þ¦a)Ã_°†ïxb•¬*ãþ’°³”·¶9Ο9:Š[ (êó—!¦aV—S>&Eâ”âÉ;³ ºW1S~7«;´œŽ(³èJ»µU>èÐY¡Ê«é,̾=LÓÈKq鬾Qf¯¼½ò==çO—‹9ø’^ ¤ãü8Qg‰¸dÊÊ[ôÿi’œã ãþ4Ьˆ2þÄq'CB?Åÿå_ßbCð‡"ðS6¿Ý¤ôµ’Îÿ˜½GUÞU Ä6Ôø[<ÿ„ê×)ª/rßÖX`aC’äkå:pVSXÕ ˜=·Täª:Û¤‘ ùÇ, ï¨^*FT×@Vçd÷m”ªTwO8{Ô¯ÙXk±ªè É$'9FJä©öÊê5•"¼iœçÚ÷dùäpºÄ' gÍ£VZ ÅEÕS×Bè!Öký1Is>´£Avî6¤ £šª¥ó3¸¿2òa,‘d|ÜhØïxDÉÆÃ½’M?ÆÛËñаYˆ@•!v’°ydÈ)O;+âQ¨ïXp­íúPKûSˆòGK,ù:Pd'ü®8<ÓÁ,Ì—eô‡òò/ãsÜ[pInOJl_y½Æ[— €Ð‡ƒÒnZÒª'°- m°Ú#<Ë ¢YkÈY/Y™ÛækgøÞøÜ?$²¤€käD,ŠX,r|I¼x»OÅäÊœý=òìsgó’=»Õ€X߇ÍG¸¸Ü“¿kÙRÄI’uÈG7Ð½Š²2‰‹â9üÎËh6› v>¿Çé)É$år}Ä-p?)pW¸{õ5Ž˜¶Ñöw£-$ïž]`È?µ§_†ìíÇL—8Å¢lÂk (÷—CÃlbÑ9”Ä·@O ,¨%XÜŠÂýB·­n¶<5ÀaUê0¨e'Ü*î*0°¸O$OV¦N:ð$ÀÄ:ê¥|“ƒ'Ý˺»x¸9ÔUw§ÓÍZWáCÙN2ý•§·ŠrqU®<½°S¿°2zÈ0rú¬:: endstream endobj 1181 0 obj << /Length 1311 /Filter /FlateDecode >> stream xÚWKs"7¾ûWP{Ê æØá°ñfoåJqsö Ї™Ødkÿ{ºÕìÖNQ…„Ôïǧ†÷BøðÞ$ìâ˜M’qo±¹íiµêÑæÏ_/¸£á°AùóìâêsšöxÈ&á„÷fË^Ê9í§šå½û Jû_g_.~™%¥QôF•HùJç8êñ‹xš N°*'ŒÇ ©ËúÃ4‹‚?úCTzU‰>6U®ÐŠ—ƒGqÄ2âüMV²?Œ³4P5®I èg½Ö•¡Uö£Q`*ªûÃhä»…ÑÕ哨l I¤FÓ¡YK§:kª¾·—ëÃfkPš‘mÕÖ:B^؃B”À³Ú‰•ôJ„¡ÝZ­Öp7DièO9yXàmпLµ¤}­6ª•2H€þÄq —t§ˆ!º´ü•.è 6`WI'ñQ™5ݘµ®å©˜Ûý¾mGpyÙÀq‰2'1_Ú°ï§Y ®ÛD¡×#–%y}u%¥ÁlyÅ_- ½ÙÈÒ0²(cqÈO™?ÉDG¥Ëëæ‰¤O´`ÎqË•íöa1/äM[zžÉžnÎÙò±®ÕªD“¯›΄µìRzjª§Û‹bç¶œµ™õ4…®>kЭ.s…¡…³h&kãb½p9Á÷ÀçÄ”ëÑ1×I°ec>XJÑxûç–V0ïÚ'Ú$«ôtK½ƒ¹Ã¿æª|5/ÀtcG›š‘8ð%,N²ÈÏlœñÄÏ{ŒÓÄ÷Iœ×F{ý˜0YwÕ„ñhò6ÐùAÝ/uQØÂ}tu 0BÆ •mŠ£ÕÁiìµk³]-«a‰æI)s?­aäÉ Ycú»ê<â,»:Øk•w¸ÅÇ! E.è{›6•­~ÖåªÂÉ«qº–¹Ïláêa~¬ ŠMò qÌýÐI£**Øôò“À#B%¡¦\8Jí;{µ³Í³·¯Š×^‡,‹É鹆µÛiá͵ ¥ïBziñÝÛœ OõìµucëüEuÂŒÕõV!qÕ‰ÿ™NÎ¥ÀÙ¤ ד$ >÷áòÁuÿPZ 'd€¾ÈØxÂa¤vŠ&Þta ò‹¯YLvh`\Ú" Ç7œ¶»h™Û#ƒâ-ŠÀF•ÐD¢PÿzÅÃBš´ìjÓA:SLÔd§Î¬;!6ª1<KWÒ?AäQ¸÷fT­o†CŽ•²Ý&Ë·ª= oˆ¿yîgòSþŸÚ9ixQ×Ð|9óãÿd`“ endstream endobj 1186 0 obj << /Length 2025 /Filter /FlateDecode >> stream xÚÍÉŽÛ¸òž¯ðQ~°ô´[NÃì 0À hà2s`[´Í-%%v¾~j!eÙ-:e€‡ -©X,Ö¾ÐÑ"„Ñb.ÖIlÒb±­_„Õû¿¼ùéEdð|@ô'˜ß>¼øïY¶ˆÂ`n¢ÅÃnJê¡\¼õ¾;ˆc/õÒO’ÄË_.ý4ͼßu»×¢®U³_úñ:‹c/Η>üú⇇ñ0€>“+Ä|ÊV~ÃV^¤A”¤ÌÖcÛV žxËÿ[?γÌ 0V„ž<õ²)eÉ_øðZþ[I‹Ô/áû|DQ<‰ ÈëËÈ=lGDñ7¢Jþj-ô`ï–Yî‰já,¿á ‘õ gùöVŽM›È+åN UïÚG8­vºUç85@ð"[ùÂ’ ÊX¿ß Á£…% ¼QW’Ĭ!»Á@Qo]o¶´ül5?wº­ùMÌ ›¥ÞÁœPò+lEà2hŸjT¯D¥>HKÙ1˺šµLhDXö»Úæø¬¿8 Â(f"ª™'à'ëÝ3ÉÀB]örOìçñD·àf¯¶^{jÇÈMË8×2#•Žöêݵ߬ð{ÃŽIõ±R[Õ3¸iFn:ï0ˆ:xK<ÑuC-K0Uæy8ÈyG‚¡jjƒ§쫪¿ß«%§,N»3¸ ?¯ÔDG„1rÿl˜ÏMÉDH=øR‹Ó57ì<ËkðXqú2§ÑRTÍGÆ+„oà†iøËî.5úLЦ';Nwh‡ªä—è„NöüBÁ™} à öÙõþQË­êæ9:Môè`…%ðGe-Àš½ÏÉ E;­½þÖŒ†®|H@ixòÑz‹XÕËm?h‰™ ÉȽh}âÉøu àè‡ÔQg¾‚k {—ÅèÜ7¬jÀœQ5ÑÝ€e<ĸhiã]”8ÏEZ³?;Uµ3Å'Yì½WP–îRù^íUß9\p:Ì jß@U`¾ó6YŒVKÚ¢£r «!dÁ®¤5&ec¶ºxFœlŒ‡Æi8§6FqY7ávgãf a|áÒ [*¡÷È#Aç¸2daž+@qre„ºá·Ú!¦áÚä­Äcåê M5;GÚ ’Ù¹³nÏIclJZlÕ•œˆÞ8ÿéÝÐl{§‡"*¶[ܪÎú#ÌB“…’Ô;Ágäb| rË™@:¹ÐëÄ{ØJ­ãÛ”RpJ)ÐAQž¶òˆœvŒŽ¤i¡wf¥¡HB"Jp”9Dóiß¼›ÁÞm[× v¿Rœ³oK¼°^P%œÅ@#ÔA@Œq—’býbå™:¦Åv’J¡æ>¥”¨ÊçV‹£PúNµî•—Yf®£š²È¼wJ÷¥[ø¨ÉÓnj'­ IðiF¨Ì+E/ð-÷d%k9ÁöÂî&ÄéLž lÑ´áÑvDHAÝí«³áÀÄ=Y®æ¢ù`ÛR Á}´çiâ÷Ò}PT_͉=bµ3H_.çHR éü¿–Ý<ÈŠKqц-¡Mü=[Þp"HHvÃ&hÉdÂ%è8€¥“thÛ¶ùkØ‹^^Óñ_ÎÉAa¤˜æ0?Ã0yºHV)êáÕLÅ`ˆ¦•ñ+²h€âÿòÀq¬#óDj¤q«r¨Ùö³Ô®y $þÅRèѬu¢;yÇ:Ä*º›Ñ'¿M½ž1u2šäqPUïÛd+½±ºÐûbí‰Ò†’ü_~逞”£Ñ;P Læ’çi"×úþæZiéµÃ‘tN[ÌgnïÕ§Ì`D¨’;?|º ÷å˜D‘ÍJC5˜‘§OåùkVT+æÍŽ;{Jˆ]<²ïlÞØcŽýT}|øãçucxy(Þê«ÇþÅÏ ÚøÖëð’ÌÖ8 t|…ïvYB•øsnZRɹæõëf ±¯}ÄÝ#!ç tÄc÷Q"7CÆdƘ†¶;µÀñÔ›·7³å­ú¾®k¦‹<ج“Q‘"Â" 6Ù†ŠçøIƒ4ß,ü Ú|8Ç)Ò.\-š}%ozeòä8Ἲy×´Ÿ‘³âÂΤEÁ§1Ì•¯pÍÑiâ’j˜’¥–>Çs6—©ÂÜ?3ô­?oœ£ú”ëg'úŸF0ç­sáºD$–ïèõÿñNÓL ÎënŽg“‹!ñš+px?4h`ãF=ä–_‚§ÞQ·4`•Ö~!áCMŠÔºÕÓöüzTʽ–²û7ý7‰bS«"¼(¡È…ñËYraÍ5,E1¾Ñäþ~¯í›¤£e<ø©C#ôm¸Jr6 3¤Ý …wZâoÎó¾èÿÐý°¿øW|ïR)˜u¾J'$x7Òc_ƒl{ÛC¨ÆÎ¦°ñ$7^´Ø.æYýôwƒ ÈÓQ]ß{Ùjò9í—¨Á)+§ãÕRtƒ¶ ¾ Lmye¾ý³¡ endstream endobj 1191 0 obj << /Length 1604 /Filter /FlateDecode >> stream xÚµXYsÛ6~÷¯Ð#Õˆ,oJÉSïNŸ:½¥Í xHBK‘*HÚ’'?¾{€2EŠì¸gH-{|{`AoæÂ?o¶rgI8«p9Ëöw.QÕvÆ/ürçi>íç÷ë»oŽ¢™ç:+wåÍÖ›¡¨u>ûhý°‡¶Ps;+~?·Ã0²~WõV‰ý^VÛ¹í'‘ï[~2ÿkýÛÝOë³2 Þhr>7+šå…‰ÏâeèxAÈ–„ÔfåRýéF®*D‰„ÐÊ‹­*ŠˆZ5ö1BY¶8^Ä¢TÑvªjÀ—e` ~t•lùí~î'V‘µµâß²âg»+øôò¬+­ìÂòÌÂMYà ûB4*ò¡ pdîY Ä³¶ª+šSjlíÔÒ =¯÷Šñ¬ãA¨!ê1 ­ÇÀñ.Ñ™tÅ?:ÇIǬ—[zz¥7zú:CŸrMÞwåØÖ¯>ñ=¼gÚGÉ…"‹²ØÕÜ_Z­âãdHÌsP5æ ¥K—µ&B ­…h}óàpf~>l|è)Ê’E´;8†˜¦Á‘¬µÑŒJ¯fu)«B(çÂV6õ§;@.ŠA,º”Xm ç4‡ƒ‹B˜ þø8©=þ‰Eù_â¿ìñÇ Zj§eÃdŽ-ŽDݘ8X&BJY4, ­Y,ÌD$Êbƒ%鳡Jnw„¶Úð2¼ T=IÕl˜6ÐGd¦ „½¢ÊMûb+5ƒhvÿ B¾!rƒB«Þ vÑ™BkMSPcç'Á f¸˜‰ŠÉ)eæ¡æx€äQ¨Ù³æ×<¡ö ‹@Ô‰Ô+Ä6‡„¾Í‘ì½Sf^ô?j.âÊ pnáÂΩ™Iݳv’ªuDz9q±Üxlã¡‘•Ð'÷„r´9r=zÐa8†Ž‡½xŸ§|ûœöŒé³ž11^mß²Ê$4¥â |Ä(ÜÒÒÇSy´¤©ÉÓW†Y ?M•áG++7Lç°+ƒTÌZë®E“BNOxaÌ&sQ4¾:ùçŽ1Ìmÿúi`άšœ÷Œú´£À(éÂÐкçõ“ óÍý70aˆ‘ïûoÀÝe8°è6ƒ C 9xÍ ¹µàúű€­½nqØíO…Ð’—SPpQoÉõzóŒ”Oþ;øùÉŸ,,c¦´15n4WdF;³/îÌûy¿3§ù³W/2€P É–¿ÅEæÆkªµú2²€Ae/ΤÓBßK¾þn2ðSßÌOï%ŽŠã3G{Ò Ž:“Žz¶þ¥§­’Óê{ ¬ÕyJ„–Q¨¾u®ßo¦÷ZÏŒºÿÓ,¸×“\¥ç=“ϰ=;.N ãµý#Éìè¨Ç ›~l¥ÙÔÎ%ÜmYW¬Ý·r%°¡=Ø”ËÏ£´†Aç↑Ä8Np7Äï2ýA Ú•¥vE¾°@^Ã'×$A@¥'@ÇŽ&8«N;‡Zk²CäZ® 2X»7Ý´†=KÐnº¯bBúy˜$…W²mÔÜÖ}C•ûáuUVp üå#}—ÒõÃáÄFL9Õœ¢«%\Ç]èÿ_¨…qÓþ•2™:u>N4%ídÙÚR7›®¢¯tÍ…¡aoè{Ó 19ÁÍgÛîÐôsíàAõŠ/‰ï±Å‰ïk±,!/±BÆ¿'aìsq´ãÌ=„ùŽ e«MjÛ¿*MÆ ÙïM‘±½.»ß±¬æTÕ$é´gbm@÷)ÑÆšH—7SF…pÁisƒ´:û>%8ŠÜàDQ]ù’‹L Û¿ {`»{åÀ‡½*¼á,vVI°Db¸rÂe4 œU´bþ”]¡Æ«™=`ûоÿFÎ,¡ endstream endobj 1074 0 obj << /Type /ObjStm /N 100 /First 1048 /Length 3567 /Filter /FlateDecode >> stream xÚí]msÛ6þî_Áo—|8âý­“éŒ;¹Ü%µ/v®I›Ì %ÁJTI*¶óëoÙ²lY¶Ú»6µ¼Ø‹€£Š'4aT‰„é@ÈDp…„J¤HèDk†„I¬0HXø`á™K³ÈŽ……§ȫ¸ÚŠC¥‹j`¶˜¤Z&œŠ@©„s(paQº6 W¡zmnDÈs wψDÐÎP 4–'‚!zjt"CÆ$Bº@ÙDh(—ã°f€+Çú@¤¤R"%É"‘”€.JÐ@ÙÀÅ•’’¢TP‘TÛè 6%@ü—HH 3Ñœ)¤tb,êŒA1'(>A´\SDŠ ¹áCR‡R@p*5¨ê z†Z·€–Œc.‡´¡«,|HéBk¡^©£Ò€KZìÆ‘Á)T´œ »r‘d6T¦±;ñ  © e•pD b¥1% ¶M (j÷“X™Æ0 ¼&è— ¨ÜZx¡×©d(Mh4Š ;P%çÙ˜¤@Jl,´ HÍPÍym Ád¸ Œ40W.5Åb`Ë\G5s-ƒRÁH JBsƒ4×õ€vÀµ“µŒÚ7ãå†òÀ ¥ ³` ì¬4(Ç ƒ½ºàF…V…¤5€\£ƒ\ƒÆm 3˜ëX¨A"‰¶ÌÀ2¹Å±$ÔkvêÆ2†H°2‚î,Gg`â`7AH‡µZd.T¬ÂžaèЇ Sk0Êì={¶GN/§>!û“IÙì‘çe5ðUò+…Ù‚~Þ#ï|¿I~…Z”ä) Å©@J…4°œÌzM¨âM>ù%Ïž%ä$!ïß½ŽOFM3­ $«/ÇÓ¦l|Z—³ªïÏÊjèÓ¼$ì(|uIêQ6€‡_‡O“܃ÿ7Ä·Õ‚”,U`Ž; l÷)mÊaô.@–br^Ö¤Ê'Ãt:8»/Î9®¦“)…éfÇ8ï¯OÎYê¨]뇴Ù!ÐÐóuS•_üz]à›ã…Y5…ÿáÝÂ^µM)úI*RôËœZ° t !½¼¯àY6l£Û[‹U°ˆ}çX·Ð+LV°\1*E¿þ;50 Ò÷Bz~~žfƒ²çÓ~9&¿MɆRC¦eÝÔý*Ÿ98«Éñ›wo·Ð)º-bèAµ©@&Bzêlü¤.«mf«Z Uš”¾{¨[t¼cÄuN ÕòTµC¨/ÊrRo£ÔÙ)§*•¸4Þ1Ò-œã)[Š£jGç¾7,Èsÿ-÷ÕqÖôGé¨÷E<‡Ø"v0ËâNè‚|ÃVìÖ, ­aE`wh U–Ozåù–»ÀÖbµ6bß9ÖÛôzEæúõ¡ ‹XÇSŠkuÅ ‰{;‘RÊ€mõUyZ&ä yÒø ?æ_/‹>€º(lÎhò.!>þ’ÀLŽëþɬ(>·L/ËIê{ [&؇æ—¸©s:ì`X›€-… 4”'ÇUÙ?ñ€9A$äÔ_4Éç«M?Ά~ÆõæË¦Æ}i¨[ÕYÇvÈ{ëyö¼¼ˆ:Ѱü4;ë8« 40rƒBkÎO8˜¶%Üœ€ýÑœå¯c¼} j“ž‚=š¿LL߉D‹Þ)Í&ý&‡‰ÖmÛ­Ý[ÌF§ÖCæ‡X&SX¹áÀ…Õ=láÓp 㬖ÍÃà,/ŠjVø‡ ΤxÌ$ê 6°k–¸š`òF©o²Sÿá•tVƒ©?L6ž)qXj<‚õŒÄ¨Ô1¾sÉ܈”;™€¡H/%Ma6°&…éÂO«lRƒ-ŒWçËoŸsnbR0Êew3J{z˜Ùïdä úQ™ûNw16Ã9¾:Ã9ºá çÂôz¥aî1çðM[u8é—8’C~væ6¤žf}OüE¿ÈÆä÷Ì ƒ^A&³qÏWu>œAYYE¦Úûl TM‘¹†J O¦ØàŸ5‘ªòáXëÆWyý…L‹YM`73ÎÈèr:ò¬-/¤.²zD¾ùª$åÄ“æ¼$ͨòžœªÉYþÕ“:¿ µÿ e|¨tŽê*Ê dóH¾®‰ÿ}–dXù Ä:Ø$ÃF²†ì“çä9 ‡ä%yEþF^“¿“7ä-ù‰‘còOòŽœSòžü‹üL>äÒ«²þß„6õ€ŒPç¹mûúyÞÏ«þlLf†u¿¬< ÈwFz¤OÚB†dDròùB 2&R’)ùT¶dF¾’srA.É·P»ŸK¬bjIR“Oz`+¾!‡3ÐÙœþÞ½¬yE ;ÆE_†<_ù´Îk2ȆCÐNü…=ñŸþ;¥•³Ð¹'ý¬å gyj¨Ž[‘¿ÄÇóÔ2ŽÀ¨½…ñ=ñѼ˜Ÿ Pµ~~ÅV6U6ðã¬úBêk@bÑr¡ˆoñùǬ…=¶pÙ åù„³ES, <éÏ*´þKr &ÕÃS” *»öÁá‘E5ýrz9—U ÎÀÒ‚á!ŒÂËhE9ÌûYórkוæ(ÊÈ8ë#°¢Aã€:`€‘׳`ÿU4öE*ëÏOÆ3CXÑt4'Ø‚Pgæ8X¥ÞìcV\Á7‡>ÁAQáxr”gQä<³^Œ’ ¨ýh¹ûÇþ’eìÇ^Ù_hg÷Èþ!yÑB:Œ…cá凋R¯#ÏëÈóz‰çõ‚ç°‘Ÿ¢¸£È~Ù–Øæ ‹RãYÑäÓâ’Åqú>}‹¾_*ú~Qæc|x:*+°/_Áî{EM²ù޳¥²Y›-ªÈ‚2˜Z5øXØÇÂ~©°_”Ê#Oyò%ž|ÁãA “(®Œìed/—ØË9Ã¢Ô ÿšcFTÂ,œÅ‚³¥‚³E‰Ëø° J¸l³;ïÑyÎ{tÞ£ó÷è¼Gç=:ïÑyÎ{tÞ£ó÷è¼Gç=:ïÑyÎ{tÞ£ó÷è¼Gç=þï¼ÇqUf0 %O^¿I^Á· £)U){ºG^àŒ 6tónòäàN¹¢† &” ú¯Ôü…Ò¿ßÛrpK¨ªiƒ¯0]}zòåÓÓyS–|zrê?$oÀ%„x¼h‡hÈIÞA¿ÀhL/}rRž5çà‰ ÎÓkòäÅA‘õ|ñïª~zÍ9^4¯N€¶GNö“³¬¨ý‚¡|?3ði0ñŠ…0[¦çé´cW´Ó†š.kÇ­Óg·i‡Q¶V=RÑÍEÑø&øQ[iÔÝ2×[ÄWÚCÂnfc\®D³áuÐ{E³-ÇëÚ6L×¶aºv¦ËxûÈ©-Ât]ê¬Ä©"¥òÊMÊñ.3éGy½lFÙ°¬²z‹[Š d-RES¼„ºk¤É• âpsѹTY"c5¬n¤»1B·SYãÇÄ*«S¼ô<‰UΤBìT( ÔŽŸ¦¦NNeêðÎd¯‰.¿úê¼Ê=–µa˜·ÅÃ^gÒ–¥†ÝÍ',M9µ÷ Ý6²¯Ë¯Ì‚mÙŠwÉÙŠ ùpÔû û Ù^Y¸Ù®»P×îȧ;òéŽ|º#ŸîÈçÏùƒ%Á¢aå&à0ÿ&Ké\JçR:—Ò¹”Î¥tƒî¼Gç=:ïÑyÎ{tÞ£ó÷è¼Gç=:ïñ¿ÁDïŽ`¢HS/¼çìZÓÒ_ëå­qÒ.ý±^] eÀ0 ï?ò#̺ÀioƒêÜ•¸¾WÀÙÐ#K)©6•pF_k³«bm „¼5Œ„.5‡Ó¥Öc6 ÎM>$[éµÚÉ×µCÝð!é:Â÷ž‹ 1£cñðŠ6i]ø ÔF « Xðj5£[vëÃn}Ø­»õa·>ìN:ïÑyÎ{tÞ£óÿÕ§ \¹»N®°ìüt?à~”¦›Ÿ?ˆõç¡Ö^ÿÐìQÏ!¬ZièÏ!”Ýà‚ƒ¾á‚ƒæÛ5ëM½ïbº9òùûˉoyG;~õ“Ö7¾°ýZ¬tø2®xÕ“øíPjÓñ‡ž²»O ÙM§…ûí‡D€˜ÍÇߟu?s[¼kŒµ5ûec5rëÛ8ø-eñîÍü¥ùŸp=„›¿-\¡"¾8ÝÒ”­y}94¡Á·—gÕp6Ææ=üÝéJ§ø ‡ÌªTI Htê4»¿ô0DzôË 8Lµ] 8©†=ìJFûÕ W Âm?{Í¿!áöÙk&! t†º›‘ •Úëw_î3n¯Ë—Ýpp1kWu©üâöÅô}e^ߺ…îk±nû:ú§´ð?É5_¸ endstream endobj 1196 0 obj << /Length 1046 /Filter /FlateDecode >> stream xÚíXMs›H½ûWpy™áË"[ºìÖîV¥R•­nN%ª¨ð¿>ÝÌ !Á`[±ã\>@õôÇëÇ›ž±˜Aá5nÇ Ü…±N®hkC¾ü÷ÏS~&8š=Ï?VWïþö<ƒQ+ 3VwýT«Ð¸%nù¾ˆÄÌt‡øïg¦ëzä_‘mO’8ÝÌLûƳmb/f_W®þZŠõ‘¨ÐsËïÃbîåþµ˜ãJd"â; kŸí¸øB=Zˆx¿‹Ðè’û¹\ü–eÊí.Òe!Ê\¢=ïÝÃ&s,æu%ŠR¤9„{Œ[ÌìÙd 劸(ÃH.dw*Ù âÛÖ÷~¬Îm–D¥Dpj•HûJã¸eè¨éÉ¦Ô Ñ™¢{¹)!Â7¶ªå½U/gL¿\­"¥ÈEO‘éÔÚ*?J”Á¹(£êm<ÆcmD½ÇŸ2_F‡ƒù»H Ѱ$lœN‰`Ð*¢tJ„¥ž!‰R¢*4®DX¬jMB(ÞñTAŠa*_r„ði9¾©ñijÌÅùù²cqê´¦§5{ÝÓú¨D¼Sýbò´f¿øq ßeùºÇµ’Gý9¤Lãb ÉK!b’á˜RµÐ+§][ªJ‹h]Ä™²ƒ8O×!úÂx=±£l’Kxˆª}Ü~µe]ùOžÚc·î§2äRréb |G†pµe G†F@„,>ì¶M}ØÊàq~ËUßAÝœ/áðžRx¼™ xìħ2éÁ^àò!™Ä·¾c/ž­˜DÃL¢ "ïá}ßÙÔé ɃØÝn°=ýöRí¹xŽ}©?­êÇ6Ïk})ÖGC­/„:8†›‡Ú<«a6Z·cõÒY}ÃY18e }‡¥U]ƒv~+­ž5<›ëîºßÐZdyþS:o+=®wÜì¾å¹ê—@„' hLI@=—ÏÊ”5sù¬M°]ƒ¯v._DR§ß²2 _ˆ'í×ÇzP[ö_Í¡7L>?˜j0Õ§¦L šž™^½¼0Йz t¦ãÝãŠ5ÊcžeŸRC_p=àmæPyƒ]4ƒãoË_~K—¡Šž8v’(áÉ)O-à.?\/Õ&qÈçÕGýýk M‹bÇóÜê~§ÿÇw7 endstream endobj 1201 0 obj << /Length 1529 /Filter /FlateDecode >> stream xÚÍYYÛ6~ß_aìKdt¥ê–µA´A¶HŠ¢ñCÝ<Ð2m³•EW¢“M}gÈ‘"{EÅ{¸(‚D4áß\L0ñáO0ÉýIE^Ï&ÅöÂ׳õzb¿ÿ|Ð>6º½?Í/¾¿I’Ià{¹Ÿ“ùªOj¾œÜ:o7l§x=u£(rÒë©ljó[-×5ÛnEµžºa–„¡æÓó_.ÞÍ»Ë`öD®pç7Ø âÌK'é,ö‚(6œ}P5Üßgyä,y)¶Bñ¥ù¹˜†3ç -Éý¢äfü÷^*NGîüÄGžáª´Õ­sIÓÉá4ÌQV½f¿˜ºIâüÉ ef”¤ï†¶¬dYJdç³ÖNmÙn§Y‡k@nyAb„ÒÇÃØaí!ü™5˜ß74+óí¤ƒq'ŒEe¾s}Iåžä7ô¢87W½Ó+©ç§Á¤7ý‡9‡ÚáÞÚ3¿V²nï7R OÓÀ¶†4¨×lÁËAMjJ;V €M“Ôak p®pê4\S½ÌÏŸ‘~²:hZÈÊàqæ…!ŽbçnC(:¼üxe¦vš*n ümwm˜Iã>33]W¤^šîü –*M}çðwi‘*Ò¦mÌõ`ÉaÕÀ®Ë!NüGrŸËÈ·U @'?r¹8ñû.Ç9º\†.‡c ‚·µ Ä±Ýå@ÜdÌëðô†!`>á?D[»¶¥Qç[šFÈÜËj€@ Á«1W8!¬éB èH{èñÇ_?¼·kòí0÷/†¹aò¯¦­g^½Âþ8–üÉD-Q'ù›ÿØ·ôÌ‚‚YS²f3Æ@ð<©™ÍÞ¬äµ:Ÿ¶Óo ᜟïþ•í~HL[qˆDgc ²1PñÏ¥¨Î(zm»¹`u-ºWsµ¯«3BOÙøPyÏ&ý'Û­& ÔJ¬¤•sòá»–¼e=eYÇû‘ád]ó&AY-MAóRÏÊﱐίº¼X÷77kÃïÙ’bÛ“ +HÂTç=,4æºÞ….¶»RÁÏ  %X)þÑ ,¯€Š¤ñפçsBµ„øv§Ú¦æÍfKæ‚í—–êá8÷{½ÐÚ2*}ðÇBËO—²r‡ê‹‚)^1*°3PS¯ŒÕÔ¸þÝpRB"Òhž×LÉØÌf¹ó¾2˜: ÔŒdØŒÀUk*׌2ÌŽ}¥ ìªè8˲g#tÕmalæøCŒ¶6K^Q{µí §Q¬¦Ð"WÖ¯ë¡[ý¸ˆŠH”¼Z« –™­LšŽ®!L°©<°Œ £ÇL²ƒ\B¨ëÉÔiG21 ¨×C'\b $œ‹¸Õò€WÄJ7üQÔÜÉæÿ šóÜ‹ƒC8è)TÈÁˆFqÝ(ZÕ]YQì!8T?<2æ…šä0ÜqIT§‘hì$˜òMI —­èÙ#ÖBgã> ·I‹É:-e7 ˬ앳²WŸ‚2!xqJÆß/úö—«Çâ1ëgaÑ Nã±W!9 ްˆSÚ9û{ W´d²ëW ö÷¦¤g1,‰ê4ÄøÍ(Péêgžè”¬Xdc}A«YñFv,ƒÙ虆)Ã_÷6Å«¥a°}›êVFuZñˆø¸2M­2Ü`HUOò¤˜<):ò¤¸ó$“!qFŽ\ðÌÀÞ÷Q5PÒÚ<ªï=Wý INö¤Øž´q;>Jdz Û+¬Rpܾ©âØ0ÚmC6à˜='öPžh á· ³È’³Ã[ï–¤9ø¼à××8ÔZ „µº©êñ‘ D–J:&pÒf"d®Û4xÒd᤭n, ƒDc×óX±5AdÀ»–²-¼LH±×†öJzÃG_oÍsB4Æ¢©y"|éð07–ž„·§%Û~ÿÔ¯.°ÛXÙ{'›¢tÛÅ(làFFmÝ)&ÀmV -ÙþŽ¡TcK÷V2’%Q¯£9,°¯Ð#•(zÂu<ÐMŒâz4U¾nÿî_Ò¤ñú endstream endobj 1205 0 obj << /Length 1724 /Filter /FlateDecode >> stream xÚíÉnÛFôž¯P] P‹åN©©›é¡(Ú*9ŒÈ¡D€"…!™8ýú¾e¸I¤£(F{ x–7óö#{fÁŸ=[Y³ÐuÍ•·œE‡gíªÝŒ'üòÌÖçppÑ;ùãúÙ÷?ûþ̶̕µ²gë¤jÏ6Æý^+©æ ×uà‡ùÂó|ãwUì”8Ò|7_8¡ï8†kÍß­}öjÝƒÝ ¹Â“çl}¶l/4ƒY°ôLÛõ˜³²RDSò½T¥|kùV·í%lØÈש”>b[Ø®iûŒLɪVyÉØª½Ô÷{$’BdÌóíÜYù ÆoêkLw Ɔác,mŒc7šÕÐ\¹î˜àÇLDç‚ß8a¦%ˆ oÏ% øMÙ'ªòÜÀ<4èpþ!­ö˜e<)ÐKŒ(ª•’y$õÝ"á‘ÔÝÃ2ª7„³£Ê#xšwá8WßÄ×Y…´¡…÷"ß5Pãž2‰œtü›}ónóN³)¶™¼ÂÂáÊE ãÐÁyTä°¬£ ÕM<à¼R"/3Qµ§Ñ*= £*"ø¸þ‰p¤sƒ¢W-^åúìU8²iüǽ áy•ë‡Ä?žͨ”`y'Q’¾§0v,¶¦ƒùQ¤Jk ðúW¬¡m’Qª aÜŽ_é¹äâÆØM…Bãù^ãùè  þòH¶(òøâ$ødÑ8yyÌÒê’DË,=¤@ýîææŠ pÃûŽä !ÕX’aadjúl±­DšSæXZ]éÀcÈq5­%<2a _åjnc ê²Þ6„σ¥Ùð†qºÞ²ÓÑ}@ª&=À\ŽU#Øà6AËt—§o-Û£… ¡÷ÃÐ@¾mlëjÀµÖ:²Z ÚŠD¥nKB×ì8-#¡b£E¯s 4æÇ'h!¼¥GBc›,hI%oéuB›­ƒàjÛ;þ ¡#å@è K X^Åéû4^Œi¹P¨}ËÂBB¡S"BÍšóÅ º½5†ºoÙaÓîH¾RpèK)¿ÈõÁ’aGUÐ4FépgËÑ2*cCD…ãò;´iš'V›2ÐÆ0¯¨¬Øæ‰É4’æOò‘>*+"‘ÉË’Ê©Ëx+j¥¼U×JÁ -™ÜcÚ à\>áŠ,Å=‰ _Ç-r©ƒÉý¢ä@Îä˜  —wkŸ` @5ôÊ·vŒ(Ó…\´5s+w%Z ܆æ, L¸5 öH…LŠ6Ò„G‘‰ÛOkNÏØ0G§½#a”'8J?èNÊÊ2òÿí-®šF9Í^p| ç®ãr韻ç!©óˆÂkD?Ã<ŸÇ*ˆ†9pVùÉcÕÔr¡ÝºÈ³Í¬I´KŒàɘé&8Õ©W˜¡ñCü„QwËDÔYÅ`Íù¶(²öV$°¿KDVÊÛÓÆãÔœ-¾R¥™Û¦“|éþ¿¸~ø×_ãú3âÚsº¸ö¬&®a¦ãšf’'ׂg]PÂä‡Q42rPkìðq—f,5œùGª¢Ó¯Ph†À‡@8]ÏófÛáÀ\$/ÐÖužÉ²œð—À3¾p¸Ž¬ã¨?FNMç­ÈlC³‘&STüIo°ƒc̶5]íˆ0/šV+ãÀqK^j¢íX—ÑàûzòsnáÙ±&¢všŽÙÇ1ÝæÉîA¶{»2u²/ŒuI:É4Z¥¬x·ŒRÙ~lÈ‘€tîšN0Ì}yQéNsg]¶Ù/ïåÔ¡gœææ»›·¶ë}ƒÿªô KZݼø²OƶÛˇÑVÿÅe_ƒ‘(«¦üñm@(bð¹ƒÈ¾äU¥Ÿ—DÞ´¤}¹“ê³`½ô*Q{}ùæþ5ÅÁk^GÚÇÁÆúDR¨Á—òŒ*uÏ¡ŸÔøKC·ÉeoiOø|ÊsÔÎy Ðj0NwiUÞ቟hzù£»É¤$¸€fƒ#¨³aÝ=88^9QG6=!¦é‰<>1×=“é•Ök4Ìõý¼³ûŒn òµRMà…ƒÖ‚!Åɉ]Ê5õ–ó3€é3 ¸A€ 9ĶXº†“:ÎîŠï±0’í ©ße4“×h“Þ©Þ¸O»»y®ÝâùV1߯õúo=þuEÓê8Ú èP‚ØbP¯E€þ´ï_w—¿½yͧïyCu•æeÀáf,”HFØ>í4º¾wôuòS¹D7¾“aQ³åéíƒÛáÛç™Õ»`1ù§²õÁuÙü:ö/û6 endstream endobj 1210 0 obj << /Length 1758 /Filter /FlateDecode >> stream xÚÕ]oÛF콿Â0L^cU§ËNч®èú5+XÓöá,Ÿ–äNIÓ_?òHɲ"'n»—¡itÇã‘<~3bàÁ?1˜yƒ8ÜY8$Ù#ÏBõz@‹¿^=Œ7Äq ó·ù£'¿GÑ@xîÌ›‰Á|Õ&5_>9/®äÖ(=AàLÎFã0Œœ÷ºXk™ei¾ý8ò}'£/ó·^Îf=R*ļ+Ö¤-–ïE®?˜LCW!IfÒL}ö"þ‹§ÈˆEàŠhÿ|x"GÀ"rNü]ò÷õÙÉ»³“ Þ]ò÷ã°¡ØU2˜¸a0#R+ÐÇÄsÔ?Uz=Š"GnT>ò§Ž!øÍȉ€Û’ Å ¿ÂÑÊT: Ǫ!抉%•Ö-*Â>„ŽÒœ¾Œ+œ¥ZÉjcz^¿*t& ™­*ÕW¡³°²‰Ð÷4ýÉ~8ó7]YJ£útAxI‘e2_>í£4ŽbwBÍÜØŸTiÎ"•*)òe‰ö)¶J@fæÙpxÊ 8àÇÀZ¦Oæ„ÏĉŒZQ_ iÅkÒ&¬2%ËJ£jÀ¢¤[€²d”+ëûDCìå|~êöw‚ ½" |Ìü a¾•ùžeX4O€§…¾ãygö‡væ/p!1‹­OX–ô]*ÅÅ}mI\[Ñpñüüâ yA]TîôYgß]@Û[«™~KG H’zI&­)ø‹¼qÁöê÷(8g‡÷”,ÔÒíó§× Ó<¦!I PK‘1H}•Ùv£Ê³C!†å‚Ki+ç ßIMåÆóé+Ä™ðÏ‚ íž¿£ïû‹9-|Ï‹‡§Ã;%LwðÚÕ«ûÿ]m<@ðäÛ½Ócžñ呌‡w´.-îãá=¢$â±­8;yqÜ6 æl2Èžº-Eüÿ±üð׉?Ç6 s›Ð™³‘¥¡;n¦»b…'†*Ë’ú†_js¯Ü>Öd,“QÐ*bˆµÒEÆTÈûïª`A½N󼩯ؕÔ-uð[ä­¤vªëqS>bµY¸Ö‡µùï©ëØ¡!&êá'KþÎù{Éçé: €óÃüØç¼ ¨fZq~ñ¸•µ…­7aâº7èÍ—mK‰›‡ÿÀy Vééz‚f¯›ð§‘í&ìûòã®@¨íp±ë‰TlÐAð°Îи&¡‡Ú1‰#ÚÑ~õÿëÜž¸ø}4 lïÐJëì²Vfp?nÚÛ¡Plw7e›Z°9SðCºtUTºä¢².î-³ýi¦›»î¤¢ûÛîÛÒ¨¬Ûu—uPuTrðÚ§/‹÷ãi7ŔʘÆG¦ruÏà‘–Df%7em§Dn6.R/RƒöÄ×¾eÔž^ÉȽ8ÇŽ;×EÊ™L–·]­“c³è‹¢`Ñ‹k¥otjÔ3û4Âu]x‚Ëh™ ø ã¤ØÁšprbg«9 ©猓~=Òà9v}X¤ð$—™"(ŽJ‘ZS‘êW ¢È•x›¨à|LäÕ í)p¯ÓqGê"Ï8°O±ÍMøOãýLÑ5f÷¼cQ¦VXÖ¶øY#0íiÓLâ’ã¶2ijV®‹ÕŠ«þ™¢;§Ô†~ØÉ®ÔøÜ¢ÐæN¬×-©[:(É Û•T4à©ß¤ »“ôÉ‹|üM¡gá®Iš°N¸µQ´M¼¦v:Üf5å4¥}ÖhOõ9˜BB Ž“ ´~€ÂÒä†n µ!šâSk™J˜oJ“&„AœÈµ¢ ÄP%†þ„às÷îþ¶Ò²!ë'\6ÈqNÉ(,¶l}»Êð77jš3Ää©–ê)ŽZþHú*ùR¨`Øëiè~»¢™×ö.Ü’gáÊ6åÓY=û!¨1nöLkŠþ¬§‡²º ÎÍÿQqP_SSô£z[¼PÖ~ÔD –;rô!iRX·{i"úƒ)cˆèíûø½Ï*7Jmû&ã=d+«R•ͰÀÙ°n½Ö)¥êœà=±³?Þ0û§õ_ªÿxÉé¥ endstream endobj 1216 0 obj << /Length 1768 /Filter /FlateDecode >> stream xÚÅXYoÛF~÷¯Ð#•X ——¨.M—­>8yX‘+iŠTyX¶›þ÷α¤(™ë (Ò€¹;»;;Ç7³3þÄdáMæAà.Âd’n/<¢Vë ~ýáB˜}3Ø8ì|{ñæCM„ç.¼…˜Ü®†¬n³És³‘»FUÓYNüv: ÃÈùX•ëJn·ºXOgþ<ò}'ð§Ÿo¾øþ¶¿ ¨gJ…;Ÿ‹ÅáÜ'qº"Y²ûRg,V[çJí>y‘§‹I¡³ÕiUÖ*-‹¬†ª!Ë™\1ÇlkU3ÏUY1§f£˜²Ö÷S?qTÁô'íÿ/Á°`ŒT®ø;áÊܤÓ̸qœê´4!¼0ÒW%É‘µi§„4¼X>µcÉ˂ɽf b]抄žžçúщ`ïã"vtÁß›77c*Ý9¯_I{ç\r„Wmw¹Ne£2fÔLý¹ó¸C9Ê\²ÎÈ2?2Á(À¹\Vê^Xìu³†/xÜ©L­F¥¢ àhëá¶Fˆ*äNg1ØîÃ4  Ygfl–ÃcÿÔ,RuydûÐÉu¡Æî‡@‘›,æ|˜H‰œm›7z'Agš^ó wŸ¯Ædí…ðÛë<70•_ÐÊbÜÑ_8nÃh!:3éÉ$õG qÛrE!ÓØ. VüÐEÙüƒø<¹iî4L·Yx6f—-›žXýl÷ÈCÁR†¡ïl˺aÒNV Óê6EËlÌÖaDð™kÉÀ º6TžBôâ “œ´6çñÂù±DÚžîÉɆaœ8ÚÜ̬„S¡ñ* (œí7`Àç8fµ2•æ²âÌ¿ ÏãgÕi£1³àl¿ÄÇÃJ5meÈ'ð@ `eƒù¯Vf'YêABéΛ­¿©Á¹Ø>îÈ À”ãÒ;ŽHzìíoçá­<…Ñ.ùËP Q…¯ýI4!Üô8´KrxºÞèUƒW¤ÈæUJ¾‘¸¾:hÔU[#ìþ³Ö‰R?­0“õzÃ#™ädúÈ3Êìð-¼gêè J@kªVñ¨ƒŽ·’ž,ûç^ ®,çTYf¼N53Û˜]ˆ2ìõÌÁ”7/Üœ)LVa |­O+ÖmWêæ/Ô-Тì,ÙæØ@6,ñ…F§««1ŒÀus¸ …:×ER\áùw`]×ÂKÌ3Y¥† Oš®›CäÍ_*½ã¾ÀõãükÈãn;#Æ Ž^Ìf¸ng²ªÊ­ý ,Ö¹6#ŸþÒÂDÌÄ·½Æ!€s])UcFu*{Îâ°œ–mg°4gœRy÷e¯±(ÂôÊv{ØÝNþîÚT½Vµ83 ¸BÌûÐ+ êìf#™¬† rÿDµô8<¬iÀv.ÌÖaœìŸ‹ý_Š.tÉŠÌ“×%êkŸêÕãI£•A}kjDê¸ÖÉßþϺò², ¹—ô\«ü¡ ZùžÑV,Ž´…iJµ™ ²X 3.AøP›«77¿3´°gÏ‘M&¢nÎÐY˜ÓÙ£ý£ÕxǪÒ}hŸ î '9êq°“Yx¤T™H[ê:LYH•–¶“NŒ‡:.Q¶!þäp+‹'açaK5tηŸC³Éºn·‡Ÿ ^xQ¿>ù³ôëõ×'ŸñLa<æ=ôÎÛþ×–A8…¤˜_‰¾QÞ肱k»»õ'ñO zJ€š(<©¢Fêðl«óg=Ó* YSea~¨²€NU|û*+LB,¯  R¼:›=½qÒ[y¹ËxÝÔWQßß&ºà/zîy^ÿ—e‘I˜Òü†:,û˜Òõ7‡®¿©yí…"vö ÍïMUšVŒ3RizØú[ÔjïþÃ,~Ùý0þ7H~7 endstream endobj 1223 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./join.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1224 0 R /BBox [0 0 300 58.01] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1225 0 R >>>> /Length 265 /Filter /FlateDecode >> stream xœm‘1nÃ0 Ewž‚(+’"Ež @·ÖGðP ˆ†¢C®_8HlG64ÿëƒÄúÅBŒe9{îðþÕðû˜•4oÀøŒ?P¨f”ÚðÌFæŽ&JÕ;¼I{ *kC.Af†æäɵeÍUÏfÔ4Vç \jRÙ2O­R(ÓWýÜ:KÕ¶Ÿ‘$¾wÒ E¢”J–9CÈÕ•DW¹¤»*ÙŒ¶‰"ì»"Ôr·P 'ÙVL’O½mœ@ Þ œ’ëhöƒ³¤FÂý„ù#Õ~pî©t?a?è÷“ÿ˜`DÞÎ’záÜ_åý}ßO¾b‚v?8Kêþö—¶ endstream endobj 1228 0 obj << /Length 1183 /Filter /FlateDecode >> stream xÚ¥VK“Û6 ¾ï¯Ð©#g-…Ôö¶õ!Ù¾ÒSÛñLŠ´DÛœ‘(—’²‰3ùï ʶ֒7IÇ3– €ï#êøQ'!Î< ý$Z8YyGŒTí|ùû·;jõbg¶ˆ|F›ÍŒcW.å£PYÁß“˜þ¨§ÔÁÀ£¡OcÔ?°foTªäÀ„BA6ŧ⬰oW&w§ÃâÀŠo…Dl0ô«£á…È„uy^?Ò— ½e¯vßMUÙÈs¡xÖˆJ.ÿy9çT9—xæ4@ïo$R……8Ô\DnƬttY¸?rÅ&ðõ$QéIèzè…fo5TÕ6Br»y¤¿í¹˜vã—àeW’Nt¨ÏFH©ÅÏJ©xÓ*‰æõ^l½«Æ’¾ª3fJGØÔ8~ÕJÑd¦ – =‡èïËP™»LC[`[IŲ›ÕÍ*Y7ªÍž÷VSóI0w9·vºNõP‘S³Ì†¢JÍÖLæãv›1»±þTMº}L;Ï’Í5Ê%œ¦ÍùÒ8Èù–µE£þUÁå®ÙkŸiˆF‰þ Õ^ÔP¸HþQo  D®(ж־¹]EÃJkÎHª- XQ à=¡Ñ‡‰ v­˜P7·_¡„Z)ë0uÖÖÚè HH|ê6íõÈ‹±žZwˆ\IW“>+ÖS`O¶³lJ¦h ¡5/7@äÆ(Kßò£è\g­ú`øT¯§¡v–…Aøp g[ÑZ ¸!!Sr£a •®mƒ[JþtÆ?¥d}² f~H¬Í1%ë¥vM¦”X×è ¥¸Ÿ¶´òåtñ<–K¿ÛJi¥‹nZ¶ü´ÄgbÅ÷÷òÔ_†ZÉ1•ë%üyáú^{ú¥8u‹Ë ÎÇã°Ô‰ú¾ÎÊó<ÄÃÃçöð嘆ë¡Zþ ´~´ÖêñI}6¦>•c:G÷ °Eýd¸îÐÛŸÌqîÿt_@9·¨,{Çíʶ2}ôxRÐSÅ¿§q°p‚ ò“Y¢Ç…×ïJ ûÏÕÝ_C æþÌ HàÏç nð;W–žLYÖ×UiEpX·mïÛVšû±F%½ãw³¯G‰øÁürBÑçfƒ ™c7ÚpbrÛsb8ñö‰Ý^¤îm©ÿm‹W¸`ºM¬›LL4¬“ÛgÖn„¹¬ð³æ»’gÙ"Âæȳá6v‡Á6ïúÀL¹ï¶ßjÙe9@ÃìSãδ›„ÅŸsCÍJ‹+ë/E#Õ mµà)+#鵄"ŒÜpÑxêžuˆ]ÿû_Ü 3,m¶ ÎL¶ ÙËV{€«@âëÉÉ øÁÃ8üQ˜ŒÃ?jÙK×—]Q 󦱧I‡=ht©ëh¯¯¿Ž¡&Â(Œ‡³ëÑß*Ž×æ^4lý~\qº¼1˜ÁxÇÇg3ÃExîWãn7|@áí!Ãlü®ÿ즋 endstream endobj 1235 0 obj << /Length 1582 /Filter /FlateDecode >> stream xÚ½YIÛ6¾Ï¯ðQFF®Ê’›å¢-ÒK‹bnÓ™c%G¢3h~}ßB-Öˆ–<3)„4ùôø–ï-äø þù‹·ˆÃpµÉ";Üx´Zí<ùû÷ßй@èö(?ÞÝüô[-|oµñ6þâî¡Ïên»¸w~Ù§G-«¥†¡³þyé 9Uå®JUì–nGAà„bùùî›_ïÚÃ`u¦THùT¬u_,_Ä«õbˆ• –ìKYæ,V­«Tíöú/òŽ©ÞãªpŽ·¼« m&°ï¿E1‡JGÈÜõÕ1ïJêSUÔ†öL’{WxkGW'9Ɖwá$?\2á^ò¤–»ÃÒõY,ƒÄѼX>ðHR[;ÚOúöO©‘ç#þ'?í%mm¥¯²óM‹í 6ž1šÏVSoüqŽdýšÝbœEFX1u76«8X]}T2“ª–Ÿ£‹'<ìÏp1ew1žd\L„èbÎêE’mÊ6=ížoªcªL°K@þDHèù!ñéÁ¤ÈÐ(&Õ$û7ËUç‹$6¶_R0ÒÊj«ŠTKóEc;œ‘“Mеs0(¶«Ëb§÷d.†îrÂõ‚: ”[{rQ°r8ÉXüžr¸ŠÊá8«Äi\"sæ©Èe]_úš†wãÂ-)ЪSóq¯2D"B ò}–Öiq·Åžg5&Ñðad›É-QÊ–²s×üÑæxŽnÄžµ‰Yߪw­Vƒ#/ÛK|}_5š+™æW„³ñçÝž['m&„“Ì`õi8â*"GC¶Ð'\ƒ]ƒ˜›ãE w&€Ž ò²¬PQm3ë˜XªÆÃZxn¶ú$@ ¬*YYébé;[ênpK—KbÆ© iO_>´VsUHžShŠ$vKy€•{[¬Á´Ê`Œµšˆ%-tÍüˆpûò»jÖ2$>2Õ7ô¬?#f¼DÝI¦B¤+R¶$¼´M°ÐÉáˆÊ“®»wè'Ó A ¤ÅÎLï½ÛÑç¥cTF`ÑÌj ŒPšEU›ÅJnO™Üòƒ©"§¼´µEb^B¡ó »žAÄI…fP!l… ¶må¶H¥@˜òÉÜ 5Ò(ó†VRSÉ>®4i na»“è ãðd±5$ªéU1¹”ö^éx¡^^•涪šjYny£]¨Õ®xﲦSjªCš«ïÐÿ{¹—·:AìÑi|Ô;>dzæ 9·‚âÎgO ÐSfZ•ÿDÓšç)h.‡ø ó.ކØó9¼ËÍwæ .ã¶1pbˆKŽ@Ä6@⇩f™I,-Ë[º2:êÁ~~gä<\0òZ´J‚IßÂÀ’ Øß‡Lµ+-Ð3âŠo¼Ÿ.€Ÿh•°wE€$Ó¢ §f«é÷»‚Y¶ÑÀ:˜¢¹'4­Ä+ÆW¯‰0Ö]ºÚPº2ŽºÆÂk:˜ôƒ?Éýý>‚y¡lj–õz…»¶òfÏŽx’Þ¼±¦ÅÜÖGð1ÕÆˆ`^M¡½{yÊäÍ6]f›ÌNëd;a."DÈ­ ®™ÖeD¿‰F†PâÎÒ0¦k1Wä³ç¤ˆÖu,!ʇ­JÒ´*ˆPnU®Uy9èg< !Üãs;ÒÿOJÏÅf%t¾>OÎS¡èªÐœÐã2h³ÞŒg-óá×ÙÊ=1yše2^%¿âcoW£a¡¾TCBßokH}Ék!«´ÉVÂd«¨#QEVò;(n_JQ‘=E “¢¢«žÛìõ5Šk}‰¸¦¾FAg‘˜J†“”š¾}p•žkúdm™¥ƒÉ>>ô…n²±Õó»Ñ+®CLð¼¼Æ^Àþó®êgÁÝj;ç¹ÖMê´?H†—$S=ät^1íeáeÎ>UºU§úÇ[‘ÎHš«1!•¡2€¦Û³<ß}ù‹ï¨{ï(?ÊÀ½%èÂÊBWeþzoÄã&æ“8UûŽÕs–)§š²ÿÓx¯‰P‰iÀŽù›éJ;+x½l.½YéÆiäžuuç £”O·ƒ,‹üw€8 endstream endobj 1240 0 obj << /Length 1688 /Filter /FlateDecode >> stream xÚµYKÛ6¾ï¯0z’Ûõ²ÜG-š"E ÅÞ69Ðm ‘%/%'ÈþúÎp†’l‹^ÛI ¢9ä çã<¹bäÃ?1Zø£yÎQ:Zí|3«7#üûçƒàuSX8í­üíñáÇ·q<þlá/ÄèqÝgõ˜ž¼ß·rß(=ž†aè%?§Q{ÿèj£ån——›ñ4˜ÇAà…ñøãã_<¶Â`öÊSáÊóc%ýc‰h>KFIÍDÑÉö2çcí«ºYUe£«âƒû{Ùl‘yû -Ȉ ÐÅÏxÒS½cä?áLÄÄ^«æ Ëš÷msD}=’7†ÊäC%õª¦SÅUku¤Ë¯8Å“"y{Yž™rsi¹x³¡SÖ1%áÍj%‹0—@T|ªU“F¬Ô~ŒlÚ"ÛbÞC6ºÙ‘–ÌW¡]ÿOÈvpI½*T¹i¶'¸Þ…bº`a@\iŒ¼3>ÔÆ]a´"û©t4ÊÃNáÕ(™ŠðM;žû\­Ì¢/ymÅ䥒̰2xÓöeuXæ+ÒuuПÑ+”½pkÉFï{\A«½Vµ¢«¯__  ßä;õšM¿¿'.Ì}n..)Ë~¶%<Ùà&×}Œ£)cmÇ䣧ŽB1B£$ÆÑq†I‰W›t饯Ï:Ó32ë›aÏþ.zy*™d‚¬ór:ʘåÂX–NÎÖT(ÍÆºPX½`j+ë–(UIó&UâL¤¹³nÞ‹[ VšØMýÎ×VlÎ(Å$M  ü¦úççÛ3¡VÅ5™°¸#IÀf…´uAà/iÆ u8ù# /µ¼A‡^ÌÆ™µ–tIþ ›?Þ)~ó†•h3ÀÍõ3œìªðZ܃Bv¸ LÎú $¤‘æFV¹†²9’2?E–¼‚4ìq!\B&îGz—gCHsSÒë2æmÿV~cùjëß­,ÖmKh(9xrSÓøv0Hm4¬ÏJ×ê;a!msÔ²?pYƒ?–ÒDÝO&½HÙì¸ïfMëÒ˨Ký½œ0ºvby‘m‰¢…L³Î¼4—GXGU$Ž^ëïa§t1M)›]Çe麄i]Ý»õ%ùFÆ›ñ%>“¡\»UmqÖåшí?ìè¾x‘lTÚ&ÁZeß×Tz­áÄʲ3÷K`‹hD:eÿBä;x ±@p {ßl/¸©eí,(Í—ÑàÆŠ˜^ÇÊ¿îÆz€ˆìkBh›@œsb´Û B0Üx‘¸ 7¥X¼ßÐgé.Ê€8:²Õ”c5+tnáßn¸½íécÉpïªq53Vàó™õ®//¿NÅõõ›¾8qÚgL„sß³{ßVbfmŸüiØT@—Íêdçaƒnf‹„ 슴_ÒGSK®P°(­%îùê|Ø]G„ã?‰g#eÎý½àÊ ÀujZ× Äþ@+ê…hëù> “"ý7P$Ø:ã¬cA~p)Ýš•aüÍN×½!ñùÂûŠÏÏ;}Þ ºçàúçk[½H,¼5öIæñ¨v½ö™Œ„­¡g*Qp^'ã=ÜE*|[4´%ÚÛW“ž0ŦÒy³ÝÑžÌÞr½Ò9¿­eD¢ÂøôâörcÒ\ì‰pþÚËuì=Ú¤ø·jäÛªl–Uõi(„ó7deÞƒ±îö‡êv8fEEZ>SÙä4`»SÙ ™U”æ)ƾ'—uU®„”Ö¦}Å¢ÈÚoŽO"ˆ._¶6\L`„râ8¤îåëW˜~!@ý‹,­N;¬^çÞ64¨=Äý¼ۙуâ;ÓF¶ó¤š¸¦aVQWZV MÙß­"mcÒ%}ø' 9k3}2 s¿¼ú3ûǵÿE| endstream endobj 1244 0 obj << /Length 1653 /Filter /FlateDecode >> stream xÚåYKoã6¾çWøV°\Q[Þ¶—m-²‹Ü¼ªØ´MT–Šê&)úß;ÒVlÑ œmQ´X`Is†Ãá7O*bÁ?1˜Eƒi’Œgi>Xl¯"ZÕëO>üx%,_Œa‡óÛ›«/ȲˆÆ³h&7«®¨›å`|·)vFêa˜$I0y7 Ó4 ®u½ÖÅv«ªõ0Œ§YÉdx{óÓÕ÷7ûÃ`õ•Z!ç©Z“®Z"Ž'ƒIžŽE’²fZåüv~˪© ´l䨺j>FY´+ÌIi°1‹[I‚ûSP¯¬Ú§§oBÅWx‘cX2<>ÉXd|úiZ]Á晊²ä žÛV¥lþm6RKœÆAÁŠ~ŒDZ)#ËG^ÙÕ0΃G<ÜñàÂáBVšÚ‚ Xáõ Y-Ázá%{ƒgÎÃ8σ]ßå4 Šjéßwfèƒ,M­\™¤uAWchLË ;íq S˜#JY­ÑX8™„Ø6RòÚO¹õ°¦TDÁtŠˆŽ‡ádš7»º¨·ân(‚Öä.Hl!äØáÔ«Zqã…dj;:iÅ]S—­±¿¤Ö°§«ëÔX‘ …¶Gaèsw M/æè蓽°Ö¡k–jõ‚âúš‡è¬H¼ nÛ Ôn£*iƒGƒö  5î;+´ñ1Ï’¤ž¯Nù°+ÕBªJ3½8K»¡Üãÿ©Àö˜9|q¤OаÎápgt\œã[ »d‹çèãºn×›¡•\[ý¿"…_o‚AâoŸ âi° ¦¢CºÉ“ã^Ä÷ ä.ô¶Q€2‹À}Ðê™”·ì¦u[èÂntD ‘j ¥/ücQk³ç8Íh…ÏbNI&:é—9}д'cÀêÙŒôó#›N¼7c€N.c¤¯È ’à‘Û"ì³É³4áŽ)•œýòl‚áâÉ"‡‚þ@.}>à…“¶Ç ”L8äqrª¸Jgó”jŒþÀ$ª§p‰“¤¢?àä÷!U£…Uƒã‘™8{ŽzîiÍÃ(ò0>3è¾Ôýt Rˆ%2AÚ›-‘lMr¦¤%¿ ˆÚoÀ& ©TÑa²©µz‚³ ¶MQòá4¤ÏXdNX ^Ñèiüøym}wŸ9.€;wÈo<š5ü‰ØâèZ1œÇ<,<` ´Òš—;eŒä?m'þé·Qû.ðu@‚å¡àÅ•iö¸¨­K{;ælGj&*Ûz=3$É#mqÛç’}6Š7”¶²\`²âái2ñ¢ÍЇ…Íb×e¹Æ²Û³î ñ1ë£ò¤ŶKÀ‰bÛuKáÞmÉ<ùöÊöwâŸ÷#ÔÕ›G·oOQˆ]_ÇO üoòCSŠ‘TäÝÁå…s/ÈÄJx{ {_b¥ÒDûœž{x³—£Äß #>o7Ž+×5Ø{±E\µ¾?­Þ[‹Vv£ã‘sç®åÉ{û¬|rìÜ´Æ:[÷7iº ÙÁ6O0käz+9Œš—;¨ë0|ïyÀíϘ À Ãû×>Ú¹±ÚØÖ•µI‘ß´ç”åÈ ?äVàÎæqä&oæZ:«Ä¢}1÷ýV©•´îÁ΋Õ%¾‘D3 L¬hû•—ÐÆDò?‡ic¿õÄþÙ¶ª cü„ƒqiç+þÖi•ðʯúÁ%8¢Ù©OŸö޵çO„÷Í0q k<‰é–ÿå d¿$úl‡#Ñíl ýj±KxÆìˆ+–VÕ<ö7¬ÊÕËÐô~´©Ûj‰î¹*8˾øl×v‰gªáÒ{£–RÓHø¯Sï¸+à¿v|à ËçN9Ö}ø/cdã,µã‡ýRæb§Ðõ„§Y×þ¬:²Ü‘#r=Šàëò[LþôŽü±ƒȺuùÎ_R*ŽS¶O3PŽû`Y¸ž­&4—mYå0¯Ýâÿq›íê•ë ž·2Íùh¥tc^›”^ß=ÈûZÆ ?8äÂd–Ú¯9=Íi1âyOcö_júÔƒB7…ñ‹u7s>òÈÿ/1  ®½qdœ?躴ª;eÇë?KS\×á- û¨ß]õv eqìþôø+àÊ endstream endobj 1254 0 obj << /Length 2092 /Filter /FlateDecode >> stream xÚ­YKã6¾Ï¯ðQ Ø^ëeÙ rÈI° $ìömvj‰¶¹#‹ŠÊLϯO½(˶Øãy Å*²ê«b±ÏVð϶«Y‘¦Ëm¶™UÇW+µû7þóû«Xè@¸QþóñÕ?~ËóY¼ZnWÛxö¸³z¬go¢_åÉ)û°HÓ4Zÿð°È²RÌgrQ™5b=™àÔ´|˜üC¹òµé/”;DÅô>€¾2ÇcÙÖË)Ž Ñt±Ü¦)oël£§^7uõ\5h¨Õr¹cÁ›·bÐûMøxÐ tEV¹Þ¶Ò!-$ë\äâP×[kú¶õ1ªa¶ôK÷Ú´Ü~‚Ï&BBUûxæ¶,h4* 9 nI }ÀfÊ*†ü+Žh[jU¦í¨‹TóÌúÅ.h&íGñÝœÛ;Ó4†¤ Óbóœ6_Dê@øøKÃQ½`Øg,w"âl¶oÇDâ1¡%ì@œ¹rí{ ‡8~»ÃCƒ™'Û"BÎÚ¹¹˜Ö9sDöL·3öbeá!Cg,0b`R†Pÿ™ˆ@aÙ¤2ivRkÑýî3¨ªüøTåøžgŽœ­ÞƒsgN¬'œÚ{³lpéK=†DO8â£PXOÄô+õ$Ò­c)น¶?>)º6ü±?}ÚR™t‹âÀÙ&Ð'/îøŸ5,® ´ŒW¢KéŠ_€P‚MYÕ”IÀù…¿¹ƒ«É _¦¤\ņO!K,ŠUqøfIìÕô±qƒ4RŸ(@™NŸwKÓ;þ:Ïõ„— ;ª­´…ÀÓMëNo–y·ÌEbÝpL>e¨•ˆ[5†ö\aÿÝÝ!Î7YD7†U`#`B1µ%äÛ,ú×.dXØQºdF+tAhÁ¥`†ÌSì‚Р=„^G»C­I"ä‹7ÛN·p»Mð¿Â:N ÷tœ!=»¿‘û€¯î IGSÚ½êÄYµ,Ô¼1µ'”¨¢%±W©»Ó‰'cÏL§ ù¸xvéýÞÝ!ÅãH¦›Æö”~Ä_6ãmäl¯¸¥CæÔ]ì `I`QkU'¾ÙÖ^„áoÙŠ (ÚØ")ƒq'=$¯¸¨ZLâÜžƒs0¿Õyí|Û}5¶O§kõÙ<—™k#ýTAÚ¦Z_¤§,؈<¦ˆ4 >}`BFöæZÕAΟÂlÅïQ)…Û|¯èÆ$”G"TÕ{Oµ»ØOásÖ[K_&°ÙªXls„ÅwŒÜ;ØöÑv:¼Átx…©² EüÍ• MÃí®&„¼„¼‰¸Ô)‰9oX.}ëaTîe2K6÷ÂvH^F­Ï{Þ'ÔÞÚl•DqÈ _ ðµ§#ó&/¤4æÚ9«+×<3x±P*ux“ “0» ¨$•äæbl,ÀIò—€“|&dÑú/عÂK–‚œd¼Ì²M´Y6ÂiLîÓ˜ül…$É °ôý¨?›ƒ[ŠJÍ÷ÿ—¦Ô‚fx¯…Ÿ€«P0ËàuP“¤/¼è\ßÕ•Ù&¥[”¾öI;[Úgî^%Ä46ü&¢4-æO —4d0­²¥“±ñ‚_zé„ó;PÆÈQÎ)×èå…›7 wÃÞ1VdøÙ>ЦÙm4M¿:šŽK: YóNáÈ¥Ý÷×v?}›ÁÓx-z‚†ˆVim)· SKq0‹EÿVVŸ\(q[K©§ojfèƒUS ‡ÆjKe~îG;úüÛk6Ö=¸ gàíwzLÇq¾L. ¸ïÿÓ¯Îužs~šã“’XÓp%«æ±ªÂȇÍîÔw©C4ìQbãéD*t­¡Ö”4婘T."K9f~íÊct‘Ãmô(wË `ô$UÚqUG·ð -ýIIÍHªBü¶Ô¾ï¥¶¤»P¡§ˆÚ¾iFV¾RýX †Ÿ«–(Y¾}GÙý¤ôÍEeªàÒ›GÎô§Ñ抳™®a„XÑâW%ƒ¦a¥šÓrX/óLÊ'?#ÑZr¦ÚñP§wÜá€T0ÏÁÍ ¥>Vêä|¦JYåEÚºÆá©w¥Óœî®¯ÛõêÑÀ™8!>>> /Length 1387 /Filter /FlateDecode >> stream xœuW=Ž4» Ìç¼€iñŸ<g~/4­†;0øú¥Þížô6§¤–Èb©ô_Z,´ð÷ùü8þ­è_ÿ{ýÿ!ôׇп‹þò “d‰¤ãaÅ™KÉ$¸z(Ûê$牢V"㌤‡¬àÔ!e %Ñf[˜sq”“ÄâN#[Å¥†e\æd˹µI&ÙsÈÖâ6%•æ#à•¡®,+H{xÙ¦s¶|ÆsÏ­µö*?øz¶“Æp+™›%©'¯q²ð½|µÅÞÕÜ@ˆru/ai,N¹RÉU9:IJvb>îÁ³’ěǜ<{Ï-ê<)ä³8$I–°î‡WUsaîÀªB)’Í”"šÝ‡¬Y*°¨¨æ'5ÎA¹0‘'”šl5$AŒdQ!ÁFb(«ö`WŽð¢g[ˆsžÓ—:׉û$•;‡IÆ^q¥²: R¬oT£¸B:Æ#Ô²XËÈJ¸ÚK)y¬O|‡n@X±‹ShJ©ÁjM=½ X"¬{#Ã&FÕ‹SŠÆÛÚ{Ól2yYÐHórduª¸¬iÆšIEñId™ñäó”-á´Ä,–yÎ (Ù¼|BD×<!²ÿy.R$‡Û^¶! µ<÷)*Á™Ï<ˆZqåK¦D­÷•JÑ,ñ3Ñbè²y©„˜û³Tbn,ö,¥XVø]l±Ylßt‹¾é"îÂ'—Ä3Üý$šxQb {¿PUœ£¿¸,{‚/ªKvþÒ 3çNÏv‘Tå¥Ïv’ôÀ'¿N2“+ž-) 9˜Ï– µ_šZÊœ¿ºž¤¢XãÔl®åzQ ée¼üÔd³5 [w£öañe0ÚóÔ.|£Ç1'´­ÂIFŠW½ªßØ 2[¡|«Ÿò§~nnMÇ‹¼þþ°µ"þÛE­_^þóøýqçãê*ÈÇ-ÔU„[d£.Â{Ü"@]Õö¸E€º*ìq‹lÔEU[¨«”·P/òy¼¾ìß.jyÜ"@]ò¸Ev].ºxÜ"uÑÂãêªÇ-²k|ѼãÙ¨Ÿ:w\'æ§´·ÈF]ôì¸E6ê¢bÇ-r¢~J×q‹lÔ·\¯/Ÿ ÿ¡NÇ-r¢~JÒq‹lÔE†Ž[d£.ÒsÜ"'ê§à·ÈF]Dæ¸E6ê",Ç-r¢^ÄäøùŠßÿN6 ßún¤›êÐgOù…ïóÑ­ñ»ÝÍXeHaÖä¾oæô}Sµ}ÖØÞË{Û‡,àœÚˆ,F}Ÿïm_Oã,ì΢ó¤TŠ:OÞw¾¯8´H•=!9K8 g#«j]}ßÙ­؈Pv°gá°«~çûÖls,º8l¨ žäâQ}ãûzå>r‘pø7è—¹“eq‰¼s~:<í.;ãÆÖFiÂaòÎùA ¢¨*¶ž(^ZÔ»Ýü­ó[›O¸‚Í{;ͦE½u~ R’¬5øED*…3#ïÎoeqc¨aÀ*"'TÛN¼s~šÂ3„²Œ‰Â® ‹#îÖOºC2 ^qÐÇ ðàý÷Ka8·3Åbh ,6´Õï—Š5iqMÂë­à(úÌ£fÞÌHOšÜ x§¼Ô¾.¼1n䯫Á¢¨#—Í’hŒ7Ö¯ë·`àS„ þ{Å[ßWKÍ&ŸÌÖ.Ù½þÎ÷áfcO늠\Ò¤H î¨ïœn ¤ùéðÛ~Z±v,þóËbÑÓ·%Šú’ɶñ¿ð}èi¿€Hܾ¶ø9|ïÕ÷ýíñf¹ Ä endstream endobj 1261 0 obj << /Length 844 /Filter /FlateDecode >> stream xÚ½UMo›@½ûWpĉ!,_ÆI¹ôSí©­,õдÒ6f% –ØI•ÿÞf1&RNUäììð˜y3ûfa†ÌX9ÆÒóì•ÉvætÞzcñýÓŒiœ@k€|»ž]} ƒ9öÊY1c}7 µNŸæ»ŒWJÔsËó<3¼ž[¾˜_ërSóíV›¹å.×5½hþkýeöaÝ'ï+Y!òœV8¤Åü¥á<‘OÌjÁó9¼˜[±— /nÀ9:÷°edþ­…jë‚6ˆbV´ÿí"àBì+ôXøÏ×NüÝ^¤:;(°¹ÆÇ3‹ýYڮ럩y3Ùç×Ê”9#ž T'Œ7V7×r!§6©ãU1‘ŸÁ¨˜º-šÓ¶å`0<fr}]*¹ 2w™€qi^Ѧ•ÿÒ¥*®Î»4®þØ´³øNÐõÀwBó¾å0J&äÖõû.ÈP#;q!TZe­÷4¯«7m¥Ñ%íÌyÆZǧRÇNÊJŠ”|¼à "³É»C‰êTà½ô%|ò8Ž†Ý¿8(|Ýxpy^bü]÷%ô߬aòdS‚€Ç?oý VJè®@ðˆ=‡©~¬áe‘Ê™¶xÍv¨\lQ_ºw:’Ç•O\Jzæ¼`UF·lx¢0*3óGrÔï­® ÜR#À@®Ý»¸Dðeþë@‰-T’Ø'¢Ò™@®dHȼ—&´¶€Ü’<&¹hú‰<Ó÷M­†˜âº^¯×ë?ä/I endstream endobj 1267 0 obj << /Length 1519 /Filter /FlateDecode >> stream xÚ½ËnëDt߯ÈÒµñøºº @ $d×{Ž=qFr<ÁvZÊÿÎ9sÆ$3iK{Q™9sÞo—-|øc‹•¿HÃÐ[EÙ¢Øßø ÚV :üþã Óx. º3Ìo×7_ÿÇ æ{+ÅëíœÕº\Ü;ßíòCÏÛ¥†¡“|³t£(v~keÕæû½hª¥¤q8ájùiýóÍ÷ëQ@_¨b^ª•ÌÕbQê%‹$‹<F¤™hzÒªó~ìWGQrENwv‡Û#—…‹‰Í‡&¯e%1륦:¯¸‚y¿#ìÊ1‰¹w<—ľ…ñ™5oª~÷¿2‰zWS6RÖĬx*jQÌD$à9SØ«m¹õ6[tvr¡“þ !Dça¹¥·1xý—1n”=³íTtD¢ßfìhYè´ü·Ýª'ƒy™o7ÞfÂ^<7Î"ç§­ee¤TOBkDCç¼)õ¡î¤~–Í2Èœ>&È‘'´ª3;ˆeÞ>!N¬˜r Í*sF&K´ÀØù賨ízºt²~@þ¼¤{/ 9§+úA³éw¼! øI‘€¯JðAâûW|Û} TšÛB¦4u‹²É3pÞ,™sà§.HÞЯ ÞBÐ'Ê1sdS?lÑÀhÒMJ4ú½3:{î´$å\¼meË 0y(¯1K`H‡Ôˆ°òáÐHú=S?Ѫt¨šh­:”’œGˆJfsÔ­¼‹sjn®$x®ó"ÿšîtÿ‰èJÑþqà…Ø Þ>צÄ+êx½Ãü ² Œëm£.+ÔaÔñ”·mŽf=ÑUn f Áú™¥m™N ėǾ’# à¨3¯]“Ëùž;Ä _µ 82*j<ˆ¦zIÛÄ“O"O‰œ9l"‡ò¢R£vJ¶B`C„'n²5áðîßú¶fvZBåj¹Ò@}pºœ .IC|Ù’lé¬sÐy5yR1uòš» ÙºPê2ë‘é£JÝ¥ ê5Ä‹`%ïlÌc(w óDEÉ@weñÕ; ò¡T ûVÖ_¤\°ÝDq@ñÀÕbãJ<Ô³Ùeød¾ªx¤öxDqh‹’[âA¶0¨Ç]Þ‘ü¯Ì†rÕw¨çnž”h¨g/8¬ÅETR÷iìËÌðñ‘«ŽŽˆÔ£¸æŠ !tVæ¦ÁçC˜ƒP/ðÃ0œ·cíõ‚z6 ²,tÔ{D•P熟)Ò=i,Èsj@ïá÷s~Å™ô(:®å©i ¸|è ×àÀYŸU¹ÙQÒ†¿tIïyÓAok@/¡gÐw©ŒùIX4ͼ¨:IX<ˆ&èy³%èV¶gD'Í_0$ø{¥¸®ºÖ‹µ£/« +,ŽWÏv<ıTXœøö StöFç2ɱFÛfSŠQqeÁ;.“F»¤£ô þ¢×žï´‰a®w\\TêH-¨ÀÆÃfÍ‹Bu¨NmE ÒÑ/uI8<ˆ¶W–àeÏ÷X9ÕÇpÒ^Ñzøz6;íÖöMb#²Ñ¨\·FIíjý/<ïú·}'·<¯Ç‘tlíóèµE„élY ÕX8ßÑàz±ˆ…©^ÄB܉E/òš z¾¬L„Ž;àªÖ‡áÖuièazISžlôŒìhýÖîÐÛò…<„òphµ´ðÀ#›¸«Ž¡|xeù¼êJ$M¡û€]×W[pÈàã–¶5æ¨Æ®…2JÞÕçaT#| p‚ö»¼Ÿ˜!É´wâÕà€V8RÚÁ‰íëÞšc]«Ïjó {ÝÏ\Ãl$©Ãÿ(v:%ǃ®J×éŠ 'ÛRÿ·¬äêÿ…Ñô¬¢a-ëÄKW¡vž÷ùxøg0Áó6w¦|*> stream xÚÝË’Û6òî¯PÍ Z¸ßtj¶7ëÚÝJ•Ë5‡¤&>@%!Ç–¤,O¾~»Ñ ’Òš(Ç”ËC Ñht£ŸhÉ… ÿä"u±ï;i,²òk ÍnAƒ/ŸÞHÆ[âj„ùááÍßÿ† é:©›ÊÅÃvLêa³x÷êÐåÍråû¾ˆÞ-WAŠÏM½kTYêj·\yqèy"p—_þóæÇ‡þ0€þA®ó[‰·ã‘ÇlEIàH? ¶"Ç_®ÂÈŸ—¾yÕâé—²€°2u¤Ç¢ü»b¤hŒô¸òe$Þ·Ïå¡«»|ŠÎ£¸ùe*(­9Íl:4õÒKÄ7½É  ðЬ®–€×åß;l놺}n!G­U«3n…ôNæZ‰PYªjÃÇýê†n›óQƒ^/@®¸¾#C’öñŸgÔà–,µ¯÷4?¨ó]! -Tn öù3!¨†×m¾!PW¤Å«HDžé-#“h°´­‹¢>?ysÉŠêºF¯—R»¤“âÝ™’DÈê¢n€ÙÐE¡+ ľèÔ3Ÿÿbõ¤7Ýþê‰L ,Á~«uň¿º2( "Ð K•ˆ@Uè]UæÝñê¶M“~JÄ[ý;P™é¢çMuOŠ«ÑN¾á¾¼95º3Ê•¢¬t›œÑ@k´©8iÔaO6×Þ¨ªû*[šß3-k³4«ôÕìǨfmò­:Ý€ôØFïB¬ P•©Õ{z©äT4õ±ƒÛni¦ñ¸F¢:ቀ—›&¯ºC^M»"²I`_3aã…x‹R€#ò)=W­*y´=VY§ë tÙøWí ÇSçNõSÞ©ÏuÛM²fB$;Ùœ|8èìéx˜—<â­.…Î4êvêJw¸ÿ݆c +0°Zky[;¯fÕÁLË hogo9Œ]ñ€Ì WšE:iŒ,‚¹†Uƒ nƒÔ£èÔÒ¸ÞÒ·_4vÂ?5zÁé©'Å{op+ìihò¯zoD€Â ÄHIarò¤Fïö&Û”h—ýYäò83bM81å.Š=IaDÇ©[š£\öpùÖž3{ Åh´HêØBÈ ¼âPN»3U1¹u§4­=³~¥%EÃ-mT»G3²'QP•5b=Ó¸%+ÄsÅwY`"ù¶ÿ»&Ÿq80sF…kýö·Ì⟠â*ÌÏ×XÃìYhõžWzÈúv­J«Õ¸×*€ÔÑR'¼ˆ/?G¦ìEd*_D¦ç œ@<Ý«|~›‚Ô¤…ðøøÓ/ÿ©ïlFÅr7L¬]!x°+œ™"Ú^¨ÙeŠ^U™)¼£v\d(†PQló÷d¡Ï™dœ¯š\v³É•7›ÜóÍ;ž®iЩi¤ƒÜ&Ô]š§®¾éV¯‹ü¶4˜¤T󫞯U.£þ Ö1Øäa|Í0âžOµKOh .”üÇŽ@jóÛ±íx+I{׆z}¬6T. ¬Y¾óÖvʈ4F¼(m]æÝž¶Ãt¯Ð¶¢ÀÖ߆s€ÛöOу ýdèQ8×@y$t釽ªººœ‰×Qßî¤ã5ô`x÷Ýȉd:s|ÛšþѬDŽ-FП¹•ú©y8™w¼Õmœœ¥ÛšaÚ…_×…50VŠ ¦‚gÌÈûÌcÊèû"ðVå&*€ÍãÖ9¾¥áƒÚ8Q´:jÅЙ›Æ2™jEêàL˜øƒ-œ‡Ž_âöŸ8ïÁFšÿü-½‘ªütÔJÜqo(Uµ3W«¶ ”e=· gX=È>¶ŽMë5…pC˽tZ9¼×ŒÀ÷Fï&>Š[nWLv59Eѧí~9xÆI'iŠ;|ÑÝÝ¡/.ðžw7ø;ÌýwW£ül?·Ïl%·jŽßõGjãø5#Ö_mÕôª«‡qbô ¶hTÚG#Òc·¢áD?PýøUô±VÁKÊ8ê£×ÅÕ[Yfœ5zñn¿ê!3 K0y]¼&_¡cöÌv¿clÁ ¯¯ÞpÌ7ÜÀ&”«ÊOK"Ó7¼§›¦Ñhš‡®;üV‘¦ôÜizBFnø…šØ£BWÍîXjB ש탠ÉûÖÌУÆK™:-ØÀëúizÕ'úQEÞZ3üÇð»È•Èc:‹6òHŸ~Dƒ>Ø[?u°…f±F2„ò´5–ìÛ{¿ë{ÒSÏX<ðýp™Š2ØŽ™êòªõfäo\øëï •—Í?û¾çß¡WRÙ«FeýÓö9hÌkŸW¨ÂJ[ aÑçüì\*å¶AV:âåø(¼Ž{™ãVϨ½’¾.¢“ñ…Ð ­sYÔöüIýÿ$‘#[ endstream endobj 1274 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./colors.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1275 0 R /BBox [0 0 378.75 313.62] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1276 0 R >>/Font << /R9 1278 0 R >> >> /Length 2590 /Filter /FlateDecode >> stream xœµZËŽ\·Ý÷WÜe·Ñ|ÞKn gag6…,eF]Y²¬±á¿8—õ`‘ý˜Z¨§†<çY,²jú·I+3éü¯üÿæÃÎLZ->j¿Ð‡Ï;«Âä´YÔœ¦;£­ò1¢e%‹É–8­ÛŒú'}¿ûúÇezø}çUJɹéÏ™¾Û™é¿;=};˜ìÝîŸÏ^ùT¼*ŠW6™E-Œ§Öq Ìfg—‚dtZú’cg8M±¬-qÌg£æAhEô¤Qæ’å8p±¬ªŒÏG¡Ãð²T s¦xÎ#ÃÛC3Å>¨ÎH±¬Î“ÏGÅÃðª¨0Mú³6ä ,ŒÈe ä ñ޾ŒW‡i3\NŒ±:àŲv¨kh>…ëbÄ´y.gÇh9Q±¬êšÏGáÃðž…gÅ ÕäœùIËÚ!«Áø|:o“ʲ(ι1ò“–µÃYcòù¨x(ÆlŠsnŒ3g(–µÃYcòù¨x(ÆlŠsnŒ‘3ËÚá¬1ù|T< ¯¾)éðœyj*F““h„#-~‚Á÷#Áê+ÒHÎÉ1ñ¬–µ%®€ùlÔ<­¾)ÕèœÒ€eí×Ð|>ʆWBšIÍ©0U©XÖY Æç£Ôax U^Ø&gÄTe¤bY;œ5&ŸŠ‡á‘âú¦Î 1UEXÖgÉçƒâqx¤¸¾¢sBLX>øXV„±T–>•¥­I P¸+ƒåK¥KKõ*àS½Új…»2X>Y…±TÈ>²­I P¸+ƒ¡;Å0ˆjZ¦š,XŤÆÀ*勦`å•·LåmK.‘ ÷a0°èV>P¥ ÀTé¶äY pCÓ‹gµoAdµoË*! ?X¶ÛLËŠb`¤¢¸Õ  we0°ì/¶™–UË€OÕr«AîÊ``Ùxl3-+£ŸÊèVƒ$(Ü•ÁÀÛé0ÝÈ¢p±¨–Ñ0¥1P~ TRߕ׀KåuC-p—?–ô·Du6ÀRÝRKdÂ= Œ>pñTy"UÞ-«„(\ü`à~“ªr…JrÀ§’¼Õ  we0p¿yÅ]aµzÁgµz«AæÊhà~K‹»Bu|§:¾U ák æÇPÔ͉œ±aB᳉JkÎ"ÉÙ:%öh 4çþVÀE¾¶Î{’òïùÛ¬Ö«„¬1˜ö¡¨Õ‘Fá>ÿÚñÓ–µÃ* S>¶:ÂÔQÊ¿÷¼¸ËÚc• …w”—cëÍÔÛüë¹ê=ËÚ£•˜¥ªuÆoêuŠÆ{v`M°Ô7ÎfY{ÄU TWÙXà¢ß/:DÃôG¥c¨\Ųöˆ%ª@©êƒ±À[ûâa紶ʰv§Ë­YÍ»ƒhÁî&Lj ¬z#àíýƒº±Ë XØìÐI¬ƒ‰Š*¿®”ïUƒB$ÂÞZ°1“kAÞ¿ Ä^þ0[„ŒM³¹D(܇ÁÀòKÜl¨!06ÇЂý3˜ÔX§îFÀø5…Î>”Þ£ÂnY‡\" îÃ``Ñ™0Ül¨!0všÐ‚ý3˜ÔX§îFÀ¢]ù€ 5ƆS‡\" îÃ``úzŸžÞï© Ô˜A v`Rc`ý­Óv¸zìì~Ú:h•–`LÚ¿>¼²*ºÅ¦ýúŸƒS...í?^åm0a_ŒsØ¿ÅYÿ¾ûn—Tšµ™§»ïww_ý´_éÝÁ¥£Žû/T0}ÚO iŒ²Q€üp0*ÍlB¥aÿøDŸi((÷fI–¤RÈÍ¥Âr^VT ÷ôÑҌ׻(;Ûý¯t\BÚÿµ}rîåžÿBàvûÀñçÁ+·m÷¿žòìmw—ÙÖ¾G­¡³gb7¾Å/…Ð/³ 4QE¯-ž «‡® Ú]yÒ±ó±ÖU‹‘QÓ\t@B7þŸu‰«`r+®x ÞòM?¿8Æ<ã\ž§ëèZ‰ãÿ¶ÇJÚ?Q|]ÄÖ:©ó›+BûdÌ“¶´yih³#»>u£ãÄù0> »oBŠWåLgó͗Јí¾ÄÛ¨bÌýÚ«ãò2YG2Þ™(l±ó©lVv¦äv]6=ºmAçÚNå%}‹7²×)ú,ÆWÚ¿œW&¹€*B€¼¢S^Ù¤L^°Küa[ÚÆ¹Œ–Ï´£ïq#_Âbs3Y^çÛFÒÀçÑ…S7óÑX£0`ÊÙ¤m¥BÌO<=ûð…îTštô¾ iÛÔúÈaq渆¤æö0°%n|›c\oøÒÔ¸F+ïR¼>„5l¥ÉIZéã'¼ì\÷Gc¼³äîvZŽk8~ÎŽ‚›,E÷ep%[?²0<ü|Í¿´Õð3ÛRµ;>‰ŒÎ{«wK?#Zµ°}¿Ï£ŒÍê‰æùŽKüýàUXfo÷D!vVÉõwÍáÌif¥œùÔc¯òDT³×Ö÷6Ê»X‚h6ž÷ûËÓ?o$Cv%èÈs&ËQL7dÖÊ ‘˜àrĹÿº^yô=É3UÐÅöü Ãï‚»PöƒSólB¸ðupòI*:yÿ:D£ÂlÓ%w¦8ëß´òÆc.9„¢÷éÊýÍ3:ÍÜÿ¼o¢µÓ;}^ÿŸ¸ëµ×žÜè%!cðòÌ54WœIý÷»Ý»vÿèU7 endstream endobj 1279 0 obj << /Filter /FlateDecode /Length 327 >> stream xœ]ÒÁnœ@Ðû|°Å,t/ª‹}ñ!Q”äØa°8˜Ex}ÈßG]kçÃC* ¥éÓÓËó˶ޛÓãV~Õ{³¬Û|Ô÷ÛÇQjs­¯ë–ÚÜÌk¹&]ËÛ´§ÓÓ·iÿýg¯Mnæº<ò÷é­ž~¶î´™r›ëû>•zLÛkM#ÀqY˜ê6ÿ÷(_×åóÕ|¡ùÂ4æäiì2èrÄ3èÎg ÐÍLc?P€>f­¥ÖFÌÀâSv¦Ÿ²ŽX±§ÖG4 `Ñ)€yÄ °¨`0ýÆ•Ø5b¡V"ÎÀ¢‚U `5âBlaÀ1SF~¦¼£¼§Ü(€G#w àÑÈ àƒNñë¸â@c3¾¡)ÇQ·»ÖGëk±nõ߆í·=¦šºÍé/Ȫ endstream endobj 1283 0 obj << /Length 1347 /Filter /FlateDecode >> stream xÚ]oÛ6ð=¿BèËh`VE‰úpûÔd]°u¶ÌR¤}`dÆ"Yž(7ñ¿ß’åTtÒ"@LÝïûŽÜ à{‹ÀK£È_ˆÌËë³À@ÛµG‡«Ë3néæ@8Qž/Ï^ÿÇüE°àÞòn,j¹ònØE!·jgó(ŠXòf6"fµÍº•u]nÖ³y˜ÆaÈŸ}Yþ~ö~9\Ðj…”ߨ•ˆ#µ2@Æ^’ ŸG‚Tûð/}jÂÍ”]aõIŽõAìR ˜ÏAl{µ¶ðÅßNÙÂC?Èœ§~¸°vÿ;Ë@¡¶lvØ)Ó(eÏr³¢C]>v»¶7wôÛŠ¿Y˜²½ÎeeAÛìj÷ô‘7UÓj‡9€¿­d~?íý^ 'ïCQvj’—ý<€þ" bqÄ®02—çSlÔ<òyLî̈£ÓfÄQÆZµ:­ÈSž,×)œƒËP8­Ç+o«z!÷±w…A›öÂ1X+ÈäÕÁ~LxôÁŒ³nÈ÷róÝ~¨åZm:y‚oˆ §Ð¸³"ÍØ^UUj>8² Hd‹© ‡•‚âS¥)d›&ðFÖ=ˆ²“UcJHL‘ ,…Édã‚]|üôÁ¥Æ¸P@àÉBâ‹ïsí}|ÖÇÓÝæ:óÁ™fØ„ÜÁþsgy{ÄJÛ»¨£€¼º1ýt!ÜUÊ%Z°m%K‡GÞô3ä¿a8ð0õE{aû\D8^ÿVóÔû¥9û{j€qÎýÄ îg©uâ²°M^wkÃöv.‚Ɉ’øI·™pÐ5çŽÉùPqô99qÊšfSÓO›¨ONœ;Å0—êÚ©àx,€<eÆì‘sÊË·®~9b¤‘1åØO0õ3§›NÔ 0.Mà‚ûQ”xóÐú­â½Á$~po¾îm6%õc¾™qÂws.Rf‘Û…z|¹ ÿl` Í…¹\vx2!l-°ÔÒMm!ÍhÙ¨ä–ÐhbŠ&rÖ!êÁàqI ÉJ++zÀ6V° ˜&RQÑ» lÃ,;ÈʲÙX}`+˜èÒ¤å°.5ð ñÀ½Eùkß]—îñˆkŽÝ§Œèn¢eUíIöªÔ‡«ÿ‚l§÷õ¶k{l 0*î‰qÔ¸á‘ÒÄ §M0(½·9È™¯»=1ü!—êÚ}Ýl‚ˆÜÏâ˜A×&›pêG–ÕѸ58¾ëPvÇ«Ž»ü„ˆ0½ ›Zmã Š÷Ä€;íPö“Ýô†¥é08 [‘BÓkè2kº9©½%ÄjFÐPÍø±Ó$(‚ hUÞA>L¤%FnOóþáA4íßÚÇêP°mmVihIÂô.G‡aòq O Iñ¬µ•ZcöšÎ/ðð£J}-%É´?£× Ûõ®Væ]Ò½rIÑÚ„¶Îý»Å¤d!7kõMoDû ̼ ðwC…8¼v† tL*g£7Ý'´Ä»¬„»^xOY•+«Â¶5}Œ32L¢ôãm±ÞÅVŠ|ü¤i~Éü0 ð‘ûÅD0†À¬mˆxÙ^DÐôÌo=(C¯Åx=•­¼­16þm#’—w{íªÔ{ŽCÚö¼Ï/vîÄ`>Õʲ(‡žËEÕ·ä‰yHU)MRê~:³p§²¤R§”gZ°Ý^P)˜Â àK–hÐGï!þWC#~5¼q=üŒäE9 endstream endobj 1285 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./linetype.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1286 0 R /BBox [0 0 101 60.75] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1287 0 R >>>> /Length 152 /Filter /FlateDecode >> stream xœ]ÏA 1 Ð}NñOPó›ÆÚ³S—âJAg!.æúRiUh/þ­oþÏ£¬ö×§8&!!n¢ØŠc­ŽQ¨úYïr#,¡Ç Š‹8¼+o*i…¤NR#$IXj¹YëÖþâ~2cw±gš†dŽd!åÕ‹y[ÎØÏøÕÉ4ÄĘ̈˜j³Öëívò†$=O endstream endobj 1290 0 obj << /Length 1944 /Filter /FlateDecode >> stream xÚ­]oÛ6ð=¿Âôb+’H}µðC»®Ãº6ØK ŠÅØÚlI‘äÁÐÿ¾;%Ké¸Ã$"yÇ»ã}“ñ&.üx“ÄDœ;‰ˆ'Ëí…«VëÕ„_>\xoˆóæÛë‹«÷A0ñ\'qor}?$uMnØÏë´je=sÎYøj:"`ŸërU§Ûm^¬¦s? |Ÿ z{ýëÅ/×=3X=S*Ä|A,ÏóœpÆÂñ¸ ɮפJbÖ´õnÙîj‰ÀÆp¸ñP"¶n508Æ,“ß\O2›*ܼ°Ñ‰YµIóâÏJ“6O6’Û¦S?fO$ßè(f’¨ïâ³¶¤•eYLýˆ=âY·´¨÷´¸¸G°”EÏ.q’Љ›àûøõ“(`k;^@êJ‹ÌH€sÁ¾ ‡o-çqÖTéR63ÍóØ~-k<²VÙÖ(èÎfÀ\Û‰ç K ¢•«¦Ÿë¥—¶‡|´½6SõˆñÐýæ^G2;¸IÁcÒ6/mÖF›ÌaG0³@~c>zgL`óAˆ¬MŽr)¬ÞH7îÌ»5Ò`¯lì'rCbn;…X Xµ€xå¸^ìÎ\'€ß(@e)uK½¯óV"vE(ó ŠvuE´p“Éût·iog´VËlá:< ô|Uƒ÷.‰^¸}-:¦&ž¯ óaQ…:’éÁYÏœ~;éüƒpp>ˆ£FpÊ~Ú™ÄPYsÏwBP+©,">"³ÑÂÐe¿å…Šê„µ@O&C&Á…ë²´ÖÀ¦¢`^æ˜g(ü¶ÏÛµÞŒ>‰;îwÅò„Gª2!ùK!Û§Jé –éææ–ÖÓ¹®ÑJyßÈváΔûC”}W–·Y¦¹€t*5™(ÍþÚ5­‚uF{î…h^7Ò Âx)³F„©@¡øõA‡uªTKÓòžÀt:…¨bBà¬Pih‹u­Çà?ªvˆX°²B…+j1gU UMb¹3 ”:-'ø‘±b£S&òÀ”†Km'B•¶À±[- KK¿Ê g:“ð 1’­§$§¹ÇZS𔀉;1Ȇ«ë’ŠŒšÜ§ 7Vqß[<i¡«Xò€óƾ}Èê?z •õA†]‘·ZH´¼Ú«ò7 t¬4ÛP$zVY»~tÀVa^¡Æö8È;ÕIâaηGý\6í×eW­­ä‡$¬®80¥ê²ŒüsOe½ ú®Á@Û¤ YY€Y X#¡AÈj¶, –…ÕƒeaB–‚ Ùó€ˆ)ÂNLi1ÄHL˜•À†£µD¢K!,6%í)Ñgщ?Ùü)ŸXÔ p«ì´.JÝh¹±s6µ¡ådìÚr å¼xód "’O%kŽ*ǘ%ø›æi[µek‹@Q_4PKCRnŒYl¹‘ÅJ)=æäìC8¤ˆ5è4H8ûH½—Ú¤˜IÈËq\Á°VŸu® a\tgQ±b8±ê5Ÿ´›j(šr“g‹aM*ä¾ë°8Y›‹žDVB‹\<‹ 䎨mÊbu6E_Iš$<ûÐ åÌ=‹l'êÙ¤Q\ í#ÒïIÕ :Éå®®eÑ å>E³–Ð\waQ®˜_ú?!²Êà‡~óûÉã’L‹ƒhý)ð*úÐß1ý0tøÄO"'ŠB¼c^}Úzñä]yñ»ýºéG¡ã&þ°e9ÓÍ.N„.<¸< Úr¢«1'1ÕÄb©SÝàö·I$zG…&K¬á„Á *s[™jÑÉXng3£ØvÀÕOmÐ?;ôž—0}á7ÅTjœ-Ó‚ ý9p5æk›«…@*@ŠþZSíšc‹NåЋ‘ÛUtw~æDÇÎk))ÖûX×dw]a¬þÉ®á†Fr6öX¢â4QêÓûkþIêTÞÎØyùžsa¢'ÁGÝïº7Á©{£¡z€oSuŽú8Ü «š­Kà/7m€Óu˜‚Ÿˆ%pgQ†B8Bx'éBÈtõês‰/\­i5àÕà O_`aá.Ä Oç\:¼A¨iŸ.z™8Yâ] »1°ýܸãÇ2†ð踇ã®î‰é:ÇA„”¦C§ðµý±›ÁZB6÷O7b?Ü{Ç¥¤wò³b^YÎeï§ØŒÕ$‡z¦‹ñ™“Y.‹¥œ™²J®9Qó³-•g»íy »X´¿í§ú‘‹þÍòT—¦ß0K(4ÔrŒŒIªÂõý tqFJTh†š|T’ËJÖi‹jÃÙå¸_˜êÿsÞö¡º|Îû…^ÀÀxÀGs>ˆr¢_³½¬ˆ±é}u guýQ†O[]TZヮ»lGÒç?.úàP‹÷öæ*ØÏiÉÇæó_î«E-³KÈ.¯ÿ§ÿb'HÁŒ3ªç8Jé3¾°.-- ¾”ŧk Á¥ÑW­|Ùg¥o}ø¿ +W¤ˆ´¬,õ€eZX³{®2F+Wôÿ¨ºõjÙw«ÞøªëUÿþB Ä endstream endobj 1294 0 obj << /Length 1950 /Filter /FlateDecode >> stream xÚÅYYÜ6 ~ϯ˜G š™Z¶|¥Ø‡¶HŠö)h÷¡hÒïX3ãÀÇÄG6Ù__ò¹öE›`µESI‘)\Yð'W¡µògª`µË^XD-+~ùý—Òðm€q3àüéþÅ÷o\w%­mh…ru¿ŠºWïÄÏÇèTër½qGx¯Ö¥\ñ¶,e”eI~Xolßµm¡œõß÷¿½x}ß-Ô+µBÎçjyCµ¤”[oåj+Åšt¾†©®¨>6Q©wÑé.Mr|¾·\Ë‚òÔ ÖØHg+ÝÉ´²hòx2K>Ÿ%'ÓôçZ?›gwó¦þD1ÞVfõû£WZJÄz5iW $&ƒ¼—FÌÈþwGZÊs ½/A„”"‹Öv ¾°¼ØŸ@´Â×¶/ŽQ~Ð1“ú¸°Z¯"XŽ&òCÎ/½…¸pÜÖ:2h-……§-öT>”8a$ ô2Ž’Š?–ºnÊœô…Ñ[6¯1ÎÊkfl͉E:ât·kÊRçõKˆì©!y#í­œ£­|oIVÆÆó,ñ#,XC«`Dþ¦74ÚEuâýÙ% Mí,þ·EUÿ±+“S=¿$ ûP$fª&G¥š‡äL`8¨EÎÔ]”¦˜È‹k£3IöâÊ»ˆkÕùk°ß ”ªõÑD‰¨<4%Ùz#ÑCøñÕœm y“LÌ&Tì®Õð†Ä6ïŠÔПtúlâm¹¯,¯Ï}ð®áîšá-nœ @ lÕ›°ˆÈÕ!²|B_ FH€„e$(|tV¶êMÝ9 Nˆ‚ 8Â$„ÉY†u 8- (1ܦÿ¼+qÀvýY¶˜|AzÄ„ÊàÄY@ÆK8€2)/XnšÀ€WBW"©w%R+éËY è“Hth©£ô‚ÿÆ80ÈÛDÌBŠ=¼p> ¹_d!þí @°CßÂ>ôQdú8Øá‡6ô‘°ú¶ïßZm¯5°ß¿Ý‡¯Sq_˜s¼_ß®*% €#N¥l4 WBd¼”ȃ"Ò”å—  RÑ›øì½‰£"g¾³ÁŒû$MIØâ²£¾b|Òeñ˜ä1(×êx]„j–q<š%/3o˜ÆnïlÛµÈÙ˜€ž/ gs%±±öWWL­Y´ é¡(Á}Ó›ŠñÉuÁ”XC(gÔ&&&y…¢ue$b>‘@ž¢Ú(P”3®ˆÊ²Ã òdx⬊ìð >Ró5ͽ«+¢ Hi‰]š,6éó“`©}‚¥?]Æ5à‰òxA¨ÄÎX* m“ïê¤È++é‹7ë@¡o.›4ˆ³¥ð„yN¶Q¡¤K0 “ P3ŸZNøDØÏ¢©ÁhsØÙ^Ujqá öL¢D1g$xøÁ±‚ê%û‰,Ò³Éð¿9P•fõ=ÏhNøí»ª¨Œç€¾Íû²Ò¼X,8^ñIKá koN†$OKBGE)ž6›§ï’|ŸäIýeº€-cõšj²`ŽM žFd„½@öÇÜø" _ЗÖz¹6«"´ëæùÄ<Äg! ñéP|â·ÅøT^آق0»« ðÎ!9+ ú¥¸ÃeZ=w%[IuèTHoÜsµžB•Ñ)¾‹pÔ…»ÿUš–X¨ cÿÇ6lÚLåE§Ú]÷¶Ð‡=»W˜Ÿ)o»X€rÔ§- ŒÛ—`Ö΋ù‰|ÐËkøÎ€e÷7 ¦ºRÆâ ½Y€ Bž˜ég.zůIÜ—s®ÜEÐ2VŒ&\µá%Œf)ûÐô)4T&Cýlgül*=µoÒt^(°µàïIè¡Ïf:V°± _Û9K~¥–ÅÁúBLeT-„•^̇O]ÕË­Qݾi~¹'=l+€‰rµ±·N{ùÿš¾x[Ë[ ¨ò4\Ú\\‡Cئ%©À·—µŽn=[¸ MfÞN{XYªmèÉQo1Çœ–Õ¹»"g‚,WÞ9b”z§þn@àé ©k]…¿DÙ‰Ú`p£ {Z òÀ˾HS ˜G¶HIZþޝõyÅCò<¥Ö&ÂŽw\¶·u,9Ê—j5uñMÅC]øÝ>J«y±Ý=èYF±&Êâ7îw Í<ÁQ“毮^áÏ€ÿ>Ïk£ endstream endobj 1296 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./basealign.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1297 0 R /BBox [0 0 340.55 181.97] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1298 0 R >>/Font << /R9 1301 0 R >> >> /Length 8000 /Filter /FlateDecode >> stream xœíœ=¯,¹q†óùJ)Vñ;5`P&y3Ãq`­`ÜÈü÷·>yæ, µ±l@Øàî[Ã9Ýd‹UÙóç§z*þ³?¾¿~ó‡õüø/>圱žÿ|Ñó»=ÿöªÏo_´*—ñP­³Ìçû›þöúÇþ =øí‹ÎnåÐÕö³©3•z®6Ÿ ÒÆ.Á{—J×5ÍpµY< ímÜ 7öónÿǵ=ÊZ>ÊA37L¢2Û“ºÏÒçC­·ræCsÒžµº ÑC‹v¡ùÏ^ÚC‹w!~ˆ[-}„þx *ëd‹zF©í¡9giûÒµ–¹ð ·ŒÙÊæ‡ˆ{9Tv{ˆZ-{…Æ%º6Œs–%ú”}ɳì n™Ìe¬‡¨/4œ­•q]Á4¾À³ìsµ`* ±jÚå üí”Ýš§Æ%N+SÆ ‡˜·”êñÚ…{¶hMFiË(‰»—¥OAd¯¸è7|µ¦·Áµ•1¡«<=ëߨâ‚â=JÝõ9åšu®Bý¡NúØ]·µáø†[*•3¢1ËÂóßµTøl=2¦Ñõ oÐH/Ù¨Êе6Ëž«Ì­ÚjáV6¾1§üË»‹?tqýñ¢Žá^W‹ÝKÃ7Î’~»nkZ7ÜÒc\¿½dzû)K[£ÌþÉB≽2d,¦ wç)ÏÖôGN+ozì²(uÇ,¥û:3¿½þd»KpÙÚ‘Ùċĭø 3¦‰?äúòqoA¼Ä…[c›U¦ã»¥×ÐA½Š÷IæÁ» øÌi…ä Üu ®ˆWâð‘—Råîj=‘®í¦^4›Üö÷mjÔBk‰/_t¥2åºe¬&C²ë.zéàf ññ¢Í«œu}‘øs›¥sÖYÞÇQV Ü!­rQ¡"ƒÇTÄ }î"Úžp 4YÕ{i)!¬ô'Fà?¡‘l›Ox‹Ö—–´5&N-8­jAo©¥éälçXê…iݵ’e]úÔ{”Ï•êÓ\3ôîvïné]B7J¤s4¾}±´-•ïmaÖ¤rÉbéUÕ8ºh‰üÈy䟻œSÊ@×( 5y}›ŠZDÙ#í­#°|O pÁ jG=C­6IU¸$&®/×ö4«8nëUç’ë|¶fñzšP£`…8š7’Ñ΂œ—~2ØÖ3,,yê¼ü´5Ë¢ßz¥5Õì¥fïÔT}hP mÚšœ½ëzÊÔ"É,ȹ16»ë"5F6k.©/ª²o±ÕÉÆš2™] `Òk¸e³,››9ÙšÊw¨Ãì_;[ŒQ‘£Ñl[ C×ƒÈæ [¬²¥Ù›¡ 9~œ[{n­ª­ÅÆ¢9­û d ^r €Wø%·:™] YšUù°v³Ë_9½ø#……§D®çžâ¹ÆlR ‡@ ýÎF,Dqí‚6ܘú6âdžÂëykÉAŽä Ñ—Xá ,ŒKè R}¹Km 1×%‹“=~¦1Ê—ƒ0 õuabY7¢ïm5]?4óZ±~¥ÞMª$×ö`?¾<êo’ S“ümôWAÒÈUžäÜÌõ(S°eš©M-ð}g®]0‚·àaa— ß°k||¹ê·×?ð¡¨1ø¬½¬š¤n âkÀ燽 ø"\³;é`ü#ஓ€G ãÛSÖ; =N+kô‹€(ewXÇ@_zði×IÀ³…¿1¹ì‹ˆSýf™' DÓ/`– ªÔ„G<3H}E<áÑÂ0÷äV¦ìS©îgúl4K“"q¹c׸&—ðh¡ »íU&àŒI<0u/5HF‡G«$\8ùlAÂ]' ¿ZTÕÝ´’ðvHúd$\v·°ê ‰h$Üu’ðhaœ»õS¶¤Aªy‘ð‰¬1ÎHøªÂ„›L’þö½ƒ÷)06)¸°®¼#tÏ”Èubðha»°øÄàc!™€ñ—œÀàsžÒ•¾—¬ñÑ8øªk€a“IÁýsKSR¢ítÚ¬Û× 'Ü«’]KµlˆKŠT³X ì/HRÌ͸ëdàÙB ÷\­´³Sïé×0KÜ•1p?]6 <[(Ô²Žè.…œ3pÁ‡#ø’Bÿăv`Î-N¸e›•Ÿé|Ða¡Y*æ að¾‘Íí€}UêàÚØQéBZEb¯KR“@'|5 bܾ£_üçÌ ƒóaƒ¹ypaõ¦+Ë \¼¡ÀçÀ²ÀÐÃl¬ÐubðhØ{—5R#aÑk¸ÙÀ<µbp׉Á£…aðKK­€RÁ&Eï n•i76T¦¥Øèí¢à]–ÙüFo»t”!Ÿ#Ç Á=v$Ïh¢z Ö‚ÄdÆ·€ÐáAùpWu‘pËê.ã;Z˜Ž¿à:¯á» “yŸ{q“ðÓáXí"án‰Ò²ãÌI¢ðÛ“ÌÒZ‘B×P¸”u+7…S½gœg ŽÂS+ w(ã +©Ž”…GFd¨úÊ™Œ†g %‚‘r¹Î¤Ì,Ø|ÄP±Ðñ¤á&†ÇçÊÂum>y{s!áØÐn‚²”„ÛŠf <Ö?ãàþ©Áà ë©‘]låaniKe‚pá4¨]Œ„/\ѽ~¶'+FÂ;W%¥ßàgòØ!TKµ.’ÏÑJÁPx”4†Â¯¢Ç\"Z ÷âÄH8°—= #á‘Tî áŒ|Jh½Âp×Éã…ï(þL ,Ñ>˜¥ó)½Ÿ wµx”½,ؘEÚ¨H×ò”SØ‚¨įzVyxÔ»ŠÃqlLîÊÃ/ðñå’ŽÃ¥TE–Z;ã~O U)©Sˈ#„˾·¬§RÜ4Ù}fêEªJÒ£ð° wYrÌÃ4îdn9¨è-*‘ž?`-‚TÖc¡Â€²Í;ÉŽL[á!Oí¡åšAE‹Ýä4AR†¥ÆÁl½„YˆN_p]O…·ªÉ±]Ã4¾Ñåh¶h[v؈éÝ?”xö…¡'„éT„&y°¡šDVÝ‡Ž“j8&<’²V`9x1µZt]7¸„< ·´…\ðþ†nÇàvºk«8¤G•Q&{?ŽÅëñB…{</%¼¾×p€$k½bÞÖªP,ëìÒƒê’Lj­YƆ ø ‰~©‡D,û{<3uˆïbäAÜdÛüAj3ž›×ã; ˆÏÚÚ/™ *1åú–zÛ>Ì%~ÈÖzƒJÜrx—ØŒýÀŸ0ì…ðÒ/NÅvìމjz£†ÇÓ®QÛ¡?b^e Ócî9ϰˆÖ1®oøÜ”ÐaÏø€þ 6rËnX—¶rÚŸu¸ ©×Zƒ¸NwµËLÜ nXV\ÇCvË©’pœ±àÍ -›¤&ØR8HÜuëå NÜT’ŠÌ(°ÕÅr8(}•¥_z&½]}Ë™`ô¡¢œäÅzI ('çpÞt=[Å…aéáR×ܲ»ÃNVÓãL¦ñÞåäF´@†/ßÃ~¡Á`ôn@‚ˆ„ ›«”%œœùˆˆ•~žlCÕ WñPÕ*6/Ͳ±uð”¼3“È®qM3 ßk–­üãA F a¦H¥z[X¦>ãµYõ)òäñäí§œ,‹ÏçR¹MJ€ÜbvC:ÒÛã`q€rZ‚öæ,Å(-9Bóö` OvIo É ™•òY㜛¼–"K'£®–§ úãÅÀÉug œ½“÷"ö’ýæ|’¹’“Åû’éwà÷{ ˆsa‹à€«3cïkáA»þxµºåäY´@™_Çs°3ÚwhªkÙæ UMm¨Û‰¿.¹Ç`夯Qïrf Pøˆ¼1@Œô°!)Ú©?^IˆE ZzÆ5X°˜”ÁkLv`FW§†Oä/Ô®U iD£­×pËÂ.ý/`“îàt¸Uã}ê"ë-p8S&šìF¥Þǯa–¸«vl¢‰¯fÏÙNE6¸øOZNØi7¶ Ûhší´ºÎÉàÀ2Æ¥bTr™ŠéèÏÛõÇ‹‚Þ3è娀#¡ãy§…”LoìXïëìÄêwª8?(žõœÉ^ò†ÙëÅ‹i”_ÈEB6ŸŠnñh‚:Œ9€ƒŠ‹×–%YnJVqìÕb*n–÷²iq]Q[K41Ël]/qð†"&ÌþVQíÐâµM“·`$z(ÔY0 kl_è5܂Ы!KGB×øÒ$!É5žðÜ ŸÑK¥Æ±O|Æ,÷¡è»ð–Íå…§±×”µÑõÁÙ39R”–SŠëŽÝDÙ˜ÿBV"NXAXÑñÊÈ¢šG¶séð›°œ© Ê4¶V¿|S5œùØ18oaÚþBêˆEaÑ»píwùÞí›=é³ðJÈìŽX`aìÄâ4 bRyû’PaµÜ›e­›£LAR:!Ö&ËÿlÎEJzô@ë&¯ÄžÐ•7¢r´à*åÍ÷ä¿iÞ§÷^¢äWb·õÕ¾,²Hß7É¢Knýª»–@Ϻ‹õDH^­Ê«DQx©¾ /k…×–´ÅeõW¢ð’w²ðšzÀ$ /Õwáå-¼ÐZrÎ3ˬZýní8wá%(à*¼¦Ø» /ká…W¦µð‚‹õυל…—Õ«^w‰¼Ë.ý<ª.Kî²êZ^Š»¥7lRßUW׃|Qu5“ÑKleMúTvm٢ʲK߇õªk¤r 0€ìÂ[Õ…œ Sʪ.“WÕå ¼ê"ÝsŒªké&ý]uÍÒà`QuÍ2ú]v©¾ë.ká…V•ãÙYwëEÔ]­Ë¦JÖ]tW᪻–l:fÝ¥ˆ=ë.ÕwÝå-Lã¥VÎ:Lj›<pMÏÏu—œq»Ê.,¨<¢ìÚr¶'Ë.ÕwÙe-¼ÌÂÛ‚íÒñ”£ìÂâ"\ÂÊ®©ð2Ê.ðQýF”],ç–¯²KÏFeÙµõñ[ÇÞª.‰£wÕ%†«êzÓµÛ[‡YvM9U×–X’U×¶÷³ê²^u-2.íU—¿Ø˜e—dƒYvYx‹²+`”]Ö"Ê.$øWVë°yéeP’yÙå³ÈË®œgVvyƒ(»–xÈ"k»³¹…ôØb”]¤È7ê. ì…W´°Ê‹šë¦Å:ÙÆH”^Pv”^>1µò2•…WÌ[«»ŽœÑȺË^uȺkÉ n¯»P:\eé6YuéçQt¦» Ÿ}O2¯_*w8õwX¶¹µ¸qjlž^²Ûáû°HÑ„/´!o9š+´Êúëé,–¦…³ìÆrL_ˆßL”GÇÁ,«ø šá ,~ìËY¼P‹XÝ%Î놿k)±ㆅt¶!¬Ÿqéuno,Ærµ ÕÍôÜJºÝ’t{ãµ’†<ÌÝ}Á žô•ƒe5>„š»rlì%Ù²²qäoûÒo•ᔑiÖ_ž¾D(Ë© ·Ó§ä”šmÃù»–Xå¨Óì¹Ê{ÂçŸ#]oªÇoÍ=ìï|¹¢óóŽxì\”qsý9U‹*k\̼*¯ÚÅû*CîEiP£V´(u\„Ô&:N§€81È<-ÎÌw!I@Œˆ#É”%˜¹<&ÊnÔ’™‡fîgæ÷k$3Ç»øtSuŒñ¾˜9’d/ 96Ä$Ù3hŽHß³ºÇ EûBæMŠ'”èBF™‡džGæm¬ÒwOd¾‘6&2·n&2Gúܤž3d>p n$27}!s³D}‚ó.û‚y8¨„L+`ž»ˆ[p¨×tfŽWŠ˜èbæ]Q0ó>j©;˜9~Áâ‚™êræÔ c.ÙÔuöæ:™¹[‘.»¿_ ÉÌÝ`Ì|TjAÄñåî2dzt%ÿo¨\þ?0ù=ü™&"w‹#ò6:~@Éñ7Ž‚t¾¹ùv"tÏ >â:¹Y㥠†r9Ys.@ŽcoÛ Ç›•m% OÏt@þÞ/ôQc›€ñS£ƒZy›¬|oÚ y”ƒƒ}8ÿF`åvrd£@:Ñ WáJÈC; OƒÖPpø¿4P¥yÎñ°iO#CJŒv»N@îGZøÑ%Ôå>cü9§ÀgnÜr0CÚBî: yZ”ãè¨j!à©ÅJ@~°†Àn·nr«Ôh˜€ÜÚùøÆ[oØóµ)ˆRoÎ}ò…s(= úÄìÇü2Bî:yXŒ‘#/<òóIŠÀ×™ö$’£8‘‘7 "Ë›ð ÉßPŽWä3ã‚äòÞ|Oš%åykAÁ‰VGÙ’œœpß[àäÖàà䮓M…Å895’»pNNŒ3 ûâäòCTÚ{Ö·wé+×J½©-}Á28¹¼PÊûj±õg·Rë[ÁÉåi¡K’wÔw…´Þqœ<-ÊÉã/—Þ¡}qry)•’œÇÍYe”Ú9yXü®pdGÞŸWž=wNŽ£Wòš«·@Ôœ=•—qP*'ÐY\ÝX¹x¦1ÕžC·k+——ÞzÒsYrå%eå¡ó™‡EY¹$<(…Œ•KLCñ¬\J‚Õ‚•»6VžÒYyX,°PU ³­òÛ&‚œ•òüµ–ŸCåà-7ƒå¡&ºÅa9a“hp pb¼CÕ/X.¿€uÚ[àH €å®–»ÅQ7 QÜ©‘f#aXNBBW r–šðHÂò ƒåT§¼Iê°ÜuÂò´(,m°ü=”Hxñ`°ÜÇ+‹iÇÔ©ÓqÜ¢¨;´¡ðtN‡år¢víláÚÿBè¸FXì.LgüÜé›?é€å²ŠöÉT±M¶<»No ‹ñrÁX+p¹Ï‰Àå>í<%ìzõqé%L)q9a›mç™Âk‚í‹Ì;RCܲŎèÒ[§?±rXZB´œ•‡ÅXyjeåýèéÊû˜²‚;*G¸”lµ?~¸êŒ«öÇ+‹«õ•£Go•‡Vî‡å«éYQGáëÈ[«,—$?-x5tÊQX:`yZ –ùA£ á~‰dåX@d¯Ñ[Ô²…˜+—ÍêsÃò½ËÚ Ë[ÇìË2§ÓÎÈ2ZJÛ•lŒ£îšè…Xž‡å8¬«1Oay,Q3`¹õ2Y¹lµ`ålÛiÆT] Õ Êñâ;Þòä2¶¼«”PƼà 8^%-SPÞ÷(éY€rü„—X ”e!¹2 Ž_Wš´.P>¶d*nÀÑP>ÍJÈàänI,Ž—¶¥ÈübIRCåcëôt>ŽaÓ…Ê}&E ׆Ê]'*ŸRÙ3TîGåZ­Žá8¶¥3Q¹»z r$2¨M•»ÎÇl–@å8O½•K ¯ TÞdër*× y*OWuTþÖ1©¿@™Î¾Pù™d±A-šöŸÐÎÊâ¬%c•  $üÌ#ÉA²ò³¦¾ãoáÕ;P¹Ë åaÐt©Ï6ñp;Ýœ‰Š¾`­üN/œÆ¯>~5°ÙùW?†ùŸøÝë~xý>“òÿæ§¿íü.ù¯ùÿqÍÿaAW{å¿jÎ5™.J¡õà帿Ræ¡X*‚¯Wë{ÿ/õgå,ò_ºä/袛ƒ›ƒ›ƒ¿Ðüýë¿x¦ endstream endobj 1302 0 obj << /Filter /FlateDecode /Length 184 >> stream xœ]O1ƒ0 ÜóŠü‡BXPº0´ªÚ~ $Ê@ˆ ý}:œ¥³}çsÑõ×>ø•4›®Üù`.ó– òG˜(¹õf=U3éÈŠî¦ãû‘—Ü¢Ûù]OX> stream xÚ­UMOƒ0¾ó+š iñ-64^4hâÁG²ƒzèF‡$Àc½¦Aé&àBHKû>Ð÷ AuQäš2fzö ­S êÕ"BÍäù^£‡:R’VåM ]Ü9¢`zàQlÚTAˆ^ôÛwž—¢0cLw/ bÛŽþTl£‚§iœE±¦Žeé¶m¼š|‹U«=]ÉÊ®-·m‹RjºÈÙ&evã,¾OÊ\d¯àÀf›•»øCÈ9ÈËjBå}%}U:ÄrMô€ÝÊ}˜-HøJ$²dÂ×ÑÏ1Oâ(»~Ä+¾õü”2“: ¨hC öµô§ôNÊ-ÆÈùã_ÏWë”[Ž—[väÚ§—Çër_£ê,G>(™=Pmc9ÖB)/¢¸î'É7ã*Ù‹£ñáDJÀJ¢Á~“‘D< ¿ˆæ%©Què,e´ }Ò¥lÇ€¾ïÂÃ[REÒ? ]´ þÿ>Ãò 'q$¢VŸˆöOè™ò9"V žá'ÃXºÉTOþ…?…+– endstream endobj 1313 0 obj << /Length 1785 /Filter /FlateDecode >> stream xÚµXKsÛ6¾ûWh|¢:EàË7IÛIÓ4Ö!Ó$˜‚$ŽIB);ʯï.")…Rš6žŒC`,öùíBläÁ?6J½QnÊ“QVžy†ª—#¼{uÆì¾ lœôv>ŸM_†áˆynê¥l4[ôYÍæ£ÎÍJ¬©Ç“ œèr<áÇ•áœ;oTU7¢š =§{!eMVÓEŽ1Çp¢åß›\[!óª–ºA(ÌÛì¼\+ ÌC?l½ôlHƒs D!†@3ÅŽ\æUe@ij±·)À4â…=€ÛÙä01`t¨»3GíÚl×’eåpF"¯µ0žº‡‘Ó&½ññƒ!å…¸Û ²Ðª<„jÆ=—‚4uãô„¶Nº½Á{Rï±3ö[5Íúr:-s­•v3p¹«ôrZŠL«zZˆF~žfàßM­¶Ó!u!6ÝäÀ5„ObLîbc ™'‰A¤j™IRƒöÅ=¯ÅL¾¶.²šç5 ¶$ׄ¥PKc›Œ°ÇÄmb²f…ÈÚJ—˜D'¦;Ñ0`Ì&šZ´¬`= NµqGùY@ FqF@F6‘¤Õ¦1õkPuܺC"¾ZoTB®²Ö²jN%³¹ =}ËØìÐïûïtZ$5ELˆý€~–ÅvœpçG»k°dèw¾1³Mm’‡‚>û¥.#âkbŒb7=J tãÊšçÙëzènîÆ^Œ5±Ý6ëj¢)•Éa©d£ù= ðæåí-ºøÄb~µl6š(캛D©ŠaEǧK¤±X["ƒÔM±Â–HÓÕ@f~`ÝLÍaf]Û_Z@ [Û×t °IjìØd=p¨†Öõt=õ“€røëŒ³µ 81hmLmj/Ž 5‹ZµÎÿ˜±ó‹ó¬Ôð ÕùéP†³™Ò6šªyMW7 ¿¾©ÞD¹üž`Äœ uæ°ü»mi¥®†í*Eõ `&MÁè~¬¾»6ÀLÚ“½Â„ã…W¿¯ðÇqd“ó>prtgc*¹™xäÜÀ#|ºÄY^éÙ4À]Ûå ÕÕƒ³žûNr[)zˆr]€_*a)!@ Œ—!qTešÌ¤×Ð@S¯0 ú Ž€‹?Ëù¤Fcì}±O> stream xÚµYmoÛ8þÞ_aä“|ˆdQïî"Ú¦ÙlÛÝ-69àpmp %ÚÑEoGQI}AþûÎp(Gv¤$8ì¡@MGÃá¼ñ†Í\øÇfKwû¾³ ’YZ¾q5Unf4øãç7ÌðÙÀh8ß_¾Yœ…ጹÎÒ]²Ùåz(ê2›}³>\óF 9·}ß·¢·s;B뫬7’—e^m涇žgÑüêòÓ›—»Í€úJ­ó©ZÑP-ƘÍ¢$p˜f¨æðihý“7ëSPeÅUûÝ ÝVI­®µBæ¢=9*Ž a¸g'GÕ|Å~BýgQ0ÜÖfžl:±±Èw—ÅÄ»o¹ov¹Ö…âRé‚Yw¹º¦‘º4ð\–,Ü`á2šKQÞ P/H˜õ…$û³ØYÆ®–빓øÉÌs\רðnlÿÀ‰ÝxfØ.‘m9n„d?XùãŽÌfò?Œ¢üfî%–hqêY¿<³ZáíÁQ*qGƒL¬yW(šäUÓ)½…í¹KÇeàaæ;,d´¨Ò¢&±20“ž`‘u^ϽغÓßêÿ%Äk‹³ºƒI[)¯p€ó¢ Z+Ѳ<ã aŸ(Z%eôºÙ7ÖûIGKMœx:¤éÓ!a]“ £H?¥EQÙúˆîþÙ'ƒA´´jI¿æT*àZŬYm:¾DHpñCa,‚UÏ·Îá0ôyÞÒ/ž_‹›ÛÌúÁË%kØ‹Â"ÚKü m˜²ñ°%ÁIþ£kۼߦè••NšWT>l%¸"OqXm*óFÑ w`4 ìy~\Wd»ôFã3/doǾsM‚/€)x¹**qôjF׊†§7p˜o%W×W÷¼Rª–¹èˤ€–W÷p>§úߥ_®îuœNHz• I~»º_ñ•(†%mߌ¶ºèšFû¤–ÆKGäÚ뼺2¡k?ñFG-ˆ¹câÑqƒƒÏ5(Wõ*LgÕÒ47¿¬1nóLd$s…ó-­RÞá¶Ÿ>Ó* ×oæadÁß^0,p`žÃ ð=ů=`»döjó\+Õ´o‹TñÊ©åfÑÜlé¿oÆ, Vt’}ë^êR IŠBŸþŽî ¥uY‚ùZš‰Šƒgqì™Sà ­û¯Ö¼Ì‹-ñaÜ¡7ò9VeLIdáôSð•v¬(ðn±+¥zwÞsPÇ­ìã‚K½£¿ô¬.4í”kš«š~yUƒÒ’&FÅÄ·pcJ4ïý «àÎÐâ¹^Š#`‰ñ!] EõL:öÁ6´Ñý ÏŽÆK›Ñq,/ûp{4Í ü5¥æ”|ÛÙÞ©÷b“W§uÚ•¢R÷H[!¿úÛÃýÏï??Ü£ãFüC>VÙÞ÷)` ÙÀÎ83’¨‡×ö„sÙ[NI^µ ‡ 7ÝRÆÖkSL“aMU Ë[g½v2M(šàž¦dÂ¥‹L¦ŒúcLÿ2¬Á¹Ú¢gÀIÅñ„ Bpc•}¨Ë†«f¯®£Ú* 8õoK}n˜8£É­N§Íײ.'®oXu'nÀº+è ½_ôÝ‹' =Tm® j€ñº¥ ÔYwNj4…%` 5+ü§Ã”+? ^¼5&¯탉tFˆajDŠp/­‰¼ÊÄJ‚&x‚ÃÊkn8±‘uù±2w Mç flö“uÕ¾¦( ãçøè·Z–¼€Á¯`ç¼)¶0¼H¥ ~¿²àšT¯Õ—|s­ŽŽÇ*ÆÑ9—™YùE-Oël#úÉûN¢¸S.o´\Í©G§ùz 8‚?þH‹®…³óy‡/¸ê踽x”ØA»W·9$ç…|@8ÍÜ €CPhr>3D¼ª`X¯ ¼ùZC`~dx4´0´ØÐ("‡ ÀCg -†ï/0y ôÜö€} ݃5”—¶îd*žÕ+á@yZ˜~'ÿ°ßÉR›§²†îÔn³;«ÓvÑœÈÀ¡í¢ÉÖ{“Å×Ó3ßs]÷_ð_âe C‹À‚(´.æØq¥b*,Š|­[uA}4»BÈœ:º§p­ã`iµc‚‰HÙ«þI€w}ú 1ß®†‘  ¡ªJ Eèn-U9uF´LÅ—1_>’m²}ÊLv¸§î”nCèhÖ˜Œ8Fzƒ!þÓÜŽ€9„_yZbÒÕ©»êT„²º•ìRŒi$é®Gºôà'R´˜ò;(ΖÎ2ò¢áAŒkNÏÆõ|¬ð,ÐÐÆæAÁ÷¦ DŸüRø•oòô†¸KOîÑЋDU0ë˵ô9—f^è&YÌ$×Ý{u¨"˜îešëx¢àǦ¢Ç…]1FØ»¹&·9t¿‚–„n…Å|ÿà¤EmË‚Š;ðèÖ$~ÒšÄT¡p…î öz—6$ú‘Ê‹\'J¼—Ík˜'_½zœÃ´;Ü?qß‹_«á~I‡¡Z ‡·Û©º4†2æøðíÄ3Zôd¾T«|æjXˆÝ„³°‚Ò«£OûøÈ€¥&OuqšÎ aúθw¹+ï3"ëîp©Ì*7K¹ 2Ü‹+%d…3 -1óv´ƒ®Ã¶„P lDÞ®; "ˆH4xu<÷a½âåø¹t;¶ §Šðë5>¬—‰È›n¨!Ô»éOkÓ õô€<Ëô]¶¡i®ˆ¬éü¾µ)à.-þ‚ûαj?Zë0LBÀî„LSƃí¤Y0ôKØ_,\?P2«keþ©•ÂK©%—ÐêMíìZÅjJif]€IÊÓÅÍëàÑâx9>» \©žMåg¡.aBÐ<õV}»­óŒØÀχ¯ô²¦ë³ŸôdžK«÷ Qª÷ÕBÎz"Œƒg3V's'ðžKXŒM8^o©iIÏç0` (B{oEÞc³=)Ôìªß)pÝÛN¢Ë8fÖ;|Ô/TtŽõsRàûئ+8ð&P©üµ8ñB!uWF5Š€’]ª°Ø%º®jûàš>Ò +Sø9~(dÝÅ‹núrz†ÑÍþHžÿ8 ËÒ<]Ò‹&ÀùV‡”’ýkEsÒç¾¨Ì (†Ú6f¯~vò[}Ãi[O4Ñ^¯¡'J¸éo¸éà5 ?9@°w€IåÆÓ’±éÂ/£}¯$Éÿƒ‘'uÔ_gØ.½[Àmo^–œÒüY¡+Äô»ÂóEüÙ¾žÖæÿÕÑå/ÝÉ÷þÉ‚ˆ@íOÛž¾ endstream endobj 1198 0 obj << /Type /ObjStm /N 100 /First 998 /Length 3118 /Filter /FlateDecode >> stream xÚí[ësÓHÿž¿Bß>¬æýеUÇ»áxܵ¥Ø“DYòJ2$üõ÷ëÛ1‰!‰Í£®Š¢6º§ß=Ý£Y! “ñLˆÂe…§_ e2!9ϤÐ4£2¥ÍÈL›[dÚ;šÑ™±ØfÖF—9Îw0P™Ó‚fŠÌ‹!²BD,ŸFÓ P¹ä4’XÖÐK&¤‹o±ž*h Â2¢ðÒèËÓŠÆÇek-"1rœð%ö†P%P½§å¤È Í)’L®”`IYdR%8›I-h(I9VÀµšà0œ#Ià ¨#…Q\çÑ•àÎc¤‰? E’¦0çH¥4´Í”ÖÄ3–WÆoMçd¦l\Ù×¥•AÃk¢ [¨ÂÆ‘È4ÜC-#]kIM¦€^µŠtÏ´Ö´žåyµdUOü˜ÕFy­Í´#ýK /ˆ+ØYûÈ©nAj‡N2õ ¨ª"8'3#á!¤a£‘µ4ŠJs.3::Š3p”(®³™“>ÎùÌ)AàÌÙ‚Øg €äs…$æ½ÀÈF8›y½þ裣Hx…'Ý çñ*²ì=FžÔoö&*Žï-çÞÆ_š!ÈÄFoWÊ.Ò‹H•Ìýœ–bqtrûP,s„X´Ñ‹ª$}x_) ?QÙzu¹²õbóÊÖó­¿š¢ˆttÅ­wAW/D^ô}Øå^®oHû!z©Šôr“ñ¼¼¢AréÒÊ7úºá¯þºá¿~ßZ¬9|ô~ó†Î_ðæÀÅ"þ‚½â³]X¬9À*äæò×9²»¤½ÌµtW*ar#ôæ_Ë7º—ñ£-úÑýh‹~´E?Ú¢mÑ7l‹¤¹²Búä+¶E”ËÚæ‘âòsQáV;#®V:#m¨ÓÜžÿ5þ=…\\•<ï)ÔâzßyO¡8¿º§Püò3ůyÇLñK—å7ßçØ_‰ËÍ‘âf‚¬4Gj~ë/ÞþøùVm]¼NA÷]ãe!sÁý'®˜öøÖ‡þÚûœÓ½gGËE¦ ŸÆmFôS×ã8}ƒ-\®èzºò9]LÓ<>¿½ÀjvN÷ÅÓGéÏ­ãa˜þÌØ¤êº¶ËGCÙämw”vÌžÕˆÃSì¿ 6±FK‰Ñ„]l$•_îþ-{ï„ÛOu)t}»Øî³›’kÜVná¶s‘â•ó4H7ÚÒuóùÌçùsÖ5ªÈ­§Cô÷FeFÇçk[·‡y—vž ìúëä†n¦ŒÉ ĵR.VÆR:ŽoÄF; MÒx^ŽÛƒ£aãÑOälåðS?>ùiÜŽP8‚ßqÙ{6~ô@V†.9ÿ|Ž™ÊB}ŸÔ9‡aµó¹ ÿDÅçÿ;QÐyæ6^¤ÿ‰Exž+´½ÒÚÜIq#iÊÅ)Hžd:„¯„¼jÙQ‰¶;£& éc?9:ËûwG Nÿ>Äר endstream endobj 1328 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./tile.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1329 0 R /BBox [0 0 425.63 90] /Resources << /ProcSet [ /PDF ] /ColorSpace << /R13 1330 0 R >>/ExtGState << /R12 1331 0 R /R7 1332 0 R >>/Pattern << /R16 1333 0 R /R9 1334 0 R /R14 1335 0 R /R15 1336 0 R >>>> /Length 308 /Filter /FlateDecode >> stream xœÕ“MnÄ …÷œ‚8Ø`~NPivM©­*M¥*‹^¿l 7h4 lÁ{þlg~¬´®þä<žfÛ“ý8Ͷ#Ééíqn{±çñmrIÀ6°³O‰cI€!s¾èÑaÈd&ÉiѼ@;9Áì‚BpàÇ%7u5‘§†ƒD$4Ý:½ªY#PÅ «#¿æu¾±Í7ûºªÎ®™bÇ‚úìÚ²ß3@½ôœW¥æ½²fªKiqímHÁöÕ¬¤uäw%¯[x5 û(8 endstream endobj 1333 0 obj << /Filter /FlateDecode /Type /Pattern /PatternType 1 /PaintType 1 /TilingType 1 /BBox [ 0 0 14.1732 14.1732] /Matrix [ 1.00186 0 0 1.00186 45 45] /XStep 14.1732 /YStep 14.1732 /Resources << /ProcSet [/PDF] >> /Length 102 >> stream xœ3Ð3T0A(œËUÈbäršê™+(äÀ˜P*‡Ë™ RÁ®ÇeªPÎe¨àÅe¨Åe àŽÓs= 3s#°nd6Ĥ`.˜ŒÎ…‹À­ F¸!ÃyÁ\\‘™)j endstream endobj 1334 0 obj << /Filter /FlateDecode /Type /Pattern /PatternType 1 /PaintType 1 /TilingType 1 /BBox [ 0 0 14.1732 14.1732] /Matrix [ 1.00186 0 0 1.00186 45 45] /XStep 14.1732 /YStep 14.1732 /Resources << /ProcSet [/PDF] >> /Length 72 >> stream xœ3Ð3T0A(œËUÈbäršê™+(äÀ˜P*‡Ë™ RÁ®ÇeªPÎe¨àÅe¨Åe àN–9Á\\@|. endstream endobj 1335 0 obj << /Filter /FlateDecode /Type /Pattern /PatternType 1 /PaintType 1 /TilingType 1 /BBox [ -2.83465 -2.83465 19.8425 14.1732] /Matrix [ 1.00099 0 0 0.999514 45.0375 45.0332] /XStep 22.6772 /YStep 17.0079 /Resources << /ProcSet [/PDF] >> /Length 69 >> stream xœ3Ð3T0A(œËUÈbäršè˜[((äÀÙ††ÆzÆæ 9\(lš ®p…<.ˆ1Eéd’ÆÈ?z endstream endobj 1336 0 obj << /Filter /FlateDecode /Type /Pattern /PatternType 1 /PaintType 1 /TilingType 1 /BBox [ 0 0 28.3465 28.3465] /Matrix [ 0.998347 0 0 0.998347 45 45] /XStep 28.3465 /YStep 28.3465 /Resources << /ProcSet [/PDF] >> /Length 101 >> stream xœ3Ð3T0A(œËUÈbärY뙘™*(äÀÙ0:‡Ë… R“Á®fY˜€qQ*T(j¤¡‰¡ž¹1X5” ¥@f 1A ÒД Wˆé*¨†\KW “z/F endstream endobj 1337 0 obj << /Filter /FlateDecode /FunctionType 0 /Domain [ 0 1] /Range [ 0 1] /BitsPerSample 8 /Size [ 256] /Length 12 >> stream xœc`Ù endstream endobj 1338 0 obj << /Filter /FlateDecode /FunctionType 0 /Domain [ 0 1] /Range [ -1 1] /BitsPerSample 8 /Decode [ -1 1.00787] /Size [ 256] /Length 12 >> stream xœ«¯ÙÄ1 endstream endobj 1339 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./hatch.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1340 0 R /BBox [0 0 348.75 100] /Resources << /ProcSet [ /PDF ] /ColorSpace << /R13 1341 0 R >>/ExtGState << /R12 1342 0 R /R7 1343 0 R >>/Pattern << /R9 1344 0 R /R14 1345 0 R /R15 1346 0 R >>>> /Length 154 /Filter /FlateDecode >> stream xœ­M …÷sŠ90S°rwÒ#¨1Ôİðú†Ÿ©¶Ûó^òxùà…Fš²úŒ3è0â-ƒÄ}³s|+‡eÏàýØu꺩f~uË\ÁáÏ@øƒ§]w˜¾`d+±=(–FfKâÒâ¤I²[/¤ÿëZ“ºö‡Ö›^=Ø£$«\žZ"+#h;.– | 0e endstream endobj 1344 0 obj << /Filter /FlateDecode /Type /Pattern /PatternType 1 /PaintType 1 /TilingType 1 /BBox [ 0 0 20.044 20.044] /Matrix [ 0.997787 0 0 0.997787 0.3 0.3] /XStep 20.044 /YStep 20.044 /Resources << /ProcSet [/PDF] >> /Length 115 >> stream xœ3Ð3T0A(œËUÈbär虘€„sàlÃe€Â©Éà Wȳ Á¸(,dªPÎe¨àÅe¨Åe àŽf<˜`.]C=#CKËcè™™UÁ„tª ²0ª@.)À endstream endobj 1345 0 obj << /Filter /FlateDecode /Type /Pattern /PatternType 1 /PaintType 1 /TilingType 1 /BBox [ 0 -20.044 20.044 0] /Matrix [ 0.997787 0 0 0.997787 0.3 0.199609] /XStep 20.044 /YStep 20.044 /Resources << /ProcSet [/PDF] >> /Length 115 >> stream xœ3Ð3T0A(œËUÈbär虘€„sàl]#‡Ë•R•Á®‘0T€á¢T°¨©B9—¡‚—¡B—‚;šHFséèZ*À¹\p!c=33°:˜BT®¤* OÜ+1 endstream endobj 1346 0 obj << /Filter /FlateDecode /Type /Pattern /PatternType 1 /PaintType 1 /TilingType 1 /BBox [ 0 0 12.0264 12.0264] /Matrix [ 0.997774 0 0 0.997774 0.3 0.3] /XStep 12.0264 /YStep 12.0264 /Resources << /ProcSet [/PDF] >> /Length 134 >> stream xœmQ ƒ0DÿçsÃnÄ`O ô¯ô£(‚#د_²t´ “áíF‚RÊùê3cE1%Ä”(œÞu†ì|éLxp1¯Qí¾G‹:nP^¡|A8ðsG“$h{ºf¸Ó^B{鬿YSkþìI©Õäݺ§€¿ÑF8PÏ×¹áÕ.>x endstream endobj 1347 0 obj << /Filter /FlateDecode /FunctionType 0 /Domain [ 0 1] /Range [ 0 1] /BitsPerSample 8 /Size [ 256] /Length 12 >> stream xœc`Ù endstream endobj 1348 0 obj << /Filter /FlateDecode /FunctionType 0 /Domain [ 0 1] /Range [ -1 1] /BitsPerSample 8 /Decode [ -1 1.00787] /Size [ 256] /Length 12 >> stream xœ«¯ÙÄ1 endstream endobj 1352 0 obj << /Length 628 /Filter /FlateDecode >> stream xÚ¥TQo›0~ϯ@y2“¡¶± tÊ˶vݪmŠ´‡l.¸Áj Ô8ª´_?“4¬N“©ŠÌq÷ÝçÏw‡d~8ÈQ0K’8§YPÔÔ[Õ*p›Ÿ'xð‹Œctàùa1¹¸f,À(ÎQŽƒÅý!Ô¢ –àcÅ[-T%IÒË0¢”oj³R¼®e³ #2c„: /¾N®ûdÆz&+ëù’VzH c§A:3–Œ:f¼,!†¦Z®ÅÚûj¶ë½¥cà#œÄ˜áqȽ\¯EiCž¤®j®V²y†HëR³”(áµñ´pÐ~ÀÆh–ïýdÊ¢ŃPS8lŽsÇÝ)Yíµa@IL 2ã ï¦vÓà/Rç/ endstream endobj 1354 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./makepen.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1355 0 R /BBox [0 0 166.01 200] /Resources << /ProcSet [ /PDF ] >> /Length 3477 /Filter /FlateDecode >> stream xœí[Krì8’Üó< ÿÏ1ú 0cmÄÅÌýc ’ð@¦¨n“Ɇբ^ããðˆp’)éfÎÄÌÓùÿq8ÓÁsíæ& “FÏB:Δ™×ÉëÀ”3³PR3íæ¯Ó¢¹`\Ì_g”6† •,Â3'ÂÅb­f&øKÔa92Q¹úÁó5-·0¶âÐkmœ„fZˆ×Ú8/Í´¯µÁ Í´¯µÁÍ´¯µÁ0Í´¯µÑši!^kƒuši™„âÌ; Î53 §ðš9çfÁg6æ°e˜HõŽ(á“aþšŒfB q±ð‹?¿d;\Ï|XöލÓR2Q¹úÁ³q§M`¾âÎÅBÅ]±œÜ•¨ƒ)¡¼bJV˜¬ß gÞs²hFwGwGw_v×r³uN)ɬNÜY˳PÞ2gÓÙŠE[•;W¢ŒpLoç720­®í SâU,gæ•«<£¿ÿa wÔ‹¢nðÛ8?zÝ;£S¤ÚB¼Ö[LÒžÓj ñZoõ„N­¶¯õVw¯sHë,—ëë­Ù¸Î2¯ÎÎ/ݺ3StxÕ'¼¾ÞšK:M´Î‡ì×èçGðXîëÆã™âT¥ÃrhI‰º(@~b¸Xö‡Š3¨޼%æœO@ó1, ©˜ò³ðÂ0)‹Â9ffám`jlÚ0ï7Ã#9çé#×–yS>† ™“îâXΔ9¤Tý"8^ð<“)“s’q? .öˆÂ,±qn]ZŽb F2¥Sˆ´LÎØ¡Ød ½Ö Ò`€¤–ˆl9.™Ó3Jl ÓBÆé,çÁ:$Òîîoþƒ±iÚqVccž2Ñ—>æë­AkX h!Në­‰m)2F}ÄÞ}¨¾jŸŽ-ŒçlûÎ'G%Ïí[¡:K|wªÄ¿MÙ¹LÜ «ô†’>ßÓÌCêÔHb“ßxjjIég^·ž‚ïIæÁ25ŽØês±X­·é*pV³`[ÏÄ÷” ó`@[W,%F;ɤ>sÒ‡ä{ʈy° ‰ïf?S­…gBž ÏÉw”³`‘Elmà’§³¤,ÓK“oH3&!Ej±%ÅRVº4¡¬<}H¾¥í˜ËØP$¢6¨Fô½¾uoø$åí÷wÈ>ÅÅHçþ%ê‹¥•»>Ûzï´ F-Äk½Çµ¨…x­?ëÀi!Q ñZïõòµåÊ x­÷¦‚ZHÔB¼Ö[óÕ°¨Ù“¡ˆC‡"EŠøÑŠ˜-RJ¦Óœ•̧RÜ1}ùÉNÎ[g²Â²~`a»¼ÖKg÷¯ èkþ!8“ä©ËŽØâ¶„H噸B1jû}½Æ{>NÕ[:ò@@[].LË ™¼¼çkîXó5ÿg—Ó`À[Ó¦½Ý~‚RbŽ7Ü’¼äÿL s¬8bcêµ’é_ÍÇ¢æ6Ð×üŸÉë‘êÔ@bcýJDžÍ’°Œ.}Íÿ™6yê25ŒØTÌrÙçBȱïä-ÿgÊ^ò`@zD´µˆ~wÙº3ô¯ºý#ìôï“>€¹ODØØÄ—˜/×È ^7OÿÚrýû)ðZïñظÏbÔB¼Ö›¡wJŒZˆ×ú“Þ^ ³ ÓzkD^ª?&«|Ö[ƒÖ°@ÐBœÖ[Û°¨Ý»ÞÕno‡êÕªßÃÞõ†p¨þs{;T¨þPýö®7„CõŸÛÛ¡úCõ‡ê÷°w½!ªÿÜÞÕª?T¿‡½ë áPýçöv¨þPý¡ú=ì]o‡ê?··Cõ‡êÕïaïzC8Tÿ¹½ª?T¨~{סúÏííPý¡úCõ{Ø»ÞÕno‡êÕªßÃÞõ†p¨þs{;T¨þPýö®7„CõŸÛÛ¡úCõ‡ê÷°w½!ªÿÜÞÕª?T¿‡½ë áPýçöv¨þPý¡ú=ì]o‡ê?··Cõ‡êÕïaïzC8Tÿ¹½ª?T¨~{סúÏííPý¡úCõ{Ø»ÞÕno‡êÕªßÃÞõ†p¨þs{;T¨þPýö®7„CõŸÛÛ¡úCõ‡ê÷°w½!ªÿÜÞÕª?T¿‡½ë áPýçöv¨þPý¡ú=ì]o‡ê?··Cõ‡êÕïaïzC8Tÿ¹½ª?T¨~{סúÏííPý¡úCõ{Ø»Þ~Žê7fãØSÕî0õ›Êw£/¿«ŽßOÁo*èû™û-}}5׿¤»ß­Î¯©ò=ý·•{æ3Ÿÿ÷ŸIKͬ÷éâ¼NZ‡íŸ¿&íòi˜‹ßyMn×tumy—=k+Ô»F-Õµõ–=n©®®€Ô`ýËÕÐÕ‘Ë$SÞºœWÇ”w>¡åöïù¿^Û³\s¤œÎX¼ŸÕÌ?¯“ób³Ølùš<Ï>> D>þðÁÌ»¤HÁL('ÐÚ¦O;J·_ÙO`N¿óÚ~‚kާ°Âsn–V0'ÌÆŒ´É"²e[ªÝÇÛb1uÔé£N>¿Ã—à†)f©ãf—j¾YD¶$¼ÙÇØl‘uú¨Ã3ÓŸ´fÞª9Xæ“ÖxŸW©N[ФØb¶gæBÊžQÍ'I‘ý¸v’yÄa^¨¤½ã—BíøKSlØŽwmR¬Ú·T \' ™¡vl5Ù,C‘ɾI„ZªZ'[çÆê±5ù Ø‘ÀŽÜÙ©Fx©†øäG? øQ?tád/Ãa‡þzkž¬if’ż˜mÐÌ…íy”;Ÿ,&[¾&!øæãD8,uÔéãOŽ>ͤPékVÚ2¶b6=òÌ2Ò ÎîáD6È:äðЇ‡@æ©„b2¸Y:Á¸°³š%‰V| †±L‡-@–¿å%•úæùk¯í!¼Îej‘ò#\>ˆÒ{@>g°{>"ú´¿ épj ä25ŒHÛ$k‚%ðÿZüÏ)[Èœ­ÉeHÉ´äƒèš/|©77É…LûÉ—¾tÅ—>ø"C‹‰ózãfùwûõhED¥rÌêTLl´sLðp@DÈqòV1kõa V3mÃìT`ÚšËÆÆ‚[ŒÍ1>=rX}Œ„ÇÉp¹á*iå†[gÜTKÂYû¬&Á"ŃàQc«w\h¦ÝF`Š "šçg+NFæ¦d‹ô{Ó¬°ûáQ°Èf,¸ë„I°…@ñ xÔØSn÷˜LX€iÂ5Š“‰T0±¯TñTu`0 ¡0(›¹æ¡ó(÷¤ó:ïêÎë×·ª5ï켃ο†@ñ xÔØÔ Ôª4¨E¨Uô¹ÕýÏåõ¯_þôÖátúVùrÿUaûžùú)wŸóþªë¨ÓçzFŸæÙDðé›X+%“N¥G<Ŭ›uðL=c–ØÂ§”O1ªÄH©RNSrRùn¾VÔ^ëDò`@[L)»ÇH•±éý¼Úí9©º’n/¤ß äÁ:€$6{\KèÅKñ;çn!“—°A¬£IOÓ³ŸÇoxóoîJ Ù“7¼YàíúØKxÃŦÏJdÿ|óþVÃþölÿïÕè„P¢–VîÚëîI¨ê`ÔB¼Ö›œ¼béú$†^ë=v–ÖäÖ^ë­>5,$ê¿o½aÒÏJ&“ôÍt˜eàÌ9c’Ø„'BŠGŒà)¥> stream xÚ•VKoÛF¾ûW9­\’áò­¾4h (´ê¡prX“+ia¾º$-«¿¾3;KŠŠ©$…Þ™ùæ¹ÅW>üñÕÆ_¥aèm¢l•W7¾ÑêýŠüzí †îÌòçíÍÛq¼â¾·ñ7|µÝÍ¡¶Åê½?ˆ¶—zí†aÈ’wk7ŠböI7{-ªJÕûµ¤q°([ÙþvóËv ÚÌ -¿“çÜKVIy<Œ(³¿×YÈš2ËRV‰u± «¥,HÝ7¤é]“¦ùìó”¢T¢3%à…ªI{B fÐXd‘̳x0Ÿš®ÿ3תí­MüµMÊž•<"éøìMaZÑC;ëÎæÕV´-4Ì…‰ mqyèñ˜*Í­eÞ—'¬Øƒð {?t}SSâ³vÍ®]Î4œõ¹€š‚x°os~¤@$äMÝõzÈ{Y88É-K€hÖAÊŽ4_°ëÖA¾ˆª-eG’²øUc@‹¡”Km«áTÎÔ‚¥îa}Y”±-FŒh‘*qšx´Ž$˜â¢$eòs•VR5t‹šÙhÑ[î S ŸýØï¤½y€E.xƒCaüŹÅ”ü=yÀx @Ú…)UYÂ`0pa5ýïʚؒ€¹ÔM?ÚæåP\z†g¦p®„It%ÙØaæbè,à&`ޝW©ÕŠJ•º£7ÝáÖ £»Ö_Y}0þîê‡ ±-ï®ìA–zIP.úWbý¾Ã}îVU‹GÄÓâLvAâ…¾EÓ›‚fÅ}TUKX­Ê$YÁ^Áï–gÜȨûgZÞw¹(Mª¦y;Ôª§›Ewñ¢D‰Kd\(ŽCöÎñ zéPÕ¦fç±ù“ÑŽ¿Ö‰ìÖð výÌíÖFx,ùbL­@[ÿÉ® ¤7ý¿p2åçÀ…GôÄÒs¥óR:v¯ñ.Šxû!‰æ;àòÀK`m\˜¹—vx@ÊéòF%Àck˜YêÇôæS?b¥Ë\íN¤ÖÂÒ"žÑ†ˆ¥Z=ZËŽ#–Ð ^¬>ͽšò´ojÜ(£3 ÆG§Åçaì 6pªqÖúJF2FÇ“–­–%+s›5ãe%ôð«‚ÿ'ªG&ˆnÇšDóAÑm © !t¡jK˜Ð©¥UÂ/§a±(b–9,µƒ§i n ˜® CƒdaÔTœˆËápÎøæ5øLRË Þi0žý9Ï•×'tމ4i˜Y˜‘ðkߢ×Ïð¯ºTOkÊq~p¯1fÄ~—½@Ö\à›âa–ý†atWÄ*Ï~i;|º6©›šSÞîE ñ0žgœ©˜læèHäŽëÏåà[Àøÿ?î»DD endstream endobj 1365 0 obj << /Length 1669 /Filter /FlateDecode >> stream xÚíËŽÛ6ð¾_ᣜƊ(‰²”"‡mú@ Mš½mràÚ´ÍV¯PÔÚþûÎp¨‡w%'z, ‘3Ãá¼gh¶à-²`±Ž"?‹ÓŦ¸ ,Tï´øë·æèV@¸QþtwóêWÎ,ð³ c‹»Ý˜ÕÝvqï½=ˆÚH½\EQä%¯—«8æÞ{]íµ( Uî—«pÍÃЋ³åç»?n~¹ë/èu©¾ r…iꇇEÈA”¼ú½?W7:äùc~²ˆÓÄgë5épw ʼÇ%çžÈ[‰²ÂÁd|ðÞ’”mž×ÂN¡e­e#Ëe¸öLCŒ}6JoÚ\ µÒЫÑ6Ú]©ˆèSÀÓI´•;Ñæ`ìG°mâ9z™çª^2ϨȆ©c—% †Y±Ègœ‘²DD›%lJ>¢´rKÐFu~¦õØuì¸i`­k‘€D…Åèv:·öá(µ(›]¥‹×ÓæÅÈ97 D„¨ó‹M«µ,M-ËIƒ{>“x ^±ÐO€rŸŸf¤ö§€­§}–$÷g JpZ£Á‚yàC²I‰JæÂY/oˆ|§«‚P?"­ÔG­ŒµEt¬EY­4m:³âº/?æ©V{Z³âb0+rÆhõКÉíÕ¹»z$yä´ý^’k޵AÎSâ«I3ò_ aQîó.pô¾-œm&݉Q—úIDRÜæyuœ6"[<ò:÷ »´sÀ!,ùÅieÑÖÆˆw6ö!U¢òZ5ï¾·Ìs´.µhãî;{ª41Æ@lË\6M%¾†Òqi^'º]«í–Â?öŽª/O‹XÏ] QЇ] ðK.+'È`àmU§™¶1 Ò 'é\ŽZY]zQ ¡Kð²#‘bƒSºÄft²jó-ñÛ¤s†LÿHCÌÖè H+pŠÿõ êøÐ*i¦}îž±Îabu®Z”:äOõEa\9$|/bN{§owÒé Û)}C>Ò7ŒGÆûF‡¾ƒÄé1 œùnt)0Nl‹ÁÏØK¸'©C¨qGô%H ÆÞn"›°ÜÒ´Æ-vC9â'\³”[¨¦i/¥êl½šI#ðä,Ï"ïÖv̈2U¹ØþÝ6¦èk1Â:ܶÕÔ‹Ò®A'„j—Ô#T¡nÝ©ú šž†ªœëô‘÷¾jÌÇVõd¬u]•äßTÖè•ÞªRÙØ|¶Q¯\Žl†ü€€¤ºƒèò¢ÄÂl°ï†)ÔaßjÙg›#ÕòK+#·ßIß‘2—‘qªüIþó>ÿ`œ€˜*Ò|œÿ<¢°Â³VÄÍ‘Q¨ÐôƶAñl”¹çëל'®™ª—ƒnnÈ\#BQS/ äËPæ/slÞ¹×K5yÉ`‘ra"ŒªÊy‡Þ“aíµVwZÜ‹šv°žìó•§À¢¯Vh‚®F/ÓqšC-Èè%fÁðàǨë\a: ˜r8"‡Yæí[µ•´I=ü¡£Ct¿VtûÆ`³ì(‡lvèEÏ'CÛ`&Jm­6Ð l5áé¡°ýÜ 6dg Ç$yT‚6nnÀ“ø€Ú®\ñÕÂTsõÈ^L›Ú5]äS^ܳör¹3ƒt×ßão;¹üŒ‰™@“{‡ˆBÚ‘O“ƺi ’žDQÛŸ>v2x­<ó*Pm°ÐvGÏ"¦*H媱þ=ñÂuFd ³ý:u; U9z˜çÇ©h×–›.àñ·¼ÃpHÒ endstream endobj 1370 0 obj << /Length 1534 /Filter /FlateDecode >> stream xÚÅXIoã6¾çWø(µ¶ª…’¬´@[t ô4h ô¶#Q6Q-É$VúçûIIv"y§3E€˜âò–ï­d°ðá/Xdþ""/#ëE^ßøzVlfðëÏ7Ý·‚«£?ln¾ùÇ‹À÷2? ›ò˜Ô¦XÜ:?îè^1ᮢ(r’wîŠØù(Ú­ uÍ›­» Ó8 ØwÿÜüróÓf`³J…;_Š•<+Y/ˆˆK ÚȲµŒ7LHö‡û'+ÄQ0 hϽuÞÃŽdí¨ë`§NN3 •lq”8w ßÚafZP.YaÆÊn€#aêtæƒëŶ0˜Øëã­ ÿq©Ÿäjgé옕îD_°SyAl´ýkR­ykX0AU+<Ü·I€@âE~f(lvÌ uwÏ+µâEG¸cñ’fŠ önJ¢Õ@6ó¢u8m†‚5Š«îý”¼qê%'Z©^&<†ÁÑL˜h¿Ÿǒ˼0[O #w¼Dëû{Ê…Ñí áBáXE“·cÉzÁ5å áŒižæÜîmêF+£Îai–ú™È龨‚(ÍaÙ‹°«T=ÈœVì™®—k¦O[o¾C¿êæU8ÌGÖ#}„&Ñ«Î\°\ñ¶¹…n…îó Ð½…¹óIöf&@¯áÄ¿g1ŸÆ‹Aê´ºg çü6ÅÛ”ÿ„oʯõ¢ð‚Ä®Bt@Æ~›»+Uôÿ¹{Euµ»×t/¯OךÛ?“çïÜ‘Ä×ò«î3d}Ñ*¨F§ºÓf[±åQ-2…õ[Üå/}”árt y™çjΟò^pA¶ ‚!p,]j:Æö^}©Æ@°²Ÿ;ítè Ðî^X!ˆæKŽÛâT¼ag \­î¦5õ®Óô‰‰vó¼+¼°Çij}Ï{La±"¡—ÄÉi_«Ûeâǯ÷Ï¡/…/èï!U5\qZñ'låq(™­]i΄¢^³2m>> stream xÚ­YKoÛ8¾÷Wø(µW’%Yn‘Cw±»èžŠM€=¤=0c•%A”»¿~ç¥GlÑI‹B Éápæ›Ì|ø f¶^­–›(eûw>Q›íŒÿù.u X¸­üõîÝ/Äñ,ð—ÌîǬîòÙ½÷ÛNÕ­næ‹Õjå%æ‹(н/MµmÔ~oÊí|®ã0ôâ`þíî¯w¿ßõ‡õ•RáÊÄ ¢õ2™%i´ VKV‰Pu£k"õt™ëœiO¦Ý¡<À&³ë °Ø0‹• qØÿÕýG¸™fj®mûž‡#ªm2X|”â+|}­×ÝæhzÕC«L‰râÄÃä>ñŒ*̶œ) ¼kâ÷Ìtêü{ÚiJfßî4rÓè¬5Uéb×?ÅÒC«ž«bñöª,°ƒn½ZqÀ·V¥*ªmu°` €F[Éÿã68é>ž§›ít³Ÿ/°3j­e¦Õ£›g¡táâxhl«‰ãœ·:ïª"Ñ2âÁ=pc˜ßÞ#)òjµÕ<lB6vJ)nMÙT ÿ2DG¸#!ôQàY+Ó<_ÅøçBÇY›e ËÚd ŠžVLøàß¼ìnP÷š;³Ý- ýcNZ`šm›Ãx1+U6Ü èè#YnxpÛï!Mú¾h’V…(;sýÕ"ÔÞD.‚*å{ ÃxÃ(ÇÁ¾"å‡Â4\TàÓwgfªenuSáE˜\Øg €·ö~ÌãÄS–. ÔGŒC8È…ëŸB D±1ñ{1VËʌ嬚œÜ]µÈ+ð–àWÁÆ»c79ÇO®Õ¡Ù"0PgBø ¼1SEÁºšðpœ?4.ÛkæG’8¥¸;Jýtq^Lz ƒÅ„Úh¸HÎ…ùN ™ºH»3öÃ+ߟIø6Ùµx+)áSYQl8í9ø¬ÀGQÅ@‘@Ò³ Šôø±W¹æù.$#•…}„aÉJÎ ŠëHa””®+¹SËèºwÎèì¬ùéðW¹©-ä>ÙJ2Ì :ßzt“ÜìuiᢈŸg ´…d‘‹öø×̧R”£À¹ýnžãO ¦àÑñ‚rºš¸~¸Ÿ9ÿCUɪïZןl ¡æX/‡Og’^ôüù?ƒâÍÆ¤pò8mœReîÚ7ú‰}¨-ËGSœÅ#³‚†>}PL’Ä@2ƒœx2E1æ! gLÝŠÉGé8ë²ê å/•mo³ÆÔ­}q4’äÍ ŠÄ~â}FOƒèñ8ZóqÂŰa†A‡+UZˆ¤{þÜ«ºÆ2hÚbr/·@ToбšO¥,¢Š©`žSZF¾¤UĽ±n_„|P¶¦=!Æ)W½ìã#Œ­ yè£ÊÚcL{9.P• Ì]·MPïŽm± w¸-’¸V d«Š¿)ÒÐ^ÛIàÈ­Ûböb*Ka)²‚“'Rú‚ó#²_{¦}¦}Ö£õ"[ªÂÀ^T˜¨Î"”íͤΣø ÷*JÐ1 A™Ö]ŒÂŠC‰ÏµV·<è9úÞufÛ° &íÞ‰HdÀ‡Ô ]=Ä¢àÒGd\'Êò |¼ TRp ã–ɦµ‘+K8³šEÁžãf#âɗOlåy8¾ºâ¢'”@ÃúGFÝ%ñÃX{ ›áXD á ‘14uƒÀŒ>f¼dX?¢Î%º â–ÝÏ|ÿq0dÎ endstream endobj 1381 0 obj << /Length 2220 /Filter /FlateDecode >> stream xÚ•YK“Û6¾ûW¨r¢ªFZ¾EÚ¥ƒ7γR[®Íì)ÞF%$ɤ5³¿~ûP”LÈãÒx6ýøºŠ!ü¢E.6I².Ób±;½ iTÜø÷Oo"»n W“•ÿ||ó³l…ë2,£Åc5%õ¸_ü|]/õr•$I¿]®Ò4 >êö Å餚Ãro²8²xùßÇ_ßüð8£¯ä W~…­(ݬóE^¤ë(I™³÷ÀS^Úõƒ–x:lʧ›þp ìdv;¹ v¢a2Op‘"ÜùFiÏ;]ÒBÁÝ ®m‰fÏv軡çe¼¼pË‘P}7-+õ<Ë^°žÝT­>‰Þw£" j¦A¶«(YG‹KÄA²¯HÜr•¤÷€ýOKÕ ÓÚ-WQ êzd ¸¿?ú® ÌQu 1?õjhv½j›·s4ðNù:Ü$|©Ï­%dqæÈ~ ³ÐôšXÁaðv/+1Ô}¥jÙ€ì¤5×Ùî­eÓÛñ’â&]§YjEñ±­V°L —¼y2°´®ô`7OÙcIo¿ûÎrôÔ¶5·ÎBõÛJÔF~1õYÉó¶×ƒ|˜Qó”zÛ!æB~:ivZu|ô “µ:{^HM'ê8ñéöO¹»áã(¿qÔÍiz5Ju¢ÌÇ#ÚgšV[ܽ+uâzðWº >¶¦ÿL‘î6ïVKZyËxCF g\œ:;´î£hrÏgÕù|¿aòUå±i¼„¾³¯—³p£‘]{:ä¬jÕ £QèÔ»LNr’Þü—¥>‰xö9#ñ 2J ½çNLd^6at1µ—$tgøv‚1ýƼۦÅihÚ€¸CÏË,^Pw`,q¢±ðÊäX·&EyðK5Ï7.½Á‹yæ‘¶2LÃöå ÄÅèˆÃìp ©8ÏÉz˜-10<ûnŠ4`ýal>obÜ<+@aÂ_4ç ™3t#÷ëQ’w{?ý4§`ê?3ÍJ2J èÜ7£Hð+ö{é†N]­vªGÝá6.4nÃ#µå³êA3Eœ?<órƒ@à λð–]c˜¦/ª†Â:¶OØæfN6q,ßÝÊR–F0¸ñnmw©CÓjÔª,J稷 Ž —&ð ŒÕèÖMª\¸ÁAe<¢Iu¯…ò8í; P€‹IK ã ™+vF¤™–z{…—vn¶gž&›F¼¤Ð‚#ýqÎuÙCµOÞŒ¨ ¯B«'-ZåQ<.‹$Àd ÷ ÀžÐU k¶JÃ)J7:L¹»apMCHJP—/_0I¸š¹où+x¦Â¨,çåòË’[q|ÅDmíd“íu¥ÈZµ6¯}6êr‹SÔ²YæeþeœáyX®£"ºVç%UþKÊî½é ¡}—®×5V#ÁÛÌ4.Š Hc™à•‚qU¢á'ðŒF˲Ëe߃ ŒÝ¢íÞþØÛ<¨Ï(XÙØ™–‰z³Î‘‰ùôf'øqƒÆ(úóQ1xƒ&Ãd’v‡dóÖsá7æ‘¡e€þBçînÈèF¡[Ö/¨_JŒSëÿ!”¥dÇá*‚‚) ÃèQôÜ9/)‚×û9˜àò†€‰2™hR9`‡ÀŒc$ôP}øµŽ…MWwÞ͇q^ãI»&¤-=ëX8Ba¾Z Ü;.¹Ö¡½G»ô$O8l“E=waWŠû‘½ `7Ô~ÚJ÷nâ8t¿Ð; d”R÷B¹EnC¨ ]$+ׇ5÷âü=hÑ 0ç£Ô’§¸ZÀ–°E% jðYlœ ­#ã´4½‡^5_¶];Ò]èU†!”’,N€TiÄÃå¥ä á©CÓÛç”"ËÐcÑ÷Í ±±–s‹éß]¥”-£užä¯@YÚø˜)NؿŤŠA¼‚™æc08ÅònžÄÊçÀ š]=ìÇ r¶òÚð¿ÝAƒë°1¹‚6¬A`j AkXÄ:ƒQ*µfüE6`2;Dó’&†]q0€@cˆ¹¢q+øa[\BCË¿0Bt\ìÚƒ-‡q”Žïìó`V< –¾9rQ»iû9ľº~™Iðh¥=Å¢KSH½÷šÌùÌ=Áp;4,u7`JÞÆ#|al„†zÁX`ᮀ¼P_áÅ“ Š&Á&NC£Ä] »¿ vîÕèðóèµó݃9¿‡==µT•õñÆÃžùîÛ]+×eY^kiâŽv±Ýä^Þ¤}rëÆÃäücc–Ú¿t–;×Ûþ«ýš~\ýg©ï<ëŽyd3V`QÀVì²å¶±Šh«[Í´uMtÑêsûÐÁO-ºÆûh\À…¬5àÕ?hqžg5 ‹–\eò)ø¥V­ý7„A$™:ÄóÖþÁ%„~Yéü‹¾c.¿fîÛHjb3\lŒ3_…iS~T t¶Í@_¶‘ ÿK¹Šan9Üä> stream xÚÍYÝoÛF Ï_áGˆ=}Zr ?dí:lCÑfOé.ÒÙ>L–„“ÜØûëË“,+ºØíl‚H$ä‘ü‘wŠ7qáÇ›,ÝIóe˜LÒÝKT½™ðç_o<#7ÁYOòçû›Ÿ>DÑÄsçKwéMî×}U÷ÙäÁy·U#õt³x3…aä|ÔåF‹ÝN›éÌ#ßw¢`ú×ýï7¿ÜwÆ€z¥W(yÁ-ßæþd‘„s/Ù³f+Á+?pÁ‡Ä)÷E&ô‘IOªÙ¢? fÑWó@ܵÊóJFàÌ΃ó5ÄN êõ“ªå5 3-ž¬ ç3Ϲ+XSY5ª,DŽÂ°ý™̽ˆw´z£ u¹¶˜ Bç`ÇÌÑbQd¶Õs¼´:äCh+Ù¡ºâ·T}q½Pfó1 ³(ž/`OÉ<ô<ÞÔ¶Å–—¸Ì&œO0 ¾!(:UêQ+îs _ÜÈÕRU&@+÷–5ž8fó+#qËTÌ VSÏY{*Pé9n¶ˆi3üfÉ•¿ŒAãèÞ‘¥jû2ãÃxE¡×nä`0x(OõIOF|€¢Ä8>1HÉJ`î.ûŽÜqmíšïÝ 3©ï»¶¶[PÌ)w“{áÿªðë ?xÂÿ£´—¾ï®ó¾dEÙðÖ9×”ü{h8/€ê½I½‰h‘Ï 6l™Iè\kôÿ‰³0´â ¦•g°ìÎü…ßiJ+_ cŸÆò n€i¤Â ÉÑ…~öPØÇ‹ÙpÏò2êP]DedGå, |¢¿ {@Ä5íøÁçrm×ý" QÀŠBd/­F>ï¯É?‹ |—«j0´Ü@Œ®ÁkÿA„\«Ó®röZcuRå! Õÿʹ6CŸD¦Dþy+2‰4 ƒ:GjBاéëÃf¹¯Óháf90qàh2JMØk]î,»ŒÙK€`­hXÕ£b…çT¶ç~h‘&Î^öšqç‘!áºÃšÒžŒŠ-ƒÆÁþ$ÙFþ@r^m´©ÅM>OÚY®‡ù7§îKs„‡§ÿ¼I÷öÃ,ÂrºÆ;Ò”mC40gž±30rKºD¹Ž<ˆ]•KÚ‡©$jÖÙž#˜8¬Œ‰+ƒ(‚P~¶®Ri³×’_x¿$ÉBîܘî˜rBî ÐºfRî›jßoºþ²†+¡4ÙÝ×F¦‹VZîv î­‘Fó81᪷ªƒX_åÿ¢ÏéSŒ¿oÇò%7üH™¾àWÚ=?šˆÏ`0 +àÎé©kŽ~ìŸgô´äØ-9ò¢â‡ŽæXÉó·ßL¬@šu¦úÙmqÜVQýR(L÷J³épž¸ ÍB¯Ö"¯eçÓ°v{ªÄáµTa¤¾O×…ž“Š<Ýç¢ÁP%æ*Žð<]j&4[Äɰ 1É–F•ภùg¬lK3äëÔô+Pkæ(cî ›ÔÆA®C:Ðé'958t²d’AKÛí<¯Žç‚•ši™\  L5˜òù¹= ¬áJ[ïv¨a»ízÖëò({¶¥®IÈi I(dÆÃ.1ù^š]Õce¤^è£˺ùœjU5ö“XZrQh˜íP1µ9Ýô¿;‚&ef®ª»ocí|Õí\åÙêïÍCô^ÑÇN8©JU4×7²ÓBhÖ†öX–yUÞ_•‰sÍ7R°ÝâTã…2ÕËÈlFÐ7ÿøGii„ endstream endobj 1393 0 obj << /Length 1894 /Filter /FlateDecode >> stream xÚÝYIÛ6¾Ï¯ðQlWÔf;Á\Z4iz(ŠfzšÌ#ѶYTIi–þú¾…²¼ˆ“’E0ÀˆËãÛøø½GZLBø“u8YÆñb¬&ùþ*¤Q³pã÷WÂÑÍp~DùãÍÕïÒt"ÂÅ:\‹ÉÍæ˜ÕM1¹ ~ÚɦUf:ã8ÈÞLçI’¿½5r¿/ëít-Ó( ÒdzwóëÕÏ7a0úJ­ò j‰d¹È&Ù*Yˆ8aÍôýtžfÁ_S¨é\ykAË4 >…ih»|-ƒHšIƒJšh¨Ê‘ʺàiŒžÂÌãNɱîá*ø°A»@ìX[ZÔYp Ϧ—³¥õ­L‚ÖtÊ¿²Ý)Öʨ¶3µ*XÙ‡)*ZuŠ»Ì<8ñB¤ì”²æ"Õ •¹Æ- ´)ÊZ¶ÊÎxXƒóXZÅôeë¾–§Ï¸ò@ó»¶íÇÜ”Më1hHêjº8èš.–+ÁÊÞìœôMWçm©Gež­id †¥QJ>ltY·¸ßM™ƒ«Ï@ç:ïŒQuëÆgnâ°¸(»×ºâúì¹âö¿³íLrÖ* ÊBÕÄ_‰É Ðû%ˆø¨÷ª-÷Ê"ùŠÔˆVkRû`Ô¦«¸ÝjþF"ô?r¢>ŨÇlAœe€6D`U# Èçž eGCé‡eáº>%;<š]$kò!û­:Çíóúy¶íR¾yT>è²`d® iM~€[£»† pF†AL“ô4^6eUµÏãÒ÷®Óï yÁQÞëu ªïÙ¾F×BÙvvÀöÿ çû3˜tžÞ¨!5Œm¹£žä¾©Ü ëœó<°®¼çN“ßxªy‹¥œ¦ráŽmŠòÿD¿3ðÁWð5‹BòáøaY ÞjÏqYCÂk¨¦ ¶=p<ß8 Õž;¢Hî¾5œ2Ýr›¡Pî6;—ÞArg©ä4Ü+9))³‘ù"ا·X„íŠò94eUqCoÜ{õ©Ú«!¯3‰'[„þm !ŽäÂPÕKqEK‹Ÿg£ÚY9‚¡ö‡Žü½}ÿ燻ÙX&iäÁ1YbâQ™ëeÉpGGFýÝAtXæÈ{‰îÇÞ½ÌQçÏÑȸ¯+´Àð7¯Ê¦Q8Õ(}\) ¥ƒî«ûŽ ¥`Z@÷LÕ‡$P~°÷o®ä«ŠvÕÐ2p™X»»X“ák KUO¥m‰fH}-U1¾Ñ4ÉðÔ7¨ÀLÀ]à_à‡â8•XYÊÙLuZkâÄ¥±ƒã÷P’ I–¾€&Y2ˆvIõò½X„¢;¼XC®ÃÀׯ¿ú5Š1?=Ù¼®r~/ëãò–ä—Þh[]Îä~Ëb`¸"õ2¿£*aÌ8Ÿãöž˜ó­Œ¯µnüVËçꋦ^‡#Æ~§¶ú·u …›íöåà~FòàWTŽÇï"p??d=O ±¾pÈl»¾’`–t\÷ˆJZWìðÕÇF2ãOQšáÉíP`QÂ[;€ÃÆF^7IaÎÒ+§6h_1G;qLòg/ëÓ* 3ôVwÖ-×›ñ¬Žkü.¢éሯÖ¹JÞ«ÊϬ/ŸF ÿ¨zo­Â Y$üLs;Úkãê&ÛÝ÷;í°·ˆBxÿãz{§öŽ ×Ãøäíj1WƒIGYîÕk ¦óe—ÍÎ\Ñé°‹ßë4¥Â9—äÄÌuÎø eÓáŒnRó9vÒp&£¾¦óç¼R388'œ£l‡Ñ¸=јü#E#¢âBÓhÖÕe›—UØÂ&Ö‡Uø{пTõ endstream endobj 1399 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./subpictures.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1400 0 R /BBox [0 0 50 172] /Resources << /ProcSet [ /PDF ] >> /Length 133 /Filter /FlateDecode >> stream xœ=OIÄ0»ó ^U³> stream xÚÅV[¯Û6 ~ϯð£ 8®dùÚâ<¬Ý:lÀŠ]òvºÅVr<8–+Ëë~ýHI¹œÄ.‚èEФ>~¤Â T4(8«´ êÊÚ]½Üâ÷WÌÛ­Áp}aùv³zõ>ËFãŠV,Øì.]mšà‘¼{ƒ‘:\sÎIþ:\§iF~Õj¯ÅáÐöûpY’, ÿÜü¼úas »wf…–·iå—i±´ˆó /`§L]fC[›IËŽg(ð7˜x\3³Œ9«±ýG~¤EƒÈ lÖr×vÝÉrê[3~š„–Ѷ›^Jò˜S6ŸÄ¬gÑ4Þq_ïZƒ2:pA#·þp›ÛœƒdÑ£Üfš\ûøšøü®ØHƒO§úrZÅeÀSU°¾¯~:$<ø^­~›c +5gUÌ OÂï: `/Lû&%‘Ýç°ä$N¦”¨^"9+R‹Þ-¦Qb×zeI„1¢~òúìZ_£œ1u€ˆµè œÝjûZK1úpæÉ.J2†kF€XNR;§>c&‘+v4r4óù$ebóIJFD]«ÃÁ ¤F†V …q=ˆnk¹p´u½Ll­5çÒÞ©v«S(ˆÒÓX”A­iU?¼^&©bZ8\žUÛ¸¾r5ó <·÷POZËÞxEä4»„ûF–ÑU󜿄~­ö­ë³} ÞÅV©Î­öZMÃѓŒfZ§†ù<øhGéáƒzË_b«ž¥õunµõ\fÿË彃³Btí¾ÿÖ€\“åŒOW~˜mpÓª"RÛž„IäøŠ‹xD6ÒýŒn{O'žðÄ=x‹¼GM¯Ì…CT¶ÁqklȺýHYZ Î@P§Ì4dDÎ>4S__tÆÍl€k²êšö–7,ኋ0ÒY“˜¡£Ýhu;8J ¸t/†ñ ±@ Лov8ð2‡ù–ŽWôt\öKGr¨[ß,¥P|hõ—¬—O4W‘É u~êékôhMGñ,á|¨øꢢGà¯r¢¥}<ŒÒ–+¸Y øö÷Œ¾—à·Ž¾–çüžX;xbiîxÔÅÒãŸñçwàØnÿ¥¿;àUOr ‘4DÕN‹ÃÐaU’Ì2ÞîžZ$¡Õú9‹{ÊÏm§Áè í 0lƒµôGÛÞ™¸÷[1ÎŽŠãƒ?ur‰¡mÿ…û㿱\ê4$ endstream endobj 1409 0 obj << /Length 1874 /Filter /FlateDecode >> stream xÚíXKÛ6¾çW{©Œ¬‘²d9E}¥iÑCÑE€M´L¯…ê’ÞG‹þ÷΃’µ^y×)š[aÀâcÈÎÌ73¤˜Dð“e4YÄq¸œg“¼zѨ¹žpã·_O7ÂÙ€òÛÕ‹Wo“d"¢p-ÅdµnµÚL®‚ïvªuÚLgqéëél>O‚_MsmTUõõt&‰”A’N?­~~ñêg£gJ…”ψ%æ‹0¤Ù<ñœ%ûÉP‹,(,[%h,tEPLE°.5ϸÆSÖV¿êf*³@›µrE…’ÃtÈðЍ~m¬{Ÿ›¢už&yL“7U¥êíxàw(/T‘»½ñrÜnÇ­¦Ö¸!&âP$|¢fËjv;\ÏÓìl(g²crâI˜Ä’·¸iŠÍš-ˆnIôQõrÐT‘¿É÷ÆèÚùñKž°ÎI© ËÄפÿ9?ÖªÂp \ê’x.E˜ÆéCÆ2u‡âeÖ¯¨å6ú„•—™ž0/L‚iŸX©îN¯Ìú4Öà™Ú;{«7Ü"·„¯my>/¶÷<¢ïÚ²È 7\ÞìÙÇP$kË åºÝ¼sá¾;=f6£í¾t¨ûñã€ã=ëîà“yC8Ûè°g2PôïÓ,îa5“Ë4XY‡IšLf2Œ»ÈòM¤a”ŠÉ`ø/; J.¬JîU‰Æ3*€{ü%ôà"Z^•Þ ¢ÆÏK~Q+ýaüÈ8 (l÷Žwÿ‰yÉú%Ë0•G>êÍÊDŒ“ÆŽ`Û}»¢©?ÐNß}9$ÿûÍÇ!|G4î<Ë3jÈCÈrüÙ,*•›†·Ùh„e] ¨ÈÏø\5w6q&‹³øöâ4 ¥È˜¨5ZUx®1äxÆ›i’ªDLÌsœÏu¥ŠzÓ•Sò½kÚY©¹4)y®ò¶Ü—ÚŸ Á3_?;âx“ÈkÚ%Ï sERF]D—Y(²å™—i Ç7…iê Û‹Àñ£/wì ´' øEÐåMM ëZqb!ƒ¼ÔІ3ªô$«@³s•™7î<”ÉàH‘ù’ÝEóùãàý¹±›ÎƒÊÿ<}G®õg1iUþ‡º~lï‘ Þ´tè7ç ׂ>ÉšmYJ5õå›™|¸.ØèŽçÔzmô DBT_‘çýøÈ{/>ÂàpÀ«‹—^þ—Ÿþºx Ÿ¿Ï>‡Û)çƒ&y!H¹¦úÆ#Òç€!š‹Š³@cž.¦ž(*pgUóÅŒkmC&Í$Üu;©¤b6YPH„ÿÅ‚%NÃŒ–Êà{½Å[†".æÁƨiŒù¥ëÑÑ—¡Ùáþ$A÷'üÚ¦ÒPµiêFf \?…9$B(âw§Væ]êÊ[Ûoˆá ¿Š?ˆ»;*Ö`wµ¶M¹w~­-þDË‹¶öYZ÷ ·ãúö芕‘ÂÆæ†) ,d°5M…-Š›†Çà'.}òŒK_ÜUÁÙ5„°Ùäí4ƒzÏ07}§ª¶¤Ð”É nLéžùsqÛ)U å†×PWõ AIÇ«yTHÖK,# t7ãFáš&)ŸØ¯;j€²Ë.AI1µŸR†CÂíN+*Š ž!¢å·'ô-—Ú³ºêyÙO—#T xb¬Š9‚K~jåRùLSúØE ¾‡D˜øÖ‡ªqÇMãÞû¸ú4/çó‡íKïÑ#ºÇ„xŠ—"Wà®èer¿»ÀÜ7ö¾j]Ó_oŽ,ø•å-ÔÞ5DÞœ»=@°³+QÕ^ÓØy¯9×Q'cn\½-®{zt o…YÖG¶i ¢Îbéu£ŽâKmË.+ˆ¾p%i?ã,Ò®ÆÂz Ÿ¾Àä³ÈÉ`ãÁ®ôÆ“5K`÷ÊÙ0áŠÒ¥Œ={IQz·Øþjï"†Û×gäuÔ1ÚEäÕÉ»`ØWQtIª>‡T\ŠqRÏDi)ëÞù¤JëWüÅìIÎUÄoBEí|!|1Rž,ozÅþO—WÏÈ)/å“G zÿåÂ$¯Î(+~ò¡ü†«G£¡‚ð¡¥Ö¹¶V™ûaøü­·Ú½tQ¨¿¢õñæaê=ÛóFâ“ÿ-Ý ¦Y9Hc2Í8™cNU•æ&¿Í$rð6µÙp®—¤z™ÄÝRË¢èœÊ ¬ ºNOÏ §­G@Ž;q) »ûW ìpÉŽ-_(HÐël$>yÏÙúJÆ)+;óÊÆ'Joˆ¾ñùàÝ„L¦­{üpB5$k ›Öä>-ñ+ ޵=\aG£ù9ÁÂ3AwÝ~Ý=Êÿ>‚L endstream endobj 1418 0 obj << /Length 1806 /Filter /FlateDecode >> stream xÚµXYoÛF~÷¯òD%"Í[”ƒ<Øi(j´ P éÚ\Š,x\ErŠö·wŽ%%K¤í C»³³³³³ß\tf6ü9³•=[zžµò£Y\^ØDm73üúáÂÑ|&0šGœ7ë‹Ë÷A0slke¯œÙ:=µNf_Œ·™h”lç¦çyFx57}?0nÛzÓŠ²Ì«ÍÜt—ëÁrþÇúÓÅ»õpPŸ©rž«ž¨F¾åx>«•æEñÕìtçm\H㿽ÀgáXA£p„ÿ¯Q58Êt<Ë X€HÞßÔ]®òºzƒSØHÛE‘o˜¢bNíåø µ¢#k-Yö5Å ŒD¦²me‚³ÐHæŽÑй»4vl6àhë­Ê+É“¼cFQñ¼¾››A`ü)cÅ uÊ jîFÆ}“ÈZ§ÆúÂÇ·b7¢óc›Aö.Ëc–ñ¬A`þI·UŒ–áÅ]®2¦w`¡¶íèÙæ`´µÃùVçlmd(¥ üõ ÕŠªKë¶d2½Ù¸ÎbÏ7ÞÏ#Ϩ5 å^”M!µ¬<ÕB2}H‚´Á‘£7øˆâ¶~Ãð 2Øß;iŽsÔ4§)jþ!Íq,?81Á°]–§Èl{qÉàzyÀ°zy C÷Ãæ˜è¿Çìur|Z´ÀI–¯Ç±ƒlñ€[©&Þ98ç#PŒ$°HVÁ ò°Þƒ<£4òƒ`âî7T’ˆˆZÔ¡<ÎÓ{­‚^AUÆŸ ¯»û²Qµuχa˜oÝÅÖHÿ(ê#!½À7ŠéÛBå𖲸ç¹àô½½LÌ.ÿ.™ÒûnGt“Pí8&ÿÃøX¥àÉà‚89rAœ’3ီOZÉ~¢±pìZ¡v­pIX3€3Ùhñ8ª"W  @ñžE@@✌cþÑ÷Š;†íVÉb^¶Žä^É*éx¢ïÊ@¨’‰Íä,O;€N&˜uaê¼ð 0¤÷áUV“1³œŽøAØË…òñbÿLñúòA&[ò»h_=Îè¿1eäEåÁ}ÈQq\ou¤M˜”RÂ÷{ç„ACoÒo\Ë]ž¨ ‹„eúh#¯>Ô]žïRÙ€îÚàšæä4¡ÏÐb›–#V²5—®¿²V¡j.Cãö§÷–‡)uÉ‘ ïØœ— ú”áò굓 ÜwÓY€J޾o^4Iúâõ˜yÑi wv\NÕÃI­NjèsN猵w)Hˆ“ì:ÛÃq¡tR >URñp¤°úñuÕä•‘·½Æ[ùsέÂóÜsÌø'òÄþͳÝqT¿ózë¶Î«³WÓÊÿ/bH·Ç«9]Š~ämän®sŒI}…ý>èÝ=0À”y‰ìÛ’ ¢"ß G{ ÷%zyÏ KàЬl\À`Æ× ´Æ8Câi ÁTÊo i"!õyŒ®ÓöŽŒíRßLÚOTØ}ÇBõÅÓQáд¿Õ]híj!§#ijªñë*I0NÎA hÈ|׺ÒWŒ],êïé¶@ñ›z®6àôLs¢‹ýèÐ)íñp/û$²"ë¡ A[ÛZÊWÇó‡–¿Ó¹+ü…2¸ðŠUô¦M–ÇúÄBT›­ØÈÅ G>à|ª3ÝÛ½µ¸6¿!XïJòs˜3Ô€áºJî™ôQ”¥l¡4K Tvµ2ÖŸ?Ü`¸þ÷^Ï#ßX_1ïЫ¾¥>±äX_å1=ºî¹ÍX:Ñ5Tþ>’Q?ÃãëO „6ú ‘»ºru¨r£ÈtW>Oá®mGÜœ|ÈÄO¢+˵½ç|\Ç?bêuÒ1Sªé®./w»àÎ,è6ïd«„‹Ëîj4îe³½+z+\ŠîLhA¡7ÕøkÕÿ‘úÈ endstream endobj 1422 0 obj << /Length 2440 /Filter /FlateDecode >> stream xÚ­Y[oãÆ~ß_a¸/°Ry§¸’&[4ÈCá:hmÆâH"LqÔápmç×÷Üx“I¯̙Ù3gÎõ;TpåÃ_p•ûWYmòx{µ;}ð‰jW<¸ýû‡@Ö­aáz´ò‡»ýœ$W¿Éý<¸ºÛYÝW_¼¿ÕÙi»ZGQ䥟Vë8N¼Zs°êt*ëÃjfIzÉvõÛÝÏ~ºëê¥Â•/ÄÚ†WA¼‰â4±Òm¼ ¢˜ÅJ7Ùj¤¡÷¹¬tƒGÃEÒñEà¦A¾ B¹Ç÷ÍóéìŒÓ²vré/ë$ ½ªW4°Z8Š‚¡ïÕ†EÙ¡pjúIeUñez_BòIrGwTîâÚ⊨ÙÁ2#ýê§²qàÝë,ÉXiQ&»£mïÈH,X[´8­ã5ÄiÆ2©œ®ÉÈÙ0ŒñŽiÜñϼ}[ïÐ, V÷ÆHèjkE¯Ag¢X·°%EÍ:“kíÂaQ÷¶í‚q@Ai”zw(8®DÅX¼v”o=²Ñ2ÞŽK¼7{~ºnCƒÉÑÙUàaÐ-H¬ êÚ-¤4ä#‰cW¢h ¤*~ðnö^&Œ%“;€‘_&[wìlvq$u¯t½3-³×½¬ù©ÄK(Áâåƒë¢ûäÜi8Þõ¤`wàÝAfê™W•µË®uÀŽ'ŸM½cÊšO’ßbßã<Ù|ÄYHÚb§­-i r ¤¨˜±9áÍÞT•Á•ør6PKØ_”Pçªg&ô©2$'ÜÄò|î´‘¢gn@IŸƒ«P-ʼn"bLw€i×¢Jã j¶¥B“éqH¸p…Á®0ã‰pÀ7²ì„³Î“"!U2®=£·b^!öÆ.—Á«ò~×Új)KÎK  àXªÃjXüzûËR*XB¿ÖdŸ’ ÏJŠ/×µ9Tæ^U½fEÆehCÀFkޤpãq)']d„œ<ÌÏt{èâ4`¨z‘_´Öv¾ò²PðÝÈñ} ŠÓÜ+J«wÎ LÂéžr? Mâ¨Ã8–ÐUÃDgäI!ƒá“EYF™ _–qC@-åN\Û,ØÍ>É ‹ðÜ·Èq±]„c‡µÐmvÅ}¡{5‹ s_Þã±d ð”kQÃ.Tý(«W7” LT¾< áh9„aýD¾¥ÈðüV ÞñT`wB‹_êâ¬(ÆGȱ´ _41={ü/[“J°¯’gî³D`§¬CgN@å~( ùícȬgLà¥m¨èˆŸ#êWe^{ G§;ê†ê ¬QVóÛ/b™Êõ/® üŽáêª1ƒ<ºg."®)†ÆhM’¾r„¤J¹K]¤í†i홢¢q~}oá›Qg†tÅTp.L%è9$ÿš©ª(J¼êBfEé^­]›¥:ùµ,›„]ãàu°‡+Æ!vÐn÷m´JJ ûÌ39²¦æG°IÈj+ëi¼o\=gÜÿðQg$¾,UÆØbÔDvÈ‚6 }&õÛ8`: ž#?X7˱ðýËÖ bñÇêeÔÕ˘êeæ Ksîf9ùDÊütåÖõð»ÚÙ¡;d íGžqG€£ö hSßPO%/ÇÛKß\ÿåzæíÉÈ´o<çÜzTÛ—¡R>‘ã•à£sPn ]Ô7±»Ã¬>j¤pú ó‘I}i‘:ÀäeUÃ_|q* šº’£äs¾eH” ÓÑÜ/Û‚á4òZ>FAðÉ"¦×AbI¢WJò`U-7Z¨©ŒÐ³@iØ4ÒÌDSiÔ)#F> Ý%¦«©áÒö+vbëËÇ¥¦d<Õs› ö¡×NBŠ\œŒc’®£ fökÖVžmÀ¦À—ò¹@HÂ_ÜÍм_‡†*;jk~Júo=OÍâH@‘Ðeck´õ}ï3â3Û[4@dQrŽS œ‚’ûÉ ¾¢‚Ïþ£]”‹›æ()ùÅÐóàÆ#%‘¼S<ÆXs²_Ä(…½¢†+ë®—¾Éî‚åÊ=>ÃW07,Z3âæPX¨%üÅp¾G.µÁ˜Qû÷åÜŽ+/À{ à=eØ„"_‚w¬ÍaàÝöÖî­9­D:i©›Ù~‘rÖ»ñ‰q¤Ž¢ô…zée+ýK$-øBåxSÿ‚<¦* ÑDƒ(ÙŒ fîÆ^²oˆ(ÛN@ÄéÁª};V''Õei˜ — d  ì¨7ç1'^xÙWó¬Ëâ@¤jK$ú6„ëgœº­Ëÿu8E—oà_£ùe=ÁÙÑElÁŠqlaçÛ ÉàôÁ—Û!FÜvùÛ"÷öÃ`4Kù6eÄŒ×E1LÌOŸ.€"iæÓ¼$‰8¢ã•úK³•Q³Í<úiÃÜ9š¢®/ÀÁÁ³$ie a"¿KÌU²e´ò!°ã[ìª15ã¶)Ì PñTrDZ„Úýt®Ê]麟 S«ªü½ûÕJðX<ý×ôíÚ2l«ê½&æßSœ½Ÿ2½oËÊ­ÑEqÆ…F,½]aÙÝBb†Wü#ᜠþðËbD™wxÇ}ÜøÃW:f[UœhqC­§wá~ ²NófLK–½²Í€bïøñÔ!Óv¿/ŸÆã‚s7›lúòÛâ%ýãßZª9\ü.)jRÊ·¥xUˆ–×eÑO[Ë!"ÛËÓ߯…©‹7èaÁ®ÔŠóöé¹áïÑÿî¢/. endstream endobj 1427 0 obj << /Length 3061 /Filter /FlateDecode >> stream xÚÅÛnÛÊñ=_aø¥`9¼_Rø!mrÚsÐ"Eb ÎéÃZ\ID)Òg—Š~}ç¶%s%'/…k¯3³3³s[FW!üEWUxU$Ém•–W«Ý›FÍæŠŸÿò&’uKX¸œ¬üÓý›·?eÙUÞVa]ݯ§ îë«_ƒ?oÕã Íb™$I¿[,Ó4 þaúQ»]Óm˸Èâ8Ȫſïyóñ~D£¯¤ W^ + S˜M¯ò2½’”iûy8ai>]úë2¢`Ý´Zf³—³…ƒDqÐõÂì#¤ ôªù-ŒR]ßx 'a`‡ºß>رÀŽ‚½Õ5·T' `$ðL < Àùçj½VûVÈyj†­ìBQ K˜i›±}»XæE)l¸ZFÌ¢e”ÜFsèå±P\Á°…ýqýãÐôj¹×ÔºCІfýE›gƒíYvà&;Ï ‚gÄ“i†@ÓàS´îÐ0S«AùðDÁó,äA‡Á{®ÌC3e¾qŽSûJðâU(\Š˜Mýô;¯˜‚eR„Á×E–ªÝkËýQá2Å3mcIž8ñ´ÅSR ŽL,Ä%v¥Ze,Ïô†ûN/ëf§;+ÀIe #²p®,K‚û­žg Áݯ×Í,_NÎ7R—áú¸¨ Eà/KfÖ}ÛöȾ'R¸Í;ß]+áuž»† ³°î(Ü·-°†"Ï ‹+¸»íÞn=„ø—´åN´A)à1%Œì{ì°_ÀóáÓ?+|¨?†íÜ]R(”!c#>°G‰ Ø@6,ÐFnÏJŠàø™ÁŽ(Ä!f"÷sç ~ß G#$ÚŸ8Ò`ÕïvÊ'Œä¥0’Qî Ë]@ :4ŒiüUÍ3ÊÈÛïdÈ6»ÇVFõ³ÂŽ*×¼B,"ŽÐ›µxÞü6M$d × N=²îx#Ò~=h;ÜÏÃ5øÇ9^¡ÝDñ„¸õ&âuË*ÍÂàí[úO\b¹}]Ï\Êc ¼Õ\ ‰šâPnÞ^$òúoàÞ =7ÑM|“¢8‡¡Y²'["YËor=§£o¯n‹8g2Þ£ÏHñ*¥$DhOÜT:qS9ˆO"Ž}UÊš3¯‰¨¯õÝõsm®=êk†žA2•ªDFàãy¹ ñÒƒ£ðÑ@0‚.ÏŸ…yº§yBcœE!{2l`jÊ-Å?Îò`›Ü 6ج/§sœg¡-âÓ÷ü¿ÕÅySCàû5¥•Më·)(¯,K)cŽ:ÇÔ3‘|‘¶öUØ’²ß[äÌ lPäD`Œ!W†í qåe”Xú,–nãh£È]íŒ;lyŠ‚ XŽâ®«Î: ?})ꎯbI ’]d)z ÙUhiÑ[îqh :6/<Ÿ ¾?çÁ´­·šásXV£öbÛ‡ô„7æUÒÉ!Šaa΂±ÍÙýþÀs á"±÷к㇕¾Ð㎺Ù4ƒ½ Ï8Yð)V–é¶z®N‹vãä!€2N"rAs<æŠÌØ>Ê=8ð÷dLù™·'JgzÿN¡Â{sä`ÏN¿ÖõâÉò± Ýý¯6½ÀV˜yÖó‰û°7ivä´,Š;Mý'švsβf¡¸H¿N¯KÆœ£_.qñ™Ð†p•+t¥ŒÀÕ DŸ¤’ ¾ØÚJûŒ›„­GÔ/£³®ª¨R÷†úÂßùÙÅÏ-ˆç5—âÈIø*7õ˜a4׋esktW?¸Œ3ÞV^YÞ[ ʽOói; loíÊ@Bu×ùŒF$…,~>ÄŽº‰öƒÉ‹²F/Z/¬ãBœoÉU;\p}ÔÞ |µf¦f¼xEóˆfß FOžFôªc¹éuÅitî3úè /$B…µ‡êfJä­õcøØ #³—Ó¤+ð»êå£ þ˜A3l7+•,/=~\Ï ÞÜœ³ b@ü¯B3©;½Eƒ¼ïMçx‘gòÔ·Œùð€Õá°Km{ƒ9îþÀìß*bÿã+Àûýÿt¦ß÷Í0_íÑÎ5ƒáÄ(›£™"^†§ÇåkôYQêý>Šüõ+bÃ#—ÎÎ-tð"; r‹ÊñÕp474;‚æµ¹ÕBò§/¾Ñé¤tÜJÑm¥«CuåiÈGó˜Žg¬ª6vtãc1>µ²îI=‘ˆŽ¶ŽENèŒ_ ù*1žäðL-çôÆÉ%¾æÄ6P(N®‹àSz¡ä•¸¸tÖP-ç<+õáëõÜuQŒÓ ¬ŒÝ]_ËëûtF¸6? ÙÍî‘çäsÂÿñÇŸ• endstream endobj 1433 0 obj << /Length 2119 /Filter /FlateDecode >> stream xÚµY[¯ãD ~ß_Q§N»¹¶ «>,ˆ…E!tàeAhšLÛˆ4)3ɹðë±ÇÎ¥m&§‹„úÌÍöx>ö¤ÞÌ…Ÿ7KÜÙ:–IÏÒã×ôªýŒ^~ùîÇó0q1˜ùõÛ·¢hæ¹ËÄM¼ÙÃn(ê!›}r¾9ˆS-Õ|³új¾ÃÈùYU{%ŽÇ¼ÜÏþ:ò}gåÎÿxøáÍ·2è½Ñ*œymÖjh–¯—Á*˜­âpé!Ù¶­ªb«#Gו’›Z5òw7òÞ¡)°YZ²ð‚¥Ñм¬iÁ^Öð“]]+³ ì-ÅQnîîî©ÕMÎäN4E½qï[mý’“ªŽ§Ú,B¥+™$ ëôn2sl‰’¢è ÅÆ´¥ýôÏ0u.Ã(ßTZòO…ìl¥æ´µÃ%­½¸Â½‡j{Ýö3Þbûe@ö0Ž—nÌÈÏ`¾–2ƒ¸t@*>C§>Hz9V—NÖ€õ$ó,š>™I§BÀ•ŸŒÐ£˜ƒˆÒ°y±ÃÒÝ*®+ê¡MSß®RÔ)¨ý8"Gäa˜j·I×Ù”M6~n÷ÚÎK–ÉÊ_ñ´Àw¾ûé×1îUeE^J‹:ßuŠ|«„z™Ç¡³Dæs;‹í0»?ÌQ‰€%¦¤C‚ù‡W¼P£ÚѼµ2ÞÒÔFoŽkôƒV»õ9‹0veônÏú0÷¶¡dÅ Œß-…~ùÓ ùƒ¼ƒ?ï¾´[BÞ0Q&A]„Î'^õø#Œb „½ oc€«×dÜ}¬tMoJ¦óØ]ÎŒÜ×9Œ¤ã±»nWw^ÆÑ§¼(¨»ôpW´)F7H5è†' >晤A¦j ìÀ&E¼èf«åßMg3ö©¦Ô°ËÈói—¯ Cÿåe^ç¢(^,51Š>ôìØ”€C²\! ‘/÷ÆÐ-v˜ýÇUÂ0þ¨Æ% °C-IØ®)Ó:¯JV)”é­Ð­¾ª¤'E (:Nªs©ªä b ñO‰¹ ÷KÊö™Ÿ§ƒž·k±MaU!q7›(ô ù\8ø±Ê3–,嘨eDù#àJõ )à ¡’ Ï=ñ½TòÞÆ»Þ+\è'íIÃÉù söB°(z{ÊSÌ[7ØA— ÒŽA|E]ã±ã¨HÓJeTO&&¯ŒšÚb£X“ý; Žáé[I.r»³±ÐiÄt Ï–\æ\kèaÎGüÂçiUkÎxB'FC˜á@>ª k¥&¢a¢(³k²2´ÉKQèT'sË0¤ˆz(õc³ 2ƒìvoOÀE F9™,c’Ž…LBN47$ 4ñ çl(ñ©×±„-yvƃÍå`¤Ôd{¹ñZú9'P–Š’´öu’×ÕI×Iðä¬þâ à½öåÌêZ¼­"òBNŽfÃ2m“Ìu0 Š‹pMyó¾ “×}½F‚çð\¶_mщcìÕb@ÐÑõ¬|g—Pn܉ f¦È6' ±c×îb*ÞŒð H-âUÀUÇz?ãU%éšQ´q'R²nT97îÅ6ÇTÐç;©òѤbhƒ+(³†Î|¯øn.Ÿ&¤û²â“Êk“„`‹§ÆÜ‚ïj%JÂ}§Æ ¼3—›ÁưmÍ7âIª¶åqÞW|¹/rCu¶,˜.NqÚ nìL¿™0Â!aA¶Å‰E°pÇ™„Ì//™COœ8ȧEz˜ @&ïoÀàæuK…Øg$¥íuX:¿–…Ôõ#bFçb_T[QÐØyˆ©ÄBa‘³(+-vr*²Q %¡¹Yb.ôÉRl ™!){1{†;Ï! ¢»bB¬ô4•êݰ—…NÚ(Õã0’åÀœY!ãä"À‰ÜØÙÐ&Q‚“:5p —(Áûï=ÁhØ]Wvô Ô#—æÐX÷YG(Ë`7öbꛊ³¥þ:~¥uÍLé)™>Üèºü0D¸µ¶@4Sr^GΚBž‘ò:òpZ‹<|ÏÙºy>¦½CÛ_蔸^àƒcMkªÅ.ʨ z»D£¹†uhìxþ¡=Àß-·ŸîfZ•R]}îj¯Çï=;¨•-#¦n‡1ë}§Ó*ʦÊÿGë+9(¥r&XÛ†ƒb/û<ýËöõÊÛêxe¦íbޝH€ÕöÅì&km®J4C®Kž…AÓå«Ý.‰UûæÈÐÒ7T1x,¶r%0;8¯S:úåš™ñ È„»©Gw˜Çƒ —{mOë»þ²f±ÆúI‚°2Q¼ýûX áÊgGÞ2vrÄjèV¾óÛ<Áo9rX¾ÆÌ7˜ü©´ „ÉÒóù¿“÷pôI/êå`¹.„¾gˆÜxØZç{óM×´ºÅÝç-è}:È’òšzw°É´Êv43ÛÄô¼ ÞYÀJ*ÛI`‚>²‚·`Uðlj.Ï#TÑïØY¾ôŸ ÆI¦ö 㯜÷ÈÅ1l…"¥ ±Bӳȱ åNXц‰éÒMŠe÷¡[õ¹V`¾HàÕ6¯…¨¿9òù¬é˜QŽ8À—.¡cÃ$ôëÜ!t{AèAÈ…D?d úg?oü/t^"/Ÿò·¾•R§ªæ÷çÐ6!¢éYV¶5 &Ë @ŸÉ~붃1ä })¯mèò‚WîèÇኯLÝþ¹UÊ7À¦¦ZŒ#¼]y«åOéãUnw}šp¤-½‚C§3áó&úâù]ûé¿bªÄD endstream endobj 1438 0 obj << /Length 1839 /Filter /FlateDecode >> stream xڽɎãDô>_‘cE$Á»“iõÄ ¸€ ‡™9TÛ•NI^‚—î4ÿÎ[ÊkÛžf”ƒkyõö­*öÊ‚Ÿ½:X«Ðuwo¿ŠÒW­+üöã+ÛÀmpÛƒüîîÕ·o|e[»ƒu°WwÇ>ª»xõV|’çJë­ëº"x½Þzž/~-ò‡B¦©ÎÖ['ôGöúýÝϯ~¸k‰Áê ¹Bȳì½ízÌVuRHÀ‚>ØÛ­ë…âb¶üñV t¶&Ï!5+ÃPu‹by b¹â(“Rýa,#Æþ%b”` Hµ_L 6Rç*=§ )[dúEº¯ ™•ǼH¿ß:V†z¥ûì·de¥óìóÅ8Ëê´³á?ÔÀâ¢ôÁ@zïC*«“d–MñT ²¯eÃ^ñ„)Ùç̺ØÍ;{Þj¸yÖQU §Gv#„(1ãJŒ_•b§p^ÛM¦Uâ³Á‘™#†*Šsð ä”&UG•~D‡WÉëâçö¨õ?äFôÏ¥®Ë߇ÕÖÇî5¹Ž3hL¡êŽ0`WÁå^;‚êƒ@ÈóV]ªb+ì¥3²Y«Üâ€ÞP¯¡ƒy®&E›9ë1ÕY„¹ƒÑuÝwu¸Ææ†viRgHi¡Ýh—ºd]ðÐ5dÙZÃòf©ˆ~¹Ã.Þ¿ç©Ùv6æZÐxˆÐ±N )gúÜ‹ò™¬$ Æ8g$Y^ñàDÊë³ØÆ-NúÆ0<ÿyâœ1nÕáâ†ÃÔÇ+ÔžÀ·¬#$sâ;ÃΚwti¾\ 3בбÛ;&Ç:R„­é‚ö}ØÌÍzÛ e2ÏÖºñäÊ ú‘ï>½crâ®ÆrÂ…dþzAžîÛ^§Rœ Úm\ ÷ÆÌ {88Ä´Åìn:Èq‹.(8h/(8»I{EáÍŽ¦ -’Ÿxhhãf™éÉϪU^téÛÄ¥‘^,Þ¬÷žàS¨´²’Y¤6ó©h®çÿh«ËÚòkCŒ¹q[tE𾨛oôàêª96Ř5ôäpë;~O#8h„Vþa—²wž?Òe¡ ­e åÞOÀ}˜ðØ–üõfJQ#fÉöΨ—™Ë<.xÐtQu9žqaqÜsç}ö!²¤ê"S¼ÊÀÄO˜L¤Ùy0‰7ã)d*–©L€ ¡0‚ž1Óqy©J¸‚9AØŒiÓ§_(oT·ÜÀ$>ع¯uRmé+ðÆwX‚¤”{”–qP¨(OS•Å*‘}7€£c:"_…И HmÏ#n&2mCRiÌÌL¿Ä4e×Ü$TVjÎðn›ßL`ÂãrÝÝQ»šk‹äO×ß‹¦ F _^yAvD°G9w)‡Z˜Ê¦dï'lttr^ÑÙ‘ßgöÆà¸tÁ¿í©¸ùa/ë`•10Ç"Oy¤IcÖ­m‡â§ãD>í;¦æ¤ÿtƒkˆƒ ã9t1ДÔòàœÄ}žÖô ñWm0´ŠYΡÎ&ã3-áQ‰‡-ó@åôõè„¢o{zT¬N *YMSŸªÖWt¾¼PF OùîrëßLQk®·Þν™*ò $X–§[ø~ƒ¿$‡jê¯Z›Ls¯]ºùÍU91èájNƒ÷¼%A&ão>z€wŒžöf.“2ožûs0wcúÁÛÄ¥¢ü6ùÅD2K?á¶0?›„teÅÊËn ávJ>ÐìÛ÷¬ÉŸ[Sí³q?Lyı©ÚX±;ãÏkƒ¬ém&KøS¡+…§/vÓüó/´ë endstream endobj 1442 0 obj << /Length 1893 /Filter /FlateDecode >> stream xÚ•ÉrÛ6ôž¯ÐG,p‹Ç‡&mºœ:­Ú’` ’8¡H—‹e·Óï[@Š´8ϘÞÃÛñ+þ‚Uî¯Ò(òr™­ŠÓ+ŸNÛÊ¿þð*0x@ÜÌ0ßn_}ó>ŽWïå~¬¶û9©ínõA¼;ª»^·ëME"y³ÞH‹_ÚæÐªÓ©¬ëM˜Æa(’pý×öçWßo'fpú…R!æ3±²pH/’IhÄJ2é‘d±/_oâ$¿õíPôC«;äÿTP7Ƚ 4ÊüÞ鶉3)Njfâ‘7ªê\Eb§?ú¬5Ÿ÷G]¶ hÖa*εÁR½2Då7Bw U†E7‰ördÓÁç\öGÆ@¦ÍÈvg˜‚­ê›nƒf¤Jä1krB¾CÿŽ bâ*ƒD”5ïß{$s{|WW6;}Þz“d¹xûÈ·wz¯†ªÁe”&ë@ëMtbf'M‚Üq;# €mÌ x7ÜVea‚àýØŸœƒ†8oZ­v†Im'rØ•hB°àÜX[KÕDï|Ô$¸ôÙJðó¢0TÀq€j'©¸E¥{†ŸP÷I,8@±RKè0À,›ZU•ïtQ!vKFß–E?áÄÏqШ³º­Œ  ],ºÞ q”†âÜ–½æ{¸mj” WeÝ•;:X<œ‚Õ\fSáPÌEÕš[S¸¢± ùÖ®(ÂîÚò^õÚ®%",µ$VµÕ‘¨#…ynT ólR OI%<œTB)=ŒäHüT3’z‚§F¯= 1ùñH-ŸÐìúñŒy inEšý±ììª"™BÕÌz k<…$°³¼r|ÓQH>ßDA.ôÃMÒñyßðy«÷”¢gGìX8ÐuQ5ejÜ!\Qé@]rñmz=òÝé-ðVõ†ôH²oî6•¾'ƒTŒÓcÎbÌoðÆ,.d*àŠyÄER”ë] ø&hGš"¢ªò…¾Y£ÜH*D.%%ù,0 þXcnKŒCóØT†Y LÂÉæš Ó¡A¤Û#©M‚½fœ²æ¯Ñ@‚¨êtWé7¶XØ,D Y4æ…+ŒÅ–?ÿ²'c¹ð}YćkBÙ,pŒ®ÿ/òÍ¡¡¼ošk› øVµ7.€y7ñµ-Œm&ßRM3q¿ŽãÑöŽÄXÀÖ‘ñˆ¾ê˜šÂD7¸›bu?.ȃŒƒ$Üš¿ ze !ökðtNé¶Î™Å?ºvÝÍÁpø°\Êå‚3Ã,8æE öZ€(ƒ, I«ÁlA#{ž…;.» à<eÏ4z~ß sª|Ègëã¹âÏôb.wgòÁËQ'º˜>â.è«%2»ÆtSž5z‰ožs4•ÃÞÁ ðL,;ø7Qª>PN€ƒ~d¦OFÓÃi§†£Ú¹y?¸¹R2!b”gø$µXª»-­Hå¹™¡;ù]½W|I-粪8•q㋹ljg(±ý=(ƒÑ7v‹]/åYjç΋…ÌN=ÎD­Ï,ÍÖaEÀ!Mùz taL™Ù0 XÌB äÈx¬‘°x!+à§9w¢¸h5Ш—"\žÏó‡o b3 ØþÒb)‚ؤž h‘zŠ’Ã4žð‚ôœßŽz6äPUO©ªã¶4³ÌDävL XúÍ ²_pÂlP`óC‡ónÉöTŸVt‡Ç÷k¸Û´/—Pe2¾–Ȩ2‚>ÜxwàþGr’‡ß–Ñü¡Hv?~ù¡ÀFšŽÚ!àx>–ãüI M¬+çcCE¶t G…¾—D$1H!èǯw¶I¸o‰ñ‰[Ü|”tmXL¨M&¿hÛñvnŒÖ$ Çz™yŽÚO—–9ZŸœ09ÿst3æ¼Dë3ìC $ðÒT/M}ÿf½I¥Iy2‹E™&è,í‰W%<Ʋ({b‹RšŠ?¤g­»„¹[ªÜL«Mì1¶â¶zô³£Ð%ù¦FÉ~…¯âÏKi=uÕj˜²‰Î¢«]0Züüóµ\DI2 8Ô¦f2¹èÂÑDˆÓ …NÎöz^(ŸbÝ1ñS‘xþ´Ì@ú$ß -?±d“à©D¦ˆAñMKƒEš¶M°Ïç¶-Ç£äXË ÇïeŽšLÛG³§löÔiv@w™(ðO€3·»mZu´?"+ñ”½ÛãѰ´¾Ø2ó¡›8Â]t=‚:?E‰MÔ˜1[é÷¦û‹%"ò Ü3ÿ5åÎ ÔÆÜá”ì¡åß pK#Q> stream xÚ­ÉrÛ6ôî¯Ps)9–‚‹(ÆãK3]’K3fzHz€)ÈbC*Æq;ù÷¾‡.VH%éxloßh¶ˆá‡-ÊxQ¤iTf›Eu¼ŠTß/èá·Ÿ¯˜§[ájDùÃöêùOy¾`qTÆ%[l÷cQÛÝâ]ðòÀOVèp•¦i°~®²,Þhu¯ùñXËûp•y’ë4ücûúêÇm¯  ßhR~Å,g€ÍëM±4#Û¶êÓ$ŸNZS+‰FïzÌûhX Û¦ñØü›—$êŽMàä2€K`«è2@?Ò‹±º *\±Àâ“ööXGtD k ÈÑìH '„Œ6º7-öB Y‰%¼ç ±Œž,VŒ‚²biÄrЉ=p‹ÉbÁ)2ÁD*â•myøæ‘N.=¢¡iž"°–ÆrTëÞÔžHìÁ0 R‹ë# ¶á& ô£+G¨ˆ®5žü}Ì2qKåÞØ.èiì}dääW–5†-M3H˜W‘¢ýîZ+9)}¸ÖQ–nÆ5T$Á(+;_D@t§TãÅ757ïã<Þ.·p°™Òž 9w|0¤ÌUCs• è¥Þ{$R>àE€>¼D×{ï…ùä!Êz{ð´†I×õâc9¤6)—„¤d^@ÉžèȰj ñ¯$éèu‹Oüxj¼f,ë‘e}§Þ×R†X¡÷çÔ† F¸¬.§Ì;+¬>«{¥–w\Ïg6KJŸ£ 8ƒ'- N2t(ˆ¶n­{×ÚéÀ Ý…RÛ=ˆsE2gB~Éö<øî"óŠÇ`øŠ›ä#$`)l²`:ü4XÒ¤§•’;rï„8 RGÐW%iÄÌ-€_„ö£6$ƒÓ«©iøtºqŽžpg oß´ÀØ4-z×$iWþYÐo#jŒtèób*g«) ‰'„kR¼¥ãr‡EYž¯FX쎆߲›éåÙQì1¾#7uH~7SügiÄo>û-2VK2?wŠ’u”Æ ½­æ"—q<NW²¶5Ôåß/GBÇC»ŸÜxqþÞ<‘ì]À*h¼‰œ ZŽ¿ ªÌòAÓ¯­=µÖ‹O/©N4>èíšÝ9Á–O`’nDŸ ËùÌxNH=Œ†™Ì *â·†EüÚ$ò ãÔŒ…­¦”~¾>ÂkãÄ2²Hç™L“®r“2Ê7%)z… Âê,†»™fÓÀW3á`°TiKp!=OB„s:ð½»y¹"¦–„ ­‚¦Þ‹åTîíAµ÷‡ËËùwüômUu_tZìÚª_ÂÝ7 »‹ë.cpC@×2‰>Ìôe:ÿÈÁž¾”~ÃÒ.ÿssþo½‰ÿ}ùFY¨ endstream endobj 1453 0 obj << /Length 1359 /Filter /FlateDecode >> stream xÚ­Ënã6ðž¯r’°±ª·í¾4h‹,P`ѽ¤{àÊ”ÍV¦\=ì¤Eþ½3J¦l: ŠbÕ3œ÷Ë þ…ÎÈ ~ÈCð/'m‚œ…C:wsÖpMÛªˆÃ]ÍÛ®–·^4u_öXä®FC èí B>œÀhçAàº^£>ŽvÖ@ Šþ*³ãV”ZQ!GŠž×fÃ!K”£PC”'¦.p{Ê)8€ã)+9±ªx]=—º‹b…R”WîÊ«À|ˆÀ”d”j[¥>Jä-Z²*òèÎî¼(I>—(ŠUŠ\¨²Œ Ã÷åÐБÑÇ(Oº(:I)nW(N]Ššð}”,ÚX«–5dBQ•e…Izlt([^÷é3?K‹lÓ\IŸ)Ls%ñàe?1”Xcš`¨L\ßæ¯HQ~ïƒ-´X‡÷6ÑÑÌŸãMÞ¦Înöcd%£Ž`‚Öqe›‰ ÛÜiZÖbã>×áY²%‹Æ%`8?³Ç;,Ón¿”üh µ´÷í‹ÁÑnai¶}«T-ÞÞ×Q)vhl9úvÜ'`ö$-MKAxÀk~ZÊ[û„ÿ?¯ v ªÛ g̸$ ±öŠ•MEÙbÃ%FMRhI×mϔ˼¬ša£V‹JO¯;\]Á…Úf‘¼÷!=ÕL±÷L¯î Tƒ]­½¬;£À¶ç¿åeý¼¨«Ýeñt²f^^$õ¹_Ϙ=ªÁ‚Û´C:wú«¶™4r;0¶A‡p}¿ÕÀ¨ƒãîKU§ÙþÕÁ‚æå ÍÃ~N¯ë£h4‹£§SŽà©«48nâ)Bñ‰Ë¢RxsàŽT)ŽóóŒjP”2>vléæ£Ô¶ìë3÷箯Å$ÎÜRü©ÍKbÚ¹ðöÁÞJ>}² Ãô„Å)g*F-.Ä*Ó°@"ûaDLæ‡ ]?=@¿V‹b’õ‹"RÌ"ê¬H³¯U‚Äg8b ‚NE˜I¢â%ß0Ú)ÞXš¡2ùŽÓ-Ö˜ø¼@„„t-“9ï.(Õn=ÌL¦7Q·F=cß\$â`wåýJМ¢{VsÙ¾3EkÎti>[GÍ{¿EE/áÙuê÷áóòyñú6˃æ`<=‚?ñk ~ œ18_ ¡ñXñ ‡ÿÉyb:h`úooSqï?•T £ËHä°½¯ß ÄHš‚­ñ8Åëe/ú¿Mü ‰Ð¥ endstream endobj 1327 0 obj << /Type /ObjStm /N 100 /First 976 /Length 1950 /Filter /FlateDecode >> stream xÚÅY[OÜF~ß_1oI:žË™[EJBA‘A"¥My0‹Û.kä5"ô¡¿½ßCʲ†]Ö$‰"tlŸ™sûæ›3³Ú%”ÐÖÐÁ°à„Q‰-ŒËŸ’°¤!X%( ZPr,áˆRÂ…È‚Áè#‚å ÉŠYpZDÍÊΊ¤- J¤lÂáµòláb#”:Úz¨P÷ï\L˜ž½ñü¼¬Ç1dw<†E~´_S„1 ï2< y:o…Ñ*›HÂऀ°‘”‘&\ž7BJ]@r(²c0h¼æ¯“Ëž¼‹p6!‘&¦üC“ÍC RÎ^TÂ*oÒb5{¢l«Ù„2Q ¬w9 ³ì,$ZdßRÄ3'Ìâr°1øÏî%èEkØæKy>øM]Ü …ÔÙ—D‚¬â™QOâ2je¡gcÖC‰“L #† AÞ:–06XÄA z!äÔF@ÄçN8¥yþ8°ðÎ g€¼³ÂåÚrrJÒï\¶¦5$.)@伊l"@bH’î‚á“‹”$á•&–<$ CµðZçI¬ð†‘G,8ö p÷†­ál˜€iÏ@ŠÂ;ÅûÞe±.¼c 0é;W)<°˜/æù ¤‰O9DPä`© :OÀ9eyÅ8ž„WJ†30lb5$°Hà²wEðÙ;Öóy:…¤Ñ‹£âÃåY%ŠW³YÝŽŠ×usT5â3¯ru0*öªq+>ò´È!ìJ¶m”•.ï%–/ôöÏÛ<Ï»ÉìoÌ&^¼ž(>î½íþ<=iÛ³ùó¢(ç—§gmÝVr^Ÿ7ãêKÝWrRÇåtZ5—EÛ”³ùYÙT³ñ¥„ö3ñòåÿÙ×-øbQx%öDñé÷? P’ÙùtzpŸ9'Ž‹ŠÛõ¬ÍŽn3¡„nÀ62 t2– JßÉŒzÀ…0¾Ømêñ~…äˆbwk[ª¯­ø65¾‘ɧ;»ïÄÎI=oçãfrÖ¸R9©ŸŠ7MU¶“z¶U¶•xºõtãTP–ÏÅ_Tx¢Ô软V©ä©jX{u]aaæ»ó¹Ø-Û¶jf7Êýë×vg¿Å¬(ùgŽ~T||³ÇO1?]Ų4bÿ•øRNçÕckÌÊ`oª –‚¥‡Û)ì–Çøöªf휷Ó͹Wu°žwûU~÷¾:š”¯ë¯Ý²ò ¸ Í.ƒI²jÁ…Œ_pÒ½ _…]†è§ßÿâõËjoOMÞœc§‰Ç¼E§„g +K|Så¾ßW„ØSÿ°"tL8GrOÁéÉ- ‹ö¯8sûî¢Pl NÞ¬¼±ñ¶à¥Ò:ßør§þP àéqSMàØŸŠÔüòìø&>܀ȓ–‰áBQFÞ圑h{6±ßa4¬AÄ·”lJÛÇæD¼«w€Ã»epx»98¼Œ $w51IîM"™¸=PJ‚Þ{Ë2ž4ãiµT OkTâ–%=Ú³•ŠF[ÉÑ€½“z/åf`qƒê)n\³¸Á,ѯOë$tQÉ+cz8´ù´¡{µY*ür*=, 8W$ìPÀÃ7dÂYÇ¡Œ O^Æz?-«é0êî'ùdäbLhgÑÄ —¢${Íî·Íù¸=oªùÒb n lÜRrXÓg¦ûq"“ Tc¡Í5ÛI£'êô¤ÍRTk$ë¦Ns2À zâðýÚ˜R» ùõãw”س£D; W4¼çÛ(d—Izsʈה‘ü•ãµpÝR¥Gh©œ 8¸ðÙŽÏëÜRZ*mú÷Îo·PDF*t:‚:°tq’“Ñ÷±§)H.®—I­» ÔîÞ¾Y%ñT G#¬Å:$¸¡"8I÷š­š¦nËf>§±’_Ë\™&ô«ÛÃ}¦'§óE§u®n)¹âñn…"Á7X“22èÇ^Ÿƒ¯ V³Üàc©eºà;½Myïû¬›¯(Ó V$•z ë…Išn³"_qfêãÎNPþúÍàÖŠ€^‡ÖÏ# |Îdh¢•Hnïº)±d/æƒùGZÉw÷ÚxÉçƒ]Û8ýÝL¢X¤ $ˆÎQwQ:ÂJL½&·'ÇháòvòO5¡~Oyd.¡.!7 rÿ“ö ×ÃN?,›qýC ¹dñGÑ^ endstream endobj 1460 0 obj << /Length 1668 /Filter /FlateDecode >> stream xÚXYoÛF~÷¯P¤X%Íå)ÅðC[4=P4Aá·´ÖÒJ"JqîÒ¶Zô¿wŽ¥DŤlˆö˜kg¾9h9 ៜ,ÂIÇÁ"™O–»‹N›Í„üt!=Ý g=Êïo/®Þ§éD†Á"\ÈÉíº/êv5ù$~تÚéf:‹ãXd靈$IÅÇÆlµÛÕf:‹ò4ŠD–NÿºýõâÇÛƒ28}¡UHùÔ¬¬o– e¤É$›'Œ¶íÞ«)p§ÂÔºQÎ4¼+ªÂý¦aQ9>x„ä念jtå‚a"¼þŸ¦ÍdÈôk]÷£¢šÂé11’åxõ÷7÷×C×G5k„rn<Ëšf’=Ñ7î )Ê‚8Œúš†ü³T–^»Ü¥×FËÞSíÚ¦êÝ,îúT•|ªªöö¢I~zg_õM§<ŒNèû®]2ÉLFažŠ«+–ñ¡uuë,o¢A upð(²ÇY³‡Ã¿”ý9û½#ƒG/*Ç$Eƒ†ô$í;kdø"&_'¹L ÕBiu¾ŸÎcIò\¬ÛÆmµßèGµ«KmygÖø;Ö5í@¢í%¨’±°Z{]'™û‰¸~Ó]­†lùDÒÔár€¹.HÑwé˶ÍcRæâ;»ßÕθ3rî”Õ>É:“lg ÖÍŪ-G”`…¬KÆ )Ï#tœd#Lò`.}EË‚7³H|€°ŠÊ®œºöÈ!ˆíØeÙ‘;ÌÿòT¶;íŠ%ÈÉñ-þ¤¢4›b©JÞÔê8}â/²®è>çÆp.ZK` :²"¬šïîŠJ5{&Q=#ñ 7{ƒ‚é,Ëâg3rñ0Å‹{ú¿Ô%x¶Õ 2•× ˆkø¦°C‰´*î‹•^áó3q‡,{\ç€Eã¶Sð;¹—xV“axG,ªÙ´;ͺ¬çÒÝÒй7Õ±À§áëF“ûau?MS¡ÊVÛÎzüÚt’ÈJ곤³òö*Øtf‚¼'~i+¼‰Ø¹tup®ïhžb9±EµÔ¼u[&;’;rO°)÷|õ°U'2ò;¼ò\¯ *%‹:K7…Õ,¼Böâz©*fkíA­h¼ë¶ZºÂT#9'1ÞŽÇÿÜcïÇÃGŒ^œ©¨j§(ZÂÓŒð` 4Èg_a€d.6;§­›zÕ=¨á”IË+·ÅâÊ4̪¿´v¼4c™Ö‹ÞãÕ~ØL|$FšÄâÔ‘Ê’†ë6.¡Í¬²ìºH„9–cŽU+OÁÐ…EݘaÄÂŽ‹¿[ºÎ…U;Oè1Á€½ä Ó÷<Yª´¦oŠ‚++9ÒÞÉáöCW 4ž¶tïÆü8B ·cõ3oµ*ÆÀÕIñÆÍΈ±íkÔò9I,èÍA;t<«¨KȵZvuF –û"³^‘r óTÄ^ãvÈ.|%;T$†9d-Œ<ýd}¼<“”–’\üäTQ.Õ^éq÷nkªxøaȽ4; ë$…wŠEŽ|taCÊÊÔœ°1-úbž£j9½ AâîŽàkJ&ÇgZŠsÛh–3ïÚxUÇ8pk¢Ã.ØC‰M’“¯ôÒ·¸yWs¾Î¹H å))q>¹¸ÏÀ‚Š3æ8ºð_݃9ÌpG>ôÇ’©ØhX<5¸ìHF'ªóó†øfˆsæãyD÷ësIwì â9ÃÇrŸŠÓÄ×^«’FE˜°|¶U~ÑgòUWŦòÌD×U08 ˜+y˜r%‡Sø<€Y¨-N8q:çn<Rõ7MvÌ}‰øò‘W³Ÿ_ù>‰Ðz[sð^û3þ¹¹áÓz$iúåžã#œsy°gFãq‘n‰¨LõF4ž§9÷À³Óös¸ø|ÜÚ Á“gCðÃÖ'‘Œá ÉÓV½òóX¥a\ñ¾?1úì†ÓÂã‚Æ…ôðl}È϶±O’L@Õ…šîÐ':YÃH<Æ™ gÆÃLvÉ£$|(œ#q §)4éÆÌäéà häxw³.Íožz¼Æ½iz(¨è”òÝW<> stream xÚ½XmoÛ6þž_á`h Ç–«wËIÝ¡ËÖ­ÃÐ ë6€¶i[,y$Õ$C~üîx”c;¢œ´À¤äsïÇ£üŽ~gäu†a8Eig¶>ñ4U,;4yÿý‰oö¹°ÑÝÙùÍääùë8îøÞ`äüÎd± 5™w>8W+¶Q\tÝ0 ä¢ëFQìü,Ê¥`ëuV,»n0ŒƒÀI’O¾›l™õ‘Rá·b%b%i4ðÈÄ:#»Cá?¸QzNQ*’—ÿS±\š{x`4ð€±†{aAƱ“s) N­XѰ6ÙÐ`9¥x¬¸†ÃË6KÁÙÖc_¤Å&y·ñÙY‹Ð¬˜Ø^ì]gjEBÏJ ûN¦²²`9Ñø§nœ8,¯RéT¹ 5‘-WÝ u”»Ú"2±¬Ö¼Ðd@÷¡úY‹êˆ{áî®EÙÚuEAÝÿU×»]AÐãµÜ´#˜È8mAÀ\n@ð#(Ѿ ¯äíz£JÅ›á´}rY’õdµÙ`í•$’Zq²â•›g£ ¹Ý3ò–¬Ìn.šäs·&/’€Ó²„Óq;›Rà'>ÆØdD|Iƒ§§§_Ó DÅivAÃôà—Mj6±h½üÐYTÅLÇQƒÀ`?p&¤\V€}GlPü[#Óé7cùžŸÞƒ½{ÿùXûÁç“u¶È¿} ô7‰·RFÎÛwƒõ8Ã{œ«Ÿ~?†ãÆ#º½feEe°«I9gsÝâ¹(%BJîäSo/˜'aU’e¹æž„þQîC/¹ç¾)7¦Žê|°Ö¡*IÌÄÔ)7UÎt~éUÜyKëeÁTZkæã9ë—·<ÀLðO\HnÄ5™ÞßÖnS¡A¨–’lú€Ò7&ùI\ÆÖ$3M£ÅkÜ[Šù~'’×™‹)¼¬û™š¿©iÐ-<Àx3©gÜ™ @¸â& œ_4TŽØÃZ1°béqCÄÌ Æä‚©RH[´ Iý\x*E1Ö¯ú4r6CVô õ‰bŸ !vo ½Ü»Ï÷Às¸¯÷¤ì‹ ¶¹O<8çOæñüÉ<¾z2g¶zÕîh4[ K3fü6%ûÓJb†¡Ã˜q/£Aò|±—9{Þƒ;öÓAùÛ °8¥­ÃvGã¾^Ï’]€HÙ9¼nȉÑTw4‡j@Íþ°w°èº6F©f4çMŒRb”0Fg}7Tsó¹ik^wÓðþýxÃÖ›œ÷m}ýN Kö«ÙØ¿lbdßÞ˜Æà²Ák[ã^/»´%û.[¹}éfð~‚'[~o˜m¿³ÓïÏJsþE:™õqÖ š•½W7ùîß(ud$¾c vŸ¾Å˜G*¾ðÂ<¬Sš¶}Ò4' ìÈlÑŒ‹öÔÅ“¶ðÔ'1Üp¢?Ëàd_ôã×$öŒUÒìÖÅ80]©fR¬¸¨iíë׸>Í–¼¯ ‘wƒ$Æ gõýUåsú õÙáz‡#6jŠÛlŠâÁ S+÷c™ôY ({~ »Tñ7E-§B IY!+f$:Œ:ÛÂr7¸¬•(õZ* ,Z}§OêR|æå·4/8Ÿó9¶#ÝÐU×hœÈj*U¦*e(Í`Âo ÈJiïàC¸"0 Ï¡‘pý–î¥í2A^ãºeGzáC;‚€ÆgðÔ Dµ¡ü=º‹ ©‹ùUráîúgµ-úv FCxðæy‰Ç5Åà¥CÒ?—D]3s½àím‰?è¶ F)…zs„þrCòYâv`ýDœZ;ÂÇû©‚Ðj‘¦´W*QÍ܆*ª*ÁM7ß¶ Ÿ¬ð©OÏzªßú‚3ðòâÅÛ5÷ ç4<§á ÑpJ˽/3csOšñ…_šñŒ†;ƒd óíÆ|¼qÝz¬ÅéÕŸÎÿZä- endstream endobj 1469 0 obj << /Length 1031 /Filter /FlateDecode >> stream xÚ•Wmoâ8þÞ_V÷!¨àµ“8„-T÷¢=´÷á´Ú"Ý®'eƒ Öå9Ζªê?Û3á„¥«ª8ÌËã™gÆãÀÔü±Á”&A@¦a*”‘åò_`¿KÎm:¬´¹5…P2ynꢒ¾È¬dy€ÎA#1P§B餵ÑnÊczu×PìÍ•]צf52oø+OH©x²^rÊ0ŽÊÂÅ›ki²ëïÎÚv:µg?÷ïúN‚mü<÷ ½b“ó‰ÿÞ'<¤”òÞI|èí`ñÌl Òþê! ž¯‰¨/L±1™ë.”p»ìGÎöjþþÿ:h°¿õß°wàvFÓëÔ²týÖ½à§.o žÑ´xÛ,:¼ØJìñîÛE·¥«FïÝ׬ã>Ш/FÞþøX^x endstream endobj 1474 0 obj << /Length 1372 /Filter /FlateDecode >> stream xÚµWKoã6¾çW=I…¥ˆõJàC»Øt[ôPt½${ mÚV!KŽ(em,ö¿wFCÊ’"g·‡"@DçÅo^4›yðÇf©7‹ƒÀMy2[n¼–Zíf´øû·¦ù`tzœ¿.onÂpÆ<7õR6[nûª–›Ù£õn/޵¬l'+º³ÎC믪ÜUâpÈŠíøqèûV”ØŸ—ܼ_vÆ€úƒ^!çk·¢‘[QÂ]pr+Bk í°Àe!ÑœÀõ=.–>y¡Çæ >lê8™Pȼ)N–LQ}7öã$õýÄãqìñ u¾Ëá0 yÀü4äþ¤š$pyÄ=T¥Œµ×¼}HüãnÀ#±?u½XG(r™o;aä[vXM±®³²P$9D¥Àž’ä/ê|8Öe-5ï À¬m§¶¡%*i·ôº’¢–ÚEß;„M•‰U.5éKVï5iPÙ®ucô`TвpŒ«ŠöÂö8€rÛš<æ80Flf¡f)Œº‹ 1ë“}ÝÀNëž6õ]‹}K‰ƒ$RÑ­DŒfç%ZýÒú´™4«’¤ók£åSDÅg¢ îÒžm2Ug€ÀTJtˆ)·=†LH9žÈõ#]x©Brðt×d K­ Iâ"´ŽB)ŒWÈq&:Áž7 J¼ÄZÚ ·Ê‹ŒV3¶[õXà·²’ÅZ.<Á¸Žù¹½€ÓÝ wK`ÍK%©Ï@<àË­¬ ½ ª«f­sN1w”Ô"¥ÉìSnJ,ˆú<§³£Øi‘ȧ´¸êYiNaLªò I•ìÉc|-dbØJ 1•Û©*|lϾW|¨ 3X×ßAuÕ;p;мqbsêêÕI"J_¨"#„}+mwlOD±¹è(›z¨Föä¡|/Õ‹ÄAõvý–…n”„à °Éÿ»k] îëi¡¬gBh%§¹þ¢hç~ª|N‹ð ½_Hh4*ˆðµ’pÉ‚6,¾ÿv?ÑrN‹ža_¡gÝÞ’Èzƒ9GÛV\›Zs´ €j“×scunœ±)Ð}ˆ´O%ÓA¨ùføP–,1K*±É0^"'ø{݃!1¯‹Ìôý~ŒšÞd¼¦ÌwASÏ"r âµü•²†¹Ð}¸÷csúùt¯{JŸQ«ø6ÙNŸ«E“bÆqØÅlÕÔ# /¨´qÐá‚DÅ1ƒË¥e}^tֻߋö&Ðay'°v„6¶”í¾®, }Óöl<¯KúB”ù‹mX L Ë*Û5<©þ{t„N:a²VïWæÛËxÜð>‰<ƒd äoŸ­mÙTClôEE,V 2‡O§ó÷⥧Æô˜7õ0â€×-›‘Z£UçÚ¥Wä¹7é:*ª³úì^{O4#®¡Ñá¾÷?Ø ˜þaZ “’òtSŠj˜ŽŠ¢Ô‡+â:/8ï/àù‘¼j´ë7ìz!Æ¡ëß·,`ìë•¶z,Á/H…qdÝîf\—Íü øíö²rÊj#«Ÿ B~yµâÌzG½„Ú®hÙ60Q# Üâ#PÔt`ºÍ”ZêŠá +B-nÜ×Ü^\­êºn_MG(õÄÔq[ÆmsÁÝêrÄ­]FïÆÑËÈÌeg[É®UgB·ïöpõ%Ò(ìåFn'…­7‡¹$Ù6S¸<Òr1˜Ëº&“ÏdœqÄÈõTT ºÖûç&ƒüïz öÕ6?+ù’AK¡]žS¿8zîŠ ¤Þ`ªÞœjø+ù_q endstream endobj 1479 0 obj << /Length 1066 /Filter /FlateDecode >> stream xÚWKÛ6¾ï¯0r’ÐH+êe+‹Ò¢ôÒ¢0æÚ¦,¢2iˆ´7ØÿÞeË^9u4g>g>Òl’ÀMªd2Ͳ¸Êg“åæ!qÚn=!á¯_˜·‹À0Xþ8xü¥(&,‰«¤b“y=t5_MžƒŸ¾µ¢ £,Ë‚ò]åyüÙéuÇ7©Öa”N‹4 Ê*ü{þûÃÏóS0ÐÞ‰ -_Ã*‡°XšÅ -gy̲œ°uÂî:Âú"Pâ@‚TöSR$ðñ0b$~.Øü ž^žô$b,ÎÁyIJ˜äûÅÍ$^ÇH Nõ––óÕjqœ¾‡è0ÞÃ<-:tÒ 4¡%(14¦QVN‹àñ‘¼~D[Cò,Fo×ç±".g€5eqR¥¢ˆÃ¨,“à%ð fÁ†‡é,8Ò +ˆÏò~’Ó§Þ…,PK+µò.2þLFcžƒ·è¢ ÄÀ[p„šiP뎼/yÛ­þVÿnJz—ÛNì¥Þ™Öog%–-‡=õ» -iAÇsè35< nŒ\+W·y’\iÛ`uãÀ‘‚l ‡ D$µöÓŠoÄŠŠ ‡}`ÁÝWZ< h‘ß4º9¸üP–:@˜³i ëñt8§ãépž{8èìœ÷±Õ|ùÖívÑWAš¸Sgõ ŽÏøQí+D¢3 Ýç úó„•Ù¶¤4–Dt¿\ ã l ɺ“k©¸_¸§ sŠ«o$ç¾R{i'9Ú¡m»3¶ã–ê#óU” 5ÒÐ@|æ›m+ÞÅN.[k¯åŠú±Æú ÕØ9®þM#ßœi!³=ÑLZÆY®c®ïyw£¹P~{ëó:¡'¢Ã€ˆpc0ë÷'ÒEÄWPÏYX¥áåé»! ¯§ª¾_ïEG-2 ãuoø«¾oÚÊ]Ì^zfÿpÉKiQœ™†K®PÈ¡é#"Ôî 6JÈP8=¼ PÏ/½‘Ñ>Ä™NòE+Hcnɲá>¢$üš/ßâ^â×¾/¡åRZbuìSàÞÊ©qs‡'€ŸIPÈxg9Ê‹2:š,vÖÛj/áøø|³OÄê;ˆ`¡uKÃÅÅÍ?¬ì«>¾Zr³¥=“Q˜³åy<úÌ­ƒj»2¾Ÿ|Fºú^à×ü7vÐ'5Äÿ‡ð6cØn'FZmø‚B“·^l„zÝ‹BLá˸„óð:+)ÎsÜl­¶büVN+ænå´J¨JQ¡VªZ®Ö;¾öúƒ¿±QþGùÇ­¨{®Ã@c;Á­!¹†‚4:h¸ÿB–}âë'­*jgÔ¶Ãøäæð¸Î/“;xI8Rs¯"l¬Ó³{DÂ%‘¦ñóÙ;ßyÜô7®îoÜFHÿ¿ß\žÞÂÄý¿„ÿ!ÑBî endstream endobj 1485 0 obj << /Length 2382 /Filter /FlateDecode >> stream xÚ¥Y[Û6~ϯ0öIFƪ.”dw‡6»-¶E±;E’>p$ÚCŒ.^QÊØXô¿ï¹I–)™`dD’‡çÆïÒá*€áj¬²8öwj»Ê«7QÛÊÿúùM(ó60q3™ùãÛï~J’Uø»`®öSVÅêƒ÷þI;Ó®7q{é÷ëR‰÷[ÛZ]U¶>¬7Q–D‘—ë?~yó‡q3 ¾R*œù±Â@Á¨Z¥[凱bÙ~Zoc¯¯óÎ6µAv©§[#²lÖÑÖ{Á?¦`b×ð7_oB˜±½ ™×=™Ê™òMV­ÉûÖY¦•gÜËõãÈûAfØš¿ïQu8JüÁ{ûVèÉ5ýŒ(Xý1Um;‘¸6®•½›9¬6!+¿ c?LX÷[‚ì* ½ƒ©M«‘‹J#O3Ñu:_G™÷Ì]2kÒ®Iƒc/<ö1H‚Öaã­×´$’µ»fh•©‘C§ÑÞ<¸×}Ù>j‡Ž(s²X†û GòCÓ>cÈ Nh²:"© ¼fß=3ZqçïÒ(%#nâ0ó~þõ÷Y ÓÂÒ>¶º=Ϻ†v€ Î@¯OKL²ñ>ËùJ„kY¸ÌöLB&['ßÌ_–ìÌÀÓÏÎòø¡‡¸kň¤¢­ 2ñYŽm´Ë ÊvŠb§l§Ô#¶KÀº7{Šc`^€ ÊˆÿC~Š­›Óížùi3¿ܹ:vMgæmg™çp”ù8ƈÃͶèeœP5x耡eNö±42b(Ÿtm]Ť=Úç‚O`Çý½dž6è«y7<£ºæ©ßxÞ¾Ÿ 8ˆ+ŒÌ]äUw‘Ž%n…@1~y2¨$Æ9žzÁÈ$ÂEr$ÛìI‹„DÏòG“ëÞž•›¶ÓÌ)ö Ýiá9]çx!mF[K›ÛŽL˵븅(‡_ö ²%6G°ö“uÍ -B¯7ÍxÓlÜßQðßfÔ/ÆTÜúð¶tÂñO 7õA¦o#>È»©Í ^}¥+Ñì;C|°Gˆjl!¤ »öÐÛβd©÷H&âvÓ¦¥$„½©’ÛBÒ¾m*ž*¾K=‡f4l¹T,7®š1~ÞõÁŽæ¥85’'ÍI#[úXyÉ!õÒy“3n ¤%Hˆ ,ºÀÖ÷ô»ðŽ[—ï64vþÛš®ok™ýöñþ¯¹Ãp³èYÏ$jA„´Å<8€n²kˆ!†ýÐîØ}÷5Ö~ðæŽùE~@¹“áD‘tX¼U@ ¨_öÒÅ,‚_ͤ ))ˆßñ6iëPÜ €#}9lØ«‹iïž|ÙÓhî×·8mfÒ¾DÞ±…$Ë03¡¥X ¸¼ôà¾à6eŽ‚£È¹‰qA]d'^, •&ܯLI§¤_)!UÄ=S³Ù(™ËFRÐýÏaÀrà×5•Áìˆ\…TX-Íɋا# ßÖT†á‚Õoe˜Nr3T`S1€h›ãŠ'îNãA6»ÎA<.ÕÌi L ø9¸&/5'z‰$óˆi’ˆöÁÉœ¥4*ø0ãàmöK0K=¯Å­IL.äðK¢Ñ‡ŽÇ^l÷$kpXÊKYw­ã °í¬iÓ²Ðû½.í¸«Š8ÚÔ6Ü~ÏCº.¸ñm¹™–”º>ô="Ü.(Í#OôC=9¢£T•âî{¬}ÆV¬ Ð*Œ˜ë…nd€DÓnæÔ‡ÓÅppŒßzè_‹ƒ4޾€ã!€·"Óq q K³8ÏéJZõزõͤIÃ%°§„dÂÜ^PA\7ÝLøa¹’áìCHÀ¥(Jÿ`A’£ÀF‚N­ (ÇÅ‚²”þ*ðøb(¾ÇáÌÀ¬Ø þ‡µ•ðõr|y(— &£¡igª' Ûç¥í¶„²X±~haVÞÐfÅl}µ’9VFpq‚¦š?ìG*¥ˆzS€2V—”§Ð\A)&‡ZP|ÜR˜—,_NžBò%–³áOTTÅ ìÞ1Äq‘'Ÿ¡\,U ¡†Q¥xû UKµ.¤û&4(ªáË "BP“.z¢™ö37¢˜âޝ„Cõ1Ÿèä<¨ÏqYQh7½dt¦ÊšÉf2rÐx+ãÎÈšà›çfÃÜÝPér`)ßÞõº„sBö‡ZOa­7‡ŸCå÷õRo¬í®+½“Ôy#á<)òØå¡¯’ë×€iñ§·ç{1ìtªˆø×œÜ/­íð0êîô.Æmñÿý+ IpƱ§T¥B/Vw€/œP˜tZÊ¡@5Ôº0¢O½Š3^(Ðq˜¢Îp»kÏ©*€6@4­¼5X*Œ³­–KºàS¡•´ù3­Î'3ñ!n uãÌÖ^ØŽé ëÊÅg±KòŒv·pɽ–Ìðej6£â4ɨsõ9={Dpµ=°È’C˜ýñêa”äÉé}‡ÞýB¾ržyØÔyÙ8á¬"ÉÝÙÑ€¡7[ªLÓŒ’‹ÞÂ[¡?H[>¿×€Å—SdL0ÅÛ…žÜØ.·—ëX”Û€½Ü ,_í–îs3·(·>Ù¦w7·æoÀÎÓýkÐ ÿNíµ¨fÁþÓ[ Ý«ÜΧvzûê4œÖi}ýÿé2ßÏUv7꽪åÅ+utâˆÙÐQñ2bü†ê •-ÍßÒs4²iI“yN®K9^ÒƒÛ–R(Ž~ cŵÂy(6M]žÿ6p’*–€`D§<Ï”ÀX,…[æÙ ÀÝ‚GJá*²îyQ›òe¤Òi-ÁÂLç$JcÒgØ…z§“c©¦“;šy™:§å×dÏÆûÔ~‰ý»,[ÜJú0…’ž­Ab°JnÜÂS)‚ÒŽZnóûüö28EÞüÒ²óz7Í' ›·à|Y4‘ÌãÏðî2l׈ k[Œ£Ÿi𺢻áG©ÿP ½ endstream endobj 1489 0 obj << /Length 1511 /Filter /FlateDecode >> stream xÚÅXÉnãF½û+t¤`‰Ãæ"Jãø0Yäá›gmª%5†‹C6½ ˜OUW5IÙ¤-z«®®åÕB‰Y?1Û³4ŠüM¼žeÅY`wëýŒ&W¿ ¦[ár@ùãõÙ‡_“d&lÄìz7du½Ýx?äQõ|E‘·ú8_Æqâ}®«}-‹B—ûù2L“0ôR1ÿzýûÙ/×Ýc°{¢THù¶X«uì‹(&±t³À÷€l5$»Y†ëØÛ} ’àñ2aL–<#Kð˜Û1W{™/æöêmk&ø¡å&§p ½²2>X+Œ¼?ÔÓÃ<\{U½]VeþDçw,¨À´,E$mchu‹âxŠHó9±žQ[:—;뜖U]Èk.Eä‹„l4|½§KcOÒr×–™ÑUI«­úˆ¸Ô¸ã[f"ÄÀqå‹4"–ŸUZ0•¡Ô‡Rg ÝÚ*#5 ¼ÀuêYÍÝY¥*C{Uk' ÚA¾Óè2S´{?OOÖZÞæŠß®vî³m@Kš•ÝìÖ±ÝjÐ+Rµ‚GSÏ:Trª¡±©Öè})M[+¶–¬›+Ï+˜4ÙÛ’„€ g訬BeSO-žÑe•5ÂVÁ,`k‡ ò”H„€×­4öxŒ¨´È´[“ …'Ïô¬(YòÅóîê[fäÆ÷luo7ê^•Ž ¿=|"½ø>+Á1®Ýñ†C‘¦`áÑ@ijOÍSqg*0S£‘ˆèK"á=hs˜fCñŒXuZLÄ5“R6ãárÁ½©÷‰–ˆ¼-Me½o'ÂöêxPHCá¢X[Åдlo ÄAŒ¡ì¯mikGoç 8Z|á„pˆ3 Ìc„TF@n”,ÃÅãå[Vjë(eI£ú«Õ£+ˆÕé 䃜ŸH©Çxb)¬‹Wòvœ&$ŒaÑÍ"ð$ï`Ò›0M¬CŠ^º‡cÓ"ƒê5Fdx÷f¹0jÊ¡‰áÞEÆD ÜžÉ4‚këuŸþ£õÆÓÅ]®3m°ràa&C'f¯H…"Œ†wòÿ¬v²Í™ÑÐD mm+ze›H3–ðá 3̨Z:Lâ\=…ľýÙQC¼44=r ZÐTœB›ŠSïnBi¬iã¨Á딾kuTîè‘ôïÓñeô$ä72* ¸|ÅNƒp›¶ÎlU›³7z`¢'r×:áJÝ#÷æPµûüù~äU·Èõ^Wmcñ[Ó"a±(a½vÇÖ'Þëp& €9+Äv“v ý\° ½+LÛ¡…ç }@91Í”åSåZÓ+Õ×B0ÐSŠ*Üêš +.t_‰nßµ6¼µƒSîÒ×GHfnä·ù@oÚ¤TLíØ0kmsɆâ^Þ¶QÏ…üøZ°±>| ¬^0Úxè:IÛ´ïkÃ~Ã4þ«­D[ (|ßïÂéæ+MKàyJ,u¼ 9ùep1– W°F:šÑðCÿ¨emo|~~®ZéùäHû(S^ö€½qäÛÆÈš§c¸BANÁÕ©A~ï‚Ì@¾åeÏãtÈXï‡Lo*,u\ ñf3…št4C>ï†ÞK&ŽE$ž—™±Ô;öú¹5ƶéQD}j¥/zìì¢b:jÎݰQ× ž˜º!>Ø×*×ø­Ÿ—«5|âÂ7§Ì¾¡SÝWœ¬½?Kå–ôÂúh—Ïܰ|¤ÞV¹&ñRÌÞ“_²Ï›9,$UíÊ2×n§)”Žª Þè¿W¸¢O}6Ø3öÚtçõ%ZæFÕðuÍ*ºB~T¹±,P„;¬àÊNY × ¾¯Kû/óÁ‹ä/dŽë…û‹ìSÍf endstream endobj 1493 0 obj << /Length 1653 /Filter /FlateDecode >> stream xÚíXKÛ6¾ï¯ð‘Fl­ž–œ ‡4H‹öÐÅÞÒ -Z&"‰*%í£Aþ{g8¤,ËònÚ^‹…!>f†óøf†Ü`áÃ_°Øú‹4мmœ-öÕoVu± Áï?Þ–n „ëå÷w7·?$É"ð½­¿ w‡±¨»|ñ½;ò¦z¹Ž¢ˆm^/×qœ°ß´*4¯*YËu˜&aÈÒpùñîç›÷wÃa°úZ!å¥Z›‰Z›,ö‚(&µ¾âiS݃$Ä‹uzþ6!Â_kAºïyƒ˜‰ûe˜1QÛeU-Ôí–“D³Z銗´ÏuÑW@ ,]KÛ²;Ò¦m7CöÚ*wfÁúL» i×öÕ~â«p-Á ó<µx ¬»iø%^%«ÍW` Þ,×A’&ìö–¶´èz]·4 ƒ9÷øçgß%äoÙ®—enÇœ>æt´òq-Jál³DZsœ>Ñ´;r»á$6¼mEnwÕœ;>ô¾šÓ73ÆÛëŒu_µ³œ ÜG)X'èxÕ4ˆQ¦ZÙ K°м“ª^Y9ÙÔW‘$ùª¯›e0¾ÿŒŸ=wE@$5Ju4æe©Ð]xù,<ü)0væûÑñ<$E£À~C‹—@º‚Îe) ^®¬¶vµ;ÚÌi;®­%‡Qf8îÚ™YñnEîáé‹9ÄÿtâsŒ¾Óü2K‚ ßcn~&·¡z ‚ͤ.ÒÑç/¡Õºua²ÒðŸÐ St¡±)IF`0è„Ý«èDû²œ6z˜ø¥•¼#¹}}&w”õˆ&r9L±å#ÉÀR(§ꬉtÀ~QpærK“‹ïËŽ–/ܶun˘, €‘}[Œ˜= sgR,3éM”C&©0>™â.A²C½²õpg2̺Á¤l$: é“I¥Ÿƒ ÆÚY«*“¼ ÔñV´ˆ…À‰×£ùZÕå>mIùGQ6‡¾$*£î¢(Ó”Ìikêc ’4u.,ù¶Ðq—·N³‘ÞÄ'­hjއ/ùKЊ'ÄМ0"Qp‚áÓÀT#ã‰"l¢ ûa™ELYÑâ‘WM)ÐUiFk+" ƒ¾µu¸’°÷Ü ºVMN¨vå€"=uè¼| o°Ùšèù«~¾™ìšo ã2s*Å3rAÜ5Ñõ¤ñ͵¶òrÑÖk#ÖàÁªÓ’s$í¦N>’ºª~ï\0;/”)'à ±ÛkÅý§å|2î½m†¶Œcßz£î ›2nˆ°Ð¥â¹¹ â ]•=öVœo0kæÝ ´oÛ§ªé°ÜÍG H ²àÛÊJ–\“L3Xìœ6‡¾ÞŸŽ$¤ìhîuN¯¾VV àjºJ#Ågïfõf¯^]¿z@ʼ·>y"!CIMÁ„•Á4%û|VÈÓÍùèÓ;Ép%˜È–»ÅZ€´4¥~$:ª4°¤¾d]oÃm†¥¶ç­l9ÄZŽËgGã‰cè)8!ü\çàv»¥f,šú(.´¤:m-$ÕqT·ép# ‡lñúٕ̄ø¦n§„™Äw=Îp0º3d±‰ãvÃÞ<r™óÎòPÃÀ ’îB¸x /Üôh D5uѰg²Ùmék:™ [Ç4.”pã—¨rº!˜ÛçHŠrרví"MN`¥I}ºƒIg› µÂ”yÁ^_Ë?{»y2u, a‘m¬:N†4à‚U¿™³Â¨õ [±n™Ú>»\áöiÆée&‹“¸ÃÉí­•~¶"»¦TwTƆ£§pZœjá…—ÇE/sñ‹¡Ä4/$Z¯MÁ…)üpÁ¾×PŠ{®a™üÁ‰‰©Ûb¯êüÍdÕBÇê%-·j ­VáÆ‹ü©!¨¸?ÌW§nC£§—}Qœ·2'ã$ôLÄX íâð C«úvjïAêÖ åÞØö-†ZéëüÎuæ·ˆ/ ²s6»¾› ÆÐc,`ˆ¡é9N‘ÙxÏÞ|£§V«—cuœÄjrËxNÞX£ý¿ÄLàf „׉¬%5àÀ-RĽ¨³ê‹ã H‹YTc{ø†˜‰=7—XÇbÚÂX\£ÅŠ…°Jª{­æô”!ò<}þ;gÃ#çSi”Žÿ2`òÿL£×Âý'òoÙHvÈ endstream endobj 1498 0 obj << /Length 2924 /Filter /FlateDecode >> stream xÚ­ÛnÛ8ö½_á>­ ÄŽî–;èCÛítE“Å`) Z¢mmuñPrÓÌ×ï¹P²ìˆr”A Šä¹ððÜegbß3YÚ“…çÍ—~4‰óg6ͪ̈́Ÿß=sô¾lœuv¾¾~vù6&Ž=_ÚKgr½î¢ºN&7Ö›­ØÕRMgžçYá‹éÌ÷ë“*7JäyZl¦3w¸®µð¦_®?<ûõº%³ä wÞc+r'Ž7·/ÍVùsÇó™­pî¸s: B×ú}:s,Qoe.¦ŽU§±È€ÝE`­÷E\§eQ!kpа{P„³˜‡žÇ_Uwù®.k©÷ åf懑µÕ”«}šÕ³´à·ïS7²¤ªˆÍ”k~K<¨jQ$B%}|0î,]åfÊ9ŸN g”Ù_v`ë§Ã³gìÍÀáWÀAë¢ŸË ­¸¬FÃÀÑGÂ,,ñæÄc¸ãÙ -ùc7úHY¹MgWÞ:öh( ô(øö1ú°- øxJb$'Ê.Fsê)ÇX(תþVõhRñj4k­ÅªM ”7wFC¡R•ž˜AçèùKë–Üa–ñ[3K®i" ÜQ§5>îx¶q\4\¢¿ëgc>¤òñžï["«Ê)ù—íø…¤xÍ|«T „CŸ¾U˜q¿–U%3ÆrðÔ„#N·T¶ªj~ù–‰™â‡ЦÀýðpÁẠæã2â{±AÆ%¬@hwˆãêŸL|eÔ7òH7Ü…ÛÑÄȳ‹‘c€‡àN¯Ãª¢`óå·TªTÌÅzDíÂþõ€éÜó:(CÏ^èkµÑaæ»LæÄf Ô/iVpûk€ÀGl2ƒ™ïÖ5S\Rzë¦ xUŽ{¸*âb0ƒ`ÚèÝG¸b–ÉönWŽôt Oë¼LFùp²\€ò¶ÖÜÇ+”d…ÕvPig¨ ‰LÈ¥LòRÌ£…ΊI¼~tV^~¢’²jÄÎT”HRQTfëDHa²<¤|ÀТõ:´ŒhA EÁ̯Pó-}’}%Õ%{Ö¼£ÒàPmuÎ Vï;áWrè`Ì€R"T.f’·‘9à@s ª‚1²,azXíqÇ¿ï‹Ò{€(tHõ^5Œ 9öšë&CuX,,Ìíñ™€"±nT3¢€°Û-lÛ ƒ-Õ÷iw—ñ¶û mdŽ@Qòv g&K˜#q©,biRè(:¿€\7j~fE|ˆ7“UÃΫQ÷±M¿™xû6ÜúȼaÄU:BÜwŒÕ\#È_L|Ò*…í¥­u&:ÞÞj•nÊ¢Ì% bžêÆ}5/€ùñ@GŸ‚*,©Ç„ ­ØóíFÿÑñC1üª—ä=M2c·jÁó…~ðÒqùŠËœŒØ™ô9×å#²\ß]s"ÌØªaÆh3P ÑºAMN®Èœ{pk®ÿ\h±ƒ³¡·de©ÆY„ëZ±L3³E¸4U¹/ƒ£…å$MóPK‰AUæ<eJõä¾ÚSÃn“ìT›®R[…Ð44è9" L}7Ð.žÇB?µOæp†PHf{©÷kkÂ1[A6È„F‹Áô6–íN.­øY”*&îøí¶]/ Bùmãu$X¸6Ýt×Êù<ç20°½·£¯ÍùÍеh8Óül¾vÏ‹šDji) ’ÕŽS 8ÉwJP<ä6Ò<Í„º`#ÄrW·MÒu3Óâ¬ö™^„ä¥àòÔôt‚n°X1Y®)µÁÞCÉ2Á¯Z#Ò„gµ¶sí°ÚÑ6­YÆæ”?¿‹¦öäóîq°#Ë*%±hfQx›}.›ÍS¦ Ã$ δ%Ù#£BnÄ6•í]ÚTÊ/qÖuœÑFV¨çKz¾É{6 H‰B×aÌ;()/œ³T!>ù-mŽO0êÄ'œçÇP>xl3Õ¦0k6¸ÝÛ-Ä_`jÛT§:Ä­e¨æ¦àäœ ̤uu(gy©+.]9Tz¥Ð@G†t 3ç‚wÙš£R/:ì‚T•º| ƒ"ÒÚªÒå¸9;U0.|:B•Ý¡'d'8ÜhèRd”#ÿÞ§Úþ:å0¯srJ²×ý¯Ât´äMÇ¡;d\;‘ª¾I'Žn¸{œuM«GÿQ ìÜÔÛ³­ai«‚¡&˜o‘`Øõ›¥ºÏ‘!]í)Þ¤­¹T(fs¶ng+)ô¸p›Ö[Sƒv"ÕsÊG݉eh½_3z¡™ìz%s ?6=ÐW4 ÏŽ¬†-t·¥47/ˆM³¯ *U#oʹ‚l›.<£Ê]Ó¹D„¨»%6 TLåa—µ…®ª©m¢góŒ’Õ½šÏÍ}Át{_QsªêI(Üú8_lZA8Ñ Ì4WæGÎÀ•ÑÎæÊfÎàEP•è†Ç¹ö±TÔMaÞj„6½—öEÓdÑS«—¸ ¢§‰ƒÓ¨­ã¥OáŠå‡ãƒ÷ÅËPí$=oÄÅê È šä«ç\ˆ´á~ ¯tZuÌÉîzn·/Jyˆß9Þ¨ëbJ]A¹ÚSãºÜzÀ'·1in§õ€Ë7 m§‰0I/­W¼ðNì« {Ü0ˆ+} ÒBë. ½QÀCXMæu¢¾Ô ò9Ûö±-še²‘#LÓTxB9]ÃáÓ¸â}P{@þ!1Oñ·êLHúo0lœ¾U› ž…n"¢då{Ê&äërÄô·\Ø’—äG“}&ò•NP |°0—€^h´ ü«Á§á.ÃŤÜÙm-«ì¿{#rVQV,[å%лOÇc='tá@ù°ñ¶,+yÌàE“0éßÎpv86F‰áS YÃ)z!¬—ƈl÷|3$ ®õÜ ¤y ýS«r’ÝD«fj(ËçÝ´ç~§»IºúÜl1¨˜”îÞìZÎPpQ·QL–óeè†Mâç[ïþóß~ÅUœ6_ÿ?¦+EŸE7 íÝÕG}’€’·©Ü ”\aöˆÓÔj8ù Š¿çNäNÜ ˜‡Nxæg(ÍîYg;ÿBæH¡O‘ògºÞU/./Y1½Hcêø¼ÛÛÛù¦ØÏKµ¹¬Êu} 7r¹©²ËQ…¼ã8þ¹>ð"˜®k‘b8Ât÷ø<ÎkpæŒGc„À©™Õî=¬Ó^4ñ íÞáèl“ 7¿JÏç÷iE®o½þ9ðWé×DªôûOòðSHN¤úTåW–Ê`²mú9Å2b¯EW:C´hxy0"¢Nª@\ÖÕG÷ÑÉ{Mí­û«àз~{"<ÿ{"¡\ú4’ÏÙÒÕž ¡?ˆ¸\¥<– %-"{Ùý©Ie¦ŽÔn¾ðÁª".’¢eçŒ,L_¹ñÛu¡‹&õÙåÉ—ÊÀ¶•´‚ŒÑàCm¸‚tœÃ÷]ë*5»vß5_ rõf–Ãìû(¡bM”~Ó'ÎîàˆéÀqlëSö3ÎnæG‘.nƒæç¿PöNe.Š‚gÿ‘µî œi¥è½çsêh„‡ ¤ü!ð¯f‰>{PV˜ïöµæJ³ÑWYÇêûÕÕsÓpŸG­tgn¿0¥6z#Íw%þª$€Ô2Î_ú.áV¥5U’W”¿f þÿr¾G:ðS ¶.ê4tÿ_ðc-oywCôïOv{Õ|×Ñ%–î¢@>·¿÷Ñ‹M‰ò»]#{ endstream endobj 1504 0 obj << /Length 2381 /Filter /FlateDecode >> stream xÚÍYKoã8¾÷¯0úD‘WÔÓÚÀ‡î™žÅ °»ƒžô)ƒ,Ñ6Ѳdˆr'™_¿õ dÙLc]ˆù(ÖƒUõ±HÉ™r–ù³4 Y´œûw>¶Û7>ÿã´tz#ÊwïþöKϤ¿ÈüLÎî6cVwåì^ü´Ëjç^†"ùûÜ‹¢XüÞ6Û6ßïu½{AH£ùÃÝoï>Ý Â`ôZ!åKµ’ µ’e´aÄjµ*¯æ°0µzìšú«ûºîxHƒÂy§›Ú¬¤ïßðàiʼn± ¿òåì¡Õ{u•äémÝ=.dÌ­›ÆNWíº1jµÉ+ƒŒä-’_ntœ.Ë@2‡/FÁnfKñ/2Éûœv¦©yl° »©è6Mõ},…]¹iZnäüÓ"Y*šŽ»Íæ|,ò¾ÏãDäÕQ•lÛ™·î½( ÄfÊì{Ûb«Yq0‰ug¸QªV³NR¤B]‘@¾šCóy]ÎmÃJ©5XTqg{TƸ™?M«¿˜{Y ÅÏs)t¾­ÓéÂLĹ"\fBåºãÞÈá<Ñ*KxÃÑD¸™V çl„ «®=*§¢‰”â× óëvV’†e´¥EÐ Ö%›\W†›ù†sžÖÍdìó'½G{„‡¢¨j°ÿHŽ-3jôáxì±±¦xdé<1‰¿†*„èÁp3prFé=m8çìôæcŒúæÓÞ%3´Õ Uݱ­U¹˜âåÙüÍÙrùÿ€IòfÊG#‚À®ù/UI°n1¶SñN¡‹Ã—øE¤Ú(Æ è„_8<Â/ìRÒ`#g²~ace˜•~Å¿^&á$˜yA¼_A$ðESºÛéšåô idÓ·µ ñèýt?I6N“Óä¬FcÕxÜénpвÇU]8Á¬¢<<ìž™ŠžÆAQâ»¶§v9Jü #ÍáÀŽ4˜ù=áŒÑÛÚØˆ&P 0ÍÇBœõÇBl…¥óX@ÕÜÇ¢â2ˆÄÏ#ì&þy°x€ë‰ýƒwZð†¸<o˜q‚7÷Yw¹£È"70cäF®A1#7nb¯Hܨ“Eî 8­õË™@íHÔ–þ¯)lÔ\G ×i×Ñÿ ®C ×Á5ìÉ!¶ÑûƒaÈ~+(ç/FÖ/iŠb…½O£«¦ÏO„WùžZ­½å½ ŠùŒ²;O0P¤WƒÛœ;¼q…›¶Ù»æn§¾;–EPÎeGCW b^ÂÅ£OuZ÷ûˆ§G&bl½ÕãÅáØ!6l½üC;žáA„?r¹€a&…‘?v˜žÑ™ÂÜ Î»cu uñ ,I‚Ä.JñÓï_ÜQê Ò×mó­‡Uœ*9ãmOS†G2-Û© ”€s4RUiܨ{8¬»ÅÑTü…ÃPß®5ϦSû¿¸ZŠb§«òªàá6àÔžy\W€¹@Ìl§˜}-ý¾j¦ö„?iœÐ×RÙ˜NŸo0–²yV»îY@e7ßÜW.™ZY°b¯rÑZ¼i 4o² ¨KGR*cñË| ®Ñ"Q4õ霯µª …{% DH¢ë¢U{[}ѽ+_ %ä¼Ëë­úPÙví«¡ty :ƒjËÓ½Ã@•à>J¨8‹œj›¸ß\Oò˜÷”4~"hÚV[ Õ% Ž[EË uZ9áª*7ãcAÎFØtCqø´åH$îúÓåZéŒú$‹8eu¾7ºd¨}l¡ @1]YôÅÖÊtesìì¹0J–S{õþýÍLÛ;/ ϼ7^ •Ü>ïVv÷zÇÍF?Û«º©ÝWÄœì)µ9TTÜ>›³Ú,EzÊ‘ŽƒÀD7؀Û†J®tTrÁèGž¹ýU†ÑíƒxTÿa€|w¶…à8·pá)ì/â{¤€?©€ ,YI V`0P­±‚üÁ49Éy\Mâåoàìç/ÌYâå R†ÛR&¢ÛÇ‘‹Ö`u/³™*eáø¨Âÿxo‹…e0“Ñ"Œ’`T,„þBÂÉK2„`Iñ6½Íça€®ŸŸê Ø:ãÓYq2O#‹ôÅýƒO¤ÏwdŸŠ 쮺ê<‚èKöƒW*Šš’ÅVzÖF [9D{³ éµ(µI~>I]U 0î6F»máúóÒ¡¨I˜¦#aÓH•.ÁÓu¬.z6ëÞb\¥·2†‚%˜+¬ïõƒùâ4Ÿ™I©6ù±B0¡7²‚ñ€÷Sœ£ê ‘XV^I8Þryl ›2ý"gÇ›)ém¸AS¡ìÓcHèû¢VÛQ}#º.Õ7·ªÆK•ƒ¾dá0¬Ú¶iÞ!5>«œÏœ` D A™|ÿR'¿¯[G\Yî„»­žç|ÊaiÚ§=4*Uo‰´é–9ž…#u+ÓpklYduÀç´ìÛ±Øõ˜ ÅûÓ¢ £Ð:fdŠl.8U¬¿É¦¨u‰F6á =^õ6áÀ8Å [äËæ‚Á ABœ"i rЪòœâ°Ù﹤,¹"Ë®Õãõ€Ã¨È2ñïK›dqÐo},‡øŠífÅÁ«‰ ¤®D†Õ6”~§G5Œù-8±|‹ÓùŒŸ¯–}T œÒ«êÞ|pi,ùí!¨æ¸x€âÃF­ßˆêɦYòª%~ìÜ.XÝgÖ2„:ý÷ùÒ°4J*˜yUjâÚ?‚ Ô‰øœêÿ”ëÿbñ›}Ä;ÏðTYÍÁð~Ô´ÝÎÖÝ—Û›d:û¬Á_RðYƒ_’ú‚ætûh‡N=S ‹ÓÓ³T¦~¸uU#Iö³ €ã˜ 2ßI~㡯‰þ Vp¶a9»ØÅ"þOÕ6c]˜~H&¸#R¤øâÓùÚak ÷Í®9V%/?Ɇ (´;Ê–íQ›šô‡×¨Ë`áÇÊÞ÷ƒÆ^\~µ®ì³ÚÆ{{æŒU bnû/ÝÿÔ )1 endstream endobj 1509 0 obj << /Length 2085 /Filter /FlateDecode >> stream xÚ½YYÛ6~ϯXô‰lEu&؇mÑZ¤~Kò Ø´ÍF– JÊ®ä¿wJ–½¢› šb±áÌp8ÇG:¸ñá/¸Éý›TJ/²›Õþ™O£f{ÃW?? ,Ý#Êï—ÏžÿÇ7ïå~Ü,7cVËõÍkñî8´ÊÌRJ‘¼˜-¢(šzkŠý^WÛÙ"Lã0i<{»üíÙËAŒ~¡VHùïj%Yä2bµÚªP Ð%cº× ™DâÎNÅ—S±XUU·3"{ÊgBqg­ŒÚÀµRë‘–¬(KxãÇþ,Õ,LEǃ0kL16dž‰vÔû0;q®jž)UµmwvUµæÆIŸø\£ K²1õ7ÆZÒ b6Am¥h½­Hi‰¶-èƒ,Á¢ØËƒœWÝÕ•$ŸÙœ„CG=J½Òmyä¾®t«‹Rd1R”ú=ZÁ’·;ݼ˜:ŽÅX…5€•¯ßÎàÔcqwûÉŸóðóË©»ª?HŽS»ù½¢3iyL»<æîšãþÐÖ­rx¬k¶Dc%ð§ÙÔ(ù2±ª¤†DŠº*­JàšÜ8ŸÔÇj× ë5YÆÐ±ô†ÛuEºL‡Gðî{¡ Ó.‰ü@ìYãµ~ã‘ZÏa4ÈYœ®¡exŽF·ÅÁá¸q¸eÖuI”‹åNM[ƒÇi"·MW­Z]WÌ»Ô2°çL°>“=˜É†zô #¯•:LxÿÉèÅõÆÆ‚uæ!(g™ƒÁzâ¥æ8^”Š£Ã}€Ä•X`ŠU€$¹xöN‘XB8yí .²LcÚ®(Y×½Ú£kIÓ0¯$: >ØižŸ‡xH:­T’ø9­ oNUS Šù”,ÿ)bÞÕµÝÆê¸‚<ó­äÀv0Ñ  ÷êØ<]Lø%R–,áÐ5;Œã%ŸÖÆÒ·Ú؇ZÛ<\ªZ“\Þ*”–o)¹ßl}@™ÿÏuÕ(ÓRŽdÿŒ„æÏó¸1lþ+Í>M£µ*U«Î5š÷ÊÚúûVÿ?æ9)sM» Žÿ.xG àÌ•[NÅ}^ʼ$³0sIÅ*Š8±¥”Ø G  zç• Á˜+O‘ú0‹p]ÑRY‰"ªu8Õö{X†mLâDÔO^’Eš¦â/Õ¶ˆ|ªüô8¯Ý¶¦›“µ WpÔ4@%bë¤uuµÖ«žªÙÕ]‰…5a8œ0jÝ–ÅNº²î™seÁöª3f@PÈçT ©ËB`%â•ÂZØ4Ö•™àê"B¶&0ÑhãHÌ:^[ö% åæœyݵ‹z³`{Ô]ÕÏ+cjÓœkwVö‡½=XmôGÐÝ ¨ÉsÃ4¸,ÉÓî„wž³Ñ<:m|rZ"€_Ä7ô=Ù»è¶aŠjnÐ̪æ¡‚•/k;76?:ñΠ¾‡*æj4y¡ÄUüåÀ‘gF4£{Ï\AÙÒxž[&€Ó@¬g0Æd&~Á{Yß ”äÝ[Þ@t_‚º7¯ÁgW’]ÄiX•˜U /,°ò=ÅÌÑÊNj;Œ0œXx…Ew PÅ éwVE½Ÿ·ç©àêÞ±‚X˜;¶ÁÚ ×)Ò$zÁhf aóâ1‡d`1TÂÇ‹á’è¬ÂT3Mq8ðýNÑMD‚ëkà fÛí­÷4²Œ¬ù•¤¢¬ˆ_-zT&—©«ÄV[Ÿw–§óuÙ…‹œ?ÕÈ4§7²4{h¤“ÜÏóõ'·æÈØ›'6NöÈ´ÀQsÇ» UÂÌ·ÑL àB]©+|¼‰KÍD”¸¯8• ?ªbÃ^c¸Ó5xÊØâ÷68í‡búPç~§ø¡Ž(vvtd(ì—ÜÆ2aºriSÕeÃV=Æ×¿ë÷öÝš$ÁY8ù_}H½¸ôåÚå†~,œ¹V8%öñã‰Ëb|¼x²(.}Oű従ã&¨Ô9 ç—x|âHóÌ:P÷7@»L|7­Ì¡+KòNàQÃ%TNgÆïÜ*Ðý!çg版ãMÙ×+(ô€Zõ?&0ŽÂgÝ!õáµz(êü E±?”jîªä£š}´¿7ü[Ãt¹Ç1¶_‰Åóçv!ªúžêðNÕpïþ„áM³=½ÐÝYÆ2IŸÂxþ˜ù°/¦ÚØL…üoy#“{$:iµHeì?Q‹¹œÞä È¶¯"·„b^N(oTlÚÞÜ¡Òç®=t­/–=.ÿ+,;²+þjùÛ×a endstream endobj 1513 0 obj << /Length 1907 /Filter /FlateDecode >> stream xÚÕYKoã6¾çWä(£¶V”õ°6Hô‰hQ´¾eƒ‚Q蘨D¹’¼Ù4Èï ‡”eEtìt{X,°Éá¼çãaçücçYpžÎç~-Îóò,гõý9}üþã3t3 œõ(¿Yž½û!ŽÏYàgAÆÎ—«>«åÝùµ÷íšoZQOfóùÜKÞOfQ{¿ÕÕ}ÍËRªûÉ,Lã0ôÒdr³üùìûe' fÔ )_ª• ÔJ‘Ïæ©uå߉B´âCÁ”Á»“4öÞ½›ÇØ»¢U=ÐG^©–KÕÐè)|öQcÐ`Ææ>‹-_ u‹|Ùtnø†Ix<ßé|À™°&bß÷ O#(>EHY¯‰ §Ñ46ìYœžÄvjÚža¦°âàØOÒŒ/×ÂîEïz6CïúfŒ ®Í½fû!`ɧ‰&̹¢^4•ùÚl OðÚL¬(+ao BõÜÇIœx¼–ü¶03Š—ðÅ< (eC ô r«R´²f|0)'aê %…µ´¶ªjíëYgxÏãw"/@2Ö ÇŸÈ+dÓÒDµ¢_P1¶*6†VÝ™ºæ(ﱡÝvÙ¶—ZMg\ò~ÌåÆTq-xAqåӫ뛋±@ÃPJ£ ÙêŽGÔáŽÀ¢ò1¹%]Ý<@Å ó §hç'Yn ™Ë¶x4°€«dcÚ²ÑH{»(Èu p½ê]ƒ^T•GãÓ!o—ûÞVGz›«©<­¦ê+òuù…zzxJ4ÉÍgHö0>Öý@¹sF˜ûÃøU÷ã+ÚîŽhÒFâæžDܾÂ7¸Ù £Ù3àåŽw•z[¼Sƒ2~SÐí’®Lœ‘ß0ÈŸ½Â4=½² (ô?lÒAs3æaDr=ç–ù´úS’¸÷òÒàšÖpǽ$ð' zŠÓ}ÀqK3íSß—®·¼^ˆ»—3óèr/j÷µo7½À‹h/lRý'¼è2ªä›a2-{©´k=O¥Nå$ ) ’dïQ ç«[|Ç“G·Ý Ã7邺†Þþ‚Ys(ŽšhÜ·šQEìu×”bפG»{ÉHc_‘F‰4`½xTMâìPYæý™Ò¯. Iï×E÷0®…Vn!}0÷ÑÈ[ö’RŒN+ŠÈX—¦ίåNžç)÷A‰ûv튶ã•b,ÃÂaŠ…ýcý$c§d™m/UÓÖÛ\_÷Y/º‚ÑV)Ì¡QjòU]•~WöbõG_.­^ß5íå2´~ìÎsºÒ¦‹ŠC?ïÊ8³oÓÙþC3 w5£ÛÞÊ®&öö6MáêðõÝY¿ ôh÷¤`”Z턎Ý|^o–øée‹^‹._p‡Gtç¡n]‚ÿ¿sÄ?ÿ •‡¼å endstream endobj 1517 0 obj << /Length 1826 /Filter /FlateDecode >> stream xÚµYKsÛ6¾ûWh|¢¦’BŠ/)‰{h§é´§NF7ÅH„$Æ©‚d\Çÿ½û(R&É™ŒgL<ÀâÛÅ· ȸðç æî öýÉ<˜ Öû—ZÕvÀ…ÏÞxZn ‚ã–äo‹›wŸÂp๓¹;÷‹M{ªE2X:¿ïÄ¡’j8ö}߉ÞÇA:ÿ¨b«Ä~ŸæÛáx‡Ó©ÇÃûÅß7,šÅ õB­PòµZщZÑ,˜x~Àj¥yµ¼g¥ÖÅþɽ̫/nè6#F,M\ÈAÀC5O7Æ“h0öü‰òôJVµÊKÜ­ëT;É…f¥átæTÜVlN„RèJn4lJ ð¤WîìkÉ"}J-ÍtÖaÏîÈMG“Éd”½—ÞI!ˆb§,Œž¢ê›ÑÕû÷€Õ² «­&™Ì·Õ1¼ï×1~Je–”l¤c" vp½CùÕRô/á|è4Öö›MÏ3™q:O7…Úã6°¹ë¦qÏUK-› ü©“ól¿ÞñôžÅÖ yô:¨þhå¹rªJ«´È¹ZœYu »·/•²)Šsj[ƒ†žS=geœ]}†‘#2­;B]€õÕcZJœ§q¯“ã…ÀÆ…ª3mŒæÐ  .5zc¹Mš'¨Ãª(2;Üy—¸Ñx…ì×Ó(‚¹ù·!˜¾^LQ¾Scó©Zö[{ö`¯%/æ u´‚¡³‚ÏÌ)¤"“h7‘s×wh‰Dl GN¡x–±§‘ÐÛÏ‹Š ›¢Î“IÇöÊ¿lߛٜÎ÷b'EwA¹Uú U—hÒ©ç”R¨56ìXd%¨öðˆÿ…JôÈ*öCš‹‰ šdžp šš¡À¿¡"‘ îÙÈXv;c»i°>(µ¼Â© ‘¡[‹,{åÙׇ5œM³3^{M×èRwxá@Zh:8ã›8´Ùii–é¬ë·œs†Î)ò“£o_XüXph(€#š»8¥‰äÓå$ñi8óédøóØYÕiViÓP+T"•L¸R‘WèT:ýÛœÏ@kD÷ü–× /xú²P•Yê{`Ò¨~Îc{Œ†>ÛQ…å1Ö—¬žëL€±m£=ôÁ>Ì™g sŒiàk.îç2K-\†]Û0pÆeªãã]ã\ø¨f™þbIˆx}Üê!q¾A¡À ,‹L–¥‡øJx’©Ð±ÎëØ|./V‡¤ŒNÙGæ¶ýRHÞØúP“mËÄ*š°¶Èé{ îzÈN«EòßÚ¤z÷tÔL”š :±S5Lx-?‡‡4ÊÈüZi°2щÐÕ¯È[—sW—M‚ùœð ” ƒý¹¢BpëÉÇqVgÆ‘†ÆP0͵NåB6~l&Våž²6vÐ-‡Ú[ÞnÓcÞO'¼sPr-%'Sç§&3¼ÍímÓÑW› õ$&š«ËSŠÅñê|xêzÝÛR Â'Rš‰9ê´’‰Öqûù!¾µÅ|-è ×d}@–÷¦W¼áàO]Ú0|rù¨ë͆¨Š76ŠÀP^5ížVFæÀæÀP[n%¶’\ÞêÌ6çÁE.ÇI ^V¥ث½XÙÛ3 ŽÆDj[7´)ŠG®Y*Ê~‚2X®®öë¡9—XRxì&’]@®ñ'ù¯ý)®‡Pzý4ÑÀ¦k‘]í¡ÈsWÂW'ªzÌ8ñÐ5'BuIÆI±ÃàýÞ3ÿê¤_,i’&c¥û¹ž¨) 3>sØÕ÷€üC0Ïæm˜¡v„*Aq =±wÏ%önf˜Rð‡`æ«(.jƒ™ôà ])ÝBçúµ›T*?êÅŽ7‡oá¾v}¯8_\/P&oZY½ÏMŽÉØCCqÈü© œZ4‰yE¢‹çžf®L;Ó.ÝîÌË3ÉÁˆ}^Nøºãýò?Œïm›á$ž™\§RàPì á4tÄÝóóíªXÝŽnç·/£ç[`»µ„ZHµƒ¬°C…P˜¹¦êxÈqLpûòB:wYîÝ;^òsñÈ„œKt­â2£ÉewÄߺ¤SpÚíñSZüôº @Gß&UZI\Òœ aòŶd¨…àAñµ=©×ý~~"Oà€ Ã8t‚Wj÷‡}ê‚uð] v5ïëFA¿çºNÌØ_E¸šß,©u Sk¿“Z¿JÇËJ¬2y‡±ë YEôäµ)kÖGÞÈÔ°«Éž#~y!ñVöùMöŒÒ˜=Ç”=G¾Éž£ s²j‘Úµ8à#šä—¥Dö]7¿ŸŸGs[]Ö—wè»(‰¢%Ñ8m‡§ H¸¬ÁáÂÐù*וî,øK3žY•ýàŒÆ¥mìÌžø8´Öƒ~iÒ ¥YZ5™4þúö?Ͷ< endstream endobj 1521 0 obj << /Length 1310 /Filter /FlateDecode >> stream xÚíXKoã6¾çWøH–W²(ÙÚ —>ÒÇ©Xè!Ͷ)™©.%5vûß;CRЬˆvìÝ-Z àPÃápß 9ôF.üy£ÈÍ}ÑÅhݸŠ*“‘|øáÆ3|0:Îo–7ïîƒ`ä¹ÓȼÑ2îŠZnFäÛ-ÛU\Žß÷Iø~ìP_d‘H–e"OÆÎlÌfd¾?.¾ù~ÙnÔ7j…œgÔòè|ŽÂz>Õš­‹¼¬$ùx¶ è…¤ÚŽ=ÂÚŽƒ€R$"gióµA{£ˆ5‰§<ãZN‰fÀîaw÷Å-ÌTП Ë7¶uy²­‘¥V`'yÉ埨ßh’ˆíš¤¼,sWLžàŸ7$íùS/о²ê‡Qm¤=M„M2RÂ$×8XŠ R€·­Bc––|P¹Zå`Ç‹¦ÔóµÒˇLJG½!Ä9/wEÉQÏ–Ù6ÒО–&yU˼4ò¶\ ЂÄ¤kZÛÍb_À$»Q­YÍ!òªaÞq™½Áؾ­Q¤m¥®Küï ¡±yalšÕf˜¶Y‰,V$ BWˆßƒ³Ý.=¨ú€|Úß@ÖÛ‚-ÈZW¬Enß>±ù ÎîqØsþÜñåGwâMfŸì¯Š#€à²Xó²E†"r¶Fý·ækìxDWyx3ôÚ²ÎLô/t\`U“RTÛŒWb­¿+ãiK=C¾å0–{s·ƒ¡°qG¨ôÕ+`Bk’LÇN&ÿ”÷d®YiFÏ[.ù¥ «)qÂÎUQ¤'MEM`¾W3UDkÔ•A­Ž™FÖŽÚ€äèüPs"¿´†h´™åÚù|s!šà@FS?+^ñ_³âÌv!‹H-Òʹq(žÈªˆ Wß‚^ÿ$za¶SíéK2ƒö"3a}IÝ—àµñýjõßèÁö—Å©å¿fÅ0Nlßí&Ø×Qsä¾Ê&£s˰º´Xƒ®Gi×£ªnϵGç'àèÏJ˜Ûæyüoæðµ endstream endobj 1526 0 obj << /Length 1710 /Filter /FlateDecode >> stream xÚ½YKsÛ6¾ûWèeH•à[ñèÒG:íäÐiå“¢DA;"©‚d"Ç“ÿÞ]¤(† e§Íø ØÅ¾÷[ÒtâÀÌIäy³¹O’ìΑ»b?Q‹?½£šÎB»Cùãòî‡wA0¡ÎlîÌéd¹ë^µÜNVä§;U\LmÏóHøvjû~@þÅ^°,KóýÔv£ÀuI4Ÿ®—¿ßý²l…ÁîZ!å×j…=µÂØŸQÏWjX*VküSšívÕ'p®·}Â,uœæ•Z”é>_P ¥¨nßø š…›z3(1‚WµÈK°Ú¥¤:p\¸¤ÎóBL)ɦ6%ì«ô3.ù¶!œÛÛ4ãy™9PÈíwÓØ#E-Rt§¤,/w…ÈÔc±Ó:]Y¾’"Ùº+ÉV—2 †@^UFPeÅ>ý8ucÂóáûÑQè—Aä~ˆÉÖžŠg>¥«Ø±LµN¹Äà~' 7¸žö|ïF!Ø/ÊJÔI5läaG‰AwáI‘£3*–æ:}ÛÛë<­˜x”)­ƒ[ApEz6I ɃYË·W×ÿS³2­0qR–ïë#WÁRVg¬2ÊC¿.‡åÉÖ ZvP¨¬2_Ão–odžŠ’c L¡¹=†âß”äëãïE˜ÿðãÆÉFbìýØwnnc{£Aâ“Wi˜º .j‚ýÌÕ½¢5ÚSŽ^h0üo Æ×ÿö cÍ)M¶Eu©øë|ÙóÈæåíWÙÉÕ FíœD•“m 5•`½êè¤]|Dñ¤*D9â*³Ç1ªÆÞ¹ù6ÿa\ùOU̵ÿ.{·ùŽ90)²Ó‘Ÿ[¡}o&#ùTÖêÈÚ”ÚŒf‘”7Žø™pø¯ ‡÷­áèf*”ê6e{„ð›ÛRgrRR“&¤;ôØýmAü«8*‡Axæ¡ò".N2\\¤:ni¢ .ZkBQlŽÌŠ QK;‚ŸŽ,¹¥î0/Œ©·ÁÚy47wä¶1µÆ z!v2z¶Š®Ùºû¶ür=Óò±A ”Z¨+ÎA%4>ð5?›¢ÐÙ'&òŒÌüö‰¡6žGȦä˜Bæ\ޱðÈáeÆÜ¤‘‚ ¶3¦DfL‰ ˜.åèÌ—ë÷øë-ÇGÕT©ŠHé$‡s hðçÊDpux®ïõ‡B·›èÙÁ&-È0u|ÿµß5w|_u|ð¹¾ÏW}àTfÁÚð4c¹OŽ<ßW‡—b+ÁŽíû^ ¤üÌä‹ú ”?ò·7`Vš Q©Ö fîæRk¢OOÔ²]˳œ/Ö“oÙZ.,íȲc‹:VÔ  é¾|¹”¦T%~,ž"‹Î-ϳ¼ç©Ï‹¶ 0kÓNŽ=¥?‰´R4ŠB²¶›_sÑÛæulçÛØú:¾9'à^À~3|sCÇTJnHe.*ùƒÉÔ[8>]Ü‘ôÆœGzl¤&QŠ2pR²cÇ’»…ù—YX*¡ôãÙ©Ò…#·ñ£–bcìËJpôŒ™›:Ü5¯Y¾o‚‰Ó-—"åw2<È ¡AªÐ0I¹új£öØq_@²¡¬ÄÔ*¹~Ë\uÔXkl<±½>æÝ4Br¿!ÜŒÉÿ*SGG™*kH†õ3LïÉ ‰‚YÚYØluƒY¥çºR]Q¸A/ê¨Ô–údÙ])¼˜Ñ•Fþ0hõÒS×§íùîÆÂ¡É¹¾ÆXÉo0ÂwÍ#B<:"Ä$3ËUºË·&jìÉR1Ó®Ö]}…ÇKOƧ›cnÆZ†Óoƃ ÜŒ‰žžiünk¾¼+¿l²oZt¾¼J«Gl%ú?TG·|2|ÝûŽ3£Ò ,öþ3ð_Ä* endstream endobj 1532 0 obj << /Length 2256 /Filter /FlateDecode >> stream xÚÅYÝoܸÏ_±¸'-éôÁ•V Ü"=´w)p¸âÎon´×&ª•ö(Ê îï g¨ÕÚ”§A 5‡Ãß|i“U ɪŒWE–E¥Ø®êëØRõõŠ¿þø*a¾Ãç_._}ÿ·Íf•ÄQ—Éêr?uÙ¬®‚nª£‘zfYäoס›àº¿ÖÕá ºëu˜›4 ¶ñúãåß_ýõrÚ ¨_¨r>U+¤V¾Q’ RK˪½úxõ‘ôjTuÝwUûÏxGQ„DÁ,ÄPÁL‚ >>òU˜dQ²q‚ͨ»–™I²hƒuT-•ÑꞸ9׃xd·N·ðIw­n‘t;¿Ã—VðkwvêÕ+£,ñ[u·R=Ÿÿõy•U´… h¶ß³pz~+ÍSlÏ®x‰G—«àE‡^N6lÚèʨZ÷½ÜÉi®zCÏe÷„R£eÞ}‘i.oÚl`­1¤VuÕ¶xeiè~7††¾ecÑ;YðÂȰv¢Ã.×Ùpš±ÖúÄêN Rj¢H 8´ÚçÙ\û˜Ug“U|b•Ge‘m‘%I£8NVàf›’¸RŸòh[ŠU8c{íÛð*LÁíw÷Þ›µs‹Ë28UQQ¶AüÆAœA7Ô²klÀ±XÔÔF#ü<¶F[†®µkÁvÅ…£­Œl»òXmeûà‡`‘G¢Üc¶Â±Rz…òþتZšGÞsL.Íï>3ÿExM怅xü°Ht€M ¸L‚¾ln ‹[$OÑù-qP÷0srÂ-.AÜžqO¶¡Wmˆú?†è’¯( zœ‰H¤ù8ûÿجr•Iyެy|«ÇÝ×Ƕ'”æÅèeñ=HtèÁñ<ÜÙ9|±@ *ªAkO˜ÁwÄÌ«=5 ¿y˾Y›ï“&Ñö[c±þ:,6ŸÇbDuÛÏ#8ü ƒ¥˜ËõV‘Öq”Õ\ ½GÓéW.­TW·cc‹#xê¢(ƒýضD¤¡ÍŒÅ–#Umz­þmuÃUZW®Œ²"£ÇñÃb÷½&Á•ÆLjnCŸ1"gÐÑHL/©ÂD@-*ΪA¶ H´¥X-ª®¡AÛ_£«ÀK^ýÑ‚]j ãMŸ ð.ØÑn=HZ$[yà1¤R0œ‘ˆçü%oÒ?Þ%…§l»‹O™có©<“q¤óŸ")]½zqAÏ‘–³k>#Fb1鲘;tø*o×8u qMÅôüdPàø„îe>í«v\0äþº.¨ˆ“àr½…J‰·’6x'ÛàA8¡ÑL#MÓñ}Ùk âcc¹°Þé×W e¿]¶ljX·{fݵv £!D‘#z.£tL|¤o+«ŽÈû±«O©Å«pk{È3Ä@£¶ÔM‘¥·EðKÇ*Ôn/¸¨žH¨ÞS¤×=T³¨ 0‚žøZõ/ëN~íc¦Ú„BŠF¨åŸ¹“¤Ç[×czÕFÅ"¸»{Þ§êÏåf@ˆÅÆáù°¬›õÕg7[vZæÁVƶ±ÓÅÓ#ftDq:¢§ÝHøõ«Ýº=spËîë3N+‹F–Oé¢ó¡ZS™…©÷˜ÚÒMI5ó†ÛB$ ü¡Ò ½í0M«Ö„jªÈÔªÝa!ñoÊ êmDÂ>꺫àÀrY.†`Wz.âÞ %ˆãS1tí[µžÑîgÖô&׊/ rÝž¾]nã{x$ÄGN:ÚW¬¸íç20ARG…T¬dù’ûåï‡êøâKµ‰9á¯@8‚ÀOýT7©°Ç2!ªë’³±¶8Ú%‡7¥Ä©aqÔV%®­Qè„¶m£Î*šÊTÌdWr~f6ÑÂï^àR9mvt3T\XùgüÈse|ðsÅÕ£¼¯°(yóÈ™NÅ3uÉÜ+¬L1ûïUw¡ºãh‹ßaöŠÌ½ùnêgûý¼rx«Ÿ­¦5Íà€ûjÉ:Çdí>Úá§°âÐdÁû…¦F²¢bÙ“Idׄý>H‹–IΈ  Åd÷­ @5˜`lgÁ‡ïaAZ»úŒ¬\×£ÆÖ1YFì¥M“yÜ*mFÛ£åIpÜ–Ñ¢‰ãFü)XZÕ¹È,^ÿâ2 îzÝ|õâz¸ý굄p²ÏI°ÜËÅJN.õ¬k&*“üž^,²$phYJe>¡z€–ˆˆ¶G"´È­Ú?دaø>ë‚ÏâU$CºkY•G0‹éÅ]=¼ãƲm–.–â%¿ÌƸ5\î‹Á¥._z¦ÿ*΋«év—=óÀ‰[‚ð”?ÀâÍ”)¬×ý>Jý05÷9\K×Í’’í— úòÿ}°ýlNF…Qf-LØPdî€sÊ-þøl4)’/îúž“ÝîÛ„gžm·Ô@Ù­;ô•ÕîKÍ8¨b°­EZßÕ¬5E3 Iº?¸éWƒÙo |ì)äeòŠSSÒÀàíÿ4[Dó0æM¾›üMYc‘‚4¹£H\^A²ûÇÜWckN> stream xÚ½]oÛ6ð=¿ÂØ“ Hª¨/Û)òëн¬Xò–æA‘i[˜><‰ªíýï»ãeÉ‘¯Š!yGïû޲˜xð'& o2 wÎ'iqåih½žÐäÏß®ïs`£ÓÛùîþê͇(šÏ]x 1¹_õIÝ/'ÖûM²U²ž:AXñõÔ ÃÈúTWë:)Ь\Où¾5ÓÇû߯~½ï.è…\áÎWØ^ØpÏCW!ñv[Vj£y[„VÛÈU›Ó¼¨€­¹µ”´ÌÓª(§‘Û¤N”\:_¦Ql%y+ONÙ( p÷9xpBoa­²w@¬ùòÙ‹¼§ªÊI9O7ªn%Àð`ÙSMa·ÉÒ)\³Á]G\Ž\‘Xi²4D´–ɲ¡ Ue@ÍV3*SE-mZÊ<+20Xs=&˜_ÄîLÌè&’&ò#˜•7Y¹mÊô‹’rÕ^ý‚Ò¸,)Îßj¦=fWà1x$:·7@éí˜:A{÷ßOçb…à@ –ª3 W`W𔍫¶ÀÿO$uMˆjEcgÄÆÐI–¨êP»Ä‘Ú¸IiLXˬe“U%Š›•ê¬-éâ¬Vm’Ó …²øÜ¶¬¬U[¦ ®øßÌs™IÜlâh̴̋Ñù;ÂTx4‚þ#£\gÚbÚYaukÓØ–¹lôŽÀ’åÒ©VÎgO„Zó€F¦ªšæŒÎ³Rvõx„t‘ª-¤AIÓ¶n IÖ §ó¦¸ÕŒ*Yl•Ndß^¤¥›ô€›«rÉÛÐ=+ ݦ»,Ï º­™õ6å} m©[Ò˜‰)×µÖà P]²–.¸ZYw&ú3gÌô« ãiaõÓ@‰Say´\Ñ-žáÜÓœYJ®%ctJa\C‡åßmÆt%1ÎD*Âw͵ü’UmC+¹OŠ-iE0#žÖudzQC>&Û©ç@ÌvžÉïè9Sà`Úy`;ÌN'à g¦3 k¹$߈v‡Ž'Ú à¼ÚÔR:]¨%\’ºNpÿ3¹\og–ž’Š%ðD%ŒÕGØØÌ`š”´ ½rfddgüQÚ¿ð4ãÄïh¾qÆdû¯Yç…¼ãÛÁ«‡Íñw£ÇíðÕÌå{®?çá®*$†¨ÏGŸF…û ˜Î"ïni Z¢QøÍw™ÚšÉÌØX8Kø$g?ŠD ¯Ê|i«#3“]ÖYYbœk t±,J;þ¡€B^ˆžu×r_¡w›²…¯GÈO5Á>: ØÐ:5W1‡´ OÃYÆhÒ Î¨d‹XF@ª"­ÞxUlÆË´é„tíz©Ã:sB3ð_lÑt|Ö¯³¼BeاA®ÄI~øÙe µ ‚öÝà”ÿüÔx°¾ .ë.ø…ñG)mj tÆ£ÌÊʬáb4³xYa­3«Þ.ib2+L9³"ëÛ<¢—\LÉ—×$[ 99»¹à\°^àÌ»ztTÚÚ¾xü§¡òCtÂ1:/S:ïß”ô±¹?¥xpŽ}ÜÝpÎF]T8Oì[wy†Í°š±ûÐñfnܽùšôk•ÂüC‹“çZs×ð $µ†N¡q%!ûÉ?¦–Á]IÕ{–K¯Ñ¹6 ¦eC#¤mèlîö¬Oµ©JG—`¦'T’½;„Wg¬ hSGŸ º3æ^W;n$†eA‡iU)÷ÛZ÷àÂBÕœ¿ï¡¸.Ï_ZSs=^ ³º4<Ð-¥Üñú¨e\¦YÃvÄÍ_ä÷ØËe!©ólº-g˜ôÇ•r¢TŽVÝ-Á`Ü}­êª8SÅÁÕn¹1«¸kùý]VÊÜ“æí’ ù8ýr<¦\ú°òA?ˆùk 7Ëö%«&ïo¾y¶°u¯dGvlÏì¹½ø>šû{Ç7ûÿ:~| –…L`½ycàߘÔ÷±BУð(D×ÂC¸6¾Þ|;aã’ªðƒvÁ=²¿€×Ÿ\)5垀ªà¢$¾ûña‘©!V%Ô —´4>j#Üà·Q ˜3ßp‰0[oø ô2{Œ™;ŽmŠÐ¹*ÇS®£ÓË"<"OEt²«ãJ­9«›^Ýþ•Ù'ÅIaüÐXW½÷ ÇVÿX-tR«þ»§‡#î°8§ùÞÕ1Ï;.=½W4%¤eb±tÒCšwï)“­äÖ|,Ûš´ô\aÁˆÂÂѨ¼þiQyŽ%Sûþ  Êg1ùrXïM šƒz7.MØ¥Îôø-Ow±Ú)p†Ê=°BÜ“ BlhiÈúöýÁË(ÔŸ\Ã¹Ž¸þÑ,Ïåš¾ÜEÚÍpä…@p¦¡!ÈðcDŸLp"3úþŒóŠÙä/—‘):îÙÖq8ãç$NŽe rŸJLƒ]¬Ã¼:=~*z0_Xꎴ0$RÍ8v0瘵sUÝ`Î8UC3›¨Ž‘ÊÜ /ÙÏ#þ\óSÀ?ÑV endstream endobj 1541 0 obj << /Length 2519 /Filter /FlateDecode >> stream xÚ½K“ò¸ñþýŠ©9™*à³-Û`¶æÀneSÉáÛÔfn,Ö€?X[,°SßO·ºe°æ•Tj–ZR?¤~3Þ Þ]ìÞÍ„˜ÆÁünS|q5´ÞÞÑà׿~ñxß6Nz;|üòõç0¼óÜiìÆÞÝãsÕcz·r~Ú%{%ëÑDáD‹Ñ$Bçuµ­“¢ÈÊíhâÏBßwæþhýø÷/yl‰ô\áÎ7ØòÜVƒ»hL=o?æÂ©4o3gsÞäÙÇs'©ëdäÏs3F@쨤] ì‘È)ˆúVúàrU,Ê5¯‡×ëp\eyN46UÙdjhV=~&Ë2Ï‚3µ#`V¦@¾1“«#TY 2èƒ|9ãáÝåðîßÜÐÓ'î&]éÄS/¤}: ~¼\¡ GØ÷!•mµ´wÏß*…f<ú’ Ù®±3€µ¾ ­i_øNÆÛ³†6﵊VM“=å’–TEKY¹ÉiKˆW›¤`Ìe!KÔDEíÁŽwTu¶ÍÊ$·Z\ëª@ó<lƇ\e{ä!*+Иpˆ¢×ÀqBíÏ@k£¹çü fZ§¹lx;2£1ìUË ah)ƒ£ y½Ë¢=û¬¢Ò”62%è2¯Üø7AÖª­+?âöÈ+«rB¯Dj:ôÊÃË Ù]à —ÏŠFÚ߈pæ€D;dXÑ´s°!ûdÜLrý©åj|SÔ(è`µlà%hœ5†0’Å^±g"„pOÆWï€ ½ù…· àÝh€p}ã1uhŹf;¥±æÂL}N´mׄ8ØÔ²Ýð‰møÂÏiÓR_ ´' œeÙÛ`îÍõ…¹Zý~¤T¦òDÃm-LnýØjIÊ‘)Vz@2 „3tÏjçœÉ)îlQö”§=%°ëMË·ËÕ.K/ól0Ü% ú¤Ùo®'d®‹L€&ºg¯ÆBø}Œð|2ÓÄxA@ÅtÌÓyZ™cN•¬•Ḫ‡‚ùð/ø-¯ÆL“ö„sÒ~Î0H#s± \‘ñ³ïšÅNs N³¤±”€€ä¤KÀ‡“¥œq.XäCA—$x ;\Û*1÷„åØp¡ÆÒýRJN‡1–ÉÜÐeŒmvUþ;µ08‘‰býp¶ˆ8çh;ÉcÓ˜A7µ´,tCPýöÝ6·÷ÚF<ÇÊRÖÈ+Bþ¤';RôŠ2+Ä¥:ä9'%Ú@é[qÖñ/ð44âý\ÕÖn‚À{^Û×–¹tÑ)´‘AÄêÊ™ð&kÁÌl3& Cªm ¨³” }æ¯bôi Éb£óe$Ã- ö´ƒ ¡ÐÔ3¡#uâ ªt‚n¥oÜ8%6_8„9Y·ºDÏMmƒ™ëT¼ŒôñËœòâSÃïÓyÔŒ_˜`:-k×póM"&ºJgØh0瀜†bYàÏÁûàyø­ñìrXënf˜eöù5/Yº5djˆD½&ÉÌñܱEÝ _bcÀ_¤Kç Û×u»õœÞcõ'Èár.üÐÒ6ë5n¢ž>âÌT‹¸å¸ƒ|Ôæ—‰ˆXÌ>#Ülá¹9wåôí¸¶ž`Û¯FÄØPô\¸\wö] ¬0GÏù±³Û¸­\µnâœB¨JÝË‚Q[Ñàz/ ÆdCøÕÖ›BÉi“Ó>>˜‘“c¿hv°Ë×ÌÎ;w5Çœ“ ,(d)Ëi5a™bÎmM¹µZnL‡éB…!çNû¦t™1ÀúiÕVWFNY“nÍÿV€áV¨º4Ï,ÏåV»Ò~ßC?mha=C½dWºŸÍnL’;ëè Œ_#§ Ó½KÊfáJÔøUæ> &‚È×U«Ò§AÄM½ŠžÈw~Jð‡5KlާžÏ?N.›s±W•’ƾd±ù2‚p¾±¡æí¥²ã²vîºR“ÿÝÉIàÅŸ¥ïdõ‡©YY|S¸O‘³z9ÈwÿWä®:Ð6²Qälµ?D7ŽíÌjœvzá'éÙO½A0úĽƯjÍòÃýÄmfõjý9ñôͬÖÿ'šW‘ïöƒ´±§n×\µv’„÷A}Ü^™Àâ+zÄ¿'¼Êô[¤óŠ’D¯ý÷ŸãdU‡†jWK9I3Èë1Q¡€ÖóÑøï$ÿMóë® endstream endobj 1545 0 obj << /Length 1554 /Filter /FlateDecode >> stream xÚXKÛ6¾ï¯0ö$+­d=lg±—}l/)Zß69ÐmD—¢öÑ ÿ½3êa/…lŠ ±8$‡g¾y0ñ"‚?ñb-VInÒõ¢¨¯"#U‡}üõÛUl×°0˜¬üy{uûk–-â(ÜD›x±ÝOUmËÅ£÷ñÈNš+?H’ÄË?øAšfÞŸJ«kÑü`¹Ê–Koø_¶\ý²é;QáÊïÃÊ×i')Á*ùç(N^ (÷Dƒ¿+¯–ˆÇ+»Š#Ð’Oµ<šEú¨x?}vÈ£úAž'ÞCí±wòc¯…Ф»`­né8¦8ÉX§eÍ´(XU½Ú9­y &+i…l¬¸mÅ¡©yã/מÕÈša€‚8 ㌮ö|„EA²L=­^…Í·¤_8­@GÐBÚ £¥Ïg¡í’˜díI8VqìB`LwŠ·!º7†ëŸì½Ii«kÎ Ç„ygÎ@íYÎ8Š0Àáá¾âw n+*¦H›YYŠ'Qv¬¢1S‡®7Qëv já/ŸË‡V1)ÔGNï;pæpi —¾Á1ù@œW»Mº.É×þ#Þ-IÁƒ¬FñN:Ùµ$šØ8!Ï\Ø- ¦ö²B¢I<ÿ™LÓü… :=EóGÊNŸ:mŠ>¸,…Øóp•¬»hÀ›Ù2óöŸ£,:1¡hÈ`ÓçWÅÁ ¢»ojžkÜ`DŠ£ñëeFg<ê\æa--ßpõ¥nÆ¿w.ïÆ)äˆôüjŸÀ’6?²±>Zy\µ`ýÖ°eÄB7§À ¾›Oè,9·31F™Ù˜zRÍoü¿GY5ÄæàÎb7¾½Ò?PÜ2´éy5ÄvB±í¤Oà²ôà~q®‚áèée˜Ý¹‚Æ@=КÖl#‰{§á…݉æyübizÿ–ÝI˜}sXúµ» ¿ŒG1çÞ€­.!²nvD?[noië§>ä d@ò^z>˜AÂÑÄ`jHŒižªH4fX앬i³­ñ«ÀdJRŸlò)x‘·u³ÌœÆD…1’ÆkC”uh„¬ÿR‹ ¢2¬z‚™‚„ÉÏžL JAÏË»>Ó‰ÖÒMBѽӼhy9V”\ó‚ H2”²1gN’ëlpí¤¬hûä2èäí\fs¤ƒÞ×@¿k'{ °s¥iÃÙAwß\?4O +I z:¼>CpIy›C Ÿc`?âåû ÞCâC@™É¶ƒ3ƒI#f榌´ª÷>«ZI’Ë–D]‹úgÝ)O\1-Õ˜¶Ü©ïýÉ Âª+úÚ5įƼq¦ÙV÷ÎQ¬]ëtĸˆ5‡ŠßÙ ™ª£…ÎR8ÂïÛ{Ìða\0-²o!Oã2„„ü§B¶46 E†9ðÃÅÜH×Àe—oN&O: ÕŸwÏL›ãïOâ6w†Ê´_l¶ÎÈSÎlmÚŠpçÑ2K£dµNÓds…™1á{»Œ‰º‰<Óéu-ÐMŒ1@â¼ ðËö¤`Æ3±¢†?÷ëIE®¦h1þÆ<3ïïîÔ‰U«Ìn0$ü¶øH‘u@šõ¥ʆÏ'èg¼ëûì Éá-búSø$æh Hbâ~?ÁaxÁ ˆŒQi­ª]-÷ôƒÍÁþðZÜúkh„HzÞ¡-9¦õúò(fÊR²ÊÌMŒÐ –]UÒm«(¼©è“ûQÆÐ6óL¿5¥¦5ÃC¤„ߺ¿KÜ4ÿÍ®À©¶ÍŠd&Gsê^*¡lØÍ÷o6W».*Ò˜MÜù`¨Xs-÷ËOpj»/I~YüÐ}éÒÞª=ä¯jô4ÈSÛG³p‚ÆŠé¸Ñ*`6H#…"¥Øð¶`ú™$ Ú™Ž¶7œ—¥Ð-¯öçÈÆ„6¼à‹ú) ÝÙ9|?§ ó‡.ÝRá¡i5geÿ&óû†%}C¸³"yÑ»´Þý/Æ€XÛ'‹}âíûîåRÂôá‡øÇ< ÂûIƒÿŸóØ’Í endstream endobj 1549 0 obj << /Length 1539 /Filter /FlateDecode >> stream xÚ­ËŽÛ6ð¾_á#¬\=(Ù΢‡4HÚô’¢5CÒ-Ñk6’¨RÔîºEÿ½3r-»rb Á«!93œ÷ ÌbøKfëx¶Ì²Åš¯fes»]s?#à×ob4ÂüasóÝÛ<Ÿ%ñb¯“Ùf7fµ©fÙë½è¬4ó(Ë2V¼œGœçì£ïhÕÞÏ£t™§)[ñùoÞlž/ƒÝ+¥BÌÿŠUœ‰U¬ø"É8‰e¤¨ç@˜3ÝI#¬6´*Eo?Åy¬ZKO°J¾/uû ½CÏ5N8ÜËgQR,øÊ³óÔÕªT–ÔF¦=‚œ #iO5]-ÙÎÓ³²¢Ó^5ª¦>ÌWœÝâãìU-/HÊSöª?4ÕVNÊ( 댞§Kö:«J¢á€®ÎTZí¤°ƒ gÛÑI%wb¨-ƒAuƒö¦¢C«t멌üsPΰè; D&ÑØ¥5ü/\€k@P§d!G×£{u‹òZ¡Z r,*ïäÖ;ä R …ˆ»àÀì«f7Ú‰X µì”Go竌¯«¶·¢-¥»÷‘V«$¸9>YQ–²ï)ê!;»ý݉æ a¹“…x’=¦ &ÇÝ¥ ñ®Œ@=j‘iWpötAñ"g¢­.Ó¦éx3rîtK_1w -ÉÿtT)H¢ëâ‚`†lÉ~’Æ™s™zsÂy©›%rœjò‰þÜÓzèéÛ9måœ6eÍ¡­°6¦…¿V4òOxÓ:ã1F~}îk½EÅ®T‰Ñ/ÌÖzGß‘ˆ½'Fõèë·°”Mðoå#$k^@qSb[Ô¨.…Ýy@]*VÏÖl㌙'Ætª§/ú5Y²Þš¡ÄÄDŸ%kÒœ¯=M)ZÚ4rçúìYíùYÏðSœpYW=a ¿{d³dC?ˆº>ŒôPW~© VåDñx–ÒÕâÉöñ~ge‹JÄ.Þ˜¯ñ`H £§-'wƒ0çÔBp²Ú2Ô<ä’éÁÒb/\™uMxÌ-ÔÂRí´Cá<ŽLz<7‘±s7¡•žP^QˆvF7£2Dà¸:ab_SuDå<˜'NéÚ›û:1]}€Ô‡ñœ¹Èæ ™‰¤Š<§9ªš Sºò.ûÔw‚ŠyžC#l»ÖŸÛ˜ pbȘGöûPä?šÎsïÑ({Á0ógTå/fè2NØ;(%Hà´Bà^=`ltnIJ!„‹_b?¸|2µ•¬n±¥3êÚóBŠžÊ%4PnòPnÇgÐD§·âÔ5¡>ć¬\+ålãZ)+ìÏ}Ë ãpõ½œ¬ ‡ÈÞ÷Zg_Q&fÔj\ÜC·ˆzÙ ˜Ïd:ro_~«D¸õsªxR> |M‚|P!°Ka<Ôj릤°ïm˜pZzìÏd2êȺ:£¨1XO8ª«ˆÛ.g¾ö©FHô9­<£›}jŸûö$¯Àæ>¯êq@ë`R¥ð¾‰'^\ý4øí8ãûŒ]ã|’my°8& Ã&å'&åÁ¤œfgÒ•7)÷&¥ØÌ½!,Üìû‘'Ôg·žV(Ψä<¨èrÙ7º OÊè;pÏž—‹1&Pkă¬/Áûì ËZ®©®ñu\rT#¬QOÿM 8Y𜟴èãëPÜnoËÛêÎë:Fõºþ¢/-Yœž3¨¤{Oޝm\=ý²Á D09‰ Nk½˜/ªhû¢üš˜×Äç«Ú½U¬¢ê|ŒÓcíË|‚/QÎc)÷¹Ö»7PCeàE§!`'=M‰ô?¬™œç¯ÿœØ×9Ùƒ>Ÿ_ŸÇgqnó×ßÂæ£1‰×ZF5¾ÊÏÞl×\©üãUÝ6¸±U'É+¶[#„xT{Çï³ӞÉÞ_-üuÎOÑð—¢ÁÏZ endstream endobj 1555 0 obj << /Length 2379 /Filter /FlateDecode >> stream xÚ½YK㸾ϯ0æiÛzú1‹6É$› À.v:ØÃìh‰n -‰^Šj·ÿ}ê%YrKÝ ôÁd‰,V±ª¾ªb3þ‚ÙΟm¢h¹‹·³´üàÕ>Ìxðóß?²n ½•¾ÿ°ú[’̹ówÁìþÐguŸÍ¾z9ª“Óv¾ˆ¢È[š/â8ñ~²æÁª²Ì«‡ù"Ü$aèm“ù·û~ø|ßÔwJ…+ß+ðcøÏÖÛxD1ËvTƒÓóú‡]ëþ®¯ð1ñòòd¬c @ìÓQ–&·K#ïW?ˆm-L £²zNtŔҀº[/k -çVs˜;3XU;Û¤®±š©©* M‰¾.Rè©*c>î¨+>@e l˜-¾•E-ƒ„/%w(ó6ô*S-N6š'kO9ÍDTP™,aÞ0p¨ÆåDÚiùHZm<— kúð\“òO¹5UÉc·œ/’†É…Éynà^û|{w@ÝÅ^~óù§Ô%®Øóñ–‰,·ÍÕ.•õEÍ€õüÕO|ƒkw‘whæW¥.7&’ðkHÊ9±>ÛÜ9ºFøpÎÝG,HÁ(óD g6|¨tà_àx²¡Ve;Ê*…^Â=Äþ†®vD5có‡¼")ÀeM…¢䪘R»¼rg#ßÈ/p ÿô.÷Ž)çcžbœy*v† Em„„GUõ å‹°‹ ÓMg1à žÎ°í_ñâ…ŸÁ÷8ìq¯™pÐä©2#ùá—‹0o|ï{YJ·ÁÈú ~qÌž‡‘ð{²M&€!œ ÿ‚ 8‰»ÆÇµ0e f3”» ÝW5¯¢ŒìX;ø…K?:Ø‚z—òäŒÓ§Ãvôa6(fÃ< ”Ô‹ O aXÕ<䈨þ ‹ë£ÊZŸÅùšÐ§‘’iau(ª—c–þ‚ˆÂÁ 9üu'‡Ÿx%ZPµ°2)émH ¸XË»§Êy™–P©2ÆÜ]ñ:v)›uì*^sŠ…`#ʱvfd×<È‚¬Û,×}Üt‚©»6ž– OΩjjaÛÏ!X°"ð‚Ä䘟¬À/…ä¹—¾'¢ª•°Ý´Þ!°ä €çJF‘},¦ÓÀè¥Æ»7û·ÔZY®”¨ØÜrùƒ5–UÆ¥/¯ ùëI¹£ìÀþ¡Ö²ë‹–æ¿„Ë„©_¿ ¶oh;ÜåáoXƒyOêAó×57<¸“¼ä‚åGù^*ÇÌ›GÛ(´–qQȰîZëñY©±å$­JÇ5ˆìøƒ#Î8ÊY`Z­2QærL*†–]؉Pý¿ãš‘8 ›® ?YMr¼Cê¸^æZö9Ö\$•z° vø* ´k”ÆÚ¢é„úÃMÂkï²í£Zœ«Ðq¢8 -»*NP‰£®M©-T@¼š+t«R¸*¬(s¦…©õT7÷[cœ’Ê…Wö±~Gv\a·~\5µ]rö S«Wª›Áææ‡E ѯ¨ÛlNžÿ5ßN€‰g]Y¯‡ÙíúÕ t–GëMòfǰaÏÆ_Èx§¼ Þ$­ý`T7§®–e øä‰E¾O¦‡h+‡‹;ŸÜ´QK’Pã -œg×7˜¨î€Ýr·ׂ¥Êþýó¿~WIÖïµûö;:wª?­VV—p+Í B qãtå–pk«'PcÉhyZ÷ìûÃçïÿºÊLºÂ:+bC`Ÿj«\õ~³£€~ÐbéÞàW[‹Å•ˆ¾[JûA¿aÖ˵.øÚeQ÷Ö,´êʘu½W Í¿-À4½¤=0 GR'úÁÍûÈê“mÕ>x^ºíóTPª¦v#«Û7©ô”ëê;ôvÁȼ|I˜ymÿuǽՅæ'xn2hn™0ÙÖ'á›Aš7/a v³€ÀeÎíÌ÷]ÃØ¾”Š¤Û±ƒÑm&”w XbNxù¨™ø‚ŠüqÞ^xÌI0§2a4ân°R?©]ìc¿%øøÇú’!¹Ð»¢ßB¦X!`Ò‘‡ ég6N„lŸ0•µª÷6É »ºËµÉä*ù•Np4q=™×"°Ø4î„ïÎŽ§¬ÏÔ›™?ü>’âˆQ ºy&‰ózš;zÊÔ{œÀ`ìO¼®Ê $¨Ó¸¾Éj$!—yºOcÄøŒHG€È] ؾhè龯“(€ÞjfÈ…¡êIŒœn…‰Ú ìHàŠíÂ(P++ù9¸h°ó¨áZLÛ´IÖrsð,&¯ *ÅîM'¯z!/‘õ*æ`‘;a©ˆÿòȸ†V ýت_„•.÷:ƒìOUÔWLÁþ륈 endstream endobj 1559 0 obj << /Length 2152 /Filter /FlateDecode >> stream xÚ­YÝã¶¿¿ÂÈ ¬½ú´ì»nkÑ´ IèÃõp ez-œ>|¤´#ÈÿÞÎP’½¢oû`qH‡¿ù憳þÂÙ&˜eq¼Ü$ëY^½ ,U?Îèã—¾ yÝ.F+ÿ¶}sÿ}šÎÂ`¹ 6ál{³ÚîgÅßòÔ*=_Äq,Voç‹$IÅϺyÔ²ªŠúq¾ˆ²4ŠÄz5ÿ´ýáÍ?¶ýa@}¥T¸òb…A³ÉlµN–aœlZ+…¡ßºaB­reŒÔg¶ ÿ* "ËVñðȦÕxŽ]ýHó<•¾œz.Ú#1‘ÌKUEÞ”M½D¨6âÃÁÏWU;µß«½Ÿ}aü»[Ý©ÉâEYÙûÁülv‹0^†)AÇW^Äé îP–ø•‰jS(¨§9LʲÀöD’-í äð£9ÑL «£µP%Ñ›‘û…y§µªq ³z(,á©ÐM]ñ$ –†±5”ë6jÀÛ‹Ìdi&a ŸúoVúh“н:È®l"¶A,ú)$~ø…@®/A ÓH$5ýÊÚ÷êD{àËád7_a˜Z"aŽr8šåY #+5uû«ëÕ¶°ÙkÙ±¨+Ͼ+9?"b”$â£cðéŽfOò‘×…Ù ZZÛëM/]n2¶½ŸjX™€–s¼>~ŒM(RïŠV£Oj—¼7çêÔ6í´Ð|fŠ7x>9"z$R%Ò3ËÓò²`¹ºZ™\žœW„bOô¯óPtM+Ûvø\¬’ú‹A$)w𼪒õÞ§®dOMG§“,ñyƒ·Bй£ß]Ó”¼†=äÁ;Šðn £ ݬè )­|!Þ+ŸÅ$†cŠ„±0lÐy!K¾8¢{îáDRgllqøxOþÚ5-oùý¿ÑR¤ƒªó²1Þ›$#ãùæÅbQ_æNdtý¼⼘2v­$kE>zW¤#E>ð-qð;¹O¸LÒäÒuŸuÑ¢RÙkL,ücê8g?æóqX$Qˆû{:ù§®=u­¡AøMÃa¾Ûù:ˆ~@4ËËno#èR@Ð{G1CTÊ„¸\ýV˜–SS&¥O°ªÓÑ—ñdÕ¦wà¨à±`¡3ô]ðéƒèå#A×W‚Žî3ÈvåþNO6!j¶Ú¢6J·ÎØm"µ¶D_‰ ¯h :ÓeòZÛÔîãpG®¦Mò*ŒôŠAÕZì™Z†Ì¿»ïŒ¾/›\–÷˜rÔ½t¾soY,aüÝ»?o'ø•±ÕàAH$ËfgÃ]c„54…‘ÒÒ)YèBîJeˆ´W¨šê”ȦWË–†—© è5Xƒ¬PÕnÇΆ&še Gd±Ù¥!D¿Wç½Jn—”‰§¤œL{3¿±™­uZ[¦¼óê¬H[¯çje:oÕ©Ñ­ùFÚ¸:äCEq¾¬»Wb|©D¸‡ÄkìéûZ8­aš¯ Bp4Géo*þ$Áòû¹¿œŽo”ÓK"¯£¨::£Åˈ…ØÀ2}ºŠÀÄ7ªSÉ…sf‘…PŒÄË®1Í–+רüDêtõÖSÝÄØmÆ RqP²íl¤ ¸‚_õ'`]¸êZ–ØÀEKkŽ’©\ñ\;¦SSô†ð_o&UO§E‡‘bý™CrosfüÁª/sÖ›q(!‚u÷̺;Œ$ýT#„3: .úìt6ã€v8Ó<áS/!N647¼ïÀ[/Ðú úYp›„ÜfŒÜ$ˆ©DÞž×$ÖþEÈŠÖ`[dð6©¼a¦1u“ÞÜ=1ÄCR½´½?õæ@ˆQܻ҄ „‡‹öžqòÅuIeExÒUœæÿ™X–Ÿ‘Çd°]ô GBÿHA²r­•ý²y'áü¿2o;h9ÎC·žó’ðê¼;êHm½ŒBó½Ç‘àn*h»â}(Ëlˆ €¥÷J*Ì=v «ÞOK­.Ú1µŸË•æ±™ôóµÑƒ†µr'`€CnCšâÈåWø‚$KWþMxÝ­Îà¶q.ßßh&ÙÞ—qkÙüf~Ædqwå¹/Þ_)w ï’+¢Ý¸*^öaO…½È%½ïZˆÕk_²º©þ?Ñ€žÃ(¼¼ˆ Üiy:)ý™ó2íà`áæß¤Y70+Û†·=<¼sÿšú)ÁV endstream endobj 1566 0 obj << /Length 1383 /Filter /FlateDecode >> stream xÚXÝoÛ6Ï_áGz]Q¢l¹E0¤Å:lðØC; ´DÇZôáQT“tèÿ¾;%ËŽ'E€ˆ<ï‹¿»#Í'üñÉ*˜,£h¾É$-/KÕ7üñów|3`œ 8ß­/^ˆã æ«`Å'ëíPÔ:›|bïwro”žÎ¢(b‹7Ó™1û]×7Z–e^ÝLgá2C–,§­½øiÝ+ê3­BÎóf-1ç‘ ³Ö»¼A›–Öe)«Œ&wÓ0au[¸©lM]J“§²(ˆ¤U%K…¶‚ŠÅPÅ'»þ§–û½ÒÿÖ–p›øâÇ|¦>/C+Yø%Œ ¼‘æ<&?eÑÔ{p¡ž†Kà¶S³S4h;¬Þ:Æ å=øÌ‹X ¶ISkÚvuå38QÒü§tQˬ¡-™úpQ©ŒæÕ‘I‚•5¢‚em¡æÖ'.àh8¶˜‹Õ’<û0MÀx ›Ð…`ê^–ûB54K%J]Älce)šlëÖF ¬Vø¢ÖqWߨÆ4¯ÁÒ(£ ¤iQM²\«Bó@²mHÏé¸nʽ©ÇÅÏz×ñL9¹ÞÔ­NÝñ4B8F¢µ -¿4M«L?.Ø{¥DÿÃeaÛ[ÓA ’jG±§ÜísM›âYî8iÆ}" ˆD>ˆ LNÒKI˜³‚ëªx rvV)^0™rS(âÙ¢\7V„3Ýb4xRß´¥²7f7åLšHí"»ióÂtØìÐî®ElbëÏÀðFbNä$ÄËÄ"D2dr¸š‹ÐUÒÅœ/¦³x²kÒ˜$LþÕœw[£Õþo+‹WÚ¹ ü&ËS„· †ó¿T%kB–iÕ4'…‚>p$1D-§#FEÿ.¿Ùu@UiQ7¶îã´PTŠ3ynÃÏ+‘¯Ø¶ëÔäuEÊ>W6l*\ÂBÈ7ÀAÀé­Šm( cƒŒh¹“ë¶'lÓñ ¹·´x^¹å^Ͷ=˜•8«5`4°q–ÁàíB»ìFqp ©Ù(Ä‚ã¨5F·) :cÖÐç? 1Ÿ‹ø$%òÊq¦P f:eæÉ®ø¤ 9p!×AÂUðv¤ ½z•“ ­L«+·µ Ɉ®oƒ¥ãh}ó¥Á ÆTÄY×õëª#TàGEÕ4pÐî`„#p{vêkœÊò(™bûÝ9ELeöT]¿ØÆ/Iv¾ì©èÕ •%Ž—‹ƒÎ„tr†·›~_þzíOÔy uY}ú†GÍÆ¶÷ÚJìg¹,ÐÇžZBò =óNЀŽöß~7¤ï¯ø(vïiù‡+§` ÷C|ßÒçÊñ;c~tJèóæÔþÛGÃϦÆyuVŠúþTâ‘+n‘K%.†©„dÆ`íÞlX¢|vèý¶ÁÔFÞ›3îî°ãW`3Ç^aRÕ†l?R›¼L­p!ö' f_be9+ãž".¢Ø˜»z¯ñnwÙ]GÜ¥½Á}Š•ØRöÐR e‡în#]Š¢¾a÷Ñy~ xš9"ˆûäÀñq7EJ¦R؇gw9xUáX¶cGjµãG_ñëºïÒÝ@°9Ú]´;¦JŒƒMLJ°¸ujv]KÕÊÛOûþ9°ãØE½¿ÒÍñq*àiˆð†Ñ äËvÛësÝvÈüÎ[‘¤½Ì5¾¾°Sòççw oN£\d\“Ô­â'»•`_ýïÀm÷6ÁèHìÑÍòÑU~üB}íÓ(œÙ¢þÑÙe{?^¾¼cíë»ã^uyÒBnŸl^ü9 òãâl£úRçÙi+81wù<ŽÜ endstream endobj 1457 0 obj << /Type /ObjStm /N 100 /First 968 /Length 1640 /Filter /FlateDecode >> stream xÚÅYmoÛ6þî_ÁÝŠ<Þñe ôl@tö.ÜTKv!+K»_¿ç¤‹mµ‘­ åD÷òÜñH{æbœñ,x„¤’¨„7T‚Å„¬Ÿ¢7œE #DøŸŒDý/ÙD§¬1˜˜ý „˜”Š¡PLöÑ;“¥“A&—¬D6%é:WTl‚DÜDÏŽuü)¨‚²¾r?è± C‹Øi”*:5aVRΛu>gL-^íM`)j4gì¼ÎÍdÈÁ*“z‚ˆO0^BPc3†B/-c<²jãÔi˜Î¢ý˜ EÖ ÆS蔆L ¨È¬–3t¥ÂÒ›œ çL ¯F@T¢&¥›Màб$D¥¼ QD)I9̈3¢gbˆ@ÅŽÂX ð‹Àìú© T·ª'Ãx*ņ À…CQ¥¢á ¤T6 ¼Ì¼®Áj(ÆÄ°JÆ’@ +y±t3ŠA`T/iì„‚:>ÀÈ)öTôéÆŠÁÚ…ƒƒ E *”r 4¾êé¢w#’F ŠU=DD©AÀŒdâ’£Ú ´Jq*á–ÒÉØ!£› pC'¥€w¯X̤@‡ßbðÜJÁ+Ð:Â?0B¿JìÆ .jE .uqÔôI cñºâ•+¬Dê¦&“|ÿÙE¤S!3*³““YõêãûÚTÏ–ËU;«.nß´ÝûO‹åß³êùªy[7æµC²»ËYu^_µæuðÅz„«Y&¸×³MŽäm`{fNNLuaªV¯V¦zižü:oó77õŸPn±\´‹ùÍâߺYgž>áï0E36k®‰³Ö±óøb%ñ &/æëvcÙ—æ5JAð¹©~ûýƒ¬L€ãòöææò3ÓéjÙv¢N5]RÏ|ЍÀŸhÍ^|ìßúú»7ˆ¨ÎšÕÕE •MuöòÔT¯ê­¹Ü´ül~]ϪX©^¶k­bjí¹»^Ý6Wõº¯™ÝØÏõÛÅüùêCï’ˆh¤B0ølÞ`6EeÜ0²|ÝÈ!&öÙÂ9ò…ŒP8Ú×kYëîD/ñ®—"î¥Fxi‹)D²Z\dô!ÛŒÚ}7•7¥ýÜÔ'ç wû¯êsyxöb#@¹À޳Ů¢mƒíº†Tlð4˜½ÏnÛÕí²™ÿSßìäpÌc·É„ŠkQ4Û4¶)îÄíÍÄx!Ø7¡†ÕÍ }€ÕÆ ­‹õ9Æã¢mn¯ÚÛ¦Þ-©iLm1IŒ6åc¤GH”ö džacÀ¸Í”¬Ë{–Ѓ βkp‡ã/ÓTü…àl@“'9¡.hÇÇÀaÒŽÊ¢‘Þc7Ï<Âù[L‘£%4–2¢ý´ÚÛŒQŒã3µ9Ȁ͛Çv‹‰9Y.áØ®(a×ÅîŠ2½| «ò€Uñð-}oÚ¿œ©Ã© yØH6yzH£l*º-ld·ù?K9ÿ± )9Ãúݳ·þLp¸õ|¤JË- § †ä1aÜdŠ¢›$O9„ÞKîƒ]!1•=czÓ‘é÷y)[*lBKhÿ9DK¨¬¡à0ç‡{ì‹zÞ\½Ó&ûý¼}·s³¢¿Mi2€4‹´Ï?Üwïäë*_ŠÍ8yFö¶ÀZ*Îfý‰OÏÈqøºj]·íby=à×1Àßb ÙC™tû¢?Fÿx·z¯ÈûÅé¾Íñ+½ÎGîË endstream endobj 1571 0 obj << /Length 1499 /Filter /FlateDecode >> stream xÚµXK“›F¾ï¯ÐÅaxHà›‡c§rH%º99ÌÂhE‚@fÐJª”ÿ{úBZðnmUJ‡éytO?¿i¤&üÔ$ñ&‹ p“0ž¤ÛVë‡ ¿ÿ|£äÜ Îz'¿_Ý|û>Š&Ês/Q“Õº/j•M>9?lô®1õt37…aäüVWµÞnóòa:ó‘ï;q<ýkõËÍO«î2X}¡Vxò©Zó¾ZÊÝ`Læqèª dÝŽS`œo–<–·¨Âd¦”F!Œ«">ù¥·ÉŽêoy—‹ëªþÓ‹¼¼lXt¾ôn…âá;þ‘Õ7or8¯xò/I¼¸‹¥Þñ¾¾ºR»Sì Ý‹²n_ª2¯Õ¦Ù×%_pç‡\Ñç¾; ‹ÜE,gš© Ä<öœÜòX•´ œ¼´.SÙ®Ö"î"\Ÿhï8toƒ™ßètê/œ ÏR]L5Õ¸Ü]u”ì¼ÞÄwl%26¬¼êŒÐ%û‡â$æmw…ÙšrêÇN£›¼*™ìbýŽ;Lq§š ­Æœ8]|yŠ?ùد «@T¨"'­À…õ>m,ÏÁèŠ.Iucd‰‡Ò˜XC¹ÉV^òhÑq¦>É2T)h1ÕA‘Ù<ñœÙO›2¢gpl6ºaj“?@¬gUA‘sδú÷ëa_¦h¡eHÉAY·n±¡©x|œF ~ëût•#\äR5óZv¬I¡tT˜ò¢XAQxÊ"nªvã*‡«<ãzX_ÖÔ+k]yÏû%ätòŽË|ðÞœÔ:.—ÑW¡£ÕrI¹€‡Ð°Ö"a;Ôà8Gf~§H¾ /|w]r¹.:°UØOÑÀK.‚«<®Â25¼_œË×7Ú¶|V8°ØÂ‰6—D3#X¡Æ0Èm5ÎÙY>‚bpä\Š€qYѰP§a°p>®Yˆ6ìª$ÛôB¬› ]eð”ðÆÌ¤…®MÆ3‹—¾ÅÂHlxQlêžëQä Ä$á?È«$Ç S¦Ee©’¨ Þ$§‹íöµʰ•B žƒ’n„ºÇü½· €B[·xÁ[$„µ#)Ù°Çf  ì›gr¬E6ˆ.1ìœ0tÞO〠íÛ÷Vn/_ DÏ`G«1P‡#ÿ/z]áÍ  §×ãÊ3 Ç=;¾ÙŒÔø~¬›ÀÄ(³1¾Ð9óIîÅ÷K<É}Š<‡¼ËK2R»BwqØ€Ó€s#\’±º°ò#G_)õü3õ‚“×v:¯å¾îóçnàùW}ôiÙ~×>ó–dœæ†ò›ÛËA¼ÅÍ»a¼ ƒówœÍypS>Šèîê¬ýÒn†Î±WêwƒæÅ6¼•Û+.ø°<…|™2 xbΕóïìi»k*üêô©«Ó ¦‹¹n—¨«ò¥©ô¹åô“ÔP9;ãn\4®´rÈáEoå0¿›¸Tv”¶¼'‡æý!}‚6ŠøÓPVÍ® endstream endobj 1576 0 obj << /Length 1730 /Filter /FlateDecode >> stream xÚÅËnã6ð¾_á#ÝÄŠ(Q¯ rh‹nÑžŠ"E»=ÐÕÃÖ#Qôß;álÉ‘lc±@±ÁŠœçÅy˜/\øÇ‰»ˆ|ßID¼H‹®Ö/ ZüþónéV@¸PþðüááS,¸ë$nÂÏ›!«çlñ™ý¸•»VÕË•ïû,ü¸\ °ßê꥖E¡Ë—åÊ‹Ïcq²üëù×?=/èR!åu±ÂX8Ü$Ö¾“¹þâraD‹"V«ªZ·•ýneK«×e0Yk¹ÎÕ=€â˜É2#\YµçÇ”],½ˆv¨"SÎrD!{ÞjsKÌô’3»¬Õ‹¬³\5V€jCß·£FÔ 60j.<ÞJ$®Œ”=õj@Ncå(Ι5·m»k>><¼èvÛ­´*^U a 3ïn«Óæ,äùöŽQ~jÅ®­Zõ ›ô™.®ƒáÍw\€÷Ûç¾wÞNãÛŸhYP¢`4LBå1Q ÂF;;ßA;13áENØÏÒ¿à `:‘é([†¦ß àaþ0¹Ej3õd £Ùa1IóÎÎU:NI”zd'%ÅèäböIsØd´{Ì y­ãô¹©ãÍdÉÈ 9À¦#_ ÒlÞ=H¢ÞÔUqCê¹hHl6ZÛ„bˆŒá-£Æd¦Ù„¡k³:ðSÔÅÜ8è]–î8×a:D×=N‰z6™]–SÎÕ0ãa§2µ9Ž¯Ø ÏTèLa¦=Ž·¦^yLc“˜\jqQcÄSiíÛÑ_ÛKW *© NUiiªÍÙ¡³qAfXQ¯á9áYëƒsB3iÞÕ‘úv#ÏŒßÂØåoü}˜=L•yþìÉ+ÆX²cŒ½yðŽ‚Î:‹øÍ; ÓDJIÜú~»ÃŸA¬6QuX '.šðÅÅ[=Ïä6šæ<>þ‘fB !Ž™bЇÐÓ'kš‡Öcç®å8˜¡yFòo;©¡LófäÝ<ÓqW6Õ~“Ëð×T÷?Tú.Iý4s[vó¯Hâ†_‘Ž}8öÿH‰ú£ endstream endobj 1581 0 obj << /Length 1137 /Filter /FlateDecode >> stream xÚVI³œ6¾Ï¯à(ª ‘k|rRYOY¦Ê‡g0h*,ž¼Ÿnµ`ð<˜÷ŠRK½÷×-ápø„“q'‘ÒÏÂÔ)Ú7T}vhñ×/aïypÑ[Ýüáxøîç(r÷3ž çxZ‹:–Îû±Ê/£Ò®'¥dñ÷®†ûC÷g·mÝ]/H¢ `w??üt\”õVáÍfÅá7f¥p9qúB†dÚ'.Tzï“Çœ}°Gñ·GèÆø|Q¥:móJ²aÌGժΠR6’ëMý$L½.Õlt>Ö}—7þ¼XÈï÷ÕŽUnµiÕå­h“ïéDCõTŒ›™Oä4p„ô9БìQ½‚-(Œ±/?p½(ØG׬RÚº)x¸fIæ6ýÔéü«j¶”н͇£Îy³e"Ô"hŽçt«à†AÆò{÷ñ %gmÕ˜² ¬¡8B,[¤×í¥©!š»Ò1ßu±/8ï@dI Ø¦/F™¢Í4({^Ûã67åóLÔþDÔ±² ä—Ž.M^q&"Ò$ß±XFé#‹!ñ^$Rökú¯¦j¿âRéw‘ªæB¦õé!¼«¢Ž?¼¹‡e ãYôZ4VuC[ ƒa ßœ°©±|ŸxÄk_ùÖÐ~‡ºT ï:F¶z—(Ë4¶p˜´¢m¯éšºQÒQLmÂs‰¥uÑ 9g× |V­vS`”í žŸkrÝªê»ÆZ™Ó¹î ª¡ûY"S”!îC·s§QF®Š-]Bø< ouï7ëÔI÷KC(~°~¤waÜñSDz œÇ¬Tˆµ®Æ»†â¾+íqï5ê°÷bømÿ}·'ì ]š\ÃÿÔë/uY*k¤…o‘t]ãÈh*ÉbÃ2Ú»~Üç ýY´Øl½«`˜IÁ>Vu³×زh®"Óè¶¡,†z¦fH§é3¨ÛüM #VõN¸"¯t…oh¨Fv¹%í‚+Q¯úÄ(.(ˆýXÑ–&]ÍfQ­‚Jõ_^Œˆ%Ü˜Žƒ ê§æÊQ*¨X´ƒ`söZ Ì¥¦ï”??nþ]^-ðP"ðƒ Ã'ËÓgî”@‡2ñe–:Ws«u`“;ó÷áOzÖ¬1žE~' À;OA òÀAïù> stream xÚµYYã6~Ÿ_áGy1’u[Îzwfö@°dú!@'l‰¶…–%¯H·Ó æ¿o¤,;¢Ý3»‹Ú<«ŠÅ:¾¢¢YÑlΖI¬ÒbVîÞ„4ÚofÜøñoo"³Î‡…þhå_îß,>dÙ, ƒU¸Šf÷ëYE6íªûjöà­¢ù/÷ÿ|óþ~ ”Åñ+YâÊ?ð,âY´ â(K‘'H•i%)³["·Å‡(LÇ«ü,½ïŽü‰çω<øÉ2óJl$Ogùø\pðx'cwêe·×¶KÏTðàÇiì•ÝNª95µÞrKÌÍ\; ïÿɶ–ÔÓSl™ÖHè)VJãþ—F2õŸÃ(m¤›š°ÂJ¿¸©þfás$9Sízþm„–¦ÙËê^V°’.•%A”E¬%½zî§ ÖxšÇK2).á3B3¿¡]ÏxÜ#þ½ æ~±Œ¼÷¬CÙ×íÆÅd <<×Õ᪲ƒó^%Yø ÎXêæ……«™QÇsz+ÝÜœ×v¡'Õú˜%™½¼·ØYz¨>D.ÔØ“`‘Ç︕½™®ÍúZño+e%+C쉬MîÕ‰ÑæÐKÅTº~#Úú7Yñ¬hmc0Ô®®Ô™8 Ñ7CÝ™ð¹ê±•ãýƒxñ ·±‘ZK¥v+Ø_`~M¶cR”¸y{ZçIä}ªw{¼œUÅ[I4iêÖåH bÅAɽ(ŸÀß<â³Ã€²ÐLØÜøå>ÒÍÈMݶhà‘×­ñ7ô^ðìpÇÜ +HÍØmÙtÊŒ¾ºa½Ã…£Ûñ'1v1Á}0W7aTÌ#žuò9mEÝW˜2‡²çºïÚ kè Q"õe¹ †ØrûN–á CwÜ-íðWX0Ál>-–×YÜ:ÚÃÀ® ;;$~PzÊÄž½S ¸ètzäéW ,+¶Hx¤pÍíZ+Ù¬AÜ,^YÝÀpÛñ¯îEÝAaÏÈ¢¬:©ý®¢Ì»c.hŸxõ‰!Ʀª'ÜT4M7DTrè•Ê} Ìe¿RÊ 1}Š·L¾-“D>ɸÓZžŠ×U¦úfН¦c9$Z@6’hÒÄÔËå2ÿOŽN,vRrá‘4]ïÀ?ãÜWëÿ±Ô·éºä¶F5/ ¡‡©§À“lêÀ¾¹4˜Í\¶‹¨güXÊÄÔ[£{ x€}Ïã¥T|‹8èHn8u-šÀôM¢ÈDb’n‡Fc ¨ªœá$º™•qÉÈŠ°K@ ~ |:E‡‘û”‰pÎd†·E—±{rÇʃ†D¢­P¨ê»ÝeYEEPÌ’¼–Ez£0ãµþh1—ƒg¤ólµÞ³Xìê¾ïú Ô¢ |.Ôa¿ïz½0YLT‡,ÇFÄyÊO 0‡ƒÖlÐaŒ rîG^gª“2yàÙÅñã$ R`ˆ6H¢ø†ìj´|B—D%(ÐB/ŽÁlíð×ÜC]2êÒûâjÐK/öÛºT k†åE|e³[üýýÝ»EÕ•V‰}é³KÀઠ’ºW‹F˜ÿŠƒ/1»Kªj,PEá]À©æˆq!Z’Oà‹µ®äŸqrs§4áCÈüŠ„q¬›H &¶Ü* 9B3ÌÞpð4u°¸ìvB×tZÑ`R¡Ó¾åÔÐíöÕÕ®¥Ú’åàÆ¨8ãq*¤¡µµõA’˜Òœh7² &âþ§º¥ÒÀð©šÂže½œQA7¢Qª(øFqVp ¦^hCN½( Á‘Ú‰—‰ñÔxÔÐëv ¤Ïã8 ˆFuLŒ¾2«(;Á/F½)PC 0|¡iArèzÐmJ–”fˆRÏä7†6Šœ`´Eo’òù½4z:LrÙôiò”4pƉ»Ö5@2€Ò´òh Ñv%×ø|@0'êž‚—pÊÿ ݾÿ"m+7±[ùaô(ÿ9Q5˜ls¨,^q!- S ßv{]w­úî—ß¿]ƒ]ã%"òüîó+€°"YSö¾éÀXd×/nç0ƒ-ôü >²Ìiç‘¢s0C%»Qeºè:8_¢¿£/7÷S(ÿEÐô–€é-3ûŒ§Ü$ö²o\Ö=ø9Fe™Å«x´Ú$àÈà OòY†Aqë)Ø.öO«§ Ç9ɳt{<< !ŽkxÕϲ _ÅçÆõúpœÄl¶ØP¦ä/ëõ‹C} ¾ÿVƒ OéobW¯7[ý…ÛïIÊýÚCèúbŽÏµ<"û:yí[h-Êk\/б15W%•Å1Ä‘Ñ+àÔ5ÿq[F1¨ðåY8 Þ=¶g1Äu0sbˆÉ‹~]Hw¸2í¼rÚi››ÀÄ[¾ѹ”þ”ÇV5,VpѱWÁ*sº!þ|ü©ýÕ…ÿŠ¡`„ÎêT–⌄N `bˆôØ‘ô fJ>*®hýðX K š,¼=¢:Ã( Íð båZMß h– 6( œ–¬P“Ѫm; 1Ó =ÏfáãAsgß›§vŒḃ iÀRƒŽ1ͧ±}NÀEîrÍRØ:ò$̳YnmõjŠ˜äb7Y<¿ï\ÀÄ®©\Ï}qœŽˆO{…ý4µ;»úù ˆïùšžæ Í =ï‡NŠW<›HZõáÚl%¢:4Ì8=ßúåÂŽŸÕIÁ¢bÒ\P^8Ï…µ½ÿøÉýaxz»ô¾Èûøîƒ{Ÿñ<óaä~K¸a•òg·Â³ßUâwü GÄzß×± ¨íôÄÑ5fïs­êGþ8ÃoFöóŠ£DLþOßRðª 'ÄøµŠ‰8Üo®ý.Wf´°ìzûÍ»¢©7­Ù‰JHøž­°KJ°¡ˆ”€‹-F¯xQwЪ®ä”ÿ¬ž™Ÿ}S÷:Õp݃@Šrü ½\äô¸Q÷<¬Nâ 0“¿É¾û34—à¶-/bw€ØN ÀP )ØÖ=={n¸‹ÀÆýq‹aܦ>½×á“aç.¾²qö%«Gºy[ØI*] ?§Us‡ö©åÇv# €M›] è6E((°°ó?Bæ…_ endstream endobj 1595 0 obj << /Length 1186 /Filter /FlateDecode >> stream xÚÅWßoÛ6~Ï_!´( ‘"J¶§èCº¦í†a V/(ä–h‹˜$ /5ü¿ïޤü+RâõeȃÎäñø}wßâðGœIàŒ£ÈŸ Ϥ8 ôª\8ÆøóË ±~8z;ž§'gŸG#‡þ$˜g:ß 5M;÷—ŒVŠÉE‘;¾LÖ&˜)K4ŽÝ„– ®f´LsfÖ%Ýàzžt¾µú–H^©þ{tÝ”ùo4¹×%ÛÜj®„2ô_‘>òªîŒîžužÒ'ÒyבÀ&•˜¬*]º•ºPi“ô¯W¸nÐì•Æ½ùô¹¯GCW4ªj”qŒSÓú’%¢(X™ší¦æå˜¨Pm6¿ÈYÇGƒ¸r@Ü †(MX1ïgxt⸠ÖÛ+Q4t/ë§¢R8zgTEU‚p3V›€)ÚJȧÁyäžšµeÆÁ „i~Ò$a•ª`”£ý¼ý tK>U¦U%²‰Ò­ U!¾8fÄydⱸ˜‡¯LÚj•!.Í^÷ŠÌpÓ³Ùï›rnçÐ÷ºÜðHEÒ€NT’Óº¾#a¥VT*žäl­‘CñÂØ[¼wІáÈý šN*ÃqˆÖ\È® óäe’7©u¼ºùf ”ªæÙ1KBš'Ê}ãb:p›óœÕ-ª]I½C*0*šü ÉYÑV=?ÍÁŒt´Ì eg íºvÖkÛ¼kµ™ˆÖaödž)›Ó&W´öYÝ™˜ÿ»D2ªØA¨R4ÉP?õñ¬Šug‚I몤³ü³m®[¸uSUBªÖ‘íâµtu‹…PϨO£ ÃNˆxjÆàCaÕvÕ¾[¸ÇäZßOóïl;¾Új=+‘î€m‹”-YÊjl”}:;mÎæø€ëhpÕjÝÉü?bƒ€?…ŒtAÛCÕXôbóNèggæÊ/¹˜µÈ·o‘V•¼äHÍBÕZ·ÖC¿PÑÈ`8ûɬ™Rð.­ýJ&”lØû.,¼ØŸdÝ^[…aÊÞÌŠ7˜¨NW¨Y X€öµïNânß’•NP±zKÖëŽûù¹n[eC~¡3–ÛJŠG&%OÙAëØŽn»Lä3j5Цd›¸‹—ê³É  ÒŸEdŸ0‡EßU†y‡êkï§æñÈJË.åt!©|ð±†ßiéáÜåÔ’tYîO”%O[ïaR\ôéÔVåru¹~EñuÙnW×Ýo«ú9_4’õÆ3N Ì&_q‚T®»TÍh]±Ó W„+Û·X.I>H–¾oÿ5ü:ùè endstream endobj 1600 0 obj << /Length 950 /Filter /FlateDecode >> stream xÚ­VÛnÛ8}ÏWA $¤ˆ’•Æ[øÁÙv‹-RŒb´´DÛÜR”JQvbÃÿ^RÊ’-¹Åb8¼™9g8$…¾úCƒ‘?x†Þhx7ˆÓ3¿š‹é<~8C€sÐm ï§g7EÑùÞÈ¡ÁtÞt5MO—.q.‰¸rÃ0¼|óÇÕ·éGerÛ4yr‡ÃèòOÉ?°µ—µiYà¹rƒ;¤£PÏÞOkfQü¦<Öp{ áönè¡ph4ä„_)»è2ÎXVŠ`¼„𷚃òé·^è#€b* vã¿ú‘ï;¾jP F¡‡¢c0ªÀ.êBƒ ŒNx3cäE=Ñåd¡qLËv»AŽèçP›M“ ËÂÌ)c#Ǥý4hA[y¦±,1d(WVXÒŒ9Y›Y€œŒÔ´tö ¯»Â7ò3š›w° 'É!¼WY"ðÚä«7O5¤??77t~ñUòäâÜ™eÏμªù eRõH~”TÂŒž(g”“oF¯Žžd¹æîu‘ÚG|À3Âö¡ïUèó õ_G6$€wåòÿä°×|¨÷xÛùù²½ßY“þ}lœA8Ünoì`:;·1ÅbAáf¹§‹OÕplã=}dRwKN¥9œî¦Jc=á› û;YR™hÑ1Î!º’^]&êð+¿zäºß™‘­šß/‹ò(HydóŸk+V­$iïØemü–qs¿‹%ͳ²JôL•FeâQ|2¤Mx²ÅÅË®KÏ+H½®âí¡Š§;½Êt·+µÖéÁFˆ‰¾Pv^YÈœ.Ô¸ë÷Çp™«¸9t)œ?7noWh%¬ev…ðO ÏÌ|æpHc ˜"'1¿˜\Âòš&ê%é†ybKBK f™iµ¨ê3Aw€ÂsÎhL%{Ó¥•¾³œæì× &V”¬IÒ‘Âê²Æê®^ô U„U`ŸÂI’Yg'A;)^Ò\fR½”(js\€´ÏêÛâÃ;Ãʼnú!çÊ#Vd¢(ó<àc«Ó!aÀ°$Ïé÷ÓN‚©_,³’%íýé)³³ks¥(É5ù[¶ë¥ÈR"ij#$¤ ÏlÖí’tF’CbÌaÛržI%£kW°”ªluÅomMY¢õ‚ÔµVË0¶FFó)iG_ÆÚ3ÚÓ©ô¿ZHpÝ[¨ð„yöÃõ'Ãùs endstream endobj 1604 0 obj << /Length 650 /Filter /FlateDecode >> stream xÚ¥U[oÓ0~﯈ª>´«l'îe( mÄ‚ u{pçiR9©úß±ãvM¯+ <ä8çûÎçsk‘僌!4ú¶m áM°úÊCC_Þ5Ð gJ YC^¯n1´†pˆŒQP5òqûmDg‚ñŽiÛv»Ùy}”^26‡´?Ò»_¹É¶[Q‹œ†¬câ’‡¡£€ëÑóÍÆg¦ û9ôvrè  ÙŽÎáAZÆéÂc©Lf©Ôe4Ù"»šÿ^Ž#‡‘po â4‰Sæ ^0@… ^ä4Éø³ù,ãbû"rU¬N[ HKxçRƳÌq–º’e!§³(ö 8K½>Ä÷9+T‘ÆÂ+& L’‚í£58¡–(t³õͼîÞ¸¸Õê Ð"ŠìïUŒn¥"K ¢þL(çÑk¨DYêWu:åß©5îY6\A>¥r&m¦ÚÍ´•{4YyE´2‚8,øúc¶ë,’D[ªüÚªšpyìv9 ›þJÍ­6×gã`Ëg4æúF%tuõáÑÂÖÀ¨ãCà=,võèœ8pKÔ…VŸ\(R‰Ír»Ñõ.­ç­D¦YžËLhàÌ—±ñ¦/‚1ð)ÿrÆRI±1öæx*'Xª ß)©£5Ê­¢`I!wÁsˆªÍ õÖ¥[ªP\|ñÔ;zaº{ëX/榹kª ïOîx³õ¤ô`7—µGÝT)ƒ7œgó\QžƒÏ,½¥\Ni~4¡JŠìJí*UãNùâi¹‘ ¤¤Ê矇äÅìî7RXJ=÷æl½ÿú-:ñ3¯˜JØrý×ôÎcüH endstream endobj 1606 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./latexusage.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1607 0 R /BBox [0 0 612 792] /Resources << /Font << /F41 1609 0 R /F44 1611 0 R /F53 1614 0 R /F47 1616 0 R /F42 1618 0 R /F59 1620 0 R /F60 1622 0 R >> /XObject << /Im1 1623 0 R /Im2 1624 0 R /Im3 1625 0 R >>/ProcSet [ /PDF /Text ] >> /Length 1228 /Filter /FlateDecode >> stream xÚ½WmoÛ6þî_Áo“‰å»È û ]סE±ÂÀ $ ÈŒ-Ô’IÎË¿ßQ¤l:Q£[—y<òîž{ÍùböêWA¥ØHÉÐâQ¦± ))0Z,ÑEò›mí<åL%eç¾Y’ûííÖ¶®ýnYæ«6¯üfÛ6ó”éd¹+æ4±Kï®ì×þü¬{¨¶}ÓÛÃå6wÝ…·úf¼°oˆ¢úiþ×â÷Ù›ÅìfF_Š˜…9E’jL‰DE5{õ®¢èu3ûcÏÄÅš1ÝÌPšaÍ•¢Iƒ çF3TEÔLaÊ¸ä ¥Œ`£ˆiãpÉC)Ï0•„ ”JŽá-àE¼Ja¡ÍxüêxP ˆÉ‚ãLÁLü*'X1Â58‹XÛˆwoVôèZ£?Q=‚ÉðƒV‡åÛ=¦éj¡z>D”ˆ#ŠiŠ©ÑHfhÂGÔÙèȯxè[ÅK‹çœ@˜ÏC@ŸGñ­7˜KNÀpŒÆ,f¼HcÉ%å"œŠ§§ÿ»Ú’A€éìEµ/^Ðùq•I©"ƒ7@,´ÿM^¸ ಳ*ÉvXR_t€—Ø–ã·‡Xš˜ÁÖnw[¶M]¹µNzE yäN#ö©†,õЉ™ 0>DõĵOEÃ,½ôýúZb€ 0O>œ¦xé°8I´" ‚)H@hЂAûg¨¿OüïQ§šciÄ@l¾ÿN6G>Ëà”jÐ ƒ `^ô%ajrÒ’’œª× Ì( 5‰J ÿJ˜±úLÔ4ø_GÁ¼ä†NÒ—Žzþ†ØFÙ endstream endobj 1623 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./latexusage-1_0.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1641 0 R /BBox [ 0 0 113.39 119.87] /Resources << /ProcSet [/PDF] /ExtGState << /R7 1642 0 R >> >> /Length 466 /Filter /FlateDecode >> stream xœÝUKŠ1Ý×)t‚J•ê' ݤ9€a<„v`’E®d»ÔmOÈ&^cL=êýÔ¢ý^¹Ðø\'øô5ÊñXù \¾—ï@å3T´2¾'`Fñó´Î‰¹;r+ëyóvºl¾Á—ŸGpWtåb½£h9M œ±ŠAé­´^Q#Š£‘Îù•::õ‰DCñ¨S!ç«ÅP Tµ’BŽ•dZä|€ ‘H†L…»x*|iÈd†Ú·† d¾^«mñ½¢˜í :ªÅDÔ;V¶)ótO`Æ» dü´Ø ^3$Sà®Ãè÷þœÅÞà[ùœïi¯ç˳V;¿]žóf. LÈã@•‘¤—¨TlâY'âç“Y'ë#²±†ºwÂʽ˜¶àr‚&ŠÚÚDÖ‰ ­Fƒ™¬ÈÆêæŽ]JDŠ_Þ ¹­¨ön¹×©nÌL›Ô=rKޝSšÙµ^*Îì•Úù4ÖmǨæÎU;Yëôß!·¤›Üÿ­´€š Ð¸T†QãïÁ•;FììÆ¶ˆ­Ž¡uÜ©`¬ÍŠªbðø¿#]‚?Jio„¦ñïàÁŠÔwvî-t'Ï)Ü‘.Á¥´À üí9ÏÑ endstream endobj 1624 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./latexusage-2+0_0.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1643 0 R /BBox [ 0 0 237.29 113.39] /Resources << /ProcSet [/PDF] >> /Length 2258 /Filter /FlateDecode >> stream xœuYKŽl± ×*î ö2²†–’ ê ’ý"À¿êzQJç\Ûs°û?=ó÷çÏkBµÑùùï¿^J æüHSÌϟ͉@·çý"2¶gt"¹ ÔŸ÷—™÷ëŸs(G"ÿ?CáC*à-Úã3ÝÆÎ þ¿yÎf7ÿ5Kk t<˜Ã¡ÿfý÷þÜœv¼; iõÐ÷¾ò»×ŸoÃ׌¿Vó=è?¿¶wOúÓٗٯ!¯u–=ʹŠ7hôhï€é’ŽÀúèp.IWÐþ(ö‡d4 hèóó"Ø“óháÐì/X¡UÉPëÕ‚è1ôðÉPP_0Û34?ß»zvïb ÆÁÑÁ ƸZ8A—cÀ>¬›‚Ý}ÃøiÕ~2k}¦k½á‹e}xȔӇ&]€éÑÑA»]Ø@YªÃdF “ŽÐí†{A“Äk20z[zôý"ÁN £Ýübb]ù!!½¦M¡pO›¼¼¸[ Ðö|6v1Ówä`Ÿäö<5 q}Gp½v ½vmï+~YÌûEܵ†˜}¸#´c2 ð5$û¾¾»—Á_°åqÈö“™kfïÐä¢çå5Ž]º¼Ä+<,‚=ð¨åt6ðö´ÀDµU‡°uÃØªƒ±OϘmœ68_-ãØ Ä Oëcúyò߯¿HUÃ9ÊX#»j:|1¤F _P¬¿yv÷ƒk€‰^ÔŒy3ï5·‰¦öabã=æbÖ¤¦ çÿ|-3—îÒ€=¹ðןbZ{T"û“xØ£BQ2 ¦Ù‹‰·MŠ€sbngÕ»×ÚT50Ä(£zˆÞcl©ƒœG$ +.œFDŠ¢æ4ɉ3’FËTd}†^Ÿ™ŽH$“x‘`wPƒîÔ8¢{Å•i䬧 ŒvOœÙrcKÕš=’ñJv¦-Ô ^Ù.p‹% hyÁÌ@äÑÖsQ1Ë. öÁľ²áᙦu>&”#ãpážGpC³ö¤±Úú6jÎÃR%3'Æ~‚eáN³G2dôj1Ú£ìÐCgcÄH gL¦W‹N{sɡݓrÂH§ê”C¼/†ë,8ÐG]fHc]]8L …C®)9 4)ˆÑss³§©÷Q“Œ•a ~rczß87ÏsY“‰­òž}"D&1"*C©$’ºE-t„˺—ÀÒ :'Z‚y×Ñêãôqñ¥±‘èìTû³lS«Ó⼑í-OžSÆqbêéºpÄýìŒõrM -qó¢§s'Î#3Èi12ÃØŠ°ô†‘éæîF‡öQš¼?˜ "o-7.uáÂqøÒÆd¦¢z㻃%3ĥʑÌnU6e«þ2ÅHßXN˜ÌÚc¥ˆ› 7è÷–[T]W5³ñ”Ù‰£ÈòrÎfú˜-$aykà; £}£ÌΘ[«j˜y«Î¯db݉=ÎÁ•H¹EF:ßùú~ e ˜í‹é#uŒ¥$~㬑Π—È‹‹Éãî¡0»OàV6K-¨×¨ 6Ïû§ì¥öØ<»¥°Gn²« Ä» ”%©xêÒÏë0šc§…H ¯1&þ9ó˜Ìû0V¡´™V¶Ô êm¤ˆOV[ÛÓbb©¶qqõ¸æ˜Úrýž+ùÐðü7ÞUËb–ÇÂ]\cYó8»0™Ö[¦ã›¡é‰½gØ…;Ø<>Þß'ì-¤xã¶òý¯àˆ€aŒ3G©­îqáe¬J1M†Q(«²Æy|7ÏPýy¦\˜BI¢Š"*ŒU×eFfŒ9y*l$•ĺåó‚ ›°™=CÖL 9¾œ3âÚ’Ý‚K·‰»È©¾›¤gfÂ~0µî&€#e¢fÙ(tká´%4»•Çý‚QFÜxÔØ«‡hinKÈy6~T1SaîN$‰£GdQÚLÌ“F?šÌH T¶&'¾–‘©®=+C3¶&Ž(3šÕålõ±—”$J˜»ì¥,†ÛÕ"naF…Ѳ^©ò‚Ñz9P€ûxké4ª^xéòf¦.§Í¸MÕet̲u™Ñ)‹êÓ‚AÚÞæÄ6.aft¹tù"jSÝê[²|ã’åÔ„2ºFà\˜oMqëÔ[“GTM—&>ó7Þš¼™)±#.“xÄ#ӽ刑_Î/ŒóÄ>¢|˜åÄq–*±C¤Ty„ãÚ¥Êã2غ° ΰŒý£ËCc“Îwõëû[—³4uh¨>Ø2 ]º<,Bïnay5˜·86ÒÂĹYœYz2±¨¨Se3ËMË&c¼Pè5*#jlÆÕÂïúaãÁ©sÙï †íªP#4õv\÷Íqô…eÜ벰ܸ¯Ç ÍŒªâ§¸Çe…<ÃG‘æËÚo!IqáHw!%-[ý & ÒÅ07 cŸ‡a3ŠQۧа¥j„‚?/¦&Wówxw ñ•OoxÆÛÌœQôÇ̹ò‰¾VY+Ÿó¢–™l®<æ1™½®/\o·×Ê9ŸÁ¶ë6¬Q æÊkbEÌ•§ÈV‡µ°_ðŒ·™9£å¹ƒåžñÏ×*såñ^ÚõQª'²?/yÌ;˜ž·§ùâÉñêšœâËñ*õ$VÞÿy%Sáñ-Êu*Ì%M­£–‹ˆYR5Ñr±,¢y#Œš:RvX v•x,VÏ´kˆ¹ª%Ë ÏëúÏY÷ :³¢¶®IÑ‚E:oœ³Œã}µÀÙ-ªÛ8c{ÔR©]‹±–•9Ç+pbɧŽgà(»&Î1 †^-˜Ò@M²à¼÷FûIX n>Ç-Õ§Ÿæç­^)v‹š’çí…ãé²õ„³¬ Þ.?±fXÇ‹Q÷õ:ТùH»¿[½ÀvŸ3œøÚˆÉ¨eœÁ›dñÈÒj«ë5uyµ I¡{fßÎ2b]>˜Ï8Íüãõ?\aÿ endstream endobj 1625 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./latexusage-3_0.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1644 0 R /BBox [ 0 0 388.54 100.62] /Resources << /ProcSet [/PDF] /ExtGState << /R7 1645 0 R >> >> /Length 358 /Filter /FlateDecode >> stream xœ­”1nÃ0 EwžB'`EJ4¥èÖ䚢H†¦C®_²äØÉ” ~üGRú°BD Ñžùýq‚—†Ã/H¸…7 ð 1¼ g”ŠJÍá©Dʼn†r„=dF¡ªÎZ¿Ý=p«Xcª9\À–a‰UµñÛ1÷ËjdÎ>@cÂT)œ 0Ê(Íß¼çP]{Í s±ö]™JB®É” u„/ø|b¯=èÕÂóþ ÒŽ3zêêp¶Éè=¸},N»;G¯üêæøGW®]v½äù‘LXrÈ* ÷uz¹xÏHœhít¤Ž‹ kqeµxZ«Åvû´²·ÔÕÉzÂ-ˆœÅa«„Ø+»¶Ä©í?]¹vÝ|OÊþõPbœXúR½¼A,–yŒ&¨Tíêºb£YMÙPs.OëÕ‚Ùc ­=uuƞ̣t‹Æ‚sØÍ½òdæ?Ô0táÚôQã½ endstream endobj 1627 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH ý÷ëñ#xÙö?ŸgìÁÜýx]OTÝmÍ$|äìÍœºs_™Iöss îîò®:L;<S›zœ==±×¾«Öf`÷Ù*_µÍð`É«¶ÚŸk3²¾'ióÑ´ž‚}Øý»ù=©½“í¹ÙM;áà¾7ÃÞr¾›f¶ÆnjÌ-ùeúSÓµOLg~¼À8÷ã ãâþÈ)okà çA„8 ö$`I\èÎ×3`çAfŽã<ÈZ]ƒÂ!‹„ê xNkÇyã¹ãÐð"œ7Á¿ _¥ã“§Ìq âH`òáö•‚nú¥¤kÌÂðRONH=CpB:# =Ñ%8“ˆ88QA~¡!*ÉzÆœøÐäT?!~Ž> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MS 9Ù_êãP·ò{=éÇsæ@öd”ôÇöçºkŸ˜xäœ;`ÝVY×`Œs4½JaÓQÜ¡n«þª‡í¡.’Uu9\ßèY6î>¼ý<¶Ù´‡.Z.ÙôÍž‡þ“4>DÓ—¾²}Ý~°û¯ÒÜÑör:-d0­V¬²WÑÍÿ¼k,›þ8ãóþy²LÒ»ðºÊ®²çÓ®´ý®ý°Ñ’ó[Å*²mõíLrŸ²?ŒÜÔqù¥ã• â5F8@ šˆ=@Šð)&°  È8Ô¹€ÂÅRx u€Dº\j2H—†ª¡ÐVÁ¹0CzL]ø Âb°ct‘I ©g$`htÑ‹0œÆ\F„áŒ0ä†sê‡á jd< —Iê6œ»õñzgóñºË»þê W ¤qÈ’£+—Ÿ#ö•ñÌÇkÄÞ .‰bªsré…¤šáæÄç†bïmŽXú¾„Kß7ǵHß7Géû„û¾nb§>&jÊØµäuœ¯¼ú•ñ1ÜV™÷•âÜãâµÇ‰Ou$ÕŸqWèS/%1{\øxB!€§ÔK(hH©—TЖ枃»J©Ïϯv×ÜëÁ=küÒ2ø¥UðKÏ‚_:~é$ø¥Óà—ÖÁ/¿Œ ~™Eð+7¿èË¢/ ÿlì¡ÛÒ(/}ïö -+ZXukoûìÔE?Z„ãæÅÛKý£ûƒÎ endstream endobj 1631 0 obj << /Length 696 /Filter /FlateDecode >> stream xÚmTËnâ@¼û+f‘’a؆!ÍØXâ°I¢Õ^Á²–°Œ9äïwª3ÊÔ.WwWwA?üzßNtÕííD=söaÏÝ¥/í$û½;EyW^Û¯ÖV¶ßž_Ø{ß•[;°Çl“oÚzxräM[/•Y?“ŒýªÛ@AöøiÿNʦ©÷‚Oö—ú8Ô턃ýYGÇú™ÀÊîPFil®»ö…‰gιÖm•u &9GÓ«6õê¶ê¯’Ø#!YU—Ãõ‰¾ËÆ­ÉÛïó`›M{è¢å’M?ÜËóГʧhúÖW¶¯Û/öx§Í½Û^N§£…Æ£ÕŠUöàJº¼î˦?y#}~Ÿ,“ô,¼²²«ìù´+m¿k¿l´ä|Å–E±Šl[ݽ“ܧì#7u\>Ç—ÒñÊñš# PMÄH Eø“XÐdjˆÜ @áb)<:@"].5¤KCÕPh«Àà\˜!=¦.|a1Ø1ºÈ$ŽŒÔ304ºèENc.#ÂpF˜‡á Ò Ã9uÈÃp52†Ë$uÎm}\ïl>®»ü·ë¯Îpµ@‡ )9ºréñ9b_iaÏ|¼Fì-ÐÐà’(¦:×ù(—¶($Õ,/0· >7{osÄÒ÷%\ú¾9Ö"}ßu¤ï[îûº‰]œú˜8¨)cCÖ’×q¾òfHèWÆÇp[eÞWŠsˆ×'>Õ‘TÆý®Ð7¦^Jbö¸ð1ð„8BO©—PÐR/© -Í=»J©Ïϯv×ÜëÁžµ~iüÒ*ø¥gÁ/¿tüÒiðKëà—΃_F¿Ì"ø•‰›_ôË¢_þÙ¸D·«Q^úÞ:Wt&p êÖÞ.Ú©;!‹>t Çó‹§·"úª#…® endstream endobj 1634 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝ۹׬“B|Æœ‚>âþ)þ;ëvÇw%gÏçáí4Œ3‰ä§áô–’>\ ‚‚6ý§ã°¿ õEJ™€õØ7ûÆ8ó 1¿’{Æ~ºðÏ`W(-ú¡;]¾è·Û%=°ùñýxŠ»‡ñe_,—bþ+-OÓ;qü\ÌL}œ†ñUÜÿI--=ž‡·B«•èãKª˜æÿ¾ÝE1ÿpÆ[ÎÓû! Mߊyuû>Û.NÛñ5K)Wb¹Ù¬Š8ö­iÇ[ž_®¹uÊ•MúÑzQ­Š¥Ò)V†€Ú(TØ€àx¿àÞ¢ žjy‹°°!ÀÐÔ•µZÔÀ2àP="¦ZdÔ0\ÃG©R\¡·”).–2*ÎШa!„U¼Ä,†³ÔÛHð° `+jÐÃ.¸5Nα@èâ°èÐVK-àxŸ%ô˜Ü3š% A°YÓ€z¡ÎšÔ>kP#¬³¦õ™5m0W£oš¦Ã¾žj­®§Üý·.†ÐZ¡ŽT$X/©)n)æ#W—„o(æ“oÀRZÞ $K¢p4’ŽZ¶-bâ\­1¦Ü°Jä æP"Gñ‘XÔQ¬‚i/8ºkÉ^€ÂZqŒ:ZsŒ½š9”d š­Bù Ž)ßsLù-ï7½æx˜ÏJ›¡¾Ò`¯ažÉ½)f¥É$†µ’1™¸ dÑŠcªCZCù<£7Ã3JÊgózÌnøþHȰíáÌYÉšäTœ¯a…Šï¯Æ,_»œ-Ÿ—Oë87Ë}êÛKÔ´Ü—Ll¹oKñšò+Êg­JÌâ.¾GZyóº‹Vðc­48¸’ï¼äØWtù]Í:P~`áŒñ±–rZŽq.nÍ1]Ç ÇàSÿæ/©ßP•ýïuö¿7Ùÿ¾Ìþ÷Uö¿·ÙÿÞeÿû:û?Èìÿ ²ÿƒÎþ&û?”Ùÿ!dÿ‡&û¿1y–¦¼ÍH·œn5þ¹ã)º½ÝyšÒ“Bï½x#†1Þž´Ãþ€]ôGoáõñÅ×Mñ?®Xê endstream endobj 1636 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°ÛªT«½Bbº‘ A!úï×ãGpÙö?ŸgìÁÜýxYOTÝmÍ$|äìÕœºs_™Iöss îîò®:L;ü2¦6õ8{zb/}W­ÍÀî³U¾j›áÁ’Wmµ?×fd}OÒæ½i=û°û7ógRúùd{nöCÓN8¨oͰ·”of™-±Ï%æü6ý©éÚ'&9ç¶P´uÖ`àL/"Øt”µkÚº¿(a[è „duS —‘û®ö$°xýqÌaÕîº MÙôÕNž†þÃé{¦Ï}mú¦}g÷Ÿ…Ù‰õùx܈` étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇQÈÙáÒœÆÆÍ8ß›ñäIßž3d_ƒ “~Ù~hZ÷ÄÄ#çÜ W›ö c Ñü*…Í'qÇÆÕýU;€ºHHV7ÕxýÂwuö÷É»Ïa´ç­;¶ÑzÍæoþpûOÔøÍ_úÚöû`÷_¥ù£Ý¥ëNd0m6¬¶G_ÑÏÿ¼?[6ÿvÆçý³³Lâ·ºª¶¶C·¯l¿w6Zs¾aë²ÜDÖÕÿ%!ãpœ¨™§ò%¼b•l¢µËÜc€Ã¤ ¥¤ÀÈ ¤ÀPÀP«[ ßuªŸñ©_õgß_•ñxû4Ž$Oˇú<X^\NB8 ë\;c®‚šBbMx¹ ùy˜%ÆPÈ 3jok:E q:¹Œ/d4ˆ8ð€Q§4ÈA2="\¤ÂšYˆ+ÀË‹ÔÏsä(Äè5$ YŒ—Èú rŠÀ‘€ƒ~ì+A¿\HÈ•ÐWr߯{ÇNøxoËøŠ‡û• ¿”$¿TL~©ù¥òK¥ä—ÊÈ/¥È/¥ƒ†p˜1ðsòQä£*ÉGÍÉG-ÈG-ÉG“zA>ê„|Ô)ù¨3òQ/ÉG½"µ"µ&µ!uN>ê‚|Ô%ùh8ùhùh$ùhbòÅ,n~á†üá°nË£ºô½ß+¸´p]À¢hœ½íµ®í \ˆÓ†¯—2ú á«„Ñ endstream endobj 1640 0 obj << /Length 740 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvH U„dçCâ°mUªÕ^!1ÝHDI8ô߯Ÿá-Û@ãçñóŒ=˜»¯Û™®Ú½…œ½Ù¡=÷¥¥?w]pw—µåùd›ñÙÚÊVÓìðÄ^û¶Üڑݧ›lÓÔãƒ#ošòx®ìÄúždìGÝöa÷ïö÷¬<õBÍöçú8ÖÍŒ÷½ŽóÝ4s5vSc~É/ÛuÛ<1ñÈ9w…¼©Òö†`~ÑÁ擲CÝTýE Ûƒ´@HVÕåxùïòäo?‡Ñž6Í¡ ’„ÍßÜä0öŸ^áC0é+Û×Í»¿Qæf¶ç®;ZPÁx°^³Ê\Cçýyw²lþÁ+åý³³Lú±@Ue[Ù¡Û•¶ß56H8_³¤(Ömªÿæ®Ø&ªrT¾„¯PGë ‘¡Ã2†wØ`24XXºBX8aÁá ‰…ÃJû‚ÃA¢`R¥Ðˆ è¡¡‡^]wqº&j9)*ÿìú‹v®`‡ÆRò°Ä:(à!bx8ápŒØ÷¹ììׂN)¤ï‰&â>0Ni¼‚qFãÆù?ü‰SÜÖ€'¼ÂYðàNR–È}Â{àfØ{©çx2­¯AÃ! …u x‰k=Ç{ã™çàäàExo"ÿ}žžRÏÉ‘#£¿¯xÛ _J¼Æ °B ¾Cì©bÏ8!ž‘=Ñ%p&r"àD9ú Q¾ gÌ‘T†uà+ägÐG¡N—š£N8O-(7ZRntH¹Ñ ÊŽ(7:¦ÜhE¹Ñšr£1+ôè‹wÏÏ(O:¿Í“.nódømžŒøš'#¿æÉ„”'³ <™ˆòdbÊ“Q”'³¤<™åÉhÊ“1”'“RžLFy29åÉ”§”SžRAyJ%å)]\ïÌÿòý/Þ&xG¯¯^yî{÷ úÇÖ?tðÄÕ½¾Ç]ÛÁ*ÿñùô·£—"ø »s¨s endstream endobj 1648 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ}O½‚0Þû7ÂÐÒk{”:ú‹¦ƒ q Џõý-‚sË}—ûd'Áj-œÉàP3ùf› ºe»`Øûx0òsìY2'”ÂI‡àOÃSþy49×GÙÄ\kÙQ¼÷«I‡‘œCѺðå®—éWn£Ï{Q•1Wà¨5²™ÿ~FJý¯pcRdÎXK÷Üh:Š4µm4YÖÊÀôÂ6ìˆ=« endstream endobj 1653 0 obj << /Length 1891 /Filter /FlateDecode >> stream xÚ­YK“£6¾ï¯ð-¸2&Ä+©=d«’TršMM.™ìAƲM‡Ç¼~}ºÕ Æ6bvvRs°h5­~|ý#ü‰Eê-â pS™,²ÃÏPëÝ‚þöA0ß W#ÎOw~ø5 ÂsS/‹»í"ÂÅeÏu·YÜ;i´ür÷LJ_îI¡ïå‘Èyufâ/Dìú"”x&h%Ò¤ã’å*Œ|ç“jôrÄ¡s¨à×w6]¡Ô”ŽÆJƒUçz^LïÿÜ<ŽmÕjæ=3ð~“uu­Ë¥Ÿ8mñ Âé4ûüØ,ÍîcÞîiÕî5ín«¢¨ÿ1/w´·&ý`…úÁ–ÑïG:-”n #ŸôS7éý™¸‚¸„'Çl÷Æîc¡òrJu"RWø,ånŸ³¾ô+{mg£·ª+Ú)_‘ý¯ºH:ë¥p ýDzè¨ÕØÒ)T¹ëÔn` ½¦Ë…©F*Zµ:æYÛÕ3a3ê´5hÖN8G¸ÈŽ^L¥En3>ad¥è½qƒO¾£J¢æ‡c‘g¹ÍIÒsŽuþ Z°WuKƘýdQD2Z ’Ö† ·U­éð¶VeS¨–üŠèƒa­ÊÍÙÛ+cèj°4pE(ÈR% (5’ê¦%j†~« „]þ€ÁÑ%1ç%‘sJ ]«¬EŽØa±=µ ¹z=ö`GMEBÔª™ü¸ïeŸ› [d£Idés;–+xãŒ"ÂFãkeÞæUÙ Ié§L[b¡#qçt$ e7`ä³fÚ½`‘aèT[’UK†T³ˆ`TÕªäe»W-k@0ì#óZôîó‘ÂÉР©³íÊŒ­C:¬ƒžWi“ΘA'è`‘eºiòu¡™D/•A ÈREaOˆ×ª†DG€"£Àù«áÃ,‰€UY©®­æ,ÂêMP^yÉÙYÑu\³+®Qy£Ö}Áj÷}‘Üj…¥Ãýª:íÏÔé+ˆ~zS¥>õ©hUAyÖœ5œÀÙéÒ°àê †ªš‹O]íju8 }`æºf(Ƀ¨^QÒ@·{VbÖiï‚àuøoðA|郄}À) ŠÉ˜(à™,'7@㎛¼D ÛSj=¢'«ÕÃ2Œõyýxä¿äÒñØ1øÏdð­M²NU©Á±cKìMmË’Jžé€ûÔ¬¬ÚËI²vèͨÉjN€{hrfšÍUþrÃ/sw–N }óÕ3Ñm÷ïC¿~ju¹ilΓ¯Tç»^0h¢ó*ußp‰ÑÊ ¾¿1Ì?½‚2Ñ«n3 ÷¨N„±Ãª¸p;?ð¾ñúé…ˆRº8/ö¸g£w¾ƒYü ì·Ÿ-@ƒ=Ne5=nAå-õY ë> ›<늾£ÂÀ`ïLåæÉ +kÓŒ9—9“÷!fÞ3àî#$ïvJo·×DàSœâ øùÓàóK5Oxˆjãß-ˆV1£.†›Ç€3¤šñ[D'¶¾Í'xÇB‚‰qC\„¤–U}€‹‰eòGo:®¤üfnR%kKa+€éðÐãv¨L³±¶¾Œ·ž]üL}…ÅL lEâ4Yõ—¼ây™H€à*‚ òïÛ^sÍZ³ÍáuOT0º¸™*ÖTKì9@½h›C'z¾¹Z˜Þô®$9ª¼¾ÿB þ·SгºªÚÏíK.$0CþT„×\WO”ìŠgsÅ£¿¥ÊúXVÑøØÂõW ^mhVGrMó(NϘgï±mô áɤŽQ$ ÎÝŽÂ_Vä"rÓ8HpǤëøiÈ3¿œ2Eºaœ.V#¶ï§‚6¾ž8 1>&xï1™å˜p|Šo;%ùÊS6OÓ©[ö—,7d?NœKóãMc9ˆ¥¡¦§l¼f®T4ÅÂÐvÐ'(ôž >zLpíè^^>®„-Õ®†ÐÓtÀÓ—u¼²|Pé§îëBßÛuq×9].& ÈÎÞ–¯>ÞÝ.±òá§C“0p/`wõ‚Q©F/¾}„³G?ñ·F6-¯iÿåfhäç¡2åt}s´.ËŒ”3ß\qs&\¸=Ñ—Q¢ ®L‡†_{¸p×.Üâ¦ÍjšÅ¾ªó—ŠFß"¢DlÖë¢ a,¼›÷= %¼ òƒ*ºÿ3!Èß×w¤¡5©ží_Ü–! F`ùp×ú–ÔT3ÿ‘xš þçé?…¬éõ endstream endobj 1662 0 obj << /Length 1681 /Filter /FlateDecode >> stream xÚÝXKÛ6¾ï¯ðQ"ZÔ[6@Sô‰Šboîh‹¶™È’JÑk{}gHÊ’½’½Û¤ZÁÒÔp8óÍÌÇ!éăt’y“$H¦“åöÎÓ³r=1ƒ?~º£VÎA·'ùñánöcM¨G2/£“‡U_ÕC>™;ßoX­¸œºA8éû©†‘ó‘5ÜÌl«©ë§N¾+x£$¢‰“%ÓLJ_ï~x8íùþ+ DÉ—ÆÆiHh %g…1æ‰;þ§y5Sœ õ;ó‰êB,…2¿j&¤ùþl¿‹Ò~*ï½wæ“äSêÕ¡³Ú=?ß»”Stîµ(!ñÄ¥¡Qk”Úɲ1:Õ†ÛEgŽÌµærHßÖŒ- œÃàÁ4Š„Áì\­Æµ¬Ç´„SãËŽ÷Ïä8l3Zål|˜‰_D¬)ªz$bÐÁäEŒ:¡6@±×Ĉ~½ ÜÐuðïÁ~ø»"ùàVÞ¹4!^”ßD9{Ôüqþ–¾Óðõ–›I„¡íEúLœªh…<ÒœGpô¬(s±ävÜԓ˪DB†ÁN‰§©Á?(¹ã./¸Þ8q”™íYÒœLï…բˉ©1qœÅ—g'"`ÒN*ÁŠf·E”º//H,­@«îå+ìÑœòÅlqÉ=LJ†@ÇS“}ß{„×J燯Ȩ{ùó¸{gb½Ñ‰ÄóaLƒiøLƒ/ÅtQUEKYKظåz ÑN¶QR,Õý Àߌ,hË2Øo„xÒ˜žéöÏ*Ùo8„HŽkÆàæÏ§aBÓ‚[`tÞŒkbsañøpo£3ÿôxÕº N­{ÐÕ *±>#*Å]¯º¬ÿ׸¬­Ë&ü×ü7Þžü¿åþk“ïtJîJñ—éGÇ*Ùö7¯O6ÀÜ ‘È7PµÜŒ›JêêÃñÒ ýx¤´ôêÜP=‚‡’e¥ŒV8^t3QŽéMÆð6Œ<YÆžQRõÂjo8 d6î+ŽÓ4lW™Ú‚âm½ægÇU‹wηŽýðZÓ nõycÓ ¥;0ºPz{¹¸ip;¢K**ø¡’9—¦÷j{«6Ú™À¶ÿè’aX—ÜiO±¬Ö’Õ±lóÍž224É,¼Ö4±qôX™£¾øZDÞG¬ ~Ž_7÷:éÿÂÔŸÐaì÷ (‰ÃØx˜’ÈHR/ì‹ÎÝ(ö‘¬¸¬«‚©A~ÆJËõícÀÃF 7Äݽ*d‡°ã’-ïK=÷äÊ5Ç‚Î"çg.·Bµ¿Ðm-Õ(2©ùÐÄ.ÄÒ~ú.[õF1˜kR¦“^2LLgÑwÍq[«J]?‰Xco›E±ƒ<`¶³` ÍflŸ¶8ª‘-®\azPSšãÂêÙFmHã+!]ójË•<^‹gÖ§ŸeýwÄÁ‹½JA0õç…á==þ}# Q×úâ‚HxžóËÓ4‚“¥È…]\Ë W<‰œÛ ˜ÕÄ ´é.)0Õpeºcu'ô¬¬àRSšóš(½ChºgÁ²ØåÈ×ÃA ©SC8^¡v“# b)h ½˜0«óUÆ7æ€|/øÝÐ -u8Ü 2ç7Q~6jUeÿê ƒ=—»¶ªlÊã·U%‡în£·h?Ì®¦†‘èåÁTO0i¶ê]8íùÒç'>I&¾ç‘Ô_ë3²nOxàµï\¡vq£TݼŸÍX[Ϥ©vrÉ‘5'¢šg|nÈFm‹±JGà\šêýÏú«²Í pÖ7I /“6ÅÛ>/Font << /R11 1673 0 R /R9 1675 0 R >> >> /Length 3565 /Filter /FlateDecode >> stream xœÝ[;e· îï¯8¥`hñ%‰m€À@&ÎvAŠ`‚xxŠ$…ÿ~@=©³37ëvábçð~‡âGR%ÿûJ€WòÿÆ¿¯o~*×Ïÿ}˜æë×^|àõ¯Gº~|T«—PAÈùz{ V„-øåñ—˜‰]¿>$3¨”¿Ko˜ JTz—8 Y+ Æ¡oGm³)‘8sÁÓÎ`BÀz½íWˆ¥c¤dˆ‚ˆ1b(3Ó_ˆaKÐ1Ë•88v š ZŒ~ú1  CmCNI)µë̵šÔ’" hMAÄL[ffGÝD7s{“ºKbø7ê.‰áºIÎð·líñܯ4·Gü6zûöþÒM²"`NAÈŠ€9++ž˜é Ÿq…Œ1ôSƒA9Cµ5$•«‚º¦$¢ P AÀ02EMKr 2©6ãašœiÍ¥@ŠÓbÞŸ }—Ób¡î’8-öÀ§ N‹gÆ9 ANz±ÔJ×ÛC¡_L…=v-ئ@.Û(C(¥(f¦F¨®<€j&ÈÇ€¦Éä@™¨Ë ¤z J%ÈÈ…ªÅo#"'k‰³uIÊÀvCUkIP5Ÿ#"ù´Œ‘)ƒàé®{¥ßaèó(A ¬Ú»Ó|§Ê)ˆÓ|cNAœæs ö4ÿؼ[Õ"ªžDRÚÔ-Ú+•ÜW}‚W9PÌÜüQX]” щb!À|販Üt¡‚pDaf`9Q¹d8,$nÆ&(‡ñ¥&È7ã3Z úFå\ZòºªÆW.-¥"J3A9ŒÏ˜ ŸÆ3ƒcA`¼jjsd£ˆ Øi<§Üct¡@æEœÁ'xÐUr½éÂ)ÏI ˜Þ¢ØK”P¦à\トß%qmÞ¨»$ÔÁ§#ï—¢€….ö g­þ-õ¢J:¦lN€Nq¡JN(ÏS”ˆRK Š Q²;n£%ƒò‰"ÆÖOl”×VÕ•2z‚oµ5,bF)Ùþh3þƒ8ܱ7AÏñ” iÝ$«Ê<3LI &Qß’h#Ã^•é"ËÈqкž_{ͨ¤¾Ü/ó±à/LIª^€–‚j dÐ?L¿/Çë7 ¯Ïm(z1 +Ôûâ!©5Í^»(¨ †“·$ý¹$a›‚T–8±¶ŒZ.℠Ŷ‹Ì2`Y.ZËEKÒ9.Ýk„é¢eÂü}8_?)tq"òªºÙ/ÉA_*d=PCr8rT ©äNÞ>(9 ~—%g¡î’Xržœ ¦Tj_òÿóó#3AR /-‰º§Ë•SöâKÊæ3- \t=¿>TÄ×ÅÀ Ùp½¿žÇ¯-Qô5v*R_×ãùõ1M‚msÿÎáõñÏ0±¿M†ž¶ÛŽÚ–íÀŒ«xжEC $>P9{†”Xö|Ú¨ÄPPrbo\BŠMÉðR)¾¢O_!I/YË™H¨­ZMVó—†ù¼¸nI÷ÆÒ0¼µÆXî\VLIJ{h¸ñðŒùv¹}nËý´dÆwáb| X=PŒÀ·,ð*G\Ð\²—7ûÚû~¼co‚c½ß ›d¯÷Ö{N¥­‹ !P>Y0g >PbpQ±Ömùní@Mõ›À”Œì 6õ3€™=ký_ùÕö3Tb’˜ÆóŠý–ôìXFö¬1V~-+&bÙ=4ÜxøÜùv¹µÊJ…ãËɨ5n!¾œ’Ÿ˜DRjy³À4Á©*3ÔrS5ÔïDž’ጶ•òNq8kõAËœ’íR´I wÎçíÎ%éÎX†³ÖËËŠ…˜vO 'O•o—Ûç÷;׌Gc7$Gc·PwIlìè&8+Ûj ü´‘c[€ÆÙËûÑlÔh "jµ5Ú‚ˆZmÇ2pKrvïÌþ&ºSW4žw‹5“Ãx?÷B‹•C]-z e·XóyµXS°-ìïß9x®~›¼Žv`Åu¶1®«¨Þ¨ÑlÐhÐì6v/IwÅêk†«Vç³|¹z£‰˜$¦†õ<©nIwÆÔ05ÇØÞœV,IJrh¸ñ8:ÇoŽÛ縡}V}fö0½óŠˆ/º½]OA8e˜SN™æì~ðc«B?ˆæ…í"?XÔ¦«ÂÄç‹(¡PÊÔ:b"n­aÒyVA¬ >ûµÙE$âSÏÖä"R‚V¦ÉÏÉšÇÝòz•ÞÒ&$?Ý$ªÔ:šaTëy¸ëHÌÛ´ â 'öÐL›üÈXÆ‹Xæç|QóS÷E,—ÔÖÂM,×aø –ý&›ø&VRõCâE¬`ñ ¼E¬øÉàA¬(vƒXÉ¥'E'V´çÈ&Æ©Ž1&1N5uI#ÆÉr´cÄ5cäax'Æèw=›£ ³'1FU¿m™Ä³øÝù$ÆXrë01F«Í­ƒJÏäFŒ)õÄ3µŸ—kÆMÁûGH~—ľºK _ù„nä©u{^qI€ÔF0ö(,ùÂŒØnCMA¼peNÞ£‰ß ¸]™Ð—¾×‡·`¹¿¡ þÍ@TNèGý‰ʲàõ!ì;·»ˆ/J"Ô—M?B'¼DXýYÅ‹èëC Aö¢è n-—X†Úß6¦0Êúazëÿò¯[…7·Œˆ7QÛÜ CŠÜª§onÕ€onÆmýßÔ,ƒ .jš„hQS¤ÞÆ-jÊØZŠIMÕï³ë¢¦šÁ²Ô*¿ØÚÌ*V?Â̪”fggVsdU utcUKѲXÕŠÀT­ê÷8!bÕW7ù e)Aö˜/Z†>&-éy5h™(PËŠ@ËW‘rð*4D̼Êë¢eÎȱ¨™7T!`Þäh’EÍ$/3›šFôAͤöOjj=á7µRÁŒ5ôºÇ¸Qö}9©!eƒRî'Dƒ’ß`ââÖî§#5dJ¾ÔI ìy†Lµ5‹2ì !÷Žo2C–â7B›r.@º™±aëE&3?9Q>™1õÓ³ÍÌ «´™±/a˜åÚì ÔŠµnhQ«ì5k1«¥µ¬™¡/›šåÖ^MjÒfåâ%”Ý—“–h»¦_´|רgÀFÛ³ë(Ç´y·g %þ„ž)`NAè™æ¬žé‰U¡g M\y|‘s¼fOµ_¾NrÓóT’µÝ?þFÉ3ÍhÔ¢=_#ù ͟ùeðQÑvët}•äÔóT²ùÿÉ3ÍYÚ½Y°çk$_¡¹Ý¿6+$%jóféú*ÉMÏSÉâÿ›$Ï4·¡hÎÿ|…Ú¶]Ÿ{¹DÕküÛ–x7é5Ý{]d¯|ÒÖ”qŒ4Ÿ_…´U !X CÁzC¼>¦¤ ƒ(_CA6ÒºF˜Ï¯iÔL§‚;‹q‹õåwHOèIÿêÅ£Ó™þæMÒϦ¬·GDÚ»$¢ªÜÀPSG,ɼ¼Ý¿<U°ýüº QÈï-û¾Êß!êáUõ¬÷æÞ{Àl|ëKIÛÑïëD­N±ð츶5˜Ø“¯} ç—ÛÒ€¶½=ŠŸ:x}c“ydSLÛW#HF¤}m"`Ùß«yÞwW1`‘ÞL(ŽN±xø¥vÿúzm¼¢¤PU¯lTJ¾‘ލ.9QZâ…›Ù oI ~4뛯lòÝrn%É÷O…œY©0Ñ%î¶Z®* µà¥~IXèò¶Û7«~¬P³ç¼ùyW–K|”óefm—è; / è¿äK’µO¢}½õ31»ÚfÇ·m~v\ÜŠÜw¨È E–Uí”™}nú)¡`[9’ï£$•¾™'ñÍm°Ê?Öþùñï¶ÿ#æÿ¼¾]¿ÿôøá'»ÁTéúôÏ1Mñ*ÀÍmBì̧·Ç_¿Ãï_P¤–ïèû‚ÊEõoŸþøß^&º>ýéñéwýŽ'Jî¨ìås t¢ò3]e¢êòŸìûd3t»Æß¥þgVr܋ߧT¯—¥÷Gà 5J_j¡C‹^áw_‘ã•v6c6i„·uýé¸~BŒÞI µ óåŸxU•|½Ä¿ÆœüXË#­P{lþþ=Aª¹ÖÔš"’«ðWrýãõùÙe² EÚtjí=­ézÁËó…(û.<ù4¯-ï¾÷±1Û?+Ë¿ö—l‡Ò”ßWú±ã‚ßÈÌkB­ò®ãÞ þa´ÔËl̓ö|æ¶#ëßfªçzÌ62OçÅøôøóãÏÿ„Å t endstream endobj 1676 0 obj << /Filter /FlateDecode /Length 162 >> stream xœ]1à EwNáÒ%Ê’.ZUm/@Œ‰b!Co_A’lÉþÿËÏr¯#û ò‘¾(ƒól­aKH0ÑìYè¬Ç|Lµãb¢ÃÍÄ÷'4`ÉíóÝ,$ŸúR7zÏ`°´Fƒ” Ï$:¥úι^Û?éLîp¶º¯¥T««ÿTJ´0œ'·”ˆs­ À3ý~‰!–[ññRû endstream endobj 1677 0 obj << /Filter /FlateDecode /Length 221 >> stream xœ]=nÃ0 …wB7ð“™0¸$K†EÛ 8xˆ,(ÎÐÛ¤“>Ÿ¤¯9žOç<-¾ù¨sü’ÅSNUîó£Fñ¹NÙ…Ö§).O³3Þ†âšãÛP¾ŠøÖ'WnÒ|†Înš‰s’{¢Ô!_Åõ÷ãÈNrú÷°&.ãó+ €À®§À@Aµe V•؈T7l´QݲÐVuÇ@;Õ=íU;6êTlt°¹_ê ÚÅkuµJ^¬0+D‹˜²üuZæ¢)/9¹_Wön° endstream endobj 1680 0 obj << /Length 1284 /Filter /FlateDecode >> stream xÚ­WMoã6½çWø(±VÔ‡%¥È%‹f±Z]ßÜ=Ð2mK‹*I%M}gHJ–+ëmL GÙ7o†#2‹áGfU<+Ò4ª²rVnb+U»™[üñé†x½9(ÎGšË›y>#qTÅ™-·cSËÍl|ÜÓÖ0ÎÓ4 Ê»pžeyð@5s’ƒ çIl:Á4¬ŠœAU†_—¿Üü¼ÎÍ“äJQó•‡e2#Y”f‹Ä{¸(³ˆ¤™ó°ŒìyIœõVó|‘ÚP£Ýþi €©"’ø8—{Ž”d’ðC+Ø!œ“€5!ì¯HÝß'Ü¡]H+Íiã6m6òàÖöÅî&E°Fœ„4)“`Ǧ¨‘ÊÛl6#ãIPK!Xm¸ô6åÖýcX\^ÛØl0iDr‹’á Ó·.G¼©E·áÍÎðð²*¼‘;E—B•Ìz6ù¾`TýWG»ö*ˆœø4•àvžEE^õ™¬ÞÈdK ±ùdfžŸEŸL¸d‰¼êý.µùR+ÞšË$Y.U»¼³o»4‚ØaϼX³'<.œ –Ö'm¸wËíy‹'ù%.>OË „¿Oø› —=È$~åUߘºä4?g [™nï±FjNÿ‡mp'¼wz[,£'^”{íä[”Ñf'0æy'à sÛ­Ìy _mž@Zn·P¼Jbq>ñu 4Öèý‹[+¨Ý^þu~‘Gp4ô±´ÌŽG‡æIîãƒ?QñgœÇ°vÍ=¹u«-T¤×ÞzÑZJáVJB`›û-šòÓDÒÆ^<ïyqíÁó*jŸ£cÆÏ‹”š‰¦€ïË–ÛÄÁ[þ;§'­m§­=sÀ)]VA×p`ÂA¼8£º¥5sKÞ»üæyÁbû"Uµ`ÍÎø©–C°4{v¡Y"³|£”-–â¥çˆEØ%ù”þú³tû6üñžpL©±ÖQÁ„ØÞwˆx[ªX~U–¦h¹Ÿ@/©¾<'Zì#‘4Ã^+KwÛp¾bˆ1ÖÑÎo’#iÜÃ@L|¨í‹u_±øÐiDWFz=Ùh£ºÚ¸Ç†=‡ƒîTí[%íŸûxÇ5 €õÓD«Ø¨L²¦GÝ’Iß]Q_£ZÁ{ñ›}ž¨+Ũ/" mè>öâ–råÅH·A~T·ùF9FSQºHOƒ9šÛ­fæhòî÷u§k H†ª…ÉÌ›©æHë5U×…Š}d–fI%9eE7¼Ó ;güB¼hbË…0/mßÚüÓýoò–¯]Ë'vÖæÀ^ÓbJj} ­ô‡Ið*ÙçpYx_À¸±aïCë)ú¾sHç=j^&QFªÓÃZ/˜_äÙë¨fpR‘æþ Fó+xá®9Xp]ÉkÛ~l_µ¥‹ýí|ÁÖñÙßÊ¿N7Ûàö’Óþæ? ‡ÿÙâjžÅEðÑVÿUŸˆùSöµé‘½‚ Ùt…_VÙvp»:¿D=qèÚæD“çû7NV–ÁðÍá×cæG5h÷ìoŠƒâù×b’ä À³¢Š’8ýÎc¯µ`|¢Ãìá‡Îa¦èú›ÒMÙøòñû®é_v²; endstream endobj 1568 0 obj << /Type /ObjStm /N 100 /First 982 /Length 3678 /Filter /FlateDecode >> stream xÚí[ksÛȱý®_o±«îb0oLj+U²-;N¼‘¯-'Þµ])ˆ‘ˆ@‚ €z쯿§g@ %‹”6»É-W™ÐÌ »çtO÷¼Z&YµQ‰âøkQᎠ"ÜÒ—­¨E'R­•‰R9òÄdØ&¶§Ë3³'´NrEÌ 9‘æY✠™Ë@kГDÁM BIò@¦®tháÔ/ñ[—ï¡ lŽH´ã€)ðÐ…È£äÂK•A´Ú™DÈÈ ¡uáX8“?õ£x{h!<&Ó‰°$Åd°I.` C=æÐÈ Å‘é ¬%3-¨KeŽè¸L$‡‰ƒ2 2Y;N}€C‘VdE™gA O¤3ƒ†D„’I”ȃ¼¦W$#¡LF¶2Ê’ùŒ„Yä‰ÖœôY¢sEH¥¤½•%Cò¤EÉRÒ% %,PÆHNX”HŒ¢±7J¢l TbH(J:1ÖRj“,o\8 JÁ.0‰Í$ñê,±œÆÝ@¨4P1+,¬ 6 RÁú¥ö0 (Ðà&-H½$,hÓ‰Íyoë,©ÝÐD á¹ %Ÿ¤±D[§ŒÐ\â2NC‹;'T Çáž#ŒJv4'ƒ-á×NIêŠúãY0u#Èô(BºÈƒ3u¡ªF'ˆ .3ZÉÓE°Š>RZÒÅ Þ{ ¨$øˆ “¹ ÛiÔ"PæäÖÐI6m¾÷ý÷{ìEò ¶Öˆîw ûøãOÐ4A¤=Í—UõeïO „/ëy—|ÿ}Â^”Ð<0¼Ô1}™bÖ„2XØÛ¦½÷]ò)ao_¼LØ‘¿è’µ´£Ë…Ç‹bâ÷ØsHöó®¥çÄ¿ÇÞù¶^6#߯™%´ýàÇeñ¬¾H>eh0ˆëÄtT4à&Bû‚b6»¦˜E8ì¤ÔÃ1›ŠÀ¢;)ÂöçóÒ>ÅÉ”ð„É” 7ú”{ìYÝŒ}åf_¨÷pKaS§Â¥BO“ÈPÍûåqd¼)ç§Ìñ>aÞ½Ž'Ó®[´dlRvÓåq:ªgì ‚ëfÒ‹i9jYÑ^Î]ÝyV¶íÒ·OÉpÛ¤yžë4§èÉyJ¡þà‹~¢¿î'·a‚H–ƒ{ E–§4SnáyW!t=´tXby_Ü#Ôãü3¿%Ðì#-϶0à "LŠ)¦îmìr¥ñ]S{ɱ `õîkŠ6 «Wa«°â‘´Éi?—mÚ/Ïß¹îã;7}Á‰U‹Ý9â9ÏSlŒI%V©DŠ=A"m¨oS©YÙ4u“Žºbž"žX»\,ê¦cUÑù‹Ù)Û1Ð…ä©Â^ ‹WJ>š‰€ˆÊ;EzSœ§1Ú—­oFqX¾ø>ØÁÆõh½í>II‰uK¨ÐYJ›©Bý?:6Ž˜T m†SEá“g©Ãþ’&&ÔwÂ~~ž.|SwؘGs·Í4à²(ßê¿Âríôf8;¹e8;»1:õûì;Lv˼äòG(â~/EÔ†"t°z¨"tPûM9˜êq9Ÿ ÛòäÄaÿä•Íh9;©üÅv,:cÝy õ˜ÿyYT‰³¬Àé˜p2F;Á_Ŧ¬Ä_ËNYÅflŽUO±†Ö>Ö±%ŽÛ²;£Ùþ–ºp¶œ—õœ•­¦ÅƒÊ–öl{8ìYb-ûÇ0ö‘®Øl…¸`'%6’lVŒšzŽó2ûy‰ù´)'Óçc†IwV°éåbêç sZYq0fõÜ'š³nÚx·³/h+(ÜúYJ ÁÃi–½`8¬²WìÏì5Žšì \‘&¹`ï’\±£ˆ†Ž³Ó¸±ÉÍQc5[°ŸYÃZ5vÆÎÙ»\« ¿/G˜×Ÿ,Æ'GþãwXE3ì=Ÿb ±ì¦5^ xTv•%Ìæÿ¢‰ŸÊÏ_tDñ¦grŽ¥'ʾiü ^ÿÕ_žcÍh¯h1–/°Î$O^üQdXép(çR«L|—Ù?dÙ@÷C=¾äËØÂBEÕ"²ß|L_"àŽ‹ùœ49š–m‚Q£ÿIþO*i”R®hóc´üN¤f¥jòù ÁSžù„úüü49]Ý´õErÖ³šT¥üéuß °,oÔÈìeÓvϧEì±7ź‚wÿ(ǯIÂlsT˜cÔÇžÚâÄľðí¨)d\]?]=+Z¦Îu?[­Ü3Þé æ¥í} a6D˜ß‚Ð݊Э¤k€.Ï6ðñìøÌUÖðd¶ OòÛ H“ø ¹i@.wèø C€ò€ê®æ›#|‹õ#G˜*Wõ-Íí3ç6rµ ÐîPgwº ´· Ìï0aïþC„⺌±ޱt›Uv;@±iB™É €‚¯~J4Ÿ~9ö¦ôt!î\*•»ÔÜù´ð3%õšÎfekøš"Ï%ÎpÎ zÚƒl»â Þ®JW›û¼ö²¯Þ Ì‘y®ÐЯÇm¤Çgl!-“Tú) TçR‘ÐÈX“§2PI-ѦamâÄ[ÎA™»À%Wò"g/[àPlßË&*üx–™uEÓ‰g ðõÒUÄÄá¸* ‡‘Z¯†VspT'ÓŽ5U|·‚ËWï"ÜXÏ/ð£XÉ6ɲTC0,!YK’XKVÍa xtZ‘rÌaÑ*¶OŽ5îÁQÆdKe«!Ï*M-™ ®-õC7ÝÚ4‡~H6yšÆˆðÄ ýº'ŧ³¤~|*žŠ~0„J`©ÆÒ̓Ò2xŸ^‘‘©ÅÔ™F:sàŽ£5×&¥TƒÂS¡g‹]ÉR’tQ*輂¼5iª,ù•Á€@:$(2cnúÙÄÆg0¯ÓÑÎÀK¾=ÿÓŸ4XJçT¸¾~õöMòjZ·]œ·ï)yÔ}Û×ìþíë€d½kÞ_ÝÂ`cšé›Ëƒ‹îÕû¢°4í''a§»±e ^~?^¾=ÞGÃÙm÷ÿhóÝq) òÍKe~) ìã/>ÆÃ‘½ž…´oö¸,˜ÑrSMÍwSsp¹lâ>õŽäkWw¦0ñZ~h’w*Ìì.s˜¡Eš‡,ÒúÆðU}T'°î“±?¡Cæøs¦²qSœcïtóºÐÄ#Òׯ D„=hj¿ŸPcåþ~Be±T±!V¶ §°Gd{®_oR–ŸóʹƃÝk•~º—Éá^}î‚2ë±`ԪŮZÖ4ùªàvNkJ…[lŽs¤æØXØp‰êN—Øë»õ4Zà¤n&>-kV³M§Ý¬Ú5³]¥ð±‰q1¯Áw»[÷ÇiÑŒ¦å™×ë¨3L±Ç1?.%ëó2á¾\4å̧' ;)+?ÌL|=ó]sÉvÏqpøy÷¥´ ·1!‹ú—1ÿÅiªU Ê¿³3¬ÂôjÕ‚&-çc‘¦‡8 ™Âž9“a§…Þ¡þÿOW%°ñLJ-ú~I9“f†'.T `RT•ú“ªÆfh>—íiÚžMvEÚCë‘öSÕ¿(¨7ÖØÕW_]>oIœ­Ð÷ ƒåšÝKÈ…N{Ä'E×WÅGfc¤`í¢yæ/FU1‹yñqÅæËÙ1Ý&Oæl\WUÑP^`„•3”Úb>ŽÄ-„Vž-hY¬üIK!µ€1£$C{ÊÕ²½-ËÀÚªh§ìßÔ”m 4Ï Ý€:ó¬-/XëÏÀãƒÐy ÂY†øjcvˆMhËí ó-íâYÑQ…=§{3ì/ì¯ì ûý²·ìÙ;öž±ìïìì#û‘ýÄŽ›btê» Ó1ŠjߺÒoT–1›Å–è¦Õ "¿)€{#ÏÁþõõ,û%H÷}M¬ zêÊjìÙ1Çwì` ›õå«8.ZO‘ДóõX†6_Uå¢-[6.&X'þ¡‘¾ÊÆÑ tÓz÷ý¨h`¼É²¬‚ä€êð`ÕåOñu_â„Wù¥5Œ«vT⫞ÍÏÇdZ? ¢–]SŒý¬hNY{Hd­×†ø%¾ÿq\«IáCëó9 nK®ˆMÍ„– yÿ%»„K7õ©Ÿ“±ûì[‹Ջ˾¯f|O ŽG0*?«£_Tõ¤æ¿•_7~RRW~ÜgÛØØOÈ¡) q'o—Áÿ›èìëZ1Zbá˜-)†ŠðýC'¤A9®ÑHÁ²æ¼ücY]Ã×CŸSP4(N‹ê$vÙ7¶ë( †Úž»qìî/}MZëÐ O3“ä¡öë^À¬Bä·D=ªF'SgÜ¿äm7Dv‹¶DDqÐÿY¼—PÓ—Vÿ6Ÿÿe‡w! endstream endobj 1686 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./markers2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1687 0 R /BBox [0 0 283.46 187.57] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1688 0 R >>/Font << /R11 1690 0 R /R9 1692 0 R >> >> /Length 1250 /Filter /FlateDecode >> stream xœÍV9o]U¦¾%¿`ʸð0ûR²FJGp¨ŒÙPäï£9çù=Ûq%²ä§™;ç›}ùhþN¿·÷Ç7o>ü}vW|:Þ ‚×Gº¢¸« ·Áý!,váÜ¿¼ ÅÉ^ÀN…YKJ ÕàÓg/K_ìù=9ŒŸØðet)NtÕF’-ÜØ­Ÿ>ƒúøˆ1/ÓÐÝX20zœ ¢Í1CSàð@6`G‡s 6y{pšaÕå{ ÙC÷|ÓD-¸}€Ø·¯NuL!E*YqA PTàJFO°lI6tpvÌêFûëÃÁ)™À˜±ÑŒŸÃ°Ç‘tÁ.ÆÛ2¶)Ë#2Ô¡Âð€»IØÅÄkÈÄ„s€˜¹Aº×j•L36A²‘«¶6AfP™Ln¡iÑL9­ÁsžvRK/ýZеFIe£.‹ ³Š £L¥¶ÿ}{ø¼f4Î^×’‰Ðý‘ØZ`í+Þë’™1¿gkÜ©ú[#¬—TQoÙè<¥SXf`-KÉH¹6šÈZº#e&èi Â3ì–ï4%N+…&¼1%ѵ!BaéX÷‡…®°©;ªl©w@0#’~‚ߟõW -@Á‰ûügOC·ÓãýæáŒXÙƒ—sB´cÕ¼$Æ>‚t–¤ƒ•£eÂÝ!û  Bæ]Îü°Í„µ°mfŠÖx y÷Ÿ ŸãÜï‚ÇŸ¯µ§ŸÛ{øîæøæmô»ÀÍû“; aH3 §toîw¯¾½b”÷ßnÞl뀻f¤ìh¸ùýx÷ê»+B ]"×6y¤ð:²Käû«kÁçX"Ž×‰W?\Ý|<$uúC»öËŸ®C“m½üñæøùr~ý‹s‰=ðÈ9Žš= ÌÝÛ·¯¯ •EùŒ}>3¾„Íü"¸òTˆÏ!D§À}u5sCjþܨéVš °œ|ÉŽG»üß]ý<<3^ÖFµùõ¯«ë9e'iéøùø¨ˆy endstream endobj 1694 0 obj << /Filter /FlateDecode /Length 160 >> stream xœ]1à EwNáXºDYÒ%C«*íˆ1C "dèí+HRUlÉþÿËϲ®û ò‘>)ƒól­aKH0ÑìY( Öc>¦Úq1QÈþfâë 4Xrû|7 ÉQ]êFí –Öh’á™DÛ4]ë\'ˆíŸt&÷ã,¥µÒÕ*%ZΓ€[JĹ‚Và™¾¿ÄK ˆ­øìfRí endstream endobj 1695 0 obj << /Filter /FlateDecode /Length 207 >> stream xœ]1nÃ0 EwB70%n \’%C‚¢éd‰24DgÈíÑu†À—øA~v‡Óñ”Óª»ïºø+¯:¦*ß—Gõ¬'žSVÆêüú§¤ú›+ª;œ]ù}ÖVŽ›¾¸w?æK^ÌæñKà{qž«Ë3«€ÆIqÿ¾>6Ã÷Î@ýÔ“%úé“Ôˆ†4MZÐ6Ù“€Í‹Hb“ 8È&û̶TK·‡ÑþQ+çUN [´”ù}¥²”æÒœƒzÜf endstream endobj 1698 0 obj << /Length 518 /Filter /FlateDecode >> stream xÚSÁŽ›0½ç+¬=c0[qشݪUÛU+niÞàM¬‚¡¶Û¿¯ÁN MÔT\†yÏïÍŒÇ óa"Óˆmµ@cVï€ ¾¾[`Ç 1˜1×ùbuO)À¦(Å šKåØx¯÷¼é„öBˆÇný Ѝ·æ­°™ªöƒyE_ŠÖD ʼn—¦þ÷üÃâm~ô¥aøïN%CÄ@Q£” üÕû*¤àM½ø2ÑÉ+­`4aH e‰í'ßËö¬t›àe[Qä5ºö ô, áÈܺî;{R ûÿT»ÉT\ÿjçÈÊ¢\팶™Åê>&óÊ6#íîa,`m§µoм[‡Äs$À¶+3 ȆÔÐÕs- ßÌ„Ž…Œ¾ßEÜv½1?Ù¶×Z¨Îå—øÈEéÂìæf9¸F£¹L ¦ÖDªÎ²T†ÝQ-¸;©y!û6Cg@Ûð­òƒ*r‚®ì†KmYwîÜ”y8ˬ]†k]ÿzäzö—}®•¸l!”Ó96/Ôò8«TóØè|ƒS-+5ŒVèiÌBgª¶6~uéƒÃç·ÅÝRɲìÛNóNva¤²@·w+)^xÕØš¿§0L!‹R¤0DäÊ›?ƒ‰mËÉZý%9k¸ Ïì ã8þO{G¾b*9ÚCÞþ¾ø6> stream xÚ•VÛnÛ8}÷Wy’J!©{~ém±»H.Œ}I÷–èZˆ.^‰jÖýúÎhYvì4Eàx8:3<‡šZ8þ„“q' ? S'¯|ôv_2þþ}!,Π7C¾]/n?F‘#¸ŸñL8ëí<ÕºpîÝw;µ7º[zA¸é›¥†‘ûVõšÂ0å3-©tDèa,­–0}\ ”Ô‰Ý~<œãî½(–n­öôôô@àÄDæ iÏc½+Qh*ŽÒ—­4ùòN+£-@ÑWoº!7dïU§j çY~׺¸»YÊÄ=mv6YBæÃ~Üà)]o—yù…‹ð)¼l¦]ÊækoÄs÷#àA.É£‡ª)®Er÷›ª}1Öeè(ðE$èˆà ÷À… ä•èC«Ð5-y¿-£ÈÅ´=­K³#Kp›ÌÅ¢·Ð[5TæÍ%®H"òãÀ¾ìm×ÖK(’é|áÿKVtHŒüÿàþ«²1ðTKå¹îû)ì·'u2ö~TG€»•ÍüžX­<™Nƒ,›;_bo¾ß0yOî¥nXð%ÎaÅ ¯Â»Òh„ÝùUÛ> {›~1èptÞg(6ñÓ$™úL¾Ðg¦ÓúÕv6cÈQÖûJ׺ÁÎ1¤úÖÿ+|JõÒngE¸Å¡Qu™Ó³ t~w°§U—c­Ú:D–þëÄ/ˆ…]`‹_’,3y*9êCcCC€C?ް°±ð»èŠx¤ÕSê6¥éF­cŽ£ô1ÙY¼MW6y5º?MS6ûÁÙµƒ)¶m»KµDÓ,‹g“KUèI@NoŸá+B¢%— Ò®9¾ê¹‘.´pÀCWõä*«j€Þ†Ñ[P¶q*"–($SYœÝK!ŒŒ4u$öj(ryZ°7CÓz2‡ÎRŽ'q¬¸Ì3YìóX¼–…EÿŒÆYÒ‘‡¯úË—€{q¤z!·{Í'+t_ÛšGaÇÞ¾ÌÍÐi‚ÁG^œª³>¡Äfutá L²5eÅ¢ñ?~ød,žìäêpƒæxÄ\ÈdcXÞ6…n …V[Uõúùð¾Â­7«qZì&nHI&€FÈ ’²Œ‰ˆ‰€ p &B&&b&R&²×ð“¬7lÔŒ%üޏNÒ^ êoK¼Ò8Bœ‘-ø§)ëï †–w endstream endobj 1706 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./binarytreetest.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1707 0 R /BBox [0 0 289.98 341.64] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1708 0 R >>/Font << /R9 1710 0 R >> >> /Length 3159 /Filter /FlateDecode >> stream xœ­Z1¯$· îõ+¦´‹G‹¤(‰m€À€;{¯3Rm3‚ÛÂI‘¿P#Ršñ3‹+Þ‰K~¢D‘©ùýÈ€G¶óïó•~ø¥_ÿ ¨v‘ã? ŸÿLùø1)VЪ‘(h=^‹ÂÈ tôÆ@ı4¨íè¨@ÒcüL­ ¶ 4BÁ@ˆñœã™%×#ı¬ æø™B…IYJçzÜWðL¿¥GjµA“ƒJfhÇ+5ª€Th||K”¯©õÇê*T1ΞEM´Ññ-5ÀbëQìF¹I}K¿¥¼둚fP¢ƒ*"44¬ TÚV`«µ¬Pø¨Ê@ˆ1~¦Ê T‡¨€„¼Nügšc‘±q!+X´ ž)f¶a¨5ïŠOst4MX óñJ½wàÞê½@–a& ™õ ª4–ÌK;¨Q‡<¶¯!PãƒZa¨<6ô"4-ñ&¤GBR[zØaQÎ}Dn±ËˆÚ lf@, eQ0«B[ò>ôýrÂÜзÝvðÓ1õøÉõr¹›æ§!s‡²[s&0çÚ,È ¤­ýCD.ÛnaÖ“%vô&tZâ]H„¹°ýLZJšŸÎØlcU¨œ+škià¬1~¦®\JPzi ÚÀÇ>Å3-JV<zh5æðñ3M%œ°´>VÉ-ƒ˜b’¡[W®[Tc:­’IO." Á•[ÛVèuìe%èsúØË›Ð4Ë»  ›*ðî N˜çÛBž¬(„-#ÔÝ?jiv‚¡f†® Æá!Nñ£îÃ&þtŸýüéÔÌÅ®š?}9Ûƒt­Ð®¡ [EÓuëžOÂ:Ä­)Ôºô«Ð´Ä›‰8óÑ_‹pîãH–ç>e¦›%e˜:8,Xä¾bì;”¹¥`Ûœ¦ˆùÇoS7—»ê~š‚«yÃ2eÌPñb Â"–÷c ©Á%²f•mKoB§)Þ…ôH”-LG¨š4”s3‹z B†º‡*ì:î)ÁÑE` U>^qdQf¤™‰æ+T¹N ­O€Û"¦{tùc‹TB µ\#U¯zrExé\y&2ô=àÜ„¦¼ ê‘PJƒÅ2Þk£TÔ%ó+H åÀR$†Ï„l·¤²XÐŽxÄøœÂ$&…*Õ#ÅsøL¡ƒ3¸Žp[Åi»ëãñˉJ†®xˆÙ'00)+TÒ»áòQ«‚j=ªJŒŸIzåÅA !mÿwìg²Qée\À]ª0B͸>¶#zÎì×Ìîº{DîÀÔ†‚õ lP½6À^æeÞ6à__“Õ¹•£Ö>n°¯„v%µ:Ñ.¡ßZ8«GC…Þp®2óè½ é‘jg(J±%¯Eqcp¤µ%RËYÍñ35ÇÛ6­`^1žs<“S†a`&t|Q)ÌÙÍÐS3—ºë~EFè!(vÊŠåY: [>8£€ƒ¢UŠ:jžWÊÔ¤ZµÝ)L;A‹æw‰ÓïÁy$a‹Ýms §øá.@´ÄÁ/X¡UÚ\ƒ%ƒòâ »»ÖºÜcŽ7™?äŽàNàs,7q-œâZ†£ÝÖqZ„«ÙP77áÜ@{¹¸ · Üy;ÓÜš¶í siãœÄ)¿ fyÔ#qïP¨Ú4[êu æ"#²@=«%+jÔbßY*c`íN@ÉCÚÇŽ?¢ìIÁ2üÕzÍÐró |øL®€SBå p_Â4Š nE\F@Ë^•ªµ0©Bž6‘¬r`®Ø¢ƒu-FÍŠ vñàa{<ÑŽ¼QnRÓ(oÃz$mDtó§øiWÀ-ut»TÞüÅ oáÅÑJ¬=|¼Î²Sü´;‚{ƒÏ±üŵpŠké÷uœ¦Q”S£ð­°ÈÅ_Æ%ªÔí+õùâH«¦íÔß…NÓ¼ ê‘°ÐXù$(3 ×=’rÆqKt‚d·¨²8°“U9àãûNñÄ ¤ŸÜ~˜z…ÐMó™âÉêh^ÙQÙîS{:A»Y3-ÒŽ6aä$&ë?®³28Ù½‡·„N6eYu#Uéöˆ>ŽÔëOÎ`Ï9~dô˜Û~8Õ ™«ÚÓò%Ÿ“­u˜qåsj\ÍáV¦Æ<Þ—#ïR³7*Üó]jámX¦WéVo~1)q®í½h˕ԊëÍ1¤2l½H̰õ*}¼9ƤÄÁžqîç›gœJÃÔ1n«˜†‘6 ¹¹†õcU¯®!]u?ÒÒeT”q†¥Z;æ7™i—7!=ÕóiuK “â9€¤tÈ‘"¨œ±nõ­[["§Wû®d‰ÏñŠðAñ0"CÌVqV'r*í·Ex¼ê "{!)ö–ºg*Vù\"¿u(¥oqž¬‹+¸å‚»Ô4ËÛ°ÆÓuµ¯Vi¸(gG$ìÅY4¶ C²ÈÁ%~ϵ®²r½z ʬï`Ö1Cˆçüþ³+çâ7õ§I2W{¬ÞÊC²¶—‡”›Ú+æ*éÈ>«ñŽìË޷"ï.5Mò6,{,­ìŠÃ#¼¿‚`=J{ù-»qå±VûùŽéCköQs¶»šËÏáÄ7þ“`w.êGˆ7ìö¡ãϡ՞Sg˜ú¹üU%ýš~O8><æŸçëøË—ôÃ/v¡ãË?Òùñ$M![ä£óùË+ýú|ÿAй‰üíËOé êÁhß }ù{úõ»òýÛ÷†M¾Ë^²/Œµf:Yéò{³`üqa¨ «¼]ÚçX|ÕK¬^»è…†¿~I?¯WÓÿkWìiÄ–ŠMÿÚÐ z±wŒÇG!ÐP±Ü¶®@3í.<¾ Òà±ßŒ'VBQûn¯ŸsO½Ìõ¹>ú?èÓÿÈó}Ú•Ç>“BUãéÅq®Ç¦Û5¦R·{öÍ@þß*c7?Ulã¦ï?°Œ/*wj¹˜O߸ù2c)çÁùøŒ½KóíàŸoïÆ®öÏwzcïdÿ3Ýýê¶ÿåºù¯\yÏ ûOö$_ödxÌÏé¿\Ûr endstream endobj 1711 0 obj << /Filter /FlateDecode /Length 221 >> stream xœ]=nÃ0 …wB7ð“éü—dÉТh{G¢‘Åzû‚tÒ¡Ã'à“ôò5Çó霧Å7uŽ_²øqÊ©Ê}~Ô(þ"×)»Ðú4ÅåivÆÛP\s|Ê÷Oßú$ãêïÃMšÏÐÙMX3qNr/C”:䫸à~ÙINÿžÖÄe|~%°ØõØ(¨¶lÔª‘jÇ@ê† €6ª[6ÚªîØh§ºg ½ê €6÷k@]A»x­îã£VÉ‹f…hS–¿NË\4å%'÷ S^n¬ endstream endobj 1724 0 obj << /Length 749 /Filter /FlateDecode >> stream xÚTKÓ0¼÷Wä˜H›ÔÏ<à¶À"8•8,ÜÆm#òèÆŽ–òëù;}¤U¡ÕªŽ=™{&Æ‚?ìeÈK(2–z«j†úÙvãÙÁ·3ìp!Ãäãb6âÜÃ(ÊP†½Åú”j‘{Ïþ»­ØiÙ!¥ÔOß!cÜJÚ™ª B’úyWJ£áÄÇ¿ŸgaNÈD‡yi1YŒSaʬE‘ç?G»bE¢u¡Íþñƒ ;Æè»ù};{9(âG{Ñ3b$çŸ*’xï›ÙW«ž³ˆ²˜8uÂIÄPlÕSxͰΟ0b§ÀçÇÄÏ[ñª[)-äü¬! œE˜¸£^l eOÕþ2_ØGUT»ÒxÏÕ/sGÿZÔ›‹,ìD§dn±KƒÜ;†­[–D„ØßØ/å82šÀ& ódA’{± èð~%º1i¿o³%-•;`8D2ÍÁ€¾ã`LÚ;ˆ„Ú_ VìôyBJœcQ³Cø"¨ýßýf?½œØ@“!P˜n*¡e¿Ž]’œŒª+ÍÚ.,[QäêÁ<Ä~+K¡‹¦žE[to­‡ù²±<õv¤µjÚÐ좷 ß ÇÖv+Õ®ï_Sç‡JÊ—î( Ï»(ËNéVh¨ž4Ì]ñë+Ý])'M =êaC÷ºéÀá}­šç”ýž~×VÚ17/MÔvà;Úç”ÿÕI’8¥¾“é¡“ñN®å¾®D=¹”$ã§·Œ QhDmÚ§ÛbÙisãÜ8‰¹qÌø‹hµIÖŒrÙ©•yaëÞ˜áºZw¥ÇþºiíäYµÍÄSB-¬o‹(Ħ•rlB]kç¡pÒ5íx#²‹¶]DNPÁy'YD½ùè+‘({“p 6UWuòq6Q€wdT·[f?W¸!ÆíÇ1Ô+™ægßö4¢ì}­e[ÚŒG4£µøŽö9å”/Ï8ú ¾4 endstream endobj 1748 0 obj << /Length 2541 /Filter /FlateDecode >> stream xÚZYÛÈ~÷¯ö‰,Š}ðrà‡uÖ6œÄ›E2 ðúCµ$fxÈ<<žŸª®n Éá¡ ˜ìfuUuw_•†m<øÇ6±· …pcmÒâ•§gëÓ†^þõñ3t; Üõ(ßݽÚðý óÜØ‹ÙæîØguwØ|qþzN.­ª·;!„½Ùî¤ôwI£h¦¨¶;9‡.W ¼… æñí×»¿½zwìs~£†HùBňo˜t… ¸Q1ˆ¤Ë„$#—…(pÿy²OøeçÜ©«®<¨Ã%iÏD5Ü0œ‹]ÆÍ~ïÎn$û[{ož“VåfÚ:»ïZu ²û-'zÿw«ŽIIï/«º6 -Ë®QÇ.§÷cUÓ‹Ö/+O4jÏ _"§9'õ–9¥U]ªÚ°©ŽôÄ-5¯qSzÂe>m"ièv²<ïš¶N´²BH'+郖‚/êGR\rE_ÿð˜ÌA¦_—¡+¹Ü>s#?X¹BK½ë‘“¥ýƒ3ÕšëðW5P!ŽÜ8ˆoUÁP¯©0bªUp“æiÊPà M­qÇ=#Kp—_-2Z°È¤ÌФÍÀšnµGŸù}{¤‰$Ï+´ÇGCP•æC[Ñó¤Àfàò ¹• &jxÚJðÃÀJpâ¹>^g³\8ùè^d€·èoÏs}¾æÝ–z×#Ÿ¸—1S}g¥òâãÀõv«xC½&~ÄtÅ,^•‚åG¡+Âð†pÜ£œP¥ÇŠ!ù®.Iú Ú±PîÄC~£dK½"~Ìtõ$v2ŠÁÒ/Ü×c`ÓáÚYêíÆLµviwÿ2~qéz¿Uº¡^“>bº|6;éG:üJ?§²QvÌô‹þþìªó¼šîžâAV«´­ê§­žÆÜ€Oí·øæè(¯e ¡záNgÈf˽$¢yF¢Þ.ˆ"D “¾Dwö Þ“Χ"9©ÏÉ)Kˆº ÷éÂ÷K]ê¤ØêÕÓô"UŸŒ´ÃT—·™N`8“¡ˆfm&£Ì]QÖK®BcÝ< ™"œŸ>L+„Ë cO¯óÏ¿½ÿ8¿°Ðqú{¦tÁ„KÈ,‚ÄàÛ8{žS«\GâésÖ8Ô̹‡!p‘°«ƒª³ï¨Fx$9Öž«ˆ® ÈUOXØvÒFVZkƒ¼Ò7<yÎNgU[˳gñlxߺ$ÏZ“ƒD@,»n“{ U`*ͳ)¶>Ø#NOÞLì;¿ý2w£Àæz1˜à¬Ç |Sª.¸ñ$7òú:««¼‡ðá23~¬õî¾Á6;ð)=ÉÁâš2t³ˆípÊœõØ6û‰}ÔÁD"ÈG‘ëEk˜‡hw=â©€>`¨ÅŸÛöòf¿/²º®j7m“Ò­êÓ¾HÒºjöhŒ?ö°}D½{c{öé6íd´ƒí *}ûþÃó=2ÁºAƒÚÁ‡{^¸gl/<#$Æ' ­aáA­0УTôòú&-X/Yr$ ÞÒ b”M·‘&ù<×$wê?ó<{!YãÖ;ÆWoà7Ÿd¨ËŒHÏÙwM½Ï+Pk•ÚõGüß\ÑÒNQæ¢{JçŸsBÀ3ÿõÓì¶<§yjZUhO‘œÐ&NSnÚ‰:µ´u†J»ÖÔ×ê#­ŠÂ€…)… NQ?ÎIs^€ãóÁTÄÞµ¼»UÈ\ÁÅF ßõbͱ õ®G>åZ#¦Z“ËáXT_^ ºL²5°Ô+Œ™® < mþÑB@¢58‚ žm fOBÁ¯ÒѸ˜Ð otÿ°¨É³ƒ¹© NUÚ¤ÀÍ~û¾Ò>«0¸K ˜ÜHδ!¬Ü¥¡ÞõȧîrÄT+ µÕ·ùR‰Øzq«†zM‰Ó5€ ™h yK0Kߨš¥^QmÌÔ`,Hó…A,L†×bs«5&œ /"1ñ"‚…òT˜qï5¼P‡Ã S¼ï-¤xdƒ)>Ô)`ÄÈÊ|³×^Ä2£™vc^ϳ’ÌÀ…ð4-˜ÃfgÛˆ‹XbÃæ¬7)Ggªø·ZÂYœ|®óq„rõg¥#3U 3§'¸7wz/AŠAJˆe¬¿çO4BßÖ¡ T2H€l)oÂgj1LšRÄþ¹ ƒ_€Ù6’0Ôã®ìÿ“S9—ädøÄÌä>ßg&/q18›ÉÔ|ìÊ´}ƒñÙ`º±°F9Ÿûðu¾«Çðòö×ê]õã5k…ßôŸÞ^c«¢>C¡ÍÛŸ~¢N_ÀÝ8އºÞW•aú Ôåm£ÚÖ7.Ž Ëg’B—Lp@oÛºSx:™ÄpWA½¢oÚþáLÒ–+˜ VÃöº´íjƒ’4U—¶ÙšÅøcÁõ'ÄÍaQSº]lçKK4ªIÖšCsPš¨7Ó8\`'Ï‹nÃá=âYniþo~¨Ò+Ÿ2b°Æéž%©È]7l[–ñBËR÷½²Ö®ý2@PÎS$>ôêA}#š]ÕÇ$µH±Z5±U€Ç%±•bàPX„ɳ2ͻݻ x2+ãsö0'Dƒëiƒá‚¹2òo3˜ñ¬ÁXš?m0…:dI¼V«/×?MhÔ>LÁ:&áé ËfôhlÛ_½«4®$~1n|á×ù¯JñÖÛfpÝ+-™¥=˜ÚiW(*Ðç‹‚ŸAn£ë¸Ãä‹¶‚î.µgÓР : x&S8 0â“åhNƒ†¦QއÁ UŸ±Q:g’ Ù¼Ë ïÇ­ÿ@#]³~ÄÜ"¨PLôJŒ‡S¶„= ý3 ˪¥—Z}îø¼!å¼Ð÷‘#áo[ah~Û2îÇpPF#û3 îó —XÖAýÿ/¯µ÷ -ø0®àl´¨ä0Q~VÇy‡ž hKuå{‹wÂ÷(;ÉØ”30‘yÐ9è^Í·„Ùàv*Z‘‘­R¤kÌœá:3SNVîÒÝÒݺhK¹ ºÏlõÇÇ]1çÖ×”ô Q\Dk=ê²bpå׎jHÀŠ£™ÍýHC[WhQò‹«wÏ8w~nžŠK[Íu¤L®èì,dx¾Ž({]è)”äÔ…ˆ„íBDK#q¨ŒÄ²ˆ¨(Ãç wbÞÃSŒ¸nbâÚAò™Ê}k3È2³éïª&õSaø\4Áà‹ÙÃש¿0ó8UH³y³œøS‹Ì_¤ÅÓ|ÈýðÀl"OÍ þEŽ¢!Á†aq1ÚHË;±ïÑÅÿw‰ÂÖ endstream endobj 1762 0 obj << /Length 2218 /Filter /FlateDecode >> stream xÚY[Û6~ϯ0ú$cUumч4mvdl: ˜öcÑ6;²¤JÔLæßï¹P¶äH²Sˆ)òðœÃsýÈñWüóW™·J„p³0]mo<šmö+|þ×ßÒm€p3 üùþÍ÷ï£hå{næeþê~7duŸ¯œwYÕ¬7B'ýa½ ÃÈùY¶ŠgŽÕz¤NÞª…Qâù‰ã{býçý‡7¿ÞŸGAp£†Hù•Ši°òCW„q`UŒÓÐõEÈ*¦nà¡Àïßû^8$|ØDqഅί ¶ð3×ìIïŽ ox(˜ˆ3§nªu8Ï:_ûÌùNË ’7´úX-Œ_×°Uþ8èýaów' mpú•gwr«/fªÆŠ–OºÜó¸nNÒT‰ÄF]•V$žª½ÃÌÑ%PnðŒt(áúŸi[t9ñ ÓÄ©éTUcä#*‹Sêˆ|iAå¹ÊOvÊÜ,bkEpô§_ÞOÙðØÈRI·Ù¦Î^äµÊÊ0;øÃóÃB]††H"×KÒUùnÅW£§Þ È9Šã¡Z—LÉd²cõ¬!T/”E ôÉJôÔW”¸dJJ¸²}4$Íw×¢±ó– fà ݺ¡•IÞõ™™ú"mà‡(zEÈÁšb°‚;y¥´ã±ëpŒ‚f™WÌåéqBœ ßMÐ~Ðôšé}#b¾U‘ÿ3¶©j‹Žõ&h=ë³·íë±6•Qsþ¢"ý~ §ƒÂÐ@6ÛŠ I£;›¯ÈÖ­XɃÐy¡2VlÁÀäôi† 2Ä¡o+ïÿÊB?á´²aä-Ö¹›ÙEmù”ÀÛwrŽô4Š*+³¦yÈ8w¡·X<5 MñÊ+mU<³Â´£€0‘ Ô龆Á§,s õh›ˆ'; ò0gßQÄù!ë!üÈ9HŠW+—¨âÐp-‡ÉjÇsrÆå@òr€x{7N‡'PtåSIéñRbˆ 2‰û²¶)1/@}1ªlQ¥ ѹª#ýÃißw£ÆcMRË=åGàˆ+§),Hþ9gqà4ª.äVmïÃIaåyÄç‘ÌÈ›™ì9“Á²!À7QP§*¹qâv 4«¢š©^ÛªmïÒ´ïµú¤;̱›³>Rо–‡æÚæü“:Ÿ¾)D8ÿódJ±=+©þFI¾ó÷Bò°Aˆ7|v€‰öÄ'Ï¡eÈZÛm×4ªÜö6™u#ðYvãdDV¥­q[YrëzËÁc§ ³Ñv]}© ˆÓAáù¾jàŽ¾jð—¨HÍBÇš™šÆÍº5Jæ76Ý`¡é>ÊGUÜÞqÇhÞ"„”€ãÚ³±f÷QÞ«ßÙJ³â™²–[̧u…o¯®#•›»ž6r ᣦ˜zãV'd éD¬ù)N X¿Û«æ(Ëï°²ý¸ä©óE,xª@¾µ4‡›¯)a”޽…ÏviÖGa”8Ÿ~»oôöÉ’Ön_Ìœð–$·P¸™³ýÅixÚsû+,KYTtçYÒ Aöv_äAàú¨šâu*US4¥Êï,,±ØVE×Ä^gh;Ìàp ‰§oA¹±HV"JÁ¬É°ßSoä`ÿ’)cº®yVyÑ'ÂèÚx>ñJôÔW”¸dzÃøk¹Û „(6^<gšÅ&ˆ¬NÃ4z® µSbš<®·¦Ch‰+ðñ—zcçïxá#ЇvŠG{.ê`æÌKÇà,*TAxèÝëOï€9À¶¼g%Œ'ɪ$ïØ2›“ÁÉþ­šÙºçõrçÊgog^ß…¼ùîkÕÎ| Žzp%¿© ßéÏ>·‘ˆªf^üg½?\“OåV@5²F‰Å×|¾Ì›ËB¤²ÇwS-S$ìEÓôÎð Ô€²0xäY×…¦š ¾ðáoÈö¥¾Fñ7¹# ººQ¦g@ÕfR¬­l—Ü1Ï©d¡q¡È½à•A¶SG2³ }g.~’xÊ`´…(«?B|7:hè<øË¤ýyh/ øŸÄÿÊ»¦:ò:—U˜â°A¿Ç±ó¶(x¡²—K Ù–N>j'Z)_4Qñ} w«œø†= /á`¢¨¥e—çQ,Ášš‹?Ü‹4På^—V]ùؘp(m¢˜­>jÓßéð»Ee.\î»Ô›|^ë½X‚©÷ÞˆÃ[0†¸Æ£GzlŒù !á723†.NœÇþMv~Pd&˜ým‹çXÓŸ,·3ÂLaÆ)Å)l¿ð'§VÓ2ÊŽ.°iJ=Ðvw‡‰ˆ^âÁ?|‰‡»¾9.€ß“ƒ—Ao‚ 7FÐKE4tÞ–Ø¥Çäç+óø9oô|éC1ÉWÄáµ§K Ü H§ž-Ì.QÌWûa Ä·J·Ô×4¸`zÆL&ÇFdVÖrD–àui¾á¯S—¦¶«OOíí䃺ˆ£ùu»¬HÿBÚwXyÖêÅB5á¼hsX¸0åÕ£ ÛÏp£œ¿,[ÆòJﺒ_4®ßžÎ°¯7áí¨oߌ6Åä<”I‹ÿ<×OýQâÖR7VFÕjÔxÙõÛÊ¿;À¿ê Î8]7h¢ä_²Qxç”ÅÙ™?px™á ƒ9º–!=ñæL=…óÇ,¹¡žNñ•qì&Y|£–øŠc–WtÂyGÞ§B×¾T`äi0öÞþôÖ$V™ñ;>æŽ_'ÒAâœ-‹åºóÂ#8W;ÙÆ>`Rbæó ØR¦#aæ†)ø ×ÿ‰õWZ‰]/†»éyúwûÀD¥u{¯þW´’6 endstream endobj 1768 0 obj << /Length 1965 /Filter /FlateDecode >> stream xÚÍ]s›8ð=¿Âx&PÂ@;yèÇõz7s÷Ðæ-̓ ²£+F>MÝ_»Záàœ¦I¯Ì„Õêk¿wµf³þØ,gi9ÏfÅæ$´Øf=#àýï'Ì­óa¡?XùêüäÙÛ$™±0ÈÜÍÎWãÎËÙ…÷úJllæ~Ç^ö|îsžx¯D+ ³Ñs?ʼ²«d P²Ôc!Ÿ_žÿyòÛùþâ$о‘B\y‡Ä,š1Ä|9X̉Ä,ˆxá³·pópá…Ÿ,"ïõË74{È(H‚募çW ˆ#b)µ,”D^¡ë9`L£–sæuF–´r9Öwÿ%šO1y5¬¬U½vGl‹?«Rºk–¢U[+CYÓþR~ ¯•QºvkE]ÒÜFжkäFAÈ—e$XB|¬ººp;ã$öVº! U›m% ŽÞÐ%÷ʨxä5ì¶Š¢ÐM cMß7üMK‚¹Ÿ„ÜûÃB¹%ÙDÑY23ÏÊ ¯iåV4ÂÈj7ϸwz@=#òUMve®¬qet“C^Ø…ÀC°-Wc¾ðBšÜeA˜'{ëIXϺÛ«o¶§C— „•|/ ·Èààÿi¿T0Ù‚ÎDE“•ª¥h¶ª·H½2W´DXÊZ°/ äVT)ËîêŒöÇä»÷Ç‹Ðk a @{IœäN‚|r+d%­1ÑäÇ0 ¯š$ áæ¥ª”q®`g4}ÉâñŸl0|Ân„D'ªj'24¢ˆ{/ivm-qëî°…WLè7txò„~nÜi7W j˜Wˆš€%y ÊFX­Ø¹È#Vq²:\áNÑ`¦DχËûÃõÖ8¥â¨’kY—ȱÛQBc˜h2ÈxW'!-øPH„ÙÎL‚”³^R,7‹‚Erk- ô—5¢”·ª0¢ ƒ³¢kY‡?¥‰F¢\Zá&¢hîÌŠ;˜%ÅE¤Qz;xZSŸÕ–ž;›Ï‡—ñµQfw:Gá,Ùlu%Œcå­ê3½•À0¦"Ê÷ñ˜v·?F•ÏÅåÏ‘PÊžð§’¬u9±<¤ëÑ2¼íÁþžƒÉ½— #›Ý‡¸`?£-صdø‚ï0tm„­‹A¼Sèon^Õ1ÚøÆ¸Ë•ô :´`4áØI”J+Ýʼnû ‹„X"Ö—£Éo+Ö˜28óXÄ(RpY/G¤õrú?N nχv3r;8 S%éæóÀõFÓNÕ023AöÜ™ÌÐk享ªz£É‚8fýëÀiïN±6nl´–7NÚ'3fÀ>Z»“ª>Á\ë’…ÂWÓÀÕ±4Ÿp n“ò¸ŸÆ%nò=RãûÓNˆ¾ûLóúâ–Cˆå²‘Ÿ•8¤¸÷Á4B­±$0Ç¢€;²j{Ë- ¹… Š”GXë¡(‚`œ,ø©N”…¼V­{|¼’_6b¢,„·õÒ6Ýb^“„v¶MK‹òìæs¿Àð¬tî…û—À°°|¸äü±Åqù9ã˜Ð_|Ë€ø˜¡ëzP~ cû1XX½ÒåDÍ<½1õŠ Ê6¹g¸(W‰SÒð-ôÒVÍG*NKn&®Ì¸·Ñ &]O‹ÝŠ<·ñ|¤Ú»ß³8[7ÎRëL¸PþÛ)(ÊáW¹îá¡&˜8<íG‘õJŸ”‰=̾zp'Ú¢®] …QËv›`Y)Œey_UÔ\bz˜&Æö/†æ&_ï)I‰Ä#%Ô8 *1¢ä'·4¾}°ïî>›zDÇ=|û}š~ûå–_,c?W~G{#ýuj‡ì¹k‡ðÔ–Ùøqí]â@Þûé¾Aƒƒ&"(¤÷4AxšL7Ap·íY oÅÎÿFÂô«,ÇÄ·fúqy빯±ˆg̃»'¼‚º8ÈÒªÏ:·vÛÉ©š4r]ƒ(rõ.!¨PØ÷kû«õk¾¿]ƒÜ´k·©v ÎÕÓ’;|ðµtÖ ]cÇ®A3Ö¼ÃÍÙïÖ$qxЭáyxЭAú&ÊÙ [“R·‘÷´sv¤‚³6 ÿ×}p2µVN??N¾}é(W3ýïÏÿV. endstream endobj 1775 0 obj << /Length 1298 /Filter /FlateDecode >> stream xÚíYKÛ6¾ï¯0r’KE=¬>4E[ È)ð%Ýì+Ó¶ Yhz_¿¾3J+y%ï+Û¦À"SÃ!çÁ™of6lâÃ?6IýI¹—†óI¶;ó Um&´øòdz|.0ºÎO˳Ÿ~¢ ó½ÔOÙd¹î^µ\MÎ_·¢ÖRM]ι3ÿ8uÃ0r>‰½$Ê®šºÁÜY ¹‡Uâ³Äa~4½XþyöÛ²Á5DÎ*ÆaOÅ9lF“xzŒ‡¤æ7ŒBÁœ¸ËË/]{~‰wsÈW ~DÎF‰zûÍü:ÏôAY*|,²ƒR²Ô–>³"W´ºÃCJŠ~™ÝÅOZ‰”Ëj:{I€:Üci“—šXÊEiÔypvÙ•µÝKë[ºÐ·w±ö2©êªÚšòw•—‹ª–JèʪîºxÏÏæ¸ÛSˆuüs~ñßxhî{lèâª*8-³ª\õÕz½Èm-è„Ü >*!CÂ$týShyØç冖z+i±ÏDÑRór]©ÐyUašà¢y–Ø?óTCjž›ÓÕúHj-”ØI­ò;¹rÎúPfF‹AyAÌœ»AiºvbÞßÑ£ Jì[‡NqçÍV^Òycœ%VÁë^M#Á‚¶Ïmq–Ùq|@ŒÛ1ûN".ÇE\Ì~cg/v5ÄÍ”92Zèñ·*ÇWãuN….K½'WÉ+ü’eqKßûZd'o³1wŽxgö,C/ú K!YÕ¢@¥xà,ì!~3Šq–Â]ðèvÏ„..MÙªÈH„$žnä@öJÂäD®7vÈÈèµÉ¯ÐViÕhý&c ÑwœÕÚ¸ˆØ¤g“­WsÝ¡BúïݦÝ ”Ñ©ôuô¼¯= ƒçT‘{»ªÃS«OYSuÒ„P)„€ÖV¤öªƒ;'«rŽVIQ¾ÀRìÁO€‡ncô™à¨V9ê'dhb„Ûi]˜áaf’fèÌ ,Ø6¹y3@»}+°y=Ö³ŽŠ<·šÃE·¬#ÃxYWÏÊ0óz'K{¯Rµ…ýJÅ ò„‚<±A}'j<|ò‚4!7übÙÅMn­Ì„%Q5·¾X‘+®ml¤úi£?(U‰Ë’Ž\‹o\•¹°52«v;Q®ö2òÒ4}y>^UùÊ6ÈhéÓ3ñ³¸”¶~^|ø`©ä­fµøú—TÕ¬ùoŽ ¯U endstream endobj 1781 0 obj << /Length 1851 /Filter /FlateDecode >> stream xÚµÙ®ÚFô=_òd*p=ØØUMšV©¢VŠxIoò0pã…Øã»¨ê¿÷l6›‡$U"$<ËÙæ¬3G ø©Á<$aèÏ£Ù`•? hµÚxðö·'JàÆ8>‚|±|òã¯Óé@þ<˜«ÁrsLj¹Üx/wzoM5‡aèÍž ÇQ4õ^èÚðJ^Ç“™·n2SÃ( Tâ© ~XþþäÕ²cQ%‘âYä«0b)+£³!àN½‡<-ã´Ø¤EjG¼x¼­g»{SÈ`±jªÊVFxi¬B_M™‹MWk¥áâr‰_¡£«ª¼¿ÕÕÑ #Û·e)BèÛòÎ,6:«Íû`ªž#«s;ŒãxOýX%Ìü—JAÓ÷ å(ötÁHu„t{‰÷ÐGï†ÑÒš ”÷éÊ6•”ø’¸émª2w ;ñ½ÌÈrnN¶üv|´SC‰×Ôi±Õk›Â¥„èe ŸÄ¡WîmZ:Ë™^¦o™b–!KÿJ-Uz÷©ÝñèM‡Ò/Áô ჯő·Ü&U™LÛô}HVòÈc9ñVñò´*/E' “ȃèQà1[žáSÄ¡<9Ð-+-$ d×äø/¼*Þ Ç¡ÑM0R0 N¢X#k³ÑMf‘Eœ Àwæ)ž"ÇÚ^»9¨êÃ)£uà[ÙWsä!;u)wÚò¶¥ÁÒ‰R`NÇ€µ„_ÁËx¦XóJ¹ii gPR£Vý¾3þ $£Iè¥Åû@EêÝ^ºN![d M'Hº× Ô=„Y]ÃtÅîÖ«¥Ã$ôXq¸OÇÄÁª„ÔIÐ ¸Êš¢×ÙCp„N”æ¨Tˆàß§YÆ£[B5=q¡[æà¼+Ž¥PMÁ1PGÊ«€“DÅÑÒš!ÄÃ`Ä–P‡\G«Y𧶆(‰Â¹D €”è4¶Žˆ Jíý*CʺÚ69¤ 8 ôGŠ»ºÏþ,ÞT­sÝc²{Ís-ß´à/¢ôK›à©.áæh¦<×ä«óð(‚`rƒÇ"¯1‚¢`æí9|`SE> ­,µl%–èGÉä{“ž“JdmJ´Ánšò¦Ç0ò ³œ|a«¼ÅüåýmVý¸’º1칋n ¸œÔnd.ǶjŒ3“FJñ©‘žQd›é•!SÏÐÔ¸Ùn¡ƒV“fÝãзrìJq\oøVÅ.ƒM™AVGº—ŠÑcòPìÐor¤FÜ$Žëg}dP¼™ÌB–ïÝ_¦*Ñ9øÎ‚D̃…GZj“õ9·iײãc¾5ŸÀ…1ÂÀyc C庱»ެ›À£ƒ@ —åCµ‰ð’Hpˆb¨%ÍÓ¬Üê juÞ× KÚ¡«Œ<‘¨zÁ²ïyplšLT½NÁ¥jÈAµÃ+$xvͽCŠ+ÃqE¢K¨ß‡<s¢[LÄ-^}jõ(%Ø¿±”ÿ×UÔ¹¯Ds·¯ÀžËW¦¯ ë&pÍWz/Œï@ëØÄ0%ã—,mÀûØ®09±+@‘];htvíqëV¿¡•_”ÊmoôwO–¯ ÿC&’PâÒR}–|úYá$3-Ëýw’ÌBéï’闊úú~Bñˆ˜ˆ®¨tc2¸·Ï–/›šP'sÕ–­ùä¬ ðîJ<"-«çJ¡µU 7¤0͸0ѹ1™ï³–pZœmçüÌÀ–£&жÒû¯ëGWIî ‘? ÉtJ}ºNéÆˆ ”–Ÿ?U•®¥âv9U^<éîÝu[†«“yµKèj}°ÁðkjíÑ»>Í÷ee¹1@§~Þžmûa Ž*ò¢0÷ÒAàBz çI—ÿ!RJù(ðDW•L#mŽê]™®‘jwO¦¦Hº˜.Oø_²‰N\úÐwy\¿†¼ñä{R>è'þÕgü ž÷Ùš¼þM´xýÃô£¿Ä> stream xÚí\[sܸ±~ׯÀ[¼!ˆ;ÚJ•Ö–çxc_ï­RÔ 4Ø3Ô’ÛÚ_Ÿ¯áx,Ë–4Ò¨ò rYj‚ÝèÐÝ$%l¬dÂú€Â嘒Rå™ÒšÚB ÊKLY•ÚÀµyÍt©Q†i)Ý L+@Y¦5õìJÅ´‘†¨’ikQ‚i/Ó]ȈI˜)¡Bº„s 3Bxb’ L \Ò‹PŽtjó̉’(Q‚Ò„“Š9¥µIæŒHwÑF㥙ó† Ã|)K¢,ó§6Ç<Æ PîMî90o]ê^À“ ðC:Å|@çÒiFî…@Á@AR -A';HÁ‚  `‚à,YD‚/(R%1âRˆÔ ®KžÂX[‰¥¥r ˆJ/S+z)C M ²Ð™ O(Cºhú„¡{Ž “¬Ú„·¤˜´‹ÜƒA-4(–ÊM­FÈÈ’&$¸¤÷Ä`¨5 m) ‘Î¥iB-QžÔRð72£#ʦžè¾*‰´‚È@“¯Á¯L&©+—UA« VB•ƒ.s+‘"¼Z¥~ ~hC¦p·4ù Hô¨½§~ɵLI:Ód +I牂Å%y™Q¥?¤&„»zA¦Fz ÚhLŠô$«“—Xb4´&œ…Jc“[@0i˜ÎƒOsDÆ·%‚¢É°¥–J¥¶äÞ4+’ÂÁ„•É­IÒª4&š&«’ZÂÏ µdWk‰Fbó }Zá*‘$§>øþûþúì42~´œ´Óz9;àê““ØÅå$öì¡ø¬Z,*&<æq¨°Uðþ´šD?NšjÁ_µCœ7|¹ZÇ®¯gK>m›¦êøiì&q9ðjª¯–ÓÌÜCMùi%M<2ÕÕ³9Xû!vuÿŽŸ6«žOZ¨æó³Óy\Rou;å}SõsþGìZÞ.#>´ÖÅÈOÚUÇOê÷‘÷õGÞÇ÷‰©Óe ÆIÛ´K4/êL5±ïyü}U5|ÖÅ j.öC{ÕÀùü!Äøcþ„ÿ?åçÿÇŸñù?øsþ‚ÿ?É_ñ×ü ÿ'ÿËâ?ó㮚¼‹CÓ1È uÝ:ŽoRדº›¬|µœÂ,“¶‹@PwÅù„O9ÆÂg|ÎkþþŽ7|Á—¼å§üwÞñž|Åßóü#?ã¤ÞãZc—¯¶4 u3üxÕ4qàG+ØlMšˆãª‡¾¦íêåf.S[lšú´¯{>­f3X'ÿ¢™ÎøOšø‘&e˜·«4¹¯&UãÍVu“zN¨ž*η×WÛ8c¢2ôƧv\ä[k±¸œ’iã"ýÊ£ºjU÷Ž÷ç€dÑvcˆ?òýŸ¦5üœF¸íÐÓöÃ’'·%Wl Ï'«ŽÖÃ?ƒKwí»¸$c÷q’¼eÓͤ==[ëê¦'ð´äx£‰‹6ûEÓÎêIÕ,Ûaôë.ÎjR§|QMØ4ÎÈ¡i  ¬8y¿Jþßegß\U“ÕùbEk¨‚Î×ë„FúœÄ)ôW´X6R€·€¬šÏð­¡/iQt´@Ϋæ$«\7ö›U’ u˜=÷0ã8ÜòŒÃ<+‡ëvdËÃ#þp„t”…²ðÑ–ðÑFêiæyšyžnñ<Ýð sþ¬îyfžÙŸo±?_3l¤«f¨O›3þ<¯Ó7YôM}³%úf#óS¾ùzÞvð¯Ø-à÷ÇMÏ«õη«-Ù*«­6]TÉ 6¤Ñ 1 Ç,·„ãFªÎÍ?̇á´ÿ Gxp¶€¥†XäQ´Ý,uËgNƒîŒÎ_ôïgß1@¼Ê5¬eð…qf¿(Á¹òû%•=ÉÀüíO?³W’%["Ø<ùé~œÊŠ™ù1b„X_À»¥J4døÛçÇÿ¡’ÌÓ•­ ›»Øø&¯"Æ'zôž?çg÷¼w¹Rá]T9ÝÕ»h™$ï¢jíu½K SxϤTEžé` ª¯I•®owâŽëeÕ ,‡;8ÙÝ­¾À„ߨ | æßôµ‹˜L© cÜåŒJ–…PárFéT¡•½Š›§¢âšðB©üU|>=v°×òù¯$”÷‰ä}"yŸHÞ'’÷‰ä}"¹—D²”—&’Û,{L$?vO'ßÊØ´ßÊØŒÛÊØ4’À+ü¿RÒ©¿L:åùÌŠù_šY9yAì+oû ¹Ž}… =f$ìH¸‘ð#®1+' -)x* o4ÓB¥–Lêt}»QèM‚å׈S‹B±gœçâ䫨S¹‚^ÍFS¥¬)½ËaÓõíâ|G޳ƒ17 FÞã·ß'Èë[’Ò"52æà6ì%ÿÆL·‹ÕbµK•À~ªc‹úý"ÜÁð ?[£TÚ*¨½ DZ´¨wñÅ5¦¢õµ=B¼(÷•WÉ}Ï1aö ¥Õ‘$—J^Î(pT‡ ¯’û~Êp¿ž_ûÒ+<¥½Y½GYM¤w‹v>óäXï‘b$ÆNŽ'œO8Ö„¥Ô(¥Æ³Sg§ÏN5žjìY=«±g5ölÆõ¨BoZFzT‘‡ëU@µK'®Õ¡Hïo_ì$Ö¤ëÛuù®Ej}Z ó]¶·Ø¨’¢ðÎïèõw9mÉ¢†¦0Öl™®ohµ¬)`ïù‡yŒM1«Ov,üx×…¿»{}óRÏë"лš¢ äézP‘y¦ZÑæÝ€A»„¸KÐ;D;%âYìw#h)5 ³wГÕqÜÁÆx#\m‹€ÄêNà^ߺ+ŒÐSÁ´ …EbeÊt}e°Àº¨»®íŠÉP- ÀÌeªž7È{?ò É®>^ãã׉Bá€×J–Þ® ‡¥Z§ë½™÷tz²hß×±q]!Ž5•8îñN!²JyCA¯d’È»µ¤Ë½î›zä~+o@fÌR¨‚ wˆy‡­ ©:½¼>bFÜÒ··‡¹ÆÂk¿iÎÏ”|©G¤NoÄYAŸ’¸‚žžkDð^ðmÀ=i_· QüƒgÕëøö×R—«‘òNû’¬<ö#Ìd ²¼ÞÛž4m'›}éúîGÙ ‚–ôÕ‡B²‚SU•XEòp60½t@—¦š+eNéòÖ!/(û ×Í=ò_úÂBéôŽFtíéc®÷¶¦‘êÅnY5»î÷œ#n/‹ô…ÏâþÖnt¥%¯.(Ïpã@Ÿ~ÑÇhä4þÂÕ¾öÄ›é ôIVAi»¹î¿Dj{U©v ÝJ»0YL¨°árFcEQ:{9#m«ÚÝæ#ý V~Y¸°åî… =–ôX^0cYÀŽ·Ì†ØðŒ%3– ÌX‚0»”ï æÀ§]`5jå úŠÑZD_ÊýF1”#j  ÞÞ)ê›ï©R©˜¡'*ïƈÂé ×1í[Ë0n¼wÄ­ÖÓ‡…ÈaLãÃŽJ¿!3Âf®Œ)4SÚô®²#¾å¢ìdÕ½Ó¦:ŽÍNÕã5´ i“ÁjÜ;ÐjTôQ¦Gä‹|ÃÃIè5¤@—· R=úgÍ6XU̇Es]¸#Æ Ù”f6wy‡G%¥ô)tdH.à‚e!]Þ.b9=¶€IûÊàˆn‹ßôIú]€½èñ‡Wva²ÈfŒÐ—3jï ‰HèrFx"ý!€K)È8u/eĹ[Ð7ç·ž|öúíî±ÊYì²8'¾ˆUì~¸ò1ÆÕÎ=$SôüB+l²Ø"èÜ£DYª‹äj5´tO(Iî'½Gvã3PÓÃaúÝ ÛÀ!¨´–~7Ù)®)ïÂdéý)oѽpCߢ«9ó¥«9u=WÛ¿Ó;½³¾5ªÛ^L^\0°ûbrcäîüM“"éQ‚9úë é¨ÇI`é5í¿RqÂy³¤¨â31¤Çò‘À1,,%:—.^F]×~è¿X8ù£”KÖÄ9&¸ŸþƆñ¿‘Òá endstream endobj 1789 0 obj << /Length 1788 /Filter /FlateDecode >> stream xÚ½YÝoÛ6ï_a-@µ§OKn—Û°¡(†ÖÒ<Ðm³•EC¤š¤ýîxÔG1q»®(P“Ç#yŸ¿;1á$€ádL²8ž/“|²9< ,µÞMhðþg¡ã›ãlÀùfõì—ßÓtóe° '«íð¨U1¹b¿îùшz:‹ã˜å¯§³$IÙ®Qj:‹rV4¥Ð0Ê‚0caM¯W=ûmÕ]œFÑ™"çCC£ žGñb²È“y'$çZ©r »S¶;Y•|-ÊKS7â•£vë¢*†« )Ü< ãy˜ÒQ²2Äùî2p»;RÕ‘jÁÝŒ8޵#/G…õÊ9\0róù  ¹•è ¤ØÙÝå;U‰Ñ[ʯbLÂ!ypñ­Á»·¼Ô£ö9ŠŠ+é²jÊHî˜~Ñ ?ixG†ÛlÎàËY˜‚Çéü?·[¼šBhÝá$aÊÍ^Pì%ì8 ¯ù¦!ƒÕn[íbS¤1¢xEÜ ¶V_—°ËPˆ-oJãöÝȲ¤ÑÚÆ´cÚ {¥EõÚ)p/Ñ4ù<‹Iô·XtÈVÕnÆtN³ùâ¾§ÞñeJ—†¬kYÀx™ã÷$1ŽÄ8I0"pËgšAL“Ø%ÍÝýv æÆ„¿jô {ÅÀ~!¤ä€4’—åÏ …žõâå<Ù½—ij#=-X­ 7RUnzD¼a¢òªÀAÂx)wÕAØà1DBýAEšˆ[~8–ÙİG½[óíﱇw㯢B¬ôo;É$UŸ•$Kö^îöHv™ZÆZ”`–6zbþæ˜+Dà·Rϧ³l²Õ4‡Ì ²€t€Ø*…_Š·|%þ•À.CÐì鬶ºz«Àþ3z™H°pÑ)޵©eµsã½jÊ‚Æ.¬'inÑn$H1®¬¾ðˆ×'Ç r ±”Ä;ò[ˆ°Ûb#(ù‰£ SÇÚâ‘ÍaÔ'ŽB&µ/hfj.Kàü*jåÍÀ8Š;FºÙ5 rÁ¨G.˜ð¢Ýaïjåí°ãaPö@¢/Êd½„‰¶@lÝf}jžç/Ÿûµë°†Û†°æEi¢9k¡µ(.ÆD˜9Ìí‘«“mÎCh‰N œq÷»mª ‚ѸÂ!öAdÄ*¹¨Î­ÍÛÑ€´ÇÖÂ4u±cmjIÖ0v4´…%àÙkW$-ÁÁùÖÏÂh®_YaH\Å¢-Bœ Ÿkó@ítÁ>µCÅP¹Ò`·>ïÇìvÜ÷g:‹zëô®¹;ÓoÕ¦l q¿ƒ0©µ àÞªß,MÛJ>!Ëc¢”ü»å°M)î|7PQždìf Y’fŒ7FßÁs0Í™Þp\ÃðF"V„A‰+„Ô0q‘uÍ]à€ÈWã§^S>ô!kœ/Y…®¶'AÌ ùÅ6<ñ2ÀC8GðšÆXÀh$¨ÐUå1KªóŠV;å;ôÝcÏ%jU¨ ¥v×jq„šÄ‘„i+‚‚0Œœ·ñ-–”:Qlá×Kµã5T¥Ú ¨ÜÁ!$#é7·µíŒc+hsÀÿ]8¸+±ÆßBlx!Ü ŽÅ û \!ª±:ÕÇ–õî0…õ·F[õH´unDQzŸS¤.AÑÌy/ʆރ™nÖÃí©s Û;Ðr®ñ8·ë +jù²'t½ß·XÛïºq]³$;©WÙ „…6½õ‘oºòxâ­ÜzË²ÙøJOðÎtŸ&˜‰rëG×q`—ãvàï(³O´<5þ‰rÎî9¶I<áúƒm3^§~X‰ºý—ß÷,OóeÑ“Êל5÷Ÿ/èéŸ/.Î3¯(ßÕ›.‚AfgfO8ŒøçîcZÉ}¶VKõµå¹øË ©I²@ƒ×là4A‡í¹ýŒÇhö¼Æ\]CÙYäì î¼§k¶œü“ª=0‹ÌjåßksƳ7gUi© õ0ǃgRÉ_äƒ&gm“GÖ®Èm›E,¼,¥îˆþí¢ÄÈÞpç6|¦9ýºèZ ûØ`×v¢-Ì?øDèE{Óta _Ç΀1|-{ðõxbè6—¢*?|ÿ­´ù°©åÑxb x6d>U²Cè3iÖÿ]˃“Q ®üü?*8À6ûlyqV/N¼x¡û&Žòp¨N×ô¾d°võÅÈîèÚ-E~+Ü&´D£Å¶)i…CµE‡›nÈɉ¾«eAUÝ“—øqNHǃwY´„}—õûš·‰×c©}M¥ç4šm®)úmpðdèŸá»^`ó>é$°Ëš·¯øÆo endstream endobj 1796 0 obj << /Length 2093 /Filter /FlateDecode >> stream xÚµYYÛF~÷¯òD#…ÍK¤=lvãEFpæÁÈÄ-ª¥é˜"²93ʯߪ®â!‰-{² XÍ>êüêè1ó៘eþl†Ë,JgùáogëýŒþýFð¾l\Œv~ÿæÛwq<þ2ó31»ßIÝogÞ?åѨz¾ÃÐKßÎQ{ßËFÑÌ¡š/‚ÔÛ¶…j`´òÅÊ~:ÿtÿŸ7?Ü÷Œã øJ qçDB,“Y’FKF$å»yzH)b?òòªœƒPOøŸ*µ*suK«,õÌ£âMÇZmÕ¯¾ˆJµå)£s<ò¹SJ㲪Ô„HÆB<Бÿ´¹×ùç_ýØ_.—h”È«•,>‘^`E03-¼»)ºà .ELzuä,ÁO²@6HhË»Ílnq[?KUzK OòE[unÚZ±:_ç-Ô³Òð< :BÂûHc­?b'#$Á2˲+1oÀñz¡ËÄ‹9]Yút/ë‹ÕÁP½|hÄ {°LÞÿ©£²Hõ¼‘õè v”×ø“›êIÝðëhgkªº2ЊY¬¢÷¾›J‹Þ(#ü‹’4È Ýe·‡çI—N®Ò˜±pÖwüíœ:™ÑxÃ4=\ÜÕP“^-Hâ­'ùYw»˜ܶýe¬ä‹[¯¶±éÙêO•¸¼a!w-ô…W»ÊAô†žµ@×Ù ëY ªá0òÁ×vâ}ßj: 4îqب˜GÉ”m+¿·Ä¨-áæÚ¸©ðkáîjƒQ²âö¨Öª]•!Ægµm*d¨Ðam¤û އN¿[™%-uw¾î;`Úö€¼xwM ©vóƒ'>ÙÄiøJÒ0Êf}ÚŒR4÷08àÓ­垥’DÕãÈûGI“º´wjÐA›É"O]iÑZ"ªíèBÅØÀUwÿ*n@yvÍÝqTC’0XÂîöƒÉÛ ÌSNÁQ¡šO=ë¢ J}g htnãáû[WmP„{ GVŒÐÔW!œµñ~‰‡³]È9BvØlî ¸zßµjÌ^~¶ømHÓ±jäGàÊØº²™r4v¯¡Ÿ"è×<:R..nkéWóêp >ÏOG…TËÖˆÆlÂ…Eu ŽM˜eçù™§éö‰Ãmý6FÒ3‹ËN„Ö®;gíD ˆ˜ËdÖE2ŒÿÖ½Cäi‘±á袠³æàâ­$…ëTޱ¾:ÓS’¤dÜ?Üçí—½8pÒ§)ÝÐïE¤li–ï)NqnÝü”/ŒšA—\‡Æ±¹@‰¼ækÁ8jìÃ_p4,Ž»Ã®* B »núöÛ‰3•=B4׊̆iœ7ˆlÙ=NÚÎQK]ÒàÆ¸ëˆ¦˜Å«erfêwˆ4´TG/„K'—åƒúxÞ¸ LgNoíÓQÔd>¤ß×PDÁ>´X%à'Ò¸—5TþƒÎyžºoÞM¶¢Ü›p¹J×r×lã­è4ÝM2ºDCßòsæÍFŽ“Ålk°œ:¼`?ÂŒñðÃïíè]•Øä«êŸÅˆ¸ t.À’ $AŸñ¼qp¹xºõüè' Äv…~Þò0þÒc`ÐùFg>ÍòéxkïÓ hÜöpøzß &ÞRù3ÞĬD)€ö¼OS_+‘}Åú»DªxŸ£_'Zêo•md®î¡èLÜh,îÅ‹ÂÊ_—£…Ë?m$þðw(ä3ýg¨þæ@[vm™Óc׫ß(^TŸEþŸWŠáeá…‚f-¡Ÿ?«<®«§‰×¼\ð_ÿ`^}¾ endstream endobj 1800 0 obj << /Length 2112 /Filter /FlateDecode >> stream xÚµYKã6¾Ï¯0r’¶#Y[YøÙ,°Ó‡ &9Ð2m3#‹Z‰jÛóë·ŠUzØÝ>ˆb±X,~üŠ&>ü‚IêO–a8O£Õ$;~ðmkµŸPáßÿø°Ü gÉ^>|û÷8žþ<õÓ`ò²ªzÙN>y?Did5…aè­¾›Î¢(ö~µ¤–£žÎ+oÛ䲆ÒÒ–^à§Óß^þùá§—nâx±x§…(yob241X%s?Ž&É*šaDv–²˜ÂàØ+×YSU²0ÐòDMFeŸëAqý³~Á/wo´Î©$6úU®MÕÈ'\X4 ÂyÓ¢ªôi#*–Åh*ä¯~ü åo}9[Fó ÉŒf-Å–e¯å³ÏõªÕ–æ¹Èÿ6"¯a¿T™i*ÉëTY·Rjçå<‹äõ<¯¿ù†[+)¸ñBkëlÃ4kï y6²Ø®w0³¼Óp>ªb=SÅNÊ\FºÅyÝ÷Þ;ò/Ý«àÏܬL€¥Qê{æàúh•ÂRë’ê™Q¯S,ä’kj¹¥’ÑôÍDžmø'Û{gU™óÉÎä{~0ºOÊØ”Ã4°¶CY”e¥ËJ Ó6 Õ\xeµ+HûmüÏO]džŸ(`лã…þÒ½ìü¥×vyK›7‹ÃÄ{9 í8ºýšƒ¤B%3}<‚Ül8áêÄt±ô.Ô wôÝV»N³±0RÅž€Ž¶y: ¼ œ ¡‰EŒxìÔŒ]©/º@QC}‘—«‚¼x5I¡¨p–5 Ã-ÕF™JTªæ„®™0Jõœ|‘DWa,æ ¸ç =~óô•lr‹4hÎÿ3çË=Ö º.}z7^ÎËÅ ãÂßR(>Έ?hiA] c†ÍÈ ¡|'~-=²ï Ê-ˆ²ê†Î%ƒý£¸Ž‚ÄË(š^1ne¡d‘Iê¨tcTÁ•6„y•†cOÞ€ˆœ¸]Ý)wqŒ‹Í(¤ ú¶4Ž`$à¶cWé£kèCÀ=°×9'ÄÂ8¦ŒÆ¨=ã%ÂîT t2ìI^; „è\8ðÀ18ä“ã PÄFÈ…Ñ©Ò.'†›î®R ‘äQä´Ý†µ|£‚Tòœgº-î¯`&‰6<Á ‚=É_£KnØ‘" W‘éWƒ‡ãØû]Z¨5¼šnÛG\æ 'š5g©[EÏ*\kÿ«1X}5Õ+Æ,–ö#¨ûÇ)Ø 9×™%X§ò"_¬IæÓoTܪWUëj]ÈÓ oTé(®Þa®.K]+ó°FË]ÃhE$[;ˆbzØL[Z¦V̓‚ º£F R²—…¬,öÀblÖ ÑÑN×ÚÚ3‰±ÛM´wÃApN÷.|„ÞÖM'X ·ªò‚„Þ¿˜…‹ÖÉ0¤ÅY{Z¡NH‹›êÄðX¤¡ôÜ ;mzvxUZL±m OV!¨âæ> ÅÃèw/h=A'†ì=Ìò™kCNM´Ó+o¯zZPÓC'ÝŸë÷˜‘‚Ï-§åë qX¹·™d×/Þ˜²+–SºˆàÊ´x®`F{Õ#Lït@B…>9h…ÂOQsŸæ/Òe,¨‚p]Qüܘ–{Ks= Ò kζ±” Zš"ã›Ó& ÷Ó÷¡\|¶„«ä{ϰVß!7Áò:råµ!öv˜J`×£“b±wÍÓžƒ „ÚJÚNÅ·­6³…oSô\&§uÇ^ ÙS±䨏Í­5±Ïaª2:¤ØÜB_1†6`!Rkæ,„K]ÐòÐ#%;qwõàÚ8 8Ð?tÔA¨ýöZ^x¯Ñ‘¢8ò ¨Y^‘ ¯0­R‚ÅñtŽ­ïdýŽLùmVqͨú°»Î»Ó5Â\׳“3*&Q°¹5X“™¤¼˜¶µ—àƒ×*æ/·Ô ¯c¼ô/Câî­hÓæTÑ5”|¡úÇõVîD“›Ä‚EØÞ̓‘}J°ƒM‡¦ˆvÝv޼nqO[Ùj]57h»í)5P;t×þÉw?=ZØÍk@¯/—ÅÞl5»Ÿžöpø>Ž”®î2(XnºZÇ°ÐÆ®E”7˜„‰¢8:Ú§ˆ˜#î‡ìà®}oBéq#ã…ÏJ§ý88[öÊíT ,´°´ž/H[5TÊtŬØÚµX }3¤¿°œf¾: dœ$î°Å¡öpøepÔØžÓ¨_n˜¶ˆ–bvWë¼±—Pz…²PÛž©Š“M,[F ‚µªâÖî´©ë8"ã´nóp-ˆ¤ä(™õ9Ä=:u¸< ˜ôRlVL®`ë²&_$úÓûKöÍ<6¹Ëco’$>^Yö¯  m¯‹šj”ü˜/È]“SÙ²›0XyG¼Ÿ!‡bš-ecøŠ¹vgZ]––Ca@À¨ÁnJœÛyí3lߎ5Ø [ÌD•ØäòaZ>ºç/0QÂÜ<é¸y›yq3Ní ËÉ[ªEµoŽÌÚžˆ’?P·ôiÞ§¬;©<§Ò «Mº¬6á¬6iU“š‘°"Ñ=Ù´ù(D^÷ÈsµÌi¢ë—m{”ï»w0þ¥äŒ7ú×>•Ès™«L™Û›ý уd1 ·ÐIëŸYOë,“ú'oßÅYjõE®í[Ph¹ÅسLG)ðÕÿ»Ú‚ endstream endobj 1802 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./exp.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1803 0 R /BBox [0 0 150 193.95] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1804 0 R >>/Font << /R9 1806 0 R /R13 1809 0 R /R11 1811 0 R >> >> /Length 2484 /Filter /FlateDecode >> stream xœUX»®e· í÷W°ôC‹o² pçñíŒT'‰ S)’ü}°¨3‰ƒ)îPgkK¢ÈõØ¿Ña¡ƒ￯¯Ï÷_Š~ýÇôÏGèÇGèoÏ¡žÉæ!9Ê~”¾þod¬øýýùùQŽß=!>õ»§1ŸÅ°§Û²#ZF"Æ)¶± ‰4»ßŸ#°%Q»žáœ ÑfÙÄ oJMy¬7žÁ¦ÄŠ+“DrJâÊ1½±a¦»mè¹K„n>0²Çâ3ÖI ïuËá¹2¹ÂIDXÌHJ8Z76¦’]îï¸Ü×#-¬ž;’•$|ª7nÊ\¦(Ÿ{î .œKtgê9ŒÜ‹²{ž`›ûsÆ­ÁÃj;Ф|ò&ød’Êp#b¬TKïqœToΣԜ­kã \žÚ° 2ã,ݤî|¼6vMRGÜß³vSa\";‚VÒhÃÁ(Mc+ÙØ ²y{ObûYËøXl<‰¸nÂ$Y­1£õ†$‡(iú@’kŠt”m…[u̘Úíc´£Œö–âì&b¼Þpc½…‰«µ÷*ˆÓŒL… e(ý.ÓdÁ˰N‘™Ü^á4ÄÁm÷÷é]Â'ÖÐÃæd€#=\ÇÈâð6­ÊVÌë±–Ü÷! ¾nŒ÷Z:£UQ@šÙ Á@ê•ó"ÞÌZÍ-Zµíî×cí,;‚ë´nž*õ›ƒ1n4 (vKÓœh[ ÖSäÇØ#{2Âüž‹D¯ÇÅnë*¥È¥6¢µííª·ù´8ðÏñ?}€¹éE#½7áV[آÒؕ»Žv©tÏ‹FvX+\8—À7fDîjb²8í)ŽL6žÉ(-Óí÷×ã%ÌXÚÉ+xÌ7H{Ÿ‹EæÛ¶¯Ç;.Y0àÜç,Y,¦úÄÅ"ËÛq΂‘!/Cqü‚‘ÕÞAœáÂúè+$6Ä/¡WÃ)d.ù¡Pç¥)¿»z=¡sqȅÂÂìâ+›:…5Îãöðp[r€‚Qx/ŠûÞW„±"E @Lˆ¾@äÉ¡F‘z0,N‘uaȼ‹¥1$Ž#PÔmS‰³ä­¬˜–Å×]|B@Äî6’0–PŠI®ƒ7\Üz=y„i`U£<¹(‘`4J ûÌRÁ%ì”ääŠ^LO=܉wΖeê,ÉÃÕ(Ø´³w²üEiÁ†D¤¡ÓÏ–Œ¤/’¿žôXæ–Œí¦ôY(Ý<3|¡i¾?ŒÎN·PâMˆëð œÍ”.~,çð*Û|dõåЊmølã„(©Ü3½žì怄¨Ût9ˆ’NL˜f Й야ž:vÑ®uÑ· VLI¡Tà+2Y*©•ÒÅUTªî 5F©€èÀÖ-ÙB/ïÆ–|Êr»WÆ­ÊeqVpé‹Nåy(J é7¥NSE²è]íõz*O“çzeå´%Øs/NÎ8;ÐdÖé ¤[@°®p„‹JŠ­±Ý\Ô\²††`ë¶±¬‰‚A”…\<¯Æ6yVl 4“*Ew­âW§¨y󣬾 H¿µ®\`Ò‹xò6Q gXwP¬‘2—‹A*”:ì+¶AƒFi³åˆ™Ü µo¹„ ¼¥‹2²6J)ËÖu`:¸)Ѹ¶¢;Y)'×#˺(øÜæX츨«œítäƒ2ì-Ï^n¡N®w€[QÅ\Ààë[3ÍqSx^;­WÔ|s¨á™ ÓÖDÍB-²²~v`ìú¼Q²H‰æ’5Q½8ˆ3РAÝ}µ$LTÆüR隨&`Ò­@˜(s§[Ë\ÆRoÁ¦Œ@a|ƒÀŒVn§éáÉ…¥>àÜ0QˆqÜ-˜¨ma7$@`¢àJú. qïµÃ–Ãë®ïÆýBSúPŒúÕÂëôà×w‚&£I!˜ € ßHpéÁWbï`¥M-Œ¾-\' Ñ !…„)ãTë¥CïÜû‹ÎJM±Ä7ìÅPz²f ±Ã|ì ô ä·1n ØM„^\79¬þmB;+Ä,(q•ú04˜£Ù°)¸)hWHÐM-ÞŒëøDi õޏ1c¼ ø:z’TCõ‹Kï‹W.âyU^ÕÙ ºRK ½Ð6pR Uƒ°vÃ>Øz‚‘ 5&@ê ¸AÖF I÷6üëùù9ôëóÛ#û1Þ^_éÏ÷_Ч<J}êbY½ %ßôñõùå»ú ItŽÿéãÇ'ÀrGè3®?>þüüòÝ¿>K÷‰ï¿ì‡†ÿ¾û³ÆçÖû°|ú¬ÜV÷éÿÛj,ï“ù¨§Þ¯5*ž:"x2Ø Úô½‰ÏÎGÿñãùéùéùο endstream endobj 1812 0 obj << /Filter /FlateDecode /Length 179 >> stream xœ]O»à Ûù þ€Kª¼¤ˆ%]2´ªÚþ#b B†þ}I:tðI¾;[6ÆëhM¤ìœ|a¤ÚXpu[H'œ%EI•‘ñ`yÊEx†›ðïGZR…zçw± {–7Å®‘Náê…Ä ìŒ¤à½Öœ U§Ë.˜ôñYW< ®8é›–g4m¢Ïhºìvê’qJx¢r mÌ5rÌÏXü5õÎ'E«ÈÇ`YP endstream endobj 1813 0 obj << /Filter /FlateDecode /Length 162 >> stream xœ]1ƒ0 E÷œÂ7H`±Ð…¡j{à8(NÂÐÛW Сƒ-ÙÿùYãmd—@NÑã‹XÇ&Òæ÷ˆ3-ŽEUƒq˜Î©t\ur¸ëðþ‚ Ùc~è•䳮ʦ:2è mA#EÍ ‰N©¾³¶ÄæO:³=MÛ—Rªi‹ÿRr43\'÷‰S- À1ý~ >äñõ“S endstream endobj 1815 0 obj << /Filter /FlateDecode /Length 160 >> stream xœ]1ƒ0 E÷œÂ7H+b¡ C«ŠöÁqPœ(„¡·¯ C[²ÿÿò³ÆÛÈ>ƒ|¦€/Êà<ÛD[ØÌ´xºë1ŸSí¸š(äp7ñý‰ XrÇü0+É©96úÈ`°´Eƒ” /$:¥úι^Û?é Ìît¶º¯¥T««ÿRJ´0\'÷”ˆs­ À3ý~‰!–[ñë©Rî endstream endobj 1818 0 obj << /Length 786 /Filter /FlateDecode >> stream xÚÝWKoÓ@¾çWXQ¶d/»¶×V¹µ „8ÐH Hn²IVMbk½¥vÿ}%qb§J!Šzðxvæ›oYO‘ŲRhÅAÒ0±F‹TZ6µ´ðñM;Oz ËóaïÕ%Æ‚ …)²†“&Ôpl]Û¯gYÁ s¼ ìäÔñÂÛçYI´f‘;žŸØã»9)…CÛAçËð]ïb¸Œ}ÿ@†Ò²M1jRDÈŠ’  Ô,¿åtì_lWœŽn?C :âwŒh­xŒî#Knô®>xŸÝ¹ý¾Ñ2’eåÊT¬(°<„u¸"£LŸ)|0^%gt9Õò$g‹Œ+Dé;Òþü’>ÁPP–‚Á)ÈÒkÎd)RBg Ë[“A»É×ÇHžTÅœŽ(7ÎëT(ÅÅÿUŠ ¹úE%ÿ´Ü[-Æ1ðc¦­êü û­ ­ æ²Õsrb?Þ¦ÍéÔWâàêñ®Ö©f çIµ}eý•äŽÚÈŽD4üctwzþûäëa ?ý™FÕÇ¿1ÛÝ{aÉíïÒ±Æpwób ‚DÜî8(6‹Ø[ÂÌΕi!´Ë|aT%]s£%U&_J}’Oô“;bM»wüØÎ½1]eIó¥ì•<œ²¬˜•§º’)€~jy¡’ Õ±p¼(‚öpF%,†« úeÌ2…nÎ2ýà¤â7j;Ô;b~땊E½òSaµ(hªBˆoZ£×ê¬îª‘8 ‘=X±)do;!ìªÓÝ–Õw¥;¶ï)74øŒëZ?ä×ZÖ aèÂÍoIbE €­%e"é¢Å_Ïr=úÒPŸýè ¼¹/ƒTxîd » Ýd+fñ^𩬥0q½Ðõݼ ,ã¹ €j?#ãvÚ¾ªdO%@ÿ¤:éo™5î²zcUŸô»ªhà67r/ö¡)#F¾Š¨®*ÊÖ½ÚxÉÿ¬~ÄH endstream endobj 1822 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./lineargraph0.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1823 0 R /BBox [0 0 400 201.01] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1824 0 R >>/Font << /R9 1826 0 R /R13 1828 0 R /R11 1830 0 R >> >> /Length 2356 /Filter /FlateDecode >> stream xœí™MÇ †sî[w ]$ëƒÌ- F.’ðAöII¬» d’üû€ÕU,öîØ–’ÈÈ!ÐAêíú"ù>Õ3ï÷¸'û3þ~ó¸}öªíßý¸½ß®e¿–ýq£š ¨Ù‡ÿ@ î&;}è²·R%`Ú1aÝ7l¹@ÁããÃúˆ’Ô"SÿŸ$Râ0Çg“dÌÐC'ÌH¬¸ª†ŸúeªV¿LUìßûeªb¿¸ÊûÅU¡_ž®5¨n¬~õKÎ Hzj˜©Z 3U±c¦juÌTÅ–q•·Œ«BÏLÕꙩŠM3U«i¦*vÍT­®™ªØ6~^Þ6Sûfehö«Bã¸ÊÇU¡s\åãªÐ:®òÖqUèWyï¸*4ÏRÍæYªÕ=®šÝã¢Õ>®™íãšçýû9onÔ©- u•”™sPy$¨¤BÒ òHT5Bhq,aiÀq,DÕ *McYªÊÔ{|©V3Èq¦˜ªÕ¸.UI ÏkE‚JY¡´¨òÈR·DqõYªç÷ôŽðónÉÈÐj=åq©f$ªfÖ–jFNª‘µ ‘¨šY «‘“ê'ïFQ5³¶T‘™è”ǰ®‰ª‘µ š‘¨Y ª ª™µ°ú‰cõûõ«·0ÃJ5̘ñ˜Yä"ÀYv¤T@¬U³¤aaEmÈ’°×'{¦CÕ~aMЬ乿1yc© ¨È޹èq?.¢²±+ÕÃ*&Ê;–‚ÐÙâÝR´@íš’mîÊ ŠU`m°Ñ޵5;뇭jµŠo¶_›«¡BcÙ±e…^·-vlB`[j•{÷"‚š·6)¤î(, FI¤™?ŠL#$Pm‘ `˯ìŒlçÒ{ÇWh6—¨ý? íQ± ì¹°ˆm­v?Àãþ¯E¤¸ªà‘×`Jt¸Áõ›O…)WèÃÌ¥,£™ËŤ R[BDá°mDf¨Ž±”Ã"çñ!¶(ë„U@kȥ'¤L=-žK¤šCºÝؽ$Si¡lI¡–PZÈ!çP~È»áÍ E>U0f;#]EŽ™¥û¨·暀KhÌB€±Ü£ý‡…J¿”ÛM¥?Tr³¬¨æÞ3©jÛ×L€õF±¿%h2éÆÉ’"¬Pa*gKJ…&}ÓµTKŠÕ:ö{ Ú¥e¯Ê Ú÷PU-+5 äÔ#ÃKkÊPG$³e¥T‚ÖªÕŒ»õ}ê—-lÒ,+Y ”#¹’IJ‘K‚’û®ìíµÖ=£ôƲH!Ë ‹/çÒ²e…+e-Zw¶ ö‰›¥…±‡5}Q˜û ÚŸÞI¸››E„-/ÔRÏ ¥”Ai§ÊÐú(Q3\éVa; °£ÔRÿ"h”:>Ö0ˆl‰ S!KÌZޣɗLØÔ³¶E”œ¶NDýü×Ùå …ÃùÕj™YgL$Ò3ãy ^ÑrEÌh™Yù$»ˆæ¼R>¹²ª‚X›Ī²Y›†ê¢œ“åfU eûf¥†*¥,Ù:cU2»¹Ò*v*Ôìe×ÛJÖsËPih©Ymõô;#¡qO$\—ÏIB7T'¡ª“Ðu’Ð ÕQè†ê(tCuº¡: ÝP…n¨ÎÂi¨ŽB7TG¡ª£Ð ÕQèŽ:Qè†ê,tCuº¡: ÝP…ÓP…Âé©„î§NB÷S'¡û©“гê$\†:H õ aðÓAÂå§„ÁOƒŸ? ~:@üt€0øé áòÓÂà§„ÁO; v:@ìt€0ØéapÔÂà¨FÂ`§ƒ„ÁN —ÇM.œ(\^ùôâë(Œ’…a˜Â0Õ@aXÎ`aXò`aØÓ`aØ÷`a8›ÁÂp~ƒ…ጠC Cª C: WÆ CQ †Â, Åe, Õ7X*t°0Tñ`á*ôÂ`¦…ÁL/(\]7Q¸:s¢puïDáêð‰B7µv˜$t™ \N3A¸Üh‚p9Öárµ Âe|„Ë'—N.“õ7åéÄ˪'—O.ËŸ \X˜ \è˜ \x$\š$\r:Èn}ûòòô+¿!’¦d!Š‚Ðþ¸q>GNuy¹Fùˆòö F±¸0õß@XµÁ <Ìrm¶Úæyd=ôvû*ü^ô¿þËLÚ¿ÛÞoØöÚÇ_o÷Ïï·Ï^Ù7‰ ¥Ð~ÿ—‘Þ(–U´:¨ûýãöúî—+I+íêÝç—© Þ}q1ƒ*­L¥ýöþËí‹ûíåöòÿ?®}Â"ÞÌ!ACÕ²$<²ø›KDÊb©y’|b•¼§ýþOÛë;¼\ oôÐö÷K10vñÝï/÷ß?ŽÏÃ¥§Ã}E.*»áÁVÝŸùˆÕ>þ?[m9 wÕóºþË“¥'“õ™¨OI‰•ý­)MöëÀi¸«Ýmê«Ìzµ‡þy¹fhªŠ7J€íB§m¿jñeÛ<­1 ú”¥Üš2gÛ~øèr%V„&¿4r¶Ì}ðÈù“\çÈeŽ,¥ýÔÈVà<²¬sÆŸùÚì…ÌR‹cŽþü?. Êr Äá]?|$­8³ý ‰XíÅ©ûÜ—l·b–»¿¾»\R%Õ»oî M™JÆžL®…n­™òQQc¯¿½\Ùçe?]­cVÔë»o.>ïñXñ¿¹CHvIï[|sa`)Rïþæ[ ûþˆ½VHŸd¯/·f—ý^ endstream endobj 1831 0 obj << /Filter /FlateDecode /Length 271 >> stream xœ]‘1nÃ0 EwB7ð·$+6`pI– -жpd*ðÙpœ¡·/H':<O)ˆ¿:žOç2m¶úXçôÅ›ÍSW¾Ï5±½ðu*¦vvœÒö4]ÓmXLu|–­³#çÝ߇WŸºSï5iù¾ ‰×¡\Ùôõ9“á2þ;ªÛ½â’ŸW]K àZ2½ëH\G¦÷ ð­I|-êH¼ ¤>ˆ6¤¾¤>ж¤^Þ 5)@ÎÁ‘éR€ ­B"‰L=)@ô¢)@”/D&ˆ,šIb&Ó<)ÀÁë¼^ƒ‘ÑI¯‘ÛôXW.›¥AHSá¿,—y‘*Ëe4¿Ÿ‰ endstream endobj 1832 0 obj << /Filter /FlateDecode /Length 186 >> stream xœ]O1ƒ0 ÜóŠü*R”…. ­ª¶‰ƒ2¢C_Å@‡gélßù\týµ~åÅ#Íæ…+w>؄˼%ƒ|ÀÑV n½YFÕL:²¢»éøþDä‚[t;¿ë ‹§(©Sî3[\¢6˜t‘I%S ƒý]vÁàŽÍ²U¨ (&+­“u£u“i«uKæ§M¾“Ÿù¸ÙR°ÒW”:§õÇ9fÇ`Ù¾¶] endstream endobj 1833 0 obj << /Filter /FlateDecode /Length 159 >> stream xœ]1Â0 E÷œÂ7HÖªKY:€p4ù©2àDi:p{”´EˆÁ–ìÿ¿ü,‡ñ<²Ï$o)˜29Ï6a k2  ³gÑ*²Þä}ªÝ¼tr¸èø|G" ·ÍWý‚¼«SÝ´[Æ‹%jƒ¤y†èš¦ïœëØþI{`r?ÎRJµªú¥D Ãq’Ìš8WÐ R<ãûK ±¤lÅêRê endstream endobj 1836 0 obj << /Length 901 /Filter /FlateDecode >> stream xÚUKsÛ6¾ëWp4>€’@R"“É!NœÔ_š*';š‚$$|•„")þ÷îbAKjå&£‘°X|ûíð8|„—soÇQžd^YO¸Õök„&ÂáB†'ÈëÅäÅû4õrž o±:¥Z,½{övStFõ~Ç1Ë^úa’¤ìºiêÖeÆ–ÛJ ͹˜3!„ÿyñÛäfñä8•òÿ#üó£Ìx$ay”¥1Â_ÜÖ2óÞµ“ß(düQ*i”‹ÔKD¥¹¤td䇳g‹ $@äÚ”r¦öEÝUN½ì –Ý@gi‡R«õF?p‘”á`|9g‡ÑjÝ݆Ä6›3ÛJ­U³÷sÐ9÷9ëlùÚAÝ6lW´À@=‘F³,õBG"”‘Žg¬,-—¢M±ü²ŒrÑ`­¼ï*]jSpŸ³¶ÍÁú@òvÐÍšD³qŒ69]Õ uƒE€!Y¥Ã>ð”Šâçç¡? ”L9Œ ®‚Ýøtû9 ]W¬•;Í8 ¨Ycu»"-¤ ´ÐìÙi³ï-ϧ潮*ôÞ+ Gt_ýZ7¯y@ûñ$a{â Ö¼v tçØÏFiÌR€Š]Ž`.Øè¿SÏ’!P²¶3軎[m¯`M„*í„aÿPkÚç> stream xÚÅU]oÚ0}çWD¡„ÔÎЭšJG§N}غì©ÝC Xˇç˜:í¿Ïö $)”NÚĈonî9>¾ñq°äcd =Ïû##É:Hgù€àöCWuY8hTN¢ÎéU9c4ÆF4oRE3ãκ\ÆLÞxžgÎz߬I\ÈdEoàŽ¬Ù*%¥Œ†-ŒÝÞ·ècgí&\÷¸ÂµFŽk \7tÆØSå§×™;6ÞÏu•b|e)c'4ü‘ïx!†ÕD½‘g ½dZ:Iè|™†{„ý5™©ß*éSµÔyQuA, <[ð˜-!ÇxQÑq2+Ù"Ù)*lŠºƒ™„ˆ“eõ¼%úÎ:;“ï ‡N8Â:hÆ .z² ¨x£@ªJvÍCÕj•ö{ 7@¶‹}½È N.JF!óø ˆ“8â/4Wè:¡AþâD¬x7%ºŒžïï-1öì_åß'Px€¸©xÆãGU¦¡)ÜF6V›“™mvï±çoUª˜Q˜`­jºf«MÍ{ÔRúŽú!]‘Š{+ô5î¦ìu¼¦ev×]ÓžBYT0û†ÌED“ï勲65t#¡ pKKaëë‹iJóÅá…âzQJ?TóÝ\L¦7¦Í š«Ž#¤Wú5¿¢©.ÀYv˜É&ØØª2% ’ÏT¤)_‘ëT§\4­™î¹¶Û>ö °Pƒ“8‡ä2îIûýT—Êž™ŠW© ,­,Lr•œªÃJ•l=[ñÒœü›ûôKj›o”dv(ÿÇÍWµOl™‘9P×þPÑ<Ù¹q_Ô“e€¹j[Œ5,¦¡òpôe³ŸY´ö^NëÉÛ\ëãç;YƒYAãàÐL,OX…—›øè¹\&D0¼…!¨²ý>ÕJ^ZΞ{uOè Ó°?-’šÌ9¡¶ÉZ‡ˆÙ×q~cÕ’w0˜&Œg0¨úRî¼|Q7OÏØ7òsè¨]Ø|ÏÿñäPõ?œ0g endstream endobj 1842 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./legend.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1843 0 R /BBox [0 0 251.06 237.02] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1844 0 R >>/Font << /R9 1846 0 R /R13 1848 0 R /R11 1850 0 R >> >> /Length 3213 /Filter /FlateDecode >> stream xœÅšIÇ †sî[g|t‘µç 0à›ä|°sr;†dÀö!É¿XÅ­g“ìDtЈz»k#ù5ýÓ™ÏÄäïoߟ½íçw¿?·zÞêùþ Šë§wû'ʽ@+ç;\þ±4ߘ+L,gÚÏòkßíjЫUóÔ’Ö;¾úÃùãÁOREäQÒùóߎ¯ÎsŽÞÎx~qàùÑÎÏ¢Œ@ùs@KkÖb¡œz?ß_>§Â^ 6³DR™Ð¢J-UK ÚŒ*±\T³"ôUb‰*««ž›ýl¶µÆD0¦Y.#¦•€ÞYZGh]ã á‡hýŸ!P«`C ÍLèœ Ð«tE N hd´Â(h‡á¿CPwQ j‹c 4G0ºÅ@hO)W Bo÷„Þ# mB]äË£¾WÂAßMå ï¸rÐOE9觪´jÈ0hiÇ0h…—bЪ5à¥<àU††A¯'ƒ–o…‚¡r †rW(rý¦`¨¬…‚Ѳ)’ß”ø{ƒalàNO)h P z/£í ç~m½oÒvл-m=Õk;èÝ‹Ý`è!¥ôÎSÛAïWµô<®w£ÞëݨµÓz5êY[¯F½q·«Q¿À|ùjÔ.]õjÔó¯^‹^úSz5jo¶«Q]¯FÃ]¨ÞŽÚ*ävÔÖ©—£¾ÊÁ€½ÍAßQå ïºp0œÌæ`8<á Ÿ¯`0¸€`0¸‰`0¸’`0¸›ÞºKêýhèãä~Ô›¿MÁØ1n †ø † z˜)£eSП²ß¹Ù›„>ºµƒ:Aëm ÆBï<•…Þg* CW), =¤°Ð;Fk­?|ŠÂ7Ï~4&âªòF?sݼxô’™år¿Š…2 rä”Û/j|ürþè£^®– ªõå.——_ÕŸ˜9”ÊI°?ÐKùû½õš ÔÒ[ûÔ²øþøòÑÇ~œrì{¿õ»™ÌÑ’í“?ÿGüä¯TûäÒ¯þøgþÌod£Ê§–}ø—ÎŽõ9a:å¯oߟz8>{Ë!³V:þ~ì/ù~:ÎyŽ m$<Þ_ßýî¾"•ñ—‡/ŽÏÞrïOòç;Ì×t>üõøúïo#wš"ÎQ\a .š–øî÷?ç¹Cb¿ O×°'˜ÅƬõ¹1sßO}üèþ†}L¨ùC¯Î€”ò¯xuÑWÄ›9¸?þÍíÓMzøV‹»ŒÚŸ=Þ:¡ò´o˜ óëùÝg˜¹Ságþüp¼9Þ ~~9ç]g¤I¯“Û;Ëw¿Ü¨½–»üxŸ`öŠ8ï¾¹»¿!*Ïú ìy²¸ßßßrÂ1¯ó|2ƒÜèë»oîeŒ> stream xœ]1à EwNá0GYÒ%C«ªí|"†DÈÐÛW¤ª:Ø’ýÿ—Ÿå0^Fö™ä=óD&çÙ&¬aK4aö,ZEÖ›|Lµ›EG!‡«Ž¯w)²pû|Ó äC5uÓî,Ö¨ ’æ¢kš¾s®`û'Éý8K)Õªê?•- çI2[Jà\A+HðŒï/1Ä’"°è³Rç endstream endobj 1852 0 obj << /Filter /FlateDecode /Length 186 >> stream xœ]O1à Üy?À!•’Hˆ%]2´ªÚ~€€‰B!C_A’ÎÒÙ¾ó™õÃuð.Qöˆ‹~a¢Öyq]¶¨‘Ž89O*NÓé`¥êYÂú› ïO@Ê©A»ó»š‘=ùÞ©v^ ®AiŒÊOH€ÖJ‚Þü.»`´ÇfÕɨ5H"j% 8J"šV4m¦,hºb~Úä;9ð™ê-Fô©|URç´Îãïñ°„¬¢è ù¿] endstream endobj 1853 0 obj << /Filter /FlateDecode /Length 242 >> stream xœ]‘1nÃ0 EwB7ð·è8`pI– -жp$:ðYpœ¡·/H':<ò«:žOç<­¾úXæø%«§œ¹Ï%Š¿ÈuÊ®>Mq}šñ6W߆òýSÄŸdÜü}¸Iõ«Ô[Oœ“ÜËeòU\p?Žì$§W5m—ñù4tl¡cׇ@8°ë lÕš €jÕÀ@A•؈T6jTwl´SmÙ¨UíØHÇhl­ŽÑ @+ìú=±ìÉ–|m£ûjp¯œ||,‹äÕÒµô4µ)Ëß”¹h——œÜ/ðêx‘ endstream endobj 1854 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./datagraph.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1855 0 R /BBox [0 0 200.49 150.82] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1856 0 R >>/Font << /R9 1858 0 R /R13 1860 0 R /R11 1862 0 R >> >> /Length 428 /Filter /FlateDecode >> stream xœ}“»nÜ0E{~Å”«B³óàkÚw^«3R9ˆ#[)bÿ} ]QyC©Ë3^’o@È@ó·ŒÏçp<xù"š•Ã}`x w-V”ÑRs8fEßáq!EÖUqP1EÊÙAMqÐ’»3›b“Ú¦ÚUù’¤(ô¹¥+Õ{jÔ¶§MúíÔsßštƒ42¦xJ(¦êB‡X‹ %—itãäòß‘h„‘cgº ë╊\\¢UpPÎ M´ Ú9¸Í½ùút•³¤MjЧš-.×¢l¨ÿÜoÏ4c:´*5¡TÛXåR5ÅS‹5ŽjЧ.Oót·cȺU#´:eÛV¿µ·×à%¼¾<|X†ç3|›ÂñdPÐ 1Ãôk©ÌÀ‚šI@•Í`:‡§ I™Ëé>$ÅI`úžq»– R%¾®™_;ž˜-%™+ŽLXaLãšìc#3ã%B}'µ c¬óäCãj=pŸJŸê0Î|Ii¯Z°ÌÛ¹îxNú>(š‰sÈ÷)<„‡ð ú endstream endobj 1863 0 obj << /Filter /FlateDecode /Length 176 >> stream xœ]O1à Üy?À Y"E,éÒ¡UÕöLăúû ’tèp–ÎöîÄx½\Ég.)˜fî<Ù„kØ’A>áì‰5-·ÞäƒÕi™o:¾?yË-ºßõ‚âÙBÝ4»Æ‹kÔ“¦Ù çC²'¹ &w|JPd§*dWh¯*d_ÝN]1. Ï@Ül)!åZ£Æ,ñ<á¯i ±¨8’e_¯÷Y endstream endobj 1864 0 obj << /Filter /FlateDecode /Length 181 >> stream xœ]O1à Üy?À@Lj%]2´ªÚ~€€‰B!C_á$:œ¥³}ç³è‡ëbåâQ÷ÂÊCL¾àºlÅ!qЉIÅ}tõ`TÝl3ýÍæ÷'#WÜcØùÝÎ(žJRGî·x\³uXlšu¦ Á0LþotÙc865€Ã:- @ËF•!hÕ¨6­Éü´iwZà3w[)˜*}E©[Ú˜ð÷x^rSqLž}J”\ endstream endobj 1865 0 obj << /Filter /FlateDecode /Length 171 >> stream xœ]1à EwNÁ ,$RÄ’.ZUm/@ÀD 1ˆ¡·¯€¤C‡oÉöÿÖ3›®—+úLÙ#ó‚LG›` {2@gX<’NPëM>ºZͪ#aÓMÇ÷'Ô‚ký]¯Àž¢Mº–1Áµ¤q2r®Fç´+ѳ;œ²WUœË^‘QªŠs9Ôøi,— ÒI@Íž`®Ü•«ðx„ßk1Ä’¢€–|JÿV8 endstream endobj 1868 0 obj << /Length 636 /Filter /FlateDecode >> stream xÚSÉnÛ0½û+ˆ  Ž(ji‘CÓ6E‚\š¨§4™¶…h«D×r‹ü{IìÚI…køfá›7C Ìü€¤ŒÄœÓ4LH^ÍØˆvK‚Æí—Lq¾ ô"/²ÙÙ¥MY $[–ÊæäÞù¸’­VësÎä뇡p.d¯©×g¾.Uo¬˜Aìp÷!»ž}Îö‹ øO†6ò5Åè"ЈD±A’YJ­e¾úÎ+ÕRÕskæ‚NÍ_Ó0i°RØà“ÓáôÄ»h´™yÖ´ÞZè¬ÈŸú£Ô‘fnÿenM¦¿-–+í±<¤Ü å¨Ñ½«Én䣲¯’™åÐ; “vTl¤]« ¶Œí‰B/}Þ¹÷où/ùPSá endstream endobj 1870 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./filegraph.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1871 0 R /BBox [0 0 200 151.23] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1872 0 R >>/Font << /R11 1874 0 R /R9 1876 0 R >> >> /Length 474 /Filter /FlateDecode >> stream xœ}”;oÜ0 €wý Žwƒy"%Jâ -WoA§ Pô† CÓ_ØÖƒÎ…ÛŸ>ñeÁïà‘À/W½¿ÞÜåšáí·øãžÁOçáÑ‘jF–Œ>G¸5@1**Ã/÷õȉ ub¤"Å(Û»Zࡤä²ÅIŠ4ˆDB˜ÉH,Ù]Ív1î«Rk¬)£±O‡rj4Æ¢è5îk‘zcM:hÌÎñî‹Ý—TAЀV'{ÂR‚‘:1QèÙ¦kÄZ)Æõ «cÅ”0P2Ö L(yµ4,ÓSc 2,о ›±c•¬˜wÕw2¬»cðéÀÿï8 ˜SÚMtHX«ÍϤ«dgÕù«kµù «“"™wV'Æjó3±VŸ±±Öú×¹>Œ¶ÆÇþàøzxsïŽÖ?ÔÛë fw¹*¡Š0Ì?jb̤ L0ßÜËÉŸ'Æräoó“ó Š)z†ù»{9ÑÁbв-ònñr%²ù&"$Ñ“$ŒÛŽ¿ç)bVUÚvì L0eFZÊ[}éÖ25,å”+éTé¤{š‰Qco@¤=&áÞ³ÈQåêQ×ÂÉcèµ|œjÈ—-_f÷ìžÝ?¸§:é endstream endobj 1877 0 obj << /Filter /FlateDecode /Length 171 >> stream xœ]1à EwNá@²HKºthUµ½1Ä B†Þ¾‚$:|K¶ÿ·žùx½\ÉgàÌ 38O6á¶d&œ=±¦ëM>ºZÍ¢#ããMÇ÷'"´`Ñíý]/ÈŸ¬“fϘ`qÚ`Ò4#„PƒsŠ!Ù¿U»&w8e§ª„bƒìU•²¯ñÓX.¤“Ì–R®Ü•«ðxÂßk1Ä’$˾M²V< endstream endobj 1878 0 obj << /Filter /FlateDecode /Length 197 >> stream xœ]Á †ï<o°2¢sÉÒ‹^> stream xÚ…T]o›0}ϯ@Uˆ® Ȧ<¬ûR§iÒ*ÞÒ<¸àT°™1k²_?›ë6I›nŠ®¯Ï=÷ƒs!6?â-°—Å1Z$¹Wv3!É|]|›}.žÓ(úw…¿5Ƙ"“Ä I–¢,ŠmÀÕMý<à,çÿš¡hA¨GcŠhN¡¡ÍÃ4Å~Q7ôÀw¬ëÛ©¡Äj97 =º;{ÊüG8h Ï­b} f)Û±ÄÊ 8+¦Xг î6JvàsWw˜$-GvR¦ìô¸lBQšÛ˜gAÙM×K¥ç¦k ùßÛH3‰0JQŒjhþð;Lq„q@(n¶B*þaèy©ŸœÚ4¶yK܈e#úÑBñ…uO™éçÂF£¶ý ‰¡ŽÊôÛ®Ö«5Ð1Ãv [jÅÄÐËabc¯+‹Žé€l·d+¼>GwŒÚYŸ%«{´é¦ž¬± ö6s xõælvl× Ó8.w—ÁµÔZv…ìƒï|£‹¦|ÞœÅþº7¡6à¶ÙÖ:˜þOcí®V ")Ê Œziö$ÿäÿ¶ÊIœ ˜dœ>«ÜêS_ðë wœØ¡Là¨Aíf$€§a¹ËIÞÆÇ„{*œû{8>]—ö“ùRU`Ú¥ïY£†ÀØûãЈ-¸7ŠuÁÚf+ÂiÏú?¼ãŽ ›JÃ21Q½Ü´Ž©‹àj@ð‘ºnkk÷­jÍk›@kÁ ÌM°RŠA«±ÔÜå|lt}nk±[ØØUl˜ìwÓªl«…ž™`Xâàp§ä¨Íj½r,­-dÅM1v09F$''ƒéÍ`¦°~YŽJq¡ÇQ› nõ¾ç§§åùŘÁ9ÍÞKٺݽ—¿¹ÙÓ‘Ÿˆô/ïl®& endstream endobj 1886 0 obj << /Length 1780 /Filter /FlateDecode >> stream xÚ­]oÛ6ð=¿ÂØ“\ØžhI¶ÕÂí°n°—!oih‰±…É”JIIÜ¢ÿ}w¼Ó‡m*Ͱ!@LÞ÷M‰‰bû“u,âp3IŽ7¾…šý„ýv#˜n„óå‡Û›Ÿ?FÑDø‹ØÅäöa(ê6Üy¿dY+3AàmÞNçayd¥r,¦óåÆK›\U°Zûbí Mïoÿ¸ùõ¶;8Z._©!Rþ@E!Äb5YmÂ…BÒ²©2½V«¨Új镲> À¾²ßY²Fgu’™$WL]Ò,½Ï~äWJ‘ܻϾó¼ž.×Þ©Ä»zê~†¸ŽÚ3U´&Á`iš‰lOš¶;k3•Søy"m•Lpw ÍfU‹)X$öÞkDžPU0Ó\ ÑÍŒ<²/‰òƒÐÊíh“–÷ÿ)S«”ÀuAL’ý(ÍßD1#<~µƒ˜ÎGF hñ­ÆZ!ðaÖ#MÑÔ™VW€-®u‘ªjf¯¸ñb#Îî¹+Šœøä®xTÛÚ4 MýÎå¾y'` é'°Î ìb&ÛðÎõü uJ°½‘å4†@î 1Vè˜Up%ˆÕÎòæU–*–jԾɥ¡Mi][ä§}¡Ýñi©ˆ™éšœ„;áWdÁK\ˆ½ÅÚ_½p ÄŽÝ‚µÍlÕ$)9%y–ðÚU徯Ú_{ÉTxH1¸Gèé݇|Š+ˆZŸrø%[ÔÖ¿6j€¢Ÿʨ±hE[2†q‹‰DèeP¿ð“(W”uVhÔ¡Ÿ¡ÔdZ+óaL³¦²Š¦:.š Ž+Ì0$Ý5YÎ I?ISÕÅ‘Ö}âµÍÈúx³ò~Ý¥P8÷¡0G´EoÕDi(Ý*Ý>ȼj-ÛGÓ…ÀèE î’uË1n÷ȇʑ¦@VƒM}°öó—\®ãPÖî(YÆñHðjãñÅòÓÔn«R&`i(©´?OlA œ&¼îlX0V{½‡®`Y‹‡ÔL‚=ÍâGÿéä#mõDÞ•ãNþðºì©÷9–àheO "®<È©¼'6Æa_±ÒØ"j-é†kÛÏ,Ö&ËL]ýLXt„åål‚æÒlÃø§,çã¹9:îõ”¯G W8Z-JQÒhRÜ[g¦´8·Y«Äã4‚’ŸÛTƒ´XCxŸ\Ë:#q mxpÓ0B¯“ÁBk^MšJÑ¢o9–ê…Ôê3˶¥‘;A¾¢§BëK£ªzJÀƒìVŠð(ª"XgnÜ”9ÛÖÄf„~P_3¬ˆ±sÁæÚb` N Úø !™ ãòÞ° »]FmAµ5¥”™¡ñ·}u®Ûq+5C¡Î]@àÎWÕg¼¸  Ö¬aHæ™vZUÎLc‘—µÀ=ûµw¨Ç@apsV”~lÑÄ/ÂÚøÅ5Çic³ öàš‘óÁhcÇ¢}ÆÙîälwïnÓ‹Î.8ððè~{Pݘn» d aõh4E£Aš+mµJß¾4ïm†óÞÝ=ÍbÂnûÍCyj]E „Ô:ì'>ÍÜíV¼éçpФ‘˜%)ƒ¡(@rËâD‡úÕ#‡ÄL?ÂÌüÆy®£ÇõŒI;ô„©rå@¦™<:½¼ZNÓ†wáL‡±¿¿k5Z®/Æüõêþÿå³ ÷‚5VOójW„ç|ãî‘})zÄ®ØüêGö¾ÌÅëäúñ,eÎo2ègüü‚S`40Ypbò4á.\ʘÂì¤/[\Û«·¯xº=YJaÑʵAYfIÝ~¤Áf›4ÆÀ$Ép~ÎaGh£ê«––ü”‹àøÍ™_ÎÈŽÛoߙѯִǔJó¢SFig8QÇAÒ*ûªèéÀ9Ój2ÌŽÿd<«Õ÷Ù;9,0P³·”‹9-O.èñ¹·Ê9âd“ük³v†¼~k·÷„=¾\°ã/Ûï1"öè›IQa#ÅÙÂÎoô™BlìãÕ.´ÚËs”z®U7ߣ$;O‚EoÈy,Çðq{5Áwö»ÍŸÜUEÞÔÌ-|Õµp±á~iÎþÐ\‡z­¯õ*ñ9•ušáW þŠãÈo IË‘ÌëÞ@,}=x¡Ú³ø õ«:ŽÍ0;ÆÞ§±á¤°Z±[Ç뢦uEc™J2œ2T:7j?ÃUY;ÝsÁÔ|YRÞ½\½žmÖ-}ŸÓñd÷"ô|ˆäº5³œ3K?û´×…Qï«R%u_ /5”ã‡í7Û[gÔ]íÚŸ-ýnû³Øî¨ûá7Þägþù endstream endobj 1889 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./errorbars.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1890 0 R /BBox [0 0 420.42 141.31] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1891 0 R >>/Font << /R11 1893 0 R /R9 1895 0 R >> >> /Length 2283 /Filter /FlateDecode >> stream xœÝšAo)Çïý)8Æ+¹BAÅu¥Q¤¹MÖÒ¢99“X«çH™9ìî·_ASP¼nûáS¤hqÿçGQð/š¦_7ÐØò_û÷ñy{ÿ1™¯oß·û`îƒyÞœu|.—~„ Í¥`ÓEÅž6â ÎzÃÑ¢7φ” QW.]Ag3¸d.½ÕQ­ž¶ßÿa¾m%]r–JïÞüõçö»ù¶䜓3ÿÙÐüº¡ù÷f͇ 32Ä`\H`C.¹4}°³¹lÿ:£8"äØMQ 8(JMÅLÐ)JMeôà<)JM!úúÿ%ÊDµ)êdŒ>F ·ç•-ø.h(p$bëSSRÖ9ˆƒi×âÁ«ŒD(§‰³²F=¸#E–€xòO á_ƒ´} û¤Ýh¸× m^ϳ›× íÝõ`t2ºaOЧÉ;¡†wBió„æ ¥Ýëi‰{)û:ÓíëЉª8Oà‘Ñó>±–4*¤+‚äÚ¿WHWA·WØÈ¦ ˆóü?¥#ÇõÖ+¹!ÁRË Å9h˜ÁRRÔP…è=8§»ëŠ¢ˆR½;ª+ŠJ!DMuePÇÕt}ƒ|}ezôÐ I<( —$Š‚šQ*§]ÐHœýðNC/î ·Ô@6Nþ ª+Š·T‡¢hª¹¥(Q4ÕÜR”(šªúÇÚ@Ùgp\ñ¦„r£’Ë!BŠšjÊDI¬±ûI;½ûa²œñ9ƒ«[¿ÍA š ¡VÜ`š 'mÄi‚fRÎ`Ë^Èb ”M]™(·o ‚¸äúq“,:Ѳì®Æñ¸}ù‰ÇöTë)˜öþ®0ƒ·e›¦PžH)3PÙUZÁÉõã†è,$ …@*@»n]”M‰\tFX´ÚuiÐrèD˱˜GQ|ûYGV]KLàH?!v%xà`0%‚ÏE2cáF*}¦R $ÿ¯ÔMV åz]pQ›Ñºíí=ø~]HßBHn-Àœ|5ëçÐS½9~Øú ß;zô½at7·VŽ|(Oœ>B‰0â²9p(§Áò8¦‘©_?nì 0 Üè-ýºöð¸ ÁyˆÉôöè!8ÕÁ~ý¸ÑSlæ1Ô»êáTÚ7çŸrÄR!GˆY mQ’Å}Ê©žïDyOJ…‰ré :!Õ·­ÕQ­J„ÁíJÞÕ3ZSêÃ/íÏ"'”%‚º¢©RÍ™PQ¢hªž£W”(š*GEdÝ£(šªgEVP&¦GA'#,GÅèw*9ÈØM•£¢ ¤(Q45BéÃcÏ«œ)+J”‰*÷DM5¥P.x[´á(zŒg'ˆ“‰ ¤=hxØ m¡@ÃÂi{žâ`c”×CÌÉØ†.”U&ÿ„þ ¥ýjø'”ö¯§ÕýJûשî_§NüS5z² Ï&B¢g©QL™5%Š¢<† 6(ª+š¢ä¦DÑTâ˜5%Š¢NÖa¯m•}ä™tö]ql{=c­+ïSU]Q”ÇXþVTW½œf¢+ŠÊDýõÂNuePÇv}ç|}µz$°í홸¦¨¦hJ\”(Õ\STS&ª¹¦¨¦hêåcʾ¹¦²…Ä8û¨zESÍ5E‰¢©æš¢DÑTsMQ¢(ÊE›‹ËåI-§¤zwÁî¿ZÇå)Í–ç4Ë“~9°µÃ»‹Þö€—Nx±*!3ÔcáP8–w-ªUcZÜËuG—íKKâ㇘ÄSPÓ¸žÌ¿"ÌAΕÃðn +a“´¤,D>™ìe)òÑ´å 9gn aŸêÝ §r<¶¬Ýoe¶žÅ¨¼Mß]CÈ«í¼M¬›”èë8Õ¨1-ð座iÕüÀ,¦eã-Gð±Gx>ò+ÂäT9ŽoEY‰|œ§ÛÂJØãl¯(+‘®­(oÈYY³¢ÜŽ\W… M,ïæsݯ(r1,zTWag‚›vÅX?)%lžZ5¦E¾úšÏMd^?D|ê!žO¬)sœså8Èe%òq²V”•ÈÇI_QV"Í[QÞ³rgE¹¹®¢dËïi&c‚èkñ&L@ÉdŸÀÕJgB„Œ5Vd'%¹òl­Z Ó"_}Í«è‡&2¯¢r¢O¹‡x>i°¤\Å9UN¹ ,E>LÖŠ²ùdÒW”•ÈGóV”7ä¬ÜYQnG®«(‡°¿Ávû9FÈê 4h÷ß’}ö˜'Å!„0µf|9t5/¢™Ç¼†®NŠÏ' Ö”ëç™rãma%ìq¦V”•ÈÇ_QV"[QÞ’ó°fE¹¹ÔÍ'cMyqÁœÍÆšÏ[.?ÕŸGÚÏ"ýe`.©·0¢\F(<·P/¿%Ño¯¾m ¨¾m Ø>gÌúÛÆ|ü¶±}’¸,P>ddוKWꇌu nÂhóÚ‡Ö|ݾoX¿Õ4íŸÇgóχíýÇòC*äœyøÒ¦#ðÑ:ãÐ<oŸÞ¹Æ»Âmå|æ£W¹%^\ŒÇ/q÷R´gø¡åûˆzZîCfs°üXÕBýïî¾ÜãsƽÑ4•µ´J“˜ ÈÞÝ—Â…Œ}²B¨j$†œúÔˆê2õ‰èl‹}ØM%Ë`SÝ®–?c£ ált‰1gs|ù£&ûß;Ù'G¥É/Ûoõ§Ö7ÖÖ¯ Z[N…µ”.Þyðœò»¯#Á]‹Ìï¾ÝYÈ) æwŸëŸd3—Ðår«¸O"[ì3ZBpH7ë’CºÂÏëòîP—7ãñKÜ«u9ãÊÄ—êÒ•É8©K¶hã uYÆrR—ÌW“%µF×j­Öx¥îÕ:»Ö%¾>8"¾U–îåšü?*²§ endstream endobj 1896 0 obj << /Filter /FlateDecode /Length 171 >> stream xœ]1à EwNá@²HKºthUµ½1Ä B†Þ¾‚$:|K¶ÿ·žùx½\ÉgàÌ 38O6á¶d&œ=±¦ëM>ºZÍ¢#ããMÇ÷'"´`Ñíý]/ÈŸ¬“fϘ`qÚ`Ò4#„PƒsŠ!Ù¿U»&w8e§ª„bƒìU•²¯ñÓX.¤“Ì–R®Ü•«ðxÂßk1Ä’$˾M²V< endstream endobj 1897 0 obj << /Filter /FlateDecode /Length 227 >> stream xœ]1nÃ0 EwB7ð—å( .É’¡EÑöŽD" Š3äö§C‡'àIü€ø›ÃéxÊój›¯ºÄ^í4çTù¶Ükd{æËœkmšãº™žñ:Ó>Æòû(l[›xzùçxåæÛõzã^™¸$¾•1ró…ÍÐ0Md8§OnKœ§mÔƒÀƒÌà)€w¢-)€oE;R߉RD{Rß“BG d8ìHÂNtO ö¢‘ DQ&¬k¼ÿ+I5ï&l¼×ÊyÕþ´éeÎüWqYФ,çdž¹$rÿ endstream endobj 1900 0 obj << /Length 630 /Filter /FlateDecode >> stream xÚ¥U]“Ò0}çWt˜}MK’Òë샸¬£ãø°Öáa݇Ц%³mSÓ¢ ã7m).ŽÃLrî¹çäæåY3hM\×™§V˜õ Þ‰e‚û·=TçÙ2Ñîd΃ÞèÎó,œ!+ˆ»¥‚Èz¼Y“¢¢bh»®;˜^íñØÌIIÍNƇ6ž¢MJKM š ò‡ÁûÞ"h‰=Œ/T¨2%ú]‰!Ç·üéØAîØ¨,C‰öQ|óó ô PN¨Ø“6†ÀSñ¯WJ¤$µ±ï¸™BT.VD”*³`!ˆAA#iÈuW#"A¾7ɉ źEjÆ~JšG} ±xêø®_0øŒˆ'*¨ IJµBgše ýb“³*d"L©ÒîXšÞÖ|«tC5Yñoô&&i©×{¡væˆ ]K¢$VÂÔ8ÙŠ-Ù²¶ ý«íUÌyUñ,àø@ã*`áSy¶/»CøNÂèž%ë èñ ÞÀI5`ÓÁz¥\p–WÍ×—zÃO ð9W-:>R}x™^m5>‘ |йd?ša°U+°Óã»$炾. Vg)bA²š@Ýì)‚XJl\£rÀ‰‹/xºKx®6}}¼DPš›ñY+ž+ ^–û’ƒNÞ~ÇÖøÀ׸6öÞ·šN Ò­1™~pÏ6ªkD|¹ñZ_êÅ®€ýº‘ï«-áyTòå­Tñ—߆í¸ <ëòFÆAw¬j½j‚Š›yi&׳` ˯OiØ?$'fúÑt~ M¼ü'!øPÉâP‰¾ü,3•Ÿ„µH°h5©ÿ‘ß°ÜÞz endstream endobj 1905 0 obj << /Length 690 /Filter /FlateDecode >> stream xÚUßo›0~Ï_ÁË$ÒµÁ&I;&µÛ2uo›òÖö“XãW ¬Zªþï³}N)i¦)B¶ï¾;ßÙ¾` ɶfÈš7#S+ÉGH[ÅÊ‚ÉÏo#lp®ºäÍbt1§ÔÂÈ›¡¶i7ÕbiÝÙŸ×qÕ01vƒ °§—c—jßÄ5K^Ž]j/ÛŒÕr6Axbc<?,¾¾.vSߟáÓž#‘lˆåâpâù8Pð‹Û<¬/åèÇ¥2ž’B½¦%G‰rBoì†!²¯~ÒÖM™«9±óXü«(Û†FaàTúl‹8«Kð?êp]Á*á÷¶¼T…¼Â./L½pJ¥B%0^<¯JÑŒ¥,j¯D\­¯T¤”êú¡ ¨šoØ=¢ÈGÈÁò»]¥`×uÅ’FÚq?ÈHVºvŠT~e¨U¦ˆ±G¨"x²n:X°¦€ ö “ß%_ªøŠ'Òk²ÊE”´B°¢1v©ˆsƒI©Š›µÑ:ÈFö^Eugº8ÏUìY[ð&á"ÉØN}76-…Bó—GèÊÌ`øÁ˜±bÕ¬v¥ÔÖósþ.Ã-A.²‰ªRî¥Ó8¼w&=Vš xªYä †Èþ—ãKy–©D©Så/·‡é¤Îfs{ù ø6dYÍNl 6ÞÀ}‚áÈ¥;>/Font << /R11 1911 0 R /R9 1913 0 R >> >> /Length 900 /Filter /FlateDecode >> stream xœÝ–±n$7 †{=…J;ÀÒ")JT p} ¤8¤šàîp°)’¼} QâØ{AêÀÅšÿ|¤(’Ëטcêãs{ O5~ù#dhM‰ãŸ㇀ñ[Hñç€ ¨E’Ms|™J.ŸÃÇ[”ŠBÁ©x*kƒZ«£LñT%ñÐø÷ï#C‘rêã¢Lñ”umQ¦xʺæòʉ]sÔPNÔw÷ §¬k‹šŠ 0Ú¸ ©,ÈzæÎ3ÅA£e2ÅA£c2eA¯¹æ."hÖ+ °Nåy*ª -÷Ñ5¯÷ÊòúA5ª$(i_ž¦”$[lQ«BË•Aò´·€X*¨'D€\€Ã'tþ8C“§;P]ñ³ã#ñÜò3÷77ØÂ×ðËñ÷À5AÞ'JO“¸¶ôa¼0‚”D‡ÿß÷— µµ†‡Óé–”¡ÄKîïg­|º¿`k HçUDvµr¦™øY-7U=«¹)ä|‡'µÿ[dÝNäÖí4õbc¼`žÉþuÏиRî.?]Ãcx ÿ =ˆÝ endstream endobj 1914 0 obj << /Filter /FlateDecode /Length 171 >> stream xœ]1à EwNá@²HKºthUµ½1Ä B†Þ¾‚$:|K¶ÿ·žùx½\ÉgàÌ 38O6á¶d&œ=±¦ëM>ºZÍ¢#ããMÇ÷'"´`Ñíý]/ÈŸ¬“fϘ`qÚ`Ò4#„PƒsŠ!Ù¿U»&w8e§ª„bƒìU•²¯ñÓX.¤“Ì–R®Ü•«ðxÂßk1Ä’$˾M²V< endstream endobj 1915 0 obj << /Filter /FlateDecode /Length 196 >> stream xœ]1à EwNÁ bBeˆ¼¤K‡VUÛ 0C "ÉÐÛW8I‡é,ûS çÓ9†EV·<Ù-Ò‡è2ÍÓš-É‘^! UK첟öm’¨†‹IÏO"YKG~ó«ySuWWÔÖc'Gs2–²‰/=öÞ£ èþ®Ú­aôûK Èh@Ñk… €VEkdt]´A@7E[dt[´C@w<úR¶(qŽí¥]s¦¸pfÎT²„H¿oIS*]’¢_*zb9 endstream endobj 1916 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./monthaxis.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1917 0 R /BBox [0 0 400 150.83] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1918 0 R >>/Font << /R9 1920 0 R /R13 1922 0 R /R11 1924 0 R >> >> /Length 1389 /Filter /FlateDecode >> stream xœ½XA\5 æü~EŽoãíÄI8"¡J+ÔíÜ*Õ@+U;@A€ø÷(y±“L—ŠÚÃêóûüÙŽ'»Ÿœt¾þôß×Ûöð”܇߷èþÚÐ=nè>nÞ½Ú¸„è0%(˜ÝÍ !ˆ{ÞÞ¼DàÍ2‘B Px&©e"eD(1M$µÌá2”%\·Ì¤šãÄДHS†·aù%!„ÄKYÊu)k®KY£0eÍ…YD«Ì"N•-‰N”ÏòÖÒ×fÝ»+ä\€½DðE'FÂÁ4 ±DH¤ ƒƒÁ<[š '†ˆc(ŒÄ¥-qg ˆ $©rñ@¶òÁCËÕàD‘â![ …9  ­Ú€ånOv4Ÿo¹»£õå­K@|Y›h,µ,,íÜ`uË̲îK-3Ë:8’ï–…¥]¬n™YÖIc©…¼ ­½ÙwË̲~Žì»eaiK«[f–uudß- ë_æ’{ºO¯^ V¼úqÁ×½²lëçé*Áª6íÙ˜8Zá˜TÖ1!ÈRÙ}ÅÏ£_ƒ³ŽöZžw¶@ ´=³HÈ.`’Ëä!Ääl-:¾n=ø,ƒQ—pV0|ĸnfñ©-¶)x^ct\cô,”¡YªÂ]×íý–B†0õè6Y˜A’K!€pÝœ d7ºzàë–8š¸*>bT³ ê¡ uyæ¾n#‹Îy wuÔÚÐ'†8vÛm¶DHÁ¡—©á1ºi6|­;ÖC˜QVÃ-DuPK`q&ipà¡ç  ÍQÖ*Ze\2¤ù2è0zJ­;¸áPϯ±¯rŽ-”~ϸº+r°"´‹­;sZĬt ®ßóâ=eÞJIÄPpnÒ°kœ¨¾í¬cDhzH3ÃË*`X›d–¾Æ¦Ð{`1¬Kš„4GX«¨•‘¼LGkXŽƒA>D ±ƒ3f-ò!§‰Á´*(Öm?YÚÁ ÇÁ™æ©×š…1ʪ°ÖÑjã€h‰Ãr 4âäëêÀ³©m#‘ÚZÑĈiUP¬ãÊ,} ™BxÃF¢eaŒž¥)¬u´Ú¤à<½„‡¥€Pq$%BL.VÕz—÷ûGñu#ɘ'F¦UAñ£yt‹o£PB–%†âêqd11ʪ°ÖQkcOâ¸o“%AŒÑ±'‰%vv“v|­w+¶{Ó>­ ŠÕ£[b”ìL!†5FÇÕ£gaŒž¥)¬u´Ú8”6¾æ7ÍaÉ‚ì˜Clo£ºb˜½ :¾nÌ,ÊÄ`Z:î1šG·05Æ¡ eÑqõèY FYÖ:Zm’ä0÷Í,}Õ%!ø©+úº}Áú@Œ˜VÅÖ7µèª«‚vEcŒ¾iÆèYšÂZG­-xïç?;xœ.E€ìõÚ8g\²@ž¾gž|3O›¿Ããlt?=:úð³³Õ㪡çtø.ùÖ>mØþáú¯ëÍ}sÙžŠkS%’»¼ïïdt„¹d‡ Q<¹Ëm{»u €HòÃåq{xBœ —œw—··;žÎ™•ƒ¼9cŽ%;Fìñpéê!ÿy'<“ë¾õ>äýëÓåãgz¼êÅEÏ×Äè¥HçÒrN%ýyœ= –BTƒæ—vx¦Kqg9|§¿Oç©”‚/­-×GEõIJmKóy> stream xÚí]msÛ6þ®_ÁoM>ñ7™Î8‰“Ë]Zçâäš4éÜÐl³¡D—¤»¿þvY¡mù%–œ¦½å%°À. ,ø@EQøŒg¢p. þ›L ‹„Í”2@x‘i ž¯1«È¬˜b2ë $dædäQ™×j$s™ ÷) |9ÒÅ’¡$°8jha0×eŠ …”ÙB ¥2+y,«3«¥e²1×gÖÚX‹ÈlTÅ ÐÒ»˜æ³‚;‰”Í !° i…;Yd+±×Qˆé’ó¤ rR¢)œ´HÚX ¾¤X©Å¥©È¥D/ElÖ« ¡`K¬Wi$½E®•öXƒF^ã9HSh :A*2¨‰ÓpmVé4Tn=jâ4fA2’(§0ø­1 ûHÔÉÇ<JzÅáۡżU¤NRÈXƒ)2)c[œÐ[èŒÒš(È!é°vËtEX™IÃQk¼–Fb×:ë‘Äþvj0JÙê¤Æ¸Be²à±…Ȥ³hW@eK©‘Œ5Pƒç•tÀë%Æ9¨Á+4 7˜ªbW;ÐÌk‰mCOö&öx6tP´ØEúª6Ö࢟÷iÐö|ô¨H´\’K =¦Dê!JIi@Œ¥tâUH:¬4=ö4:>v˜Hiž:Ç! ª ©Àÿ±sÀ±•ŽÍôà÷@¢Õ=8›ÒÊÉ Øx+ƒ S8$AD£’èb¨è¤DR kxð%hj ãA‹h>cFcë‘t™3£FìI3ë³2öÄà(‡ã%ÒÐ1jA[h.ŋ￱m3Þ }ö.c/?ÉØ«pÜg¿Œ «{ur £<#öª³¾Ãy§¢—#ö2tͼ‡.Í51í‡0©Ê‡ÍqöŽC<˜t~Ae ¥±‰qk6k ¶wi.C}â\–Ÿ4<§H,2b»ó½>^?¯fFìaÓNB›äñ_P«1´GK‘ÃøËŒ9=Ãu.tfŒÌµÀ¶í´›±§Í«&c³{ûM;-ûûh—5Ä9ú§rE^@? Îà]n…[)³œ÷ ­ÆïaBëÆe]ÍÖÓ}½Ð¹Ái@ˆÜJTÆäÚ·Ràqö.è=oÞþœAý…äÙl^×Ëî¹ÎíníiÞ^ô4â·ö4˜¦Öu0à9UX02Ä^ãrÓ=ö¼Q+mý¼Ü õz½ ³uî œ¸ŠèÞ0­åð­]΋K<¬m›OÝ….õf½.…™f]½¹Y¦¾}í¾¬¯Ï´ÐÿÁ-Üž› 'ЧÚß )6ê’¬;*Ç…ãq]NÙo󦓽šÍæÓ½ÐvÕÁŒMšº.[vÀ³ž•S ºr6IÌTZv„¯Ã~Ÿ¨¶:8Ö®mÕ}`Gõ¼cãf:-ÙáÉÑa˜amU3a]]v‡ì÷Ð6¬™ÖjX؆ÀöÁìl¿úXW³.|„2!V:«€qÜÔÍ ’§U¢êÐu,ü6/kvІÄ‚v¡ë+È+{¶Å²Gì1ÛfOØSööŒý“ý‹=g?°Ù{ÁþÍ^²]öнfÿa?±7ì-û™íµåøCèc›ö€Lª.ROÛ7®ªqÕŽçS6ŸÁéÆM@ƒô.Ù³ ƒ¶°vÈ*ö+ûÀj6e3Ö°#ökYÇz6gÙ'vÌNØï±ö°Ø¦«¤¾ª'íß„žmÏÁf úsGì•È«›¶š-û2¦…º®Žºªc“òଓþaO'ý÷ëpŒÒ6󨹻ã²ãÌ«:ÖµÚÙ>ùsÊ^\ õˆŒ‘JªŸªñ9.RÖ¢X˜Mдaÿ¥Vöm9 Ó²ýÀºsФ¢ÍÒ¿§ü·“ ¼[8tèIóiÆ¢Û¢+b Ùn³ß‚Hu¾ª`°f÷ÂñÑs¨öþ¹ÀxÜ?ÝíA­ÛÝÊö˺ K†æõ âË$à¤LÀc*„Páˆ=©Ú®tX¶` 1bÏËÓ+ W?U“þAfm>¼þcŒÍt üøEa"“C2;ØÆ ü!Lì´Ä ¥˜råÓì=ÓueS$?Ó>hŠñîzõ@tqN?©/*è.UÐ\¥ öýðâ³¥¿zBëóê #/¨'øõVCÔÂ]€¨q«úFµ“ü—6Z ¤+g7‡ýÊK±suå6€4—îc¾¨Ý«>ÃÖýφ÷'dq©¯ÜŸºîpo¢¸‰jà⢬PÎßüWŸEÀÇľü<‹€ž­ù‚Àç;`(øÜX•IÍsÉ¡Ó8Ïu!W> ðôõ³óO8eÖ¸ãÍÎÞ¯¨²=›Æ'Ò¸\ïqÍW˜ÛÝ~¯Eù73>€(険ã¡;ºã¡;ºã¡MÚt¡ BA„‚‘?Y¡ßQ¡(BQ„¢E‘»Ý|1×o¾˜¯³ù`¢YcÛň?ºÖ—î]Ú»ØÐÞ…¾tï¨;Úw;ÿ·zçmÓŸóûmü.vÛôŠÍ‚Åi-JkQZ‹ÒZ”Ö¢ô3RŠ=(zPô èAу¢EŠ=(züÕppî¯ÅÁ‡,wˆƒOÊ>©5 p{5êH¨)†`³:…?S‘¾àȽ¿8®8yÆ\ ßZ}s¥ÅÙ“g†›ÃF¿TUó%§øœ…ó7 †[qƒßÊÛåØ5ʱ›>(çì/¹ãÛT4ý’›–´l¤e#-iÙH EŠ=(zPôøKÏ«¯?ŸWÐa¿ªÃº CQ|#7Å…ºì¾½p·ÃEÎþø‹ŸùØF!‡ÂÜà~ÞÉ‹÷ó§f¸Íý¼WßϯbÚçÞ­ûÐ6¾×™Å[ÝàßVZðõUw+Npkœ PøuOÖåȲNäš™2"7ß,s%ìê×_Â|‰5_8 À™›tÖ€I‰"Û‚çøbß«™µ÷9¾×à[2¡¯á6*/ðÁøŠKmþ¸ã’i¥N+uZ©ÓJVê´R'œ‡¢EŠ=(z|+8¼ç‘_ç=LmÛ´0Ò»5po¿œÇËËp_Üç‚_ ô\ü¾“ç#ñ,ÍxîßPFzúò6.y}=¸äùŠ“þü Oúó\^—üNú» äïà6Äsuë†x®7}d¡RMy@h KKXZÂÒ––°€Pô èAу¢E¿"ŵÈå8žpF ë` ^èoñçÞ”è$~º ¡(BQ„¢E‘ÿ#ŒÔðk1Ò!Ëb¤ÓfÖ–ÇÕ—¤ÿ{Þ-ë endstream endobj 1926 0 obj << /Filter /FlateDecode /Length 158 >> stream xœ]1à EwNá0GYÒ%C«ªí|"†DÈÐÛW¤ª:Ø’ýÿ—Ÿå0^Fö™ä=óD&çÙ&¬aK4aö,ZEÖ›|Lµ›EG!‡«Ž¯w)²pû|Ó äC5uÓî,Ö¨ ’æ¢kš¾s®`û'Éý8K)Õªê?•- çI2[Jà\A+HðŒï/1Ä’"°è³Rç endstream endobj 1927 0 obj << /Filter /FlateDecode /Length 171 >> stream xœ]1à EwNá„Ð!б¤K†VUÛ 0C "dèí+ éÐá[²ý¿õÜŒÓu"— yD¯_˜À:27¿G0ã∵ŒÓéèJÕ« ¬o*¼?A€A[û»Z±yŠ:ikF{ƒ[P£¢ÙÀ¹¬• Éü­D Ìöp^”,â\ dC×Ë"λ¾ÄOc¾”‘NÐ{ŒH©p®Ìã¯r ûuÈVª endstream endobj 1928 0 obj << /Filter /FlateDecode /Length 267 >> stream xœ]Ñ1nÃ0 Ð]§Ð ümÙ\Ú%C‹¢í‰ ‡Qßô÷™¼¾®)ó–Ú™M(ÖJ†[ù÷©÷‰S}üê@ p ]O p½Ä‰à&2qL¤€1I,¤€±HdRÀÈdâäH“#}O ð²ÙO¤/›}&ø,‘I^VùJ ð•L 9sHa8‘‚lž¼Ä) ´ gÒ•”þìØæÛ¶qÛõf´yi|nüwyë²Ê”åVÌ/†3‡Ã endstream endobj 1931 0 obj << /Length 690 /Filter /FlateDecode >> stream xÚ•T[OÛ0~﯈*&¥Sbì$N“!`Œ‰jå­ëƒIÝ6"7‡¦ þûlŸPZÊ´M‘Žoçç;þB,¬>bÅØû>ŠƒÈJ‹6»biÁäúó€ô~®rtw<Ï“Áñ%¥Á(Æ1±’ÅnªdnMí+VK.F®ïûvôaäµÏYÃa§¨F®Ùó6çš1Û„D£Y2|J¶SÏûG„Úób¸ ‘‚B+ŒDüPv¬Ëš_˜âáQw4tÎ+)«"©jç _È$Koõ!9ѰÔ5.ñ¡¹y‰Ü¨Hí-WÒ1v?TWt·…ꊢZ4ÀˆRöøªPˆ.ªÁ7©¥(V×R ±Âõc4rÃÛÉ*k€QÞ±¢Î ½Ý¬ª‘¢wÝŸéÕØ^ÃBV0æìÆô€ç°f%ÄêÂ`gÉU&n2)˜ØÀ²‘"+— ÒŰLQQÅUŒ¢ §9+êJÈ‘jµ—‚Õ«-£^ˆ|ìW“=pÍh€±C(v®–e%øYSóTîµÁœåÓ¤îN~×ò25iˆwØ»7‚6§MVj¯ÎÞwǯ¢v¯jR–›Ì –7üÏn†œçôEUÊÕéãpÂÊ¡3¼ä7Ê~eBÙ³Z˜ùFÙI«NM²X½QÕä=¸ê8×íRÙŸ¼Vö{*•ýVÝ+{ÁÓá@qŸÃwÍ[k؆y=éœFï>w–ÛË,ϧxvX‘÷J%oë—| ÅBézK3Ü7E§…é£IîÈý× ‘­(w›Šª-ç,쾃Ú3;yÒà `w/éÿ({™ö¥JHˆ"õ¸)Â}*ý›PÇ1ò° ¢­Nû_É; :Û¬¯{ô"X¥AØ5ƒiµè•5¬àŠî>‡ƒ´÷:Gð¯ÝÞ¨^mÞl¥ß×ø»”‹ endstream endobj 1933 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./parametricgraph.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1934 0 R /BBox [0 0 213.55 201.04] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1935 0 R >>/Font << /R9 1937 0 R /R13 1939 0 R /R11 1941 0 R >> >> /Length 1559 /Filter /FlateDecode >> stream xœ½˜=7 †Sϯ˜ÒW,-Š)¦ pgç:#•ƒ0|…‘"É¿¤%ên$\±¸wŸÑÅ—Ôì—3ž©ýÏOÇëwz~üõ`0«UÎß<ßx~:ÒùÑ“%P;³˜êù44&Hõü|üx—"Ä©DJª@J(W"…˜ $ ”+U2C*‘ÊFµêÎê©$Њ’ \¦)&†R%P®Dª`²8–+[$R´(W"¥bP“Ê•HÕB Hr%RF Œ5P®lñJ!ç@¹²ŸP­P㌮lTÖ Â‘ÊFQ‘ö] †²QÌ òF e£$)l'äÊN‚ìÔ¥l”jÖH e£j1È5”F12H­Á®Ä,¼C)‰nrjyÈ©è¡9þôSÑC“ššTðÐóµêÎê—‡¸}™uóSËCNE9µ<äTôÐŒÄôSÑCN-9=äÔòSÑCN-9=4ã5=äTôÐ:!÷Ф‚‡&5=4©à¡IMM*xhRÓC“ šÔôФ‚‡åZÔòФ¦‡&<4©é¡IÝñP¬ä/ûÐ\£W+\˜KåMeA÷:‡{}BlØrœn*ÈmÄF•š!›j)‹ÀÇZÊ¢” ,I –²¨JšÜSPe¨P0޵”EaJ×µ”HÕHåJ P*ØFM%PDe;Ÿ©Šs*‘šJ JbÀšJ¤ª‚ÉF¹(Q縔@i)P6j*ªd@1Q—(˸QSYTNIÀvk¸²¨—íåù¥íï[e)²9hQ®Dê¯¯Ž‘rÇ„]±„²yhQS ”;fQS ”;fQS ”;fQS ”;fQS ”;&ÄË•º©¡Dj8&P®Dj8&P®Dj8&P®Dj8&P®lÔå˜H %RÃ1r%RÃ1r%RÃ1r%RÃ1r%P«CÙ¨—¯&ÕùD, ÒZhN•»C3&HÒ-`íÚ+Ùa`9‘€¹+l½’\ÿ‚ñ‰ŒÔ­)ˆmJdA¨m"´ª½À–TA¥+’€šRøêˆh”@›b ÒnX›»ZŸ&»î"X¥¹ñDÑ Š]ÉL'*–¶ŠÏj•^¦µ]æú\ʥϥ•®û$j«?bsI»}´>N|)É ÈÙ礮Áv÷ÀZr§ ¶u ¥®¾ç«d hß;§+\–ëxŠŠ^ Éu³@J¨ul»ùü¢ñ7%%Àd…m˜d¶™óhc5f*VlÜ7³6U­€µ<™¯lýº¾‚S«ŠP%öW²b…Âñ D RÁpXÂ5s8ÐvsK©†C/Ê ­ÛÌÄ(\¹†äé—í®x‚±1péò$d%(d!Q¹Ж¨W&3#$Œ©ÎÙ ;p»·ìš–a èªç/4 I%cÅÌÀ,‡™ŒÕ•±šj2nõ¾ÜÊ©Ä-© ”v­\!÷¹=2-ãÛ”+zRÊè¥aÁ LN¡h‚ÚsÀOªõàøi¶9ã‰s» ›†¬à¬Cæ)0Õ]¤ „4d ±€öõŒ$¥\ æò˜’ÇËs=õ÷Áa‡\ÛÊ—_r Z9pKe© Ù‚íÖ=í˜aß0ΰøšiT°–Q)ÂzG5Y{òг¶íUi…Æ+× ŸW·b¯€ë¼J®£òJºŽÓ«í:r¯È+-¼j¯ÔñʾÒË«ÿJAï3K½ƒ¬Dö.³’Ý;Ñ2„w«ešÙѦ±žw½Ö Óùñør`ÿ%ñžÎï×ï VJ>9®_›ÛAÑì̘S>ŸŽ÷¯¾yh¡Ë\z|s¼~×â›Od²Êg:>޿‡[†JšmÀáµ6ouøÕ·Ÿ^ŒGûxéÙxÛªoÍàÅêÙ ª¦×#ÿf¹Ï‡ÿ¯Ë-Ûx7ë+« ¿ÎléÙl€Ø²ƒóÿ³9Ÿ.nñkŸÿ>Þ-¨¤|Þê˜ÿ‡ƒšÞÉÊPš/o&@í±˜/òϲ[ hi “‚ h¾çZôÞµýLdõ¼!BžIúû‘fn|ÿx¼=ÞÙx¹8 endstream endobj 1942 0 obj << /Filter /FlateDecode /Length 158 >> stream xœ]1à EwNá0GYÒ%C«ªí|"†DÈÐÛW¤ª:Ø’ýÿ—Ÿå0^Fö™ä=óD&çÙ&¬aK4aö,ZEÖ›|Lµ›EG!‡«Ž¯w)²pû|Ó äC5uÓî,Ö¨ ’æ¢kš¾s®`û'Éý8K)Õªê?•- çI2[Jà\A+HðŒï/1Ä’"°è³Rç endstream endobj 1943 0 obj << /Filter /FlateDecode /Length 177 >> stream xœ]O1à ÛyÅýB†$RÄ’.ZUm?@àˆˆ¡¿¯€¤CŸä»³eÓéz¹:›€>¢W/L`¬Ó7¿G…0ãbi8h«ÒÁÊT« „N7ÞŸ€ÀA£©ü.W¤O^7MÕ(¯q Ra”nA22&FcA§ÿNmÌæøl¥(`Œ£ c׋ƺ>ÓA0Ö ÅíÔeãœð j]*5JÌÏ:ü5 >d Óä ÿŠYÐ endstream endobj 1944 0 obj << /Filter /FlateDecode /Length 176 >> stream xœ]O1à Üy?À„f‹XÒ%C«ªí˜ˆ!"dèï+HÒ¡ÃY:Ûwºýp(d.i±/ÌÜr ×eKùˆS &î‚Í«ÓÎ&2ÑßL|"ò†;ô;¿›ų¹ÔÜ5vq¸Fc1šuºó^3$÷wR»`ôǧ] @³NI] d¡­®Pmu;uŸ$<q»¥„”k³Ä „¿¦q‰EÅ‘û«´Y endstream endobj 1947 0 obj << /Length 987 /Filter /FlateDecode >> stream xÚVߣ6~Ï_®÷°6¿BºÊCw{­ZU•zÊÛ^¼‰Ü¦àdÉUýßëñ!Y¸n«HÁ3þüÍŒZDÿ¨µ"Ö2 ýU”ZÛbAŒµ>X8øøÃ‚v8O½òa³¸û>Ž-JüYQk³‡Úì¬'û1c•âµã…ah§ß8^Åök8Z éxAjïŽ9oôhIèÒ¦tåü¶ùiña3lÁò5ÅdL‘Rê'V’F> #dÙæ¢ªùDbR‰­:Öš^Ķž¬·Çºæ¥êì..Ôœå8*D¹öD¹¥Pgˆ[Qì§4µ<ú4Æ FxÖ®/pcz–²[ÜÖ²Zÿ"õCs¡÷îVaoŸú”.1>+wZÐUj« ”]­´…åò Ú÷Çr«„,»ˆW‚<Ä5˜ÚòÉDܲc=›œqœè¸²(xéK[ñž…D WW´R-DS¡»¦srú8šoËÍÞ:cá:R¦XöÒÔQd÷9š>‹FjÀÌ9ô¢!§£¨Ì¡fw=H‰O„Fú³¡u¾çCCf<#Èü¼çɉ›åGÞøØ#ßæºmJÖ‹”Ÿ4´]ÕE¾Ur]!')vXdÿµÖ+&ê¡Ö_ÛXû¿Ê¸§— =S\A„ŵ„´ÀäØ@EÁ’DK$ß™²eJǬ"j´„Ñ$g‹Œž'Q!+L½l„â9œ×Jlû¸ìvËC—–×AP”Bòhbh½«Z¦xHÑ(Ü7Il©©Å±ý»îƒ-¢Äç«»L,¾ˆ<Ç8C›ÂRÒÕø-F+ý̶qv}î~,ÂÄúN.~úPï ª-ÑrÔEo}«t×öá(v|To/Be;^‹“é±á%±ïSm½}…ì«Z|r)öÊòŒßZ4 ~° nîÙ²ër]Z_Qr¥Û?á´Üä endstream endobj 1949 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./graphwithderiv.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1950 0 R /BBox [0 0 69.45 83.67] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1951 0 R >>>> /Length 451 /Filter /FlateDecode >> stream xœeQ;n1ëu ž€Ñü5'0.ö])|ý`ö¹p^°Å.)r4äþƦ`Ïóù¾½¯oÏ…×?Ë6>–àûüZ÷Ãç§%ˆÍ ¼ù~[/KÎæÑƒ³Z6ç̨̓Šê¦Ÿƒ÷ÿ˜Q…(ý ,i=¢b4Y‡¶2«|—kãiek4(%=BjÔŠÚ†Èäiïbvãá¢Ûò(ê6dž…m¨pw>/Font << /R17 1957 0 R /R15 1959 0 R /R13 1961 0 R /R11 1963 0 R /R9 1965 0 R >> >> /Length 1059 /Filter /FlateDecode >> stream xœ—=o7†Sï¯`)7šá÷H 0àΊ:#•ƒ0r…‘"É¿ö–3|yw¾*$¼|–¤fø,ï¾& ¼ÿŒßŸÎÛËk ŸÿÚ2©jKáïMÂûM—ûM´&j=¤Ì$=œ=ÍJ±†?·_ïA܈Õd Ë>2™ S«jȤzŒ¤²)퉺$ ,AJ$gj8—% •¸PŹ,Y¨\+•ŒÔHªÆFy¡F²P­wJ©‘,ÔèPwº“#SMÇîSÙW²déO*)Kj9RÎ ”%Kí9Q*HY²ìžk¦Ø€²d¡b,$ 5’µC½w¤F²P%WRÜ—%kí¹ÑÁÂôÚiYîv&•H%É´ÂlÎ ”Y)Ê¢Ž1®Ž1 Ž1SƒP£¦:F¡:FMuŒBuü¿quŒBuœruœuœruœuœruœuœruœu®{ÔîLuRgê­,êx\£P£¦:F¡:^{WÇ(TÇwïê…ê8åê8êÌ™:N:N¹:N:³öC‡¦:Θ:Îܪƒ/¶Ûkç–šsk¤rü­J»™Ny”Hé$W´©R™´!e Rw^Ëöº˜TN‰Xq_3‰L*ªH¢Zp_3JórvÏLª¶L­c½f2©ž )ãŠ3™”J¥\qÅ™¥xéÐL&%Üœk&@ÅÔ÷· Pž•D).µ÷)Uêy¡,*w¦¼œBO€ªY¨$¤<ªÅˆó :GªË)ô©ž(.•ðdR77ËÕ§´‡WTÒJ½É"Cd¶ÌÕ,@hÈ2! úÖ'N„L•ymZP;•ñþ3Sò¡!Ê„,È¿}¹ž.­Óí§K„©],Iôi‘šoþ{3ËÙOU¨‡“ªÇ“ÿ<§ËáÈv:¼Í×§#ïó;NG»>E{È”/ûÍ8í/´Ôî§Ju®2NÑükâ—·íÃöaûk†Ø endstream endobj 1966 0 obj << /Filter /FlateDecode /Length 160 >> stream xœ]1Â0 E÷œÂ7H›©êR– \ M~ª 8QšÜ%mb°%ûÿ/?Ëa<ì3É[ æLγMXš hÂìY´Š¬7yŸj7/….:>ߤÈÂmóU¿ ïêT7í–1Áb‰Ú iž!º¦é;çz¶Ò˜Ü³”R­ªþC)ÑÂpœ$³¦Î´‚ÏøþC,)[ñìgRí endstream endobj 1968 0 obj << /Filter /FlateDecode /Length 160 >> stream xœ]1Â0 E÷œÂ7H›‰¡êR– \ M~ª 8QšÜ%mb°%ûÿ/?Ëa<ì3É[ æLγMXš hÂìY´Š¬7yŸj7/….:>ߤÈÂmóU¿ ïêT7í–1Áb‰Ú iž!º¦é;çz¶Ò˜Ü³”R­ªþC)ÑÂpœ$³¦Î´‚ÏøþC,)[ñí£Rï endstream endobj 1969 0 obj << /Filter /FlateDecode /Length 170 >> stream xœ]1à EwNáAÙ"–tÉЪj{&b¨A„ ½}I:tø–lÿo=óqºL ð{Žö‰| —q[¶3.˜ìÀ[Ž®Uû6‰ññjÒë“:pè÷þfÞÈJ´‰Ü36:\“±˜ -È!ôà½fHîoÕíÙN%u“Jj6¨^7 ¡ú?õRE: Àn9#•ÆÝ¸*O ü½–bª)@rì 60Uþ endstream endobj 1970 0 obj << /Filter /FlateDecode /Length 186 >> stream xœ]O1ƒ0 ÜóŠü*R”…. ­ª¶‰ƒ2¢C_Å@‡gélßù\týµ~åÅ#Íæ…+w>؄˼%ƒ|ÀÑV n½YFÕL:²¢»éøþDä‚[t;¿ë ‹gUR§Ü5f¶¸Dm0é0"“J:§û7ºì‚Á›•VŠÉÊ*€pŠÉºQ€ºÉ´U€º%óÓ&ßÉÏ|Ül)aXé+JÓú€¿Ç㳊c°ì í2]o endstream endobj 1971 0 obj << /Filter /FlateDecode /Length 220 >> stream xœ]=nÃ0 …wB7ð³™_Àà’,m/àHt !² 8CoN:tø|’@¾æp:žrš}óY§ð-³SŽUîÓ£ñ¹¦ìÚÎÇæ—ÙnCqÍác(?¿E|磌‹Ÿ‡›4_DvÓ.™0E¹—!HòU\p?Žì$ÇO-–Äe|}%°ØõÔ²P«Ú±P§JlDª+6Z©®Ùh­ºa ê– €¶ª;6Ú©îÙhos¿Ô´‹÷ê>> stream xÚ­TMoÛ8½ûWAr")¤(ù£ š¶i»è¥… ¤)ÀÈ´L¬%ªX òßw†Tl¹±“Åb!@gŸf‡zêM‰7f,š&//Äzuá9ãû§íâB {‘Ùàü2M=J¢)™R/[ô¡²¹wå¿_òÚ= cþäí0L’Ô¿àpžR ÃxâÏ×+Ñ€5&tìÓ˜ ¯³?³íÁiÿK†ù EJi4òF“$¢,q,s^38ûÆÒn±nÄ­‘o”óäªjŒ^çÆ-Ͳ‹,4¯—ÎT‹ßöj®y)Œ–¹ÃZ¬«ÜHUá?µQŸÚ•ÍXt[éó­—Ò®xps}<õNšåŽ„AÁBÊ"šv5løw£Õ z¿¶µPÒ¹çÄßc1}Âx΃ªÃ,pëBÜK+°Q”ÐÇ[ô¹­”²Âºãúnm ŠG7Hlì‹\þ 4y -o‡iês_ÛÄ£üµ–¥8HÒ{( °¢£®TëJšFÞ‹$%q^‡þq ¢²¬•©¤qê²ÔÕ\js‰xZð•[ÄuæƒMÝ&@w/[ ³Ö•‹Ât±S„I”žšŸñ‹È©9£Ùq ÷`Êã+Äl½þvA8µœØä„"¶Ù’¢ªmëþ2pL@ï‚äyc:˜¹Bú¤´˜ëÞ\ó;ĵVw³wøFG&þú,¸ÍÛæâ°úµBñ$ŽÈ8õØúgÂ:ÿR²±÷A ¾IŒ¦0¶˜;>[v#²ƒVâ‹ /ëUç–«Õf788ѱTx“îÜBU]˜l.‚sã¼¼ÛTe©º}¾‘P“ó•¬ ·X@ŽÒÑK—â5±Ç£ˆ‘ØEá)¹ºšbP‡ ¿½Y„_ŠJiñ®©EnöÕEQ^]»£7³‡ ÐS`ßÛßOhgbGûнÈË"fZ­+l=Y©‚¢‚IÉ7øÙ<éá¨èvXí+Xm+¤™m創¶N)ù‰Fè¨bnÐníÖi7~~zƒ]¤“7›sÈ89è d±»ö“Ç7'Á…2F•™ªƒ¯ba2™ÿÝ­C»ƒo_€o{ðú]KØ÷>IKÔê½ÐêÙ}ü)N¶ endstream endobj 1978 0 obj << /Length 1467 /Filter /FlateDecode >> stream xÚ¥XKÛ6¾ï¯0z’µWÔËr‚=$mS´È¥­ ´H{ %Ú&*‹ EmvSô¿w†C=숛´ÅÂkrÈg¾yÐlÂ[lÃÅ&Ž×Û$_ç›ÐRõqAƒŸ¾»anß 6®&;_ïnîޤ邅ëm¸e‹Ýa*jW.Þ_Ÿxc„^®â8òËU’¤ÁkÞ ¢œÕråAÙU¢…Ñ&d›€ElùÇowÃÁi=¯áûQÇ8L×Y˜.VQ´Y‡›î¾?Çùâuóã¸e~æ2Œ±u¶HòdçÝçÕ£E“, Ú‚W²>â$ ^uoï#ˆªÅûN´F”´ÆëòNi7î–,0ê¼\±€ “‰•(ŒTNž:(sŽqP ’giZÏù`@¸æŠÅk–’æ²>ɽ´Ê å?Hs¢‘ª­3{à¬ÖJ{dS{¼³Ëxñ~9½^N­:#kѾ˜“€*eë”E¤Óƒ’ N¥$ô÷0 Y˜N ¢Âä¾è´µqôÛÉöghO нì­eë8dÿóȽR•;wFYî{£;XÇc²ØYÛ3n·œŸý8î†[\›zeCKºãv'„E1±£0cIUG> ‘Üß{ÞÓ°6Ìú9Xc‡p¨—™GÍ›“&° 0Á@¤6¼(Dcܸ&UUƒ‘À+ÿ)—wH¯±6Ÿëcwõ¢‰¶Œì€ƒR@†:ËÚF3¬ápÀбѪђGi·*úîZñr‰¹'¢Ô6®p$ÝÞ£|ÀãE}‹óm ÍÀÛK;©ö2v{Á©›¨´'2“à·>×õâ§èù€Š)J›¶ÈRÕ *º¼1¤½i¬û“Å[XæÚ—-b̉þû¼UÇg8µ«!%D Kê^GYûeúa9ošWhçÒ`² ª[J—²d´´“‰¬‹ª+6T€JNµCY{ÃÍÉñ ,m²mŠ zAžpCöŠïE5o­þO>žÀÌ•¯Í]mkS‹‰‰ 0¸WDÿ=µ´h´àCÅá-}W »Á¦_,üjͪ-l9¬DÙË?±´M=IðË|…ºr^Ã¥¦ôúó¿Kö#ãGo¾:˨^aM@Ô.l9}ø(V]ÛÝ‹ˆ’¢NM˜ªSΆƒö3¦™ì3P0>q磿Šx™ã{òðe[ÐéÜVµK! ¶CAæ¡C¢H-åƒ,;^õ™fzÛ®2 Õ2›0x¥Žªs`z.]™°XMÀðë—£aä|¼è+¦¡s%ý·ÿ"ýéK±†^]eyt•û²œù—ëØ™uî\€ÔI²Á©ÁI_0Ô`;ÛjÉÅ•àŽkZ]ýߤC‡÷þÀ«ÖÓKnMÞê°Ér’Áï,o§Â6)C‹avE¡¥8ð®2K+bÍsÀ6øŒrûÎ@kW6×|ðh).°¹'ƒ#â“4£ÚŽŸ.v MOv'Nû-j¾¯ÉÁƒL÷¦mg^˜äk›•Ń5 ny…âfKÓ›%øQ¹ŸÄ#?7öYd_ ®-5§t4-¢þï೜´sôŽ=\”MèUèU¯ ©ú–ºÏ>nÑÐ{ÞÂÇkŒàÅ”yn¶˜Ü­¦—OR÷ nåG{d†·øùþX+-^µ ¬÷;VòŽSC½ÿÒêLMvg^þÝÿ°òã“Ãÿ endstream endobj 1980 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./loggraph.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1981 0 R /BBox [0 0 202.26 200.93] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1982 0 R >>/Font << /R15 1984 0 R /R13 1986 0 R /R11 1988 0 R /R9 1990 0 R >> >> /Length 1779 /Filter /FlateDecode >> stream xœ½˜?o&¹ ÆS¿ŸB刹Ⲡ¸î6îîR]oqH‘äÛ”F3ï›T‹À…­G?Íh8)Žk°õú9~ÿòõñù‹·_ÿñÈ ö϶ØþþèíOLˆh¤Þ¾ž#L1àlï?$Âh öIÄŽ°Íãr\óbžÜD”*§²Sf:ñF-e§ÜTs£–²S!‚±QKÙ©DîºQK¹QÞ!”vêPn蘲QK¹SÆp»ãRn«Bî»_ÊÒ.àû¾–r£ ;íÔ¡Ü©$ÀÛµåFù-ðcx›¬W±#‡r§Ljn§¦r7Vwðu(EI'`¥Ã¾k´{ï¡ ñtø¹b9|›Å?^uƒžÜçò¸pK¼y|Q—ǵ{|Q—ǵ{|Q—ǵ{|Q—ǵ{ü¤NŸÔæñ3§Çµ{ü¢–Ç/êòøI?©Íã'uzü¤6ŸÔéñ“Ú<~QËãuyü¤üøÓãçüéñÙ<~QËãuyürÖòøI=ñøVbŸò'.=÷yV4»]k);õmQ?sö¢Œm£.úŒúp¬íÔ¥\TXÛox “, Êt)•~ƒ–p1ØEÁ÷Ç[ÂÎÄpô-e£¬z<À1ا§I×ü1ڀß+DÇhkÀmÀáÊX£ 8 yk´Ó‹ 8FPNZ}¬Ø¤vӆ̵ñRLÁÆç!ðXës  HÅ&ÓR8h)Øëa¼ƒÉPÈ ¢Nʳ¹À.XÖDâz!CQ‡. ³«'(cSçY¦±‡ƒdC ¬à v*Ó#Z[ z½D%à sш¬•¥HT~!bÀh¯Îfdu߈•;õusM t¯VÒ!+:H=²aW„NC!Ñ€²Ì¶‰³ž;:Œ&I²®ÓûÌû'j "ó¡ ÔÒê³cì†ûeJ‚ Û"£BxK¦aÄR+1²&lÜŠ«ŒP‹ HŸŠauŠÝç*9¦#™ÞGám!4lƒÒˆZ0çxSe;Ñ(0Çì•Øž>ŠA)JÍ£ƒã,* n< Jp•ƒ™€’ê͹Oœ÷*2Dsd@QPÊ ´¥ɸŒŠi3ÏQ8KѬ¼1«=ÎU•Æ­ê‡Î°hd•:¹7‚`]+C |ʨ—{4b$+XS÷‘æ%h¯‡Q«°OŬR¿6…9E}‚5%?¾x°6¯M±Ï‚„^÷äV¹üRÈêØ70šŒ`´úú›»su&B<×8qRÈãºá•XÒúôPTE«sg¬¸±+дP0W³ðŒUÁµ± ȼwWEæ²ú´PxV½àî`34‘£:PöQ„Þ˜=«Ð‘3Ätч‹2QëÿH«ù¼þ%ðA)¾·_¿=püSª¿~ùÚþðöøü¥2R•ÚÛßóVU Àë­¶·¯Ÿ>áËk…Ï…>õóÏ¿¼ýðøü±9¤wÄq·NM€1“ÚÛ_?}ú]-éÉ~¬à}…µ>9|‘²3Ümg¯ëÊÑë÷±â›}Q>»ËÓ}õÿóý><êí†Õ´TÌ_£’oÝñß/¯ž™ød“ä€cIVdÜ7Iùí&¿yYµê»¿,C öúáÙçNTצL黼)›äw½ßÿ~SÁÐ¥S{Eãö½0$;ÉóåT-¤j•¸ÁÿüéåAH8?ñµÛßëõ÷Ï/'RýãÛãÇÇÿûöi? endstream endobj 1991 0 obj << /Filter /FlateDecode /Length 172 >> stream xœ]1à EwNá@è@"E,é’¡UÕöLÄ@„ ½}I:tø–lÿo=Óa¼ŽÞe ô 3XçMÂ5lI#L8;OÆé|tµêEEB‡›ŠïODà`Ðîý]-HŸüR'ÍžÑÁà•ƤüŒ¤gLöÖJ‚Þü­ø˜ìá­¬bL´’ô¢“UŒ‰®ÆOc¹TNÐ[Jèså®\…Çyü½C,)@oÈK¬V9 endstream endobj 1992 0 obj << /Filter /FlateDecode /Length 169 >> stream xœ]1à EwNá`HLj%]2´ªÚ^€€‰ˆ¡·¯ I‡ß’íÿ­g>Œ×1øü‘£yQçƒÍ´Æ-‚‰f˜`½)GתYtb|¸éôþ$ –ÜÞßõBü)/m"öŒ‰–Ö¤ efb=¢êSŒ‚ý[É=0¹ÃÙ¡jBìP±¾ª ±-~륊t€Ùr¦Pwãª<>ÐïµSM˾3EUò endstream endobj 1993 0 obj << /Filter /FlateDecode /Length 160 >> stream xœ]1Â0 E÷œÂ7H‰­êR– \ M~ª 8QšÜ%mb°%ûÿ/?Ëa<ì3É[ æLγMXš hÂìY´Š¬7yŸj7/….:>ߤÈÂmóU¿ ïêT7í–1Áb‰Ú iž!º¦é;çz¶Ò˜Ü³”R­ªþC)ÑÂpœ$³¦Î´‚ÏøþC,)[ñëÉRì endstream endobj 1994 0 obj << /Filter /FlateDecode /Length 206 >> stream xœ]1Ž1 Eûœ"7˜?‰ ܰ +´»ŽƒR‰ÂPìíQ<°Å/ÒKbÙßÃáøq,y±Ã¹Íü-‹M¹Ä&÷ùÑXìE®¹˜ÑÙ˜yy™ž| Õ ‡S¨?¿U¬³QÒêŸá&×Ûê͸Öðå^K å*fhJ‰Œ”øïi»\Òë§Û‘¸™ÉíIܾ+“8&3yxtIüØÕ“xßuC à7:É»gª§{‡±ühMÊ¢+Ј=Z.ò·¥:×^e¥Dó³ŸeÚ endstream endobj 1995 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./loggrid.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1996 0 R /BBox [0 0 202.26 200.93] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1997 0 R >>/Font << /R15 1999 0 R /R13 2001 0 R /R11 2003 0 R /R9 2005 0 R >> >> /Length 1585 /Filter /FlateDecode >> stream xœ½˜»n%¹†÷S0œ TS÷KjÀX`³+[8Zà ,4ÁÂí·7Šì–ºÏŒk``(8:??²É꿊%ý>h`ÿ쟿|Ù>}Žñë?7…ª´ÿÚhü¸ÑømÃñÃFÅ ™ƒ-Æ—×oTê 5^¶¿¾i„h Í0hW¯½pÒ ?”óšîÈr¢åL…˜Õ‰:”3• ”'êPÎT‘‚ ¨C¹PÆgjW.A*H=‡dW®” \žx(J̠λ?” e¨ç}Ê…rB`?S»r¥Š.kíÊ…ŠKàç×ËxR¿Š3²+WÊì©]¹P…q¡v¥©7ÿ*2ˆñîÙãÛÙ³¯ÚòìAß{ö î={P÷ž=¨{ÏÔ½g_©[ϾFäÖ³oÔg_©[ϾR·ž}¥n=ûFÝyö•zdz¯ã·ž}£î<ûæºÿͳ‡Kß©µä~¡”«s]ŒüÄ?*ÍOçù™zTšJGð£¤wc¦à½›ˆí»Ê¼ ¥ï G°©¤Z3*à;Ž8» vˆ©ôõƒ}Uau޽l.8íÙ×Û¼P] Êb‡vÝ ¨ èVЧìEäÊÐgò"péUØ@;4i5È1a¶Á ˜}M7< ¬A3E^¶0d«Uë«\j*ÙÕA·Ù(D%pÛÂ0€ZIPÑAZûÕÞÑî<×)¨@f RsÐŽMZ‘ R)°E†‚HÏbî*ð²e˜7ƒÖ÷²U·Yƒ$r*Œ€Ô]Ël=J Xö–…:6eê6H¤7ÞŠølk˜@æ¬D(ÒA‚ Ú±©r ¥AœÖ !Q†8\§Âu6Y­¡R[“Xú…LÅP1U§[+ÁÐÆfÀ¥d€Ö Jêà!·é‰¼šm…¢ß‘1HNE¤i"±Î‚V4;¿ˆ(a6G¯åûè‰:wt¦ÂšS ÝTG‡ ¸¡ O…fû(ºš2b©>1!̙ت×A™±è8ñ¨P] §ò(w°éœ¡,-ði[2È%<ØŠP'Fõ€ÏGI—Y Kqê>/“cÍŠ™ƒé6“éeÖ䑚ÀÓ6¤À}îL…2ãñüý¶ì‚ÑQfÏ_¶Ÿ?ÐǧG(À×_ÿöüãöé3Ѩ@¢¹A8òPªâñü÷íçê)Xû 9Ïpð‹£Úö¤»ììéX9¨?÷_í‹ë[Oùæ¾ðÿü¼‡ó‘]ØMHÇü);™Ž'þçã“BT}c“@sJµ«+¯›äúz“_½¬žõÝ_–ðxz8ûÚ‰Ù±)7þ.oÊù]Ÿwÿ¦Ry<‘‚Ëö( Öžó—çí§í§í¿ø/ì endstream endobj 2006 0 obj << /Filter /FlateDecode /Length 172 >> stream xœ]1à EwNá@è@"E,é’¡UÕöLÄ@„ ½}I:tø–lÿo=Óa¼ŽÞe ô 3XçMÂ5lI#L8;OÆé|tµêEEB‡›ŠïODà`Ðîý]-HŸüR'ÍžÑÁà•ƤüŒ¤gLöÖJ‚Þü­ø˜ìá­¬bL´’ô¢“UŒ‰®ÆOc¹TNÐ[Jèså®\…Çyü½C,)@oÈK¬V9 endstream endobj 2007 0 obj << /Filter /FlateDecode /Length 169 >> stream xœ]1à EwNá`HLj%]2´ªÚ^€€‰ˆ¡·¯ I‡ß’íÿ­g>Œ×1øü‘£yQçƒÍ´Æ-‚‰f˜`½)GתYtb|¸éôþ$ –ÜÞßõBü)/m"öŒ‰–Ö¤ efb=¢êSŒ‚ý[É=0¹ÃÙ¡jBìP±¾ª ±-~륊t€Ùr¦Pwãª<>ÐïµSM˾3EUò endstream endobj 2008 0 obj << /Filter /FlateDecode /Length 160 >> stream xœ]1Â0 E÷œÂ7H‰­êR– \ M~ª 8QšÜ%mb°%ûÿ/?Ëa<ì3É[ æLγMXš hÂìY´Š¬7yŸj7/….:>ߤÈÂmóU¿ ïêT7í–1Áb‰Ú iž!º¦é;çz¶Ò˜Ü³”R­ªþC)ÑÂpœ$³¦Î´‚ÏøþC,)[ñëÉRì endstream endobj 2009 0 obj << /Filter /FlateDecode /Length 170 >> stream xœ]1à EwNá`ÈÐ%bI— ­ª¶ `"†"dèí+Hҡ÷dûë™ãu ¾äh^TÀù`3­qˆ`¢Ù&$XoÊѵjn:½?‰@‚%·÷w½ÊK›ˆ=c¢¥5iCY‡™X¨zç£`ÿVrLîpv¨š;T¬ï„jBìD‹ŸÆz©"`¶œ)”ÆÝ¸*ô{-ÅTS@Á²/5LUõ endstream endobj 2012 0 obj << /Length 592 /Filter /FlateDecode >> stream xÚS]o›0}ϯ@Q`2ÄÆ U–îCú²–·m.8Ä _3ŽšlÚŸ?H MREÈèÞË9×ÇÜcdAù +V„±—±•U¨«¼°Lððu‚zœ+î¹L'³/ah!è%0AVº¶Jsë‡}»&­ Üq1Æv|í¸AÚKÒQS©Çõc;ß–´“QQd#ßw~¥ß&ŸÓ—Cß¿P¡BKœ%"„¼¹5d%ŒÊ.#%ý Cxß@.¢%B6uý¹‡¡o€9'Ï WpÒ®U°ÐCAÅ8f!ÚÍJV1Ñ)‚ZH‘è Ê4Ôé-oÚ³]òFh‰ä‰–*˜ªš9¤dE½xÔmÇ N ìµ#;¦ÕM¯vWS°l„hª´iÁ=]‰”e›nDEØC¡aî_™{ÉTøV¬Ðï1UMô÷˨|zóÈÂÈ÷pªYÍî*œXŸšÉ÷SÎ2có#ù޳ùro\Dw‚Ö9« •¶X÷î,s¤»60šÚA65qFêžL:VîM±•ßùÁ’Y$W6áL¬+ÙT Îòku®·“òlý`UÛpáHk†¶öÍø?öÓíØ=2B Ö]Q7œ~ìZš‰³–à””¦ñJq_SM1á_NÅ–×&A3qóïT§woÀPç»7pšŸe¶´!Ö¬^”¬¦Ï,º‡ôÿ‡QáÈ­Ë]dVøD ¹ËŠ”Ò‡H;e!ø–ÝÅØ“žz£Tg³P2Ç:Ü“èË®Àå‚b/IâщÏèQ÷é?3ŸƒL endstream endobj 2015 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./logticks.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2016 0 R /BBox [0 0 300 176.28] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2017 0 R >>/Font << /R15 2019 0 R /R13 2021 0 R /R11 2023 0 R /R9 2025 0 R >> >> /Length 1587 /Filter /FlateDecode >> stream xœm—»‹lÇÆóƒs§îS·]¯@‰ÁØèz3¡H³ Æü×›ªó˜žÝË3ûñ;_Ÿ®þººç@ëïøüå}ûòÕÇoÿÞtüw£ñýFã_Ž¿mœé CX”Çû)#ÂŒñ¶ýã[ÌDº”"$†X¡SY¡Ã|>§Â@ÖŒ%Ð%,ˆ©ë‚‚¸$ÅœÊ*æÊ ëêt* ”hÀé t*+4 È×©Ê Õ> CY É”gµwèTVH&BÒ Ê M6Y¡Cy‚R`ú´++¤Ó!ŸÞéPž H{‚ve…Lb®Ð¡Òe„&˜”±;A(0/cO‡"Ì÷†,`˜#œµ•™mn@;ãÚÓÀ~©·-‘ªÿFL˜^ã$;çˆ0jEcD2¸Ö*¤Døˆ4ˆ6&ÄY¯Uv(»Re«Þª@έ¨VoMv& †I#IºhopŽ$ÍÙŠL É.»b¨#Y!\[ ­ò§ `Ÿ8ÄD#ëÙ.1±8X)åßC± ¨¬Û9æÞèkQß6R©N=”L‚&„î‚9`ŒÔ€ìH’\½0M€¤–Š&Eõ½4î*ÓœœG:Á¤j:‚tÝgZõƒôìнm¤•V!=”Ξ#Ã!;¤>xd2µbˆ#ÓŽS¬Êƒ$[Q·ÑkØëKæ6K ès÷j•×倜 !Û?¹*p3A'Àƒêü'd­—|Û(Ðë!Nö á:]¥ýKÑ€r©õjßʦ•2kIß6JBк¹Ô&i߃YWÅZ‹RŒkáu·oF@ ];Æê>A[„,_³š})¦uŽ:‚G+Iàõ+Àç~*2uTKIÀ6¦Ùç*aìˆ%ôU+:iL©û]+i?Ř«jeœ ÖOñ4È2΄¾d0;Cø Bl!\Gïlcá &ƒˆ¨E”J1è-ÏâV+Oij'2p×Ó-pôÝ“8 wO€e,\ñ)ų:‘ø~\³¢ÖyE4i¿ø±ÖaPÆSAZPïµ£êMm¬!½v¤P¶j%8tã`­ÉA´¯õÚ‘íÿ†õÊ‘#ônbßsJä³BYŠÔ0ÛÕmÖ€DÁ mãÙ! ƒÚ:U³9ˆ÷{ ÇäÊQNÈö ¨*dB75Žº Å Fn߬«•âÐ.9µÊÚ]JwÅ©–˜tßq~Õчã·íú—ð8>~yyݾ|­ªCªòxýç¶ÿJ¦Qx°ƒSæx}ß~z¡Û!Ä9~ý~»W'¨ÖnÕÏ‘Æë¯OÌ ~Ä]«ÍX€ò3>yÁ?<ùåkEûñ‚õrwêYÀ”ŒáÙŽõ’¾0"Ûñ¨ŒênHTžïp¯fÐ/ðŸC ™½üþùÛnñ\€Y“½ ~ú{ h‚öò¿›€„çËÏ·zò,¤W3­½`û;Úíî, WTkÖTG¶çªòíN½¡ìTCýeÞîDhsUív5@‰Uëë·ªµÁ3Çê´ËcV?ÜîÓÀ)òå»Û¬Æ#ñòíZ“:>º––æD^Jû§SzØ¿¾n?n?nÿDÊsÉ endstream endobj 2026 0 obj << /Filter /FlateDecode /Length 161 >> stream xœ]1à EwNáÐ)RÄ’.ZUm/@Œ‰b!Co_A’lÉþÿËÏr¯#û ò‘¾(ƒól­aKH0ÑìY´ ¬Ç|Lµãb¢ÃÍÄ÷'(°äöùn’Ou©›vÏ`°´Fƒ” Ï$ú¦Ñ½sZÛ?éLît¢®¥T×Uÿ©”ha8On)ç ZA €gúýC,) ¶â S_ endstream endobj 2027 0 obj << /Filter /FlateDecode /Length 171 >> stream xœ]1à EwNáà E,KºdhUµ½1!Co_A’¾%Ûÿ[Ï|œ.Sðø=Gó¤Î›i[63->°N€õ¦]«æ­ããU§×'°äöþ¦ßÄ¢o“nϘhiMÚPÖa!6 ªÁ9Å(Ø¿•س;œU¢DÅÙ«&DÙ·øi¬—*ÒIfË™BiÜ«òø@¿×RL5,û@.V endstream endobj 2028 0 obj << /Filter /FlateDecode /Length 178 >> stream xœ]O1à Üy?!Q» –téЪjû‚Măúû ’tèp–Îöîšáz¹’ϼy¤`_˜¹ó —°&‹|ÄÉk%oóÎê´³‰¬n&¾?¹ä€nãw3c󔧺i7 €K4“¡ ™B+ç4C‚¿S· F·¶g]!º4Sè !¤ÓLõ +„衺ºb\¸]SBʵFYâyÂ_ÓbQq$`_CÌZŸ endstream endobj 2029 0 obj << /Filter /FlateDecode /Length 224 >> stream xœ]Anà E÷œ‚øvâšM²É¢UÕöÆ‘Áˆ8‹Þ¾bœtÑÅCzÀ—f~wºœ/yÙt÷Q×øÅ›ž—œ*ß×G¬'¾.Y«Ó·§Éo¡¨îôÊ÷Oamuây÷÷pãîÓŽrcöL\ßKˆ\C¾²òùy&Å9ý{2ØÓüüê@à@Ê;CàLSKàlÓžÀõM$îÐt$p#)ß$}Óa"¦¦‰`H¤ü1ƒÌý°­Ðºx­®ã£VΛ&…´"–Ì–µ´”æœÔ/ðpa endstream endobj 2032 0 obj << /Length 594 /Filter /FlateDecode >> stream xÚ¥T]o›0}ϯ@U@2Ä׆ÝÓº®[¦VÓ*ÞÚªòˆ“XÌÀQ’Výï³1ùÒ’íaŠN®Ï½>×¾p°þ€“b'¦4HÃÄÉËî¢ÍܱàþËzž¯‰þó*Œn¢È¤8'›–ʦ΃ûiÁjÅϧ”ºÉ¥ç‡aä^±–ÛH)=Ÿ$îtYðV£Cì¡ÞSömð9Ûmòw…¿ö)”:>!ã Ñ@óG“2ÄεüØÓLÉôÁØ ÍÑuºv¾W½ðœU„.+ZiCmÝõÂs1Ûô¤e«diyJäž^}±+…í;gJȪµ1VM-˜É¦dªµyúÏ6eΡ¥.dùkÞ^š“ҺLJºõ%AZÍ¢¬e£<ÝqäÎV/>˜$ÃÒ'D1±¬V¼òGaŠ1‚8B“y%þ±­y®tvI@ˆ OÊYÑeÝÊ9Òß?‰–7mØÊкí S^)¡6(B›¬³[¬ Q Õš¤-÷$o³çŒÏIY³µèXûÑÝó#ÐPN¥^ +©ôme²F·|¦2‘¿t¼k>cËBÝt—‚ºŠ„¤NÒc_Ù3n8+ž,~k-‚ÆÉûq³þÉR›½F£¯Z>¿™gSڢ˺~Zøðõõé¢Ó{/æ …ºßÓÒ66æÚ{ÆÚ*PÄáÖ/`ýrÖ€Ó Šz—O”IÑ-gmoÕ›CO€Gbwuf–»Áè}°Ò ¶LÃwžRÇå¤ZØ—JèþÔ/“ÿôÁÑH÷> Ú'=`Žî7ŸuX endstream endobj 2034 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./log2graph.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2035 0 R /BBox [0 0 200.54 199.31] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2036 0 R >>/Font << /R15 2038 0 R /R13 2040 0 R /R11 2042 0 R /R9 2044 0 R >> >> /Length 1326 /Filter /FlateDecode >> stream xœ½W=‹$É•]¿"ÍcbãÅg†+‚óno¼CÖ‰]!fC†¤/"{ª+ûfb9Ä=¼~ñ2+>^Tÿ:˜0¸ÿÞ>ùz|ü”ãË?£ª9süóÀøáÀøûÁãÏætšA•9¾Å»#¯ÇO/*˜²6æ=v&qï€õQ¯ï‚^¿Ÿ?©ŸÞÝöº¿ŠRx¬ûƒÅ)wÖ‰<°Þ_ë ÙY’Iɺ±îH9)n, £Äž×;²±ÂA)»ÖÙXS'åN:Pú~÷ÙYZE;ëDv–Ï Ìu";+S)çÎ:‘õ–gœ0·Ìïýu±Š ·ú°Sø=îõ›ÓÔä1ê­¹~7­o÷Í2ùæíC•<çÆ:‘‡gdæ37Ö‰<°4‚´N䕪¤¬7d±Æ—c³ a£ˆrJ½¯w@¥HJÇë=æ=rú|‡º¥æÊL&È8Ʀ)}xÎ 9™¸š3¤2GöŠYS„ ™5úVÅ}øÔÕ,áÖKèõ˜$ÀÈ­3@HÝ ²*0ûâªÃeR,wâ²Ñ%žë â vf“Ü»% F HlŠúr]Íîª5RÎT:‡š“­³*ÚZæPLrí©É4½†T¯§ìAœ2dòêÛ¶ðZ]ɤ.ÛB¸ŒlLù@qo;Üe’»Ý¯“ÀÓ»S¯ÛÌä¾Ý€“o(“í4[·äÁ¤µ%H'õ-É@1)¶B@Ø{ ﵂÷Þ« Q'ìõ†8üj H8[× SÀ¹uú%€më>(xkOh;Ul- Õ¢’«Ë¡n4ç6Ш5„÷aN£¹ÍÓùBs9ŒrŸÊåã1¯Á…™õW×lü(pM?,<6ƒ€Í¢6§ÓCའæf3pT;öeEpµþî²+¸in–#ÕËõàÙ‹x3FxYÏàež^†}ù+B¬ßd. ^¦Þîy·itÙ—MŸVŽˆ¢6Ÿ»Ý#¦˶5©öµÄJÿµZ2©¶íƒ4¥µÎ …ôÙSxm±óòÜtçO_¬ß4ãíã—¯ã/ÇÇO5Ð>î2^>·ß;m•íýö‹ªñòõøùÞŒqûËËÇÇOÀY$ZÓ—¿?ð§ç(›”ó?=§*“H£BSÓýMBÏ$ÈxîÍʛпž”JS¾yèsÛ€Ê&_×ìùí!>’*è§9™ç0RTÉ-„ŸŒXüæ!1TȾ[ÿUü Q!éEø½§ÈÿzÊ÷?ˆþ_Ä~sŠ><‰­©Èús…üûéÙh2ój’?½??ÿ@”B endstream endobj 2045 0 obj << /Filter /FlateDecode /Length 189 >> stream xœ]1à EwNÁ âàt‹XÒ%C«ªí˜ˆ!‘dèí+œ¤C‡‡ôÁ»êúkÃ*«Gží‹VéCt™–yË–ä@cˆ¢VÒ»ŠO;™$ªîfÒû“H*éÈïún&ªž ù¦Þ=vv´$c)›8’htë½ÝßÓe7 þ¨DÐ ‚-ÖšÀºH¥TE¢f‹l4€ ÷:-mKþ3®´[ÎW’‡(áC¤ßÒœŠKRtâ à_ endstream endobj 2046 0 obj << /Filter /FlateDecode /Length 172 >> stream xœ]1à EwNá@P%)bI— ­ª¶ `"†"dèí+Hҡ÷dûë™ãuô.}¤ _˜Á:o®aKaÂÙyÒp0N磫U/*:ÜT|"ƒvïïjAúä—:iöŒר4&åg$=c²·VôæoÅ÷Àd§hec¢•¤¬bLt5~Ë¥‚t€ÞRBŸ+wå*<ÎãïµbIzC¾LYV: endstream endobj 2047 0 obj << /Filter /FlateDecode /Length 175 >> stream xœ]O1à Üy?Àe‹XÒ%C«ªí˜ˆ¡2ô÷$éÐá,í;݉qºL ÷í ÷\Æ5nÙ"Ÿq Ä:É]°å`mÚ·ILŒW“^Ÿ„\r‡~ç7óFñ}Ût»ÆF‡k2³¡Ù ï5Cr'µ f|*Ð 4”Ô JVÚëÕ7·SWkÂ3·[ÎH¥Õh1k¼@økšbª*ŽäØ­‘Y endstream endobj 2048 0 obj << /Filter /FlateDecode /Length 160 >> stream xœ]1Â0 E÷œÂ7H›©êR– \ M~ª 8QšÜ%mb°%ûÿ/?Ëa<ì3É[ æLγMXš hÂìY´Š¬7yŸj7/….:>ߤÈÂmóU¿ ïêT7í–1Áb‰Ú iž!º¦é;çz¶Ò˜Ü³”R­ªþC)ÑÂpœ$³¦Î´‚ÏøþC,)[ñìgRí endstream endobj 2051 0 obj << /Length 832 /Filter /FlateDecode >> stream xÚ•UÉnÛ0½û+„ •d‘’l)I›¶)rià››´MÛB´¸]K-úïåpè}AŠÀáh8Ë›!ç‘X¾ú#Vâ[½ ð’0¶ÆyË×Z1³PxþÒ"ÆÎU†îŽåý ÕùEñ½ÄOˆ5˜î†L¬¡ýqÎ’‹¶ß´Ý0Œì{VqÔäeÛ¥±=Yf¼RRÏ'=›Ð°ý2øÖzlG”¾!XCìîB$„x]«ÛSš8D”N[y"0—¢œ•3&R9ÏÓ1*ª1Ë8Šekã²:­n®JïÒ®øC βM úÃü­¦VŸÅ?•draß§¯þ8“Ûµ…\ŠbcÛ:Xnÿ®À#Ñ!ŽE¹º€c72}­·±v‹Ò-˜ÚõGU 8ÄÙi]_Š%Çޱi_p}J ΄Ӭ[ëÓ-¾¯ò¡~¥•Œ5lAf‚-æ L7tBtœßø4pØ`{uÝ\_9Mž}¢V÷5 <çt6—ƒtü¦MŸØˆg |N3½®æ©äë4Úá¡˜Ü Q®Ž»dòÖÛ¼µÊ[C^7R«J9O|ŠéŽÁýÜÌ%]/ ,Ú£^’èáè<æ!µ>•­ï§F焆‘†ÉW.ÔÐÄ·SׄجÀo^³|‘qT–SÈ~8wCmxe¶öR í‘(ßÚŠ xqÒõŒ›Ž˜é˃ûÝàpŸØõyWVLþî°Ÿ ÔœЮÍjÍ_*’œ3iº§r­3]Ú#ö,WUªZeuê´‡¿+ö <% ‰ï;êç¿8¨§F¡Zhæäc™þÒËšvØžbXšØ:bf%Œ5åÒ8†ÃÁà¸ìќ֫Ëf²l¼GjÖÞPäÅ3—é…"˜0Ï–²ÌáX¦*Uh‹r©ê"¶îÅÍdiÖ¹ñƒ#…–[¢Âdãj`3Ô ^逵yi È½x#†½÷N]/˜sâEæÉJóE)$2ˆ¦‡“dP¥¿5uQ8™ÈwgE)ø]µP'r–Á6ï öDP“.Ð~# Á†ûÕ[±¶ÞŒo.r>ëJ£~üßšsÔU¼ nêe\ã>Üh”' ûÂú°4‘ endstream endobj 2053 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./brokenaxis.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2054 0 R /BBox [0 0 200.24 150.02] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2055 0 R >>/Font << /R15 2057 0 R /R13 2059 0 R /R11 2061 0 R /R9 2063 0 R >> >> /Length 1465 /Filter /FlateDecode >> stream xœí˜=7 †ûùéTú,-’úlÜùr€ #Õ&¶ÜpR$ù÷4"EíŽvšÄp1§×HJ£yWÒ{çoÿÆó|ÙžÞg÷æ·íývŠîÝe#ïsûëqÿ £PZó×FgÞnè ƒK…ŠÁ]6ÄBàI•GU˜ 榌^·Êìõv{ù­{÷‘Â*$ÖÂfãº0ÎÛ†2 ëKÁ–q«h¯¿-ìã3F©B äj ¹Ež!QUåQô•!R‹=zÝ*³×g†%aá, km^g QfÒëV¹)¬­9òû|{÷ëÏÛK÷n Pk)Ùý¾¡{¾¡ûeóîÙ†• Dv3xL½–]ÁÀb{3?Q%c—(–JÑC$6”(–’ø“:ÊÈ9BÈ=Võ°ªb©ä” %ÊBU†jC Á2‘ üI”…J D6”( U*Ä5ÖP–ÙB.ÙP¢,D´±D±TNj1Ð,S¸-3*ÊB• m(Q,U)B´¥aab‚%ݦ}ú9Xh(ËŠñ>B©†e¥(5¯±Ô®,&‚`Ç'ÊB#ä…ÊJ5,Ô®,c¿ÄÊJEËÊe¥r‚¸ÆÚ••ª–²vaý ±¶§†Ò(摲ùîE±ßêUÈçÅ„šî ”u‡ëø“:Ê8ÝS€’òâBMwʺƒRâ Mwfºƒ@Ö”RwPʸƒRêJwÐÙRwʺƒRêJwJÝA ãÂLwȺƒRêJwJÝA ãʈ;(3ÝAu…Œ;èŠQwʺäÄ&5ÝA)u¥Œ;(¥î ”q‡I‰;LjºƒRêJw˜”¸Ã¤¦;LJÜaRÓ&5ÜaBêó+wPèÀÌ/ùÁÞ!s¸¢Táâ÷½Ñá®@]lRî Š¯0,>²¿ ¥ŠB·žu½Ç±µOJF†T×ÚocYêÃ^J%Ǹob‰b©~¬¸vT Ìì¡„ýTм ý0†ž¥àμ8ïÞl"x²å¨’2¢ã€@X¥Ø G+íóÆŒP˜&A|'Fiçm*LÁi„PÚÎWSìÍó¦5Œÿ×¢G÷«Aœ·×[ÜSÈ4]Œ!ru™k÷ìöäܜؽ}Þ2U(œ&ÑŒ„qFÐöž£õ %ÀHN#‡2sŒöyÓ*„*%ÂÕ8ÚØ¶-/üb•™"g rèã¾tAìíó†HJ0…5‚¶û³÷JŸ7#ôé09övë!U!UJ„uëØö¥kÇV¹?5jM=¿æÝÛvlBHåAÚ{;¶Âí´:#äºæØÛvlBhÝ#Â:Ž>¶Ê¹kÆE Ô\+s†º®ŸíÞ>·™{¾Iø~ªÖÒÞsô¢P難v]sìíÖCªBëÖq´±½èvò~Ã~/âÆã|qß=lOïÛîjŒä^sC‡¥‡ÛGýpÙ^=ùæ®]c` ?><ß¾Ø^\]¨@ˆó Þ}l›Z9‹Ï†=‹—ØÏÐ9í§†šÀWUUéë#g9y·ë2{}ì,þæ¡M2×£‰ ¤óðù3ѯ9J03Ñ.G2Ú™eŽ[zÝ*73ñŸ}Qí%ÚÛBL€©m¤ÚÆí+öSÞTÝ·å§«†½qk_F»)ËzHU•Ç©´û§Þ_{Ý*Ú닼©¯ éK-$Âík×wß®÷+Y1C™k¨_W4+æV™½>ñ%}]âÿ—%ŽxøëNmvª®q¼;Ξxý³-ø§÷È.Cͱ@ÈÉ“ ÀX+¹‡Ÿ¶WOü]ÛŸ!æÑcIy’.Á?º|^Bü¤„9@øÙÂU¶¸d#‚Ú¦ò”<`û£÷ùóî ×Zñ¨ÄTÝ)#DÅéîTÛ) Ö£Ôš"enÛôX‹;¡ïÕî‘þ¸k÷f™ìOÞ‹í/àÀL endstream endobj 2064 0 obj << /Filter /FlateDecode /Length 172 >> stream xœ]1à EwNá@è@"E,é’¡UÕöLÄ@„ ½}I:tø–lÿo=Óa¼ŽÞe ô 3XçMÂ5lI#L8;OÆé|tµêEEB‡›ŠïODà`Ðîý]-HŸüR'ÍžÑÁà•ƤüŒ¤gLöÖJ‚Þü­ø˜ìá­¬bL´’ô¢“UŒ‰®ÆOc¹TNÐ[Jèså®\…Çyü½C,)@oÈK¬V9 endstream endobj 2065 0 obj << /Filter /FlateDecode /Length 175 >> stream xœ]O1à Üy?À„ŒKºdhUµý1Ô B†þ¾‚$:œ¥³}§;1N—‰Bá➣}bá>˸Æ-[ä3.˜ì¸ ¶¬Mû6‰‰ñjÒë“wÜ¡ßùͼQ<º¾mä®±ÑᚌÅlhA6èÁ{ÍÜßIí‚ÙŸ t€Í%u€’•öº@õÍíÔUãšð Äí–3Ri5ZÌ/þš¦˜ªŠ#9öªÀY endstream endobj 2066 0 obj << /Filter /FlateDecode /Length 175 >> stream xœ]O1à Üy…€u‹XÒ%C«ªí˜ˆ!2ô÷$éÐá,í;Ýñ~¸1à¼Øð!ºLë²eK0Ò"\°å`mÚÙ$Æû›IïO"àÈïünfâOyi±kìâhMÆR6q"Ö!êÎ{Í(º¿“Ú£?>êD…šuJèD%*•ºQÉævêªqMx»åL±´-f"ýš¦%UPtì ©”Xû endstream endobj 2067 0 obj << /Filter /FlateDecode /Length 164 >> stream xœ]1ƒ0 E÷œÂ7DUÕJˆ…. TUÛ ÇAp¢†Þ¾J€lÉþÿËϲëo=»ò=¾(ul"-~H0ÒäXÔ ŒÃ´O¥ã¬ƒÝ Ãû²Û|×3ɧ:—M½eÐZ‚FŠš'MUµµ­ 6Òím)¥N—â?”Í ÇIÀ5FâT@ HpL¿_‚9ÄF|õ¨S endstream endobj 2070 0 obj << /Length 844 /Filter /FlateDecode >> stream xÚ­UmOÛ0þÞ_!>¤›ì¼ÑlâìMLÛ¤A¥ “LbZ‹$Ž;’Mü÷ù쬚2&Tr>ŸŸ{|¾â`ýGœ;»Aà%áÔI‹6Z9w¬pôaD:»‰6œô,f£÷Qäì%8!Îì²5ËœS÷Í‚VŠÉñ$wúj< ÃÈ= 5³šBŒ'þÔÍ–9«µ´‹É®Küh|>û8z7[9Ž|ÿ‰ ÁrbܧHñb'ž† B˲NiÎÎp„¤¸b%H]èAVóIÌA™¢ ”ð{ µÏ‰{&G2šŸž5‹Èmö~ä£ňàÛ•9 < ˜·{Íp4“ôœÏ%­ 4¨5Ô$ËÐg*¯Þó‰½xê~àMqù¿sX„óVŒ¾Vkä%šI€µª»_âìÚ9Ä1v÷붨”P¬3‰î›@A§´„Ê!kǺ²ol×,eFek—´r³®V§]Ob©x© xHß/ÒŒ5áØ2®xª–’Ù2Z9únBÙߪ$/ôÆ^º”’•ªÛCvó§à™•.{Í„a¿'ÿÝïÃ@ãû×?Ô÷鎯­¤ý]ôE•‰] á7õã>ñáGÀ¿ÀËše %®Vs÷ʰ¢v³÷Ø ÍõcRiÑã`½ÝàxºÐe:è9åe­¬ju]`«T̩ԩUðtØ1$ÚÇAœǯ†‚ö ø¼¨„TöMªqÅšJWwqagÌÖ™ž;»„Ͼœÿ†oAÕBTÇ(daÚàÖ¥ÈyÁU}»µÞ?ýnˆñ_Ÿà´@‘þÎK!Ù~]±T=:²¬+HÓ+WšNu¤$Ó‰YÚ…ïE;õµ4Mмl~øývÓˆëÊ`Aë§ÁO¨¢fƒŠßA÷™¯†¶ÎÈèáB] pS„=Lôd~¬9·6æpD[s|¯óþ4xyo endstream endobj 1925 0 obj << /Type /ObjStm /N 100 /First 1071 /Length 3076 /Filter /FlateDecode >> stream xÚí]_sÛ6÷§à[Ӈ˂øKÞd:ã&N.wií‹“kÒ´sCK°Å†U’Jì~úÛ$YŽMK±å8×n<ŽWà.v±Xða2Í¥HD’æR&©qDèDk…„‰ËR"d’¹œ.åIžZ$4JIÜ*K¤•†(›h‰ÂHéÄdJì e+l¨Ã!•‡«y‚T¦ÓÄEk›X—J¢²Äf)¤Q6Ó¤ÃˆÄæÁ$s"# ¬N\šæ¨Ã’u)ñY²JM–àÕ”ôü¬Œ¤* ÖaRð’Q&Têˆ µ4Ƙ Š¬6N˜%±ÌeØR›[î°Ô*ª'wTª Ùï$‘Y`Àz­ÉÈ7ä=k3”pÁsœ%2¸‡læ¨4C±LÛ µ¡¬‘ ”•$GdšH%#¯DR·fIú›"•ÍvÊB3ñ³Ô]‹U"¯–‰5˜L˜$ñ’Ó)™“£X.µ"·‰VP½¹C;–ÈœHt Š¥‰Â`°D*$Sl ’I¥©4%#¨4%¬ µ¡!Hj´D`ШÔi² £PῌHdÀ¦IËeM`ÀÞUv"‘hN¦ù(Es2-‚jËŒ¥¶IÔ–a½¨ #T…I $•"1… XÔ l’ŽTh*5äeŠɨ2ŒS-]èŒe!Y3‰6¡GÅ¿•¢6´IEÚÐhmuJÍĦhkU†ÍÖÖÒfˆ!}„R¡s"Cã-•Æc€ëÌYª Ü J‰Ú0ÀM~$qä)cÈÆ é²ÀëÌÒ "G2ψãÎèy½ I•’˜E­ƒ‘ŽLð¯EmÚ¦rçÑ£xU¿ž”ƒzèéŽ`ñæñËΦ>§õ¤Û§eÓvGE“ˆxQœÓ?•ÃnÔ&ïçܯ;p8;ê‚ §;Aú‰oM9íêÇ/z?Tþ}ÑzºˆEFÄ¢½ PNNÐì{*úî»ËƹëŒ3ÙŠu©LW쓎4ßßÞÄ?tû¸èê×O½#Ó^ïd×yG÷{‡înô;·uI­ÿÁˆ 3¼“8D‰e¹V×yã\·Õ+±ŸHšxb-*;¯Ó¤6Ò©Ý(Þôåx“—=ª.x4ÔxPœøxŒ2~ÒµróÐ}éÛzÖ |Ñ3”ýà‡eñ}}š¼#ÛpT%.—hßAÑxRš ¹ªáIò.`1%ðæíÏ ÞÈ ?&³ªúuÁÌ}ôûÇ}ê"óSC@hdƒ7ûG¿ùAd{>VbΉ ¦‚»"óAS}‡Ý Ož¢Ïüi—üz±Õ § åñ±G멡vZ <øÓAUŒá÷YÝùáQ“ÙøÈ7my2a]UES¾™tPŒ‘j‹É02·XiåaJ©üq©¦<!kÛù¦lßôšµ0¨ÇãFgÓ‘ŸPme=„¶*Úüá›ꉇîc ݨñޱ+à¸üà¡-O¡õPƇJ'%2ꪞ`ñ¸ŒTåÛüï³¢‚“ƨ­ómWâµ¢ƒ]øÃ؃§ð þÏáŸð/x?À°ðox ‡ð ^Ãà'xoág8jŠÁ{ß…6!M—.Ú7(ËAÙ fc˜M†è–AÝx´ @» 8‚ Û'0‚~ƒ÷PÁ&PÃ~‡Zè`à#œÂüj÷sMü´¢©+«¡‡#Œ%ßÁÞ }6§Ï;â‡WuSN–}Ê|U•Ó¶laXœœ wâêéhÿqåO©SºQ= {8(tÞɬ¬BÍÁªý½…ÊŸãåù§U;c ¢é 3ÎËñC¼4ó“!¹ÖßØÊ®)†~\4ï¡ýÄ(Z/ñG¼þvXbTS WzXœ@[ Å åa0k(úÏà Cꨩßû 9»ÅáFѲ¬fPOÏæºšá1FZ<2£òã:ÆEUŸ”ƒ¢šÔÝ"®R’*?„q1 Æþ„š†Öー…øob°/?ƒYça<£1T`MGóqB-uð~„£‘ËR Íc|̪ öÍMŸÐ hh< 9*ªã¨r^Ø.GIpÔnŒÜÝhÇîJdìÆ^Ù]zg·!_îîÁã…I{Qx/ ï­ï-¥žGžç‘çù Ïó%Ï^7‚£ºýȾÙ÷WØ÷ç K©ñ¬êÊiuûqœ¾Ž¢¯£èëÑ×K™·ñâ«QÝ`|ùfŒqTµPÌp¼\¬ÈQm±¬¢n(ð†´pƒÂ> ûa¿”*#OyÊžrÉãÑ “¨®Žìud¯WØë9ÃRjX~(© :agQp¶"8[JœÅ‹]pÂÙ¢øÏ q†††††{!¢þÂ(Â(Â(Â(Â(r%Š4õp†w¡äÁ³ƒɳQÝvq)0IÅCa¦ßîÀcºãb =ÁûnòàÉß) œP©2ÊÈ¿ ÷ß ßõpK¨ªFmÃx»úåÁû_¾¥ êI~yðÊ¿I^ $„¼<^ ÑP’¼Ä~Áјìùä°>î>"a¯J¬ÉScºsÂÈúïCTñí'`yÚ=;ìÐÄ8ÜMŽ‹ªõW- kyï«ùÊö­Wkõ¹šoŒÝæz¾Êzý£7^Ï7êºåüí-•k±ÁR¹v——ʵ¹ùR¹¶[_*§Ô°R®ßöÆ"Óµ7–U–åe·=cï ·B5Ÿqàµ|žFó4š§Ñ<æi4¯å÷¯åÇÚ>>>>>>øË££££g‚EEEEEEEEEEEx?ÑÆû‰ÌúýDæ‹ì'ÂûH凷ÝKdot28“›œÔÌùtûInÝ¥í'¦w/‘Íî}£“éÝÈcók7òä}yŒZìsBjCEž_24Õ— µ¢ÏP'n¹#ësÎÅ{²¬ìõPºùž,wÅž¬5¿ÛÛ©eõ;µœ¾¼SËÉ›ïÔrjë;µè1:ÿ¬SÌ—›™]ÑL{‹fºë›y“â!’ÿ,ÀSzRIšö9'£ÛŽä#Þümˆ¿ ñ·!þ6Ä߆xMQ„Q„Q„Q„Q„w‡1z0z0z0z0z0z0z0z0z0z0zp>ÿFù|-ÖæóWYî0Ÿcõ¶ÉüüÚ>/Font << /R17 2076 0 R /R15 2078 0 R /R13 2080 0 R /R11 2082 0 R /R9 2084 0 R >> >> /Length 2991 /Filter /FlateDecode >> stream xœ½šO· Æs~¿A¦·] Ëˆ”H‘zh"@nq÷–ä” ûô¯_P¢f¨w·Žãük?þDi(ê‘f8 àQüOüüæÝíÓ7ýøî¿·fªrütÃãóßßÊñÙ­Iný ÞÀïN«40=ÞÞþý ÅØèR2ÕŒÀš%j)™êXÀ¸'j)™2R0É=.%SˆMÀr[KÙ¨Q¢^cmFXMTOacºÇ€ e›‡"€f‰ZÊFQ‡J-S¡lTkÀ*™ e£Ø5CSØ˜Ž {¡l”XÏÓ°”L1+pÏ.e£LâžT(™j@¥&j)Õj¥L…²QBÀ–Ǹ”êPsôKÙ(5нÇP¶l.e¦Ö‚Bؘ.Àš[ZJ¦XÏó°”j„9—²QR¡Öœ5KÙ(-À[ðKÙ(c@Ëoq)Ûz-tëq)… ¶ÍüR6Êp^>!lkºTÚ'~);%7j*;¥µmÔTvÊdok*{E ùU‡°3Ä [¡ìTíRïª!Ažðv†ïÒs);Õh :”2ƒÊ5•½Ö¢ÜÍR(;Uñ²S­‚n=†²S¼#|ÿÿ«úSl¯Vÿ‹º”¢0kP4A—rAº3A§rB÷!ä NH8ww)U@fžt!PJÐ)\Œ6ä‚.墬T¨’çàRŸæñ]J¢Œ‡/HÔ©\ÔX«²OèR2% Å6j)‰"mÐ7êTUMŠ+®L­ªqQK©¥E²qA!dfU ZJ¦VÕ¸¨¥lTTD…²QQ5J¦VÕÈs:•šU#SSÙ¨¨‰ e£¢j$*”še#ASؘY63…™U#CSÙ¨¨‰ e§fÕÈÔTvjVLMe£¢j$*”L­ª‘²4”Šª‘¨PvjVLMe£¢j$*”šU#SSÙ©Y525•Šª‘WâT2uyHdè'Q9•·7ûܳÐÛ8$$ÅꨉC8ÞÞçáæ|õJÂIÁšuýŠ›ì^ú(!I!©ñ¸qêAjÏŠ4¶žò–»VßÌNE p Zܪ*!¬YçBmDÖC^…• ¤Ç˜Ä’v…q“ªÖA4æÁ›5·œ†S'«>–oœêôƒžÑz…^bPì ›tŒ§Æ=DXÑ4J-УFCiv*U‡" =¬“Ñ~*äñ »ÔP†@| X‡Òô˜®Ò†"úÙóo(J§2Ž˜H¡ëTÆûD_ݦÂã)ªv*ã Ä ñиI@ê} Æáɧ2©È0¶ÂhµÖv e"\AÇÔPÄR;ÊØ¸°Â|›è£}{ÆåTƚב15qGƒ­)¨OM1ÐùôS™“ÕT`œÛŠÆ„ráákJé0ÎÐÈÔBá&û™Ã§¦´™´È¾C¥ÎS²" gŠ¢ø5ÀaæaBÐÀð0ë ³]© F‡ïk}f’pŸJ…j#éV³75(¾ ÖÃT¡Ô1}¾zS†2NcØëxE¦ZF;i(]¡¶ÑNï&‡õ5¨ne :®Åü*ÍDÆÊvÅïàô0¡Èbm}ÜWO*f‡ïée&¤*¥)ÐL+|X«€£c£vXíqˆþó}|¾$ï®ÐaÔÛèÄG6fW¨”¥æ8&œ Ž×nX Œ@¥êPJd4îPøPóÃnJ—©PÜpP1öýVUËP›'³v‹»,ÂZ§2Ö¢ LnìT:pHÇ© ИoB+nA”[ŒœÈÕmŽˆpÞðŒBGÔFžjeÐ>E"Cñ vNÊ€t(U(£®Qõ×C½*Ž36UªS)€}´\¹ÔR¡ãd¦£ìÖê<-Ï»å7Ÿ½Ç€æÃõÒ®‹áJ“íbøìè¼^T¾^Ôu1¼¨|1|Fq^ /*_ Ÿful˱ië)løÄh‚BØFXF©>™ø÷†4ƒšÛYB†† `¼ %l@¦…!¡ Û-aƒ¤Ã¼>YPÛ{áÌvAKØ S_Î3ÿ?2tIa/aƒ”¡JMP[tæé„–°¥@AÙBZ±AïšÂžL~ŒÉP;dñýà„ìü~pBT`†BØ¡Þ÷˜BØ/Ý[\Pûå´Å'nÀÌChcÛm¦ãº2§w9RWFõ CêÿFòg˜yÜñ÷¢`&É¢º¢#m¢ºÐKö¨®Ì¥µLª+u,’åR]™×ð˦º5£äS]éc2–OõŸs‰,ŸêJ-–|ª+eô¾|jw·5RfùTWæä,ŸêÊ\éáS»Û…’}ª+­fŸêÊܙçv÷ ã/Ÿê s»Œj/uÚèåS]¹ºlj÷˜J¶©®”¢É¦ö‚PÇIaÙTÿ!ªÉ¦ŠÙÚiæº27eSýÄ7?,›*Ö¡M+6ULbÃY>ÕI›&9|ªXƒ:íOøT± 8=]øT1 ƒ9}ªŒu£É§ú‡—ØùçŠvb—O73œéSEŒ=}ÙTQZ“>U´,ŸFUüÚ[1U7`á³Â¨J¯#9.£*c…,£*¢k*©Šð²3áTýËÔÜ—SöÕÉÉ© Ëx8UaOMJNUf?áRý«Ø\BË¥Jó‹u»\ªÔeìÐáRÅ È|ÝáR…ÎøÃ¥úî1ï»–Ku4¼d¸Tñó…d—*î I’K•±¤–Kõæ–³\*[Ñ–Ie·¿˜]*»›Ó.ÕÇÖ´%—ÊÕDØTöm‚’KeQ ääRYZŠáRY ”y…†Ge?´Nc•±Æ™`yTF‚F’<*#F~/Êþ6[ö¨ì{˘ôåQÙ·€Ù×rD^“â®åË£ÕýâñõQŽoof½ÓñÓö›Ù"î¦Ñ[)Çw·n8~¥âˆß¼;þù|ûôˆ`Ìt<ÿ',1¨ ùNüüîöå>>ù¢êJü•ìëçÏoŸ¾A<:X/ˆãy÷@…Ž}§{þööåÃ'þH±Ú㉚Ÿ£L®>6(1¸-°'¿—AÚÄ?"¨Ö Õ_ýîA}ÄLá{ƒŠ–Ýù¯ilq‘½Œ«þl\åCûó_tø úûÐñµß¢³»7ìdWo¾žp¬hÕô}̪¯‹ïŸ¼Às<Ûó³þµ àùÒ>{|*þQ·}eXTMÛ‚¿zx|BhÔìµ–pnù/O Õ.~¬ÐˆñÕ BŸÓã }aÿÜ‹m êŽì„¿z¼‹‰ßÓýÔ¼ZfêxÈ¿×ÍŸ[±yím¾XBþûµ„Þ·®Owù8ã`^! Óºª›úΧ¿ ®_·ªA^ïL¹¯Î”_O³XÒ{>?añÅüä–Ëôõ¬n"‘Õÿz¾} ÷ãÿß÷\^ùI­ø¹ƒüÛGÁ™žŸ<6@$•Ÿ_Äx?MÛ ÝûúðÃߟ¿¿o®îͽ˜u~±yŠÎùˆÜûàh_4ÿë¢å­¹§ÕùIní¿q—å¾Kù·MÈï=ʳË~¿÷þ£låÅZýFyî‰þ{U:¶Dj«zÿãÑùáǹ[pÇïÎ:õZ8~Õãõâå>ùð÷è¸Èß ¬vÁ÷ì'(e–ÏÝäÜH«årù×rýýÜתã‹ÛÿGìÒ^ endstream endobj 2086 0 obj << /Filter /FlateDecode /Length 203 >> stream xœ]1Ž1 E{Ÿ"7'3!En ¡`µÚåÁqP 2Qнý*  x–¾/ûgØÇ’3|·™e1)—Øä>?‹¹È5°ÎÄÌËSiå[¨0ìO¡žÿªg¢¤U…› ?n£»zxŽr¯¥…rðˆäS"?F›ÕpIÏ—vG ŽŒÞ2)8òDà%GÞø1‚è¤ËH ¢K~Ú’‚8muõkI¿¢Çy]oøÑš”E3k¦ž%yKkw)þ-TdZ endstream endobj 2087 0 obj << /Filter /FlateDecode /Length 169 >> stream xœ]1Â0 E÷œÂ7hšª,eéBÀRÇ©2Ô‰Òtàö()Eˆá[²ý¿õÜôÃy`Ÿ¡¹¥€Êà<ÛDKXŒ4y­ë1ºZq6Q4ýÅÄç+(°ä¶þjfjîêT'í–Á`i‰)žHtRêÎ9-ˆíßJmÑý8‹”j•ÝÁè*)Xã»±\*H;àšq®Ü•«ðx¦ïk1Ä’b+ÞfŸV endstream endobj 2088 0 obj << /Filter /FlateDecode /Length 181 >> stream xœ]O1à Üy?À‰;F,é’¡UÕöLÄ‚úû 'éÐá,í;ŸU?\‡ŠT¼ØéCt™ÖeË–äHSˆ¢i¥ ¶Œ«Mª¿™ôþ$’­täw~73©'wš]cGk2–²‰‰@wÞkAÑý.»`ôÇ&‚f hÑa£ØTÚj¶•¢f ²ùiSïÔÀg>i·œ)þŠS×´!Òïñ´¤ª’øJ•\ endstream endobj 2089 0 obj << /Filter /FlateDecode /Length 159 >> stream xœ]1à EwNáèeI— ­ª´ ÆD 1ˆ¡·¯ IUu°%ûÿ/?Ë~¸ì3ÈG ø¤ γM´†-!ÁD³g¡4Xù˜jÇÅD!û›‰¯w$Ð`ÉíóÝ,$Ç‹ªµg0XZ£AJ†gmÓt­s ¶Ò˜Ü³”ÖJWÿ©”ha8On)ç ZA €gúþC,) ¶âéðRé endstream endobj 2090 0 obj << /Filter /FlateDecode /Length 221 >> stream xœ]±n1D{…ÿàælà8ÉÚŠ (É{¹Àg™£Èß#ïAŠÏÒìz¤é§ã)§EwŸuß¼è)åXù>?j`}ákʪ7:¦°¼”¼áæ‹ê¾üüÖFGžV}ö7•I¿zÂù^|àêó••ÈM)Îñßj\ —éõÓìIÌž”3# €› $&r$Mö$¶orK`·¤Ü¦'Ø´ín Ø ¤Ü`H#w¾/j'·ìï¨:> stream xÚTÙŽÓ0}ïWD¤TrqèûÿÉÐxRŒ†1Æ0r¢óbX–ôËÏ(DÓ§Ÿµ²*XFÍAÑæ z:—•RU±¬jpÃ6jÉ“¯Æ¿0ïðGo„)O CYú¼¨+¡ìœ´?ÞÓ®)’kK?O éÿuVV‚]Èš%êäH%xÙqJ]L÷E2׃‰¼›Ͷáy·äz,yY7&2&Ìõ ·Ï4H>úÂX«µÅS\å¬0ûÒ½RåMQ É FóÕº §péB Zʺj7 ÑSójá:¶ ºBk`ÙÈ„ÕŠßæL«q¯æåF÷€WÔZ¿×¦Œ¦Z&½œSqGM\°>Ên˜uèŽ{ ö`ÈØè0¹ñŒ×Çg§ß[%6ZÃ_ÜÕ endstream endobj 2095 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./secondaryaxis.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2096 0 R /BBox [0 0 255.12 170.08] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2097 0 R >>/Font << /R15 2099 0 R /R13 2101 0 R /R11 2103 0 R /R9 2105 0 R >> >> /Length 1939 /Filter /FlateDecode >> stream xœ½XMÇ Íy~Cuœ9,Ud‘E2ÇŸbeo²OrlØâØà¿°>ºÙÒ:ހĨÃì¾}Í*ùøªçÇRKŸõùöýíÕk-ßþ|cp÷Îå—–ÏoX¾¿ÕòÙª—FH^Þ²W°^ÞÝþö«w@¥ɬޤ·ÄÚHfyUp‘ÌBtα6ra­½&Ö »g­`lÁj Fv ™¥€Tk#—«4PL¬\X3k!¿²{êL^Ü}bHcÀ¹¯Ž*–X'r²°¶ µ%Ö‰$s… i‰cRá²Þ‰œ¬óÉž,F†N˜X'Ò „ˈÁ<Ç:‘“…Ô$â¦}Hbuà|¦'r²¨ŠDEóÉo$³>ÒÆÊñ%m|¬³f†ýRÅ“u ‰µkv²$³fÑi™³j–HI¬óI&Ö®ÙÉ:iÀÚ.U­ v‰Ý(Œ±Ê8ÇZëZÑçfYU7°c]À‰ VÕh³w7¯œ=†žL;+¸jÁÚpŽ.7‡ZcTb-ïŽuëТ'ë½Aë ªo6N1i€XÈp αusïQ…ÝÖÐ'¢¨70œ°¡Q1tÀ:1 )êêm îã>vE™ŠQŽbŒý±!´V”Ú¨7 ´^⤫Ú@"/]ÇR½20–.>:i÷io •GänXKGœ‘•¤ˆ#¨0Ú-†Ž(îÅ­:ˆ‘ >*µå+và8§ŽE°Öq8ÞF‹³ ôQ;tmÐ{a5À™S®µs+ dІ¹CUˆwP.ukFÛja”%,Âh[/\ šDDè`TšéÊë&Úqù¦4­,ÇçW¥–¯Ï¡© 2Gò’i3â,Ó('s–)#®l¶L™hˆè”iø£%™2+ÈÐà–)÷ }DÞ:e•Uì¥S±µoJ „q[§Cc̈­S‰ÁÒñÔéYÙ­Sé<.#[§b²Ú:íµ³'öèÒÑ3[§£“³Nc[óš³¥Ú­Ž|O©¦6_RUµŸ-Uå¶"o©jo #Ñ-U5Ù_R­¶µ±¥Ú*hïIª&4JtJÕTÀ›RµÀÇ ÛRu­ø%Ug¦ž¤ê]Ag˜%Uw„*’¤ŠiŽø-U¬­ÃœSªXÅ Z’*Vu˜i.©"Ö¹œRE¤!¾Sªˆ, ˜¤Š•Å$UDR;¥ŠTû¼·"‚œRE õö$U¤1B·N‘Œ¦ul"¹ƒkÒé(÷¥Ó©Ëù²ñú³ÿpW¸Üi–Þ¨2`¿¾,–Ô 2C…÷ß™O¤'g’v¨‚‰´€LÒøO““´ I ºY"- “ §m¤ \H‚ 5EÚÀ…­LœH ¸Ü±«µ(ËAÚÀ…„ÖCµ'iɸ͜¤\H-†|âÌ¿¯”¸uHæLàújÕL§´+©14ˤ \Isn ¸¼Ý1wIÆ¡BP1‡vÂÞÆ¡ÊÀc€mãP#°¡¶mq‘˜×†mViLõÓ8 êÐú6Ž1Äùô k:¬sû†1‚qº}ãl‘í& Úéô ëlœôö•½eß8›hû†™CÃiû†ERHÉ7<’²–|ã”ìqÅÃuÂ}ÅC+¤+^8/÷|Å#=œdúFL?œù†·ãò8}#nŠÓC·oxÜl;'ßð0$•ävÎÜéX¾Á‡'¾q"Ë7ø#ß8ã,ßÈÈô´éiÇË7RVË7|\K8ù†“ƒMc[¾‘pùF:äå>®fÙ7C=ù†WYׇíæ:-jÛÆÙ)Û9ÎnÚÎa‹Srë lMîZ¾½ýxÃñ]UYoß—??ß^½ö‚.Båù›e-X¸¹q!E÷òüþöæ^OÖ”é«çÏo¯^#æGÌ¢kyþúvÿÓãùûƒ7 t0ÞÜñîÉ!^®¨öJ“ó?^²ýþKʯ/)nÿ—%õ÷ÏÒ/á¤Ç”BÐþa¹Çâ<œà@EƯ,®¥Ñöbþˆk¢»&{3ý„œ*ðüà¤÷ïÞ?âU—Øï<µø&Ñìþåýñ„ÀÄÍ_:¯˜—q´ë4þøhÁí}r/ס³YÔ/—Ày¾}±DøÓ'J–Z¼']›N¡^NáÕkl%<¦"Ž  00‡¯Ž½ý!©.ÔÖ#’ép$A†Úõ…|Ÿâ+”--š /Íð)k£‰?mcø_mŒ{Oò›{ªy©QÆOºÄÐ ö_\òýõÑ@H¨Ýš]"(÷V¿“ßÿùx Q7ÕÙ\öû¿ÖSŒ÷ïá§F)?öM  Úýí£A3õ#TóûR ³û/‡T~~0ˆ qû7#ï÷I endstream endobj 2106 0 obj << /Filter /FlateDecode /Length 174 >> stream xœ]O1à Üy?ÀÀ±¤K†VUÛ0C2ô÷NÒ¡ÃY:Ûwºãt™Rl\ÜkvOl<Ää+®y«ùŒKLL*î£k£éÞ¶01^my} rÅ=†ßìÅCiÚÈ]ã²ÇµX‡Õ¦Ù`† ÃäÿNzÌáøÔ` ´4-;U† ¹ºnÜž¸ÛjÅÔ¨ÅìñbÂ_Ó’KWqLž}¨Xù endstream endobj 2107 0 obj << /Filter /FlateDecode /Length 159 >> stream xœ]1Â0 E÷œÂ7H1V]ÊÒ„€ ¤ÉO•'JÓÛ£¤-B ¶dÿÿåg9Œç‘}&yKÁ<Éy¶ KX“M˜=‹V‘õ&ïSíæ¥£ÃEÇç;‚Y¸m¾êä]ê¦Ý2&X,Q$Í3D×4}ç\/ÀöOÚ“ûq–RªUÕ(%ZŽ“dÖ”À¹‚Vàß_bˆ%E`+>ë+Rë endstream endobj 2108 0 obj << /Filter /FlateDecode /Length 170 >> stream xœ]1Â0 E÷œÂ7hS•¥,@¸@ê8U†:QšÜ%m¾%Ûÿ[ÏM?\öšG ø¢ γM´„5!ÁH“gÑ*°óÞÕŠ³‰¢éo&¾?‘@%·õw3SóT—:i· KK4HÉðD¢“RwÎiAlÿVj Œnw¶¨«ä ÏZt'£«¤TTㇱ\*Hàšq®Ü•«ðx¦ßk1Ä’b+¾œçW endstream endobj 2109 0 obj << /Filter /FlateDecode /Length 304 >> stream xœ]’Mnƒ0F÷>…oÀ‡í ¡Ù¤›,ZUm/@ì¡bƒYôöÕL’.ºxH˜øÜO/§:ï¶yß–üÉ»æZ6¾.·-³=ó÷\Mël™óþ0½æË¸šæø:®_?+[g Ow/Ü|¸ƒÞiï5y)|]ÇÌÛX¿Ù ÓD†kù÷Èu÷ŠóôxÕHÜÌàzRדôù¶m\w=±D;Wþ;%ë²J•åZÌ/Þ›¬ endstream endobj 2112 0 obj << /Length 847 /Filter /FlateDecode >> stream xÚU[Ó8~﯈*„Zp3v.½Ab€V£aJ+4̃›¸5Nlg;ÚÿŽo“M§©´¢UeŸïÜ/EÔ_¬`°ˆãp•,ƒ¼Aû*v»|~7B7ÓÀYy¾ý‘¦‚á ®P°ÞöU­‹àjòºÄ"b:‹ãx²|6%I:9Ç’¸—ŠOgÑrR´ŒH}[@´˜ h1½^ÿ9z»î §Qô?=4Ècç}Bá<˜/“ʼnó²xÿ ¦p'pSš‹²•9iÝ0ÔTëM'/3w"èÎÇîðÜ÷ÜT+@æ÷Ü„¡Ýš¡8DéIKÁÅ%),Eó0†‘3u‹o©4&ÆkZ'iÈGßtÜ ·Œäœs¥xµæ ¸ [µ¦ù<åüݽFƒŸé®À÷]hh®ZámK’óºÀâ.ën_²šìàNM4ð@JF½#~Z#Qdjyà™Ì1#^\К`a“+ZbSuÁw}ú8@tX£¦+‘! õ–äŠòVþV±ÄƒJõ­vy5–lZ ü pCv´Î¶˜IH]¸Ûa,3ÝØIš$æß‡ìô°B¸°)ï*rªô o³È’n•¹¤UõäÒÀŸŒÿ¼áBç¦v!ó­;sÁ÷r Nk+rù·MÅÛΈ™ñïÝð¢å*Œ’ FI˜,Ìðž}¨’4xÃGŸ†WM˜Ìƒhi´ß6š;Íçpòž¿a¨4g2ÁŽ,©T\W¶r$¹ÅU£'Üaö%ͧz•ŽÙJâ…UIŒ»7É•…I…•ôìô˜Ý[qá’…ÈÔlÂûdÓʤÓåÐváPEú ëÂàJúÃÎE!ˆôïî悼’îåã±õý¨ËåôÖ‚ú3Ø´‚`vuíp8ë†Ø>×׃"[n§²SO3­ÚÝüÌx³þõéSúßìã+z½Ã­”×¶iOú´d­Å5¨hmhlû°Â·a6Ì­‡A¥ggÎitÌØorÌò–aå÷Õ˜k~…ÙØ‡ÒVó÷׋ ­¥ÉÌŸ_J-ùßølè0»÷šW\ñp(«]:/3£¹ i0Š®ÿ-ìt>À%ТãÐý“™µ ßg0³ÌrÚ0œß€ 2»ßªÝHÿÏ5ê endstream endobj 2114 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./histogram.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2115 0 R /BBox [0 0 400 200] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2116 0 R >>/Font << /R9 2118 0 R /R13 2120 0 R /R11 2122 0 R >> >> /Length 3478 /Filter /FlateDecode >> stream xœ½›Í®à8…Yç)²œ^tËå_$6H‰Œ{‡X ê‘ÐÍXÀ㣲¤œ“j‰A½¸÷~]uêØqÇqþ¾;âÝé¿ùóÇcûþ‡¼ÿôÏ-îÿÚxÿÃÆûß6·ÿ~“Z3ÅݧLNâ~œ€Ç­½…G…/b‚R䲉™À„°+LlB&°!¡â`c&±A¥Fb[ë$&(dG1Ó©ßÄ•œ)–d‚NbËù(yt”*S²åNÒƒr¥ZlG`ûú$QÊiíëtõõcûz*Ÿ}}†Ø¾ž!W__1¶¯gÐÕ×Wíët÷up…Ä—µ¯GÐÝ×gÐÒ׳ÜÕ×gÐÒ×3èêë+ûzvíÛ°ÎÉSM|‡Ü` ' bŸ£s”c¡\MÐî ïc¢|Ç\›YG7¸ƒÄGOÑ›–]Àåè(ˆ ºÀ9s¦m7c··Í1S5ån`‚¢«TL¹ÜAÞ¹L9˜Ö]ÀE)%t;HœЦ/o`‚¢c v\ÀÁ¹^ëì8¹ƒN"^(Ë2Nî “Ø 9,LÐ$&hŽ‹;f2‡…‰™Äôm4‡…½$ b‚Îaq]¤F’"Ë@1;‰šÃDÄD#Ã4ð$6j uuŽ Óēب98LÔIL”ÞJyÿá÷÷¸)$¹__9ÇÔI.uÿØBô$¢ýQIôÂ¥WÕ¨–9§—×è¥:)IKD31î>3ÕØIUC¼û,$¬WÉ$BÞåÝçHn-¡]˜3±×“;»H1ÖÝçJ™ÕNLYÂî‹§Rud眩º´û’('Õ)zX‹0¦Ð«—èÈGí„L®ªçR »8¡”Tï)¹º 3•¬ÊUu‰»x&Iz¨5Œ3FúüØØ Ë.Ar')“ð.ÉQ* ؉É…X¤©zx¥êý)v’#•°ï¨m'{öäxálûPˆõf©¸SIÚ£+äÕ‹wÃC á^Jô¤ã=–@.ö$©Ús{ò™bï ¾’·Ýq°8¤H>ìÙ'b×ÛÙG﹨ÁÞÎ(*°©$®7"f¡œöꮘä*Õ°×gw¥ˆuª$žúHáT<ùº3;Öä3 igΞ¤ìW…°³ódæ\ÇLI8R.>Q­;K‰:¢•$!ÖY@ìmQR« rô~\8¹J7ƱD*ƒd¦TwN!R?ýŒ-içìyé$raçªi%Å‘çsU3ž9‘Ô‹ÏÔg½dåKŒzú+)¥ß4ŠÎ.â} ª³¿’)ö,Ÿ˜œêhk;¨Y4—uH}l^D(t™î[Iª:ÃàªvÚÇæƒ‹ý.^¸RÆ>¦ªmÒÎï¥Bîs%Î’õ>6¯Gñ;§’õBªD/©Ú7Â'):‹Ú9fG¹7=y¯™£KcZåS¬äüÎAŠ^Ú•è”KU*Ô¯1> “äµ}¥·+§¬#™½O:Ä?6_œh æu)‘ªùìJ Ò«—œtæÈN/cTöäã^C¥>ü} …‚ßµÓ(UKèÙOqÞQλZðU:‰‰jÜ3 Iw#®ŠVH:Èú"ì+ÉžX{d€)ä=êl¶uñŽõD‰äý ’µhtŽ\)âsØC*úèa§ý‚ëK%!‘Ä=p$îg™H÷Ã*óf/‹Þj³Pê× 1PÉ»^ ŠëI¡2¹¸Kðä]÷}&¯·U7=+&¡° ª<@­:ŒÅUʵ»I)Ç]œŸVIùº[&ßÛ]!Þ}Õó§‡ätû¢¹]X¯+!ö«ú쇢)ýÊ?U¢'½í$µ —BUïa‚꣞×>{ª“$Ö1¬·¡ÔÏ…s^”%³~ÞuTòýË?~z{‚qT%˜9ÕE2Ï;Ø™àÊù:žVæ êNDm¬ß¶P˜Ê2 ‰â©ˆ7QÑË{wð™…ÄøDmÌCm¬ß€[,Òï¬ÆåI®öÞÚ@ŒËmÌCm¨ß€[’0æWÔE²=Y´X— y¨õ°cKóJf\ž¤ø9›¸²—/Ú˜‡ÚP¿;¶¬ÏÛ’MÔEîöžYH¬KÐÆ<ÔÆú رåÒç4ÆäWk¯$Æã‹2æô³x{¢c+R(Š ºH-sò}&°ŸÂ„ºX»;¶R*…jOÒ‹ÔÐ/Vˆñø¢y¨ õ°cÓåƒìÒßIÄû1Ç<“,AÒ@k7`ÇV+“ÔÅá$ߢüõMÒ@j7`ú\úýŽ:‰¤D¡O®.i ‹GÐÆ<ÔÆú ˜º¬¢Öå :õIž­6ëòMóPûY¿;6fÙ›ÆIô!q>ËÚ@V— y¨ õ0uYõqËšìàÛ”¿¾*cH?Š·'ÒÅ*}¾\ºq=qŸñÍ$«Á§0$¡.ÔnÀÔaÍÄ‹Á‚>öõ•KÈâðEó@úQ¼=ѱ±„¢Æá$Q‡‘”[Àjð) I¨ µ0uX—ÓYÿü6Õ¯¯ª˜÷®³Ø‚cãª>$g“$}ÔçËëãÏÕÖ*ùG=¨Ù€õ¥IGK— } ØçÃg’Å*cH?‹·'Rƒ‘i™2Ÿ¤úL2ÖsF€Å Cê>k7`‡®dõ‡ÏÛàEôa7$«CPÆ<~oO¤£èƒ¸u8;ékó—€Å Cê>k7`úŽÀ]Š4'a¯KçÁjY=‚6æ¡6ÔoÀú›Œe1þã"ìj‹n—6Åå‹6æ¡ö³~vl\\²oN>.ºÍVú V  i µ0uû*¦u8‹ã¹®{I?ÉâñEóPûY¿;6®®P\úq’þòXØjY]‚6æ¡6ÔoÀÔe¬º"n]ºB×—P/m ‹ËmÌCígýL_m±£åáã$síë×·ô¬ŸÊÂX»S‡º˜‡ƒp®…’U~ëðMÒ@øY»;ôÍבaNÂEߊT+ dõÚ˜‡ÚP¿S—Iúú­q9—âÇ–‹[ûI—/Ú˜‡ÚÏú ˜¾oæ /eŒËIXWíeѲºmÌCm¨ß€©ËÔ÷ŸX—ƒ\[<.é'X<¾(C?k7`Çæe¼L1'áêêxÙvK?Éê´1µ¡~¦.õ×¥'a}û˜Ví'Y\¾hcj?ë7`ÇæõÅŒ[úrÎNæ+«SÈê´1µ¡~¦.Óx³b\ÂUçYÁjY\¾hcj?ë7`ºI‚+-Ëq'᣾5Ú@V— y¨ õ0u©›"–¾œ„³Ë}BuI?ÁâñEÒ@øY»;ô•-ë;Hãp)PßqIY=‚6æ¡6ÔoÀÔeöúRÖº„ƒî‚EûI—/Ú˜‡ÚÏú ˜î_ÛŒËIØ»H}wॠdu Ú˜‡ÚP¿S—Y7ì,.aŽal¸´,._´1µŸõ°cóÅÇþøv9 {ÎcÚwJ?Áê”! „¡vvŒíqéÇIØÅsCÄ) dñø¢y¨ý¬ß€›×µŽ¸ôã$ìt³F^´Ÿdu Ú˜‡ÚP¿S—¹Øké»üxì¿ý²}ÿƒ~“A5F¿ùºÏouY^ûA?p~ÿrlþÎ}ú¬ûmsðùò‡íûôëŽ;/R)ú…•Û¿üuûîן¾üí©¬³¶Zˆ¸å|U¹Ï•˜µƒƒ~Lãxù•äŸ/©›Ü‰’þgK–_¤žüÿ{5,%Ÿr:–>stu,UýL©Ö1¦þúé³PeÎüÝ?}.úÑDÍßýf*ÆhþýI¨Jöa–‘·a«_³iö¦Ê¯>bö%Ì¥1õ½ÿb|«ffðÐåþ»®ÿ…tùÓgÑ0Øëa•¤«4©Óù«×_S¢(gÛJÌoJ?ÒûÌLþ:–NÿÝ—íOÛŸ¶ÿOÉ‚ë endstream endobj 2123 0 obj << /Filter /FlateDecode /Length 189 >> stream xœ]1à EwNÁ âàt‹XÒ%C«ªí˜ˆ!‘dèí+œ¤C‡‡ôÁ»êúkÃ*«Gží‹VéCt™–yË–ä@cˆ¢VÒ»ŠO;™$ªîfÒû“H*éÈïún&ªž ø¦Þ=vv´$c)›8’htë½ÝßÓe7 þ¨DÐ ‚-ÖšÀºH¥TE¢f‹l4€ ÷:-mKþ3®´[ÎW’‡(áC¤ßÒœŠKRtâ R_ endstream endobj 2124 0 obj << /Filter /FlateDecode /Length 158 >> stream xœ]1à EwNá$0GYÒ%C«ªí|"†DÈÐÛW¤ª:Ø’ýÿ—Ÿ›a¼Œì35÷Ì™œg›°†-Ð„Ù³Š¬7ù˜j7‹Ž¢®:¾Þ¤ÈÂíóM/hJÖÜ3&X¬Q$Í3D×¶}ç\/ÀöO:“ûq–RJªê?•- çI2[Jà\A+HðŒï/1Ä’"°éQRè endstream endobj 2125 0 obj << /Filter /FlateDecode /Length 195 >> stream xœ]1Â0 EwŸ"7¨›¶Ð!òK.eh…2p{T^$;ùþß©vÃ~HqVÕ©Lî³ 1ùÂéY«ßc‚Z+Ýü©ät£ÍPí6__™•VžÃZíÈÕY7Ò©W›> stream xÚTÉnÛ0½û+# °(R¢d;…[4]Sôк9>°- ‘D…¤'__nv½i`ØCrfß¼yP}7‡Þ4IÀϼu3‚æ”—ž]Ü}!ªÀð(ò&E_ÓÔCÌáyùæ*/¼¥ÿiK:Iy&IâÏ®ƒãÔ¿!‚Ú“†a<󋾦B­¦M}Ï‚Uþcô%?\œÆñêÈKŠÙ1E„ȼl†J°e¹#»JÜÃޝvWãÉ “’59ë&?éFæÕúA;Ñ;MK]¢ Ôf>ÿË,~E…ÎÖ9wU¹•ó»O‡’“ª®Úò…r¦áºÒÇC e`æaƒ$5%D· μÏlô{Xp ¼¥ª&ÃHU„Yýï”;•+¡-öIk÷tGš®vN¶±–SR(vv³fu߸è‚HâpZ‹³ ÏYã@­ï"¼‡$máÖÔ”ŠÇžpê¨èp9±î^è{µ¶1;}‘-Gn©v7qi2…$R8wzîÆvº¦fºÀˆje ÁÔª¨^¨î†p«ïmÙ2N?ŠŽ®åIûã $0¶IUÓ1.5w©_rÒm‡†ä8ÈP„ÚTZ?³©ÚEÕv½4ƒeÔsâÕŒ±&Ô$¶—ÌœpªŸõrµ\YH²P §Ü\Y¨ÁlEÇ„Á#ÿ´prA–p5±¾ej‹VƒUE‘ ºSãeWzŠ´í' UƒpU›‘2è['Ä}þÃ/®D"Mh/rQR©Œhæd|ù¯E—ÉBÒî$W¼-µ&g×êƒñ« F^qÆ-…CCuÆbz„5¬Þœ¬--‰¬ö;Æ­Õï’]=‘º§®+úypMê‚\(‡xo ´æƒk¥5×îâ¾®‡+V#ô:ÐÁ{¥_Ï¿PÚÀ, endstream endobj 2131 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./leastsquares.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2132 0 R /BBox [0 0 400.75 201.01] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2133 0 R >>/Font << /R9 2135 0 R /R13 2137 0 R /R11 2139 0 R >> >> /Length 1039 /Filter /FlateDecode >> stream xœ—=7 @{ý‚”*}ÅòÄIdk 0àîÎ ¤0R9ˆƒÀàà"?FÒPwëÀ¸b±oÞp¸¤(ͽÄSûŸ_náñ¹Æ¯ßƒ€™ ÆÆãß!Å-h‰¤¨P¼-‚&²ÅoáÓ=K3ê"ÞRIPSuÖ$ÞB6ÌΚd³Fκ“W. ¦Ò-EÈ´È ±‚°³&Ù¬RhõÖ Í"*ý÷ž•˜ÄçuÇR“¼ÕkZg½¦åëµâ¯zMË×ëuκ“×Y/Ê%íõZ±V½¦å뵬U¯eÝ©—ëãõu'ûIÔþhMLâ,d΀⬓ õBS†jÞZä´HD ¡ÏkgiJ`¶Õ~’ÓâdeË~g1PõÖ"ÎÊ™@ýOâ¬*ì³?‰ËþÍZ}=íÿ¿îY¸¯³ìƒxköã´&aÌ}ù9koÍ~¸¼Ù¬Ñ?ñÖì‡Ë~ÍýpÖ ›5úá¬A6kôÃYƒxëå§zôv®ÞîL¯ã| …ßâ?¡Ÿ?œ·$%ÀoA«´É²bPRëßì•– EÚÌa1Äh)KÛCf§L”´?™°E$V°gMR•=¹Â" jWF“jF¾9‘e)±`#³EÕªôB%¨y¥ü)‡aû…¡f˜J…Ôç^j›ÂAúzY–U Ù¬ƒl»ÖŠu’Ó2$T¢e„d-–ríÉO²Yª€X½5H³f3ÎP8¹Ž*…°åNÖZµÈfY‚RÄ[ƒøIu±&ñV%ƒ‚±%£Ü'µ´£€ñ–q=vÜaMÒ­±–|¬±ºœE‰H£¥¶0´ï R€l‘ÍêkY¼5ˆßg|¬AœETjß_ÛB°6„Fžl5&Þä°Æ,œ±Öt8KÚÛF,ªóìIåx9ÈfUc /`;Å\¤9{§TŠqD¬Ò^³ÚqnÒ’™d³(g`öÖ c|ŽI>c­Ùv–²‚h¬Ts/C- b‹lV- ¸Yƒø ÞÅšÄ[Ö^J,)poa«‹l– °¡·9¬±¹Xƒ8‹‘SÛG«X?þÚ‘’3`]Ä[ÚöiöÖ$þxò±²Y”#AwPùüî ‘2_Ó‡3Éa»èŠ3¾{ç)¤ø5¼ìÿqÄññåß_Ããs[à`9S¼þ96`ŒH@lIâõ>¿Kå*ôûõcH±-4‹×?Âçwxç"%>.ÒÛ‹Ò"÷‹¼]||FôÉ\0Æ‹"p;cû¿<\ Ò¼cÏžÀšy1Ëó!gzëgçq¬`5!öÛj»]úo£™¿@bÄzçyœKÛŠ/Û ãqšë|œæúÓãýq¯ b/X¡¬ ^ha%n7üz Oá)üÖ‚Ôá endstream endobj 2140 0 obj << /Filter /FlateDecode /Length 180 >> stream xœ]O1à Üy?À@Lj%]2´ªÚ~€€‰B!C_á$:œ¥³}ç³è‡ëbåâQ÷ÂÊCL¾àºlÅ!qЉIÅ}tõ`TÝl3ýÍæ÷'#WÜcØùÝÎ(ž ¨#w[<®Ù:,6MÈ:Ó…`&ÿ7ºì‚1› @ƒa–† e£Ê´jT€Öd~Ú´;-ð™»­L•¾¢Ô-mLø{> stream xœ]1à EwNá@`XÒ%C«*혈!2ôö$éÐá[²ý¿õ̇ñ6R(ÀŸ9Úð\Æ-îÙ"̸bl9»VíjãÃݤ÷'!HpèþaVä“ìÚ¤;26:Ü’±˜ -Èz!tï½fHîo%ÀìO§’ºI%5ë•ÒMB(Õâ—±^ªHØ=g¤Ò¸Wå „¿×RL5HŽ}5hUû endstream endobj 2142 0 obj << /Filter /FlateDecode /Length 171 >> stream xœ]1à EwNá„ÐD걤K‡VUÛ 0C "dèí+ éÐá[²ý¿õÜŒ×Ë•\‚æ½~aëÈD\ý5„³#Ö 0N§½+U/*°f¼©ðþmíïjÁæ)꤭í ®AiŒŠfdçr°V2$ó·50ÙÝÙže?M(ÙÐw²ˆó¾+ñØ/e¤ƒô#R*Ü…+ó8ÂßkÁ‡œ$þ`'Vr endstream endobj 2145 0 obj << /Length 580 /Filter /FlateDecode >> stream xÚ­”]o›0†ïó+PUM¤‚ùÈׯ*eZ'M\Uܵ½ `Àª˜íhTÕþûü ™v1Epë=ïy|l —ÿ€±v¥ï;ë`edû‰+gIi¨Áã· Ð:› ížr›Læah×Y»k`$Eß*É'óK•6 ’©íû¾¹ÚLí ÍmJ¡šÙ×SÛ[™ùCÊGK,Mà­§/É÷Éפ+zÞ? å%â¢pÆbÉgV¢¤YŠá³ºq]ŠÀÈQüVŒ0%ý)ñ||¼ží-ßõ”:°)/š‡ˆ2بñg\îUÈ ÂÂR<8¥Ì.¡LÏE¦(áFgëUÀ?½(EbµÈÊ[4*,j¹€ŽEÜPTøip==›¡3û´ä- øFÛÀw@ØPÉÉ÷ ݉5t &œˆq]’ªŽdgu«¢ž™~P 1EËÎ|÷Ÿðâží;1òŒâ°ÿcköw–Áé)äià†‡’UºŒ ÞÙhDZ_G÷y>WФY­c5,?ͽõÆÎþNíÃ,vv›±-ÅÉ/Ž0äË¥?Ž)ôÄk)‹Ë{¡-§9ÒJ¨»c>z:ZÔ 9Ø¥L©ò,ïéì±3úk¬×9IŠü’¤4×G^÷V—|¬2$¤&»”ÐS†¸pùÕ/BFêFßóñÖ¼a´GL^µi‹¤äæ6¹½±¶5cõ>©+†KPöJ¯¶ôíœú ü E<_d=¢²b–| Ä7÷7ÛÔ endstream endobj 2147 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./generalaxis.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2148 0 R /BBox [0 0 105.47 107.22] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2149 0 R >>/Font << /R9 2151 0 R >> >> /Length 407 /Filter /FlateDecode >> stream xœuR»nÜ@ ìù,ÏÅÑ$—Ü%ÛAwvÔ©ÄFFŠü~ Ý­‡Tì’˜GûL‚<×sœàñ¥áÛ0ʬnøŸ@ð0~…0&n^œš$Nk§Y%Õ‚Íš¦TŠ&X-Éy«Gp3R_æA©uèu1BïuR¼ ˆy-ë„^Ð=ôN÷Øn·á¾ýg·…lgå÷Œ’œ“ÁÆ•T|FU'¶‚5•Ì.¨Û­§µ•I¯ZÖ’˜c§å¥PV?hÝ2‹“ïœîµJõ%ÆM«´ Œ8øêÉl¾TdõÕwÜ´úŽ{-Æ7øYž^qÂO<¾$ŠPº+?áò´#È++ZP+¼žøá¬¥¹žà¬$•¥¢$ÉÄ἞lÅœüÞHKjËžüF½å‚ç^® ÍSÙ®¾^»1ÏÖð|p¶£ÆvåõÀœ§/LÝàzohaÒ9¨ÅnËvdºŸÚ½M “Ì&IJ¡ån¢aK¢L¼ü¤™ùùÁ¨4Ëòe€gx†¯µ× endstream endobj 2152 0 obj << /Filter /FlateDecode /Length 222 >> stream xœ]AnÂ0E÷>…oïL E³ ‹VUÛ {‚²À±LXp{4袋géÙþÒÌo§ã)O‹o¾êdñã”S•Û|¯QüY.Sv¡õiŠËËìŒ×¡¸æð1”ßGßú$ãêŸÃUšïÐÙMX3qNr+C”:䋸à~ÙINÿžÖÄy|}%°ØõØ(¨¶lÔª‘jÇ@ê† €6ª[6ÚªîØh§ºg =»¾#6€Žlî÷€º‚vñ^ÝÇ{­’+Ì Ñ"¦,–¹hÊKNî R‡n¦ endstream endobj 2155 0 obj << /Length 786 /Filter /FlateDecode >> stream xÚT[o›0~ϯ@}"¸6` ­ò°vwõeS¤=´}pÀ!hŽa†´Ý¦ý÷Ù>&®]§*åøÜoß!ÖÄ[`/‹c´Hr¯ØÍ°åªÊâËûqz¡V 'š«Ùé;J=‚Ñ/ˆ·ÚL]­Jïڿܲ¶çjÆqìçgó0I¨Á:œ]3£Ü/÷‚wšÊ0É|ãùíêÓìíê˜FÑ¿3ü>æ˜`ŠhF½0ŠR´ ±18ý¸K2ïM3û<êŸ/ƒ’ÔKrŠpåÍÃ4Åþ®\ ug¾‰Ï$¼ù۵ û-ëA\ ±ïzÅzÞ "§Sqɦf@:Mà)˜°½ÚógµLõF銭¹0ÄÉåIÀD]É%Á_m*¸â›~U߬&—¥0ÊË ò@3€¶Ú6H”£4N‹îµÑzDPAœâ@ò{¨Pqf£›/pîŒ7 ÏÈ4þØçØ¢írÒ—0ܱófk›²{UFf“øµ<â›ß«²V†ywÔ2b*Þï•„¨µÔèëxÑ[7ÁÖØ\ãÛó߃·ók#„¢4A8¥^„ Êb2(=‹’-P–º5ÓéPVó<ö5Êc’ø¥bsö{x1øÜ–N°Qð¾Á$ᢄG³yZ&ŸÁ„q­Tc#uà†ë ™Ï¥øï®ew!˜hd$@ÒÚ‚ËÊŒÎe1ÍØÌ40dæï;>šÚpˆ›LðùTØAÓ—¶.ôà¸Û.Û’M­[aF7î†U„¶‚ ƒÃðޱn·¼rä#6wBD“äÑs·Ií²Ø+Åe¯9Îióýš©ÉkùÚü?,Öãñ„cŒIáÌÄñF–îhÊáVÖN¥«‡ãš_Z;#ýe Ó[D›aÙ4ÛmÕÙŒá… J%ß°½0½0“ aé}â™ endstream endobj 2157 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./flow.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2158 0 R /BBox [0 0 139.28 150] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2159 0 R >>/Font << /R9 2161 0 R >> >> /Length 1318 /Filter /FlateDecode >> stream xœÕW;otÇ íï¯`i>¾É6@À-u†+v¬ #E’pîÝÕZp÷©1T,t–äœáãpöwZ`Zów}þüv|ûCÒoÿ>ÝæIÿ9˜¾;˜þu,úÇÁlH52tÇjz{ lmà¦ÛñrÜ¿åe(«±ÒÊÇ¿ÛDk±ª¢…ÞS†ˆKXév˜-˜±„A}#ð ˜ â…J'–%Daµs*‚É„²³ÅåUW&fY—M;Ò‚xu`/C‡¯Äðq6pñò™«º(l ñ’BÇ *aâµ >wuc”QWcåìŒåN Ús-I¥vÕ¶‰†µP«C×¶ÉB2Ss¡N¤­ÔKжÙt‚Í©*=H¬€†R¥bÉìðªI[Í¥B µ˜Êâsv¨q©€×Žb Ñ¢â†ÉÜ2†¨+ÕJpn$‘BÙÝQr¡š)KQû–QkÌÔ.UTC¥(cŽÚ6]pKJgäÐË•ÈJ›øsRr ‹R½É¤¸›Rv:©Ã¸(Y¡kÊ›fMÊeWÎÓåN1…ß@(VRTBw“O©¦ÈÞe¿Y _E‘ ±ÉgöBJR„ÂO Ñ滿oG­‡QX!j4›Â¾;«$á]4©Ÿî¹¥â DùT¡,°Ô)„!1/?Kl(ÝH,šbšï´™!¨¢X30;N zy,s°8y/ľz/†š‘—¡}6¯ÍÕ³¯672“<½g¨g:È£îq´ ìä¡1¹m S#÷3·£=.ä®0žŒu8*™Ü ¾ïÞéXä¦Wów٠ןgõ”@ÉÕà=qx-A¹.°êF˜gN]|wÕ Âà"¾F—Î\’sîòo¤G%œuL°B)ùºÎË CgùîÅA"!I>©”3p¬É:7ÑAÊ‘d­ÈÎ ´ZãŒh²ÑV,;‘éê «™é†EFk,ûª:³2²É2À± ²1“Íðé¾9Š)Yô•efo˜“Eœ3Ì<•L²¸_œ3QMkfe€J0™ç©/ÌP!sÃâME–ÃlTï$'³2‚ÌjÆ ¢3Óf¾…zU™ |&&0&ÓÞ:=ˆóè²ib)o$ÊÉtÖž‘ä&:»%ϸÙ#Ý&S¹Ó© N&qïéD ™Øî¹ÛÁºmdÂ×t²ò$–ŒGvfTZd÷ZênD2¶½Å™öe20çÞƒºFž×à‡Å8F‹~;x„ÕýÉòáº><@عž>úÜŽ¿~Z¤—½MfE&(ÌžOé=4wdØû„ñ“ÕÝoôíÅþˆdÜ]òÑëäþy±^¦Ç֞ǫoZ fγÔ«ËO‹ÏÍñ4-zŽÉ}®¼R¤—ƒÛP‘Ä#Ïõü{zaI:I8˜u,R·nËŠkTƒxVןg“ò—Çx9["õìx"{ÇÞ›Å?ï’ËmöBš<|NÊŸiú#tOÁ#ËW{<g.…ÿ!K£Tó|ä„¥üœ·^÷ù¬X±¹“Ç“s<±Ý[ù`[Ùûiñ~RÉBo ¾Ÿ”YX{U>{¼³ý²O©e_þœÛ'Í¿ûo¢÷“ØÔ±T¼h ö²zöxgûe1^ŽßÞ?ðèúøùþöz|ûCÓ<…Ü…^=ÎLóµÍ&(z};~üê_cÈîæŸ^¿›åHßÌSBƒ^9~üê¿_+ZSl¾ýûëñýñýñyÐÉ endstream endobj 2162 0 obj << /Filter /FlateDecode /Length 173 >> stream xœ]1ƒ0 E÷œÂ7H@•ÊB†VUÛ „ÄAp¢†Þ¾"@‡ß’íÿ­gÞ×|þHÁ¼0ƒód.aMaÄÉ«j°Þä£+ÕÌ:2Þßt|"B ÝÞßõŒüY]ʤÚ3&X\¢6˜4MÈ:!TçœbHöoUïÑNÙ¨"!d£X'[U$„lKü4n—6¤“ÌšR.Ü…kãñ„¿×bˆ[ ,ûK«V9 endstream endobj 2165 0 obj << /Length 774 /Filter /FlateDecode >> stream xÚUÑn›0}ÏW ª0ÇCB+4­[6u‘VEêC»§8 ÒMý÷ÙØ $%m•‡˜ësÏ=¶¯±Ä2&® 25ž²j£el¨ÁÝÖ8[íòf1÷<# ‹UŸjæ×5-jVZ¶ëºæôʲ ñÌZ1ÉrËv¦f´IY%F„'&v±õ{ñs4[ {ŽóA…ùZ¢ß—ˆ1†¾áO Ä.Q*«ä/{DB{ÜÆ>>> /Length 3505 /Filter /FlateDecode >> stream xœ­[MŽ-­ ×*j›ŸDúfI/!R¾(º=ˆ2Èö#Ɔžu•Þ ßåÖ1çöþÏï ÿæß|_ù{¹ÿüïÅ÷ÿ.¼ÿ¸ðþ÷î¿^È€9Ä›¾¿×ç|®¯+Ü®¶VîïK¾®X ÆÖg÷àçú×õÏ_#¿V¦94Ç CìÌÖç’ Æt_  ¶…ù\‘ „„®åDí<ŸÛ2^1È„~LÎQ]-˜ LÀÈy¡>f¨Šo9P;÷綯R!G¿RÀ9gèDäœäs5ÀL!»–tð~hÉ8%µ´uÇ€'ŒÒS ”ÔJ‚(7kðÏïtkÁ8óîkÂF’PÖ‰u2ÖÉjØ;Ñ'VŒ —¸ *·v *3¤3¨ ›Ak9@;ç§–ŒS ¸y_nmc]!nþ¢ó×r vÞÏm¯šp‹x¥ÕcÄknP¶8¥(‹SÖr¢vîÏm¯F¼{`mu#ÞZ‹X61X ûÓ‡”üÒÂ×…òem7@ª$,‘ ç¥uXÒÝ ”–údFàxs…Ę»Ù ù&„FHÒ²c&×w ÊCs*`c£¼D°0P— ‚ÔúrO )Å)÷¿ÒAI7¦ÛìʃŒô+¦„6AŒ"7 ¨V7Ò¦€%A©íŽX€J#Šj-ÝM¤Û\(÷Q;@Jü%SƒxÎtÇR„îâ½Ô¯ä"òCb_çZŒw¬ #ÀÈTÞ17ȱ÷½c”ó+†æ¢ŽåNÌP1e§}…¡´r'DÀ8Kq—” Bè«/%ˆLw¢¢J{ l‘¼c˨‹%O}éá„È[g”ðÖÑ’…µnËV — èV‰SÆ9U̪Ÿ^®è§—sܦwböuòйd šwÉ%‹Ó! ´Í‹z‹÷¢Ü„Í‹´;äcSE€²€Ngª%@ÝâV¥ÕÇ­3ð·´‡ÀǦLlD‘2¹ñ^Ѝñ¾%ˆ^$'¨H´T€F;@‡Ü<5õuÅŒýÇpÊ}™D$Y䪑)Ô~‚h(­U`*wNÓib¡áÿêh9Aƒök¦m¬]&¹±V™”øºühä¾g„TÓŒ€%÷¾´zcdh}Sv‚Œõ+¦„u€Ü°Ëd É ö’ÉÊPR,Ðdä Ôòc,b)æØ×¶1ÕÞÛRÞïX´[Ì]$#»5¢*)¨þ»X6Ã}ˆréÞkëNþ¹DÄúa/”Xf_e´ß±5VI¢Úµ’ún}7­”‰â„wÂÄ}JJ’ðšVxÔ V¼Ó 'ÈÊ+¦Œ81õµˆ«R*ŒBƒæû¢\æîAû"Šs3w‚vÚMÙBaQQ¿PL(u¢D«Â6½\kÿkÓË9õÅøùÚ—Ês[æš%ŒM¢®r©žQ¼;l]}ÍrÅðî4A»c>µ´¢`M ÁGAÓJCµ ä-xUÙ¬ùàUcìNòùÚãàcS&:¢•-7#®Z¹‚~KÐRuJÑX3C*-¥¾›üü@ªóØÖ×%DŽÅ q“O˜ü‰2µ±Kh"v9W•oùɲ/ø\)h‰îÔ r’Õu¢&ñ×l q‚ZƹrĦI| fË}Ã&{É®‰ä§òÔú┾¨ ÆyÈ:0ÆúCƒ²ìSD,džJÇÚIJÈXú¦ýûJûüÄ€Sß>pîK[…’{èÚAÊúKƒ6רÅrlr&í%–»Po%fâk…$g’DU21g÷¸’}fa¬ãÀØ…‘›qtºØrß7Š.‰o÷¥&“”r†Ü×%² ê bëáCÆYNÁq^’8Qrtí#ÊY¤uDD®ì|™±e RXý2pRØçEd(ºiäš¡ºiä<}b{Ü/„ß[0'ÙCïdKöÆÙ‰›c¬6ÇÈ-CôŽ¡ ÍÅ[²`&gÄæƒ™Ó½QDwÈG¡*’³E¡“φÙÃÙCC&¢yÕûÜÒ< Ü-$e-Ü7ÎÐ2»pß’dÀuõyÔ!m}][?¹SƒZ£,ÂäOˆDÜarˆGvÂ<’‚è‡}Ù9†œny”RoØAƒ÷k¦mÉËËÛ»¶*žÀäh&yˆÌ¹?Ðúï—äö]¥Ú7²’(²Î<Êx¿cKˆhÄ]÷Bðã½tO† $º#fàž"9yö–ØwTŸþûK”AÞF|~ ”ú[¶„ºHãx}7v,“ºj´¬d{T¤$¾,‡»©`ï,ö­¢ìÉä÷~ ”ø[¶æïCs¼Me®ä$‰Ø³µßBÄvKг)‰å(oJ™Óë ¶RžÛYŒ© ¸c¬j8Aò†·~ˆ4ß±¼”²~²ñ}hÇ–†¤P³_¦‡:5,I¬mB¹†ðmB¹DàmBµ/Žç¶Ì!%“ÊÞ!U#Õ$“6*rªß\¨„ØÏŸ¨ÝŸÛ²(:™|4Ô$¹LÜWMò¸ª¼Ú—¢ö øÜ–‰Ž¨¥1uUËô[„ž Q¡hrÃ$ê ˆP4B×—šóÐÒ×E²ää”’1úÓ!Õ‘²—·šúx,1ãÐúp8½;@“õ[¦my»aJ9i/¥¬r®^ÝjébZÆA¶lÙëÝ2ÞïØ⥻©)¥Ž·)eMrXpâÖª¤MÊšLWñr·ƒ”ø;–mIÍ›JNÚK%+öudÊÆAõ:ÖÂØ%˜Ö(¥ý–­±P؉ä¤íD²9‚š¸q¨ZuZV ú%™¥v;ÄÉs;JØ4r^90¦mÚIÙìÆÄn‡ltÚ±…a©„M#çĘ®ét:›Óé”î@íKã¹-sEÓÈI}iäð'kÓ}œˆM÷qB·ƒ6G|lÉŸéã$íôq§i3\™‚i¸r*w öÐ÷Ü–Ié㤾ôQCýRµ)¦aªNçvС4-}]\D—=ÍýI’cë¿Þ2žÌ¥Ï¤å7¹¦ž³è‰´ß³5ˆ7j.{:‰«B Lö_+éÉóý¤f8Å ú$è1ÒÏíaž÷qFîTGz)#'y{Í.åɹA"r N–Wôˆ. z¢&í×l ê‘|þtRWuXŠ–þ”ûr6ÕtçLw­tèþ¼~fc®æb)ÔIÓÔPf&•æ2Ÿ\#ÔÀ+ÑÉ\ûÜ­Lè ±Uñ‚¡EyeP'eÕCYêSû™Níe%BOÀN÷‘[–AUºK ç´¬èœÆ•ðœÿY Ñýùm)<°aîfYÔIUÕO—º%?ÕA,Õ©béе;Ûs[Ø,“:‰›j|Y Ð’V¶SC’%DÈÚžÙ1±<꤬ʷBøÊ}jà·L§~ˆž¨CDÛúºr& èoÚÈu`w:ÌXd@ìvLæqyÑ.Ãd¹Q’Ý—90ƒõK†åþ¢n]³™”U÷•±¸»1YróänÂäBýõˆ]–9AFúSB›û­C»f£#½Ô/cíg‚u9&ç(;s» “sé›B»-s`”ö+†ÆXw5\—l&iÕ=Aõ_µ.Æd‰\Ý5˜Ìµ¯E»*s¢Œõ;¶æºžB8.ÙL⦄2MrÃnÆä’Aö`v&sÜïÊœ [&¯˜2âvÉfW=T˜ÝŒÑ¾ì"ÌìËîÊœ öcS¶Pì’Ò^º¨ectzíŒN¯]•9QûRynËÓ.ÙLꪓêëjÌô&»£ÞdweÌî– Y´;6“²)¤!»3#—]ƒÑÈe7eNЛ2¹±;6“¸ê¤Füu-FUÂ.Á¨JØE™´ëÍSK_W©ãp`U2$¦‘…´­Ð¢äÒß+X]EiRï„®öâ ÒoY¤%@ZÍÆ$­*YDòå· -JAÙ[YEi¡NXåÅ š¬ß2%´än5:ÖK%‹xoBWhQJb_WQ$ÐßÎ#ê Râ/™Ä{µ£ÖlLÞ*”E¶T­Ô¢Ô²V9+_{q`”ó+†æ²näj6&e“H™£}E‘J&ÑÿUUQríýZåʼn²EòŽ-£n5“ºŠ¤Â¬ÎB;³ª íÌ*/NÔNü¹-[%«fCy/•Ô©Z¥sz­°B§×j/̾N2—´šIZõQ -Ô‹¬®B½h•^œ Ý!›²h5“¶i¤† +´˜qËÊ*4nYåÅ ÚCàcS&7V³1‰«F®x¿ -T%¬®BUÂj/NÔ!8m}]M–z^5üó£ŠäüØsòK´æ¾ÅÔï èÇõØ ø+ØêÍêöµaªŸ~\•ö-  ÚV]}‹aTKXËÚ>¶´8YÅþjÀ} ­Æ¾ÉKFô5ö #¤À[ËÚX?¶dœV­þlPáÓïµ*¾É‹löÕô-h¹ãjÙ0;ãgvŸdvÂ~.Ôú±¢ÅØ_’®‚úÚêHrjƒ{|#úK¼¹‘ÖçÏÏ*múõ¬«×V½v°6ÀFñÅÃ*óµaI™6h5½Î˜«¦Z¸Z6ÌÆö¡ÅÇjògƒê˜~¿ªèÕ'¬f^}·l ñcK‹“UãëSKÄô‰U?¯ñǪå5þ¸–´±~lÉb½ÖáëCSÀôëYC/Í«d~ÆuûìŸÝ%áWð¯ëo×ÿ…ZÛÜ endstream endobj 2178 0 obj << /Length 778 /Filter /FlateDecode >> stream xÚUÝn›0½ÏSp7#kcB§\´ûÓ&MÚ¦Üu»pÀI3›4k§½ûlLRBiU©ü™ÃùŽ öùÃ^м„˜Ò¹—U3Ôͪç?>Íp 0 o—³«ŒyÁ¥Ø[®‡TËܻﶼi…òCB˜_û!¥ Ür-ÜL%ý0šƒ|W mF  À$ò-¿Ì>,Y]¨Ð"ŸKŒ‡£(†˜R/žSˆ u:WR–¾y›LÖùOÄPà åfM‰õ®,7шº,²R¢nÍL`E!&3ÇÊ•’ûïyºjqcÿ÷DW›¢ŽßDýµÙ¦–rìpˆ1…Ìè±]GßH;?‹²ÜéVñVäv‚Ën´Û¢‡ˆ?¼jJqÝsŸXƒ)IkQ5RµNÞFñfûödØ¡tñ(¬a!«ùˆ16ÔcžÌä ‹EÁ)vÈ÷„]uب)ó{…»Ý:ü½ÈZ©&6Ï ÿ*ÑîTo·EéÎeôÿXPIíÊ[výþ4Œz³ó. ®Ûºå  x°:¾}ˆñïc>M¡Y'Evëˆ èÕçŠ!|}Ÿ>NÆ1IEQìºcý0ŽXní!B¬eYJߣ}QoܔΠ“Ñ(­ñ ÓÌÍv{¨[$`¿-2ûÒÖ={JŽ«+Þ½ÿзÜXgϨ­äz*×DÚõ‡\?LnAç¯ó±4Š$„](í€>#mLÚIÛ ÝÖE)ž) © @t©‚}NÁˆôus@Ÿ·vGÉXe3eCj.Ï2Ûp˜ÓLVµhøàÒÍ} xË7ðha05˜DôÌ:èpŸúªH!„™¾! æ{0‚ç±KÐgŽIO¢ð¢Dâþ£ì endstream endobj 2180 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./diatom.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2181 0 R /BBox [0 0 432.32 346.96] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2182 0 R >>/Font << /R9 2184 0 R >> >> /Length 4189 /Filter /FlateDecode >> stream xœí\Ë’\ÇqÝ÷WÜ#ºÑÉÊÌz.%‡-‡ì(ìD-hHƒ‘P¢a½#ëÖãT÷ᢼ‚ 6²Oe=òdVݺ§ç›#Þœý×þÿöéä¨8Qï·w'Éž|Λ8.äu{:iJä´ Ëû“÷žrL—TˆÙ,)¦¸qÑL©˜%g2œK&Ÿ+ÆQ)qã2q4KL¤*gN”ýöþ¢“´qJ‰‚õ9×ñpÒDb}…(DÝ8†HÁ<‡(ĸqÔH^¬•ë”C T‚AJ&Ѽ±/´ºñBÑ{ö«ITbØXÕ“ ÕM ¶iIPò\-¾v^›hôŽØ‡-WaCfbŸ·‰¹ñ’(1oÙ*ZçÉL>–-ÅB‘Óöþ¤ª¤9mI ©³®”#y¶˜3•º:ê…²lÑgŠÉ¦©.PVÙ¼‹”’V‹’: V .æfôÞÒúpúêë´½ûþä©”’tûÛ‰·_žxûï“Û~ñ…Ÿ#'O¿¾Ã=bvÄš åjX"S®¡ÿõÉg!eÔ°êÖ?ô(ÍJÞ  †E•‚†Š ™I}  îÉ=ÇÐ×âÅ9¢F¢x&>qäH'¨°fÿ7B:ƒfRj‚:hÒ:k¹ûtR–J¢™ÍˆÚóQ=ÃÕrP#ëµç=¢z%@Ô^ Õ« Z}Ô¨ˆÚk¢zÁØ”Hy™c³¬¨½Ú ª×@µ‚¨Q‚¥â2úfYP­Tj/D…¥;ûçúý^ÞÒ  4yÒ%6Ͳ¢öˆ¨^*‘ÆE)-³k–µ—TDõ" (NBi}³¬(òËè›eA¹"ÄËè›eE¦¼Œ¾YV3YP»Q}“˜¨¹mJå¥ÇnY2¿m/57@í[€ú41}Ï™ ¹ ªíC€;ÓDõ½i¢æn¨¶ajla€r™t!s· *Ä\O#Õ- Êv\Á5í–¥PæDÞášvË‚ò‰vØ ˆÑÉ\ÓnYP‰Îw˲¡ä@YpM»eAù@ÁaftËñ6P°™ßn~O§%ƳžqÃ6Û¹;IÏzÙGŠ>@ÕÏì(¬ð99ŠÑC5/^÷V£r[XQ¨ÒìXˆÔZvZ¬6ϳ;—m¬³Ò²c¥Œ‡½bܵÓè¨}ìB$ÉPÁl‚%CÊ93žõRò”žõ’”ÒL³:I°/ÛjTH²h­*æH" ɳ 8C¢ÄÌ#ìå1+IRˆèýíþxóð%êŸaÔÛìR°Xׄ—å9Ù£jXuëzTJ…\@_ÃG÷’b ÂD  î¹=Ç0Oå·¶§ûh[  XÛÙ`fK ” XE©Hö(ÿY]=æOþ3³³ÝcòŸÝ~:Bþ§Dêþ§B–GÀÿ«àÊÕ2øÏ®2váV ø_1µ/_ ªgÆG¡À#n_ҙ첳U™Àì -¸ÌÅÙÀf0›G… `Iõ(7S€9ˆ-Ƥí=‘ïÃþð%ìŸcØëOlßcå{]µbIJKåDÝø‡ÅÉÓR›*k{®P· ê€Ú}P÷nl†Êbë à‹³”€0 cØÝ^K¤h™æ— &@½Â}·DL€êùïmx±ÇÞØ‘ÿ> •„ü÷v˜ÿ¾¤Š™ü÷EêA`òßg¦ÌÈŸEÜ÷Ù[¨aã¯gÜøkW‘ÿA¼=±ÿS(´Ð?‰ÚE Ðßöy]èK"dì=‡ïcþð%æŸ]ÌëOÊÉo©x¯«RQÊZ¥š17Þ¡?D…P7&@u Ö²ä²]s£¯fAÔ=¯Ç âÝØŽPÝìO¥^´ýSar éß[MþËà¿ù±7“ÿ©xÂkÈÂÈÿT‚ñ øßOþ÷<>êpÊ…dyÔ1KÀ+ºágòßz÷Hÿb¯[è/nw8è/ìê)èŸ “$ ¿8ŸªeÒ?‹="-ü/ÉøŸ #ùÛ€ëw¾æÃ—˜v1<¬@ÂY)®ïueªä`ÅPݨ÷³?ôd— y©Ý‚o¥\öñà9,KY¼¥õ¼oZM†)LõÚ¯ƒ„s°Sý¤~k4™/œ#%æïnð§Zw{áR_Ä—}—Ì›âòê¤÷=ˆ/ölPp³. ñEН™9ˆ/\¼u:‰/\”ß*ˆøDË|1+2ßfå"0__²‰ä¼>݈õQoÒ^8 Þ¤ý¾V¸Õ‹8o³›Ì¶æ t½ãï]¼¾Äû³Š÷ãaÙ ÎY|—·ô¯¨Mb/‡óêDÝx‡þ%Q(áArX°Îy1¢ºQw”C€:wc;BIpÞîNøÁ1¥€Ì7KÌÈ|k• 2?8%| -¡íÄ“ùÖ5*»—ŒÄ¯^™ocõd~›0߯ç™ß1“ùæG™ß0ÀüÚûÂ|³˜&e0¿5ò×ÅA‘ŠvûÁXŒ5Y­–÷cÈæ¸Ÿ¼É…êw$¾çר†Q<.B™ãzøêReãÒEÜÓ-ˆºñ=.Å1[Fì±Y° ?–÷¨{n1 žhµÊdux–,BiÉ€,Ñ®v!²÷u×`­Šbd ;f¤@6Uf@6‡x‡-¹ÝŸÏ0ÇU@3RÀ,ï°«¿lùÙ'»™ȺßðÌȺ߅ÏÈ)R O‹XBìî0 "x‡-%yZ2À%LHÌÅÊ ¤@Ã@ ÜÑö% ¾/aÿüÂþx\‡ìµçmå{]µÊåUîQ7þ¡ÇÅW¸óÕ,XÓŠÞùÒ{Ô=¹Ç òÝØžNꢳ&JY-€3Ô©#Å—wê‚§‚²duÆs¼ÔQçC%áÈuêi-¨3 ´Çh„–žêL°‹ºd)eÏ¿‘ê8Ô<ž)Pr!ç1JIv‹)PLñƒoïzïÝ2R  ìÂy¹ÖiÐ%;;´'ÌR¢• &»lË 9Pìù ïqî™|÷‡/qÿ,ãþxX‰”½·çê¥ö½ª^©‹ÎÞ&ƒ¯nAÔèqñÅõUúj¨jÊNhÑÑ ËR!ïØ=Æ0kß ã:DÍLÉÉö¯#(Ò %é5$é45éšôBQzG(½¡P•>úU:‡š  JŸ¨©J﨩J(P¥7¨Ò'jªÒ;jªÒ'jªÒ;jªÒ Té ªô‰šªôŽšªôŸ©Jo(P¥OÔT¥wÔT¥¨Ò Té5Ué5Uéªô†UúD…¥»®JŸßOUz‡LUú@*½¡@•>QS•ÞQS•>™PS•Þ@S•Þ1¨JßA¨J(P¥7¨Ò; Ué; Uéªô†Uú@*½¡@•ÞQ¨JßQ¨J(P¥7¨ÒG¥UúŽBUú@MUzMUzÇ *}¡*} @•ÞP J» ¨ÒwªÒ Té ªô£}¬¡ð%¥à·zh ±¾¤óU5¢jOuûS¡ý,¡%jU‡)»Úz¿SáhЉ¦Æ¨c·ádvìÕ«G‹$6 È~ˆì#¶“ŽØKåL}kŠž¼Š]“£lÜ4ù~T†9rÛ»ÓO\“»µÿ½}Ú~þæôÕ×e3ÁŠcÞÞ<œößëòæ½ÑÈr›òöæéô›³\ÌÄœÎáre/‘”Ïa]ÿôÛ7¿¼uê(¹Ä.mãÃõÞä“Ih÷ûªuïôg—«PÉÎëùíEiÎùüxÊ.F>¨Ÿ¼÷ço÷î}9¸¨P Êç?_"ù,9µ†ûý%„äÃùûËUíýNÈç§ËUI9«žÿp¹FbQåæˆ]9ÿet¸»t qßÛCò ŸÚ×^KwžÄyUI$NÎÿaVWÔÅæ]K[)³›ÿ­¦eXŽKçwuÖâô`Ñ{$…‰­ÊrÉ÷U]bu͸ٮޑòÍïN¿9ó}d×výŸ§7ÿŒôxo } ÈÿÈfuµé%rÙ9+Ïö;‚²O®!J[ÐèÃùw-‚qD&§ö’Ù¢žÓùÏ—«åTŽ­uÈpß Û,Nþüx¹ª©¶Îßœ÷Êùíh½}séMl:=Pöþéÿ7årÍý!&k¾K¹™^GzµiDŽç—«Ø•Xä¶.ÆÓéJh­‡ö­O¾¯¾HMJ¹„ó_/¶ä%åþ}ð²÷O—k¢Âˆ¨y²\ ɤ-¶!qñTœ/Šmþ2Æñ¡gÚÇ‹zâ˜óùo—«³•¾¹Ø  ç¯/W¶!ÃŒ2ý…ÄcÑ*“y.œlJ–Ÿ2œ,‰¼EÓ~„µ“–©NØAç¸^ƒ½¾@Í™¡~?KÒûÙÆãÅ ÙùÁœŠ¦$à z‚Ò8¿Ÿãžøüïsß ±Mÿ†4úR¸B®÷ ár—«ý¦Çk:*NŸ®ÈÛ/ÌGö½¹äB>I€™ü×å*É~^ϯXüƒe†­£g/çoþ4BÚ9+·ze¼ÜØÈ—±Ì=`ʃX*2Ü»‘•ÁiÏ¥”´[ÜãHÏšÙ“‚»ýQrÏþâÒí ¥ÅÆ6+Ï»ÞßK/ž^HÓŸ¼êrIäKZ:ÿv)Ž’K&~;Vk̳¢1‘­yL¸ =“ê1ª/XËNïÓ™,nb§«¶²¶Yk*ùìçÛW¬±¨«WŠ/$WŽ?er‰Úk ›äú—½ØGï<Ðn®ÝœÝàWKäVnòp®Â’šêsßùé"vÙ´lB³ˆ¤ðÑC(¿:-8‚£ìÇN,;±…Ü»ûŸ±CROFLãK¡ŽLIž 5{Òò“F:zÊœž}n˜åã0_æä+ÚÝÑÅZ#÷÷ÄR¾ÁþntN£ùKk—«r•Û¹¶N%àÅ­Ô£®<{Hÿäe4m…Ü$L«JIŽÒýR”f›¹ˆ3wÞÞFÃzü™|µ)iÒó_/öðK8E«wÞâ°?{æ´Ç†ÇKàn&-9Y"_Õn¸|ÂͰmlIËaM˜Év·³­s‹ßž&‹Oözìí:2Ë#g2I*±¬üÊ/«ì/¹Ûäü‡³ª=c¿=ˆÔíÄVzÚ>5¦ 2:ìå><´Ü=ÈXG°«¬=&/U©¿‡Tïìxßë+«œ~¹fÇŽRê»[)¾Ô€fÊ›=fì¡|ñù|-\l(ÛÕw¶¬µ¦|Z˜rýñpÆZÇñ5ü³C¨Ä~…ù{‡à>qòñ:~Šƒx<„z+œýk<øÃ!ÈëÈñ^XÁ|¼‚™œ·?ÑЮ˜ŽZ¦ã•ûa¸¬ñâ×tt;Ä}Yžo9"²nå’I^׌äš<ó¬òúŒð?ÊL‰gÎw¯'ôA¹ú‘9ÅÇËŽs%¥×8øqC8H敜â÷Ù»¦ƒàëÒ’b þUœ1öîx@ïÛ‚ªùj9À.«ƒW“†ù×7§_~uú?9šP endstream endobj 2185 0 obj << /Filter /FlateDecode /Length 430 >> stream xœ]Ó1ŽÛ0Ð^§Ð üER32`üfÓl‘ HrY¢*V´Þ"·æ;N‘âø¶hΈœÓËë—×m½·§ïÇmúYïí²nóQ?nŸÇTÛk}[·¦Kí¼N÷¿IŸÓû¸7§—¯ãþë÷^ÛÔÎuyäoã{=ý芾ék¦Û\?öqªÇ¸½Õæð²,lê6ÿ÷SñÇŠëò|t¦,W$6—ÔS€ÔG(@"ž)@:G¬ Õˆ H ›KȈØQ€ÜEL Ǿ9S€œ# KÄžä¨*ÈÑ)@öˆÈQs>S€5—Ž”(£$ P¢Œ’)@‰2ŠQ€§%6*(±Q¹R€reséèãŸûBúèÈ: `Q†% `ñ°e `Q† `ZÛS‹·aF,Š4§EÚ@,Š´3°x6Q›"ÎÀ戕Xœ¯-Àâ|Àã|=Q>/Font << /R19 2191 0 R /R17 2193 0 R /R15 2196 0 R /R13 2198 0 R /R11 2200 0 R /R9 2202 0 R >> >> /Length 4846 /Filter /FlateDecode >> stream xœ½ZMe¹mÝWþÄ]V(Z¤HŠ #ˆðLïÆ^Ø3§n¿ŸR÷½û:5Ž؃^tÕ)J”øMêþöÄÇÀ¿ýÿ—Ÿ¾÷Ù:~ùû'¥Ìt=þüÄÇŸøøÕÓ8þíIT”ä˜bÄ’ÇÇa#ÎãÃÓçOÓ|]‰Nä/S©Lš–7äJe¬Äs]¨NäJµÆ$V¾PÈ•*Rˆ5.T'r¥âLlªy ’5ˆýJµ‘*µ$¾žþD¨\ãªqÏ¿ì3˜b[jÓ0»PÝ ã¨:/T7äJ•#)®oÈ…êÛ"É•ÆeRø•ß ±IºÚ™g\Ï~C®TnB{Ý •°/|=Ö‰\¨.Ú4J¦«O}"žærJ[‡ÈH* „xÈX$ê ,Ĩ™B3ùYdÓ)û×Qwd[@ù¤²Pú^ÃZH¼"2IL¥43Y°{“læä±WY!:)d¯šYHP®ÙHÏ”˜×H—n©®¤-šº $ÓՈ׭–’·liÝa%ÅôF¤îJ}…E&¤9ˆ…#ñZäpIƒ”(ï³adf`[cøe6ÀRˆQh Â(q<“AYZˆ— bµÏd’ÑôBœ”£‘ ô¦LæE£TÇS§56à–Sh4¢usÊ”FF1w©ì(2&E1÷EÜHE?[B*ÞHE [‹Ì7RVl!´¸VI[¤Å¢héÍ╳«ÜhÄZç¶Çö±‘²d àüΓl•ðÅ,$hq6RÙáôüBFí+IcÄ!œÙšó©•Ç ™\H’à|œA‰Óº*éŒFÌ I2x碬}LiÉj¤dî–¾©:¢v­òÎŽÄoÞHÉÓ—Ñ ÄhÕMcB:@JzFH¼œJ ÷´fR¼Ó(V­™-5˜†4 «'v"T3Í‘ p­a'ÕB¸}w “e-âúÕiµ` ޶&SŽÙékÍE£A‰ !ÿq¥³šVȢɵjä»LHm50ê,¶Èëáû.´ â¨}QÀß9”Ví³&ÙHýŠÚ¨–Ìvÿ“fí*Tl"H9¸=på$/±Ä •…-BF4MÀc«VTœŽ‘4y-Jœ$P{†6R,8i"òò¶Î­|!¨I*h„$y fiWb1•–ÕªÙ~3)K2K¨6V£@Èklæ6ˆK0žmaF=Jûáƒta‘¯¶ñp#—Zäp½O±-¯EF\¬–Qï;)k›]»—l‰K6Îõ‡§H† û¨ßœ´cÑ“ƒÉÙVǼN«c¢@˜)Ù´•Ÿ¼h”WØl§ɨU\A9eÑ,_×lUæRDAÖ )æsU*¬NVˆ ­’ äº Y”R«&UµšàY’QnÏN DAžÙNšŽz‚˜A£‘ úÝ»<Ë5ɵÖhYc® E"T-IƤŠMstæÎHˆƒ,Ñ9.+@â[|m%”KàÌch±iYñIe÷œx°BH¼:øóÀßÀŠ­ƒ21ªpʳC9¨Dƒ¸1*"—7/d¸&ò^ï¬U„ I½ ¾c´ñ0+Þ#ã<±3ŽŒÜ™‘‡;­ŒÜ‰‡ÇbB|‘¹y,‡½È@`ÑB‚‹÷=ÏNµˆ[/<’QñÈ@ühV¹š9<µ¶á!2à…ÜÈjæÞA™¥yó6² %.þAÊ–mlÌR!D –(ÏIE"mGgí*Cƒ´·eâ|ª 2G¹E ?AU8æjbx ’Ú˜sÛ@ù5xKv$aD˜õþuis†!õ’•Í™E7”.Ï­–FWA–‘¹6ư­äã„hß‹W<|p¦Ã|€ð A¯ýD#FzpÆ.øXd€gœ6!RÒç\;u³Ì*!þ××’iØá¡•¡X”’^\ÁE+1<}6b /eDÙˆ7w4å8©t fqGHcë#/næSºeY Ë9eÇ$–f.L}+ܼÙÎó¥ W#UÉ›%Wñ³íqAþâÈØç£dÂ5Ý(F³=›+Œ7 W¨äˆ±ÍoÊDQɱváÈSªØçðÕå&ÏYÊçp>wžÑÜÁë|Sõà€¨´­ÎƒC¹ëž¦p®$ØÛZâºp’F\›5ªë>°g³F nš¥°)Žá]áñŒqð‚ÉõùÃPšò‚ ûl¨pòàgìÛm,£¨µ­ŽõðZƒÔ©"ŽQ«Ô"å¯àe»–ceG@cÔ@Ö4Ð)æ3;Ù±"’à½Ëd˜7/™Û-u:V3J¶öCUFMÈ *m ºöÌmDŠ‚!Rr̬¶ŠµÇÜJPGaÄŽVª÷…Jí`wïtκ¤x;J´,44Œ2¹%®!Í\Ç6hæ“·ÝkN44ì ÔäŒb¿ïicB´ìãŒk†‘ÑÁ†Š·66„=ØÂiY#bF¯ÒÔD!&6Ϋl’°K6Ë­CƘGód5³˜.Ñ4Z Û;–€zÙÁ&çµÌ´¹³tƒÄ湇mÈ–»¡ Šƒ5+úY£¸CpÚlé:X×!•g5”ì̤8Áºæ™s“ ë³ëGvq‡<×ÜQÞÑ Ó´ó >a›Û˜\«E䩲Ý×uï9…ªë8‡0<¥;—²¼µžH°¸4ëqæU÷@0eIÞÚtDûƒéQ¬µïù´‚v«Î#е >išœ¨ïXtl‘{V£Si¥«­…{•Œ:©¯‘ÈsŒéJgÉÅŠTSy¯Ë­ÅI"»áá%J®G¥ØN KªeTñy×TÈ­ryWNK‹imµK+ÉVÙÐθl †b‘~ Àœ÷t…—W)Æ(ã:€/·bŽZ¨MÌQ\µ¿.ô6qð@²mæÁ(UQ×I+"‹-å…~“F=³¯ŽŽÙó¼D &l,±=oóªR»H‹ö¸ªm»Â ®VœÇ9àó̱Ó&2‰až<ö¥b ’‹Éj@PÃó8ÒQ~õ¶0V;vÙæ†,6òH”aíwÑEAN¤°êÃD ÝEFÀ‘å@OoVð[4@ÑÆ_I–äìÑé7VÍãýu{U„• ;.lH@9Ü®©Ècá(úÈ ó¨tÜÇIŒÖêÕD¸ e£JÆW²BÕhT¥%š2 Xäß}dÜPì€:V›v¢}É#À`öªiˆ—¥çÖg¶C¡#_VR+Ư5mà´"±ÚüµwØæÜ4ÎàŽÂÉ íQ6ßé¾t«Çª¢¬Y­šì­i¤­‰Äy q˜f"£M%Q6ɱ®:}&f?~`زJ72FµrÈÂßdŒ…ðˆ8Â5“ANVîZZ_Ys= Ri¡bXMÌŽÀó@ZvoN³F=îƒdö>³Ò[ÿ]+R#¾¶€«X‡cž(½©U’pˆa³±ò7¯ÁD#®ÅXf & I>Ç©³‘UcGg©Ùe!YÌÇNÒÕ~->Œ¤ÔÔM›Èì+š&ñ먖ýÃSu‡¬’ž´XÐQJ¶²SEµ¡:CÁ7¬CIg~“%ÞP昦e#†úµ@ôéxòafûɯ[v=ÌFg€(#ÓL´z ÀÕ«õy1‡ˆÜ~®6G}hhï½Y;khSú ý˜`UëõaV No:ÀPi1û>`â¤ñ~DªAxUÃY è’犪 sÊX‡Â2Ëæ{¦+‡æ~¬ñ;óRºVa4ì¨å²¾j #È1 ™Q·ˆ8ëŠéA1‡¢›ÎÞxf±®^¨y«o ¬êQEDkd«n5ÿbZÜ]v ±$?ð~`ܬ f=Ô0‚ízxU3µ¢d!$Š$ß@ ”¦Zo«A€9T{Ž$«êW¼îµñIê3EÖÒÓæ®s×ú2‡odí*De2£>S˜DÕg2¹Ä¯sÔ ˆÔ(Me.7ÅQªØéï‡|Ô«M…j™³|MÑYï£h(ðÔã-ã©5AOâ£h‚âPYϘ01•›žŒT›Æ¥˜3ZíT+ Ú÷Æ ±ÿÐáçÅQð¡È­qŽÃm§œÅµé>IVÑ83iK*kw¼w­J=Råé<&JÜŽœÚïPÙ®ý_+8x7[m÷xšvÌäÙoÏŠÙ¯Ÿ?}qŒc"ؤ?=ÆñÕSâ[ÉãÏo¼Ÿw9æ—÷ó¹¾²~qhE»ýß;ß¿¢¸1 UÎ~DÝ(Unäà yܹwªÄl©ã­ì¾þD@=Ž_bjãŸPîµÅYWeçn0µ= z\õá鿞¾þîõùS½•'º Èe»`C_‹v*öë1jgLCP•g½Ó.Gµ¶;‚<‹gôr+M WuÀ°2¯>jhŠ46ä|Æf<©^#ò]²Îu`p ÝQVÏoGõP÷#\Vm޶‰qt€šu[MFfìk<‘Ô8L©ä0’0rÛ*ó6͵Ç‹6¿‰z1{ÔæÊÞŠÒ¦+ÜÏ1–P.1xÙÀ³=úO=ðÊ=ïªh!‡ºÓâž<®jŽ¿}âú^èØÿ}ùñøþ»§ï}†¾…ÒLŽw_?õ·D˜ƒÞ¿§2wŸ¾x/¯¨Ì–ÊOßýðé{Ÿa x_ŠûÃÝÇñî«§çzy÷«O7Gå—Ö¢¸o'‰í^1ÐÄS(%òÑÍ߈%÷,å[Yíÿ,çwKýîoißý-ý»¿åúîoßý-ó¯¸%ÿ=£bÞ+‚_Ö%õp¥y |Ÿ¿ ¿5æ|þãýÇß¿`Ä­‘Ï_¾Lš±òù翹“ýáå•IEg>¿ÿyÁ:2ž?üâåuÖ ¦?_à÷¿krS~þêåubxe¾y™nþEú»ûÆzQÓžßÿéÓyõü³}C³ç/¸äÜQåC“(8o‘}âSž71›Š‚FüÅÑù Z¸± lB[¥× =^1þ·ÓŽþýѲõüë»ÄÞo‘Ûóû‡[€ºè+õ7wÚÆWôë—Wj8 &ùŠo=’uÓÎcQ®Á ZLs_1˜+Ú½¼b¤lyÒÚa” =Ë»¯ŸÐJâ#ÆW¦Q.´Ý#hiØ['QôxŠß>W þùUŽJ<ÿç c ÄþÖɳÓq=Ý÷_ð¡À{ëpŽóµþâáòñl^tgûÉËMàoÝçͨvLóG/ølÐÖ¹d=\ƒ»>º_ƒa<“y½ÉÁë\|\tòÿÚ]>Ù=LÄä˜>#LÂBîÁ1sÂ)¬?¸yþÁË«“¹ +³Eg»žÿð"Чóó{¸G¤#vœëïÿ¤èn­Y|ùa½òæY1O2£B>'Ó;E;È$ÌîOÛoR­Hy;É…à×/¯hDã²××/“bé,‹fnõ½û§wÿøE{ZŸãýe÷¯î0.áûEåóËÎô'ĉ\µÙþyé|~_h²ð|þe*™Ë!>ǃ _ñJâº.Bì Ö'úª£Èd»Ê‘k"”èyÎÅvî0sž,b]ÿ~—Òýu2ôé°*4º+×­>}ÃR>{Aµ¼)Ýg\¸ÇëÂí^´òÊÍ:¼ü|[GK¬åû¾5H‰?»IïÌRÚl›D\ùæ­Ëþö®Ÿ?ÞUrap[õ­Êùùý`—-. þêþãÏeÛ«¾¼+ä®›Jxl‚AhNÊ[\™ǃ6Ïç}ÁXͦ^ ¤náCä žÆ§hò´Æáã 'õŽ$[ /Ø”j7ë²Éw—‰+S(Ó˜3‘=ºW'²>•X&ÖÒþÔË®ABã'³E")[Ö9L+óã —ÓóÓÞ";¾ßµüë7oûßwv7ÇŒË/÷¾˜ÉEFÑézm7£Ò¾eѳtÕ7Uþ/Hák D¶ Ÿ_ÞOz‘Ö‡‹8Þ²‹7µý¦.?u™OBå'z¿^"ýßQþ˜ëlg”_~Eï¤÷³¿SŒ¢x+ üçÜ>\¾ðå[®ôinYç¼Æ§GºyÙå:w[ùaÞSÙ7Uæcþ¼o^?x÷ôã§?ý6#Îa endstream endobj 2203 0 obj << /Filter /FlateDecode /Length 340 >> stream xœ]Ò1nÜ0О§Ð ö‹¤†^@øÓ¸ˆ$¹€–¢ Ö òºðíƒù›M‘â ø¢8Âsz~ùö²­·îôã¸Ö_íÖ-ë6íãúyÔÖ]ÚÛº…>vóZo“žõ}ÚÃéùû´ÿþÚ[»¹-÷ü:½·ÓÏxÖ›þ¾§^çö±OµÓöÖÂp\†¶Íÿ-%Üw\–ǧÊrÆØ(@l cê)@ê=F ¢ÇDRò˜)@Ê cN ûjÎ ku y`‡H¯l=0ÿ¯E `ZMÀ¼²e `^Ù `^ÙŒ˜y,ÀŠÇ3°³ÇJ¬zœ)€Í0?[(€- c(~’¥§Å[(‘o¡$ P¼…’)@ñÊ@Š·PŒo¡4ëÖþÍß~Ý}W×¶9ü¶*¯ÿ endstream endobj 2205 0 obj << /Filter /FlateDecode /Length 169 >> stream xœ]=à …wNáð·F,é’¡UÕöLÄPƒzû ’tèð,Ù~ÏúÌÇé2Q¬Àï%¹'V‘|Á5mÅ!̸DbR®]¯îm3ããÕæ×'#(ðöþfßÈZö‰Ü3.y\³uX,-È!Ì‚aHþo¥öÀ§–¦K- ´2]BhÕã§±]jH'¸­¤Ú¹;W㉄¿×rÊ-Hž}4Uö endstream endobj 2206 0 obj << /Filter /FlateDecode /Length 160 >> stream xœ]1ƒ0 E÷œÂ7H(+b¡ C«ªíBòƒ2àD! ½}•:Ø’ýÿ—Ÿå0^Gö™ä#óB&çÙ&¬aK4aö,š Yoò1Õn…n:¾?t! ·Ïw½@>Û}Óì,Ö¨ ’æ¢SªïœëØþIG`r‡³U}-¥ZUý§R¢…á> stream xœ]1à EwNá@(cÄ’.ZUm/@ÀD 1ˆ¡·¯ I‡ß’íÿ­g>Œ×‘BþÈѾ°€ä2®qËaÂ9ë$¸`Ëѵj“n&½? A‚C¿÷w³ ^.mÒí®ÉX̆fd½º÷^3$÷·’{`ò‡SIÝ$„’šõÊé&!”kñÓX/U¤“ì–3RiÜ«òÂßk)¦š$Ǿh?V— endstream endobj 2209 0 obj << /Filter /FlateDecode /Length 191 >> stream xœ]1à EwNÁ â„d‹¼¤K‡VUÛ l*†D’¡·¯p’Òû›j8ŸÎ1,ººåÉ=xÑ>DÊ> stream xœ]Ò±n¤@М¯à¶˜†žEB•؉[§;ÿ†Á"0‹ð:ðß[]k_àà!ÌhJCŸîî¶õZŸþ—é_¹Ö˺ÍGy¿|S©_ÊëºUMªçuº~'=§·q¯Nwãþü¹—:ÕsYnùi|+§¿æzÓÜöL—¹¼ïãTŽq{-ÕpXVe›}2»íxY¾—¦3HgVCê)@ê# «Á@  `MÄD,E4 `±¥ÖFì(€u˜GÌÀrÄ3°(i=°(Ùö Øèâ\o(€GIOÀ£¤p-n)€GIï(€GIw àQÒ{ àq®OÀ§ˆ3ð9b¡7é ð…ÕAr\ln(@ŽÎ9Q€³Q€sKrtÎÈÑ9;È®øùó11d?3UOÇQ¶«&Q“¶nåÿ°î—=vÕe›«/xÔ¸ˆ endstream endobj 2213 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚ}޽Â0 „÷<…ÇtHˆã¤iËŸ`eC -0PZx…„¼œOßÙ‡ â xŽHz“Á¾fêå¶GèÅfÁð͉Š2l4·PI¯¼ endstream endobj 2223 0 obj << /Length 2149 /Filter /FlateDecode >> stream xÚ­Y[oÛF~ϯö‰,šCo ¼@lÚíb‹¢5PjÆ% B‘*/±•¢ÿ½çF‰’IÛÙ,ü ™3‡gΜë7c5óàOÍRo›êd–í^yD­73üüÝ+%| `\ 8ßݾºþ†3幩—ªÙíz(êv5[:ï·fßæõ|“¼ž/´w¦É™²«æ ?qV]‘70Š=;*Ðó·?¼ú×íqãÐ÷_¨!r>R1ñgJ»Ž|Q1J´ Û°Š‰ë'¸áõåé!ãrF¾³7EÞ¶9s„Ñð°` •ºÊ—³¾m»}[yÏ ³\Úw2SÂÁµrLÑTs"mò2¯M›ó,«Šªf–U^6¶û±s`‚Ý™ š ùL¹â¨7W|­вqÁÂQêÜnEÞº*Šj&¾·å†ÅÈzA5©Kg \òQöu¾Ê÷”.ó{Ê–cXÒšHtMs=ºózÊz‰ë…©l™—˼×wµ94ýÝ =[¶HÕÎïÑ6ÍF@Wc;…±É9K5,qS2$I•~3¦ÚB¡zÉ#õ~6¶¼«îG• ü8úzõjˆNº£l`±ÜfO¤c*ö¬¦PtN¨œ¨oµXõÁñT>‡ÚBÂÁ&5­³ÆÌ@1m3L> stream xÚí]YsÛF~ׯÀ[ì‡åÜR®T)¶ìõ®{}lœ«¶ ¢ƒ„€¶”_¿Ý3ñ%QÎÕ¥¢ØôÌôôôàë¹%÷*á‰ä^$¤(—&Jr”K´ç)“X-Ï©‚R:ñRÊåB Ÿx£¦ÇŸr{”LRL (¤R!_ aÆ`n)„Yc‘@¥W@æiÈWÀ?!4çHòD(ΧO„¶Km",<„|R¤V)†¦Hº”ËZ \é &Ž ¤§2`pEPVáŒY…D‹…ÒM!ù Cb ð’ H\Zå‘ôH:)@\é5f,A&(òJHAÉP` ¹+•^àRZb ˜Œ2RCn Bˆ¡ “uÈ&$æ•D!QçÞ,±2Hz”LAÞ™À YøT`15D C™RT¢!…T)¹Ždx}¢@¨ vòcnF i0Ôh £ª!%ŒCE¤åÈ`9µ! Â!Ô˜F}+´˜›…Ä”ÃbAé&f’6$†)¤Ë”ZPc@Tä®´ ÕªWZ§˜ˆ§´µrûUÚkÌ,VT)*U‹$¤ ‚an`×Êhl Z‰2&"´åD …tA\,Ø6P,)92x‰V:T©Æš ChA75‰–6h²ÔZ¢UT/CÀët`ðH«±˜`@z,&XöÁTžöÒsÌ x}h$ÕÞJ…$dá=XW¢S,L[§¡.ÀT‘4È+‘A£Ai#dJG+†,u sðèÑ{{q–'ìh:¬FÅt|Àž''yO‡y“ü¨$kβaÎòóa™Mد³ªÍGÇ%›Î&ÇyÝã)Ue™Õì,¯‡ù´eÙ¨&›Ž"s‰–9;Ë É2?i#UãS`mÚ¼.š쬜5lXM&;½8;ͧ˜ZQXSfÍ)û-¯+VMsÖ~ªX{Zç9;©f5;)>æ¬)ÎY“„8yHtZã°*«)OŠH•yÓ°ü×YV²qg-H—7mϲ–²¯Ùcö„±§ìû'{ÎþÅþÍ^°oØ·ì%{ÅþÃ^³7ì-{Çþ˾cïÙ÷ìv\gÃyÊt duÚ•oXâÎ&l6Z†Uƒȱc6d#eacvÊ ö ûÀJ6aSV±3ö+«YÃZ6cÙ'vÎ.Øo!õ|žcõrj‹r”³ãYYæ-;šÎæôeEg äWVu1]ÔeË˲8kІ²ñ´¿°¦£ü'e~Ž•ÒžV³P¹o†Y ÊÏŠ2¤¤zyÔeùC|<ÿÕ—#0*ŠÞ‰q?â£y´|:BÕæ“ðKÙÖÙ(ŸdõÖ, £V EüŸ?*Àª±„}ƒUŸ¦,˜-šb ñÙpV£õ_° 0©ãºúOQÙM> Ö²HfX]ÌóªG'`iÁðPŒ2ŸTÑ.Êj\ ³rZµ]×ù¸À¬ò›dCl”Ñ ± @ÐÀÈ›Y°ÿ:ûâW6œµ9›Ì° e`Eg§óv‚%ióäŸacYÄñ&`³òŠ|sѧØ(jl@žfåIÌrØ,ZIPÔa´ÜÃ(ÇaÏ2c­.´sX£.ØãN¤£ù(F>êE>ZÄzyžGžç=žç ž£ö”}³{Ù_Fö—=ö—s†E¬É¬l‹³ò‚½Œíô]Œú.F}׋únçûøðíiUƒ}åõìþ¸lX6oÀñqÖ‹›Ål³EYPC/¤N yŒœÇÈy/r¾ˆUDž"ò=žbÁ“ƒ¦1»*²W‘½ê±Ws†E¬Qñ±À€¨„YŒ8‹g½ˆ³EŒ‹ø° J¸è‚>øê«ëу³`Ñ ¡¡¡¡¡¡ÈÍQ„ЃЃЃЃЃЃú  Á—ááááÈ_G¤agE"=k³Ù%˜T“|œýi°¤‹~LbjÔ%!(!(!(!(Ù”¼ª«Ñ ÞBɃg¯^$ÏN«¦m†uqÖ&‚¸ˆ‡ì1¾qÁ†žÀ{7yðäKÉ¥áŽ+¡ŒâêÜ}ÁùÀ÷M5ºŽ%$UAn£ðºúéÁ‡Ÿ&È;ÉOÞæï“€ !$»&B’×P/Г£‹xOP/íÂ¥Æ, —Z·"œ›„KùV=^±^¡{ò)h#Ê_m„±^6Åõ24L¥÷hs›òùv²E½j‹rU‡êŠCН²1¼CðDTgdb¯ó\uìX„%“!ì@ºìëê<ù1¾ìdâR|=½Â®¾«çV5Ïá ôIp &%ìý÷?$PUNòd þ݇‚¸AÍ\,™ŸâZB5§­B{ ? {ÿòøpéBœç–ƒÊÅS€µá›¼…êe¯ž<åçmB³8Ôe¢.u™¨ËD]¦{}[wû“Èú7BBBBBZ @}BBBBZLèAèAèAèAèñ÷œü7öÚÉÿ>Ë=NþC3Ïê‹ì¼hn¿ @p»ûl,_?»¿™ØÔo˜ìÜýÞ3±x@Ê&á¶ÎhË+:ô=ñú+(nµ~bO+$ð˜MEKo0Éœn˜dæKSÌË~åÿîÖÚnRšo_¡•™ÿ—iº4ñ‡Ì­BîøÍç²Û…üúÞ&£ñ`“k'£…+“ÑBð[OFwÓÈ·žŒ^3ÿl°½š¿óü3­Ù%·ÜvrÛÉm§©ü!!!!¡©BBBBBš:¸œæÚ©ƒ>Ë=NœB»DMNî0m ÕîÓ²?ä½:ü»¿¡U±iÏ™ú6ÓnâðlóM™m™¾.…ìË·}åšñr%vY7aJc'Nc÷5 !Å#ãÒ¯ŽŒK»ÛȸP|ed\º½Œãäq þ®#ãR³ó‚6È5%×”\SrMÉ5¥ BBBBBBBBBBB?ï°¸Ò׋÷YîqX¼ÌŽ4üü. ê5¿Ýñf÷6*®ô¦çnàzÃÀ3¿æ$¶½­ûÇë77‰(·.­×=½¾²´þ÷:¡Ï8µ¯qåw×fu@\«ÛˆG£ºÛ€8FF'9œäp’ÃIçn¿~ÿ,ç8ŸæuVÞq§‘;û›Öm_‰ÑÛ†wõ4Ø+ç¿îs3œá;x8f‡cîàá½÷)¼(\Í÷ØÁÏpõ»#wˆÜ!r‡È"wˆÜ¡?¬;$®?ÑB|ž-à­øé~Ýê……“½e”W/´°‰Þe©çn£6vŸÆ®ñiì|«ï|Ú¼N¤ÞäߤèríêÐÜùý!+~I6¨'àVÍ ¬h}¹5+MÝ Wš²Ã)`OX«+\BBt„ìÕº#âÉ KNbH ÌÔòÆk^cM«(O­°~ H”±5§\øÝ7ïÅô¤j÷MÂÞ½~ÿ=8mÛ³æKîÌ\•ƒXö“ª烢bã Ы¾`òI€?|¡ò'ƒæãø!šÆ ÄíÄëÄ1Sã?¸á†âj®J™…¸Z§ìÑܯ¸Ÿü§E™ßB¿ ;p+>—À7×°Tf* vk–«D¦j 9Ú³¨û5‡aóñ¦Ö+<¼c.…UÞœ÷*ìB·Kâp{_Ç}sÀ•½ôb…‚>­c§¾,õe©/K}YêËÞS_öú¡}ñy†ö£_q‡Þ¬ßº'P¨+ÙþK“ÞtÁ‚÷óû… ŸÅù‚©Y¾soëgišb;p? 1lª¯T¹.}èÂEw÷Ú…˜”ÙÅ·‚.k.ç)ã7– úgX: Ÿ4”0<±]nHé]n›Üu5˺ëæhxŸ\"r‰È%"—ˆ\¢¿ýæ :8•àƒàƒàƒàƒàƒ:„„„„„„„„„„„„„„„„„«ë ;9¡õ„„!„!„!„!„!÷tÛszýF¤ô³¬'ì–þß~E¡ä[olbã-Æ«½Œ$›ß-põ³íÏI\A¨ë·ð({Í]xKI´Ö‹oÅÍ<ïN*üÆõ‰ÈÑÅ0Ò%*ðÞ/Â8þ¿~½ ~y½ TÃêzÁtÓÅÒ’o]ªÓk.çÞß’ÆTnq÷ûÃuÿîk+Ä.LõªW¯æŽ÷¯oëÕÜÖöÄsýÓ1<_U†à’ï Vß y©V¿N­n£ÜéÎw‚xu«+ARíçõåå \îklºéª)ø ®÷[®åÜt†Éê™&Ûþ”Y÷‚‹Wo¼P|~Y8^)Þ}/_-ŽßË—‹a¯\/>ÛÛ‰*’ïp‰Šjek«âÖ»e¼®üf›ÏÖl8øÊäÝ)*P8øio´ÿl¥¤rMIåŽ%•ݽ2—›x¥ˆûr°á:ÂwD:'$ß²‰÷ÊÁÛ hçÁ”üÀ"~ =p€@Ò§cp£ábgá³êm•@u<Èfm5Ÿfø×: Øq¸áîFaÒ¤‚\,(J?¼üø\ž{ÚÞx.èjØn±Ýµ“±Y›Öèç¹·áõÿ=Gfñ endstream endobj 2231 0 obj << /Length 1723 /Filter /FlateDecode >> stream xÚ½]oÛ6ð=¿ÂØC!·±«OÛi懦X‡ Å0töàæ–h›©L í$ýõ»#O_ŽÔ[1$°¨»ã}ñ¾¨`äÃ_0ºòGó(š^Å‹Qz¸ð-TïFnñù׋€è&@8iQÞ¬.Þ~L’QàO¯ü«`´Ú¶Y­²ÑÚû°g…áz<‰¢È[¼Oâ8ñnXÉä Æ“páeÇœ—°šûÁÜ ¢d|»úýâ—U-8 Ãjˆ”Ϩø1`ãÑlOƒ(vz¾wú¤*WVÙØË¸,…ƒvWäÊ“ކå¥r µƒ¬ÚqÉ53—›ªâqiô±ÒºÁ0‰|+—['<„àºïd'µñɰ߶1Iä™=w RÓ½˜Ržr C%íPÕNNÚœó-Q1™¹Åu®0ïÏ„}ñƒX¶…-œ°…g.¸€í”?@ñ-;ææŒGë¤&R^V8Þwš$‚ëBs—dóÐciªt&äνZóðiåÀâÓ†—¦¼¦Ê29áwü„"Fš¦Kã  ¼šEÝdLÂÀ{èÏDôÁ"ôJ²—qzìå4‰f¨Tàx@eÙCEíqŒÙWÕÅ™ ¥äXía­eF‹‡ªÎUæÏ»æGÑ™ùQÔU:îj†åü‹ïû½& š“X߀zµoÎÅDOÅ x3µÞè©q«ñ"ò0‚Ú\B¦hU¸B `[úÜr«m•†U…lG'¼ª-횸;æLç„( –ÚH„u+ëÀ­eÅ0{çÓ8\~„ønoúvÀÉàRfœ›!ªŽÛMÓòÒA%Å‹’DgjG’VG»l±¼^õünqú {@Uî¿ušNÝr†ÚÊ@h"6­Õ¤ÃëuH·~è=þF=i!ÉÕ8vé=e½*°°<§i'gUéÏ9%(qwá°aº*+õŒÛv1÷ˆ¤3EÞ½€^ÓSüù‰…”=)‘[úÂùÄ6œ:î§åO?Õm¸9a·î9ƒ3®°Q6«åg±Û›ïL2=ÅȈ¨6ˆËËÎ>#Ò¯$Å.—:ø _ž„~À@ÒM+{²~RÒ°´µÑ-Õv`¢õã:ºú‹l¶“ < ûJ]Û½*÷l&pÔ4wÝFÃCËÊ!5êˆÔ‚¢íJÁKvÞ€—8µ•ªçTpÏûšZ·–;÷}»˜µ¤Åá°aßß(§pùštDHX§3rÔ‚»1‘Ñ$@ëqx–®iðTà\`ó ›ï]QoS`p0Šcï~ª‚Ƚã×˼:MTNòçí¶)6$o Yµ2ãξ/ß 2¯"o¥Ša ¯Ð«{w£Œqc訒ŜŽjáS±…MöDà™¹áá^º×³pˆ+±°Ð<5Ð1rzµ#΀N~}{ˆÂ“mÐ [þžµ§§(1½;h ígBÜ 2·UözuDBá¾$xÌ=JWÜLŒÃ0 ½…÷ÕѸk~QÅ‚°³Ø­œëjKy{‰„Øw„ ü™›Ï-ë=Ž]–-Uª²BùVåt¡ÂŒ~zml;¤|÷‚Iëi?hw4¥Õþ¶JÃU é¸+oÐõëRÖ×÷ ^€èùP/ÙðnOoGá2kc{¯tt‰ÿoðÝ{½¬A8,¹Õ_†=à’ÀO]ÚtSt‰5­ÕNk¤i!‡_€ß— š÷´¾8©/qBSœ´kmBÙ 0Åø²‚8nW¼ÄÞ¬[Úþ†¼Üc«Ù¡Ë=öX–ñìLbgžCD.v²¢jxÚÑ·ïVQOUg÷Èà*­«Á.wñRÛ9^®¥øf'· L—øS»)ÃÙ4ò«¸8JSì4+ö×½ÑÓ¢"O÷skB*Lf½¬šX’Bž–a!ÞÊëžxê~;-%¿o ôòþ»*„tYSÚ}x"MÄÒ¿¦UçÃ’$è›7¢¾¢Á“¡ôœÝ]Íîn€Ý]—]Ò5ÿ´·ë»Ûe)¤åû½€;^§ÊÖ‘»âÌ›„!žr×Ï­ —êÐòæïÏLȺw_h;~ãýxæ„ endstream endobj 2233 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./image.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2234 0 R /BBox [0 0 340.16 246.85] /Resources << /ProcSet [ /PDF /ImageC /Text ] /ExtGState << /R9 2235 0 R >>/XObject << /R8 2236 0 R /R7 2237 0 R >>/Font << /R11 2239 0 R /R15 2241 0 R /R13 2243 0 R >> >> /Length 540 /Filter /FlateDecode >> stream xœÕ•OoA Å9ϧð1ZÇöüópzKº·ŠSEU#qàë£ÉΖqRh­"”ÃF/?û½ñdfw@È@õÓž×[· I‘ ó—_!UQ®ôj“áý7·žÊ$eôŒ™´J…E€‰0æV¢SÉjSàæ» XJá?Ã…c¸uÝTÈ­¶÷‚ø”±À»|€É™0Þ =ã%£§ØA³ÒS1$_:jVz*+aîýšp)c´™ª`ñ%ôPS a1ËkŠ¡’f4Ð$¦pÀ`üšÒSRwûV³b¨i:èx_„=¯¦Ó¤ôT„)KGÍJO¥”1POÍJOi ȾÏ>+f,„j†ÕCù1qO5ÅP1ôf¦M1”#Ǧ˜y‘d4ãšÃH {¿YÙSö<°;GÇèàÝ¢¯îÒܸãý]íq½…w£[m¸ÎKŒã7]$ žDT%R·îjñjY4}/jïë Š/€`ü쮼ÕkÌ Ž=<·ÝË7Ëñö¨Ÿ·ýè°Ÿ =°¢EAc"™jNÉ{Ôÿóê“ó¦\òùó¦§çUâóç ÿY^1ý†Rãåló=·§íWgÂ\Šõ|½5çGì9þýjY÷?ÛûË8‡ß;¿ðšÓÙœõ4ç?_Í'9?²FªoøÙ#§©äí’Q’P¨F·vk÷4§-" endstream endobj 2236 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 32761 /Height 1 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 32761 /Colors 3 >> /Length 742 >> stream xœíܱÄ@ AmþAßÁ {üŠ®Œ}ßxï{{sÈŸæ??Ì9 ~˜s@þü0ç€üù÷æ??Ì9 ÿvÿ7ý‚Í9 ~˜s@þü0ç€üùaÎ?\~˜s@þü0ç€üùaÎùwû³/Øœòç‡9œ÷¿ß¬_~~þü£å‡9äÏsÈŸæ??Ì9 ÿvÿt»k@þü0ç€üùaÎùóÜòç‡9äÏ¿7ç€üùaÎùóÜòç‡9äÏsÈŸæÐùÃå‡9äÏsÈŸæ??Ì9 ~˜sÀqÿñó9 ~˜s@þü0ç€üùaÎùóÜòç‡ù?lüv Ì9 ~˜s@þü0ç€üùaÎùóÜòç‡9tþpùaÎùóÜòç‡9äÏsÈŸæpÜü|ÈŸæ??Ì9 ~˜s@þü0ç€üù÷æ??Ì9 ~˜s@þü0ç€üùaÎùóÃ|ºí/ä‡9äÏsÈŸæ??Ì9 ~˜sÀqÿñó9 ~˜s@þü0ç€üùaÎùóÜòçß›s@þü0ç€üùaÎùóÜòç‡9äÏsèüáòÜòç‡9äÏsÈŸæ??Ì9 ÿtÛ_>ÈsÈŸæ??Ì9 ~˜s@þü0ç€ü«ýÇÏç€üùaÎùóÜòç‡9äÏsÈŸoÎùóÜòç‡9äÏsÈŸæ??Ì9 ó‡ËsÈŸæ??Ì9 ~˜s@þü0瀹¸7{~Àæ??Ì9 ~˜s@þü0ç€üùaÎùóïÍ9 ~˜s@þü0ç€üùaÎùóÜòç‡9tþpùaÎùóÜòç‡9äÏsÈŸæpÜü|ÈŸæ??Ì9 ~˜s@þü0ç€üùaþ}}xV endstream endobj 2237 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 256 /Height 256 /BitsPerComponent 8 /Filter /DCTDecode /Length 6127 >> stream ÿØÿîAdobedÿÛC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YÿÛC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYÿÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?×û7µfö­!}EgÕðÞÜòžWäc}ŸÚ“Èö­ƒoíQ´ÕJ±”²Ût2Œ4Ói4>Õ GVª\åž”¢SÒ1V]*­¹ÅRŸ(Ê\P)ÀWU:|Ç3cvÒí©Ó‚×l0œÄ¹l£eNœº£—_¡<å}”l«(Ú=El²¿!s•öQ²¬m¢‚‡•ù9[e*ÎÊiJÊYuºœ¯¶“mNVšV¹gƒå)H‹•!Ã\U)ò”˜€fœ4 ÍN‰\­Øè§O˜ŒGJ!«IL°ûVN¥ŽØa9Š"j_³ûV’ÁíR j‡XêŽ]~†WÙ½¨û7µl}œQä/¨©öæË+ò2¡ïR&¡ï\˜¼aëR%ï=k½àÏÐeGcö{Õ¤¸Gë\„7¾õ£owӚ婆±ÅWn‡BÈdUi#¦Û\çÕ·—"¹u‹³<\NÆ\«U%¥2Ö|ºi»Ÿ1‹§Ê@µ*Šjeîa!Ìx²c•iødÐ85Ræã澟 †V3ŠrvDò\*tª’_c½f\]ã<ÖlמõìRÂô°w7P÷¨Î¡ï\Ü—Þõ ½>õÖ°‡tpGR5z‘5zä…é÷©RûÞ‡„C–Èìc¾ÏzµÊ¿Zä!½÷­{¼ãšå©…8ªàìtœ0Ȧ2ÕKkœãš½Ã.EyŒ2<ùEÁÙ0¨Ú§aPµ|Î.Ÿ)Qc¢n5ª°ŠÐ…kÁ¨ì{HsÇYXÀ4F  š¯sqŒ€k—Y;#éðØk“¼è*¬—ØïY—}y¬Ù¯=릞ç¹G~†ãßûÔGP÷®rKßzˆÞ1õ®¸áèàQ}¬}ª¼¶^ÕÕ5§µUš×Ž•î:dCîrÂxÎ*͵Ï#š¿umÁâ±åC ™+š¥$Ñß Æª±ÒYÜgÖí¬›×ÇÙMÒº[ :W‡‰§cÈÆQ±fuëYw­l\+&äu¬h³áóÚåd©ÐT VR¾«.ì|ÄÆ\¾ÄÅ`ÞOŒóZwòc5Í_MÖ¾× HíÁÒ¹Zêç¯5žÎÒj$c#ûR^JŠŠó>£ †¸Ð”í¢‚ÔÂÕåÔÆ»îz±£?h¤)MÞ)Á©SÆ»îŒX™¯[\ò9ª„dS(ÙêÒª«+=Ï7…I]MÆqÍoZI¹q\u”Ý+¥°“¥pb©Xù|e+.*«UÞ¾31®yð$·+NéY¶Ý«ZØt¯“¬Ï£Ë£{Nû#Åa^Oךӿ“®júnµXjw>çFö+]\õæ©óàPš_aZÖ¶Ü+Ü¥I${mÆ”JqYgµY[:V¼6¼t«kkí]j™çÔÆ;› *¬ÐñÒµÙxª“¯ºÚ< uÎzîÏßEÁ®®íx5Ï_¯Zå¨w QÜͲ|6=+§ÓŸ¥r–üLG½tÚqé^..'F6:³s>Õ“uÞµŸýJý+*ë½y”w>4[•c« Ò«ÇV}ŽV¶>BfF¢ýk—¿~µÒjG­r·Ç毺Â#ÜÀGbº s¥1Ïèîϯ£Dß ’‰ Wc^$æîDæN$©‘ê5œý+“´8’º}8ô¯O´¹òxèît'”J‚Jœ«_¥A%|Fh·>~;’Úö­‹~•kÚ¶ û§é_\ú¬­lfê/Ö¹{÷ë]¤z×/zrÿwá"~ƒŽ„¶1gÐZCÀâ²,¥tVkÀ¯rš#Qܹ<*âAÇJ ^\E⺒<•Ç3qU'n 7j¤ÓqM²iÓw)Ý·¹ûóÖµîåà×?}/¹j3ÝÂAÜ£oÌçë]6š:W9d¹lú×O§/Jñql鯽 —ÿR¿JʺïZ²ñÕ“uÞ¼Ê;Ÿš=ÊÑÕ…û§éUã« Ò¾Ç+{!3Rk–¾5uºŠõ®^ý95÷XG¡îà%±QzS¥:3C àÆÓwg×Qw‰JAP0«²%Bc¯pÔÎpw ¦ŒP#©£JP€B䱎*C÷iP罜ѭGh’Z É]>š:W9b™`k§Ó—¥z˜§¥“ÇËst«_¥A%OÑÒ ’¾#4{Ÿ?Ém{VÄpý+×µl[ô¯Š®}VVö25!Ö¹{чük¬ÔW­r÷éÉ®ü?AÀËBÝé]›p+•°—¥t’ð+Ü¦ÈÆAÜè`n]Fâ² ›Wn:×ZgR›¹’×^õZk®:ÖC_{Õioxë\®¡îCî\º¹àóX·_h¢IÚS…©m­É95ÍR¥J5I]–lbéÅtº|}+2ΜVý¤{W>•áâª\òq•®>àñŠÉ¹=kJáºÖeÁëXQGÃæ2½ÊéVR«%N†¾¯-•¬|¼ÊZ„yÍsWÑu®¾é7¦kò çŠû\-C¿VÇ*À£âžE[º¶ëÅQ!ó^…ZJ²ºÜúŒ.%%f)ZaAO .Ey0nû¢«FSÂÒäR”0nû©; ¨ùvÀ£—8rÚÜäq^½*’»<ìN%ZȳcJétøúVeœ8­û8öŒ×*¥Ï–ÆU¹aúUw©ÜÔ_˜Ê÷<ØÛv­{cÒ±íûV¥»t¯’¬¥Ëekêç5Í_E׊ëîS|y¬È:ñW†©cîpUmcšŒ2àô­‹[ž5BêÛ“ÅVI^ƒÒ½ÚU.fqUc¡ÖÃuÇZ¶·^õÊC{ÇZ´·Üu®¥PóªaÌŸ"SÜÓÖ͉ç&º1§ûT‰aí^+ÅŒ8lý«JÞÓ§§µ\ŽÔ/^+’¦*çleÊö¶ØÇy°‰FUA$•ÆÛ›SÄ’'ᆠQº¶Îx«jiü0Á¯¨ÃbˆŒœÑÍ\ZgÓï^g±gÀ<ÓÌÕ3ŽÕOïY¦ãÞÏïMQ1–c~¥æ›Þ y*±›Þ˜e­;•1œÄ®õœÐ_4ÂkT¬pT©Ìž GKšë§S”åh”5<5Aº—uwÓÅòâXK¾«ï£}uÃ1·Ry SÔ 0ŸÝú7Öë4óVO„þè£å…AæQ¾‡šy‡+'ßH^ ßFúÆYú‡!)jiju&ê䩌æ)Dq4ÃFi+‚¥NbÒ‡:=Vàø®6®tÓ©Ê^I*u›Þ³D”á7½déÜï§‹å5–zOXâzp¸÷¬Ý®ºšþjž Q¾?îŠÉûO½/Ú}é{n³O2®Ê6U£ÔQ°Wؼ¯Èùr¶Ê6U”Ò•”²ët9_m&Úœ­4­rÏÊR‘)*B)†¸ªSå)1Í8&hAš¹[±ÑNŸ1Ž”CV’:™aö¬K°ÂsDÔ¿gö­%ƒÚ¤þÕ±Õºý ¯³{QöojØû8£È_QSíÍ–Wäcý›Ú³{VǾ¢³j=¸<¯ÈÆû?µ'‘í[ßÚ£h=ª•c)e¶èei¦:Òh}ªŽ­T¹Ë<)D¦)¤b¬ºT1Z'sŠ¥>Q”¸ S€®ªtùŽfÆí¥ÛR§®Øa9‰r"ÙFÊœ%8%uG.¿ByÊû(ÙV6Q´zŠÙe~Bç0Æ¡ïR&¡ï\½>õ*_{×Ý<"=Ù`<ŽÆ;ì÷«QÜ«õ®BßzÑ·»Î9®Z˜SŠ®ÇIà Šc-T¶¹Î9«Ü2äW‘ˆÃ#Ï”\™ ªv WÌâéò•:!VãZ«­V¼ŽÇ±„‡1,qÕ•Œ“Djɪ÷7ȹu“²>Ÿ †¹;ΉҪÉ}Žõ™qwך͚óÞºiá®{”pwèn=ÿ½Duzç$½÷¨ãZëŽîŽ@Ô=êDÔ=듌=jD½ç­À£±Žû=êÒ\#õ®BßzÑ·»éÍrÔÃXâ«‚·C¡d 2*´‘Óm®sŽjۀˑ\ºÅÙž.' c.Uª’ŠÒ™k>a]4ÝϘÅÓå Z•EFµ2Š÷0æ¦1ÜçšÇÚ«Ëeí]SZ{UY­xéC¦Æ;œ£Fðž3гmsÈæ¯Ý[px¬yPÃ&GJæ©I4wÂqª¬t–wÇ5»k&õÅqöSt®–ÂN•áâiØò1”lYzÖ]Àë[ŠÉ¹k,ø|Æ6¹Y*tU”¯ªË£{11—/±1X7“ã<Öü˜ÍsWÓu¯µÂÒ;pt®Vº¹ëÍg³´‡Ú‰ÈþÔ `W£R¢¢¼Ï¨Ãa®4%;h µ0µyu1®ûž¬hÅ•2=R§Œ×‡ êg »—TÐã"˜‡ŠýÚöpuÑ­Ux–,_ éôçé\¡Ä•ÓéÇ¥zx¥¥Ï“ÇGs¡< úTTãýZý* +â3E¹óñÜ–×µl[ô¬{^Õ±Ý?JøªçÕekc7Q~µËß¿Zèõ#Ö¹{Ó—ük¿ ô t%±‹8®‚Ò‘`½+¢³^{”ÑÊŽåÈ!àqW:Qð*â/Ô‘àÔ¨îSh8éUf‡Ž•®ËÅTx4Ú:Žç=wŠçï¢à×Wv¼ç¯×­rÔG»„¨îfÙ>•ÓéÏÒ¹K~&#Þºm8ô¯£ Ù¹ŒjɺïZÏþ¥~••uÞ¼Ê;Ÿš-ʱՄéUã« ÷OÒ¾Ç+[!3#Q~µËß¿Zé5#Ö¹[ãóWÝaî`#±]9 Ò˜çŠáÆÔwg×Ñ¢FÉD†«±¯sw"s*hÅ:š4©„;’Æ8©ݤQCœ öppwFµ¢Ih3%túhé\åŠe®ŸN^•êbž–>O-ÍÑþ­~••?DJ‚JøŒÑî|üw%µí[}Ãô¬{^Õ±oÒ¾*¹õY[ØÈÔ‡ZåïFñ®³Q^µËß§&»ðlý- v¥tVmÀ®VÂ^•ÐZKÀ¯r›#s¡¸uŠÈ‚n\I¸ë]ižJnåÆn*¤íÁ¡¦ã­Tšn(lTé»”îÛƒ\ýùëZ÷rðkŸ¾—ƒ\µîá îQ·æsõ®›M+œ²\¶}k§Ó—¥x¸¶tã^†Ëÿ©_¥e]w­YxŒjɺï^eÏ€ÍåhêÂýÓôªñÕ„é_c•½™‡©µË_šºÝEz×/~œšû¬#Ð÷pب½)Ò¡…pci»³ë¨»Ä¥ ¨UÙ¡1׉8jg8;–‚ xZ\ŠBàW± ¾Æ®¤Pî‚£åÛŽ\àUËks‘ÅzôhªJìó±8•k"ÍŒ]+¥ÓãéY–ptâ·ìãÚ3\Xª—>[Vå‡éUÞ§sP=|fc+Üó`KmÚµíJÇ·íZ–íÒ¾J²>—-•¬G¨Gœ×5}^+¯¹Mñæ°o ëÅ^¥¹ÁUµŽj60˃Ҷ-nxÕ «nOY%xNJ÷iTº=™ÅUއ[ ×jÚÝ{×) ïjÒßqÖº•CΩ„w:º÷ªÓ]qÖ²ûÞ«K{ÇZACî\º¹àóX·_h¢IÚS…©m­É95ÍR¥J5I]–lbéÅtº|}+2ΜVý¤{W>•áâª\òq•®>àñŠÉ¹=kJáºÖeÁëXQGÃæ2½ÊéVR«%N†¾¯-•¬|¼ÊZ„yÍsWÑu®¾é7¦kò çŠû\-C¿VÇ*À£âžE[º¶ëÅQ!ó^…ZJ²ºÜúŒ.%%f)ZaAO .Ey0nû¢«Õ×OcÜ£Œ±Ç=™ŒŠìò„×VöÕÓý«²8³º8Ôs>D§¹§­›ÎMtcOö©ÃÚ‡‹F6~Õ¥oiÓŠÓŠÇÚ®Gj¯ÉSsж2å{[lcмØDÀ£*ƒ ’JãmÍž&'r)š³ç5fVªršé¦¬|¾2§1ÔÊj©T×»ƒŸ)âIðèÝ[gúBõú7Ö2ÌoÔ9 KSKT{©7W%Lg1J#‰¦3I\*sô8©Ñê°8§Åqµs¦NRòIS¬Þõš$§ ½ë'Nç}<_)¬³ûÔ‚zÇûӅǽfèpÌmÔ×óTõñÿtVOÚ}é~ÓïKسušyš»ãþè£ÍAÐ ÊûO½'Ú}èö,iæj™Çj§÷¬ÓqïHg÷¦¨˜Ë1¿RóMïP<•XÍïL2ÖŠŽJ˜ÎbWzÎh/ša5ªV8*TæO£¥ÍuÓ©Êr´Jž ÝKº»éâùHq,¥ßU÷Ѿºá˜Û©<…Œ©êO}ëušy‡+?ÿÙ endstream endobj 2244 0 obj << /Filter /FlateDecode /Length 159 >> stream xœ]1Â0 E÷œÂ7HÖªKY:€p4ù©2àDi:p{”´EˆÁ–ìÿ¿ü,‡ñ<²Ï$o)˜29Ï6a k2  ³gÑ*²Þä}ªÝ¼tr¸èø|G" ·ÍWý‚¼«SÝ´[Æ‹%jƒ¤y†èš¦ïœëØþI{`r?ÎRJµªú¥D Ãq’Ìš8WÐ R<ãûK ±¤lÅêRê endstream endobj 2245 0 obj << /Filter /FlateDecode /Length 170 >> stream xœ]=Â0 …÷œÂ7Èe«²”…„€ ¤‰Se¨¥éÀíQÒ–áY²ýžõ™×Ë•BþÈѾ°€ä2.qÍaÄ)“ \°eïZµ³IŒ7“ÞŸ„ À¡ßú»™‘?Õ¹Mä–±Ñá’ŒÅlhBÖ ¡{ï5Cr+µF¿;OF7 ¡P³¾“ºIˆN¶øa¬—*ÒAvÍ©4îÆUyáïµSM’c_mJVŒ endstream endobj 2246 0 obj << /Filter /FlateDecode /Length 204 >> stream xœ]1n!E{NÁ ö/X¶‹Õ4NãÂQ”ä, …Y„×Enͬ"ÅCzÀhæÏp:¿kYíðÑ—øÅ«Í¥¦Î÷åÑ#Û™¯¥šÑÙTâú4=ã-43œ.¡}ÿ4¶Î&Λ¿‡Ÿî 7ãV—Ä÷"÷P¯l&€¦œÉpMÿž[ÁœŸ?ÝL àf2“)€‡èH àGQG àèŽÀïD÷¤~/z$ðGäÕS†’t¯06>zçºê 4¢D+•ÿ¶Ô–&U–k2¿µHeÎ endstream endobj 2249 0 obj << /Length 694 /Filter /FlateDecode >> stream xÚ•Tmo›0þž_²L" PpBZåC³u[§~Ø*¤}è:É!†X ˜Iɦý÷ù¼´™´) ¾;ß=¾ó=ghñƒÖ XÓ ðfad%y(k•YZ¸߃ÆÏŽî‘ç"î]¼CÈ‚À›´âô*^Yö›5.9©†nvt9tÃÙ \mÉÙÐõ#{ÕlH-¤)€S“ácü±wïF¾ÿJÏ—)Nž¥8‰B¡N±¤ o*‘ò‘½ÄÕ•<] ¹þÄ ÔNKÖ«ZûT¸ÈÈœæ8#_[G~Ä• ¨äOxC8—Np "Zî÷8×é®}G¡¿€Jr'Jre¹§ÙšwðŽ‚‘ÁÈàkx³Óä{-1úƒ×ãWL} rÈÊ=‰5¹áÕÊä奔KQ\2Z(íF©^¯º†ýØwÈ›ùVúââ‘lÅÅmŽë-ë}>GBѳРà̋‰Nâ© Qh-×ÐÆ…ÖI‹órc6ùs½ÝÔ¤Ö¶ ËpEù:§‰6Ô ÞÐ"Ó~,í" DÚ §Ì o‡ÙxÓúRVöœA.Ô¹ºpêÈ\ÍKVqͬÂåúl˽LûÏò­¦?/ mWŸÛ¬`¹®K’ðF©0_‡Uo4x*£jëîî-; ¢Å_ B/Dá ƒ*"&£ÐN¢üQÉž äðG5-¤Ð^ ±?Ú}ž:ViÿqGªqÂj]ÑHôFJ».àˆŠ'I˜»ø}®RÙNuCw´ bxîX&ÿ/o¦›5R<<ê”Ì\Ì_î1-–ì©c÷ÿN~ê\7œå˜ÓÄ ,<¼RzhŠvî õÜsp\R‹[jµÁ‚q³Ò¹#)WSìà%Û’9¯š3ŠÙ@vD†ê×B}ÿŠ"‡÷ˆí’{ endstream endobj 2252 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./logimage.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2253 0 R /BBox [0 0 284.96 287.66] /Resources << /ProcSet [ /PDF /ImageC /Text ] /ExtGState << /R8 2254 0 R >>/XObject << /R10 2255 0 R /R7 2256 0 R >>/Font << /R17 2258 0 R /R15 2260 0 R /R13 2262 0 R /R11 2264 0 R >> >> /Length 1347 /Filter /FlateDecode >> stream xœ­˜Mo7 †{ž_1ÇÝÃ2$E}¡·¢EÜ’ø–ö”")Š…ÑCÚ_ÌŽH‘ë±$ö<~F¢¤WšÙ}XhÅígü~w¿<¬,Ø¡æ+¸P« „×” dÎ+SBÙ̯ëúóßË«åÅë¶~øgè½µ¼~Zh}¹Ðúׂë¯Ë~cZ9W@*ëýÂU p5òqys`)I” ô|µ5Z¥Ä[”A|[J‚UCjÞÄ[ÌE ±¯~`ÝŒhŽÑ[¹VÈÎ×-CÊ£&ÌÄ;F¼•…@¼4€s9Aò-ñVÆ aipŽ­ÌXx·~ƒ[F°&¨%®ŸYFœeëg–oéúMK‰³lýfõJ¼u3"7Fgõ2G¯‘âòÍ’ŒLi,Öt˜bK5Ë12¥±TÓQ`ÊÓ›êpé¦Õ0oP¢ž &g)y"ÚÖA95è7«´2‰·*&èBÎRâ­Æ}¯kXJ¼Õ‰¶“mJ§eèÔ¼4H˜”Å÷§$Î2tß¡’he„Vƒµ“`IÍPý<( V„z$X5W(~ŒJ‚Õ¤o ¬Î|3ƒDk;S$X; ¹ÁÔ¡ø•D«UÈ-X;yþ0ö<°Jë{H½Z3õjùÔÚÖA3õ\©B©Wk¦^-ŸzµfêÕò©WËR¯’K½9–z“\êm,õjùÔÏÙÒÔ›åR?-Mý´fêͲԛåRo–¥Þ,—z³,õf¹Ô›e©7Ë¥Þ,K½Y.õÓÒÔOk¦~>d4õjùÔOKS?­™ú›×¶ŽPkióµ-cÞßÚ÷×¶yð_ÿç_Ì® >†c@ˆ·÷ÂøZ6$NšoeC2à%{)SI“æ;™Ö­ÀKq,np^é]Òúi‘FP0OÝ€Ós) Õ Á€“ (Í Á€—j‚Ô]wœT‰ g'ð’$hn.ôÚ+•À¯Ž^{¥öÍ(pR/)ÖcÀ¯àvˆkÉ€—q’‚ åëNqÒAê ²wök¯0ç0~AÊ ª/[AjƒZÀK"9T4®½’Æv©ãþ82i/•T½¤ H5ïŸ*L ì<¬q)e(¾pA*¶§/u®Û‘:%~{"qÜè ‚T²xi/u`/)R®œý:(­‡ 0Î'ªPÂù4@„ãù¤ÀKÛ‘.ä$Aê[Rड़ÄÅ€— —)uHÅK©RœAê²/\A8ÇYÀŸLœ4¿y¸}<Ýß>Á>>~Ê=~2<~Èý¹¼Ypý°<,tý¾d¿Þݯ?ÝmÏTZ‰ çÌëÝûeÿ2…Ö„ÐRoÛ¿jA^ïî—·'<_Òö›Ò‰Ï†–jÎWŠyÙIi¹¡"ÀéÔvÚrÝ(7JøD‘Æ?Kæßï^n5§P3oßö $ê}½ûcy{ú÷œ §Ê2ô0Ä ¥Ä+uȹ·ýŽÑoÖΪhgy­Ð+];"×îx¿Ï˜ˆêqã–ÖA¾¾7ÆDz÷öƵ×ïÑ!ßtfÿ }›ùK( Ç=ÿ/µ÷NGU2B¹ÆKh;©CÜ­FîãæúÙ%øa»{ªG£*PVܽôÜäñöÚÛz MSÈïøó»v;É·…µmj?WØÜ! ÛÆõU…=·”€®‹ÿÅ…}ãnJäÉ™ˆÇÆS>š‰çGøí>áójÛ,+mgüUF`D²í ¬€ ±érýv:_„%õ£ÖrÙ¾#À›“òôãùB¡ˆì{·!âáùIm_ríïúûånyµ¼Zþ~œ§Œ endstream endobj 2255 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 32761 /Height 1 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 32761 /Colors 3 >> /Length 742 >> stream xœíܱÄ@ AmþAßÁ {üŠ®Œ}ßxï{{sÈŸæ??Ì9 ~˜s@þü0ç€üù÷æ??Ì9 ÿvÿ7ý‚Í9 ~˜s@þü0ç€üùaÎ?\~˜s@þü0ç€üùaÎùwû³/Øœòç‡9œ÷¿ß¬_~~þü£å‡9äÏsÈŸæ??Ì9 ÿvÿt»k@þü0ç€üùaÎùóÜòç‡9äÏ¿7ç€üùaÎùóÜòç‡9äÏsÈŸæÐùÃå‡9äÏsÈŸæ??Ì9 ~˜sÀqÿñó9 ~˜s@þü0ç€üùaÎùóÜòç‡ù?lüv Ì9 ~˜s@þü0ç€üùaÎùóÜòç‡9tþpùaÎùóÜòç‡9äÏsÈŸæpÜü|ÈŸæ??Ì9 ~˜s@þü0ç€üù÷æ??Ì9 ~˜s@þü0ç€üùaÎùóÃ|ºí/ä‡9äÏsÈŸæ??Ì9 ~˜sÀqÿñó9 ~˜s@þü0ç€üùaÎùóÜòçß›s@þü0ç€üùaÎùóÜòç‡9äÏsèüáòÜòç‡9äÏsÈŸæ??Ì9 ÿtÛ_>ÈsÈŸæ??Ì9 ~˜s@þü0ç€ü«ýÇÏç€üùaÎùóÜòç‡9äÏsÈŸoÎùóÜòç‡9äÏsÈŸæ??Ì9 ó‡ËsÈŸæ??Ì9 ~˜s@þü0瀹¸7{~Àæ??Ì9 ~˜s@þü0ç€üùaÎùóïÍ9 ~˜s@þü0ç€üùaÎùóÜòç‡9tþpùaÎùóÜòç‡9äÏsÈŸæpÜü|ÈŸæ??Ì9 ~˜s@þü0ç€üùaþ}}xV endstream endobj 2256 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 200 /Height 200 /BitsPerComponent 8 /Filter /DCTDecode /Length 7301 >> stream ÿØÿîAdobedÿÛC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YÿÛC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYÿÀÈÈ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?–ç÷ºâJÚÔ›SØ Ç²v¼O¦+Røï»Å|Î">× mÄÕ=ž0ò*„4» V¿¿’ÔíŽøïU-õ‹™d ÖÄ¥}U<ŽN¹ð1£RQæ[D`Š»|Û4v÷ªÏó"’0Oj~¶þ^£×&¾_CÙb3èxj<ø‘žLÆךé/Ûm¹úV/†cÛ}+WV}¶íô¯rž>·ùñ''§¯›®±ô V¦¢Û§Ågø}wê3IèM]—çºlׂáí±œ‡‘ÅUyc„4l5FûS–ÝÊÇ`=©¶z­Äò{rö¯«Y¹9®|G±¨ãÍо£/Ö¥ñìÓzŠ~õõ¨|Jߺ†? ¯”ÄÒäŨU±æ¯sGÃqí>•¡«¶ÛvúT m·_¥&¼ûmÛé^úÒÑÏßÅ|Ì/®ëé¤÷&­]ó‘éQxiqo4ž¹5"òîÇšðhÒúÆ1Ä𸮭ª( hØk6ëWž ¥¹#éSØj\¸Y *µ}[ɇ5Ïtj(ó=‹°ßQx™¹†?¥Y„fí@ªZùߩž†¾JTùq|½²á8ÞNGC¡¦ÛuúT^ }¶íô«šRí·JÉñ<›`¥}´íÒ\ø¢§†—²Éê ¢¥Ñ—ÊÑØúâŠù*«ž¤™äçXž\SE-oÕ%F«·Mþ’MWðÊÿ®ûÔ·'tƺœßÖœ—C>+’rQx=@?QFåGÐTTWµõêÉZçÃò¢E&IT{Ó•Ìø¦L¡_SŠúš@õp«ŸI¡&Í%¨¢VÚÇëVì—ÊÒÞ¨õbkçpµ%Îq>O‰f§‰&ܧª©ü(Þù@AQÒö¥­Ë¹ó¨·§®ûƲ¯O¯(ôÍmi£ Íè ¬K_ÞërJñð­ÔĹ3ôN§É‡”üŽÒÉvÛ¥s(|®ßSŠê¢mÿ ã|BÛîãOV¯~³´G¹«ÜÓ¶]š:Z*I?w§D¾Ù¢¾RÝùŸœÔRÅH§ ¯•¥»žãÕ‹98µfÑ|­}ê²…xJ7C^¦YTÄ·Sañ5Wvj’ºÝË– þ•ŠÌÔ[Î×Tzk_M¼y=kß÷Úã·a_A)b›[}ÃåÃÊlììm¸úW7â™2…}N+¨„m·ü+ñ ïº=XW»YÚ§€\Ø‹šVƒÉÑ×Þ«( ¹zš·p6iЯµT’4ž-Éڼ̚:•e*»ŸÕçÅ´ö#7–€à̹©TÇ*æ6 =«4è6Å÷j¿ZDV<œ÷5õ8šX(Ón/SÅš¦—¸ÛeÝ0aÜúdÖ5¿ïµÇ=…mZ|–“H} dèkæj¿«WÆà—5y4~‹Ãðöx)Iœ#m¿á\oˆ_}ÔiêÕÙ?ËoøW~|íf%ô9¯g.ZlîË—ï»3þëO…R*ŸÉn‘‚z·¨ð#_@*•żwQ…rF=+#¥JmÊ«??Î*sâå}†ý²Ó8ó—5/Èé¹0ö¬ÕÐmƒîÞÕ ¨–ðùqô¯¡ÆSÁ“pzždÕ5nFÙvÐí²™½²45ó/åö«VCäéÔÕ/ Gœ¿©&¾O.êJGéYD}ž^ÛêuòÛþÄߟ;Y‰}k´¼m¶çé\]°óµãí^¦6\´Ù×—h§?#gQ8Xã€QLÔ7^ÔW›€£ R¼Í³*Žx™2Y—§D¾Ù¬å8Qmª‘ŽÀ ¦±œVså§9ª§‰ÝÆ‘˜ÔžY¦:â½ ÔêÆ-³ÈM\зýÕŒ¯þÍcèKæ_Êþ­Z—-åé}j§…ãÈßês\™do9Hý;*²À7ÜêŸå·ü+‰¿>v³õÁÍvw­²Üý+Œ´S>ºOP8¯S.ZléËôSŸ‘µ¨ü±"ú(¬ðjæ¢ûçÚ*°Œ×‘€¥RQ¼OÎ3:ªx‰1»!9 TžY¦mïֻ1ê ³‚6nÅÛ“äé.}j—…ãÏÏêsSk²yzRQšŸÃ1m>•ŽWÞGê8Hû,½y›—¶Üý+‹¶~º}«­ÕŸm»}+—ðúùšŒ²úå]™Œùi3\¹Fsò4µ3™xª`šší¼ËƒíLšáÀѨáxŸ™cj)Ö“¸Ð¿3O1šH—¨­qP©7# VsH—\+JUõ©|3ØéT¼Lÿ»†/\ ÚÐcÛn¿JyT}ËŸ©%ì°1rÖªûmÏÒ¹]|ÍNYf­ýzM¶íô¬o &!–cß&´Í'jmAû<$æO|s=™’f4W.…GM4~_ˆš•Y2Åão¼>Õ›¨½òœ[/ËW.ý! ×§“béá©ûÊåb&ý¼¦Õõ2-ŸVi˜+]òUC}ãÖƒ!¥„'_jêÍ3HU¢ãØÍ^´ÒI/Au×ò´¤Näf­xj°'«7į™!„z]‰ËuúW“•ÃÜ¿sõ_e„I5y6[·Ò¹Ÿ®ûÙ¥÷&¶|C.ÛvúVo†Óm”’â«4©Øtß³ÁÎDŽwÝ15™&¢$"Âö«ÌØ•½¨Ò8|µªFéwÍ4Èj[%ó.ô¥›æP­IÆ*ÅÒNµh«[ЫâVùa„{ ÝÐãÙn¿Jç5†óõˆÐt5Ö驲Ü}+‹,…©¦~Ÿˆ^Ï |A.ÛvúVG†Óm¬²ú‚:±â‰± Ö—JO+HúÖ9¬½Õ*¿e€“îDŸ3»u<â²nåÕD‡Ê^+I[ýjO0׳–céaé(¸Üü¹O–nM'êPÓÛPghá{æ´¡îÔ ŒÈqVtÕÌ…Ïnk:Ìa^Ÿ,UŽœ$lDt±™®·›ªÅè uZZl·Jä ûFºO]µÛ[.Ëqô¨ËáËI¥ã½ÊP§äsþ'›l=©šJy:9=ÍUñ,›äTØ Ñ åéQ¯¨Ípæ’»Q0ÇËÙeÞ¥EÜ"bƒ/ÚŠj>ï`±ô©QPhü¿g°’ò“F +2C™!ÀªG[³ ·œ×>(«Rš’F–VÜUËdµ§.鿯ñ\ÆZ<ñëW4у#öšó3\,°ÊÒ:²ø9bcŒM¾Ñ­¢ö5Øié²Ü}+޳hÖ¤n WmÙoøWv´‘úN`ùc ~G3≿vTO6œžF?Ú¬ÍyüÛØ£ë–­kŸÝXÃëŠós)sN0G6gSØeþ¥¼ÄÒàÑ4ÑZÆSЦ5»2ÛFs^Ö&«:i¤~h£9ërÙLËzjšH“C½:U»cåØLçÒ¼\Ó * AžŽQ8äŠ}’o˜U??›¨Eä?Jð*U–'œ²á\?ïFlxv–ëÇj¹¬Ë²Ý¾”ý&=–ëô¬Ïϲçµ}ÃÞ_½ÄüÌß ¦éæ˜ú“Vdoô–4º ~N˜Îz‘Š…Îdc_;N£úËšè|÷Õ窡ØI­m§9’0M¹4WÑÇ7¬•“>AJkDÉ<¼u Qåç§5‘s¦_É!+qõ«z}”öͺi·c¶kÔž[†Œ/ÌT¡©¦Ë¯úBŠƒÄºH`¸vÉ|ˬö—xßj×@êšø¾U<]£²>Û…iYJ«ètú$[-×éU¼C>ËvçµjY'—n>•ÌxžmÃËÄq^ôß,g½®&âøv?.ÊIˆäÿZ2ÈZ¬Â¿gÑÑG¹ªÅY­ÊÆÛX÷¯-¡N%¹½“â\O´Äò¡ÛêE>2+]*ýäȸÀúÖ•´¶È|éwœt¯¬­—a¡ncç'Å]Nå»$ÍÎ*†°ßhÖ#Œt5«§Œ%=f±ìÇÚu™¨SŠøÚSÅ6¶GÞðÅ.JªÎÃMe¸úV‰çÄL òx®Ž1åÛþÆk²y×ÑÄ9ËW»Z\°=L yëó3GLO³ièZ T.KzÕ»¡åYCôªwÉ-¾Ø_kW—”a£ˆ«)Mè|Nˆö¸¶®?`õ ¬C¤ß™3öŽ>µ­kÛÀVI7±¯§ÄåøjTÜ”pŒUã+—tÅýëÐsXçý']'¨ZÙ¶>MŒÒž8â²ôüëÉ%<å«ä0Qç¯)#ô>§ì°r¨ÎÆÙ|»qô®KÄ’ù’¬@ýæÅuÒŸ.ßð®&è›i¨Sšöq2ä¦Îü½^£¨ú}ŸK;‘š¨‘’3Võ‡Ž1ÑF*…ôOX$Û\y&Û•Gcà3ŠþÛÓzl£ó¢±SI¿e®8úÑ_RòÌ*ûgœéÁ}´lo4ÖsK´Óqó­|­j•cs(¤Ù¡j<›I%=vÖ>Œ†ãQ–SÏÍZzœŸgÒObÕ†-ñb9<×.[i¹³ôü²šÃàît­û»¸Iέcœ×a¨ÉåÛŸ¥r:R}«YyE8¯OS’›:0 –3ªú#bÿä#”Ul ³'™9«„5äàc5Äüã2ªªâ%!wšibxõ¥Úhs*Šë¯R¬`îpÂ*RH¹)ÚS·BÃCÃ0ïs)þ#š—ÄRùvQÄ,?hxvßË·^;Vy\/y¾§êX,>.æµÛyvçé\\`Ýk¾¡k©Ö¦òíÛžÕÎør=óÍpÞ¤×^cS’›5Â~î„ê³CSoÞ:* sO¹2cíLkƒ‘â~e¨ªV”…Þi¹.Á}iJš}ªæp+\UJŠñ)ÍD“W“ìÚHQÁniÞ·Û ’9ª>#“|ðÛP+¢Ñaòí׎ÕY]?s›¹úŠŠ¡ŒRmNO.Üý+“ÑSí´’ž@?ʶüEqåÛ·=«?ñyVRLÃÿZ¼Î¥©Û¸é?c„GÔ’ù÷\f¡h™%&¦°ÂF¤aâ&§QÈ]æŠiSEtJ¥TÌlŠvZ«Ý8SnF}«GnéÕG­42 ùUWè*Æž›æ27A]ÙÖ6„©rÒV:pôÕjñŒŠ^$“&eï[Ú]ºñÚ¹‰˜Þëž¡+´´O.Ü}+“.§ÉM¦â¿uB‘—â.ݹíY~˳–v·õ¦øšrì"–8«±§Ùô”N…†k—4©{C¹ž*VËÛêÊÙ¼ÈëYwىʭ»´ãl.)Hˆœ˜Ôþôe|-)M]Ÿ˜)Ç™¹«•l5»l4%G­_·M÷`ÕõQ…P¿AVì—“7ašó³¼e夬uàhû|LTU‘“­?Úuhá…?ʺÍ2/.Ü}+‘Ó”ÝêòJyàWj£Ê·ü)`iòSGéçÉR]ÎøžçlL òx¤Ó#û.‘»¡jÎÖ¤7:ŒpŽ~lš×¼UœQ¼ìÊ|ÓP9ó:ŸVËì·e"Â(ZVûV\šë+íÄþ¬®6àò)6ÅœùkùWÔ`1J4”e³ó8J)·8ÜŠÆìÝ©-L ½§¦n»-Wgp ¥ZŒý›N–CÔŒW‡â©Õ´)+ŽUCÛâ£e¡!7šéî»KUòíÇÒ¹Df¹yˆûÍ]|íåÛþÓ„‡%4ÐóïF’èr~%˜É"Ä?‰±W‚ý›K†k"\Þkj½BóZú“a‘E⼌t¹ëF{WØ`•5»)Í(µƒyRÇÐVY×›~Ñl*Ø á€#Þ›¶.¾ZþUõØLV•5Düâ‚øãq¶³›˜K´{(§3ç £J+ÇÇcé{_qh ›–±Df´Aút’t$`U&OÞ(õ4í~o&Á!Só7õ¯MûeIŸEØmˆ¿b·‡¡3\¼Ä}殾v[þáË_.ãµ]Ög[·=«èi.H_Š—µÄr£–›7šÒ¨ä)Ílê,V1ü#›áèüˉ®› $г)3Nǰ¯¬e‰ÄòG¡åq>%R§(„RóJÒÀ‡ *õ§#E' "±ö¯me•”ocàn÷±`*æ¡ µÒObÕi›…ZƒÄro’Uö¼´ÛÄ*lúÎÃûJÜï¡?†-ŽÀärÇ5Ñj­ÏÒªèyVëÇj¯â‘»sÚ¾Š+’ÓTn¾&Æœ†óZg<ªœV¦£&ùp*¿‡âòlä¸n­ýiÖ;9é^§,V%¨ô<>(Å$ÕÐŒQÍ8Ín§dëNSƒäpßJöÞ[Z1»GĶú¡‘®é@©E¶·BZ¦ù…cN_Þ³‹Íò؉>v‘ôùfÚÑæ°ÛTó®ì+7T“íšÂD¼ªÖÄ8¶²’Sד¡Äno¤œó–â½,3xŒK©#ÝáÜ7ÕðҬγNˆEn>•â{¢¢ž[],„CoøWzÆ÷XHÇ!NM{8‰¨S= yêºdjXD-4صB€4l¤ãwz·¨KþŠ xùmogQÕê|6{]×Ä·Ø¡6‡¯¸ÌÕjÎÂ+.C>õ>ãMÉb­} lò§#GêTšåoBí‚æV•¾êŒÖBæû[fêÖ½Ó‹=)BÃSÃ6ÅÉ•‡,s_=NµiUgè¹&apN£ÝMºˆ­ÇÒ¹Lf¸HTýæÅu—²­ÏÒ¸ÛU7ÚÙ=U+ÕÅÔTé¶và½*¯¡­"ý›MŽ!Á#&«4bX {Šç¸«“ƒ&ÑÐqUW›•Wt$êugç¹½g[ås9ôÝ÷›ó«Ö¶±Ù! Å©©7EG ^æ'<©*mu*Z-—lÿuo,íéÅdé›­JI#v_Ö¦û.š±¯Þj›ÃV›!RG5áeÐs›¨úŸ¤å´V~¬ß8Šßð®+RswªÇä“]f«8ŠÝ¹í\¾‡Úun•½ u_gMÉ V} ;üGPŽŠªw-Ì! úT·²ož¡ k“)ļ2æ[Ÿ›æ]\D§s7û-ûŒÍùÖŒ0¥¬;“îiw| e”Õêã3º“¦âs©T¬ÔdîYfû&—$‡†aŠ*ŸˆæÂEj‡“ÅóØjÒ<ï©ú¾Uƒ…,c"M~o"Å!_¼ßÖ®ørÓÊN;QEvåQ\—9Úöx¨õ.ë7+vçµs¾‹Í¹–íúg"Š)æ’j‡Mû<åË7.f˜ú `ŒÑEkÃBTÓgå•êJU`PÒÛ¦ë€(¢³ÌiF;ļ/½V)÷!ñ»äŠÑ=þµ¿¢[ˆ­×ŽÔQU–E*IŸ¨â}Ì4#Šþ!»[·=«7ÃðùV²\¿ÞoëEŽk'Ê‘[¥€”£Ô™d-Ú,ÑEuàðÔÝ4ÏÊêM¹6À¡©¬#ßqô¢ŠäÌéÆœ=Ó«”«Å3?V“횪B¼ªšë4ØDVãŽÔQ]y|Ti+¦ã½Úp‚ÚÆ‰®öÆQO'F—³Ò·¨¢¸3I6ÔL1òt²ëé ±cÞ—Ë4Q^ž MÁ3òéI·q b­é¨73ž‹ÍW™™ÁAZ'£•EOÌ‚Mþ¶OUCEW¡…‚T’Géø™¸5ídÿÙ endstream endobj 2265 0 obj << /Filter /FlateDecode /Length 160 >> stream xœ]1Â0 E÷œÂ7H›©êR– \ M~ª 8QšÜ%mb°%ûÿ/?Ëa<ì3É[ æLγMXš hÂìY´Š¬7yŸj7/….:>ߤÈÂmóU¿ ïêT7í–1Áb‰Ú iž!º¦é;çz¶Ò˜Ü³”R­ªþC)ÑÂpœ$³¦Î´‚ÏøþC,)[ñìgRí endstream endobj 2266 0 obj << /Filter /FlateDecode /Length 182 >> stream xœ]O1à Üy?À@‡KºthUµý1„ B†þ¾ÂI:t8KgûÎgÑ_/×+2»Vbò—y-ù€cLL*;£ê&›™èo6¿?¹âÃÆïvBñTgêÈMãfK¶‹M#²Àt!†ÉÿN›`û¦CÐ`X§¥!hÙ¨2­Õ† 5™6íN |äãn-S¥¯(uKþÏsn*ŽÉ³/P!\ endstream endobj 2267 0 obj << /Filter /FlateDecode /Length 188 >> stream xœ]O»à Üù þ ­ò"–vÉЪjûLÄ‚ú÷NÒ¡ÃY:Ûw>—þÚ{—xñˆ³~aâÖyq™×¨‘8:ÏJÁÓigTõ¤+.7ÞŸ€\pƒvãw5añ-uÊM£gƒKP£ò#²@vÖJ†ÞüΛ`°ûæi¡%ëªJªJ²®n$ n2m% nÉü°Éwrà#×kŒè}E©sZçñ÷x˜CVqô†}ºT\ô endstream endobj 2268 0 obj << /Filter /FlateDecode /Length 210 >> stream xœ]1n!E{NÁ ö–…¥Õ4NãÂQ”ä‹Â,Âë"·˜µS¤xHéÿ™Ž§·S-«ž>ú¿xÕ¹ÔÔù¾> stream xÚÝTKÚ0¾ó+¢Õjª$kÇ $KsÙ¾Ô^ú7ÊÁM XMìÔ1»K}íŒy„Ru¥Þ*@Ø3ãof¾y`™öräM ‰ò$óÊf„z©Z{pøòn„]h ÃËûùèömšzE9ʱ7_BÍ+oá¿ÚÐV35 !~v7“$õïiÇ@ÒÈqg~µ­YgNS„§>&Óñrþaôf~pœÆñ3#´–¿‡89 q’%& „ØÒši;¢]]¯ìßS°3øú*PT¬Y`e(ˆ²Òþ†í=…û\¶Á'Àlà^’Fμ“§àÃéç¼üÞÙ÷­6§¢æ‚=òJozQúb °à§¿Ùž•‡tñ„Diì‚¢,Æ6ßÛ÷Mšx¯åèó¥ê`”b p=öyC× L+®X©ë(VJ6ÎÔzOÍk!Ê7Lt\ ZƒMk+î3JørPR €V[QjóÖrp^Р±^ih‡~—c_V.tmgN–Q6 háß]òa§Éà=H^M³¥ÀE_R^ê­b 5—¢Ü*Å„vòÀ)˜X,K¸TTSh™Iåy>h™–rå\®9­÷ùŠ +µïÑ0ÝoRÖ`£Mw­ìX ôHÑ(_žàìe77§Ñî‚i?q\ÊvWhµÝ'~ÔPa9튕i4vhm/°€ÿió±ö˜†ð÷78ôcw.Ü0¾ÞèÿµD*ÄùHëb' Ú¹QªëmgRЬ²‚ÄD ½q;~%ëZö[„‹5ذ'Ú´få?gÔ:þ³¯º[¿³}Nñ$"ÈåÄ›V*½'¿_µC;ô¡°¢ˆÓÉl@X(F;‚‹‡"nù­˜]¢q0È…ÙÛÇKó=¬ë_BðÐ endstream endobj 2274 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./penimage.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2275 0 R /BBox [0 0 200 200] /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /R7 2276 0 R >>>> /Length 47 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œËU¨` `d``   &¡°”~¹‚K>W W VR ƒ endstream endobj 2276 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 256 /Height 256 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 256 /Colors 3 >> /Length 1580 >> stream xœíÝ]¤WiÀás:ͧ3J’$I"‰D"‰ˆˆè""""ºˆˆˆˆè""""‘ˆD"‰$I’¤Ì˜1ßš«r:ýÏÿ~æ÷lËkYûboïöÜíw­ÑCïG&_ï?¬“IñnÐ:$Æ?M>®“ñ©+ã##o‡ßXò¸I¯71™*nÅç1i?‡_£։ɤ˜6hcŸ&×‰ÉØÔ•±‘‘郊Ão ¬yܤכ˜L·âó˜´Ÿ7û0”€2€£Pp ÊŽ@À (8 e§  à4”œ€2€³PpÊÎ@À(¸e—  à2”\€2€«Pp Ê®@À (¸ e·  à6”Ü€2€»PpÊî@À(xe  à1”<€2€§Pð Êž@À (x e¯  à5”¼€2€Ÿ  àg(øÊ~€2€ß  àw(øÊþ€2€¿  ào(øÊÞ0eïˆxðÿà_ €*çHp"   @WÒô @g8Òô @whÒÌ À„ÒÌ À”HÒÌ  À¤xÒÞ@Àk(xe/  à”<€2€gPðÊž@Àc(xe  à”Ü€2€{PpÊî@Àm(¸e7  à”\€2€kPpÊ®@Àe(¸e  à”œ€2€sPpÊÎ@Ài(8e'  à”€2€cPpÊŽ@Àa(8e  à”ì€2€}P°Êö@Àn(Øe;  `”l€2€mP°ʶ@Àf(Øe  `”¬€2€uP°ÊÖ@Àj(Xe+  `”,€2€eP°Ê–@Àb(Xe   `”Ì€2€yP0Êæ@Àl(˜e3  `”üe?@À÷Pð”| eß@À×Pð”| e_@Àt( `”Œ0à{üWø  ÀyÒœ¨Ð€4}HЀ4½AHЀ4óH0!€43ÂH0%€4s‚H0)€4€P0Êf@Àl(˜es  `”Ì€2€P°Ê@Àb(XeK  `”,€2€P°ÊV@Àj(Xek  `”¬€2€ P°Ê6@Àf(Øe[  `”l€2€P°Êv@Àn(Øe{  `”ì€2€PpÂþaï†? endstream endobj 2279 0 obj << /Length 578 /Filter /FlateDecode >> stream xÚTM“¢0½û+8"LˆY—ËìW9‡©Ú-o®[%8X l@A¶æ¿/IPqœ) Ó4¯_w¿n@¬~Hs¡æ`l¹£‰¶Þ÷ ôò¦Œ_?z¨Æ ȇyoø AË….ÒæA“jîk ýË3M2Æûc¬O>õÁhDôš2åÙÇ}`Otÿ°cie99:“þrþØû6¿$&¶ýÁ òu‰ãN‰c§ºŒT‰AÌCÃ(ëWáD=8­-u|VGT{ƒ°Â#Q£†5"# l!‚nóm/|Û7ø¶m>Òæ;.Âåb»ôøf%x¡E q¢AF2‘…ÑQPˆË¼>_Ç©0¶çâ*³ÛªTçØÂ°Nî醉¸£)Ó©i#i¦çý½hoñ†ׂ¶+”ÎöU'_ãÞÏ7†€ ±ðØ9gMb^ –ÐË2¦j„íêÒ°”ÅÙ°ÑGÃÝ)¦€ÓuBy&"®ÞBÊ-Íœe©*@°‹Õ‹K¯/­,¶Ê’Ð×õæRç«£l$x½&ÝðÜÑ倉¤ Ù†a%—<Õ8KqoÔ(p…µth.N³·:,`¹ù ĪÌëpk›_n)|Ùí' {z_*ûÈ7Jí‚W^½ãbïtvž¥_È€ lç÷N­€S# ÙaÂjá‚Ö»|0ë/ÃÙq¼;jÔm¯ôè@ ¿0†z_‘Ü«÷«ü€Ésõiõ|¶áŒÉ ÜÌ)¼€îRÖzoÿoÊwÓ endstream endobj 2282 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./penfunctionimage.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2283 0 R /BBox [0 0 200 200] /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /R7 2284 0 R >>>> /Length 47 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œËU¨` `d``   &¡°”~¹‚K>W W VR ƒ endstream endobj 2284 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 512 /Height 512 /BitsPerComponent 8 /Filter /DCTDecode /Length 14711 >> stream ÿØÿîAdobedÿÛC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YÿÛC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYÿÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?äéh¥¯ª=4RÑH´RÑRP”´QHaIKE Š)(´™¤£4Ñ-‹š3MÍ«D¶?4f£Í«hæL£¹r-¤ àâ“uGrßèïô­*/ÝËÑ‘*šcéV«FjÂñ(ÇCH°•a*²°•ßgm9¬ ¨#«)WÈz”X»i6Ó&½¶‡ïH ô^MP“W'ýT=ÿˆ× iÂ:\ÞXŠTþ)%i¤VKêW,ÙPŠ=1šoö…תÿß5æÔš{õú=™¬E4ŠÊ:…תÿß4‹¨ÜËaéŒWÕö)f4{?¸Ô"€9¬õÕ™=¶š³ ý»œÚÚÅRìo ] í/к‹SªÓ"à ©zа‹\rcšZ™V…Z™V°r9&5V¤ NU©ÖNG4†§©ÓÂÔ9ò" N R…¥ SÌa"-´»j]´»is²´m©öÓH¥ÌfÈTdTì*6i™6@E0ŠœŠŒŠÑ2 "˜ENEFEh™ ‘L"¦"˜EZd6BE0Š˜ŠaiŠä$S©ˆ¦V™7!"šELE0Š´Âä$S©ˆ¦‘V˜®V¥¢–¿A±ï ¢–Š’Ò )hÅIVŠ\QIŽÂRS© K ¤4¦šjnCÒfƒM&‹™¶)4™¦“M&©HÊLvi7S ¦–­á#žR$ÝM‘ƒFÀô"£Ý“ÅK%ú×\lâÓ9'ZÅ$5:51b!ÙHÁ¥J!=«ÉÃG£µ±*5YŒÕ!•<ÒIrq²3ÉêkЛ(óHê¥\Жñ ûÏýÑU%¹žã†m«ýÕ¨#LõäÕ¨Ò¼ª“©W}c²5'SKèDŒt§ùUi#§ëšT¬Ž¸QЧåÒêÙJiJäš±§±*¦”«Ei…k’L©JO.¬¥ X¹Αm,'1HÈ}iZëSDظA"úŽª¾]!г’Œþ$d¥R—À΢ÒöÖë)T±Úx5 ©\–Qƒ)*ÀäÚ¶4ý~hRðy‘ÿ|˜pÕÂ=éêo eô¨¬u • JeÄ‘y–ò^œv«A+Ì“iÙšI§ª# N R„§¬ÜŽy2 ´àµ(J]µ<Æd[hÛSm¥ÛK˜Å²µ °Â¢aT™“d *6; …h™›d$TdTÄS­3l„ŠŒŠ˜Ša¢d6BE0Š˜ŠŒŠ´ÉlˆŠa)Â*Ó&äDS©H¦‘V˜®BE4Š”ŠaiŠäDSH©H¦V˜\§K@¥¯Ñ¬} Z)qRËHLRâ—b¥–˜£ìRb¡ŽÃqHiø¦‘PÂà 0Ô†£jͳ9!†˜M+š³r9äÀši4ÒÔÂÔ•CžLq4ÆjBi‡$€9&¯ÚØÂZ“CËVÅœñÅe[@<À¯!_ºK( ¬±î!ãºßÒ®­iÑøÕ>]æ]ŧ—~ë×8oά-™#¥hÝF¯¬·lZ³åÚÙå@2¿ ¹çë\”qQælâx™>UÕØäïÆÇ1 ù»ŸJ¤«´ó["ŰY²Iä“U.-Êö®Ú\ÕåÍ#Ó¥Y-B®DµV"2@úÕ¸î S†‘AÓ:q†îÇ»†’{–£JqJlwv¼9jÁ(Ç êO 5ÉS•­ïRQ’Ñ•JSjÓ-DË^EgcdV+Q•«,*2µåÔ‘.™LÓÂTª•(޹œÎj‘+ì ÇV¼º<ºžs†q)˜ê'Š´ uGT¦rN%+yî,fÛ9F»¨®ËD× ÔBÃ'îî±Êžô®Qâªì‡BUÔäÔšÔa]k¿r#RTöØôð”ð•ÌøkÄ&fzƒþôýÉOñ{zëBW^œèË–FüêJè„%.Ê›e.ÊØÊL‡m5…L£aM32 ™…D´Lɲ ™…FµLͲÂ*R)„V‰™¶BE0Š”Ša¢d¶DE0Š”ŠŒŠ´È¹Ò*B)„U¦+‘‘L"¥"˜EZb¹Ò*B)¤U¦+‘L"¥"šEZb¹@RŠ(¯Ò¬}2 v(” –R QŠ\R⡚$&(Å;¸¨e¨‘⊗Òµ“) ‰ªÃ ë 3)Ĭç,îf=©f=‡$ô­k{U¶r£Ì#,k*puekÙ±¢êÉ¥²1ÚÊãû«ùÔ2Ã,C.¼zŠÙ•±Täpr"»Öœ—ºÝÎjôã¦p9§'Ë"¶3ƒM ,Œ@jÄ@\p¥&üÑË›.,I2oÆGcÅtv äIµÕ œÈ;\Ö QB2½IŒpRrG¯Ö¼Üêj$ïk”ð±õK˜ÛHÊË-ܬDYà·§j†-õÇ›(àpƒ^†HõeE!Ry÷÷5Vy$”´C\‚ärÃÛÒ¾r†"p•Ÿü1ò˜Ü ¨6ãÿ I{5­²?<Ãø¯ã\Íì“ÊIÀEìt¶ö§úÆPÇûÇ“Y:ƒÚÁ&BGW×à꺉{ÖGQŒ¬•ÎycËsÍYHsÚ‘ 4§ +B²Šô¥†‹WZŸU„‡9T[Œt¨Ú §+}Ek˜pµ^HëͯMDö>«¡M.îblï.=­A~’² Ž*†Hê´‘×™R] JÔ^Žë³5ØR*dÖU½Ì0 –<Žâ·m;ˆÃÆr?•y•¯z…9*F*•Â\]¾Dpç;úÖÔØ[G™çsœ ä“Y÷š “å°€óür cð¯&œŸ=á™ò•9Iߨähl 2J@ÀáGSô¬™dšþçϘ`GðŠ–;I&—|ì]ýMi¥´q§Îʼg“Šú%nvçÌÞ4[{È£ÉÕ#RÎzÖ•§ŽYÚ)Î@§'­f]Ý®ÕíœÀ€Aõ§³È-â3€6ñ“×¶Euc0Òj.RÑôêÏ[ƒR’«8Þ?©-Ú,°ºººÊƒvsõ¬i¥E“³*îà™ÍUi€{6F1Œ’:ñEÕäË–‘ˆ8õÇÒ¹çMׂ ¥¢w»{#Õöua ”hÇâ·¢ó¨Þý•LQ’®z®r­ô¬T…ç&QÃϵMåuwmÎìŸZœ8I×A‚ï^´kСH³£”{+:›Œ$–ùãxᇡªÉ+[MŒþí"Ÿd»ÚÃñz[›g äW_¦ÏuÅFËF‰&éT¥„·jÕÓaûE¯<º§úT’Úàt¯*X‡Íf:ó„ãuÔ¯£·š­ýäéî+SìþÕŠ¤ÙÞG0à+|Ùôï]C/*FA®§&®S°ä©êÇÞ¼zŠ¥I]lyx¼:Jïos+Cb¿tàÊz¥EmdІ[–$/RÇ5±i¦¢Å¸€ “éY@I¨Ün ¶?"Žþõ¶©ËÝÙn|¾' (ß—NæF£nË"\Ç X³€:“@»·šÝbrË÷G±­V›qžG@ñB ¨^þôĵU2[©m—Œ’Zúã°Õi¯k{®ÆØlléÓö3…ÑsöWu_(pT*ä€:éO²»iù˜¬ÀR¹Ï½.¯"Ç ¤o¸>qÆ}ë9ŒŠy!¸!r3K NêsRV]<º~'¥Z…OªªÛN÷ùv:&†ÒH¥Ù @f>¿>m23¨ÚE F7c¶4ÍÊ\ÊUJýÄSÂÒéó:»ÝÌ$b<úw5áâpõh6®qaóz©ZlI4õ]ZÙ¾*Æ£a°*; ~Õ¬,§% ù³žýªî¥tkŽRšœW‘êGÍu}ÌÿÄŒ÷p`ù€‡éÛ¥]ºµÆx£ÂÅ6ÞÌSç,6:Œt«·’šÎ¬ß¶i±>íŽOPƒå¦ôqZ²¥üŸ)®ŸÃÊèVû3ûÀ\ä÷5Æ\±–E~󢻘ñ ¼q |ŠŽ•¦-Zœbvη*C¦z¡3TÒ½R•ëšœB5nUœõ¬»“Ö´&j͸=kФTîjx/Fóþ¹ç]kšáü)­´Š~DŒïç×¥vŽÕÁŽï¯äŒêNÒ#sUÜÔ®j5ŒQäNj»ÔÎj5¼GÌBõ]êw¨º">b»Õg«/UÞº"ReYS˜UÙ*¬¢º Í:ŸÞy–2Ú±¡lžpk£5ÂxNçìú×–X*Ì¥N{žÕÝ^6:Ÿ-fûêqW÷f4Ôfži†¹Q‡0ÃL4óL5hWi†ži†­Æša§i«Aq†šiÆšjÐ\a¦šq¦š¤i†ži¦­Æi§šaªC¹ÉŠp¤á_v¢}"8 ANj&¨pð)¢¤J&Ñ¢¥QQ­Jµj'L T¡j5©–Ÿ!ÛLÓÂÓ”fªêWf·Âã{ð+*Q‹“:Õ8¹½‘CR¸2Ëä¡;ï{šŠ$¨áJ·×”àäîÏ*2ufç!ñ¥YD¦"ÔåO–Û~ö*^ç«GDbÄ?xÙþñ­GJÏ·Î~o½ßëZPÖqéœxIا"ù7l½äUèÂIGSEå·õǘœ§¥QŠãå®êT9{œýŒÚ{2Kˆ˜[rz¢³¥˜“ƒ}êûϑ֪HÁœg½jtSÖ±âã'²Mku°kJ+¹fÂB!nÑÞ¢²Ø1•SøVõœâ5@Qè8®\EÖGËâj%´nAm¢<‡Ì¿l/hÔóøšÑ‘–4€*¨Àµ:KŒŒæ¨Í7½x8š)žo4ê»ÈŽy:ÖeÄØÏ54óuæ³Õ%½¹X!‰<‘Øz×ìRÔô(ÓåWf‡íüûƺqòEÂÿ½]ÉUmí£²·XaQúŸZGzó+7RwèsKí'u°ù$ª’½+ÉU¤zp×Nds5gÜ7Z³+Õ Ûƒ]”âwSf¿ƒ›ý>ïþ¹ç][5sžŒ­œó1#áO~+yš¼Ü^µ™ËZ§ïŽj4æj…e%1Œj4ö5Þ(ÑH‰ÍBõ+…ÍmÔˆ^«½NõÖñ4L®õZJ´õZJé¢d6Ó[è'RG' ¯KC)Ê‘k˦ôm2qq¦[JPÑŽå\YŒ4ŒŽ|^ÊE“M4¤Ó yháæÓ 8Ó Z 4ÓJi¦­Æša§i«C¸ÓM4ãL5H.4ÓM8ÓMRÆši§i«Aq¦šiÆšjîr‚œ)¢œ+ô¦C…µrëut<ê®æ¹Æ+NÆ+"«Ñ=rÔÏ&´nlÃ-NÒdV\rU/Ë^uWsÎ=I껽5ä¨ëÍ©á]ê´JïUëŽP:á$z©+Óäz§4•‡e8Ìþk¨Ðl¥ˆyËó6zØVN…¦5ÝÀ¹?ÑÓ•Ïñêš¹1RÓ‘¸êëøQùŒcQ–§5FÕçòµFÍCŒš¤âÁFÆ”šh‘Ñ5FƜƢcZ¤o1DƞƢcZÅE‘=@õ3šÍmx²¼µÒx3þ=®ÿë þUÍI]'ƒOú5×ýtʧüò#ÿpþGHM4šRi„׆H ¦š ¦š´;ˆi¦”ÓMR*âi¥4ÓT‡q 4ÒšiªE\CM4ãM5Hwi¦œi¦©âi¥4†¨w9AJ)¢œ+ô”§Lp§ `§ ´‹Lx§L”Ñ"Ô‰§ƒQN´Hµ"PiY±×£™pÄ[ÈAÁÅ9û°o±|öFbòzšM@•*šùÊG4Y2š€x5è@ÑLœ5.ê‡u.êì€B]Õ貦QÐÒn¤-]*1œye±Œê²TàðE(95<‘‰}­@U£l0¯µឺǹÏÌ™b@i—'ýþ”f™psý)V_º—£1Ej@j©¯›¤grPiÀÔ@Ó³]ðbLѺ£Í®¸äIº“­4sR"×LecHz-N"YkŒŠb ³§))+3–r)Ka"å¡ù—û½êZ6ÚêTúÝŒU*9W"°’ã©sL¥ÍZAqù¥Í34¹­0üÒæ™š3Z$Ä™¤c•?JnhÍik«1@qOšÃlŒ=è¾N •¸¾ƒ¹ 4¹¦NÛKc³J "ŠéŒŒÛEL¢š¢¥QZ©˜É’ ©ÐTH*t£œç›'J±WJ°•›‘É2Ìf­Fj¢ c)“EÄj°TѪtjç“9'àn)¥ª5n(-\Ó1åZ£&µ0šåš-DRi„ÒL&¹¤i„ÐM0šÂHÕ!ÔliI¦Y8š¤5FÆœMFƦƉ cQ±§1¨ØÒ±²CXÔliÌj64ìk1DƞơcT‘¼PÇ5]ÍJæ«ÈkH£¢Öð´]M¥ãlKÜw5ØÈðÅ·‘¥‰ù¦;ºöíZ漬L¹ê?#ÀÇTö•ºh4ÓM8Òç±Ê†ši§i§bÓHiÆšiØ´4ÓM8Òv) 4ÓN4†ŠCM4Ó!ª±Hi¤4¦Ó±CM!§iª°Î>Š\QŠý5Cp¥Í&)qZ ¸f—4˜¥Åh…qsFi1KŠÑÃ4¹¥”-h™.EK‰3ëLjæ<Å‘ü<ÕQ_5‡³Ä>ÏSh»Äp§MñS ž¢š*E­ÔŒ˜õ*ÔkR-iÌc"U©’¢Z•hæ0‘:TéUÖ¦SRäsȰ†§CU”ÔÊk&Îy"Ò5L­UTÔªÕ”™Ï(–•©KT*Ô¥«ò-L-M-M-\ò)Dq4Âi¤ÓI®y"Òša4„Ó ¬š4H ¦A4Âk&ša4¤ÔdÔØÕ!ÔliXÔliXÕ!ÔLiÌj64XÖ(c‰=BÆ©#x¢74Èak«¨ CóHØ¢F­ß Xï•ï\p¿*}{š'.H¹V¢£MÍ4QˆaH×¢)§i¯!£åï}D4ÓN4ÓJÅ!¦šiÆšh±HCM4ãM4ìRÓM8ÓM) 4†œi¦ŠÓM8ÓM;„4ÓN4†ªÅ!¦’”ÒS±G#Š1NÅ.+ô¤ÏzãqF)Ø¥ÅZb¸ÜRâŠ\V‰ŠãqJ8 P*ÓÆNœ8 ¤ÉliMÊAïYŒ¦7*zŠ×ª_ÃÀ”œó³*\ôý¢Ý~EÒŠ¢¤š‘kƄ٠©£Z‘k¡HÅ’-JµÔ‹V¤e"e©V¡Z‘M>c©©TÔ jU5.FDêje5]MH¦¥³"Êš‘Z«©©«6Ì%ʵ)j„5.êÉ™¸’¦–¦¦–¬d5Å©¤ÓKSI¬YI M4šBi„Öm$)4Âi ¦Y´hL&‚i„ÔXÑ! ¦1 š+¤#+‰5Š@æžÆ ‘ª’:#HÞât†1—s^…gl–v‘ÀcêkºiUkÙe¸‹>žµÒãÄK™ò®‡‹˜â9çìã²üÄ4ÓN4Ó\¶<ä4ÒSHiX¤4ÒSM4X¤!¦šq¦š,RÓM8ÓM;„4ÓN4†‹†šCJi ;†šCJi ;4Òq¦Ó±G+Š\Râ—ú2g·q1KŠ\Râ­1\LRâ— U&+ˆ8 P)ÀU¦Kc@§@ð)܆Ä•£…OB1Nž6ÓVd6`ËA)FíÐúÒ©­[ë_>-Ê>uéY kç1] –èö;©ÏÚFýI–¤Z‰MH¦¡H%Z‘j%5"šÑHÅ¢U5*š…MH¦Ÿ1“DÊjE5 š‘M1hMH¦ SO¥³&‹ j@Õ\5<5KfN%€ÔíÕjvêͳ7å© S7SKVlj#ËSKSKSI¬™J#‰¦HZ˜Z³e¤8ša4„Ó ¨h´…&£&‚i„ÔØÑ cQ±¡š£cJƩƢf¥f¨¨±´b5Ú¬é{jWÊœˆ——lqôª‘E%Ìé JYÜà`W}¥éÑi¶¾T|±åØÿ¨©>U¦æ8ÌJ¡ /‰–‘4ŠT`ÚƒJi p´|ØÓHiM4ÔØ¤!¤4¦šiX¤!¦šq¦š,RÓM8ÓM)i¦œi¦‹„4†”Ò,Ri )¤4X¡¦’œi¦ŠBi§JvÌb—¸¥Å~‚™ìÜLRKŠP*ÓÄœ( U&MÄœ(à*®KbN” pîK`< @)àQs6Ųõ+& gˆ|¿ÄozÖŸ´Aäƽ(Ö‡+UtåtrÊÕ*šŸP°kVó#ÂñÚª­^£*rå–禤¦¹¢XSR)¨ÔŠj”ŒÚ&SR)¨TÓÁªæ2hœ€x4\É¢piàÔÓÃR¹›E€ÔðÕ\5<5Kfn$á©ÛªÔíÕ-âIºµGº“uCQå©¥©…© Vl¥Å©¥©¥©¥ªj#‹S SKS T²ÔG¨ËR¦3Tš(ŠÍQ3PÍQ3QcXιÜ"ÌÇôe ,Ìpêk²Ðt5±Aqp\°àsÿ¯S'ʉÄb!‡‡4·è‰4 $iöÛæUûKýãè=+\Ði rKWv|ÍJ’«79nÄ4ÓJi CD¡ 4ÒšCSbІšiM!¥bÓHiM!¥b†šiM!¢ÃBi§i¥b†Òši§b„4†”Ò,P†šiÔÚ,P†’–’†s˜¥Å§b¾õ3׸˜¥” P*®+€ P8 «’ØN€)ÀS¹ €à(œ;’Ø S€¤ž3lP)àRO‹Ø¥C)VƒÁ°¯ô§· ,?4]v÷Zßžkž½ÕVc§ZTÑÇ+TªÕ¯¨hÂOÞZ€Œ)ØÖÜŒUÔ«ÄWRœ©;Hõ)Ô…Ux–U©áªºµH¥HK©áª¸j5;™8“†§†ªá©á¨¹%€ÔàÕ\585+™¸–Rî¨Rî¤Ù<¤Û©7T[©7T0å$-HZ£-M-RÊQ$-M-Q–¦–©e(-L-L-L-Rh¢<µFÍLg¨™êMcìôA÷’ùVñ´è;UÍ3EºÔÈ`<¨?ç£Ò»M;M¶Ób)n¼·ÞcÉ4›±É‰ÆÂ‚厲þ·*hú|jò*ÉsÔ¹íì+TÒši¬§ÏT©*²æ›»M4¦šj$ 4ÒšCPÑHCM4¦Ôؤ!¦šSHiX¤!¦šq¦šV(CHiM4Ò±HCHiM!¢Åi´¦Ñaˆi )¤4X¡¦’–’‹%%-%1œþ)qE8 û›ž­ÄœRUrnS€  P)Ü–Å” §Nä¶SÀ¤œ;Ø SÀ¤áEÈlP)âS…+Ç SH)\ÍŽÞŸox?zŸ68aÔUOJJÌ…'x³’¾Ò®l†ÿõ‘gï/o¨ªjõÞ‘ƒT/4;[£¹A…ÏRÿ óªá-­3¾–`¶ª¾g,¯R«7zå³f5ó“ÕzþU¼©Ãê qIJÒG|e Šðw-†§ª¡éáé\N ÔàÕX=(z.Cd5.ê®—}'Ÿu&êƒ}ên„Å©¥ªôÒõ%(¦¨Œ•IHµbõ=XµÓo¯H[¹Ææº  "°{é¼ÏöøšV1«‰£Gâ–½ŽfÞÞâòO.Ú&‘½‡º+ÂñŲkãæJ9òÁùGø×A¼6шàcAÙEHi4xøŒÊ¥OvŸº¿TPªÐHiM4Ô4y i¦”ÒÍ¢„4†ƒHjZ†Òši¨h 4ÓJi MŠÓM)¤4¬P†Òši¥aˆi )¤4¬P†Òšm(CHiM!¥b„¤¥¦Ña‰Hii (CIJi 0©E”WÛ\ôÀS€¤áNâ`8 ANîKR@§ w!€ñH)ÂÉbŠp¤áJä1ž)¢œ(¹›)âš)â•Èc…H)‚ž)\ÍñLñRÙ“$ Å…­ÐÄð#\sRŠTI'£!IÅÞ.ÆÇ…­ÝÑ¥x˜r ¬é|5¨FÇË1Ê g ã?…v"ž+–Xzo¡Ó ¼:ßÔó¹¬/­À2ÚÊ ð>\Ô/æF‘é¹H¯M­r€$Ep:n¬^³7Y³ûPüO0Z<Ñë^ž-mÿç„_÷À§}–ßþxEÿ| «¾ãy¼?“ñ<»Í´,ÁTcÐI¯Qû-·üûÅÿ| Þ`Ë já ƒîÚñþOÇþæ±Z^O&È­¥fë¤UÛê“ç0y@~ðâ½4™¥ì’1–oQü1Hå-ü977dóÀzƶ-´6×iKefSÏÉ­<ÒfŽTŽ*˜Êõ>)~ÀIFi*Ì’ŠmfÊIA¤5 `i Ô4P†ÒšmCCHh4†¥¢„4”´Ú›šii M†%!¥¦Ò±AM¥4†•ŠÒSHh°Ä¤ ÒV(JJZJ ’–’‰M¥¤ £–J+ì®z"ŠQ@¥îH¢”P)E;’ÅáH)ÂÉbŠp¤áEÈbŠp¤áEÈc…8SE>>> /Length 1668 /Filter /FlateDecode >> stream xœ­W;®%¹ Ík\-þÉ àÌÓáÀÑ5<ã½Àvà퇺Ý0^§Æ .¤’Jy>¬Òa¡ƒßûÿõùüé×¢ßÿýýçúó#ôçÐ/¦rGˆsÐç£e,¥$"œ*¤ml]$§ù¨‘Žq!9Á§•^çö&9“B&Á3I3,#N¦ÅzŒ&¹ä vXóäÐ8Ë'‹Ã}†F¸-†,•³›z¸m;*öô.®Œ$ëb—¦N>džl°4©C¤èõ¸(Ç4µòT&¹ã]-\ÖFnÍ*A}¸òîa ªáÊ òt¶3Ÿè$¯b+¡jNýz|‡bBò(Å1Îvªâé’ŒaóI z=¡Ãã³¼ÂOÆŽÄE$K$N1ÃŽ>å“jQ´0îp8Æšbœ;æÇ^Ožb7\º#‚R†§iQs§4ÅQÔÁ=Ž˜Ò£‰ $2#9Íz« ÌæÔ­LøЇQ)ãDˆ‰§i‚'ŠêèBaš z=%Æ‘¶à*uV’c<ÒTæ\@WñqT¡Üé’3<Táìx4ÆútFœ"É… T)#¢‡O %gçMšKuΆé•nA&ÄÞ6ÙÊ+åêKãד êÚÁÅg¦mL‘,¥ (™–­¤I3²Ñ§9T…Ìlñšxµ5™9«ãÞ)Á’˜‰½wžXÉ6Ü—b‚Y±â«–ÑÁzøÔµbï²öÔM‘±˜3†š¾žˆØ'æ2(‡ …%mǵ¼E¡Ìe¦ ";oŠ“¬©w|t]%ÙÞ"È;Ù‘6?+^¹b³Gby^ÁÞBÉ#—j¶òÕäžž?ž¿?¿½Cù¿½òÛ~WáãÔ‡†$¾«@ÛsÛ¾'0š0ûñÌžz힟vß÷ÚÙ·wʾ8òç× $ì«D}þ4ƒU_ÞÏŸfö]?)~™Áª¿<ÿc×Ì endstream endobj 2290 0 obj << /Length 1372 /Filter /FlateDecode >> stream xÚ•VßoÛ6~Ï_á·É˜¤Š¢~9E0´ÝÒ6@·nÈö¬ŒD[ÄdI¥¨:.°ÿ}w<ʱ¹ØÄ<’§ãÇ»ïŽÇü±Å*Z䜇«¤X”Û‹È®êÍ‚„ßÞ^0§€bp¤ùúöâÅuš.X®¢[Ü®MÝV‹;ïM-z#õ2àœ{Åå2H’Ô{-I+ÛnÄ…W@Ê#–{Œ¯–Ÿno.~º=œÆñDˆšÏ!fÇYÄÂ$MY‘„Œ'„SKÑ,áë šq¸ÚÑôêŠÆˆ†Üì’Æµe/´ù+J£¦Ûà îvðæÿ—x!0²t:ÑŒº%3õð¿ékpŒÏüá3YtPN­Œà“-FÆþ™ˆ³GnQmÅF¢µÿ3ü¡ùZ²2‡üÛ¹hÕѣ<†1ø|pne‹$ŠÁ‘ºöÅû-8öÇîâ×9"°($ ž¯Bžº;_/ îuȆ÷Ê®]Bì¿àl•lKé?¢•gjI*Gô@8O#yg•zÑHc&…ô¹‚h†ŽìUp5–´È5¾J¼õØ.™W.æÕ¡ì6L-ŒC Þž&÷$‘Ô™'+Ú5Ýá^‹¹à$R8¸4Ä~CâõÈ|p̈́և3Ag­»í‰öF9¹ý±--xú/Q9³ä—Ë9Ï!ó0Í9êe{÷‰¨è¾B‚`NLËkßmÏi>á7;2zÖìÿ0ü⺈àKžd±ÏY%|Æ+RÎëÝiC,µœ%Â]…,v•ê¶VX‚²â„uva=6ÍžDù`d[YEÇS\m; ÊÝšÆÍ¨*é,ж¢/zaj·¦ÚyJãÞ«a¿íMwŽÔ¨‚l³£½ž5^©­l2„sñx¬Kb{0ü=ݲD”¸a¯ƒ’H"µw8Ï=³„Ÿ½£©S¶×㘰il¯E2£»¢Æ0êµ(e¸ r˜½uîpÜz:IÒIW ¡åLézJÄRa:ÛüË2o§LMÕ±¤=ÝZ<Ð\`¦g¹§@K¢A…þt¤s çò¡”½™Ž“¤U¯×|}äüƒ¿÷¿"¡ÏT)D¤Ôq€ÍÄOYœ…×7àU‘kÜÒJ鳊 Á·Î’Ûºœ“÷ÕÄ[.'ãq8MiI…e[~`cp±;68S|õT-i²rÙ†V7²•Þž¯Â•±Ã½ 嶺Û9W¼ëîïmü$Àµ¾Q-ÂNr(÷›N¶´¥&èD]€ÃӢו fÖØV¶[;6³‚ °?@ Ý‹èÎîC ØÛ›¡‹fðµZÒŠÓÔ•žAàÒ/æ¹/.RUÝ Mri[&»Ý=Q›x›{Ý)ZÜÚb—ÓS/e¡è[Šà“W=0}cφr&·år ÷¬ÎDöpΪE Ê>=¼ù%óéqŽ#E1 hŒi³1Ž¢ÓñUêC£pô&?öJð|[¨2þI'0¶Ê5¥ÒeãZjåZLÌÚE0ãOòö‡º\xÌû7M‰~S›þØ‘$¶ ÊmÌñ¦±%µN¨¨‡Ù9,ú{é:'Ø4û³]Ipâ‡dêbûNê lJ¾œëuõÕ6ŒÚSØ5$øJ‘¡Í•Uö]?†Ô³ãiðl;8ì—{ð÷\WÇÎ?Úœm‹&_‚àO À÷•jYù¯´îvü¤õþ͆€8 endstream endobj 2292 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./saddle.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2293 0 R /BBox [0 0 100 63.67] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2294 0 R >>>> /Length 1592 /Filter /FlateDecode >> stream xœeW;Ž6¹ Ìû<Í÷ã 8óî¾À†ñO`8ðõbÌb‚ékIY¬ªþ + þ¾ŸŸ¯ç/¿7ýýßOÒ¥¿>Jÿ|„~{¬Œ'“Tƒg•¾ëäñ"UåÙ$›áÄÒìÕä¢ÜÛ¤’¼bôy\ƒÓ•T‚cÜšSëÆEÂfXQì6X‘Îs{®y½{áL ïaSD•vg¬²I“ê^œ!ÎíCjÉÝš<²¤nìAŸ'lîlõeï¥eÙ æ´¦Hg 'Íb Ŋ½´òî=,¸U¿1Ä,¯é$÷`EŠqéw%Ò0F&ÃîEiÅIfÂz‰Ju2DYN™ÂFÉ‚qgY6OàÙÁµJÖr‡çG7ÙÛ6å[;Ù6WÑç)ÅaI®ÊREeÊmNnÁ•EåÎQJîɼÈy*û8U‡y·&UÍç݇‹ÏS½laä+VTxú•D´¨EyÛ¯&ÖMŸ§Õ¸Q%{3Õæ\››ړ5ÚËøçéHŽ¡Èá­¥ÎbÙ¡¨á–¦®f[§èæ¾rw7[ŠSE=Í™J±¸nRïp´SŠÜ‰ŸgdX 3yÑŽ'¥¾¿ §¥&«;Þ÷fO¼Ñlâ4‘¼3”&WõÉdñ¥4}8e—L¬M½YÃXWi:yR—Uï„QÔ KfšÅUM³z…C„¢@Ólò´RJ±HÐ첋Þ§œu¢Øä´Ý¢!þY®]Z)ŽÄØó zi­K Ì[¨ZÞJÂy/»À0«(2¹f¾hEÌÅ„-m„¼'n<ñ¾ï¡°àņrûk_ÇÌö‘SÈræÞ9 yQ=+<ãäï‚)t¤OÝ:äÔXRÉ{9|hº¯JÞÆ®NÓz= j¹*à¿r`ohr9£ÉÓ¸e¶c?¾ ~ž‚yèÕw|8q„—ÅåúÈ]¹ä.aÆz<)M£ÁjIn~7’ìä&÷ü<½õF ìMRƒÌÈ5Yz¨»¸¿ûAíótÕíåj\]Ô™GÑû45š¾ûVhMíÎ[lQƒ7 GÔ¬ÑYä:|Ð(tT!jãÒ¦:fѼX¨N–)röESW9÷ 1y5©4žÞ“‡j£ ;.ó¨£îÏS®œØãÞÌ#³ËLîñH©²+¨ªxÄK”µ ñ6ºFƒ|ìh1G .­9†µ÷b;oC˜+ÞlÊtÎW`ªŽ’#Ø|²H@zžf…;'HÜê¶Ž°ï¦@G«Bsôh=e® D°èÛNŠ΃T¬¼"Õ{ED-z}«¶m'›˜û¯8ÁLiŽÚëHìZ\¸MÔU) óXà¯ò¦ÇÑYز©Rü€Q@´Ú( ÅÕãŠÌ}¯'oݳšå2êw (Vœ°øgøåüã`ØAž 5£Üàxý ˜TòBÝUbT’W ÷>ᄺ¹Üæ6xCƒËûpYØA‡}“Ô4п—!>íp@²›ó5x¨'– z+\äÈê¥|̘9YÖyŽ2ã± ‹ú¿ÆÖAÜü¥‘Ò™•æ9Ó·ëî(´ °sׄÐýÖ”Ý A¡bƒúœ|ÃÙAê~„ ž[²}eQœí<üÜ »¥¤¦çáž FŠºdÜUžlÁÓµ*EÚõ‘ªsnœÀÙªöȼÆ yíÚ½á åÚÀ·Ï©`l ¿yÅþ]z÷Zöˆ×WH=¿]¤½$zr…ñº[ë7Whœ})>é|g.šµúnnç› –C—ÔŠ1l{w—ûŸ©Q/Š€š% årxA¿†1Ý!³—ÀP¼8Ÿ`²‡>­×+¬ž)ií—Nq%+t{†ðßÀ©¢7àh¡ç€—yœçñqÄ‚ÃTƒÝÙ<×[dV'°Õhe ¼Ï\ î¡¸ž\žÔ䢸ù=ñyþñüqô‚ ãËàë1N2é3±¿žÄ¼ aö×³Ûøõ8㟫Ýž.÷)ƒÏ›ß{~èÓ×ω_ÏÏÏ~ýúÓ Þúiý¾þ4s{ýù»éÇ ÞúÛó_áA›U endstream endobj 2297 0 obj << /Length 928 /Filter /FlateDecode >> stream xÚÕVKÛ6¾ûW9É€©ˆzXv º}¡ ¤­-¶A@H´M@¢\ŠÚ­÷×g†CÉï6¹$-vm g†óøæ#eÄðǃei-³EP6“ØiÍ6 á×&Üû1pd'žëÉëïó<àq´Œ—[²“uy(k‰"~¾Â6 ,ÆÓˆç>YkqÏvfd5ú`«=$Pn…ëàõM^ß¶“_îàÏa™Px¡+Öî¤F) «)€ËC Rk¬¬È ô ·-m¤ìDUÕò Vu‰6RD ?XÕì!ÖÏ!™‘rì6™GiÌÉ«S/ÒAÇÑ9&Þk/ì.¥PÛ!ìÝ£—1ÌKvef£Ý à&ð~ÊÛ»U|&ðO"BZðh‘ ŠÇw—ø3›XüO ÿož‚‚~°]пû¢SøÄ!à›ÅFRÈ endstream endobj 2302 0 obj << /Length 1689 /Filter /FlateDecode >> stream xÚXmoÛ6þž_á2&«¢Þ,7ȇ¥ÝZ RÆú!- Ú¢m®zñH)YZô¿ïŽG½Ø‘’bIÇãÝsÇãñaØÌ‡6[ù³ez«(m‹ ßHÕ~F/Þ\0«·ÅÅ@óz}ñâ÷8ž1ß[ù+6[ÖÙìÖyuàÇZ¨ù" C'}9_DQì\s-HRTóE:Y“ oKŸ-±ùçõ¿­;Çqü$BÔ|"ó#fIy,Œçú Iâ¹â…ÈAÀÜd8÷t–NÙØ±ø|,qx™MMLœònz¢>šTˆ­Ü=”š0¿9 4þÝ’"jGOÝ<“wR˪Ô$ÞUŠ dŠãä{YîíÄc j<§¯Bè›-¥fÁBÅ”™\–¸6‘¿"{‘þùv,}]‹oR(R9òz‹®Þ|‘,äuÎAcÓÑü F ©Ïúé–†ÌI‹ªÑ"# ÜJ¸Å¢Ä'ŸEÿÒ oœ`0^ßFÊ(T“ð T7jÇ·æ#éCÂ4 @BH%½âŒïÊ[%ABpÃeê¼ÿ€³^ǃ“MñÃâˆÜSB@Ú¢”9o…²P KžÓ—´¸ÅY«f[7Ê"ÍL¼%¦Ã(—ã™Æ±úξŒ%!—ûCíqý0 Üy9fM$ðe7=ÁšÃfâǯïÆ#c^ŸVÙQ”·ŸIçxIÏ/è™ÉÝÖ4\QH­åy×G±mr®à}, %ZŸÕ‘oeýpù´–>È+]Ÿê«Aýñ<—Ûg¬í”Ð¥ÈýK»­†[åcù=K$t%Ó)Ó“:H#(íʶ UKS— ÂMÀ(íÕIdqÌE™‚z«­‰–烖[èÔ7¼›©D™C,õ=I>ù±ÿþú< }¾ú BÛ5õøÇXÃÈɨ-0+¿00Y´h)ç²üÛÚTïdÝÉ>ŒN¨ú Næüßb_=.v³wž©t,’ÛÏm±Ûâž,§^³­÷QUÜFk÷_÷ªjÊìªlòäg»éºS ïm•cc4eGOÓÍ/ï¸öžÜ-,è—u5®Vª¯ÛÞ•–xœáº)±)%JlÛã©Ëª¦wSã[£ DëvR[àµÈ¼gö /ô‡ ¬ü%Åý±Rõ•‘aÁŸ†wº(ô½ væ/Ã퀿—Ϙþxµèí–âÞ¦£o|ßÕ~CæÃÔµ¢»ÝHâÚߥ‘S‘%‰ç§«³âigÄ®ý53~¸"²éŠ#/ ãS#ÊÓ%üŽ–»`žÉaDaà2¹‹` Z÷n`¼÷™êÖg"_oÏr^û”í Rc¼ äª&%€õY²Óxŵ†3£ÀÒÓ•\t†ÛªCLW-Äç–¾¬ÌÇåXé× £¬;RqN!WÉ ¯ßí¼rµ4mvø¤Áçm A,ð䨾bÈ'6äsÕÒÔÕÁbSS<¦RrF[./&R^ҋ弓 •Ž» NÍqÄKG‹Ú ¶y3sˆ´vÝm÷C "Ë ^“À&ÎÈÂ×ÈeÁ÷B#Qc+{oi&v¼ÉkRß ]g Ù>ï±æn|iÎ:èÛõŸï&V'H, °‡ýÑD ™ä¥Æ,J{£bDµ<'IRÝ Ðå›R˜–^T{dÿÓ´oº¶æ¬j…]¸Ø”Ç0Œœ &Si¿(aÈ%¾„¯§Žpæ|›7年Öåßïe}˜64±¡®69¼ÿbÉ#µ¿o'û6mE¤L?Aë~\ Ħ4çܶ¤%aèÜ”ßx´ ’CÃåÐlÒîRúàÀ—÷D®K{ÂãËÓW²´ëÁ¥ ?¡°*sÕÔä¿*Eçzjÿ$Qžƒð\~k)!Bh+®g¤0@èí\>Ml0Ú_â@zrF,r|ß%å;ÉIÎÕ¾)lÁêÖÝÿ¬‚e…ݬó¦ª,…©áb!ò8<Ð/{ÞÓhq®’µW ¸•ÓPe¹Z¢}U¼?aðŠŠ×Ó'ï$„&‘v…ÉÀ¿>(Y~µäª€Ê·&w-+¤hAÝ_}gÞï,[r-k)èÑÝé]2 dj¼éÃUk0ßï°P±öJöøÄ X™Ü }šl:=­6yÔ#”µ÷o[u aÈB‡ºŽÞ‚8sÜ”(|¯ \)Uœvº £œ¹ßÈ<ßT\eíV™hÿ7öã7E‹ endstream endobj 2325 0 obj << /Length 2875 /Filter /FlateDecode >> stream xÚµ]sÛ6ò=¿Âo¥çDšà7s㇤ÉårÓI2‰{—4ÍEÂç(R);N&ÿýö (š”Ô™ÞtRÀbw±ØoX\¸ðŸ¸HÝ‹Ø÷4H.òÍ—fÕê‚ï_=Î@{ùüæÉÕ?ÂðB¸Nê¦ââævˆê¦¸ølý¼Î¶T—¶ïûVòôÒ‚Ðzžµ’g6Í¥í%V±«d £Ø±%ïòËÍ¿ž¼¼é ‡žw&‡y‚Eá°\DIà?`>³ª©WÀAZ÷—¶°ÊKaukœˆàWò@Á¤ÄÕ…T%o‰¬m¦²„s¶ü}Û(ÆÕo­ä*Ëð\ÄNꤑ!7Ÿmßó­wï/A ?÷ëv?Œ›¬c¤ÊJX¹*—(3KL£¬õþh¼QR:Yû0IÂrp$h‹Ð‰DÄ2yÖ>l¶]ÓÁ‚$µ ÚÝvK÷Ö¨®å©r“­¤½„‹-x¢*Wkð‰±‘F`iâ\64ô)6FH‰ùX¼˜p&a MzNz6€œv&€•OfÛ¦^à@L9“ª>AzŒôÏJA„°ÏOÏeJCŸbj„t ”×ϳ๡$Á™,è,Œ‘ž” ÙxV¸ #NjŹÜièSÜw:ÝUw¦ÍȱFþ¹‚2Ð'X#=!(zAâDé¡›»1yZ )eÞ픜O½8Îç]ز=ÊC²ªüFq°Çñ >›-]½£à*(ßm$#3›0ãÇß>±Ô‘vUÖö|Ê[3•AD¡2+¦2k.²\"“åAĈ¢L”vò»§$`aÃD"8e¶Ú€O™í)±"+y—Q*36 Ò'Tœ³X0Ð'X#=®$¢)›MS'IŬièS¬kív ê—gÕ:S›¦†lvl³iìxÁ¹R2Ð'X#=CJeUíÀ.³N+Öº¹Õ½ç묮Éõ¾PZ€†Qje𻔺`n›c $y‰+Qm³ŽÓz»ÚlÁLÙ"oªFµ, z¬îˆvNÝ×u’лEäíN$Ú€O%#¤tÚ;©:ùµ]g…® ؈CÇw£sÙÐЧØ!=q™t US×w 7>'›ÙCÎd3€u|Ó4à*çü€þS79“¼>ÁÃé ¡$at áø}‡êF·9©…ÂZ±?MÀöµ(®Q:ŽÝ–‰±-ƒçæË_Xæó MèxuaýÔrªù2×ó§·[YÏÔýÖÕä¶c/ L]ª4¨[Ã& Øü±1e%Ó´«Z\d~±âïf×mwÔQ Lwm¢´ÅÚšÙ¾5Ål]»GKmᦞõQYcibó…|Ië F®8ÞÄýæ$86}Bë´Ë6ü¬=?lßñÌ^' TãbHR˜Qx©ßW‡8gªÃÅtï»t„x¾½ék?[kjÃ)5!êÜà ´ßÆe}åÙȬr˜%D±Ó ŽG߯§Ï•ÁÏ8{2É-eGØú Ù}³Ã§ìsHÊØü¾2 ñWl§ëy8ùÚŸ«åÍ‘sÀ!Í馛=•¦õG ½¾šGÕfê4+¿vRµ,ø²{ˆoŸ¿ðWYóâu-ï×éÒ/R(´ýðÐtÀþÍvø~3-iB˦©4 Û*«3u­›kh9Ÿ’ŒÝSœ¼–SÍ7 ­U%‹§S’roÒ‡{”É@<»ºìÚ?v ŒþâÑÉùëûÇŧÅo‹·?Ý…’EÏöØ•LàkÛ¿úá8Ÿ¾ÛØ6*‹œ¥ôÛ³$è†iÐT«¦ÆaˆûÍ?Ä·¨ì×w†w”M^*`Øÿ‹Ð,õCŸñ® 2©Ëj'áYþ_ĘÚXO܉R;û¨ªíø£oNùiÒg-¯eüc|Bô £† ­ƒAg·’2Mj¨¼g@"ž$‘ HÄxëY½ª¤3%A}ts¥*x¨™Èã‘»€qŸ 2ˆÒÛØÄxlü6v‚Á÷ö¨«Œ… 9ö~ÇàÔ{‰<ÖGí½âp˜ãöés\ß»dÊŸñ¤‡QõGˆƒ‹ŽCnÚÆ:ȹ‚7–Ç®v³Ç‡~e›ºŽÓþ6'¡ ÂÁ¡óabõW†ˆ‘ã;´=…½³Ö`¥B¼þøÉÌeÿÿÜþÛ~ù7ïm{/qôÆq\Ç{é8äc9Ò¼¾Ó:ÈÑVé…Xêï}s<„l­73‘é<ŽÔ'ôë¢y«$šÎ~€½è~j§Õ—òÛ®Êæ‡‚¬°¬Mï1¥¼ƒ:"LðA;o6:1¤§Rœ¤ Ösm¹¬pÚ…\ô\ÃCÁ¹j‰§â·AœRrÅ .üàœ©ÙÕ”Ê!Ä›åy£8µD ¨íùwúùãг|“ª¹/ëbÿz<–üÖ¦†cµã[Ç/zŒ­Óc:Fß¾si»Ä1ZA{©ñ…n©;t =¿mãJS“(`DÉ·:»‡TZ€ü6„»Öp‚õák¦.¨Ý-{1îSO#Fž¡ònÒ™´‡=ÀJÖ«c&˜Pj”AѶó­ÀgÜ¢Ü4J7+AÞ"Ê˾¥6(©¥à¿( ЯeÛ™÷t"‡mQ*û¦iô©Sî£4û*ÇÜ.[Ó?¥³#OY­/¿üú¹^•Gº¨ƒ[Ýn7>6èßò¯Ìþ¾Â(ó~‹vonõ²Ë÷Ár @«ÌÝè?Œ¹CîtÂþ£á9.ð®) öÇÆnKîh³“.óë|§ Díôüdz·èÓüÏ_úÉ’½F;^ì¾Y쮯¿ÿ˜BP—׈ƒÆP”JÈk*ýÕ3iÝ£”oKø&ìáûv€òÀÁР?žÚçø^r¨Åÿ”$#óøkûnÔ‡=ß…„M±VÎýI€ÜÍX`ª´š»ñ;^e [ìÏ¢#Áõ@Ë:ïôŸ[¸Q¯%FÉ€Epá•ar}.‡€©œc1>|ИµãWÔÓ=Õ–¿©SãvhìãOÂb¢@jÅ«\¸ÃÝ:ÅÓ!ž~UVÒ<“´~¦ ´fî‚1ÒT…Ü4Qtψî'þ¦Õ endstream endobj 2329 0 obj << /Length 2232 /Filter /FlateDecode >> stream xÚ­YYÛF~÷¯æ‰FZÞ¢øaïY àŒ³Nœ`Ñ#¶¤†ymwÓ3Êbÿ{ªºŠ¥!%'^̃ú¬»¾ªæ3þ‚ÙÚŸ­¢h¹Ž³Ù¦|á»U½›Ñàí7/>·€ƒ‹ÁÉ×÷/þö$™þrí¯ƒÙývHê>Ÿ}ð¾Þ‹ÆJ=_DQäe/ç‹8N¼×ÂHZ)ëù"̼¼-¤ÑÊV^Góßîÿùâï÷=ã$ ?SBŠÒ1jÌY…;ÖR>‰²)ø\½¥‹vßݰÒYÍD+[±Q…²èõÃ)õ"+"¢ªó ŠÃl™úé,MVË,Š®dQwz18N™tâýs¢d N óL„Ìw&ûLøô5Έ:–ÂFCÙ[:÷-¢U² ýx1]¦CÕ~PV }ÀˆHÑ>vS-å"Wì¦Ë2XÞ´š,ohŽyâ…³•· oþê'þ#“ÝwdåD^Á款ùn")aßX`'4sÌ KÉð Z Ÿä`U[ -ÿÓ*ÊB@4˜^e.èº8¬9t‘÷IåÝiÐ'à<é’ÒÜXÝn,¥Rì=*»ÓÐ?5¾m€Bˆ‹#4T#ì>¢¥æ–~µD³ãèQåv߯V9V˜ãøU.·¢-,ÍPʯ¦j(‚˼píÛêŠ'œëÅBEÅqJJ¶Zv7- OU»KW1Óq7W¢”XÇý'œ–î‡í ú€yJwLç¨Ì{R¥°²8œ ©ZWãL£È÷vS™Øy÷u¾+‚N¯Ìã•IpŠ‘ ŒÅ × o>*œmõRaB¸fƵw”0ÓðŒíDÀPßÚÜ Ó›é¢k’/œ?zfCÎJÀ-Á£ó}¯†ðņvÿö"ò|ãÊ Ž’ÃÄΙ|§&rÙ¨K⾈‰¢8ÐI—wîì$Äà±»¼~àÔ}+E>¡³; <cªÃ%©1<¢„ÃÃO<#­ËƒqÆpíóñÕVFN°„Cd?öŽ«XJiäÌ¿¹2â¡àm® 0ÚJÁñècÇ÷ ¾oºå¢ Aç¡ÙŽëóÊÙݮޮ'A ç;Ê.•Ö|šQ½v%‚{‡5ôUO²è8äÝà‡`>XC[.µ€ çÁ˜ºhÁ‘z& ½×ÚdhdZ¥4û1ŸRr%YßdÖ­¦…ÎLÉÚS`Њ†gÕÑÐYª °-ŠG4—³ÙoMè(5U¡\)¸¸býðrEÔäSS¨²´ rPÂI”çz¸HXŸöG0UüK&[Ÿ4‡8š¡ÙMk}vúrp»“j¢ãwÜMO† ×Ó¤¦3!9 ;H(a. †!v!áÔD³š.¯Ð‚×\.±±®\ÆÂTMUØk xüz3ÙÀ¹s„ 0ÓÔ4:âL†Kø¥Æ…šx ™Ä»{ixÈYahFí? N_›Qôã0æöëY]–`As¬ƒ&œÕµJ¢kÀŒzênccX«Ë0Øéß!Ÿ”äÒ“èÍTõ޽;s([Û)PÅ—Fk›Ö¾tÒ%Ë5ø“$\‘„iê{ïÐ6qʸ§ëÐ’Çùãá+üñˆÈEsPp©÷õ¹©Q%ÄTÅ™ë°]å;‘|C.Yt ªÉ2Í’SgÒ›tº«Ø[ü4aVØ#È\Å 0à ¢ c†™&~Ùâ»Õ¾º¹¹Ìf‚DÔµ¿‹ñ|ô¸$éÊûá‚–ï¾ÿöý´æ`¬,ÍX.pÏýÓN‹ð›?Ó6ëijmi…%† 8ãR³§ò§6îñˆ5¯¦¢ÞÍJ)ÂHEs×;x¼Ñcž»õì;îú’gÐí¤ ¯©B4r"FÓÊî»^R•²Ê©ƒ,PÞ k£è“.9?âàøDÂK¨'…̉F!{G½PúÏû5΀AÐ 3ª~ïƒfä‘0¯TÐ{õØ+XUl"[÷»ûî¨ê^ð2t¯á{ÜÔ²8¡“Q,¸w¦R¢çØð ìQW9+u®o)àÅçÒ©äºÂ¦GÐï[3÷Ž‹»wܤ¢è"HQ!‹V\ÈTÙ¸lÆWwwí«1± ¹µ­µuõ Ú`¾`5œÿðÍþ{£k OÕ›Û›ß뺄³W[ ¿¨nþ7JµT9´À×èž_¦»ZíöWEbIH²÷ýèç~ôË„d-²h›Ë”Uuév^?^‘ jÿ¨Ñ»éA¹²uÝ+x.wŸßÉüGôM~*\Ïôh^“42É–ë8aFkbIº/ØL|Að’"¬7FõLôËÄ!Á{â‰÷{MIR^¢ÿYmuñŒ¼92ÅŽŒñ ÒàK¹ÝÏuàÿb+ý É(¿k†6ÊÐFô ¹úbé\ÞPØTìì3^¶_¬Ò[È^‡¬ÿw—Bêœ -å ^Ôe˜X‘÷žò`Ø|±–Çð#QVÞYþ\%ö~æý+¢ü¹ØüK’ür*ÉlÑaÇz™ú«þQD§>"yy ^ v_¶‘ƃkÛsW™ÈÄZ^Å¥Ï2óžUÙ×¥ìþ_ñÜyо endstream endobj 2333 0 obj << /Length 2107 /Filter /FlateDecode >> stream xÚ½YIoã6¾çW>ÉèØ£]r1)ЙN§èжºL{ %Úf£mH)Núëû)ÙÉMà¢ÈÁ$E¾}ùÈx3þ¼ÙÚ%A°Z‡é,+¯\½*w3üôîÊ3û–°qy´óõÍÕË/£h湫µ»öf7ÛcR7ùì½ófÏš–ËÅ2'ýt± ÃÈyͧ•²^,ýÔÉ»‚+%®—8^.þ¼ùúêíMÏ8òý'Jˆ;‰‡Ç"z¾»ŠÂh§áÊ B’óàŒ\?Öçý2Ž]g«¶Þí -zˆ'ÂVe’óŠžrKyÑ*]?…ü½!&ðœfá9¢"lƒFqꮥy»7vû•~ؽP—2x6óßžÆÜ{ ÷¿MH¨†ØÄ6µlƒíïÿÎÊrm놨"ÿJT»‹* iÉ«ŒÉѪR[uGf´!o´úÃ\U"Ù°6[À—ýË’«=¬{—ªÉ,ü¾!WÊöR’™µÜ¾FY¤DÆJ.é×0T—•¨8‡Ô¿~¥ŠÕí3„ÇŽô¡o568†ñÊõl6ïÿtg9|üzæ®ÂdvÐ;ËY°ò“FÅìç«Çš¦¤+×õ€T´JÓ9mÌ€ ãR.½d‚9Ÿ(¯ÎÚYGçŒ2ÅðY!ÿáÄ{hë‹kÏ›VËSºXX5ÝÙÒWqpBÍ_-ô¹w¼‚êÔòqñçüÂ7ï¾gŒŸ¡5A­ƒZƲVÜá+Dì;4ÎÚlÜIÖìE¦h-¬Ñ] ÆÑîiDýìxÕe ¡½,DeVêÆÖ…è§è¬¼ÈX¾ÏƒuñÓÔYn©¼ìÛ²WÉOÝvPj<¡ÁâmÛ÷ÀÇ´5ØÖªÖõÉÏÇã [˜>ô×Î%-¹ê M\ ¾è®!‹üØÛ‹œ¯n¾ûvJîT£®‚‘ŒU½d,÷ÔN„$p÷:rî?hwå4Ï…Ï4Cô¿L»Ú,ö­Zš¯9W·2àD›o }# Ãd#kì!Åå pƒë›]Ѓ)V !^â6X<Ï­L%âTëñ”40ú ÛÔ†& ÛA›ñØGÙúJl%té d¨~2»žõ®VäG½zy»¿žG±gö\ìöàëÀ·+苦`’ë¹;ÿlÌê¯^«Ñª~šïßc0àƒ4p^Œ‡]¸^ŸKÏ0NLL@Ò…qììL²ç ýmCî' Û?WeÓÖ}q!Ï$'ÒùCÅJ‘iõÉ©«.‹^œÖ,íùh\JOŠë DËW¹ÅS8ÏEÉ+%@é¸TäÜØ¬³3C<¸Ñ@/s‰dqÆZs û†¢1$ŸØUv‡›“XÊX–ÕUiÚ°¾ÕU%®cõi nI݉Œ“¸ç…aÑDr*ŸŽ|˜)5Ñ00)‘&•Ak’!è¿Ähײ Ü;ˆe&Xå´Êš¦€@Ã& °Ž©½%çŒnùƒ:ã\$¦‹{À¤S–¿öüÚd"ì!‘scêåXtoÈk×¹Õ¡ú@Q–<@­0 †9ø‰Ó‚I—µÒ³EÏfG×*˜’óaÀ]ªhvTpZƒQìü±‚RÃÂO9ß2ˆ™1­VºhÓõ´à~’:sìëŸfte5ŸH8ØVoú—2L)Ò)$1.n»*ÓØ@ϰ-ÆOC›Z¦V˜=ªî0Ié¤5—Ñ#âqöáuM— "(R´-6³`¨±zÌò|:8áû7o»žßϧ°PDÈ £X—S©ZC^6ÐgTührd!œ¡…0ƒ(²Ð@ù´d÷SíêÈó’7dLô+ºïBÖÈ¥ê0c)}@Š÷íiæ›ó]qQÚ*AŠWC .Ç…„sç’ Š‡ND‰ÓÈZ㋼˴`Ñùnˆçÿ¥â–Nߎ#kð(î3EOʺßå9†1ÖèÒb«Çq¦YH øA¿€èÙPF`²^ !¦hÆÔprB-Ïù¡áÕ´Ù<Û{$6ÛuêüNv«Kªc°áN°ìõô°gÓ½I{“ W­Jì ½äœW=·o0Á¸lp£P&MR(úÍ…b›Âì(•DASR=HwŸ{³=½¡ç˜‘ÉÌ»t1ÜsKÓÚØ¶îú¢ ÔCcL óöhcÆEÏÞbö™WV ÌAÓŠáÉp¢=ÎÛŸßL5Æð(Ò`§0Ž9­q¬—¿Æ›B”ÚÀbšøúªAWÈVähòÎã§>Üy0t¾§®>Q:$7NŽ™?$¶þ4$±žJþ¡ƒ«Ž¢oõ÷×ò–=qêÔ˜/ (% Z5ˇá ;G(ÆdP‘É9~ÞýBl$“¶­âÊaøOG rIäTöâ g™éñ66ý3aÿj‚n\@ˆð¸m»¶“ºIºXë4þüØh•ºqb¬Qæã~BÆçðw¼†Â°E@p~)‚߉{¿I œFw'TR»É~Û e* @p %Oë#~ÓÛצæBð[o˜Ôjöÿ0oæ-¾Z°¢®øøm>>w›§ÇoºÍ“£Xk_“MŽ¡ÓÀÜßÇ6Ù‹À+û4÷äÆa endstream endobj 2345 0 obj << /Length 3249 /Filter /FlateDecode >> stream xÚkoÜ6ò{~Å"ÀZ +‹z«…?¸MriÑÉQ-qm¡ZIÕÃŽÛô¿ß<(­´µ?,9‡œ÷ÈbãÀŸØ$Î&ò<;ñãMzxá´¹Ûðàý¿_·ÄÝó§›oƒ`#;q±¹ÙOIÝd›ÖÏ÷²îT³ÝyžgÅ?lw¾X?ÉV1äPmwnle}¡ZEŽˆ,áÛÏ7¿¾xs3¸îwrˆ˜çX ìD›0ömáù̦gowaèXïU™!·®ŸXݽÂAlµ©*•†Uü+õJMì«4ÿä_e¼ØÈ®œÿ5Ì÷[aUÍAvx-à&œró‘Pª¾ÛOQ‚ç(°Fgj¶àÕVEßåUÉójo¢[¥™nUE‹ëØalv³áèaô›eÒ^âX·õ"mëÈÚñ- rE4zªhúT´y ÔŸxL#TÕuyyg>²!)]._ÊBQ ߺbb¥º“]þ€çhòÛ °dуT4Äôr´ùåp)×WËK¤"¯Õ 7“íMG?®à×ýæ–ß ’I\ 4b\Lì$tC}¶ëXo®?˜7Ê23n¼~ývõDÐA´Ä•ð9æ·sŒÃÀ³ªù^陦òñ=Ǻ!=pÆ‚d'²/:ƒ˜B“bnŒÚ k¬Küœ¼7IL$ÖN‰õÓ2µÇ“Ag=WhM°¶|òÖø(ìR…ÞÍç“ä ¡">æ©&p$úÜÄÔšD&<ÀÏÙ*™A¦²DsÁtˆ O²¼•·래X•{ΘàÅË.—E.ÛK±bO‰õ.¿»g’Sǃøúx-³Y+«J5°:ðo›šSáhû¬ü ïžê ë—=ÂBØ $ª¾aŒ»FÖ÷yÚò,•MÆX ’Š^]¯ä(Q_ Œ¯Á𚽦ö¡u™fåP5¦@Xaš+ÿÿã-}´$m”lùˆx|>,ä×ü€ˆýðŠqZˆ1ñFB]öFH¨b2“—h |¨’ÇY~Pe bkó“89Ø\™å©dÇåÃ5Vœ_W3t‰TœWü¬è(JÒSIâì!ÏTÅC£/@¼`u pÔòBOoþ¸u—Úú2^¹-dŠ€?xÚvM®VË”ÀZi…Þhë´bIÿ2ç£ÉÐD›­kÝWÒ+>_ CIƒdN5<¤^J«Û9XA‰«]Ë Æ`kúM[ƒ”‘JóXxˆKØÓüÊrév“gOâQ-p|T TâEì™q…uÓO"ÖM‚¡uã¯,ڊ׊ü³D<mè¬ú $÷~ÈÕc]5)™xî Áàiè•r  þ”žÙAw«ã;ŒçF€Ç<ëô6x-pU<¾WèãȾi^¡óqôE@L’‚§BBëH‚WÉ+5vLÈx4í’HÚ¾‰á´=ðÇ]ŠêrÏJ#‹ü‘Ã&»øŒÖ®¬~_~;²LÚ=u~þ’„T-O«ò“`á1/3ö§“DÀ1‰–ÒaÓÑqT•C¢ÝðÆF?Éÿzhò4Cû§Ë®é•É·à»1q mßÓ•‡¯Sú7$yÍ&² áÞküuÀ~îÀ“@ò´˜8ùNh]¿G:?LhéžèÑÓLšÉ™ò0܆B(4‹ìc`€Ê7cá™ÆT¶˜<åéi‘u ß{à(·Y9 …7è3ÿe¹ÂJlÇpT€•Ж~ Éu!‚öfZWYuKúâCq& it$7¬ $)CVù' ú¼Q­éŒÑá·öP†Á–îòeí_šîaLç>j¤\7éŠcÞ ŽwêÑ`Ê6.æhc0y^s2 x‰'k 1€Íd\ŠIVuGñß`r¡µÛ³mÂÝ W÷¢sWת2’jRó­A‰!à tÙhB¹Ë ÂâUût¨»ª3eB!†ÞŸæ®‡‚“TŽNãÀi•ž|\Aÿ<°ˆ~ùŽ6x–ˆBt©¸&×hÏ\ûóÆ$³xAüåj ²Þ“1×´¬÷”x"`Ò"1T@D⹡ ó]¸jLÛŽ\ÞZø ö[ý{ÖÊÐðWsFî*Ëebfï7y³=Kýoé)ë!Åêdàëj,ptâQ7äO´òŒáG ÃäÃà R-_@m‘ðêG5 $ò´–Ïá¸øäa ÍŒšRwl&Ꮆ#±[ÒS‰åƒ JŠÆÜ(ŽÖ8§r–‡ZaÄW ‚yÀÆ.àšzx°M÷ðôñº/\˜ˆù¦®Q`)“Ü'h&Ñ±ë ¨o“Ñ»ÏnÆÎ @+éÝÉÓ­÷ó0÷ Ã!÷ Nªü`(®aaôñ¬vl“!§PCsæÑ«îÞØä„es¶6¥Ú`HZ j }ÇâiûîB1D·“DA³¾,¯^ÿ+·œ ˜Úúj^œXZÈ–“¥…ú© Š×›SF7N(ßLù.’ Ä”i í/b@«;,ð¥Z†³V…G­Z°!¸e#SnE‘N}á…놃` eî°HÙ"1J«jIà ã G˜%)FšY o½«Æ–ƒÒ)ï+N tT‰&_6`1‘ŒÀ}»ì*î8³p„3ØïL(£p\ý¹>•f¸ˆ½¤¡Jº&uHôQ‘N*„Qb°K|Y˜º¨Þ¹Ì Qj¨¯{*:ˆ‘;ç“`óÃSo(Ž­·hUÃ=›cî$ þˆâƒDd]ئâöBÁbo©JlÅ"P7zÀ³J–àbEnjµœCJƒ3¡6’>rH2°«èM9Ý?}‡›{Vf`Ѥ/WÚ®b’XÜÁ=W’ÆÉIšùm¬¨8a=â/"yÅ;ƒQ›êð,½<Û¼çÅvâ&çÒ ½› /¥'Dé­î»®n¸¸xT·ºÆ÷|a‡HmtÓûüAÙUs‡¨®ãÄÂu #õý ¹@*@¤”¬J[[b1iCYt!Ó¦º•Ý—6ûã"¹XpÈWŒ|ywóŸßÞ©¢¾¸ºþåË{µ¥+Á]\¿ÿyœáäË[é—5êƒVÕ‹ÅiÖ®Ðt»â¿Ô ±¹®¡{àúžõ»÷Ú`¥®§3ÈÎYžH‰zÕ¡«bö£¸Äî-íÈåÀüØ[ÇÙ`H·oÝD]Rï/{¹ÖÑ[øâ8-‚#WÁ‘˜ÁC/s6éYþ€>Ìü†çÔ„ˆ¨Td ßý¡jNLêx®Ì]£±ã³àá{ÝúŸöš®Ÿº{c×Öë'x-s‹¦ÈoÌ1!¼Ø‹zÞ¨HA_¶Óýhæjù}eßUp5lgÓG.|ÐYtɦ/Ÿ/vœ—µ7€g̦Àf~7ˆ‡gD0;v€­¶0sÑÍ[9HÒø¥sF¤s¶yâCž§¦bÚâ'! Ájˆˆû’£‚ …ƒÔ= ú=˧ïY$øž…‰Ë³dž…‰ˆZ˜„b8³ø’pr“MxÞJ‡Çó‡n!®ålØZš÷~0áI[ø“ðü¼L‹>StÐDzª ùtÛw]U¾¢—PÖÝ+úÐ]º8ùü÷?øç_¦/Íw~Ur¶™ 6ß í,aý*d‹ ÇݭäŒ7$ãÞI.›1lVÈšë•ðĆÜ×ÁßÓ\@@¤—Ü,ðBÛIÜH";Îf{7A_ÊNˆÎ2;ÐÍ~L\ßö‰àäË8„õ dC»³­÷MϘs¡ÙÃú"2ä[øÝ‘JD1ª>.®„$2„•œüF£ØÂc Gàç2ÃÇŠ½#;‰Î‰L#ïŽØK›“\ŠE ÍvŸdp'3ÝŸüNl]R¢p-%ò×Ëk78ã]‘Âè]qrlŒÀdÖÝ9.]ÖpÀóÇu>eµ›•SË‚üà±ûïÍŠ’•¯kÞ™;# Ú]“kÖjrl'Æ„}Â]wßýοkçž8k* ]1æ®X±X4[;o¤Àö]¥ ]%¸ïKÝQÆY~üå’)~j>çó§\œêž<ǸK\}G)yî+ˆ‡U{˜ßùº, ¸ôƒïø?]jË  endstream endobj 2227 0 obj << /Type /ObjStm /N 100 /First 1059 /Length 3522 /Filter /FlateDecode >> stream xÚí\ësÛ6ÿî¿‚ßš|8âýêd:ãÄNê;§ñÙÎ5i“ÉP,±¦D•¤œ8ýí¢¢ø-Évç®lgI.vØLpÎlBΙK˜q@pš™Hc!i¢˜Ä*QŠ!Áå8‚&†^›Xø wxâ¤ÞbÂÙÄY@0åØ^ò„1¦†áSa)X%A( 2T¢AR(ƒO%K´àxOŠD+Ê·€²‰Öï)šhã RÀgEÐf€2¨MC g¸f‰U:´@TL#e–Ñø\‰„ ¡ƒ $=Ê©C4ÒØ z#œBpxeè7À ¥Dµ€›I%Q…HZdíLjŽ“†¡6*¤Õ´Y”àôé‚0©¨Ðx„)&P±Õ@òÐI‹ 2ØÏ:$ƒ§HPJ:ðb lÊ”æ”9”e4ÊrÐ å(Êr(Ö ”nd:ê@BWÀí L3+‘ š[Ž$ × ¢@"iÞERK»$J°44Ú!A¹$A›"ŠÉüÿj A±±åBÐ0K±—"‰YšA .&@D³Ê"Ú¬ ÐÁÜÌ:xA›c"Èmn´9é ÍœÆ(T8ÃÇf&@72ç˜m,@)f…€¬à”k”ËÁ¹û w‘AaŸTb ? È+ñ®r(2€Sè’pMC8Â5à7 †=€”IŒ"!‘‚Ix6E y*0ôY°$rq‰á+TˆKÌc!1L°ï<~ÄÖ³g[äø|ê²=™”Íy^V_%¿S8èÇ-rèûMò;„~ If]ªÁn+•˜Qš*¡€ëhÖk‚”ý|r ²’gÏr”·‡{ñÇ“QÓLë Éêóñ´)ŸÖå¬êû“²ú4/É0+ _¾3¬²é¨&ù8ú~9i€/­Ï†O“Ÿ~Ú‚ÿï¹ÙbÖ<R?&fhv-æï”_ÛæRÈ\£Si4Œ×,5à^kRH>`Z ~U— ÙIžÌ5/kÝçÁ ÷0!ïÞÿ–8Ö!Ô'³¢ø¸1“6&•Êß1¾ÚKYjbƒ—0Š@¦Fš…aÂίB¾Îij(#ípÉ@ƒdrP•ý#fIÈÁÎË„û/Mòñ{ë€ù·È à'ME&ÈBƒF×Õ±h…{¯ý Ïž—_¢Ù5Œ9Æq°ëAVAkdÔ‘1ø¬Å¡"ž8•ÛƨD‘j&$•) ‰°2UîJ·6yÿ´¾äTAï௠Lþ)Œtwñ×=zewÒ/ùd˜ò“ÖEG€%H=Íúžø/ý"“?gbƒ^A&³qÏWu>œAYYE¦|7iH6ªÎ&ƒÈ\ƒÐ“):¬ð'M¤ª|8ÖºñU^Ÿ’i1«I¿32:ŸŽü¥åå€ÔEVÈW_•¤œxÒ|.I3ª¼''*ä$?ó¤Î¿ÚŸA„Nr`ì—E9Ûãµ€Î×Mϲ†l“çäÙ!»ä%yE~&{äŸä_dŸ¼&¿7ä€ü›’#rLÞ’ÿ_É;òžüFzUÖ?õMèSÈu~·í_?ÏûyÕŸÉlV÷ËÊ‚ pg¤Gúd@ /dHF$'SR1™’LÉŸ¤"5iÈŒœ‘Ïä 9'_ƒt?×XÅ«%MM^ <éAÜø†ìÎÀfsú›#zY úвÊ' _†{¾(òi×d ‡`øz:â?)ütJ3*gÁ¹Gý¬ã gy$Tov[•¿ÅÇó«e1Pz ãÛ}¸ˆæÍüd€¦õãðOìeSe?ΪSR_›– C|Ïßrˆjìár@ÊÏÂC±€ö¤?«0úÏÉ9„T¯*Oý]ÃȀѲÓ/§çs]Õà"-Â(ü¸ŒqQ”üŸ0ò´q]ùaŽªü€Œ³>ø!4¦È€<€ ¯g!þ«ì‹«¬?k<Ï0‡²PÎæy‚=2û0^B6b²,Z¼1ÄǬøßú“¢Â|r”'Qåüf½È’`¨í¹ÛÇöRdlG¯l/¬³]¡-·wÉ‹Ònl¼ï.5Þ]´Ú‹<{‘go‰goÁ³ÛŒÈ/QÝ›Èþ&²¿Yb3gX´ÏŠ&ŸçäMÌÓ·±éÛØôíRÓ·‹6ïãÃãQYA|ùj qß+j’Í8>ΖÚfQm¶‘3d0 µfð±±ýRc¿h•Gž<òäK<ù‚ǃ&Q]ÙËÈ^.±—s†E«A~–ãh„Yl8‹ gK g‹çñaŒpÞÞþÿ®mó®|tå£+]ùèÊÇ_R>( t/!]éªHWEº*ÒU‘+«ÈAUf0 %O^ì'¯FeÝÔý*Ÿ6 £)U){ºE^àˆ 1´ãnòdçGN¹¢† &”àöÔü@éÀ÷ºÜÆD• mpÃÕ‡'§žâ†èI><9öï’}( á–{ÄíîwwÏÆpnÿe$eW–›JäÕáäèåp²výp ƒÖmátI0›:éVýòúÏX—>’¼"ê·ùÿÓƒÂn6—ÝìÔÝìÜ%7;}³›× ð|«"'\†SøFŸ Ê/õOOX·×xÃÆ½^«#\]îH”y÷Ž,};‡E žpTÄœÐ-aZ¶„›Œ¶k Þ¢%Zɬ•ÌZɬ•ÌZɬ•Ìé ßr_ýñ6~òÎuŠç2@¥xÄ‚&åÒ®t À+«ðŸ÷ët¯!YXœ4@ò^±â’³Tƒ!••©Áó]œN©ÆÓ\Âõýžx v>ûÞ° ÏýWx/<šU'Yß§£f¼2êåµÂaÙ<&蛎i¸6 ÌžüÂ%ÌÀ׃·ñÙ´lÖ±î^ WB°þ(pW·+ƒ”rZ-Z¥NZùh÷žï¯cßÂ1·©pü±¯nb®tŠ/[-`Å´x`ãšåWÆûõúÅi‹Üè`zdäkDµ5)¾V+nÒp‘K)öCàå}ÞŸCã f‡ku‹pX3˜(óǼFL;—ZËZ¼ÂaA~(Ǹ¨§#_áŠâ(«Æå$ï¯Ñ-Ј[ršÂøÈ¸W7·¤4µ0ñQLB˜n£RœÉ)®ø™¯ÿ¥e¸¨´Ö<£EÙ¢v6å0]|DÔëM4ÐÚx¨àw0;V,\?PÖã²lF  -p0´…Yøã¿`ëð"5?µè/x‘rW¼H™õ_¤xû&4?ëãJo Þt¢Ì\(.þâ¨Ã­ÃõÍXª<Ãߨ×ÊÜá±¢"Å<à+ÉnH÷q²™ârPµ§­³Ì ø:úÖ‘{ÉyÅ’ƒÜ`ÉA´ë¢]íz€h×D» ÛG²]r-\ð´©§<íj„b !- ¼¹k“šé4ųM¥œeöº#ÿNòᬠÃÞ*éI^øÍŽ䊆!BJf`BeSÜD•Ч‚é+aøqÏV.É:e–/ôH˜ÇQÇ–ô<@f3Jë­SÌÁÍÁ*{ètÐÛüIÉtj 0e­d@-,¼8iq¥÷³cÿ£hVCjn¦ר5O"‹êuØÁ‘Œo¢ùšn»!žÃ iúTì¦ ôJÎ˧YÕåg>¿à5á”ZÆ©dTJå²g,ƒ²õaPö|Ú/ǧ§—5ŸêÁ)qd;^¹O?¿ÞÿÙS²}°÷éз¿hG_,®ðâÓ˲Có£©ïç'0G¿s´ú„Qp‘ŠÖÕ"Ð?À\“CÜáb"žZ-x¸þ{ÙAB2à™ÅÌ©”‰˜¸^ÅV<ýv˜7£Y/tëûuk¢NÎÄàÐg }u'1ËR‡ÇL[—â¯0®ÿzl’ ¨KxôµJ•ÔÁp8‚}OàÙöÂjƒç…Ã,4®Ãåý#ú/Y°ÿX endstream endobj 2357 0 obj << /Length 2470 /Filter /FlateDecode >> stream xÚ½Ûnã6ö}¾"蓼kEÝ,w× ¤3b÷%ÁN€Î4íG¦mneI $'äã÷\(ù&º™>LòððððÜI‰«~âj\͢ȟÇÙU¾}Ô¬¯¸óߟÞ‹7Äéæ÷oþþ!I®Dàσ¹¸º_’º_^=xï6²n•™L£(ò²ï'Ó8N¼d£²­&Ó0ó–]¡èÍ1óDœN~»ÿÏ›0|%‡ˆyÎbzÈ¢ÂO¯Ò,öE3—z[W¦ÝEË_ƒ$øn¥ åÃà;‰ /§§œŠÄO³ÚÔ2{ÔÔŸLÓ4ðî *I¼ÿ©|2^ gÐlvB¯ÉUi»mÅsÒ' ŠÇI8óªéRoUÙ誔ãìpR!Á¼­ ÃÛ½¹?Où{ð~¼û8Æöm«GÖLãDxwï?Œ®Ã﹪ÌV¶Ìð£n7?=ßǨr©Ì"§è#øjcä‹D°oËâl! ½Bou«–8ˆ¼¦«k4à¿eÈ å€x½\ª’ûMgV2W<0$002Ýn’¤ž,®‘Æ H¯7mu¹&Ì•v§ÖÈr"¼×ÖБLa¤QËn¸•–zâI]È/…¢“öP|&’Y|»ÁuQ{²® ¬dŽ*·Ó¨ÒFYïx¸#chÚ¹Ñu½ÿíš'j¹¶(" Q7,Íiê§ ‰©˜ûÙ,åoº¶…é™yµÎÛÎ(4ú+Ÿûºä¶ÝEÓà•À˜av’X$w%0ódžWÛºÐ͆•5³çÅÞ²êP$ÜW+eL³4$¹Ç)ó.bðÙøØ€;pªLÞ=¹Èx+Ÿô–œKÕh¢ƒn—ix²ZqÛöK{Ï\<-‚ ?C᮰£žƒœë¹ª[òY´`TÏ oVWMÍ£\ÿˆÙFho1o‹ Su`—j̵Š9idcήÒ@& Ô¥ŠÐz #‹¼™—­…_ó„Q(Cì=Ažç°¯‹çk:o2óÃYx¬¦/UeÑ~Wª¾ij•· ØÏßÝ¡t ˆÇšY£9 /C\.Ô ˆÄDZ›j¾#·äßmr=L½my ¹´ ÙÒ’¬Š:I?åŒmmúL„±#"·¦&zÏí>þšC_ 9´›ƒ%+#·ÇAÀÊ Õ#A Ö>’Ø£ö.†áˆø‚ ‰œcHá!q‘$½û²ËO“ cÇ@£š®hÎÄý¹‚×2Ð/+èŠþX¼q ŽœË–8ÜÈQö®Í÷®LÑ$ÖyfM;­Ùü)|Ó¢Âq^Aë#U¹<¡5ÛÓêšÍ’`¨ËGÜû8ež{fï£é*ŠCr ñ¤‰³µD¥B%CšÙÇ3ae³ë¢úB,¦6î]H ‚­4k]ºöƒÂˆúÌ$÷Q]CR­í®\ZÀ¦2úkņt"«6Êq‘ˆ=vyøs„º “}HB|à›óá‚o¯CI”y7Ȩóa;Ï"³–ÈÈ–q#]ê-nßém¢Ú½¨\Š99Ú^bJ¿›ŠMÝ Sìím3œÏ5é ‡^r4XCæ³N‹a‡æ‡Ó{ê ½K·}~èÝ ƒŠ[ɘÌHdƒ‰¥§° AmzÈ…ac©%`³¿Ò-§ SAÊnŽswCž&œ1û$ ±QQmCák”ì’S\<í²äóÖ%R ÊZ…äxA'U£éPNŸŠÖ±í3+¸×Y^EFÇ븓[` å[Ñ+Ár¸@¢Á5üPÎNYeÑÀ? SÑ%`@Ø,Ñ.ØßJ­ÊœX‰rÞñê|.li3~I˜ ¾˜Íèb6!ÀR¡­–pMs’¼=>ÒxÝ=¾ùýDëÅŸ^ÿÙî/.¯'\´ÙB£Uè/ùÄEºä½EEy+Šj~ÉMWê6×&/¬?ëò¤îûôÙúI!Kõý+Œ´–í&b³ÚŸ|ÿ³ïO¡™B›?ðÕ¶uƒá*ñÖP*L 8 º¥Æ l ËïVñ…0ÌR¯?"RÐÃÎôpÐWvÎVÁƶéó® kl+Æ#±Ðz¨ñó§>Q=¢”x+-ÆÍç{§Wð·Þç’g ŒÝ”ŸÆËÊ~Zaš1Ñ> stream xÚÍYQ“Ú6~ϯàÑLZ¶“Î=4¦“¾´Óá!É% Pj,Ç–ï€_ß]­ ,rwyhæfÎòjwµ»úvµ2¬ÂëÍÂÞ4ŽG3žô–ÛW¡¥–ë þùãs|C`¶8ßÌ_ýüv<î±p4 g¬7_µUÍÓÞ}ðÛFF–ýaÇAòº?ä|¼•$ÊV÷‡Q¤u&+MC6 Ÿö?Ïÿ|õûü¸ð8Šžh!r~ÃDr˜å½IÂG,ædç¯`K³)¥¦j+óJé\dHž k¥îÿ1>*³¡9]ôYPC¥Œ$êòÊÒ¨%:†ÂÐŒ)UÞ‚‹`Ù¤mÙ½e|`nn|97 DžÞŒ|‚I°ýhìÉrGÒKZ ´õ1'ó¬c ¦7d¦!‹GlLQ2·o«:_P—1€6MF2…0›øþs¶f,ôîS8)Dz`œ#`c¿tùs¡þm?‰í&wb :ô&ðÁƒ:W†ÛUѳ(e*?…Œç2%)Q=×7\ü»s>þ5ÀÿlèËÑŸÞ1®¨È¡¯Úo £<˜ð0Y¹‚£¢´<¨¡…]µU4_'Ên Ó ƒ„»‰4¸»ÕNu:ŽôºúZ‹RÆÝÆÏXä‡íŒ1«a©ÊeæÑÀv²p<…è|Ý· )ýPÚzƒ¤ª.WbéK,äÀ…RUýë[¥SVžXÉ"¹|†hx§e½ÏZ|ÎHpŸ©<…2ú"a¿lÕJg*}±ôª¬+So1 Ji )ä™aJ¯ɦú÷¶*6²ôšIÅÀ[9›Á‚ܪ[ªF6óÔods˜ab-_¤­®´Mû¶Ù‰câU®â”òº½öE qæ" ™úZË£q×Sç› òu&}AOG“óÏ1Ãx8µ‡Ü4Ð*G'Lw4‘WÛ öƒƒwcmbk¯UkÃ6¶aÆ4šGý„ÔÃÑø0ØÛ‡?£þp2áÁ»UßJŠœ´c½¤z‡T ÒE9<±€u E>yœáñ4X«ÇDYQ=Kn`éÃ˰ôãBiPú 0‹ØÇ¥Óuë›xÚ{B4™ñÄÏñ”\à‰wá)vxâÏÆSi6z]Šb£–í«ª\Š­,…ëÚuq÷±‰A‹l žÒÜýeÛ¤Þ”øø¢;?¡ò õö®é¾ ¡ÜéAÉÇlª6jeîB·ÈBk'Vmô£[Æ”µt'æ¥Ìá®o}²É(¹´rNñMâ3´:ÒªÔxp$ÝWˆh›*$Ùôoš* œ5UÀXW ï Vf°vòè6DE‚•”¹£÷¤‰ë¼¼¯ÊÝ}Kf{l‘fÁJ”(·¶cÓ×Ü¿q¡ƒ³Ï8HÁ2UºãǾ™±YEäZn5ÏÃh—ÃRarAO¥@3ãliÒBvUº™¦k§Õ ç!©*µ°—íh7 £€z¢¥ñòÈSÝY%ñE—‰_…p‹S ËÛÿé]d™Ìhq¸&I'bÛikm«-Ç ˆ4£‰©h¤;¶Õê•XHU:ŠÃæB¡L-´j‹Î O¤w„3>宀{‡]Þì¢8›/³:µ`ìŽòÚœóD u¬ü²9û­»LËåw­1Ÿ´“ÛÑ;d¡€sÆ¢*ˈzúö/"ý—D{,¡€&棆¥;ì÷C˜Ð+ÇØ04»á¶I~:vÀ¶ç¥UúTGwWؽ+š …‡ŽZÝYÂùÿ^ÂÙw×ð³~ìÍx ¿Öp8CÞ‰ììpïn>.>¬]Æÿ¬éÔÅ€`HgœÜ/>7.–œ7ß6K]•Ë'XÙþby¬Æ+HY±îëæ‰ºF<õëæ;ªˆG§´Á—º²·º”ÞlYçRo‹ÚX–¦#µ©ïø¾ào èCGš×Ũùiå?xº endstream endobj 2368 0 obj << /Length 1507 /Filter /FlateDecode >> stream xÚíXKÛ6¾ï¯ðQdUÔÖSø’¢[´(Z q_ÙäÀH´­TUJÚÍ&ØÿÞ%ÙééµXìŠ"‡ßÌ|3œ¡–ÍBøa³u8[Åq°N²Y~¼ õ¬ÚÏhðâ‡fä ¸8‘|¾½ùæ6Mg, ÖášÍ¶»S¨m1»ó¾;ð¦j¾ˆãØËžÍI’zÏy+hæ(ç‹(óо-ŒV![y,Éæo¶?Ý|¿§Qô…¢ä§&./L\fIÀâ„Ll„j‘wå½x¦a§Ê¦2æåü(÷ñ%ñNúfóʧáétÇÕ^t›_}t´«h5[°8`)éR‚W$úAÊã†èiš×ûJlBƒÝðR‘Ä}9gžxh¤êÚC¹ëPu„žþ[) P{ÆœNõÂ(šÖyßI^¼ëÛaý*Z.jˆâfÚL1Ürÿc»pz{(!¸ñ*ññN—Þ; ÛLí”<Ò¨;(!ÌPâ3õº9$Çþ‘´P”GQ·¥¬[t( þwY5{ÚÀó\ö5nèhƒÜÍ:Ï0Ò4Àp£˜&&K<ÞÚh…¨A~3qÔ *ÊÝœw`áâ,Ñî´å«»S ~ì ˜wn4 ©ÍCWÂÔ“ªDÁˆ8ÚlŒÑã¯×Àó¼³f@‰ô…±¡O¶mù¶Ò”…kÅE"2爐Û2}cg`_y²$£Ûù°&uì¹*Ú*äï;·Š‹Œ¾Âщí!8~(«êŒâqäœWÕ#H®Sï-%¾,=Ò) ZÒ© ³U)hBö][F–ôŽ«…NieÕìN*Z½4cˆ†˜‘€¸UÂ5bÓw2OÉNgkK¯|°Â•p s-á0(‘;(¸ÝŽ«‰²Ødè¤Ou@ôh$\›=nq]Ó<¬x¹È ]°šLÍž"|R0°ÞŽÁlÎ-ÒU°Íë K×Ö62•ô÷ŸùGSÞ‡™Äû`i&Ö“üßc®õ€¡gâ‰zÈ}h6¼cGˆuo±­Zi˜Zƒ‰¿ïýGÿšä÷O^ûH°¯éôïËæü‰K˜ØTWÈQŸ\wû-ƒ·GaEÉà±É“Bìx_ï1œš,œußQ1‘ñ^)Ð ]ÙȺk&@×eWšZˆI :“¤Ò¥)¹ä3õ?r¹‹u9c \â—lE>ÿ1‡RaÜæU+^‡,©Íùh;^Ð2ÌqWÝAîoeN3(ãIßêª¾ÕÆ‘cªj¬ö´T@{À[”†gÖR`±ó„Q¸‘¦ÞÏb×ýz7§æ ‹?ý‹C„¬|k;(—˜/ÊýÁú˜vÈ[%k‡}µÏyþ·ó?@ÊZ²ÝÐW_º•Òx™¹áYŒt××¹ëŽx¾å^–ËiÑ€¦Ì»^ Z(TÓáàÒ‚O+gb­Ê©òdaÀ2æûÝ›»7$¯OÅæeù^kýíå•Zâ{%¡=™¢;hÕÝc#Îß6¿È[: [ŒÖM€çx<£z9<É1ìMŽ2H‹ã† «¼&$®è0?Ò«¾ Às( Ã[d:Án}}K tBg V/´ssá"Ïô÷Pê†Ã©‘¬¼R0/¢Eù-½BSwÆ L«€éÊPqíˆrSR¸Æ+j¹¯[Â%1!ÕY#ri8©;.K}K[y>–ôWÊb74²n¸ü¢ÿæŽì8Ÿ'œN•Ç}›]ëVhnµD=ŽÔks ÁWéº4ÃÚÐ.YL^DY»/{… 1ÒˆÎýC ¿òQ¾!T£ÄÐ’ K×9Ï;s[ãJ<û|}´U®-þÛÀ$èæãG“OTÀØr„Ùú<ˆÇ|óGbžž¨G,Æxç ™[ït,@kÝW•¡:M‚eœ^¨Bë[l𚟬՗”L8™> stream xÚÍXKoã6¾çWøH–*ê­]ìaSt‹Zl^Ò›¶ÙÊ’¡‡;Øÿ^‡’¥DL¤ "ŠÎãûf†”éÌ‘t–8³ÈóìÄg«ý•£f‹í _¾¢ZÎ’‚VGòzyõ× ˜QÇNœ„Ζ›®ªåzvC~ܱCÅ‹¹åy‰?Ì-ßÈ5+9Îìó¹åÆd]§¼”£È¡¡~2¿]þzõÓ²5¸îHAò¹‹a×E×÷íÐ faìÛÔóÑÏǯb»«þü~ñ¥È3ýÆ78¸f«aðmžIKõlè­Y¦‹e~Pß>*‹hÅrCÛs\=ù?|U‰<»¹½¹Ko²ÜœÃÖòÓããŶַhýj4;Z%5«üS<ŒQˆÁP_†눴ÒÇ&àÅu^Uù¾‡†vä)óucÛõ™å96ÕŠ>KRCŸT…8¤ÆÉ œ;°jçáÔŠe8w§²A ÊÈd8ðøçª™aBkC­Òº€LŠÉ½¨vÚÑÿ7hqûÛ ôn©æç”hH5•¾Ì&¿ÇùŸVuQð¬ºÀ/5Ñ!\nT¢Kÿ]Ñ&WÀ}iÞ»8Óx¢´L1KlM¯v>´“ÿ¥’%PrIL°W+VJ},MO¸\—|S§8V¸KÑ Ar’Ý¥¼¿,²¹\>Â?^T8ÇPÙ d!@Ç'%ÏÖ"Ûö%ÔaÞäêyc‡²Ž¾HŸvÕR–q#“Œ¨€g‘Q’IÖbU§¬@¤JyÉòbÏR3ñ,[k.YYªPa¶Úy½Ý™Õr‘Uü~Úå ÃA‚Q5Ý@dGIf” ÌøìÊa$ Êl±,í˜ö›E7IAܤÃM£UØqþ3bd΀óüB­e È\C/ í§Ÿ¶ 2C‰¨sm†ÃK?ŸùºM¤V›ÑPÁ’ê9]ãž4\WÐ@Z8³÷àíîV6<™~mpïù­^ ž²JàþÞ‰­S¶Ç O°ös´Z™‹òhιgÄû#ˆ[­2º²ùݲÞzvÇÓA«Ï¿‡ÆßTþÏ8ÖïÇ‘oÒÞ¯M]ÈžäÞŒ÷òQ²E®oçÆýËÇïˆ_#êOŒ!ÈŽ¦ýãbÈØý ?gÁÂÿUüÛ> endstream endobj 2380 0 obj << /Length 2219 /Filter /FlateDecode >> stream xÚ½YYã¸~Ÿ_aì“ ´µ¢.[ÁÌf d‹2Çî-Óm%²dˆRóëSÅ*Ê’Zò1X~ EV‹u|,ÒbæÁOÌo¶ 7 W³ôðÆ3£ÕÃŒ:¿ýã`º.:”ïïßüü÷(š ÏM¼DÌîw]Q÷ÛÙ7ç—½<Öªš/‚ pVoç‹0Œœ÷R+9”ó…¿r¶M®4ô–žX:"òæÜÿó͇ûváÈ÷¯Ô)/¨(¼fÃY¼ ]„¤ç¿÷ªåbß)Êš:‡9hÖäuvÌ3µ¥±’‰ê½¢N®vL¾™ûKç…ú’©*Yè]Y‚;HB`«”Zl³ƒ*tV2'º{Üï,—n,g ß ¬ù>˜™Øõb1ë &¾rçrÍëVÊ0,‚xÔ` ¸""¦m%qGO™^jlCç½úžYé¦ÚÉTñÌ6«TZç/4W2ŸÙ:N«¹pÀQìüè2KpÌe¡Þ¢`ù¸kyˆ±t#kóÇ2³F~äär£òß½È;fiÝÀ&Ì(|¬Ó¦ªTQóøM|DrîòP]›,_©3T玌ç»I’°%­,óì¡ bÓ]ÿ«|‡- ;*ž<¶ë+–æõÓ¾æ=`w]”¦eAÔ*¨_ȃZÿôS_ I¶è$£þz«vb¾XZV@&I¶ô``=¦Vu ëkW6u¹Éò|SÊŠMþWjÞ÷GßRóá°QÛ­Ú‚K;²—B‹Ö¨wÞ›ÀX†Ny¬)¸GBà›¡@[ŒÉ¥Ù£¬`žP>3Mm£1 ±'yDRs„8¬ÔiRnn×1öÇ~mÕËÛ¬avY§˜{Åb³âÄa•LÜ$öcÒ1ôç×ßå—±M œ`!— #È€w¾Xy!Y ÇØÛôË’t\mõ¸5qîäÃ1“:ˆ=«ÀyÚg´M:ØÄí%/÷PL§*kY«íX”¡¾+«ïãܰ#zž£KjyÓS<'ó'¤5˜ô¢i Á§¥'$‰“ÊÃ|!F‹Ã€$½uÁNãöBÍã‡ÖVÕ×)J€ïŽèÁﮚ†¤m©)à˜Jœþ6¥Ø‚›Ì"Œ'ý°•noaŒ_¬.¦m•UÏò€°88NÃ0t#Ï¢0pWp²œ?R-õ¢CNÇjo3C¡Æl›nhöTHèP»R¦¾¤Â@¨QÁ•úe<1\:+ÁP$¼Ôïrpi!; )„öž$êã|§² ÓG[ð‚]UxªÅ—!D&±óùË@£9aíZ˜>Ô·ë«g¨XÒ¬(Ð7`ãHäñHj£š!äAI-n6Hͳi†8Û™‚áªìW5Èbµº§¬Þ3Çž‡Ž•ÚÌ.Za]E­ð^wþnÂRÎÝ‹p¾|½e`©¯Ÿo[./·³|ýr;Ëç©0_Db…¸‰`D+BuÓÉ¡±gO©“{ab¿B§j)wÔ‚5Ë@·Fi¨V„ÕA["D}Ó“ÿsJઠëÔ ¸•ÕCád ubÇ>ÆPÙ©žj— 1@3-Fæ%¨2©ZèÜEkÌÃ÷#¢Ûmá‰#Xx†67ÃÄ'c˜¡³qõÍäªxhmw]EPÛeßÕÍLG(3꛹¦àéLÓÖ“×p–F•Üf¾í²aPY¥eQWe~ë*ÁçÙú‡xaYY¥?àK欳ƒºYÛJ=B ª›×Óͦ“¯×ó™7]Ígö7TûÇ:9qÝúø&Ùå¾=”W^ðZÂíJ²âvù|³ªéKšgéd}‚báBxÅ£†æ¯€ið¬øà;wœÊ‡søh/‹eSg…º|t¶)ÈüÛ¿ ôôiß;õýBòi¸k¾_/ÄmG–,¾yņ„ê²¢¡^h¼'@ËImúQ¦\”ÁñH' Û[xçÕU·÷|3ÏฤçbÜe¼€,¨\Z…Ž™YµK³ŠgWœzGXÚ¬‘t¦Ü˜<6'ÏLóWé5ðÊèúWÎG4ø?€ð!ÚÑñ"ppé¦È•扚Ÿ£„M Ë “Ymþ@À©ƒ4Ž~1D1 ÿ;rò Ð}Š6 6 Ág¹íU,sdžàûω¼þ‚oY7 endstream endobj 2382 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./join3.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2383 0 R /BBox [0 0 200 125.83] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2384 0 R >>>> /Length 2373 /Filter /FlateDecode >> stream xœuYIŽ%¹ ÝÇ)tÓ"):AÞ¹û tFæÂ6`_¿ñ(ý¬úŠhÔ¢@ýÇÇIùïÖ‰[Ç¿ýÿÇ×õ÷_£ýñß‹YIÓÛÿ/nÿ¸¸ýëê4föí—Kû$éÚ˜“Û×Å,”’ÙeS¡pŽÆ]œX‡R—hsñàöq™õô£SH´ÏË’ÉÌZ€sD 5ŠÐ3IÙ[šÒìÞÒLÚÇÚ\;¹yû¼¸SÌ6ÄI†àDš´“4fcIÎÍL¨«µÿ],]H´™åhÌ"ÄÞt±ycq¡¡MÙ‰RÙÙiÌÆÌ–ʤ܆Ñð‘SŒ8û$=‡âwÑ 3ÿÛeåUøû×_.!k܇’M¸ÒÓ)¹CmŸ×oûÓÿüq±Ë ôÆF–ûsarkì”p;—‰ìð¢‚|®Cs©?hfãA3ð³Ñ䆸¹®Ï©H†uua’kãNÁ°Æ¥åNsLm”‰âÓê†Ùh€OØú@ pd/òÍ‚ë÷‹-&¥4™”@Ñ×:'>y´Eƒ”ã,{“¤ÙE!Ѳ“NŒËÜdÒ:¸ÏE§N[71’IìYüÈ@™Àg‡>KGKàœUKGgò²„'¸|-.ø:H4u'… J6#VVŠ£«Ç’+„/'©,Í„d€îU™^yŸ}_`€éßçXŠqmAç¦èƒ)§©‡3³ãLeAiV‘grɹr)¬i§!<’é–mg.Þ“ÕP”ÁaA:“˜!Ag¥ÍDqíÁeNlB'@èá¥cùæ°âÛ²Ÿ¸À²e Ó@×Z…s¡«+JiÕ!×…étÁ’Ô½‘”eÃû\ô¬ßCÇxe T®idÚó¦è£)§©oÎx®]·ªp¯g]1‚†Is…ÕMkõ³•Å\P¼X: Þ€)²‚ïS:x|-\ù=+¿KíJß5›4 n±¥z'¸A¨ Y¢;"¨ÙR Fæ÷¤ *×®Q"«¿Ý½[rØy8¢ú›£IÝÐWÒXû›Ð(Å 0”dJµå³ú=Ôdz~@˜Ù:©ìDL©É€x «.‡kJZi„+‘Ä`ÒÝx‹€-B±´:ìØ½cTJ’ÐQµŽW>§ÀFŠpÐÓ”+×YÚÎÒw+Ž%®‰¼jÃL´E­Æê=Nék(*÷9ÍèjœHE(7éÕàÞÌØ¦½q)Ó±FÝ««U«Öðõàg 8KĽˆ¦X4Œ^H°&ƒDÜ7,²‰R·ôï’3à ­Ä… GX>:bO[ì@¸¯R9°§¾×‚JýEÖ¼çÕ{Ú=ä¥Voé$+Í|’ƒ|5‰¢ÏL?°è$,4=CVkÏÝV~²b[öÆ¥,c’¯©ÄBQÑG9Kýù3%îIcjÔ­G.žÃZµÝ¾Òæ¦wš‰¶IÓר^S Jö’y8ã9Ín>þ”oØ8¡s£Ñ ¿Ê/Ö§]îb›Š NªïcuLý9“;|äcØs–=Áñ õ …'°¼{ðôð-É„hõU¦ÙRµGã¥ÃÞœ,}CÞäShBíþ½3ÜðøÎäëÆÏëðáçÍŸ76Ÿ×ï—bÝÃW]Åõë}#¯¥1¢vV*ÄÄ há²²]”W'šëw¦ÿD 7œtsÚ&1 *±¿¯Ý8•dqêÜp_ØÞ$þ¤\$fØdp”X8¾.1§ÞÇ:A©uòØd ªEtRER,©°…Ì™–T]CFÇŽ"{’‘Q“ÖG XZAÍÄ‹® }ûal»ÄЧu±t(¡4sˆ´ÑN#ʰ>‰K®ÕÌ%= £>x4lB>V<įô6¸b¹S×:Q,) k’ÇPœ‘—›ƒ­LX‰ë$×B3döh§RÒLΨݢz{ÖƒK}vœQO6,:Ãa:õ¡‹ž•~ ›K†•S°3 €¹Ô 5¨nTí §ZÐD•²~¯½ $?# ºTÍ Í[ð,³ÞtzÍV}R¼‚ú望ûnî½¥qñ4@ÁºYvZECæÌ‚¯Õ('ºn-¦µrzÚR[¤f¬ˆÍñØH}0á½QOi,;ôî»ûnÞ=¼/õ&· ô¬„ü.%øY ò>J#ÅËNjïMÊòƒ8uHx3á¯,¥GâÊ×,ŒåÌ^‘U‡­Œå»kî¾;}ûäý°±N0]ùEŒº°5À@°/ȂӥCGm†Ž}¶Óв 6Ï*(/$b:ªŠ¤YzÖê :âÉ]Ì©ÆMQD¦Çú¤ ¶‹CuýNjUçzOLá2!ußà­”q;¬X5nWc^ÅxÕ¸©¹k'JT½Ñ²ŒÉãdqqjpÓ±Û«V×–…×Ûý…¢ÁK¯= Jùr\çz­„>ûû\t¯7ÙÂeÕ‹§ ­d–¿•‰ÒÍ”£ZÔŠ×Ë]Ρơ&OyÕÔzÚàé¯6‡½´.ÔvYÏmتMŠwó’PûBUåŸ=³¬(ËðнôD‰G¼X6<®@O¤œ/ºv¶“Ë]ΩÇ]Ó—/ #JFϵ֠Bd$1_¡ì*Õœ‡ Œ²»KY=„¾›°Ìš¯pð†!^XgîÁÅ~ÀOFþÀä]Ä)þ® PT¿“zk_ôˤ\´}[Xì‰y»y”:+ÿ!ô»˨Aâ%c`üºJŸ×9©|Þ\ñyãóùÌ»<òªÇQÎmr䃂w oÀøÃÏrò>±KcsW©úÜ´=xÈ@a4™»ÏèšÖŸ"ð{u¥£©Ü»Îٕζ…ц‹C_`¼Q.º¡SKÁ’¥ë@^y>6±þÝ„¿ˆìͧ³No"Mkð(Kd©¬?îܤžzj?xÿŸ×Ÿ¾ªcÛ endstream endobj 2387 0 obj << /Length 1331 /Filter /FlateDecode >> stream xÚ­W[oÛ6~ϯ0ŠbKuñ%­_:l+†= ~hà¸%17Y()޽ì¿ï‡²eGн¢(b²çòñÜøÑ&þ‘ÁÌL|ß™ÓA¼¹qµT®¸ùó·bìl0´[–Ÿ7?ý†â:3wF‹Ç6Ô",­ŸSZTLmß÷­éÝЂÐúDK†’ÚÞÔJꌕ°›¸db‘ W‹ßo~Y=ïÊ•ååÇÓÀ!~€!JVÕ2WÇψU¥Lm<+R²²PAY"Ox¾F9χ0¤T²¸â"G·B§!Œ²t OŸXŸ™d#HÔuwH¬ô¦¨+ª¼Í©TžÇ䣖 ¬ÇР.§M|‡„=J‘Õ•©'“Rèb–‰ÅüÁ%SÒH¸S8P–q»,K ðXï÷F{R´¥5BazÉ/€èÝGtr߀ôu‚zh<„ˆSž›l Ñ—P&UÏ °)C<)êJYuD ª3uBšæÒlSBàœåÕƒº•äEÆPJG¸¶eQ‡,î%F>t¥v‡6ûã±EqÑCRo˜ä1Ͳ ¥ˆê²Âýa@`fÔ„)™è«7è¡óŠ¥(Kµ¡v2ŠlÞ(Ƶ¿“ÀÚ¦©2+Õ$C%oTºMèØÛkf¨§“Ý®üÿòϬ¸Ó/0nF%¦ÂsŒ9uÃŒq†¬®gêï-/[Y¿ÖÓ2—BõÈ>Ô¸Õ©mÊrä…'ζŠ)Ô€o¤Øô³QÒ“M‹ÌöLŠ­é.&RÍ£¨ÑÇ;i()EFs¨ ±Ãɘ´§¼Þà/»k¼Ž,Æó²HáYù®<Ö!c×rÛñõ 'ŠàÔòj´Q¬bnßì¼Ò< C`Ǭ6†}ó¯t¬»›J•qfâ€*ñ¤u*”[ Žâ3¬¦ ›–%¾óÚšÍ\§'9ºßCw­y¥£hú¦o6Å ïŒd”×*¥UÏ@ƒö[é^;kR‚õU`b®èÍ•P¸â•€ú>q`³#T»4¯j!ÍäÇBW\½|~<\ ‚Ð ¾#z°š+ÎÍ}«š¯æMúNϨ¾z· ןû¯Þ7¾J‘Ɖ4NÔ‹sÅck XÅÞxà ”h äRf¬Áa kp˜Æa‡ã\óD~fÍ `/‹:gÏt£‰Gý§L…¢ö­¾ˆ-&öOÇÜ×5\i¿«<‡ïãB–wW“*ßBV˜ÆZÒ"õ?45ñÆŽïzhVò½f[Ïuœx°1Pq ?òªâ/üU0äThT+ïÐuG¶ú»`ÌQHÀËÆ´Ÿçð̵˜yIÜUçñû¥»š?è3ü™dIP‚üL㡆L[ªtø-¢Ìxnj•Ï}‘ãòqŽë̈oo󆃄8Axöï—ùj¶¿º5•= Àn¼Úa´J}< ˜«ŒG%gÛ¶ÊäîîŸû÷KÕu?~P e¬”uØXû¬Ç`±_N| ®Ú|Ö]ýDÒ­þB7ZK¶»Íàaßò¤J•,Øl–q@2¾N«ÞB?Óg^úÊí±Lm¾Ü«Oåñã»÷Ïïß(@äsÛ¿×°’%#‰'6¯dÍN€Ûí.ïZÀ_ÞV¿Éÿ<Æ+ endstream endobj 2399 0 obj << /Length 2460 /Filter /FlateDecode >> stream xÚ­]ã¶ñý~…e`­ˆú´.¸‡»^Ò¤Èå®Í¢(p ­Ä]³'K )ífûë;Ã!eYíµ¯X,DŽf†3Ãá|Pf«þØ*VYùy¼]•ûW†Ê‡ þñ×WÌàmq3Á|wûê›ï“dÅ?r¶º½Ÿ²º­VŸ½¿ìŠ®çr½‰¢ÈÛ¾^oâ8ñÞŠdß®7áÖ«†š+eË<–„ëßnÿöê»Ûqá$ OKøûAƈ¥« K˜ˆüÍû$_½o_ýý€ƒüÎ(‚ÞÆ«$ ü,LI›Ûä|S‰=o”h›¢}ÂÈ{\ƒ\‚ÌkæµÂ±×ÞÂ]!ZIÏBÊvfÞ“—EcPµA8M*Y 맆Ø=‰~gØ4îÐï @ Ñ¡-=^Š_£``OP0*¸a¤à†E>˜‹üò‘5>{7K<>Ã2‘÷®.š/—SñѼ+dt!eì}×TNºM˜l½_ƒ$@Cã˜ÿ>ˆÇu’zEÍ´x_?;X¶[àÉNi;]gƒ·à O—Ó~ÕÅ”Áñnƒ!O°ØDq0š2ŠÙÜ”[·)‘ò”p'ŒÅ‘^hÎ(­9Ë+,ŠäÚåË-E6ˆ;š–,{ÖBq€*¯4RÌRÚÿ3ªjÄ¢©ÎËಶ¿Þ¤q¼ø€ú‚…6˜eÉ»žÆަV1×v½¥Ž2 |öÆNÊ!" ¡Á%G"ÌJü—¿ np{½]mRI%ä›h3§"¸î÷î…4ën[¦6ÌnÅï‹¡îiá°ë:DÃX¨% ŠWß—(AHʸ% #I™ÅF(zꤑQÒ€iG EšgSa†*1K 0¨‰4k }äÛZ¡½ƒ¥Ñ r‚Ð{üI4„‚ór³¤9îÑY_<¡ÎãÅN°M1-VkÚ+sEÐÖY-—{jBp´ÒX#3m3â‡/>µ*.®ñÑë%¾½‘Ž M%°ŽtËøèâƒt]{`ÆOðé^ìoÆm¾_oÁÔ !¨|·áb÷ƒ`S )šéÊ õD¢ÂÍB–V[{ˆLéH8¯l¢­ŸmóU¸M@Ðì\ec°7ô¥ÊfÆT«ØðBþþi»ŽdÈS?HÙKe0Øçd˜1=S]Ý̅ʃU˜…~\Ïß„O0D™°¢ƒÖ6Îóã|I%þ–m_¸®Å>³øœéY;йi̡dž^cbÀîÄ /±/zÝ´:¤(ºèÛh°žm'15Ö¸iš¼ÐûŒ!æLi+†»?uQùI¿tuƒ}nõÓ—ûaºõÓè8Lÿ$öBwPa’€9;j…[Ùäž®»6ðüØÙ6éa›Žh‚=È¢Û‰R%î9¶P BÇÆ_-„%7mÙ©âr¹_,Æ?µªÿ¥„¬×»/={èë,|ê´C×΢.î0["˜¾…àH;(Þ÷®·û¹GÒ¾ Ü=l@`W¦ìk¯q5¨mìˆnaäƒk6 ‡dÆõåjñ.¥«‹/Ý"Ø?5Èû¢ä ϰSC‰}G/ EÏ~×ꦆzwáY ¥ÎÏ0¼CŠg‹iñ Yì9¥ãÜÖvZ@0E‘Bwíf 'OíQ‹e×q—0ù쇗_ièýb,wy¹ÑskõDоí[›žbÓ‰žWµµ¨áyM–'æO¢®idûá@×C™þ“Nâg={•Š>€È£÷kqOPÇÝ·ÙHõÎPÚ¨Z”\¹ËôLЧpPÓRL¼_×Pörw¹ñcCè:£ð"˜»?5Ü©Î}ʪ↹u+=‘|ߎoM@}« O{ô˜êHE3aŸXõØ/ÚÌ4%™þ²Añò(ΪwXk«0s«©‡°=ƒzjò]8–±ZÖ¢ë` }§yo Š=¶š Æц0]gIÕ­þÐh¾ ›{/f*iFU/Þ_ËWu¹òÌ}NœÕ<ôÀ MÌÆÅræÝËvïp´<œ•í Ÿ| ¾u‘³3²ì sTq2ž"œ<šjƒÀ³ ‘—ÛøÒ~Ô r“mn*ª²·Lo< u_Ï¢!Ù–UCš–!ö£„B°T²eÞ[³^!å¨údÍIT‡™‰r8ÜO±áP6‡F &ã/nŒÚöD™D7 ¬ö$R úÚå]‹ lQU/o_‘ÿçßcEmjÂü$NfáO¶X“資èŸFŽã wã¥~ŠW«GQa U£9¡9˜&#bQ´FuSª‹*kÿÃ'5¶èx½O'fÈî¶  ,bäî*ñ“»ÔÖ…„jV‚•¢ŒJÙM^,¥ *k‡‡ÝQ«k¿©8SÌGwr¡ŠêpßïfRÊV)ô’áæÑùM@ó´Y[ÿÖÇCÝ‹®~»jÑ_(Œj~o^MyŒ¯{Y4 Š®½­ãÿ„­QN endstream endobj 2402 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./planes.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2403 0 R /BBox [0 0 170.08 203.99] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2404 0 R >>>> /Length 365 /Filter /FlateDecode >> stream xœÝTËN1 ¼û+üÆÎÃI¾‰[áÀ Ñ e‘ü>J»›” -Tb‘@=l3òÌÄÎÈ#2 rùM߇FˆžÉ&bUH-ÀõF ‘¬(æZÙ#­~÷ø\X¥°Wû–ÂTŸ¸³š`¹îË yÔÈEqÑɤŠäŠˆõ‰¤\§0>žZõ#\Ýܾ‚Ç7¼Á'`¼þa›ÜÁF”¢CqNÉ : 1IErE|²äM™€3–’óGÈR§Îœën!¨'åBRböMˆ-wtÎR*œd=ÉAeBb sð>r'sfd«9ÎÓ[#¥_i¶ö)í5O¹ü‡ôòÜÃ<ë„Ôï &İ ä> stream xÚVM“›8½ûWp”·Œ" Ílù’ïä’Ý”ÙÉA˜DÌÄûë·…dlcÏG¹l¤ÖÓëÖë¦eêøP/&Þ2pÌW^RÍÈ`Õ™gß?ͨÃùôOo7³7ÃУÇ$¦ÞfwJµI½[ô.M'õÜ‚­næ>ç!z+Zi-•šûl…Ò¾”-Œ–„. ƒùÏÍ×Ù‡Íè8dì•äeˆÑ$ÄhÅ1 ¸ ±Ó¢nwJWsاw$$.šRÚ…~qmWlßÖßæ¥‡œ{> 0 ­³F«{™t…ª-ø¯uÒk-ëî¸~韆`ª­Ç8ò|Æp¼tò~–¼ò€£¢µOQÛ§ü-ª!$2w¹è¬¹ÍÕth7s[íc[ÔB)sÐÝ6pCY‰9[¢½l‡,:`ßÊÔŽ:eŸ©gnŒ8>ˆâP— ƒå§E„ÕsŠZ3(` jQšÊáèÁ @0åj+Ӣɋ¤µ« &è¢QkQ;»ØåZºúSºËUv` PQZ(ØÖl¬3ÇVŠZ¶7.'gÅDÎóÑÿIS7QR-ȘHƒ:©¢jÀ¯Íÿ¶mF‹p@˜ÅhiBÊnÍpxæyXÓ«$¥µVÛ²øÕËs´¿]XÂýz8²9‰ù²~AìqfJìádê÷ ßÍ/O|É]®µêD7Çdñ¯ÙóÇ™éŸÁ´‰(;'úñ2ÑéiwPØ·?-“·WÝ튲„ê}4„ 7}››Ù~8¿“öhØË²TOeþiºrJg e‘å]¦åþIeŸ¦Ì¦”Öl²>£;•E¤éÈ4‚L+þ5öXÆ üá%#‘Ø4Ù7_ªˆxïÕìoÛoW̃·;àsý–RŠùÊUå ¼ÙW‰~ ¼õÈ!µ½¿Öü̱cL™{Ñ6¹mxñéb 2`zÓ£¨Ú- 툔¨ºítŸtÖÜöz8®]ÜiU9{qh À.ŒÐ½ÝÊá‚ÞÏ£ ·ªj¨ÀÔÙjç:—×’76iÓ{ëôî£!#ocF‚®¿Ø?¢¯Ü€Ê!” d“Ð)§Þc€ÆËWzw༟SÞ±h÷ײ~;(#êtã ó¿.®øù¸&”î¿A‘Hȧj.òàÁë"8€Ÿ`Bù¼2"ú¬üwÁ endstream endobj 2415 0 obj << /Length 1608 /Filter /FlateDecode >> stream xÚ½]Û6ìý~EÐ'gH\Ûi‘‡ÞÐn-Öuò°ëu¾XI´:–'Û½ä†ý÷‘¢ü‘ؾ¦[;‘HŠ")~ÚžXðgOÖ$t]sáE“õþÊRP¹Ðâ×®lM7Ây‡òzuõô•ïOlË\X {²ÚtY­’É­ñý.ÎK&§s×uèÙtîy¾qŒ {1;‘‘T)+`Zvhؾ7ý}õæê媹Øwœ %DÊžˆ‘3±=ÓõG‹Dži»‰™®>}e[^—ðvîޱ•q¾s‰àTW0†½0mG«ºÚqÔÁºZ€ïó”íY6h©‰Êdlžp\dqJàOHÇlCNm£À`iéø Clêãš÷¦ÊÖå Ï´´AWÚ[E­´1ãâ8¤Ð­aÂÙ c5\CÿDÆ(Ò=P*»¦í“Ʊ¾(pO/—= ^(ψh($IÕ¯²ÅT!ƒ3ÂUµ¯(‘DŠªä nƆôD3 m’ñ“àÉÜÂ7x¯ûÁò­œ¯ËJ2Ãf¹®¤dY©á3Büß±T/—Ožh( _¯–7ïß3)fÊ8Ad†Nxb!ÉbÍâ°çÙrγ ÏxyÔÌºèø°<Ãæà0´hdÙìä´’%_,\"VëåÏb¥`µÔRŠû»Xº-ÐdlÝ>–[žiZÚñ[‚jŽwBhÑã;ñ‰-7qZœq#f¹0òPEþK£Lƒ€7±Ÿù˼1)¾(ñ{¡"¶¢Bg´3d=†]>ò£z²AoDq–ŒŸ}ˆÁÏ9îkÅçNÅ<%@Ái—‚~U…FýˆAŠãHÄ8V+cÿÈ8v.Uiˆ¸–RG𒍉4sÈ V;&uäQ¸‚©ÒB$¦m|Ân„NóuÆàÙVS§)‘4qîªèyöXüž‡/êrYôªXtÌÅbqªQ' )®Û¨î Žã¨‡Õ÷ó6 Ø¡dY2u¸Jž§ZL ¨U›V Ÿç95Ç{‹Q6#™æKRÇå™ã¿%„ú][Yí´Kå’%ìƒe{Ÿö7ˆ_UMÏJm킺´ ¿sŠàÚÙ%û¼{¶ÕàæýË?+xq|6­÷ýƒ†t_.Nù6[¾ëeÖ®#5&9»V„ßE8ü¯"Ü\&Âñ«‰Ð,Èxÿ7±ð·d~óõ˜Ÿó¾U–”JmúcΖעÜiÖ'§‹ù×â 5ÌÖL®çY†ÈK ËÁ:ŒêÚá:‡è<–ñž©9·XsÕïŽúЦMP;U´=ÏVE;44 í–4Ô9á×|slXÒ"a›¸JKÚÔF¯?F~0Ò@O†Åÿ#í ŠP¦Ii¯”ëL6¶áÁ"P6‰é'± rU”ñzÍò²Ð¢PW‰à˜7†€9±÷\4VòïèŽ Hv¿Cµ"õˆ© 4ëuì ‘©…‹Œ†ÕÜ[>üÞÆlä >oãÃØÀƒÆrü>ô÷Ñ™(„¡u¥ McÚ«7;uP³5O­¬ú%RýR%5?å¢(ø]ÊË|VIJEn„~дZ„÷Â’m]ÒŠ¨Ò¤KÈN;¶Œ:A˜ž×/²NŽ­‘öð=wÐmF é­BÖsʽµ±ñ:S¿ð\h¼«ÊG*æÌ!Üü8²á¼1b›j MfAÏ—.åHr\4õ˜Â¹¤Ö¨ ¬j¶QŽæ z4G^çdÓ퀞CNw"BeÔsÂ6]hax„¼¬P-×€7:Ôó|\’_R:vMJʸÒó…7®²«â¸®tAfðÕhì[õ€£Nÿ#M@aDübÝpCÐüïUMD F¶BÒÏ®n9SüHq¨&´hc¶-´Û°ÝpuÏÁ¤êÖºŒ´mxêFVmiQŸO"LÁxIß#õ›Yî„ú(¼u …Á ÝŠ_0£ñ}l¨ ¯eM3â¦ké« þ€­eÍËí‡Jy@4{½Í„d/Šd99ÑåÛ›–]¥•7 fnÿ¼ÓûFsÚ¶ª+iù—d0[êe-”99ÿޤú{ öwzÝ˸ÊUG¹Úçl.c[üšúÏïâ endstream endobj 2417 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./helix.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2418 0 R /BBox [0 0 219.54 199.21] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2419 0 R >>>> /Length 8672 /Filter /FlateDecode >> stream xœí|IÎ$=’Ý>NÁ ˆ¢‘´' ºðU…F梻º¾ðžÑ=<Ü# ¯´‹/Aç`¤ ´éßK«Rþí¿?¿_ÿý_¼üý?_Zþ÷KÊÿ|Iù·Wþö/ÿã%­ÚG‘°êfå÷»et¯Ö˯׿~í5W]ZdE›½Ô¼6•K/õ¨s®^kzã:ÖÒ¨>>Ç:Vq™qŒUÛ纆[]9a·ª«ŒèÕÚç„®^e饗[¯±äsB^g\z‰ÌQ%Ø«K_Õ´L“ªDÄÑ"ÖzýO½Zôºf™Úªøg¯˜RCû¥WŒV§úG/é½W™—^Ò¥UŸŸ½ö*.½tIm㣗©Táê›ÕQlZmò¹,i£¿{Ÿ£È”^{\úÌfU7¢´×¾FQu-¢`·ˆË¬¡êµVÑÐ:ö±=–ÎÚCveZÍí£‡Œ1«cȘZ×­Çžy÷ðnµ®ÃmVޮզ·UcÜÆ‘97’w/œkÿì¥}V—k/ŹîëFü¿¿Äµ®)E§î©ÏÕÚpÿ\ë˜QÔfu¡ÄY´U~^bVejÑì ^ÂêPL+Õ–œðÏ ëwïÃj÷¢Ñk„Rz¯+пGÕ6‹š’Œ¥{bE5j›ã ï=à‹Ý2FUöˆ\bŸ5úY׉=ŠÕ1ñÁð*2Š6¯Ýz‘¹7ÝfX“&)0v-u©¿{˜×Õ­¨´jM‰§Þ#Î%ü±Þ¼h·:—•Ñ#ª¬UîGñóúÇë=¯UwÏôê#Ϋ.ÇÊ£®­ùžEê2¢{X®¤¯*]Ê óð´ª>¯_¨Õá—/LkXÔÑ„'láH[£¶ñgu1¸Šsþy‰Zm+Þ=lä½ É9L÷­®yܳ°Á‹üœ°ÎjØÇ¿÷q´Œ¨ª—}Çb U) Ö¶rŠÁ›ØV^}ÕO\ßNãçõ7Þƒa£,0s²£w‹VuLó†-¢ˆO쀸}cæm¼®‹Üy¦1ú ç}Í–É9~ñ4Þ-8lî„uTé«,õsÖl‰¥uŽq¶H•)à!Õ½D¬ê ¶×®ó„±Œà$G˯K‹ÕNa*SrÛ{ÄÆvžó'eå4»‡÷êýòŦ“cŠŸ×»å\næˆk‹ÉeofŸÊ¹×NlüʼÀ}Ô¼‡g‹xuÊÎ:ýÆ]?àë»ÇL…E†,âü„û&’?íƒÒ‚k*Ž}ôë=GOû·Qµ¿ÿ/ü&jdO%—“1:!®zäŠ{Ŭ¼ ‚âVžýþÝŒ_3m¾ÁùGƒ@0B¹Êé[v! }ÙÞäÈn -¿®-†mäõä^/-Wš·|Nò{±ÕªMJNZ` psì0>>áXu5¼[‚ç>{ÜÅÏjýý;°ÓÈ}ŽÐl«=ôýíƒ2_yØ¢rÒ³A{Å5U£0›QÁHµQµ8`,SÉzÏC©9”ÔÞOeDLW•}æÐýÄ4p†c%½š5Îø†'@|p¶D….2loœ€Ç¿7™0¾Hœ¶2#f+)è„gµ‹¶#¦ƒ$7+†Ö–”y)6 ºš‘ÙÁz^`ï½ê>7q¶´ ;µž÷ g·˜¤‰EfŠ)FlIërá \Ç[2A\ý<Ø XΔÚô'â¸_¿¯-Q›—Ùj§"ƒ€›á ™¼±²Å¼S®qŽ9¢S"b)Ǫ¶hÎaºaÌq[>®£-þ~¶t)ÁAðh]†'᪢PT;FÁý„ÄF¶å;ßãh¡KCýl+*EÒª†[-M äÏÔýE”û’°ÌV¤C•ü¿ã4ð`‘#eË»aB!Ž÷“&죀] HðÄCëÞCLàgPK9dtÀs‚QÂa¸ŸÃ`zÙ²c.’_ )·5Q¯_çeé5¨êQf‹8äå ÊÀóngt?Âç!K¯M—­Š¿sÔ¬dÊQ­ +…Ð B”EV}v¬°‘¹Ý6€MâyÑ e.à¾Wa§†Çʼ B@s¼<wGìõc“Tsãï^'LcÒœ¬²J*nÞòt;>Àö›Q½×ÕúÈ%Z/·=p[V; i"mÀ~¿ú¬]ˆ`ÕÏD(ò‰›ö>PûÀ|oÕ’µ4ÛãÛ¤%¦)4Ø^Ú„;&èŠÇÊÌ/ÐC«[žvÀŒußï Ö˜NTÐNçFuî«Y2óUG{Ððö@Î{wì>Ð/Uµq†EÞ´ª.ÈHôèDUaÆ$œÚ¸mTá 0ùºÙ9Õ—Û&ȤŽD(¬°4‰]нÀ`C¶ƒê_Ðó@àÁÏ# g ›Í*£ÕÆ­ö(CNT¨.?X§÷ðXztÁåÅjå¾Z;¸“Eõä±b&~ ïÕ ”Âï8º~¼!øyƒO’”A“¯š„ÔX³„óÑ.µ½O”œh%EZšE>7ðý¼¾`⎩'.¬‚ì,Êè{<ÂÜi ý{…99gÁˆþ>ßþqßÛ}ïOì´}6vßÂÛ¡<^„;L³Fá,›³c/ ›Ó%èŸ_´›æq×L¾è.¶—ŽVƨ¡k&>–~Áσw ßO@÷=ÍM,¡¦ÉDûúª}hw=à®(ppÇÑ ‡çˆÒð8‚(h[õ*Ò‚2â<%A Ç»­·ºÑNÙò¹‡­~ »oí¹/8B`˜9x¯ª_psÇÞ»OüœfyŽEqÖÚÈs‘_vñ±Ë'þÓZÀm3ª/\¥£EVÐïF÷Ñ—^£—€]nÅGé}A­ß]¤ãmvëbmÕtŲ‹.<?»ìÉ.Ëãpž]ÚxÑE•ÊQƒò9?{MIìÚkÊHKØ¥—ãêɵ—¯ôÝ¡÷ÍiýÅíw´˜Á¨Ä^Ö½:&ð×tÏ–iàtGï–î2½&žÄ|†ãÅ Lœ-ðÂj΢´Mö =÷÷ }üéß¼ÌߎæhÁ›mãÝuÒ^äËrMï–9îžá‹ÿøhѹN§¥šN$`RâXgKêN쵦ÐÞak%Fß-01?¸~ïAÿÜlÝ?ÎoD«xƒ¾ÏoŽAÇàŸ²¥X2ÇÇùM‡èˆËùi4õ¿Ï¯Ç “ë8¿‚']ÁøÙ|¬•Žý³ÁÒí ÛæŒÒ½ÓöiÓ«X”BcÔÏËàé½${ŒQ =À?G`÷ô£ðÏËÀ}Âß=¤×Ùzé«A]1è$˜!U?/k³Úp®[kƒ¾Ý¾-“'œ{À»a6úY1—8:mMF[Õ,½úy~^y;­tØâ¦ë¹k¡? [€×pƒ?/´w?ÏI ØÜ7À‘v<ô&§ÿy‰1K‡Þ嫜8žJat;8sßSNòqUð­ &Vo2ØþÎqÆ·ÊE £Cü„9v`¾SÏKŸÆ {§]Ñ\`–îéªÀð²á‚ùÆZ§ïW«87±a ®ó&`vãmŠœ&QN4àæí5u§)ø­Ó_uÂï]-3Ð'<ÒŸ‹)lcJi|Æ"xý°|3þÓŸ'‘O‡†·u Ït“¨§`Ü„X~é¤6­FÆÛìË ¬zõkÁÓßË‚ëêQóàÏk7ĪM,gAt³a-¾/0´ZÇ9ãÑÐW :Ïúž…_àÖá|kVVÀ–ÑO8×€9Ž–_免Ø9J;6¶ÁsÀäf¸4þIäÙ¥ƒ,ÚIN¸ƒžSàƒÝr.Cšà}´4š‚–ãDŽÍžpbãçq¨°4›(c³ 4Ù„ŒGKÈ@ W¤Ã…± K ƒçGKcˆ$pòp…ÌÀ‹ó:ð;áQW_þþ.ƒdg zãö¾"\G\q8f ±ee œˆ63`B:ÍØ) @6GKTŸIX£KÎ"ÙtIÇI†ò‚«¼`¤eO/çÀ3td< Mø€F¸ ú¦u.i´¤Óë&¸1h­ï4%\[„èî’˜$±›|pOaCÆHŸzÊuA¥à²&¹½*}q¤ü‚v.´ôÁ/áÑó¤î«úùÃEù<¶Û™>}·Xݽbòh⌭—tâæ¼f«Ê0?wuÿ ´Ðá ZÄÏ®@½~½VÔ2ÓÛi6ÄÚL%‹>±?±tÇÊow¼>1ŸÄ•1CëÄ=esQ*SEÅMâDîàÌ@ ÀñÄØö} ¹­ …p8®–s[‹bÙG•¶e+ü“ŽÀ“/Èy`ï†Û'ò³Å½†jr h2Þë„sç\Ó~…ý¼WI5k– ¼>¾Ø»ÈY¾m·ëò÷¥Ek‡jÕgÅü úŠŸo¼cøqƨTN¡Ðd9èû}ƒùÜÆ h*òëÛ‡ÓÂøŸ{È}ir ø|lo‹¬¦[]Ô;öG=cÍžƒ<§¹/ã¾Ì†î“¿3ºªÓútb¡[,ñ;ãô0‘jÂ5³ÿÇêJ @'Ÿø}iYä0·Ó¿Ÿ?ÇxÌq_Â}²=4 KJžÃcƒWÓ†Åï`JÛÇ(\º Þ }Z’¯{8kAy€YÂò‘Ó+Ì¿kÀ­Õϯւ‚6¿Œò˜ç¾Ž/+Í–ã$ç€z`t`U0ÆÚ–lÀ"äEvˆ >«û.¸³Ñ)—Ö†±~¿ )‚?­^BRI ³¬húe”/ÓÜWq[&­/`üƒo«F­?ÒÜS°$„¹áé•\-˜ z#˜*`Óä;Öï›È1K³1øÜa& As‘Oº Ó(ôäÛ4÷e<J}^ÿù…WLðàmSà‡5ÒÅEAKõm¹1c°f(5”ßMé×릥üº#ã×}__ÇE$Ðı¥R8(€ x+{.ý¾µÇÞñ$Kñ„cð„@` xÃç‚’ƒÊ½[õ4€+âŒ`@5‘¶ ¡³œÂá.Rþ(tîBé"¶2ìÐŒÏ1¬ ÙGu°€Ç:5 Ñ9:7&ÌÇ€”7í¶‹ï§úÀÆ[t u–˜é,YE*ñ\õcÒDzË~àÿiö¼§ZüÉ8š- ñ3M> c¦š £A7Xá?Ï÷P™4w\íb®jú¶‹9_Vÿ°‹!jÿ¶‹)Þ{¾þ`‰ûjÛü¯Ùë¦Ñx±×!wã–DóÏm›l6&1À¾ƒ^g b±öXº…«u &’½Îc\Úì›_’Cþš}s[OèÛš ûñ¶<ÿ5;0/ä4)gC¬‰˜ ôÁÖö{§Z~_Z9O¸3_-›ÿ¥›5ðâ¶ëͰQfÝ<ÎkÀ¦a~9A˜äñºž`W¥pyŸ ¬“ë°ÞB‡Cl” 3ˆ”s?[:bùVÿë6[½[2¡â= ï9|Û8;c&ÖÙò -V›½¿AÜÅuÌ>g=[öºÎNxÏÑ·ñë¾×_¯¼ºD«•êŒÆþýn˜5&ÏÄû¸ ø€œ0E4Ž–áB«#4‰kæÔ :Âò»Ÿ0¾8Z§øõêÏmýléˆ*]ëÃȈ/ì=k¶Àøë9ÆÑÒËI¸Ã‚´ôu†íŸà^ÍÙòëÒ’Š$&9ˆîÍÁÈ|¶xÀ?‰=[—0°ÙÖ:âœ_-ïe@#ül=Ý.{ÉC9·ºÁÄÅÏýPˆ­«1´ì,Œ»¥7ãë0‘­iBö°§üDl&D Œ¥s÷ðNïûp LRôd0'£èߘHÀø¾B‚ œ¤4Ãe&É`·°¶2$GgGÜgo+ L>¶Á/²1~G#' `k^ó¹ÍU0¯-£¨uGëæë»€/sÃøÀ3eáì¡ÿ¶Ÿ&H?CØ0B D2<¿el2ôYNì#¦Ý¼ÜO#´ŽyÏVrÈŒ«Ý-‚ü$ÂCÏÇÖÒ#€ÌãØVi—{ÃǼ^NýýEGpÔxAÏAðÈ":à ™{ Eìx²±'OáÇcœØ;`b¯A7x÷ ƒî–œÖPÌÐiæ=K%vN¸)ùý_w±[’Ó/=@3rļ ÇÆr‡¾M\æíGPÎן§ñÿ ûÿöIÐù€0 RŒÌç›5£‚ÀÚ*z¯mxb ‘,`·À¦NÞÇôÄÂlÞØìu@mªcgâi ÷d"ˆ\e½muÒÖ~À#cù² ¹(㈠€»Â}:ìˆ8—[êïw H^øi`‡0^l~j “Êr\8ô2ŒŽä96ÏLØä¸wüèU²¿€ÄGú“i&S†ðòjd:Ÿ«Ú+…û°ô*Ilª­Ì ;_jAxBgúXÂź9[VØÜȪ#cWnÔÓd–&†ŸDEãªa)J´\1·7¬¤´qˆ«Áãy¨“Ì‘õÞË}¹±`Ь”¶ß2gK†+áàŒÎ¸ ü¾¤í“O&l;0ü½ÛÀ%xˆA¶+c/”t0#™E&ŒV¾­êçOdp¿bŸ7ðyEw‹RÜ¡;ê*øÉÅpÈ|özZ ¶{ì‚e>LCÌ×;ý9ÊïÜl G–ù™´·AÝòùÁiKÚâcr„Œö"Œ4ñªÁìÝ`„¹je˜Õ!pØ·1&ä >8Oìc™_6rßè $D——™éL¿“Ž ÒÇ‘=èfT^¯'}¡´;%>ié߈ÇW†Ý‚ŒS`6Cú¢™)qЙa•-©F!RÄÍÇ.rcc´™å„ÅÐ Ó‚+x™#u´è€cËQ´¬L[>ÔÖ‹B!¥2gð;¦!o• iè[—BÆ9¸íhíË*ŸÛxlóßYÖƒÜùÅ“£°¥3ä|äÐ ¡Ïµ}Ä£4J³‰©Ôu˜2“ç@">Ùõ<ès”ß¹öµÊk ;Í/}dCÆ1sÇQ@Ј¸<´G¸wŽ`YÂXmØŽÒwÊÊF+ÞXðFPpNX¯ñÅŠ9¿¬öË~îû½aûCÜ£¥N’%àù‡€ªÍ0“Ý1j~a_ä>Y,%>‚„róÎtÚà@°”Zqð„-p˜*†¸}R#Ñ€[`ß¶±·ÖÓÔ‘VWlÍ» Ý#iÜøÇ©>?¹×ƒ¿Ýøß'ƒÄ#ý-Ÿˆ÷RÌ(ÉP]€«iDï±3¬Iw`8w¶ÊD Û#\vqÚe>€¶±¹6‹Ü€¤7}’øƒ ÜxÄ“‰0ÛðÍX€La«\žÕá€á|¼Àͽ{,<pEŸˆwLüm/‹ÙÑ2~•ïbæKø¦,ò‚4vÆÝ~#›/„u#¼m‚áÑ–s,˜ÿìdE–é³Âx¼=¼‘Æ¡…¿ºf>ÚmçÖÞƒðÄõb*œ%p$(3³òÜo7úë¿ÓÄj,@‰vҲшŠhÜ”i #´#}¡‚BÌã=NɶYøàí7\üÌîWøyÅoDp¿Ëó¼^ÙÒw¸Z×Ö~½`## ðÉRö[\§Mé _dvÖWB{^È/g}¿ ·ËrÇàÃÏ3ÈÛé),®Åô¸|¨áTüõxâ ÄQŽÊ»Â9•Æ­Ë|½£ü~ä¯×‰¿ùõç×wŸÍ-¨÷¯ûlÒ¸tò±ÞÆ~Tmš­ÿÅ€ám×÷htØŸ†þ@ÕŽ?Ìúpm&O=[P`¥«¦ÔO‹%ïmg©6)w‹îôZÖ¼Ñâ&8 d˜Ûή˜Ô@n XhˆWðÙ"0±F€É.#ÒánÜ^–©,"ÐwÎzðÎø´]Ùa@³GÈ7Š!‹®|šÀzå£fTß)êüb.èºpšh%ìbhÈÜG|UÍ™)èç“%X@‘לQ0°Î,õ·<.=s/Äܑò, ÔqÔ_1–yCy.!€ ÊÙ°i¢¿Ó(*º&˫‰:Räæ6ã^qoqÑ÷#£Çùãè»JÀÄÞ!|qHl«¡6Xà[iÄùDr I3˜¤#ÓÒOd©‘¡ÄÛ œ6-„¡Ó$Åþ8„)– ‚dfbµ0#S€eĨ-g˜,#°àƒ¯ ¿ƒ_gXSgþµŒ12'SÂѳ0 ¯ÀšéÛk’X…ƒÂ²Öˆï¢XZ3”Oè8CÔ8sK£4g()d%¸n ½t°M.úT¥-!! µ‰¡ÌÒtÇø…:cÒj-Œ²h¶e€†_s¤é•½¬uçbñb†ÏJµ Ó±&Y°êî´v+Ñ‚¡¡ÌÍš.çÞ¦™´ä¨X&+‚w³³ ¸Š­ÁàC‘.ù™g¡'p´ÎÈVò¥Á-ƒ$™ü=‘Œ·ß¤;›án8F”™Cj ò”™õó‚uœµÒà ‚ê‰Z5`qLE%Ur$", ›ìȆnYJäQ‚§@Ÿ«©´[eqÀ΋=ÙCY¢‚‘]³òéŠ ã˜6SNQDn ‘‚à;웩`Itµ£Š ’.0¦íeX«ñ0Xµk$¦=C—2\„÷’AX3‹¯¡¤‘eÌ>”{b|ï®U&cf´Bì¶¡T5P3„ïj\|@^#.Û@‘KÛñŸÓrqÜcƘ:åùÏ+aÅZLN³øRÖ¥ &çÇ2F÷SŠPáZOfX2l¯0˃¬1œa3­ÖŒ\G†t›¼þ2VjäÍ™4N8“3-EY¬Ìƒ”Ma g\‚älÁlré8ܼó k[Y.Èi’ÑvMï©Q%™ƒ“ê‰~5ÀÖdÛCi±–©°}ñ³|Ë͈ºŠZÏ’Pp4ó• YJ¼n;H8ÇŒVLÇËírmòÌË´å!Š ‘ ã´¼µÌÞÓ¬¼DÉœ·7+,‚ªYÖ <œÚ"9;‚磬¶7ÙKŠ–‹” 4Ì2 (‡Fñ†`3pfÝ·BbNž!‡‘⢕d0Ši%›aV‰„0™‘N$Ô„òL¦„b@ˆdKÝ élé™7ˆ‡ü Ëž0Kð4¦*å’¿x#0àëc¡Î<ée¡NÖ P—5våE$Á!Žeɨ£%ËÝÖFOéÁô6f!M&YÅ+5Ï6ë~;[°òl(S²JÕÒY§Ú kú@PoC¡5Ê‹`ÎáAot/‰ÖÎñ³Œ“fq÷Lë‘éÌè¢ú8(!"ŠãÕÞv…¢€šà´Õ±ªR¾ùb"óaýRGY:hÅá›`ɸIåÎB™¨4;­ `QOŸ6<úˆ•B¢#käÊËZyÏaÐ˰ŕ,‚©ãGy…"h³§«4öÒXÇSұ˟³¾ H2„a*Òœõ—Ø#4kãˆäÃR$6rJNÞ4餿œ©ÞFm¸!M_S,²Ðä‚Ï?K² (ÜpË2&=üôŽ÷,¸æéØ–×¾1Ê w– ä‹ÅSÓY2áEs6|‚É"“GI#›zYÃ9èÔ…»~Çy@ 2) É‚Á2ƒÔ§h'ã,+«íŒJî»Jø"ŠwÚÇ ,ã[æ¢YFÊà[ÚÀoð‚¢·Õƒˆ ’¼¤xxtDóTêBp7Н=B äŠ÷¤'Š£T8!î$$saëK )ÉF#>‘–S05Pe$´:¨à‘" WnÌÙ"»÷åˆ\™~ e'àcfÆ.Ÿ|#ã‰LY‚·Â¢+Ó5%xG -Ý-·°õg;Š&/ÆèÌ M Îz½G å ûA"o;„È”2‘¯?=ƒ,¥àJ¤Çr„e²Öž‡ Š^¦f؃€°Q[ ´û} -%³·[2I³gº’à­0z™xèn2aí[¹Ëé,t Ý“>î‰"€ú^æ¦ÊlÔk¡20J! Ÿáp¬§2®QL©:!·D…J•²4ö˜¶3儵¾QVtfue¼l¦ ÝÆR‰B…¼ øjD#î-w =Zî¢u¾l3@é ’pfp/å“wä›´#…w#Ò«‚Ò¦µFëÉ)ÓÎÛbéÀPû7Ðx ›ñЈ'„9 ¢,1Šxß"ÿƒ1¶(÷¶(h!ób“ ‡sE6¦wÚï5Yÿ‡V´¿g4 ©ÚoåFßV²ýÌVß&¯4‰Àîý•2<¬5+ž†(µd‰=ì Ï I;\°ºÛmÎ3Téÿú:þñú××ÿzý}·Õo endstream endobj 2420 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./axis3.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2421 0 R /BBox [0 0 174.34 200.85] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2422 0 R >>>> /Length 4934 /Filter /FlateDecode >> stream xœí[KŽ-¹qç*r4ƒŒ¹žY^Â$A¨7°5Ðös‚dfU·iÞèÁë7˜d|d°þ÷®EîŠÿÖ¿Ÿ_×ü)î¿üý²û—ÜÿuÉý·+ûÓ^Q½Äì÷¬³¸µû×å1K¯vË +2î¯ë~ËG±Ñî)ZjÉÇ(!v‹K-=À¤£ô* ´Re}JŠÅ-"­ˆ€i´"˜O¤—ÙóSsí·´ÞËÈEAŠ•ÅäE\oéM § /Ý„Žo'“–>ú-}ÖF.-àš­Ô=_+SnQN&(£Ì¶˜¤¸ù-:½ôA.)6H‰¢º¸j1ï·XePÀ¨E›ƒ2KŒ¥«YlÞbáEù)Ÿ¥O% ¼dje¨Þ2ú€’ÁÕJë‹Ògrý°×¯Ëmà£$´TCÚûÿþrYõ2k»Å­‡j_”Ž™¿a·U-&þ\V…^Ào4¿uZñ¡·¸ZzëÀ‡äàÏõ¢´”N‡iEaŒù‚£¸ü'=½4˜í¡Ä€ã÷:S…vëúì‚X„–çç¯ÖôŒè›B¹Fjba«°ÇªnM‘ 2Jó×€&4Äšás=„\‚I”€/BýŽ-–ˆN%|~cϯ믗 -£i†]ƒ;?”Öà#À­ßâ]ÊðÛb¦·»VLó¹,¬ÔùYp¸%Çr ¯ÅBßNa½x‡C­Èv’*·i-`L!‚=JÐ2‚u/2áÍŠ¼qJ›RkqpD.Ò¦”i·©”)¡åµ2§§ú¼ÍRnCà ¥PCîºLœ áelŸ‰~Û¨¥Ñ^C±‚5Ë@žê]­ô7ÞBüõzÍÚË„uÌ‹#’`:Ê0ËäPý6õœbLøkJ•«˜^šÝïI–^â=À[/oþÞJ×Û4Š0~;’ÌÒ˜Ê5Ro–‘á&XÃaáÏe®eއ!d{Ôà¡{ ¦²ô°POD¬Ü9ÿÁ[ˆC¨H7´àÂ)´kê©7Žhé‚P$¼Þõ›ž¿Û¦q±"/õ(“Á¡D-Òn-û0`+ƒ;áçò:‹uË/T¹iÁªºm‘ÆÁŸëEiœ¯Ëæ,cÚ¡xÕ"ØžÆÎÂoB κ)­cûzS*¶!`ì×â2Ð^¥Ôªc£4&…¤|½)‘)£tŒ¤¨ó«½·‹”Ùüàõg9Or´VTå…­D3ÇçzQÖ:0†â‚Xé:aŽ‘–°¦:>¿1ì×õç«-´é–›p³¨¯íj,;ižÅs`KÇž‚`€cxq½µÂtĦQ‘¬æ”5Bf™­‚ZêÖ¦Eê¼[­ óŽbÜ<ÊÀ¾†âFå­Ìꂽ•ãùá´`íÄ(!ø}áΊ]Ë@hR¡Ü°\ ·Ò(bb=K¸?uPm­VîAPŠ N¹6­½x´RýVT }Ž"ùsʰ ±ÇvU©ÅÀ/lÊÏõ¢(,þØv*-7¬tÚ%1Fxé(®V6['†Þ8GwŽ@^ž)¦Àú5ñwŸþü>!6üªÜˆ Åí/hE™°YŠBØ.IÅn•ZBæ ËöbX¯•´ÖbèY!¾ð#rz\t6äMØF‘àÂ#hŒJ—²ÄV&’÷Äîˆê­£§º½µ»£Þ¡˜}CÃÖþ¹^EÄ.Û˜Âzu¹1Fø²àæð¢”Ü[qXº3G¹€“^$Ó&DgÙZÜ}Ä8]lRìÅ1¥HÊœ Eì›x~-è”ÓV¬[ÀëúŒe«\ávêG(?}lq´Zªæ˜%æ GÛ±~(ÛÇ“-¢CjÄjúCbÌ+7Gä)¸q›kŽô1ÑÅáÆ9j¬¬æ-½²•É,˜.S—‹$åqoéùV,åÒœƒ§-_sLÄãά³ÖÆË¥ÇŽØ¿gëÏõçß9–J4+>ï˜B[ýþá5jp×Q‹iEÆÄÞ1¬ó¤ù+)÷–ýdúñyNØ‘VE›æánj+2í£±hþE ê§á5/¿¥Y±Ö‹W.^u¢ôµÑ \|ïÅÜïQ î×C§ÃFoeF¿öÍw4‹îÑ3Â>VqÕü[¡ßC3"¢N(®¨8‚ÍCñÙYŽ íô œ]v¥¯~.çanÞ£9cƇ–©r™Ü¹^B`DRb*EõaXc cnÂ!ººßQ”…s<ª¤ðQz7 ©Þ`b FÚøs…LV<‡£Y1“;B¸E›¥¶;bp*ÅLŒàž½s2Óü4 ÆgÚàQ¾…í¢ŠÏ(6ÇQoÇVÂà3²ÄÂ"fåŽy`θà@€ê‹} vê‡jGrÅçQ} ÒùƒÕêàÉZÓRMî¡Æìåo ­õ­?­Ò›4‹€@µÁ)p¡ãô.eI÷ƒVc8ø±)ÒáÀWfø«„SKÐFTz`°·‹|ëø§DBJc\ƒ9!®FO%*6?¸Sž#î¥M:öÏ%âR”Î Ö²cÌLÀ¢Ž3çÆ <è>]PHÄà!M¤ þˆ¬;0 «S¬ûˆ4„#7n¬YÜ=s'Æ+ã¾Ã Þ“yüw)!•zæ!s V ñ‘ü¸/:¿{GeOFP‘=b2&©ÄéŒ$>G嫿}[Árf”Ê VÑ~ H7'v,¬ŸŸ·åÎT©gÊS$Ÿ7νý5›xÀõe@i ê;¨#Ž@)Bï[Z7áXÅbaêMP!>6èK¸à¸,Á¹ƒÑ·*ø+ÈÖ®ºñKŠMYÕ߯}]bF§Q\Ó óI[þŽÌwýÝi\¹"´œvÙhfQ,3•‚Ã-=[ 9ø“›%ƒys šô;ddíxpîZ±(-Ë|!ÒXØa̹0FL^ˆ¼8Ö*û’ë‘25œœœ)ÆÿÊ,QNMã~'¦ñ!¦Å6þdú[˜ªFÉðâÀdÑÖt2¡Z]…4rè*^ kf|°mn¢šÅñÆm];`>I¼Vö½"8èÎɰ¾dÌ0ÊÐ~ð’zÎG«”R¼t:°ðB©2a„°€Ä¶ÌäÒdÒ›æ¾Ì:S÷ÎG9?£P~¹êàù,))«L9¦dú×g‚…¹¤(£¿9´ „ëZ©cã6s§ÜXŽ;5ÅÚÙ.’åµómCîß±+‡ =zជX Xîm´ ¯K Ü£öƒƒ­X{q´HÀÌT¶ô-oá²J°ÍÖ_Ã{<’`ÅQ<<å›DsºÎŸ<¨À™QDàB.$Š :WÅÅ W,iaŒØå_  Ö§‹"ôÃù­²BÁ™tÏJŠ#­E~cS„Uq“Ûuæ5(Š9Ÿ¯u̇òõ¢8HÂÌøãj =ø“Úóùâ@[Â߸Ãé× ° Ï"úDa𦴙Ù¢Ð&/I¦*>?mšfÎkP4Šdh…E¾‰G›6½MÏ®•wú R]<èôI{'f¯Éó‚‹Íª l ŒIJ¶l&Øßpôƒ9§Æ‡]ÝàªÙ½ÚPK•åJIðÎN„¡be›÷zæ9åÃ!ð^|![W^úsDRD¡Jí©î¦šêç`¬á0´@ˆnÍ ²2:_]‹Ö¡ uœ ¡X_IÁ$C–mÇ£ÛFËFÔÁ½ÔeœMY}!”tPõðleÁ©â@ è»Ö‹¹Ë†-ów籄é–^å´ Š–×òM_‘³csTºÐ ã@•]ì—r¡ª‡#Jû-¬Šü$ÄjEc85©ÙòÛxú—4˜£LW ãºz| k¶Ó_#ºÑIá.Ô *MwBJK¸bsó¯^&*θϕ=Ê_—¢0ÃÞÀ"ïö~|¹¾„KÜ-rU`b§?xé„+Žìå£ÚÄñr®÷9(+¦ñ×…Š— :çsúÇ]âw‰Ü%þûw‰è¡àÿ‘§"¼%ЀŽì²`ë@÷²gŠ#:èÎæ{ppöáûd+™já#6¶›¦œ Ü‹ŽÈ&©Cø‰ž[Ça…ÏÆdÿ«ÒÁmÖÒlÜÝQç8¬=xIñ¹ÅFéàˆ<Èâù‡÷Î.Ž'xX#ì¹ Ç[l–m5ˆºwfÏ ×Egã÷$›Âæ#s7 Ívå Ö ÝÚêg!† —j5ûW©û^j÷O[ rμ=ßãe'ßU¥aÖ Ió²ER°‡z¹ã+Ä×´ãeÀø6`®IDºièWú0ìS³á˜o÷ð"„ªËä‡À ¶ £‡öüŠN1Ê«óëèÙå×­„å`ˆƒz98f1èíà-À¡xç³Éƒ-·(Ìd‡}*À£ B‹ðú>㻖ضQÿT>ÖÒŒMÁc3ø€¦bPÒâ8=Ãgþäæ9åőϘPûoÐ#ûºâÍD»µ;;ðXQˆðÛœkáÏ…Ùq_~8Îz•2ü\?eB¼Úwhìïi•Žx§²*– †²u–º!^3*ßó-‚ápÒÓøðÁ¸ áë§M‘ÊeƒÙ¡¢€¬ËÝ#2¤ÞPɃ…®„/¦æðT¶ûI0:“Àø+:ü¹Õ¶ÄÃW_ä˜%ZÜêù/¦ðÌèuŒ~ì:¾ás‹¡NÃ> V®uC¼@ÉVuðô‹o‰®Ì’/Xs}ðì1zRä×ïX?Ï!ã†Ùá°¡•Õñ¬ÇÔðbKl°'ÞäÒîÆÔ»1”œ½áÃ1Á†ƒ ¿À'}ƒs@Ùùð•îeô|•ŠÔ€çkPöÁxzA}(¸ª\yä{]zŽw³Ñ?wVÆÓYˆÕIÖÑèÕ ¦ØØöïX¤ìÁ°PW~—y ¤né׸N¡2co†F7NGq>#]!©Y*¬66ÙkÚÍŒ¹M‰+øñÌä3ðó»ð»xéˆa®k›9Ý®4i¡³µÆTüÚü¶-ÅêªÒµ³F e”/ÊÚÜ`9h{ …Â~ÄÁ{R?‡oé£#W¹RÊË;¾'/Ü:áf)Ü.‹#¡=”à!ãÁƒ×86¡ÖØøs » àÐ|2ÛJG}Õ´òÉC=ÿ÷¹êØ<¼ð±Í†8¾+ ÷ܺ¦YYÇÕ¯…Íð>“Ï×ðÜÎY´±=ºðçªk’Mùz(ì âΤ¯ ]ñýoŠ0Úb|™ø…)J©MÁ‰‰Ý–N/z¦@=°(g<ßzQZ__Y”m†%ëcÍZÖuæy½ÙNäŸ@àýN_|å;(J S©ì èƒñ·¼ð>Y#Æú&:q¸C&©óàÏå‘.‡âVjKlá,t7Æ«GÞón Z(PŒ×RQÃ[ÏÒ ‡}Eñ·XÓ"hǃÀÇ~.7®æP¬à–«¯\¨Z§RÏÈ^,ó½–^ŸùèÒ’åN¾U“â¨v:î2Øu]ض/ Ÿ’á±ÔPø‚e› »ü¹p}Žëphœ«³Ï¡À*ùÁ€Ú¹&E‘¦l«êk~|3[iz·™_ÜøsuœQN- *"4bÔÓ‡î©v Ý}pXq®j Ž+ (>»ðQÓ¡Ö5Â×ÕF~bà”O,Õq˧¥(,Ä¢P•OVóWKßZ{&KçÅeÒrœΦÿraØ¥[/ì Äk£óÂegm¹¨Ô.a‚ 3I•üœYÆX½]p¬ÁS÷¼R:xee¼€>èÀ%mȨ»ä`¼ÏèØ›)^ ⤛¾ ÝfWw§ˆ­<ˆƒSíùµmrÔáqŒŒ?䀑ÑvÀ\£ÊË.ö¡àY¤áijéy—¹0ôF/%-¢xÖYq°*Õé”hÊ"þQ„Àuå‘mE†-'}bÇEqÀÙ#q㟩—ÿ}ý?ˆ¹\ endstream endobj 2425 0 obj << /Length 623 /Filter /FlateDecode >> stream xÚ•”]oÓ0†ïû+¢i.r2ä«C»Ø€¡¡I”  pá5^cHâà8[Ú_—Ò¯HC•b×~Ï{NzÎSì!óÁÞ y ¥Á,L½E5AéZznóùýot¾ú;Ê›lrqEFÁ Ͱ—=îZe¹7o Öh®¦>¥¤—S? #pÃZîN*9õI ò®ä­Ù%'GÑôGöaò.Û&Žya…Vy\b|Pbœ˜¯ièJl˜.èÔDF ¹Z*ÖßQ„z¸‚kˆ (®˜–ʉ‚ÀÜã×¶F“Ó'q@qV¹bÏ6¸×JÉgz,ÄNØ.XÉ­R«ŽªzÖ‹Öš /ßìÓ _÷çgðFvuÞBÅsxWgbñ«µ‚{öÀKH ±Ê=[LmlW[Û¯»¶«QÛ¾ui½¯YÙrø²<ëÓå¯Çò8Û÷ßÛ†âYêQšiDlG/îª{oåäÓ©ùÃ(4­=’Ú•ºB²b7ê)f‹Ao6ÚñžUM90eÙµÚ4ÛŽ£½Õ…âÜÏEÅëVÈš•¶Ä‹Û˜î&±½»Ú¯gàX«“>MÐ `u>žo=Ä€õ¼ÝX< ]ÈN»×c–vôD½t·òqhœÝ¯¶×>]l µm´»”¢º½Ü$Þ£Êô>L‚Ý ªF*퀘¢§9ëÃB£ƒdUü[ÖRñë¶á =J΢SŠ×ºQò§‘™Æ]„‡ñ4$Ì…²K™ÄGC|’Ô{Qs¦àßE.GÿþaëXE“þ±Ó[¤FÙ9DÔqù_Gø9æ0¤èÈäí=G‹âDS™ endstream endobj 2427 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./generalaxis3.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2428 0 R /BBox [0 0 160.26 89.82] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2429 0 R >>>> /Length 8160 /Filter /FlateDecode >> stream xœm|A®5-låü®‚ÐVÐRfI–p¥$j½oÐÊ Ûoc ê}ë žŽ/U€mŒ±MýßÒª”†¿ýÿûçó¿þ-Êþ÷g”ÿùHù—”ÿóiå,¼jŸ¥/¯³òçc+ªŠ—>­Ú,Cfm:J©>­ ]µ/-}¬:ÕË÷3¼Õ-Ý¢N2f¯C¥tõªS‹7«/죪kù~¼{ËJ«}Eq›uõ^zÓ-ЇTZdi}øÒºLŠL­6­„xõÑ‹„Ö9F ]u˜q«ÑÐGx¯Ý¼ÈÕû*1GE,jëQf›µ·(¢³.±òýLm…ð¿—9´Î¶Št­&VfxfEÄ« X«êXEڪõ¬ÞùjiZe­²Ìêì³€¡½|?˽.eI ±YÖ\U¦•éu`¢ÒDê°2¥.Ÿ³|?ÒTkÓQÇ0¼{Xu+¡Õѧ4PK´ª!Â'ÀѨÝ0‘¨áÅñÐÄØuÖÅ{îà¬È˜µKñV—4<Q—”±ªû,"+ª+ 8g-]#³ú‚ºZ5ˆ½N]³H½NdzQxÒ}Õiè"šJ‘>½ÎŽAtˆ )æÙ ´WYµ&ѺZU«ê˜cSÑ"j«ê*aµ¥°E]kàR@åDÃÉÇ^»Ì !¯:´Ì¨³çÖ|[Ò—"&½Ê,k%çźÖQ¤ym–hG§"Z­{3> ‚¹áшû¬²8 Q¡q:¸>Ä\+gVµð¬+Š ­Á'Bë*ÆPSl‘ýülU¬È®'´Ÿ½BHK¨¡bSëŒÒôk$^³t‘ºÔò «m•Þ{Åwö:géª\7ì#Vé£ç¼cÖ!¥Q—/ŒjÔ¥{T ŽšSzÌj–óvªd_­(„9ß©­Wƒ†Tx…Và£Êiw,0¨Õª³’³à¼­öTq gõ^Wà±*Q4FÕ†15°¸èŒÚ•ËH—Vb­Ué Ñ¡´ú€F«sëV½§vnu(„h]BÊ­Q'{Õ(æ½¶È.dV-VôJ=µØ Eú\ÐPƒÍèlßC«YÒk´€ºDÝ*–¦t“Ú{êUz®¼nUFÆ5,½y(°¿ä³ÀšX­ç$$Z )cZÕ1ŠÈèe,¯-h ¸f¼Í4š‹‚Ñ.xÀ®)úsmµ¥­ÑÚ‹›PŽ05£×1ŠÎU"M{)ŽÕ¸,ÍY÷â¡{Òka@Rv\ÊòU—­óÞ¢,[Xñ%ÕX}VóUB°#DY-jô(Ñ[•áeÂ’X 4ãšÐ½%%Ô«w)Ó°ø¢ÄVèÙŒH‰!|Ñ÷3›q)ÄÀFPÛžX Õ×*áÊý!¢×¶0‡0  ©F× ˆ‡ÀÛh¹eÌMn\`½h‰eÜ<FN¤ÄZ\¢n£6ñ‚Q÷lŽ`&6(sÈDZ†§t.ކbÔ©Û襁z™Úð2†€—³§bíÊìFEþ~†X].ev¯3VÁ†ßOLÞbÕ1FÁ~Øi5 äsªÂ5`œšxs›Å:4{ã}߉V /Sµv-ʈ«t¦þ }ꑺslxp¥Ku>ßêp/ª^WsŽ0 ©Úµbÿœ[DѶª™pŽá^ú»=,gù~úÔª<šuÁÜq¹rÑÎ ^ &§!ý~àÌ@ñf‹:ºÒ™‰1Ëlr‚3µZØ—±8±+B–Ð!áÚ„b8\Ö¤˜c¶jÎżZaô…d‚Ç%<( ç6ÞêÞw±ýM/qÜìéá%ÌÁ]ñ”Vè¬iÁ¥Úªé,2zµ9K@/à´À<)=#²¨ŽM´å‹ÅœRô58G±ÍƧ“ÙÜà¨õàMþŽöpr¸_qÿ.>âî%³Ú‚7’š‡1À«suj’ «ðA°¶…AíuphŠ¸Ð‚O©0«è«Á¨i ã‘Z/—˜ôG´Jgcòc ,Q>À¤ Ë »g[ehN»·\©°Ë"JQ/nDÎTaÕî=M»zéºj˜Óòc}?}Hí²¸7øðÒ]éöa]áQ‡ææ‚Ý E5n?˜öÎéÊ óV r ûWã,t¯F]“†AmVmRt:—ˆ[5- ¿v ‹0æ(êÂÑ•VD ú^L‚>†êàVðý˜æA»Ô¹¤ØðXÜ-ùø÷Aâûù¯Ï¿ÿ޾ ß‹þóù÷Ì'Œ¢PRþ|°0±ì =È­þrÉþ|Dáï™–m° ·ä4¼²?ØfÎ$œ±å#[ýÞÈþÀËû¬êª¿… äÏ'Fp ¸'=õ—øóé.¹DTéÙä©=£Ò&´x¶„ÛZµòŸÃþtÇà"þ¹Sžf±&ácÃ˰­èu- vW¦ð|!à; ˜J¥Ýðû¡«<ŠúäFG¾…¸ÖXÖœ˜OšëÆéô¡Õ5Šâp`£tX"}àžÄ÷s)°ÇÙ€C¥çÝìðZ­nÉO{kT³U gÌ+u`H0çk\ŒY+Õù¶Àö:Œv›»5­f¼ÜAÀHGPkŸá‚Î(ÉÊütjT¤?ÅF OmS4¤Î†a=6õµûhT‰œ‡!Qµ­rñîöbÅFöë ³:Æë °®#MF÷FVAž½â´ísóûlLç Î4†)žwo ¸*Ô©•]p:‹'~ìXà6Î~B-{.6&âÁÏ4¥;mãÅ AÀ §m ¼1D‘â¼-tð¤Ô*â‚Ol=—|RàtsÁ÷tJ}æ´ RˆR Qxž¥N‹Ö¨¥>Î Óp!Ö¸§ñ—)ûùüÇG†Qû:Ý›²j[Œÿ 8ò³à¤ŸçL±ªâÇØÍ«AU xùT¾ŽôeÁ{óÌÐÇË aȲ¢P®Ä·×™ƒÚŒJʽú7ö–†}¬‰%p@l ¿¥•ú½mdNâ`ò¬g¨ã´˜XYÑì` ;ð:vQ¹ap¾’µ‰ZÝ3ñ{ IÁ^ž† qßëšÊÉ P2cZP6,Ó ­ófôoQà(F÷¤@‘6ùó¢DU&œŒ•˜x ÒÑ|òK‚pÁÂb^u"æˆÃ«ûÅÌ?mг‹PfeÔÑw§:ð`iØ’ðŽÛ+)ˆ+"sýó¢`÷ÏG€¤㯠ã‹9 Ä.åç¡ÄdZ‹”…—€qœšHeèòâQE/þ&÷Ú|µ@Ô~¼q²ÝS©Iy†gÚoŠ,¾åN&eòLuÃäÅ÷båÖcðv`U3ÜQ{*ao/²L»?PnpøRf†€!È:/d]ª^f‚)¼Ÿ@r\Ze*tz'‘9„„g†ÈÌ‚mˆ³Š¥!;xçYûzµ8j½X6”O h)*œaÀÔ™Ñ1df—\-»² åneÜ>übö°XVð´`Ê J!ðƹ]c8øèCÉ.B¡P>›ÑwíT‚é~[ÈdIÐ`.Jª·ˆ6û‡ ¸Ï˜þù9Ëg8dÙ»ÅÆÎj¯ÛY ‡‚ä]ÏSå¡shÞ†½bQoÌw8gþ´àD$åMùÇâ WºL]Rmz*" ØmƯ¢ëbzý‹^ÜmaŒæcÔùS.0ô4“×È¢…¦rø5œÁÆ wjÈ~¢ ¤`™_¼•òFΙÃfgTÊ…†§<·gãá)w¾·&L|¼ˆbžY|Diq—°Õ4²ü ”‘²è,ÈY=í#cÞ:ƒÐïÓ›Z%vÁ¸cJÊÝšŽ0[Ïtõîâà¹ÐñjÑèMâ “á›Ä, 8çΤ̫R´w¯§Æ}6³-ЧŰté<ËÊ6yrãŠO‚xºW¢“}îi¡ c\¼ªÍ^-:ë± c{i¶¶ñûþÃ1$H˜wVZ"¯ôç¡@E*ãŒä– yÒ—YkÈLÞÁÈQ—€6±ÔPŒãÁh(Â~>¬_DÕ¦Šép¹©ö|Ç퓬{øy(ÌN Ë2%Áº<1ÚÔƒ9ç9yS~^”ÎrRV¾EsnƒÅDÀîÀo2Ïäù)ó­>og%WžD«ö‹€‚ËùšEJã5ËÄ›ßH”[jXÈ4˜OFþ¼35Ž(&ªÊXîÙeƒ_GUËrÏMAœHQ§†Ê‰ùèò¾ý­¨¸ÐñRœ…z²Ê*¿ Q³¸ëÚ6E²¶CP(Œº1±ýê‹KHÛ eV±.¦^X(ÇjB°—…t:Yv–ItAV1ƒ¤HÏ‹LF‘}®¿pcù žØägQÛ¶<jÉ)ã0ž¥|ÎR»ó»²TÔ£m–mÌúÎ|`Sà8jhQ­e ë²Ìù/Á1zj,7ɤëŸä4– ŽÐT’å Öô–E‹;«æÈ‰¤hV2è-®Òœ™Ì© ƒµ·v‡Ni’3²Ôr—5&IqKuA’0®,HÊ´8Vá¯i¥ÞB–¡ì é=‹Q5yZÏÉԵٱ  yï‹‘TŒÙ¦øÊjY–ÍW)ª ¶&¸‡Ö^  GJ±¦Þ½”& «í¥Õ±¬ ÄC¦¿'•2EÓHk´Â‡ ²ËHiH‘Bu¤c[7&ü2ÏòkËšùl,)|Ö'JGÖ¯êƒ"¹-†ÃùE­_0P9À*Ì]fÜmÖÉ”+~QMçµfP΋slODcÙ`¦¨õ=€ñ(m]Ü›Y-›ö3yçœö]P¨ÅøµàP îÏï“ëÖeäR°PÕÒ€­M¸S‹“ÍX©,¿ä¢9}ÂÓ¢hPJc‡ ¨Ñ@RÏ)¨:D,¸O͆_|ެÐÝðvI+µ­Ú&HVaسN‡¯w eW£”/©–e+×sü³DÙľ &—T RÏæ`~ô¹ãÜìÔ=ªÉ†Kq¿f&aåiá,Ò³ìaæ’ÌbŽ ‘|"üÉñ¾Y}Šð¹`ÅLTáõu)?¤°ITD'Ê•Q“‹%$¸5çFTæab†Ð¹žð“ð ªëB_øÔ—&Æå’I‡ýP~>ÓèÑ¡xÝÕMXã ò` °“q¥Y ;±R8¨œªAµ_è#ëûŽŒ»dYô(sN$ñzVÜnœdÍíiÁ(žðÖ rLbÁ´s]&)-G:xĽÐ!È^¯ß?[–NT@®7ötsB–¯M\ði¸„#Éáýþ ÑAz³OƒŒ0½±ÍÄԤɊ^#‹pHH•£pex^!dº1jË%9-<Ÿ`$sà•Á!Œ‘cwÉ!X¶¶«œk<_,•¬]ýy(-+èRWY/þ~é7vÃ¥NOÿÑù¥ykåiJ¶I¥_,Ý׫ôëÜ‚ºJ 9¼Uxunâv’ùÉ«ó(Š|=ðóYðŠöʂү–µ†[éò‚-^Z¿úÿÖú;³­öž_ÂVüÕG*ØVktÚŗ⣠…rÞŠ¿Ã¥Gñ|ÿRR•WÆf^pxiþyÀ2ekþƒ·æ?„=õ•…¼W‘Oê#ør[dØåi­®êïŠî£ú ‡K(èVì…’çxi>dKe8 ºSû¶æ_x¥p[óWo9‚Ôü…“vè[óOÍ?”«èÐPNüEù­çÔý±•.Rcþ|/»Áb޼|çžÆ™/ñ²ƒõM_Œ«K´ ‡`Y¯ ÑÑ8•³Š}SjcHb°–ý¶€ÅØzª,íÕ8·§þ¶`ˆ¾™g©ËD ,ë>åçczÚ –åYgÕ Y™¸Ç½¯Å?¨Y@u.Å¡dUµ.ØÑ‹wÈÁßÏÜE\‡‚¸Se zñ]W<èžu–øCÿŒ–^h¬ÕÆ›{cä¨ÎÌp‘éσC÷½ìK™‘Õƒ°(,2FÅÃÁ%Ên4B¨žkÞ®q}?­LŸYlj*²8k ¾/ÛXv­ÜqÖ>^lœ0õ‡¼p4Y˜¢ÜlÁ²ÛÃÆßí²¶CÁ¥x²tc­¬” vá¬èÒÜnvéÛ « ,ÕFq å¸ñ÷7’²ßø¾(Ãþ._|¹~)¨¦º£ùbz=msλѫë 7® eÞP¡ x()38(’ %¢ûNΡïîý|fËÚ¹‡âžU@‡âÉ™Œñ±{BªƒÒd|UÊÏg,‡\ ¢ò{«è›’`a§+¾N€½YyÀGnÌÔo,w{¦~ã:0eq°g)ÔÁ¸E+ÜIåç3q¡lä‰Â™\D*†Çøqõ}—ÂͬR}0y Ü] Üòü`ÀÆF¥bå<Åbgmëfï¦<øÜ݆<¤]JT¤\‚íW0Ý5á| :½cã7ººû²Þ_R§&øàýg”?…µ«cß|ìtÏú¾úʬíÜ}äíÍeÙÑb›A®þÌ5¢´§O‹>¸«#˜4úœ÷²>c¨3ÝJZçMÍ™·ÞóÀ›ÛÍûީ޼".tx/W÷‡xWKkƒäÄ·„¨˜úÅã$×/ÅyÀ´–÷Tpá§ ø†øÆd-?@s(¨uƒáBMŽ#FÎ'Ц0PBÀ/rô¼ ®yýæ`¬>ò´˜y7Uk,•¸øÖŠçõÜû×ý± =¯aeòzÅm ±ñ¾ïÆ2¬N:J…r^úÈÅyðÌK ãk‡›I MEö¬g»øÎã¡ ÖÀéÊÅâx¢žËÉàœÉîÃ…"Ÿy]xë0BC¸,ÄQiìcÊ_V†±—ž÷YÎ@ÿ¼(ÊUøà;>M_Š1/;Ú>Šín85æ5–ý #'{Å´Ùñý‡hé©Ail^ÝN?€·/~`¥¥ð¨ Ì5‹{èŹ#Æ‹þÖéçÁ}‡„Šf–§ë}TLòKâãnü4P:lîyEòoåð¾E†ÂQÂu0ǯ°¨§í".ea÷­Ä™p~­¥‘ÏÈOÛ=¿ ïc£°/Ž|1Ž&yø˜ûÅfp"Âá»Nš ^õlûW¢|ìW—ʯ÷\o‡5FP1q ¢Ö™ÛßÖfAf‘ŸïÃGì¦çý?±r‡rxÐ{uå`~îŽfëRP ‰mæÁü4 s"s÷çç NƒÈï"â Âï=ìçk‡(eÁ0%’Âx¾®§æ%tÁ'õâïgtvq¸åÏÏZ6<ø2êpðÇ„3¹Ïo8:«yôb†^ØòPðE1àØDi'Þè-µ‚ÓNÖž'¬ ½à|?¬=”Î/KnŒ”uûõÄQj(ú¿~þJ„Fp endstream endobj 2432 0 obj << /Length 824 /Filter /FlateDecode >> stream xÚµTKo›@¾ûW œpd—5`ù’ô¡T•¢¶>¤u}Xã5Þ/tÁnÜ(ÿ½³b;i{¨l‰áã›Ç7»3ØAðÃNŠœ„  lÕC•¹cŒOïzØò| úæÅ¸wú6ŠŒ‚¥Ø/º¡Æsgâ^.iÕ0Ù÷ !îð¬ï‘{AkfUÙ÷á;_¬+A8qq÷§ã÷½7ãÇÄQ¾\á]‘'ކqDDñO¯Vqè¼.{w4òZ0À×3FIC#èZØÒ3*”1piQ—ª šÙ¯ ÏúaâÞÖæ•¥È­i¼r&˜¤…e/%cþœ¯˜¨y)Z˜ÞñúLõ*‹»•ùØTæã(†±©Œ¯ªR6}P¹¹¤Õ’œ+_ëC+†Vó_ìŠò0B`à}–•YÑfIl¬Ñ¶ÎhÁˆò •Ç«µàMÆeà£7†¶G6G¶–’‰¦’åw–5 hT1YWÊÞèäXe‡ÿa~AIWÄtÆ eœ\žxUYs y´à¹áèFEðrïJŒyv«]˜˜Êk´€“aÞÐÀØš«³…à &ñ~Ñpd·E™Ñƶ‡ÄÈì§i‚dT—¡žÙ¨hƼ71Cu>6æA—£kß_Ñ;„Ît¡ö-Wti-ÎÅ®[>çR)ò6{Më*¬YKaòqcWCÇu(o©œ&hzþ`àc àºïù?ªm$¯ ¶¯·éèí&ÊdYë²m…¹§™ÞW]æC+à¼éݨ†!ÜÞÄÁi$pvP‰Ôæ'0µ„˜š?¯åÂL]‚`˦6f¹0Ï1³(s0âÔ]¬…¾˜-»[h£&Vï*@š%3LÉrà›Â‰&ÎJs¦ÞL7Èð¢C»ÀšJH7}?º_ŽG‰ÒP­aÅRÉìQ¶Ë s”»¥k¡`°X”¸†Íî´¿Iê¶§ê|íK{&ÓÉÔ|XxæYQ.E™EfeÙñÌJ˜Èû‡Ã{ü¿Ò×UÁk¶• z·Ì8¤öÁ“ixê´Ý£½£Ð?šáŸ„Ô 8‚mH9®¤SýH¬‹â™.=+øÈêyV~;ö¿öì@ endstream endobj 2442 0 obj << /Length 1634 /Filter /FlateDecode >> stream xÚÝXQÛ6 ~¿_}pÐØ“,ÛIZä¡¶Cë=l½v€â(‰ŽmÈò]Ò¢ÿ}¢(;vb_ÒŠ¡ÅY¤Iê#ERtèˆèt4'£)cÞ<˜âÝ 1\¹áâ÷·7ÔʹZÐmI¾¹½ùé×0QâÍÉœŽn×mS·«Ñóó–JȱËsf/Çn„Î^ äìò±ëÏœU•ŠR¯¦„NNÇŸo»ùå¶Ù8ôý+‚ä9Äèb4 <Ê„XVrÍc (ôÚøDB¢dR¤âîóÝg|µžàs™çé‘çÙjñõ›V ¯¶†áRæÑðiãRðÔš²à‰Dò X²;¹üŒ³´œ$S¸Èö‹l'Êíÿ°ÈömN½ˆ…E€àÍÑ“,‹¬JÓ£{nŸ‘×K‹¯H“L¨Ca!î kèTâpd,:Òí#þ/BˆYx1ˆé:%«ÞñiôŸˆNc¯ŸfùÆæûò«ȯt0†ÿ{7é¿™+ÿ(†§Ï1¤S/dÖæíVÀCO„cêdÐŽ€Vc}ë<Ÿ°²Lò¬DÎJj>ö§ZN3ˆ§ä;¡O#F{D%¾]çÙÜÒU+m ±F¬õ%úܸs)™9à}¯¢S½»4šj¼½Ê,]Šrð ÓJŽD®Â˜Ôþ¸=Gö|¦ÏwŠNvšÏõ‘í)Ÿ,ͦ}ˆÕ9Y¢Å$M«RI®ÄÊ2²±±e`Cìùòýd`,ðXÀFÁÌ÷müé1 –v[â=£À©QãýñœëŠ<0êMIx%”Zú”S£ŠÇËCX½±é3|aÐòrMg·é.,°[öÔ.¤Ã¡0S×ÀÉ„8X¦ý9ê츱36Ä&7È1 Jk;N æÄÊl%jËKóǾ< 6"uƒÐäÒf¬e®¸J²5‚«í@krÕ Qß:…E6lˆg›TÐak˜G§ºn¥VlÁ’?`‰a2˜¶Ètžˆ¢Ä¦/KÓW8µ@6d8pT²ƒë ¤¸­ÃJ!íW/Zu[ˆ]7~Á÷IÙß•^öi’nŠ\3æÄÍ£¶ —Ëj‹³ f‘•i‹ÁYíøM‚'º ­q¹õÂ_°¨~Uèİ£IšK<»_r¦}ÿ½ÃJÐVóÍÜP\nªÀn4t0þ 08HG†À€s?xK£ S²zÑôs ªÒ PŒÌ4K„åb›ŽLVVVÕ빆f}Q}½¶É=¼:òÄ:kàçKÝ'×Y¹BFÓ´B«hêÁÔ°Tb?\ÉpÙÕý×”dÀ°•ûï.^¯q¼uâŽašéÂÛlßÖ=•öÙ™™˜™ôÓî83î]ø9åt€ò§Þܟ뙇yAxi~²ÂîQºo|êš¼rzòCÏŸÓëpÔÂOã81ùôèdbÄqbèàšBJúWâ²ÂpuMbûK²ølëyä‘èÚXá [wM^œ&ÍÜkº]ï:yé3;QÁ¢™¨€X%%_ÂÍd_a•ºÊ(÷'ZR_-²Ü<?#ü˜ÏÐH,µM,§) ò5>9>Þòª,“µÍË¡»Š/šÙˆ%»"—¶Ño$/¶¬ùÏõÃêÖ±/þ~2‡•Ø+‘­zŠCf ¯ü `6‹ endstream endobj 2444 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./GaussianSurface.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2445 0 R /BBox [0 0 200.5 141.45] /Resources << /ProcSet [ /PDF ] /ColorSpace << /R9 2446 0 R >>/ExtGState << /R7 2447 0 R >>/Pattern << /R23 2448 0 R /R21 2449 0 R /R19 2450 0 R /R17 2451 0 R /R15 2452 0 R /R13 2453 0 R /R11 2454 0 R >>/Shading << /R22 2455 0 R /R20 2456 0 R /R18 2457 0 R /R16 2458 0 R /R14 2459 0 R /R12 2460 0 R /R10 2461 0 R >>>> /Length 30149 /Filter /FlateDecode >> stream xœì}MŽ$KsܾO‘'H†Çœ@€v":À@CA˜! q¡ë fæYÝå^Њߎx‹‡¬é¬ÊŸs3óÿ}•Û®‚ÿüÿ¿þ~ýÓ?¯ë_ÿýk\ÿ÷Ë®ÿúe×ÿúÒ¿ýóù²bíû²VÇ]íúûú¤Ž~÷Õ®?_ÿâþþõûÏ{)úósÚÝ÷÷üù²ÒÚ=ß?y?ëÏ×ÿüúýø]ÿòeÃúm㪽ݻŒëïWßû^£_£ž»¡Û{Þýª•ßùg{ô«ÎvÛìøöQö½æUk¿{üäç9~åÿ!ßÃëY÷œ—Õ~ïVùM'\VË]÷¸l¬s¯u™Í»Ö†ãvŸú:þõecÕ»ï1ç½ûX8î÷—U»ÏXiåîü‹yî=/kÆ·acî»|ó7ô«ßa÷Y—ÕÃëþ>î·™îÜ?±}^öºÍ.³ö\¤?ªöº=x¯¿8ë>ýõøm»+Û¾ËæÓê}öe»óÆþà“Æ_ÙC/Ç­_¶ç]J;^zA¯Oö=ôÆÇ½Ï½ÊÂqá£òcœQÎ]Æ¿(óú ¾âY§À÷ìzxgòrÊÑvæmý²¾ï6ñßÇVŽÇmç²>ïmS_QoL«æÃfo½°ã¯c7½ÐózakÞ½þø‹5îÝ.ëã>¼–çøÜU÷õ|2üYapcÌÁ¿°±+Ÿÿj¯‹Úíç²µ|:ìΡ»¶ ?Þv·¾u†2ýÆwá“9åÞºÊ~#Äø1‡Qûù‰qî>x“óu\ïéïûë~ÆÑ²{4Ýr¯ý:ö¡ºßþBCwUºõùÉgþøÝÃè5žA„Ûõuìêû/ÖŽ;o‹gø'æ¯|M=Üu<ç7–†¯j3^uïb×÷q»7ös\ø ?Îh‡C•¿GÓ–n|W†7þR”¬õûßOáÈ÷iãô{]Öëë®O× «åmœvœ2î¦I®GßÊ=®í=æþúúý5msÕ¨fw7Fô^Ï]Î…àYºÁ1Ê]ðòð¼6þjÖyïÚ/;õ>ósyíqÕzîݱij´‚üÇ}׿|á5ÕƒgÐñ,ÿ~Uî>?(Ã.ŒRñØì¶óã¸í›£íûƒ©–éÛ¸ËÙ‚9¢ þúÂ[l¯?8wYßÈ_xŽ»Ý½Nžñ|2¹ 8·ª€„‡qÒÊyã¢Ì¯ÚÿbÌûð®4‡Æ÷Þ‹C«ò„¥jÛ×èƒ3ÿ9¿·{¬þó°Ôì¿€å ‘ºµ»Ìùã¸9ë.¼¨:ïYí: &Ï»;Olm!9{þC·7ÜR›­]ƒôð4„±vÎñz(ÃøZžÓǼ۲ß>7§áóïkÜÅ*ß2÷ïãö\þO8âá‘BõÛÖä¬Ü˜…~Œ3*'Ñë*ïט„WsÀ[}^ÂKü™aiÃ3~Ý•ïQ1ªÉóÏ…ƒÄJÑP~Ïw¿?Y÷Æ„EÓ¥åû£jXÚòä?¹5«7—ˆ1ö=›â!Gû¬÷<ç{þLä3lî»·þýË8Z¿ßB0Ö”rý—¯ƒD³_ó dä¿lÞóŒvµÞï9&V+EЫÞ\»ÎfDîeý\Â7(ÞŸ^ï5'ÿªWìÂlüÁäôÂ,ß3ÖuÚ¾·µ«Wcdüõu¿ìc×iõ^PïYêuªâC¯ín7têä,ïµ3âŸÚt¥È¦Úuªq$÷ʘûëë˜Ï^‘ºÚulðÒ:" ~чI¯ûn¦3 ÿ+¯íë”}—1®ÞŠÆO r½ÙmÌNÑÒ[åW¢×ÙÄêµÏæ²Ù[÷l~¿<ó9¯dbì«·É¡ºOå[ímݵë <Àvõ¶9èö>·á¹ çÝíÚ{1pô^nfH›;ŒvuÇQ¯l´Õ«÷ʉµw½÷:W÷¥gØ=pŸ}à¶÷ÆÆ0õ ëÜVñÏ랋״¶n³oN€½Ö]Ö¾:’ƒÓ¯½æ]í\}‡ÎwoWÇÌèãÚ«ß«á„vŸ¶yŒáÞÇàOãå¡}Ì{L\„‚‹ËŽñú8wÝÏ({^}.Ê{Õ{7×{´Ã3 žËÄ6}ú˜2}Ž{Å¿àË™ëîÖyUX(ûÜüMÝþÂÃÞ¼Q³uu¤áuðAØÆ¿7Ïpñ¨ž6Î\•±¢¯éoÇtçx¤Uïϯ{¼P¼¾qöÕ7Úkc _çÕ¹Oá“Ú[Oyúè &PßC/C w…íHã5lvÚÕ÷º—ÙµöÌÀ+Î<×!¬1®~Êm\¥NaöÕ’SL¬ÙýTäû˜'³ãŸó[L$»WëWDz0êu¬kLžqcÁÅvÙêÕϼÇ&oã/(ñ?˜Ô—d×ÁRÇvνÇ`ø°û`‰-…‰3ÂÉØóE9ÁAN¶í¥ò%þú:½ñåŒÒ”ôÅ—7J¿KmׯéŽãÉ­ÃCë|ÌÒÎ@Õ¯Qæufã`pcÌ7;ÊâÐijb÷2OæÿL8z­r3Íünr|ž33?aÞ†{Bvsp¯™"ðiʉÅaå>ÄjãÚyL1߬ÁŒíüw¢7k² Z³rÂc„â„ÖÉ!( i2ì»ã÷àZhLÔTBãŒÎïFàL×ê(…1¼}õì QËP,e þ‰<ß:LçöÍPÊE‡¸ž# 7dO˜U±ÉŽñˆ{ÍØ¨÷êŠÏ›g`†3~cêóx3¼ÏÙuB»ÏäÐøLzûl ßÇö` ¯OÊ݈hŽ~D ~‚ûX\µýúâ²ÅƒKD\C$™:lÇ×=¿$ã«ÄÊhxL.—N‚G86ãÒúý˜Ì×Þ½ôËy­Î†„÷Ø•õs2iè¾îŸù¼Ïr"FxíV9™† Ó¾.¾lÿsLüç˜xØô<<¤¿ÿúu¬òï²0@öp¸Amœk# Çz†DÉæµzç{VfÄ}~{-ØÑ¡J²q¼Eà±0ºWÜ”ÒÙ‰ß2Ãî’N• ,P\l²V€ÿk¹/X·~“8àá{µrêÝÆï‚C?ÝÙ)G%|‚×/«ü‹yacÔßÍ›à÷üË?éëÂf«w?^Úáÿå›7¬@Ì@+6çƒÃˆÇxŒÛü’÷ºï'+ë½Q¥Àuëö=æµ—ÝxÞvd}c[rø\âöìwo~<ûµ'7–Ìy jðU¡Ã'Ý®=T€àñ®×ůù˜ßs_J%ð ¾²·çå×»¬k÷âw… #NhÚýòìQ›ªÖVSó ðgMožQ'Ñ?.«íÚ@‰¶ŽŠ+ØÙr£¬gU}²ìÂ`ó˜(:nlYÇÔ1Ñ¥]†Rw¬ã6~`–¨ÖÙÏ="©¿~}­Ó™ ãƒi×:æ[ Ã…zí×cÄn '즲$R‡²®µ‹ =y­¥‰ÎÝkK %ŠÞõÉh×BœÉs©w±kÍ)|Çû€DfËØ²Ïk 7L`z¿Ö*)âj!Š~Б?¬þäHØ=Ù‡‰»úad†{Mé68ó\k, w"À“Wä =Ú:®5·LÊð ëÙCÁÜ5v²H ‘»ØµÖÖ“D¢·êµP±Cùy Q–µ§Š±ØÍÊwñ`uèÕ åLdð'Йf¼viÜ\s§„ñRömD¡3ü'\1Èâ6¢ víÚØ¢ âÖãCvh¿É­ÇtÛž#0€V½bŸº‹ÝÖ}xÙ…ïÝ+ í„öµûkSÑnÎ;Ïx0x«ýÚc<™uïk®@êgX1ø ³2›ü—bÿ‚Iû~íµ&†"ã ’qžq8q¥ùn°ëö€Åo\σڇ ã4ðÆóìçÖ¾;1QíðM¸Ôøì7QÓS&S¹ õ `ã¡lJàë’Î@ì:8>b@ %¦(×Tdþ|´‡H<ÑfÜ7ì×iK¯ª \\µUß´ZÈ–9À1ÿBV\ž°j/T I$È_Zå„U{OÔ³X•àªÝ™°XU8~¤Ýþáˆ:x¼äq8¯Ò ¢"Ê\[¥|ÃÆøQU-‡¬ ž±‡ Ž|tû:û#壄T}8€ãÀ„á±ðíTÈĺž-Œ^ Lâž B¯Ý%—e|0ðè­0`†dçJa¼ˆºP´9ãˆ*ø‹Z0xÍæBÔ³‚·Ç'låÊ£!ËøÛÊÍx5õÿÒºöÀ¦0©ukÚL2ˆIùvÿ£ê·£EWÔ¹¥}晕àÒVW„Ý{„!B @*¡ (ñ{.bÜK“EÁÍÊmã&òe+L€2ÀpÛÈí×Tô‹c“êÆbÕsj•yòÎÄV4W¹¢s»[9W¹ºr”cŸk¾øyX܂ְ6ñŒ~k•¨·e½ÕQïS¤5{6ÊëÙtãúM¤P ôÿ˜…!îÛñøÎ•iéIظŸ•‰÷e>YyUÚØsõ×VÚü·º‘©ÅwÖȾΠU³²oš¥b¼PÐLü¸jŒ,&¼¦SoZÅ67Ë"…Ø __Ñm•¥—1¦† AI ™ã«¤ £ŸÉ'_††i]e±°ùë² tµu=˜"úF:^H\TÇHM45ªæpÉ‹k{:Q¿gßñƒ·®„…7‰+ó„?@c(áaÕÁÀáP2f.¸‚qÙ…R¡ O²¸Öd8Ž}ì'á^:æ6q0¢!«SXËÃóDUD€1›åM«Àá¸Jp_iµq÷Æee15¬ä0`@ØÍCî“­˜VÊÚ˳–àÆ'•ãR¹8¯ñw·úkr7ýKíKÍK µ+€T/.«ƒµG_{ùœ†À¡K,²iñæ1¸gyç»ûnšÉ|®ÎªEv€§4íVù¬¬.~:J“ˆ¨€ã°+S·0çsÏ[D×:—ò k¼{ ôŽKðßWÑ.›«<ÿbgÈ'üƒ*¹ö q(Ï¥Ÿ … €"KëBaãM¬¥•ŽuÞåÚŠ[å4«¨—šâ7E»p»ÉÀ†Õ nß^ƒ!2tÌtk0©ØŸ«¶5¤$Ø4m›E ?qy2`Æþu¼P•§®˜é&­ß²El)G×3âm R<å­è0ôVüޱê½ÈâûEäbuèí˜ø (ŠÇØ røB’/¦ûЏ%Ln zwúpÅê65ÞÉô†l¬âaòpjðƒ VŸU¹p†=­Ú¸€bNòvIô)̲þ’3®.#ü.}5å $é—‰vèZº"ÍëjñÕeù­øNwùª_¸°!ÖñŠð8¸^|Ì|\[Á“I(ÃkÑšÒ ó‘ã~«:ŒWFŸ¿l¾TG ¤ãXœó|éú 0웆_"‡ ŸÏÞ\Àå×JWÁWá¸c>cUh¡ðRf7çàãl…ÅO®¦ÙÍ)X~I.t„Ðpa±fvMR¾Mdp¬øÇö…ôîZ5­¶MWÛÀt‚•ä¬á½;…ùÜìMÇøI%*íîº ls†>AjÓYûw’r‹R„ƒ^P?a™¾c("®þz´˜Òóû'3Š%¯æ¨.RÉç*®iLeùå7ês’°Q«ž¡!¨áa´4üŽ_„ 8¾^°›œ»L/×`JTgz-.çœz›ëÊ\æ<­=hÍÅ4+—iNªFy˜OÎÝÉaöX5«·æòË0PÉ·ãιãxj¼"ˆ…Ós‚hB5»+ׯ>7ÑUn@¾‰5}Tÿþñ° ðÑ"P&˜¶!#…þò]ÞÃ0Ár(¬v±øñ@¹×îÜãRÁý#hšNàøÖì4ª4 G<6•uVGÈ:¶×Y%ôëEbé:¼àŒ3µ­kž€ÖÏ™4˜Ü)°8ä XýKe÷ú¤ÇÐÜ25KÄ¡B£)8ù&Š—À¤á,~Ò6°U9 Ž c+†d­î{W߸2#8\ë4qQQÀ4ó, 4pLùÜ­+ÿ&‡_ùY½+[óÙØÚ‡ô+•mcY7~Ce8Žsi9ŸSq:•¯c;Às‰<ÖÐc‰ýC>”éc?ú# R2™ ² !±"!Ò2!"R&"£"Q.")#’62­#?"1äuä[©'™œé+‰Þ’0‘")4™di8o´É` * ¿R=(Ö‹>T”ð0±$Âù –´¼{ w‚‡¸hå¥+y ^øtÕT*÷[6ÀɹÎ"è\ Qe¹Ò|¿-S–—üþtcd LBiŒóŽòd(Eï@R†š2Àª g%À+b2K ZÝ2,—€»ìeè/ƒ<Ìðâ;ú É ^Ft3€ŸMjX30Úá~yßaà’Ô¡èŒU¿cÙêþ†¸<Âé÷£ù½‡&åjz0{¼† WÓí‰Åã!\lÑ!p<¼¼F;‘]yßBnð‰¯³æG[Ë2¡½=ÍÂ8`ò·ýµR:¨cþ”sÿaG08Ò}²oµz1f«HŒ×Ìþî´øòöð2’¿ší6E]N;véUY ž˜åÈ›U*‚wõ—‡dvø³ç]Eײ‹*(Èÿ¶`S¹”T‰Ô:9r¸mò·©hÀ%óƦȲ†Ê>П}ugªŽÌ6ñU­!ÁÛBÛƒµ'÷» ›§î窟(Á?ä¨D}ѨAÆ(²*Û7(zšsªÝA#×ãÁ4‚æ|x‘Í£æÌ›N?£éAA—mø GJ®{˜ŽìÚ|ü“TYo€Ù¶òj©ÊÌ>wibWÈ£íÓÕNÑ“oC¶Š  XQE«Ê‰õ\¹&uσ¹FQǽ'ÂF‡”q*ɲ ">7 +èÐ|°W^$uSi,·ØQ¿³(…ìHåhc\îY®æ¼ƒê(MÝôTêV† ò,ziìí!+³i-€õGï"eP ŒãÅÚ¬‰šÊüo»?¸ØÒ÷PwÄ º:aZó!ÃëÞ!KàûðTËúò3°ŠÂÛ`ùCYD_Џ6% ›áùâ ÏJWxL‚7³U@¦IŒ~áx>Ò:Wä#ÍK˜élNרiõ¢txþS#èn»£å°,‚Ü×Áî!“#+Ê Œ;1Å9ß`¾ˆû’ptGo1/Fm/v=‰°%vºžô¥°*éN>LjMcÔ-Ú#i-KéÑ £¨T<ƒæ4ÎŒêŸ2±Ñùkü zeµåDDÂ6šHŽ)+58¬ˆ/Êîc=´}£DíW©‚ žÍpÖ=¿ÐÎÒ}ÑJ óÇMÃïCØ8Q ë7¨00É’ww4û¶Cå´ÓØU¿hBpHU‡¹ë“€VO¶†ÛÑUc"‚a\SÖJ }èptu™¦Æq"ÕP ƒ„ßB—-†§B1[Ë6ï%0SYµ>Ê1»öä*œÐŒª)o«¦tÜTéwŸƒm Cñšõ¶A~´½ŒÄKB”{Æ=â—Ê*é œæ¹üòP«±Ç­½ª³Çöj—óÈê–?ÊbÆbNxžt}VɆµÆi\ ÆOµi]m T ¯ðñ„QçTl}¾þ7Õh’¡rLÕ’Ô¬ñ VðÖœ \`|ØpÐåwøûëB±n”êJ¸.>#‘³€­Tî46k›Çø´RGÏlø€+­þiŸÒ½H žüÎ÷•—€ÇdÀ&":ïxO„d ¥ :P*@VÔJ°×;,–p³¬Eàí4À»îeô/Àƒ>ü02B”Ä (gÄ@HaÔˆ²F6´ÆÍ@o‚‚TœÁä7¿ÃѰÎv€¼3(PóªÝ ÿaV|¡×WêàCÛ÷?Ý5]à:3uÓ×̲i¥€Œ÷´8NWr³ÊÛ=Å„^˜GÆ1/hÝXÔ±„¹=Hâ|,è!ãïýÚX•ùöœÀBÓÜ aF`lGo@ ¹á Xä sÞýã$@[’"™Ž}“ ‘²Á&Ëèù.› 6"# üz•¤Ž=¼1LºëÀÒÀ¬##Ÿô4¿ªí“†}7TÓËkƒ/bLÖ9¹n8&ÎpÒfÅ §8' Í‚µÍñÛ„§„0ñ¦ØdH‹€ÄrX#ó:Ðûsg²ºÔ ç)-5xþœ Î5¬ÈµÅýÀi²ôÁÖ„uq#< Á‹Ê#‡ôEwûÛ³g&‘t𠸌BIÍ—u¸ï2gk§ªqv;¾µ9<Ò³}M‡ÙärZJ‚Îv¼¸®.gË´Õ ƒ†ÁOZŸÜ]y™‡\IYÜÇ7 š‚Hªãåj†ÂÒŒÈr´žÞö·Kôy8H`"7¿-Ór¦›½„¿á渵¹ÜpZöv‰áD6`¶©ö>±|YÔÊ ·¸³À¡ï°Š·¥ªÚ+Hªjƃ>ÅÀ»µ4·Çãw÷‹ï±uwL ÿš[P`ø¸«¹¼¹·p€ê‚úG\§2IƒÓX},J`ˆ¹|2vrr¸·pU4†³s_—Â,Bé C3¢k¿dÚµÁßs{QÏ1ãš³U ìÙ¡qI¥—æ\ΤSXf!*™ òH²‹F“Y)ùŒ|ˆ%©*ƒþ# Îr÷[<u V!¨ó¸ôâ¡€+Úä%Ër&8ܽ8ÃU,žz¯ZíŽ-þ"1‡8˜&-ÂêÒë'ƒqÓ|YÔ–S˜§Ó-–˂ڤ"F‘{uÚZw®l¢ ±EÊvš‘L¥0‹ˆÑ®A{Ê`Ÿ%´ÇØZdH¸ž¥(¾aEnvÍâo“HÉ e{Ýi’-jn‡è¶kÚuÐÁ¸ Fºê$&òA~—‡kV÷à­tS‘uÍö sÆ>“öïê覕SL†Îº&<µ†Óv#]Z?ÿ÷Ÿšˆ®ABju ? -ïbt?ìJ/§HÝb^ªn4×< ßøM”Y"ž,uN¯zñ}nRTÅ…à|;Eu™×ãË Eu(%À Š*«ZÆ Gx`ÄIÿ … Åg­2üB}Aÿ­,qa…–7À,¤Dó„ „|¢H­y ­’ÔÅd»“Ô/DŽl® ¤¥5ìBÀF-n¤ У“ý„¤\UÒ©IkuöZ¥Å‰D¦¿àƒXÀW°eƒ„¼úù \½2½ q ûêg#ëäè7QÔKë">!löi±™8©µy›©¹‰¼Ƚ™þøÁ‘>œøÅ‘€ ʙœHÎoèL’N4êH³ÎDìHÕDîDôLðHÏTòH6dôtõ@h„÷L‰¤ùÈ©O¤ûHË´ýLìÔÿ  ø Ò‚(=Èâ„(_ˆò†´ÃÀÞé=ô…³Éÿ~Ù’òóÉŸ×'ÅáÏW$=üIß›ÿÿ~ýÛ×?ýó¹~ýû×?ý³Ùõï¿þíø{¿¿þÛW¬9£YªJ‡ªu®k§Êw¨ŒçÚyª®‡ê{®Ï§ ~¨ðg@b ¼³2Ï 3S!sÛá ‘È‰MØ™‘Ñ‘9‰òNɬ’Ä;y§¥dÞJb¶¼_1&1g³&so;'°w2¿'1€ÞB™C”HFƒô¥$ß@DËiI:£‹QФ»²þæE MË*ú(wÓW$œáìä—]JÆÊ¬ÎbXÓëx š<Ö¤¬R óeH«Ì5 CЙ?KÒš¸®€t‚ÒB*ñÔ±‘Ph8FTuB僘`î‘yKG§Á*®=îE{z±)E1ƒßøc À!º5<½—­Ë•Gæ$Î*€H²ÈšëSü:¶ p{fÏÜæ4‹Ïþ£ üP4C´(îî-Ãlë;:¡z Ÿ¶0¤ÍhëE •ª‰ø"–!êm—|c¸€™#úqPí“¶£Þ¨º‹ª4œqç[ï'Å]ãÄÃ.H~U, ö@öøB¾zéçâ°åš÷¹#žÃ¾wÝSuÎ3Æêˆ 2( ËÔ.{²QÚQü_ÇŸ-v=Œåtž vöxoS´ð2´´šô 7¬ÿDy‘%¢‘¡a8AÄ~ Àf+b ÝÝlêæÇJGàôT”>Úìî2†- ý ´°ÒEuÆCvCÀÛÀ.ˆÖ;"QCžÄçÒͧ÷˱f ì9eñÕDM~wp÷9|NÅ9´hî0—1pûAÒ7•¯³¦kB@¦bxôs“¨Âªž¤¶Â®])kãN¡Ù´ëÁ7Îñyĸ-¾Ø<Ë‚TwZÎ *ÚÛr†ü‚tÆ*SuµÂ¯\Þ–•ÁÎã¦Ê ×_–Ôà*%¢E£‰p '3Ü TÎp CéQɶLmÑaˆ»ïU¹ U±Çe tm*x¬Æ’ œjDˆ‚ áuÜû’ðýp5âT]ªU£@Ê<~ªp£ÞjfØ@¡[×FYÁ¾™~ nÿé†ñÇ4{¬¢ÙBR:!{¤k’Nux3$d<Á;^MéË¿Ÿ¸ 6K-¡È¤Nž¸ÄÑtÉ“7‰Äá hŠ•f!ˆOv')*Ä.c}š[Hò½â¡²®½ªêÜçÕÓta öÅ 2/]¢%ÎÀ‚2äPçO ò¡‘üi9…LkŒ-¥§t;eå¤bËÁø47¨ÜŒ1\N²jó©òVÙb†ÐØ}÷ &'Šˆûyæqɦ¯žS4Gv æ´ÞLÈÐ$ÅÛªŽöí`„yÜÝD«+dèp³@ó`#³4†Ìãæåð¾4¯]|U#vªÀ#ï1µT+MÀB]îò³ÆD™x+TQÛâÕÌIX ñÓ§u¹Kâ`D@¿KbŸÀœ›·:$Ý^=T9¯—(“ÀËjÛ¦·ù<Á½¯®Ó>—–ö"ínÒV½½©ÐZɰžÉ—¯Š7*J‘{6lVíŸ^¼O¬þþö*Ö¥­úóõƒí?y÷Oû§Üïqÿ ÎðÞ‹%éX²Î5íPôŽEñ\6…õTxO¥ùX¼OÅýTþD ˆ ƒHAH…Hbˆ4‡LƒxgIDE$Y$F¢iG&zD&H Šd*I"›2J¦«DBKà»| ÄÊL¤Ô| ÝZN`ídZO$þD^Ð;o(‹2ñ(S“ âã¶Ìo³h¤bÛF‹Ã¢¸†ãó²NÝüDj$¤4Hı§b*h²kìRŠy+­5õÉñE£k¯ØC@ýcYeóMU‘v¯¦y`B«­&Àc9õÉvO;núŸc·õÇñzh܃)eAs—_¶Æ÷’$®è¸É4–ø„mTåqqÞi~Óó¡qO Ÿ/üv=5–tÜù±k ¹÷Œ»û‡pSWÜ Õ4#ùâ¼Ó¶Q#âž«µ³sž›6Å*ûÕœˆâ¸9’/´n,wBžÖŸøG)+0<ÂŒâÕ©Ý“‹N÷|ñyˆ´íBË©Y¿åPeÑ­íòÈ—(혂Ü;í&µÖ’` ¸É~ìVx¹pÓ”V·ü‚)³_nœy<«¤ˆÑ8´ç58+ðQ?6jØÜ®‰:/HóNËÚ“€A¢>ËM&2©§"ßqÚ4ÿÝQ‘&Ÿ+„JвY,bàêbû×îáÞÉø(ñ­¨r:ïö *è7g™týâ‚;s…™ô˜S„÷æE ÕÖ´£FI#lÔêvdBÅ•d~`hrA©.ÜëZp–Nز/V„ÞM]•ƒ–iMkØrSµÁgs«zŽÆŠÑÂú¼CÍôKz 2‡µrôÛ&e0>çÓ0Á\z]¦LÄ™‹3Uǵ¸pK÷`]¸žàR ˆIsUiÐ* ­–€.wPH¸(Ë9hMÔ\sÙ¢R\’sÝÐO㨾bdÁ'žOL˜Å á†\qºžadŸ§œ§»˜®RÍ€zË꫃GÍM 0°¡É‘޲˃ ZUs|Ô©'™`Pf™a"F¡b–2F±cCf¹dTF½edÅft&Åg”„Åh’”FÑi¥fÙjеFÙëalÎFimßunïfyoGpRG‰q” g‘r’1™sB¿+¥ƒŽúƒÐ:J±£T;‹¹£Ü;ÊÁ#}ÕkNXlál^«zJ?\ÿàÏW$7üy“?y7LC§Ìa·©I¿¹¨õ庨A¥g;i‚Ýi˜H½Õã§³7%‚€¸KÚµ·éÐHîÌ"رÔº® ÑP”²Ö.†J{œÿI¯êNËcž=Ù¶»qŸ[yk­?´¸ÚôŽ ®Ð%U†vê×x†mlT _a˦Ö,¤;z±[©õjæ•f`/ÍXˆÔ4¾0»jl‘eÂoú¾à7ZÕ-¤3Å¢’u Xˆì#D_CÜ€bÒ&ý´‚¶Gà­ÙZÝã›0Ô^§?”¬ýúªK®ˆ‡™ûB”b¿4Wð>P…›1C$á aØ hȶÔt¶CÆKÅM€‘öÓ!ïl^í`h"tçÂbb,Ø"N0ñá'ƒOô^*íéDHŒ‚JƒEd]h¬ŒµêìºËcyÞJN |¡Q*Ê3èC¨ì‹QfKrrXÌ‚•?!&·/¦E} ß' þ¾’Lß#¼œ{?*áÐÒ _W¸ñÁœÉ°-S(Ô%€QCº1—Çå¯/$˜ ˆ±ƒ3¾³‰Ïo&¼F Fm¡äÕW¿>ã'TÕ‘ìjÉ\ûñ^|Ã;ÿU@6+Ú=)”¶ Çå›g“ãÐÇØ˜¨à0óU-véC/>Ž_Wðá]wîsi€ÛÔç\a¬6 !¨‡E¿ªº'M¯l:8ºÀ6¨G\RôêÃxn°O!hkÞs˜ò.zÕw¶çƬ£ üäj¦Q  X‘⑳Ïô± ©*^Ò¡þ¹qÍMWxÝ52úç«ÛvóatŽî ùXO˜¥„e•àïÁÙõB´b'm`G g´¥D`B‚=‡è¯êWìC=œµ¯Fª§pV¼!UV N…H}[Ϋ+²j±?‹ |LÛõupK Tz]b^À/5q}Ju˯§tZ¼«²?yâ¾`jòÚ–Ç`R3‹äÊÜÄ/Pum‰V;E?žÁŒ5fÞæõ"•d0–Ø—Víî|OÖ›wÆ.½"Ôùœð€ÔÁ’üo@¬¬ÿ l.TITÏ.ÉhÇè™Ì¶ÃNgmb£*EF%”ÚY|¥;ÜΠÐïT¦*µP½{kkqjWÕ¦eóʶÎÄTHnçC‚7kó‚â8j%-ÛR=% ’ö˜ ó'à#j.)/l†ý4§æF¨od „‰ª¦™2rRqÙëvÊ"$úÕ·ù$8Pý7ØXû¢ÁSœy£Œ›œU;à/D¢îäæsPjî¤0;›jà§61ë÷ÓÎdÖfU`î`íOçC8W¬~5«Vœ9Ÿ²q/ÞÉ‘»ñÝø’é#_ù'*ï–ÈpùÀ ,™È¢ùÀ³ LœÈÔùÀå lŸÈÊt¡À'Š|£LH’Ñ¢ LU?ˆ§|GþòÖ59I@=3ˆBà~gÛÞA_M‰…×êÖ|èE._Ç%ohÖd„ÝŸöþ&dă xû»{Z{5r…¼.fO+Žé#—ª„·ò"e`“)}è‚8^kR—Ê”l í$¸2,ã¾·dt`c‰™Ï¿°"/‚©oX¢ÁC–Ú<T"ƒlÕ…ÅhUòw!LíÎíÁ† k•†ä«ªkàq2ÏØÚ~“Ôi~É}£l– k0†èbnFÃ&Xh®\ÔL¶ _Síİ¥å_LÒ Ð†3@njXkjIwØJkeV1Ñ$ºÓƆr\؇4¶Ä­äahbë:Å“@ö¥†kÍYgŽ8wM£-3mk°‚ÂfnÛ[ mu €e° Ûòˆ‚i0ÓX»Àcf)œÁ-¤Wv-6*»°µ8B$–™:é“ÍõòÃò„j?à`>MC¸ØÊ¦pÜ4dùU•½È™»Àg阦"pÌ):6áÆ{Q—ʯF~7‘ÉC¦›ãŠÇÅob“ çf{“é€c=·=õ“ÆŽë<ƒ||B:n9åÖÆ‰¾(*„cE^‡ŸÒ;ª6ׇˆ—ÜxØUùƒùÈü„nB‡ý6¢" :MÂ+¨Ë§'ó\ÌìÙFž½í˜8fF®é¸Š3pÜ1¨ëm0<¼«^=ý‘ÒÇC”ÚC.>àrx>:½#a¾ôbÅÕˆh…ïÜÌápÌárެæ»ná0áÅÜZ14ê„~È¿Ž|tzS"D2éM4þë½xÛG+6s¢Áч‚’*¸jNã–«qŠmÕ Žl”hģǨ{œ>ÀÙ]Õ8‹†ì] “‹B~¼J˜‡)lŽŒ|éÓãO•ÙM¾ ‡Ý·bœÑ“÷V;›'ë\×FQ¨qLÞ%ª$|óàùc×PÕ ‘¡åÖÉYD" œ}¸E£F S¢˜ãŸÉñü÷A‚ÉGÕ~ ({šf5Âhý³(Ø×•Aƒ5§#¦<ÃË9!´3,ASXâdUñ¿ªè²å×ü”Ù%ólâ§Ô‹aìtešmÉ;ð${Y`#6Š5^NÀÍ!‹i¼a— ,”·M¡ú—OFÿ.y»[ò£úú¤aÀ.„5Ó1$¯‡ædQÎOtää(eïyèB¤S|Qï‰tväÖ–©ÝTÚo ¼€vífâÞB…¦3üýA{{*;?Ø=Là~Ôƒò'¯³b­i±Öôû=”›Þe¿¢ê1Š"?È&ƒ°2 /³43Š7“¸3É?£@4 H“Ä4ŠP£H5ËX£Î5È`³P6Iiߥ¶YŒ›äºQÎûAð$ÁQ2œEÅQvœdÉI¸”ÍIøœ¤ÑQ<ÅÕY~ÚAÀÞQ%âDäAfTèdêïBö(tÿ$…_µŒ„¥Å›rá;+»U1Öã'×ÓÏŠÑœæðõÂ&쬧3æä]éQ·å]¹êC`…›°J ²—™Ò}]?ê¼$‡ÁÍ„ª÷ƒD¢É鸡¢Ä¯Ei;òuˉpJž ¨!.1±A§”l%Œ¨­&mœÐÆff[“Ï«#¥|”[÷½ÝR…Õ§yq_V&Ð43¼1ê«pf¬Þ˜Ìü&`£î”¡¢Ù×½¯ñ!uv±øA6HÑoz¶­4^ ¦µú„›>„byMÔCˆ¥™Ð‚nRŽ«©‡HâDŒ†^€¦o@Åoz£†V]§ÎQHÊ“QÓM×D¹6$ß]ùªÛÒScÈ«ª °Uã‚GÊšll᪴`eשå Z¦±ðØùYËÚŽ£æÎì˜n’ä)«ÿz…è>•tX9å£(U#¼‹Þ ¨nî]k"KkõÂê,ÇÂÞEËÜxÞôì4w´ÇªqÈ ²j¯ ú^—/§#¥m°O$2оד‹ÞÅK”imòÉ€y…´hÁ—/þ ~JKvc¥A[¤ºÅjDZÌ}Ý‘ã¡~b¸=˜‘íÐà”¼2'73N“ð±+£FÒ鶈ԥÑCuºéamÌ1e@©¶;ra%’ÀŠŸ1©4±G¹…F"(sÈãû7NV+“È!î2[•cÓM²&x­ò’-â!Œ '§åêK”°Í}5Á4fs?lÚh^@kc¦È\賩ÎNö2ÑhwÜÔ!ª{‘ÎÖ^¤ZîÐÌ9·r¨t@­Ëªí0£ôŒàkŸÎê}Z#NÕ*/à ì¡åc¯´ï<_O.6ct›ä÷+Ïk2ˆfùéE´ü'1îGñ °T¬w}ñ«¹÷ÚCǺ…-UÒôˆC5Sº£eô«ÌŽ–Ñó2zbf×Ì`«™\7“/gtîŒÎžÁø3ú‚FßÐì,½G£7iv/Mþ¦ïþ§É 59¨F‡ÕìÁ]Z£‹köyN°Ñ)öƒ—lp›n´Ù¯6:ÚFÇÛì‰]sƒ©î×Ýw[ÞèÚ›|}£óorNÖÁÑ[8zççë=ŒoǤÿ~úÏëqÂÿ|’øŸôy uD×û‡üµM£KåÔ;‰7r|?°€O8òˆ?09r•3™9°#ú_:0ª#ãú'û´9Ý™ôXá‘5þW˜ç‘™ž¸ëÜž¹ï‰èó‰]Ÿø÷‘¡ ü‰á5I#EQeUY§” AéµI-ñ.¦Hb‹¤Æxkd1‡ºˆñ ìe7Ä+8¾ARãƒùtãjNïMû8°"æ+ó™ì=I.)í|ˆ¡ÞäjŸofqæéå=]Ŧ‚ïãäÄ„Î*Ã1Oÿ…¶âmS§£ÞÒÜÐ<­ì]|цö ÇÛ©)ˆq€±î£®j¸ÒŽC¶Þ É¿µk»ûçö«â˜\Oó.2ç¢>*¹{œ’r4‡rfqÑVw÷}ó>€7Þ§d™x¸š¤£(6u×1gÖ¾¼*Yz}º9ô\ªLl¡¢­½Ùx¼!´¯G!ÁÒCdÖÓû²ñIïãýé·¿ƒö8Ð<å·Ò» Ó7'Üï²å*±¤­†s ­4Tde’*·'1ïѦ¤¹»ÞPç>Üe©È’›KÃúVÊC²aíÃQ¤rRCç¥Æ)ª³ˆÜ[†+]›úÒÑ-ÖIeÌ«‡t—8Ö/L‰  R¥‚oJycú¤LÉÞ@¸yÚi"i+4 Ö%Í)æ"´åKáSø†¥v‚;ÊÝÊ/k >Ÿž±‡lM¶d…e ž¡Å›*a,½0B!k[ èÓ5ëKbOîÑ⫆¶\¤‰W”­¸ˆ¸Éî ,™¬¢¿pK*ÈŠix ÑI%8­d/–ìÖÜ\²ßKt„‰Ž1ÙS&ºÎDWšì[m¢óMöƉî9Ñ]'ÙïDž`ß“ý}¢PpÊBÙe(¸eŸ¢`d}޲RôJz3RÊ>Kщ):5e/§`ö½ ²[Tô“Š~S©‚gUô´J®WÑ+ùfEé){Qu„¡¹7³Ò›ÂÓ.ÔrAí¨BLQè€cãÚº 1|b N-öàØV†lßPkÛlªzÀŠ9x4<Ž t·58ä²ï‹j`;/·,ãøýá–°ºCùaÞñ³-²PáÅS7Ö*tUœ·”(ÁÒ“ѪªÇž1ò%ˆQŠŒ&Iê!R˜ž¸Î²¬ƒœ‚i68ÎǦÕ"prt†ð°„O àX`Ëëåë5«ÏD"hϦÿt8…”¥§w÷¥ðtµþ9¬¼mØ•H0Èâ3j»æÙ¨‘ZŠê®<Ó;€ ùg6VU6[ HþH-&ÝDÚêÒä杻1òÍÄ °UÿGe kQŸÂ^áw‰9 ‚5pŒÉ¤š˜RQ_&ÈxÙË:è-86û•= sfcm@: ¢Ä°Ãd'›%Tnîn°ú$ß  ˆ€à€ƒ·Ë 2)¸DСP;Øþ—„Åúd m_½+Áidæ›ð$Ò»^ í  ÓQ½MN£É¡Ò¥OG×¥¡2¦EïìÂídàØqM°$öK(> ô>uQo[ìÉíÿ.vô¬`+ęݟz¾žáƒ ­Ò½Q$ƒŸ¯lV&KÛÁ@ªf×Zbò6Ôpëæå€“ˆ޹Uaƒ&¹¢wçLjH`hL^¢Õƒ‹1™Â†Ò$S¢ñ s'±?±%_C‰ç>Ïøx÷zn:–3œ†×sF‰ <¦-ŽqbUÁ›m õÂ$ëêEÃãDZ<ö–N¾ÉÞ¼ acU ÓçÎ’ŽÕa}ó¡. _}÷K7G‡PÄ|²uF×ÂOÆîºøˆ‰\\?½JèOÉÿcü9ïKæµ›TùnÇï§í0În’"™;c8“–çâ¾xL:taE=æ»›ñw-Ü€|Ëwµ[œ‡Î‹Su¼C³|åö ¾ø~@âЀ¥í%úÔƒÖÑ$èco¢Æ¼:™,þÑ| Ñ€6—`Á§‹¼Ž:+Rôaº"’ AÔh°Û[çž¶1-Ð0­åoKja· S ëB¸Ãƒ@‚(±­¨·£ïÎ"ô‹ï&†Gú^a½ ÖP€Çƒ¤à?³jw.² RïD aöíµ.›jMÔè![ÇBëÇéÝ96¥M”&né±\YQÙõÛ^tLÀàLnè`%póçN6 d|HÃAø)"ñ5fS“¥¤É8´ÿhßy.ŠãXØ1 €ö-J2—“ì©©~èŽt(ÆÊˆú?Ë›S4×ÅÌLÀûR­¨JfL…%IBûR1rR©‘Ûº‚ ©z&—i£­Ï°‹å0_1æùhP^»Ôš #A~Spg÷p™ÞÒê 1–à»üÊ#$¾‘e4ÈBÞº¨ýˆD´·A¥æ4ï-ÖÑÎBÖ*åéV)ߘ-Úüi”J ]ÉÛý$| -á±a”#F¹b4FÉc”D~MYe”]fafPn]gÒ}&aè»n4 K£ô4JS³x5¨[“ø5Êc£€6 l£7 t£€÷ƒÄ÷]%ÂYDeÆQ†œ…ÊIʤÎY ÔÒQLåÖQÛIÒ4ßAž6*;Źò÷ëÅeðOþ|Evßï³ò'¯³Bé©Êšü÷{(?en`EFÍdUFÙe”e&Ýfvág–†&ñh—&õé»85(W³²5H_£46‹g£¼6Éo“@7JxƒÄ7‹€³L8Ȉ³Ð8J‘£Tùƒ˜ù]íÅÐäÒAPôÖYÛQÏßQ%ãIS5çA’žEëQÖTïÖÂÃôHö%ûú¯K@cøsþçxuï\Se˜“? 5M©m:WÇ^v¸žÄ­Ø1ê2‰çàÁT‰£8´ñܘ‹C<ÅGGUÏ*Àûp-üQ÷f#&mv­nvJËq§l{A‰¡°ïÆaHv†·sé(=‡:ᣗƒ3°ÉÞ•‹Íî{â³x6Ç;ð#E?Rø3É?Ê‚J Ë’Ð ²Tá]Ë¥Y ¡Ý÷ µtV*çõþÇõ¾ ’Áø‡¿ãþ%Rfÿ~%RmäÜ&Rn¤íFZo&þ&jp grñ;÷8“s9R›óù5:§#¹:³¯=;Ò·3Á;RÀEé3Ý>ò#aÿ¥?þ£( «‚¬ ʲ0!J’´!j¢8"h'>ˆ+¼JÜiðB»;¡Ï`ò ^6ü’¸$:uѼD¬¶¦Q´K¢ÄØœ1]Ä]fG;éy©‡#%°ñÉNç?«§.l­ò¨£,9ÔnÇóKè}š€âý³+/`“ñ‰xßÛÛâ“®rëy¾Àd'0÷cw/bøÖäâ£íį©Eî-üšä»áÌÌÆ<šNøÚyIX«\¿¡~Î=ß‘‚,G„ëYÙ5ðµ^®‚5â) oâ&W[rù7J€PȖî‘g å:κ]Äþœ‰Î¶rtz\‡”íødE¶N4’=QÈܲšä?«%<„ bö4Y(œGˆHnä¡í Szd ÷tÈ<—s—ÇFq¢:÷÷x°UƒL×Y‹Q6ž¢±€Ä+—¹}0'”w<29ñ}¹j²ûpâ:Û•‘|÷a{’¡?˜îZ0Ì+˜MÓ™ñj0Ìù¿êâ{•5D6ßIO§"·§oò179íc§\õ\äVOÇK>7S]cÚéÏOƒíªôͼE7“žVz†Mlu“k"lèÐÜzç4=ƒ¶y†Ý%s¹^ܼ^O9)ñ)1QI–Q{Ùºç®Í†·n䀿.k‡Fó6…¢~ÖÙOsnŠ>ÈT}´ç È9]|1K°.²(ÙAM \þ"’&Y_’®cdâŽ-‚áx®a»ë?¶ŠC1‚Ýÿ†b.ÁÈiò†žÅ½lz3!OÄ ·[˜÷þ”¯·=C–¿‰©GŠ2çñ¿ ÷}™Ø=ÞÆ:.Þ ôørW~D‘ç²à¦ùÞLc9:‚‰j¾ñí¶Œ»‰¤:ÏŸ˜«øªN8™e=õƒå~òä®ýÑÔ?»þǾ±o@î,ZÄιwÁ{kƒ÷¶©-Bì›û*äÎ ±7CìÝ»;Äþ±?Ä{ûˆØ]"6ŸÈÝ)bÿŠØßâCŒÐ##öÐHM6bŽØ¥#4ñˆ=>bÜ%$´‰]Fr’Ø©$v2ùÐëä­Jì–’Åwd̽óKѹux ?"IoZElÍDíá­PÑktç¸.¶ˆè³ I(õ²øæ‚äm¨è+qØwëeh’m‡¢o^ôÕ‹,Ùßn,1k#óö7÷½ȽŸØ¿ïôàÈþÀ/ äÈPþÀa,çÈ‚Î<éȤŽDëÄÄŽ\íÄåŽdïÈdñÄ&|óÄGOŒõÈi”÷ĉ¬ùμûÈÌÏÌýÄíìÿ¨Èú¤0 „¬QH*† rH2ˆ¤“:ŠJ «\òA)fÌŽâ‰$¦2Õ%1 e«.ïÝJ#ÔRñ1n‘ÓìLOÐÏx©´€±Ž§¦ÖÐ,‘±AòSAó§t¼è¬ïΞ©ŒáWœª1‹÷¦€7+£è`=„?3¿=ê ­V|õ‘XTõô¢§aU¯éaʨ0€»ÌúµŒÂrÖ¹•\õ¡ô؈±굦_‰· UE1[æSÉÐe¡wH5ò®yð·Cx`“éÅ2ÄϬûÀ…d‚U½²o¨”кgª,ËJÉæ>ˆEX´6oÒ:¥;8?ð"Æ‹hg",pqƒ¬¤ d   +{1š›r§ 32Q€ý€´TïÜXé· —%ŒzF(U& K7DЂŠ´?$Ñœ–O‡‰Ô\Â" 8覹áͪí|X`o·ÝýÐ#,£•Òëx„ƒ$U-—;e ò6l®-—ï¾—¦©¾„I–z¥ò¦1v‚z V”w«‚4}¸?"ͽ–Š)miF·ï&:ÿR–‚OúÑG‡8 ±!´Ð|´ÔÍ]J_ö_ÄÜ…& Z ž¼)÷mªŒyø„8)¼RMAØ 55È‹ÕßwºSÉxss‚»ÞR¥³r¦KRDçsÀˆe"¢!Ùd`gÉãs”«W¡…5>9Ñvq£5ñOéÙh:Ã{¬B]î8Y퀲 @x´ò€ºìðØçÝ®rBâ5ÉlsÀÐëì˪ô˜2¶"j ÊÙT=po¢ˆ¾jº;y ü„å4Zöiœºù`ü­!£ud6— î“Ñœ2ÛWFƒËh€™,2£‰f2ÙL.œÁ¥3šxf›ÏhB³•h4}·"ÍV¥ÑÌ4šf;Ôè—ìT³áj´d–­ÉÔ5Ú¾&[Ølœe£ñl¶¦æµÑÜ6ÛßFƒÜwûÜl¯üw£=o6ð¿Ñ8ì2¸zкu,A7Ë[Ùbt:hK6J‚éÈ÷W̱}‚ldBP´oxì@ˆ–²1P1ã`¨’’’¼—и*G¥îº ]TÏ¥w¬ä÷‡;{W"òò›yo"¶ó ý øP€¼ñ§„O%+@\ KYDÑÊ–p¸ˆÔE$/c} haÆâÉYFL3bž}GM#ªú wý ËFÌ6£º÷°p°qçŒL'ì:`ÛýNøø;|þ_×›ªÂ¶ÓÇÆ0º(yƒP^° ©8y¤x»Wªû· Œ˜Ú™ Þ¾ÛƒeÇÒ[mÅBM[žô ³Hi,¡<݇°ƒ½Ô° xŠëþâ\½9|ˆ«¦J&ЫZ*~‡«®jººOl÷¨x6³^"u? ({—½ô ð .§ˆÒÕÑ\ݪéýQ´á‚@õˆ¸œ™Ôžyú6³žòþ€h–FS@.¤8̓‡PŒåØÅ2€–»Ù-ˆÏ(}ÀlΕ٤Ð=>ùÆÖc@¶Hñpu˜aµYêCX\ÝÕ¹ Û&PÖ 7<䚘˜dNI­žÊ #%¦©Ñå]]›C%$U4"Ä^†^ZÕÞ\˜šq¾é}-\±;_î©Ã½ôöÒª5 u•±æP4“Ÿ':¼Tk\)€ Q¼ã#7ðküèÑÊ(ƒýÙ_eLíiOé¬[ïѺ¼müdPm…òM`B’ç±iîvI˜ì¨èF°ï¸! ç&ºØÔüŽì‰ZÕ™äÚ‹MDTLù†›Z1˜NwbÄwб²>Jþ$2áÖ½Bz¼£òôÞµÌkM˜ Í‚þz‘È%¯uÎG%íÐæ”Êñ2'\uÓø ò’wÈÄvªzp6W©“Ûø° ¦Æ£bf“³HÛ]™ÈòÏâ6´~,| .çu;H¯öÒ‚w78Š7Ý&òÄq‚ɶǸ˜n2Õ!ÂÅl{±C×AWÖÒ+ЕùXÚ³E›šéŸ÷‡ÑÖ10Óîëšÿ;Îèåõx½»™@3—Ù'˜-ZžG”l™MU¢éJ¶e ¾-ÑÖ%¿Dk˜d“Íe¢ýL´§ù``,n¢N´È :Ñ`'[ðD“žhâ“m~‚P´ ÊFBÁiè݆(Ù½¹E‡£l<’¢…R6YŠ6LѦ)9%«§`•Í¢¢T´›Ê†TѲ*ZZ…vOYü=¢ÇÂ+Z>Þ@ ¢6$6Uzx°6»s‚/l®7@ö»lAÑÒ ÔvI™h2|Pf·T4A£,èH]Ÿ õYSñûíEUbT-fYcÔ=&]dRNFmeÔ^&qfRougÖF…hT~ИjT©fkTº&%lÒÊF5mÛf5nÒë¾ëy³â7i‚£føƒª8莣.9+—£¶9jŸ³::駃¾:+°£F;j¸?¨¼ƒ<êij’vÓŒõ½Æò'…~³“€*qct|;¢|nbðƒº3Ðæ¹C›~8Eq ’¬èaú÷ãÿY9îHR7On‹mºXÉ~qƒ›õ­uQB@Ci]°¢¢ ‚ãE\Ìi@¦T˜ó@«IÌ„î Â8ÔÑK-²¥[Å'x¨$¢[ ÊG âçýT‹9ø¤4g1©²Ì8}Lâ[;ˆ–x¬ Öºÿ*bRÝ}éãæòƒý4iÔ'è7{½À’‡×TÕbÅ.ô¡^„BDyŸhÒXÔþšÏ‚AsÀþœ°]›^>ÊaW÷9µi”eŸV«V_³ ã²k·-T%tÜk×#.<ˆ0¨aBþš&Þ.²¤F#G9äƒåÝUæèp‚UHúËÈ3£H1I˜5d”Ç+møêŽ]U%ŽW͆P¨æ#RÊìŰBÌ…¨N†DÅ{‚c…¦r½Egm~³›  ¨cvBj);ÈBFyÒÐŽSÍrùMhè)CÔ7‡D±¨?€+ÚÕnœ„qˆ¾1Y#}u¨·¨dv_Çu†ðƒ¼å"èüɨ<ç{\Ͳc ¡dŒðt˜iCq§öQ‡Ä,ÊþØL«¹º¿)-©Þm°JpǪ¸=ÊBìÄIüƒ2²ŽUyDÂOª7–s{Q÷Þ•ZgIÙÉRhâÊa`GaNÉšhÒh£·%ƒ¬sïdñØ%9žÍ¢Dâ/¢Î¬>öÐ"RŠÑT2tyRŸž£I‘5{QÓ—DAUƒt…Qy˜”‰I»ÕQý˜õ‘QA–YƒUšQÅ™užQ •¢YJ´¦Q‹šÕªQÏô®Y›4³QSûAut¹Q·›•½QûµÁY=õÅQüA¡4ÌQãœUÐQ'uÔYiµØQ«vØVEÄß/ª¹7ÁÑ“‚?T\Ù_V}ù‹Ã¾I`$JJ)³,¦:›Ì&%t@áHkb+ºW‰iI?KÍ/‹û×”¦ãäyí½Ýî†ÛUÒ5ƒ‘‚]èCK_ê1Ô¦HGgåŒS´ eùÛt!çïÍÙ˜h˜ö`{…€ÍšÅ .Lê¦"[‘y0t´Ò ‘ssž5¡p‹ z¦KõÖi¾a8mTò.þÄf8¤xd)÷úò@v˜°œG6Y•›CÙ'­vq 4û÷°‹'ïI‹¥‘0 â“&–—ynÐÈtíJFè+‰‚[™úóI·¹Ÿk«hn‡( 7ö± ŠÍó†¹$ùt±ÒªXÐÿPÅ & "ŽÔÇλ/r¦`êË· µ/ "“Ìj*Ãïof2Kâ÷"ÿ“)®¸0ìçîÅþL^ˆòÁ .ÌòÃ(PŒƤp|—@F‰äe”Yf–iF!gÐyfhŠišF)j”ªf1k”»F9lÒËFAmÐÛfAnìFIïÑo”GÙpÒ'áq&gér7Gñs–GGuXg viGw–yG!xЉ§M)}¡vË–EïüºÈ¿ûÀÐë çÙ8¡Â ÐX ñM™=¤@n>/bxš<"cçèñ‘¨TVQ…•êÏ¿?ÝW®Z‡ªv®{ÇÊx¬œ¨­‡ê{¬Îçò}¨ïÇú&¼3"Ãà!²‹!ñ""%“"r-#±5"Ÿã쑨 ‰+¸$™m’ø(¯’-‘ó91X3Wy7˜9ïÜ@íÉÔŸÈ JÜ¡Ä.Šü£ÄOÊ &úœ0ÛlÞ·z¡1|MæÖßJ? ¸Q'®ÖE«®¯°ÓUì—Dß|1E±ŸÒÔ*>Õ!‰QÓ“­.0ê—7cÊŒíÚCŒ”ƨø»,^÷5oeD¥–TŠ>PÈ?‹w}B^#)|µ'bÑ©µH^ƒ‚ t£€ý›‹¦‘‚Fè\Ò'P©W ¾É&a‡œRïw¸Û'Úqv‘„N´€<9«‰º0H¢Î³Bz'#øÍÐdi¿4È1E$ðš­7ïêtFMÑôV¨§s£pÓ¿ïù¨Šè¯Ø˜­ËB¦µ?ôü®cë1¸›w2ÒW<ˆ"Á¡&ÔÏuÞ ²í%ÉÃ'Ý79ÈÁµ›Ãž(° "«Wãøƒ Ÿ@e0($ì\èk}õ%ÂÊ`2T§ÄpK~Fiô–v3{Š~ºÖ»BŸQjìm§NWÂŽú ̱ȗ´ëKXBÈ$ÁL°¼úMÍ&6ħpçF•áxŠ2¨šáž¶éåHÚh®ZewÀœ:üA‡6†¨',øj„2õ¨¢Ëtx,‹G[Užp+P—ÇÍ4žaq¶©i,¾ÑÔ %•¦&‘JÛÇ$5š¸ùXR±€[BáݒΩîZ(Ð=|ÄGš_¨`دÛ%Áêåàzh†QR4L-âáê†Ü†€-J,¸d ÷R½ Ä‚kh¾QŸ´*býž»töÞÜ2Ûq%•¨rë5ýaÜC}ÊÃjC/¡5J¢ÜŒ!ÁEÂÍ(æSÑIñ–þ£I¥Ôedo„´Ôs˜î^€¼Ðõ¢Gs€iˆ¨@Xò?“ÿÌ•mÒïtwAâÔ ʘÜÊŸzÀ¥½>Au(HpQ£8ÄØÛ½3÷ëÀ€ö+x\\z°*YlÃ'ÜËÏu¤çëê?$bQS5‡Y•u‹Qט•ïÊȨ›ÌÊÊ ½ ÂÌ¬Ü ÒΨüÌÚРêÒúÓ¨P Ö¬q*ب’Í:Ú ´}áF‰nÔð‰o’GpÔg•q!G•rÖ1¿éœ£ úƒN:*©ƒÐ:+±ƒT;¹“Ð;*ÁƒPuO­IãÎÚÖ/`ìOíCýwuMCÁ¦âèÓF£?ÈQöVeœ|[&ŠM).îX 8“ ›–ñΪ–µRµÎ–ªîÅK©˜ÌÉørY}0’ÜЩèn¼slPhH jÉ> ¢–áúW“ç˜ºçˆÆ˜pûþlÉo©ÈBØ™l7ÉìÚ¯±/@1ô†«T°ßÐl=trÜ$Ü(®“€Ëè‡T}ßÐcÃÈWÚœbøClq°£ÃâŒÊ1~–÷Eñ@v:ø%dçHÏÎ8M±§D”Ô \%îùšÖ*z8a>jh÷ͧ‰:A ™¨ÅiîRZ$vGæ¡Ñ[Ùð€;.Tﵫ½÷B”ûN@–勸o§H‘MU“øC»ÜS´ÑæozyºwXãˆF8@ rëLJ¹3‘‚Î=¢¸ÀD¬.µë IžèQi‰¢­U½6t²WªL,ñNw ÈP ÓÔ¢ j§êd&l APÔ´ßJdzõ¥Æ“qF±ÐJSïª@4Ú÷é²<î4°»æs\Vüø °íad”À“Öa›ýF¸Ï…ƒ£uñ{úÔâÄ!,˰”ìj³g6Ø2Y"ˈ¥ £:‹”5uL›W}Rx“Èø¸Ì¼ýàE  š"•ÅÿÆÓ2c²tPý76ô6êhCUñdâ‰5Z5õœ0/ýÁöð>Þ"ËЋ¦7Ý£®Š”ïºgµ¥‡öÝ–Ò¢IV]Ñä¥-&ºh6G~¶s!Èeª®’Dmtx@ÓÔ§£ƒt>XŒ•µÈ3ü †@lèú£æà\¬ ›dšHa7Ö•ö05}iD#÷¦¦bx¬'¥CUW+ãõS2"±µx&^Á­!ò¤$ BìDŒZŨeLbÇ †ŒZɬ¦Œz˨ÇÌŠÍ¨é šÏ¬ MºÑ¨+ÍÊÓ¨M ÒÕ¬mêרŽÍúÙ °úÛ¬ÐÞ¨ñM"਎*â$3:ä¨SÎBæ tN:褔ŽZê µÎZì¨ÖŽjî¬÷ŽŠð¨ ì¡"™çïW”(S&ƒ… w•"ÇàžQ=!–”Âþ—Ø ‹Bâ§4àƒíAtòÀð€àeÌö"'0r3%é÷‡;KtßHN|áD(~'gJr"-GRóÚs FGâtbVGêu¢f'òv`wGòw¦‡'ù;¿ü|©é‘ºþÜè ô‘bø‘¢Iü‰äŸeI(ð®#H:ƒ(DˆB…R† vˆbˆ,—zŠ$·rŒ ÖˆbŽrL|‚m0d˜V8ÆÖºw™QÔ's¢ÿ=«ŒýœEÃ×yZÆq™O—+°EÕ’nj7õ K@À¡dÔ$×Z.ð8Lß!•Ô ãCöj.*ÔàÍm0|‚4ß5š55ß+È!À|yR!ba›¶‹@ˆQäV%ø}’*û´múóï“tŠêø„C¸²~ñvÛªÀpĆg®>Æ! >Ìr$8¼W)ÂÌò1åO¨ À±Ë[dßA¡¡æ†$ó„!–&Š"¸²1%EEØ$É¿ºž(Ëg A—c©ª¦Ùò›\¶HR{Epö´Øò“BûN€[‹ß=úuµI>Eñ²êšA²$zÔ*yH=¼}-s…Ò4qfÁcYA›ýq'먨Ô­YS³É&n±Tˆ–H“Ú;Ðqû?ךꊮé`•½YýÑd‘è<9Ýòú„¾"xÉø €èº¨ÉA ;)ìûybþš?™E¸È~™ÞÚx«ß{>oï‚ .1¨<Ëõu 7ß;M‘±OÚeyG¬x J×ÔðˆB:m‘HxŠQ‡‚ÑÔ“°Í~G(« OËÞ4ÈeT¿¬ÊÞ€œ¿À’šŒÙ°<€µÍ`3=ÑG ÌMuEŸµ©ŠÀ6ê8] ·í5Vöºyµãﻨ蹋ôÓÆiwœH ‚êâæë&¼îØ7 4B ‚x-Ï=@­NÏ4•+é㇕¥ Ob‡ìÊ}£œü0Ú¹.€¤ƒ7ˆT¦i +±öa‹FT¢7›åÑK€Ò±Ñ2Ž—Q¾Iqk4ËV¯£AŽöÙÈ ò;ô/¬òxù¾~uR©Pp*žÁ.£­Kz\Á!™!€VÏrTÖ{›HýE"|ºò {¹à’Â"¿öi»{×EôúÃ8ʈÛ;ë5rb3k6òjï61s#w7r{3û7ðƒ}ø¿82#C9s˜#Ë9² 3Oú'‹:2¬;r´…;s¼# <ĉ<’Ì=³Ôßiì‘åþ™ò‘IŸ¨öŠ™ú™ËÙþQ õIQð.8H‚„¨XˆŠ†´Á!ß;Ðð÷+ÕƒB¹èC= q„qf f¸àÚJs‹J?8”\½~O‹¬ý!wjYp)A~Ÿy‘ ™‚ (ùýñž"¼á— Ð$'@<J0Ñ;Š”a¦DE ê”À®†¬,Bi j X\ë–—À¾´0É p €d†,#¨AϰhN#°š¡×Î&ð6€»ûMÐp#¼Ðç O'û ßNøwÈ#€ž!vY7DÄX6͵»bƒ8?ƒ›»éñÙŠŽ¡³ñ‘›,jñðÀ°X>Ô€Që ‹¸?ÛQü6d(°|ttö:FzÁð`äÃp«õŒ*7F*“³†¼hÀ´T‘„†ðHïçÁŠÊÅíeÑEî:ò\u¡fâÏ‚¿ëM¸ ÂEêûÐtºÕ y³ L ÊŸ,”¬»[JDZ8–Ó;8 ‘{ƒ–]½Ó íƒC¾ ú àöÙìOµ7¨…?06`WÑÊÓ«UPxÝNa·0§¥q×Ò>9³TŠˆ¸vÁN›(›^ fê›RÁH_T„©m""å¸ààM¾QUíwÒæEØî"ãb¢5ûóý¿¶Î%ÍYd¢ó,| ËèMtzr÷?¸ß ‰êrÈC» Jeè(´uÏÃéBu;PŒ×`EV¶þœRýºš £}óYÑ7_£Ý©k¥Ñ.Ý4^1œ¶32±½Ç4Àû6º«:ZôSÓW«k­+¸UâýÔ€]#þ¢"»Î\thª]Év¥»Hᮕ»–^Õö¬(c]¨n-ˆ¦rnÄEià÷‚–rûT¨×¤¬;X Ù¨ ¥Q¦½µFìÙ~N;`+ ƒ“†þo¤2Ä[23R†1gÛbÎo}˪Â@·óXÏHìÛY$ÉSÓ…"ñR§Çg“|q£‚ï)Ë’‘ê\l¥Z—¸-ÍO‡ƒaiጻŸd/¾h6ã98Œ{ÅíLÊr†6·¯¨pí3g˜!J²øiD»©ر(vxìĉ_ •Ø ò="dhÚÌ5®g]ÙÇ® qGF™Ÿ7Ê1Wž•|I»ä'T8œ£ÄýÝÕ¹qEm-՚離Záªø$ÌKÀ]ùÈü’×áÕ p ë#+"®ì*Bž hnÌ¢êé¹]2?håöæÁ¦/A9CtF±Îd[9=g+ʤ"êõúÖÚó2÷ZÛb>°Þ¹Ó[íÍCFéõf™ÊTžÿ‘ÉÄJ†ã¬ÌÖ¸³X*®œÊy³ÊËÝ}uîô­ÌôíR-&w¨™Qbêaj¶£¡+‰þ3ž¨Á+Ͳ‘†-i´<ÁK [°Ð{h <ûˆ˜ÿø–Æ·h, 5£5°¦°‡ðS0y¯/MëÍç~mT>µÁߥ­Ï¢WyÜÿþzF$<ˆÔ0㨪Ê<Øy0¬áÒãég´­áضô/!ß_4ê²â OY˜léòÅ­,~uyôõócq­‹¯/Ͼ|Yà-ð¡&žf”4¤$*žÊxªS“¡’.Y:U.ËÈ?–2øµ}??±jÉ÷vªºuc_+R|*¨äÛ̧–ç¥V¶=åÏT`,_íŒlÁìR‡d¥áí+оDÙ>AùÐ]ó¿ô¡ilø•bìú#V6:I»Ôt\rGp¨\ó¡#îK-ðÓxá'Ü! _~TÑg,ÜñV×¢Có¹døèÎ4ÓWÅ>tÃOvÉ[èâlVNø:‡pÚÔÛ•h-9ëòX)&†ò Ká“x‡F¾“lTn›O)¥(è×ZûDL@Ü®w%hhØGL°¾¢{¨ógÚcv 3q;sÝÒGd©‹&໓ÇôûÒD‡„ØÑþMêÎ!¶ôŽNÊÆïC®a!¿2 m²G–9p|€fÕó¾_ç…¶ò²´ÄL–,s¸,aÇI4^ºlwN÷Ûò6ãÂjDlIÒ•—Çq‹)€ÎãÉÞ!Á°¨%›,Ìä’ü¬)÷Ç™i,Ȱ©#[k¡¤§n¨h‹=ã?âÅ“m1mÄ;‘« ‰à(@ÏŸœ ÆAÏöVÇ(Ž[ã*÷÷$éJÌnp€¡t²1êçbv„þeLо*ØDì ç% Bp±–‰¬Ä=ìòÍÀ4Vœ|pÀjîÑ·MÀPÓÆ’_+©HËæg„­vêñæõŒ¥Ÿ¼5ú£÷<®'JÁ’µ%èà: ¡Éô[°f€kV÷}SéôÈ¢™«m€´õ©,HiÄÔºZV$N\=˜Õp6âõÔª"5_Ãb¶Úrb ´ÃËð­‹æZc¦)q-ÍzñÖ‹»µükõa+×s)A[…º–°½ÈíEðZ&÷BºÚK%ÞKõ^Ê/µ~c¨0ãŽ#T`ÁG¾@ŽM8VQ¸ 3ܨh‡ÃƆTxÄñÇO* b‹.1FÆšÙ8†S0ßih÷tœÇyüïŸ?"‰Â7x=°›ïŒ3·—ì¸×Á¨Rå÷[Kv¾Lõäúõs=±cA³åX¯1iè+VÏ|‡aë¡24Æ¿\I•^Ô/Þ—Z ÕÓöó y„<\ì8Ey©3·ž#6S޽;ÇA›dlŠó5õ܆ä;Ï‹ ;giøQl¿Â’ñIOökÇdÛ€@îlyµÎ8µ}ÿ~ý6.Ï_¿.¯™MÇ˼˜9N´kD GÕg.®H5^^ã}“ç°¥ôj–Γžÿë×Eø¼LìCÿúó04“â endstream endobj 2455 0 obj << /ShadingType 7 /ColorSpace /DeviceGray /Decode [ -8388608 8388607 -8388608 8388607 0 1] /BitsPerCoordinate 24 /BitsPerComponent 16 /BitsPerFlag 8 /Length 105 >> stream ÿý€3€€5€ €4€€/€€0€€.€€)ÿú€.ÿó€/ÿë€.ÿñ€3ÿ÷€5ÿÿ€7€€5€€3ÿù€5æeæeæeæe endstream endobj 2456 0 obj << /ShadingType 7 /ColorSpace /DeviceGray /Decode [ -8388608 8388607 -8388608 8388607 0 1] /BitsPerCoordinate 24 /BitsPerComponent 16 /BitsPerFlag 8 /Length 105 >> stream ÿÕ€!ÿÝ€&ÿä€,ÿë€.ÿå€(ÿ߀ÿØ€ÿÑ€ÿÊ€ÿÀÿÉ€ÿÏ€ÿÖ€"ÿÞ€'ÿ×€ÿЀæeæeæeæe endstream endobj 2457 0 obj << /ShadingType 7 /ColorSpace /DeviceGray /Decode [ -8388608 8388607 -8388608 8388607 0 1] /BitsPerCoordinate 24 /BitsPerComponent 16 /BitsPerFlag 8 /Length 105 >> stream €%€#€,€€4€€<€€6€€1€€+€€#€!€€*€€/€€-€€(€'€$€.€€)€!€!€(æeæeæeæe endstream endobj 2458 0 obj << /ShadingType 7 /ColorSpace /DeviceGray /Decode [ -8388608 8388607 -8388608 8388607 0 1] /BitsPerCoordinate 24 /BitsPerComponent 16 /BitsPerFlag 8 /Length 105 >> stream ÿè€&ÿï€,ÿö€1ÿý€3ÿ÷€5ÿñ€3ÿë€.ÿä€,ÿÝ€&ÿÕ€!ÿÜ€%ÿâ€'ÿé€-ÿð€3ÿê€1ÿã€+æeæeæeæe endstream endobj 2459 0 obj << /ShadingType 7 /ColorSpace /DeviceGray /Decode [ -8388608 8388607 -8388608 8388607 0 1] /BitsPerCoordinate 24 /BitsPerComponent 16 /BitsPerFlag 8 /Length 105 >> stream ÿÁ€ÿÈ€ÿ΀ÿÕ€!ÿÏ€ÿÉ€ÿÀÿ¼€ ÿµ€ÿ®€ÿ´€ÿ»€ ÿÁ€ÿÈ€ÿ€ÿ»€ æeæeæeæe endstream endobj 2460 0 obj << /ShadingType 7 /ColorSpace /DeviceGray /Decode [ -8388608 8388607 -8388608 8388607 0 1] /BitsPerCoordinate 24 /BitsPerComponent 16 /BitsPerFlag 8 /Length 105 >> stream €€(€€(€€'€%€#€€(€€-€€/€ €4€€5ÿý€3€€2€ €-€€.€€-€€2€ €3æeæeæeæe endstream endobj 2461 0 obj << /ShadingType 7 /ColorSpace /DeviceGray /Decode [ -8388608 8388607 -8388608 8388607 0 1] /BitsPerCoordinate 24 /BitsPerComponent 16 /BitsPerFlag 8 /Length 105 >> stream €5€€<€€D€ €K€€F€ €A€€<€€4€€,€€%€#€*€€0€€7€€?€€9€€2€æeæeæeæe endstream endobj 2469 0 obj << /Length 1340 /Filter /FlateDecode >> stream xÚWm“›6þ~¿‚ÉäžæM`®ãé$MÚ¦“LÒÖš—~±0j@Pö]~}w%acŸÝ»éÜaÐòh÷ÙÕ®V–•ùVE^/¬¼¾ñ•Tn-ýðûÏ7Á¹t'È—«›ùO„Xïe~X«bªjµ±>Û?–´í™œ¹QÙ‹Û™ÇÄ~I;¦%u3sÃ…½*ÖÁSê©Åì¯Õ¯7¯WÃ$ ŸÈ‘)&g“†‹XSÜHºÿâ¿s*¾-û­¤÷Nͺ²eb¹®hþõ»¾äùW„À8¢Q8G2±aÅ5“[¶ìåÀ€×÷è0rÃÄ‹üPªèšUˆöüýógÎ{ÇýôÝGP³9Ì@Ÿÿ98úÄK‰§Ä#A‚ÞÌßÔIl½jn~»û˜DÉLì_˜ƒ/øÛ9Z´VQ7kþÏ`´´ç}Ù ½~× ² ¹~ñƒ¸ª¸ØŽJÂÔ¾7¸VkÌyqðå<ìŸP U5òP4RóèËY )Æ# cDx*ºA ‹[n@à~ô˜$ön¦¸ÌÜÀî•:!yVmô )®0„wbÐï ÐÓw À/βÅîŠ; JÙ`œö±,ôê[K%­Y/yŽãôï«ìŠë¦ôz‡Æ Þ®*X7w˜‚ÔYcÖ]צs'røm`M0]RL\÷° ‘@/¦Î‹¾4+(!¥8L}óOV±åy?H˜HBbïXkXpX;äÝÒ¾Œ¦o´K#SªŸ!ªme´§°oØQJHÖŽÎ4p’œÔ$¹è5F K%f&廥ŒpÝ4ÕHj`ÿÆ–­:æŒÛÄ4z’Q®é]ÅĶ/—ã4-ÿAß|}»=£«… ì€}a"rÁΑTވͅ-±Xǘ@Íê‡e>HØúz\T‹¿_SiVI —/ð7rF¦rËE4,?0ñN‹¯¥¥›e^r’'´ÓIÆ«jèzI{¶ÑÉÆÅIöE6»£u‹-欯„qæùYbE±ïùaüHoÑî~¡¿œ+U\'i³ˆ‚Ô[@ßz‹ý‹s¥Š…G»ûë[/›Ôè=iöTjýµ3¥çêÚ’IvN%NBXù§FiD?Bå\éGÉö´xbó‰`²JÌ(5¶Â…g¦Ù/¼È´‹À§ðÏ.IB{+¹N„s#XM™„™V³*¹Êr2=*9(I°lqˇ}n=˜Ü'“®Lì%¯xÛ›=±ßìfØ}ª •è3ÞçS Kì¡õ™~œÀ1¶o½õ›#±£WúŽÞtîH`ÿ‚k§¤š9X'û„vÌ”$Ͱ9Ö5H¨W©‡‚U#Å1Ìȱ¡´hHXõÈÅ冇sT¤¯'>N§£Ú?(€ný©¦™’è±0hw¿TgJU@ʾo»Ûù|ÏÖ•yÉwÌkäv®Ûl˜Í'}–­ç¡úAáDѵ ’ýÞky+yͼBÎ ±œC ê¶oz6W1™_ÎqÜooÒ¼niZRwzä5 ±gáâ.òÚñ7[ÑHö¢k¡ÖONÉS§Æö"›¿Æ±;eÇòŽá¨Ì÷ˆ8ð{õ¤Ýå´RvßrÁ¨4}çtÐlN7*^ó¾3~ß øWÇzG™w`äû—úFƒŠ‚ÿüø Ÿ¯2½£w¼Sȷǯƒ;ø:h›Ž+ï_‹Í‡N…ϱüCñx‰¹¯¾ãÂëØåq'ËNJíýЯàfthÂÚ‚ õûKŒîÿ'£«¦±Æþby°: endstream endobj 2473 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./grid3xyz.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2474 0 R /BBox [0 0 222.99 254.87] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2475 0 R >>>> /Length 5730 /Filter /FlateDecode >> stream xœí\K®k;ní{{ŠH‰úŒ €ô’ Á@*ÎkidúÁZ¤¤mûúÝJuS( Þ]4õ£(þ¤}þëÊI®ŒÿÅŸ<þé_ûõ×ÿ~Øõ?¹þù!×>òõ—‡Ô>’Žk6M2®?6Ak¯i”ëçño¿`2©Û5»¤¦ó…IºŒd7&éÚÓl/L«÷Ã¥uTüòÒ•Œ™F#W®)Ë%2k²7®¢%åzç*ÚSQªôdåÎUU“¾sͼ浸¦%³W.³œºÜ¹Ì,ÕúÊÕ²¤bw®–[Êý«ZÒ—¾Zi–7®QÒ˜/\c¤¦¯\³¶µAÁ5-§)¯²Ï}¦r—ªæQS~ÝF•^^e¯ÒÇ»ìUkOr_£ªIo\%÷×Ò"’z㲞Zájšê›âdIöÒUÍí}µÖœT_¸jMÓ·1_}ˆ ƒ¥wMÝE¶)EyÁ­Œ¼ð-rjÃû¨z‰õ µ¢qîü7XªèûƒàE¬K½ãž:`_ƒ![*“=,‚`ïK½¤Í™ZÃø- ݘs("(?wJKâ¶½´XR§6’Fßøébzã˜=é<¸åœLöÏDzç1[¯”Ñ¢—XÍÚŒµÚ)Žçdžþ<þã!­Q‡¥—йüq£ÔêëlÊ#Ýjʘ­ ¨‰ôV0f‹_ÀÑ‹sTKÕŽZ´2S“»Z´¢Ðãá§’3ÈN&¬“ô¦I;[ˆË ³è¶XR¬¥öTîØ×ÁAQ…½bœ¥Ô$¤fœqʧ¶PK9vÒ óö•·Y8[¬£ŽÑ¢ÎØëà0K#4l`ol¦‚•ç†9<]º ëÃik÷¾_÷ãÉ=ÚãrØ£b©Ù¦HÓîãÍCÍ•ø(’Ô|mÕg"#U¹^ã.\ ãß[T£~ml5ahm0ÊÒ›@Xl00˜ô6C|®@P µ#¾ÀŸ›àÍSLÅÉÂJ ‘±“¡iZ·â'gáZÒ7|V±(P½qÈ€uåµ¹¤êðB]„,©ÿµ¼Êúu7|‡fM‚¥Îœ„¾ñPÔ½Ó,iNÇ…:%ÔÊÀwŒd8cú¾Qúè8Òz㌣ŦTœ¢P†Ÿp§Ð'Bîi°Ï)pÔ TKSÙǦhšÝÛðôVõÓ=2<ÕœG÷wÊÏRf˜b´2uJ+Þ+OßÂ3#Zøé¤3 صÚ︦^÷ÏÇ¡ìy Í|¡ ×2n«Yû´V»1åñüØÛŸÇ¿oKªˆÌDn®Q­Ïï£ßp ר¦ƒ1`¸F5œ³²¼ã‚ÛAªiÆÇA.Êr7 ÷§¦e é„Ú$u=R«õíÊJ6§p ¹(?wŠbƒƒ$ÅFy°;È…ƒ<î 7w¸Æ8ò>wwŠ;È³šØ’½Ú…]Ïm½;HEØÛíæ Õrv£ïRM² wj2—+rÉ~ݤÐAnåySŽp‡Ã$•ŶTC"1oþQMÄ­”{?µ\ÜzŽeÿ¨µÏ$mûG­=#N_þ‘â™vó܆1¶Ôjy›E‚ãã7w‹Z­¹{r·¨ºÓnnQ+¹ŽÔÔßñšþq‹œN™7·¸(Ë-j…˲íµ¶Ž0ý89&[ +^ã.~ñp¸_TÓæc¸cT“–ìîæÔ²'”g:í…oëX”QÝÝ,Üác8FÊjÈÍ1RšÔ{wŒGÚ¯ûŽQRs­œÝý¢úá‘âZ7—¸,ÑMöT§¯lŠuM•gR<¨ÌfØ¥Yn¸””‡·JUH‡Á˜`È:RÃ<Çô!ÓM¸ÇÃÑ \¯Z? cç\Þ›’9+¸â'œXïpæ ÇZoCÜÜÁ¼o˜á)]ó¢x\…>{½cºÿ…cŒŒ]¯#„ ìj„.cÀ—,LçfÞç☌ÝÔÊôðhã%ÝMÑš"®aˆ§ÊŽZ¨ˆ‘ôšhxèæ~Žìêì~n¸ß¡…Y†_§{pÊÏm‹ó cžÖÞ)•uP={.©CµœNÅB¯†ÿÎ¥j>wuOw b†…ŸÕŒ²)?ï Ï`¡Ìœ8û5…2Í Zé%"e/žŸÕlɼ:þ*á PŸQÔiÌ·2LFÙ†ÞD5øq4Ä•T- 3| 0 àu8U4ð™cvÍBÕ£oâ˜!H(ã°Ã'µ¢¾8÷–89À2`ærÝŠް—E|¹Š®o‡±æ‰ƒÎ%"b®¹»<×$s¸ß½Œ½Á-Ês»×›s/èÙjl(NVT¦°¢˜ Ôïæ`Ï zÀê5ض¨,ñÑ`‹svŸádͺ±h 9.ŽR‹$Gp8S®ÕÃÁÁø½Jó cãîZ㘠†›ÅÍ1#¾<¸G ©kë\3 Ì8w¦¨knçΔ4–á!N€;uóPFEL£uz\F¦‚ÔáU“ƒirÑǦИ÷æ»9Äý!ù•rý¬áòyN…‚Ãx9øÍ#£é™OÃÊY™;–Y"H¨kF3ÚÍѽĆ:Añ_½COvP³k\Âp)õ=¿¥Í{ú»–ó»FК½ÔvpYêFëÙö6“‡¶º&8f wí‡#²—\aw‰Žf]Ê¥´5´ÑCJ2_°ëóðÐ1Wܨ‡ÃUØõYè» Âg¤y¼HŸ§ÔñÁnàÇ9´yçð“zðÝ2?a¬ßëøªXâU`ßÊøRë_¹¨³"Æ­õX¦—lƒ‚úIY…ðQ3fˆÏŒ1lPlŽdÅ«±š•‡£º‘øãª¦®^#~›èž¹DR1œµá\$t¯áÅFÒU+ï–±%]Gª)Ï¢ ³¨»Ï"8uÖ55cåpQjK­zE]EÛ c3*ŠÒ‹Rx°«óáÒPKÒé#ë€]A<Þí¸'óÒí¦Ì4QFY,¸Fpæp–Mùq?;æ­ä×.>ƒ.ÊšÖêaãÃñóc¥L1­ò<I/î×A©lUç°Ôᯘbײ§nV™‰ŽŒª‹—ÂË„‚öq"Œßä†uât-Œ¹c[ƒJ†[y¤‰2(3šz &ìƒYÉ@š[e*rÒbZ¾®ª©ôy°Õ¤,JëiÂ1§C^½'AX ?÷cš*‡£NÆ™£Y*sa³”ÍmYPêð]„ +õ÷ oCläõz ÜhQø ×¥›Ò!âÌõ-‡°}„€Ùî¡ D}Á¹çÞ# ‡€ÑQwæÞLÔC~ú¥!tbsf Âßø¶AAò`ÜŒÌY”ÕB™uÞÕ?D‹bŒ_J¥Ïž/Õ¨ºý•p×vFÈ­±®ÓÚܶ²1c_i­!ÔøÀbð¼dQn²î=ìcÆz=ÿXÖ ~a·1xùÞ£.Êš×êá`#ðóc­4]hóY›w °(–Qü½áâ—#é†Ì]è Ñ…H$n¥_]Jj(©£ÞšÛÆQù%%sÖh'vfQ<93?ò>ö¨¤ 2½&¹(ff]z¡ÜUL½è]ÇÆ1‰~(?7 îHK¤TW«êëBÿp˜7DG ?]tdq(ëW7 Ó»@‹EÙ“@›Ú^(’½—XJlÈYgàÄócS©è£Õ4/–t3kJu ¹`ÿŠK£åË •i. VMäB!Ø®-Ù…2°á¦ ¡C; Õóp(k~è £ 6P)‡Dz¶ „iÁÚë¸Z) s ÇØÂ)‚œ†“D<7cHªßxa(¯ø¿cN…k†ÿ6Î PÙ˜ËΨÅk0Tu FQ(%è¸î¥ȱõ V³!c 1K÷Sùº ,TíQ-Íê[SZê› CyµRÇH’¹¬æCH¯ÏC¸¥]°þ •XxX‘¥è½EÁuú­n^·«#Ç3“ˆäŠè¼ÌfˆŽW»,Á—²E·0T¦.‡Ãô2ˆ‹ÝÃö£û¼Îl(õ’Ù¸ &ïß–Xs½qd¤ŽÃÇ0¡˜Âcr AºÎ×ú"ç×@P®YY7FÊ0,à ÌÔ²]wÜ…¸ 0³ð-2*2裢‚‘Å.dÕÕ«œ…¿…Áî”2ø…ïWE3n åŽ;nø·¬!RPmÞÇ¢XÜý·rÓ‚iðèä, ÇpÂÏ#\ל›w‘׺x|°*‚±…Ÿ.;‘Ga5üàšÓØC Aö$JO/“ÒæÄ*|/Î"v1eºQ^Ôݪ+í×þœQ÷hh \kõ?®Vr+¾¨¦tŒËá|U¡©áÿe0¤IXº&F†ˆ_6%þÕÚ²fmrøF¢h%Iò¬—4Œ•™Mi©GóËýd1võ§ ŽÙ‚#Ž>XnœÞ†8¾KIÁ-h7_[ÃËÍ%‡ÌÍóà3cÛ*onpÞàšPòš½*RßyõìÓÿqJCÜKY_ÄÃ.¾E‚æ<âü- TÝ9øª¦[âì°¹­,H~¾<¿ó9f7n•[²Œ@;ØX*­Wi© –Eö¤Õ«P_¨˜ k¨²Ðaiš(´P/Ó÷_³y zI|òÅÂ<ÀêeÂÍ¡(ÀĆ42-•¾”rÕ%'AŒ×/2ÐRvT²n3ÂsÛV–œs† âƒÏÐaO&Öÿ@š“ÖèJGââ3”ï¦^å;E¥L‚ÍÔQsÛx¤¾kQJ¨^ƒæX‡-æ“N–U,vç jÚXº‰G8󜞵6]ÖùØêC£‡håÎÀºëξ,6 o!×ÞaÄŠ‚dÙ#˜+C˜RiÞM¹[ Œ”Ÿ¢v Oo˼˜_£º’*< nÇÊZöœ4Pã8Â,õ7®~©°¸†{Ñ àzr¸þ¸ Ãk ý}¦ÜYItï½Ìå¯+·¸ËBêˆwZ¹þí¥[<.k^:Ì(ÉîPª¨µ¾u}ŒÑb0CÈ9&2­_”æû.Ô¤Kž:Zצ”Æ´àÒTHÿQ!ý]!íÖ˜pãõLؤÁÚGðBv~¢êOZ7nitD)«í«sÇÏúA‘cQ~xž™û& HwëqÃpcNg· ´úV ò¶6œ÷ôw’db½‡RÒ¬èÂØ `|_ ?*„!y­WŸ%ÁèVW¸ ”ŸCQñóÀ«YxøEé3ßþÝ’u7Òk@§àýÊàB6¢EÙFe^­ –:Ò™\6Æt£Ÿ@5 àöÖÕÔ(€Ð°n =)0ï».“$]Ä›YÙ½?‡²F‡)m¬]oJ¶èÄ)kÖú6 ã1Ä˯ul J®ýÆ7Às`ŒÙ0Fm”ÄóÁÐdvJê_Ê«´ß÷ã釈i>Лü&Z†ã Š Fòx-‚ºÄÁ¡~‡RÙÂrô‰Ü3OÜ~>,RÃÍ;0„·ûã`·½ÏǦhM®Ú`ö÷øzÙÄ”†Ï*(Åð¢jò»4•« ’rKf}cA.‹œEA*Í.ãÉ1¶¿ô¥ÍI}A‹Ž]D—T ;XS÷kSŒ)Öáë¦òôƒ±—’±þEÉWaÒÿ•½H”9Cª8µÒ•å?ߦ…p‰í­›ÂGP¨ÂtI‹W!0WWU¼¼¯uG£½}ÔVÎ5 d‹#‚Eâ š[‘À3>ôº03+¾­|‚ ž¾/ü|˜øqÙâKžÂº¯ µ›ïu\àËn„´jÔ÷š,úÛZ€w›.§àË÷x¸ò.<àX Øc:í@|™4å*jÈûi]ÄåP{¾ e9µà£Pš‰Iõ®âÕšu`j¨î9Rµ§ÊS$3ƒ†(ð›É…Æ ½Ôßø™ø—Ò‚L¯þ¦¶ÀHóEN3+dù—?)3(ÍÍüM™Aª½~_Ο•Söí‹Iø @yûâx}Ðþ»}|Û¾LÜ·±÷·í{ðŒûáoß¶o.AòÛ·í›Kµ®)~~Û~¸¿Uûõ·í›‹7bo_æïoÛñ¿÷µ¾m?æ…ë—oÛ7¿ÕûömûæøãÛ·í›kâñ·oÛ÷/ß¶ïçâ·oÛ×DÝï×ß¶o&)ö¾çÛöÃÕ‘þ}Jþñ’“·JÓÉK|1ÿù’s/¸—‹ýxɉדH?p`˼¿ä\Hõ¨àý¸|>êD¨„-âo~ý¨³ cìåªøÆzÌ/:+]}» îÍÇ—7ø:+ã wËŒÑ~+æÏGµï–ñ¨+TéÓøÉ|ZÆØ%íÊPú×–qµ¤[ñGþ¯–þûû_-2ÓÚ•¯ïUkIúþ—¾(Md˜ ¿ß+MPϬ×ßÖøúXq…*ò›—Àš‡¥ò›‡À2ñ•Ûߣ3Ÿî'Öœ§%}3/Çûü¹`>óã«Vª/¾Ç™ðê®Ï7¦ãzœ©OÜÙ½ýõ’ãyœiðůŽÇ™&>Þïïeû`ê°oæ¸%2–~éuSËÎð8`*Êo¾øœ`— ò—LXîÛßo¹yœ`jøºùÍŇ³˜°’oî&xøÞC–ínSßÕ/¼ÍÒ,|¼èÃýËã8Íû endstream endobj 2476 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cylinderskeleton.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2477 0 R /BBox [0 0 100.06 100] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2478 0 R >>>> /Length 9285 /Filter /FlateDecode >> stream xœmœM®,Ëm„罊\A:“Ìr<³44:lzÃo_ø‚Ù÷I¶`Á÷UŸ®®ªLþDÉúï6úlƒÿ{ÿþüöù—?ÜöÿóùSóè×wþú÷Ï¿þë/ŸÝþ÷3Û¿}fû¯gßcÝ6Úþõ³ÏéÛw[«¯í·Ï>Ñ—G[»§ßÝöÝïlëöe3Û¾Öm¶¢ç=§ý|ö]}ŽÝöèÛ®·}95Ú¶>§s|ûåØûõµtFòÕ¶w÷uoÛ1»ÅnûôÌ3ÛïcZÛÑÏÍ˱úõvF÷«í8}ÍÕŽõq‡·ÑÇ9íxi['d¿s¶³ûÞ#ÚÎÙÝV;—¬í´ídŸÉ¹úºÞîèi›3ŽnâZ¿ûr|ûž§ÝÕϼ¦3²>9}±gŒ¾¢Ýè~œ›=Çi1ºÝëíçs†w÷ÓÂúÌÍ7V¿v[¬>ýÜvÆéãF‹Ã‚nqûòÕx¾³ýî–£»¬9ú°ÛÒú`É>gÎî#[®>çŸÖ÷ž-OŸwf;ÓûÝ«et[f:cu}ŽÑŸ<}Z¶9¬ó…3og9æX}/=ÅŒîÉ §ŸË7’Çž#zX;6dPsŽž¡[²ÙÙ´9½Ïí˜õ3½Í¹»žÚ¼ïlsÞ¾Cwd«ïË Ùcd;¶û¶6Íúس;º³i«ûÔÙíî|rúŽÓŽEŸ™mZô¸»K-ÓôÙgÝRö8Þ¦{ßíø¨òÝcE;>ûšmz¼o»uÛm®Ñ3­÷>yàåýFê8}µ¹–¡ØWose_g¶ã»¯ímnÓû[â½ûÌ©Nî`G,¢_9á<,b;} ½GÊ.<´X󜘵gÉ7²Ë=ûæ±Þ©3ÖèÃg›ww6a¾ÖnóFçûkô»Í˜ý¬úþÔnÍXý°(kv|uÆ­&ÞÜfŽ~îy'°<3]—<Ëjòô{LǾw›Y»ÊÖ÷´fÃzÜÔ7Ø»Ë=8>ÑlÔöÕX±Mëø¹ŽÍ›ÍÝÍnqO3LÔâql7³Ù×®oz ‹wW7›Ùíw|¯ÁOúè±ë¦X7ó¥=ЃÇnæ·ÏmïÁ±x[CåØ<š-+›üõôsÖÛ‰½n³•ï CödÛ˾=u+¶O7מݎ5Û©Mc÷Ùe;ÖÏ6óøvvº'¿ýÄjvò—A\Í®u[&ÈrØ•kqÂî1O³µ[¾u¢Å”cÒÎc+-§s¯ÝŠxFnr6ËY‘×Ë]-WÏUV>u®%Žò;_Ñ|Ì 5– v>Ö×-d!>n T\E3Ÿ³Ïy XJŸK€3¶6É&Ø©­¾b5·¡m#Øðn.kå ë–·¹ÝN‚#\ÍÓÜG_®à–œÏÓ*³þbÌæøìR|$=¸ü+?ó—kO8awò­/âÖ©윑Z@B´ni›n±‚øXÞ|ïžJ{©}ö}²ÿ£öÛ»©¥§ßôæg+‰±‰4~BwMâawýÎ^IûŒ:Õïê9C¹ë.¾}ìlä6NˆÙ§Ü[éïðIEÝ[QσPÕÈžÜQý§¾oŠúž®ÍÜ9z„7'€ƒg™Í ʦq•VÖ°ž“¿ûÖÑ B €¸ˆJDÀâÄšBmÇè#Ûš»Ï³Ú¾¡ðºf¼0»ïé$ûeå¡  pÙ’m SxØftÏhËG·˜ täÛÚrWV>‘Ñ—Ÿn[Øæ,ý×Âg'˜Æº oë…Ã}ê&×îÓmöÕ&¯¥ßöÞ= Fº9moW^ûü÷žÚäµkÓ÷ªð°v*Äìuû0oë˜ËÏg¯%ÓZg ÌíUY§å^C¶¿îìcè1üÊ.ÖuEëí›$½îÑ®nžßW[7µœ0Äà†,úJk+–’ê¶Â6+pa.sÝîJRÛl ÷¦]ÝSPgå~YuÏ£=X`Pã,ƒØc”ÁÌY{2¼o…¨ ZòÕö8Zlý‡Òß< WμºÆ˜J5üv°¯òY®-œ»–|²øù¬ô²6›e;xØÕ\Ñçe;y~WÚ[±ïY!B-+FTßB'µ¦$PÖ˜ÈòóaÕ Bl‚Lå.RÔöèÚƒ)tÁ&}¯¿ÖöráSv=´ë[x—a'xgÔþcIÚÄ}ËNÀðÆñêK¶XóóY{*²ì}°^’ÖÞ¡ŒŒ}ƒh0wùöÏOo.nWþ‘‡ã ÊZ$(–íÜ®¨¹È··í“å¢,fu§‚åâqýë]ÉeÙV>†}@ – ò¡¨2+tB= ,€.Ûù`€§üb°¡m­ã( YÓ·ã"D²5––ò YØáJEº¥ÔâyE2ˆ…0#ÏU¶«kN¦$ aT\Á#ʳP¿ÇV0»9–Bª%X î;#æ`ŽæD¸Š÷ø_¯<9v‡q‡C, €Ô„£ïÅHg¸ŸQHiξÇj¾o%Fë$œ]¡mý||×N‘ö°_WùŸD©+‹v4Ñ@¥R- Æ£¯qD$Ò8ÞÝÆm˜²=Y˜W.çžù/+ŠâV!, ‡p{\ÆŽ‚™ÏŠÍÀ‰d#æ.do¡üùø´RAØGœðñŽ+îirc¯>0Ÿ‚=D##¯…‹¥,O?ûH…qK×BYA^„ÁYÐLˆ4NÏ{Ý häþb³Åè{$ŶÎ:86Î 0s˜(¾–ÖìÖ’‚8ÍfçT±,ÐÎ<ʽ ÊYÏ LÙl‡"©€wêŒ }ç:Žk{)‚ o¶B!ö¬%wúùØÚ}­Ô'ëd3ðvÔ1¸Ê<¶ßß3{@­UÙË@š«Žùm³ì'SÇW\ÞDMŸ0ͼg‰Y73g*:,w}‚§Ú\26ŽÁË"Ûõ&Œf㊚é„fc‰ë×/f³1•?8Šá3C+¦[Ú·Mœ^Wܲ´™&wá¸òã kÖcûi3ŽÈÂ.zÄÂ)|Ìý¯amÞû–EÑfÞØ™âÙ4ˆ=­GhO™ïZm’7t¦(òó™Ç â±·ø)!ƒb‡æ¾Eñ¡B2ÁI|À‘s99žDÇ]JÊÉ4%`V¿Ï‘Šè„4Nœè>P`3…´9 ¶ÈI%`ô…U}î#ùF¾ å¬ÂÓft91Ô%Œ~í[‡ÜliUSÇ R ÆpŠ1‚jU\¾îˆvºÁ"m„s™àqÁm±Î(€?ë¦Ý?öý…‰nÎq aä—cú T-Ñ5<òèø`Ÿ©_Ð ­†ON}£ÌüH±E&Þ>S1ðÊ3SG8.o‰ÖænîÝ=bØ‚>߀a×nbý<ÃKSÍbVûE»ïŽ04Ô°Ó‡6’õ“-ÔkâÓr<Ó‚M‘9R^ÁZÈ]{`¯VT#éeæ3à+¢n|gÛö{Uh=5»ƒ¥¢E ´ëÁùC¹î*í×CÈQŒ`0RrÇ´ŠÂfIý“¨â"̤ ÒÏ{.ªc¶¬jÑÊÑ’aÖIFÐ!ÈgD¦¬ü}û=oàǓ㩀ƒ^p$Œ(e cÊJU¥¹.™ÈjÂq,Üvò®°‚B¶TŒ©p‰ª¦jãå||¡%sø¥ö³¨7y¸,!y³2k‰ËJ(¬ŠÂ\ŒmóÍ~xT9ä¼%ƒ¼"G†¨j>^rC´È­p˜ô+Ée”j ¤N@Ö%樺 Ÿ%ø9_ô„ª²oS«Œ^Šû˼Ö‰Âzdþ óÒEæ.Œá«4o9 ß`¦T ç-t@)°5ªF(UXæ Ã3Ü*sõ”V2©Ya'¨è ÅyñbÇI%î÷EÄEËæl9°ßyÚ!눾H#O$T{Nç£j™>+gC=‹tP©YV¬qÉ€&ž•Vx´(STx5±ˆæÀ*ú ¢ØM-Ôš= œvŒYÉôªvAUxâý肸Y‰”I-„´SY(Å>ìŒ2§YÉ•b‡?(¢éU|“*"YJj)&ƒ¡PÓŒ›“A6aáŒtàÐ…UpUçVˆ¦Â³]x/œ´Žqg%;h#›ˆÜÆ7m¦èÏçž÷Üs+ÝìfÚö*—,X¥¬xxÙ‚)r7°{Ò%LqÜÕâÁ؉ö#hœVɇ‚Ñ'wT(¹Îä»xaÔà<ÌP~@¸†Ø¡(êøˆçÏ{^åÞÁNÎ[”zrÿ|“%™â-”Ç,fsåÅ0A,Zɾsg¥ê*3TÛLáFø”êË8%FXÔº*ŽR³ÅF¯©z:ŠÎmÓˆÙj`Á-y•Kø'¦‚¥„:WÑT~ HãQp! FÃvŸÕrsp%ݬHiªv3+÷êáÄ ç}i*ŒV«Ùµ>QˆŒðV±CË™¢g¸ˆÕ’ƒGgQŸÚ‘y“¡hË$x²$¶•êÛÌšS>ÃP0 >Õ!Ò˜W`1;9Œj'8…’15j¬¨O´8ó²m-Ç;¼sissÔPšªNÐA˜µKŸÞä¸ ¬wÔã$pû¸cÊô’&Bk‡Î&£—ÕY @¡Rgó¶OVæK+çI«ÚÁ™Cäv fn×NÁ‰gP\´­€iut|’þ µIlº¸j–:FoŸêßèlÜÕëýÉ\Ï<€õ¤¥üöoQÙ|cwÑAã°: ,q×'äåEÓëm™ÕM²²ǯ(‰`à¡OÔü÷Ýã•›Rs<•詊 =×­T¶½N?£ŒluX:þ-ÐÁ'(!ôFÔᨚf•¯õ¬øÛõdq1¼[g¨Š¢Î¿w‹rT:T¿¥²çåÚ´>بT-ƒ´àUùÔ° 0Ê·*Þ–@¯u^¥7•ŠÙ‰{Õ†[+_[¥6]-tõ;Ã¥¯RŸP1¦Õ—Њ9õNaއW)6¬1¨ê¬qL‡£O‰MÁ‚õÚµ3ªÇÚŠÇ•YÓ7Aq¥fn®˜?¥X—‹à*ªÏ ²¶¯çÙQ‡ˆP4HÖÉQUˆr’BOjºf ˆX_…­š*_ª(I±€ßRS¨Y¸ÇxÁ¢Š6´+ÐS’Qãø‘ŸJƒ“ô-¥|Fu–ë'«aÜU±W|¥UM^µ<•iT× œjjòדš qa'Š9ØÂ©D‚PЏSHÚáOR_õ–ÅïGPw)Ú¹«cÙwõ¾å^/uQþÑ2n Ô’®¨Ì$ù }†e²|Õ9WN»•¹Ðî0×áÊmªõ¼6»¤¥ @½j;©! ¶•}Cá.ZÞÒÏ·ãUaM/Äã¯+雯K`CÒò…3u?â$Vi‘9ÅmÛÕoiÕ=—è€^gȪ’šUhB[;›dÌŠ+¼6úÒa9+"Ð> AË9T½Â¥Ç}•dH=ò«s8¥HqTe„^KáòLuks†z"Omôtõ_ƒ¤¦jGñ«Á±0·è1ÞêÔU«&Ñ(Yýƒ|‚Õ7!ý#$ BžèOWAæTs|"^ðEv ¹ƒ5ß°ÇX L©DoÔZQ…SÙÝÕ®• ¦$ÿÕ{½#>¡ à~Lß_C¢^ܤW! 8äßSpúªÍàd^ñŸc±—7V'€Z`BFq‚  ó.l½‘uñD"ÔgŠ I½–úõxÏü>…*£ºoôT,-ã' {0àxеUOVfÞÓ´qÌmCuFµÿ]b ÀôŽñ(ˆ¥ÝAæC…¯Ñ QËk¡Ÿ·H½¶ßa6Õ_Ï1%*(°iº âö`2Ø#ÞYURf(ù3šNµ]Ï Jðrè¾j¶¨Îì,~*ú‹ø¸hI–Ö5Eô®ïšÂ™5ÓI©.7|Ž|uvõ7Dy)IÊ«MðV}¦œ4#V‚‘Ú.1ïÀï H ,gX«^´;ª ä;ñ”/Bq¢Hˆ s„&5nC¹ÐʘjÌÓNõª8®VϨñΨ¾õï#Q½6у«ÑJ¾ª5è¼f-BìªQ@ˆánâ9Tö³Jöê6Þç›&v5Vœ×xì»ä x…4BmÚR“kÍJÑÀ.v…襆öšDÐÔ& §´CXÄÊê"ZÕ‰kOô¦ÓK æOw$Ùå뵬.{{=ð^t‹†žñùï[*âBÅý›r[úkÌÊħÄFepMd€SÊB ~š_¸˜&@O‹WñgJÓeåùÆ…ð‹«Á«óºóàŒÌ] t§…RTq+&@Ú¨¬…ЍÀ©~‰£9©m —iŽÌe^5y¢j í«Øâk•«JtiMb]emf_tIÆ>8Á~m¼®^p~ÍY½34>´…!ù|“‡4ù ÊTÓÖ,RF¯N53¥,E£,šÚ ÖÙ7¡3f5Ñ@Æ™€c†UNñáøzðoŸ^ÔÖú6,lDST {utFz4DrCÙnÑ»M]é–(àw \7ÀK9cªµó. ô½xÄ_ÂâŒ,s›¥]欎qÜLÊÈ|o˜U7ûùÀvÕ3ë-/Y/1Á‘%Ý€ìä…ñô‹_«¡ó݄›V…*9¨BÀ\t*]LõÝ lŸgÅœK;¡€wè–¼FZ½jï  üéß«´O` s&ÕFÚ4|•ܼª…̽fÌÐÔÕ†ä÷ý£ª«ùÄ«*Ÿß0>õ1âˆî*sç„GQCXk4uÜVj —Ü%ò2ƒ*)#ШW–°De”•Y¸"È^zÌ~ÅA$ S+ГêÐЯ`9´>Õ[Fj›¯Í ½’]½’ ŠkÓ*D(E¤Ò+˜ùëDDÛ¼Õ‹“·Æø4»¶„0ÙàýÎÉ&ƒ:XÔ­ž”4ì¡L*{T §_I“ÒÍ5¤»õ8ÒÍU¯7‹ å‰æÓßû”ƒQ¦cJ ™Ìý„w½«H×UíCP¤L*¹0¥7ªj=¼ž;ò &W^üùüÒ,GµÂ iª…ˆ·ñ zqкšò֒ɯTO5fY‚:Ì%Õºn†ñê­t„öŠ‘­—Sk5àMU”‚Znmëw‚›3êþÔ÷n¿«â~($3ãÕuÌ GÛ§òõèø5c.ÍzתL–Yí4@{ÕÃò¾w*¼’]J,gÌ=vPMX ÂK%Ì F ki„:në|ÿ>€á\‰h™õª„¯f_Ðþ<96_ï<=L*÷) ˆ HI–ÂþÈ‚¦+$󋤮"E}×»µ*Xþj‚å<—œÐ¢ .‘ÅGµ’Õ®ÁG [k™l£!Tç{M®¿`N¨vCÍ”R1”]K8™ê-³z–ª}EÆv¶Þs 'Ë×òí¥p<ôƒõÞ{‚3AæÅlSo–I±Ej8„J_k=ʂˈn>S{ IÐä@ÔÝCP%’à“zéÀ®öt|¶^B0%–àÕ:A/%¨3F½;á½I]ï8+9–0!šÎÜbùè­Œ&ý¸Ä­·Vl•Õ–uïx1Y¯ØØz#Šfgîën¥DqJQ‡…?‚BÀ,pBMQ:,=¡w¨hYuÕñËú43¶%>”‚¾”Ü'À‘è£ãóD:B8 D³¥÷(Èë52ô•áNðͯ^ÕÐ+MÔ›‰ô 4òHÌ~•Z½·Æïcñùhµ])êjï¬Ú/’{¼º°¬‚aFQŽWfYE‘)-«´ý^u~÷æúUjÓ0k‰H%I£¶K†‚ êû^>åoe%ä›[³s)";U> stream xÚÍZmoÛFþî_±ßš|¸å¾Ì¾Aô| ´h瀶†q eÚÖ, —ϬHDZåÊ¢L%dÉÙÙgfgg†³4–¼PÂX²Âüw^he™à?š üÅüÈ gx·ÂEÏ„>27"}"ˆ¨2O1E&¼HÖS(,¨”˜RBkË¢BÚèÌG·2ŸÚÙÌxA;L‚Ð11_‹ <{À[»@«àÝÁ«WÅ¡81,H‰w¢øãÏ¿|:`;Ìof³ÓƒŸ~ÊLGõ¼¯^‰â‹®ÃŠùȱCglÅÛ¦žW­8ÅÛÃ#Q¼¯>µâVÂûÏ‹ ÊËê ø'¤UóvÉ»-Ë:(ÞUËú¦™TËUôÈ÷~«Î§åÏõ'q¢pÃC7¬ä)&*ŒfÆ´b|=Ÿ×v²Ú½Œ'%&îÍŸ9Šã›³6_ÿ:ÿï ø¹nΫf5:e0¨aŒ—p_e€Æ0‘XOI£Áô:ÛãXoê÷µ€_¼­—íñ¤™.Z{ø’M2xjíHz¬¢›Tì”ÉHg×äeòzíìoÊ›årZÎoš‹rRÝ—Øùo´Äž.1ü«%¾«ˆ·»)RA'Ý´Šk´ò;h¾ÑòóP‘ †+ô÷°´WÄüJ­ä×ý>5 @åë‘Õ¼*›ÿà×^í’¾zÌ]úÚäí­Ì…€øgø-ÀɈwo‘lÇ&õ|:¹i> ±î-À°ƒ‡˜°'ÀÛÛÖ:%=w^:¼6X¼ÛÑÈxoΪ!ƽ׃…+ç.Ûè`ו)þ}VZÇÔ#ß:}ýñû×%™í—kÇí½höTU8ÚXUÜe©ª ­$cîÛ MÆÜ.Ìi•ÛZz"nhsŸ’·e.Vc¾Ç3óu=¦:xZ£À»½ Ý>F2’[‡X —Í=ÅÁ¶Ín¼X Tı‰’û<ûB¼&Zq›|c´ºÏ¤›;Ý[6-˜tW±i•O ‰c>7æÍNE:*܇qAÛíâÂWF §XjP—ø1ËìÐôÙ5¸»1¸ßeÙ9¸ïˆ×¸° ïW,c%#³ÆéÌNgè™[…÷6Ÿ‹tÃÆ÷)6úÔ]–±ÖÈ>lçòIÚà5²zÜ5âó(ÓE`\ò1™ »ÅFZcRÃk&Ûõ$øÌ±#úâÉöÅSÓòyã¶U”µ$ù¼•PÑ+ïù´W>×MùzœÔ¹(›òºâº\ z­î‘öȹD–Ø3òo€&ÈÄ/SPT ´IÃGø”¯¿g“÷H{ä¥Ù7îM#¼Åjg¾Àî2#] f9Ovéõp»~Ñ>Ю«cI?¡:»ÇdUšâ¨‡o;ç̸9gƧå̄𶭚ùéK²wæ3x|UžOç—ü¹Fß³/áñȂר¤%âñ~@>œn–äŸMRx6IñÙ$¥ç’äÕ³IÒ[Jz¤‚ð@È?õ¤?P¿SAøîœƒºoòÇ>Ñ×¾¯)ºôÓ­šI*þžÌ‰¿:Èh8)àj¤ÞöÌ[7Ójv>èÈãã 1)¬ÞâƒwÒq[#ÆŠÊD#™x•uïà].®ªfXµÐã\¡ŽNF§÷‹z€©#IÇï/'_þh-‰B|+Ð@$Ëfr5ýPIàåë©Eimù§­-˜•9?~”‹é¢™^Wò¢).¦³jùEçâ²™žÛbÀŽ·’?!§dÔÜÂ'iâw£D®üú÷™¬AuD´uiÁ_fnß.ãQÝ÷‰{è ™Í!óýt†¬Ú\A©øLxÿN;+@ endstream endobj 2489 0 obj << /Length 692 /Filter /FlateDecode >> stream xÚT]oÓ0}﯈¦=¤"ñìÄN“M}l ¾@áÁKÜÖàÚÅqÖu¿µê “Pùêúøúœ{|‹h(i`2)KÐà:i×#è³z™„àËÛЏÜó#äõltqKH‚ h`ƒ’Ùâ¸Ô¬KæéëݦÇyY–i}9Î1&é5íYȬÕ8/ê´ëm4h’"ÒŒÌÞnf‡‹IQü'C‡ü—bõŪƕ8P|¢¼/¿C?Ð{&\pvþt~–mTÏ Wrz#»OŠK“QÁ—rê9Ê 6BîË®Õ »Þm|ä2³ŸÏ: †6IŽJ€H¸ðn03Þþòð{¶äR¸{§ *z¶¯xµoÁïƒ6Ô`@ IÊI&rê.Þ­+’¼Q£ÏAh]$ƒWEZbð^h ÊÒ•½¸Eç9©Š´W‚w}<7ÕºŽ€ŠèélÅ­YØZå„piE©Z3£w!sämHtVÂ’ÅÃ4Ö0zhÍ Y¼ù™Ws ©SÍ”œ§ØÍ}³¢&l© Á½¿?^>ôÌ3­S£BÆ‘"r‘7 F£PPÚi:¶%¶T7i?èÅ¥´uJ½ŠºNÕ"¬–£ƒFž`œ7ÚN±°»PB(_ŠËe¨Æéz#â¾eׇ47!ãYÚµãýFx»0ûšj0‚KvL£±M=–T´\·ƒ qÛ=Õ…‘ÄþœËjÚñ¡1 Ë–›U¹9íŽÃÝå9dܸýõÕ7÷~Oõ¼ìÆM|Êt¿ Fµ†û²¸­m Iº %/O1pB+`ÿS‚R¾Þ(mH ŸóÕ¾EJmíù“43áaÚ¨" Ž^/¨§ûÖ¹³wʬì,ê½záùlVg+FvK͘|a¸ B@3IjP}í*Œö.r. endstream endobj 2496 0 obj << /Length 2035 /Filter /FlateDecode >> stream xÚÅYKÛ6¾ï¯ðQÖŠ¨§`IѴ顇vo› àJôZˆ,”´»NÿÞy¶$K¶‹ŠVg83Î|3”Å̃?1[y³$ÜU¸œ¥ÛfõÓŒýv# ßÎ÷7o>FÑLxîÊ[‰Ùýº+ê>›=8¿lä®Qz¾‚ÀY¾/Â0r>ÈZñ̶š/ü¥“µ…ªa”x"qDìÍ¿ÜÿqóëýAqäûWZˆœL^Ôp/CW!Ûùq¾ œV7´5¾“Ï…SmÝhÙäUYó¬ÔŠ;]ÍÁðç´ŠàX†Wdh‡sÄ”Ž(²b³ß)ýXUž µŠÈwW«Õ•ª-÷ýC¡]A@!Ëë|/p“er¥u–û‚uC¡d]Séö$N à ¢‚kÕîKêB/8ÇÅið¼Á¬ðÜÀ‹yÕ=âP诀°6mZ@.–ÑSø9í9õWU¨¦*GµHÄ»Fæ…¸¦±ò›Vj‘å[UÖ€”²`úK®BG8kh¹ULhk„LZYñÌs^·²È¿ÒìŠaz!WD‚7õŒFTE»¥ú:ÕšÃC+KA°~;¶S¯ïöÊ FtÜ>½}'õB¸a4ÐÞ]“¶úY,ˆú v²Ù_˜m­«²yG¼žaáz”é×wÆ#ôÖ›É7ox-Ôª²~VºVcûúìE¤úN•Yž¶…ÔfQÅOùš×Ö „2¦"jü#µ®^NK0x5òÄ•VXî V …ž‡Vv. ¸QêÇ\ïuU×Cot÷`B¥Ô2šÒ•BmÕüR£Ùz——¦ ¦ÜYWz˦ËM2á7a[A^ªk0Û$D§  O=ÝìB‹T†“„l1µ³$Ñ—ú’ö[5 m¬tjXÚ-þ7'ª™€ŸPx g¡å{•=N‡&GÕüû>)2²|âb‰³£•à ’JbÔ7±¿d"~ÈSQä¼geU~SºbÏs È¢U—…›¼˜ò^ ÄŽIs¼Ÿò†L”ŒS¯Ôª±(%j²Ï4ùÖŒH0¸¨ ½Ä§â!Ô”5 ϘîQJ_SŒ-¸„ºIx¶µQ…7r|êå ÎàÉccªLS‹ÈN"lî×ü~&ù‘<}xqì™0G©¨do\=㮪ƒÎãàÁˆÝÕ®O ²[hÎwš›r/.;/=‰Ï—Mž¢í«kB^pA^*K–`‹_RY7g;õd¤ëîûfà¹éÎýXêv£ý)4Ŷ‡aÝ-oc;fÇžnÐwƲ¿Õ`JSõ˜¢×džBm§’ÿ®&¯k>x{êžæ;™Â´-)€} †00%Yl…¡yêGpöÀ €¼±-é„~ÏI|šÓ)J ¸î×V©yjº"VîÙ ‚fÚ!%KY–AÌ\¸Î€d©péH”2€Á#ݧ0“4û½Á ›{(¡PòT½‘ƒ¼°G€Üépb‰³‚œŒ²§ c˜\cˆøËÄù´>¢ƒcQwæJhšƒn›[,8î‡ò\ }´,Tf¦ ¿Œ®y¨dЇ·1--YA•ï€@}ÍæfQ/hiˆ}›åø"€@:©›ŠM¤â€‹­*ù#Ì®zä , Û>s"è¶x ¹h-Ë×Ó"ONåÏ*SõYÙ-E·¥gËùP•¦`Õæ£˜=(®ËºQ¯æ$ ŽûÇ é îö0JºÝ8™=öªÏ©/¬Buî4*ãïO‡5{?]+®¨o¡-3ðDçKŠ{l´ÞÞ¦ªá>ùþd¿EÕ£%g1¶‡“kRgÂÞ¬L͸=ÔŽ©2ÂW$P‚þq_®&Ç:´•ðÓ–ïpÂ÷´ÕÔÃÔ1óÿW냮“'ïƒòú‰:C[= õŠ*!ŒS Y«[,EÞ‘çX“è•’ø³Š¥e&A™BÕÌüƒàc)á°‘F# ‘Æ–1 Oíj6¹¶fY“ÄäMÄÖ¸>úî,Ø ³Àd{ÿƒ.ñ—Å~Kv[·£ý`fsÊq6…$ýMSI M›ï>ÿeBA endstream endobj 2503 0 obj << /Length 1617 /Filter /FlateDecode >> stream xÚµXKsÛ6¾ûWèHÍHÁ‡D%£CÒi:Óé¡Óè–ô‘„š"8 hÙýõÝÅ‚2ES’ë8“± ,ûÞ‹°QÿØhŒQä/ãt”îKÕ»-þúíŽ9¾)0N;œŸ×w³/I2b¿ –l´ÞvE­óÑ7ï—=¯ŒÐãiE^úa<ãÄûÌkA”ƒOÃÔË›BÔ°Zlá±9ÿ½þýî×õIq†¯´9o˜È‚NãÑ<}Ådçz‰—ñÚÈr‡›ØS[´Ì»¾YÆŠ›½;Mú§±gÔå›™*”ù5‰Ç‹B!4ÇšL1­Mí`œ=áoµQ–µ<ïJK.K‹oÚí}DòhÊ(¾Sù,¡ðÊ’òmöý‰bŒ³hinQïyN¡‡ó –ƒ'ö| ¤r%D×;—r±åMaèRGBd%¤$!íHض îî4zË3á[ÛO¦'þ"u¥ñ l£¹'ù¡*n+M³ÃQÇ›èrUZ‘kcNä$V:]Ö=$|X\ˆ~?Dlé'éb4O?¼Ñ-ïôÄL=qfø¹@ë¶Ñb«dq_*óB}÷üuêïuõg­zŸ×OÃUæ§‹$ö¾ŒÓØk4DJS¨\~\x3^R5†Kg€-GFÒ]m@ÌC¨ˆ¦ÌiÉ_øÊ⥿ˆØh‡~/oxÛrO;ìþö…Z›öÆTõ‡Ùì(6>×Ù^>_éîgaŒEøÃ¢h†¬Èy<ú•¬´<«gäoâ,ètßVBXfÐCe”³‹êùDNCì„(ž‡HÐSŸ9DOý(!.Ò.Û·i‚Á,Ô1Ûsm†€$(4.[е휲îw€¶;°msáX´j˜Ûu1,rhmAâH4hš„Àeø -ª¡r’4µpç¤G¸~¢Mmt“™F»³Ö¸KG›Be÷áœØtg‰8î%Y5Fž•µ(‘dj¢qúSƒ3k` J,fèå=ÒBO•tF@‹ >c³°ˆ>oȶUíwÅF IBîöÖÇÑ”™‘ª¬I‘²µ­ë’k¥ÊfNÕ/²ªò ¤áUA>+Ì”äÆÑD¾sn?=]ös‡'tº“h¥(‰§BÜÌÆSp‹‚ÝU£yYCq.ä Õ çëÃÐàüSPq e—„ %Þ7ªú$Á³R{fVPµ¥‘æ á‡áÏÇzèË+ÄÖ¼Q –¨!¹ï,r£ŒQ‡wõâøþ®ƒÐŸæýX{Mìì‚ØNÅ®Ç)4˜ë³áí Æ]q ͳ‘ Ï‚ 6–m½N?S¡Ú¡ê4wÑ¿œîæÍ>vœ3ÆXí&AÂ~…–ÀôQOèxÞÒ••3c¥/èìqâbùáºOx™Cpëìi”^º8âàPùžh6ÀdÇyÀ/Úbááxk:­-ÜA˜”¶—r"ËòØ‘jˆXˆÖ ¿€ ª¤ÁúªÕµüW\SÚkž?Um¾fZVæ‚n(„—Os~|ŽúXu°yº„í±s×Zyy¾é×Ï'÷0Ðü Ú’¤ŒB»È—•ß \hŸ%ôµÄiþºµ½RrªŸK8×üˆõX¡ãH®VY£5¤( tèõâªtÙ~ùOs^fxéíD)4w½n좉y51ñ,•qkâûƒ»™ºÀæ…Á†)Pä6vZC#\Œá¶¥A`¥[*‘̽Dfž’®¨¸Þ5×r-<,ûÁMý˜Í‰_ƒ4^îš‚ëË > stream xÚÅWMoã6½çWB2 ±¢>íBÑlÓ.ŠžÚ —l²ÄXÜÈ¢AÉñzûç;äP±dKIšÅ¢X KR3ófÈ1yðΖÞ, ² ³|sáéU¹žáàÏß.¨Á¹t{ÈëÛ‹~¢õÈÒ[ÒÙíCßÔm1»³?”Ù¶erîA`/®ænFöuÖ0\Ùˆ¹ë/ìbW±F‰G›Æþüþö÷‹›ÛgǑ￑¡BžS\žPŒ!¡Aˆ žmD]¸ PÕlXäV²ËçðçñJ‘[qßV”xæÒ€ÐÁžüq4¢Îî'/òÄê3Ë[\^‰âààp›q‰£œÕ¥Ta=ǃÿ¨£ÜÍ¡ j>/Font << /R11 2516 0 R /R9 2518 0 R >> >> /Length 990 /Filter /FlateDecode >> stream xœµVÁn7½ó+xëîAÎp†(Ц äP –.AÐC!×vŠUÚÄÚÏ/È]r¹’[´-$¾å{óf8äò³u€Öåïò{<‘Õq´hÛß/·F‚1YR‡àÉž ¢ ßiERŠ vZI@ãܘWÑÞÞ†”?öOƒö­Aû›™-]½y¶Øwf¿¦Ûåݧë1@è#ÎÀôˆ…Ëg*9ÛgÞ¤²]9 ¤ hQ)€—’„À%KN)?™ŒF/©Í™Ú”@5#g:9›çÓ. Ù7†@l¢"ÉžÊ]ðÙNË(afƒjˆËS)—ÁÑÄ䀢oÈd#h†(/3ÁuŠT;SC4%H,¶jjœgÔ¨u|4ÅVN¦º®Hyºˆõ™K=(g0 Ö\Žà¸Ks2(ÁÅ ‚©¤uNçb–éM y5Ði‚ÀCâ¼!aA-b ðÑzŠÀŽl]ç:>ôŒ ëFé–q q4‰yK8±‹@YÜÚi yâ{î‰ÙW#9Ÿ«Ùø™©Ø÷®ˆBÚìÅ†ä®¼í»˜wÆ­or÷ÿm%K!ëìh¿zwœ£w–¾Ì 0vÏ_޽—¯ â£.¨Oj‰ø0[ù~D @"YüÜ=æb:{¸6†—ߎ;ÊW‰ä×Ìv¦¾Â«CK>.~^ˆù •1„úš*¯¶˜gO?Œ > Åá®,»¤ÃïsÀ 4|<.Í2Ô®¾ËiD ªÿ©>7 DL‰lÊ÷ÊbäÇq' H"9¼'çq¸$²¦ê)Rª]¥zò}¯Ý­ øñÓúÿvÜ…è"$l¡÷™~Zóÿæ!; $Ãõ¦,Þ3¸ Õ—ßÔjöåXÖZ=¬Ý>û ÈÕVѼmô\LtjwÊ@¹JÌ\¢ôþ®[Z™´‹\î5Œ íý¨ȯVîÇ:ñ :üT6†w¡Uµk­wæo º« endstream endobj 2519 0 obj << /Filter /FlateDecode /Length 171 >> stream xœ]=à …wNáð£H]"–tÉЪj{&bˆA„ ½}I:tx–l¿g}æÃx)àí ø@.ã·l&œ1©À[Ž®U»˜Äøp3éýI ú½¿›ùS^ÚDî®ÉX̆fd½º÷^3$÷·R{`ò‡³“ºIˆNjÖwJ7 Ñ©?õRE: Àn9#•ÆÝ¸*O ü½–bª)@rì 8ÎV endstream endobj 2520 0 obj << /Filter /FlateDecode /Length 327 >> stream xœ]Ò1n„0ОSpƒý`3f%ô›M“"Q”äÄ"ŠDv‹Ü>šÙMŠéƒGã9œ—ùR^ö5¿é¥žæ¥ìúµ^÷¬õ‡~ÎKÕ´u™óåžü™ÏãVNOãöþ½iÝÖE§[~ÏzxmzÓÜjòZôk³îãò©Õp˜&Vº”ŸÚþVñ1Ý—¶‰7hެ†: ÀbC„ÆâH„Ñb¡B±8Ñab5Ä@Ä`1Ò1Zìè€ØYT: *«¡ t@gµÝ‘è¬Iiè±®$Ðb‹%ÒbIGˆm$‰d±§¤·x¤Ä7Êt€d‹…;¯( Ö³Lt€Øñè€d2µt@j-: YÏ)ÒÉzN=z¿Åßë² µÉø„:_÷]—‹‡Å¼èß„mëfUµ.¥úøªã endstream endobj 2523 0 obj << /Length 1148 /Filter /FlateDecode >> stream xÚVßÛ6 ~¿¿Âè“ D>Ë¿³áÖµ6Ö†´Š­$ÞË“í^òÐÿ}¤(ûr9û0.–(’úL~$Íþ¸³œ,Šüuœ;Åé.0R}phñù—;nõ(²+Í·›»ûIâðÀ_kîlö×®6¥³u>ж—ÚcQ¹ù‹ãÄ}+:I’“òX˜»åPËVYÀ3—§‘÷uóÛÝûÍtq†ÿ!j¾„˜^Cä<ĵ“æ±Ï£˜pÞßÃõ<ÜR‹Ç/A´U±ÚÕªø‡ûº:{”ág̈C¿Wí$Äÿ5 `<òyBnÉcŸÑcïÔcÃØOZ«ÇÑÍs+~e2öQìd—¼ùKvoVŸ¬>ýI >Êý¬ÃèU‡Ç“ßOʺ}On_:Œß+Õ ËµQ²Œ"­,–3ƹ¯žŸbŒÌøwJ9Ï ¬0Ëü„ǘóû_Oiæ¼Sw¿SúóÐá±ÅihFk?ã–¡¹¥èõþâkÅ-KÒÐ-TÓ«A“Æs®ãÛ­}ZG›c޲õ5«IPzÜÕ 3÷Ѫ€[TŒk#¨«Fv¾Ç’œ»/]5)v½Šþ…ÝäIkÙµæFÕ”Us yoôG â›—¤®¨i «†žb.UZŠšJThDž»‚gµ´•Ø-梳5Ö{ek_xFu?4E_ÁK,8‹egËf±»ƒ«3rZ¬vH•Y7îŠ` c¢èÀB«¡‡Ì]€¡É}³ÁІª”Û¯Û¯¬0 ‚7SÐP¸·+ÚãAÙm+*M+ñB²[™|ð ‚+Ÿ:™nµvUÓÓ¢9?4-Ú㋃ËCs^ÍåT¤nU-zIª«ªyP­Ô¢W c·þºa׉S[ˇ§®wg6¡¿ŠÛC µ…ÄC ˃Ï&µšó<ðL4å+†—eÃR~ xÜX =!‚äËNÕäPE˜Gü n)÷b¨{ÚŒšªY- XÇ.%‚˜v&zYÑByÊ1òæ(µ\ zš½â Ïó.9hCXð”»0îæ‹Ä”1/DC‹é/X+`ˆqj ɸ £¼$*uX€¨4óAWÅ EqÁ–†í-Î(²*ø1Nö° ÷–Ú656G^`-¶å©«Hqä-Šªf‘ú¤ ™al!– ‰ÙÀÆ,°¼9ÀOƒÈý£E‘½æê5*4žqÀ÷_Íx:™Ñq¡M«qºd0] 9˜ÎNì†Â4¹a Ýrè騲O“h<u§HTKQÒª·…^¾y&ÔÝq¼&D&©df£ŽÆSߘ7ª´B‹“ì v Á-«˜ÔÍ|€˜Ò az™7Nøk9ªé@íñyŦJÙ›+{Б°?Šž à͆º$éD{< ÕC;[ñi_Ȭo‚ úUÄ!‹§Rxz\ˆhpbÙÚ_ˆR6¾¦ÉÅyö3kšiSçBÓø§3µ_ž¥|y›OxÝ êúB›kx€†æšâº¨$ÿ×þ©*3à endstream endobj 2525 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./onecontour.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2526 0 R /BBox [0 0 75 75] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2527 0 R >>>> /Length 4787 /Filter /FlateDecode >> stream xœe›M®-9n„çgZ[¿¤´=³{ Ø0^ ¼}ƒC‘ÝF ª®î¹y2SÉ/‚õߥJ+ÕÿÉÿûßù7+ÿñ?¿Uþ÷×Ê_­üׯ–ù9óô^F­²O+ÿmÙuê)£ªìºÊŸß–u†­2ªù§c¥Ÿ~¬ŒzDã3&ºÇ:e´!mŒXMg+£-g—??¿ÞŽÏlYsÄŠ®>fíÈZ+VÚö¯ê]öêåÏo‰:­Œ®R÷]Y»×QF7éíÄJoõÌ2F•Q[ùó›ršù Ž.ÖV¬äCŒ%º4VÆî»•1Lì~¤Wó #sYùó¸ã9âíøŠÕÑFsI;'V´¾Ë˜*þ_齫–±šœ»ÐlÙ.cuѹïÊPëe¬!}ûeºìÖWëˆíujõ?Ò*­öX±}ªÆÊˆ»é²lûݨɴ‘+Ó÷SMÖjÿ´¢ý^y•aëû»Ýåÿ¯Ìy¾ß±»¬nßûؾûç{¯ûÈŽ½Æãœ*=Þÿ{â£b­}ßÊ1±×ïÅ-Õ>ïvÖ!º÷çýÏ:e×öÙ£YUZÜ öq¶šq†­ž­KÿFÃlSÆœŸˆ™Í¤Ç ªf;¢ç|"oví³9m3€g7isb|Ž*s®Ï9˜£eœá¬Ì1Ec¯qžæPÙjŸ37§ïþ÷\ÎÙ¥Æ^ãìÎ9¤Ågp¾ç<ùvZ•Ú–ÆÊ;WºXYùó½Ê‘»ÙšŒxky|ÜUË\š9¡õØá2ב6ì®XÛ»Lm¢=>3dVeê̜Ц£^¦GgöaQ÷­c«û¬<Ö;nnö@9ë#@Ÿ&Ço°¯¬Ýk_\gEvº+¾2n›?½å¼Ÿ¹åº¯¯ÑœÅjÜáZ±ƒ¾²ó3ž8ŠùGtúÂýr?=±s:üå›ó[¿½ÐŒƒî+7¥t«ñžlô¬PÝn6³1ãÎ}eÇÓøŠÚí—ªxš7oWîgü<úÛ ‘¶W\ÑüÝžû™… Ëæ¡Ÿz#vDÏ+#ÒŠyþãÜÏŒôà+÷Ûªg\ùÄѺ+ëþlïç¸î‘s'AÜfÍ ·‰4÷•ÛqÄ}Å.:%ˆÛì±rAÜW4Î*@Ü¢Äw%ˆûʸ¤š$î+ûâm’¸y×_• î 3  î+7Üâ6WF@ÜWò!.ˆû‚¶¸p‚¸¯Ø%éq›Š;N÷Ç#_¹ î+cÇÊq_¸ù î+û6¸ â± 7oïÖ$‰Ûm%seÄíX67 q_q޾+‘=bEsÅIü³b÷§ØÜdñÏo“ÅÿqÅYüó-ÉâŸ;IÿÜmÂøç‰Æ?O0þy3Æùòã|¿€qî`œûç^&Œs»ãŒÀ8£0ÎÈŒ3úã/@ãŒaÀ8ã0γçyŒóLÆyîã<›€qž_À8Ï8`œyàÂ83`œ¹0Î|gNŒ3oÆ™ÛãÌ€qæHÀ8ó(`œ¹0Î| gÎŒ3¯'Œ3õÆY’ÆY@@ã¬1 qÖ!Ð8khœõ 4Κg]³v‚ÆY_Aã¬Á qÖià8k9pœõ8Ξ qœmƒã8» à8»à8;à8»à8;œò×ÇÙ%ÇÙIÇÙmÇ_C-hü5u€qö}€qö†€qö€qö˜€qö¡ ãlUãìfãìxÆÙÆ_Û gg g÷ g‡gg§' Æ0€ÅÉ`qrXü¡ Pœô'á\¿ü'ÅIPÀq0`œ'©ÆIs ã>À8™0NnŒ?´L'|&‹O“Å °`q2.Xœ '+ÆN'‹¸Áâdrüîa{þ1Á×'ûã¨à>©!àYžÌ€§}BÞÇ“*ò…QÌÀ;¥à÷NQ{ótì¥ì0åD%š'qITymT‚<¡!R)"!š)4eÀS‹Â™ ^…sóÑ´îÑúÈ^yú>ÒXžÐ|–§ø#±åIÿÈp™ >R]fŒšw“ ?ä§ "3Q6Dö¢´ˆ ÷ÔGä@ ”È“1‘K)t"ßR EN¦`ši›šj&vÊ®™ú©Ì¢:P½E¡Â‹*C8 ÑÓ‰Q©($£šQlFÅ£ ªHÑ•óŠÚ¨ªOóFÝ¥,ŽÚLéõ›ò:j<xôTéÑ+PÉG?Aµ=ô%t лÐY@C÷= ôIt1ÐK=£Ý­tdÏ-AÏFC}Mô~4fÐÒ¼AIƒ}&M ô¢4ŠÐ¯ÒLBOKà }/M)ôÆ4®Ð?ÓÜB û =8 2ôé4ÑÐËÓhC¿O3L@ÃÜ@Slñ1þ’?>æ`2 Dp MÆDÚ !Z• &Ú™ *Zž /Ú¢ ³çœ‚ßh®‚ñhÀ‚iÒ‚iä‚'Ÿ× ⤠*¥e r¥­ º¥ó ¦; J¦ƒ ’¦Ëý]¹Nøåqþwüöyèß•Lø–çÅ¿;y~ý»Ûçé¿'z¾ÿ{ê7ðÞÌx/x¿BÀpPûÄaì%°Ýo&Á± D G+Y¿@ôqD#”SˆaNz Î9 ‚³Àœ•àL}OòÜ}†Sòlr€ç—C.8ãÐߘ Ñ1S\¹:ó ´@æ$è…Ì[Й۠;2ÿA›dŽ„~É< “¹:(ó1´Rælè©ÌëÐ\™úS–eu€rË’â.k ô_Ö!hĬUБYÏ 5³æAf]„fÍÚ ]›õÚ7k0ôqÖihè¬åÐÙYï¡Å³'€^϶!%}výÞ\vpØ™À5`÷g܇×¥=Á. ;)¸ì¶à„¼† ^ÉkÙ়¦~ û>x2ì áÛ°„·ÃþûPxDlUÓFb7 §‰/Ü(6ÅiX½¶Ž;k¸^ì¾áŒ±C‡{Æ.;}¸p¤8uàå‘)à÷‘;à >4kHz³HÂûxùçú’¤#8—$(¸›`,¸Ÿ¤08¤$5¸¨¤98­¾4cÉ„ðkÉðtZÂõ%|¦1LöÃi8Ýî4ÃÉäð˶ÃQ'اéNö‡/O}Þ=5øûOfÀÀ"0#ð¤ LPÌÀ¤L#PÁÄÂÓM0Ó@is”_0A‰óqbÀ‚*&0¨aJ:‘ÙGDÂ|…&Ì€P‹ÂœÈG¯ÊY’¦•ó&Ù+gR>ÒXέ|䳜mùHl9ÿò‘árFæ#ÕÕt À☴¡à‡iœ§ b^‡²!fz(-bî穘 ¢@‰é!Š˜˜0¢Ð‰)$Š¡˜T¢`Ši&jª˜x¢ìŠ©(*³˜œ¢z‹é**¼˜À¢ Œ)­§ß). É˜ó¢ØŒY0 Ò˜£h™²+jcÞìiÞ˜H£,Ž©5Jç˜l£¼žÃoTà1G•¾s³“Æ1gGµ³xt0¯G×3}t0÷G÷³t(0?H3†ÏèÈ!DZ!˜S|n &i¨`Ú‘¦ &"iÌ`j’æ &+ið`ú’&&4iaŠ“f&=i8a”¦&Fi\aª”æ&Oaa2•¦Wi¢a•F¦`iÆaR–†¦i?¦^NÜ~Œ¿œÊ¥9ˆÉ]ˆ˜î¥É˜À´!1#L«sÄ´31kLËóÈ´E'âÂ8¦ši®bò™ìà'Œc‚šF.¦¬Ÿ×‹9lÚÁ˜Õ¦eŒynÚÊ9òMçSát§19NÓåt¹1N'ü³rúxèŸß%‰ÿ㊓øç;’Ä?÷‘$þ¹×$q>N‚øç‰Ä?o傸çÅ%ˆÞm‚8ß?@œ{ç>&ˆs«âŒ€8# Ψˆ3ò@âŒNø `€8c Îsð†JÞYyƒ'ï<Äyæâ<—qž]€8Ï7@œ9à‚8³@œy Î\g>ˆ3gÄ™×âÌ}qæG€8s(@œy Î\ g¾ˆ3§'ˆ3íÄYÄ_퇳º€ÃYÀá¬RàpV2p8«8œΪ ge‡³ú‚ÃY¡ÁᯈÃYçáìÃÙ.8†³›†³Û†³#†³k†³³IGë go gÿ g gg¯g?gÏg_gïg gš Î6 ÎN În7Aœ 1Hœ=3Hœ}õ›QEëýÆX_wþF]_ÿÆa_—ÿFf ¼©ÚG oòöÅ›Î}Ô'™ÅI/@qÎÅñ;1œ$N6‰“ŸÀâ Xq@œ”'É%ˆöâäA€8™$N®L'z&‰N“ĉ¯ q.Hœ ')ÅL'‰·Aâ$rüîA{þ1±×'ùã¨à>© àYžÈ€§}2ÞÇ*ðƨeà­RîÀ›§$‚Ýyª ö ö˜â â€M D5Du /)!N)!!–)3!Þ?RTž‰¯ZuÏÍGÑʳõQ½òü}„±<£ñ,ÏñG`˳þán: N‡ŒA-Y…z2ÏS‘›("QXDŽ{Ú#² åIdJJ˜È¦”9‘q)…"+S.E榤ŠìNÕ€Â,ªµ[T껨6Ô€o=z"1êedÔ4Jͨ{”£Q)Y£~^Iµõ)Þ¨¾ÅQ¡)œg§¶Ž:Oý½5zô ÔñÑSPëGßA?½ =ô/ôÐãÐ{@D½=Œl§žË~‹Fz²ç• k£‚ÎŽ– º?Ú2èiÝ ‹¤½ƒN“ºQÚDèXi%¡«¥Ý„Η–ºcÚVè im¡Ë†ù….œöØ?ÿ¿ä~ÿùûÛï_ÿ—D  endstream endobj 2530 0 obj << /Length 1384 /Filter /FlateDecode >> stream xÚÍWKoã8 ¾÷Wøè ±kÙòkº¹Ì¾°‹¹ì"·>'QS-9ëG“v0ÿ}HQvìÄi(Xh$Š¢(òãgŠYü1+õ¬8Ü”'Örsåii¹¶hð÷ïWÌè9 èô4?ϯn~ C‹ynê¥Ìš?õMÍWÖýós¶­E9q‚ °“O‡óÐþœU‚$›bâø‰½jrQÁ(öXl³ˆOæ^ý:ï}ÿ=DÍ .2Ã*·¢„»,àäç|’68„‘½,TU—ͲÆiŒÓ øXMY‘ä©(I3S$ÈÊ2CWO$^euF’—IÚYÞc¡PÆM%Ñ&³74¯ÑØn⃢³’¡*Y¨,§=yV×r)0F–Ãè. \ÒUÀ6,Á­£þ­ït¼ÅþÞ ½lº€fôѹ³§˜n7•³`‘Ë}:kÝÈ•¸{¸{˜@äC † (E–ž¦ô»ÍdI£ìD²0Úi Nõ5™¸^jnÉèh©WÛ¢!H÷ŸBªY±eVƤã› LƒªYTÙf›‹ÃÜŽ…ÀI—ñhpÑ<ä}|ð0<Â*h|àâ=| ñbÂŽúøÀy¡ŒšªB¸ÿÿÁu™]怖l»•jMš¥X7yV’þFTÏ#ø0‘«¶ºèÄRÞ{Œ‹•â¢0ä¾~6õÙ19bпÕY¼½ƒØ…ˆ9,¼ PsŒ·KXúϡԞæ§n³#®‰X ¢c,¡„¸&",áŽ>×D„%üEAãÙ@[£ÙÐVG0g·d‰ä¤·n`@ËÍù´¯¨d È }¼JºÌ;½‡ ˆl›ö£aÐÉí²hj©ÄÇÁ4¥wÔ"á`sCçmÉiÄéª+ÈM%rª#[jDèÊuˆp²"tìÌÚs&ÁPýL» I´¢3Íêr8_ ¹¢ëÁi;F¹¬›Ò„&³eS–BÕFnö%[ˆ.Š_fJìrÊz»~ìS”¿uûíÊ ºó„êâ Í€1åGnà±ÿï­h{ž>¸ï~2/fÈó¡²ÓUùˆÆbŸ™ ó:TT´F9yohEW<,ttr¦vA•aØM¤Õ„Î6j‰ A{¢àtÏÛs¾oÏÆwùqlïi º97ƒ‚$v½0µ „ÿ:fþ˜m0²ÓS»?‡Å¼ýÆõÏœ0?ºx wy<8… ©MÀÔ+»g¹Ä|˜Z•ȨX¡Q¬ MÈr™‹O—‹ Q”õ€ønôjšù&°âðP@ž)c 9аbÛá {¹ƒ„ÚK=üZ (#S¨Ù£½xôo¿xÐÖcŸ¦øßaSGbõŒMiÜU`Ÿš¿²o¸Ø]ÿv¯?JÜÐòÌ|Œ¯ƒ›?6QbýR\ýõÞCÁ'Ó8=âi%ö5åæPi=þmó¦L{•g†¦óÊ<}°t›¼–[ü >úþƒä Vu5õÛ² Õt¶ñz¿š’ÑjŠà•”ò˜G|XM hõq~ïyÞ™£À‹ñ‚Šøåº…æÜVÔNÖ¦Ýå 'ɰªtØ8´%¥¨Š¼9î˜ÕxØ œÖÁÞS¨Y{‰‘gO#èJ¨tâÏ*«ž±Bk¦«R´Bï(±ÎjÙvó<:N¼¶¦ ó«eð^ ކO ª×šµGáô`Éí7QT«]ïa¼ø µô‰£åßóNÉ…] —ý ¹¼ž!—ý£ï¼žËá¹HZjƼ1tx³!»¨‡Û1›vôµ3-g`™Fôó“9ÒH¯¯åÁõå|˜é펺ñQ~£:Îú´ß endstream endobj 2533 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./multicontour.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2534 0 R /BBox [0 0 198.21 200] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2535 0 R >>/Font << /R9 2537 0 R >> >> /Length 36987 /Filter /FlateDecode >> stream xœì½Ë®lËŽÖ?_‘mwzÆ;â ¸'UC A-[pAØ%@rÿo ’ƒdîØU • i¡·vœ•™ór<ÈÿöyŸòyñö¿ÿÇ?ýõ¿ýûõù¿þï¿þÛ_u÷gœO{N=ó|þé¯2Ïzzñ‘_>RÎÏiŸ_üÐ5ŸùÇ¿JÙç)çSßóœYðͭϧ4ù#{>½uŒðS÷ˆêÿúÿæó_ÿÇ_yY¥=½¥+çȯ4²ÏsÒeþa€Ÿáu—õìÙò…¯ÙŸÒó…ÛHºNûÔ=ò}éoÇeµw=kN|wåy—üŠ‘ÝŸÚ¶\ª}êñOý+^|™e<³¦‹çȯ4rêóžt©á§ìâ˘O?3_ü®ãùÚu .”Ÿ¹G¾.½î¥Ï«=mÊ”é½ësב_1²Î³›¾ ûÔ=âŸúW»ô2ëû¼5]:G~¥‘3Ÿ‘®óüŒ]øO©û|þÖž~jÑ+ßõ™1ò‹#q¡üÔ=’>õÍ×þìïÚØc0¯p¡6ð‹k=g¿¸R~æ‰ývíù¡Ë…æ‡.õÅ é:ï‘üÐý'O-ÏÞéÂmàW œ­ßŸ¹Gø!»ð>žµVûü­ \ô9ýé[þõËÿ–}è'þñ¯²[}Fÿü­¼ò}ûè÷½ò}ú¯9Ÿ¾ê’g¢}è'~¿È¯kÌ—XßÒŸ=ÓÝ#û¾ÂrZ{ÚIWÉ‘¸Òú¾G¿„ŸºGâSvµ¼Ð½x•{á“vAßÿà…½[ÖvYØŒ°3Ôþ>{ù•FN}ä\ô]üÌß{Y«=‹±Á˪߫=eúȯ‘cAÎb~êñOý½VγËü”Ùú³ð¸Fyö¨ø«”§Èôâgî~èï~\í}ÊøÔ½Ÿy$˜Ù³>eûÈ/isòËGNëÚ‡®øŒ]þrvÅo¿ŸÿþŸÿúŸÿú×ü´óô2‡ÿïú¼Ÿÿó¯þœsfÿü?•ÏÿþWùü—¿ÞÏ¿ý«LÄ´xO¯G¯pÜGéOkCCí]Ÿ3>e>Ýõ¹úSû§VœØ²¡L ûS×sÞÚt¤ÉšyŸrŽýM•€ü}æ;†Ž”g}Z‰?/Ž»¶Ÿ¹ì§zCœßÛ³y9í`ÒôùL~ªÕg­ÏxŸ3å°,³.¤£?s i˜”c=µh,‰r”Ϭq9ïxJùÌóŒWÏ•ù¶g¯ÏzŸV{åȬé»wŽTYmë ;å™û³öÓŠ,º2vÊg·§î¢²þdÏçÝz[caÍ~Î+±Š†t 'ÂiÏ~ûÒ¼•ó®kmŒñ`Ç|ËÓmiõƒùTÞñðS½?Kaã.t¤=­Ê{ž×~½—§ÕO)ïS—~ ¯3c>ãè§j—o®¯„š)ûÙŸRûój <^™ª¥½Ï;l¥#Ýû”ˆ+«ŸÒ*~!è9ÏÀŸŒgècï§=ç|JÛÏÚ:²ö¯ÒÛ£[26¿¾>¥ÏÇÞU_ýY˜¸çÙú½sc2•ÑdYËÈÀÛ”gÜÇ|p½O“ˆ±ôÑäbfnA@R>eΧ0f–¼¯Ìõ4KsŸ:ϰ÷ëS°Pt=ôŠ·ö)k>KØ^äý–]žWWz/úÌwzÑë{'ν²çsô½ô·Ë7oÏúú[0Ù‘•ÚiëùSNlJ6dÝŸræsª|¨­­1Áûl}¢m•g—O}Ûs†~hN\`Å+ìCGd &¨ÛF^¼qäð¥êòÔó©¥=Ã.§Ol)U"¹‰ÖÖ3×§–ó¬×F†ºõ}l‰´ºõÕÚŸvô·ª¼ýZdzô¡¶2Ÿö©u?ûl$¥¶ÂY‹D·a¤â:e@ö˜ÚÆÓº|¨bA­OmËf$Rž1>ˆÞ–Μº ¶˜Úë³÷Òtuã0«}=¶Ô¹žµ?µï§ŒÉ‘.U§qS.¦ïgꬣʳÁ´+ú¡¾Ÿ·|êÀŒ×¿i["±±Ÿ¡;îð,϶{Àñö©³ñaáÔöÁ%Ø/½+úÂ1ðÎnäÕ`oz醜ú¬O]50›-íVcú®þ©kð—ËZOùÔ5±±ÊÀÜÈ>êÚÏj:Päò÷‹µ†ÝÆð”·Þ!–±D¨íiš@—ŽtK"T ¹°Íôò‘U÷ýRb{Œ´c#r½x¡úKµ?»I˜f›B)EÞ>v^ÝŰ/Î*#v”WßÛA&)¿ýž.sñ´§êM½û<{|êéÜTßÝ$$ÄŸ¾rïZO?L¸Y5ü_ïóîOE¶­¿þÎWÖ!.]òï8Ï<2býïÓð7ûE®ðíØ`?õœ§è{›N€sžªÁ‹M©ËÈÑì­ëKBÔ[6N t=Ùßòbæcdéœ@þ;õo6ž²Ö׎l[ç”O{‹Âg·ç´ÿ3NƹÒ7¬‚ßß8³=sÕtgœ§¾+.õ =Qân¢Þ•ïøô÷m¤§rZ‘ð<žÜ©õiX]þt‘sc>Å8˜"µ¦·t° Ë{ã›ÜgËZŒ·½‘âوΈ½×óbµû¬ÙkÛ+ÿ-"€Y‹ä^%Ì‚@|¤Háx[%E³ wȉ„ã-G-ëѤG6«díüŒý>1HÛp)ˆk<»îhõÊ ‰`L¢oD·°1eeGP7°+á›=ðx±›޶%€óèq´)ó%"ÌQ·¬ºˆBG2#RÌkŠeGi2)"Þx¸mGHŒ´Ë%¢æ~¦쌫ûFðQSèÝw}úÊáy_ó9;ø¾Æ3æL1~_M¢uO:’Aäž*tÉÄJÊ&:r?üg½¿²9FVÒ‘Δ¸ô¶žÈ“›Þª‘uÛÃ"I’È{Õ”Hõ¢ï6’­þê) Yå†#gkgÉRм®ÉSê‡8{­•ÒCŒàÿ‹RbñzRšÙÖ”g©(bñ~jJWÛØ2#¥mÈwGMi/àÀy‘7LÇqRúÜ0Oʰ›d~+eá­¾àÈÔ[9²9G2ß Ö”ï7äרÙÎ ç€ã8˜1C[À‹6ð‡ªì!Š_ýCÀgoãñ[œ=,Ò#løÃ2u…-ÊYëÑÉ`‹‚äŒ[”3Ï£é•Á2RlQÎÜü…-Ê™ˆlQvˆš`‹r†@¯[”Ó±#'Ø¢œ>ø= [Ä6ôlQN[¼…-Êi²ÁåÔƒ€/` ±[WØBF4„4ØB8‡‘`‹r°"w‚-Ê)í1˜@a‹rÞ£Ôa‹r^lŽ ¶(yͰ‚¦v2l±OvɰÅFhô[ìó>;£{^ ¡kreÔb¯cOÇP „^;ƒ{þ´¡GÆ,ö\v--6î­fÐb+™@‹=†Í.¢× ¤0Ôb÷ÑÌ‚°ÅÆí¶Ø½?ÊMl±Û±7EØb·Í7Øb7Ä;¶"ddØb·×žq 0Žöã†[ìÚžÒ¾q‹Í› nQ†-5Ç-JUþ*p‹B2×q‹ò*ÓHØb¿r¿[ì·Íi°EYg?g%Ø¢,læ%ÁAf/ ¶ÒEQWƒ-ÊúÚlQÖ¤¨EY DjB-ÊÚõjQÖ:6× µ(½Î„Z”µºäŠZ”µ°+'Ô¢¬¹ƒgµ(k®GÓTƒ-„‚WhÍ`‹²fµIi¸EYãØnQÖ˜ö¼ ·(kTÀ [”5ʳ¶•` QXÖ`‹²ú|0Ø¢,LÒ„ZÔhQVÛüe-ÊjÓž•eµj ¡e5îÐ[Ȉ‚[[Ȉ¢´ [”U¶(«N›è[”U»ý¶ÂeÕfûªÁeÕb3ßp‹²Ê±»6à¢,½ZC-ÊÒà,P ¥÷NB-Ê*³)P ±k©z¹¥òw¶lŽ[”…7¡eQœ µÝú µ(KŸX e½¶hQÒ¸‘@ 1”@A‹²À„'Ì¢,„H;a2RWÂ,ÊÒe˜EA ´jÂ,dd¬„Y”‰4$ÌBFf-dD·-dÄð-dDÑC-ÊÄVÒ µ)&a°Eúï[¤ïPÜ"~†¸E\ q‹¸\qK.â¶ \Ä£!pÀE'[Ä´!lS‹°EL?Â>C‰ZÄ$&j°E¬Â±^[Äš2Ø"–a [—Ä,báhk›¨E¬¢±Eµˆm„¨Eì4D-b3"jQ‹ØÔ ¶ˆ}¸EìÄ-bû$ná;,a ߃‰ZÄ6MÔ"¶r¢±Ýµð EœZıBÐ"Ž‚q<µˆ#ÌP‹8å[ÄIHØ"NKÂq lg®Áq,¶ˆ£›°Eï„-< jAQ‹$ˆZD°AÔ"¢´8já£ûjaáQ€Œ ´`” #±ZX´æ …GtZxÔç …G†D-Q‹€ˆZlਅC ŽZ8ü@Ô  ÿ¢ì‰ðDøG"ü#þ‘ÿH„$Â?á‰ðDø_]"Ü_„ÊÍÿ÷_”#Ç—·çáÕ·ÂÌÏ2ÝÕêéz­Ï,­é\_€ êt ,fÿiYí lÛ`c õSz}Ž©—çÎÀ%»C—U”Š9w8ŠÉ1Õ§jx»FacÈžQ™Í/ÅóìáSˆ(gN&B£I6’ÝQÏ#Ø™C‹Õ˜Ã%0÷®ÔÕ‚)ĵ·  ‘üŸ÷yÏþ$òÐ Ñ«9U2_#…ç]ÏR ÀÈCˆ_L)ä!FÆc“FɲšÒ§ZjiRaä!ä9& y¡buÒojúT™M™<¬uRX‹$ Cj»žYMi“´·h&$G]P€àÁ™³% v²yß_ÓÚº$Ü!ÄÁàR”06#&"›ˆËïcJøúõSÇäâPî°NÞeÓµ %˜©ÕÛzE4r×e>t$ÊHèõRÍÚfñêÂ#Ö¿‚œCð6ì·Lñ OŸVÓ eÝ»M,ò[¡Dmu«zõP L ôy4™§øê 2ÂiS<ŸC3´˜M%™GÙNc ñ§úb ÄCJ^š@ŠA ‚¬¤zyÐÅT§u(RPË3u Ø ôÑU_ûxêþ´:ž×ÎØßñ©e’ìÚ^ÑŽ6²W®ψ?Ž}k|Zk‚Ûb¤à]ÀÁÚë3²° þh#E~¼¿‚ÿJp(,8¥¥y±rƒ­w*y!+:Býïøªu—/!¼;uÝ-Œ-ĈÉçË4µ —´‹Xë|ÈzõfaØ$OT^Øú´±ü›•l`Ô¶± pHlþVé~âÜÓoV:°‘Òç:ê\!ïyŸZ>˜âfã16PFô§^Å0vj#ÿöÂn{5ïªòçÄ2BŒl¥zß©Op!äÐï]¦à*\5Æbäè¹óbî|4¡&Xn‡vCr¢ËÑBŒ ÝÙ_=1 [èÀ…¡­n¬2EÍKÙ0ã{—]±H´EáÆÛ¨j^]*@$Ò^[ä¹é+LÖì¿rp˜õ¸Ž*c”t©$ãv€ŠÎ>Ò-ð_xýþXHÆ“;à£FKO÷”.GK¼’ƒñ–C op46‘xÛ`{É3‚|aÌÀÚ‹ó¨V# óÜ#]Ó¨<²¶˜Â{€xÍÓœì`,Ic¾–‹q±¢ÀbýŪÛÐ_àMùÊ4:0ï.J¥ÆA(Ï{ø-{ · òƒ±•¬ Ö¤§Ýò®Ø‘ÈÆ®µæ[ðMIµš6?²±A ¡·Óºä*b—“(/×7bò…±YƒÆºDäc¥MŸô` BãS~xôóeâ$ÄOùDŲŸR N?ɦ²K:í(Pæy8úAÞíG&¤xbâXý}êœéèuɲÏÞa!Æ>!p†LÜy({(0‹L.Ì‚ƒv¦‘óE:Ã’™ pF¾± eL›oHõE„‘f#&Eá8C©µ(‚?·HþEH6À²!Âñ°m´£šyí+c7Šèì_DˆPÞáEF öOü 4ü‹Pt L€äáªÄÓ-‡´BþáÕxØkä_DÆ ÿš0 Œžû~eF„Mòσp Ô^S .Ñ4`læ;ö+Ñâ1àwþÏ“‚>ªR„ž8 TÆâñÔ¢Û Œìà @ÏPºÄ~9‹ÑjJtœÿc.ÔñqÅäRp(¦ŸkÉ}†ŠYLp(fºKÇ}5ŠC¡¸/*‚C±ðÅâ¤VÜ×/Á¡Xã‡b :{…«Ç}?!:[ѡؖ\+î[—¡C±»Šеâ¾K:©¡C±×ŠýØåä¾gŠ}ðPìý®÷óðPœ!®÷s†øPœE® çqE|(Ž4âCqì¹ÜFâCqvŠó•øPœÁ¡ ç9M|(ÎrâCqÞ‡œ1ñ¡ˆˆElA|ÈÃ׆{„B|(‚âC縜¡ᡈ–EDEx(¢®dh·ÈŒðPDo„‡"Â#<A ‹Ã=P$<ä±$Ñ¡7© ÷ˆ”ðPD­„‡"²%<Ñ/µá ;<äA´ÃCŒ³]ÎHÜÑ!Ö²€>À!Æü!g^ààçyzáè§ !gšâè§2D‡<ÛqtÈ3"ÂCž49<䉕ãCž|9>äù"M߈yzçè§€Žyšèè§’Žy¶éèg¤Ä‡Î ¶\êXð¬"Ê€¢uEI"5Ưi‰ qL°æ X=À ØÿT«U_æH–ÀÜßuÔÎ V±Æ xÌœýXÑìqºÔI*id ¡ŠU:Õšò Å9 }«Áñ ÛW©aЂÐè@Að%¯ÀYL¡RIýSźo´`—c¶l–6Z°VESeDvKÈ[LÄ Ôãd¹3Wë=ŒDÊdBÍÃ1„ËRÜQTrgøÝQj²HV´ JMš¶~j ò;æøUGL/>'å÷}K2+Õ|ôrà‰G½Ï<÷%‰)*sš_€zñý>fyèSËÆÂßn§­hqH—;È-cjÅo)!?Uª_8Ÿ¡¥W—Õ²nV~¶¸6]™Á†*Æ\¢%„cÓkb#úNÒå^ªÈu¶¹€\–׉>GêÊ×ÂÅÚ6ŒòIƒÜ@}}Àµí\{ªÁÜ®$ ÒÝ)Š;ÓÆ¶%/ªµII²Ñ‚`õL´ZÆîuŒA вZbD£¹³êOÊ6”Û X\&bR˜¿"ã›"²´å £”,Õm¢Æ¨Il„˜ÔŽÔ½eëb mØÛñ'ÛêiQ=Ž\lZå©.*Üݹ¯´€ÐΈºÔzŽjVÆÚ$æ§P€Œ)Ž{€ˆ@Õ·Œn“3ݨĎhÅ¿.J˜?…PÏþ`&PÎ^E‘ÑßÍ]ɨDŒÿX…°í¨à¡¤.¤j}~za¹6#ZëV3[vDØÅÔÙú÷ÓÔL,J$"ÖÛÊQ¡àáGæ¶jâË’Ê4¨ú0¬r5¤»íÓ.©zÁˆÄ.ŒŒQ‹Rs ûè&1Ÿòã8NŒîS"±·ñ+±~ºè2jQ`#Ôƒ³ŠöF-v¤ºOÉ)6> ÷ù©"%€±ÒÍŠcÔ"Fl[—R]FÌe²ñmŸŽ3li²u¤¦Hábne1b®‹w E‚U)x—¨}PƒaÔ¢lNÊGN©„Úx6™^@Šø“nl­‹} ÎÉ·¿ˆð¤ÂžžÆ#Ý-ºbQ‚ê­225ÿy‹DYV\yÄ>È€¿¸é±í¦* ¤Âˆîûàñ/Y, [iù?¯-K6}…Rˆþ @ú¶Ü//ŧä¡ñ:É Æ½Ä«§û%_Ïä-'ÛZ£ÕôdIúÃGEœõþzö™úÌøÉ ÆKV ·¥‰rá˜,[…’&Ù˜t{•G¾˜óèö–Î]’…1¿wB$ÄØØÅ×NëÄèÃXJR0§Ž´ÜPf…hbI}«®+V6ˆ l¤±úAb¯ˆ‚ôaì" ñZc£}R46#Ò‡±a!çD_ßÓ@þUmô¡ïŒKXÍ6OO‘Ç‹²TòÂ}&5*i¡ÂvlæˆØĆïòr?ÀÝ!&ŒƒÒ>¤5q¸H;ȱÒät?¤¤D,Ž$žc!§X+xÒé‡áÄA¹ò‰è:é8TÁÞJ{?x†Œ³yö! û8¿É1Æ OÄ`K¶tÄh‚¤cDóÕ Ö• ˜‘ 9Fn çàg ~â›ÌÁO-)‚"ãQÖË##ˆ)Å€#T؈ð-Ì‘pŒ€…`‘HDP8°ŽOM£«Ï=¸BJ”€©}VR:ªu ð@–‚tuÇ«8âaÔy•Rû3w¨Ìß•âj Ò=ôߞ#:—ÂåQ>*ÁâiE&З9…ÿ’°Ýà?-q«?D[@9&H7øO‹ëš-ÀŠ»DÝà?-þûÉFD£ý“úÅJ.ú'–Í`¾ÄîÖÔOÑ¿2›8(ú—êÿiˆŒÿÉšdqÁÿdMê€ÂIj®øŸ¬QSЫQ€©î,"n«=¯ï ‹v}ù M´Î{ –9XÜÀ¤7P¦Ñ„^Ä~C“ú›.€Pv(JZ37(˜$Ù†ŠöwgP4Äz”(Ûu†;Ú'QÂÿOv ”Å’ð JáÅ!@ñ™™Àê7"Ìþd/2Åà,"Oý€²Ï´ Ê>c¿­`H?ÿ•ñšÔ‘%].2þ'#¯¨ccìcŒ€e@ºªßlV‚!Í'À"{ P¶0½-³Œõç,H£†,Eh ° ª/ñ>µ ÕZ† j׉1·õ¡0°ŒÉþ´ I]?–1‹› d«)ÈÙÆ—¹@|U† XÆ­ŒÊŽÚ2¨{ìþ(#æ«PPüYÝü‚¨M­dƒù 0R3(BôXtq”+¡`hydU&,H+ Î3wœŸÀ¥áˆžƒô áð?ÊHµ¢ó`äýòÀd6”ÊÙDPG ø—Öl00ýwCÓw˜‘Àƒ0`\‡Á€q©n$ðÛ! ·ì¶>¢€ñàÆÃu×€¿â€ñ’ Œ÷è×c>Œ9C 0æ•Û|îÓ“@`Law ø4'K@`,ú|EŒUG 0V&}¾x Æ'›ÀØ(ÜGà› ÀØoÆžä>ß·ÆÞF$0ö?7øI(0öQB±× ôíØ¾c Œ]H`ìüá$àé@$Ð~ÄŒS(¼<©ˆÆiF 0<ºüL$ç&À8[ ÆùK?‚Ñãw³õ# !‘À+Ü~à¡‘ÀOˆFãns Œ8ˆP`„JÄ=šró\„#(#ÁÀˆíÜ}àñÁÀˆ F^Æš=%+±ÀˆjÝ}ÀÀ—X`ÇÄ#€&A¶»ZK@`Dé#’§÷Àƒ}‘Œœ@`äQ™‚¹ÀÈOFC 0ò7x.D$0ò%"‘S¹ûÀó."‘› ŒüH`äxa?`èP §Š²‘@æ›2'u$ÐóVG=·u(ÐÓßð$0Cv(гhBžh;èɸCž°;èI=Ñ@Ïû‰:4àh`X/ t„ÁÑ@G! $Pá` c:Þá` c"lB00 ‚¿„ ÁÀ€qÔ†ÂAD2"˜ÑÀÀˆ4E40à+¢ÉGah`À`DTfh ¡4ƒÖfP`Âã Ìaë üÍDñ#èÿôÿúý?‚þAÿ ÿÿ?‚þv@ŒòþeA?¬Ã_’~´ÈE|õ«5½§t÷¬½œ%2ÄÞ‘Âx€*¾ ¨£gÖ+¹L:¤¢@íó,¯ZBÍ6šòÅ´I’~`«}†˜85¢›Ü?C{Ia HÙ ä&$Ý"Ê’~©PÀân“\Q bÑ ~ƒ–,Ò0›Eá·ðYŸ¿ÊE®®„R•¨ãC·ÀRz_oŽƒ)ÐC’çK×9Py/‰ÊâzÆ5¤Exòmt¡”`û`ï3 :©I Å«q»¨ŽFWr¯sÙ¢B¢Âžq«ÆU¢f‰}Ú6K_†/ W\Ó¿4²i7[‚R•34ýG‹Í!©Œ4-?ãŠý½ê¡<¡ KIU®Íú¸Þ^áýžiÝ¡HŠ}o•í5˽¢Ù êT%l‘²ÆTίå`*UbÊI#*Šo+¨ßÐC?¦–¬ŽÚ©76ê¾¹A0Rµ9Ð6 ö§6™¬RßK¯W©K¸ž›UrCxÈó'Ïçq¤Ãeìc¶~`§6µªR—Qi]²Gõ Ò/A`’ð¨àÐò¢¶èh]X“•– ž' ¶$ ï½v­ˆjUÍif@k9c¥@œÈ§ì‹«à{È_kÚ­Ä%„Y;¨Ì¢ÂíA â@’Ý£:¼Íex­~¥-[¥ÀÊ™5P””<ë«(­Ð˜àµ° ( ¾‹…å×{wSG—}'ièûÔ’âB¤éŸ(‘‰¶Ît€ù §·-ÚT”?Æn™ËÞ#Ü0î³K7>°zÍhÌÞ€·$I=´ŸU AOkm&ØÌ³œª—·ï°.‹ãѸï¨8žö s1ÿ0R2úÁÿØRQŽ2©Ü¥ÖôGM<„"Ôž&Iè\±'é€6QLÒs‘ ªÐ¼¬ìHek*|à²VW‹E“ŠTeL<´ …í &çjˆ L®2æ8âXÀ¤¡aEbS‚ F[h$±˜˜çžæ’¢ŒLòB +‘-crЈŒÚHËHºAZJ OÌAZ6ø?›u¥P 7¹. Ä•2¢êݠߤ¾–N:ˆ[XÖÛA\ïýi®·p· êæÁUC‘Õ‘7y.ÁYOý²šÀad—¢n 1¸RüÕ Í4³W>Åoe¤%7ù- À•‰Ð¿¼'˜#¸€á¡ àf¿…¸°!ÑX¢Þ“è `nYm°s„"¸É;a®®Á•"ÁVÿEܲʶ+67y' Á•¹¢0*Í(¨›œ\‘¼™_E\5&éÕ˜ó LìŠÀ•‘aÓ¤º[' •RÍÖVÜ'˜Lv Ö’E   U 7y' ÄU;SqËœÞ(BA\‘'vƒu_ýf÷AŠ+uµ ¢5;Ê웎AqËT<ÈQ\©nlÌ{"³ÐjÑt%E 4`W`Üä‹0W+´ëÓe9Ç)©}³¹aq0 ÕO¶¢@­îq¥sÊI…f’UAAÜ2ö`×Os•`Zúª ®(~[Fq“}ÀP\ÑTs•ˆ‘*£¸¥ õŠ Å•©k×g>à-ÕjÏ 5øfh0n’ôŒ+ºoýÙL 07<[a\qV0)0n€Ó*»(Œ[iXã3žŒÆ†#ãA9tDaÜ‚”JñkMD÷©øë4 wá)j0nR¶û8®¬¥8ÜzR¶U·Â˜È•µd#tšà85hW€ÜI)KÍèÉÕ†äJ³Â˜÷¤ÎZCr r:}£†ä`Ŋ͈÷IžÅ<ŠäU6|É-}- gh4AÚg…eÈ•Þ2ìb!@n¬aFÈÕ•ýIÎd‹-ã¸Xêqe‘+k–“>Û“1ÜÒ'·a¸E²MýQsœ »†êêIˆ‘7c¸L”@4 · „ ûšªãDÜmЉZ? ŒôŒáT(ÙÄÜŠ[z_üEqeäÍ(®lUûËr‚­ê»}¶*66w&tß5WZîl«CóúˆU¸QWFÊN8®Œhg½8•gÆMÿÙ`Üôæ9ñ_!ŽWB7®ÖM'~Cn:ñ›vÓ‰?¹ñðäÆv׉¿Crã=y« —î:ñ÷M(7æ¡Ü˜7„rcn¹ëÄç¡Ü˜£„rc»íħºHp¹ˆäÚ2¡ÝÄ—a\_iDqc1ÅKÿ‰¯i¢¸¾ì âÆÎàfß=âÆC76!7›øFE763qc¿#Š{b¸O¸oŽ•(nì¿a6)ì*Œû8aÜØë‰ãÆyàö?3ˆãƹB7η›øùD7Î0â¸qÎÇ£?-‰ãúJ7Î\â¸q.ÓâG7Ü8Þ äFàŽäF(A 7 ¹’¸#ÅÃ"¹Ú¸ÿÄ£"¹ …½„A‘\‹²ãzF7µ°–0˜#ŽqÜ ‰ãFàèf. äFJ 7bTzK<Š%‘.܈†‰äFÄLo‰ÕDr#ð&’Á¹÷ºðž†ñ‰åF@,7r‚¹‘N¸áÄS¢¹‘–ÍÔ%ì%ÌnˆæzD07r$‚¹‘G…ß„¹ÁÜÈÇæ&»Ž¹‘×¹ßÄs?¢¹‘Í ’hnd™î8ñL”hnd«Ds#£%šI¯;N<1&œë¹3Ñ\Ï®é@ñü›`näès#'˜©¾;P p,—hA@¹ôÝ8’KÈ! („%Éuè‘\‡7Êu$(„IÊu(Å¡\‡[ˆå:"ãX®£6Žå:²ãX®£?Žå:BäX®ƒHŽå:ÐäX®ƒQŽå:`eX®CZ憇`.±°Ÿ8vfXn‚× ËMœa¹ ¦£%<sÚ·Ø%µ1•h2@Cs®hhn@æ&tÒÀÜ„`š›PNCsjhnKÍMxª¡¹ s%šë°,ÁÜßL5?þŽÇ¿ãÇßñãïøñwüóþŽÖmüßÑáqª¢úañn`éBë§jÁ¦‚]¶é6V¥@œVÇ‘ŽÒÛAažW‹z÷g7…cáÁíP¨°3–Ç]òNØÒÌ-[”-H2›-(Ð1‡ª…–âSïÊšîTiÒ%¯îêý=ðP[¶l;,áö\ › ¥•ø+B ¢£à2^s‹ËÀíSÛ¢*Àk%ÿ” Ešf›Ð49lHb¥^Â~ š­º¿ûpDÛ´ 태ò…9¥uCÓef!>A/QãÑ¥ø_¬]?d_IŽ A­ÐõÀUýÆ{Jeíé yìQ?Æ´Êx]Rçd¿ª†ß2¯šzY6©x ;fóS¤6cò_A;…Ó¼¹ˆ¹YÐì™vµE¼•ë àåù2`ô-s¿£"®ÒãF…‚)´:  BQ ¾¢²R¬õïŒ>µR½0"6"T( ‹«¼Zg)On¯Wñ’ÍÀ@·I‘£@Êm+þ²k.xoÄg—ŽÔ6"Ýäq ötºNÙ一Bº£†«•Tæð“™:D~õƒ*„kXY>éLÆ )ú­¦ÚLÔá‚Äk[úªáá}¬Q[z¸¹Ð ¤ÈÈ ô:ä­]* É(ÑPC T%_FšŽX{ #PGÞP£K—ã ¥*; ˦£E TH»ßbj§ï€N™òdɸЧeˆZÝ6ãOåÚÌ !Õa_–zš´kšO ýF É5NSùS,b{•(ÓWË0k·.fUX‹G—ñ§(ýÃж®”“R>€ Œ€ •ˆ«CÈ”Š2c‡ñ§Ø˜ÌÒþ·u¼ ‡–îC(;Ølùü»3¡*x²þI}q˜¡:©ÙȪÔ%ÿ ó·f²©³§ePê¥ øÕg"xÓ5%cÇÈ~Þn•û@§ÎðF¡pߨdRÛ˜Qhæ0âl|*zMÛ,úü€[HpeÏì^'o΋sǪƧ¢0”µª*M6c4º¦¿FITœhÖ—uûäoâSEH)a¥7^dUÍXàF«bļ[¦´Ï”ºaJQ¬þtFö)#Q>›÷õÕõ*|†Q¯K ¢f%QH³ŸÆúÍ~ˆ¿Câ½¹} ‰Škuòv %ØËzéc¤=¦ÈxA1öJ~-+¨D+F,>x…^û x•ñÇ`÷ ̇J2Œhň™ßWÚ@cäh黣?ñ–öpÑŠi@q¶ZÒÇY Ÿu|‡2­ñ3GªÉõt)gh‰¿Z­qCOj¶tÓÛÖ(éÁÏ©ùÙ‘‹ç \°—ô €.‚F‹×D*6^%1ƒ®×}P¹ëô4%ÈÅÆ´Ù¨†×íS L:1ýȼÆ<ûž4‹!ÓÌáWKKDl,Éú¿–”ѯ±ê@¿"kŠ•‰Üá/Þ-8TKëÛèר6j aÓòm¹ƒï$¤_c·¤//Î7$Ôà:=oZ dqðÅÆFBÖ÷>”ÀÛ£ä²ar %ý껬ˆ+ß™6bÖþ‹ÍzI‚ØÎÉÆÆŽ~)Rœ È Ä‚ä'Dz§§ ÙØ8–¹µüB1Àžd$cã°W…ÇâÄvŽŠð~h‚ŒEL«‘±qô"£ÄÇóœ¯,Ù8ÂÁÏâ)ù!odl„((ÏÆCpˆâuòp‚dl„˜Xl–˜Ü2"äÇ"º!¸R±Þy”$)F¤¦,Ôj¹ïÆÃ1H)¥ÝGlxeovH ”,Ã,ã>ºBK‰™ñã0",L0Öè£ã‹›œnÄ©Rb™D,K¾6â]ÑRÖˆˆñðqw4#¿‘ÖÆßFè Ù0†χ7õaþVzy˜oümdG @d Ý2’È(OŽ•’:qŒNÈö!¥¤²m€¬„}®~Jé‘q)-ftB²)P E=™NPª_G”N²ÏÆO*üCF'ˆ^­Á`Fª*0^Ð òPv¦’ÈèÔ·BsÕËF'Èc2Bù„d2BAÓ²uW 0þ@…"R&’È) þÕÙ'©¥Pæ,†û¥P3ÕL)ÈsûâdÄênMë_î"#ôIê§ÌL…<ÊHs%Dù p§‘ É d¤‚hCõ„rUáS6VA+Íë§”U3‘ "\µ†EôWÁ¦¦7ñšKç,[kF*$C‘ Ò5idRAž­áíJ*ˆØ–þ*¶¡#ÈHé7ÐmDýU’€éˆ Òê€V)™{ÉÚc¤BAq+¿e–+äÃ(«ZhÐN…Ì>¥¬BA ÆfßÖÇÅ @]9uPKf~*´U²'¡¬BA®k|”UH>£D#Þ­P†Îð D|®›´Ñ Éc¼‚èÜßÌ+” ÑÃÓxéµd|€ò É&c¼B‘lW¿ÇŒY±6=Ê+ÈK´ÛR^A_™™®Ô˜µî6¡»Æ>%ÄB2¾± ^‰‰qaŒD,”•ŸÂÿJ,”ŽHÁt%¤‰“Þ'Y¨öaÍs”X÷Lc–ùgjµ3ŒÆ,d€VpKpñ"kièê3*Cµ^F+|CPWV—Ôà¬Bé¯÷ö±Ž@H ­ü—Ò ‰³1æÓjÈËõ{”WîP'ó 2ƒ¾]Y˜B3 ¹å6W– Ò1ÊJ\)±PÚ*ö̧ÕÜ®gÄBAr­' ¥M^2Z³¾–>@ÍI?A,ˆEк)³P”ZoqsjÁ4¨ÁŽ1 ¥u7|™= µE̾¥ÌBiÝ?¥Ì‚ÎVµŸ)µPš¯r:¶šïÀF-”ÖÚê[B-Mx?ÉŸ…YoÍtlÍÂŽh•¹”Zu`…ÌŸ…Â%VAK©]ú7J-H³,}†ôgaÄjj)µPšŸÄF-”VØéШ…åtùòpµÂ7hÔ‚Œ0gnA¦Y¶ÌÄ…Ý”[(­TÝÒÈ-Ȉ¶í–'QªFäÒ7n!}‡¹¸ügÈ-Ä¥[ˆËu—ßÉ…¸m’ ñhŒ\ˆ§çF/ÂF.ÄK ¹/Ê}^þ2I.Ä '¹“Â^>qH.Ää"¹Ðm]>I\ˆyLr!溱 ±ÜæåK†ìB,+š»|å‘]ˆÕIv!V0é…XåtwùF@z!6 £b?qw—ï9¤b["½[é…ØÞÜïå[ ù…Ø&É/ÄVêö.ßnI0Ä–ìÍ…|Û6‚!vv÷{ùîO†Á ~„_ˆSÆÝ^<ˆ-„<ªH/Äqæ^/?òH/ıHz!ŽNÒ q¼Òëå0é…8¤I/ÄANz!Îzš½< ¿!ù…+Üìå¡ù…OXÎÁ#ò å¸×Ë#!ò -‘_ˆˆÊ†ºÂÆÀŒCÄn$"¾#Ã1 [Æ©›œ–`α’$¨‚Gšþ³BþþÈ;ðZâ7ˆïÇu°J[\+Áû¸éŸúŽtÏÄê㱜·Êt‹GGd>/j§`ÚÆ+ ¯iOí/¯’({¼m¢ì1# e÷9¹–bL+ÐuÖí·ÉbŽYI¬Ü'.0ì 1µ ƒÇô_¢Pi‰ôŽe´z“-*–íXŽhAŽ­.–,ñêXÖëUíi,}âÓ±=Àð ¶Þc—™³‹Õ$v"Õ}«bûØÍ"û†§5µzÚ Ǿ ½ ¥Ø[‰þÆþ;¤¶ôH[4‘ÝØÆTe=oõ„mã8 lGaÛ8V °G¢Ga²q:¡ œ&q‚Þêg\ßJZÅ1hXª”ÒΦÇhC`@iœ·"NGç'?“ ‚ƹ®ì‰âl'Àç?àL„V#ÎŒ8¢í-!Z„®ˆöp¤A7Òg YˆCFXÃÎèúÊèÁdÙÒ Âã'CêGèCá1±AÓ ;(3Gr®/öh¯¢L"lâºvØ£F”vE<‘%ñºˆ>kÅî?R„J4.é!ß3EºÄÚR4|^1x¥€™ÈZÄÔØýWŽ» 5óÈ|¼Zl+‚w"bß7õû¤€€WäR±ç<‚`–çЬK­-ÏGTEβpŒ”ÖƒŠÄdÐ×HŽPQ´‰y— TƒXRúÓ1ɵ‹./¹ŒÿÓÐz#’µûoîï¹뾞ûš¯Ûºïü~:÷üÃS¾ßÄý¶®z¿óßgÅ=o®©u;{†þaß3ý^ ÷йWÕ½òîÕy¯à{•ÿ¾Ü{ŵ›ÜûÍï;Ò½gÝûÚ½÷Ýû㽇^ûì½ÿa¿¾÷ô{߿φûü¸Ï˜ßO¡ûœúí$»Ïºû8¼OÌûT½OÞût¾Oðû”¿#+Z¸#Š?Dwdr/w|ó{tÇHWuGZW4vGlˆêîÈïŽïòŽ2ïHôŽVïˆö÷ ÷Ž‹¿Ãæ;ªþ=î¾#ó;z¿#ü; ¸3…+›¸3Ž?d%wærg7wtgIw&õ{®ugc9Y»s¹?¤{wFxgwfygŸW‚zç°wž{çÂW¾|çÔwÚ}gæwö~%ø7ðÜÂï(Ã…CÜXÅðŒó¸q‘;¹ñ•ƒ¹qš˹ðžºa£ Xº±§ žº¬庑° ,»ð´sû.wcw7¾wc€7Nxc‰7ÞxA’jy›À>o|ôÆPoœõÆbo¼öÆt/Ø÷B†oôøóBßHõf_p÷ˆß˜ù«_ÈûÎÿÁ¿Qþ› ¸Ù‚›Q¸Y‡›™¸È‹‹ß¸9?ð$•r³-!óas3:7ës3C{t3Lu³T7“u³]7#v³f7³öE¾¿û‡¿ê7wgxþD"íEšSô”†N‚9¡”–GÅœ04Ì q³_B Š?˜–ÃÒ!Ú ÐÄ3 ÚÌaZ˜¢`ôÊ a(g˜îÁ˜€ a8ü˜îΠ€êšpïYJˆÜ-û…ݙnjýÔ»L}PÈ¢,#”*ãûËñ,ËÅSø~Êv¹3B뺖ÕU–1!,«Z›‡PrQÂÆ„P ÉkMnªÆB,g!ö ¤N Q^eQûYUZHœ«™–Ù+Õt&¸s…"BéO¦Þy×ö™’ù Z þ&# Ñ¥åƒzÖ’ñ»Ðw2§› Ò¥¤ÌC‘êÂK¶2”`šWšÂÓ5´LËP‡pHI]­ËŒPzh­º0˜aAMÓ¾š<Ö…Ë.¡õ®/.³u43Bµˆí¬è¥„› aéïPU–‹‡]+΄°´=ôuºNÙÕìL‹µØYíj{f„!Ú§ÖÚ¥ÿL ë—”† ‚)aAÿÛ–SÂRÏ|¾@üÁ£l±.LGY‰$˜ŠUjIà+ú¨÷”–ж99%,h/[VJ KEÇ„“uü•"xË dPò>Ý2€¢ 3§„EJ,d+JÌ‹&„i¡4‘’¦(ÿÞÌØ”Ò÷“ÓB´ˆ2K†¥…Â>m`C“d|rh1-,–É)àö…sZXÞm§€Kõ¼™Ð*ï<ú:ݱòkªàí‹ÞnmyÜó¶£²_¦…âû‘÷I×Í[ô`ZX¤ÄzùçÒÂøÏnâ70-Œßpß‘_‡÷—òku“ߥ…qËnžòÇ´0Û²üñ2-ŒWà†/M–Æ›to™¿m÷ŸqB¸EÍç Ó˜Vn‡ó©ÇÔ0f'}v>™Æ$wK_uW¢¦†±TÜ+èˉ©a,9÷%ú²djK× ¾¼™ÆàÖJß&˜ÆVâ.ΰ£ij’ûEÛg¹aòøÑ‰^AKct×k˜-9Œ}–Ûp[ZrÛµ{yÝ×i¹alúîß)}ÅÑ'Þã°¸Zn‡ÛœÃƒk¹aœen©¿¯%‡q$º};¬Å–ÆÉêNñð0[v˜¼Ðt¥‡§Ú²Ã8éÝömË#b µ>œâ–Fà&~šÒ-9ŒðÅë„ÿݒü6Axí5;Œ`ÊË D-K- ór ©æ€&‡ÕEi¯o`ÉaD‡QFÂk)XrèA¦×«ˆª –F¬ê¥1¢B„å†ó² G*Fa¹¡‡Î‘2ºfj˜âoVñ¹a„ñÌ #Ô—ä0r&‡©Ôˆ%‡žR07LUM,7ŒÌÄ뽸L^sÃHp¢´Œ+à-9´,‰™a*c™a¤ZÌ síÍ #ecfèŠô?ýÉý5÷OÝ—óÛõÞ7tÝóõXîG÷‡Ç{½û%ýöï×|O…{ºÜSê÷YwOÌ{îÞÓû^÷2¹—ÒµÚîy/Úkaß‹ÿÄo;ȽÅ\»Ð½QݛٽáÝ›âïûæ½µÞ»ï½Aß›ø½Ñ߇Á}`܇Ê}ð\‡Ó}€ýá»Âû°¼Ôûнæûð¾øßc€;L¸#‰;ظ’;h¹›;ø¹¤+†ºÂ¬;ûC¸v‡twØw‡†wøx‡˜wz‡ª¿G³wÀ{ÇÄwØ|‡Öwø}‡èWúW.p¥ wJñ‡´ãNMîôåÊpî$èN”îdêN¸®œì÷´íÊÌôŸO ïÄñN.ïôNRïDöNv¯„øNšÿXßÉ÷ ßIü•ç_HÀ \xÂ9ܰÄ ‹ ݸ$¹”l¹™´¹€üù@taH7Ìt!Q7XuZ7èucxvlá.œî†òn¸ï†oØð†/ôñ(/ ó0ç…„Þ`é ¨Þ ë ÌÞàí ð^ ð ÿL¾ðæ’¾aëÚ¾Ðï ¿0ôoŒýáÿÔß`þ øß¤ÀÅÜÔÂM?ÜÅMc\TÇM‡\„ÉM©\¬ËMÌÜäÍMðÜ$ÐÅ]TÒM7Ý”ÔM[ÝÔÖoÜ×MŽÝÚM²ýˆûJ邺kRîðŸþšÏ\ò’¤ƒ¤Üá3e‹M}GŸªR›Uð5.o››´ö,ì·zÀdç6¨¨ÚQäSè¥ÜòMî3ØØo@FX(Uüz~â£?K xàì_D!ÂkùW(%t¤jcã)½kz¹«=[M÷pÔæJ³b×ӯ=}ÊOáõè ±OOóHv¹ dÚ×$iv£• ÄRÞÝjco¢qHs¶È ÖŠßÓ±°ŽJˆ¥ ­HšÖTðÅüUB±ú; Í«­…9¿ªzv ˜0`õm¹`D£fÔ*ÀK£cMžŽ–̈|u o0ÂÊ–²2×<$Hˆ‘¤¼„¥½K›§”vÛ× sVh¯¾´Õ;"dë&}¬FåQ]IJ{šÅ úË«hÖwÔï—%„nʵi/ë©»VÓC46È2¥Þ·6Éž_;ÛÛ­—0€"mà¶>dÔ—¹›1îEGT Ë]tn5èwV.Yz¢cß…T'¶|TÛÓ£MÆgÞ­Q%E·âÙ¤_AA z9nßÌ–+²T˜î1¹&NûO†‰GÊ¢zHµa;‚7ç„Oy[™–¥ÁÒíÝjŒ _¡VÚ¬:"EƒüÈD1¹ó׌Æ<ë _ÒÚ%ÅûÔ£XûuW©Ø”Îf”êªz|ËNŒúa²7£&‘QÌé¼Ç‘‹à ì%tä<–Ó‹•ª¶á¬&ÔØF|jE)Ú=öÐØ±º1Eôb¿¼´ö—‡0ˆó´ŒR{­L à •s5 R55zå#[Å.+5 »¥²¦e ¿°‚:ÈißMx$ýU i2,¾%A"Šƒ}UëA“k,`å:Ë» 4—”—ðýä­B›¥¾wÆeÐf-•To­9XN¨Y 5=¼óx´KÉŽ fˆÖ ;#ÚÕ[Çe »3B6´ˆ˜¹ŠUí²ðE¶¤â ÆŸ"6Ô_B¥liý}õ¬ñNˆ£È–ìÊxG´ZèÛ6µƒÉ1´lÛ²êQM†üC€)g­ÅccÒmz¢äPkÒù[F–Î>Ï.‹T4TÀ’Ø}èK@%"+{^¥ }¤-˜˜:Ð4›ô Ì•l£WóPÔª‡™[ž $ôȳ°ÀEîèéF{-ªEE> Ù)Ðm›ö\l`á>+«Ö 2—H±PKHžŸç“Lò†ÌCAu†¨ž aóSõû¶²hØ2µ ð­–óÉÚª‚û»)&^¨2¤MU:!¾Ã†®Ï« ÏØSW ˜’8 PÖ4(Ò€]‡ÇT=Ä«y3sbìR ±¢gÉ™a¥¦]„ä=T„2‚…R]‚é7vgôEdI¥Õ.¹ì¡ox6­à‰½nò2¢ÐSWœâ²o¡„ÝÑ‘¢›:*-L‡<&È€ÖMU %âñºÀY¨3–òè‚S%Sç„Ô\é6"E7ñ@á°)ªži‚^ìS@cå5 1RvÇRПJá—‹G«,w/&úÚ½#Pš9íè~ Ëð;-ÆÃˆ:tügòÔ}‡…Ä^lr: ­â?}i ÀeÍjšP¿Á¬>"†±«ºNy‹ ÃÀQTlêäZÚQ§¼o³*†È <'2Æ?9ÀÍZ¡ßrpÆŽ–~È…ñ¼–³øôìrÏdÇÞR(åyÛ`˜¬³’>=U<Æžª×åFžyÒÚE¾¡:i.ïò‡ºMØ :~n»tk ÅmD°’vWös3Z臔‘,b*1瞆& ÚŠÛ^ˆÿ¹5$TU2·OÉ,¾¶Ø°pF …­(ÛªÊÕ(j¦»ù‚LY^ 7üp ðPÊz5H¶~ÊΖåÏŽçO¸ ìˆZ YN:ÄÀÆ©žœ]¸ x.z®Ù9±—[ë-=TQ©P¢ðà 'g¬ÅµseL,‰ÝÒù¯³“a€»)è,Ý)˜@»„f>4 8Ü¿À˜ÔŸõÞÒ°eJȨ³Ïú„YäöG˜^Ú’Èâ'äÚ¤†!Ö,¶’……‚‘Ú8ÛzèY07›K1ÞR·§0L >Ü29¢—…Ÿ¯jÄl!j)Ɔ‘‚¡n),©Uµ,^°YÊJ15^ž5ô²¸;¬ŒÍÎïñ…ø¯O;æ0ÆGSmnÉ< Üó–* äoªé¥Ò;Î1åèGá&%nØ`ÞÒ—®Ìk:vï1RîÓQÆð]‘…¥ƒŠéÎ/k(ª˜ª%Š™XïÛ¼–¬…ëƒéœjKnQ"Y TÌ‘Ah³D¦ÈÉÖji4ž¨õ¸¢ W’ŠÙx[Ê3_§ szT–EÏ´¿Í×î‘Ð@Í` CÜ‹B€mê. „Àã3ó± •þßšÀ 7¬ï@1¤# Ò¬Úx€&¨“®î+Q„À°< ý…ÏT0î§ÃÁR#qžds6,¨nÎw·fcoW–Õ0¥ºPKñ$Ü)™c ›ªx¢æ,øªŽú¼æ{Q„« ¨¶ –ü3†”¡l£Y‚KC£„ir7…Û4£è ’KƒíðH̶fÐ,6fmSôu$|0™p CD+…m GÃ1ƒ"Ý–ãpåö®Ï„4½á9QÏåN""£nÝ!x:·—äW|ÜÌÇ`Qº´}á´t÷8”« @ØÛ‡•²s@¸-™… 4vËÂ'• >ƒQÓš5ŽFµ‰ÄvŸÝ(l~r9Ü¿î5†—)¥Ú¦V"âîB¤éL7lu¹Y¥@ñ{É‹­¶’büa8" €v¾Ó=? ždCþªÃl5û–l®ñÒPr1!οkú±tmgHt×_ðÏ/·T ƒKÌø¤¤¬¦gô¾‚΄ÒY§JYéx).Dó'µiçI/·įÙvÞ-’1Ÿ#.VóyTö‘²ë>ÕÊ>Óº×Ðj¶·ÜÏW—³ùœΩ§Y¿­KXÚ¦jïbé¸àÍ—F¾V خտÌsH9f^ÉhéÖK^íH,Ú׎€l–¾i˜–.m+ ;VÉ[¨ VÞž0Rófr»´ËÁG<ó>¸º¯¼UB‚Pónj‚¼¼ã):6å…È¿¹ÁT÷¼¹›1öÔ·^;eî=_Ê)K#Î7>úy$õ¶÷Ig–´y«5y5æýL'Åq:–Õ¤˜rœ "¬=¹BQDfS?‡)Œ³ZØ:Òy^ ™h+ÙOA~ K,ƒJ#nºè0±2´(óˆº"û\Ï+žU(îPõFŠ´ï‘Âiwú—¥v UᵈR)m>RÔ%Iÿ²ïJñù‚·2»tðˆø®ÌÞ³)iÍj)@¤Æ1bH)s3Æ!9»¦€T³oùZØ{r. žÙSý®¦#ŶfÌ™¥ )Þ(øƒ ¥ÞPïî0 ‘©Î’+( «÷ÌØ…«H_ºÑFR°\w.ÖBg”µ”ŽÚ-ÐiGƒŠQÏȘ±û”v¤ë\`CÂúŒ™+N ƒÎ{ÆdªÙ@¡ v7”—p¤ª 8Ê]Dq‹&TâU¤„ÀH¨˜4úªšÞA§%prÜàJ›N£+ØÃQÔÙës —~{à|¥ ¹Þ€¥AÒdÅTöî5!‰øÚ(=ôÞ™IiÃTK*,bàT{§Öê¹>Ikú!ÇG© UºMíYåß5׫‘U¨{âXmAÚ¾œ+­¯2⫬ÖL¨°ôØ3!ÇÚ««äÒ-8¾ñ)G Kƒ 60jùw©¹"LÓ³Ö‘nêœ M"*ç8Z.#ïWí™öʨ{i¯ÄuÌË@IUqdà­ Ý/"P[Çé'™"íO‚Gà×8ÕÀ E®]Jð¼Üà4xKIêk·܈+À?áÃ Š…8ÉŠõS÷lßd’+ÛÛVˆ3"˜#›4I­Ó*ø'μà¨8;“ÀZçoP].…w:ŒËÀ 3®”¤ä¦¢ÞÅÞ¶Þ’ÜÖd°w.Ìw†kÛI@[ùIyn›CP‰Ü?‚nä“4í¶ m鯧6¹›ýi^ˆçmK •Ûfð¬ÜZ“*ß¶ßàkékpJ—›xоÜè“Àƒ`ÝAá 3'¡yî$¯MÁeóø ºÛN¸db°C0Xswx8³ÎÃ4Øw¸É0a‡r°øî&q¦Ÿ‡{¨xþ'o†Å!*`áºFÉôaÑHÈÜîâF4¡‚° 'ùK,.r-…k\nÁè*ÞØ7¬,¥…²ÃM<®þ`´F„aš± 1d&îêÑÒXW¸«Už&{mGaá±07Ù|,õŒÛ—\`È:D8Œº“¥È"óó¸UÊ?ŒðCÄ$ Ù—,Qq‘»²¼µ¯%¡Qb>’m¼’±„ÔÉí_*[Öb)fFÉ‘¥ÉSH®Üfæ²,æ`!Ýbž–Ì_šÊ¹þË m.cB*2É“ÇÌRJ¡1ë 3Ód^³ì5Ônî¶sE³àÍ1SNöbM¦Cz®>Ê󘓇„y{väijJ@wºZA( "$÷Ÿ ¡Lt·¢« X„‘˜F2îJI7Fª”’àIh-‰¯$;£a0¡Ù &uÄrBûI¼'{¢ ©›=)3%²RT¢OÙ¥©U’´ÒVšd¯t} c KâYƒË’À–Öá*ê–dºÌ%)¯wIîK³lH‚ L²aà “²Ø°Ä¤>&Þ eÇ$Ý´m¨¥ËœØt)4ÁOWKM>]PCsí–a×e‡ í6¡Úd 64×5àŽøR&î °+ɉ‡“€Ð² Ò~vѺCÔ.lw;L΄º] ïh¸‹è‰˜‡ÐÞ@õl3WÜ=ôúáí¦¦ßàûýáÏÎmeÂ=@¹ú þî¶f?mº~Útý´éúÿ¤M—ø„ ÁÃREz)f1®\Áׇüõ•z ²¹QŽÜi]ZѰìa-±‹¶Üw\¤iC‹0Xó0 µC1÷ÓEY¼¥A²Èˆ0k³£i†T€K©4ÑB…²\³\H[PÕ@>k–TË-ż%>×’™cœiZu«©Òmåò6úMö•Bl×êXÙ•þg£±¥ nèô ‰>ÎeäÆržÎ®íPAqÀ.&š£\ÝÊਖAЗ¹Hzz+T+=½?’}Û×xˆ"ò¤ma ¥ê²ômi[{‰ó4%hê½piLU颧·Ñ9fz«å,÷¦´Þ [ö…MÑ[WùïÜ“Qš„æ:^×Å: /kñY`÷•.¿IÝö ¼¼ª8¡IhjŒUÿ¢¼…:u^sE‡ŸY 8läÅÕ2¤šs™8®M’"Ï!œ3Åš»Oqöe[t˜z-ÕšŠÐr™FZ’2ĨÑ^°@-\E¯©+"ò&=¥N,›¸=üDÍ~]8WE",Šàë–ªævD­½ff}CÄ‚™ÕnG‚¸Q¾¢h:F5Ð PŸ|±i¿H±ØòZõRÚ‘@ʦÕUÍÌ@Ð+@tòò<"'{ta³¿H ùZ,Ÿ.à'GªšÄ<9Çq\¬m¼ÞÀ¨ªìF—ïÒLú†XØ©#,‰8,ô_®¤ ¹›¦nʧ3Ës¾âÙVƒØò'(º°³+ þqmV½‹zÑõû˜âo–dªä"‹(ÊWß›ä˜y%¯¨Îzˆ¿ú8åJ&ë`ÿ*Ñ ÆYÍ9t>´aè‚Àd3WA¿ryæà¶Eøfv'¼¡¤¡{‹Ã[]öB X¬îN&`bú'†Oß’˜ÇlëƒMFŠuîR’y*7IN©dRmD–ƒxñòÍõ4³lIP €pÛqJX¾†0#á·‰¸Åøz›*²^ØÂÔu¶‘aè ¬M=*Ãgl“¨öaf{°w»%Är]ñPÖV54 #Jšl«Ej™q„ Xy‚½Xkƒn˜¡¦©öH R™°cJ cš4ÉŠ‚³\ö¬sqýlDêšêú@ÔF™r5­,«þ@óUÁsTuôk_ƒ°BŠÎ5ØQ´@dxÚÈ£]@¥OÍ&B¢•«rŒŠ‡.#–•ÊæU„¨úбÁÉáì¬F@½ôÌÖ»¢g ìƒ@Fª¥WdQ¯®yl¦×9e‘. P õuÝC_7[õ\±(䋘î•ï6"î¶wN“’ó°v"a¼Ì„×KXXBNø`Düx¯–åÂÈVÿØ ‹ È¿Y¿e¿0Ãcâ‹ýGõò*“t ‹r ´¾æì%‚|ÿ!çÊx%g©‚1®VìøöôŽ‚•ã]GG>™àÿøôT¿ö[ú„(Óˆ7,#ßÐq¯½Äó6Ó¿ñE¡Éɀªâ„Ù§IT“jƒ¡?œf˜xA¦rrn€Çúðl£U½ÊÅ8ɃÈåB@Q[ºV¶œw=­''ˆ¹â¶P„-åÆ×ës±u»+Û4pm+U͵¿Ë¶:ðÜöK ÷çùͬ3LWÇ­<{Ýy· .žÀ@•ÚÙž·–±NÜ—$3íœ!à§Ö.w¶C_Põ„°]:4ÜÉ¥ozOFV§l…§çbyÝ‘õÄAtƒ/Ö.OgízUN‡Sh/x€!šW]96¬ý’„yl™á<,C bç© ¼ùÄ,¬š ;”¹«Ç­ç¶ËRx´O„zOvú#pWÁ#À0ˆ€©ªŸlŸ~t¬»Ÿ#³jFKr±hL"B¥L {BôÃÐÈzWŠžB`Äkì×ryac±•†Åi2°µR(r'†{…U¥Á&¥MD6Ê&%ç¶E–¡¬bð9dè=h|*t•F„†ª‹a.–¸ês-–­Þ} –! ÓÁ€Ú5fŒ¹iÏú(N³wÉÀËȾWcûð£Xô¦Ke(Ìúdg f`Ì–•·×L#”wÌFúd»f,ÂÅ©„Ú²šý1ó§7´³›eGÂu÷an°ëo±˜«™‰bìoÎÖ0UõM1£§04é ý#óBž:EÝ€A ƒé¥{´Þ„e !Çd–Šy©2Yf²R ©¥d$îòê@¸ÐdM±œ¹M=ì"©–Y¨#–x‡ÅrsèT7ÍüD4õâšã·fa€ÉR€)fºÄÌcÊ_Å0¡¨«WL"uWQØüÉm#1} yU?ê©ì4dIÒˆRgJ( T&ê4$¦Ê:O`MR3žÅs5a>Uª#­„ I}'åÑ ;Jâj×T+Ñ…™ÐŒ1œ* »ʪ^FÐÀ.wÓ¿ †è~[ï1ÍBen¸š8s´žAo¦«Éá¹ãZGð(qwo>µŒ/°òîXáº$<‘z{‡q,~[6ðˆ÷ÈÐåèÜÐ oRûï¨IÕåd@j£ „X«û­MGíÑ2LkùÑèE‡Ä±QU­bŸ(û[ý27Ì&åPýwI ťѥŠ)¯^*—ìm8½ çìÀ*LåÀܲң,R,17ì9u‚Aó÷|ß™pjRÁ‹ïµœ¢ÏÃã2«š<‚åMùò/ ‹€ ÂqÊ—"X…S«) /z‰/Ä0a¦Ä€RªÈÊ|¥<{䢿jçËäpdGžb®ä_€I}Z=Ý)c<ÓäN@I¤cž5Qg™UªìKÈLt^t‡X!ðND]oÎó ]͇n‰‘-R+ ¥P uEÎ)"¼\W¡ lŒ¬•ʾÈlµNéHÙ¯ŒäYˆ‡‘rhQ "é÷<»Œ"JïdNLqfdëÔ&FB/"»:RÎ_¤´B¶&·X 9(I$p¡t‰Ë²ÒÉVHAy¥ãRâÆG:Jß2]“3°Eo 1))ÐöÎQ)^ðRRH}÷7u­ªøMÁö0èDÀî!L¼K§)J"*Ø…VF‘„IäN€¨ÜâX”*÷ ¸JÈ–’˲µÒè%*YXq`L”´@´Â‰ ÚÚ„¯Q~œ(@3LWœ¯æ¯þçp_éý•¿ ¿K³/¥&NFe¤”„:,çË™`uåS?[pE_§Œ”PP‘¹¢þ#¥2'‚0PG‚[eDô’ù,Šð¸ñÀþ$€]~M€¿ü¥pØÅ8€Ìë Œ™÷”Œ¬§uÈíÙ$S=¿À¼ùŒ——,ö’Xç‹ ð/;y t>†ïŠmÇùmVðÿ¶wþ<–»Ï÷Slø츫ÿWjÀ‰3Ê Gl£à}ÿÄ8‡ç¼šµ ½] ²^G‹)Lï½ÓÝE’¿"ýâµCz9«¤ ÷·ª~ÅÛ™킪^x§T…Û©3ІËBIRÞYKñ¾­r‹¶u;f _U[‡ªìØ€´c22U!²!ª*’U*=ËRTåY­²U¬‚–-g;fƵêb2¿U:“nG dë— zVéì ªgwÑÎÈ¥T=P^§J†òKíH\WU\Ïê$ý_•/åÛqyЪ‚&‘ž…R{â*¦ÚY·ãrèU“µÓϲ­eA;N éPÕßÄØ³Bl RUdË”vž@R¦ªÑÆØë¬€QÕ´-šê€tUÆ“bÏÚ¹åYÕ×-áÚ9ɼ*Ó'Éž¥|ËÅ*÷[R¶³’E XšY`ùÚNHâ |B –ÊÅ9XM·“RÜÅKÏ.¤Â½  kûv2@ú¿ØäÙ“ïpQ ˆc~: â‘bI³o⸦PìSÜJRðɶ8†*þÅqV;¡Xa4 Á'j㈮pG}팀"âz ‚7ù£ø²à ‡ uD@Qj!FIÁ'†ä`·P%Ä툀‚æ$žW‹ˆrÜÝDl^X•¹ù$¯àå@? y‚Ny‰›o$XÜ‹EJ¢eJ[4è,ÁùÓ”þhìšR$oS¥1pIί陊iÒ5´‹ŒN±xà ×S^¨!}Êõ³$ø“ Tö©±ƒÊPuî?’XA45_˜¢’a eT¬sÿ‘T+$2©ù¤&›K°²Òw9Ù>㙕4ÁéDaBž™J¬“N7&,ZмÒL[&tš™Í: àäg«™ MÀ5s¨ ÁfžµP*¶`ZekÅÛ~+7ÿ€àþAð•‚ øœ"t˱#àìÓ9î·yqÇ:­ðes§ù·ÉBÊ5ψÒ6&rF³p"쫎|Að.¶À‘¬Æá¬>Wö7÷Ùšl£žö ò‡<Æ E«+×~pü+ú´¢–OXÛÁ=Í­(‚ ¢`ð®4w8i‡N6}0rgOÓ‚ßãm%†&\ ßt\j.oˈÑ+KØ  ñ'Ù0êãÊ2eO’G¦ÏQ;è§Î# L^±á€`,ì1‡Š­y¹ÏVѵåiqü÷ÚÃgç8~9xlåí¨šÎ*½1·ÔÄÍÉ~Únøbqˆ$g̸²ÑVõ¥´3ñ|æ­;!q† — ÑÄæÐ6kÕä Ž^4µMgF\eÌù4°ŒãW¸]…B[ó1 'KnmUD¶Ô>Ð%+Z).ÁÁ½©úôkÅUŠ{ºÁ¡…glC´h䨩”à¨:r<–C”A´ÃŸ:†Éy³k„²Qðœ[lÜDË@ESG¨e!¸Õ Á-,d,²^ÚPi¿:ZÎÃr|2P–X5²¶Hhåpž¬>"~b5‹¡Ú>b?#( Ûqƒâ[g¶·Þ~“Ñ[-„ê\ÁöÒ€&>Þd¡G4êb€{4²|ƒŠ]Õ.tòÜüÔmºÈès[\ns„M@IŒî!«›h}Va-Âí=Úê›GG¡‹?ï#FÆ ¶g 9cì\•óÌÐ,† 9xgßUŽeÜt¸0és6²û¾¾-Ñ›`jœÚ†-}¼ÚƱF{L`‹OǓǯ,‡È÷k‹W8³øs£þÜâ-IfÃÞ¢Éë #Íño \ãD@¦OÐ ‚èMü˜"É¡‘èpÄ» =›É4Çç‡tϾhA‹„á‘ÁwMÍHVz‰"%O0€üh£ÊÈ8$F‡ì3±Èî8Ù 6tât;ûêTv ¯%}*º˜ò`h2õìbz©›pÀÒ9úcÄi’LÍík4Àa>/ˆ¹5ú° TøCA]1|#³‚èdÌ‘$øÙÛ¢†û¡m›Î?e’ ÞE“–[`ðÝè3xh…&=“X¹öXÑÃä÷¢sþF…ñÏ¢%× ¡õL½Â>pÂÊ2÷xž;§SÞÊ$2WÛ›Æì *˜¢Hö#òѧ禀+ag’sàIf›‘½å˜¢ÌH3ŸKJ{[üýï0kË*€ /Q}ç¾±ƒ †Ž2c…¼ RèAóïLëd’Ý¿<¼hSý/ÈÕϵP¦óý]p`øšýûÎHéÔŸT…ÿÙU\ð­©„îÞd”p·<1yõ\ëT©h’ ™íÎe'½U¹Ê)~ÃF+S¿.ˆÏfžÁ+…RNÔiüÚUqǯ&"èh@®·Ý«¢Æí7¼ÊHÞ÷±ë5ÔFa¯¼6SÖ«¼ÝßF+PoIêvMã‰m…2íê»5öGœôq@‹c¬Í€d}Î6æšGò•BâæM.SÕÀh™³ ›s6“‡n Q–U¬2¤ 'Æ Šq•q­¶j6Àè— KFºJ 6ä*ŠTÆBý–ù‡PåW{ŒkÌìZ^-æf8nyv·<>ïTµ_90LU˜.î„ÔŒƒZrƒUs¶«D6k¾4?çŒuo.—µìójn9 àöÜæ“<½{Öíÿ•ôM€”^€0Ö¬àûÛòÒ¼ßR“ær6¹d)šBKô@–÷ù_'ðÎíjÊ ]ƒV³¸j¨´ô×Aú½ÿEYë8äg£Ç¯µ^aÖƒž£’nÍÈyá¡a¥+ Ú°öD›á¾Ò§<{q5 ‹Æ5aô,s‹±>†n±Õ2[ ä Eí«)º_±,G®$ª§ÖíåA°YÛ':#õj˜î•¤ú9+†À˜„ØÌŽ3­Xd?¦,°ãbÿ:1 ½€è߈{,­Øˆv5¢ÅO;[#Ý-Æjh´â0tà +ìX ¿ňç@ñ«Æ®˜¯1UŠ 1!¬Ÿ‘`Æè£E—02£ÇŸ/j£nè¾z·0€þ®ôénU/W4Üh3EÌô…\DT]›on‚ˆœƒ†S³¼ˆßË-š1~uJ`ˆwt¦;TMG•JÀ޼ã¯Tº¡ø>e$ØÞøå°;¸ù¸5Nl¬sÑãuò£pC'H°‘hó“ÿ=ÕvÚiŽ¡4œŠ)öÑéšQ7·³S:œòsjŽÆ\:!>>Ž“FØ3÷艥•QÏÕ’O…{:Aµ¢'_I,Ô‘O¶ˆDªÑѼÚɰ¢O0[aãu~u^Ci·™Íu33g¶¥î<]áÉ'ý‘ k) áöûÑf}ákO–uÛçf#5dÍ—«}{fÖ_Û‰Ï]ÝgèëN±õÍÚï&ÛÎ`DB¶àYÐ{;ŸŠ õäÆ,×ÓE™¡#·“í!ëåàjØ<Ü/РX|lQÞ+›/b’Æg¶HGGà»ÞæqßÔÝùÚ{ãJnŠäŒsã°Œ³¿l.TлøZ<§³oQÚ6FNx¹ûV‡äÄ´:±³ÄÞ †JYeSP@¹_̸ªk6ËtG ¯/àYç‹»cVv3‚*¾5C‰î³ãÅ–Þ )‰fooxÀÙL²¹âfµçÁÓ°_s¡iï›Ämy‡¨K6‚Ò%ÜW:f¥ã…¦½øÒ”³×\l:4¶cðdg‘§óšŽÑåØržÌ\_{s°LVão*šøèŽÚÅáræ¬.•µÃg_5J'™ÏÞšj`ej)•Å@Ãä¥ ÐÍ{—'.p—„j•Ê×`™²¡³(²ž],¹ÜžzŠ5zЬ)¹úDÏùÂÒN­Kº“Gµš¼'åœ/ä,búÑd¢Iƒ’’ƒí°’rsœlÍÜÉÙ3’•%[ >”´e³¿¥‰_÷ltíy°V\šŒÅ5›Ì&‡Ñ ´ð†Ì¶X7»Qz~³=Jð Ž»ÆÚž k‹þ»Þú›M¯zP©ð$Rô[ aØpÎŽÖžƒ]T+bŸíh‰i|DaÅÒ¢$ÐŒ¹LÙT\Fç¸ZìFbb/xídÕ·b@öY¯šqâ8æÂO/œ–tÆÕâMB­Ó7‘ŽÙÂV® =x¶@¯ïü’ =@fU‘dñ´À–xyæ7>ã¯Ê`| •ýÖ{ãu>{HoBªÂ~6Å–Þ¸a3ï5›ö£wvfH¿…ÍìÃÀf›íä6»Þ-…Áb¦:ËAâë:;OËêFË•c‚eqßÒX^Ãi±2ö–•1V™öÅŸ“Ù® ¿vµ¨£œ=K4ð¥*Dri¤"jqž~ì-5pž2[5ŽQ«6¯¨eÁæîDí%‡Ìqa-½Fü©ÍàäÏhMž9:® %—y<®l{ãiõ+• ôS C}Pá´ú*•uô·­Ì¤ÿ¢ÆÓº¹mñ´º3§ÕÝ«L©ïp%SýR‹ÇT Y?ÇJØúY7žVïC%~“YÌä°ß«J ûÝkD­^ÏJDë ®\µ_òFÔjTÎ[[¥ÒâÞL ¨Õ†Ëìº÷d%à½g?«}]‰ü¤#3×oûPõ›FÔÊÌT]Á¦¨j6WEÔÊ¢UCF¯Š¶‹Ÿ•í¬Z‰9ÌjÓ- \%[éÎÔ†%¯Ò­}•wìA+¯¡Q›YD²ë©B“ÝSCjåÁª`e/W5-{ÂÑÊ[Vm,‘ϬŸÙëVM~¹1´rÝUª³woÈløÿ,ø%Ýé’ 5D %3.+%RµG«•ªOf‡ã"h%zªÌ™Dh–B-žªZjÕ(ÛÐ`YrM 4«²–rU¹µÜë”mHª[6V•ØÒ²3µ!?«Úœ@hV¤­b«jm¥Û([‰áª~'šr‹êª¢[w7ÊVÚ¼ŠñÖïªÖ[ß7¢V1@•ü"M*À±D‚7P«¤øƒ¤H“QphSƒÃŸŽØ^ÂpÍC8Œ*f¡Vj#+öÂ$iâê á`Ô×iÚ ;bŒ´X‘ˆ._pF Eœ(HmPŠ)ÒWì6¶Eqã_47FFquãh{7ÖÆ¤iñ8 á³£(¿q=Ê4öǸiâAJ(R¡ӳ‘”h Rr£Æ””Ûh$“òžIQ…ššr¦¥È*gc?«ŒMZJêÄŤOce•*,QÓÅœ]*˜Ì¨Ð*KUPZ²¦ ®9ÛUp›3b  UÖ¬ ¹bM Òeòͬ]åç Ÿâ·Å˜®ò`߯˜>Üä¯á&aáø-˜íæ; _Áç±MÌw3lVRÞçÛKkXé謂“Û!à*Â(_}Òç쯺nÆ3LNŽ-L1"Øø蓨:»ÿ…·"ҡѰUµè¤…Ì ÁÃÖ'pîŠ))þ '[uÞg.WÞJLŸ—d†¥ŒL“„Ó&äÍyJ &=y²7üû§[M=`êèƒptpiÊ OÉ>„gêÈѱÛ*ÃÑ]±riḺ)^Öh< s*¦äÒ™‰uœ t6?0Ô¹Ž“)>wârÙE\yvAë² ×(Ÿ„£Š¤ïpl!޳ ¸ÄùmYùPrDZ¸•§ Ê=î'CjjyÆÑEs-tLë úª\ñ!¼óæ•rÒ ½ìwsqŠÆRKèd ƒMäê$"0Ñ©MÃPGô®D§65÷ ˜›Lq+ß:>È!æƒ=ˆ·ÒC4\YDšÛÄ ?U7æÏâ `´:E&y8ƒã TŒÝe—9 ?õåG í_3Ä4 Ñc{{K=ʱ¿{äAÐØß g?†iW\už$¹MέäʾÄ4fÈâS ÁJ'#b"ȉ¬v|›=N%ÝSÜ85:ªÈlÔ»y3'¹¹Å¤”«—‡7q~áS½>3B@»*¶¦Dm¯p¸“tâ©ð…ðè‚ãØÅr ›_Àä=7xT~ÖíBƶéÈ>º—ðìžÃ ”åã "ÝÁðq³Uë!6Ê-Dc3CP·ðt!€–½ãž…’caÓÕUˆ%¦‘³“„#æÍVŠ 2°»'îJðx›æÞIBœÚæLéc܇1Q­„PÄΰbµG.ãÃ@£uJt—åÌt®œoì,„7OäèŒ×Ë¡:&‹í$7Èæ¥·ÕÜØÇ¨Å~¢ŽHG*IáìFGØCÞ½×f ‹“ÇQà OÄ¡5Tu°¿!™c/;DO6ÈQ<ÌèʨØ>IÝèέdÀ–[Ù ƒ$•œS@ÏÝãjiðNaOš(JÊé ŒGÕau÷©7ÑY5Ž—E’¤h-§QVdEÏ~L&J­.•Yù^-cS¨˜³:+”)¤”쪛²n^"RˆW^2PØ´Ö4šµ´’íëq„ÛÑþôAåÿÜ ´xèq©Ë»Ä•e­98–ºiœìvµÇ1æÆA ùÄ8 /aÒgså¼zìN¥Ö«1æ`† ^Ñ›k£Ïær ܨ—йàzQÇ=Ù  ^æÞGc1ã;-w„3Óµk¸Â}äu öm„ÚŹ¡m{r”ßÚ·ð3V;v2ÑLA¼´7žãÕìIô~xA‘9 ²%åù›áº£ð’¦ µõÅøAÉh.ûˆ9ˆèÁ˜&Òn¾àhêªÐ,±ÊÍZßÑ¡¦t4ZkE°qåTZižƒÓ ·Wç‚{ÖY´hôÑ\Ô5ÕÙ1ÝØà¡£h7"å £.Ô|åu1Š,:@Ý€k Úµˆf¿Ìf'³»nöÔ@ÉâÎP$ØšpE¬T¸bNv) VŽ~a Yß}4Eâ]©––×Ù” W€ˆví|ÅK!Emäl*Ê=fwvqpCc®L–`×Ê1%êX½Ái”BÑÐ e4mÈ®8{©GE{G”Mï½)P—VK¥2͉V²ìÐs]N›ì—’jxœØwkÌÌ]÷ ‰SAKx»¨ÜÁ3 M¿óbâ¯1e˜Ï»÷8€õì­… 1ãvt¤ìHÿK¥Œü9”é›TâÉ_¶rSþƒP¦?ºr\¾/•ó½kˆYÜÞJ§ù TÊÍO©fz’•ºK:§š6ꨠߚ†éͪT¢_¾J7úm™(ŸÌZú5¯Ì¦·BƒÌL9AªýÔˆ2m¹J³z[V*ÖÛ¶!eÚÚ•ÒM~(Ó¾6™¶iD™ÌLå—e‰*mcU@™ÌY%²mò*Ùm³Øˆ²°œ•3Oæ(óê6À•z·‘nDYØñÊàÛÔW–ßî eôU,HR©ábGE;§‡…«â…}\8ì &WYu’$•²–b—[õ9冋…×®ªüzvìú&yP¢„›²ˆd™Q…¦lwWÀ˜äJÕ«,iª¦eÙSx˜”QÆ’nÊÚ™VÕ×,Â&¡VuºÄ›²–'½Wå>KÂÆ‹I6VÙÐÒ²J‹–Ÿ ‰ZJÓMYḘ̆:§tpGæÛ-fÃ>õÍk%ÕPܽ쪼—fUoåÛP÷½Â ƒY%`Å­Ll$*+É 3Z­Y¡H«G+Zi5kE4­®­¨§Õ¾µò¸©*¡+¾jevµß«J¼‚´V­ODÊõ|…zUñW4ØØ°6  ²¡· ±i «ŠaPˆÛ8EÁ‹H¹x‰$«LT8à.èÂ1yŸ—q{Á‰I™ïpø_ˆ3 S¡P' 7Q.¢ÁaÊVµRh•Ég<Š~qV¤Ãa‘9I†&ɪÄlœ€IÇ9šŒ E- Ç§'ƒù Àjùü_Ÿþúi€Bëgþó?}þÇ?ýÿÎÏ`!œüÏO#~ã3“ŸŸï MøæçúôoY~Œ´Ç_Þ~ø“¼Ïã/»ÿýÇþôO?~`¹àQ“›ÂëB4¸©ã#4…#7‚˜)ô~ˆ…÷\ !ᬮù¸’ý3õ›î @¿›Z‰'™úMYvß”¯Ý’o¹)DÓ¶ Óãmðª±ð^ ‘W6Ͷ}eÁ—|nû3=§q°Ÿ7àç/¼ºÛw}NlÉöç˜3¸º¯äuäÊ{­ ÀÇtч…¼æŸÕóúüömŽžå¨Š²J0þ×}þ}ß¶9ʼnAYÜ-3L¼òž+lŽ}ÛtÕÇ•ºê›×óbÿ9^lÄÐóüŒ)¿ìÔ×ïk¯è€Œr’W?Eh”š´òž+Û™ÃgtÕÇ•ºêŸ×³åž-÷½å€›<.ƒ˜æë®dŸ··Ü²Ÿ-‡CæÑ·ýF>ÿDzå&Ê+﵂È&‚_õq%¯úÖçõØ‚Çü½Ú‚‹Ù;žºû™¬|u¿ã;»ßÇ$1X °å.ä½ðž ,ÜîNXâš+yÑ·>­ÇD=&ê1Q0µFè ‚òXA®Œï+Wp°~ç®>ð’üDJVލ‘Õ Z‡ðVåUW|Õ7Û‚Çv>¶ó±íü¶óŽYwó@Ñœ¦óË_Pƒ9–í£Ð;Æ)+ºóÅŠ²_çØ|—bN•îRü°.ÜþÅŸýèû…J% À ì‚w|rêšVÞse]ÛËè’ŸýX¿ÿ­ð±óìücçÿv¸ä²nßÇÒS?º­sž#û·?®|¯&ÿËXš¹ÿÆ\?±¯ûy6óþq%®Ð{ÜÑãŽwô¸£Çý!ÝÑÅZßãÓ‹7Úço©5h†c’osÅal¢{æ•÷\Y—E<¤¯ú¸RWý÷'ûF?&@y¼‹ ¨Ù[D+ïmeÞñ?ÕUW|ÕÏÔãIOúxÒÇ“>žôñ¤£'<Š~2ßîJ¿À%ânùÒ\*gZ^È×}\i—5oúv°Bó¦Z)ozá4<ûª+u•îå#)ðHG ®øªŸÉ€GÆ<2æ‘1ŒydÌ#cóÿOÆ ÕZç\³¡­Õ}5ã•Ò1œºíZ|ÕÇ•¼J7òa{DØ#Âöˆ°G„="ìwaCí–6 püUlÿªƒ'»1Ò¾<)z{­g÷¤Z)ä«>®¼È˜±ì!?8þôi o~ŒtKÇ\™«zÒåUW|Õï¨ÁùÈG@>ò€|ä# ÿ\¦#¨þà ó7®{6é•R,Xø#_õq%¯Ò|äï#ùûÈßGþ>ò÷‘¿ü}äï߉üåd¶$Zï_§~¯«ß{çh¥æIOŒzñ¤ZirQW}\yvG øƒ³l×-WÞÛÊ\tcóª+¾êwT¿t¤û#ÝéþH÷Gº?Òý‘ît¤û÷îëMÐÿfíþ/Ÿþ€¢>Õ endstream endobj 2538 0 obj << /Filter /FlateDecode /Length 209 >> stream xœ]1n!E{NÁ ö쥫iœÆE¢(É0 …Y„×En1k§Hñ0Òÿ3O¯§Z6;}ô5~Éfs©©Ëm½÷(ö,—Ró6•¸=LÏx ÍLǷоšXo“äÝßÃU¦O7ëÛgâšäÖB”êEÌð’3©éßÓË>pΟ>±øÄfñ à…ÍB` u¬ä†zVòC‰€hèÌ @óÐ+4Ø3ÂÈ8Ê>»Ùxï]ê¦ÑÆ£i©ò·´¶¶1e¥&ó uÉi\ endstream endobj 2541 0 obj << /Length 715 /Filter /FlateDecode >> stream xÚ¥TQo›0~ϯ`}"PÛ@Ze“º®Ó¦iÒªì©ëƒNb‰ ¦I;õ¿ÏgHÒl«4!ðÝñùîóùî°ƒÔƒ9ã0 ’hâ¤ëÒÖjéáæÓ[œ¯€þòr68»Žc£ A vf‹]W³Ì¹u?¬h)Y5ôÃ0t'çC?Šb÷’ÖÌXÖÅÐ'7krV+iŒðØÅ£xx7û2ø8ëÇ„¼’! _RP•:‰ Å’‰Û»¡Ú»å´f÷ )û‰b$ØÆš™ it®4lÄ_@Õ!¼;>cã¶b²©„AÁîô–Û(ï¦fEfyo–ºÈyfÄs³d´^± b½]BÖüIÓ•l:²q©+Ø ýì¥AÎÄR®‘ã“Q" üJç,o¯•úxô¿ÿËAç¢OÄ›£‰L-+.–}ˆ~ÍÍɉwÃr*ùƒ&Ú.+* YvÁë‚<­{šâ82)Ð Ãâšçšž—íN›±IüòD¯NmVÑ ¸5YõRuESe¡‰ùØó{šØ3rª¿eçšà¾«n‚FÁ$‰DBêûìóz”8WÅàû±nÄ(R9$$²õ>[AóÅÄl+Ķt]êM%¤Q@ekXCÕ¤£¨“€§1†œ‹˜Ra„94³kã¨Tèýö_!ZGya]dLÔ\èÑRXÓ%«=›^sˆ½{Øp¹2#DÝ:‘1a·h¤ÑKš3)í ¹o¨¡ÍŸTÑâ\N5Ý ÆvtñuYT¶Ú—-Wæ¶Ñ>‘]”øOœ-†·[7m—c”®=øôuÖ"‰[”WÆî”ú~ôCè\CIÉ=õþÑuÅhnð €÷êÖ3koyÜ™»íž5lÝÂïӚ몱ÏÇŽÝÍ•oS‚Ðñ ¶+þPO1:vГiÌßýˆ)x:h×l¿‚OÍx endstream endobj 2543 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./fillcontour.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2544 0 R /BBox [0 0 291.9 219.04] /Resources << /ProcSet [ /PDF /ImageC /Text ] /ExtGState << /R8 2545 0 R >>/XObject << /R7 2546 0 R >>/Font << /R10 2548 0 R /R14 2550 0 R /R12 2552 0 R >> >> /Length 65424 /Filter /FlateDecode >> stream xœ\½I®lÍÑ$6ÿVq7 SáÑÇ\€Æ*.Aƒ*?!4Ðö3o“à€|Æ›™§‰ððÆÜüýµOþþcÿýýûŸÿõ'w·ïòßÿ›ýï>ö7ÎùëÒÇ·ðgÿí¿Ÿ¿ÿýÿùçÿüç¿ý÷û÷?þߤ}­5ùûÿþéÿ÷?íïÿøG?³þäÎûÝñ÷ïúlßí3ÿú§Oùúì†t"ëÛW­ò¾³íOæ²Ú÷ìOÆ%0¿wí{Û"r¿±ódË×e)¢_³ç×ïS¤éßìoŸ dÛ§NÿšYßã§ÎøÖ›ŠìGd~G¿y}üñÛ¾9 L»ÀÛ¿ùø5—®ÈÕ›ßå×Üñ­!Š~ÏÃ3åßôOø7ÿƒ—,ßRd­ í[ú©ó 1„ŸM¾ÕpÉã~w™ß8ø­q¾·ˆ¼ï>"üißmø¡±¾­ˆ|}LEø é_G>¾!ç»ú­]_ïèí^ËïN"óx™ýéƒ}mEDÿä}SpÛý|“3pox }Oˆôos™ô¥ojŒýíÆoßæŽû>šÞ¿ÉOÍþÍ ìí늜o >%Û®KˆŸ’mß3ï'ã(²üoú³¿™üõ5¾Ýp…Òõåu¾Ñq…í}¯¹öÊÛýö?ÕÎ'|Ê{~¯ªÍoñi`MüVë¿f߿ݚ}æÈ7°«Î;özÏÐu|ÞúXßÀø:/ï\}ç5ûÐm_?çOνº’Æí߯Û;'²t»žÛíîÖ…rnÓ <.~ç<ûg[þœõ-~âáÎð­Ç_›ß^[‘¶ 9ײŸ­Ï·¾¶ž"S¿ç~ý. ¶ËfkX/rvûö$ ö5ë~«ßå߬©h6Ø"]WÛlë[K€È7ô{Î×?>Ï÷üøÜ_׿yßê=³ˆ4,V9ã}‡?%ã“…§7æ×»!ëàCcèËrø^†=á)ÛK¶À–ÿ“Ó÷7ìßéCÍ”ûõ*Ï®N®®¢#¶á§¼o|ÌOø)l ý”èëž]ðNå´¥&ÀÛ¸í6õmÏÞíA´ùMGæÂ·þ >¬nw¹ß¶Óv­ì·ì½ôùµ±€ŒïMCïýô·×'°ªûn]7@h1÷j:€\~¦}¼ïO:>tÌr¡ ا'²Æ"jÑÁßìómÿ›ûð=Û_LQÛ@lÇ'‚Ãçß]?_³üUÅOÍ÷s-sþçõâXø¹¥ñürí®qàþ>˜1üÅùÃíïçùöûózWƒï¨Ë×ÞÏk”§ga¼ê-óë£.‡-ý“[—ÌùŽ#XUì­ÙÂÛm~ûÔŹ›oJ_Àë]5˱ȼ]7Âzã“S¶Êzí«{iÝ™[’ÛmÝñÝS·$9ë¶]·›¡±½Î¶-é›ù­] Ä:Í®ÎÈÚæÙ„¡Y{}}Wc´öüäÇ`­ O¤µµîתÝ[Ë|”0ku7±f>×ô“ÆMìš~ι¢g›j ¼ó0çkŠú¼Üq¾±êq°ÆÒ·GÆö„ãXY£é뎣gõ«¶3ާ…ó}Õ#lõ¡4N¹¥·èÇà’ûYNÊ…Súç,]2¿YÛ%ÝN?’W{ö!?¶W;v~´¯¶á«–ãáuíê",Ó£º@Z¯®Æ|~ʹ;d÷ê²Ì·uã†[3ßT‡À=Ÿùº}{G¯kTj^3áeÑ tOl^óÝY›wÛÕ¸?7±võùæ戹_8¯¨q׈TïrÞ¦Ö>ÜO ´¸á¢ÎsÍu7vžã²¹ºólõð•.óu¾Ýåï´ñ5. XpTø˜´~þN{܆@ö·Ÿü\ž†àC2¿%Û9ñ7÷[ïÒ×ýƒkÕháˆÌMd®ñƒœïÙ%2ú7æÏ÷À«Û?¿5Î×ÛÏõà0$Œkžý[íÖû‚‰„·>]‹òx<È[áYë»2Êc†cÜÛ(¯âìA$_×Ù‹ÿÏÅ+={]¿Ù^û98åù© wáþ3ÕÊ«À쎌Ñÿ´¥êß½çïÀdècÆé{ÿ¬Jçoß krîᙩ€~Æ6À£_øþã´¡r>ãaÐÕ÷yß×nÿ»M¾)ÓØA„W¸(Ep—@Ž.Ê×þ.,»þ£s‡ ®úÀTùwE¾M÷á¸}÷ïÊ¢“¥ÈãßœoéŸèG(úh…Þ»Ÿìù‡pµÙO½o´õwûü„?% >þn¿t‰tœ¢w4®9"ՃȅwdzULß3ž=N"‹ÀÞþï-®("xDHsà©YŸ¬?&ohê¥ÉFÌtW³—- ‡üÝåÏWZoð/îR/•Þÿß]÷“¥¿Õ'¢fdŸ&Ÿ—´ÿéïîN‡ˆÈùXŸïAŒ4þî><4‰0ÔºûÙ»”66Ò=ƒžÈã]œÉÈìðgîÙ¶[¥Í‰€öbߨ]Ì…q±'º>‰‡ùw¯ïzikâ<¹w«³$m-ì rAÀ^çZ8¬«?„pöýÝûxh™|y¯s[Ùüi†÷úÊÂûm5‘þí¿û6] p~ÿîCúK¿æœOäï>xPz߇™ºû^\Î8YâÔg ïþ=øêC\“ þ¼~ϼÏ×Ö'öÔ‘noW¿‰¨õ•† Á7Ÿo1Ï"ÒÞêÃò]†0úyí}‡VSÙ”ñ÷¤ùj8ìëï!âÐ}$Âñ1(ÑO ]®'Ãßž .YDæ do"ëBÿÈ3àÂo|7* =ŠD†èÃÿ×oëa÷ÐÝÑ\DB@¦ÀYzrÌjŠL†1@ÆÖ‡'óÙv«;bÆ@Ö€'ùä~mëõ¬ƒ4®/P¶`Ó±m,››Ÿˆ~ho¾›Ž`«ý{þ| ¼²ûóC—Y¬z18îÏßåˆßÔ½p<ê?µªáÌûy€\èõ!÷ÆÌ`y½ï½ú²:–¬ÔÚá¾ÎòλÀ[¬Ë¢cÕ•຺zoúÛ±;BïºH;bÿ^rï‡Ë-{ò½ºú˜|6¹gàÁõW÷½<©{ÈuöÙ¿S·pGHsê6‡ƒ¹¤š8¡§WsÑ×þæª&¥¯GÙf§ï†Àµ˜¦¾^U±^g\š·G¸WØÕw/f²=yÒ”öƒ¥X¬-€5‹=@cë»ßY-z¿‡63­~¿ïõ`èO¾^ÏŽþm–ãqKõê8éG=¦Ãüz”!"Â3Éãn4=lóH¹…rl"ÖÚ?Gë@¨¿CôÌÉ#aÛ<Ævq=éGçv/ÞÂÅ7«Ç0:<¼âT·ÈÜÕ5ýòŠÓ}Aô ÷ ]D¸òã¡tºJc,عt§ˆ¼U\.¾rze‚èË57³!NçNÆäÙÒ”1_÷ ¼[\H“iÖt3‰ÌS\Q“û=ÝUAB€¬»´‚¤ÁÞéõʘxrÅ1–±JúÎDø!w¯e,Ƭé‚»¸éDæJOžÀÝÅÙ$>àìG@ cÍa„ Dæ(…Œ…œP >ˆ¬Y"o” FÆbª="ˆ ""‚+Œ€‰È›%¨¤o¤^Dú+Á‘Qâ7"Ä À£Àø’ˆã‡"šŒ‹‰ˆ3.8¢Ò¸©ˆ\ãÆ=¸gñ¯?¿Œ‘ýgíï!cmWûû̘Ýß¹Çõ¹,öÅÁµÊÒÙ<¹ãS½ÿ!oVß–à>óË5ÙÎÒðv ØJÞHW¬YûÞ›9äÜLºŸQ6Í^ÉöÜX{¡.tÊæcÖÝ®nP m޲‡÷’Ï÷·ùž–[rK€Ô¼ìY¬2ñÏí Êáá˜ÑÙ¡À(† ÉùÓG1^{È·õì2·ûÑ £ÛÀÝÃU1;‰ü|1·sÿm‰£Çì-¤j’  f{Ë {«¦}ãè8Åúï†åûʱۊW®‡Ènã›öfô Ù ÙÝQ#dì·ý¸X ½a<Ô“™§|Hâï¶Êá¸îý†Zi;@Îm}ŸvÈ®;ó ^W¾½gžÒë`ɽ<Ç×9¾Dì¨G’¿_q_`ž–ú ‡¶9DêNÙé`ÌNĬ³y%@ºyê¹  ð^/ÞÍÚã;jàþ à_¢þÑÂ9¯ß¡.ÔZÏÍœ¹Y¨Ø)`®ØZá#›»¶``ìZÔ¥[Ø;ºZÍí[ˆÌk¦g¸–øÙkÎãÂWÏÄL Ë.PP fuÍQ]øþ¥Î}Y”(ÂG¦»‹òC3ÇP]â…¼å4'^óšÓ·Ž9Ö@üCê|¯ÙãÕÑ?0ô¸1ˆ? õòQè0çQ5ó.5Xâ~«@ÌS± cç^³&@Ìq²àeð‘-À2‡…< ‚€xP«j/zK°#Óâ- ,kHÆzÍ­Qõ´-°ûAûý Œë÷h Y~JÃÌz5Š– ÖhµÞ“F´õ¾5ê­ÏF#ãúü4z®ÏX#ìú4 /ïÊ"õò>-˜ÏWnñ~Y–(+ÇòeqYn¡,@Ë?”Ej9вŽ-QÖºå:Ê~°|HÙ2–3)ÛÊò*eëYî¥lOËÏ”-l9œ²Ë-ÏS,傊µ°|Q±(–S*VGÓNÅ0Yf*m—%¯Šy³W±–+6ÒeÅŽZ.­ØZK·{l¹b³-kWìºeöŠá·ì_9,CXÎË"–#Æ2vY&²œP–­,§˜e4ËIgYÏrZf´œ˜–=-§ªeXËÉkYØr:[¦¶œà–Í-§¼e|‹#`Yáâ,hÞ¸ø–Z.>‡¥Ÿ‹_b)êâ»X»ø7–êȳáé%yÆ<=)Ϫ§·å‰÷ôÈ<9Ÿ^›'ðÓ³ó$8(„kè‚ô½Š¦WÒ õjDzª^±HoÖ‹éñZÝ#b«Œ¤ßìÅ“p­½¾’Þ·×`ÒC÷2MzñÿYÁû¯þç?ÿú§·w>¹Qëû72“J=&GjͰ]ÖÊK]æä¼Zzl·ã¨(åIG´‚Ùβ_÷*'Ì kÉQ m°»VKaPî­Õ¶¢T]Û"‰¥TfÛâodñ¶­ëVê»m œçRn0ª«Ö‰°µä†ÈbÖzsCh±jMºáÜü©[Ãz°ìµí6ºýº×¿a/øx¼FÞØ»ÔÑ;¬Ã™¥ÖNDËú~£ð÷W©Øw˜Ö…½ªß›“•ÿÞ¡ŽÂè 9ÇÂèØæJ0ŽAomBo­é›r¢‚¼·qT&™AÞ›øÿ‚ï ï‘‘””y4ª…6!ï.}žN­ 2¥Ð/ˆ`áECPà|•Æ!,ÜöBõw&ßxÐAä2À’2"GP¡•ÈÆîÉ<‘·'.5É)òvçó þŠ<¸ð× .òÙhÉ€‘·ßd°dä­ñõʤ‘·øÞ“m#¼i)Œyà;ÏÂÚ‘.ó*ÌyS·}0ä!g'…$®Ù+ "Eza™•‰$o,½fg+ÉCyZÎh’7”4¤'yý}§ð¢äõû‘¾äÜ) …\%„ÉQXòpÚŽ–>'Áæó5žl¾§Òækrºm¾JgäÆëÖ®¯ˆ öÆ¢ òo,¬ Çâ q,ÐàÇ".r,ôà+ÇfNsì§=Ç– btl»àNÇÖ ~µïÞ `Çšv`r»²w˜’ „«­ Æx£`•»½ ây˜´ §‡Ù {˜Æà¸‡ù |˜Øàʇ>}˜êà܇9^~˜üàîDZÜþ8:‚ÿÇKôÄ}qLE¯AeÑg·,Äq] qdFçCœªÞo´OÄá-q€GFòѪŽ@´s„³-áPD[H8Ñ:ŽI´—„ó-(áßD›Jø@ÑÊ~R´»¨#ý0áiEÏŒ;cÑVþZ´Þ„OÝ9á÷EOø†Ñåî£7…‡½Bá…j3Q¸©Ñm®lt$…»]Kágg“»ÍÙýä®uvH¹û]Tî¢g§•»ñÙå®~vly4M]0dß—ÙæGöyp’=fÀdš9Ù«æPö³y°”=oPe[œ]Ù:çYv×yð–xàò¯$x¾Á¬è¿I %ÞdŽ ÙDæ˜ÌQ û‚ŽÀ©U ÖʇD÷S¤kWö…RÙ°°—ºØ7ˆWÝ0k»+2WeÞÑÐãl&Lä¡’rŒÀ»å(2+ë€~èNÅ´Þúã¨àHÂ8"ưù×Ûôî1D²Àw+Bçt`Gë7í§sz3ezã(†eÒ•&­YPž?mU*5Ž(¾tT]PÝ–‡DÙé 1ž"|:ÁãæQG™l~q§;E2øz È©„ñ×åSN¹0³Á#U¹þãÚ#–«G2T͉hØÓ׉p¹ØÄ‰Þsikœ€õÔ‡£ Üþew8z}«ìJÓÒí¶×cö‹~‹öí‚ëßcËêkµëlšií,BË27¸,Úøë]GÞ'sá­z· íõ.ž¥›û"Kj>ƒ6,^m)¦ykØêD¦uÒàÔc'3Úšô¬A‘!Ö5¼½Kf0§,àÏhƒÓ8vO»O?ôXˆ»Å>„`—w CÅ›šÖ1t×ÖÈxÎmŸBˆ~ yIb÷½š·#›‰˜ð é=Ì­‹s®ÉŒ\žAL€£Ç6i-k‹ÂAª­SÛ;c‡AsË'§—{ÂwÔÖÞöi—©iˆÞÕ¦Ûþn]¹Óú¢ÐLsŽ:%ÚA†àF{^Ÿ¾ï3¬Û×}$d¼hV.Öoá\[$íØ»C«ý÷ЈLûmMrEÚ½i9N:ƒÚ(—tîâ0"U¥­Øú©m­²÷Yÿ"–èì»·ŠìU£?}¯ÿÖùŒ÷¹ÛÚÆîSçùŠn×HKßé«ÎŽ[x›â{g·ž¾ÁìwzîHqi“ë±&··­”møàId“ëÛÚ±D·&kq3Âó¶…/F}G¯æi{M„,È‚u>?Ä4×ÃÛ„ƒÓ‰ˆ5{h´Z×Ýy`û‘A*§œ±ô=9ÚÂjQ·ʀϓR eö£çÈÚêˆ,¾Ô;ôrö'l±•§I  Ñæ5@;V=ü\ŒÄñHªvC´¸Y&s5e&e¨ D/7< ¡ÉÜïêSFþE¸Œ³WSš ìgþ)¦b°‚–ØõÐ/Ñ¢ìÛ튥}c åpEW$5j[+³4¿0VS@¸Ô#OD.æ2hïˆðÇ·?ã@,%R€¡Ç~~ÍvßñS´7y-sÚ»ôËÕÂZ½#Ïðä]¥;3ŸÌ˜j_âáy2)/m×Ïè–|Ï·äI«|“g}ÛH~µ]WDdÌbÕìö|¿ØÊB•mü¬¾ÈÎÅÝMbr #É·^]çHGx9‘Œí‚Â`uK-ÄcÛE2¶æbe¨nßņ˺Å#fiÒ톦‚™Ô^ÍI¶²ºÉAW ½›%ù˜Ãti³š·Èü†r‹DÜŒ¦™ÑÈ1‡©EQ¾I5ÇK{ÔÝ^GzÛ-:2à½ÚüÕ㤰s©õ8M¸Ê#ÙçËêqRLomí~šØ9yþ8Ë–Xhç—ïªg"‹ ~’òÜŒ²Cœ­@ÔÊûù‹7¯wîgt=âŸO‘8éñ`µÑÞœùÄ4 Ì]ˆ²MxxácŒgˆùæ™D™)¼V«fõpæyÖ¹nNJe¬J†Ÿe¹ð¥PË“Uý-V$¥¸ds/»m÷Ú&¼¿^=;\–âîýM[~<Ĺ\¹À½È ïOŠ£‰‹Ðê¾(.ÂäÌ_ÅUb>í„÷'Õï³gs=}㉌ȭîó…Fª‡=uY» Ž‹—œà"™cèëvG~Mpgˆ®k&"Ñ/ື·¥3¤€ÔÀ©Qt,V±È k×è… ÿ·F83b?‚€Ì]#%"£SDj¼…Û?ýãÓ3Ó¶¡ÖÈ@?äÑš÷ïOxd×rj†¿D™ìæÿÑ‚b±©«xŽó'ž%âýâÚÊÜ\¡Åãb Í{Á;ãa¿Ñ ×ÿ†!8¸¦јÖCy訊‹Gû@¢;voQ/Ðs…©i…¡ØóÞϪ¹ ¼xí(÷ü”˜IÕ¡ñ<ÈEó§ˆvÿ{:ˆÔŒË¸×2¢ž•×^fdn€œŸìΠý¯ HhÞϳD@æO" H¯¹&,Ì3j> ˆ~ÈsV\¼»æµÆµ…¹/ §fÇ(+À3h@ÆO#8k×DܸC—~äêˆTÙ-úl<ãDŸÍl$¿+RûÀø×?ÌB€´½šJa“=’Q‚Ák‹Å1–{Ðfõß$)),@@¾ÃøVàØí{Èø2h¥’à{~¿É6|EÐï€J˜2ù/¬^Èô×VÎQ"²²IÉ—é‚%´} ¸a„Ú2d [ÂŒ²"x¿Ù"DîdRó!0¸Yð^Tí»~‰gbãw¢ç!®eŠüq¹à[®Qo)Ú+â¶™QßõÉ,1>?½låð'|«^ÞÂÙÞûæo*ÛFüm"¾\öÂâ™)eMdËŠ¯›s”X•K «ÛgY~ÙãKô`OÅÅ2F `ÛM×zð”䀫‰Îx渓¦ÏæÑ€ßfQ8F”Vs5ä—åÓe˜ŠÈs¸Çrý…Øj}NÝ{±ûd»ìXW[ÈMHJ¹ñÙâ·«q°6Àb@ &ÓžF¦ã¨\Õ¡$m•µ${»8mÂ^ù±‹Öþ˜¦RkíãJàVûk}—ÅF£5óžjÇû³"l=”ßÖ¨ç5€–3£?;!â\ȈzöXûiOƒmþõêx—S޽¯õ ´fØrXéÌ]¶“‰3×q˱<:£Žrt#SƒGá‡ûƒ—›Ç¿õùžõŠAäUWûŸÓÑ.êQÜAþiW—†ÛX8áöx»xºFl2‡òI¸OÚ:¿‹‹%H™Áü‡&cwži᪠mÕäëp_îñÉPö_ø„MÈYÝFTá(®¥ŒÃî³t?ÉCö„‹*¨<§¸±KjÀ¸«ËlKq†™ ‚Kþ2ZXûáSkÒk·›‰±õ#»B¡Î—Î;3rmÿ^3{?ZOPE,q‚ ¸Ž·ÄÈ4–`Cã]R”O OÊÅCæEW kˆì±"³DFŠÜ<1K•èÅœÚ2YÔN¹Æ§"Ncn‘NÄr2Ñ„¾«¶ D°G„¹Y(qè„Ah,…M¦‚34­ˆi‹ 9ߥê˜y¯DÁÌ•SëÄ#eE~tL4Ÿž·¯å‚Zn2w"ȤŒ õ{–€ æ 's2Á¸¬i"Y#ÕÀ’´X"¡e©ª%@VIj Ð€ü`æ=ˆ@˜/EK€ ÙÙ™pè_I° )P6Œ$ (’¤Ž Y“9,|ŒW>D~dL&“ä%o$¨âŒYRKDïIÕ ¯—«.ZŒ4‘Qe‰ìSÒaDÎ()3"PïHÕ’É\kI½UDI}WÑ ãdޝš $UKñdbE¬Ø*eKüj"o™Èˆ]cw•²%~ç‘#§ãiT€E¶ÄrfcýEdÆÖ_V‘-±š™_é™¶uQ4JlédŽÙ—W¤¡}[¥™Íö•ìï\í U¸ÉÑQTKl×ìg m¬²L¶ùŠj‰mÐòæ,{xO­ä>/"%f 6záo5l‰µM£&¥ˆ”˜ÙÙ ¤˜&tèÚ ¦ñ¿Í]1ûVzxÍ H; ªE±œÉ~a³· ZX»|A|MªÝ.ÍÊf×Ñödn™Ùþõ~N 6XßX“z†”æi;gÖËCÏ¢…¢•J[ü³uÛÎ4°/|ý빇q?ôldÓ¸-'=?K¹±àcØc×cýéöõ .-ì“=îˆHz9êÑçbJê¬-L̦ËMøæU‰¡]Cæx€wqdç¤È˜³¬ž”NÎBrÐ|au„ ~ðLXŠ®RÊ,˜3ýs_Ôß";ämÔ'[c†¦•úm ÞŸ~‹ºv$lÌêþ­~âžÔCD¿¤˜{ªN$z*»Ý¥:š‹=ôúSꌂ°áŸR‡Í›¡rES±d„HýÞ…<†=sõAc’Ôî:ëÄ¡cRTêcƒÍãZ7ꇓÍÓ«R‹AÍŸ Ç6«ùülˆu©3Æʹ1„±ÂÒèb‘l5Æ¥€4JÄ£ d@¡1cÁ©=#¤IÄõÆ35¬šj‹-ì[Æ%‡42#{Ä´Ð4z›WsÝ¡;ÚNQ‹x\«Q"¡5’œ”ZÖ¸Q£Mpg\mG#RpgŽEºµ‚‚òA lÑïÑØ¤ó¦,>F[º\Cƒ¦âbg“acùʼnœ¯ñÈVcz°[ÌÒYÜ޹e–bn™å&”ÙLDQs àĘj˜å!@Þ1!FMULJ’W±²yNÍx13kI‘¹®Gš7àršZâú:š~™ìùµ$S4äã”$þíB>Ló°=f™ ðˆ\‰É"Í.W“Iàô¸£&œ€xþC“R@L¾HóV #Ù¢°ÜW«ÕüKÐXŠŒ$¦f©6¦Ñ@2oÞRm@Bˆé8 ¶ô-eGÄ”i4­Ä»eþ€ SanPš=üA˜`üE~¾C3”õw4‹Y¯E3õz5ZïI3¦õ¾5©ZŸ&^ëóÓäl}ÆšÀ­ïA“¼ùª4 \^¦¥‰Ë ·TrY–n.ëÆRÒemYÚº,?KmçµìwYÖ!/ëܲèe/X¢½lKÆ—-eùú²í,§_¶¦¦ýsóZa ìo+`†b'¬Ql‰*нÑZF1IVî(fËJ"Å´YÙ¤˜?+­iÕ—bF­@SL­qŠ9¶BO1ÙV *fÝ FÅô[Q©Vx*Gˆ§Ê1c,;†¬¾UŽ)«•£ÌêdvÔY­…Vk+§¥Õãʉj%»rêZY¯œÌVú+§·Ë oÄô¼È˜ž‚"Ó›ðDuz(f¦GâÅÎôZ¼ šžMÓûñÂjzH^|M/Ê ´áhy 7}1¯ó¦¿æµàôé¼\œ~ŸW”Ó7ôªsú^™NÓ«×á†z;=U/‚§7ë…òpx½”.±WÛÓi¶‚|úÕ^³OßÛÊúéž{á?]x'¤›ï‚ˆœcÁ‚ó2 p®BNgȨÄ)¸¼^ÂãKdàcŒŠŒœt‘ñ“ñ22ÄrêF†aNïÈPÍ) Î9M$C>c’dTèd“ŒŒ’Ñ¥V2uRKF©Æ{É@Ö©1ì:}&b§ØdÐì4œ ¬ª“Á·Óy")âP-öR´E"YÈT>˜•©êNfî¨bË.|ga-¶P¢)Ëð¤Ð¦C¨!¨ÕDö-ôkÁ1‡&‘ h§U ñ‹k¢WNõVä:xHRcœ²íV¹àTÛ¯0ÏåÁµêINŒà¯ËÓö×ä¸ j‰ü£Á‡8ÇL —Å^ dÓSdŽ$Ü«2È*œüÐ Þ>Ê•9·Ÿ*$JÁ.¯eJ%Ñ# oP^*û( ÀGa­ì×ç{7‚«­x¿ÛãÇ.- ÞŸm. ãÑN‰”BƒØôæ ¶š÷Ò|":Ñ Á¾rªÁy›Ä×+è/ ƒK¥<ïON…óŽv{óv¼éDPêÃàÈhL2zoi^a77§7¸È½G?åM0rï2Äe´û–^voKí·ÌCø…ÆþmíÒ±¾¹G…€¢µHéýa;7_´÷ æ!°kÇ{ˆØÎýjŸ‘ܽ­9É%äÐá­ÝIÖ®$¨"®ÚÑÄïWšž8çV%ÅàPV\«ôN F&ÌÒ^E`Ô,E¤´ia‡·rÉUqôl÷ÌY¸UùíÎg2nÖ5Fqv{yg;DZýSê½ä§t¨¹4Iv±© JÏF7­¶Â±ßœ÷`wÿ4¥5”=Ϩ¢nWÙ”élÓ¶=çGÓHíþ#‘žÞ!(w(ƒ(º‰È®&EŒÒŒHõŽðô†EU¸©ó9‰p4¨7>z{|6GR)‡c4CÆ »ðBí#(Øñç˜D`RÇ ¢<ˆó†N"c—¦OJùì›}¡(ÑÂn·ë)í¥l×_»´ uÚ*‘vK++{ú9QÖÛ]‰ŒYuÜ.çÁ–¶Yöýsl«·Öáô×r»šžË]E¤4ñQ¹7—rCiû–^à ÌáŒg|`ÝÒoüƒøm;bJnxgsA¬û9'”ÜüR¼‰ºã÷~BÇ-îÙÛµó¹xKw>»Ðq‹çëáù¼y<ßS¹Å»ô&ôxßѨk"uÛ|ÝDÃ{¬­hŠõ—ºm¾D½·>Vq´ßÇJýØ )äæ;Æ;ýcS…@l¼róÍ¢±Cx 6yê¶¹!·¡qæ$¥ÛÜä„VB˜¥ÐSÓš aÞR»Í- K7„‘ u‡0¤)ÝæÆ6D"~[“f±S¨ÍºëQ„ÝÅŠ8BÕ"ÎÔió3&Ô1â  ?ªR•ÍO³âˆ/Ä:âT A89S–Í×Љó7´CâŒN 6?Æ]‚$NúP) o ”LÂc±“ð*B%<ÐL ï$tUÔ} á•ðoBœ%| p ?)4^— ˜ð·B+&|²Ð“ ¿-$g· YšðÿBº&|Ä· ?2$pÂ× ™œðGCIGÖÚ 6äxÂë ÉžðŒCÖÇgþ ßÚ¥Âýõ wÐ]_(\ø 7?dŠ<p!£Tè(B BŠh#´’"" =¥ˆZBs)"›ÐeŠè'´›"Bz)_hA”K@Eœ*Q‹½sµpÍŦ"¢ =ªˆúB³*Ãçq¢FŽ¡zÑe(cEêY¥†ÂVD²!ÂÑnuEDü2賨9¿"²vM°¾C6ÌãóP‹>ÔÇ"Êw²H„†Y$ \æ,’ .„æé†J‹ŒDÈ©EÖ"$×<±ªl‘ûå¶È„º[¤P\.²,¡™˜Ô‘ólMjÍyF'õè<듚užJ];O…ô¥—RÏ3P) çYªÙóLV ñy²+ÅúfN󳿑ÒN@µá÷b—² š7C=n\ENé7' Z™Gý=š(ж¾ Ðíaí]»*úÕä² "¤½ðOµjØV1´ßÓ#| *¸ B¯íQ®ž€ª „Òá»\€Ú:‚¼Ð1 ,Î3dþ(>«­ŒQD¶iPxu+r~„Ÿ|]‡¼Ñ ðj@2 X,Ìö­Š6Óü'JLCrhÇX?º†hwväéM™ë;@eÔ/&è8µÆ&èáàîM©ÃgHBÍ|b_£‚Žõ#txM¿vP™t( { 0uÞ6ÞeÃëºhhÐï17m |J1N$`ö´á]ꎎsT•‰ ¹üž«ãr>}w |QX»øGÚðuN˜´æ/uuÊÖ÷¶*‚Sg¨°á5 MÊ}yö¡sM‹Ï¥K8(]µK;9x©ꌈ½pøØŠtN^'¢Âu®›òT³G” .Z~4-–É× ÚÅ­z-ï4ûéÎz,Ï_•¨c:÷´]ØÎÅbpˆ«‹zðŸÃÞÒ^&£„¥Çw²GU­yÛª‰“’èXB*²¬r8úˬC2‡ÍnÈãñ¹\ãe)A™—Øút!ú\|Ð%¢>Æ59Už ÷ŠX„úÒ݆Tôu†Œ¡‰ å¢A©ÎÙõõ¡T·qÝ$Ô9÷1D…M‡ÍAúQÍ8öÍ(稖í¬ÒO<ùLJ\Võž)žÅQ UªvÔ'i+Gíz`Lš?—Kí&£…d:5H5ªð.æë¼*öÄ,Πɀš7E3 +…;ǹלDÕ8“EÒ½yvÛöÌ[3u?_逘?Šr9oüš(÷âhµ©€ÊŽ!¬§Â£9Ы»èç3_/Í&\k(¨3vÒÙ6žª¿¹ó¿À£Úä¹jPOªMj˜¥È¦D3Z³üoTnÒ#‘5¶.5D+ª‹7”·Á(Tái§#∠S»©‡ºP}Ç-,´Áá^½‡ÎÕøô˜ ý(Í‚¸íé×l( ´õ‡®Isz<¸¸I¶ÆŒ´(çoÕäÞö¾Ù’5K(ÊÉTµî«O “=ŒLѨ€Bp•·8iWêôÝn™sNöÚCåÊuÙ,æA¸Žö ÔõSÈx0ôl.¨·Å´V=Þ'½@…Ù-.ÐI[ÅÛ¹U‘ôE«…xð•GúÃ>TUó-5ÝÌ µåõÄ¡aØg‘éX8L[ŸobkC§ Ûdê7ß’bArYÅ'A;æ#•˜™-ø^ÛUÙôtÎbŒŒ¿!…ˆ¨þ6Éu–HºþkTO"–YR‘CHÚca¸€Ú p,ZÍb¡ÆåÒÓB‹zæ4…EDçÌÄ…šçÁHFSóä¶8 —3¬ŠDÇ.¸˜'Bzʘ´Q¿zN™·¦9OE•:ŸI€;0ª›¥vç9lâx Cî¥.ç1¹ÂsÉ )ÚÔÎÛšÓðWd‡è"'(ÕÔêRËÃ1j@MYÌëZ˜Ô©Y\"LôNÛRHø4¤èO<œ§ju©ÝyL0lŸe+é<”ÂØ¯íCo-Å;L¦¯·†¡Du8Ÿ‰9&bâ 38ñ5ó™uŽŸšïçZ`´ÞÏõÎæ‹Øï)Ô;ã¾Ç53áF§ÞÕ§êñ„ûÍWǗлz’ùžB½3Þ¥¼ú²·g)bA¤t§/ÔMláÛÂÂ8<»m[|)Ýéë<¡W—0¸Eïg™§P§op”V ”«t2…ï¨ÔéôM‡R”ülLÞL¯›7u:}ƒÃ`<7 4°nÝÍ ETϘè°Åbo8çQªIŠÒ-òÊn±jÊ¢q ÐYõЀ?£7äK”`ãìYrü›í|Zž‹3 „EÕÏõs.*ÂqRAö缄øª¾o?S£øç.ˆšúVül†§iŸ²ó;*ßqÆÏëûÇý rÓ÷m®ŠìªZëÞD”ÝÃã@i~þx%¨æ÷[=—¨ø»oÏ—çÞjƒþ)ØáEMe§£Š‚¾+÷Å@lx?þZ§›ó¹·h~húÅîï"üGþü+>&Øz\»о?}Æîª*Ä]Yk»+Þ.¨'Ûý_Õàì~„ºÓì–ð«ÁzÑ‹s×{š(´¹æÎ· ï}êÄ–âá#4Õ%ãQ˜=ê³x¤”¡ˆ&‡B±¨ ¦±å"*…I¸G.A—Šè†Œª[# Äí,ZŒ„Èþ'Š ZYDZÈè·x0†ŒÁªÁ² x{@7ô„)AºÆ4õÀÙŠ7jðˆ¶1Ôµs¸öC¡h$Óoö@uø Éf™=¹5à4N5( ÕÌ7=TAÞCëA: ¿Ùköjˆdÿ„ñcÙÈ—õìÅO:i#Õö÷|ÁXž»ðœÂXb·îI‡±šËÚZbˆ*ÔzòbLW)¶üƘ6¡2R HtõŸ4 :ÝtÀƒ§RÐצjÍžk³Û{>ýÇÈÙŒiÁUäu˜fÛ5÷¤ÿ䇯°u9$ û'Ï4†ç =5ÆR¥XKV¡ƒîþ䳀Ј”»ìjVl ™3ʯöš]C‘ï<2p@T)Ö³tLSžšÉ݇¬x¶ÉÍó“´†¾’5ÝF[z^€”Äã#þÔÜ$zU&Öó—@0DŽsø”Êȃ‘û#R Äs¥L§‘šrEw¡&,C’ý†§¦nŒ[³»Hüþ$€ñ?ôr¤ûµcøR çPHʤ±éú­"?…9X4÷„8¨qÐîEåQ_:N–‘BWxa~ÍmæYC3êI|äЮ¥Â§.¨p·èA…\&G#ˆ!° ìÄÒÕ¾TR,å½”Ò5)¦’x¶ˆãØ;¦¯œY•žÚbàxÁ•äH\ž–xüðÌ»&¶!”Þ ]3ðÀøã°ôQàÀaÑJ_Õf ˆ™‚M&Rh¬á%b€&5õeZR4)ûÚ­k!Þ€à…£P§ÍÀ—¢‡²pS-é¶î‘&¥‚ßѨ˜ë‚s™²ÞÿÀ“²%u?ˆñ,¨6ú¸Î®w"Çç¢yT4—B{ÚäQhoù/ÁÃo»ˆü¡¢ïiš&_{$4Á9j‚ÛZÚøÆR¦ ˆ"°Í%½§ uoÕ¡¤°Ôæñj&¨¼­*Åb!;IÇ^ÚÿÀ#DFn“ÊÓ”Ÿ¨,|ÊYrEá¾ÑòÛkç£8‘µIzs­Y¶…+jQ ôxg§Š´9³4o²'Ù²_4û–O7äPz}F³4š ÆÐZ[éÔÍP,<æhšl»u·åßX±Æze³kÛ¶vZºŽìmtàê’’æ.téÒmÝÒžÞ·K$z{9€£y…eǹBq«­£Ö4, €iC-ÚÞ’“ð¥ÅOs·mÁ‹J¿yh¥Õ{˜ ÐÒ‚h€EÄ–tաƹJAÙaio –6Œ Â&kÓ2XCxåì‡×Eðšþkë?h’ ˜Jµj™I?Ÿ¯éM+7O®yË8‘gæJûM¹¯ ç!£ÄšÚµa]Útú3–?µŒ3ÝDGPƒ¯6 9ª™ËÔæŸuÓSáœ6Zd‚©¾¦ûÜ™•’¶æg²Ú¦OynmúLÙ1ágøþx¾žKq9•)пA oeY‹šwå9#PêLÏzêxð¶pÜ”m.*ÜôS*|@Än]¹½D”¶OJÿ¦›Ø,%ø7ÿGeYŽ Øb]_ †6™,s¢ªâ _s¨X¦Bú7—u °ªK¸†ìc3ÛÛµ7¾·n W±†<š^ŒM¿nT…P„äET®C3¤m+‡ˆ4Òǘ¨q;è ¢?ejDtìïÛ†d‹àHELÀC•Aˆ˜êtçxxÇôEtV;-GLgúØ4k˜QD•B‰îìú\fÚs‹"³é¢8jŒE¦=›Ó¬ÿ(d¦•2DPñÅjÓÝ!*ûCÉ×k1i ¦L}IK'¢?¤¯ˆöƒ„ÐtAP§­Yÿ|‹KMç/©¸H½LHy¹®3÷ƒæåŸ[Vö\y*.3t¿]n]x–ç*ÓñŠºJµ”רE¹ÖùªU;(C—mKÞ×KG´øêšR¢²ì:Bœ[—f§XB]¾*T8’?{À®ÛÄt˜ÊVB…2å±Ýúô­d;ÒŸÊžE¶FvÙÖ}±S¿ì|—*ÖT\ÍaA RuO12¦lUì7Lú-J”+æ¬Ò’Ó♪V±ŠÈ~q9„åÄÌ&¾Ú°®¦àU,0&=ñÑ„•F.ŽžOXrÓ+Öc¦¸XãD"åÔ0²r² ´cŸzú ŠGÔjH=ÁL.­rLþI=‘ëÔÌÎJSf+Ç)R¦|+qä"­Êűlºpåè¶¼wï̱ó}»  ¹úWÜW¥ O‚ÂuëGƒu‚[|WÄKw…e nwiXá±ìnËñ¥kD„×gÞ5üøžÜÁbyæÇ suÀtÔéwš[wæX@â»ÃçÒ„éʸJÉÇ‘¥)E̹¤”B/þ§Ë$¦‹J9ƒtaYY›ÕÍ¥ˆã®®° =¦»¬5»]\jÊ´êv».eºæ2Uk/ÝwV û+.>«Št= pu͈ØÄ¿^ &´œù3úbŸó” ÄeE3pQéÑ m(`jbô¦Á„zÕO„ä*¬E±+¿Z‰E¬“šñ(óBÞ?â5™“K*C:w‰údÎS]ÔßQ—ÃoGðHäJ 0Y«æ€Óm‡\ÕÕSÄæ¢Ä±ñ/H•G¬+¨#BJ=Ø¡ì… '3³Ú¾JXÍF~ÄŽz¢}ê¯ÏÍæ³ áYÅ«„ùlöElsCñð"U ( â®#› ÛÂÛŽŒ‘sªÚ:(«f.ÒZ£f7å[h ‡¸:˜ È9DŽD ®EquÏ£™?Rê@0­$ò1¤EHÍÙÈä(É’×!‚q[©®Ž¢´¬’"åìÈ!9£È©_m3E}‚^sUD#,rêœäPr^2)¢]òbT5àH+Ï‘#Òîœú# #spd–욦Tì‘Ò*rêÌ›L÷™^Bf…ÿù#ŸþÈÅÏÄ¢@$ŒÓ¿<÷HžK¯ˆÔ¦`ñ©iN"¯dBUNÈ)UŠ7HͺªœCFä”ä­@£ Zù‘à%‚«IõtL`†–»ç‰ p¸›§’‰@–?ÅÓ¥JJZ‘QÒÖD0ª/ÕÓÁÑ 2º§¿‰Ìš"'rVÕJߨIIµ+é–t<‘y«XúR‰âÌêy5óOn2ÿ)–®¼’RAPþÓ*UÕ¿¨s¹¥ZAä–‚†³j¥9¥0¢ä«^j'ŠŒ*–Nde†€”M!•î€Wzâ;¢¿“Jé~-QTŠëÂSÜS*¥ÛmGù*žL”¸üé¥t{ÂY*ó·å4SE)ÝÞf–åügéÎWE‘J·•“%@_]Q$ôX¤Òm‘z¥Ñ—qÖ"}©YtÛYÓô-“uOßVEݶ^ÖO}wfÕwpÑE·]žµZ3QÍuSQTÑÍœdQØMNŽÝ,tµ\Yvãæ5ê°\C[mj"«*ºšQðZÍ"š©‹Õ…ði«(:í58¬ÇÍ>M:&ÕìWt=ô³L„_…Ž3·û¬CC˜"«AÎÜÆºô0:¼[Ey,TÖ«h8U´„-äÐÝ}ÊðLŧ 0r›«ÇôîÀ<ö(Lm¯2Ççþáú8 $Á0ôU®Ñ&ø³W—‘E¤ýaR𵉠<ðdíšúò).ûccÈ®™9·ðyÚ , ¯A?´CÂBpq}MPà嘿æ0Ȫy¼­1k.|Þ««QÓ%>ayͨ i³ 4éÄ[3@š JP“¤ÙnKðLŠ!XZH‡´ËƈL(l§µ%“€˜º´ha4,'5},sVX&–`±)mø,+ìOŠêSѴؤB¶"š:›-=À¾v}ך‚£ä¢KÌ2 àœDÿÄ„÷5¡JÀÒÓšt=uÚ÷jbˆÍAÔÜ-6õR4» Àçøi2ï'I ÄpK$SÜSïQsÍ`n[Ì©éhöê4aMÀòÓLiSgÔ„ø5ë ÄÕü™çv%wÎ"Ýî´xT4U?ÎRð@†Ý#“ôÔEµ„°æñ¶õ—4ׯjªú5Zìk· Kdž›½–Èöíµô­^œ`#ñ´~>ðý)q©%&G¯e Ûê&¬¤˜ö'(¶P³¨åòŽo­Øü LòWD+?õk4Ù]I+Håb´ÂT¯W«På–´PUïZkYõÁh½«<;-‰ÕÇ«U³ú ´²V^“UßÊ«´ ]yÝVÄ+K }eÕX1°¬,+–ÕgEŲ@µî˜KØ*“e•[õ²l«p–½bUв¬Rš;NK©eOZµµì[+È–½mEÛÜþV×Ma¥ßbC¬:\ìŒUÓY‘¹X++DƒfÅêbô¬ ]좽‹í´Âx±¯VŒØÕ ŠÝ:‰1#`':f”ìdÈŒ¤0™Á¶“*#wÞe†ìÎÍÌ°ÞØ›ù¿3sNÍüÓD3ÇàTÒHC8Û43ÎHÍl†“V#áá¼Ö̉8÷5ó&ÎÍÜŠsh3ÿâ<ÛÌÑ87ó8Î×TSz3d¬ßL-8sJÎμ“³‹37å äÌ_9K9R\NdÎ,˜“3Sæ„è̦g:nN«Î¤œS¯3qçôìLî9…;€NóΡ1Á3‹èdñÌ4:¡<³‘N:ÏŒå6ÞüçpmÑát¥d|»j«OÌgˆv ¸?ìŽ!L.:µ©(Æ3DßQcíM"gHJûRLgˆ'Ðgö«]P`–\©R1ž!º©À¹·v\Á¹Ñ&ïÊŠ Þ·Õ¦r£³«±Eº6Åx†hÃ"6¥F‰µÏ,†1D+<›¹J»‘áÈþ™Æ`]o”>dsŸ7Æuø1÷eï\cðöºÞ¤Q.Ô;ðzkoÏ&½Çà|sÔ¶=kö£[»¥!0Ç/xÓ  I®ÒXHaµ=Jó!•ËØ"æ Š!QMŒ!ã¢ðFGÛÙ j˜Ñ,)¯N ‡Ã)ÞtBœÑ˜ ‰.]´Þ¼©š\³4x†æg4Ro‹­šÞ(Jy­Q›I)&ª}¬Úo ¤Ñ’*oR™6ÛV¾rkl ±Óè}…(–¾ôæ,=´.²m¶Ô´<¥W%8géÖ¥ 7ôŒ)*ïM¿T€ånðÆ`]¥y8„e£ÁX^;j¼ ™rªKJŸrhÚF/3®Iïw¦._•÷DS?—vÀû¦Cc7z«)rµkÿ5Õ{õ›iæ ¿ÑÇMÛ]Z½M+»Á)œ{²_<Ô†£¥œW\ÞvN‰«U:Ó)êËá4A”t½äèp§æ4$¢ žÂü)ï”…ç覧 {¯½ã^e°véʧ˜ô¨û!SíÍýªƒµKÿ¿àÌ]·hP4›ÏÜdBž;„¨ƒÅMïbT÷i.&ˆ ?ÿQƒ3áUÆZEAØo¹­,*M¸È‚€I@ b˸¨ˆ5P=ë–ñ)ÐÎâo›¼ÎN=¹Z}Ι'·ÙtW• Ú¯Ö•'“Ü)áêÔÖ¢v†iD#Š­ò”ÚšUCÎS"gÈdY«Ž09,3¦Ú†ÊqAŸ¶:'–pü)Âr^Ó»vñ*‘s”‡ëƒ‘['–@Õ‹Co\g„ªç»§‰M1•ñ$ Jà Aj§ß*z¢jê?óH€Œ¢"`WPBÄåUä Ì0Š þx (†Ø-J. õj/rŽGrt?¦jŒ€¤qа N•ˆq$z‹@ ÕÊÖ,"6rŽÊ—á…ç8 r½ šaE‡¦ŽªÚKGr6 Ê!ÍC`Vù‡„3VbøÈÁÉS$€ˆ€b2AžÉ®RBDøÍ.7$gw—â’DDZU-R¤×‘$e£l‘kQu ŒÊGRÍÿY§“2KrÖS %—b"Âë‰ $g©¶UH:YEõ‰@;u 5üñ0‡Dz˜"Òv@r–Nn¡*"+¥¬øï^‡Ý•)ˆE,æÍ"¢Ê[>lÈ(Ú[\™K@ôÁžË)#@¨Ìåò^DV#€î•2B¾Ð)BbD`7BkL‘ªGF„cP\³ŒóÞ(ºfŠô3Âa4ˆSB<­ 6e$ÏÛú·¸J[þJ ‰+qµ·¼ZW„Ë;Š1#q×®,—OÆÕçòéŘÀ®a—ïÀuîò=Å”}‹1«ÆÞrÈéÅBÈ #¾XB–/TH÷ùšË#¶(]ÿ/–mHÆÒÎi"¾üCj0¶HÈÆ6Êq"¶ÓBÔ06cƆÍi"¾©C@16~ˆ,†qÈq"n@B¬1ŒL:†!Êá!n¬B2 Z(G†Ñ qÉ0Œ9OÄgˆT† !Ë0Â9OÄ uˆaº-½Ì0÷9=Ä„ÐÝŒc#´9ãhÉñ!vú¸ÂgœO!gX…Æ9—ÃCì( ½Ñ8-C“4NÔâ§nh›úÁò§qvç¨?ßCF5|€Zu7!ÔXÓÈÙ!îm„¨kx$!ü^K qÇÆõcÃ÷ …Ùðr2ˆûP¡T~V¨Ù†/‚·á¯ådséB7×¾Ö ¿0¸ï½á_†Œoø !õNjŒq?6ƒÃ× Máð‡Cw8\æ˜íá^u¨‡ÛíÇî—ÇD÷ÜC$9¼ûRŽ Ä–#JÈùI„hsD!ìIˆ?GÔÑÙ„ˆtD?!4’kQG jÕg…¢u„b.zÑšQÓ=œ ÕìùBY;ÂÂPߎÐ1º#¼ ïACé;ÂÔP÷H6Ã#Ø QñˆCxÜCf—&÷˜:ÄË=ê}óÌC=‚÷ÐI?´Ô# zë‘(x†Y&!Û#Ûð~Gì„æ{¤,B>Ò¡©—ôHHÐG %dê=Ëòl:‹eaBç>25¡…ïÉœË÷tO(êGF(T÷#kÊü‘Y õþH>¹Àä§b@Nѹ‘´4—OˆLX ˆlY $È):>´ ²n1Ø 2s1ü Çèܘk¾¢YÀ´ss|C$}^Cäc¢CŽÍñ¡‘·ŒÁ‘ÛŒá‘ÿŒ9HLJPDÕçTDª5FYäÜw)Û‰Y]Ÿš‘ƒs|°Fä†}öF¤cÔ@LëÍ[¬ Ø&8d+°v$Â΋ÑkÄD芃"Ù®}ª½¢_È¥è‡(P=HÙl:#BÿÝ•‰¨R"¢rô—0ú“«t›7䚌DŽ*9 Õ ‰¨üãög¥>•«?`‘kpØ<®›‰"—` òoÖ³û6íI"<#\.H Ý$-QžìMYm)r©Ètä‰!ÃÇ-¼l’$rê\ˆ¤»Â&•÷Üþz=À|¹^àv}OUó$¢—ƒp¢?ET ¹ðŽ5ºlÞžK‰áõ]åst¶yZÐDôM³”- ˜O(œÓˆÑ­ói;¢®¦Êi`:.Ua.õe« ií­cæÂÕY‰ðìD¢âµ´Ÿ<)‘·æCžÏ\M–]x |ÈóéÙ¬ÇÂ( T]KÓΡ%rĤk§~ϱ±0ƒqhGûº¦€ÛA%3MÜÅÖ&ž *T;—®uÄö£ˆív´¯s/N>H~ 7ÅdmÐ xب ¯)ýöèqg.›³Ä”£„I’ަw†äHS7ŽóW“©.=õ¡ˆpú‘gÏ·iÄ'>ìazyÈu;@!ÿÈÓÑ_Úבk%®ç ð³H„S–Öõg~uk¢ dïòª½Šz‡¬Æ™<£FÆ÷ºÆ]†ÐîEíƒu4V:Æõgütàj(í½eÔÚ(Pxº ˆ¢¿Õ=­©tÎ,éáfDÙ‡§Ö®:ñf©¡‹[GN5Á@X}h:úyÓ%›¥Jµ™jç¨(«Äᨧ. .œ(†±_·°ŸEæD.‘f[qÚ•¨»mæºð7WÇàà×\ó \Ù¥ÄG„%WŒíñO<+ûØ(p ƒ–¼œH„ÕD“fR€“¢, ›ˆÕ- 0Ë÷â[Vχ¥?4ßϕ̕¯@¯óý¹#/Ãæ]¥±äsq5ŸÝ(/EŸoßèå;è–âË÷äÅåx•8VN}Ûd±J]QÀŽEƒ£Ò‰ëjû0ûX{Q+÷åɃßÿ„+ÔÜX°\åQ“¯#þ†»¼àå;“;*êÿ±ëÖ5=¢Ø™ð¦ŽïUîޠć›vܺР€²p«¡VC0Zµ7NtüC4IA p«_Tß603¶›:¿`o„}„Ó{‹]î/…‘ žHâ¥=cÅXcö/fÐAI¹~ pÝI%¸ÿqœ¥¶X°Lbâb ±êA^8¢Ã¡œãÇÄ)^=¡*ñ~Í ýرJbЭ/æÇ5çàÅŽÐîH=äþµQ 7…³05«X Цô@t§#ˆTá˜@uÀœs^&'~UgnKN„,®p”¦'›Â™BgŠ]îp‡,|2ðÌÆ_qÛØóãÚY-Ü?ät¿º‹ˆV½÷"•'n&åð=˜'Šþ!=ÝYO/ÎýY§ì…Ë‹n¦§ßbn1§âèߘçìÌÀp®§ØpôpÀÙÆ¯>¯9éÁJ GÌEµÅîéÏf~±œ€3ÿJÀ$I Qêcò€]~z0{PìL[Æõ¹eÙ !_Ãw}@ ]%: ¢hPL—ÝdaŽÆÇˆ¹5‚5¤æ—x<άŽ(óÓpN ƒh¡ãˆyc^Ñ©j‚58ÂTЇuÜ¡‡² ëü8wA^ÖÛò8XÑ6#%ªóÄ,²²µÇÞ lÇ <š°à‚GONy òAD×Gá‰pÞïO² ¸ó‘P+_Ã|Ï98ÿß’è<Ðç`i 6whBÇR2ÄãcñÆfÿWò#2š­ˆPÓÙëd6vÿ¿’Š$ÄubŸ¥k¨ð“Ò‘Ñ|¼œOgƒBÀ­©!éX—=’GÂäüªƒÕ0¾G_f œ’£"0k‹*z->V *šÐ±l˜`äÏ+ 3éׇ—û 5VFI¼Ñ­%ç¤_ vrJq‘À*õGúK>ø ïÚë˜D´¾­•NÑæÁ˜z¦ƒÁJµ”È^YPU`Ö©g@V)Ë«”n™uìe2X X…P¤”‰‰´WÇž‘Rn–¾ºq$¬$­ˆÔ¹g]•|²´­ˆ”ê·"eîþ­5a+¡+»²2»"³Î= ä_ÿ€ ‰yièë„Góo"lã¤Ê~†ˆEïç± D×ïîlm'Þ8õXg=›?‰à·äDð=ôl¯!p9RÄSè @P< „ßBíP=üÅ= øD‚v5ƒG¢†÷×Hü¦´œÍ’ #èNß«ÑaUDªŠ mÓ[‡ç´ü¥uMÓÜŸ,‚Àìî·ýSX•HÇ\»>t ¿"x˜‡X¢Ž"tDˆ¨IÂûF;”]jˆŒ?f™Žÿ ŽäT|‚£³Ùd9²˜; \ŠKÄ'5q¶!è“>ØþÍ¿fŒ]t,pN—ØùAóÈdš 'Ì, ÉL"ãÒº©‚‘õw0»ìîÄÕ9ÁI,¯~Âîx^ü­ë™oÂ.=‡ýç¶Br4n®}< >ž%&€ã0ÕMý)ƒ4þê‹@úöÕw•:ªþ>‘V•çLÇoc]¤f«¯ä›[›e}1ý³SÖ×)’ݹº±–‘¿þ59R´¾%WÏÅýîx¾ÛÖäP]\½õ­ïöýŠÝ ïܾñS^×w9$xµÛÝ Ø·ã­b+RÈ×Ì ¦à‰ý’Z2üY©UJÍ`·\l_—°wmPŒxÍS,`껕¼5²×«–ô†ú†[ÛÔFv‹ DE&Üj_gE€VEv×1  X7)ËLê=§°¹¶ ªØ< λ­KAᔀ>ôUñ7/ŒŽú÷LÆýŠøˆ5 &=BÇÚ5…€ð *ðÈeCCë§Ö=×jÖöƒNÉl¡· Æ>d˜CU_9X~ºÔÎM„’ˆ*²ÁƒKMoòü©ûíò%àùO¨|ƒ HG Ž €ÝþÄ¥ @ü‡Ãھ>RHÚ@—tX=U޾’Ô.‚¤ˆÖª·€î€1ógR.¬Q&Ýz^Ñ-ÿ •^ÕR2©¾~è‡îÄTh?xØkþ½©ñÁ•ÇÒ´^ ¤Èó[ãþAëFEDÐQ0¨)¿ýðÄÑÑuZš]ßÖ‡nJõ°x¹ÐÝQQ®C¢†¥Y‡3jjØ“)‰xüÌ¿Gµ)þΗÚú!¨ŸYäøaf0Œ‘òBzFƒßŠQnˆcÕÁ{(_ë›{Û>åÓPĶÅÁ¼œ§òø Aè)Íâá2™à6=?8Î@E/˜•Åð‡¶Õ‹ER§}5¥\°*Ùz™“„i@H:1C-spfˆþ”éh: !g;°*…vÕ!Fc‚^Nï6ôjäü›nQ=\bκ®Îÿ²à#r *BM>Æv>fó5-b·HµZÃ6¼Ãæœ^ºq9„²ë:ó˸® ¢ãFމ NµZ6ø‚ý œÖâ³P`xjW%T8ˆEÆTUŽxa² ¥rÎWòÑ10²kÚ+ hÊ11ü†%xŽóBÞBÿäh²h6²ñÚºcMPPêZŠ\&d€Ø§†öx11F«sBÁÒt_»À©M€@Lr2ë,ö>_ðyèå 7s±é}6^PœåCÅFGì§¶Îg¢èfˆCΡˆ©(îmýÙÈF4á†õÐù,AÞ(³È«>UFg-íKöa‚@´ ¬Ým#&Ô¤‘ÅñY‚¢© m"e @oèQçBþŒO'»Ò\\~Kw]ÒF²þO ó°×ørG÷…¢Ð±I‚@Lµë F ×þf±ƒ‹ˆþ¸⺩:Óÿ­ËFP³V@»¤|” ý“ÉL"¦­:§î²a à˜%(ÑÉ*K[oˆèßàÌTÀOmš î ±YpDô%î_D§ ä°æÑ©”Ñy‚å·Î³7×sY1/WlË]ݧ›>ïü5{ñtl¦`y‚¯T0>*zœøÁ€ æîõðð¡‚yÀ ôë!„‚êû9¨|Œ`œe¨ÛêÉêÇj»48q$úÁ<5Q€õ`£Õ“×GæéŒjµ«¾²PâÖ܇ƒúÀÀpX«8 ÅçyèÎDŒ ‡ƒj\|Äî”°PσÂü¹’ܹ‰!‚á‘&p«“$c“TÌ g‹ShÈÜ!“q¶®u÷Ùbf`øu2«÷âû‘A¡×#>˜ÑF†IÅ«žN¦23ªJ.ÇÜÅWáÎ’"Åã%G„n’{Å1"0uÿ=“²°Îfɇ MY9S"{ש›,ÆÐH½ ä‰GÉÎ ˜RÈ¢æŒÍ¥õæÌòé£d‚I›íeÆ&þ}{I'“iKÄ3Δ*Ûˉš@f/™k2v‘=Žì6¼(É d$J”›Sn¯äѤ1¤»#×Nd×|¼@r)p~j¢þ¼JK@œ½ºˆ¬ù3@sÓcÊ‚™@»RT#ÒûÏÍÍéQY›#‚wå;"(Å• š‡³³ H¤g¡ÿF­ ÐÔyîYn$‚2kT$‰ [hzQØTà–Ú'ÔYËüÌCqެ¡V¤µøžõ;?óP:*뵊ÌRÓ%‚šs™ŸyÈÿŒÒ°7‹Ç²Hø™žy¨Ó’5hEv©SAe¸ŒÏœŸ`¬NAiŽ}+sÙÕ¹€ŸçG£ú9 Ó\áÐYhpr7‹®ÎâÄqDn™iÓbæÉ>D¯ C0ž1ü®2 Ó\38û×½! Š3Î^‹ºx9 S@HíúÁ­~â áBs%Ë4Ls79iÖœuII_áŎα#~yê×–y˜æû‚ ¾Ìz¨{L2¸MVÚæaš‹ÍÙ¥; VAê®oû½âî<K³Æêñ£ýÇ&kYTæ·OîÖÈ¡L¿Ôà‚TpMÇXüÁ`ÙöÆ(eØ¥Å1¹}¦´Æ:T™Þ5Ò<ôbÈT†]ZX…Y:6½ÊB/h^»ÿ®áYRi![„N ó˜°¨ó) á+i´XFUZD9s:«E@܉Ðȴ̘´èˆ´f€;)±¥Ò ˜¢ã>B˜rühÁ4æCm»@ ¸9UÊ”cÚ§Mß´À½L¼²Ø~R&Ëct Ý^óÈOù¨bÍ!”ù`–g@N«ù¨]n±2âL³ƒ·1µšÐ@úlçD\ÎIëÿ1ˆù–;aƒ‘ÍDÕü uV4Cº§m˜VáPËi"¼t ¢4×3ØùV²AP×÷¹Éš0B"Ñ̰æ”}2švq}yÚ‰©) ›Yú HSgÞR\Èbš9²42~X¦ Cô¦5—†90Y¾lwûmÍÉqz=<ÍÛ!§ê멽áloÏý!k3Û,=ˆ\­ÏâÕüá ·ZsŒh˜²§©iHi°ÉÔÌT‚go‡%3Á³·i…–ðb/Å’¢˜adž¦M™\¶©£šYå ÏÇ2ûÊ«ž³e†Ij;-‹Ëñº¨-Ó‹Ô¶®iKkF΄1úlvµ%•1ãÚðUM<kƒÊä4©‚–Àb®%¹‘i{šG?M¯Õ\ù`Cìt÷t­dÊÍdbYZˆOSÕÔ=²üþÔ5½Ĭ•0YÄìjèH3JkÌ:Y™aDyÊ*l~°\¿V+8õÄfíjAƒ“Qrd,L ÊHVÑÐÂsñ¬x‚K°÷V`¬Y¡†E˜Ñ¯1‹Ù-Zï³b»B+ø`âËQ8:ŠøÄX! ÀjTZ["¢—cõ§ !Û]ìÛªXlüèö'¬t –ˆ¬:¦cq˜M+ ¡^À&²[E MÛ§¿ªQÀécÓ_µ2Äœ]«ÞL:ùÌXPlÔ:ZˆYf«ñé´64z5öëZo"ް& ÄKÇÆ¢ùWsÍVÙ=œ>+~iVýäÜXjJèo‹½ßãhµÌJD³67e®¬Þbän¿@ë¹Úmc¢ccÙ‰¬ÕeV…õÖ¬p ļ(Ÿ Ć˜jˆí+R1‚ÍEø¼K­›€þ[«á|¨©ÍbœøÙãä°Ê»"z 69¶"¬àÿ :|¸|MŽ-¿E²@½å”+¶Á±åž”–Pï[=ÕúlF>Q{~d@ÔG¬$‰úlrlySJ¶(oÓå…ûäØ\Fì(ëÆÈemùäØ\Æ!)KÔx&eûìØ\êÆW)»Á(-eÇøìØÜU Å”mg¼™²5}tln_ãß”-nb|vlš £úsbl br|xlZ%cËeÌ£bÝ|Vl@#0¥‰TŠS1¢>(6 ­1¥Ò™ª˜k#\“î“cÓìq« Fî*LJÀÊc$±r ‘¬UÆ5+Ç™ñÑÊ‘§”µr*«-N#¾•³ÕÈqyü:.ÏgãØåî4¼<æAÓK7Ài|é*8Õ/¼ g¦ÃáŒÁðIœT˜n‹Óµqrbº?N`LÉIŽéF92]-ãJ¦7ætÊpØœq™>³2Óïsæfú†FîL÷ÑéŸéb:E4½Pc‘¦£êDÓtfŒš¯VÓ'vRk¸ÍNzMÏÚy±ÿ?c’ìÊ’ä¢ó\Å]AÍ{_Gn¢uö?ý¨P2ò‹Ô(ââÑýÞ˜i}‹:›]ôZñbà&ÌK7©€˜¼Išì›ŒBt`å" '+©8™‹ˆÇÉnDNN$s²$‘œ“I‰dKdé$d"T'gé:iˆÙIýDÞNz(‚·HQÀ“cŠ&žYºhö•Å‹†Ÿ,_TýTDçOµ@”ÿT4ªƒFR™ÐxAªApCS ©h’!uM;¤–¢‰ˆÔ[45‘šŒ&+\¶ÑðE*;ÐHõGC©iÐ#U$ ƒ¤Ò¤y‘T£4S’Š•æNRÕÒlJ*_š_IuL3.© i&E6Íʤ§yšë4sãzžÆrRòëÉT5ܓʡ€ª²¨ù T5C”ꤦŒRÁÔ RªœVJ%´ç™R,ÕÈS ª‹rÍU“S)ËjºÊ…[ `¥¶«!­Ô5Ç•qz¥Š¬i°Tš51æb´†ÊR¯ÖàYjÚNKÝ[ók.kÄ-ÕsÁ¥Â®Q¹Tá5N—J½FîRÍï©<×û5·—–€fûÒ6Ðø_: L÷Ac„êOhÐ0 #¦Ë¡ÅtB4Ô˜n‰ÓQÑpdº. LgFC–éÞüNÏÿ˜÷œ=Í‹Ë0&³øŸw‘qšy}™g¦ÿcY€ú­÷†*€œ‹£ð¹©ì=Ô}o÷T uqT >WªDÉÑ÷:¦Ú¬‹£ˆ€Xû<§jÏ3•d]lñð±>÷ÔgøHmÅò`ˆÌÂmv[±viaH'B^Ñ’@¬­ÏÈ3‚®]–¤°­„D+è<±¿CׂæTl‘ö… ,¬A g}¦ÿÒçju†¦$Ø+ÃR´Hx­ÕA5æºP-æaO ~”ó5DA(µ|Ná;‚X\d‘Tõ j+ïC£ÄÞ#ßȺ†ÖÉzoÝíGê*¦¸5Sì|bYŠ-¿û^¡ƒÊ>åYì²b J+—LË¼Ð­å³ )[¼H-fEE ! ÊÐ+èš3ö’±.MùÍœC»†ž4ï9ômd[c œõnW½d’É¡ùÍ;”tä–c±Š)_C‡RÉ×14{ìËcYŸõ®r·ôÏz?Ü=¢´À˜z§‚]¬2D9e¾tR"*+«5ÔŠìFdA#:­{ˆ-†ÓÛF²ó‘µ“XT|Ò¥¯D¹d~i0ÙsÉ:MP¾§–Óz®þ¥Ò{¢½µ§$ e (ËFQSù9‡´ÔBô\ºL-?e»)KTÑŸ‘Œ]¬–d®lr%,Š's)–RÖ©Š—OjZëÙûõâ–-·¬ÊE[.^,)w-ÄÊkEÜË~_Öÿ¢KO#°õ,ºEGŒnc Ò[jÌþcV#£GÙg*–Qa™k¦4Íì—fÝ3ÚémSFl¥¨vèû|>åî.5Û·Y‡mÝ2Å–V‘kȹÙoΊo”a¦ŸDá(ÃLót ÇÑkð3Ååì´'õ9šñ½Ç¨+¿5 à}¶!tg‹A‹áQ‡yzyt7\Ó]R´ˆ—êžýã‚N?Ç}h÷•«ä3]Ïaiù¥H_HªJ'ˆ¬ÈegJóžaEõæýš„Dxc§|´K·MÄé\¹ ýÃu{#»®ÅA‡ºÈ(®{§IÜð7Œöé’c\7ªBÛl\7?ÓþÀ5t ðIC®›U®¡¹î‘è°ÿ†­'µ %BI-éóB•ëÞÊøÜfß>÷к\wÏpJ“úÓçÌ\ ©A•6Vß÷ÖÑÞ$òy†8'E«ïw8{ƒÜVÀ«» §å}È€®{qÐÀÞÞø÷µ-Ñu/®§Ñ¥ô5…B%IJO@{{ƒ1÷ MÓuãõ;‡î)½X)&#ïÕ†ÖÒO%BµÑ–X¥žöýíäýyùÀZ©uÝŸ§©¹Ò·møv³Š0Ta×ý©~+Çá]ºmzú©%|XyŠE¥–ßD¬dKAưòþЖׂ¸xõ$šKÛg}w¶¶ò¶ç§âU ô®ûCfßtîþPá;2¿Dð*H ˜}ºíÜ ¢â³ =a"û&ð™²ÄëzŸ:HÒÅDÖP7¦‹/®=´„_O*ÉDÖR&@ n‰-!»OÌocƒÈ«lÅ,ëL€¿Ò¾ÝD†8tɬïC@š•³mÒ d{†õ"eóRÕD¨œm“n [nÅk¸áÅ&‚¥/Ý0E~÷!®Mä>‡7¼ˆ1é²?CÈ›ÿ–ľ‰¬)¾®·å¡%N„Fì'r¯éÓ ä܆>ù² Ø¿lº O°z!k¨¥YÓ¬z÷ï;4× ™ºìDž©Ý^Èw'@ÝøV€/`Ÿ^Ý@¨/!ùBî!6_Èa¯nþsrõ…¬¡h?6ë6 ]üœFÚùù;vëöw‘¾¯dúó›ìÖíŸ-¹_™6ȵ{rSúúÊW ÷@Þ¾Möêö”…ï¶]üDį[̾€óëÙ‹_·žOû2ø¶uƒŸó8vë]°„ßÛDøŠc·Þ;ÛMøÝ´%…ßßXvë·µ…—Û_x©ˆe·–ÛhxɱՆ—¥Xvké²c‡V7{zxŒ?·ÖHYƒxµ{ˆ—ÚØsOd_cŶO‰u{™xáawï ¶DñöaÛo1ñëî]Èî+Þ¨ìÐâÍlØs÷~'£o‰¶‚ñ¶9ì¹{köܽýÚtÆ[ôðçîmÜæ5Úéíoã``¸qwÀ`ŸöÒqà1ܸ;8±'ûö8ȱ·¡aÐÝÁ’=‚PÙGÈA×°ãî¸LvDÝìXäðnøqwhç#E‰6Griómš¶Xr0j&¬vjRHkïm½¶{r`lK(ÇÎvßVxýÆ ¾Cp›O9L×vGòö°r¬_&WNì‚¥|!6ÛJ)l¦å´Ãf[NM⪭ôŦ]Nqìëå,HÎ_ʓ⫭TÊöaN·l1æ”,†ØJÛlUæÔÎvfNÿìxæ1žØJ#ß8Áwªiw5§£ñ³VÊj—6§µvrsêk·7§Ç±šV m×8§Ùv–s*nó9eëq€V>/;§ü6¹sYÀFx.Ä_Yåê¹!Ï=)l˧BFŒûT숹Ÿ "1TÍÄ*«ÄEP¥—8 ª<7B•pâX¨2O\ U Šó¡ÊEqGTI)Š*;ÅcQ¥©ø0ª|«F•¸âæ¨2XU)³)¤ŠiñTÁ-Þ’*ÊÅR…»xTª¸KÕÿluÙåÁ˜aª‚ÃLUcª©JdŒ7U­Œ9§*š1ðTÕ3&ŸªŒÆTÕÓx…ªÂ?QUaã9ªJm|IUÍw©*¾ñ7UU8¨ªÇ&UÕåX©ª·UU©ãȪJv\[U펳«*âqUÕ<±ª¬ÇD¶‹ï±™íò|œh»€³ZÕøchÛm€xÞªS_\u⫎Cüu») ^õ-bÓ«Ö†|ÕýˆÙ¯:$1V%¦Áê´ÄXXݘ˜«cƒbuubb¬ÎO|ŽÕв:HñKî&S,•Õ‡Ší²zU±fV?+öÍêyÅâY}±Ø@«wf§hõÖì%­ö[ì¦Õ¢‹%µÚx±­V«/ÎÖjÆýZ-Ã8d««hmõã³­Þd¼¸Õ¿Œ_·zœñôV4¶ßÝ'ÆàÙÛ<¼û­‘Yý•Ö.۶ç¼[»ÃËÜ~õö;ïñðDï6òðM·a½½Õ»=ü×»e=<ÚíXo÷n}¯÷ŒÞŸ/·zÛÅw{}8Êw þ i·z!q«_ ù'ÍêKh¿þýÿþ~ þò¸Çøìѧ~Ícäÿ ²¶n…ë ÿûóÇþb à¿þómøÇ¿?ôõ{öý©¿xø°ßóð°ïOýÅ_Á‡ýž‡‡}ê/^>ì÷<<ìûS1ða¿çÁa?Ÿú‹?…>õ_çáaߟú‹†û=ûþÔ_Œ7|Øïyê°¯OýÅâ#‡ýœ‡‡}ê/~">ì÷<<ìûS1/ña¿çáaߟú‹uŠû=ûþÔ_|Z|ØïyxØ÷§þâ ãÃ~ÏÃþ?õö{öý©¿¸Ýø°ßóà°ŸOýÅZGŸú¯óð°ïOýÅÆÇ‡ýž‡‡}ê/&B>ì÷<<ìûS1,òa¿çáaߟú‹9’û=ûþÔ_œ˜|Øïyê°¯OýÅ*‡ýœ‡‡}ê/¦S>ì÷<<ìûSq·òa¿çáaߟú‹¹–û=ûþÔ_Œ¼|ØïypØÏ§þâ"¦Oý×yxØ÷§þbXæÃ~ÏÃþ?õ¿4ö{öý©?[³ù¨ßÓð¨¯ýÅÎGýœ…}è/–t>ê÷4<ìûS¶ÃóQ¿§áQ_ú‹Ÿú9 úþПí}ÐïYê¨ù¡?Ûæ ï“ð˜¯ÏüÅšÑýœý|èÏ”úÐ…G}}è/æœ>êç,<èûC±VõQ¿§áaߟúû4khæÃ~ÏÃþ?õ÷?)zó;þž‡‡}êï.øœóKþž‡‡}êïг¹®ù%ÏÃþ?õ÷?èÚ¼×ük¿çáaߟúû¶bîqkÿë<<ìûS‰BsØïyp˜#SHÈ|žÿ3z]0}ÿ/ħZ0QKü‚)éþ|¤lÎ÷(MjL@ªù”¦ÊJÝc¥„1€ýùz™¬u7€ªh!À­0h@Ê…Z1@+-(¹Æü»D óïV’ ЕZè2€ô3 H‚S€…<´>¨ÉŒZ©‰žšª‰²¶«ÉÃȬiÕ °ä­ié$¯)û:p€6 ©b­wì·f²ÿÝÂËþ·Ô›XÚ€¤¤ HÚ€t­ HÛ€D¶ H«Û€¿|¾ïõÇ HÅ\€¥Ð HNÝ€TÙ HÚÝ€â HgÞ€ì H߀Ôô H“¿HûøŒØ_@€ Øÿ@€]È‹Aÿ¶ÃƒE°Õ„yX°†9lQ‡9€H€ö'1 ßòS1 £ò1  Ðs6z&%@OG …æürÎ/¹ë\«ÑÛ?žù äÒ3ô`ÿò¯Ûízžª€ßû…@jë9Ï*ª9®*Ù[Ø7ˆ¤¼ƒHU:ˆô—Ò5M#V"Aà ’é "ÉÝ RÏ "Ü R´ "µÚ Ò "MY!‘‡5“%!±o(#m%¥Ç JHŒ®„Ø/K@\·„ØÎK@\ÁîbBìQ& VgBb™&$ÖkBâé&$ÞpFì1'$VuBâx'$Æy û=!qñ7@!qoB!ñ8¯D!ñ\ïF!±€ldXI±#¥8[ ‰C¦8m ‰a§ø~ ‰}¨¸ ‰›©¸¢62&Æ„dòLH&Ø„dΈÆéd(OˆgûxfP@&…x€Q@Æ ó•BžùDŽ1O!™’9T!ñ8âIÙ Á5âQ^#ž6âéc!™i6âai#žÝ6âYr#l7âÙ|#%0b¥#xú¿Þ=Œ9lÛWkOÿz¾O+•ÁÓÿµp*mûNæÖöa~ò$ÿGæÖÉ:JåP©Ü*• ЩÜ*•@¥r¨Tn•Ê  R¹T*7€Jå&ÀTn•Ê  R¹Ê  R¹T*7¦rãßLåÆ¿+•@¥r¨Tn•Ê  R¹ÊM ºê*•@¥r¨Tn•Ê  R¹T*7€JåP©Ü*• ЩÜ*•@¥r¨Tn•ÊM€©Ü*•S¹ño¦rãßLåÆ¿+• ЩÜ*•@¥r¨Tn•Ê  R¹T*7€Jå&ðù¾Ê  R¹Ê  R¹T*7€JåP©Ü*•@¥r¨Tn•Ê  R9JåðÿèT.@§r:• Щ\€JåòïNåt* S¹ÊP* S¹ÊèT.@§r¨T.@§r:• Щ\€Nåt*g@©\€Nåt* S¹ÊèT.@§r:•@¥r:•  =î¿ÐM¿pÒ¿öňÕßÈÓN5Aîë;Ø>W“Ù‚ˆ÷D|¤ âb ¤ùdADo "º]±ÿ¼k›VD|Å "BÅ2ˆ¨šAD "2i‘TƒˆìD Ú|¾nŽé¼š%@\ã ¢,õ9ˆHÕADÎ"ŽwqŃˆrnÄÌõ "À³>ˆúùüÜÏ ÑÜAÍ/ÑDÍSÑX†wÑ”HÍšÑÌJ} ð]5ñ Î@zh$ˆ&‚‚h°(ˆæ“ŒxÎ)ˆæ¥‚hî*ˆÆ·‚h ,ˆ¦É‚h(-ˆ¦Ý‚hh.ˆfïòù¹3 ¢‰Â šL ¢™Ç š ¢Ì ß?AázÂ4€Ux6ˆæhƒhÐ$ˆæ|ÒÄA4‰D3ÎA4=DSÙA4îDÓçÉ€4 DÃùA¤.DÊ A¤xäx~ e^€íùüÊ6¼_·jà ð|ZárêÈôî÷÷%jÿ•Êë?Ûÿ—dÏÅÐ*†Q14ˆŠ¡AT ¢bhû±Åž›ÑÁSHlØŒØ͈=ËŒØ̈­ÄŒØÌˆí½ŒØºËˆM¸ŒØ`«‘á•%$FXBbi%$vUF>_w|ØJ ‰g”B ˆÙ“Û6 ˆ%S#ÃnIˆ½”Ä'IH<„ÄßHH¬Š„ćȈ=†„Ä?HH¼„Äù§‘áê#$–=BbÇ#$V;Bb¤#$&9Bâ€#$î6Bb]#$¾4 Ï#6”³!1‚“!1pw!q^W!qL;”F†±‰˜–‰!‰Ø‘—ˆ€ø„±ˆ»yˆU‡ÛpˆÉF#Ã.CÈ3ŸÈas!$ŽBbG!$ÆBbaÄþBâí $6 Bb¸ÐȰO'!ñ'Û!ó¹|!–Ù\!.†q1Ô{œ‹¡AT 5âb¨Cÿ/ÆJíAéyY¸êPßøé_èç_çjО©aȉԸáDj p"5œ7‘˜›H¾M¤ÆØ&RiéÙ²‰ÔàX€ ¤Ç»ÒƒZé)¬ô<Õ@zZj = 5žiHÏ+ ¤g‘‚hÎh =14šg}Ðs<é!ôÎ@zºf ='3‚H¸ñøÊ@z4e =v2ž)HŒ ¤‡A&ò~ßq ¤4ÒéØÕÈÿþ§~ÿþÿ‡¯ÿûúÔŸ_ÒqØÏyú°ù©?¿Éó°ïóÔa_ŸúÓë>Žú9M5?ô§%aô}’:f~æÏÓø9æûuÌüÌ_FÇsÐ÷IxÐ÷‡þ2‰í£~OS‡}}ê/Ñ9ìçõÙáösž:ìëS8Îa?ç©Ã¾>õ1åösž:ìëSQnÎa?çéÃÞ¯¥Î2Ñã°÷¿–ºŸOýE“:‡ýœ§ûúÔ_įsØÏyê°¯OýEi;‡ýœçÿùêÝQ÷àTïç?ë ‚ÉÚEC‰ô¬íÞ—í¨êT!ük˜Ëû3¬_dÔv—(6ÜH˜Þ[PÆ5f¶ïU Ϥí¾÷@8ÊùówMiCèœÃ»Dº=h»oUģšq«¢þúV­ÆÌÙî[ŸAÅ8¨¡vŠ>œñ”í®ùtˆÆöy9öþ–í¶Ò2b+ ÈÁî[#ì/ì(—’… äkÀv_¬w¢Ð¿Îþ‹;‚ö> k9¯…!ÿöÖ±5õ \ÍÕÞ[/õ(Ôó4á9ú3üdª~ý²TžÉÚí­4[ëÎÑÓ‡ÈÝc´É`­´¥€<| ·Ö£7 ã¿í©ÆFæjÕƒ"BûD^¾’*°£fÃÇokù—ÌÙnÝå@kÝ]y"¡ôSäoZ+}ÙnW´rôdkÅJØ‘‡|ëf[¦lA"P5.|‡ÀXª™¬íè/èÛ­á!¶ú2=ØZħ«–µÏˆí¶Õ;t|®~϶~¸ ·zÕgVõ3a»u#æ"/7£­Es­Ä¯¤èÖ×|íz«„º5'ƒæ(ik rWÏÒºëʼíjev(°už«ºÆÇ^ZÕ0+ÀÓ¶«ûù –íÜ!Ìs6ò6À Zfmñsù+©GÂÓlÕà§)3浪Y“QÛÕïÌq}Ø„ ¿t5Ç¡V æl?¤ú´ÊG&o?-ÐoÎç®û ÓHŸ¦cdðös6B%nüm>è[­ @È´}ÍÜBÛÀÛK1[iœ¯Ýé#’> ¹0H[Ÿ·=ƒûyõ² @ 5öO´ävvŸ®ÿìs÷ó6íâ„ß_!½yœ?ÛFÇ ó·«[X¬}{ Ÿ`*´¢¥õV#󄈞*ìi¼GžÆý<­ÃVŽÁ€ÜÅ¥ïÜW=®nÁ5í%šµÕ·Ó|îî,‹ÈC³Ú·ñîŸí™UÈÏkŒ=øBokUË+[9ïâ&ŒEðw®§(+žÖ…á/æ‰r;þ ä¹ê#WÍ·¸opލB¬…žÇw¡RÃ5 N#ð’"e­€‹Î(iöÁ ¯D~ø{#Ø£ÜÒðò—ú‰èycü›¯éÝŸ ®ÏþŸµ­Ño[hMïUŸ¹þAM­ÚF¥G»F—–É÷¹ÛÕK#ËTâW»`CÆ£>mwäü4Û äŒÊ¯é¢úöûï%ò!²óº¤ÿzÁ}êºþ!Eêƒ.öÁ:,73jßiÑâß°x‚þÒùfXú¥Ìuý™Š ATÜ·B^ölÒÖ‚’Â|¼Ez?lôm&J :Ÿiý‚¸}îdrqA»è[‰fðõŸ—ýQµÏ™öðµUãó¥Hxt28zíëxqÛ?G ê½k U­Cw¿xÌέÄ/Uäv!ï‘Æ3ô4T'éBà„Ó &y××yiˆ•æ4^s,ÿ…ð¥¹þ=0çy…`!I-!DPÏ»Ìrþ=íØê˜w×-n`uBŲ¼ê€àðzªG¡þ}Ž.8t/ˆr­¼È¡>þzW#09J§‚GÈQŸ9¹†'ºê‚îÅKM7¿ày·©“Æå)¢@‹ ÷·Þ) ë-ø«x¼»’5»ïÐÇ+V ø éÒá_‚ZÝQ›v¹d©®«XÓȲÝÿ ´ZÝvx1Ÿmo¯5 X°Òëò¾Û?ŠÖ“'s\‰u´,|á–¶ÿP€Ô5†Tèýïù´*¼Š¡ \È ïíÜÓ®Z9Žz´ o[î@ÀÓ ­þ(X‚Ü´€fpwë\ØB<¸¸ƒÜÿ¨ÙÛç]<O-©ð;9 r ëA?È(pö—)ëÊð€à¹‘Ûçúw#©×Ÿ†í[@ðÞ´ˆ<…à,çGïØQ7:,"×ý¤ÆkÓQ`õBj´˜ @°…)AdÿwãUzv S,íBL¦rts]§¡Oð×_2ßÂß »o¿ñj ÿ(S2üÑÁæRàâpbà0´ ]c°0ŸmÜ Eßç¸SavôÍ$OóÞÇý¾ž³:õL„ü¡çæbô6Ÿ- ½àôó‚H?¢„ýXã!¾®K›s?èáèe%46^˜ë¼ç¥ ÏDïukÓgð|\T„<Æû.ŠÞñº&Z°påùh9ÁZ¾ŠÖ.Ý»V%\ Ë÷;V¥PZzáºè­¡Õk6ïâ¸hý ëEkä…X¾¿ —QF1Û>VÚc´yúrÕ‚9-êqšÓÂ:6‡8Öi‰«6™Pn´ÅO›Uô´¡…–Ó{žlø´)ƨOûfx;µ³ÆîO{o,µ?›Ù£-<¾‚Úæã=¨P ì… ñ0THŸCEf)0‰[¢‚—8**À‰ë¢‚ óŠ'Å»Q±Tün…{¤,6‘ Ûb%©ÐÎü$E1¤T„hÏJ‘¡0)ÐŒõeÇ¢1ÇT´Mųá=)æ§Ââ˜u*t.n”Bë˜}*üŽ!¨Bôð§ÆÛVT‘~œG• ÄTCHWÈ(âpªŒ#.¨ÊJBÊêÄ%fªÚÄoUÉOâɬêH|›UA±µ³Š,qV!&Ñ*Ö„|§‚Nœ¦Uô‰µ Cq¬®ÒQ<­U\ŠïuןbݪüTĊö ]qáV-L>ݪ–ÅÉ[µ˜}«êCpUæB'TõξâªïÅz\%ÀØ“«F sÕír®RcŒÐUŽŒYºJ–1TWY3¦ë]ù ÛQµÑX·«~{wÕXã¯:l\âU«“|—sí5¯‚oìèUŽc}×cj¯ÒrŒïU~rp¨D%j ΨŒ gWºÑ¹ÏQ ßiñt¤\¾×xs ê0¼«|JEw M¨0Áâ¾â]¼RëŽ ü;$Ö«=ÓMŒ‡TܤFZ›ÔLØÝ„ê~{;Œ;Õ“²ßk´-àâW‰…Z@Îê[tûHvj‘ tŸ³²³tV˾=½ˆ©äf_¯;6ú vS'´Y5~€ÔÏìÞêCuÿˆH}›î1íîòtŠÀ*öƶgt³vö¶Ññ²Žs4Å€ÓV}38%Ö›©ÞŠ2ÔR!n·èvW˜ÔÅÃtyíÓêô©•YÝ@ ÇsŒ†!ÊÌÔS²©¾#þ[Ý›Ä`ÑSÒÞÝ¿Ü7{Ýá$ðÙFtç(Þ1¥@Úš¸z©ª‹ÜíV 7iñÚòð…VÛ¶.É3Z»;#Åc´Ü ÓÔ"Rá“ÚÈD˜Â«Õ ¤Þ"µ£‰ðQËHIÔÖ&²Fç@Õ‚º9N šÈÝ?'rÔGªÇ^È1¯ƒüo4¢Ú5î2œ¸ÆžUôÔÕ´kJˆ÷ì€z^™óÂ?%Û8ÖGöi„…Ì béöa䘮qØªÍØ!´Ñ‡iÜ …qZ²É4êcxéÛ=Lã€ìç4»Ë¦xÌ@^[ÙòÉ2@ý%Yƹ¿,〜üz²ŒBš€-ã€`c#™t;;‡e\!+–q7$ï¡|—ÉNÝh=Ø2Žšõ¶Œr•Cœ&D¯*œÄ3ŽÈ5=〰{šIS `HØ4ây›Æد9°z­j±Ø4ŽMØdG‚ˆ=õŠ¢ïaÓ8"èVÚ4n =9k@¦q9Lãòw<€ëï"Ó¸|_™Æå7y×?[¦q¹4í—«÷ŒûRWX®q¹ rËò\±ï¦lã|Çmç§"óÉzpdçg˶q~þ2æ¬gÔ¶q~Žmçg=ãÒzl§WÆ®qz©2t­÷Φq~7mç÷7ÃÛzÇm§UÀžq^(2Þk‰-ã¼ÜØ2ÎKRFɵlÙ2ÎK›=ã¼üe$]+¤<㼈Ú3Î m&ÛµÛ3Î ¶Mã`£ÄN¶Mã€ðÉÉÌ<žè÷®qø¦äߨ5ÈE×=ÏÞ_U ‰m~ÍQ&qmä¦1šgøái޲lãð Ú6lë:Ê‘¸cŒØÆ!aöq÷]’¯Q¸ûá²kܤ'ÛÆa×4ʈÁ°mÜ tú«É609̶³Þ¢mãîû.’Žm〠íì.hÛ6vU÷tã½>¾$ÐìÚŽ¸Æ8Žs¸ÆÝh§Ëž•°Ö€ëc×8´>¨ÿhÛ8 dNXâ9ÊP®q–™´kÜ% /£]ã€ÔU—ÎÄs÷ý•mÜM¯{ØÆÑ^ @«U° Û¸ûåª׸î–÷15/°©–I\Ó,”Y¶q÷{²(Û8>ðuˆ¤4ðððÙ7ͧneòã+°¯!Éñ|z±oœE;í‡×dÛŸøÆñ½áWäÀÇáMª+#㸌Ÿmj†ðÝZï0޳„¨ãК#ÂÆq@Pu‰ Ãþ-Ç!…ÈÆq…SŽ¡jä¦S›Œã¬hjã8¾¥üé2ŽÃ[ºÓOz)ÏöÂÆq–JµqlÅøÚ8Ž£X̬Ă( }r޳«ãðj×c!J^ÛcÇ¡ùJ*œã,í*ã8¾Æ|Rd‡¾ïCïIÇ 7Œ®iŒã¬3dã8 lt jã8GyË5sÐjE6Ž{îÏ>Ç>Œã¬šôÀ’’ Þõ‡n`2޳ ’ãð®#áŒqÞ틟‘qœÕ”l䥘Œã`EvíÓ8îo+ šdg™&ÇáuGeã¸÷S2Xö³Ö“}ãÞOe‡ñƒÙçKçç¥$Åô³ˆ”|ãðÂSEÉÆq˜D@Êã8KQÙ8îÅ÷*Cº6Žsã O–Œã¬heã¸wo3&ùÆáõFE&ZE°"Û˹­ãD eÙ6îEõ‰7X¶qxßo:8É6Îr[¶{YüÛ‡m{ºÆY´Ë®q/"Ÿò£k×8°p.štÉ5ÎÚ_v{¸ÆáÅÝ·©ÒVоöágQ1»ÆáåÞøŠÈ5o.ÒýØÆQ—Ìžq/ö‚Ï1LãÞ²égœ•Íb‡7ðü2ÀÂöe'´˜Æ¦uLÓ8¾]_¦q’Y³i_œ}šÆ}zÀ8¦qk‹iù/Ó8<‡ç—iœ4ßbk²ýË4·Uq¥ÍÀýe'1¹˜ÆÑ¿lšÆá÷m_¦q’¤‹iΗi™ƒ_¦qR¶‹iˆÛ0[Là Ó8ËãÙ4ŽTÈmšÆ‘R¹MÓ8«ìÙ4nQulšÆâ9ã¬Ô'Ç82MeÚöiänÓ;ÙJïÏŽq$Ï–+š<ƒA°½‡cœUíGbñ9ãˆ\÷ÒâƒvŒ#{ûšŽq$¯ég C;Æqrá>‡cÜZèXÃ8+!Ú0n­c³µ[½Bë8lÛvõgÚ“R†qkòÓkøµ°sÆ2ΪŒ¶Œ[ ©õ´Œ[ —àúFJÜq ÷‡ÂžÙlz'ä²Á^ÿ­ûí¡¯ƒðùëû¶ÐäøMÏ[ï|~7#Ö¯k#?Ø\¿w\ѺÆpÞžwAª—¹SSófÐ]¨ÞÒ™y&6DrÏ|n¶õÔz¤ô7óøm¨ ïã ݶ¶ŸôCÜžyÎ7s¶ù.lû]Û–ß)ú•ÚЄ9ç[·aSÙçk)=ѼºVé}¾Þ¶¶{.’%Í2™÷Zz%Ù˜5e©‘´iV£m©¹bm÷ÝŸZÕ¤š•o»ßú2^Y‘>ç *¡Õ,²DÞ¹oRß¹X£ø½sA—‚kýííÛë\×67 ÁfƒÙÙÒŸ›Ð¾¶Þr´QIOÖ{Ù¾ÞÞYµÝíÛªõÆ[¢Ti³k¢ ±Ïuß?sç•°mvgt¾ö{º¾¢íV;xoòÖÇy,›€çô—E“r_Ó‚V2»±©Eks;¦•-ú¡Û6ínÑyå“dK\é÷Æ6w¿dõ+k]ô…é@jû]ÉÇ¢í«’²”ïÃÖ³YM8vÀè‘óY·e0Úiõ}d+,QâX£¿Mwb´ð·‰.´òŽkºKì8NÈÇg•é²Ì’8×4T–drL—”|Ö4fF‡²L—µDJyÙöΠ?|@('ÞÓ$úØÚžÕFÒtŽÙô±õÊ`Cjr:ŽáY-YèØZƒR§Ñî‰?zôÚ=aZ¦ÚB[zÓ±Ù>Žë?ïtâ>Î’½Ž[w‹VÇЛëéùMÎÌ5}ÁÚF†wxKaÇ^üÀê63I"ÜåR.=í™HÉgκлgòdCtP‡Þé™.Ë%ÛªÏÉië8¯ƒH@÷x»³=0wY9ÅåýxßÄž´†szŃú°ÓN^Q±œíêÚ¦-ýù9éâëúós—}¼ííå=åJ‘gÕŽu.tâFEdàqΪ ô]Y¡xå5µ`×¹è ­°\ÅY'šû¨ô,PRXfR5h¡S1¢t浪¥ÚÑqå‰KZ]œ²1—ëW T»}Ö¸X4U+ë:Ø:÷š­r­ŒÍÄc”ÓªOxŽ’‘g–ålVu»u‚^qŽÂ‘w Þ.0 QÉuÈsâ:ê¨ÌÈ% ¥ªD²EÉÚ³ª•lQ~Î4  ,åš§mÎ\]d@Þ£vJ€ª«ë<¹¤»@¤ÜGv1ÅZªê¸ ìK¼f®õÙö”ƒÙ@ÝFÁ˜À³¢2;ªDTw^g…©Maå^õk»»¹ÆM·ÉuðBf­|`ö½£ž¾ÀcÕ[5w"׬Ë/QyÑU»'Âë§úþ: £@EE· ˆ¼£“°@fãýU·¡zÇçèHÁ» ¦¯¾ÆCŽ•põ>ˆ°o þH9¸‡Â¦4ŽrŸ…[CêÅyg¿†Þ Ÿsôtl¼ç¾ÔîÝúB6Ÿ‡ßG=&öÄït¡êß÷hTU×üͬú ž 7¼ˆà¹pSŒJËnœ-‘?÷h®ÁÂåþ‘ý=:"×5ÚxDØ’S«o¨„n£HdCl¥í~oªá¦ñH„J½I"hA¸IÆ^G÷8 yF”[®ê•A%ÙýÔ/ħ9§jt‘öѹ-äÝ]"l?«Lä]âBžÑI^ç]뤻ÍDÖ‘†t×èY!»@}íBîÑû.äýq"ûh¡0Ûì…£¤»õ8æygÓßéx¿¾‰Xù¶bä‰}_Ý…\Ç«¾vû¼+¼¾âBäˆ/‘û$NEî¥x¾ßæfø™0Ã(_ÀÇO)bŠø 5›ÄO±'~ÒÍJñÛ`æŠß³[üV™£Ï¿›¦Ñøý5ÕÆï¸é8^ÄØñRaN—ó~¼ä˜äeÉô!/]¦yy3 ÉK ©JZ$Efò2z&vê¥Öœ¨/¤7î^²›[5–uDg7<:–:÷ö*òÇÛ¶Ƈ·"~É¡{+"Ù[ZRdÖ–fÉtïzˆ‹ß¹1žleÎÍÓªêÚ_A,ÖU¯-ÈÇ›2^# ¯{+GBp¯¹ÝƒYܱo‡gwØ€Ô£#Ý- ×Þc‡pwˆrÄ=ÃdB½©t¨ƒô©¯{‡C–}wÈt¸ü¤°ê8•ÚwäeexÇf˜TØ |ã¤ÂWˆgñxE ÷ Û"Ç:l­wæØ¿‚MP; ê€”io=%´"Yî/×q­Téú›„¨# ï`©#h)×;È>8e"äC䣥ƒu«Û; GÙ ×ãŽøQYè ’”#úÆuâ`I|å¬atnQéÆz‡îŪùNcÀ5îÓtªƒ"K‡w a‚à€{°'vꤊtäF*ñÚoåÍJÎ,ÇïtäÎR:ÉCí¨ÙNQqêX©“E‹ø;¡Dª’`%ûyjSìÄÔBÿN^AÊ?Œ`…+¿3N‚QIëßÕ‰²íœLƒ¤Ü/y'ܨÚu}¥“rpÍ;ÿïÄݦÎíAåîTú v] •@N~¾Êv"p©…È. u5Åʪ+U½b_w_Š.iĽ@eµ/åÍrFU´‹Z- äó_ ,j3hgiV[û–i¨Ïµ>w)'> ]íY;&p õþù¨ØS%#Vzk¨ªËÕȳf }ª8E䞬2¨Èµ@©î/ÓV×Û«j|×ÊÖöèrV9Õê.`µ6«ÞõÇ«,GdõQ,ÝÅû¡«{k{T甉6*FU‰pmOÿwÖ×ö(ûËöö¨ еH–仢År%«ö]ϺÅÚ.W¶ÛŠH]Ã'Ò¾êük#ëåßð+ß®½Ÿc4 øÏŠ¥ª™@`Í~»=}ƒ«'QýŸºÕ·X”º~íz¤[%Uª~-ªÝ!!Ò}‹vFÒ-‡ê´°ùÔ­µêÆé^PÛ§é]uuˆ|º_ÄÎORñBþ¥iN ¹ ÕX/¤XÕ|/¤šäÕ ÿBØÄÿBVm9O‘æß"]`|›"Ì/\¤ƒù›Š˜0wªãÚìãŠ6åÓ¼ÄE“˜·¡¨óNÝbÜͦdŒÞ´<ÍìOM³?Æ“Õ ‘ñô5‰DOg³LÆãÛL”ñˆ7[e¼ÍhɋҜ—¼JŸç¯Z“fÆëØÄšñÊ6ùf¼ÖMЯ~“xÆòÐ<­Í Ls…ÆÔ|¢±N5çh¬eÍKë]s—ÆšXô¦±l6깯¹ü6“j,ÑͶËx3²ÆR߬­±4³klÍþÛJ3ÄÆÖÓ,²±=5Ñ,;XsÑÆ&Wtµ±6£mì•Ízûi3ã²åŠ=—=¹ vÙ¶ÅÁËÖŽ^¶~qøˆç—B\À„â &§0áŠx‡ iÄMLØ#þbB#q>‰™«©’‰ÂĦL¤&Æe¢9±2ñ‰¹™¨°É ÅÿLp)ŽhâϦ‘&DÓ4a¬Ø¨ uÅXM4,Vk"f1_U‹Ûa·Ø³ËE°Mä.n‚{u“ˆÌ›$¡ù¾É#Ävª!Òp²‹“±ˆ|œ¬Fåd>"1';Ñ9”ÈÐI²D˜N"&Rur5¯“Ήœ”O"y'sÜÉ¥¨âÉ?E'OŽ*ÊyòXÓÒëš¹®lØäv'Ìâ¿;§6EÞy·iôÎÍÍ´Wún2¾3|ö]0©ß•ÿ]Mðp€+ pUÂC®\xÁÕ +¸âWI<ôàJŠ#\mñð„+2°pÕÆC®ìxPÃÕs¸BäW‘<âJ“çFTŒòh‰ëU?qMË#*q‹Ô‹kcuqýÌã0qÔÈŒËpž©Q¥Îc7.æy4'v–=½ãš |\7ô M15&äê£G‰\¡ô´‘­55ä:§‡–\ Õ\“Ë¥ž|:¾G£\põø”‹²±Šé§Æ°\Ûõ¤–Ê¿æŠwhÏ{¹†ì‘0×™=6 R–¹^íñ3×´=¢æº·ÇØbnªQ7×Ï=ç»Gæb’ª±:×ê=zçz¾¦ó⵪>·<äçÖãÙªaAw Ñ" ïu‰Ôy·5´‹äy£…X{ÝCi1²Þ¢’$¯¢è(-ôâ1·Ö9nø:Öc’1R4›Èz»§®Óz®ú¡qº„@/”¨,%_¦HH‘ ÷œCfj!ކ˜¥¨deµªõ-)‚V ¾kh^Éo*ºXd½a=võŠ½Ç—Yç³×Ûa.¹]E¥k!jÆå²’×BÔ ´Öú’±VÔÀÖƒ¥èŠaëpÜ>­C©Ø{á1ùzE›l!þLý2òâ°fZáL&bQA[χ•›(¥-ˆøR_ÍV¦I±BZqMfQe[.¡‘#á6×Ôv“_ZôßÈÛ!Gî¢â¬Š˜ï3¥æd×1º…` B?¬[ˆ«ðuâÙŠ Ž…ïäq<²ç6‰ç-ÄkÁBVâ^CO>u‘è#•n߇Š©t÷—Åì}2ÑŽ lò¢Hdí$Ûw-Øvû3´ ‰lïÐ/\÷Á·cxà‚‘wmCQÖ~–J\Ð^ÛS\7f öi® Õáû¢ŒëÆR¸ áFZ ~yô¸¦ü£Ü#¹n.îCErÝ;¥M‡ûïýèb”$ÿç¬\7Öôi" àsÍK9(F“ŒÁ3Ê™ Èï=͉ïma±‹'‘Ï3D:É2ĵé/»žú—D>×½nþ ®"]Ó#Àµ=Q¹DFs”DÅó²¤D¶wº/CŽù‰¸éºQ8‡þéºÖX8ß‹¯WTT‰ÜÛPZ%ÿñžj¬DÖ>[× ó’}¨º®ûÃØ#†Ò7ß›¡ + ÍèÇùlCcvA?ú½†Q5€çJµ¤c^k¨ÙÙ×ô»¦èôÅ%€«gáÜuاˆk6€u ù]"Ÿ)Ñ»î¹}Ã|TÐçB¿D®ÃRÀü÷ú¶ð~Ù‘‹ž0‘}Høì_Nà/Y»‘.&²†º1M űþ½C%¹ÝO#¤Làs ±å‰È©¼¥m^×Ë­%ºÎDÖ·ã9!]”Ø}HHxö0NG´ó %êE-ðgˆUxö0`I\Œè5‘íÂØDÖöeäþ²lm"÷9D¸‰œß†ð/ç>"æMË‚ßDÖú2–ûE8œÈsqq"÷ú2¨ù:E£|"¥cNJÝÃèþe-!zè…¬¡™Nd Uu²“ßw(¯2ÄÙ >VŠôãu¥l ~X0Ä2K9Elµ”wÄvK¹I¬¹”¿Ä¾ËŽëvøRd°Î”â¦d*FbJ¸b6¦¤,†dJÜbZfÛv›)ÿ‹÷™rÄø£)Œ‡šrÍø¬)›RÖøµÙýÝžnJ}ãû¦ô8ÞpJ¡ãg;x{Ì) ]gë1ªS2o/;»ÃÛîN5Xâ©nÛ<Õb­g»x¹ï©Dƒ>•1bá§RGlþlo+@•Ll¨¢JümoÏAgâK¨N¼ U䉿¡Ýäí¨bQ|UPŠ—¢Íäí¶¨ÂTU¼Ši£ \ñu´»¼½U&³=¤*iq´·¼]&U‘‹¥ªvq«Ta/Ž–1›oÓË.ÚSÄv͌˼l5U„Œõ¦ •±çŒÉ¼,/Ó`5Xb,¬&L̇c>/ƒb5sbb¬†O|ŽÕŠrÜè¿}X*«ùÛåxÑ{À»{X±oVŸ+ϱ¢— ´úevŠVKÍ^Òñ¡—Ý´:s±¤V÷.¶Õ±¡—³µº€q¿V§0Ùq¡om5m³­ždœ¸cA/Ñõ6ãè­þgL¿m@o[ð܈mÞ­Ö‰ÈÞäݲ.åÝÖNæ¶Ÿ·Ûy·‡‡#z·‡kºÝçí¬Þ­èá¾ÞíêáÐnóy»¸w×{8½dóÞ}_ÏÛ.¾{ëÃQ¾ûï_Hû× nõ ªnúö»L~ ¶þQ \-äVO€§Æ,é#„¿”ÞÈ´ªÿÜz¶Î‹ÕäBøKôgîéT€« ˜•(S©v2ÇŠŸBöiT n˜"÷Vó¥­æwׇ܊éS„ßî9ËRûs5ù t½2b®¨áSx†5rñ*,ê½cw‡<¼“6ªRþŸ¦$}®ÞˆÔ‰ïöy—S=ná`áwÁèª\/V¶oÙ©þS3¶eƒq36¸ª Š¦vÙM_=—o§z (Ðh.¿i Š·OÇÁ |ÚiUÿ©ÚBÞúQ{æè¹¾uâÑä,ƒé‹©À0¯§(ÚCäírõiÀé~+-KY×ã•-ßpØš1?¨£gXVÑgsÅìTÿ)2>êTmͰ¶²>[~ÃNõ@Ê?å¾K3ÿ#29ÛvÛ´‚ÞŸƒ•·¡¯wZ×Î^“еãӆđgyWßð³”+ì\½.Fä«a?F´ÏL3_uâÿg:×c],#žO ³aù ·ºãÊ,8‚Æ;~4¿×^ö@®vÞYõÇ{©#‡w\R\ö²‡òVýqt=˜=µ¡ßF)UµÎé\숛$úmö·¾Úo¨î”RªÃ†âûV´3{ÙCV‹+$ç™Gà ç÷;ž>1Ø{šÙc +/¦³’Z"¼ãS|iõ­4Ô¶ºÈ[ÍoØÝ"ZeÅA^œÕZ%h¸‘/ë¬ ·r8'yúÛáZyÍëêG#½Wk Úß9q™b!5£ûû§U Ø–{§ß6¸n‹kú§™{v½G†~·oî9©òõx!凧µÓzÌ»¢\€˜å}†EÈóU <`e‡:;6ú|}ØcII­:ìJ ˜ÊʽÝÁ^ìŒousõ@õ¢þ6r‹žÛ*p€ ÷yÊ…»ú’ò*£ŸÒ“zëß{w`%½TWÀ˜ãGᘅrèÖñ{ÆÂhññÄ]ÆÁ`4¸~J«½%kµ÷|È-û5sÝkà 6½Æ]Q‚gŠ~ ‘ËF¯ÞH°/¦ZmãwðqV5- {€òv £´úƒ6Efø3Ï›Œ Xë±9«¼í,ÄðÚ!§ìƒ`Ûv ¸{“þ Kã,÷‘w?íEˆŒ¶*Ë”­€]öõtŸ îxjÍô3<ª½ÕÝÄÿ[ë߃¿P÷ ÙÐq޲6EÊ_±<QÎh{Å›Þè» Øü÷>›D`å­Î ´jÐ1ØÇ:Ú Âô'è nx“rƒ‚E•”÷²Wƒg›VÞå:y³_Rwû>Y±G¨­A-žM— eø8c-,D pÜF™¡>M+7x€Ðúy»›%¼©èUbÒKëý|š« N.dN_u-vÜÒ·‚K îòçØA»…5ÁZ' 'ˆž{d@n|d×€¶×¹þÝœ4»Á‡Ó‹;‹ÚŸG·T ›|¹:o¹š»ëG„}@¬.o#`âCùj[KȾ#‘ÞÝWUl íǼûùBÔÌ rña§Á¼~­ÎúSnœúë¬[Û’¾ò*jüøYîÑú§£Dí3ãê°‹sŒ ˜n°.2ÚL½àÔ}`§±oÊô–‰ ßKïª!iç%q¨V›ÞñÕûéÜü#mò:]“óÓŠ¶“D§óQð€÷3Ô'…'ú”;r‡%ržºß¹˜eÕ± Ô~Š£¦ðAYoÍ"™à¥( ÑÞ—0HaÇ1c±3žË®…\¦Žò:µìv؇°·ø~ ÍcSô ¢zE˜Tשݺ£PÄܽbu¤ ]³Éé`¬ãÝãí©e…ÄH :¶è 9„>ÖÌ,jOïàHÿ¥Ћ7¨ø9[YcwŒ”¦™Ît>3WcQùHÅQÎÁ¤«¶µÎKàëÛ»Oç.áO*½9®³ÓÌ΀ ’Ó´•$ÁÖ·ÒÊ£BÝT®…ܲV ¥c |®¶$®”í ~ø9ÒºPI•ú©k®ôüÓâ¼(…D†\¹ÒÌЦ|”ŠÇGgîtÈV¾ÊÒ†ýª´—z;ç©ñ±‹¬ìù¨KÓÙuˆ¸ÊÀ1ÜV›®²t uÇ•É[O­+ÙÇŒ\§ª]€ípEù*`Ô®/_ÂVíHÝpÕ'Pî¨ûÝ% Å é*„~ªå¯BÈ·¤Š%(£Ô¦‚ k/åñÜ5 ý·».ƒÿýTfßµ›¦Uß9¨ÅùŽd„îøª‘ŽÍó¨–d[ï¨7é|)IU૊N^žÅ]ÓðyGÕ ¼ðoÛtaWõìø(ËS… HÝmUáÎ{¾£R‡ŸQÏ´Žß§£qUü@ZßÛ ¹ª‚@ %66¯¨­ŽY\÷½æºüˆ‹Q1Œ}±ƒ®gT1¬ªkv¥3¤zUC´w´¬Ž5á­š*Ï=ê®û»d?,§ã·‡}U¾…JSÙ.w@ËèÓæ_uą̂– ¤ì¦åsü(ãTIHß».[©:§|Ž1$Él²«ßÚå¸êã¶}ÖÐñ8Õ :;«Šþ]‹Òcò9~®f¤wE@%V*ús^¸þ”lŽqºìÞJAÔ_àÓ¼Íjut—@Ï÷u'OüóÕí 2»!jä®;&@®k˜ãßÇ9Ú.D¸8ª5ÃW‹ µMŽüoæÏ]ÿþˆpR™ÜõdX¤Cà †,6öß’ ­‘k,Ê4K–L)’ñ2B¾î¶•ƒŒàÝj§åþÖyXQkúGÝÝ”UkŠ~»«†jñU «äX»ˆOd; ©©õ­š½¡…-¸Ý=q¥`ì«Ñû÷š²OYëúœå?ò”ÖíB<þ9ø”Âí’qàÁí|!Н¡õ­‚£uµGàÁŒ(2¹@„­ -õ£^ˆK]ã§£¦Hò‚kI釋wº‘›^¾XEn!kªÿ¹(,C»­æú©WÁcrþ:UH½^”Ú—DfRZÆS£OÃEzþ©&ç›\O~Ù[âþ=ÒgÎo¾¹2êºÚö³ËPѲBB”V 6§~Õ[íSËæa'´µmJ‘ ­P#C PÚPÎX¶û/õ°ÔjîR"Í<êÅ¿«fa{rìÀ•x›©Á!‘ÒºÊÂ]>"øX¿Ÿ–T²Üˆmõà`¬´ýIj{{÷o ¶XÎö/®Û-ñ£tÝ:¨õ. ÉTšYðäù<ÃO z¦ƒ×ÆwÞÂK ¶•?&vjúØlåë…¿°è¸,/v›hc³½-Ø%¨„§–‰"o¥8ljϰ•Öo6Ô¬JJêS@¸`ãôÒÑüƒÏ[HYJWÒª3£RÃK~tŒ†V5[á¼Ç‡‰5írJ¬u·ÐB,§X¼Î<è,Þ¦š‹1æ]T eG*Í/ ¥ um‚|ÞÒ{ÚíùlõË‹½W?¯4 ÞújÎ0NBèºÊ[yÊš§Wºl÷Î’ yze©{W·Þ«ý0,ª†³qÍxŸR5|Ëb ´ÙêVß2Ã…vÛËz<:Ñ»IŠ/'’Ža„7êÇäù5ÒŠqøBÅ+§ŸÔѦL­3wäm¤Ôé¨ûÖwÅ£¥Z\uhvKã®dðÞG* ®ŸíEå‡gÓ4 š=òiß˨ŠÊˆØª|X¿quIïï-ÒU9‘B«VPO«*9…Ðêm}ÊOë{‚ªp·žcIµ)¦þ§¤êèðÕº†Ï§¬°Þ¶Päû6†b’ç° û<}ñÔÒr”x¦¢XɃGõ›Þ"•áy¥|ù²%ô¯Õ1ÚÆóSJÃ@êOIak± Áu~¯BZdí¬UH}D¬5ß¾/½}1«TgÝÚó#‚±ýWY·!‚Öî*¤>²·evFÚ-ô³¤î‰Ù®UHkš^e]ú‘ß‹íW?òÍ\œ^n¤þöy•Áßgé7Ê€õ³dW[¦•…Ô×)š‘š±·ë@Ê´.fà¿Î"ûÕü¥û.sì|›ç(?¿|c°æW¡þñõÃß¶pôµ‘ýj.ß{µõ.ñöÙÚ¯ï‚íW}£¶Oûÿúfn$]Ì.ÿÕz ¶uõ3ß̶8Ë4ž©–ÎcÙaÚ¦ùÑܰ Ÿóñmõâ<à(o|½®ùšH$9¯Ê&ï1_·íЫÔo¤ô˜óÎRýö¯5dT¹íûÍ—ôsV‡­•}³‚PŒó‹Œ¦³ÑÂTg©=k,gP¿ÜæŠ'u묊(wqõÊ ™JnêZ\%¤õú’¼2^£Q}c´ãu\2ÞYë¡ ¹ís?€ $½gH2<ûÊŽ{î=”xÜæþ´¯¹I«<[ •4+ô6ˆòfí_½SJ=›)j¤¼)ÞpQGåAÞ”%¿žJC…ôæNaFÞn{'BÛ‡ˆ‚‹¿W±(õóŽƒÊψB,2ï@eA&‡A”‚Š2rKVÀc‰{EDÚ£±þyÔ=²AãÞ® o›«¶´¾3ÊïsïUðFFžSžeü®ý) ¾Å…¢¾–»oÚCÀ!éÚß}„¬Ôbßð¿uÏ2@û}fXJ…Jޝð±ÍöÌ&þ”ŠrjÕì@!\oÑ,ÅŒRo«:°æúvu`vØ!°c·ØS*¼£nb…s˜J…’ ¿uSÑ&âèÕ; =ö[¹cÖv¬TP Ye÷"h'¸Mû¨¢gV*Àf~±„Pã¼½á:F·[¥ÂxpÍ:îìPŸ2šüoÖªïÈ¥S†øWvVúWßêN<˜v}%'`fõåî&þ•ã€QÕaz§A K}:1ª[ VÓW2CK%\7m¤r2Rwþœ ùhíÞÊëbh©Ü™n_ðÎ÷Û¦ŽCBÖµÿxç™@º”ѹ(²ê®t¾ºkPÙ9mŒ1™ôî—ô ”C™¶-%Îp\h rë˜b*ÿ†Ln[ÒuŽäúÊãwM¿:×ß5Ùêzo]Z‘ÍãéâEb®©ª4„;ûïʽ‘ª^Py¸~hW8öþƒ]un›…J#W k),ºÔ‰»ØBÑe#Ÿ·ŠU´‰§ ;ää5rÙ¾ DqöT ÈõUhêóZ”­»œUå*èe?_%- A°ä…ö¯’XìBU6Û¥®àÒå¾ë]~£'Iýå.Ñ‘XÎ.ãQü«ÔG]ó¯rà®éW— ¡—Þ^v]U¤û¿Qx„z{—†»8I]ø.W²~  •8ãgÚUPõ©PJ¤ ¥UK%ÒÕÕª·î¥l5j²@®.íVÝH[viDȯê/€þ6] ¶—ªjÈêRHýȪDïPZ¹œ t­z•!ëÓ)¥ Þ°­©MEq ýwªn î¿Jë@J©GÕw>oÿâÆG^ç¿”ï tq¸JüDV#eǤޯîð¡m?¹ê&ÔcÜ-ˆ^Ú5¡¬¦D!ÿܶà¿kÑ‘Ùý(ä_$>Ý2);>"uû,Ôw)ÓrpW+^‘ßDÊ[| Õô™§i3¾ñ—ªy4¿M5˜Æn7¾ñ›ªO5wµ²Æ•i3¾qñöÞ s«i6oB»ñåFuómÜÌnÐ.7>?êñù¡Q0Ï•Z…yöÔNÌãÙÇ<ÁjJæ)Wã2/‚š›yWÔõÛ¤i^¸î¢ú•TŸ5o­Z±~±Õ­Í»¯ŽnÖu}³†¨1œuFÍã¬Ej0g½R:KšÕYöÔÌÎʨ†wVOõĽÀªmž5X­õ¬Ój¿g-W‹>ë½ÚøÙÔêϾ!:@öQ²ÿˆV=JÌoc"'d›![¡8Þ-EƒÈ†*ªD6]Ñ)¼1›ráÍÛ´ oð¦n80½Ã¹$Ì q°!úˆã3L²˜…â°ÆL‡>f³8<2ÝÅ!”)1³Ì™q(f^Ã5soÒ™Ÿã°Ï‡†æù8|4È!¦éBŠBE(rœjΑcYó’ìš»ä€Øü&Íæ@9°6OÊÁ·¹TÐÍ·roN–}“¶œ ˜×¥|ÁÔ/§¦‡9í0ƒL™‰IfN^LDs‚c²šs Úœ'™ôæ\ÊÄ8ç[âÎ9#»ÎI› xNìLÒsògŸòC3ý*4Ð ¦Ù‚ÊAM(tšjÒ¡SYíš»Xé°ÉΗM€tNm’¤Ón)š›léôÝ„L§øâlº V§ë&~º–`r¨ë &º&a’©ë桪´aªª«¦³ºBbÊ««(¦ÅºÒbꬫ1¦×ºbc ®«:¦éºòc*¯«Cbûº€$>°kL¦ »eZ±kU¦»žez²k^¦0».f–³kgfB»¾&²´KpæS»LgεKyæe»Ügî¶K‚æw»j( ¸ëŠf‰»öh&¹ë“f›»†ù;nóã‡Öƒ9ôC+™ ï êyÎ9à#?´ }èç2Æ„>e\7&‰d‰æa£Çõç<ÕÖœY’#šÇš>tƒ›“OÐÜzÖœŽ’!Z&¨>tçœSVˆq8µäI,¢eXës0b]ŽDÏ¡/¢e0 ‚€°¹Êð5¢Æx™ìÐ2€†<R#²ŸcÍvhv£È!Fú4GÄç#svCóXõaøäÑ;j.ÂÓHÓy6CÓüÞöù0ªÊˆ GŸgŒÚ M“‚p=ßXw¡µOps0æ¡D›£yp‘L›{áÆ"Í\cþÑþh‘\ð"渣Æ(Io‘G-m‡æqLðPøÔzd³ˆ'Ç딢gF?I*Ùž1JÉ>GH)ÊÉÕ-vh”õ$êzQ$=2«º ‹t=É*ÍÒLº–®é5¦a©}Ê#41Ûò¨ª]ð!¾ÇÜ-™´/²¡¨áöün ³fÄw½œÝcÀ ¢éë£Â’€Í8ñ‚1Œ5r¼à;|®1•,Z.hë¤þã U¶éô”²rf¤¥~›9j29®9k½žç¬3?Ñe┉í…ÈãCÝÍõLIê±pñ<26Nî»GËÉá8§÷bƒýêRÎ;Yë“îë)FT¦á¥lœ‰yò<ÎsLÕÏãš&NKÞçt¾•3Á_DkLù/l¶ç3Mœ¸I>C-@ Ï ÑºÒXÏNÞaëÄ™¬gHH]:òÅü8‡ªé¸iì.†ü-¥ µëÈ-PÞ’ d‡B5‹»CˆÜÜìØC–5qH×Ù¡›C}8gÅ Ƹ×ß!pL‰žU-È(Å úüP%²Ì8FY hAzëšrADpfK Iù?²CD>S™¨mDsi"ë‘Pt_C‰ÈyLƒ( ð«’’Ò‚ãÎ9Å–ˆàëÄŠöS´‰È9t|îi‰1ümËC² )"ŸkÚCÁ;bI–¢"rZ«Šÿܦ5Ô]™¡õ®@ÍÊ’XDŽ/g( ûPÖ0¤·ÄÏžwÚBô–%¼ˆœCä‹À±O[(j¨ÝC,ŒÈ:†žX!SsŒÈçºdë>ií²B¶i EdH xÎ!“ľPF;ýÕi$Èæ?W(}ëºù [ûÍ?*®PúáÖóűΜ.à°…ªkµ:݆(ÚéV c(Ü˨âõ½Žpž‡a ÕLøôTE¤¯¼á Uf¤þôìFPÏ÷ð„êw ²‚zO"=¨wixBÕëC½‘Ö8ÔK;,¡úÅŽT¢ÞýÈ)j}–P½†D–QëL¤µ K¨^¯¢©5-‘Z÷"#©µq¸Dõú9J­±‘¬Ô:<\¢z­Žìe/çQÆÔŠ?L¡zWˆÂ¦vލpjw®PµEÌS{T?µET[Ýô‰ânmQm˜ÑÕ¦:l¢jߊioÍ:Õæ=]¢jƒ`ª‚€ˆªvœÝU…Ó7ªÂÈ·*$‰Ä«¢–áUM„büDKVñÑt‰ª*š´Š³¢[«X,Ò¶Š×†o#ºèãvÌ ]E…Ó5ª"ÇHñ*ºŒ\¯"ÐHú*JFRÉFXÁnÔƒGaXA³­¤:¬ŽJ±Bï(wd>¬¤:x·²âûH&+ˆ¬²ò„á-Õ¹D䙕oDÂY9Idž•· w©Nm¬­ì'‚ÒÊ":­,jØMu¦íjûÛx4®¶(`+©~SøEIÛ¶7VÛVEn%™Qí¶í•½•¬Fý»óÙa[Õ)oDÄm{c¡ñΚ-EÞiõð¬ªÄ;zæ6Á±æ¹Ò÷è¢+ÅvºMp¬¯®RA4ØUNÖW]r°”»]q¬ö®ÂEáU܈j¼=p,,¯"IÄçUH‰@½Lp$a¯jLTîU±[UÔ‰X¾\q¬§¯ÊP4÷U=Š.¿]q¬Ý¯ ”åýU£Š€]ql R—}T f^]1‹}rlY Ê[l T‹õ}rl *_,T ŒÍ‚]qlÅ ŠbìTuŒ£ƒmqlú êeŒ!Tá~c]Á„rlB¡bª}*To•…rlw¡ªm,1TÙµk†rl¬¡±½7TBŽ=‡}rlá¡Rtl>T®ŽˆrlÒEï8Ѝ.>LGä”c’®¯ó’®Áƒ9娥KùÃ&¥ËýÃIEF9q[é¶A Yº³0<[ä“_—nPÄú¥{ÃF69qéVˆ,fºU2^À%H“1µ$ÙZŒˆK*è gæi_‹ÒÙÜË>Ñ äV@v{é &bëœç.;Œ•ÐPp8pͧV2”X:úRKw„go«ýïÒÈlµK„_Ÿr¼9K¼œÓÔ¥àxU‘'a8ôn¸U×Ö&*íxþ´¡2W÷áÞ˜š"@¬¨Rºž¯¸;ç³lÒå”Â9BQö"?;‘þ­2JäB» ,ZÌ4Ø]CÒpu<#)Ó—}{~c6¯ïÿY¥;‹òÊV¶“޳]ZŸ!£ ¤\Ÿfν]+催nuUÇ–ˆ+¨7ÕRC§ŒAT~B‡$ÿÑ£Ù™X<ݯ•„,ÆŸ[0<3¦{§âhÀ€V’t„핳R–ªAI¾ÃÎß"´Tpqö³Ÿ6P4ø³”¡£‚Œ¹R9¸´–.¦ïU¼;s$Xå– ‚rZ†Ö’»MNàÒñ]ç¨ownLõá \/'f$pœ¢U‚ë€7eM) ƒœSeVtJø«?*tbZƒÎ0NGÁá áȧ›ÿG?ŒYë7]äY&Ë5•Wul‰"#~Ëàè^|M/×­+l&á˜lÁâBêM]¤Üð÷@.þ ±$é>‘£>sÛÔ‡~#”,àï~*‹GšPuX ìà5IõM4r‘Tã@îçÛéÝÁ}t• ¡G‹ìZi¥FýÜ·b5¬ÁKæ¥ómLI¡$‚<¬ÕŒà'‡ô—ßvà©æ€·B'‘»W(tð ±LTÆE@žiBÁí.%õ{ÙÜT*,agäé83½,ë3/Óñáò©3"!.Æ,ÿÏêPuš†uâ”a>wû.cšŽÞ1 v• h__Õ9ô§°Ì¤¶Ü>'›r(JT×ó÷>½Cð|?(nòˆhÅò›tÚ½‘ò9úzÁz1ÜDH1C¡ãG#XœQÚÚ[éáR<ÜD0ByWQtõõz¸f¢PÖÿ(Hîé&šÅþÁvœùð¹A©±mj>¨}O3 òð#K¦ ÎÇ׿›ëÕ$D‡›‚v«W¤"åÀ5äúòY¥ÃŽ9æK'Á]¼[| ñ1²ËB§A×¼œô§â%¢oÓÛA¾0\ÆÏmþ¦X‰èwcòóx浩±%_½á$R×÷z/Y>ô-¸­kܦá$Ò·SÍm]Ô·ýŽbèè‘N"ýØ\÷+O…~´Ðkyõ„âéN"ý„^(/ù ÅS|±þ>Ÿô NÞ~¸‹ôs]ö¼ê—ê‚»g¿1õâ {‘~9¯³dôþ¢QÕî1ýŽw‘^0íÜ–½T\lh¼c9IßLKΓѶ ¨e ý·ò±ë• @E*ZÝÒ´Ó D+ É‹¼ì5ÖÑt µÖbÞ¹Õå{=ÒN¯ÙéNö’~}D5Óª¾Ù+jgÀô:æî‘ΨvÌDk¯¨]è„iiU;Uº°ÚÍN„|uuzÇ£[Î9wEv€+¦è3=aí®˜’®«Þ0 `¶±E§ù¬m¼\V¶±ÕÃù¤V¥Žh|²_‰ÜöVD™éOtÐÁéuŽÀ$-w/çi[…pà=Ò¡—ÿnÛˆ’ÜîW Š]:Ö"û‘/}‡c`t@Ñ›‰ êàõñ3ð;·[?©cCpVÅ¥>†÷Ð&('¡`}öA¨ÂÌ£6 ³f\(Þ=ø–׈‰)`P±lÇÍÔoË„v¼1Dñ7ׂ2‹ècïõ™Žãñ÷«Ú±>~3e«ð–þr âtV‹2¼~×=³ „×ò¢¯_-/Jrð&Õcb»…§Ó$KDö™PëF Þ´z½íµð¬^•·Ïgäuà®-T¹Nh;?ÒÉsç¡ )ÏÄ‹W ”rQ¼yÕ<ït¼é6yè„¶sä¼`0U¥¼ø¸”Þ(w>XQ»G~Í·³êƒ¹gž¶”ryªÊæ¡ó}¼Ã©&¤2Õ @̪ Dµ¡¤þ€7¿ŒºD ­7ºŠÁ¥àž• µÊªžXe*˜)2‡Š*@*Qá%ì2gŽÓ U¿P¬0Õx€Ôk¦:ÐÁbó;jE@Š“ bÈnÍSzU”RÕÄ®[a=«çBµ- uCUÿRÅ•ȸ Q¹Ëh¨X^¥6 U8èj€zøU°#R´ßªé¨§]U? {™€ÅÔ/ä– Aþ7giËü¡ªûÕe=‹¢ó6!xëùZÆ žžY2© ÈQö´q!xkœ ü!>¦H—G|P¢àÈ)JTeE¨ïý¨ôÐ'ÜèCp5ížú%Sœåégg!Æ)-q ‹>gË¡c£\‹}­”zÌÑ£˜|ŸBJÏÁ jœíDðöhÎÅ[c¤€þÙÚ‡@ÿ®‘õytž¯?bä4÷×—½·žð²ôÓÅÖ\˜gë¡ _<ø?½Eç&ðüºQ6"ðÍ|5ŠÑ÷:F õüHć@Íý¹ªâG ÉÆ&„_Œ^û~BùßÕÚR¹{óE¾ëËØ˜à­qìíáž…â ÍZÒÝÈQjR­Õ%™u£Ïq5pmíJÀ$]CŠY¦ \$_ ¢¬&!œ>w½,è,ÒÝŠX$,PY«3Lj‰.w#¬““èr ¹§OÁKýžþLý)”ìº[—Úû”#ïja‡†ÔŠýJ¤†WíÇQCŒ s² T‰»NSÃÞ(”`öªe:zg@ÊÕáy[¨{ÕÆ¹î÷èÏ [Êë'm5Tî¨ôöùÔ“ïé<;êOA&¡¥q=*ùIçíÝÚ± ¦(7I寞¬E‘ñCÕ>éÉAvñ¤¾¸ìs”†\‰P¼ä¤Þ³õœº]XÌ‚'ïönE)c“xžƒ<¥(éÇq ©aÒ‡DIªÇ!¯ò±ã¨fR¨Ÿçñ{ÏO¹—€ƒÄœÈÙ¬½=À‰"âª1"Õúˆ†àÛ5ºõÔ°ñ Eù®~Õµ÷Qh°ò(ø@^ÓÅà½*("éà[x¼¤:Š›óSb‰Ÿy­¼<‚Šì ð†ÞGA{Pö¡Ù§fiß»´ù•Ÿžè’º#ôh˲àé­ó¹ä%ðÕ»Y(¡îBêaHüšƒÁ¨?ÿ8;\¢Ïû©¶€¤t)?Ÿ²¢Ç[Œ^M$c¹,®è%f©f?Fï·$1‹Reeöd¹ˆ´læòÄ4Eu%¤ùÙŽtýì~–2;+ÔDöO©®cE*à,ÁrÔ]ê ³¤ ŒVð‡Hÿó)ÍQ+’üð”ZhOçK§ÝòUèSºÔriDžFêÛI¨}̓!S€ˆh$œšoÛ†—,ûj)(vÝ·v!Óê]XJ bÌÿkªëQÓú¤oô˜ÿ[=÷S¦}kòšÅ<ë¡_lkÒJý’i7wæÃá) W3 Ö§%r7É©Y¦Íý·Vš¦€Z¡£»XÆ+¤¥Ü%ܾõú°ÖZ¥¼½MZë)UßíµZDé>`6ÄyRß]ý»è°R˜ ¼m«Pl% nOkWœ%R½ë±‘šþÛÇVZÌû&•Œ£Æ}k‘1éf)&Ï:9ýK¤ž{ |¡TƒµD¾8WòèŸý«ƒ”È@°Àýç÷A-:2þÎó)Mê|—‡£µóû¶¾ÉøM˜Ü¿~÷û)m]_šRWï}JÂÙWxû|þ#+’ÖoÑ–Ü)»Üç¼›¨Q۸߭“'b[g¿-zj6È»ÎKêí~ö6vñæó¹µ IžaèÝ”Àq?æ’s÷‹°áÂ>óeÙö–©ö eAw¿tã©×P/&¼óhNâ—׊îz½‘ïíïX¶VuÉaAw-#Ðââî•D¼¼^6Ž­ÏËïZÓð]Ž4Ð}õb©¥ÑŠî^>7,P÷\b‰Ák ç,l@ù„”FÕ><÷Ô»Âû ŠU6]c¡bÊv§ C€…+`9f5‡ê4šTŇÈ5°½ôõ\8¢(ÖL×–ˆ`y‹öQŒëÔ¨f©×>êXDög `¬¡ëaDʪsé™_ó(ck)8ï„r{¹8¯G/M/)‘ÆÖ²iìþ†½4¡ÍÛW¹V/ö}½œQ¨ÛZÙZªãVp „ÔZumÅ¿þª—S12–¹öIê0«Q_掴[^[¡8WƒúC­c5¨t@׺£êút&ÑyA½²#oý v§ÖäVöMå,•¡›,ߔŀÐtg:‡s@eC”fK~ÔÀ.€BkR÷VÖ…—­/DgfxÙZ¼¸“7ÅUjÙùÞ£½“ÄÊ!gó|%‰@*×ì<2ŠàÊ5¡ÝnlQ†Z9ëaW åµD*aîܪ>ÏW~|ˆŒëzó›‚ñ’ú3ïÚG§ë‘WJOy¾Ê¼%ü¶/“ Fj¤jû+±K·ñ[× ·ÔbÅ]£ÀbP[‡ƒ_[ñu­ÈÙ’ª‡@Dª•ˆ[3¸j‘£¨¤k5­þjqtÕf z%Yá~´Ltg'}ëߨQo«®T‹?—M«DÙ®£ÖTZ_ÿ¦ˆðsê ®YYVÌu-,oíc)a¸¡üÕ1mlÙ4 {k·Šð#/ Uâögï_Õ:"Uf“Œð³K¯¶«~û#û. ø7e„Tuq_'‚pþH—0Çé2çø²’ÎêréøÑ]QF¾v]˜—·‹·ãHBØ·©kÀ¹“ªûf[@ØÏƒŠÍydTÎce a?y*lçáTñ;°êã~Æ-*ì×@eö¼)*Åçm²¨°ß8•ôóVvÕ?/®e…eøZ}ƒ¼úê-dy°¨°Vu(²Èt#ëúY«,2ìõLí’¬yj©d]TÛ%k§Z3Y_վɬOÖiµ²–«U”õ^½$o j7e×PK*;‹ºVÞ|ÔØÊþ¤æWö0õǼͩ…–Pm¶l–jÅeCU».›®ZzÙ˜ÕöËæ­Î ÷wu¸¹¨(ÁýGîQ:Ø` S±ˆ;œWÜ­xÆMRÝÔv€êÆ·ƒX7Çèºî`ØMvÇËêÃ;¤v«Þa·ºùŽÌÝðwônR€#|œ˜\àLÁgæ((á0Á ‰©NZÞm&5bJ8ï—©‘éNŸÄÈp†eÒ†³0;œ©™üálÎg|â8)4Íĉ£™(Ê-MVqúiBKå§"¼85'Æ9®y3΃M­Qªlö³i3tœq›Åã¤ÜL'îf9¹7cȳŠ\$0óÈ…³“\lÉõsœ\³0Êu 1¥\ú—ÊÕ±­\@ùe~+ÏŠHåYz; Ž"cÒ{RzP±3BE3lH k›ŒÉɤÊçƒ&ñÛ%´CÎìéïAàÄý½M’ç§nÓ ‚ö y¸¢Ø·É&¥,Â1§=Ñ>X©Ðdx®É\ý ﻵ§çöS5ºd?e}8x´ŸÒÇ\ÛžÜwûTÉ)œÝ {á3h½ õ—BפoØùVÄR#ÇxûÔò½’cr•%|>3ÅÖ58Ïå~=E$¹ó­A–èBèÕ%Ìð v™Ioƒ¦-ɇP¹éàüLºw!÷ „K^"¬qz1žÁ,§2÷¬„2I3Ô%n;“q÷Ìt_ÆgÈ„·4­™ò ;Ûy 6=Õ9Ž]—Tï8ß²´fìYÏ`õÓ¹˜ü{ë¤JœÖÓ ‚D`í{‚€´\…herTwIÉÕzX¡Œ‰¯1Р{†Z1%sUéI‰qÂþ‚‘l¢_½ ©µdLƒÍi¨rz”ƒæóúšïçÓ Ò‰ÉÄÅeÖ6¦JØ2†d7Á…Ýß1œ"Ùš °°%Œ&¹,ëã( nB‡€Fe¤™“iv€×¸YÐ͇ª¨8Ñ挎¦v¤Þ“Á cò‡ áýK²ù˜ÚñÂïœ2¢n'“¤¿ù”,lF•$?”i&vˆß9ñDѢ㘒œÆt§¨}td²ŠÿÞçðU!k hI/)C\ë9åeÐk=TÅŠœfÚæ¼=“1çå™2ö¯w*r²}Ù4i>e~mQî~3nD>s ®Ì—ו›H«4cf³ré|ªþ˜±<*W=Û˜Ü#rßS’“Èœ”Þ•‡ËÕyÎYÏÔè¤ÏóG¤°´'=²¸(\ÿLN õè£잎\œ >§F'LzÈr=}>Æ &‘Ï35:¡ÝStJ,CŸë) œ †Á¤c”;Ÿ2¥ð|)Ûýç5FP‰ìçTãQVR®5Æ]KÐì˜ê@>sl–´ÜOÖjä;ŸªÎy>·€5Fx‰|¶©ÞùP½+“À4+LÆÑîr>cæx"­kÄâB<ß<‘ë™*êým4G=þýæ2àEºS¿ÚÛ¾0êÖÅÒ}3®›ñqݨ¡ÝÙ73cèºáU×C1ô;ûÁÉÈ»ž­ŒÅëùžýŒf¼^ÏqFðõ¬gL_ïÃÐôìw&ãþz¯¬ WoHzöÛa½ÁÐ[>D={%°†A¯Q9Ðr2$={ɉZ‚V¥(*håŠê‚V·!òÙ+`Ô´JFáA+éôìÕ6BÑ3Y«öôì•ýÑ9¸òG¯B»C4-´ƒ …ÏÞe¢¡(ú½Y ÏÞÏ"á=/RÚ#硽s(|ÖîUí¿QÑ…ÏÞÆ£?¢­þÿWÝÕõÚrÕHm‰$xß÷ŸéžîùQl'à<Ùñ•ˆd@A¶ź+N@áä1ƒ_À­ªµªj®‘•‡\×é½÷ÌtO×G¯µ*5J¤Ž‰"†"úɨ"ÕPy„`Š‚“"ñ‰è%EWÞ¤0‹B oQ””ŠŸŒ£RF±VªÄ(K%…lE”a] Ò(ôKÑ…‡¡k£2%@d¦8ŽÑÔϱH5vÉMPF»)Ô£ˆ8Å|4§Þâê" ÊØ;uƒž§´"ø”R”ŸELRÅH¹B*)ŸQf©–¤¬$•”¹„è’’›ÔeR”ÚMJ’RßIIT‘#e¢•:QJÆBJJ¹ZªM)ŸKE*å|©Z¥¼0•­”;Sæ—©¥4U´”§¦Ò–rÙÐâRºj]ʈSÐKYsŠ~)³Na0eß)Æ=õŔç™òüÔ)S- µÌT/H½3ÕRU‡”MSa"¥ÕT¼õ5–7RŸMpS‘$UÞTHI%8[R-Nõ˜¢(ÇšMQc]§(Ó±öSÔëX* w¬!IÏkLE"/äCF•ª"µÇjV‘ã ½ÃìcU,UýX8+¡wâ€,ÀAéŠÆ`H†¡×úR¨ÕÀj Þ! )wh{îjr‡‹Å@48Ú„ØšÚ>, »3ñù—Ç1ºmÿ»q±“• ‹;ÆDži‚íTt·®¿mšÅë&b€ÃGx¤C—znm£¤r7mRXäŽD6‡ÅÃ쎮óöÍêÇÒú¨î¨›V±+RÏ]–ƒ‚dp@æ‹7ßé€û`ÛhŠRC±5†0\˜‚ª"s#9õF¸ ÿTh B{Ç”3Ñû7h’¸®o°xµÆü®ëJq™”¶^[³9…êŠÍßôtÞÖÒÕ¾¹³Ï@è".Ò_Îúbx,R4 ÄPç!9>Ê$ Xí^ ÍE!íßêá·­ÊjhŠÒ%ýT"¤lœ¶—­y'ô×áØ]ßýxZ·è‡×C‰X\&NhÝÍà2Pé=‹šlºb[çìIœ¡‰W¾ÑRsn]µØe|*¢5 £àPC[íE,ÃzR:ñ@ lþb@o£¹öZ+ú&BP,º¥Òq˜òíA%nºó‹–ºr#ÒŽÈà1¤G¤åR AtÊ›€RÏ‚xwá;¼"Sˆéxé:»ß—V‰uòk-Hè`ÙdÀ^šá»è¦kôSɘ¤2ëÊçÙISà a¾ÆèE³è­ »£\¯qÅ8ÙrÙ >«†›ZxYv³SÈ éÏáBC@º¶š" ?¨: l5‹Ḇ¬Ô×á~€ḑ¦‹ôÌ„f òÖèœqR¬0W\j›•2Ø=7Ï©hsØ"B‹Š;5—Ê$ÔxÙ‡šé…ÁbEGèÿû– ƒ‰¾E¾;ºwÄeéEMÝN—7ì~“è„àÝ `Ù«œÛè^‘@oi ž+ºKx·?¬7ÈÂE^?º/Ê}ª3,¤ÙÎP®ôšx–¼ý(úôbÁîÆ&9iAlŸµ XðÔwñ$ ¡¡Æª>,QIËÊÊN|*묿%˜¸ž6`Ä5˜îõ¾¢Ø£[_¦tŽøpµ¢Ð̪’ò†Z'¯Ø'¸|ßô9WYÀÒt¨?]‘ŒSŽBرÖUbÅ)¹r²|ÆÅµÙéæVÖߦ€\K4ëtZÆhÁCE2®tté¡|)߆¬ò…ÙsYÄWj›ê4¦·.ë‘z3añ^-zy·É^ª|½7äÿ­lY Õ&ÜþÉmÃ÷«¨ºF÷š"ðÆýÍ“¨,Å=k[CvûÚÖwj©úΗ`mŽÀñkõ×µåý²ÉfµYû0,m̲Woh%ïzÉÜÏ·¶H{ Wunùƒ èj0¦ÏôŸRIô+Û²°A|OÖÝåŸ&ü;=–û° *åçfô€“/̪?Ýå„«U~j+†ÇàÞ¹p½rž?Ès£i˜¯y÷‰<ÎŵàXƒî”AB}(Ž€e‹È¡ÆÜÂÏ1¥{ÜÀ¯½(¬ Á»¿(ôÁQ ¿‡áQœß(‚šèÏã!£,4]s HlNEÉ Ö&{g<7§z„)æ›ÀXج¸0Oœ;âTÊ« Š/a™~ŒAíäj©q*`Ô°f,‹¾¹Š’=ÞøÃ;¦)&žH%¼ý-ãfšù ¤Ø~Šñ7`%>ŠÑaá >ãxXüi(Ôó9ehÌ|f °x䪬bÅ)ʦS0¸Ódƃß6s2;•ôäŸi›Y,ÀÌ.-'Ô ´ ŽtÀÚÖNblöÓ¾3éE§ú‚o½KCä08IÛºðj˜©ä1¡ƒ\¼mÎØqËj̦UÚÀ[ö*uÚQ>>5€kûТA_£ÑÄͲͤ<ÔRfókÅâ°4ll´›_ƒÂ×vùÑÍòZ y½Ü½ëêtK¢¶åm‚ Æ£9ذ:Ÿhtù|QݽL E]¦IŒ½œÊs#,NÓ½ºÉ,ÍÊŽÆt¨ª°ÇQø‚'å8Ûn§ fé¦^ÚvA;QðUCê<öº7BZaàgN—8?oIV$jcxqºÎ­DOo_›Oaq½¥:x›ûª¹s¿Ã!›.€Úvœ.8@sµ­hH“Ý^d9W1HíQ1â*R8]6–é õâE­óÕf¬KŽ7as°êb…ôŠB=šMtiÀWM -:B£Æ¾'øµ°à§@ßîójmÆ¥‹Æ¦øÐ>%uƒŠÇ¬ä^k2„›@é2¤nLžêÅu1¨Åݺt ÊÛ1•\cTüŒ6|@™àýL­›Ó—É9,nåO¢óâófdèv[ó,7œvè5 s6žhá]/ƒ´ÿ%äe…FnGIŸAŠ|Smë³UÖ7`×N ߈têèL§óÀBýL-¸â=f‚ ooçRíûªïÙмõe7:Ž…Iwúá\¢ÔM_ªŸR!ò®mfáåên'‚>ÆúóÞíDð À·DJªýr6›PX.0{¨êƒ™µñ?#PàH”âùg/˜eR+€]cZsj¼Y|)‰L€³¾IÂS ÑÝ‹ŸB¦aÚ[+'OÄ;ý;e1E‰¡3&°L¶,„ Z?¬¡JüçLÀ@¶ÃÚøã"q6Ô¥<ØÉÆpzŽ ýñµÑ\¼bìR‡Ô.»>E**/Tš=,¼À¹ºîÀ8B9Çi'°8æ£mÍÅ×PÁqÇæo¾Y8ÆÙ-Åâ]nÞ°ØJÎï!¦üÖ±¸E^%ˆ—k&g§Ü×qP4"vy>¤•ghµÄúœûbïO™ Q‘r¾:Š­Lio לf½7§ÊäÊ * çZXÇ¡[«‹t«\§i¯k¬-_qZïdzå+Ñ.Ûëkƒè­Ÿñ^‰Q–/,KÇ»ÙÔnÊÛÛ‡QùË.*[î=])O;…QâfÝMĚˢ«çeWê›3ýrãêÛ^w6Qør÷CØŒkõ &s[GÇùxõ/bM† êpôkõR«¥÷Õ“­üIg'ÂfúC¨ûšVdøL¤XÛůB%xiÕ÷Š>šþéœyÚðá+Ngª›/ÕÔ##w5Ã…`™KHK»D°Œ­F&kwjwF/H[‹¬2Ûv‰‚Ä¿ÍHi]ÚÑ”Y,\ ]‡ï½DeÆì5QEnmÖ/²èz¬ŽÉ0(Ã%šÅ"@E‘F4¶k¥£ï%mëð÷]kC)À#X)} \`*Š{âŒÕ±q[§³ÄSØÿT{[’Q¸YÖ‹²,ö0ÍÁ:"þ†¢‡)Ý*+0Z¶çA÷VÊ™]´8–‘ ˆæ¨R°˜ä…ò˜¶Î öôX.¥>`ÁFÎd¬ËÈ«ŒIÞjîeÌÝb¶PÝ))\$ôÿÍ40¿cÆTéwÆy¹%›y±ÌGó~Bæ#îy 1)=¥¾ùìBæ#/µ‘ôü•`ç…ÆGÌ£õ˜k&óe=l­S³Hk&e?´®`Ñ´ùÚÛRò‹ë3e?´†°Ýf]ç¨RÜŠïBª|èuAíïòFÍcÄ›éo]Š|èÍ„eŒúöÎC3õ†£¶§7Ów”ýÐNF/»‰±~Öºã¤ì‡v¥¹…Üw.Ôí–Vw·9C¡‹;`ê~h—œxܱۚxÉßÑn›ÂÚ‘a™£îÚ°ðÞ¹³£žEUßüS Dþ„­=D L}cÇL?3CÆH¾(Õ@䯦wø-> Ðûõâö&ï’~1ÅAä;§éáW÷:Ûn9àÙˆ‹Ne:qp ¨@?2é²@|I x¤:!Š&`Y.â| B0cTbd‰^#*Ö#0&!$ºïŠ~†U¼ï%\µÜôóª÷f( šp† ,gD¡ÊrFª>gd¢ uF/ªbg„£JwDAQ H)*æMEU=¹Øª¼GTÕùˆÜ¢‚Ÿ\lUù#´S€ˆã” ¢È8IˆH3N" ¬qf1mœkDÜ«£u8ÑsœŸD„g,…Ç9LDêqVÑü›ÇwW¸úH¿0mÓiõÀðÑȯ&7B¾7ùòÏ…Kž< ùùäj(H>‡â…$É2¤Rˆ¢Ž (0If‰‚—dŸ(ÀI†Š‚ d±(NJ¦‹RI…Q¤•tcɨQ¼–¬› ç1Gq_’w&ÁGñc’€‚¯D!Å¡I&R¬š„£ ì)I1o—r“zI€b|]HRŒÁ ‘J½$[1–/„,†ûÉÙbFPh]Ì õ‹™E¡‡1û(2f(…fÆ,¦Pјéº³¡BicÂThoLª 3ŽyWaÏ17+;æoÉÁcІoíþã[»0ÏŽ°dY=û³Á²Tš_EËÚ´¥~|3œµ•Q²ÔQ‡le”,uTkÆ\(£d¹Œ½þœýçåï83mõºe©£ì5¹\·,u”i«ÎµŒ ÞxÛ–?¾! C¼š£ÂRFÜ©rTXÊ(;;8{½zYê(¤7Ë^GÉRGaÛíõêÃRFÅ<7P@êbpÃócd°ãº4& 9&ÖÆ„!ÇÄ*И0”1¶b€ýWù«V@ !ÇÄüç]Ócb®5& Ë9]Œ²L¾…¡ Й֠0”A1ÑqÙ2ÔAšç$C¤iŽA2”AÿõûýÜÄç s­+¯BEà°Æ$C„µ$CÔÚ4*x ’á2h hR¾I†Ë Ý¥@s —»C¡w«wGCb$!_ˆßº†ÓRG¡§ J“9J–ËU-È‹Î2J–Ë(ƒöYGÑr…BAýA.cŽÓ”­Ë Z^•jà3þ ¬„g «ú_–‚ ‹¹8ê²8ª¬Žº,QÏs1pÔe5hT®ªËA£r9hT]ºÇ\ºÇº ¤¡™ bÙìå² 8ª,Žº,ˆ¤×kApÔeAhT.ª B£bAhPY“ BƒÊ‚øÕV­Ó#Îó|.÷ÝëUî¤ß?}}{÷ƒÛÓ{?½ÿù¿üòÓÏò×ïÞžþöÞ–ÛÓßÜÛíéÝß»·§=ýèÕíéý¿ÿý§¿úü³_~ú›/¿º·y{zïËWÿüúŸ~mxïËW_~õëûúƒÜ>xÿþÛßúÙÏ~ö'Ÿÿôß¾7~÷ñÝï¾÷ÓÿþÅò§öô_üùÿÇí‡Ü?º]¯Ç70ZêöµA`ÆôùÆæ£ ƒÌ)å(Yê(•ŸrT¤r”²Æ•ydŽjˆè—^FÉrÕp–P¹á2fÝ-/ƒh¹Œâ!JÇ*eáteTìÊ(è܌˵ÓryòáaõàËì¼1Ï úÚœ¾9£¯ž™Qœq,÷_Ü~ukËÿãÿ}úúþîËÛÓOÚrhnÎ~ùó[ó!wtv´ƒ¦~ùúöÉ‹åá±A¥Ï-ÿÙñÏÃþ¹¦uä?§þy¼Ø­Ýçüû—?Æïöú»gg"+~l@ŸÇýåg·O^üöà†½~är©Ðº_ *ÍO,ü•Ññ‘åÞ±Uéí™?B]ËþØßöÉõmŸ_ÿ£Ý‹ýq¾ík·Ëß|& -æQÅŒ'ò¯8l;ÏÆOŒú‰î»üã9}öì#ßy@¨~lÏ=DdÌȵ–Ë:æþÜÍw޼ ~ñ½‡—_|íûÖë÷-o~߸Þàá·Òó7¿Ø¯}ùÿòboÓÅnߦ‹ߦ‹í—ï{Ô¯åÅý_ÿàõû­²qyùðØÞ9æÒöÿæ·ÛüŸßçÿ×ÏŽ?ÌÏn˜Ÿ=¾ÁϾ}óýF?ûö;€ƒ„§ °(ð4†;úŸ?àd}iý|îÕÛßYrqòâï^àêGëùÜïløò†7ñWÍkÃÚ±,˳>*Öp¥ú½‡Ëïýðåí£ÛG·ÿW±"T endstream endobj 2546 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 600 /Height 600 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 600 /Colors 3 >> /Length 13132 >> stream xœíÝm–ÛLŽmáô ]ƒìw¾ëšEI”įÎöþ]]+ˆ§)§*ýþóCÖý÷ó;ûG jÝïŸÿ²:Õ/ t‰rB÷€Ð> $Ê ÝBû€(7 tíB¢Ü€Ð= ´‰rB÷€Ð> $Ê ÝBû€(7 tíB¢Ü€Ð= ´‰rB÷€Ð> $Ê ÝBû€(7 tíB¢Ü€Ð= ´‰rB÷€Ð> $Ê ÝBû€(7 tíB¢Ü€Ð= ´‰rB÷€Ð> $Ê Ýûõg'„ÿõ“ÐÁ€P¯ÿüßÏj„jíÀÝ‹ÁŽl4i‘1…£ÂqÅL`„Ÿc@Ï„çªDÝ™˜Âãá™&PÂw1š[Âm)Œ›cLá÷€pKÊ( ák åk@¸–òйÇ>„¯yM „O1‘@xËkî*ÅáûzCøTÏ‰ì ¡õÜ®ãö„°Ò–‚pYŸqìa¥ÑëP—)ìaÕ , á\ùYlaÕéëSñ),aù ¬á²’ãXÂò£×¶‚SXÂVØ Â©bƒXÂVضRSX †Ø¹³X†ÓGE¦°„'°5„Sîƒèaç¤)ï)t‡ Â{¦³h !ÓG¯YN¡)„Là>g7ˆ†2€ô9³)´ƒ | ×3D+@ÚžÍAÈ®„os™B™AڛǺ@Ⱦ ¿¤?ˆ2€t&õ)Ô‡ ü~O| å!dé|ÒS(!ø5 Üšì CÈÒµ‰N¡,„LàÆ~ýùp‹²ŠiN¡*„œžÇŽVñ9Å)Ô„³óÜû³óÂíuZrµAÔƒÓQ§UWZ÷A9 {»ÂÕêî†ÔŠAÈ®+Uw7¤öC Böü@#!|­ÐéL¡„l°|…¶Hg“t d{ áSæ›&2…2²†™ošÈ¶‰@Èf.Âež{¨0…²þyî¡Â.*@ÈîIÂeV[š¾²aå²ÚÒôMM‡í:™$„s&Û›»­Ù²I¥3ÙÞÜ Î…-:Ÿ6„sò[¸Å©²1m’ßêÄÍN„m¹$ç„·=k»ó d3Z&¼íYŸ![qUnNIî?Jd5~ÆIn>Jd8ƒžΉ„”!KO;)G!BþÂÌ!œR:ñ‡!ÂÞ+N¯)ˆø3aïõ¾¾Ni ŒËüª¥q.€0®*3XÂ)|6Â!ì·Ä´+|D‚!ì·ÀÃ+¡Æ1‰<$±6[\:–À1‰<(‘6[Ú *B8•z^€pH寝xÉw6¨è Ö…p*ïÔ„˜@¬&]^æÍtn l°–9U‡°Áíaõu¤qU¿¿c ¬¾Š™5€p*ãáÙª_¯r.r Âr &Ò}Öž ÜR ,Oî¨Äø½C`z»áæJÌàÏÎ[ñ„«êu¸€pk†8Ú¼íYêwÁá¶ gp¯y«]á2•«á{%nøÁ–X£KÓÁï]N(–¸ã‡BXb….ïâ>ÂeêWFÌ)Â/ÉO >~ï2@1è¦ÂÉÏàåø- á2Õ«Äüª ¡ùҜ˿wé¢h~ÙƒÐ|aÎtb#!œÓ»_Æ7 \Ooëù÷š¢ˆW>®¥7ƒaþÍ¥@8%vÝ >q@¸’Øv p™‡Ão} |Ilã œJ„pNãö±}ù¡íŠì¬›¯©ˆhûú3BÛõ8Pò T€pJà2ò|ÿq…P`!p™‡žo@® Ì`:S:Ne_L†—ÿ bOø®| ¯ÿ.ÃÞ²OÚ"5§R/©‘²'·”ÌáX€0]A9t4!œÊ»°†A Lœ@Ü[&‡ha¦‚¢Ü(C˜g¡•@¸%¿!<_‡>\¡Ï£oL] §Â¯³1‡±/„á×–Àá(ºB˜  ‡/F†[h®†‚#жÐ |“ .^báJWCèðÌßBÁqaák×BèðÄ[r’Å©¨kÎ \1ÅqèÀ>ægŠ)„Þ¶ƒ+fna3Qðc¾[Ø B¬›³… DÁoYCe¡ö;Ò¥j?êûP0« µß’.„PûA?gL‰;„®vdkaQpC ±Pˆæ¢ B ÑB{Dj@èga Q°S†6€·UÂñªÑBTk¸…ªJ4†°• ljáuJ>Þ›PP³ž^¡äÃ}¨ŽÅ l¡¤ !DAåÆZ(iEKKÁñëÏŸ?ßÿSÿËÿcÆ{vKJJÑ B/ÿ»ìªþË/l …’VôƒÐJÁÿû¾®Û |ÊÀE +CØXÁ«äûœ¾‹&Ö…°³‚ä{ê„sº"áôží%Ycü{MVD <Þ“­¦ á~ÿæÎA8§(b /‚Pì©ÖT0Ë¿×Eìcá%Š=Ó»ô<áßÜEÎi‰8æÞ#£ „R êø÷š”ˆ£,C£ „J ^áßÜÕN q8àö#£„: *¸L‡Ã!Š¡ÑB/%pj „SJ¿„°îë  Ë8”),aá×ÁN„p*ŸCÝ—B ÜRº‚Ž.KçPû¥·”­à0§ÆC8•É!nIé‘K„ÐÀe‰á–”èµ<8!¾éü¢\¡Ìü„‚†…o:»Ñç!”y”ÕŠ+ áT‡Wß§2v†0KÁz.Ëâðz eô( a’‚QN…C˜f!~HæaK°¶‚S)á‡dåµ cL‚p*CE ë@è¯`—Ås¨ja (NàT„ á»4žä±`»)8l!¾Kã9^‹…0IÁlÝ-Ôà£$„(–·…€…°‹‚F[„«i<É¢H;+8i!®¦ñOB˜ª „½-,! š×Û¢à‰4 µP Âóø4„ÏðX„(¸,ÌB=Ïžà“ <ÁkQ (¨¡©…ˆƒ³´P€‘röRP Â8 p™À3,Šßc!.x‚§B ”QP µ>µ‡ÐísQü\€…zŸŽšCh÷¹¨’‚’ÚY˜íH%QP$3 ³%©a;ðвÂ]á–€pW@¸/ Üš‘…ÙŽ”¥r²0[’BvTP p*ûn†÷6ÚB œÊþñ— †PRA ¼¨s›ë ¡Ïç¢@¸7/ÀÄB£ÏEðH.áéPP3 ð‚š*(áp % „Aá" \„1á2 |ƒÂE@¸ cÂe@ø%ø›2yßÊ;!_%¤ƒ)þ¦LÞ÷òCÈW E2„PóuÅK¡c¢¯ƒ@x0^ ð_@¸? ì>„Ïáð€ð1 | G„Oás@8¶! á¡T!Ä¡P& ¡›…@8„û–ák@¸ _Â×€p\@ø®„£*ª +„Xدº zBˆ…„@x" l®„ëá€p- \ G„«áz@x}£Â Cˆ…—7HA <•2„>áE·0žˆ—B‹¤_ðl­_ M ÂsñR¨Ÿúë ž­õK!ቀ°M@ø! ü^Ó@%þÐBù&ÄÂK§ Ì?ÚB¨ÿÏ„6‡Pâuy)¯Áë ¶~)”‡Pÿu0[ üžÉàu0Û üž¶…@xE@x: ” ¿„ßÂãUP“yÂìŸþÖP±ðpCT‚ðÔñ8aöϾl$„Ú Cè¢`6%5 ÄBÁlÌÆ¤ „}-ÂÓe¸˜ !/…u³0ûãÅdy)<*„ùì¸5B,ÜÕhp.ûÇ_6BU %!4RPÀ‘2b¡NN HR¦áé²Â]á–€pW@¸/ üž—‚ŽT‚ 2SP@’Zv´P µ^+@èöRˆ… PPïuÐB»—B1 • RŸx†E1báj1 áSOðT„JÊ@訠"ŠĬ,Ô`¤„í,Ô€0NA9Ï?ùi5cQ„X8¦ $„gÏÀI5â©(5,€°±‚u ÄBçz+XB,íפK!”Ú÷aa|A Ê¿(]¡ü³~ÎU_]l!ÍYÁfbá·L!4V°#„XX.sûAˆ…³ƒ0öšs@_ƒÃqÅ8åÀ®å$‹„(¸ÒÕú<ùǰpD(¸Úµú<÷×lp1‚0ü^3áß……×­ @ø>_, ̸Άýoý÷…0gáð‚y ûB˜4ƒúŠC˜t…YA0B·%Ø+‡@7 .‡Ðm6¦k2„y7—•@¸1,Ü[š‚náæD¹Ñ„0õÂùPð'yápS™>}@ø“=ƒ‚ªA˜}I þ3à@ø¯ä9„÷%8þèῲgPŠC.&ÏË „¶Ë±'8\–O íõ?BÛÅØ›À©Ó€Pã2~è€ð%‰9„C CN>§1ƒé&B(vûؾÿ ƒÐyQÕMDÿæl߀Aè¼$‡Ë9“)ê]7Î/?Æ*Îa å4ý1†Prã9Œ„Põ~‰8k@ø>Å9ü))¢¢S! ߦ:ƒa"ކPþ*ñ¿êGBXb®ÈE]üæü/ûq–Xž«x’G@èse1 ÜÁþKEüæ¢Î~Ïg/Gñ*Õ¯†•ªÜðƒ!,´RÒAÑ ¿¹*wüP ­Ó .8ù T™üSÅ, Ü“å>7ZGKó^ ~ €pw fp‰å¯? æî^Å+}<„EŽRªx©†°è² Õ Â„£„'ê4‡]Ê8G@x¼63غ7y„¥Wbª{—@XzýòkaÎñùÂËê1Š•Ë;;@xMÕg°:„ nï({¬&]^ƒû;Âk™S]3Lè™ „°Ó²ÒùRKäq ƒ°Ó¢†VÂä“ò„c+:Š¥8&@8°r3XBc|Hb!l¹Ä´+|D"!l¹ÀÃ+¡ÄéH8á6^kúœÆ¹ˆ?Á6^éQ•€PåPüaBUFÑ;¥„ÑùÏ 9„ZÇ!ç2‰´+›)t |>g3|·¬ œbésfSháøÞ3¾[†N1ŒôšåÚA8ÅΡçä-²…pŽy$ï)4…pŽ l ¡÷ðÝò‡pŠaìY…)t‡pªóv„°Âä-ªá\çyìS©)¬á\à ìa©á»U©†Ãؤ‚SX ©VX‚c÷XQ—µÉ’ŸÂ’.+?e!,>y‹@8W~‹Õe ËC8WuKAØeìëᲪ#é^Ç)ìá²Jè aÇ™{©+„OUšJ¯˜Â¦>e=f2s¯áZÖS)Sø¾æ5Ò2p[Âmy ¦NLá÷€pKÊ(!£v& <—òxFÆϤ0A2dã‘) éU1…£ÂqÅLàn&µ€P¯ÑÃËj„jíÀ_¿>¥3!Qn@èÚ„D¹¡{@hå„î¡}@H”º„ö!Qn@èÚ„D¹¡{@hå„î¡}@H”º„ö!Qn@èÚ„D¹¡{@hå„î¡}@H”º„ö!Qn@èÚ„D¹¡{@hå„î¡}@H”º„ö!Qn@èÚ„D¹¡{@hå„îýúùÃ5êCH”ÿϨ{@hå„î¡}@H”º„ö!Qn@èÚ„D¹¡{@hå„î¡}@H”º„ö!Qn@èÚ„D¹¡{@hå„î¡}@H”º„ö!Qn@èÚ„D¹¡{@hå„î¡}@H”º„ö!Qn@èÚ„D¹¡{@hå„î¡}@H”º÷ëçÏŸÿ'ÿô£Ð±€P­ÿüßϪ„zí›Â‹áŽk4i‘1ã‘ELa„ŸcH„gªDÝ™˜À3á¹ò§PÂw1žßÂ-åšgLà–€p[ºS(ák æs@øšîÀùǾ„k9M¡„O1•@øc6sµbð–ñºCøTÇ©ì ¡ñÌ•®ãö…°ÎƒpY—‘ìa±ëQ— ìaÍ), á\ñy,aÍÉëTñ lañ)ìᲂ#YÂâc׸‚XÂFSØ Â©RÃX ÂFÃ׸RXÂvSع óXÂv“G«0u ì;…Í!œòFwûÝòžÀ vŸB \f9¦vŸ„ I}= d ?„[’žDq™?:Ÿô@È~ ·':Œ²2|tm¢( !S¸©_?¿ßCÈ>§8‰šrvž;vvXÇÇ'PBNÏcïOÏG·×kÁµ†Q BÎBNÖ]gÕ§ô ä4ìë"W«¼B“(!{®UÝýÚ 1ÙõÝ„ðµR¤2‰:²½Ú$-R‚ >R,„OÙo™Ä$Š@ÈfZf¾m"›&!Ûy°T—¹î`þ$*@ÈîUÈsöPBöïx2.3ÛÐäL‡í*˜Õ¦¦o©„lØ©$!œ³ÙÜÌÍ…-*žÉçno6„lÒÙ´!œ3Øè´MN„mi”üf'nu*„lÌ™@8'½é9ž![Ñ4áÏÚö<ÙŒkrƒpJt÷P «ñ3NrûP"Ãô„pNî$Yxú—ØQH9I²ô—eá”Öyˆ>ñö^oZKéLÄŸˆ {¯øÕ•€pJå`aTþãW-“„qU™ÁBNIÐÓ a¿¦ ‘àa¿%\95Iä1‰„°ÙÒÒÑJä1‰…°Ùâ†T©äÓ„*7~ÅK=.@8¤¢3X©Ì3td l°–4 ¼svj!l°šU‡°ÁýaõU¤‘U¿½£ ¬¾Žy5€p*çṪ_¯2Ξ­Ç ¶°î]aÑ•£ðŠÞä!];:A˜s–€ðPm&°]ᇠÖiý^¬ï¿ÓÿªÖøÊ]ê£!,·`"½›µü?³<¼rWúxË-™@¿ÿ»ÏÚ„[*‚eè¹ÂÍ¿Ñ3RËÀƒ„;*1ƒKä¶´ÂÕ,uŒ;Z@¸-Ë Ô9ù†:F- Üšá î5oµk \æ„b‰;~(„%VèòôO¸Š%nøÁ–X£K»¿e×C¸ÌÅ 3„3˜@ù“ü6yC~I~/ÇoÙX—é¢h~ÙƒÐ|aΧzb§Š¢ùU?Bó¥9×Pü–ÅA8§(bÄáZЍw>¯OOÄñ§ ×Ó›Á0ÿæ œ’ãpø2áKr(v&‡'Æáà„+‰Í`ƒúNÙ@˜`¡ @ø&Qì½f®梠„X¸Úµ:<ñ–Pp\XøÜÕ:<ó·Œôƒp*ŽC€ð1Œ)êšs@—y8e ¡¿…Í DÁš[ØBü˜+„æv‚+çja/Qð[ÆÆY¨ý–t!„Úú9Ì*äîÓ~GºBíG}Ÿ¯‚ö:[ØBl‘¥…] DÁ ÙCd¡0í!DA…ÆßƒÂ@4‡Ð]Á"zZØBì•™…- DÁm0ÂBU%Cˆ‚j ¾Uh a KAØÖ« ”|¸¡ f-¼BÉÇ{S«A8ÜBI+ZBˆ‚ʼ%¥ha%ÿ?„[þC^X´PÒŠ~Z)ø­ëÿ²ÿ ø¾†Ý’’RtƒÐKÁÿ6,Ä&ŸÒwÑĺvVð*ù>gࢅ•!l¬àùž:ᜬˆ@x ½'[MÂÿ^Ó¤÷l/ÉBxÀ¿¹SÎ ŠØÇÂK {¦wé)˜åßkŠ"v±ð"Åžj-AÏø7w „sR"޲P 6*)¨ãßkZ"޹7ÅÈh¡”‚—ø7w1„S:±P Ê(¨Là2!Üžbdt€PGÁk œá”‡ò/…å ,ü:èBà2 ¥_ BX÷upS!œJçPû¥·”­ #Ëò9Ô})Â-¥+8ŽÀ©áN%r„[Rz ×ò t'pY&‡@¸%¥Gz,ÂÑNAˆ…ï;»Íç!”y”ÕPðº°p­ó‹r„2óRyC!œÊâðz eô( a’‚õ\–ÆáÕ÷©Œ…!ÌR0ŒÀ©h³,ÂÉ<ÊkÖVp*ÇB üÌÃ<–a°‚9NÅs¨ja (ØÀe *ZXBã œJƒ0ÞB |—Æs¼ a7§¢-Âwi<ÉcÁf)˜ ¡½…€…£²¶Pƒ’öQ0Â` p5çx*ÂÎ N…Z„«i<É¢Hs”€°½…% DA÷[XB<‘„‘êAxöŸ„Pà ^‹‚—ÅY¨áùó{Bgx, B… tµP€‘r¢`^Ž R Ân jAf!.x‚§B DÁwY„ËžaQ „: ÊAc¡Þ§£æÚ}.Š‚Ÿ‹°PëÓQ{Ý>•RPB? ³%©! jäea¶#• l¨ ^Q¶$@¸/ Üî w„[s²0[’B¢ RFf;Rž êB`!NeÿøËCˆ‚{n!Ne?À­Ñj*„uö'u†ÐèsQ Ü› „§Ï±7„>Ÿ‹á‘l, BAÉ\,ÂÓµUPÂÑÊ@xê,Ÿ°Ëç¢(x¦±J@xò Ÿƒ°Åç¢Ê !žË„߯áÙÆY„- DÁó ´ëC(®`w/³ÏÆë vú/…@x®Î¯ƒöx)ô„×Á>U)t…×Á+B <ö ß„Â+d!žJB¼¶Qቴ!´Pdþ™°3„¼š$þR„Gkþ:è¡úK!×AŸ”_ ðhÍ_ðO„ݵ€p5 ®„ëሀp- \ GU×BCQ°gE-´„/ €ð`@Ø3 | _Âák@¸Ž _Â×€pl#,Â#ÉBˆ‚£b!îOB/ð_@x$ l>„Oáð€ð) |G„áS@Ñåá‘4!DÁ˜®·÷' ¡‚@xï “¾”wB/ò:h›æKaÒWòN@˜ü%B^§€ð_@¸; ì.Âe@.‡€0& \„Ë€0( \„aL@¸—a\Š¿/„»ã7eœü} Ü¿)3„ÿÂÝaó€ðÎah@8„÷€02 ¼„s@š"„IßËË/’ „IßÊË/^þ ÷„„·€pCÂ9 ¼„‘á- œÂЀpïad@x ç€04 œÂ{@ÞÂ9 ­âwê»AÈ·éÍ+÷únòmú9 ¼„;BÂ[@8„¡áÞÂÈ€ðÎah@8„÷€02 ¼„s@Îá= Œ oᆄs@x#Â[@8„¡áÞÂÈ€ðÎah@8„÷€02 ¼„s@_¨Ÿ³…/Ô›Çêo™BÈêç€ð_@¸/ $ ¼„s@Îá= Œ oᆄs@x#Â[@8„¡áÞÂÈ€ðÎahŠžý‰¬ ÔüÅQ ŒLÂsûo¡ä/Žah@8„÷€02 ¼„s@Îá= Œ oáÆUñÛô@xQXS¹oÓáU9Z„ÿÂÝaç€p. €p>„1á" \„Aá2 |cÂE@¸ ƒRüM™¼ï冯ÒñS&ï[y' ä«„ùA(ú:„ã¥Ð0Í×A </…@ø/ <¶ §€px@ø>„£ÂÇ€ð) Ûð`²báІ(„‡R…ÐÎB üƒaÏ€ð% | „¯áJ@8. | _ÂQÕUÐB,lXQ]!Ä‹B <v ×ÂÕ€pH@¸®„#µ€p5 ¼¾A á©”!ÄÂË¥ žHB# »Cx‚@x6^ R~Âs5)ô€PýuÏÆK¡|⯃@x®æ/…@„'Â>áû€ðC@xMã”ùB[õÿ™ /i ‚ÿ@h ¡ü?ZXØB™×A ä¥P»ê¯ƒ@Øü¥PBƒ×ÁlO€ð{Xx&ý×ÁlM€ðkâáá¡j@ø- üo¨‚Jž:"g ÌþÙ—„ 7VAO>ä9³ú[C!·PB³1©!êå¢`6%5 ìl!ž.ûãÅdy),œ „Ù.&CÈKáéD!­ ÎeÿøËCˆ…»® Îe?À­ÑÊZ¨¡“‚’‚ e2RPÀ‘2¶µO—- î ·„{Â]á÷̤„X(—‚ŽT‚°§…Z(¨÷:è¡ÝK!~(BA­×Á º½ªY(aŒ‚@ø”À<!®¤ >%ð ‹b ”²PBK5)!&娠"Å lh¡„a JBxöœ„Pã!žŠ‚ ç┃ðü“Ÿ†Pã1…A(ba>„½¬!Z×XÁ:bቒ!ŒTߥñOBØÜÂPð]O²(Ât 3!ôVP¢baHÖ ÊðQÂV¦A¬ ~Hã9^‹…°¡…Ñ á‡4žä±`-L€0ž@a AXÃÂ&&(ª`)KX˜Âa4„) áçdåµ Ë[˜£ ~NæaK0ÞÂ8³¢ ’¥!̳°$‡iPPÉŽÂ&ZÉa„(ø¦ ¶ù<„bô^ ®uÉ¢\¡Ø#=VÞÂá&8„[Rz ×ò œrç0“À) Ü’Ò#=–áÔhB˜Nà(ÅÜh¡€…¦æ8FA15ÊC¨`áP‡@¨@à”öë`E«¾ιp(Aà”îë`M‹¾ÎàðbutxÂ]ÉX(Ρꯃ@¸+ /çð¥ü›¥ m ³pJGD-ÿ¦†Ý›bd4PÍ©KD<¡ S}¼ BÉ'[MÏ©,ý›ê¢àuJ>ÛK‚Nñ„²þÍáôžl5UçbDÔõo¤÷l/ÉB8w@ÄMêË·ÌDÁÒ6·pÙU.È·Ì@Áâö¶pÙy!÷µ ªZÑB7 Û5ò–””¢„v~­„cTµ¢%„X(ÛàûQRІ³°„=¼BáG|ªÕQÁK!~ȵÊXXÂá +ÑB,”jü¨jD[ËXXBC{@ˆ…2S° „X¸-{#Ô&¢=„X˜^È=( Ds Xè ¡­‚m ÄÂúY*ØB,Ü1„A Ê¿(]¡ü³~ ㋺û´_“.…Pþißçk¡+„Î 6ƒ Ëæª`;±ð[–š+ØB,,˜±‚!Ä™AGà” @¸Ž+öšs@_óâÐ B\íZ}žûkX8"\éj}žücFÚ@­ @ø>,¼¶ð{Í„ |—‹…&8PƒÆæX‡—”q ;ˆ}!LšA}¥!Ì!ЂË!t[€Áá±’®0+@è¶RæPÂ4ÝÂÍaáÞòn.+€pc²*B˜IàX€ðoÉb·”za<@ø“=ƒ‚jA˜Làp€ðVþŸ[Ï>iºe_Rƒþ+{¥8T0Ÿ@Ûë„¶‹±7S'”ÀÅäyùÐv9ö$Âa>„F\ü@ø’ÀþMãf&qœ9 |NcÓ9LƒPÅ¿9Û7 A:/ÉáÄÎäð4ü›³}ÿ¡ó¢*KÄå4ý1†Poÿ¦w>¯OŒ@ó—c%g0žÃ8ý› Z |“ÞÞR=±ÇÓóo*ä¨áÛTg0Lıêâ7çÙƒ°Äò\•üI~›*~sþWýHK,Ð Eñz ð›‹ûT¿%?‡‹ôO¸<~sQ' ¿ç3ƒ—£x „NøÍU¹ã‡BXh¥sò}ð›«rưÐJ èwChiÞk¡¿!„›3œÃµFψ¡y¯, ÜQ‰Ü«ã„Eû\·E€pg%Fñ[ïf­rŸ ?R@¸»3¸Äò×Ïï?©?Ll/õÑ]6Jªâ•>¢ 'S'sþ—€ðhæ°K' ×fÛ@X÷.€°ôúQTuoòK¯`v ÌüßRÂ+ê1Š•Ë;=@xMÕg°:„ îï{¬% ¨ÁíaǪ̃.„ÉT#îÔ„AØiQéŠRKäa „°Ó²VB‰?°„Ã*:Š¥8(@8°r3XBC|L"!l¹À´3#|@b!l¹Äƒ+¡ÀÙø[ô †°ñJÓ·4NFü¹‡°ñZ©„GâÆVe½S:@ÿ šC¨tþ–p"â!dáéžØQH9²ôWæ ¡Ø¸•sR dº'¹ýY›Ÿ!ÛpYnJîû- ”ÉpmÞx ÊjM Þî[iÛž!ÛÒ+ùÍNÜê<Ù˜kÒ†P~‹oenu"„lQýL68w{S!d“.HB“m½•¼½¹²]5³ÚÔô-͆ ;› „Vû¸(KÓ!d÷Šä¹‹ {(!ûwªT=7n‘Ä*@Èfºf¾m"›¦!Ûy¼XÍ·é1‘Tíõ¨Ð&él‘ „lðÁFBXhG^Ò™A!Ùs¹êî‡Ôn(AÈ®é"ë®üZR3¨!g!­N뮳êSbrv÷ÂN‹¹-µü„pгóܱ³Ã:>¦8ŠNqz{z~ýüÑø­Qƒ4gPB¦.Otu!d ·„[’Àe§D:ŸôJC8Å~ ¿&>ƒê2…t2õ 4€)ü~H, œbioèáS¸¾Ëem d iW6è!S¸¾f4€?^N1ˆô9³ 4ƒpŠ)|—Ù à#„S "½f9–N1…ÿBßéû—)„sÌ"yO 1„sݧ°9„îøS婔įµ X©¾SØÂÓ÷¯ÎõÅN•šÀ:ε›ÂnÀŸzNµÄ6œÀ‚N5šÂ–½{%!\Öh‹V|ËB¸¬ø†°üôý«<„sÅg±\]&°„s5§°„}Fï^—ÕGÿ:N`/—Õ™Bw{ÎÝC=!|ªÎDºÅ6†ð)ã)´ƒ¹{_3žHù˜À×€p-§)‡¡ûnÉi(•b·„ÛÒB·ãá™tG36&ðL@x®ü) ƒAŽ+@¯‹ Ž,b @È@i„j\&P- ÔkßþúùÃz„D¹¡{@hå„î¡}@H”º„ö!Qn@èÚ„D¹¡{@hå„î¡}@H”º„ö!Qn@èÚ„D¹¡{@hå„î¡}@H”º„ö!Qn@èÚ„D¹¡{@hå„î¡}@H”º„ö!Qn@èÚ„D¹¡{@hå„î¡}@H”º÷ÿá¸R endstream endobj 2553 0 obj << /Filter /FlateDecode /Length 227 >> stream xœ]1nÃ0 EwB7ð·˜`pI– -ж°%:ðYPœ¡·/H':<OÒÈßœ.çKžWß|Ô%~Éê§9§*÷åQ£øQ®svmðiŽëÓ쌷¡¸æô6”ïŸ">ø$ÓæïÃMšÏ°Ý´[&.IîeˆR‡|×ÜO;ÉéßSûLŒÓókèØBÇ®G6€pTÙÂÈ®'°T[6jUUb RݱÐNuÏ@{ÕT;6êl×¼º‘VójÂÇG­’WëÏúÑ^æ,—¥hÊKNî±½r= endstream endobj 2554 0 obj << /Filter /FlateDecode /Length 159 >> stream xœ]1Â0 E÷œÂ7HÖªKY:€p4ù©2àDi:p{”´EˆÁ–ìÿ¿ü,‡ñ<²Ï$o)˜29Ï6a k2  ³gÑ*²Þä}ªÝ¼tr¸èø|G" ·ÍWý‚¼«SÝ´[Æ‹%jƒ¤y†èš¦ïœëØþI{`r?ÎRJµªú¥D Ãq’Ìš8WÐ R<ãûK ±¤lÅêRê endstream endobj 2555 0 obj << /Filter /FlateDecode /Length 195 >> stream xœ]A E÷œ‚tĴՄ̦n\hŒz Câ”`»ðö†©uáâ‘|˜Ïü™ª;ŸÎ1̲ºåÉ>h–>D—é5-Ù’ìiQì”tÁÎ_ŧMUw1éùN$•täW}5#UwUóÍnõØÉÑ+KÙÄ„@í= Šîï©^ ½ÿVî 2ŠPè} €²(tÓ Ð4(t{@ =yD =r¯í×Ò¶äßâJ»äLqæ!yˆ>Dúí!M©¸$E'>×Ý`ˆ endstream endobj 2558 0 obj << /Length 711 /Filter /FlateDecode >> stream xÚT]oÚ0}çWD]'Áâ›|í2i´Ý´iC[‡´ƃIp—ÄiâPدŸ›4´ÐMHøÚ>9÷Ü_d@ñCÆCDZÇîÈÓ¬O‹•¡ŒÛ¤q–Z-ädÖéð<A{ ÇȘÅmªYdÌ»WkœsRô,Çqº£‹žåº^w‚K¢NRÖ³£nT%¤Ö¢aù~o1ûܹ™5޽Áà?Jäs‰þ‰þPlG®’‘W ÏIö z-s± K)APZȱ‘‡R@zƒ×Ñð·ØË‡¿_†r ]xgBÛ{“ÐŒ<Ј¯¥·°* ’ißOœ6Dó…¢ú†Â9 î+œqú‡H‚ÉÏ[L³%{É™¾íÀ¢Z²*‹JÅUàlEšâUMƒ÷g)jKàLövŒOÇØï+®¯øŽÊ YÆYU”ÇRRœìC¹ÚठªŒÆ¬H¥€ZÒ h oÁ5Ý”§Ò¸Y;T1Hå53˜–“ó½.˪s£ëf–"… qn.Ɇ$wŒžÎZ%ÍžEYï¤o+;’•õN-HòÑßNF(%í"‘š=ã Ix©-µ¼m¥ÓNH¶âk iˆiÒÆ9B¶ë¹‡äµ[ç"!‘ôÒªFÍ7§   -@¤«1GÒ\<&Ì:`ÿG}—ê£ËÉZlñ–Jðì|{~&Œ‹¦±|!1—Å-^² xQ‘S­³{$Ù ùé-]­9¨ÿ_dikÉÕûPD±\¶`'Ñ‚³îa‹¶âòâÇ<7¥)&Pï´¹>Þ"}§ôì_`íÝõìVPjÉJÇkó´Q,$Lù|@Èbí¿à&09hï› Š|hC1ÒÝ¡ðãÊÚÿ”¡qÍ:ßOLS„F¶ïéìÒ4g…nW1óòõÑÆn£t"•ª ÓÔHþ <Ùe endstream endobj 2560 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./imagecontour.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2561 0 R /BBox [0 0 291.9 219.04] /Resources << /ProcSet [ /PDF /ImageC /Text ] /ExtGState << /R8 2562 0 R >>/XObject << /R10 2563 0 R /R7 2564 0 R >>/Font << /R11 2566 0 R /R15 2568 0 R /R13 2570 0 R >> >> /Length 65255 /Filter /FlateDecode >> stream xœ\½I®lÍÑ$6ÿVq7 SáÑÇ\€Æ*.Aƒ*?!4Ðö3o“à€|Æ›™§‰ððÆÜüýµOþþcÿýýûŸÿõ'w·ïòßÿ›ýï>ö7ÎùëÒÇ·ðgÿí¿Ÿ¿ÿýÿùçÿüç¿ý÷û÷?þߤ}­5ùûÿþéÿ÷?íïÿøG?³þäÎûÝñ÷ïúlßí3ÿú§Oùúì†t"ëÛW­ò¾³íOæ²Ú÷ìOÆ%0¿wí{Û"r¿±ódË×e)¢_³ç×ïS¤éßìoŸ dÛ§NÿšYßã§ÎøÖ›ŠìGd~G¿y}üñÛ¾9 L»ÀÛ¿ùø5—®ÈÕ›ßå×Üñ­!Š~ÏÃ3åßôOø7ÿƒ—,ßRd­ í[ú©ó 1„ŸM¾ÕpÉã~w™ß8ø­q¾·ˆ¼ï>"üißmø¡±¾­ˆ|}LEø é_G>¾!ç»ú­]_ïèí^ËïN"óx™ýéƒ}mEDÿä}SpÛý|“3pox }Oˆôos™ô¥ojŒýíÆoßæŽû>šÞ¿ÉOÍþÍ ìí늜o >%Û®KˆŸ’mß3ï'ã(²üoú³¿™üõ5¾Ýp…Òõåu¾Ñq…í}¯¹öÊÛýö?ÕÎ'|Ê{~¯ªÍoñi`MüVë¿f߿ݚ}æÈ7°«Î;özÏÐu|ÞúXßÀø:/ï\}ç5ûÐm_?çOνº’Æí߯Û;'²t»žÛíîÖ…rnÓ <.~ç<ûg[þœõ-~âáÎð­Ç_›ß^[‘¶ 9ײŸ­Ï·¾¶ž"S¿ç~ý. ¶ËfkX/rvûö$ ö5ë~«ßå߬©h6Ø"]WÛlë[K€È7ô{Î×?>Ï÷üøÜ_׿yßê=³ˆ4,V9ã}‡?%ã“…§7æ×»!ëàCcèËrø^†=á)ÛK¶À–ÿ“Ó÷7ìßéCÍ”ûõ*Ï®N®®¢#¶á§¼o|ÌOø)l ý”èëž]ðNå´¥&ÀÛ¸í6õmÏÞíA´ùMGæÂ·þ >¬nw¹ß¶Óv­ì·ì½ôùµ±€ŒïMCïýô·×'°ªûn]7@h1÷j:€\~¦}¼ïO:>tÌr¡ ا'²Æ"jÑÁßìómÿ›ûð=Û_LQÛ@lÇ'‚Ãçß]?_³üUÅOÍ÷s-sþçõâXø¹¥ñürí®qàþ>˜1üÅùÃíïçùöûózWƒï¨Ë×ÞÏk”§ga¼ê-óë£.‡-ý“[—ÌùŽ#XUì­ÙÂÛm~ûÔŹ›oJ_Àë]5˱ȼ]7Âzã“S¶Êzí«{iÝ™[’ÛmÝñÝS·$9ë¶]·›¡±½Î¶-é›ù­] Ä:Í®ÎÈÚæÙ„¡Y{}}Wc´öüäÇ`­ O¤µµîתÝ[Ë|”0ku7±f>×ô“ÆMìš~ι¢g›j ¼ó0çkŠú¼Üq¾±êq°ÆÒ·GÆö„ãXY£é뎣gõ«¶3ާ…ó}Õ#lõ¡4N¹¥·èÇà’ûYNÊ…Súç,]2¿YÛ%ÝN?’W{ö!?¶W;v~´¯¶á«–ãáuíê",Ó£º@Z¯®Æ|~ʹ;d÷ê²Ì·uã†[3ßT‡À=Ÿùº}{G¯kTj^3áeÑ tOl^óÝY›wÛÕ¸?7±võùæ戹_8¯¨q׈TïrÞ¦Ö>ÜO ´¸á¢ÎsÍu7vžã²¹ºólõð•.óu¾Ýåï´ñ5. XpTø˜´~þN{܆@ö·Ÿü\ž†àC2¿%Û9ñ7÷[ïÒ×ýƒkÕháˆÌMd®ñƒœïÙ%2ú7æÏ÷À«Û?¿5Î×ÛÏõà0$Œkžý[íÖû‚‰„·>]‹òx<È[áYë»2Êc†cÜÛ(¯âìA$_×Ù‹ÿÏÅ+={]¿Ù^û98åù© wáþ3ÕÊ«À쎌Ñÿ´¥êß½çïÀdècÆé{ÿ¬Jçoß krîᙩ€~Æ6À£_øþã´¡r>ãaÐÕ÷yß×nÿ»M¾)ÓØA„W¸(Ep—@Ž.Ê×þ.,»þ£s‡ ®úÀTùwE¾M÷á¸}÷ïÊ¢“¥ÈãßœoéŸèG(úh…Þ»Ÿìù‡pµÙO½o´õwûü„?% >þn¿t‰tœ¢w4®9"ՃȅwdzULß3ž=N"‹ÀÞþï-®("xDHsà©YŸ¬?&ohê¥ÉFÌtW³—- ‡üÝåÏWZoð/îR/•Þÿß]÷“¥¿Õ'¢fdŸ&Ÿ—´ÿéïîN‡ˆÈùXŸïAŒ4þî><4‰0ÔºûÙ»”66Ò=ƒžÈã]œÉÈìðgîÙ¶[¥Í‰€öbߨ]Ì…q±'º>‰‡ùw¯ïzikâ<¹w«³$m-ì rAÀ^çZ8¬«?„pöýÝûxh™|y¯s[Ùüi†÷úÊÂûm5‘þí¿û6] p~ÿîCúK¿æœOäï>xPz߇™ºû^\Î8YâÔg ïþ=øêC\“ þ¼~ϼÏ×Ö'öÔ‘noW¿‰¨õ•† Á7Ÿo1Ï"ÒÞêÃò]†0úyí}‡VSÙ”ñ÷¤ùj8ìëï!âÐ}$Âñ1(ÑO ]®'Ãßž .YDæ do"ëBÿÈ3àÂo|7* =ŠD†èÃÿ×oëa÷ÐÝÑ\DB@¦ÀYzrÌjŠL†1@ÆÖ‡'óÙv«;bÆ@Ö€'ùä~mëõ¬ƒ4®/P¶`Ó±m,››Ÿˆ~ho¾›Ž`«ý{þ| ¼²ûóC—Y¬z18îÏßåˆßÔ½p<ê?µªáÌûy€\èõ!÷ÆÌ`y½ï½ú²:–¬ÔÚá¾ÎòλÀ[¬Ë¢cÕ•຺zoúÛ±;BïºH;bÿ^rï‡Ë-{ò½ºú˜|6¹gàÁõW÷½<©{ÈuöÙ¿S·pGHsê6‡ƒ¹¤š8¡§WsÑ×þæª&¥¯GÙf§ï†Àµ˜¦¾^U±^g\š·G¸WØÕw/f²=yÒ”öƒ¥X¬-€5‹=@cë»ßY-z¿‡63­~¿ïõ`èO¾^ÏŽþm–ãqKõê8éG=¦Ãüz”!"Â3Éãn4=lóH¹…rl"ÖÚ?Gë@¨¿CôÌÉ#aÛ<Ævq=éGçv/ÞÂÅ7«Ç0:<¼âT·ÈÜÕ5ýòŠÓ}Aô ÷ ]D¸òã¡tºJc,عt§ˆ¼U\.¾rze‚èË57³!NçNÆäÙÒ”1_÷ ¼[\H“iÖt3‰ÌS\Q“û=ÝUAB€¬»´‚¤ÁÞéõʘxrÅ1–±JúÎDø!w¯e,Ƭé‚»¸éDæJOžÀÝÅÙ$>àìG@ cÍa„ Dæ(…Œ…œP >ˆ¬Y"o” FÆbª="ˆ ""‚+Œ€‰È›%¨¤o¤^Dú+Á‘Qâ7"Ä À£Àø’ˆã‡"šŒ‹‰ˆ3.8¢Ò¸©ˆ\ãÆ=¸gñ¯?¿Œ‘ýgíï!cmWûû̘Ýß¹Çõ¹,öÅÁµÊÒÙ<¹ãS½ÿ!oVß–à>óË5ÙÎÒðv ØJÞHW¬YûÞ›9äÜLºŸQ6Í^ÉöÜX{¡.tÊæcÖÝ®nP m޲‡÷’Ï÷·ùž–[rK€Ô¼ìY¬2ñÏí Êáá˜ÑÙ¡À(† ÉùÓG1^{È·õì2·ûÑ £ÛÀÝÃU1;‰ü|1·sÿm‰£Çì-¤j’  f{Ë {«¦}ãè8Åúï†åûʱۊW®‡Ènã›öfô Ù ÙÝQ#dì·ý¸X ½a<Ô“™§|Hâï¶Êá¸îý†Zi;@Îm}ŸvÈ®;ó ^W¾½gžÒë`ɽ<Ç×9¾Dì¨G’¿_q_`ž–ú ‡¶9DêNÙé`ÌNĬ³y%@ºyê¹  ð^/ÞÍÚã;jàþ à_¢þÑÂ9¯ß¡.ÔZÏÍœ¹Y¨Ø)`®ØZá#›»¶``ìZÔ¥[Ø;ºZÍí[ˆÌk¦g¸–øÙkÎãÂWÏÄL Ë.PP fuÍQ]øþ¥Î}Y”(ÂG¦»‹òC3ÇP]â…¼å4'^óšÓ·Ž9Ö@üCê|¯ÙãÕÑ?0ô¸1ˆ? õòQè0çQ5ó.5Xâ~«@ÌS± cç^³&@Ìq²àeð‘-À2‡…< ‚€xP«j/zK°#Óâ- ,kHÆzÍ­Qõ´-°ûAûý Œë÷h Y~JÃÌz5Š– ÖhµÞ“F´õ¾5ê­ÏF#ãúü4z®ÏX#ìú4 /ïÊ"õò>-˜ÏWnñ~Y–(+ÇòeqYn¡,@Ë?”Ej9вŽ-QÖºå:Ê~°|HÙ2–3)ÛÊò*eëYî¥lOËÏ”-l9œ²Ë-ÏS,傊µ°|Q±(–S*VGÓNÅ0Yf*m—%¯Šy³W±–+6ÒeÅŽZ.­ØZK·{l¹b³-kWìºeöŠá·ì_9,CXÎË"–#Æ2vY&²œP–­,§˜e4ËIgYÏrZf´œ˜–=-§ªeXËÉkYØr:[¦¶œà–Í-§¼e|‹#`Yáâ,hÞ¸ø–Z.>‡¥Ÿ‹_b)êâ»X»ø7–êȳáé%yÆ<=)Ϫ§·å‰÷ôÈ<9Ÿ^›'ðÓ³ó$8(„kè‚ô½Š¦WÒ õjDzª^±HoÖ‹éñZÝ#b«Œ¤ßìÅ“p­½¾’Þ·×`ÒC÷2MzñÿYÁû¯þç?ÿú§·w>¹Qëû72“J=&GjͰ]ÖÊK]æä¼Zzl·ã¨(åIG´‚Ùβ_÷*'Ì kÉQ m°»VKaPî­Õ¶¢T]Û"‰¥TfÛâodñ¶­ëVê»m œçRn0ª«Ö‰°µä†ÈbÖzsCh±jMºáÜü©[Ãz°ìµí6ºýº×¿a/øx¼FÞØ»ÔÑ;¬Ã™¥ÖNDËú~£ð÷W©Øw˜Ö…½ªß›“•ÿÞ¡ŽÂè 9ÇÂèØæJ0ŽAomBo­é›r¢‚¼·qT&™AÞ›øÿ‚ï ï‘‘””y4ª…6!ï.}žN­ 2¥Ð/ˆ`áECPà|•Æ!,ÜöBõw&ßxÐAä2À’2"GP¡•ÈÆîÉ<‘·'.5É)òvçó þŠ<¸ð× .òÙhÉ€‘·ßd°dä­ñõʤ‘·øÞ“m#¼i)Œyà;ÏÂÚ‘.ó*ÌyS·}0ä!g'…$®Ù+ "Eza™•‰$o,½fg+ÉCyZÎh’7”4¤'yý}§ð¢äõû‘¾äÜ) …\%„ÉQXòpÚŽ–>'Áæó5žl¾§Òækrºm¾JgäÆëÖ®¯ˆ öÆ¢ òo,¬ Çâ q,ÐàÇ".r,ôà+ÇfNsì§=Ç– btl»àNÇÖ ~µïÞ `Çšv`r»²w˜’ „«­ Æx£`•»½ ây˜´ §‡Ù {˜Æà¸‡ù |˜Øàʇ>}˜êà܇9^~˜üàîDZÜþ8:‚ÿÇKôÄ}qLE¯AeÑg·,Äq] qdFçCœªÞo´OÄá-q€GFòѪŽ@´s„³-áPD[H8Ñ:ŽI´—„ó-(áßD›Jø@ÑÊ~R´»¨#ý0áiEÏŒ;cÑVþZ´Þ„OÝ9á÷EOø†Ñåî£7…‡½Bá…j3Q¸©Ñm®lt$…»]Kágg“»ÍÙýä®uvH¹û]Tî¢g§•»ñÙå®~vly4M]0dß—ÙæGöyp’=fÀdš9Ù«æPö³y°”=oPe[œ]Ù:çYv×yð–xàò¯$x¾Á¬è¿I %ÞdŽ ÙDæ˜ÌQ û‚ŽÀ©U ÖʇD÷S¤kWö…RÙ°°—ºØ7ˆWÝ0k»+2WeÞÑÐãl&Lä¡’rŒÀ»å(2+ë€~èNÅ´Þúã¨àHÂ8"ưù×Ûôî1D²Àw+Bçt`Gë7í§sz3ezã(†eÒ•&­YPž?mU*5Ž(¾tT]PÝ–‡DÙé 1ž"|:ÁãæQG™l~q§;E2øz È©„ñ×åSN¹0³Á#U¹þãÚ#–«G2T͉hØÓ׉p¹ØÄ‰Þsikœ€õÔ‡£ Üþew8z}«ìJÓÒí¶×cö‹~‹öí‚ëßcËêkµëlšií,BË27¸,Úøë]GÞ'sá­z· íõ.ž¥›û"Kj>ƒ6,^m)¦ykØêD¦uÒàÔc'3Úšô¬A‘!Ö5¼½Kf0§,àÏhƒÓ8vO»O?ôXˆ»Å>„`—w CÅ›šÖ1t×ÖÈxÎmŸBˆ~ yIb÷½š·#›‰˜ð é=Ì­‹s®ÉŒ\žAL€£Ç6i-k‹ÂAª­SÛ;c‡AsË'§—{ÂwÔÖÞöi—©iˆÞÕ¦Ûþn]¹Óú¢ÐLsŽ:%ÚA†àF{^Ÿ¾ï3¬Û×}$d¼hV.Öoá\[$íØ»C«ý÷ЈLûmMrEÚ½i9N:ƒÚ(—tîâ0"U¥­Øú©m­²÷Yÿ"–èì»·ŠìU£?}¯ÿÖùŒ÷¹ÛÚÆîSçùŠn×HKßé«ÎŽ[x›â{g·ž¾ÁìwzîHqi“ë±&··­”møàId“ëÛÚ±D·&kq3Âó¶…/F}G¯æi{M„,È‚u>?Ä4×ÃÛ„ƒÓ‰ˆ5{h´Z×Ýy`û‘A*§œ±ô=9ÚÂjQ·ʀϓR eö£çÈÚêˆ,¾Ô;ôrö'l±•§I  Ñæ5@;V=ü\ŒÄñHªvC´¸Y&s5e&e¨ D/7< ¡ÉÜïêSFþE¸Œ³WSš ìgþ)¦b°‚–ØõÐ/Ñ¢ìÛ튥}c åpEW$5j[+³4¿0VS@¸Ô#OD.æ2hïˆðÇ·?ã@,%R€¡Ç~~ÍvßñS´7y-sÚ»ôËÕÂZ½#Ïðä]¥;3ŸÌ˜j_âáy2)/m×Ïè–|Ï·äI«|“g}ÛH~µ]WDdÌbÕìö|¿ØÊB•mü¬¾ÈÎÅÝMbr #É·^]çHGx9‘Œí‚Â`uK-ÄcÛE2¶æbe¨nßņ˺Å#fiÒ톦‚™Ô^ÍI¶²ºÉAW ½›%ù˜Ãti³š·Èü†r‹DÜŒ¦™ÑÈ1‡©EQ¾I5ÇK{ÔÝ^GzÛ-:2à½ÚüÕ㤰s©õ8M¸Ê#ÙçËêqRLomí~šØ9yþ8Ë–Xhç—ïªg"‹ ~’òÜŒ²Cœ­@ÔÊûù‹7¯wîgt=âŸO‘8éñ`µÑÞœùÄ4 Ì]ˆ²MxxácŒgˆùæ™D™)¼V«fõpæyÖ¹nNJe¬J†Ÿe¹ð¥PË“Uý-V$¥¸ds/»m÷Ú&¼¿^=;\–âîýM[~<Ĺ\¹À½È ïOŠ£‰‹Ðê¾(.ÂäÌ_ÅUb>í„÷'Õï³gs=}㉌ȭîó…Fª‡=uY» Ž‹—œà"™cèëvG~Mpgˆ®k&"Ñ/ື·¥3¤€ÔÀ©Qt,V±È k×è… ÿ·F83b?‚€Ì]#%"£SDj¼…Û?ýãÓ3Ó¶¡ÖÈ@?äÑš÷ïOxd×rj†¿D™ìæÿÑ‚b±©«xŽó'ž%âýâÚÊÜ\¡Åãb Í{Á;ãa¿Ñ ×ÿ†!8¸¦јÖCy訊‹Gû@¢;voQ/Ðs…©i…¡ØóÞϪ¹ ¼xí(÷ü”˜IÕ¡ñ<ÈEó§ˆvÿ{:ˆÔŒË¸×2¢ž•×^fdn€œŸìΠý¯ HhÞϳD@æO" H¯¹&,Ì3j> ˆ~ÈsV\¼»æµÆµ…¹/ §fÇ(+À3h@ÆO#8k×DܸC—~äêˆTÙ-úl<ãDŸÍl$¿+RûÀø×?ÌB€´½šJa“=’Q‚Ák‹Å1–{Ðfõß$)),@@¾ÃøVàØí{Èø2h¥’à{~¿É6|EÐï€J˜2ù/¬^Èô×VÎQ"²²IÉ—é‚%´} ¸a„Ú2d [ÂŒ²"x¿Ù"DîdRó!0¸Yð^Tí»~‰gbãw¢ç!®eŠüq¹à[®Qo)Ú+â¶™QßõÉ,1>?½låð'|«^ÞÂÙÞûæo*ÛFüm"¾\öÂâ™)eMdËŠ¯›s”X•K «ÛgY~ÙãKô`OÅÅ2F `ÛM×zð”䀫‰Îx渓¦ÏæÑ€ßfQ8F”Vs5ä—åÓe˜ŠÈs¸Çrý…Øj}NÝ{±ûd»ìXW[ÈMHJ¹ñÙâ·«q°6Àb@ &ÓžF¦ã¨\Õ¡$m•µ${»8mÂ^ù±‹Öþ˜¦RkíãJàVûk}—ÅF£5óžjÇû³"l=”ßÖ¨ç5€–3£?;!â\ȈzöXûiOƒmþõêx—S޽¯õ ´fØrXéÌ]¶“‰3×q˱<:£Žrt#SƒGá‡ûƒ—›Ç¿õùžõŠAäUWûŸÓÑ.êQÜAþiW—†ÛX8áöx»xºFl2‡òI¸OÚ:¿‹‹%H™Áü‡&cwži᪠mÕäëp_îñÉPö_ø„MÈYÝFTá(®¥ŒÃî³t?ÉCö„‹*¨<§¸±KjÀ¸«ËlKq†™ ‚Kþ2ZXûáSkÒk·›‰±õ#»B¡Î—Î;3rmÿ^3{?ZOPE,q‚ ¸Ž·ÄÈ4–`Cã]R”O OÊÅCæEW kˆì±"³DFŠÜ<1K•èÅœÚ2YÔN¹Æ§"Ncn‘NÄr2Ñ„¾«¶ D°G„¹Y(qè„Ah,…M¦‚34­ˆi‹ 9ߥê˜y¯DÁÌ•SëÄ#eE~tL4Ÿž·¯å‚Zn2w"ȤŒ õ{–€ æ 's2Á¸¬i"Y#ÕÀ’´X"¡e©ª%@VIj Ð€ü`æ=ˆ@˜/EK€ ÙÙ™pè_I° )P6Œ$ (’¤Ž Y“9,|ŒW>D~dL&“ä%o$¨âŒYRKDïIÕ ¯—«.ZŒ4‘Qe‰ìSÒaDÎ()3"PïHÕ’É\kI½UDI}WÑ ãdޝš $UKñdbE¬Ø*eKüj"o™Èˆ]cw•²%~ç‘#§ãiT€E¶ÄrfcýEdÆÖ_V‘-±š™_é™¶uQ4JlédŽÙ—W¤¡}[¥™Íö•ìï\í U¸ÉÑQTKl×ìg m¬²L¶ùŠj‰mÐòæ,{xO­ä>/"%f 6záo5l‰µM£&¥ˆ”˜ÙÙ ¤˜&tèÚ ¦ñ¿Í]1ûVzxÍ H; ªE±œÉ~a³· ZX»|A|MªÝ.ÍÊf×Ñödn™Ùþõ~N 6XßX“z†”æi;gÖËCÏ¢…¢•J[ü³uÛÎ4°/|ý빇q?ôldÓ¸-'=?K¹±àcØc×cýéöõ .-ì“=îˆHz9êÑçbJê¬-L̦ËMøæU‰¡]Cæx€wqdç¤È˜³¬ž”NÎBrÐ|au„ ~ðLXŠ®RÊ,˜3ýs_Ôß";ämÔ'[c†¦•úm ÞŸ~‹ºv$lÌêþ­~âžÔCD¿¤˜{ªN$z*»Ý¥:š‹=ôúSꌂ°áŸR‡Í›¡rES±d„HýÞ…<†=sõAc’Ôî:ëÄ¡cRTêcƒÍãZ7ꇓÍÓ«R‹AÍŸ Ç6«ùülˆu©3Æʹ1„±ÂÒèb‘l5Æ¥€4JÄ£ d@¡1cÁ©=#¤IÄõÆ35¬šj‹-ì[Æ%‡42#{Ä´Ð4z›WsÝ¡;ÚNQ‹x\«Q"¡5’œ”ZÖ¸Q£Mpg\mG#RpgŽEºµ‚‚òA lÑïÑØ¤ó¦,>F[º\Cƒ¦âbg“acùʼnœ¯ñÈVcz°[ÌÒYÜ޹e–bn™å&”ÙLDQs àĘj˜å!@Þ1!FMULJ’W±²yNÍx13kI‘¹®Gš7àršZâú:š~™ìùµ$S4äã”$þíB>Ló°=f™ ðˆ\‰É"Í.W“Iàô¸£&œ€xþC“R@L¾HóV #Ù¢°ÜW«ÕüKÐXŠŒ$¦f©6¦Ñ@2oÞRm@Bˆé8 ¶ô-eGÄ”i4­Ä»eþ€ SanPš=üA˜`üE~¾C3”õw4‹Y¯E3õz5ZïI3¦õ¾5©ZŸ&^ëóÓäl}ÆšÀ­ïA“¼ùª4 \^¦¥‰Ë ·TrY–n.ëÆRÒemYÚº,?KmçµìwYÖ!/ëܲèe/X¢½lKÆ—-eùú²í,§_¶¦¦ýsóZa ìo+`†b'¬Ql‰*нÑZF1IVî(fËJ"Å´YÙ¤˜?+­iÕ—bF­@SL­qŠ9¶BO1ÙV *fÝ FÅô[Q©Vx*Gˆ§Ê1c,;†¬¾UŽ)«•£ÌêdvÔY­…Vk+§¥Õãʉj%»rêZY¯œÌVú+§·Ë oÄô¼È˜ž‚"Ó›ðDuz(f¦GâÅÎôZ¼ šžMÓûñÂjzH^|M/Ê ´áhy 7}1¯ó¦¿æµàôé¼\œ~ŸW”Ó7ôªsú^™NÓ«×á†z;=U/‚§7ë…òpx½”.±WÛÓi¶‚|úÕ^³OßÛÊúéž{á?]x'¤›ï‚ˆœcÁ‚ó2 p®BNgȨÄ)¸¼^ÂãKdàcŒŠŒœt‘ñ“ñ22ÄrêF†aNïÈPÍ) Î9M$C>c’dTèd“ŒŒ’Ñ¥V2uRKF©Æ{É@Ö©1ì:}&b§ØdÐì4œ ¬ª“Á·Óy")âP-öR´E"YÈT>˜•©êNfî¨bË.|ga-¶P¢)Ëð¤Ð¦C¨!¨ÕDö-ôkÁ1‡&‘ h§U ñ‹k¢WNõVä:xHRcœ²íV¹àTÛ¯0ÏåÁµêINŒà¯ËÓö×ä¸ j‰ü£Á‡8ÇL —Å^ dÓSdŽ$Ü«2È*œüÐ Þ>Ê•9·Ÿ*$JÁ.¯eJ%Ñ# oP^*û( ÀGa­ì×ç{7‚«­x¿ÛãÇ.- ÞŸm. ãÑN‰”BƒØôæ ¶š÷Ò|":Ñ Á¾rªÁy›Ä×+è/ ƒK¥<ïON…óŽv{óv¼éDPêÃàÈhL2zoi^a77§7¸È½G?åM0rï2Äe´û–^voKí·ÌCø…ÆþmíÒ±¾¹G…€¢µHéýa;7_´÷ æ!°kÇ{ˆØÎýjŸ‘ܽ­9É%äÐá­ÝIÖ®$¨"®ÚÑÄïWšž8çV%ÅàPV\«ôN F&ÌÒ^E`Ô,E¤´ia‡·rÉUqôl÷ÌY¸UùíÎg2nÖ5Fqv{yg;DZýSê½ä§t¨¹4Iv±© JÏF7­¶Â±ßœ÷`wÿ4¥5”=Ϩ¢nWÙ”élÓ¶=çGÓHíþ#‘žÞ!(w(ƒ(º‰È®&EŒÒŒHõŽðô†EU¸©ó9‰p4¨7>z{|6GR)‡c4CÆ »ðBí#(Øñç˜D`RÇ ¢<ˆó†N"c—¦OJùì›}¡(ÑÂn·ë)í¥l×_»´ uÚ*‘vK++{ú9QÖÛ]‰ŒYuÜ.çÁ–¶Yöýsl«·Öáô×r»šžË]E¤4ñQ¹7—rCiû–^à ÌáŒg|`ÝÒoüƒøm;bJnxgsA¬û9'”ÜüR¼‰ºã÷~BÇ-îÙÛµó¹xKw>»Ðq‹çëáù¼y<ßS¹Å»ô&ôxßѨk"uÛ|ÝDÃ{¬­hŠõ—ºm¾D½·>Vq´ßÇJýØ )äæ;Æ;ýcS…@l¼róÍ¢±Cx 6yê¶¹!·¡qæ$¥ÛÜä„VB˜¥ÐSÓš aÞR»Í- K7„‘ u‡0¤)ÝæÆ6D"~[“f±S¨ÍºëQ„ÝÅŠ8BÕ"ÎÔió3&Ô1â  ?ªR•ÍO³âˆ/Ä:âT A89S–Í×Љó7´CâŒN 6?Æ]‚$NúP) o ”LÂc±“ð*B%<ÐL ï$tUÔ} á•ðoBœ%| p ?)4^— ˜ð·B+&|²Ð“ ¿-$g· YšðÿBº&|Ä· ?2$pÂ× ™œðGCIGÖÚ 6äxÂë ÉžðŒCÖÇgþ ßÚ¥Âýõ wÐ]_(\ø 7?dŠ<p!£Tè(B BŠh#´’"" =¥ˆZBs)"›ÐeŠè'´›"Bz)_hA”K@Eœ*Q‹½sµpÍŦ"¢ =ªˆúB³*Ãçq¢FŽ¡zÑe(cEêY¥†ÂVD²!ÂÑnuEDü2賨9¿"²vM°¾C6ÌãóP‹>ÔÇ"Êw²H„†Y$ \æ,’ .„æé†J‹ŒDÈ©EÖ"$×<±ªl‘ûå¶È„º[¤P\.²,¡™˜Ô‘ólMjÍyF'õè<듚užJ];O…ô¥—RÏ3P) çYªÙóLV ñy²+ÅúfN󳿑ÒN@µá÷b—² š7C=n\ENé7' Z™Gý=š(ж¾ Ðíaí]»*úÕä² "¤½ðOµjØV1´ßÓ#| *¸ B¯íQ®ž€ª „Òá»\€Ú:‚¼Ð1 ,Î3dþ(>«­ŒQD¶iPxu+r~„Ÿ|]‡¼Ñ ðj@2 X,Ìö­Š6Óü'JLCrhÇX?º†hwväéM™ë;@eÔ/&è8µÆ&èáàîM©ÃgHBÍ|b_£‚Žõ#txM¿vP™t( { 0uÞ6ÞeÃëºhhÐï17m |J1N$`ö´á]ꎎsT•‰ ¹üž«ãr>}w |QX»øGÚðuN˜´æ/uuÊÖ÷¶*‚Sg¨°á5 MÊ}yö¡sM‹Ï¥K8(]µK;9x©ꌈ½pøØŠtN^'¢Âu®›òT³G” .Z~4-–É× ÚÅ­z-ï4ûéÎz,Ï_•¨c:÷´]ØÎÅbpˆ«‹zðŸÃÞÒ^&£„¥Çw²GU­yÛª‰“’èXB*²¬r8úˬC2‡ÍnÈãñ¹\ãe)A™—Øút!ú\|Ð%¢>Æ59Už ÷ŠX„úÒ݆Tôu†Œ¡‰ å¢A©ÎÙõõ¡T·qÝ$Ô9÷1D…M‡ÍAúQÍ8öÍ(稖í¬ÒO<ùLJ\Võž)žÅQ UªvÔ'i+Gíz`Lš?—Kí&£…d:5H5ªð.æë¼*öÄ,Πɀš7E3 +…;ǹלDÕ8“EÒ½yvÛöÌ[3u?_逘?Šr9oüš(÷âhµ©€ÊŽ!¬§Â£9Ы»èç3_/Í&\k(¨3vÒÙ6žª¿¹ó¿À£Úä¹jPOªMj˜¥È¦D3Z³üoTnÒ#‘5¶.5D+ª‹7”·Á(Tái§#∠S»©‡ºP}Ç-,´Áá^½‡ÎÕøô˜ ý(Í‚¸íé×l( ´õ‡®Isz<¸¸I¶ÆŒ´(çoÕäÞö¾Ù’5K(ÊÉTµî«O “=ŒLѨ€Bp•·8iWêôÝn™sNöÚCåÊuÙ,æA¸Žö ÔõSÈx0ôl.¨·Å´V=Þ'½@…Ù-.ÐI[ÅÛ¹U‘ôE«…xð•GúÃ>TUó-5ÝÌ µåõÄ¡aØg‘éX8L[ŸobkC§ Ûdê7ß’bArYÅ'A;æ#•˜™-ø^ÛUÙôtÎbŒŒ¿!…ˆ¨þ6Éu–HºþkTO"–YR‘CHÚca¸€Ú p,ZÍb¡ÆåÒÓB‹zæ4…EDçÌÄ…šçÁHFSóä¶8 —3¬ŠDÇ.¸˜'Bzʘ´Q¿zN™·¦9OE•:ŸI€;0ª›¥vç9lâx Cî¥.ç1¹ÂsÉ )ÚÔÎÛšÓðWd‡è"'(ÕÔêRËÃ1j@MYÌëZ˜Ô©Y\"LôNÛRHø4¤èO<œ§ju©ÝyL0lŸe+é<”ÂØ¯íCo-Å;L¦¯·†¡Du8Ÿ‰9&bâ 38ñ5ó™uŽŸšïçZ`´ÞÏõÎæ‹Øï)Ô;ã¾Ç53áF§ÞÕ§êñ„ûÍWǗлz’ùžB½3Þ¥¼ú²·g)bA¤t§/ÔMláÛÂÂ8<»m[|)Ýéë<¡W—0¸Eïg™§P§op”V ”«t2…ï¨ÔéôM‡R”ülLÞL¯›7u:}ƒÃ`<7 4°nÝÍ ETϘè°Åbo8çQªIŠÒ-òÊn±jÊ¢q ÐYõЀ?£7äK”`ãìYrü›í|Zž‹3 „EÕÏõs.*ÂqRAö缄øª¾o?S£øç.ˆšúVül†§iŸ²ó;*ßqÆÏëûÇý rÓ÷m®ŠìªZëÞD”ÝÃã@i~þx%¨æ÷[=—¨ø»oÏ—çÞjƒþ)ØáEMe§£Š‚¾+÷Å@lx?þZ§›ó¹·h~húÅîï"üGþü+>&Øz\»о?}Æîª*Ä]Yk»+Þ.¨'Ûý_Õàì~„ºÓì–ð«ÁzÑ‹s×{š(´¹æÎ· ï}êÄ–âá#4Õ%ãQ˜=ê³x¤”¡ˆ&‡B±¨ ¦±å"*…I¸G.A—Šè†Œª[# Äí,ZŒ„Èþ'Š ZYDZÈè·x0†ŒÁªÁ² x{@7ô„)AºÆ4õÀÙŠ7jðˆ¶1Ôµs¸öC¡h$Óoö@uø Éf™=¹5à4N5( ÕÌ7=TAÞCëA: ¿Ùköjˆdÿ„ñcÙÈ—õìÅO:i#Õö÷|ÁXž»ðœÂXb·îI‡±šËÚZbˆ*ÔzòbLW)¶üƘ6¡2R HtõŸ4 :ÝtÀƒ§RÐצjÍžk³Û{>ýÇÈÙŒiÁUäu˜fÛ5÷¤ÿ䇯°u9$ û'Ï4†ç =5ÆR¥XKV¡ƒîþ䳀Ј”»ìjVl ™3ʯöš]C‘ï<2p@T)Ö³tLSžšÉ݇¬x¶ÉÍó“´†¾’5ÝF[z^€”Äã#þÔÜ$zU&Öó—@0DŽsø”Êȃ‘û#R Äs¥L§‘šrEw¡&,C’ý†§¦nŒ[³»Hüþ$€ñ?ôr¤ûµcøR çPHʤ±éú­"?…9X4÷„8¨qÐîEåQ_:N–‘BWxa~ÍmæYC3êI|äЮ¥Â§.¨p·èA…\&G#ˆ!° ìÄÒÕ¾TR,å½”Ò5)¦’x¶ˆãØ;¦¯œY•žÚbàxÁ•äH\ž–xüðÌ»&¶!”Þ ]3ðÀøã°ôQàÀaÑJ_Õf ˆ™‚M&Rh¬á%b€&5õeZR4)ûÚ­k!Þ€à…£P§ÍÀ—¢‡²pS-é¶î‘&¥‚ßѨ˜ë‚s™²ÞÿÀ“²%u?ˆñ,¨6ú¸Î®w"Çç¢yT4—B{ÚäQhoù/ÁÃo»ˆü¡¢ïiš&_{$4Á9j‚ÛZÚøÆR¦ ˆ"°Í%½§ uoÕ¡¤°Ôæñj&¨¼­*Åb!;IÇ^ÚÿÀ#DFn“ÊÓ”Ÿ¨,|ÊYrEá¾ÑòÛkç£8‘µIzs­Y¶…+jQ ôxg§Š´9³4o²'Ù²_4û–O7äPz}F³4š ÆÐZ[éÔÍP,<æhšl»u·åßX±Æze³kÛ¶vZºŽìmtàê’’æ.téÒmÝÒžÞ·K$z{9€£y…eǹBq«­£Ö4, €iC-ÚÞ’“ð¥ÅOs·mÁ‹J¿yh¥Õ{˜ ÐÒ‚h€EÄ–tաƹJAÙaio –6Œ Â&kÓ2XCxåì‡×Eðšþkë?h’ ˜Jµj™I?Ÿ¯éM+7O®yË8‘gæJûM¹¯ ç!£ÄšÚµa]Útú3–?µŒ3ÝDGPƒ¯6 9ª™ËÔæŸuÓSáœ6Zd‚©¾¦ûÜ™•’¶æg²Ú¦OynmúLÙ1ágøþx¾žKq9•)пA oeY‹šwå9#PêLÏzêxð¶pÜ”m.*ÜôS*|@Än]¹½D”¶OJÿ¦›Ø,%ø7ÿGeYŽ Øb]_ †6™,s¢ªâ _s¨X¦Bú7—u °ªK¸†ìc3ÛÛµ7¾·n W±†<š^ŒM¿nT…P„äET®C3¤m+‡ˆ4Òǘ¨q;è ¢?ejDtìïÛ†d‹àHELÀC•Aˆ˜êtçxxÇôEtV;-GLgúØ4k˜QD•B‰îìú\fÚs‹"³é¢8jŒE¦=›Ó¬ÿ(d¦•2DPñÅjÓÝ!*ûCÉ×k1i ¦L}IK'¢?¤¯ˆöƒ„ÐtAP§­Yÿ|‹KMç/©¸H½LHy¹®3÷ƒæåŸ[Vö\y*.3t¿]n]x–ç*ÓñŠºJµ”רE¹ÖùªU;(C—mKÞ×KG´øêšR¢²ì:Bœ[—f§XB]¾*T8’?{À®ÛÄt˜ÊVB…2å±Ýúô­d;ÒŸÊžE¶FvÙÖ}±S¿ì|—*ÖT\ÍaA RuO12¦lUì7Lú-J”+æ¬Ò’Ó♪V±ŠÈ~q9„åÄÌ&¾Ú°®¦àU,0&=ñÑ„•F.ŽžOXrÓ+Öc¦¸XãD"åÔ0²r² ´cŸzú ŠGÔjH=ÁL.­rLþI=‘ëÔÌÎJSf+Ç)R¦|+qä"­Êűlºpåè¶¼wï̱ó}»  ¹úWÜW¥ O‚ÂuëGƒu‚[|WÄKw…e nwiXá±ìnËñ¥kD„×gÞ5üøžÜÁbyæÇ suÀtÔéwš[wæX@â»ÃçÒ„éʸJÉÇ‘¥)E̹¤”B/þ§Ë$¦‹J9ƒtaYY›ÕÍ¥ˆã®®° =¦»¬5»]\jÊ´êv».eºæ2Uk/ÝwV û+.>«Št= pu͈ØÄ¿^ &´œù3úbŸó” ÄeE3pQéÑ m(`jbô¦Á„zÕO„ä*¬E±+¿Z‰E¬“šñ(óBÞ?â5™“K*C:w‰údÎS]ÔßQ—ÃoGðHäJ 0Y«æ€Óm‡\ÕÕSÄæ¢Ä±ñ/H•G¬+¨#BJ=Ø¡ì… '3³Ú¾JXÍF~ÄŽz¢}ê¯ÏÍæ³ áYÅ«„ùlöElsCñð"U ( â®#› ÛÂÛŽŒ‘sªÚ:(«f.ÒZ£f7å[h ‡¸:˜ È9DŽD ®EquÏ£™?Rê@0­$ò1¤EHÍÙÈä(É’×!‚q[©®Ž¢´¬’"åìÈ!9£È©_m3E}‚^sUD#,rêœäPr^2)¢]òbT5àH+Ï‘#Òîœú# #spd–욦Tì‘Ò*rêÌ›L÷™^Bf…ÿù#ŸþÈÅÏÄ¢@$ŒÓ¿<÷HžK¯ˆÔ¦`ñ©iN"¯dBUNÈ)UŠ7HͺªœCFä”ä­@£ Zù‘à%‚«IõtL`†–»ç‰ p¸›§’‰@–?ÅÓ¥JJZ‘QÒÖD0ª/ÕÓÁÑ 2º§¿‰Ìš"'rVÕJߨIIµ+é–t<‘y«XúR‰âÌêy5óOn2ÿ)–®¼’RAPþÓ*UÕ¿¨s¹¥ZAä–‚†³j¥9¥0¢ä«^j'ŠŒ*–Nde†€”M!•î€Wzâ;¢¿“Jé~-QTŠëÂSÜS*¥ÛmGù*žL”¸üé¥t{ÂY*ó·å4SE)ÝÞf–åügéÎWE‘J·•“%@_]Q$ôX¤Òm‘z¥Ñ—qÖ"}©YtÛYÓô-“uOßVEݶ^ÖO}wfÕwpÑE·]žµZ3QÍuSQTÑÍœdQØMNŽÝ,tµ\Yvãæ5ê°\C[mj"«*ºšQðZÍ"š©‹Õ…ði«(:í58¬ÇÍ>M:&ÕìWt=ô³L„_…Ž3·û¬CC˜"«AÎÜÆºô0:¼[Ey,TÖ«h8U´„-äÐÝ}ÊðLŧ 0r›«ÇôîÀ<ö(Lm¯2Ççþáú8 $Á0ôU®Ñ&ø³W—‘E¤ýaR𵉠<ðdíšúò).ûccÈ®™9·ðyÚ , ¯A?´CÂBpq}MPà嘿æ0Ȫy¼­1k.|Þ««QÓ%>ayͨ i³ 4éÄ[3@š JP“¤ÙnKðLŠ!XZH‡´ËƈL(l§µ%“€˜º´ha4,'5},sVX&–`±)mø,+ìOŠêSѴؤB¶"š:›-=À¾v}ך‚£ä¢KÌ2 àœDÿÄ„÷5¡JÀÒÓšt=uÚ÷jbˆÍAÔÜ-6õR4» Àçøi2ï'I ÄpK$SÜSïQsÍ`n[Ì©éhöê4aMÀòÓLiSgÔ„ø5ë ÄÕü™çv%wÎ"Ýî´xT4U?ÎRð@†Ý#“ôÔEµ„°æñ¶õ—4ׯjªú5Zìk· Kdž›½–Èöíµô­^œ`#ñ´~>ðý)q©%&G¯e Ûê&¬¤˜ö'(¶P³¨åòŽo­Øü LòWD+?õk4Ù]I+Håb´ÂT¯W«På–´PUïZkYõÁh½«<;-‰ÕÇ«U³ú ´²V^“UßÊ«´ ]yÝVÄ+K }eÕX1°¬,+–ÕgEŲ@µî˜KØ*“e•[õ²l«p–½bUв¬Rš;NK©eOZµµì[+È–½mEÛÜþV×Ma¥ßbC¬:\ìŒUÓY‘¹X++DƒfÅêbô¬ ]좽‹í´Âx±¯VŒØÕ ŠÝ:‰1#`':f”ìdÈŒ¤0™Á¶“*#wÞe†ìÎÍÌ°ÞØ›ù¿3sNÍüÓD3ÇàTÒHC8Û43ÎHÍl†“V#áá¼Ö̉8÷5ó&ÎÍÜŠsh3ÿâ<ÛÌÑ87ó8Î×TSz3d¬ßL-8sJÎμ“³‹37å äÌ_9K9R\NdÎ,˜“3Sæ„è̦g:nN«Î¤œS¯3qçôìLî9…;€NóΡ1Á3‹èdñÌ4:¡<³‘N:ÏŒå6ÞüçpmÑát¥d|»j«OÌgˆv ¸?ìŽ!L.:µ©(Æ3DßQcíM"gHJûRLgˆ'Ðgö«]P`–\©R1ž!º©À¹·v\Á¹Ñ&ïÊŠ Þ·Õ¦r£³«±Eº6Åx†hÃ"6¥F‰µÏ,†1D+<›¹J»‘áÈþ™Æ`]o”>dsŸ7Æuø1÷eï\cðöºÞ¤Q.Ô;ðzkoÏ&½Çà|sÔ¶=kö£[»¥!0Ç/xÓ  I®ÒXHaµ=Jó!•ËØ"æ Š!QMŒ!ã¢ðFGÛÙ j˜Ñ,)¯N ‡Ã)ÞtBœÑ˜ ‰.]´Þ¼©š\³4x†æg4Ro‹­šÞ(Jy­Q›I)&ª}¬Úo ¤Ñ’*oR™6ÛV¾rkl ±Óè}…(–¾ôæ,=´.²m¶Ô´<¥W%8géÖ¥ 7ôŒ)*ïM¿T€ånðÆ`]¥y8„e£ÁX^;j¼ ™rªKJŸrhÚF/3®Iïw¦._•÷DS?—vÀû¦Cc7z«)rµkÿ5Õ{õ›iæ ¿ÑÇMÛ]Z½M+»Á)œ{²_<Ô†£¥œW\ÞvN‰«U:Ó)êËá4A”t½äèp§æ4$¢ žÂü)ï”…ç覧 {¯½ã^e°véʧ˜ô¨û!SíÍýªƒµKÿ¿àÌ]·hP4›ÏÜdBž;„¨ƒÅMïbT÷i.&ˆ ?ÿQƒ3áUÆZEAØo¹­,*M¸È‚€I@ b˸¨ˆ5P=ë–ñ)ÐÎâo›¼ÎN=¹Z}Ι'·ÙtW• Ú¯Ö•'“Ü)áêÔÖ¢v†iD#Š­ò”ÚšUCÎS"gÈdY«Ž09,3¦Ú†ÊqAŸ¶:'–pü)Âr^Ó»vñ*‘s”‡ëƒ‘['–@Õ‹Co\g„ªç»§‰M1•ñ$ Jà Aj§ß*z¢jê?óH€Œ¢"`WPBÄåUä Ì0Š þx (†Ø-J. õj/rŽGrt?¦jŒ€¤qа N•ˆq$z‹@ ÕÊÖ,"6rŽÊ—á…ç8 r½ šaE‡¦ŽªÚKGr6 Ê!ÍC`Vù‡„3VbøÈÁÉS$€ˆ€b2AžÉ®RBDøÍ.7$gw—â’DDZU-R¤×‘$e£l‘kQu ŒÊGRÍÿY§“2KrÖS %—b"Âë‰ $g©¶UH:YEõ‰@;u 5üñ0‡Dz˜"Òv@r–Nn¡*"+¥¬øï^‡Ý•)ˆE,æÍ"¢Ê[>lÈ(Ú[\™K@ôÁžË)#@¨Ìåò^DV#€î•2B¾Ð)BbD`7BkL‘ªGF„cP\³ŒóÞ(ºfŠô3Âa4ˆSB<­ 6e$ÏÛú·¸J[þJ ‰+qµ·¼ZW„Ë;Š1#q×®,—OÆÕçòéŘÀ®a—ïÀuîò=Å”}‹1«ÆÞrÈéÅBÈ #¾XB–/TH÷ùšË#¶(]ÿ/–mHÆÒÎi"¾üCj0¶HÈÆ6Êq"¶ÓBÔ06cƆÍi"¾©C@16~ˆ,†qÈq"n@B¬1ŒL:†!Êá!n¬B2 Z(G†Ñ qÉ0Œ9OÄgˆT† !Ë0Â9OÄ uˆaº-½Ì0÷9=Ä„ÐÝŒc#´9ãhÉñ!vú¸ÂgœO!gX…Æ9—ÃCì( ½Ñ8-C“4NÔâ§nh›úÁò§qvç¨?ßCF5|€Zu7!ÔXÓÈÙ!îm„¨kx$!ü^K qÇÆõcÃ÷ …Ùðr2ˆûP¡T~V¨Ù†/‚·á¯ådséB7×¾Ö ¿0¸ï½á_†Œoø !õNjŒq?6ƒÃ× Máð‡Cw8\æ˜íá^u¨‡ÛíÇî—ÇD÷ÜC$9¼ûRŽ Ä–#JÈùI„hsD!ìIˆ?GÔÑÙ„ˆtD?!4’kQG jÕg…¢u„b.zÑšQÓ=œ ÕìùBY;ÂÂPߎÐ1º#¼ ïACé;ÂÔP÷H6Ã#Ø QñˆCxÜCf—&÷˜:ÄË=ê}óÌC=‚÷ÐI?´Ô# zë‘(x†Y&!Û#Ûð~Gì„æ{¤,B>Ò¡©—ôHHÐG %dê=Ëòl:‹eaBç>25¡…ïÉœË÷tO(êGF(T÷#kÊü‘Y õþH>¹Àä§b@Nѹ‘´4—OˆLX ˆlY $È):>´ ²n1Ø 2s1ü Çèܘk¾¢YÀ´ss|C$}^Cäc¢CŽÍñ¡‘·ŒÁ‘ÛŒá‘ÿŒ9HLJPDÕçTDª5FYäÜw)Û‰Y]Ÿš‘ƒs|°Fä†}öF¤cÔ@LëÍ[¬ Ø&8d+°v$Â΋ÑkÄD芃"Ù®}ª½¢_È¥è‡(P=HÙl:#BÿÝ•‰¨R"¢rô—0ú“«t›7䚌DŽ*9 Õ ‰¨üãög¥>•«?`‘kpØ<®›‰"—` òoÖ³û6íI"<#\.H Ý$-QžìMYm)r©Ètä‰!ÃÇ-¼l’$rê\ˆ¤»Â&•÷Üþz=À|¹^àv}OUó$¢—ƒp¢?ET ¹ðŽ5ºlÞžK‰áõ]åst¶yZÐDôM³”- ˜O(œÓˆÑ­ói;¢®¦Êi`:.Ua.õe« ií­cæÂÕY‰ðìD¢âµ´Ÿ<)‘·æCžÏ\M–]x |ÈóéÙ¬ÇÂ( T]KÓΡ%rĤk§~ϱ±0ƒqhGûº¦€ÛA%3MÜÅÖ&ž *T;—®uÄö£ˆív´¯s/N>H~ 7ÅdmÐ xب ¯)ýöèqg.›³Ä”£„I’ަw†äHS7ŽóW“©.=õ¡ˆpú‘gÏ·iÄ'>ìazyÈu;@!ÿÈÓÑ_Úבk%®ç ð³H„S–Öõg~uk¢ dïòª½Šz‡¬Æ™<£FÆ÷ºÆ]†ÐîEíƒu4V:Æõgütàj(í½eÔÚ(Pxº ˆ¢¿Õ=­©tÎ,éáfDÙ‡§Ö®:ñf©¡‹[GN5Á@X}h:úyÓ%›¥Jµ™jç¨(«Äᨧ. .œ(†±_·°ŸEæD.‘f[qÚ•¨»mæºð7WÇàà×\ó \Ù¥ÄG„%WŒíñO<+ûØ(p ƒ–¼œH„ÕD“fR€“¢, ›ˆÕ- 0Ë÷â[Vχ¥?4ßϕ̕¯@¯óý¹#/Ãæ]¥±äsq5ŸÝ(/EŸoßèå;è–âË÷äÅåx•8VN}Ûd±J]QÀŽEƒ£Ò‰ëjû0ûX{Q+÷åɃßÿ„+ÔÜX°\åQ“¯#þ†»¼àå;“;*êÿ±ëÖ5=¢Ø™ð¦ŽïUîޠć›vܺР€²p«¡VC0Zµ7NtüC4IA p«_Tß603¶›:¿`o„}„Ó{‹]î/…‘ žHâ¥=cÅXcö/fÐAI¹~ pÝI%¸ÿqœ¥¶X°Lbâb ±êA^8¢Ã¡œãÇÄ)^=¡*ñ~Í ýرJbЭ/æÇ5çàÅŽÐîH=äþµQ 7…³05«X Цô@t§#ˆTá˜@uÀœs^&'~UgnKN„,®p”¦'›Â™BgŠ]îp‡,|2ðÌÆ_qÛØóãÚY-Ü?ät¿º‹ˆV½÷"•'n&åð=˜'Šþ!=ÝYO/ÎýY§ì…Ë‹n¦§ßbn1§âèߘçìÌÀp®§ØpôpÀÙÆ¯>¯9éÁJ GÌEµÅîéÏf~±œ€3ÿJÀ$I Qêcò€]~z0{PìL[Æõ¹eÙ !_Ãw}@ ]%: ¢hPL—ÝdaŽÆÇˆ¹5‚5¤æ—x<άŽ(óÓpN ƒh¡ãˆyc^Ñ©j‚58ÂTЇuÜ¡‡² ëü8wA^ÖÛò8XÑ6#%ªóÄ,²²µÇÞ lÇ <š°à‚GONy òAD×Gá‰pÞïO² ¸ó‘P+_Ã|Ï98ÿß’è<Ðç`i 6whBÇR2ÄãcñÆfÿWò#2š­ˆPÓÙëd6vÿ¿’Š$ÄubŸ¥k¨ð“Ò‘Ñ|¼œOgƒBÀ­©!éX—=’GÂäüªƒÕ0¾G_f œ’£"0k‹*z->V *šÐ±l˜`äÏ+ 3éׇ—û 5VFI¼Ñ­%ç¤_ vrJq‘À*õGúK>ø ïÚë˜D´¾­•NÑæÁ˜z¦ƒÁJµ”È^YPU`Ö©g@V)Ë«”n™uìe2X X…P¤”‰‰´WÇž‘Rn–¾ºq$¬$­ˆÔ¹g]•|²´­ˆ”ê·"eîþ­5a+¡+»²2»"³Î= ä_ÿ€ ‰yièë„Góo"lã¤Ê~†ˆEïç± D×ïîlm'Þ8õXg=›?‰à·äDð=ôl¯!p9RÄSè @P< „ßBíP=üÅ= øD‚v5ƒG¢†÷×Hü¦´œÍ’ #èNß«ÑaUDªŠ mÓ[‡ç´ü¥uMÓÜŸ,‚Àìî·ýSX•HÇ\»>t ¿"x˜‡X¢Ž"tDˆ¨IÂûF;”]jˆŒ?f™Žÿ ŽäT|‚£³Ùd9²˜; \ŠKÄ'5q¶!è“>ØþÍ¿fŒ]t,pN—ØùAóÈdš 'Ì, ÉL"ãÒº©‚‘õw0»ìîÄÕ9ÁI,¯~Âîx^ü­ë™oÂ.=‡ýç¶Br4n®}< >ž%&€ã0ÕMý)ƒ4þê‹@úöÕw•:ªþ>‘V•çLÇoc]¤f«¯ä›[›e}1ý³SÖ×)’ݹº±–‘¿þ59R´¾%WÏÅýîx¾ÛÖäP]\½õ­ïöýŠÝ ïܾñS^×w9$xµÛÝ Ø·ã­b+RÈ×Ì ¦à‰ý’Z2üY©UJÍ`·\l_—°wmPŒxÍS,`껕¼5²×«–ô†ú†[ÛÔFv‹ DE&Üj_gE€VEv×1  X7)ËLê=§°¹¶ ªØ< λ­KAᔀ>ôUñ7/ŒŽú÷LÆýŠøˆ5 &=BÇÚ5…€ð *ðÈeCCë§Ö=×jÖöƒNÉl¡· Æ>d˜CU_9X~ºÔÎM„’ˆ*²ÁƒKMoòü©ûíò%àùO¨|ƒ HG Ž €ÝþÄ¥ @ü‡Ãھ>RHÚ@—tX=U޾’Ô.‚¤ˆÖª·€î€1ógR.¬Q&Ýz^Ñ-ÿ •^ÕR2©¾~è‡îÄTh?xØkþ½©ñÁ•ÇÒ´^ ¤Èó[ãþAëFEDÐQ0¨)¿ýðÄÑÑuZš]ßÖ‡nJõ°x¹ÐÝQQ®C¢†¥Y‡3jjØ“)‰xüÌ¿Gµ)þΗÚú!¨ŸYäøaf0Œ‘òBzFƒßŠQnˆcÕÁ{(_ë›{Û>åÓPĶÅÁ¼œ§òø Aè)Íâá2™à6=?8Î@E/˜•Åð‡¶Õ‹ER§}5¥\°*Ùz™“„i@H:1C-spfˆþ”éh: !g;°*…vÕ!Fc‚^Nï6ôjäü›nQ=\bκ®Îÿ²à#r *BM>Æv>fó5-b·HµZÃ6¼Ãæœ^ºq9„²ë:ó˸® ¢ãFމ NµZ6ø‚ý œÖâ³P`xjW%T8ˆEÆTUŽxa² ¥rÎWòÑ10²kÚ+ hÊ11ü†%xŽóBÞBÿäh²h6²ñÚºcMPPêZŠ\&d€Ø§†öx11F«sBÁÒt_»À©M€@Lr2ë,ö>_ðyèå 7s±é}6^PœåCÅFGì§¶Îg¢èfˆCΡˆ©(îmýÙÈF4á†õÐù,AÞ(³È«>UFg-íKöa‚@´ ¬Ým#&Ô¤‘ÅñY‚¢© m"e @oèQçBþŒO'»Ò\\~Kw]ÒF²þO ó°×ørG÷…¢Ð±I‚@Lµë F ×þf±ƒ‹ˆþ¸⺩:Óÿ­ËFP³V@»¤|” ý“ÉL"¦­:§î²a à˜%(ÑÉ*K[oˆèßàÌTÀOmš î ±YpDô%î_D§ ä°æÑ©”Ñy‚å·Î³7×sY1/WlË]ݧ›>ïü5{ñtl¦`y‚¯T0>*zœøÁ€ æîõðð¡‚yÀ ôë!„‚êû9¨|Œ`œe¨ÛêÉêÇj»48q$úÁ<5Q€õ`£Õ“×GæéŒjµ«¾²PâÖ܇ƒúÀÀpX«8 ÅçyèÎDŒ ‡ƒj\|Äî”°PσÂü¹’ܹ‰!‚á‘&p«“$c“TÌ g‹ShÈÜ!“q¶®u÷Ùbf`øu2«÷âû‘A¡×#>˜ÑF†IÅ«žN¦23ªJ.ÇÜÅWáÎ’"Åã%G„n’{Å1"0uÿ=“²°Îfɇ MY9S"{ש›,ÆÐH½ ä‰GÉÎ ˜RÈ¢æŒÍ¥õæÌòé£d‚I›íeÆ&þ}{I'“iKÄ3Δ*Ûˉš@f/™k2v‘=Žì6¼(É d$J”›Sn¯äѤ1¤»#×Nd×|¼@r)p~j¢þ¼JK@œ½ºˆ¬ù3@sÓcÊ‚™@»RT#ÒûÏÍÍéQY›#‚wå;"(Å• š‡³³ H¤g¡ÿF­ ÐÔyîYn$‚2kT$‰ [hzQØTà–Ú'ÔYËüÌCqެ¡V¤µøžõ;?óP:*뵊ÌRÓ%‚šs™ŸyÈÿŒÒ°7‹Ç²Hø™žy¨Ó’5hEv©SAe¸ŒÏœŸ`¬NAiŽ}+sÙÕ¹€ŸçG£ú9 Ó\áÐYhpr7‹®ÎâÄqDn™iÓbæÉ>D¯ C0ž1ü®2 Ó\38û×½! Š3Î^‹ºx9 S@HíúÁ­~â áBs%Ë4Ls79iÖœuII_áŎα#~yê×–y˜æû‚ ¾Ìz¨{L2¸MVÚæaš‹ÍÙ¥; VAê®oû½âî<K³Æêñ£ýÇ&kYTæ·OîÖÈ¡L¿Ôà‚TpMÇXüÁ`ÙöÆ(eØ¥Å1¹}¦´Æ:T™Þ5Ò<ôbÈT†]ZX…Y:6½ÊB/h^»ÿ®áYRi![„N ó˜°¨ó) á+i´XFUZD9s:«E@܉Ðȴ̘´èˆ´f€;)±¥Ò ˜¢ã>B˜rühÁ4æCm»@ ¸9UÊ”cÚ§Mß´À½L¼²Ø~R&Ëct Ý^óÈOù¨bÍ!”ù`–g@N«ù¨]n±2âL³ƒ·1µšÐ@úlçD\ÎIëÿ1ˆù–;aƒ‘ÍDÕü uV4Cº§m˜VáPËi"¼t ¢4×3ØùV²AP×÷¹Éš0B"Ñ̰æ”}2švq}yÚ‰©) ›Yú HSgÞR\Èbš9²42~X¦ Cô¦5—†90Y¾lwûmÍÉqz=<ÍÛ!§ê멽áloÏý!k3Û,=ˆ\­ÏâÕüá ·ZsŒh˜²§©iHi°ÉÔÌT‚go‡%3Á³·i…–ðb/Å’¢˜adž¦M™\¶©£šYå ÏÇ2ûÊ«ž³e†Ij;-‹Ëñº¨-Ó‹Ô¶®iKkF΄1úlvµ%•1ãÚðUM<kƒÊä4©‚–Àb®%¹‘i{šG?M¯Õ\ù`Cìt÷t­dÊÍdbYZˆOSÕÔ=²üþÔ5½Ĭ•0YÄìjèH3JkÌ:Y™aDyÊ*l~°\¿V+8õÄfíjAƒ“Qrd,L ÊHVÑÐÂsñ¬x‚K°÷V`¬Y¡†E˜Ñ¯1‹Ù-Zï³b»B+ø`âËQ8:ŠøÄX! ÀjTZ["¢—cõ§ !Û]ìÛªXlüèö'¬t –ˆ¬:¦cq˜M+ ¡^À&²[E MÛ§¿ªQÀécÓ_µ2Äœ]«ÞL:ùÌXPlÔ:ZˆYf«ñé´64z5öëZo"ް& ÄKÇÆ¢ùWsÍVÙ=œ>+~iVýäÜXjJèo‹½ßãhµÌJD³67e®¬Þbän¿@ë¹Úmc¢ccÙ‰¬ÕeV…õÖ¬p ļ(Ÿ Ć˜jˆí+R1‚ÍEø¼K­›€þ[«á|¨©ÍbœøÙãä°Ê»"z 69¶"¬àÿ :|¸|MŽ-¿E²@½å”+¶Á±åž”–Pï[=ÕúlF>Q{~d@ÔG¬$‰úlrlySJ¶(oÓå…ûäØ\Fì(ëÆÈemùäØ\Æ!)KÔx&eûìØ\êÆW)»Á(-eÇøìØÜU Å”mg¼™²5}tln_ãß”-nb|vlš £úsbl br|xlZ%cËeÌ£bÝ|Vl@#0¥‰TŠS1¢>(6 ­1¥Ò™ª˜k#\“î“cÓìq« Fî*LJÀÊc$±r ‘¬UÆ5+Ç™ñÑÊ‘§”µr*«-N#¾•³ÕÈqyü:.ÏgãØåî4¼<æAÓK7Ài|é*8Õ/¼ g¦ÃáŒÁðIœT˜n‹Óµqrbº?N`LÉIŽéF92]-ãJ¦7ætÊpØœq™>³2Óïsæfú†FîL÷ÑéŸéb:E4½Pc‘¦£êDÓtfŒš¯VÓ'vRk¸ÍNzMÏÚy±ÿ?c’ìÊ’ä¢ó\Å]AÍ{_Gn¢uö?ý¨P2ò‹Ô(ââÑýÞ˜i}‹:›]ôZñbà&ÌK7©€˜¼Išì›ŒBt`å" '+©8™‹ˆÇÉnDNN$s²$‘œ“I‰dKdé$d"T'gé:iˆÙIýDÞNz(‚·HQÀ“cŠ&žYºhö•Å‹†Ÿ,_TýTDçOµ@”ÿT4ªƒFR™ÐxAªApCS ©h’!uM;¤–¢‰ˆÔ[45‘šŒ&+\¶ÑðE*;ÐHõGC©iÐ#U$ ƒ¤Ò¤y‘T£4S’Š•æNRÕÒlJ*_š_IuL3.© i&E6Íʤ§yšë4sãzžÆrRòëÉT5ܓʡ€ª²¨ù T5C”ꤦŒRÁÔ RªœVJ%´ç™R,ÕÈS ª‹rÍU“S)ËjºÊ…[ `¥¶«!­Ô5Ç•qz¥Š¬i°Tš51æb´†ÊR¯ÖàYjÚNKÝ[ók.kÄ-ÕsÁ¥Â®Q¹Tá5N—J½FîRÍï©<×û5·—–€fûÒ6Ðø_: L÷Ac„êOhÐ0 #¦Ë¡ÅtB4Ô˜n‰ÓQÑpdº. LgFC–éÞüNÏÿ˜÷œ=Í‹Ë0&³øŸw‘qšy}™g¦ÿcY€ú­÷†*€œ‹£ð¹©ì=Ô}o÷T uqT >WªDÉÑ÷:¦Ú¬‹£ˆ€Xû<§jÏ3•d]lñð±>÷ÔgøHmÅò`ˆÌÂmv[±viaH'B^Ñ’@¬­ÏÈ3‚®]–¤°­„D+è<±¿CׂæTl‘ö… ,¬A g}¦ÿÒçju†¦$Ø+ÃR´Hx­ÕA5æºP-æaO ~”ó5DA(µ|Ná;‚X\d‘Tõ j+ïC£ÄÞ#ßȺ†ÖÉzoÝíGê*¦¸5Sì|bYŠ-¿û^¡ƒÊ>åYì²b J+—LË¼Ð­å³ )[¼H-fEE ! ÊÐ+èš3ö’±.MùÍœC»†ž4ï9ômd[c œõnW½d’É¡ùÍ;”tä–c±Š)_C‡RÉ×14{ìËcYŸõ®r·ôÏz?Ü=¢´À˜z§‚]¬2D9e¾tR"*+«5ÔŠìFdA#:­{ˆ-†ÓÛF²ó‘µ“XT|Ò¥¯D¹d~i0ÙsÉ:MP¾§–Óz®þ¥Ò{¢½µ§$ e (ËFQSù9‡´ÔBô\ºL-?e»)KTÑŸ‘Œ]¬–d®lr%,Š's)–RÖ©Š—OjZëÙûõâ–-·¬ÊE[.^,)w-ÄÊkEÜË~_Öÿ¢KO#°õ,ºEGŒnc Ò[jÌþcV#£GÙg*–Qa™k¦4Íì—fÝ3ÚémSFl¥¨vèû|>åî.5Û·Y‡mÝ2Å–V‘kȹÙoΊo”a¦ŸDá(ÃLót ÇÑkð3Ååì´'õ9šñ½Ç¨+¿5 à}¶!tg‹A‹áQ‡yzyt7\Ó]R´ˆ—êžýã‚N?Ç}h÷•«ä3]Ïaiù¥H_HªJ'ˆ¬ÈegJóžaEõæýš„Dxc§|´K·MÄé\¹ ýÃu{#»®ÅA‡ºÈ(®{§IÜð7Œöé’c\7ªBÛl\7?ÓþÀ5t ðIC®›U®¡¹î‘è°ÿ†­'µ %BI-éóB•ëÞÊøÜfß>÷к\wÏpJ“úÓçÌ\ ©A•6Vß÷ÖÑÞ$òy†8'E«ïw8{ƒÜVÀ«» §å}È€®{qÐÀÞÞø÷µ-Ñu/®§Ñ¥ô5…B%IJO@{{ƒ1÷ MÓuãõ;‡î)½X)&#ïÕ†ÖÒO%BµÑ–X¥žöýíäýyùÀZ©uÝŸ§©¹Ò·møv³Š0Ta×ý©~+Çá]ºmzú©%|XyŠE¥–ßD¬dKAưòþЖׂ¸xõ$šKÛg}w¶¶ò¶ç§âU ô®ûCfßtîþPá;2¿Dð*H ˜}ºíÜ ¢â³ =a"û&ð™²ÄëzŸ:HÒÅDÖP7¦‹/®=´„_O*ÉDÖR&@ n‰-!»OÌocƒÈ«lÅ,ëL€¿Ò¾ÝD†8tɬïC@š•³mÒ d{†õ"eóRÕD¨œm“n [nÅk¸áÅ&‚¥/Ý0E~÷!®Mä>‡7¼ˆ1é²?CÈ›ÿ–ľ‰¬)¾®·å¡%N„Fì'r¯éÓ ä܆>ù² Ø¿lº O°z!k¨¥YÓ¬z÷ï;4× ™ºìDž©Ý^Èw'@ÝøV€/`Ÿ^Ý@¨/!ùBî!6_Èa¯nþsrõ…¬¡h?6ë6 ]üœFÚùù;vëöw‘¾¯dúó›ìÖíŸ-¹_™6ȵ{rSúúÊW ÷@Þ¾Möêö”…ï¶]üDį[̾€óëÙ‹_·žOû2ø¶uƒŸó8vë]°„ßÛDøŠc·Þ;ÛMøÝ´%…ßßXvë·µ…—Û_x©ˆe·–ÛhxɱՆ—¥Xvké²c‡V7{zxŒ?·ÖHYƒxµ{ˆ—ÚØsOd_cŶO‰u{™xáawï ¶DñöaÛo1ñëî]Èî+Þ¨ìÐâÍlØs÷~'£o‰¶‚ñ¶9ì¹{köܽýÚtÆ[ôðçîmÜæ5Úéíoã``¸qwÀ`ŸöÒqà1ܸ;8±'ûö8ȱ·¡aÐÝÁ’=‚PÙGÈA×°ãî¸LvDÝìXäðnøqwhç#E‰6Griómš¶Xr0j&¬vjRHkïm½¶{r`lK(ÇÎvßVxýÆ ¾Cp›O9L×vGòö°r¬_&WNì‚¥|!6ÛJ)l¦å´Ãf[NM⪭ôŦ]Nqìëå,HÎ_ʓ⫭TÊöaN·l1æ”,†ØJÛlUæÔÎvfNÿìxæ1žØJ#ß8Áwªiw5§£ñ³VÊj—6§µvrsêk·7§Ç±šV m×8§Ùv–s*nó9eëq€V>/;§ü6¹sYÀFx.Ä_Yåê¹!Ï=)l˧BFŒûT숹Ÿ "1TÍÄ*«ÄEP¥—8 ª<7B•pâX¨2O\ U Šó¡ÊEqGTI)Š*;ÅcQ¥©ø0ª|«F•¸âæ¨2XU)³)¤ŠiñTÁ-Þ’*ÊÅR…»xTª¸KÕÿluÙåÁ˜aª‚ÃLUcª©JdŒ7U­Œ9§*š1ðTÕ3&ŸªŒÆTÕÓx…ªÂ?QUaã9ªJm|IUÍw©*¾ñ7UU8¨ªÇ&UÕåX©ª·UU©ãȪJv\[U펳«*âqUÕ<±ª¬ÇD¶‹ï±™íò|œh»€³ZÕøchÛm€xÞªS_\u⫎Cüu») ^õ-bÓ«Ö†|ÕýˆÙ¯:$1V%¦Áê´ÄXXݘ˜«cƒbuubb¬ÎO|ŽÕв:HñKî&S,•Õ‡Ší²zU±fV?+öÍêyÅâY}±Ø@«wf§hõÖì%­ö[ì¦Õ¢‹%µÚx±­V«/ÎÖjÆýZ-Ã8d««hmõã³­Þd¼¸Õ¿Œ_·zœñôV4¶ßÝ'ÆàÙÛ<¼û­‘Yý•Ö.۶ç¼[»ÃËÜ~õö;ïñðDï6òðM·a½½Õ»=ü×»e=<ÚíXo÷n}¯÷ŒÞŸ/·zÛÅw{}8Êw þ i·z!q«_ ù'ÍêKh¿þýÿþ~ þò¸Çøìѧ~Ícäÿ ²¶n…ë ÿûóÇþb à¿þómøÇ¿?ôõ{öý©¿xø°ßóð°ïOýÅ_Á‡ýž‡‡}ê/^>ì÷<<ìûS1ða¿çÁa?Ÿú‹?…>õ_çáaߟú‹†û=ûþÔ_Œ7|Øïyê°¯OýÅâ#‡ýœ‡‡}ê/~">ì÷<<ìûS1/ña¿çáaߟú‹uŠû=ûþÔ_|Z|ØïyxØ÷§þâ ãÃ~ÏÃþ?õö{öý©¿¸Ýø°ßóà°ŸOýÅZGŸú¯óð°ïOýÅÆÇ‡ýž‡‡}ê/&B>ì÷<<ìûS1,òa¿çáaߟú‹9’û=ûþÔ_œ˜|Øïyê°¯OýÅ*‡ýœ‡‡}ê/¦S>ì÷<<ìûSq·òa¿çáaߟú‹¹–û=ûþÔ_Œ¼|ØïypØÏ§þâ"¦Oý×yxØ÷§þbXæÃ~ÏÃþ?õ¿4ö{öý©?[³ù¨ßÓð¨¯ýÅÎGýœ…}è/–t>ê÷4<ìûS¶ÃóQ¿§áQ_ú‹Ÿú9 úþПí}ÐïYê¨ù¡?Ûæ ï“ð˜¯ÏüÅšÑýœý|èÏ”úÐ…G}}è/æœ>êç,<èûC±VõQ¿§áaߟúû4khæÃ~ÏÃþ?õ÷?)zó;þž‡‡}êï.øœóKþž‡‡}êïг¹®ù%ÏÃþ?õ÷?èÚ¼×ük¿çáaߟúû¶bîqkÿë<<ìûS‰BsØïyp˜#SHÈ|žÿ3z]0}ÿ/ħZ0QKü‚)éþ|¤lÎ÷(MjL@ªù”¦ÊJÝc¥„1€ýùz™¬u7€ªh!À­0h@Ê…Z1@+-(¹Æü»D óïV’ ЕZè2€ô3 H‚S€…<´>¨ÉŒZ©‰žšª‰²¶«ÉÃȬiÕ °ä­ié$¯)û:p€6 ©b­wì·f²ÿÝÂËþ·Ô›XÚ€¤¤ HÚ€t­ HÛ€D¶ H«Û€¿|¾ïõÇ HÅ\€¥Ð HNÝ€TÙ HÚÝ€â HgÞ€ì H߀Ôô H“¿HûøŒØ_@€ Øÿ@€]È‹Aÿ¶ÃƒE°Õ„yX°†9lQ‡9€H€ö'1 ßòS1 £ò1  Ðs6z&%@OG …æürÎ/¹ë\«ÑÛ?žù äÒ3ô`ÿò¯Ûízžª€ßû…@jë9Ï*ª9®*Ù[Ø7ˆ¤¼ƒHU:ˆô—Ò5M#V"Aà ’é "ÉÝ RÏ "Ü R´ "µÚ Ò "MY!‘‡5“%!±o(#m%¥Ç JHŒ®„Ø/K@\·„ØÎK@\ÁîbBìQ& VgBb™&$ÖkBâé&$ÞpFì1'$VuBâx'$Æy û=!qñ7@!qoB!ñ8¯D!ñ\ïF!±€ldXI±#¥8[ ‰C¦8m ‰a§ø~ ‰}¨¸ ‰›©¸¢62&Æ„dòLH&Ø„dΈÆéd(OˆgûxfP@&…x€Q@Æ ó•BžùDŽ1O!™’9T!ñ8âIÙ Á5âQ^#ž6âéc!™i6âai#žÝ6âYr#l7âÙ|#%0b¥#xú¿Þ=Œ9lÛWkOÿz¾O+•ÁÓÿµp*mûNæÖöa~ò$ÿGæÖÉ:JåP©Ü*• ЩÜ*•@¥r¨Tn•Ê  R¹T*7€Jå&ÀTn•Ê  R¹Ê  R¹T*7¦rãßLåÆ¿+•@¥r¨Tn•Ê  R¹ÊM ºê*•@¥r¨Tn•Ê  R¹T*7€JåP©Ü*• ЩÜ*•@¥r¨Tn•ÊM€©Ü*•S¹ño¦rãßLåÆ¿+• ЩÜ*•@¥r¨Tn•Ê  R¹T*7€Jå&ðù¾Ê  R¹Ê  R¹T*7€JåP©Ü*•@¥r¨Tn•Ê  R9JåðÿèT.@§r:• Щ\€JåòïNåt* S¹ÊP* S¹ÊèT.@§r¨T.@§r:• Щ\€Nåt*g@©\€Nåt* S¹ÊèT.@§r:•@¥r:•  =î¿ÐM¿pÒ¿öňÕßÈÓN5Aîë;Ø>W“Ù‚ˆ÷D|¤ âb ¤ùdADo "º]±ÿ¼k›VD|Å "BÅ2ˆ¨šAD "2i‘TƒˆìD Ú|¾nŽé¼š%@\ã ¢,õ9ˆHÕADÎ"ŽwqŃˆrnÄÌõ "À³>ˆúùüÜÏ ÑÜAÍ/ÑDÍSÑX†wÑ”HÍšÑÌJ} ð]5ñ Î@zh$ˆ&‚‚h°(ˆæ“ŒxÎ)ˆæ¥‚hî*ˆÆ·‚h ,ˆ¦É‚h(-ˆ¦Ý‚hh.ˆfïòù¹3 ¢‰Â šL ¢™Ç š ¢Ì ß?AázÂ4€Ux6ˆæhƒhÐ$ˆæ|ÒÄA4‰D3ÎA4=DSÙA4îDÓçÉ€4 DÃùA¤.DÊ A¤xäx~ e^€íùüÊ6¼_·jà ð|ZárêÈôî÷÷%jÿ•Êë?Ûÿ—dÏÅÐ*†Q14ˆŠ¡AT ¢bhû±Åž›ÑÁSHlØŒØ͈=ËŒØ̈­ÄŒØÌˆí½ŒØºËˆM¸ŒØ`«‘á•%$FXBbi%$vUF>_w|ØJ ‰g”B ˆÙ“Û6 ˆ%S#ÃnIˆ½”Ä'IH<„ÄßHH¬Š„ćȈ=†„Ä?HH¼„Äù§‘áê#$–=BbÇ#$V;Bb¤#$&9Bâ€#$î6Bb]#$¾4 Ï#6”³!1‚“!1pw!q^W!qL;”F†±‰˜–‰!‰Ø‘—ˆ€ø„±ˆ»yˆU‡ÛpˆÉF#Ã.CÈ3ŸÈas!$ŽBbG!$ÆBbaÄþBâí $6 Bb¸ÐȰO'!ñ'Û!ó¹|!–Ù\!.†q1Ô{œ‹¡AT 5âb¨Cÿ/ÆJíAéyY¸êPßøé_èç_çjО©aȉԸáDj p"5œ7‘˜›H¾M¤ÆØ&RiéÙ²‰ÔàX€ ¤Ç»ÒƒZé)¬ô<Õ@zZj = 5žiHÏ+ ¤g‘‚hÎh =14šg}Ðs<é!ôÎ@zºf ='3‚H¸ñøÊ@z4e =v2ž)HŒ ¤‡A&ò~ßq ¤4ÒéØÕÈÿþ§~ÿþÿ‡¯ÿûúÔŸ_ÒqØÏyú°ù©?¿Éó°ïóÔa_ŸúÓë>Žú9M5?ô§%aô}’:f~æÏÓø9æûuÌüÌ_FÇsÐ÷IxÐ÷‡þ2‰í£~OS‡}}ê/Ñ9ìçõÙáösž:ìëS8Îa?ç©Ã¾>õ1åösž:ìëSQnÎa?çéÃÞ¯¥Î2Ñã°÷¿–ºŸOýE“:‡ýœ§ûúÔ_įsØÏyê°¯OýEi;‡ýœçÿùêÝQ÷àTïç?ë ‚ÉÚEC‰ô¬íÞ—í¨êT!ük˜Ëû3¬_dÔv—(6ÜH˜Þ[PÆ5f¶ïU Ϥí¾÷@8ÊùówMiCèœÃ»Dº=h»oUģšq«¢þúV­ÆÌÙî[ŸAÅ8¨¡vŠ>œñ”í®ùtˆÆöy9öþ–í¶Ò2b+ ÈÁî[#ì/ì(—’… äkÀv_¬w¢Ð¿Îþ‹;‚ö> k9¯…!ÿöÖ±5õ \ÍÕÞ[/õ(Ôó4á9ú3üdª~ý²TžÉÚí­4[ëÎÑÓ‡ÈÝc´É`­´¥€<| ·Ö£7 ã¿í©ÆFæjÕƒ"BûD^¾’*°£fÃÇokù—ÌÙnÝå@kÝ]y"¡ôSäoZ+}ÙnW´rôdkÅJØ‘‡|ëf[¦lA"P5.|‡ÀXª™¬íè/èÛ­á!¶ú2=ØZħ«–µÏˆí¶Õ;t|®~϶~¸ ·zÕgVõ3a»u#æ"/7£­Es­Ä¯¤èÖ×|íz«„º5'ƒæ(ik rWÏÒºëʼíjev(°už«ºÆÇ^ZÕ0+ÀÓ¶«ûù –íÜ!Ìs6ò6À Zfmñsù+©GÂÓlÕà§)3浪Y“QÛÕïÌq}Ø„ ¿t5Ç¡V æl?¤ú´ÊG&o?-ÐoÎç®û ÓHŸ¦cdðös6B%nüm>è[­ @È´}ÍÜBÛÀÛK1[iœ¯Ýé#’> ¹0H[Ÿ·=ƒûyõ² @ 5öO´ävvŸ®ÿìs÷ó6íâ„ß_!½yœ?ÛFÇ ó·«[X¬}{ Ÿ`*´¢¥õV#󄈞*ìi¼GžÆý<­ÃVŽÁ€ÜÅ¥ïÜW=®nÁ5í%šµÕ·Ó|îî,‹ÈC³Ú·ñîŸí™UÈÏkŒ=øBokUË+[9ïâ&ŒEðw®§(+žÖ…á/æ‰r;þ ä¹ê#WÍ·¸opލB¬…žÇw¡RÃ5 N#ð’"e­€‹Î(iöÁ ¯D~ø{#Ø£ÜÒðò—ú‰èycü›¯éÝŸ ®ÏþŸµ­Ño[hMïUŸ¹þAM­ÚF¥G»F—–É÷¹ÛÕK#ËTâW»`CÆ£>mwäü4Û äŒÊ¯é¢úöûï%ò!²óº¤ÿzÁ}êºþ!Eêƒ.öÁ:,73jßiÑâß°x‚þÒùfXú¥Ìuý™Š ATÜ·B^ölÒÖ‚’Â|¼Ez?lôm&J :Ÿiý‚¸}îdrqA»è[‰fðõŸ—ýQµÏ™öðµUãó¥Hxt28zíëxqÛ?G ê½k U­Cw¿xÌέÄ/Uäv!ï‘Æ3ô4T'éBà„Ó &y××yiˆ•æ4^s,ÿ…ð¥¹þ=0çy…`!I-!DPÏ»Ìrþ=íØê˜w×-n`uBŲ¼ê€àðzªG¡þ}Ž.8t/ˆr­¼È¡>þzW#09J§‚GÈQŸ9¹†'ºê‚îÅKM7¿ày·©“Æå)¢@‹ ÷·Þ) ë-ø«x¼»’5»ïÐÇ+V ø éÒá_‚ZÝQ›v¹d©®«XÓȲÝÿ ´ZÝvx1Ÿmo¯5 X°Òëò¾Û?ŠÖ“'s\‰u´,|á–¶ÿP€Ô5†Tèýïù´*¼Š¡ \È ïíÜÓ®Z9Žz´ o[î@ÀÓ ­þ(X‚Ü´€fpwë\ØB<¸¸ƒÜÿ¨ÙÛç]<O-©ð;9 r ëA?È(pö—)ëÊð€à¹‘Ûçúw#©×Ÿ†í[@ðÞ´ˆ<…à,çGïØQ7:,"×ý¤ÆkÓQ`õBj´˜ @°…)AdÿwãUzv S,íBL¦rts]§¡Oð×_2ßÂß »o¿ñj ÿ(S2üÑÁæRàâpbà0´ ]c°0ŸmÜ Eßç¸SavôÍ$OóÞÇý¾ž³:õL„ü¡çæbô6Ÿ- ½àôó‚H?¢„ýXã!¾®K›s?èáèe%46^˜ë¼ç¥ ÏDïukÓgð|\T„<Æû.ŠÞñº&Z°påùh9ÁZ¾ŠÖ.Ý»V%\ Ë÷;V¥PZzáºè­¡Õk6ïâ¸hý ëEkä…X¾¿ —QF1Û>VÚc´yúrÕ‚9-êqšÓÂ:6‡8Öi‰«6™Pn´ÅO›Uô´¡…–Ó{žlø´)ƨOûfx;µ³ÆîO{o,µ?›Ù£-<¾‚Úæã=¨P ì… ñ0THŸCEf)0‰[¢‚—8**À‰ë¢‚ óŠ'Å»Q±Tün…{¤,6‘ Ûb%©ÐÎü$E1¤T„hÏJ‘¡0)ÐŒõeÇ¢1ÇT´Mųá=)æ§Ââ˜u*t.n”Bë˜}*üŽ!¨Bôð§ÆÛVT‘~œG• ÄTCHWÈ(âpªŒ#.¨ÊJBÊêÄ%fªÚÄoUÉOâɬêH|›UA±µ³Š,qV!&Ñ*Ö„|§‚Nœ¦Uô‰µ Cq¬®ÒQ<­U\ŠïuןbݪüTĊö ]qáV-L>ݪ–ÅÉ[µ˜}«êCpUæB'TõξâªïÅz\%ÀØ“«F sÕír®RcŒÐUŽŒYºJ–1TWY3¦ë]ù ÛQµÑX·«~{wÕXã¯:l\âU«“|—sí5¯‚oìèUŽc}×cj¯ÒrŒïU~rp¨D%j ΨŒ gWºÑ¹ÏQ ßiñt¤\¾×xs ê0¼«|JEw M¨0Áâ¾â]¼RëŽ ü;$Ö«=ÓMŒ‡TܤFZ›ÔLØÝ„ê~{;Œ;Õ“²ßk´-àâW‰…Z@Îê[tûHvj‘ tŸ³²³tV˾=½ˆ©äf_¯;6ú vS'´Y5~€ÔÏìÞêCuÿˆH}›î1íîòtŠÀ*öƶgt³vö¶Ññ²Žs4Å€ÓV}38%Ö›©ÞŠ2ÔR!n·èvW˜ÔÅÃtyíÓêô©•YÝ@ ÇsŒ†!ÊÌÔS²©¾#þ[Ý›Ä`ÑSÒÞÝ¿Ü7{Ýá$ðÙFtç(Þ1¥@Úš¸z©ª‹ÜíV 7iñÚòð…VÛ¶.É3Z»;#Åc´Ü ÓÔ"Rá“ÚÈD˜Â«Õ ¤Þ"µ£‰ðQËHIÔÖ&²Fç@Õ‚º9N šÈÝ?'rÔGªÇ^È1¯ƒüo4¢Ú5î2œ¸ÆžUôÔÕ´kJˆ÷ì€z^™óÂ?%Û8ÖGöi„…Ì béöa䘮qØªÍØ!´Ñ‡iÜ …qZ²É4êcxéÛ=Lã€ìç4»Ë¦xÌ@^[ÙòÉ2@ý%Yƹ¿,〜üz²ŒBš€-ã€`c#™t;;‡e\!+–q7$ï¡|—ÉNÝh=Ø2Žšõ¶Œr•Cœ&D¯*œÄ3ŽÈ5=〰{šIS `HØ4ây›Æد9°z­j±Ø4ŽMØdG‚ˆ=õŠ¢ïaÓ8"èVÚ4n =9k@¦q9Lãòw<€ëï"Ó¸|_™Æå7y×?[¦q¹4í—«÷ŒûRWX®q¹ rËò\±ï¦lã|Çmç§"óÉzpdçg˶q~þ2æ¬gÔ¶q~Žmçg=ãÒzl§WÆ®qz©2t­÷Φq~7mç÷7ÃÛzÇm§UÀžq^(2Þk‰-ã¼ÜØ2ÎKRFɵlÙ2ÎK›=ã¼üe$]+¤<㼈Ú3Î m&ÛµÛ3Î ¶Mã`£ÄN¶Mã€ðÉÉÌ<žè÷®qø¦äߨ5ÈE×=ÏÞ_U ‰m~ÍQ&qmä¦1šgøái޲lãð Ú6lë:Ê‘¸cŒØÆ!aöq÷]’¯Q¸ûá²kܤ'ÛÆa×4ʈÁ°mÜ tú«É609̶³Þ¢mãîû.’Žm〠íì.hÛ6vU÷tã½>¾$ÐìÚŽ¸Æ8Žs¸ÆÝh§Ëž•°Ö€ëc×8´>¨ÿhÛ8 dNXâ9ÊP®q–™´kÜ% /£]ã€ÔU—ÎÄs÷ý•mÜM¯{ØÆÑ^ @«U° Û¸ûåª׸î–÷15/°©–I\Ó,”Y¶q÷{²(Û8>ðuˆ¤4ðððÙ7ͧneòã+°¯!Éñ|z±oœE;í‡×dÛŸøÆñ½áWäÀÇáMª+#㸌Ÿmj†ðÝZï0޳„¨ãК#ÂÆq@Pu‰ Ãþ-Ç!…ÈÆq…SŽ¡jä¦S›Œã¬hjã8¾¥üé2ŽÃ[ºÓOz)ÏöÂÆq–JµqlÅøÚ8Ž£X̬Ă( }r޳«ãðj×c!J^ÛcÇ¡ùJ*œã,í*ã8¾Æ|Rd‡¾ïCïIÇ 7Œ®iŒã¬3dã8 lt jã8GyË5sÐjE6Ž{îÏ>Ç>Œã¬šôÀ’’ Þõ‡n`2޳ ’ãð®#áŒqÞ틟‘qœÕ”l䥘Œã`EvíÓ8îo+ šdg™&ÇáuGeã¸÷S2Xö³Ö“}ãÞOe‡ñƒÙçKçç¥$Åô³ˆ”|ãðÂSEÉÆq˜D@Êã8KQÙ8îÅ÷*Cº6Žsã O–Œã¬heã¸wo3&ùÆáõFE&ZE°"Û˹­ãD eÙ6îEõ‰7X¶qxßo:8É6Îr[¶{YüÛ‡m{ºÆY´Ë®q/"Ÿò£k×8°p.štÉ5ÎÚ_v{¸ÆáÅÝ·©ÒVоöágQ1»ÆáåÞøŠÈ5o.ÒýØÆQ—Ìžq/ö‚Ï1LãÞ²égœ•Íb‡7ðü2ÀÂöe'´˜Æ¦uLÓ8¾]_¦q’Y³i_œ}šÆ}zÀ8¦qk‹iù/Ó8<‡ç—iœ4ßbk²ýË4·Uq¥ÍÀýe'1¹˜ÆÑ¿lšÆá÷m_¦q’¤‹iΗi™ƒ_¦qR¶‹iˆÛ0[Là Ó8ËãÙ4ŽTÈmšÆ‘R¹MÓ8«ìÙ4nQulšÆâ9ã¬Ô'Ç82MeÚöiänÓ;ÙJïÏŽq$Ï–+š<ƒA°½‡cœUíGbñ9ãˆ\÷ÒâƒvŒ#{ûšŽq$¯ég C;Æqrá>‡cÜZèXÃ8+!Ú0n­c³µ[½Bë8lÛvõgÚ“R†qkòÓkøµ°sÆ2ΪŒ¶Œ[ ©õ´Œ[ —àúFJÜq ÷‡ÂžÙlz'ä²Á^ÿ­ûí¡¯ƒðùëû¶ÐäøMÏ[ï|~7#Ö¯k#?Ø\¿w\ѺÆpÞžwAª—¹SSófÐ]¨ÞÒ™y&6DrÏ|n¶õÔz¤ô7óøm¨ ïã ݶ¶ŸôCÜžyÎ7s¶ù.lû]Û–ß)ú•ÚЄ9ç[·aSÙçk)=ѼºVé}¾Þ¶¶{.’%Í2™÷Zz%Ù˜5e©‘´iV£m©¹bm÷ÝŸZÕ¤š•o»ßú2^Y‘>ç *¡Õ,²DÞ¹oRß¹X£ø½sA—‚kýííÛë\×67 ÁfƒÙÙÒŸ›Ð¾¶Þr´QIOÖ{Ù¾ÞÞYµÝíÛªõÆ[¢Ti³k¢ ±Ïuß?sç•°mvgt¾ö{º¾¢íV;xoòÖÇy,›€çô—E“r_Ó‚V2»±©Eks;¦•-ú¡Û6ínÑyå“dK\é÷Æ6w¿dõ+k]ô…é@jû]ÉÇ¢í«’²”ïÃÖ³YM8vÀè‘óY·e0Úiõ}d+,QâX£¿Mwb´ð·‰.´òŽkºKì8NÈÇg•é²Ì’8×4T–drL—”|Ö4fF‡²L—µDJyÙöΠ?|@('ÞÓ$úØÚžÕFÒtŽÙô±õÊ`Cjr:ŽáY-YèØZƒR§Ñî‰?zôÚ=aZ¦ÚB[zÓ±Ù>Žë?ïtâ>Î’½Ž[w‹VÇЛëéùMÎÌ5}ÁÚF†wxKaÇ^üÀê63I"ÜåR.=í™HÉgκлgòdCtP‡Þé™.Ë%ÛªÏÉië8¯ƒH@÷x»³=0wY9ÅåýxßÄž´†szŃú°ÓN^Q±œíêÚ¦-ýù9éâëúós—}¼ííå=åJ‘gÕŽu.tâFEdàqΪ ô]Y¡xå5µ`×¹è ­°\ÅY'šû¨ô,PRXfR5h¡S1¢t浪¥ÚÑqå‰KZ]œ²1—ëW T»}Ö¸X4U+ë:Ø:÷š­r­ŒÍÄc”ÓªOxŽ’‘g–ålVu»u‚^qŽÂ‘w Þ.0 QÉuÈsâ:ê¨ÌÈ% ¥ªD²EÉÚ³ª•lQ~Î4  ,åš§mÎ\]d@Þ£vJ€ª«ë<¹¤»@¤ÜGv1ÅZªê¸ ìK¼f®õÙö”ƒÙ@ÝFÁ˜À³¢2;ªDTw^g…©Maå^õk»»¹ÆM·ÉuðBf­|`ö½£ž¾ÀcÕ[5w"׬Ë/QyÑU»'Âë§úþ: £@EE· ˆ¼£“°@fãýU·¡zÇçèHÁ» ¦¯¾ÆCŽ•põ>ˆ°o þH9¸‡Â¦4ŽrŸ…[CêÅyg¿†Þ Ÿsôtl¼ç¾ÔîÝúB6Ÿ‡ßG=&öÄït¡êß÷hTU×üͬú ž 7¼ˆà¹pSŒJËnœ-‘?÷h®ÁÂåþ‘ý=:"×5ÚxDØ’S«o¨„n£HdCl¥í~oªá¦ñH„J½I"hA¸IÆ^G÷8 yF”[®ê•A%ÙýÔ/ħ9§jt‘öѹ-äÝ]"l?«Lä]âBžÑI^ç]뤻ÍDÖ‘†t×èY!»@}íBîÑû.äýq"ûh¡0Ûì…£¤»õ8æygÓßéx¿¾‰Xù¶bä‰}_Ý…\Ç«¾vû¼+¼¾âBäˆ/‘û$NEî¥x¾ßæfø™0Ã(_ÀÇO)bŠø 5›ÄO±'~ÒÍJñÛ`æŠß³[üV™£Ï¿›¦Ñøý5ÕÆï¸é8^ÄØñRaN—ó~¼ä˜äeÉô!/]¦yy3 ÉK ©JZ$Efò2z&vê¥Öœ¨/¤7î^²›[5–uDg7<:–:÷ö*òÇÛ¶Ƈ·"~É¡{+"Ù[ZRdÖ–fÉtïzˆ‹ß¹1žleÎÍÓªêÚ_A,ÖU¯-ÈÇ›2^# ¯{+GBp¯¹ÝƒYܱo‡gwØ€Ô£#Ý- ×Þc‡pwˆrÄ=ÃdB½©t¨ƒô©¯{‡C–}wÈt¸ü¤°ê8•ÚwäeexÇf˜TØ |ã¤ÂWˆgñxE ÷ Û"Ç:l­wæØ¿‚MP; ê€”io=%´"Yî/×q­Téú›„¨# ï`©#h)×;È>8e"äC䣥ƒu«Û; GÙ ×ãŽøQYè ’”#úÆuâ`I|å¬atnQéÆz‡îŪùNcÀ5îÓtªƒ"K‡w a‚à€{°'vꤊtäF*ñÚoåÍJÎ,ÇïtäÎR:ÉCí¨ÙNQqêX©“E‹ø;¡Dª’`%ûyjSìÄÔBÿN^AÊ?Œ`…+¿3N‚QIëßÕ‰²íœLƒ¤Ü/y'ܨÚu}¥“rpÍ;ÿïÄݦÎíAåîTú v] •@N~¾Êv"p©…È. u5Åʪ+U½b_w_Š.iĽ@eµ/åÍrFU´‹Z- äó_ ,j3hgiV[û–i¨Ïµ>w)'> ]íY;&p õþù¨ØS%#Vzk¨ªËÕȳf }ª8E䞬2¨Èµ@©î/ÓV×Û«j|×ÊÖöèrV9Õê.`µ6«ÞõÇ«,GdõQ,ÝÅû¡«{k{T甉6*FU‰pmOÿwÖ×ö(ûËöö¨ еH–仢År%«ö]ϺÅÚ.W¶ÛŠH]Ã'Ò¾êük#ëåßð+ß®½Ÿc4 øÏŠ¥ª™@`Í~»=}ƒ«'QýŸºÕ·X”º~íz¤[%Uª~-ªÝ!!Ò}‹vFÒ-‡ê´°ùÔ­µêÆé^PÛ§é]uuˆ|º_ÄÎORñBþ¥iN ¹ ÕX/¤XÕ|/¤šäÕ ÿBØÄÿBVm9O‘æß"]`|›"Ì/\¤ƒù›Š˜0wªãÚìãŠ6åÓ¼ÄE“˜·¡¨óNÝbÜͦdŒÞ´<ÍìOM³?Æ“Õ ‘ñô5‰DOg³LÆãÛL”ñˆ7[e¼ÍhɋҜ—¼JŸç¯Z“fÆëØÄšñÊ6ùf¼ÖMЯ~“xÆòÐ<­Í Ls…ÆÔ|¢±N5çh¬eÍKë]s—ÆšXô¦±l6깯¹ü6“j,ÑͶËx3²ÆR߬­±4³klÍþÛJ3ÄÆÖÓ,²±=5Ñ,;XsÑÆ&Wtµ±6£mì•Ízûi3ã²åŠ=—=¹ vÙ¶ÅÁËÖŽ^¶~qøˆç—B\À„â &§0áŠx‡ iÄMLØ#þbB#q>‰™«©’‰ÂĦL¤&Æe¢9±2ñ‰¹™¨°É ÅÿLp)ŽhâϦ‘&DÓ4a¬Ø¨ uÅXM4,Vk"f1_U‹Ûa·Ø³ËE°Mä.n‚{u“ˆÌ›$¡ù¾É#Ävª!Òp²‹“±ˆ|œ¬Fåd>"1';Ñ9”ÈÐI²D˜N"&Rur5¯“Ήœ”O"y'sÜÉ¥¨âÉ?E'OŽ*ÊyòXÓÒëš¹®lØäv'Ìâ¿;§6EÞy·iôÎÍÍ´Wún2¾3|ö]0©ß•ÿ]Mðp€+ pUÂC®\xÁÕ +¸âWI<ôàJŠ#\mñð„+2°pÕÆC®ìxPÃÕs¸BäW‘<âJ“çFTŒòh‰ëU?qMË#*q‹Ô‹kcuqýÌã0qÔÈŒËpž©Q¥Îc7.æy4'v–=½ãš |\7ô M15&äê£G‰\¡ô´‘­55ä:§‡–\ Õ\“Ë¥ž|:¾G£\põø”‹²±Šé§Æ°\Ûõ¤–Ê¿æŠwhÏ{¹†ì‘0×™=6 R–¹^íñ3×´=¢æº·ÇØbnªQ7×Ï=ç»Gæb’ª±:×ê=zçz¾¦ó⵪>·<äçÖãÙªaAw Ñ" ïu‰Ôy·5´‹äy£…X{ÝCi1²Þ¢’$¯¢è(-ôâ1·Ö9nø:Öc’1R4›Èz»§®Óz®ú¡qº„@/”¨,%_¦HH‘ ÷œCfj!ކ˜¥¨deµªõ-)‚V ¾kh^Éo*ºXd½a=võŠ½Ç—Yç³×Ûa.¹]E¥k!jÆå²’×BÔ ´Öú’±VÔÀÖƒ¥èŠaëpÜ>­C©Ø{á1ùzE›l!þLý2òâ°fZáL&bQA[χ•›(¥-ˆøR_ÍV¦I±BZqMfQe[.¡‘#á6×Ôv“_ZôßÈÛ!Gî¢â¬Š˜ï3¥æd×1º…` B?¬[ˆ«ðuâÙŠ Ž…ïäq<²ç6‰ç-ÄkÁBVâ^CO>u‘è#•n߇Š©t÷—Åì}2ÑŽ lò¢Hdí$Ûw-Øvû3´ ‰lïÐ/\÷Á·cxà‚‘wmCQÖ~–J\Ð^ÛS\7f öi® Õáû¢ŒëÆR¸ áFZ ~yô¸¦ü£Ü#¹n.îCErÝ;¥M‡ûïýèb”$ÿç¬\7Öôi" àsÍK9(F“ŒÁ3Ê™ Èï=͉ïma±‹'‘Ï3D:É2ĵé/»žú—D>×½nþ ®"]Ó#Àµ=Q¹DFs”DÅó²¤D¶wº/CŽù‰¸éºQ8‡þéºÖX8ß‹¯WTT‰ÜÛPZ%ÿñžj¬DÖ>[× ó’}¨º®ûÃØ#†Ò7ß›¡ + ÍèÇùlCcvA?ú½†Q5€çJµ¤c^k¨ÙÙ×ô»¦èôÅ%€«gáÜuاˆk6€u ù]"Ÿ)Ñ»î¹}Ã|TÐçB¿D®ÃRÀü÷ú¶ð~Ù‘‹ž0‘}Høì_Nà/Y»‘.&²†º1M űþ½C%¹ÝO#¤Làs ±å‰È©¼¥m^×Ë­%ºÎDÖ·ã9!]”Ø}HHxö0NG´ó %êE-ðgˆUxö0`I\Œè5‘íÂØDÖöeäþ²lm"÷9D¸‰œß†ð/ç>"æMË‚ßDÖú2–ûE8œÈsqq"÷ú2¨ù:E£|"¥cNJÝÃèþe-!zè…¬¡™Nd Uu²“ßw(¯2ÄÙ >VŠôãu¥l ~X0Ä2K9Elµ”wÄvK¹I¬¹”¿Ä¾ËŽëvøRd°Î”â¦d*FbJ¸b6¦¤,†dJÜbZfÛv›)ÿ‹÷™rÄø£)Œ‡šrÍø¬)›RÖøµÙýÝžnJ}ãû¦ô8ÞpJ¡ãg;x{Ì) ]gë1ªS2o/;»ÃÛîN5Xâ©nÛ<Õb­g»x¹ï©Dƒ>•1bá§RGlþlo+@•Ll¨¢JümoÏAgâK¨N¼ U䉿¡Ýäí¨bQ|UPŠ—¢Íäí¶¨ÂTU¼Ši£ \ñu´»¼½U&³=¤*iq´·¼]&U‘‹¥ªvq«Ta/Ž–1›oÓË.ÚSÄv͌˼l5U„Œõ¦ •±çŒÉ¼,/Ó`5Xb,¬&L̇c>/ƒb5sbb¬†O|ŽÕŠrÜè¿}X*«ùÛåxÑ{À»{X±oVŸ+ϱ¢— ´úevŠVKÍ^Òñ¡—Ý´:s±¤V÷.¶Õ±¡—³µº€q¿V§0Ùq¡om5m³­ždœ¸cA/Ñõ6ãè­þgL¿m@o[ð܈mÞ­Ö‰ÈÞäݲ.åÝÖNæ¶Ÿ·Ûy·‡‡#z·‡kºÝçí¬Þ­èá¾ÞíêáÐnóy»¸w×{8½dóÞ}_ÏÛ.¾{ëÃQ¾ûï_Hû× nõ ªnúö»L~ ¶þQ \-äVO€§Æ,é#„¿”ÞÈ´ªÿÜz¶Î‹ÕäBøKôgîéT€« ˜•(S©v2ÇŠŸBöiT n˜"÷Vó¥­æwׇ܊éS„ßî9ËRûs5ù t½2b®¨áSx†5rñ*,ê½cw‡<¼“6ªRþŸ¦$}®ÞˆÔ‰ïöy—S=ná`áwÁèª\/V¶oÙ©þS3¶eƒq36¸ª Š¦vÙM_=—o§z (Ðh.¿i Š·OÇÁ |ÚiUÿ©ÚBÞúQ{æè¹¾uâÑä,ƒé‹©À0¯§(ÚCäírõiÀé~+-KY×ã•-ßpØš1?¨£gXVÑgsÅìTÿ)2>êTmͰ¶²>[~ÃNõ@Ê?å¾K3ÿ#29ÛvÛ´‚ÞŸƒ•·¡¯wZ×Î^“еãӆđgyWßð³”+ì\½.Fä«a?F´ÏL3_uâÿg:×c],#žO ³aù ·ºãÊ,8‚Æ;~4¿×^ö@®vÞYõÇ{©#‡w\R\ö²‡òVýqt=˜=µ¡ßF)UµÎé\숛$úmö·¾Úo¨î”RªÃ†âûV´3{ÙCV‹+$ç™Gà ç÷;ž>1Ø{šÙc +/¦³’Z"¼ãS|iõ­4Ô¶ºÈ[ÍoØÝ"ZeÅA^œÕZ%h¸‘/ë¬ ·r8'yúÛáZyÍëêG#½Wk Úß9q™b!5£ûû§U Ø–{§ß6¸n‹kú§™{v½G†~·oî9©òõx!凧µÓzÌ»¢\€˜å}†EÈóU <`e‡:;6ú|}ØcII­:ìJ ˜ÊʽÝÁ^ìŒousõ@õ¢þ6r‹žÛ*p€ ÷yÊ…»ú’ò*£ŸÒ“zëß{w`%½TWÀ˜ãGᘅrèÖñ{ÆÂhññÄ]ÆÁ`4¸~J«½%kµ÷|È-û5sÝkà 6½Æ]Q‚gŠ~ ‘ËF¯ÞH°/¦ZmãwðqV5- {€òv £´úƒ6Efø3Ï›Œ Xë±9«¼í,ÄðÚ!§ìƒ`Ûv ¸{“þ Kã,÷‘w?íEˆŒ¶*Ë”­€]öõtŸ îxjÍô3<ª½ÕÝÄÿ[ë߃¿P÷ ÙÐq޲6EÊ_±<QÎh{Å›Þè» Øü÷>›D`å­Î ´jÐ1ØÇ:Ú Âô'è nx“rƒ‚E•”÷²Wƒg›VÞå:y³_Rwû>Y±G¨­A-žM— eø8c-,D pÜF™¡>M+7x€Ðúy»›%¼©èUbÒKëý|š« N.dN_u-vÜÒ·‚K îòçØA»…5ÁZ' 'ˆž{d@n|d×€¶×¹þÝœ4»Á‡Ó‹;‹ÚŸG·T ›|¹:o¹š»ëG„}@¬.o#`âCùj[KȾ#‘ÞÝWUl íǼûùBÔÌ rña§Á¼~­ÎúSnœúë¬[Û’¾ò*jüøYîÑú§£Dí3ãê°‹sŒ ˜n°.2ÚL½àÔ}`§±oÊô–‰ ßKïª!iç%q¨V›ÞñÕûéÜü#mò:]“óÓŠ¶“D§óQð€÷3Ô'…'ú”;r‡%ržºß¹˜eÕ± Ô~Š£¦ðAYoÍ"™à¥( ÑÞ—0HaÇ1c±3žË®…\¦Žò:µìv؇°·ø~ ÍcSô ¢zE˜Tשݺ£PÄܽbu¤ ]³Éé`¬ãÝãí©e…ÄH :¶è 9„>ÖÌ,jOïàHÿ¥Ћ7¨ø9[YcwŒ”¦™Ît>3WcQùHÅQÎÁ¤«¶µÎKàëÛ»Oç.áO*½9®³ÓÌ΀ ’Ó´•$ÁÖ·ÒÊ£BÝT®…ܲV ¥c |®¶$®”í ~ø9ÒºPI•ú©k®ôüÓâ¼(…D†\¹ÒÌЦ|”ŠÇGgîtÈV¾ÊÒ†ýª´—z;ç©ñ±‹¬ìù¨KÓÙuˆ¸ÊÀ1ÜV›®²t uÇ•É[O­+ÙÇŒ\§ª]€ípEù*`Ô®/_ÂVíHÝpÕ'Pî¨ûÝ% Å é*„~ªå¯BÈ·¤Š%(£Ô¦‚ k/åñÜ5 ý·».ƒÿýTfßµ›¦Uß9¨ÅùŽd„îøª‘ŽÍó¨–d[ï¨7é|)IU૊N^žÅ]ÓðyGÕ ¼ðoÛtaWõìø(ËS… HÝmUáÎ{¾£R‡ŸQÏ´Žß§£qUü@ZßÛ ¹ª‚@ %66¯¨­ŽY\÷½æºüˆ‹Q1Œ}±ƒ®gT1¬ªkv¥3¤zUC´w´¬Ž5á­š*Ï=ê®û»d?,§ã·‡}U¾…JSÙ.w@ËèÓæ_uą̂– ¤ì¦åsü(ãTIHß».[©:§|Ž1$Él²«ßÚå¸êã¶}ÖÐñ8Õ :;«Šþ]‹Òcò9~®f¤wE@%V*ús^¸þ”lŽqºìÞJAÔ_àÓ¼Íjut—@Ï÷u'OüóÕí 2»!jä®;&@®k˜ãßÇ9Ú.D¸8ª5ÃW‹ µMŽüoæÏ]ÿþˆpR™ÜõdX¤Cà †,6öß’ ­‘k,Ê4K–L)’ñ2B¾î¶•ƒŒàÝj§åþÖyXQkúGÝÝ”UkŠ~»«†jñU «äX»ˆOd; ©©õ­š½¡…-¸Ý=q¥`ì«Ñû÷š²OYëúœå?ò”ÖíB<þ9ø”Âí’qàÁí|!Н¡õ­‚£uµGàÁŒ(2¹@„­ -õ£^ˆK]ã§£¦Hò‚kI釋wº‘›^¾XEn!kªÿ¹(,C»­æú©WÁcrþ:UH½^”Ú—DfRZÆS£OÃEzþ©&ç›\O~Ù[âþ=ÒgÎo¾¹2êºÚö³ËPѲBB”V 6§~Õ[íSËæa'´µmJ‘ ­P#C PÚPÎX¶û/õ°ÔjîR"Í<êÅ¿«fa{rìÀ•x›©Á!‘ÒºÊÂ]>"øX¿Ÿ–T²Üˆmõà`¬´ýIj{{÷o ¶XÎö/®Û-ñ£tÝ:¨õ. ÉTšYðäù<ÃO z¦ƒ×ÆwÞÂK ¶•?&vjúØlåë…¿°è¸,/v›hc³½-Ø%¨„§–‰"o¥8ljϰ•Öo6Ô¬JJêS@¸`ãôÒÑüƒÏ[HYJWÒª3£RÃK~tŒ†V5[á¼Ç‡‰5írJ¬u·ÐB,§X¼Î<è,Þ¦š‹1æ]T eG*Í/ ¥ um‚|ÞÒ{ÚíùlõË‹½W?¯4 ÞújÎ0NBèºÊ[yÊš§Wºl÷Î’ yze©{W·Þ«ý0,ª†³qÍxŸR5|Ëb ´ÙêVß2Ã…vÛËz<:Ñ»IŠ/'’Ža„7êÇäù5ÒŠqøBÅ+§ŸÔѦL­3wäm¤Ôé¨ûÖwÅ£¥Z\uhvKã®dðÞG* ®ŸíEå‡gÓ4 š=òiß˨ŠÊˆØª|X¿quIïï-ÒU9‘B«VPO«*9…Ðêm}ÊOë{‚ªp·žcIµ)¦þ§¤êèðÕº†Ï§¬°Þ¶Päû6†b’ç° û<}ñÔÒr”x¦¢XɃGõ›Þ"•áy¥|ù²%ô¯Õ1ÚÆóSJÃ@êOIak± Áu~¯BZdí¬UH}D¬5ß¾/½}1«TgÝÚó#‚±ýWY·!‚Öî*¤>²·evFÚ-ô³¤î‰Ù®UHkš^e]ú‘ß‹íW?òÍ\œ^n¤þöy•Áßgé7Ê€õ³dW[¦•…Ô×)š‘š±·ë@Ê´.fà¿Î"ûÕü¥û.sì|›ç(?¿|c°æW¡þñõÃß¶pôµ‘ýj.ß{µõ.ñöÙÚ¯ï‚íW}£¶Oûÿúfn$]Ì.ÿÕz ¶uõ3ß̶8Ë4ž©–ÎcÙaÚ¦ùÑܰ Ÿóñmõâ<à(o|½®ùšH$9¯Ê&ï1_·íЫÔo¤ô˜óÎRýö¯5dT¹íûÍ—ôsV‡­•}³‚PŒó‹Œ¦³ÑÂTg©=k,gP¿ÜæŠ'u묊(wqõÊ ™JnêZ\%¤õú’¼2^£Q}c´ãu\2ÞYë¡ ¹ís?€ $½gH2<ûÊŽ{î=”xÜæþ´¯¹I«<[ •4+ô6ˆòfí_½SJ=›)j¤¼)ÞpQGåAÞ”%¿žJC…ôæNaFÞn{'BÛ‡ˆ‚‹¿W±(õóŽƒÊψB,2ï@eA&‡A”‚Š2rKVÀc‰{EDÚ£±þyÔ=²AãÞ® o›«¶´¾3ÊïsïUðFFžSžeü®ý) ¾Å…¢¾–»oÚCÀ!éÚß}„¬Ôbßð¿uÏ2@û}fXJ…Jޝð±ÍöÌ&þ”ŠrjÕì@!\oÑ,ÅŒRo«:°æúvu`vØ!°c·ØS*¼£nb…s˜J…’ ¿uSÑ&âèÕ; =ö[¹cÖv¬TP Ye÷"h'¸Mû¨¢gV*Àf~±„Pã¼½á:F·[¥ÂxpÍ:îìPŸ2šüoÖªïÈ¥S†øWvVúWßêN<˜v}%'`fõåî&þ•ã€QÕaz§A K}:1ª[ VÓW2CK%\7m¤r2Rwþœ ùhíÞÊëbh©Ü™n_ðÎ÷Û¦ŽCBÖµÿxç™@º”ѹ(²ê®t¾ºkPÙ9mŒ1™ôî—ô ”C™¶-%Îp\h rë˜b*ÿ†Ln[ÒuŽäúÊãwM¿:×ß5Ùêzo]Z‘ÍãéâEb®©ª4„;ûïʽ‘ª^Py¸~hW8öþƒ]un›…J#W k),ºÔ‰»ØBÑe#Ÿ·ŠU´‰§ ;ää5rÙ¾ DqöT ÈõUhêóZ”­»œUå*èe?_%- A°ä…ö¯’XìBU6Û¥®àÒå¾ë]~£'Iýå.Ñ‘XÎ.ãQü«ÔG]ó¯rà®éW— ¡—Þ^v]U¤û¿Qx„z{—†»8I]ø.W²~  •8ãgÚUPõ©PJ¤ ¥UK%ÒÕÕª·î¥l5j²@®.íVÝH[viDȯê/€þ6] ¶—ªjÈêRHýȪDïPZ¹œ t­z•!ëÓ)¥ Þ°­©MEq ýwªn î¿Jë@J©GÕw>oÿâÆG^ç¿”ï tq¸JüDV#eǤޯîð¡m?¹ê&ÔcÜ-ˆ^Ú5¡¬¦D!ÿܶà¿kÑ‘Ùý(ä_$>Ý2);>"uû,Ôw)ÓrpW+^‘ßDÊ[| Õô™§i3¾ñ—ªy4¿M5˜Æn7¾ñ›ªO5wµ²Æ•i3¾qñöÞ s«i6oB»ñåFuómÜÌnÐ.7>?êñù¡Q0Ï•Z…yöÔNÌãÙÇ<ÁjJæ)Wã2/‚š›yWÔõÛ¤i^¸î¢ú•TŸ5o­Z±~±Õ­Í»¯ŽnÖu}³†¨1œuFÍã¬Ej0g½R:KšÕYöÔÌÎʨ†wVOõĽÀªmž5X­õ¬Ój¿g-W‹>ë½ÚøÙÔêϾ!:@öQ²ÿˆV=JÌoc"'d›![¡8Þ-EƒÈ†*ªD6]Ñ)¼1›ráÍÛ´ oð¦n80½Ã¹$Ì q°!úˆã3L²˜…â°ÆL‡>f³8<2ÝÅ!”)1³Ì™q(f^Ã5soÒ™Ÿã°Ï‡†æù8|4È!¦éBŠBE(rœjΑcYó’ìš»ä€Øü&Íæ@9°6OÊÁ·¹TÐÍ·roN–}“¶œ ˜×¥|ÁÔ/§¦‡9í0ƒL™‰IfN^LDs‚c²šs Úœ'™ôæ\ÊÄ8ç[âÎ9#»ÎI› xNìLÒsògŸòC3ý*4Ð ¦Ù‚ÊAM(tšjÒ¡SYíš»Xé°ÉΗM€tNm’¤Ón)š›léôÝ„L§øâlº V§ë&~º–`r¨ë &º&a’©ë桪´aªª«¦³ºBbÊ««(¦ÅºÒbꬫ1¦×ºbc ®«:¦éºòc*¯«Cbûº€$>°kL¦ »eZ±kU¦»žez²k^¦0».f–³kgfB»¾&²´KpæS»LgεKyæe»Ügî¶K‚æw»j( ¸ëŠf‰»öh&¹ë“f›»†ù;nóã‡Öƒ9ôC+™ ï êyÎ9à#?´ }èç2Æ„>e\7&‰d‰æa£Çõç<ÕÖœY’#šÇš>tƒ›“OÐÜzÖœŽ’!Z&¨>tçœSVˆq8µäI,¢eXës0b]ŽDÏ¡/¢e0 ‚€°¹Êð5¢Æx™ìÐ2€†<R#²ŸcÍvhv£È!Fú4GÄç#svCóXõaøäÑ;j.ÂÓHÓy6CÓüÞöù0ªÊˆ GŸgŒÚ M“‚p=ßXw¡µOps0æ¡D›£yp‘L›{áÆ"Í\cþÑþh‘\ð"渣Æ(Io‘G-m‡æqLðPøÔzd³ˆ'Ç딢gF?I*Ùž1JÉ>GH)ÊÉÕ-vh”õ$êzQ$=2«º ‹t=É*ÍÒLº–®é5¦a©}Ê#41Ûò¨ª]ð!¾ÇÜ-™´/²¡¨áöün ³fÄw½œÝcÀ ¢éë£Â’€Í8ñ‚1Œ5r¼à;|®1•,Z.hë¤þã U¶éô”²rf¤¥~›9j29®9k½žç¬3?Ñe┉í…ÈãCÝÍõLIê±pñ<26Nî»GËÉá8§÷bƒýêRÎ;Yë“îë)FT¦á¥lœ‰yò<ÎsLÕÏãš&NKÞçt¾•3Á_DkLù/l¶ç3Mœ¸I>C-@ Ï ÑºÒXÏNÞaëÄ™¬gHH]:òÅü8‡ªé¸iì.†ü-¥ µëÈ-PÞ’ d‡B5‹»CˆÜÜìØC–5qH×Ù¡›C}8gÅ Ƹ×ß!pL‰žU-È(Å úüP%²Ì8FY hAzëšrADpfK Iù?²CD>S™¨mDsi"ë‘Pt_C‰ÈyLƒ( ð«’’Ò‚ãÎ9Å–ˆàëÄŠöS´‰È9t|îi‰1ümËC² )"ŸkÚCÁ;bI–¢"rZ«Šÿܦ5Ô]™¡õ®@ÍÊ’XDŽ/g( ûPÖ0¤·ÄÏžwÚBô–%¼ˆœCä‹À±O[(j¨ÝC,ŒÈ:†žX!SsŒÈçºdë>ií²B¶i EdH xÎ!“ľPF;ýÕi$Èæ?W(}ëºù [ûÍ?*®PúáÖóűΜ.à°…ªkµ:݆(ÚéV c(Ü˨âõ½Žpž‡a ÕLøôTE¤¯¼á Uf¤þôìFPÏ÷ð„êw ²‚zO"=¨wixBÕëC½‘Ö8ÔK;,¡úÅŽT¢ÞýÈ)j}–P½†D–QëL¤µ K¨^¯¢©5-‘Z÷"#©µq¸Dõú9J­±‘¬Ô:<\¢z­Žìe/çQÆÔŠ?L¡zWˆÂ¦vލpjw®PµEÌS{T?µET[Ýô‰ânmQm˜ÑÕ¦:l¢jߊioÍ:Õæ=]¢jƒ`ª‚€ˆªvœÝU…Ó7ªÂÈ·*$‰Ä«¢–áUM„büDKVñÑt‰ª*š´Š³¢[«X,Ò¶Š×†o#ºèãvÌ ]E…Ó5ª"ÇHñ*ºŒ\¯"ÐHú*JFRÉFXÁnÔƒGaXA³­¤:¬ŽJ±Bï(wd>¬¤:x·²âûH&+ˆ¬²ò„á-Õ¹D䙕oDÂY9Idž•· w©Nm¬­ì'‚ÒÊ":­,jØMu¦íjûÛx4®¶(`+©~SøEIÛ¶7VÛVEn%™Qí¶í•½•¬Fý»óÙa[Õ)oDÄm{c¡ñΚ-EÞiõð¬ªÄ;zæ6Á±æ¹Ò÷è¢+ÅvºMp¬¯®RA4ØUNÖW]r°”»]q¬ö®ÂEáU܈j¼=p,,¯"IÄçUH‰@½Lp$a¯jLTîU±[UÔ‰X¾\q¬§¯ÊP4÷U=Š.¿]q¬Ý¯ ”åýU£Š€]ql R—}T f^]1‹}rlY Ê[l T‹õ}rl *_,T ŒÍ‚]qlÅ ŠbìTuŒ£ƒmqlú êeŒ!Tá~c]Á„rlB¡bª}*To•…rlw¡ªm,1TÙµk†rl¬¡±½7TBŽ=‡}rlá¡Rtl>T®ŽˆrlÒEï8Ѝ.>LGä”c’®¯ó’®Áƒ9娥KùÃ&¥ËýÃIEF9q[é¶A Yº³0<[ä“_—nPÄú¥{ÃF69qéVˆ,fºU2^À%H“1µ$ÙZŒˆK*è gæi_‹ÒÙÜË>Ñ äV@v{é &bëœç.;Œ•ÐPp8pͧV2”X:úRKw„go«ýïÒÈlµK„_Ÿr¼9K¼œÓÔ¥àxU‘'a8ôn¸U×Ö&*íxþ´¡2W÷áÞ˜š"@¬¨Rºž¯¸;ç³lÒå”Â9BQö"?;‘þ­2JäB» ,ZÌ4Ø]CÒpu<#)Ó—}{~c6¯ïÿY¥;‹òÊV¶“޳]ZŸ!£ ¤\Ÿfν]+催nuUÇ–ˆ+¨7ÕRC§ŒAT~B‡$ÿÑ£Ù™X<ݯ•„,ÆŸ[0<3¦{§âhÀ€V’t„핳R–ªAI¾ÃÎß"´Tpqö³Ÿ6P4ø³”¡£‚Œ¹R9¸´–.¦ïU¼;s$Xå– ‚rZ†Ö’»MNàÒñ]ç¨ownLõá \/'f$pœ¢U‚ë€7eM) ƒœSeVtJø«?*tbZƒÎ0NGÁá áȧ›ÿG?ŒYë7]äY&Ë5•Wul‰"#~Ëàè^|M/×­+l&á˜lÁâBêM]¤Üð÷@.þ ±$é>‘£>sÛÔ‡~#”,àï~*‹GšPuX ìà5IõM4r‘Tã@îçÛéÝÁ}t• ¡G‹ìZi¥FýÜ·b5¬ÁKæ¥ómLI¡$‚<¬ÕŒà'‡ô—ßvà©æ€·B'‘»W(tð ±LTÆE@žiBÁí.%õ{ÙÜT*,agäé83½,ë3/Óñáò©3"!.Æ,ÿÏêPuš†uâ”a>wû.cšŽÞ1 v• h__Õ9ô§°Ì¤¶Ü>'›r(JT×ó÷>½Cð|?(nòˆhÅò›tÚ½‘ò9úzÁz1ÜDH1C¡ãG#XœQÚÚ[éáR<ÜD0ByWQtõõz¸f¢PÖÿ(Hîé&šÅþÁvœùð¹A©±mj>¨}O3 òð#K¦ ÎÇ׿›ëÕ$D‡›‚v«W¤"åÀ5äúòY¥ÃŽ9æK'Á]¼[| ñ1²ËB§A×¼œô§â%¢oÓÛA¾0\ÆÏmþ¦X‰èwcòóx浩±%_½á$R×÷z/Y>ô-¸­kܦá$Ò·SÍm]Ô·ýŽbèè‘N"ýØ\÷+O…~´Ðkyõ„âéN"ý„^(/ù ÅS|±þ>Ÿô NÞ~¸‹ôs]ö¼ê—ê‚»g¿1õâ {‘~9¯³dôþ¢QÕî1ýŽw‘^0íÜ–½T\lh¼c9IßLKΓѶ ¨e ý·ò±ë• @E*ZÝÒ´Ó D+ É‹¼ì5ÖÑt µÖbÞ¹Õå{=ÒN¯ÙéNö’~}D5Óª¾Ù+jgÀô:æî‘ΨvÌDk¯¨]è„iiU;Uº°ÚÍN„|uuzÇ£[Î9wEv€+¦è3=aí®˜’®«Þ0 `¶±E§ù¬m¼\V¶±ÕÃù¤V¥Žh|²_‰ÜöVD™éOtÐÁéuŽÀ$-w/çi[…pà=Ò¡—ÿnÛˆ’ÜîW Š]:Ö"û‘/}‡c`t@Ñ›‰ êàõñ3ð;·[?©cCpVÅ¥>†÷Ð&('¡`}öA¨ÂÌ£6 ³f\(Þ=ø–׈‰)`P±lÇÍÔoË„v¼1Dñ7ׂ2‹ècïõ™Žãñ÷«Ú±>~3e«ð–þr âtV‹2¼~×=³ „×ò¢¯_-/Jrð&Õcb»…§Ó$KDö™PëF Þ´z½íµð¬^•·Ïgäuà®-T¹Nh;?ÒÉsç¡ )ÏÄ‹W ”rQ¼yÕ<ït¼é6yè„¶sä¼`0U¥¼ø¸”Þ(w>XQ»G~Í·³êƒ¹gž¶”ryªÊæ¡ó}¼Ã©&¤2Õ @̪ Dµ¡¤þ€7¿ŒºD ­7ºŠÁ¥àž• µÊªžXe*˜)2‡Š*@*Qá%ì2gŽÓ U¿P¬0Õx€Ôk¦:ÐÁbó;jE@Š“ bÈnÍSzU”RÕÄ®[a=«çBµ- uCUÿRÅ•ȸ Q¹Ëh¨X^¥6 U8èj€zøU°#R´ßªé¨§]U? {™€ÅÔ/ä– Aþ7giËü¡ªûÕe=‹¢ó6!xëùZÆ žžY2© ÈQö´q!xkœ ü!>¦H—G|P¢àÈ)JTeE¨ïý¨ôÐ'ÜèCp5ížú%Sœåégg!Æ)-q ‹>gË¡c£\‹}­”zÌÑ£˜|ŸBJÏÁ jœíDðöhÎÅ[c¤€þÙÚ‡@ÿ®‘õytž¯?bä4÷×—½·žð²ôÓÅÖ\˜gë¡ _<ø?½Eç&ðüºQ6"ðÍ|5ŠÑ÷:F õüHć@Íý¹ªâG ÉÆ&„_Œ^û~BùßÕÚR¹{óE¾ëËØ˜à­qìíáž…â ÍZÒÝÈQjR­Õ%™u£Ïq5pmíJÀ$]CŠY¦ \$_ ¢¬&!œ>w½,è,ÒÝŠX$,PY«3Lj‰.w#¬““èr ¹§OÁKýžþLý)”ìº[—Úû”#ïja‡†ÔŠýJ¤†WíÇQCŒ s² T‰»NSÃÞ(”`öªe:zg@ÊÕáy[¨{ÕÆ¹î÷èÏ [Êë'm5Tî¨ôöùÔ“ïé<;êOA&¡¥q=*ùIçíÝÚ± ¦(7I寞¬E‘ñCÕ>éÉAvñ¤¾¸ìs”†\‰P¼ä¤Þ³õœº]XÌ‚'ïönE)c“xžƒ<¥(éÇq ©aÒ‡DIªÇ!¯ò±ã¨fR¨Ÿçñ{ÏO¹—€ƒÄœÈÙ¬½=À‰"âª1"Õúˆ†àÛ5ºõÔ°ñ Eù®~Õµ÷Qh°ò(ø@^ÓÅà½*("éà[x¼¤:Š›óSb‰Ÿy­¼<‚Šì ð†ÞGA{Pö¡Ù§fiß»´ù•Ÿžè’º#ôh˲àé­ó¹ä%ðÕ»Y(¡îBêaHüšƒÁ¨?ÿ8;\¢Ïû©¶€¤t)?Ÿ²¢Ç[Œ^M$c¹,®è%f©f?Fï·$1‹Reeöd¹ˆ´læòÄ4Eu%¤ùÙŽtýì~–2;+ÔDöO©®cE*à,ÁrÔ]ê ³¤ ŒVð‡Hÿó)ÍQ+’üð”ZhOçK§ÝòUèSºÔriDžFêÛI¨}̓!S€ˆh$œšoÛ†—,ûj)(vÝ·v!Óê]XJ bÌÿkªëQÓú¤oô˜ÿ[=÷S¦}kòšÅ<ë¡_lkÒJý’i7wæÃá) W3 Ö§%r7É©Y¦Íý·Vš¦€Z¡£»XÆ+¤¥Ü%ܾõú°ÖZ¥¼½MZë)UßíµZDé>`6ÄyRß]ý»è°R˜ ¼m«Pl% nOkWœ%R½ë±‘šþÛÇVZÌû&•Œ£Æ}k‘1éf)&Ï:9ýK¤ž{ |¡TƒµD¾8WòèŸý«ƒ”È@°Àýç÷A-:2þÎó)Mê|—‡£µóû¶¾ÉøM˜Ü¿~÷û)m]_šRWï}JÂÙWxû|þ#+’ÖoÑ–Ü)»Üç¼›¨Q۸߭“'b[g¿-zj6È»ÎKêí~ö6vñæó¹µ IžaèÝ”Àq?æ’s÷‹°áÂ>óeÙö–©ö eAw¿tã©×P/&¼óhNâ—׊îz½‘ïíïX¶VuÉaAw-#Ðââî•D¼¼^6Ž­ÏËïZÓð]Ž4Ð}õb©¥ÑŠî^>7,P÷\b‰Ák ç,l@ù„”FÕ><÷Ô»Âû ŠU6]c¡bÊv§ C€…+`9f5‡ê4šTŇÈ5°½ôõ\8¢(ÖL×–ˆ`y‹öQŒëÔ¨f©×>êXDög `¬¡ëaDʪsé™_ó(ck)8ï„r{¹8¯G/M/)‘ÆÖ²iìþ†½4¡ÍÛW¹V/ö}½œQ¨ÛZÙZªãVp „ÔZumÅ¿þª—S12–¹öIê0«Q_掴[^[¡8WƒúC­c5¨t@׺£êút&ÑyA½²#oý v§ÖäVöMå,•¡›,ߔŀÐtg:‡s@eC”fK~ÔÀ.€BkR÷VÖ…—­/DgfxÙZ¼¸“7ÅUjÙùÞ£½“ÄÊ!gó|%‰@*×ì<2ŠàÊ5¡ÝnlQ†Z9ëaW åµD*aîܪ>ÏW~|ˆŒëzó›‚ñ’ú3ïÚG§ë‘WJOy¾Ê¼%ü¶/“ Fj¤jû+±K·ñ[× ·ÔbÅ]£ÀbP[‡ƒ_[ñu­ÈÙ’ª‡@Dª•ˆ[3¸j‘£¨¤k5­þjqtÕf z%Yá~´Ltg'}ëߨQo«®T‹?—M«DÙ®£ÖTZ_ÿ¦ˆðsê ®YYVÌu-,oíc)a¸¡üÕ1mlÙ4 {k·Šð#/ Uâögï_Õ:"Uf“Œð³K¯¶«~û#û. ø7e„Tuq_'‚pþH—0Çé2çø²’ÎêréøÑ]QF¾v]˜—·‹·ãHBØ·©kÀ¹“ªûf[@ØÏƒŠÍydTÎce a?y*lçáTñ;°êã~Æ-*ì×@eö¼)*Åçm²¨°ß8•ôóVvÕ?/®e…eøZ}ƒ¼úê-dy°¨°Vu(²Èt#ëúY«,2ìõLí’¬yj©d]TÛ%k§Z3Y_վɬOÖiµ²–«U”õ^½$o j7e×PK*;‹ºVÞ|ÔØÊþ¤æWö0õǼͩ…–Pm¶l–jÅeCU».›®ZzÙ˜ÕöËæ­Î ÷wu¸¹¨(ÁýGîQ:Ø` S±ˆ;œWÜ­xÆMRÝÔv€êÆ·ƒX7Çèºî`ØMvÇËêÃ;¤v«Þa·ºùŽÌÝðwônR€#|œ˜\àLÁgæ((á0Á ‰©NZÞm&5bJ8ï—©‘éNŸÄÈp†eÒ†³0;œ©™üálÎg|â8)4Íĉ£™(Ê-MVqúiBKå§"¼85'Æ9®y3΃M­Qªlö³i3tœq›Åã¤ÜL'îf9¹7cȳŠ\$0óÈ…³“\lÉõsœ\³0Êu 1¥\ú—ÊÕ±­\@ùe~+ÏŠHåYz; Ž"cÒ{RzP±3BE3lH k›ŒÉɤÊçƒ&ñÛ%´CÎìéïAàÄý½M’ç§nÓ ‚ö y¸¢Ø·É&¥,Â1§=Ñ>X©Ðdx®É\ý ﻵ§çöS5ºd?e}8x´ŸÒÇ\ÛžÜwûTÉ)œÝ {á3h½ õ—BפoØùVÄR#ÇxûÔò½’cr•%|>3ÅÖ58Ïå~=E$¹ó­A–èBèÕ%Ìð v™Ioƒ¦-ɇP¹éàüLºw!÷ „K^"¬qz1žÁ,§2÷¬„2I3Ô%n;“q÷Ìt_ÆgÈ„·4­™ò ;Ûy 6=Õ9Ž]—Tï8ß²´fìYÏ`õÓ¹˜ü{ë¤JœÖÓ ‚D`í{‚€´\…herTwIÉÕzX¡Œ‰¯1Р{†Z1%sUéI‰qÂþ‚‘l¢_½ ©µdLƒÍi¨rz”ƒæóúšïçÓ Ò‰ÉÄÅeÖ6¦JØ2†d7Á…Ýß1œ"Ùš °°%Œ&¹,ëã( nB‡€Fe¤™“iv€×¸YÐ͇ª¨8Ñ挎¦v¤Þ“Á cò‡ áýK²ù˜ÚñÂïœ2¢n'“¤¿ù”,lF•$?”i&vˆß9ñDѢ㘒œÆt§¨}td²ŠÿÞçðU!k hI/)C\ë9åeÐk=TÅŠœfÚæ¼=“1çå™2ö¯w*r²}Ù4i>e~mQî~3nD>s ®Ì—ו›H«4cf³ré|ªþ˜±<*W=Û˜Ü#rßS’“Èœ”Þ•‡ËÕyÎYÏÔè¤ÏóG¤°´'=²¸(\ÿLN õè£잎\œ >§F'LzÈr=}>Æ &‘Ï35:¡ÝStJ,CŸë) œ †Á¤c”;Ÿ2¥ð|)Ûýç5FP‰ìçTãQVR®5Æ]KÐì˜ê@>sl–´ÜOÖjä;ŸªÎy>·€5Fx‰|¶©ÞùP½+“À4+LÆÑîr>cæx"­kÄâB<ß<‘ë™*êým4G=þýæ2àEºS¿ÚÛ¾0êÖÅÒ}3®›ñqݨ¡ÝÙ73cèºáU×C1ô;ûÁÉÈ»ž­ŒÅëùžýŒf¼^ÏqFðõ¬gL_ïÃÐôìw&ãþz¯¬ WoHzöÛa½ÁÐ[>D={%°†A¯Q9Ðr2$={ɉZ‚V¥(*håŠê‚V·!òÙ+`Ô´JFáA+éôìÕ6BÑ3Y«öôì•ýÑ9¸òG¯B»C4-´ƒ …ÏÞe¢¡(ú½Y ÏÞÏ"á=/RÚ#硽s(|ÖîUí¿QÑ…ÏÞÆ£?¢­þÿWݵìZŽG¯ïWœe7Œ;f‘,>äao´OïÆ^ÉAA;ûïÈŒÈHv_1¶!a …zòÖ9‡d+i…Ö1QÄÐD?UX E‘G ¦(8iŸˆ^,º¢ðÆÂ, ,Þ¢(ÉŠŸŒ£¬£XË*1ŠÇ¬$£­i€2¬³ B?‹Ö(<,]E–eiq¢ÖωHÕ;Šd›&(£] õ("¶˜ƒfëý(®n’ Œ½­ÄðÜÒBŠà-?¤(ßEL¬b¤\ÁJGÊ'JF”‡Õ’”•XQI™K‰.)¹±.“ k7)I²¾“’¨&GÊDË:QJÆJJJ¹šÕ¦”ÏY‘J9ŸU«”ZÙJ¹c1e~i…,å VÑRžj¥-岥ťt·Ôº”[ÐKY³E¿”Y[LÙ·ÅØ [_L9¼5È”ç[§Lµk™©^`½3Õ¬‰ÆªƒeÓT˜°´šŠ¥¾Æò†õÙT) 7I¬ò¦BŠ•àTl±Zœê1MQŽ5›¦:ǺNS¦cí§©×±>ÔîXC’^Ö˜šD^É–Œ+UMjÕ¬&ÇWz‡%ÙǪ˜UýX8kÂ¥wXâ€,À5AéšÆ`I–aÖú,TÈj`7PïËÆž»…Üá1 É„!¶¡¶$KÃÀîLÀp9$%ÇqŒÛÿ\l³²aIǸ‘š`'Ý£ëï˜aɺ‰àðYY¡K=·qPRy mRXäŽD6‡%Ãì]çã›Õ¤õ½»£5´ŠS‘zž²\$Kw„2X²ùÎ ¸¶¡(µTÇ`ÀE(ø¡*2’óQo„»ÈO•"´wB9½Ÿqƒ!‰›úKVkÂ說D—IiëmŒ˜X¨®8òM·óŽ–®ñÍ+û ”.â"ýuà\ /†("Å@@ u_’ã£LŠÕé¥Ð\Òð­e+Ñ®¬†& (]ÐO%BÊ6ÀigÙ8šwBŽ=õ Ðg¬ýðz(KÊdÀ mgRÆ*½w“cC“ÍTl[9{§@h’•o´ÔÄœGãÃTmvŸªh è(8Ô+ÐVgˈއ”N¼Â_G¾ÐÛ©½VÁㆾ‰+n©t\¡|{QÉc ÝùEË]¹iWä ðÒ«Òr)† :åM@©gA¼»ðÞ)Tƒt¼ôÓïK«$:ùƒ$t°2`/uø º™ýTò&©Ì¶q#Ày6BRk¸!ÌÂ×½h6½dw”‹Ãá5®'[){Ág×pS ¯ÈnN ¹À!ý¹RhH×ÑS¤=ª®[ͦs-õu¸ Ë©„%„é*= ¡ˆ¼ :gœT#+L —Æåç;vÏ#³G*Ú\±ˆÐ"‚âN#倜„F¯øÐ½0X¢èýÿÜ2aÑ·Êw÷5;âÀ²¬MMÝî”7\ó&Ñ !»Àrv9·}ÍŠÚ0dKXð\Ñ]"»ýá`}@®òú}ÍEyNuÆå‚4Û]Ê•Yw !Û¢ÈÚ,øÑ3Ø$7-ˆí]«€ß@ýO‚°jlzáËRe[6Vvê{PÙØfÿ­*ÁÔõŒF]3€ù÷Ù響=ºõeJçˆgQ+ =@W•ôÔ:yÅ9Àåç¦Ï¹rKÓ  þLE2N9 a×ÖWŠe§äÊqùŒ‹ëˆÓÍ£­¿C¹–¨ëtZÆhÁCE2®tté¡|)ßW ùˆ¹"â+uLuÓ[çz¤ÞLX²W‹^Þc²—*_ïùÿh€+¡Ú$€Û¿¹mä>ÕÔã^ÓÞ¸¡y•¥¸g[É®q_;Ö“Zª¹ó¹¬Í8~í±ù£¶|>6YW›µÃ2öÙöê­äS/™ûù1iOáj«Î-p]Æô€þS*‰~åX6¨‘ïqÝ]þi¿Óc¥›Õ R~nV8ùBWýé.'\õÞå§æ%±bxÜ î] gÑ+ûüAžMÃr}È»Oäq)®ÅÇt§ |ô¡8–£" „ó(?Çp–5ã†,@díEa PÙýE¡Žbø= êüFÔDž e¡éZúEbs*Jf°6Ù£Øñܜꦘoa³âBŸ8)vÄ©TV_Â2óƒÆÉÕÒãTÀ8¨aÍX}s%g¼ ðGvLSL<‘Jdû[ÆÍ84ËH±5,üãoÀJrþ£ÃÂ|Æñ°äÓP¨_çsÊИ'øÌ`ÉÈUYÅܧ(óÀ¹_†ÍÊN`ɨI ÚóI{ê¢ßÅÞ2Ê„`a:ÉŽóú˜NÁN“ yÛÌÉâT2“¦maI°3;[~0Ô ´ é* €ŒcÜÄØœw|§éE·ú‚ë* ‘+à$ãX…WÃL™Ç„r rñq$c'-[0›6i{o¹vÁ¨;Žòñ©=¸aˆí;…hÐ×hâfEfRjR–ðkÍ’06Úõ× ðu<~Gt3_ $#Ÿ—{®º:Ý’¨m¾íKpÁz4Vûñ‰Fçç‹êîc B(ê1Mbìy*8M÷覰Œ(;;0¡Z¨Â^Wã Þ”ãgœ6„e õÒq Ú‰‚×Þ5¤î+a¯ç ¤~æN €ûÊó³"QË3Ðun#z2xç6x Kê-•hÔÅÛ<7͘'ø ÙLÔqât!š[llMCêž| èö"˽‰AŠWÓÂér°Lg©×/ç¨6]r² [‚U—h¤WêâÑ¢K¾JXhÑQ5ñ=ů…?¢øñj˜×h3–(]46ŇÎ)©TŽæYi¸ãÐ;kæ<ÑÆ»^vÒþ—’—!¹%}vRä‡úkG³¾»NbøA¤»€Ø°PGg&êÇ`jÁ_k&úÎÖxi!Õ~Ýô=gºÍ[_Πsà¨Q˜ôD _É!J=ô¥Ö[*DÙµ-,¼BÝãD0ÇDÞWœ^¸É–H¦Ú/÷ˆ …峇ª>˜Ùøÿó ŽôHI žÿJöBX&µØ5fŒ¤Æ‡%—’È8ë›$$Åݽø)d¡½µqòD\ˆÓ¿[–P”ØuƶCÈ–•0ÁX¯hèƒR¿&90í° þ¸Hœué+N²1’žcÃ||c)^±ŸR‡Ù©]°Ÿú© ¨¼PUh®eáÎ-uö«”s’vKb>Æ1R| œdqù懅c’ÝÒ,Ùåæ+K¬dy4í·®%å(|=‘ >®™œv_×Eшºw zÆãùÔžaÔûs^—xÚ\ˆŠäùZQìmJ×±pÍiÖבT¯ ² ¼x`¸·¾ÀVº¾I·ò:]‘ö¯}-ƒµ•+NëL/¿+Ðegm½­w½Wb”ùŃ`éz7×j7íí]÷ ò·7\T6ï=S)O;EPâfßMÄšóŽÑÕû±+­G2ý¼q­ÇÙw6Qø¼û!žŽ÷¥vÈõL¯ã]TtAï´°Ì½ïÆ°]3p¬1Óµ¥‹©èmlÆ­{†¹íÎcÅùx÷/bM– Záè·î¥¶Hï»'Ûøcg'¦ý!Ô}C+²|&R¬ãáW¡¼Œî{EµF:ž¶|ø†Ó™îæÁK õÈ Ä]u¸°,ó)`¨–ýè‘ɶ&µÛÑ ÒÖë!ëÌv<¢ ño)m[R»+š K„«¥ë±áð}mQY0{CDT‘ÛØöèÙt=¶ÄŒ8,ÊpE‰a‰PQdãšKé#¨Çg‹FǶçû®€u ¬”>P.•NŽAqÆjªØxl3Yâö€%?UäÞÄ–8 ËöPö€%†¢ù"XWÄ?Pô¥[eAËÎ\¢(àÙJÙÙÅØ€cÙ€„aî]ê–¼P3¶yðCÅÞËYê\`åLaÁº¬¼*˜ä£ç^a ÁÜ£f Ֆ•ABõßLý³¦J¿³ß Q²é‹e>êû)™ºç­Ä¤ô\”úúÙ•ÌG=^j#éù+Áö•ÆGÍ£õšk&óm=c¥f‘ÖŒe?´®`Ñ´åÚ;,ùÅõiÙ­a lÙ×9ª·â»`•½.¨ý=Þ¨yíõfæ[g‘½™°ì{{祎™zÃQÛÓ›™»€e?´S€Ñà än¬Ÿ­ï8–ýЮ4’àÎ…ºÝ2úî6g)tq´î‡vɉÇ]»mˆ—ìò;Úm-ü¡–¹÷]Þ;wvÔ³¨J›¿Å@ä@Ø:K” Ô7¶zÌô3³dŒä‹¬"5³Ãoói€Þo·7y—ô‹‘‡ßÝë»t ÂÏAüƒ\´•AèÄÁ5 ý"]pä1†%fp9ɘ<~ˆq÷žÏÙ¡9 5`ô¾GÓŠW‹ð­¡¢$ ]òCÌÀ;2Q…ÚÑ‹ªØŽpTé®(¨ªá)Uż¢©ªª›‹­Ê{EeU¯È­*øæb«Ê_`œT„X§EÖIBEšuÚPÑhH(`­3‹Šië\£â^}Th¬Ã‘Šžëü¤"ì:c©(¼Îa*R¯³šŠæ¿>¾{ÒÀuÐG8ø…> ŒMgôCÂG}¦¸„2E?u\®5¸ƒu0I j;º\Ι¿]Ç›ØO¶½ÛŽI±¡€é£T´Ÿ{?n%þ¶É¢ûüµ÷c[´-³Nv—ÐÜvøKào; †Çð>D†FJüx4dÜ£¡‘2ÖØ>pâêCmBœÛÁ7v <ž:_ÉŽv€.,µÙÃú¾Ñ5Æ>¬_±àH¸ôäö¡€½qÈ^À€„ÏfÜð‚uY¶†?X¾Da€{6ƒàëF: Î(4ĸÚÑBÊUt²+äEX°rLLÅ!çÝ‚éåP~Ly!A(gG‹Œ;eðŒ(m`’ê¾ÃÚ)²(x˜¦ª‚GGSÀñ ~ h`* 3î¹%ÁµÈ«EAçÌÚˆ?a0΀,ʹ7ÀÎ¥À%“WAÌbêbºx7 A¹îJËÚ鬰ì„4‚s6 Ò¸·ÈqÂ(Ay%܉ô¢B@À¥Í”òõAe…6ü¶5äUZ:8+eß·Ne½S³0^äÊ,Ø4÷Ù`baÁ¥šÚ °Y7¡Ï­!ÒBÓýX;µ5æ Øäž{mà·¬x4J5—' ‚ÆÐG(ú­.Å– þq'²†¥õD,2 /ÈG¸ÏýÄ—wfkhů ;˜âð£á òÎl…%h«Â) ÒÏa(cö­3[ï”—2 2-£&ƒAD¤¹­°G_¦eoM[ŠÛ*K=ë{ Z¿er«®§@¥uÍ<­û2¿U·^Öz<…qÕ#lüV>fce5ÆÓjº¿•SjX®¦ÝÐ]®Œ÷jí4¾+×—1ÂZ‚†k™6¾+—²áÈZî…XÖÑÈ­|k |Ö›el´Þ¾Ænåjˆ5ßáaë%7N[Ac»æ^a´·¶“„ÇvÓ¨®Ü *ç–eܹ65cÓµñ5¦+7GCܵ¯M¶1]¹š^{µ÷ÚÏ Êמߨ¯ô öËwü/ÿb‚€|P£¿ÒO™h _f2‚ü ò‰K¿iâƒüª¹ò½æOÈ?7F,}¸yòóæj(0ŸCñ‚I² )Š¢¨£h# LÌ,Qðbö‰3T™Å¢8ÉL—¤L…Q¤eº ƒ13j¯™uSä¼"æ(î3yG±¡ >ŠM*¾^…‡šL¤XÕ„£¢ì)I1¯‰KŠ‹¹I= _7’cðF¤AÏd+ÆòÅpßœ-fÖŬ¡Q¿˜Y4z³F!c†ÒhfÌb™N£«1j”6&LöƤª1ã˜w5ös³F°cþfS¼2üð6^¿}¯?ÌsEX²l™ýÅ`Y:ͯ¢eÚRx œm´Q²ôQWœl\m”,}ÔÁ\h£dyŒÚ×þsñŸ¿ãÌtôë–¥Š×äqݲôQ¡­:·6ª,xãc[þá QâU*Kus§ò¨²´Qqvp¯ýêeé£Þ,g%K…mwíW_–6ªæy€ÒC>#C¼Ï• 1eð˜ZS©U 1ehcb Ô€ø¯öW­€ ƒÇÔüû®ið˜šk)ÃrÏ£l“¯Aehƒj¦5¨ mPMt]¶ }æ¹ÉÐišk mÐÿ~4ñto}åõA¨\ÑÀ˜ƒdèƒR öQƒdèƒÆ˜A¯A2<í(š´o’á1èL)P¢áqw(ôýîhèƒ@ ‚$äOâ®á´ôQè©‚Ò¤GÉò¸ªyÑÝFÉò…cÐuöQ´( 1Û‘qDËcO4Ú¨:ãh£ˆmk£ íÖFAtf\;-'_îN¾ÍÎWsñÁ oæôëýã3Їåõïo~Ë ÿãÿýî§×?|Á/ Øæ\__~ÿ6rÈ mãÔg}}ùéíÇOËç÷™’u~þçŠ^ñÏÍÖÝÿœúçõéøüœë9ç¿~ù-~wë¿{¯ßM¤¨ï°Üûz}ù··?ýÇg ÎuçG—úáù þ%b~bá¯ì+>²¼VìúãøàºŠ?®?÷Éíç>¹ûǸ—øãü¹¯=üú™¼ô{{GI±žÈ~~ÇÉ×}~böO¬¹å¾ß3g/>ò7ŸÑ”i½Ž"ÒW$>Ëã ]óüè‚æw×…t:úÍç/øæû¶ç÷-_ß|Þà•·ò/¿Øo¾üÿx±×¯éb_ÓÅ‹]ß÷®_óÅýÿàóûÞ£Ìðxûù}|wÍeœÿÃoù¿¿Ï¿ÔÏîŸ=þ:?{ý‚ŸýùÍ÷ýìÏßü;<= ™À(4±§£ÿýgs/c½?zõÎï/î?ýË'\ý¾îÛýÑïùJöò•7ÿô÷ŸßGÀÈöthײ,úxHJÕê÷>?~¼}ÿöýÛУ endstream endobj 2563 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 32761 /Height 1 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 32761 /Colors 3 >> /Length 742 >> stream xœíܱÄ@ AmþAßÁ {üŠ®Œ}ßxï{{sÈŸæ??Ì9 ~˜s@þü0ç€üù÷æ??Ì9 ÿvÿ7ý‚Í9 ~˜s@þü0ç€üùaÎ?\~˜s@þü0ç€üùaÎùwû³/Øœòç‡9œ÷¿ß¬_~~þü£å‡9äÏsÈŸæ??Ì9 ÿvÿt»k@þü0ç€üùaÎùóÜòç‡9äÏ¿7ç€üùaÎùóÜòç‡9äÏsÈŸæÐùÃå‡9äÏsÈŸæ??Ì9 ~˜sÀqÿñó9 ~˜s@þü0ç€üùaÎùóÜòç‡ù?lüv Ì9 ~˜s@þü0ç€üùaÎùóÜòç‡9tþpùaÎùóÜòç‡9äÏsÈŸæpÜü|ÈŸæ??Ì9 ~˜s@þü0ç€üù÷æ??Ì9 ~˜s@þü0ç€üùaÎùóÃ|ºí/ä‡9äÏsÈŸæ??Ì9 ~˜sÀqÿñó9 ~˜s@þü0ç€üùaÎùóÜòçß›s@þü0ç€üùaÎùóÜòç‡9äÏsèüáòÜòç‡9äÏsÈŸæ??Ì9 ÿtÛ_>ÈsÈŸæ??Ì9 ~˜s@þü0ç€ü«ýÇÏç€üùaÎùóÜòç‡9äÏsÈŸoÎùóÜòç‡9äÏsÈŸæ??Ì9 ó‡ËsÈŸæ??Ì9 ~˜s@þü0瀹¸7{~Àæ??Ì9 ~˜s@þü0ç€üùaÎùóïÍ9 ~˜s@þü0ç€üùaÎùóÜòç‡9tþpùaÎùóÜòç‡9äÏsÈŸæpÜü|ÈŸæ??Ì9 ~˜s@þü0ç€üùaþ}}xV endstream endobj 2564 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 200 /Height 200 /BitsPerComponent 8 /Filter /DCTDecode /Length 4705 >> stream ÿØÿîAdobedÿÛC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YÿÛC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYÿÀÈÈ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?Ýûµ!´ö«ÂòØSÄе|7´šèsK'K¡˜m}©†ß«gdo÷H¨¤ƒ¨UŽ:™g/CÅŠ—¥$Xªr®+xÎç•[ÈW¥Ö¤Q]Ôisž{v—eJ«OÚçŠõéeÜÝ ÜÈ<º<º‘¥zš¯"Û¡>ƒ\Ïd/—IåÓ~ݵ9o"5o']‚Óì]&Ê•eº~ÐG×=L©G ¹šÜ¬VšEXe¨ØW™[ ÈR‘9W4‡­O漪žë:)G™f¤ùíV£‹5j83Ú¹¥VÇ­GÏÐξÔáiíZ›#O¼E0Í Ö~ÖOcІRŸC?ì~ÔUÓyì(§Ï>ÆßØË±Ç.¤s֬égø©¦Œ}Ú§5“GÊäW»,*>ñFŒôGCmœs[÷"@W ÃFû[ƒ[ö9Ç5æb0Ö81XD‘»k#QŠì#\šËº¾Æy©5 ¹®fúïæ¾Û †Mx\7>¬¹>£ŒóTdÔ¹ûÕ˜ò<§¯zôZ¥Kâ>†Ž]u±¡ý¦}jHõ.~õfmZBƒµJ«FZËUŽŠ G8æµ­o³ŽkˆI#׊ձ»Î9¥W+Äò18^‡lŒ$\ŠÅSÓî7`f¯È+æ±ô,™àÊ<’±Xõ«–ëœUFû¯ڌ⾤™é`cÍ"ôÒ\\ˆÁ R;ypç¹®~þçæ¸iÃÚHû¼4‰.oñžk6mKÅYÓÜ4µy4èlšN[&½ŠXUc衆„äLÚ‘ÏZ*dÓF>íÕõX•ÍEKÙŒt¬ë«AƒÅuD1Y·q ô¥À£ˆw8‹û}¤9&›1ȫڔc²,ŽÙÈ÷¯7  „½¥-NßO}Ñ‘íPÞ´iM)×½ëç­j‡Æfñ²fZýãVÂíP/Þ54‡µ}ŽN¯càgñþ©.3\½Ã™%ÇjÝÕ[ïVòÄû×ÞR÷)¹M–ÒNÂýÑLgÅ+œ §#ó^&»lúVÔcÍõ|Ö~ú–7æ¹cY܈ջ/}áKnæ9qÚ˜‡"•¸`}ëè05œ½Öc‹¦¥ V—.q] 9@}«“Ò›î×WÌ+\Y”4gÃcci7Þ¥f:Vs}áZv]«óLv“gnX¯2MAöƵr:”Ç&ºU° q×§tà{Ñ…ÏÓ²è+\–ÂßqÉšèmmCMŒ`WKiÀ¯ §q•ÚdIf1Ҋ׎!Š+§ñÞ!Ü–F¬Ë¶5,—#k6îà`óJR Næ>¤F aÚórßZÑÔg<Õ-= >ïS^v"ZKErÒw:Ý$p*KÞôi‹…ϵ%áë_8õ¨|vpôfbýãRËþ¡ª%ûƧa˜˜{WØäÏcà'ñެ>õa'S]«Þ®p’‘_wÍE¤}VY4¬6N†©J9­ªÒGšùÌE7sè'e¡KÔÑiþW5$qâ¹cs(Sw& §?QJ£€o” ú¾›NኒP7t‘÷k¬‹ýB×3¥G÷k¨Qˆ”{V”´gÂãæ@ßxV¥—jËo¼+NÌô¯Ì±ß:ò¿Œf¬85Ç]qr¿Zíu5ÊçÚ¸íA ¾ïCU‘ú†]/vÆÆšFt¶Œ0+Ó§×Gip09¯ §#›MÝl1EQŽäc­ÓÌxΓ¹Ï½øÇZκ¾<ÖI’víJ¶òÈ~bkÍ•t}T0°†­’F¸“¥kiÖøÇ­Ž1ÅoXÚcW™‰Ä+‰ÄF1åEëTÙ 5Rìõ«ò‰´v¬Ë–Îk˧¬®|>gW™2’ýãVS‘Šª¿xÕ„5õy\ùl|eMÌ}J çŠåï`*Ä]åÜ>bäW?ygœñ_u…®¬zx,O)Ì«v4¸®\XIU ‘kz˜hUÕOG­¨Í”¸’zS– ±Ž'«7–6 fì*Õ”˜)öö$HÍlÙÙãWS”)FÑ<|^7™4Ø1Ž+iø¨m!ò×&¤s_9˜VºgËÕŸ<î@ßxV¡éY­÷…^¶lb¾¬™èà%Ë2ýÒo„åõ|çŠë#!ÓiïY·Ö™Ïˇ©É+¡`1Hãã‘­äÁéZö·ÃšŠêÇ9â³ÚÞXÏÊM{´± £Þ|•–§L—ãh®`I:ö¢º}º0x("éìÕˆ´Ì hý¨{SMß½|ëQŸ;,Ù>£a±TëVr±®ªµÏ½Bóç½gË)nyõ³%.¤ÓIš¡3fœòæ«»f·„,x8œG9ëS)¨Zx5ëajò4•Ë*Õ¶é'Jhjpzú õ¦viÝfÓsÚ©¾—þÍn )|Êôá™Ç¹´q"sÿÙ_ìÓÓKÿf·wAG™VóH÷)âª3:7ªôVéZq’š^¹*æIõ1”ç=ɪ&4…©„׋‰Åó‰DiëV¡lUCÖ¥FÅx}ævP—+5a“k+"á«!%ÅN“ã½qJ™ô|o/Ry¬Uú`Õ)tÌÿ \[Ÿzx»÷¡J¤v=Šy¢]L†ÒÿÙ¢¶~Ô=¨«öÕŸíuÜÅóïSlÔyuô(hüÛÛ˹÷¤,Õ1ŽšR±–ZâÙ¾¤[4“R•¦\s¡È>fÆÒ€iPdÔék™ÊÆ´éómj]W’ö©–ß=ªvº°À9›—Ëz×[_jwÙG¥OÖåÜèYL™å½[Ö×ÙGµ'ÙG¥[—r¿²$bìzM[-kíQ5¾;SX–ú˜Ë,”L¢­HA­‡ª»ÇŠ¥U³–xWµšsŒ­ac‘û¬7PÍN N ]°Á9íê3{ÒïzGNòë¦9Saíå܇Ìz*mƒÚŠ¿ìvÞ]ÌÕ?Ú©âÔóüUƉ%êXîÝ5ú#ÃB[íL¶Ëc»†ø?^jÚ²È2+‹µ¾Î9­ë¼ãšóñDºM|#†¨Ôe¨XUŒ†PEBâ¾SC–çX؆M_…3T 5jÛ¦q_)YØ÷0ù‰¢‹Žh’tˆqÍ%ÔÂ$À¬ ËÌÍcN“¨Ï³Â`Ó[sj8èj£êŸíW==ëÀÉ5g“§èÓÁ#܆)jtÚ¼ýê‘5Oö«™ògõ¤Ìñõæ´x$_Ôé½™ÙC¨ç©«±Î’Žx® Ö ƒkfÎó$s\upœ»8ŒKc –.8ª3&*í¬ÂTÁ¨®®H¶™òøì7*fD£…éÇÍB öpQæ‘ñõô“$U§3,c&Œ…RMdß]ã<×Ùá0©£AÔvE¹¯‚tâ¨Ë©ãø«êûæ³d»wŸÝžƒÕŒO‘Ò·4ëŒãšÄa•«zt˜`=+ÝŒ½µ;ž&?’;«7ß)dªº[å ·-|¦k &|„×,ÚÛïVÕ°ÂçÒ±­~õlÇÄ }«óüFçÒ彌½J|gšåîæg}«ÔÖΫ'Þ¬Keóg$ú×¥ƒ¦¬~„‚Œ9™bÎÏv 5¯ ˆÇJ–ÆÜ`q[p[Œ+Ù…3“‹i™`éU¦±é]OÙ†:UiíÆ£¦rCîq–{r@Á¨m&d}­ÔWE}n0x®nå|©ÁµÅZšhö¨Tö±³:­6|ãšÔ¹\ú×9¥I÷k£“˜ûWÎW,ÏÍ)Ù3çïQ-×Þ¢*öòÅyœâ´›xû"ÅrºÆ3Ít:£á ãµ2Äz×èøjÈêËésÙŒ¯“Ò—P£ QÈø¨ÆbšvGÙУF䛨ªm/4W’ñR5ö‘+)æ®Bj²§5n%ÅrÒNæt“¹8ûµ-úïÆ¢èµ=‚æLû×Ô`ÓTÝÎLÁ®S±ÒO´%ªJà ¿-|ömð³á녯߭ùvjǵûõ°¼Û·Ò¿:Ä|GÓäÝ[V<µgé£-øÖ–ª¿z²ôöÛ!õì`އ贵£¡×X(À­ËuÏØJ0+n F{0gÏâ¢î_Ú1Un`Ô¾hÅUžQƒZ6qÂ.æEúŒäõ!†ük¨¿”`×+¨6é÷®*¬úLf–’yZêåÙk˜Ò—î×NÜ[¯Ò¾kñžnjôf=×ߢ*.¾ýW±•|gæX¿™ú±à×}þ»ñ®ÓV\ƒ\múâLû×éx/„ô²Æ´ ?v«LjÏU¨&\׌O™Ÿc¼4(±æŠ{'4W”Ó9w.ˆ€©qFáI¸· +èhà%}Q¼«Â(W9àV–›"ªÛZ³0$WAakŒq^ŒÜiC•;¥sgNM©ŸjžJt)åÄ2C_#šTºgË7Í&ŶûÕ³1‘íX¶çæ­{fé_ˆZŸK”Ï–Æ6©s\Ûf Œö5ÛjnÉÌßZdž+· Y$~‰‚¬œlËVWCšÙ‚ìc­qŠÒ[·r*äZŽ;×µ ¨ªøN}QØ}°c­Vžìc­sÿÚCz —QÏzÑÕ9áwؽ{t0y¬UÌ÷ì(f’á»Z6˜#Šâ¯Y$z 1¡3SK‹­ÉøŒj«§Á·Ô÷-Ö¾~¬¹¦|¾gVé™7?zˆé.ÍDf½¼µÚG瘭fÈuÜ™ö®CR‡“]ÄÉæDEs·ö¹Ïú ­’6ÀÕåv9t8àÐËš±sjÊÄU·á…uâ0ª¯½ì0بµf0Ä &áEyo+ìvsÁš+¦ýÚ³›á®¨XÆ)ëm×\³Üøif-˜–ÖDZml#‘S€‹Ð ×_ŸSŠ¥yT@æœÍQ±¯šÆWç3Š Á­(¬¸Î [‰ñ_7U\õðuy o–TÁ¬ë«犚9±Þ¬¬àŒk™sAè}^£Ôæ§Ó²OFM7Ÿ»]™X_¨¨Í¬'½tÇ${4ó4ºœgöiô©#Óyûµ×}Ž/QJ-aêÞ5š¼Ñ[sžƒNÁVµ­Ž1Å_ t4à +žuå3‚¾bŸQß,IT§|æ$ÙïU%|ÔÂÝŸ9ŒÅs¦94!¦ÈrhS^®\¬ùŠºÉ–TÕ{›a $ zµH¾¯ ŒQG:n.èÀ¹°Îx¬Ù´Üÿ v$#u£khš½ºXôº”ñ²ŽçÚaÏÝ¢»3c¢º?´s§ûIŽó)<Ê(¯Î*¯sÍåBy”…袡â&úŽÈBÔ„ÑEa)·¸ìâž²bŠ+#&¶$c½<\ã½T¸£xךê<]{Òý¯ÞŠ*y"j±U;‹öÏzOµûÑEÎ#úÝ^â¯za¹Ïz(§Èˆxš¨Ã6{Ôm&h¢©Eʬžã ÍÑE\]¶0zŠ”=Vñ­5°¬/™KæQEl±UQr¡|Ê(¢«ëu{‹•ÿÙ endstream endobj 2571 0 obj << /Filter /FlateDecode /Length 227 >> stream xœ]1nÃ0 EwB7ð·˜`pI– -ж°%:ðYPœ¡·/È8:<OÒÈßœ.çKžWß|Ô%~Éê§9§*÷åQ£øQ®svmðiŽëfvÆÛP\szÊ÷O|’ééïÃMšÏ@vÓ>3qIr/C”:䫸à~šØINÿžÚ-1NÛ×б„Ž]Žlá¨:²„‘]O` ¨¶lÔª6 ªÄ@¤ºc êž €öª6:¨vlÔÙ¯yu#­æÕ„Z%¯ÖŸõ£½ÌYþ*.KÑ”—œÜ/²òr> endstream endobj 2572 0 obj << /Filter /FlateDecode /Length 159 >> stream xœ]1Â0 E÷œÂ7H1V]ÊÒ„€ ¤ÉO•'JÓÛ£¤-B ¶dÿÿåg9Œç‘}&yKÁ<Éy¶ KX“M˜=‹V‘õ&ïSíæ¥£ÃEÇç;‚Y¸m¾êä]ê¦Ý2&X,Q$Í3D×4}ç\/ÀöOÚ“ûq–RªUÕ(%ZŽ“dÖ”À¹‚Vàß_bˆ%E`+>ë+Rë endstream endobj 2573 0 obj << /Filter /FlateDecode /Length 195 >> stream xœ]A E÷œ‚tŠ‘¶ ™n\hŒz CÃBJ°.¼½aª.\<’ó™?ÓìûCŠ‹lÎevWZdˆÉzÌÏâHŽ4Å$Z%}tËGñéî6‹fw´ùöÊ$•ôV}²wj.JóM»zÜìé‘­£bÓD  %ÿ÷´] cøTn,2ŠP˜Íˆ €r(ŒÖÈhÂt=2]_å€ @7p¯ï¯µmÍÿ+ݳJ ÉCÔð1ÑoyÎÕ%)yñØ·`‰ endstream endobj 2576 0 obj << /Length 735 /Filter /FlateDecode >> stream xÚU[oÓ0}﯈ÆÚÅÉì\zÙ A…F%JœÄi½¥IHœ.ñßñ­·µÝªš|¶Ïw¾‹d@þCÆ=×µ^߈-(gË™¡Œ»-¤qZ;Èá¸uùÁ÷ í cœìRccÒ¾™ã‚‘²c¹®Ûî_u,ÏóÛC\5³È;–ÓoÇuJ*nõ êµQ·×™Ž?µnÇǾãü£B<”Ø}"±Û÷läzJbE‘ЇF |€®…Ni9]Û…H! Ly$¾ã·q v@÷°Èµ‘€ %Ö)(àÿ“Ü%Á©Â'¾6@½·3+A¢Ìß%au™©A”Wbk#–/*š‰Ä^ÿ9æ‘fLí„GƒØ@ÞÓe @±.& ®SV) …Åé¼͘F|„)Žö¡OL#g%^™Ðö/Rš‘G³¹pÕeI2íú¤ÏÉTq}Å)aŒÃïw˜faþ((N-Ìë,®t}p6#]à™ì¦¼«Y¾À\À # ©ÉEvy©ˆ¾àû¼\W4cy]VG¢í°}³ÄiÔMòr!»Gh±4Ú %<™¸Ä2RíP dKj.>/H‰ÙZ—e & KdV?k\’fH–$½Ïiör”4;ˆRŽ„ošl;JYoÕ ÉÖ>‘|4JžɾnXðŽV–z½Ùɧ’lÆæÒÓ¤çÙžïí“K·6.xBbáe§’oB§@&š‚X—c‚®„9Ý&ÌÚc¡>ÑsõaÿQŸ7T^#gçÍùæŒwñ8/Àg’0Qð à0_’€•59ì'E²Ú’¬8‰ØzGgsäóY–]-ÅæÄp"y-6@^hœS66(x(L,|»󦼕m_ÝËÛÕÑvé5¥GŸI ½{¾ÝGý½@ôºT¬d¼6_A%\Á(G d¨ßú,¬s.|l⟲¿•zK endstream endobj 2578 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./irregularcontour.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2579 0 R /BBox [0 0 188.65 200] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2580 0 R >>>> /Length 2789 /Filter /FlateDecode >> stream xœ]X;®lÁmÌg\Íÿg”YZÂ6(xûB±ç% .úÌùt“Ū"ÿEÂJ‚¿ßÿï??ÿõ·¦ÿù¿OÒÿ”þúQúÇ¿(ýí/õ-ޤZeÓ¤âJs+Õ:Ë©ïðÕ&KÖËKµÍRE߆&‡R[re‘†‡Qg³l†WPÏpzÞ±¬J“ÊMe\C«É6Jí,NÛË9vOtq7©ˆq/iŒ°,©X±â½<¤Ë¿Mõ²©ªbs¬¤ZËšØãò4©Yòè=`ÁFj¾,8„ã0–ÆnX;§’Z%ÿ¶¤Âá¤Öq_ iÎ µ1¾¥áFµÙßDÅH}üà*œMê­ìŠõðÞÝ!ìø!äNî²lø_öûì²`=‰¿5»¨j˜_Lt„ ±ªàY„by°³1–{BÕ¹Wœ‘ZÅIÄBEÙËBz¾•J6Dcï£*6@¦—Ò®r¢·Ë†To¯ÜÍm·à“kÈÔ@q ïû™Yޏm/¯Ò¸°¾ ›R·°Ý¼pœï§kØ[ßoꪚ†'/uwÕ[šßΞؔîPÞý­Å¨K¸ïàî¬8xg²ÖƒM8u‡Õ µ(u,÷bOúgOÜæ¤žƒdÔ wÒèWM€UÄÃ×±%¿+:¤e8¢f\Mi˦€|~ÿ~ÒŒq Ô„¥¡’›¶œ-ƒÒ…K’Ö‚«ñ‰tc™¢Uá•¢tç\¤&”Òƒ§œf^xð@sâ ŠÇpÇ^¶Æœ×Š2ƒ7‘ÈwVq P1”Üí—Ý¥å0ÃûÿýT[Õø¯m¸Ô)'9|hL¸ßŽÀ7‘0¿ýª7ïÖØÚi¢YAë{ã÷3mìZ”:\‹/ ¼ü"”F)Ã~ÇXÄۗ⨤õ:nÎ-[ã;µ²‘ï¸2Mý{CpçÐÆòVRJ|¿ŸÍ9‚Å7îŽ*ì …~ìçÜTýÂâ†ú´‘ù5~HñMRM¶²ä²„o›!+hÝt¶ßfÕ4Ø‹²—ëp{xxVð¶Êp"}êv”úã©A–žúøiðæú(ÇRu^²ðÄ _#*õ5”mM>½øIú~þ÷ó÷–7J«¥8% T¥ÅAdiB¯šÊŠçÖU -÷\,²”u)Ǹ!™É›”Ç™‚bÈšWÁ °·Æì’68h†§b»—‹Ô“œÅdm 0ÿ¥s+º 9)±O£rë˜þ1\¯S´½#„]."÷p‚MJ bä'5G>?%ÒÂýÁz•¢ºÍNŽBé"ÕìÐÍy`šÝɵ¹¥Ÿ"$w‘K²Cö¤•Ë*e85?u‘—ÁOA.quÑ“óv®UåÉqÜæ#Z¿¢ uå˜!×—ðHÓußÏ”^à ‹‘EС‰ –)!Ͼø~?íuöÁwjuŽvrx@ã°¼ä3Ü?ÎW ð\Ç1"¨Šl¶îÃŒžÀpAxœÚw6„ùÌ‘ZRE³ˆö Ä•Ò&¬ºŠa‰·Ví[G# îƒ"…ŸÂf˜EcÍ«qÑÅ Ö€l W kÊ6{w˜¿5Èkõ¦=Âu‘KÂ]Ž»…çXð¥ ë.»u9rlP{QÚT€‹]^·û÷¹a)‡9ûûq“ãêó ÀépvGs+NÀIW€gîGÁ™Ú÷Nn4ŽÒGhŒÏ6­>Vná§×U€wÓžg;s¤?+ Ï* iêGÇyÛU`Lø®ç+áH‘g`2âàÂß«TÞw‡÷3Z%ŽÆFݱþ~´}–Z¢TßùçxÝdDoXø~´Qx0ͽñ“2ÔHA µ¥¯a@BNöî à$)÷ÝF¡!e1\¬V‰Â>0ŠÌ5 @`-š‹CÉz»…ñ{¡ Æ@ZœõÑ3ª4úšŒªàmêœãAÜ_Æö ðær< –…§CÛ.B‹êlÈ$6¨Aj}–í?Uý§õp 5”ؽ5´~¦Ø…xÆ…FÈõió'œqtr$)îàŽ”})Ð<4–7@AŸÚÚ-0¾½Þa@HCq,¤£¬ÀðÛÞÉz[÷•Ã~ŸT‘g\ŽÚhs³ãˆË£†mÞ å•FVs›Ö E9YØIbwÇ£#4"G/ÊÓÇ2úðZýGŒˆÂ%¢8àÓ€d´/X«¿nvQV.¿¢>‘QBé¶³BlÔ`ç†<9Sæ9D:Oš°<;çhÌ ü›ì¹rB×ð,ZUvÇ®´ôzë•óáB“ÔXúµÊÒhÆ÷tIÅÍ$ºúnœ;‹=ßš£ÞAǰðÃdH½a¬0§É.€¿Ÿ­ŒF+häWÛÈ!lACFÏ(ÌžÖÂGÃAîÓœÆÐÝ:9§zÒøýdö’Æù`¨ËÈGçíB®~æ¹*Ý\ŽÐÌkƯƒFƒ|¾sÝ8>ÏââƒÀÓó9šï(£€U{ľs¦ƒ ·ß›å·Õís šÉÇvuƹ)ȵ*pºè q¸xdû6•¼¯%HvŒ6Ù€ tseKƒO €(†> „o„š:ò7„\â tu­[Ü<êD6á*Ñtz0àuçµ{èÙщŒ³ø„aF󧸯ýE£»l“„v1ji­9OÑÀF¾(E† M—ÖÏþ&’Jq-Û÷«Tm´ • ´lÀÐî3ŒqT1Ç8êûIÖ¸cƒRˆß€ ñæ$Çí¨;4^¯z •‡ŠìŸ#²ãBÌ­Nl»ÁùßO?_§®'„È@Ýè)ý)¿žßS0Ø+m–ƒ\.ØuêÐñóÅAðb(iͽQÌ÷cH£_÷u“#“º™ÃéøQ—¼s0e— Øu{Ê/E† ŽUy£%ëk«ÎÏ<»ªo’ ­kàgjµ³ÊÐxó ÞŸGBu¯DYƒÓk^k:¨Ú& ¯žŠÎ`¨ŒŸ—œ–ë !ü0M+ÎèmãzwÅ à²W[,W2Ϙu'zW4õqVý.´@¿Ffü©0hM+{³]ÌQ&zE­€Ë!Sœ‹®\3…OÇ['-²¹¿Ÿ_o( Œw6G.ÐX_Û‰Ñèû\¿ÑŸ¼áà®1ˆîØ^¼VR®ïW|¶üMF\.“Øß:ΤØu­ˆ@s½f´NŠ")°ü.ˆóÚþÛ“Ôo€Vç^få!KÏ>°oêˆ7LÎÇæ×ôë8Èî9ó?j}þGžsÃìù˜_Ëë¶3¾Ÿ©˜0ð©g˜°©ÚŸ}Æäï¬lüœƒäs“]g7'ÎwŸÛ|:«aþ&žxåäýrãÌ`¦äæÃ£¯"þþùïÏ¿uï endstream endobj 2583 0 obj << /Length 574 /Filter /FlateDecode >> stream xÚ…TÁŽ›0½ç+8 ì6—m»U+õÐ*·4+9ÁÙ ¦ºÙ]åßkcˆ”mÅaÆö›7ožp°zÀI°³ %aììŠ îvå“c’Ÿ_&`q#äýj2{ˆ"0JpÎj?¦Z¥ÎÚýx`UÃ¥PJÝøÖ Â0rïYÍÍN!¼€ÄnÚæ¼VÙÃÂ…yìmVß&ŸW}ãˆ+ü=h¤s@Iä$ žjüìk±ç“˜ü`šò?³Ö ¡B‚ Y˜²’åù‹S×W3p\êiv35…Äe¥‰üÈŠ*çfÑXc²,ÏÛº‘¬áõùÈìD©Ú]“ K!ö&ªOÕˆVÚ¢½…å“’?µ9“J–2Î Àè€"ˆŒìºb;žÓSÖ°[TÏÇ«ÛSSS’•JrD"Ý^·¾ëøŒÌÅÄRg¯üŽ0ÁX¸Ä€å*-Q¹Œ¯B$g¹Áì5Û°d¾‰ÃÎV÷1é›äM+K‹|$Óí#¹;]•)Y™jfxWåÐAjà;]ÁM§ÐòiØL/¾³ã ýU ËäzcX*¡<©—%¶k}Vnz]£»Ó²ÎeXÞòQYw6*·Û‹nŒÞûl©œ7™ ìØÝé4Ü1 0º|“Œðu¶Yv&œðûìÂÞ®ÐÚk´ëÊî†{"tô‡üe(.º[’Óµ‹K%{Ö”ö5Ø}ÓÓ¿ôkó†‰|Œ"N¾¨¸ú…4„ºi¶ª¬W¢EmUÑ endstream endobj 2585 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./triangulate.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2586 0 R /BBox [0 0 189.84 200] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2587 0 R >>>> /Length 3184 /Filter /FlateDecode >> stream xœ•\KŽ%¹ Ü¿Sè´¨¿N`À;0‹ çÂðÂ×7”/³¦R¯+Œ^š•EIÿ¤øïÍC\ÿ®Ÿ¿¯¿üÖÃÿyÕðß—‡¿½<üóÃ__>jµR‚ç’,p¼¼ÏjµÏ3ÙHá_¯ìxùÙr ^òX¿9¿Ú``__å­ø^j³ºpåÞ­”¼Œnu¾¿Ú`Ç«Žh3µà9FËçGèÜï]¹å8CŸÙb_›ªÍ<Ö0s³Ü¯­o°ãåsØh=Œšmæòþjƒ;ò´ê­YÁkq›ãúê “)JopUoV[ðÑ»¥vñ ÓW$»¯ÁG‹6Ñ[²^ƒ·-¿‘E­=1Ÿw‡u÷ÐÚ¼h¥°^^'I¡·d>oDИ9þÔô »ô³4Z|qlÞK²ò^q‡qÏŽ—BN$^ •÷}çyÝ­ï#ß|°ÔÓ1JÁé´kJœo÷"4OA»cô'ˆg󳇤ÙdbmÑs—|rEôÏÏ„h;¢]%MÍ.%T‘uU˜F@*Hô¬)[™)xlí9v¥:úT,>ÃxP‰ôDNâ=mWlEb‘%žÑ¬-ã,¶/éŒRŒÍ(ÚãW‘Š¢]™ŽÂkšLYRdO‹Cã×eC[·q`‡qék³XéË~¤líÄ•»¹çà½UKGm°ãÕs´ê)xŸó¦Ã;ûoJòÄ3ÿ6Ak2C )è=ÍÜŠ+M‹RÚf¶™R=™ëª ÷í,ÝÑjµ9Æ?|‡q­€FÃÕK¶ÔRÈ3ÞI› Äõ ´¤xS34´Ã¤šŠ+ÇòŠ5ÑV¤ž ÐKË©Tů4Ës÷Q¾¢ø ¦13 'Ñ’´øæ)oÓoݶÃÖ¦¦¹÷à¥TëóÚÔÆmWÏÕ¼ø²Tw’‘h@Ô¹½Tkuiβ^‚ñ„€º šIÕŽH\M ¶N³),¾!œ¬I…à­1>fþg[¡ä2˜vGD’h)Ë‘m#Å•»kÞN/ÃgvéãÆoÙN‹`5)eŒŽ¸4ÎÓVd»Ç„NïÍb cÕ5¾²>O˜˜ñÆô\ίœ^íâ ý$y{šc‘x´Rüªø̃iÑäN³VL:Q„ý$.G¶N¢6%ÛªøŒÄÄÛSîe _O9¤-^æó âw‡ñƒô¸«†ywn0?}!‰–&5LC¡îõ˜äm0mç½öµkn¹^Ùk·–BªÍbž÷WØRd-Z«ÁS±’nMö„€ýƒß¥ùJÄ "~9#‰Z¤Œ‡Û05Û´UŽêÃÞbѬͼø¼;ìxy\Iµà‹9ïn'èx"æh4:)‹±m{KÕÆòfšÅ·¿¿ÜÆZCk~ƧçWìxyësñÆènã ×vvîžj'Ôˆ®9ÄšŸ r(Y±~òP¯Öã©Ý5­Õg7ï)xªï7ØØ?àô²¸Ù;1r áµK$Fåt,Ñ™#ôeîlâ[¶4U mÝÛ]EÙ`\3:%Y«-¤U¨hwŽó û@w¸ÁøŠËáÆ‰ÿ!x2ª ¢¿3Ö‰[HÑÆ žTÖóxÚýàÕ­´Ëxm°cGÎåAô.©aò˜´Œ¯²Û9p‚fÜ4q œG<RÍ&µs­Ý<tX%'zŒn±µåD§»5m‡Q?Ó¼9svËe„™‹åv•Ó6ßœMÛõ,Õòô0S²Ùîvš'ìƒó¹`!BÐô«¦955¥ ;SH‘¤Ò2Â{ImULkvËùì¨s,~®îæéÚý[‘»%ºÝºj‡€ýƒ…g~xD9¢2fÞ ú0’Ê–Ö#;÷^Š%óMŒEªÙ-å%Ýé®Wï°³Ö~–®çªÙÝe† vìÈ9=•Ï8¬äÅofù󿜊Lb~–=MÔ©„¢ñÜÍ,0)&_i~™&yl_ßI®\™¦V¶‹%FC2@?Y j‹ægý´õÃð&$^­¹{ C¥tÊyŠ•0˜ãÊl|Ѐ—Ô­¥üÎOK± o¤VÂo÷­çàéÌž\+=a4#€õ#‰€RF€dzIä­äƒ¥õHDMr ^£Åfž6ï Ä[6²XçárãzÂx6u–ÆÝÚ¾˜Î"_‰+Ža£wÿó Åû°¯TÒÊb¬êJ}çu|žõ•ó©GÞ¸ž°ã婯…µÆhãŠZvØØ?ÜP®óT²q”U69¿Ú`ò=²3’rŒä HE,ÿ0ûôk ¬Ýå…‘¢;ÄåöM£Ï ùG1¯„ðZ„ ñ°dðUy œŽ²ÅVÄëÉ+ŸâÁs^y•Kž°Ë÷_Õ€Ô‡Ýé׈³»IJϵÚN-‘o4CïuŸ$š&¢â¸SŸ½Û8íœuo°O{‡ûÑl€xBÂä+‰¦ Ÿ²]¡_ôƒ§—[YŒàç]Áðãׂ—îNZŽÝp]Î}_o»]>Êhæ3xïñkÁ ¶ÝZÞ]íË5½Ý'ììŸ8]â(ÞW í}¸µ®Ÿ±zµ±¢—^-~½}ÀÀþ—òþT£*Û=¡—Ät÷@/vChQ4IòD$3ElØ#Š fËn}„Ñlä»â÷AM$B{­¬½gAìˆMHUOv+„ÞÚÝI+²FþÔ8O“AªA@7hzF\‘h#4%’ÊÕ š.üˆqágSɶ0•©m^[‘%O‰.’ôš¦o5Ý­rª´"ÓݰûŸÜ m-F)ÂXš-”8‹qÚ ÍhUë .MoiÕ¶{Œê1yű Àš:¡²©QK«²î+ì“QN¨5¤²¾äí„‚Á§<ƒ¼¬ùbšo@¥9KëbÂþ$ÒÅxÝ#-S Ð”¹cÄ3òfZŸ£©]JÔR^Ë3Š’Ì ajEB‡"­´Z[‘ÞξyÍà‹ "±P¢5­¬i6ªC³4.•Ž(öJ¸K×Û…Uk¯%³¤UWQ¢q’vÅÖüƒäiº›Ú¼mFNÿ"óÆ(7€ÎÒ8KÑlLG 0iRÈ$7¥Or0ÈÖYŸ¸Ôs.ô†Ñ¾tðëÄV‰cˆ'™ã9Øn »ûNµ#˜a´¿@¼fûÉÌ7"!ÄS']Dð|ƒôú‘¨ ãòôýã” œA&£‘¡P¬ŽGn §÷e̶"uOÌìà$|¢ƒ-¤ØöÉÊy˜Åš­¯}?¶¿-#ž$ñþÐî ­ y;´0®ç¾j8S_ÉÐ7øè˜tÁe‹Z _޳×Þ8gM›%G^hcÏíÂ÷6ì ¾T#ïËpº›ˆ…n±UœÍˆÃwã¤ó‚ÕIMl!ZUf IGñH1Ø÷;§X·›Q3#Èì 6_0‘wN¬ZAr³hX‰ñݧƒ±™^¤/”us‹¼"ÉØOLfHByãC¤`—>ë­‡BÒeHfƒ°ÉI8–Í%5_¬Yà«7:aƒ8lÄ­#¹ +H ëÄ®ÒÏBÆÓÁ»v6¡Ij±47»G(,Ž!3…ÉÔZR ;’I±£+‘7€ìå{é Aæ£Î÷suŽåÖH„M R!"›-õ¾§æ±7“up²jé‡Ìõ#Û‚’ýIÇÞ…ïuث֕‚=dl4‚ãÔ 6m‚MÑ!3m°—‰tÔWn¤ËŸDx$.#“X§*ö³²þR|íÀºëab›ëÅz° Eú^I·*Ln spz›8ÁæÉáD’$YÊ¿¿þëA endstream endobj 2590 0 obj << /Length 604 /Filter /FlateDecode >> stream xÚ½TM›0½çWp„Ý@lc ì6—í—¶R­rc9xƒ“ ñUcÚmVýïµ „¤©ÔC… öÌó›÷f¬`©!2×uBº46ù µQ±3`ñõã w8[íòa=[|ð<#'D!6ÖÛ1Õ:1"óížU’ Ëv]×\ÞY6¥žùÀj‘¼´l²4“&ãµZ&öC+^š½_…=B®+üvÔè*5.ñ ›OÉrõÅcã]9ûrÄiο˜Áˆª,5(¥?…Sî-lrX³çÖDi©Ïwýéâü…åUÆçÊ4òÕ‰.¼) ’e#jÁf¹…L*ß5ÙOHÔÛð’ “ ¢L™j)šì1Ïš¸;û„0µÔ­4l Flì:ØÃ`e#8“i±ƒIhn—šR¤¬Ø5Êœ’¡œ×{ÀlE™wèrL5UÕ>ܾ¨…º”7MQð­ KE}w‰BÝ7/p|?Éi!£8Š-5<¯—š1ÉŸ‡4IŸ:¨¾o­OêôТ B'˜¶1C`)ªFèÒõn\¬*Õ‰z€ßq˜êp ¡‹êа}\6¢€ vÈN V$=l¡7ŸÙË ±q+ô× 'c[¶¼ƒât¥ä ~ÞôNºðímÚŠÐ\;Ô›Ü ðâTM½ï” Aù|Xõï}w¹:¢±²É¤ŠÕtZm¡“ü‹1Åìd¼ØÉýÄ tù>Á~eDŠ&JãűmŸ†pŸß“«$øœ„\"¹ÆAÎ9Иþäéÿܤ”#½i<<„éÿìßp£f endstream endobj 2601 0 obj << /Length 1487 /Filter /FlateDecode >> stream xÚÍWK“›8¾Ï¯ðmå*Cxƒ7åC²ÙM%§Ýo“dm*€!æ‘_ŸnµÀ˜0vö¶5Uc=ZŸúù©ñüù‹µ·HÃÐ]GÙ"¯ï<³ª üûþηr:#É·Û»WÅñÂ÷ܵ·öÛýj[,îÙG~ÒB-0 YöûÒ‰¢˜½å­ •Z. cEW‰F©ç§ÌO½å—íÇ»?·ÃÅq\×ðÛYǵ NÄ Uˆò¯>Ôi¸x'ïþ9‹!ä [|/‚Ýhe¡&´=¢ê^ÆÄ¯O•˜ªê'k7ŽÂáÐu‡öÒÎHœ4I.4™€MÞËNñ®Èe£a4Õ#ˆÖnD¿¨G/}C)¨ÑÃåí3Þ>uß½qSYU]«×`\8Ê%Dü‘&ZÒïIõ‰[÷æ²’Š†…hÚRã©gZ(k~èá-e¸)ŒÀ§±µÅ]?&Û.G‘#œ öôz ´’/'ÌLö}>S£ü‹H‘3¤šO êyÿÿ^ÈgÍ! s¬"¸$btKAïZ(]Šxi—Î QØ›ä9Xè©ÖL>{~ô3íF¨{à/Â4s³õ-ºë¥‘ø ÝMAg€{“ûS âÌ]‡Ù¯j`¥oi0½N¸l¶` ú» n¢¡l²+eÓÖRêã¯O6.ž(ÇOújéľ?ðÙî Jl”yøqã“æ\·öȨÚP°„ðC-"áÀd±ÊBó¡ÁÔAsYâìq?’tk•ÛæØ‰ŸNTÂ\ñ&˜»p[D9Šy™ G…bP‹­]1Eéá5&§a4r-Ð8¶¬KzhP^öç¸æË¤®Eãžak7Jz\ÂãtÁ”Yflïyf–T0]Ù~¾Ú}ï6%c6Jo°¤@”­Ñ\`…¼Ýlˆq²f…Åg=ÿ¦†Qn‡Áóä°øÖñÿ‡•hdÌ6ø“0R-óצ¹œ‰ÿ%5ß®MÈ—(œyÅBvP¼ÂêÁé¸íji©ÖV4Tƒs»Êðw0ó`ϧ(œ¸ž¢+„è4ákNݽ¹’ÍÁöp“ܤ:I¾>•ÕeÂÞEib =Z”…æ?° ®Ç´j´l_b/»XÓ÷õ]²DÚC;|úöqüÌM=›y[ô±D* .Ê3 m…ÁàÜåà =†ñ1Ä-è$²%îqú¹$žŸÚm8°ÇƒvZ€¾[™)+€z©i1× B¬†¢ùwy@"³ÐÎà¥syîäÞÄW»±Ùªo†Ä¤ÓQ²Óeó" Œb1äbÄæ},óRÛEkiE›÷mˆÎŠb¦n‡—;:Ø»l⯴PÍ-tš¯fÚʱÀn¢l4m7›?Äf…vRZ¿ŠçG© šÈ¡*~|nö¼jÅœà g›§Ms]¡Kñçÿ&þ}*~MºæO…8éã&»a=$}ëAµj4~Ýw¦?ø:ã endstream endobj 2604 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./slopefield1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2605 0 R /BBox [0 0 196 200] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2606 0 R >>>> /Length 4749 /Filter /FlateDecode >> stream xœ]œM®$¹ „÷uŠ:,ê_'À;Ïá- ~ à _ߊL^ :ûk¦J)Jbô¾9É7ãöߟßÏßþœßþ÷Ó¿ÿûÈ÷ïùþë“¿|JêßžS™ßßäÔsÝ_<ý÷ç/ý[i3­Qéo÷N«Íù¥õTDˆ=“ìýµ•Ôƒ²[êíÚhu§Í&ê–´öz€^g*}ÑÖN¥‡µ¥‘7}ÔÉÆ¬’vç:VM»Ý»ÊN5ؘKRÙw »Œ4ú bÍ•Ù\ZÊü[öìiïr )’*Û%Ì·äRÓfK{Ž”g`°ÊËâ™Ä*oñ›`¡6¤+}FKUzÚÁ»¼¾®ÔTƒ%,ø-aÍ` k~EKXö9Xº— ,ý,aé÷h «KXþ+Z‚ä°âàE"´gjÁ¼ K²G*µÁ jŧ+y$í[Ò˜Û¶ ‡à: Þ_%@pƒ¬Kî¡öLuFSð<£î–l…;?Ð9p¦î’ò\qäuê³KÁZ‰¿ŽÐØü`ÚbqŽ€g—‚#ˆ9§Sp)ïÛçŸ1Ïèºè‚k”ò{g«užÑg<£èBu ®±Íœ‚kŒÂc‡k”_¸ÊJ;Ø‚køéæ\£<\c¿l©k ¦à~¾=\#—0ñSÿ] à•m‰Lñ#î¡à3Ø‚kÔ׸à™£ºÆ|Ù‚k´`«êçÜCÁ5Â|©k´—-¸†[p÷|Á5Z°5{÷£îR¸ƒ[pö²×` ®a‡]Å=cÍoÛv'nx3–nÊ}õ xFÕë¦SðŒ–G àçnüP{¦Ù[ à97¢ÊîIrê;UÝŸqí’Z¯‚oL=ª‚s¬—-8GîBT_3Içh™ßçè9ŽÎ1y"àëe ¾!ÁÔš;ùvóL*|£±-øFï))YoÐwægM¯ÏÏðyà%NƒzF€àãõ¡¥¤ øÅ~Y‚_ðÏS·xý:xE–àãeiæ–ÖfjØ…üAà%‚KÔö¢öN=‚KÌí=ð[xöìQS[]g÷ª­ûLÏYÃÚšL;žœ’6ôï.—˜c .Qt÷~¨½¢m¦j !/—h6WϸêÒ0’ƵKZß—¨ ¶³ž‹ ZÓÐxÛ)xD™‚G àº<bSðˆlÍUT`j—žf˜T¸DÙR—ÈüF¸ÄަÔ#Z 3?[*qðRd¦É¦Ô'ÆË|B‚-8Å~Ù‚W4¼Ô1R}ÙêÊSp‹×ŠP¿`«`(øE¶F_ µ²œkàCÁ5æË\£„5¸:vùHÁ7z°ßhÇV‡ Rq÷H{ê¯ïsp´”› $NÁ7ôNædÑ5ÂPiUcX¢öÒ5Â\#3Töp âTÅÌð ê®©½,õÚ5Œ¥¡ïœæŠ¶ày ¢úZª05kÖ°ìRcõÔV|ã*S7„KÁ3–}D§àG~sj­¬¢@˜Ò\JjlkO\;{¤Dìbpg~¶ô—º†°-‘©÷Õ@UiIO͇*c§þ²ÕDÐר/[plµÑ jä‘z°×/[3×£>\c¿lÁ5J°5û€@©½°%×/[{wl ¼R;¶F¥b½²¿ª. Ülì­ß½§R³]ÊœèKzwJrQÁ…©Òl¿y ¼8¾¯B_* (UK⨪í6UUªv€:&õj§šJUqè Óä¡wÕªV &4¦`k¨X5µ 2ÍFÔTµ*¾qCeÒèÔRÁªÇ)ÍšøŠÕË–ˆ+Mwâ¯fõPRÛh§^*´¦ÂT¹ªÕýÔ›‚­ze«‡êP›‚­vu«‡›‚­~…«‡šÐ›‚­åêek¹àôPóJW—‚âl-hW/[‚O°µ!^[sì4¥‘ 8j^½fÿδ²N ²)AÈ4T(Ðér¨Àò TÕlC˜^ïkš0`Sd+Â©Ž¤AÛD5ä.^¶†&xì”ãà'’ê×N $1,@rjaÕëvóÌ<ÈÎk§6rÁÖB2ägN³%Úp —)O&܉GRãE,zžq‰ëAª§¤ ±ñ2԰⃡ ï‰P÷ÔÂ5$8^¦|0Õá<šPqC‰Ž—©‰õLMøN„dœ`j!áñ2µwILm¸ŽBky²nlwØv®zõ–šö²Ü‰S‚Û¼þÀ‡IÕ®N•ZÓ¹•9UòJcE[×yÝsªy<ʯS­,Õ]/ÕrMuÕ@u\çÃèqkœ¥ªîJÐ^)Û¦åÔÄm>˜~¢©%Se× Í]pÞjã2¯ûŸS ÁvÏœf)Gbuj¯‰ã6@‚˰/ùÁj/ÄQ~xʆKùáÁ” —òÃ)?èvx0åÃ¥üð`ʆ ùÙ ;.å‡Sv0\Èφü`¸”LùÁp)?<˜²ƒ¦ÔÎŽ0ñv0e‡Gü<ç` Ê@ÙÁÀñqAœƒ(;<eSçð” DÙá(;ˆ²Ã#Pv0e‡G ì` Ê@ÙÁ@”JIßIä‰#~?"[Ó‘k0eqÄ…<Ô`ÈãˆKy¬( $.e±CGШ,Ö`ÊãˆKy¬Á”Ç—òXƒ)#.å±F˜-‹#.å±SG\Êc ¦< I=±FœøGd±F GbF@,Ž Êb@8‚¿ó 5dqQkêÄY¨ ‹#ˆ²X#P'Ž`脲8‚(‹5uâ‚,ÔP¨ !_Ùé÷#eUˆs.M1å²Ó¥\š ÔÑ.dÊ3.;]È¥)¦\w¢QiŠ!—.äÒTø&;]Ê¥)¦\vº”KSL¹ìt)—¦˜rÙéR.M1å²M©ISqâìD”IS2Ù‰(“¦e²Q&MÊd'þÔGš ”ÉND™4(“ˆ2i*P&;eÒT Lv"ʤ©@™ìÄÔ‘¦âB=²Q&M)UQ¸XŸdÅïGêÔD®'4˜òlÅ¥,¡ KV\ÈLY¶âB–Ï`Æ“4(Kh„¡[²âRžÐ`Ê“—ò„Sž¬¸”'4˜òdÅ¥<¡Á”'+.å ¦MFÚg‰'6›Ì4*\h"Köm¸¥f]öªóâÏ[³„ÁÐϧ•©™,Ù*¼fЦLòÔи›˜ïÿ¢ŸxSVëØ) #/-KTsh2öˆU¥ýh­< &d"B•lׂ™E §ôß3B‘¶BÜßà;‰ÿJMëíòÌ‚”¼ÕÂ3MRŠÆf>‘‚]¿ïg¢¥ Ôjѧ2'–š}+)»&©Ï§” Å¡ÑÇ–ŠÕÜžå µžWØr‘Ú4[”T¼´>KN*´Êò,I©kÀîš•Š%sWµ´S1á«^B×I~!­–“‡=ž#­Õ$cIƒ^ÈõT´Ç5çTO{”óJ[*ê_÷däµálÒsÅæâ„ôse¹[ˆôRt¶m“Íàïg’ÞTö¼Û”>ëÙǤ#„ëÏ>'½Uý®¶þ|þúüãóõ¸›4 endstream endobj 2609 0 obj << /Length 1834 /Filter /FlateDecode >> stream xÚ­XKoã6¾çW½T,E%YÞ ‡Ý¢ôÐC‘[¶F¢-aeI%©ÄiÑÿÞeËŽäh±Ø˜‡‡ó[„ð-6ábÍy°‰³E¾¿ -Uí4øýçæø|`ôGœ_nnJ’ ƒM¸a‹‡íXÔC±xô~(Eg¤Zúœs/û´ôã8ñ¾-‰²o—~”yE_K £uÈÖ[³å¿Þüøp<8‰¢"DÎ÷!¦Y0ćR"¬µ×v¦jQÓ¬Jì%b0 #Ëx¤ ÏRÕ¢“ÅÐWò–K#÷Ñ$Ö´ô›·ûÎÞ]6Z‡`Û*¤žhˆ ”©¶"7no)Ü(8îì3°„n’‹Þ*6KÕOɦʾ’[¢~…ÛkyäUm¿+¿£%·3õžðA¼¶o ¡^Ç$i–ð÷e‰àeC»:ar¤–RK? ™÷¹6%Š¥õÊÐo!·¢¯>CÏ>€›Vuy[QÃÕ¦tì­@%›Øž€œN­ ÷ºuýJÞqIÇ~íP£ú™3áŽé§<ˆ}WËK»å ¢(Y¤É:È8ÇvnÄNö{†íR¨ÕÝN6½6/í%‚8ZaÌ?ˆ`à~Á¥P‹ úuÆ @AU]>–®ÞK«-¸5wgŽMÁÚq̸×né×”•¦Ñ¶_2¯ÉÑUÑÒ2î}.Šêè¹ÀáC£a@Œ1íNÂiŠ_*SÒHàO!H¹³ªÆ/d7,ËCW‹F à#”·.gÈ’q$û^©×bgWÑŸ ¢u•S®-¶Mþ=0 7=/Uµxª²ycRÛÂ0Z¤œ Þ3)ÇíØ§LêB¨½ZiL§?ÝÞî@cýSë6/…Åj#„Ñ·ô~Q쎿ŸÞ·­)ó¶1m¯øœYr-Xp° $ƒv“,Õœ,àbca<æ{ôôâºíä¶’àïGàKm9YK°•–òN¡¬Â_p£% ¥QH¦ù×Å(ÚNlhFf°F±WTÀÃ!¼6(ÍThÈ,ÿìÉp,ª”ŸûƒÝ‰5ñî‹Ã´ÏDëÌ»ŸÞŽKÛé],ÌuNnôwKŸQ͸)Oq/îž„­zz ÿúÿÇ?mGÿ¯9„ŽOS!¬'A¶vÖÐU¹éÑû’(Ùž®$¾#Ò·Ãt…Ü!¸Ð‰JÑH¼¡<­¬cÀ]‚Œ­Ï¢EÕâi÷Í^êÒm>Ñ_ï›Ãj*9ž@™*ÿ†5A«îà ŽÇDl÷y¯À P& ¥Ú—'1ÀÇÙýom#ñvwSö7±ú[“˜_ÀêQã!…r?Úp¼§­Èôtb6èpÓFƒKM1·C Ÿß§,ˆø„¦nOeŠr$Xb`|Ì3ËãivÐw•Šæª‚ÊoAÓ¼UTš&˜“Pš; ˜enD³«Ýîo×_ÊŠj¢Ébg(³\Ô±• ÎOQ&˜ôlQÖž 0ŠOXK¹ FïüVc|³C›qơ̙̈Ñ6®7¯Wö*yQ.*©]ô„Üü¼`‚÷{üëà+ÚŠz´õ'ª)ó¾iwçæ$y:þÓ¯u¾õ|Õíºy·«ô…/8[nœ3¶´lQ"Á¦Q¤œ20ÃgÞîÂ}ÇÙœ_`{sF¥7ò) qÜGTÝŽèÀ mù˜j«KÅ`geóÈÓ¸E! —ÿgdB¯;hÚ,€ï¹C1!ç¥Á¡˜œ4››g%Bu¶‡7 (õÄÐþÆçñÚêË2=ÏSçúS;¡µ+)YÀõž¥…tLv¹Ë?ÿ5gÎfŸðŒßlhÁ;Jm ‚ÎÑNuÄ…n½|¾ŽpRmµŽ@i>Ñ8w¦ÝŽt1Ë~MµÄ1Ó!%ƒ¶B ÂÅMá1ìÊÆµîY(ÞNØs'´¶¡r:}œ _|®>t°,vófUÏÄõ\Vçq:^pßÓü>%;È+rxW‚íp¹¬Û×B-œÓ‹Jj"¶ÔXQÚ™Ð%éÌ+ßV÷'½ZDZ±œÛôŽh¤rŠ©¡©½âx_ š ­P_ï`ˆg>6âõÉ+{kŠ],Ý¿…XržC§ëÆôsÝx‘ƒ|ÜÆÁÇçƒn ÃôÕîcWAŸ~Ž‘füó ŸMøð m׋]¹nN»vŽ>NáË5ÃãVnÍ}"¸Ú(¸÷«ö]«ÌeŸp7ØR”<ºÞê/£0<Ƴ#OtYÇ£ÂÏÛ… þ=¤5œD‡»&¾=¸üpÞ¼ Ô|¾ò¹ ¿8ã+GáÐ.ÝMydåd?Fzü®ì¦ÕuÑv®dq”_-þÈ„­ö endstream endobj 2491 0 obj << /Type /ObjStm /N 100 /First 1036 /Length 3347 /Filter /FlateDecode >> stream xÚí]msÛ6þî_ÁoM>A¼“LgÜÄÉå.­sy¹&M;Z‚%ž)Ñ%©8gRal9¶å—ëÝq<²rx°Xì.@*M£$*K¢,¤Ò—ùÔFܺ¡#É%6‹´O¤Idp ¥†˜SñD JɈ‹Dì ¥P’õE¡L­ý]ƒB…¢RÁ‘ft7C‘I¨ e êr"#† ´R‚B'”ž!EÖrT‘e‘°šÓ] ÈdB)‚+ ¥T$¥à(Î"¡‰+AN—N²H-R&’&Tº”Z¨9è² ­ÐI©D·‘â‰OéHÛ„ª±•¨)YíKá)ã撚µÒBD)D)¥‚`¨ ™¢ @L…¥‚;U µ\©VT0êNµ¥B$I›ªx-t )‰KKˆ;QžýÇcý}ôbbjT‚dJÕŠº+ˤڠžZ*Á€WpR/ceEm+¼ÚhâE·‘¬©D–Ê%Š4óW)—ת]d±A§Ôœà@™‘ôâ£VIáá@ס‰‰EmÐbTæ« a µ¯8Í(é”­ñ†Ñ%¤…vC: ý¢ÂHô±&凜¦¾Q’hµŠ4ÐxÅ7‘D¯`’¾’à•UTAæ/R5&ñ£CHJú@2‰W|¯ô¾¥Bùº¬×j¤Oø¿óèÑ{szì"ö2Ÿ¹ö¸Z¶nÙ64p3‰W;ì•kªU=qM°þÚnZäßWŸ¢ .è¥Íį;(¤7¡žð»ï| O¢"W{÷þç–‡Tm¹*Ë_¿F„!C”_>ÆèÑ£ˆ=…áà60<%ÉÊ.M¶ÉtiNcU†bQ{·ð/7 <_Æ)Ûñ!K6Éš5ñ˺š¼vmôòyò4boܧ6Z¹@p™9/8ôóµÇv—Ë ¥}F˜ðx#Ü%xŸ}Bö Õ'tŸ0]"뉳@|¦¾Æö}UO]ð%¿R+ ¬2Mc 8£?”T1TÏd”ÑëÕAë yQ,P”—î눽}õ<ü{0oÛãæ[ÆòætqÜV­‹ƒp«zæâ¢b³¼,]}Êä“w0+Ùä´,–@ÏÛEùzãêh{xXmâ ¾à^Ђãº`ÉËõh3'°~wжZºf+ÁöàV¸»Våî¡^_ª0Ƥ1¹-â ¶ÐXÊÞ Ê9Ê«ª²*¦Ûˆu ±CluœÁ†ßâëKW$2¶p`X¨°¼SÀmU¯¶ÒÙ5¸«Ö±$KvçX¯/V„â±E£L')Ÿ*¦åïì¼vî·¼®«“ílB²-aÏîó9û8"ÓW6Îa2D£·ll?P {6~ ùn?diï÷»@‚¦N]B_?àYL1°Í²•d*b ñù;êï÷Šò¸¶QÑ5ƳJtL½o˜¯o ¸Êb‹éæV±At@óI£|úZp%Îëɼøèb ¥<Ã+á\Ò‡KɈ”(ONâãâ¸..>¬ÙaQºæskY»:p[ø`abE“²FóA#}þÏÑ2´Èp©¥8K„i0¢á[›–€ Óa¥õÍìO6Øtk»A«$•°×·ê‹y†Tˆl«ZLçdœ&ÙEŠm]•ÍiÓºÅVެG0[sZ™º?Ì-Z}U=/к> u𪺵·œTÓb9ˆâðÐAGH>HÁšã|â˜û4)óû}…6NJ¶\-\ݳ%›Ve™× ÑåšÅòRM¾œ⺘Í[vLZWºÃ..æ ÝnŽØq¹j ™Å"§(uî–TXQMYSæÍœýáêŠaVÀÚ“*ìRÆhÿèXS|bûç ] œ Ì]âò¢)X…†¹ßWyÉfµËQ-À¹¦-p/oÙ.ûž=fOØ{Êž±¿²çìoìïìûýÈöÙKööнfoØ[öOö{ÇÞ³ŸÙAOŽ\ëÛt€d€Ú]íÛ7)ŠIQOV ¶¢¹b3©j9pçì€MØ”¡-lÆæ¬`ÿbG¬d ¶d;f¿³š5¬e+ö‘°Oì”ýáKw]uÈ jj‹rêØtŵlo™uiß :·<ÈÔWVu±\w¥¿æÊ²8nІMóÙ Ò _ÔÑÿaé>Q§´ójåûöõ$¯!¼Ùª(}ÉÕþ^_åÏáv—âð„Íèa|¾ŽL¸Õ±¹å”Dëþ+´²­ó©[äõkÎ ¬ÕZ„ûï§”šZ8Ôçiu²d^kI1¡Ÿ±Éª&å?e§P©ƒº:rKvƒAÚ².fRŸvuÕÓChšW<‚QºEô¢¬fÅ$/az½®Ý¬ ªÜ”-ò ›º)4 ”q%oV^ÿë ìë\>YÁ§-V4†rhÑñ¼'Ô_æFƒ‘Ëš ðÐUù¾ú’EMãÉy^†*»‹Íz”xAíÍÝ 8vš±zew-Ýšd¹»Ç÷öó^`Þ0ï­¹žšçæù€æùšf¯³Cuû|?ïÈ÷;‚5×bU¶ÅqyÊöÃ8}XßÖ·Ö·kž÷áæ›yUC¿\½€Þ”/ºnçÞ׋ÿR{Jú×(××Mß)ï(º{I$SúÿÝÕÅÍåRç\©3bç\‹ór·_È}óªØ°Z,øÖéiñòõ°3DB›Øhu‡éiëW\ø©!ÑüRC2$Y’Ý~Ù'’¨æC~sÏÊ ëyâŠëyZnèÙí–’f$mê2 iÓwŸ¡},um6úϱ5Î!Æ9Ä8‡çãbœCÜ¢ë¿ý9„×z>Ïrƒ)„L¿¡«áBËA€®xØsJÁßô¹<Ì<;æ ‘Øsa®4Ws? Élû`H%7 †6„9´ÝVÊÿç0§cEŽ1ÎãŒ1ÎãŒ1Î}>eK˜×èhœ)^dô"£½ÈèEƽ£÷½Çè=Fï1z?Ë^ }ù^ }?{5Ð=7_fÕò«Ë¬Ép™u¸S#ì ø¼»áË›>þîíí1Pö¢½Z}­Ià 7vXk¯ŽŸw~ã‰Ê.§¿N§_l<ág6žlÚ|ráuüËþè u)]msŽæWX=×éùÕsm¶_=×ö¶WÏýj\=WÏÇÈuŒ\ÇÈuŒ\ÇÕóqýcô"£½ÈèEÆÕóÑ{ŒÞcô£÷½Ç¸z.EvéêùäWÏ‹E>s7_>·ü¿tùÜ\øjd ÒpùÜ\¸¶oå¸|ÞÉ(»Âò¹=¢/)½õò¹Õ7_>¿ÛW ·µ0·ü dºáåÖ”o/øTÜús :Ý$÷õfjzùë)éÝwK¶áÍÔôo¦¦Ù­w rnov§I6¼s’]ñÓŸâ98P¯?€[wpûãß»Äõâä&‹ÃëèIœÉ”Î÷Œé‡Tæó·{`„Ö°g¸—¯¦»§‡×=Š·‡ØC¶"¦ßa¸7È[œÎÍeÌé%¬‰ªÒ©‡.SŸ¿ícýüw>[º¶˜lwŒa‡°Gœò8¥ßøÄ14Irù™g‰âÓ,5—J“ÄÆ¨Û;Œsð–ûÃâBß—½¿üHmïÜÞ›äüOA˜ÄÞÀö'‹f¶Otg›Nð×ûm :@_ëXª6NøíówsrçÌ-WM{Rm5B{€=`˜Å “‹û¼Å±äZ”ŸÈbž¤á,béÓ×Â:+Úùê žT F§ãÐòb›çmÚEUµóÎHËÝ¿Êuó endstream endobj 2616 0 obj << /Length 416 /Filter /FlateDecode >> stream xÚ…’Ín£0…÷<…—F*ޝbè²éhf׊]Ú Nc B ŽÔ¾ý\chIÛ™ ™Ë§ãsŽ „ã¤àÄHÉ •“m›ðqÚ?‘¸¸û•ÀÄef òªLV7Zà¬àr·”*k²¡×ûêèmŸfRJš_¦™Rš^Uƒ“¶K3‘ÓúÔØW†ƒ¡`DúPþI~–ok!þïðùÝ£E2!4Z’^ýn"?ºäö zŸ‚ä‚€bR­ÅDÉÀ¬cœ)l­n€«%¸ÉôZЮ¶ñïyØ DEÊýL­—ÔMóI„ŸðVT »ºÀö@S×4§Á÷•·u:RîŽR~oã¾Tí±±ûEÁ47DiŸ2ßœúLg <ýYŠ¢cb åíàY5¼~ŽÎQ‚ÍÖR 釘¦ŠÆÙ© ïDZ„ñ:…Âv‘³/ÇÆm [>¹<=]L¶wÛª 7OQ‡MâØPoŸ°A×â¶Ý£—!‚»nº½]_»CտƯÚÝs¶Ÿ,»Y×>Ÿ¢PÊæîÿˆ÷Ðf endstream endobj 2620 0 obj << /Length 1462 /Filter /FlateDecode >> stream xÚ¥XIoÛ8¾çWøh–+Y–— æfS´hÝPO”DËD)Q )ÇäÇÏã&ɶ”¤3ÈÁ$õø–ï­L0ðá/¬üÁ" '«ÙräW¾>åÙÀ,>?^–ÎB¯Eù~}õî!Š?Yù«`°Þ"?šÌÃyÍo6Ã`Ž~¬ÿ¸º_׬¢éô2å…Ðåt,&Ó š)¡ Ö|9›áÌÈ[¼h>Þ²|äÂa‘z”xä…‹hÈJIX!”NçúƒSàä¯ §õhºË‘?ØÒÏÛô/ Ã!GàΆޮ‹©!’l¤ƆXî°9ÙV”š%BšlkN–ç¨ÑNœöšLT%Xgd\âÔÇZï~…oÄ1/%“¸SÝáu×M€&ˆ&á,4Ð|(Ã×€ô4N&ï4j½±úý°Û-¡ØQM~(Æäù$ôÃé£3HýíG~3$í¥˜1ŠQa6¬M[—%¤ÈÌÖ3?ODîìAÁ€ipÝ%Ú{üô5¦,ùù…üc‚¨ÙÔ÷Uô”•ÓBìPй•«èíq}k³¬M ÂIµøƒKŽ…ÒzÁwÛlá|7 ÉQ!JÄq!ÍÁ–£,¯w « )¤ˆ Ü+)>8œ¼ÚŽÖ7Ø8Iµ¶T¹åÏŠ3Ý6’WgòÚâ$æ5$>Äî2 àé•.ö-s€Ñ_p¦¿pÏ4šwKø6ö¾ü4òKË,5•þ¿9ôÛIh0¢Ç.@P,Õz-Â6͹Úý…ãÇ?Í2%€‘h¢ú%碱‡(ɬ{nŸß?¯Ÿ¿C é+PÇæÓ{&%ËífÍJ»b¢ï˜3™SP1nܵ¹íQA‘¥„»ëj5[ÀòŽpœ¨ìtà÷²VÎö˜s’bÑ¢PIj…+ì«“5 ’#©y¾ìA­&U1N¨ãG§Å;®³á‰¤®dlR @Â(mG…‹©Ý*É»‘·œA˜ÞÀFi 1Im½BÓ¾®oŠRÇj‚]l½ŠwL(â©EÞq (Æ´ô íz‹ËxÑ]W1«MŠ·¨¢òµDW‚I^B‹±êJnñK+Wᥠ+tiµ½Üg”pRXgÞ(vkNm.µËT“Ô±fn¿< <Úܼ©·m?ØÈz1[ü8“Ú•ó xAñOwçi¡¯Wl_Ìû!Ô è¾ìØÓ™Æ—FƒZØI¸ö#™ì> ñÓ:À,u씕YàC‚ÛÍ׉ÒWÍ2g)~3Moª¬u^pÿ#÷Ú`¨âý¡€#]:PWÈ)ãâ4Xc˜~:çÛ<Ú— ZZ§°$u%\•>ƶ~Á®iW¼éç5Õ/÷”$?‚~«YtfÏâ~«Ì¥W {V‹ó¤¾m·³pRÉvÐ’¡¸ÙV ª Ì÷Ö¶ç !²úëù×W =Ÿæ´(±«º—´$šYJgôéhyœýßÌH Þ'ªFiJ›îKéØKq\eV«vUÐçY]¿rP¶Q²œCÉŽë¨ìw`Š÷ò’0媖Ô-N«÷¹9ª åî(H=9ÇR–5‡š›+~Ag§$#²é§ÚÊ»vi£ÛÌÿà›„ˆ¦â-zà#{"\v=áñ¸®œï'–Õtð²âV³ƒeñ{{¦èéÖéž”âÒ¿z¦Út[¼÷Yþ¬%%Å`Ÿ0Ugh?¹ºTÍÊrÍ-yŠx5ú,»¾èó<õÊa:龎óXen÷fmÞKðànNÙ×5X§Ìk£{¸ØÎìL§ FÓ–à‘#—ê.îN.h*,Uo/†µU"YqÿñÁM °o=+ôt…Ï{†‹9}íÔ·Û ÇØ…Þƒã \ +—GîÚËøÁ»(=eóL‚2ðNX¯Þ¸ù㢠nB¿[áŒ^Fˆž Müª»ü 'Šú× endstream endobj 2624 0 obj << /Length 1389 /Filter /FlateDecode >> stream xÚ­XKoÛ8¾çWøhV*Y~Ä»è¡Û´EwS´h³íÞhi¥D¤§¿~‡OÓ‰ì$À"¤á7ï“ RüËËt°ÈóóåôbPÔg©y+n–øúá,s| 2&ç×g¯ÞÏfƒ,=_¦Ëlp]ÅP×å`5|»!­1Jò<.%Óélø–×5iÊ„ÑìÞ*Ê9J&yºœ ³ÅttsýçÙ»ë {6™ÏŸ’P&Ed^† ȳœÎRtq³¡ì ˜% 臂ô!YO¢ËÏ>JšQ*Toº@juÓgðfœl€µ£dqÆ~Ûx[e‡Á÷¶ðÊýZäß½šq~˜ï »ïUjC¥öŒætz5¨Õ#ø¡Mx§"./Ø·«,MÓ›~9ªf[ w 9A³gyv¾˜Ì<àÜ’~ €÷-ÕcŸf3ô×J‚jÉ-Hú ^›˜Œ»†¼„q[Vk.J¯S{ÊÿôkN×üå1ß5díà ͖ ÞÔи©Ik Z£ØdM$”Þk·E›[ç#£LoÄQ½†V÷.âý“­¡ w´)}>ôݵ.‘kæmÆÕ#®†ÔŽZɆßÝ¿§ÀÊØ—TDðH¤'á]‹»Êr…ŽîwK£óΣèÊÿ â+Þ~wa©×P–Þó‘ä“^2 vÎAÇá¯á_aå³€[ÚB(¡EŽîùØ´sÌþã*ÉŽ˜Ž½ŸŠná‘?±×ÏÑ|KšfÓvÎî]q!øÂ\šî×ö˜ÞáÔw¬Y'Ö’¦ø;Œøß$ý°=<ÏÐI?öýv­)÷¦>â#LœØìOqÄ´ê°CKUr¯îSºˆNŸ6ip¢RŽ“Ÿ¾7ÿeÈà„J²§¢Ì·ÌS™¢ÑH·{à IxnN¼Hʽtóí0ÇÀúÕ%-Oÿ$s0 ¶ÀöY­5þÂ¥’… ÞõË*ïW†q>Iµ%‚ê¶*]è¯ð‹í–P¶ï¸vpªuMe;Î:KD`Où‚qœÙñôJ‡K'Š8#4Ë‘ì>˜{ÚýOvwÆyëœeHÍŸ_z °WEÖ\J|±D¾ ²ÄÙÀB @AuÅ8í¸ëÑß½4ÜÈØsÉÖM¾Ç‹; ‡¼"Ímï7[¿ˆ}\qÜ¡žôU=NjÓäLrìw/_yj²S!`-¡~p}";ZwuïÀÝÐ …Óÿßt–féd:^Ì/ÎnމӋOËý6iEšd?yÈõ@N:N‹ð:†úÃMãŠFÌ~NñÃÞ2x´Ól¦§Å#† ‘û À¡k¢ŠM%Õóú™‘¤8Û¨?…ÑÊTªÍƒ”ÅŽÐD»‚—9íõ3¯*ëeÛò/»Â{×2½wÝÙñy¬±qcÄ,ắ~‹újÌvGp'¶,¯iKð.±½§»|lÿ/¡"˜K>.¾©Å¼«ôh”uS'ç̈õ!¤G#¨`:›-³/úù9C(hUV7÷tí©7âzòà¤cá®a¿›Xð¢‹6yW+bïr/×sOÃô=r÷ §J`Ä©ÕI(\â^îß®3Ðm¥ûU(yÚPEýGÈÇæ­XAÇ®¬ÁÊ“ªëÿ±üLÛ§ endstream endobj 2629 0 obj << /Length 1723 /Filter /FlateDecode >> stream xÚX[oÛ6~ï¯ð£X®.vloØ€.mÓ $Y3ÌÍ-Ñ67‰TEÉ— ?~‡ä¡D9RÒ#Š—óžËÇCþ‚ÁÂÌ¢h¼˜ÌqöÊ×½Åf`7—¯œçÁDÏ™ùÛÝ«×ï§ÓAàþ"Ü­]QwÉ`9¼Ø’¼¤Å™EÑpñÓ™7™L‡"ËO¼”qjFD^2Áå™Fþ"³éÙÃÝï¯ÞÝÕØÓ0üN%Õ̧ZžŸhy>ŸŒƒhb´ôr!™Òà VO‡9a ñdÍ+ý$5ýÑ[ó,(OhÁøÆ¼Ê¸ Ô.m Z~ñ§¾?òá<¨†^ƒ©Å-â3o±˜M‡ï²MÚ0×7¦±)H¾e±4o …_¿}o¢*óªDÄ5I%mc55šÛ]H‘VFÙô^·Ç?[=Äê—ˆ®w„ŠdyÊ(öï`Š(\…Ô¦Q)¿O!‘娸,añyä+5šÞ坿Ùc<51tÖOg3]¼d¼"Ž?‰k«dV¥%3h¬ªm¨ ±{–;F÷´ødõF¦€¼ì^õuä}­é³¤ßV9xBâê=Mc‘¡%= š¦Ág2ˆÄ%ÛQ‹˜ˆçޏ®39‚ß8}Ö¿íðªdØÖ|ì@SÍíâUÞăüBªR8÷‚nSÀ¾Ù#•%ÍíNT+:ãÝè!·[K ÆaŸ¨-$,˜Íg*˜ñÍÝá,#ާž³Õf…‰á¢Ðºqvü["Ê)fZ¤ƒJÉíÔR’5(µ˜€éß2IV©Ýáö˜¡h’"Á”EÕ#&.„d]yëôɆÉSB@ª@Gí‰ 1Äd6úNÓÔboÙºü Ò601­ë ¿§«ËÖ.U¼}ʉIk]Ê2vš‹ÓR$V°‡6ôì{ÂÊ»Zõ ö`”—µéÄJhJŽ5lnÎx™ ݼÔ LÞæ–”eN-/Ï{ì¹ÛP Ÿ†Ÿ| õŽºT\+Í(¤=Šºý|i•'IžK.ݪ–d¬R e'4âÒ¢Ê_Ï]ò=˜9”o4‡jêV›8|Ë“µimègZÓÀQìSÈHïМu»žÚƒ 4ù8_„Ó“a¿›ûNÀwl£‘Ç1;OÄñ‘Ö¨WP’H¤¤?-]º½úËJÆ­ðï©+žC"]‘‘n·bß–T¿\0ôG޼² \Ö‘é;@õFèŽee뤌ÄÛú`›„~¦6)÷L„ñl… $wÔΌۧf`UÃØx.èZ01•ÎIô,&k‰ÚæÓÚ_Ðïá@;6Û²vŽâŽôÄ/û‘«‘WImMårI9d(JÍ«ŠIË îlеŸ]”ô“Ÿ»Oûÿ]LîF“+­¡Îý+$K¬ÂfŒ•Hª)Ïi㾘4t³õÑ©Èr{BªsÉq¤ßeGuæk¶:IìÿÙF {ÝЛäé±{WlU@P·MñÎÁÒy‚àJ<ªÂ)?—á´Ç†PLæ¢(3RlXëî¡OÖ¢`À6"êšPÕ',>½•Xi6™æ2žŽà×{Ùu,k.¼'ONhHè4© H1IOŠ¡5ãLây»¢°mA¬Éšç"jO îd„ÎÉw¼)™Ô8úq§îéj“Â5a>ñ,·½: ÖháaiƒøL½¸ßÒÂòUwØkØB6äH ¦¤Ú¬¨«Ž8…—ä;l#SL횉<ÚzÁ9¸Pò=ã‰Ø#ÞmµrËÍÚ§á–txû ‘t`<)!𸝥jÅú«âG!²kÆãíÉ[Ua´S-#–U¨¸Zeo$Ü–vËÀï.³jŒ÷¤¹™‚íÂó°U´vJ•”«{ü®&0€yèÝÊÚA°m ów-»©ÝÉp»ñ§ýrOïIºŒûCT²¶~C2PKlrýô+M0/&“…ãùìÜ ¾Qw õ-î4á|(Ìÿ”*ªn}¢Q/±éèɳ!5/œnLE`ÄÀú£€ûnn&òO¯ÓO2K#At©»ÔÑèçáD~ ôZ’ÑqmËÅxâήÖêŠ)áð !ÿ6T×J?õUC é”T Û©~ÊG=JÎüáy„ºY”´GWS€fGኆñ© 1ƒ4ŒÈŒ±jôSl-)Ž5Ðà%ðÍŒå•åé {Ö¡nµPÀ>e(#ô Ùàç·`6WçÂX}ž›@–›q(ƒkwK::±~B×l ¬Tû‹LRœz|­×Œi.;8Ûïÿ‹Å°? endstream endobj 2636 0 obj << /Length 2727 /Filter /FlateDecode >> stream xÚ¥koÛ8ò{EP 8ˆ\½]ôÃ^›]\7A“[àÐ-´EÛBõZ‘JâÃýø›áòKtÚŠÂ| ‡3Ãy+þ…ÿü‹Ü»HÃpžGÙŲ~á©Õ~}Aƒ/_øÎ@wòïw/^ˆã ß›ç^î_Ü­öQÝ_wÖIÞÏÜ0 üÍÌ¢Øy×Ö5k ·*N;m'˶37½A¥ïE°]$Y4÷ÈHý´Â;4ÙýªèsõV|¼9¥ Öåý,ÈÞД©åÈ‘Í⟞UœY?óõPÃÔw<&/í—ÿ*¶u'[ÉmD„NÏY¡/\õmM7 Bf}A³²é9G &×Oç~žŽŒ+ˆz¤ÎPi²ì ©D¶æ‘õš„wð\©Ã—%Âðârdx{-<É Í»Æ%xÇz62õ¾#§aå t‰Ä!û²A©O߇ lmYwm/§/D˜’tÔiÚ†qøtÛY:À| Ú­[øÍœb@)Aî<”rcQ°ZÓfVØ€²Ççó&K˜,Õ°Â7ÙjغS¸J(rîú¤Ì®Îý˜Ø_µÚä8[â«nhâÚ×ÎÐh'=sÃ*£8¼3JCÛUËŠ²Yk=ÙãÎúx]Åàð”z°‘ê½W{ÏWl¨$\“øÚ'Ðø~Ç ‡A)"ÌkF’‡Ià,HiÂÉœx¯ô @Õi"ø) ƒãKÍ,'l¥&ˆÑzŸõ ¸@¡5ÍÁÎàߺ˜¢ãðñ|òmVåzÎÄÖ¢ˆº“ØÃGÆ1)y°ó18¤'£yÒêBËíàÉì¾ìÛ¦Öò£ {_²ph{müõö_Ÿoî®ï®þýîú÷Ÿ>Úéš­X\b|ê°w(!Ò ?ŸF'Ù“¯›F`—ê|ƒ†“Y}Ÿ© 2 4ÒöŠã{ªRX+¥ …A LcœõKâ†æ“Â7œÓò-_j]`Óê×ÛÝiãÖvf¨Ä7t´^“5¢ò<'!A¸ØÝzà®\‚רÒ6\ï;t‰RÛ×Ô ÏwœyÚÁØïR™®i8T˜i[ 3ê G‹²~Û~{ŠQ- ‚÷,ë§Þ´è&ÃèG”+iN’ã¼úçíÕ—›/×>ýãêÕŸàí´!¢¡)¸E+qûóíûëÛiOfä)Ë»cÁâÑýP…% Š8X.¹Ú‡ñ<ˆÑÙŽºjÍ覎ðíêhô™°ˆ>G¼™âë(Vꘉ*¯”p·øeЬvx7“o_vÅêå/º`r¹ù£äoW¬|MÙ€{f ý÷\AÊ~˜TÈ>3ñ} Ù .8â:Iù&ÂÍašûcš Lå1|ò¾/ N« k¡¡ WI~æ|n…¤3ÃEІdOpÉıÓ8®E|ƒcJ2oåpB‚5k4Q\`xqš«þ»¬9RAjr·Ñ‡XA4Ksê”ÌôXi'ÍÁŠû²×Z^“ÖqiÓ½}ëÞv \¾úyDž• ïy/ŸwL9]Þêò?*„EþΰÃbK‹ ‚¤IÇ”7Vc¦MUí°¦±9K.=WŸ.ÆzH–ä44Ž®« ×ûŽJ-à·*=ØGÿ%©2Ô †Š1)Ã]"<kþ#¦E,p`K’aB¦„I~ørhÊe[ðKЛEÛCð|ë9ãÏOæý¦Ý¢ïjŠee9<Ÿ4[¢˜*>&CЉos,ö˜=d…I&‚­öÈë²it¸ŽŽ#rxêbw½]0—ï’5ãåÙ©¾X¿(%¨ÊöÿꌕŒýT¨âl§s8°ß zLñŸÆåN§òyž‰N÷ÀЯnn-¹ á Ò\‡©œ¾S*K…€“üÑŽÙê_ÔmçNâ¦ðf­²CtdžΠÍûç™´Uçö<:ÉÑÛ¹´ÆÈü9ç2T78&ú¾j8wBm}0õðü™çDQ¨GÁî“ù¾ê=ËŒc(à+Hÿ&uïm¦k}°~Ò^ÝûÀÜ+ut¯j °wÑ›•@°t”‘[¥»²à~r®Ëw«=©¶ÝmkW6ÁÓÍ©–š;¶Lg‰Oªw˜Cuú ô£½/BBÆwN0I*¿ ;º¦Æ®ç¶÷‡]îíW Œè]{1v‚Ây0÷©Á¢â(,¡õÊo¨©j€u£4™ûYp$Á<ôü':ÈÚݧ.òÇH)¡•²o^¿&ã3é  ãó‚Û”þaSŽmà– ŠR@à놉çKžz¾`ôéÔ¨Š½A˜~ÙÂXEâŸsTóh/ª±W”Pª›W tCprÕfÖ±³(xaa"… zz{Þ/íŸ:L‹o,Þyò(\äÜüþÑú"Ø­°ÅƒÐOßn®l]¯»¶˜AÍhÜ,«¡P 9˜éÎpîÙ…›ëžu øT{òä&Ð~ÙШ֒êy:¨#ŽÑª&®Ø‡¡¦•OúNó½X­ë0Òô¤< «òÖÊSÙ›ï{ÞLÌ«€·/]×ÜøòLZyŒtÊ>™#%&KuÝKûÁ€VXcšÏ¡òz`'dK05ù‰¡ÛïÕ«µÅx49HRçjÌg¶.—ß º¦ñé“ t¦ÆnÞ©'ÅÅ”~Ð.ñWyQP™4‰HeÔf§>C´êÓ.ègš¦Üž«vµ ¦%p=ÿkàc1Θ¦É¸%‚m5¸MF³Ä^ÿÀžårÜêJH–¡ÐåboG´èlŠç&ä ºãå&ÓY*5z“Ì÷mU)%Èö” K´Õ  ž‹Ës„°Fßb¹‰ôÍ'‹??WXF§Ÿ ­2üãd5±È.>”Ú<±ÜA€€¦$WT"?SÜ_ š:L÷zhêr„‚ÚzZ¯‚ðŒú+Æ£(Á2!µ–wò•å©Ö‘Åɨòj¢¬%FGIÎ4±ñh«Ê±-Õç¡{nûªÅ)À+%TÏ>‹P³2;w¨Eˆ?â p=©0¬ÚƧö]Gä ¾ TÜ÷yæÓoƒø•þͨAn½°'°²\K…Mú˜¥.Í(-ÒÃ󯉉»Å8¤ñ Œê¸­þ¥Ÿ{Þ44ú/ý˜÷Œƒ±ã¨°ªÛ0_ôXðF”Rãö£èþë­5oÁÈ{½{¯iÄ!iÜ»}nŸµ{’™–Tߺаøßq›V°•íý€œW°û›[˜?Ýytø•žªŽF†Š"@ë]_³µ^5¤ÔÞ˜o'Ù¹tT¡–Ö‚[l…äµúüfZy˜šØ3©È÷ìÅkäåê6Br„úë7ÒæsÈá<ú~+Èu;3¿ª¼ ì*S@°Ûˆ ü‘/©M;HýQÀTkëʴ’ÔÕaŒbŠë')Úø—gêZ«Â¨°ƒ(KažJ%ƒ&_Ô€ç¦,ûÝs{c endstream endobj 2643 0 obj << /Length 1591 /Filter /FlateDecode >> stream xÚXßÛ6 ~¿¿"蓃ՙÆv‹=ܺuذaÃ`Ú>(¶’ud×’ï.ýëGвÜY¹ÛpŽ(’"©OŸ¨ ü…‹"Xdq¼*’|Qo#íö úñçO7¡ÕóAÑ?Óü~sóíû4]„ÁªŠp±Ù»ÚT‹Þ»k5ï–~Ç^ñfé'Iê½kŽG&+¿’ÓLÓjÑHµô£8("/̲å§Í/7?nƵÓ(za¨ùL”aÀl²XçÉ*Œ õ—Íõ¹æÞÒ•hµÕIë$^ó1cÅ5%tdË(÷NK3µ…¼2Ó@µ0Ê=^ 0HxEúLÙ/)µLØš} Ò@HwhÛÖRìõRhBrz/ôœêw{ô¿’¤Ù§eè½™³÷C*«®¡¬••)¨B¥è×|ƒ×ý؉šÏ-\:Ø@°~”D^Åw¬¯5 ¦rãH(ú~å]³…É`c-!àn>aT`µØËJtói£[³gÙ¸gŠ3iCŠÂjš¨Ì‚¼\ú¡g¦HÍ~õÁ¢éeź.n2WaRæÍ·kMqœB*{N"„Å‘µK•ÕkHÍê¯1Íä¾¶Ã~ø:üDi®“‹4ÁaÍÀZ 0Jí*kïþ Jùá"ȵ׊R÷TÀŽÕ¡éká–â%G¦î¼z;—ºõO›Žð»[¦k0믠 3á:a<í'Wä¹äs©ÊÄvDaæé•‰pÜ×AJ²ÜóËùpܵôÊJgøq~;h#ЇÅù=ò Æ*'Yæõ ábÜ8üò^öšÓ€u[¡; À¹<2ïVŽ­n4w§Aã’•uJQeÏœÃÙ—t €&XÒU€¿ ¨:£¡Ò{8Ó ~Ö$VG6V yÉ•Â,ÌÐdJÛy’iëÚ€ íÈ) ‰ÍÊvE~eS7r5Ìߌ¢­¯ñgy?—D v¬³0·{R‘ùCÒÏñ 4]5€d§Gö{q‡àrEWìûe«u¤ÅØÑrà"ë’¾Ñ7Ñ¥à•Á"_=™ûÊÍd`à[W»G©¹Ž¾ô3Ùº©ßÞÈmgaÕ—\M7•£×m¯_R2·‹Á*‡;" Š<Ƀ,/²ÜC«†’:sØî‡=\N—­Éθ³÷=ÔÄ ¨Ôü1Ê9É3”°ýÞ=˜sSPDwlâh=’ zššL”ZD6(6·µ±ÝÙHçÆA£gÇøåZÃV´ E6\B rñg¨‡JH´å‘¥ü…´å!î&GÚAº@ÚA¡é2àkhÇü˜h‡º±ß‰vÐ%]ø£SúM´cV¶“í˜E¯Í#4»v=*Î;ëÂÒJ'ºA±$¥@‹dà+;=2¾àš8|ÔΣêÙu€µøl -@æ8<|§¾t‘¹nðG¹—L’éYkaòÃæk¤ÔØÔ[ȳ&zô]jkeâÌ ¯Þ¼€`:Ž}ÝÃl+ƒ§Ë¢#bœÑ»ï„6ìù0ªÚË!lÛGâ²r€Ã{Ÿ¸že*Ög|GÅÃ¥›˜êðÊÝÞV•ÀM &†m¿ß 8»Â({™LW´æq` n6õÝp,§EÜ-Éû‘H»öÌ{®X…‘MÊå+§»÷ƒPm}þôÕFÓúµ9ŽDµãô»g6Šj–P‘°i¢áˆГìÈÕÊuB1ä|Ù•¤Þm­ð®JÖônS)¶i˜Gfò€~J MGŒ"ŠÌ„,ë¾Ä—yÀ„IšÖ$Sœß1Ðü•mø?Ž íÚNÛêN´³‡5ÍVëË3À ¯±—BîšîȳÕõ­ŸË »JæÁPâ«m5È×òF’ðNçåù¡jE{Îü•`{Ù(-Ê—BÃy´NÓ§‘›(?›Àôݽ¨ìʪ© à¶ëþ?‘¸B ãÿRÄçÚ'低•|KDòy¾røß·¢' endstream endobj 2650 0 obj << /Length 2261 /Filter /FlateDecode >> stream xÚY[“Ûº ~ϯðËNåv툺ë¤ÍÌi{ÒI§}éìLròÀ•i›YRDj/ýõÅ…’å5ådöÁ"‚ |±bŸX•á*ãm™«êô.$jXñÇþñN8¾ 0nfœ}x÷þSš®D¸-ÃR¬ö«4L·YœMòv«/È‹õׇ¾ûía•FÑOW›ÑJäÛH¤ n jeE²qâö ×›4‹‚ÏÍ:U½¬¬~ÂoµÞÄyœZøÁN¡ZogŒ²mYÆ, „DÅY|£$'!0Ú¹¡6ø› øóÀ®i3ôjÇôG\úʼêEUƒÕ͇ö¨˜§jO'ÙìœVÙ\«/Ä)Í«Oež|ÖöÈrš–ÿФvúÉþ0€R'TJñ™Ìv½IŠ$øï .â­Hõò«ÆÝœ†ÚêZ7jA£,ÚÎê¶Y?Ùh;mäcMVêïaòñqJí%š¸GJ(Y¡5ÌL›Ñ× ©ƒ± RÁª†©à-~Fcw-x‡’ dÒ($àCVáåìjx‚!¡Tn6¸1æIJ„à~ÖÍYŠØîŒK°5 §´Cï¤>ëºö ÃÊ^ø’f¯¢3‹$hɹaR7Æ*IèÈDU€ësð]ICŠ ÐçÈ•±ÌÏClîc¶wôTí§i=IÀHñ¿ƒa€@ÒÑI‡€Ç³³¬¶^¸ ØàîVB?»óeà7êÅ2Éa„ ø˜bÙìÜžÀ0 >­ (vzžQ/K_| †— ñ# ¢?Å>¿L}D·äî‰çŽ£ðÆñþÎ7nÃÔ#Ê-‚{À ¾£¸ò¯NÊ2/EVFy˜åE|Cƒj€Øol§+òVãŸÇ9ÿÇe-ï¶FÿO¡¢QÞ‡KÊ~ô9†¼– _,Wîüˆ•ñ[u¥È3–×´”Q9¥™ÕH} @Õë1â±€qƒƒ¬íí‘p ×Êâ49$Uc;ì Ê¥J×¶ 8´ì±˜ƒÍó´àªœZL ðUç˜!A¤áO(Ø8ÎåîU踸Ú[å´Pò,-ž/N½t„hŠ_0ÒÎÀ­±¼\ÊÅx›DD`µºnôž ^äR‘ª4–àHq0Ì–"vi‡Îe­ž imCùXP9A”·i’3º¸Lû0¤‹Ä…ä0ô’Aò”‹6¿¬AÑê§“ÚiÈ\ca3Ytnd=4ú"(Û¬p¯õ£ª»…¢Jað¤Õóñ`.:…¬?Ü’Ÿ»#ô=b(ƒ0˜Ï{ ¿k¹vÚ?qLÈTÊÞPƒç7é¹0ºÖ'Pˆ¦SÅõ¤û¶9¥ nù—²;}4E–|Çüðø“%`Cš`ðÿí(»s_†DÆ¿_þ®‡ÃAõ_ïH¹=“@)¿ =.°qƹ÷¬høôù_¿ù¼âúFvlzº9zñ/:ƒ+Ò.ênœ#ÿDÈňkP®âì˜c_ü¦I#ê‹àñ—ÛLȤ›ªÆwÓÒ)¨®¡È¨°ÅeãâÍõ]¨¤ÀÓÀ{ƒ{P u?@ÌâŽ$½¬Ôô¢~¨—eÝ Tofb·N Kà{ªª[£x)6D“»Hù>´Vz›îé]`½þ6ϲ°~e’í%>‡<ÂGôf|EÃx~A]R§ìßÜ*“Ke-püèÅ ,S꺮”Nr–Ч·&%×Ë”õA3&lWÚcF—'u.·?Ї±ßmo¤x²Q/_xvg—MÖ,£xöZˆe-4"]¿+ã–ü˜WôCîнž°5SŒé ™Pž4·ZÚ‡Yðý'v«MËz˪"Ÿï°tðƒòÔLLHzÍ%‘{Ö2YºÙ¶ÛÔŠ­T3×¼~dJC&‚Åfr´pjâ»&È·aÃ#¨À ƒvϸ¦5¶~¨ $€öYwÙã„" Ãyß— å0n˜ÕÎTÁd®;rÕâ=gº³¹ÎwÝnY»spÿkáö46ä‚€ë0ôòÜÄæ‚³×þ¦"ŸûØ®CjÃ#ÊÝ}*“£<æ—:MOÇÃA¯Ûè¥sǹÐÏãNýå=0n¥y}?^™¿¾ñ‰…·Iÿ3þŸæÿìÇÄ endstream endobj 2656 0 obj << /Length 1045 /Filter /FlateDecode >> stream xÚVߣ6~ß¿"Z݃S-ƒ!°RÚU{jÚªMÕ‡Ûª"à,VSc.MÿúÎxIîàv•‡Œío~zæÃ|À¯²`µ"?éªhî·k^V$üúþŽ8€ÞòÛÝÝæû8^ñÀÏ‚Œ¯v‡kS»rõ=Uyg¥Y{Q1<®=!böC»SûyaÕG”%!šµÇ™^{á–•°Æ<µm¶þs÷ãÝw»)’8 ß2"_‰™‹­Ÿ¬’Tø<v¥tŸ¥¬TFV›-Ÿƒ8ÚZö=­m5â Ý4y[zµjÇÝY¥[Œ&×?¸s¯ÖE^WªwÖ ;byòÑ]ßÁ?T«Pϲ|@=HÔã‘ÏcŠ]µPË cÇJ¨[ѲÈ{I’‹…³o‚«º&iO>hY’|¶<À ÖœÕr>K„øyúë‹IÎZ.c$uÉMŠœrœnîƒûá‰ÐO g>ÇöÛ¡…S§Ú—…ÓÖÔÞÓBl)ÇØ ¡YÍÐA²®Õ(T俲ÜU»¥>,¹âì›þÔtV[¹ä ¢Ñ®ú¥3δ™5Ò¦}šJctM0«/A¹bp /n‹¦æ§N°Îh‹Ê8)&0 )ÎŽ«Ö\‚AÌTOÛªéjׇٌ̓›Ge+’àŸ³K 2?K„*€äðþ§ßç+ˆ.ŒÌK7b³DëµÚ›z-ìü…âÊó8¤-4¥·\, !Bº' V{`’Ãëö×Þv@‹¥R"Šú¼QÿIZºAáoW³ÑÞ^µ%4dÑ%0`R>~Jo"ØúÒ³Äñ ÅÑÞœhŸ%¢³¶ë7«úãñè#IŒãñÑêuUd9lºªÛ•´›ó]L‚_Ù¦ž»™¹¦Ú9æLˆD–$„çç¡ñ»%šLˆA}Ó\3Ö^A4ÕŸz+2wMÿp“‚WùQ•²'@ÞÒI^Ã|´ùe>ð¸Ûqm9ÌwÜy^Ì2[‰í«Â}D©Ó9CÊéÜð×'l]hÃ(`4èk$°pD É®"m";89 î+}‰\9\šî#û‹üg¿œl5}o#g0N"MØ“î¨^3¬o+d|'Œ=ãØËqìPOfÁ= F÷Äy9ä6_B@킉 Dóã;åŒI’‹jßæ3ZvH¡Ðî 4]ÞŒáàv(–8Œ/“BK am,É_ÍÕóåkÐÀ ~Eg^/~\†€0øs6â—&?"è~h•-”)jy¿Œîe[:ôY µú†Ü '~¿Ë(“Rx äöõð%E­º·ÇWç{I~žá9xÿîçwît…Áƒ+ƸóÛ“1¤ðÿ¡hî! endstream endobj 2664 0 obj << /Length 2202 /Filter /FlateDecode >> stream xÚ•Û’Û¶õÝ_¡·R3—¤@Jt&N;Î4í:–ÛÎ8yÀ’„„"\Uùúœ (jeR»ÏZ¸žûñ,‚ñ,f«å2ÌÅzV^Etjv3^üüîUìḸ€üvóêîmšÎâ(Ì£<žm¶³4JÃl™ñmÊÙç ^Gó_7?¾ú~sF•&É i"äD×É,^…Iœ $ lekÆKáéÅóEš%Á;#Û½.d5_,WiðÉ*ë÷õ|N™­,²v-È™¬Ã(÷~!¢èZš ’‚0È}¼ ã4fî{¹#”Ñx¹éè—(ÎÈÃã'±¿ÉžÜÂÿI{ýŽnu]T]©J žåÁQ»ý4¦7öth]ãÔ:@ «ªA‘Ž–¥9á¦éxƒ*Çß°ÅødGêšÇA1_Äù kÐm‚ßTFÑ£¬‘íå2($¢¸A­Ž|ÜÔʆ`‘´žmð¤ Ôha忬»BÖŒÌ[óÑ}äï­Ø/RZ¾’üS7æÀ¦Q$€?§HÏR¥BÀèáRdÉ ë<îƒ+ìà „ÂI×Ö%¤ÓM=MqƉOoì8«b½¼á=b-ÁPG£CeÑa͇|À^. §{³ã…-ŒnÚ½ÞñI%ë]'wjš¡û“Û7õÝ7 ™iÚ1>°ö9|SZºð¶>0/³f.ÂD$³4[‡ð÷\²fàÅ4'ì'\]¡$Ò{çZûúîîx<†-ñ6f7 ¾òÞX5¨Wô8 l:D«L8æ-eð}+‹y² ~ŸCX‚•ì4¦öô‡K§L4… ô"AÈOÒ¬»C;î¬Á뱯Þ qƾ°´º]¢cˆ7Ä­˜-YDZÞŸ>¸4´º£¡› Ád–9Ó¹×…ëÐ/KÐ'Õ\”ªh€®é G©BÅOÃõž‡Å2]ÿï&¬‡¨Y„g‹ÊQrL‚P¦œ`?L’p–¼œRY˜5$?Ç4l×¶p³ 㦰#×£/ÎZ»Á¢Òm«ë–ß|5‘¡‡£±pU+ÔÈÒi_G0cw P÷£2n"ÃTçtÉæ-<å#Ôv<Û3EJƒðÛJãxÕl_ÀA¥‰dᚦ²·RwNID!úÒ€,™+瀹"€wŸþùþ¿ã¢%ù:°'ëÔÁ2ª¥x:É1Byާq,f=‹ë›,þ$‹}äØg5øn¡õê꺦i<º0m¶ŽqýG×es´7Ðuz×þKm}Iç"rèJ>Tê\é¯j@±§Šufùê™"ÐC/.ÀGªÀ5Ò'eÀ6)„ðN…µrw­i¨GºsDxQÜmu¥ìÝ¥ƒ/’PDa…«?§üì";}_[ê†P±ÔFO¨}ý‚ BÚ²#ô:M½N!wxÑõ4û7›¦‹BÁf‰åt£¨‰Ô[À~|šý—SUÁ;çvÚ©ž“n4IM‰‚Î…ÿÎø”¹—çf;ý²6-ðÏlöüæÉ>-ø›ïM­rr§¥žr´(}7T¢+â5'²MG?-×-Þ`iZñ …;š¬`Q4‡–Ô ý÷0r!„ÿÝJH<ÖñæHM6®:«© Œo$!çÁ?äFM¤5üv3‡¾Æ ¤ê®Ö¾Uî! ôneWa€qÁëjBÝP>j0åá'øB·•z‹÷ hnª£–•ÅÉ2‘®åßòJí|™í.+ýUÒºÿîít³¶Á‚Š  m_8P$WEg‡ž|t’ðDÚL¸‹1É #ÆåÉò;iŠY<4õ߀'¨ŠfY‚¢¦ÏA;~àµæ¤#ƒŸõvÛ£ƒ‚æ}ÏH£«_©Ù·ˆ5ªt‚’`<Òô¥»öÞÜ ú•€¯ègÇÂMiänGÍ3‚4Ò€§xǤð#½~yÝ êðù×ÇžÕ˜ÉzDô°6hu馂šG¯ìkõ …Œ¶oª’½_€8¦êaÆõ¯=ìP@:ç`n~yñK#.~ð;T´ -ÄÕÛaV³Ýy,€éoÎòYÎn„Rzƒ`Óš'™d2Oð<1˜ª‹ª±¾@9PÁuà3Vÿ¢å߸šÃœvt€žLÄ.yÈ}PPBv¦éZõÜ Ð(¬‹oŠÎU;Ž’~=â:U—ÿ7²[£µç÷[ ¤ä\Ï18’Ì Ç:/‚ñ¼²’·gVèÎðïÖȃ?ò¹VCN† ‰Â%Ÿ¸f§€¬Ç@…~eé6l£/-è HïÓÄ–ˆ²ž-H Äú>^×ECOÒý£|× ºò/Þ){s1íeBäÀ+œžÉÂOÌãýÖ@þôF_ÄaAÓ>.ž(`,Ïê UöfŠ]¶ÔkôsRŠö@$ÂPêmïÏd€ëWYøô£.;¨¯'vöòœô8°ûçe7<ûBÄ*ÿýgP¯þ•©åwÀ‘ ô½°ŸùþÏ…¦ˆ endstream endobj 2670 0 obj << /Length 845 /Filter /FlateDecode >> stream xÚÕ–[o›0Çßû)xšàÁc0¤SµK»v—Nšº¨/Ýp$n2NÚHûð³9¤¹”¦Y•U›ò€>œËÏÈ!–§ÄxVD)±•G^{WN,X\]‘ÎiG´æù~x䞇¡E<<ðÄŽ­Ð 1£ì>Þ0µnlççðóчá}¨Ð÷÷Ìi<$}‹DØ'a`’ê²X`Bƒ.Ÿï ùöiU8ˆØwˆ]¦èÒY)D£ÀþT:”ØJÈ1O„)O·ÂÖ[ѽú1ö]ÐwÍ¢¨U¥–¾mßhרN*G_íT˜Kdòú‘½cÔnµ;±ÝˆÒÑ–KUÝu*¶1ùÌÃ~0°XȰfa¼c’ÌdÕ!”rÅÑ(+¹\@48ÌŠº’ \æ¢,_››`šU/Ëcây^ôf|ÒÌ'+÷_-#¯ƒéÓ¬©s¾è*èãzŠÞ äãðë%44ö@±ä¼“Å[wÖH7¯ž»Í”Ká¦UÒJIón ¸âŽu.÷K.²뽎É}ñ»¨­x¡ 2C´©*òÃð¹¦g‡Ç³-%x]©?Ëœ¦­{3@±ŒŠµç“(ö{y¾¯³€õmûÕǪ¦Ðœe*¤Ha{”©‚×°æ <|0ëìNäM·†O¡ìªÿÊù Ìu:~€¹—²v<Œà98ä—³†÷ :: öTõ>¼÷Tõ•ùK8}‰¿„g¢©eòPó6Ò-ÖRÌ3q N5IA“ѤŽ&Œ¦ÿƒ÷ßà\»a“,bº~¦`âw§04óNàEvSÍdҭ׆FcŽ+i †#ph‡#ÔÎEí ¦Çnt…[ \Û‘sî„ÌæYÎGy·­ek² LG1µ¨Ø£>1Z.½Ñš{Ïl¹tc¸œh%ÍFX·ãÂLHý.èܹ +9‘¼žfI³H‘‰‚ÌÀ©uÓ'd/;ü O* endstream endobj 2676 0 obj << /Length 1090 /Filter /FlateDecode >> stream xÚÍW[£6~Ÿ_æ ¤µÃÕ@Þ¶Ò¶j•iWMV­´[­<à$îCÁL&ýõ=¶Ü iÕ—Õ< Æçòï|ç$ñ,þ<+u­8p&V¶{põÛzc™‡_xð:;†èÄò»ÕÃìû(²<§nêY«µ¹&â­rë³í%¾óÇ꧇«!Täûÿ2§²¼Jšø–cß‹B•`‘$Ä^vùEÄ·òl*6-u<{ÃđݰúÕ <›Õæ\Õ¥,áѳ³²P0/K‚šý»iü“ÈÁÕØ‘S»Ï(ô#ûÓÏ?þ>EÝ“O»>Ñì—% {<„ýnÂ9Lí÷ÍaWÉR²©äPy[UÔb—µlýjͨlk¦OÄ.׿­Ü²Ë~)Á I-ì†wZÖ££õˆT.Bjrº[ªU ÇRµÊu«Ôù£iTе R¹]*/À^ä™(_ÜÈhHqJ|bø[,?Ž äHÃSßs–í­”U3ŸÍ˜À{þÂ+–sŠËz3S§Yü«Íê¯ë„¢L¾w Ò ´¹ÈŠ6çbcò¯[‘!]›{^”䥓0¶¾ºmê˜hMé÷¯N «9}.º«•™tm!  ”;Ý6z"úi¦×eQ” ×~¸dËaæ&: O£';:£û‹ëÅãTâÚïóN&úSÒÞH`cv£wpÏ—œüojæW½ƒüaу½‡IÔ¡ Òã6«Ù_-WÁÿ¨¢Ù ôKï­‘e¡|hž#Y¢‚7òÊÑ:ÛòWµøûåò¸cEEÍKlþ=ö{Oßé…×iffo*3y JŸu`c~Ù-4ÎÀ­†-(¬L½åL¿LG4Óz5ªöƲV²{”wyBo¦¨wÍÖð!¹EY)$fQ]¬¦+Ÿn*&¾Qœd@6¬`™œ^G·fhX6ÿ›ÎoFÿá ù÷T\‰îŽü•_¿ëÏUC×|ÓÖºÓY ÍÁ°}6 ´ß¥Zú§é}‚×?æW©j¶ô¬FYÁA7Ú4±_¡Ýц”Kg©³ÍÛ+ˆdq‚ÏÄndÎË‘Ûn’h7Ç*î9Ü4Æ ÎçtN!Ì«&­/ruW õi.x›ûùŽþYÖšÂfœÙIÏF…‚þýÀ§hÆ;mb ±š¦·L‚ø ñml`¸ÿºý“üƒ endstream endobj 2683 0 obj << /Length 768 /Filter /FlateDecode >> stream xÚTM“Ó0 ½÷Wä†3Ó|8Ž“t9Á Ëlj¥Ë!›¸­!ƒí–í¿GŽ’¥ÝmºL•í§'=IõbøQo{9cá"-¼j7‹û[½ñÐøò~F\Ààùv9‹n9÷h.âõ–kÇ<ÌXöÈ·¬½¡ó,?ÍÞ-©x’ügL‡|´H<š‡ å© ieER–ñR.º¥qz [ÏH)›ò¾d­µÚ=mmšg!…ªf< ¡~×»;‚ƒhœª3aO(ûÒn­íÌM¹ð^ÀЇ²rŠ£öºk¥7"l…:­~ŠÊšh,Qt±F®>ÔÒ”ÙV;Oe{¹êîíêT 侬\õ•÷JZŸ’:ôƒâõF‚øLÌÄZÈ kmÈhÂ=#A ½œtU…EíÏ cÏ®îms±Ž£Pð´vÄqFXìü ¾Ú"%s¼Cå಑WdÃûKÛœ]‘ q‚úŠç¨zXà‘Þe endstream endobj 2697 0 obj << /Length 1605 /Filter /FlateDecode >> stream xÚWK“Û6 ¾ï¯ðQžÔ²¨—¥ô”î4i:™Ì¤ÙÎtf“mÑ’YtIjÿû-Ë»Rìv|0 â>@lÀÍò`¶Š"?³ÙfwØUUÎhðÇ»;æä ¸Hþòp·|›$3øy³ÙÃv–‰ŸFi¯ï¡˜=z,‹ç_~¿ûõ¡W•„áw¢ä‹K³pÆV~È’/³Ò,öY»û’ù"ICï·ù‚y¢ÙãåÏ …—„™äîÈ›ù"Š"¯©µÁQìÉ-­l•ø§í<Ì<Óiëoóp剂¦°¯M-[MÓ/Aô7æ~ž†)^øè½3Æà&Põi̤G<ÊèúÚ)Ûñšî†ÿÓ}Ü<÷&c™ŸÍÒn»âM’\ô¢a:4c¨Ìú¦2f¯_/—\w{#ðµìÔFl¥*…_ËåÛ7£ïAÃ],dœªOWʼn'[ú‡72O#Z†70l궤Þ4è4®Ñ-æ>Úí7'ÛF "±g*nœR%hÐÊÓJQ(¡µp—Õ`ƒ3ÍTb ÌE´Ê®j5èJvU{ë98ų1Y䳄‘k´ 2ÂßHÂú|ýóGÃæµGƒž-¼Dªn÷z’·­ìÚØ9F;ù|KÛ¸·þƒ ¢‡U%ÁµÐ?9ÄìŒÆº[ëªû`vüøÿiqº„&Aä§ìV>< OÃàd~Œƒ’‹Ñ8nÄá=ú4Xù'_Û² cN뮤$˸ß`ïÇ~óž‘LÉJ‘.O‚ÚYE(K`wà)×ÛÀò¡«Š&”µ&jú‡F‰Ö*‚â|.ý3ž3éZ…^ƒLo&^ ûem&bcy… `näþÁ¼!½—÷î|«vyŸÁÚ64°ú ßÕæ+z.ÏñÒÌœ3`袂ÁíA´ïjc(1`ÎI=ºçe!QÂùXÇ“ÅáDDÌëJÇ‘Žž"oDÑðôµÞ2Ž?ˆnLŒðdbœd.p©ºµ¼°|wB‚(¾¯êÍ03j­»ÿÎS,ð)Øðd PèA+WqM+¼Q‚G·M>âŠSL¯ï¢°éx®®ô)@Ꜫ±¨ù³á¦³MîxP‚È}c‹óx\¢M6§a€„Û'Ì¡†Ú2:(/Fàc¡¿JÂá; OÃçdnû@¸¯x[Š’B8¥ –û,t߈WH¾)ˆ“pÄvU¶ˆHÙ)Œa\!¯£ E—¨—àÍh+Ÿ@–½ûøçôÅM½V\Ç¡Ã{@@×¥åÓ$u&i© tù4OR× NtîˆáÛ6¾¤²­’»—PBÊ$«Y”ÐcGWÁ$éÅ@|ÎK¥€¿l;p„¢µ5h—çÇ.'_fØc×”0…^‘7ÄéA㺢VÐö׸P@zÀç7_WëŠÖ ƒV òRèž3`¿R´›úb™0¯…ŠhÃmƒìÅ©5’*€‚ÀJÎFçÑ™ñQò‘Nfƒ“«—'-ûcT’æDÿxÆâlGFuN/¸¶/<¶¤Œ”º-ïl¬b–Z£ŠNÐÄ~­0[!QPõvç~ÔKÞ«W]:³_ÀÀ;êÒpA(%•þ&IÖw¸AUË™0ù=Á®5öü Ê’:*JÏ]pB_ŸºDêFÜì¹ék˜#7ÆUEÞHj?£SÃèˆZ€¾\½ìʵÑóOÉù/¯ëú endstream endobj 2701 0 obj << /Length 1382 /Filter /FlateDecode >> stream xÚµÉnã6ôž¯0æ$cbWÔf;iS´S Ç·™¢ %Æ&*‹IeAÑŸ÷øHGv$ÇIÐ 0âòøöÕlÃ-âÑ,M§‹l>*·±;Õë-þüý‚y¸ N:¿,/~úšç#Oñ‚–·£<ΧEZìñ-«Ñ·ˆÍóñ_Ë?.~[îQåIr&M„|AtžŒØlš°£'Ô’ãÂÊ9.ÿ¨$Q¯ý r „!þfÑý8Ï-ÉWƒV(¹n”Ãl÷ ¾ÝÕ\6÷™1DΔ›§~ÜIž 8½¸Ýn< ""c³è«‹ˆ-„|»sO‚ ð]^C€º ‹ñ‹qh,oJÌ x¬nék7ÒŸ¸xò9Cz‹º‹Y×$Ø7¤ÂªOè–d4=Ç iJRµ½‰L“fò‹€•@9ç$Á0r²Ø«ÖA¾ÙÕABï“Æ~ºL.)˜H#7xóù³“ƒ‚íçú²ØEÛp̱ jLF´|YØg@ƒœ˜A!¢„Gvóq`¨&ÈõÃÚÏN%A$çz“fφ§.ùyÓQeK¬_k‚Þ{‚ÏTƒf²âѦQÄ„i´çõ¤«·7'Êî1rðþ\Ùc²Z5q ¢½Õ: ìe° _Èxõ¦:@ø•5(å;˜,kÁõKÏ:¬ªïeÏ!?·N}ù!ûæÃü¿)jƒË?w=hb AÑø¨ð%ß'³ç2ˆìïË l|q:$:ŠÆNXQ^£® SVÐH^”Å”%¾7Þô~6ƒ´½õîzH]å ¡«#_oƒX¢l±–Ÿƒ^ž@o¬Øùô¤ŽÓ`>ñ©¼¯-_¥òûGé‘t®â9ôísmþÂÝjÐIâe«µèÖ ê”Ïaóö£lžOJŸ ¥…mu3@Ì÷ý2ÆÐÌSJnC=H»9z³U![kQºÙ¨«Ÿžég²'$°j½LZÍK²&œÞBMîñßpÿ$¡ï,ßà𮕶7Íà¸âTÕõ½3CúñMñ(;ŽÎLúLÌÔ™²*4ÄÈÄtߘvlñE¯$èY?õ7!Yœtæð~äp€Æ“-úJHáxÀkô8\í“9n#JæÎÒ× Š‹ýT¾‚EÐ7^PZ¿†MZDÿÓ÷î“&[DFBГw'óbÞÕ$Î9@Åø%jn8¬hšrA28׉{˜¶Ù s Ð) mP“›0¾Ag6©½5¡ç¯kµâµ÷f8ƒ¢#„ç–~Œð3#¼îǤΟ¬‚0Þa•>Œ‰©BTä0}­ä²·ÒfÐtƒlhÚvjxºg‹"£kv*÷T ý ÛŸJìg^kw³áv5yª‹Å_Ã~õŒÿ< endstream endobj 2707 0 obj << /Length 1303 /Filter /FlateDecode >> stream xÚVKoÛ8¾çW{’ZÑËzô–¦IÓ.² bïvf´ÄX„%RKR.òïw†Ã¸®«´‹ñ3œùæ­xÁ_<«¢Y‘¦a••³º?‹Ü­ÞΈxøp{¹.Ž$ß­Ïί—ËY…UTųõÓl-Ã<ÍúÖÍìK—ùüŸõ§³«õAÕ2Iþ§M”üÁh™Ìâ"Lâe†FV^faœfÞ^1_,ó$¸˜/â ž§I°“jžÆÁ׎7ÛžK¤­AL§øÁÁ¤ £Êkº’ÉZ°n¾HÒ<0ã0UJ[ºyRšÛr"¾Ÿ'eÀ;5 % ½¨zòócƒ_ïÂ<÷ƒU–Oa"‘¯¨ŠÒµå’k5šî™ÎƒVÈÞ‹†7t³Áóó ¶?˜58FÐÓ8 ãeLž®jÁeÍAšÄ“ Wr+$çZÈ-]ÞÞÏ!v¬QœÕtõQ+ì8‡„x!R$n<ì™]Lá5&%MÓr4–fzúbˆ?¥ ”`9h°dÖGElø½è6)Õ–ÑÍõ¼LòØ}ÏâÞtèÆ”h(s¨ÄŠP~Æ×#¿;£ˆr©Tc×б;Œ‹³^ˆ¹cáÂ+\'Pz¿@bÐ|/ Ž•êBøý¤ZIÔûžß¨¯2 0fE°Ñ¶.êG/Ñ ºµ8øu}¨·­fýtAgYÜrËÓõŒ¶eÐH H‰4ƒÐX»ÄâDœöRø'¯õR–•¿è%t9+J*Tõ^IÖyú*¤ßßšƒ¸¼ù®úÈýC¼ŽJgíä–i˜ç9 ‘0Í| \9FFy<;ºþ›ž!ŽIW°Î0Š×J¾E|þ-#%IÕ×Vø¾ü©Â×Ó‚J„!efxÚc*nKX”)U·Žk—&˜³ˆ˜Ò†Î¯fgòÏ']–ÃðÑ^ï…lžçîê†õ=×M‡ù«2_ØÈ{GÒ3éY”Z଱ûTOÊîa†½´êdM¯8“Ô7œá`M‹*Ј­ÄÂD†ï‰‰Ø¿œá(Ò©­‚[Ypº4i­­ -6£uAÄ[@Û 'wšCÒÜýªeº±Ø¸%´77†O¨›ZZµ¯7ˆ“àÖ™×qü%ÁŒ¡åá§õ%æ’éŽvA¬,cÖx ÷­è„_‚œø÷ó%Œ®^æ®{ᜠFáÆÍc”¤ó¬Hî¥X£LǰËö$zË´˜œõò€/)KðÖGŠŠ`3Û”Ãl•žÙj,bb»‡ß–¿¼gõ¿#÷÷0ÀÓŽœç;bÝp)aíùW+‹³È9Ì[ÞÁä§nƒã΋“.Xµ•äUðYðÍhYI O+·üž°ú’" ~—J $XÛÑ`÷ïá+çëÿÎ>Ö»Õ»Òô ó°tVmHrµÖ²¦2|h'Êç²ecï«e+?/“* îm'(šÂvÙr¹ÅÑ™F¸âa`7¸ïª°ôòhšÓ’mHäÕ®Bæ·®rì3ßøM= PÜÌ €9ýwþf÷ßÌž~ŒÆiV°²³* ø¤üùé‹ôâHœ¾„¿ƒª”pX;˜·ççìÅ«pdÝ¿6šMï«·? hxeŒbÈØ/ÐzéÅ‘øÚ¥ß¡Ý ÛŽ›°Výùž×0¢`÷°lÌ7? /'AÈÿÜr2~ endstream endobj 2612 0 obj << /Type /ObjStm /N 100 /First 971 /Length 2275 /Filter /FlateDecode >> stream xÚÍZ[oÇ~ׯ˜ÇôÁ³s9s ŒN\¥\Ôµ4­+rM²–¸w)ÙýõýÎ+K&%q—Œ\@ Î³snß¹ i¼ÖB ãµÚa:ÞPAëø',å-VKLá]Ä^+|Ê[Hë™H"ºxb¼Ñ"9-$R²üIZY>ÆX¡µŠL9¡âç ¸â}û¬b.Æ MRx«!›gF8@û¤™A:>BêE¶YvæañZ?Cuäó,^¬ÎOàP"/¤4-ŸŽmÎd x ÌN’ჲt–'–„Œ0A³œ„÷"l /‘ø\‡dø ‚ÍT0LÁ:[–µVéõQ–´N³ /xÀ̓òÙ<8ÓzǼùÓ`ù8˜ÜFÏ’Á¤Lþ4Z«ˆÍd²Ð‡ ³H‚@ò{ þóü„ׂå÷œ è™¹””a)@ÀV–¤È¬¼Nesø*±pÞ |€ÂÙÀ‡Aa爭M\P|”%Š "v1d RÙ$! ¯=ï ìÄFá8ž  ¨ìkæ6 œÀCÌ5b_0,ôó)kµkɃʎˆ à1¦‚d-XÄ(‚K¬ ‰ÓøÓ¤DHŠI‹¨²]“QG6ŽŠ6CòDÊFÁKd[X,úŒ?ÄG Ž€ ØžXŠÛpFÒy'9F—r e>ŒL!ЬÊïE‘(°uð–ã Ê":yþü¤x÷yQ‰âÅ|^·'Åõr\-Å{…W¿o«Q+ÞC+£´°ŒJjüG JE[ÎVçm>âõlþ‰çÏEq&Š_Þ¾Z¿|7mÛEó}QLfítu.Gõe1š–Ë‹ªiÚ²l›¢¹¬ëv:ªçm½ZÚ?‰~8Á ÷R¼7Œl%ÞŠâ×þK°«ùêââ·‡6¹àeDj¹³ñ²x§ŽÀúSÀùeM,ÚohÍð±›cO=§ 8­x³¬Ggl#Š7/OEñ®úÔŠFk›¾)'ÕIñ˜Vó¶á„–f«6PtT5ë<˜ßûk5ž•?ÖŸÖ¶÷ÚHæ}S.ñ4§»Þ˜=Õ€qή,ÏWlt¥II2ÈiÉi°Ãìóº—?—åµ\ûtÕTËÑZÏìÞ+𪗓e¹˜ÎFMQ6Ÿ/mÝVÅ_þüâeQ}*/ð~Q«¶jZ‰Ï·œˆ?îô¯6!I Ëíáôûýìç_ÿvþ6ðê2ä*G‡¡À¨(ˆýPpÇiK=²éq+ݵË0Íi[säãÁšwaÛO©c(’v(†²Y9·-÷Gôȼ/ÀÉ’ä&&ÉÇ:n“”’Î:l¹ æŸëwµ€¿{–å¨]UÿV¤.’·C±?öƒ—Љ¥(ê^ ¨ƒ¸¯¿‘“íŽlm÷ÍÖ¤¶œlMç䨶#Òán×Rq …È…žýî•–&Ø–?«ÊåhÊF_”í´9Øç.itn‹¥B­t1JmÌA¼ïÑðÒHLÆ¡’…µ¦èh$šò^Õk|5k®&—òÀß«­!@œ‡‚Öܳ;`Üš#ðÏ·ûÔ¾¯6šR£}<ÞFk6‚¸ñ K²ÛaIº_XÞV†Ìaù­!º‚{·£' 8<×Ûdê*‹ë²…Cs F‰Tct’Šç´–çc“dò~gÈ7UÛÎæ“ó &Ê®9ìà8œÓŒr2¡7ÖÑÊ<jž)ÜÂΤ 5½žäH*ãäù²:_M&Õr+Ð>aïMV+¸°HvˆÂ§ïÝŽŠì¨È®«¿.ö¤HIÈ%+cWo™ìUÚYs}}-GeSÉj¼*Ófãª-–U9¾˜Í«BNÛË‹þ•ÊE%ù~ / äî°~*!3ˆœûFœß1oxs^Ò/^u„î œDÒ æ8ïdQOC:_X×Ë/ì”ÅçvZÏ%†ížØÀÐ+‘ ¹IN±ÌxÜ_¢ßy6ªçWÕ²}f$Aqd”ÿ–8 ­X" ZªžÓVæ{h…¢ähgÞ,Çã-Œz»G6²Ék'ùJóÑÀˆédÕ°£÷ðô¾k9|ØÁô¿§òI GK¾7#ãÑd`íóº@Xäx‹ñŸó½Õ™zzß%Ù3Þû¬©–WwKûž£ ßñÕzâ1 òæåSɸö>…?â…ÔQZð°£¹û6!m…A蚋п¹°p^ô_П»‹ȯæòzöq¶`ñ¹F¼*^—óÉ êÿ~–ý÷;ÌÕÖ£z@wðÇ,iñD¹wùâ‰dÌ8 ûÌÊÁýŸ-îb£¶Ø5$Ñõïd7* 6¤´ ØÐ¥sœ.`Ñ´5tj‹á3‘0{¸Aë'WÆK4{€*šCAõЃ`•Â6¬’;V])])ÝÝeìzáÔA/éŽè®R—õF¥ÖQFá1kò]²5èV! §¼Xþo#aV§/þÞ·iÎB¹d¤¢Àß›cæ¹×þ0PÞú’l> stream xÚíœÛNÛ@@ßó®*"“Ô›Ù;â"U½¨}ªÚ¨/¨‘´”ªT**ßM¼N Ù8Ž¥Œx™±æäÌì®×@ÆýdŽgFæ¤ÍŽtøäèÅiVþðþuB\á‹[‘χÁ+¥2àÌqÙðK¦¸bZèéõ†'ÙaÖl¾í¼N/¥ï9Žœ»©Å CPr|Sÿgi+YÞïÍÏ“ÏÆw,%Rã8°àLjMa˜P® ~R È,sZO.ÂÆg"Ì„Ù[Q‡*“ïl` ö “nä ビœâLN¥p¹Ö1(gÊa²#"¸%+¥Ûñ\‹gÛ…"תÖd–¥Ÿ.±f&ФiDšzxÀ¬X¶’àmEýI€Œú¥=™à»¼°mE ¢ ?®¦=f±.€t“t鯍Á ºl:®'ôò ¬šS  Û%wZáNÕjzIîôÈGqGò;»:wz=r§ wRPРeŒ3‹¢ÒO*c}*cë/cý>¹Ó ;µ(¨Œµ«ŒýM*c­Ú4¿jSçQQÐRç-u¦Ì&E•÷hâÁZÊøj'Dhÿ{” ~j"méçÅqT')Ï«ÕÁä`L„ïaý~„õA¨ÚóÇ(a(ß÷n y^.¼cî–N/‚,izÁ5ô:àrƒØÑåu|„+ˆÂýÒ~XUëŽ`Vƒ´mHš›·kn> éÉúÖ¸%S™R‚ñª í,0ÉsS ìLP’GDæñ¶óYxìF hT-¸·s É÷#Í\eÑnŠE»dQ;,Òa3ó.u£5?q …QÝ^ŠE{õ;™ Å=v2//tû)ˆö©Ðµ«ÐíS¡kG¡ ¤Xt@5oÑì«R:Ël€2J!7JÙÙDÈVÞÙ4}3 ¥æ¨æ­ùIh5[ˆDƒKØþX¤û¦mxáó[J »¡îÓ®1ÜÍ YÔ¦1Î_aN"|Qö«Ó‹£ó¯—Q~Bo*ªä9pYGÀ0a¹@$D`ujBàNÿŸÉ³“h"Á8*0 n¢O«½Öª®û¼Î×þÃIªßýº¼úp|qv~ýàJܘ‰Ò§«‹ñ2jXb endstream endobj 2831 0 obj << /Type /ObjStm /N 100 /First 999 /Length 1950 /Filter /FlateDecode >> stream xÚµZËn$·Ý÷WpoØä}‘ìðÆۋăY8¶`1$c<8ŸsÙu©,¤!jn¤ÛU¬sxx|TQ§–J¢VFêf0jI£M£¦Z¹E©RinqªLóš¤*<-MU¥»e©š‰[-ÕÖë VOµê×F¢2Q„•Ø-Ü nŠeZ¸!¦nJ»?Køic>‹®õâýCÇisPO\ØUÐH\ÅŸÅO&óg¹&ææÏ¢»,}ZœØŠ÷€%±Ë‚¥‰;yØžíZ’¢ÎÁ=Iµym$¡îOHIÂÃõJM¢Õ{ ”ÄhZœÄ¡`I’.þ,º&cŽXÒÒ¼§¸¡u80ˆÊ³W•‰¢%©²·ÓšÔt^£¤M½§ÊI{s<•¤£OK“•1ïZBW¦Õ’1)8´'»ø ¦s¬¬$³9Vøc­yŒ’õîϧVʼ+ Qá:àxlÞµ„1œ(-A_‡õFç°‘ðËñZI­Í^µšÚ¨Ž‡&½¸C²×9âÓIçš:Ï8@8v™q7v ŽÖSoS[Cäv¤ÖKê¿¡ñ(3š:¥Q' º1hƆiÀÁniZæ]KÃê|¢!h€£÷„!õþa Ƙ#> ²¢Ìž uŽÒ¤"=61*µ¼ï°Ü à‚…¿õ(ûúÓÚäÔŠ·3¤‘ë…'f¢o=S©x z²À‚pO‡Z:8Údëp ‡4ÒXÞÂÅÃÖh§7oNçïÿóû]:ÿýÇ_îNç¿>ܸ»ÿð‡÷·#ÿ¿=¿½ûãáãûŸîæ5»\ûÛÝÏ¿þøåßémÁC€Òw'€¼ÇÓHIŒýløÅýýÐÞ^ .] ÉaÔ0( CÂÐ0,ŒF#))))))))))9999999999%%%%%%%%%%5555555555----------[ ·@nܹr äÈ-[ ·@îܹräÈ={ ÷@îÜyòäqA~wúüóÿɰ™ §ówÿõaþþæ×ûŸÎ_>¼ÿùîý%‘Ê;O·Ÿ>¤·ÀD]Îÿ É­x™î™˜Ñâ‹ôæM:—Î_?|ÿÎ_¥¿˜}–@õ³QoevQÒh¹ ö·r6ÊÃæD”«××N¹Â%F-›Êùú‚³Ž뛊m¶½UA¹nä„BllJY›~ü{wR_¨ÛGÈÈìÑj2®O¬½+ölÍp[æ¶gů•²”§b)µ“oi¤’ýå £js÷dT¹Â[–RKãÁ95nä ŠJæ‹©ð£èJ©[ýœ®q'ßÒ¨-ûû§ð£¢š+Ó^çÔ¸‘Oñƒ{BœäQüËÕßÉ׊ÕÕ–—KbPºÄ+tz/Šbe¬HØ÷­^ N—¸“oiÊÖW Šô,ºYâ…r*ÜH yø¼Û—yXfµ­ƒÓ5îä‹\äùrHW.2†3ó–ìXƒÓ5^㻕I³y6¡Ê˜›…Ú^?œSãF¾¥±Î—|17ë3ùñÚeÿÒxpNùB£U{ÌGÉZeïÜœ:Äöñ-ØÜÐxô#an¦¶YãÁ95nä µÇßf ºù›†¢ù¹£”òÚ•jñ³áv0N}Ù–>‘\±W …U)—ö ©ÞJâAê"·.•Ì™|‘‘É¿e•š©¶þ/éº1) endstream endobj 3041 0 obj << /Length 2029 /Filter /FlateDecode >> stream xÚí]]oÚV¾Ï¯àÒHƒžoûìŽôKÔ®ZѦ©š*ñjld;MÓ_?láØ¼ÎL³âW¹‡ç¼~Îó~: Ùh2°9ká æ«+²y6^¶~{}E‹ëFÙ…£½+¯§WÏ^I9 d¬‰¦ƒéßûo5] >ZoÂ…÷uø×ô— r¬¸ÊÞhóuœüé«—Óêí%cÀÏ‘_yôA6 bÌ…bùqôXr=PŽS.¶s’ÿÅg¯88c­”ȯ#c¡²wÌ~“:j{™+¶×9{—}1I­Ÿ‡#jߨÁO€×àO^æ/l0e˜ Î-iZ”lAÈX ],È,ŠSÓšPFbÖwN¸Å)øÄ;ï;´&L)·˜úi8â"{`ì!µ8hf$AЖOpcû¸ƒ°Ž‚ÛÔ3Z6½CØ€)s”% H©Lçs/0jÛHGT!µÅ+|%᛹8[)Ü[`Ï”c9‹>ÆxÈ´õ9Œ†Ì±îo±\yaþTš˜õ ¾ M¤*X¦ÐÀ0ŸGf‰ îX'`Îmˆè†9ÂÿÄðß cÒ­c~±0Ëe…ö~‚Ù³ÍMî´aý»ïÝ™7Aê`TãbB2d²ÿÜ&)ªºnT`§ŸøF+fi£3éH$ˆÂ'þ§…û_y·HëßcDã{#š‚h»í4‰cïÂxGø®ygtÄ·™´…M,ÅË@) r7 üeˆr»[¹M5@¨äÀ/ü%` hCÄu`›–ì–ü†g¯;Â+At‡¼Ò-¯¯„ ´þsZ?än&ï^à"œsd—‡Ô-1ðþÊ5'ƒ«°@|÷2ïË,EÊ !aPýÈ,ϱªe*Å4ŒÒ:ÛDÕ]£º $}¦~½ç.h_ò\‚ ‹©%ª„ÀÖg9Âk½Ž˜cy5zHÜùkhlK:etRåÏ1§õèœgmrZ3Ö¨y»Ò¼œaÇfÏ3ÍÚàØÉCx9J2$“-L¶&Λ Õ²ÑX5›«Ð˜[Íë’ÌN3-xá25'1¥ûæ×JfqY8¶°‚Ûx¾Žü0Ž©ýÞÄab7õW55øú ÿÒ‡$Ó´´ÙªHüÅåms‘²è{êßh£Û„~ ¤~z³òR¾e‹(÷|µåÅnÅfŒmri\©@wpìÖ”›(ôjkI2z$ÅFTkÉpÍoèûíï§¹éÕV'=ôåÍvÙ-,¬)ÌQèÕ·Š®dr1§Kˆ1‘ÞyŽ‘qMɸ‘Œi™îb5j Žr*¹Û’ñçü±WÃ+Òî)?béÒ·•ÛÔF¥róùÿ§ÏÁR4¡ üß~ÆÄXÛt Hö={¥ºš3à*t:˜Á.€Ÿ$koŽ-íiwÙ0£Ïf¥©'^Œˆw„øv*¢c–™VsÒš b9.e“6'm ÌÙÚ™å1Ø&qnWûãýh-Ì­¶ÄMñDçºÌ+ v=þâ¯L ó³¹\¤¿©ëeÐX:ˆæü(¯“S Fá~8nÍ”Bm-z/XH-M!Zú~µN£ÔÛ&ÿðf[‚Ÿ¬×?¯ï¶#êÿÏ ùx¸- 'é½™GEßJ_»ÙzŽ ûº g÷¸A °±L>üùöýô×éËOÏ}÷êÍk3¿ñKôù¥jbR©ÉÔÅ×’J'"ŽÕ>EøŸþÌúÆ¿c¬qx ò>A×MÏ5.eAxOÕÓòƹ<;óNݹ¹‹é¾\hæ…–Í0ºŒtQÊ0Þ¦Qý ]* ÚdÑX(lšþj]w¢Y¡yØÝQQg†_>(§è.Jænà‡Kså6¿àް(£0{» c÷KÍñ2=ìo3ÁÉ”åhš_}7Hn\ŒÒÁ¢tÔaj.:Óö%%G…­³;¶<ÖŒVMlTîzT­oþ궦-¥#H: w9Êϱd ~ÌË­æºæ´ËÍa—LÚÛ«fîÌL­—¡Ý™i¶h>VÞ3wþyg»Ú%Ô Aj,Ƙun¸g‘±ÓÅÑý±¿ÌE8ï×™ùåç¹àTÁ®Žs) óÚÜl…Cź*FhÌ„6Â>j49Ño¸<Ewž,D£ÝÓüu\G:bð³ qÿ›‡®Ì£]™ÃÖÄ®IQñ²Š6Sg·×> stream xÚµ[Án%·¼ë+xL.›d“l`aÀޱ¹$€aûd±‡-F )X¯çïSÍ7E%ÁÓ‹ uú½áTM±Yœ&gÔ«†zµP[èZ‚eüéAʽIQC¹…\R(©âWË!w+!k)¡A«ó;Å/íwˆÐ~´áßõÍ1ºP$%,”,ÞK)Ù# ¥ÖáQE›³¦²>¿«¡L¢‘4Kv‡¨…š²úw=T)o„šuâAP™(’€Å# UÍJµ'G–pÐ<ª¡Zq<Ñ ©6pà"UÚ<£ÍóZd-6ÛYPMΛSЖ½]– Ýûe࣎êȹ5õss -õyTCCß‚[ñ~G«ÌGujƒ¬†/=ê¡yfÐfïŽb¡ÍÞHLO³ÛѸgq$¥—ìµ ÅÕ‘kEzÕñøÞšãyæñãQ}ÌB*‰b=ç:4¨š‘\­ó¢³äùÀØÚýšµ†Ñ&Šjžû/H­]z·i0k³] `}Ž=Œà$£_†¡¤2¥4CXÅÑ{B¨ÅOëå©ÍÞé!úTÈ’¤1¯©W„—n†>‘9ŠxD²Ì`“’=#""uvM›è¼²6i³‹1Eúð¶lbÉ4À–“xï°Å»j€-ç:O[.ÍU@•àË‚-ëðnÀ/É}^™mŽ]„`Ë–g6XîÞ¼¹»ÿ2¼Ãì°þ×áþOþ ¬Y£¡'ª´Øpàñç|÷Ùg·[ÃaÑÇé¯k‹ŒýWcCxÌš¿®µt‰‚Aû­ß>=~ oÞ„û·ˆrœõÖ»½1ºYàRqK¥ãCö#åø€¡€\ñÏ+—s@tÿÕǧï¾yøÞ…û¯¾|î¿}øåSX×ðí?ÿñ€þöpwÿ;\ÏÃã§Ÿ|"?ÿîþ뇟ž~þøÝƒ7Ïïþøðý¾xú%¼s†ɪ[~¢q¶Ÿ\. ?||Ú»Ë|ì×3§ã#PAg0Ø%ð‰ø„AfPTÊ 1è " ‘…ÈBd!²Yˆ,D" ‘…șșșșșșȅ‡ •uˆ¤…¤…¤…¤•¤•¤•¤•ȕȕȕȕȕȕÈJd%²Y‰¬DV"+‘•ÈJd%r#r#r#r#r#r#r#r#r#r#r'r'r'r'r'r'r'r'r'r'ò ò ò ò ò ò ò ò ò ò ²ÙˆlD¦‰M4h¢A šhÐDƒ&2šÈh"£‰Œ&2šÈh"£‰Œ&2šÈh"£‰Œ&2šÈh"£‰Œ&2šÈh"£‰Œ&2šÈh"£‰Œ&2šÈh"¿¡‘3‘3‘ ‘ ‘ ‘éA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£íð êèÄ@d…Ae  ƒÎ`0 ²Yˆ,D" ‘…ÈBd!²Yˆœ‰œ‰œ‰œ‰œ‰œ‰œ‰œ‰|xð¿JY$ÜÝóó_?ÍÏøáñïw÷_<}üþáã¥ÂHï½ù òÒšEw†Y¬P%j¶†ŸÏJê›pÿû§oŸ*±ßèo½þù¿É0WÄ ÉdÄÈ‹ ÓÇFJ×§‹yi^¢ÎÕ•Féý*[‘W*=z•CÎ¥p'§Žè˵V{ÄZkóË\OVöã*gn¯äì9ú\µ8GŽ‚¹â&g?©oÉɾ½ÁÙËI:K‹zYÐ_tÖS·=}Kä¤Î[œý$¹EŸsïQqiÅ=s•²¾Ve‰Óñb¤Ê—±Ê~%g± G›hDq°DfˆrÝœgÉ<(©ò¥hzýœ—°¨GÝ"2°¤®¾¤Œµä«|£ž4^Î¥q#'$ªÕX|¿SmC-ÒRÆ´wNF;'$]w’ºÈ¡˜|—kÄ>5_Ý3×y$'5îät‰¸ù{¶$ŽûнÎ%q#§Kl5V«Ñžb.m¯ÄƒsIÜÉyÌ«ª¸;6]«Nk^¯zô¤‰uqRç N©'8²̾óŠÉ’«E)ãºq’Æ ç’¸“Ó%–}÷7-#ê¸^xÔ|Òp=8—Æœ.÷ßìO.kÍ#¦Í³êÁ¸î£t}‚î,ö”xÙm¢5f¹Þ¥í¬ázp.‰;9Ò5X¢¶UºæŠ!%/”g¥’œÔyƒó„ÝÁœ±øøv–³c…ðÂó|V&Ê¥p#§+”ÕüCjœÿf“³ïS\ïГjr.‰9]bRØ_ÖÆRF)¢}kµCÊ¥p#åáF±«Ù³“€Zþç¿}/ô‘ endstream endobj 3044 0 obj << /Type /ObjStm /N 100 /First 1001 /Length 1851 /Filter /FlateDecode >> stream xÚµš»®$·†óó ­„‡UźXaÀ‰#K™àÄö†]AXz{ÿÅéæ8˜90K\˜ŒÀ <Æ6ïÃ-œg¸¥l9õX›Oxaçù:’´Ù|Ïþq+Ò4?â!Ï'˜‹p¤ŒCË'¸QšWµˆI¶Ç%ïóª õ<‹"ÃfË£ôyUZé4RëÒòªpé t¨ëT‰ÿºuË3-Ý-b¥‡§6)FÌga šC/£(Ï^õVT8ŸíTMçUe0ÐI5ËþÁªêž­`85æØi­eº#n·Á1–äv\æXi+è^^U*¦ž4åb©Cc¶sÛmˆU‹·Ù &‘Ó­/ηV¢¸xö ð>ò;\pkùä»Ï¾10LŠßìf³Ï’†)4ûbV‚§"H>gLʳ½QÂz~瘹ž³z8•ˆi- 1æx³sp^í³"Ûô·Ñc˜ŠÐqèË`8Aœ-‚OùD´2ÒWpFðŠ6$ÒAˆs´p|eš ÞDMf>Òú4TÀIšÞÚ‚—4KçLûS‹[cð“–3”FŽÐDÒ0ù‰Hó†±ùÛ§Ooï?ýþËçòþ×/_¿½½ÿøÛß¿ÍÏù×—¿½ÿñë¯ÿüükù¹!´¿½½ÿõó?¾•Ÿá5 .XûTâµeth„#á¾ʧOåýÇòþç¯?}-ï*àö]ùþû7üû?™Î5ÍH#ôºW…h´:ø!q¼ ©œ‘é?R¼¨1å½RϨ•óè¸'<å‹$Ð¥q'4EšTŘ{5¸:Ù¨âò˜×_ÕxÌÕƒ¹4nd¦D• wE^ã*9m5jp2¤I<˜KâFfJì ï÷ûTí8ºîµâÁ\72S¢Pͤ‚¨vd"¯ÈP{%Ì%q#3%2UA 'Î0GÓ'É}sÀ9 KãNè-V$Ð1jGI”Ö4އ´¸ÊoÄ%p#2õµV¥e~G“,¬6qÒ.Rx0—ÄLHŒQ]³Hʘ†ZJ!ô!Ëå}ð”·qÈ·œ £C\ôŠÚp«ºƒxªÛHBÛ¨¦±4¬„uŒHTÅBÇ0ÀX©ma*qu¸ßÉT¬Ûvò–F'T¥X"Ì!ÐFYúãaUºHâ 9nÄ-…†4•Ä’hQÝžxýUæÔ¸‘·4j«†Õœ(Æ+L”¨È™¬i<˜SãFЧš»&ù ëü†Ì›ëóŽRüI•q™Ofjü€÷jB\vd9,“E¹$¢jú¸öW:ê^Ä©pn Dåí”Îè¹^ejðV…R÷â–BdDú¯œAŠþ$Â]$ðFœúöÑN} wT‹‚0ƒ¥[]«Èc×¹áÉœ7ò–Æ0„o+Î!é£#„?)ö¯1â‰L‰qK¡ÃrGÂb_³ìº×ŠsJÜÈ[M¼å®Ñ|k4=‘Sâ>ÜR¨Ñ"£!„Ã;L¾Ÿì¹½¨0ƒŒûœúvâ–ÂnÕ#œJ–Š|k~"§Æ}¸¥P0;å.°Sm³Âr ܈[  Q•UÜ÷J<˜SãFÞҘǰ»FnáºWãÁœ7ò–ÆÖçfÔY»)5ÄðÇËSîi<˜º™× dú>PÕŒ‘?SVÏAüIAõòÂFªÜ‘Ú¸jב/§â#Š/&†õ#_3wzPe«jì1<žìûE"湑·4:|°ù]cÎ)½ùø„N‘;K¥5ÔÄ=_Àò?ä*OÄWÍ×:Uî.•JȈçfsOµ+ ‚¾šº–_žÐìÀ‡À«¢Á®ý¾ÔQçٳǸhÎLÝÌ;5ŠkeâUKJÀg#©É5†<™©q'oiḎ~ßE¤±gÈÔ/Ê"'tŠÜ \*±|”|Å.w;òe:¤1~²ë¡­ N湑·4v™ï7[Ö‚Àûüõ†¸ÈsjÜ \"…ë|W’QF™®émÏ«8ËsŠÜÈ[Gï;‚ØN²é•ªeɪ·×T÷—J"Œî}CI(·–÷ò@NûpKaò‡îÙ£*®ØlÆs*ÜÉ;5òh6±Ê†h¾×Œ'S7ó–F¤áf¹!óó0óÇ1`ØEæÔ¸‘·4Ü!·wçr'ßmGòäÇ~Q‚<™SãÿÄûdˆ¼Ž endstream endobj 3278 0 obj << /Length 2164 /Filter /FlateDecode >> stream xÚí[oãÆÇßý)ô8*eîö-»IФE $n4) šKŒ)RQŽ7Ÿ¾CQòÊÎŒ|$_’XïJ´.?þç\‡lDý6Jé(bšJ3Êtó¨›ú|÷· ¶=nâœìùîò⳯”1:MiÊF—×û/uYŒ~"_×…½ÿ÷ò›‘djª…ö/´y‚™´{øâËËû—Wœ?Gwäï>ˆ`#3Mµ–ÛÏ¡œ2!û·»²·¶êÞð³¯ÌÞa?MRNþ:ž°„=ø|ðÐsçù ^ü/žHÂ4ïŸz€ÜÛ†7•°=â¿4e¢Î*Ó8Z‘*"ÅæbÙ±ä=Ëwö·ÒºñDHAòµ»ó”ØUl: °†Ò›'¬3@t™µù<óñ[*ÜŽ{•%*E˜äÇal]™Õ³Ê†ÍÒœ¯$JÞ u/‰¿­«¬ bfà Qˆ,¥@;,ƒL¹ÀuüŬœ*’@”µü_a]yмe³*Û² ×{äâ.1¾øâÀÔ ý¸®VpÇÖØ ƒdÂŽbÓFžèÁd¼•9Fÿ<´è5ú·ocMlÅ`JbpûŒ¢­HW0ü/›xà:˜³ûÕŒ4›dmSÙ¬†¦o™Jξ¸+ÄyÛ­º¾‹fj¸ÑoÙ(ñIVµ_è¤#7”/Ñ™:Sp¦ÿ.-ÆìOD™ÒÏõ˜‘º(ëY¯ž;QõÝ…É ›f„J‰]]×Å uõt]UjR~&e¢|w°ßC‰xÛ‘!Šÿ¥—V&ë ‹ÀÆi/Þþ($I'Äe¹Å€îe:XA¯œÍ°„ÿÒ‘4$…Ñ_6eÝ®0ƒÉ t©]™wžsÐlS´ÚgMFq"Ãi ×ÜlFv¶ùŸì® {„;»¸ tæË}Ð'À܉îz:Û§ÑQ£Ð,»lE'z]VEþ!Oð°Ä g¶•ð•ß­Û¶©' '~Ž™ø1L–#Ù#»Ë ýð]VÖWͯ˜ e‚!ù‰{¦3Á‡3Á;š†˜œ ©y÷ä„N¥f# LÅŽéûöþ0ÿ›\%{ôVÛ¶õz<:A/vxËå€ÅûÏ¿ƒ¦Hø޲ì†5äÓ’žg ë2LBŸž„î£Í:ÏV± „D>]Vxª‰Œ}çW®ÅN¢Wé$‚Œ"çNÝ¿ÁÔ½2…·%öÔ½á•À¹œ¦¾¦þ§¸? ±Á™#ÇeöPýQ3±õ%£”qXÿøa}N÷ÍvÊÞ¥«çÖÿ0¤O]‡ÍZ#\ Žû€óAqà£9ÏËÚ®ìÁÍò“S×ÉïaíÈçMfÚq¼vð?š7îÌôïÌ´w*\¤¸ƒÆ¼ñ ›(qNé`´ÙkÓaÖuúê]¯™>ï¼ÊܵËa ŠÕIÅIj‚>Ä7×l)Šæ3ª;ŠÃœŠ*[,m8¢8¢v7ªƒÙë}¾‘:L‘î3„Y02o›¹ƒƒ(¦/ÒÝg„o¹fêîuwÓ a)À+þÇÂÕäùõaÿ¼Ö?oQâD‰ŒähödX‚ _l‘HSq|npex••AB®„¦ÊÚ²]§7Ĩ˘ŒM=Å&â>*”‹è ¯ñ&ºË™¨d¬³Å·MÞ‰u¨[ëQ€óÑ£[fí§‰bûqQ° ~og ™Ìâ49çû÷Ð#@UvµÂ[#sk$(Ù–8^¦Ä#¾Xdg`1R8zVE<)z²²ËÌe­-&·c•¬ZÛÞMX4›QÂÞê1}¾o²8{ó2áÖ“î[ÖŤ*ëí+ë® ¥µî:2çÎMúÉEãþ0fXô4?Ð,»}Uë…ø„&˜·ì]f4±ïnë®á¨ÝÞínÓˆä >ô|±³ÉK]¯4®ËÌ;HEé옑¯ž»^f( Øˆ-3¨“± œ2Pu¨©ÁêЫT‡¸G¦õªuë> stream xÚµ›Ík%ÇÅ÷ú+joêÕ½uë ƒAÙ$0xf‘ÄÌb2ÆÄHA£ç¿Ï¹õú”0; b­»FN¡o‚”%Ô&^?YQí:K9Ô1ï$[hɼ–s Mª×‚6E©…–‡!Nn%¹žùíLÃÑ–ý ÃÑs­@ªê%ÄëiÖm‘Ð¥»Néøé¥º‰ë ½d…š¸WsåRCoe^ÑBï3oé¡>¯ÞYüþj Cg¶Š”½Ż™ßAÍa”2Zµzk àhÍ•k £¯+t(Ii†«èBèóšá=qƃ¿ ~\³ Š6¬yW-³7ôU\à—¡%uIðjè­iè<ÝUÒ쇨X™UŽÚÑêÆ¸%ôöY]èI~Ü!.R硯‹´ygÝÉèóκc7Š×^‡›zfá¦2S¢‰êð{èpS›=¢ÄOpÓ:Åp–h3wCí³‘Jt4×uÈýâ›7onNþûŸ»púîþþáéæôþ뿞æïýåþß7§ïº{ ?&Œ éãÍ釻ÏOáÇ,*PKÓ¸_­[œö]xó&œÞ‡Ó_><„ÓÛð'•o·ßÞà¿?fYD#zæ²,Àd§ßŠh=fôû\5zãk±XZ¿è9^±ÅŒö¢åŒ¸Ïn%Ì5‹sìÉçXÊeˬWjÅÃsFÜè·2j‰Šù#tÄ„‚.zŠ])ãá93nô[ñït{Š>ý¨j4±Ëžåµ ™z €4!w®”ɢݓGCJ‘ØM÷¶äá9CnôcF¬s¢¯+jl˜ª4IÔ&{Ûñl9î´[ ;xðÕÑyâ‘bck#ÒÒ3îô[›bÇ\0ªc½ À“òæfÄo笘ç/;½{|øüþõNïÞÞ†Ó‡»ßžÂÇßWç»O?ßÝœþ ×»û§/!ûóB\ï5øåáëãç»ù·zþÛßî~úåÓ÷¿ë¹Š¢f}rz÷éWûó±|>q6Òχv~?ó™ÝQ”…Ì‚±PX¨,4úQ02²uˆ¦…¦…¦…¦…¦…¦…¦…ʅʅʅʕʕʕʕʕʕʕʕʕʕÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊʃʃʃʃʃʃʃʃʃÊãP–”X”…Ì‚±PX¨,4: T* •…ÊBe¡²PY¨,T* ••ÊJe¥²RY©¬TV*+••Ê„H‘"!DBˆ„ !B$„H‘¿‚8ŒÊFe£²QÙ¨lT&ƒB… 2(dPÈ A!ƒB… 2(dPÈ A!ƒB… 2(dPÈ A!ƒB… 2(dPÈ A!ƒB… 2(dPÈ A!ƒB… 2(dPÈ A!ƒB… 2(dPÉ ’A%ƒJ• *T2¨dPÉ ’A%ƒJ• *T2¨dPÉ ’A%ƒJ• *T2¨dPÉ ’A%ƒJ• *T2¨dPÉ ’A%ƒJ• *T2¨dPÉ ’A%ƒJ• *T2¨dPÉ ’A%ƒJ• *T2¨dPÉ ’A%ƒJ• *T2¨ƒÿø]ºv‹>¤aLŽ•XûˆC./á€ÿëŒXKEïÀ4ÕÑâ|í¸ÓÔCbï]|[¬1cxªX°f»ü¸Ñòk#b» ¶Ë•p£¥Ä^fø8CƒÑZGÄÄyy›q­„‡çЏÑÓ#– ÃfÉèo‹kÁîq¼°ç·kuÔÃteÜiê!±gë¾3ñ§o˜«µXµny˜®;MgHÚ_çST(~‡o±Ý!Ϧ+äNS©)6LÚcDÃÄŠúŒÖuË6|yX®ˆ==a¶¿ôçf”‚A\öF<cáÝMºŒ‡éʸÓÔCš]4ÐUý#üŠba’²+e<> stream xÚµš½Ž%·…óy †VÂ!‹UÅ"° ÀG–2Á‰í »‚° ôö>‡·›ã ïÀð4Á {îm~<,Ö»ÙʰTR+ÃS­žD‚ üRec$5K­–’¬W6jò6$u~¯––F-lhÂû Z†Ûàÿз˜³ÕSm."UÎÖHÕûGµÞQkªQgKRMÙjIŠÎïi’êŒjlçHª'i1ï€+K$^ÉEWø*%IÌ^¤&Æ:( iøóS\¶B†àR+?te= ns%—v#Wð+¦6~ei­&åü¡%I¥²çÖ’6™-MªZÀhÆ)ž÷zRwŽªõ¤½Ï^"i ŽÓ i¼Wa J@«&“Ʊ`@Ö”whK¦sÆaA³ND›wŽEvT¤=ÙÃn¸ÍË”¯#9á­ZI.:[0xs~j’\;G`-9nfK“÷ÒÀÀ2ñ‡Ý÷Ñæ§=õ¢‹EêuÎ8&¬Kg^Rosƽ¦n…w8V•Wê²÷Ù‹kꡆÖÜìÅ=EyôÒS<ìæ‘¢Ά:g¼—»Á<áÊþ°h¢ÏBÎ1c Ä=-OC¦õ{Oãa7eÀnl4v‹’†;û‹šFï¼.2bÎs4xÅÃpAå^æBƒ¯´ù¸HyØN/òÙ)œ¤Ø\XÚð£9ÝnR¢ð¿¸†ÿÌe0à(è‚#4 ‡UòöòéÓËëO¿ÿò9½þðåË×o/¯?þö÷oóú/ÿúòï—×?~ýõŸŸM?Dƒò·—׿~þÇ·ô³DËÂa÷ž f–Ñs™ ½åÖßû!}ú”^L¯þúÓ×ôú§ô ó»ôý÷/øùÿ Ðçʃ’›äÆYí’»ïÁ-siÜȤDóŒ•OËs »dù§q“Äs)ÜɤDÕÌü‚Гë³™äâvɳöQ‰=ýô`.™”Ø Ñ¹& ³¥ÖŒ$u=¥¦7™ñ€.;¡)šv¨oHVf¦¸n#B¡¨GQ+fC*”¹[\ÂÚMç@žòv")00«å¿F „_g)±›Ì%q#“}ä@”Aa›ûýêµC„Ýã„'sIÜ +"8+Ax; >Dó¬£^òÔo2ãÁ\72)Ñ â7*Q$«ÀîÀ<ê“bCnJ'tiÜ ¥È†¼Ñ¹©EaEžzFÿdÝÜ%ò€.‘;¡),þû*UmÒ¯C\¿i±Ì¥q#“QÙ ÚXG (>°;|2¥å&;Ð¥q'”"K Žû›ÈªˆãºYä]"wB¹3'𮣔†H.{kÕºDî„R$¼D\–GbÇ ÀfóÔ¸“I‰Z2þð¯Fö'e£Œ{bÎ\7")°qc*|Ö“ù’¶|æå.Ì%q#“¥¢ÂXÛFÆl´ölm–Äs)ÜɤÄZP`Ä,äfެŽä:O…Ü´NæÒ¸‘9Ÿ5”|>9d>†Ä‚½~ÚÐoÚTÌ%q#cäÎG¾=ñ0˜òÚï-îÑwOy‰P×<£-ûsÖ­æ;ˆ§¼Ä†rbt¾ŽBåk"E¨| Um{üÞ0“|pB á{+p©ìØõómÕ©ý$A}°’²*Ø|Û"N‰ÛhKŸK|¨,y=0Á¶e‹ºÌ©p#oi4É‚ý0Â[¸ÌpÛ«ñ`NyK£ÖìÑÞÖ©ö¬¾',sjÜÈ[[Eí=S·p¾E)5öJ| §Â¸¥µ·òEëiEÁŠm×ûÓ&7I<˜SãFž"®2°3”—šåcÐ\-ûïø03"wê:˜V$›Ú»ÌúápæªÊ¼t¹gõª©y,!°«êŠX.×.9âžÅs"§Æ}¸¥ötvhÌ‘¼æ®¾5’ŸÌ™“7ò–Æî˜FÖU=2á'}×–ñ\«'Ôv—J·¬ endstream endobj 3516 0 obj << /Length 2187 /Filter /FlateDecode >> stream xÚíËsÛ6Çïþ+t„fjo{kkg·é´ÓøÔÇ&!…»©)Åþï ¾dÅhH±º‰ˆÉAŽDËöG_üÞÑ šh&á,"d!©˜%ë+Ø>«W³î‹ßþ}…úë®Í…×W~wõí;Æf.$”hv·<|«»töø±HÕÃü¯»Ÿf±'ܼQû’°yúêönÿö cÏߣ¹òÅ/‚gb!9§ý¯Á] B»Ÿ–貪>Äu2Ç|h~ð·ïÄÁõ\cŠÀ¿æ×(ÂÝúäÁúä…}C …bhÔ½BÐÁKFæCg4êñV;S$ÄÄ™¾Å‡@Ìë¾þ!üp÷{øÎù!pî±¶÷™16e]Y?‹HL•¾)EØb`ªs«ÉF((ÛÅVR€é7ókB1@Dú(Wçï7*É–™Ò6ÜÒ‰A¤"žè´*ê<[}¨­ä¼d…ÚÈI£:мÑmT쥽¤~ö²eªËÿª¤ÎJ;Z"/Ip##8á%¸²‘!>r?i!Ž# Ì‹mn÷‚qU—ëÆ÷Ïx0o²ªsFõ ð¸™_›UJó«giª±Œ‚M¼Ä¶6Øbý¿î?ºÜÖYaU-Ââ-ÿ’ÿßú5.¡è55ÕK–4 êÑäe+¤$nìœUMXʯ{¡QÑ(ÆË´Õ! Jut(ÕÑ¡òD¥·}ÓªH!àÄì…öÀn©´ViG85T7M²¸É³?fÅÊJމ‹ÊÕ(Œ÷“Ügñ­´rµ EH͘÷‹6">ÁI¶IóBB<.dN¼(§*WöªO kS1£€Ã}÷ÃnE«DgçŒËqáÔDKpÍÝe‰Úd*oËvõ’‹”Ÿ‰¦©Ï²ÎâUYÄöUÊCåv¤ÕI/¾ë²Híµ[^Ââ>9M¶\n+øžÀ×gĵçëq¥2tÊŒµ%Ø—æZ•ÃáãIôr¬3bˆ!V^3þä‚«<‚!+ÂQ ‹aІ“IÌ^õÎt?MÝ^^õÍð$û"ê(u zñ^œH°½Ø+õ£Õì]ŒÐÎæ`°à€ ¯¥<ºoQνÄLK|† ÇÚ8—P9¹B|Ú®YµÉãG»ó‘Áø¹{‰õ`mM×1¦÷íJüyMÜüò^iŒËÉÆeÔŠ=åB} ”ÏDyoVìƒ (šª €¹ Ÿ×MYÿëUfÏjÑñ˼ƒù ; dI¨¾ŒW_|æö4Ãñ^;­­1]ÈÍ84?'KÂ8¢cqT¡tïœê°/äLûBöŒ·÷¹êGWÔe3»Ò̳˜¯‡‘=:Ë"¾ˆXá¨r —QþM !É\%jMmånLz,\´×ô£I/C5ºjÓѰ ”zØÂRÄè…›»ó†ž$ll0€=)Ú^’ ®èxWÄ"«é=p3í IÊõ:.ÒÊ^`¼Ì¶–± ÔÏÀæŽcDÂœÊøœÊèxêßZ+;_$BÛZ7ȃì.ÛT£é{¨aŸÔ»%0Oü¿lœ'ìLt¿HĽÐU»Õúˆ‘õ©¯ƒ!ØprÙŸ·ymrõ.Ëóëœ}uê¢Ñ°õÒ‹ÁÈÒ¼¸S­­þ™>IÆrfK{d‹Ä¼cvûò-º‹š[¢þÀ–Û4«÷åº;b,ué‹OzáRã‚£×¥z›…Vô?Њ݆Ò*Ï?s.Ÿ1çBl©h˵ΒÎj,·E3-8GÀa™Q4Vô¦]•¡\õÙå*ìæ«uœ„,ë×¾¡Pûü).á¥Ù°5ãm·f<'k¾ ýŸ­O4UEðQ£>ŠÇu¼ø‚c?Z™uÈíÏí±OºØ©¼Ü„×Sø"k‹»h†­w™.‹áÀ÷ndk7gˆu߻ư ¼¨:²À>““ª\Ú! uO[j‚tÙÏúŒÄ©2Äßžø,ZÈ"›ûõýñ÷% ¤Û®2nl¿±Ëº³PéØ1Cét{Nƒ<ñpoD6œYÏØëåi¥—á6©ç¼Mª×¬—^&¡¨u–¢–~]Ú,„> stream xÚµ›_‹$·ÅßçSè1yQëêÞ«?°ì˜ÍK‹í‡$f{&f'¬×à|ûœ«®Sƒ¡{ž*0kMWÕ9:’~*•ºZez*Ie¶$Ò¢ÐS­# øÇ, 3™ãP-%y¯QÔ†E¡¦?PÐ4e}bIJ(9míê#J=‰ö¥‘ÄÆRI<̪”$]4J’dÔГšdZ\Ð =UiâQÙu´¥ª3ô¼,½‘j«Ko¦Ú5ŽÖ’êð¨r•Tg ÑÒg”4ò†^˜kið¨ŽvЫp]Wô¤Í–ô£Çg 9ÃC%™”¸Bk²°DI“éRÁ?f^à¡M*¨¤µnÚ“õ«ÊH6Ñt(ÍäE¢¦h\†’$¯GÑØ®KÅ4¹õuÔ’ûx˜£÷Ê:Ú’«JO>5ÿðáéÓÃåë_þùiýý—?üûáòÅÓÇ?¦o æ†òþáòÕã÷ŸÒ·*–'ÅêÌ0˜æ@ÐÔ3ÐÄyŸ§7oÒåëtùóÓ7Oéòeúƒ•?¦Ï>{À¿ÏÓ¥ftüîéhŠ3ýöŒ2òˆMGŽÙĪeŸõ¦§ƒ2nž+ã‰~{ÆÒ²OLGyÄ´„Ï­ö›žã¨~Üß9°±f§Þ9h_°“~TÆê|ΈŠ`q|{ýxPFZ®gËûvrxPÈ=àck9<]vJÆmV¥ed<ÑnOر:Žç§X­–HÜr»GãA³*=WÄýž3–ÛqOŽgY<Øå"·gò¦Ge¼z®Œ'úí1B[ì„è ÏæN'áAiêg–ÂÂŧœê†ÆîçÜ:˜‘ž‘ñ?~POâÙX§?÷¤*rg2õpeÊÍÔÏ6ÜSÖŽ¦ÄÝßknèÙX¶6¹3zÊA!7ÏòLCWñëî ‡k­yÚ¸=\êHzFÆüDçAY iëá*¶Ø*&@ÕÛúk=÷Éuó\!OôcF™Ž†´g$‹ä^ïLèméÐÓOöÛ3޳±Û^òˆ-Ø)YäÜû=#ã™~{Æ b¿+ÖÊȈ¬Óîí"Ô›çÊx¢ßžÇÛïÛ‚NÚÌcØ©ô\OôÛ3ºf›×GÇûóX‡Ô~{ðôƒtô\OôÛ3ZE;>G´‘›s#^-WÂíö„Zs|s´T¬AÊ:‹¸y®Œ'úí+äØ^Ýî‚%ˆéí}²neÜ<ýd¿=cÁïóØÒò¸³mýêY•wŽÍse<Ñ'pX;×3Ç—õRðÔê~nÆÍsE<ÓÏð8nXà€l6:nŽ#aýáóö<^û!ëãÍËã— jR:¢I_p9ˆ Œ–x‡ƒ;ÖŸŽÛwyÐjcsŒ€ÿ·Û—¨pEã”ôUºüíïÿH³¤^KúðËO?½é$i˜\0ÑüæÄ·O>-÷‹Ÿëo5nÚö¿ð”0´lÄí£o; ˆU†ÜåÝǧï¿~D¼ty÷åÛtùæñ×Oéýo[éÝwÿz|¸ü ®>ý¯-¬ë£a~~úåã÷ë3»~ö×Ç~üî‹§_¯Íפ¢Ábæx÷ÝG\4^wX'®¶ÿÆë凨Ïzõa+4: ƒ…¹zaAX¨,( TîT> stream xÚµš±®d· †ûû*ãFW¤HŠH“*vg¤I²…a`×0ÖEÞ>?5Gº)f¦ÈH€1Öì=ç|çI‰¤¦ro©¤ÊݑƠ'®ø—Zð!JbNÚ,5YçHòâ1ÐÔy\l‰Jµ7ŒZŒÉž ÝOuSí¸˜Sèf·M:KžÊ‡N 6ßÏ>véœÌ©ó ³½ž¹r÷ÜJd® lEÂ%MŽà¦ÄÉ\O2/S²{–(Z/S2ò®Î÷ÝÇ6e>‹yé|Æl¯ošÑ­rõ‘ŸSAñêšìÑ{Ь‰\ Ï!C ö«bÈ Ló8¿AÖ啬uuÏ;¡KâIhˆTËíÔ¯Sk’ùAë¡õMŽz1—ƃÌ(-ÇéµäD§·ÕNc›’»‹¹žd†ÄþЈtúƒ\Rh“Æ ºDž„†HF(´þ*#±G ˆm"/èy:w’q°v˜µôûY–ïÚ=&s }Æ|U'’)á8%°°²ÖšKFe}Ð5³=GJ y;RzFä¶çHi!¯#¥§Lßs¤´˜×‘Ò3f•M¡2™Óƒž0w)Q¯q"IFÈÌA§,:u›É ¸ô#†:Ä~ÉG7~>A½ä^î'ê›^Ì©ð$3$b¹£j«íB­×ΜµN‰sI<È ‰†5ÀimÌd=×û‹jÝÔ†˜È¥ð2*¢OþG :Þâ¾ËÈž*`"—ÀsÈ(<œ³w$;НžÙΞBLäx +!êû‡ ‘_5ò³+ÍÅ\2C"S¿FšQí> stream xÚµš±Ž7 †û{ •I£I‘’€ƒÒ¤ŠÝi’¸øÃ)òöùÉÉ.vAvðÜÌŽ>ý"E‘ÒˆŒ–J=±_ŒÄܓԂÛUü‚RUó NÚØ/$Y¯~QSà ¸Ð4È_(–¨°=᪡E‰–Ð6k¼8‰y£ø1Õæ¯%ÒáOÁ§†×p%‰:ù»T Q¿ÒÄ¥Æ=KL&`PCg›÷ ?f¹´Z¼w\“_Qâ&q÷ê\–Äüό%Za€¨;ƒñ§gp»tWx o «Nó?›úPo1hx0º÷Y$A³· 8záÊ!¿ˆ{–j­ †4 ±Æ=U‹A–‘j‹VjIu×Q)i‰VWònTØH¹ÆÓšT¢/U“Ö÷,©v·GmImÄÓž´S´<†ÞïiIVª«TJFao˜Ì8ú¢0¸„ŵ&Óp t׌â©%t¹¡ Ž6G7lh¼1R+æía°uÃ(5þÔ85w\IjÊq^eÕ¦©µð4кu0¬Áçz<í©—áæ±‘:‡ÿÁ]ÜŒ.¿ûÀâŠS×h¥IêfÎh5õþ×4õ>â]K££5¸3yŸ[Oƒ%ÞiHŒàÃ¥âŠÒPs½5 ݯ$ˤÀ€ã 3R)áIÝ'U÷¬Þ|®„ÙásT$¼§cŽoY`t\j(˜%¥o^N¥ÇH Ì“2Ä;ŠÑ$üØ{0@Cïã®ù´îüôòòôüþŸ¿>¤ç·?¾~~z~÷÷¯ŸãïÿøøçÓów¯Ÿ~ÿð)ý\ Ê/OÏ?}øísú.–ÝaòÜ`HÅô1íÆÃoÞ¦——ôü.=ÿðúþ5=Ÿ¾Ññmzóæ ÿþÃ}aýÌ9 QvŸµÚr“v•IõAæ,_Z8+æÏ]d{ ©¥g‚-¦ë]‰üP¨æ aB9b™HîÅÿnáõº-åA‘ÓwfˆÜÈ[¹äîSFbl-[íבí$‰d(܈[ á>ê±fp6,¸F–UeËìXfhÜÈ›u pw1;‹fµ«Äaç(œÄP¸·ö‘Ù—Ê‹@š ]Gb½8'ÞL¦KÜ \"›å晋À{Ч5c9¾>;5cËžNdh܇[ Í2y.Ðå|…l’‘QÝX6ì$;ÐиXGËÃF5òι8ªaÍìu‹§Æ‰twpk\–¬˜H$‘°g"ïç[Ì^Ny0CäFÞÒ(5«gÇÝ,¬É•3Š ÍÞz@CäNàT‰l:wÁÔ`”È‚o®É휨3‘®q#n)löCÔ኉2²c²¨^Gž”ÇMfHÜÈ[ C¥âM1-é*RÎ’xAêfÜR¨-—곑rÂÿö’|šfhÜÈ[kÏ슣jÍ…¯çެ'i<˜¡q#oiDUóu–SQz`¶l72$îÃ-…Ü.YÎT(Œ¼@o$|κ1¡¡q'p©D]ã)Ç‘’WfŒõõ@zR0™!r'p‰,˜¾Ù‰Ò·Ö*!øÔ[û'*w§J’Õ·í¦ÃÊRnl<”sÂÎd†È¼¥ÕÍð}ÂÃ’2b“në6ÀdºÆ¼¥±¡‚óýÍ£¼òÄ•éFГÏ„†ÈÀ¥õMk³Cl ™¤½†<¡q#oIT”p~zƒüC|W^QeqÛlÈ"w—J”7=Ξ.›€û®Ù^K̹‘·4b)Žã«K^î¶ÈØlÈ Swó–F¹ù Ë ;HEê¸Nڜ̹‘·4ú>‡É–ã¬‰ÈØX/ÈP¸÷EaÉæ§›Gí!År-×ëí'Yñ`†Æ¼©‘;¦C,—¸ÊCs7¾1°çhœL׸“·4¶–µÂ}Œ³ŸQs×,Ô÷úꄆÈÀ¥ÒP™Y1‡‘…´V÷Zò`†È¼¥QíO ÃVóâüÒ(¹ò¦XsÄÓƒy÷hŸ¯6ÔnJ‰ð¿(æ!’_«(ÎZ®ÏýG?±ê‚äí+äÀÿþÕæ$“\õ`NW½Ç> stream xÚí]KsÛ6¾ûWèHÍÔ Þ{ì4NÚIÛ™ÆiI [œò¡©ØÎ¯/(вl¬Hi"îäH¢ù°Üýv÷[Oùƒ'š„”Î"&'Iq†VÏêëI÷?_áõuçæÂó­+º<{qÁù£Y„"<¹¼Úþ¨Ëtò>ø¥LÕíôŸË_' ó™ Â|Ðêáöé³——›ç„xþŽöÊ'?„≜EB°õï’Í0eÝשÛEÖ~ß‹ ¹uÕûsÂPðãô‡¸û‹EÆSy|SéÌdþYéŸ= ¹˜J¨´Ò±Õ”…o±W"ƒ¢îÊ".ÒìAiöÀ÷ÊZsìú™o°Ù¸y=ô¨~^\\þm_ ¹§Ƴ{Ü YnÏœ0Àîš,à²Oþ%ßML.²<B~BΩ—‘üÇ{ø˜ÖúÖñ ´¹žßæâÄϼSÀw/|±_ŒÌ«eSgö"#f_»ömÒ>"¼ÑÔKëk´VF=Š ßænøÍÛ–)döÈD}Õ;ôÃ:¶s7"ð³åዲ®›d 2¤=<>ø6úî0/àoUZ'qž•×ö&&µƒ  8ö yUiCüµÃ€óê&™ÇÚQ­fcEÖZï4é‡ð©ýçËzn uH€Ëu¬ŒîKž<ò@¹¨R(¹Q‚ððªœ>b÷aÙ³?k’l¾ÎP:Šázu*“j¥ÖM§8pÐ BÐÈ•|$¤klƒl“TEÛl¨³mêlŒ{x`ƒf}†:Ð>u6/|5hŽ©! ~‹PÄö˜Ç(ĵNƒ¢¾e:›^6()­¯§ï& ‘ÌÃnu\(Ȩ›QŠÙ{Ž¡U=/UŽ £öʨ™OF­«r½£äz>¾äB¦÷W¦nÀ¤ýLZZ£ß²Lšv¾m•Ö¥íèe’Ç:nŸs SÈ“r  "ÚL=o‡ªSWª‹ÃÑØR™Xï”Î?Í…XÛÌ8y]vDCÅÚ–ã‹N+›ß3Ê.ä£Y±Áx܃j¬Nùú1ópm;b©}ä"ó%wuT#rÌ=Âfã Ŭ_–W޹ÇÕØ#ÆkgrE<˜TÁ²²MɉX/O¼¬kí(ÛÂÜÝàÜÝ0²×ª*T£ï ˆûü"nàË{|›ä$R×o̼ÛÁ écÞMVZË·R€s~N<%Bõå·_Ä™EåÞŠJO”µŠA·zt”ëF;+@;¬´cÙû°h€]¸FCÙdŸXiæ¥Édä‹À£À‡uäÕÇ8¿ÑYc·oŠÆÒfæVæ}iI èþX8ëu„áÑ„(ÂÌØkðÖ=uƒÞ$œE!¶4ù÷wöú Þ&™êdeÙ„YÒ}è›ì£ŽÉ"ßymAzfÀÕRÇËÔYË ?ªlnBú+§ÆÆØð9ûRf é–[2ÐÁ|<-±Á ¶ñ[X%øðžçÝü¡ Cˆy"Níù¨°wx!Ì}QÎìÅSkóî»ï%zÈ™ž$ŸŠÝŽ×4XÖ­CwÖÛ_›'”¾2ß´bûn‹D²ïͲVž"‘§¡ÝdÍ赊Ó<.Ðk~N¯y`Ôzãxæ*»žƒ`ú@‚éï¶å¹Ê#Üî×±{/{µ˜ÉƮ֪¨ZæùijðwÒMä÷Ê1<Šq žº©®u\ÀÁGBWÈÚEÁ 2ÚˆŒÄ½ÈHzcÚÆMké™>Cd|ôxµeGè¡+~]Uÿ¶ùL(ïqøq^ãK¡%âÕñ N¯+}®ÊÆ9úت»Œ>h^þö†ƒŽã@:æ“5Eþ)S7Ê>ÇBp·¶ ì™G ´Av¨M£“êé¼5¾6dvw ¥µºìmï4:ê:{yyön[ endstream endobj 3520 0 obj << /Type /ObjStm /N 100 /First 1011 /Length 2490 /Filter /FlateDecode >> stream xÚµ[ÁŽ·½ïWð˜\8d‘¬"Á€A¹$€`ùÇÐA‘c7V€ó÷yÕÛk3ÃÓ„wºû=>²YÅž-uXH¡ÔÑCÎÍ#ˆh(-ùÇÉ9ÔÖ¼!¡év©µF¶`½3 ]Ú9tÕ;\¨ad ÅJ9᪡¤g@€å¶ᇘxËB)}kuï…y êZÆc&Å[€ê¥:nÍñr 5©sºšÍŸ UÐ5´pµ:y“ !âO ¯UËvŸ†jÕµˆ…Ú7yÒ:ÐÁ!# ®½¤t瀘†N{ ãQ‹s”ZkÎQª‘£”šuïsÑÐúØ®ZÐäbÓ, e•â-Õ‘kZÕŸ¨´Ùvƒ®Ã{PkÐîÓÓj øh»Oƒ¥²}†9ÉÏ(˜i®­˜ß‡³Ú¯å`茷3èÃÙZÁŠ+‚ÅÇSßÓ6ÿ˜²žukù|÷íÙz®£Ð·InšL “Òm›}•Ð{õqÑúØf G2ï3@GîÛ³†l#®FÝF\{˜FpèC·ÂcÚ_µFW׋@˜7oD]Ú†ªs4FÄâF¦hÖMÂ%§¶ ij9éÀïœl ÈžÐìÃq!9ç´ 8.åœÅÃ$£U½3ÐsÙú…AιnëêæÚzÖÁ–uëYwËahÁÖÁ–‡øcl’¶ØÄdgÉ[X °Á–®b€MÊX€ï†!Ë¢[h °ÁTؤ?ƒMFíw¯^ݾûßïÃé뇇ǧ»Ó»/ÿzÚ~ÿÛOÿ¹;}óøéÇûOᇄu!½¿;}{ÿñ)üCÄ =z\Á¯17e-wÜöuxõ*œÞ…Ó_¿{ §×áOYþ¾úêÿþ% £HJXú]-·ÑU+±#Dz a\{‰ 30ZÄrq–±äAe"dÄúÝÑW³õÇ4õè $)Á~®·ÛèJ®qÀ fÑãQ†öLJ=Ÿe´rLÌ<º¼ßMöÝmXµRø6œþñý?±6aùLááËÏ?¿¿v  ôú | 6µßÜýæñáiëÞ¬CÙžŸzƒx÷µåù—`ä´ÿ⻪¯5û%ܨ¼rÙöéí§Çïî10áôöõ›púîþ—§ðþ·ãûöÿïïNAîž>ûž-þ¼éçÇ/Ÿ>ÞoŸ¥çÏþ~ÿãO¾yüåyà±…a›ŒîÛŸð´ïðåùÆmÖ>ƒxÛù½?ÛÆ¿7” c£³1öFNld6„²7„—„—d^"©TH*$’ I I ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘+‘+‘+‘+‘+‘+‘+‘+‘+‘+‘‘‘‘‘‘‘‘‘‘‘•ÈJd%²Y‰¬DV"+‘•ÈJd#²ÙˆlD6"‘ÈFd#²¹¹¹¹¹¹¹¹¹¹yyyyyyyyyyìÈš™ a£°QÙhl(ÆFgƒÈ4‘ÒDJ)M¤™È™È™È™È™È™ÈBdzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£´Ýƒïÿxâ„‚!D f*f¸Bü̆>Ž\ÎæO¢·%kÒ-v ÁäD‘° \å¼1F!ÞcÅì HŠn8Äm¼PSt9HáN9®£tšâÀ’‹1ˆKX?öq>Ãïå ;å¸ÓVDHõ ¼DϾ°€F»1v”ÄsJ\ÈéˈÑ™uD?|Àî«ôµwÎ)q!§K”«ŸÄ‰Åמ¢Qª¯îrâÎ9%®ä„ Š/0ÙâÀ>%¨J=«E:[®çÏn^SKlO““:¯pætÀ\&ÔöI^U”»v¡îÎI¹“N‘+I!©{õ›%2=$å1]žÜÒ1"I:E.%ÝÓTFÑQ1 @…Ë¥ðÉÇXsrîB¯q°ú Xy{=­Êé°[Ž4–.°äœrºDÑXüà—±ÐfÓ ¡s)I:5®$u‘¹E¯€¸‹4A®U׿äœrºDX~x¨bQ”I-ç˜Ûù}ùV…C°åçI9®£ÜŽP%ú;.¬u ׺3)¨$¥Ä¥¤.¼UýTÙßO¢Ì‘KAÓ TrN 9]"¶?>æ‚S­#ë8ÏvLœ’q \Ǹgs¥Ž´6³¹ª¨ìü~ÜúA¡JNª¼ÂyóKŸÇ–‘s´—yD­“êù­¸´¦’sj\ÈékŠíסZ±må ¹£$qçœrºDH¨^:jA p)Rª¯È9%.ät‰€ê‹D©±_šÃfqçœrºDh)%äšQÜ€»Çê8Ý)§Â…œPX@ó«)LHûmÍ;~ |fœò2º¼Žøð¯¡ì ¶.­m© ÉI‰K9÷š±XEâ?KÆÒsYΟ⎃dî”Ty…ÒˆSm±Îµ2â Qcñ™qÊ[È8¶¯ŽE_4ãIG½3å £rN‰ 9]b-¨jêÜôKÅnu!`r=è(ޤSãJRYH%TýÈ.jß¾W‰ºæü!C;è솜SãBN—Víóü¿HGY£Kk~rN‰ 9]" n+/ǵ»ðº!ëA%1I§Æ¥¤û¾!¨»Åß:pãHŠâf,*¨ž'srRè5ÎqódÊ@ý¦/q2µÍÚx%'%.åäT¢&¶‘çTŠéêùı¶ƒt’“:¯qÞ¾º Jïäïåjþ2±Ú¾„nJÜ9§Ä…œ.±u8ƒ‡hA}ck'q§œ rºÂj(pÚLu¤8u­ÄsJ\Èé‹FÿO¥b¹ðnLŽ’¸sN‰+9÷ã8×§ó8N‰è…È)½’›œÔy…3Û†Ì-æ¢[ºÓÙ²dä¶å^¹“N‘+I]$•øÌé$'ì!çƒçöw«{ÀîœSãBNÿÃŽQ¢X{J—‘„Ôzá'êA)ÝÎI…K9]"vþ᡺g:ÙÿÆ!_ø"P=fÉ95þ.ÎÿÌëî endstream endobj 3734 0 obj << /Type /ObjStm /N 100 /First 1001 /Length 1848 /Filter /FlateDecode >> stream xÚµšM‹%5†÷ý+²ÔM:ç+ÉAܸr܉u"̈Œ ÿ½ï9·*ƒpo v†é꺷óä9ù:I•˜{iEzk…ˆã‚ ³Ç~“¼¢¦q¡ÅºÅ…•>).zž>Š·üÎ,Ô¸=áÊQ¢tÜ#”Í:⊠nI\q!y%…lˆ´Ðh +4)ÿ¢rÉïÂMóÓY˜z0ÈQÙÕæVXfüC@}ÆŽBq%_‹º°žša…=½âƒ6BƒQÍü°O0"Jñ©à?ËR$ä%‚/‹úE%gòÿù#±¢-„@(·¨ŸŒ¢ÂíV€ªˆ3BŸj+Ú3BJEÇ_TW§R¥XË8+Ú‚(j€s^õb’BQ¦–÷f1 †:ZoFí­›-Ê3*æ!ゆÎ{R´¼§±É{hpy¯”µ·Qzv’P±2GLj0á“Ò=PÀh=ïq”F<£~ØÐlsô¬aiÔÑ«2œ½2FÖ¥Ï2f¶ywô¹ls4ÙlÙæƒÊ¤ls|0%йÐÐዊOÓ(ð ¸êeŽ[)£Ì9£c¢7ç輸7[qN#tx—,Ä5¦·ìÅS‹÷ìÅ(ÊoÑE°Ý)h¨$µ–4c€ ¾ àë+YD”šdIhhj·;I‹ñ‡KŒ’6²Û8†I›Ç8iny_λ eDL0¬žÞ¼yzþáï?Þ—ç·>|üôôü?åïßýöá÷§ç¯?þùëû?Ë ³Aûééùû÷¿|*?FµWFH¸"øø}TŸŒ¯¼-oÞ”çwåùÛ?|,Ïß”/Hç—嫯žðïÿñx `¶ ì£6 À­ÐìTÑYihåoQ¼‹ëþZÅQgÌy7ä2܈ AÕ£Y¯³ß~z×ûÌ¥¸‘Š2+†;™ßÚP{eÙ+x#.¿DŒÁÇ£)ž\c"±ªzÍU–'óÔ|9äõÍH³ÖH2ªókê{ò`.ÅÌœéÅ*îZG‹¹ZªMÙÐex —áF&–ßêX‘±f×\ó0L¬EŽ`uøÜÂ4â:°òžLdD[y˳b¶U$2"«Ó®’<˜!¹“§.ÈiŠ4` ÃcéÐÙqûþrÅí"Å“Š/ð.[9´O$+Ç̱¢£W¶GGGWYÐ´Ü \–ÈR­Î†€¢† <8'¿Èò€¦åNಌS‡xBvhœ<Øýé\Û5sëÉLɼå(½ŽK$aNG¿U­}ø^ǃ™ŽyË1Îä󡜢=G³½yÀ MÉÀsv%«ñ vÍ®,µóƒÎÓ/r<™áø˜/jÉ8yˆçñG. qú`’ÈWï°NËš–;§¥ÄÙÂ*ñØ!×®Ä÷Ïôš}ò‰LÇ}¸e'ñv#qžjo¼uƒu2Cq'o9,Q>?;"AoãþÂ<.jÅ™ŠûpË0Žⵂc^•8~Ø´3?ãÉLżåˆ5˜µg¦“»ÞªÙ›ÏÐ”Ü \–qø0n'¬ñšz±\'y0Sr'pI UnŸøé"+m•OfJnä-GF7gsÇ6RââQ`å¢Äü„¦äNà²Dt)^½Bt[¼DGñðƒ6÷ך–;§%cWo¼ajÅlÀ…ò¿¿Õ‹úëÉ É¼åhA]'tÜ¥ú£×ºèšv<‘©¸‘·I2Ë’lÈׄÕé¢f<˜é¸‘§Ý+ºLa1ä8q¢$øÎ\gŸ–æyÍ£ˆzîx^„΋¶u xhuîÕâ5âã/Ç{—*{?O¨í.KülÇ™ ŒŽe›-hZɿ2!;ðûˈ\tز˜!ùïµÓÝéHŽi.ßK?[ßþÃñðÁµ endstream endobj 3961 0 obj << /Length 2250 /Filter /FlateDecode >> stream xÚí]koã6ýž_¡4P«|‹ì·;³˜ÎÌ.ЋŢeÅ!âH^IÎ$ýõK½'&eÚãyÄ"ƒ$2ý:<¼¼çÞË+@ý!¡¤"Hî®`sµXí/¿ýó uã¦zàtgä/³«ß2 J(Q0»Þ}©Ù"ø¼ËéÃ俳_ŠXÈ ×/Ô<€$®/_½™m_žaìø9ê‘{„ @„’sÚ}.hˆmßîæqWõþøVì ûsŠ0?M¦(Bíü쯡‹#zBƒ~†D¤Cˆ†„r\?6…!åz’ %f ÚϦ¨¦Ÿ©ß¤¦þ*“x•.L…)÷“a™ Šåv2žc¬ñ…!£Ý*Pó•q p8V0ϲ(ˆbø“ÆK•ÜñÑeøð\ÖsâZ6 ˆ[YSšm˜—Inn%® H¨ÞõJ%ªjç ‰Ëª4S[vòݳ'Ñ.K㢅¶ÌW÷iaä1{=þ!T/Yr˜IutÃbÖ…§#xäΡrS\ljÑûÀ0º\ߌH¨7èT^Ý[Á½È8Šš\A]¿' ¯šÝT³ƒTSYrcvp<‹g1‚Nˆ«"Y¥>ö~|ìGNø®6 3¼z2ñp„Y 5¸Ö^UãbÙ•†ø"A3™Y-L°Ûš/Ò¸´¸¤(c%¢qëB@:­ók³ ü?Kj[ÌÀMZ¨*ÎÌÚàB³?ŸÑ£9u÷fªRZ¸þmNÌ#J¿ò÷ù>©‰9ˆÌ!Þ-~…ycbÂçtö6|ŠwÚÂêx’ ç 9Äã³oª™JnËÁиéKˆ¹²õÆœŒŒ"ÏÑ=X™LôY’H˜Ímh3" %ùdª5ÚÂæå2R,”»0´L EÇnT¥Ë¾èÆ)ÔUª…ßÁδƒ'‰V®µZ0ÇbðœÞ/°z7CNÈZª¬¹'ï @ °¨Š²ŠW«¸Ry6”Pô¨„/.ÕÒYå#9ß"’3ÑîZ•.Ó¢ÝDê^•–cÁÇ&Œ¹œ WÄæ2éËü}8ýxD`\™K ~}ᬯ¼©!vÝ"N*u_WA¦mVç®Óp–ô™¼¨T—&·åÂiŸJ •>s{|ævP.°|×^ G qîÈèu¾²ÙXŸqè3nIfi;ó€ù…ìWùDXgK%ïㆠšv<×¹E ¿Ç¯M%„Ÿçk›ƒü½"¡±ÆÑ”ƒ1¢WÈAý‚8•w™5çã¯8¼ê–ª>ÆÞË8—ݼŒ*óˆMÄïkËjÖͺãÚA@{( #²Õ`„ìõú¾_þ“p<ËՑȹ¥Ha¿ýí[a€ºð·ÌâÌ÷ç9o£IƘ†2B‡ú'AÏúó¼të"ö¹¥‘Cm“‚)–!âí¤üjišÔôL‚âù(?u_oêzã…¢n âuœ¥¿J(>pm ‘Œk‚ AÜbýÞiQÜúFb_¤‘XÏø÷¶È¬ Þ¶|~ñ(ç` ®Ûïïÿñ¦+s\¨Ê’þ‘‘/=Ø#¹€ƒðv¿MÓµ½WætlûŸ¶› õQedÚo›”íã|¢U'ÈãbÑòs®²ºú¶üÉܰ„]ds‘ZR’Ëø6}4‡Ø½ðEúeu'‰‹oŸùã§¼XøS¹'ŸÊm{RX,Á§ºžCã;ͳ•¹ïeÄÆ`â%‚܈`y|õÛÈk–¹CýR¶®¬×ÏßZ?¿Ï‹ÔýÃÜcíHwíg ŠèÀÒ' ½ŠçéÊ<)d¬gR9@½Œ¤K]EOñL˜|L(ƒÙ0ó..–æìíËò°±VØc °<¬@4×qusDûª±BZ·¯‚Ä‘¡5¦Ä¬í WÝihô4~MÁwºz0‡µ|Rе˜|kS ë¾ÃøÑc|&Œ9Ù¢Lâµ/8¦|€a³…È–›º yã6$ò¬i›>˜ëœ©Mú€ÀN ì/ù]Ðʺ=BѳéŽÚ­‹\_«ÚÓ6InöX#øz4'Ó[ÌP‹â':•U²©|ðä8 áN(?NïrË1.Š<ÀÖ¼,uÉÖfŒ“ôÜ=îN}Ùz»‰·ãiÀCÑ”T…”â…„wåT?ï¿& ©ú•žÍšWg!ÂõeIÚ«oú«HOWÿhÍó¿´q~«?6ø}Rÿo®]wûž9‹ÅÅG¾šòSªG?%D‘|éƒÍÒ?Ìwñ"`SZnl"„_ÏÚ' 5 {fînýžzòž:ˆòvO­Tek,ìK†û6 '|+•¤åMlÆØß4ªîÄæ‚ã£åNz’žÒ¤j੃Nëû×üo–;ñè‚A¢ÈmÃ@—õþ!½þìV>í»KÓúþŽÀÿ¦–7•ÏC¸å!Äáµ_cú»òÎÁIÎtã¬ýXô…4,ñ ¹V¥Û<®ãŠÿJ?ù>ŒÇôa¤ÂÚM—i¶SäÛáþ›5Z}…Á¶ 2æ>4ø™{‚~m>¾[JJâtbd•fKK‰Á·,7 šà¾0Gmp›ô7Ô&ý•ˆ9UmjUY„Ð믄ÿfµöÌ…y±H}›´|¡m›© e‘ ^5׫‚dS˜»OÂÈ §“NGB ˜ƒ]Qó;[\»È7•Ê,·Å"lܧÁ´£é´©y©–eº¼Dq €E€oë5‡nùEÕû´ä iIê’Pwª*]ÚÁx‹knƒ•uõfvõÿ• endstream endobj 3735 0 obj << /Type /ObjStm /N 100 /First 1013 /Length 2542 /Filter /FlateDecode >> stream xÚµ[M·¼ï¯à1¹ð±ùÙ ìÊ%ˇ$†мŒ»´œŸj¾©q ¼ÙÞ! HýÞ›©b‘]d“3*Ý,¤PFJA${ !góŸêü¦„ÚÔƒÚ˜·ÐµyÐðùÓ&ó ’²Þ!2 Ö‚ïعù¯"Að·G9HÕùk Ò“ÃJ âµ :[!=ˆÕyÇ9µî‘†,}€C UodN!ó{34´§ŒRBî¸m ­¹·Š×wkh4~e^„‡7Ä:"K,‡–’€ —Юý’!\µÐJñÆåZÂò­uÇÃ%­kõÈÐ]æ .¸Î¦0Pö4… ]j :Ú‰ïj ÷y$¡Wu6 Ao³Ñ—ÝûQEÿgç­‰k÷T EšÃT¡XÆüUÚãU-Ýïm)Œ&~]“0z™ßå0üDÔ½Þ]6¼¥¨i¶½¯yöPAËl (µï«fAÛÌô¤öÙÈÒ1s ªê=ÔKP›ŠzEÖL”ނ婨÷`e*BwZmOƒ¡SÁÑ-XŸ­(šçw ŸÌ’÷3ºNRÊ~Ë@V%)Þç£zJÖyò*•6C$VªÃÉÇ@ØfBOß1‡,’t޽"“ÍÁWd0 f6‘æÈdIw ½HQD¨³‰6dù¼ lâùŠl¢ÅHÝ-Ö¼½ævI³Ó lY&`ÆôDòJ®3Ÿ¬ºµfB¡/Є™—H:Éc¶ 7HÖ.—lZî^½º»|÷ï݇Ë×Ow—w_þþ4?ÿéLJÞ]¾yüôÃý§ð}ÂÌÞß]¾½ÿø¾o’ã”d%fä"ÜC¦ˆ±Ã5_‡W¯Âå]¸üññ»Çpy~WÓïÃW_ÝáÏoãCzEÃØŠÖX‘G5X½w-Å®z“SZ~iKÅóa#u‘K w•C¢ùlÙF,˜%dX„Ùo’ŽòB‘ÉsŠ\ÈW‘1Ågy‰ÓqK9bÚÄg‹rЯ=4Žät‰ÏðÉГƱ¥¨6׫X1ÑHÓØ{^Cº«ÜH§Ê•„»Êšcñ ¾åˆé+y”ÒrR²n”SãB¾]b‘¨%ÿbÈ2b—Å³ÎÆ95.äÛ5f‰ÅWΞcª¾”Œ˜ôöt.ý,‘é¹’pW)X¤«EcóòTzlÍnsÖz’È+çÔ¸’o׈…x–ØÉÔc*åöÂüRC–wÊ©qêˆ^GÃG”:Ö0˜ã`–ëç âFéWÒQá{—¢ BŇÄTÖ ¼2º¾ÿŸí5<ŠïÛpùË_ÿP®z5ûðå§ŸÞ?wQCjvì%Ÿ¿pïŒÿ É+³Wðõ¯®~óøð4•¼i^ç\ïzS|}F yý„]¤–´}˜ gá/^,🕯€}yûéñã»{ôa¸¼}ý&\¾»ÿù)¼ÿõP¼ýðû»ËЄû‡§Ï¾³œÍöÞÿüøåÓÇ{ÿ®Ùõ»?ßÿðã‡o¾ŽQÇ~¥>âí‡O¸;”TËõÂ9ÀŸA<÷§Þž¹=݂ʠ1è e`[PxMá5…×^Sa@öJöJöJöJäJäJäJäFäFäFäFäFäFäFäFäFäFäNäNäNäNäNäNäNäNäNäNäAäAäAäAäAäAäAäAäAäAd%²Y‰¬DV"+‘•ÈJd%²ÙˆlD6"‘ÈFd#²Ùˆl²¦Ä@d…AeÐtƒ2 ²Yˆ,D" ‘…ÈBd!²Yˆœ‰œ‰L7)ݤt“ÒMJ7)ݤt“ÒMœK¹¹¹¹™TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£móàûß^½!—ºæˆ ±Ÿ4ƆÖwµˆAYrz“Qû¤KÎlس¡ÃWrÚ<Ò¯{R?Kîµ }­Äs—¸Ó%BZõÜT£À½”˜ÇÁÑMÍ/Õpp³‘îW’ºH/Ó›oû3þðçˆRtÍvx¹‘î"—’6ì¦0·u £ŸÊçî'FÞFo©¶žobÄ¢a±Ü9ÝœX¬žã<Í%ädç>Çi/N †ý/þRr,S²Ä^†ÒÎÉrîrºDìù –I3t¬³KLv{ÚÉíœA$%®ät…ÃOqýà¸ÇŠ:©iŠ­Ýžušœ$qãÜ%®äì%ú>Ö92ªˆ/)L<å¤Ùn'¥ÐgIOÌæÏü™:åPk^ ,^·Hº‹\JÚPW¡ìmUPó`ئøV5ÚA”@dd3J:«kÉÉ®}†ó¥Gž>%EßTŠ Ú©ùÁ¼ÅÙHw+I]dNÑQA–êÏ5ÔšOšî®Œ»ÀuŒ./ 2æ³ñìcˆ±DCò´œ4†é.q%)DV¬Çy>RMцó#aŒÑÇ9£HÎ]ãBN—¨+h¤§Ø±ó¯ÖAwð°j¤sÆ‘¤Ô¸”ÔEb.Õù^,=zEíÓÛí§ŽZOÇs׸Ó%úž£î5r ëÕÁóœÚNÆ+ç®p%§KÄ|}MjÅ^cëGî?i7Î]ãBN—X]ZÛÏœÒÑ9w‰ 9]bó]¢îóii†Yç Ìh'íˆIºk\JÚõúÂhÅ6\ò~¼Äv°N5=I(9)ôο!ë£YÒuoŒm£øÿ5(êgž·_Ž;ií ç®q%çö졈a[ü˳‡2Ÿ,ÝÞâd;I'9©óÎ3¦W,Á2þkî‘ØÊ8Ká•rW¸ŽÒü?> stream xÚµš½®$¹ …óû ½‰®ø#R ¬aÀ‰#ïf '¶'X˜1³ßÞ‡êRÝ º†» ºõéP$E©J<¢´"£µBäÙ ÂlÙà":oIÑNÙÐÒm~§ó‘ +š /«hŒBé ­@’¿#ôÍš}›×¸Î>H õÙÒB>{¡^(ÿ e…Br·9 …©¬ç5n…eäP4²?æÂ6{a)ìs,¬…‡&—{á°ù ­yê(r¤Œ¯¥FWš7F£Köœ]YÏï ¬äÓ("ø3ò Ó˜f‘^”(Ç'VôfWñ¢è0[£¨vj÷ªü…RÑ›qñe–=«”Þæ4)æ‚&R{鬩&î7몗®>ïŽÒa]04J÷–w{+ýf]Lk9ªÎŚλR`´_×bló.&2³eÅ4æ]/†ŸdkÀ¸Ñ£ØÍÖŠ…¦­0 osTÆÅÉsô&ÅyÎ9&Àuιõâ}jÒíÖ‹÷©ÍFqt†|njÃÄÃß²˜ ç‚ÙÉ^ðØ+GêZ %{ñ^Ð{ZbºÎ–—1Fjƒ;Fk †G ¢¼‹©žž ÑyKèT„éŽ>{ë…żÖKŒitÁóš#*šÌ‹ ÔÓZ:bÅrˆi2mƒN¨é”;S³–c DIsšW&-] MÄI ?C à˳3ÐÌi¢`é·OŸÞÞúÏ¿?—÷¾|ùúííýÇßþþm~þË/_þõöþǯ¿þóó¯åç†lÐþööþ×ÏÿøV~æ!•[J« 9¼6G¯˜N|ï‡òéSyÿ±¼ÿùëO_ËûŸÊhôïÊ÷ß¿áßÿ…-Ø£ÂûHz…-±½"Èîâä5WÍ”q#ž÷Sž9aM+e–r­pÆ»4¶¯™cóT¸‘™»UÏÅ SíÈ5lZÍã.ÎúEæ)q#3%ªUBþ"nUëÜ1›rߢ®I<˜§ÄÌ”ˆDJ!ÆXÏY¥ŠÉ^…7ä)p'Ò¹†¼†Ýkfs©Mí.3^Uy$Ô…\2Ÿ ÉÇëIVGëû:½ŸßüU…^ËáBN‰ûp§BCè÷"R |DôóØ*ðFœúöÑ;$•Q5…ΖUœ´GUºï5.rÒÅL‰OxAÍ¡fÅ(EÿC¢bÛ¨ò Èx5Û¨ùÄo1§ÆÀS¤´jíw¡(ØL>8ð~ÑDÌ)r#ïÔÈ %1ªÂy“‰ÒÿÑC9oi<˜}3ïÔˆ²?ŸÞ‹ ¬OV2-xÈ^sjÜÈ[5é«HÑÆL>ì¾UãbNyŠp9k8Ì%V潫ÿb¦Æ¼S#Ößùr†bÉrÃg«¤ºµ†[Ì©q#Oñ7¤¨tlm,¯ùþ ×®NWéÕEYrZÈÞÕŸ#ãšõêd¦YŸñ^=ý;íÊZ;}˜[ò&žØ5f½O«>#^eÕ™F}†kqQ@bçïùÆŽYõ(Ïwöh\y0§È¼Sc“Êsãˆz9_-£Ü@>ðÖvQ9· SäNàR‰@uÊ—îà6°®¶|å‚÷ª\Щr'ðT™+#‹Ö@pä}p¸òrœ*hªÜ   ߬ò€N•;§J£JùŽà—YÀƃ„×ùšÜ³˜SäFÞ©±·š/&Ê:ë×ý€l­wrJÜÈ;%j«ùZf¦uÊiTìëôï ¾ÈYè¹xªÂÎUÎ$¶Êƒl'WÍäÁì›y§FÊHúlðž­‡s 9%îÃ}(Ä~'óê¨ð$|Ä–çQÝêv‘«Þ˜SáÿÆû/ð=ÀL endstream endobj 4188 0 obj << /Length 2006 /Filter /FlateDecode >> stream xÚí]]ÚF}ß_Á£‘™/Ç}K¥¤j•lÒ©•Ò>xÁ°.ƃl“ÝüûŒ1fI˜‹_­´¬ÌÀ¢Ã™s¿Ç´GÌí…¤p> …ê7d}5Ÿõê?þúí†nÖ ÌÂÁÎÊ_G7/ßø~’aHBÚMwßj4é}ò~Ï&ñcÿ¿Ñ=Aý¡äÒ¼Ñú òêòÍëÑöí}Æ€Ÿ£Z¹÷A8í©a(¥Ø|©ÄrQÿ»4Éâêÿ½|£vV}P_x¿ô4`õµ=0ðÅ«~Á>ö |œž"ëï×PÃðÀèà.¸·ÐýSÞÄŽ¿dˆ¸ \áoÀýŽÜ Ôì ê(·¡Ë”|Þ'»2È- ©ƒ…»Ðì€Ñ@uÕ¶Ø6°¤`L“re¯ú` Á‘B`Ê®Œk%ÔŽ|b€ŽP{Ô§k„µ ÀP[ûñƒ=€ ç*"ñ¨‚ÈÈ*J£²n!ØW…Èî!K ²!ëÂë™ zfƒ²b=*†\HV=9 C!iÏÄ[CÞø;Û×Q/3¯d~°Y߬ýß\ùž»$‹ò/õ¢IR”yr·*cå ‚øü"<@\ g¬³ ³•‰ &Vrûòš°‚+°Ù‘‰­æW]v°–BÏQ‡Û’¼¨ÉC Û\Éä"šÇË8Æ„ö êxšu®•£_åN (/[nˆæ3{ë– O/ARŠ8·›#ìt‡f¾—Añ-P£[ktÍâ}Uv⪤í1q=*$˜½CÜSB\ˆ.þÎía‘D5h“¡$†ÒTÀ€²YŠÉßS’¿aq”óyŒ]èÏÈÚ@ùçèP´w(BC9Ó“ØžºR#ª›„3w•%S/¬¨R¿Ó ÀÂc °ÕÙbŽó‚™d ¬[çI”¢O|ŠO,(Ù{$öEˆJ[ãWxl~5½MÌ›®²±³dÃñ³š}_n0ÜJëcòÍó<ؤn}²©JªIæú²ïô*³7.[³ŒX3ù¥eâˆ]1]{8]+ßE\àôÞéÓ{\‚ös?,u^b àˆ@<Ë(M“1:¡çvBßd?è¢DdOA–ð][»áphƒX†]W¡ÇÄ©(ŽWe4-ûÔs$^ýðŒ+ʃãÆfª»xj Ò¹ÝbþUu_‘Àn‘ÃÐ@$‰yäV¨–Éx¾²v½„ª3¦XQO¸£I¬È=ÜGeüÙ±9¹*ŸšòF÷·˜4•Œs]è锿š}×gÊ{°ºÖ¼©»ýÔïÚ‰¡ ‰ô‰HÉäU>~•çúÁ>z'°u¡Ò“Þ$ù·hr;ãHÇê4ÂxV‡Z¾%¢ƒ…ŽÁÔtñÒQ[ìên¯j‹Î.’ÉR'Y‰œm‘·ñAœý€ø¶Ã—3,<<³ð°%« ç)<ìbš,£k×F(H°ðpþÂÃË8wž+ŠmŸŽc9„¹Ù41­O¨èÌÙ^ë*8€­ó2^,qê%†ÿUZ&E´XÚÛs±µQ5k=–ªg(<¤|æ­ãTªõ¡TܯeÑ¥ä’Þî÷âQ>©ma”ÏVÆ.â¬êê(s’òêó \*/˜½,ÊðV—¼Õ“Ç_•«Ü1¹‡Ó‡§' ³!‹ scÈu÷œZàÉæ ¸Âèøaš;Ì –— ¥dƒoŠ.Æe\ ¢·³èŒ‡]€NÏ‚Év©ñÔ½3U›áõcùÜÓŸ÷ÝÓŸLp©}l™¾‹Š8J“Y†MÖ›¬!¥ÿ[ý&ISŽ3•©9„¿³ÔP8ÍãÈÞÞFI§M 9̱ÐFîKŒÛÌÑÓã<½Õî£|1.92CàÃñÅ‚óÍd:Ãtòˆõ¶”Fø/?…„$:_8R£gOï&dºˆ¦1¢üü;ÛærÍÍ/<Ãã¤3<©¢[»Ç`|wîi]^g Áß°®xɺ¢”×e”ŒçF“mꊒgZã‹·!8í6Ôÿ*ÅúÖeœn 9 ü®;x5£'š1zØŒþ²>õš¿×ÿæõèæ+®Ãç endstream endobj 3964 0 obj << /Type /ObjStm /N 100 /First 1011 /Length 2486 /Filter /FlateDecode >> stream xÚµ[]‹É|ß_QöKMef}‚8¸³_l§{°}èAÖ-æð±k¤œÿ½#k:z}03ˆÛ.DÎLwDEUFvVwËú!)‘âÕêËê…\²9”:<(¡öyV m̳Zð¿z¤v‡hÑüG¶ñH‚X54HnÝ# RÆü5ii~W‚tßÕ Ãæw-h:£ô R+8d`°ESP›CÁiZ&ŠjЪΆ´Í±hÚ³‹ÐtTèrS›ÇA‚ôù+, 8³øŒ$ó3 èÙ9üc«>;€>gÅüã (³Ì±X YçX¬…lóÈÊ9pØÀW×–Sȵ9[–€ ò9Å*d_DJšË”±âC¹„¢yž[C±2Ïm¡Æ£Jé HÅê _5héXáÒš À‰óÛ±R¥Ïõ)#_Â,BMgü#Š«)8[g*`Aºõü¢ëìÅB¯âó„´éM]k)¡÷‰‚v?ÑLŸ1€bUý×ZfÜG^kÀl8„=»Wç:‚|´™ }ΤŒ1ç®!»Rê34OÈ4G~%›kH°”}‘ýIÅ\Lkkq5Íó¸Í)lHä„Á#ÄòJÃÑŠÈÌù6Q™¡yÒÏÁ "9Ïc‹›«8Æ$R§hL¬VllâVD6 ׇ>Ü7â99àQ`ljs1Ñ\]ÅÈî±idžhƒÄrˆö4ól ›Ü½zuwúá¿ÿ¹§oŸîNï¾üói~þËÏÿ¾;}÷øé§ûOáÇ„ºÞß¾¿ÿø~4ÉÑ'XGâyÜ[ì˜PK5jÇa߆W¯Âé]8ýùñ‡ÇpzþËÃ7ßÜáÏï£D~ÇÖËNYàç…t»B(k>{ÕbEÊë(Ѥ\ärÄÓ%®äÛ5¶g}oqVÉžAß×J¥7ØDJš*±x{\ÐuøÖ¨ŽXª]$mvŒýÉ95.ä˂շO%ÅŽ’Š "Zq|Dóq¥ªê W1ã‚èü2£`c|“ó…ÍUΨr¾Ï$'¸6‰79Ç 9}7eõ™YÛËí¹5;¨“Uàç8¦ l”{¸AÙÊA…€œî’|8î R€ÎѼ@Ϊ߲C^¥+Wæß @Gåw>6Ê©qÝ®ÐN©û%ÒjÏ•­ùA;,RN… ùv‰hõ¼Ájæ÷ˆZLW®Êý :åT¸nW()6¿_†+‡&¿WWñY×^±6Ωq!ßVnFÇ.5?W›Tcº²Ù©ã˜jCJxƒ ß1«èwÈôùFÀÀ†àZ}ËrŒÄÒ%®¤£Âæéù\MÑ)+ÕMä v|£t…_O÷CÕ¿§¿ýýa¤Ð4…‡/¿üòþÖAµjô0·ät`ûƒ9—¯=:è·Ü¿î茆Қýöè7OSû› µóYoÎý_Þ>õ Ý6À7ó2küÅ[Ó-ö;ÿ•ü²±ý¢ÓÛOßÝc Âéíë7áôÃý¯Oáýo—òí‡Ýßþ„ñÜ?<}ög0ÝÏ÷ÕûüøåÓÇûù]=÷×ûŸ~þðÝã¯ç5öç.mx±yûáΖ²œ òÄóIŽg>ÈÙa  ŒAfPTAß‚Êc*©<¦îǽ‘½‘½‘½‘½‘½¹¹¹¹¹¹¹¹¹¹¹¹¹¹yyyyyyyyyyœ‘sJ‰0PÆ 3( *ƒÆ 3 ²Yˆ,D" ‘…ÈBd!²Yˆ¬DV"+‘•ÈJd%²Y‰¬DV"‘ÈFd#²ÙˆlD6"‘șșșșșșșșșșȅȅȅȅȅȅȅȅȅȅȕȕȕȕȕȕȕȕȕȕÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈȃȃȃȃȃȃȃȃȃÈô ÐƒB =(ô ÐƒB =(ô ÐƒB =(ô ÐƒB =(ô ÐƒB =(ô ÐƒB =(ô ÐƒB =(ô ÐƒB =(ô ÐƒB =(ô ÐƒB =(ô ÐƒB =(ô ÐƒB =(ô ÐƒB =(ô ÐƒB =(ô ÐƒB =(ô ÐƒB =(ô ÐƒB²@@dzPèA¡…zPèA¡…zP6¾ÿýý 7gh}1‘º±#jGC%—ï³õÞ@ðÇÝYONØ.æt‰ÍüÖ¡¿}†+ÚßÖÇZ‰ç.q!'[lYDÎÛ³Z±­¯ãÊs„üRØ©ø»`é®q%©‹,³Œg‘»™k»3•ƒDn¤»È•¤.ÒFì¾QL.jYÍ-V­—_}у’uãÜ5.ät‰ð¡úýY êm5Ж|™Î’¸qîrºD¤hó·)ÑI_y/ä¥/0í7Î]âBN—è÷ò³B)¨á²6OÏ”»À…”X†?qÂ.^£áj^S‰fc©Àr¸Òöç{‡[=-#£~·ËÏGº.’“WrºÄ¨w7è8Ðï> stream xÚµš»®$·†óó 턇uc±€… ”8²” Nlo`Ø5„uà·×_<Ý3xšÀâ,g¦›Ö…EvKÄ(­HD¢^´µV˜G6¨ˆZ6¸¨y6¤˜k6´ô1/¶2ð-½Q6¼Pc}Ck G™—£oÖ@‹Z!éù.&-[\È"û')ä4ÕBƒNV(4{Æè¸Íq&Oì¼. ã/Z F9(¦Â]’Á\Øu¶¤à†¼ƒµpôì i#¹Ü‹P¤2ö"B&CtŽ…£ˆ)f£¡Sé– Á,yOmÂEÆÈˆä„æ¦|jóWtÀ³A÷"ÉÍ?j©Cp±õù+.î#9\d¤ü˜½n) -Ø‚ò¶¦Zìcva-“Ù‹öbê©C½˜ƒ¡ÖkÉÅÅ68{¶V,ÙŒJo–w—Nž#€ÀÎ#ƒÃŽÙ²Ò²\Üûô¥»¦p Ë™´(=<ïè­x›óÒ©8MKw..SQ—âÊÉ…[¸Íyÿ˜ÝÞ‹{ϱÀP>¼ƒÑGñ˜6Ç´Ù @ƒ)¿s*C8{„¡š½¸˜<ðÞÑ=Çâð\ŸóŒicŽÊ½Ü pçi-<çÎ2G1¡sžÑAØìeH‰ó;-1(•c<툊iï62@HL-bå£#„¼ Gˆ˜(‡Ì_* D $åµð /; ÄI KØDmÆî%"Ÿ·FôöéÓÛû/ÿûÏçòþý—/_¿½½ÿüß¿›Ÿÿò¯/ÿ~{ÿáëoÿüü[ùµ!´¿½½ÿõó?¾•_yxK½U0^3 ࢡ€ë¾/Ÿ>•÷ŸËûO_ùZÞ,bûsùî»7üûÿ˜Ð¯F5 FͪÛL?Uä>yâ5©H, º4Hm50§Ä^;GµWïrŸçý"‘t‰Ü M‘Òªf†§Q™J¥W Ú,ò€.‘;¡‰È¨X¹i%dh ®í>M^ˆžéÿúöSœKUdZr‡ºdSU‰»´~‘¼¹ômDʨIS:׎’.„•C<]è>òÅüÆ:j´? mTBùò ÙÛ‹Ì.H¤tc˜YÊ=cbiº&ô4ç3èáh¬êÄ\#E[Ô¡~—§ãU äÉ\w2çâ›U)¬L§15à»v—yUj]ÌSç&*ž×m‰Tr[?ñêíÁzeÙò`.™)‘Q[¡4^îÊÈÂpWÅä]wBSd‹êYäž" >Û÷šñ@.‰ûÈX³2éèpÔæ˜èIN/ŠÆº$Èջ̳dÅþ™¼ïuÕzŠÜ "[Í'öXu$oRùƒGz•È蹚";‚¡!¯ #€ë†<~?ÇE\'siÜÈL‰¨«°u_KwE§Ív< KãNhŠÔ¬n‹ö |?ÄEµÎÉ\72S¢xu›«¢D7›íx@—ÆÐÉ™¹GÁ ‹ð0çè›5Ì¥q'45R¯]þXá³J‘úE¾z0—ÆÌ”ØzÍ3¸µ@ª}PV)]dǺ4î„æédXÕyyرòøýÙñd.™)q(Ò8Íÿ-¯‚*=ØÎ¹\$ñ`ž·2crlÍÓ…c@öA×½’ä/" 4ŸúœÈÎÕÙŸ2­]³S^Ìc§üŒé㚨\ÌÓœO˜ô²PÀ"kVLj>tâÁ•ü¶–­ûe$ûE~{2O¡Ï˜¯—dÇüeÅ5ÓëEKå ]wBS¤Âyä¶ŽJ.¥û)]®J±siÜÈL‰’;ž8+BÁµÝŠr)ÜÈL…LX³n6Ìr«½µÀÁ\ w2S"µ4n³ÜŠI®ÉEè¹:ŸÆ¶*Šäª™ØòAmG&àô¢`<˜KãF&$ŽÀn3›ë%ê[f²§ 8ÄSßF"äyÀqòå©ùp< ­A[“éA<åm$ ¡o§ÒsÉϧˆ’PÃç@”ÜŸR}±Ü@IŒœm‹iÌ[yK# hóí©ØÔu̲í |Ãî†ÜsjÜ \"QOE¾VøŸòsTzpôðªFò ÌBNûpK¡qM+ö>ßîèù´=Z¤.òÔ丷fQ“/Ž9–ã|JóèÓ÷œY/O= SäNàR)”[šùð³ >öÍöÚñ@NyK"·jù~à|s̽JÓ͆< SäNàRÙü#å†$«ÞTþv‘!äÔ¸‘wJ´@êë”Ø Ià~&ç‹VÇ9%näi—yÆiñ÷Qç:,%+ö±¥¨RÇæpȉº§ÇxÊ|õCsÕ¿!­qµ|åõ òÕÜ3"3Íù„G¯k̰È7uö›"LÈR´ÔcËAÎòד™"ŸñÆE!ÙíÈ­3$ …ÇýÇLI> stream xÚí]ÉrÛF½ë+x„*<;9ºb»œJÊ*G‡$¶08$ƒ2jÉ×gÀÍ”4 2éØÀ”t‘—Çž^^¿nâ²ÿð(F£ˆÒ0fr”ÎÏÐò^=­þóöÕ^_wa/¼Ø¹òùÕÙ³—œ0 cãÑÕd÷©®Æ£wÁëb¬nÏ?\ý2b˜‡‚ ûDËpÌš»Ï^\mŸž|͕ވ$#ÌBÊiÞˆŒCNã‘,Ä”­^óMóŠÏ^R<’a,k®C!öí_b¼¾¬üø÷êB¹sÝ» ,PðÓùŽð½¾s@°„܃2`N]_……œˆ-ü*5®o@ |ë8 'BCϳÊ9áÄ}‹E3ÊÌ¢=øò{øþáË›± Y„ {ßrÿôÈžÙ¿<²GGv¬|zqšô""ø'“Z9Ó ÌèP¡wJDÀÈçkdÅá0÷fž™«,ýä]F—äa›Ý ûº0J_'¹Óz#ÚCˆ(Oƒ¨vbDã>å÷”`8e•¤™¹sB‚â|˜ï.|L,½µa|Y4=FñÜ^¨snëb>JÁQÇ"àf*U¼úÕd§ÿ`ß3!­yCX˜JéĔډ3ÞÂÛ¶Bˆø.=ÎïGaZ×RÓwV$öìx t×ô›L%­½PÔ“‹ §í!1hNÊØÆ|ÖÌ0ô`>Lî3)ê›& p;Ç8îoQȤÍ8#ÙÕúÒ¤vWÜ"@qzÄ8´+ŒªGJú|€[’EÙÙ fEf ]Ž~YÊÖ¥ *›%Zµ;룾¼!mYŸÅ˜ßƒv9LVn@)öäî\±­Æ#ˆ£Ô™*<« buI´au9†"›4V솗}ë }•€nqåîƒ6³rª“j–¥.8)FC;â1õÍÞ¼u:QB=Ív´TñýäÅ&¨-̤ÔóÄíp%óìóH¸-L¥Õ$»u·Ïˆ×ß<‚6æ0Ÿk‘]øÜ”p êøn\òbÙs«}Ç·KÇ—3g vn+°ës"¥ó2gÅtõMLEÚZCȨO'šD(1àD_+}£3£¼¯ìà+Y h®¹s,鳪cU 7:±µs½¯Y¿X‹ÑIR{»üB.hÖ×ß[•¸u7ÖÙø¯ç hF­ÔмqØŸ7íTãDþtÀ æqxˆ*»« éøËé û8d6£J²Eò¸ؤzCÃÃÚ­b#ÈòS$ˆÞe•TJÏT6¹‹ÆˆøÄrÇ}Û"üp^¹ÄÔÜUîŒùFH»Û`{ñݵٛllfnGäÝKüBV'y®ò†µŸ;ÁÄ`øa.,œâئ¹2:KW¬E½Ð“$m)ÐiÍÉVؘ‹½Øü«Æ+tÒ…^Q=nkÔ+ÎKÄÆ#´É’¼^ÌÝaWz"q§­€ƒ8r›YV¦³‹±ZË:б*š»ÌZUæ-ŒÐ÷ªß—lŸ@ܹ;Db"úo4Ⱥo¼.Aèv¶‹mª,H‹EÍVÌ“F!ôiER»Y ´¼£—c0|÷Á¯78ÎzL qĄ̊»ý{h‡ëĦñvÊuÔâŒÒîvÆÜS›;Rp¹*#A `.Ÿ¿õ£á§ g.Š™Æ doéºãR'ybÔ­ojwijï“ ²EV«¦·ý¦]Ûã1f D×™ºQÚódÝy²=ÙÂðõ&Øf‚—?¿ôAèDûI @¾ÏyÊ>'C€3 Šß=Í /0ê 0¼²Ä-WA>˜5¥X3œA: I=šGD³~2=ÙŽÀÝÎ{MöM Š £mRãàX)•c÷ð•¯î[—”1²¹— ?±¢Qcü¶t°–½È'{@šéÊhÝ$=]]©Ôd×ÊûÖßÊ$ÇÙ]¥Ižß­z“z#xÐMZ·ˆ¥Éÿ2†Õ2ÆïfŠ~Ò,5 Ý¢Þ@¾P?ÀÕ ð{*¢‡¸®Öìäٴٵ7oÔ 20ƒÙ-˜3°Q†Éx ™Ô*ÔL9Fм,3÷n ‚z¼*JÖ (ëø›Üè+u3î9ÄßÔÙ"öqPÙ°þ“Ìø³õä-Ѭ­Í(Ÿ«nrUt*U7Y­j£“Ö!ûH1sPP¼UÎJ4ö)Y7ýJÄ€äTîW³|…Õ,ûam?OÜ]«íԘǸóÔX,@Ànâ…@„Ž\®¥&0”•÷íGòí hתÒeÛ² tc¨ªÖºQÐF±f8[+b?ka`¶ðÚ>°==° ~¹²Ðk ök ¡y7u¯Òô¿µxà·1¤ø++/Ÿ;¥|.‚ˆ>JݰÆÿxH÷Ù[ooTÌeµ-ä%ÚF-5]»íà¤J.k“–…Ñ¥›¹@=û± z›Š­3°G0-ç‡-Vïf·«K7»âÛÅoÃØ&ÌÞêTg•ñÊBˆ²ƒ‚Lm~ßÁô¡Þž“r5öîžTÞt¢úìíì(PÖ‹U3üݲ_Fô+ 7aBF•7ù’ô¸%)ˆäÖ©Q:Ñœ,¤†Õ*Íê¶üÓOÇ´¬*aÈîIK)LN£MvJ[³S­¶y)]å¥ro^¡¡ÕëœÀÒS]'ÆËŸ.g¼¿9ç3®Ë­qó6Ý«@Ãîi7›P!ñ¦6¥gÆÏlt™ÙDªÞ³m ßDÒ±˜'GyÏÎí†Î~f?Ð!Æëˆ¾‚ŽCÚ­‹¹{Jί)뾦L@Ø„E=óós'™Ÿõ¬†»Îð+Ëgh "y.ïÌlC1<&$u2u,œ 4鳆ޣ%Épöâêì?¤Æqt endstream endobj 4191 0 obj << /Type /ObjStm /N 100 /First 1002 /Length 2476 /Filter /FlateDecode >> stream xÚµ[M·¼ï¯à1¹ð‘]l~‚;‚rIÁÒ!‰¡ƒ"/#†6ÐàüûtóMq!`ŸXCÀòöΛ©bqºšMꩤÑC %r–PrJA¤{JòÀ.«z€ µzPBíÙ m̧jixЂ= wuCÄD2lQ‡Ê)dÔæQ¹ôyMBÖ1¯!ä–çµr—yMCs¹I:¯µ ¹%ãÈÝëCÊ#†³‰ P°(©âŸŠi!H×y­Í/ú|¢ä+J °‹Æa“"óÙ ðûêT›¥VЛ? Œ1?-×I²ÈþgƒöÈÈǃýZЇO“VŸQØ$ÖæŸºèÖ}N‹}0’Z$hÊÎabÔÉ-*A¥8rÑ ÐùD ZšóÚª½GéA[šÈ#hÏþ©IнæPS™×$Ô\}ôŠPeÎÚ Gw^K>?­¡Ö+J µI5í–e>1Bêò ª¥æ#5-Ïy¶ k˜Š*B+óm՚‘«eUo˲­µ©È’¦õ–£v˹îzëÝ·X2„.Ùߪuȼ&¡—©È¦³Û$xTB¯ÍÙlrìeÍ'jè×ÙmÍ’8»›öá)ÐmdÃGÖmÒ‡Ì7i K0{uF8Ð|ÄÍs]g’47RżӲ݈|:Ì-–¬Õoè–ïy´á4–ð’†sÛ´X–&d·”KC Í[–§lø½:ßóð{kuÃïmÍuŒjaNan²£µd¶41C>{vwyýßÿ܇Ë÷ïß?|º»¼úüÏOó÷¿üòþßw—>ü|ÿ!ü”¬¤7w—ïß} ?i–Øl@ZJ„¹HýJLvÏ÷áÙ³py.~xý.Ïà þ¾ûîÎþû}|È%{‡–DZY=@5.Ïð’cy çÒxpNù–FAôº…‚(ÙùSìãIJí'I<(§Ä}tK¡ý4§@,yÌ6*)JïORæt’Â+帑n)Lˆ¾ð¡(VÅ5X{{š³”oÔ˜zô"EÒ)r'!U–ˆä+"b÷R9FL]ŸÎq΋$§‹ÜÉ·4vãµ’ m¾2÷K/7²ç¤7IÒ)r'áRÙ$zûf]œý^k±wyš´§“T¤SåNÂ¥RGô¶F–¬»³Ž*67L‚“T¤SåNÂG•)zãb¨­[ÞA¶hÀæwyN•; —JËT±&oÕžRcjO“–³jÏÁ9Enä[ŬoÝöª=Ö‰”V÷j<8§Æ|Kcn×ÊSkœ=±5½éfO¤SäNBªDËÑ7EÌV¯@¸Ñ+ŸµR’ÓEîä[­Ðùö¸×Xl fûù(O/[í¤¦î`œ÷±=êK±do[‡ïsì÷óÓµ\êY¯”Sá>º¥#v?Þiq8cѨ7å“ZƒSwó•a¢¬‡4KOsE²àµ¦ýF£\å¤×HNù¾vÖ{Ì=VïËmG^qì³n´ÉgYñ œ7ò-‰–>~’± j†£lÝ%“sjÜÈG2ôZpèGÛßå[=r9G#9u3ßÒh«EO²;dˆÕ€§XÚYN׸“oil5Šçè‘«Ò³]¿± èzN]%鹓p©¬¸£‘k?p«A>éhŽœSäF¾¥QíçèÙZSl7d=KãÁ95nä[‹Ä⠹ͧí]?YBéÖÊJΩq#ßÒˆ|TkekB´áF¥Ë'9ò ÕÝ„K¥äkݹ¶b;;»ü4§žô"Ê©q#ß’˜ST?8vÈbmnœzªœôΩq#ßÒ˜¬z?tˆ5®­ö½~¼RN…é¨0+ÝýQb¶^=×¶µÑ!§kÜÉ·4v+ݽ­¥#[¢õƱƒžt*GÒ)r'áRÙ¬x÷ú¨²iõÆáõ·nw–ʃtªÜI¸TªUï^XXsÕˆ*{÷Éäœ"w.‘ÅÊw÷ΈÕÿöÚúVo”ó|’)Î)r#ßÒ+ßýñH'—m¢Ÿ> 8éL‡œSãF¾¥Q¬€·±zlEVõÖ)ËY–o•2úZOR«]ösì%u‘Ú¢&oþ{ôŰVrãèZò·jl±[ $çÒ¸‘Ó%–jo=6qÙèKlåÖy`;é=¤KãNR‰Ëüg±ú¿Ç(%Z«¶Yã•sIÜÉéEãò¨ÑöÉuèf鹓ÔEf^!—Hÿî~›E¤KäNR™jìU+«í›-{nëÊI"Ò%r+©•qï,t”¨¶ZûÕVöš$Z©}ú¯±çÿ‘× endstream endobj 4420 0 obj << /Type /ObjStm /N 100 /First 1001 /Length 1894 /Filter /FlateDecode >> stream xÚµš1¯%©…ó÷+½ ¢¨¤ÑJkYrâÈ»Ùʉí V–f¬Õlàïsx ëàö |a4ºÃÛÍׇ‚¢ªè"½‡JN)ˆT6$äÜÙÈA‹³¡¡Xc£«Æ†oã' סQC—qM ’ÔÞÐêèqt è;;/ ¢µ°•ƒ”.liH RG/bAZæãˆée\WÀÊV ø–Àއmü5§µóŽ –¨ ç,Ÿ kÈUǯ%ä6zÉrw> .ÑÔ8 @ªôqG ª’ÁÀ`hɼCSPSö¬Ô\Å(Uç3«mý)>R¿b´DFË?ºG úÑ n+æ`ð«9/)x o Š®ý|í£—¢ÁR-ØBF§Å‚ewx0uö\j°2•Ì:¥Ãz‰O`)XŠ Á:—x2ÞÁqq2¬Ï•Ú ׯžÍƒ[â$°²Õ‚WåXYÇÄ(ìÙSðn¼]Ë;0ª ›»†ªÃæ0@-Ãæn¡Ú! Dõ2~­¡Ö1ÎâÚœó kýÕ„Ù×ùÌUBË£¿šCƒ ÙÒ€G὘p ÃÁ–…æ>îÀÌ­•4|4üa«…žR£vLç¡ ƒØiÚÂi†¡âu0O/>þOC·J ß!˜- ½qÆé=st[ŪH:~æP0 ’¨±d¨À²iì$©Œ©Ü±H’Ëw¬’T‡é1'$µa{%õa|ÌZÁÅDà^Lº±,:h‚›ß>}z{ÿé?ÿþÞøòåë··÷ûû·ñý/¿|ù×Ûû¿þúÏÏ¿†Ÿ¼AúÛÛû_?ÿã[ø#W»õ1‹°`jLXX¯\÷Cøô)¼ÿÞÿüõ§¯áýOáRý»ðý÷oøûÿA;§§ÅFwktL/ë~~ÌKí5ÞyA§È£PЬÇtp‹ ïfMbr?,ò‚.‘'¡é%V,|økð¸¤hå°Æ‹¹4ždz‹Êj9Ò)ÃDƒÃ1‡^±‡Ðâ›tNæÔù„)E^·e‘Ø®¬Gz[+=–Öòìe[V,F]Ì¥ñ “U¢ÐíJCkÚ€×›!ÕMv¼ KãI(Eæ›ìò®¹Å¢õ!Ï}“/æÒxI‰’"]yòØÌ©œ¦M/âÔwŽÈˆ§÷è ’ ¡˜A©Fmw^¼ì™¦º$ž„Rdë11FºD–îñ¸Æ‹95ždRbmÑIŠaÅ3/jUo¶ªºi{œÐ¥ñ$´|&&d=È÷¢1%@ÒÒãà±éžÕ8™KãA&%v}&·VâèQÖãб•M/æ’x’Y3v$dþi 8Q˜¥Boµ/¾É±.æÔùŒ¹Á”ê±²vͱ²xP`R•Ç8Û$ñb.‰™#_vX^GÇ1·U=ßx¹º)șХñ(ôŠÊ‹"œº¢ò’5J}=æºIèdN¡O˜b¯Gå1N«Œ$²X#øÇÁ£åMóõB.‰™P¨½ÀšÜ@±?¼+«ù¦úP6™qB—Æ“PŠdõ!k@…¼DOùhL>‘SâI&²ôÀ‚”f„ƼÄTýln5¡KãI(Ez޵ößE²ö`GWãD.‰‘—_UVL—_UÕC•€Ë’“9e>aî¨AjQ+IVúÍú·MéÇÅ\O2)Q%CØŠE2̨à囸£oš­si<ȤČ­Éÿg=²îPGe—Ä‹¹$dR"v_¸®€ ‹ç;*•Üx¸M¥ÇÉ\OB¡1»Gg“¶, m-ÒÇn<Ë3NæÔx’I‰†4œÛcN‘§ Ù€øãÅ_wI¼˜KâA&%„Æ™'Y±üœ)ð7ÛÆ¦JÀd.‰'™WšœÕbêu¥É¹äØn†U6¥É‹9u>aæ 2l,”k4¥dø×ò8¨›Î&sI<ȤD)1Ÿ‰U΂§xìÅ_­ôÌ=p—ÀsHêK0]^;cA¤,Gõ}—¼sDž§ÚyV® UÌž¿êvRßD.çïR†ñø{cO1ëM¡ÁeÏÆ?¡SâQ(EÂ¥Ž9ìL|BZŠâ7‡ò¶)º™Ð%ò$”"]>ä¼Feòè=úÍé‘Ȧ|jB—È“PŠ´[—µyæá7ƒÚëžc2—ƃLJ, “.Cœþ--Z»IQKÞdÇ º4…*v(–ârMeà!À¨~þ¿êy §s0'6éÏúr™i8ó≼ÊÏT–´Éœ“9Íù„é¯×Vy0N aH-2ʦ7ïȦ2Ç„.'¡ãÕº†®­·:ÙjJã*ÙT•›Ì¥ñ$óš¯òøÞÓœ®ÉcºVí{l9™Sæ3æËkäʯ0ĽÙJ¯ºE»Ù²©T>‰—Ê'ÄþúNYùzÕïYr+`Ë™·º¦/äÔw©HrøNŽÓz%º.|·»è™r®a1J­‹iÖ£À%²"È*A%7¾&ÍÓ9,òƒ94žä-$Ey(€èUùV87ìÇ)Áòåÿ׈¿ç endstream endobj 4421 0 obj << /Type /ObjStm /N 100 /First 1001 /Length 1807 /Filter /FlateDecode >> stream xÚµš=¯%5†óû+Bâk—ëÖFH¬6Ùh!C$Àh¥™‚ý÷¼U§íKÐg´bl qûtŸãÇOÙ.L3‘JâVJªµúEMDÝ/(5Ž;-±ÄNbqG’vó M†paiTö‹žj!yÁÕ@‰L¸WQ6‰øUMµYÜ£T¹Ç½–ª/TÃG\Iª½y½ª¦:8îY¢"«=¾F^Y¯ •D\üÁÏpE‰4\¨%2öú'êO%Ñ0/™4¡ÞqÏJòºàg Uƒâ@ÎE…šDHZMMŹ Q2§-µFS#žâc £†â‰âi<ˆ_ jÌãåñQÔŸ2Ôü+²á¿õ ŽO[’B^ÈHmñT’¸9k’¦qÏ’àÇ~Õ“ÈðXñ@ë/_–^ý©Ô$ëք’Ž{-iÕ¸ÇI)JAãiqO“J‰{–TÃC híâ5Ð’t¨Ç^kÖ¡”¬F)¨¤µ(E9SÜ“dqÜ4ú‹Z2S¯3Š²Þ }ÎÛÒJ굺9ze'ò~…ÎÕ!FÓvޏ'4¹3LRWóZ™¦nR,õQâiOÑÕµyy½¤Aì¿è5 ×Â¥Áæ¿è- éñ”Ó°h#tÑkÜÓ4Fsºh-…ã'>@ª:¥+æ_"ÅÿKŒ‘‚VöK ’¢Q:B-Cµ®¥Ga㤌œˆ+bñ(Ì|,ǰ UŒé—wï^^øßß§×o?|øøéåõû?~þŸÿõÛ‡ÿ¼¼þãã￾ÿ=ýX ÊO/¯ÿ~ÿ˧ô£TË^ Õš+º«_÷<ÊÀw¾MïÞ¥×ïÓë??þð1½~—¾â¯Ó7߼࿿‡CÈm‰–ÝÉ„€©ôÌÅn‘ÕôË Rz®èŽ'Ë’)×È8#´¯²!°rØò‚†åI಄z–œ–ÍÚvß}ÊJVʆñ7™!y·ëÀðÀä€Ñ‚Ü£¤ˆk½«lR| Ãð n¢ûøTŠž æÌH ã “6õÕ ’'ÓRÀ¾˜–ErvÖrBÃò$pYvCXyYÊ„VŽv×ÉtÉ“¼åh† "ë¨fÃÚF:#°ípK^Ð< \–°Ó¿H#°õ°äƒŽ'yËQ4c1ƒäJÈéÀ·Üû“É\79>¡x’·KËX~`ç%²CkÍØÞBe×€¼˜r˜7y`Ðc›kö °0IÇq2Ãñ o9vÌ…×€dì(›Ý'Ù”t&ÓOò–£aKç§u×n™mäní¬ãŠǃ¼å¨5ÇMöó$Ö¨Þ§€/^çLà †ßAÚò“Š\Úßú©ôÜuœ5¼˜áx·¹d¶Ì­ig/f8ä-ÇVSäÔÏC¢Çv½ÿmWN½˜ò8=Æ[Žu ¦ ‹Õž1?'&•‡÷V’'o––X]ùI.WEdï³€µM-y1Cò o:¶ìã­%‹bv¾ÏC÷8Nf8ä-ÇÞSdn™ªó%wyrÄ›z넺äQà²4CTeµ¤¯éšè観ä Ë“Àe©ö“V3 ú­1BËOAÙdyAÃò$­gv;Q„Õ×®–5ÖÈ@BGrz¬ÇßR( Ëç‘cS\'3Žéžó¾8®«÷°fÿ‡È5F¤å'çÔ7%» Žçp˰I–貓]Ïyû“³+ÙÔŽ4O—% ‚*koÞåÎOROÝt$8¡r¸,ñW¬­7kDí}ê±M§ô“’yËóÑ6Ïv–?éè†`"Cñ ±0 Vt¼eV?ôೇe‹éŽŸãµ-“õ†ÚR¤QroýÌžg*Nf„ø9oÛäA†1ï§×ò‰¨ ?ÝV7-•'3$ò–£O>¯éƒt °÷LÙ”r&3ò–£TŒ ßpVgÊ@=îߨ¥x!å,n26‘¾8–Ù_†ã‘é ³nʪ“Šy˱•,bk)GøÛ¨ÝœOf8ä-G*ˆ©¬‘åNÏvX›s’'˲ DõíÝò7ÎèI›Zòb†äAÞ5?Ö”·Ía Ò‰ŽÎ‹éŠŸám›«¯w|³ŠM¬˜¿´«Ù´'Ó%Oò–#Ü ÛÚxÔ.˜ŸŸ07eÖɔü娖ý½Ø¦ˆ-ÖÕ°»k÷§W´i‚œÌp<È[ŽÈ5…×¶£*û2ë~|ô¶i@^Ìp< \’¬Ù_VŸ’¹U:ñÖî|IxCñÿÁý çeÁŽ endstream endobj 4660 0 obj << /Length 2073 /Filter /FlateDecode >> stream xÚí]ÛnãF}÷Wè‘b¥ïìÎã"3{ìÚÞÅ.’<0TKêŠT(jf2_^$YwS¥‹ƒØ,øÁ¶DJòquõ©S—¦#RÑ‘!£˜ó±z”.nHûh9u?Üÿõ†n®»«/¼Û»ò/7ß¾—rDÉØCGÓý—zœŒ~ŒþžOìçÛŸÿ1TŽWõ µOP#›‡oÞ=î^^2üÍ•Ï>ˆf#*Æ\(Ö|mÆ’›‘ÒbL¹èÞó_Í;~ûžÓ‘¥Ds U¿b}'a¦»ì×u2)“Ê¥eQT«î½wËw,&Ñw·w4¦Ý7vð=þÜŸô†öOeª,ÒÄ\ Z žÑ;ÐÊ>È(%¯ø ™á‘QíJx†œKo™‰>ÜÞqÁ£ÒNmióÔzQŒù[ÆíðAŠ\ªˆ@¬¼+•šáÆM™ocõ7©Q-{öΕßÀR~&<Ò âQ‹ÊÙÜoÖB!¾![¯}©Úö!'¸Ûlö¼æ+jà îaœà>™¸${˜'ÿZâÏèÕßÖgÚLE’7í²Es…hE“êãhîÙæ÷eòÉë/¸zû{\½Õ÷ŸÙ3¾ÜÏë5Á½ìÊŠG1p‰¯ý‘€àCå EÎÅ–šIYî.ÿ¥ð/sɆJŽ.—åb¹ùÄk·R ç:ßqp÷;óÿÉgtÏ/ëžm2ñã·cñE£ˆmBhM}jDƒ®Ëg~&ÆÐaùœŒ¤>€×ÂÛªÜüÌ£¤,“FJûÍO<Œ|Ku¤oiD`«=s¹E)á )†o†”áE(S0ø¿w3È<Ôëd Ðú0U´Ó'›½[®\Vä(ÑôJ4P ER{ ©£ìrDùÅQ^¬3ÌKœA&X ó¼«t¾.ýùL†ÒÎ3/\ûØ@,7­’|–ù“Z Õf½4AET‚Ût]®œŸp*ㆀ‰#eüöÕ|Hƒñ,^¬«9æ`§Yí &œM@i ›%•ûˆšÃ94¤9dËÂayÈ9ør ñYå½ÄÙ^¢å/—O,’Ý“È.(Ó'~óÕ ùÄ)\˜) TC†<aQŠˆŠm^Œ ¾+7©Ë,IÑÙ^àlAº²ÕÄN“uV-m>äB1ˆÃVÕ6“8[/niT£ÄtH,H1L Åk#‰)ÈÞª¢ÄU}A "ªM <­ì³_ì—bË­Öe ‘ ^{ëÅ#¬š/õ·–ìPþhË•_ôâúÕt’ˆ™ ârÂøö‘XmR'¢<Çä“ ÔŠ«NZìu¤/ ÀNCˆc‡ÓÙN ’™ýâÏÄhÄûòÒ„úyáu1÷Î.’<ïÓ[%Cš®ó´ ¤u¾Vb^F€T“{7›{%UƒÆxZ¿s,"JôqïÛ"þàü`¨@H† EöÑ¥ü½N$~û‘6µîÑ@Ðþãì'¬ÕÈ/ª¤B)úJR4(9DãWXü*üµ³ëŸˆ$ËÄ•“ùRÿJý-Z9U@c]cüuíøËKvcÓ‘"õ÷ú™'øÓd‰…§ˆ°–(c¶‡¯,“jîŒ$ #3µ·%}8îÛéÿ —c pB  8ÐB{‹c™xû‚‰`uĺKŒâÚSêAëþŸ?ôîï¸/]ÄdÄ÷D«']çMgg[’Õ-·XÞÖl6*ÊÀŒ>­†²ÎÂÚå[¾ö™÷ëÕÊ%þ..Ñ&6©#¡‚¥ÚyR|k§yRí8)&ãîªU2 ÌTSè/Α"ˆî-4Ú¹‘UòÑb§îõ™ûjàÇFô«7¢ïüýCšº›â½Æó’ŦÔ~«3 °ß¾æ ã&•#ئAîáµ­ðìÑʑ㢆˿O‘ôâ:éþ%³2YÎý¹2lAL7ö ðŸÁ¾Û‰üàt)2`¸ÎnBºŸéæ„%ÞZD”‚v£²È2Ì«]'¯&!»˜MÊtŽˆ_ñ8öi-Æc˜w.¡Îý 2(öÔ€lRS†%F`gD`’y72›ù$)ÛtŽ|vészhéMkÖQ¶þ×/ÍT!‰…A“~…æÿÍ Ð<°Mœ~Ag"„ÉZûeÙ—‘e ~[LÑÈÏoÔ3Ç<[„ÎsA”!(›ØOÀ\[)!iºv†$4£Ž¼M²%#ª…ŸlÚaRt)s[&UQú÷4)†meµÇT<¢ýuØ…aTÕ›§ÝùʪrùÌI±Ë›ˆm2”ûžåØn÷’ív±·r©9æ*pb>ø‘Æykî¦&p®›Àe΂Àcå¿òà)“ÊŸ7øfvµÂê窟%!›»<€l ão¨›\ÛñGA˜.‹5†º âs‹OURÎl…Jo¿Ò+ ÔÁyÍ•q$ ×;†ºwvå“ûp³ÜNBÃmq³ lvbä‹efÿ8ý 4,l8Gs*QHЍÅw¹@×…(BÊ ·Ó7£`V¼*ððœ ÎÝ”Qƒû4¸c› þþH!tçÁÛö⮨¯´©»¥Qø™¡MË@סˆÜøúܸC6x–'r㯸1Ó9ö¼HaOïN·ítŸ›YfÑXcºã¹BAzgšíqˆÙ÷÷¨½ÑÞN@ó߈æåh®ÜaЉ_TXÇœ”l§góí> stream xÚµ[M·¼ï¯à1¹ðñ£»I‚;‚rIÁò!‰ ƒ"/#†6V€óïSÍ¢äà­x‡€€í÷ÞLÕT“ÅnÎŒ¤ŽRI)äläPJ÷ „*âA ¢ó' ÚŠ¬ÏŸ,ô4OoaäùS9•vƒh±:RvÑì~­–B/Áh,d©Ž•QÓ ¦8Sû<>‡ÚÔq^»UjÀ™ §¥áô?”ä×Xð]B  z„*þ±4ÀÛüÖZóhéÝ£š‚¦TNS\<8j Zü©5h­3BD'¼U›‘µy͵!Kc¢ô #ypš¥ìçJ –«Ÿ!9²)ÁªùqRƒI›ÇI@æqHvK32¤½¸^iÁÆÔ&=´$~õ2BË3CšB+Iou$p ‰Mg†´†fÙÏP ­Õy††ÖeFÚP¿Åè¤yUøØsŸ¿ŒØðÑòAôE”C×âV†È9p½Í«2 ýaܦ>Ú<×Âx7ô)Éu€‚æ#Œ9<ÒR:§`Ëa˜80ÿ.Ú¿«aô9 šSšóó'§<¯«™ÏÄ9 0Î9ÕyeÍç§Ì)… 夿aÇ M6§Æ0§Ö}wLR\ç< b2§ì¼ Ì9Ï)ÑÁ–‹8[7ŸíÓ&˜K9»4„`ÃTž§¹Ú¼Èá^ëSì[UÀ†)“KšrØJV§@²s)mž¶x¶"c"€­Ø¼²¶ÒÊD[é~eêÎ.Ãí§Èt®ÐyóìÙÍå‡ÿë6\¾}ÿþîþæòêÓßïçç?ýôþŸ7—ïî>üxû!¼NXÒ››Ë÷·ïîÃëš%Žæ¦tíݧ0pì‡}ž= —WáòÇ»îÂåyø]nöûðÍ77ø÷Û85õ˜}üNõ•c#ßÒX  V®E¢ç<×kê×IÓ5æ›Ï¥ƒsjÜÈ·4fENË|Å—ßR",•ÓÊIΩq#ßÒ˜9EÉ@>»Ï\GMr•³éIΩq#5X®¯yD›‹Z†Ôr²ž#ñ œ 7ÒQa¯Q±â¢HF_cGŽõûs–›ƒÐõý¿dÏÃkÔtÜ÷áò—¿þ 5e8…÷Ÿ~þùÍ“*c®¿>ðÅÝûûyY/PÀQOæ /¼l'¿@€ú#ü%”^Óñ¡„Y™üà./?ܽ{u‹„ËËç/Âå‡Û_îÛ_gòåÛÜÞ\þÖÛ÷÷½•š`ž¼wŸ>¼»õïÐ-Ìïþ|ûãOo¿»ûå!ņ]ùòíœíÜx8pŽÏGÏ~ϯg¶{GPÈ~SÖ7ÊÀ4Á8‚CÿìñŽ€\•ȕȕȕȕȕȕÈBd!²Yˆ,D" ‘…ÈBd!²Y‰¬DV"+‘•ÈJd%²Y‰lD6"‘ÈFd#²ÙˆlD6"7"7"7"7"7"7"7"7"7"7"w"w"w"w"w"w"w"w"w"w""""""""""Ù›°#È ƒÊ@(cÐtDÎD¦w”ÞQzGéÍDÎDÎDÎDÎD.D.D.D¦•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéAÖaÙA@dzPéA¥•TzPéA¥•TzPéA¥•TzPéA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zоùíM¦¡SÄ~-ŽFßÁ[ÓØûõ6¼?q;UzÃv´.Î2šã±•Ó%j‹6ošYô¢f¦Ø©êUºa'I<8—Äœ.QZ¬æGXS £Yëõ ã÷‹e”(0)—”ŠMV ˜*v¬âE}þ€RI¾žÓ'2ZM¿`l-zø cný©S§Æâ7ŒÉÉÄ~…³ëÓ§N±˜}ûcÑ2ßþëtý,sP.)^dˆ~“ƒKª¨o&¯ïOÚlr)ÜGé«Ä¬þälóí‹GÙ¬ðà\ 7rºDìeLW+.5#Ÿ²WáA¹nät…¨ºYÚª‹‚¾cÛ+ñà\7rºD”]“ñYbNÈhÛ+ñà\7rBb‡Õ»SdôúÒVÚ9ÉI‰;9]bw_ø;0•×ðyDxãz35N’xp.‰9]bÃþ;Øzõ‘÷ ,Ÿ³Ñ éÒ¸“ÔE¢êšúÆ›6±ùú†éõ6ÃÎǃsiÜÈéQv³öùê–?Á>9ÖGîùŸt‡š”Ká>Jˆr8_È=VÔ* ¾¸¾;Õ“š7r.…9]bu[|±¢V‹ã‘|ž¥ð \ ÷QºÀ ´Ïú¦¯/mõ¤;ÅåÒ·‘r LH§~ž¤è:†ÔÍ 8—Äœóý¯ÍìsÁHŠŒî½ÉHÎ%q#§KDÉÍæoL÷XÄ7o‚ŒÚÖ}"9)q+§H,élæ=ðzÞWº ­Üð“tÎ#¿Ezܼý:i=§áX¤Ìî×HÛÓ{ãbsû\¬J«ø{Ý’gM ƒrIÜGém†¿q endstream endobj 4662 0 obj << /Type /ObjStm /N 100 /First 1001 /Length 1891 /Filter /FlateDecode >> stream xÚµšM‹7†ïû+tL.Õ‡T,‡@.9ž™\’øÞ`œCþ}ÞªéÖâ0=„L ̺·¿½¥ªR•zµN%i-’ˆšhb!?¨I´úN·¸ÇRµ8ÓSqÏH½ø•4âq¢D…í GŒ7ªø9¼›«ú‘&ówQM¤=ŽZ¢:âYKdx7Žz¢ÎŽ¢‘hˆ?Ë%qQ¿Ê”˜Zƒ91wös‚a¸|8ª‰ÇÕ–Ø$žµÄýú–žx4$Åü>)I¨ûX`áá aØBq$Iüõ8Ò$Mâ>XÉj<Û’ôW-ÉmŽ,#®âoQ\•b*n+_}Tn°oQü0s†ÏB·hKµ”¸Š¹ ¦ëcPçFÂxœ‹¸×Ÿ¨”jµY[7?'©öW5ÕAnçZS+1ïµ¥F÷Yjc©˜p±87RÓ°3\¢µâç¥f¬`ÙºÄ9‹T·.^`¥9?Œb¶ZKëú‘%Sò1·ž¬†¢6’µx \ÅLÝjFÉ`]00Q6 Mà}ß5MC.t¡x¢¥Cû‘¥^¯oé©·°‹ÁsÍü&ª_­Û)R:ä ö7wIƒc¦»&8¢ÏQ¯ihØ®2jÌ ;ZŒ¥÷„É£‘Æ × TŠøÉáBê3(b¥ú+B¤ˆ¹½`\‚Ÿ»@XˆJ‹w!@¨Å “ÒÙÇ>'e¸Õ@¡‚)S€ÌÃA#8üÓóóÓåýß~L—·Ÿ>½|yº¼ûë—/ñû¿úãéòÝËçß>~N ²AùùéòÓÇ_¿¤Ü%3SÍÍãÅr˜™2ˆ¸ímz~N—wéòÃËû—tù>}C½~›Þ¼y¿ÿÉdÉVã"Y6,’ B©äÑn2y<ˆ”ž=è&R-cïåQ‘U²'©IlœÍsÓä£"[Ïg›H³ìsiíAäî>;r÷Ÿc$ÕòÓCm(¼aD–)G7qõQ£vxНor*\‡t]³/SDð"$'êöÔ5±±+ܘ»Â•L—h”[ä?`±Z’Œ…ñ&NËI7攸é›À¢nIÊXœ‘°³ÒA ÊI 7äT¸é kAû«ŸÖƒ¬¥Ÿ“lvèÔ¸ê"µdÌžp”5¨œò°Û‘Ïgùi§¾•Dø‹¡„$ÙP_íkŠø¬&6=iÕ˜Ð]è]è I\yJn0ìí ‡Þå$‘tŠ\ ‘{HöÌêkdƒQÛZ¥EäBæµÒö€Ü– ƒöƒŽ“f±|‘+‘³ZñĦ™Ñ? и/Á¸ \H„<ÛÂp[4PwŒNK—Eû:…Ô“5ºd΄®_*go•½˜¢Û©Mù1d%´h'w¤oš¬äM‰¨¦ÐŽ"“fß i0²(dïG5–ž mþÆ ‰+yScC™Ì&Õ²øè±ì ÖP9i7fˆ\È›QO)ZSé%w¬ý õƒìÖÎšÈ "W§J¥Ü*E³T¢ªj|Љ?:‘p–Á×á¦B”S±™‰yôÝ¢†rŠ­ÞD>º‡3}uc†Ä…¼W •&QTâ¿·ÜåvÐv–Æ+34.äí«µ\¬ÂS%ûæ{EûØëAÅøèÎ;ÔE.N•­fÿ1U"³sçÛ;*'yëÎ ‘ yS# ¸!³¨Hì}\+')܈¡pN‡`9LU¡‹à<…³ĨHê$kêÆé¨;ÓÞáÓƒë@±ˆeÝbñ/4íÚoTAÊk¶¤´B÷‹%¸¾2Ñ~”Aw™î§jG‰áÆÜ˜s2ï06îœÍ¸|´«š!Éhèà>¢þ¿ƒ;Š­º:UnÐP¹8Uúþ;’ª á1 üÞáWµòi‘¹ACåJàT O-&XBzöOÖµ Û«}Ý8)Án̹·kT4rV»ƒF2GF@ k­9ÑIQ¹C]äRà«J¸ŽÌ ÔŽ–²ô%_Wö‰Ü!q!n*´ç¦DÔ[$óv’Äò¦FôqE%²Nq 5åÁ&D;§ÅÚ‘!qn*DÇ< :õjkÜ&Ö“vuvd½þEÉ2Þ”(èpÐ= J‘ø Õܾ®p=)álй8U²·;Çæõ‡b(¼tµÊ *W§Jò~Ç^Uzb¶Xå •+Seiyøþ•'s¨GN9Øj¡“¢rcÖż]£Œ†TÞf·¬(CHté ¹3CãBÞÔØQâtó(ƒÐðZ³.æMȪŽÚ%zr; Œ“Š€X×Ò¦>dš>|/¤Á_Q‚ô£ž®ë9g‡†Æ•À©Ë¿0lÛ¼ËÁZÙJ惞®´ ¹3CäBÞÔ¨tÝŸ»–:¢ãps×Î’¸!CâBž·4C°øK¹n–m;ÞGZ9øhv’«îH—xwÚ6«0z€뜋·XŒ/ùö9çqc†È…¼©‘J.>ŸŠd®þ;š‚ƒ~ŽÎJ«34.äM…Ð7έñú£/ÚiÝ%^‘¡ð?áþœ¾H endstream endobj 4891 0 obj << /Length 2007 /Filter /FlateDecode >> stream xÚí[oÛ6Çßó)ü(‹Ë«Dîq@ÛmÀ¶xEnŠL;BlI•ä6é§å{bR9¶•v‰úPERìà§£?Ï$íûö4éEœ´P½dvAgËIoyð×û ººïÒÞx¹sç/Ë7ï¤ìQ2ÐDÓÞp¼ûQÃQïSð[62wý‡¿÷•ƒ‡öƒ¨›Óo‡›—ŒÿŽæÎ½?„Óžè0«¿#Tb@¹X~]•~3¼ùÂ7ïÔÎmŸ.5 ~î_Òˆ>øÏy²íÚëü…/ö€‹D@E¸¼ô¹µÆèêÉ_Mã¬v§Œœ+Oø/8ÈsÂFZÀë•©#øîÁKxc ß-xNŸ–šjš&Áw ~¡ñû6nQW.ÖLÉ— ëû|­ƒµ£@Qˆº¤#ƒLG áYÉ ”•ŽeEGS·àÇ©™Žœô…F3¶09 ìEÍYž×7IžÕù¼tÆ@L¼2»tÉ,³o}Do}–d£Ì…I…øÖ2²±Phn‡6ÔÙnuV0 x3¾wêGBÖº©ÔAɧ_ÐèØ¼# 1ïÒ‘ÙÒ(ˆ ^\a’ù4.úBÕ™óu) !|ÇŠì8Nê¼—¡ëÑ DhŸžP-ïªãk Kž3,‘»a‰z‹}1V'ù¬˜6ÁIæî^,¡Î›!'ßÇÛš¡?kxÍŸ~C|?þ!Ø7áæUL&ùŸ5 µO&ÙÁ_NÜ:ƒ¤VÑé¤"P6Ó)ù³ùr}àÖO‰kÓꢠ†ûÁ’@…»Î*Ÿ#ˆ%ÃuÉm¦µr fzU˜$§Æ=G°WœŠR"àž·:«òrɲ(󾣂QÓy±8SÝÄ#_ë“/œ ±#‚O^6$<Ò'Ð7]ææ`4«ÊŽÜ±/Øå”œYùXhÖdî!èîZKk8öú+l*XUDø:q¼¹.NÊeöü@¯Rho×g©îmÏ~\~ÒØš0Ógê"Ç ×+”b1Ûbñ ×'?‹EvŸî±Jj\xt¿I )DÙ^ Åpk…Žæƒjåîºj4Xk áö% QGŽÜ4÷ Çγ’(Îý=yî/áoÂ@÷ JL±ùW¹‘í¶\ÉJé™öÎõε4Z4˸6Ê7Sæ˜ÙØd6HB—U㼜¹Ýj}f&'¬þ ½YÇ‚cz÷‰ô®{2@ïˆK“%÷n_L¡kÕH0jØà¬q§¿Ãwú{Ä1¯ îÎuÀî\$÷è)@båý„Ê;Tfv=õL­B“ö˜´9QiœM¦¸0ó ~‡ðu'k”Àõvrç!pfׂéÜ;»…€†Äq”Æ“<‹§Ø*ÝÚ*yüÿÔÂËgÆ$˸+Íš$k3)ãiÕ:X½Øx¨ñ•8ȸ ÷°‚ &±`2`¨–sóG\N<Ý¡X§}T§¥‹˜ôâíðâ?ˆs€± endstream endobj 4663 0 obj << /Type /ObjStm /N 100 /First 1012 /Length 2471 /Filter /FlateDecode >> stream xÚµ[M‹d¹¼÷¯ÐѾ¨”úÊ »Æ†=x½Ìa<Û˜ÅK·™éõ¿w¤ê…Ú]mØ.ACe×{/B!)¤”žªö”C µ§Dš5äl´Pjõ ‡Úºš,t›ßŒ`IH C²$åqƒ(±ÎcJ RÔùÀ%ubHÒÆ¼ªATœR,ˆåyu%§Só«YB–®àÈ…UõïJÈexá2´äRr ÙoFÔCÖ2¯jÈV‡Gòèóê%M”’Bó«EB)©£dԃ̫%”V¼,¥†Ò«ãÔ’Nm¥‡b}>«¡ ó\HS[Á…<+¸B~™5\A^k‡ lSÛí®Üë^Õñ*³á¼µ‡–¦¶Š¶ñ«Ð2$ ß25”®4¨¾¡ AÐ<ÉqpWKÖ‚zS"A5{³´ÔŠ‹mtT¿Ú2¹{á0Eeµ<¼òZ VSvP7™Oh°>%â1Ó³&ÜgS¢qÌNÐ5Œd.¬úϘrFEü*nAË{U¨„ÑŠCsN‰¨„¡ÝKª5 3GFÑÆó*:Uñ¢aÑ#³³(ºU*Þ(+©ÎŽ` aëþ˜yï ˜P,IêUÖ ý7ÙÏA#vZ40òD›äêE5°I™ÂÌ 0« ] îšÝˆ"š¼JP‚nžÀ6Ü,cVüp·¤Yólèé. ª]ÝÁØÐ×½8CÝY³dèe’ÝLÁ–=½jú{ñly´qóêÕÍé‡ÿüû6œ¾½»»¸9½ûò‡ùÿ_~¹û×Íé»ûO?ß~ ?% éýÍéûÛá§:J„²Y4¦¥:&,«tÜömxõ*œÞ…ӟ︧×á-ý1|óÍ þ~eKEõ‘Óíþ ŸÔñ2Â"5t¶l)&tÓÒš½-Zm{DJŽŠ¾DÎ)r#ßÒØG¬¨Ô¥Q[Äy¡båJ-yN‘; —ÊÖ# UªÆáœ½FáéŠÍWjÈ3eÛL·Ö}¼)=G h ¯>¿P­z¥vÞúw6Îßýõöç_>|wÿÛ¹yü‹OKÞ~ø„§C­rÜ8Ûö3ˆç>¿—gn󟃖ƒÌ 0¨ ƒÎ@ óžÎ{:ïéë²w²+Ù•ìJv%»Y‰¬DV"+‘•ÈFd#²ÙˆlD6"‘ÈFd#ò ò ò ò ò ò ò ò ò ò8}‡þ„AfPTAg  Œ‘…ÈBd!²Yˆ,D" ‘…ÈBäLäLäLäLäLäLäLäLäLäLäBäBäBäBäBäBäBäBäBäBäJäJäJäJäJäJäJäJdºIé&¥›”nRºIé&¥›”nRºIé&‹xDîDîDîDîD¦•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA¥•TzPéA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£4zÐèA£ä̆€Èô ÑƒF=hô ÑƒF=hô ÑƒF=hô ÑƒF=hô ÑƒF=hô ÑƒF=hô ÑƒF=hô ÑƒF=hô ÑƒF=hô ÑƒF=hô ÑƒvxðýïOÜàÌyQŠ¿¹.±¡0­aÅxiuñÂ-TdF1Ã#$ÍHÏúÖVR‰<ûYŠT‹c<½¡‘ÓK5jtÿ’siÜÈé±ÍC%be“tÏkâ%ñà\7rºÄ:æû½%±i”öô†F‘+I<8—ÄœSbò%ÔRX{Ìåém©Ò¯¥pR.)]`XŽž7Ã|ÍÔK‹zaãͮՆç’¸‘Ó%ŠÅ>÷ÛŽFÌ5Ötiû¤\iD=H—Ƥ.2¡ý<EâiÂÓ/ÞôJíxp.9çÞAž<úæwR§Ï±õ “”ÊuÚ‘¤KãNR駉ºŸ²lq ±mCb¿pºH4]IäAJ‘[I]¤ÖèÇEλ}ÍRÄŠsËn?;+9—Æœ.±×IC?¶>"ÖOÒÕ|%‰ç’¸‘sžL-qŽ8G#6‹f޽ô­Ôê©gÎ¥p'§K¬9Êxœ:š1¸ð|\©Ê%q¥ ,~>ÃÌ¢"ÍÇÖöô4¥Wš6ȹnät‰èŸ¥Ÿ_)Σչc­³é(ãê§éÒ¸“ÔE&Ëò5mˆ«›E¤KäNR?Ü=zl~h¢JT4dªXí´½ɹ4n%õÓ(M|G#ú/9²jļæqn½ð¦8Õ+)%é¡ôYÒöò•GÅ„|œÀŸc+2ÇX/œÚ,WZ “siÜÈ9€öìc®URÇÖ<‡œKâFN—Ørœ‡S2Æ»ù+#,{dkšsP.)]`-qäÇý¸ZGÔ”÷¶áÁ¹$îäì6O‡WŸ•}Æâ˜SFÌNŠõ+es‹“:Ÿá[ãÜ–ë endstream endobj 4893 0 obj << /Type /ObjStm /N 100 /First 1001 /Length 1873 /Filter /FlateDecode >> stream xÚµš;$5Fóù!ñø>mK+$ !`„´‹Ððïù®»ì!¨n!º,­v<Ó]>>~ÝëªÒZ8•¤µH"¢(hb®Q°$Ò¢àIM£P“¹E¡%oãË=Õ*©Ç÷*ê Bõ%F"ñ7ÔÍ5&Y"­%Od­G©&ªeT×5 8õD]âZ.‰‹Å§L‰ÉƒÁŒÆ¶`°$–µ0Œ¢™l‰]Æž¸jXA›RKÜG ¸')£)IhÔ‚ËD¨€!œD9Ü #&q-$nã ôRõq…'im|¯&4e| è„(á+ÌQRèß:VÑ4Õ†¢æãSüç£U£ÃF} ™6êSOVF}1tj”Z2ŽJ«öd2ܬ$ÃïQ¢dÖ ãd1r(I²Æq†Õú02K^†‘yr C”jrnÑÀßz×zr+QÂ0ºsô³SrȀጉ1jŒwškÂÌWXÂxF«Üúz\[ìcŒðe´l\‹Yå×¢5(Qª­èœÚ[´¹JjTâ ¨6c^-5c^=5ÕñiMÍlÔ×Ró:>í©ÕQK+©µá†)Ý ÒÆ*À´èj髢Ĉå‚b JÇ )~zyýþ¯Ÿ?ß¿ýíÃï/¯_}üó×÷¦ vƒòÓËëwïù”~D»1ks'QËcsÍÍ _ù2½{—^¿O¯ß|üáczý:}Öêçé‹/^ðïÿḡî˜Þë3î[™¡H” Ó+5–±’ç®~Šëí"ѹ72C±Œ^S,l=ÅÙUŠs)ndBQZÏ"kžJ·Œµ±Õð@NÁȬž5âai¹®i¦s5{ÖP2[Ì¥¸‘Š^³Æ^(Àa{—ŠfTÚº's)nd†¢iFô}E猬bó0Ð帒*Ù=Ò¾š‘WŒ²ŠžóŠ^$y@—äV¨7ô Ì„s$h\k6¤!¢%#û<…Š\$:™Sô“¬< ­œ;ò5‰˜Œœ a&L%áž­ŸïæR.Zš“9E1é"O*¹—úæ‰xâµ2ùª-h2§ç¦\5žq Yž¥f¤Úç“袼n1§ç#fzb„gôê &Ü=7=ߨå"Ã9w"C°¶L8áÍm'ÛÜ™÷¬ix0—âFf(zÏŒSæLë¸ZÆIêç|‘âÁ\Š™¡h%',)8õ g]ñÓö*Ì¥¸“y„JVËH‘W¨dÎ%ÇMú=‚ãC¨ù5ÑqAç>„>Ÿ¯’#ѶvVrÃÔªwΗIÞ Kr+ôÈuHkŽk8 º·M™ù!:™SôóiÑMqpÛÊH›üÓ\¹Jò€.ÉÐD‰g`9Ö8KJ.~™é¢ÖD.ÅLAâÑ+%÷ˆÈmÜa)]’ãȃœrË­l#Îñ m2 ;ÁNÞr´Xž,i|äèw˜ýYÅŠc/äP܇[†Ú2:v "6çó  ÊEƒxCÁ¸e(qn¥7EÄìrgù_¦x0‡ãFÞrä¸+ÆI°îã®K<³Û«x ‡â>Ü2$CÞ1nØÇS{gνÝÙàôÉ´Ã ²¸Z'sîä-Çâ‘¿"ºZåü>™õ‹†ñ`ɼéhˆŠâH+X! >g¹Ãl~ãdÇ<íÏv yG#¬  LOøóù©‡õš©º˜P|Ä#¹j+2 Šgæ™"r+Ñ×çÙêEsu2‡äFÞrtpÁStrÑp.Ùï0é¢ g2‡ãFÞr4$Ã%ïúm;·fÝëx0‡ãFÞrDЈWí*e5`µg’¶çp¾ä9wòæž#„„¿¾í9H@¬Ýy¯Ä/RœÌp|À{úà¸Æ‘KìÝãÕ„xqθemç«vÑ\=˜Cr#o9–žã BO[Àı é–GÉKñ@Å}¸7ÃxMÇ %E±Ó•xíNÖqÍ™j"‡á>Ü4TÄDäŽHVk<çÄïŽfÜyuæ¢y:™¶™·K¼`œÇ¤†ys'ç°‹öÔÉŽ{·]T½f㘢5ÓíMçÌÝöLÕc'’ù!Ž/º‹£†åPmÅuÍõÎK¥vQ>>™Ãñ?ñþ ÒÁ„ endstream endobj 5089 0 obj << /Length 1831 /Filter /FlateDecode >> stream xÚí\ÛrÚH}÷Wð8®ZÈÜG³[¹T¶²»U);1Î±=Dòõ‘ð¥Ògmºòàé>}ºgX‹æÿXËÒ–¢ceÔêŽèòÕô²Uþçã»#VÝ×Îolß»ó“£Wo•j1Ú±Ô²ÖÉÅý:´¾÷ÉÀÍÿ;ù³%™êh¡óZ^`Ö/½9¹ýxÅyà÷(îüé‹ÖŠ:VkY}ɲüu'éÌý§—>ů}õ6ºwó—6cŠü~Üf†—?؃à‹ìÙ¾aù÷ó?·aŠ——™?ñüñjËK³YÏFâ… ³íT…V„IñÛq[HA˜¦Ë…°BT¬ÍÆ©‡ª\ðƒÃñQ<΃ ± ,^a¾˜8ÖG!o¦µÔ‚H†òÀ]€áBD‡J^(NpJ_† NtTÆ[Lv„Ô¼¸©M;Rç™O¨U¾§Ð#(oËß©E²OÅkðhzàûQ‘¦xTŒòõ«`–+  Ÿ¸m?pô!h­"¬Gö4yë‡`ÞŒ4rz“ÄuD”€ÔÉ,ù—2 £Ì-C`·à·42/B"‡¿§¨R¶W)ÆÀœöÉ4‹kHM9ÆŽ°ê&R$ bñ·™Ã(½›(mMâHmIÛ5õ#ç„ëª`çaìÎzã9(°©EHK•ÀøÊ‘üíû´?t°'¢^$¬ ›aîC§Ã Kã®5¤Æu_»î-1" ß©ÿ[ T¢,(¤©&ŒU¤U `§¿?+ÍŽžOâtQÞ;ðÓ,õ½YæÇÉ®7ÌóQŸ¹@¯)¨&qÿ8§ÛWŸ\†TUX2U%“ 2[ÒøÚ ±dÚºdŠdÊ0þY‰òòñU•1*i2ˆ3¬«vå~hýÓÉÔÜëñMÒßD‡Š0Øúdä¶ŸÜ2k(Úɧ?À&L„1ä1$—Q@ƒn6u¹ù_:$t¡5¨è¦.-l|œË 2N¹¬Í\³ˆ}ùãÒØ¼¨ƒ¬=pEk¡hŒ-Kñ$Ï—ÆÙ8¡c\¾ˆ²^PMtH1?­+¨Æ€XëJÛŸ{éÍ(› ŽÚŽ,tzáSØôµàôÂ~¦Bfx®ã!ܼaœ"òÛ O±:øž³ŒïÇgàüº•Éõ±2$N}ܺ2‡øÄg>úï®F•(ó‚U¯°¤[]ÃV×ÏUÛ…wC8Zþ‚‡R„ ºjÓ¬2` \à8º`ôÀ´ƒ´yB*M˜Ÿ—dQ€ùïqÑ& ¶b’Ô’ˆÖ£˜örGðL,ë:eD©p37ϫڪŽM.)^ÎVÞÀ°®¬ä³£™.Lê€~̧߯ÙÜÀ¢§)%L‡ ëÝÍdœfˆì&ÈÊä\!{åü匯¡“—'vÐFË=vðøÉ ìp6§³‚«n–ä@à&ÐÝøAvbGå¡…¶È4/R~(A,оÍfœŠ þ û ÛœDzg»ç¬%àœÿµO³Y®=—úûb–ôë'˸=” Q2NtÀŒÏõØÃVŽ’ÈÙGÔ®  ç²£k©ˆvÔªIò¹¦I²ì‘kË»nâ4ÁMùûÛůI}¨7ÒTÊõÞ}À享ä*×í¯âÌ]»‡Ý7v:€ÑW¥EFoÁh!ïi”{.0^*”Ñø˜“1pEöô•Ò„Et=go®ü°¹_4ݸ_ÍÕú`üùÊÃÓÈ,¶IìA°¸#wæÚÓIܯzÓņ™ä²Ú>ã†~”_OËK£ñ² 1€÷Ð1úôD²‚4®àUD¬óupo¿‚Ü¡;vùd³)™z°¦:Lc­á$’;ÎŽÓ—Q,ÿÏ&+òb9(é§5¹e›eUT ÊF, Ã+ƒé}×­±š›çh[ùëpVqÿ¬Ù!ªŽáœÇÓœSqlå9Ó(¬™Çs?ð~Tð®I¿º8•4À špXv¯Ã²ÊPÝ ãÌÍá,Áå:’ E˜Ñ$wßfñpŠøn/Öó÷ì â»|Wü]úˆï6ø²þÂíÛîzç´qFéîQüóõÈ^7ï„äËI\3‹®@£+ÀMå ð€¨3Ÿöã!C²«cH òqyt‹<*-ÔW™g¾<’ v½5æMMsFíz"Ÿua#ÂëE‹ÐVQš©ê¬ÛPÝàv‘ší"!ÞÓY÷Ü¥ctøöäð­ø{ŽüÝë苃[ nMç1v1ê»c¹»AóÓ lÒé}Òû¤ ôI…OÚ=Ããö÷zÜ~ˆÚ=LJðëÂj%  ¸kð–ÞèîÐÔ!\Fp¦ÓÑ›“£I¼\„ endstream endobj 4894 0 obj << /Type /ObjStm /N 100 /First 1011 /Length 2398 /Filter /FlateDecode >> stream xÚµ›A·…ïû+xL.²ŠUd‚;‚rIÁÒ!‰¡ƒ"/ ÃÆn ­çß§ŠÓ¯'fäÀÛ ¹†êþ^?’Å.v·Ú(”Jj£pªU"h‰¨G ‰[‹@S“ÙÒ“tŠ`$¥næA-Éj ¦ZhÜyDNl³ÍÙ4 µ¥Ê:OTÛЈ4U9Czª½Î¶‘ê Ùf©Z‹6*‰ŠDÕDµ«kùÅŽÙÆ‰Z™Ç¹©³M)Ï6MÔÛl뉆†Q‰¬ÇU¹ c\S g\s5×`ò~àðÁœXZœË-±ÊŒ¼—zŸ«‰Ç÷Ä6ñHíÜ­ì?ÏýÚ¼»Ïã=뢋g›‹ë¤œû~¶9ÀêlÓ$…g›Em³m$!«wƒÂ=Ô¤$ñS"ªI´°kùèÍ~N2¦#iIÌIÒ¢³M“ÖÙ/>dzî]ñ?÷®€ž{WKRåPóÓ´·ðá—¡c^‹rR›Ž´¥^æµx·wšŽTSgšm=õ6éH]$æ¢O®“ÒKê}^‹wq#æ•ÏÀQJœÛ9ù|‹3\ÈçBŒ›£“ÿÑ"˜SÍxW{?”1’wÈÄùô+<}tŸ¥ñÄø,2tŸÅýE«OÁÒûDÇì’á½–éfÄL?óˆ4¢Ù·Ãçzå9u‡D*ÌÞõ)ïGöàú(תV\Í/¬Ö1MY{móc©ÌIc~,Õ˜&ÃüX"™fýÊhš´âWF>_"¬‘n~²‡~eÔKÌŸHpòtº{ñâîôößÿºO§¯ŸîNo>ÿóiþþË?ݾyüøýýÇô]ñu¡¼»;}{ÿá)}ǵe‹yÞFnÞo,”£w¤åjÝû:½x‘NoÒéÏoÓéeúƒèÓW_Ýù¿OR*åî]I!Zª·[dÍÕW îš-ò±µ\L¯júx¦É2ò̶Mtš\)¸»$Éìk “¹˜»döÿÛUQ~î@ö̱¾n’Óã:¹ÝaÕÜ}µ`Ù»9Öß,r½W4Œ›æ´¸Po÷X4ÇÂÇÞsýðœñÅq±ÉMtš\)—l’ýsqYjnBWE•ŽYu 9M.ÔÛ=ñ@öÙÊV²/Ú×;–협„h˜\*¸»ì-‹ßqY}Úx…ãd¯©nLŸqËMtº\)¸»T_À)„cÞøÍRÍç­,v¹‰N—+w—¹õÿr)–It±ËMtº\)¸»l”m»Oƾ„›åzkY/Gåå&:]®ôÒ3÷á’c«$ÅïYí¼ U7Dõ —%ú Á£Æ’j|Yb©g-¶ØäYsz\©·{¬5{Ya½ø*×sÄÆA·ÊMrz\'·;,%w>wgªÀË“ëÝÚÚƒ@sZ\¨äyƒÇ–Å÷~dê[ ¥7Å0¸P­(ûÝ_ïyÄC£ìýéêâ’׋~控YÏÆc×”Ò}©á/kÖƒzšÑ­_г£æßøË¸T‘ä¥ÏÐëå5s6Íéq¡ÞîQÔïQmß¹’>\eí2Ñir¥àî²I6‹g°>{CÔ Ÿ®‹«+ˆÊjÁÝ%÷Ü<7÷ùÚ8S½þ|§9Èå&:]®Ü]’g…]*ebʪ·Š~ËMtº\)ØŒ3{ºÙ¸W¡„$¢\ëÛäAuò®9_ÜÖ«rÐS3*’»]ª+òÒGnÌžÃLnšÓäB=x¬>žÍb×꥜×ÿuPŽ/k«^:øOߥÜx;Rå™;¿ÝgòÉM²žc’¬UöR/¾­Yíüþ)>òÕn™hÍS»QhÂè4õ™Ï(b,½ÂŒï«+•_9«¯În쥟éÐ(7_' ¹;\'¥äÈ‘J”ãÞ¨¾|ýyH“玡³}E…æîp¥fw_žèÊñ0ËËcÏ¿×ióôWÁLÙÜ$áò ’:ž=bžs+Û²¦ÿî¹Ýú†¨´ì@—ІÉQrÔ#•)³ª Í]o¼éîÇ #4w 5Ãb÷•Æâ)ÈÈïe»ærã»p>Èá&¹;\'%>ý°øG¹yE**yЗÎvÃMsw¸P3,6_²‹î‹ªHË:®/pý¨iºiîj†Eöé9ÿýS|á+Ak¹]WÇÜ¡¸\¦öH²P¿d!û‚gã7ž¡ÿ,¡Ù^ endstream endobj 5091 0 obj << /Type /ObjStm /N 100 /First 1001 /Length 1900 /Filter /FlateDecode >> stream xÚµš½Ž%·…óy †VÂa±~ ,È0àÄ‘¥Lpb{AÀ® ¬¿½Oqº9Iß1àÛs9s»yø±ªÈ*vËhRZ‘Ñ´Y6¬tîÙðÂÙÀ/“lŒ¢AhP+6<T‚ò+êetÍjB/h zÔyúîÎÙ²B³å…dd÷… ]£5 ù쥷BÁ9œN…†æxz/½YÞÛ¹tŠ.¥÷‘CÂm]Zªu(eÏÝK7Îáõ(Ýeö|¶¨p‹T8Ó$c.ÌÄÐ@,={a-¬’³…¡±iöǘ%÷ù¿(szx³—¼˜&›à‹ÞSCÓM#šs%è^-)sæ9zÁ%ó^3ZQ´õylAœßj+Ú5G T”-{Æ„©xÞ¦\TGr¨õ–¸FŸwXÑ1­ CY“Ù_£9C:Šõ9ƒÁyäøÂtÎ3†kF³ÅÅœ;4à& 3Lá"³ ÈÛ´¾yqzë%Šs›ßŽâ2{Á$ºöTƒQÜf/Þ‹»ÎÐp)>"{q-ÑFòºÍ–—àž=cà!sž}”Ð9‰¸-lú2 >g(z‰9pÌÑš@#¤À¥³—P8öô!8< uà ¬3™Ë1ÃP`Éoñ :Ù3sŒ9ÏèžZ›ƒ $•i}g Dû¼À2‚æ€àCÔlÚ ¡BÍß:C˜4@Â⤽yf“òâlB¡ 5ê/Ÿ>½¼þôŸß>—×¾|ùúíåõÇ?þùmþý·_¾üúòú篿ÿûóïåç†Õ ýãåõïŸÿõ­üÜÃk ¤á`U3œ†×†RæÚGàºʧOåõÇòúׯ?}-¯)þ]ùþûüüŸšÞk:’ÖCôè•`$í½ZÓKÍnOjžœ§æÉù‘f<©iQYÓtR®Òݫ¹•¨Âù.5©?Ë »a%Yš'çGšâ÷€ba¬6â´Qí4¶‚.Íô#MyÒ‹2üCª#±ßU›Ì c—zÎ÷8í©y2nÕ<‚SðÉØôÏà5˜¯ç•nâ<5OÎ4•ž7¥QµLI†ÕÈœÅFÕ¸vgguô*¹Ý’‹pŸdj«™-ã35ãßô›lxh.š‰(X×°ÖñLD¼º^¯ç!7!š q£f"öQûÌ4ª цªíZÉÏUõÐ\ˆ;E“‘¢jf@øì™v«l×q¡q“ÍŸQ3›×Y„åTf¶ŒLÄü:0ô®`<4âFM ¢&šÞƒ<¶Î IrîëÀÐ{OÍ…¸Q3êæžqX‘‡ P®'ô¦”õ”< 7J& §*U±c¡ FîÑD·îû§æ"ܨ™ˆ¦•‘ÒÒ Tƒg¤¯×‹›ÝeÄCs!îÔ¼TT‘Ü÷ú꡹7j&"+2äUud& <ö–V‡æ"Ü©™ˆ ZîGá‘O\œÆßóˆã”\ˆû$°žyº§UëˆÅÞª¶'7ÿŸš‹p£f"6øgW!툔kQrýÄú¦,î”\„û$“™ïƒ T­ùÒ 3×høÛµÒƒŠüII%¯<ú’TÆF¹E¨‘Ïú@ˆÏ—ÇŽ<é7¨ä¾D'ãNÁE)p!É“À^óµ!eÄåƒCG{ÖŽ½zè’œŒõbžý{7$*×ð[1ßeÈCtBî\”ù8LçÁµ£0FyþàÑ=[¬.È7ÍɸSo1æó°Æï–DõÊÑ·,tË[Í ¹Qo1bëõwFjLÝSã,C¢r§àI‰âk[¾â@p›¤nXÛ}ËÑÊiÉSsBnÔ[ŒÈ!ÙdYëz%Ù“/ÆC3wê-F‡³t,;([)ßôÀ^}½ °ßÄxhNÆz‹ÑË7­TGÍ«ÉØë«‡ædܨ'ÈóEiäV½æ•æ+ÊVGã-/W,ÆS3?Ћ»|UóùBy5GŽ%ðYµ-­ßß4'ãF½“Qóùüáªi^¬ÙÿkWþ/ï„ endstream endobj 5105 0 obj << /Length 455 /Filter /FlateDecode >> stream xÚí˜ËNÃ0E÷ý /âÆã¿ØQ ]¢, UI«HPPŠ âëqZ )¸ÊC¬,9×cëøf<0á/`N0ƒÈYv~ÙóÖjÌGxÔu½°ÛPöÒÎö¾R wÂKGÍPiÎN“ÃI^̶ÎÒ>#P\£öæ/ÀÙº¹³—>‡WR¶œG­|5+GÒ²žˆu\¡cڤŘƒzÄí}f¹Óšjà¤}DÐÜ·Ýg³rŠ ­mHO»Òêdg« Vn²uã‡;|M”ïê0G$W‘¶ ( ‘ö”£U”‹êj¸[†1‹_‹ä;:1cb°5åa^Tåmˆ5 úËCè¬yn ëEƒþ€A{Ñ ›´böb›Š.m6ˆK¿i‰KIÜðe 7Â,±§U6™Ž®ªËèØ'Ç*±Æ±ÂbKrwå$/'ã7 úw ÀD©Âõ0åS™ZÜdAŒŠþùÞ>J?¾‘}^¾Îª› ~)"þ r L¤maûéyvQ„gJFØëR4ªȽëëA¬´Ñ¾_•ß „_ ý¾ÓÇÁüâ(bÿôñI EÉ28‰kðkPÿ|ðN# endstream endobj 5092 0 obj << /Type /ObjStm /N 100 /First 994 /Length 1936 /Filter /FlateDecode >> stream xÚµšÁŽ·†ïó<&‹E‹€`ÀŽ _b@°tHbè ÈƒÀˆ±k¬V€óöþ«¦ÉY3+Ãj‹‡Í?Y,VuwM©„jJ5e+Hȹ[¡.^£¡ÔfT‹¢@)ˆV+PhÝkrèä5(e= TÐcñ:ô«7“@ܼ®*êuH’×õ@¬.§@Êl% ÔK±R9‰5sÈÔ2¹`°ÞK®!—ä¿B@%on! {†ÜŠ×õÕ{Á¹7«c œº×åÀÙÇ8350¸`ØFÀ5põ^X‹Øø³ÔšXIk· ãŠÍkM%…B€…’½ÌiáêuJ‘bŠM&¬ˆ¥H(šŒdéÙëôŒD kAÕêì_«³NY½Ã(ÝFU1HI¶ð–m•ýWüëÖ$a%‰×iL¾•zì½`¤¸y©Þ‹ä ¨´iÕtHa4Ô Ý{A§-u³( ²eò+44Î&R[A/ ¹X! =­Ân; h-)È&>Š®¤c„ynJÂ5䯅hV›’f=ûR´ŒŽÜD¶a´´¹ã2°–Úņ ÛèÉÍÃêÔ½ÔCg2˜ç^|i•æÐhŠ] >PÞ›ØZBWõv5ôÞ Å6À&2H÷ýâý@Áî¬#° ¬xk[}e:ö &Ñk±i0¯Å®Á4š=Àþ‰l ˆ}CÄýðâÅáøö¿œÂñë»»ûÇÃñͧ?ú÷¿ÿt÷ßÃñ›û‡Oá‡7ގߟ><†0ÆH˜€¢=Úˆ°ùJo‘ ¡É×áÅ‹p|ŽßÞ¿½Ç—á/¤é¯á«¯øûs<¦; ^;.f¬VQ‰ÜËuh-_½ˆûíÑ÷ÙZW§JÉÑ¢pæA2‹Â¹ß8œÓ^*7¨«\ D›AJ‡kóT5Öb¹b‹…eñZ¨ à9ànË0¤g\á 츔xÃ×ퟤk\È»HLpàõâx‹ô«Ež¡.r%pª$X rű¹Fêm±Èé"W§H€¥e7! "X}Y ¦‹\ȳÅù‰¹&Ž--ΙÔE®N•ØøtªÌÕÎ’Åžg@MåR`é™Cf‰~?ê|‚dhíåz”Õx'‰Ò>ƒÛ-6ÏØöÅ­õñdF0Òom‘2­«S%>¥éEeF0RúZÇ3 u5pªÄÆïvÏ|¨DæÓÒâœy@ëjàȵ{“Î÷=×ÊÈ}z•¥¹ÖdúSgx;­$)ÌÅRæÍ»RO1§¾4×LÓ¸’756Bèx±Vj=áµñù€ÖÕÀ©RÈÜÛ̵HºÅ•ks­u•+S%‚V²µÌ%²=NAês3–L;‰Ü˜.r!oj,^/a·9ób‘ÔE®N•ÙsšiY8Ò§!ƒé"W§HB–^/i!i¼6æL¹75¦~ytGV¯‹Óu‘øÒ{Ptù}8þãŸÿ ö:§p÷éçŸß=×HÀÚ»ŸmÈû(åÏ4s÷yöhY  ,èµÎÍÒÏÿî«û»GŸ Wø…ÚùªWlNUËöMCVNÛswÊãóðãìží ú>¾~¸ÿðæ„Õ Ç×/_…ãÛÓ¯áÝïùõûÿœÇ¿a§»Çö ºÚõ¶®ï?=|8yŸë¾;ýøÓûoî=¯¾P­[°÷úý®¥P?7tÓù°¿`ãñ—¶B…2 udÚ(è(Œžuô¬£g=ëèYGÏ:zÖÑsmúhÓG›>Û zô¾Ñí!ÿV Q8Óßýùíd–--²iÌ¥±›Ä¼hû¸¢½g3 v7Á^ÍY 5‘µF£ÙQ¯>ò‡¿4ÁÎÚ¢½˜2˜SãB¦I„ûmd›ù’IM‘o»IܘSâB¦Iä9×Ë*ÚýáGøn7攸i3r¾rYÄÜbíy­Â3r \ˆ48¸ëSwƒs-§Åk¸1§Ä…Ìq‹óh› +|·ç5¼4±L ŠVò¦FËq1¿,"NAžËzYx'Ó5.äMÂÑ‚fŽšì»F­eÍ­Ù¡qcºÆ…¼©n»Ö2³© ŸW–Üxš7¦k\È›KŽöòñ¸ $øl·îïuh@ëjàTÉÈ>ôòš02y‘µ¯ù ¨«\ œ*íĪ:oH†ÿYõü{ªÜ ®r%pª${Õæ‰ÊgN­'Ðßk V endstream endobj 5124 0 obj << /Length1 1682 /Length2 9279 /Length3 0 /Length 10353 /Filter /FlateDecode >> stream xÚ¶Tê6 Ò]Ò CI·twHw×0ÀÀ0C7Ò%]ÒÝ¢H‡ -% %H·¤t燞sÏñÞÿ_ëûÖ¬5ó>»÷»Ÿý®¡§V×b“´‚Y‚ä`PW6.vN!€´Š'€““‡““ž^ì ý-F§×9»€aP¡? ¤A®2 ×G; äpñ¸ø„¸ø…89Üœœ‚ÿ1„9 d,ÜÁVv€ rA§—†9z9ƒml]Óüç`2¸ùY»$@Î`  báj rxÌ´€´`@0ÈÕë¿B0ŠØºº: qpxxx°[8¸°ÃœmĘX`W[€&Èäì²üj jáú«3vtz€¶-Øå/¹ÌÚÕÃÂx@À@ÔåÑà jr<&h)*ÔAпŒ•ÿ2`ü}7.v®Âýíý+úÛÙ„98Z@½ÀP€5¨É)³»zº², V¿ - .°G w 0ÄÂòÑàwå9I €Åcƒ·çt;ºº°»€!¿Zäøæñ–e¡VÒ0ÔÕýW}2`gðñÚ½8þš¬=æõùXƒ¡VÖ¿š°rsäЂÜ@Š2›<ŠÐÿ•Ù€\¼œœœü|\ä ´åø^ÛËô[ù[üØŸ#Ì`ýØÈl züA÷q±p\Ý@~>*þ¡sq¬À@W€%È Eÿ7ú£dý~¾3Ø`ÄùÈ=.ç¯Ï?'“GzYÁ ¯ÍÏ—ÃPIAYC›å¯ŽÿÑIIÁ<>l|Ü6n^Nçczþǃ߇Q·ÿ]ƾŠPk@ð¯j¯é?»ÿMÆ¿—ƒ ðß±Ta¬ÿ%¹1'/'ðñ‹ëÿ™ê¿]þÿþ+Êÿäÿ[œò[Íø[ÿÿQ[8€!^<’ÖÍõqT`ký_S=Ð_K+ƒXý¯NÑÕâq $¡6.ì"öY©ƒ]¶qå/¹Î¯ƒ€¡ u˜ ø×£`ãâäüÝãbí—GBþV÷æ¿SÊB0«_ ÆÍ˰pv¶ðBñ#âøp=n¢Èó7…ìP˜ë£ à±9?€5Ìý×<ùøÒ¿D¿‘À#Òû >"‹‘€Ãò_$àþƒxu@䱉ÿH^¼ø%qpø×ÿWwV@.èÈà°ùò8ÀÀÇá#»9 ÀÇP°? 7€ÃñßJøÑ#Í`äæz¬Îùø˜Ìåøèáú|¼·?àc)îÿBîÇÜ^¿áÍèæìüø0ýޛǡýÿ~A O}f ±« i½¬’$÷`Û ßÐKcbó™qþäv’Âô!+hÉù\2e  w~M–ñLb–êÎg·¹%üc’FËï­Y‚æØF ú÷Q¢Þ¯E»’µŸ)Ñ(Ø´%~øÞ9ùêÚ#4÷+Ñç9¹ `«\zôÈ{Ö~~;76µ¡ñãßKŒÛ·ãl1:ÑÆ¥“ôù–ÙßHh]Ù(Q™ñ=q&ÏÎ'ðs¿>P)%° ûíÅðû.sÇ^}ó^x§ÍíÒAJGjHB‰p†?4öÜGjëñ´OYIô’ètd\ÿlHOâ·—º¤4¯ÔIœCÊÙD3”Û è:r=€™Î]àWUÀsªZTŸPú2yë¤JÚ2³l °ÿÕ-¥V¢>¼˧Îg{û:í,8Wr’£Z'˜ ÏqS& µ:eŠçErr¬¯Ènîfà„‡Ç\…r ÔdìÌ©z¹Q—Ë«šÍ=K&/†ªoƒ³”Ýöwqßqû†eaZ˜ÁoB>ZI5ó0P"n ¬„šwí¿6Z*~vdòŠ_dz Ö„'xµ`Z®Û´ÿ†‹O»²*†£‚k¸ê Ó~:ØÖäNŒ} þZaßL8è©¥)޶”‰ëÌö ó60Zm®dìU̺›Ì}ág è«E ­pÞaÿ’}jrÍA»ÌØtúÔ7Ë6â9y°LÑ ŠÜ"v¢„jÊn¹ñOTòˆbj7},û%Ü59käNÎð²ÕtàƒA 5ÍJ×b…!Ã8(¢\àIî›W/è}>­-ŸÎ€|8ÙÑÍ ’lYð†!ë}uéÚD>¼|wÎrµÃTœ-zPé6ã×ÌYŠéÃå ¤hèËÑ9,šKo”8]«c—¸•üÖEç…ã0óÅæ(¦x<_‚'¶aì Ã¾JÌ8 ¬ÑÓcàòé׺á Tá-·Ç­*2Y°0×0Ùô†-²Ê³¹ØÜÝL”D¤üÓ]µæFôÓ‚B´ÔƒI\]~åKß![ÂÌØ°µ”†Ü°î)ïh'Gf8@˜ÓW)S׺ød¥bÿËc›2[ƒªz“UŠ !¹’ܯ"·ŸkLü°@‚Šs–µ–a´!ÒpãXjÑWMI½8RÏ¿ªËêÇ‹‚, B5té{ú¿š°Adf:Eów’ü<ùv=LØÏJOÔTzùýYÜöùG%^<ýšì¹U®T>ëVÑÓ?çgç e&!/8Ü@™®ô/{ÊQDŸë6:Õ`ŸÞ>qSv¢d\ƒœÓÍ—^ð‰<š-˜ËÄõ#µhêR†¢Ÿ6úF½²K­àÅ}1OzO–›.ŽKêrÿm<Î'ÞYý« ƒUâ‚È݈ˆ€öû²ŸŠúœ Í/¾«Ž¹»PmÉï~#ŠIcŠž ³–Íß8ög»HñÖüHøº3‰k‡>ñ+”THF{y=5îN‹˜1ñì\2†ƒ ‰ðˆ*»d'C(í;ÒðOÛRŒfC¾Q’P8ÖÅ1[³Lßó*Á°çØwáOÈ^wŠ3œêY×êÍWŽ"¸EÆ%ôh>‰¶._!}Í™ë³bÏu³uºÁÖ¬âó6QŠØ…|j¬~’m üI±îlžž¶‡LlSÂÕÚi¯!Ó¶É”¸€f; a„xÁx ZÒ”~ï•Z’·‘6ñõqbÅIo>û}Éqës>ˆ=–“HKEYÒ{}hï¶ê#/X‰Ø˜8Ê”I*µ&Ö%Çå[ƒŠÕèEÚÑ©îhÆ ƒrÀáR…UoDT¤„ 4ïØY«\öPÏÌäs}w¸1à$rjK`—k*/¼‰æYY©‡§Kv5«¶˜d9Ë%¡´¯Œ©‘‘|„Ë'ãSŠ&·¾UU=°Bå4 <²¶½5B'‹ªaºƒ«s*™K$ -ެ×áGàë køì+d1vd— l"}öSJÌîfüˆ? ©ËÚ‡Ë"M”þè‡ñÔܲ¯ŽVëý9R$?ßϘ\æ·$ɶ­/‚ŒN°R'ËÌé47‹½8C5(ʶ5+Ÿˆlød a>°®Ù‰tΪö³|Yî⡄Д:†,ˆÄ6=×Xäpñ†ñ]]‡ÆÅ™Ä­$ÍüƒËVø[‡»¦KÇæ±¼/‘6Bh¾èe;×-EMhé‰p¥‰"µœ¼I½¤Ñ‡&ž.Í–«ÜQ¶N|ŸÝ¸Ý¢Né/Øð†ÃS›hÑRÒ§‰tÌÓ³«C´"&¸†züè~nNº‰QVƒ¡êàöÕÃaêï¦ß+5—¥ëùÄXOW°™}y·ù¯K!ì¨ã̹e  u)–töä5>efg“¨¸“¼îžÜ|§›6 –³þ]ai=ñÚçÔÊó)ÅÞRÊJx# 8O"FÌ6Q‹¾ýʃ±ØÆÙ|q]…™‘uq· Äû¸‡ŸigéQ§/‘‚?~BÆ ëI3ŸòWëH: ‚Yª¹pKuK5:Ôø A… Óƒço≀GFœëo?xÔÓ;lí¼øúʃ´3U‘sûJë ÖU§þÆ<åŽL“(LÑZY?æÜèc_G&¶ÊbjJ [ÔpëQi‰ ¢:ÄT—Ï¿«e« — 5$¡yÂÈã©ã7%Yú('èž¼ðá¦ÔRÍgBU+kÊgTK$;~yˆÖä#CŽ º»Ä0Âîn‹cK^Þ.dyšJ…ßÏ€]°(V¨àÛôˆeRûvO¶Dî|󱾆ÔûøÖ3/ªJr4"o¯A†ªàãÏ {;îÍdï6Ó¶e ¥º!+Ùè‰\ÎŽ9ö&3‰HÕ¨S«Z<Ù&Wu#<ÔÕ»3ÈæFA¾,×A¯d(´uZïL"Ïtó/Þ,ÜÙ€eÄ–‘i§ŒÒHß¹ä¤e°ÝùÍ„´i¤!Ûb¯vAò@!žUÙ7èÚt’+Ǫ³È ֟möNÍ|Þ»ÜXPõ?»V‡E’´ãÚ‚/ ŽÔ¬§a¡“ŸòT“¸ò¢9\ÔRÜ ìßç]cíöô;3®Á!l^<ä{~\W^œÂ¦•bªæ´ï©²ºEse3‹x@$QÞ>«Â) óJHÏ{¸cê}qi=[Ò­¾ _à9ÒðkÁÑwãEÀ÷ƒlm}ý#ƒ\dEšH–ܞݶ‘1ßEŸhï©â¦,ŒÈdÿúûw;:=CdèC6ßÉgúlI>.ßhâ]?Å#ÉÆ…ƒÝ}×È8Leï»éy–Ìiä!„²’Uñ€Íe*GÛA͸é1ÊC”L“g‰fXÅ SvYÙlP{žË™‰Ÿn†(¶'ÈçÌ]U‘ÒÚ1”é¨w]ôyš^pIÛBÙi/øt<wwdÍe)̼ÚôQÀ »ÊÞÒEÌâ/@8Þõ…iRúì||\´ 6%ySDTà˜?à ÞÝÜ€½ë SBÐ(úžå÷F,¸Cjù ¢KÌÝE1Ô L²YùDÏñB•„â:O’y3¾a™<ðs.è׃ëâW"­…Oz/úWiÓybÚ„Êå‹÷Þt…vŠ*>°’Üí„ëROEË 3? to±— ODdƪÜêEÓ÷èûX*˜O‰ ¢zâLL­jsÏr(Í—ò¨tE {ŠN]±T¸ë…†u'«¹Râ‹:Sˆp8CþÔ1NƃaWÞU|=ëì¥ñ^쾉O"}P-F(‘ ¤Tó­ežØÚ˜á«{uýí qáå”|ú=ºû¢v*/œpÌ÷âöç­äô]‘1‹;3Õ×­ò{¨Eyp`bÄH–“’—h\Á¬„ŠËŸ+xØÊLŽ—8”Ò¹Zó ß‚Ìë…Í­sä‹'&™1‹ÊàÀ”iωIÔ[À#8X†Ú"d¥¥þNê¸O¬#ZêÝÑ^Z}N:¸ú·þ¹—ß«ƒ/ZQxB-(žQ/‘¢Y;¡ áštC›OpP°Ì7‡Í•1îšà8“;^õÙ¯o¬˜ÍÌHG²¹ÊÏ‹mGœÓY+ü±fTÅd³ÛéÞþÚ†äžX ²ó ß’Kjh±pQ"¯¯‹6lñ ŠÃ\uS_ÐY¦€ª}ŠKí 3ánÍ5ð2òã\ "¾À¬ä%mø¯š(ûçoVšÈkXÂ4þñIqÒñIË*»êÁ'ºr‰…TåH°i.KØÓ_$²M·½ùþhÀ1´d„n_zóM*ü¾‰˜ÊYrby¹Ü ÜBðÕMQÓð¦þg r†ޱÖ\¬lJ%›<­ûV,'µå÷•Ó˜3éiCï¥ BÅÆJÝW² ıõúvã°Uî:ZÄôÌZU—i…$vðlin¬/eNêD:N¨Í‚Lb´`¿ÀîûV~}ïbÉ.À‚IÒ†Î;íéq÷« ú#Q‘«Y6…HwT ÓQúˆ¡g˜CIWý#cȉgT_T—ê²ép4R q;ä–8¦°î%˜îRÂ\¨gBQ5Å’\2Ë7é8'°BSý&hGhØ$bUÙfýÛgÈž­\iaBŠÏ+ [2!WÊLÁÞ’a;I">%è;YGçÜggE_¼µ„¹‘³_ǰ} ˆñG—æi ˆ×—6y §ˆ`~yZ6Á×9¸2x¿?ô–"ÉÂJGäÚ{>GA«Õã³÷ådôÆWòÛsu¼~Ø”}iºøºqÔ(rs;æí4u‚m~Ïç>ᾦLƒò[³[–0ÇxZ@ö6/Šºð @krÞ º[ÆîGÜ7…æ³µä†bèÑô§ÙŸ!—Ôbóýªà̙П±Æ¬ÎYOÊé¿7Æ­?É>ë–Œ9Åefäÿú–ÚþF\Ê‚Rak¼î‚göÇ6^ƒ âý-Yü¸Ì¶Q“Á¼;¹sóv†–¾J³ìbSJ[d’CpF7z$7Ò“è©´c„¾’ÞA„2ÿfb3\YêêU,Û>5gÅ9ÖºhÒÙy+òÑ¢A„ôÙι[zsL¤lœ™Y½L0pņý¼¬ŸuóÇ~U8FMÉhæ ßsO­‰+"B &Wš^Õäö먔ù+;Ÿ_ª ì’F´‚ësüá #§Îu§½c|¢œôÌípõÝžÚ˜~%¢{4Z–oç5X­ê%"J®D||Áü5½«ÞEAÔCÐäÚú _‰”ŒmA±±®÷…°¯eKñ#’üD˜ÿ‹bTÁRdüp:«Ãσò вL¡õ %ê›÷¤û)vŠ…˜,I׸ÉtïÁ—Ý`þ,#‡ÎÞ”9¢uA|Θµµ’³ÄÃ.t«êŸ*™Ö£ç m4“ZÓJÔ•„Fæî$Æ‚À&~¿×€Õù–ðû·%=žcÌ5+‹–C ¯ݧúZµíõðKrI³(C†Œtt›íšÙ“òù¹¢±A_ƒÖÎÌ5Ùåëñ‚¤É[ŸÐ#+L7:=lÕ8ƒŸN–Ú3Q6†v»0Xª È,ÄäqA¯»Œ|›ÝHMûkdٲѺjo8L$í|Y°«,iߣf6·S7 dRÑ,¼Æ¦‹Jåùš:Îý´Þ¦›ÀKHª‹Ì愳ªß»ö>[ôKD¤z2Ϋ„³úqc„úÃQž~Ñ<Ò§ØeÇ?¯ ÏW°teçØü,}êgCg)Çá²Ú¯Æs¯Œ© Ìë‰ €_GÇù¢ (…ÛÃ}Ëczß â £ew\7–tæQìp#9Ù}ÇŒóõˆâë<ŽŽh$$âÿþ.8^ Aeµ6b¨-<²DÞ\>9·‚‰º/ÚkZ²r;âMì‰ÜŠÈÚJ2¬Šj~¹}Ï眎q/€úc›”#…³?©ÑŸÆ+«!P…i³¶ËjÂ[¹è {¯ãšó5î{¼Øõ˜ ½²(¥*>+è±­‹Amc¾ó¢/3Ιt³‡œÔ©0ê+¯Mãé_÷ºÃ8زøúL¥Û=rz‘;&íj”±=2÷‡Çò6…^O¥¸1k ,ã’ÍÈðpQá?síÚ뭵ߵù¨Kc À%<™9£7E¾|U¹])mã'\Ô×!µE;~Ò¨9ívÌAkÛà¤0Rx:€Ø™éª[&LŒú¼ÏçÛy;\t:TieÅ[Ÿ‹3æ’Œ»õ¼Ž9ÛZ'x²‘ZmÌa…Yc"–D2Ï(‚F¦ÛŸî6†°Äé7jRo¢€eEÇôª-÷Tl„ŠØD;0ªwÌ™å:>™½ˆÂM—ê%‘‘ƒxoœÇ„Øp³7rDõ"!#} ? ˜NÞ”V§EVÇÁȤý°a{h„ö*—H¨ßûFcX€é0Ò•AõÍ0ü•j¼U‹þ'F)Ù÷ôÕÅhOÝðâ*ÄØpäpúËb‘ÚŽ) Ðle“ï^MÅâñ³oÔPàËÖ´9{zLÓÄ×w˜öiõ¹£5´¨Õj…©³Oi옉:õÑûÀ¸¢„ß™€ß‰Ùå2ýª«˜Fê‡ÎÖÍÕ¢YkUcêKÑ›—¾ãæŸê¹ê£™÷ó•¬Ò­ŽÍÁ7Š”°6é¼bxóúÝÀÄ ‹Ñ\«€ Ææù•»Jf<µ 8ïI8"Ú:W‚lS(6‚±råݱlÓW¼Ê«¹òCÙ¸5c`VrS$PD“ÙĺËCu÷¤!p£A);;Ÿvá’2t<ékHD¾àbò—·Ðœ@‰é Þ;2œx`×cÛ¾éüºÑÄOsXòu]IN(*h[ˉÓnèwBtr>œuG{¼Op¤-xö¶z5¡Aªh͆ݬ6&½w²Ã|3•?÷2V„©E½¨X“³~Ç~!¯¬44äRàN1­*ßa×ýÐú9„ÈRÚvG±>CЧêâ|áyK·p¨…͈¶º”+ŒÞ5Ã@cŠ:Íç…Ô˜Œ2 Õ6ò2ÛϬžgZ¾p<XsN'úä/Wæs4¸Mèâ¿?pr_š=Ñfþ™~Çí¾¶·wtØ(Xƒâ€8Þ;¬u¶‰Ã,ÎrÖIžñ½º:Œ`ŽÇ«b]}än§âuË–b‡Wb/4Ù‰óò‘òÜ=aSHq[ 4¨chc÷"/e(®^d¡…Ûª,\SØk6ý8ZCóÁ1™¿U)k1rºiœûóeÜZY(—OG:&í‚ÙÏ€y³ddâîöeäQÊ®å½Ûn+>FïûÉ8ÒçÞz$ 7Xýñ:ÂÁ.»ðtÓþâ F4¼é o[eQ¢"wû•5MfÜ|Ð}"ÚB,Þ¢h¡>ž5ºjƒÈèyžhÚÓ‹nye:w]/Ji²ªzßtÑJî­ž ©TÜd1³põ„¯ÙÈ´Ÿ˜EV*1sÖÖ÷I#þpCæz¶ÊÌÇ h÷ ÞGÝ}Ë“2\ñA»UÎc1R¶“)C¬àcÝ..{£7‚ˆ\]8êyhŠšóÚVȆÅêDÛAn~sŒƒ«šU–mÌÙ-' Š8ý!ÝûLö¶¡¤íÜ™ÑýšºAùÀåH¤¿âY þÝ~ÑmD‰m€mŸÀ‡Ô1™äûÜuQóX¾Ï?Öº( ÇYI˜Ü·â'"Õ†ÊZà\O¼{* %¯ÍGµ+¶ˆÕ€-~P†¿2©£›kþhªþuY'­Ø¹³¾°±Þ5¦¹É5…L…€OçÓ³D¿Z}Ï\Üäïß%÷T“_R† MF `Y9 ¾/¦Ô¥‡_8ñr"&hŒxÓ$%ÂÌ’šÒ}/TÎ>¨ ¦ôMl¦{ªhñ|(Ä|ùþeHø‰ÜT¹c§%¬€èÒÛq9iO5VÏDo¹y…÷ûɺ ¯å ©W¨ÌІo ETIv0?IïHð ¼V(ÇÆÒm¤{‡Î†é³9Qö8×¶ŽÂþå§k¾ê øŽz=VZ&zvÛg˜ï+XÎSõå\ÇÙÌ?Ò~ž Ef«ŸžÇ¸ó/¡yžH¼’ØÆk+0ý¨hǹ ÷üj%޾?€[”ÿTË‘»ýÙŒ£>—“V•SŠø‰‹È]"ŒÀIñ=íê4•ÐÙ“IïÙ ”‚³öËúѾ(elÜú‰‰WŠGyŸétõdVëfÇ^{|Îs0[Ø8T8C$¡nvJ)龎þKRþ¬ÚÒ|Ó¯-/œmsIî?É žâbc!c)/dú0ö”>N©Ð£Ôeÿ ë±m›Ô Õ묿’™©K ‘r0Ô¹­ÓmÛñßPn°Ê×P¨ìµ3¢"T7§ÇØŸº]äé`zºµ©¥QȊ²͋!¹)%Åúfz¥à>T¿¤Œ¼5^±±½{ƒÉ’¥·xŽ /G`þyâŽæ¥þnù¸::6áÊbá´Aöó¨T¶ãpˆPßÂú$7cõÞk­Ô;9VÔÆŽD¿Á@ǺÕÚ‚ }Òñ>SHÚý¥äwkÄLvžä GÓ€¥^R•fûRˆþ°s꼟‰‹ðÎFŸ{¦Ò»\{ïš»B]Vã»T+„[‹8Ÿˆëͱ}4¨=­ÿD&C`áø N*a˰ù)Çêêü çžáɸ¸ÛÔ!‹•"REô±xŽŽm›óÅÁY:,ä#ÖO7ýʈ¯|*ÃÊÛ½é€8¢vâƒè´#áÍI$%=ÂçàC}ÆÁzlÉm›”rô0hPi½[üJ|uÛª† KL”}ôÇ(ÝnÅÒ†ï #™J±éãÆð²–®êÓ-žx  ´Rp€îšOÕ»_sn—‘ecÏNUì9M;Å›j1xM5`™WQѹAÑqN]ÈN¸>kÜ .óúsI®‡Ö™’§Q»cö­!T'•±ùY—cÏ@׺Hj`c,ù7¡£Õå(Mb+žó¶eƒp/îhÕ-ÅÆ“ JÚ=ëF²ô\°§o*û|RVE¾ïKüš×O« ̜ưòäI‚hí*°;’&…wCúH[òœŠê¥ÞÖSÃ×ïð$`ƒ÷6-_ÉåµPêŽ÷¯œZÈ $Šà•¦g½G9®~&Å|×û®šßá›Rû%Pôp¿ƒ2¾,õáÍ Ú0ÕñZ'›c©*•KÝ/•¶Å‚W ^€J¢ÌäÙk…?%u®ùl•7Þz¢Å‚Íxb•Ó$[}ÃIÜ<ò¹Ÿ•Ü>‰!N»[Vòß½šŒÒl{åOÅ!åîãšî½8ˡѢP„Ifº^L 7ßå›î¯ÿ¥Â:î ­ cÓÇó”l»«âÖëx*ý3Ü ßã~¸ÇQ¦&"‚Pn{Â9ˆÓ™ÐA9ç–ý*dc¾%ÄO1$Z‡Ü·€íñJW©Â›~ Õq?|SJUs¯)ª𵹦¾á¯”ZõlêLÚ«u›ôR‘øñnø;@Sn!¼X°[k.GÀÄC¹Nˆ `ÕðD”žý€]Ñ,šÂ›Ñæý[âljý]Bbxßœ±£cþIM:êH|«a8>Ïdí¦l¡SáÙäPÉëÓlãüt«7DÒX%7ÉZkÄ›ãÚÆWÁ’ŽÉ–gtÛ-›Ë_ n™Œ¥‰C‚µ‘ÛÛØŸìÈ,u,ì?¥^šž› ¶¦—Ïî,tÒ©¯<–›¤¯ƒ—¸¨€µ†`5ç |R§CÿB&êP¹‚òý š“ŠÌÌÏ3Ö×§foát[íˆýÙÄ¿÷ˆ шdßìÝã–Öú²€þÚv%캃hªñ–ľ‘Š(O](Õ Xw|¾­†Ô­5üC=|o²ð^5oÿÄøVwŠÖª‹ñ¦ !³‘ò¤ÇRÕ‹ýkUg,‹ÈDmwÛóôŽ¢í—}ô[hSï,ÄÏh› OBôÑ«Ÿ Ä¿.ŠHÀúæq #ž[Bb´Ÿ^G_±åhš¡^fù«0}¤ dÆ D¼­íõîq^g!М×ÿÈ|=!R2 ‡j*y¦ÃÝñvfo¸Þ„% OîZ›%¬â×.ÄwSsp~ƒ!XŒ¯½PìÕšÇÓkêñù®é{M÷ çZ­üB ï3•·ë U'ßž“_ž~VÏþ°HDúmxMJ:Ó±wø–°¨1'›BÑ …§®jFæG}6zê^•¶žññ`ìÌÈŠ2­‹ß\Îj&0ŸVØtô¼Ò­½?#²{p-·%‡`>Fÿ"WÞæÛqÉ©ƒ~ÅuOØgJÔ$¿y×Ñjç)¸¦ ´ë³˜ù¤{–"ØÈ¡7f:{E‘‹ƒó>>bd¾÷Ás¢t¯äŽ3j65ªòqìÛ¦õÁž€nÖAŒºWY§¡Uã%®Ú²ñZOj"ë&«ÖÕÞ~%ù~jýD‰[Áþ$W\†ïà ¿`JC¨Z2޻Ϡš-ñ*aÜGD÷9üÄ“ÛXÒƒé´ÐÚU";ä²²¬{ÿxŒ¦×þ'Á‚{§ýøAJïÚ#Ô·!xX[I…1ûF«–‚ÿíÒ'1 endstream endobj 5126 0 obj << /Length1 1604 /Length2 10625 /Length3 0 /Length 11664 /Filter /FlateDecode >> stream xÚ´Pœ[- w—`»»»KpÞ@ã4nÁƒ»{ÐÜ@pwww‡$¸>®ÌÌùÿª÷ª«¾>kÛÙ²ö¡"SQg3³7IÛƒ]˜Ø˜YùJâ:l¬VVfVVvD** +[пäˆTZ 'g+{0ÿ?,$œ@@—7™$ÐåÍPÉ wµ°qظùÙxøYY쬬|ÿ2´wâHݬÌJÌy{0È‘JÂÞÁÓÉÊÂÒåíž´¦t6>>Æ?Ýbv '+S  t±Ù½Ýh ´¨Û›Z\<ÿ+­ ¥‹‹? ‹»»;3ÐΙÙÞÉB˜Žànåb P9ƒœÜ@f€?J(í@—ÆŒHа´rþK¡noîâtÞ¶V¦ °ó›‹+Ø äx» .§øàÿe¬ø—#àïæØ˜Ùþîoï?YÿtššÚÛ9ÁžV` €¹•-ðAZ‘ÙÅÃ…›ýa´u¶óº­l&o¦H‹©€oþ]Ÿ³©“•ƒ‹3³³•í5²üæ­ÍR`3 {;;ØÅñü$­œ@¦o}÷dù{¸6`{w°×¿¹ØÌü2Ì\X4ÁVŽ® 9É¿mÞDˆÿ‘Y€\\¬¬¬<ܼ#äajÉòÇž ?•lˆßjðñr°w˜¿•ò±2½ý!z9Ý@'W×?ÿÙØfV¦.…ñ?ÑßÄ ó¿ðÛü¬<z¬oôc°þñû÷Éàafö`[Ïÿ˜ÿ9bq-†¿Kþ·R\ÜÞàÅÄÅ `bçb°±qsxÞ>ÿGhõwÿð•›ÛøþJ÷­OÿJÙíoÐþ½ t€ÿŽ¥lÿÆ\€ö?D×gåb5}û°ý?ÓýO—ÿ?–ÿåÿJôÿÍHÚÕÖöO=í_ÿ=ÐÎÊÖóo‹7溺¼m’ýÛ.€ÿ×Tô×êŠÛÛšý¯NÎø¶ b` Û·ÑÊYÚÊd¦båbjù]þ’kþ±h¶V`н³ÕO €‰•õtoÛejóö|8¿qòOèmyþûJ)°©½Ù[Æþ6a “ÐñmÈoˆ àÅö¶Žf ?Y `aÛ»¼¹ÞŠó˜Û;!þ1Q6‹Ì¢¿7€Eñ߈—À¢ñô¦Óú7âã°ÿƒø,¦ÿFloLeýrX,þßÂZþrX¬þߨËþ| eÿÈ`qø| åôøÊùð-c—À·”]ÿ„ÿÕASW'§·wäOŽ¿µ÷_øÏG ò™".ÍÛ› Y×µÝU‹º3í ÍPíi§Ñ1y-9ýp}@…K¦«úòyÃéF,y¨}uGŠöZt™ôÙ뤥.ô{¢jë£÷“Q¼ÚÔ^+ââ$nÿDÁ‰X]1“†è¾÷³£·V€Í»Èyª\GW^T•|¬;÷^º¾Ò•Ñù=Õý*n¤§Òi¦hÍ(ý€¢Yª<“¬9|rX&bxzÌK´Ùë›Ìœ‰WRùxDŸÓhŽo^º›ì1÷sŸÖÊ5Ø; ( tñ‰ß]cŽNQ{‰¦Èã-xFm-dó„Ç.õ&Ì)hûªà;•0 eú+v`Qv減f:Ùj™N(¨iHëག©ŠeÌ+)†Š²ˆ¬üîŸ)ˆÕt Í~t‘tžžkvÐ{'Äâó³EŒÛ‘Üam·gùr?Ýò”§da’Í!Ö)–•?àN©çùH© 9G×xéõ½æ1Þ2Y¿³õ.t±Ó_çïEòàÅS4Q©?L¼8{þÖg9¤×P}8‰nÔζ3éÂþ‘ØÈó3ˆQŽOõ¬,‹wP>mƒuÛΙHJ{RõÁL甌hªOuæ9«ý¬TdEõó”ó ¤)d0Áœîàg49F$ò%`—÷<›ßþˆ¿Ió½kd¢®ž]º!Ë °afußož3¾ÁöŠs0awÏEQЗšT;#¸Ü]Èg©ßåh¹¥êŸ1ž‹ÛiíV9E|aà\ã¨Fþ™£Áé&ñ!ðœ‘Õ& 1h3žñ¬1(FÈìÜ×Ù[)ZÁ#N[”Þ‘¯S˜gŠpI‰“^e:EƯœ}Ì2ÉîXå»+Þ*wìâÇ«õî¿Ml:¥«³‘”ˋ̭bÌD(âlɸOˈ»- öc½î¯1èï×ÏÏR ¦°ÕUwQÙ [óË©iŠÁúƵª‘Aü‡¨Ûk-Ýܶ`V¾;ƒ¶ËŸŒ',ËÅßô?Rr¿×cÐ”Š èoŽRÊûpJ‹2QË,ù´¥Xµ]НM¿%z÷‰ƒ¦¨z2™»0è’=u6¢ƒ †6ù*ÃÆß¸_rã…¥v*Ù†s(!&Ö& Ý¡ ÕÅøÆðH¼ç!{®F_6À÷ø#–ÑMÉHBý ü#–)U'š/-6Ù2¢¼Û‚3*šOÚŸã¼ûþä¦×N.wfå¸óx"†RP:µ*SÃçšpêˆt%êZžzŒŒÝGh}'b?o®d¥¢f.òºÏôíUhħËÇ‚ÕQãÉ’1QuŒ­Š¿Í­’âO‡ÛtŒ@Þœä e‘{°vßZR¼+ÛpÕ]öÙ:\"ŸD2“‹—¢G`Xwìì÷¹1w¹x´Àã” \$ØHu}´Í¯*ô1 efÉ#Ô \KÄ%Ãù ‘–(ìà6H¢Xƒ«äÈ=±uB ‘W%½ï¨ÛòÂz®m„­²Úº—NÑ!°±<ª£NLZ\»E C¦jŒéZ-ÎYŸ:“ŸöÄLQüZQdHfóûMmKú/&I>©KÈ6™½«QŒ.æ†ÎJuéë$Õ‡Z5˜ÔÉ´µ˜}7üÃ&Áà#Ý<´ÓÒ5 /ÍÅwáMÙœÜVcÈÞ¸6?šÞF: 'ÄïÛÓ1u92CóUPßòßéúfJ¤"Fj2C£HEJ´nqäÀøÌ[‚À)½EÛRXñåd÷Oz£c•àn GŠ «ïÌèWVwÚ ,?­öèEŒ—‡²ózÑ—ž _}Ž,Æ;âkÑÊE ~D ÏËVù—w<Þ_”¬ØùFÙÒ˜Bo÷rqJôР ËÏúPz\¬yà9ú”Ö<·?í3n‰è^6‰î?¨a«ˆ[ ÿÞ<ùvqºâ¦%=§/fiScŸÖX ³‰þ…š*úâ‚¶£Ÿ8\Y['Ô§Ö×pÎ…[»4˜—ŽX2ëxÃÄ``)îUðbL“Öbïzñ~¶Àø{jdËsþÊ'Ö¤‘k&| ­j¯¶*„;#Ù‹¸HÃP½v–­øÀö6Jj ñg”òÏ`ÀnçCn‹°p‡(§ˆC5q’)ƒ†Õsjã¬?'†âZ^À ¿±FÈ£ÿŒérÉU¹JÀ$DÓ3ÞF°ø¯­{Þ[O-c«F˜+@.+¨4Ë©éÙݲÒÒ“lÇFkD}°’'TéNÃr¨‘x½f2pC[‰¬mæ¬)w'tað0“Ž®ä=“o&§ÿ±T µLÆÓ­‰ÓŒ}C9v‡¨Ù‹×ö^?``3XÉ«…˜~yq)v!$4qçt ÐÚ5ô»¡ß³ó¸¦Ý–ýÒï®&»ÉíoÌ6áõŸl™ÒA™OW*©þQU¹X´i…è³™I7àtQ‚œë»»Æö;©{!6NPÀÏŒ±Êp†ûÛžy£J§Ãx±÷e¥M›ïwž†+a+¤0ذÆÀ°#¨îK–òt>‘hkµ%æa–q•ž¸thû:£"Õ¬&Ñ—¶C¬zq=e5)ØÞc‹C€~Ýý[‹²]/_¯+ê98Í\S€€ó%2º6›@ÖºåwÂCP]|¬Ek(©Eê†ýú* ±æ{ìÎ6Ëðo%­«´³YöëÖ…œºŽšÀü"FÀVýfúøz“a ãFú"1Ú.#‚ƒÁ,-ÑÈ äûjDvkÝ•9™t•7%Ø™R1úNƒÚlÈ]3S öIß&± 䂿ÎI¯Š¡¢LÌ2]²z#c&§eÛ¥Xú‹VGÈÏ™øÙ»DKß#ò\¡% -¦ùÁ&òaŠß{cß' 8Xsöò½+UVÓª“G;¨àálþŠ×RnMTc}ìOvt™÷K!YÃãìoŽÜt$×v×È+¾ƒ1xúú†¤öšÐÈÝÓÓ[;Ïë8DÓWжcø¢ô“& ¢ÝãÜye¡eqÍhª­÷q|NXz<²75Â-A5tÈ-çã=TÂCe7U¶©ÿ;Š‚߆8¤Ôˆ‘û0(ï@PÓáñ¡4À%u¶Œ_ PÀ~·4’+г¡9þÑq°g½{cRC /‚Äå·ßmµþã6FÂgkò@†¥Ár›hU.¼ð/Ãr¥Ö#OR!?M4èÎѪÐrÉ£Cê„ÜÖÜë¶¼)ñ˜9éEgœEV­îÂ& êMú¶õ¢ùPÅÊz6uïÝJ‡a«%v[“ÇЉWx¡b±Sˆî=#™=$¦—ús¨?wh'û,éËí½s"Í~Æ“· DÎêÜâß_‘Á_2 H€£Íüõ£‹9唘+ZG Ù˜eåáG±Ÿq%ï&Zlävï²4¦$µâçQo£¹æ¡òÜ7àñ¦ú^ª&Õ¨À»Edqqãs›©î=´ý0Y5”þ1réôã3ôêPïUω Wß=U Ë2›7N-¸™‚\Hœ#LíïãY¼?‹“üº9°b 1æ>>.Æ3)/Ñú¤û Í%2ÿŽ×¶*ÃL Aº‰•½÷ý¢û޳p~Þp¡Œ>&ì!°Ž:„XäöÅ”%Wöp¢Œ$f”JÜ‰g7[=ƒýâ9„þgŸTÒ€½#‰@GØ\ëË>FÌwîc½bdEôùstûæ.Â& ä_«ð%yÒáIµÂBmè?y/#(ã²sÌö"©)XI§ìï’\\õêgTÇF¥4ȈðûFôI×㜱ܥ^ß•W-r/Ó^ˆF ÁRåE@9«D¦ò°¥ ,Bœ¿ª@?÷·ÜÚ”®Ïß g×o1`Üõ›©uÑ£ÚJÐ÷E|äyZŠ^^4.@ªqP¡j¶ò‰¼wñ†Ðƒ¿Å5¼'äQºÿ2̓ç<4 nxÿy½qªÔs}!¸ÓŒÅä\ÒW®ê΂³(ãðyM†‚ÅA9°› -™xI ¢Í%q2•2 ßáðùû¾ÛÇ])ƒ áÛD¹ÿWVf“’Ôk2ÝQÁÈ‚}”Ï7/Ÿ<çmgé^ŸÉk+—× yX;kšvöÓéçðKì¦P©>tþY;Ÿ7ù 1jn/®W‚¤ïIrí»/ûÑK²weÑ<‡5–y~ J­\l¿t:†kûJÔçßÛ}$ø-tÚa6£z@Þg~-ØÀêˆmj¢Üýi8•+Ìøñ 3±ôãjRdFd’LÞwlëvFjˆs\MêqõòRV´ãt¨²4õŠ1‹výæîLjô“µ)hK^æPl²¡¢z‘øWN†¾Ñ¡«¼´ 3‰Ñù<›™Þöê¯þý}ºbõ øy%uÓè G©a4¨5ÅR„Ï/þ ‹¢”ÞK’Úé‘3W,*Êu°†“Éô¬ ×»G½Ï«ýMt>3ï*å”,ȧ)¹xµ[”I8³K4ð0*då Íe‹À·ŽOÐåî'‡q®#? ®²Q@vÛ/KiiÂÑ#Õ1ÍR¹]ô ob|=‚þú¼kø­ógˆ›x&‰ÎšøCá2Ð D1´÷|Ž6Ì-›¦æÃÚH ¿†?(£Êïtß.²I·òb-Z®âMdsƒëÇùUúå4ÄÙ‡^ç¹gQ¡Ðº(ý·©ƒŸo:¯`§èN\WGãWë–=ö¬ÐÏTÉ|<Êã—”Ÿ|ã »»" „í{•wøn=ÃOêºBNá!À:Ø RÍ':If‘±yˆy¾¶¬*sNµöÒ‹˜)––Qxw 4#µO„𺣮tŽ[›^€¬ÔkxËõÓÌœM Éá¾X:^ø™Ó^øDªùÔî½8UÁYûÞQóÉHßyóL!Ç/?š°å{ËÊ%ÉtWÚç$ ‡¦M»ni÷óuðâð™³I'eZP8dqà ‚Käc¯»ß©ðÜ%$SŒÄª14›jn•khlAÒfÓ‘6>I)š­PÕw’ÿzQdVè+Í¡öæq uŸ“y&XÌ|ȦÜÔ ŸRÎk_|±µ›ævd×— ñÛLú¾ 1ÖqZ@& ä ëEÌE‚Tæ9”ç©#…žÝbã)Ù›W¨ÿD/%€¿q?<†alOåL‚5¤&BM…‹çÙ…Vª£ª¤µTí#Q2vO:6’eÑqXbNÍ8¨¿8ñ{SPŸ¥÷Ô¥^'§B„;Á~â¼gKÆèeÝ?÷iÞî2‘ø¦¦õTÙ–Œvf)+åBíqVr®-Û€)òvWå·9Í©ÛgÄDY—”¼–߸_‡Ý7¨°S§8T'(²hÐ騩@½‡áôyàªr`ÚhúQy¼5vá1EfÝtì \ÒÂpÝÐÀwq-Z¿M«]<½]¹"m1AÑæÃL¡jî‘*¬# Œ(Ja™’̼VegE®ë%ˆñ£xEÒß®L1ÜóFnPˆŠûöߤªšûó}åèêÈ8t~Ž»ÿÀD‚PT½ÝÃôºíJs%1Þ˜öë3Á‰åˆ¥uÑ@p(¡ ay¯Õî¬ J®jœq° yØÒ=é-X’.z‹—yÊÕÈ‚VØzÖƒI¦½ÏÚn ßW*SˆN̵â45õ– …á1þί¿±WÕáS|–8SVއSꚆP㑱öWèõ¯æä\¢b‘ùû?M±! ˆnÚµçéµ>Ä’(U¸,Ï3ª_ZÁ4ä²GT3É ëÌÝ}ª;dñN€Ï37Jp2’‰_Ù:®|‰±ˆ+²C˜3hP}M…w£­–¬e©¿ZV4)Ãð;Š\0Û¾XR«X‘ÉÊ÷hi m½x®T¼6Y|µóÝÌ0®Õe:Üš óŽ„™ôÚ“7MUU»+@v›Ñ®£­|ñLÿÕtc/9f¬Q*/ ½ú[6ô“põj`†Xå©öùëBúÂqø°Gÿ ÑÖ—¨D%‡qA½ØhÖ ‘âgЀ”®ÆñU,Cp‰š^¾ÍEßDQô+6Nà^&¸ƒ¼ÔÕ°Ædþ²º}ci~çÉàåÔéöté§w%?ºŒrœø‡.ÍO¨C«²&—@™*IYÔª3JnJNŶô*yÈÄ6¹se9|‰ù/Ž @f…t Æþ da‰ODÛdxšl;óD$êzûa¶¾­þà}«—éàŒ=WâZ»®5ò„?dN:”(›@\üñçÜG—6oP‹£RØ<|Þ¸ôÊÎýÑóÝbyíf‡A¢"+¼£ý–üÂÙ ýjéb“€swMKB\< DñàÑcŒÍÙ¨¤œ€VŸ}xGw·]—yfQFävm›0àô>+ªÞµ±‘÷cÓ!å‰CÒ‘1±¿ún MC ùj˶×ežk¢´«YYàà<á±MB'É@R²Æ•u î+ò\ꓞÐ'ÿ—áo*yô šŽ 6¹I;Ø"6-ÕH(tJ?ÏeˆÔHª´åPHÉÕ>ò\i¿´®NCÌÏ÷WŸ„_¤ï°2ˆŽ×Íi¬)k ˆ\áE¬œ[åË<<}[x ]ò½Q¾‹p]T¼RêÑ9?+› fQÄTMni–)ÍÒòN¢¤›Hu¨žÈbîÁ¢»0w›s¼?ÏëÑÄ]ç(%~5üî狎/±cðü{·ØŸ”} )Q¼c¶#-Ï;õÜó<:ÄîuÕQ¨gŠŽÁ…3€`©3Þ‘Œ™¿åÕQq(·Œ)?ˆ0\Ì*“õ¥3lëðÃ×e$þf“¹ïA Ò«Ù…ÙF´¼ÙüüÆžZº”„9ñ°ÐkÒ³«™ŸšÈªêU`O–ü$«µ÷_ËD"‡ å´û‰Š†#°ò{OXzEês°ö¡ôÑu I¶yE¶· `ÊÍ31½U°ÝÜÈ!ev—FŸâ|V½>Y : Ó˜o9/ð…`@ÃáÑT¿‰†8Üb3®â&Œô‡ù$Ù÷/„þ¸Tá%ã«cÊÎ÷´!‰N65›3Y=窿!irØâvü9‰JÒ®$Ë Ë~”J%Al{Š~’"$±ÏKÍÕ<4«|„çû(î$Ò¬® Å»ÚÂÒ ‘Wbà»Z”‡Q !§¼yè¶™1mµwNF÷Ê«ûTÚtîQœër•HØgêg°Zt˯ù’2tR¤8"Š19€k]h¸“GÙ·¦¯fXJ'R{á1ËaƒÐâ¿Z4ÿ#×,ðn ú..| Ô¾ ›džW7Ë$lÓ´ý¬Så!¼%4¡ÏL©4¨©uc>p.ÞôÝÙû±VL »Š&9èüÜüy>É+ð4‡†‡³ÊƒÖ“ NÞnâÛd¹©ó­QßhYµÃ.×&r<0T8ã™sm ß­•Ü·–ð´¸ög"I>‹Ÿ ÃW²±L *[ÕTä*"5;}† éÅìˆ÷!L?2è.Ížä/S>ùE®ÎRÄjƒâ×Ь‚®K¨¶8wÀÂùWÙUk·éKé¿>n†ëI^cÈê±Ë À|à›£Âõ ÎÄQí!E§÷²i;<¢kÅ~=ÚO}1Š.GôGrò8Á+Iµ(|æ¤ÎìÅ(=Ñå>B&M¦µA6hN)ç_x$ÿ®°F»ñŒö NSUtàÜD} NÕ͸-±žVÜC/¢#MqŽoÝ~nL'hƒÈºã~SYrh?·IâÒ}wǹw[Î>Øi+R½¾¼•õV—.X6ó10lôÉ$¿Ááå'3Brnò„ÕŠwŽO±L+™&çÚJ/Gî4Ö‘æ´&" 9IœO^HºyÅP"¢0È~%\+…³7”Û‚>½¼™ü2lxÙc¿¼‘·KrHÕ£êﺴ}®}ŽcÏ Ý} `ç­µöéoe'¦ݲ•›«%ÞBàS3ÊËæJ‹kÖQЙ.±Éí˜à{þå2Ó meŽõâwÖWbÆnç0$"7b5s³kæsbóUǤM™P…ª„QKx`NQÜNX šYQÂÀš£Lê3›Ú*.Xú+^è7â5’Éî&öG¾VUbìþë¼éÃà0R¨óôÍn±ÙÎ*njðZ Œ•³œL¨oÍO¢¦= ò\WÝôY_?CÎ÷£®bê““ä~,ˆ™×ä¼dEµÄe´tt[ŸP\G•Æ^IZÐàˆ>ÂL±¾Ýýd…U¶ˆåñaÍ"(suæRÕPÂ!f?g.]E8Þ<;”_›Ï÷E»ý$xãŒfÀÖLK¿¬š1†-¾ ŠããàÀ1¬´šE÷¡ž+ô̈rK4Ñ̤]”ÃÌe³Ýƒ5ÉÆQÇ@¾¸ Áo:ÍAß ^¶¢oÅtÓ<Æ,eK xnŠÙýªÇm(|ä·úëì÷FIåX—„µÖ®U”õ£~•.~vnžp%ù¯‘}Fìô[ d‰uAùÜgÂ.×!•ëÀÕºµ\°’ppý´®àO*Yò:½v ¥“úN»Vê†!}FîÇBE]ð+ÉYzREV®Zù:®Ü)Šb¥NÎ ÑW,ÐÛ7|Ö¨ø‹\Êòëo½I*ZYÊ [rºÕ‘ˆc´´µúï#©Ù¯Øå+]ƒ„O½ ¸¾Í½cø¹®ûîfɰß–(Pü’æxB«"ûèzJt 9¢èÔec·%Ov‰ k”Ùëa™ ¹0þ[¡ÔIßœ+öuy‹+äbŠŽ"¬¾‡÷=í`lvxqÜÑNâ)‹VFV!ï¡þ<ÿ3`„Ú=‚Œq€–Ö …«CÂr‹ñÌAw±îxfÏ=ØXH_¶"6a ‘Ï-x-€ÆÎuû² 2à,b_(|¸öƒ¼gh™Þ" ANs” ‡™=\#J`d®V~L4~,AKŽJ¥ì³65Õñ‚¿˜Ôô˜ÁG‚™3³Ž•r"Ê'HÝ*ÛtŒÊ®Â=ûLóøûÁ¦ø×¶ÅEæù1§GPƒ©qs¶‡ù„¡Â:wÇë–ÁøÖñ°mßÙ­T-ˆÛîA×t± ƒ£Ú„‹´¡ú ÿcÅ9vh|¶l?NY’ˆ’Eít&ëÇÇ$J$‰H‹ öAߥF¾['ì¤pJØ ’CÝI¶FR>íQìÉŠÆ.N©x22Âó£Õ^*ÉßÇ’Éc. @×Ï("r_«€½:4>°ÝAµmÒÍk‚;BÒŸx¦ YDßëŽRqÓ½h'fhÇzÔ’‡kÎJbòðo¢–Èܬk L?’xzÈûã +TóQ8¤¡ö¦-åp™µ+âða«þ$ÿ17@9âO!,¬¡üÒMJH¶\óî×餠Tj4gIAy@³—È2c “¨»þ"³è³;l–¢‚þ= ^â}´o¥žS)¢¹¿ÞQƒkÀËl#M³~ÿ×=©¯˜Cúö,Ú®LÌæ`Iõ†.ÙXú‚£ B¬‡ n§×µ™ÄÊ<ÝA&hMónñ É¬w=îtÚ8WéAñ+†nLkÈBnmJÛf-„Ž-†l¯Ò1ï“n"|¾¹ü¦×$3;å²ëãŸ3ZEŽÖûu09Ü+Ö¢Ô^X¢@ÊÀd¯4$Ž»ö¤Ú÷ÜϺ•~ô¡qtCêfø°Zâ'Åœé5Û¸`fjkÈ'ò/P“kóJ–Î/W[À=(ä/FýˆÏÕò”'„}ÖD;cvÀ1Í“â­ÿ’Bͽ¦•Õ1c&Ã79«'¥²Ñƒ¬]ÿERzæÓR £4"ò. "ªD£¢Éç8ÏÁzY ôÕ±Ö/ÙGNÃä|óX:Ê)”ã)7ÌšŸ·Ûà†K¡Z®Ñóƒ ña¢Ùú ösç™t_Q‚­ÞÝ6· ÚWØY «^;q;<*'vïíd zìÚà7Ÿ«Z'QØiÚÅRÒjÙÁ¼Í,¨ /*^ïS]ŽDôä`Á/ÿÎ_â¢Ó”)ÝïšÍ9õ‰åã·2ãvyíLüxО¾zF e¼GÞô¶ô Sûõ¾±‚ÉŠ?ÂÔˈò)À¶@+솩=ȉ²íìI }RªþCoµ^@8cN]íìï6@È ÂOÔR7À¨ ÝM>6.¹jE¢ i ÒÇ´¥Þ¡¹ýq34$‡:á²¹®€1[ÛÜ¡±OÇ¿("Êã 6WÉ 1S º1ìr0 "Ü?Ðj ÷×Éì%‰7p>y"v›cþ~Ð( b2Åry¦û-2›бU…|¶”£Á—ÆÁ~“’³ Ð[»lÜ‹ ™BIíð++gAÂ*ü¬V!"ôdÜùѵkÝ»C368Níõ|iŠ÷P4úŠ„FÞ¡ž°’ÏãÖú³ÈLþ{º¤Ô/ø†y½fQåÌfŸ>ÉdTVÝ#>ß[Vmèƒ"Û ÇÄÖB2éV ¼2@¡Ò3ù¯¨EýúAe*ÃÕù ®Œ?M°QùƒÐ¡ÌfØz¿æ®¹NH#7â{ÀëÌ÷¬ÇüY³tUkÝ(—޳²&N,6Ú,cäeÀÖ m,æ|ÙP·þñZ@לÑ@ë ÷¿ó­`a fh.WNîK–på BjïéváÊ Í'Üt,ÁŸ^óá†æ“{iÞÓ\A0€Œ^´èvŒ×§…Hô´YDpE¢—va0ò¥—ïŠåK„ÝyC‰ÃYQä+‚†#ái² dWO:en[Aº[´‘ßá,œ¬ôƒAÓ½Q\s«ýΩ YA²'b’‘d‰¾yò1”‘Þ.ÿ>þ'Oÿ<¡T¦Tíâg þb9ñ3ní׈öÖu™c¦¼¸Ý+òT’³E×N­Êµ¹4íEç®”dvñâfF÷$Û·ö‚¢ù…g€"—¶¸ü†p+‰¡]–ï r2Ã}ƒaؽ©¡ß廥ï]\É[×9„ŸÞîN—w׌ 1¤±¤­»Z£ÖF'܉WöÕ ™p]²{FìM@ÌÁƬðü\f€œ‘4?¦šßëƒT9†ÁY¾ïrb½èŸ,Dµ^–›¸@žrL‘ 9t“Z>J ܦ°§ÑÞ]óÄ ·Ä 3-ĵfY™WºåîÝÙ¡—-Ä:–Ôäýþ"E¿ì”TnëuY禙ŠÉ§Ö‰œ'¨ÛË3ôoºfVáÆÌ¸à¢¼/ëéÑ$¡³&$»¾ˆ¾/.—ÜUMõGúŽí ‚'‘"«ñÌaªÇb…Ú›ëyÑwbFÖj›t%/ {ïN®k±Œäÿ¹%šwþ²IG‚±í¶,Ÿ¼Ojílo^7‚Kµðgík–XîòC°è\‡¶mKèEoßûï–£R;€;'fÚôñÞT&](Ì­)Ï ÂŸžº~¾'.ÃýÈaL•¸zÉú<ˆkÆl÷Rù4CÐõú ­1uhBÁ/¯0ô~‘0ØTdÕ,OƒVp7Ú0¼´?ñÊÒ­2Q÷ 3úË>’v^êB™¾êÞkç5›ö‰–€à Â7ZCÞ¥½í1.GÃ-(~=7Z/ó x¦Å E{¢oš„‹3¤[ ¾Ð{C”¥¯0ÔI²Ùån!?Eóýt|‚#Y^ù`-ÕVa#îb/Òx Ÿ'”(ØŠùÔ‘;ïcXŒMÏ(emBÁOW®.E‡Õ³!gEÝ»Üð™"EᕱšÙ7èS‚SùÔb?¬=È& ®ØÅä *zRÞ¨Éÿ²p4îÌj|T‚és”“o¹=°‰°¤^RÆ‘ÿr¿QÑ ©ºAÆéâ:!+ö5àÅzžüÃw MÝKîzs¶’‹FO_n¡x45áããnq®’4‡6ÇêWO/䥧óÅ7o´×á¯A­ŠUíož ).U.u~žíYY¯óŽDáƒCÀ9[ë ÐLí+ˆÉø f Ö™xÄ]ê´âÒB®Yª¬dè ²ÐêAçW$ù?bв endstream endobj 5127 0 obj << /Length1 2539 /Length2 19203 /Length3 0 /Length 20673 /Filter /FlateDecode >> stream xÚŒöPÜÒŠBpw·ÁÝÝÝÝÝÜÝ Ü î® îîîœ`AôN¾#Éùß«º·¨‚Y½»{¯î^½JRuFQ '3 ”“£;#+ @\QL‡• ÀÂÂÎÄÂÂOI©aãnüžR èêfãäÈ÷—‡¸+ÐÔd“0u9*:9ä<ì¬ìV.>Vn> ï\ù¦ž6E&€œ“#Ð žRÜÉÙÇÕÆÊÚtÏ>hÌi¬¼¼Ü ÿ„D€®6榎ESwk èFsS{€º“¹ ÐÝçRÐX»»;ó13{yy1™:¸19¹Z Ñ2¼lÜ­j@7 «'Ðð»d€’©ðߥ1ÁS4¬mÜþu îdéîeê € ö6æ@G7Pˆ‡£Ðº .«Pv:þËYá_ €7ÀÊÄúßtÿŽþÈÆñŸ`Sss'gSGG+€¥= ,¥ÀäîíÎ0u´øíhjïæŠ7õ4µ±759üCÝ %ª 0UøïúÜÌ]mœÝݘÜlì×Èü; ¨Í’ŽâN@Gw7øßü$l\æ ¾û0ÿ{¸vŽN^Ž~ÿA–6Ž–¿Ë°ðpfÖt´qñÊJüÛd‚ÿc³º8YXX¸¹x@ÐÛÜšù÷>ÎÀY›A5ø9;9,Ael, ?ð~n¦ž@€»«0ÀïïƒÿE𬬠sw€ÐÊÆþOvhù/ š¿«7@Ÿ$?VËïŸÿ~2)ÌÂÉÑÞçû?#fV×PR‘’§ÿwÉÿ=sòø1r²Ù8Y¬¬ì¼nN@ÀÿæQ1µù7–?±²Ž–NÞÑõé?”=ÿ­š/-às)9” Ðüº '‹9èëÿg¹ÿòÿO忳ü¿ ýÿ2’ò°·ÿçœæ_ÿ?ç¦6ö>ÿö)×ôŠN ]pü¿®ÚÀ­®˜“½Åÿ=“u7킨£•ýÛhã&eã ´P±q7·þ—\þe×ü½hö6Ž@'7›ßO €‘•…åÿœ¶ËÜô|¸4ùÏ´<ÿ{¥¤£¹“Åï-cã䘺ºšúÀ³€¤ÄÆÉ ðc­£Ðû˜™ÜA!PqK'Wøßåâ0‹þ6ý q˜Åþ n³øÄ`–øƒxÌ’ÿEÜ,f©?ˆÀ,ý±˜eþ v³ìÄ`–ûƒ@\äÿ …?ÄEñqQúƒ@\”ÿ‹x@\Tþ Õ?ÄEíqQÿƒ@\4þ Í?ÄEëqÑþƒ@\tþ Ýÿ"^½?gú_ÄŠ3up­Òïñ?VCS7úlÜìþ‚\Íþ Ðæˆ¶¹«¹‡ƒ¥=hÔÿ1s‚BÌìA²úå·º˜-þ‚ Îÿøƒ*ü—°ÿëÀjHo¦nÖ¦þ;ÆÅ´¥ÿ­â·“·¹½©Ã_™A5Xþ•„lþ\Äþzþuóïs'׿âA.VAP…(p€cíãl ü»2Íæ/ê³Ý_Ô û¿ ¨}‘euåO*NP¨#hñþÔJíèá`öûųúëJÐ#Îìô‡(§Ó_Q¬¿‹vþ“”4hЗäŸörpýc³qúkö ºí=Üþ´d}-¹ýó<üÉ êÇ_Ýb1üÂù=ÿê'ÈÝÍæ28@dÜìÿž*++ˆËf GšÙÝÚø×ˆ@=r÷rú+”Ãã/ê°ç_Ô ¯¿æŠöþ ‚ÒûüAòýC”Éèú¯«þç¡3÷puõ"*ÿƒÿùßôšÃ¯¯8™ó‡Ù6„uýü$JàÅx8#¸Hy¨AËè·îÚíñˆ “F[Ÿ²ãz/š6>€ºy Is'²AòâwÖÞÙ‘¢Úùäÿlœ¤6Ø ¿6‡=2[r&Ú8LGȨ!räÿââ¯lÑÞ+GYàâÁƒ¬R„ñÓkHÚ»q¸êËTÄÊ¡êQ=—<ÂsÕcœf¬Apùe¡Yî2.´;#,ú•7ÊÒÝý"zþì‰\=|Ày{©ŸÞ.[ü¯eß­ 6·>< <=\"ˆ;ô©y*?±“t9œU¿Š²¹ˆ˜2K"£•V¡nSŽÏ¤½ëU“³{“¸§ÆÁâU(ó æªû”bã§öêù=¸èÜå /¬ÆÅðnª=Ç/ؾ1µK9®¡Â#vî*l‘™ƒÉöÄaw4ÂÐ='‘'é«\kxE#ü ÔMÉoA"Iklf…îúý~¦ÞH=ï¸þ˜•v„ÍÓ¿ÕнÒ˜#'7`µ&Íç‡6¹ÈÓ©C³'¨Œ›'o;õyG®×ùmP)ïÌ(¢ÔUÏÉ%$.Ys«ÙµSŠû¢˜¦ænz嘰¹Vë–ˆ24ðÇÏÉš…Â\qiðj”BF±òÒ÷Cɳ…Zõlûï­‹Æ›é34_½êß~À?7Q$~œÛ7ØÓVb/¥ÑZ0¸T::",èhcGC†Z¾¶7Fuë¯TŒPi}¨Bè‰÷±T÷©Ø[é5ÛE›4áõ r޹WÙKü¤äáºB« èa]¿²0&1³^ØÑ¯²cT€ÛÚFÕ×·ÿ•±bÆW“nú 1{ÍqàýL©N¨ï¡*ß»åq˜N䕽i¦Ôy,sïŽ*ìbOÜUø4Y!èzÑ\kYœò_–²Áé}ŸÑ¤» YÀiû‚\ukR¢ùVë1ÇÍ‹À±Å* ¹eµ–ƒ_ V ´ßÚ³Õ ‘šsx‡ ôô²‰üÍqœÂ"?'‡È8D(E:f¦~;¼@¼/Àc1À{±T@Ìv…\[Lë Vz „ÝØš¾ˆÏ®íC‡à£™ Þ8" þØoù9陹Ô\ûc¨DÆè ^xèÄ£ÚJEXÇ FäÐúBoÖ3…óF éÑæ oc¬@[ï: 2g3ÑþÌŽ«£Ÿ9‡íÐÌØC·sзËQ†I±žª%¡ÇXŸÞ_—¹¤½!ŸîÜ\ø½¨­¥0PÃã¡ôjEù¬‘+©†ôW0a i67GIè1TìéæBï0 ƒ`ýd•–Žùû0û§I¼Q»aësc¨ hûN¬cQGØÄÓ¬ÃæÖ{¥¾Q¤¥^¾«ÂrýLŠé| ¾9s¬•LÛñ'E¶¯&Sœ®u 7|Ÿ_KÆwk{¦w_Í ÐWMà*v£0H-y…T¾ÕÀJ•TÞ× A­e`¤µdÀÂr¤tñøßiÂÒËá^@ý³CÃCb ¬3ª×ªDCߤ…äÅI—ÎgÄ4£Ÿ]Š„þÈö³+Ñ!Ëæè×L.+˜ëç´ÊóÛa!½êïSÛ³ñÓ<û*zà'‰Ðä@ •Ûù¬Š\I©¿xË<­%ûŒuhF|#”~fÀÐðâ—ãXp®mëpTAurb&\!êˆgC’$–»¯îiE5X[2Ô)ÄÄíH'nªË~^·§k[š"àÓ%lf"tç¾OkSèxj]ÓËlµ¿ûuWÞi‘ÉZ2ÍÇü°"eÀ…ïÞ ˆ+DV¡¿‚áe×òô¤©ÆÙ¯œI×5·ì#qƒ‘ò“¼÷q¡ß;ªþ´ ×”$z wäù`Ëì:·¼‘ªG¤‚JËñÉr…^ÙYÇøƒ{ €3]?AMBÀº@|Û+£›äLJŠ(Fª—µYoÌ/vÉ€°f}”R‡s߇45¬ŸD‹Ïú’~áCξjÌÚ¿N‘á:ƒ+Le¡ŽšS¬Sª€–×Ô]mïõ]²[Ëa™rWÄY<5‹ˆÎ»©ª¿0ˆÎÃy1’Ñs4Rl— -´—d’×Eäé´ßuIFÕ»C3Êu§Ž"˜ÍGßèY$\UZG¦'6Ä$ y+]Tm;$¸A”å¶K+¼_W.µºÉ_tŠ»]<+¨ÈÅïÛã¿’£7p€Ÿ!!”Ã{â°ÃÈ_qæ%ƒVB˜H,ôëw_N¬¹¼üDQÌ·ë<²§PTÀÄKw`è¢ýÝDW?ž[ÊÐßÖ²’ׯ•§¨;þ*>$ 2F£‹0$Êk6°¹"Åú%7m“3á2™á oXv|ð¡SÿŽpe#­ÅåeÚ Ž³GáÐá)€ê«§J`¤°|Ì¢ôMÍ%ëžô ÷¸‡‚r׌ YÐtà÷gã-9¸ñYaÎ¥Pˆ¾nåM &éŠkï«zȸóä{ ¾?w^ØâñQÄø]_'–øxšÐ0ID²®¥ÉS¤áaŸÀev؃²Ò¶Üs%p:wÕÞ¢RJ4ZÞO™†©f;O ¥ ~ö‘0PlBSç•Y»RëZÎuµ¼•.7z6àäŒL#?X÷ÄÒ×m¢Å:Æ–ÿª^jDØèØžY«ˆ¯óÄÀCUÌmŠ4bAñúq+ ÁÈY=xÍg¶7¨w·ö¦†£MUÞv]p,\[¢ËB¨Ó ømC/Ûy= ß&Œˆ"¢’¬ðf–à_sOî EÆÕ+‡¬@¢¢3¹ãk†\–¯a¾ðð|AK‰£°&o©Ì†²U¼¿  QZjÒL¬gl¾u»åÇ^{ ªU·ûÄjØÙc uPï6È\,"nó·0¦Òþê}òø ßçAißdq÷•£ù´Í·Ò\Á-2û§†´>Tç þsøQ¬°v”ÒÏE,º¤OJP6—ß,o,¥–˜Ë…ŠÁ¦RPg¦ŒM§I 6‘öž¹Þù†tãdCÕl§ª1gºr”œœa+>V¤c/ƒe¯Jy]9©ã ¯ƒšôúT¦‰ÇÀãWW[Ê\ë…ÇTMÃÆQfR¨!†ágͱЪb6Ø¥J5ÀñŽ©³6 ûÈÇŒ„Þ%,¬P0f·A¾ß~¿)õ³ÇKQY#±^ÂM.cR• £é±?Ôî)¸[c»§õ–­N /©NÉmg!þé%¨‡R,tÃ:öú á*ÃÞPþQ$þÓ©üÇ 2™ÜÙzä%”@[5ÛŒj…æ47µÜgš–ËN¢ÑìùëZsV٭Ľ&ûÕ%pÛq)JÛü •&xÖï¾flãuŸµßo+Ò;È·†µŒZ2m2³Õó?ݧs1s÷× N:1«Q¾>ÚuL'”k!q<ãe9°îÃT“âý”¯±‚è—HSD•qE±žÄ7ykÝ‹ÿðv— øfÛw S‘¸FpN™(õG+ìmãƒôþ˜gk´°‰:ßîŸÐYmdªeågÐ>ov5XlÁ䖀ãØÇ–ÚÛÑíwñg°˜‹»={+¡<ß({ÉÉ€°s‚èËvDD?,·-à Óbó'êÐ+CšU¼$›yËïf)”:Ã6Š^*Þ>Ùê@uê¸A¼(ºâ¯}“¬o:Ï]Vx&;!=§³Ä¥Ï&×Jšx‡È ÌŽÞwàÍþƒ‹œ ÷Í”ô&ZðÃùÆÓ ÂxÚ¸G)NŒYQsÊŽtoã&9@FåÁ ÒÀÄlï`™âÞU°‡vZ8‘¹ ÿ7^ Û CLõÛÙ:wSgå®XËš, ³±”×” W‹《ÈÕê¨ü¬Æ%Ã.M0=â<– ÇÚWßµ%£Y—õUÊ¢CÝSd¡Øæ´ÅëxÁ‡üÅ"ëíÝÀäe*¥ÛÄN`¶ðWÔÏECšøË x¾ÃkS¶ŽáyŒÍM¿ð‚Ãéü•Õ`é¶gÿ¾Ñl(Tmw¤ç1 5„ÒBˆ©êZC%e+ÔþŠ'4릕§ðñ{®Fî`™û$ì3Ò×›f¥Û—~Û¢}e¢ŠnÌõ³­·Ã’ö8p÷B©kŸë£ÆÃ»T—~7^ªúôzÑrÉE.mðôí{"—Ž ;¶ŠŽ’–²ˆjÒDõšµMºÈõ<Y?•Âq*ŠßråQ£ù ‡JÄH«†q”„ßËaE_S¯Š2ÝÛõù ¨Œ |>¤`6+: 4Wk ŽØsì"…¤ =¸Î*äÅÄä‰&ÙTBñ0ÖÈý–ÅÚ‚HBõ X¢dDUî!ë÷+Œþm…¥²™ <ÑG檶z€«NÓëN™Lrõ)ˆhîêúLP*aP`„¤e^Ÿ,Ü› íà!óNÏÏ/$nðv›„) ñ‚gr”ºE®©ÚØ”ÒÊ)°3(ÑìàD^{©úL³À7âü¾(fB)7¢èžA0ünwüÎ^¨åù¸vÏü 8¢ŠžÙ^¬`>Â7üñ¨¡G *G CÛ¼Ó5aã4< 'V8h@‹Áâ=¸Y;¡†Z%¦"O¿ÄyPÛœB¾›®_”D9ÂÏP ?ÓJ[þV ÇRT‹‰|êéiyIÄtjç”CDÓEâûMcq4pÖ däç‰gSIIäM²Þ2ýoã5PÜï¹)×:2ßÛ1³É¶ØEQ×–{A˜ L‰¥¡ßûòëî'!ÔõÚ÷Iù­U1`Ýç•òÂcP3…ÚŸ빸ˆ|2ÁŽÂÅùô™ oÃÿZï¤AŸm´ÒïgÛÔá‘ß­q#a4HÜö¹]ú}4w›’5á‰9TMò¤L,î§´5¥‰¨–WwËK7ÜiÐñöóŽYŠ^‡:9þãH½? Û®¶½pÙÈ;'øü'纸¶ W9d~}*]²sý(&_êp»ô#˳6ªÞŒa@?Ë»*$xo U7\¤5cוP§µú‘„}’ϤT”[…d|"8«vÕ¿(kPŠþ”ßBy3g v=†¯©Ce=ý+qM¹çøæqwI{†í³ÑîÏDpd_éú‹g€RÁÂLõË‹e·±úٺГ•É=¾—ô1üËØ™Xñó˜…Î÷ÄfÌ»øvɰÏ9ááG@môNã“|{{ÕJ ®h§Š°àd)ÆD|ö¥Ìg=ˆ×­}%JìmUh#¯ܭИA¿l*ÉÚX¾";AJÔ)Á,B±ŠÏ­²þ¥iðùËÙõ–ò•6vÞ¥€„ï¾ýÍm„EöÇõÆ@‡ ;xµbÆÒ Ö×N™ÏgnéQÏzå‡5UL†¯ý†8E¤-XÖ´S€AÿlK}¬*ûÍö/Áú;‘¾#ÈÃÌèòËPÝ—òÎt†‹ùHƒ›^.§¸Œ‹ú¥µ¾“v|É0ée}Ô d˦r‘÷Ü:úˆ¨1à0§èÚÔ\r¢OÒwrÌ—âDñ¤MûHï!åD[õøî ðzú‘’’œ0§ê¤T ·ùbÔc±SZU¬Õa°gŽ6<Û_²4‹mÁyªq7.›¸ R¯d§»jRB=PÂé²Ôúw®÷[È.ù˜ Îg2ÂRÕ>E¬7kÀ¥‚)(ñ6J Ò›Ît›2?®FtÒ4Á¿Á÷BL,¾¹òVY·ÍŽí;v/P"È lNzgì{ø˜*‘ÿP5Çá™süE‘®o\2PÛñꥩ߯hq|q¦Ú“ùºmÙ3×ìÅ·µE>‰Lex¢ØÁŸM×Ê•t÷¼o¤8°àó$mÑ~§@XÎEÚ@I,¿í¼›ÄuàèÜM¬¨-Aïï6a¡-ÍU×àà cV £Ã%/]Ú@>ô{þ˜}™Ñ5‰ƒÌiF4]îf:m‹Ÿ)ú¢ƒ3îõËþ€™L,ª. &µEÝÓý(ízØHKÔ¡êÄô²îÒ°¾‘ÑP)| så²%I›×ÙjÐÐA¡€ê¥¦é¬tþý7“b£|nMê\ñ(çHéàÀ‡_ÖAì¬ß&÷¯¨Ôü‘É øûߎüçI~”{ ¹`†ÁèÕRˆ*—/øâ¹J`%žQÞ®¿éi½3ÜŒ) )$¡Ð) LWŒ±Œ0`ÎÂM®¥kT‹ 'ô°ìƖŵŽ Ó½¸LÐÈ#-am¡•_UaBRÄt8›Ïpõ†ìÂý±ÿùáW˜åÕ¹‡1^ªsÃ2¤>*|sgq  û«óÎ…éY­í“…“ÆÌè·Lª5ÃÝ^X9ý±×O[ú'ïEF{©È¥xlàŒx³[RbÁüæa€ô…Œåö­Ýb…9Ùž—B_Å*aÙœ÷ˆõÉp°opmWMGê36fnv¡¯,еÂ!(·µ&««NyÅèóI FËÀ¨L´å°Üà”dA«Šõrfµ¥ô©SØé€¸ÐŒ «DCü¼àÌ]ø8Â!éi@ÂmͺhR PcçŠ\äe#¹'éc E¥ kÛ<ÉÅ<ò½måú{‰²ù"`6§&pΑ¢ûÇiÖ"{GsE÷çýtU¼¬kƒq©"Ko¨‹mÄöèc!}«Ï5_áRÏÐØ ]S ;ç%½V°¯0‹<˜QÕ‹<ºÖ¿¯ê\hv?jÓWyÊÙ ¾¨¬œ]bàŽÇÌÛ PÛ«)çXg?9,Aùü,üßÜÒŘýEycÞ< Ù¥‡2>)3ªšOlKV1‘sËf½:J^0=FضÙáK\z÷[á¡$-͵âÚp‡ *±äÌZˆˆ…}‹.t”·º“¯¬¿QbY̼MyöÒ WQ#“vÇ¡‡;÷7ÒÔ€”³Xâúš¶t€[t”n¬z®ô£²NŠð!©¦¬)×q©'«S‚¶7]WBŠ?ß‹¦šƒÍ…³çu”„rÞ46^ƒx,"7³Um¦`K“A¦ó¦Œuâ½ä¦š¼eL3­1‹©ÕYy¿:‹ ݪºPu%ŸjN°%{#0ì¦Í½å±ßª[ÂxíAœÛÌlbbÒ¬4ÙˆÖ¸Œ€èï%N¹TÆ™ìb¿DgÕ-‹š¯:Ha7SEÍÉzà–%0÷£¦»Ÿ­é 1i.hm,¤Žåé"/#sÃ>%ë2Óœh’”2F/ÙÙÂ@M'Õ¯“êZ£Ts\4§^`BW•”^=tðù^ÕÅ£Ûˆ)¢"gð1›Â) L/—ýÂ#ðåŸÑ4gÎYC-çMjTxªQçe>*BÊÑŒìR’=FB¤œþ„hn–ÈLøá½º%z!²n1ù€aù5ùÑ}kͯ¨Âd ' GKUu¿+™Þö‹OGÝðb1å”Þ:1¿ÿŠ@»ÏK¤V·ßÍ+ÿtÑ*¥£"‡„‚¯¾@ö3xÿãÜ¡‘ñL+ý:‡ ÿ»Ù%†"¸ @>º0Îaûv_{ÍäÃ1Ç›>‹0+e͸¹¢“íæÇ“û(æÛçû®«w,¥Ä\Õ%Dç†`Æ;ýòÁ´Á†ÖWgœçÉ1y; WÌÑ15sX Ò‡œöù™VH¨E8… *$¦¬!MûŒ˜ví;*ƒáçlZ5VÔ”€%,´±Ùæ[¦}çE€—B?ò¹èül– £ÊYI¹B3–ï½ @—M´Ûð¨›VSJóÄ¥ƒ»àê3†I.- 5YKŸq¤,PXÖ^Y©8…-HÁRt¥YEk'O–Î=ûÚ MH®H¦Û§fJãîïÍæ^HµfÌ;Â8kÐd¬½„ÚQãd'Ä‹Y¹Xº úwy5]¢ÑY <]•ž’gáUìÚ,ÙŒn!´íQôY<×&ÀPš)ž~¤vÑ^\ubDD´’;ıçÆOëCh+Ïleðx‰»ÑŸÇk%ǭ圙sEçò§6 ì5(üæcŠ> Q´c  J ¿ú“6úJ½¾l!-ÿ ÛF•ÌöØlmu«žP&À¹ñb±æÞü`…Bª<ÓG2»ÞßPᮯ¹¬+€26ý¸ri’ Ë"Ò†ÂÒ/óÏa®ö(ŒRÕÂå/ÀÃîéSÑ݃˩ £Rš¾Ÿ<µk,rñ#a^Q¸‚o»íxP Xh'TJþø™Å"ÈÆoeœ,í¬ŽŽ­RÃÔÌ\ôw-({Q…ŸæÁPh‘tYZ‡.q®NT–úRtÙê\¤Œ4ˆõÄÒ\?#SІzüÀNÝãòËW·gàiëu;1,tã¢R?%K  ƒ-é_„L€Û¯ýu5kÆuæú­8Îf»pã´pfF }ûlš?¼Û÷ym™úÛD9+BŒÊÇEUÅ^¥ô‘E‘ñÐ\âòÎD¦JGrðÖ1Mqñº@YÀwíÏÓ…ay9@R&-)Wà€zSIbnÕûæIdº„Ì€8rmFÖ*5ôLð7˜é–½£túÉHWÝqþ'*ѸæàÚ±ª&Pœ{ä²*uÉC5’,+™è`ž „KS;ï!b¾ÅM? |‰0ºÛ9Dý¨~yó*),N?’›È‘ÓÍW>g€Ÿbð 2ùªÂ”Q“„¤œÐtcæ­ŒVR¸HLì ™fÆgnöôf™w3^—>ïÝ7\Y»Us¸ûˆáÔκ4úS(©ßãÚ]Õ]ÜýûuÄzî¹qSW3W·uÇ¥Ý÷P¶×{ôÈ·¢SÒ<ËÍ< À®õÕ† ‚²¿rB‚ȅ˽¾Ç~EhÌÎ|VŽïey™YN,LÂ+ÝÄ®/¦º»Ÿm8 JD|‘Ò.Eý½JÓÏñs'éjM•Ç'¤ÔÀ¬/_xÂ>ÞîOØcŠ{—Kä°”€ûáÖ9îµJ¥äýh‚Øi~_ô¹„h1,š>¶=Ôµ®¬•¹ÐûU*¡’5ŸÙIvž²¾¬8›`ÌZM\•ƒ’ÇâèÑëÝöÄ"7Eºs'þ¹ ›:Z8aùÜJ–¿†Ä˜5Žö‡¼R5/B?ÕǶ§ÂØ©Jဢ¡Í¨ ¬í¨ë‡-—‹ˆÊC46ÌoÊáÉ'{qž_zoÙ ¿¾ z²…G-D8%#¤²ç)j¶Á7JiX±®ò2,Ü]gWc挛æU#ˆó´ÞhBYë^Öx§3Ùo°Õ*×íÈôU8ˆíšgkÙY²”ìØ*ÎH‰]²Eg஫å,’Ô³$á^zß2¾dqÙ½–G¢,³½Q•kqpà.`°Yq°5ô” Õýô•r9Zž¹¤•Gù1‰Ö!ß8åóÔÇ¡I\4CÎZ\¨’ËA ¦jédVœŒÔ…Ú××~ ûòCÞ¢bÛ¾¬!r Ïvu¤¦ËÒÓ›ø×Nªå/; R ·ú§nÌK ¬V…Úd‹;ó‹ƒaó–LRzm¨|cÂ<^{òa ©qMCœóv#uŽÊf±›t M$½}yX¤GÞÛ]áY« ½œ#E^s×—Î<ª¹Ù3a:‹uCc£i*”ÕDŒð³S6…¯)Àó~ 99XL©ñC:’Θ‚àrÕ)¥C`"¢›•ªš(ìü<4b1ÞëaÊÊÆöeF“<ÇŠE3%¾5f{÷œ»âÒÞXªm»7‡0­_“_){K†ªGn99Hc[}CÇûB},IsÖÍ„g´B:ž¿ýèµq˜…½…½"OŠU%{…Ïj·0ñ•ßçjáñÐÉk€]$¨:|q з"õ¢8à^alÖF ö›‚…ÒîkB=/NʨüúÃW"f™&eBhá ‹7¿Ø*7­ç ,Už‘J)Ÿ`Øb©œf=”m$%ü+êq(ŸQ:a‡ ²„„”ñvtÞhÃéFÉÎmƒ+è gÑ;)‚sÇîo ž¹ lxfu»‡ÉG“3ÍkkZ6V”Ì»S:ßìœzwÊê¥Í2Xá×ñllXD F¼ @™\¹#ÅUVðû >âªqJ¡1ÁJ—ºŽk®Ù?¬Þcݼªå/ˆÛ”ÖW¯Û<ä&Zyˆòy35(Ëß¿vî(å\©Àó&Fœ·”éSª‡w¾oµJÀ <.e› 6Þ÷ƒñôyl< W]¼‰0@Gg÷§f± ™Œ{ •¸e¶‰ç ‡±n[Y¾H$>`cN7üɺ¨„ ×£›áK:Bz'YMzÃG:9!!Xsƒhñ½ƒèÙ*÷؇ºX®=bæWÝrkh¸æjïK¨wéçW¸Q*”‚Ž·?=!‰vV¥-6—Ñ?¨¬kY‘Õ 1­X~p|ÒÀбçcšŽ#¼ÎFFüA>V¥q);|ϤvÆíAm=£ +i²lGU§„ký½•Ž'—F“n¦CúÜL%î—kÍÕÞá¼Î+”0g¼Ì;’CÌî¨æ,ÊVì:·ŒNß{² AuEÇœD/=,8à‡±Œ•xÍè8ö­0{½wË ï‡Æ› Ê• Yg ðwSº$»ìÍš wom!á9z>É3¥ºÆÔ'Páo¼%lÞÛ¥ìRI$Q3LúAíOòÃÊKlæÂHKË,lwYàjiQî7Š1 ÖáJ@ó­„rväopú²sž¤zF³~&ÄœØø süÙ CÕ·2èX?Ñæµö[ƒ ¦ º>ìe6d]]÷7Ž€¢p]ò½ø2Õ:!¤Æ¥ü‚É!ÅõâÞÜ-¶×¸¥fÈ4 ÃfO¾âðuó#7Ë­{9M¯$ðËzOÓæ†J(¸ñšá]<"àUÚÈ:ü¸I~¦Xþt©%MÕz¼‹§ÆØ•üÝ©Ü.…?콜—Q°XSÞyCf¡`ßiš¹i³ EWI[›ƒ7…Ï#B¿J‘ ¶ù¾Î-ˆ 94ךœkÚêr°Ê5ì'l¥}x'ðŒÀ”ßÏ {@dicuן&¥ª¥¥4*–*q|AÀÈ–a eC48¾ÁrrÝý qC¶”_KòN'~¨‰~Éר–6ñÕ‹t ’’—bšü« šA~vk}×Gyg”Øœ:MS‡ä ‡ënlýþÙ›9šá½Il«.ˆ:µªÒ²¹z÷·Ðíî¯ñOnxoVT?ê?žßH*݇þ|Ü¿yú}ŸúiРí21 J`zY±àŽ“½(z¶¦àB %U'DÍÏust¹i˜ Û†„ÿ4nr¥ß)ãË>uÓèèU¾ÛnNPW›qpš×rT/? …k™ªÓ†g*n†˜÷‡ÀKÓá,Õȳ$²íL¥²¶_ô+Ë?°ö|Z XS±¥dÇ 9®+¨ü›«ÖÙ•ñF‰¤ô”;óqÐ@ðÕÙÚ=‰ÌÔdOëIÁš fpÌx¨¤•~IRmS­â¶t%P’–À4ü1¦âœpÁ"iÙ‚“¹.Úi¦ä˜èmÏ"¨ óbX©'R>oƒtOÞWú«6ï.Î0ÍMjAÞŒ¶]Ví±µWøÞ´Å,Î…ª!³D€£p|dÄlûÞžQ’Â…væRÿ¨¹š…ô‹D {ÙÀóÇá–™£•þìèŽ`ß<èk—Vé9W‘! êÖŽÇ(,œh±`!Ã/ÚO6ßïíà޲ˡ‘º$iÀšjëRi¬œ(rÖfÉ3’=ßå9Á¨_p–°ØG>ÿ ©žÒ?Ë,ºí¥%˜©©øuõ–Ú°~5AKÿœ³~’ÃÌÐVyÒò>Ç5rãt‘åGF‘ ›LÂ.Þîe÷Ì× ’áiÑ E•«Ä êé…&5Û¶X¼µþ‡ù~B¨hÍŽH/oûhîUæ3Ë ¯hÓZ¡hI:­Wê{äb*~$œûÑEF ù±ª(:×Ï‘_Ò—ÜÒæÞ¼„âÈ ¯Ï¸Àã™y (G¤Å‡:,–-P,ú*†G; 诹HꃶaQ¾¬Ñ¯™u¤Õ#`ÆëG¿ïo1Ù°ZV‘ΖJÒ4[8ÅX6ßU2vý碘[ݯí«ê¢Ï?T‡t_i$P¶ëÖ›ß,œƒ ,5 þWy×sA:k×2k.µzÙåH”ÉÉxÎå\ïeø1Rs2¥:5Úã,z&«ÔzZ¢­d)ˆ=çŽñ毘SX¯-ía9[¦ÀÙx)W3¼cᵡ6äw>vÔGií8C%¡pìžÿxîY'!9s CnwùÁ¬Å¨‰­Ï„¢T^ºõ9ñ¤P¹cg{³Y}c“x K(©ºnX fûã;Rýhª~¬‹ðW´œìôÛœê(|]êFF¦©Ë¶¨ªi_{^g ¹­?ÅÀ±P \¶ 9Õ-üLoKÀŠEÇíceû¦`ÀÕçÏ¡66||pø¥Ÿ@fˆ#aŽ2j ˜†^‰d¤_Ýðý¶”¦—£Þs哊s…†ºÌ®×/õm¹&rÁ±ï=Ü`JæÑVõsy¬]:Z&G7ÆåΞrØ ºUÁãÏLµ™ÐòÚxO;2v¿Z:XZ`¿e6…ùøW& .ûu2Ä…B Y“éQoÔíâ(®²­8صv é ÔK/ª÷¼¼¦ùz/˜‚ðÐî { ²äA‡}StRÕ8Äåù8a>x2œšBó¬"£¾‰QEàou­½ü…/5÷$ð©å&±74wa•¤"}[ÆFªøÃ=s {§·¸@Ê´›fß«iÀˆVò‡ó/ZìàfÑYB=³×2¢@XwqAØÞ'þ€Q³c*`/çð7'ÊJB½.£Y©êlÅ=5ßíY·UhbàÂJ'Éå9¥~íUÐM*)?Ö/x9&@î [å¦w8飸LH{…}cg󩍯·ÚšdÖýVö½½¬‡É¨œ¯Œù[>ž˜s°©=¯{0øº9þnæwÓ㑲¨æøþ8”ΤÚó·Kö>õO ãg0ÐçÔX¹K?Í5gà¹Ú ÕÝjèRˇ^X¢ðQ&¦ŒÑà-rhëòÄ(îðòÀ ‰#ÓQ¬Íôã8“É“~-X¥,{âåéØé—û•?*·+˜'Ëvå&Â4C‘3o/oI¦R”@ŸÚ‰Ñ¤í tF¹²ÞpØ‚ôAþؘ—ûåIç G}“#n\Áݵ¿Mj3 æp[u6ç<ËÉ?œ&?%¢aû !/íà“w•…¹_o›8ÙÔ2Y*âœm Vå'݈°9¤O”^µð†³†ÕÖ.ñ“$nì&+Ã.$Ä`hF¤`U…÷oüÏŠ²î–£Êý›¡%)FVØêédmø5sˆ™ .8ASuÝ^i·öö·¾2+”²:„H}X[¿z‹‘´‹{“½g¦zÇ=•7|Øã(åæÌW¸u=LD¤Ž.¬VËÄðõt£Ó©h'ûd˜`Ó•›CÉN$›N1ÀfœÌÏ„§\gg y$Ì"Ž'…±²ôqƺˆV.Ù€ñãC8ïHlœ ^Í=íÀë+<`¦û'…‘XÞ"NiD_löܨо7Šlò9\ó¼®…­šÀƒLK'eÙ8îæÜ…h¸¾ovu÷ 7#¿4½,5Åu9=ì¨0Ï jñk5ùSä’ ÑNô ‡Ï²a«TÑ;r795::¼›ó¹"Ê î-°cW•·[£h÷¥…÷«±µ©‚æ‚ø.Ž2ã(÷`|”!=“3øú:²ÚkÆWùêŸ"‹i~Èd U}e¬h|¢>%<´™™%ÀgMe›NHkçY7öÔ¸¿žñ ¡öjœ–¶3ê}`¥6Ó#Åô[‰i}¯lþQô¸9@—§¢[±ÒBA^jW㨾U k5qy0„S—횻ʻÀʰÍçTDUò3° ‹¸gešy™mU]££Õ¿< . Vé[‘þW¬Ä$”=ÆØ•²S‘úƒ8O°Ëü.Ô*·wØ5éÊÓü6,r_~BoÅw·Œ/‹„¹‘¨· óaŽBAJq8”±ªéwš533td‹´å9(rïŸn.„;«œàÍÐÖ¹}ç10þE"üTáTý…Aeœí*2ö€N‰–-"›*éûn™Î;aÄå[qlÿ˜R·””% Y7È$‚ÌD¨¢I‘ó¢w¤:Ëïöù›-}G7##Ån¹6Ómf˜•Ëp8ÍÂ,·?÷~µ:Ò‹Ïìi°4¡•L/Œzýô¡®Œý€êÔ§Éí´# %™¥9 Dô‚ÀPÒùY¯µëž¿<2ªs_^ÕÇ¿GT±ºœ“‡#¥ùsm½ŸÐ<­ˆ:û#‡¿‹˜ïÝ‘„à!¢ºƒ‰Ðþe4Aj X ’·¾ )¯aà]ÛëN^ˆ±+a!0/ù…xŒRö8¨"Ëšç•”›h‘¬ 6MR3¬ãphÝrFÒ–?2§±7,ŠÕ°-ÚgË3z›£äŒB¸xW-<‰¾Ä4,Ý n­Y v¿‡ÎCì¹1V™\d$î0¸ª¬J†,È4½[¦-LÏ]xvš`P¿“Ë\ï½Q‚¼ü…ð!Óæ¸›ÖKeÕ&ŸEÃïÑq-Ð+u)¨4ªØùSÐþc1ßéÉÓì¯NHèÔµÊ+¦Jpõ{‚d¨<ÝЋ°äBáé.'À;ý'ô”0¤Cšk'Ÿæåmû ¼M纠¸ÒQó½Ï¾5Ø %olnÛØ€vf¹ œŠÙâ¨F>u-n·Zq,zN®è|^¯Z0Óz‹ÉŽz-Ù¥óž¾pyvõÜt;ñgÕ‘d¹*;>%üòFðäyö~úÀ…·éiã³…Y©“©||áe‡`yýHÄfâ\…cò±Š£4‡»°Êjô|F|ðÀ>䙞¿¯TܱéF"*“tvK‹W³>0bCèc~b2÷ížÞi ÞžŽˆj߸K@^—Q"îÒJÄÆ7øÚS™$++Øð¸Ù7D$ªUĉ»‰ÝüÛì¤=‡¤˜Sne¿"e¬#©!‚wlze*Ui׿{­Òü»üÖx-It{yÒCïŸ$üÖ´j9Hs%Ð-ÈVR‡‡û¯°ÁØa_{bsóÐ{„%j‡¸‹°¬ iÑ^%ºé«û¶gé‘ÉôTìèf¤TÂÆ´ã†"Ôæ†2´É …‡7S„zà.ñ†¹º²2qƒ›ó$~»ªƒùÄxÜQó©9›Ÿ°›O_¾Dø”쪜·O0ìLÞçÇd *„Ól™hË ð®T‹æG­žgÄ09ºN ¡Ìšbgµ²ì5ÑÚb]ÌF.ÃÃ/ì£ã¤õ ˜ƒgw¾~^HNy·¤Ùñ-/Äí ša\·£¡t\¢BEv;–îþPv·P™Ö’>ݪeð„ãf©_k‚ŸÊøÓ×b<Y†Óh§ŒÉÃøæ–‰¿\ú.dÕCÅug†½9kTØH_ÍïH>»b1‹€ßÕçûþR²æ–s-qÂØZ2±½W?:ñ¿ÁèÀ\ðbóKèÀÙ[OjZæï1Ê>®R^õwÚ ~;MØlšf‚F¶Ã‚㢬ˢY5%>Å·ŸGû’¶ué ‰Bõ1iþî5ò£ºR®ÿݨ#u%ˆSðÇ qÖå“ïRlÁ®?õÕa,­ÕÝ+/1i4.Õƒ_XøY0ðÞ ÚjKè„ »ò£ÇÈiü­ ,XPk<Æ<uÚ)mˆˆ% ²b`– Tà—·éV´li(ȶ QïŒ[.åÏ>‰Á³ÏJ|½¾Âh~Ùñ@…êØmSqõbFÝê D&=ã NB…XlÕi‹¤¤ }âÍÁÛæøÝæ1đĀûýJ=KÛwç1ÀJÃÒºåöåO¬Æ*Ï®;zU×b²ˆÆ\½Õ×Åo-’ûgäèø°ñ‹‚¹ÓÚNìö– æ&¤›–õáÕ­jÂ&=[Ôc4ê§³T–}Å…å2ŒV´ü)È)!â¿óÐ#Ò{…ÊdF×}…%ŒÒùެ†ÞTYV!·CæÙk<>¬„³ÕRóÍëB܉O¥¢é¸èbÄŽ# ÃêÕfœxÁs(!{Nñjy’1imzH1?é©$!d°yärŠÜ_«_oY㨦 X¥÷ãåòPI¤‰f5Kºš‡£Ågò²ÉÒêžð³Õo!`0*Î$½%Œžº&¦%ÜÊ÷b<)ûZàO6—;lk¼i4€¯·0»YÔ¢ºÊ$à # Ì$ÛF" •xÂÛ•›»Ê>}ù±6¯üÞÖ¾…Tï¾îÁÜ*u2vÒ»³è–cáíÚf³¤rX'·-aÒ' ˜;`O²d²³º ž«Ú‡¿2ƒkìÏ2ÇÇDuØc‡èweí_ãßq§•ºT á/‘5¼²~e^oi}-È;º!I×î\#ÄakðÎupÕ'Nø@Àu€ÀËgÈŸ'Ùxãû=%¦%°†ÎHÛÉ.0|`£·Æ¹YeINܳ Ú飥âÔ9üQ>PM¤¶)Ï…E+¡d)&ZI™HÅ}•‡Z·­(‰Y^]¼4î VeCD"*xÒÜws÷Lÿ|=¬uìÉh³jD÷â Qœ~´j¿ÕR–û<5…gÜ;“Úµoð(Q‚ŸQ¤N„\Ý&Wµäîµ{ “{ Êh ìF0=®P•݈-ÇhÂlSìö]]¯^ì'…Lt“tCU;¼fÛÕC^öKi?^ŸnQ÷iï?Ÿ®f ¤ÚN·*_v$ìA"µ ;î³,%šß ÄÈ·ˆFbßÉ{$vôY`p 0(Ò’ ‘5/ØðÝau/æðšj‡ºõ)9‚áj‰ do’7ð+ø÷m}+ƒ®e¸öVÄXî´ŽápÑÁ}uÝ©¶Ñ3¹C.¾x9ýµ¨»¼†j¨8ß*KÝűº¾oi¹Ë÷j+Y=z39í0”ý„dû*¦òEÂ*ŽG()2}&Øñ’yÁÒó`þüûeB  %"=cC<Ó§×2ƒ}Z{½øb¢É«±bÌ=ÁÈXå¹±Ah :ÏÑ©RÚäÞ‹=Êç9급‹‡Óx‡v`P1?‰åúá +E`玜1jãôÝRyFäkó7„Âãu2ÐBŠJTÆa»7‚ wâºåBxóbŽiíd¿Ï0àDÁÅ™´õÚ*säLJó1K¦<‡c*(wCè}‰àG>GfŠ‹ou^Cx1Aœ, ÷ßYy’fËB]àÈffÅ6‚µí#Ho³~áìx“†gNZŽRÄaÐ9v ©Éåíi± yÛÔÿÊ:ÚPS.ײìF»ÐQ¦³·ø³¦¯Ã}ýêeèÂ16ÅðiyE]k<ûÀóhÀ¿ÈtÆv0®ß’™ž†+Nœ"¥K ®Tqlé±EU—2›GˆÈžg'&¢ qzíØ´AØú{þ¤×¹9>Ë͵ô ¬ôçvžä B”Ç›Ûù`Éo~ô—¬–»šê‚˜()™"(Xªûç!qrÍ!ý–*Ά!G&éxù¾Ô4j×ù‰— WÇ|ûï‚…‰øKMÝ0ñ¿žT±ÕüÔµºê#'/<Ü~ Ý®K\è™I²âNöw¶¿>g<é2A=Äq»°ðÄq ‘!â9ŸÆiœÖþ?ÿñf«fèo5EmVÄÖÿwK’º„ŽÌ±­Uèw³40V+âiØWdK7BªCG4GÛØÏ{ól¿ý¨‡à­Ï¡Àjwõó#ž}9pü}qx“ W‹ ih—É —$žä%Òí±ŸÈš& f@Û–¦µjeuŸa¹™=þª—ñzÆ‹×ï%͹89ŒÕó¤·»½p§@œ£ZÈG‚Ò(×§Óhס÷¢hì1:¸¥·N¹ß˜ ¼4;à“‚`€AôU$ ¦jþ xDO‘æxÖµÂô§£õß‘?×JÓ0OùeæSFKåU³£(é¸iššø[ijâ& d&òû“xRG’tø=,QоÐàK-Ýd!Œ¯ÁŽ  \3Öà[}¨Ä5¢ŽT[bt¾ÍVŒ'ºaOc,ÕÎ4•‹S)δ¹®D¥–¹Y3/•Ÿ4$g Èb ò™¹„z÷o,ý<¸*91n¢MWѻ֔K—sÕ´ŸNOI£%BÈ¿»˜Ýž–ËO¤ ̇è½åP´ú­Wb©,3PMv‚Eñ.`Y½VƒØþf—™6—’ˆˆ¥ìÐ$69ïêë£wùÁz]²LCÌè ÚW#hðLÆ|7L¥G´ô$œƒ©3y¦ŒC{ ø UÚ§&ZüÏζ._Õ¤<èÍë»Ü ƬÃ"€«ñ\Ámµ­+”òÕa< Hñaçø”BÐIò‹‚ôÂ×€¿0ÙÂ/#ºgvŒ .Éö’ÈŽåø4ókøàKH²0û ¦Y)$V‘pæê ¡jp ûÍ‚ŽB¨=OÞŒ¸#!wžÈð(0Jíì¯Ó·„ƒ²^’xaˆaæ¬8pRƒ{óßë“êöÇQ#ÕÔ>%Bo¶/ï BùÀj’¼®޹ìåøú Ñ·l/ÛKÜ—Š‹X ³öúþ”³u«Éì¤Î‡ÉºZB®Yä¨ô˜/ü;ì”q{ŸâÁõåëÔªš5cÆ%Fâ»_^.°[û`Æ*c¾CížÜœ„;Tמþ[çöÀm¶?5'½*ÑxÃæÎXÙ9}ŽÝ#[$…u—Éß!œ£x¥pèö0€-K7žZwè…ÜZnKE´tHÀ±Öä@B¬]Ù¿¬CqüX]x¿ZÛoù (|ò4^>‡=\éó<¼_åñ‚y ]¼­,fÕA§‰šÅ=l’Â=ÛÐo\é_ÔŸ˜EÝ®Dázœ§òå+N¢Ò›ß AˆºHD&ýÛ÷ùAoÆbó*CR¡•íÍŽ›øbLb…riÀ-ý¾Bü`Agòøáµ·nH¤.s¡$ó‘Íã cþ,‹þóU °Š]·(æÉ˜Öqù3KÏïÀ„Á}¯¥ }‰ãŠô¹ üæB<å–ÖJ`;Jåâ뀰9Á;y•‹¾òꜺ$ Ä¨d­…cü…O¡>‹w¨U±kþý,‰UýáÒIưdZ¨L~䥞P”¶H(/_+<6¦e¥ìöì܃f_LWÌŸ±¯”ѨQ©‚þ4Fž+•H33=±x¯“Ñ€_µâ®ÁSlÂ#å1ê'etÊ©!þÀmãÔ~lÂUÓ·3Uå0+˜ÿ?-sªÆéë¹bŸnœÿÞæ.h‹xÂǤ\wöfËuìàÛQÁ±¾ž»4!—ü⇠1+®^^ì’1„ùš 0.œ@¤¾6;5ÉYǨ_ðS¬Ínhô†¹²’çõñó¦D§ÄÙ\®^9¶º{Ë+ÿ!\ÉEü¯â§(ÃK™²aXSþ²Ï?51”ÁÐ ðhyÑ&›×:h§ž¨ó[4@±p\6ÉúhŽÑS¡ãéüš|Y° <~ÂQ{Lª‹u/m=ªtuÝžjÅVФVËYì²Â|Hˆ ×v§¨×7èÈ‹£ þl„ox–£##^‚²øÅÛeõshwïi5Ru½ø–ËÔ²yÑ<º¤í„d6ºñ8·šÖî¯)#4^|rºÌ'ß–VRq;¥:Š&Ek!“ëäÿJÈ¥·Üÿà0K6^n³“Jí‹—IÍ|²¼ŒÄh^|æ5õ$Š|ãçÓ!)óI }äBb%¬‰ø?•‡…’Q0-š‡ €¨²xÙuëjþj¡‡‰“Aà\=:³ê#g.úóZ¨@&¡‚P9&º|¼¢¢ô“J%,Ò| 5¬1Ñîotÿ½ÖXð Ȭ1Ä׋ÒoA üÆ ŸÂJ?UiPR¿dKƒªÊ«édR Kê`Ò+Ä£.n¸:®” BÊÄb‚ ø¤Æßûì ˜:€º0¯Ø›¢…Êæ5õ÷É?¶SŸ #ò·˜ÕD7ÇÉî„ÎXxEˆz¯Ûí¬N;têi. {†!^ÔGûìJKÔຑ!ìW\ß1Âm¢qêÕðy}ókô&t4-§ðëúÄ[ÔØìã2^ d9âpm-Ül!Bxm+¢}Òs‚M%ïP_‹ F¼Pækoµ|hwÇ©õÉ€ |xTãC ‡íÏÀ¶× Ǻ[¢ÿÐ11*Ù?F™5HPtÀ¯kh’ðÆx„4Cjùûdy!"¯.ö¦k$ŽñŒÒÇö?tëQÔr&³ŽPm¡ (ßË-ÉEvÃî7ûä>‹;Å: ÏQi~U&‰¦R[ÔÞÇI45@bs/éÝ« vAÄ€VKf/Û]({â’+PöKÚÉ4æ?æeõÍÄÜäœâ¿ˆ7DáHW—V"¨‡xþœœ–˜Àmf9ÝÊhMƒâæ¬úoAò÷Ò2Þì—”ÍÁÚ|(ó ¬¾!H&dþ&öe°F˜§{òw_(™£Z Ô«ìbL¸Ó¹™Çb„¾=ÇžëììwbÆ· Öv´ÒטYB»ÀhØ@E>B2,€#mq¬keÏ 9O8”­kioT»<PæÕÇn­7OûRj† £/›…ÊÐ~”3˜Ä˜¿tËÓü‘Ök¸ãž/[E3ó}Ë>nÑÄòÄæ²L›¢Óß-}M†…>דY„ Õoþ+º¡.&«•ôÅpÁkå0œù{?“­ËO^F¥NÉ0(ÀßÁ•–Ÿ6xØbó+s´:A“wÒçî;W{rÇs<Š—RXV‰ƒ ®b#Ôü¼õUIdå½b®ï¯|ã+¤ëšK" hG…hu‡æÆ… qèŠ+º]Íó²w@B[yË&Dè7ô1ïT¿™zI« úßæs¨[ôMéðwN¶–hþ;ÚŽwriäVÃ߯`o Zšá,õÒÂpßÚL+´™Ú„8Œ6±Du·Ë7Ÿ>\¶çg¾ÌÈüTf扪ÊÃf~.×–¨~°9à YŊࣳ^ˆ¬ÄV >çŽ*Sk¾@>k }´¤$´ž‚æ3ŸÌ© oñóÎ0bùcÕœEÄ‚w˜Š`Q‡vP¾£þŽ¿Ø'° /Ã/±5 ¥{"ë-UrTø[Å‹jnÀÏÂi}jKwº“Ì\•èXo ’rHèuÍ»ìÏ›áÈ¢›6Fù€–€è”uvN¾âŸ·%šŠÍÔÕ)Ó¥ ýSçá.ó#öU_s)îÆRa,á¹ÝM¬Þ¼#yòPl,´út˦´$Ÿ~¼Æ*ªxëôÎ|%”~ô+IÝÿ6$8KÎC#g¹“wäX¦öŒ@ÉÞ«ÎõßN”¨ÑÜø8fx´š°*/4Q‘9è°AC ÄÓuw p^nƒ€v_í õd¸ËhS¹›ü¾n[îŸGÔÇÓˆ–üPkk¬Ã$4=ËOk¹%P2nPÖo,7­àDÇ(¹7Ý"ö½L~\²öÈ *J´ó ¥¯1ø ó¶Ûæ’ µlŒ˜"‘É–R_;i[ݽ:7ÓÂüܲ˜.¬ ycÄIºviþwLÔ½ü¯#Ýñâéi8¿2CJ@ ´©’{¸sVËÇëÁIŒ4ûM·þEÁÝ0y°ŽO+ý®OóÍɲr¨o©›=ÞÃ/üâjL ?*‡blPq;®¢}‰eŒz–e稜¾…4–?òjö0‘±G–Y“´ØpZÃI™øDëRÓ£Ÿ¾F9ˆ›¼ð»e mõ¸çÑÖÇ¡6±5 Üߌò ÑÉÌÈÿDŠMæö°²b)IûáÞúaçéÇ™„ù˜ƒÆ¦-UÆ‹U®®ˆÒ­ó³×î }Hšùð8 pmè8u±yÆRûi1¹.'Ð8D¸º4´–ÈCÁDVïÞþa?©¼ûQ=š¿P„÷øi®gŸÒDH{]Þ›—)šJG2ÍV$ǹ© n–rKçcó UªÁO¨"Ð ±õ Õª_†| m¾Úˆ‘](n5&å+Öâ P |£2; »cUêÆke÷yÔr¾|o—U4è¯Õ GöŽUÒŠ«”ˆ'ÙŒ7S2— @œIi6Êðñ6â»Hˆ\i¡ endstream endobj 5129 0 obj << /Length1 1676 /Length2 9896 /Length3 0 /Length 10972 /Filter /FlateDecode >> stream xÚ´TœÙ- Á‚»{p.Á 4ÐH7Æ%¸Á%ÜàîÜÝ‚»ä‘™¹3sïÿ¯õÞb­æÛU»êTÕÙuh(U5XÄÍ & (ÆÂÁÊ.T’Ôä`°³s±²³s¢ÑÐh‚a6 ¿h4ï@ö`(Dð_I{öd“ž˜JP@ÁÑÀÁààäàdgp²³ ü‡µHÀf%V€r@£‘„Ú¹Úƒ-,aOýç@oÊààcþ# n ²›!% Ìdût¢)Р5ƒ`®ÿ•‚^سdcsvvfÚ:°Bí-D˜Î`˜%@ä²w™~7 PÚ‚þÓ+ @Óìð§GjsÚƒO°)âðã1ÙžŽhÈ+Tì@?ÉŠ˜MÀÁÊñwº¿¢'CþššBmí€W0Ä`¶TdYa.0fbö›´q€>Å€` ÉáÚq5ð©Å¿t0µÛÁXÀ6¿›dûæiÎÒ3I¨­-s@û]ŸØdú4xW¶ÿܯ5ê qÿšƒ!fæ¿1s´cÓ‚€?8‚ä¥þ"=™Ðþ±Y€`v~>nvNèäbjÉöûMW;ÐNŽßæ§.<Ýí vó§F@ž`sÐÓ?4w ³wyºÿÛñ߃`6…L@`Ú?ÙŸÌ ó?ñ“ìÁ.}ö'rØÿýýeø$23(ÄÆõú·Ì¦ª$©­¤ÂôŸžÿöJH@]îÜNv;€ïéÃó¿ó¨ÁÕñ¯Pyˆ9ð;×ïzŸõŸšþ’ý_KÂøïdÊÐ'õ‚ôÿˆÝ€‡Ýôé‡ãÿYò„üÿ)ýw–ÿ»Øÿ·$G›?ô1þ? -ØÆõ/Ê“|aO« }ZÈÿRµA.°È ìhû¿^yði%Ä!6Ïì v™©‚a¦–jæO»Öï}³C@ªPðï'ÀÂÁÎþ?¾§%3µ~zFž„ù§ èð´q°?nñ7=íÔ— 1…šý^>N^ÐÞèŠötóOˆçIO[jrùCÚ6Vöxj×`µGû}˼<6ñߦ?/€MâoÄÇ `“ûqØþFüìO*ü=ù4ÿF|6à?HÀfú7â~b>½¶ÿøOÍì_Àú| °ü|ªü/È`³ù|:Ëöø$g6È¿àSfè¿àSfûÁ§Xç çÙõø_ó6u´·º?¶äé2þƒÿxù@ )Ú쨩¿U…Óu™8‰3Ëæ°0âQâµ'ËpÎ{X—ô¸Ñj´FjÊÜÛ™ÙN™÷V-ʮӖ¦ÏÜ7*)ª\¹/Y(dv,(L>ÿøu 7ã~EJõ³îY¦v¼¹`ž}×3U²0¬VTQ3‹. LºŠŽ™gZ¼o2| MÊÍ­eßR HÞ¬©ÃêMz57yÎ_Ñ¥¯ÙFú­2IPþBõV¸ù-Ú¹k¥§¿w»“¬-ÌGÁÉwó˜:†--ÔK*Å\ún!ëå}zžÓþwY\±}³®fÜM=€ñÝò»Þ;AƒNQ†é¤ÃœsÐrbBpœõY ~!‚‰Z]ô#M<Žôs…ãþmË=ïím×/Ìu¸é³EafÎüß6eåW02 ýÝu¸éáú jg 5âGYDÊÏ…äØ-Å+ >»Y/KÀ¬@†«þ=%`/Ùò67i§Ë×åܳ³]/†67 ÓCìheÎ7ây+™æÕZçKCÁ_ŠÒFX±}[B=™[CùŸ«SM…éñÓß¹-ð4ù‹öß& »khš ]¿ž×¢æ[W\~Jk_mź÷7Å+=ÐóÃ=R(šþäVÕ×qv*L¥gæï®2Åvy2€jëë&”g&ž˜h‰-mù`‹ãY䯸¬”–Æ<û‹q8«”=<žõ'¬]›+›²ªH8Á˜Þg2:(ªCŠsÚ-<»4_<ž·õxQE1ä7Ð PÊ¡0íd$ú§÷Ê$ºU¨Jýºùî$“yÓH4ŽËýºV¸ßrþ˜’‡à;‰õ\Œ©Ç”‹D!‘tºûgû.åÊúòòÒ©\âVœsÈ ø¾£µù§.Æóµ&°°1Ì—À2?’kaÅ{³”›ñ±êÅÑD½9wéÿ—47¢;W¥ØýÔØsGDzx7¬@ËH]ƒÞ s¯›¸WëÚ›jT²V²GÝ…ôÇ XÇ?=T,í-x=M Á‰«éx)N¤­|P˜[<ä5_ nÔ¹Õf%ÿÍE˜,ÿ‰×c²ìI]c{·ˆÕG}M1÷š›©.ìSòGzŠYÖ• 3;ªÕwkÞäÑ\ÜØÖLà’¤kKÍŒN¶¶r'²³Ú¼ú£«¤Š´¿‰’“Q˜©¾Y’ ,«øãu ŠPJ ^j`!?f?–ØHXNât¯4 àas8È ‹J³ÊЦcÄ´Ùa½ñ6Ú'*¡e‡)'Ä!}>zQ»'~dQ¾Téä3¾¶N½zýN^S£: è‹ømphbWÛ˜ÛdåvcùÕØ½Ñãd žjã5›qu¯ÇÁî9ùU‰SÂý³_Üu( n-Òwää–™üêt?:A7AÔÒÄŸ^ [d¬±'G|ê$‘¹ÄûˆâdÚ9+M TÍ—Nïù‚¥G$z¹1ñ()··";ãú%ð Þj5î+_ã­½QHÅP-Agá<±ÈçöÛ&Zt˜õݺw‹ØC¦;ºËòRâ.Œr’æSíÞÖTÔÌSxWâJ*§_ÕÒ de5d¢zåc‡ê·,D¥EÔED“}g&´Î.Ó °M}ˆ¾YüÂ5Û•?ñ"LÖð2ßÈ>¼Æhýüóa•þ…Ó ôHº‹_Å`×µZd€ J‰ás aä8³ºAüiŒäȯWáݨÓéƒØL½ôÏ1©¡§ÇG$ѼÞŠV”¡™W£í¨‰Ù:çh’1kNð~>Ü9$‰ÝÄ5W¸#9b9÷Qúk!Q¥%âl–W3œÅcþÉ¿!fuaÔ¯À—ÅÍY”½{¹ýDz¼öž&ï†ëhoµÖ²ºì© K~„ã æ(Íö_‘uÄ £ÀÕY=<äK"GjU/lñdSåδ[êUŠ—1uú¤ ¾ÚŽóóbV”à³–¢_÷T^løöéíV³Il 2»¬{¿„T Іú爹h^]›£¢0ÚoÑæÖ‡˜›ÖÆ%!¥É_*‡FFûE=&b&Ù|W < –EÓH‰UI—ç^æÂNU›ÈÇ‘ëÓ™ ¼PŒ‘^#[ ]ȈoU§Z¿€5Ñ%ÜnÓÊåeN WºïÄÀœ¡Ñ!:ËÊN_íõ—i\ueÌBﻃ |F^§yvÙ'„‘Á‰v½Fˆeºì× ¨¯h÷oÅ T˜ŠsÈXî{pÐ1ÁµôVêˆEŒÌ#Q„o(ªà`bÄCiÈÔM%/sÈ-¿Ð§¨Ä?¢N޵=”kØ:œºP<5R¬ùd˜·­KâkÉ2Èh4,-d²ÞV 9Ö®‘’ ¥S£Ej|'±Ì)Á¥=`@¢ y!Ç9z~«l¸c'û£á¬¬ÖÖ“üèuûÕh÷ùŒ{0,“: £úå/·™Ì€7IúÏ=ÎׄZæà(‡¿ñ¶Y¤ÖR¸f_¼s»[jZ'Ý™ RäFÁ™ùîE¾týq+!‡>Y1xŠ^0ÇšJŽP5Û¹€GÛIƒ¨’R~š—˜wš°Ð™ít܆ÀŠüÌ”â¯%ø²Û¨üRZò èWk”лW=97f VSñ?ÍÞê·¼1‘ó•N×1oI{ì’Ù˜W ;[U® Ì N©×ð¡TÔ×meÂ*#/}¼ñæëó§J”°VÒ;Ù”ÕzÖ̈DÈ=`ZZ ¼£+,¡ÛC Á§v9üNÔ›RŽÖZ¥ØnÐæ”^LyRÙÆå®/µÚ®OX NëÙ–g[Âʰ eä/òk02¿g; çRÂÛCc¤P,)4åMìü^â ™ª Ö ‹óý$¥u|ùvÃhŠ7H5¾þj ¡Íh á³_䔣‘É£:âH ¦= )©‹!>(ø‡|­c°Î¥/o?I 3¿TØ1µQÃÈ,ZÔò/ˆ3mpüZX,Ý„(Ï—C?QGn¶ ¡6J'•dy%›ôn½_âîq(qÀF5Ï)‹±f‚³ü‰÷ºH9¯ËÃçÕá°‡9¾éá´œÕØ!FéìoèÄN@ï·†— ÓfiþKoƒC×ÃÎÊ•”…wIX‚ZTA¥ ‘-SJ\õÇÝ5Ð2e½9NI&"¡ïÛÛ­…Q»âs3æqIFb&þžš½&(x?èòFƒD˜ÕÎwÊ.МúÇ{¸lVó5 ñDÆp3É «EÇ­™1Øúw‚…°Cg«cõ'1ز/e ¿ÂaÎè(¤÷r/Ù0µß_Â[£®»÷›ÀÑ,aíI>|œ¡t†\Í`~ ¤zÿÈÄWnKê"Ë©YD¤ -Õ0¿P0/Õujò]Oú ¤¦ È16h?ª ¬”gåòŸÖ˜9›ÖŠÌiïðÐÜFiù˜Õo½£Ñ¦»oeâƒë—&+ò¬¥ø¾Ós‚ɤj·o€ÿ >Æ#$Ð"¤…¶N¯P*p½YŽîJâER¡èü&‹¼„±‚-÷aÇ)Žc%;Âû-í½aGΉÃÄPžEÔ.w}‡ÒóéÌáèæÕö þeqC©òÇ N“ç 'òowoÄ›Öï©›ŠõÛÞ^²5šfd”2µ’c'Ž9£}tK™˜ï‚Ï{N9H@>‰T8¦¸5LæÂ}öþÓ%%ÃlâË™²"ÎbihLlÕ!þýMæï²µÑó¡*Χъá5,ÉXâÆ ÎoÇûØX#°Oaš@5ÚÕ&×ä*Dää䇨uØÀ”£sÆØ~˜ÍFªþd)Š¡ÑXX*"á j&†Ž.£&ít7ܱ˜Æw÷ÌÃnXfC}¦=‰ZÊ\êzYŸ5\ĸ¿ é½nêupÿ~µ2OWvÉ<.ßn6ñè ‚áœbÜ’Ïóè¨rÜê œ€r¿ÜöÜúÐä[a©`”†+ð²Ž]÷¸¢ÁÎiÔ`Áµ²ºÎcŒÏ áf±xÇe0O‰É²ÎF*Ó2[˜T v(#„‰3Ÿç|Æ•Psé¥|žwKOiˆÈi¡*ЛÀÀ8c¼û4žüűå`k— ¬Ö.qØ1¨IY𵤕ÿ±:ørŸTþhÖ°€E2Y+nºØ"ÀØåmÃF*!!ÃC”„G¬o—Zà€ª;û(‹¬Æm‚Úå`µy¬[Í•²°ï˜ L¼Ô’mÊÀ¯b¨6e”& - bÖão«n®‚ºÙÀÅ>Û³ùE/笛TW .ˆv?çi!éŒCö¿G2£‰õi¦­+E«;Ç&}éÐŒ˜²œ®+«³i¥’¿Iž—Û`MÊÊ\Ýx/Íä'Wn¡1‚â;åÙõs)`¦×¥ø¥nLØ:">Sñ¾¾“t§ëèð¬Íw ¼ƒ«¨ŠÐ÷’ò‹L[EÏ~Õx™}gso^ZÒzb¨¸Ï¡6¢šB/™±}G…¼­6Èó ÒuÖ91]U0¦h[fœM ܚɵBíK2ØÎÛL~ð̹¯©ÚÁ„ߺø9ÜÂÕk! ™hW„a(_oEñÌÆG3õç»Çˆ(y<óF>3%¾99Ég’(öØnK€Æ&Ó¨¡ù8gFqv mÝEç9 `¤ŠÎt˜vª/²=Tó~@³…FÏ/¤Z9ÅW…ßø.ý¢ò@êTtM…Hì¶®Îo2ÌžÞE›šâF;gÄO§K—*Õ6àyBdyM %pg®>'¹åvHÔ¤™”QðœÄÙ_UTdаÝ5( ©Þ%£TÜH<ÐÔŒki=Z¦z|Þ}O?¾b¦Å&ø|žLì<Üp£<©Ï+Ë&ÔÊù|}zŠsà÷¾ÅLè¢i»½ã¬:5('&¨`CðK³÷ÝE1—ÙgŸb'OÜ”;†0¶K;ߦkܱû’ÐãïØÂaƒ½[TÖŠEƒkú·AdSäòÙ˜x5ób¥® ýûª¡èúâ$zY4+þ΀µb¤½Ë%GÇ“Ö%ÿòÑWbûqÓPšU± x˜…V¸ Àœ»_Ú8zSþÆû8º{f ÈÔ‰kßlèîˆô•VWú<¿e@ýÜ—WvŠŸP¦„‰€{ÉùÓàd­pßÜoÑ›Ï`ÉÿÐO\ºo×à̯ÑuW7z‘s–ω¦«öÁ÷6¯R¡¤zn¤@¬ŠN‚:9À¸\Ü£WXÝ0žö9×·–™“qª†5™`}fS]/Þtmþ£æB¸†Ú*ƒ+‘ùšÙÊ/] Áï“©ÖWø,ÃÛ¨*ÎÙ ¾Û:eûî‡N™ñ¹áG…Ù”F³ŸaöH­E &p–¶N…õƒKÛ“i0—sÞvͶ–±7QžF ôoÀë"a ™¨Q=²‚š†î2×åh?\ÊÉ÷xÅò]÷žwg›¹Wç¾(¡Ú¯-b¼Ç|×Ì:to»j*ü¢ÙIK®»SËÑ©%άžxó@°G§©c꣇甂º XÖî€ÏëúU Ä ©þ¹»ÊìÖ‰Íÿø¥QéFeLCÔo“ ï´ÒÄ¢«iÆ¢#<¤e§ã>@4¶Nís)G,]îytÖ¬2aN*‚„unI‚ˆKÖ2š{Ö3àëDüq ÎÅë/"¼|vZ‘mœ¯…„ BöÞ¬ÕaE¡ŒÂWk×±™äz7Ñ6ãyz㟲.bÓIÅ«¼gwºz¿Ù|ÈÀŽ=S!¿l³6WηÚñ)]‚j ¯Áegª‡¤&ĤXOm¸üÙÈ¢nŸAý]Ò«þâe™»Ì–/ñª½ûîŽAÍîQ˜Î©¬}xPã@ó[»dïMx—˜ÙT¤¬8j«Ë‰w”þ õj¤Šƒá¶"fã¥7UóÆ0³R‰z{„[è±nº9ÈD®Hl–3Ò ÂC›€ôTUÆüç:–/žo_Û8yJ®V ¸E5]¿hNSÞéí„0x‰ocë,sç%>O˜´Þ·µ™–TS¤Ô=FÍÊp•x†ë%Mé8ˆí˜…ƒÄÄΧ›‘¶MÐõV=ÿ²º6ÃÖíµ–Y§Î!.̘MÿµwÔ&³žœ¥^ÜhšR„¾Š‹n„»„ùõní«”I'ü…JM3]›sÔ쩎q®0ºž¦# I\ð¾ÓüÇ%!¡ÛS›7á+]–|ó½‡Né¨éðÞìjxdhäãÉÍ3ÑVhkq`“,BïÒ™HÖ)¼—ÏU1•[Ì ÃÕä‡oŸT ‘BÚTjuwl„PßÀ@åÇÍ.}Sî¾­e/¢ˆuĶ¿_S»¬´RΑÍè3ˆõ° 0È3|}Z«ÖmA£`XƒxnxðjüR6õ„7·Zeý–õMúÅvÔzÍXÉÑòxïÏtм]Ï䞎Z{ ÅÄ–â[[3Rû÷‰ƒ½ |gÌQ/tA²Üøîšé³×g^6Ï?ÊÀB„»²V®º&¯<»ÆœëŠÁqŒ–þ×ÝY±¦ 'ùŒ=mI²I÷ì'bFð‘c^Ÿ+Û9F„¬Ù™Ó›1fÄ¡&Û§9-6`BÄýMã;>™½ÐàÌ­ú i‰m®cùò-’]KŒZBÌ‚z¬=”žG¼ÿ£(³fšÔÅû*“ ©mXßD1̱aI!ÍÍòBÏ™2Zã'ßJ ¬”ô¹v…ç‡òý||˜'¿‡êí¦–ÔBoÞ5ÉÁdvB¸”S /¢ö;´Ú‚öÔêv§´Æ \׉›[lR¯O3õê@ñq‘_.ƒ^Øj‹%_Q&ÂÓž:rªŸéã(c°ðª}ý•ÏÚò–Æù»U®ÀE«½ÔØ"yŸú¨'vù™#­Icíár}tfVÊ$(6Úk~¬OÅsÔ}¤D  =í²xz-íÊŠ¤q¼h÷’¬ZÛö oÝm“¦—ÅŒÐ0ª9CÓ™ÀIqå•(\ã ôXäŽÑôûâ¸Ìn•»nÆø¥¤È`¢Ñ`–Y›[QDøØ‰« a6Ò2Ó‹QŸÉʰßöùôÓ‰UÂÍÁͺý–‚".ç*$Æ[z¸›wnü*ˆò²Bä6^àÅ*‰ËB/´|:좷ë˜ÓÈŒÅÞåYˆÆu+– @-s„U1õ°ÞŸ€D…?X´ ÌrGÇ-uq¼¢ÍR ‰ÁHcå x-UZF£õËMê²±ßá¨d©õ"ËZ»a-ÁÜjDBäˆât¢fR‡/Þ ¬*{!a8=¢ìÿ–m¶E¢ÛFˆ|sßÊ22"&D CáÕYºÖ´ ñq½£€¥]‡Ð›ŒÔ¹{ÏT®+$,Ÿo²AZNñqÔ|^ çĬ+Â,ñ‘Ý_S=¥ÌÓûlÎU3ÈrŒÕLXÕÌVSqbAÖr«W›šÉ ÷ØD¥Ãyh˜…6MÀõrΦ0ÚgôMZq¢ çÇÕÇ´òäæ/i°ÚKËu^¿úè²ÞYªÏ¨{¶ƒ~tj>&U„ðC>ØddÃ×£Ó¿Nirq¦e<øKº=ïz#±Œèù’õp¯Ÿ‹½.¥sy,“Ûרß×–ï–J¯Ôž><#ÑèžÊÜ·¸õmÿÀ·ÎÐ+¸$?6§]&æz×6 tUuý¹¹Çé\î ¢ñ=Ø Här#ÂR½&}¡áÜžBù©ƒô“‹+v6–|7&²jDPFiD³¼nŒçV*¼пeþ†ÓÄQ0«3B?qÙ2®Õ\—¬&¦%÷½0tBG¼AûË‚déZH?ÓyHÆ*nÞë€t}ÈhÆ/Y †ù“›»ÐùkîyŒ¢¾ËäQíçvàÆ-ÈP³où[°\¤I ×;œðŸ³DÒØ=ä2”€ð”ãb= ù‰R4ÑK%BÙŠ„Iº«ÑùÝÊbä5Øm‘þû Õn&¥©³ÔÄ…A½àmߦ™|”ŽN_„W›{8Ñ ¼„®XÜ’ÑèvgÊQŸ·'\VµDSçÊC„2*¬z¢Ã@é/k™õY†1†›¿àÒW±+ám0ÐÁÌ<7üX6gHPüéµ3" à¡b]Rö¡EçÈy]IfÛË.êÌóá1]×rÇŠ¤­]ÏV¢kF`ÿlÔjS ºùÙçä’ùÐ?õ~ø¦y%¨çCAãc¬<$Ä‹ÖOÚ+ãÇ+)è-ÚmN¯€Lþ®c??ƒ‹ÿ= ÃÒ«©{Ί9§w•Ù´–Ža1JìÙ 2M_G¢²]W]- „ä»2còšš“„Fç4|‡D9ÒMNFœ%‡6tµ¬¹OH©JÇF¤µR¾4FC>²ÃüQ6çWMj>¥x2¹T•Àš‹.­³Ϭ·°hê¥â¶¬¢ÂýÞªÒp7ÕÕùs ø]•H[ÌfIX8ûûURÙºd‡×©Ö˜ç댢@tW"W68ÉÀ”ŽU5˜)Én'ž-ë/†Ó—sò_ޏl,Y ¼OÇôS°âi…\ù¶uZ–åľÞP–:ž˜ùáÜhÇ c˜PÕåÆ ›LìÏÞÈ„ع ÅÝ’çÌÊi?zèyõiÿìhp3}–SlQ.¡ÚòrÃlæ*Ñ}êÃTùáÑ@LºbÀ1_R+ãX¸v¨¸(™·ŽÓZa¦?ŽŸË’5Âê~t1þñˆ»fÈLº„ä(O!£ØP¾+_þJm5 ¼«X÷ª —Aþå”l ûä *! gÃA¬üeJ¾qJLúqoÀ/+sQ§÷¢S§Zn6–šl–ï}÷C‡YÒåð¸£+áDjé2[K»ätíŠâ¼4'6,u„sŠÇ¢ W/ó0;ˆwe¨E#(^'g¯´ÄŽœ #Â]5ôºiË}8É'{®ç#Ëi = H Œ}aŠè)ïŠcžÓî^Xú¤‰ ƒ“[Z ÆÙ±Q¸Ñ‚J¤Þ¾\Å„tÁr.H‰HV$¸ w‹/ Úʳ<Ýh ШÍô½Ý_6õ –Ãv_í„иYøå§õ·½”n2©pÜÒ¸B+Þ«;e¿}Íy´¿È£‘#‹êgÄL„]xo`"í†ß‰Q¶¾ýIþ~­uIÄræ%],^ÂÅþÄf&f)Ëꃕ>ÅAFäQZúe.ûkÜñ·WÃ}šïÏl+£~5â-ióqC}³æí3nr[hCzÔªçß çn[#ÅJ z(Ýlïó`±âÓm[X§¸*úþÜŸbKw*Uv¡K:6ËÙVdà-yW˜o1á,`ßR¿Qä³±²ÿ\è;ñ¡¡%Áõ®Ø›Hb2”ŒøOûÇ¡:gQDou>{FqØZ/þØI¼ˆ¼H:-þÐ9Çûà[U¹â‰Â§ûyTà³`º‰ðiž‹*FtïÖö]Ú ëQmMYÌŠrcÒ‹ŸÛŽ÷7x¾ÛNˆãÕ¹éKÝï#˜c˜áG9Uˬ<×4•’/nû’B?ÆŸ“þü‘s@îÑ‹ÎËÆšp‹Ø;Ö>²·Úô‰\?Šè†yðB_h«éKÌMþÜæ$MX°wè‹(NôcÎq4y,´ÖS «’½Õq"߆±5Ðò¾þçÓ’‰IªG]]ÿ÷h˜"*¤6òò C`û^¨ëµa¦Q×õÒŠJÛ`Bc"•ís™q\Ø,ø¨vàñ‘ˆÚõECð íÕr¨s1pdñYö·é/ƒY†ü_ ¦ç1:û¦¼¥–0(.Øõ;Žÿ¸$7\±bÏ[q¡ —}Ñ–)4vÞ!=]8š$Èñký8΋õwAÅFé?q°’?ŽÊI´ƒìAÂòÏv‘PæCƒ«' — êÓE=k•‰Hèsäé$¯dʌՖ<ý¨¨$N<×>½YdÈTOP;óÀ sÆÝi&µ2µ'»[<¨8Uå¦Ù¨ÅÅaWI ²´ãîõè©Ö#Vø."xІáMf÷OälI®Ö^ƒèQ+Í´iµüUö:kÊöð¶6+jë2Ï NàgÄ~ôÕA-·ÉzûÕY$›ú„Ì'è´¨ÏK’Þ÷GR0Y¢{Kðöדe;@ƒ~?Æ­_u+ìn”¢Ò½¼“ï›š¨ÎãðH.B•¦Áö± Ôz¹ó­¬~O¢Ì2ÁŒ©Ð=¬@PHU’…É/¾½5¹M㩘Ó(ñ‡ê—5>bÓ«‚Æ‘Ã×.t$ìGÜöæ¬÷Ë•ql’ÉdPùž[«ó6r®%·0׺ļB/ãŨ×îyQn®¿Ü×,.Jü|CLrùúeÁvÒŸLmÍ/^Öð8Q¿‡ã<›Xñ7±ìb‰¸òvYð—öLÄg-È8¯Œ6ÑÀ«˜®Ÿ#R‹v¿p¢( ?üBsê ”"³·¹LN4‡¦‡ñçŠTÉs“¿¾’·õEˆFÐ ÈÛæy8°9‡ÓúfR-Üü¶RœÚ%PxUdI¤„?ă[E»áÍ8.Æ<2²"¥œí²uã*ÍÑßvƒZ5h3Ðüó{ØøÁšf[Ù\×±ð+â ׆åâšNkO}’5 –”Iç`Æ+B9¯4Ó¨ñTì ¡ÎôŠ~½d}ö\„†âž])UG£^ðÏC¸ŒÅh·èæ¬8.Äx¬Ü|æuäÓ,¦ó4tu%=]‘˜…ñÎÈæ8CßÒäÌÀHMÿ½æF-“Ówjbråw2gœ¡%4òÁÑm70mσÑZ†j-®™à OìÆíðÝÊÇñ޲Ãó‚Ö®9†>5¼ÔpAå¼Ã¼{Õ¼Ó¤?íÃÎuüè¸îÍ718Š«‰¸¾xEÁ,2ÌfÑB‚ÕU†Û% ¿›;S×¢©Ùš™sX™ l=£±C¥½fÙä|„¿Œàû$sÑ×p¶Æi+P«Iu9(–ŒÌ3›i³ÚݹÇÏá¼Jèpß‹"µüð¸\¤ò(ó& rhò PPž§Þ}øð,ànA®Â(™ABzKû9Ï·­ót$«v<ÃÎF’8y_°G“Ff)ž©÷q@“U³8Y“J>œb4 6¡¨XY¶l€4ö¡îÌgÿÕõÇØŒ—ì(JìÚï'âÁÕ‹…èûƒ¦/W…v­´ª{GÂ\Ácv(èâg2ýøŽ,?ú 3û½®˜ç1>èBtÌ·b'»ÕnÖ‡rlöBÒvR»‰%¬F7zæû¨·¬j.1rÏQðô*ï‹Èaú¥tÇÜËw§˜E*(û<Ú”ÜÌs²JÿS~rbj{io4³$áe/ñ,¢¬çWŽU./˜UIÊ™ø×@‹¹:¦ÏI¸~õLõu»x½ÝRÛØ†ÐpŒPš| ëP‰ ›‡™5>û6ì+œs±@n`-6¥n¿½~ˆöÕÖ$SBú¾Íý:ËÆ`ì ÿdjlàÓêw6ÈûéÓúí%gϰF»Ählœ~ÑRðÚÚˆ—`ßó÷ôwK–Wë¿vç2tÅh²žú¨Ñý mò,P¶W& Q½Sþà=°X(=&æ½) ?¥Ðõ†ÝÅï˜FÕ ”×°BµÅ:îgâa1óó.…àÍf§ÄYµsÁ×슽Äcó‡€Þ©ùiyÅí0+tZ·¶úºCô¡É§ÚNëZ…-F诳F³‚OÈ.™;LR%´aüèà¨ÄŒ<«PÚ÷:D(ûéCWñUß^FÙþÕ¦(ÍÛh’ãìyŠPM9sù€ó!§®*,(Ù>~X“v:WœwÆÄõ¬?¾¤^R®˜¸ØwYfUþ,{ö9ñ‹ûKŸÖEõK/x$>1lí»(ÝÓŸÍE ùqgÈ~Ì »_F o _¸þJºWB­ýÊÛ7SÐeábviSt·HæJSýJ¼–àÍgÛØçd™¦Óú©úN¸AƒÅÚ*jÞ¢«~bî·qçFjÑ0Óš3££ºìÈG(2 y{Úê¯ÐSÓ¶"æZ®EÁ[†"óΔºÝ‰È»P!´Þ÷i9›³¯Z”…£…g ˜QFms‰(‡Q }oéäV¤ßß‘ñœç‰t¥Ð‘¬i+•Ðjûqoû¸îMã²ÂÌ÷cã{ÑÝñüË3h Ö¢1ÜКkæ• Â<]K}¥¯®îJ lØÏûñÛØ/Ó2*6´ Ì.âêxƒ’E `D¾>ªƒA;NÉ|øa“иþÏXt–á²Ç_üžpÛåË@¾u“˵[’zá,WŠ…˜á§Ž™mUd•ERkÂ!1-[¶- zÊÚŃR²Ÿ7¾Í;™ÿƒ{pL endstream endobj 5130 0 obj << /Length1 1793 /Length2 11183 /Length3 0 /Length 12326 /Filter /FlateDecode >> stream xÚ·Pœé-Jp îi<¸»»‡  4и4îîww÷`Á4¸» Üõ’™93sÎ{U÷VWuÿkûþöÚ_ýMIþA•AÄÄÖ$ika`adæˆ)(Ȱ0˜™Ù™™Y‘))ÕÀ+ÐäÈ” G°­ ï¿,Ä@@È‹Ly1T°µÈ:YXØ,œ¼,\¼ÌÌVffžÿÚ:ðÄÎ`€#@ÖÖäˆL)fkçæ63‡¼äùÏ#€Æ˜ÀÂÃÃEÿ‡;@Ää6Ú€sõKFc @ÕÖ ‚¸ýW~sÄŽ—‰ÉÅÅ…híÈhë`&HKpCÌ* Gƒ3Èð»e€"ÐôWkŒÈ”5s°ãŸ U[Sˆ ÐxXA6Ž/.N6& ÀKv€ªŒ<@Édó§±üŸô€¿ÀÂÈòw¸¿¼Ûüá 46¶µ¶Ú¸m̦`+@IRžâ ¡mL~­m_üÎ@°ÐèÅàÒIeð¥Ã¿ús4vÛAÁV¿{dúæå˜%lLÄl­­A6Gäßõ‰ƒ@Æ/çîÆô×p-ml]l<þƒLÁ6&¦¿Û0q²cR·Û;dÄÿ²y!ÿ#3AÌÜ\lÜ=äjlÎô;š›è%ËoñK^v¶vÓ—6@^`SÐ˲‡#Ѐ88¼<þ­øo„ÌÂ0CF 3° ò?Ñ_Ä Ó?ñËüÀ®æú±˜þ~Ò{a˜‰­•Û?挘IEKM\Lëý_-ÿ­µux0°±X9˜,ÌìÜ®—¯ÿŽóþ«ŽùÊØ˜Ú~û]ïËAý§fç¿H@ó׆Ðþ;˜¢í uAš˜®ËÌÁlüòÅòÿÌ÷?\þÿhþ;Êÿ•éÿ[‘¤“•Õzš? þ?z 5ØÊí/‹ê:A^Ö@Áöelþ×Tôçî*€LÀNÖÿ«•_ÖAÄÆì…Ò ,ìŒÌìÊÁŽ’`WÉ0ÄØüOÚü)Wÿ½pV`Ð[Gðï+æÅ‹™ùt/[flùr8¾póOÐñeå  ò7½,Õ×!aclkò{ûX98@ òËð_ÀƒåeMM@®°ÀÄhc yq¼ôì0µu@þ=hN“ÈoÑŸˆÀ$ú7âzAòÿ “Ò߈›À¤õzÑiÿx¸LÀЋ¥Ñ?èÅÒøoÄñ½ì÷?Ö¿Ï„Éä_Àúd0™þÙLfÀ»s¾èÍ~_Í/SýÇé¥ËÁ—¤ÖÿÀÚ3ÙüSÑKµv/lµý§Ö—#²ÿ“â¥"G+ £ù¿B¼ä_ð%ŸÓ¿àKHç ëK>×Á—pnÿ‚/ ¸ÿÿkÌÆN/<øc?_8ðüÇ ¹‚Œ‘fmù-êÛnjDÞ¸0lòçÜh±2Œè#Bz%& 6âT33åÊ$zX$õ-:Eío²VçÎ=¶êÉÜØ¯È$wÍÈŒbfŸ¯^MÇ{\¿Eo†ÊÕL%å-vè…ú@Ñ…$dbÖ«J‰îI]×=ïB…S"É%Ô¦ØÑUS’!GÌ£qøCÒb4 ¶ÍqA@ýÃúSÀf¤nX²bÚ[9þŽ[ä8—jŒõþÁeÌ’¯~²ÎþÛ'ÁL ¾bqv„jå<´‡ìbçƒ4,#)lá“Þò5Ú¤›:Å3ó­³=rš„..sÃÓH–C÷[L»eчœüp“¥¬2˜¦~ÁøkGîT°ô·ÕÊ$–²!Arn‹ÓÝëNrÉ2:c}4ô qO[‡^Ÿ)Û£œMƒ¡[©k’0·$ÞãeÐî{™äõQXe._ÑMk²êp§˜·© -ó¶úja²±¡:ƒSªÔј>ÿìG(Ô¾òpgÊ;ïè¥Z´¯Ž°‰ÂŠt_¯_öL+Ƚ;faúÞ`œZ)æîb½qåYíº¡'ßom[èUéÞfÍñk}3:Ò–@–UºßEÀØö¶ri³'ô’´:ƪD1§üîÂo¤Ï¶ Š Ù¹Ä/òîÀýñ:  ˆl×àWö—Oc²ÓŒ³?¯ZpþùT°5YÉW–ÝZ„yøQ…­q¶…gÀ£ã}^ëæFØi{L!aKIÝÜ‹{‰&ÕGy `/îSd›ÈúEKvíTí›é_¯ÛJüyJf\°™½!:Ï@#Óé0 {6z¶5À=%Ö(X»ëóBh<Ó|Kö‹z«13ýÛ:ðlÏö£¤£R,m`Bå± ëY‹K¤â—Ê)iÁKq¯ËÄ¥ÌØ^íD´¶_ µ,«ÌJÐà;YŒ:Z2dË€ž†æQÅF>´_]´Žu¨˜-Nê´ ¸ÜṉSÌ U›‚ò¨à|¼°ìž&÷MgõÀûYäÞ7Vìî{ç»6*çë$Q áêz:hwϤØDM0cÏ0mtjºh°jôš#ÛØ§O–9ôú‘Fqi'îC-ˆ@”¡ vQøÍ}l8¬åû¾Ñ;–ã÷‹˜S¯Ð5?×±ÚÙfˆßg”‡Át¸ šÎI×ßéé©I\}µHS÷fz²µ…·HKÁX±âÞr×Z޳«»ÈNÏ”&׸^ö3i$oôå3aÏËW+D_àà¥ß¼sÆyg,÷‰ny–ï½û.‚Vd5–;ª%¿@yjÍ¥WhßgĹÍ%s×2*‡A$Ÿ¹ŽÝ7miä?±{ˆž¢°l¶ºZ¥4¸°¦ÐÃHåÙdè ÈÙÆ·Êù-ߦ¨}`ñ÷Ã&屃 ‹žÉ’\ô0Rkn3…þñ+§Ò#L~ò€*´« yP+“gs°hýîúèóš öâVƒZÎü€í‘ŠKÚÔ/ri:¨å™é )¬u—„ø+žÛý¯f4¯ÀœÈ΢V^@ë[.ß3{HàºéWÖÎDmM07¬ªÊ”V¢>†c«E¢’~ÛF@+e×ëOê™­Aë‚ÓQL9Õ¥bÖ¶kÛÌ£”^¹vKø&?=ÌñØñÂô]Ä‹N„AÊ&h=0û@°‰ö„þºpçg!D»×`6>â:?ÑÞÐý=iÿÅåk˜‰·•rÆ{;ÈÈ‚ßÔl' 舱›¿ݹø.¼³Ã†§HU%ùÖùfr(³~dã%Èlz3À¯-5áÁról¬!CXÃIcà ðö& dâë°R¦x̪g n\±Ÿ? “Œ8¤~qv[ª6×§û*-·Pë©{1¯æ‚ý™Há ŸžîsO¸3‡cY!O~Mö[N`[&H{/Í+†³”ÕK.€ùÈ@£oôK$ÂÒ0S1g—÷Pó™¥h\hߓՑ KܪÖ>ÿií¨š>XWg¬vl/ß-IŠô·éF8ä4ŸÝ-Å•UŒ |õýh{Í=™–([Š„Wì•Sðì·©kõËÏ"té†f“!ÊeµuH4E?ù†üj”QÕÉÅìŒvG„ùnºÅ x@{T’:4ÈyA·1·EB£QPá¿RÚZ .ª‚0'M•5WÇ¡7K²Kœn™W®c£,™âª¨ª9._Ÿ,¹ý<3äW˰&¯­ñ±Ìè]+Kg˜ÙiØOPbڲηŽ\«·K>¦£ñ&·?V=¹æ*} bu§&M<`3ùä–ÞRïë{~p ]η b#õÔ#Të¥ní¼qoñ[Q¬¢J$JšQgþÌÈÄÍ×?!ójLÒ=¢¨ÃW}žIÆjΔÓÕ~=‡É ¹ÎÅ«Ö_Zš©žŽònÉ(Ñ2¾úA»ÖÍÖu¼Ñ¢ê(Ù5¿Nµ=F×í3­ ¾Pk–Æ®¿l#!é-ü{²7–À <÷åaÓ”Z_¬ä9SºSBh,<¶)ZʶÓÒ*Œxû²ªF%¸N]†ä‘„¤Y²ÝÈÒ´ÄÊW1ŸI”9®ò}Ԍ佘G9,± ®”]ò”ž¸ð8Bß½áMœ£ÏS7À“ÿ û¹_Q¬jGUáj|<ƒº(˜ˆ†Ù7vºýzû”nÎâfw¦ø>÷nÅÙ”çYy“døÚàpxóÑÞ¢|<Ÿ²‰r’¬ EckR·öÍ<žµŠý.öu¾¬Aœ·é, }R9gý|–»ü)oÊ—ƒRbUz8!–OBˆ(ç³"Ó½knV4þ›ò¯ZÆ _rÈ`ŽÕc°Žw‘ºË­…'éðîcÔpxb–$Z  5•Ì“f¿F¢×HïÙí ¥áIß"êº<~Ã`šœ" ”°Ð€óÈd ;gP«MÔœäpÓ”ót÷<ßL>ñ\l„ XˆšìiT¹/°-v©ÍÊz·íèÔu|~ša3|tÎy²³qP­ ¡Y–~Åø[›²›š²WSYÇêž9sX‚Ì¯Ê aùlÕ³bøÅ(m'*»Jæo‚Ä€6ócêù´CM‚Z¨nÌq8"¶!áoÛËÑï*/>Ò)’ÞèóØ«XD2®‚ø•aÚçºÃ*N“ä?l“S·8›±^Ž*›(tDí^h‹ øqÇè°ŠXCz.¡SÊSñØtx‰¶PâçÞž´ýÉ¡ }}’¢P´ Eš)<æ'o³(Þ%`vuŽÊWêMÖä(‹'³ž£¡rÜE¢gZkÖò}~R/¢¤»ã|£;Þ(º³¿Ë?¸¿ý!’ÂÆ¢Ò·«oÏ¥ô\² ®*-›Îjz˜´«ö8îj·fZyå!ë~ƒH‹í#Þ’¦2!‹ol¾ "y€A=›¯Sa*øs«ßtì=z~côH6® ±ºaŽÎ¥)Æ[ôCLy4BÜL¼ð±ùÉŽ@uŠ,Fo (‹“”޲†¢]Ã_-`ƒ«€¬©lƒÓ­(˜)]-ÉÅRy}yö~Œ2|ñ²ô–Ÿþù«âê”@~¹ùü>­euz ‰Ûh*öFØQÿÆUê™16ý€@é:8ícÄ‘Eõ¦$ŽÚrÛ8*=ð8€He©æÎÑ4¡!¿`^×Úר’ŶöýŽbÈðάïW‰ý£ãz±*ûónªàG-ì™üô¾éX‡vÝ¥ÆoþߟÜ«€l ã6ZLðí„Ǧ«ª3LgÄFqákKg[4á®ì‚§Ï-áóFDrÈ0hô¶ç0Ñ‘0p®–côý*'f”k­VÆÆÝˆ/JôÝ9$"ýÝ)žü‡Œ­2Yª†Û}j96/vpD j5„“‰²Œhk–’0Ÿ¦Ú äc¯W½1LÌÜæ‰ O±Õ–ª%ë©@PÑÝ;«©‰è¾^«ó3HLmÅÛ~Q3ú±ÒɱUÝÔùÐΚÐ!X~(çjÏÖ]¸þÝRLR™¾3î9¡9GÊœ?,°#+\ÝšÀx̪¿îP_È›MC"-XÚ]ü0¼R?ÍW}=ß?—èe­™±ÇpúYaCdÔÝÑÐÑÈ+&+rá±Û±YÇ Þ± :9kS2´3])Nâ[y²ÕQι®”¡Ñ«+ )wAZÍêÙ€¾:vµ}ZÃôåñæ¹ÜÛògçΈæK‹'L¨(¡”ì»å!’©¦ÆGÞ½þ7|Ò¬UAíuBV uÆ8X[OP ¯/ÈAˆùKû –èy&"¦þX#þàÄøåGË{¦m5ø½‰ÛôÑìÀO#}0›‡…ÜR”˜av£mßúšNy§ïl¿Q«ú¼á /‹ËjeN ÿ±(DžÔè½%Ž4õŽ›ïµOîYÃó¹#,I¶þ~€™ØI^lƒßŠÐíîÁœ;_”^|›ƒ÷Ë_oéøê0&ÈJ÷ù.§X)—”YtKÊí÷7¼è·¢<—§ýétMœ±—wæè—äHd  ¾Ý!4ßIÍ^Æïk©'f‰”Q$¨‚Ua–­ÆÂ(WpM¸F™ýëØáæêò„JŒY»ŸfН\ÜôÖfu3–Yí­ž„²ç åï®ø<./ÕZØý1‚»²¿}*VÌ;žÆX‡ï°ˆåô*Czæ>; eqq#œdÉíq*á뛕_uD¯`D”²iª‚¿›ÖRÒ,ßÛŠ/I¿e¥‚Ka° G‘;ö® 3Ú¼`#p’8WÞKHF¤9çç«·¨élº[[Ù¾euÄ!Ék\»i0 –ŠQTí7îc~hsÀb ^Ùäš‹ÖÍوحÁXqˆ™0L:Ãɰ²¯¤aÕ[éLU½É”ÛM`®'9*ž´cIº>EÑJ9CÃÁÅ4üà­úL& ·ò,$q»#÷&=ªþýyX¾ƒ.+…Î\$“ë¬[ÔÁmõÜ û¸ÏtІ9€Òk”Êxuî¾þ^Û:;Ç×Ä·¨…WV–ÅFÂ6ÊïχùTb#m²âÂXÝÆ‚«ñ½H¿ìÊíÍËi¨¼+ç&ÚˆÌJ´“àípÌÌšÀ“0ÆB‰Ïî®è¹Ü +–í7<ùž E«âz¼·ÓãŠÄ1Á¸h^ò±U\šp?{yÚø³÷×<ÙÂ×›ÁÍÇ~…¼ö°x}ænr+ O’|üÚÏÙãAÞÝžgåMkHÓ˜ØjLEdÕÇ"=Fûmýù ÷[V”VîÌi@oÇŸñâÄÙåtWÎv„$ÞªØL^'¾Ýß°|·’}'¬šsç)‹Bû|!­ ûÇ‹>aÒY]HœŸÖw(éX¯ ý±à(ñËI\ÅÕ=©ñ~̯ñpPMij»2 WnPiÜxìL $ž5Mï² 9‰úà áb!¨Ø£Ü–ƒ¤à¼]x~£ÛÄŒì–Wț١ïIùPÓa¥–||ܹ1¸T쨂ë(Â,/·F„7?¥D|C¿%á㼬yÞ§\Uÿ MEy ‘ឨeN õ›ÚïP"¥]³߯L„ %)eCç ¸Ö¶öÂE,¢Îìô <Çc<¾O®žTâÙñ&ÈÕEÙpÓG§p5ˆüZ®÷åS×Z.§bˆ…èâ&·PPàÏmq¸/QP±Ä:Ñnâ ÖšEïâŒ"€ÏIž.´˜2†ëè•Ý` ÐØçØÎÀ(›©f÷–m@D˜jÇM¸ýÞ)&xø è®$[¦«O "W”ÄóË÷Ãxt\ÇÒc7Êü,ÎŽJ¾-j¯ê—,g8’M´ï’¤£kL,5í¸¶íÝT&ùûI7\Q.2œCa¤Æp¼j´[ŽÜS§/ªÇhÁЧÖ³k4òiI›šf¥¯žF˜jÑ;©X$Õ¼$ôNÛØr׊U)‰©šÝ¢òµÅ Œn7›‹¢Þ#‰¸àÊå#_·ˆ+c3ò%8·H¬4BøáÙŸn ˆôÔBS½©Sœ«Iî…”Ý-փƳ 6|¾¢¤x2ÔËcÀ^4¨Ábf¹{`bBg<¿‘¿# æš.¬”zÿ±k([4²v-¼s_ ‘ŽjØO«œÛÛ'$æ]Êäz_§Uâ7n2ÜF²ºÞöfsÙû¦¢¯9Äy4QÏFÛtxžÈ7ôÆ“ñÌX½ÌVMÇ5 #Žü­.Pý,“ ×¹dtdŸ$ Î’Jº—êo1}Üm9 —ËëM*`0$|â喙qüçáûŠ n|ä[…˜Vf6U Å^CùsÙƒÔÒ ðŠù Qìì uM«“55M%Ã`âÉvF%W ×8ן˜§Ñ7ZÍ„9CfÜrR8GÌõä~³¶îEš'ÃC`Þ~xͶ÷g°Érõm³j°.?KíCÔ*:Ìý9÷Ïäã©x5µÃ{ÚRc›feŸåM#ÃB åÒQ…ïÙftTy¹sóñ¨Í`÷ŠÖÕ…Vi·¦UŒ('îm#›|SvÃ9Q7{ú½iS”âËKûµ\8F˜ÞmxZ¦–Ѐ)˜VeË;¤Pš×ãIû/¿f3+\Ú¾3·›PÛ£ì9Û~Å ’C#XH7z‡4Yr8ÀÊjÞ¶{Üê)ÃÈáôÕPùCþõ¬?­áii²²rãÍÂ5{<Ab½~qÀj ?ŽÂZµm( "‡¡ÐˆŠ¤B êz·ïÓ̰Ùfô¾]—éâ´ ÌTG ºIEAKì/¹ž,yd·f{¤Ñ®FŠnajÂÐAÎ=r̓uäј; ÜÆ>™–cÎú{µ¯!QO£né !Gñ¯¤“ìÀ-;ÏÆæYzVTKk¹’Ý+¼-ß0” ö(Þ „#’‹ó–@E`BQÒB#à 6Ó\ãúßÈ'ß 3Á¢»ã ™e>fÕãr¥9le·C©úÀÝFGÌëÌA’å8dÄ]¯'¯Ì|LwÓ(÷+qî}“° ˆ‘aѶlêÓî“a!:lRnŸ¯Õ Æqß„®7¡Ê{\ çnÛ$ñÂÔE³à5Ä'7¿Ûýœ] 1 —c]-žñÉ®% ÚûüƯ§¤í¥é7Qïðú…ñŒóåË_ƒßXtñ)Ö쮋‰zÒäu}¯þÑ$Ó<%Ï^YËÜ××FµüæSþŽÑιø×¶zL¬Ÿcµ,¶ÎÏÍDb{ùPü¯ÅÌ:½N…Û…Ê¥¦;ƒž‹ÞíL5Œ]Œ IÃѭ܉|.ö];|3—ñæ9aŒÚ¼3ÚyæƒÓM•øÉk$Ë¼äø¤ÜG÷AÅgL%³ý1« }¬1£\tüÄõË¢gs|·XkèǤQ®‹@ËñŹgV5¸ý+ë‚§ÎĶP ÇE©d×Òq Ö([‚m4V²ÆG³Fµ‘úŸóñ‡c—Yõ6ø5¹;¤ÃÔ!ãOÉZ*‚•p;»íI w²9? ô8¼äcšŒSIÈ î&7ãî(Æ-ÞÐmñi#еt=væàQbnn¼t¶±}‚»u@ý"¡7Jxk6¡ƒ-ºBBÅ5~ÈW^’Ø Ö:pçûi;mL•$0½ ÐýͯG*bú©êXgd±ô†[úA‘§"ŒÚl†¨E}è&«d{3³OÕºÇl\G£ækZla×ûÆ]ñ7´9gáXm„Güçpö蟞¬”y™øã°ã‡Ò™ó³!FÝí -‘}ˆó238#4–øäõšó3'ÞÌfòŸ\;5ÛèPûK;P"£ï iáöw,Ú~~´!y ;Ñ>Ý…g^9±wpP25KÑpú†CtJŸüBlQr·* æåÄúõÍF¦`gì£ Æ›'Ú1rÜýys›¹%mmÅXdÁ<Õ½§sñÖo æXü4VîSÌ×c¹ú'ËR¹¬L´pyÑ Rh’ZË °àù¾¯Ì­#Zx¡ðvÝnããD« ´hK§õ”³ø‰÷j\æ«7ë›ü»óMÔ'Až˜{«¼ÂÌ<;!¥DÖ «=jm[ X/_owÌ£úLŸrÞo}ƒÅ†ÚT%œŸ oâ[»ŒÇ ™/ûcTÈ_/ ]Ñ3Ø/¼QT~UøëÎS•ÔV°9Ï©ù⇻Ŋ‚x6Î4á'å×Ìt/˜‘1>ŒþáÌsq!zéXpnÑæÆ¢Ÿ4øö̪ð–ÖcIw±7†Tœp‹C2ŠSÈ âûN ˜Ó·"x¸±@ô²K©¡‚€¥‚¸AK¥þwa%þƒnƒmV%[Ò¸‰ɤ–˜IÄû=wW# †¼ÆÇH¼œûd¥t2PïiŒå ?޾ê™^RÚ7ÑžO± †2Lßí=ŸT ì¡á×`C±k\ˆòÆŒm¿XPµ úPPJœ áJë_ÚYßÍE­4¨¼½ÌßKdË6Úäûð(¸tçc¬~£#Z*y&¦™M¾Ïƒü$Ó‚feœýI<Oã ù]¯¥¤j/'“D}ö¤áYžCûEš2(ÁÇi  £CŒZY*ÍæBÁŠ#1ú}ÍñhBÔ²½ÕMJÎâÈIÈ;ŒþD¤Ê[T‰ð­Àí)îp¶š£¶ Ú•1ï2YEHÍ–,k@`ãIAR®ý-…x2´Z2¨ –Í7›QÕ׉€N÷Úþ Ùé™ÔuuÃo%†yNõér#ÉdžŠs‰ôW=~<¡yÅ¡ î#Tùö}ô¡2¢ÖKŠ0»N›» =\€ÕjÚ#;C‚W‡•îC,S²U’vÝWøV#!¨ U¾®.ƒ’hãþE¾RfNaí{!Äò‹¡|hgñ¹Æ)ý@T RóÓ×`Ž_Ðì)«Œ'¿^½-?ÒÅvé`8¼¬ß±³öŽdÔŒF -nÖwv¸Ÿ6õÆßÖe&`K?®¦vn–Œ¬ø©M+KÝK’lgˆþnüšâç±c֠ݨ £©³€=¡:Å­YœkÙÁjL¡çž8ãuÝ "›+Ë…ºç2ïɛ¬o!l©~‘Eˆ:e€ÑU¬.™Õ¤œžÊ|˜÷J?Q•x(a× ¢SaLMD¢ê¾7øÈmîAHwdr€ÝârRñl¦Ì›úŠD=ﱇ—ä?ŒÏûv«S.!y'‚:*Á—×ä3Õá2A9\ô6ϲÍYEÁúúƒI\ R/;a½¥U|=)7*–³eôµ¤#4«êéJá·éå:vÉ‘äw §â2„›?È›Fºµ9e±]Q £”“'ž‚T'b‡PžºS½lÈY”ûd©ºéÔÐ4ßÖe«+­–Bò¨$UoûIŒ`W€š^zs.ŠoqýëíÜx€¼ƒ€Òv¢Â›¸nÌïj¥£ìféèØ=Ó;^"ŽÆí™¤\×}hJ]þ ”5Ýר'œ½ÁB é²xÇ«4„Ž¥ôîH.¶oº ËÝkÔk& ÓŒÒfYj¤ýÍGþó½nâSÑ¡ïBp÷ïj¿42£}U†q?ó‘‡ZhšG\–{yÉ#–+?Ú°ùÄ/gµ)3û'~)´HZ'×߆Ÿ.â#ì¹õùË`!š‚¬1´Ñ6 <ÉǤ͡n«+W’eùj‰./Xÿ…ÑGG_ä¡hè8gsÒ!β5 ‚Ó­˜ãLо‹?¢>kåH‹%&»ÈÛ]ê6÷<‡ÅÄ"³Å¥®SÖò³5rRÆÞY‹>¿|N„ýÂÓ{ Åì†&Þ%Ñħ¼YãŸ4ãD’"o©aÖÒfpë‡>˜Ä~vÃ8:êDžž=hÔ%s÷…üX¡ fÅøsAÇ/[>‰¯¹óƒÊHjŽ™i•+?Z‹WKÆXAösÃÅ_” –*:$ÑqÚnëtƒ•¿µ0²% }ã÷(DÐÔ}Œø^´¿žVK›ÿuí6] 6?ŠÜk«)à Æä:€é<iiT³Î­ÌÁ4I ¼C”(¼„þEU:#†¬öH…¡Â™,FiB:ê*«"qvÒÚŸÚä\ƒUÔ¯>R¦ã*d×BOÎ Çþ¼îQ’p_[-èÅý:+z6p0¡wΩUf ’â?cdîÿ¹Ü¦ê¨ç”°˜«þòÙ“=°ntŒ¨ÊÕQ6þv„1þšFXè^¾â›Ë/µz9ñê+*¹”Õ¹Çf ®màêAa²j24¿ÛÜý£ë†öœr%5M™Ñ"ú,Y?1;tóÀc,'!ª²h× fÍ䤂êÆáœ@½>goó*ƒ_n WÝ͹AL¿Ow&õ£„P€â31êÈ÷{µšM{w‹f¤÷&þ¼B)ˆjò;Ÿ:W&›D ÔÔ1H"È"¨T<ÞJ”hÚÓÝ|‹ T‰;-sô*ÅnVk[Ê2÷Ó}-3‰.kå)lq°Àd0‹(Rº&ÔÉ´†þ”‚ž$zÊþZ-™:MƒíÐr¢“ ÚÆ3•Š‹K ×’ünh0tÝqß·— 0#w²Å`ßÃ,_¬‡x¼˜ôÞêñS_JŽzNÚ/÷¯î*$ˆånÒÍãÛ;ÑÇ®Ï ÑUOÚ_}ÀÅ‹|ßyõH¨ Y«eS×& ­eþÜW†\¢¾°-¹µC§ 4‡ýKLßÙlý ØCS-œ”0†!açn, $ªãâi¬‘ÁÃØø¶d ójÆè<Κ÷ßn$Þ϶²æ§p:ôjvÄNØ©`NÞ:Ï%‰ ©®dŽþ|ïp‰~‡# tDãå·Yïûñ+'¯ÁTíc5‹ÀLÒÀæ úú¾ÇÇýÏ1”>Zö}§oêxÚxbÃP%g cn¿Äû „c=äŸSæb™…bå¡{L~8ea…¸¦sÚǾ …×#ÕÆå †;+j ü&áx=q¹!KØe½ï: w¾Ë_¢!ʼn• N ˆÆ ’t•}[BzŸ9æÙdöýøn-€>,ÓÓû*×?ÙäùgúgÅ:;»ŽäÀ´+'“Ÿ:"§Ã›÷6|å,ÓýD¤»Ù­‚“$7¹6u´P= ÓJ\kÊ$¾žTíÊî¯pµ˜5)q+ûnÌ´¬o'Ó¬ØøÉIĹ³áq[ צÁw8¹á–â®ÝHS•ò!añÿýÇ ™Ôºë¼Êø¢ 1Š9¬3 ÕíS7–8háð0ïM¨¤¤ÐQ¾îC*â³¼£6v‰©´Ÿ¯¾§ë?gmǃ› ^AÛR£–-ÌEÞ¡±ŠùXQÎZW¹´èT5t µ¬ó¦¡Giµº T‘ûOáÌk•3èlÙ™9'?KØýcðû·¦×ü«]µ. ]‰²5¤ÍìêoÆG£HʸÐÿµ05p endstream endobj 5132 0 obj << /Length1 1902 /Length2 13501 /Length3 0 /Length 14700 /Filter /FlateDecode >> stream xÚöPÛÒŠbÁ‚KpXhpww îî,X ww' îîœà<ÜàÜõ’½÷Ù9ç¯êÞ¢ ¾ÑÝ£eÎѳ $URe1³3JÚÙ:3°02óÄäåeXXÌÌlŒÌ̬ˆ””j`gkà숔@G'°-ïEˆ9_mâÆÎ¯òv¶€.Ö6 '/ /33€•™™ç?v޼qcW°@žðÁÎè„H)fgïá¶9¿ÖùÏ'€Ú”ÀÂÃÃEÿ bt›ÛäA@›×ЦÆÖU;S0ÐÙãRPóƒœíy™˜ÜÜÜmœí-ièn`g@èttš~ P0¶þ3#"%@ vúÛ¡jgîìf켬Á¦@[§WŠ‹­ÐðZ *#P´Úþ,÷w=àŸÃ°0²ü›îöïD`Û¿ÈÆ¦¦v6öƶ`[ €9ØP””ctvw¦Ûšý4¶v²{廃­M^þjÝ )¢ 0~ðŸùœLÁöÎNŒN`ëß32ýNóz̶fbv66@[g'Äßý‰ƒ¦¯çîÁôÏåZÙÚ¹Ùzý™ƒmÍÌaæbϤn vpʈÿójBüc³:8˜¹¹Ø¸9@ÐÝÄô»€š‡=ð/'Ëoóë >^övöó×1€>`sàëD/'cW ÀÙÑèãõߎÿEˆ,,3°©3Àh¶Eü“ýÕ 4ÿ¿Þ¿#Ø Ëü*?óô_ffgkíñ'ü¯+fÒPQT—¥ûg䢢vî/6+3€…™•Àõúáó¿y”ŒÁÿôÁü‡+ckn÷Êø»ß׃úOÏ®ÿˆ€úŸ ¡üo2»WéÔ”®ÇÌÁlúú‹åÿ³Þÿ¢üÿ“ùï,ÿ¯Jÿ¿IºX[ÿå§þ;àÿÇol¶öø'âUº.ίk o÷º ¶ÿ7Tø÷îÊÍÀ.6ÿ×+ãlüº"¶¯’f`agdfÿÛv’»Í”ÀΦ ¿eó·]ý÷ÂYƒmJvNàßOÌ+‹™ùÿø^·ÌÔêõqzÕæß.c§×•sþë"càëRýo¶¦vf¿·•ƒ`ìèhìøzù¯ˆàÅòº¦f@÷¿Ô `b´µs~¥^gö˜Û9"þ¾hN“ÈoÓ߈À$úq˜Äþ n“ø¿ˆ‹À$ù±˜¤þ WžüôÊSøq¿ò”þ 6“êÄ`Rûƒ^yZÿ"ž×œÆ€Éô_Äñ½¾ü¿O–Éì¿àkÀÿ‚¬&ó?ðµ ãÿ¦s¾ú-~?ð¯Úø×öšÑú÷ÍüÉòZÖæ_ÈúšÅÖå_Èö íl€’r¼Îcÿºvúb}=|{ðŸ¯]:Y;þÔ`y½ç?ñ¯)œÿaùA@çÿœõµM÷?„×uÿ—÷µ‚ÇÁ×9=ÿ‚ÿ£)SGÇWÑýõ¼ î?ø¯çtš".ÌÚ™ò[Ö·ÝV‹¸1lò¿9I¹Õbe-0€w4ü§š™±([&¹ÐË"i`Ù© êp›µ:wáµUGRïÁ~Í@"¹gAb;ûr 9ïuCH6‹Ú‘«™$JÌ[ìØ¡D‰Ö… dfѧJ‰êý¾¶g>Þ «D’ëCH›BGWuI†Ü;B£ çf“AµmŽKÜ÷Ù61A›Ÿô"’ÒÈdù;îãܪÐÖ†—Ñ{‰¾E|p Ü>¥uF—à$g‡«ÒXÎCyÌ.v=LÃð2‘Â{§*ŸKª‚‹8(–—Ð|‚«÷H§e™ŠG<ÄEmÏKÛ-Ùù'ß±qtq'gO“…Y|ô2ã_‘Tñïhž šÄ¹Yx³>´eý¶k¼•:ƒÜTQrîç;,¢i™òÅT‡Q38‹™Û‹AëfÊüö¦YŠ%™ß=«¯à<¥#„W<¹ÏGÑõµº‡`o ±­½îDyÞøØsZ¯®NkŒam5Œh¡¾-ìð‘w´œ«Õ‰'.!1gã8ƛɠQ(>„•ñ~ /üvçàœËÁÕ IÔcwmkW³akrÙ|} ûmH­ç¸s²oÇxÏH´îám*w †Ú•H8»yÕNfsVÁÈ$Þnöù’l¤®E»‚\KÕÁÃŒEêÌvp0'6•àùsý8u‚O7‘¶ÙÞ }®æc¢¨SÞW²Å¶ !ÛžjIµàfÒ;ìq­F¯R ïJ×ËU¯À6w¶8ôªÞxCq{’Þ Ùpt¦TÚ@v*“‰´Q”¹©1YVÇp"»©>‰?_ÿùÊ›ó˶ÄKÿB¾Œ°"t-˜F¦¨]„s)ÂWhÛ/ðy —{2•P“v~}Û»‰Ð¸Ax̨CuB·8ò)L`ªÎð‘rÜo†Û›Í‡TßW8‘O ßÂÙ¾QQdn^ßVøœ|Þ½ œØI­ÆÁ½¼H>о¾!zŸ»¼å ø3".F¢eZŠ9W ®ù¢ …­§ri'GÇ©=GBmWþ¾µïƒ"DLêkÄÞ©Òî¢8AbPŸ Qaòø)¤úÊ÷õ[ ºº.OÃ(Ê!f&ÐÐ6a÷ò¥Ê0Y$Z"Л¥AE‘SZnF%e^z’õü _œ¨êeÑ2Ÿ&fëað‹e=~V÷Öv÷~ÿƒq>µ°O~­M 4 xtªƒ}b¯þ|’Ö$ÆlÔÂY 7ûÛÃÅvߪ…E&üëÌkJ°æ×ùQzhî Ê*Æ`T,ÿÕ ¡jÏbá" ôn~-±¸ƒå s¡rR£‚f‡”qÒ2ÞŽÌ,Åxud÷Yf(FI5Í3þsÉbxjµLœšNéEÜæÞ&AöCÇcbÕ¢Y£ ëL¹p¹Þ¼oÏ/òS¾µG¬p¸ùe³…˜T¹ÛîlXY›€7©M¼#µiø–’4¢S‰c)X‚!üJºe©¬sæõã‹ Ä7(ÇES®²*ïÒš”!à1É÷~Œ7ìb[„¶ÞŠdomÆ4ö†ÒkÅ‘Ež,³î‡öቑÏò¯Ò‹–yÚæ; ­ÎZµO1*é áaë¢z©ÍW–—k½y5 3ZJN‘¥fÈ.;JšJ©IœôõÕbñ½‡–oGñ|îËðÓm–èf¨7íâ€NÉ¢:Žuql5$ ˆo§ì²0á,Æp-¬˜¬à:8¤•t·˜G4íSœ +àü·U&Ü^è8MšNº ûªÏüF¾gèV0|§lÔ·É’Vuš•Dv§¨®iŽÖ=:¼ˆ„ÖŽ²…Åcâˆÿ‚O‚ůQN•Î8ì!ByùV¿GtŒëÊ¿uÁqÎzVŽò#|ä%¹Ÿ9øÔÞÞpú¬äåQKÀ(ÕÔðNÊK-öG™æ…»;¹·ÿFŸeǼ Ð…1¿)ý0†Ý´I½ :ý$ßOk7p¹”©’Ñ}¤ +̛˺+‹ï·JæÍµü¹ãX¿t®åȦ+'(úRB)ú Îi‘¹¬eÕš¶*¤mQ+†[ÎÏ,ÎéÍTòÕn”aà¤øAŽÖ†–ůÒĦcíÜøêc´5ÞIçï)žnÍK²”S6ŸÁÞ®Á¼±VH,*¿Ñk,Qí t˜/mK—|Ûä²|:ë7 =ÚitÅ`‘ÞªS;¥[Øæ¼4å¶Q®[)€é'C¬ÐX8ϧf$ ö.–3ªº=îZ'Ô¡QÙP±²(ôúp cf‡úk.>¡„ø@ Y :lÀ kôšdn|”±£¡ÿY-³™åu -Ì*HR î–j[O2\óðùÊT›ÛPà³Ì{Ú•U‹¸£ë•df½æà¶Îûß %ûIû†6“`apð–8?p—øMÔ]â¹Í$Úà‘,}pòœñYÊfŸ<Ï6òmÜÚ#…‘ßJlx¨x’¨Ìus­áÄ\•xDÑ'°¿ÛîFê×d?_äµ,UŠs×ÉŒa$‹»ÝøZÝeÓ‰ æ¤Ò鳦³vcŠSœN°ªÞ–rö0+ü®#µVÒú'Ó¥M–2Ç|C'eÏhQ<6ÿåú¡¥TÒ‹œ¬\íëå’¶OÔ:ÿJÉ ¼‘Ymí„‹^ zoðèóÖTà€Ú"KŽ?¾±º©kô÷ ‡8Æ_F$Õ2Q=ê);!h-°ÔqZAº:…Þ›r¼EqÍ•™Mj‚Õ"ddo©QÝãÃ-8Ò]èawóïül”U˜…û7„MÔd ª­S[vB†gK <®ìê, yO+%N@̳Õëv¨Ñr}'Í7l¡ù¼`½èJ¦Îýö€kýÙ$ñŠ×÷‚†AÞ¬Ûñ~7ñ›Eñä9Ô¬Kãv8¦ŽÜÃÝ»¶ç…´0ÙzkιǤ²ñW˜³Á™»ÙôŸ);ÊNÁõŠ„41OÏô¹Â"ÀvaqU®A±²Oý¤ØúÎÄ'-=³ÊÂ5má 5zFÖù¼;!›&E×õˆ§ÄÞJºß”yñOÛ™6™5Eðj8bJ‚{²ªxÙ$ z$´ç1§&Á\x[Ñ3êÄúQEÇþÓŸÈq†YTúcè÷¬Úcúg*» ¶¯Ä1Me 8²W)&S²LK˜Ó÷ð¯@9P9NAÈd͹vŸÚIwŸ{à‰ÐµÀæâCЉoÉ8Õ „®‹J ´à”…U¾Y»˜@Ê s¡ ´|‡óš„rÁÞB^T†¿ÕLj³A$›õ©Ìç’9H¤‡R§êÎø%‡Q¬ª§†*~À»Bž%Fr9zrwÞñÄp¶atçj7H)¢žV:§Kšñ®/¯Æ}î§…3WÉIäÿ@À‰.Yö¥¶áìþ~íÓ>…ë;+œ¬Oë1ÝUBð¶{INÝТÈ,ZæFìüåBQ‚%ŒÂ“=J $¹JOóYæ!¼=Ó"X‘ãË-éwÆ‹ž`ç“d%SM¬æ¹¶ÑxHèè0h ;ð Æ;é[¯A¾¦aœ\Iùþ@z·‡“j!÷{(Lž½‘§[j¹©´Dtcå÷ˆçZÔŒQ ض­“NEëßùl íj¾œÖŠ)…D¹%"uU·ø­ütû^(A¯³…Ûݹíì fÀ±åÕß+'3їͲ©ž\_Œ8™¿_Ø®qÏ·›ß;¶×kd™p²Mè鱯¹ä¬îs0~®Œ¥ÝŽÏ?ÓøõÆ}Š%cY¯Åó°€Dâ…LJéä$<y0Ò1@’P ãÒ{Ð+*¥2Dò®sb®·Gí¨ÂÑÿÙrâäªoL{ÎëHg1bÏ6š$€÷ý2lzÑMåB¹¥=7ÊmT0¡:9vÏ@©­Â)Øçk™%ðÇ3Öˆ¥19Õ®y‘·%U÷ê±N^dŠöw´ôÎÌá=òêè³ë}ú3&Á©9dýtŽšð>£Éu4=Œ+ž=Þ¸²ýîó“"Š# è£Â3ÑqŽ{'÷5?RRÊ–ÏOÔÎ&Àë_¨û£Ž³å£v šŠ)6/?‰©¬=-”U8Á;éËP¥} ;zÑnf|Θ*¥e ¬k7]2"8ìZ%È •üEé·ˆ9ƒ(3wõôÕ¸Ÿ…F±DÂkk~Öü‚ÚšØ#’õòƒxò¹Mëä"óñ"¯ó 5û^—¼£¼ˆ“K¬?’Á—2"ó/µCŸ1£–T¤ —…ÃuýõõëÝ5hƒBK~ wÃü" ýˆ´Â{&ÅD¬<²þìÖ5£É:…ª#€XôJ7ÍX-É+ö|¼QQhÈÇaBzÄ­²¾½’ +(»”sS$Àuëj I¿µ×œÌ6ªÃ ævDC¶ò3bP(»´|‰,$ˆ}³ûn!)´øùs¡Â¨bFMßhHJCˆ ÞçxÉ<ßÕËùÏÛ§h 8çÛ€rbó{·MÐlkæ v%Óãê÷ Øw Ç¨´¶ˆoDTõAÁí“«l†ÕåëÅ}ñÑnw‰bžßg+üvxIž%'´÷i)H>=-[¼X6†ÚÊVË$ékÖp®²‹È I‡’éÈâ·ü­ý@\_vBQîO8 ŽI !WÄÔ'›* ßt“ÅÌ;»0¹™lsÉ¥ÿ\µã  qZh Î÷!IlÓ•Ƚìsï3Æ¿E,~¾×$gºUÒ i¿æS†fÐ)Ò27pš•VW„§"˜‚ðËÉù¸Ý´k ‡¶¦ÉÜcºT´° x^d›;–MD—,ÉÂ2¡ä·`Ñ»˜\°9~åžgÆm‹â‡~T¸ÂÉUnô%îöŽšÌôÓÝÌ‘gm`p“a›óȆQBwÍ;àsüwLÕ`÷PG«Ú#ÁH|Î3{Æ$ÿO¥˜º·ØØ wÒç‰Êî¾BOdJRXŠ™Þž±²ã¢YI0Ê¿(’£Uç×½ŠŽÎûxB©ÐËÖ#Š9ešrnh^ö•,ï—²O`U"D›iEÉç Ç¿¡ØÍ† <­ež³ Ÿ Iíf¤T )¿?FYùø\læ$Ó˜‚baò¿tÈÝœð]ðÔ™ ÿš“/⻺DD®:ÃÂ5ô„õ‹ðô;üЬð¬oòuÚýù“‰ˆÁDÐ3ý2­;WçYQªUć º~ÔÜ›VT)-âô7°w`“Œ € ° XÞ(Û.Åa™¢4†²¼ó-*üí32¡Å·é¢åKFÍ@²áÑ›1n½¤ju€TqrUC·w5k&¿¤ÃÇ) ï7ÓsˆmØfMý2$ƒÊÓ}ÿâ]È’£5Ëï.ö½áJÞÚLú:uWrþ"‚P±wwceY_t²ÌËÖ5®²l´—!wÿB̯+ìææ~¸ É0vHNY]!»_T‰WUŽP ~ïz¢¦2(êåõ ¢XÉþ'üœ¼pˆUò½zÇÿ©kÞõ ´Çý±ó§è¬#ÏÙR8F*bº”%JÔi)N0Mί%ò<2c{;ÍÉŠ°ur¹xÍPxâÀ‹h™s¦ªþ+·¢“´V*£EÎôû~ŸðHe'þ=)‰ËOaZûê}ÚPçmßY>ãÆð~[!Q¨© ­<¬ž»LR‚SYÝi‰¤'fÇ´t–§û`²FÐ~È5¾n1#iA¡ºení’,þf¼¬þ”1e¦"mÞ?¼õ£©$„Û ïôNW­ÔyE!åL;1»òú8BÛ&ƒ’ÞÍóZÏx­ÓîÜûq¾ŸSçiàЗ²]Lj'†ò `rRóö X´¨uˆë¹’_mÐK'e܈ºccða˜“ÖèŸð¨õ-aV Ñ{Žð_l$p…¿‡@ q™wÅMíêÅôŸ%¢C¼PÒadæT­c¥ÅA„-H„¿Bz¡¸ØÓˆµTŒ`Ï™öÞrg ÔÑ%ÍÌ,®7,Ñk5Èo!U6wøãWMøÐҙŗý™FÔ’ÿr®xÁç8ójÅàWYÐ4%Øj‡MjÀ\¹Cú¼›W|ên¦sH$™MU?‘6ó¶iâ […&ÕØÏùÑ¥ìPoøyMmÎãgœz÷;utç–ÑkÖwli&¼Ñ‰ú*¹Ùв¦à²C÷†lì‰.ÞR2¨) Š\ÔÒ£}ŸcëÖOæ#ÌÏà¿€ ö£?(ÛþãZ/’tÊ6`F#²,•ß•kz4Õîs¼£Ù)ϰÔùa?Í«J_äGA¨[vÞ¿yò†„)4úBõã º>v[\’ÁËN+KÆú‹æQ¢îžÌdy¸Há¾è›×ÙÕaW¤£´U.v£Jüöb£YÓ°¨Ö/éòÆ¥š§÷R=MƒâŸð4_Pòù«`é—5iñ×ívºøæ$ªcF9PˆNk }“~ˆš¥i_qÅ M«“ÙÙåxÕ•ú'ÞõÜ¡ËèW a:pQÜ%ô‘Ö&¾Œ™ßÞàç·­L2n²Æ¥BígÖiýJvì,Lþ’ ¥­Äݪ{¹÷øþtQF>¸ ¢hÃfš§3aÌCüÙÐ|ú™ÎcŸ¨¾À…H 1çyoêJ C˧üF.Âìãú¬WŠW—ƒ`ó˜rùÎ9¥~€î!½žÓN–K§ƒ“û,çxE>.1_åb*%„Œ qRU èTEæIÔaÇ>X?3º¼ŸQÜÙÕ€ÖùÏ9ܼevã¬õjª¼)œrfë’qÏ1V-c«¹ÈqOõ>mAz¯ÞÒ7|¯Ì(®<™u‡%íIÈgÑgÌàãÒüâ1ótÛt`_„†·È]Ÿ0ò˜ÓN<\}xÞPãIù¿S,'kŸˆä¾‡­à²¿Ë+¹O²~ «ØçækX+tÐÙ`5{ A¯‡Â{7œ]Üó DáïgJÉCtþBÿ¢Áî“#cþbàTÓ• à&ãþ¬fžæ¾TÞzc*kù‹ˆT¤µ’(æ9Ãév%~HŸu×Go!ò 5©ä(+!-ÙݜصÑé/§ܘð¼ÂN¤’ù=1òíwk1g›'¸ÒÄUľ¾Œ;Ë;¥Bи–4ýÁ.3±1Éð/…—)m¹0q¬B2º©Ã¥–Jè¶ZJÕ•XÕí¿®îa%xª›cì!’ÈŠž{×Ô>äCqÂûDo7!ÖA_ؘ!p23®?¥Â(xÞ»³—þdöQ-3;ªcµìã«¥“l¾*í›"ÚþÒý&¾`­xùÊÏÓh­ÅôáV‹ë¢*h„$š"«5¤ÆÀN$5›Jf¬Úl*Þ!øÁ¯nðUðÈ«V÷6yƒ úm úM_ö uçYHj±a¢ÖÝO{ˆ!,Š ë+|‚êŠÜ&Õ>ߪ‹TÞy'á´šñ‡­$ ÑÕ„´Myc¸çܤ©WÙ GŠØLÙ¸nŒÇ¾ûYî07 h&¶ûÀ|Td5}ƒáþ@w:X(` ÿ¦o…6ZQŽÜ*MyHxàG¶¤Ä“¯3K?K'RUómÏìp¾×ñùƒ*É›½¥\ s½ô§‡ ÏE×Pv–ÍßöÝˆíØ¬"~à1ôùšaûE°’¹Ìlm¤íø™0òó¦×CѸ“¸‹úBh#iEÐy}Mc݃\'’Ì?‡RB$ÿY £fÜ)ý@÷Mè¯þº¦«çç–*ŽÊۆŹûM×nFÎÆ4ߢ¥86¼ÔäE¦Ùq©¯))Ê9´k=¡¿eÖLÐRàÓ‘,½r$Oµš †‚Ý!÷ØGžõ,Y»^‡B¥ËOy¦úsýQ‹DÏv<œ1…ÏcÛZÌÅÖVìa_tÌ2CÞÚ’ç¤ì«Ïš,§ÍÅvg,Ã7*W÷VhT“Œß9ŠV³Q,tÚ­“¨GfÔCïÄ1^ üj2ÂXz9ã÷©kª§u²b!Î^œÃPnB²¡´ˆà‡Õ‰/¡ˆ#`Ê÷º;“ð½¡ß‡œFvA ùRZ°#q!5}çƒ/ž{ý'JÝ©g¶ô„ÉòÚñLfL[«üyâ8·?¼,Xgxã´!劒@o¸óHà;FênsœÈ‘Â=¾î r‰`ƒü&©ÞDÀà.~ÛÑ­§\pÐ]!Ư¶U&Mµþ¤¹Š´}ݡ̑uÆÀQÄŒƒ¼©?¿³¾nmõŠ“;õÎ3îä§èõÍøÐ9˜«þž—ÜòýƒÇ苃oUËå‘MµÖ¡³8V[¡Y È ¨BãLÒO¨Þû°ã@Œk” ±Õ_ìrˆ€öN‰@H¢ZÑúpc\#ϱH£$,Lâƒ4YµlŸûÈÇ\‰ù{š’YÞ\üÔ½S…Û_Р´9g1¼5ÑYF7Ë;Ð>râ)>½m’jË{òÁN‡†ß´ægø)îªdÑ$ëíGêJÆÝd«ëSËW‘¹˜èÛh€1ê`g]AùqI2£öÓáY½Ñœ]Óý ñ•š IQ-´äÝδ$ã͸\ëVxÆvå«MÔ0.\RLÈf!_l½Ï°ÒéÒªç®:0ˆÔPeè\QÎ\—cQõ%9m¼2bï%QWÃ÷+Ä*¶R¶Ž˜G(Õ6´‘Aè—ÉÍèázž6Q RÊa·ïòb~l«£‰©{Pૌ%<ÕŽV+íi!‹½kk{x l¿lB¥V=<ó¢»ÿâÅ%Ž„wQ™Qõä#aø³xË' ÒžnªKÝ&a- ”ÿи.¬­YVú ?s1%žä@Æ}{ éå¿ê€é­•¦ÄŠfõ`›ó•Çp„žÀ4LZZªˆ+Ú¶KßÎch§K]ÙY¾{zGи_#¡!ã`jŸ@ñƒãýØ"{*òŽÚykJ( ë«Éᦺ™èjf²¥¼9,L<Ãp›0ÏÐ{´38‡¶@w±Œ‚ñ–êHk,Ê1šýã=>@‰Ì S¹l°­S–mŠeN¿Z—a‹ÅåGÊ$Tn&ïYý²@ÞR¾WˆpˆünÉIŒáB!G¹ñ×½3~.R?:d¬TglûÜGÉÚrÒ œîÌ4[—½û‰ˆfeÙœpäx®)4ëÏãôÇŽMÕ!JýÝH_‡Ï2„z #“W“à“üÎÍöwI'ÌÞB‰mßÇHz}E>!‡ó ms°%¬¦ù2ZŠ<®,¸¼³G¡ÀÛZu¼+ F¤öã«8/í‘“å¿«†ü"{Ý|C ]ŠT›¨Ýµã•úú!õËëñ†òÛû†5Ê¿èP,®c—À "'·C=>/Q¯ÐŸº®–«‚ï„Z%MWÅNS™¡&¾Šž‘d‚4Þ” ìE,cUÙ© rlxé?Ô|g¢K9[6½q¤ƒ–mäÿá¼›M5¬ó3ϯ_5ºiÒ§ øMüŒN vkc–²yŒÝÜãTÂ2VEbmö¾ ãìð)Ú©{»3ZTìVÅöÈ„ÍaL¦Ý4Ùv§²¸b¨Ó{Ú«w˜¸õl»>@{×'YÑcSÖ§ïþ¤ÀçÈJ¼n¥’]+îèéçŽ)÷6r½hLZ…ˆŽb›Üxƒò§ù}¬ysËXãçG°øö (3c˜S•AÑÙ%‹ˆdH·™{¼¡!ÌÛÛïå©}{ÊåãüsÂÖûFE«u0WŸÚj¬¤#«CXE‚¹»5xÄÅTÈ™ZºY“¤¨ï¸í¦©ÚÖˆ2ã ‹áXGìŽsWü{Ç ÖK£\Ã7ß(C¤Ç2˜Ñ6j\ EŸúðd4dÛ¾PÝcW u6Q¨‚¸SvâÁØf´¨öß%¿”VLë—Ž•Õ<Ãs’JP¸(¨lç«úÎ ¯HÝVw÷P¦&ÿmƒÃš‹·3À(O.vwÏÕEÉ*†9°T\ݲxÊ+´ÄΡY‹o'Û[1÷%„ù(Ü‚Þdã³@cUnàWE›ú¡ÕG\;Kag«bÈ« ÛÙÜ»í;Mã|cK5áš%˜ôVzꠃ £w]Ô3ûÃS,GEyxKÊ÷WQÊïÀ—=÷I»¤i1ZïD%«x¶¦,QÊäÝV4ŒßÆËQïÝqç@A= â¯µNXÀm/Rõgc|'œ½] (3„&K–+YÛ i_Ñ¢Â.õ3‰~0v/0Bœ9 õ_° Âácª ‡¡‚ªÌH›aÙåóáp½œ.7€jgÇ9ÝTç÷Æ>Ú×EÂ6 uF2Iô iÇÏjè± ´¨˜7>QÖÀ¡|Ž(¨RÑœúzad._°ˆÉxp«]vîÁaÏ~n+r¦&Sçæík@+`ÖVò Ö„'Ê1®éGÎ}nQTw*MGeè²W} ~zm}á£Æô`v¡aIVµ%”¶‹>+c<Þ”v“Àâ YÒüsžð#;‚uŒ a>ÄÑ0eçýûM Ÿ½¥°¤ˆŒ}°½½²jŒ~èg9q¦ö[S½‹Vÿ>yu¶*þÃbùK1¢º=’æE~žVMý£þe•åsBóqT6Óka×1bŠB§Ø¨(:Ç( qçy†bA¢~ÞÝCqÄ3`ÚC]¨4•¼"¹(ÒÒOŸ›í«ææ4t^ø3|‚[—i¼7Gf·!þ×z· QÑ|æÃ&v}É©ŠËf•ŠgOÞ»XöÞZI c­íƒªŒsf…„»:¿Pã±{Zçô8KùvÞëR÷W&!÷Y19o¢8Ÿ(ukK¾™öÏ,&†æ.%½þêáWö‘C¡ÉþûC6¶8úÄQÁ›Rq7hˆzLDŸJÛ¥Z½YǶwò8<8͆½ŸlŠŒÜ)>$xNz™”–¡0ßà)Vâ÷EŠox÷¶ÛLýŽò °¸ebÈ?&+ÿìlqv¼OW ^ö•û”‚ô1\q6¿­WyTRˆµé‡‰ù=YP2¢ü ™ÿkQ*¹|ÛUʈ÷!VHy­´Ê&DbŽ{$œuŠ\o7°Ñ‡Æ®™h¸©&ºÓÂH“ñ$¸†õF(A£Ú©pmk-²"Ç.¸ÄèlNÀµ#»ˆO\ßrÀºÞjfaÛŠ$džÆ€&µ¯§¥‘eLIàÑ{žaZSÊmŽ¢ññVÃP«ç³ŸïU„¨±ÁtÃÞj•¨Ð,¤uð?¸úò·L<>vÓcî÷z\Aû’½+žáëx7üV¯‚³½vdJÿÆÏ¯F]ÚVÐÄ>Ú™Y£Ïv*ñÖûñÇwm­zìÕÙí÷“³Y ²óä´ðÕ †µ”jÊ (àš5àšµd¬Å8y±¤%>ÍÏÅÖô÷€›Ó ¿o…ÆB:gœôQe¤f ~¯&^c×Ç-ر Þˆ>‡,dî„¡‡Õãb’oÁ/*Ø-Uª(“ã4ß„}—QŸòõü!½ÆÚÑ*åënRè_ ß½Xo]]¬féÇÏYx¤Áá“öb™Í ­Ð"Jùö²C™õÖ¸|Jþ¡)¸S:ùðñ—«f4’…F“©½s%­c :—퇾Xtîõ´þ{—™5.Ú7„œ^Æü±Ü2zeZLÔA0ÏZØ› ,ƒ'K/އ µJ£ˆ÷Cb*)"Ъô‘[:~ :®ñÇ0¸²’OI7@#ÞÝ'ÙÆKuâêJÁšË^ÈñÕl½Ñ dù”A­íÅ8¸¨ÎýÛx2Âd†ç4Ì {¥ôcûiVË…Z­+VEct[ëí÷>G|Àhç)—²=TÊÍ41û72;¬޹¹Ù©³©‡× )÷,ªLäÕhð×Ü€Y‹¯fÏtYãyΆí3÷×ðobÞúí|²ü^sËZª€c¹yzªŠ0d«2›•9R›ŽR„ÔAïøî =oåé¼ãîûËîÖM] xàÇvo¦ëýBðrÝúf*ˆf¼´$¹«rÂ}¹sRV™ôsgŒÀ{ ‰¶“«V.áq9K&ò (ªƒw¶±Õy»?ŸÂ.ÍÅòøVÞ sW“o§Ç6{BÁÙF’L(xê/tõJ‹ÙãµNo¿¥ëæâgkö¢ô6bæiÎÇÑ ^=Þh @C‘Ò9£zn^tfª Ý_è‰×Ç assPe'`Ç÷è[é*dŸEÌxþ²xOÚãw®œÄ9J¾ß*@ÌÁ2LxdÖ¬nßéçÿÖý¨ÆaIx‡H6%#‡ÚBŒNQ%Õ©6 c(½øIÙkTžÁj¿”hµºñch¯›Êbž Û™;Æ‘ô1lÍþ˜sÁvp EŠkjíBÒV9žÞYÈÈar¦¸øë½V7}‹r&áJEîy8͇tZøi֗͆f%t8ú+ Ÿ°¤Ð‘6oäp/»:œAû*4Ál?w2ÉM×?ÖአkÍõA‚cIkϦMr®MkøÄÅlÃ“Ôøtv±À¹<©È1§Y2ó á^®™¶˜8CaI!mqÿYi?"Xo5‘o mYi=b@\Èú„¾:É;ªøÛ+ð¦ð{r,ȵ O¨~b¯—ºî \…êŠlø4kw³$!Ë$ÍS¹ëH‚Ö4]êÏ»,Õ3§2ä_“ñÌx¡ê¿^*•¯ˆ%õæ6lw&W6¿Pµ_¥IP ØiÓ[¢c/¶˜–öfÀßçåÛPSM¸ò”Äüxâ™{Dü‰* !kne‡°Œ!S €îÑ~þòð¥m££§R™i“©)=ÌHWV›@„/šX›»=Æd­þTב¶ÀžàH 'N—ÆÿªOÕÁd¬\µ-XÀÔ ôç–‘4"ä-Ò™¢˜4)8¦(€Æ´îÓÊhˆ;žÐör¯•f¯O{)¯Î‰A[“}Üš‚cƒ¡rX‹=ô³íõb‡pÕÍ\ÕqáïŽöÞ8´ÜÒ#Ui‰Ø=%âš´.©Òñ—æ/'…¦¥Þ2©‰HxDX®Ñk'&#I áÔéæaפñûö`²Ù ÷°è«jºAÜÆo/gñž ×_/€?ñHs<;Å!OœLR>}nºzÆ"]J{’êèn¨2rN·âLv´Ð0´¿}d!OPƒ»=EÊÜžk[×¼]ñkL’Ú{ûíV„¯u¥B¬*b.ÂÛ‹£s$+êy“q‡XÙ µÈ3×N7‘…NÞ5\xˆ´2DËöyṟ¶“!ÝÔ||4`Îc(Ñ Î¨Mýª_åØLyx)^\6e<0îlÝ-’“Ò—M5C“û9 ‹Ì£³šG’—ýP)æyÌþðÑÓ××EV0—&PiÉ£F.Ä¥¡8×o¨­¾C/D²–v%*.£ *µÀú²(Œ6i÷>}@=HTuW®÷j}oB4Âþ©L‹9IÞ«ŠsZ1Èø«Úó4# Ô¤½týAØÒMAô=1Oš­¡ø¸†ÛΡp¾ª÷‘óUØÄì¤xµõÍÉÑêîðC©¯½BAè8$í„N°Ep^‚?~rq"¦­z7ˆ5.ùN÷'j6LéÞsßú>~›s—g³’)dQ›>3ȆhÿŒC¸¯«ïzµQóBFVk¥gè8÷Á0È' põÐ55Ýóã+Ú/ëÀÛYú'Yî¤?‰üˆ)ü Ð#±ï¢že¥i×ûᄇÈúÉ9–Îq,=ó=@AÚ\ªF,¶è4¥U¬nÐ¥ñ< ly÷ÆAt”z™ÜÐFJ¬¶ÆZܯñ8¢·p›lÉOe`ÓP0 1mѳF‡2o[©\Ó_âHiLZÁîfxî¥çŸ\Þ—ä2ྮÌÍí¾[Ë­ ÛûÙÌ}Ò'é?‡¶#Ž”ŸÐ÷å—‡H7ãÀ7>ÄÈÐD6¥¾4ï®GkÉW"žM ?è™rMcwÏ” 5ÞzF¸ªÐÇ“çË^`pÕÆy2î9ÞšZ†ŒBŒ/l¤2h_WßňTQ胞_&›0d¯áæíR;ŸÎŽN x*ᾤ^6ˆÈ©_p¶Ì–b?Jëº"‚ÔÕPá¸.àmZ1ØçeÚ.;yŒ{6ÓDoÍR–‰æÕè8­3~ÞÆà왩9b#ã^d—ïõŠqúwh>ÜŠk––þé+õð4ÍŠ[@—ñ&Ràh›ªzø&ÖµöÁÙk.²cªí­´j|µí×jFæ:ÓP°ÝQ;ë9®÷Æò”Þb­#“hÛ$g×fà Pû+½ÿ©:WÜ@úÖ¾-Pš§j”Emÿ=|1Î&™zíh`iµšû@®{ªƒ+Z´É4Ã¥Žy_öb—K¢8`̧û ¦¡Ï=C¡B—}ó Ï ÒÉ©ƒv¶ºHTý©ÚST¬•BA l¶êûlzâÝAŸ½»y3ñNqˆÁ{ÃkСà…VçmÀ¥:#ʘýć/”ï…÷Æ>T pD\´¯·h@™VÉd­ƒßI5çòêY~(6¡ 4C‡*½nú!êR AŸÕ¬8N6Ÿe—Ù‘·xÅ;Z´~ ǶOøš¢ãX@îL¹æv)pVÛËN¹ƒ<^cö“‘ñ˜X_.,7vœfý1¥“Fuh{ª'»ãÝJ–BÇ¡l–l$z•Ѿ;Ó ôqï`è·:Á0"§ÕUÙFoú¶}®ÿìÀ€’­`íQt Kg¤ÛÕÀ†—dˆGÑñ‰yyüñÝŸ5K ‚»ºcL(«ÙdƒP°¾DŸ„t8Zö=jÚÌ'1Ë`#Ü“TöµM2Âò8º%y‰?*Tàì~S;N/9AÎ$_Ÿ-3¨ÆG‡y)âû£k¤_´(W‘mp6#>žÝ??j“¢ZõÌ_è*ð7`iiv…áEðõ}vtuéu$ÚSÏHh׌ñÉ™°9›»YÔü`òƒv §8‚iûlH’§º^éPb /S>ºØ?BËh^Î{°*åvU,ºI‡íÛrƒV†‰Þâ¾æ'6l1¥…Ÿ2Õµ.‡?â ³ì~:x¤‚ÊÂc`ÿ-ôK‡…k’Š ‘¹,ww[F÷-¡Û—5_ÂÊÐà˜ÅL…íF„úïÚŸ¾<ºåÌF˜ë稧.ƒËhêØ éw’D ©šCö¬$ÄÐÕ{ö Uçêç•-Dk¥7czHH"jý‘æXU0ç]<ˆ{òÊQ‡5ðeÅÇ’úpÄ0Å&>Ë=½à:ßÚØž¡F"rB¾²/N2~Ž!©{‚Ä-á½—8`}¬É†Ò’¼ê rf™ ÜcjeeM2‰Ì‚"¼ƒ¸OÜ!þ9¦œU*G#¹ Û“’•ñåW_}šÚåuŠ;X7t"¡AÛiÞQç•Ñ5¡$‚B2Ñû9hÀ´@¸œ§•_´Ï™ ²¤]^¢?R¯lŠl²<¥šÇ©xðú$B‡°QEEc!tƒJ‘FW ošú/(ÃŒ'2q’Wd!û W"7#Z/£c³ ~·<ê(S&]t/ƒO]„@]‚A1›ô#`~žÑaó]£yîü'E^fß½OÑsº˜¤³ñÊV?9²IÇrqMÇí•.è¶Áãʲˆá Ýá6$T±ÓÁçQ)ŸÓf‘0INª­/í èÄr»†îu=ÄR½a Mšó]?ë4ÓVøA]f3xƒ¼¹¾^ÏLÝTÖ•´¥~Cc¬ì Ìbé§ù$sÙñÒ Éà Æö™Õ´‹ãÅg—HŽ÷Oñ^ÐQùÂXh(·Ø% …—رsÒ7e¨£Øh… —ɉövéµä}îŽp^ºä'!‰®/REP¬ÿb¶œ÷9Qñò½‰% çöþÙÿóúhQNÀ‚5öÊÐ\ß&7Ç‹)Óݯ4R,MT¨¨âv <¬Ú²_\Û°,åÚœœá_8Rgx;è2c–tcõ-é(sÖƒ~0“ìù†"›'^”­a¸Ý=> stream xÚt4\ïö¶5‰(‰^ŽÞ™Ñ[¢‰Þ;ƒÁ(3˜Á zDN´- Ñ[”è5$ˆ.¢E'þ“rïýÿî÷­õ}kÖ:söÞÏÞïÞï~žÃƤ¥Ë'g‹°†*#à(>0?HPPWW@ !~HˆM†r†þu±@Ý‘0\òÜ¡ƧAapê8ðÐà `QI°˜$‚@ÿ"Ü%Eˆ'ÌPç"àP$›ÂÕÛfï€Âó¯W€Ó† KHˆñþNä\ î0P‡  .˜m ΀.ÂEyÿ£§´ å*) àååÅqAò#Üíïsñ^0” EBÝ=¡¶À¯ ˆ ôÏdüDl€ž ùǯ‹°CyAÜ¡Æá ³Â‘˜ ¸-ÔÀ說š®Pø°Ú/ð÷n0?øßåþfÿ*ƒÿN†ØØ \\!poܰƒ9CMe5~Å @à¶¿€g$“ñ„Àœ!ÖÀïÎ!€²œ6Á øw<¤;Ì…äGœ(ð« æ–•à¶ (…$úÕŸ"Ìjƒ¹vo?›u‚#¼à¾ ;ÜÖî×¶®úp˜›TUñ/ã"úÏŠD@âbBâBÔ €¢m~•×óv…þ‚¹1øùº"\;ÌP?˜óGä‹„xB”»ÔÏ÷þiÁ€-ÌXCíap¢ÿTǸ¡vlÌòÝahÀ„áýúýûÍC/[ÜÙû?ðßûP{`b¢hÄógâÇäåhÀ—OPà`0ˆa^üþYF ûÛè?¹ªp;€ÁÿnsOÿjÙó/8ÿªƒ øg1 †¶P€ó?,7‰€l0ðÿ7×§üß(þ«Êÿ‹åÿݲ‡³óï0çïøÿ†¸Àœ½ÿ0¬õ@a ŽÀèþßPCèÕªCma.ÿUEA0JƒÛcØÌæ ÿñÃÊ04ÔV †²qøÃ™?~ý_Zs†Á¡Z$ì×Ç“ýW #0'̉!柉Qê÷ÙPŒžþÙ‡ÜaûKx‚"¢ÄÝâM„Y=Æ|Á…ÚBÑ¿© ðÃ(L €™Ù°C¸ýZ³¨( ÿËõÛÔÿmA€ú·ù3m<ÜÝ1Mý¦ ¦¡Ù¿•…¢¡6D3“©PÇסM'Ur´^|+¥qwÒNŒù>X º”F-ŸéfeÎ>*Užé+[8¶hÈ»dž:ð]®a¬õ>âcT^·g´ŽŸ¼:º6žè{LÇš¤•PÆÖ¾K—íöcŽ×Ó‰^ìwJ”ņ5i4·V•dªQÐI|[ÒA½µîÕ[ùAÅ‘³äò5ÆìIªF:ó#éæS¢g^•$ =}½s¤ômÑA=ƒWvYÃQ¤JR½tŠÂø•sùÄ9Åž[éd¾Ö*ä ºêyL:TD½ ùIow¨Ì.Xð3Ÿ8$mQÝ~ŸŸ¾Vè€L=iOÍgްòµ•žWÖ l~;Ñ7Jy<ƒ»Ð·ì|£u¸‘3“å±Ã«’ýÿ~9ÝhÇ´ >~Ã\è$y^'·— èÆñ[pª4:»«`?­9LRß8¿§}.ª–ºïmÅàEW‚w›ÖCÕi•TÎ3§-Ö#V7fqž'ªUBG`àMw÷kÄR2†'“_©%Ù•¦8&å8‹#ÄgK|+5¢ü»nŽã–3Ü‘`Dß{mKïæk½$Ëø•Ì80k€Åº¨DwÂÈÊíŸà{ÕÑ8íÎGg)º¯1–µþÉñ=ˆ×Hü ‘‹”êÇÅ'ìª×GBïòÒRZZ¬ªHã…Ä~83÷ÎnÄZã–NPj@µèe5âØd넊+:ˆK”næçºú|ÍMWÛÉPÎ 0ŸXNkjr1¥5¾8Ê[?¨5ïH:Ž¢,÷ ¬¦TÁÛ–/gJ‹¸¥;]s|=eŽošÑ5ª´¤šŸlldÞW©Qƒ7ô‹X~îˆR†ðVÌžCß篫ð\“`…+a–u‰¥‰:yÿÔÒ¤uÅhUk‚Ÿ‡x–7DyŸÞ“š‹Fðkªªg:Æ[^x °VØzIòŠ{µa×€·"FÒŸ»K_9'‚ÒÕhCB; ûHß}Þyvg Wòìí¹–dFí¹µl6¶ Ç å׃9»¡Úèrfèò¡×>ŒŠ<…æ¡dæ®+Égú³BbdDòêêæ1Ûã‚ÀÙ#ožO”²]ÝÊÐ$a®üæeàõôðùÏ,3ËÙ*¥¦EÚºïvû¡Ý·µH 7Xú´Qn­õ÷m@<¬}69’ÛÂ,B:<þ×¼¯ ‰TW\. > }YR{ä²²9oèÃO›o¿Âä+w&ïñØçS‰T(éu·£þùnoeS·ö™ÛÝí©ØÎŽaDG+ÅX‰™«tq\Ž£Ï‹8÷‹«hKR_—Ú¯¤áºê­¶È¨ øš6ZÖ0̾|OO{f1…"T,¦ÿÀúi_j±3†—÷2¬|³NÞX[D( ϯU[¬©4ö?¦‡t¾>g¨Œ¼'>õœœk¼\ pìK9O ±Ð»>zB“3Bc‹ Òû¶iuËLÎ9ö]ƾ!yäѩφ={·$ QDÖrH’ƽƒ;î«ÿ¬).#„Œ¯§a[%?¼ ܦFûDD¿U´q>zS]‡ò浩ÛÃ`.[·ìc¯ôT0£NJòh»|±qÀŒeÞë”Üú·ã'`©|ƒ— ïžq›½”9¿%sLÀŒõȤ!2$ËQV[œ#ú¹µdÔø&h½AzŽ‚xúôÝV²Ó*‰ïÑ$Ÿ vNž‹›[˜{§*™Ëü¸J@’®q'ÏÞÆd‡b\9®‚^ñ±sɦZ¼ñi›¼ã±}ùYXUF±ŸUånð×Ì*VÊôUÖô8½]|dÒö–ÊF>’.ËÇÇç-,q¦YÔ’õþD÷ÌJ”Ž–Çʬ{ðqoãoÍ”.zQÏ×>õ>È»d~ÎäkWêÄéE£ï§Þ*zA@.Ïø„=›¿½Õõ¹Š=ѯ^%RÂò¢|…~ðÔ’ŠM@¦~²#ÚFäúôþÃ3œ‘AÕa½K)ÿ$)vR³³NBu<Ÿ9']ÎÈk§ Q_Œ€-ô—­×¡!¢‚Áô<•’2 ·*{…د–ùv•Þí ˜6]¾ðlËð©—}´×cDzÙx€ÿcŽ©/5à*y¤SiFÕ2—oB’IË4 à¿.ÌvøéË Ý‚2ÉÕ¹Jù‰Æ…à&~TÐ3‰`Õøqùµ@zÑ}–¯ç¯>³˜|agæ?š­ô# k³eº¶æO´XÓ¸ô‡Ëo[w,dr{{œÖ›;¿[ nÓý0ÜK÷˜Ë*°ËYeÑhúôÃòë£ýÚ~¿6_ó‚øIgªŠ:BÊ‘bRf VmO¥Ñ1ƒ÷t ÝÆ9²ýÛíØk~t“áwn¸Ói]óÕ¸úÁ¨˜eôÖô“‰7 <“àxÝ!¶ù”Ù²{©Žxh#CcÅÌüu|¦ÈÃiΠSè¤C‡hì“oêsë¦äëÎeñïRGä® jn~йËÉ´AõèwÕ\%ÃÓË´†$TGŸÅþ4ñÞ6³ˆ›¶ ¥RsNÔ|Eé\)þÐøvüãg³ŒDïÊDID‡ÆÑïLÍíí»dâ½ì€ß”{ïóÉpÕ1÷ãÕK$õàÑqÅz9Þ'ï·?éŸM¦N‰Adª­´±ûc›¨÷_¶’· ³kãn6v¯µbaC»Çïóbîd¯71i159Ç‚A¾Êm¨M£Í‚ì„ÆµGØJê8S⣋+¨ÃÉþHÎ ¬m!F'“’„i‘Ÿ36ó„_ç Ã,%(†ؽ_D"ûœåÆûR…¸#—°eÑN¼²ØÑ­Ës¹¡3#c})S\š“ÒraíÔ¤F? & b®K†…;›;¶ ;ë8‘ÝF¹Åg˜m\’8óL…hÒ6É('·bC ¿?p ÉÚÌ{mæœ=I(vßæ%÷¹"T©á1¡ÝEUî5ObQr3ÜЈaâ6}ñ-æ÷Yà .àÃÈ:èÒá4N®ÞN¡w‚;s'?^dá[~.b£C£9Å‹lÐ"Ú)³I’ü‹Ê­si]]–^yž¢=Dý=ø¯ßÕà‚ 1;M±*7ö ó,ƒÁ[¼€*c»å@ÂÏqëJÑ6\ª.†KÃ)ì[ÙÍÖa:îf.;•ýùÁö†Œèüêtq`guÁªfúò˜áŒù´®ØŽÿIY;>ü›ƒÍ«þ«’|ø’H¬‰p +þ…ŸGkQ}y§úǦ"ÿðýØöãG6YiÚë%µ¦ü‹ñ’üÌÔ¯Bk ÑDtQN&Í?ª¦ÙذÈ-•]kÝ+ÅyÛë\v;b.ha‹c¶›Ú6”ç‹iMXñeiˆ¤ÔVW¿Œæ;‘Õ;Ç$šÃ\ÈTÝ7µ‡])Vð~ZwÖÃ?ªÕ0aæÙRµùÐI' 1¶?¶ Ùm^c#&RÐ5}²7S§VÜ"Ü>›f|Åì£'ñرZ­¿nÍ•ÂüLg¶zˆ*OEís5´ø°‹Iâ®åe„\½ŸÏÜþ­¸YÛ))4FòÏ]S{ö¥ÿÉ4éÑ¡ol-Káîhþéf‰"žy½ ²«’oE³¾rÝXÂÔÇ>±\96É€p5À‘Mòo„­L ‚o* WþÑ[œÙØ >É|Eðeøä¤žVqx2ù¤Q]{‘¸)⪛ʑÿiÊYæ‘lfr‚ŸöîÏ—eF‰ ʼn¼þ—»Ë„·bqó[(˜^ήëÖ\†Ã5p —ƒcV—RXÀ^¬ü¢µªè RœkÆÀÉ~ÅÓ#¡/ï5mr\iSl ·!˜äÖ³t ü‚Ú¬š…V±=p|ZÀìñ&ˆŒß:æï?8ÕÈ:‹ËŒŽ5#.z$¼ÞõAuÿÎ5³gú/pýýËŒ¢(¯öęڎ„b; ZË_DK(x°µûkvôÖqj¯3û0Ù--¾%E(¶ª6Sf,ï “÷HKgúÆLò‘ D¶wYÞž¢Çrh>«mN䑪Oäñ'tºIâ]é³¢ÙùñöÇOžÕ ¯`»S“ >åaK­…G…O>¨=dƒYõÛñTÞ>dšÏVÇi=Ž]½Y@\L¹P|èÁñî£Kéùµ{lãZ:þ /Ôi<éMbоÚ °kœÏõ…ªÔœxcaËnÌÉ(žïø¿È¢fCTº|O¦Dö}~>¦r¶2,ëÙÜÍêÊ4^N©,Ž8Mf«”|qã›\Äö—tHzž~ $¯~Ôÿ‚]qÍ#ðÓ8ý~26µn”ñÉÂmß©ì°!¶–}t‚yˆg·tT_ÁM¶+†}ã«ÿ9ܰ „fßà¾å9‚E›}+²%Šú»Ÿ9ú"ØSÇ®ž õ‚äRíãzÁù¼2+ÖÒP6€¥sýMžL3¥¹¥Ï¨xf! Åî‹h Íol4†´¹]oÈ]`2 ¡Ž3El^áuaù`.“]X!7¹ûP87bsÔ]W©zð&Vï2PÊ Ä«¢Eßʯ™Ã#®eas«¦ã©„²8ÛþâAI4Gh”g|v)¹~ ë­èN_— ¬«ð§QgŒ,ëA&ŸVx÷.µÏê¼Î-š­»Þ}ëI`äí ‹-ˆ!T·×f´Ø¨’Ÿ¿Ê?;¶*õéÞñ÷¤Í*ñ#¤÷VKlj9‰º¦ÏËdrÓ‘VåM¶¦jw¸XTï€È bõèå—–êvéQ'Ù"6¤ª™••œjAµ2_òƒ-ì¯ätÖV¯·à#gâ ²æÂ=¶OÚoc-\3†º;=‚‘æI5ºÂ5´”3q- ø5Â<Ñx1wtMÝv]­F*¨_ìE9+V,$> óéxͱ‚’%/ɦ7ÛïŽþdòÙm‹â¥RQT# ð¿ÍKd1©1üôªÔz/™k¡%n]; ‘Ü'òúÇWý€,±àÕ¯W$ý‘ÜCr*%Âí`÷x—§W·¶3ïY  Q•> á6(¿ÇÙ/žÂÂs³â-¶!—fS” Dª”N“ʾ»øSǂ۱7óÁÖ©~ ÎÐ%FRå…]c¥[—ñ̾T–òŠ9J÷À³ M¨´ÚÑ4kÁ•üÎ5øúhÜØAæn ëYjM=冉gž²ü;5b•TqOÁ²ˆˆÑÚPðlhö‰[²Bf†¨ì¸ôÊI=µcÒ€]6ÉíeŠÑ ªéÃãF8‡¤|æq¾ì–§«`k1?öð2as;š;hD8«œ¥_ÞÄ$jUdç3'¯º–;&U Ù•¦#ºßœ8ô#uS.õâY’ò”ŒrMX ±ÏÔgßÕÒ6µfI·gYpå‹ä½ÖS—Ä/ü~ÀìZhš“Êδ¿bšHËžÈ8â>¶¬¹œj³‹åh]â+ÂÎït•¥ ª‚ߢ,®xæR?΀ˆnŽ–vÝÁzh(û¶b‹­+u~>Û qÇC/|yn,6÷06w³LI ·6ªaå°Bؾ©Ý‚ê|?­©|qŸE”TK_î³ÑÌfFÃÀy䜀¼Åi'N\L²,1œ•%jô6å΃¶ÏóëI ‚¯µvm“˶X ‹±ûsÌÕ¡[;nïOxÒ27à%dïýczOŸ‘¦©ÅTîúy<íþÒ¬=Òüø£8½•TÞx9…Ö½†ù8§×aY‰qzøOŽŒÔɸ“Å,f|¶l ÏcÉ^„)q•ê$ßlaJ½ÞåU·—¶´ÇH›1.”BúžƒC”ù¡Ùe#„^ÕêȆÍ~}b·K™ ÈiÞ&ù‰»ªÍNy—…ôgºk¤fLÝާ±lîê«që„€ó‰HÓãÖ‘t35‘¾ü”;ÏfÏ'°"‰ì ±Úo‹’jy'%Œ< Ñû: ‘ö8öÜ\s·Ç*ɱ|c¦L‘nx7„öH#ýëLgL±ó—.pi…ü‡YE* óÅM>ûW6Ywø¯|±Ø÷Û*¡ÕšŠ=·•€•NÍûÍj4Ãz‹÷©cdOàiÉ’Ü{Å«µQ²Ú2éÉ!o´”¨uÌ*£Ï^nóÓ¹Ë9…U¡• 5TgaêÚÚ‰9£hõ¡ÔçŠžÓæ1¹SGg£Ee‹K¹ßê-å³Ì1Œ:|¢ ›ÚƒZŠ÷=O¦¡‚<Ô+)¥9`b‰ÀŠxË»ùêNݽaŒÁuY 츇?d·o¸ÄÒIA·êvd÷qS]0’¥Feu}iX¨K   ªâ>Ûùþ›ã¾•{»€}:ÉÎm$¢'L%´]§+l¯•`ÊQÛ¾t–[À›æ&ú*yƒBÄyáüçˆÖ÷÷íÄìÉbONîVdR¿N?úF¤”ˆæ6Î Ã?Þ)a^iïš/j]ŒË/ÊÝÎ>øP¾N¹ê¥Ê4»·hìÈ¡Še<¢<k–m%Wî„ߣ+ãØð`)eZ’G÷¦b½¤9σB½.Ê;íÑvwÌ â$ÍúìËA½;/—€$ÕÑ×(?¢ŽZ„b‡Óí}äÕ}žñ ŠÓ—âsg"_ü’c¶ƒuyewòÍøÛŽŒr?Ï÷nJn I‘E¦× ÞøìÇBè“*e+so}ÃÝHþvF~·–GŽ£õ—{Ý˳A¬±i7•xm¢Òã}»Ë¶zøVëÁÔ¼£¨L}\ÇWBÂÈíÊÐà…@ð'íòÙ“=á–®’(ÝN´ZVë0©Z´j„vJ¯úe:Chw9ù«‰’„T#j½Ìp!N¡ DÙTxèËÄ,ÂÖ‚ýwä…OfI«9î¥æ'Ø¿Ž ×ä'á>, 5èoºÉa]8¼ªÆ›Öm)Âo‡sðîÌ180‰8GzÉ«#éU§)ËPHs’ôÔ26‡=Q}g-µ>™tþ‡w¬O5“Ü"&eŽ8†@.ÁhYŸ7‰gEƒ•©^(?êaœLæ|*áWºt‹'Õ®Vn¶Ûßø¥:†-ÁêÄl‰±ãë_A«ôÄü¸”Ѱ1}io€ïò‚…«C‡ùA3Í ˆäVßðÖ‡ä§iOf„¶ÝkëNB]×BúpÝP\žÝ"Ó<UOøƒÊù®+­œeT_»ù™Ö”J^T[ÈFJÍh'? ÞvÆ«ò«k–¯¦`¢ºû^ÏMiÎBƒéH\áT¯ÊË:WZµ,/I`§Â­TýcPœYÌM±‡©w—µJ~½¯ â Z¥¬å:J¨ÞŸ‡#eú,½ÕÏ"d—àâÞºGMhÑ•[¸¨$ûãùï¯{&§#@ZåܽúG%2}Îg^U ÀžDôOèR¼Êë\M«®¯_V…tpšnroÈž g±óÆÐ8ÕEí:†Áªsq†×Ó\‹öË;¤£çÞë1;âû!Õ¦Ÿ2_³MlÑ’(ºûfDƒé„n|(¨ì^8h‹9Só†Åýl€Ó’xp¼7Ú#Êü[õÍ ùËhŠ4wâެÈ„ÐäæO‰Fâùéê3úÆÒ,D}©›Ös}žDRÈU¯ a’£:ÁPúµ‘Ô/{Vâ4+ꇽx•£-}Ÿ/r£äÀ`Á bhu—Õj»a°Ê¯kìÿ™<“š endstream endobj 5134 0 obj << /Length1 1390 /Length2 5891 /Length3 0 /Length 6846 /Filter /FlateDecode >> stream xÚtT”ïö.‚€ C "0”„twHˆ„0  13C HKJ*¢€t§t#©tç )¥Òñãœóÿ{׺wÍZß|{ïgïwïw?ÏÇÁ¢«Ï+g ·‚(Ãa(^> @AKKM ñ‚$P”#䯛„Â@Bá0‰ÿP@@@(ŒO„Âà´à0€º«#@@ ðPB@TâÿÂEÔ ÅP‡Ã H¸³'jk‡Âó¯W˜ ..úàw:@Î ‚€‚A0€eqœ9ôá`(åù\’v(”³?¿»»;È ÉGØJs?¸CQv€Ç$á±ü  r‚ü™Œ„``EþñëÃmPî €q8BÁ“á ³† ˜ÃújšgìXóààïÝøþ]îoö¯BPØïd wrÁ<¡0[€ ÔÐQÖäCy @0ë_@#ŽÉ¹ Ž + àwç €²œ„ðïxH0êŒBò!¡Ž¿FäÿUsËJ0k¸“†B’üêOŠ€€1×îÉÿg³0¸;Ìë¯a…YÛüÂÚÕ™ßuq…¨)þ…`\$ÿñÙBP ˜¨˜0â€x€íø•7ðt†ü ürc&ðñr†;l0C@| 6̉䠮¯ÿø§E" °†‚Q+ˆ-FòŸê7ÄæY>ê0b¸'þúýûÍC/k8ÌÑó?ðßûå×ÕSÓ4Påù3ñ¿còòp€¯ 8€WPŠŠD1/>ÿ,£ ‚þmøŸ\5˜ “ñ§]Ì=ý«e·¿ àú«nÀ?‹iÃ1´…¸þÃr3 ŒyüsýwÊÿ⿪ü¿Xþß )»::þsýŽÿaÔÑó/ÃZWFZpŒ`ÿ }ù£Z-ˆ5ÔÕé¿£j(F r0[ ›y„ù€ÂüP¤2Ôb­ Eíþpæßð—Ö¡0ˆ. ýõqÁdÿà ì€ù€ 1Äü!1jCý^ã/‚ÑÓ?ûP‚áÖ¿„'(òB @ž$˜Õc,€—F¡ÖßÔðóÁà(L 3³ÀŽ ùµf1¿3f7pë_~’Ô»"˜ÃSsð¿ìß ‡@< `’é 8øQ}EPãI™ƒ;ïÚ$þ^Ò‰± ïPö3"T—ÒˆÅrœ~zÚŒFòt§€ò3ûmy—“Œ…Éï^èJæ*Oá#^få [f«˜‰ë#ì±x¯cFÖ Š:¬¬' òL]Xºw#n¶ËXÛvésPx߫蘊wç¤ÎSUnÔnn-ËKÓ¤e7ÚYyŒª·ê5XùAw/sÅ):p5Ò,,Q;…UC²ù”$νôæRO_ïeçݶu·€µ}ö—(J¥G½ŒŠÂ„¥FsïÈ/2?¸m§PyY©Ü’ݶî*\äN8©Ð>´Cn›³Üwę́¥ë$ÚÉÑT‰{‘’Õ';[ö=Öl¢(¶@í!0Ô"ãåçQJ?`uú2§/X^HC  ÝÕ¢…#fý"½ú¿.oþ ÆywU\ •–Ô@¼¼4äeÚŸvAµSe|µ[)\ç°ý™„ÛÀäÈÊ'F3wbžqd¤N¨F}õÖ ‰5,ð‹(É#¥N­Ul¤û`vk,mÂÑŒúH¶0Z¼€Ý»Š_0+>«Ê¬üNŠ÷Ñù–@P¯ÖÙ'ooü­RWHÒͲhŠ˜EÈ'B³ yߘÐkÈÈ’œë¶²jçéýºr±©’§¯Ðñ‘ÆÕ³žù¡¥8Láo–äŠ6e7:ö¨Š=)îÖh“ÉÈrh™Ô§'§Ó0, ˜ó7’Í”øaõqúªÝ¶Q.å:¦›2*ÎíH°—º®%³Aï yÚoïEþVd+xÜÇEåG Ѝ¸žØI£veÞ ò„ŽlyEªšØiû±s蒥Ƴ¹8D'änLv>ø9¨»«QPFF}îåB×òÚIÐ =­ó°®`‡ÞbÑ[‚ÇÏ×UÔ|“ˆÔ(?LJ”²P=T¾êÆÜtM À)õÓ0£y ‘y7{­°Küjéën¶¾¢ÀyzC•‰På™ÃfEÓg NC ·)úøÖvFÏ•‡Q‹Í¾Ý…ï±[¥¹å è¨=M°—¦Ýë Ô›N­ýè9ÚvyÖ®"ÞV´Î`Ì–ý#Ä,Z&¹§¤8E‹±èà…á}Ó冷QOž› -çóV¢E\ۊǯê½È®X÷’{®•¾8ͪû7›ÞMƒ©¥S·gíõžtÍÇ¡d ›ä(å±5†Ôðûë&twmáxÍ ²°ÎXß'+ðJÉ£C ëdîÔßÜYç;±Æ¹m@Fò¸Í!7 w÷ÊyõÄ)Fy~£‰‚½ ïd!ø½$gdÜ–NZäÁXPéWÜØžB•ªºLÆ·œSãy»:¹ŽDvjøü‚ûq†Õcœ/I/}”D›÷`wÖ±c±ç’™$ôà;=¬X7ãŒâ·Ï\]›8“È%A±t|ã á—>;Ñ5m Qûçéã??-z’Òã+}äRê*¼^pzmxÖ̳œÓÒÆ!âìxEÄVÝmÊ2ÓŠR§ÒÖ5hÜòãZªØÏ`Éæ—]Óêï0×îæåC8àBïXK“¿œw§­„äSP=ÑÍ£’6ÊBÍR–çOƒLV’Y°EnkD ê¨ØëízÀù>ºã¹rLIsðT–KXêë±ù i|O¾XI•z€&lC¸òÚ·¡gêXìœOÊ‚ìÌgÆ'[CíêC¦s& w›Š?a¯µI“ܧ üÖï WßEMå:û§þ&‹›ð4½‘ª9R#;Æ~ÃWºI8aFéæï öüJ×*Öíסsån§–cijË?UKûC¾Jn®ë¸;Ç.§½âÊÑ­û ×Þñwã‰ga·Ë•Yº„w.¬$¨†{enj‰û+„–É£gnMÈ– ·7Æ6\*=*¸A˜Íkç•yâ_×cƒKÓŸG|öÂú#pú*GpiKÚ/pûIB6˾&õž‡±…­gÆ7q1Ÿœ ¾•‘Ì—Ç~¸z\Á”| ;âœ$.™Äµ2TÄÓX›¶él¦+Tkû6K ʉËÀظI…#üPŠ7m\âÛô<«x.|~I "Šyèù` Ûϼ8…ã éè¶+G9Þ,KN)ç1’‚…&DŒf }þÂ~p1†ýî.Ń缒1ˆöñÅBíÎ =e¾lÛ÷lm±»–oÏŽ®^N¼xnõÝž <:.‘àëˆz”/¡– ô§ÛòV Rž±âµôö)îŒY0•çüøåÓýº„Z‘*•»Ë¯”íªy%ý̈»ëÀÂïMüšý3ƒ§lW+*)F Þë…c=†V™f=¨[0ö¨µuo)c|qe,X5.¸ÏÏžL+ÏKAú˜WÏ–öxw¶Ãm—8 Ä5ôÁþ s7.Ñq,àZûÕ¸È 4¬@OUl»úã„!c²©ô'aIð±ìÇÛ‚â8POe’D*3%­A;Á¶Öù·g¾œiMÞºGI5''xÒŒxô#Ïý£àÄŽÈ}Ç-ó^ç?dQ#ëâ%x,x:îÄdJ,{¡4¤ ®ÆV#Jˆû9-uÍg$h7·ËÛ,l°Y«÷—±ˆ’<Ún$gñ@óøWd|¢æå–ùW-\³P–:; b:8Wú­~ñœycOßLÞm›‘­šAúƒ™Éߢ­=>*“Ë'![0@OSº@yê¢ñêŒL¿g“J^u˜B¿tŽç|P_=BõM6Æ¡è:FO{%sýQ†…1Ôäýé±Ý‹1ÙU‰3׃¯ÔC]†¢%øñyTãR~SàµË©‹|¸Ø¨jÒÓEwßœxÐAú"©™ÝFå¡ÁN˜ÖXÜJUÂÈ,)1•s¦9 ÷ñâö¬K( c™dBí‘ʺMo[»U÷ &6,?ÛPqákhpÙnãuÆWo¦6ø®’ï2¯m0‹z°‹¸0ˆE’t—(8ÚM‰fîÃK7ì¦5ós­ˆY㨠|{Ãᵑ¬„P+®ÃÚÚ´ýÃÆ‚N¥uø š&Õ—·vÑ U²¶ííi–2ãÓÇ7¯×ßqd{sˆ/¤^å”W—ã ä¾²OÜ,jgaLX~)œ2e$`yLì‹;oÅX/*ŦnZñT,°òöŠ£¡_˜"F[íªŽ|8W&4D¤IòžÕaê3€SÚz¯±¡.4Ínr2Çc‚x'òÌoÙ¿Ür<ô:qµÉë+ã.h$»à8*†ÄT7©Øœ|+ÑR<_ ²00¸o±Ä®Ï?*-ÎzÄvSmҽȃ¥1^àtS²tw"ßV?ôHíõÎÍ_Ï”à˜s _ &?£YðÒS¨µL¯ô Öë9Ú‡Í;µR™P)39Ÿ JH&Ž¥íÕùãÄl7_y_Ó=tµÈK -RÌ‘,•u~k¼ìp‹S×ó¡hÿêƒRWk5ÃáÉÜçê!)÷F»¬ÂmìÐç_p—Ê©ä†m’‰TýµHãX]˜—¼o¢Q(`áÅíl?éèIì~“ H/°ÇL©Y°Ôñ— á0ö¼Í“OÌöC«<ÃÕv•ªÐëx”R©ïðä"AF´RSÉé#Š€Zâò`íªýœ8ÔH”¹HíŸíÀ=~¡tQûÕï§bãëš!9““üÜBëå]­çþâÖäí ï EÌ5É'm`õêd|Ã[&Gè”×﬽òôn4lãÅÊ|¤Þ ¸ ¡DGŠšÒ•ï ”æS}¥å}öÎ kI¢Æ­W ß­ê¦ì~$È"!õðòNWÆ…1ë[5½¯Ûã Q^Sj¥›_kdóŸÑXò¯Ê¡5ÔÕ²_ôÊÀ}à¸dÉ Dý4ÚÉM/jÖ²vì”®”bÞìbl¿ðÇsy`/ËÁ©hWTüóà~W_~°0o"Ëè¥Kèã³®qxÀ‰ì3©C—h5¯_k_ÕðÓëü+¡îÉæÁèÅsjöWЂ×È|~^FkdÓžnBËÜx\Û|mö çä½gßoåWíLH®f(Qáô!XÛÞÝÍ2ørÖqjZØùAß§réŸMÕß~91"žžXZ)"»³'즶’(Ir.ò¡P9 òî „’©†.‰6M?%•àG"[!ÏVÉ•¡²Ò’“HNæow oR_@‘7|xÅj(AÙ”yZbEã ùÏ._:tϯc/œöëñr+/ªm÷òœä»í6’ﬕ)Ä[rSþhwXWKôÙr鞘Ù*’¡wÍrµa˜ÒÆ›ý(ÏÑ©„U‘S£YÊŸ‰Rág0«ƒÆPÁƒ¯e~ê¿€J¾GŸtb×7²êªóÄ ËžXÅž1áäy÷ô¦æ&pMOÔŒµ6¨txãÉ„×tô·Í¶\ýŽ¯È¥ý$’ÂóÚi48”N‰ ój»a7gUR‹§Õ‡Þ˜¢7ûqÇOÞÞïƒ<ËŽü×Ú,ÓíÄfÞÂ(Þ÷’rôc¸`ï”\£¡þ›6|iÂ8­6`šÛ>Õr%XœU0$r|ù º]JÕe¡Íq–;òMÉú6%ïŽëåÚ“ ¯äÊe¯´$ 5ïø'à“R~%ägùxiÇØÅTæ¨4ðbñÞ´?ÏaGùƒÓ\á‰Dâ€GÊpV’¸È‰@Ð÷ðݧ—ÖÞx°ÂÚÍ¥ç´ï^O"¨øH$—éžg@©K3²aO}DùãØLÆÄëï=„»|OAÌÇû/5ÑÃ*wv×?JT…o›Dç~2Y"¥–žòÕ N{Ps7˜ì>šÌ¹ÚÓñJPÖ·7Ó‰t-BÃ`3‡/NA­¥Èývâ§9Õ=Œ?{þùÀKPºe|sL…À¼3ÙÄrwz(Š”ú\ ïÀ>¿'äË–ïƒá®ü’O+JÜ Ò6 ÷„.û¥'vä°*ëԪ͓Koݸ=¢éürevy—ÛÕÒßðÉ>.$|N2ˆËr!"¾b×~J¶²ªG‚ŸÌñJútÈcD]0È@³zþ°´ <7¹+†SŸÿ¾OúXã¼-³Û´Ó©ùëÃbuzåé¡[ªŸM•å]ÆIá&$O.NÑGQem㸻b>ÍLé7JV¯%kò¯‹qÕÚËTÑ.¨p|óÈ×¹J4¹ótfIÖìý-‰i|®ùúЛô…Ì úJØ?Ó'ƒ€’`Uœì˜+Š5¸Ü¥2(ö¡ï#O’±q»e—Í¥¼9iê7ÑÈ‘äøœ…®&CÞNÓÀÃ}ŸQÈ;c•j.g"¶V»£Îjöô¼-eÿUN¹µoùk@ê] o<È›‘ÁæÀ¹Yã¼ì-x’ɾ‘zBh0[¤»¤XA€Ö7®ND_§½©£üBv5> ý|¹“‚{1ËH÷Ö$Ý)¦³”·QþøKœ– ßÍkõZ2Øâuõõëí6ƒ0ÜŠÒ½§¨#Â?SÌÆh-ëÎÂ`±KŸY¼‚öÂÖÑTQòæ@…݃–zþŒ>/·šÁTÉe¬´ù J6JùÇæu¹U¥êëR_Ò])Ò®b;ùC×»µ[ÜGšb†²Ëã…ÜŠ”Ó«3ý]nGo9 T<«xrzç.Ø=o0º?ŒëÖ‹ -q¦nߦ€.>Ÿ¤w4hÊUñ¢ÇAÅF¬ê¹ž;¹Ç†Ââòá KŸY§jòYóf5o¯±®"öAÈ÷ú¹™VΟ²%°–öÀ/FU%W$\7F¾s/W{œÝsܨ˜¿/ýi<¡BFk›øÝëú†ùÉÚ)q»bà£H¼øæº,Ÿt)ûGFÕc…P¢ûŽRˆË¨lN6J&ÐÓ¤;4@áë\ÈJìsŸ;ŽV¢(û&jµkIz“YÙÑ©*<\Qsx §ë«œ+¬þ$FãV~ ™²feDÜ=ì¸a½„ î§Œ<úÒ9ÍÅÐëÆŽÙDæÆÆV¶{«?îœѧ29ðuæñ÷¤ñµ€j©j½'̓]¹QuûéäjLõ(:=|îÍ(rjE£ øEéT){Qrøè~QTøCÝ·Vá ŠšÝ?î Ï91˜&Èîè¬ß9wŸ£v/Yliz¿WÄØ‡&‰«ªn½µÂCxå†î€º‰‰ˆz¥si5H´¸Â.ïè-|è£üü.&Z|ÀÌÌȺ?õ<µàêVõp>¯$p›ÌË–çÑ&N~ßøÐee«âð/»­Ö‡­5_Ϙ›(®Ñß6Št¼%Óœþôµï »WUzûÛM¿qê:w¬¥4q¾¯òFõfÝ_p"9—ƒÒ±ïRV‡h¿5–/霃–´žI¹‰9UMu1ë°}ÌêËJOTó^ˆ“#LO¹i KiPÓÐÜeÄÖxëñá‘ äÄŠ'ùÂ3:Óž§føõØj¡Ë­›^šL!Å'÷×kwˆØ½‚6ÛßdÞ-‘óe&ß­DjÛÁ´iäU¯³Ž¨Rù¼­ð$R}.®CÙÏâ¦*V™±&Î#»¾à´'á²Ï»<¹zÄÀðé4—-`­Q¯5™OÊ‘ú$ªm};“YíV„côöíCö©–*+rd]F%©5).Ü€jwØ{¡Ê3ÒÑ+ß´§ï°úPì®MëÒùdòÖÿ¬ììí4Ôq)xyóâÓ~o ïlÇûÏ}»{í‹)Ó”Û‘?-¦ñ>jîê?Nbû”õZ2 &(3Œ¬ç‚Ÿðz€+G²)Q•²Df󺈓Ù§PM?û=âépYñ£vËGW~ãÎòDblñoÉe«(QâgÐÁ"CVVÉ– ìK0]¤¬k+¶íMò”|*_i)Úf4þl¹á¢jP³F6ä–Zñ² Od9«bB]ŸÈb[õfxާü2ž3JëtI3&c†ükIq.‹é=Úo·ôÇÓÈÁ‘t3z\–7«~0ø‡-£¶s¬ü§Þ˜ŠiBí†üõÝfêñp.»¿ÉLM½À·Äaß+i}4<ô½HY¿u/LŽaŒùud`3U׎%ùpÿý!*Ÿ‚Ì­g5_ù[Œf»9äx„+rßÊ™®îp+èɦ*êN:Ý2…î÷OÝ¿014ÿ¹:Aì endstream endobj 5136 0 obj << /Length1 1343 /Length2 5975 /Length3 0 /Length 6890 /Filter /FlateDecode >> stream xÚwuTTm×>]*% Í¡A‰¤S¤C:&``˜¡¥;%¤DPIAB:•”.P‰oô©÷y¿µ¾oµÎ¹÷Þ×®{_ûÃËih"¬Ã8À51hOa°HPÓÓÓVƒH\£àå5Ez¢à(xÍàX$-÷5,â‰Ó©C  Ó*üØòÐõ[Õimµº+ކ92|©7îñ9T¼&便2‘½¡%ÏW_~\æô…”¿v[ä2Á`Â}RFñËÍ*ÙÍ媯UÆÆ[´y<”w±in|Ïèì“\êš.ÂG.f°ln^qÓ9ÌÞT|¼Þ.Ŭswã]n×`ü™$vØ*ààÑo˜Z¦³ž9ù³Ûá`2Cžq5^ãš:(ع“Ìâ¥Z{Jn6m‹Ý 7WíÎÓ9¬=ð—Ž= .Ѷ<™ Z èëßy)#îæC[sñYV<ˆ s«e”ÿ†Í:¥™„è;Œ·Àè»»AºWb•ÐÓVÇK5vé /s ¢Ì7™ºÙOUX%V„?‰8I_éùfÑ’_¡/Mtzùe«:˜C+€ü“ TÛÌøL}å‡ïd±”äܳãà™ÞÙèñ“NåBãŠÂÍB:›+"|xOä ¤Ö^W¸´{i¹\îdÖY‡ìFÇsIrßÈ1Óš„ª3jMù¸Ï¡÷ò99¢²í"µÛýÙª2ÉùáEeWú6^¶’Ç zXN» ?V •SÜ¿MqM·¹WÉ•Y—x^ìv8Ñ 3_™÷Å_¶î åì^ßfÔQ_uµË´Ìå 5x‘÷A‹HoJ£vsÚ¨Ÿ1EŠjçlß:Kwò)Þ#`š V‡¤Szg:Û2ú^^~º¼Œ¯ËË`$No&.”º¶ÿØŠ’÷ùc„éŒnã±\7#iË;ÒÖõœ ­Uý”Äqç$ây]©²v2gö4ù» Ð"ƒ•²Ôoè°Á038ëS<›bêèUК}¿™Áø·'½îì¨î©‡šñõsÃz2– ª§‡ÑíŸwü†•éT÷"å¦wUö¨ÝÑŽRí‰É'Þ9*{|–ú¨›ŠÉšc¼+¾îw6Ó/KÔÓ;0*°…¥¸s|,7_âG~½UW$‹åFÛh}H&q÷ÉÀ¢KùÑ„ò˜60&ks»ÜÔ{íêI3½ÿ Ú„•î®î~@iëg3¯)ý»ªØ«öÝŒ›ß?¨„¬l¤¬¨N²®5S­Ö ë_ÚÍ›¯[Ê•Ï~UÏZ ÔÖ0ÓwÀ^ š[;`ZIãL²ÊcÅ ÎèŽ l„×A+sæªîœslŠjÞBJ5 œ5Gè´ìç¯Éú¤1'½¸ÍoØè—^wk´wû­$ A43žÖIH¾™ÈêäñÚõ…ígáœâㇾ€!ñÓ¹íÒjð'ùI°£y—õÃAîÈÎÌô¢›µ‰Ü7{=„É÷‚¿ü<µ/íqÞËZ“çâ¼’W)_®—AÀBÆœ ¹c›ùÆ•‹ o-_¶ï:}½FNd«6@¾ºÂnÀˆýf®µ¯![ƒ§»qê ˆ"‰¡> 3Òì‚ÓNcOæ5›ÖüÅ—RNâ~M®ÃÉЮ‰ È­˜Þ­¤/‹i㑦NcKÉÒSo³­ÀQçLPÞJÈpü[ŸÃ[¤Õ¼¯#Ü5è…í⟈(Åï/•LŸxWxûß[§ªt¯µAôßè«`TûÙN_×0f±q‡¥i†Hã} 2ízšÎ˜Õ3UýåR´ ­©ÌÔêqâYNÌy91±âECÆÇ^À}%T’Ñðz³|¨Ñ—§}¸ÓÀA«IåéNûYô8©îϼÛOÎÙûØûþõ|²æDéÝÞ­à{¦ÚŸÙ’°G«/v¿Bºå‹žñÛˆÉàó›‹hÛ¤>–¤$šLßfîÝa ¬ù–X›W»[wrð!ñæ3žŽQ«²¼÷T)ûÉ´ž¯ÖÁÇ3žkš´1úÕWÅwþ=ɾ7N»龎xHßlÙ“Eo®†0¿$<ã»Ä"d#Êã‡ÃôRÀy÷±_KT¿®k¡ G»än[ÞsGï¸ßK/sÏÝÄ¿¿Xû8ß!'¾ :es(¨¤”êIXQb•c‘‡®‰ŸçرšâÿdWÇ>Q;R±žw.КÆ#¦·žòr®û¶1ÿhVë¦@FNP¸5Eô+qÛÕ³sõ&Ÿ™1P@§íЂ:óò¢ôÅ“suÊŒi…Xáëà4}§¤v#[“Iì7;»w÷¨·e·1÷Åmç‰ëÜgW8,CsëÑUù2es‚7ó’>ÇGåv€„PŒ?B¶Ú¼ïÁ“Cà¡+Y¯n]‹ñ´RÙ-N­†¯Æ)Í4øY2ùL;Ë•œ²qOòtSP\´ q}ý¨`ɸ±6Œ± ÝÇÖŽ±æ9DógÜbÅß®q7좩®1^Ùf8œ›Bƒ 6*Xz+!u³Êžõ³Ûsž@¶.ÁÝß9mW1 smô$h-M{­îÙ=B¿u¿¯¢âüB³âÙMîÊHSº¼¬|é0cã)îyÿkˆ'Vø‡:y#ítô2ûõB_ :×+ú¼¾i&p#Z–&¼cª.ì΂¾ C;W"¬\‘Nát¦óä_í÷#¶ëaP¼H.{—~Áüqë¶õÕ§—^ó+÷©üœHn¾Tôµs¨_³ðuù'ü3‡)>Ñ̮̜s¿Î£Ú!R³P,N¨uãL-#Xų_Ô(aîìÈŠRó©Šö»ž"ô@” Uy\©Ê›z³úUƒ!¥]_(¸ù0“„j¯_“qq³|ÄšÖ2’;öUã`öé{ ö•[ûhÑÈÒ£M®Žî<¼ÈÒ‰x¾ûv“ª(3Y~ "ºgÃ××0°ùžÒ·×¶ YõL‰Ïi?`Ú>w¾ŠU™ëOwš·–XªÝÊ„²®+Uð)ì«ÑÕð_äˆ&ç?)â‘EÚ$ÁGwwÐpÇífó†Á ñU;ý9TV¨jÞaJmÇ*í%§ŽŽGýÍ4…tCq ?6 Ù&»OÚÕÖ›¯Õ~ŸÝîmñ®õLLu®Ïn&ºšÇº¸?<ŸëÓ˜`gÍ‹'±}yð¥Éfi«‰G}w®ùi $íIÊ*÷Žéô÷²Èÿ\+>Ï‘ÛØ|_ºßER2<–\Ï%~Æ0Ù¡¿Ìö.iéÂQp¶ÌUïuOpGÒÅ}ËlʉÐãMÊ/W.h’D [žyy×¹¢¶z¦™³¿TóÏD>õu+wa­±éqŽöxe×­'Ú÷iÜ0ç^'1º’Z'à,BŽ62âÞD8§L»Þ6¡ßrß%‡ªwt¤—aÜÖÎõêÈ^¨/w†§ù]þÀUÄá ̧K!§#ËÚuÇ8ùÄ{“—M ¹¥?¤X3qA9ô“;Næo/|„)¶(ã®tÅ*V*¬šÎï­¶·;ŠÛå]·‹ä÷}É”*¨˜ñxú´³tú³ÕÒÜQt„—ÔŒ`Jc8Ñgw›Kõ—E& ±°7¥¼¯ÅÀïƒÜjÊ’Sm±å©›ƒß*½-ÜŸ?Í@˜‹–³‡FĨчּGFÍO‚R{³B¦‘”aã½â^®©Ì:q²zEá‹„ÒóÍ oáåÅìš¶D_GÅ÷Oõœ”w:ÉGgY©2OÓTÚ¤|gÌewžjü1ÛÎ.U¯~ðQju†[©<º*Òjö]¼áÎDÖþUH̳ñuÒPþlåÞ?à“ÇúH×ÐÇ—†o¨ë¥k­Xóâ:¹>%¯[E[™TÒy‚¬åK»î°XÄ8X˜)£̆³dõÉÙÌ„.ðúKRO¹§,àAá2½ì4l¯ì•ÑÒãtMí6F«Hâmù"Ž3{’®Æy;-¡‹„,Ô6þ3¶}Ðbµ´ÍûÙRçòR<#½,ôwTŠ­úÁVÅ4†¦F±éV´²õè–~Â-¹àÝÊÕ£– .üЖã󕔇ކšÚ@‚÷äðG½gÙFË»>&´‚â<ÛãaOÎç«I8mC¯Ùå|WCµ¯ˆBì׫rS5Øg-Ü¢È4„r£µ ž‘‰¦Ê=fxgYÊÕ«ãT1ë.¥¿!<ïÊ¿F«ÔZ7óXÅÜbÿ­ïö€Š=·Yí³‹¥r¢öµú[þΣ…Ío |j¥f³ˑbÃ^´Ûo(+ÃMò=]‚îʦ~'óÖBVÞ@Õ™â×Ìz“¸Ë€ œ‹±›ÇRCfÏ#:›<Æ{¢WulcÍŒ¢~ŽFѪòi¤ëØ–(ýKÞ‰²édô­«=î2u¶êN¸4£–Í2 CÍnâ…'ŽÝÕM5*A—QŠM“¤”È;QH“m.à |/äMwê£DÈÔŽ\ðeœºå¼·8Eb Â:pJÝKKrw^°Û¯k*ƒ›´àÎ. ifT§~NˆEãWÑ{( jm˜½ Q—{“(»*ÓÃ7 tV2M;ÁuãQÖàx#[yàûǧ\ð¯B;ÙÚ7ØÌã´äÖ+ù…êÆ}·LØi–·ëÔ JŠ %5jømó•HÏì@¬àϵ©ñ ’O1ÖŠ<Á–AHÛfŠ.‚5ÿÉy½•bÙÍz‡J´QRˆè“ÑQ³¥„µ?¿Pñö¾.’E ™B!¼ÂK¾7¦Ö?¦BÌtÓz;¦±¢~ŠùšúA½Âò£[çË¢ž'Ô‹ñ¶«‹ìQø­žÜŽšur»UnЛ&Ý4Ó}aT3x¥ûÙ‘.+Åî©?\w9èxwÒÆ?Ø­I]˜Ò xyÄéöÒJì-̦rkÞkY‡U@ Lm‡âü<ù9ñ°Æ)¯:TŒÞ&^Ñ7Vê"CšþcõGä1œ§±ç¢š©’ïª'§ÏITgÑ%y° ×Ä*6‹ü•;×¾H¢d™«?% ó*jr/ \õ„îñ_÷(d¦ZøòNïöÏRoŽ7§ÙT×;A|†gèªâ9º­¢íÚC.ÇŒÊY°lÿª“~¢5Ç•™±ëJ:î‚…8Ž„ræ9s¾$ç/Õ,4…QxJ]ð-4G„áù¦‰×Z*ÝÎtn®±¿<Ÿe}ÚØŸ¥ÙûöÛ%ûšóŸFùT(KJÏØG´íË×?ÙPŪõVåò—íî&øt”PÒ¨ŒÄÉýfj²²ï(ìs6Ÿ¼7ƒÂýK*`SìI83GŸ'$ø› @{,µ÷}™™ÞÉ= ýiRòÁÍM!£<ú€4¶SÈ3ð¢½ÂæëÂaµØLxÐ-£BË«d3ç*ý¾d¢dàDÏ=¸sì>Ô9éaÅUþ§ûƒæHÍlzëÍwsª…%aCz¯Yµ½ëŸŠÞr}îÕÍ*¼ÇÔôBÒ¬XxÞ÷еæsBƒ‹hJAù‡ù€ôÃbE‘Hø¥0sØSiÇ #ã ='b+oí‹W½kÍjïCR31Jmg˃Π±q"Ä!”=‡CÚº+v]6ðQº¶÷’ÏçB;iÔ‡zÞ(22ß½µN5øå}2©âêà‡2ùDØ„ÅxgÇ­§‚ÑèÕ‘—I£éÇô /Ñ_´7i– _RŽ'=«6Fô=e»ŸÛ1Äk¬e}g“ÖÃÁúy=]Ébx þh•ü=¢|~Rqr­j‰•~êàhj0¥é)uB¨ÍA¾rE$wÁvã0ž©ôÍžô$M#­×zš·ç—Re+)™Å¦1J fʨU`ãrQ_[½Âu&þàfÚF‚î^=J¢ô[/4!èçú§˜@Lð7²j±ÊÆò´¤FknôûzlÄ,‹ è»¡î=M݉ôÅb'ÀKã!Q›N5ˆo4=áWÐÉÐù.w·½2tîYçKñzmîpEJ”€† ÊSÏMäÌš åSlu°_Ö×=üDÚSqù²÷l¹Ë—·»±0 *žC~1ù°öƒowo%%¼÷e«»ûº»>¾DåÂâÜõkªAŒBô:ýjÕ<"i’Oï cQ¨æ™×’M8˜„ÖèÕ%¾oÂ9LjÎòÌËÏjúø‰¡ó (Öâ«i{ŽÁ)Y3Z_‰ ºÞÞ¯èCTÍr•åÖJ˜%­Ç„-8)Ká’]¸Y×ûÏ´žŠ¼«±ãf‘9iã€/¨¸.@¬/ ŠßT`vÓäåÚËMûŽ@µš‘Í Œàíx²:÷Ï¢‹iFŠáwkk•ákxGÆñÙw05¾MIW\>>êKºŽmhoÍ„²§-M÷„&Iȧua©ù’ƒŒ•âoU­ÙìuKwó¼…e˜¤e<Ìš8¬Ž{®ž`\D?$Ќ጖l¬ÀwYÒ¢îÓ ìWs\‘uê3˸GÛnPÇÈË¿V²òÎ"ßPƒY´@_&Ý L?ò°´z1£¤ÿbÊ€+ý5õz¹¡„âC›”mDq|Ë®7ic!w¿» fsôçò>á!ƒ\sŒÎ~Ö2¶<°Yùø¬Ù‡µþˆfJ JŸVyó=øtµçJ.¾³©`¿·“½aáðûkÉÎsm•Ä*šDõ¶°¬ËþÅ'oo¸)~ìßËme®XÖ9í.”2Ýr(Ðä¼$èô¼vh¯hNÓB<dÇÜ05kggOBp©Ê[6-¿ïPO ê?9—}…OmBêÁRÕüŠøÃ(ͱ8¨\ž\Óôå!2žô¤[ß}˜{~Tu7ü5È1ŠVo²«õE;¢/Egm«Oip;äÞqEOþFiÍÿoe endstream endobj 5137 0 obj << /Length1 2825 /Length2 24966 /Length3 0 /Length 26531 /Filter /FlateDecode >> stream xÚŒötÚ÷ Ç ÚØ<±mÛvcžØ¶m´±Ñ4iШq«±mÛjðNソÛÞÿ÷ñÞÈ'g.í¹öžkïCN¬¤J/ljo ”°·s¡gf`âˆÊ«03˜˜X˜˜XàÉÉÕ,]l€ÿ˜áÉ5€NΖöv<ˆ:\@61#Pœ¼½@ÆÕÀÌ `æàaæäab°01qÿ/ÐÞ‰ fäfi gÈØÛáÉEí<,Í-\@Ëüï+€Ê„ÀÌÍÍI÷W:@Øèdibd7r±Ú‚V41²¨Ú›X]<ÿS‚ŠÏÂÅŇ‘ÑÝÝÁÈÖ™ÁÞÉ\€šànébP:Ü€¦€_ ŒlwÆOP³°tþÛ®joæânä€ 6–&@;gP†«)Ð Z *-PtÚý,÷wàŸ½030ÿ[îŸì_…,íþJ621±·u0²ó´´3˜YÚŠr ..t#;Ó_F6Îö |#7#K#cPÀ_ÌÂÊ#Pƒÿ´çlâdéàâÌàlió«EÆ_e@»,ng*jok ´sq†ÿÅOÌÒ hÚvOÆ¿OÖÚÎÞÝÎû`figjö« SWFu;KGW ´Ø?! üo›9ÐÀÎÄÄÄÉÍ :€&Œ¿Ê«y:ÿr2ÿ2ƒ:ðõv°w˜šúZšAÿà½Ü€'W ¯÷ŸŽÿ"xff€©¥‰ Àhniÿ»:È 4ûƒßÉÒ ÃÒ3€é×ß¿ßô@ò2µ·³ñüþ×ù2Ê©KÈɈÐþÝñ¿>{€7=€ž… ÀüKdœ /¾ÿ-£ddù?r¥íÌìܳmÓÿ»ý#ª†ƒðßZ ö ÕT¿E®ËÄÎdú`þÿ,õ¿Rþÿ)üW•ÿ7‘ÿ_B®66¹©þòÿÿ¸l-m<ÿ ‰ÖÕ4òö 1°û¿¡šÀ¿‡Vhjéjû½Ò.F A¶3·ùw-%,=€¦J–.&«åo»ú¯)³±´*Ù;[þºVô £ù?>Ðh™Xƒ®g$ÿrA“óß%ÅíLìM ;ÀÈÉÉÈtÈ ÄðfÍ¢)Ðã/ìì]@)P{¾3{'ø_'ÊÁ`þeúqE~#N£èoÄ`û¸Œâÿ"N&£ÄoÄ `”üXŒR¿+€Qú7b0ÊüF .²¿ˆ‹Üoâ"ÿ¸(üF .Šÿ".¥ßÄEù7qQù@\T#µßÄEý7qÑø@\4#—÷¿ˆ‹Ö¿ˆÄEû7åý‹˜A‘F& ©ýkaU2²u ׯ òß,Õø7õcìddb ½Vf.¿í¬ÿÚÿž¸ eLþEì b&ö6 µýÏÂÆöËbkû1 ¯Ï êÝÔÞÆÆÈé‹ß¼AÂcþgQfVœ-~+æWŽ£+hÂÿ­ü+ÈÃÄÆÈöÊ 2û A9f@¶_Ðò7fÿ…mþX„»ÙYA·ßD™~‡³ÿ ·wý³/P€ù´ÞïØ@«Yx:XíþˆÙþàÃÚ «? èÀ­ÿ€ Íÿƒ,èdü£sÐÍø»2;(Õtüáí…ýo2 dûÿ¸AÍ8üvƒŠ9€v»ÿˆ„ùë% Z ¤:ÐþG(Ç_6KûßB`mŽƒ«ók‚,Ž¿ør:ÿu™ý+?–_F{ ©±Í¸°²ývüÅrüãùo<÷?Öÿ3ÿÒÄ'øK¿²ƒ’œ¶–ÿ•<û¯ ÛçÈ*â zoÿm´#Î6ª—™Äê÷² ‡ŒÑÅ øÇ€vÜÅÝþP ×? èðÝþ€ fî”íñ•÷ü‚6Ñë79P%/ ÓßKýç10qu®Ë_Ï5húþ‡ÿúñzMàfíMxC¬jBZï¿ ã¹ÓïŒòO‘ïh¦QÓ{/8µ¹>"¾ùH]•´æt+üq° yyKœêFh‘èÙû¨©îMxs²rËOŸ'ƒD•‰øùq̾±¢#áÚ^8|z5¡]ŸgG@kÈ&ðï2äyŽ®\ˆJh÷î=’µ½eKÃa³;Ê»U²Oe“ô±ê1º%ÓäùÆÙ3Ø$0.ô°4¨çHÓ7·S¨¹c¯D2‰´ð¾Ç±¬ÅÞÚë,q3^+åj,Î8d8ÚØ7¨ÃÞ"û)2XsÞŸ‹—ûæ=šøŠ‰rßÑ¥.Ó#3ì³dVYªDÛ5tW» /´3oç}„Pâõ¡m'W—6 8‘(bTµD£¹T³Z öÛÍDVZo5:ͬRñ¹'k_Óï´,Ž;½Ö9® õÑß…¥6ß6 muúj–ö â›»3Óˆ[èD-/ñd¤B—¹Œ@th¥Ñ‘éÝ>r=A…òy]ˆ<â2o11isAwƒ㟲çù\ÄùVÔŸ+´¯O£ÌÙ¸£ê¿s(¼O=?/±`7Ì £ÊÏïŒÌ_§Tæ­ÖO—1ž¯W`2ˆ•zÉ%m²Ï_ô“³IKvïÌUFéyZ=p2œjT¨·$°*oGÓì׈‡öpßšîoÞ~ù"¢q`¯ñp^á!2·¡Æ’Ù®Ûᬘ.) ñénk¦ΘôDMÄØ¶!ISÿqk¤ãÓ“;]™´9eñ‚|¯ì_¸Ï‚Þ¼Xq7Î×!ÌÈ›†–š6Å{*°·YÈ+qäY»K¤mƒ /¸"xªj÷¤^ë`Ýs“#[Ä?&¶È¼m*tKØz¼ì1é6‰Äs[WküT1Q/fQ«êîÂu‹øÕ™Ó}Àµãa(Ò7m¬Lè£ÇR€¢RʬU¹bZô×Ùä«M¯l¡G¢øFþJgÝšUô¾Ð/üºZàdkb‚ê‡pã»Os'=$ó•íú¿àeDál[V‘Ï~È!ž›€—cêÖÉÉ@¹Þ*ö§&Ž1 }k² ¶Å7C‰>PŸr¡‚¦Ä*žOBÏSB‰²þ2.Œ(ƒTŽÐS#*3 &ãRFÑíÍ “ÀQ O¨1Þ=Þq43+5ƒ—|ÍX:„(1gîN"Áþ!ÞýB5‚̧ê5Ð^™oto4aÂÐï_6!3S©lú+_ËíY]ÃÃ|Öê Åùj^ÈZÅAl}ýׯ™‚ƒ8†‚Wœ)G˜ÃyÐ:Û¯¸<”øØ˜g®ø]Æî¥À‘Þñr¤75ú:ɺ2°þÌPƒ¶ÌÀ¬“r©¨™˜ò½õÄ&œ}ñ3!$×]s< ÐmnÞeSds#ÖÉ4¸“n.øzV[õ„Ñ·kË´FðåR^æA>W‹©|8ÞÍ›c ûìî}7Â)×q0ƒ„‡ÿòC¶Ú¤–,ò,öá u'–䬷Q„¨¶ˆdNúyM°§Pö¦ 5ö±» Ýsó\— ÁÒ­¸±žëŸv0jGîmÉ»­dy¦ º¢™E£‹Š·³cBÅš,Dû\ŽÄr¦“•[xöG~ÛÌŒ1"üBÕ×'ÄLIZùö^d'ãwýä=ß'1Ü7V7Xôì˺וÏ‚Ò?\÷óElO%`°xê™açSLaK<9î‚:Wï>‡`ËÙ±«^ºS”ÒM}­Ê‘ôºÿÌ}ˆÍ?@™´M5üÜ*ýd¡ðX7ë½­ˆ @Lc†”s3™±Å€¶¬ÿÔA1@"|hÛ#Ô 9V]Ta»lLδMóh˜qô¦'?y-™Ñì¦;Û¦\Iœ%Ÿ‡PC˜ZUDŽq—¯ ó”­L4G¸pí.Û†·ÒûGióü{h; ˜$Øh°4°.o•yû$”Î5,ªmÍscáY{y´Ù©TM”µüĶwžÛòû¯_òªõÛîŒ\rˆ`…™ò³Á$.ˆ>|cõ$$Mß2A’—Ÿ—ìÕ~^Ñ´-mö‹‘ð‡Cµ){øBÒ%#P „š×‰×Á÷ÝÓ N€ZVX²Ä¡Ë? \-9SAÅlÄ,nk‘ˆí‡,kSÊfØo“ƒšð¸‡ú„m 3ú^#«ÿêZ9¯êšÒë[pÞ‚að5w½Oû 3!MÙv,jU¼åÜêE A+ƒtîøÄÍW/ÿNTÜ0Tã Àb½m°‡C9yT¢Ø^©­gs%ØŸ¬,¡d‚•µõN‰{ŽûX;Ö™;œÒp«‚ðݱӢæ‡âãç©›þ DB0fÁo³ô 4WB)XØÜQKm¼vɦY4ÏÐjÜWBû޹_ wH?å¢ hvÓH ê­0~2ô,‹Q®†‹ü «ü± O‚¦lÙR ó"v__pkjP(o\¦J®V«Ð,Ë_K«’>{¬ãTœù4 uÓ‹v¢åôm­žÇ[}7¯®ôx ?*®.^p|õs>%Ü1ƒ$CYS/®­,4Š$½°îB^¸ýš’ա󙚳‡¢ý)ÏbÔ.ûm5Îåô’Q×7µî Ê÷NþÓkéŒvv!eäò1`©R„àköò~ŒgÀWÔ+xËJÔ¯-ë[g¯vÙúažÊUêÁ.©çƒ7õz?E ºmžÉ­-7ï°%_3§‘ù£9Ù ¿ž:Dï껺´Ó^ƒ¤Ioá/½r¾9·ÏD7òNôœE€%%ŠöÆ2eÐô×þv|F¸Ë„e‡°nìjfJF?¡{[5:I!Ççð µÉí­O“_f×þ#Ã`OÊ7Z³Ñ~/ÏÏnÁD5"^•Cá¹a×,‚nÓ­°0‡W­7sáÝïÁ ‰¹pfŠláS–±Í݈ßÀÃÞsîHÀi yªêù]„æB¤W<ØØ‹Ì”'Ã¥d»3=ì7DI|z»²öxZ*¾f¤dv¯äÁ š‡ásøFó©ŽwI’pY „Uäš}áêi÷~CJ—dê‹Ì=sÊhú‰ »Â=w™ƒ §L‹ÈóU½3#äiÔ7sªëR e:DÊM®‘dIçÞÆ@"2n=tŠˆG[ÏJjËzœ(·Á«®[ÍÏÑr=*"ú*"F6ß+Q!»;¸aPLÊ*¼yËà #Èc9~—¡K`q|¶ª*Ì:µrѦ‡—"¥Š”oo1ãë%0Úlb[Â+Ó°¡¿A°`KÚLHUŠ"…ïº5é èfÆ…˜-„¯»¥Q]ÆÚ{eT!LìéÙºÅs1E‹žcB\èqd<&ÿ2¹ÁhæËº–’yôãSÿ‰di JÅ¥™¼óÄ›i¢÷šêϾO·õ Z=õ±úÓsäV#ýÄRígÑŠR¯°ƒ#qDߢy÷ÃkF/ý7eÝòkõ–IáÉÞ”!-QŠZ²§ó…¨b?´œüøÚy!”\ —aT^@ž.ìov`c¯ ^'OuãÖPBºd87n§åmµdÈêcáFPiØL)m“÷ì¿^M¼S÷”3¥Ô5tìý¡F¼*íŒÔÁh_!pÞâHÑÒ0»á4sËáþñm—«ç2™ÓeÊÊÕGWx3_ÇnZöNO?âç½™ìG¼ûŽcDuº ðv—<ê]K©Ë¼vÅО%ªJ bà„Fû‹ã8 ¦@¹ëþz½$OÄÆEWpNh¦”¶.y¼ú‰Û|á»q¯-}ìõ"±žä j›ßXù±+ß­ ¶Ú¢Ë$ÝcÒO±†ÜXnÍI -'š?[7ª0eÞ<»QôÛ2 Rލnu‰µ /Øx>as&c¼Õº™­­èµ=¨×ÿV%éÊn ™ùæ¾~ùÓO$Ƙi„—õØáÍsøu¶Èjæ »ƒŸb¾0´»feæÜdŸ{Áõ„Îä çõ'›$eoyÙ¿À¹÷µ@mK;9ž f5ZÓB±t-èZÙî¾l›8;žDÕrB> »¹å‰]4%|£R ¹HvAy{D_–@‡N½ÙlTV4Øl±9Æ­3]âú «º‡Í-›„‚Ò£&[jôžlÛÝ|0ù›b°Î&„G4žcp¡'”4UÊk«2»\I™t‡I½¯aY¢—Ø&šúXW‚{‹V,mÛs¹6ÏèÙ^ÏXQoó÷Ëzÿ`^?¸¡ë½®Tù1ÆìrÄ~]FŸþ"Þ)cŽçÄOC£ó|ÔOï¢tªF£ 'Û‡Ås »Üq;¡ñÞæ{íZ^Ê…`¡úZ }ÝúYµãÛëï´{¦ù úMúŽ]¸s\“ ¢7b• v©×UôÇ!ÔhÆ=®"z¹ ŠÂŸg²†úÏä]†)§+ßË›Ý~´ôéë>EÒ$aÌ>+m|V06 ¥]jm_ ɱ'‹](Q‡kõš¸2?41ÚŽKp­“È›HçëF{ÿè¹ÒXV>ñHÓ 1`~ûÊ&øžE¯+í³TÆHAæÜe†~縣о&+MýäÊïí]qRÒ8§À1u_ÑUº”]BDóç aN’o±0>F—gùÞþëçO?­¹¥ß_'™–fM@n¾Ž=ÿ¤E[øô^ü¸$y€ápƒ¸c¼›„FfI•±cQ‹° úÌjéÅä‚ð¾Ì[Ú/»ß›Z`QQùoRòwÈ8ÜjTqÕ´P"I—°+åR_ÙFKN÷3ÁÆ(oïºü%°L5$åféh÷01Ê%_ŠÖõK뺡oÁ-bz‘Ê´ ˽BÄJ]„Þ²ÞQ32s÷åç…¬¨ù4- ·å[#^ç _ý6€ë'b23>©ÍÍï‘|'JD¢°úÔ„ö̰Ÿ!Ò “>(ùòBG‘LµÊÞN‘Ž&ªå5 JÜ=êîá>ßéO'CàB"ð¦ÃuøªÄt{‚ÞI¹Ns¼*÷>§Qf+³óz6Ʊ^©ó”Y£œ,‘7ºÈ$¾aÊW|=Í"pÒX ìÂñÐûÚÓ*@½y–ÛY¯`“ýÉnߎ¬³—?.Á‹L§@ñ™Ͳ4J·ZA¹SúRjzäzœ¨CPçDh^â kOááêûΦj¾rê‹uÍY˜À66³& ±‹ø%†ùZ5j}Uè zÂP;wßg:„m…FqŒqQðëª;-„Xh`½W×ôí9kë¤.ü·y—“—­ vÃx, ?ƒLÎØ`HõŸhÊ÷Iõýá!’BHê³ÈÒºDé!{Ë·O<ƒ?!f>qÓH3ùbNÕë’xÏcÀž±ª/zõ] ºnKd™A/…Þ(­}¢OˆàB zR/Îzt§®<7G‹úá8ͳnjEZÜTµŒañƱ¡8«ÕÙþ}“P¼,¤$güI…òx8ÄnÙã@ûÒËÙ'4È·°Gn¦N-ª˜'À¬lƶµ¤K˜õ,~ö\¥‡'qV§Ö´a>ùI&Kw¹“°ÿÓäx;àéÉæ‡K»óD_¦ðžÓKFeÇDå ΰŒ[,‘8Üe]èØGÕ„„,ø´§Lå:åU>õÎ÷<øPA‹K‚&´·äëÕp' -Ë"ªìÜa÷Áµà±e9$ݳ=Yµæûj­+ÛúÆ¥š½°0KT54d€w˜òû}jŒ¨˜ä­P}tb§Šn-¯b¾â0 ,§T^aSiQå¦ÝM¿]H ý ­ƒáã¯þ…ý¤‹ýÞ¦ŸÜ'BÀ,-‰ìa¹’GÔ½í¼~ør¨ê]ñ+l`FÖ«Z•Õ”‹TtJ¢î틞59ÊLû6*p…ˆ÷æR÷…õq+±öd*—ExÉ]–‡gC[¡wUi5;ßé4¢åÞ½µ•!5žb‚'ò“|@ç+#H‡RH”hÅè¸Þ6µ¿°è›÷mbU¶ÛÜئF´ÐÁ¥x÷­7Ì2×çåå xPç²IÊFMZ±AX±Y6+kpš%Ó’(ºOC†/euVp~Z?3ªe@H½tÀŠ4o5¯&Ï"³ë7©_‘òÛøc^Ëwìµ<‰ÒðÀ¹[y99Ø…ØBÜøc‡vć¦r8¿³KMÞz9]® 7ðoÜ‹~<ˆÂ'äˆxï°”àMƒƒÎÞ%®’¨.ðˆ<ùùÞÁB”þLu´ÿû ·¿V{ü•ÔÑ­\‹ž‘èà6Ï1r-VmfFðñºûr‰6n;ZC«þ]B¬Ñ² YžÔCy‰·±ÜôÎÑ=ÞSSÙ/¿¢Þ-a:Pš­+]c˲ÝF<ôóóN·]Û{ùá3è9Oˆ*üÐ#ßp30cæðïÉlˆïlÀMQÁ†ûßa¸·H.Kjš÷úq§(ë?ڣ̇|¿‡d‰FJÚöaØ™t—dd£´Lk^¶\2&çÖæS'lqk*8j]:uH"×Ù…ñÏþä4HK“ºÏ¹…Q¯æ=ñÓüG’ ì3båWŠöúêCò—@²(SÙe·ø`L伞~Ô÷‰JòEï`8q;C;÷ˆ~ݪ¹ÔjMâ,i/®…®n-¸`’…]–¦*rN<ñã`ÙY I ŽcW½â?(Ìï«Ã+b$abr¶¥õrà™‘ìˆ¡‰=ƔЎT±.û0ˆå6û;:³ðZåèéæô—˜ÈÞƒ òíá.xŽó‡…lߘä%í0¿aãšEõ)¿øùµÿ¶:W µ_iÛ˜®¡­Ú••Èø9Ëz =Ó\f"tqšMÖçc ¸p3Ç4a3{@×vZzü8§ *3üÓÌ·~F¥0‹òÂøKűҠ‰c‘KÎIª L°\ö™|Ún’7Wc!«õâõ§¾¼–vš:Šs€ªÒ»ášU9â݃Òßt0æ’nX¥çxƒ®>ŵ?aF“íd\05Þw$ ¹}Vkì4‰E>ó¸â,W"&Gjƒà$£‘g1ŒJ ;¶/: -Yõ©†µÏ ó=VšÝ½KŒ4]ί¹I+¨ñµý‘yõ݃ŠR9¤†a¶¡¤—Óài‘ê/ûêôÍkF0T,”{]wë—‡õ`b¿`ݲ×ðª yò¸k¯{D"¿v5äë‹çÖ ñ‘F‹ö«k¿hyÁ›m“YÏ5Š(¬Fˆ3¹ ÜÅvaâ•·+‹ë?¿ps WßÙF¢q%=sÓš£æÁð€‘|óé~)ñ´¼âUymh„‡¤$'áFLˆrQ:'„!sx_‘ WõØ­콨‹RCn¶mczk”6rs|¾jYc¸Rlî-Ð,W4º?qD÷kÖp;^¡Ò³4$Ò~ý°=e®âmï)p”“íNʘ!cd›Êá†ýxöäºèP‹çÜ B:AÅ`Úyù¡oš¤„ÖÑLzÏ”•Ý_ú«½œ(ôÞ»zMXÏNnÍ_Mæ‚E’ÿÀPØnä†åJNäÒW~»Ø¾!b;è“”☢=àb¼7.*úòepïÚ²’µàKò1þ×Ä¥_¤f8¿6G’‹z¯x¬ì<¼€¨(žt]Žbrü+-œ9ƒ‹j—^Z¸yL±ïv‰$„+ðrÓf$?RBÁ¾yÌJ8.h³ô¬ÑtDx«6u(Pš·½ )P!¯™ëºÐÒðÒÏ玆D‚ݵ6"Rc–\1ÎÀ”1CO,úZ›‚NÁË`ôš¡C k_®VµuÄVŒ-ŽÚrÂøöµst„”7×cïÁ¹-Á†1zÂQ:ÓïgÈmZ3qù‰;,VWÕ!¤U3\§&ž‘^€ŒF›™y ŠœÁ©@üƼØ•»6±Œ‡#£Œ!®Äç6RV ==ÒÖ”Çäïu‘Ò¢et<‡¢Pk.Q1Ÿt~\¸œiI¡îKÏîHâ ×¥ºÜSòê§ Û*iXå…”OM43 T#{ï>%îÊénÐ …8+^9#eùNaݬN ›ôR¤»fO![«<¥r¹ÿ|YsäPÞ21¤/úÖÓ m5-ÔB qC›tuª`ðФ«¼r¬½å‘ʉ…cáM)Z»šŠxtÂf'Ú?p“ºp;­é…°ú^Î*s/ØnSNväV¢¼!›C0‘"d1Xa;p¼Êr<`’[ ¢Z×x4ý­hBÜVÅcæã¬Téœo1BúZ7Þ FÄ:àŠ!æÍ;°¹¸a±cqs8ÒX"ž©*ÊØù=U_QЧÍ5ÍѾÍ÷‰I±ô“ŽaLcóLŒNtvÆx7žSn‚ËüqY u…T܇Â2ÀŸÙ:γ’Zõà£ö)ÿ«U*ôÕYvžøàF.<7¿t8ý| ˜Î Ïx‘Ê›A 'ü-›¾a÷ÏfDoÜ-e²¶$Ç´^®‚YŽäy‰Gü@O©X<22¹~žFµr§A¤NíUÌÙM^V3ì½Ü5åsÎvQû„`È~Iça?bŽ@!N8~ÇÞãjµþµ4»Šêʹ' sú6þYøHðºcÙ+ŽôÃ3ô óŒ” *ú¹;×v-_R’'e&–8ÚÚ)„ý¢˜HÓÒ ñ©Å;iëÈ&£sÀ[üÒ‘6ùD<ç 6ÊûÆÄ¤}7¬M ×rSb&Å^ –yC‘ ž,Ýqm,oì÷LÌÎî…=¿‚e–üÈõR²k+ÿî‚Uš]){ÊW(½ú‡øûÇܽUBß›ÝïL…‹–k^’Iš»¶ŠÔ|hFR"˜ŸAMÎÛ! V’ß ù’Ì€ÙÚmG«?gd›áW éË…øÚå`¦äprz©ÀàšvÇlÄ>ÇC-.^âxe/zäÅTÁ¾x:©† G ®7Î\L\³Í+`ñå™lj~ÌÝÁ'>`aéæ‘ëžpáQA]Ý{Êö4(š+I>wã2w~ú›l ŵ~A˜¹ˆþ#a쉘ô‡%Îù£Âoõ„÷1ŽMîƒû¬¯:-/Õé )J¸¥WyÇ­ •¿2`Bö Ÿžâ7?çÚI 7gd!D.YPá«$¶ŽëHÍ}~‚J¯Iu¤Z" juM;hE•[^‡užÍžØõþ¢t˹ ×̳‡ÊO•Ø‚hK ˜ö,Á=- ÷‡k——Ä€@Æd.%¼Ob–[ž™”wväQ~×õ\^8Ù4ÀªÃüml©ZáR¼MþQÞ§X,ž Úy%ô–ŽåKJ–rÝò㮎擔‰¼zGqq±»)áVèSw†A³$<\ÔKf«QpKóM¹½ÑÒÀšÊ5sÓ“_¥oí¥påõ[ÇþVrö¥åP<”wVlnÏô®¦“#ò=9ÅMluPÏëzVJâ7‘Ge>õË¢Ž>Õý²ˆCÄÑúm6ºÙáAïgšSŒ/ÂÇÅ2Ã_ÙfN}ŠËM¬c¡_\†Ê *“øy'ý­)IÈL§àÈeßÑŠ˜}%_Ë79#³MùnBVó))n°%|;Âýhßê" À2Iï@^;±_ª}ë>ˆŠ½0iwÈ|-4cJòNµ6ç( øm4½öÄb’b ܼÙnÀÓ~Y;ÎP;föLÕYB… `!¾'â-)rO]Šò–>¹;6%u݉ÌÁº§ªMïQ±Ne9Jþ íd—ŸÆ8l°Ê|8°>È´[æ›rNŽ÷ƒtYm[®ílšF[&ìCÖ{¸™ZgA.ÏR<ÀtbjRGâW„*ŠÞúÊO#ÔU!­Ÿ¢—~tjT+Wš»2Á˜íI{(R ÎqPÎVEc¥7Ñ+à^œ?|éƒ25dåé9&SþàPì*Üy`ÇßõÓ3ü³R¤4mdŒÕñ#§öÌmL ›5s$L ÏÅÈ(7‡1ÍE€uí†TUfñ·œ ÿÖŸN_•6$…à(%‹ŠÎ­œºCQódû»æ®ë‡1ÊEǽn·%9ôõB Û‚+RÁ7Øq%5êö2 Š+ußÙÆ»•Ë~í'ÝttŸ¿á⯙7mYè {Cà¹Ú@¡÷ qÞô•IèìÅõËYoÎÖ ¢mÙ·—Ú!Žkàã{F_\´î¼ ¹‘³`Âå<3цe“W÷IpÔYÜÏ[ Ã;t><½$X¦µžû‹u¦ÚµTCÓ‰‘:Íó ñw…lõï""°›¥6ÄL~ë¬å—sî…«)Ÿé ¬ÏIæþ³A)u0æ+v"h÷n;â•;‚!Þ#yo³Yjý·ÜxÕЗC«i™ûVPC$6~çUTŽ4 9"o'Táà±?Ÿå0Æ;2 Ê~‡ßáÂX!–-Lt™§a˜Ø'p‘ŸÜh{–äܶˆÌ<ÎHåá«S_¥$WjiRœYµäcÓ»`dL·u½-–.éŒJ–CgâEh—:˜‘št°æå_Ç"Vé’˜d+¯rküáæ²qÇßðþèówœ‘„âZ8QbÉÁöˆDwM?tzduÊÖ6€úÙBïúÛ*¡›ø©+e#¨áÒ·J·£.þ²×Ç¢¢•€çG:‰ºé7&™k¼5 £3üˆhŸI ðž]”“b+ü\ÕUKÝédQÇ!Û QQû¾´©±:ñïGNÀ8yíÐ9×ÁVwèŽp}Jo„mßX7—¶•·F:T™€¢#!6šÃ¼ÄçE ™õÆË:g ×øÊ&[ Çj6‡²íΠ˜ÚÑêDð£ûz~ŸÕEq,Ž£˜ó1ÚNºò¶ÞáØé“•õÁåE i6ÔñIÓºDc+Æ ¸¹$¤¹>j6¥äPÓòjnÜ•ê}0ByÕhËÖ:ê4âˆt¬ïäU…¾vÓåÄÖèN6¦»çéD¬K]ñ T~Èfë7²Á_f¡!ú2„kÈkrÓnû½æ«™þÖ`Ã}h`³@Ôe·ýè Cº2ÍV€ºpò'Õ×Nb‚©P¼æO‹¡©4(ØuÃ|:gžY‡ÂóR‘‚~Q(¶ÛaKöh±Ñ¯î+Áá´ÇŸâ3æoxƒ0‘µSÏ;$®£t¤·ÒõÐgk=÷Gß%žù6'axúå‹¶_Ú†x¹ÒN¸_2E]º{·¼U&N†Åõ·n7+›Êr[kNá=»£x (qûŒ³pðÇŽmöÚÜ“ôjmX"¾Ü%¤Ñ\×<ÈCB½³ä Z'ÓFL| BÑßl§Ê©Jj:ÊÚÏš h¼À×:ËH¼›¨_’ô"“ö¨€­¨Ýj: ÕPѲ«wï:£©^öA€¿:bº˜#Öûø±ÛkS“€Œüyü>ðûX—©ß¢]Yzã4'ÁÉJd©Â[ËÝÜø}R’¯íP_Õñ)õ—™3†éÙicP*£•J·OàÌÊÅut!²&³…Lc=ä<³YÚš£ØñmÀ.+QžÞËC:• U¯ë?\™Þt`vó¿q¤º—§²)íP³Øf izýpóéQ÷†S~Hj[z"kÏØLsÓ¯rOßû~íñãÌï[´Ì&×Á&ÉÓC¡lqÿ]jÕ*{­èÜwØZz¾‡zÞköS¤còà=ïñ¦nR Rzå*Î|I¿ùÃ4‰nÂò[pØøEjËó |tÅãñÀAÈÃ6¤„|ÙÞ-Ù¬m^Þ%õÙ;?ˆ®z¯’/Rí,lœ½ùŸÐé°>@à4ø[œÌ° f Á>SXgñ3É[6Àôœ3K$ߎ‡Uk§9#ÊcK*Ááe­Í!4t©5E@I|5dy•g«˜È+­àƒÚŸà–5ü©3ËØ^©¸%0CÕ¯©†‡¨†B)0>7Ÿ<éy‰$½l¶‚`Ũ[Ë+jØ~—¬ æµþ°Þ.pnä%¦Ñd°+÷£Q]Í ùPý[3‰×Ø{γp½ÊÔpØàºˆ@œ4ª±(—‡y[ò/އܯ%¾Ó/Õ¢A«ëÊuV;ÑBüwIÃL2?4$p ûwœ‰\÷'µë&8¤ÙBS)t“6úºÉ¼ðZ¬1gÀF`ŸmPWªTð65/ùåÔ ÉGúÅ0ñQ¸!ÀGÁ!hì½j'”µ®8ß,©§þJÔEgÚImó¤ì§}zJu"¸\ÓòÔ9š‰“Ìn>vÏaàF˜8„%­ö"Ta¹ƒÎV<¦&±dü¾>Þep æX8µ$áÏKÜÐÏDh,ᆓDÚ&ÉÀã ý ý9 ã¾TY™!ãt>ü[øÃ _¹?¸;†Ÿ· ÆbçÒ΃³fãÜnú€ò.üKD¤±`TîÚ:?,BŒÖIøA©“ŒˆÀXg+MÕ‘ºè ép ’áÛˆ}«6KÎØX³å,•”5¶$- A(=Ó/$(Sd߆yµê6Ä}¹÷‰¼u\ÌÐä{^²~ŽKdÇŽ  hD]N"­ìÞ«Jyɇ¡uHØ´èÓ7~ßk m0 kÎÐA&eíóÇ]Eæ¢^®OͺN E÷OÙß7ؼÀšx ºÑó—Kõ¢‹4 ó38Bh1 ãK-.¥/mð—?ÆÏŽÓ æÈ·î°A”½~*W*.åg6ô,g¢í ®b¾é_цGVJúÐV§öi@Ó<µÑñ°¯P¿~ÍWZ9r£„?·¸C-U„Ò» T–¥Ž°YéC*´ËƒVÏ~X1b†ÿ@ÿ„ߤÒCT¶Z“,Ùž÷Jwæu’dòÇO§+M²OÇVZx²?hÔ4ó£GbÑ>¨rêc‰ÅL «/0¼ÿr—2s*µ’ŠN±”s¯sþUk:¬pn<58Ï×:Ñ…ˆn¢:pÿÕA4yÞ9 zjçHzDºT^oEù æ1YTxáÇçó tÔÇŸ¤¯Aˆqw"»øÑBÙ‡ÁûDm”ëÒœ3ŸEäZ0 G<™ÈQÀ1¼FTÔ½ ¬¿£%¹(1ï\“ó£nßZê>ÛªÐeeU˜½=0òæñ&ªk ;…[kdîzŽÂ¤G› àµÔ×®xëmj—Hͺ\‡f\ÝŒh•Œñ<ŸçÖûw (!Û¡A Ü@p·†tDÇÙöoâÔQ‘ÊMß•ÁŸt6sRîðZ¬â󊡲¬†L ´áaç½¾æUtÔgÂh9GCÑ­g$"hCŽ/ WœÊ`л@ M"#ÒÞ¤GA¥R†$X#@†¨«$’ÜÚå€Þ—”¦ŽaªŽrÌÛ¬/U:Ã|tªYu®›*dûÞÿÍ{š=먙-<˜¶ à+òÑݺęD¹ýêéÜé1V’Ëêce½K”HKf±¬Có ý+ã:ûƒÎÉÖáºZŸM}w2l œHmæFM­ë†–aЛ«VZE‹¤½xÒCù¦!鱌ñŸ1ãžs`á‹Â”„WWIئ6éxÏå"KÛC^s^¦XºFçðšÂΞ”e¹[už-¸÷lW°³ Þ2ß«Ü-ëèë~wÉÓWå1n ߟ›à¦r»±&®>[„ƒT»´Å4KÍp`gf¤kÙ¬3*ûÔÓ¬©6‡ÿÍkÌø§S«”Ú–*Ѿ®yºª+À¶ÓÆ+ôáSÌšêÔ²'Zf²¦ ¥üm9ÿxb³7¥ø¤yCî gFG mxy]H«µhl‘+=CøæÈ/t;ß²XxâåS"= |d©´wÍ»àO§¶½„Ëë%ä›ÈÄ´!>gwæK]—Mŵ58×ïÂoa8`“h+vàk“¼^:e 10¬æp†QnnÑÆ N–«ú5‡Þ–Gà>™×AB­±ð”(µF|¥üɃÇéuÛ[zaog;”ãEæÚÔ)Áâ͇þ¡CÕ>|U žžÈ?¬E°&<øœSlоQ.üõ›4ûE°6«eÅ<Î;Ö57Œ æù§Z-º–wú¶yŠT9¯‰µˆºµU@/ø¸”zfJó æ -™Lvùš=›Èà=G€åÖ¨KVJñ¶?ÝËÐ~Ëj3}Ûï‰ÖËõ³ô/kµ,&Xüxü³wàÙýZ¥Pã5lHk™Z¢Ö`ÆœÃ2L¹^•?\§§/ .gz0žAWuùR°À|´í%ËÓØçò®¤F€w–è?”†ÑÅ´il­E<ª¾ÅšVz«ÒMÑSøAË$Ù±TÊÖç‡SñÃøW¾’1º-¯/À;ØÌ8?d8î× ”‘/ÒV=CHë 5ÄÛ–q"Q–ž¨÷—ZµÚZÌòJÖT‚à»ß6µ¨$ý´ªÎYû…vY_»ÒdÄ“n?èܰjõà¬~ôÎ=>Òze}»Üù,³’ÊØSÌêÃÚ€ DW”Ýæ>g/Y›i‰÷ààN¢­]Ÿ ÷ãK©Qªó)ÐP ©)ýÞ`Âí8iÖ»ëÌñO»á6·y›yØŠÔFk%ÿÎHrºE~¿‘P¬gN¸HXØÔ˜Ô™I8«™ib§~k´§ˆ|NÀ¬ Öf§ŸDó ¦¨±v`²·OWXA‡û3É[O}êÔàYAº—ftînwƒS»›-íßz%-¢˜ i–jKBáñQ¹ Ûã{’à ßá„âVyê?æ[®;’ÐxNá1%‡ª–4g„5Žèk&¨“Û -FÍ®Ë|B*až¾k¨yëÞ>zt•&Ä7¼H*…¢ÔQ9#¬©qKk&Xó}jkYS†  <»Ü¹ËqüFà#V8 .æî2¯D™éª³´¯IŽ,ý· ÄÖÀ|õï;ã&³"ŨšaWDAFÉeüGÊ?ï ÙØqÏýïÊ«„Z]ƒÛ¸â‘?úPÔ¾Où!õSÙ‹Ygš“ö}vãÑ<¤\Ï,lÛ(ÚyÂ`ª“¸½bPa»êò°‘ÌÀcÅ™7x„ðv‡¨éôpx][ïŠèš£JB0/‡FFCýÓ}c‡é ‡ŒwU‘(iMű€$R‘ókž·òt‘ÜHn\YqÌM ZÚXkH 2ž|»‘r­ÓÕ̧ôI4Ôzdó­w PÊÅÃ@â‹Â䂪\"¯_Ûz°¢Qz§6üy –öil¡`tçË+ -ph°®Oi„’Gi^MlÉ"è;‡….óD©kÂ$Nî—}ƒ@Äø áRMÛx>ó»íàOÎÅZÀ±¤ù»ƒ¾*ºü Öë Eµ‹8.¬¬ÛkÞ~c+úâI³¬=<ÊÑXbsú(”8Y©Þ•&)Œå 5AÉ2ɾä3¬Oú›™È.µùµZ‚¯Ã"b‰ê¢O³Ö#ÉsåL;Ï”>·¢fÚzVrëœ\_ð‰l&µ?y/ÕØ ;ÅuX뢫£c—È(Þ©½ºÖ GDº†ri·«ßfÏq+¼úŸËÓ¦oÚpc<@.EùÐeÊ×$5 ô'–Ôgp÷Hæµ’%1õeõ(æ!›˜Í|z>¥HH-¡ß.'Ò`¹Û.HOÖÝX[Rà™¦ÎüÖ6lÜV`^úþŸ¯%PÚÊà©N.¹÷T–Ϧ&ì tËXy{ÙŒžçò±!Ø5±Á^9ó’HEx&3ô8¸o$A-Á‚»¶&ç>ø+‘è¡76k&ìë;´.)ÿ×Sк¨©ø~I,6=>Dƒ½ÖÜcL‹fFœåÒºÁkQ_3FýÖ‘’[Ô³çÜâ—ÜàPÖ½èÁÑ&µ«)mädø’pŒú{wt^ÉÖî¶/F<+Ò¹);Ó<ók@1/|ùÀ~Ðúz`˜v­jgD¤°4 ¾~TCz¢d¬Å´.‘JŽÃìsŽ/.ƒ‰7!³G¸Ç¢¡¾3FzZÝ~±BøÎé Ê@\'„4CiÆ·¥š˜)G\bv¼?SbbЙîo€ÀÝN@€tÑØØOáIÆêÅPCÞ³‡ê§yÖ&>¹G¸ßKÍÉyó¿ßk“ñÉ<ÐB\ġۅ‡ôÉÝ¡îôZý.V$Ù“p.H›ø«iÔzXç~Ø›` eÔÊD&‹Õ*LêX£øPæFP³‡ž…¸×Û›éqÌ‡Í z#PÖt?²Õ½zÒô× í‹àgMºç—„®[—zýXóGH‡¯å˜¦Ỹì¯B­rÐèáX‰ëÙІ0…'9†r*•( Îö ›ÂõŠ{7)ßß]–‡”S.éÐeÂIkŒèü`/³¬sD)‘¿Á+“$§lXdŠÙ1v+tVP šÁkÑ&‡Š Ô_ÊjØË¢Ü%AöÐb¿6˜Ð幯dÏO+-홺Fc¼ä»Áxƒ@åð—’Û‡sv­¦e¸àv°B•V Á®¡î‰éøXññÀR´­mFËÑÆ,"™1Â(ŒÏÔÿEÓñ_áîs„RrÈÚÝ^ÍwÌ ÎÈèsNœI¸pøõ/4¥ ù ªª—2b'±yŠkÙŠñÆ<·×d¦€Í„ù˜7$Û€ 'alˆÀAéÒ–}Þú÷«ž3‹·žšñÀßÍ8¾o¾u³SøÐÚ‚¯MŦœ‘Êá<¿Dô]é}æéœ‘DUæxsÈý)}è­ëç}“ ŒŠÇæ;¤H]"€ÆÜoØÐèU¶ò9¡è𠋅O1÷(=LcÔÔ÷·‹E²ÕÆ·Ž‰UNU Š­ë¶¨®MùˆõD_ñkTÙnv‰ÖäÕ)lé­=C4–˜ÇÅÿ²–ªßt96â c[Ñ,‘ Uf»gÖ8äL‡wÎ+õUÿiž.†fEj$ËU~kŸ²Ïâ q'ìc± úªßœ _tˆè6ô>Yïe½ë«ú3¨œ½¡§³§³Á³t¯}l&3Dá-ÞJ.j"Q;þ³¸|½³ Hý•9œÒ4t{lXZ(¥¥oDGSuĘÈ8ôÌn6f+…å]èý(±M?ßZª’´_M”’o Âa'¨Ü=9™v0?Éæ¬'lÝ!^¼­Ý­»#»ŒWAÊÑ"nÉÖW¦­-6¬ËŠEi#Yçé~ä…ª0_|ÕÓ¤Z£H PaòDp»µpñÈ´·ŽŸ¦þÉ”óíº¢pîWÑX ¥Þ¸;6^<ÑÒ2j…æJ#À ÔÙ±<¢P.÷sQõÜÈ©3Í«YWBƒþé œK.¬òþÀÉ• ðN3.Å„¶‹!VGŸ6ñ´PÅl衎w?†m¶ÀØÛJ'=|Ù¸7:iˆË;ÑŒâ…s8ŽàWo‰¹uˆþÔã<™‰setÔ–ù¾¿"&.'ÿÊ2‡:Dÿ|gð ÷]À;'”êèáw&iþ„`ÉA©ó@ÆZpøZõj¸”Пfíh‰2 Ç}ªÚëv®ÅÇÀÝçÅ‚TË~'D öïAuÍi@NJzĽwÄ¿«}÷„¼'Ü<-Ä­Â7HÔ04¶÷Ò'á¯ÇÛø©m3ÐMFܽ6Ä;ºC¼èl’ÜÈ>·ÊÁýȧ“—Û±ª÷åáÁ¨%ݼ’”ìq{gÅáÎøÚ† zZ³1¡ª Üæ$ÿùw(@S—T â~o¹m 7ÅbD*:~O°íÚ¸gY8r–¢“|AȰ.Ût,‰|ènCÛƒËÛŠü©„Ó€^\ “§Ê• Eê¨çӬΰoE8É•ÙÑf6qP·Û Ȇ½UŠ>5¿Jv‚It€›çq5(S)'x$ˆß®¦5ÂîÝBÏy8r Üu/ºŠ&žÀ'åÕTÒ)ÏUã’G×:A÷:G ½_ÊD•̱rç3Òãz´ªñHÇßècƒåg‡éÖ:Zz¦ëíIÉÂÀ þB3’Ïò1®Txé©•—û˜!é~é±äMíµ›¿ÈÝ#²úõÔ5P<[Ý&ñÑL©\«¦*å_=>>ûr©é)¨'&Ÿßâð¢Ï°ê€äœÖ0þŽ©^æ»ðr®ƒL¹Ã6ìïÀVø¶‹/šJÔq”3¦~n£ƒÉƒSS\²&ï/š¹süë‘%Éðø5ùY/}É‘õßĦ,ut¿|{—áÇK¶€ò¾Î!—ÈÊk¹öàMš`{BÆjèvNîI‡zZ_,’ÿ;ç0×B˜*^”¼Žb*¡Á¡S¹˜r°.=$ÑØ—1¼Êäßçù"‰C7A»,a*Ã÷‘±³ p4ö¦Ò²Á'Ó ÷¿_,Á J &áYo±(M¸®ì^KH(&Bîhr$m… ´Y×s³Öÿ@½Gð›×Flj•{ ¦mÒ«–-0]œ’¾Ù2u.Ã40ÄQ8—%/¹ÊÐ9Â~ûHò͵=iŒ³ío&=égcíGÛro`ZÀDÐätg׎Á”„ŒCÜ•`äkF$ó@°œ;ÞX†h0¨k¡¿›.ÆVoî¬ËŠ͉ىÀ™"õ2jÉOEÔL·À ô,5TKB8-áè™2óNU¡U詊£dÉú´4qMß1•žç—üoµÇh€¢t¬¯ª gCp–'^_ªŽ¿‰$×aAžî)÷‡”m ɈÃì?fm_yœÛëÂŒk]/îcZƒc{s«*È„èµÇ±õïKd½ ˜`™û^I1¹I¥‹ß¸ØrÞ!Ç‚ ñ“—ÛÿϘž@¹ãy­ûÛÕÞÍ]ÏÅ¿¥å±ÀgØð¾T¯ÝÜÛòdT¡¼àž DUÔ™\y jùådáÞj`&œ—~et|˜0,B€vì|¿à×¥òo÷ËP 1t:´Ýüîx£ÕBÓÒ[ý#Ätðx*&7¶%ë;—ýÛ°'™€øÕŠúÙ@ËÀÑàocm å£6·ëõà™ê$ò:\ÆŠÎ/Ì)Àu:aHw'øJ°§?ÙÄ:¦3ðÉa4I}ÏK0哎õúkÏJ§µ->pù9iå#÷’tE•Æ–ÔLÖ7äƒÍ‹Gšè£¦D$«s–Ê€5𬿻”7§d÷tˆÜ€E§e±&z/r°œÏ‘[—«ý\# ³àéM€p:6ûˈد¬í2W}- Ñ?˜Eƒæ—ó㹃åvhªÚµ…Y1ó\`S| >Òð- &Q ƒ‘Câ&„ý+-æÎØCÞ¥QtÏ—Í{/ÛR1ßüÜËÔ¡<ÌïÔ¡óЧþ øµ¡–¾B©!‚]0&<õmðq¤'JŠïj}c*mÚ' /ß“µhñ'`Ÿ¤uõa˜C´×{u Œš€¸t¶øÏ~£ñü¦ æ ÌüƒwjÂQ,8!ÂÓÑ€*šhªXßÈÂsVðôÎÞ³¿HpcWFè²»Z%Î]ÇQÇ-_xËó53ëV¤mBYcŠÔ5ê±pKŒ@4Ub#Ý7ŽE’?&}$\Ū´Í,A†åïE§™½c*ä‹ e³ùŸüCŸ³uADï86:c’nïʱø·\äÚº8„‡ê?µû/G²[+‚¤VÉ[§ì&s€ m4/ÄhÛÚ˜¦n^ɆÕTýS}ðWÒc ‘ŠqÞôzS±Ú~Ÿ+{~À3nÏ@;@~^Ð2Ôƒý¬võûîçŸî,Ëúå;–L^%ƒr¼°S™eÅ ñnˆý\ÁŒuDÛUç‚3Ô5~<*ûHc·WP'r“¬í93 êÑ¥mwÄÇö&È›ÊäÂNm÷rëÇ\=”F—’ïm ·ñbÁ ‘ší/Ö9ɽ$’Q¯”Ç8!dîH¢ E ÚA »Œ~ ÿ˜#åh~ ‹_'a*ÑÞúĬ…ý‘8wíD±Ä–9+xzˆ¢´ŸèÊ÷›vͦ,RO'”]ïaÓcªSær¡©;¶X ‘·Øƒéna¤'IZˆ‘ Ý^B”§«Êx…ÙvShEoª ÛŠv©ãÇÉ”ÁùlgD4Å—. Ë·²¤BM9@ƒXmÛ6 TI«'ð”m`†`j@ Ék4 ¦MªÍ€Å1·ë“¯Ö2­ŽÀ´³©fÄk·Q›¤›Î–oœÌOæû/_zÒjÖL!\ÓoÚdH €xÔ_lÎ:‡ÞèŒÈ7,ÑÕ×=…›J¨Óª)Ìx¨—ØRÍT{12vj¬ì£ñb•„n·ó;D»Ã´4[Dc)4˜ŸYàü†Û•ìÚÛ˜3]`Ñ®«õÕß‹:…¾U\?@Ϩh[ï@Ø€øldV“w*±“®›4›ø”Ž?ß g»ÂÜíYãsÔµ<ÂMc™ª!àîýҥ䵲÷aËáÜõÈ}Ù‡Õö¤ó—ÚHÇ7§g¼·†~ìÔö‡o ¬ì3òx0ý£>ë!‡{I3êÊG˜·úŸœÁÍ€¶ø¤(yøªÿ#8rËŽ>6´dáÆÛù:5øì½ÏOÛ½®K¯«xCFƒä1ç.¸zÅ©;ÏÇù³d˜\f“ ƒƒlæR†¾÷D Fç[4­q´ÎªMx®á­¾òÈŸK¼sõ[%Úm;ä #½7(eнк`D/:./âXv9ר½ƒÁ\æ +—[sHEçÓ—UwéÃ]Q¨Ä‰Ò_F`º^³[«N}e¹dÈçHÿäPáÍ/Úå÷¶ù|±£öûc¢Hª1(–±›? h‰t _#˜JeoÁµ(Y}=‹ZϧƒÚ¨^®ª¼|n¾§¸¼U2¯M»eE%Cã*úÃ{^Â9\®ã]„­)‚ø¸ ¾Ê»º¦O‰óÌm9Áq®qÉÈí¡ÁàljcÅ#9†×áþLn­ê-þÿ#,â ]'ÒíÌÄÒá/WANEeûI²3~çì·qô¦…jÁ¦è…,w(À´íF'Gêi ý°lÅ*L ›,ˆ2C)âºò!x¦H” ‚ßúäš0¦¸¯áIñÝãÇÐŽFÚäÞÖŸ¦9ò†ã Ö”`Î;c€öcój  Ê¨AëÔ:¶îŸ(“ª%Å9îy;¬B¯‚2Ot0<ÄÕÆPV‘næ§çƒ¿5W×WÓ^¬›ì俇Í⋞ö¼*£œÈÀžC¾&aKÓˆ‘íaNÊò' ¹°ïw­ã+SÔÛ¿l¯Û0óZÞM‘Ðè u‘Øã-zXG3kb-¨‡â›Ó½\Ð;° L tôbênPOÉÝJµÈ_“º”öT1¿m©0A€vJ[câÖ6DOÉL½>f1ˆ&êÚ›wAêA afº/½L’ÒwJ–Ë_ºó¤Û˜›}ª²ˆN| ã(ãµAC‹ª‹hr=Ú+ˆ[³L6‚^çy„›ú ²¾Z<0ðÁ‘,!pjÁ·¹Í%;õuíJ7Â(›>ƒ,D¿’¨ o]ªgV[2‰­q‘˜²›èÌdGmÒk¿ÆV‹ŽÖ]@\VrðÀt;âËÂ&1)ÐW`&¥¹.t1à:rØÅþ£ ‘_Ù£ñ:‰¹×Uk«Œ98}oe’6VÇTÃO2†R5SÖ«vÂì »çø:ÙðÌ9ÖªºåkB£`¶ mDJºj¤à÷…ÐjO>vÞ9@é0¿ê¥n]½‘„z-žl_O%¯W²ï$Hd}²ã­Þ'‚äf‚ûKδ•9™>]A½ž;E¾}ÓµÛ¥tˆþÞ–ÚëIÛÁLdáÂŒõœF©" ãÖ½û4„Üãùÿø“YÒdëiÙúrnäM=±WKóP„`¯)çÑÞKÚœ)¤RG ®†6ÜADÇøé&к–ŸØ(Z‡ MEÜb<5ëò".få̾‹ç}ºI5‡7ç"YÏËó 1’×Ñ®þl©|ÈÀAÏhiïȾ±|ø&ÄóÝ[IeõÝ>[þi´EhåÃ/@.8¥ìøW$,SïNé•ö04«BÅâîû òÞ/ =¥ÉåÂ’îd¹ÕuîÀEÓk]´#PÂE§ðZ9¹”Âí I lð)Ì+ÔJ¢íå`Øâ.ƒ,ÐÈyxɉõ «8 /Rá;òæf¶|d“ÅÜ@’MRœìS“7–ô<œò}:QšË±Ðœ{⸿ª¡°ê?œ‚œê‰ƒc²lËïÚˆžo‚¡»UQïpYæ .4öV•¢Å`x¢¥Úä›dቤÃÌÍ”w©7áîG®"=. £7\Zjh™8á§<©¥Èñ}f¯AŒ<"j_Ž Žüâæhà8ʧ5ÅÅî;$ub²¨Œzçp¬=“Nº…‘N%·ìqû‚­à_K®‚fÀçâq´%„œWƒ…%¼Â…žo¸¥›ý9bøRÒ¢±^ž¡¹Rí¢`ˆs)¬Ò§”DA§.^±ö `ZUs£äšû°ìþh‡îÉNå]´tlƒsߩ䜯×i”lƒ'¸‹çt‡.¦ ž¿¦Í¬åœ³IÔÅ»y„¨zËÇÈ#‘|?¬“ ,<+Lϵ®i­-©ð#nØ—DeÉFMáŽZÿ0 ®š”Ýþ’ƒhK4žzqãȪgpˆÕ‚_§†ƒ÷ˆ•d§*Æÿa¯á¡¢‚W"¶y .*ÓÆåA£:æ?ÐGŸ÷ºbåíf8ÿuåêÐcGõœEàŒê¦×¿¯áQ§<åQþ)è•/⇕R·õV=#Ø5E¹Çm-~7´ ðZz)¯–À§’©UlfËêàAb–õøÝ(ŽÜêB®^YP¾˜œñ"Úý\›Í øÜ1OÈ^ïP`fúŒþ•1È“Ilo^¤ÉØm;V½”KeÇŒ†ºHF¤£ö4,áÜCób|"S²ï”í%Ok¥tMEIrº#zÙ±ÏSç„ÙŸ7y´ i²þ*°ôëH©]¸œI(ÇgúåÆÊë븺Òw»3nZŒG.]Ç~…9ôZaÕ› ^ŠkþAÉõD%å8ËípÂâ%—\\Êø —UOre™€ « T̨ÅË…g«;¾[O6yes2•żùùž™—õŸgo›=6ç&@ÞíÍÿª„½ó£Lù®|¼ ±ºšòõÕÙZY–'Ú‡º"q…TŽëGÙNEêŽZƒíwë(7'§4"4ç&FwxÁæÇÈ«K›Ñ¼âÉ6ñÎec÷yY%Ÿ§{o|NÒ„ ¨™î÷öÁ Á“°° ¯=n6² +ƾ$½]A¸~ß­XÅÎå_Näû™~Àm?†çVôª;CKÎ/´¹žÍ“§WD:ÉÅTiµðÖÝÞ-c`‡–«œ:EÐà˜'µÔŽ2„ ˆ†cïôNµ*»@œ$ùÁÄfXÚ ‹Iô Ù窖®US¦±lÙŒú&e/H}‚ .b!UIÅçlr¾Sh^g]ÇÄżQ/Gµn.[©Î7@É`‹.‚ ò ûÏŸÚ&"HRËpnWDåô ]~QѲ‹à‘RJö¶·‡o´Ö)‹ON9ÂË}õ¥éA‘šÆ×ñ·wyCùxAÒû 867QB¿š7‡‚ìb/^og¯ÜÇN¯ÐÚüã;‹ ‚æN U³ÄQq Û,ï¡¢§ÖÓ)FHÌo‚›¿¸HÃ*/éHþ–ÎÌÏW!¸ŸØÖ«b g·?“^:ŸÊ8B K{º8þoΗ%'’8†xñE¹ÙÞ.tº¢±ø’ ¡=Éç›f|¨R{ ä½rMâö{œªÚËÞƒ]ÿr±2Ós ~ù•ä×ÌžíÔtóì3³›MªîôAo„a‘—±C&g¾håL™ÌöaÌW7bY š{8Æ–-H•fîî* <ù!¨ŒàÝ #Ý®¯ªãžëkäú²êµíc<8#á°) Í›%S`:ÞÎ|76¥Á,^£.e#´õ2§RÝ$‚*oãOqÿÝVN å Áñˆ¡–v ¸àŒYë+§è`̳ÌÓϵ º¨àµ¸-xözÄÒORÑ»LDV¾* \å DÈ?_65ˆÅéè–ý=³lž™—9®ê¾Ñ(F ùåi( .¨lˆ±«u/þ;5Ô{’@œd ä[ƒk¡×bÕ5Õw?’J?gê½4Xþ•à XL-~:+²F Óç²\:8´`5ûìÞ’×ÀÊ« ˜œùGÎõþKø ·Éû’- ôÆ-±DTí‹»²hw²“Ð"»íÜãð§Mì×;šëßr;"‡òæà1Ãô¹§Ãtc·ánGióYhÛd 44"»+‰äíÒæ¿àäE£$œß8 ½ôÊ~\Â6õgM#‰¢u]ƒµ…µ/ߊNàMS‘ìJ´ðl’ËBÛÕùaÅîÆp3¹ŸªÁ ö§†ß;r_J_¢F9šQŠ:`®ÿyÏïðmSóD;äHدu?„hvžÃ~”O s¸×=ßÈöËuVJÛºvK€Âúóá• "Ùc|¦!q¡vÔ¨÷.¤ëû1äîGàòK¥ÿ˜‡ð‰ÎëgZ1È»˜c2|¬ÖU¹®jž–’N™vÍŠ>労[ç™çKd¬>aŠKòÆÊ–û²,ü‡¾xnÛz²qö=ܵëÄÈ„5‡óÂxÁ`f*•èGjÛñÚIš`Z!¾ÁëW!A×QàäùŠ0°2wøêƒ2'@MZË&§Q‰ô×ÈÐÖ2½,‡UY;7V€Ûšà¥ž[—y fÃéêM†²fŽ^n£Òu•c‡5ç#“ ‰p‰È…Tü‚uÃEð›¼3‹ÕO =Ñ—Û?t(¸ã}hƒ‰™ÊêýÂÃÛº3/MrÅ›QqUª°Jÿø±“nï–Ôå¢FqòéÌã7~ÙšiÚ-m{röWŽM‚1@š“7+C#ÿ×ÐàìÊ#›•iJÚŒ©ÉŸàÚnÓÄ ¹+úÇ†ÝæöM¯Û(‹|ÃýŠ`|ºs ¤G¿ÈøkÁÔ¦C3oãÚÐÅBmš™÷‚H×§59oHccˆiòà¹âꜘ.½“PU„„Q¢J·Y-q×a4k>g”“+‘ÞDcr«Lµˆßt=;^Ïû¼—)˨F–ìžï­§dSz¸4m"Ù7 š>® endstream endobj 5138 0 obj << /Length1 2459 /Length2 17678 /Length3 0 /Length 19109 /Filter /FlateDecode >> stream xÚŒöP\‰ÚŠâÜ]wwwîwwwwwBpw ®ÁÝ]$¸.™9çdæ¯êÞ¢ªéõÉú|ï&'VT¡6±3JØÙ:Ó330ñDå”™YLL¬ LL,°ääªÎÖÀÿˆaÉÕŽNv¶<ÿ0u:¿ËÄ ßíäìlÒ.ÖfV33'€…‰‰û¿†vŽ<1CW €@ÚÎèK.jgïáhafîüæ¿_TÆÔfnnNº¿ÜÂ6@G cC[€œ¡³9Ðæ=¢±¡5@ÅÎØèìñ/ *>sgg{FF777C';G3j:€›…³9@èttš~ 7´þ],9@ÕÜÂéo¹Š©³›¡#ð.°¶0Ú:½{¸ØšïÁ*R²{ í߯²ÐþÓ3óÿèþãý›ÈÂö/gCcc;{C[ [3€©…5  !ËàìîL0´5ùmhhíd÷îoèjhamhônðWæ† a%€á{ÿ)ÏÉØÑÂÞÙ‰ÁÉÂúw‰Œ¿iÞ»,nk"jgc´uv‚ýŸ˜…#Ðø½íŒOÖÊÖÎÍÖë?ÀÔÂÖÄôw&.öŒj¶.@)±ÿ˜¼‹`ÿÈÌ€Îv&&&Nn6Ðt76güM¯êaüKÉü[ü^—½=Àô½ …)ðý¬—“¡+àìèôñú§âß–™`baì 0šYØÂþaMÿÆïÃw´p|bzß=fÓï¿ÿ}Ó}_/;[k?æÍ—QUSI]]•öïŠÿ§±sxѳ²èYØ™Ü\\Nv&€Ï¿Y -þ“ÓW)[S;÷ßɾwé¿ »þgþTÿ¹ jÀ¿¹äíÞ— ú³ã:LìLÆïÌÿŸ7ý/—ÿ þ›åÿmÇÿoB.ÖÖ©©þÒÿÿ¨ m,¬=þcð¾³.Îïû/g÷~¶ÿ×Tø÷ÍÊM,\lþ¯VÊÙðý„mͬÿ×F ' w ‰¢…³±ùßËò·\í÷‘Y[Øíœ,~?UôÌLLÿG÷~YÆVïO§÷üK|?œ‡·5¶3ù}a,ìCGGCX¦÷Ebagx1¿Ÿ¢ Ðý¯02ØÚ9¿»ÞËó˜Ú9Âþž(;€Qø·èoÄ`ùƒ8Œ¢€Qìâ0Šÿq2%ÿ ãÇ?ˆÀ(õ±¥ÿ ÷x²Ð{<¹?è=žüôOላ À¨ø½ÇSþƒÞã©üAïñTÿ wNÍ?èSëˆû=ºáôniô½×gähhl|E˜:ÿ‘³þOþ÷žÿOñNmü?ÄþNflgý>ãÿJØØ~Kllþü=|F“À÷À? ïþ+Ço½ƒËûÁüqyïƒéøYüa`ý ]ÿAù[oçâøÿw³À÷Íÿdü¾(æöæ@ÛX¼Ë,þß;hõø^õ?³{o‰Íÿ Ë{tCcÇô„™ù½ û;›íû üCÿ^²ÝŸ„Þùìþ¥~§´ÿ£~'³³Ùþk`lÌÿ‘þ{\lïíµÙýÛ{3ì­]œþÁÿ.qøÓÿßÈèô×éþWÈÊý[h÷þøø=3ó{+ÿÑhæ÷¾ý!fwrÚXü{CØÛ]ÿÑnöw§÷wš÷¬ÿy¶2:›;ÿ1á÷8»ÙýÃá½¥.ÿ€ïrý|ÏÃíëóîý`,ïôÿ€ïÍöüÓ¬w&O ãß¡þõ|2vq|ï¶ó_o÷‡×ñ_?€@w 1ìÊ¢1o°e}pçC­0žýÁ$ÿùF:5½×Šc—Ë"t uMvà–ãpÊhòúž8Õ­Ð*Ñ/¯mÐaíIJÏÞ/ú Ê3°ËÓ˜CSŸ7 |À§W:ôþåà­`ÞÚ-MžïàÂ…¨Xˆöà6 éÞ0X¾6ºx tXÃ!÷R>K£­P2O^`”³€MåLOCƒúÓiþön5oêH:Öç4†µØK{›%öqÁs£R•Å©‡ G›üu|†ÂKä8UkÉ«´xËq¨·³ñ¼Ô§PŒ3ö!_ðÀÔ‘ ØÇ |V•l„“î 0é~E,YBš¨Ûnr¼=>7Jæ|§€k=y1×¢æè\älÉFÛNwí‹óω˜žsYÏ 9*QIr7DÔ¡k|£-Ñ箿çÌýIù˜¥Hôœ6>w ŒHÜ›¹Ôöïam[®Ñ:C…>¼%%ü|FȳQ¬ v§|Ú‹£`áð2°7]4GŠÀºŸzA†Ž±€øevI W1¥Ó!]yxIX'¨žY:‹å>›¥ <7Ƴ·ø2&ß›t’ƹÞ'¨”N™Å6 =0Oöú™7ÂFi€›cgYŠªÐë€R,l†„H“©èr¬5ó‘öû”Ɇ®ÈI*ú,‚àp¢Y‰¡Gó…ð—ú½ý–r¨¸[nÌLv†‹Ú è¯Òî5ð<½E‡ëSZ>ÊGSfÃܾ5Ó'Î'ÖjOžÄ应aŽ‚Ï‚4¦D[Þñ w3T…â7’½CÝBð(¶VY¾žÇÀ³ÕÈÁ"…;þÍ=éÜèá<êÜÉôаO :*Ñ3 Ô"úùAz\Ä`³ßbØ'ÿlUÎS»o½B£fêl/E‹¤L¥ßÎ*«çBK™q–zv§/"Û!^7#RÇþ诂_Á«Ü«r¦¶í*Hlý%Fn¥r†Å Máx=Du€3 û©Ùm*ÉZ° ¼Xf+?UÝSo×*+·ìVš·ÒV¾'™æa%F¿çËçíï¬Äù~ÂpµÏoÆÕ[…Lj£¥Öó~;I³æ™Ÿ>°¬l5MçÅio»ªÝdîZw*z“S«·"Úül_ªÈ!@Eå§è4„=ªÄ¼‘ŽíwJÖ'(¯OÌ€ôˆõ[ÁõöR,ŒáhÌKI‹ã´”ºÇ…À óIgIÃýÕ`ˆñRBÿ–.ÄÉ'ô‚ñ*¿“ô0Ad;kNi_9»Gëžâ:¡éZ/5Ž"¹ÈŠ"FÀ“¨××T0—OCÑÆvi¿ì¸ëó²Ã'ÌÓ3GʲºTÑ= µÖÓƒ÷Ym¦wàjŸÙ¾m~ªëxýßâé&é˜dŒÎ½¥ˆAµŸËgÅÕ]ÛRÎ9ü‘1©¨…-Myõ#vûת9¨Åµ&Œ%: |ï šõ è`p´ÊHC¢ûDì yøéOÄUhñøƒd~Þ ÷6ä`ª]SVµ;0'Ž.!µZBr¶‘-.“䂸HJ\7n’¬fþ¯¼p&ÅP­ëÖcv&pÛX~Á'©í\ߺôp즋.F‘ãj©ÞR*ßDãZ΂äÙ-2È•ÛúȾÆÑ‚üLâQxmb7¸ :šË›‹=ÀÁekm¬†E !«Ð2\¨ýˆñA8ÁÏŒ SJ)çšo“*íÙÕ›ïŒz^re_È9ÆA34Z`g4Î^ «Š¼–ŠPóÆ5eìÓ‡¹‘ÔºB¸FfµÚ”ˆ£&5U7©™6ói»Î:áFŸãš2çÇ4ëº*|3Uu™nn?»ò2ý§^*ñªSaibV'H pá÷õ¢qxHí×òq§Fù™h›FãéòK†µGø°¾ð¹«l¥î0Š6¼Ôa÷êƒãmž¶éˆÝá¡V¢¥µ¦ô+)¿‚8"ì iÒíiîÌ,­µó Íñâ&YyXŠW.W<(ð$2ˆÝøîˆ.Ïj;$äæ½°Ëvx3…™lŸŒ«]дä'i¥Ó†öjÐ9(òÉN³žãùàÚbaó–ÃÆ†ÇhT-ÿvJ‰›q.³ÖÇzÐ…ryuRP¡`>%-<œ‘ÙÐ) W‚Êíš7ïAƒM)eãÜ:WÍc"Oz‘X”,;‡wh¨ìžßOòbBÜ¥ šœåžÙDs™нÏ}˜¥R=(f‚fµÜ›hDVû¤~9Z®çœÊæcÎLØü(î8ð±Jª˜N¡šƒr»gg ź°(4 6ø-T^á;ö*©»!ȇ1Õ\õúªbé¦í¯š[ºJ‰uk<—Ö…–šýË1àÙÏ"@¦èã’ÄdÙõW>œT9˜–Ô0:•"›MÔ(’'E¹*M¾w§ö¸çÏ ÿ2þ1˜>Ö>UPø¢e²ALÓû`cb^X(,÷¤hJoû9!ì¤Æ"Q—´©8bÈÚŒbtXšV…tœjÄn‚6C£ þ=¡NMÕü gÃÚµ›»OŸôqgœÌ^4+sè2í8U«\쇅ÎUÅgõ¨Dû‚±agcQƒö…ü]¦¬Øzÿj.öJ-aªAÊ“ÄpféL8jxÜ´ä9þ1[AqûØØC”ÂHšÇï”ÔßôÙV¾úÈhÔÐ6™, èoªGq ¡2‰k9ÓüBGá®´¸úˆªæòØmQ¾àYp‰°¿Ò§¹oÛv õŠ?ƒ‰)¾ ´çÉÐ¥n×NõZmWz á´Ê0 ­H·«Ý{íûwß&’úí87å`¬õë3:çL뽊_Là÷è’f…®ti—›º"E×<ÛnmQ¼ N˜”OÕª»e.£ñé(VOðˆjup‡ªâ×÷§ ™eEj+¦PI¥÷ëA›~ö\¿ö_¶Øca1aLÐA&5C¤QQd8µeÅH ‹RnL¥˜Kñç-û)G¹x©¢¥r% òV¡¡@Æš8"‡!pÂÒø‚h êËïÙî¹Ë–ßøÃýj:¸»<û¥¾C|jvDJÊwkÊÛ G¤²A©9éñš%€ÆÐËòEß3bT®VÛ£.§Â ñìM3»?'_ì$@©÷¤\Rˆ‹ƒå6#c#.> Ã‹®¥ gprÖÓ ¯AÔTɹnA'øŽéÝBá4= _Í¡I<`Fjk2ö)É e?8À–*Ød%6ÍnÞŽè¾D?ä4ÙŽqo££üXxþ0B/a˜»\¼T·l×MÕ'21ÕïÚ‹Èð³ý–-ÛIÞ GâÜnF*`íNƒ"Оñ;‹™#ÄM™,f?Á>/¾ s”"o¯MA;¦µ]­%hà2#ú “lÙjŽ_27v°…Ø&Èô*ˆÒcÊ —íðsc™±óŸiè¹OŒSAº4¼­æŠûÖö®:sa!ûÈçÝ,JÅŠ''¦GtWduÄc‚mBú“èú€6K wö$¬ˆ«¢±ŒØ([ð}øÒçÈjˆÉ4üc˜Ðt7qø²#R%›BÃKo¤jMÿ ¡q{ ¤‰1-CÃ6á€9i™=Ï#«¾}J½}¯¦äf¥¤­ÿ* 0™FO—ˆT^ï0¶ÕŸêåÂ7צß×ògrv"Œ„+¾ú€(Bæç22´¥VáÝPìv`dZ ADø¢÷!*7tv× â¦©#'ÒN³¿R§¯m =@–=B õàŒñS$X>ö§¤@e` Ö‹ÀäÀ\±'ÈS¥â·:K£€dLåÕjÎF„ÓŽKkØÐÈLÖ<âõŸ8ÜŽ‰Á?pc,>œ ¸ p׳“á6C”>ª©e¼(Œñúú¬•"µ¢<˜GŽàÂŒ!ާ>"™µ…†µV{±s-þ™G‹Ò@¢DîÉ?@VªêÂׂ!Í¡,™v7Ö¸>æj³¹ß€E~ûØß‘×0‹®[ɯ(êü²®Ï²>ìžÚ×*%s|EŽR8ªdMY@¿}KNÏçI7ÔDVÄ¥•Ê-}d° )Mƒt1ÿU%†ÉýXÔ}È®»ØB>Ú_FH^(=úzú½iÍÀþÆcËfíç>‹EÇÎÈPrüB4÷È™ ¶bΨ3®o-gÁþua#…ìV¾ <¯]9bnö$¼–—µÂOU& T”ušµ ëfÝä·±~‰Ö%Xx Uønº|$=¡âBœ’çl¸"m1Ja™ñ'1É™âz-'>K°|HŠ Rqûhkï#VÇtýôãÆãvßÐôsi¶0« ø],ƒ2rž"èäA@¤ñ”š·ÂU)m›Y£ã ÿJXD|5žmü¯Æ#vƒñ”"ºíÆùŸzŽ¼ì‚¸ÜcË?‘”²å—$µ- ƒ*·î³ÌÒBíù½Bçô‘F2˜æ?NP}ktÑèš+öôÎRoÜS—’Û«1¥Ù* æèÀ7>ª^ÕãKËVfŸp¥w«¦9CZŽ ¼NeT/üo&¸_(-b’“óƒ@ù ´…×þGÒF6s8ªÐ|<³AßNX®¯ô‹±KßCº&Ð…¨|N³°_"1U³¡TáäÒ²ƒ«ê .ìçà <£½^)³²ÃÝá#.0h3a¿añó9/%rËg®ôŽoYK}$ÈßpÊéç¿p"ÕŽïŽC`Ýù}f–ž,/£‰Yªí.“ý”Ñ2ãDclv+´ìkceêZ*ʵ16ŒŠ€À­j¯-§‡4>^œoÁißRÁÒœ¨$[ÑÀYÿÙ¾¡ÓDèˆZY·÷Í\põ“Mˆ½ é©{Q„Û¡ gÃUVË:ŒÔ®‹¼ÈG$ÊSІŸ±XƒêåÑÄšóÀLÍŽkF?§‰œÌ3ª5n戳.¦ž}§•ôð¨{Ȉì£Z§á"IpÏX¢WÒ ùÔ[=6räx{ùãÝЙ:ÂݽÓãWœö¢•ùE²%¨ÅÒ"mL·w(·YʾE6o¼A±U\w©Ñ$k^ö±É‘êMuÉãœüâÚö°­M;…­ w PFóBvšˆ|š…Âõ§Zê÷Þ Ë®5Ð)ŽJ©!I'—ük3£Ÿi °ÈFãY-ô3ÊDr<]!. ðuEO†uiýf¢Ûƒ!i‚Æ›ªäð˜Ú:Cï –t&F^¡ì†ˆÖ®c¯mÚÕaËèŠU?u^C­,_P:Æ®~]i™ä§Íg8qÖoš¥£ôÿÒ§H½z=]’ëH3‡²Ã¦b¿D–‡¯æE@Ý\:(w È‹ÅuXÍÏ(„54P÷vØ‹0I‡,ØÜ™d=ÁŸëo'ÛùÎxí=+§üÔBo·]_ÆËq(÷ä=˜×oæ{å¯p)ÿTg}Ee×¹ò5`†›a-Žtê–ÔÒÚ»Lëígc²Ú i'¦éB„^˜+ ×FhÄ"¬B8ˆ .-=lY(¯iºsµ §‰Ûª ¦è(c@å{¤‰Ïí dõgôáYN½¨r3c_(&•8Ö4¯Üèªz̸0exnkÈEªñׯ'_ÛânàÍZe=f½ÄÀçcèŽcˆ„‹%r–­tn÷Žë]¥6îGÁZàÀ ”P7Q¯s@Åêæ¿_?[=8¥š 4g„$䯔)ÖRùZ’+V‡¶ŽŒ Á6IjX§ÈÌ‚eä„í7ý|ür±‘PFÑiîr BÑE( J†3OþËm¬£O"IE² ?¸[þøë¶)tçr´§=eÄ3?:/–$i߯}µ5¨\}÷cdFâí*NS ³äjÞýG÷È]-¤ÎÕú‰ÙŠQP§xú~{•h¨Š^цú|Ø@pnnw 1”®òœ—§hxX» ‡B»Ê"Ã!í¶*©Á‹É2 àÃUB¶‹p–À~^ýÆ1Ž²ç ¿)JÄI*õƒ™¥ðF¥{˜‘ˆ¢ _Í^±Þl,Ý1RëÂÍ2œ4qB _u£J=ØH¿Ü8·&Á§5eÖ'aZù “$»® Äo?]0 LÎiËËŠáìõ™ccDy¡þ”9`Ÿb`§’Ùy˜ … ¢eëðX*ÅØ„̉Y8ÿ¤EÔÚ™|û¡’€Þà%:%"9ár"¸¸„Þ»ìVY]ΑムŠeÌ}…[57¯½*挊œÁ€áî Á¹' ÖûrÄ/<÷ø®1ΖùÀ€dë9³TÎÙö'µ}´ÙGßT¨{] ÅvësSp¡‘~@´q7ŽÌÉxS/šïå®üØçÀUË2úy …õ²pòêjÉo!ë¦0ˆ!@%ŠvKˆ©+2Ag`F·'ÇHc«€¸P~³Ø~ðÿœ)Ñ4®Ó:nöcV\,¾ÑúXÔ‘ç²öšå`þT ‚¿h$á}w¨&¢’ŽLQÿ ØHÂUùÆw¨DU8}wY›nöé‚F@}D4ÏÿÉî3éé¼¼GGfOϨš!K–wï\·7¯lÎPâ¦÷©ù¬\;Å3“P -¶¦Î×VÍí3¼eÕšRsB²KÕÐ'˵/pv%™Ñ[ÂîN° A¼¡çŠ©«œ›»ñ7Üè¢hÙÞ1o¸T>Eò<.ÂøKã<01ó~IÏv6Éú=C¡`dy¶Dei¯b-qü "úM®õjÊ,³ŠE^óoEãS-EÌ'z+§¨Ÿ#yEõ•nŸü8pD2f£Òîx囿=lE˜—ßúYúÄ3#´ñ™äô§5µž¶ÇuwŠ!\úA1ªµ§”0àðê+›ªty׸f·RJµªò&4=°ò®¾³fdc 7À½!)´oÀ/£Ù ÉÍ)¸Õ9bð¥ Í~v_N‹¨®ææ{'Ts"Dt“E¤È mX®cÓ÷ˆ&ð#®Ž¨™fMÍ?>ŒW“Ÿ¸Vñ¾¾Ájù?W×0‡D’ÚmM˜Âƒô‚ÚÆ$I\¿fépGíMH4ø%ºëQ|£¶Dr”›y¯FëGâ7Ú¨ê;&S3?w]oQ žŒ¯– “ xκµÁOïz¾š¸~iàúøP :˜Îž£–’šÿENønÍÏq)ÚV|òdém,]&‹ž¯íÁ¿ÀÞ-Õ' 9ú˜q6vRLbÑ‘bª,¿?­šÎ µèÅ$%ËsgTçóËtn¦By§æbZÚ–,t¼A¼ƒ'ÌrÆã°¡ Ö*v5”aõ˜z…*0@Ìx”ÍÊm¿Kúrh6b‹Ý­!o\ÀOd»÷´eˆÜÄ"w8‚4*húCã<ì“Ë-MlÍu‰nåD±ä*Î\ú O*ìé3©ÆâXs<Þ¯²¾%ðÏÙ-ùôCÛH™ òÄle´K‚:ÐÈ +˜øŸ{l)ÂÕ)â˜E„bW̓d+=&¦äQÕ42ØY~jRÜÜüp[«¶Äw!ÙÅÒZ_1[?¬Ý_Á|øVL8q§€ ?ǨíSÐSi²váÇÈÉi¡\Õ´¬ëùöÅ QÌ+VzLÝt¾äëÚºP¦ ý 0&ÆV‚qzñÑ”[ýSl:½Ý¢ÛÕ†œ™ÖB-Bì¹ÿ Ç‘¸k[äé8’P­‘¼òö‡¶‹r†¾ØT²­ü½ö_“/ö 6_­v‰™—ú¸ŽúîýÝu?2<û0ŠÀUÿWq+gÇL6&Ã"4¤mý<<ºŽmaã£ËdVJ­³k á ÐEMb]'²ûo¼ix"llì!zh¯¬RÒãõð<îmÌ^&bН»)qTIj:áx,9Í6îÐRkh£ž??]MÏkWw FÀ1H¨fÓ'ͨS±ä®Ë‹äs@$ÒÞª¾ÎE2<‡"©fûT2öÏ äí§­zBçI=°‚vXŽô,["4‘N…úý_Ã"¤ ¢ž³¨ð<ŒýWó'B5îuaZw+l®”Y´!!ª|!Šçñœ¸Š=‚¤Ô²Óí‡Ðw)ÝšÚ\•àa¬áVaÕ°ŒHr38Tâ0 l€Ù;P 7,:L¢´+œÔ=Ý…T$ÊT~;ïYÓ¹þ‚×þ(”1Ÿ½„,Õ†/²D7¨Œ‚›K (Ê7^-ù•¬Vâ ªË`Zm"a}PöR™±!nÝ/~tߌ¥}‚ À;À¶i…OÊ;ØýðÍÅÖo’²ÖÒ·!:–Û³›žu ³Œ4A§Žû¡;~&™j¿w%â ”7E….†B€f3Á®Åû<¨±$jíUÐ ‹¶r¸:ZzÔé«fÉðs…I¹ÄÙUD ´™œ'-Æ8ÐÝŸ xä)†«˜Œqe6ð¦ú? 6¶Á¡à£ì(>=Ò2y]ä]Á†áç>è’7~Û‰~}í>œYØã'¤F“×òŠ®Â?ËØ÷ø^©Î‹eI†Û¡ãYßš¬d˜Ynª¼i?õpŽ­žXºü••LgR’;HÏ.-Çå3/ÀVÔ¤u5Ô…%T94 Sp—?Fäc!ŸìÀ¯ããgøÐQ(9ë¸òNÎVÍiÒŸ.ª‹o&5°¼õ'~² /J~؈ïþâTÉ<†¬Ô¶“áeŸÀ–J™VÍ”Q±ÑA)…!Y?êªÜOD²M Ÿt;|ó#:"Å#Cýú6`å´ü#KÌ„wþƒ'âkXbÐnÁ‰ÇºR–ÔôtÒ:ýCç®ïýBuµŸã“#É,Ó38õ§ =Ø•Oùm»!etU¸Gؽß3„+GŸkY:ç†2Çû0Üïc3ŽõÓ$à dûhùQÝÀSÏ0p†Üï ÙèÄd;fº…̵¾í*ÊÛ @­Hpv‰¹«~¤¸‡R!ä3Ÿ1×"ÈäˆÃ–ì@)軌–Þ¡KÒ–qI’}qÜuøÒõ¨­0é¯PÃϸþ]ì ‘¨²ïÃÒ×s¢Ú[¾D;Í4¡0ÉâÅɵ>8&ŒÅâï™›SÛÄÅtzU$Bß’†`B¤”¡˜äÀ"u#ŸíÔÉÕĶŠ[ø©X?!RmZ¸¢K1?°/%Ms'3lž×{¼G]ï4íÚhr*ÖN$KI-JÄåÙ ±aGò& ×㣕âHØ~ûf1< VîU×ÚIÿH{X‘L3ÕpÞÝ ÿE¥{ˆ1̳$áeä¹0&¹(¥è Oý ­ÌÀÜ¡Ô4&f¤ÈÆARà>Z2 %lÑš0!"Ñeˆ=ù v¸aJ~LɃ„N/Ínèè+J¡Ö»D‘#³)¿¥VÝ37$€=¿­9%S^¯s³§«‘’ÇyáÔ0¦Ï‚åe£Ü—Œ_[¾¢l‚L,š#íÈ®ptyÒO%!!vö×58ÍŒHÛ^÷Á :î˜Îë×D9œÇ˟غ5üÖ$Cä–Àës.«Á?[5þzV¾aà_]áÆãªsM™ã£P°ÑTBð™~ÐuÃKuj=¾+#.Atí¸eÎb?úöA߸^èüQö!ÍÕŽÎÒÐWÛn‡Ž¶”JUžxÓ3¢ŸIózýùW²£«£Í³©Ï öœ Vª¦BÀÙMn£ŽM]Õú&Ý` ÎÆ](6®œ0·k®>/k®¬•ø·ñâ¯V©G…3½ËdÑ_iATB45v‚éÙ_—ƒLÚ#(ö]Rüo¢ÛPQàCxÎ?l÷.”ñ{µÇ èСŸÇ—'j©íL™í ºëé• §²ºH“;ÕÚ¢w šµAß^ÙÚºV6S/ òò›@Ù*ªåAlÎæã0K„÷-—uxÅÌ^Ó6=ª;(ä{q£U räoJÊ8hÌx‡_¹¯!O(SWU®LÏZhôH‘T Ü?P5÷Ô†ÀÛ‘`;µÎG“L|¹dpÐt€jIÓ„‡ µøùØÂuãatóW£eföSâh,óSÒl&flëî-2k®³4Þ¦:˜Ô„H…âä¼=ôr%)÷¨Û<·2#¢ Ÿå늈†Ó$+ÙWÖ¥})|ª;]<„~jqÉEÑîL®Tä+vóvùnÍýB#øªµ¶Âp¢)’ËnJ–º_é>r½`óY›ôPÍòœô9Ûˆ­*Ûgšhþˆðí¡¿— öQðÐ÷Þ:ß Ðx^4yÝxýÚ€ë[±Cvv´H¥D¦_Ð]ü¦O—aèÇå°©dÐ*ý }{ZÕÖ!Œe´#–ö0jIGíYÝqæØ°ÉBs‘ÝLxèmZ³ÂGPpT³ŒÅö[ (SÝ©ÔFü>.’§ [ðø]ªóÊÝz7í39íÈgä”&M[;)§üÔ_]ܪ+¶ _t?¾y”Í'åav»žÜoHLô ³‡Í2F>ƒJ*|#eÄ%“ì̤ê«kÁóÓâ5SV€_’ÚBfFxXšaëcËDá[üŠÿA) f{kaYß6ö*JûCqÿøvdDÓ‡ùÜ{e†˜P•rgüY£b‘€{XgE=2BÈÛ@IY»»g—!j:\qÓ(¸Gˆ‹ÍA\¡ÄÏÐ6‹£2hêÛµ+ø9{ú`Ôä€ýM‰Ð/\ÔÌ!?;‚sg®«Öeç¾~¡Ÿõ±Ûømk?ŒÛ§ñ²²ÅýR¥†uiï×D$‰Y:n>^ó œ:2?ðäº}Ÿ|˜®¸/qÚ»öï‹SM¹ø`!i >ð lèß¹[ÇRªÃ¨KmIbªîþ Ðå^¹Í¤þ 4µÞó{^ÁîéŒõüm¢ÿé/<˜a"+ø!ŸZnRóC8õ-¥æèµ q•Ü¢ŽìõmZ.˜‘àôˆj ì‚G»Š§O«:Ÿš)‚ê®ЬÌÝ+>«2–ä¬U$8õ0 yÅ]x¢IdýÌÙ‚ŠBf‹R Óž ®±¹²AšóÔæÝON—ÉV¸Â˜„bJ,Î]Ý0æ= žcØðœÒ+¯Ic’¤‡)Ç)¶‹‡'Õ°ÑÓ~€†W¾Vww“9ûr;è ]„–‰_Ø¢ R sß2Eêˆ!Ò…®ýPp¡´X\?¢idg >â&àsín†døeÌ’9¸ ¸D­æí$A°¯ê’=¾£ÈÊ ,àVe0gð¹,›Öl0Æwf  ð–Û¿lº«ðÖ@÷|¼^4÷ æ’—£|‹ëó&Œ v‡n|aŒ«©Y=}Ð4£¿‚ÞÊ„VÖ[§HvÀ·TÃü»2ÛîbW‘È#.WÉ.hÕ›v>@èÒ0E8ëÃ^ct$†9†‰8”òÉŽÿ¶jbšòºâ­Ñ±—ÞÍÇ#Ž+_·9c¿èφ”5Ç{χì ó¸(&Å%‚¶²¹Ö&6ŒJ¾›­_*úb°Í~”Ìy;…–8ìgfbûnQìÜ€¾ìbj ûA3®ÆÆY=V”< ˆŠEÏ…$гT:Œ#º¨ì·a-õsñ/ðŽ]c‹SFì/&‰¿ÑÖ…aæšÂ5_6ºr‚34õv ›OæÊ6ó¸Ñ*ýä‰ÇŒÑŸÒ6–쟧l¯[Õº,,¸hTšƒâ­s7,gуúG-Ñ£ôÛ7crÅ9Ê·úÅ·VµwVY¹_ i3IªcDwTÜÞ=ÐÁmã©à‚MhŒ¤"âlÇŽ™F¨x?³É9იPÔ—ª±Ö–…y2MΚDŠ ó-I0Ù •éiC|Å@¥pËGu¿_þìÅg‰ÔC+æa ¼ácãZ[——=‰rN=c¶©Ù‰2»ô;qÇÆ™ô˜äÇvw&˜ÓÀyõ>¤Ãê;ýÜK±ÆÐ×b`_(œäÁè[‡Z²‚^­tÃÕ0hƒ­šä7’i,upPžÂ>ßI×½LQ=8lþv¾N¨I­’ßQqZE… cål§ ÂSg˜›O(ç*QŸl 4oåxù)k¹,0™;|áÛX†÷³ztˆÚóÜŽ1ívÃPv¯jÂ%–æ2ɺp·ãd6GˆÝW& ï¶9 ±<9´¡œ¹úÊñ±¢†á[²-în|Z±Ç1È%¢û"Ù²ÌIÄ0Ë‚‘^Ë:ùÏ~ ôOË‘§àúì;·?Êm_QßsW_ 'Òâ8Á£aJÏâz•²n5W:´T_:™h+‘¥—Æ2ûäsh—´ Yë»Q«d½)Ðxþ™Ä](*5ƒhÚ€ydµxý›u·Õ–•\É$x$³˜4{¸órï ÿÁfén¢ÓaŠKûãcSüxl­Ž†¹Êë´¨ßȤËõ¡à@ ŸŸ_ßzÔ¯û7•©S/ÍNCš–5\w|˃–žür'[ßã¶£ ‹ŠÂ¼Ê\"dMÛEˆ!š×BÞá×·'×T¸ZèjœÈ§–z>²~ùµí¹i'w>Lj§ê‘ â´kÿ ’kUƒÒˆää[¿F¨·k ›w{9u/ZÏ}i`ÇjøÍ/Àd` ®;¸>JA±îÍÁ)ÔZl0®éM~à“ÜÁïHâlxh^—÷³ôM„n2Á‰öy¾rx¡ºÇ(±"Œ2Ò–]aD\8‹çs}zó;–3~0ŠªŠR|T‚Ž‚ I¬ng)惜@ŠOž(çrÐ^¼,è8®UåÔ¸‚Áøþ‘ru[µ/P²`W$³Úá4“½°¤ð!?!¾„Å$ڪǃáØÞ&{6|37çä-ŠmZ€Ê1ÃVÏÊÁ;§’s/nøÅº£¥ÕAUrú›†Z¿]URS1Vš ¯1”BB5|±ïX!$E®>Pú,mÕ:x7A)^|ä\·#ÄÏ«ÐMO>jG³LbqÀÈ '/ƒÉï,\@ R­ãNcs»d£E/X ¨|…Y©]‰eß/Qxòj½¨Zí\òPÇα_ë–å‡è»V‡f4ƒ¦ïïoø½ÀA7í Ѱ©Þ‚»ÑЋæÂŒÑ>Qø$¸ƒçÈq&ЍaG!’Åi•ï™B=Ùy0µ©cG”-zã»Ñ `ÇÕÂ"…v2¿È8ˆLcèóqÔ–hôµD‹ÕÚÛ~Æ`Ý«ú䙸ÎËÉ L³âýi°Èw2Á¹53® øèm¯ „*°}Ì ãeȼØlÍù'>B6XýÙçƒ}sà‚¹å«’'œ ÕåÐRÒp9¶?î`Õ,((-ßz¢o öê{³KõЂëê[ï¹¥ ‡ÚV8‰æj-‘†ZNÆUº·àdˆ•|tf&å×ýlîèõJgÙUÄæªa{çÕgѵŽ;?—Zœ™–Á×ÁvËh€~ÓOðæ<’Ÿ¢6š†çô½Ì<òŽ¢üÒ:Ñêeb\ü&TdưduÉžÎjt­½š÷ ô°Ê?O‡¦ÅËsà¹Ðä²²¼ÿˆ2ˆKlÙѸG¼Bq%M„ &Æì×åËòO]ŠòpšÞéÐ+Žž²E™áÓ (Í©± ßÎÞ^[—Sß<èЛ†ñœlÅ‹^£‚®V¸zÔÕá Ë_–dU²“3÷:"Iܯ¼DÝ墳n´¢§¬Fê¿­ôìöEZ®Þ—/ÇtL'ìp×­Àò$bp á%Ì·ÙÅ'ù>£ÆÉÉa¼ŸøÓûB›£K'Ü_ˆnÛ+Q¯Ñ¾\Æ,ž&àž eèP¿qŽ"eK;Û['/ìØh(‰ü–„¬ÜO” –šTwÆœësf¹ëªMð^Œ|h¯ó#CÚ¸Öïƒ9Ÿ$g«òôo&ËÝÝä©»?ûcM}2ÝýÀke€AÆ$?ÊõÆêQb¿Z‚\¦èÚ’:³5¡ãí̬œ’¯x"Џ1'åW¡‹j£Ï[,sÞC;ÕHówΘí—ßb€F>,¿¥«yû’£*¢ýÝ”ìœ÷€¡îÙ(G¯Ú¨ˆ\ø#X¤ŽçøÌ£«±q‹6-зì4Ï„g”ÔÇ¶× KÏ5L$CoN÷Ñ̺fgH•é&aFHpƒ«7Ò¥µÉ„õÞÙ2¸þÆaáv¸·6^¨üùf²\8Cj¡²¼hWžü+h8Ɖ_ÉK”©Ä¥ù¶ø\$Y埖o¢ð›ê $U¼pŽºë^/õŒ{7ŽØ‡"¢îÜû˜ÇEÞ>ðÝšðÎÅëS©£¹HiÛÔ)“ÍNû0Eß‘àÐDXÓl­:i•#W›KŽ‹ã®† (óÎÆWÏ]™Þhó°PõÏ"`ÙÍËää gíØ2,;ÎíTÓ&ÌWŸÆY10£é@iûYˆX„ãwäÙ"¶ušãivwÞ¹"˜5qB}¾ýÞ #O|LB]YßT#ÙËo{>K kžV®+ž‹AjÓÖ_~áW¥ý>Ö>|Ûè?r7³K~€Åõ¥Dsp™s}Qûí P)0Ö&s¶&tÁv 4þ®í\]ŸÁS³³‹>ITÅ¡9 ·üŠ–Äñ×ç°—4¡O’Ý4ŒöKÛ?÷bŒ»( •–úwé$„¶T),ýOҭˉl$ íë –Gc­Ô«RyxA'À£%ƒà¹t vì]VKéXê2…^Ýȳ åFž¹e9vE9}ft¸ži¸YPÐBGÌÚ4£+x ~I0Ú¤Œ?¡ôåÇeÇÿ*Oc™”–ÌÒO°_!ùqîÕsòë|cÓ@öÛ/Y Xsó¾ÛG,„—.9Ï °"“…¤&&/œ¼ÚÙ0­¼ FîrÓŸ ²_#_IØr±”¿ÖÝÊkŽ®;X”xO{ÙäÎ1»±QÔQ¨DÝ¢9Œð.sQ®CŸyO†¤‰Ð%¦çSY8‚áN{6bÏa‚¯‡²ò¡-1Úþ_X<ÙëPDve ]³3ÅžSÙ–²æÒ|Ò¸ät˜WpŠmª½Q‹÷$Î ®½†pšEzHo±’áSæuл‚÷pWg8¯y¼=p‚`½*¥ Ø!—£#Æ„ (¿7œYªù‘áø\çÏ' Ìhfì>öãOï}¾ÑXòx… ¾¥ú4ñ%™¥56˜­û²4Bß2+¢øê‚[·Jj/{ÓÊÒZúSú!Ýä5—ˆ_|}ÍåS3ß„gJm¿~“ÇÒõ×Ï gýtÝ5!G{#d oÉ#1z£¹zwG û‡ûr«©äĬås`½ñUƒZà.P¿ÈBDn@Y'è뉅cx¿ª.¼~ëK²š¹`ۉξK9ç-fûÕX#‚LÕVÍŮԛäôP³+yë–ùò´ûEUŽå›ÁÐï ©FÝg%Ti¾oP•ƒFAª—˜ÐßË [xä¥ÿÚq`^¸¸÷ Ò êV#Ü+zú"2UŸ“iŒN¶JwP’…O;éhBPÞ·¾H£ºù€Ô´¬+›ºãۯ󭸟~ÒÍÑTõ1ÖñÂÌi{ǹÿ1í@«QÛ½«øâ«â¨f¸·ù£¨‡ŽÙ¼ î+aHæŠ'T-lI8ƒÍJ¡Ÿ¹Ü·_Å{©ãÚ×yoDT^¾É8â‘Õúvåªtt}áŸÍ¬µ!ÀS^>ò­ÎÓó“Á½Å=†«K@³oø+»n+gÕ¨Û^ªøJ9ŸÓ-&ý¤pù Ç7Íܶ¼Tèœðô5?¼ž¶:ò(ÃÚæ;½‘®æOÓǧ걱y't–HËí¿6áTn“ŒK&©&¿èt`§f`åöˆK‹0XP6èp¶ñ„!äv(Â\æÊ6ªªmý¿ËV-×­)AD뇒…i´·‰ Óc ÞžÚD­@ÕétÓ.X›'Aþ•ÙƒøXÇ45v@ˆ†é_dåìØ¨A‚c‰˜Üýq=_/`µ¬56 9]÷ØŒTH¢H˜k’0ÀS‡áa|ìŒyX80<˜cþö¥^§:õµÏ"øë×Wš ¢§ë:ô_P—a …_†š²¤ÿŠ«\?Fá3Kœ0x2RJ‡×º5L„ìÒt¯‰/•ùº.?¿¢ä¿¥-A¹„âáÃJ0wŸ-1™ebJ”5KN¤ëÓBR³ÙÆ ô%V祘š ƒ8+uÙW<ä]pãË¢èI3ÜjãP~T®ãŽu¯[Ž}#N…îæ9Vá$Üw 2C}¶ÿ.î3Âx8z±Î…{\}Fpk3ñëÈwء攂HÎn9ô÷SýÚáúN’óM> p!è¶%¡œÞcþmyÏE}Í ¬ìûk3P¨`ï‚@”âh9«Oñq´»äYE[–_lÝ/´ñîy)òVO…‚ßúÒøD´ú»TNÛK™Ê\Âî+¤¨-{ÉuÇ#~N­ý9W™ƒ€í,H>¥zO-ÞsÂ5MLÓ¼fFu¥ef83|%–Øvs³ò‹(kÁåZ½kZ_Î)á‰ZPUtpd¹ŒÒžÀ¸صJÞ'¨zsæÞœøßêþ(ñ5Äõßt–{¶ |Á]Ïj'ôâDC>©^0‡·¾ñü?ô ÷yü‡Ëëê¤k-I\Ü%¦YÞš%ÕoÀß:§vÉVðl ຠ{@b'Se5âÆ‹`´K«‘Ò€b°¬úw9Ú©ž>ã®k@g3`rŒ$lœögÞއô ¸}š^Þž¯òµP+Iå±Pý—䎷/› Pw.‹QüÍúP²_|^½T,dRÝM}𓈟 ‰ç¼.7û vE…SÉS%åP¡…¦ FË¥òKQ2õ*g‡km Ä«gg®ÿÚ>V™fXƒ£LU.‰»nMmþ”Ë-«‡ r"à$*Bo— 8+ŠƒàŒ& >tÎ}‹äÀдH/éð9£>wkÀšo)˜t ­ü¼çO˜ï‘‹-Þ==A²µ$ˆèÁgÐ}1ÏUšH³!J æ9%ÂùSPD[¥ê\wlÒ »fñòðŸdÌ¿˜ÙäŽuáfÊ—5äz±¨ö,Ó-_¼–{M6ëù¿0­—Vü_I`W³OÒ&cÛ'¹s6mÒ„¾<–™·ŽçuÂ1QÑjË*šAw<Ó=Z|Äêaá—ŠzÎÔ±œ¡nQƒÝWæ_b­ £QˆÀD`^âäÏYyÇiC‹5I"_ž¾)efvGwõ@ßJð®mÏ?oÝ"UQk·Yb1|ànܽ€ب¼j•îÑL°}ßïlüØŠ…u.V­\ÇñTš¼ÄÿO=ï΢YX1wû³ÌÖ}]¯)ªõžým kµ°s_ÀçCË-ý(„‘lˆdRfnÐü¿Õ¼Ÿp¥® AT{ÚDFö yªÙÈ^Lö²Ó8ч5üã0ƒ®ZÅ@ÔòÙ!ÿí?ˆØ~ºìžMZ{p‹]hùvC]‰w~Ýh8ЦV Zðo¹5jk:ÝzÅ v\j–ðЉ#ÔgèÇÕ¨ˆàÛúìŠ5?GZŸpû÷¸F¯cj¾:ß6²Í•s`›åéÆˆÎ›ÿêmŒUø±Õ,Vœß±Ïl‹;^[¦Ùº–'ú {t'Ì34‹gmÅv® ¦ÖÂ ð žÆ&ýàÄÇ–ÆÏ‹×1MµËb 3Uö®ùÆOÀ’ôˆ^,U€ øº?ʵ±½.!ü9(½jÒH£T±Ò_ƒ „¸<›­N&."+v,gÍÎi<õ@ùC£¶°á¹Å«Tn·¬2¢ÕŽì¿Ô-ã5M˜M? T²¿ƒAy)pa1’àµ?_]ˆJŽ…½›þúuõ„Ðú iTJŠ;\tXZ0ÚÆ¼/OB3µFiú:3%Fy™2ÞS½ƒþis ”/î2 ÀåÇ€?š”aøj&þ}ØWÄÛ¾¨ÎãºcÕ?F‡ªŽ¸ʰ5ñüèժΥÀg´ pÕ°+ÅDÇù7gÝ_›jZn‰&¾O4 eMÅJï£ÕË7S3sJlöÂ÷à‰õ`XtÈŽØ\à,88‘åÚCÅ—\}Ç}LYFõá…±fµÒ”Ë;?uÖ¶Á¢ÌËšÔ°Ýos˜ø›úôh³ïLbr]êùJ(GN’Ì'K⼟áðK­ÕºÜú6}*¦‡=ÅàÙùÖÂy¸dæôÀPKŒj䯉Óþ_ƒ¯ÏIõ(†Ö¿£3ÊÀ¡ÛŒªŒÂõÛÙÌ ³U|&ž&i¤¥XTÜÕ^’&GÖ*ÊçÜëW›/™èŒ1­Ï§Í[¸–˜ôN[µzÁ|I„B©Y_Ò‚>ò¦'ŽÖU¶[§/‹[´róÖC´ŽËoC ë‘ì?bù!ˆ’íâplVðãñª8sWºiÍ8Umïg$··TpãÜ;ûhLœÏÜ8ã›?º)w YaÉŒcpÄÐY:€#Ï¢¸XX´€]±ÀÖ"é¯ÞÍŒO:ñš³!ÂQÖSS> stream xÚwPœÛ²5à—Á ¸www†Fpw· ‡ .Á‚‡ ÁÝ!‚»IνçžûÿUïÕTÍ|½zuïî½Wïú†™^K—CÚa V@ÀÝ8x8¹E²ê:<‚nn>Nnn^lff=ˆüŒÍlvq… à"ÿAuÝî19 Û=O¨¸C<|žg"<‚"ÜÜ^nná."9 Ä Î PAÀÁ®ØÌ²'oˆ½Ûý2ÿz°€X<‚ì¿ÃÒ0° „Ônö`ØýŠ  ‹AÀnÞÿHÁ"fïææ$ÂÅåééÉ „¹r"\ì$XÙž7{€Øìâ¶üj „ÿtÆ‰Í Ð³‡¸þÁu¶nž@0à€B@`¸ë}„;Üì¸_ «¬ÐtÃÿÕþØí €‡“çßéþŠþ•ÿ 0' Ü·ØB `€¦‚§›—;·ùEB]÷ñ@  ´¾'ü®PÖïü«=W ÄÉÍ•ÓýÕ"ׯ4÷»,·‘EÀ``¸›+ö¯úä .`Ðý¶{sý9YG8Âîû—a ÛØþjÂÆÝ‰Kqv+ËýE¹‡°ÿÆìÀnnnnAaØöÙsýJ¯çíþíäùßwàïë„pØÞ7ö‡Ø‚ï°}]`€›‹;Øß÷?ÿ´°yx6ÀlcÿýÛþ±ïßâ0å¾×€û×çßOæ÷ò²AÀ¡ÞÓŸ/—‰®–ª’ÁÓ?ÿÛ'#ƒðørðñ8x¸ÂüA~a€ÿ?³h!UÁýw¨2ÜþSìý.ý«`¿ÎŸå¯Ù`ü3—â^´`Ëß7ãàÝñüŸ•þ;äÿ'ð_Yþ7ÿwA îPèo7Ëoÿÿã Pï¿÷šuw»×¿:â~ àÿM5ÿ™Yu° Äöß^e7àýHÃí ÿÞFˆ«Ä l£qÙÿË\ÿ×A!p°ÂòëVpðpsÿ—ï~²@Ž÷7‡ë½"»À÷ƒóÏ%åá „Í¯ ãxº¸½±¹ï…Ä+ ðå¹E°×o ¸8á·ûÀ}{þ[„ ö¯pA,aèo‹ÿÞ‚¸€Üa¶Ðû,ÿ‚yîeÈþ“Àe÷ÛüGe w—ûÙü­û²ÿeÿ¾À`/0{v  s¨k¹¨”¦òäØgÞ4Lcåðuiu¿ÂÃLa­È Yv9“NùÜI°°.Ïr*5Gwë»ý¡3²é¥vóµße¢Îèf3öÌÒÞ‘ÂméššÔzR_ýný ‚Q? Ta~íì.„§•O|áÙ­èUÓS:?1µ©ýµâ™*ÎMéÇsý8³à¢ æ<ëìIr 7,6¢/ü‰Ó³q¢Ü‘;:•ħØþ;ÏùÞøš¬ð¾¸œôY,Óãum§`¢0!§A=%}ì+óý• Ù´oñÛX‚FÎÞü[•lóhìz‹Í ._‡aÕL¹³•˜Ç^àˆÖ¯çAþX> -²µX±_ ý:Ä›`ÚÔˆäÏ„œ “³~“î»*£E¤ë ÜAî¶¥1/¹¤’`³ˆ˜ä”&ø³»{éÎv´ØåË÷D»t ÕÉãm-kK¦(Îå¿&@Ÿ×JlÃ_Ììøš*ak‰uÔÒLAô\"v7¥ §¾v=bð¦X] e•qczÔÛD±5tG¯Wi´šzîoçè,œ­DD¶ƒKšxê[~Ë%íu!q¡¾{IòªóñºáäÖ)ð÷36¯5û±–eþÈ:eÏWN¸ýIb9rBSÆ|dß=2>¾¿U¦å¼ ¿A|YŒÒ¯6WWèªg¿YÞúÔdØzÈ®W3Igý Ëj‰³_σêÙ!‹Íµ²Ž0’”kéÔMÁOö0êvݸ—çAµOsí€Ãs:{ /Å`ŠAÙ¬Ôã«5ø”e–ÒH˜Ä=^ò3Ny»£±Ú½o™ýÑZ®ßDQavU-Y½{s^òºñéÉ'íþùLv R¶4à3x™kÀ·ä€ìÆY¼ˆÊ`$拎a&å5ÿª¾×úï¹HòQZ.¾Ú}£mÕÚyŒp‰m >Š÷)1§+G]œ„'šõâܾy™è£ØwÞs‰/î1Ë!ñW˜„èÓ Q€T#f,ˆ Ý|È\…r™|àEk­ø~ìׇ3žƒiZ%Ü¢Ó ^RŽH੼í~dlL¾+yö¤Ü1Á‡¯·EŠvIò:ŒŸ.È3AO>på¡Hë÷ll?J‘v‹…G§ >–Êž¯ûglƒ¤®¿®–ß0‹¥ÆV(´šG(WŽœôP]>#võ¤IV"'ÒdVïc@©Êó!Ž;}ß³*Áj[ô nîo3-3WC ùÙ ÏåKž"VrMŽss§–ÖÓõ´X’OnQˆÜLä+” d)³T­´œå“Æ¢ȉf™¯[<ïŽ"“pÌ¡_ã'~R˜‡°Œÿ´èîã³O9ÓJ·–#’Ø2¸“`EMCÈûVTëF®/óPÊÏM)rŒú‹›9‰c‡¾TNŽ -Ÿ“™ºÜÞˆ<éc~i‡É0l[V‰GŠJASçXï‰yUÃÞ÷«¹¹:a)â‡k–Ó±‰“ŠÒ­g{xø‰o>7§{ëu.õ†®í¹ÑùM Û÷=Ådc½Æ7²÷xâc~ChŸ±Kµ$èÀ®é5Ùpº¦çÕ8צڥ­âÿäØHYÿ R¼SY1nPÒTJGÉmïX¢ùÌia„J}+Ø#ù^ºÐ;¹ciÓâLZ‹Î1W6G¶†ïîö)³,pàe;mx\±r%Í^E§‚£èÃs©9¥²ïf~ »´KÌó-†®OA›lù½¡†YܪrzéïpjæÂ¿ /èM†î§n8^`NwMpä½ýÙŽú³NÓ6S†µ UTÖV^ˆ³WÙÛwií“âÄÛ½ðäïêˆeªÎc†Âeˆu(œí›1ñ¶>®©Z.Gž~T?9›õÓ—‹YJ7Ë6´ËÖ3{Ð1¦åkË©t¡Ýz´+4ÂeÔ¯GñH°U'L†Ëä¡ç…oðy€a¿Al )ÔâÜ^²uTÛñœE§'Zlú½€§vr]Z¹Mõ ±6Ïaå5ÚRˆu³Á)êÀDgu¿®÷g@ÁÀàjœðã* ³¢†’¼9§á­²Dw•v>¨‚ ÁvŠJåQ#²,Á/fǯçjÃ99ò”ÄV(°†(𣅚åT–fM¬gj'¼È47„î1î]_!ì½™–ÞÂõÆl¤ÏX(À¢Å öÂ肯®.0âŠ29Ïö¯7åÞ²p“/òK‰òŽšï…ªj7±:/ì¦^7ƒHˆ=}Z9ïRÌž °%® #é|\ã»~}jòä‡;Úsí ž­ˆ;Urõš,lëÁôÖá*äF÷—Ñ®zÆ7öÊ+´°ps›ÅN±÷ùIˆˆË¿œ–žÆÇŠÿ,øp–ãþÁhX\qÇ»éÖâ€t¤]¤;µ»[{È<¼¯R%;ѵx¤ì¯Ö­kÚV~e¯š±üýe1?‹Z7Í^òVyl*q.gQ™ w.4ÕÁ`$ªi¬¬|ÍîÕß¡!Ø5oæõ±19!|*¸ÏeQ¿Êáˆ&UßT—N7ü<"v©Ãíoº(˜9žGX±jö¡Ö\ÔrìÉ7ª÷zU•W‘m–!ú0ð0:<_î£Fœ6,ríZjÝ—ÇØLïñÆöC2¹Ó¤xºò~pƒMœŸaɘ#á&¼ l¿Z"¬F”s‡ÿÀB«² 4duÂÔë\¶Ê/òã#Ô÷¸éǯ&¥«Ë_Ù)Ž…¦ Ü¥Yu‚Ö6#ý“œhÖr‘RÕ§DwÂCã%äóú‘Z¢D!» d©—?q¼97;P&l) &)1WxаQƒCòg™Wis ¢ˆ|¹°m&™¤2^ˆ°õhÆsÿPÏ¿léìÐÈÖ¦r\y·a”‹m:3ö–Ì^)˜mS/½!¡ðàXŸ³¨P¿ã ÂD nH•”¬5xøúNÑ”!{HV”©=0¯£Ô }‡¥N{ì vÒ˜@}Ä’Þ»ãvÛ‘ËÆ“ Р\¤°r3š Öxþ¹)—l⹑¦$}&‚¸®¢ÍÙ—ýçb´Ç»ŠTî‹GT“=Ss{¾-ïXìæ£9koQzn$oåO† ø:Ïñ{'bÏC-Ï&§ÚÖxS$oC戞Õdgnœ£ú†p‡Ÿ6g›?®¡x•lP6<Önl³@¡¡”ÜôÀ7ÍC‚e¤\Ÿ„9è)urÇf§iÏÇ¡X¹ŽM¸>b}®ÎaÌH_‰Â­†äÖ§ÏO@’4–¨õ¦“¸— O=Ñ!‡!£¨zˆ›")Ý^裆ïðØ&Œ(HSËAšc¹~­”IC0Ú'"H2AoSÒî‹ §æ†§º…²ô «ÌDÚÙòmq´QÕõÕF¢ã¤r8†°z÷ø×Œ½76¦ºŸYìX“n‚¿U{ _2f!~‡EcPU—É«‚-«‹^Ë–ºr9*XŸÈ,,½ Dd›<åÎ8%èzã¦ÚUðµ/õ²—Ua—UöúUŽÔl WeX sÚçOÇ!šoÕøJ–‰’‹"“AhïËë1NP±¤k%º'S±uå‡fô ·ÆGÈê6«·W5~›ÃûŽŽ®¢D’JÒ7*F©¨©Ïï`SÞRc#ôYŽzÓLkÒÑðŽoM$U«>µO#O0õ…×î]iO¹Nµ@Ôùe]÷iÜ~˜ääÄôÄ*Š/bl•ví'–ȇXäã3iá_Ü·ÞãÒ;YJæt€<Œ‚Ø 8DC–^Ó½ù$ö6jŠ˜ŒfÀüPß/ýDB¦<”`WW>Ôs9D|ÉánIï ·÷Ï  9ô®<ès «ÑÈ*Å•¬û°¢ð0˜Ež&¶ÎFAL¬W=qõû©_ Ž ž{¿­µaqŒ h½è®'8¦hw>fW«‘3¹â¼bQQöu7)´ YPû;”[Ý ò;Zk€–Œ€eºî6íŠÄu~‘ ùáZ{¨¶Úñ ºÍ´Ü@Žd™™úB’×< ‰>V(z¢ö…:ÒÃT¤ìmÀ¡Ÿ4CÚƒmeäcvÆ“É5®·E‘؉œ‹uûaWS8N]™ñ^Ëk^ïtŸÃ<ñ‡v‹×²OØ×Õ!’»%¼jÍM. ¨j„ì+õ%ñ‡C¥Õ;TÍ÷ Ýh;†? VKý|óUúEnƒÔÀ™ŠÇ);àF®½fŒÉrÒëà ]®Þ &ÏžTùç¥1$Æ«xPE¤Þí‹üôÔ€5ûç ±ß’ª?¼W 5Ô×=-ÕzÆó`ýCA …Ç·•þþdLº6'wUL¸½o0˜à4ƒØZ9ßj?O–¡O"(ý"W"ûÕúîÙq©À“bÒრ@g-]v†AßN≙——Y¿÷ÏM†7+DÄ+»Þ~•Øu/« «¡ÚÁ §´dI5<–³ ¡nÞÈ2"äÈñRŽÐTxQŸ¡ªÔQÞÌñÓ0¯óŠs8v“™Îz|¾¦éFí‘BÿÔäCÖNþz1É xŠï‹=JÃêIú%ì V¹=rz£—O(ò2­T¤‰C†>ozÉYÕ:k{Ú;½jU(o¼,edQy.õÕÿK§øž -½ÕÍ!ënA›í]°&öÖ#úß!º¶.òü#çÍ8ln¯¼Å’/l<:X6³bÏ{3V’®W—o´áA®±H\Ad»PÉaÄàymKõÑU>T!’îi§£È͇`FcrÇkQãìO(\2gV¢ÕQ™ V°Õbq* SúÆÙ§"yœH•¨˜2¡éµ “ÑnlBÀ:#¶º5±n˜ôÞy¬¹çÅbÜcdc&}Ì‚Œ8FÕÉÏÞµYs²ÛéH‘~tE!øU­œsòÚ6Æzqé„öŽŠ5ÁpÆ{ ½Ìñº‡]¶G_ÀKÆL§E­OxöÔæHù ™ÐdéÒj޳ñ衜ì±þo4!^y×dJm”ìèåä1¬…õ,[¹¦Ú†ÁÊÅ¥aµ\5ÀkÞ ¹$'«;°$Û~»ÇëyV+-·C!ýƒ%™cÒˆ*cá.üÜÉ+@|??Ø»¥êË«{›©¥Ò3áó3@ÈŽž,áã¨×©%"qEÂa‰Ûõ¾éë±Ò-º0Ú¯©Aæ ±·.ò³›QŒW,Ôsö‡yYÝzíP=£ú&áôV•è€Ô+~™¨Cç¾’§iÞŽ¶}sl!»9ÎôÚöÝœ…B´šÛÝqNU½‡¶*’úìé;c!œ%{7`Wé¸tL´øöîÓìÉ<¸6ò{!o-ôŽ¡«C|&§ tû¦^÷‚—Œ{3ý ÁŒ¤Ð|¨úÄR¤ù¬RÓh¯³\åz2NoŽ,& 8sµå™Å³¡‚çrä—rt Nª…d©ïÙÀѵúMíJ…bÌAMÌÝý/¦‚(WövÈki7Õº¸¾ÁæÍÉ«CDVÂ}õÒ'tjRTï9‡Ãv°€[MùY ú"ähyÜ¥ÓÌ©^B‰¤Ùi´NÇ7Iê »·¨º*ÄÎäG°dÃÊ´,)ÆÑ™ÄŸ&á>Z$Ò¥Xh¹›½æõµáN‰Fˆ®³¤+êÃoõö‡áë§Œòøç0ÓiÚçØ“CQcÌ7b:æE¶ôJR»®*#‡d»Ï>Òµ¡ñ¿™ÿùÒ=ïR~ÂýTy”vfjîjÄOìýˆÝá¤w8ͤa…ܤµA·ù1.MÒ/µÆDHw_y½‹õù±B&™Î=<"¿_+SèÑ*I­ƒ¿Ú€ñ M±å]¾)؃ß|ï®,Sz¼¥ 7ƒ³òʪJƒn ‰3þN¶= eáÌ$âDŠ…êƒ“•nÝÕt"1L0fÙÜyhÉÛ5išNõn ÃXm˜AKѸáchH¾"|(“hÀA¶?AmÿøóWu3¤Áí –]üÌš}Tf œƒöO¯\÷ïbá >ÎhX;êÅ¡Ãø·¸˜¦öeï-‚õkùV6Ò[%*…TK3 g……R§ûϪŒ¶ZúÝÆ|þ!Œs¢’éRšÔ9´9ìá;V§å|ŸJ@ÎD•0~7l¯ðåœ|deË4Õ™b î°>@áIXØv„@ÍÇ\Æ@nŽÏ(ï‹ÂY³¯ÍÜ‘¯B¾D~½ðv Ü¿øtô8Wµtâ0ØE/Ž¿û….ÖHãiߢ¸E•ßsE°ÕÀ\<‘†øÅ¥#_«Y­È×ríLšùÓÓ²Ñ)ß—ƒÒÔSðÙÈ( “ÇÛ‘4°Î8ˆ¹*ÌçCÂ脲—‹Þcbͺ?€)ªt‚uŽH8wIâºÆk³ùù ÷íªBÖD¿…­œÕˆ¡;Âï¾ZƒŠgg«;6 0H×û¾9TÕžM3"RœG‘.ËÒ„NZS*k¼I'‰øÄ¸p¾XR2‡˜“î Ö0IGE ;¬Ó°P¡*¦ø”±žìEâÖìù.h,l‡Èâ ÖÚSqÝMÊÃȈƒ¨#Å"ÕÉ4lr^r‰®ä4e\ NŠ.¿?h>Ï#qk5=ÛˆÑj±É~ûi¿ùsÊõ< ÷ù±T7áZ×꣼žŠiöɈçÛ×ÉL„F õD±5¢ìv9ÐyÏL&ʳKi jÀ¨î(e ;ñ°S2áØH6XÞh{Ĥ­° Í&Ä‘¾b€¬Ù“U÷ÅøÒ‰€ÂëŽçˆ!Ò}Ò(Ð9í˜ADzñ™é9ê3„«ßª©åç`«L7 ñ…NŸ˜Kô·ÎÈþô0ô-¬/…Þ]`Évf`÷…uŠäEÇÜUÁ%#=šä_)—•§X/"#XŒøáÜù9nŠq?ŒÒ»9ãFd4!½¡’À{c*Â¥é‘',Pz˜¥öLð`ˆIih--#à¡ó˘¥”ã#þÏÜVÁgâ¶;‘§CùO ´ÙˆmzºFNó‹.Ø;Äšbü‚úöÕ‰yh#fn‘ D—k^¹zø c"Ókª®S…}¨›µ¶µÞîL·FF³¢b†çn/¾ÿ°Poš÷«!•âMr[³ýs1ïRÌÖçtlåügƒL\I5ñe“\¼·íÂÂa õ²Tе© 9_Kÿ˜’t§Uùýÿ>–h öÅNR5ë(W”Zé%%Ê‹QŸ)ò—«¼(ükãeMÇjx&fO®ÐVÈ›‡Bºâ oS_£fmX™$Y)¯î·QÇZßEŽIKôy¶†v ¬ùl­Û€ørVýŸã$-,ÅÁ€Cõ¬Ê䘜¬ƒè$§óAóñ¡ö*kñÒªLåNAÃ`á”'nÕ‹êå}cz…“’+˜ÐUØÌùÆù[?jEÌ6ózÛ‘¸ÖªµWkg5'Û•Áƒ(AÝ*¸\z¦£&û½‹ïèÌÝz ?×Ì‘­]pœ,aôóü}> stream xÚwTj×.ÒCwwKw—”0À#0ÃÐ)%HwHKH§ ˆHwwt HHü£žïœÿ|÷®uïšµfÞ÷Ùñîxö^k˜éu ¸åì 6 e(ÎÍÏÃ'PÐÒðñ òðñ à03‚áΠ?(³1æ†B$þ—\˜"ŽPÓ‚BêÎ~A¿ˆ¿¨@€Oü?ŠP˜@è ¶hñÔ¡;³ÔÕvp„#^ùÏÀfËàåúmsÁÀ¶@@ w¹ ^´:  ¶`Üç_.ؤápW ^^/// ‹;æ ÃÎðÃú wÌdø•.@èú3ÀÐìþ6€Úý€08ƒmAw„Ä Þ¨it\A?Êš¸•ÀÏÃÿ·»¿¬9C~mm¡.®@ˆâ°;ƒ:Êš¼¿ÛêzAüþœíÁ;û_)Øy¸òAÀn 5Å¿4Î?˜æãã€Ü o[GÞ_Î }\A¿…ü¿`Dü~®PW€="PØ„øÁñsz‚p˜(Àï þ}ÃáçØmá‚ów ²ÿsGtö˜ó!ˆÇàûõùûd‰à–âìóúïæòÊ«ö&˜>ÿ1Eœ7vO§žÈ‰°+Xìg¶.w5ã»Ri(àÞAÅDeFIƒzN<<Áâ'¿¦N1ç÷¦x 6œ>Cþaä³K ¿ó6›ï†¶þ%lçûSæ1 6*J^TRµè˜µVÕ$—Rú$ ¡œãeõ5oµï¢-6î\:Ià{gÑz´Ê©úMÒG‡äO÷Ö6'G¹w•dðKá’*˜1R’Î'Ÿ°/‹u R ?pèÈ~oË[[ø¼ž~VKœwC7ñˆûîúÏ2ŒK/€¥’¦»)|öR ®›j­+_‘ÌÐ ü¾ œm.·õÝ¥—-)n µ¤Ø•.DfŠ–¢ƒ­-:NÜ*V+_ †Hj}T²Ï5sÏnS²"´©Å®^í èaHì|*"Üô¿Và½ÏÏÏk¦þ9=èü`"¹;VáxEÀº#8NÓCpd…`ý=¹â(:ÁŒB_™0í‡‰Ì ÷é ÍP#*'JÕŠÊnK†öƒfLÛgÇU“þ™Ë›ï†½«u^xÌy·'9¨lóú#cHì³hC‚Ž™Ô”ô6|n¶VC…îO§eÊ\}X¿Ñ f„Þ?¯ð,ÝLQ÷•MlUj¹œ*?ÚЦgBí0ûN2cçcé §ƒæIçQfe ÊÄj3O ù?X²Á ¾’ó(ÑúÆ›°E2†hi'6‰,rÌ)IÎ~¼Wè¥*¬>å¿ð.]ùÈêØâcSçND¸È#ö|¬V¸ºÃL¤Â$<äÀw¤aè|‡êz3÷xAÆ’êÞþËŠÉäVØ’¨^¼Šñ^Êz%¤ˆ0p(OÚ}Ç,Á:†¨ð09‚c%Pw›!— +~1Ævsþ‹†ï]JéË[#?ÓÏ •·ÚGÝüªRÓ=Kjë·‰eh½ZÚôãÉä矟xíHo6èKFÀ«²æ)³“9-kwI̦IÂïðn¡î^åÉÛzFÏÙ³›Å¢«û/¿È=öyÊx÷Æv©†´YA‘žgFPÑÝ/EÀ³Ur^ŠV>˜Ôh£h·Ï©RÈó©¹ð{Ȇ„RÌE±¤Yîm-fÔØÜ+/»ºì’`¾3"®!p|—?UŸ×IÅäUlQ£n‡)ÆÙa¯$]Úñ$êÒ³ë}‚"³Ìiú=ì  Fb{_“-ÚK²©§Ó­:¡’Êj¨EÍú ™[×Ü(öçÏÚÎÓ—}G1ß7LŒÓ.²÷öo¿Æ¸s®s$Sqg×ЭXtß²=ê”V4·c|³ÊŒ>Ocg|³¥µ.'}%¬Íô†’_/Ý©ŠÀ±b³›ØÿQMÐv³~Û£e²¹¶h逄Ô1‘ާ(Ã^E¬ i{tÕb©?˜³r_„““Z¸L+Šõ½‹„íÔ48F{™xXu~é2'oJ’n‰3î³|dZñN@–¹ §ªµg—ý%¯†~JK?Húpi½µ ÊÙ*쾉Ï`;l0M¸õe¸ ÿüG—ïM™´3:9×Ddµ´OèÍ¿†,Ìç£ÅY_ x¢Ù÷ø¬€-ÄMŽÈN„áAvàù`M‰É¨"³Ý"ú­‰ä^L.õ¤_Õ‘÷L³Å¥›Ñ UºN²=#>ï}î#…Â[I¤Ð¬¬%¹I+¨0Ž)ÒÞ=¶[è¬Co<ã× ‘ãö_‹²á·ö­ª{†hLH[*¹1³ ,ä郕=ÈüÖçþ1“á­Í.…¥¾Off& ¬_‘ÐQ3Ë`†}·ÒWDkSúK:Ék‹ŽÎvÚ]/¢þØ~œ©L„SgµRsëšXÿ¨¿šþ„=À_/ÍzœÍ5»âXöé{¨Soüž‚½RösákeË—ãÑ>iGÿGÃvX˜ã¼lYî¶:tk‹åÅß*Ü{Ljã\­îbÇ3S~¾àÏÃD&ÓÁÒØŸ:ФÌXFó|DªÊC*3~óˆK¤1…S±÷Ý)ÌQSÊSŽSdS½Ký­øÖÆÒÇ„C² ‹gRô¼Î¯Ó»¾í~¦îM­ëp¸7FNêæØàÀ&]ÍSËÕ³µ8ËÞס»É)˜J0LÛ½ [ùI"žóHq’mgÈeJü¨ Ã4Gžãu ÿBLt…¾~´šèžÔBiOy(_¨]¤KwÙy¬úÄ¡“Q¾y”Œ6Qì*¢(ü%/¥%eÿìÆ¡x O%%%Q$EôŽ?]JŸa6–ÕRÅ-mboîÛ|-gÒëÿ\Pê”+7µéJÑæÖ«:*h,X œïÞøpyŽ¹Î¬: Wš†ºòN­?¼¯ÀéZáæàH¬6䱌^­M¸r9Ú.Éi™ï)«k>‹Á$£F&Ú†ù4Ú×Hq!@ký 5é™\»Ï+ºy Ú%“œ² ùõÖó:+’ÂM¥=óÌ“5–ïF»·MOÀUÇ_µßרzŒ~„{«¥[«½Y«Ž°08V© иû•»¨¿îb¦Z©I;*±“ó$‘¢z¶^ÝRÎm‚–{ ±FÀ%M&oº[yçRP¾ž±b€ Ãñ«ª ƒ®{JëÑíËp­{-x«YÎA îQÍDŸ‡¼ÓôáH…Åz ¨6tGÉ{·9u¶Š=MÊd2›uÇÕ ï×6µz?¯c!p†áç}wì‘IÞz ³÷%gÁµu…ØÊçÇ’ŸìÌ ‚N¨ûiQ®>ôÎ;5a¥\?vCN\gBõìpgF!I–&\ Ðõ!µò*ß)mö{YÙâÚ)’½6±‡¯‰R¨•vë’ Åx‹£¾cú*¨±-»b‚i<¿*ø(â ía¯‰HK¦?ÝFfB¼J<©Zz³u·½“ÛC`Àcø;t3–ÖÄ.éoX‚ÅaÓ6hj¥Œr…±BAÁUý½·erj¿åsÝ”~gß"—SaõÚ;šI8Ü©™ y ¥œ%:ÆË)vZóÑ¢`¯Ó˜§!;jáô¤„Ü–ÿ©“øu﵈W±|X¡ÓUçn1ò`gº¶·¢åHž-E'¶©ß¼÷h&Mÿ.Ú s³ÀÙ”Òoáí™®²—§6Í"â Ïå/”ßpQªÄ‰):1Lg—“~îÁáu¡FþÐ ò´• 7a|#XÉ·µÓbªbßã©‘»x¾ÿ~­³ÛÎð† ‡$T‚-ŸYa¯uõ¨L ÜüøhÄâ<Ǽã gù<6 ž:¹N&½k¤u1—·"ëH³BÅ ñÈÕœä"S41"¾‹™ö~‡D%íÊèÒ”*B3å-‡Gãý]Ïì''3)vü^‡ÅØË™f@_ÛœÃÔ'½•oÜWÅ´A¿}¨+Z6à3ÛåêIëTj¸8ÂÎÑ'/ÞýôkïÃÄ5û0J§…ÓÌ—óÖîÜ5ÚÄ[3Á¦8Ïõâ'•Å’/›ƒ~©Ö:è¨o´£R#öí E‰´¸‘ÀJéæçPò†…ÚÛÚÓ„UÜ/P×8ëÕ"š²ÁÞ'žÑ‡¡e¦Ë¦¾ÑV*ÜGÉìq5ä‚@Ìç£iE!´PÅË~£U”JWÊï| ’|‹wÁ4Dz«K“K.ºã2Ô CŒ}©½×µx¤q†ÂêôÔ—AWKµ6EÅXf÷¹KJ¯ò}žC®»Å_­ž]%O 7ת„Õ®ÎL„ažã\T¤pš Õ˜Së캒%êºØEípUp¦SvÞ–žîD8]úœêK1á’|[ Æþ,pÄb™üñŽ<ïù¼t±Âtþ£ÚÏÚ£xâä¢MŒåõ_{µ¢Ïϳ— ë:då}ɾÏéOŒ´äê‘ÖûV”ÍY“¸G—îŸMé>Ö ËÄÇWáî[è‹k} Þð­Ú8 Þ`$HÈ:ÔjûY¬Z•‹éý°ëÞ˜3©˜‡mʽöZr}ÈÍ CÇ0o&óÉÞ¤¸5­ z؃&]“…"éQèÉÒ„´½ót‘5Uœ«bñŠË™o?zÙl·å粈ú·³Åè¾/4R8ѼÕÈŒp¼0ë$ÎδZ1ó]&愆nÊMÛ ®¾´¾ËjѺ)<¶,¹äè+œ{-þ•( ~E)ÌsYüª4‡2f–¦®LrúŠAx¥e!Ï&(s'ت0纇ظȳJtž xáîH‰(Clóùé7äZ|ë?¼&ëVË|¿;_ÏièÔ¥¯ÎX’ X0±¸ŠôLà!Dñ –&KÙìírøŽdo)ûL„ý¾×ûU¹Ï½v¼pa´×”„@NtVä¡rló–ÇŒ’õaõÒ”ü¶w×ÛJÍ@DK#þÓ¬Ó‘œÒhí’sã±íº¥Ü¢1¹~y<'N”®Ç¬cî]¡­V’­˜™•ͤ/ÝÎÙ¬ÊnßåH´ñ,H°†ÓšO`SË¢ÙÜÁ{x´K0ü;¦u\zº:x#=jÖEåŒ*>±7…ZÌ™yï©âÁ P¥'yÝC@Þ+ϓόRÏÌ;&ç8©¹ö*êg?ÑRRr ¡béà1¯½`B'Qe½é©SÀ â%n¼kŠND{sSØ9ãÏUè)Ýr°‘M§Yžíc-bНËñnó,5¶Ú!†ÉLê²MáßlÕ18‘o¢·“ÃÄÙ«²4avè°Ý0Ìÿž½š×Tf‡v/£)ÐÙòTûYÐ!~§¹öÌãÔ|³·?h6%—5D·$kVš C~Ö ày)Ç×Ä%2LÑõš7ú(V¨÷s1ŽØuE™…Esˆ¼‰Ö24¾IæFǧø y§Š‹¨±«1`3Ñ'vÏð¾¹z+Ö~MbÓ-ôÑßíl$ 52xmO EwEJïGõ2G¥d¼ÔƺɦÒà!WÛå†F5î¼mhëaž†{™úlV:^) ãd&JàRAˆyè´1¨²–L€Ó¦wØ:I^HÊ+Ù™˜Ÿ°˜x ðûOèã ÿ{Û°žG±ü?ÕúQé´" >dÁ ¡—‚iY%מ8+L,¼Ú"¦@'›Ó&`,éKˆkÂO‘ñäâÔZ=áßÝêpu²úZ·_Åw Ö ¾IM=Š i«R}TC¾y.Ý«/8ÙÒÅc ã‚aæí~±[äågjW׆:ózx8z¡÷dt¹)>ËlÅJd?e>V²®½X ŽÄ£uÄ 3N_±æÚ>÷„ ÒÄNù­Ý$Ói_º=ʱjŠ“Ú ›RÜçÄ.½G^u$[¥Žª¤% !‘ú¼æÙ=öR¥–¨ejÃPd{Þ|["]QuX1E«­ÌqbÊé'.ýÈ!¥=>’ `4QÆeÁ ¥.»`œüÙ°MD‰*‹Pè 3“ `{Eר@nl&Ÿ^F»dù&¾Ý×`«§T1GØ/lxÙ]yú§«·ç<Pz‘Lr£Uè >ºáâÓƒ'€‘˜bfCüºu^©UãðֽʬWÒ-ç ›[cÙôuÜ|MМ¥Ø¦¹BÆ“ðc0Ô–ŠZ±Ïìä NX˽˜pt·îb-¹Ç1ëg¾¹­a/¨Þ¶kÈ>Êð]n÷Ãüg~•u8®ñ­eÞëÔäöbÙ÷9ZÖ‘„ç´—Ã:áÕâQT‹ùßvvn*¾ßm‹Mìj²Æ>[ú±Txx׋öJ¦ÈÕà6ˆÐ˜1¹ÓCB惽õ>ƒ•|’Bï¥ÝžŽ;æÃ« üz f#»ˆ/úsôñkYÎpcáèÚ±½‡óÕU8ò1á"­ƒ? ¦ŸNÜ‚ºŸV §˜¹ša\ËòIO¿H j÷¨£‘v4fßóŠÊ½\+…%Δ( åøÊUm¯â›ÄÆ¿1[Ϫ.¸šµ^¸JøåAƒ>ñtøm1²–Ÿ7xhmÇÖ­ÿ”Úƒfâpªæ÷ (*ßOÔ•r¨Àaêpv«¨”¨Ã®ïɾ¼»çKæCO‚ÿ’½‡¶, ™¡A¯ ô õ›Sï~bКêÉéXºÝ‹5ºP^•¶žç=Dë²idüÑÛ0k´”xB «Ïmw;J¼3+o‰A£Yè*¦oÜ튡U9óf_¾Ž|.»–DfÌ8ol%«r‹éÙDq–2SÞÖ3p^3vV˜ñÒ¡,¨",£ôX Q±‰!k‚&Uå)‡b8óÞQ˜ó€5%Šƒ£ï(\Ý®ýóU–9wkcå*ër2ŒË®ˆI‰Å`Ä–OXlñ”Ê­§Ñ(ö@cÆf‰ -ß2ÿþNд»Û 鯳òZ:×*4#GMûí°ý³Sàž¶÷¶È^þÉ& ÓæƒH"$+—[óžr-¢Ý‡ußPÜÍü6>\Ua— Ãë‡jÔRI"·ŒÌŠŸ&F^ç2÷øâF ûŒ–1÷™¦Ý‡âÙ®'ÁêîÕ1z΂(ÃIJÍ Ì—j”1Án­àWêñÅZâ<ïÞƒÄד[v:ШÊÜõ=e¤ð[ Áv­!)–[%% þÁR_ôƒYì?³î \ dPÎòêˆãœæ°:²ñp^Æ&ˆÏ¢%ã±k…ÏþáÜéͻԊ‹ÊpløZ=ö–˜Ø0½/å1Uo!ë6óÑ TF*6Âíýºÿ‡$аbzJV²Ý•Œê¹ÚéOP³¯ãòÝ3w:j¶×nÒ>aÐ#@Ú“”1ʪ‡#VAmöœ0k}òqÃðHéÃú–'Ûª…ö–æè&Lê [ÝÏÓ–¾ëãó\Ï2ÍõV`å$|ò±…átñÜÄé¥ûŠpÕ¨ÎSlym“Oª…ÆVnõ¾nÜPÅ-6ìïJtŽ·¢•΢‘c¥µð.¾¸í½‘Û)lÖÈŠ£rzêÐ;,úú=ÎôŒI“dÙ¯h—…’Œ“¢”&+T9¢˜|÷á£ÄÝÖfYK~ nC§^¢iL!µ~NÁÁL#Xð€V­@žW¯3í½Ð%–Û,ʸ35”÷¬?íö¦‡>†ÍW•$ƒ´Bû¥ èuº =–w@ŸðÓÙú^ëN±½Å‰çÆŽ¹@ñAã…û¢OzŸPfŸ&U¤@è°÷`ÏúÀ­¼ È’Iúe°kŒq”¨šþ…@.6¯,Ûô«8@P8®W®rÂèÀTê=“«ãÑ+ö´¢’QGÜYzýý™âVUqº0y^By@œùAH±ò*;¸ßc}µr±LðTØ83º,†„K{¼‹eF¨‰¡I f«¿äÃÅKœ7È ä ø×n€©ŸM¤&¾uÇŇ6ÓžX5îê-]šCö¯–¹ž&RÙy.¾ÉTõ홺|¨Zƒ§H_’|0ù&Þr½Ã¬jÏÒ÷éÏU›Ž)¿]tÔÕ>º ”¡¬í4éAZ!ï£ Bóêö CzE`Àë`3j~*ŠÁ™hP¬yŸ ©‡‚. µ„qÚå|øpãÄŒza`¹ÚHñ`f¡q ŽHEó ã:Š÷™£ƒb–¼†Â1eëumûÞÓQ”˜&Þ‚À*Úo¦¨laÖU£NÔÓÄI¾)‘Z¾œ_ECUX¿…æ¸|ÒÏ.q~xx¼äðØ]8 ØÔòéñÜWù…7—Š\ÏÔ]yI…黩HV£!Fºô öpÔ$hÿÙ)nû ’ƒ½´N¢ìŽÏ‚‹5(ñf9A Kë¡lAxì5B‘¯¹ºÝÞi²> stream xÚvTZÓ-RBoÒ%R”ž„*Hï½wi!%jè ]AªtAéÒA@ªR¤(½)Ušt~ÔûÝûßï½µÞ[Y+9gï™93göœ®[z†òö(;¸ ‰€‚%ŠÚâ@0XX pq!0®ð?(€ËŽöD ’ÿ‹WDá˜+L й2ÓF!^®@ˆ0"& —ƒB`°Ä QhI ÔaÔj pO—"ÊÝptÂ\òŸ%Æ„HHˆóÿvÊ»ÁÑ Ô†bœànW' ®@C Çøý+·”ã. ùøøBÝ<QhG~ ã4€{ÂÑÞp{à¯r:P7øïÂ\@#'„çØå€ñ¢áÀ+Àƒ#=¯¼öp4ðêl ¡ºP׎üc¬õÇ€ø×Õ!‚¿Ãýåý+ùÛ ƒ¡ÜÜ¡H?Òè€p…uU´1¾~ iÿËêꉺò‡zC®P»+ƒß‰C*òú@èU}Uç C#Ü1ž‚ž×_‚~…¹ºde¤½"ÊÍ ŽÄx~å§„@ÃaW·îúÝV$ʉý³v@ í~•`ïå2F"<¼àêJY\A€0G8( ƒÅ%À@¸î sý näçÿMB~ÁWùbÝQî@‡«àøÕë õ†1h/x öÿÞ  =†ÚÁHÀ?ѯ`¸ÃŸýUçÑ_à}ð•ð @ð¯Ïß+«+mÙ£®~ÿ˜ÿn.HÑ\AO_žïwÁS (_ V@H( $ B BB@ñ«Eà¿£èAeþÇWé€JüIöê–þ“°÷_Ýçþk0x€ÿŽ¥ƒºR,ÈýÀ-Á¢`ØÕäÿ[æ¿]þoêþåÿ!ðÿÎGÅËÕõ7Ëý‹þ?X¨ÂÕï/þJ¯^˜+ík£®&ùߦ¦ð?㪠·Gx¹ý7«Ž^Í€<ÒÑõïKDxª |áöz ÌéTþàÆ¿Ì„ë¡<¿  þ/îjª`.W†ç•Sð«¡ù÷‘ÊHÊþ×t ‰Š¡h4ÔpÕâ«( ¹C{¸ïoA‚HæÊxU^ Ð…ü꧘($ÿ ú½‚WþºP^è¿ èêûÇaœÐðÿ…€¯Ô?w 8úð¯Üa^hôÕäþÖÖUaÿÙÿ~&àp_8 09Ž‚Ý‹p®ŒxwT!Ïì#°<(=µlúŒG;‰nò:!'Læy6‹>”Oîm§ü²¨Ì} 7ÅvŽ]¯KÕ¤ßxpf“hðq¹01|ãýÐËuùª.Vb#¹•€s“P¼úk-\Ù^wÉõriŽ|:U}«ºJ¦û#Ç—õW^‹i’œ•|xhoZ8Ê•c÷bŒ#ÀJÄK½ãK1zp8B5tɦ‘ÈÜx(œµ˜zt<æÿõ•‘g+#'£+ÞuÿÇÛX…µ úÏØ¢ü™¼QK¯‚á/­8VªAã ÄâR~ˆÄ»od{ðn­8ÎÿÜh!©ëCò«F—O¥¼\9ç/ .wÇ]Y=dõSnaÇYK¨k*Ù[Î^Š+½M£[‹ Ñà¸Å$-}pç)Û:nÊ›MfŠMuŸ1¥üV$ˆŒMŸL…\ûmP—Èí&3o"Ž;“ý¢¸-  "J#CÚ•wFlŸÄ¯a]Zý€™ŸgÈ*Ì:à¿JOÏô‰—™x·š/ÚÅ©x×Y×g­é‹Ç.ñŽËmþ¤Ù´þ‹ÞhØMö$¤ìaÁà˜itOfRÊXM+Ó +^ñC—Ž”•ØdÛ͇eµO;@û ©ÉHRxd“« ‚a„KO—M»Q͉[‰çcLÊ+íÚwàžGÍúˆ“ˆÞ•œÄcﺇÏCôHM¶–‹nL$´º#\ël·Çv–l[Ó«Û”KyPD[ß«MwHœtâÚ¦[ëÂõzâ' >Am8·¿Q–‘õz)ÙÓFN?Ò':LU`´0tðó!]Ë,òmŸ+h˜Ÿý¨s,u‘™`þ´c6ï’,N?¢ž^/ÃÅ|¶8 ˜¸3½l”vÉSDÇ©Î5xé1÷DO£J@›:ihÍÄ×e¼Ý·kCnæÝètŬ†˜SÈvÙ”´“üTÅì`?$e GÊnÜ»a† o¶¯³¨­8~v8£èà“.¡òÛ¾ Å,÷õgX% » I3FæÈÅïÝ'Wýjå›×#*Qù¼&á^Ý'<Í> bÿМ¢±ï"¦²±ÊüOÆæ%ÛDO; ²0Ù î$ˆÝn5`ÚF/ƼL>’Y*¥`¹M¤Ú%‹Î· K/"OëÑâû´0$~éx¦À‡UH€­Ngf ?hó¤§ÎÝzûJŒõbÔÜìÈ–¿I8íˆõ6µVÀ)¾óâ+÷9 ƒy>N銓N5Ól½á9áÝ€SÜlw·40{c~³±½øjÍçfÆžû&f™ÛÉ‚˜¦×*šÑc5~õæAÙyo¦ª›†Ç¸èzÂüÙ¨jÏéJ?ÒëÛVrÅYÚ×¢2rï6ï®±xHÊm›Ñ!¹5‹ãœôm±hVrì8Xš™C¹Ög)*)afüè‹k>ëÈaµkêQ±mQW”¸Øò¼­92’­ˆ÷bmÛ=3†h½Ò™ƒ¯{¡»Ç2m›4ð4Ø/yµ$Ùj¸‰B÷¨€iÚGþÄÈätï4ø:àLÝÊÂþÕj¸ºÕ¼bo¢Á)W°w³)’>ž„÷{SsºŸÏÎsJ*RÍ,Š¡[»¹cäàòµuá#<oüTA•rV3ù”•ÀÃ8QS?k\ÊÀxS™Ñ!ÝdüÂÂ`Šð¼xföLàƒ ´zoPï6ÎBÏ™̓<‚ëà s¹¢ã†ž"Ñ“â5ÊZ¬zÓ£ \š~¿ë«a•¨aÅ·_7ÂÙä…¤[Že·òÞµ±DSUÚmzùƒjNz*‘¨þ¡T#±{Y³X»~‘ð¯û˜ŸðÌÖ <ÜÑ©ËZ­!HÐúí$-{‹À}¡HÓ½t*Áu‘ÂGá‚[Ö\¼ùìU7ú”&¶-d«6#Ä#™Bv®•‘ò’)Ié-Búœ­ŽcæHü5šiŽ’³¿|"ÃúƒV‰)KVÏær3ŒÊØÓŒMNЊ½+‰=¨eÅ9˜!þÂ2•çÆ@kH CÛ&ð"~‚# ñé½àÁ…û¼å©Ü¸dÛ}@µœªfyäIJóNp´Ëdü« _Ÿ0Í׬Ô%3 Öº‚ã\‰|O‘f1ì•v >xZØLN¤JˆNμ3Ñô÷ñÙú±£‰˜úC–c!æÏFSÈ -ÁÍÒp`DKsr@‰M×Mš†Ù„º —!î2•K7rñ.oæ‹9Žð1» #NÐ7aC…‰W·Rw.Þ¢!mŠˆ„8v8Úk?Ùý¸^ã•B\sº`b2ª·)UæŒ,Œ~¤Ö²P\µûN>G9ø8§Ãëž·öuŽpW*—Ò +™àòf`LœT°ÅÛZù«ý£d+ñšÔEäÚƒóä•riJ±˜ÃuXÐMÛ2|”¶múÜÒUÅXFXלúCƒvnªkoI!² ÉßdøÍ5 ™-hp•<õ¤åqÿ4ôsÆwçðRM—^Éà³S„Ö)nL|Ô4ÕBq±,@…ÿû¡ÜtmÂóîW._ršjÓ9¯Õ÷Z¸­F©Ù)ÑâÐìQÀòGÆž‹;éÔÑÇG7êŠ`3b €´ž¹GM-+M»3]Ö„°1¼ S_Ìù ¡åVÌ­j²ÄLð²¹?‡ò÷ ïð¾ñ󺻲!rÃRߨ.Ýd‹·;"ž/´×´˜o¥Ò·ŠYƒ£ºhÛ6OšñOö¢pý ž“NëXE]|9% W4ÜÉu·ïié¹´ìÂFw1ñCfóŒnkl+zÝ&>)=䨀7&ôÞÔ8ø¶0"€zÁî¯;hn”¢hµ‚í¼ÿ~ Ôd´®.ˆÒ'€ö(ÞDä`ã î]›YLMa[µy Weªøµï§KŒ¹ÚåÓUÎuÉ΃ѤTÝjM¾P2>•é=A.Í/›¹—ŸM§(ȧ¾Í˜Z\'Mö‚±èS枎<¢-HX5z ɬ~ ü*³^ ?LOÙŒ¿§2|Su¼ðÇófVÉÊ®â<{ºfQCÈõwVEy¾ UQÔYƒ'¢@‡ÓÎ=%ä“{­”±Ý˜£7±XMe}ç¸êN÷—kæô_÷ óöåäuÞøÖnTpçnc¯{òKo gr!'T¢Sš@þ_‚hôθ¢ˆP¢à"y›Ó¥«B3ãùñájRä¼/ÏÄM*wÚèØ-ËÍV¶a§ækõû©†hZ¼¯t(2bb/‹iíf|oÅJ›Ü Q$jø†€©06â2e¾¸Fº«mÜçPp8Þ³«Ý`^ …5ÚÒ:\1óÕAªGĻоˆ-a¦¥M… ~2ucçþæN³í$`NxÌ»õ(þ^86eƒ™!ˆ=m1ús6³>À æâ8ÿìÇ´4¨o^‰ e‡Åá¼íiÍkóèx­ ç4mùõÆ6'½Ûm 'PÂ{„U5oåUÅdkغºAÔ—pë[´· ðÎöùblŠ7†RÉ'å›®µ©´mSì);UªlwÃ’ËÝSî4ä7JÔbø¡Å°éB?‰')c¯r§œ}g7©N'DWHú1ó¹nS®}«^ÆE0 ml‡¨«OAÔ“„E˜?eð*lbe”õ®sƒ1ò\Tþ#Ëc¾ ¾y¨2iO¤oîp[VQ~Ç®šŽØ×ìÞ/¶2"¡¯µšsݪ§b«ôÈ*š00“nÁâgb%Ï«ÇwÝà îG‘û|«àå.eo¼»Ô+W²—ïú¹×–Àq¬ô³¢jv´¢ÒÓqŒù0b'cÀqähYY\¢ì?%eW9X %ÙóóŸŒZ`森¼úsé?ôbt¤"’”°¶)]/ö õ¦èýîñË1òrV‡Ñ›¤óõ6°™Z1—HŸö´Æg“8ß7FÄxì²×9õ¤wní KFbùаÏì†ö’ÁEÏË¡‘Õi K΋–7(©ñœê‰?:ç«]ëë,~üT]+LüìaŽÏZ°Îà`ÑôÅMp5¦Àf‘Œ×V·HRôIŒöFæóÅÀÄ€£e FãîŸÖoqÌ’éj¢P¬HÉToÔ­ ˜’2ñc85!4Èî_‰Œ†èÍ1‰—ó„»X¨^BµÝuzMz•ÛG~ðcÙ3 ÷"·» bþ”ƃ= ޏß)Ÿ ®ªÚ箑Dž°1Ék¬Òq‰KM¹ŽŒÓØõm>5­v.i´×Öíha[‰]6œvƒ3·³w4Í’ Içº]+‘HŠ…í9ôÚ<ˆ’%]N®˜³êȵ†ãZ¥¼eÔrÊ}6]ã1ûá=Ý’dè=ÃÛäkMº‡Ô̘•¨Ó m£‰/ç¥-µmx! á{ƒ×¶›š¾ÍPîÜ5Ü?­¶»gбŒÿ¹õ~xWµU#ÜÁ•qc¹y]>m×aßA*ª¤HÉY,V¿àê˜Ð|ž\Ã+² Êá¥yƲȩ=Ç\Zpá¶`ÏIX•TÄI ŽÇ‡¯Œ»ŠC¡_Îʣɸ™·|„£-¿¥Yše.Ê÷´¤‹¤Ûö[½ÞL HòŽ\ Ÿ‚´ð<&É<eß$†/(®ÒࢸšÃLhˆÚ§¯0À3T;ÞÄœ0…{„•§Ô‡°Íãx‡1϶Îfêt­ÈY6qá½'Œ„+ÚlÈtÐpšÜ…)ìÖÝqÀ’æg!³ôoVZè¼GT=Ff4%@füÉV¾¥ÑÛ gÄ~¾Ú¾*@1B¤œwàâ¼2´þÅ éÂþ„ù³h¡ó!H(>èÕ¢]Üãåò{Ñm*)næÓÅ«A:Jîe©F,Fb\?N‡Õˆa”g]ç’]ᬌ)K: ïSÊ*¸%_€õ~úû\áŽ1Ðì›ÈäxÉf"ŽæÌÙkëª`’ya»m.&9Îmûš λÜëžIqzLaæ—;’BÉunïzPá|yvÀ™(21÷®j¯VCPOo cTE“ðÉ>.-ë]’YðÄîÜ®-/–#3ó§"]:­äXò¥VSãSâŠ÷¶2Õ}(kB$Ü%Œ§C¢ò`$4Cbøa6à>;){c5Úí<#:uýYvbôBX‹IüñªcÆ‹îªÔwëø¶úšwß°YílM%‡8€²ßC¤Ê/ïÒæ< ó Ÿxˆî³|§7{¼¡Yo]Ö ÑšôGX>àÄ¡¬PlV±ÛÞsÕÖ¿æÿP­¡o!gG}ú5NÅÝ:oÒRÉÁ9\®©Ì|ÝÐ#“'øôjÅÓæô|­î†€ÙÞJ7÷f FáÈ¢^óçÐ\OÒ¯YíøÕ¼†úæZ z6÷ÃÔLñ¨;õV€¶;Í,AÌTE6îûöOã=áãú¹/½³$u2éþŒ¾¨'º—½†ûÜ­;›åÒ8¼|†¥Dí(ù¯»ñ–¸—µ?ÐIÄ6:ìg+‡DË9èdÏ9’ç²ÚÚ³wU‡S3½B“,,SM0y¢DDã :Œi{)ém|ŸãÎ]Úö«pÏ.·$`qKÏç{ƒyÙ†Qo4;>Np»ØV„œ¼©u «z:? ,&EãZ:*Kº3nõ—tìZ×۽۱ѽúuACí4KÝDø›mz7ÔÓ*¦¥Í5ŽÝOÓÙOƒOŠÝï/m¿ápâ ™sKâYÍŠrž|‰áèÛjƒrŠÁZó<ž}Ü8<ý(ÑØÄt^ç ŽÌêLE‡6‡ðÛ[¯1@\àFvíÚ*´/ìéb«Â‡¦·$hS¾ØiæÚ­óËë(ºÞs¸ôtýâ†]ÜÉL<10;I«‚”,¬¶Ë¶“½QksÕ¦^?Db'ßED>o@ŠÅºZ0°Ïþ˜-ƒ}t(“ÞÇSÑVÑ#»°Ý'¿“íá\fm ìwqY>»‰þŒ®ŸWÎ\,´ût¼ÉVÕ¢È_bâÏá;ÛH¹È¬Èc&s’¾}Rg9¯ôym· ×o¶´t„géJ”l•“#vØÝ@q;3˜]¼œyW¶Œ¥—P0Ñ: ðžäÎ=©=,»$jB(ž¹ëã"^+QÚnk’°ÛÒÐ?|ÆeßqÖhÙ³Øñò‰CÕ,n¸ÙÉ úS¿Ó÷‘¼ñ±r¢mQKóUP=ÓE…¹ÏГ‹Ââ•~Žw4*“*òkCÕÌB¼ý ãñ×/ãý ÝÌ;¿&Š êzž·³.Voé¸?`~`¡Vô@pð(˜.ØÐ7ÀÌ^ƒ'Êò–bè ›ªè+Ê]l·±É;Y.†à–;H/ÌõáJìÎAØ%iK•ê‡êþäTênÞz½¸IÁ¼ÔÑÙ×ÐæE»ãŸR:—^Ê£äÏÒ*÷voÓ`“ñpÆèSy’&`ÕŸ¤0ä|7Ý}ö_‰b¶³½+ãžêtµ(—î–œpão ½Ò}`;çßõäå}(çC¹=9¡Þ\žÅ×?ѽ™TxÐJ&½‘äãA}Œ”@¯óÛaAhÅi-3C¢íã‡Ë3Ò¨tåÑ ­×õMýÉŽí¥½5oÍ%ªgtè8€?2Cé,t"¾Ü™GE<‡Æ$‰EЏ "L«V0úßê%f„®?)ëC¾ö=~—9Αd [jy®ØГ乨cÉí ~þáãÂZÿ¥ñ-Óæn-}[h 1þhypU¦c…„·wíø—Ò½ïÒ·¬õŸÜ'[Mb}ÄÃÕÞu¸UÖ9r½rã:Eðñë }pgèteä{ü—ßví²C*ÌLÈ“çjï¤4ñÂü_ð½qÔ Æg^ál}®´É.ëÑ.Œš`}´ÅßTŽ­Cì}wÅ]ý÷`ÊñóÞJZUiâ<]y]€ÒÛG³îól¥F·_xÒÌ=UúLä–ŽhÕ\ÂJ­§ŸHÎ ×u N ‘©_ Í!6(šçÜóá¡yrñ8/\0ÓŒ¤A’]âÉ¥ËniL6O\¬¢¨Dá Q%E쪅Ã+îý½ïX4OßÂFNÞÒ:>Ø÷$&ÓøÒ%äÇÏàšôy%øýk{õñ¼Xnhà†|KÙÕëó²gõÅ€O8÷MâÒ§?ŠÙÕÙ «Ÿ+?ŽÉ8'½%zý¥ñVåŒ÷q4dÂs¸jŸFÆ:´0ê&\`€—\,K ᑸ ÒÀteÞwž¥Š›8= b=y¤I“f¾‘’?Ê åQ-·߽뢛xh’F‚CpïkhÏ®*wþ¤oQ~ ›Y”=¨èG:ÛO—ˆ¼oVù¼#Ó‘bÕy›“.òxš5)Ž?Ä6`OjŠõ­ˆªì†çúpÆ*/Òì¶î-è$_ìƳ&kêe’KØü#Ì®Ý#ªÑgpe$O{­ØýŽdp@>ÇØjÔ¥ö¹(vþ]®A¢L#ÇRà‘×õØÅ¾î¹¯¶ž-ªµ•KÎÞ-Šé&‚ýr£jœ'©µÎ}ƒ–ßMŒ–½]*þÌ,r£ÉÁæqr› endstream endobj 5143 0 obj << /Length1 2211 /Length2 16049 /Length3 0 /Length 17377 /Filter /FlateDecode >> stream xÚŒ¶P\Û¶.Œkp NÁµq îîÁµÑÆÝ5¸»Cpwww·î –àþØûœ{²Ïýÿª÷ª«º×7üsŒ¹š’LI•QØÔÎ$agëÌdbáˆÊ«pXXؘXXX‘()Õ,Á I‘(5@ŽN–v¶¼ÿЋ:‚ŒœßdbFÎofòv¶0Èrò¹xYX¬,,<ÿchçÈ 3rµ4È3dìlANH”¢vöŽ–æÎoYþç@cB òðp1üí¶9ZšÙäœ-@6oMŒÀU;K³Ç… á·pv¶çefvssc2²qb²s4ÿHËp³t¶¨€œ@Ž® SÀ_t F6 ¿‰1!QÔ,,þ%Vµ3sv3rÞ`K­Ó›ƒ‹­)Èð– *-P´ÙþËXî_ €·dþ'Ü¿½ÿ diû·³‘‰‰½‘­‡¥­9ÀÌ (JÈ19»;3ŒlMÿ24;Ù½ù¹Y‚Œß þ.Ü !¬ 0zã÷ovN&Ž–öÎNLN–à¿2ÿæ­Éⶦ¢v66 [g'¤¿ê³t™¼u݃ùïcµ¶µs³õú׳™¥­©Ù_L]ì™Õm-\@Òbÿ¶x!ý‘™ƒœ,,,\<@Èr7±`þ+¸š‡=èoåßâ·ú}¼ìíìfo@>–f ·$/'#WÀÙÑäãõOÅ#$ `jiâ 0™[Ú"ý‰þ&™ý ¿¼£¥;@‡åmð€–¿>ÿyÒ{›-S;[°Çó¿—YVM]ENþoÂÿQ‰ˆØ¹¼Ù8Œ¬,  €ëíÁç¿£(Yþ» –?¾Ò¶fvžûÖ¥ÿ)Øõß§OóïÅ üw,»·‰hþ ¸. ‹ÉÛðÿyÌÿvùÿ›î¿¢ü_ü×#áÿ­¥ùKýÿÑÙX‚=þ­›Wç·Ù—·{ÛÛÿmª ú׺ʃL-]lþ·VÚÙèm„mÍÁÿi¢¥“„¥;ÈTÉÒÙÄâ_£ò/¹ú_ ¶´)Ù9Yþu¡,,ÿK÷¶U&Öo—†ÓÛ<þ­½-ͧ·5±3ýk»X98FŽŽFHoGü†8^À·54¹ÿ=Áf&[;ç7À=€™#Ò_çÉÉ`þKô/Ä `ùƒ¸Ì¢€Yü?èm„˜%þ €Yòb0KýAlfé?è-Ÿìô–OîzË'ÿq˜þƒ¸ßò)ýAoTþ · ª;€Yíz˧þÄó–ÁèzË`ü½ñ3ùâxÓ™ØßŽå$³é?àgÐû7&ÿ?oEšý1x+ÒÌÒõð/øþ/k;Çø¿˜ÿ¾ñ²ø|#fùøV/øðŒÍ|+ýŽ·.ؾM×?ôo\ìþÙßœíþKýV›ýõ[0û·÷…-dö‡.;ðßRÇÿêÛ[.{ãÛ{ᦜË,íþÑMà»p¾±súSð_ä ú…7s§·Ûñ?!ßÒ8œþÑ à[–?9ßîfg GÐ?N솳›Ý?Þb¸ü¾uÔõð­)n ë[<À·yþ©æÍÕäø¯Øÿµ®&.Žo-rþû:}ÛåÿÁ¿A w Òʲ _°U}pç]­0¡ãþ´Àå¾f-£×Šc—Ë*|2mMVà¦ãpòX?ú÷]qšk¡UÒg¯Ÿmð¡í‰ÊÞOñ*sûHßfq‡g  7 #1ª x?;xkXC·AöÈPæ9¸p£*åcݹ Jº7 •¯M†,ï+ÔpÊ"?•Ï3F«Gé”,R~1Î^Â#‡sf$F Ã¼pG[¼¾YÀÌy%•‰§Gò9‰f+òÒÞb¹_ò\¯TcuêÅÿ€¯G }99Gå%r”"óþ«WiѦãdên×Ô¶M|D㹯 rçxü[ŸŠr†—[:2j³]*Á¦„,Ž=ûâ»Ì¦»ôo®6c'ÅËWE0W=ªÁà¥ù\CZ—'ßAr¿Rªvjck•3¦{#C¯´«LÛ DÎÉx…Üo¤Gï§¾åͤé8‡ÙR;Ž`>)DÞI÷x%f¥±Ç¤W¹tÂß#SѪwÒÔNÆ„_}ýR ἕz í“qLqZ««„§J®¯ëDj5†wÈiÕ,â‹gôE1ÐÜ¡RðhTv=’zhé¥6#ùvm úéÞ ~”Êê"¤Tˆîàã¦6¾\E„ÊÖHîM41ÝBÑ·<ùPÕzÑ~gI`„ºIrÊkÜØ’ óú¼Ö°í}BЇE!–w½ƒ.¥”T¸èþ:ôža¾¸‹Ù×p6ü–<óZ=N‘•{5ÎŨ'-h²×eƵ·è_<ù›õëAüjõåp¥l@è‘Ê›w³“Û)gÅËܨ‘ƒhSÎdÉÚF@±íJÏÄüNi§î‡kòá™JÅcG欳õ` yôäŽÄõôqêùF¾=JªD‹Ïï(¯æ~ "KE­òSKИŸ"0µ»‰ü?œÜl9ι ·|Ûðà´s  ˆÊV“gN‹Ñ Õ?‹õÍÙB±M7ž”S#œÜã‡u´í”bi ÏЫ¬úI>Ûçxˆ½'’šqu÷²÷Ç4‘Ã…É¿ºuõw¯Ïc â„#¶JË+˜Ó¨BFìBiaNÚù:…ä±& NE6+%»?]ÇŠY¢ý°C¶}‡¢T½¢ÚÙ¯úiM VÇúçMT¬ùˆÎ™sVßÀ%Vº>¾`üÅøØœkDkÎÄ/®Û›p ÷Suˆ£.›ö˜®kC«"“1ëÆ.¼­p*åØ+Ÿ#,ÅÕÛÑ;–¾L£çòŸtî4/1ékQÕ¥­…ÅÙmò8},D¹ŸèèŽoßGªá¶êöÄ—^X;M¥´ëXxªˆÉP´å&ü­bN‘Â'Ö™2A˜3‹ÎO#C4qé½2ׇ ™•Xr´tšõ{Ëšgµ~9ûä‘O€ñ\Ê<ÊCÏÀhÌæÖÆ£wÇå“ýõÇãô§çÒvAQkÑËÔBºÇ³šýC¯ó×ÇÖ˜ð_Oɬ쥇FœóN¥ ¡‡¸dp‹Š™ŠI˯Q6t·„/í?Ĺq$•ê¢M؃Ãò´l.…ö¦:g§`ë>X2°ÊÉžëoÿHö(÷ϘG$à4tÎᥴŸsnekuÝ®¿t&ø¹PžÔgH è#·C ìAÄa'/f†ˆ†˜u¥Q2~]kéiPùع¡ 5æ,t512Èß*êØø„·uæYp°—(6÷9ëäSóƒA|BPÜÿs÷µ9î;ŒË¾Õ#bãòϳµjŠzrpºþÝHØÂ“™ws•póƒòS‰×ò1ÉŸí*HsÝåÚ»#Ãç}]ÆHô‚: ææVQ ±yf™ÆÊ…ZH2#G˜íî ‡s¤?êä×b ‰À,ê’^ýÈš±òŽögÞS{Yõûž¢Æ!_ÏH÷(Ξb?›ÄϸðŸn$4"’nDÅÝeB¬$lŠƒ-hñ?uA!Zš än!Ž\=NñÚu@‰ülR@·ÏW:\5ÞßkT¾xßNcÎ1bäYý6ÛáiêÖx2¾úÒ€ˆÉ ¥ö¸fZo…ÇNv¬ÑÙž¶ª¿vŒÐv]ÔfiχÀ² iC­ŸjIÂÝ»¾®±|φWÂju8åB}Ô.\m¬D—÷+Œå1yÍs¶OûBo5b[N&®–£‘TQxÏyØÜ2²O12LüÊB6û,qã®ù€ÝUÑÕmïÔú‰,šÓ16Xú ëùËPìê&9pd˜á²ÝÉ}¬IZµ &s0ëSã•\ÿÔŠkŸ-K|ÜU.=&_MÿLö†1ßZ0êרyÆBÓ6Ÿ©íÒ¶=‚ˆÅ{zöÊ£XuDdºúŠ#¨mÞ›Ä">~bJ§À:2F¤¢1îO™SôöTì7Vé8{øÍ7ŠúÀº"5{×h±Ïú©q؃ƒð¤Qk(WîÒšNéÍÀW{î ñø_¸újv𪜠/qä C=ì[›,z¯(©SŸÒ?‹oL|'ÅúчȊï;ÜnàôÊá"V©ÿ@-¸»‰ølrÀ½;‚ï{¸.}WÛIƒõ¡ë~!qEYÜŌҽÿˆÆ†R™ÆØÑAËßRoºBŠØ|de¯Ðž+/1¿Š·NaEYDzó4diI+ùWÀ¹²57Îl¿Á­ŸjóèÄ-·Q¢Æý(%µÝª+¹:k YåI‰5±‡²`ìå—rÚƒˆds*™/ÎHK°1ü'¶FÖ¬Tõp¨Æ'³“t£?èÖÆ>eÐÅÄZ–ƒC«š)$a¥z9h!ÖPC l™ÂÜÙ‚‰[½žÉeÅ®ò!_‡2—Ù×Ô´bÑÞód¼~òa·)¿÷p %ah©–u3 ›´ÓÍbA” ÷é²ó),x5‘²¿ž~y‚ḮÜë•«é[ Óà`BîÎöq„”Ý~$Æ-rÜSM‡¦£VyÈAõçís–€4ð PÔ`Ä;Ã÷_AΈøµCÌG§Û¼Ñ—.iºEù*Æ üá0s™¶xÿãííh†ðwÐú2Pƒ¤ýy¾ó’æÕHÌ„·0S2ØàV4X朠¨ní8!Rå?‚/§Öâ ´w–rqáN œe²+pFÒûàe®r¾$Y»ŒŠxÔSЗז¥NäŒ~ËÅ’öÃÓ3~]ï#k“ÖêÑ*Gc|µ2³…°·@ßw®Jç›ÖûuÃÍûƒÁ+¬¾^àZM<ˆUG³Z¬ÝKlˆë{1Oß !µŒÿFÎíìþ#ðjh•Ê;gK +™Ïðuh†!gËìôÂÖ¹(!ýª&µ+EôÙ0â&Ã5«;ùgÙ¾å“ѤlHlx•‡¼È½-Y—ª‹µ‡+9GÝš˜'ÒrÉwBjv‚±ÛÍiˆ`eoªåÒöÑÞ…–v<6kª…Ι¼¼wì6Ó(—:ßzuG-¼§õˆ³°8ö6'‘xdšG£ÛHF¯—–XªP—vsÍïá÷ ¹Ùn÷xw* ·ÀÚB—”µIš'JK¥DéÁ‹£Ü×¢^ÆÛù id¿¶ìûw²óÒ„"Lèîªj‘Â;ñ÷4äµn¥ (´ n!É玾;E9¦®7hfÌP£‚±Õuµß&¾+çh®I7XÆ—FÁxerV˜xßË^=ç,ôtTä’‘`¨µ¹ˆ;Ú1.üºíi[0è°]Ù[-9y^È5ÃPiSµ+^ò£•“çcòÂS)—Tpê^hîªÊkw¶:/ZPcaB¡€Á^éF-q<‹lfžÃ'ýÒµÙ—,˜Ož¾&²°¼ æ1[ÿNîDþ#’ø:ûIñrŸ÷1Oáõá2Àu{/tÝzû{Ù/²Ñ¼ÜñSw€—öoŸ Ì‘¬Æã=“”âŸdËV¾åÑ‚>TØèÆŸ ÓZ¾ZŠG²½‡Ær·yžŽ½Ôæ\*¿âÊoݧç•_üžX·}¿î+a £`^Dœn? ¼N€˜úPšÔt²6³±7´ôØix¿±W6àÖ% †==(¯¬Ë™tJô)›åa¶†:"“yt“Ïõwf’B­îÓ …5ëGe‰ÃÌ6FeeÐÝ%Y‰±ÁT£Sõd¬sÑ&sÀ]’ŒwÁEGNEá?=]‰yMõá——äýYq¬ !¸ =w œ6(ŠÊÛ5D¯þ®w G÷&UUA¼UÎîÂúˆé9lpN!‡0šJÈ}^5#ŠçT0qݘò«6dtn&7µ9Ù$+Óoݲ+yÄöÝUd7dw×91ÝõK)´'6MÎôÀc9tºáY \Gù¼UÊGшT èXFé¦4fv¶±ó£c¨”Iª¦C÷­³¿ Ž´%)¿ƒéöB–ÛÙ zFcãwàp½Pù^¡Oñ¼-½õ`âÉ‚l&Ê,ý“S»=Í#¤xUò(>D>ñÔ·–rŸÚ®"v’ÉkX%…nžR¬ Ÿaº¡[ýÇæŠÒp_(a±\’ïdÃzœ ¢Žõ¹—aæÄÓ×ö}BN#ª™È÷¸ÇfÎ/®ä¸JÜçÞØ ôО¾ Ýkô"~áò¸·nfWð·9·_B£8‰7+ü„W3¤e"©c½…Áõ,øÎm(ª”[I8HMMY\ØèËI—EMʯµPç"½="ƒz|hÍÛy(ja$µís>Ý‘ë?.½è®âr›ÉàõÇ8ŽQøŠ{97‡¥'â£Òm‡Ý….¡ÖÆcæuzX!:ãˆbEWŒSÒè ,ü:2óéÇ¢î*Vm1\|¶²s£ª/¢Î¬ÀØIIbMcÐ9>á+mßé€l‚;p~ÕU$¹êÑ>k´¬[¨ëâ½0ŸôÆüŠ@sðH²ÔçëàbÐʉѼ\Ê ¦`|Уó;ù½ç,&¸ª´|@ØÌåt'}[äC6­l&ÌQO•NCUבÇÇ=Ýñ¢ºQH‘üW¢ðMVö1òs ŠÂ Ù¬*¹Wq:‘c›2¢ïnÈùë& cµ ¹üfî”/ô$›rìyÉÇ=*Ñ1©—ªN­1ŸégᯬÊ)»†G·—¿ 8:ìçÊÔfôÄÕÖ¢õ졎ßâïÃßJ¤V~‡ÃPõN¾¦6Â!ãÒ¹YÖ¦ògq•å b÷òª¡OzÞ»)Þ\¿áyÇiÞa«ŠFås:)!—Éáôùt”Ý!È7#5R³I¬¤H'ÎNi°0 ìŽÅ vA]Œûl\óMM몦eÅ…*Ç)ßà *“/Âïm\žRjˆ]–…WFÆ´gâ„Ì´yœ’…ñ±à–X2•‘¶$ÿ ¹ç©ÿ¾ódŠHV’Ä›¬9yù‘ÂÁnÇ4F/[ñc/œ€'#mÅkE³)ñ]±¹&ØÛÖAn©ñ×®D¬¸Ô|¦®/˜šðu>8a»mû×ùô~œËã.§z¨xèÉïL²Z¤Û¶%¶_V~2<ûI‘ø1*tõ´›ã¿ÿs@CÐÂN…Ã#Xp=Ý5o°UûEˆºñŒ¾×Æ#cOˆ„×>ggèâÁ¡CÝÐc ‰u áË‹/>•ÐT£‚3_PTÞËôt-òEìêµÝϾ-úrÙáµÌ€Ø‰!çÏžƒÌ-ž*Öþ~÷zž 9à¶~ªFdý˜wØÑ¯ƒT­•ºH_B]é \?ýÀjÿé"Êú-]‡zç›{E`”žà$pGNc¿¯ÜYr“G®¢Ü{\¢êtŸ,f8<š…éHvë¹S‘N%cøY禵sˆ?•R¿{òŒ‘°I}H׫ ¿øn£6à5h‘ôÔŽˆO£&©Á|vÍrVì% áýb=›‡ŸÉîg‡ѧô께ÿ®â¨.Ì·y»Þ°þ25l¸òʈˆ!3»h‘ ¹*ç,øŠÁ4M¿¾ë–•—ÁlPDÿIá2DcZî¸WMZPkô ßÅš“tØq˼´Ý()×ÙAàýP^ æEðÁåÝׂËÈJòµÌ r9%¤p¢`)½öÙ˜û›7×ñ€ßѬdÌAHáß#M¬N…N¿YÇP}°Ý_œ%´­Zé1|ÄŽœé4•S0ûœGZ³çÇÉ2ìÏNÑAÅ™xÝÀγY=¹ðr=µ…¹ûI²ZQýUµF#ˆ§,‡:ƒJ"ŠâB}f[H#ꪫÏæ¤@»á\’1þ©|jý*§‹Øx;úúÀ¶8{ax+i²eÔ[”ZÑøYFæËþCyËóok$†nŽãqÈèy·híG@X{6…JÑm}y“P6ü6î€Æ;Ð÷îrÆâÖ“ÚêYF ~þ8Ý“'Fxî¡–²]Ôøp^M'Ÿ:7Ä…b ݰËã¯ÞÅ2ù§Ãåhþ›¨k¼ îfc·½¾ŸüX®‘…г ÒžÜåLÌ¿üäQ²¢æ2*M»É`Fâ¶þ1ÉJæ¬Q£Zcôkϧ‚ÿõéug¬veð“ç`²&Êýà…:eÁ«êæy§Šœµ’i„!§§•<Â3tä³RÞã`FB1NcU_rÈnü‡SnJÈ4,%Ú¢çn¨Ž<û{ô†ï23‚ö1,À Úèv,!§ý%w·“¤¶ÏqÙ¼¤É:$›×ƒÅ‘ ¿9Ì®ÎÆjHB‰xÚ í*_ò‘ÎgÔ¸ ÍßíHú’~qYž<U~§ŒópÍ1ìP€¤h)ÞïxROtS½éŸ¦Ž¥jZBËŠìiXš ÉÜÏEÞÛ+o„0*vUPG=V©ÁºÚÃÅÆ´ 6ûœF¬yò‚4eCõ*°ÆBâçOûÌ&‡‰å%"ˆiªè-· 08¼Ì"ª-¹öãQv`7)Ôæ¬Ì¹JÍ&ÞtÛî;A…‹ûŒ´·àï$ÒÈÛ‰§ŒÍjMò#[ºmfþÅ ‚hlÍÜt®¬Gzn挤XhwÁ…•~AÓ- á§õÔ4æ×ù$€’fÓû@Zâ@¦. q…åt¥ ·ú§ˆãß<(®ds«0^#þuµ¥ªÐ…a;¯a¶ˆ[þÅδ»*wvû|+ó,¡ƒ2«|·¶}¨XÂ#ÝÆ^HÒ‡+¶pà¹Ð—ÏQÆN~Ÿ7¸§ Bÿ ŸÃwõ® Ï?á°Ñ.6È\DYGÈ:{3v”×)^5«˜”)‹iÎ\Œ¿š¥W@ؾ‘0xΫAÿ¼íö û‘6N=r:™Ë³žŒž¨ßý[fÿy—‡öçYœ*íNû®ó1¦ÁôÖ¾˜²òB¡¥’¡áðòj×÷ëÓ¸Çv‚íÌ:NŸ4#oЍq>Çy]¡²$ŒPÛj2 Ùæ$¬ßÄO°»ùõ®oTž>NÝâ3‡‰©ùp©³Ù÷ƒSH¥\~MȾì³ï»´¯¾7JÇTª«…ß®YPn‘b·?OÂé›ÎÍ«„sSØ¿KBÊn¯¿‘ö>P$‚ø°UŽðHÓƒ¸r8¾nÞÏi›øqÑ&÷–—ðǩÎIl”N<óËVÍÂ’TÆbao•~”k˜&GÌN$„ü¾ø"›€xÍ'ÛK£‹ÒjnÞjÑœ¼ÍMK!P8»5@ÆdÖ…éùø5¬„PÇΜûà¡©„ÀKgj¹:‰ª‹ùÚ’Q;~ô‹>pÞl‡£²‹C¢·Œ›¯­xÍj Æøe¶%‡¨Î÷ŒfÚõÀ{ØG?JçeØœEQO švUê´c]î]¦ YÈiÌâÌ ‹ô}E;'î©\K®î”Ôó•9ßo6|Ÿ9$—_H³×iq~ôžÓëÐ8ÔZe–¹{ïV–Ç nj“}žfùrÅò¡)žÞÃçÔûñÕÃÏH­]2þ4„3cþnÙûœÃ‘™Zø6›ïz,5ÝúÒ Î[A &+àÐ*ø]–/Ô‰6Û‘µ8CRñ…¨0o./\õ•à½ñ´ÙÞ´×–†ÿYRÕ/Ês!+ §õOåðo…Â|ÐWZ¤…åšñZ/µ’)JGÅÎÞ–v¤É2]ûž‰Ÿ-ñZà ¥ÊaÛlq)p¡ãv¼.¾›G‡zM= õ/ø}ûn1æ–ZØ-b„;h}kh2bè¬Ùw}(ív섉à¨Hïì$ÙÄ(QNË>w¾gœ¦h©Ü„`µ„½Ü|á²…Öìp²å™Õ „1÷¹zé½¹¶'Ù߉A€f8Y®V ­Þ’Æ & Îý…/\QIEaùd¶4ÿd‘ލ^B†iù=Üã†Û>’è·«Ûþå3ŽùÇ2ÿPgèhÞI©f:ÿpXõ²ãCŸí¥Ç¦Kôì•v~ÿÎt˜ÍŒuIEIØü%QV!GÄ-‘rVd9IiÍl£#î9Ú#p„2yÅ+ÔȦ? ºgÖÚâ¦Ms\÷c¤·.’µûÑ/$«÷i¿³Y¹_Úê’áÞgç×å™"/é6\æH¨ , Šª78[|€}, áÕ· ¬~£±úĶØó`ç€Ôµ€S¸"´ÞìœõÐAÆŒ á}Z!!“w5ˆÐÕD»U<ò¿”Š€æ-8ä´˜¿Õ(ɳÉUÈu2¦ãi\8ÙA9;K@(·[Ûù‰T47ÙåôSÏŸíó¢OFÎÈ)èîÍlÅùÕ”?ÄÅǵ=£y-G2““T[B†Hz žûȶO£ýÖjºSoO×_­x¯t:j}ÙÜ\åtî2W nÿ¤Âpãë &þôtzßž½$x…XôóÁªi}âè§úJe˜Zžq¬fIä6)VT*¼Ãþƒ·Þô .³×Ò®šyırï¢ÂGŒÈ´\ØIýáùËëBfZ+1Dçôš;ÂÂkÙ×[mÃS¯î‘¤d0åŽÅöÁ2µMÄô¬9F–¸~Ék^(¢“k';õPT´q€xk.q¥D¿}ß­­¨($×>zÙ·­{ú[z´'ÉÀME—0âÜjÿ´+¢×¹ãÀZÜßR²y)‚0Äè4ì /Yź٣‚Ý;‰ÅÅ?`7Ú¶9dÞǧËkÁ‹î`BÂAÔöÜP¿C#&Ö~'5·ß%?RÌÞšf–ƒíËH£/OQÚI¼Ó t2«{Ý\ùÙÑzn£õœ—ºK݆OÙØg¼|¬dÊïcõÓ; Q9¡Z}ÄI÷þ=9Öêf[OŠe™òêRÒs½8ㄊ…'²íÓT^ƒúYP³¨¦‹ãøXX Š€JÝŠéjw%c™¦ó@÷_?t‚f÷JXÄ.3UnɘJpQáâDåÎSeäQåƒæÉGèœÉÞ·ÝÀ£â-Á_Í2j³‰¨¯GRïöƒ¬•-X‡°Ã&­ßü›6Yo¼Cwâj%Üú2÷h§î½¢vhE°_Ëv&áÊòÏø ‚oñ%”–2«˜gêî xÇv}þŒƒAŵ8$ºJ*Ñú¸¦oÖ™!s×íbÇžÏL£iˆRüž‰,µloíøÙ©>k—€¸Ë>j*^ ÒE^Ç”« ê‰<ˆÔwT¡´30Ú< “ãuV…PõçÙp3¤œÔþ |—Ÿí^`r~æÍ ^“ïUGw›¬íí¾¸ùQê1BúŠ-²ê…9tþF°J€A¹îžjÅj9tÅH¿ƒÚ×£+1 çó ‘!ÑŽ e äcˆs˜ ØgÉR£qrsóNˆ &ìgˆwÎ\øŽÄê¸Ø<L IMHFx€™IÚš*kÇÑA4{s`‘PL+ç¹$;Ҭݾ¥·Ë¨S®‹áª¥ß:‰ˆb´;!ÓhÒyöƽ¿Lc@¨â¾î×âÊ"Èô-õ5 Äß@&„+ξ"²hž©Æ·¾*†&ÎÙîôa#£€‹°0ßr‘ÚÂË%ŽÍmq ·è vd`[>F¸ø F4s+¨M;@^‘š[uТ±ðËž•yÙf9?¦oE5_Yê~9 æIx›ªµÓZÿøsÀd˜Hó!Y.ÜKƒÛ‰sgÜŠŠÛ®öbÿOnÃwÍÕŠ±7ïˆýéñ•’^G΃W—z‘«´=ç·íÉIˆÌ†` YYøŒnE Š>Í67VFf|i:ÞzŒ†Ë>A\ß<j”[­€ n ¤7Ä1=Û ôs#4l'Øa†æÇ‘PùzºÖíV[QVó¦&Áj#ŠcRøKÛjÓ ØŽÃ¡8fâ"Bq¸FñÄ…6¯´‹Ý‚Ûx&ó(Û#ÕŽÏSJë\„{Fбw¢á†±49Ìm|z²ËᛟËošÍåÍeCáÉì  od7 Ý•‹æ§ ª:÷*-Íy—ˆÞO\`v=ʸm_òËÃxÉ*ó{Ÿ©—aúW>­iFLöÒæßq²r|5̨#äå¿ J4òï¡=/Þ $r¨-‹íÝIôK lÓE‘\G^Î+öÈ™}£¡n »•U.$œ |üABj4#Ú7~oë—Ú>50.ÎÈÁy#VS;²¦È'ºpq6Ý1¥N”]6SÉû¼@Úã`G4b=&³?®Šâüjò£y³ãbû§)u°7 ™ôÇÃ%có:˜¯©¿g}󜋽}ˆÓøËeñºG Nœs ÚwC¬ì¨lÇÎÉ.Ê·K‡Z)•3«®ø¤ÿÆg¤§Ä t˜¢ËÈÞ¬ ጒš33Œ£C¡ â×kc89 s†î³oQæ¶IîûÆMº"~™ú•Ù4ð,˜G4ÚïÙB£%Q°N­½.?…µPÐþ˜ª6¤2ìßå-§v^ Û·Þj ¥å •O´ ?"ôÚ ç1·{1Z‘{>#Ÿb[®³êÂ5ŸësPuµi #‚ê¿ð̯cßsîét©á)"æF°´ZiTÍDQ΋­‚u+D¿Ô¹öOfMª|ýR~&DK싇¼ùŠÕ/t×Qàípü|èGIOuZzå1¸Ë ¿°Ð÷°|ìnâ14o=dlvËaYOÐ’Y^Û’(O G$ÄóÐ ÿ€”‚OÿîÝðŽú Ôí’sÏ7# ½!úA¨óÊÖvâÏþN'ªnç:/%‹(‡¥v~ô¬-B­Éâ7°8³TWô>äå¹Öã6h Z±{ ¤ØJBIN ’8 ¥á6O[œ…âÍ UÚÏ´œ÷[&iM›Íü¼'šW³&(˜rµ—°ÈûœèÝ/¤mÀ”µ”=#SôÛ]`”í'MVWÁöÎJ‹ŒR„z¶ !ÒÏ ÎWœÚá S*‰BæLÕ†ê #ø€÷ ¤4¥7&Í¥ÖG®W’MGà ùªß ËŠåõf²=¶Å#í)dwU…¼ß'¸ê¬ìÃÒê4¡ ˜µi7Ù>ªöÍùÇê¦6{µ»ðŽå=ÚlÞßÊÃi¬ÛÝîûÝ60Âñ!åK2Õ£ãEU*þt}x„9A«Nó¿bõUuI.­¶íúA[o¼Ð `ÊÈÖùß‘cÏìç§=¸)kÌ,ÒœÄæjVÚ£ðcw ¦ŽÃTïñ‘m<þ`FúŽKþ‘fA =²ðxãYGÇÿò†²ˆÇ€\Èš6a 5<{½ˆJCUÙíú@&¬ÏÙx{¹í˜,r®ûÖ]Í üU€Ú ÍEp;”o›ð1h/zù Yì}Y3z<ÆÝÔ»G\©‡zlª.K¹Ð)Mö’7ܯ‡”§Î–šËÍ3’:õ­×X’Ç®œRÅï¦óhä¾Ko|^r£PZÛLÑn¸ï—˜(í‚Ý 1HAøzC9ÕÆÍëî*¡*[ 9WQ½h‡sºC^5Ñá.:¯JÙçG¥ÛÕ§Jè’LœÝ`hÌa!Úר§5¶-Üù«í§›õÆø'¦wÎãˆàï…"V×§?ÌoõØ¿óFã~œã©<Ëì tÆ·u¶:”b÷Ug¼eŸ1hÇŠ6¦Ä鈻GÒ É[ £ü:Ķš"¬¤¡dŠX’4aA`6øÊ9µ(Uiq*û‰­±B;æ[ÔËqw7&BFúR-å#ODt¹(Ö†’])æãõ€™ õsJÄr1>ôgYøFÃ!…F9­ù…P ÞËMxdµÃºo’«Ñv¶íÄF¨› “¼Ã’Ò²¨¾JƒHZóë7ØÔ„½ ÒÎXåi‚æúê˜ ˜2›ˆE½#>^/Hîÿîg\–Ûˆ*UäC ?㉰j¼]‰¡š$HÙ¢çñR›ÖdȤÖð't`{4X$«Ôcó%:”¤ ‡yõK>øDWÑND$Ñ·ôzûŸ.§<,Ô/ãRv«Ò:Ž­Ú¢Ä=™m9ÉtSQ¯©×ïÙò© AkéÓ-‘ m°¸RªÛ1"WlŽþ9íwY«äñŠÜ~’ÁX~.(Ï'AϨ:(Ta'dZXé Æsp»l›Æu›Å‘*Dí`n„¯‚­Ùßc½ÜªIáQ®ÀØ£"WgFÞñR¢ëÈà(“Óáм]¯¾—þ%8ŽóK?Æ_Ç04¡„-\ĽyòûÛ™i¿ë¿H "VZëÌÞO &ÖÀ}ÈtÓœ{ÏÉ’'#è)+`1ò+tˆ“Êæð÷÷û–Zÿ0È'Mú¾B"GãæÚÚB·Mo˜ßùX\8ØB‹£Pà”ÙˆD³+n7%t#è>z;ïZ9ì‹30– ” ´Þ)½ª 0ÌBuuOW{Ž=nó¡ïâ"^ŽDÕ†JÚiM&õŠŽÆ-ù½{O)‚’âa.€¦ÌóîS-ž:ÀSËÚ³÷‹õ%J0!׿gy_-¢y³.Ùoã«Ñ‰?™•Ö³ûb«¼ ;©yXÌæ~$~™.¡˜_pP–››J*ÖfHt*ÝŸGý¨«¤ÁÂçGø¢“ÕO Ç7^,±uã4ü7Qîœò¨Á@Õ€"ÎÜLß Ö Öu¢„ßÈëþUâf®|™qî÷M÷X«Ô£Ío(ûø½+Åv"©IdÑ~žÔ/ápÆ«\î=T0ù±”ïÏO"ƨÙ*Öî&Ko8E>ÅØî˜0Zxݱ%îäü¾f²­KšýªM§'¨Ä£ÔÄäÔ íÉüƒH²ÉÑD}3­¾ñÐúB’¨û[þ”ÝFHã<‘ö~Twb§Ä„³GÎö×g:¼ ñ<§ã-7ç7¨‘˜ÊßCe爗zòûs¢Ý$¦}õk@ztЏcJS¤ú!ïæh‹tGMƒné%¥éZ¤ÛhaúJ‹É4.q躶ˆÝì¸Ñ†M|(·(`0%å‰{nþ$-ÆŠ©=¨Ø®‘oÙñºª“àkx´ý½!:ÓþT5Õ’$a[8×/nJd[kã?AYyË]zƒÛÊ —cĽ£­vvìš!B 2$Löm݉ü×ïóŸÓ•›ûË’ÈøP§è›õ_fä½OÊ=+ÑçF­”ƒ‰4¸eê7ê#éM'nZÍßYÄÖ£Ö1g.MöâyÇ«Ø/¶Ç?°LÆ@,XÙ^ =ŽÈbï(þ“}™@[üÝ©ätÜ{Aɇ‘¨ÒhÀõ¬Éˆýb­ÿè-¶ B…—6_šÒL;&i°Ô4…æ™–A*Ú™Â7­>NS ³Ç±Uu¡¨i›Bä%t®$ú®ß±òÆ8õ-IK‹y¯ïNИ.M{ã ÍÏëQj"h^±Ñ=”^hÑõy:á5=ð©j2,íˆØWÉgéÁÅhUmºg•ä?ú™•½¤ºÞaoÊ *°…Q@ݽ<*ßZÓÈ%q¸½»ãññð$›Sž –¤Š³gܶ´~©´"Gô±‚öˆ2JƒÛ½%ŨÊΰ0f‡Ïw•¯ïÔ²Ö\5ŽÇ`¯ï¦<.h¹“’’K@„)I0P„®éQ’:Ã8u ÉŠŸA ×€²ëiÖ¶O§´šN‰lÔd' ‡qø©ïfÁAÐײÇRÕ/_X“NÎ÷.Ç ­÷§8?áW_ÌœsrÆ…rÒ‹ü¯dç7ÖôǾG4&ÕÌvè&JÚÃÊiÄ dŠ ŸEå®M÷1ÒŠlÑìq«‘å)F؆qO%Ø-ò›Òq TI|Zeg¢T¸a¢4S¹âRÞ”T‘Âߢ ÕÐg¶V'™ŠmT¸‰Éæ0SG´¸Õ¡,ËvÔX£kÕ³Ä|¬Ô´Ùôv‚·֒/øË© PrÙgÒyYK˜„–coÇŒ>JtôZ¿êÅŽ|N¦Œç4¥ž!ìæŸ“ø[iGóH¸ª¶™ûc·—£™µwÆ zÿ²yŽ&°ëùU™lRÅ:«oõ.4b´ÑÇ*'/O×ÓÓôå#*yO¨ä•?ÏŽ}8ž7{¬%cé ×ö)u-ÜðÑXå¡ëú8 &ÀaµáÚnÈÑÔª¼³8DU Åúå‰à¾€¶<ê?!IJÙ[—‚Oý$‡® A+›9Õ 54¼UÁžC‰ï9¤ÇÔc.p/¨ù¤æ6h;nÍ_¨£Í[ÇèüÚ2€·?5Ïj¿ “ý2"ñÄv¾¯+H Npb,|q·£‚/gVàá©).h¦| R¸øB5&tç†ûkãWbO{Ú³s½j~òúŽ£÷êBÍ“Òðò­‚.ÖX  ò·´—W¿ÿäŠFÛÑŽWwd0N ‹®Z‰D²ÛÏïÂÌd\™‹—²ŽYzà ?˜šäú%eÊü‰#?)i&Ùqh–¢i¤ÜŒŽè©ÅO§æ{DkD¢ ¸ö[+—öˈ‚qµ®§è¯ —Þ ÊòÒnº.=ƒ“Fê½»ùª4ÎÆž¼ØÁ…N"ê2ý å‚9•®Å8‘ÒÝeÏM¨’¾E´xÁzù,Уì’"»Y.úçwÏÅbS:ï€`™¸OG|Ëê˜BD¡6NrÄ“7ÍÐÜòÙ>ê¥ 7W-LÙŠú—ò4.‹G×ø ‡^øÇZp4MO¥£G1Õ!t¹·ºÝZWÝÈñÀ(L©Á}|˜.K‘Ì÷)×tQ3Ÿ>ÒZ`s›Õ[±ðâæ5ëtÁ¥´õï ‚Fx Tcˆ{rf( D!/¾¡IÉê wy$†ÊƉ lã ¯î¸o‘þÏáaˆ-Š;FûCÝŒ\ãç¿&2¶Š¸óx“C ã¾4R.î­™¨—ó×* 3)ÂÜB‰78ü*mó í†c¾–!ôzDÔs!_\•-‰ä¦¾œ¦Æ%Vy6Œöbr}ZýË2ùàß{ƒ&­ €¾Ú7.—Û†}hã‡÷Q¸ŠÛ(*´u]&Œ<ïtÕ¼ #…p&[Çnò® ö4! ²ó}„òVxĈvÑ ×ÞܯO¦Lpq¿[õ)^D÷}‹Í5-è”fà¶7 êyÇíúf}xú›\ã´|ö´CîשŸÔœ~_àõ*.o£e1„‡>çŠs%)"&ð½„\©úyùL¸svȂê q7ÕßIÐ_i>îö.}µíZ¼£\"q·Cx¿¸œB¸tÕÉûžB¹ã)§ÉkN/q)é¤EÊŸ³õ¾¼¨×£ Šä™ ‹\tjfî–ãÐXÃ|´Ù~²åñxpÂKæj—.u|:ߟE=¡ÇÝÎWí¨—“H”³!Љ½›¼‡y3Pº>Þ(ìBÂDÙh4kGò‹¬ ”Í$.ÊË=Éd×ý\“’À¹bRSÏ1„œw—ŽyG6½»ý]ò(~ù™rÜ^²;Òε.žöP÷³Ø k¶g4\º‚$áC^Ýz*ºÔnX„U£ZSoä=½¶ƒ¼€¼‹Î”ú†ÓSÙZäœ=Jå^îy‡t àwâ6qœ´£6áiÛûó[¨€…1ÚCÉlsñºTdj}õoÖæPt/ô8ÀL Až ϰâNÀ<ƒ™Tò÷¿ÇÐÓºÖ°ç@´¢/ÆY­‡©³bÑç6[$]÷·$»z”VEš9{‚Ž\€xøÄOÚf Ìãb¡“‡Ë{C"¦KŒ¸‚z¡ïC´fáÖÙç6Mú;­œt$CS1¼Ãz&Zõ·\jÀfž^ñ_1Ü£ŒVØ¿95Yl‡7ÌgØUª‡ãy ÎÌåüü ®~õŒ¯žâlZ\t7*“Y‡{ëÜ *ŒIQâ¤jµÝ²Ê'Š÷5kk»eÀë×®yžÚ¯†ðk1˜ÏôÀ„¯f3g4ïm*IcW?ãö»[>QlŒŒUpòè}–û¸Â‹Ì„ý|Mfm à^sWn&b}ùúù4Bãë°dk*."D&SnðÊɨOÜ_c endstream endobj 5144 0 obj << /Length1 2253 /Length2 18388 /Length3 0 /Length 19721 /Filter /FlateDecode >> stream xÚŒ÷P\Û¶ ã—@phÜÝÝÝÝ‚Ó@ãîÜÝÜÝ@pww ÁÝ‚Ãcï}îɾ÷ÿ«Þ«®¢×7üsŒ¹rb%UzaS;c „­3=3@T^…ÀÄÄÊÀÄÄON®r¶þ#…'×::ìlyþ¥u9¿ËÄŒœßÍäíl2.ÖfV33'€…‰‰û íybF® S€<@ÆÎèO.jgïá2·p~Ïò?*j377'Ýßîa #ÈÄÈ oäl´yÏhbd Pµ3=þW*> gg{FF777#';Gsj:€ÈÙ t:ºMÑ(Ùÿ&ÆOP³9ý#Vµ3sv3rÞÖ  ­Ó»ƒ‹­)Ððž *-P´Úþc,÷à?­030ÿ7ܼÿ ²ýÛÙÈÄÄÎÆÞÈÖdk0YŠr ÎîÎt#[Ó¿ ¬ìÞý\@ÖFÆïnV½óû;'G½³ƒÈú/†Œ…yo²¸­©¨ ÐÖÙ þ¯úÄ@Ž@“÷®{0þ}¬V¶vn¶^ÿ<›lMÍþ¢`êbϨn rpJ‹ýÇâ]ÿGft°311qr³€ »‰ã_ÁÕ<ì+™ÿ¿×ïãeog0{§ô™߿ཛྷŒ\gG ×¿ÿÁ33LA&Îc 9ÈþOôw1Ðìü~òŽ w€.Óûà1˜þúü÷Iï}¶Líl­=þ˜ÿ}¸Œê² "ꪴþ¯JDÄÎàEÏÊ  gag03±r8ß|þw%#Ъ`úã+mkfàþ§Ø÷.ýOÁ®ÿ9}ªÿ,5àÇR°{ŸX €êÏ€fbg2yÿÃüÿyÌÿvùÿ7ÝEùðÿ[„‹µõßZª¿Ôÿ?Z#µÇôïóêâü>ûòvï`ûM5ÿ¬«<ÐäbóµÒÎFï; lknýß&‚œ$@î@S%³‰Å?£ò\ý¯³Ù•ìœ@](zf&¦ÿ£{ß*«÷KÃé}ÿVß—æ§·5±3ýk»XØ9FŽŽFðïGüŽØ^Ìïkh tÿ{‚Œ ¶vÎï.€wz>3;Gø¿Î“ƒÀ(ü—èÄ`ùƒ8Œ¢€Qìâ0Šÿq2%þ f£äÄ `”þƒØŒ2Ð{vÙ?è=»Üôž]þzÏ®ð_ÄÅ`TùƒÞ3¨þAïÔþ ÷ êÐ{LÍ?è=¦Ö÷»Îèz×ÿAïlMþ‹Øßu&vÖïGö?6¶¿$66üÿ:KFÓÁ÷žÿDxgúÏ ý1x§döþ…@ìYÿ‚®0ÿ%°þ£ÿËÜÎÅñ_áÞ Ìÿß ´øSî{S,<ì-€¶ÿ²x—þß»aõ/øNÙú_ð½6 ó;×?¡Øß]m߇÷_úwòv²¿;Ûý/õ{õöÔï½±¿ìþÕ½¿è:ü ¾³ùWæ÷Òþ¤ÿ ]ÿÅýÝÜéý*ýãðžâOë߯$Fg G࿎糛ݿÞ)¹ü ¾wÃõ_ðÛ¿ŽîÝû_ÉXÞÃ{ü ¾“õüCö=’'ÐñŸTÿk±M\ß_k_¼ï[ÿ?øïw(è4_^°3á ²¬ j¿¯Æs£ßàŸ%ßÕüJMïµìøÃå6™º:#`Óñ·pòpêÚŽ8Õ­Ð Ñ‹×qklè÷Då¶'ïgƒx•éÝ6ø¥©O“ÇÂõýpøôjB{Þ/ÞþV­à2ä9.\ÈJyïÝú$ÝëûËVÇBv•÷ª9džËfè£Õ£>ûÏ‘çgÎc“À8Ó| A¿pG™»ý=‹ž=ùF$O ïsÍZ襳Åó0ï¹^¡ÆâÔ…C†£ƒMy‹>6Má%r"ƒµèUR¸6°äÞÊWH”D—ºFÊpÀ’^ R‰´mî­u[î`þ•“ ¢Äøø+±¶´ÃÀ‘D³ºÍ ò£s-«à ÃLd½ý·F·™e*þ ÷Lý`ž“8±)+Üm|]‹§ ‘57»@Æí|¼à4þ«´ì'Ëí'3Íg¬iÜ+WÑÑ1MƒuöÚèbóUMÛTÍߊϾkzIJ$îC½ƒKáÓŽ.'2s…Q‚ã+Ç2™Xá`—"úùÓfÈ”|,ñÆñ¿ðU+a¬PZöÞÎø/"Ÿpúí¯<^»Â`d-6<÷Pá”#>E³Å-õ?½õ}ØqzÙ¦ ™÷o{BÓ­5®3&¹\4ãÓƒs7¹ø$ã¥= 'íg›œÈbL÷ †”§f¹+øð³‘g Ï»‘ ƒ¾Ù𮰹ę`C¹;Vw®Aíjs!AEÖ;ŠQBµK™n7yðä³R³îŒÄÉØÖ#~Zÿ¶¸*Ðܺ±ó:H½Ôd””?lÉ/€Ï\ë—$mÃýHlø¤C‘«ž‹†©ª¡ã¼žˆFNu}]$Ùûuû³¯{åSkíX‰?¦Â‹ŽN“`&ŠœŠ½òéU{¾Å}•?Þˆ%ïî±Éj­q<g· î Õx'بí­ØX™ü˲>/ÅŠ­‹¹ÆVÉzþ=$¿S6MuÇç:¿¼#ðÀê,|˜k³§Ío)í9Ý6Ã[X*ŸÝd\á&Uì×\îRù†œ¬xrâÕQŽŒÍ5u?y6Æ·rSí·Ä—iO1˜Ð*Á…MLµ^Á3ËÓå>šÈÞÈ6ž-½ÄÈ0€[GGûœõx¬ØTu®»ÏÜÙ³+è¾Ò¨x8¥&‘ó3žÖ ´¿ È>B}ô2+YÞôýÊY5Kt÷ða[ ƒº»”j | C¹.¼KŸƒ URd²‰ZÛ,cÀ:¼Ë¼…*ÿ,꥾ϯ¢ð;ü =éGñœà㘦ï±)vä Ðkò5.ü=®tä^K$Ò$J.êÖˆ3E¶é>çY‡Ù?wÊò`]Ž>XBç®yd¡Héëd¥Ç ~!‰æ®í ‰êØ}E·0h¨Ñœ[sØïY£Ò,=¥·à²eC;Åltd–“T0 ÓíL¯}*ƒÙ9ðLË:ÞÝëÐè1Ï·n¼ÇYå2h…–,±´œt•P«èË×$igvÅϤHMÔÀòáJÒ,.Îû>ìœÍmöÁÜüæncÖin]–À† ÁÇ]÷v˜AGÔ|]8ûaµ‚hìò†Ûu’PŒjÚÔ‚{’Ž0ÒNvšmê‹`§PcÎ/öaŸøy—@xRŒ Hy{T Kî­$#ðù>|øºÊ›ê2•E` ˜&Úß7‚ü "WÁ yb.Ï^ éJÓñc'3ìa0/¹eÚÞ—ÂkZÈÞñ””Ûõ˜Ñß°ÔÇW£|ÅëÎ+K¾…–̈ÊYUô¬>ß’ó‰ÖÔà1T]èõ°¡h.Ð ½èý¨4š¦Úösˆ6‹èV\:{ƒˆˆiçtôŠn¨NI´lCA=äÕIÅÚƒ× üb­¬†rX.0¬¸‹­£Ï+m·ûÕ&K<ìÃjÿŸógT=cTÚ ŒX·:Þ‘‘´œÂÓ>le°M_àŸ6[·j<Ú[?®Î°>PP/í°/‘(ªÛ§yÛÔçÊÔ½—l¢œ$ºjÊÇ­? §×ˆù²»µÁ5ï3svôU~Wðá ÅE9"{&jÙ‘ÑRnò²=Š^¸f£RP(h"Íaâ¶æ^ãG?Õ¡Ñ-i9—Ç–.›µ:A¯ôcW“UÃhl߸ÊÓ­7ïÍ„' ­Tú˜_¡.žn€tÇ"2ÆéCiðí+^vÓÃ4=ƒ|”í²k¼݇LôÒ¡”É1UycŒ»ùOE òe·³cF?že÷¢@ø?@m]+ mC6½ > »*1}–òßh·ýä›{Æt›í[ÇF¹7³Þ%ÙÒeVˆÍöâ.¯Ð²°+ÿ‘†;ɦ4[ç9§Ã<µ¬u¶3qfúR7ìV3Ø«-XÎÊ1:gÜ-UÙO A§°g€|ÌìÞìTW°ÊÄ 6¼1¸Í ÂTúqs–bµïøšŸÝKŸM}ÅZä…,_6ÕG ™ÞZu!ÑÓ+zDé³fàd+èÛ‰7w£<•*£ê¯¸sÞ²üÔc žjOç5)p¨â]Îz±¹êít$Ò øûÒP²„™¸?~În1; •C¦ºr|ªºå/¹pR}òÅûXXÅH*Ó¼%ßïžAÛO±_fªö…!7Þ"s ƪÀqÝ­¯•6~"™Ö —ý›}ÛOïÕV Ò·¾VBQð†¢’<´£Šö4¿“&اõ¢*·™bÉ@&ÌnŽO*Úˆ‡RÜæáA°yËÌc ÂaÍêÔ^iÁÔ þú¡"¼žä m^Ùs»OËÅßkŸÚ ,Ã1@û-z…•šOÊU=8²9ÌB˜R^†îþû¨±î×5ðæuæŸû¥›ÃψÒkc"ÃØmúȳøwÞL§]øPŒ~¬j O·¨À_§Ð>#)… ·{ů[õ¯àYøÒÂ@É;$~Ê-Qèiä ®’¨c»(=Áùg¿²(à®[ê7*ݾ{Iš³ncNqèå`ŸÊŽJ Õ+*ñ‚ùqß)1?dã`w8Cc[¿Fš‹°šäz¸fI´c‚T;êºlŒ0dNLâÕÀ£¹¢‰×MC;DAXðb ¯}‰h+n4x9檻ãJ;*elÉx2¦o‹5z¬•¤GtŠ2E\Þ¾Ûg$Qç“g­óƒ½ŠuvæT}mî?E7ÍO“Ú`Ø|”(vÖíØL #w”]HÍä~Úm v'þƒK‘A7ÖëÈ,³øyÝÏ£^û*oÒGzXQv©a–‰%¯ëÚ–Ìdôp‚©>ÜŽ°x­Qƒ™£¹SL3´û‡´™…ÍùÔ“Æ,Õ_}nv[š õéå­h#&ÖÁŒwêí}­WãÝØ;k¹PÕ~|ˆZ .(ï%DÏ!î@50¥ä†›¯ãÄ6BúìÇùFÊÏ#~ÎJ\Yû&0èÐ*èâTµèGÉÊÛ3xŸ0𥲧àLe'BR†Œ8«ˆòöÝ]85ÒÍÝxø\éf&-]‘J&f½å¦ÎyV29hÐÂÈĘt} îÖ Ê=Ù¤—F%HÚüú˜t¼ââŒs|5䣨¼i.xJËvÅðâ‰ÿê¶P”IbQUðB"› ƒÀ¯Hâ“]ÎtJQ•IÄ:ž{ÂÏT׎’µÒP#¬ãÅÕ(ÌÉËØ¹÷ð¡ó³A7CÊáNÆ®mðÎxaÓ½í}dgüÇô?½÷#*Ä:‰Ö¤DÊ_¿622öüZß €6Ÿ¶Yx€TíÃ’xPÄCï¶åœíß8Qߌ‰PO<2[^Ï[lGF™r©´)lëíY™3ø],V btŒ¿x¿i‹Ó=A3Ïñ³Úu3y“å%ádð`ë¶hÑùˆ`|»ù¡}SË;ÖÅÒ?À>ñ•¦Ù+1õÒÙ½yÅs¡{Æ"‘Bc¡@ܯ\tuéYwýI€˜ú›»nFþÆ:;ÅN×+ÁgR!d£bó8Èg2tö 2 ØÀIÞ"›/êî¥ÔÞßúwUŠìÍàh´%F“¥>~ìrBÆ¥„'¢ Øïèç§K"cƒö<ÞE¶ 2¶ºÀw “Q÷dÚÔ20W%ÙP[ïï˜K7['|nøªŠ€¯úéÌ;5u¥¾À 6ÉþíÞ„¯¤dIPlÚîF¯úáwÚ.Ünç§´7‘AIÁOu\$ $~%Î3Üâ÷ªØÔCè3ý"¿Üy쌶‚Í>TGŠQ¤àñ½R!qÞ¾¥+¤ÈQ~'Ÿ5`~êTƒÜ®âà†ô°—ˆh¹êØB½ø¼I)êé+§ÐF=Ó®±»‘t[N¨È´NòT“›v>‹# øœÜ_zâ7Ôç–ö:~èqë©@šŸKk¤}.MB§^ªÞáÆ&Ù³šB5±½U¿T}Ëaʧù Ô`¯Âþ ´pxBvÇ¢ouC¬«^3º¹¸€q\ yûX¶RBd”~E†Œ¡‚AkzÐEç–œ3øS£Ø&§!Ö·ýZxúuŽúôÞ[ú—GF¡_sž|^Ü›0yt“­%ðCh_ «žJ2^$?ìÅ\™Žµh—ÔãÎJ†âØjÛeáÈÉïÕ|IzW\—H…Ë wŽºëQMB{Ó"°›É…K. V-uc4æ$掠—ØšÃr’ê>NE†‚-|¦xw"ÔSŒêŽ ¨yw˜,Þ¢H9m¥2–Rà>=*@—›¸‰fq–Í" “ùd‡·YÞ‹í‘[tç>f¦B° òr×Wúp»x>7£µn®Jƒ*¥•rgܤˆ(Eƒ*¼¶Ð1P,Ù-ÐP&Í:’áí«À)gEuàX’ÕòW6+ƒ{•G-á«}üú|ˆ¢Ôb:Õg±‡*‚ÿ# ÚEÁ’ZÒ¶“Á -Aàì.ÃdO›õ® {Lºh€H'¯ñ¹ÞØ(ªÅxšM)À»$ø”™ ìC­úëøDB(¶DWâå ?¾–Ó2íîVÇâ˜óÞGÛ4"Çâ¼wDh™bå‘ñ#.?GGA³‹Yënh¶ ¶eX Èìº\RŪ¬•lM¥ö‡öÊ?eðªKÔLn6–.µq˜8÷Q]wvÕÃ(ÛúPÛXÀµ}l8üøý¨‰ÙqkÜ6‚ˆ:C9ëÜ/m©¡³«~¢ãØ1Éë¨íº þy«3Lš•w’-Æ|ûƉ®vjo7;³û[÷ê©©²â^»UÁI°*m G$xBMQð¥€×Þ‘X!†,+d?=¾çGJÑà¸Ó0ºxcbüRd)3m9ái߇Àý,¦ÓU³´Û[;ºÈ*óuöjÇaÒ–ßÞ‡A6ÕLì°£»3v27ö}RQ—¢ Ív.^§è¯JÌ>Ÿà@ØjHVÝyÄV:Àö±[PÓ×k®`#?ä%ë´VâH–­†‹×xüþbítô´mN°>©5âÑŸäĪ%'Ui¨…¸ÂÙ©EVéÒ±ÝnïgÒØøÌqÈ{:Çdé­ ËPëÉ%fÀ8úEÑHÛ¦Tg‹êï+Kÿ@/Æú¤¬‘Qsñ-b7J§îÝ$‚ee>N5¤`žwâƒHTj'²„ñ¥Ä|ur<×”­Vvcª4A”°@?ê6ž¦' =ÈŽá0åó£êÙöoÜÝe¨Xmi—l-§JÁ„cÌY]×S±<’ÐU¦Õûà%7 d2æeжrN¿¼D´Gô,q’Í^µEVc"Nƒn¯@Ø£×ìuöªQ0åÝ¢õu9<ðÜÜî@=•Y/OÑZÈÐßUöh·ÔH ŸehhJªÇy˜éëÚ%PI$´ŒÛaY¾ö+JÐòv”bí1Õ¨µÁ¨Œ4Þdá Á kÛt¦sÇ¢Ÿ„ÂÂÖ;y2ë~9ÖêÇìñÈq;•!¾gO;ш%ÉÀN%»ýˆ9+@ HËÖæ1/T‚¹3%2¦«MÔÒžt WA@oøŒ•ž9O\XLï]z«¢!ïÈgJ†f}WîVÄÍþ^}JEÎ`Èðû ɹ+ÞûrÈ/,ëàwC¬-ó®ÅÖsz¨’¹õ…ÔöÁæƆb Äër¶[›¢ Âà=²˜»IDæ·7ü¹nî ©®–á‚I4Ö˼‰««E¿ùô›¼@Õ4Ú!,! ”ñŸû¦õº257s‰ó6 í—1zϘÌbÛ­c×mÛfáÅÅ¢ìaDy.k® ÐvçN”Q¡øóÅ`üËÔlăüÄåEo#ª¾ÔÌÛ¬ìüŠ·“©[¡³Y†Žf9Öà­ ©ÌF4´'ʇ©œ\:òûµû(æÏìvŒLrXnuÁ+½Õÿ0µÌ¸lÅáÍ^?Ÿ¯B¥,¤^ÔФe-lί"ÐxÉå*ª™ÉÓJV$ˆªi^Ñ€ù¤]µä?=†`äa¡ˆü(cJ!Yn9yo­ ¾~£ÜòWY#Œ=~&¶§C Ç`Jà®Öy]CI¯jfòÞ[‚Mg[’#à'A×3xÌ'‚ëÊ™ì„ÅÇñª½·j):ÙºƒôÅqWuÆÌ¡vké³öQŒj>\†Ù·Ž0##ò”•Œw2ëŽv7t9mòÿPArÛ BÐûé@VÒÏ‘ ˜©ƒ<˜‹S ¢(ÿÅ™E ¿`´68IÔ¾"rÛTL}ÉÐ÷"¿gç~àG¥ó= ¼ÌœeUHkÇoÐãXªÍÀ£Æ-Þ+hgÒF°ÜpöWa½Ï²”¯¥%Ý52—NŒ€ØNsOú ·§ø¥å-ËÍêàøYQ!ݦBìAò/8& 3œú/úÇg³)WùõÅ8c˜·iŠÑÒg¸Æ…|exÉÌ!„¶yRøBÝV–šóm«_ý¬cØãÒ$QôÎrÊ [aã¦Ö&Qe›cÛ~kÝ.UòÝ¡sÆY¢<Ù2ϵó¶ývù^VAý{ BÌùB$çðÊhMõJŽÑ‡ @Ò…CÒm(õÒâX0¨Â­"Áð´²×û2 C»lÛ¯<òÃû®0ƒy», ½¾õ0aV$öØåwïêžÉ+u@¶ä^³þ3vé³Ã¬y³öÊñ7JÉ";B±£un—2"!í>ç «Î…¾³zó‡û\‘4ÿÏÀ+U|šp,Ôl®…1Í|ŸEzØf 9ÿQJ»}kÆJtÛv›¹»1ËGÆÒ¬¹Ï'ʬ`9°ÚMS¾ÞgorGèNì” HÖ(ƒ(˜òB£³Ÿpvã<ór b‹¹æìÔî¸ÝQ2XÃQ‘‘€_æÂmNXa½Éu5,Úû>ÒL“]]ä$ºheÁTM¢‡Òó<`Xw¯‹[°Ò„Õhº >9DÉûä;]Ìú¯ÎûtçnÎ_µ07¸3«ÛЇgüÍ¥nmØNÆOfÄUŸn¸@ü#Ò´£õ®$m`v­šCÀ1'vßš Ô‹Yý쮌¨ŸÐ °l­` Mö‹š¯ÛÔ@DhƒJm>e’“4FÞˆýϳôÃqñö8ç^t‚Ò¹ò€×ŸsI53l'\Š&Ûx–Ïtû˜ÍÀ³Ú݃×yîVLÀ€Ê%ΙA¸g¤¢±úàÕ·@U«ï¬;UóërU¹«0Ë965õó·ö·?\A'Ôãþòþšñó§Ð0У¡×_ãuãL°áJ#îaؽ­‹5ÇØžšùŒΪî!VaU4€àþ?y'FË#‹Im°ù$Ö–‚ŸuƒêìOEG*厈,sLF{ôQÅ/¶¥?ÖÑZH½zÆKб(-Þ®¬{mB5spãÔ Û´ž$Qü@¤SNä¾£gÔ½mFw®œ`t×sEÁâ@2cºAÚjŸD„‰èDÓ‡(d‹Ûæ² cýi¿ná}jËTáÿ0óÁ*?av'ÛÈd['àf®B½³‘eAó×ø¤ˆš#IRmŸx î’ÏT²iC6R _¥ß¾Þ˜6ª'wîSÿËo…2ÎæU=>VFT¯*»Ú|sÏMy¬b‹lˆ†XÜ”Iž‘ô0šŽ-2ÖMï°ƒ}—6ÖÄœó`ÍP¤q‹ª~ôTaXà•˜½ÌÏ yÖñH¥-9Á­ÙÔZئÁñ¬µ­!d¢ô1¢ËUÃÅ3„¼‚BâžD)Ñ·j#º–¼‘‰’Ìø¹ aA¬Mhˆ–¬Ì”@²Ò$Ά·Ã©>Èö“߱㬿¨o¹¹Á¼8_µÉ@ám.Ho¯™+$Há¢ßÞ¥¤G\‡® FšŽ|pÑ©ø´ö™Nã ÙÕ'UpàžV)÷ãÓðA ×És÷õƘOM` t*÷ÅËÛp×^b·J²¹HÁüÍóÂÌfÄ0Ž&:œÙ"!aÇï›m˨¥âæ µ&*·w­îêØþƒ…ëæ1Zé´‡|¦³•u\å,ázY¹˜¡7¾¨˜ÈBšˆ=7”3ýÚ#-úB¡Ú©í€/­h#aO@q@ ýÕKQdK]^íÆ§‡ß¹ûÁ%ªyøç|î„…'1¨²¸>(ΈUb?-f”WéÿâÁ Ìh‰.±øüŠž6ilüuŠña¥ŽÞ,„y)©B#Ñþ2‡÷ô!¼Û)¾ßóÑ:ÞP ciì:ï#a¨ FbÒXÒ#±Úödi¦ðGiœÃ¹ ”vܽÝúogúc¬¸û 2TÞÌÉü+kÉ\u ˆ=G+pañÚˆ!¸ÒÉÆÖ·„Qz-‘rˆW–öã+G³é‘º*mïÎ̱ƒ˜E/x&âXo²¶Ö ·C ýײàµ%šÚ¼Þ x!5¾sX(†‘ú­›í¥üW¶MŸo®Š‚ë»îQ°¾X—³•˜@Fu1"–2‘õc ËC‚æ[üâ3…/¹R™SÄ+ð]¦âž³£a¤oéS‘ÖHèo÷;‘ñ½Ü_"ᢳè‘~{¢$ ÉòjµôhåêÙ/ñ˜ÞÆ«µL‚0C„ÒåÝ./¨»ÔŸs3çy_Â2ÔFEQ ʳ9åy¥@á¬Í²W÷P5ÍkÃã=àMQ‹ê+Îd2ÚZ}ýh㇓]äPÕU frE2ÕÃôqìõOÝÇ Õ1^‘ö²•ÙœWðñÇŒç6×6ôýp(”;èG¬ÚTYY&×üÏf–V€¬ÏÉ0®{ÊÚ,&kb¤ªrï‰=WVêÎ ™'ùDZ¤›ƒÐ ßÀ,Ö¸«O̓H'ʉªÂÈÞy‡øÑµÏ÷¦ ñ‰Š¿ ž©¥v‡3°hrç,o¤› g¬hF}RàB¾ÁÁ °õ˜»ØNÞô™úDÙ¦ãg Ma“¸)ìȶ¯=±P­ÐwoÄtiqó z²Íû+[øøÃÜ ù0ªqeà œTT@ïR'oˆ@~¸GÈiApRfû€¹0=V›;¦EíQŠ ËyÓXûèA«—ؤ|aþ*E” „ºoƒ$¤Š–¨=Ò€>[xÅÛZ^‡Û°t/úfÿµ¼ÇÈ*ª[Í®ùTm^Nÿþi|·¥¬ã±)“€Ujl ¼¤ÈÆ Ý3ê·Úá}&ø<éµJéß…ü‹µ•ߌ¿þ6ÚiÌÿÉÞì ž$µ¤ÎD¶yT K¢y 0©òÊùœî´ -mKçUóqÇ£¸q_Šgo²~ óû7ŸjtæDpÓ0ôMo(I.wŠ4§`Ù8Öö¼ðKeþĽœkìAôuŠ!…k-¼ûÀLp-°ÈGŽ’¼Ê_5(+m[Ï7jb2þ°Uø›ý…»Ãæ 㟧{b àën{1jÏ©LˆSò¥f»¯¤øãZæ—ô´ötß:ËÈCSGÈÀ×åEÍ4¦´Ê ó§ÛBL?¾>>Ê&wøoWÿbÝc!)CHÈý€^Eý‘ÿÈÔ0a0ô"Ì»À%†ó·ÚnþÕkŤ+³pV©Õ¤ËÕ`°LÜ¥I½Q7ÅNÊdõ~”„0ƒúð•âÊ7V¹ÃìNEŠ¿TÝmÊÂÆZpÂíWÞß©PGÛÍZäÜ>ÕŸU8ñ¦ˆ3 §A¨zå '%“â1^2_¤XÄÌ•±òž“âÇ(ðµÓ"GåsÎâ•> `ûÔ~ĦuµŒñðw»Ý„Ñw¹tè•*²j33”΂WMU 71IUÙ$BVù¨+ÚwÙ‡Œåéå‹È|¬Ç§çÕDýÒÖ;´æ ÌjU¾öH¤éÎ1Bš0¤qã¶HåVãU¡mù#$Ÿ#Wžj!|š‘_W‡›*æÛfÅ‚þ§Á²Dgî}×Lĸ(Þ‘_u>®d7X/ïBRÚÚdé_ÔgøÊúF ‚o°8«¡—N„ruø¼8¤}I.Ïké³G):!é’¨ø¬-<_×2B¡ŸñYR2bñ¢ž0ÿ[B{ÙW¨a]šm¬Æ_Û[EÏý…_9Yr a-z ›Ú‘ÌØx/¢×+~ 3§±¡]ÃÁW£GÔÔâP¦X¢™>§mf{!Dpvf¹‡žÂ|`EƒÛ­ÿÛëi ˽m¯¤Ÿ:n•Óïò·çòý*ðù2è»…ÒJMÁ´yç“ÞD—ÑZ±ß¬j\蘑׮ûÅqjì‘*«Q¾ëï½ Þtm %yë ù Ñ|ÕnÍnxDöÖ¢¥Gbj”o‰$ Ÿ'ñ_êš·°PTcSùH˜À½¯Áì§ÉHEÅž~Ò|:Uÿ0ÑÊJ)ŽE‡ë€¾@ÏÒÃ6:kZïY’$nXäHÚÉí’³˜-«Ý¢Q5Ç–‚*hn®\ï† ±˜(`¨Šfí¾ÚcüvéÁm´b5r[$æNTBzÿiÎ3“Œ®¹u½ñ¤^ã¤&¹¸dÕ~Z2c&Ç‹õËT=@bBDx¾+wc=4± •Px îGuDh.cƒfØÔ#ö¾ŽF*®1Æ1Óðk&‘ʤ‚/ã>0'ÄÚ·)޹ݟ+ø<)É–#ȱ5Œ³Y³våÌRëµÇT´>$ãbŸÉ؎͵c?kLöŸÑ’•£C×üFãPĹԶÁc×Ëâ3öÞŸ#ʶ7è›\ÓËÊ£›E¬CSE²+XvÌ¥¢ÃÎÃÐrEXÈK$fgÙžôf¾ÅXQù“eÅSëšNqF`ª,2/Úé‹~ žqË0šôßæTÅ\<^ÉöU#_hzæi‹V™³“é&ÁˆF†'í6ó$Dyh§Q\-O²XC‹¯ô¾œ;‘EH;TËuüÒÏ–J.’ìôÇýïÐâḑl°F8ÐöTEèÏÖ.Þß»¬…yè÷“u à*Æ­I˜ËÞº5÷¼ ö‰ªÞ4 ϸ·ëøÞÇIÔÄ‚‘â@é·š/3³ÚBØW'ØXÿõa’wù›‰±¦Ån®ÅÀUño«Sãá±Èé3ü3'Á(nY¸%d›IŸêãÛÀLgÍ­ö2a²i´™ ¯u—¬w™Èé›Þ*Þ Î“ö©.Aø.ÕEË‹V`ºÉ·“ädU,¹n˜kðYÃ"Öèd¨¤ÀéC³ {­²á<Óé</.T’j´è¥èÕ(Q€øÙñ¶?½@pŸ÷.tg°4rê\Ū#õjƒÇžžêI¼E36i'ÿJ´ÕD Þ‚÷‹{&•­R¬/¼^5TëñŒ« IY‰ƒVšþ=F5KC °©7Oý`Pï•xí$µ{x™†¿åtRLŠþŒŸn™ûËóETâkÄ„K¤wJÜz†¼»Ìï“rÞ‡îÜÄ.éBÄî}ÁŸìÑ 4Zæ˜@' Ÿm&‚mÄ| ªñRf2šâ" ”Ì1Í[Kz"ÁÊÅ%WÝž zM7˜¥”ƒÍmõš‚ç_Ó¹GÄ.Ú˜ªâéÍs7ÄϳHÛ`(qŒp“Fú‚íD`«Í„©ÍÕÐÁUse˜Më!Žvh?:(Ø^(´º÷g[ïDTU}VM+;OÚšAT¾ËcÆ,W~´<îU¼ (_•]ªè¤}ÏÕçÛW~¨L¹Ç‡=K°« Rß§AæTóáW\ ò³¶S´g‰‘ Õõ¯|†f¤±¥Ì[Wt½¬™3[ .AîúôÃMæ©ñ‡Ëúý·mæ#mRÒÅ\£Í'ÖZóüI¾`fs´f˜Åc¥_󿑨^ëÑá_­}_ã;l+·³6–^;Ñ5¦j5O¶ØLˆ7 ž˜@Ú”™06&}b;µçY‹ƒÈGdÐÙ!ë5}òö äÒÝçÌuT (qwüÊä_Õ¹—ÊAÉff?æF›„"©ÚûR&­q“a£ q—baš/6Kx”ËH¿`kù{ϲÇ/ùXþB¶[ˈ`ÕC«ädM62¿±ê‘Á[ÕŠ}ìÉ]SãQK-“}–>Åp<ÄCÀøåýÈÓ?4tæ¹YE‚ Êp9g—ñÍVȾח~›ó|þÝ—gžRmr¯´¾9êÿiÕ¶èÈmKÉæ¹¸ÿE¦ì¥ö»¡^{Í‚ß+«ÒDþÕ‹Œõt-“ðý¦ìÛwÈ›Êd2 [ÛÑqUztwë“r¯9ݨj®EÈYpåIl®.VC«p(v·r‚Ä {ì1ð¯ßZ{À¼fJ5^¬7•añcÓ¾k¶Æ¢MKò`È ,ímË|Åíq¤h±]¯W_°sv.g‚­Žg«m©&ø`ƒÊ}ƒ.çþ“¥”lŸÅ´;0ìS¦mc-«‘剖ÜçðHrS×ù®4ÊgÒäÍ›ä ª? ÌɱáguŸL'«­YKk6äbý”¨°XÚša±yŸ¸åßa!Éòƒ BŒ¤üLz(- @Mq ï? °·lÁÖÚsâ«ÒœÇªFgN)‰¿–Ýu++˜°t#æ¦=$!ºþF$ƒˆuBœ¡¨£XsÏy‚Oµß W¶ÈL½ÿ|‡¹)ûaHóFØ ÊygZæB(Ìß“4¤Ö³Ö÷^/¼µ¥€øÿ˜@X/ Ê2ZGZï¬ýŽ9YFýU|ý˵.õð=KcŸíìã)¨Ç¾,FñiK‡Û‚µµ'+¦@¥ÒŠOcAºfN®)A‹ênf2—KZ— ç¶%lê”ÃáÏ#ãé1Âäþ¬±,{¬ÒOZ*öf[%r…ò¿haU{$´ [¦©Ëd¸Š7„9ùìG”&«?ICÂøz;=Í3Ü} ìî¤`¾èÁdøfrŒ‚alÙjõ°R_u†Pö¡¯0¿W=2Oö%~»žb¯GU9-¸¡´¥8[öýË$Wð VœûSwëCÀsôï%-Ä冯»Uö—GGüÛs,mxk+©–0JjØ}'$ä#kÜuðæ³‚€»R Á¡¥zýuc¸ÏOI‡gØŠ_H»´¾¹SÿÀu /z¨®ZÔÎ}vp ƒ}xÞ÷ÑK6–òÁ{DÐ#Ÿˆi.W^í_|ÅUøîÝQ÷"÷s9¬ƒÃ3u[ntLŸXï ±ì´­½ ÿÃ’ØCÞ€ókí©ùçL^è0$·æhùö5BÖó>"= Qù£Snó…šóô'Ê~DÓ|ÖvkG#¸ÛN©̹Y,˜+&µlÔÚ#ÖXd¡‘ožöAŸšìÇ¥ÏJ+í¼òd?Jî,U³lØ€IQ}0ˬlsrµúнüÅžãTâ»×Ll:i$x1ͯRïñ\5¹OT++_¿ëû|`&Ôl†÷:ÿù@•:ŸÀœïËËY&­†¸oJ2©rB]èCf‚R©’¦Ý÷µ¶UŽžr©ðûÂ*€+ˆ½ì‹ÿ·uçíÆöd|&ˆÞÐKoÃ9+Úª…nÙÇ“~·`?Ê=sÂ~_TÈê†ãÇÊ.FlˆmyþŽWK³ˆ)rféÊOHÙ»o,¢æ޵ÕE#90™?•8Šî$‘䩇÷dÓ­äíiW´sðmr¸'@çýz)ž–äÓv« ˆ‹ªœý_¢&š}©óΟrÀظ­`Ê,0)׊+0b¯Y޼*èœÃ®-²…µ4~µ#'–+Û“zû_1aǼó§7(î+ÃÅŠ@gè¼9ù«Hò¢eT~ŠŒ7È}ݨĈåH´w`oÎHÖ¾¤žsøñÅûÎ ÒNH‡¥ŒæÏ‰"á錗”0hˆÑÊ0Ñ!súWÁ€”­],ò0l\¤}<¦û-‘7‘TÊ\„ŒÓ¦—ÃÈûŽSŸ<¯“™cÖ‘—ÓK?ÜÏ1]ä‰Ù`Ó_¦B/!¸Ä4]!dŒe‚Ñ¥Á 1ìÐ}¬;x€¯‘5Ç…‡_ø —Ú[Ä‘Ìì´†0°Î¸/ŸIh`Ë2í$Ë\оJ;J³³k,¢61Û{ÿgž›×›õÖÖG¹o_Ìð07¿Ù~Ýx¹.]zIàAÌ»K4¥¦m½¾a«çÒ¿Ý„5 ÃÆä¾ÖXsŽeî…}u@k~÷R«=JÛAAà,›ð báÔ—ƒò™‰x¸tA0·Íš18°·B±ˆ°| xZ¤CÅGÖø}ˆËfY‡ˆ.n+¦ëÈ´3<ØRÄ|Ÿq6K¡+ç©0*",Ú)ÿƒ0[$X®öˆ"¬m-Þ1'š[}oûƒ˜Y<LN†:Ge›—b÷¬ ‹fÄ¢ÙÐt h®ñ¹è͆6sC§X­‰ÒîÚ4-æ>Ob6u¡Šüµua¸êó´ÂÄG!Ô+«lÔãeÈÔvÂÇÉíšaõƒe' äfÝ,'Ž”Ħ}’*¼R*ÅN¶5¾ÑÊ›O}ûìÐO3–Úಇaw×ÉEElüʱšÆ ÝRÓM%Å&”ãØ¸OP6V— êØö"HQð Åêñó…ÓÅöÃ;~YÜu2¦¹Nô¹ñíªHáñËÙv¥ïñX £õ”ªUY¦ÄÕ ¨Ï,8©ÎÑäJ-‘ƒÿ¬éÊ›cœ¾-ü{0÷•·‘þ~GÜhh”cϡЋžñ¼¨LL¹À´Åô"(_¬)à6£j°Ž·,?ŒÅ÷ò-bñ¼ºÓ¸ÛXbáù¶8 ÷ø  -©h|¢Ëô¥µ÷9 'w°ÿëÑÿt ‹ôÕÅ'¹‰)cê3ÏFH@±ˆ!‡Šø]ì¶±ÍOeóÜ¡-I|!ß²Ä1Zƈãó[s̯'˜¯Ä«›A9}9ó óu"‚pº¬Á LÓzm¶¢Išæ ±¾Û¾›k6Ôý}zYüŒCñò• )Ê4áÜ®|RfÄÃtL&gÛ¶IMüi«¾ðó¢Ü[ÁñŠ÷tŸ©¦ˆÿ˶÷mï~yç"»I'Ä2&àîi@TÛ¯@žìB™y‰‚ÿ(îHA”霠)’‚¸vŽ’À¤¹y p…Q\ÎŽß9;²5Ûç—Æ,Ê"/j…]>ø¨äªPÇò‹CÀ&ßä+œ¦Ø_L‘s *Y8Ûûõ.8FYNàÁ˜ë5à„píF’ÔEÿβ@1kÂ’Èôo#%&؆MÀRM!{øB_uú\×±ÎÌ_½¼kÀ® fiõÄ­ÝŽ%±«Af`®º¾²%v¿> uá (¤3‰üÂu`馶£Zõ+jÙ°a~rÎpÉ0×IÚt ÎíAUvSZ*òfó²umïäy‰]ØËrp’Rûq¼öLΊßÉHü*ãkˆ#IcSMH÷jZl:LžÀßЊè ØÍÒbçñBý&iîD^P&A·Ç¶o>'¹wtmSÊÞó„ÛŒ¯ý‡)(p3έ›@W£=kH B\ªqíQÉÉx5öPН–äwY?N°@ÿ†õUÔ›@µ±7ÎË>X&Så­}Þ@Û¥@ùSâMm¾£yªM+¸îC¬ÔO—WÀÈÓî†ïáKeœÍçq ÎÏðìúÐÖçÌØ-ÀM‚þ¦Ò,;üI”„äõëíæ• 6ÚzÅYÿÞ§5Æ c€¾ºÅIŒ(elîì¬°Ôø ÿfÍQûS#÷úiÉTp-ò•’I»ãžÀµ¯\È”Öz’â§r¾ â€EúÖõÓGÜEÌnÎC ˆœKÐN•’ñ ’‘BÒ‰Û‡ß`ICЀ˜ˆò7üi‰ážäg5)Òë( §^9;î° §8¾üŸwˆ¤ÁÃ[lVˆš¸åAÐ@—éŽÐá½FúŒ _LYá¢ñ¾c޲Ì…5 ÄI°w§ÇYà^v¦  ué4æXi1Iäox»jÈN=þÌ ¸ÝŒù‘ðöNâ@Óõô¼¥ô8lãyˆÌ‹bpá–}X”Hðß+ízM¯R¾ì–GÀ¼À I¬OøHm>ºû½C$ àºq{â„‹G¤W)uê9ÉšN½~•ä\S§÷>ŸüƒtÙ£î ÁÌn5”B`â-xqt<§@Vnƒq3Ë&åUhΜê•À¼É#aë¯ÏfíÝ‘‡nŸ>À¬ÂKK^­‰Lk2Ï8Ín’ÜÕÓ t¨=¦ÎsàòZG -‚UœÖÈ ž´<¹bŽÇ,Cwmº’îƒQ‹)NÑÿ"‘ @ÿ˜ð¢söw'ÄÓ½¹N0£°‚`U²0ר…€™1ÉEM#ÍottÞwb>^TÂ4çÝ9yVÓòÇÉŠ€"z„Ôš‹Ä°^®ËÙò@jß’*3e“q6wÙ$ÐcvÝ0G3S…MYQc¬åå*ýñNen<Å[ëÈ´ƒ“ˆQIg&ÜpMï`_þ>Ç‹«äð Xÿ–9C¨Á)ñ%üÃJùàÉUÏLâC^‰·UÖYtYðEÛZryÆ¿%=욥Òã&áSÄw¥AN_ˆÒDDcöÕb¿“8¶Ò$I›T %+Cåâ:PãX˜NBæžjc«ŸPè{c¦jÛDžË‡èÔŒ¿ý‚‚ó]Vðª0¨\ ‡xÔ)ér‹|÷õèÃ{-ÂæJ¦ˆ²XÝ;uÆ±Š•ß†B%­G1qîW³5J—jÛÚ‹'E5> <©ª½iK’˜WЕHl1ÊÎǶM¦ùÅÐ×Å÷xãÙ¤Ö€ïÖˆ”/Ë‹'ÈÁø&7#ˆtpmù+>Fývuãxê¥VUöõÁ^(j¢cˆGþPƒCoËw±þ«·Ù8eílÔø2Ä]òD`§k–ýšŠ,p åäBLF½¬‰%X¢T÷lõŽ" úŽe“²] 2Ì ¯aÌâ_ š@i1­:ÿá,ÿE® D&nîeÏ/¾ ô“·"ŠH_ ü\;±jÁ¨&¸eÀD‰Kl{U•¼D«èX~¯öbîEïãAl¤Š÷z&|ŸNÿ]LÔ¾Ó]Øah ×(ŽÏ_$Vj‹õÉ ¯œ6C*5) ã¡L’¶aŸÐE÷+éÑ ²T@¯«G‘Ž\½7.C¬ðf{ä³·jy£GQF4›)ìØyñºQäùð>‡YÐ1-BÕ,81“sÒ\Œ•õçî&!~¢Ýêü„Ô͘0ýyÁrú‰|±À ÝI^?ê«õpm¢_úÍ`Vo…hµ)Cîíq-eîÏ\NÊ4œ,ÏvY>G%ƒ€ó®“^IýJH/s ƒÄÕ*-7¯‰Ïp†`¼Â`t[‡®ØPO °~6šÕ5M®)Œ¬œ¥VuxB>jg°- [ªò¾Æ»ó¾:ÀdtL.É]¦«‘+¥·ÿ~t-x\0 ÐzSbç\F±-5ªÍVCÛÕ,‘?¹Uvú,úº·ÃGí'Õ9m:&…¼ClH–1Þt¡Ú›€€ÇZëÅA_…͸´I­nrÓøÃÍÔÁ\åÂÜÇE|×¾~øEèõLF%‡[r’¶»l ‚ý»¦tüˆñnž»ë/@v#ÕÚpoŒû“‰éÒéž;§EG£ŒËëa^*KÙbÅ,}‰7ºæã=®¨$g„ƒ°þómy7G_Cƒ¤&áß-óõÚ’_Ìyê0·Ý ÞxÜÑ[Lx<0®:!‹³¤4*ê&Þïùu"–)sçé÷æŸØÃ*§’=ßܸDÛ玒DêA€É%"L…‡’.VÞ:Ûã4pˆ€˜Á#,@¡˜ÑWhMÀ3%Aãø'Þ Œiµ&Ú–w¯NF©¶æÅ(³W÷¯º[‚õP˜-¤Q±ºo¯+Ït¹Úº¼2oZR3X71è“gªµM§ý­aNòƒ¾Ÿ(Í´Ôöý7ÏŒ2N¼¬s¡ÿYÝàq+ëÆÖwOC¸°“n endstream endobj 5146 0 obj << /Length1 1755 /Length2 10954 /Length3 0 /Length 12064 /Filter /FlateDecode >> stream xÚ·P\[×-Š;Á=@ÁÝÝÝ5Xph ±Æ=¸w‡@p îîîîAƒ;A„KÎ9ßòýïUÝ[]Õ½ÇÔ1÷sU5%™Š:£¨Ø(¶sfdebáˆ+ª+°²XXØ™XXØ()5@Î6ÀÿØ‘(5ŽN °ßâŽ@cçW›„±ók "Ø çb`e°rñ±ró±°ØXXxÿväH»‚ÌŠL9°Ð ‰Rlïá²°t~íóŸG)-€•——›á¯t€¨-ÐdjlP4v¶Ú¾v45¶¨ƒMA@gÿ*A#`éìlÏÇÌìææÆdlëÄv´¢e¸œ-j@' £+Ð ð{d€’±-ðŸÑ˜(– §¿ê`sg7cG àÕ`2Ú9½¦¸Ø™¯Ýê² e{ ÝßÁ 0þy9V&Öÿ)÷OöïB »¿’MMÁ¶öÆv ; €9ÈP–R`rvwfÛ™ý4¶q¿æ»ƒlŒM^þ¢n U¿NøÏ|N¦Ž {g'&'Íï™—y}Í’vfâ`[[ ³Òo~ G éë{÷`þçp­íÀnv^ÿAæ ;3óßc˜¹Ø3¿·9¸e%þ‰y5!ýk³:8YXX¸yy@ÐÝÔ’ùw {à_NÖßæ×>zÙƒíæ¯c?‚̯?H^NÆ®@€³£ ð£×ŸŽÿFH¬¬3©3Àh²Cú·ú«hþ7~=G;àË«üX,¿?ÿó¤ÿª03°Ç¿á1³Ô{E9úFþ§˜ØàÅÈÅ`dãd°²²±¸_>þwcÐ?<þÈ•µ3xÿ¦ûúžþCÙõ Ðü³ ´€ÿ®¥~U.@ó¯ÐõX8YL_¿XÿŸåþWÊÿŸÊWù¿ ý3’r±±ùËOówÀÿÇol ²ñø'âU¹.ί[ ~Ý»ÿªü{uf Ûÿí•u6~ÝQ;‹WE3ò2qpým9IÜf* gSË¿Eó·ýýïu³ÙUÀN ß €‘•…åù^wÌÔúõqzUæ_.àë ýw[I;S°Ùï]cãä;:{ ½õ+âx±¾.¥Ðý/-˜™ìÀί)€×?ÌÁŽH¿Ï•—ÀlüÛô7â0›ü‹x̦ÿƒ8_}¦`›W¢ÿ±üæËlöd0ÿ€ìf‹? €Ùò ç+ò°·þYîÕú¾R³þ¾ö·ù¾’³ý¾êžùR¯›Æ þ²˜íÿíýkÿzýÙÙÍÿµ²þcý[·ÿæ¾òvü¾’túr˜ÿ ~åìò|åìú|åìö/d{íèñü¯#5uq|eáü×꽞÷ð_w)è4EZ^›òYÕµÝW‰¹1îM°q \…ß híJ¸î«ˆ <\³çE,‰vÍ}xØÄ«Ã°kgýFhoöaäó–>a<Ý÷•¬ÔZ 3«å*3¢Š_‹A)áÌ Ì„Ð¨ÁE¬K™:_‡KôŽ›íÁ±·€öêw<ĆúÄ/Ý6Ÿ”1|QA „ùĨiEJ I!¨ìPïL#¥nÌie‚ɺG5>ç=jõ;Q¿}¶@Në•Ե‘‡¹£bö ø´6N;.$º€l˜Dû@5&U-_6W­Ô^zÐŽŠw€Zôz|un:.>=·jîÑ.÷gk´£E;£×šs§@Ñ\ó½@4±žÌ\å»ÒÅ}îðt5|ÿöãÕ2_‘™{TNnû3>uk›z§™ì¾|ÏŽ¢3ç„´²d£÷1¥Ð"_­kÒÓÑ‘¿lÁl„5f·? A­ý`ø)m‰gŒ i.ýQã‡Ð^íü{ØüÈÚêʾ†Ü«³k†××ý~:økaâ(¾YÏõÓ¯/$Ïfµ^•ý¸³R‘OzŽÂ™?€†Ëî×qh[ãº8Öi{*)3b3˜gS¢ŸÕ,ö;J”º4ŸL‚ÝÏ£Ý"CcÏNªÄ´MŒzK† ­“cö·ê¢Ù`/^ÖB„ZÖ‰xcŠÝhh@JªαH6Ð!/m˜pr„»þÙ{j/¶>øYžRØnÈ"õƒ/Ëé† ¢+ßÛJä#B•ðE·> ²=qà·ëxp™d+É ˆ i„p=«çðäøGáÆhD”M! 9ÙG"j•2&OÅò\g¢Ÿ;á†ß. âEöIêǸ)=[ 852o†™ F~@Ú-°«„7‹w7¯­†1—(,ÌB ™SŽ<œ„}%ãù”†Q/<´®›6‹¢Osœ×ÈZ2›OL“Ê:SÎ?+–Z=³kÈÆ×—ˆŸ‹ê6V•9lÛC@ÙàüE#I~–FÚÓØ¹3XoÆQ\ * ÕY¦wˆž}Jÿ‡œ“W Eҩ̱/üy#nf±wr“ÔÏœŸ‰Ok3@>£ãáW­˜iÚy réôú%As4÷þöÜÌv·ÖœíràÉ=–MÝG´öí“Hk% ; XòSã#Ú÷ r¶§Žs!wåê)ðµ2Ŷ†5”ò dëÙ=ôny‰ Ã7É ½³„µJ,U¡HþúhŒG?:Žâ!‡:äÛöê$˜YD'-$m¯5þBä$ó=ÑJŸ‚êÚNðÁ)ܸYÉP}þö&?\S.d¬A~.H0wˆ˜ÓQ =þŽí²¿§æRFÓùA§°|‹;|có õ/dê«»˜wßÔ/Xm¸‡ó?»5˜Ì#I0K>÷CˆòDâã0kµZQHñʳ¡Ã®'‚VxÛCÛKfX)°à(Ñ*säæŽfo“ޤ̓ÛÏè㎉óZßÎÖb]šV`u?•¹ i¸ÔŠñ±ä«Q»êéÊ—F¥}­hðç¶¥¦a][4¼åôëÚjµf91êÝǸëuwÜka y‰š)?ªöc8qɻկ¥<:GJ<">"_(JGŠºÓ€áÎámZR5jÚ¡Ô¾6øai.1ôɼ$tfÀ8Ùm¢¦«â˜0]^>Û²FÃèDé’^Óráö,Û>ÌLjv<3ROûÖ$xòNYs¤?Në=N°ë|9-C&›B•ƒÔzóìì´Ft$÷ØX¥‹m3 °Äº¨§º€Ö=]6R›áKÚ;ãp[묪`4Ê\dœ>óÔ:5¬ø ­b=:EÒ¸&ðíS UEj\-žh5QåîVNH.ÒÂ>g}³RnRMmz÷¸xæ&î«}qË0{Ùï%·X:=c” í²›Ù‰¢2PNŸ§V‚Qv¬(M¯í ­S,º¿ñ#ç Ò$J7/:éƒûË´ Ó™Hª½}ëûqŠ ãù¾…|z[S¹ ˜@ŠüOŠ Ù‡ :#`¾’#þ µÛ¯ ,/ÆÇèœ&tÐÌ#*6R3š•˜.¾¼.Š“î|ý‡w8P©ØDK-Êuö“±ï£PçÓ?™ì=:-ÒþZÍHf…ç÷F’½°Ñdz#kÛ“€¸¦Ÿ8îÕ/QF GÆî š™?p™aƒÐº7DJý©¨Æ»‡Åý˜ti ¼^A7Þü¦Ÿˆ™G'ÿY…_¡†'S~v±)k®fˆE¥'y¾pËùJY•P¤UDãmTˆ; ú¶ŒÿöB²ý.Æ„Ýí¾»ÊÀÝ[”¼û›ïr£z•¸W‹õWÌ㈦û@Úµ"Q@ìH¥^^2ÊÆáuÀ aÕfDñÏ+ƒä<ÜÚÇ$­|;â(’¦RdÀþ竼=cÞ>%½ -GPB!“m£eÙC“<+íT¿„…ìd5ýÄ£¼@íMlÃ~5OzMïbkN€^ÓO•hÓÀ‹¼¼U=úJýsηô•®‰…ËtÓÆ†óÕ†Ý~8l3àTvúb³fÆáƒMKˆ7obÞô·Ô0Ê $Ç.4 Ü¡v‡"Á‰„Ý ¯éÌvÅAs¢NÑÉÆdgSÊ»û¡)^”ÊeËÙùfÊæ·®Õܸ§'·Ù'ÊA\ôVm5Kd‹%#ÏÉã÷—>5¢Ó[o£u|÷aUrv4c…¤TÕmmÙWšÅ]kC³élu›Þ*½v×€¨ïƒ‰Ö2ÃÙìOé9xÙrw:~æ™¡Šˆ×n÷naû—™X¦&õàšñsQ¯zæB§>\‰ìWñž& Ì‹ù*gN+ƒÓ»¾™Œ˜>4­á±åuz”…k>Õª,ûޏ^ço~$(#èäéSáöDoªº]Æ—º‡«¶í‡8‹§`¸ï†²»Ä—.rís^#Òs„Ýfž\—w”¥ }LŠ€ß/’N#—#.qu¼å\Pä±Q<ð#v]¼ÚtàO,W îR ƒ„´ÖN‡ÕHY¨ã”Äl¿ŽSâÉ¢.¯%y¸dóölŒb•–ßžÁ}ÑÝ‹wˆ\Ô×+¸ù³àpwû ¤ÅŒÉ)$O4ƒIÍ»rDrhëé:CSi2›ê3c1©f~»Á‘€úcãN£ÃÖ„ÿìl_8VS{µ!x¬‹‚·‘Ÿó“Ýïw„¢­=l¾Öá0»ùÉD¿²ÆlP;jìaGòá¨z“ÒSçËY.c,O|wk¨Ná*¢xó÷Ri–Ò’¹œŒA¤Ù›i*ߨjº*2DÇ_–tÌFŽlI$¹Eýj”cBû؈ésáL‚•¥¢ÍšÕI eç…–†]ÆÏ3XÍuÐM§ŸÖnýB­r,ýÞÈ@Úò”==)ÎL‰pæR3´éK-Í;°®Ûè߯ûiÏ0#–PänZº>÷.*ŠIM dªÉYƒì;Œ;ð²Ñ±ªt"×0‹óúƒùË€‡l.7¸ÆZò’v4ïFͪ“É6)=ª?2˲EãÝô“‰ÙŸ~• þ©#çyœ¸MÞM"¼ŠÍ¿ÏNâ„Í%ºì’*dhÄ©šTéí½<‡çÒ°Àßvv•>_b쫽âÇàwÖ}õ×òîÛËÇ$Uã?€@%.–*Ž£$VÒ‰nÖnÊšâœwt³Øh ¾—¹ª °AR`ÄÇ”„›ý¡ Y_kUÏ¥@žM1y#žýÒÜì¦P¹d™LÁY“q\ÐLQÆÑÁ(.…×7KJ™èHs/*’’Èã’{á²)Qeh^<ÇÌÓ¾¸\÷ÎeMàŒ»ß –¶“^ø8RRÿtøNkÒ¶-©Ðºÿiú&óç`àÄ8Š4i §s¯¸µ#Át‹™†®”aæûYÌ\£&«Ê¾È"ƒ…6Y“)q58iw/n¸?ѡ轉·Š—Þ½zv·«™ÏO™5ò©„ÏžÒƒ›—Ó¢R[ùÜlýç³åÎ0ƾÍ{ÑO±®ã܈žnBïé=äOƒI¸õ¨Yw†Ñεí‹_@Äç­.…‹EƧÆGå`ÂÛY/­¨]´Ã£:Iç\³äJÍC,˜ÑxÌ\ Ê>Ú^¥ÈÄXU&?ÆgôÉügî-î~)&äÔù$ø}ùÉŽó<„AcÞ)^1¤˜'Øþ¸¢Ä’·ìH9²©qùüëø­˜ƒ:”UbÌ^wöÉh[:•KëGy!£­¼«rÑîn× x¤µ¹¼»Z=Æ:¢ö‚'å ×÷¼˜áS-5ä€I±.‡— ìÛÇÏ÷•Ä9¥?Ûi*Î{Z¨g 9­EÀ9·`¼±¶l•÷‹UM¢,÷ä=*Æž×’‡¢5ÖØK(ßCŶbY×ÈÈŠù>æy#-åÕsÁwAlmÛ{â¾—Ô‹Ô*Ɇ4û.”—<Ö)#J®jË¥ -vb2ûþmbßìí¬êøñ,˜óCl¹U:£i¼•dLåé½÷ÕKššúž{iìqøÊ×¶i_°=¯ù:ñ5®uB‰-r víÔØ¹EZcÆö<È00â¿,šÛ\Bdâ;:)Ò¢•?vàÆLpŸmnMsGh£“]«¿å4sÒsvã^QÅ“>G?1#ÕŒÍ üœIÁÈŸÖŠƒÑ¥f¹G±<=áDQG}pk• #ÉirÌæ—¥?âó„ïòe"ycïGŸmæ%#Zq¨ùç¸Ôø·Š™ý¢=Í9µf2ýâ¼ ~²)Ñ)B–BÛü ¡<êLõû¾“|ß ÒŽ›ž7‚©½c¼lSB|?³ÛÅ»÷4°ßGbÞ—³;g7¢Š˜NÛY7w~*ŇS1š ¾Y=Ók°¦9˜g€`y{6JƒûQ.-ÑÚy-'²bnšìâ´û’êbâR 3”sS€€ª×¨.cê“6BÎ\¯«AÕÆ8¬ç;¾°gª}öÎ^F,$í©Ü,¡%!¸6z<Ä3ÊQƒ2ÕY0S^¬kCkÂ06ÖôǸӵB¬JYùG§ˆçÈÙïW£È¼$7ã\x¶NµþXQ^ עîÀ—½¢¶iïÒ~-Q-)ßEÛk ÍwyoÖ[¬é¶b-Šüí±G ;(³³^ÆD%ÔÖ»Ž²Ï ¨… ݘ{p.Ã'.”莖ƒÃÜ+%ø)é|’!¶…”‰jdšó^òµi×]œË2†€'’Ó#ó¯ øŸEP‚Ùí8ˆIј1­ÌQ’FZáâ*¿(ÉV–Òg}ÝFÝ(òÌ ˆ›. 0M|OÈ`óÇn,QƳ á€m™ñˆwJºíÏzÜ[©HHVü<ûtÐ~x©î.‚Rü½qMcQ~²«æGhs¡"ÿy Ó9M­Û#zS§Õý‘`@Ëã6çúTº ïvžÉ©>›äMœ\Oá"l7Ü3†> ùñÜê £¬A\nž»  ª›ÍíRä†7âK‘b.ð°Á-A!ø1E‚ݾo7™Ì””)àíy¤ñ>|]æšÃüƒÖ…àΤ‹¢h/I*nÉ x§«Ya©¼È‚V¼òøxÆÊ.ð¬ºÚɵ[/Ó¦`ÃCÕÖ…«T%.«÷·©“ iZ,lN§íácÌÓ‰T¬¶hÊÖ”JôgÄ/F­š|›cƒÉÍöÊ9w8Â5S-dñ¿¾¢ÓKÝaǹÍ0ðLq' ¤“|Y(­ê˜ZÈRnÁT®šÆ8³©Qﵓ˜|ÚÍ ‚!`pðçÝJ|„*„sÒH²ö” ÊwçÄ›1uØc$>6bíð˜i@æ)O=ªQ¤Í¶cWöz.@ž\h²W‰Q{_DPÞÅÖ+Õ‡ãåu—gnÜXÊØ°Â{Sÿ z"´2qk;yíg;N¤ç¤ê·åwܶ}óª’šÅ÷31|Øm-Œug )™iù¹Ç¬á/j,Þj€sóÍ'wëÓ;¶LiÔ¼ŒhÐÜýù‡Ðrô*:@k64áà[1vˆí·Žk6ï¯O]:pJÃ}¿&{2­I—…¼*‡7mÏ£åhÜ Á³$A2W$Ý&XdŸuLžØÂ4‰U6aî¡Ò|QëLî…lÜ‹?—$”g\(R} ß‚ßE´ûP­WŒ49:ÐŽ™Nû­Xb AßJBŸ4Ô•ó+¹Yï›[þQë§µÓ%¨ÎÀf©ºç{j~ƒÔöP1[úõy'u=Gñ77±¥çÌ-Rù9Þó&t}·òš·bI =¶¹›#–ﮄ­µ}ö*ųŸ½ÓêȟΓë"7Φl6âÖž0 é†Cl£àE’vÆ-÷¾›ùvKú©†Îu d8h~5k'åIˆ*žÐ«"-631$Åd­"„_}Îýô¹ÙÁi¾æï¶ÀXç”-oKhæûi–ç¤ë”¢G0Æ„g™‡± Ípé S~=`þ ³¥C1ª½+»—cùëb*5˜VKGØe2 >øÕÌp$ Æ_Í…–Ø`3\Q|_ObŠâ§é€@6«üâ›}AØC7}àM…ž™¢œ·Ú³Qt‡ß{¬ï‡p*r‹ šÜ˜o>$vK 7a+©Lü!¸‡Ggà…],ªtª2ýõ ¯ºpª ’Z%:ÛsðŽvYäØ*f?ïÛn§4››}—Æx¢û¡¡þyþFš jµÃ¸‘ZÚ±§¼Ek¦¼ÀÛ÷aÅz/Ë_øØ@©ÛÛÆö°5(.!¾‘'²ia÷{ÚïĨ/‚tØ+{ÜŠcQ‹TUüž©õi\D 99ÖÍÝ·+‰ñšzûšžºØé¼ à0:'BØ 1”PFϽí§Jí×¶?7¼I#a’/ï þ$Û‡yŽV€M2݆9&lVÓÜD¡ŸåN¾R Í8Ë›TÆ–Åš óTàñHo×*µ”NÝþZØ}åòÀ¾ÛSoDG½¹¬š½¹â<›ˆM’‡üpÔ4_fÄþcW[¯ ‘9mŠQ"ÿb¤Ú¶0\™åñ- ù)­óƒyË u>– Ùj‰eb÷0Ð)êKÖÜçÉ#ÛÓäwž†‘j²õó¬F®;~æºS…Åù Eo Ï‘‘[|m†à÷Bö`, Ó7é^<»;Ÿ.ò3ZƒÆŒ¥lŠü$ÆÎÒŽ ˆÖÃS‘¬• °'SÚ3|¶éèÉvÒ–$¹(mQ ó’kˆ Åg“"›·–$¬Ù6cŽrÚ¥Ž­"€>øw“ w¨£¤¢Qó/+×°e|6Í¡[]ŒÆT‚¹o§µ¢¿ È‘œ6ã€÷461kQ1*s}zó9…?ùŘ…Ý™‰ßy˜9ɵT"Ø™µ¥ÿìW?Bƒ§Îh²²²yÏ¸Çø!¬ÝY€+ ŠóâÑF}S¾:úMÚA8_ÎŒ±Á§2‚©Û >¢¹¦“ JÕê ·¢sûÝ cæò“9¦9zUÚhíoą°…„ô>GaW¹–v#‚)Õ·È‘b‚|×sæÖd$fª˜as¶lY¹öŒð=®j®µÛ,P÷(jÙ?Jx¤Ê•I˜‘ºÙ ; o\c¦ßè/†Ð¡ÜiÔÍßOƒW-ÍÛs¨¿ÞCmN A0êˆRG¨VÛž Aô[ ØÏ“.xd¯³Ó2hLx³ºB@MÔ}ØA§èÇ‘b˜V›2FnV×Ü̵!óDÆU •+øCÌc~˜Fª‡ "ÞK²ú Ü#¿™1ŸdyÁºvøñ5è)1Õ¦^verŒHÚž\xë1™¬ŽIÎŽ=ˆíƒštï½P`_žŠ…bIXÒÛkj-ö³×Ÿ™'µXŒË2§¨» Mì°:Â9øVN~!m%—øvz{H¤ÖƘf<´O,y uÁq*DëS*û`­ì{÷¯P[ŽsÅŽ+>ÿ›$šƒl±è¬üÐ`÷ëŽrë0؈Ü4àк:Û)G7cllÈøi:3£Y‡%ò2˜©‡~'9íl3ç1®‘´Ð3’D]ƒxŬæ©£ ¤z(¼>Ÿò+9}JÈ#=%cùLJÂU¦1Î+¬‚Íñmâ¿F$E+v÷™?R ³<¸ ñ)ãРä) ¨S¬ªÒD›+êTetÉóGÌ(`½ð•r 6‡ ±ÒáðiHBWúçÏ€?›E»Ý&?R H™–E£ýÐä“¢¥¾ª-ll€HGßû¹ÝAZ;’s·V”­ØÑïgufKxrì؇|Â:¢Þûœaý{?צ(Ù·ÜÖèD,>[…X™ÇêRú°úzGÖwÆù¢Wè[GNiÞba¥o#W~µtõKêG˜¡Ó>?ÈE<ÇÞ]×:Fí¼·ÂcÊ7Ê5yÀ gxÊ®ç CÅ !¹àyÓ<‡×fÚà|J¥CáÍyÕî;Uâ«\•#Ô¼!µ³NŠÜèö^NN3l¦˜ƒlO*ÛÊ9G:ñ¦ý„qm³ÒÕPaâ$#K(´ÔG7Ì:'0Œ2Å>ŠF^ul-³’êu{†c%”n•á#ŒìÔa¥£9ü5½ÊšX6wÒíˆ Ö†zc愞ÂJ~¨» ŒShŠr[zÆòñ’1Ö>k± rÇoXÛ凛ʹ­ç(W8ÑÀ½›ÒV.^ îÖÙ=œàUšf‘¹"=ïcš{‰û=2ÇÄ!rÕFî+r]'ëлßûù`ìÛ¾Þ¶æÿú§«aÆ oí^‘Ë­2È©Qáù}; K]Oy“k×÷ÍIãÒµ‘ŒµË~Ðúó‡åÚüL?=À¿(ô\)ŽŸZ7²\¦ˆ.d¿?á,FûÀ()²Ø™KŠýsöŸú’­ž>Ôü}v!ÚMë0[ÞSµƒ ë8$ÄÛOƒ o)ð:Ùý‹í¡rœYó¬7¯“¦€jC`‡Z€‚RÚPº¯#z SqWÎbÃÊF¡2ÏÕ.•f‹øÁBnxÕ­7Æd_ló‚Ëx+ET41rƒ×”Å>ÞAiÂ¥ Ít|âÚÿþ§t¸ÖŠÁÏàÞ^±©Ž <ÏÛÔæ—0núm·â_";hÍ€Õ<8ý¨ÒÑL‡ "¯©'¤¯$3M_Š×ͶGñw« {I\¹4bR®¡\æ(d­¥1ŠÊpì&‹~ŸV¥ G­"Õ` üÃðÓÐ=’ñ-ªUIU½óÍ^X±c\aûJjÃ'¥žÌü5ÈoŠº17™è4Ãøîd0Ô“mTkD1y¿°%Ížy2FuXÜ01ˆiDÄ1§Ÿhñ8!—˜ib´ýüû¯÷Åü9ë`öØf>J-†o·¿¨ªKñ 9žu&‹óÓ7Žê®â€kWò˜ ×z¦öH[¯§æ.~U>9VQ΄LuÞ²º>­°B|hG!7¯é{›4LìW¡ÕB+>è7e?ÃEd¢-Jy¢œSôÆÿ1ÌÑà¢N~†+›éUÏÝø(Çè*76ùÁÜ‘"»}Ó)ÓÄ c,ÆÐòöæâùh£¸ÖÍ™ëÛ6Ktc¸1 êîc –º+‹«yr‡ƒ¤Õ*%ÏŽÛÂ|Í8*Bx~Ð*T }œöyÈ£êr?¶^?¹‰w­f² ×Ù¾²Lô!> ¦Š|YOÝe>0¢É¨.gDJ±a°CÕn7ܤrõ|(þåдù¸²0ådŠ~ôýN[Iý]éÂGy0*5®5ŽE’€·>Ø[ÎÊØœë! Õ‚%¶!“S)÷ŠÖ=΋»À’nY@Ä¡}~ŠÌ~Ø ûœW’†}®n²:Öˆò² ¶h|•,Å‘ÙThÞæ’›¶®7BÅ”¡BØžõΩšÅç…Bc½kê§{&Ï‚^4Šnu7»°¤w% ÚV/oÛ5x#9>iÊaL)Þª"orsŠ5ïÓÝ/Ýš«ƒé×så4÷K÷Ò=×ĹU27}†¨Q2LÈ_èîHùµ®¦úÌl¨«_n†pÜáßJuk?Pˆ¦>ªH>o¤'(7÷­ÀoR“ uSܘã9˜’ßל M¾Î†Z@õ†æJæ¿ÂÙžÏTO},NÈBô œ€ îîiS@91¿_#/ï%ˆä÷qlxFy`Ϊqhwïœ×>¤©DÊu„.TÄŽûnl~J›Diû‘¿|ïAÇ\Ø ü`ÂUikл›q¬ŒÍ’µ§˜Á9Æ®Z~åj²å»ÜøíRÇ#4RNW³ñ¡†>{WÈJ õÕz§…6™6úA4 ó>´±+XZû»Æ3¶$ý î™t#ðxÁä£:ú äIGéa4•NÈÉDù“»}•ô/Ü—5Rf{%rȆL¿wá{^!,߃¼òÖÃv‡¢…ÕÑÌu6 [¿wæúæÃEâ£+y탮N{^Æû]úÙß•LH#¢ìò(­@ØUÌóü[k°¢³xÿS!Î#d¾Ü¯`º õÅv³ÊánJŒßÊê3­gÆï;W$?MBt›k¸jZí ”ÌÄ´Ý÷KΘF[˜©ºGjaÞ«}ù'¾)J%ãÚ&?pƒëG Eß½åÓ”@΋p“"jül÷ÆÓÖÍH´Ì®¹¡íº=»C,/½ËÙN?¥9Ez‹#¨«´þ‚µN?@É•­<€GZ¯gÕ ¹¶ß¬ó‹G‰†\ÒK³þÓPbÑÄ9í›X½óUÅAœÇ¶_ãnÝž»D4³¶8zÄ8Á²X~r˜Çú–#ÞE>‡ÞË”ÉàL :eä- ŠïNCç­¬7"³>ýl€[½·ÖG]Ÿë$:à@¢&¶ýh`îäwH9²eíöÓ¯››²b + ºÛ$<[ABñôÚ’ƒŸ”aS?€xFž‰¯Mðà¨Â†âL‹˜9LJ¾Çvß®l({XŠ/Òd•Cüñ‚bÑ35Ô¨¥œ }'~BXòŽR¯Ì¢˜¦Š¶üÙ=g…¢Un—â›ä „(ìnqÝ*R×:ÒÐ{òâ÷C¥Ômæ­þƒp;³óQuLAc˜ •õï²:ÆSóÈ÷5\’xïèªk¢N?'ââS-àN“ÎΞ‘Á˜â\åá.V-ÙJAØ»·>VÏ=-uz’ßu³H\öf Û¼ó,€s°%“†p{Q—RÌR ö(z7ëä†`å¡û³#\=¸¦%ó’E±xäù&Ge’dôi˜·ªZ—ŽªWüFëciÖ€9šhQhüÓJRØ=ôìw&±íÛ„–x¡UI;oáq52(¨Ñop͹ª_‚5­föHzÚs¿`b½XÍø'©o ¾ee]hW"Ø~w8 ·Ž¿Á’XE˜øaß?î—u ±½ë°üŽF¯ã-Pà‹G_|y|´vJæéàx‹¦G¾õ}¿bçvû†¤´ógícç Í‘ Ì²Ò€5í£UðÕüÅi…,ÌÒyN,@ÌLYE•¾¼SÊÇSÂߘߗõƒŽƒA.Ý ž¤F3©Y;)Î`A(£]øÓø·âií|óêÚ,À‰eA1£\Ò0EtK’çåThtáü—¸#Ô2@s{ö…©ØvÆ]S…‚‰Öü"}Èš9¹á»·'}‹ºÐèËešFD«K<Úbè\‰&ë¿"ÁzäRCû¤–yR´:ñ*â+»æI Qšu ´>{Š—8ÛouUÀGI7¹´=‹ÏŠb¾55Zìo\Vœq+­õrÈ?s#¾¯Ë(l[i¬ˆ€>ဿÀÉêª BC+#¹M>Ùs(Ëñ¸¶MŠfâ/òD^ùvOé…*×£ÜB_;CJÍÓÖõñóFgÇz°•w}}ûIÚ†ó8Æëî×ÏÏŠê‰áÇ0ÑR‘`ëûŸÝt&b3›Ío©R„ù8éé3œ~@qÐnõ'YgØ9Û`~×gØ¡Ð6mŒË”<’_™»+¶Ã®×aÕÌD€'šø¡ŒÁAv|QÇ}Zö¨2Ö¢ˆ)‡íÏ6'k`½;¿ aˆLr7T¼Ôi]”\¨·Â xl®€T~1:{õÏV‹ë+u |yßÍívÌØ(Á¼¶û (¾õ%ë§ "×”‡È«ž²5v\nëWHW Ïè¸ûõob@<œI³¸³ÕÚIW:›€'ëo‡9˜ì…øZß2 ½¸(=áËTFZKVSÔ¿¤ ‡‡ú¤ø²ˆÄlrÜÇž-h  ù9ì£zéÜ‚ç?)Óâ=cèŸóÖ|m([ÔD™²;TC?Á| A™¤"x©Ì"hùQ-EÕýÅãrCcãMŸFàsšÞtÚÿâ]žW endstream endobj 5148 0 obj << /Length1 1434 /Length2 6492 /Length3 0 /Length 7459 /Filter /FlateDecode >> stream xÚVw4œÝ·Ö"Œ%D7ˆeÌè%ˆD'º0f#Ì`Fï½$ˆ^‚D½$Q"H”è%ˆÞkÑÛ•|í÷ýîýã®Yëwïýì}ö>çyÎz9Ù´õøåàh+„2…净À’@ =u}} À`A'§>kø'à4@8ch”ä`œPì•Oн‚j Q@5{ D•„ˆI‚Á@A0Xâ/ ÚY¨uE  …À8ÐŽÎH[ìÕJ½¹aw 1¾ßé@9„3E5 X[„ÃÕŠ0¨=P C"°ÿ*Á}Ï‹u”pssA0 ´³Ì]> k ÔE`ή8ðר@M¨âïá@N ¾-óGHmuƒ:#€W{$ Â\%¹ àgàÕú@=Uu –#õXýðÏíB@¿Ëý™ý«õ; ƒ¡¡($Êh´Gµ”ÕAXw,Š‚ÿBí1è«|¨+iµºün T–ÓB¯füsB ÌéˆÅ€0Hû_S ü*sµÑJ(¸ÚÁÂb¿úSD:#`W;ï!ð÷?A¡ÝP^ÿØÖHÜú×(pGG(¤“ BUñOÔ• ðÏŠ€Á`ñ«ƒE8î0[_‹è{8"~!¿ÜWsøx9¢ÖW£ |Öˆ«?€êŠb]>^ÿø·€@€p$ ´BØ Q€ª_¹ÖØW,pFºMÁW$„Á¿~¿™_ñ ŽFÙ{üÿ}Кj&мýwX^íôâù…„€¢1 ¨„(Ðçß…´¡È?ùTU”5(ñG¿WõWÏ®ûOÜþ»–&úŠÀ ÷?|7‹€aWÈÿ›õ¿Sþ/²ÿªòÿàû÷¤ìboÿÁýä! H{?1WvÁ^ÉA}% ÔC ¨XGº8üwT ½’…ÊæŠÚü aÑ?ÜHŒ2Ò×Fba¶¿iò‡ûÑ/ÙÙ#Qm4ùëªòCÀàÿŠ]i öäê:Á\±ówq%¥¯ª„‚¡á¿4'(" „:;C=à+R Šˆ½ Wâ„#Üó(B¡±W)À« }€ÖhgÀ¯£• @¹~[°PÀæ" pþS(€ùmþ«˜‹³ó•.ÓåªÁ¿ìß—ᎀÆGÑ0©`»Êà†£r9F7þ¥^¡VÑG—.¬Â€({ÜÞGMº'…ŒÂYû≊Úݶ2oLñ5ðqCŸ3*E‰¹=‘o]§¢¡ÂS‰`ØUÝÓ”$ýAÄÝ¿neˆ}F—ürMÁã“Ê6[ñ1§ŒB•^(šÆùÈdeÕI‹‘¥8§”Xkuô®íIàw-{_IÂáÎ&E°]`X2‰ZsíÀ1—š Iíæ!ui#•åÈh›<™ˆßpè¶ò‡£q¡˜dSO³à‰mãÃûM¸øò"_q­ìñåuŽ«ãÇùrÜ–vÓ¡} tù˜¯¨<ºÕ#øn_5JËÜÑM¦o˜'Xr”4ÅŽØÚ-`#ÏVå{´g¦XáF§¿è ÷öKªÁfäàKŽ%‚—šOïцf©ÞS3Œì³YS ‘{[·Ipi»¤,ûØ¢šžØøl$á3v–ÐᯯfP¼B¹…à#¹æŒ¯¥Ø2dùjšÃ´åÍÛÏÖ½úpnô¦¯’²¾©xä-Ô=akdck›´}H×ç­I Îe‘Ün™7$°ä¯ìòñ ü×ؘéM3øÔyÄ…QP²¸eo؈±pì™u`´ËKOPqf¶ê}U‚Ç•Mï_ck„+4 bXÎæƒÔ/n”Hįoƒ¶ J¿¯ÂråZnK ¼ÔuŒRjluhS5о̩k ·½ÇÜå ;õØY„Ð×ÈŸáµ{Ó:Ê Fr2˜¡RuB•¹V …Ÿ‹¼×†qÑÐýÄyÉr®ѳL³úVæë%‰S:n\°NÛÂhÞùÖÆ(øy;ð6˜yì"àÍÙ–¦B÷CîÐñœi`ÏÝ€í܇¤ÈSydÅ@?TYÿ^’Æ"Ov5ÊíűJëš’FºØ³ú½LÎêí‘OòöË ä–Þ:á&‚ž;Ô?.]ß ~¹¨aúÆaÕ}fý1úD+¼¾o­ŽL½Só–¹R²wÂzîï”4¥³·úÚÝGyRû7-–‡(²9iÊ­rû tŸnsU¹ºŸë ‘•ñݼ&nñˆ¢nu¿ì>ræ‚R"e Ý­ôpœuoQaçÏ·2Ÿðh‘^ãÉu4Ÿ´Š{ˆ?Aé©¡eeæ@-Ln^4©.ÆBÞê wñÝ,{a–ö†?ÿ»ÓËh}c™>¿öÙu´Pˆ)ŽW=õöÅë“9ø>÷Vy[*Ñ9×›ì~º‡•’"v[¬ódô×ëCö2“ IG òn£'#´vókˆlpÙŽk)ïxó>u?PÚëîk)| ©R+ÈÞ—(‰çŽLÔ´9ïè˜/Õxx¦gáŽiõÓ¥°¶ódö4¥gDïɰ'̨(J¿l^µ’xÄ7¦À6÷A«˜Pwç1“Ääju]ÃÈÝŽ|¿]6Ì»¯¼MÁ3g¼I¡銈ñu¥¹ÚYF”¯ý»Y²ã­§"ªðÒ#×8Æ2eŸоzü:*kK£ ÁTH€ê ‰¢#ç3§Óc§_+¢h&ì“ Usáí1NÎÝØ¾ïýv›Òr¦KªÖ’¡N^f(¾+`ú³o[?,ŸÄçÜ,fó¼éê›FùÝÜ™3‰¥>»Îe‰š«ar]„ÇØ§Ùð/b²U©%óR#“Ø·U¾dåS›hþÏ«ôßÍõ°|ð¦±ç“® Ï_°w¸ªÙØtýœ±õÉ4\PË\cΕÒë:n­5ã¾^ç ó*1“_¤ þ³âEa‰_ìã„»ïzóá³<Øl¹;ÿŽVeBƽpåÉaP·‰ÈmSK¤Ä9«¬=ˆ†dæÚ ×-ê •‘æD]òc’íî»Q›¾ýüû?‡ w‹ëä¼q*Â=ÅøŸ+ùlÇè»Ý• ´—OMm[˜9qYç6'½UNø9Åø|±³Oø9¥ÚõldÎ…‹ÅÚ©V…º‚ûRÅ-õ¼Ä¬™ãY‘#S¦”P:»ÃbmÔ Þœù“Á1#˜–$ù¾l¬ £ ˜ÀP(/l³ÔµR°Iv´’V²(N•ŽHê 0i à83Ûâ$Žóîiô/¾j@¢XKox„±ú ™~ÀøÞxhMôî#þüÃþ&¤:“fJMž­M5{}ê}ék.¨ÃÍï€`VXæ·‘$¤m•AЇӼÏ%‹h•×7'™âp%ìîk?»göÔ*í.hÍL~è@Bz¢A ƒE¦®3ËC¡DŠˆýKUÂúÞgìõJðéP&{"˜å`¹yWôѼ ’5i¶É²ÔälŸa•ÏŠï‹UXÂâ7žÞL\à –zíƒý,03éIù= £âÊN¬Nê˜Åíhì&÷‚Nó,ÃÄvf…ªx‰dĆ—ü‹Ša¾¸î+7sæ‚ ú­^uL)¥:!¼±GQrôíñ²»ñ٠ͳ„]®œÃÇqÞVN;si}¿ Õam„2_hö¥Ÿ®­zÍ5¿;cL¹>x—‰*GÇJ‰O•”*äí˜Î'¼ «_rZÕÝ)¼qÉØùl ßkêóþç‡:l³}ÝÏã{¶(·eâMÉ¿2x<¼–à@¦›þ¢ŸÓƒ.0Ð-Z¬Fû)ÕÛTÆ4zõwžƒÕ¤]¤’ØØoØ3‹Ô÷FÕ%’ñøÿ|ÿX½[{An©b .‹ë²]!¯î¨.L.ªÎ¼òÚäâýûXËÀ»PVÆŠDEÄžwbð"IÐéY×Ìä‘=E/nå®×mGy°k¶JüûàÀdë–1”·Tç×F¤B‚Ž$7͹c-›wãÕmŒŒê®ezz}A,žnä”ê¼øÒÛ³õÌÀærG†ø]™´É§ ’}¡Ž¼0ÃÌG#›&û§(Bý ŽLM_JÓ|¦úÇéþ¶#9Û[ƈ±ºø|D†¬zÌÊÉÜ›Ûv¸2Æõ…”kt´¶};¼×I¥qOs/Ÿ0\“ô­š‹WíûÚ¶2 ×y{(‘s™5I{'¡„1¥çÜd7hì¾gŽ=9¼é­uwvòN¡`‡Aã¬Ïw-±(=I?ç%Xál¬ÊåÞÍ0~êaÆðh\¡S*I»…dè9±]ìÖRN.PÞ’å•K€ò˜õè›$ x_WÅßA‹M¨ B€Ð'…ö t)4£>¬ßTFÊCk§á QHâ÷Î;T=S{u9q{wêÐïŽ\}«eu7Å„^Ì4ˆF¯Å]ŠB0]kk e)Žcšµ5Íë¡!nªŸNèUÝÁ3†?ý,æ7„Ïí ͸¥ÌÞºÄNñŸÑ›êZ\ԊѸfîU®˜¾‹Ý;ÍœGBFF';éTýÜ¥†øãf4£A†þ9 ?¯no^„ÇÈÀÈØÈ]»îé_¼º5\mÑ«P¸ªòÌÓäp-íÞ¢T?´åIqÇ LUéZ¢ —è'\Îo(Dºìã°o,°NŒîqÏ)½¶&ý:#Uf;“hŒXË‹ît™]òÕNª¿ûVgsg -öÕa¯á^Ô(}‹;n¦?`òŽgÎWFœeŠ…W^f¯ª ôÐ!íAZD“r› °Ç=ôôVð¨«ø†T…ûŠT¯¨µ¸YÛþ»¹ïäñøË­¤TxŠèMªóWDëÒûžö’ˆO‚^Ï Ÿû^ˆ§Œ 1·´}äV««A‡M†H^šg<ç‡kÒ¾äoìõ²•S•.ëΖÒPùÁi*Á/c¿£Æì:¤Ró²>©Wn’wh°Þ}ûú½vv¢uÖ”~A]àœÃÑ·mÃNJ¯$37±âÔ6Ï¥¾hÕåŠÞÇ<}q áqÀh‡ÁôrÄGöú‰ lnÃ1hZ:•Ê¥òµÏévñLHRD^2K˜zéE+[Œ˜³ ôµ¥Ñù6z#ŽVÙš N÷¬ ÷þXöˆS/nú¡9¢ï™ñS|m#ØÚ1ŸÛ+Ãøq ”"ê™bÚ¿_÷znšF2›£=23Ù=ÁOíM²ú Þ(þK2 ¿O›Qw8«i³=ÐÂJ:ÑYNüãúìšlI_OÚ0•É €çô)eQù©¯EŽ‹gÛ½‹Ãô±›·ŒðܺŸëå’”æSèååî.ß,ÐÿÔÇ,‹oàFR]FÈ&dÔjg$ÐÔ‘¸óue›ä£!:ò$è¦së%Ù;Äù‰GÇÊRêæüJ!Úæ¬'»£_Èì8wŸ×ã¸ÆùàPu¦›e”L k>ïÆK+”xß—‘4’„»SR¶ se}rŠ r&Ý2yß#$’$ô-:~ %ìg“G¹©£Ëyvæ} >»!32E¶§·‹ÀÛæªÒ‰î¡·±ªð‹)ÖÝá“`>õŸ“ž*–Lìöã¶½Ñ1&~xúò)îd[İ‹ClSÄí¸}/'q+³uÌ ˆÃÿ¶Ÿ'|¦ÐÝÙ°ÖÁgÑØÕ9”¡#Œ?xP.ùüSðe¡×ž­ÕÏ×llåóÄ +¯ÎU3Öo^O‡ŒšÇ Û©d«W~ì5~8 žªKÖÒ¼Œ¡ÅйÑ¡U°]%(¦`nó‰QV¼ë¸ëA³„R-ý%ƒfÙõ¯öèêªì稾8±w?¢}YYXü„»×Âg[4JŒç¾Ï :ß§¿Ó{ýL·¶Û ŒO1d¦üó35ùü7θ•(·Ó¦âŸ9‰ù‹’Ú½L2«¢ÉP…0¡Ó ?ƒÉþ¸9¹]móþŠA¨y¢–MZó8ñ”š¬Éµêöªïǽ6=¯²€æšÞÃe‡•Ûá/ä¥f&ÒÑ»2`e –y-çê<­;ÓjÖ•ü¥Âçï‹mµš”ƒ™ùbìôí=ع>Ô˜v ô;4˜ãOnª9ˆYŸ4½V>U/co?ܽ«Û’Â@k‡£÷ªëÁñª×iyHµâÓÃ×6#ƒý¸O±¯Úr *M²¼v‚hÚ}Ø/ö{L-MŸðXdž*t–…}wåùœ ÐÞ„|³h­"ö>\iÊ:&6ÓàÄT¸ö1qbÖùZœéÏùj¿¾{“ 4–ÑÙ~-m:a¾ÂÊ}vxh¨p¦× VŸê‘Σ•“¥|£¸U¼.#.”‘‚·@¸‡: ©Õ2Ó#Pâ²È§ê÷.íúô!­å>9UtM/°Ñ÷9ÇühÃqNøHäýtŸ¯g-ͦW:¶xõ­x##¥WgmoKûÖÎÖ†u½œ4VLŠ2 RXPäÊ(ˆ€öQG‘iw¤,ƒÑ-Sm‹o{ì£Ø$µ¥QIS³þ¢yiD endstream endobj 5150 0 obj << /Length1 1596 /Length2 7545 /Length3 0 /Length 8610 /Filter /FlateDecode >> stream xÚ¸TÔ[6Ž€”tJHwHIwwKÃà 2CƒtŠ4H ‚4JH7’ÒÝRÒ!-¡ßèõ¾÷½ïÿ¿Ö÷­Ykæwžýì}öÞçÙgf 3ƒŽ>·¬-̬ƒ"¸ùyøžä5õMùù||‚<||8ÌÌŽøo‡Ùìw„AŸüCÞ D 1 IÔ„Ajî¿ €_ø ¿È>>€ŸØßD˜Û€ÐÃÑ ÉPƒAÁpfy˜«·›£½¹Ïß6;€_LL„ë·;@ÖìæBš@„ع#èÃ@Ž`„÷¿B°I8 ®Oxy===y€.p˜›½;ÀÓáÐÃÁn`[À¯’Z@ðŸÒxp˜Žð¿ ú0;„'Ð @G Gº¸CmÁnäî}U €¶+úYã/àOsü<üÿ ÷ÇûW Gèog sqB½¡ö;G ­¤ÁƒðBp€PÛ_D Cú=€Ž  ’ð;u @IVDVø§>8ÈÍÑç;B~ÕÈû+ ²ÍŠP[y˜‹ Š€ãüÊOÁÑ BöÝ›÷Ïá:CažPß¿WvŽP[»_eغ»òBŸ¹ƒUþpÎ?˜=â‟À^ Þ_x»‚ÃÈü}]a®;d`G;0òÇônî`ßÿ6ü{…Ãϰu!6`{G(Î?Ñ‘0Øî¯5òüݽf|Hùñø~½þódT˜- ñþ‡þûˆyåå•ÕŒ9ÿ”ü£œÌ àË- àæðóó DD„þÿŽ£tü“ÇùªBí`±¿ÒEöéï”=þh€íÏ€°þK †T.ÀöÐÍù„ø@È7þÿg¹ÿvùÿSù¯(ÿW¡ÿoFJîÈo;Û_„ÿèâñþÃ@*לMr ÿK5ÿ5ºš`[Gw—ÿµª"€Èi…Ú#ÍÍÿ˜‡ïñ_¸#\ÉÑ l«ãˆ9ü¥š¿pÃ_óq„‚u`pÇ_7 Ò‹ïlÈ!9#o8Rš¿M`ä ý{_E(fûkØ„„@77 7ò¬‘+!€/?r*mÁ^¿Å àåÂH²F€Ì ç×Á x®®n0/ð3wä! ¿q~>a¯ Ðí¿$à!`;ÄÁ‚à¿Îû?82® ²÷àÿ‚L£ý’Ç?1dd¤‘ÚBŽò¯NümàðBÕÿ;5$èâu‡ÿCCî„£+²'ÿ‰Éàu‡þì_-¹»¹!ïßÚFöóïõïË öƒpæg` ñP§¡-W•²ÔžÜ›Ã+«mQñ¦=‘B–Ù7¾˜ÊÏä¬mß?|¥3W>>ãGÍqx5âeþ1+h9U%¢Ø³.wÌÛÿýô£=˜ÎFe?*ò*jè(A—–ÀÚ ÝŒ5Éxæ6L¤Sp«ükþ]|ë©ØÀPxAÈJx)›Ý¶‡ú”i1`jNKìf–æn j8z‡úÂ1öR®%†ò»÷ºYlúÀÒÒ§¬ÞžW‚'yê]ÂïÃI(I}Ô²û(ɲÔêá(,rBò%)ñŒ”.á,ËhÖ"Ë7“y½Í }‚îµöZòA´ŸÕ¹WÄf$³;—Oh¬62 ¾óâ=lHŒràª|Å$Ç\a‹r1vT!ÉéB'§`T·-þÔœ„_šj .ÔÅ`>´ü:öðÊúeF¿€EŠ$D´ïË[9aë ñ­D €„Š™DGM‹ÁiÕ}ðÏùÛÇ2ú$èÙvç–ΈcÓ!-ÙDP¼IkÆ^÷nB½ªÐÅ‘‡¢0¢J}ÖnÅ—7 —“®Óܦ,þTFlnŒ1ÎH ×€hÖ@c %M ÛôI˜là$!>‰óa mùÂ;á¡7’Á ’)¢|ÏÇŽï)èîÇV­?Ðíü~ß2ÞÆí˜WËR=§í©ƒu‘«âq¼cÝ^üí¶œéDбÈÌrŽÜÃ+’âçæ9v/obÏ·ÎjrLd«#ŸB¢’Û'Ö­ÞѶ>í¥IëÛïjeMÙòR©½¾@?&±P~ÒÇZ)«‹j’_ê%‹24ëj´œ5`¹uÙÕ}Çå7»¼äj¹]«uäzSúLN@LÀ:&&¸þ^3EÌ7Ò(@ï\”8V,0åAq°«ÃÙ€H«/çí™1½hˆ&ª¾Vv=¾è¢Y"iª¢áUëó]¢+‰Þxè~þÂk¢-üÉ[Ö^uø|oËÂøµB°f#F¤éã•¢Óð¢<Ó¸é¡<Åc;u+ÆïK`*)¾8ü^”¤ý»¬í-î”~Í0¼«‹kc-zZ½ Å䓃ôƸIÔ³–äõ4½ÒOró "T=þr:¥l›o…ïGý9# xòW€Â‚ÅN6¬P»iX§ÝèÃ,ͽújÿKˆ4 ˆc9’ñð½e€Þ»¯¥.á„SŽE¡ê¥Úý± ªb>L~¸Ùzx®Gôà 1i,žÞ>ô-­Ï]†íQ)‚c¨ˆdòá›,_¿õós] à¦R1-¥íTÔ ý5fþ"QÅX¶¸óýšx5ÂÑòØ<ù¦Ò#Xõ«E¦ìýDéÎêdzñä¬*ÉÁÏR\¡½ëEemæŒeßëR2(Æõî{èɧÌ gé*8àPâOÊXqe÷‘f´:“¿´±ƒlɪ^éX¢–V§{ÎgÚªö«ø8³.C¼nâé¢ûƒöõ uT«í|ÕGJ†áTa¸‡Ã¦-¹¼ûãFÍroæè4˜µseöÒUB“ˆ%–uXcÕÞ.x$Lsõ2Õ0:iJŸUïI¯&¹rÌ„ŠxàÏRH.êðÃýו ’dòµ…,S¢ 6«EíšÂTÞº…!Úì¡5xïøD&¿N0ã‡a‡*ãæ_'êù¼%9=µÛñ³$Rpø|&±‘盞¾&—2¸;ãÝÑ;Ÿ °c•?õ^^«´ê+Ÿ,—±Ñ‰&UA©Dž±†P~½§yûØY[’âàG™ÌŒ! ±ø3„kI¦øb™â«3êT:¾Ö34³ŒýËëú‘¹íIsXs°å,S=KÌæé‰‘($%n£ÞÈú‘7~mÍ’=ƒÁ`³;ˆwŠºúîp~¬z•<¨UŸ1W=®j´…1lü²„Ä‚c˜;Àß7r¼·_&g2•óM†#þ½»pÄÚ¿¸^3ùeÚ·O«$åÈþ½tç8€Ò8»ª•O¼±ùÎhac¤/¤X’aq¶-=Í…‹zpbƒÈ…$¥9 'üÔŽôè´*ÂÐÛª‹×X¢é0èº^bŒ§¾lt¾lù(^Pý4u»½wÃcŽNÌ×›(–¼V%ÑÛUœJ¡väDyÀŸ5öäX/ÔâÝR¦²¼4#s°x©À“a»*uXøå`žÎ6Ó×úÆ'?[§Øû[cÍmز¾ëÚl§æn¬Ãý$€ÂKÝ`þë1ßN3÷™×e0¬âé-Uwž¾èhÇÙüKÐàií(Œtõ]t¦†JÁT“úç³Óºlö´sÌgÙœ³‹ Sï”žáæ‚œÌ{8$VšC1wÖÜ2Õ˜|ÄFwÔ¬gY£Uc%ýâþ|[é¥*2t¶Ó°îKg-ãZÓŽ¥9‰m9ÿêÔçêÅ.̽¶…éQK9fB>TÙÛ»}—Ðf”˜‚ˆŸKlòÓ~ÉcJÝÍ&²÷¡¹Þ¯Iü’â<è‰8ŸÇççÐu'+Ö‚b§>Ì£%jöîÍò¾¿ %ßCÌ…¡Ýª€3Âçuäkv<´·•…ýq ÷ñ1s²-jùse)â;b’9ý¶*Ù6¦¿­D+¿ƒˆ«ÛQ“ú,»åXHÞ(3ú²–> 7Ѳµ?ìJ© ?¢ôáý\]7ï3¡Ñõ4Ô¯1Já]ïcn‚ï«|Š®uÑTOõ¯NeûV#ÞaEVZ¥œkÝHnüØŠ€´U¨Üåš¡yÁG4óhÃt¢8jÞ€Á%q…v…m(žÎ é®TøÙE°Šã_Žu3ñÑÎýª)ë2’vl'&Žò9Ýííñk/²ýéämñ2¨«ÖÈ¥ïë«UÊgECöò” § GsM÷Ä|î7oDÊ/ðv#ž7%ô¤…ß/‚Ñr¼‹éuV}‘ sª0ý¼½rÁ#…Gð,˜I÷y ­ã›K¬Êuëi¨6\;.zbé01ቨBÞ<&!qh4Ãåìß¾Òää ^Øò«çä9—• E;-”åaQCù|(J•ËiWéŸEÕÇíKŒuw˜}B'ª}hœ3ɧÊëD¨zóu·½åAŸ|Õc–ô(Ÿ6Dá‘âTp¢«k…GYñyÕršÇ‘›ö¤íTú ŸhÍN,„£‚zßäÉyÛ–T_KÆŽáe Z;Ôá—d]b‰,ÀD'qNZ_²f¾lö±ÙDû®JuŽÝ õNÔE£:VŸù§§C²´ ìØÐËÑÕÓ-ÉD]éñ‹#+øj{G';– ŽÅwf…ÇOà¯?7t2|#]6Œ¸öËDI}„ñ]È(tÏnÜ0z÷™Nÿå턟äϘ äï™N!m?.Œmx†Ø·"ºXÿÍ$ZN{WÙ@®J®’~NeBDòýÁ"™çÓ¸‰G©µ¯æhxvx•Š©©ûùòRzY«MѨ<Œ4ž`\*Êv|À7àדCµXLeÕZjÐO«ã]Ù‰Á¢5]²v9:£³çLÇbŠyMäñN’8/,¤eÛ¯}=ïWX ^(ÚO¶W?~-—¾½‘¹/[\F¼ÚúìÃèñ ýJÇòøãZÌhºˆüø±Cþr»‡SØïN¹fô{r„ÏÖ[îÓ¼qË/2KXúèaý·¥¶êæ%ÅY{€×¥2ÓÏêЂÝQÿÜÆ‘CÉõÅŸGÛ”†Ó“A•U Á’ß´c ¸GÏ1ØZʃÁ»å‰Ñ¥'ÚÄ&3?ÿ"ÃÔÐ*ӥŢêò*{é­” Ã'—ð·™9¾ñOÆ #y•í«×¢SÎÓ ÷%¼¯²´Üñ€É˜»Å­=<…½G¨­š‚îHˆÀÂgYU‹v Í+‚€:ý¼¯?MS硵TÁ/10Òã¦YŠ9,ciûXoA2(koYêûý$VFzò_]¶ÑSTÿÜ/åLῬ“È}îÍê²—H7Ü se°jC-ÒmY8ß`-ÔÊT®9Z½Ÿ&…ÚS<ÜádQC =4‘RËõ‘žW8”Ôº »×jÅ£}éûŒÂÆ”MŠq^”cûE[ÿ°s±·àl-ú å3 ð4Je½/NÁs­ñÊ"?·•:žlÏö¯b"Ù@A× Ï yÊÕt"&2£Õ-*DÖ…3“³3“Åã½ 2ôc]Cîua³<ºqªÌÉàéàë‹W®ôÝŠ7Iº_Ó£ÐmV‹Éx]OïÕž¾¡1HzÖ¦4.ŠnõcZ–(±ºG¢;…ù3ÏE=Ö—ÅG\bº=#ÈådÝÌQdh”¼f/ëí7Vò»g&÷ ' êéç^,éJöìÁQ»³ÆŠƒ”Õµ¼+ïGlëÖÌ ¾¥Ô„E -ºtY¼|,ð¯Æ3»-¹2ÎwÓn/ŽWŽÌã öÚê4/uß2]3}$¥ú<›%½k+#b'´,¥JÅߦ™FaæÐôW¡é¢Jß)È—·}»šv¿ß͵•²’ŸÔé.G‰ˆŠ°=§E¤(³^®É›§6¹²£¿g¿Àø‘eEŸA”Ç^5ÍÖxYPû@S³ §¶:ïY¯K]ÅÀ¥üʦ JÆSxµ§Ž»o9¼¥i´òJ'û'÷ë÷%¹†/^U)^é06«„‡s–µL˜¶EH¤ùÊØR.°m©©34jÄí1Å>³™ªrÇÇ@¬ËÏÅ­§É¶¾ÊŽa©<©)³jªBkßT»Ö¬ÒçÛàÒ§gi:žA‰Ï…ó†I©x*UEaþĈJÚõÓ{üU#©Î2³’dspg_¯\ÆÅüE®²úœŽCõs­³tÕ«ÝÈ@y¬crŸå ;ì-l‰ÉÔä˜Û {Ö‘ßÊŠü3j¬-w«KLÖþzØÁ˜ æÅDkZÎvyÀS˜»šˆàëÂÝšÕÝö³õEcß,ÍÉeAéÙ¸—%š'ߟSŠ“yÐLJ¦Ý7Y¿*GŸˆUdBÇ£³ª*.Ã` àyP'ßG»0´Ø(I”7‰þñà.Q¨¦#:Ð-P!å-Yαd#ÖöܯÑC-ëV• a­»ê)L¹=½g~v9—ÓO£„º’«“Ä"‚@ ^¸+ûˆ«Û?^8I'^ïÎθS-~ýY?%µÓ£uðøö\þyµt»ZH3o¢£°!O%ŸÔêçguÝÉP>JÆÉ²qɽ oðåƒ/˜šÅêl)Ãç­°öÿ‹ì@ÄÞ`€ÑqžÑÚ`I5ç;¢‚úwï;niE¢« áÁå3%½Þ[›ÝI˜91òB·Ênök†Ý„BCLq¯bXü*ãjÛ£±ž§,)—n̉f¿ÚÅË­ÀÐôØ\as¢@…¬¯ð¾æA¿dZŒXôè¢? ÓžK ŠtÁç‰yûþ[Ϭb, ¦%áôè+ÖÖà­îþ÷$søâþôÇa暯A3lOæÀqUÒaáë$OÓÓ©GÚG —ôlçw–lÈÄd¼KL³/™{Õý¬uÕý¿ä}Z?qWÏJŠÂ÷?e ¼ëã¹›)jÞ²¡òq(¶sJãö F²@ÄÎLu¤Æ ögتJ[O¤;Ésñú†Ú# ^|'y³‚/eÚ"RAÎÆ×Îy%­¨ƒ&¬!i ɳÈ:% ‹>Ìj-ŠjÀlá³ø‚„R¸é¨©¾¥Ž#XMRlÉÄ8EªŽµ60°ÒmcD}{,Nb\_óFP>èýF˜Ý<KV`KåAùÂ5Ã4õâ½'Ì•äl'!]±[絈’4ìáh·“ØÚÉ{ÆÌöIrѯcFzæucÏÄå,uã´K’¿·sÈ=¬q‡6£1Õ¯¨öâïþÌ±ÒÆÿ°žÂ¡OcêX±öç#Óåí.ØÔ¬fKÏ}ìëߨ¬½GG¸ï°f]hsÜŽ}·Ó¼[fµ+ 1~5œÚˉN¸ é,­4ÍªŠ¤TËýQ¢-“Ϭ™ ¼¼ƒ‡(¬óÀ Ÿ6§jäµYï:Ñ4R"àú9Â鬺)`,&e—ê_R »ê®;DDÔ•ýlÊu* /ìòc,ªùzv?ƒ“Ó×oF6©íƒkJLVÍ>q&[ù‘ôˆ9S%Ñ…ë׈ß¼îuP ’-¡¤N´¾1wøÀ¡èAãS᱇a(.\ËãúÜÆO‰ãðÑFÔ²ÖW^Ho|öÔÚ|] „”>‰bºÒZÑÙõ첋Rä‹fP_Œd´Üÿnÿì‡_•b/›¸+£ä;Ð,O¦³2ü`Z~p/h=[ûû·=kâ¬"×Ä4߆•bUa ùTõ;y4^ÏÊ×.¤˜eŸô§˜ÊuoèÆå5ÎòNȽÒ<±¿´Ò†)5,gÞgÁ{κ¡˜$5îW'nNЃëqÃ|E¿Pa`všÁ°8 £F3*¿2¤rz¹R†ê}Œððš~ân«›@îþÔÛŠôƒ-cRé[έÚás ¯/¬Âž'ëÂ&ä ÛÔé´1)?FØe²ÙËxZØ¥vší<ß‹áWú¾CgI +èñ»oM;Óc¢‚¦Nàž.ŽÏõ¦AÃòõ ßü©Í£‹Ì{f™>Þ£‰ÓLè`þw‹ÎÓB¯lõd÷­ÙzÂd|ã%ï{KµGnH]'TlyË|íùÙh¸zõû/….ñ>o걄·œH „Å+®éø¾LIÄÔQ ·m.úb«ûÆ®9Jç0êWÆ´€KV÷Ã?2©EÁ¾š—]-o-§Ë“²O§sûÖkÇ5VjÏ\ êwÖx}ÚÞâÔíÁ:ó”³KXk¹Ó¿kÎÎdœ-…dÚ_øˆ7V¥©zO›+ÎÞÿ8¸åêV쬉[/ƒ!Ó féx#˜’éˆBè_~íf¦ :`ßæuÕë»Zžï(e|(P뎓¦Nºâ잯„==a¥Â"­j,:Oû²e©ûêì¸RBœãÔsˆ§¤òÁô D!\\{ÎÌC¢îc®Ešºu»~I®¸‹Éµ6˜ ’Ô¤€‘°“r©úŒ¾ä?™ 2œoêçœý”ÄHЮkÜô&Dûî|<á1‡¶ÏM¨áÔ ”\fÊr»òynn”$nWrO„8ÙôazÍÅÕ§ã].Y!è€êŠRt o–ôíPtú*žÎS£Å{½Å¥ ߤxWçñMVi5-é¼~$½.ú¦d:I‰ë; m×[ËåNNÒq‡‡ÔsžáuÑ™ØpÙü´V>ɲõT÷ÚÇŸÚÙºdÎ[Q´Ú5Òñäéí¾él÷¹—€}o¯o± áE»ãéZõèë-»X.§ÂsÌn5Õò äˆ1޹ªFƒÇC«pK°î{íæ*ê>¹ J‚^.8j³ÇCaŒï›‚þ< ~Ö\âlÖ÷Jºýì”×nœûîû’ó‰f±‹Ã;£-W¬ú¸¥¿`­(ÒÓ=НsR”3s7" ¥œ½>¬¼åà@¡Ý<]¹ß6Ü;d’q'ÝGa]z8nÁÀb»Í.gïsZºúâûõ¾RË€g‹²QW°¦94GuË—:æÎzéœQŸI{žOè¥l³òK£±Ešx­]UãùçIíº§³@žº÷—ÅXÇ(ûþ'Æ)JO̾¯yÑ3ç x!Ìp#¡¼#yÒ“”ï»%R—i0üìïôE§”¨­“'>ÍŠï0¹“xÇy+Žû`}Vë*µ:Õ Š}?4?¿rÔ9TU~ß³›ž9hÄ_"ïþ{•×÷[$¬mÍFÓ™oàj^ÚùÚØúÀKÝîqŸµ´ã'Ù™™Ï±EöùÁ9O) Y©B[Ž0š ÄHÝ?^ò;×gOTŽŠ4„‡~K©';uÚìÆ‹ž`+`Z`–ªÆ`H+cYšf¨#Ù>@õã,MV<â-¼ëÌÜfPZ‰ãà6ÔÉqÃpNNXº¦}ì|‹Vzˆ¿[MæRD,(Úï:RÛyáQºn°¬Þ{—·<ã|nÞrp–[‘õµ¯Â /ùAAäæÛÔ¶ðc…è’øvdE7Îpy…^S>!žW~ÔqN%j¾#^ßÄ*3dM¦œx%mÓ{´AÇlü­èÜq<^ÎLH!~ Ÿ{ÅZ¶ÝÀAðcÓ¡î¼ÂMfÿTÙ±4¼#ÉŽ›.\8ÀÌ#öÕ·ZŸc¬ b,?Aÿ„[{´Û݈½Y¹Q0Ǥ; šz•3SÇÆX–¸]âǵւ æëï™qVIÇã)Ê΂~ üÞœ¨näšÏEµ¦™!QUúphÁÙCù½qFÙô\>NM€c«†&@P“ë»u¨«kßmþz 3aª,§›ÔËÊßHÜNoè)×>öÁbÑÁÞ“Ø]Íd4“7B›|Šˆ ¬±u1•0[}“HWËÅ4îzÔê3Iæ~ïXXÃZHÙ,Û®ß;cžãˆHÜ üí6Цº./…9=1ªh~<¢áóÜ⬟Oo«WÝW1?-)ldqù¿ö©ûÉ’7Ä«p,Î0V‚ìÀÿcñÃôËOFhn¸1s—vXëì⎣ÌDÇûu­“-1XÍ©ŠYíH¨ñ< ™N$ hrÕ¸|I(ëK%T‹ðÁÆ3)ad}0l=l'’UéŠÅâÚzòAÉŸ>Ø¿xB+þLœŒÕ·~pN=O¹»-ꨕ:aÉÛæ lþ=•¸~Ÿjݘ.D€ ÝÕî|§1f5‘däKw`=Ò«­<~}´Þí$ÄÅMr7:9L*©ÕË)ˆV¹N®Ë=eîÀ„Vn|¸aU—œ,ȘUˆ¿ Í!mžà¼cŽÝJ9šžkeûÁO<÷ã­ÛDïm6aoÎ;¥¾+hÊ&55ò “Ôá’·H…HkGæÅE'©<»5.³HôW^~f¡ÝHÑiËdNtîᥪüp\ÀNO¾x«…SÛ®oÒTCë`íùÓZv¡õïÜܶ‰§âi0L?2zšjÝ[4ÕàÝŠh^1ÖóAý^Y•Àê/z9¥Ñ„i„Óº±$#MmZõž«)ê›KÇwàS ZUŸg- rÌt+ä\—oŸO<ÿpõN8mßêLüåÊ#2Gwš¿_Þ¤ —×} 1YpõD%¹N;¦‡écù“;‚‚‚¨ƒúŠ7¡ú®ÃÜq¦Äؾ&•ùü8ñOÚ=ŽÏ˜éîÆ£\Ì”S/Û2Øê\2ÖÓ½ûVÃUz¾ÅÙ¥uùåRg2Ý_Z±Dƒt÷¥ó_W£rÎÏjBìýë/ ­sNý$¿fˆeÓL‰’Rò¦è"FÐ=£³™4ÃòW×¾QÜ3#l—Ý0æàQMeÒ×ÉúFTéÇêgT‰kî™ CǬ~ý¸îEÝ–àÇzý¹¦_Æž»ã>D­‘h¼±ÐS|¤_Çb—§PD+íšéo„AŽë¼¿<¾xiÁÈ|BPUÆlú*Ò!¡mþÓç뜺Ûý`? }Ti±E:A›sH]\ŒÚ¨)w öÊ–Dí ð,iiE‹ÓCõ¼ Ô… z p— ½­Išæè¦òÊN»µ endstream endobj 5151 0 obj << /Length1 1393 /Length2 6189 /Length3 0 /Length 7148 /Filter /FlateDecode >> stream xÚuTÔïÖ.Râ"-¡ ÝCw—´t—ÃÌCÌÀÌÐÝ)% ¢„‚4"RÒ""ˆÒÒ~cœs¾ÿ¹w­{׬5ó{Ÿýìýîý¾Ïó6&=C>E(Òv‰À𠂤€Ê:†æ@a€€€ÍŽqý…l&0ŽDHý/‚2 Æ`10ËÓA"€š.@Aa  ˜” ¸”€PH@@ò_D$J ¨ö„C:  &CØ”‘n>(¸ƒ#»Í¿œ.  ¤¤8ïït ¢+ ‡€@0ÆæŠÝv"!pÆç%8e17)~~///Ø B¢ä¸x^pŒ#І†¡Àø>Â}•\|TÔ#0 ôý^ Þá8È&ÊÈþc·'¤<(– Ô1I¨[NFâ?n…ÐáØ‡·êÏö•ûk¾ôÙ2Ö¯Ó×F.ÿ}0îãÁBG°ä`ÈfN©qU7È_Zzì žç#öLF5q%ErI.#q³ðÜRØSÔ87]cWÄsg,C]™ldSãå6 u±æPY曟>ºõWN¯ªß»¸”GÉm“âÒl-«h[ÚȲÂT|sÚ=9-†[ÆŒÖu¡2^Jp_¾@Ø®cJQ·°µt“c­×áU"#t­åÑ©k¶hŒoq´³ÞÐmº"©¯©4dGâÑb‡ ¢Ðm%±*ý‰hÚ¡‹ü™s÷¯ í·c9Ž)¾º½ v÷p`­ý"­nütêÒGÆÍ–. 2Æ“#hÉ¡äeŽ+á Llmóp‚x(ƒ,ø‘›º<«OXí¡¾^p—0£Ã•¾™¤wOJ,[çgvÛuɈÊ]&ŒAÊ_,‚@ލ;N¢H¥à§éï©ü€¤G¡»\'²—ü hÊ£Å×ß»ƒý| °ñÇcÑc„RÇbTüô˜ö…ÿ¾%mºÞÜ~Øj“‰ÚbÏ5òÐÍOd52^«!»É\n'`4¾¥Ì­;wº¬­1ëèB¼|}S¿'š¥‰óÉËgž0•¬º•­†ë”ŠzðâÈÅÀ;¯Y:„+8ˆÂ@V €d­Sýb1ÔM‹Ï±,½ý¾=gFL2QÜ>ÔÖJÓù¯½ÏûJÌî5ã¹³Z´ž0æAˆf‹Kꊿ¾ô¼¡œ-Ȉ۞„Z¾ŒšçýŠgÓ"69lÚ?Ô–F¾Ebeîºkn ÿܧ)›I ( eËO!ÛÔš=´›üY|XÿÊOWjH®.h}Ñ…Ü„S¡M›}ó ’÷`¼>~•Ä"¤Èw„XÐòXZd)ÄÍf­þÁ¶Ûy©»’ œ”c:æd–ŠãQÔü`N™YÊi×#ç:ÿ¢5|ý´½ºàõO—Õ]ªô"Ñm6‰¤-k£™q ²?ýÙæ,ƹÆÊA:cŠü35×Z¸l]¼¢X-—·óM’ȪNÄîFÛSÞtË~~úÿoq‘;ñÛ21Ü­B[è2]rOõÄ´Œìr®ýðÁ%´£‚U¦ëuŒºöpn¿jʆ5?±ÆHä®0³F­G·ƒ‘ÊÔþça(‚Hy'ÑGW¡a ]‘zh™«gmÆn ͼ`ÏëZ°jÖ+J»©›5hÞWÇñÔHŸi=:Šéã¤,°ÙB«~ºîSÎ{qýW¤ùÞGqÎíîPz}ñSˆç. $™æ€ÈºÙïMJ…ÌÊ0‰ÿ]‡5Ú -³‘{È·ˆ­©ØÂê  ˆoÎŒy§)!±¥ÔóPƒb¦4Í‚\7ˆ`ä‰R—‰ž S‘QEÇŠKXW„ùë·5pÉÎã¢]^÷Ꮊ1þzT3ä3,Ú¼!¦<2Ï™Riq|öU[rÜVŒÖÜ]îY­wþ]þ¼´µ‚ ÝϹU¥÷™å²¿——Úó½Ò 核îCcžcpñjzQY{ÈDŸ·9¢pÄÿƒœ)7°Ç=¥Ä¬›¯ÕCíIã£1Ì—§Ûð]|Þv8;Ò¬Nr—,‡¶<ÒÆç'?˜Ûú.Ò1KP¯ÿv‚Éy¿°—ÒörU€Ÿx$]5üðgnEy¤*$‘é<ãvù—d1=²™£A*–Ê| º¬ÀaÓvT]Û;ŠjeUhçpå#Î9ÕÌ3ØÒ†ãõêyá¹rm$‹%G#åb»Ý£DÙµk†r¥nÓ¡ª‹E±÷ÈDR>M4Û²p[J?ù¶º£>(6wáPqñÂè¬è^ÀÒèV”Ï@ŠË2îyJ’Ì·¸†…ÂYÙ,}äÐPÔKh‰êYÇ&Gü"wJ¹µÃÃþ…gz‰Á¥Fa׉Ó*J$’.q¥€‡ #Kõ“¯øTæÄ NÇqkf´8n1}Ÿ|¸Üvª“eµÚP(\DÇß~Õl¯vè8µØT“§œŸ@BžˆOuõÙ·Hî¢ÿõP¸z[JvÑ‘%"”ðqžim/þlEa Z4–¥Pm|Ö\£ãL1ð‘ç™Ãþ—¨#§Ú}eœz7„Ål”Õ—ßj$îpƒè¨Œqë7šÑŠQ™{$6ÆØ?¼Ë~ø~‰–Úi}꿌hæuËÕÜTG\Þ­ Xa<;9‚†5ärßDÎÚk§õº sÅ"{gŠoAì´Kéä%kÂÚÅëùRVó1W”u~iF”'®e-ÿ•Ëf¦Ì_÷˜sIDˆq aæ,é¶«úJV¾À_ï#Ê#±š+¦ej-æYº£ˆþ¶B79’Î_ÖÙø¾8³ŽÞÀ»/BÏYᇊTàG-[ Xžv8l&f"‘TŸ$_É·U;ú¥{€šql†Ã"âýàkÃùÚáU£-™í~ÏsY¥§ˆéTq37rEO†èí|Ö×ã\ùð¹¾}.=ª#ëþµv9o*[_£—iî>O;¼Fÿeª»»ô€ÚHÉm| ‚Dûˆ‹ÒªjéJœU²méXÙõ̯5ênåÍn8­Ýdòð,C§û•R Óã*gÌÍzÚ_ò¨­ã:9ªd ±Õ×*ÞÇIy,Äü‘Gàn=eîÍÖÓp¹¬¢©"ƒÕ%R¯±æ§þÌž½8—F[À«Ÿ®WM×iî_ÏxÚ8ØX¥N1yœSûˆ\Eåsm·ü›Ìâºgž¬ŒM‹x]4‡–ÅÓK_ÔÇÌGè¬|õ~F‚à a)œ iç¡O&’&ÀÍÙâ”5fݛ߾ÿ<®É¤Hn4 ¾Ueã“!eô1æñú =Jš¸òâfd;*Ò(Ôò¬)K„ꘂÁ–†~véi®t×LzróSžg·3±T„Ñâlî­ŸÔ±RúVïýgI£?‡ W èïù“D.hF,ªjôÖƒqçñ"FÁ\mdälüû+Ë*·žË [ܨ;’ëN÷È· m{ãÀ{c±±QÇØ­»ŸŽ¯ô©8µPµðÕ•¤Ô9ø‡ßxMyÐ×ð¶¹z~õBD]Jè|z~’0‹h“v8’ÒÙ˜Å4aB‘JÕª ›ÌŠ‹zJø¹æIU[‹ÛvÏÀfe†f)%|U•‰¨öœgú§ˆyæ§a>+ùksöéñë$ÇND,É©M.^~i/õ†)L‘õ¾¹ùaxO`ì‡ =¼…$ÌG—1ķɇQ[:è[”J«i™6µgW˜ÿ|(¹Ä’}±EX”‰Ç®Ú“^Ýhql ± Ùl¬ÙR(‰MxK„ÈÖ3_䧤LøKJˆ˜¼íÜÓ.{S”äNÊáqzÞph+dpuÑÿÞ4+ \8Pèp8áà{±ÞVðü,6üòÈ m*bfüAjêV"e–b$6²³:}ãkž"] ©~ÊCØî:„òI¨%·BæzX9×B@§_ö|@awG[Þ“†‡àQïUR9Ì9þ®á²uI:ÊgâC¼5í;sÆHŽâ‡ïùÈßyºé^×?fX}Ê> mõZ¯=VªȾsI«´xTÝúÖÖôclˆ ëÆü—Ì5[9JÍJLãšLZHèꌚ{þ±gaÍuë‰ÀÚ®ÇêÜ’€ô6ë^Bå˜îɾŒÏ÷&^ 9Y~¼ãâHUΔÊÏL°>‘rrM0Úž8>þò æÉNŸ Ûµ=²2ÀéT«­®0áÒᔀ:·J2ѷ⃠1R_B´÷È,çû±€ŠøàfõæsÏ„Ð}߀„*òñÂjõ'i&ƒWÁ«8§˜î»FyAL<.Ó¹£ï?AH~#‰àŒõ(ýŸç09_K&«Ç3%œ”_¤oÚ>u5׿m£@Õ(Öµ´˜E|¶÷O&Kœ.;ã³wÒšX ™x ˜CH+ýÚæ¨üx{"´;…šê¶5LtL…H®i.)&Úûß•z¡ÑE®D5À}gš@­MO«26Ç‹ÇhÚ ‘œRyVeÙEA›yÍúŽ€‡ûtŸ}è5ÀMd Òö°xWumLcœ7L¥—º”*w³9:\f6•SßA73{‘?²UÕÁo}ºÐï?¥Þjà B¦d-åëò|ö²¾Ý@C1sÓ£ªüYI@F!×¢üýÜ–¢ÒðöýÁº4†±hUq(€ˆúý÷ÖTÉ"©“y’ŸÐùÒª3¬i:.Mö¦¶¼„  ±×&Z†ôÞdfCÆ5õ7FÚM?½ºf¨¾¼Sne@~ÜÖÊüàøŽæ„÷¬qBÛhƒXìºÍ òÛ¾ÎUXDo– & ïÃÎúKyׂÆ…@UØ«»M;3N\8 ªÝ¦åÌá‘´?‰ûÊs·QŒ¨äàLÛúZ^ª³d üì-ZùÖû#†–›UP@ïA€êÃS%V±IÓ£ñ7᯿­ì¢îK[,K¨’UÜó„ –h¼Ñ‹$òö_àpŠq}Õ±ÞØÝk`üÙø]ý;O6Ñ‹ªcª‰|Q ¥Çwìq÷HZú¢¦‘ßëIXY´æ 7”pÝâ^ÔÖ'‡`(Zçn…£¯n幟LAHà$×iç3 ”\¥©E§â ·ÍNýébÒ‘]s‹YÎg*·©ô]®Ý=lá4 Û ®âø¬÷˜8ä4üþ¨º6uÀù€•"©GÙN‘Œ´UÄ_Î…/´"Úw¬š¨BœËÛûS^r¼±e'/•O\ÈHx%=‡eËù’kwãl5^ÿ3=Õ(?»b¤¾·pØ»”Þ9ó#å»'«{Ä{²bF®Ënvã:ê¡ùÞÕþ{šNÆ×ö®µåU®¬YV–{ì—1ÚŒ1­’Æöα>e=‡šá“UïL2‹v¢Sྦྷ¶‚òJì>¯¹ú$ä—¹¹Ù¨å¿0ëªÞålÛ†Òò_­XÚ)]ìY"qø¢½)u¢–®mö}1ô Çk` $xE¢¡ûÏoÖ/a…£©Æ­ýºNüD©B¸1ÃÐÙqgާe£ÒºOiþ¼Hú§ @¾oÅ<ôsŸ`púeT½d”ç ¹Kª#(‚»´\Ñl¾èfÄüEw5—«øHí.ITZm’`~¬áÏÕ£u0ñ üÁ$ZÚÀéò3¤¬†ìm(9ÓmÛ¤87=xÏBt’¯@…ƒÒÔ¼..ΖÑQqõc{•\š|+=¯Aw¹ÍÉÌÐÝžíߌñ³iKïš$bð>+ó·[Ùh€÷îÞ¿5Ë ÒÄÂWõ½Y ú=šlPÐâ„Ç\ùm‹é4®æ·ûùUÁ+ùû^bPÏ(—‚³èFfi*Êö§÷;Õó4—•_}¹wGÊï.«f¤Í–L’ô[]QynO‚ÍÏߙ֗¦~lI˜oaÿâäühÒ0y ¹ðvùaÌ¥}úÄ–/ï ’æMG³Â¨ ʺÑãG>wÞÈ;ºàqüÌE‹jæz½©ãØEÐÏ'rZ Ž\u¾D;¥Ü‚¤h 8Íß•Pî mMÎêö\rdŒ°xdJMg4~IÚ”Ô÷’9îTÓ|¬YŒ”ãÓºN³ðp:#¦ÖÏ ÿŠŽIsÙH‘ÅD·„t‡¤ëUà­½¸þ Äœ¥ùðÞùÇ> stream xÚ´T”í6Lww)C7Cwww È 1C "­€´HwIKI7H‰´´ ”Ò¾ï{Îñœÿ_ëûÖ¬õÌ}íÞ÷¾öÍD§£Ï%k ³+Á p.^n1€¼¦*/€‡‡Ÿ›‡‡‹‰ÉwÿKŽÅdv÷€À bXÈ»ƒAðG™þh¨ ƒÔ<¼ü^!1^a1è¿ aîbÄ É PƒAÁXLò0W_wˆ½ü1Ï¿ŽV6¯¨¨0ç_îY°;Äh‚à`—ÇŒ6 g€>̆ûþWV 8ÜU ôööæ¹xpÃÜí¥Ø8Þ¸@ìv÷Û~· й€ÿi‹ `àñø[¡³ƒ{ƒÜÁ€G3Ä õxtñ„Ú‚ÝÙúªmW0ôoc¿ 8ÿ\€—›÷ßáþñþýËdcsqA}!P{€Ä ÐVÒà†ûÀ9 ¨íoC³ìÑä‚8ƒ¬ þ*P’Õ€;ü§?wˆ+܃Ûâü»Gàï0׬µ•‡¹¸€¡p¬ßõ)@ÜÁ6÷î üg¸NP˜7Ôÿ_ȵµû݆­§+Ð qó«*ücó(ÂúÌ òððˆð‰Àn°ðw_Wð_JÞßâÇý]a®»Ç6À;ðã–¿È €»{‚ýÿTü7ÂâåØBlàk°=ŠõŸèb°ÝßøqþîÀ3žGúñx~ÿþ}²xd˜- êìûó¿F Ô1P3USåø§å+åä`>.~AŸ €——O üxüï8: È?uüá« µƒDÿ.÷ñžþU²×?`ýgAØÿK öÈ\0€õ?D7çä±yüðþ?Óý/—ÿ?–ÿŽò%úÿV¤äéìü—žõoƒÿäqöýÇ⑹žðÇ-Є=îôMÁ¯®&Øâéò¿ZU8èqd¡öŒæâàæø[ñP‚ø€mu p‡¿Yó·Üð÷¾9C `˜ä÷ óèÅÃó?ºÇ%³qz|E<©ù— ü¸CÿWj³ý½l|‚B»;ÈëqÖHàÏû¸•¶`Ÿ¿È rCaðGÀc;˜;ÖïÁŠ € ß¢¿‘hý$ Úüý®hûäÁ@~Ðþ(:ü@Èð1«Óð1­óð1¯Ëà#§Ð?àc^Øtý>æuÿ>æõø €ð?àcžÀÇ2¼þ€exÿÿëÆm<ÝÝŸŸ¿Vãqÿ½u`°Økaf#æXÖvY#KíÍõ}œOwà8æÃxS‘ÒkK7T^âê„¿àÕ¼l×ôWWkD{|¥MN&d´¡ÚYop|&’¼ÞóÐðäû¡ÞÙifŵµ';hÖò>•™b#çt;ú>“¹£,ÁÜ\uQép€ÎÒø“i<ö:…ˆ?RX»lf{•\­ìÔt‡*£Ç±Ìø¯¤'J;Wéý#|‚ß¾–s"BÖÓ©wwq]ÕO3w¥Þn÷Q©[}L1mö(Rܼa =m {Ájí1ª/Í ž¥ºùùXåx3VUϾYep ¹? Y~í ýá¦lŽ5Ë7KqöN…Ò1 )E~ü‚,å=ÊÄ’J˜Ø}ó˜J“?Ãê¸sÕ4j‡'- kú£žÞþb ¦M UÏqjBáÝ‹tå²js Ã$ÔÝbÖ§^”1 Bî˜ð¹Ÿñ*g³w°óܶì³ÑºEUcYi©Ô!{ÉëDñ ¤+1{j]ûw…[ t¸ÖZê(} C¢ûã`y[&Ñ7__ó<@©¨6B¡"¿/ý›,]YïSàÑd1$—Šs6í㻄F!!A±8iýw¾¦3ÄpLÂ8Ž‹_ýŸ¼ÈÞGÔ½^Ý›ïë¾7’´À1Ä# ß\%,_ DÒ£†n‰?9!ëlwœßP{yÏq9ßË¢{µU^Âæ›Èm)AŒ1¹›ó0mi¯ål$v´¦‚½tÍZHrM;éÈÈýæ*X~‘|XêË¥­û&a—iž_ò˜•%=-ëÍr¹ob™tyõâµGB„‡B¼Jà© º:Íååô­›MQ~‰QÑÛ¦½À•Á>ÅU–{=E‡¥ƒÈ7OiZC¡t®ûÖÎ×În*,…‰R1H|×gx©u_eµ'œ“Âø*Õ… I×h8ÏZ©GÞytÑÂòq0>Þ(Àov@›êOBƃÓÄÚEš v¿ZÑLœíŽ ¸®•Ææ½¦lYÞcŠÝü ß½@ŸtçÝ÷Ö²] eÚ”­‘Æ3Ð0a¡š_}³J2O¼gÖ&iHígý¦EØk ©:‹=› ɧò1óšPüÓdwåvº”_€híŒ{¯¢MÖöPƒ½_yÕ*Œrâ-£L”…vþû½­FÅSÓGÆúæÇÚý,”HUçó:ýë·hŒÐË+ÖxÊýÈìo/Ú©â©âgv=ñ ÐóTëÝ~Ê•Ÿòê<Ÿ…òëCÅÒ@õœ¸¾¡´æè”¦"ûíïu݇ÕdAä¶#]Ä/Ûz\‹%¡Ÿ¤ÑXp6%¥º‚w&]¢Cüò´o£0‰¨ qð¾œpŽ0òé!à“œØ—äåÑ2±é1}²^Yp,Ë})„žHër@šÑà†1¢¨Ë%O‹;摪Þ4ý ð¢ò¸Áü}¨¤?ù0éµ­éâxÜžh«f”nÚx Ðhƶ~½ c¹‡ã^nk ‰´úʘ’ù¥êÑAèê™k–ìY ±{K —Óµ¦w›úøü9~a ¡¡S©1߬2ó÷X¸S1‡ƒ‘cÙsû½ùFÏ;”S?QéËS¾·µ¬âïóøj—~힎rÍ_ W’÷[œ½Ûu¯,aÖM™ãyÖ‘1)«i‘m7còCºÑÇâé+HËeúC¨¡ÔõÁ‹ü%¦OÍw¬“]Ò ”/ÓǸIpA¼(ܼG! ˆð•ÊŠû ùX.+{I*rô*»e6,ƒ¤:Eåˆà›Hrp†ª§"ÉK˜´µ=ö”`z·‡hyBü<ºÓÏʦŒ³y?9'›]ý—$í"Ib{ŽO ˜™ ßmh"Eœh¸/÷U÷à8&à”Õ+.—Þ‰³¤³òéXH`®C/¦j§/±œÍûäoçCÖÄ RÖ_g²pMy„ú†“Î "‚7FJ’iÁ„7ŠÑcuü_ÓðŠŠóiR.ûxòS ´ËB¼*¥âÙél¸hˆ·®|H£AkîÃlâjâ-ï&£ÖÔøv¿øZpó^al °€ó_³ðlm!˜—îi¶ÃÅhâ_Øw­ l+q¸„îº'óÏ’Õ•±“Àá&êÔžzÈ´¹¨³{¡#¥EýrÓˆßQâFu\²ú¢ÁΛ÷Ï*­E?5¯\i镹‡µb0ñ¨S­ ro´Åý´é3ÈO—÷áÔ!õü%ŠÂDÕ1ÁK4Ö7ÿ‘ðÔ2TÝPuѯ¥4gaÓîj½Îc‹ ¡“¥,] â­ÌÌ÷ɺˆRAÂ$ÿì³ÊøE'²×ôTè1¶”Iš@Ä1uÿ4ó:=Ü«ÃÿxØ-¯¥ç ØiÍ,Ñú)ßUða‹‹Šc4o Û]kÅs>²€eÈϢᠨ‘Q§:õsØUñó½­H‚Ÿ4ß$%¿’Æbž¤yeL'DžÄœT ¯.މ\ >ky>…·‹Ý=ɶs F“tù´~ý)Tìá®™w:–Àº W¡XôŽ…Ä<àêf© Å­¦KÁà·‚Ì|GG{ùdmMfÆŒ÷šºb:m£]æû]ãÞÅç­À/ÇfÉñ‡µç)2EåÞ½Z_šÑ•–lMÄ1Z>Åì{¿üq0Îô¤YjÓ›¼Ìß§9²¶~¬ÎAš‘Áç¶RagG¨FÐm…ŠBÝ&ÑÀŸƒc"X¼c·°1Þ[²ç'ƒêJ‹2£¢aG71ëOðR’ñ÷ù(Ù>0ƒ‰¯I_r̿谿/Ȉ¾{Ûí «³ÿ€Âb×+íVïÝ ŸËTÏ7›¹_œ1£N"årJ0 ܱ}3}Ëé÷öªßïÕçÎXTôÅÕL¼t)…ƒ¹5õÆô®ž·€d—Sž;oéê†ûím ±Œ|$+¶eV.¼qýAÏ’§8âÕ˜:œèÀ¦ß^®þ†~fµäâ@Áî’nmU2àUb™îò†ØíQk'泘ޠReÂX¯§ŽÁ韒œ*t°íi6€‡õ’h³ø'çož["<ÍmìNñÛ¥MÂ18àd4*›%tÛ_4[m8 xòL,ø­cµ©63¢ë6Zõk!ý‹²“Íøùú¾af@‰ÞÇ+¤; Dìmò /yY‡mÆ|VÁ<_Q)‘=YØ.>ïÈe!^MùPttžþ'í!Y/iéWiɹ«­3H- FN’Î^Ö+ˆH"ÃuC½æíÏ™ü¿”ÖK13ûѨ¢“fžÕà_µë_C ecŒ 8–¦‡qÚΔÏn·³À’vøŽ_lk0‚WY–ŠVçMåM;Kª^‰D›ÔûÂ!v„êmõ­y ~¹|Gý¨¥÷»Ý;ÁÑߍd¡Á®×ÀÙ…ff“‡¸éá¢å¼Eƒ8Nƒ—áâÞØ÷eÓ”9û5å~CmS%kd»~à™ äe§DI¿ÁÃ3Ðæ•ŠÕŒ#yê¹@á5>ÖÄ«5"•eËL ÃøÁønòÓíÖ¸' »u?2:…è­Ö·aäØÌÓÕ_›²Ø1–°f…¯#$·"× òE&|™!Ó#Æd]tÞ²i?©††Y 4%dô'CÃb«ÚtDì(+Z¤¤+¶O*ÃGß øBÔ ë[êæ¸R«ObÓ¦†cææÕjèká ö(I®°EÐ1̉ ‚†çÇ’¦íkSОkUÍê"5Ÿ-‰Qå•f• f&-šÊÞvÆ¡ÚJÈ<'ÿôa¹êkÝ(L\3we\Ð~¤érÚ¸oW‹š›¯µØó†¸to÷jŒ”ä¯Ûk6Mæ:I%ª¨VK¿Ù5=D’,©2©L`ØE'Y?'¡_Gœ|Ã!ªøù ŸAúhóÐù‡qÚ-Ï"êgˆ«¦.q¿ Ø_IFJʬÕói Xv"wÌ”@‘,cEÖHøÃ»+Þ~;/–ðmòÙ³ý~kЙÇêsçáÐrlÞ±]»dY¶A› ˆœÁ7ÉžkKÛkwÏ…¦vHJ+m¬ÑeÌ céÝ!X­]ߣï·Ý€uu5„÷ˆZ宋yŸ‹ðg;.UzÞË2íül€¿°!ì–6Q ]¯ñ‚ýLïufŸÊˆÝÓƒmG?¹Š­¾U%€\ñ}èùz´Z>-¤J4Ø¢ËG“ívSF©þºÉ ½ Žk+ÈûEY°µ9ðô̸W•Ì„`JxÂ0¨½òìy7ªÞËÕ1Ò’â{O•|• ÛÔ¯ƒöD¸öqÿØý$ø£ÇÌ ÖC† ÈïÇØ;ñ5áUí;Eƒë-¿Št˱!iTÓ({F©%wt‚PÙ½K¹p?ý&DÈîRZ¸ïÙKTCmL³¾\eé,äÉ÷ƒû[sGhÎ:.Õ/ÑË]e œ¾Á=4³dc%ˆŸÄú}´2²Èw^ª›€ø®±0â=áÞ¬·ó€táÈ~⺣EÛsßð¤Z¾F_r*­@O|-ìTžßYŠkáùª&¢—èÙžÎ<À›Ñ¸ËFBʺè&2 ÞÑ>ÙÉ”Oüƒwq|åO—qä­^}î ¨Ä&hjM¯ÝH&vêNJ.ÜÌzPßÓç=n»©mð[6îò(Iž°U¨AÅ0Q¹&Ê4·]ÌJtìfã÷Yb‚Þ±8:HƒÕµK®«]ôHÌ—U]!¤ÚA‚RŸíeL7S8¨&{Dï¾5Ï5%ñ ¨Gq‘Á»®Æ ?¯áÄsK•îIZBRØ‹nÙÐ’+÷Ä8îÚð…ãö³p}ß2T’L_—Ê-Ý3š8Y= \r^zæ¼Ìœ¹EBE­oì-GWpšxqµáPô6µPñ"^ªk7¤|K{úríµ%E÷*QË¡ÀqFÄÄ2û2Zß™¤¿YÖOC¡x‡Óزä]Í% ›¹µÞkø%¡g`…›GMhW)§î·¥ji½eP&jçådê{¶´/ŽïížõKŸÏv†äoâ u/ eð# —¸„ªÀ‹; -9TÉêRà‡tÆv”ÞûM.²Z£m!ë§-Èwf3¦“‹ÚGÅ…¾jïu“Øhºt‘ù%LÛXä1µŸÖ |¦ÄËܧ}¨'“…>C›ŒëJˆ:¥ØC@ݞFU`9È Ô[:¶ì|¥ñy=%e-Z§ú>Q;\†³rúM[­ôð¢ð¼þ~+Ö=mzJ9Z,bPä©SË=Ÿt$…A:Ê>çµn±é¦jËÍNX½œâªZ³{›™5&Ù§mýñé 7%Q›!†Ëâ ›4ʳ鶃…Ö<©#„¯Þ­8ô›ÍÖé½$Q+H±O+—c+Å/Pnø‹Ë³€UmL\„œ™ó‘Bù³éÌßò]ÒN ”(±ÜzÊc²àºò0„Áþ¾tã'Xêâiµèe“€*\)dŸ7nè®Hóãqp±5ÇdÏÒ§Å«/æcñ¬6øq;ò|‹ñQll–Ä¥K(çó²Ô•W™¼¤zýógÖ ŠþÔªAšø„æmZ{ÚÉ:g`w¿‰2ÇçU;ë0ÿ<‡qż¨P Á—Ï œ"O«ås9ÉÛäf†éÙµB‹Ì¦›‡Óì“«WØ­>Hß.¾AÏ*Ò‰ˆ‘Ç–kÍ>>aÓ˜QTøJгôå€J_F×¶ŽÆ,7‡n \¸9½ ñšì?ëï¢}uÞ¯–/®×±S"/97‚¹Ä ú•Ê*O7¿Š¨`Ý}†A3š¦XæCµàÈô«yÒôWϺñ]"ïqFìJêVÐÔ .Ó‘Ë-,x|å-Ñ« @Àæ²ÑG¸O äÃA¨ö4|?jSÚ×[IÉÀĆ®Ò}"þ^l÷@ÞE%²±_¡õ}>uKÒÞë ê´‚ß×ZÊ–“›ÙÁ„Rx*S»J6}_µHåWf‘ ´;I“‡a)uQHÕfD"²BÉÉêfšÔ©.ŠÊ®&ÙÓ¹ç¹ÏÅ[©6=ŸáÏ™;±ÛêªÌ7BÓr³¤2:(2’îíʽ©­-¤¬niÞ+yl)_4*|ÎòßôûœKÖ&á?C-v,H> ³±¤r}ÝN»ôêü[©£Ι•õ7×'(Ž1/øté‘£ÜHÞ+æâY‡Ûá ›³ù[µ6Ø‘"ö/Ÿ¿`uFÉFÏžˆ†¿”#Ý—®ß”ëü"‘W„~ëÔz}ý†D3½ä预@Ú#}üœïµ¸EsŠ*¯Åäó¡ u2üJ.¤UcÒæão¿ç Ä6¿÷Þ0¢^½L™™~VåòT’Ñ ¥®nK+Uh½Ø“uSŠ'’‘{а£úb/Ñâž7—ù-án—«q aì­äøAë{˜_ŒË”á8Ã…ÿî|„û/ªë|4Í!_ÄÓ¹‚=|Ç„Ò(Ù¼ÈdßýÊUdÛ¡AþðNqpFἉ.â\¸ünNf{\_ •µ‹¸ 3FW?èš+û®Ìaî߀ˆènóP¦V4ñþ{ö×ä©V&Ú rÖuNz3p-I¸D^'A]¼`BwÙ„¤R ‡j|¡(“MÆ: Õœ;3ÙïÑ{mµëOg„_îÈØ6/+Ç šÀú쟣…`ôkÞ£cq˜Ù>X·l/$1ÐãM¬ÅE[_bñ]zo½© Ò<çÓûcÜdA4°ÅmçWÆ÷ÆÅE»‚—‹GU¯V–¯…#ê „Å11Äc·Šy§ Ž()å)¶û‰¹#ØØ‡}šð÷ ©¥™˜þ™2W;<#'K­à_!F%µ Wgþ€ ”"̪tjÿ(y“j–Ìþ ‡ß²^¥V¯S¿nÌ¢‹VI­Óê— b]ÁÍXÒ2¤’œØ¬(fQím"ÿj¼eÓÍì FRºN{Qbª÷) áÍp,Y÷à»îmÇÕ%8Йm(áøgµ66F“Þj)iî=!zcŽ62¿ü/”Ÿc—ŠQM¬Ä…Äe›pãvÂÁvDÇ“JFh`¸¶®äh‘ôyo!z÷[Ý…(†÷ò^Í,¨‘Û'îC ¡'ö£÷w4rD Ê«þ$Œö7ÕJ !%¬˜ö¾?'ì :‰ì°g‡  \t[%XOÂܵٓŠ=ä*“ûßܳ=‡tPÞhk*+òJãë:rØoŠ<ô2_Ó(ß9²Io õîF0óÄ*…@›ÃTEŠ7d‡? ЋÓüŽ7° CÍ -è ¼Ù<|ËqIÆ=ÒD¥ÉµµéŠ‘’êÈ}guéfÈòä¦2/¾ßÀÝ[7Co4B9lG#X²ÁÈŒî¾h´ÿQ¹Ç–Pðëî↥f&È0´¥Wó.+™Äððxª4ÁЯn¢"<ü^ºmÀŸ&uhÒ$Ó M±32VÐ U÷à]â‘fÍ0ôÅ õÌ&ÓŽ?±Äë¦,Ìô¶EôGªcæGiñ«¬]Þ_Ò¼½í÷ ³iÄËèãäÀ…º‰Ž,!°þ϶·Ž âöâõ8·é}eiâ9ªÏ½µ"Wlá©Æ×‚h¶³Ha‹•®ç‚ nÁï"Qi…ÎZmÚÞ÷ñ”ì¬K{W©šè'g’µ»ç¤_ñ†X³§ÒòF{p `÷øßéZ^ªß¬åÊnºå Åê1iBÎ_tW*½.!®3…O­e¶Ý‹äã/éÅä5»äìåúƒá)úÚA>ó“4 Œfˆð…FOÕ¬.5)÷³ýÞ­MÈö6ÏÊAdì˜!©Ç?X„QÝÏÅümÒÖ)'éšÞn;â--ËûÜ/Xë( \Ѓq‡µ„çµ¶îs›¦‹j×ÍU{_“üߢä +¡ü¤~¬å›1¿Ù@%.>&©,… “-¹râ1#”qŸ´L¼B¢ˆFËç¯ã_\]^?c¸»03-l3 í™`Û7Þ‘©Yñøõì í4ï{ý˜ó­§WÖÐÍŒöYÙ¸hÊ­æ•\ï‹';žß8~’&ü:/ZR-]©žÈdtÅ/æ&À‡&ÐŒy»2+ûW„‘¤™< [&YQà™–›x‘¥Ö¢9ÅÌ´!í^wØvvh¢ìäX :…Þ…†¡¹™Ó›î+ó ¸å9Ews1% ³*Ó´¸w«H«eûúwŠ?#÷:%FQÐ9uÑø’¬ÚùóðSŸÚqn̳kÕA*_.²m>ßRA³£8ãÅ56—ÅuÇÜÈÿ|0Éqßm;í<ž“ÒS{Óeäg‡nO.CÔ•x¼ Cü¤´%h©„Ü`¹+ûSQ?SéÒÈñÇ[îh•À\Î2ô‡Ä«’®DMyD óŸÙoM3ˆGZ«õK±X‘`׊æ\êNN¤¶½Ù¦3!Ñ_&7˜Û|ö¹³6ù°†'Sј„ìi(0Û{þ=±èåœ&2Xoç Î'Öˆò[½ˆ§·ÊȉWÀ˜i›V`ÿp"€zÕF$QoˆžÐG‘ÂâÉîÞÇÍ“w^÷Æ÷<åtßH]ͼ‰ƒ!UÅ+ ûgç°Îc»2ôTRY>爯ð&ô‰Þ§ ÜH’Q•Î'_¿dU{ÊÍ–2š…”2ZÅý±r|óäêã®gqºÙ6€}Èp¼×Üd,.HPÖ`£õ¼ë°ì`ÑØ©(‰¤S{È©“ 5Ñ?&Øï¹<‡LÚpg6‰àüÐ,¦FÛæ´XT_HÖ Uÿ0»šò·,òÚ‹þ*G˜»>^£\xDeß~AΞ„ Ë†éä’¦ÈPßo᣾±z–žHåëZ%G>!§{»QaÒMÿÑ÷uq¥.F´ºƒ‘$™¿­ 3€­S®¨º²[Üwc€ü^Ô·ÀÔŠ¯|i< C•ÑØu]Ó°ï7»2®Â³¬Þù‹G aÒÅéÓ3¿*ˆê öïónx¹V"hIú*C” Ñå_Ý{*”¶£^ý*ü€X¹-y!RØ2u3Míbaù¾õ;Á&uw„}³ÁÕs4É@k®k*¨DÁ·¦O…“ãeüë755XcÖè !M¨m×Ù±Xäm‘:"¢ÇœÏn“>RaO]“ݘTÔIÃE+}¶“RÏøÎDßûð“Å› ÑÔ ›ã; “ÿ imžÞ=’ÁüT³F§!²8'Y} D9S¼`ªjŸªÄýµz¹;™JbfIà›™1Œ0ë´|F¤à‹vB†³ÈóRX´ Œ™3°Šuóé‘{4#ç¸!.î–yâÚ¼aãÎÛí˜Ý<®_?I| ÅE™vò‹Üò"ñòLQÉ(Se©O~Z‹[ c¦‚hxÞ$—ã³.¿â,øÚrf×rŸ:€{©L3ÔÜý]œ§îîvņÿDöUCj1©A8º’ˆ½Qb÷×®7OðªdÃy’°w"Z»GMhèåäˆì»2dÜ®ûy'Ùf³È: úÄ<ûå.¾Ž·ý"뺚»Y~ »fï+Z/# aë’¾)*˜Œà>оE¹ÉêJöïŒ8H½o[öXæU¥PÚx1N„¤(ÜpÂEÁ±=ôl¯ª êåx:TØØe²^u~#»¯¦D.­Ãe võòÍÓ¹6ž¸D‚$÷ÐðNAû¬ˆÐdѶ@EKª*ò-u쪸CEC˜yªiYJ£[1^ŽBOÇù7]e·{“û!Âc}ê¥CIìñ¡ä'K›¶Ö/¾²g0YƒuUô„û‰ü¢ñŸ BƒŸ%~C,‰ƒ™Öß“ô34(Þ[³dè‘÷¹U'ßUÉ—}šË79ËgbÓ!ûe ì­1:Eè\ÏÄá nVY+lüò½$”§m¾‰Û»¦§ ½ø”}[~ÚHïHG[X”ß@ö9{Ð.[o¤„ʾ % E®!%ž”ÿ‘øŽ*~n­[L8ÀÝÍ´!g8ÑÚ¤šóø#Ž£Ëåj#šD¨+¯ª+o<ÝîÈq[dÛm$ÐÑÚµÑáGÜ?©mÐ’¯¥³èml˜ådXxÉ7ê»ËÓ4Ì><=…ÜúFn¸ Fj {ÇG4¼ü>AuòmôºpbwqO4ø¸¼ÅY9ê>vZ(:°Š%ãÇ‘FæLe:..QP#÷èëâ…Âéå¶Å4ÇXJTz˜ÕM’d‡QæyNU•Uçë– —¿Úã÷ŒŸ("Q´)Vñ”áè•<…ðÃXÕ­‚5_8£´}ë«~ѹe)o—eŒ‰à»¬ñÚ{‹s@.’‹gÔMnžÂxF·´¯È?±Ýã|·~ê߼ب?m(j†€ÊûH'ê×D¤„7-wн•gÒ™0j¼…ý‡ûtIˆ1WÐL?ßb½Ú.A—š–ÿYå ¼¥ŠºgÎÉ@q1«·f”ÑØ±y·¤»„kyìü2¨gpUŒ¼ŸÛŽ–Þ ›{#’¥ÿ&Ò ¯Q1äN¥ð9p©1’þn¹ix_µåIXµ»q:—àÅa©Õ‡@ ¬ Ñ׆¾Icí-,¤_I*_Ð;½Ý±¨&“™îjž¦ÛQ~atD‚¹9RFúD}ÌI±ËC*;·£TÓVK€ ¬ek=È—7Û±¬mý5ÊÓY#}h#V?`è³CT&íi$­g˜Kƒhïý‘õë‚A"%þ/b;œZÁ̓G;»¶DÁ+ò죄´ ;•‚Rt£O)uNy1€ê,i3)/ç á€õC5²´ôì¾c)—¢ì ÞÁ¿Núää'Œ3ÈdÇîUÑŽ’/0I£¸Ô½ô¥Š‘%œ&/Ðm7iÖÜÈòÓ©@çÒçz~Úì>îügnx‹_>„Gì¤åfLú¬Ú1ÆUWŸÈL§“$˜Ž}™Gr\䆡ùØÇ‘P Ä{¿#y(¤³Ÿ¹3¾må¹*þНÇèù^ßë§Ï ÇÎwüý1R³ö0“X,ä_mÔï¼SfûD"ªY‹7’ão›`¶ >J…`¥ža}ÇϤÒé2õ×å­¾´“È8dZ)ÐÔâ5KÈ>ã LfÊ#;½z¯«Uº¯G¨?ÔìÔ„Œ”~\ÙkìC[‘%ÈOy 1©åÚÍì%5!ÂZa4‹áoÍ>¶Ç<_0ñ6£ç6´m§ÉZ<‘ý‚ÏÿÆuÞ¿g‘ØÈí2åy¨½6ñwßîæÙ ¯ÚЊÐý»o7käü……_,›6牢¹¶¾ˆŒÕ#‡8 K¢ÿДó.QŸÚVî—=%“x³|2çRÎ9áV”•QÛ×P·_<ïc eŽj[í’_lemf„x~ûym8ìlSÏ[)XÉâõSµèò¾QNÀšë Ì%>Wƒšæ›%Ji’Ö¢hua‘ ð§Îr í îy–ìDqá ñ<&7' 8ÈCeûýy2¯Õ[H©5ø®Õ3æpD¾/|0˜‹«càÍk¿Ô¿k'x• ͛׌©MÁ{-Úº„¤%ç/gF¹@t´?V@Ì[;øYT`p£y0§J÷kÃYi¯l!¾FH %$iµÂJËTÿm¤ÃQý1Íž´3·e'b_ì!}Žaÿ2U“PýÙÃ\Y†B{õöû3Zß8i>g |eÔ˜Oê}P¼[‚¶\¢º½BæWS¬S£]E>‡ÒÝêM¦W†µ'dYéŸ4Ý–¨é^É´É3ç«¿AJGš'èˆ|{XUjá…$:T#š¾$÷ä]µa:.qà+ zýp†˜Û{ÚPÔß"¨?ŒªùÖ?G¥C7‘Ê[¿|ë»ÅÑ6š¡Î|r‹¨xÔb™¾‚ù-Rd5!²KXp‹ß¶®ÜzŠùGÔK´ÁñÖ£|XÊ\Y)gj„¹_¶ízadáù _æœlN€?7žfréEÔ•ù:]¿P@;wˆJ3×Dtœ˜–{ÃA¾g9£›à¨ªaûbÅ÷öÄÍb¶«á/¡Ö»ôT7zþsñ¦øÿq÷) endstream endobj 5154 0 obj << /Length1 1467 /Length2 7098 /Length3 0 /Length 8088 /Filter /FlateDecode >> stream xÚuT”k×6 ]Ò1ÔHƒÄÐ Ò RÒ 0Ä 0C‡¤Jw RÒJ#ˆÀÐ Š4ˆÒÒø¡Çó÷¼ÿ¿Öÿ¯g­yž½÷µ÷½÷}_×=wôøáö58 É/$’*냅„ ˆ$LÈÁa EºCþör܇x# p˜ô ”½!vÈŸŠò¨‡5}ÜB"@!qi! i( Iý „{KUì|¡Ž@ &Ar(Ã=¼¡Î.È›uþþr;ð…¤¤$ø~§= ÞP;PÇéñ¸YÑÁÎhw€Bÿ*Á-ë‚DzJ úùù Øy àÞÎò<|@?(ÒhA@¼}!ŽÀ_#uí< F ä»@ŒàNH?;oðÆáu€À7)>0Gˆ7ðfu X¨ç ýÖþ Àü³9@!¡ÿ-÷'ûW!(ìw²ƒÜÃÓ…9 î žš¶ÒÉ´ƒ9þÚ¹#à7ùv¾vPw;ûÀïÖí€jŠ@»› ÿ̇pð†z"¨û¯•¹ÙfU˜£2ÜÃC"õ§õ†8Üì{€àŸÃuƒÁý`A[NP˜£Ó¯1}<M`P/X忯EøÏ‚Š@ Ia) Ä ñwpüµ€q€'äwPè—ûf† O¸'Ðéf HÔ ró" BØùB€HoHHÐþm ¡H =Ä #ü§úâô—}sþÞP %è†~B@Я翬n懹üÿ}Ä‚†êº÷MŒïþùƒJJp`¿ˆ8_XL($Jˆ€!ÿ®£oýÓèŸ\0Ì ”ú«Ý›}ú»eß?àþ#à¿kéÂo˜ rÿCô 1ÃÍÐÿ7ݧüßXþ«Êÿ“èÿÝ‘š»ûï8÷_€ÿ#nçuøƒ¸a®òF:ð-Àþj ùKº:G¨ÇGÁH»5(œoÍ/$*ýËE¨Aý!ŽúP¤ƒË_¬ùËoòKoîPDŽ€þºan²@ ÿŠÝˆÌÁíæAÜPówr£¡¯« s€;þ›°˜8ÐÎÛÛ.€tÃ(a11`Ð*!þ¿É €Á‘7)À›C€NpoÂ_+tC.AÈ/ßS (èñyCYAø˜Â@AÏÿ0Å€‚ˆÿ0Å‚ÈLá›Ü€ßæ¿:vðñö¾‘ïojÝŒó·ýû®€@ü!„³Sp™(×ú¨¶ÓZE?þ5´°(IßAì¾éª*½ï†A„²ìÙ¡HQÜŒb×ÄzÜÙÅWᲟÍnf4 7ëÏÁ9qÒ4³m8Nö+|Á#rç_Ú>ÂëZ¶"0GgšÝ7†üŽîóÐòyí¯Mæm©Ër¾©>©rÙÅãjÚ ÆB'ÄáÑIJŠcEµ+æµW+Õ)ŽOt€Ù÷ÐßÒ˜Ô¶Îrz„Å–ûæ*ø0¡_r¶·I<µŽò¶å³7߉´lG€ã«ïTé.’¹#ŽÚ¢Â¹íƒF²o “´Ó:¶nû…®‚“#<5D$ïÆodí§žZFÎÛ)/£ :xjÄ‹»Í[ÜY+1Û’¯© i~¨|3çÁx\£†µ/Ùiù, "^èLÒ9VúþN¡ÊÓ°¸§–Ò™8“ ó8Æî|k·•¼ŠÕ–VcÉݲ•ñŠÀUFc .ÙìœÊÌŒ³ðMôÖœ Aa£±FûŽÞ}ÑØ… q{w^ÎiF³o+qY å±TdÖW0×7o™à¿M{Hñš—•¢VúN䞃Á+F/iîp1½)žæ`v|@(S¹?àN;aÉ€nøÑÝkO–W£ãlŠÕ©†ZÓÁç§-Iî+IrÂÑð¼ŸãtýÖîž}ÅÔŸbWZi•˜Ö†¬°èØ3‘Áäš²hRŠî=Œ ‰Œ›¸[C|ï‰Xßšå•=5æC»¤þí§Äòšnµk6eê:,$+¢>7.Tâ \KÍçÇ…z䊫Ÿnk=‰üXªaQ’Ô‹;˜Ëè§÷!²H;ge6Jœœr7l»ÿI|Ö«9É”£ZC¢o¬šp„743Itd–本¹‚3 m¼ø™Ÿ.E¾÷J£>†§B}PÄXqXÄAVÆå ðÁ%knß^ËCjÂzV©G“حئJAæ>Qò¯­úä2\æ›"^?£¯aë\˜~:°«[v„’CKÒ;»½=0²Þ´@G 9’Ôû·ao„á'Z2ï‘mu¿ÇW„9?mÔ(gâRÃæ¸#ëÛæ1€¯FêXGç‹D3IƒgómJÜ­fí·¨C ªKéVÃÞÕ±´ÀIŽÌ§¾ÎiaE—!Ý„mS ‹/qC¥l?nL»¡£vIׯ¿ÆÜ{ךŸ.C‘eÒY{å*Ä‘4Ü$«ú%+ª6Œépº}”ÕMlV•жˆj²$¸3¿þ&ë[^8-xžnæ¡&ÎMgFô|¶£%íqDåL §šAïtŽªE`W¢ÖÛš3f^óAǽU >§%ÖR”_ï)£ ï~b$ú0ñðL•VüiìŽ8,ðÞ:óÎ<ý#æ·%Š+US«ílù郦ß"»_vÈCâDÛhÓjoã»ÆQ'Ò»´t¢g]¸n‘‹nZú–öoDÊ—x=(ûÙx8Îap&â3G£µ®h̾`F¦­œá†{~¡)˜à~¨gY›™¨ áůâ<ïÃlêR(Ö0•8=êï›×ÏËi–>¥Š•zè†$–ˆÇž>€‘ÆêÞõ¡æúbéÍn<)Š+Q#0?Aù ¡ Òt‘ÿÄóÔ r¢Ö2ÅŠµîÖ‡ â™dR’9\RåHF–á•ÞŒù¡GéÇ »Ì&;ž,—èãp4©OßQ‹[×dP6lèö“MÝ[\Î4..`iˆ. 3íÔù’÷š²Ù–?ý Tð±+ƒè¶gS WW-ÍpÇqþ%5‹`‰EÐøäB˜[IíÊØbþùa4K¹ç«Ÿé]->×ç VPüAÍH µø°[ñþ‘g`þá—~uŠp‡…™Cµ&á×*o&ÿ>ÊïÎæº/.½ü«¡YUí‘J øJ/Êp99‘£%30ë7•ùqžcç_)‹U0n_©q‚'ü‡˜ çO9v¨‡ Ô+»„ËÑ•b£Ø‘é{²'9ï •AÊ”5Ç\O3÷ñ)ue–<èW«œzÛq½ØÚg9gXù…d^Ç*šY®:òÞϦªmaz`èùFB™9øŽæI‰LšÎ´Èj²7Ë ³½‹seÝŠUz¤äî;;×3Òæ£v¢®+ÃOA6á>¨…Ë€r#ÆÝC 5Ô›àB«µ×PÏ‚W÷ŒîúÛãD¬ ¼‘yéÁé[Tñdjº¤í}1&%…Mð<~×P)sÑïPY].ôsŽÚæÄ>6 BÝO%:8 u{åÁ¹»Ö¬´¯ =œ;Ä9e:œ%2·Ö»ˆë!ëÜ#¶…au˯À 3UmÜű˜ÈÔvNÌa °foO‰q܃Œ…vŽà.•„Õâ‹to‹IÁ-¾Ê¨6Ý—BX+ ïæ“+'Në<†ñÿøüýV¤V½Ä§Ç‡ÞýÙnÓŽ{N,ºÉß§¾öœ4=8ðgНv‚?–±ú=`ÁRFån/{íž³8~Ù»8yÄÊSiµk‘T‹!•Ö`œÚ[13'ó"_¥`ééCHxD¤\,›aß+QÓ÷Ňhù"íGV—‘s½G‡%Ä#b_§n1;Ÿnl³ ç°Ï\`ylÒvE&y5ÑîV¿¹µX¤èåYäÓ»‘3 V­´ÿ­—¼kãIÞªRÓn”‡f¬ó3ܪ%W´I¹aȳu«ÓG²XºËí4I#á“ÓBF&uËgk­ ÄOÕAÏØfà%Òª¬ÀЍAè÷*ùFSîφä'Ù[ŸG…NUòädæ[@æÏ2ùRvX&ðÖà( /6¤ªŽ=-hÓo¡»Ñä˜öRÕ5.o+¨¼å –†&lwt·0ãH,ó³Ïñ7€v±ŒehŽ#7«§€aX«ì¥V†+ùí˜ìÜdŸ£ŠöšâÅU‡¾»tHþO1¼N5M>Çœ[oVSÌÈ b1Z;Ÿ&ÊY~âÑ„¶3uÅFz)&æaÄOW5w¸U¥#8Ï õš>_ 郎 \Ü7K»§ç05o[PXÆ™Òg£„[@^>ÓKr6¼†¥ðïÛ§"¶yøîömšxÌ…seÃ^*óÄPçYHéÙûx¿U{•I6òùý ½§ bÍWr3tÜ£Äóa¸3ŒâËÊxTIïÕºqŸàh^¾ÕL‹˜"²ÍPì)-f AãýJ .Œ6E): ³f £: ¶Àü*“ÝéK_¶TÔì“õYe—•Dª§9xªoß!ÊZ?¼"5 %îÁ§…œµTêËþhs)µ%j&{ÙUùbíså­1v5U«Îõ²9mß “í²ª]å½O'Bv´žê°ÑtÅýŸ¡)Ë¡÷Ò_ çÐBAz¹ãÖ~¦gFôíÔâ¶¹Æ*þ–ú9ÿ³ÆÇ-× äŸË® ó´_ÙV¿?äAõÑÉŸ¥;)/C“ÉÑšï nŸDù}Ÿ©dC5ïŽâû휄É$–$¡©Ÿ…ÃñÄ ÜUbÂa9ž+–/ˆvÙwìq*ô‡zãŠE:gR;Ÿ„&¾…°x±~Ñ‹Ao’åÚg1ÃïN&]«Å'!|ùÇWîm?ÿY¥ë¡Ïƒo¶‘ð£ðy±°óaëÃ! Q¸‹=‰Tš²•×Ï0Ñ`À‡™ü i;% 6-‰ØzrØ*æÉvëWɆ°BùÏ7/ðãè®ìÐdVË IxíXãwo?Äp¶Ó¡¾Ö[®ãÁUÒfë ~C„;ïªdœÈ$R/e’˜÷µ ÙâòZ$½$TÝÐþ ³¤­„@¦"înŒÇŠßL¯r—OK[úþ€nôÚèkBþ+¶\:fÍ6itEkGŠ|q"®oþc¹(Ç´õxr•wÞc>TÁå)‘ bShÊAC&Ž'ê áyjçͱהՒ´BÓ¡gÝ©F³éGœª2R£L¥w¿ -¦ñ‰kîõ4 ßÚ¿ŽÕ ›ž3% l{šn øHPbGxJµdä,VÔc¦è¯PÔg c2ÝÆn³VDõó*Ò}±÷tâ˜A5¾ÿSRÀÄéÌô~0Óòúü³WF±‡©É@É[D/±“¸€¶.–‰Hœ|´ÜäxÑHNB¯¹"!ÑwýÎkñx˜œ¯ä0}“ýdâ|á{@4ÕÔRèÑÝ#’GiI|Å.ÙíÉ^“ÛÈ=rl•”ŒOj¤n»ÈkÒƒ;ÔýŒ_•Üos·}M[“ÿ$é¾è[åuÞ}þÔÇÐ¥Â{)aZ6¿*Xª^4w€(ŸÙ÷ú¹†ÿÀLÂ×£ÈãV&®[þmŒZmÀñ6™ö ô¹ñƒ£f5,FrØ—É[g“}KO¾v’Æ“Þy‰:aÐŒ"”×Óµ(xBHXj'ù*‡uS $°˜ŸÑt¼ƒý%ei~ui/n+‡šHd&ò9›K1ÏÔâ! pqjp.r™/9ÑW¼±8ïÀÕfÄbBËœ¥ÞÐ-ù!-X°•¹µK‡I«*Á­ ÄJÏtyC­ÃFƒ\YTde<#›¢{¯]ûÙRüKke¶7ƒ«ön³ÙÆôrÕù¬>{R¨¨º‡£žSÏøF$ºåý¹=":áZ ]™~òŒGIÑýÝ·Ã{J§¥Ï\˜âàJ½öN}Ëo¬o'KÒf©Ý~.’ÚW5óC÷ÓkG3¾Æ Ñ{‘œ&åå(!jwÎçúíZDóS¯ ‚<¦¹.;œbGÔÐáðA¼i)Ň[ØjïPçFLšø lñß‹k5fÚªWuôj±Â¼ÿ2ËŰJÀÉq±.îì-âOï>wrÞœ¸ãEƒèmZZ`³ ØÂÌ8¯€~›ůóðÓV‰¨â4Çœ½·&”سëÇÛ«w½0ÖÙ‹Ç'×r·l¡Ãçc¸ åÒì™UQ¬°‹oy¨¬£S±†^;تcÁ({B—a"õ5ݧñê+Ö Ֆ͆%û‰RÂ#…œª ex=J†ýàÊSüÖíGÛhkà„ðÙ7/+îiˆm&¨K)GÌ·Ñ<âû-!²õܾêÈLº™…¤;qŸÉ7»›9žI,¸ž,·õÁî‘"0¼nÒ}•³È7߃¡uûðh+ÈØkeéÊ6¥¹4éð‘‰I–fa¹/£ƒÔ©fÛrú—EekÙFÞZÎ={5÷äó µ*HÝr÷ø©5¯ã`‰lûb£æ¯‡çqgþ80ÐJÍý“3Øx|àAv {¹myø[<ÇÓD ÿÄÞŒƒr!…3L0 ëå€Mi„q›¤¡(¸ˆ‡=Â%>i“¦ÍõSæ$$V@Ý\^;OˆŸ6‘0¢yÓ Äiù«­³ª›­1¥ÇF|½H=oj^ÌReRŠ&µøÁx³Ä((©ñ¥ÚTwëURŒë ÆW©iíœîÙáƒöœ~ê€I«'ÕËžŸ¢0ß·e6ìÂÖOKÒûÖ ÖêÞ¤Éd¿ÐO<œ΄¸x®ä5¦w|hœ±+V"ûj~FRˆ_ÀžÒÈ¢Ê펽D£øµ =«ÕWî/Aü)ÄÜžâ»Ïzg¤ëU“ v?µÑÎOjïò%÷}8%e³W’¬.Ÿó¹<$Yáùá>üëÒ¡ßY!‡Ã¼D5fŸ^\æ^]â¶ åtP~Àλ™´ºuêƒ lÜÂËL8òA¤¥AÜðü6îz,Vyiw£Kñé¨Ë°<¶ÈÇ×H’ʱnÊ9{Š÷WpŸ¥1Ù9ú긥^¦¦è¬làñþÇá©'ªëÛÏa½‘ þÆilëS®ä<½ÖÇÔž2o©˜ÙùãKZÖÎ5J3u  XRЖj û}Àìçæ ¾OÉëxWè…zŸÚot,†–!óï$„8(´Ê²×D̓·Sí¶OñûßÉkDù™Ç9^…ZãJeI–˜cHyH'É—gª°ì†a#³ ÷‡1³×»üï|ÖÖ§ÅóPGš MŠR:³_¾U2SKÊu1W‡h~ðÞ E0eJ{Nßb ²Îö~‚5oZx‹ÃáûnTµû³ÛöNÉñ†ÝUA·6ZŽð¿{4 fd&—=ÍM)„œ<)UÍgÒ‚a¬÷d´[uO83UŠä?RWz…õ¥øn™:Ÿ ›€Gd Ó•î±Ôð<¥r_ W¶]Ñä/*=|Šþ&9B@ÁzºvÖ¹÷~ôõç0'^EóAWkÕžn‰0 Ó-¶á™*ªÌGÅp¥[tž´:²dVÇT(tö%&]I¥I¦²^–lFšÎá*KÁâhýh–€òçY†ÐÅj¬âìVuËHÅ^9;m²¥sÕћŅy‘[|,ë=Gfû©—ô*X^<ÌíyïÑšÛIÉŒ·__ Œµê̽YÕç6TOÑ­¬ ‹À¸SM©²‚~D·p·thÙ.w™è¨ož…á›6(gè…G ×Ìçzž´þ–îøÞ … !uyÝD‘ä9!¯‡RͶ‡zY9b#Z9y^{³kBÚÌ™¬ ‘[ÆøÕžCÿ‘ÈP FÂ%Y®§²Û‡$´«6Cý£1ÙõÉJˆ ý¨Õ‚8"³ïtÔúh¥õ[^Ò( y…·ÀŽ9ω/û”ïòШ*·7vBY÷]ªåÙø+-]J5ì‡ôšÐ“X‚­ÃO!í9¢˜Ê¬ü€…äÀúB†¥1˜‹f’[7Ìÿ¸8‘Ì:ëñçcåTâƒ9Æî*tÓÅϹà—RµÑô=QkÒÔÁêfš^M 1äШìÊ«œ¿¤~åì$0Úy¤å…ΪPñ¼ÂΣ»³UPNñéu„ÍÑÖ’—¾î°È]ÅaßW,˘/'*õÌëŸß íSf….fmß9sÊâ^<‰Šo“‘½Y=‚Tb“ªg®\$p¹ëÍ£dNssÝ: §ÄȧâQ¸‹÷MöÜêšžÊé{¿F­c7%É;YGu(ÐÏ1ÓÓçÒ /úåT{9.T)Trô¯]UUXëäÃ_ `ÞJ`½€ˆ^°¿›ˆw娍çm 턺Ö<æ,ÕŸ"Ž“2ý¸¥w›52â#¢Öæ’„TãmüdmÎzìt¾c‚-s¦Çl£>ÐmôNÀ•sQ:*ÙÞ@ÆÿY,•W endstream endobj 5155 0 obj << /Length1 2917 /Length2 21044 /Length3 0 /Length 22692 /Filter /FlateDecode >> stream xÚŒ·T•Û6LIIH7lº»C)éîn6°éî–.én.éîîn¤¤ABJø¶çœ{ôÞÿãûcÏÌgÎ5çZ¯”¤Š*ŒÂ¦vÆ@q;[gFV&>€¨œª*+ €……‰…… ‘’Räl ü‘Rèè²³åûÃBÔhä –½7rÊÙÙ¤]¬¬ìV.>Vn> ï íùï\A¦9&€´-Ð ‘RÔÎÞÃdná ÎóŸ?4&´V^^n†¿ÜÂ6@G‰‘-@ÎÈÙhÎhbd P±3=þ+€…³³=3³››“‘“£ù;Z€ÈÙ  t:ºM¿JÈÙÿ) ‘ jrú[¡bgæìfä€Ö  ­ØÅÅÖèg¨HÉì¶ËþmÀø§9V&ÖÃýãý+Èö/g#;{#[­9À d (ˆË29»;3ŒlMY;Ùý\@ÖFÆ`ƒ¿¨Ä…•Fà ÿ©ÏÉÄdïìÄä²þU#ó¯0à6‹ÙšŠÚÙØmñ{rš€ûîÁüÏáZÙÚ¹Ùzý™lMÍ~•aêbϬf rpJ½ÿÇ,Bü-3:8YXXxØÙ@ÐÝÄ‚ùWU{à_JÖ_bp >^övö3p@ü ÑËÉÈpvtúxý©øo„ÈÊ 0™8Œæ [ÄßÑÁb Ùß|þŽ w€ xüX,¿~þýK}ð#Ä }ðWæ\É@v¿Ï˜ÜX{k—? q1;ü.ür:ýuþ›ã—ÐÎhjü»Eùý:þºœ[ÿqN¬àVüNÇ .Ù húïÑäüetýãð8ÁAœÀïõ¿¼ÁåýÏ~±‚«û]+ø%dv¶pþ1Uàö9»ÙýáŽáò{]À9ÿú4s2±sü“>x\ÿ€`Ân,+8¨ûœÕã>?ÏßœÁ‘<Ž3ø¯7ÆÄÅ|€Î}€ ÿ࿾ê€@w  âÊ¢ emPû}0ãÞäÛ9Ê=TZF¯Ç—¸$ÚêÌÀMÇ[ᤑÞ7ë»b47B«$O^'-õp¡­ JmÞ? â”göÚ—§±§ O„ëˆU…ö½Ÿ¼Õ¬ [ »¤)s\xPó1îÝú%ÜëÊÖÆC÷”ö«¹d^ÿ,›eŒV‹Ò (ž§Ì3ÎZÀ%ƒuf$‚§C¿pG¿¹CÏ™z!‘Ž£Gô9fÿ䥽ÅócÁs£B•Í©O—ú}|†ÊKä0YgÉ«¤(jóíR6 -Äæø‰÷X韎¬:‹µã ¯Ä8…O[s€fB枊¡=]­ý Ê.½™››¸D¾BsQ¿þþp(Â]˜#½©œëG8y¯ý혭“™“³Ú)ÏQ³Ä¬õ&‘÷O¡>˜r°„×û<ÝÞ…–¥Ÿ½ú,§NíçÜ÷ÝU:Ëž¹  Â&¥¡¾Á(Lo䦉»ùŒÁ¡‹PÍÛf  ÛC«3‚·*®¶Æäp¹ÿÌq–7®Ê#óèéæFØàa8U$ÅiŒÞDbiw¦U…’ÁÀS¸8R&ó™ïž\HzÍ´Jh¦MürB.ôà®Ç ,ïÑÜœ¾öáämÓồ˜yí¬P#¿æ¦ ÂùÌIN-æÕ]íÚÁÂüÐHl±‰O:c“T¹ÑR¯{9în‘£¾Â&£âZØ[™5…ÉëTfRb‹ü½ªï4WN“)­Ó ŸˆP™S lî~AýXñéíMÙŽÎ8a_Š^ ¹oê¸ö\ö²Ç¨ûpuTmèç¡ ª÷:qsGTè {­ üd¼„mÁŠ>?|:ã6»úfŒn-™ ž&£sWÇ$I6l÷£õïÝ>ŽÌÉ5ÍѹÛ4/`ïkU¥`Ž¿;]GfrÜ舵7óbyßíÍ%T~s”ůwÌ\Ýiá=5Ít_¬, óe¤FfÚ&ÓúVJcÝ'rcÈ‹¸)ÿâÉF¼㼜(«>¥‹`u!m„=V\ÆW ;ä·¶*·ðºÜ£‚"JÌFl”ä(=(Dós6¿Omü}6æ¾å€–æØ’K9I{çP›ýZ¬ˆT{Ñv^„ ûgi.·½RG4‹ ¤dÚüÇ…‹Î)²›VG_rzö^[»ŽóôìÈhòjAT}¦ ÅuZD³qæö3Ý …?¢éà'à €b0RpF8_À²ÀÜËRÚ˜Roµ™óÁÒ“(3Øåï ïßÌ›¦ôç¾­ÈÈäœøÞîGOÐXøÍ’»‡ò$ô’‚½ƒ1ŒF‹96¦Ê 1톯¶>-~ôù.¶…5ÑYl*p¶i#_y&߇¯¯ V\_Y0™1+)몷È;N?“ô1 ŠŽÕÜí;ƒ¹(7§™½K¨|G·†ÛsÍÈóx†•ðˆ6¼‰i+íâ{@¤˜{ uëpÙÝ1g˜¸‰ß[[ËN¶ŽØEÌÃX7V¤èŸ÷ã‡ìþÆ9Rz¡™=͵|1ã_‘ÍóJ×#öŽ/‹KÌÌO)»ìó@—$ Ä4Ô^¥jÇPÜÊŸUöU€Ô<ï_.ÇfvêØ¦&»÷}ˆïÄ+ýEJìæ¢[ãÎ0ôa>ô¤|Ó.Ê}}²òB[‚©à5#žÞg´¡1ðx?ÅϹ‘Y¨h#v¨þ2§4Éç^ÂøÓNr»D†‚4¤ì†1¼7ÞèW™èè%ú³«Å4«¬]®9rš?—…-cIÕa¾°â|{•Ã(W&4‹óW%3#Œ"ƒÞ¥ DF‘:=†Eÿˆ÷qµÅà|2«Ê±Šé«kÜ=-ŠoÁ†´…½•73ý¸K|¯"°¿u%¡é½¾WF×›—ªRµr¿È°47ΖL0…g¢áCìÙ9/Ï$dŠš†J¡,´wè*»~‡íWñNÿÈÓaÕK?~ÂDÏ1c‡Ë®ª)¤¡å&oøK…³d‚êºèÓÔ IÚa'@ç¦Gs“H˜¬#²¿×[³îÆ j€øý€ÝÍÊt‘(èeΦNùØ¢òž&méÅœ¾~˽ÍÙ@À1[$Ѽi9!:dÄ®ž±“'u×0ßÞ”‘†p}YÚ;\zÄ'¨"N—Í·ÒĪW• ’aX<%ZÛMضÍÓS^??3 ¶ß?Àg;¿Ìú(þåE.~{ãCÍa4¸'ô£ºË@Aj³…/cŠÙ+VÆÓƒÑÔq×ÙŒ ¯cœä[zsfñò>hi®û®^%«t—:ŸÀÓ ¯åĸáÓœ‰•¢1¼ï`Ä2"KÞçÞ¾û¢ O‚]©¹JÒ dÕÍ‘Êes ŸˆKN™sE Ow¨ÄRayzêÒ†~Ê!¸©Ýežr¤,¯ö3dnŠBµ 7[è€ËzZôÑ×rq…tMY¾­Ýžë­_<ÔöE§…BR´ BrÞ뵎mÚ¸d…Lr=ú(á‰1©7h£-´ø¦£°G¨ç×ÃË…­'àP>"ûH„]X;Ýp|±‚‚\j"£ÑCÕ…Õâ­¡Mó#èxZRaDh?t’ÛT¡¯`4ÈA#2Ä(î ¯z½'›Ï ‡Ε˜ŽLN`–8ÕãhiÇ’W^J÷Uê g´ÅÂ*£nBį²ÄÆóX= Õæ ¶ÔÑHvïQºc;ÇR‚ÞÓβ”žÄ×jNÌ:¨ãÖLN Vÿ{3eú&“·Š ¨§ò5Í8¢çôùi›Hÿô5~±ÊjÙã~½LIïJ•„ޚϡMò›á.¸®â‹û1¢ú⽃šî¶AÔ2ë”›Z‚i»€á»’« .ìûÀÂo=]¤ìþð"ZªæoRa`Wa?û`«æ©¥N††å”OA™aeÌ›çµÍ?_hÐ;'²æ±Ñ /¢xm–ÜŸïš|XªÉ+/ñT¤S+MQYRÞ3¥#9°–?ÃYþhŒa9ZŠ åÖáb0P KȲ‰Ëþɠ˦ï-4óᦟÒåu‹ÙõN>â%µ‚nÇZôï?(ùB¯¤Ÿ¾Ð”›Kè÷ö××ùV»+ÁêûËì|™ÇÃéÙÒzÐ ~?–@vßœH)hÖÄMœ²š¾éƒÖ¯9öÕî0ì€ýg&õ½j0ЛûÆ7ÇýžW¼3~v4„é‚8~žšÚ…·€@ä•wFÃ#Šæ ls™ì;M|•öwC4ÑönìÁ|E!:¬3C ŠX^|x=KvñX»Õ9ÈÏî-ç)¾­Åq«·¬B(9š*½]œ}Dëû‚I™Yl¬Ó…¦ Øw9À•£ìºÙ2$VÉY H–­±çíÏ¿P%Åõ-*QŠZ×4âPæÇµ“[ž—’0­¾ô±3œæV ˆÝ%JJ5Ã3ÎØ›Ø÷ä!^àˆí±›ÏXØ'8 ' ÿ“¬æ¼×Á#ój(C>’©ù˨ú®ú¸âVH¬Kó()HŠ †¤—q9C‰ã¢LœQAZ“øõW_¾'§¿po˼&å툱†aZG‚²»!žÂnXp sE”i Rœ`Ñ(#j¿’Ó϶ƒÚ^O£¯ÎÏKÉŒ¶@ïúñµmG‰úJ2Ø÷{£€Óã4Ÿ>›.Û=aµÞRœ*ÿhzÉix^¯xxUC ½#ÍgbYÆ^hƆ(ßÀÇ.*˯ðfÔ•LÀ{¸NX÷m×|¨Qüî°æÃƒÜX[Dã-•ì¾­KV‘î'޵uñ-z¦|ƒ`ãã çÛòXÖc¦FŸ‘Å¡¹“™ŸÕ^_Ë2\OïÖ›7±Ç=¯C^O@\&Ol@ðŽ;Â~Ám Ë4tnLM¥ð8š.[ÌS?èi$ãö.Îο+ØØeÎF»ñ#Q,‰oÒ #Ò̈PÈ>V ðG8a©;ò_0úˆÓ8¹ØÝ »§ô™s2éŽÑ‡;<~~{…±'ƒ§YJ´ê£ëpKˆpDê¦ö@ÝW¸*ï@ÊÚµÊCñzå§iÔœ1t 3Z«çŒÛWþ “O¼ÉÕGšH*<§è^Yq( YZÒVXN-ÔŽôÎéO¡ûÜ´A´›6T‘²ãJóÈ»²Ü ´•uæ·þM!Kßã&âɘºÛ_ÌaoÄ2žèvQkpäFoù¸ «o,ñm2R¡‘ÊH¨‹`º0Ù[Ü1û tß¾–Ã| ÏÅ;±ÝÐOsjáËÑO‘óêãKhœ!„ç™ÙÙuXÕ ?©ÓpZC`÷é}°ï«7%/ü4ã{3ü(ÞÖmõ233Îî0F9Çâüâ$øp…Ö°çû^I¯)·%Û4A½½Fü%½‰Q·ûo’è>‘0&ÚNv?}dÖ4)mÀEÿ)X-ñ /+O§ðÆ é;¥Á¡4â§×Ó=ôj§¤-+Ôb±RÝéKÚÔ sê_V;;äìaóö¯Cfå#q7 ê_§ø™JH&¼Á`"]p1Ý bœuÚdcù" pªÚ¿ÕO¯c¶8]˜˜¢P¤~Ýdpˆš3E(Ã#o(wðl;åÞf¢„‰ ÕW¤A-´†4 céùFŽÞI§Àßà {D55ÚÇ”'§…w!F§­”ˆu+&üè´EŠ„¯Z/å'E2Üçj¾’æg5ÅÑØëâŠXâ–e;r™e‚`m0ä­çc¶ù•Uœ™Cî’×o9`D$®QNþBMc•#3¾úÕÜѬVM9‡÷ëb~8¥Èì’‚ðÑmÍ£."¨£‡íI¹¹îšõpþå¼@‡á{äGº”…¨Í/ÔDù«Ä99Aqï:i¤lÚ±Ûhäû&C…ç. …« u[\¯s½—cC=çF(Ëžl ¡ó4¼ƒˆ®?5t|^ðVà7›"#»âW` ;ØÏ­–ŠC§ŽñvÈ©ŠÝ^Tã´‹,ª”\ýa£Û«JeÏ€‘>©»—=ƒ8µ¬÷¦$ÐFéBôY¨KŠ+sú£XÉiBä ²*%d¹'*P•e±lÅßÞxS—ÑCC’vžCÅ£n™Ú³N ƒµRÝ#Š>&+Ü|A‘ŸÁ^.8eëszäüÞE´»ç¨?¡Hà“›Šø‚­„‰NYå÷¢Ã}ˆ&ë™ˆÃØ¯º<’´ÍÐLëdFwþbYilÕÍ…»«í÷}rö 9¡sŽ”ùÕy‚éo£²uîì·ÈE¯¾n\ÉÃxWdnsÜ'Y][׺=R¤™lÕ©Ùó†}£“«9ÖÖª†a‚tá× H™y6ó9Ú_rÅBƒ­y³¾Âw¾­3ؾ˜6ˆ*A­Qx07‹Ï¥@§=Š(ýN82³jÜôEìfGP4‡Ó¬´ÇaÅ·!=¹«VŸ ww%/2ìÃòôuÝÊ”ýR:^n…Ç4®Š%;[¨G,= RU)ÆUðO³9¯ŽEpÙ)l뻪ÉDkÂàt5—ûʼn²f¼‰ä ‘½‰E¸h^%ÏÏ¿%ÖB¯EkmRûRM}lN_®˜•KÛÈ´·‚ÛL®(eV µõ²Ìžö" Õ¼$"5©.ÃñÕžˆc/zµY”ÃK£3Ñ8*ÃqΞ8…ä :ËæZ¨õäWNA$ÌÑ'àið H®œ.÷Hg$yÉÝ*𣠠9î (ãŽg]Ó`gÆlx4» Å*žÕÞ< !J 9"¦{y›ÓÏóÙko¨v÷Gë·6È¡Q‡Ë™ÚÄ@‰€ Ø7ÇÇ\™©‚RpÎóeåÝdÙcŸáf¬ùmCUÞ°5ˆùÚJbiZˆ´­>²ØÖĽû°YÎÒkuá‰õ…«å©œ®±§£ªkHÂÁúÓh·žXÌ}4¾[N§¼óYþN™ÙLéiN3Ô¹l%þJdhSSþóÔr eïD¾?ÍÞ@¼’FcÙ {ÌHáèY&ˆhÉÙÞØÿs¥p( û­AO 1|óa§ƒ®àõ\–³ÍÈçouŒfQ¼0w*ÌLò‰á“]Ô,ËèOŒ™ ÷j ,$ä¯á65tÜ÷8Ô!rù-ñ3éÜ­iϬ2YƒÖίbŠ_.™D´ãPú_Ÿê/½úNLWÙ,fK!Ú“z9ùÈߪÐJÊÜåŠ8åfIÏhæá_aO>>‰DÌôÊá›ÓOTÌj’™ „MíªP}¾jÄ ôó'vî;CM“·Äº g|‹{óµ Ú\Ä7­I¡,Ý®óUwëvO>¸wIýï[ýX£•Þ5‡”A˜þÈ8sǓʹÿI>‚Õ7z?ÝŒNÿñõ(ôÀ¾°X©\1¢Ì¦¢1+§l”“ö-’KÕu²¸¿e ms£ùeò‰jd<Ù áÒŒ‘U‚û6D£ž0ìTy?arÁÃs‹¸6õ€ G y`fô‹8ùãùò]™†›WñäfoQ]ÌcÜjvý Zt·x Óû„¨}³šK%!(„Nm\š„_b©G½}é®PQê n¼§æSñäwYš†[Þ5+¹Å —ìõª){…†9,9‚ï°a%h–úÄgN¯ÖâGˆ\¶lÔ±ç0±xx¾Ëí]p m†·¯N>½”xdžsïv%®qNw®/nÆç<…]j(sHŸ‘Ð$º"¯w_7û³vvll€Zc3晿·-ÀÛ׬S^íJ¡|­/‚ë‚£¾’mÐ7MuX-©!dìÊ020ô ¾‹3ô‹–gW ù&6æOmo9]ªC &ïØvCÖ[Íš52ÕöP8Ú:y•,އÍX¤Wþ*zè0`k]º«f¸6ò¶¥BÝšwºp›0ô]Øæs§î%úØ¥4^ ™'ÆyT%½Q8ÐÂj¥!ŒÏÍDüöfã¾NBÔš W#ë’b€cJ¯¯ñˆèóÌ!;ô]@2 ¯Ž‚èIs `­ûR”ÊF0¡öÂX9þC7Âtä…´è„:ñQìr©0ŽC»û3u)Û Ÿ 1·½i ‹Môµý>Mo‘3HÊi}¿O]¾6 [ê—ß+”"ACéÌ»”Œ ? ÇZ)‘‘)¿Þk"-]OœTXbÌÊBË¿â-[tÁ/°nÈ7¬GEú!@àäàËu± Ëý‰ÙµUÆü}Œÿpðóöpš0Ϙ¡þ»zf;»4d £çDNôGôd%G†¢8ÙwòÌB Ø<øÉwâ½±álc06/ë%Vv‚K³Qx ­ïU ZÇ ­¾¥ëwiÊñ6¹ô½Þ7µJè]âfcLåRÑc#¯.J;ž÷(Ë™õºä¦ßþ¬íµ•D?“MçoJÑMÄ]ò”…7n†¹¹äë†UŒØ! 7Ǩ|J~*"`,=„`"ÞªÛºãD}XñlÎÑИq1?yºxÏLävkƒfÝ“%…%šÚ«¬‹éâk £OÈ&ô%¾ ¯iq²ã»$êLéwüAþy_&çð*w}Äb„׫ïëtŒRTUŒQ‹ãí©†sG“æó°ÂßV_L“›ð6Â+·u߇¨á;ÙJ|ûYÄëj¡_ôZ"Ò¸rqÝØ³¡}2;Î¥9áC¡¨M£ËmVkh^üAÁ¶” jUH!lvœ?¤‚bhür¯Ð¬Û½žš¥Ã¡³•G ÕÓè“Àà{‡ Á†1—T¬Ø×öŒçz?&sfŠS?äÇÕV¶»0¢ hªvÀ@¥Æ@­%³” WË®¦i Sñà»lrM-»¨ÊÿF$¦öz¸¸¯M5ßM[ë¥*/Ù9ЃZS¾Ÿ%å:e‘º•¹-'¦xÆå#Éë•&|6•ü7"ß<ªõ–ãàV&œx8Œí'?#«GÉ ®”ú*‹\°«gäß 4ê"±>Ôh¦†òC8™‰>c(€D)”ÄK‚ù›`±æ¬ y#6 /“<¿íszé¿?Þïä¤X·êV{\d1ÃVÁ<5 Xh>謎êÊ…þ’¼O-e¤ÁŒK”EŽÚ=² ‘Ûä˜*Nœ˜\âíû€lˆýù!?l6d-óúd²aYí6Ü„„ÃLB¶f¿{8x¶d[c :Å:RWJ,³9WÈd.fÃgâ€þž©_ܧÿƒ¤J¼ †ö׿»ÑŒ"÷Tu”eÔ>žD9G™ÄYP¬hJ 2£Të1GÀv*]^Dëûy?‰5q5Ï'Ú¨Xúµä2²‹mÏv*IÐê»Ý÷Gîîè(B…k”9ûú¡lÒŽmë%CüÚØ¤Â4_qÌ›Bde)*…‡JK o±]lñ Ù¾O=&m’J7¾žÖ6´2ÙTÕÑLøm HÏ'“—Ã"è7Ýž¶nÙ_bDùî¤ç„-.dG” Ä5‚iÃöàƒü€Ì³æ"W¤L–P)ñŠ-£qäËëEŒ® ·WâèJ8yœh•ˆÔrÖ|´^Ì0µ¥ý~.kúuˆÖìŸB )+Å  ×|x}ÍðÒõ¥Wø;Óa²Ô˜AQɽì§’X¯ƒ‘Ç™Ž>ky²LŽ`ÃØ¨ŽÅ”ßnCïu®kCÒ¹4&~\Bõ›|["i3FŠ.ÑAWx C¥5<£†z~eœbÇ ÇUI/$Ó­nš“ðVG)>+‰ˆÜ¼ª ¼D>U(3žANMð´‹›]w>›’ôþ@;iø ú2Qì;6^ø®¯ÈÞÉ¢_‡×¦Ižw‡Ð‰EŠïG—»GW uTµšzÆ/Šé têå¿U?ãN{òf‡®÷\-cGeïP6*{WL¤ñ{ÉÀQo™ $Å\„$­©çbh³´5šs?¬5˜¯ÞsF4¶—›"›¯?žN)Hk³ÓjSóW;ìë3գ؀Ò}ol?4• R˜0ØïØã{qBèïo„>¾:pâK :碔3ÌÙZ`igµÌÕ²÷Ïo&'=”øS‡Q"Ydãs†ðò64À¢œ¯ÐÛ袨|D~¹gs±‡•›ßù*}­.B%Dµ }Œ>böþËTOÔ«4Aºq‚¡ÅBí ê$lsÕ…,mjΕ&ŒÙÜM>Ehw¯5ÓÒ öXMïæGÂ$v—®°mç\o£6l»æƒ¥FâŸÕDQQ÷ƒ‚—{dŒØØD¢÷Bçá´XLÍBæ › $Ûd̶ m†~OGë+h\JQ®”‹Ö•™V°É‘\`ý¾â ù®~%Ñt!¼¦Eh€âϽ8æ–+VÜš1´ý™½¦¿“ÄÅ;ë;â 7æaóôxþ5{¯Þ3[è†È#’–ée¤vELªeN=°Ê†Š~œ'8²ÃqŸ]Ø‚¹»,{ýGŒö1Ë–‘ím:ðì%´¬1+uAFªk/Œ0q’òÍ¿9ëÉÇ¥Ÿ~ìV4’É=ϵKó²[šp’Q^Ì 3¤·lfÈ×R²€fôeÐ^šQèÉœ:\ÞŸïdÄS-ðJ_¨¥Õp¼ïïé‘ß}c…޿翽^Çæ¾ …v"¤E¡¦ƒT|²¿Ç䡆=å1#>Ž)Ì6ßvÆuH5 !~|Ë£-´u³Îdšæ$~^¹e?“bNOݹ˜KÃ@ì&ŸêuO„‘’ÔM——<}þA/U²Û…bjsxØ[ØÜÿ:ÞJh2QFÖ’ù2CN1*-3 i÷Ë«Üw<{*~ÁPçãßÕrÔX¸nh¤YÒç«Ö?ã‰Q‚ mŠf3±”^˵¦á¾ÎJyãXU—5ßófëyä­¤abõ¹¹¾PqSµBï ¦— ߪjú­ˆZ®Gê—÷²á Éèo-â°÷È‘H~XLÖ©jä¶.cTéÞ%Œ»6P ‹Z~¸,Àˆ¬ÂV1b>Ó¨mÁ¶à0=bº,NWOwªÊƒj2 o®oC9ÎÛÇ„L]eê?÷uÓ$y¦\:Dºuáü3¢ïgÜÝKt ù…ÿ¬Ožá Ý6Þ5Ô)¥Î°XBá]öRØü$ˆÇˆ—1ê=9ì™!µ¬sqtN˜šÎhÚ´¯ ¡ ÈðH«_E£ÇC.ż>κl™bðÖoݲŠ‚Ÿhïû’ï”þa<ÏÀ ÂQ† ÏV GLT•:2žm}ç‚ó M¿;oéx§¼ìË÷‹EÒG¸Y'ï3&Sä/Ñ+ ÷zÍo6廚ßO“%Ê“©;Ño>2´ÃnN¹¨>ã}öèBéj€{ çG øöUÔÚ~ü·%† Â}| ºS~8:åéʀȕï̾FÁâÑ1keIÐ蘾MÃ…ó œ-½Ì­éqݳ;P)·‹qÝ0O ê%·y¼û ù¥zŽ \ø: åKØîD_‹ÃU¾šçãÊ¥ uúCäÈ L¿ýrÁš¯½˜kƒŠ«z´q¸F %È×s·Éƒ=å]Öo€Û^êµaIZÛIäµû#%îål£í”ÚåyçûªLç©hÁ¨’Ÿ¶®Ò|7ŸMÂÛE…%vSâÞ' Žñ{ÇÙLÉU~Þñ ôÖ1¾o|ÍV:›ÑäÀµ …WŨ’™gàòTœxÜŽhxOðÖÛ˜}¦Å§·;ÛäµbM@’7á`ÍP¸š@>Í<4Ö’¦ýž7‹:VüÐÌžÞ¯ªo 9-—#f>¾»Ýîó•Ómß^Yr{¥°võ2ë× G#[d ª:æ§bìµ 3R®Øñ QP=%ŒŠè^r%3Óª(ÌY{±˧j`ƉæN2ÝmŸi}¤ “ƒS0ÂO[ou›—2gÛ™0>ÿãæ‘q!+?ï§åä!®Ÿ¢¾Ï|ÐÜsuwR³^ÉÒcK1ÀÁ.\?6ä+\׌·Q„µ¦ª™|YwÆu-:)­‡ qúçÄ^zÎîG ƒËÇE+î#()bë1QÅÛó²JÚÚ~ìÉû®sÆ’ÊžWC0ÛôfôôZŸªÊŠˆšó‰•Ì“ç\ôŽs´%,oÛ/'^´o~qpJN ލ+‘Œæ7ã¿Îú±b·Ëæpõ¥€ ˜;VeÉ¡„ø×ã”Ñró {èã÷LFM|$èk+˜\¦0&晆j{ÌÚ†¥]GØù÷6\Êô—žF¢÷³óI¨ðûÒ¼ããŽd^©Ð/¥³vÉrŸN IS)Œt¦ÑÏæ”‰Ññ&{âÓTõÅ …R%& ¬(š½³&ø"È0¥dÓ<é„ß)Qî~ºn;¬Yë,kØÁÀnEÕþ¸;‰ì÷õü ï„Я&½éjÕUÐ:¦Ä’gJIWðuú¬'ª8]¿}Tf¸Hç 3Ӏܟ1ŸÄ<“r 6'ýôö 惘–‡D*í" ô÷M—†0 é»F9Ö:jžh9ΙP¡U¼8ýÈ;‚¸×.l•¡Íõc» ³äb–”ä.Åù² t-Ñy&¡Î#pÔà'0{ß"ò»ZÖ5‘BmÈŒw§ÞÇ(o,+´ˆ¥1è´#‚õÜ_2-@|ŸÔ¢“ô""ÒJƒd¶kH(.³A)¸˜®"Ý·Qû°Öu*;áqGg^!,èˆbŠ|Êo©ŽÐJ)>×kÔã–ÀÏ{Óù+gi:¨"¨e>?<Õ˜t–†gj›Û›‰/Š»«üÙñÅWÒˆNa(•§¿þ3n'у®ÃÝíî^v8nsÈC]‘ bg#€&ÄÅå¢ÙH-e°'¸ÊžhNÊÜsÓž€ >þØ6d~Ÿ.%ù’þÒ^õކ_I-\èH[Ð.¸fž©=l;¯àzÂ<¦ª°d# “}D½–¹9ØV°\š´Ó|)®Ü<ýŒEÛÔŠ÷¤¸ÍUq“ùÒ¶déNûCßõœthÚ„ø­KT=ü» î¾—ØT¤$ÎŽ@æEœ¬Ýr5¼›) Õ©*çM’ÎQ'EVòÞ9ÓÈ뿟Y=™…ÐÒRTÊmÁ A,›î= dÌF¬Ä]ZoL1Èâ¾:u:¼QªAJbüFb½%ê“Ko–œÿsŠ÷ôZïm¼Kï|@F[7Œ@Ï>w¼ÊÓGóïäJ¹vè±BWR„=¶"ÞŒ³póÑjûš$Žn¢jÁ\°ãâÒ‡Æ$ËE”dµšŠy.RV‹ ÷«}¼?ñ³f!:Öësšî¥êd°‘ãå#$h2qùžÏ4,…¹0¹êVhË#Y¥:žy¼…ïŒþÉìmØ7.B(asb)Þ¦Ec­÷|MÏ”IGpk º”¸aÞ…3,6ŸeúÖoÇS‰åªÊò;ÕXg‡<g52S±gw×=òBËÇ~Ìßj ]u‘–ÓZ“RRWTœ¬G÷¹¬ª¼z&O„ÐÑ÷Š0l}Ÿ ø ý¨Ú)^ÊÿŠ$>ÑZÉ`–ìlŸ÷“O«¯X¨5_`¶Û«1Y|™ U+¯Ž…ã×(LºUåâ—·zÕæY帆(¯¶L>LËgÂ׻߷Ÿ‹mfi“ãäeJ¯-åƒæŠ¬ 8OÖë ¸;ÃÖ°´ì¡ù-¥ŸÏêV‚|†1ö‹àɸSáøÛ­Ú§¦Z£ZdËh+fßT ššI| !Pe£Üp¯_všºì»BsÈäBžîCj£Â F¢“Ú7&•;„d•¯AÑSÌZïé>§¹è]§P`=·UŸ0Biá3Ì1ÖÜ'›T~>?‘ÙšÖŠdÇK¤ØÇcôx!¥iš$L Öã|›'ê …ÁˆdÍѽ¢RI`–¼$ÀÒRRò{ÉS;kÜë6.6A}™±µjš"ßýüH·«ßÊúž¼w´«ñG !¢ëaì×=P£VM3i«›àºü~—ø·Z«Ú»›AÂñåR«¶<ÿpÒrî–µv¡Û6+5R¯¯‚M¶˜#® «™òÅç(âAGí‘HœÆzžùSëå1ÅΚ‰†XzJª!ÍGn WGø *Å!º”p8kE¢L÷8Ô Ñ¯`*QÏp“ff§Ì™;@z8ýÖA@<}ãš‘<¤ÚÂó»ÏhøùÚåjzߨ¯ +Wüå­7ÑgŸ¾¶H”ù-J|æËÀåǯ],rÌ¿¤Ô ⣯!ó-Ç>|´aø±.²O3<¥ÞqÆš“yN8k>æqÔW›»•„R|G#×>6,d!7ëaz¥ÝòB›=çá˜Dø-„¦–j®ÚÞm­%UkÐ}ë(#Lr!§f>dÖä c©½(<ˬû^T³î@÷Aû-Sb_Pu¾MVו?Pê°Ãa”KŠyŸ,èk¸ÚŠò•r*FtÓí篲/1Ù^¶·[×¢ŽC?ü@Æ •­u»µÏÂóÞíÍ¿®ÿRþ¾L¿šÉFrÃtØóŠ16»Â¶¯`肽™¼EI}eöÈ£cÄŸÀ”†3Ì7ÿâ `çs3 ;²ã•ü²º!¬¡yúVæ‚ðOt•²¶-•~¶a†¼töëKFµ|^`}m¨CÌciqᘆË~ÍñùŸ?“Œcù¸¸$cýñŸàÉh2üõQ_¢Ä0Ïòš2½Á[ªÕo!î,ý2£è<Ý ôÿ²rñ-þK½Ôt%]¨EW!-H ‰Ø–ÒÏçÒ4ÅVýýi¤=E6sÚ‘Vndyü{¾9$ø-‚3lò3àUJ=Õ¯3ãw-é™Äl›Á-q]ïúüÛ+ƒ­Ö‡‘:½EÇr-Xüpoó=7¶5Ûæ}JϤ–¢¨”°’ˆÄmSu«{žHƒïÇeö…‰¯t±ë:¦ÓæíMñý·nijáZ¹N˜çx4VYñ#\£/²Õøõ﹜±£Â:ˆ¶ oñR“¸Ìž(ñÓ–=Ôüéz†Hà¶?ËžëÇkÆNŒP1 ž ´Ó–‚$ãÄúƒ¹¯8£×•œS’ÃN']½ý3³Ž7.x… …ÊʲOñîJš±q¦îåí_{w[f”›¦ŸÐš ¦i‹ŸVŒý'±ÅŒe¿ Û·¤Ë ¿ø>½>2èÇ„9Ý–[!0%ï4ï±nŸ'WÓȶsÛÍa¡'Ñ!øÝ—¤ä÷–zYAùEÓç¾RW÷.ƒ­ ‘ÒÉáI¾ê±óÎîýªP4Ÿ¿ÿX„ ð±PcǽZ, áÀA®œQÜpóéÆfÓìÝAU ï¤çç(Ë=&Úíª¼EyýhÑýRú] ³JPÁÃ%;õsw6yé]¾îAÓTì"б«¸ièÉÌ`;8¶çó'ê‹°—ôŸÅdCã«#¦ŠÚϰ¶X+de%Q—£©}²Bd†˜®è4ѹ"Ù#jŽñBÁl©0«²YÍéZλs‡CsWa®9*ïàpÍ«q›Òå,Ñ’UO=áã$%°àš!‘ÐÚKXM»ãÝ 7°)+o¯”(§,ž^”MVDô•—†b˜^lFêhƒ;–€ßFUP-zâºcfÕꌬ×w‘Û5Q•¯O' j$Š´‘öèŽÖϸÞâZèC…V|ó•œç=žTkذ¼å–ãû=¶p#{*ÿ F5—ŸØ×:mÃTõ²8Âô½tÏs?`pHHXB¯œðíèœ-6rÓ§SEÊí¨"¡U’C“´×.I  øbA&_uI !ùpT–©«SâRá^dZýO7•ÙÒêÔ­«Ÿšš>~-[ï´]‹ëôùV>7÷“¥Eø4dPÏAÛ(»ùóGâ¦ÑOVhN¹šÇ!+ÌJVa3’ë¥ùjÝêr! ¦ÑÝïb^8¦4–]ûeF™È/g0iÝâ’TZÆM¼é¹üïÉpÒº›Äâ^í3Œl7Acië?|Ú¿SKÑ—‚‘Ä ª_ñÞó §ò}ÿnF#´KTÛ•1¶4&Â(©–j͉I×xÿ¬å.ñHŸ §V:®¡¾a õ7ž-@ßÏÜaEíï±Ëâã8Üê'*ÂU=ÞJ÷õŽ["¬$£/¿æ~¦xÔÚ.ºLfJ‡zÇ:Íx¾<«Õ u-ƒ¿Ñ…Qί¡¶µ%ø¬s‰Y|ï_¾šgI¼\¿ÄuGI³8NKð|‰mt1h”Œà‚¬= (Xé KäJ}ê£p…÷ò9)y%´@0vÖ|‡.(±V#$I^Ô©:kÁ4ØÂ¥rå eÔ…ã׿3S^ÙnsœGéL‰i¡Ü´žµç”µV‚ag‘<«Z’Þ†Ìý ^6ÀCÊÍ{A³ÕRﻜ©þ­õ°YÚ».ˆŠÕ[ k<É+ìÞ =>V Ã1iò-öU@@e—o̦Ýkƒ-‚QD‘ùié3Ñ!bd\'öª´hÀz÷¢Gtëù&È£>w¦_…G +™‚œê™‚Má}²ãlØ,Gæâ±ÖaÍpãõ7×Ú¥â t9‰iÃð*þ¡·Eü¨»N9ÑlG°V®¯ãçsklѵ÷[c¡ áÛñ¢m5¦«gÂÑoœ±áå.äp]«(Æ£"ø‚g>b~qUa]þ‘°“}‚"©nDšmļHOb¥ù50¼îe#ß>ÏÔ+£^F[&&€ìê!목®¬b«*ÿObéÎ6ÉÞVõÛ¨O­µœhB‡obÐ{å0y}59øIXz+@^OÞ¾U E›þ~ðCWo›Ñe<æFzcW©Þh¡á=ô&Å~.K_¯¯_;ðIH3&/ù* ×÷K9sÃ8ÈŒ@• bWFHZMå88†*~›)ÄJÄ‚Ü jèÆ?”Oó4ñXh×|B¿ n2t\}Tª¢ ˜Á¬aþÂópÅn¼DNÍ©˜çÚ'<) â¦é &Ýl£„±ÐQaaê C䀭 ÁffUtôr9RI`ïýÀ÷W*x;ÔØŽ%=WµÊý‰`†mÃòuÎµÃØÚø‰J@̯%&JÐ+GL9»¡ÊÝȧ¦–Œ›FÆ’†"×O$¸•ªú/­T¬ú=ƒŽ=ÊìAÝ ¿ˆ—c‹E”ÕPª±«<Ó_9ßmÔ䎯’*ÆÒ"a3w»áõËçoQ×1qüqã>y —·sD9ßòФÖE—Ö8Ó`þäçïgcé3îMCÒ•níÎâ6F¯L¨xì6yÐY“(Y¸Lhü¬ClïVù‘#Û‚0Ýxp·!bQ1,òÁš s9`=A줧¡®ê[Ô¬(o¬¿zµ½Æ-½'™E*_—þœ’¬nlqçñõ+ŠÅοNÏwÞ|+8êDïê¥ið™SÑÙLdælØ¿eL–¼æPobsÉ(Áí†CicùµÞï(E'ÄK„Ƙ˜ãa›ü/aÏúÑÌfB»=[äëÛ™•SrdÄÐнPÔt,Ð$Ôê>TœA9' µr# Oh svO”D•}GîG©×Í óêÍ_Hq¦«áeË´åB7HÕ€»'·"ˆöÝçеÌwÀ?žŽÞ:ÆµÕÆÃDé=g 䌯ü<±§çÚžcLá³…‹äç#zö랟Z††¡¨¸Çú¤8pmRfHe‘šdˆ,êÍêqŒ‡Jì|½üµO†""’[Ͱ®” <Ž|ñŠÏr‹~×eoÒÃÌÙ$JÄ `§EÛ7>[æ\•ó O09ØYão$Ç)}òô­7y±˜í“Ö¡VTŠÙ-{ñ—Õî%n]¼´p˜2 àö˜)u4>\CÝì1Í$„gBðB º¯øÅ0Þ¿ÞÕ"„g-™o÷À£¨(  ‡ŸzôÈTRYFX]a”Zòïý–J¸î^b¼ êT•…ÀãËÍÚ×b–ê¯ U9}µÎjF}Ø:¼×‚¦¡O–‡|:ewœêšht†Œ’J­›Å†7Ï]Ö×\-õØ,K†D‰¼hý1f¤K“æuf‚{¦ 9ïõ·$S³æõ­Xò$šÝžÕeZqœ¹ö¥!³B>¶+þæ E§â7žÏ gÆS¤a¯‡aê„’3V¡cË—‘M%ÕNЇك°´ÖxU™¯O@|•ñ­¨OWì#eßæñP´aHR³)îòŠGÄïòÆ¿[˜>†o«§ïÃI-¨ßŠ=+ý¬á”J–™þ^”ûŒ¡·¢’ìþãý»€L³"OÅçä7|nã‰RC $P°œ2ßxöûT) BuM²’'¯µ¯ë¸úNÒE!½k~¿R¿‹Êã·}›ƒHã7èônì+ È`Äȱ֞Kà€E/B3˸ù™ ¦9œÄÐ]Q-ÖatjúX\»âtÐ;r#c{<}Œ½"îBa Ÿ-dƒ®Ó4êjÿ`²jÜñ‹þJ1z¯õdE ú¸ KpŒœN°~=Dé²îçÛ~A y:”¬5Kª‡íìî`K\ÀaLλ$ç$Ӻť¡]»’<»Àåü3o,2YPàR^ÚÄö«üMšÕÎ.ЫףéñçýkñÏháÕ¥`õj »ž”%c7eô YýžTU#O6‹ÄÃj&C˜[‚Ûkž¤6Ý›·³™‹™­»®‘lØ7P ÆJ‡RÇ_t?+oÄ\°›¤ê‹Ú8SòöÛJeæ¥çÒl¡a‡]Ê&NfåœÎFh¨Ú™î°œŽµ3—+QÒÒ ^ƒ"½e!}—{5Zf¯ì!“2pZ_ðŽ 6w‹¹fÏ)î:ãµ{{ߥìõ×RÛÒÀU„ÁøŽQúõ^$3zêúï3 htuи%X̴ׇ™›ë†±ìÊΓƒáÛó³šãîb¥¤R,ТëÆ1þ>ÒQn0ç­ã}A8͸+îA/ÄÄ,bp¿ôêê{OÙ;âaÉWꬋ`»ñ‚E*N’ïaU¨Ô^Nø†qo)™R©"2î@«Tï'”´Ÿý]\I©.gÌ).ÞNv¸ca;£MJ,IýNñ½®y„Åì²2›/_(÷ (dÆ °©ÄXúÏ Ÿ:³¸ý·U䙦˜4YX¦sÊðøéâÒ?jÏ8:DãëŽr0ñ³òÎeBý™µWÌÏú¯1Љ×Èýgu–È·þð’‰ÊˆVFfÖ£¯Í1e#ðó¸¥äS‹ ’}ï.ÜÐigL£åÓA|ֹϱ6­=Õ!™á^oÇh/á%óàÉZ¶« Clèq޵IÙùõxVû’>B¨>t;ʼnžŸE³‚Âý¹úÃ&*Áù@© Nĭ³ úF¼3™^ 'ùËI`a}†ž3 1EQ­ÎndN+b}Í)[¹„å\‡ôâ6Æ´»ÅQµþžø“^ÿÒùšQ(É@3œû Ì®" ýï ß¶‰ÉÒš/xP¤3›î¿U¹ÍnÔƒý†{“†•E”'yU‘FÊ2F„›;~ žw2—¦š(;@ΪÿÉvÿs´›Ðfø£š³c8éÌ, ù9kña#10¹¯tÞ²IMn(©m}Ï­»¿+ ÉD#¨Ø£{ê>ÝŸ«&éÿÇ”@BhOTûò‰Ž¿Èè1äêî,²Éºô†ßf®š‹v>:ò³×Cº! ý#l¤8¦ µ´uŠó.è[‘Ï—cÇÖzªÿŽ8u •ꤢ›ñÊÚh£°²aiÕšk‚—ÌžN±<;j{iT´å'Ä„>ö(¦7ZdRóª¤ÏFU½d<‡Ý”Ê+±.0á‹&¯õÉM’àùÅ\ï¿°/†œDQ¬™ž”ñõ”Ub9QÈ©ˆÑÀk•ÄZ›i§Ø-JhŸºp©A¤²±‚ƒ‚ýšcu›_ÜÐ"‚}ޱÅÖõâTN ’ócKÄE½·[4+cØ”%—|M>‚tM{ÉRœT6iRø*®eIP§lJg'@uˆÅäÙ9g{gC¨ÖÕ;7ç¢]º=Ó7dÌ;ü]8Ì! ñC‚¡Rmä—1i(ðíÝ)âëQòÒâs<7 —ÃðÃ1íá~ú.K‘•™ ¾Ò/°#z³’Dv,±*tBHKÜç[ëÙÖ "X¶g/á7ÎZÍÑ4 éÊ®ëÈG\ÑïZß”“Ù„k“Üýš!º‚u0ö"‘ê­<ß$†cT,ä*y”XÆmól}òxë–So"ºv&ÿõéç¶jißlUzSL\hE{ªÂí£}ÚÄ#ÅkØ:uçã ýN§©Dó>|’k>;â©0<÷ZÚ»ŒíÉh—(ÚJƒåû[JÐŃm£ ßi›‰˜ã•ª¨~¥Qq©ÿŒOP%¢¡–§iÆ@k³¨¹£<%o«…)1«ìîÒ[jÔ¢@CØ8(äĉÔô1[Õ.„Í™»6¨MòËDYôü$éop†…ƒ)r¸ö?¸Ã|€lŠ ª¸$ï´¼¿¡í’ózZÀš¶²/о‰hS,¶¥ ý¥ÇBˆr¶/  a•78;,+ÄF¸u€’~ýÉoW¨:gø(OKemŒÈÀx ÷sˆC>EÂi9ØðDh­ÑàÙZ¾;C‚_ëÑ^¸Õ6ÓBÕÍC+Äh“ â.ËwÔ«н]Y^:*“_(tÊGEÈ‘ÿ·Ÿ,¶pï”HhÖÕ’õP6ä”$‡æG­#Ú¬±ØL`iÌä™Í‚ÎÍC}´=ÿPAŒÝZÕLËTdß#/=t›L›9æÒ$P”á#w¸¸w,BÇÂê —:jGBÃ0zг@xÿûRÊ?dë˜øüò^˸fóŠâ*]ÃV‹Á Àÿ˜K‘³]_d™Í‰q Û¨üP±‹y2ѽ/ÆÚGk_‚ „` áÊ ³ÀJò‡ç½lë ƒÒÅ*L5ÓÑx³­©KN÷Ñ\S…‰…ëÒ·àæ‹X`J&&Ìûƈ1PTGúz#”qÄ‚ 'ÚÙª;ê‘ó%fÞ£#|¼§r;ð«·¬™ç¥X×qXqþÀF?@Öã€hT„ËìÚE¬©ÍgùÙ}GÍredµ¸Äþ“¬¤(Å‹‡m aø>°%q£wô‘©r&¦½P4¶ˆê˜\ùReoÉ){-ª¿Ku.àÖ‹È7 âªÂZ¢“±tà25Cë`ÄÉ•p1ƒkzŒXa&01ê¯bƒ±ïcebŸñ‰ë&ØøWñŒP§Õ¿m£ ˆ"s N^z·‘õÝ3HZY.—¶z¯ãÅÔX‚Th”`øè Öû«—‚øxƒØ‹Þ‹3é›ò¼íA/òŠŽÍ²k´õÌݨÌkBŒ˜Fç `|˜|±×‹û÷LÈoõ˜Ó܇[ÄŸÄœvõ³i0i‡nƒj` ¾T#JIгh>](í$ÊôÝþ±…»gz¹$w™}VG-¨i®œÂ?”fçHÍ<±RÂýyá;YSI2–¼}7ưðú\wЗš¿€qvGêz>h¦•àeâÝ2SÙ"z¸ˆåC’ñµ¶B šN7óèÎýEE.ì?¶=Îl‚TÍÍfgGûb«ôM¶R7_¥*ß‘ªÌ]ŸUNT•ŠIñÉzULâ`‡SË)ÂÓ±r%¾ÒNh×¾ÕW)Ň—¼ÍÄìÂÙ€ê”ø^#xåxÛ}°ÿ?br'_têÒÏ|ðÞ1Ö?Ì÷–¹E÷\üù…øÕ¿´,U+}Åï!ÔÏQ™ÌbA õuÂòÕÀvÐ>wœ*ÃÒ/±Àd>áßU½Fnœ„Z ú3J„jæÉ&‘< ðeϦ¦ÉlxºúµÔÓæ>³Ïþ«Ý9¸rž¾ø€sEî±J"òª°¾}vÏìùç²·„—š?´¯§c(D9Š}¢¹ûûDª!2„®“´˜çã]B%Æ §u×¹_±aêžBßÛ¢Óƒ ½Ý¬²ÔÒig¿§hÃú&óÄ@òÉk°ðh±ʱ›Ì“=UÝB:4ð;µ©¶õù¸+Ë-MÖº wD Ðäí -" ¨™æLæÑ¼•¸ZêEì»{78Ç ,F¶×,zX¨mó‰T&ññ³p F´!§Õ4œïéV8ºÉsÊXu݃d¸l—VlùKBÏÁ]ù‡¨ˆ¾c®ÆÚÛdlÀ$ᆠ;õ}Œð4Å Üo¾){€À%€Oë€TÐÕ{ù^vIt'#K[³) ¾êe¦õÜZ'¡šûé3ã@if¼SÞ}Eä¡ãr¹3  ôœhŒzšUhÖãËØ£Œ÷Ö KRŠøA& [@,×oɾ÷§Bì<\pï˜$£ˆ"îQÐþ]Æy2!»Tç×%Q¬ÍÑ«''ñfå&ëõËåT¶ºœJJ¸YâãÎqAþ¿¶¡îN=?^±bûÊð,ˆ+¹I`à©\\7ë„OX‚&}Åü¼‚³Ž$ô_-#ïákQ<•Ѐ ‰Ç;üpG„z{¯æ?ŒâVKNU[•¦¨p|/³óY BANpC5$&-JåN¼Ï¶SGýg6Ȧ?ŒKmÿÿ`ÝopÎæÕÔW_àøSѶd6â†øŽ›ÙìuèX(󴉳 _Áìp{ŒƒO?ÃW”ê›uù°RÚ"9Ó¸þrCrYI®LW<vö•ÜGóqÇ4˜ ·H_ŽÛÔúHÉ}×®© °b3Gh™¤þÜ "RlrêO‘ÜFÔUÔ€¿ônæÜT‡¯¡5ñ€*ÁÇŒ’&@\×WÈ‘Ñþ7CiÓ˜HØw Éæ¼‰ –ïZNè_9ü¥ÊÍé¬ËPŸ§Ü³Dz’;py endstream endobj 5157 0 obj << /Length1 1904 /Length2 6605 /Length3 0 /Length 7754 /Filter /FlateDecode >> stream xÚ´TÜ÷ˆAIK‰.KÇÒ„´¤ÀÂîÂ"ìÂH)Hwwƒˆ"%Ò-!ÝH( Ý!©â»ú„>¿ÿÿœ÷={Îî~fæÎýν3—ƒEÏ_‚´…ª!~!A@YÇÈHH ((" ((LÌÁaÇ8Aÿ±s܇¢Ðp$ôG„2 Æàl*` .P‰hbB"!qHP ,((õO ¨€Ýà€Ž@‰€¢‰9”‘.(¸½·Ï?Üv<!)) ¾_ËŠÎPÜŒè€1PgÜŽv`'€!ÒÅxü'·ŒãÝÝÝÀÎh$Ê^އàÇ8  h(Ê ü,pì ý»4b€‘ý—à øƒQPÎà·ƒ"и%XŠàvÞÕèº@kÿÀøûpBBÿ¦û{õÏDpįÅ`;;¤³ áGØ`p'(@WM[óÃ# ?ÁNh$n=Ø wÛâ~IÔõ`\…ׇ¶CÁ]0h4ÜégÀŸipÇ¬Š€(#¡ šø§>8 j‡;wàß—ûtGxýC08ûYë4FÀ]±Ð»*ÇàLÄ¿möP @LPPPRDu@Ù9n`äáýåúiÆÕàãå‚tÀpe@}à0(î‡Ø vƒ0(,ÔÇëOljXHÛa¶P{8‚øwvœ û‹q÷‚?XâÚO øóó￸ƒ N¿Ã]1ÐT__WCýÎß%ÿëTRB>xñ ø…EDb¢q)1€Ï³èá«ü½ò.†Hý%wJÿvû»¸ÿÀsÝCâú àþÝæ–‚b‚v¸/¡ÿçfÿµäÿ¯Çfù¿¶ùÿ*RÃ:9ýòsÿðÿñƒáNGàú‹ÁÍ€7 ˆÿ 5þ5¸:Pëü¿Þ»0nöNÿ$­…èÁ1v¿zã/³ñÏ9s‚# zH4üçËàün¸ìâ^4®%¹ ¸Ùù;$äç ‹‰À(؃X×IÂbb/!Ü4B ~51(€@bpK¸ê|0$Šøç•Š‹€Š?M‘¨ü›$@•IBÔþM¸HIRÔûM" áo~.§é¿$…ËþM8Ÿío’íþ¥Ÿg„üB ô·ÒŸäŠÅµÏïaöâ4Ùÿ8Q îà ®TÇ?§òሓùçF8οQ§ñâ”!ÿ@œ*—?'õâd ÿ@œ Ì¿ˆ Æý]5®'€÷?³ã„bÿ@œP·?'Ôý7 ãV?úqé=þ@œPÏ_øŸv³Ã¢P¸7÷׋€ëÅø×…>‚ÚOO í¤+¿–+2¹ó¯ ‹’½;;ºf²¬ÊඦÿTYæôP$?|J±u|5ütžjKøÅš‡¦7Z}òN ݘ®l¼ ³]âó¦’ý¶…ÖÆ ¯jµ´˜Ûˆ ö7öj ºÝÆxèø\÷WÞgl¨ËpÖ–~)qØ»ÊU½-@J0~•^RR„”  I1£©TéµâØxó]vôÂàN<³ÚÆijgŸ°Øâ»E|øð…T¦ÍM2­£ŒM¹”õ6qF-›aÀÇr›*ýY ÷Ó£Æ?n[t¿^L(#Ìè f««Ëà‡ªÝ©XÖzU,¼4*dd°-Àko»"@þA[éZiý"J¸úZŒw£Œ¿jÈðc%ûÒ“y63´BÎ]/Ó–}®[ƒ“ÆÃÜ<">B~Ôbw ÞÛÝçÇííæ•_‰X8ø6åý-×E!SSýMõR/ù!îÍ;8>`kí]È9›ã}´xÙÖ,E¶w;ÚôK^ÞL.М·|û¹i¥åØi  eØ#zµÁ›ÛœÄ̉§®*(VÞ]wÙk™°2¡ÏîmóJ‰)ú쵇³¼gÈÃ12õ"êÐÖ´LwÑØûï}^¡ú¬gkƒ¬ŠÇ8jKÈêæ9ê00–àJâ;i’g8'µN2?áJ¯+»>b÷‰†h­Yç`µêûQá}ÔñÌ öÚ£v¶”…Ö‡©˜›ˆ3 Uã«íwTé&ý}áY­øŽÂÝÏÈ/od—˜õQãœsRµRá"xC bKÍ—’÷±Lú‘ë»äãošù”÷ˆÄî·îð«/³VËЖž†è&Oß¹t.æøYÞîZQìL|²—Ì×לÙãüÒ{öºsu§I)E­F¹}³-—#ÙMóýik½,ïWHÆ p8KþT†…«%ó]ÑÞÔêŽÌkÕ¾²|¿Iƒì„»ÍnO£×› Kü+¸Ž=zM4Y+Ðse3àj†lñ¶Y6´ÊJ"9`ŠeŸc6]9éÀAë(Iþm8¾Š¬†y] ŸÁÒ7ªÛ鳄5›axo‹t.QJ§¶¨ N -Ë@âÄ7ÁŸQøs}oÙ ³r/ DOçs…GwßôŒßÎno°ø ΰAhBT¦`=åØë²¹¼r¯3ª¦æ™Lˆ‘9ƒÖ¸âƒ¯“±¸”÷¾ÁØÇTþÖPަz­ƒìD¯ þun¤”²$gYšq&q¹£GfãNê°ëä‡ç ŠÑõ%í DˆÇ¬\@øªËMõ!|¶Ä>U&gU×èµmUóLáz‚ƒöƤ_ÇÚÎCg?üå6$ØLªÊÌÃW®B¸Ÿxx×Dñª»æ@^o¡i ¡f8ÁGÜ@½ÞÏ;æ‡øúR[ˆ×üÍ+'R ì°’ã7£Ø¦ËvKeéÅ:Îf}Íן-º¿ìß#3–Tyìç\SèÞN­,–ÍÕEQeg5¿v%Ó§ôœ#×[¬9î±5Kݯx½t|¼ëõÀ(s_µõAHQÓèVlbdòÝ¢õ 3*,ßdõ± ŽŽµKÁ°ŠQfWÃKjkV¼–)Jöî«®òwÞ§—)ÓLÚh×ÊE!dÄbë‚bIÏ^Üy¾Â®Ã¡ý¸×ʃÎ2ÉòFàÞÉ;m‡„i¾³à𲱯/»¬ùÇ:²åævYûè”øÏW×tŠŠ¬.½/(ÌÐÍå†è6ã$oåù¼?lú¬ÇrçaBd-éÚ~ûlãÃæ»Q{˲n‘Ó«ŠºW¹"Ìmj:/ï¥}wQÿ´Fï,uMÁ½Y¸»‹[§cÍõ„ vÓƒ©”BüVWör¬OùJš¤½˜VF=ÁüœÄå¸^Ï"w†øp¢pÔÕ“ì †hl|}Nr[/J-þá’*´GDG4,ðe×è~:´áå’rêsª4¬*q+,Ã9?ɾw'“•©ZIœÜˆ´É¼[ ’ûGƒÞ'Lô–*û+³Î§ÕÕ§ñÆ¿;²D&NXµA«|Нœo™ƒJ"™Ë×[«Ìïûìò\õà’¼eec4ŸaëIÝQüÀdÕù½½ZùÅ÷Þ–¶iÚ MQjÂSõ€\†6°“¼³A‘ÚG•;C~tVLœI3Mß!¡¯QE|²ÛG¦©éŽÓÓša>+üågˆ+±oè@’vw‚Û_›Þ[Éëú™O¢²«)Ô¿¹ø%©þhüîä¦[EÅu[í9sšëzŠò§dæ.¯>YIkñEìÑ!ŸN)eÓÚ¼Ç!½wAS÷•‹{+ ê³¼±iÝrœvåú±ùÌv¼±¾I—Khµìj²¦ßQŽüîúãà©éëý,ö׉kÀƒq´¥-]ND Hfof ¹iP³¯v%cZˆ³ƒ\ÝÕós¿E3ÔëhNµŸ.mQÿK´ÛlÃò¤¦K‡øƸlI4y!õSÂʰµhÅ:!0®D† »jÁo¿ÇÓ˜N{Ñ&˜Êðœ`xhná œ;ñêÉp™M†ø°ú«½º"1¯†WXIçù®;Õ[M÷½àJæTá`ˆ×M¤¾óåÞî̳+ÝCþø¨çLÞjn³Sóú¼PëŒlû‘’-ªøç.9ŽÓ%XÒrz‚'Ë=ˆ¶EžBGt$ñg×®(ïZ3x3mkó»Èç’FfÁ%Jî{’Ú¬S‚/‰¡Òd#±äÆ(ÅÕÐÃGA—8_M·½kµž¡fÎn „PÖìCn|mÄn7úÆ|¼ß!«i¼Ûå–^ z4Ò)ïâ?fh"·í¼"L¯(·Ü|dz}3„ã ¼)ÅØlêÌ#Û¨Z¦IV«’üàÚ¸èe=¿= ¢'t!tj/P–䥛{$l\Rm£OÐ’þÂôR6=UJ¿Ž.¼^Ûþµ¼˜ÎGÑ Ö÷eB 6‡©¥Ñ^újR’»#Ël…Ý“î6†»oÞ‹.ça¡.ž³ieoö^M. ]5o©—ó<ïx½_¿Aù¦©q^÷yrjgÖÝÙ¢äQXýLtruÿ¸{<ÓìÁÜ.rc>Z\H8ꥭoZ·Š>/u£S¥o'æyr,d.•ò>üöéEéîíê´(³¬ºÂ™>ò9[†}_}»JýæñkÂÏæÜ܃ô󜞪J+’H÷ûþ¨Þ튋ÍvÁqßÃÓò#þ¸T"utxSÂ^–ßdL[9WRZj9E'_Ðy½¤ßÄP¸ve±qïéÓâë¡öt¥ÂÖÆ%ïríþ6xã!…oïŠ5v~º§¡(Øql§¡¢À*˜%…’œçýøÑmÿâö ¾Xsé¼/ºåRs¬9UíqNùîTb–º¤q‰Kå­pd´‚¯Ûg¢Êô)’ìØ=^w^Ìì|0Ðh,.@™<Ôå~a‡:ùš>ÔX5T;©ÿj!â#Zd{×3Ò1‘p¸–úÄ56|°E(sÅ®6hñe”ˆ7|ádàµDÝ6¢DÒù^›"s‡r cõe”¼dô™„S/Å7ë[‘Å»B‘/]£SÉØ \†žmK©ôdx½}숬ûº)çú´Ç«Âœ¨P}}F¹Â*6‹êA –Š TäøJÊæ:ú¸(lNY{àÔCK½³1;;ÃT’ñº‘à×öÊܼ‡=ŠúRy†#ª F$½ öÔDo+NBe·š|'“z1ïO¬­^±%TW´)ÏHÙJv¤¸.T$8bæÙoûƒÜ"Û-ª£µ,7ŠB”·ÇZ —õ³RÏŒ}¨ÝΨ"¾÷¼fçÊóçg\ÕÌ`!Á{hÖFvÀC>õÊSï<œÖ]“x Â—§H“Às"œèîN YíÛçM|.è]cpÖ}-Ã¥6…—cMÙЙܧ#uCÍ@{üP± ö,Nó‘±y²ÎÓoýê¼JÔ°¸ Ûzž¢4hè“ÂGåÁ+½Pö©TÔ­tÀë&QêÚ„£È¬Ôëï›cä!·WÖz l¿]½Y¯øpÅæ†E€ò   ,½òód ¨s= $j%‚xÔûT‹Ò{:^ÔvdT!ŸãQ™¯‰à2ÏË¥¯ ä c”Ò÷È9¿‡`æ‘£Fg¬¾|vI™'̽Ñ=NzK{ÝLêËÌÚH§_øY™?¦–æKqŽ6öQͽVR—Ë&6< íý€’.›~93ÿ›åûFøïi`œh2U ¥Ë6üìäM4OËlgª¬’¢§¯ä+µ"èV<94€OûÏ¡s²íÇúǃvlµ*µÝŸXb?użÙOÙZmsçt>„Øìñgðé›Ñ$ðau–ÚIõ‹-ˆ˜r  «"ñS.jÅ+Œö•W÷]^š«<úÁ=(¶¯pËà€ÓrNˆÛrõÈ”‘4~9×ì¯îp>çÌ®ëVuqGh³4gzMëäS Ÿvø ÃÜŒS{Œl¨ûÃTÍòä¨ô—¥õZžƒkôs’­/¿Ëa±Ÿ-\ó{¥K!ˆKëŸMŒØqãnÒòÁò ®-ã…Ä4]]ïó——’̵,KÙ®Ó¨+æLhϟн]›>4O{dW;™Îܺ"»ß°J£šTF„ægè—Ë! Ž Ø'”œ²|ÿÍ”½j°È|›Z¹yùà™Ê¨ÜóÎŒïøï•$Ã*öÊ•ÚäXôätÛØ²£Få<ŸY„ö¼%àKî„òÇU¾¡í™IôL¿ i1»Áª‰?Ä¡êôúÎ:nDd ã‰<ÂŒ$øö͸ëîÍJ³ÒŒ®|lpŽKÕ¨2Mm™­FYšÜEçÎ3ÁÆb»>Jú¹Ø‰;.¿iÐp=äò.¢¶N o‘¬ø1§cgŒr¯-}v[W.³™³ùš^–rNðÍ)ƒº3é³ÈíÌ>ˆoJšîEçœA9«;%…k»ÝÛ#¶f*ÌýûbŽ[Dßn´:Yr6œ¤ñ)·i‹…)s»_6¹ %¶]S¯»¶Rw_cÅeŠÞ R2|¾eN?b;Ô¥Ñ×$ ö \ïuM›Œ ãü—ˆ´Î^’´sQEvD±ǼöÛçïfúŸèi˜|ºì¯ÏWv ¸¶ÆOìݨ·˼‘ú°ì˜?Jé¦ÁcR@¶0ó“|E”€ÇÈçsdž0z÷Šcå—m޼ޖ mžÃç 1ªMÃOvÞD¹í'$!ÝÊ_™ô[£å]ߦîˆí5ö•b‹Ëî2mLÙHÑÑÞZt;éåzUBáDé!\à*D5·QºÍ å½3wQ²T+ —ÌUmZz|CZ“xõ)¥‰±1ûàhWAt$‰ÖËŽÀˆ¤´’·kžƒ¤¬kÈ6¨n¹Ü'QˆÈÕÑó'¶÷IîuÕ¦Mï–¯JÇHÅc Þ蔬¼¹èÙ<ü¶¾Ky’Å*ê°-µ %<œóÌB;ì:.kûwùÇ ç’÷NÑÜ)ºæøœX¹TB) ]ö;c¨ ö² j½?*О9£•;ìo%ä¬~²\ýä¸0éüÚÊ”%ˆ¯‹õ¨Låþ«ÆŠ…ú¦±É/Xe‰’Ü¡R‚‘§†ÊS{=F}vëøWëZ‘™ãÅ[׸- ï«][rs–y>‘§ßÙxù‰%Aì­G@kþâÀ²Ì„•1§+T\qæÖ}TÖèmlÜ2Î2³9Ô‚^!6~¥ÚO¤ÍCYJy¾ÛB€¡MšnÁø¼PL»ƒi|u3DøF¤ÜjIZðzu4ýÍ»R9;å/“—H3+òÙif5ðWù>|Y˜ yÙ-ìqff²°¬Ü‰Ç‹3+Ž1âè䃦6ËLÓEÌòSYŽ3èù EkÖ[[GÙî]Å–’%Vg«´Ìbï Œ\Ü#Ë ]…eXn—‚r×Í\ŒIw<{ϨðG¥­ 9*Ý^™t<àkC$¥] UaNeΞÃúM–,¥å1²›õû~æsIʦaï¯Ñžª_á¿å½õYͤUoç]܊çÓàÔp°ÄxÀyåÒX†ùj%‡;Ó ‚γè½5#K¨·ÒîÖôTtIÅÇHÙYZtÊdš™³XoÍÙß°!´ƒuan»SÂ¥ûÔÙëBŒ ½~™îT¡òî#ôxÍ÷Rüo§Ða•ŽMHÂ.;¼ç> stream xÚŒ·P\k³.Œw!Ø@€àî’àîî0Àƒ»CðA‚;ÁÝ]ƒînÁÝÝî콿³“ïüÕ½5UÌ<­O÷Ûý®%™¢ ƒ‰­HÜÖÆ‰…‘™ "§ªÊ`ffcdffE¦¤T;Yþ#F¦T98‚mmxÿ0q 2Q ÄNÎÖ íl`a°pò²pñ23X™™yþÇÐÖ t›äÒ¶6 GdJ[;w°™¹$ÍÿüPÓXxx¸èÿvYƒÀÆ@€ÐÉd Éh ´¨ØƒANîÿ‚šßÜÉÉŽ—‰ÉÕÕ•híÈhë`ö†à v2(ƒA. À_äÖ *cD¦¨šƒÿ‘«Øš:¹@ˆÀ l ²q„x8Û˜€ä)Y€‚ÈæcÙ èÿé €…‘åßpÿñþ+Øæog ±±­µÐÆlc0[ ⲌNnNô É_†@+G[ˆ?жA þfˆ )€ÿSž£±ØÎÉ‘ÑlõW‰L…tYÌÆDÄÖÚdãäˆü?Q°ÈÒvw¦NÖÒÆÖÕÆó?ÀlcbúW&ÎvLj6`{g”èL "äß23€ƒ™™™›²€ÜŒÍ™þ ¯ênú[ù·R·§­ÀRÈl ‚|!{:]@'g·çŸŠÿFÈ,,°±Àd¶Aþ"™þƒ!‡ïvè0CfÀü×çß_zñ2±µ±rÿmþ÷ù2© ÉH*ÈÒýSñ¿:aa[7€''€• ÀÁÎ àäáxÿwE ø?$˜{JÙ˜Úxþá iÒÿðuùÏñSÿg5hÿKÞ2³ õï×eæ`6†üaùô¿]þÿæû¯(ÿ·ÿ߄ĭ¬þVSÿ­ÿÿ¨Ö`+÷ÿ@FÖÙ 2þr¶%°ùߦ VVdv¶þßZ)' d „l̬þm#ØQì2Q;›ÿ=ÿˆÕþZ1+° HÑÖü×``afþ_:È^[Bî GÈ<þ­AÖæ¿3ŠÙÛšüµ_¬œ ƒÐ™2F¬OÈ"š€Üþž`£­Ä©Î`jë€ü×rr˜„þýƒ8L¿€Iä7â0‰þF<&±3€Iü7b0IüF¬&É߈ À$õ±˜¤#™ßÂEö7‚p‘û \ä#…7„‹âoá¢ôA¸(ÿF.*¿„‹êoá¢öA¸¨ÿF.¿„‹æoá¢õ/âpÑþ ~ÀÄhmÙ¤¿îÂm ,€ŽÆ`°1ØÁØÙú_9dg!rÈX‚-CBý‹XX!¾F@‡ßjHíF@cKä±fêô[Îö¯üŸåüW!oü/â€D7¶µ‚Læ¿ Êdò„$ý‰¿½3dƒÿ-’2{V@ë?| …˜þα0»üÂñ—ÚÖÙሉÙï$½Ù_WП&ÂÍ· rtæîvæ ?‰Cdà? ä<-þ€ƒ±üB ÿ]'¤f«¿Vð·Ò¦?*büNÅÉdãlmô× iöÈÏdû›#$ä…à5¤.»ßjHH;ÈCÙæ¿Îå?Òÿ>56{ÈA¾˜rþ-Ûþ>-vHí¬œÿ¨òÞÂdÿ»Î¿3Èñï»è· ¤µtšRÝïìÌŽV@Gó? ‰Ó€\÷LNæ ?ÎR™“«íο'ÿï—Gc[‡?Û9—? ¤}® >$¨Û’Õýi­ÇoÎH ‡ü×Ujììé­ÓßÏ:È=û?øï÷È dŒ*Oç¨S%3qä1‚<«jŬ“Æ¢Êì¡Î䟠 w+Wd7=—Üf¬°W9T÷íX¶<¦ `¥V»Ú®Þ•qwk¥)0"žÅ×AqØEÝá5la(çb$^ǽâÏeÉ}î\›Ù­QéÊï·TÛB[‚Æ`Æ<ýÒ˜Nöz›Iƒ™Þv|Š’ \È(XêuþýPmš­;’*yß퀟–U.Í+~4£”:ÀÌÕ*'cÿÂÑyœf†.¬ØZ9 £¾Öy%6¶3æ vwit³ëtK ƒ ™ÔÏ{õƒ^÷'óËÊÝ&婼ÅdzÕY!4å€ð=ÁO^…2Šw˜ìBL!˜ç¾U ë#éñéG)ÇØú‰Ë¸Ú›R <93½™Š>8qàÀØ©S­_¤%è rUØ/%dŸM`¿™ ¯ùºÑ{Òß,âe§ˆKÚˆµ‘4¤h’ˆ’ßM¢ëeA?YQP¡a¯Íº´1j}ðöÃά2R{z£â™<Àʵ p[4qˆ€*.œj¸ò9Çð–ч¼§ÿÓå¦Ó·#…7 lÊaÛó ÚÃ:‰‰Ñ±Tæ¢Ï7^•BJ«"’^Ý÷a†Àˆñ€ Ö¦kOÛÌðÎpcT‘ÌOM«-q| àrf=õÄ^VãÂÛÜ´ÈÔÌàX‘i?l¦oã²ÏhIZÆ–Õ¹¹¡cˆðÄHWÝÞÆÜ Ð²"^…U½f”­Z%¤<ŒáÑçuS/Þ¤@·€B«Çè|ý§Ñ»'ü®O¤Øé½ßeºC‰Í}N¾Ö£Tú0ôpº€íMß©‚”Kö‰öS'ãE.*Rl’K’ÓÖWðÍ1¾BCNi•2Üm‰VýgœàW‡W *i*SÅÓVtЇ#[¡ª­08+¶ÔʵšOŠÞ—ÞdÛQÂ!œT>êéóZ²zߵóMT»8Ãè>DE%Z’¥—ïØ¤ß_±} Tò‹¦…ÂÇq÷žâð`³^›K9gúqUXQSú Ö#ô§}oLÂô _â°8:–=Ο>¯ì˾@>ÇÃ-eÖB“Þ¦Xºd˜©ÍÀ¢¯Û—ÊDµç÷ßd™Hß7¸Ó6Î@ð7£m_+>&NHxo½ÙíÂp¨ÎBö¹¡A-Ñ㧈‡?­`u®Ë%ärá?Ÿ•WÄñÊê”xk™;„ˆ ¨Uöc|’D¯°¥MX9ˆ¦¬È¶tO}¿²ûTåy›¿Ç?‰Ø«DÂîìÁ"ÓCI¬<àmcÆíYîreYÒKx<¶é3j3¨„ÚÁ-¸ÒR¬uÝ0ÝH=÷¶Üít>žÚ©”JS뜡¥Œ‹¶„ðœùÄ-–fHìØI¤Ý•Ï HÎÂÑ£§cZcň´¶«±;$ei†÷uÚÑuM5‚ª¤(_{¨ñ‰F4H²Œ Ø©„Z?ę݈æÓÅq3[ÿ1íí\yfíhüÃzgªeÈ&q‘#M}¼UíuV|¿›A5>ÉÇ¥2q6Ö „j«Â4â°íq/?…Y#ñ„q=Æ¢råtEÑ×qüSU¢ k¢ð©z¢]å]²ð¤pL[ÉýÙèW2ǘ}We•¹†3kâfJ?¥½†·y°W¬hin(1 N2›“ ”¡²îivjôèÚ{,3€.¶E™5d/ð`ÏeˆàBd±<1ÁpŒÿêZ¨ë†¦ý-†¶mÏ]79E¹†0{uâðtÔ jHpŠÄw15èbi»«®–®°âtøÝ—Â.àûÏ)ÿ¯à+‹ñ-uáã³ãXµÚOLš,¨*Y›öÏæT\Î%p—ê…»ˆBSl=rw¿Ö}ºôƒR¶a˜?WÃÀHPñ÷õ?LÍÆ{O¼9½5_©ëþ²yÏ8k÷ìÓ§ Ÿÿ9i'| ÆÅ0¬äÑÅpü³5roˆf¦ycáS⼪vÞ!‹Ê¥¼Èá…ñöÜ-%j(ÆîiW>½j–Ü+Ö°Q…åGõ,Ð7øÛ>®uç¿xƒ¨@tO·4´øŠCÞwÚçàï,??[¥¡¸£u×ë{)=ddUÊŽ†·SŒIÚÄÐ,!"þ¼ë÷2½é~³ŒÖá}†ž*uÛ,7z‰˜Ý¯1}J‹AÇ ]z°Jo²RìnšUhí2•ªç„ôÌGLh¸€åg[;G ¦!YŠ]y´¦»ìÿ^QÞ°YÅYØ‚>ýd:~Rözjó¢AàÞú†ÙšPsj )ÁÊ/%DUÁƉ ‡sVŽ\s0`ƒèÚϾuK4Ò”ù§µ#ÏG➌ƒ”¨mkIà ¡ ¡Y,뉔f䙥²X`ÌIvÔnø±…©ÍÚÜbrx·HFj0Ç©)|i§g» êÜeqivuAÑžHŒB^Qß`>Èßän×¥ªñº€Cõ”ˆà¹Ý«° =ßuÂÅ‹ û2Q˜rò¥~×ÔŸ4_£,‚ܤcQ A Øv3‘ŒÞ+ƸÎÿ]%œv×™ˆ3Lƒ3MW—2D9Ö §eȇ•VÎAöYÆVV¥%Q~š$æÚ\Ñ|Sôt¡^9:ù Ã÷Àò¦·*ç{Û_wZ>"ùçoMçªp?À‘†‘'ÒÿÅC ,q•Ç'ªÖm #·cº8fH»ÞE˜¸6#ìiPjY…~÷ÁÃçeªõÿP®]Èšïô”—é9qäýó#—û­2N’9JCP6êš¡“v>9*-Þ®’•Œã+g«ŸSÒ )^˜œ³0à ‡±qM3³‘ï«T.?û% ¤Jòijú–e•߬ÓFV6À+u™ hV@9§¨ÓÅS|-"þ*;˜KÎî²Ô”×5_äâÛÝ¢ÝwE¼5=tü°ª%x+ŠëùiÈeµ9šÎáˈ<­^ì =Xïñ˜I_–fƒ$¬6Œ8†ÐÚ}•å­ÀEÈg™ý:œH´ä Op“ç„ÍÂÇ÷ÁŸY«MÞÒ×m¶¥Ž`9„;E¯Ö ÜÄ]3´Š/•åc‡å¾ ·"@‘Er…5ý±-þQn×× Û™؉•NBØ4ÓÓù–cºys²-¾+œ¬¥44ǤýËÆH*:ø¾Ð•‰|”ÏÞTãœ<2Q±|ƒ™ËÌ6ð¤¨q‘å²oÍø8œ-¼ØÁd,˜áÉÛnBî+tßðÆeôVOÑ[á”– ÁÒí'ße–¥/çRðºÛ@ eó4š¾&ë¸l¸™^VÌ-áEкuECt¾œ¹ÛÍæ7Eªê1Ïo„ÛçþfÙcú39øýOH=¹S1ƒ^GUÍÔ‡&–ý[oÛ™²F–š#$}§â`íG¥ß»– ç8•·ø&ú}Ê0SX6T¨ÊÌ[5žºlŠE-×M“¡½`JÆz¨Å,oDLn5ûZÍ£}ÍÏì²)ÝpI¢!#øiS)ZȃÉ?Ú¡ÎÏP&2Ò÷Zñͱ'Ìé ïÑš¥²ÂÉôÚ‹rÜ7¿Œ+ Ô“v`cí]9LÂm¬u ˆ &x¡d©'/‚š]i)ÝRVu% °ÛÉ'_×mxã°µËå­ýEÔ>×ÞÏ¡=FÏDÅóYùvÃñé ß´2Aýó{w°dO¡b7MˆD¨ÚpŠ@eb´—F!ÙæLˆÂ8+ËÜï6VÅ-#~?c“Ï ‡ Pø$1±A±Ž(:sIª£Ô²ÃíÈ//Ê™dÆ[!_èÅ5ÜæëDDÜÔjÔ<0~&ËJ@%=wâ¹kÇZpn£$WìnvF±ƒçÞ|#]‰®v¹Ub’Ë–vn#”]½ˆÛr*êh€6Nýç3kÝ8žàfÔÝ~ íèŠ>0ª‡ç³‰”+Jy|Õ2cYUxèÕs§Ú–e ³ûˆà[—4Q¿ßžJãûší‹?Y…Ï™¿°X¬?ùÁéá×Ñëä©Káûíf½5;¼0R·šèÀnºòWº_°ÝeÌH#w`8³€¦oæÎËá6Àt?¡ßqZÓõPÓWÔ2‰q1•W¬znO¹)Àb‰*àû=[õ:ÉïOÎÉWdJ˜êÈpr€`Ì´"©ÈhºxH‘·¤é0+å5¯l jâùìÑ4ªýøÌˆz .Ü–º_ŸÕYº}bBwõÚá½Ï¶ßɾ²¯b&®úA^1[WzÕ÷Ì1XxQÓGHÝð‹0”ÌTüP¾ÊÜJñ¼Ó¨›ýdùËkñ °Êœ¦æv^Š=Iß-u/‰ƒÌá÷ Ĥa7@žáü®bšª÷.I*o ¬Èp¦ÉÇl¸Âç™%Û‰¯ÔÃ/Ö¼ ŽÍñ~4þD ‚çXûßDŸ&ÄQ¢º…tmô‚ x<RΟ¨Ó¡¾%pD×à y~DyJ\e½è£e®”áĈæ~V#3A[*:xûõvPbo+z·ßÉwt×’ Nþë€J´ÕÛ†dø_L4™öºu_»lÆ/%=Ó¢Ç.¤`¬ƒ71 ÒYðS¦V;÷ IeZ´ç[ç^°ßyÄ^¸¾Ûç‰^šÞ!!ÿ–üÀg÷Ÿóë@ZíWì¤ §"õC#CÔ]¶Ü«ºô{…ƒNŸd£¾K~ÄX·àQíjÈËÉu*'Ÿ}´ÆÃ™w^_ §®s—}Ù’+¶9òuÖS³¾|x©=°¡ov ÍA!-Uƒ^g7Åñ’²”!bMoEØVè(6ûAéd¥Üg6¿09Q‚«ê´‡òJ{L¿ÉSÁšç¬®OdŠèë²dÌÖßÐEqa_èrGIyå_]4i„WòÄ…¸ÉæC½Î+Ž›?!4Ír~æð*ó5°"BKÐCçÕ¡ÂÒ»ÔóÆßá•e…ý—áE«]Ð9S®«³Mâ`¿ƒzÅ'Ë*rlèÕ»Û·ôHõÝèWOj½±ÒÉLtzP- ­Üç¯ÒÓåÉí~_Zs8´,7ó™^«ãµÃÓÓ1òše<„s³¼É){`2Kzˆ ‰-çFïw¹úÜÏÊ3Õù&aŸ'«ÿËWL¡LÆ—3ö‹×ÜøµåŒÝc·e£éÎ"•<`盫’ó•S¦Xñ^þIUâ¸lm/ýÆO[úQФçuý\‘æ­ƒ‰î¶ i„¯©Sœo-Ì•z¾Ä=Δ ¬ìên`¦÷¢œµå[ЈVËþ¤’ˆ›c›‘}vξɳN¾oÕ‹0—P=R•¡¶[XÑ}‹/ü’žj¨Î-•oë ™°Ñ—¼Mœчö‡¦ 1Ù`<òÔy}ÀËŠÎ37ÈÅ´›âP:ø†ÄŠÔê™ £¢Ö‘ -Ž7(Å—@1ÃXuòn©k´oû%f:o2S§6ºTŠÈ8Œwòfa†ì‘0 þvHå¶úº¨/¬P¹VoСÄõ­ÓAìÙ6¥_¾Ñ‘íÌ•h´Ç™|+]Š+ýk+Ûº:”–*ïï¯ÖK—cx͋ѓÊV3`fC]®î Žö/¶ÕuÚÁÕ2P@.ÿIh„ j £eúN-jzJÁLCÊüã "}DnLsgîA/ÙÂ’'dýñÃè…µ3Û/•M"› v‹ôŒN(¶Æ;=É rXÚCÃe¬F“Vµ2Q˜+J´Ü¼¨aèÒ¹Xþ³¯˜¨´ hiX2 c¾óábù®X‹äLŸ¹æ­'Í´ï¡Íºò–wÎê¸]àêé)x_ó‹:58eüØ ÉŒ¬•H¤»ŽžÂ‚ ÿºþLÕ@¾,øU;Íèzc·Ó Ýñz+éé=‰ò-OÀ¼åÄéd=ŽÇÌýUmË¡*žbþÚ—# P°<-A¦Èõ¬´É{Ú ÒØ™çQÙ#DÙ™ðMóÎóÏ4ÑšÈùu{†cx±˜‚g|ÎÉAìFE;ý‹ÛÁéð<©wéצWbèê}f?³*N{èZÄÜ%^~•î$o‘†3Ÿùœ3ni7¸ÿ*Èè?xåDŠÛ(¯Dð#x<_¬ûX„µÑÐ6бfâŽémÅ;‹ -Ü<íGáYz#tí¬ÄšÇ¥Õ…Hµµ õHÔ¯·È_Ïëø¤¢-Có?él-¾KÌ)Íš;úÛ Ø— qMIëŠù{ÛõœÏîˆá׳Ñ<0uÅ{qçRTÄ·<ÌGœ/ÆÝ1Æ’c;ìC׸F!Hf'v]“"ú®dòʯôS<EÞ7Ê«*8®Ë†cT0¼±Ý‹—OtÜ}¢6a¹æ§Ê¢y] à8xvYbšž€‚©W2Wž‰¶7¿n}V åvTO„u#>º}+#å¥Îžï'¥µ[fÿ~rGÕ³éÄñ€·n“—y¬{?¨ÎøÞN wK¹È‡tÍfyêQzé}:͆\Z[#„¾}üÍï‹ÑsðÖlñä¾)¿Û¦uMõÏ6CtþÞÈ‹¾ðüî"= ’òt.¶ :„­Å·äöÏ–rú±[ü_RÞÅfök5Œõ ÑÏL¿JÀ9Ó_N®½H¤û¼!C‡\–Ó8ãŸ>–«5Ÿ}v[öÁuØ2Íݲsù%BîVÄÌð¥³h*?.CjÍjvôû» œvv"Þ^óÍb÷U:I?YµUê;€*\Áê÷q35¢®ý±Ò8þ}J~Ƚ©† ôß•k½aÞ*œÌ´þÀʺà×úÜžD¯;{aÆ¡¨’Ð#K/›-ÈU1Žïcß•\¤a¾ÌLÇ Š’zu;Bs?SÔôëi3ŽÏ—evà4BãsüðYmâE ´µgÂh™Û¡u…vǨÍXØTmKhˆjiR2(»y±ÊY~%3örª~¤ãÔï³'‹k.g ÚŸAfçÝ’®:_°¹é•Ù‘Vf;·kÝëgBñ!ãš v Žw8ä¢r5¹Nª[ Þª½ÃãOyù(zaŽ]äÒsÖíêêÅ.¿¤)µ¯1Êc¡ŠøUî È~¸\¤}!`údét,òÕª>OÎGvK´ÞnÞ:¡¶eµô¯¨7é;'C0,,ƒóã¦ÉyÓƒø€—½™Õ•ôÌ)Ë. »¨°ºŽ…ô~R•÷šµ×…`·¾6 éMjXŽ/òâoØ.ùè|Nƒ?3YªI€PùùVXcpÂã"s%Æ’ͶpöHTyÉ­ÅjY²GÆÈ ÞÇl“ËÄÅ€ÞZLâþHÖkºˆªWÕév® 8Ì÷L™#’ÝÔ3Þ$°BŽÅ•9ÅÇdôÄ2ß—¶µáèH \Þš~IÖóŒS4¡tßä8ñÒ«™_ôÖ•ÁLD©0ÑDª_ëré°W¨¡U‹ƒSGI;ãÀ¢ÚËnO¿(ºY^›äâH?=öbGµqÐSíi&^-MªįD²Þ9˜Eõ`EôVÌòÒŸ½mäßöaJYÏåžBƒêþö®â„åzøÑË~[ø¨ÔÖiF¯c{V$m_»hŽ—o»ê¤«\¸«dÈQÎy¡Š2S.<ªÕ`ΓKº <Ÿ§4®å’ª,‡®VÌ´}X„qŠ »;èòÔ&ÌBTÖ£Eᦒþ`BÒ%çèèA9ÚU øÑñ¥Ii?§‡n8ÝH 4šÆY3zùíìY/LúÝjæiõžåª¼)I¬¾ñ«65B€ú0ÁÉq|è7Aw's×Ì!D´°](:M /T.Á£<-"ru•O¢[k×áV³¡ûm*ƒ-†Œ¦˜’uJµ¿­{2žáæhÁœè`¤^TÍÄ$˜½\ó"®ãüþ ·! »-—¯wH8[ß °˜ä» ÇŒüÁšäûh.,Ö™Þ wô¶0?è_àô^zWP ›lì?ŽÈxY æ¶UÅÂÃm^Ìy¼x?Ò}T¶¿^‰DùÒ…GæûÖNŠeÒÐçÔ2Á]æ~€™Uå,#Jøm¡¨ÜysE5Ù~¼²R€ñ­uÖÚç÷ŸDÁj57Æï Ü )ùûãÖxɲè[±¦wŒ«Ãú6ƒ´í&'f¥þaЋ‘Õ? ¦ ƒ¨ Ë«rC#KŒ¸ŒŠßÖ,Ô\”´˜tOãÂ^N?ñ£(ƈ>z(oy(=1·W[JJ½ÛýIÀz7,gãì2P8þ__]øßLgWPz¸+¯®²Ò·|„ !T;ë$þ+øÄÓˆŠ'Ð;ß)ã]±Vöb.ó0ª¼Hñ‘­8[ h2J¢¿ ³Ü’¶eb-@©N7,pY¤í¼Ío‘ß*–QPt°h_ß”›2Ä„k6y¯ æ‡P ™otU—:úX™ßräÇ}»¸ŸË˜}˜r(¸eÏÓà*È#|J£Ô5ô±Ru>tòâ8(%$ñ†_¶›‡q•kªÚ–`¾f%Ïe³\ãÒm8"· Þ­¿–Þ¦ðõº¢kGÀ</½‡O÷gK³‡PÉ iý­ÍËñê?üÖ‘KËd§úef²ÉÛ©¤o|có7wU·Ñ)-ßü«ÑJJ=«óªN-Š….’é‘F}¦ø3«·úeS­'qOS¹\>)Â#3ì_ŸY)Ûr”î^İÙ&Òäx¼Hñ²Å Ž-ã2v9r–)~rOú6„“SõéŠýömÁÉiåyãÛµ¦6p'í[u“JT""Ó¾ Ìövl-A½o4…áÄw(kñ§:•UIÙwŒ9yLY°‡5Kñìî©s¶^ÞSn•y?¤>·žÊ‹zÑy a* u›>37€r]k9ªà€NÞ8mø ]/t¦ïU ›“ £;髸Cglȉ©7Ü@Å®W_É’V¸Âå+…á·ë§ÐLr,øÎ™:päþäsx5ƒ (CLãowЄfØ`±F‰þY$c|qü¨]9s¤-’Ú³ˆ*ù¼„^¬¥>ØÛ0 çÖxw×Nª:œ§8),z?„«ë@ÂïñZ=O? óü<ýµ>Q|ñf¡ç” ‰ÿÔæíuçÿýˆ¹I›q£SØ~|¾jK•´l¾ª¿ñ8ü®TBެçZ»›ô³gòzF=pnÌåáÓ²¡DF>¦®,‡sRaý#éZS^^Æ=¶Òî´#ZbçTl”^ðk–¸€ Í,$¸b²F„äüõW!ð¡óät”&O¡‘•”PžˆÐ'3ÅRIh.ÆéS²*®ò^m ä‹°³(yfƒSÊ6Õ#½œ¿ÊsǯˆürKn~9KôǤ¥û@²_T5ë?‘Øö®Hà຅)aÄÆ‘‰*PþtÕ l0Ö© m›‰¾ÝÓþìfeYßò5iOxþ…¿I²ól#S"èº}.›h/4Dܪâ "ÂEüá±xtyöØ~+ŽK½a@’Ò±o«ÕÖ»woh4&_²Õ²¬M LŲ±ž><ýŠÈµ'z#®D„}ÒkKÔ|éu"–·LÉ}†‡nAàh4çsLÿÃC:C‹€‘ϳעå…>Hýã`ú~C¶ pN°¥0­pQý1…æó¸ç´— ±e›Ù¬À0}øZ$þªÐ¶ö ¿G1#Øuä@dYZ÷±hÞ4!78ÌLï ËØbŒEëî"gu@5T‘‚äkåDíN 8Á¾4„ñäÒœq±/óB€^æ9ƒ²)°Y½¥\úMBi©k]Ä CIÑyMÈ'ÏÃÎRרהb¾$o§J"n¶cŸ©Ö[·mtròÊJïª`¶nD»çiü}UÕ¤‚Ëñ·Èj¦uYRªã%G<:+–«õ†S¶Émâáãè~èõ „b}c&nÑäOcg+T>@ù0ôÒ)ûí‡``Çú°ì Ï>œ:¦»ß6ªÿLÜþS‘&¬ˆt®AT ô‚“6m²¢Íºã¾aëÁf™è=¾ihQ-wAø7§ðªÙ‰=æ<ç@µŸÓá¯$28‰dÒ3.Ë =¦ŒE6ú¯ŽðjZã?€ÜK³D÷䘶?€O>¿ np½ÒíqAxνûb‚íºÍÇ€ÏíG?*ö½¡? ÐøåAD¤‚úÅ7£€šqdXÕü 7\ȹÔr½F t¥À[Åßùš;Ò/fšñFœž`¥ Ŧ‚(êd#½J›j¢¿éӇΪ7#Wj™­Ãš=ÁÚ0×d +iPÀŸG™…P2q\- \d=!ZtLB YÞó zyj{‘•\Þ–0œtÜäâqÕW†Ô®ÜëlçP|bû¦ðv¬?&µí0í|ñ,5- ¶¾§/ŸPX0ëõ”ÿxW+¹.åMOÕÑtæíŠò|Hœþú¶ùgKgÚ¸íI«`Õå‘6oˆåó»5¹–3áEM$?L _XÀH:NÈA¾'6†PoA(‰›°fÑÖ;<½ô£tëÝŠcþ&†î0ÇÎ1ðÅ®ðVäA‰*È $qý}„)Ð}a;ÊY ÷ø8ÛüåøjÂQ-3ŠŽtx¿Ø}*1FÜBä¶J3ÉSýsäo,C¶*øà’ƒ¤Oö¨?>œßÖo¸r¥~4¿R«EýäîŠ~çXÆ£g4¾˜½G2”Ò9½BDuïœ|ƒ1bO8åî‹êËM9SvÔµA©§˜1ùu ÊFÀæ‰ _®mʵ Ρý7ß¾Ü>T¤aKj¸+Ô~†òí˜ìÁMÚ˜].Á²Ia/½â¬0Áb#ñ›Ä9C@fÕ¬m,ÃOýæÜ›M—BêÖ]žèï¹D[ÔVÇaë›Ö§Æ$ë€ûzª2³ )±i8Òb¥1Þ~G’’, ,>áé.@7õ˜‰™° I”ËÙ*ð¥¨;Šúù ö3ãÝ–¥LŽ€ éRŸ4Éõ§»@Š¥A™µf…nü¥iÍ¢©kÁ,üÀØ`¢Eûb¥ÐzÛêÅšfXyÉ PMV !v°‡˜2À€×  ~t n®n¤é\›‘ÅÞö‹bd«½¤-€Aì'© £""OSý×p¼^ó¡q’w&剘ÐvËIÜlþ³H9î°¼ö–^°Šðç“ÞU XÝI¥XU‹§|ùv½õµÍI¹É}Ò“f?µÄçáÆKÏ,,Cp‹æž7KLÝ—íú§´f”ÂOŸé÷LédÎC5Õú6¨z§‹e¥û·nË=”Âñ&-$ÃØR»r„\‚Εê Þ’[Rr}¸•îK8BVæ]Æ8,~#§e(P+Ò”A—6pÒ<)ëïe×ï³…ˆß ¿ZS¸ÔùZ¹R©½œeH@8&±YN82…Òñ~Z¢¼šqzY›m{ãÂz‘סMvÍ>–TÞÄâá›KòÉÚ×ÜtŠ;C´ÜÔ™ 3Î,¡”ÍÀõE”ò‹¡ äéÆâ$N¦*u³­>_çMßd6$ƒ½9úž“Í5{”…ÔÒĨ´3$/ÀØØgUÉÞ(ˆâ½Èx©éžVîµ¾kš[A6@“ËS™ŒÙÎyT²"¸*Ö‹^A‘‚—PÚ§Wî0/n³ZtlQ_pßx°î®{q¹¬ÍãÎØòn„½2z {Èç-"²Ç=Þ”nŽWG*²]÷¸1rb±ž ¯a%öž.ÿP(üc]eiËíJ¦½iÁ±3r®!¢s:ÔµIqÇýAøúÞ÷e­è#ýGõe½q¬÷K°:\?Ogü‰MæÎÙ|8‹±Wu« ~ZÁ«_å¯b^Ð÷C?ȩ́~–²G8í§œ"‚)@ŸE,ÚÞÇPœ9/®ö(ª´o”:ÓjW_³‹dÁ>ä] ܾ:ž¥u—ïuØB}Hw¼•Ý%oþ@›* N{÷ÁL–†N“;·ÄRãªí6¢ë ›á1ûyâÓã>àñÙnÀ,ךÊ ©w™‘¡Õc•bà܉Ž6ƒ§*º³‡Ë@˧’K&jF¤8­¬†]T19Σq /»™©ˆP?º"‹ô¡º0ýs<Ã^˜YÒ&ÚU@ñ<ß²HHÛ*!'²%–¿¯YΖAçsùõsÙç…ÆQí !ž^È6éZâaúº-ì¹7°ÉÕ±,|\$¸CþE”„ïm ?y±‹Ó ¥)š&Žê2\&,_™a>kÐO¼×¨ã´WRR=[âñe¬i©v©Æ¨*Ü!7¨²‘uÔ¤oÑ‹ÞKz2É{Àdù[’ª‹|zà7T˜TÔ­°'ó¬ñC=d¬^ã¹ê­+h©éŶé|9¿UQÙ¤ký¨Ÿ¿×u6B÷u+ž~–©±;Wñ¬ùŽ—¼ò„×=¬î\Ígú-&ºßµá&dém¼B¾ì=ì•W‡~àåøp¡¤«~ºZ`ÎnÑLp_¡­þȵU}F8ø¶<ÿÆ‘ËÖ^(–FR<¦"Ùdwåÿ=Ù 7sSwÎ4ÖK²ï•ÊÔÎ)œEB‘:¿ PWa£ü:PìWîk…­âãLj¹2†ÕL2˜SxJh*’ÙÜVù*AÈŠÔ¤òc))ç\«RÉf=q/úhß>÷ôýª¦?ê}»]¢${ùv’Û86$­©ë vÅ3¢AK»JbþæÇÁg¬7Sx¶Ô…O·FD íÊ¡²È¥PÓ·X^Œà:sâr·Íñ+xZÌò[vptV•óÔõ›â~Ðú¯ž…ÝâÚ¤ê°WH¤µƒM@Göˆp‚ü}€Q¢€ö¹ògгöØäwigJŠÎ˜±_µ×xlŒ‹¿øÔò+Óуµ»ßLIæ=ä~§D—ÛSKGé5ÎK 9-4^ÕpZªG±qŽ€WìGTG2ÄítØš.¯åÛKù0 äs[s(SÙ'^~éÈšLì1Bô2 ìÑGYŸ¥Ò{±[iÎîµÓu‹¨å|Au7ƾB¨¿Ú°mTÓjNÿÙ‰™}ñºBÅfʆ}}nè÷Ø€ÖŶ”9cîã©øv˜Ôı²\¿_²©,zÙ_Ñeëâi_Zìkج;£§üì Åò]xi 2ƒN~L¿K½Se-Šõ“’@ΚQ—ÖFí;&¼C™BUAÑí}P°Í}ÒPà,>ÕÆT-.PíÝâýÚV˜Ü1X (-N·ß‰×]ë?Ž@ ~"V€Š=Ã"¹.¸BxµT‹ÀVf§ `ÚØ7.GÌÿòó´TæSÆ7Cεæóެ5¤´@6ÃlÑÔ¯0GÇKtTAÇ7ãK¿H`ÐtÓ³ù>Ó[Ó¹±GÕaå—ºQú¾bAÝÏ»°„•£þö,:Ù‘±šç9‹¹Ùˆ•ñèÈ`RfÒú$@æã™ÊW¡×÷rÛž‰äÂe7Ç}Çèê^Ò2P 9¸¦bþïŸY02äÒÅ’wšÏì¼ë2‡ýĈsdm7‡P¦òc ·ÎçÚƒ³ôsE÷¡šN°Ìv‰¡Û‡mÔcü§¼ýìKO“Cã¼[æÆ!ãéñŸIRcŸªRÃc¯Â«è\úëBGšvtè`“ë9c·)6k±§7*4x6¤‰ã¿{hÔò’ñÀH»Îñ QˆÓ—-,€'}Ñ»- ~&ó^0;>>PŰ^_7ø •¸"õN„þÊ\•ò[B«)EÆÏJŠr,È=·Z­ÆÀl•Ö«F2 ®nüˆÎ¼-6@(Y'ø¨°¯!û1—Ùïg˜ ý pçCYr0ñÛ–:.ßÔƒ?2ßµ&uo¾ +E¥„g¨SÜ`“™Ú~.²4b3AFÞuZ3ÁðµE}·½™û(ž<ž^³Ú -(D“áŽMÞ_¾ læHYÔ+ô° Ä‚eþ| r‚Üm#ZÐíº¢0šŒr‘k‰Öý!ðѧÈŽí>ù™k±7nÉ;B+ƒþhce‘=€·«DÒ‚âŒUy‡¾úèP¼££¢À}'L†xžŠútÓ0«Àõ½Ä híÓmFÏf2ç F@GÔ£2k$IÍ>ý#XÓÔ ú:É{Lb·fZS‚º8O!¨¯;Ú­#„·ðs‰ÛÄÒ7À`ìX¨÷X¾[q–í;fûH׆è =ÒþomÐbK’ÏŸ’íyí¦!]Š»e¡ðŸöÇ/q'RãA¹YÙöÇL¯í9oh¤<œ˜{ÍK; ½¥9ál²Ÿ}ËǨ…’§y@¸±ý8%‚˜D‡€1Ü-,¶“ÓˆÕó+‚é‰`ÆW«6º–Ê6£+WèÔ×W6&•Qí§…œgû.¦ÅKµë…›é€s“ˆ†ìígCó”HÝÜËiˆ€FNÇÝS'SzÔTõk± â‰Ç©4±šgh#¸Às¯¨yÖ¡-’Ç—tü=é˜.“¼¹Ôrµ´ Æÿž¾Á>Š0v #¾ 0(foø ¹âdõö€OÈn7ˆ¾  'ÄœXà ïÎe/¶ÁØKý‹¥Œ”A”‡3…ã–k” ûŸ+`” œ—™Û¹¡Ù µ0-f„qé_K^\¼î.Þ9%ÎOõ\¡§.ÛŠg/MH€ÐÇØ_² ¥ÀA,5ü¤tÑvªî%»Ê÷ª› “‚º±—=..ÿéÚr¾¯#¯:»çÝ(%®(&„î¦ÀSô·÷<úX ¼9½ìœfA ï6/ØE—=Ds2†)ѤYm?Í#ÍÇ’`þ߆{ŒóÊ!²õÑËÀB…‡4Qšã}?Vë¹¼ŒC¢¨ $ûÓØQV‹¢:…F8ka=y×ýRäö3·LçLGƒ5ú02°`2WqÄúëM¨Ãæ—4¶ë>ÈÉ‚h0¦íñúy[1Auùÿ‰ÊFåPÃ×·6qÀëJÞêµD¦?”Çub U(ÛK—v9Ûàº[Ÿc>Ü”¶ë'3>G†Ú”+5šh²û•ÎkÈÚL&$gªþUD–¥Zã𶼸áz? •é+7¬¨LåÏY¤T N‹(×l»«ÁÛ²z„å¿Ð6c[˜ÞD½ÜÆlÏè7r3›§t½ ÈvŒóÁ˜.ËÁ†{Éϧ¯sÜO÷ ¤•0éR`“®9oÿ|D·äW¾æ3ƒ¨žÞ»Óþ‘‚Eˆ j€£›%Q¦;òóÔJzÄ7¥X]tiê¯ÐGâFrë_é¦Þ<’A)EJ;͘ÖÒG õ¢%}¶ ÷ò ’’Ä¢ÊÄVZÔc¬šL&š’ïã‹ïNŽüãÎÞјG¬yr›%Þ`Zí•ðóX¾Ò÷è–¼26ϳx‰ç­G&°¡ÙàÁyB³Ž™Žë`‡á‹ß Åý¼pÙRPÜø ëØtµK?(ÒêûñÕ4nÖŽg÷”ÒYeÅ. ÐI+&-3Û)Öôiyv‡=ü]©Ð^±/µý¤+»]ß\N¥þAß\6`GuŽ G²™ž&«ÛÙ:²4m•¡Û#Àý§6ˆ6™-úeÕ˜R$Úü*ýÜÀöÒd¬BÕʇ ј`ŒÆZðµ~9öÛÿdçrßkcæøAJš)¹:T*SBWˆ›±%b˜OËq}æò‹%åÂP>'®\@ýPœ,Þ’g¤Á›>†:Y³Àð§ëÖ{gÎLïdŽ(ˆ_­±å‡K`Aù»’’55ÊcwÞ*òçàÎ [:èšUF!× ”¼¡å ›ŠQVckq8Vc> stream xÚí\YoÉ~ׯ˜ÇÁªï X°äȲ-Û²uX¶áZIÌR¤–ÇFίOUu÷\$%R$$XÀjÖôtwU}utõ i#¸,xa·…ªð> u¨Bx‡„/dPH„Bq„à…uDˆB(Žƒ„,„S)œ'ìPºÒÒ8SHãqUa i½EÊÒÃ4 |¡¤! 8x‹”ä@œ!E¡uÀU¤,tÐ)ǘ<¤)¬ðd‡U¬Ö(}Ú¢Äú,(!¯ÀC ¾NX”T‰ÂiP(€dÎzU£lð¨€.\vGxPÏs’(Sx‰8Y% ¯R)¸”’kO‚R(Ž· A†Ar¤´ `¸€é„ (çv`®!@)ŒóñÑ ,Í€9 èÁaÅѰwŠÆ’ŠœHÄByƒÜ96ï‘4 쎎@Vƒ£‚@, $$ô[©‡ŸQ4 ˜¡³%9¡ì‘”4x*0 x˜[hÎÕ¢£Ù»$Þ˜"½BÒ „ÀG (Nñ`e° ’Á‚|Dä{8H‰¢j”ɨvPdc€@]Ö«á ~òE¯ÑZäœ@€:…Gǰk@(­†>ðÉËkœb­ÛßÂIÎ!<4À{PJ¢Á]DÃñ€v Ü õǨ Ù5’ä3¼L8CR¢79‹`…œnÆâ gõ\0yB¯ç(¤ƒàÃnÅñydé• ¸ÌõâL \Ü`)Ñ™¼ãHô#¾½óë¯;ìôç}Y°ÃáhºÃNf?¦t}Ôþ¶ÃöFã«r\|ã%ø÷ö©¼œß ÷» ÄßÕe¬f…ÝO†1/Š_-ØIÁ^NG{Yü4ýkñ÷¿ïÀ?døVà‚¼øT°‹/_ ˆt€¬Îƒïk : §ÄíÃÅÁ•M4D9Y?݉¾/dt/¼€åØñxtyR‚v;~yP°ÓòaZ§oÒ›]ó}çx_ñçßíÇþ¼±»&µdB“CRÞ K[çø®+ WìúÜ£å®Â̾›çév1î!ÝÆî¸xlãÈ´I7GB&±MLšw¡m­¶IÛ”-¶‘—Z¥6öDÕ(W) {‚¥{îAú㤠S²„¦ÙÊ4# &q8/®Ûˆ‰yõ8ŽZØ€!´º,-Þ„ažn '»å`½†½húáö•XõÈx_CvÔÜ•LU݉ D:EÎà{Ò¡o(¥à~¤ $ÏUÿ⌴p†Ú‚hí$hÛØã Ý ©ßZDú-y¨óïz”EÄÃ{,ð °›Æ+”­(gH߸VШ±&Ĩ&â@!"A$ÖkZ´ó i'.ªiT¢Ið¨.A½MŒ¬WñÄ;Ž©GÇšZE«Àëq‚)ÒÔn79ÃjÊû],G±EÙ\Óœ[p‰Ø.w à›¬ªÝÙzŽö1’B£ùaœ²h¯œòp6Ô7Eˆîa²äqnZ]ÕÖKë“£`Õ#+öèEÑ*E»T‚yW z® ‚ KëEƒ<á P2‘cÆ:˜ç«èÂ(P@#GL 8Ryì7šrˆÄ,%:ô0IHc¼´5´B¢½ÀY䜑KâK-¢Õau@¯°Wb!Ýì‰ G¯hÒJ¢å›câ¬Ôo1»ÇïQ•8¦9>ŽòÆh¨U™ F$ˆƒgµJ*4S£õ¥õ»¹Åk84ENd õ6þÕWŠ£÷Ö}ñºî•ä^Ñ-!$bTëItÍ)ŠPy¶µàJÄ]ïÒ¡éÏö§%»9´$%ÜÔC¡•߃##¶´½) ,ELÚ$%Ñi´¡c4•»±FjНpÆ»VÒ\ØÝð.öx*ip¾²˜­Ñ»xdç¼ÛÌ¥Êgî®Z¡¦Œâ˜ (]{Lgs€uDÖrŠ ÄÁSÐ* – /$;ÊIqoPªAÎà”£NTÓ¾ah\Ìq‡ó(Ê@Ȳ"¨Æ=ŠjsmЦý «NØ*$VZÑŠ’Ò´…x”Tcþ ;*2kˆñ8¶“à)Ãx,p Ú Gµ¶TÌ ì·˜yÒNéÈ–qÿ&–‰ä”c­¡ÒOøç¬¨ä 7—'lâwo ˆlêÕ§­°(5‹{3¿Ž—v‡Å­?¶ ‡JgÒÈX¬RëÉʱÅcvÚ¨c]I#HÕXsÈF½k”¸Iô#ËO)qi»´“@1|È µ6®cÁã=¼Br Oîä<6ÄMƒÕ˜l¬C´¦:›‚^ YQÚ°± Ó•’KÛd)9͵ýfP+ýùtáÿé©…oT³±T¡úÖ7ʸó‡é¼ö–f˜àuà’µQïww˜TLWTëìòç¹æô\SûxBApP)[%$=rRt T’/nqÛ7Q‡‡O3½Ë÷Á»0 ¡UêÏkÓ9É‹Ä1ŽŽt=*c*êq WiÓŠ ÉHƒxС¯£®øØÊg=-=²RX:8ŽeŸ§ÃÑTnˆ@z‡$ë •-p¼iî:ß´)Y©¾ŠtjÑKp…ï—øÜýe9¹÷ï§£q|ÿ¾ww¾¾9<úxú·ýw{‚Cÿ w3)t°·7z(¾ýxü")&…ÀhÄ7“Ër8ÅÇS;l¿wXöonáÒÛ†\ðÞ/o¾žöýËÛAYÀò'Óòîò;ì"M‚ 5n{c|”ÿ¶Ï>³ûÁ.Ùåh0B{w×cW¬d7¬ÏlÈFìžÝ—ãþèŠÙ„MÙŒýÁ~þ5Š|ÐF_Œñâ¾ `{ÇoÏ_¡~ à*ˆ´g,„ÄØ‰°º \4!¡Ë ‰W‹!-^±#vÊΉKÒütš'•;êÚ¬î*úœ¾?>xõ“KôS(,¾„TaK&KMþ‚íÙ_²°Pü½foØ[à{Ï>°cö‘}b'Çò™]°/ì+Ó»'˜ô†W¬7™‚;L~‹^Ó_Îî®åCr tbËÊáUorËÊßg½+.½;vÍ®ûðï’]fcBúöçým9Àw»؇ýaɆ³»À¯ƒfA9!ªñ~0›°ßgådÚ¶h§Iù,4é?°É9OÙôv\–lú¯9í¿ØûÉþÍþ]ŽGƒºÊßí~÷¬µ²¿¢w¦,²°Ð9¦ÛŠ;Ù5é!˜ñÌÖ£XÎQ|KQ|GÞ<ºÖñäO§/÷/@Ñw¯—Eªª’—öOx²zÌ“Á­U­\Y‰®ÞGà´è¤9‹eͯÙMé›qÙ‡÷B²óô+AÏ ¿h#ß‚’KœŸ¾øpö6ª-Wª=c1P"%í&ÑÊšEaŽAŽ¡}LA}Ññ.Jƒr2A fltWÞôà5íÍ ®ÊiP{è/NVÀ~ýú2ú‹_ ·Ö„…°ÉHøm‰íÀæ|¶=ë¡£‘Z'HŽ?¾>:=$ÂB• ̶bD/‘hÁŽFõ~}ñõìý—ùÞŠù®3e¡ŽÂ$¥Ø–{ÃæØ2TG%[»ÝÙÁÑ›=ïÓŠ µ&,TGól2¶’¿mØÂ–|9›–ùû1î]þVNåõ4ÓcÚ‹»åÝÕh0èŸÚªñl×׃z×,ظÿÙÞº«ýº7.‡$ QQ…›x½ÿ>MË«š–/âLºªûcgÜöïúQ»çª.N/>žŸŸ’3¬–ì[çzË;ü.Ô:Î#–9Yì<ÙujÇù”’~ÜWvÊ/È!ž.Úîz—c˜¾¢,5üã6]Ú¾²æ×“ã·‡çd·Úù¬9a±5UÌøµ8§CÚ:´¬‰—+¤ÓJk½vQ §‘Žn¡öÔ½Wÿ8BQíjŽÚ¿xcÊYNµ•,ç[ªÕ.”܇Ü$úCmÚysj¾Îþ»ÿeïøã Ôr‰ý ØOZJ¹Éö[×âᑵVµ}TMQYöíéÙ§£÷¨ÃjuSsübŸµUÉÁ·sþ°ó)¨Þ½òÞu\í[Íg u~¹žßUúÏÝJV;.Nz­ ïìíû½³D{I§ªOÙíx˜~ôT—ÍÂ!Cÿ™ŠþK“üõã»ûâ½=bþ{õÕS´Öë ~pöîÍ!ÖÔ'GO>5Ão¿oRT‡ºëÍ -sÜú1ÚÜy\¯õdéý›ów__,§§Ë€¡¤®ðå´(l!Z¸àeùR.ÃÅ>†Ë j×Ñ©Þ÷?ï¿zóþ²biÞž±ô8,O¿bp¦‘Ûœiå6¼¬4„)Kš·´º¿b-ôªf,ʪˆJUË­SÚºååèþçxÊúC¨i&å%U8x²ŽkÜõ‡PüÜÍÓþýà'› áv2ÓxøpñâëÇc`µ½ 5aqzˆ?nðøî¸YÁ¸vãš LYXk;ˆ \¦QÕŽnb­Óôé›/o^ƒ6§Ë9™*òõ–ŽÓÖ?úWÕcâf´7»£sýLäÓ«÷çg§Q¡ÕÎílïøü˜«MNMZ¥[ :¢†¨_'e™µ2ùùÇ£WŸñÙÁò„¥c¾2j£|ÅWHW›? ¿ì÷c±éipUÖÈ{S^—£qùhÕI«znõñã‡ÃWÑ‘V‹£öŒÅO­Ðõð›4øm~ÓL$­„.k×SzÅs:úzWý(6ç’|ÐŽ9åŸ ²ÊªƒŽ[+_¼=üpDp,)cm D-Ac¿q ®\ÄnˆÕë©pÆV ÿsi;1Dá²AhøÅÆoüb ;ö½Þ¤¤ß…ußE·\¥ â’ì ?žLÑX¾H<ê¥ !a±Ïý«éí$þÖ•ŸŽÎ†òWe!Ö¨ûªtN"ß•‡5$R ‰¤Ú‚DÝW^]‰”˜“Hµ$’MŒža£î«¤¶ø“Üãüm‹}XŸ}çmÆœúæQöxQ±çÏоód¾Íž~JÜE_,÷¹h?]ê¡å\Ä´¬ašÖ0[§ýà§-ýº#JPÃO8kyôäi?™ƒÇ<¾-oå[§ûà`N"7g0¾<Åm#¡ÌŸÙçdš³Zp-«µ¼hΩÕ3œºsÈîøQ~2Ù¨·Í(ãÏH2C^£ž@$4±]Dä3²nç˜2'‘}"í· [°Q·zíÚˆÏm†/-·‰:äDsn¬ÚéæÞVè¸wSN lͰÝë1–œFØ”*Þö¯&ô]üÉzD½3^Æ­ „ˆŸÞѰïÏbáÓæýï ð™x™>cYŸþùL‚N‹G÷/‚õñÓG B0IØ*ŸÇfÛ´ŒÌë©ÜÓ#¾5È`z¹ «–Iµ¾Ò—‰°¹Ç%)„ßD+áó2g"õHÎ3¡3Öb%Z¬¤È Ë—Tyáø¶=©'£1ŸËÊfÑm2‘t¹ÇËLdžaVŠ'­”H +™ #2‘VVoÂÊ&‰U¶½ò< IsÍå¬tL“ø$ÑuÎZ&HuöI¿ð\V:/¬óÂ&/l’Â:{½¶ë% Ùfåò2.«—qÓ>÷T·+Ã+“‘4Ù?LN$FòL˜MX¥$ D^Xç…µÎD–ÂèMX™¼ŒMhr\™ì“&û¤ñaV!‹’Ø ©ÍéÖfG±Ñ§žÉʺÌ!¤…]fårv™§[“•j±r6/ã’z.Ã岺œ€]°ò9r}ÚÉHzú,þÿC‰0›°Ê& y§é?Ç!uȱœ{>+Éãó“Br•‰øˆ”a—’©²ØJ¦o;Ã2:WJ&6.‘BnÀJ¦-CÊ„›”)`eÞ¸€È=kÆ•n³ ¹Îã @•Š1 •2;ìÏu¶øe ‹ƒ endstream endobj 5165 0 obj << /Type /ObjStm /N 100 /First 905 /Length 1870 /Filter /FlateDecode >> stream xÚ¥˜ÍŠ%¹…÷÷)òL)þ%ŒÁ{0Þ/\ ÃØt÷ûí}”)]•µwmŠÈJéDħˆÌ¸ÉbåHk¢ƒRÀ>˜ô`>„é`Or(gšƒåpÅí¤r„–C•Ê‘Í#OG1}À¨‚–ë¿ø òó¦Ä¡ÕÒƒ$sµü -©ZqåÓÊ®øÈõ_!;£œ”ƒrÐ#›T4ðĘkpÁ© DÅX,å`Æý\£Æb¡š+ó™+c'Ä2R`(XdÂâÈX\ÁTÏ;¹@,àFîGQ9`¤Cj‚‘Üà9žÄ"2ŒB@ê¢È)‹­ÂCöâð€$ŽÈ$ʆÅ5§0,.\Icqç{MH0$JeQœr I‡  vH0‹ a±@àxÕ‘S;Œ„Å#aq¥å‹ ÑÑ $èõŒÛqad 'É\ÿC( h825 #8ƒ£ž¢™`»—Þ½V‚‡?°¬fàXgéºA¹ B¯)á‘BGqAàŠà9ÕtF˜Ö.@ërÞNGŸ€ƒÔë¢sÖþ ´‘:îÓ™›gp‡æõ\ké:"’ ð1AZÁ8a«Ç 84+Žó@G ¨¨¬–Å™.@E=4¨È8C(‘Öê)–Hï¾{¼üõ¿ÿz=^~øñ§×O—ßýó×_>þÀõÇWXgϤã/—?|øÇ§ão,è7\£°²Ñ ÔO3J3ò¹øïï¿ÿWÀ|Ê(*¦Ú î†4Ÿx¼Ãê±Éän +Nÿ-+Tß;\wmY™5€õX.#wŸ¹¼ÃŠù’©%udÝhQ8K7òÿåÊgWÒ…•»Ñ=X¿Õ+¦vå;\uJÞ)yi5=áúh9úÄýfWxÓ\zxˆ_G$ÖJ´Â“â×Å âk®ì‹®P¾WÄêvqÓ\.aK­&’~̓LÙÄ[t©ä+Ì£è• %NÍ(WSåü?ܹ8I«?’¸ŽŒz'“ê»rÒ¸°‘¥nHS6o¾¬\S+˜oõíùF¹'Xú³!õR½ f‡/¼ßú#´•Ã9+]Fô‡ƒôúOò5_,_öåýAäí¹}NXg *}µS9IW:ç°«RºÁÝnh7V„þüëçŸ?üRåÿáã§ ©ûÇqåWOtßTž›?|þù[¾nÿ¦]fËú¹ó‡¯ÿ>'»zuÛ­c7ív_gòxùÓë>ŸãâB+=µ,¶Z6i­â2Z²Õ¢·Z-Ê›?µ´ì´4&-[hé ­[Ú*“­´{ݲ—‰½®Øë`/[ö2±×{ìeË^&ö²b/ƒ=oÙóÄ^Vìy°ç-{žØËŠ=ö¼eO{^±çÁž¶ìibÏ+ö4ØÓ–=MìiÅžû´eŸ&ö´bŸû´eŸ&ö´bŸû´cebŸVìÓ“}”Øj餵`ņoµÒ­åM‹žZ9ï´²OZºÐÊ1´t«Å“VZiÉÐJ;­ÈoµZ”³V”§VøVK'-^i ö±eûåMk°÷-{ŸØÇнö¾eïûX±÷ÁÞ·ìmbï+ö6ØÛ–½Mì}ÅÞ{Û²·‰½­ØÛ`¯[ö:±·{ìuË^'ö¶b¯ƒ½nÙËÄ^Wìe°—-{™Øëн ö²e/{Y±—Áž·ìyb/+ö<Øó–=OìeÅž{Þ²§‰=¯ØÓ`O[ö4±ç{ìiËž&ö´bOƒ}Ú²O{Z±Oƒ}Ú²O{Z±Oƒ}Ú±÷2±O ö^žìÛׇ/jM쯴lh}ý¹»ÇuÛý¤íyžlÎOÚoBéïÎë—Õ3²ó—UÿÓ~YýFõæ&çáÆ÷ntŠyqžGÆYöboG»žÁMŒ‡XÚŠMïñç,6Þã±³IŒVb>Ät/ö¶z}õ&÷!F[1—IÌVbÏQÑïcAßÝ´VÅ?¿ÿÌž}{YíÖ±›÷‰LÕßµòíËõa yêåËwŸ£Ilß$S‹ÙØm´‚m[Ád¦±j…1pøíÇýsw lUaãç¼[ÚíÖ©ôW#†ë(}­ÖTù˸tTþm\¹kM…¯«ÂãŠß> Ü´¦O=ʛ֨{É[-Ÿ´Vm] ¶Õšª`õiÀeôÄmô¹kM-!«î£ß>3Ü´¦Ï =ÊYk|fpö­ÖôÐ_>ΣÒy[é<=óWŸœGÝó¶îiÊ‘WuO#GÚæ8Q=Ê›ÖÈ‘¶9NŸ,z”7­‘#msLSo¯Æ(O£·Ó¶·ÓÔÛ«OžFo§moO#Yò¦5z;ízÛ¦Ï=ʛֳ·­ä­ÖÔÛ«‘ÌJ -Ûj½ím[}þ°¢C‹·ZiÒò•Ö³·-ïzÛrLZ‹Þ¶1ÑYö­–NZi¥eCK¶ZoëÞVóœyÎò®îmçl5ÎÙç,b«e“­´|héVëmÝÛæþtYñi endstream endobj 5169 0 obj << /Type /ObjStm /N 100 /First 914 /Length 2623 /Filter /FlateDecode >> stream xÚ}YÍŠf¹ Ý×SxÙµhƲä?B «0„]˜E/zÑ0“@w'äñ£ãkÙŸ}ÝwQUWåë#Y²N}spÞÅT]Nú#9ŠA² ¡èOïØ‹‹1;.úZ'Qß‹ä"ë{R\òúžD—мE £ïqu…õ=ýª¤ï1»š‡½#_usÈŽ(éÎ Ž‚þ:Ò‡ªïRqÄ•õ!:’Tߢ"P¤ì¢¯Žüz3ñg}@D^‘K&'U‘«ú“*.xÝ!ê/ø”âIÖ‡¨ôRx“\`.NruAC4 ß$k b[ò.¤¨€šœƒ";Å+ R ¥¨SÍO¨úM4Aì™ßD3Äïš"&x×qHú²&‰9( f‰EÔ©¦‰AP4nŽ‹hF8EÝ¥‰â̺KŹ*²&Š+5Q\AY%¼4Qú¥Èm¹ê7M”4§þ²¾’ÍsE¸º•+µÒk¢”$Ž´EciY#}Y%¥F„€k(8Õèô¨Ô!gœbP* ¡'_ãWœ’¡nÑj!üõ…³#ìÌÜÞÓÚ((=L«ºÕ§ä¡xHÃNÛ­7Í žªKR±Cë2%ŠêCáS–VBAëåE…]ª;ЏL(|ÒV“Ë çZ;.GßV‹Ö°¦]Ÿ´)²T}RGYñÔ‡æ(_ñi­Bsh¹¹²¦²° *uYPú”\‰ÈiÆKj•]‹ÓºA¤zH¥¢Õ´V]õ"o?ÿüöÓ?¾|ÿý3’£½ù÷·Ÿþ¤t=þíÓ×ÏÿúÞ:겿~þokßfýúùº¦9„õË/ –Xš˜'¬´`…–ðÀŠXüŠÕ£Ü°db…G,¿`¥ ¬XŸ°b^°ø€ËÄJX²`ùVœXüˆE¯X=Ê +L,ÿ„%eÁ’–Ô%ù+.XtÂJK±Â+VrÚu/uÏKÝË©îeÖ=?Ö=/u/§ºçY÷üƒº¿vó©ÒyV:o•N£%¯P^K=Y±þåË×oßgœýô ‹ôÏÿþ}¿;-ê“SYÏ…O=fO„­'½§j ³ Ÿw_¾Ã©îìû°ÖýˆüòMeIWåJ—A[ºÂæ„fCP~t²$+œ‚fCÐÖt*.šEOôäÛ/E¿Ñ¥øJ׬N—v—³7|yt¹T÷1|?{Ão½áOµäg7øðàªíÅ·‘ïtýk3 ëtýè©k/ '—Ëz(@©eîN»—àý +N,~ÄzmŒÄ&–?cõ݇¦TQ7v—üx ˰‚¸Ža„ÙÁ¯wÒî2M—òä2¿V‘Ù°xbmM“yÁª§Ý£þ%—ÇÝi‰äPÿ’óÄŠg¬k÷1’,s÷c7d¿D—cȯÝ`aÚ1ðîrvCªO.AhdV¬)e„;ÖšŠSoLA(é1‹ ”“ ”)%>r\¡œ¡LA(› ܱdÁ:qœ‚P6A¸c-ý„2¡Ä§Á(‹ ”“ ”)EoƒEÊIÊ„"?hók÷IÊ”€²KÀM·¬ФSïYÆ¡É ›yw:ïƒ]+nNÃrÆ'±(S,Ê&ÇîNàTmS,Ê&÷ÝKð© ¦”MnXaé‚c\SÊ&·œð©î§”]n öË¥ÃËÔq^÷§Çq3…£ìÂÑœ\.éT‡SÊ®·ÝKGœ¡LE(›"ܱ–þ8Ç5ûcW‹+Ö¢-Ê k–ý.×c8 ?™ÂOvá·ž)¯sÐÊ¥Ÿ©ÅyéÖ©q÷9»c¼î£úš:7¸îæºôÃIÆòT…¼©ÂkéŽS\Ò»£ë&r>†w®Yª¿;6Cß*K}öï®^h0Ô¢|ÝF¿i ¾üñå»·Õßv—äá3_ó ‚É0/YSš9V#ÌJ‚yUÆ«÷æ£-Üg쩃@i¦õUÍr][j*L-¶æTÈbÁ"•+E«óü~-ßÈð [;ÙRŒ;Åf÷ [gh¹™éæ>ÚòÁ=ÈÖKåà­ÒûêHDÙší”5Ó" (MÆÕyy¿–ïÎc» 0£Å"ÌlìB‚yÝ‘0•l { ÌKa-îá£-ÜWì+dÞ“ygÅ8 f&ØÒ Ï .]±z¯ï×òÝ;ƒmƇÁ6Œƒ`° Ñj’Á6ä± ¶¡ŒU ו¿¸‡¶|w/­´ø†0L°eoÉ•v #/`ËlÞEšy'ßœëêÁ9Èòȼ€,Çád9Y¡Ii¦åZj»“,6t„÷–ƒ ¬ÞGpíC ¯4®ÅœGpí&¸Ê¨Š(Í´À#xt-¾x‡¶|p²2Š>‚lÿ‹ &ÈʸL#ÈʸšÐïž-ÔäÛâ;\´å»÷¶ýó?¼¶ý#O˜`GM&°íŸbÃÛþá]êç®^«ÝÝÒØÙD•z¹µ3°±xs*]UÒØÕ¢ê‡ÎƒHåCO*Fª³:Ç›h:ïnKÛÐÓˆQHl¢DýT›Ñ˜?Äv_`Ä[1aÂß‹ ØX¼9Å ¤þÇ£¾ÑØ™Ã$±’Áà¡þ‘†Z¹Y=XL6êŸ<½º:ïnkÛÐÏN‘«Ý|$Ö87Ô?¥R ìÆ<Å@£þ!çâWE:ÜyÔ?ŸÕ7;»'Rcgš;›Ô©±3qœZèå6œ€ŽÅ›[ŪҡrcgéÎ]F¹±³äçÆ®væ˜_ïx¡„óA…aÀQ´ÃÂ|£heŠñFÑîKLêÿV«6«WSAä·¾ö‡Ã™b¬Q´sÄT£hzC†¼À(¡h±4n&‡K‹<Þn& c±¹ý?fŠê endstream endobj 5255 0 obj << /Producer (pdfTeX-1.40.28) /Creator (TeX) /CreationDate (D:20250703135405-07'00') /ModDate (D:20250703135405-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.28 (TeX Live 2025) kpathsea version 6.4.1) >> endobj 5202 0 obj << /Type /ObjStm /N 53 /First 522 /Length 2913 /Filter /FlateDecode >> stream xÚZmsܸ þî_ÁN§7N;‰Å‘T'M'±“œ{‰íÆö%í5ÑîÊk5»ÒޤMâL|ˆÐjMåeúÅ!‚ÄAmR•H‘ˆT%ZHé°a„ҩЙdžVKl8áÉx64-R›Z2úØ’BÚ,9€–2s1-”ô[¸~FX*”hY¡|ŠJ‚N4­ç…Výh&´I,¯Ó()´“ t(%´w8Wia’WVFE«¨TC¬”Æ&„9a\F˜&s„e"•1 ´B¦h³qth ai Ë» hÉH(²R"?ð›Uý*NXÓ¯â…M‰ŸÎ„µµë¬K©%…õ&F ›á¢Êhá…ë#ÀHÔ.v*Ͱe…ÓŽäœp†¼k¼p©£™pÖ!ƒ4Î)Ü¿T 絩.£Ýâ>Ipnj ¥ÒƒÇŽÎòuÑŠß½}› †$â8ôŽz.ô<öœ ½Œza :˜Õ·ñ$÷þàèU¹.;^߸'=°íêmÕä SÄ@ÿžPÄðYÞ¨l]/¶«×NÃÚÏŠ/eÑàØ|Û|Ä!©ƒWžmËÕ¢¬–8ØÝÒüE=ß®‹ªË»²®@T…=<~zò@hÖ<ÎÛŽt„Ý?®×ë¼Z<|UV´ÊiÕÍM>/`NšÝ·&âúù‘¡ º)WôMS¯ñßë³Ówøo[oT*eÆÄª›r¹m@þå®mŠE‰hkzä$ïròÂݦ÷P<)fÛå²hPT3t“oWJçÍ’œE[©ï›ùCL§—‹¬©¢Ö´EMþ©·Ç(¦ÔΛr¶L2ÚËÑÎ÷þ%Ë’h´¬ðï,ïæ·a[Ð…*ýŠ`‰›“Ï»òc1§ð9x6ˆãªTÉ}×LšOÜð÷’´¶åÒöéEI$Mؤ Î §V¤eSÎ;˜J2áà¾ØVstí^ðÙËëS Y;ôzƒÛ._­Â‘Щ»oÎ}Z“#c‚ж͗tNÂÙz™oÛ¶Ì«Ëm8ApcÆ/Ëm½Ÿ‹Õã2P?]oV弤Hj!ßO £uÓá‘•÷Ùïó`Ɉîiµ(>£¾§{^‘R3<šþ«üªx7Ò¦RÇ3Ì}2ñvPôøû„‰˜¾Ê«å–'Oó(ûmšº«çõ Mgàu>?¿Ä1¢4+«¼¹£,Û®)gÛR¦,Yr ƒ{éP#(òºèò‹ºEW»„^—ó¦nëÚš·eµ¨?ѪÁR¤½ˆÒIt|Ϫ©u"לo`sºº¡sôŸo‚ : Ùðì$×g£þè0-·e²ù>¸(ÈOšåÁþKÊH”Sküû´½[oººÃh°Q Žx}gvdÒN\ŸÐa ›{ÑÔKÈë>Uê`웢SwØÞË"oú¸ žGV7Ã}¾iŠ›ò3¶êkŶ_Â!¤û×D÷Þ>S–Œ ºÄËwŽg#©Ë®Ùî²W {UÀyÏ»~ÇK:³t#‡lpÕäU{S7kš\rDSR)¢ÂVó}ôà"‘ ~wrdÚuR"2Ö]C0?\€K«Þ–±S™ø¯9О­Š>©Â-éíKÑGq0äímA·ÓMY¬}°ö)9ß•MÅ=”"ZŸ&¯ŠeNµXˆ›|± Oï;cd E6HZfõ³wÂ’W%¤¼Ä—Q=DùT9V\UuGrÊåX>ULµœG£}~Idû\X4¦ ¡4·w—HÇý¬OÖÊ'Üo ZöÕG¶a"Uc\ôÒ5šãÂÕ4_P)…Ù4 ÏËf¾¢z€ ¿ùªÜà†§ÌCHÞêÃå3¾Ka‚Ë<.É¢ k.¦‹0e3¦39#"H5PÁ.{(ø»XÏ(tù UT«pNȵ/è©›YÞôy˜?w™C%o¢º¥×<’ЏÝwTލ;œ3pž^­vÝfK¾Oøé…Òˆ1½›Uýi~›c ¢ùªÄô”SE“DÔÅ,Q[5¼³š;àÆU<äûE Iæ6_ô”ðñ‚áÍ-¾b²QŸ6X3P.¨Ö»…lV£¨+£ƒ¿Ó?ÈEËÅçG¿{tzòªðpïWEð÷jÝü‚ðluìHB0E0ÝDÐ"˜íÀ?!E'£§È˜ÇXv’ðCó¸ÎˆÛ#á¥ëÔˆÛ‚2AtDNŠ ¤£4¡¸‚­ðgB%®M‘f.{“¬Ó ØçôÈÏ!T#:âò„Pô´qù+¡èj3²æ)¹ m´#ô¡ÈÛNòØìIO?¦A$îFÄOEânDü9¡H܈¿ ‰ûÅ—„bøQüL(FI6%›=éIâ§4ˆûœù‚¿ ûìµC¡xOµ;ô¡àE/“úšP…¨Ù¡g„jDýñÍžô$ñs/z5¢xAhŠèˆâß /z=¢ø†P‡èˆâ%¡Ñ‘C®E‡5E|`³'=IüšzÑŒ(þJ(z1Q|K(z1Q|G(z1Qü¡è;rÈ? E‡X;E|`³'=Iüßt0Í(ÿK(Æ"WºPþà«Pê!¢ÀJP ß—›zÕ—DüQfžÚL1Ô¹ˆ#ÁXôcQ#GK"¦ ~Áoy=G^Òâúåü ŠMQÑ«cÙ Û(WŒ“LÄl7ðó“´\ßõúÄú²­J¼(AÐû&{xKëÙðjã^ÿ,rë#ˆM ¯ÎOMIUëð%i“¯ŠŽÞuf@ºÛ&Ü¿r€aïèµÌŠÁMüˆüÊcæ"¢#*;Ɉ0<‘J¬^Òv Tú‹b¶Ú…˜já}NUáⵋ zhé£vp|{[nB Ï—` ¯~‹P6úÆT2·0 pö°~>ʸîkWå‚ê@Ï}(úèƒ{ÇBëºînGå*»»­a:>ëMT»ìT³TÌ®^}ÄmN—Ð÷#9|³†GÏü=Ø`'°¼CÿñÞÁ =GmÈSíÝ—»%–j|Çuè5pd”ƒ^ˆHXTKxTP\ñöu·T.k¾ÌáÉð™ÃxVó;ª]yb(³“¡»ž…ïf6òÙX÷H4æEd™/ëŠÞÙ)ÀÝvFƒCºÏå£ãó³«çgW—hKp2ãŽ_Y6Ã÷Ní¢ËoOßNvàõ l¯ø-•ÁJhHn(nhnnDæ?ÄßFàµ1±°åIŽžYhxVî£Ç’ÄbáPÚ$^Ù3AÏ= •4X»ÞÒçLO¬Ì =3̘aÆîÉX{\)IüuéиxጠfL0c‚»'cåYt,`b«$°Sái@¿Å††áFÊèºöÉwi49^Ås#¸HI&!™„T?öeÿ?é1ɶI¶M²má£)ýþ;ßÙ¾ùT²‘ŠTld(é·ãÐ0_yIOû¬B± ŠmPlƒb_+¦¡“oWç{ÅkÐLY3eÍ”5{R3 m¿z÷Od·A…û?óÒl£f »Ú0oüã_Ó(ÿüX¶Õ°­†=nØã†ÙÄŸi§Cøë†¥lFüÓ ‘Žgž- §ác-£Ww›Bç]UæÁÑV¾øˆòÁÑù¶ÃÏiùꯜ4|(î§¼†ÂM]·ËÚÿT"?GgÛ5PK¨}!¯>G—âèD <07250A219AE2344867200848B6D15B0D>] /Length 12553 /Filter /FlateDecode >> stream xÚ%Ýy˜do]ßýº{Ÿéî™3S³ÏtMϾöì35û^5ûÖ³¯5 ÃæÃ“K/ñWIŒcHž\(£4 ÁQZÛŽ$ÚJ‹A¹@)hÁ`„`U#ñg’‘²]€œ×ýûç}ÝË©ÓUçý9gºëÜç;™Lfù÷B&3?2¿˜¢ûjŠÞd:2™¹::2Ù—´âXgÈ ý`ºÉàÝŒ‰ýƺ¡+dæ½5Ž…“pÉD/ôAOÈÌÿÏq“óPÌd2+¾—"ó=³s¡`æÁ|H`,„,,‚Ű–Â2X+`%¬‚!ÈÁj†5°ÖÁzØal†-°¶Áv°vÁnØ{aÄ#_Â!8 Gà(ƒãpNÂ)8 gà, çà<\€‹øe¸Wá\‡pîÂ=¸à!Ü‚9!³ð@Ô= 7Ù:é›ì\µ ÎÁy¸á.<‡)Æ»aÌ…~ÈÂ"X ka;Œ€ŽÛéø“ŽLמU0Wàª3´í¤kÇ®³±}œµmgmÛYÛvÖ¶µmgm[¼ÛâÝï¶x·Å»-Þmñn§ñO2 :¡ º¡z¡æÀ\臄y0X ! ‹`1,¥° –à X «`r“}9dFæÄ7¹Ú!¹é§ì›ê‚4¬svEìƒô£Î™î€–Á&x2‡.£•—ô* ½Ð[àäá œ€\‚{_›ºþùw¼¡Ôê¢ÝgµÖÂ:Ý3Zëaƒîi­°I÷”ÖfØ¢{Rk+lÓ=¡µFtk퀺ǴvÁnÝ£Z{`¯î­}°_÷°ÖÈëÒ:‡tc+nrD7¯÷wL7¾,þðºûµâ;=¥FüXgt÷jÅcPÐo¨çtwk‡ ºñÝ_„Kº;µ.ÃÝøQ¯Â5Ý­ëpC7—Q¸©»MëÜÖ1J¹«»EëÜ×Gü<ÔݤõëF=O ¤»Aë)<Ó.ŸÃ ÝTr˜IÙ9õ™œ ÆØŸqöÌtê®Ñr Ítëk9fzuWk9™fæè úŒ3j¦_WøgœV3ƒºNˆçÖÌ|]'ÉŒlf®gÆY6“Õu2Í8Õfë:Áfœo3Kut3ql¹nœˆ;X©ë䜉?mH7î%¾µÕºNâ™ø9bäãŒ:FÞÉ>ã0ÍÄÈÇ÷ç˜ÎÄÈ»(Ì0#? [31ò.3ÔÎÄÈÇO.31ò.23B3#“„ÍÄÈ»͈ãLŒ|<¦²;#ï¢5#è31òQ€ÈÏÄÈ»¸ÍˆüLŒ|´%ò31ò.‚3"?#ÕŠüLŒ¼‹åŒÈÏÄÈLjüŒÈ¸¨ÎˆüŒÈHÎŒÈψüÈ3-‘Ÿù1›ù‘)i‰üŒÈÈäŒÈψüÈc-‘Ÿùžù‘y¨%ò3"?"í3"?r_+¾BäGâvq÷"?rW+¾‘‰;o\äGÒŸÖñ¦4òÅÉh‰üÈ-­ù‘›Z] ò#£Z= ò#7´ú@äG®kÍ‘¹¦5"?rUkˆüÈ­D~ä²ÖBù‘KZ‹@äG.j-‘¹ µ D~ä¼Ö ù‘sZ«@äGŠZ9ù‘‚Ö0ˆüÈY­µ ò#g´ÖƒÈœÖÚ"?rJk3ˆüÈI­­ ò#'´¶ƒÈ×Ú"?rLkìöïLT{Twì5vÏØÝ}°ßXt~X÷ä=0vH÷ 2ûqã#ÆËëÆtÌXLIÜU|'Œ=1¶_7~¢SÆb|âÛˆÇàŒ±§ÆöêÆ£V0s?B<ÎçŒ=7¶[7š¹`,.~üè2õÛŸdŒíÔö¯‹!ŒG-æåš±c#º1a7ŒÅtƃ3yÓX—±mº1Åi¼û[QcttîÛhl‹î=Hñ@½h,ª}éá¬õÛ¤û‹A‰xéašWYflƒîSxf,3é9¼0¶ÂØ:3¥'Ý?ùÛŒVúyç—]õFü}´ª:í3¶F· º¹Ž ëö@¯±ÆVëöAúþ’R¼Èätý5¶ªßب±!ÝHOÉÅx^®ÒóÍ3¶R7ôä\˜^¡»²Æv[®ëO¼U‹¹˜,Ó]鹚Í]4¶T7N¤¯È6O‹›Ä®4æ <âÅUñ ;k,î>~˜ÕÆ\šGüi¹*ˆ5Æ¢¼øÖâA\çoˆšºëa#l‚Ͱü1ºjCÈ\ê*¶ÂØ »`7ì½°FBæÎã+öùA—µòpÈ@‡“p NÃ8 ¸—à@È<Ü÷\„ƒpNÀ5¸£pnÁ=H~ÝžøÚ;p®Ãm¿Ûæ Z}á~ȼõ;ñà!”à©¿ÊãÄ“ù?Š­g!ó½÷i‹èx'áx™ñí8!§ãÂ5Þ2ïú»8Öçù€ãÒ4¾ d*ÛãÄ HÝ8µãÂ0>?d~êGâìB/;2xkìŠÏ¸øŒ‡Ì?ÇDo|EÈüÜõØõÙÆ%gÜ 6>2ÿ~"N8…Æýݸ3ý“ñ#âØØègÄWÈø¦ùåñ «•!óÑ q;Q—ˆqyß28ák‘ñ=!3õ—±+/ãò2¾¤d\Æw‡Ì¯ÿjÜD@ÆehœÕñ¾Õ¸2¿õö8+4ãB3.4ãB3Îù¸äŒ ÍøÑùƒÅi\|ÆÅgÜ×1ãgBæ‹Í8+9ã|Ž«>ô¸q9‹ñK!ó'çãÆñ;¹•qá®qá®ñÛàÛžñôí6_{Ù/‹Ÿè>ˆÔ¸øŒ Ò¸o…Æã·B1H÷Bæ/6Æ—IÝxš°žÙ³¾ÞÉ@€è„.è†è…>˜s¡`æÁ|H`ÄožÒÄ~{Aü CxãOfœñ ¦Å°–Â2X«aQÿ=¾l%,‡ì‚ݰÖÂp‹›qcס—×´ö…°úÏãØfØbb»Ö&تwº¶éÆ÷²¶ëÒZ#°v„°ùÕ˜Îm!l-ÆÖ²¶}$¶‡°ý{±u0„¹øÃÂÎvæcw?HÝž½—?_•ìŒïå aÿÇâÆ‡C8x!¶N 8Çá´Ä18£ßýQ8‘•™ŽÂ±¥ñ]í áxl­áĺ¸çspŠp p1„Ó{Òמ9·» —B8{±Èûóy'hœX¿[7© ñžù‰4*?s8NøžuBÚ'¤}bDy"·ÅMÖ€°N°:±.„ñ_Š29± 6†ðÑ÷ı- è[}ç&b;±v‚¨Llá?¼v Ò0üÖWcËy4!Žñr˜ž8Ÿ*ʼný>ƒ‚9ᄘȇðŸ¿g%{B&'Òœ~>ÆbB'ކð•îØ‰Ó ÀgBøÓ‡qBÂ&Do"Íiã/âX1„ÿƒ4!Ž’8qÒ$~kWœ¸ñ8_ áåŠ8v5„¿›[7á–÷Z|ã·CÇÊwÄÈ;Ï'îÁбê'â+/óE÷Dü¢Û×à÷CGîûã&":ñÐvñsæÄ3xá¬õÍçNW̉RèØð›± Æñyèøú'2¡ãè+q¢ ºÁ—ä;{Clj½éìÉ÷§8õç)Î\Nqö?¥(ÜOQ\_Ös`.ô‡ŽóëÒÙ ?“âÒò—?œâÊ…¸±ïhw΃Ðq5ıÁÐqý3±5Cú ~éNËÂBXKa%, ¯;7Yk þžþ²ü¦•qÂo‡/oi­…0:Þö¦8»6À6Ø:Þþ·qb3ì€í¡ãGg㘯wîß!ïÜ ûà ¤õ_þbÜn?€Ýþ»äKʹ¡ã]Ïâì!8 ‡CÇO~=Žxçâ$áXèxï7âìi8 'à”Ot[ë<\„s¡ãýïˆûB|ç5¸:~¾Ç|Û½3þ®‡Ž_©Æ‰0 q÷àVèø­ž8{Ç¿ƒÎÕ! ܧ?'@ …ŽÏ DZÇÞUü×þ9< _úJœxæd_¿KÝd§±¡ã«ñe“ñ>âY(„Î;Ǥi²+t|³»â89sBÇ«¿ÇÄlRT&Åbr^èøöOlj¤dRJ&³¡ão^ƉÅ~Fü²_r&—…ŽïýlœXnM M® ]CqÖM¤I™\:;Ž Í¤€Ln ÙvÛñº&4“[BçŠ×6ÞÂ5)9“B3¹3tnŒçÛänïÊaŸ”—É}¡s׊8!C“¢2™ßÇÄlò'ã©1)9“B3yÇ$bR^&ã­·Gp?t¾ò8+W“1 Cç;^3ÿ!=äo•û)19ÏC翹7yº/Ž·kº #tþô7c·z ºCçÏ.Š}Ð îÊ „ÎoŽƒ~Pü½ä¢®;5à a,…$tþò·âÆ‹! +`YèüØßÆ ª¾|¨5+Cçô«q"¾ûaÈ…Îj;Ž­Ÿüblm†M°6Bü­Ï½¢á ° ÖÃvpëhxÜIÞqã4R¿w6:?w Å—ãîw…Î?zwlíü‰ØÚ:¿öéøM|W{Cç7>'ÒèµÞ[ûCçŸ}:¶„ÎoýJlåá ‚ÃpÜÁ>:_ýZÜÎ]­a7´†ÏÁ‰Ðù—'NÁˆÇù2¸ç5ìž×ð-8:ÿú'ãÆn _‚+ðÓÐù݈›Ü…{pܾ B×àG2¡k^%n÷†®ùÕØá²¿YïeL"ÆúB×:×Éž±¡±Â5'ºCכߛîtë|ˆÎÇÜ$ë ]ÛcÂÆÜ8€A¡±þеãÍqv^èÚó–Ø’«1A¤±%¡ëdWœXËA¸ÆV‚øŒ‰ÔXâÝ/)š1±[ºNm; tL¤Æ¤il+ˆÏ˜äŒ ͘¼Œí„]àŸ§±=°öÁ~ {Œî1ºÇèstÌ Ð1.Ç6„®³oŠ?÷(œ€ c‰ÀØyˆ›ø1VÇØã|ìtèºú‘¸¦ÇÜU#tÌÉ4v;tݳLÅ_…Òô¾#~ò'ð(t•~>n" cnÁ޹;ÇJ¡ëõsb+Þ‘}º;~Lw–éY¦g]-fCèúáßÝ@ü¬KÆ,«³®%³½¡ëG—ÄMˆŸuwxv t½ó=ql0t½{Sl?Kí¬kÉlüµ›¼Yw‚g‰Ÿu šMÅ¿Kš¦lŠgãPèú` Ò¬̦V?ø½Ø]fÖG]º>ô"ŽIÄlÜ©€ÌŠÅ¬¼ÌŠÀ¬øÌ® ]¯¦»ÿÕó)&¯Ä—¹ Ì® ]¿–]qV^f7†®Í‹c›B×o¼>¶„fVhfehVrfEjV|f%lvWèúL1ÝýïîLñ{ûR|ömñµ‚4+H³r5+³b6+W³ñ—¢ƒ¡ëóÿ(}Åï¿5ż5¾Lrf…®/¼.v‡®/í‰-™Y ›u}™u}™•ºÙS¡ëË7Ò|å\ÜNàfEo6ÍÕÝcb;+p³ÅÐõÇ?ÇdröbèúÓÏÅ®KЬkά+Ò¬{ï³â8;ºþ"“îþ/â…{ÖõeöfèúËõ±ßQHçìÐõ¿ÿgœ¸ºþêÅ–ÏÆËÍÑY—ªÙ'¡ëo>žîùoÿCŠ¿ûTÜXDg]¯fŸÉx{ªåb4[ÒêÝ?r5ºçŸI‘lO±`mÆD7t†î…?»]¡{q9¶æÀ\èƒ~è…èÁнꥻú/)r_–À¼Ð½ú ±;?t¯ûNl-€…¡{ã×bwÄýöj-…°VÂbX‹`² ÝÛ0†Oèy–þðééï·)vãî×Àêнû-±; `mèÞ¿,Ž­ ÝG6ÄÖVØ[`;l†Ø;`#ì ÝgÊé:›†°»ð†ÅÑçÞwµöCüX`äa7„]p(t_ý^úÚkí×Ó?’ºo¼vÂáÐ=úÙØ¿Ó< Ý·ß»§à4œ„3pÎÂq(À1(†îÇi»ÿÏOþ4Eéëq/à\è~67vχî±u®Á¸—á\‚Q¸7C÷ö7]Hñæ“)Þr8îåÜ Ýo}íßÝoû±õÁˆWåûðîALì]H?ô}9ÝéÛ?Ÿâ‡?“â•OĽ¼€g¡»ü«±ûûrÜd „î÷7vÓðÿÜÇVÁBX ` $°æÃ²ÐýK?˜îô—¿?ÅGÓ¿„»'®Æ½¬„å¡ûW~/vW„î©7ÆÖj†¬!X « ò'Ó«Y÷§ìïÓ§ãË6ÂúÐý;×cwƒ ¥ìw¯ÄîVØ[`;l†Ø;B÷ç?–îï÷=Åüb|ÙnHÏ€/| vw…î/í­½°öÀþÐýå¾8q„î¯ìŽÝ|èþê{bë0Cp4tÿ·WãÄ 8º¿ñßc÷xèn­“p ÎÀY(@ÎÁy¸§C÷_õÇ—]Ýý†Øº WÀ_Ö®†ž¾¿Ï„ž¹ß޳·áŽÃ´NëÜ…›pÏD;}4ÌýxúKêÜZjuî'bþ¦OÀ±0÷“¯½—ãaîïl‰-Ñ›>úç}™Ðÿ{÷ãØiÄiaÇi9>úÿët»?ù±_{kÜØ…bú|èÿz9v/„þ?ýhl‰í´ˆN æô•Ðÿê¯Å‰«¡ÿŸŽ-aÖi ýßý|œÛé; ŽÓâ8-ŽÓÏ@®¦c®„púv¯Ä—ÅÅP]a ÷}± —|Çsõ4 ¬<oýÈ„wžŽÝnèƒôµ»Îı€9a`Ïþ86æÃ`8x,ŽÍƒ°’0pìïãDÂX«aq(̉›¬€¥WÅ·±†Ã€ÕMik ¬‡ ° ¶Áº0pç_ÅM6ÃF]°= ”~-Îî„°öÂ>8»ÃÀë–ÇíöÃ8 'ápxKwœ=Çà4áTø>gÏB\³Úy¸ çÂÀŒ›\„ p®Áu¸£pnA\¥ïM܇+aà‡Þ÷rÃ0ðO×ı‡%?…ð$ ü؉³Ï¬7 ÐÐÝнÐs`.ôà Â<˜ ,€……E°–ÀRXËa¬„U09X ðÖÂ:X`#l‚Ͱ¶Â6Ø#°vÂ.ˆ‹ ÷@\J¸â— „¸Xð0Ä%‚G!. <q9àIˆ‹OC\úwâ‚¿"Äe~ç!.î»–ôÍ¿ òÍ¿ –ïÍ¿íÍKõæß²^…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…„…$†&½n¼Û¯âýóoûõòD¨IÇ~ADû¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢’¸ö’¨$®¸$*‰ë,‰JâêJ¢’¸¦2в’2¹ÖO&÷à><€‡ðÃ(ÁSp6&­HÒÓ´ßb™þ¦“³éäl:9›NΦãÜtr6Å¢)M±hŠES,šbÑ‹¦X4Å¢)M±hŠES,šbÑ‹¦X4Å¢)M±hŠES,šbÑ‹¦X4Å¢)M±hŠES,šbÑ‹¦X4Å¢Éy“ó&çMΛœ79orÞä¼Éy“ó&çMΛœ79orÞä¼Éy“ó&çMΛœ79orÞä¼Éy“s‹(û­šì·L²ßºÈ~ !û›œ79orÞä¼Éy“ó&çMΛœ79orÞä¼Éy“ó&çMΛœ79orÞä¼Éy“ó&çMΛœ79orÞä¼É¹Û0ý-Î[œ·8oqÞâ¼Åy‹óç-Î[œ·8oqÞâ¼Åy‹óç-Î[œ·8oqÞâ¼Åy‹óç-Î[œ·8oqÞâ¼Åy‹óç-Î[œ·8oQÛ¢¶Em‹Úµ-j[Ô¶¨mQÛ¢¶¯=aà—âç]ï߯Þ00ùÑôBñÉ5qŒýû-ö[ì·Øo±ßb¿Å~‹ýû-ö[ì·Øo±ßb¿Å~‹ýû-ö[ì·Øo±ßb¿Å~‹ýû-ö[ì·Øo±ßb¿Å~‹ýû­¸všýV\1Í~‹ýû-ö[ì·Øo±ßb¿Å~‹ýû­Ôþ€?ð¾ :¡ º¡z¡æÀ\臄y0X ! ‹`1,¥° –à X «`r°†a ¬…u°6ÀFØ›a l…m°F`ì„]°öÀ^Øûáäá ‚ÃpŽÂ18'à$œ‚ÓpÎBŠpÎø—à2\«p ®Ã …›p nø ÷ÀÚø/<€‡ðÃ(ÁSxÏsßs Ô9¯s^ç¼Îyó:çuÎëœ×9¯s^ç¼Îyó:çuÎëœ×9¯s^ç¼Îyó:çuÎëœ×9¯s^ç¼Îyó:çuÎëœ×9¯s^ç¼Îyó:çuÎëœ×9¯s^ç¼Îyó:çuÎëœ×9¯s^ç¼Îyó:çuÎëœ×9¯s^ç¼Îyó:çuÎëœ×9¯s^ç¼Îyß:¿u~ëüÖù­ó[ç·Îoß:¿u~ëüÖã•asø‡QO! |nuzmú¯ŸŒ]öëì×Ù¯³_OF°_g¿Î~ý:ûuöëì×Ù¯³_Oí~<: º z ú`Ì…~€A˜ó!°²°ÃX Ë`9¬€•° † «aÖÀZXëal„M°¶ÀVØÛavÀNØ»aì…}°@Â!8 Gà(ƒãpNÂ)8 gà, çà<\€‹p .ø ×à:Ü€Q¸ ·à6Ü»pîÃð ÌÇ'_>þJðžÁsàÜW¬ƒUΫœW9¯r^å¼Êy•ó*çUΫœW9¯r^å¼Êy•ó*çUΫœW9¯r^å¼Êy•ó*çUΫœW9¯r^å¼Êy•ó*çUΫœW9¯r^å¼Êy•ó*çUΫœW9¯r^å¼Êy•ó*çUΫœW9¯r^å¼Êy•ó*çUΫœW9¯r^å¼Êy•ó*çUΫœW9¯r^å¼Êy•ó*çUΫœW9¯r^å¼Êy•ó*çUΫœW9¯r^å¼Êy•ó*çUΫœW9¯r^å¼Êy•ó*çUΫœW9¯q^ã¼Æyóç5Îkœ×¨­Q[£¶FmÚµ5jkÔÖ¨­Q[‹ÿœ_jÅݧ¿A}sz•zõïR|o}c¿Æ~ýû5ökìר¯±_c¿Æ~ýû5ökìר¯±_c¿Æ~ýû5ökìר¯±_c¿Æ~ýû5ökìר¯±_c¿Æ~ýû5ökìר¯±_c¿Æ~ýû5ökìר¯±_c¿Æ~ýû5ökìר¯±_c¿Æ~ýû5ökìר¯±_c¿Æ~ýû5ökñ©7ökñY7ökìר¯±_c¿æi6ËÊæ½7@tBtCôB̹Ð0ó`>$°BÁbXKa,‡°VÁä`5 ÃX ë`=l€° 6ÃØ Û`;ŒÀØ »`7ì½°öÃÈÃA8‡á…cpNÀI8§á œ…ᜇ p.Áe¸Wá\‡0 7á܆;pîÁ}xá<†'à©Æ÷>Ï2¾÷9Ä'9¯p^á¼Ây…ó çÎ+œW8¯p^á¼Ây…ó çÎ+œW8¯p^á¼Ây…ó çÎ+¬VX­°ZaµÂj…Õ «V+ñÜï퟉oriœs#W,‹]Î+œW8¯p^á¼Ây…ó çÎ+œW8¯p^á¼Ây…ó çÎ+œW8¯p^á¼Ây…ó çÎ+œW8¯p^á¼Ây…ó çÎ+œW8¯p^á¼Ây…ó çÎ+œW8¯p^á¼Ây…ó çÎ+œW8¯p^á¼Ây…ó çÎ+œW⓬œWâó«œWRçó}Ë>ÿ©¾ÒN}¥ <’úJxõ•>˜s¡`æÁ|H`,„,,‚Ű–Â2X+`%¬‚!ÈÁj†5°ÖÁzØal†-°¶Áv°vÁnØ{a쇇ƒpÃ8 Çà8œ€“p NÃ8 (Â98à"\‚Ëp®Â5¸7`nÂ-¸ wà.܃ûðÂ#x O Oá<ÎÝÖ™_Ž&s^Ž$s^Ž!s^Žs^æ¼Ìy™ó2çeÎËœ—9/s^æ¼Ìy™ó2çeÎËœ—9/s^æ¼Ìy™ó2çeÎËœ—9/s^æ¼Ìy™ó2çeÎËœ—9/s^æ¼Ìy™ó2çeÎËœ—9/s^æ¼Lh™Ð2¡eBË„– -Z&´Lh™Ðr¼¬ ƒÉßÇ£¶' ®{záÙ÷–Ø¥»Lw™î2ÝeºËt—é.Ó]¦»Lw™î2ÝeºËt—é.Ó]¦»Lw™î2ÝeºËt—é.Ó]¦»Lw™î2ÝeºËt—é.Ó]Nu'J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%j%ê%Šò$êñ$êñ$Jñ$Jñ$ªð$ªð$ ð$ ð$jï$jï$Êî$Êî$*î$*î$Ší$Ší$êì$êì$Jì$Jì$ªë$ªë$ ë$ ë$jê$jê$Êé$Êé$*é$*é$Šè$Šè$êç$êç$Jç$Jç$ªæ$ªæ$ æ$ æ$jå$jå$Êä$Êä$*ä$*ä$Šã$Šã$êâ$êâ$Jâ$Jâ$ªá$ªá$ á$ á$jà$jà$Êß$Êß$*ß$*ß$ŠÞ$ŠÞ$êÝ$êÝ$´KJœ—8/q^â¼Äy‰óç%ÎK±ªç¥XK€óç%ÎKœ—8/q^â¼Äy‰óç%ÎKœ—8/q^â¼Äy‰óç%ÎKœ—8/q^â¼Äy‰óç%ÎKœ—8/q^â¼Äy‰óç%ÎKœ—8/q^â¼Äy‰óç%ÎKœ—8/q^â¼Äy‰óç%ÎKœ—8/q^â¼Äy‰óç%ÎKœ—8/q^â¼Äy‰óç%ÎKœ—¨-Q[¢¶Dm‰Úµ%jKÔ–âà`Ü^ˆ¯‡ÁãïM/7×¶Ç.ñ%âKÄ—ˆ/_"¾”Š_ਫ਼gt@'tA7ô@/ôÁ˜ ý0JGœ FœM`,„,,‚Ű–Â2X+`%¬‚!ÈÁj†5°ÖÁzØal†-°¶Áv°vÁnØ{a쇇ƒpÃ8 Çà8œ€“p NÃ8 (Â98à"\‚Ëp®Â5¸7`nÂ-¸ wà.܃ûðÂ#x O Oá<ÎEeAóçÎ œ8/p^à¼ÀyóçÎ œ8/p^à¼ÀyóçÎ œ8/p^à¼ÀyóçÎ œ8/p^à¼ÀyóçÎ œ8/p^à¼ÀyóçÎ œ8/p^à¼ÀyóçÎ œ8/p^à¼ÀyóçÎ œ8/p^à¼ÀyóçÎ œ8/p^à¼ÀyóçÎ œ8/p^à¼ÀyóçÎ œ8/p^à¼ÀyóçÎ œ8/p^à¼Àyóçέµ_Pä¼Èy‘ó"çE΋œ9/r^ä¼Èy‘ó"µEj‹Ô©-Æ«ü­0X,Å=¸¿Õï_J¯>ÏÖ§xÛ‚8!E(Š@QŠ"P¢E (E(Š@QŠ"P¢E (E(Š@QŠ"P¢E (E(Š@QŠ"P¢E (E(Š@QŠ"P¢E (E(Š@QŠ"P¢E (E(Š@QŠ"P¢E (E(Š@QŠ"P¢E (E(Š@QŠ"P¢E (E(Š@QŠ"PbXÖuáÐ ]Ð =Ð }0æB? À ̃ù€Š@‚:@ê?–ÀRXËa¬„U09X ðÖÂ:X`#l‚Ͱ¶Â6Ø#°vÂ.Ø {`/ìƒýpòpÁa8Gá‡pNÁi8g¡E8çá\„Kp®ÀU¸×áŒÂM¸·áÜ…{pÀCxá ”à)<ƒçÀ¹EÆ óœç9Ïsžç<Ïyžó<çyÎóœç9Ïsžç<Ïyžó<çyÎó± çùXû‰ó|¬øÄyžó<çyÎóœç9Ïsžç<Ïyžó<çyÎóœç9Ïsžç<Ïyžó<çyÎóœç9Ïsžç<ÏjžÕ<«yVó¬æYͳšg5ÏjžÕ|¼ $aðûÆãÚ_9™^´þÕ‰Øå<Ïyžó<çyÎóœç9Ïsžç<Ïyžó<çyÎóœç9Ïsžç<Ïyžó<çyÎóœç9Ïsžç<Ïyžó<çyÎóœç9Ïsžç<Ïyžó<çyÎó©ó¬‡Ú³Ct T¹: ˜©À0¤¶Í'LJ”/*@·é‡ÔVR¦xè(H3t®Â5¸7`ÔÔò`áÕcCžcòØëW†îÃPíc註0ô<Û<ôžÁsà\‘ŸlŽóç9Îsœç8Ïqžã<ÇyŽóç9Îsœç8Ïqžã<ÇyŽóç9Îsœç8Ïqž‹õÜ8Ïqžã<ÇyŽóç9Îsœç8Ïqžã<ÇyŽóç9Îsœç8Ïqžã<ÇyŽóç9Îsœç8Ïqžã<ÇyŽóç9Îsœç8Ïqžã<ÇyŽóç9Îsœç8Ïqžã<ÇyŽóç9Îsœç8Ïñ›ã7ÇoŽß¿9~süæøÍñ›ã7ÇoŽß¿9~sñ±7 þó%QÞ…0øžûé%èCï]ösìçØÏ±Ÿc?Ç~Žýû9ö-rÏ6Øo°ß`¿Á~ƒýû öì7Øo°ß`¿Á~ƒýû öì7Øo°ß`¿Á~ƒýû öì7Øo°ß`¿Á~ƒýû öì7Øo°ß`¿Á~ƒýû öì7Øo°ß`¿Á~ƒýû öì7Øo°ß`¿Á~ƒýû öì7Øo°ß`¿Á~ƒýû öì7Øo°ß`¿Á~ƒýû öì7œñ g|ÃßpÆ7$¢! ‰hHDC"ш†D4$¢! ‰hHDC"Ñà¼Áyƒóç Μ78opÞàÜÒɬ¥“YK'³–Nf-ÌZ:™µt2kédÖÒɬ¥“YK'³–Nf-ÌZ:™µt2kédÖÒɬ¥“YK'³–Nf-ÌZ:™µt2kédÖÒÉl3Öm伫5rÞŒ59oÆÊŒœ7c=FÎ-ÌZ:™µt2kédÖÒɬ¥“YK'³–Nf-ÌZ:™µt2kédÖÒɬ¥“YK'³–Nf-ÌZ:™µt2kédÖÒɬ¥“YK'³–Nf-ÌZ:™µt2kédÖÒɬ¥“YK"³–Df-‰ÌZ™µ$2kId֒Ȭ%‘YK"³–Df-‰ÌZ™µ$2kId֒Ȭ%‘YK"³–Df›ñjq9 ŽÅŽ›§ÂàÄÒ³û?•b—i &³Lf-˜ÌZ0™µ`2kÁdւɬ“Ù—ñyÄè÷|üØkÕÞBXø®oÄç/ã3…œ¿äüe¬³ÈùKÎ_rþ’ó—± ç/9ÉùKÎ_Æ‹Ù0X{wº( þô/¹yKoÇîÒ0ïûþÿ´ûîVì®ó>ýŽ´ûÝ7eÂüU¯½¡Õa~þ§ÝÑÿ–â7¿“ IϪës)Îþ“¸ÉÖ¼noÚýð¿‰Ý‘´ÄÖŽ°`Ã/ÅÖΰà̹LXðúç)þÙgâØ¾°àW%í~¡»ù°pË×2aáùŸÝÃþðŒeXçB,5ÿ ?t5Ö”5Lc•á$,üeEíŽ% Ý ˜Ÿ‡X»\Òݱlùeˆ˯B,V~brTwÇå· V'¿±0¹Ú½»cMr¤ìŽåÈ=)µ;V"Waww,B®†îîX\•ÜÝÊ⎦Ÿí?ú¿Rª~;ªré¨ú¶£ ÚŽzHo´Ô\U”vÔÇõñG}üQT1×QŸ|Ô'M@iåÑ… ªòè"PPyt ¨¥<ªxí¨gQF•§UAyt(ž<šu“G‡AÉäѵ Zò¨5®£¹URwTäÑÍ <òèVPyÔcP£Š"îådGÕU0vt(;º/,üX5=Ÿú©Ìÿù´f™ endstream endobj startxref 1229720 %%EOF asymptote-3.05/doc/asy.1.begin0000644000000000000000000000175515031566105014704 0ustar rootroot.\" Hey, EMACS: -*- nroff -*- .TH ASY 1 "1 Dec 2004" .SH NAME asy \- Asymptote: a script-based vector graphics language .SH SYNOPSIS .B asy .RI [ options ] .RI [ file \ ...] .SH DESCRIPTION \fBAsymptote\fP is a powerful descriptive vector graphics language for technical drawings, inspired by MetaPost but with an improved C++-like syntax. Asymptote provides for figures the same high-quality level of typesetting that LaTeX does for scientific text. .SH OPTIONS If no arguments are given, Asymptote runs in interactive mode. .PP If "\-" is given as the file argument, Asymptote reads from standard input. .PP A summary of options is included below. The effect of most options can be negated by prepending .B no to the option name. Default values for most options may also be entered in the file .B .asy/config.asy in the user's home directory using the long form: .PP import settings; batchView=true; .PP For a complete description, see the Info files. asymptote-3.05/doc/onecontour.asy0000644000000000000000000000016315031566105015644 0ustar rootrootimport contour; size(75); real f(real a, real b) {return a^2+b^2;} draw(contour(f,(-1,-1),(1,1),new real[] {1})); asymptote-3.05/doc/labelsquare.asy0000644000000000000000000000017115031566105015750 0ustar rootrootsize(3cm); draw(unitsquare); label("$A$",(0,0),SW); label("$B$",(1,0),SE); label("$C$",(1,1),NE); label("$D$",(0,1),NW); asymptote-3.05/doc/westnile.csv0000644000000000000000000001116715031566105015310 0ustar rootrootsm0,0.001(T14) 0.0,0.9973 0.1,0.9973 0.2,0.9972 0.3,0.9972 0.4,0.9971 0.5,0.9971 0.6,0.9970 0.7,0.9970 0.8,0.9969 0.9,0.9968 1.0,0.9968 1.1,0.9967 1.2,0.9966 1.3,0.9966 1.4,0.9965 1.5,0.9964 1.6,0.9963 1.7,0.9963 1.8,0.9962 1.9,0.9961 2.0,0.9960 2.1,0.9959 2.2,0.9958 2.3,0.9957 2.4,0.9957 2.5,0.9956 2.6,0.9955 2.7,0.9954 2.8,0.9952 2.9,0.9951 3.0,0.9950 3.1,0.9949 3.2,0.9948 3.3,0.9947 3.4,0.9945 3.5,0.9944 3.6,0.9943 3.7,0.9941 3.8,0.9940 3.9,0.9939 4.0,0.9937 4.1,0.9936 4.2,0.9934 4.3,0.9932 4.4,0.9931 4.5,0.9929 4.6,0.9927 4.7,0.9926 4.8,0.9924 4.9,0.9922 5.0,0.9920 5.1,0.9918 5.2,0.9916 5.3,0.9914 5.4,0.9912 5.5,0.9909 5.6,0.9907 5.7,0.9905 5.8,0.9902 5.9,0.9900 6.0,0.9897 6.1,0.9895 6.2,0.9892 6.3,0.9889 6.4,0.9887 6.5,0.9884 6.6,0.9881 6.7,0.9878 6.8,0.9875 6.9,0.9872 7.0,0.9868 7.1,0.9865 7.2,0.9861 7.3,0.9858 7.4,0.9854 7.5,0.9851 7.6,0.9847 7.7,0.9843 7.8,0.9839 7.9,0.9835 8.0,0.9831 8.1,0.9826 8.2,0.9822 8.3,0.9818 8.4,0.9813 8.5,0.9808 8.6,0.9803 8.7,0.9798 8.8,0.9793 8.9,0.9788 9.0,0.9783 9.1,0.9777 9.2,0.9772 9.3,0.9766 9.4,0.9760 9.5,0.9754 9.6,0.9748 9.7,0.9742 9.8,0.9735 9.9,0.9729 10.0,0.9722 10.1,0.9715 10.2,0.9708 10.3,0.9701 10.4,0.9694 10.5,0.9686 10.6,0.9679 10.7,0.9671 10.8,0.9663 10.9,0.9654 11.0,0.9646 11.1,0.9637 11.2,0.9629 11.3,0.9620 11.4,0.9611 11.5,0.9601 11.6,0.9592 11.7,0.9582 11.8,0.9572 11.9,0.9562 12.0,0.9551 12.1,0.9541 12.2,0.9530 12.3,0.9519 12.4,0.9507 12.5,0.9496 12.6,0.9484 12.7,0.9472 12.8,0.9460 12.9,0.9447 13.0,0.9434 13.1,0.9421 13.2,0.9408 13.3,0.9394 13.4,0.9380 13.5,0.9366 13.6,0.9352 13.7,0.9337 13.8,0.9322 13.9,0.9307 14.0,0.9291 14.1,0.9275 14.2,0.9259 14.3,0.9243 14.4,0.9226 14.5,0.9209 14.6,0.9191 14.7,0.9174 14.8,0.9156 14.9,0.9137 15.0,0.9118 15.1,0.9099 15.2,0.9080 15.3,0.9060 15.4,0.9041 15.5,0.9020 15.6,0.8999 15.7,0.8978 15.8,0.8956 15.9,0.8934 16.0,0.8912 16.1,0.8889 16.2,0.8866 16.3,0.8843 16.4,0.8819 16.5,0.8795 16.6,0.8770 16.7,0.8745 16.8,0.8720 16.9,0.8694 17.0,0.8668 17.1,0.8641 17.2,0.8614 17.3,0.8587 17.4,0.8559 17.5,0.8531 17.6,0.8502 17.7,0.8473 17.8,0.8444 17.9,0.8414 18.0,0.8383 18.1,0.8353 18.2,0.8323 18.3,0.8291 18.4,0.8259 18.5,0.8227 18.6,0.8194 18.7,0.8160 18.8,0.8127 18.9,0.8092 19.0,0.8058 19.1,0.8022 19.2,0.7987 19.3,0.7951 19.4,0.7914 19.5,0.7878 19.6,0.7840 19.7,0.7803 19.8,0.7764 19.9,0.7726 20.0,0.7687 20.1,0.7647 20.2,0.7607 20.3,0.7567 20.4,0.7526 20.5,0.7485 20.6,0.7443 20.7,0.7401 20.8,0.7359 20.9,0.7316 21.0,0.7272 21.1,0.7229 21.2,0.7185 21.3,0.7140 21.4,0.7096 21.5,0.7050 21.6,0.7005 21.7,0.6959 21.8,0.6912 21.9,0.6866 22.0,0.6819 22.1,0.6771 22.2,0.6723 22.3,0.6675 22.4,0.6627 22.5,0.6578 22.6,0.6530 22.7,0.6480 22.8,0.6430 22.9,0.6380 23.0,0.6330 23.1,0.6280 23.2,0.6229 23.3,0.6178 23.4,0.6126 23.5,0.6075 23.6,0.6023 23.7,0.5971 23.8,0.5918 23.9,0.5866 24.0,0.5813 24.1,0.5760 24.2,0.5706 24.3,0.5653 24.4,0.5600 24.5,0.5547 24.6,0.5493 24.7,0.5440 24.8,0.5385 24.9,0.5332 25.0,0.5278 25.1,0.5224 25.2,0.5170 25.3,0.5115 25.4,0.5061 25.5,0.5007 25.6,0.4952 25.7,0.4898 25.8,0.4844 25.9,0.4789 26.0,0.4735 26.1,0.4681 26.2,0.4627 26.3,0.4572 26.4,0.4518 26.5,0.4464 26.6,0.4410 26.7,0.4356 26.8,0.4303 26.9,0.4249 27.0,0.4194 27.1,0.4143 27.2,0.4089 27.3,0.4036 27.4,0.3983 27.5,0.3931 27.6,0.3878 27.7,0.3826 27.8,0.3774 27.9,0.3724 28.0,0.3672 28.1,0.3621 28.2,0.3571 28.3,0.3520 28.4,0.3470 28.5,0.3420 28.6,0.3370 28.7,0.3320 28.8,0.3271 28.9,0.3223 29.0,0.3174 29.1,0.3126 29.2,0.3078 29.3,0.3031 29.4,0.2983 29.5,0.2936 29.6,0.2890 29.7,0.2845 29.8,0.2801 29.9,0.2756 30.0,0.2711 30.1,0.2667 30.2,0.2623 30.3,0.2580 30.4,0.2537 30.5,0.2495 30.6,0.2453 30.7,0.2411 30.8,0.2370 30.9,0.2329 31.0,0.2289 31.1,0.2250 31.2,0.2210 31.3,0.2171 31.4,0.2133 31.5,0.2095 31.6,0.2057 31.7,0.2019 31.8,0.1983 31.9,0.1947 32.0,0.1912 32.1,0.1876 32.2,0.1842 32.3,0.1807 32.4,0.1773 32.5,0.1740 32.6,0.1707 32.7,0.1674 32.8,0.1642 32.9,0.1611 33.0,0.1580 33.1,0.1549 33.2,0.1520 33.3,0.1490 33.4,0.1461 33.5,0.1432 33.6,0.1404 33.7,0.1376 33.8,0.1348 33.9,0.1321 34.0,0.1294 34.1,0.1268 34.2,0.1242 34.3,0.1217 34.4,0.1193 34.5,0.1168 34.6,0.1144 34.7,0.1120 34.8,0.1097 34.9,0.1074 35.0,0.1052 35.1,0.1029 35.2,0.1008 35.3,0.0987 35.4,0.0966 35.5,0.0946 35.6,0.0925 35.7,0.0905 35.8,0.0886 35.9,0.0867 36.0,0.0848 36.1,0.0830 36.2,0.0812 36.3,0.0794 36.4,0.0777 36.5,0.0760 36.6,0.0743 36.7,0.0727 36.8,0.0711 36.9,0.0696 37.0,0.0680 37.1,0.0665 37.2,0.0651 37.3,0.0636 37.4,0.0622 37.5,0.0608 37.6,0.0595 37.7,0.0581 37.8,0.0568 37.9,0.0555 38.0,0.0543 38.1,0.0531 38.2,0.0519 38.3,0.0507 38.4,0.0495 38.5,0.0484 38.6,0.0473 38.7,0.0462 38.8,0.0452 38.9,0.0441 39.0,0.0431 39.1,0.0421 39.2,0.0412 39.3,0.0402 39.4,0.0393 39.5,0.0384 39.6,0.0375 39.7,0.0366 39.8,0.0358 39.9,0.0350 40.0,0.0342 asymptote-3.05/doc/cube.asy0000644000000000000000000000036315031566105014371 0ustar rootrootimport three; currentprojection=orthographic(5,4,2,center=true); size(5cm); size3(3cm,5cm,8cm); draw(unitbox); dot(unitbox,red); label("$O$",(0,0,0),NW); label("(1,0,0)",(1,0,0),S); label("(0,1,0)",(0,1,0),E); label("(0,0,1)",(0,0,1),Z); asymptote-3.05/doc/CAD.pdf0000644000000000000000000060364115031566760014036 0ustar rootroot%PDF-1.7 %ÐÔÅØ 3 0 obj << /Length 1121 /Filter /FlateDecode >> stream xÚ­VKoÛF¾ëWð–ea®÷Å%é"‡$N[MÐ6Ê¡°s É•MX$U’²êß™¥"9нˆû˜™oߎæírqþ“‘‘̸’©‰–«H Ã3™FV¦\*ZÖÑ5{3>µ›©Ÿ\œh¡Ø¦¬beÙCœ*VÞùCÉÞ½¹äåøYþ 6³HJ^¤©"›’ç2,W&'‹?9u(—Hkxn¢ÄH.eF’Êáï×uMww†»Œýì†6–¬ìbØX!ãE&$Z“*ã¹U‘áZÔˆî4°T\ç2J´æ™•$­ Âýä6“kæ6Nà× ä€/l€†ˆÉØ`Pin„«y®ÉÞ»¾‹µd“£Ïó¨à…UõD”(pKeœ*eW  Ø4ôˆËêm55`*QVä)È€™çŠ*(¶¯ÒSI6`›k6l×nÄ¥a«~ ³í¹¥³é¾é+ j±5Ti©eúLM˜ŸG/¨ ©SG‚¡¢†ßÿS¶›5ŠæÂ –žÊ#hêœÊì󕢄ȹOˆ××êY:3žÁÃå=¢e–œ!­‹‹Ík/wÄé#Ët¿ÀÎcSc:ñä¶›*€`dÌu´«Ý¦kÐÓ [v5-ZWŽÛ(–H”­‰.VÛ®"…FÏYKÑPå´fcCyÔÚ0uIgà9-ê¡DwMd½Iª¬ª~¨©Þ 3õô½¼úH÷ðö_ª†Þ“ŒªáY&g–Iϲ,ݳ –ä+,f–Á2° VžeY¦¿–ã¥B^­Èá’ÜÓD‡Þ*Fîªu9¸šdÖÍ&Ö…ˆû‚pàµCLÖšÇò‚Pû”S…î÷7"M7Ѿû½ÊVžÑnœTXû;òò»äEJÅðÈú-è" Jôð 7«ÊõšŽ›é$?Q(ø%‚#¯ÊÛêÿx’±h êpÚ˜…Ø^‹³g½~Ù<ãG$Mž\ª¾á?õ+úN³ ÔHZá3˜Xí%¼A² 'þçø‚SjLxø5°ñ÷÷e7_Î6VÛ Þ­=%†ä”ç#8z'6×ä I±ÖØüýr…߃» &ÉMnébï ^ÞR/ ï=Þ³rlrÅ:·ûFNô‚¦Ý0¹šSk…¬ÞDßð—cya UŽSÌøÝó'àõâÞáOåoÚÖuµß×§ÙUd¬\ïÐ_rz$P$²¸¡lÞQg{FÇg…ø_x¹x¿\ü½`[D0ïø¿ùz›áþ\ªvqýED5\BjaîÉ£mA4ãP"X¯£O‹?oqd×R˜32€Fr+IR©ãù&?H ‡¹*Q0 éùqø^•Vc¬Ú¶8ßAñØÕÐÜú;D³pv¤~’‹¹[º•`ˆ ^äÅ7ãÏ¡_AðÀ±ÏþvAÆïmš6çç»ÝŽ·0ŒÝÓÆëS¦H.!  ÌQóßv¨À¿Bë¡ endstream endobj 20 0 obj << /Length 968 /Filter /FlateDecode >> stream xÚ­VKsÛ6¾ûWèHÎD Á7šÉAv^í¸—Xiv0 I˜P¤ã<þ|w± L©ô¸æ"â±ûí·»]®/^¾KóK‚8É¢Åz³`qäY±ÈÒ<ˆât±®·^ì/‹RïS'¶Òÿ¼þãå»8Zð€gQ†NábåAÎ 2_ûEìµþ2Žc¯ï$ Ìίq¯je”ìh«Ýœ™DéG…÷ÅO3"¾ Uµ?øÇkµq æ7"“±Ed²d “çD¼¬C ü¯Vo^=I¿ày¬êã0oÓ7¥QmÓÑThIÙ@]_ #+ZQ }m8èŒîKÓkW­”ÂÝ’™àrë„°êÎ 1ùbÓ¬’w!K5â·X´ïŠ)1ðÔ5°R`K †<ß«RÍ–ÖÚ†¾úáFØžˆ3@Ÿ¶@´ ÷/p…û´½³»_ñG’»iiG!iQá#ŽkvžÁ=1Þ´Úéiÿ?¨ 3¨’T`+OzÐzx¦¡jœDškÕÈ÷ºí4MFìyé¬1—$,@ÁZ쥊Oõ? óq  XQŸ:‚Å.¡³âP—ìÖ†¶  9u g£*®²¬ð~7Γ“,Q ʼn¢»0Ü«•ϼÆM¶TÁžâ’S££rtè;ö¢©hÝìTß™?¨ vì\Î:~fVûxàðò`žMŠÛºOðìÂ2æh²£ÒƯM”Ùá9¶;·¨E³uÃÛðDÌ2/þŒQ#FÝÆ­Zèí2`ƒüñ«{¼ÁŽm##,h‰­úbˆ~²ü¨õÓ… Išm-éÊmÉob¨åÔˆ’€‡9”¾tŽÚ/Eu¢pÜ ê}ê®\QSøÆcÙ§¡WZÿŠ&”½V⾞¾­ИÔjoÔ{BÒ­½NT…mw{4Ø·¡½¾¢AsãœBsžx+"¦êØ¿dó([,1ÜûCyãGx4y’â.bád:i:¹à>=Ép®piå¦Å%bË8P…¥ÈQý9YXŒvXM@`¢@7yÖù/Õ)¨ÎÛjxïgÁ\µÁ+éi$ö,ü÷¤¿•}³®e³…ƒ6ƒÙÍ÷ÎÈ=ÞÁsPÞ(±…+æª×_gáÜôz#Jysú¯áDnË“ög¿Vo—¿@o—s p­¶;3WmJÑAñæ6ÕÁ|õá(ö(]¶}SÍáõQn¤†ÿž³ü L¹› þ÷‡F/ã0à…Ë-B»‹·ë‹³Q endstream endobj 24 0 obj << /Length 444 /Filter /FlateDecode >> stream xÚ½–AOƒ0ÇïûÙTxsȦ›KŒ#ñ êú`5];KqYüò–`tê"‰%»@€—?ïýúÞ¿e½“qY±‡~he¹å…±EÈ ƒ¡ë£Àʈuo¿õ³©Œ÷ï`0°7w”Ê‹‰'aûzËñ7ò¼V¥ Š Á1K¤(Ë?”üV¥prM9‰ÜHñ KEo‘j¯l"éší}u|ÏÕ¸µLìãa#óà{ƒ&ù¿”²ô„½é;~d/›G‘×÷S»Ð«°i^%gR>ôÃ?òNŒªK€æG¯<í òÔ¨u•Ìñ2 X­«sÆÄÚA„Ý‚wbl⊿Ғ>1HIa6BŸJ‰àJTòØM5é€åĈåœÂÀØ‹»õ”Ü™û#–Šj·¦rÉÌ”j‰Šay)î u“~ðaq™Ä¼ÌA~Q:^«M[[-lÍj¶ •RzO7ÇøÓo᥂Rß gŒïÌŒiã[#È…„‹úºÆõá¨áÏɳÆËU=‹ßŒñŸI¦œ,Vx·x;Ç ¤žïô=„\?Ð VŸ£FÕq½4뽡“ë endstream endobj 27 0 obj << /Length 2270 /Filter /FlateDecode >> stream xÚ¥Yëã¶ÿ~…¿ ¬½AS »tƒMîÐs[›~ÐJôZ€,"}ÛMÿù΋’¬•÷ô‹5$‡Ãápø›ú»Ý›¯Þ'ùªØi˜®vûUÛáRÝl§ã‚=ÐdÁ¶HäNß.à~ÍÊ®^Áb}›-‹½g†6ë]ý¸dØ{öG‘÷ë:<}fñÇ7ñ̳‘µdQß3Ý[&»ò¨ “ºwlk0'Óµ2Ußœl󙬂 Ì· §dÐöqêíØX™×6Æ2Åg™ñ¦ùvZ˜*}<µÊ*s˽‡²v|2¯V¥ é5Xí‰Ö £#˜4Á¸ã•§þæ¬#|›ùÖ¿ïɪ=7Žêˆ ž2þ?F©£H#uà+>%K<;âÅà¥@62¿Ó/´¹½Ø„ÜÌJóN˦S5zQê5~ï‡Û_¸n2xG˜x·w¸³Eº*P·<­nDŽÑGep¹ÿ ®ø£ÌïËδ¥ÆÈ§päGÕËnÉÚÎÅâD•5·Þu Ì#øÊÍ’Dâ 0b§`¬¢‹]¹W6ne¸lˆ˜Á0ß C÷€s]ÙrKÔ#–‰Bpô «²B©àɲÁ[Ð;³Øû×AuНCÏ %êžnÝÙ&“ìÏ]eÝɰf9†ÙùqvÛjÆj>#M÷8ׯ!C´ª²ÜæMNt»YÚs6€%xa,7(£ù| ÉGWŠ"ðгÕG8ç Ô{^ç1À O¬rŸ4àሾÓ箾˜¹‡K‚Æ–¢±³oo _ðdw@Oˆsßã¯Ä ìx( ’£O‡æ^çúÜÛÂÕ-þZt(ì4ä†Î8éÈN2"6Ím(œ,EÃP`‹7Ã/BŽŽÁ1)ö)ÂáÀø4 ‡a…äWw|W—Úð£HËf¬š¾j•+Í:cU)…ÕÌâÓüâFŽ@ÙåðÝä)hñD‘(»0²ôþ¬^Ë»ŸþæoY?*ûó`TKº|j~§WÀÿïÍ ÿíŠRü ÿõ’7AJ°ß¼Û½ù^¦ H endstream endobj 33 0 obj << /Length 1638 /Filter /FlateDecode >> stream xÚ¥XKoã6¾ï¯ðQbÇzKz º)¶È¢‹­ÛK¶F¢m!²RÒô×w^²e[Z·èÉÃáóàÌ7#ß­?ÜÞ‡Á,_æIÌÖ›™†Ë4ÉfIœ.ƒ0ž­ËÙ£÷U·mÜ|¦™×î4®ú›¨Ô3›³-e­™™÷ÆKcOöSÏíç ßSuÍ˧ù„M×”,WT¶¨åªnî{¥uÉ›þ¶½V®³z¯TÕÎÿ\ÿ2[;¿Ìc1¼®í–¸s{Ÿø³ ÜL"tä‚d®2–ÛvU úâ ö~ÖíçÃÅíõm¯žŒ©Yàé·=~ÇÖ"ãGþÙ¨ÚiõYÝITQ] ê¢óxƹˆÂX«‹¶~ç¥+TM>-ö!I±Æ÷íÙ¾Ûsœ<‰3jìã tç@ÙH9ÜaxîÂMÌàWSI´$¸_”³t±}© ˆ‡Ä'a-:ˆJÓŠÌ ™˜gË,ÁÎØ™³†õ¤å…nŽ ^TeEŽ5ûk2k3*aµ-åSýSåZÕzTòö–åþP¶ROµv’& û$«šô¦= Ëêºu_«í²±Cºþb\ÕV¦9=ºŒG5þ¿ºXô/IÕ!÷»ëà¢÷yz7°qpQé‹ 8õ˜T@B3ýR«ËiÓµŽ TAè{¥U˜ÁoU³eÆ[ÕîXÆê†l+ô…ŠÖŒß¥½…¨7ʼRòB butùqù’‚#y¤óª)GO¢&H̉s©WêÆ´šm8˜öÂE_qì3EðW¤2JÖ=RöS^‡yHx’zz wÓZ°äÁQB÷‚-`ÈNpˆ‘° s1ŽöˆúXí‹h•¯ïÎnaDZˣЈõlR"HšôH™®.Ó w1x-Cé:œ¢PNDN¯bÓ5ÕÒØs¢Àœ?«·„"ŠCo=îËeaä½ÅAžy•cÎK QQ…tÑÑÌé gÈpå 2J—wÖØ†š8Ÿòlð¼Ä6Ì{Á©šÇ§Í‰O ûô>§…]ÉGU¬]]òRž›ª*lM—WprH kC9l06Ï|¯TŠá•ôQ8Pawž|K¸k¢4ÅÂ8öª–UVŽ/ì‘ iD[Ü òÙ?0 1º#g}e#Z¿Î%.À~Ç ÌVB®ÍfÜâðê“cöE0Ü#³ÖÔÃäò½­j+0õßçB/:æìpÈixf¯iÈs´®á߉jµÐÄè9Д(FS"1%:F hH­†À ÇªÃ°Ç Ø5@Éó“Ç^·Ú:ÞrZŸ‡WŠŽ\/Úÿ2q~VÏúÞj½S ÑÇ¿Ôþ¥Ö“ÿÀ$A~ÖRÐ,k¸p»B|ø¶ò£m×{äß°¥„Èì"O4 >© àúI¾ “TåË,“NãÖ‡ëÿØŠS endstream endobj 36 0 obj << /Length 667 /Filter /FlateDecode >> stream xÚÕV]oÚ0}çWDUÂDŒ?â|¬ÚÃÖiS'u+Ú˺C X‹“4j§iÿ}66-2Q´©šÊÅ÷úúœ{Nîzȃúƒòk.MÈ SÛØü”Ul"rÑ®ì +2¸Þ’å¹ g5ç “ÿ6þ ¹”R‹1&1EÈK4Ÿ(4|pR{NA¢Ù¯j…¬ÊZ ˜úço/ÎÖý°î‡g¥}½ ÆÌÖ¾±“ç5g ¿…ê/j·pÇ ‡¶~´†½úe€>€š@j«³šÝ›vóÖYúlð‘}ç릢եlU™U2°q€  WS9xÊEÛ9s¬P`(‰ÚPªÕÆùŽl°Þ¹òM£kYí(hI^4O3P‡aR>¸ACè˜À]’ÈÅmŽ«¥=„¾%&9¿Ìæ¼%à&šÕð-ökVkòÜtÕêvrz‹H¨îêæ'þuzb§š†…ÛSÝ+ÜB=ؤ—;ÑÎ$67:=²I~!”cÊ[ D¥ÜÐrwŸ–WlÂsŠB‰Œ»ƒÕBÌî$nÀÕo‚ZÌÍ™Y]—÷ÊÆå²1=Žw‹O^H|ôlÁñ±‚“C6v ®åîª¿â³æÐÚÏ<¿.•~Z—Ek 1í²SÜi§Çgâß2í6ô…,}¶Iè±&Ù¥ùÏl‚àó}b_@¸äƾõ­¾Ë"SŽS?¤äM-¦xµå¸Û;ñåxŸ¶þåQÂ^@0HBl»E¦®w9îý; : endstream endobj 30 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./CAD1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 37 0 R /BBox [0 0 273.72 86.71] /Resources << /ProcSet [ /PDF /ImageB /Text ] /ExtGState << /R7 38 0 R >>/Font << /R11 41 0 R /R9 44 0 R >> >> /Length 1007 /Filter /FlateDecode >> stream xœ•VÉŠGõ9¿"ŽšÃÄdlWÙÂÁ’|0>5–Œ™Ë ú}“Õ•µ5ƒ0 ]™¯â½X^mŸ¡"Aí¿åx™ÊÃ{‡OÇ– _ ÁÛBðG©ð}!rESЊî.0¢ K¬Á@,š¡y[¢9X f#¸ât#4"RTé{k@¢Š­o“);A\‘„Q¸ ÖŠ•Á[¸)'6S¬­ig¨&ƒ*§iVW2Rl ¤¡µÎ0QlÖÈœ°&h ·^”e¢ƒrõß8‘”±Z4 fŠÙ€ µPt¬­3œ#€E\͘È[¢7ÐÞK›sxf´V1 6©ËàÂ=5™;#Bûdz $BáÞtpo:%»K[Ù묭(ÓQ­W]++F[¾”…ɾaÅnÏ8N¥UŸgºÏXÏ+åØ(¿—»«îD˜Š Í~r4ÌPx.Îi§2NŽà¤q*aÎ×ìX3=ªÂ§Â‚– Õ±²ÃT<1j à&I½±†Þ-c«µ×}fõN>–ën¾æ³SŒ¡ð\fÕpYžoXW­uð‘ýÂŒ]Ãã†ÜÆ8uÒƒt¼4úaZwGg™çuJ³U²rMOÇ©„¶+Ò£Vù5jÕÚE×Äô}”PCn_Ñ ®Úµ*÷¨±ÀvEN¬eì§*¦B¬ó]·1WdU¿­ý`!¹*ï-Œþ8ÙY¸ «cƒt¼dá‰0­ÀÁÂcš­’Cšãѯ†™Gs†ü5´öQIÑß[Skhñ5­æ„ÔöCÈfĉµŒýTÅT(MPdS¿©ý`!K ”ýSGm~)mn d5láœ÷/ùw ŸÆ~oÌ)ÅVÅ!ˆÃûc~7qA=Þ4,˜²ˆ²ËÜÓŒáéc©èÕ©:ܯ«Û’÷ÏFq xšÊ/¯þ¼»¯HÄÒø×§·åÍSyW>ƒš{ÂýºèwŒm‹þæeàÞ³µþ%ùú±<<þÿüõïoåág òðCÿ{ýÓ·@åñ;ø¦¼y„w/vÔ¿¤þK¢ÈríˆïîCœ³7t–½~öPu´~ï Qæ•Iw÷œ©XåU]DÌ^¡ÝÝ{#BÖ‡ù /ëupïÊ”Ê;M endstream endobj 45 0 obj << /Filter /FlateDecode /Length 189 >> stream xœ]1à EwNÁ 0 ¨KÄ’.ZUm/@ÀD !ˆ$Co_á$:<¤þøÛ¢ë¯}Š+2»®<Ää .óVòǘ˜TÜG·ŠN7ÙÌDw³ùýÉÈ÷v}·Ч¼ÐÜ=nö¸dë°Ø4"kL‚a˜üßS³†pT*4€BÃZ †ÐP¥4€–U*ChUecÝP¯ó×Ú¶æ?ãr·•‚i¥!iˆ>&üí!Ϲº8&Ͼt”_« endstream endobj 47 0 obj << /Filter /FlateDecode /Length 162 >> stream xœ]1à EwNáXÚ!Ê’.ZEm/@Œ‰b!Co_A’lÉþÿËϲnû rL_”Áy¶‰Ö°%$˜hö,”ë1Sí¸˜(d7ñý‰,¹}~˜…äS]ëFí –Öh’á™DÛ4]ë\'ˆíŸt&w8/MWKkeªÿTJ´0œ'·”ˆs­ À3ý~‰!–[ñÿžS+ endstream endobj 51 0 obj << /Length 239 /Filter /FlateDecode >> stream xÚ…‘AKÃ0Çïýï¸5K^}I‹x:AdËM=tm¦¦•5½øéM["OáÁïÿÏïñ¶:Ù준œR^>²HR 3]ÃËâSwË”7óóʉ+Fëya«Ê­—oú8¤‚³‚Š9Z›[Ûû²­LTAîŸÿðæä#WUY³{ãŸLÙgãLë·ÝÐÖûeF—©HË„Š?\Ù45úó0Ŭ^Š‘½}ÿˆMw®¹7Ís×[o»6¶¿øÏìz mvBnƒr¼ ñ ‰G&‚ïT¤F0¹ÓÉ7jtq endstream endobj 69 0 obj << /Length1 1784 /Length2 12687 /Length3 0 /Length 13817 /Filter /FlateDecode >> stream xÚôPÝ[ò £Á݃ÜÝÝ]‚»à@pwî ¸$¸Kpwww Áǽsg&óÿ¾ª÷ŠªÃou¯î½ºw÷¦ QRe1µ3IÚÙ:3°02óÄDµX˜ÌÌlŒÌ̬ðjÎÖ Ûá)4@ŽNv¶¼0ÄA@çw›8Ðù¨`g u±°°X8yY¸x™™¬ÌÌ<ÿ&Ú9òÄ®¦F€¬-È žBÌÎÞÃÑÂü³óû9ÿþP›ÐXxx¸èÿˆØ€-L€¶ ógÍû‰&@k€ª‰ÈÙãRPóvv¶çebrsscÚ81Ú9š ÒÐÜ,œ?T@N GW)௒Š@Ð?¥1ÂSÔ>[8ýË¡jgæìtÞ Ö& [§÷[S#àýt€ªŒ<à“=Èö_dùèÿ4ÀÂÈòŸtÿDÿ•ÈÂöï` ‰‰=ÐÖÃÂÖ`fa |’”gtvw¦mMÿ"­ìÞã®@ k ñ;áoé@€¤ˆ2ø^á?õ9™8ZØ;;1:YXÿU#Ó_iÞÛ,ak*fgc²uv‚ÿKŸ¸…#Èä½ïLÿ\®•­›­×¿‘™…­©Ù_e˜ºØ3©ÛZ8¸€dÄÿá¼›àÿk398˜™™¹8¹ ÈÝä3Ó_¨y؃þv²üe~¯ÁÇËÞÎ`ö^ÈÇ ôþÞË è 8;º€|¼þtü/‚ga˜Z˜8ŒAæ¶ðÿÍþn™ý ¿ß¿£…;@—ù}üXÌýýçKÿ}ÂLíl­=þKÿûŠ™$¤U?ÉIÒýSòœ¢¢vî/N+3€……“Àõþáó¿y”€ÿèø#VÆÖÌÀó/¹ï}ú·d×f€úŸ¡üo.E»÷ɨÿ;èzÌÌ&ï?,ÿŸÇýïÿSþW–ÿ×Aÿ¿Š$]¬­ÿöSÿ‹ðÿãÚXX{üÃxŸ\ç÷-P°{ßÛÿKÕýkuEí¬Mÿ¯OÆø¾ "¶æÖÿi£…“¤…;ÈTÉÂÙäó¿Æå_võ¿ÍÚ¤dçdñ×Ó``afþ?¾÷í2±z>œÞgòoè}yþ÷H [;Ó¿¶Œõý†ŽŽ@ø÷K~G/–÷u4¹ÿ=Å&F[;ç÷À{q>3;Gø¿n”“ç}pþ2ý¸ØL2ÿAÜ&õÿ .ð¿è=Îä?è/åL¦@è¿õ=í»r Óç?(¬&³ÿ@Žw†™…ëc8þrÛ¹8þðN1ÿ²˜þL÷®Õâø.ÖêÈ `²þ¾‹·ù/|ß&Û?à»x»ÿ@öwîû þ‡û]™ýð]Ç*YÞu8ý9LÎÿ-ê=³ógGÐe¾íìf÷GÀ»p—?:÷îwÿþÏ­›¸8:¾¿}ïå{cÿÿ~hA w üÒ¼ _eMPë}•¾ÃÞ¸À Åžf* ƒ×’c›Ë#2L2MeÆ— Ç[‘ä¡nÔÕ êáeâ¯ã¦:˜ÐæDå–'ïgÃx•©½øÅIìþ‰‚c‘Ú>B85á}ïo+È&ðYŠnd¥<Œ{·^)÷Ú¾’•Ñù=åýJN9„ç’i†hõ(½€ÂYŠ\ãÌ9\ÒÎ „°´èî(³7·3èÙoIJñtð>'Ñlß½t6Ycæ<×ÊÔX:ñÈñtp !oÐG§(½D¾Êâ,xýˆÚXÈâ \êM˜“ÓÀ#õUÂu *fH÷—ïÀ ïÌv3Iw´Ö0™PPR×ÂzSI™%V fXø=¼ª&h›Òµuužœ©wÐz'Äâò²Dÿ·!ºÀØnÏôå|~øÀT œ’’‡N6['[Vü„==¦šë#¡2ä]Wà¥Û÷–ËøãŽÁÒ2Ôû‡³Þ:o/‚;7ŽÒø“±RÝAâùéË÷ޏÏCºõU˜7X“¨†ío)ûÏÁî´t­˜¢ >×wªvP!}™¬&{ŽuþL~xÖ‘óS’¾ˆw”Lç¿“Í«yúƇ¿9Ũè{\ì¯1Så+/Kg8k9S· ïüªí*·”GÜÒsM“¿Pvˆá×H™þxôÀl…1\§¢<’ÿÉ#E¦ÑòýAØÕ*bȹ‘Q‚ÀÛ³´C'Ï"/K±ñ“1÷#éìj±´È2Wû¼ iiV~&ŽóÉ×!7>Ú©½0k„II$QÍÝG–`U"’×>ˆVÚúü³cFøQܼZqÍ—Öê¥aƒdò®…tÝJ!>nšÀQêü2*Ä›*În_¯Bt2•IþH¡Ân¤uÚ?@šž P3å™nD¢~ ^ÖÆ“5¯aiy6CÑ;H†a>„ã:%ªL Q{–DZD#!±q[gm!k±qÜ"÷Ž|›RC?•‡IJÔŸô*Õ*4z{dïc”JvÃh(Û]ñVºg=2_­s»2¶ê”¬ÊB@P,+4³ä‹1"‹³&¥ã<)%ì6‡Øõz¸A£}X?;MÁ›BÀ WUÞEfýÑ’÷TFIUd[ާgT£¯È{€¼½ÖÔÍigËlÌb£ßzñ›þ˜i¹è»ž69çG]ºu‰²þÆ(…ÜO'ÔH5ŒâÏ[ò•Û%¸z7´[Â÷žlT…?('“9]°¦¬~ˆè €¦£N¾þfåoTƒ+¾ñÊT3‘lE>”k•Šj_‰ìltkp(ÚóŠ»=W­'à{¤ax[<’P÷Šû„aBщâKI² /ëºà„Œâ“:Àã0ï¶?¹éµ“Â^1î4žˆ¦”wO©ÌÐcÿåU8eDše WZÚWg'(=GB?oŽd…ÂFÒÚ/´í•(„'ËGüUQãÉâ1Qµô-òWf–tIñ'Ãím#à·ÇÙC™¤îÌÝwŸÉ K7\t…—}¶–Hçá‡Leâ%háè–ûúû}®Œ]ÎîM°XÅpç V]ÚÖy•?|LC@²¿jnÄâ’aü~Ëí`׋#YÚVÊz`j…â#®Š7xßS¶æ†õÜX Xd¶v/ ‚ab¸WE7¹t áÿ™ªNЧk49ezv&? ùµ IÍ æõó›X÷ŸO4yªŠIÿ4…¬–.â„Êü:êÜ×I¬±ª?©•3hm> 9Üf• ¯M3å¸tÍMuÞ,¸±É%ÓbÞÓêGÕÛ@ƒæß¼Ý0S›-54_ ñ=RÇ7]ìW |¤:#’D¤XË[6´Ïügí×ÞÂm Œø2’‡±g]÷Ñ1÷ Ûn1²z25‹fFÔk‹{ͦß{´BrFËCY¹½¨K/øo>‡æ|ãñ5(e‰ÂmQ‚óÒ•þe]ÇOçÅ+6¶<£,i ¡w{9OXź¨ àe§}H=ˆ¿œ-¹`ÙúÖ<¶=íÓo é\üÞTÁTµ¼Ú<þ~~²â¦!9§'òÙªÚ.µ¡z5ƒŠøDÔù9퇎~ÂpE™Ê®…<ìž-oáì w6([nBñÌ£ cý¥,˜7þó1ujó½›Å‡uê£O¬)‘M/¸+žÆlÐÌ;#7 ¸jU^­•p÷†Òçq‘¡ºí kÑím¤”Âgö(ÅßÁ€ÝÎÇ0ì&AÁPv!›râ$Ã7*f©ÓbÜì²YXM3ìÆZ>—ÞS0ºóGÅ*[t’qLÏx+Þb3NJ÷¼·®Ê·­jAŽ™hŒ ’LÇŸ7ˆî¨Ÿ+>{ìXiŒ¨Vp…Ê Ü«}ª%Þ`®ÙÜÅPW jš:©ËÜ œë?Τ¡*xÏ@‹7•½×Ó.QA.•òðGùÉnJº¡»CÐèEŠmý з¬àÖ€O»?¿9˜¸w¼hìøÝÒîÙ¸ßPƒîÊ.ôú‡«H^szD²Œ¹ý'›¦´æÓŠ«Úê¢ÊÑ ·Ñ-àíc6S#iÏ‹s|w×X®¾!t/Ä~ƒáçó3¥¯4˜áü¾g–I¯Ôi?^ä}QaÕªÂÝÌUM$hö!¬¡0èªÍÈTœÎ#n©úŒ~iT©+*Ú¾N/O1k£NÑz€Q' òo¥%¯"¶µsßb“ Þt_i·ëæévE½§š©ó᱿FF×dá)°lºJx ªø`ÞJlž²a·¾ŠDBA¨þ³³õsø÷â–UêÙLëÍAÓBvmGu`^!=`«n3­í®îdX¸¡žPŒ¦óÿ`0_S4b=é¾ A¹ÍZwEv:MÅm1fºDŒžã & b×ÌT‚]Ò÷I 0ùð%Ñш ½váeó€Ã¨ Y!€„ƒÃRRÐ57»ÁüÔð6JÇ”xv𙇠q§ ±sÒ«|¨0½T‡¤ÎЈÁqÙz)–ö¼ÅüK:nÖ.ÁRóbD®3"”¼¸ù4<¯­±,\Ø£|s¯CìǤÇ_–½<%Š*µ²(¿Ê¹@X›—q¶5'[UÚýÉ.ƒÎó~_‰V ÂpØû#wøH5EõørEŠî¡õŸóó¡‰jnðÍp‡Ü<<¼¥1s½ŽBÔ}±ù­;F¯ ¿ ¡SÁÚýÑΜVš7Q §Z{ŸÆç%Ç#{S"\”C‡,Q²_Ñ>B$Õny“ã0²%Ò Ï8 ­À[܇M؃Õ÷më9ÂEó ‹”ölêð?¸Ò• ¨”ÛmI§+"\ᆈÅüJðàÉè.6½ÔŸMù¥C½(ÙgIOfïc˜#qæðã0ެ9>bfçïþЏîÇâa@ uúåG´.Ư'„ÑZ*ˆFL+mE^0pÝ{(õþzaÒ*Hýc¤’iG§Z¨U¡Þ«ç.¾{ÊhŸK­:\Ù5`f rÀ±Ñå4›Ç3¹%ùu³aÄ€?¡Íi?,Æ3œ*.Qû¤ú Ì%2^ÅkZ”b ¦ƒðÀÝ …J?úŽfè@²—ÎÎêÏQÇÝùÖ‘‡à }Ã2L˜r¤&JéˆbF)Dm¸&±³T¿±ž¿„Ðþî“H°s âë›k™`ÚG‹iæ<Ò-B”G?CµkìÂÿ©†x¹ [œ+žT#(Њú{‘û¢!‚<.+Ût/’’Œ™xÊî>ÉÙE·nFylôIB}€„·oDx=Î ÃMâí꾬r鄳¹Ts!!C™é´–‘ÂÝš2¿~þºõÌWôó¶À¦d]Þ)«^“>ý®ßLµ°#ˆºÙZòm_„6×óRôò¢QBµ½ªE£…÷H䃳7˜.ì¶1ÿ>—‚ÀCÆ4ŽÓФmýÇ/“¨ S%n¬ìë¨ Á¦LÆg⾺4•0æì…¹l/kR”`LöŠÝ(É„K|å­Î‰ûHà)¼àQ¸öGˆG˜Ý>n ߰ИÀ¼à¾O”ùç33§ìX’èìÄóGì#}¹}õô˜·ž¥y{!­¬\ÜÈåbLìv®©ÛØM§Á.±€™@¤øÐøgîüòLÜäÅãG«¾;¿Y ’| †Ë±ë¾è D-ÎÚ=’GñV[æºä—X9ß~ít×ô«Ë{°ÑÆ»øÚa4¥xDÜg|ûÁ·Ñûó'ùîoƒqˆAzí FBɧդðoÙàIR=8͘–íô”`gØê”ãªe%Ì(GiøQ¥©ªåcæíz;ÝOiÇkSPtŸ¹C1I† ë„âߨ} éúF‡®sSÏMÅFçsùn‰¤zÛ«òý úûtÈDêps‹kϧQAM‚(*ò%p_^ýå…ɽ—Ä5ËÓ"g®™”k?L&³Ñ2ËÝìö¾¬öÿ¤ñ™¬=T0'&çxäþmØn^*æÄ*VÏE/—™2—%;Þ2>A“³ŸÆ¾Žøˆ¼ÊBÞm×\úµé'– ±–I¦ÒÝ¢oøO@þ!,ðòË®Á÷>ö¬!N™$KÂO?–X€^ ’ÇK´ANé4%ÆFJø ì¯Rм~~·í"+¡¤qÈ•WKá2%o«[l?ö|Éד'Z­—žE¹–…iW&öú~¾iÜüÂ;q]©l ù–M{¬™¡_(’Áy¸Ç/È=}ã º»" mä{äwxî<Âk»ðBN`ÁÀšÄêÏ4âŒBcó`ó<­™•fì*·¬%ç1SZMM£H°ndD(†*žø°:£.4[›^€GŒ[äX¶Ï;ª'é¿”°6ÑćûÜ?ÐpÃΜôÂ&ŖtïÅ)ëóÏÚõŽšMFúΛ¥ 8d´ýÄ”í--'ÑYiŸ“Çš6éº;¢ÞãÏÓˆÃeÌ< ž”>lBb“Æ .–½é†TâºOH&!ŠU¡k4Qß*%TSۧ΢!nx–30]¡¨ë$½|Ud”ë+ɦôæru›“zÁ[LÌ"ßÔŸRÌm_|µ¶™æt`Õ“ ñÛL‰j^ë8) ²ÑôÂç €+rÈrÕCÍn±pïÍËÕyÒJðán< á¢ÙQ8a ©QR`ãxtá„•hi¦(h,Uùˆ=dšw›QÒê-Ο_mòë1õžø¯Ôiåa• q&ØMœõlI¾®ûç<ÏÛ\$ÞV·œ(Z“PÏ,e~=WyšŸkÍÒg¿ÛUº2£¡:q}f˜(í’Õð×åé°ùÎvâ‡ìA :;á«s7˜> \U LM;,‹·äÒüqD–^;ða&ia¸vh YTCŠÚoÓbGwW¦PS„_¸ñ`'] ŠóV¨ãÐ -ŠImXªø=7€YÑIžãf lü0^žøÊ%‚!œsÞÜÐõ^~ßî»Decž¯ M ›Öïq·6t0yå»=t¯»®TçqP#þ­I¿l¡H¶Hj›Ê†÷ZÍΨ ØþºÚ À[Ž%õɃ֜)é¼·h™«ìH€Èo©k9˜dÒû¢é*÷op¥Ü]K«Ÿ BÆ.˜+!¦óvmn ¡HÖd›wˆN•¨#°å5 åÀX¸Ez2è¤O™R¹²­ŸauuÚ­Z'îq²nøjy?’ª²ÐÀ¾¸mšƒudúYÚ…“nÓµêA¸³.—O×m‡É¡*D&—‚£K‰¸P†»mÒ‡˜ƒ}ÉÇŸnÚDŒ ÕS³±Ý/²DuHGÀ-ìᡬzì2Œvž4¡åùšes¸Äæ¾pn!G]îä9™`Y»$àˆ+V­%teݘ<ªá§iê±¶Â!‹W;u`µzÌ|µ£ëXºàbÝ<«{ó¾‰Âè7L¬À)œ$ tpi‰²AµñüEUûÆÒ íγÞë‰ãÝÉÒoï ^ÞŸ¨Њq¢ŸºÔ=‘‡V¥/€R•âÒÈ•§äœäìÎò­õ¨•²Æàõð­2gŠ2¸bóõ@F¹44úþrDA±xëdX.ª,³DÊ:»a–¾­bÞà}‹×éàb´=Â$›®5â„?xv„0 @TôéëÌG‡:w_ ƒ­\Ð,|Ö¨äÚÆíÉr±¬f³C?ÑGžÖÁnKvátv½t¾‰Ç¾»¦!&*P,ÿëÉ}ŒÅɰ¸ ZuxGg·]‡qf^Jènm?àô13ªÎ¥¡û …mÓþë37š¸}b;åýŠ.›âõ–Ó‡^çy&Œ‰’®F5D¾_g O (b|XIúââÕ.Ìk0ùˆsÊϺžþ¯Ãß•riåÄÔ¬rÀ’wÈ&0…~Y5U! Ñ(Àý>}’"P!ªДA"&UÑæº(Ô|mY›9šï¯:?OÛa¦¯S[STºÆ‰*X9 ¶È–º{ø6qã ºØ×çy#5 qœWὑëÒ8½(šòg’ÅTNnª—*ÌRsO"¥Kt(K£ï}@ufì6ãüõñd>·Gst­O˜oÐì狊+¶£ÿrµ[äOÌ:Cj .V´c¶#)Ë=õÒó2:ÄêuÝñC×%0 kÎ \k(¼ ,=oË«£ü@f9]2on¸ˆY*3£3lëàS~µ"o£ñ\sP`½$ÛjÖ,Cjî,^^#w rüìø§Pkæ’³ ¿VÓ¿ü6–VÖ-Çœ,&úMRcç¿–Ž@ FÍnó‹oåjOPjEâK°æÔáMQ–Yy–7?ÿ×ÛBZ‹`›˜‘òo˜=^j}òó™å´z$¨,H c6¾eÜ@P@Þ€šý“‰ÞO*Âpóô¼¹òÛ0â6³I.’æ |lŠðb¾qóÕ1E§êDG«ê͙̞3å+pªl–xÇv‚’T¹kñ2ƒÒǶ_%’…I`Ûžø„!v¹)9ê¦O°<Ú¢ŽBªêÜ«ML-`¹u!ú¾ÛÈ…¹hb2Š›ö©›ß¦¢öÎHhÞ¸užK~ž¹åx„\'Rö™øéZ}±íî&Æ~€IlCËrÒîtÿXA382ê¢ÆÒƒÖˆ®i÷Ï·èІCõ=Û§P#“õÀtDNp—Ÿó4´À-"³yJ Y¿'+W}º;@“Âùe\ñ‹{p¢Ô^Ý&Ø)³#m—T–ŸœÕ%}c+R{ëk<¥_5’½еp¸¶î Æö¾Óâ žÄ#ò¡o&}PGh,†ªõóÞP ^; ŠºRm¯\P>ì/Á°Ü÷èpŒ¯?¡É‹[{À ¢*bêjlÙ1ÁÚÅâd±Ït_(SbµCÛ±Ìr95É`î¢c ä ¦ø":”f/>‚‘œ£Ñÿñ#ËWdD “*[Dùºo\Ÿh±ù·éUÀ>øA¨½ —,Œ÷!Ô ®š0iÃʹªØÂ¡äPnÉÄÊ8~¾=™_|= Ð¾€½ü7éöaIµg`œB3Í5ëêlöóµ, öiB©„õQ䣛ª |Vîü(eYòŠ?•b×ZyNdZ(“’m²|ù7õîçþË3Z![,7ÕÞ% h•uoñFLûW޵VߪÇÞ0¥a7¢6Õº Çܪ“ìN™Á™™ÖB±1áSá (ˆ“#ƒØþÝ/£½­èR-‘VæÚjݯçSX®¸í&#;U1SÆ©œ¯ÿËÏìªádÕj»ïoÒ£<¸né†ûÑ™GüH­w=¬]",p‡.o¨†šðäv’ Ç— =®×A«öa ûþÁæäØWÜJG33ÛÖÒžs_(Åö\_\›«ÁÎKFì8 µcÂBÏŠé%èw-¹&8¿¾|ù°ÿ„ÑÜÕ<0MйV…µôã‰Öµ1Ð þ´ŒÈÕ‰¾û¡*–G©°ñb#µ ªÄ‹/Š–uv9:½YÜé.!Dôžc¾\àÆ>è‡ÝÊF¢º]ág=®÷S‡’¯±1©õ¯zl?š÷8ZÃ0ÇJ"jr7µ´õÜÑz-fœåcs4v’Sæ&áø¼:Zúîž&§Ì%3 Ž™iÄ6°óV6vCÛâHzçêioŠÏò|8ØcƒÜ5«÷]øŠDd‰‰…Ë~O5ø€îýõ&w䟾:Rýeõ•‰Í±$S“"§ß×4´s¸8ÛÍ´sxæ[Ò×>ºc,vLoDXéeÏå‹3ñ¤‡ý÷iuñ«X£„:?XoÄaéÚ†¸*+ÖQ’\ð¦ûœÂ!¯Àû$¡¿küXœ?,LÀ³$¡g‡¹m¡dJ+åO­Ô€wuéI÷]g§Ô rZ2ÌУÈöËVîss枨îŠui¤ +ÆªŽ°u|«»l!ÁiíX g™ÆâàXæ,%Cˆ·!IŽ…3MÕbŽ´ªI;û¾ÇTž$F˜æóÉû{ÞÃdQá„ ýRèí +O(°H[TŽ –pRgï4†šeVP™BͳP%»â8±Ís“òã§E`XãçV+]ZH™¸ìï¥ü©ËìÁ0ƒrúRÊÞ/ƒ5{è¯Ùë r¿Ó6‚†:¼]‘‘;•™eôžzFÀhœÄcÛÉ¡ó˜@ô>Ì2êÑ+znTË!Ô¡m`“QùCpR5Ès'= rÔš Z?#c°ëö滉©¢v}‡ â éüÌ’¹Ùñ»;c ôzß7&+w~®¤t%F¨g•Š&“Зòœó>¬å½!m]ÌÚíS w˜Þ5“QKýåŒè,={Í"4×›n7”\ìC·”ò‰]â_\0á[<Ñܵ£öÊ!FÎ~<³~Ádönź$xÖC‡ë2{¬äo}rWJA ÉaÈk h˜SÀ-Ö^ÂáöAmÿ=Ôßþýü“?«w*«Â˜>ÒNTqƒ¶èípÊ*ü3xu0‰g¸áZ¢¶‘Ù¿©®–â“ÛE}ÀͱP¬rE÷»Çoש2±]TâèB4’³|Ž­éäê¸95žtŒ;›ØR^J.=ç@zëÖªÜinôÔšÝ^¤£ÔbVøs&¼dÛ"땆²0­5ŸAaýã4F5ÕMf_\´vŽå>ÎmtøB²P~ÄòŽçFcC5EJ˜Hg„*ùÕÌ€/í*‰>0‡„èµ™Có»«ÿ«)¤euì‘ç50:gœ=¦¸\¨^~kÄÁGwHéRíEÊU­Ÿ™Ë9 Ò=´·AÉñwµFÔŽì'¿AôWÇý *Ÿ¸£" d…L+q•.î"9Uº…6éK‹ŽÙîePXU¢é ãÌ´£“´Ê+Rq¾z~‚ Šá§Ão×K¹ÞÔ¿°0%H¬)©-1µá“]¢B磬Á.ñu­©é§RËùýö 9ct‡| Á_0€j°†qDºÑV}A<÷8ê¡¶«ÙÝÝ ÿFò!ßäž74&Ó_›±æ7ibË»šfݨ4ñ$tnƒøóˆ¤ŒRnŒP…#>[¢mâK%îñœÔ!?ÒYìIEOÿ®j¶(ÐP‚ãŠÓTW—âÂbU8`ñlÆÝÿeÐâÍϧøðŠÑ§ÌŽó‚µ“ëô/£«Eƒß×¹ô ]6ªud®ø”š~×éŠ çüÄ /ò{w?€ÃwBíû.O¡ç&å•vžå»£?>¤6:JiºÚ_Äi˜l>¬½¬MËË/.Õå œ° cjÂ#Lü¨5¿HN!Kѧ-³%|¥ÿRxÍ$6P·—•Üß§¥`,<&Ÿ2™2À!f7A;y8 ~éôr9%‰ â‚9;½Øp§°#c¿uD¯©3Wp Þö˜ð㕾¥ce¼æÍÎOÎcšºÌ­Ž¤ µCÞÚœ°Üäv<x p®ä,úõ…§¦yYôˆ¯ô(2"îaœDÊC¿,qÒÂù ž!á´¢Yg}Æ1EZºgµnó¸x]ä5£?–wõ­=zÖs•ž+þRÙ¨J¨cÉà!ôÖi Ûÿ›o¨¤g3xZX H™µŒ—ü ÀÒðÛ¼Dƒ’ªG‡2“·¼K(Ê»Üï`‹ γÄHÑ¿¯tâû‡}LœG^Ù >¿9goªP0£<ÿY`„¿ì# t \¿Äý&âQ+s°µvÔ‰Àj%ãc)C8Ë‘ä—HT9-ðéoâ¿îY„5ä?ßWéíÿú½£béÞ‘2AaðRÚ‹,ùSq•üX¥Æì‘ &.鯧ƒK© ÆVÒZ¶_Û©X*ÌÅkŠ~T\Õ?IKç0õðŽû%ôP͔ϩ ÃV/CüÉQ$põuLõ׺ µH…µXG°Ÿ{¬z† úóçé•Ã+ðÝo'»5 ™o±y½âq^â^¡dŒäs—9ŸÔ'²gÈEž_a&;ð_±$÷Ÿ„û¦ è y$ƒš¸¿—-F|C»&à»Þ5©›¿ñ­YèÊ|¸OͲü RÆÓ+ÎÊv?ÚÚ*Wjõ ÿj£l®bÙz2‰¨ãJƒäš–¾ä(©ï ]žå™„Ó} êº"ûQ÷N-roòˆg¯9øÑÂÌ5þé˾Ù~7Šày,Ša<§±ÍÙœÀÍgšµqóÄÅÜÅ^æ¹~—‹ª2‚õÞRÍ<°»Ždx»¥Â·±¬ª]P¬â÷ëÐFd?"#$ÃËijQQ]å#oã/ï´@|@÷¼é¼n¶©1ø-ÛòãAïS ò$]‚°Eh•Õ¶}mF° d…¦EuBQôtˆ•Î1øiÅ#ÆQã×óùkd¦5AÙû͋̀51m~a£†{·7”Æf¹Ëy˜ahT¡ví¥Õà;[Oûñä€CÄ»ÇÎ1hAÚþbÙÓ{Ø3âè1Ô/´±Cê‰øc}7œãå€KÙ"N6þPÊ¡À‰œ˜ü×.ðe,9…Ò×:Ek¬~°å&Pºé„[˜U§s»ˆ ‹š´7w²Keð7ù…ªÕbý=ê:Qú™ò-JÃŒêÏï{Ç15Ÿ“áŒK³À“eÖ¦'›|ޏ-›”Ù–’-Ç>VCrán‘RÍò²Ú%’ØÏ‘ˆ®ÖaiãZír€f8‡Fo¸) —;Uª7ƒc¿¥…Þ䈪öR‰N·§t;Ã>í=9FãàôÐ0-ð”çªzU[ãØåm¦w&Z¯§¥ß± †°£†Sp®Ž‚)±îo÷š=ÂÛûºmÅV\*Œ®”<.²ËŸWðz]Î Q›Öw mö'LHèŠyõ¤\U‰ØÃ„RªP”¤ÄÏqµ"Y÷¶ {›½Ò8æõ>áO¯ñJXôÊ– uÿq÷‘¸Z¯ß†µ·\Ó…=5cû*äŠ?î¶›¸–¥^ý“&{zõ2Õíôkø/Å#’=À„Í¥ømT?pGJh¬ î²;]ÂUÈÔ|Ò¼X_]ŰõgY¥lg‰W|^›]Öª@šRp)Ã¥?ù–ŸÒ ùåñdtÀ!P¨Ó†Ç{óÅô«TÚ-a†\ ÙȦùç$Ón¶ÕøÜÛ#Ð }Ûˆ è/aA˃ ›â‘B2b/f(]íµë êH]“VÌ<ŒðŸæ â{@.”-Ù#\Çn@¸S5|-,ç+’E÷›ªñÃ}¶7Þ±åØûíêàý< 6æGäÐIR²c¿·ŠÅ‡çnÙ´ÄP‚Õž˜!Á©rC’¡.cù3x[˜pŒÏ³vßÛ¥v‰Í‚ ?‡Ú×ÅÙˆ,á%(a¹’”ogÆ5-?HçîÅ?ÛÑavA~vI˜¼9º=WSÎÁ>¡˜kjRZg+Ò6~!Ék¬`Jn.žË•ÆçãÙí“æ:T}í"¤>!K³ÁNÆ®²`ÑÑõu ËxjÑ)”£ù<@» ˜²P)¿ iŽKÄûœ!£S‚R<zé`eqâæÃ_Äþ\-ç¼4ȵï¯áÿ”‰4ùíÆŒ }¤'òÞåäGªrÆ“ðÿê娳85…R&žÚ‘¦—'µ¨v;Q-µÒ=§¼_‚Ó)Òåôñö%ÌY9V2û6‘¬äu™ìáü¦W¦”µMë¦xÇ<(B Ð‘TßHã=×åyßR® zL}ž Ê™œ9LCñ%½åº…²Ÿ]ÔNOŽÚn4Á‚kÓÖ%m9rdèÖ\¢p‹{*‘€ZåãDtBÒu‹¶í\™Ÿ@<™Dë#ƒ×5‰›ü;ºYÞñŠ`νÇÍèã#§r¶¹©Y?·NÐ Á õdFTÃñV\W 146°~SÕãSÊőÇ¢ÏBi41NŠÜHél-xSº\ûÔÁ«C…0 ¼P\ÒHs4gUÔeKÙÕs—>°c£™Òܤ%L!¿Ñ˜É74–¸cxSH`¨s‰Á:þdЬ+0ÿno>ËòèB…ç²°FbãYuÌ¢2­QOÚ¿‡ê¹ž|ÉKÉ Ž®’¤´­È¥Á’æŒê¸®ù–Ž)û^´ÑX~ÂÝ„š…2n]éi.°¥ÐPÆÉ8Õ¢¹j¿×»Ú|rø¡dêíoÐ¥¼ðeÕ‚,;IõkÀÇ4:µ--¥ð@^½ÂUÿ;°M7¥D÷&Ž$´mo/Ù¬—k]z{^æÒSÈ-ü Ö„cÑ…çÊäš~’·î·ª“ô1UÌ…;Ú—j–U… ÔýK¸ñÄ»ú³ÑõNÄ·(|³bk¸uȦsÁ‡™¢ÐÑàÔ³´˜.w^DÜ›„o”¥ˆ ×Ã…bà—Ë·Òôƒ ÈäÉ•S¶Ák2HíB»™ñ¼`m–¤·Êq¿ø$î"ºlÃV-ðžä®Zf,¯£ýŽøãV±M^$—·Ï¿Ÿ<<8Þ­ìÞɲ>Ç~ ‡¦G/aé^ ÚÊï’‚}œEœª i(=è­$…f@‘Þ…’¡rÉP€c@o©F«ŠpØëeúØe'»šUÜ^“qÅÅ0·!Œ˜æÿMœ Š~¦èâA<Ÿ)ËLnýîDaH4ÞÙ; M4ïåÐ £FK:äƒIg eæÁ>.˜Ÿ6ò¨…ΩD¬ðELs1Èû‡è6¤ RÇ’ÔÄ—ÕmúŽQ·å긩‚4°$+Tz,…u·¼‹˜Ec½ñ¦„R¾aég‹ñ†ðDjÀ“\¬<³ú­¥4T6-5i®ò)Xîlþè°‚ XôÔü`( &ÏRƒÊŒ tÍh˜(BÿÕhi(#qòFé¼U$ô+®Ü‘°ä±(Ó—~2f}Éj!Jò¾æ«%˜(6µhƒŠ¥¥€4Ô6‚ï6y‘8]¤Îh …cäj´o)‘bTŸw¹:×¼±ø§=.ÝzºÆéÍÝTHG㡺˜¢Ü¸@³¼_P?ÈÓw@‚{ _GªT¥›Š¿ž\Úþn ¢ì™5¹s(Æô×WgØ·DK( `Þ°h±Æ'¸pæ@±Q‰'¹ +×™¯AþM F˜0æ7BaÁÄzuFà#~YLµÔúL¡IìMÔÚ¡GŽem*aÈŒ6ô©5!^xgG&TmJBÓTœxB–dÀº¬Éå¦nÍž±-*~ñ±Ç¼^3hˆ+¡¼6Ës¢uËæs2þàŠíG;Û–ªãû0lÁZBª¯(ðinj )ße(‘¢¤qÐóõTrPXòç²ÛxÁ.¨²Æi‚Pæ°[¢Ð’¶ê~«‰fµQc2oÊ^ÇÑécLæXzŸÁ7'íïÐSë] -?“øt“í&Û¡3ãœbÓ;¢Dg[!‰ÛžøçÞLbÈY3¤òÓc a–WsD›CšäËE›ma4s\Ž¢ÖŒ‰MV›‡K9ë´gDÔ=Ûóøéòöæáãø±äI™îĘÕVg¹LªøyƒkÝénµ4X¼kÙ|PaÍ)#æ7D²nE¼ëª‹æl‘¾Ý¥¥ú ÆLµ§Ö/Ô}øÊÖO#BW¬wûê…"*ÊøÉeš|¥Ü¢ý~ głȮ >í§Ù±½^ÉÚ}Ö(ß^óužÍ¶í”°>Ù½¡+Äœ²õ˜kdqò—P9á|œI<W^!œZÁ,ìãí4åµ!f•³ã#kÈR¸þ2¯4zYFx§ Ìž ûîn™92Ui•7ZèÕ×¹âq»¢>™ùÆ8[³ô̲R•ùRùWüÎ2Ưvþ˜XîÁfÎdø‚ù“gä=‘é-ôuhàGu¸Š:ä¶ú›€Í@Ëvmøq¹™—PA(Va›\ÞÖ¢ªÙs9l¥Á8³£†¢C>n®Á…Ø£òî9Q?B¢ì ÂÁ€—£¼’‘bûóé(‚Á™·•Òt‹’ºóO›‡‰SS£p¡\ÆøˆØ¨?’þl~Ã|,ds"1W­?õ;j}z«¸aë䙇5+ !2|¨Âá;ÆX„¿sõU1¹ïèyAÒœõ+Dg ¶êÓYã8\FR}Ä)S/eˆ.|}›äտ멃4í^n Øß ÝêUR}køašá> endstream endobj 71 0 obj << /Length1 1761 /Length2 10459 /Length3 0 /Length 11572 /Filter /FlateDecode >> stream xÚ´PØ-  îNhÜi܃Kpwm F‚»K€`Á!ÁÝ îNp  H°àÁ™™;3÷þ_õ^uUw¯mgí³×>´”ª¬âf`¨ +» @RIB—ƒÀÎÎÅÆÎΉBK« q±ÿÇŽB« vr†8@ÿ!é¹<Û¤@.ÏJP€¼«€ƒ ÀÁ+ÈÁ'ÈÎàdgøO ƒ“ @ ä±(±ä `gZIGO'ˆ•µËó9ÿù `0gpð±ü‘·;AÌAP€ÈÅlÿ|¢9È á`»xþW akGA ÐÝÝ dïÌæàd%ÂÈp‡¸XÔÁÎ`'7°àwËe=ø¯ÖØPhšÖç?–.î '0àÙ`1CŸS\¡`'Àóé 9E€Š#úg°âŸ,€¿.ÀÁÆñw¹¿²‚@ÿH™›;Ø;‚ ž¨Àb¨È(²¹x¸°@P‹ß ;g‡ç|b2{øƒ: #®=wøWÎæNGg6gˆÝï¿Ë<_³4ÔBÒÁÞ uqFùÍO â6¾wOà_õ…:¸C½ÿƒ,!P ËßmX¸:µ ·®`9©¿bžM(ÿجÀ.vvv>^ø-ìan ü}€¦§#ø'Çoós¾ÞŽŽËç6À¾KðóŠ·3È pqrûzÿÛñß…ƒ`1w˜­ P”ª?›Á–âçù;A<ìÏòã°ÿþüýÏèYaP;ÏÂÿ1PFCF_U™ù¯–ÿvJH8x¼Yy¸¬œ<.;À÷¿ë¨‚ ñ`ÿ'Wjéø“îó=ý‡²Û_`økAÿ]KÙáY¹`Ã?B7dça7þâø–û)ÿ*ÿ]åÿ*ôÿe$ãjg÷‡ŸáÏ€ÿd±óü+âY¹®.Ï[ äð¼ Ðÿ Õÿ¹ºvÿë“s=ï‚8ÔÊîïk„8Ë@<Àªsë?åò§]ë÷¢ÙA `UgÈï§ÀÊÁÎþ?¾çí2·}~>œŸ5ù‡ ü¼<ÿ}¤4ÔÜÁâ÷–qòð@NN Oög)qòð¼9ž×Ñìñ‡Š@6¨ƒËs à¹9_€¥ƒÊï‰òò€’¿M"PúoÄÇÊýøy@­¿‘Àsèôœgþ7úÝÐâ_ÿ r€–CžßÈÁÕé_þçc­þ¹@ëÁgÁg¶ÿ‚ü Ý¿à3/û Ç3/è¿à3/‡¿!÷sìóSý/÷33ÇÁgÿbÉñÌÃù_tù§©çÊ.ÖNàª=Ïèâîð¯„gâ®ÿ@Îg¿Çð¿ÆkîêäôüÈý±€Ï³ÿþãEƒ=Àæ(‹sæB!6ŸCÚnªÅIÝY·Æ_¥ÝÒIedõ^tjwý…”ÄXõ1è»Ó•xÒPÖò¦4Ã¥ØŃ÷~sRxK‚ZëϽI¼úÔV+ÊÂ$ÁÀDþ¾xm?ùK2VM±mŸ‡·>Ú¶/ša;åi³ßºòc¨æâÞ¸÷ÉzÔö—~ ›ÛRÛ®âU@½/fÖzoX4C›cöi–ˆ Ñ…•™ çÄsæòê+NÖÄ…|<3ŠïA4W·þgÌí¬×J¹&§s1 ±>ù‹KœÑ):o‰ÝdyÂyïâÂXù°¨BKrã¹F‘vLÐ[îÊÎEáÒ‘‰õ¢=“@ÉRÌÍ©°Xsµ Z‰¡=;¬"œìZ¾¢é“<gµŽ¯¨Š™NÁ¢¶.‡ªœái½ì^…\2ˆ"vì†ï&Ïó.çô øMÓ×}xò‹_à4Ëq1èöy vÀñÝœúNLÈB‘3 .4õE4'aȆ¨AÃÖ”YBˆ¦‡™:ƒ•8O¶"°¤%ÑSp 6£5ßå;½0žz•3÷̓E—Œ…·oÅÐàÖæßjn¹†,X”€§bÒm廡ð# w‘Ôœ¹Õ‰ûýŸ$ÌpDGË•`ƒB>óUƒ@ùɹô$MáVEתä‚ãuS%ÓïP÷,ª$,>øLÉ•N…¾1v§„YY6¦–’:æøTÆ¥“×Á6:yÞ)ÏFÀ;_9C.œªI¬4t@U/âDÄ@\®ô?3m#˜:C¤QߦûÊ:w¨ž9Uëѽêét徎&îGïä†áºŽ2›dƒö´á±òö6Yv{O6ÂŒ¸è™ –sw‰R˜jãu)jGŒ§¥†gñú\§ÙöX¯©€+¹cÌÀ•êÆ`\µ²«Ó£âkWë’˜Ù éA©ñÅœ–nÕ™(ã"_¢Æ& „®®”¬Åã^ZLcß^q•ïø]m¾)p' öÚR„›Bj¥À˜[cKœÂ7÷h)%Ès#J)%aHÂÖŽä]HçQø6“^ û•Ùë[¶=‡–±ËßI¯.Ç1ï{C‰´‘ Ò†_’ Ú׳v0}ßìZã.Ä£YLÔ–Òg­Jî®L›ÑYRHv¬¯B;ÊmjÈñÓt½.8™SÙ¯åÀ/§¼ $óeÐñqçï ¼ß[žîìGbyÝÂÍI²»’iå^“´Ó•n}cŸzéÎJÅÌ]K³Z 2ÝœŸúšº,¦À¤×&Qåo2Ä*ßžøÕŒ|`A󘲒„jìÔÁ \ðœèôïì#*B>/çnRSðf\|=ª#Õf!Òê@þ¹¤Ÿá¸˜D acŠ©~P|2‹õ)¿¢vD âíTˆÆP¤PÕùîe†Q˜¥f>}íûxÈHK¨¸ `©Â‰¹R¸±`Pž©ÓŠ«b­?µ;ùg½?sES/kö|¯ikG ÒB¿öùÍáW´U© ÖDÆÛÎ;×”.Wf<»:‹ËÜõ{M^%æŠÎá 7šòˆ‚ånã$÷¡ÛïEu"”o¢”ð™ZЫ• ÇGŠ–ç–23À"QÔ<˜ÑD¬ñQÐeö2ú†ÄO£K¯ Ãv „òÕDu`šwþþî>Ò¯âd‚Y˜ŒywÿÁc0}ŒÑ™~—êØ+ÇAؘùù†B§*ÑAÕ8PÈæ¸b=ë Ò~” s|ìÒ¨åk.YßMXâúô¥œXhõ ±\ìtö}6kF|ÀjÀ²ÌM‡»’Šf\•”³|êˆiKݯî`o¤—wíš«œ•ÚÄñ•ÊÎß§cîÎ0ý;h%‚—¬ßŸ}£!›gY?ÉÚ'9wØSHY¢zói¢ c3ÐTÆ9.U¬5ÆG/_ÃÐpÜJþ%cê¬ÂœCUn%nýšÍ.[mÖfH†Ö&«Xµ…ã¨ÕËŒs¨²F'`U‰Ù^¡1¤yà‹% Õ2Ë/¯¯Jèî*™/È×]ñzÄuG6 r{ šL&/Ñ@&݆}âgßë±îÂS—¨ÎÒœCóŽcÈ¥K=¡ùç/8raÝIrýt«ôdÓµƒTœ…¶@z@'G¨ò´ôNvcЭ1QÔTCpm_Pì¨>0Ú0„yã¿!Qó>{dEXïÚ:˜ÒPqñe.fïëZÇú\0ÿOš_ÔT`äÉ×8³¶ä¨ä§–«–!9ɱï³FP+qJ‚êÐTÝI¥ëŠ.'h”[C–„sŠŸÞQÙè"´ê:¿xPr"Yø)]UwðiVñžj—ò€É’ˆ9ƒVK<"~bE” §kÓƒ/ù”—š´ó DyùúÝ&õ îÝêPÒka”Yn0á»lgí25àêµa‰¡©Ùúæ,Í•ÓëÆ1Ñ8`!ɵ@Œp†®„ÖÏýE¾J¶lž’M"‰†Mu9@ZmˆŠH›w“ŽÜ›Ãj»h¿ümªmÒëä°ƒ÷¬}޶°èª¶•7Ç•é?d@/Z4ÜĦó { î;ÓžÔéOp=#ÇaX´ÎÃßý2 _€o#n¾1Ä/¡n8[òE§p——½C³·6e³æ2‘Å> 䨕ÿêwmóï.vȶLkGZ¶^Èc·å,wìŒÊÁ ›6ŰŠ] ±žï Êújмù ]¯; Í7غÒ»g`=T¥xÂÈüL Yuì­ã|…לÐç+Ç´ZG(!9!â)š®b2‹ÐÆ‚s/¸‘Tc&½“­mÂÑ0­}rkÆL®à Ãna"i9 ~ÍZµä–5-·ýÀà½Ó;&¸Œ‚œVÿ¸jÄ –o\0#I1œůɺµºvfÆÏõü5`R9 ñ™ðÓ.9 È¥Ø[s:5êôØL[w&ÃE|o…UU°E—«ä»ð­x+KÊvÐÚ4Ú0ËÉÕBäû©Ð5¤YœÔ¤ã(ÅAÆd*ÍÜöR9c&ê†jšûËm–‘3=é[Ú‡4ԇ輷SÞÇÈ÷e;• †2n—Z:ä¨vG(´Vu3X‡¡6¼~8’¨3øËT>ÛÚI~>öÄlY¦%{¤`œ¤…6èÌÊ|TÂà)a¥yVøáÍìøë¿m?,Y¢€Èå†ÒfIŽhf0y—öÝ•î$3^P@²`a]¸õ3’µafŒì·"µ¿ÂÄ/©Ü%T^¶1ZÁ@›QÎhYáäµ² ,«5uùf€l$¡æáQÈZðïX®­ùŽù•r¹'~’½ôÚÜ­]·y´wr»ÌP½ˆ¡FùlàqÖºirÝZ8¢ØÛÔ—…êYVš\}1Áƒ9¥.ô¶ÜW“<õ-³îBœ¿ò[ØtªÝ£¬zÁÝú5wÙúÞR5Ï¡ñ0 Sé+³1=K*Ư 𛎷õÂØÐñ0b*ýç¨ÍN­†ïôã¡|¸ê”sXälÃÈõ9—ūµ~^ŠÞoÅ aÔ§­i£½”5äW<ÉlŒ3û¿| ¯‡ {Å8­9é7© ÿBÿ—*;Bl¢¼*ƒˆŸÀ]oÁª[÷†ñr0Bc{¸.ÏékëÊÓA e¬…Ï%´ÑsnˆËVn¢;ܼµ|o®â ö)Ïë•/ºmr7T¸É‹Ûñ;ÌVž¶ò›£a]rdÎ<϶k·.O鎽ÏÝÕ ˜õ#å?ä¾mBan^C=Þ´‡²|·Q‚J[ʡ٣«Ë’WiÁWÔéaTñ÷¤ß(‡ç=}RÀŠ$5êË— ,í'T Ç<Þ¡Ÿg»²íòVìIÝ¢šånÒš«×†­CÛ(ᙂ7ÏÒsððø#)–•1]M4?ýLçh@£ ;bBç+Ó¹Êù\Þ†0?ͱ—ÔS¡ ¢ÂÆYj T”õðVj¹_ªPIÏßù“Ožœí¿–‰í ÈÆœ2  õ`ǃÁÞ|@M»Ô÷öŠî½X¥` !B;äùBß ÿ²®{ÌDkeî×êg¶¹« 3S¶¯•ív{•5¬ü),÷ŠE0 >‚¼Ü³i¸ß©X7ßÌ ëB`ÚIdOùá½ð ½fÝÎFíPFø¨ƒ«cÞê;‰»Aø^Ô¿G›Å"ÖF¨°Ü…LS½‹O‰¿[êÀ¿iR1ËYÏ;BªŽšõ&XÊTbh#ÔH-À²΢SFK¦wLØB}}uµl"‰MË1gq?|’–ÆXæ¦ê,6ø9Tî‹ÀÀG»Ð’¶` ä”k° ¯(ra&<*‘„såóEHo#µ²Ó®KÆ{¡”ÿêãv .=‹H°Ý>YžþÛ·bÕ¦Dx’QÕG,¼ÄK>gZÄ»Ÿ 8¿”xß4nm{_˜Ô’E>‹ÛîS›AÃeê²tùfhÜGº:J6v—=Æò‚8,Ë“ËÙ™s¾$Ä»)hº’û–®ðGTŸ!ôΛœ¦“Uw"NêÖaAŸ‘É6ÞÕœyî7·Õ3¶N§~r!0Ò1ö3§énUf,=é¥AëƒXz¡b©kNdŠ„]ô¿(¸FM Äù$cýt™M¶S;Ô©eˆk÷¹EJ­Z wÔQ¾œcØ` týŽðÍëÂìauPj5é~™“ÞÔaágåÈê¬Úó)b+d˜³A-]:ë±w¼q *;ç¿ÖftÆ9kŒ—ˆnâ`1¼d«ïåìéñ²‡OËv'ªE‘;6+Ó+ ^Ù”‡Á}‰¤W÷ƒºGqõx—1ͺҾ05CC·Á:8­&»Yvvj%¸¼ˆ‡âÀ2µq$\3i÷ú/W6”i VÕÝljV‚£z½3è¤+Þ æÚ¾`F쑞¦“I×4Êù$¡dùÍ.eTY*”@l= ±G^ÝöõMÔ¯\¿kýìmQÔóX ü7ZßÔì;'/E,Ýëm•—²Á=væ S6à[3Žz}2, Þà—Ú-‡q} 6øî5€Ñ ë=µ&³ìZL…žwò:D§VÍ,tí6“H÷ðÃÈÎ`MãbXÖyŠðéd£aEÁ"íYàèÐó¶Ê‹ßÉ^ÊQiü$Éc(ë6|³Ñ7à•jQÅõ¯²‰;ºÑãã|ñF+eÔrV£4Þ$4ªZk Œo/¹5?¤kåAjaùˈ–ŽëxŒ¯OäF{ÛÊ‚]1C™ÒÕ…»¿Ÿm4P ²½Ø÷O»A¦«¸ [¬×|™£Hª,P+ë÷š4ÞÊþške¨CyBé|1üõÉI Ôºibp›|#Ú>M‹ªà'¼<⑺áê R¦>U3'䟄ÞÒ$˜õT´<º‡Eht+Yìî«u¤=®ZÖE MÖ» ®¬P`Ðí*µe05òÆ_Þo+õL{ÞÉZ4_*’ñR~¦}¥°ê¸Ï’¾ uì&x¥è§#Åìã¤GhŸÔ3Ü9@š"½ÖÆárL€'Ièf„Â¥4{ÂlÌ{½0qmÙßAY§á/·¦¨ÙTHô‹Ó3ˆÕ©t¦Š­þ‘Y¥›“Pû:OÄEÍF‹WliËžÊõÍöXm“û\Yo˜UÈ9Q‹/Þ‡¤Í_0îgáÝE8£'Gñ¤ÂÃb2*šÙ¦+Øá7Œ}íý 耧@ÌëónÓ%Dr¿µÛRIDTú" 2$6h¸¹l'õk‹Û—î‚¶h+ªšYY”CñæŽâÐu­zì³éÊëa²Ÿ¦Æ”2!B‡^ádã-7n‰W¢ÜSšßÆ[a}á>ž¼B›ÍK ?šü"Êš»…±Ëõ}]¡Ecúˆ•ÖC¸|zÁ‘ȧ‘Éa®–’e,šLÞëE·‡0\”ËýÑ&rqfɾÖ4jC1€?«wzâ›vÌ J'ÝŸ8Åš°q#®éãk%Ë\JÎü0ÁM 9Ü -á#iÓ\ä°õÈÌ9çz vm¿Ÿã.ˆ ã0v½Y»þ5)`⋽qXò>‡……½2IÄGiÕ'B¹îäEüÑÑÚ mfÚCéþÇV Ø®l°?@G‹ÿ^èêÉM Æ»êLc IAdœD÷s3i}ƒêwb~FeÀµBc[ýIŒ.¿fŠX÷G®,Š¢hC¥–Årëä>¹±Ã•dFøåZJiµ1Žæó.ÒÈu«¥LfÙÍeC—QÔS§Ä7"=€§UÿþŸC™C½$¼zKeeC53¥‚ãCÝuOn%M&Œùë_>Ûâˆc^‰þ(žŸŠÐðäÉÁeŠ iiêÀ°‹Ëç½+4xØ2EæÐîóÝÍ)üTa½TD€0ñ²þgüÏ*Jió®ÞU§˹°Ì4ªŒ9º3˜»w4£7î#å‡.ï^!ty2aÇBvñ‡#¾;8 |¹wÙëê;jq­ØƒÕ½Äp»ÔJA’;r=Hƒa©~ËX›òÄWö@V—TbƒXY†øÅm„Tµ®¢oÿ\a¨7ÂÆC.JD)–æ«—pþ…ãÕ·ˆè ‹)=éN:Rbªtqlyƒ<#¯Üëoâ(}§räAíôüÈföÝß‹6"=¥»É‡îîºZxi21¹÷“8µ # ªgH.¬] Ÿ|dX¼¹h"ŽÏÊÇÄc¨owe/ÍmêôÂYFCh}âèg½ñDØ"Oh=,‡?ÈÄ÷Ð3µ¿Žö´ž×P мWÏéK¯Õ2ka LßûÖåµVáįû£Ðíx0»åÔüÈ4„óS3#-&íRïN8¼ ®‰â|^gdïŒç°@7{D~FÄ»\…eFÅf8Ò¬µõ8‹H„Dež=@llÆÃHºq¨ï÷R7ª}N­g°Ò6fŽö']´«Yõz½ÏÃüd8½Zï”3Â>ž²´¿Ë”à 6…-·ixÑ܆ÂÍfiµ•c=.¡òów-¸”š:¾œMEK¬ ñc!ÌkKzsõiRú5g¥ŒnoQlIÜ“6>Ú@ßÖuOìˆáÒÍ£RVö©´³̲ƒ¯M×Î7ZYÌìtvÛÊ{eœB\é(VÐR5ÎÕ…Òð1Vâß*ñ©-Ò»Ù”']Þ2—sÏ­ZÄÖËî‚°D yâbZבø)€{ÒAS"Ò1 ~‹jÝÙÇAÊØGó›å«ì;ºÛo]xoDä#5ˆ×œnŠ/ý6ͤå'·,xÌz(ÌÄ jXÅZT "ÌÛLµr?•¸\/ÕP÷ó÷Øíœè: Üè|(é«a/d$Úë/£Çö·æ3^{žY¥øŠ ¡ Áä3¦ ”ëòJ—÷ñ#3|‹’ytff:¹ªëþABU¯Ptõv¬®„ÀçjzÎcõA]¯½ãX°Zž³‘éCŽÖÌûCûlœðòdà æ…î3åÍŸÓ»ÅЋ,²7޾û Â?¶Ãòé®?-Iâ|ÍB¨Ým~E_}Öö#þ5Þv|Þ‡œÂ±@*!V láK=ÖÜ8í“|á1®…­€’bP!!´ ÀÝñ+ZÕ% 瀷¥aɪ¬&ãÎ$ÛÇŸ)FȉårX{ ð½IÆU†$U¡4hÏŽRì9›îNnÊ$U· ΩQÁÍ%V"l Mè—KކµM÷½sáΡ8àxCþ¨Ö¿ÇMJ/ŽçC` 1É 9qèAÿ¦LY˜í0ž×c„Ï ¯‚šºÐ^uçþR÷¾ò\·@v7ð ã:Ë×P?^·œ15pÞÕàå[üYò“F¼|oå´·áa3GqE®5–Û6z¯Â!w±ÃÐÖÅ—³·k‡…<Âl÷iAÚoêjÔN¼îçÈwå6úÊðLÑæÙÇ\alûÞÛøeÓ uÈøQ%øšu!*5N[¼¾j÷G´`´¥œ]Õ6Q`Kqrn UL4©”CõçÍÓ6‡Ù93§òga®œïß½™(|H™¸O&­Žhú¸¡KRYëÃ/Û¢f7Ôà^£—M’"+y’ÕýÆ^ä„©ïT| Õ§u´b“è•)vInOÂΙ³ÁôÐWkŒ—Õg<3õ‘?êýÈ›5ûËבéæÅ·â1”ê/?ßfcûo•‘5…¶?:z r²’öëÇ¿î¸Ýž€z“¯ÀÿõÓ_tJ…õº.<é+óÓÛ•K‘}J%LÄ3=4¿0;D>%¼ÆŸ"¢Eò}RègÙË'37H¯¸Ï´L-AMè Â]0i¿ÙÖ&ÃQûfCq`—öÎ÷}¾ 'ÃÞJÃÅÝõ‹óÏdR,Î\Þè¤Ý*,XX]e„éöXýAÓ¶ôØjÔ’¸©Ì3 p‰5èü“"F ÒÆ'Ëqe»^YÂÒB. É©Pé%ŒÀ(ÌSá™ÆG‘œW…8ÑS'"Ôk¹Ê— ?E¸'[©Š¶Ýµ?píñQìb§Œ¦BT³L©¦Ið‡ »WÙ¾1ÕÏ)ßÙiÑ’¸}Y8¥Ã0ŽgÙ@\´„ã<×—nù¾¨C(e'ðU<úSˆåÝË£’*å,º ow ¿ì¬¾º¸,u9’bÄšøªkΙEŸvš”/8|dÉ­*Ò:qèµFÏ·4ÆÀ)æLvÖú„óãSùY!a˜¥‹‡Moñ°{Ü—õš„óÈÝ»œC‡z<)Å鿼þ†CÒý½ˆÇz™;6Ze½ë“Ĩ»#W)3‹õEã emd}*¹]#‘çÝÐ9â•¡`ÂH X,¡Å o“hSèóá[Ž#íz a=囂ɇfÕµÖþ;Z[Öô:fe2»’æÒ¶­\aµ'Éñ-SFL}r]‰Ü'<¼ÌÕ./'ÉmŸ~èìÝðt¾ ÎÕcöÄjÐ^ c|åI@{iŒ`±O™ 6þ6ÕMŸóndg||íð+ÅèFÇÛ%SKŸÇ‘ž,'oŸ¦\Øjû…šµŸ9äì/ÉÈòZBø€qÚ¯Õ‘\â§ž®{UàÀGö4'¨"[œý ü~Û«)KÁýgc4ˆ2¨Tœ¶ N‚=×ðêFÁ÷ÄW†¬-ÛDum°h(e¯ƒ¤²Ú¯ò"6_Ç©ïçZõïû,ñ¬Mýú9l8ÀîÊüœZÜ«ñÒÑ݈Àƒ~ ‡ey¡º|™_BU—nòÞ:[âóú“œ¿ gÍzÐ$O›æ%Gª&þ» ½WŠ'·˜'O8ëŽpÓŕϡ¶‰:±(…I{»=G^—="®qÚã1©‹¬ò×ü¬v_˜H@"Ž%OÒ¯Ìî°À:£9ÜìñíƒF=ÀûbO ‰I¯Z`>¸w}â@ƒ€Ïàëö8m>ÿ}7_¾Ç“êÊHnÂщóiÀÅýGÜ0CI‚h²qØ&ÿS‚òbÆVZø‰£2`qÙ"Â$ÿ»Äò;€–´ØûÑ='îA¢Ó#+ñ˜¢<̬£Š'™¢˜@¸] [†…1«•HœÔÏ$3ƒŸ]]¼hRûÊ—û-_Is­g€{8""½÷*CxÉXP.¬N‚I[w^nˆ!¦Àž¯Ð '„[TÞ#-7;¡dN[‘KÉ(x)¦B)’ÐÎ[w,C-~2‡¨£%/q2p·ò{ÏâÆûu}jDꈦ–b`ºùG]GÑg[µ Ù œ@I^g—„­|½ÍÚŠQ*.A’ëŠíagþB ¶®Æ¼­›;FÙí(ÒFkصÈE»ÇTà/_hm«I@˜Ú×Ùð²•,œÖÑ\uš—ë¹*åÛ•+ Î\rQ~'«þ|*óŒwt<äxA ŸÕqŒ©ªo„óx@¤Ãc{Êè©™> •Üðéæw6ÀbÛ< Ç÷‰ÏÚíŒ}™YzÅ—³ÅÄX#‰B$éÁ€V¾À$#‘ßÚbaHõnYC·ÓO¾ï–B¾‘Žº”ù”zUäýqyIFÈv÷‘-i™øÅ‚’£U,<ë¥Ñ€7ï”Y(ok!»,Óþ²PtãÜé¼çmæY©IÂzᵈ`á|ï¥Dð€j\á¹O™óŒÓIî\f&q¾·,6¥·~“-GËÓݬû‰LV½!ðß=5tpƒ e A–·õ3mLçyÁõÔd ¥ §U¼Öäu=ú›Ã¹JÂÃüÔ9¨Å÷22TGhæ~®a·"»}›û·,xL|WzõxÅ£ÁoÒÇ"fÅã¹R–È„ó2§þØ%”ÖºúÒêkÄ5—^8rÌZêt*¯QÔ$Ì;ˆQx*VkW‘|¸õÖ:¡Ïàb¢kS4PYO&º”Hs‡!Kr°(˜;ºÝv:„s4â¿b»>`o‘€Jt‹È¹¥ò~Øò‚ü ¹Q¾”w•]ù±ÂZLÞD˜#÷ ~€œD‰›Y›Óë„Ãäõ$ßJG&?[­åУ¨ëM jµžçd>JçH·’ù w01’Ž{¼Þ®ƒÅx_OQq^6yâÜÃÃÕ†±ï¦«ûõÕ zjO""•ð‰ß+Ç­=rŒüZ…¼ùò¢Å,gºŒÎôL÷Ÿ#¯éÉ^[w°ž` Ú'u-l‹Ò.+W!UÂzÒg¸þ«ß¿Z{Ýí!Ó¡ªPÇ÷2òÃa凓‚¼–o|ŽÃÛßËçûfëó}ûŽy“H.¶ŠÎ—Cw[Åj½•_-F·="í"d7$ÀÙzý*ïè¼Û9ð«pŸÔZ¡Â{8Xð #žt2ò"…ËFͯC{®xDaV?„B@ج‘ºSTÒØ/ˤçö)5^yp waõ^Æ]•.ÚKeŽçÌ%û㬖»¨q!Sù/1j%3™Õ}-q³m{3‘ÙÍÙb‡ }n:§ßy0PäzÒÌöߑֶ.JÞPº¼e¼:óñʪcÛnO‘G±%üp¥ÆèúÍ€ â;]_æž lDTËÎ×Ã~<“Ùð» 4¯šérÜ×Ì4=nì›Ñ…ÞøGõ Œ™6vŽÈ.c:—ê0ÝH}‰ªª1o·½ã„§qPŠò¾š^••æ!ʆ))ëRKq[h¦@LqEòè…+Épº«+=“•ì÷¤òiºñyźÈûòï±jè>î\¬ZI¢7Ob}½·ûËÒÛž…Á%üŒ½jëš¹‚·Ã5-!/°£ªüoLäüu'A^œÿБfŽÓØ=‹Í2ƒó“i ñZasIp «LÆUL  ˆ>t¡åüx€v§ endstream endobj 73 0 obj << /Length1 1416 /Length2 6052 /Length3 0 /Length 7019 /Filter /FlateDecode >> stream xÚwT“ÛÒ6Ò„ RE:QCHè½÷*¥† ”$$‘Š ½IïU©*½ƒH‘* H¥ƒ)*J/_PϽ÷Üÿ_ëûVÖJÞ™yföÌÞϳ×Λwøí‘v05$ËI•uu5Á $, 89áXWØß~§) #RÿPFà X¼O‚Åu‘ ÖW X“‹K@@!Hòo -TxÀíº@-$†p*#QÞh¸£¿Îß@n(,))~çW:PÑ ††C! .ësï…¸P8 ëýÜ2NX,JJPÐÓÓSâ†@¢åxî=áX' ! C{Àì#õ n°?£ 8ÆNpÌï€Òë AÀx‡+ C`ð)ö04¿:ÐHS¨‚!~ƒu~îÿl,þW¹?Ù…àˆ_É(醂 ¼áG ÜÔWÓÀzaï!û ăÄçC< pWˆð«uPMÑÁOøg>  Ga1¸ëÅŒ‚eðÛ¬Š°WFº¹ÁX à¢?8Åï»·àŸÃuA =>[p„½ÃÅöP‚&¸û˜¦Ê Þø·Ï†Š‚$Ä…%D0w Ì ê$x±€±7 ö+¾pãgðóA!Q@ü0?¸ ÿðÁ@<`@,úÌÏç?ÿ´`0ÐÅí`ŽpàßÕñn˜Ãoþh¸Ð„§ºøüëÉ Ï0{$ÂÕûßð_G,htOí®’)ߟ‘ÿTRBz}ø……€üB¢ $"Ç?øý³Î]üOÿ‘«‰p@/Š]ô‹ß¨¿{öøCî? áþ³˜O]ûßL·‰‚ ø/ðÿ™ï¿Rþ4¿¨ò¿2ý¿;R{àêú+ÎýðÿÄ!npWï??»Úš#»]ÜÄùþ¥ñDŸ–[”OÌR”ؤŠÑÝwY£¨ÚÉåí»8)}ÿªîü˜èÉEW¢&®Ò¢×Ú^Y’¥CÏ"iúå“!¶É®ÏxEt—á¯ÜOn±AKÑ–©z·´eZ žT ½ý}3Ô]¬QZV¾s„b©U¥ûXTD.W˜Î<½ö3·Øc3ƒÆÇNVaÓ¾ûÅ8‘³§;­­J\SîQˆšhÜBÍŒoFÁ“ã-°à›ZhzU´2ÎÓmqß·ÂkÑJ§× YèW†kqýºðúq4R Èžól£-28†A 9âVÙôRWø[)aœ=A‰^Þ‹ãÝ@ú·=Èa€GI`ôñ&ît“0¨@ÕâHžß½.m:Úæ(Öû´›‚PnòÎù¹æTý-7EÐà©¡pýD/]ŸO+ßSúæeIêÅøƒ•aݤe}J'?~ÚiîÇWÑô­'ÄF·(.ì6åFñŒU1½ÒR"H& ùìsÖæ®°#3ÓN–ì5v‹Vös»s¤ÍõïJ,¦óÇ=.×o›ÝbÿÊH¸\Ÿùz²½Ž¼¯†Ñç N*àܲÚnòŒÖ{Y6¦!·§â·÷l:;¾û^òµ–¯µU`çûåAŽ%×HÛÀv­MYZÏ!¾¶­N1Åvy:<ïmA-¸@ÎIß«Í Ä½´iNŒF !O¹HúÑ ÎøG7&¬“ @7³«Ît}g a¸³ÐÆjS¨¨á%Äù¦Ä'›Á$y÷¦g*…=žÇÇÆºäÝ±Ž¶KÈøŽh"ƒP „ˆØ(‘.mÐ’ÐÌœô ƒ·øF¦¨Ç.Q~1««êG!³TN²^DµzÉõ;|Ш9¶`·2VÝïpÎ0ì‹ôä;¡X^¦ßf¤QͺJ,ãÌgPÕ»¹™Ù7MfíëoÖHÛ‹<Í7.¤œ•º³tìAwªË;3!͇¾~Ù<º‚wÕx£À`lÞ³[âÞc'¶ŽÑïi™èyßç¨MùØ¿lq ýô5¯Ì'Bgt“+¼½Ðož-¹Ô_´p|ð­n^N>vj¹Ö8ïcò›¡gÆØ¢ Œ-Ö´Ü&h^ceé` ÷>ùÚxÍ/8/ »:eþ4¨ù–xÀ¶;6xÁáØ¯fu$‰§2T‚ØÈpÌ<ÙûL¦VÈ9Yߺe1¨™Š³ýJ¬IvsÈ‚ÜxŒ`^iÅ3e7äü hˆ³Ôï jú†ýg'z¹HšÈËÖž*Eß`»ö׺ˆ6 pû{#Ö muòd¨+pai–ê@¥î&EVØÉ [ïîÞ¢‘[eÚÐõU`Wî盟ÆÈÙ^ÚÆ7ÇÞ“·Q´¤é&C,¢€ê€lQ¡ûÂR Ù Ì}2÷ÔG|À‡çPSMÆJ"1n´î­Ãlˆ}@@Ðìs½ÍP!+(²¸/²s.»ÅúþÒÃ{ºÂÉš·CC{²Ê×r÷ã½OÚ:&ÝÍ|á;¼u]‘¢~Ï %‹nTæÞƒ´ÔR_ƒÝ[Ïð‹#{&ä§úfcZI?ô2úòô `±X»ÿ@hÛE)!¼çÌõ›œgœù†Ì'{1•=Ä^4¯hý–Õø92oeÚÑÝä®Ã¹¨Úa¥kz¯­;4ve»P,ë1î‹”‘Š¥ïÎ×Ìœ;+òfÚ:ކ<¯ª&ç.ú,=XipÕ„=Xe·öVAú°S™@¶Î¥fÁxú3ä(î¨H~ˆ!Mù5­¥Ùf·<ä2õ¨ƒ>™ÙÜ;Â¥’Ü’G ÙƒøÁ„r® ѽ+oFKŽêÞ$¬âŸ×¹gzÿ¹Ýó‹AЃAgz9Õq—ê€ê›æÝí:q­õ‡OzãMR+÷3—€ºa®ÇÆ,}ˆÑ3ïÌ.˜IOÏùOLˆ"ñLV$2D˜}È׊Xa•¾¼ÊŒk œÕ+çJfJRoV¨ ”$”îѼ´1¬†Kâ(j 0ù(¨MHäúÁAÌË}!•ÜPíéWõHCC°†—óxÚ.Ù%±âç½*o¤×»zçòo©^ùÕF¯Òˆ,½ëx7ä›sL×iÕ3²‘ò±÷1»@Bò,èq3ƒiU4©4yg-e uiè…Çx8[~<+§Jt^^¯ÏMÒfÉÿf4#[ΦV'@ƒ‡m°WÇj ºŸÿИÁNÇOPnHÔ…æ ìçSý3qzÑŸá·™¥’?ÜyjbC¯sW>¾®·ÿ†žrùª‘îþ{øÖû«SrÉר{†ÂW®¬üæýà|Û¬3[eCb-Šc{Ìw;çfƒZä|ÿ`dãÓú”N¢´ÍC€½AŠ–&G}sJç½>î ôn†îk´ùZ þTD’wR^ˆÕ|ºa>Îó÷R¼Ü|Æbt‡D+DF±3¡8Þ=ïíÊýhIçRÓ0öe;Ñ–IÍ·/käíŒ/ÜFyéOâŒé$ã¦U› Íôù§R&:¢)+5ÖQ« × ¤l·È,q§¯©GÇØ‚UMI|²Á;àÁ ãªdSÓQQo3m_\ÀèÎRêwß©zìåg%ûõSÙrܤðT»ñ„–˪EukÝÙ{aÛS¼3drE×Ôìyæ¾ÀgÚ{üصô´õʲj!\öûñÁ…a#1,¸ÎµkÖö¥]Æj$An3æ&ý« Oöýôq•ê5#ìÕB¨è—·Ê‹ QÝ¢T½^:*oÛÓ"ëžvë±¾3$êD}ÍrèñZRáNy4ˆÈ«žšÈš†ÏÄ<y¹Ú9ÙôéX=GVIĶ£jñŒŸ¨ô´áËÞµµ ’@Ü«”•Xt9 åÆÂ(G¡Òs BÁȸÏRJô{À‰¹\êÌ9£Càb +Œm a7Ù7£9‘»Š^$w¾˜{ý»Rõ)?µKË˦œž—ÂÅÝ“—ÚlånQ³ s6Š­~h¿ß<ÖNCv‡ÃFî6®bATÓƒòø^þ=‚‚Ô|&QñTÂM7¹÷9‹Ø¾UOúÖrº?éHBI+j¾e?õz#£²zѵ€D½w¹•»æ}¥Ú—¿‰Qµ+ÎŒ÷ÚÚ.·:K RÞ ¸_p~fRÄÉ{,Ælùq§^iu1q*^¦cån4ŠÈ¹, ½gݳÂ/™ƒ—h=Ïiø9|eRØ=ð³v¯9Û9Äï)Àò5VCyãòVÿ[º @eqø²ŸÜëZº’NT*󤂹ucøÔ÷µ€O*´2Ìõô8?œ»˜~ê¡2Yß··,,“÷ÏP@®TbÊZÕç j1n<ó7æ „IJ±ó†+ðLW§—ËÍSåt©ÉõÏ6Cü/ý\üuF>-}}u@]¶Ëú…ÓÇ —ŠÌ&8¹„ÝXü¡ÆúÆ¡—ú¹@|(å&ƒþAhÆý¨oÎKjtÆ3-ï®Þá€l1NWc’jó >Zº@]ÀÈ*¾Õ‡daƒ«óĪav[Qw”ËÝw:¹BOÍi75ó3{ÆÓˆÑ¯,§ë_?zsþéĆ´õHXlFÛß@É/¯Èrx¯*t|Ç…ôiÐPŸb;÷¤•î2ãjJr*ºý™8ëÀ²‘÷úÉU®³Ãï¼eYvK¬q¢ªÑŒ8޳GЯs £HTì+Åï„NÅh EÈ«p[­·‰g.Q-MƒêªNã\kò׃B€ù´ å̶ÉÙK ’Q7Ó– :‰ãT+C,ÅJ\[Å_L¼&Ò¡üª#L+!‰È—ÆvŸfÛD—+Ú~¾Jj•{ñEÛË]¸³pá ¶˜µ,s=îïˆÙÎpPþ ìªj¼BEs’À–õº¦P*—›UC®¶6uwp¶f\ºâàcï‡'Á~nfYëü?êt‡p[Œ_\Nôäi'¦QÎ&Ó"H˜š³¤ÞL©Ÿ úúEªë·¨9'Ku[»Kû6‰‚Œî¹í>kaÚ ÷ŒÚñ½­¥e’[/Î=Ú¢÷œÏ¨ bäÓrgYÇVEJ0R­V½ÌÒBå!¯ªå]Ûj«¡t4Ëgw voÂÈò§7ø±àÇ™{ãídB“gN]NW|æI×G’™Cy´Á±o{ˆ–¾J¨sRG †ZÞlö4èþK>Fœ¾æ€l2‹Þ|žÓ JŽü4¥r3¥ÞY…|ì¶„ô•‡O¶kÏw0Ĭ¹Ö•²ŽÊߟÆ×ÎÊ­m~À]–ޱ±JlAûãÿj$VDbRt)?Ww|Ü”vô†YŠòHIV’cïòÞMŽLÞ±ø½ã>'4åÞÍ rvX©ôÚÀµ€Q³n{ÿõ3jÚâ9AÁœx¹¾0Æ ^iúÜýJü`cÅ‹¤2ª ÔgǽKžÞVó–Y3!w·ogò9 µë÷¥}ööŒ›DQ…¶ç¾Ž-Ö{º5Nµ@Úê²¹Ðe¿àÕ¡é¤*ÛT^h•`…'´û]mþ¦ùèäk¦Ð,cùí«…aÄégÝä•©€÷ ЧÞM&†. Dqø7’ºþæoÛBƒ}[ÌïŽç™¾êæ^ÇÍl¸ùx¼zÜ©‡åÍü‘¥"PI¯dJ °‘ƺŒÏñgfoˆ°rד¨•m¥3^9œýZÍt‰HQ?—»<óÆ¡Š“{æ5¤2­qKˆ‹$I¡½å_a·´+|SöêŽÁzR*÷¦ŠŒtseWÃñü¤æÊ‘†Žõiýü‰b­c¨zâ[=£ÞHhÐøÏæhÐÙ%ñ÷Ê­••ò£Ö*édgÑq#¶)ÛtY®îeÜBV³méz0ælíµ$P ëùâQ8åà…uLÚö5ºëÔ¶wýÎÙeµgÏåUVµ™33¹jøv"òÑ–B䢽&P­›Ÿî™<)u"©ã%´ÍCŸ(R”%šHôôv#ãxQ˜+,GWU ÷]]Ší|;ƒÒ†ñшœ„!ïáÐ úàÉz?¶—kÚëµMƒn¿`ZŒÎIF©JµzögçŒÐ«Bi(s;K;e5÷Ö#еzm¿¿I2ç1ôÚšKX#êò"˜r*¹MÖ¬¢Á¸‘; ê#„Öùw4Ñk^Y mÜ ,”r'¦ïésòÖž­=S“–¹wžû.ä§§ïö‹†yòqjÚ]cAtÛi{Å–b—ÝFKo~íɲk)§+n”ñÇ|NT¹«¬'¢mY?»½*¯zû‡!bô ùÖÆ¢ËíÙÜÝ£¼c_- žó] KbfR:¿;I£&ò*2<)[V™§ß’_~O(ý4·®þ®—º#‘„ !ØcMSwÑ;Š C‚^DP—Õ·²¡ív®¬­S !I<ö*í„K?ü驌ÝQrVnÓ%ÀR.C8›´ìÕLbõé‡qTâFhWh5G„ËÞò[…%²º¢´(ˆn@øë”t·û«a¾'i»vŸØÒ)®`uÂ$Fª@©ýá¾Ãc­úl<óîïV¨Ô’±ä)ú¹„ù²^Õ…ÍÝ$QSW?Ù¬vËž'Rò¥VŒêK®„*ú 2<±¤Xô¶¦¼#ëeÝñ„äelûü1}²0g¥©% ùùàÏ+*$/câY,ïz«$M¶]v3+²¹`9Oñõä¡Ö´] ,ë„C ¾Ì+~­lcÔ-á>E®Uo…W_é?=$% !lOA îÇbG˜(¼(’wöøéyÅë·4†m dvÀý€¦ ãK5Ó.ïESíÍ1Ç)«‚ì]ÌPâ+îÞ†£2½l‹^²»üYáÄ?Õ‡éü*ï5}ÃAÓÇw+†ùyà„?ÜL'æ¹Ku2R–Ì£ž]:CÉ VQ¶qÕŒýT­~´?™/6âdáÒmôŽÉ¿§\Dnw´ÔXÃG®èy];pð ÈRŸEž¯*¶Ìêj†“!9;Ôí·a²2O÷ÿ+Í£‚õDÞÀà¼ò.§`1éaEš/%T‡Š8x·Ö˜˜:÷οšš0ëœYç˜)T|¼°Lï~û@®RtÕ|dÛ†l#/×` ±ø ÿ‡aq·ÓFzÚ\“_K°_¯g¯î~Õè¤uÒPÔ‘Çò”Û9æÜn…—^ÖÍ|:š¢é¹6lUÖ¾ÅȘ6{”ö‚G“ž°ó²Çª1m§ò—tN×Q?Ä!Eƒú g^ÔØ—Q©>L<éçê¤{ô‘´§¸àð¡N“€<¨v–ÿýÒ”‘­ò‚Gâî0ãŒúb»B  [Ý07Z‰56Ó· eý." ïÅá•àõ™úÇãCóFƼÒG mu:›o š›È]\‘YÐ÷Á¸T/©Y ß6qªvMKÛÏ cbÏÏÏ0îaÆ¥­NÄÐSÛ:‰\Rf÷"»ZÒãKŽÏ êtìå¢#µ/g^U8~oùÍHOJâI>ý_ŽÄëEód&òs<Ëã†vœ#'SÈ膀´5¹H±«K]½þ»v¦ÌXÎHIœò¤'ÀµŸj«gÄÒŸÑï:‡G'2E¥0}Ê1tžìÌ;ðh#o Â~峊½Æ»5¸_ŽË+w: š<´ä*êæ k?_ÿé.PÕÈÚ6û®0ìF×Páf¯k’©—ðžqöó+ûœ:v8&R;#ÜX­ R*î½Ñ+„𠸧ï]Ý÷'Qו™ e™\oáuF«Ã<.ëùølrNñ[D/åð§ñå6Ñ X¦Kœ”aªQ¹®_]ÞÈ’pëq@@äu£†U†¬¤²kˆØ#Œ$™Õ„`§X÷¼ø©cKptzy錔–åø AIBûζt36â ¸|²Eé[ý³ðîÏ>¡vî圱ý5GD-?\TÊu¶¼ Z$™É"ŸÝqr›Úç,ú8jLÄË­„ò®Å…K;J´2pœrÝ·»‡©¸\s~­¥ØË© a~ÅѲ$:©cNLJ”‘–à j³ux™L>¦µ Í‹³âŸyíÍÏ->”‘j©èÅynþ¤À¤c>áyR†ìX PHiød”{ëäG‹ %ŸÅºø¬ÍíQxz õqKʽø®ý¥w‡–ûÇŸÖ;V>|³F‘‘àúÙz`G¤®ÿaž¯…¸¸\³èx®¨æ•Âm‰è®ñËI6.ðrûÂø‘vèõ …kzÃ7ÙŒãÝ(IÉùþÚ(›^ endstream endobj 75 0 obj << /Length1 2368 /Length2 19954 /Length3 0 /Length 21330 /Filter /FlateDecode >> stream xÚŒöPjÖŠâîî4îîîîîNãNãÁ5‚‚»&h 8ÁÝÝÝ]‚ÛåÌ™™œùß«º·¨‚^[Öö¯¡"SÕ`³t6J;;˜Ø˜YùJêl¬VVfVVv**M[ðßb*m ›»­³ÿ? $Ü€f w™¤èÝNÉÙ ïá`ã°qó³ñð³²ØYYùþcèìÆ4ó´µ(1ä€îTÎ.>n¶Ö6 ÷0ÿù µ °ñññ0þË æt³µ0s(™l€Žï-Ìζ@ÏÿPÐ Ú€@.ü,,^^^ÌfŽîÌÎnÖÂtŒ/[ @ètóZþ* læü»2f*€¦­ûßr g+—™ð.p°µ:¹¿{x8YÝïÁrŠ Ó߯Š0þÝ3Ûéþíý‘­Ó¿œÍ,,œ]Ìœ|l¬V¶@€Š´"3ÈÄ0s²üËÐÌÁÝùÝßÌÓÌÖÁÌüÝà_™›¤ÅÔfïþ».À)Ùþ¿Wàïçâì°z/èok|ÿƒàçnæ €Ü<€þ~ÿTü/B`cXÚZ€æ@k['„?ìïb Õßø}øn¶ÞÖ÷Ýc°þõóßOFïëeéìäàóÇü_óeQÓ’W“`ø»âÿêÄŽ~Lœ¬&v.VÛ_KÆóþÁÿiTÍlÿÆ?|圬œ|gûÞ¦ÿdìùï ý÷qÐþ—KÙù}kÚ?KnÈÊÅjñþ‹íÿóªÿËåÿ߆ÿÅòÿ¶äÿ7!i‡©iÿ¥ÿÿQ›9Ú:øüÛà}i=@ï äü~Nÿ×Tø÷Ñ*-m=ÿ¯Vdö~bNÖÿm£­»´­7ÐRÕdaó÷¶ü-×úëÊl€ªÎî¶=+¦÷ÑüÝûiYØ¿?îï+ù/ðýrþ7¤”“…³å_'ÆÎÅ 0ss3óAxò;âø±½ß¢%Ðû_K `avr½»ÞËóX9»!ü5Qn.‹Ø_¢¿7€Eüâ°HüA¼É?ˆÀ"õ_Äà `‘þƒØ,2;€Eöâ°ÈýAœù?è=…?è=žòôO忈÷SýzçÔøƒÞ95ÿ wN­?è½"?èS￈ï]gö½G7ÿƒÞ+2w3³°¾GXþÈ9þ+ÿ{Ïÿ«x§¶ø/âz'³pvxŸñ$œœIÿükø,–ÿ€ï!Úýrõx??ï=°úß ¬þÿRÚþI€ã/èù‡ë/½³‡Û?èÞM¬ÿß´ù“î{m|\l€Nÿ°x—Ùþ¾·Ïþð½ä&ûÞÇ$û^ë?¨þJÞùO°wÛ÷ï˨ߓuù£~÷uyÿÎrúŸIp²ý[ú¿sà|_h—÷WÆùOg9Þé]=œßOü,ÙØÞ+þG?ØÞËsÿÓ¯w'w £íÿN‘ë/ ç?ºÂõNâþþpÿ¡yOàO÷÷dãüÇ Þ«y9ÿÃá½ÿ€ï}ôü|ÏÃëS~÷þG0öwzŸÀ÷¾ùþiÅ;“/ÐíïPÿó†Xx¸½7ô¯Wþýùþ×w6è ´@Xœs¶³« k½¯#ôbÚš¦ÚÕùJÇä·èÖæñˆû…®*3dÝíVìË`Úʶíèé‹ßqSlds’ZËÓ‡g“õÉÝ„… œ¾ñÂc±½ÄðDLš¢{^\?hÛC6ÿ’§ÊuõàEQÍǼ÷ê‘ñþÑ[¾<1·«¶WÅ­€ø\>Å«õÉ0¸d†*Ï%¾>1ä ÆÈ$µŸøAŠ<î¼_iÑJß‚w“`i2cê ó{F•­zŒSCwçÈb;ÛNî@ aæNRMY–‰¹ vU‹I &¨†ÃH|Ðn%¾Úz«Ýie—J´Ä7õã 0ƒ¬gsÔØé÷Tçº:8ÔÇt‘Ú|?Ø0´Ýé¯S"Ò+BdíÅF/ec½²ÌŸAœ ]…èÐÊa¡1.y~á}†6 ô ¹$`Û*deÕç…î!:ãÊýpùÙ¿¢þB¹}c}ÞÁ Ã(ô-”[ùÍüWêÅE!¾ ‡”ifm^†TçǼµ85Z`ýLh9ËÅF³d™©bâ×Âe?e§œL÷î|å`´aˆÝ_ó™v…VK¶«åt¸«¤ÉˆÅ@ßmÏvÛSœjŠ{’96Ä¡êh =nv?{1–ËIRÑ-*õ* F~X4Z,êÆ¯ÅùxÓÄ^Û¦rO †”‰¶ú™*so’¤m°Aûò•@œPCó>ŸÂw¬{~jt›lxr›Òϡ°„³§ Àõ) Ò!šl~;(ýz]ˆöSô«Utãš–—XÝQMÆLpýd`Jœ¶ƒKxìDPXF“¹¦XÄ€õ6—”m·å›%úH×(TénX»†u#þMȰCœr]R$Jë~bï™ûKΔ·LžšSÿ7ÂôhüÛ*ª¹äl²ùIEv0܃ìtôßÛEtdŸ¬ÂuCà,ÐcàÀ¶gi°jãR.Õ1U9¤òȘøkÐiÐ7^'ÄPäQ«˜¡{j%äÇÀäAå`ÔÝ~<0ñÜ5ÁÚÝdzs²³„I×1,eC(ÒóÖ^äÒ\Éq^—Q”ªÞ‚ÕÇöÇR'M~ f‘°±–}€K{l9t<¯kxXÈ\´¹XË [¯8 ‚«¯¯®ÎÄ7¹æI9ÆA4É…6øÒ~Íë­*ÈÉ6K|-¿—[BEàNkjôwSð`;äxJ×’ƒ¶MÇ©“UÔNNûßúà‘̽XP®»ž67ïqªpz’d˜ÜÉ5çWŸÿ¨zÆîÛ³ˆ!`]'þv¥$ÿ ”£Çú}$ÎÓ{/yÎð¾á–ã:˜NÎ/t™œ¥9¥§À¼¢€w4H×Ɉ+3¤àg%¡/.“݆@Bì³L‹­@ÑÍ®Â:­ZÉ-§JIéðtøø½‘) wàïx8:sßO‡¯02OÍNel^åy'?‚ŸÆèá ô½ÏwÍ#1-7r†›>½…¾¹· ùÛä߯±Òu‘ž…d :¼áñ»Mà ëPµHÙöçñžßON0šÇ^mI{­”¹–ʆ…cK*·sã¢E:ìÞ¤¼®dŠ–S•Û„ÎÇ;lÚ,ŸÄ…Dk~?ž’±&vêå9û>Pž>LÜõQõTüšÄöÚ\Ûd7r.ï^Tš¼ˆÈÙ £zä‰;žIÃàò׳¡À-¤X• øpß…t,­ˆ¥‘KÃð¸4®¼¨Ë˜Ž§««²e|ïKùŽð„hwhG^Zåžm”ëæüvT0(_Ù =-f±¡më‹;¨È•NŽ{Dtf#*ð +WÌ©X¿BÓ?š¦Ãöä%­'±XÝtg9´Q©J±çñ“h‹Ñiˆ+²ì –ãœqa–Kd‹¬ße9Tú w ÒR4/èB;IÃ$’ÃÅ€} ãõS_pNDïìÑÄ¥Ý1ѹ€0{ Tøà¬„h‚97ªƒ¾þJ”І쳣tðÆô-·Æ¸íÎ ”M 'ªÂvœÇ’&}Išü“Ç„"mÛUIi~B¦WÿeÕÒñû[³ïø'é@x ‡ò‡oä]ò•@¨mñ8q"ÿ}mºx¨e[|Ƽó൒su œFœ¢¶éØ~Èò6Õ,æƒ6E¨É ï{¨b<ƒ1]í(tÜþëßj¹UÈšªo7ž¡¹À!ÆD—×%‚P·@›¤ÇÆ$œËø°O¦ ~pw@µ»¹xQ+\nÙuU3ÏI_|­Ql“êœQ¬>ýol$ôå;ý±UqJ ýæ.A~«å#ðÁj8ÚÚ y­£QÓ(È•*Ì*Ù¶Œ­¼¼ßæHBOº#­s„ …6DÉ¥7¤ï5óÌŸ¾&´kv u°®ìÌZ2Ÿªˆ]%k<(ŸM™6Ü|y0ãTcí |ãÛrÕ.j,)$ºÛŸæ»[~ÎpBñM脃­(Ø/äŸ#RÌöÅ7úŒ~Qî†]”_ê©,Ù£$ÃÃG)§hûJ$¶`M¸éäÀí)'­R%¨¿{¬:Z¨òYL oÈ3")pmÊ!Ÿz¿þ^ow¾Žfq Lgib7”º#Ÿ5XðŠÎb o»8åožMÐ%ÀÛßã+&[4›ÃŽàÃ|eëÝ´µ bó¨(ÏBrg6à,ÐX`7÷Jf°€Ê Ï”x6D’#µ«ˆ½äid$;ßx\ ½¼ñ1ô¶dŒW¹¤*GW’°1ˆrLVšRdêï6/ƒhIÄ0'ÏØLWx=˜¯=ζɯ….}ë&©œ[ªÖs½!X¿º‡ Ï àcè°I{ŸÍ¤®¬_bë½µ}nê—Ð'³È(|ðRK\<¯:‘³ˆ#ÒnzK™ÝÄù>Rb;5êITH°=ö€Ê-E)îJyÁ&ì•#gbªÁs§ :Žf’‚¥ia>)_Gƒ llY¾~ïz:O¬@{^§oì+Îû²Ý‹†YéÞQÌ'X/‡,!e®}˜o³Ñ6ØC…­–4&]ä¬ÚÖ³5‰HYßF>ÉÁÑz§Ê7Ïw¢ëÎ Ncº]A‚|ⶤóÀ¯œ\t2à>}ÓŸÜ@* cŠ”iL¬³NÍÎé…Qæà‹¸G9îsŽYëµÞw¢ÂgþV°K®Rœƒ94ªÓM/a´ÊRlêSþI­>j0ÙPíK¡4}ùŠ­&Îeì±2àÖÒ¤@É4´0BƒJó‡r³O\ƒzÚ܉[QÆó€ÞM/橞+пµf©(ænA/Rõñ7˜4¸–TþÉõë§‹i…ÐŽYTÙO4µõÂàúj¢c¨r‹ ª‚·”̃R:žêöç\›1§,¤üC=š™e³®ŸšÝ—4ºn3ëi,N&N_ åópáhSDj÷s‡'Ò*ꕉý¤ë×—/Œí3Ì׺œŽpNM« Œà–Í µòÀ›zýž£0<·Î×Wš÷ò9“~³}¥ Äts{;sÿ‚ÕÕw}夿IŸÖ"Tv7ä~sáœe.ê—à3‡G&!Aã‡kǬ¨ÿóäœd× qÃÜ%ÜÚ]õ«%%Ó¤ámÕØLµ¢ Ë/(ŒFTL¤Mu¼̃=)?¬Æú}}J=CI7MjÅ}+‡"s"~³‹xδÂÁ@]·ÞÌGvë‚›ñâÏ:"¤,GâY{-’Á"ÀÝóìJÃë‰úh\†ç@¤U<88‹Ï~O‚'MÉò$c}8hˆ–NAZ]<+“Z73ˆ ±ºWõæ ’ ÏÅþp«ó\'°,C2‡…¦‡IÎ!þ›kñúyï~SÖ|ú›Ì=[ÊXÚ©—ò=_¹‹0;|‹øËu½; äYôOkÚßeÞØjŒ( aƒÊ-ÞÑ$÷ÞÆ`~RuJ>#n,ê¨GGŸJ:ÛzühÏÁC»®[ÒÅuqcbuq3‡_ÇÞ?Lrçõ²øk¹”Jª Ö÷Ζ±Î£a1?·T Ö–>±Ø†oô.æ‘ù¯™&ŸKRë ”ïÌ©é6QÂÈ®—죎€ä +Záf™õˆ.Eœ°¿¹¥ ™ü>qZ î‚CnWyÞ‰)C3)";¥Ä¤Š@›¬á›„/[c%ÖdãôÅ Äš’TOœ–*ˆG®]p{~v®V%4"'8üRsIˆ ø–8M×ñ3롾èŠ%VVŸɸé†%_c'z„åýíG¨-«ÌÀX3ö²š+Äç²þd{Mš¦‹l4lÁxWB§…`ƒ¢[’n€k” Á5a¾Çuª(Xd'f—MBƒ¡ƒ¨@•­;€8¡Á>ŠÈñM>Eii(ì‹íåt=%I3pPm—ÅÑE™K\çý®{yaÍ,Z6¥bC¿iºŠÓ#VËÿWoÏ~÷ïR,-À$ÙpŠÞ—“#°²p9¸½ÝÒé|ª‹"©ªÆ’§ !ñÅ9# ¶;Åõt3º ʈZ„¢M¹ÓnH€†Û«@IUO¦lvB€„*–ȪlW '&\”+(qu}’–á>3A1«;´aPRÖ.2mÛÛ ;Ä{%a¹Kxib®ª*oÜ>µrÉ¡G€:¥ŠBp)½ú Og5¹#í›aÚÐß ’¿-g&ª!K"øÝšxôtãÅ Î’!2ÜÖ®)çè½6«#óñiÝæ¿œfÀʶ +ð¾€N 1Wzû¸Ébåϱž’q<\Ü¿M.S–‚^±Oc¥ä> ;Cª«£õâÿ|[ßШ×SkŒ43Oe7ÚO&Û~£"û78ú™ÔäágŒÀAdíØU`–|£gJm°Ñ å"l9ê2„H0Wš`˜Þ qËépuç¥hR^|ºÙ÷º &¬4±@‹èˆCgð:%Ú«87°†ŠeÓù '=?»eSŽžÄ•¦Í4r¹/5d»uÏy7Óª]C'~Éù0RU_Ï…Æ\ÌŒƒlŽUì!M³Î2¶]î‘*x=|V(Ý®RV¯¿x Xù[¸v3puú½¬Íf=Þwœ h1V€·ƒréölùe¯rÛUÂ{–i+M€*Á‡ÄÒÚí¯®08Âß=6z˜dø£6/{|C³Ã3dõ ©â´N=:ÀH'|·ñ6†Åc}¨‚”5·ráUêoˆ´:bÉ'Þã0Ms„ÝÛnÏËŠ®Ä[‡¾Ø7ª3gܼxÒõ;2cÐŒjlwI¶Œ,:ø<“âñ$áä#éÝÌIü¨èu<¬7þY%ãÁe"“{_¿ÈVü„ bù4ƒøº;²u°Áù±†­Â)ÊäIRØß†aϪܚφ’ø±´ÜHô\éÁtÁxªIFáV€ëL¡Wÿq ÔŽœ›ë¹X)‡•XȺº­Ç÷ ®Õî«¶Éó“) =7´CbÉ›[þ¸Ø%KXõ"ÈU@’阩<ž‹n«Ù¬¼p°ÙfkœÏ`¦Äã NcO!? ½GS¡ÌL—rÇËz0é§J¨Á„w ¡kh”mÊ[«—bI¹\‡E½ÿ’Ê_É-L­ñ®x¯½X†¶—ïúücçû=ã…½™l¿®ê„ýà¦÷¢ ¾ŸbÏ­DÔ¥÷/qž±dûL>™š]äa GTE£™NµHetytBŸ˜‘"åùîÙ^)š…ábøÛ UïŠ>Dïú÷z£îëü„†MÛuŠtÿü•ՉťÊAD¿Ì÷:æËFŒpã>ï)© “â$õ@Á乂©0À´®”ªË4%ÿlõ× {¹H³çpKŸ±áóGúDì¹µ¡ÍRes«p†åÖöµ°lgrøØÅ-øVßÉkë#ëQ³ÏñuÒ¹“i‚ݘº>«åß' é[!¬oß8EtÙºâ9KeÓGó3æ¯Ò;'\ε™_µN¯îŠ'x„Oèú ¯Ódâ³!šK+ÄxÈý$#ÔYØA/J½ý¿Üw‹ƒžìùät'Z”eNBn½¿<1`.ëJ”¤  0m’uLt“ÓË/kð t,é‘TÁ@ŸÛ-#SO-ŠÈ#1|Û‹úÕÔ‡±„!t“¢œ·KÉíY«A ©‡þ‘b¯R1õs¬äl_$lœæöä®û!P×R[FqŽ‘aÇû»Ìká†1Kc™k]7Ôà-¸Í§^Ôïú$ß}Ã$Ë@¢Hw@ŒôŒœ¥Qa;:AÓ¥Ö(á·ùüÁ·€MàÆ©¶¤üì‡Ôæf]TÿÉ ·èÜ>ͱD+¼ˆ¯‰ÉªþÐÑäÓ­ ·Óc š¹ (Òw†û/wÆ3IĈiðŽÔ’†=!Ȳ3Üoj½/_i²Ô8̼)?“r\“jŒð—Û™£Ÿ.S5‚ä`Y„‡òTÞÎ2‰Ý´×‚»ð½ª›`Z…é¶Îs:낲 ¹œÛÑ öó&¤Ð•©Ki0mË¢ k”Õ:å®dgFOvˆhòŸŠ.HŸãî+¿!Âjèv®²Ö~§k±ÙЙƒ nã´j’–l°‰[f^ø¡ Ag¬=ÉDîäåÿˆ¥¯Ü(…=!þ»êQ1VXïÛ5s{ÁÑ:eˆðstúúª·Ée‡+`’áÝ ©•ý!†F7±¾?2LFUk[Ñ4-låVø™PÛä bPx¶˜^ŽÕgºÞÜoîœCkÉ·ïrÐcG:Ó rd±0üFu½tˆN*>Š5äY«(óÑ‹®òÂ3zÛu†ÃÒŽ¢¨©j;ÊÖµ±(³ÕÝ™©I4AR†'n›¼âƒÚD$Ä^ùã.@ÿÊ×ýCxˆAâlftUù¬ckI—ÇyÜÜ…"{~œÁˆ…¤gùLÕ8$DW8'KxAϨ`†Aívl“}bûn¯ÑØ•“•¯ø#òž]Œ ¤Àá¯êÂÇ¿h¯ÅÇg"|}ÎP «3XYÔêÔå'‚ YZ±`¸¥Ú¨?UnY×à⋸íü[žMÞ=דùÃú@ó°uuÇØ¼L§f™¶–žðÉ æûývô§¤ípc,e2·Šn=ß"Á¢j\·T1K9 BS–¨`&;8·¯á°ÃêÈKt¦'ýh°þüªN‘Æ®jÌh¥X¹ MhNÏÊ#©sö… YUžNÜ*’S½A¦ZéA )¥„y£ôñ[9”`F—ìT‚jM{[{6Æ›$Û‡#'ÕýKý~–Å.^“aÄ`¶¶G¤Îp|nI£Z~N¾ÃþÜF×Bª&Û§8Áë5­jš.jEÊê%Ñw*Î…/:*ÜåÌ–}›¢dûó©bÆ•¸û ˆ•+ T •‘¹ðè= †FNdƒFÌ<ò1’ý˜¬8…ù4+i€Ì¢”Àçr’4(åÔ)éVìŽß;–Î÷6½’ >à ²jN[»#A;Œ#(68ÔÈð?{sÀls>¼¾^ëÜ…¸d$z¾» 41X³EÜèåCëa°OAËÏX4 8Ú$CŸ hAz¢ôéËTl¶åî}Wé8|øhñ¬mwW ªé! M¡hÓ,÷°ü6v›y¼NžT‘u+ä”NP%\Li\Åx$Þ6‹*Ͳx¡ 6è+ç*Ï—’=ÿ™ÖKáãìYÍ[å‘tkrUKZ¯C{èj­çVÃûåkôÔäï–:8ÑÜ!nrÕ$( RåoßÏIÞS*É_¿Ì¹M‡¸pw‚Ÿð#ýZn±ü¾*à pÖåµ&£TyÓ -deòÖi%WØœI­b6V®³:ŒÓÐ õä Èqdó˜°F~äÕµ¬f]w2ÿÝÉ5«Ýu<ůVŠTÃÅ_ŸYØŸÿ"?_|—.€‹L¹Þ~E°Ý‰'2Ô¢ ¼¡!Ô5ºi'9œDÄèIŒæU¾ŸãŸ;8j™Ú [UŒù1¤Mè——µŸ½€Í%¶§ÞÏÆ…ÉOÖ§“Tù›¯—r|Ô©o4‚HNºÑ@ðÜ>E€R^ª0`/@e‹¨Jòí0_‰p·Hö¶é!¦£Ciéþa”¸sÅž=«À|U*a"â7"YpVQ¦ùº©Þx÷ñ1k0<Æ>‘Åõ&,¶Å—ëevßmtŒ”†û¯~Ž‘ ªc†)qš FnY°GN¥ÿ;ƒŽ ÜÁ<Øó vï@“™Ø¹ÃŠÀÿg6Æ Š \ê´=›.?¹æf¯ôcŒã̓çòv—´2þŠ,—œÛ ñã÷ïÑ#aù-kÇS‰çFhm®/îU+ûŒ‰Të€ÞØÝú‹oy©lÔ¬Ñùäª_Ò}Á³f×C>ÂU !1ü}IÑGÁ`Jw”SäüÑ7p’aªÂY´3Îß»ÒW8í×µ°ÄbÏÛŸ|AÙ2OîÆn(RîÔQì¤øW¸cƹþÁʼn瞀¤…U¢«o[¶]‡æWo«³†Š?t%ü‘Ž›6TÂÞö ô=)0»š¨w–ɯ5-Wr~lŒM)••IÚ4l JòvǤÍA7¿?n'-ѽÐÀ- Z|I@MÑýûÓ’ÝÕ‰Û˶ÐÙÒ„®¡‡ò›£;\š«z÷> ÎÈ òcl“C/"ç7ÅÃQBsð´÷›ݧÂñýÌ|§1¾µoæ²y6D—TrÖ¼G(üÁÔnótOͼ¸/äà$¨&e~@$ ø2b1|©¤~~ )ó 3’¶\D¯Þ‡ÔQÖvF—Xº2X‹Tª*ŸH~¢+}à~´hf±÷Ë`3CLˆÞ묻ËŒ„B#ñÊ$b-æ,Œsû˜L=žÝßÍùòä/÷/lËîæö^Ìj‰¡[/¢½1S mTçCÜv‚äQ)£ólëªÍ½¹Èc°@±¼î{1qú‹®so¼&Ò 7Áé!ˆ,EP¢x.¦EQã0¥¡~’=Þ±7Ì\þ:+HB$¤¡–ÕÒÀ©gáS–@r±ÉvÂ8ˆ«ŒÀD¯¤YZ) `œ=‰7j´¶ä¿U¿õ øç8Ü„9šÕ*MŒ4À»3á†Í'Õ¬±±¥¥u4—/ò˃ %\v y+,ZY+Þ¼Ó1ŒÓX!+ù+߯¼Ê*Éà¢sHU$UÉÈu‘KsàŒ !Àáµ{%w|§Þ b  XzèéMí¹@ÌL=¹ˆnä¡zt;Fۤ𣞂%ëéXgé"~"]9=XÖx J°2ÇôaˆÌÈᄊª«¨wKŠ@ŒçôóagIJW‰‘¾(ø¸{0ôðÉ“Î;a³8¯©_ï Î_O|F'VL?UÆ<ûîæ "#p‘R *S¥»ò||“ÄQF®— WÆ Lé$³µ¤æÓwôDZšÀ°Æ¤SÆüÅû«‡ßNoU_c\ì‰AúÊÓ¯¸ƒ\ßùrÄ®À.eÎÑúÂëÅÞë¶Ž6ªÚ…!BâA­ø”-Þ¡Ò$bº·æ«Šp¶­’£¶œŸ±œªÅü…Ê“àh‡o8àn#&À›—¥¶ªr{W¬fœiokJÓýw”FÚ²MºÅ„œ…â¡,y ÿ•<¥Ô·Æü¡ ¶ã¥“OþÔòWȳJ3ñ—ôÊòh²sëWRZЉ°ÏæÚ§F#MÓâËI`J·Õ[’@€¿—kª1Ñ®üŽe^â®Ü[¼Ð'ÈmN^B»n²ÈxJŒŒµCÖ’~©ï%‡\PU6l%öÏÍ’_cm°Hˆ,5ãA¨èàj~LæÀ™Ë$ŠÜ`ÙrjGm’¸ž]†°«áùùŽŸêRWêhí§ªH)¸ ¹$˜¡ÍŽàSÛ½)ûV[DØ4–鼯8¾?¦¬;iM•º¨DUoáñ437ï"晎Maìï;ÒHà‘ßÅÒ‡5ìº;RgÇ¿î_Ï€W’cÛØZæý¬] oè=&~±9ûB>Øþƒ€‚Ï3x5˜ÆÄ7‘€&UÝÙA’ <À/¹8‡ã®)´RV¯Ûˆ.øjï¿‘5s@Ó±û»‰ÍZ@ä±m \5G¦]í„àZêzë¬x­ò÷‚d…¤bZ;)X¢J«/Ž$.uÔ@ÝB8MêpiŠÕkM¥.#Žx„¿9aÝò¨•ì`óœ+»™5×꥕wdÚiS?å¹÷t™:BDHvT$.Û Ë!”NÂwëõôõJϸi\¯J%°"êň’úÆÕ¾KG©OŠ·•|/YôD@ »sÖƒòÚÌYz¹„£âƒnïG˜†ÁkÝ7˜¬’Èí•]Çöw4Ð}½ñ£ç_ ȽŒjf„µd0‘²íwK¾ËEU h§!ŠƒçTä~ÛÓ¹~ŒÞ"ΘRÝQCC‡Ë m @NM?òÕh`ŸÃ xŠ l²õÀÒi º™É¹:uŒZm€ñÝù!K!£S—¿Tп÷âãèpœ$|ÛPþV:QªšëµªÖEŒû…ã«p€ÇE04‡·Ò‘èÑl™ñkÎ%HË÷a.˜æí`-@ÛÇ®¾íJ1É۵çSi!bQIÉwH+× …¦‚%÷RÜ)z¦BÖy+ká0,üÿü¯'èýàD—Þ’wk^t†ßɨ?,²ÅEvj•ëàá ,Y(¥‰**ÂNæ4+lÙqMlk"•ÿðŠQÃΞ5ä†1nÍhõÇûѲp‚¡Ž¹È~²ÝvÜjc*L’Ò{Fñ‰ÍÀ±þÊrö$êô·>{¬’â®}ì®tMí5å£þ,×k ãþ:éåq—ÉŸ74v*¡â~B¶Šxõ_Õóhãv˜¢Ú¨²Z+àøÕAùzåu“õQSf ˆÒX¦,ˆ}"\t‰ò>Ïhóh?D*è7üŒsWzf2Hm_ ±’pÒF*²Ÿû"P¶Ø¥õàöQ6ó;nü€ÐÁ»%ß\ N`Â…-b¨ëÀCv.ÆÃa‘À]Oú…þyù°ŠIÙ…ˆF÷`Iòîß"F%³ ÇÐ tq6xx^ ¥3âÑ4lL¥ø+ÂZç¾1÷ç"²žk$ÊmÊ×i&/\ÙFDkÍo ™– =™iìàC™8= Zj-$ )V"Ú Éžd!E\'ü=¢âÔ8EÕì¯ú;“élê•"‰]í±Ž©;½Ys6ô¿¬êVpЗ÷,˜å?žJ˜¨„ñ#oMDJoF»*vú5µÄÜcgÕ~ÀMR+‡õñØ«fômý¼$TÛÿ‘Yäw3Ô,r†£ï/<в-|ë2 }ÖÚgŠe ¹¨ðklÚiM)í¨XÜoÏ2RØØ‘&™lT‰=P•ÅEý11X_ .cÊ( ‰£ª»ªœ4R/b4Î6¬€„ݲsñÈÛu©2œîø^|»†V; :—?ÐtKÅrØ<Ó£…p5\ÇÒ:M#svZ¼¶ë/ &Û&` ßnŸ¬¤‚Ñ;]I®H’PGîàìÍ .8ŠÓv¯¡Ã1ßHBf8È*k¡uè2ÕoDR€qà]’Q^xmɲV#ZÎãFÞ_5~ˆ#ñ$ Ö«…ƒeüîÂÜ Ùn­lǾÐhÙ—ºT)̆bhwÙ•¶‚[e(ŸP:Ë„…”Wí:Ÿ€“F¶¥ÔfdÕwÑóѯû0Új}€+ÊÂCÌż—’‡$qSòV…r4Åå¾Ñ °çµ*Ò1²ö²H—g1F«ÉKš3¢T¶æíWIö[öL8SD!*†V)9 °C[yúÓÎ807íí8&ïÎ"er>4¹6ƒAÃ#¼díÐd;6u¡1|²÷U•¤1ñ¨&Wů‰¿}?ˆH!åR÷ù3ÞâwÙ]Èïbžml˪…!ó”.FÕÚÁììJ§šK­¹Ïp—?ªÆM×)ú¼qA^þTX7ÌÀi(…ÉÈ…OÛ'ÏñOH:-s»c ¿ácªí.n©9ãW$ìAÎ)µöð¸À&.A Ü x,#õäpª^D³˜9¤<K>Esêȼ.ÏÂQ2”ÄŒ{°Uª’­Á=·P~ zäÜ@EÈ'{à Œ¨öËÑKK¡½Ê<çÝ* ]pd=ÑëëAÚ':IõŠPúÁð– +¯!t×p„ÀÃV !LLaG œ™m«¼K‰;СÚÊàPǘNFï–Zhô6šBJaAª{‘³8<ÇàÝ ÚÄCÃ+l,(ºwaØK¸Éwõ µùÔ.Ði}Å^ÿ{×í ¼›–~"Ò@´SŒPë“Й°R1ü¡·lñøǬ=ªÙ¾&Áç!ôFF“§˜C³˜ …`î@|à*¸f 3u ¯£»"TÌo<¬ë•VôÖx"<ÝÒNh>7¨Yò=“øÙŒ6-rAíøX0üt$!ÕR¦·V‘+ëÓ³*²H=Ì6#=‡o{„w¶Ë‰V–` ™Ý |m91Þ VkLªC™ÃÒÑ!b0I‹ÜóÜçŠ/‡²Ø«qØ1²fØ’ý/AЇæë_•ê‹å[‰í%<õr1rßZkùJ{Úg¢e\G¯­ÕeÒ‹@ë@£ âç^Ýãâ%Ï^EÃë~ß ž´¼„_Âä¼hž6ã3FýµÈSóh!Ü}N|j‡R…ÆnìÄò¢ÛWÌ•rÔ DÚ½áAÎ?Á%—Ã’_rOýœ‚óúkAû^®(0*ÍϼY+çÀªÚ‡ÌÔºÑ˲Ï/‘,iùÂ'6Œ¢»›õŒ3ÆWlw´kA™ŒõÄ´j+vQˆÌïi|c‡°j6 $A“ÜTvìÀщq1QœwBÅB·&TäòîR]=šª4­àXs§I™¼#¢¥¦…ãÛ§¿$‚‰_…ô™ˆ1õ¸ûÀm‡É„Å.€öUÛ:Kñƒ@Ë¥Kš•ÍY›ô‡JN­k=f|úqs‘|ZÐr·ècÈ$¡zÄ.—‡çE² S$(>:2º¸[¾„5£+›å¹Jêð7Ùoì¶žcÇÆÍ“aýt¡ˆãÁz¦K„g44âÈ\°á çú6Ž^DZršjoù\5’ÔgŠ_ÙT3”vÔ­eJg£q÷›/åš”̺˜}4- î¬~à×¼lNx½Ñ:ù³0õàGÙ1Ûõ3òR=}NÔè»Zg/8¼Ô R%ßj„FNxUa¾ŸS–&Ÿó©|ã?aê©BEÐÆXú×Ì]•É`õ|`¼…œt¢0!ÀL=pjKE˜3ûSBKÝ÷Š×G·:b”5±É²ÝZÖ©O¶.÷õŒ ƒÀcâa47.›mfÜZÏzé‡Ò‡Õ¸y‚;ò¥¤Á!÷ì^ƒ8¾ ìMù½R2–”™ý‚`N²çÒ˜a‰ kÐûž®E¼+ žBz¾—Ä ¦â‰:¼ïr-ÒhzUö‘…š»ÍÝfZ 0ÀŠò³G0«ÍoM—=û@… $ø§©mÔ:‹Ía6Ã…Ìó®é,gÊ  ñÁ#ï.'LQ¯èB™q>)_”k÷ñü””Ù%¼äÕÏ4oðb¹*Ïš7º»92,<ˆH!):Xù·ÈP ¾…8"×fNÅÒ ®Ñl Ÿ摚±ãh’ ½ÖR™ß|S¾ÖH6*ô‰1?¾®œ‹ø™^—÷DûŠ{ƒ³î'd*$g?¶u¦P’*t:4«›Ar9SãcÆC«v¸w|×»mTßOÜg1ýØO&Xg@–=g¬cm_‹Àqúkˆ‰èmØèçÚ‚îBc¤ÔÕ>quª5Ùœ6®á‚r[`M¯>ú}‡zàïx«¨œó/CH¬œ¹L¡ßرe_6û ²v8—Îji%íQ¾5Y—J¼Är áEÌîŸÁ”‚©ø:üòùAYª8|Êjâ~£«ß›O ]¬Ç¥$v¢U!°Aƒž¨‹ÃâÚj`ybìGz8¼u NK–®KT¿‘Žk\’kâßÕůe˜–!MßÙ¿`žS= ü\oiõ KSͯ¡J¯ý-ÑÏ?¾zV\HoñjÉÎÙ¶s÷Ù"ì¸äå ½Þ|îºG"§DË&ûÃ]÷£wª£ÇPD]á ìŒý*]t/^+I£Ü©ƒa‘É„øý'RBz ¡QÇf,qpäïÈ’p° QÛdœÃ=÷x´ÔB¥ãDòý^µ¯ù"ܼÌW±èéZޏÚCÀM,0së¾ÙàCDH냂™=~¤iµr©¬´{‹üäèóŒD×™_²E*—H¦ZA…¥¬‹Ä!ØbLÍ7h/ÎúʛǮRú…­ýÂZ;•Ëß÷»ÙÓÙÓ¦@––, pÀZ­X÷ôæÖÀa¶LïÛJ£›S~úv Gv_ÃÌØ®¡RÈÉiV ‰xthçÅ„s×psžâŽUFcµ¨ÐûÌ‹6jx`̈øCHÞOúÒ²µq÷ëEâü"%- mOÇ;¿Ì ´Œ¼D_;ÖÍb±Î·çª§¾Õ ²¯<(/NþÄÁóJ£B‹’jRñÜPˆ‚/WÄbòÈ]pì§šºoH 8-È`èÔn5è®–ïœe Çš‡^üª}È©ÄKcÀt×jP&ÄXJþߛ𳿙o§kUæßßD[7{´«ˆ*:¤ÆGËÐáA@ÈXž]—gãÖ_™˜ÀŠß³g_Á Æ.µ£GxÅt9ËHùߪ9ö²¢–ù uŸ¢¶óÆnUTÏaDĺ-Üi)"O¸,1§G†6¼·¤í£ … ÂM§‚=œÐ ¾¶‡`TÄüoSg©Ü‘"ìùí!cl!j˪ü24ë©»)ÒJÉ °ÔÙŸÁú]AÌ"Ëú£¤[u0ÓQ 3ì3ÏøÄ]²íÖ»_)³B yLfî甿£.Ã¥;ZGoñn÷}¾ŽHh;—¾”Ò·út4t$¹ë'©? s‡¨Åc‹l7Hõõ‡òÚ v»êôؽH¤eÂÇošô¦\nx^«;(ÃTÄ^ß8-8º?uònh ‹vßH®oÑê¬öö…R³©M,‘(ðÂÂÃ6GÍòíÜ@¡ 3K{L þZa…wK ø¶ÛëU‘Õ¨=U'L‡6û*Î a¼«ö2“×—Šÿª‰¾£ òñÙº¹[õ6á²I™•÷0pÇ ÿf5”«ý…ø­ÐiÍ…Xc.x¸&%òGhá£"9Bð`âD2Ÿ{t3©+ßï!ãí%$;ß¼cѾö†KÒR—ŒÓ呟ƛިž0R{®j~Ä3H Ê?cOJ4ÂJ¡¥âä¨S• ˆG~X”ØÀ 9å1/Åg[˜p n #Þ×㿼¡­Nô®Ðy™)˜ äÞ´¸†¯C§8årÓ6ô²ªÒ¤¿œ¼:Æ¿¥Â²ð´ÓD£Dà†§iDò@ÎÛ,„ 9~¤ª_ã²ÖÜNóY›Bû*9,†gA›ïá@–aŸµšOKì/:GÒù µ?Ú¸`H¶·ãz¯ztZ6µæHï´v‰`K™ù¤¼Ø[Vík!ŸüzFÓ,:à°4GǤ_tæ{ü—eV–—ïð®ÇÐ×|È@GEUÞ$?áÌÀõáŠYK‰–Íï¤s±yŒWáCúË’Æó³¿Ù+ëš™iùÏ"½ÅãÑÏymµJT0«1%dTPsNÇî÷B D›WQi=áZ|r›¦œÊvÒ¹íz^‚a'§¥›DËÙ,kÛ_r1“ÐùÃo×íŽ*¾ç­ks¤œšDU¿._¾4Wªjh#ÄÈÖŒ<Ý#gWR‚‹§½e‡#¡²–šÍô \Â7²$¤ó;ÞýŠ–¦µyc Ä-ü\›$HŒ°Ù©ÿz|ùlMÇݽÁÚtÄ ‹Ç:e®É»‹–)®½)‹9N 6fî—ëăé,ß#€ò ù›P +2)ïó%ÿñxTÓ¼Wkáç"nfIûÊÒ¶µ•[œ›I»Ð ƒ"æ&jƒ?Ó†¬&f×7[ÅÛþWŠœiSSWT•{5-œ%3K܆$s­Ž¡o¨'aþÑÝ#g¦&m¬~}*Ã]í4 'Xîz,+‚]'ÉML‹/2-M½®Áñ!›6*§E¢ô׊ÕN¦dŠJ+¯Kw±Y–‡öLýy<ܸ7-vG àCLJÎnË“QļˆÐi+‰¢_$ÇËÄþvÕÜd¥€sðpÍV ì1X²9ëÛš*º$ËwBvh½Ý©ðf>Ý&]óÁ.ø‚¸§zÄSµ×ZgDü]w}°@a©"DRì¶¢Ê)ž7|LÉ pà3¡’ö­Â OÍ~²êyy9±x6CçšËÖaÏñ2é`N|i » G²OÎÌÝgKfõdã”5ëþ¡Ú&®5¨;³J!.´XÛWÃF$E€èN 쌦º_—`,’i@çB½“ÈÂJ Ñ¨ÎBîa®øÔ0TOyQÎeÌoœÕHšr·$£§uI* K·/x©À3›Ñ=gª^–¬ýã@PédáüžÛ¯³µ-íâèj¿xd¡]T]£'ò¹ùˆê I•5d ŽùG{wß¶§µô€µe£ø¾¶¼©$xÒnÕ/3‚V¡Ó²³ô£-1.r¿cÐ ÓòÌ:è Óoðƒyèʺ£”Á#êϾâ¹[‡2ù@ó[YͲLIû¦me›ù°ÞÊÚÇáw9Æ?´M94¦Ó›å>n˜¥Ž±¬¶Ñ~WÄÉš½ZGl§ËÓÏ>T;¬RvgV¯‡Q×ñ¯vNì±\Ëimy_œUë7m¿ò3‡¯Õ$Ç9*Hg<° ¢¡.ZÅ¢KZGôùOùaõýêÌü@TW õÚL 6ò¼Ï,*f¸Ê‘^KdRØW«±ï¢÷ÝÉtj6N€Œ±uBÖ“°ýlõ—C阱ˆ¥ª“Gî1ÊXržÒBQ‘Þ9¹4ª;‹Ti±MŠÅÂÛÆÒÌŒóÑÈe-”9+£µÏAÔŒ K€í"4¢îaŠæ†…1Џ•ŠV0€Þ2ÒÇ6Aº#ãÏwœkË8rqE’éò¦TªVž !l;g9%8H"¡o„tÚú ÆY<´X^éñèc@ôePÒ.Ï‚1\“ƒ$¡Ví;14#4!ùr8rSepb‡¼FÌ$”ža‰°ç÷bŽI³1ƒ¦Êrþ¿Ž`ñ|”²ÒzHç×›e¿‹ÆÛ€ký`,¯‘ˆñÝtÉ{L¸É嶳Ϥ냸 ﬜û׿jôó¸o HÀ.¥UP#7Ÿª‡1{ÍtËe±Ô ³7ÄžV,ïõ½€3¼Æ¡{?*«*­­öÌ\“¬y “¡xjuÝhA­­½Å yõ5.4Ø>*ðcTá>dö~Bžcl,R'Vºà[þþ`ˆ­±øøý¬J`ÏÛªÑö5šA÷:Qrâ(ØÝž‘ð5]ñÐïÙ]4ütâ‰I²Î?òÄ¥rJ7vê¤å½'Üè{àèDá©Ð&Zå(lvÆdEÂûB+VÏó–@8’—+ä§ÈïNÐл}-é.ïß–ÁæÏ‘еÙV9=ŸÛ3º|æ±Á•‡â™ªïº¼0Öì'´¹o [I\÷³ŠÁ.S™nƒâuád-ú¼bzGøœŸ}¤LåÓE±&óNûTÀËÚ[rj¶ÞCd·zÓËŽÿª$Á’ùâ=w n¹Žv„ÑPä†Úùj}y+R–Õ-m¨)8÷÷ƒ FNÆÃ`É—½5²™ïg”®kØZ–Æ–÷Ãùâ€iè#X,„¸ç;l7™Ë>ºÍû[Ûz©Å4oH ßœᘠE{W-Á0ݯ…¦nŠ۵³Ûý|ì¾?(¹d„‘›ævuó­±OÍôŠoù`Ûuj6úíÎ~–Ð/Å[ ..ȹZ¥~j´¥(SWx¥¸ÏCY›‡œFZOÌÂvóoqFcR°u`/á{o ¤ÉBÍÆù DÿøPñ#¡VEåŽÅ¶MI#p"sÂè6ŠF6ÝóHßefgV˙ԽÆJ †)† ‘*ÑNŸµ32b!çs¤¬£ÈJs{èn×t§{óÈ©u³Ð~™pJn’ºÙ'…‹±×i  ! ·ÏŒávcí´V#®ß|~oCCÂý”êùqžuÞô¦§ÅÔUT÷M\SL´\9H´r¯MX%U<ð÷IëV‹m ¸ý3tödÃ4¦{ƹü¤±SsõS× õÚ°óÎÿ­Rî~V DѸ[½Û¹4Ç ,‘Ìhñ´­Xz¤ÒZÍm)Eò¾?ÃYçû¿Ûwèý“,ã¸ñ)…]}i{±7_ ÙÆO£½­¸2¦Ýõ:ÎòÂ7‰®G\ëMkxü%Ûªâ Êt ¥ ­ÄOŠv™Îsl¨ Œ³áíRiì\Â#¥Š» ä¶ƒæ¡ø)?Ød%H­.G$‡]XÈlý8À)LuïÌwé®û °ž¤AJtóJ¢×d8XÙ¹ßæä*ñûÉ©òOÙeTíÏ\Ùð؉@•C¶Ls^ò“?­£+,‰ EŒ ÇUõìøRjôš Dg ¦ãAQ Ÿû@Q©£cÛàC䯀‡Ù­²ŒÌø¤«`u•F‡Uל,÷^tUVïï¼9ÑÐ-”À~ô=ý3— ùÂqßBëÄ<Ä¥UÖu£ßajªF̹tvÝÊúómlòø¬[@XÉë€à(äÀ¿£ÉhtÏŽƒ4 é«—ýõ=#²ÍܦRdý§xÂ.?}³—&z`.Iƒv_!§- Îw>¦Aåɰ-Ù °ÙÐ ,yÌdøe^h¢'§Þî£À·}í…Biéçò‚ Ž{iC¨ººN÷Réç¢\Îv[V+|¯Há©¥_¿ õ¦+Í`@œ;¡Õï 8Ü85Û~CÙ: <¶èlý"‰³ù.€¨áÆ«<êàM-µ$}ó[j'×Öž‹¹zV7Äo™ª™)5¸Lõ£‹%àY'ot­’Á|kݸP‰{Ñ;¤NŒžÙ“ žY=Ò­šPC¾—ù"yàîã9Õ¡ñ^Àzpò—¸CdB©¿=‰4 üc?LŽÙǺۇ¹ŒôïôêxFc)bÚð¹² `BÉ}ýãíÕáqù$~â¨ì7eIÅzÊmvkþ¼F§©¥´– <&äm@ÔŠQ—ù54¹âD>ÚŒx@U¾Ë'çŸù" ³0%ßQs]æÄžÈLáœW[ƒ´°ˆ6iÂnÕ Juýnùâ¢$aLæ“A^³.% ßLÍ>àÙC¦ {ª×|WÆ­`ü áÉ(z”6ó¢”r&q@‘dì>Ç­ç'§brª›4²Ÿå%Å÷tD¿kÚJÿD ç‰|{¦ÓNÛǰ·”ÕÙEGžnÊïÓQòª À5©|½mGÈéöº 9: ºnL¿ÿÁ뮄0gº©¬wj?‘ñl PØ¥2úpæÙ„­°•sŸRK0S#8ŽñÍ9±éˆ¶[mÈœ.H(,Ô/¹ÆøíEÂõ ¥i%wÇ┹ÿÃ`˜Ô˜Z×óßžƒÚü¥‡M ë~ÿ22vÔöjÚÛJ_•‚ù´µ†æ¾å¸+Ñ}kp zÛ•y©§Ë/K¡S^‹s–«¯~;dmw1LWz¡u<[,±rŽ¿ž©„Êx>ž5ª OÓX[¿„Û¤ñäz¹i«ŸøžaUÒ\µÎƒX+YXz³þú‡QÛìùž Õnؤpxz.7ª¥ß /0=:ƒ—õz6iÓ|ÆÙºŽ²¸ÇÄõ¸Iž[7„„DòÙQ!Í«ÞQæÂd8h½×iÿGHYÒý°çuLV=<=SùàsÌ’D;+Íí RÅ4ïR³ó+ñøë2ES…íõUQ>¶ê˜øœ 6®²˜•£·a«_b”Ù™˜±n¯åÐŽÒˆÿœ¥Õ#…ÞiÐÒ#ã%ÈÝ,VrA‡ NÙä•§Ø+s1»[äTU>‰ê‘iýÿuƒÿå@»{|£Þ•¾†í£ìâ/Zwœ4¢üü&ßøsÕ´¿ÔU/²9&3󃣌Z'p3W]ç_k3Û­ß/y¹l¯Ì^L¨ÐG¬4VÖ‚QÔ1*H§³N»–!­I0¢š%¿Ÿýà*üDt GÚ5p%Ò‡nÔ…zœwÐ`vÎ,ÁÌôW‡Â²ëØé_Ð=5=­#½Fš¥vípÂFúljÛ 1(mB¹1îðÄ¢¹/ÞŠÄd¢ªþ&?Nœ6‘¥™$°ÀøÂ£Eõ¨^T_^e ɱéüy<ùÜô]÷ŠòV.Ä2RÞH™mÌ]‘7¦ìtƒ^ÇËrÜâc`øÅCk}ÕØ>n"±J‰[lpAe…rYòˆ_63—‰²àݰȶb“'ú#¢‘±ÝÈWÁ™vzcOŸþ¯‹÷Èé1‹;Žo ƒNK7—åê‘WϳŠ/ DË~‡‰ðzp\ •&Ê´+ &ßÜã—»¢°øÍ–¦HäsJ$aÀ¦6vÅi~Üt CJÑ( ½ÓOI7癸QÆŠ¼@‡º¹÷¿5fÒdŒ˜ °y`#vk°™À óD¨qŠxcE¥b€ÀÚdËÀòÒ|ÕÇØãåª5Û‡¾órP̘½q ¢"!’yê:rìÆà͈R¨ŠÕ ‰ (} ÷à±¶õð@LÒ’¥B[IV!E[iï„äîžïD— ßÐ0b LLÚ‚³8VäÌéõT„7®Øxf^ä§LUë&èÌ¢ùçͰN’ý‹cýrê=1w€waÏ)δ¥BW†Yž‡ª‘02®&ºsRpá$dŽÍ˜Û»ÍýDšåO2Q}gXºöÐaâóK½-Ž£( :>ÿþWþðr¦KŸÌM)dÔ+98#uúÅr2Ýå¡Hš÷h£n»ÑÍ[ †6í ¡”ü ZÁyîù”õwËO¶Œì­¿D³7»ÍrèIZ§C[Icãoé„ö˜œ}Ma aa§fÒÂënzóÅ´ÓÛ¦ÀºÂ¶éæ´•À‘p¦Ã7TϤ'x7`d·ÔÇ–AÝUõ=)òº/Nq¦ãLi»)Ç5±³$wTÊCŠM‹¯Æ#`)"o Ž {ÿ·©öŒ}€’‚ºÛ ]zeNŒ¥RBJzìÐHÄ•PŸÃþß?Xïbÿ¼BvÜÞ¥èhÀÂþ)gûÃÕÞüŽ-bC4Ÿ²/#rÍ6ϰ Ñl¯rÿkûípS‚¤ôÙŒÏ0T1Q¶ßÈêj±pU”üÕõ­<å,xãgHõ‡Pm•iÖ %ttЦâè±? 4—8†8¼n>y„¬`oì9”&ÖÁ¿ ·)i¢‹Ä†vqÐé,a(gxrãh¯>@e–ݨYw4y–/# –4†1Ó?V쾑36È;é(Χ=Ø ?ç¸W&GN;2Þ“Ñ]”õ¬ËÛ÷Äø¿uV6C¿_CGÑ{6©çvÜù/¨ëgó“Õ;ë£dy0B4ŒîÞ Ç¿dB4Ò3ïrów1Y3î±çô;Ê À@³¨švˆû>έ·ÉõW7´i´ž©Ùc‚€ÜD‰²Ì‡.;çÒž“²oS–¶bA|!Ëî¨3ëÙ˜¸cW¿óž•µ`Qþ&'—õ‰›ýc|YOít-¬HsÕý²MÈwÉt쑵!/¥¢ÒŸWok$X´·xiíØ©W©ßµcJíÞO¾‘hº"Úèé>2£^—ÉÚ,iåÿSù2øfö­ÇÆ3.$õ&'æ[­‘ä××û:®MÄ‘éÎÊŠ%¸*”o‹=¶€C=èÕÿäQgËvÿ.Ö=”‡lä^Ÿmª7©œ4Ô4Kè< °MQfÇ·õÉlàžU_s›ŸÕibjt¨×nô+K×RJIÍøé3›¦Ëò)Â’ü¢£L*÷*Z¯…’Ý[4žºdâÌU÷ì©*†âéÔ¥²ÿ,”"³·†!T?x½âãò´€ã´’ȸÍ7ö„4²–Rçc0v''ض¸=fHª ½Æ¾hb½8û²"¾£6\!+r ”Íq½žô,;êiùK­`— ¥ÁÉëõ8öªô³…ý.7=|v<7 3^Qöx!•ܬGó܇¯¦aûÒ©ÎJ2M`æÕª ùf„²*G4P¬÷4…ý·ø ©‰³ì©¿Á/Á$€Â% gòOëæîí¿}™6#? ¢VK{ðØÉ`½œ¿ˆà0¯|Ü]þr‚>àØg„çˆá¼ÓÌìÏ@ïFnA¾NDŒ;9xá9”b؈ RE°†ç›Ü·i[>låw²È9š¶­Hx[ãâß±æâ6¢Ò”½åäÜΚ›i»äQlö¥‡%ÒÃŒKmZ‡ B„›0Ì ´”|ÝðæÀõÒò•Q²Á õÐôóyÞÍ=¸1öŽ©ªgV$…–fN‚0 ±\ÌZÃÀDw亚³šùX?8¥1œ¶¬ã»­öÖj,‡©ÃúÊvž¯]Ÿ{ ‘H2¾ÎZæ,DâÜêëªíHGoýÇ(jÚ ê©•ís qMÖŒýÞsf·D"Øæòcÿ. `Ç l1÷šðV<§_6ôÝ£±æ#Ì5•iþþÚ}qúríå¿w% LîÆ««Æ Þy Þ’ÿ¢×øó¾a"Ï3ecDË_™X„ùæÆÔ¶‰Ç¯•žykIøqŽshNÐiê©iê%Z²õ'ãú¼5w²¡¦£D›×V·ü…©² ¶#‘Yü”V–çúº£›6Ô Õ:,_‡x¼pÃúFÂ^óÝF“Œæ±Ê8à´HÄÚLjŒâfìEòépåÙŸ^Ô™YQ'¿ŽÌ¼Ùî`x7ùD•€4:-Ào3-cX4‘屦ðw3ïªpÀ}q'†É1Æ(¢ilõv”B Ë?kG­Í•~dƒ20BæZ"òŒŸÛInÿ')=«ðõfÛº‘þ«µ øb[ZAGî§åŽþ4Cvö˜>×þF†›tIe¤Î× endstream endobj 77 0 obj << /Length1 1718 /Length2 10511 /Length3 0 /Length 11619 /Filter /FlateDecode >> stream xÚ¶PÚ-ŠÜ݆Üw‡ Á-¸0È@ww‡àîînÁ-A‚w . „Ç‘{rîý¿ê½š*fV¯îÞݽWï‚–ZUƒUÂÂÁ ôÚâÌÊÁH)©sp€@.6 •–VìlúÛŒJ« ‚: ‚ÿr‚‚LŸmÒ¦ÎÏ~J€‚‹€ƒ ÀÁ+ÈÁ'8@ÿ8:@Ò¦®` €@ÁrB¥•rpô€‚­¬ŸùÏOƒ9#€C@€åÏp€„= 67…”L­AöÏ'š›Ú4ÌÁ gÿJÁ líìì(ÈÎîææÆfjïÄæµed¸­ê 'Ôdø£a€²©=è¯ÎØPišÖ`§¿ì–În¦PàÙ`6Aœž#\  (àùp€†¼"@ÅùËYñ/Àß³p°qü“îïè?!›š›;Ø;šB<À+€%ØPy­ÈæìîÌ0…Xüáhjçäðoêj ¶35{vø³rSÀk 5€ésƒ·çd;:;±9íþh‘ý4ÏS–XH9ØÛƒ ÎN¨Ô' †‚ÌŸÇîÁþ×ÍÚBÜ ^K0ÄÂò&,\Ùµ àw. yé¿]žM¨¿mV gäà€Þ@îæÖì¤×ôpýIrüa~îÀÇËÑÁ`ùÜÈl zþBõr2uœ¡. ¯ÿP98`sg€È AýýÙ ²ü ?_>ìÐ>küãóÏ/ÃgyY8@ì<~»ÿy¿ìroTåUå˜ÿêøNRÒÁàÅÊÅ `åäáðóøx€Ÿÿ΢j þ» àïPyˆ¥@à¯bŸ§ôŸ‚]ÿ¾†¿wƒðß¹”žE 0üÖ¸hþü‡ãÿYé†üÿ ü,ÿ7ÿoA¯]ììþ¤þäÿ?´©=ØÎão‡gͺ8?ë_Éáy ÿëúô×Î*,À.öÿËÊ;›>ïÄÊîŸ1‚^ƒÝAª`gsë¿Äò—]ë%³C@ªNà?^+ø?Üóf™Û>¿NÏŠü“=/Î)1w°øcÃ8yx¦P¨©*ðYHœ<</ŽçU´¹ÿ©a;ÄÁù9ðÜžÀÒŠúÇòqØeÿ0ý…8ŸEôñØ•þAü\vÀ3gúñØÍþAÜÜöçÕ·ÿÍs<+—ôäyNe vý‹¶Xý òØÁÿ‚χÙþ ØíC €ò;÷³/äyt¿«yövøæxÞ vÇß4ï3zÖ¡ƒÅ¿<ž€þÎøŒœžwñ7ýâü›~>ÞÙÍá7ÍùÜ«ÇïüÏ£ñAÿâÿëêÌ] ÐçÇëÏåz¾×ÿà?_JÈdŽº´à`.lÓÜuW'AæÆº7)2K»÷6‘Õk Úíò9™±6+pz#‘<Ö½º#Ãp-¾LõèuÒÞ„Ö‘¤ÖùÓûÁ8A}z¯õËgÂá©¢‰Æ! rVMñ}ïÇwÞÚ¶ðí°= ´yï\ø1U ðîÜe݇*VÆCöÔökyß =T̰ÆhE”ÎÑæ›eÏ¿Drf¥xÁ„{æŽ5w}3‹›;õD¥ÀŒêó5†«ØKo“3ö~Þs­J“Ó©—ä‰1ü5îø4—äaŠÑ¢WYñt*z£C.Ѿ”:‰;ûlUaÃ]þ‚¯Ý̉E%ü¤bÇ×È£Ž&°×÷#·Ñó™ A‡)LÝš ¹‘ 2ÀF›ÛH‡^¸g5òC´n0b¾öq ¿¹MÓD†¢½ÛÛ*«Á-àhM“zlÕ}T~î\Ás&Üõh‡ÉÿìÊ<Óa¸gÂÉžÄ6™¶¹9Pä°®#9W™,а1›ÂåF  ‘4†&9+#¯«YmÄØ°aï1³ö°sÈ õ.|èx¿B«âI¢¶:? §E9.ö¾.lkÂ…Pöó– ô:nØ–Bxì/†Ð‚Ë·Õý—.¿²…Ù*¬4$±Ð•íÞãéå¨Ä+~ŸÍå!3hÀÿ%Xú¦ƒ ÑûÛkÔÀà'¯Àr˜Å‚ ËIÎÏw]pD¢Ý6@£T÷“”µ¡_ô:G§~G!]`ô1!½1Õkç6„8Bѧú/«Ž”Úu°>q#‚%½ë¦—@ëÁE/??a{¤yN·ÓñÜ”¡!V<þð)£ßaPïƒÈÉd­ý£}§N/ç…¹4¦‰1B,z*á`ˆ)ß1E]÷Ð’…ì»Ñsä9\)K»¶Dç`g±É6i@ºÜõ¾+J$ôœÍüÉ–­•¤tEź"<ÖýÍõQuÖÚŸF˜CžFÅxÏi­¨spôõ­•KÝÀÎ)¡Ù¦Í ³3RèÝSRbþÙOŒ\{ÕJFwú;qtœ¼^&Ž– ÖXD·SØÈ1`„G«s ¥Ê)ƒNeäªKÌsÊz1팲"÷™LÐ7s2GpÉÇ7è}éXG©|«ýbjit„™ÜpƒzƒsŒ©¿Š˜I#ìÕéñx·¾Èó!˜òïÑKgÁM¿¤Òžl˸g>ž²X3”m˜S­Mÿ¯bÔv%1JKUÓœVx*‡+lø!šƒ|IÄ?Zܦ’üÅÚá‹¥^lä¥h›áómÛfæ”_+U™c *÷¾gºÄXŠ‘%ï-)Ú\òÎLœ  ×*z2Ÿ¨Ù(8Ä+³›óÛJâ±ÎàEÔGá\ÚhþœOI¥·éªu•±m×¥êM˨=Ò†iÖ±X™M‹+B×eŠzPEx¥;à”lLQ8Þ˜Žèë·Dêí¥XÃ;Ø”ó1U25ŽÏFþ–9€(Ì43•ô±Ñ?â¡”ý)MœMü †à˜›!‘¼‹Mö`‚Ê$gÆšÞ±jf‡Ù=ÙuBÇ'´A,jGv GšB05Ш%®967ž‰®ûÜñ tÛ=æa‹O™gd•i+~®a<»G%egd„4î³ÜÂúN@¼czô´Ž"^ßù«9¯Õ;ÒM)šdŽ/°¡JÀ°›#lË߉\+”\Á7"ÇžTØÊª¾,GÜÉó¡zÖiaO«™`‘å5¹÷ÓjPt0<^U¤)Õžc&q²úg}jºjD¼xò½¡W~Þó·ö´p¢šÝS¶u[/Ž .!uºâJÈV—É·&´b¤XjüWn²\Vþ¿„ºÐ,Š‘ÚVí>: L¶s>¢'im]^»ôòn§I-DÑ’éj^Ó«_EÚÌÀä:,pP(U@|Å1Ü% ªüjf7¹:˜ÍÝ#€!ãn‹mªT@Å –D}U©k:_'G€"‘àg$”W{Or)¼.„”úÓÕ[ø”yNviWÜ9æNh´èÖXœ£Ž&X»J‰Ú7Ë5þ°T¼Å8/RR “ú°™3~lÖÛ%\ó\Ò§œ|æZ5±eÒDoa¨)7ÌÀâåQÿªßÇ SýUBšËIÄ$Qp¼Z8ŽŽ¨÷«bTÆ©Iy:Ú¾ÉüsÅ9Ûʽ(zXøìE–¨ZO];Yʈ{ÍÞÉx»'$ ³'<ÔVª¬ÎòÝ[Ö¥äÇ ÞwÈLiŽÌl7V6vzyPJkg²¸I1.AÎbç¥ó%:²×éÔnÂ7慨cžÖu¾fSšÅô".ßÊB~˜%Öˆ¹âé*O2+¤ïÔâ ñÒå½úšù3^Í÷˜ÆëvªBteSǦ¹›ŒsF|HW‰Æ¿7—ëY?”-ë.Ð;>÷Òˆ¨úÞ_»Ï=Ì[Úh냛Œé¢eýÌ·±V°ýSV 77»YòÓWzÒôø7+ý\{Ý8çGõ•*ÖS #é]¢F¥¸®¹³ñLdÈôòöÎm³5‚Ê4ßS ß+Β훪»ç P‡BÄdcc·LßáDÔÞÓ3~2æ^¢øàóF7¿–¹ÙbAÔÈ|];Šw(£7ìÌ2úˆGÂX¾ùT¨«gsy 8%d`~Iž_LûÃÁ©î›nqª>™ŸpÒªO¢y Wøò×+_Ú K½¦hº¢wù¶4›5nb}Ž[MOI[ÎÍÙ„+½ÔÆ€®ÙA hƒWñƒzâKÒŒø…!ó—–„îH©,ÏökŽÂPý«VMÏ›óhrºù€å#2ª:ÒáêøÕÝÏŠ’u•S¸4 » °Íg½—¿ÎÛ(‰ˆ€|˜I\œ„7|zŠÒ/M “¯,÷å9ÊÈÅælœèÇøÙ¢åsdós—‘‘`>6óFŽ „¥a1ç7”CowYî9_l>‰„7ùÕv ôìyÈ F(nâ€d•{t”%"R¸‘´œ Í„¬`)cX¢oÙ ª–kÆñL¿¤¼ÀÜùÌá~?òþbt×$I»7ùœNF.7@¬Å›sá]j%u$¯ÕddéBmµ’ëò1Å1¡wcÓ`ô$z ¯õ  Äb*L?É g78Âl±›ê0ç@u[jòõ½'æŽðZg \x=ùFe˜»R¼|j÷Uµþ+ iÍc½ì{ô™›ÁÖÍÀ$°· ÛŒ€›™\‡Ó$²güÖBÆhus§Õ\ÑÂ>oöæÊ„²94ªýb%á-)¦ŸÄË ˆNÁø9G3l'w$!à EŸŠ+¡²Dù–ˆ‘Èé[#÷‰qD÷€¦Á§å?ʺ¾eg~"låÜ«ùXéÁïÓ"z*3Š©z¨â‰ÇàÖý_úÀ¶¼ÆïêMX’ÑÄãµW £”ôC¹L #'CÔ”–Û‰#‡ˆ‘Yto ¼´É`jVŒŸ0*07K›ÙSÓßš£`ìq$}áÉõHào$cGïX@ÒîØ©-½Z*m¸ÌÆf2zíCJE#†®J¶ÛæÏŠôðÝ7…Ô~À׿ì}Vâ‹×®äÚêˆ7g_ذ‘ èu n†c¯ô#sñb("¼÷q賺‡0×-¡|X[-þj]¾VV€"O„îÞ)»~$\79±~R ¿Šº ¨”èAtOvp ­ØæG­ê§Z›·ï Õ—k\øšÞa|í¼³±·C ÌàÊ¥^=#€&ŸÆ€QްM\ù©x^‘6š#”Ýki¥?¨|òõY)Ãjù³ Ž%}ñs<åƒÊªã2"¬Öƒƒkñcd.3NãK5ZO‘ÁWeZ0°.­ ¼ê²©7›VÇÃ\í×w‰h¯ï:sgð «DT¥|‚V9WGæl¯ññèN†áÐŽ„@õ²|‹‰ˆÅò)wÑÝ@5Ë>öŽ„”ÈŸT$ß3s@ÔÛÞœ±I¯? Å,ÄCü¹¯emâÃn}m“3Æ—”è%¢JWÔE¥È;6”Œ|~†Z(Jº´1¸¥Ñæe˜°¾Ï}ЈzãJ¹;ôƒ•£ý߈+‹§EŸà§ÝZÖî®Ýq®×õƒ ù|Óˆ¡´äxî‘ÓÜÅ|Q§üŸZOƒýëÃF xl}çugK»9¾¬²9¯“@øQ2i¢¡nТ‹€YÏ6㦼Iô(UŸ`»çWé»î"GsÄÀ9¥Ì×pÅÚ`—'¢D³:L*Y’z}Iüùš‹%)&HÃMâè#]¥å­rQÆÜ®Eñª :-²_C‰l:à1O.dÙÜbŸ;3‚ ñˆ‘ |ür†%ª–¥¼(«FªÚ¸ÍJ°J uñ 5ÆMÎÉMˆ2|jryÛ=[ìé©9Þ´£-¯´SkÉ´QÌÛO€Ðä»ã\x¾‰g´×/ú̬pwôˆï̉¨Ÿˆ„¿ ;/& (g,õoØÉËQä­9eˆ|waÕo#Ýøq(LV”3Å,Öõ”+ê§·Æ81™[]‹ñµ·µt-“â_û8‚Š! é¨'g„4> _œæsl­älITS¬läk(rìÅh%´?`T7ì{²[Ö·q£ùê^˜ dApÛsðl¼Èl]}!¿í¢,)‡Eÿ¶ñ,–hHûmA4µï(C§ó’ÝÏÇéÎc";ã”aÅG€#â´ػ봔>ˆt낱EtPç4R(‹ánPD$u¡“Ç@·Ñk¯AK†°“7Þƒœa€ ÑÓ÷yü‚ÏQª*¯P±·XA²x}ƒs©î{_hÿÄ+[⪺͈'[û°³§JL‹Õ`iH§âà×¾·ClgÙ%a‹¼+:¶²ÕLåÓ"n<ÕÚ°ó„X~ùŸî Œ‘æ~rÑ¿.#zá's>Ñ«±xÎ}°qz¹d¶§+ÂwrC©£CsæCÿ€éèŽà&D¦ ÷Í5{JdÀö®ÐÛüEƒ‰Ñ_HÃT+—±—öÚ¨å,Åšú]—H…K ¦Áß釠±Ë–Z'E˜óØŽœ›gXèýKúU—/?—æ@™fq¶¸ß†8.¾ÊC#×ò¢`n)›”Œ »äF‡’¾[ÎK/@55Q÷~·a‘†˜¿¾5ÉuD ?;Ðñjë˜ýÒ{FIýG+«I4Ùf-z¹ï¾Òï¡Ü+ß ÿ[]€K…~½ÝƒC×ÒÒ\€iº ÖW·¤Ö¶¾…`fÿh?Ç+‹åF;ü8i*ü‚Y´vJ3N%8P5Æ^hqñn¬¾¢ãÎß.q˜*ÑÀM6P'ÈGÊóH•™Ý Èì‡Oï"³™zÐà þ®šT ­mYº2Ôôœv¦{n¾UŠÔ8©‹O‚¿„Á®‘ÍØfÞgþŒyš‹a9Œœ¿£’(\xýŶ‰ÝÌàzç°ÁU~ív ® >_ w÷2Vº~îøò§íSJµhK†IHB®iL¹jƒ¯ ­jMhÛè˜(j³ì[»dÅ€i1¸ôì°Ýæ³û’„µ„rº¾Hk—kºnJ ØÐWØÑ1s´?bÌ TÑ_Ê2¼\GÚ®¸¼nÝúŠ8ÖÛ‡Ÿ<ƒ ã‚@›Êü2iן¬ ¹-¨B{[.2=ñz™¤9†Cv9÷VÎ=r[«ëH³ab¦r Ö)žuÀQ#©²Oª±!ï j ¼€€;ÈÉP}ÖËSª>¬CÌC¥CcmŸyS“ÆäÁäå@ʰmB–-§D¦èyQÃÚ!‰ºç´ˆ%NÄQ ã•ÄZ½{˜™¤ª…píN±ÑL,Ë,5Ö@¾ëüžý4ê„z&ášzv¸Ñ~8¥q ýu®­œÌÊA'/·]a^ó¢È\'êgÃÊŸœÕSV”&£Øé? ²&&ˆ.ô¦Â={s Ê3ÅÆÃðfëÁ¬(3rh3w§Ç¼xÁ:bvìgÉùoúºTm]ï¯Qª(XMp¢“#Þ'œO$P—²z—_«k+AyQ,^áØÄÜVºÕ€Hs;ªcNhÙLØn.0œ{“PMˆÏGýÂsošâ {Ö,ˆçô H={ÓŸro¿‹¿®R÷k)”Ø­ßMÅ…IyäÓÆÝ<2;ýI»p®O J®ÿçXÑ×yÁäÅÅ¢ß|æUA[€Fó(‘8Vwd‚Áà´ao¶ÙÛ|êåõbÇ%ÓoÀD˸.»¸5Hç,ªŒt z“#ò¡Tð¼î’goî«6‚Há.LÂ!þöxöÛf2xB~/Ê{)­/­B­jοÈv²õk"õ6*pql†3š¼uáÕ¸©F÷¥„ ô@S_¾9ìîýqTÏÒåŸ=Ù*}jTߩӦ :'3&Ž Ž¿ÛùFjVrM„æJ;}@,E”O"¨5íf¹ï…•ÞæWaÚÇÅì^Lt »KóÞ ƒn˜ÝÀ·ºhš;¶~ÿÔd KV˜ú«¤h§}6:Ãz›—7߸e xí–¸|1'’~tbžlŸWGv’dº]Æ7 ø€¶pŠlb¯!1ª:~›-X•šVø M8¯îö+Ü⣸ک¸IѱÊrJäÜGø>JädAìÈ*ò#IåÓ„¾n¡ÿ¸xð”lGÿe’é1GU‰J‘}üx¥‹‚ë/ão^Ä{²­žuk¡"_˶$ú3Û:öÚ µ½žRŠ_‹„žJ2Ëé?÷ ¬6]6I¾  ¥„ˆËΦ1‘« %©C9å*ngVÚ¸3…bÚ›vÇ §$R;îƒK–_ÖI EÒ-¡Î²Û*Dßë_'0V*#ÍSqKVW¡ò¬A쮣õ‹„§l1ØÏÊâ(µtì»ï¼Ðh\ÂK|i|"¼N+<§ SïçdbʽVŸ3ï]U§:wu6sevÇf†5· qò®›¦U¨’P¼ˆ¡•­¢?õÉÖš6ôˆ.ë¶knìx4(q+Ø’ØJ2õsÊËY´¨æþMµí¤5U‹ (~¯ñ`sÄJb)œ¡ºegd\¦ÝÄð¯¨mÂÁRšOe[.Ø|<Âúž¶ CþÃoôY:Ÿ#éä ¼äŒùoÖ¯ú”0ogày‰Z&ÚD˜5ñ0²¢¡Å+ªD¦ë)fò«CÝoUAºÅMZ™º6²Š-ç{ª.eTQ¹¡bMQžÇì,3¤_rδíŒR…ÃØš—%?:¼æ×i^ü|"o0l›*õ€Íü•?ËuytG߬š=aÊP¾j6k§Ýƒì#5I.aLöî£‘çæ©Ék(<ØŸwG¯-©æÛö4b¾ý“šÞ›_lÓª±Ò8_®:T¹rÌ9APéÝ’Ÿ_Ì1›F áå›?OÑÞ„Þä/¦]â\âŽ+¶zøm$óåV àwÉš‡¸â;Ÿ\Š>Ût|ájvõ©½äBó}Y请&ë¸'Ié?ìû#Ý!H«ø2¡tOWN‡|Ÿ¦'µ?1–¼¢ºk©e€r-uÂåÌOªWTtö±@½½mêC$>ŠÒ6ƒ¦k¡²b‹ºäÍÒ^!  Å*ž„x†<ŸJC!nTØç” ~?n¿ñ IR Âcfh &;]ŽIç=*ÕÁŠÙ -ßÕî…I4é`rc!_í›4O:êÑ-½@hà§oÕÆ§ÆÏÌA™uƒþŸ`µ ÐDÅ‘æeÅx»øÛZº‰ð`lµ+1õÁLì/b+r³-Qê›Bí—î¤Ñ˜T^¨~}!eïêö+Ô(ž2€è€Ñaã$±Ø’WäÆ @•WÄD:ZX~ÈÎ`nU‡Ò¢Aw6—í4½,ÒP݃_~K]ÃMDº‡ðm³ÞR>Q…ÊCÐÝ¥ƒÏ…FîN«î¾¿n'[FYŒ\æBÄvT$[ŽÅ•Þk¾·äWÞä©ÿ7œ ,t©jÀŠæ§Ò(ÄŸVÒ©ÖiBðâqïR½Ûß­6¦!—g/ Èx;W*–PÜ€[×mCq g{’ ½_ …OßåçЙüà‹„]ä1ÞêçÔÕÀ!Ê.ÁÛ%O—×?4t6â­›QtÉ/ÐFòÄn¾Jô/ °ý—£ª¯bÛ_F¤‘ËçÎ)v²Ø”Œ7:±—D&÷Ü ½œ½š×…™¿ŽãkXÏ~={£Â$컚«ÿ$Px"ÉäcƒÈ©/nÀÈ™7âƒÏ“Œ;ü‹fž†+Üþ"ëÓk4•?Ìw¿«)^WáÎÀæ2t`3Q¢´ŒT é<æ$>u´>.þQÏ2ÃÒÀ¥i¯fÍ»©”cù‚3ãµ=åw¼:Ûˈ¸ˆ¿QZ‚œŒêGqu¸ºSëaÜA?j\6¸‘OF::5ï,AD!ýWqô!âííÞtï>(•x´é;ƒ±.'…¾Ú¿MÈÇ:ѲqŽÂßµŒn À窾|þ·ãJ+²Ü h'öFk|d¾]B)HxS]>ô[oB¶—!s8Ò:ljÒ"`ããÉ×XÓÈímŽY_ŸjUØžâ-2x\ƒ›ÏóàÖ`§c÷12—'“ºüR+%;~b§6æ¤Ñ½|Ôá6‰%†âøœêŸR4:}G«;Àc_&&iÒOã6[åóùV‚gy` Û#›‰}"aaužúþÊ9_ïCØ™ S©µÖ& uÍé©k’Õ‡Js%¿âãŠBñ´Ä@–ýtW…Ó`ÖOã N*ëHÐÄí¥2**szp|áуT.NÖCß¦Þ ¦ým¦=Pã½côH¨g÷—Ò=;RRÍDrʯÛÂô3A´¬3 ÏÉo>Ò$´Ü5Å:™AÅxöÒp7ž¤ÉMåÍv'…ˆT¢¥ìCG*dk[|v1}@E[„̈è‘Ö¬—§¦’qÁÌI~%‘ôf[ö„öG}Z Òc޽EXAQC"\åp r™ã»–ÒôÅE»JfµÖ˜±êÇe± ÜÓßlchö’*^<ê9é—‹·'ð†c²óµ3Œ‡Ò‚lV@2Ù¢¯ÉÀ­&>ÒÍ‘#+aJ6È7]4¾¾M.Jg=I·0Òºô½¬—òÖF|†žõ3Hžm‹?'/T|Ouw3\¡¿c¶óœD|OϤG‘%jïmï,†ÔðA"¶Z(w¼y-}7Ì eO7(h¸Kþ nsú½_Gךkllb«?öÁ £H'`=¿x|@hånæ8ŒM¦šYœjù ¶^rcÞ;H­È½®BOkËò'"y½§»Š|Ê¥–YŸAaYšZ×Ãv­ó·¢8Ì~HÀX«ÚlüÄEÂÉÔâTASRR‹°¸>aºkœF}åi€zrL)(nœë û’s†MÂK^(Cu¿MX+ø3{Ìô.^K\;fø˜×ƒ*sSfŸ²i+g¯3@¿QäÅÐæ‘éP+ò„•;ÿdÜëzE(N¸^5­=« ê²µVM*w‹u}:4u\9õyr²ïî¢'» £}MPY J ôOÒ‡ù½a°Æ3èO0µgJBBÓ~ú^/‹MYjSR.¼t2–þݤ§¾œUÍ10î"ärbÓÍa9ó¡ò¢_–«‘ N¥YÉFAUJ;-*'{F™Ã¼¨ e~}"§õu—¡EFhÐ f«/f?>±—Üa†=ïÑd³5Z–;ÚPÓÝJs »Á¹€dÿ!‰Ã`aHó]_Îlô¾ N•ïö–î@ÙM>&”‘àÑÖ'ßJ¤>s`ˆFÔ^kÁ¨o³Õ–™;^kÄ:*ãäÏ™$Ø.Fö¹alÜÑ< v6¶¼I~¡öH`â!‹|x1{Ô¤4×ôŒýn^ç.&î$Ï&])}RœÝ?o[Lk¡}Õc0Ón9ÔÓêÞéÈaÌBÒ‚§$×C­µ©O°"À€k"<Ñ¥ÏÓ#Åsøj9Î~œoñ›gxâó¶ªÊzïOL–Ÿ.ñ‹sÖ~£[çòCÁ‚­³E7ˆÓ,‚4–-%Z–lëµ?w- Ä_xŸ®Í M—…-%½·KaÈ6äd"l‰ŸI)9x!&)[„ŠƒšÊ{°<Æm­òÐ30®k‚)Jò^¶Vñ]<ÆEïcÞÛ4u•[ö¬wõ¼Se÷|¡›©V’hAc 4à;9µót>QE}&u˜Â.·WîJÁ½ÙW³Çé}¢N0>ðH.,ÇŽS¦´§ÞžÅ.á&šQc¸ûÅVö._†!pƒmC‹‘ÐP™šØ#à ‡xê­sËtÇÞðy;¤Ð6æ¹nSà«vŸ‡7²TÂwçÈ?#ÏÁ  HÁ4ç·F›Fí÷8ØÊùA®}^Íàli3Å>þJ„š°Ÿy‡+øtU,œu“™ˆ…ï=š}¿´ô¿ò2³è@ŽüÍšˆ7æg#àä ºI9R2×ëÕ1½±lœÄƒ†µ#ÍN±ÕdÛ¨…vZF3êoªXßá>N¥b¹Ë‡ö±¼Ã ®YÌÏmð,¹#¥'Éñúcé3’-UoŒ$`©‚$ýb"|ó)V¢ËŠÙ±Èfœù¥>ÒÜlÐL´ÈD2Z»bmSit©+—¿ò—U’w3ßö;ú ÎŒV¨úqCæ–è›f߯èVG%ÜÀÚ}¾Š˜pò¾);@¾å×jÚÔäîžÿ˜çÍim·ŸOü£wú~}­ä‘DQ ~r³ vw…Æ,Y› ¯E¹˜ÖáÎæhY~üÜÚbÌgòƒâÁ>Ú]gyLÎ8oE5F‡-™ÅlŠQ’QØ´e}|‘Áâ×µœÞF1M$ŽówÊhLBCñ Trœ—a8>Õ*›HˆâW4¡õá,åÇ™Dîœ&è+`gml€îte¾geî%¹Ðêå‚?ÉÇ}òëŠ;ˆ› fÑÀ.½öNš˜òp—ÿd]»Ï<ÜVúKöíéö„Ï ÷ˆŽÇ{¥¥Î ‚ÜàQ/±R  Ñ9ÖÝß~ýwÛïDÇZÑYÎb áyøJ}/ÛRD¦æ·Gwy÷Cr|1Ìp†ÛZZ”H˜Ÿ 3 †# ]á·Ë^Uý‚à ßÅ0e>½jË*W¢¹¶G?Ì\ÿÞ$¡ˆ²|cjåºpyŽøxIñ²äÌhëëÆi½š‰êüÄ/RÊK£‚áES«­äQõ3·Y,µ[7jµ]<&}³í¼tÏm;²ƒå~ØJ{ùrßr)]¦?ÿM%ÍêÇ$S—Û™õ ÔG:“©PœÛ²0ìøcÖO£ê}{x„òF± ¹÷&†Á0,ûJæöhë÷¼GNTr¨J²¨Ùk†ìÄZ'»ŽÃ×5ÆßÛ/࣠/êB¡d£W4ô¦'“â±ì³XfƒzðEõ5ÎNU¹)•Räx?ÂàòvvõŸYYï;˜òœÛ×å¢â?bnµSTVLµ‹+æ-ªs˜M>bÒ50é½n‡-OårgÉ'„¥¼LL­àËÖÈé^#ƒ°E’g£r&¢Â¸j±ÕP§?½Esȶ¨ch‡7¸:9Ó ÕˆÆH@ Ì«8“{¼~•0§iûí'ÉI½Ì†ŽŸê«Ëãû2Ú±„Aq¶÷r–ìŽoóí^õózÙ³WJo¡M1„›˜…ð¯cÚåT“É­}QõjX놎éDÀE¼AýŠOã¡çœ6+Î4¿Iޤñɤ Çe·sÛ`•ËK¿Á$4Ê´/{ãöiÔ8Š/ÀêS"ìÛk®Äpq?hã&k¥ážà”ÓM‡÷5ƒéò–å„ÖbÉx¯@cìC§e{è-¾þ=nb¹^é.]o{˜Óô•)s)x;¬ÉrðzçöF•ž<Ù^Öö·ÿ’ÞR‡ endstream endobj 78 0 obj << /Length1 1572 /Length2 8678 /Length3 0 /Length 9713 /Filter /FlateDecode >> stream xÚ¶PœÛ-Œk4H° ÜCpww×a`\‚»‡@p‚Cpwîî. ÁÝ $çžsîýÿª÷jªf¾Õ½ºw÷Þ«÷74/UÔ™EÍ`¦`)Ô‰™… ®¨ÆÎ `cãdacãÀ ¡Ñ€8Ù€ÿ2cÐh!0(ß¿â` Ó£MèôÈS„ArÎ6vNû>vn>66ïˆ0>€ÐbPdÈÁ `G q˜»ÄÂÒéq™ÿ<è@ôv^^n¦ßáQ[°„N–`ÛÇA@€: ;¹ÿW :K'';>VVWWW ­# ÌÁBˆž à q²¨Á.`3À¯†J@[ðŸÎX0h–Ç?vu˜¹“+Ð x4Ø@@`¨ãc„3Ô ìx\ .«P¶Cÿþ˜í €…ýïtEÿJþ‚@0[; Ôµ˜ClÀe)'7'&jö‹´q„=Æ]€ é#áwå@€”¨*øØà_í9‚ vNŽ,Ž›_-²þJó¸Ë’P3q˜­-êäˆñ«> ˆô¸íî¬NÖ s…züÌ!P3ó_M˜9Û±jB!öÎ`Y‰¿(&Œl`'7/l»,Y¥×p·ÿv²ÿ2?vàåa³˜?6ö‚˜ƒ0<.`€“ƒ3ØËãߎÿFìì3È ` ¶€@1þÉþh›ÿÁ‡ïqè³=jÀöëó÷“᣼Ì`P÷è¿Ï—UK]VMA–ñOÇûÄÄ`nfNN3€÷5€û5/À뿳¨!UÁöO¨,ÔàýSìã.ý§`—¿ÎŸî¯Ù üw.%Ø£hÁº4nÀÆÅzübÿVúïÿ?ÿÊòÓøÿ$ålcóÛM÷Ûÿÿqm!6î5ëìô¨EØã@ÿ—ª þ3³Š`3ˆ³íÿze€s µ°ù{!ŽR7°™ Ä dùG,ìš¿†Ì«À!¿n3;Ûÿø' dýxs8>*ò· ü88ÿ½¤$3û5a\o@ ;Û£8¸¸ì£hvû­a+ æôxlÏ `sÀøu¢o¸¬¢¿L7€UüÄ`•øñ>ú€ÿ ^+èoÄþ¨LVð¿ '€Õâ_ð1Ôú_ð1Ööø8 ¬°A«Ýßðõ›Gô(˜Ù¿5;þ >RœþéÜÃÿÚ(³ƒÃãUñ[Ê»øüû^ƒÝÀ ŒùYˆ?Ъ*ðóU…(‰+óÖ¨àÍ–v=³Ç¼C‹óÍ3Ôxúòþ+¢ñØ‹’tç" ÷»5¨!MT›o=ïŒcÔ&¶š1æÆ zÇrwE«{ÈÐI™5D¾yÞÛ{jùY#6·ÉÑdÚ;ó-þÃ{ïMHÉp8>ñ«ÜIÔs¦‹x:É!¿˜$w2Ä·îÐIOç6ç´3P”8@{6&I¡ÿ`íUTɬ7j»+.Ã.B"¥,„‰yªAkXY0É–0´°PË«6‹÷dÝøKGDÌŒ´hËÅÁ3¬˜œ¼æø×|m]ÎåÞ€ ß§—'žÓ£–ýŒ¨ L÷s¼X:–î\Å> Nš<Ë”}’en+&e·©úóÅ$ çІ…Vù.UÕx/ÚSYÍ<¸h;o‚§¾±³ñ…÷½“M°æ »Å1Å?—¸[hÑbïÌžvHˆÙg{‚dæéÈ’Âu,g÷À¾ÔŸ¡ƒ¾LäA‘²dåRÖüO.ÕȸfdJ¶ <ßïîQ/w(»ú|·²{´?²ÉIk$cV/J.jÌ&nZ_¡péšfÎúô³ñg­²yª}%¢æ„¸¹$KõSYm6åõ>ééOAqÛèµxb•—á#AbxjÄvT–ÍK(8ÏvÚÖåWBÎÛÏ.æ=5%—“‹g"Fözæ:&UÜl[Ó+Èwž¯EðŒ±ê j?çnQ cuÆâz¥Ãáwé­=¨Q h 0º´”€ìœÔt´?Rhðèoç°·’ÏlˆÊ¶ÊçᩲWÜ"-û›6k#MCÔÖk{zç o"Fò>PÑ’ äצ?[À´Ý)‰‘ãâ*®@±x‹ÈýÞÏBZ¦4tLœÎïÝüÔíBM s–ŒÀ*1Ú1VO³„Üò¼žé\µô´¡ò«æDÿ ÝÞ ÁUœÞ»/¢;OÝQHÁ_µŒ¤lÃs)ünn®P"óS¬‡Y.o·$>ѱ-½Ñôà4?,ñT Õl¡YSv^YHÍf6ƒðñ\ß¶07<ÄÐ"æ0ĬÂiÁ©µ­sÞfžëÑþpFŠRÝÄéÙ ~'R¬þh†a:œÜÒÁ[ ßàü!ÌQC÷ÎR6gÕ‡Ü6ÈÐl©S ìÉk|\¼Òñó¢óèÁŸ9éÎ:£‚j°Ói“|ÔïËieZ×3/òL¨ñX…ÞÖ™rϧßÓZ}—%Fa £†lÁ¶_ßNlt¶²,L säÒ‹h—æÐ*ioÑð†Ÿ.Ä1² JÒ1Ы$ÎëçXÚÔ0̪/Á^÷¹~þ¨Kk£ª=íÎp¦¤Âq@nÙS½MŽän Z`ÞâVò–ûKÞÉM'߯ÚÚ Jͨœ™(õ¾Ÿ¯E*ñÃaÜc÷ÍyvÿÄ[´×%޵gL1±LdhÄ A¢Ô¦È9²:ÍÇ€Åi.Ì PÌ€6÷rk¯uÈZØY®ZÜê¶°tÄS2Bt6(Û… “–²Y¥ Ãýu¨Š®\ƺþö¹q-× ár[•i“ÚDó˜Ifb1娗!Ñ{ œØÀp·ÜvuÚy÷ŒCü£/¯"º¡ [NŸ­}OTóÕg÷÷kŽiFå*ŧ»–Nd½Ú£ÃÔõ[Ko,åSV¶?¼¦Sè&;ˆÛ)HÄË`É/¡$äf˰I´Ò mš¬ËÞ2¹ v(qût}ÕJrûµÔ÷>hÖ¯ßaI «Ò f$Z×T›L1 ¸VcóÒ_âNÊ"õ)_3h¬qçwÇŸºrNhd®i®qHã!Mù õË~§P¶?× ˆŸ/]4 ¼â6‘bóâc2wÞcEAmÂWò>Ôžã_h™›Gæ‹„à>ªUœxpÐ /­ì7ëÛXš*Ó[_¨îḇuž…ª vÉŽsé7jÚîql\ºD²^Çèë$†ÿH–uQýŒËœmTû¥þóA •¹%qõÇîô{µØ„èu OB…õ[-ÚhÆ?|  ;,x? ·ýZúV/i”ïÖ1Ôr(‰²•(ØãŽá §÷ L̸Z6¼É ÎN1¦JröJBâ]äµ\+äUMÂM¼Ã !U½Ð㦷CÕè\1É.ñäÄÑt¹Ī{#¢®Î]Ñ)ްI÷÷Ù'[s䱩l…xÅÚK‘­gÀPDªÎq7xG¦ ‰‰\¾j†¨ðãúï/&^ÿÄtgÙê@Àž6¡•3ó¥a•=ÑÏ?{žf«xÌ¥®²0õËT^my;’½ÓÏ¥t›L÷J‰q—Ð&ž—ÔÍíÙæ“[ÏôLÝù_²Á¹Ëöi/b©5DaõNsaG\_Ì̶®sÄ ß-ྩNKÝ_º+ˆ4!¿±Ö †{[ EáUìžú–rg†>ÛýÆhÏ”` ¼­SQàÎ{Mõ~bÛ6 …¤ªDRl\•Ÿ)^èÊ`.§ƒó¡[\~‡KÓ‹Jp¦šåv¼s’ïÊaDìO¼î¥—Ú§çC&¿MH™Çv«Œ§Ièqµ!û^…õ¼p7.?$„TVZ‡r†ˆ&Z#Ô=“ˆ¡ö<; Å»Ÿ·%:X\½Y±½²éü;oà³mdd9üDüþ ÒÊš¯­ÌJ?W›ñ Hn¨¬A:ê‹9×ùUêû•²¸/8,Š‹zJÕª¸*mì^4QtŸG ÏL™^Cð€M®‘¯ÿDãk\´ y…>—4î¼Söô¥±pzÈEÇ— }ÄÛ* ²œI‘×'ð)t‰lÈðXÓ3ùLH¬4{_]2ÀuÅ_ð+2µÕòæ-›ûOßM ä®,›(+“,C2‚g:nuÃÍ—6wHðzB ‚A:%Aºx×p‘ìSgÀOºŸœU %Þ\;ñ ï©=;®9o×ÜWÎú[¢³fî\ô>H*#¢4… X¬ÁËýÀ2üqª3Á±^ÆjÏ[g]³Zµ&¡3s­dVK4øiO×;ž¨? %d;SúX0".\Û¸ªäýÄN’,¢ÖLJ@ W1fmûÜó3&·†ó ¹©vA¸h#ÿ¡Ç/<ÿkøÞS•–¸ÁéËò%iñÌn›œ8nÕF&6E­;Œ0•!rBlº/µ÷I7øŽ/—X៬·¨*œ#›}‘h¤ —¨ /ƺ}EÀ×D @®å„Õ¼S„{’—¶K8öÔ¥¬EBß•…?e¢:› WP[eý”‚aòT{x3‹iוí¶²îV¬eëŠ5jµ_°ñʇiÛ²¶×-ä^_c¨wATÀaZÅ®+|‚5b ªØ‰^9ç׃t§jôćW!qàî›è»Œz‘¡ 9—s&ÀD{õ$µñŒ[ã;õ·¬½›Ô®=‰’QEáøºkÏl¤ázw¯²“½×-£(#¾ÇVµi•ÉèÏhjòŸ©¼aGßhÌ 'vù¾:Xÿ:•¢ÕŽÒYžjéáÆ>OÁ3•Í69̧ìòÍÞ¸ÊJKÀ%ÙQ¿8-â¢- =JtÖP¤¥h¥p.B“¦¬+FŽÑ,Lά‹F-7Ih”UÞ£«éb^$}…ÖÖ ‘¦å®:“Z ¨¼6P‹S¤Ê¡ñ^§úц°«|´ïŸ#VØ¥÷¢é]ŠQßY»>¦É „\l!æv¸Á@®A^лMmß/ù¤wå–)Þ”8E{NLYÅÓ ²Àhªgxø±±C…a»LL~¾hƒlz—Üf­¾Ë’ºùVîU0¡Ùèð¶.×äYùý›Ìâ71¤ÓPñÃî•vãθ^FÒjÁKµÚ{T[ÂÏ«ØU§±ìá_À¥%¦eS^qÐf©àhYÇûoBûÎ%•xD èö¬Š8Á’’ËJZ®“;¼‘|´ˆµM"4¿ßGÞ+ô$kî”1Ðí²üŠÑôÖÀ+}#:[Y³æDjpv¦Q›¾óu€°o4ñöR̨O°"q¬f!ˆžm3”1£GâyoØÊqVŠ÷óÕòä?ÈÈÀ–›„I½ª«y]B‹TÑ׆ë"*:¹(ZD¯ñNÁ1ò—&wÇôû9­æ~ʬ0ÛO.a§XVa5UP¾qðô¼)Û…ƒÒ:cÎÀ©0?ñÔòÑgî[½êTÏ&êÑ}Õuù"s¼!»¹2VcZQ=äYtU'7Ù6R!ŒZÖ|w#ÌÜ) q™üºi}¬b&üU¡©õW&¶k.‚$@»äÍ‹¾|IÌjH%¿øÅû¦L1jýˆ÷Þ;ÈTЦxꢗRD<,WK‘¯ØAÂÁT©„/ÃÅQ*Ï~ö®ÏÞ áD–æÞÔHØÇ­ï¢Ü)æàM«îÉ™b¦”i¤NÕ>é²2?/ëRŸç·Ð²(P á²ëSmâD‹ª˜/¦ÂFÒÓ&¿“ù»eÝÊ´¾`B.í$ §Ï­£ÛÉÐWÕö“-hµ­a­ÞrLKÄÚ™<€…Û]2¿Ò›¨8sñh-‹Wê²óvaeÌܸø`yzÚ/W]ߌYš‰,]ð^^èü§15Äq^…f&òEçóÆìÖy$oDˆ~FQ·Õ®þ–èkÈEqï é2¿JuCGº`yœõ±[£ÝF[N§®‰7¹…L.Ì;ñæµXè±}!c’»uŽ9qÿƒÿ¾wz¹ýKÕç‡Nö<þ*ÍíÎǘçrKî#;å±ý¦ä½I–ƒ;°«hJ48uíó£7#9QD×õvò¹„‰e à°Í&˜j‚Tê°2êþá¸>7Â¥üzÒÝQ•úS?Ãæ¸µ\Þþ:Ñ3 ’b*–ÑÀ=4àNSöGÐË|ø6¤¬#¶¢/4‰n<1iIäv§w±Š”û÷ˆêrxöD'¶qÚIE¨&æb~ê½UÁ-BC ÎØê5¬«ðv 5@Ôí…Ÿ!îP>xTí0kg2R5Hb¡\Úê!2˜ ¤¹ P3Ì7)#²ï(7Ö6"Þ}ÑFÑŠô:ïëÏÎY×’ÓÎç²äs³ Ï)äƒbïÆc7 væB¸žÆž) ;}dU&¯ÑÅ…{HùÆá^ ùm À£—jßÃÎ÷ûoeüK¤ S¿of`¬\} I‡ïR–à¼íW;Rsᘫ &•Jëp,ÑâíI‹zÁèBñFòèg«Ýêéòɸ¨`Ô’…Ë€ÂOëJ_È:»…´#Tm]°?çOißPøgKCGRq‡¬Ôl§I-_ |S”2€ŽW¦ëQÇJ­>D¤ÂösPùºû:ÚXÃyÿ’ Q¥ çˆ}¹ŸÉÐB4®’àÕµ5™g‹A…9ßëJÍ\’!ãyÉĬLJaÑMtÅx,¦!Bbí¸©vJ*8å!´ :Š/ˆbÖ}Âì!D„ëLãÓI8OWüäf›ÍÑ ôE'o-Õ)¸VæšI{ O™gÏôUár„B|pT¢Žµ¿%×`RÔfÙ“í®}$Í÷-Ãå~XŽþô‰ÌSº áI íÜÕ>Q½¼s}JÇ;ù ÝÌZ—py“mÕýÌ2ÌTÙËN6mô¡2ÏcÈ/ýº7¾³ÜŸtªàÈÃU9aœD<Ö×G°Âú*“í‘ju¯Øì›À…šOg†’ßù¢8Åííu¼Í!bãÅÁ爕ÐÕüƒÌe…L8jî †×<ñ5ÝÙh;îq}4hR¹wª3¹¼¡˜Óš2~Cu4L‡cÜÑp[D°Íä·ž¶ð²ï/H‚Ö6¾ÎÛwW¸»®›»„.m›Š; p¼¼d×—/®G%ð8ܱP7™9=ºó(|ß­QJ"ÿ?*Ô»à¤zžóûÆå>T†Ïý£Òäûªù>C¹oJ$Ã:à7à 7’¡ >†Žvv'I p±R¶˜në;c{‰Å×t$.ÓbRFð$ÛŸ´qfow6SZw#cSû¶ìIOi4†Óýû¢“®›ÚÏH¼šåfk&6?†“|‰úA7ƒh”uÒlyhÄÜ£lXXðfƒ;õî ïÎ(^Æö×3fs6–aýDöæKñS/á²\¿AÛC f'BqަúâKpÙûå´ä'¤ýÑ…¨>¸Ÿ÷íkYÐ6£¨| cší¬ëWý÷›`;u$ò'Øþ” OXýÁ?ýÙßíËÙ¶1/úZU6ûspµ=Œ¾ ;8¼s@Ì%;9˜.¼-hÄÆ`‡£“ônaÀ¶ŠÖbÖüG)'ûí)„÷Õ:¿s|áM˜êd1ÍÀ÷Àñº(EhŸÂGêfzOK`×É|BújÉÆ.dðJ#Ù ‡îÊC­Š³t¸Hí›D 8§‰Ë{5ókä­òtw'0N嚸:}±Ãj¾Ø$ÉC2f1j;·#ãL"݈þ5hϻԽ<2ÙùÞ"TnŒ9ïibÃôÏé›:™ ‰ÜEĶ"¥–üò×x·?W¥ï¯¹ûT Åç¯àáŸ. zš›dGr0Tsð";м¤"Òˆ·jŽETÕ$D¸©[svºäÞÕ*‡(±‘c¹*5áô](Ôâyõ߈“y¶×ETÄì‡ý…ŠÚ'hñßiaSÛÁª¶]Î7ú{<õÔ}¥J¢H"ž ¼„kO…ó!Xߪˆî0jSUËŠ#b2)·9¼§׳<³Ô:´²ëvŠäÕ4ƒßötù†*áÇìäî+ŒåÒEžï._¾†íHlÍWR5f¬¤Ù±j“háˆH2ŒÓ'|¥µ"`5£‡«øYîÅÏ{2º/úäÑIìX!Ôtݦ‚ÉN'ht¸Áä\q¡Ž‰Dþù øV‚Íú"ÜΓü™Ûk|WÚH&Ëa4"$ §ß0³Sm|‰ÝNåšÙ‚ xlù³¶h’³—7àÇÜ¡¯Ð\È*å£ÛÃmùÁìB2IO×g¹é€c—Òk4|Ážd˜4â[CÒ fË3 GZ|œÍÜŠ™rÇoɺG?\¦•žÝv|M>j6ïZÛ?ù½qèÂ1x®Zþ3¬ëCJ½0õI·e~µ‡´w«=W΃a¥x>s¾H»èâIáSÃúç¸Z ÝñaF°²Þ¦º[!¸ORh´tDÑhVÐmÈ £$Ú/| ²d£ÒÈÖíc–Fn„ê5ãyù¢v,É@¼ÛoË´ì ë¼#â–#N6ëÂA¦ ÓáÀEHàÈD‚·ç­˜Õ†COèªxʰZ¶àÓ9ö»S=æÚAT5ÞÞ«o3½*Ç9ËcÒ k£„JœÉqãW]Íüf ü¼~ç‹+3E!TìÊ";K4Ô&˜S1ƒ¬è醸pÚ.ì•ádå…4Ó¡BÇ¡ÛKK%yaÙîp½s„M]IkYfòæ§Y¼ 5×Ï8Ÿ*Ÿ6 Aüˆ¶«DWÄúi’Õº©¢T+»Ëù¹Õ”£ˆïE#ó6ùr•w’­q²‰xèƒCåê†Ï­‹±°L aÁ-þÿs™º endstream endobj 80 0 obj << /Length1 1767 /Length2 10890 /Length3 0 /Length 12012 /Filter /FlateDecode >> stream xÚ¶PX.ŒCHp÷ÆÆÝÝ!¸{5î‚»'@p ‚Kpww Np‚?ffwgvÿ¿ê½êªîû»ß¹Gª©ÉUÕ™Å, f iˆƒ+3 +?@BIÀÊÊÁÂÊÊŽLM­vµý%E¦Ö9»€!üÿÐK8ƒL]_e’¦®¯fJ€¼›€ÀÆÍÏÆÃÏÊ `geåû·!Ä™ iê¶(±ä! dj ˆ£—3ØÊÚõõ–tæô6>>¦?Ýbö g°¹©@ÉÔÕdÿz£¹©@b¹zýW:AkWWG~ ÐÃÃÅÔÞ…âl%LÏð»ZÔ@. gwàtʦö ?cA¦hXƒ]þ«C,]=LA€WØäàòêàæ`r¼Þ P—S¨8‚þ2VüË€ 閷±°ý'Ü¿¼ÿvøÓÙÔÜbïhêàv°X‚í@iEWOW&€©ƒÅ†¦v.WSwS°©Ù«ÁŸÄMÒb羚ùý+;sg°£« ‹ Øî „y}d) ˆ½=ÈÁÕù~’`gùë«{ÿ,«­ÄÃÁ篳%ØÁÂò,Üš`'7œä¿,^EÈˬ@®.VVV>6È ò4·þ\ÃËô§òOñ+?Gˆ#Àò5Øôúƒìãbê¸:»ü|þ©øo„ÌÆ°›»Ì@V`ä¿£¿ŠA–á×Ê;ƒ=ú¬¯Ç`ýãóŸ“ákoY@ì¼þ6ÿ³¸@]) 1Æ?þJ\â ðaæà0³s±ØXyX<¯¿ÿŽ¢j þ Ö¿}å,!¾¿È¾¾Ò¿ »ÿ«útÿ zÀÇR†¼v,@÷wƒ°r±š¿~±ý?·ùŸ.ÿÝýG”ÿKƒÿ/i7;»?µt¨ÿ?ZS{°×¿ô¯ýêæúÚûJ× pø_SmÐ_㪲»Ùÿ¯VÎÕôuĬìþóˆ`i°'ÈBìjnýW«ü%×ücÀìÀ Uˆ ø…`fceýÝëT™Û¾. —×~üSzšÿ¾RÊÁbñÇt±sqLM½_KüЏ>l¯chòü³ƒ@ˆë« à5=?€%Äùzòp€ŠˆþD¼ì Ú߈Ôøq€šÿA|< é߈4ûñ€æÿA\¯:sˆÝk‚ÿ–ü‘'Ðâ ýr€Vÿ€¯,¬ÿ_i€ÿ_yØþ¾^mÿ7d{½è÷¾NòÈùjûº‘ÿ¡~ÍÞñoõëË8¾¶'äLÙ^¹8ÿ¾rqùÛᕊ‹©Ë?Ȳ½Æpý|µpû|}÷ÀW>G{Uzƒœÿ¢û_%7wsv~]xŽäk?üÿ¹]A O9òâÄ\à£MíÇÖß5bDÌ»cBÓÔ»ÚiôÌ>‹Îmn÷¨ˆ)ôÕYÖoÄR ¯lKÑ]‹.‘=ù5Õ#†5'½oyð}4NP›ÜmA^˜Àíÿr$V×Kò†˜YCô§ï““¯V-lt‡<õg'7^TÕ|¬ß=2žu½eË#¡s»ïVs+¼},›bŽÑŒ6*ž¡Î3˞ŧ@pe&AbÀ<óD›¹¾™ÆÌ!“O`Dö;Žá(ôÑÛ`½›õ^­Ð`wé$ "ÐÃ'½Æ™¤ñßO•Ç›÷))\wù4‹Û6ºiŸÌf·O罫¬öÛùàˆ†zœŸŽ‹-½Þ,›h_LžˆÀ™}¶"¿î)wÁÓdæÂ¤’~Q±ã©E5î¹´š¬Kksáø™òCõS`ö§úÆJ?WLÏz¦N9wùHŽ]¨œã¡rC„ ä¡•ÿ²²tœ½lÙ-g;Ù7ü#tž ª@ÕÁ‡äÅt¢‹þÑõßr´.fkD-óþŸˆ|U;`Sp•ÍUp«*ÅF‹¯¯¿Š×hõmwSÐkX'I` y¤âÓ©m{¥0uºÐ3Ê®G lÛCý`ÀÙ–Íj£¡VŽià¥5»\B’AÀŠÑëNéL2ë·Ø@1SU6ž5_Ń MÑA7É.Ÿ¿÷¬mKÓÛñû‘¾Tsìè 'À£(¹ÿ†-¡–Q>kŸïÅcš*jú›LDÜRdÃÊãǫ°sð.ŃÑ̆r2ÌwÚ,yvf‹F.ØçG – ü4¨Ï{}(¥Ý¢—ohiA}÷»ˆöi(ÔÇÀ!æË«è– ÎrÁbêDbêµR߬±q%þâÞðoÂGÜ×Ë‚!.]J?)Bû¬"Ù5i/Ã1V\ú‘éøŽ ¼½ i«K }œQm‘(@æÉ1ÇKXvÜÝÓÇ1Ó\.ÿ–Í£uÿGûê&aNÄ›Fé%e+:uèÈ-@˜È =Üq³ˆ@«¨ÖHÁ‰¸òz…L»Îuœ$í‚ëðEµjQ½õ‡ºÎ²$¼¾íÑMtœU¿þ©kVW÷%ÖWM#‘„³¡ÁIKöÈÆœásžÛ›Ê@ÏM¨ýî6ûæØ¶k›BóAÛz*7þFµ2ìÅH°Ôžf3zËlÞz®àqëVÃ,‹‘.Í×´åPâxÈŸ‹ð”»áî–ö„æ]äj^›vo¹éå‰OÔ–éÇòØ ^¢ 5+ÊTÉÖÔa¢œ tö:yÆàáKßÅÉ.$™¬¤âýÙ“¬#ì [¾¥Ú¹`ìKW>!ÆS p€‘‰ÙŒÃ£‰O;þ7Œ_öüá2ãäÈ{v³ ‰¸±ðytº”PÓëIÃñ¾Óuþ¡16âÜø1…³dÏ”{Ê¥$1l—aF%@9ž¦Z«3Ø»tt¦Š÷àJ.1@v´ ÿ®ëÀæöÅÑBÿtøÄζ žÜNíxÇý"0Š3ÚØ3³uߘ”ŠAKÿ×B’¬ÞSέBõƒ³Çu^kb€õ©qm†4ŠÑÛfX¡‚¨„}ì”™ìP‰P˶4jæùåïuj­[‘ïaaÆÐ\E¯†û{›Â$œëñ7N½ ~î$IN†¤ÑaÝ€üªùñ‘¤Æ¡D¤CÚ¯­pß a\v-퓘ݰR„LÔ8i¨@*"¶#c‹dþž¬@˜êQMºVŠM ”“åz*6·GELù» ’·ON.í¡@cóM° –‰N'Í ŠêB~C÷åÈQéç¯è2ɆFb¶÷Ê- ³g,¾£?úüØ\Z…×QXßëïåÍÝQ`Ÿ‚‹¨s#­™|#!¥â)zl#m_ôÑšž@g° 6xv",Š·!¸Ÿ$jé ÕgÛ ±%*ļ€aW d$²d¶»Þe§Uñì{;†!ú¥g’#ŸØæHÌr‹ï[»Ö£ÙU^ÝL^‡e‹Z|Nò­Öæ´Píµs¤žûŒH«h*N„YfõD»Wæ Âû˲]=–ÿÁißbx>—³b˜Ÿ’Æ™»½ÄÜn¹™R&¿UÎæIWwØÍ›-•#lðØÏ½¤¥24ÒJJßI/û[fÎQf¦áó¬·–!Ò7žÚ÷¨1måmßb]uÈc¸˜ã>*¡Ñžb=åõÆ-­S°õ÷1]6»x~“S/ø—Ù“õSë…ÂèĆg—#KjÈ] !=._ÃèTá†9ßV$ú|ðWÆt"˦€…ýì¦#’¸5#gÅ~œ›æ›· µåû0›ü÷öI…‚$Ô.¾’3#n òêdŽ2:ÒpÞØ¤ãì4ܨµ²}-Ôpt‘ 1úÝÓƒH±ŒråI•öí„ÑÒîjÇ31 ï'OWµÐ›:·0Ñ™3νQ˜7€scÕðåSÁ¨NzˆDÑÚð Öa×v‚ø¾fc—.7É £{Z‘íõ7O6 'Üßûˆ]÷×ÅðïjZé°ðÚßK¹YR{þا³§@‚†Kgæì¤ëDàm8V.KbÕ¿Ø…ÿÅ‘çsR~%ÿWåÅ÷b8Э'¡³³º)çA¿ÞÛÒùâLü0¾ P/ ßòš&iÝ PÓB–Ü)4ÙcÉ+Ž‹mI¬¹Þ‹Ä]æ•ÑÿŒL±¢‘Ï£:%+ÆÆœfÚè_¶Q7Ä¡b;–vša8dXÔÉ`ˆ—Ù…]¨[*'c}òqÒ#~SM +Ú¿a÷ÛÁޤÑç‰B¡Gò*ú¥7ãͧ벆n_Æ‹Ž§5èý;».cÑd =bÍžÒv`¡˜y3ÃT©X—'‰€ò´O=çËIÞ#×uÅN§bu×¢¹ËÛöl?gh…ÍÜB§;êé° ´j÷B9¨ü탮ÒÐÆ~A*ZÌø§‹èOÒ Bç[±$ z¹-1׺>G¢Ë@¢A·ÈR±ó’LbTÇ€ñË´™»Ã´×Òt÷l¡ýèÎ@ F’ ä[á'û\-=ñHmÂd[^Î9Fÿ©¾±åÂõIIØîrtõg|Á½ÞÖl..±±«|v9ŽSz¢üUN^²­Û€¸W-%cYM)›ì±¢é‘Ùb, y7"=ã<øz·ï­¶Y!ýûŒyKĸaGë ô]×Êt1ƒø•è^þC&ŸðÚZ¡'Xy4©`v}í*ÉfÉ^ž•¾®"ZùÀµœÛ‰ÝJ¶«q6›Oü“Œ×ð2ùLó½ãL)8»Xv.Ï­«¤å^4d7âd‰CL¡n2ܳÚSŽJw…¨§YLzA+„ÆETz)‰ß9·©»Ùz¹Sp}]–ôFž+^!¢å$¼]ƒúøÞ…f®¤y sú{³¾9‡-Ítë¢üçÏï8íÇP.õ:õ“¬}Ç I²°¸vÖGùäbšH®g禑Y+Qg·s­.vºŒ‘‰=6;|Zß‹}‡w€-.m’±J’“M6D”B¹«A½L€ôje¿|ß låä§ C6ØÖø¢K†è"ØQ÷¹q#µ[¹IdY)wàÝ ÊmÍqs† œ½„»ã&Éï2®†êtã99Œ71åa¼qœU“®¢û…nù?Mt×gpZ†Ä^6/ zœ6+:ãªdF~}ágª°¯…Ù–*>läæN™~,á‘ %û4‹ßš¼ªôÙž¨ú#¢5=¬\Àä¨z£‘´f7–ûÖÒ*G@î¹m½+E$Ÿ"}Y|znZÒk¢öâ±’0²Ô*S/§yÑ\—ï2¡_j8*ü®Ðý^ vè'Ž™Â)ûã)LkäƒÑî©‘ö-œ¦˜O•ç{å©”üˆ% Z½øMæZ?jýŒƒ(Œ4ÚL† Ž…os ãëB33 lV.¡ËV,Ùb\gü\Àœ'ˆüŒRØœ¨pš£ÇM\ã™ëËðï@„ŸÃÂúBä_“Ý§à§•ÅØø€zä>ŽÄ»¶j»¹RzN>П;tâç âÑ»ð ÆìϪ?È14O-:"Ÿ³ñ/‹ñ£ÁF7Óù’Öè4–ŠâÀƒÅòL°‹»{Ðãž-’ºâɯ“ØeäWH˜9ŒHúºy·ê/m§lUƆ$3Öü“ú6jt>¨$ùÛñòøÚNïr0›×VÞÚ.B9vøHG›„üÉÏ²Š¯9#NlÒ]ï-?³Ámô¶D¥ð¤ü:ýÑš¹G³´K×NÜ`A,E7Q÷DÝø•wÄȶéÛÌzÚ”ºZ$˜³ï(j€zöѸPÓ­¸ýÁù§º˜¨s¡zyWOzÄÁÓ“V!Ýo4ù¦Û¾yWÓZãmƘ¸«4„TÆ™¸!BléÞXc2ó2›žýûï€0µ EÕÒ·×ø’:A&†„˜j¼…´EÊyÝsÈ<ÿº)M¼Ä*~Ð@uo¡Û þµB›IYͰÛXø¥I,ð&ËíÞÃTÊ5&§@iGè÷á2¾üíæSNtôcˆÍBXhV8n1-HÍz—-†…Ô»D ÆA©Ò·Pa^‡6~ÓëyOGvîÄôxÛˆs§<Òè¶•²€rCªqz/TÝÌmÐJO{þBU‹}¦Oœh¿3v2wœz/ªï2g pËi+ßr& ¬RW)wЕ7 ° Ü=õöaË«ƒ'ŠIþö ŸµË .ÿ¨pº˜è GמïÐî!5×ऱ1no“©ÀXc©Ö­|4Ó?k’ÿÉ[œ‚ÆÃ@AC86–]ù;††êÜGæî´(NÄÄ® =·»Œ>8Z€Æ×=T ¿ñwgwŽÁMªº:’Tª"äÌvŸå)¼gR9‡(†FÔ}J=#šïT0|]Ÿz^:09…û©!Å<+3`Ü–ó¶ßáÝU$t;t{Û) Ãõs ¬762]ÎX÷ClºÉiBKÙ”Mª°Dä'6‰ÁŒ’u9Ììx$l3×ç0óOÚNí·®"úr`2A'‹Íé]ÓôŒúú¶¾`FѲ`¿¢)FÛž¦7ÇÓ ™(Œ.Í.ŒtÐR•)lŒ¡JI'þ5Ô»´ò¸Ÿ>µD†)jÉJ¦±ºvÍÃÌEÕ¾®0¢"„diþ‘ºÕxKB¸7ú¶¿|L‚µ‡ç›wQˆ¸MiÆ£ðp,]ŸÝ)¤qUyùb'2Âzû+µ/3 ‰D(ábÜzX^!Þ s=l>‡Es“¬—ˆ-eÈÉGÑÆù0‹ÙÕRY ü²§¬|ßHÊEfaÁJèÆÁXF6'aTv­7:5ãËÖ!Þc(ð­aó3ŠF8iMó¤_{ÔjPëá¥ÃU|n9¢ŠÑ ׊@Q'÷zßLÜpBtº=sŸ§è%ÌôòPœË”~;TkÄ›heâ8‰E³Ô4ÆðÏ€–Ì|ÆÁèßåKn~Ù¹ÑUgѧ6v­ØÉÉ’ß„asü"›VØ"9D¶øJ¹¦Îª“Õ½¾˜iêÃUÛûô:U¹½c¿«ž’Ý ÚG­·}a½ò¬ò׸é!˜¦XŽ^|?D\-b p“/Ú–¸(jä¶?3¹àrÅÝcÄ‘7tÔܶ>_µ¾yü‚C bW¾ÛcöENe kb•~ÁdcË*ÆCh÷ Ç8÷ñíqJ¢CÖŠªà\w—]~åU…úþ{Œ‚G˜û̘€ÜÚÔ¢PÃÇnBL‰ß|Ïò›àÅcÓ)ÅÔqL‘„àaf×wJ;OY,•iù€.;K_”“­ôMqªl(zCø,L¸ýŽJýºÊ¶}!.ს¯¡Ðâù/Äë윃¿¤)¿¬)dU*¾H1ˆØ—¯x¼Í_5g¬±fʤ´lñ¤~f$]WäâüœâõpС…CûéRÝ¥16„qñʦŒº­o`sîa~¿ÛÙi7W¾&;¨#¾öC ZWÐêÐ-Á.â­ìñ§ª “ uß”kZSrý›9=š@qw¾`NÿÑjZ©d<»›¢õÕ;q¾wÜV?"ÔÑhüNF¤3¹œÙütö³[DÆeû«×ITU¤8©§Gá‚Þ{E`±‚ÙÚ ƒÏ†üÖ‚®FÇ ÔÓì¤D+†¨ñz¿¼§˜AÜY»<¡Ö’¼,¨ˆŠmÎÄ úÙäuB.ÀŠ[lcÂRJö=åveëÑâ yq2«@\\*Pº'êR˜Ò ²ek˜­"܉ äÍL_þRÞ`Aò»ÈJÛÎ×!Iq¶öÍù¶tœ”ìT¦¿-Ñ êÔÇÄaì¦Íó_c»ñnÛÜš¥ ¢ÞÇ€S™*ñv‡ïq?”F"²UH¢3@W«ð9ÓA GÝZ"Ö5.¯"«éîŸ{õžEiëO;í½Ò¸vDIùs¦pzÏœZ4M¼F‘Ù7òžý hDGë•]‚£??ÿ‚«y{·t 9êêÐe,Sè[Î Š‹”îîu ñî~÷V³ ¸3ôfʱëæãøASÿÖ(ö]9vÌ‹×CMc…r^X½;c»Î!Vó‘›û=¬\ÕgÔcÿÜ+B«àôD¡ßtŽ»ï[‹o>S¨½ï<(VwbóŒ)bÚ;`³ ×—ùÐnèIC6š‚`››ÖÌ%õXBûîÑ;VÚþÓ}ºaeÄÙŠ½F·Ïøët¶€½È„4º>ÒjÌ'÷,W•NBRþ<Û‰||‚LÎÁY—ê‹ÿLþ»òý¯¹v[Q·«u«ÏÃl&uW^r¢‘±ä–gßC¯Š¥¸ æ1ƒÇW·=²>gƒ u”/CµÆ:5äDt~f¸Ùr“õ9oX•4›&‡½ÁuuºCßSª~¹wÛãô·æ1µ‘y)õ€žK ý2\0›^ódÆ»àËsаhŒ•‚Ù-vÑÿÝEXôÄyÁ6–†Êawf,ŒÈ¡r±Ãä;j¼ÕBARÙ2ä3YõN7k_ 'e wÒu'ßzÕÈôóõèæ¶ŽL•Šæ‹zµV0_imt4噿ø¦¨VôU[—3ÜH™~͵8cH§ltý*§ʇÄl3æú§CIötßFòÈ÷e2_‚M Z³'£qùK,Gª²ïO[üáìQ~ÜçƒÐAÐÓÛ]ÜŽàðælJµÂÛÚ²o¢Ùˆ›¸Ý’ï@+íeÌEkÇ5UÌ”‚‚ñÇ̈¼½ßK·Q"øµ]ü¾z¼™.Â0¿<˜÷-’Ï?éó*C \G]ægò´¼íô× `½Ry+Z”•öTç©hnÙ“wħjCËcZ’v“Á!†Ãk{8ÂNÇ¡ÏV­A³ÌМOƒx®ó²ƒ3X¿Ø£ãÝ“¢r×s¦IHø¢¾þ«UMÑVÕ"Ò„ÛÛF é 6êIõóCOFb‘N}eWJ]¿AÕ ¯9 5t–*}áS;LËgÇ;ô:*¼ºÌŒà] k;}l3–¨Ëî,—§Çq{birSH¼q6?YŠ>éúÏk¡ž¢(å .Ë«ÓÁš}Ò0b¾&HùÃs>ò¯q X«w[2ÈòÜ@àã‡àŠêx/÷“eؔߋvÊ5#’<ÔocŒÑÆÑ|›EËŠj믛” ÍÜÍ}»=9Ö“ä•Jnž_ß¡Ý1&ô³v«±¹4HmzdÎç~ˆÌ¾ØLEÃàgã"•ÕLÂÂUv»V¡pFæÌ3³úÇW`Óñ<ÙÕ7â}Q±^Ž•Q”ñÜ3%ËüÝd žû2¢ ‰5õ™;¸‘•1‰·l5 ß±SguY;=,‹9û‘X&Òuö`o¥‘Lë[¢4Û œˆæ—Q5*y1—öS¿hS† l´qÃ:¢´¸èä÷Ô…ÓnWÂâcrüt[Ê“UtJhEaÇÀµ¨ðR@RË€ºènrël_®Œ‚߈"ós†u‰1¡J†=5 õ)ÕìBëŠA„°¾³ºL ¯ê–DFŠEà aqh ½~?v0Ñ=,‚Q¿ù]’”µøuùãõ¥Z¾a*€¤œ!F¸ò:I ¦¬˜WØÄ®`å‡þ -Öòv$”šÒu,“9Ì-E'.”Œ˜2TÃKþ }²àÿC ¦˜WÍ'#Û.rñù.‘\†Ë}*þ[ö\]ô¢©zaÉ^äóinSVsüm ys7¥8N•òm\˜+Áfg%Äãdü[çç(¦Š¥0ÐfÛôu‘”jØýÃ9úõ÷y‚bÒûŸ÷0 Þ3Ð\¨Y8ag7+¼/jLaÜ•êÁËœ(¬S4¶FõöÀ˜ûe鯩ó~¡N‡ÍÃP}¨î×°ì1oÇÌàr»øÀ$jéW¢ZRCF>€Þ`ßj‰v÷YJ¿T#M1ÎkbFÜråÇ4¨J +ÍJE6à0G†k<ªÆqeOÆþ-ö¼qE¤½Fd¼÷¶jª0È syhwAÞ¼ÕdÇ“òÚ‘æõîÁŽiÖòü-¯HåhŒ‘OzS“ìß ùl¸7ëãžq  • rI(^œí]k#.îMô­\2Ò36]R[í7°“Vöd1€vQT÷Hò°¡¡ªŒ]?äp¾x ƒ…­~¨ŠØ¥[©Î7ªÑøôÆhYIºÉ5Ë]'j*|ì÷¹;þYŠqVdTÿQÙè«cù{“Lä –¬àêþÖ n–Ä}M 5žd )Çd>YkW®u9{«mþ9{|©¢¢°2·k,R@3æ%ÉïO=CøØY:dA|ÌGаU‘Z!øÞ˽qX£ÚŽŸJa ÞË:SG× ë~{`D‹Ö¤b–Uµ-†GíÖâ’ ¾¤ßK<1ds6,xkòû¦(‚Žßgš[c·jy¢»ý‹‰ R·ŒΕ }1»¾ -øµü]o[>³FìõË$…FE{’~eÃ^™ ¼Lk²Mõ»ž›žS3-PŠcb?|Sò?*ô&j:å/EëV c¶è£Í½cy¿Çeø®×/ÄÌc­i{`‡A²ÿù»8{dH¢¹é—ÁF1I‚ûât²†ÙñHÁ"΋r­eºû‡ý’wqía‰Êœše-M1L_ÓÁÓfð`ƒ‚bz¬„H8 MêÌO. À ±þ SÚ5å⯈èÄ”±gçÕÖÈÀ.‡v`ß"î$ àÐJ•œ)@4œhF7ô÷í“O{îyyÈð&v]û•8$AFq-eßæœª³¨I[\¸åÄê‚ÕÁ㧈i©™©såt˜³¯xŽË³¼ìÙsŽ|¬‘¹O¦`jE“ûˆpÆmó9'î°#JÐ…ºL#Nðš=&>°¶A^‹o«­|$E\ g†Ï¸ú(zõ[F×puÅÔfÅ?·Ê@ך@þ¾Åemo½‚»Ô[8é:7ë)ºcï{ñtæqð=L²:•|Ï:c¨-j‰gÈÇ_f’t”‘owØå.ñ‡–ë_^×#U=r2ŠóíÅí¯}hº‰ì×hÜ¡l”^GÜ)%ñ6šm±B2µó°Á1Ъm}ãü¸ÄiÐ|!ÍÃÚ¤GÌÛÌyÆþ™‚E›Ÿyò‹“P¢iñ9²½_•+µ÷ƒù¦nÏÕº”]ç„ZiÃÜžý¸±_惂šà÷šw£®£z°â8®Ï 9ͽm “g` (ý ì‰È[ÓäÅü¼o„H*7S´‹}‰õ7¦‰œ~@§«ß¥ÚDœ/+\ÇD¯Þ†fñ9?ë-Ÿ8_˜GŠïå+|þ×ÕÅ£_£æ[† ÓJD²1 5°zSt½¥¾¶]ˆ©Fಔ7窗*Bý´\|¶%g¤6u^GåÑ]NÿùÙb1†±ŽRAñì«rþ:ÙZýÎÀžÆíéz³?{þÙvJ„AŠ+oÒØ†012î÷ö9 ÛŽTu؉ާp¸÷iáC÷ö!S=ñ}ÙÒéðN¥AÃjÁž[ÂV­²áµf1ïFÙ‰‚ ü~ãìÄþKÝQQYH¤Ys*À|¶iUpÆ4º¶ó㱉¹„¼:Sdb€ª˜ƒ¹_[³Ñ#v*íœÇ%„è:Ì[¡³7-F¤T Ã…Dšž½…_‡¹»ªg¾áLS¨]ª½Ë3¥Æ¢¸ž•‡×Ê [zRƇ ›ðPLCÓTÊþí/°R ¿Ã]¼ýò'ÓbV÷N;kŸpÐ%2ž ÛH3»×f1ñ¯:8yIxQ>•€¨gÍŸGìð»è¾Ý‡•A®h¿ü`µb¬£Ò»I6zÃî{Üîò³qXf1äÎ5Œ‡ƒ[i…ô|Ŧ¹†Ê÷#•îO8¼¨‘kì ûâñÜÕñ½†Ç*Øá=Ó>w7Ç@ÙE̦_Yïó†0ãàÃ:ä'(;2 G“•Ð~#LG&,‰w~D_7p¸Ð”êBø‚[ŠÍ¤š`â2ª“†Í²ƒs_ÐÌâÃì€<¶#¼àE6r­Jk %Þ…¤êH-|¬нÓ\z?Ë~¤ÀxðöHˆÎJÈ{ FkÁ>Ô·ÅŒ6D£ lHó!±ý[Ó V1-ÔæÎ¦läÔÂÂÞMž éŽáJD”ÁKül¬—v¡ž†…K‡‘CàÌä‹›ñ1 kþºÎvi„6«z–$WŠ<™Â\Áù¬øNÉî[Y=ƒÈ¼¥*Äðåó9Ï×Ùú¢SX¦º·Ç¤ŸdËèD^gÉÇMÐÛ,*WóeAçÿ€¾(UHßžì2JŠÊ6Hï\f™ñ ý8M÷çJà!£…wµûú"KÇ&A¼KÔ*”ºŠÃg+ªŸ1œŽON-¤73{Òs ƒ*•‹Þa"XͨãÇX} ¯ &8Á:Ιà|±ØmZá™°"^Ý›ÜâØA¯Õ‹Uxóåvà]ÙÀÄöÈO„ö¸äÌÑÔ%#,a‚:åÀ­Í…žs¥é¹¥V@ÎOÌ´É…y|¼(ûI 'f5·ÊLèR\-|¯%åÜú(þÊH¿B6½ýí¤²†mÁAúª”»wÛƒW„Ð-–û¸Gÿ̓6'œÁЗNÊ }žËQ[Tç—/ÙÉ¢¨ÏQ S‡ótVeˆ¬¨ÐY§¶ ª†@èTEã¥c]‰à°¥5¡º‹<¸šÕð:#Î;¥(z«cý;ýÛYÓîí‚kÅ7N˜*sïlDC’ÕžEWÐ}2MVùqÈŽÞŠñøo¡QMËbÄÝ;Œ»Ò’ZSl0ñpzïûôO¬fŒ‘ΔýÜõï®HEé²&«~Oùëpû*& û¬ÚYP9‡µ1ƒ­·i­qÅÑþoØy>V<åÞ>¬õ¢{ñë†8ÛíÃÔsì]g)ìª×À Q·éÞ£æ@7™Ñh˜ „®oä®´’gjÈVÔ̇2' ˆÞ÷-Üoøãœ¶ê@‚MWÆÖ äZÍ®7ÒÊ ¨êäfÛ^Ð’Ó¦Ãr2DÄ* ‹æ›Ìq{M«ù…Î’xo8jÑÔ—gƒÂJÖ¯ü :ã‰ÞóÇZ¶ûµ§èkçZÇú(ŒÄ*Ìž©nº»=x,˜ÄHJSÕr:ççHrê`C_2éð¶B9ºoËl˜²Æoå[fÏ¥)· ÉÏ•JÈ»_5 Ÿ½¨¡HÉW ƒïáuaÈ|zˆ8Ы öuüsœœqâ¡ø§~œ>0}Ⱦ–‘Eêø”g®Ïb¡'±ái3â™’‹äØfáÂT]ßÃÛP%¦ç½wÙQ† †Oÿ•N}ž5À,f¬&6%òvÆR u"<ºÉRôP]j¡¤³0÷®šT™|<(úY;íÔ¤B3»zÈò×­Ûa79¥ÝÙ©˜åܬÜ5'?½ïÉ{?%Gó ïˆ4’È)ò…‹žŽ'én4%„aÎV"6S&¨‘™$FÍ!yô^¦Ø*о/ãôéf̲@ŽL+Û¤¹Ã³§é”&ûÉÖ/#û.Ú-¯1µþfà Ǜۙðó «#\ i'Œ “f+÷mgƒA ‡†k‡tv†Vïv5VF%JÅ7õÐvYÂþ>?-ðŠÒ!ÅrÓógÊ€]é¸UŸÅ ¦"ËKô rü­‚Žó®¨[/îÌø,4C²¶­X– K“Œnù&‰Ýq Äži–^:m®P3wÄÕŒF >g)~8ˆ£yA2Þ ÷·«ðFTˆtŽ8½†Ž¿òν)°l[þòv¹+ÕbàÈíÂ.¹ªK;Ðf~Ûà:HEXпÞGÖ¤røH;¹ª,AUön£2ónÊÀå‚ß±cTlËÌ·¨]ƒ¸ô- §æò·aÔ6ŽÜw2û2£Vgý=ɰìr˜½˜ëÅáZToñÔvˆ)ÿãïd ÖCêÙ~[å’Nmƒwé™xßQú*CÎ &ë&ËÒT‰Ç÷™¤œp.¼4è·çkêš×ÚyV°‹„½ŽÀ·••ú"Gb½ô=L6B8¶ú¡¯F4À`§™ì÷tíÝç¾wSÐ]ÐS<ö<6]Óµ±•Y|Q¹uÑð‰s˫٣ †Ê‹äØþhõTSÓ•q¨TJOcØ+#-ˆOÑÌ%0"(–ê׆蚙oG]­l;”&[­qµëO Þ{¦<Àz,’Sß ûgdø>Ô%þx+Šà‹Bè䙌éåÅ>Rœ«x0Âü °CL½Ö6âu–èô¶Êt b‚âþ<{σ‡ˆšÁ§ŒÞb¸¹3Ng4?œÜðQºÛ­ÐP¡N'ÂßɬYcœÉK̽)‹r*‘Ù´Ú§D¥²n•ß}‚•£›ƒÍè®kÆ…¹¤³9=d™óÐ ©M»"Må¡óÖãTöÂÀ"¢Lˆ½Üïj‡kàÌó&6^ûaÓú²ÄuÎ!ƒÞˆpÚLY–MÒY¬¹ñaj]H–F$–¿¬ùÐ(ˆ€ó<­wÊË$ã’³–••2’£>¹š»˜ [짪ú;Þƒ ŠP¸Cÿ$´ZSy{Ë2¼Ì„ßyךXû‘@ɹ)5Å@“§Þ&›@—ü±/–Æ—>ǵGླྀÅyp›ê„€µÎ@ç(¦ýKÜ)ëæ ˜Í8°ÚÈ  mÿè×I1•#5¤g슞ºzFø uAz-˜kÇ#[zçhÀ•Ñ1ˆÅrÍÍFøèp1.å®<ÃîçbLó„$ó=™¬§ˆXB'æµî»BôhDîä!%ZÌüh˪÷s©AóPù²ßq|zJý(l¯‡Í"Ñ·VX«ºc€}5RÅßãæAµO†½GMO^E^¬Lò+³-¡ ›6ÆŠœ eO,e 2ßrGoÿ9Meýï”ìª?('%µ×,ÑÓ$Ú8Ï…Oú¾‘é a úcÄWZÐù°6Ü E.ûqOužîhÎJâRÓ˜ˆ1Ã51³w?íÏÆ~éuúÍUlæÔ/“iaØ'Kð&k.õJÇw/ÒÀ¬Ž"åCúdçwãûE¡Æ”JƒI1 -ÉqÛV9ˆè¥%ØŒÈ3-£·E*ï´AÙÖ‚ü¬{ÿsf&-XŠ•˦ÍX·U7Æ$ê¼VB¿ïD¶þÎÏx§‘ì°«r¥£?Ç»=3 —Ùa±ÅÑ“QUöN¥^5 endstream endobj 82 0 obj << /Length1 1405 /Length2 6269 /Length3 0 /Length 7235 /Filter /FlateDecode >> stream xÚx8›}Û¾¢¨šUÔµ±Wí½÷ªšI"Abï=jïUJíQÔ¨­vQ»vQ«ö(жè—öéó¾ïóþÿÇñ}GŽ#¹×u^ë¾ÎóNް0êèsË‚6%ÅÍÇÈkê›ò@ ÈÏÂbEÁ ÛñYŒ ®H(.þyWˆ5 mS°F¡š8@Í àð ‹ó‰ˆ~ Pìo ÂU `í4yj8‰Ï"pör…ÚÙ£Ðuþ¾°ƒ8|bb"~‡d ®P5 i²‡8¡+‚¬a} Ayý#ûc{ÊYœ—×ÃÃÇÚ Éƒpµ“âxð€¢ìz$ÄÕü eíù3> ÀÀŠüË¡°EyX»Bh ‚À‘è78â @Wè«j´!ð¿ÀþÜß¿Òý‰þ• ÿl !œœ­á^P¸À ƒ´•4xPž¨Gk8øÐ†D ã­Ý­¡0k4àwëÖ%Y]€5zÂ?ó!A®Pg’ …ýš‘÷WômV„ƒåNN8 ‰ÿ«?¨+„¾ï^¼–ëGxÀ}þ>ÙBá`Û_c€Ýœy áP7ˆªÂ Ú„ÿo›Š ñ .ˆ'Èž÷W/gÈoço3z?g„3À=Äj Aàû ­Ý!”«ÄÏç?ÿ<áóñÀP `±ƒÂñÿm†ØþuFïßê 0¢éÇþzýëÊÍ00óú7ü÷Šy5uLU¸þŒü/§œÂàÃÍ/àøøø„""B¿æÑ±†þéã?bUá¶€Ø_í¢ïÓß-»ÿáûpþ™K f.Àþo¢? Aè7¾ÿ3݇üÿXþ+ËÿJôÿîHÉ ûígÿ ðÿø­ 0¯?4sÝPhh"ÐZ€ÿ7Ôò—t5!`¨›Ó{UQÖh5ÈÂíÐŒææä þe‡"• ž°²ÿ‹5Ù é …CtHè¯' : ü/Zd GôS‰¦æo­¡ÖU„ƒà_bãX»ºZ{á£w> |øÐªC<“ÀËG Ð!ôŒ~[„+þ¯Åò¼0tˆ‹zh×o+?€×Õü{/¿Œÿ¨ rsuE ð79Ð ý}þ­vÄŸŸA€$B^‡¶]ÖÈÒxpoŽà¬¬vD%˜öE ¡Xg_øØkàf)OºÈY« §ëÌ•…OÌøÒp^Žz>íÊ ZNSÉCa(ö­Ësç~;í²ƒÐƒÔvc"éQë¤G‰ºtÄVfØflÉÆ3Wa"Ý[¯>^w ·žˆíœÅç$Œi4¨XÙÜŽ=Ìg¦ŒÌ«¨!Ó§$q÷\Í2Ü T Ç®1ŸAã.äÚb¨¾y­›Åe--½ËéïK8)Pï©® '£ºï­Æ˜;œ4@Ež˜£ö‰Á*'t._–šÀDUäκŒe%²ücª ¿5q@À­ÁNK>è®¶ÿûF·:„ÐŒdn÷ò ­åF¶Á7^ÂMIQöjÒ™åXªÁçCGÕ°¼l zN]ÇâOÍ)DIé…©æBc ®ˆ€Åçñ—V±Y‰|üæ©’0ÑO/å„u`ôÎÃ¶Æ WSdÔ,d:ªXZŒ«nÃñ|}Ù­0aH†Ÿm7½kêŽ8F0Ò‘O%˜´gíõî&¾Q:ÿ@jÄ©(ŒªUŸEtZrÄçÆOèååbë´v(K<‘›gŠ7 Î7 5ÐØÂÈкc*&8EBDæxXF÷j¡Røý Éà&ÉTÑ@ ÿâøñ-Ýýx’Úõ»ºÝßn[$ظóòãY¨çu<±·*ÑbSC &@÷®¶åL'ƒŽEf–óän ,ÉJýŸæÙÆþˆûºuÖp”g"[ù•Ò9°nùò=]û“þ8ÚŒ·ãû=íl©[ž* ßϱÉl†”ŘB‹`ñB-òKýäQ†fýÖmgMx®ÝïmϾð™]Hn9[l7h9ÿ(w‘SÜ#f› X¯Ò dóÁ&ˆ4 P ü*zÐz¼!˜΃aoÛˆ¿“V_ (Ø3c~ÖMZ÷]Ùùø¼‡v‰¬¥––WmÀtU¬$úÃ]Gàã'^máw^²ˆÎÚCÿ½-sc…`ÍfœHSÁ•’Óð&ÒÓøé÷&:ŠÇ×üë–üÍw«šË*©>ø|”ž“T÷wÙ:Ûܨ|[„—çßµèô²SNŠ2›ã§0Ï~°¦¬gÀ”~R< Ð ÅÔ³ç{E¯”kó¥¸jÌ+F(i(.ZìfÇ ¥u·F„pÙŽ=ÈÑÜ;`¨ó»€IÓ‚8—#™«,ô*?›—;…o|€–„ª—kNÆ1ªÞy=õúÇÖƒ¯z¤7–¨)c‰ÌÎ÷_2ÜdØ–£8ß—MÝ5|‘ãã»þõ«®ŸµÀ¦R) +µãTÔ»’·p•¤b,[Ú]µ&QǸ`´<~C(ß2t?ÄQ—¾èÞ’»Ÿ$Ý]— ‘’S+9üQêQhÿzIEÇS¦Šo©Y”z·ÝõäS犰stìñ©ˆ¦d,åP ç·;Þ£ˆµ±…mɪ^êX`–×ezÌg‘ƒUU¼ÙA!ž?裃öõ‡ uTël}ÔGËFÔa‡#¦Õmù¼ûî]ñcfùÍ?æè›4X´óeö2UB“ï=^Öa‹S{9¼àž8ý¨Ÿ¹žÉÞ°DSú¬nOz5Ù™s&TÄh–RrQ‡é·®Lœ,S¨•$dq,e°Y'jÛ öÒ-ŽiÖæ­'¬ŠL}žd! »ªLPø=IÏû%Ùé©íŽOĸ©‚ýdzÇ>™™kr©Ã»3~ßßöÏç"ùmÙäO½–×j,^M½’1Ñ‹&שE\ØB¨>ßR¼tÔ–¤<¸©™1$•~„=ZÒA(>[¦üìˆù!““HÏËlgÿâû›Ñ¹í©§ˆÖ`‹Yæ7¬1›§'椢°Ôø7ÈfÖÐÐ.Þ„µ5 Ž,FƒÍÞ@kÂSÌÕÊÃùñºUŠ v}¦|‰øíÔ+7 ý(|Y¡“La9IÒÅwøb¦Á:^Uf|íXSØÄE™9/Îw€ŸOäDÿ LÞT×3Ú,(Ñ­ë2õ¨3|pq½~êÓ´O9¡VY0Æ‘= ò[ùÎq.£yvU«"xc³Òhact ¤Óº,Ëül[zúæÁ‰ *–œaO"œøS;Ò½Û²Goç}X‚>ÀKç€Q×ùâNWÍE³«ðE[—DQÝ“´íÎþ ÷9z1G/Ò8Š•$/g j…ÁÙu@²Õ_θø±^¨yåR¶·²¼4K°/d©Èƒq»6mD8v¸HOg›ùó›fñŸí8ÛãÎmÙ*{6;i¸› ÞñcðÒôX¾ÄùEÌwÒÄÌ}¤$p«~rEÝ[ A$:ööl>4|Ú0†¸?Y­¡Rô¡EýãÙic.GÆW\—\®ÙE©WjßHkQ^ö-|2KÍ÷1×VÜ2u¸À{F8×4lg9cµãçe(ýÒÁBb°ôR­ 96{ˆiHXï…£–qƒéÛ¥¹ÇÛr~ui;Žu‹=¸+zì Ócüs,$@LÙ«ë}§ÐVŒ˜Q☯SbêÝ~™ •îf yUh¾×s2ßäøw†{G\þ …yô½)Š  ¸¯ç±’4û÷fy«Îé(öPsaXW*¬ðyùúw­Ã-&ea?‚â}ÂCܼ\ó¾|YÊ„·1)\¾[5ìÍFÓ_V¢•K+a"Áê¶4Æ÷½—]ó,$(3ù°• ‡›hŠÙ;ô¤Ö†Qyó~¬kœ÷žÔèyêÛ¥p‹¾_›øÛ*PñÀ¹1šú‰þ÷¦SÙÕˆJ¼Èºw«TsM²)Í]í(XGí¨Êu¾†A'rT³€.L'гþR_l[Üáá¸ñ€þR…C¯4Ê;ÞsÌ ¤›» ª¯è1’†vÞ»å}º%ÚßçÛY$þéàeÔÓ`ä4ð9}•Ê¥ä½üUâiâÑÜÛ–¬[bÞ·[7 "å—x{Qþ-‰}á·Ktœéb1ý®cÓªÏòÕ†êçdžù-Úa) ¢ô¦,W~E·Êàõ&~ϺÌXw‡Å;têÚëæ9“Bê‚n”ª°·ã%öÔè>³ä‡…t! ?'9;W+qV”~­]Îp?rÕžÂEàw I'±lÅB8«iöMÄ¿vlI ´e‰sŽ,kÐÙbŽÄ’÷ˆ%±Z'9HpÑù·#îpŒ/È&ÙõÔ¨swc.5²yÏ?9}/K·Àq~x>v·nÚ -…´'3aQct…HmïèdÇBZzmV|,Ž|üüc7ã—ûˆß}³1Òâ|2 ݳ0ŒÞuÑ ò»¸šô•ü“…þ=Ó-¤í«Óƒ³ÌûRBç·±™Ì‰OÇeç,ø¨æQ—¤¯C¿©ü`°Hö×i‚¤£´ê†ô9Z’ž^¥RšÁæa`AJ/gµ%“‡‰ÖB`OMÕI¤ø²1ãä|r¨¨—©©]K úiy¼+; P²¦K¾Ó)GotæÏ|,¦XÐB‘à ‰ÿÌ\P±ýÜÇãvµ%±ÀE‘Ò¡ÝTgàs¹Ìíì}ÙÒŠ{«í.¯Çއ‰VÞ.O6àFÓG&Œò½Ò±}ðáNåé£ý¾<á³õ¶Û´/\ KÌ—ºÜ­>´5Ôþˆ¥<ë ð¼Pfþ™GZ´;Æã—ßžâþ#L”V}Qo$Œÿ5I“£¬ªy¥æ%q@£~Á矦ióðêàXœÌøiÖRN‹8ºD¶+ ñÚƒ+Ö7ƒ¾WFû Ó/:è'¨jîýÜ/çJU6>Î÷÷bsÚG>Î4Ü sf´ìÀ,Ñm[øºÁV¬•­\´z;Cг¯tä­ƒyý=ø©€‰”Z¾·ô¼ÂA ¤ÖeØ­v8!]¬ ¥)»Ó¼(çö³ŽÁÇR/KÄZô%ÆG@ài”Êz7a¼‚ÇZó¥ya A;Mùø…bùPQÏ3 yªÕLRfr£Õ-{jTι·#³£#³¹à^59ö1ȶ)ÿ{5I«<¶qšÌÉðéççéÎ 0ÝêɺŸ3£°mVKÉyOo5œ¾ 5HvéPšŶ¼™–%Mê„ï‘é~ÀýYà¤çÃê-ñxº3'ÈédÝ *ò~Œ¢~/çå6NŠk“@ƒ[ðÔcšéÇ^<é2~'*ŽÜá1Û³æêƒÔÕµ‚K¯‡ìëÕV, >å4$%Œmºô9¼@VäŠgó™í–\Wå´ë³#Å•#3ÔÄ‚¶:m¬îKæï̯%ïS žÍ‘ÞË€8HÌʩӈv§i§1X85ýTh{¨3wŠr%äÁ/W3nº:·SÕðÝw¸ÎS"¥&錅!éP©ÊlkòOÓZœ9°«8Îqnr,²H 8j§Ù›¿g5ÜÕÔlÁo¨ %téwgm¬º_ÙÐÂhÔx‚¬ó0ÐqóI¤@¶µŒÕ\êä>ãâ~^U–oø,½Vé«á¥S«úhx8WEÛ¤iD„LXÁžzŽÓÐdiÔKØ9âŠuÝc7UåNˆY½úz(a5M¾õYvOE¼þÕ‹US:¾ä†µV•Ÿ&= Ó‰,*¢Gø/˜•J?¤©(ÌŸQK;ŸàzM¤7ß×YfQ’l îè—‹À9Ÿ?ÏWVŸÓ±¯óת7kÂV²Ü ”Ç;6 ð^ž´½³uçñTZJÌUÐ-+Aô·²"ߌ[Ûõ곕ŸÞâ`Ü…€§¥¤kZü޶Ö§75ç$»õ'î«»gê‹Æ>9šSËÒ³ñ±eš'æßÄ©$3$„‘dÜ6Y“¸*Çt'ªÄ„,žGgUUB:Ñ 0Às÷ ’bëÜÐ|ãUH’ä„IôÍÝë$¡ú·Ñ®š()/ÉêpÎõ y¬ ÂvT¬km>Œ­ñ²¯8õêôÖÓ³‹¹¼AZ ̽|dVŠóÜMÙ[BÝNpát"–^âÓNÄ÷ú©iÝîíÃÇW_åýë¤;ÕBZy“”˜„ yj€R[8˜g\Õu§BTLCS’{A_;Ë!ž5óÕÙrÆ÷WÂÚK<~ÏrQ{ÃB¤ÇFkÃeu\•¤Eo*«Þ^щD×"ƒ³^Í”õ{mmõ&ãäÅÈ ])»Ú­âô’½gŽHaõ­‰oèŒÆóO]R.ߘÍMß%̯ÆÑtß\aw D•„¬¯¿ŒÀ¿d›š÷éb¾7~¦=—HéDÄó2®êøŽžYåxBë±ÃÃÏx7lÁ[½m|UdsDo%üˆÃžj<Ͱ‹ÏAâk¥ÏÃÂ×Éžd Ò«GÚE`—õmv—m“ÉÄäT¦¦Ù¬Ï™XúÕ}­tÕý>¼[?qSÏIŽ"ò;e ¼î㹞)iݲ¡v—q(vrI G²ÂÄÎLšu¤ÆávgwT•¶Ä¥»Q)s 8ú†Ú£ ~"~y'³¢OÚ"RAŽÆß‹ ÊÚ1‡MªÙB^ÒSä“w?6,y=«µ(ª;,"g‰H"¤2ÒPI›@±™¤‚ÉŸEjµ6pð2Á1¢>}æ'1NÍÏy#¨îö!Ém#/S»S=3Å Ç1M;¿að@8“íd2f*öê<Q’F<ëuÐ![;©bÊî²K–‹~3Ú7¯sw&!g¡¯]–,ð­“Sî®@]ˆ¼‹ùÍŠj?ÑîÏé`~¥ûƒ~B^ã¬à4±‰Â3ÃãΧŽbº0¥¦åìÛ¬„þL¡ŠÉR#á¾VØÄ}î?X.ª Ì@38æGÁÌh&åtCj‡Ø• œP¯èc”»ç´¸X7‘Â퉗åý×`¦äò—6\[]Úáæs°jÏOlÂ'ëÂ&¯åI:Ôéµq©º"l³Ùíd<Ìm‹2‡»Ívü÷bø”¾íÐ[Ë ¸WÞXÓÎvŸ¬¦mä¿åN€ïý}Ó iùû0p~é¾ÍÃóì[fÙÞ^cIÓÌØ¾ÊEÇi¡t°žì¾{_˜ŒO‚äm/c©ÎãÈ ©ï‰Õ[^2Ÿû~6®~Çûý—BŠÄÈ'íø±—œHŒ‘Õ3¾åø¶LYć£Töb»ÛÆîSŒîÌÏLln‡C¾äŒR‹?€õ±”=m/-¦_¥<à˜Îäöy£ß\£=óŸD¯´»žØóÝöC¤nÞ™‡œÝxâZÛµþukn6Ól9,ÛæøÜ[¢¹6CÕkú©âìí®áÝ(g×RGM‚7282ÝÖ·/R3`=CQ(ý‹Ï½,tAÛ¼Îz—ËóoË™ð7¸ág(B’„.¹zçk%ONبñî×6—|Íø´e©ûšúì¸Fv/Ï¡ï@EíëN…A²¸æÏÂC¦îýTë~~tèÖÕú…â.î£uˆÿ$©¤&%‚Œã>whÀèS¡ø$µá<ÿD“Ô _äì»d&âN]ã–!Ú×_'9µ½´ð€šN@)¦¬W+çæÆÈâ÷w%÷D>Ȭ?¿|w¼ûHV>¤º¢Ê›#}õ>:s•ÐÜÉS¯Å{#?ÝŠI„¢üx­¦,ôôƒÐÙˆá¥ëS±~Ë©ÄÛ nºv|ªP+¡W L¼t†©Uõ´SÚBí0gÛ¦l°uŒá-›¸ú¤•‡3hÌ€,-žñã¢åO‚s• ššËèæØ¥èðÄÓ:Ÿ´>Š¿•N§'(Dʧ„å]‘¡ŠŽ•Ä<ÝÜ7ó6P©9O´ Kè_„F'ƒ[ÀJÓ >3SEÆ]ßc2{z5]w<96ê§Ï±êFî³¼îÞx-°]­Æ+lGùšË û$ªüíaÉ%F[øP¬+|…x]c?Y;³K+!E¦AÑ{KÅ•¹ ÌîÛrÑÕÀ‰ãùUêÀ"ÀŽÌna­˜¹©ˆñ™r50«á “¿ ”D…?.€Y?#«Ä>ØL¯³© rºãÛ ÃökûˆpU Â’™˜Ð–}溡 ßM˜«?ÆÕl53JzÜÖKPm9.£z’Ó‹]Ì&å˜Çð9¾ÑnÒÒö†´¾—(&z3=–<Ì®¦¼=l©™»–ÌzB(­lœêµÐ:²¯¤ï¥4±’÷9 ·þü=á[s=ŸèÖ=Ĺ[±4Y’†Æľé"‰/îž+ÿŒ«ÑyŽP³*B<éÝ\«‹{á§~Þ 5/´ KqÓ&²ýUºº8ì]p÷+Œãœ–”Ú==$1¹R¿[E¬gâÏCC€ËÅkH1ëúe—ufóC'¿`÷.KbUø—¥fL«¬li±,5Ô”%¢q^Áô»½ÂRjST³£¯BT˳â“6ÀÓ>ðªïÌa„—. OÇÚ ­{ ™ˆ^ÊÝRŠ¢Þ"çÂúÖ’4ênEyÙQýº]:öÁÍÍ弓!¬F_ð)?žÿRžˆ%]›@JZv””²XÜC$çS—‚bq[éÙí†Â¥èhéWvÿª¾ú¯ endstream endobj 83 0 obj << /Length1 1541 /Length2 9089 /Length3 0 /Length 10111 /Filter /FlateDecode >> stream xÚt4ÜÝö¶Þ{ïF'Ä0z'z½F F™Á ¢‹– :DôDï%ºh=zA¢÷ú—¼ïýß÷Þï[ëûÖ¬õ›óìýì}ö>çÙ‡ƒEGÿ¡‚Ü¢‡! ò Hµ ÔBü <(Òò/;‡Ä…Ã$ÿÁPô€€‘÷6%0òž¨‡{º…‚¢’‚b’€€Ä¿ˆpI€Ø jÐâ<†Ã <E¸›ÔÁy¿Ï¿–n[€ „„ߟp€‚+Äj †´ÀHGˆëý޶`€>Ü AúüG niG$ÒMôööæ»"øá²<|o(Ò A@<¼ v€ß-ž€]!·ÆÇ0p„"þrèÃí‘Þ`àÞ൅À÷!ž0;ˆà~w€¾º&@Û û‹¬ùð÷áùÿ7ÝßÑ¿Aa‚Á¶¶pW70Ì sØC] mM~ä3$ ³ûM» à÷ñ`/0ÔlsOøS: ¢  ßwøw[¨Á€ºüîø;Íý1+Ãìá®®÷»>%¨ÄöþÜ}€_®3 î óû²‡Âìì·açé4„AÝ=!êJsîMxÿ¶9@q8â€<³uþÞÀÀÇ òÇ)øÛ|ßC€ŸÜ `ß$j¹ÿÃóC€½ ¤‡'$ÀÿDx‚‚;¨-`q€ÂðþýÞ ±ÿ ßß¿ôà©À½ü¿ÿ»²¸W˜æâóoúŸ+šê˜¨ê?âý»åÿu>zð{($x ‚„b÷‹€ÿÌ£†þ]Ç?bÕaöp€Ä_åÞŸÓ¿Jöú[Üà?s=ß+àþ·ÐÍDlï?‚ÿßrÿòSùï,ÿO¡ÿwE*ž..üÜþ?Øêâó7ã^¹žÈû)ЂßÏì¿©Æ¿FW bõtýo¯:|? 0‡{E?æþËE¨@ŸAìt H[Ç¿Tó—Ýð÷¼¹@a8úû…¹ø/ßýÙ:ß¿"ˆ{iþqAîgè?÷U†ÙÂí~HDöðûàÝßõ=ø ÞO¥äÙ1€ü08ò>pßcÀî÷ûb%$@Ûߦ?èw@»@Aò(:üŠ€.ÿ€÷©\ÿ 籠ýÞ§‚ÿ €ÿ€" âPDþ‚îc}þÀÿèÝÖÓÃãþ!ø#Òûƒùþóê@ Ï ¶xsÓp[©0§ê°Öó ôÞ7FA„}‡QÇ8ÆëÊ´^›º!ŠÒGByѳ “ߣ/VÈv@Åw Î&TΖËþiÑ’Tsµ­˜ö6k|þŸÉd.wšž ïfÖB0;ª½F½ïcù j>÷ƒ©·[ªÒœgåŽ{Ø\õ?ù ÐFc¢±iÄÅ…ÐÂÚÞ¶U<ªR˜˜lWgGÊþJbTÙºHë‰|ëûZʇ ]M£ßÞ&tÓ8~»-ûæG—(†õgÀÇz—2ÍU)©¨#üÁ™l}³å¸b‚PU`­YãØ$NèIewÜm‘¾«‹5#«pdËNa£OÃ6‹ÊA`h*¢29dN6ëéÝåÎhÙXw¾NÈ¿yž¦ZRit‡yXL?«‘`CÍ„R;$|îe¿ÈZïÁ'ìï8µ+ùl´jQQ_’gZ,»ÿ èU¢ðhÚ£µ¤½®Czþ&ùdåõ€k[ªÒƒöþÒÖ·dß||ÌsÅÚ(ùÊ$~>¬ñ™º ÞÇÀƒñBh6ßtjszJ½¨¨ˆd¬œ~0‰¨á5—4–÷ÈâW{ï'/ª÷Õ¯–wf{>ÞÉXQ‹®¯ÆPæÏ…_°b‹lJ1Qu4I9Í®=½å=Ÿm‚g²Do–ñø$ò[J“ãŒogÝMZ:çT’*ŠÈìºG™QçŽ3¤¬ûP‘™pñZ£aòNéyùaùû=!êAÊK;YÓùÑØ‰­—ºÕX£)@£)»šÕ TœÅ.ÞÛG› h”•Æ´œ¡ê{! ê'n™ 'E䎚JÝ|ƘºÒžZç 5t.6M«rnÄ y¤ÙK¬ Š4wfë=o0Žm}%äö,k'|®«¸¥Þ瀪~m?œ=+§îµ 9y>²íQ^Ä©›2#ð´=c\AËâý”Éw¹úgLÑЦó´ïû0CÙË½ç¹ Ÿo¸Ç; ähCÓFø)Á‚šüµÞõÃPpDø’ZyÙíÖ›bÌCk:jì ûE<ƒ¤jeÕˆ «Ô uOeŠP¸œ ½þ„HÚG„DiB\-KðñgUSîöéœï€½¬#ÍõÎÞsŠ6ñ$GÉ'F(î[¥ [†âÎ üç».¿*»ˆý]üIIJj€eç éR\iÜ  iÜUØÙDÕä9ž‹yâõlðŠd^Êê«·\þ'!>á”Ó"¨µ!¥¢dfé•räØHµÐ×T¢‚Â\†”ó\‘ssI°W¹lÜ;!êµ[=/m8peo¬ÃcGê±TSúøË•Ç ºí/>ü‚8k(\ÜW\››(æÅÛdZmHI†¸çË}}?Tx]C¶=’…¦©ªKP ‘&ôžzèšÌÙ˜Ó$;!CŽ&…Q70b‡u\I2{#!.ë·OËm$>5.]<Ñ+ñkÁáР[Ùëç_kýi#Þc›¦èŧCéùKƒƒ¯½/Cl¤g¶™ôØ2DÃT}Þ·©8knÝþbµ±I…ÒÁU’¦õVå}²) U’6‰#>ù¬6zÖî59rˆ/k’*qHCß;ɹʊ´ðj7:tÏiꊇ8¯˜%Ú0.‚ö›\Õœ"ÜoZʬt@Tþ‹`ñŸƒ/‡†«uVO…á…V;›/H~2|“‘Ù ¥ŒÁ=J+ðʘLxqCrT6¸P}¹a_wHR¾ûáäuG¨›ùØH4v5?M޼áìäRµ6˜±ßvhéJꌵwšïvŽzž¶¼äeFïV¬4Sä# ÎJ½»Ÿ|iÄ PY°3‘ÂiJøµëÝÿ}o”£¬UlÛ´ÌÝe8°±a Òà¥Ìȹ/•ÙÛ“ê†Ä†‘|´ÆÄ`Ńý Ð$ž£"¸¼c6ñqÞ[>0&ÏMW¼} ¯?¸ŠZe$JI&vÙÑòÔrBÈ/)CygkÃÏÚnó2^âßÜ…m·³T;ÔsÙw˹×x·D"gÞjäšM]!ÏN81ÇѲù¤ÙPnx¾™¾áó}sÑëý¹#û{a%‡ KJ>Jvý‡šcV7ϱk@²ë1XÏC°xyÍãúú¹¼â n|ËÌBdýꞥ@aDôˆ’lÏoªƒØáQÍëÔrÑÙž’ý9ËʲŒtb‰î úšäõAwîÓ¨îÀbUÒ„“SPÚ§$ç2|†5à>M Ö4ñÑi¼•…! SvýÇßmæ$ƒ=>v£’q R§‘Ýy³åºã¸;Æ» r‘oíË EȰ©!]÷áŠ_si_TmGOWwýò3qý‹ôš/Ðn4QIðP÷YPx)*8þ`ï#æÉñ‘ßQ‡o ç}(ˆŒÌÑÿ¤=@ à%'šœ½Ü2…¶Ö”`äŒqñ²YËCEô¯è6o³âðÛÿR\#ËÉéË ŽMùöä‘ñ¥Q›þ%ÔP!fÏ(we"‘}@) ‘ õDõäúG&DÆ^ÓŸ¸Àû‹gNi©l}ÚPÚ°µ î•H¶N¿+¶lOªÑZËhÉQòÍ!z1‹oë·…y?nµ·GnHÊ*À‚Ü. €Ósœ&w±“ƒ‹9ó±|ò¡áRÞeø·g%“´Y»J}Z'ŠV¨Æ¶}!Sg8è‹Î‰¶2¾ýû'àõ 5ë)kvê×§Â=¤—ÄxcÑ+djsª–o\Hã;ã›ñO×›£ž "lzѱi$®Ÿ|D©åœ¬ øÚÀ–ùgoZì2BfóÐÿ²N±Àô6xrȘª“Å[!õ'½óÀ —–´¼þxHXLE›³Ž¸=mY“¬\Ù£òðaÀ† (XX·ºÙ¡ÑaN(»ÌÞ:9753û«JSÿ ¡H—ŠÌOd ÛŒ8*Äpv$iÒ¡*ËêIÅ´.Z#ùÉ‚$]NqfæÛ¤ysC…ëŽXL;iy+êOµ‹ûx«FaRZÙK£"¾È[4-×½×uо۶Ç/gf«,v¼¡®tk圮Új5Œg;Ë&ª©—Ћ V•UVWÛ¦û(À|е}µ1ûÈ$‹ +2ÖðUÔi‘x^ åÏ_È@=ØÃßk÷cµ›žFÔL‘WLœ~Aq¸y!½/¿RÒî³ì@oŸ*‚¡Yƈ¯P…wî—½ùvZ(íÓðlÇnãÚ áE÷³„à‰Sã–Ýjì9×¢-ÖŒÿ‹)b“w3­i#Ûí3!¯ÛeäTÖVX2fÅðôn P,W.o±w[¯ ººšb;{äs-‡nó(9Ÿ ˆ§ÛÏÕº^)plýlF¾¶%ý(g¢²úÁ þ3­ÛåÁDöh_ÌŽüG$“øELåµ: ôTÛõõ`¹:|"R4Pœh°É’‹¥ðÑýñ Få×u>Ø}lk^Î/ÚRÿÍõ¾o”'ÆÝêT&$bc†må'V1õö¸¬Ñ”ß{ªõåªíiöÙÝa~´%Â!ÝðæÝC£ fkÞ-¸¼‹ E5@È—½{ìkBtUº²ÁåÒß;š4Ë‘9LÓ—ì² Ø$! ;çÂ}õP¡Û ©á>'¡˜†Ú¸f=Ùªr™®èãï5ûwï6g°\t\+Ÿ“ÖcíÍ—ºÉÃø|‚º„§©FE¨Ÿ${Ÿ=É¨Ë¤Þ Õ0ƒØ.ñpbÑ=‘ÞÜõ׳€4±½äÕµkÃ?f¾ɶô} ?çSY‚ùXØ«YÝXJ=!òQ3LÄ.²±ò0MÝ!±öøK†‚K:YÆ2 Þ‘ÏÞ%Ó2úmø(/(ÚøGn§)Ç'ihI“ªZK#wþ˜”œ¿žy§±£/xØöfý1X¢ÎwѸ‘7”"÷× ƒ]I hJ;‘M[ÂO•zâv®ù ‰?ûZ¸½o(Jf-ˆ}Í/×5œ8^9 \pYxê²Èùv“‚Ž,R/0ÎØûKÞqâÙÌ¢OœW]ÄÛÔBÍ‹|¡ºMʵÿ óqèÊ«'´40Éšö…3"Æ,bõœÈø™eþ4ƒójrŒ,ÊÜ|8¼ãl©ñ %õ (sG|é,æÓýöA¥RN¯]Õü³ã|ºB·ñN·ÀçzÇ&ôÙg{CjÍø8cRݳ|yâÃ…‡¢ù­¹¦f^uªš¾ä>‹±=­wßnƒ«Â“áÖ`ÍÕãµ&ô³)ÓqÍyíƒÂü3ŸÇïu“x:uPÑA(ìÒ&ý­Ž\ЏÚL0>Ó½Ýe¾«¡R€=ÅìLˆìå;§8þÃÜ™vR1_–á9>Ý«±tjÚúÊðìÕ„¬\HµúûDípa8ÁÒñ7íÇÅûgù§5·›1©“Jè‘’ýâLÎM· ¹4i»|—º…¦›¸êMW[a5”·0·sz´šÙàR}ú ­ß'5è®"a;Àv^Xfk›JÛ<Ön§ÙŸo#Ð÷z¨ƒ4:}ɱ×lf¿Z/”âqQ?@öÁ¤j)¾JÜ횟”"ÄEÝÖÄ@Ê÷vö…hîtç·\e×Ô#-F ¿žêÚ݈B¤º4 ¥¿7 ”fÌè§!•Z…]2¨ ”E_{ÅrA™ÛO@ˆ¯5¢p’6)Uy6Û@ds·&DØž ÍǽDððX’/`œBOK^/E¿¤Ôë=pÑô¾î«ègˆKhüÁì Ì<^-ìüØk¢‡ÎûÙ_ÝÞ&Ì/Çq”@9çeˆ…HèS_†¿¸S¥b6uë£)T£AÖOB Ì&úS’+—X×Ê]ÏÇcgèDD)â+†µ¼;<âÑœRVúJÒµðeN_N‡Ô¶‰Ä-5OÇ6Î]_#Æ{Oz;™£Oë‘erŠ…5:ö*ÔE§éC¸ üà_¯¹Yf—Q•l>žà0 g`)—<£›sâøÕ8nú«·kOÃø&Qð0#féõfÐÔ)ßžÍ/$rxá-Ý­ @Áh«ä›"@©ô4´Š¶-îé.§eãàÁVûx$õ^r{OÑU-¶¾NH©å}.}—kÒÑ÷椒_Ï×*Úç4–ã(ëï‚He‰Ô&¶UÚm{¾>Q¢TÜ_šFƒ2o!’Æ÷×ÂêShª_¢Uš‘‰+ˆ&'k˜i9Ò¿vU>Su3y7™}º–m%ÕB·îÉH DZqvà·VW˜¯…¤fgʾ½k§ÉHºµ/õ¦·±õ·¾»fHTAlªžÕ+}Ìô[÷ýœMÕ*í7E/¹$B=·µ¤s{ÕÆ¼}ú­ŽÒé Á‰µÍ77Æ;Œ>§¨Ð!ãïzÔW²Ç·ÊÙD6áöDƒæ<~Ö-uö”¨½‹A§Ï¹]0Þa‡¿‹D†>¢Ü•«ÙîÔñE:§ûÚ¹åò2žB+­ˆi^C¤~C‚^IY4¦¨ ZŒ[ ®RçÑ>D«­‘3gßÈŽéo|ï5¸fD¿|ž *>švQè©"¯éOI_Ùš6úF6ßf¾+óª˜H<5"{¯nKýùN¢Å­`6úÒíN7ã&Ò˜k™Ñ½–÷pß(× ÃQ¶3¿ ÂÙ_tk]6¹XZ߃¿H¥= òTòM¥åñ¢RHÿ•­Ì³Å€^›®‡ºB:¥tÚ‹Æ’õ#>Ì_LŸ‘ÿ1ª/‰ÉÝIž×¥«xù0ÿ©ÊkîW‡Šêa{Wö¸`ìýÆ»¯É-ÌÔÜ«|¬f*Šp霃ê8‘„ÌÆdTRxÕãò%8l3ö40èf<8©j½‡oµ÷]~:‰ ýrCÅÆƒP“äûúÑ%Û¾L=oiÉ3ëIBfðþc>ÍnýåÀr\µ…Äçâ&ùväD…”U ÌâŸ:ügÚslïv¸ÄCèÂ"– œC¸µœ3% ¨$ÆzcKʨC¤-W3²T,ë:!”ƒõÖº¯´ÁJI:#®[ä˜R¾Ę´u '%"óзŒ²ÖĤT.Y8B†èrN\šžÿ‡ä8G#'²ò\[U§ÚÒ®ïieï2ÛÜåü™zÌŽjͲ,<Œ+o/c´*çõ…<ª#K#Pê£gw^ m‚X÷BóYØÌ[ ñK™ñ/nSÊ®SÅòÎÈÁƒá×ßÍ•‚_ëk7!èÔÉ¢Å!³žílX3ÐKbâ/?0©Ì¡Y3EW7.›¡ÞuG“|&fù>…ëN2azïÂݾ¦ÊÈÄ€E=t©‚Õöz&?¼’”‚Zœg¹ï%Ò‡Ê5ºÏùÜ,Y¬kPøÍznÑ;¡æ€}Ÿ%ìM’Åo’ô· R&}ì§]Ð7¹N#û:®Ãð[/}é_\ås>¯Pö’¤å–Çáq¹)£;Ý‹|éÎϾ¿뙸fÔµç½wÙÝ¡B—þá-ůžÌðpW’âˆÄÉCþkЧ”7§£ÏåÄ͇ÆÀí i(.+_-p¿È¯ÂÇ2ùÇ`㘕ŒÚ˜Ò?+ÅD—)3ío£ñËó£u(¸ª&Äž7³°žܸTïºÉB^UòÚ°0¥ÄWi´Í(ä"OŠâ]½È#HQ€›[Üü®_-½º§äQMº<"¿ˆIbúO‘³Xõ}¦ sNq¤’­×yé_Ì Úøbt|æ™=ü õ$[ð°]nä}蹚Ã`2åŸÒ^ìêb äšG¸}a¡¥ÓKi1Ê“¶ŠÆ}ÙVªxi£LfD%Zƒº’ò0óËa‰dU/ã-UÕ»´5òfÓ튯žbûùìœãiÞ3£xܳŒ#L1É'V9‡t“jWË!=7ûz ~–kOÅÕNåiƇ¼F{Ã.õ$xýM憇;ôþ› Ò¤érx×”~¸r¬m$ßÑP£1œ„C„“Ú£“;Hô(%N‘¹—‡Ëß;("AÏ„ÐëHb—Ÿ1>îïþÔXMf—•、5ãÕÔ¸Úc¢Ã’:vfµðàF~¥=cøx$’pXü ‚ &‰GÊ›2Œëß¾[9|£cm”XÖ&ÿżŸÝÀÿåî·Ý[Ãôû>¡•ç‰i–—HTKšÐw³ YÕÄÅ¡±ßiby—©RˆpM,^x, g áaÈ•Û\ßP¦h2(p˜ •¸Æ™¾;vJ'mŽ¡~z½KŠËŠ'pÚ¯÷dC? õ™áÐN¨¡ ŒVÞv&áQœ×ω‹ÆÅ~{ws†(CæÛÊ…ñÍFVñˆ…ÛÈcä?UW¹E‰VΖ ÜÍv‡\º:E¶8gÇ„ò¸,×}þ¹Ÿ@AVâ×ËH€Cè÷õìkàów 0cÛ¨­®l“¢ñ^µ»zµþxú!±DƒH‰£†|?úÃ7Q ˜5™«íy²A ‰6MΣ¨}TxÏåèxÄk¸’Ú©'ÑGŒ~Zˆº‚î,Í•u<¾¬6…ÊL Ø•Ÿ…‡>ÕuV& =yuõÆÄêº-° '=&¤>äÊÞ6ÒƲ¼<ÝÌ¥µÙ{ÿ1+‹’ÕEo)б»=àE=V€)©4—§B}:Eeäc!µ5Õ·zrµ7Õk£g쬷—aY &Gkç3ÓÙÜáÏ”é’ðL“GGÊó[,¥ÔD‰1%—©†ôTF+Ó4Å•éXoù^b;jʶ¹LÅÎÖÉž¸ééù±2Å¥[P×f´µvÜì/”§Ý﵎µ7·Ý¨óœÕõ«;Ú‹CfXõ~†NŽG½°C`KBüeiÁ_£ã&Ó¬agŸ¢âs c⻘'%#×›áj‚®ãŒLÜë5ÈçÛsVÖãíÃ)¨ã ×ž™j÷-ž7³F^fíØ¿"Š­„Ø 1$>jef’üä…r#ħgc¯u®GDµ±öC‚ôCbN¸€Tqª r^…'-ÝGÜ3By“æJ÷Q«¿®8Ö€ÀrÀ<›˜oŒ£xGš·È)ÝOÍ®„J%¢ÞâùI …¶É<®ËB­¾4Ò_ $ý§’PÖDÞDe ¶’«"ËÒB0’<{îú vH+¸®J¦rC×[‡k+¾e|ðñŒÑÆG¥¼×³7X/Ýr"•~v%”;´Áâ|œe{zZ3Ý^ bv‰ód­àa0ÛzŸž¯ú9HWë¸ü ÀP€©ó+}‘`j³ß_ÒYwS8¢ÝpÚçtPDžd‹Œ£*øuµ˜~á_ŠŠíÈ_Û|)È'Q!”/aõLù¥oå<C-ÊŽÞ'¼™ˆ}>÷å6ÝNkÛQ_Fꇌ¤{U¹{Þ¬ v:ûøq ü;˵…Ö‚#.†Û-SÊ–ô•m\‹×S©Á§@Êv=PÕ¯Gå*IGT€ŸFR.—i›H šò¿W„=´÷»”:®=?ŸöYêc”Ëâ0Þ´E(€*†o×–$r©à£î×ÞT?É/žCV‘}½¸ÃAÄÄDæç’€P˜¨Ý¡@.ÝƒÆ ùBšg¾¼áyÞÞÇU^Š…Vý<ï+ûíÙ‡÷e %Ù„}>~Ï¥}[æµ=ÒÓµ úÆ-v^õ ÙÅ…þ iÏÔE¨à<žÜÚ¿ F¹F‡ÞšÈn׫©ïF~‡^Ú·T^¬íbxÓ|ž.Q& \ºñL‹µr³oyáX[È vìP@ýîTr…*ëRõtÄ9ËÅÆ˜àÕ+~…à˜#åô]ò¯©À)I¼ƒ«/éüÍÄ©¸ºµÚX2µÉžuÙdÂGrôIënL=Æ<™5ªñ¥³4íŸU¨”À¦h^«Mî¯Ù›ÿ@´ÞZàn¦–5Ó§Q¡\ÖþdޝØ+K:ÅOq-PÛ=&³” z;o™ÆÙ^ÿœÐL¦¾ÄßwJš‚„‡iϼàé9<Š“Î,"rE߇_‰·M{äoôû´†ãdJÑ-áºdd›PeêµQüï£ó7Š=k§ÒŸ„p×p»i|¬/vàˆlõ‡ïQãgœØ(Ì¡ø"däv®m«Oƒû/Eá'3“¤Ï7éäéÆGç†=d¡˜)Ì_IdQGßqˆw³Xb¸¨¿G¯'§žk-Ó.exEUÔèXG5ê!nfiX½Á€¼zÁáa,ÏhùI•Âä}V“ÝÌ#\‹öØ%¥§‰˜C‘K¡Þp^ù®ä;D&ê˜×½—»š` gªÚË1ø0ᓽÅåÔË[ìΠáM|Øx> stream xÚ÷T¦m÷À §É¶»²mÛÖ¤É]Ù¶mÛ“mÛÆ¤©I“5Ù5õvßæ~þß·Öû®Öªë·½cïó¼"'VR¥6±3JØÙ:Ó330ñDåÕÔ˜™LL¬ LL,°ääjÎÖÀÿÈaÉ?,ìlyþa!ê4tþ‰:ÊÛÙd\¬̬ffN&& ÷ íyb†®&y€Œ-Ð –\ÔÎÞÃÑÂÌÜù#Ï>¨Œ©ÌÜÜœt»„m€ŽƆ¶yCgs ÍGFcCk€ª±ÐÙãBPñ™;;Ûó02º¹¹1Ú81Ø9š PÓÜ,œÍ*@' £+ÐðWËCà¿[c€%¨™[8ýK¡jgêìfè|¬-Œ¶N..¶&@GÀGv€ª´@Ñhû/c¹Ðþ}8fæÿ†û·÷_,lÿv646¶³±7´õ°°5˜ZXŠr ÎîÎtC[“¿ ­ì>ü ] -¬ > þ.Ý !¬ 0üèðßý9;ZØ;;18YXÿÕ#ã_a>ŽYÜÖDÔÎÆhëìûW}bŽ@ãs÷`ü÷åZÙÚ¹Ùzý‡L-lMLÿjÃÄÅžQÝÖÂÁ(-öo›ì™ÐÀÎÄÄÄÅÊ:€îÆæŒ%Pó°þ­dþKüу—½=Àô£  …)ð㬗“¡+àìèôñú§â –™`baì 0šYØÂþ‰þ!šþ‹?îßÑ Ãô1~̦¿~þûI÷cÂLìl­=þ˜ÿ}ÅŒÚê"J´ÿnù¿J;w€=€ž…•ÀÎÊ ààæøüo%C‹WñOi[S;÷¿Šý8¥ÿìúï  ú÷zPþ7–‚ÝÇÜTÆü ;“ñÇ/æÿÏÃþ·Ëÿ¿ÿ+Êÿë˜ÿߊ$\¬­ÿÖSýËàÿGohcaíño‹¹uqþØy»M°ý¿¦À-®<ÐÄÂÅæÿj¥ ?vAØÖÌú¿iá$aá4Q²p66ÿ{6þ%VÿkϬ-lJvN=YôÌLLÿG÷±\ÆVO§‘ü[üØÿÍ(nklgò×’±°s  =`™>&‰…àÅü±&@÷¿‡ÀÈ`kçüáøèÎ`jçûוr°…ÿý‹8Œ"ˆÀ(ú‡¸ŒbˆÀ(þ_âd0Jü!f£äb0Jý!V£ôb0Êü¡ZdÿÐG-rè£ù?ô‘]ñ¿Äõ‘]é}äSùCùTÿÐG>µ?ô‘Oý}äûü‡>òiü—¸?Èð}œ„Ñú¨Åø¿Äö‘áãÉgóÇú¯[e4ù~œðÏ9þE.ƒÿÇà£ÓàGfÿÀæÿÀ,þMXþ?*ýgäRmþàÇC‚ÑöøQŠÝŸF>l?^\ÿP”eÿGýákÿñî°µš:ÿ‘2ÿ[ú¯µÿ¯ø£*ûe·ûÇ1|¼:þ‹¬Ù\ì>Öî™™?ºuü~tëô_dÿprÚXÛYÛý³lB|,£³›Ý?Ôwéòü8"×àGL·?ÈòÑÇŸ>>l=Žÿ ö?khìâøÑµóßOÊýÿýâÝÆ°«ËvƼÁ– Á]uÂxnôû3ü äûéÔô^«ŽÝ.ψP)ÔµÙ[Ž÷Â)ãÈë»âTwBkD¿½NÛ› Â:’”;_¼_õTæ÷;a¿ÏaŽÌ 7ÀàÓ« xÿvðþ`ÞÚ+CžïàÂ…¨Tˆöè6$éÞ8\ñc*ty_ù –Cîµâ}Œzô—€ÒEò£œ%lHgzhÔKw¤Å»ûÔ¼Ùw"™ZXŸ³Öb/ím–ا%Ï*5§>2mlð;Ô©y /‘£T¬¯²’è-þ•\&j­©a"ïÉ^â_<:rÒ¨XLÖŽ«Ü’Sd>Œšƒð0Ùûªö4 ö§ˆ+Ø´¦nn’…Šm%Czca0Ꮄ&ò®qP ^?W!î´NïdO5ÌêxNè˜îÀÀî`¬·ŠlˆýsðA—‡Ä¿=àêó.²Ì*'«÷´œ=³_p?pWí©?wA„…*JÉ@BF+Êlá$O¸«GcûSËÝió¥ŸZggMBýƒÃÕÁÛ¯‚)ít.ÙO77üfëäÙiv#ÔV"Kã„_ÚU`ˆ‘tIœyEËã²õ<¤B2?Lj„æ;%Î@§åÃúõ+ ^LPHÍhžOù[N#!µs ýÚZÓ4ð#îÐ#¥Øµ×vù´FŠŽŠ Â†“@1ñħ‹u&g(òc¤áØŽ–î¢÷ S‘°Íí­L[Ãtª³É1E^Ç'®k%ÍT2dËu#¦ãùT”Ûúޑ⪊ùï*vt¦ð“VuëH}Ó§´úµ¿{L¸ÕF7„ÕhPˆé$,ƒdQ 6ïw,ñ’pãw†(ù<ùô$lõÎÞ-[2èÿž‰É_›”"jÞ°=ˆÑ;yq‹_o] q·i[Â<ЪICŸ8[G`pÜG«Š·7õbëóæª<Ì;ÎáÕ=a¬í1÷žcx,U†Ø¯“]·É¶¾×[§ÐX÷ÇŠÚõ"l-¼üm#1„»qQIÓ”Ö‹·¶”1Î/!ë+ZÌ)„©Æ)¼.ÿ¢¨„ÉÀ»-5AkªYŸËëÓø˜‹~`9¬¥y'¾âRIÔõ•}´ÓþG¼ˆtWÉÏ‚HUæky>§½rw “1¨TÆâÛ¥‹Î‚›V÷`jfî~K—ŽóÜ·ñ‰Ôµ¯ÑMÙ‚æ·‘mFÙ?ßhV ÀÈüaMFŠ "ÉJ!ð!Y<È$ùWåÔ±åÞêó#å§Ñ¦XO•hbÍEÎÈ‹&i¥ùüUYÙìÓ7]~´x-Eç–œýä§Bïi˜;hc(Ô8 óá“jŒ sá¸êësÇõñíÌÉÎâ³ßZ7 …æ ý±˜q¿6H試Òç¤ä\”8`Cée¿DƒÑ0›¹=²ô°1–äçµ±ö Uî|©ãôüaèy2ÏŒLÑʰqy%î¨EÙ1VñpÂ.aìÇokÙòӽ¹lŒ~ïÆ óú8uÄêo”'­–ÙïÑÖÀ;µ‡`º\P¾~•´rUòRfjvFÞk_ðÂgqE¤HHEéU·Ô0‰èVù¦z  Ì¢ä{¿šœÇÛid™é;ð!|¨öY*³[ˆéHø…¦ÔŸv®]’ wºúN™_Šªè5/‘1hø3Kc,àåq–—}#»HÉFxqŒ6ÿóÊ„çÆÄ×Ä,cL¢0lV=5DØ<%WX ܺºÝþ“ªÝ•¬ ÑbQ½Zößܤ·Â¿~Ò ŽŠœ’®RŸ%6ð”RiPЇ¼‰ KVÀãÐ;&N©„¦,ajYøC ‹ÐY倗R ûÍTŠ“d¹\u®jm?—\ Ìë‚4Q¥T/PBÚd<ÀÉR"Éî, P ä¡d‹o+)ÐñÈyEª²J²¨ q|ÉÛ¤¿\ÒÃÔŒ¡ôÿqtç'Éà`ž>øéA /ïúÅ:а¢ÌmjU¡FÝ~ºÔ ºúv'Sž»rO]Æì›‘ñNüT—ÓPÀ„Ú·dj±>p£Àq b]?‹‘·Î$ƒ÷£¢r¨hÊýƒms=Èx5µ8éJ[© õ^K!J÷tâuìÃ`¾êÆýòn@ºÿýÊ€²ŒÐ>| ‘Š¢R‹¹ýà¾2"_½w¾ªŒñLñù“,¹Å¾W0¶ì0ƒè™Å´,wa¯»Ô0=šëŽøë"›»>;aø~\þjÇkdæÝmn©ÉŽ5;¥Ñ¤Ñ†]ªÔ=@1©îˆkø'Œ‚‚íƒöäõ'(—iÂÖÑúeùd°žÛ~³—ãEFp0(»_¾4CÝ©¨?;z&zèö“ͰÌç >vHþ² gT©^¸sNò»‚øÜæIdoÔëlTÔ2½ok¥T/k̽®yò š¯ß…-ã‰?CÜY±óŸŒPdiœY®ºÝ„Nzc•a焺ŠÖF)=w% ê7cŽ $‚vd ‰û*ßÎ-¯Z9ûM”Á‡ÏÔäh¨?¬&ÖYƒ‚Ï2ÔìŠ^Em}ØZµßÇê¼:±úյ߹Å+ò–%k~º$°q¯ lØá8ôL3ýô=FtßIS ñÎ6å&Z©ìÓ¼bpq7•4epÓà} ɰ£ëƒÁ*‘³²’mö‚â6…63{¥µ>ö®¤èÂóÿ†(?fHóu‘ì>‚ ×•t½EàŒSýÌøØoz°ª„² =̶Mi.c†9:ó°Dcs¤ò ªlõýó:|yº‚ $-÷û'J”‡$ÕüÀÛÖBYÂ@_$IµçÄ¢â€~²w•±ö¾§HÑAP«¶¿0ÑFÏÓ¶áW {ê>ž‘`ü¡É F èû8”V_ÈÅyö2VıZ‰™H“5Új ·úo‰™ZAT{ݸµOö3æÑßûógúË®BÕÁ¸üg—’< 7{äBýŸÁ’°^ye£xkîž 4Þɧ4“ƒï Ⱦ‡ñ`sÛï6Iè™dŠÌ.˨PrèЫÑüb#ÎŽ™÷Ð1 ”oþMW ]ûkB­RI˜tÄ4Á_Ä?šBøö¦YJ‘¨Ò3$>z §[Æ"ç:Â%hNÍE1…Á(bˆltŸšDŒÕÁÞ|éŒÜ*Ï7®ÉêÙͼEÆA†Ñêó Á·Ål¹o±ÃÉqø›¬‡­Z×Ô8,—Û§s)PsQ>²kçÙ¸æ¿ò!hoš,£ÚU˜œfbHê­eÞ¤†3yÁŒ "½™†œæíôWÒÅBío¾jÇTí}Ky=Jé§K&ÌÊI ¸ß5É›{]áò^ÿ!9›»¹qñ…·C Övä'¤1KøV­;‘æ $z>3± Ï6ÆO”öÔ}dLgRÂÁmLAòöù‡³àHÕ^ Žgfp$Ä0±eNö,vnIÿJ¯gÉÎC…¥2î)\+c *ø?~2`}ñš0pÙx×ÁÇ#j.½%?ngí{ áø²ähª CÔ|ò5{ñ;_¢Úªª®ñÓu¢eoZ7nÍÖÚm”wiΩ\~ésZuÅczêMÿ6T…Ì•Öç«É,®¦³>æþß&¤2r̘‚hòMc‚h$ÃYF¥SÊýˆø=í¦Æ­s yŽMݵp|fÖ¾1i ìZµ²³üªûWº§&°BáEþúPìKRNÛ/wë#'Œ×;QSVŸñ7\Ìöü’D-Ÿ#ûP²Y§Ì%ï =Õöê+JoµsâdÍ2zÅëAxzЛ8Nc»#˜âtO=£rÊlÍ/_=¯,ô=4©æ”ïRæáâyzá´Ÿ5/[)AûŽ€|‡e*¨|,™öÄÛ•^¨&FP j‹R© [ +& ,;cÌ?):Û  O‡äêoÌ}•‡qSÈ>cKû¾6D—½mQ¦e°ÕNü®«Eãp+ŸPDÓšãÛ×ç¹ÞÁ·é ~ :'š¦õ5/OL·crËÆ%'t†ãÅGñGœAͨYe©Ý7EŸ5òsaÓ9N>d›Ê1IfQÃ\óÉåODD„r»P™´X~Š^Œvo mª§à“9)9˜q¡ƒ°NÅÁ¯ÁQ¡† ×8µëÕX¹¥°Ç˜/m ÑIŠ|Ú“#4ZÄè§«5S´¥ä«¨®!ÆÂ_ ¥ä%x aÆ„í†fOøQâÜj¬ñ˪î9ŸH fŒüÕ¾ ¥’(ã%»ÙÏXfa$-™k2?4òRÞ•Í}jÒ+q@⛥º¸ñ{îg—ìƒ r!ëÇÎèÁá騤ÑZWª‘xZpÔé»:~VüY o ™z˜Xa´eƘáÞYP§0ÿkdAEðÚLô]9 ÔÖGKJV'ði8œ®gáA8ýBEiŠJÉÊ‚ïAC t?©(aûÔ ÜyF1|ƒà'¦ä4{œ÷_or—MÉšMõk›ObɆ û†¨Ž]l+IKB8O&=iýɇ®µìè`'Ùì@Œ!1SÚVc~% °w§Êš \o™‹s66Qþ™?xÅ«kåN†t³¥¼«U“êêÃZ¤wc½P½¥—“M¥û‡u}#HÖ‡ˆw xO»€±‡²ë`UḐȃK`Ñy/1+¨?´ˆ–šr:äd½¦ZšaúLx`x^å,˜)FÖ¢Y^IçâÛ¥f‰>­s2s µð2¢×VÙãÅ®qÐJ]~Be™§òdyšêŠÊ¾ Ñ¡µÂ/¬ïqFh–ãaåè`nÝ.úÃ¥àØøL[جÅú½6ƒüàŒG[~ÊW·.¦·;…°W”Ò0 …;‚ãh–WÔ°±§™ ´¹-¨£ósŽ…;åRsÉ¢ÜË6ŽŸ¼9Po$ŸÈy®eßZø6©*Í$õ†š}kÝ•Ž!õüew6q°ú·µžµBÄ&“HÛ’ÉÐM[9 ÓÖ2·|PÚ5'÷ìŽÂY_³)whÕB€Þœw¾yîÜ=‰ËI€tØ©‹ôd‹]hsXng‚ÄîÀN ã§é=7Xcmï–~ôOd¢c:ó„‘+ÀË ¸o$ / Û=#¼¸¬Þ ž?µØî5 ¾«âKM¤Ëü,Í=¦ö}G'Ï.5ÒéEQ¼æÅÈSq Ûj¯fÿ*H’«±ïíÏ»T#Íq–¬ FùÅ$òHöéÖɇ%ÇKY˜Ú WæÄJs;ÂÕ%Z•L-Ë=ÁÈ›Ð÷ô9‘ï˜å¥ÇHØ'$ /·XNsQ‘ãð…™Ì€‡hvñª¬©·)¡Œ°ãŠË,Z”ìN’.å}JÞÀÃGò¤$kBÚ8qýÓæMjæ;çOY8b.‘‰îXkÐq†ux0»;ÂYÌæ%—pWXÙÖ`UÁi&m¾ ‚®ky½\;q°ŸËÉ|šá&†@Y=ßÑíVZbÄžm>Év×3&nÒ&Bæã’__ª3UÒ-ðªN(ã"Òj­ÑK‹®×¨«À£æ"•N+Wk2ïj‹‡3&ûËnXewyG»]©gåðÆ Wϫìá K`øê[œAÙè°Üè!½C°ò3e­¡û%!üÍÏiL˜ÑÐNß(ù}QÑÛˆšä;¦o$Ž™xNY3ª¢5`üß<&à_t_õøˆéK˜ÉêØå’7åQP¤éÞ0—’¥ÏA˜ÃLH³Qe¸Ï)2¤ãÀCHë³Ãf±[-Æ4"( ´eÕë¶&¡ò>³*Z.FJà­Õ®™‡Æ‚úfòVìÚvCvè{øeyAßLóCÁ}±¶~I,¾~o>§ËCίJß5³×çBkOÏûn`®Àh`YŠt8³sÌÂb^öì< CŨ3$´ëÍ+Z²¢kèȱ»¤y‡¬ÑFÖ% ¢ˆy¡|¡ePvh £/R»Mh^ºèpuŒÆOÌ;Îp=;Š×K3Ô+'ÿP5zq˜eÔ›\"/‹“fèed'›%}`;¯l׆ç¶dFp͚ؿã Òã@ ˆrYIù\Žtªú¼l'½üùËÔ]‹e5³±¨ý-ífý3ËPüš¯oÉìEµe” \nHòáäP´â<®Ñ°‘$Áàm å~?“ KÜ1ygµàc màêgF€1×å$FNÛtC¸Ú¶ƒeY¬ÑÀ¹)ªâz³‘ïv/%]~²3•§Ö÷¼æ·õªçOµy”à;2<Æ–¬%¦,° ‰Í<¬¢¢ñ¼ŠÈ®$|~˜c‚Üü½‹a†‰ Øc^èÏÏò“‘-÷>r¶.9%~ØÅl?ò>ëLmÓ2ꇔ‘9ßWÆ3Ÿ0´øŒ/.ôÏ¿ÖzíUòñe¹ž=¬·maNy.߆ñ=ÃMƒ\¥ŽÍ}Ýážr„ÜÄn É6 tnɘH'ó8ž«X.ø|ÐÕHÅXþ¶(ðuc— <åÎH©H$±Uƒ†@[t|$+R1÷D5À攩ñØÉ0«#pf¹¯r_5¸ž}&åÞ‡3"zqs•¾?‹«MZ´&΋y¬=T82}K{¸qªÇQ1J×6•c—½+®Ûb—}ËEì·ÂC!¥›Üè>jƒ%IÊ1ˆ†k£‡üŒ‘©kV{Ñ>ÝR¨TMhò|K—¤N iȯ! Фr¥>÷¶& iTìÌŒ÷Ó¢8 ~*¤É´ü#Ož@@&ÙɳÀ2ļnSÁ¡´µk‡Òíê«Iô‚!x 3J‡ç¼Ûï¼9ˆq1wjí±&¼*תWNâRŽV• ›†Sû%%™#m–sæï°Nê`ê-Š(9)åE„]9Î$êêF³{ÿրЕ›„鄆ð¾®wS@8²xÖošX¤:,ù‰û@NüÚ;K\›¬tpø âfʈ^tÖvwô!<>GÀù^%ÄyD>Ωmü†^†SÇ8Ož^š¼× ·xÒp+ú<>Ø×ü†È®3ßšéi£†ÓÖDŸä€_ÝYáßóîÄ%ð¿L“/Éß¾e >Ö¹ ¬â#øŸ…ŸN6Ò}ïU^ÞnÒ¬Šªê,®¬gmÚÑnejZ° žþIæú‰Àœ'Èâ vè°¶÷8ÇAؘÀ‚å¹ ¥EÉÚ¿Ê¥OssȱAgbÌú…3â~_Èfœî¨oÕr"fO¦¡bÊouƒI¹„¥ÄbÿÖ•ÝÈÈü1†+H®‹“É®(Oµþe ÛPú‘æ]ðJùWÿE kž:³ÓÆy«5Å‘ÆÌ2¢,fN9eSG6 ßõÉÆdÈ|.VÎÁùApØz÷ÊNˆàëç’¾6ŠçÃü H…\ƒ‚3±áSPMʾȑïVâe¦c}J V¾1l²E. Þª!tRq«â½HЕ^…ò–œód‹•@áà`|½™–sB­D@ø„>ÂN†L-Êhk)]X›¢B³zšÏ]"ܼßNòH½ßŒ„Æhj 5bÁx|é`˜v¡@/¾°DvMLHÓnxºÓaá’ã„I®jMP&­¥^_lÑ1+ >ãízîãaXª¤9½+ÿDrÝMl™’±w,-‰=l“—³™YLÄîÈc+oý"È9gÐ7ŠÛÜ>É(‡0Ð">Ô`³Z$=nÂtÇ-UÇX! …ûûš*…ð“¹ïöÉ&Ÿu-=YjŽ¥«Ë¸¸²ÏVŒÞ.¯"·ÍæaÔ7—WÙÃäyÌ Ž»þlø4R…,. èjÖ–L4öºkôƒ´T¤Ó¸ÏÖÒtCe/ÊÜZÆt^í]@„Q'E IEÌXf©ºT}¤znYNì97ßÈyJGZò‘`­?WŸ†pÐÃàŽ4 Ë®âà–gŠä@”}Y,hÍΞjÊØ4HÍc{`º]ü-Ⱦf$ G:³!ÅT'ÁdòwH[+~¹Ú€cÏŽ_›Â/l™µ½“¾ÏÄ|Š1¹»E*ÙI)SúÓå ÷Å…4±µXÈ?™è-yúÁñ ó ’å42*Üõd¯ôT]0뤙{Ç÷ó—Ñ#ñC4ªìršÂJ,¤lŽ(·¾…½Ô´3ÈœRV&EwؤôËÚÕLʠ墔鼽-`|Æ.Þ 6’þʆŽ'KÈ C¾U¶·I7îZ8KâÆS}ÿ»‡Ýöج~±ð÷ÜÆeQnÛÍÇ¥ºÁÎCH*äªz›®8¢÷H°oÀ‡•ɽ”:|>{½û ‰«1Í)[î|®ÜL˜'é¶}Ët¯ÜzW•mpk ¹àßã‰9ÂHíHD tÉÕ^‡yoœß¦)¡cþ¹jÒ¦°¬c ƒvÄ0ÒªæW°m'€C]Z–î;*Š/ ´Ý-F¿üf[ŸÆÀ˜oØ –ƒswÐjIÅd[?r!.§¥ éÂÑDâ ÏàP. €Ÿo²‰¯˜½~åÇÜ`Füøý5¿ë …2ê—úÚJ{t2Qˆ ¬pSÌ@ýÒ si¥pa®öÞ²÷ëÇb¯구Iß(1±+9ÿWI[YÑ’ð>вު=ðou ±áÒW·I8þC}¾Þ ûÈKPgr/èêBP°’Ž¶Í¦œìŽ/ÔŒ<¿íxP&‰dòŒ™žÇÓ¨ÁYtÕó¼jX„0|¹¾ëõÂ{Çãí“Ô#éÏ” -¤^„!Ò’òR)t´Ð{.¢H™°¸ùÑ^{r“³Èä¦ù_Rí%tÿBc8C0˜°„È=)6.ñƒ¨2 Xü¶Ùâì…óbMá:ß6â ŠMããµý@»öõ+ˆ²9{z<€¥MÄ‘¡<ØUMRÊ–:aêGzS×Ù#e–‹<“ f ÖrÏ£C? ÀÅŒÁ͸%“y¶Ê}6˜‰¶>:vÓ„¢MUù~üÅW×/—ˆ‚P‰éÝàãc¨u´ŠŠ|mpVÆÙS/ÅPI_ÂÈ‘ºÑ=ó~±›“š·I—SaC¬ G9ÀçRàÎÝeÎã;4$ª¢ûžd ZÕP;2vŠÑÛ|{å†R¶¸ÃŒ]_¸Ùòx8¥ý‘ ïJèóE•šÖIe6|M·4CÖå²!¥ >Ò¡]V£”0ómÓ÷;\9¾æÀ‰£CŸb*´ÂšÌ|üýì‰ÊoIÁw  ­''ÿÔeÅDrŠA×oVvPéåõ*rTµùèF¡¢”g` Båç74øÁ ÎПv Q'Îh€³Æ{Z·ZrAl‘F•ÄaqSi ñzÌùšñ¯ß¢Vý‰ìîIo›2Ö+°ñC­{¡Öî6-à¶ ÙÃý‹¿è.Ó@"dzû€9ÉHa*÷¹)Ä3²z¿Os?ÑNº.=7]÷±O,‘­¼¹”£©}ÝŠ]º|%¿|^ë˜o,a^`i­¦Ê0b7ÎU4ÃQ6u¦™”––itb©µìjÛƒòîÊ¥6g¾§mÞíP.}Óñ7Mý¥ ÏkcZh09x#.Æ Ö(ùvi7y0w° ÇsåY KP„Röë+û ¬ã ×þdÔ“üQÓ‡”o‘ÜùÅ<óX¯–˜³Š·1Ь‘†‹ÿ·XÉ;CUäg o+üˆÀ Þ›rùh…åîQÓnçòQƒË–÷—ø×¼Îý'‘ KOÊ|ÈTë< „MOhX”¦ô>D¼=3ØÁuŽÛ†âÒŽ—E(õÆ:ÌUÉ•ÇÖ ðp¥Nʧ7ÁÒAZµbÊèù¯ðMÚïÁ% †²$8Ÿš‚R´Ò*¹ŒÌ”ø–åZi7*˜k%(³(Z3yÒx,ÎÅà:FÃ)hÙ~}fÁõóg±ZПSR°hÔ™òz—Ì™¨Êô9žƒ¡¢^¬öâ4e®@”vg‹7)USï´8±VO:ëLƒ´¾ÝðÏ3-]Æ‘Ša¡t>ãÃX{Ôí–»pfð‚Çâ¶Ó¤Olí¢p fšøfŒüŒÿ’o0ÿ½¨è¨`t4c³~Ô_áÓ¼ðþbÞÙÌÒp½8±äÉ *4•Içšõq±ÞöVE[ë·—àL"žÓÝߨa²óÈs„{JÔ~íÐê³ÌR’J`Ât¼ x×¢)ÍÒÛkIoüPŸ­ª˜!ñd} JÑŸŠ¸9_Ix9 lÒh^‡ {^Ý­ès”»¹½—+_œ~JŸÚNÎâKÐ!Þ‚j-ÉàÎäåQ¸¾ƒÇÛµÕL9R2,™óî]õ1M <„Ý¡”–m4 ×ø)À¯¬ôC 7ªëX;×xµ<“ßl|}å\äÚÁ\‡±'ƒüáï¯Ù¡Ó|&fÊVµ@þk ¸bEë<ô…û LXÓŸmrÚy=~­³QFæÜ2z;Õ‡{*”€‚Xuym5¿Ðž7‚¾+BÕ%4A*”¢è ‚7˪…³ª_—KxxðÂSH ‘CÛ¹Kn_"ñþsÁN7Òwmy‡ç>Wê¬HØq0«oª>’ÖÀTñ6ŠãꞀ3ûFžub3ìY×Õ# -ê7æ¬L’~!’ Öìõ’ÿXÕŽi‡·Ìauö´™7¯Û²q \ª‡›Y¡ßÒ`¤=²9^W*s@•%’5„J·Ê­m5§áø‰5äh[â4íø³d7€Ôß¡·±Ã'¢¸¬ÒÌ©-÷þÜ¡š“ôòNV,4ÎA5\1#7߆ÞÑ_v¾´ëNŽÐ‹3®(Ñÿ÷³tõ÷†r²u6,ovEª :Ã=ëþ}ŸÅ†2®o§',K  FyŸì b’‡$zÇo°N`‡bŸOü/ˆ XgêÌ’‡ßdoáS³–LMº_¿Ès­–JõÖü }|%ƒˆÛ ‡¸û…mØ[˜xÖ²©ï¹ÛÍ «+[T—<Á‡R\å2.°±7*-cøN³c{ò5/±¢ŸâJ,5ãX&ˆ€/òX‹û®÷¼è+.N!¢ÔÑÏ-¤óŒ=âИpí<¼ —×O³Þ‚«ÌÔª’·Ñ¥!ÆÊèÂ.™]éͬK¥üjzzlåEÏÚ?ÞW¸/iYjª0,!Y×Ù»ÌÅ¿||ëH!ðsgÅ«Ì4ø}µàªÞªØsÜ”•i¡Rõœ¯Zi>]„…U³ŽtšÎ™cù’á¨a2xáeÊqþÝÝn=c}Ð0ˆq—Ø©º£¿ñ÷ ^¾º=,I¼Y"ƒ^YlóW 0”A=ÆTt`ÉÝBOD0·Vã ú¦½†n¥˜ÿ°ø´¿éµ– a-9˜ÏiHZ â9«8aAŸŒ.5ü©°©¤+–ìõíD©À{ ­@tÆ5 ;9/‡H*m.]\zhÃǵ/TB@ÒÓÍ™À²)ZL%¾ÍçDhá ÖJCqÔ#nÐ/˜­{>ñÂ1èiÑ6âC:.^Ì À¦í_Ã.›'ðN7e zÃ&Ÿ¼¡#.…:ヹwǤ¿¡#2Pfc½*¶pŠËÒ-6š–ì!ÆVg©ú¶aw4ŠÈMtÆ*.ü6O Tv ­Aÿ”.© ­4Oä)Ü3n¦?_r$‡û*' ƒ6-¹¨_ÂvËqíñµðŸ2±û#¼˜Ñ×.â ëßb$n>Ã_ P‘¸èñå] 5íX{Ø¿¨r§™d°’Ѱ³c47JN§v)—3KUGR “ÂAGje´ëò1Ç]ŽZ¹Ä™¸ÊI™ÞëÚu¡HœÞÀ3Ô™Ÿû.-ä°ãø   ~/~ªÁ¡¸¿ìÀ·VïøÉ½‘©§Pt¹áC—ú ý–»ÙVEzÞ ‘N,_¾g©”8syŸÇÍ ?²5 -¢LxÏÚu /” {½;Y‘Á ½¼Ð¤ã‡j˜†ö³[ñ¾ :“û}’î(^£Ê %ìð‹Z…JB 4DÂz&¤þ©’ÓL+ÆSÆU±v5Jí=¸E’BCôø<ØõAy]-k²R· ´Ž|ÿi;·Ì¼Ï ¯%ìg!dMAû‰<Š&À`Þ žbRfÀ)ܾúÀgüdÀ>|hBÚùŸ#÷õG>Üæ'N*ÒÙC‚‹$EHQ=r•»<ÄzÀÒ¯š†üÒ½\¼OJlb,¬FœÚ:ÝVƒÆE •ÌìƒÏýúœî”H¤#èwÝ ÈÆ ë¼ÁÇ'QÑ“c}X•‹¡Í!62AAÐ@¬×õæ.ˆ"ëþµêê:GÚžÙ®IóxÚ‘ki¼–‡Ï«¹rµØßY “ô“¯‹#í[6C¾FÒõ 7)P¾¿Õ{[c }gø‘"ÀG»,W OOC‹Åè^<<äˆWNS@Εòû·ü!j—úúg4U-Ǥœï©>ˆáO®®[J•PŽò²Hó¶ìøT:OvnÉ7ìTÊÛ̧‹›Ü¬›½ñ¡×c„UÄ©¹‡i†±$k[q€3}·èŽT>¢åå…i–S“ÒaÙ<ÜMãKí¸ýüc£¢ßWjYëù†?þÿb›éëÙú¢ YEóKÝ“KZÛžd…u}ñ^I(MåÈ®_¡¸ŒqÆÐT?£Zi¼Óþ–qsvÞ¡ æ^5FHpm±½ZÕØ–q„ýTÂuÙÔƒ.ê²ÃLWèƒktÔRÉë%‘ÁÁC/QGwéêsÇ2YÙ/ùú_jH{)h… ÆÎŠû:Ù!ú&¹»§jØñB} Lo'ÈùøEgR¯ž»û^Jòૹ¤S¦”×Y³)|Æü_މ¥¹[)<|õfg·”i‡£9ìâ¼cÖ+KÃÆÑK^‰ä:VD¢Sb†=AÑg#YŒLŸ&™ÈÝT˜£1Ò~)Ðj ïtÓoñŸ,¤zì—q²pÝp°•÷Páì«-ó*`÷wÓ´m2mSm( øË.µ«@¯ó?Iá1êT´žIÙ›y=ŒŠûåL+0¨V×<äÆêc÷ƒÐé?‡Ð:Rií_Î0´£Ð®Ý°RBá¿+“ûìxõ}mäžÃèűžÄ›±n½}*WK(ևе¡™,ÀwÈ“ÉÌ]YŠÓ¾¾è^WÔ¥7Ûtaõûä~”ˆƒ¬Kv;}Z °¾ËLÊ;ÛY¯ÂÙJjH¥¥Õæ,ÄGòÆb`(˜îe-aó€²8:þDû=•Ø(k/BàÇͬìVnNT¡<:Ñí¬G V‚ß'?8˜ûØ›¬*_Ñ¥6LW´órQšY¬˜¹jýà+Ö®r(Ïl>RÁW 2¼>ŠÞ%óhzb0ømD×beWɲ6>d~öïR‡­3û£I×±7yv¡ƒÜDΡÞÛ‘–ní{BI«¢^h•rNc41– cRÅzr´&Q;“s¿Pc¬“iŸ³³äVÀý}B5ý½¼Uz©ni³é–Ê>#/Qé‹j2¹ò ﲜ©ïöâ'óÁoaÓ‡H½ë69)„*¤EÔG$[§—è~’½î‹é¡ˆEEÄ^ÑÒQ!xìÃ`žü25ZPQu_Z’‡t„útÌ9I‚RÀÕô+s.Þ±B•.P*tA$É;°ßbÃ쯡¡ã©¼v\pùJÍá.3–â)¸EXÈ ¿¸Á(\Ÿ)\ìAñÜ ±(«·Q8¶áÅ7Œ¹FñYѲ™}†¾ܰÜü ¯ìHtäBOŽ)Ä Áky7›KÔC­¿¢ôÛ¼ðj™#º¹S«`¸˜ØD{ ñ¿áAxÊ_Ë\äíåµCÖÛhÀMR†¾¥ #×Üj ¼O2„d°„ÐE8†™~ç&yý!œx"9ŒþP‘2—öü8ê6'ÆÿÎ{Z»Jý"ŠPf+úkfôBÖ]Ä‚ñ„Vkþ„ýªHËa¸×æ‚BMÔF2öÄ”ƒæÄûK¯+è€zÜ~ªåîó÷îR°óŒÞpª‚Ö–3TK‹/É5Ý‚ò0j+f¤Š²ú ÞBÕ„R ÜÊØeI|ÕFìŽY7Ç‹™Ë©/윘:ˆ8Å”câé2¼ñâ‡atOž@Z™Äk»ŸN—A¥4Çã<~^᪒p˜¸^N(ÏGc¶»Mþ¤x·e¯hCz˜÷ùèŸò×?kå:qx<³¨¦.2ÈI5Ý”«ô:´Êz™B¿æwº›Ø¶'‘VÓ>ê’+“úÖF É.Ö;üŸþ('|eáïè>ð…ŸÄµòžBáÝö3F°bš[½ëœ–×Ö‚š c6W®ÔäÜ :©B HÚÈKpqîÏjòZÄëÏG«QZôèlÍV±»ý¼öωõ9?TˆæDð¢7²h]NtŸJùò›È(xƒ~³§a)üá|ÿ4ÚéåÈO¤ã®ÕüE{ åGIhɧ•E[xÆ4T¥U›qï~s¾ ÕêÐ&¾”˜Kmæï\âš‘V¸g»%!±-Uw6â3FX¦üE!¤Ù®!ò â̄噈)¦rht¶|é¾¥à­Á¯EGYmÇ.Ò‰ ]Ø¿Áxæe¨šßQT ‚—|<á2Jš†_mb|Ô(t3î²Uz-+ÔPR03б%¤ä "iH¡Ô\Fk[ׯÞˆ–ÅaÀ–*†!‚ƒ>tÔÉï±ô°qŒ~Òµµn1d¼î´¶ èsÎG„ÂÕ®@”¥:¼a®®€‡5ëï©4ôÍççÓˆ‰=¸tÉÁ/ÊLíûµû°ˆÆÄõQ·-V`÷#JøÑ>ÛÀ8"/C7•(šqøWWÏÎÑüSœ~M#$”pâÓ¦SgmœévÈ=å"z”GdãÈ’ ±^.œ„{+ªÃã4bdWΉ˜~ŽÆ,ƒ£÷AúF§0èœ#ÐY·åJËCC©[ùÃÎpº†é…Óϲr–t-û<ñðÚ_¨<Y.¡Ê±ømyîupêVêñSÙÀ$TI¹ü^ ׉gRžgFtðtÎ'1äÛÓÕW:µ¡”ßFÊõ/™Síñ©ªÊ¼<4§\Q| xUž¯»÷£øÏžùNx,i”—ܧˆ«–Û‚(ùÊ?B4¯ðaT%¤ëdÍfÔ–cýe4Öv°xA&‰ ;ãÒl!ûØüÁÖ}.f&èÏ⨎*IRY‹§j¼ùñ´¾ö» µa/[WU©]ê—cº9wÇ-ô¿af’.%6c“œá/Èb‘Úß?-LíB;>².AèœÁHv0 %ÈõMrðÇÍRîèÿP“¼Œkzd0j3ÃùrmSgm»yM“êyàå)§‹°’µÙµ7ŠÅäm4FUÓOëC3Ðvã^ÈÞé¹ÍÏeÏ 3æj¿ÄœÈO¼xR§¦¥á빊j‡nˆr æ:/–h—ht”6õãÂd{,ìó~‹Ú%HEì ꥀç'îPjmsÊ[êXHE…bKñú#Õ.cc¥Š6ïÍ“eo#ø˜¢Hê9´†˜_åpéчNvÁp°Æªg4“Qkv˜Q ýG5aÖ®Ïôn€_ÚQÍ'Ÿ6»Eª«}wýo"ߨ}òJuìeBÞ‰ #úàe…c8P^¯L&@S@¢•ºk¿Yÿ>ó‹k‚ö²$ür®²¶Í‚}›¢£eðcïuÅ:ÚYZ„}¾®I"ýx¸Ü‹DóÈ»™Õ }kÌR×?Db|‡p´Û-qiJûç%VVl1Ê E;Çö¥Ô¥gü¾‡Æ\Уl+òT¾êIïd*-};Ï4z—È¢Ã]ä–‹G§Ž›•cÇqÆX«-ÆÑ9ˆÐ†¦'WQAÿ9&ÅHIòFQl™è÷"$þŒZ‡,"¸2¹‹ç{•óæºbªIh—hâvÒî28 Íý´Û`\±4ÓÎ@|ýJíYL±Oëyœµ ßÓ|ƺ¼Â˜¼vÝÉ*ñò¸žM³lÑŒbT‹WÒ ”¿†g²n9‚wò¯3OµfSªÖz†€©¿êÛËNEx1+9Úêà®* èvnB„wûñØfÈÂ|H¾Ò Òfòˆ-–쟦CmàžLž£ƒ°ñµÏ¿3ø®3Æ´#K *KB¡òÿ!3!'VˆWˆ¼æ‡Dæ‰#”ìVÌÿö¬¥hÛmÝ­${–試 C«×F™b³–} bùQ¶Q(s›—•³üõàS Q“}¢ìtú¤0ªªíV­Dꎻ’¹ã›ĉOP«1I Õ ¤Ym¢úúMQÄXÚdaç`ël—qHªÂ…«yÊñÃGbU0þ[ä)[\ãoy”ˆÑÓ?Äœ. ¿Ã—³w›ôt Ùcë[yˆ2¤Ç>¨Üè­ÛVᇮ:S<å’¦ùlDr®Oåãßh€¬~°HC¨UÑìcDu¯4Ê&³ùø¯ÑçjK°™©ûjïz œâQ¦âžZåVþ[U½êqû‡EÂ^¬&݈ìÌ[ôˆËQ¶Öfò²ìð𭇙W LÊRþWö ¿5ô²æªƒHÄnN‰b¬6PÊ&)5bFDžæ=2¾ÚØ/O«gZR Øe4ü¼Ê§§ € Y{›ÈÞ¼ õ çmݵk‰ÓØ´ó W]O‰Û;ñ>ŽT⮵ròØÔ›¯Æ«wŽöàþݶ^LÆg¦*ç©®I¯JQÆHÃüVœR¾»jbà ³#,6Ã#Õ–Ëû¹ÜMÔ)“HÆŽƆh"ƒy‰”£+Ãy¾èÈWƒ·O†N÷UU,¿'ŽÕÍÄþ¤g‘*Ö+QD„]ãj!Åzl“RÌ}ï±Çö„йìmÜ‹¹9@—Rµί&‘r;ˆ'ènC±KÄ ƒB:çvWOÚ?ƈ ¯ªÐò#HüÉ.ÕÔM=„M~§|Äb¦šù‡˜nJ\¹¤£~~¬·¤$±@r˜éˆ¤X»d#\äÔhG…?hfö[pµzn_U‰-JP3Þ¤t ô~Õ0U¾£½;ϧdyðÊkâ1§µT~–*´ÞŒš¹,åóú-ØB0jEU4ñC÷Íü†Á(ªzc«çì—GÍÑéÈÄ ¶Vèן,Æ¥b‹Dó_Íßqpoˆé*‹ 4öûgÈ•û¸Ìið¹Fs×&Š^ pRkH†g`jìð±;sƒ^ýÔЬâR;¯WÜÔ‹ÂJ%yÁ¬¼¨ÈÙR6¸ÇWd¨ôð?žèh²·‚ÆÒÈF¬à„4CÅË’û³Ê-IGïÏtÇ[„ËÙþúVd6ʽž¿µÁ%ë‡Kt° ós˜ZqºÜšUëª1F‘ã ®ÚÅ?;y“"¢­O@UÀEË‘¼èP‰JUû}òLÑGåX‡h>zÜ»B÷ƒÄn`þ‘bÍ>ÚçÉiÛïˆ EH ©Á6fç5Œr¦•ž„lѽ½8RÁÖ›Æù†q¯÷y®ãÏ Ê¼ù›rc&RÈ›«¢0¤^¢¸Vá j> stream xÚµPÚ-Ї 8 îîî<8 0Hpw ÁÝÝÝÝ‚»ww÷7Gîɹ÷ÿª÷ŠªaV{¯ÝÝCN¢ L'ddm·¶r c¢gäˆÈ©¨pYè™ÉÉUÌ,@‹ÉÕ@vöfÖVÜÿ2±À2Q ØNÎÚ íh`b0±s3qp32˜¹þchmÇ :™äèÒÖV {DrkW;3Spšÿ|PR˜¸¸8hÿtY‚ìÌ V9 ƒ)ÈœÑhP¶649¸þWJ^Sngggz ¥=½µ ?-ÀÙÌÁ ²Ù9Œ4 Z‚þꌑ bjfÿ—\ÙÚØÁh€f† +{°‡£•ÈNP–’|²Yýe,û—-àonLôLÿ„ûÛû@fV: ­-m€V®fV&c3 à“¸,½ƒ‹-heô‡!ÐÂÞìtšY ÀVˆ )€àÿnÏÞÐÎÌÆÁžÞÞÌâþfYÌÊHÄÚÒdå`øG}¢fv C0í® ½¬¹•µ³•ûßÀØÌÊÈø&ŒmT­ÌlAR¢›€Eˆ¿e& ###' d ¹š2ü^ÅÕô§òO1¸Owk€1¸ §™1üÑÝè8Ø9‚<Ýÿ­øo„ÈÄ023t€L̬G‹AÆaðãÛ™¹´Á³Ç`üãïŸo:àñ2²¶²pýmþçû2(«ŠÉ‹ ÑüÕñ?:aak€;;€Ž™…ÀÆÊ `çâxþw ÙßE0þö”²2¶pýU+˜¤ÿÔëô÷óSþ½T€ÿŽ%o žY€ò÷ˆk3²1‚?˜þŸýO—ÿ¿ùþ#ÊÿmÄÿ· qG ‹?Õ”êÿ?j ¥™…ëßà‘ut¿œ5x ¬þ×ô3试•™9Zþ¯VÊ^!+‹h4³7s)˜9šþ9‰UÿX1 3+‚µ½Ù7@ÇÄÈø?:ð^šƒï†=xÿTÀkóßŬ ­þØ/f6vÐÎèŠÈ#f66€;x@.N0€ÞÊÚìwç 0¶¶CüãAÙÙ BˆþBìá߈À òqD#.ƒØ?ˆƒÀ þ1$~#ƒÔoÎ û3Èýƒ8ÁQ~#fƒÒoŽ¢ü±T~#pLµ8&ðžu =ø9ÍìÍ›€[1øÀ&@Cs{  ½é?R&fpF; !Èdìð/1Ûßâ¿æúŸ `> g×>}–¿ëøãmŒþ,à’¬-,€vÿ²ÓúMðÈÖ¼¿ À…ÿÙÀõ›9þ¥KLþÁEüî‡\·©«)ø”ÿ¶ËÌþÁÌ™ÿ ‚Yúwvp‡–¿!¸Ÿ…4ëßÉÀ¶àß»©Á¥ÛüVƒ}mÀ¿9VÿE-+ÓßÒÿf–L• ˜mk£…wjû›Lp£¶ŽÖ #ƒÕË–þ‹]&p¯ö¿Éh²43´¶°þÝÛ6 §QÄb¾Âÿ¦èæ„ \ßïjÁŽÁÁÔô»wðæ288[ÿËÃñ_L³Ó¿ ¸2çØÛå_Þõ_L«ÛïâÀ‘Ü@v¥ú¯+aèhæÕáÏ3>!ÿÁþ$ƒ@. CÄ…YkCÿ/Uþ-wBøÎtÛ£|SäÛŸ¨èÜìZPáb©ÊSüVín„bºÞ.mŠQ^ þ"~v?l¬ lŠVl~ôxÒ‹TšØnFœÿs,çP¨º—€NEpÇãÙÖCÍ׺²]š<ÃÖ‘U! ãιGÂ¥º·hqøÛì¶âN9» ÒSÑ$]¸j˜¶oþ4y¦Aê é:Bxêwg.hÓ×7SïÒÇ^‰¥#i=ÂYrÝ5ט¿ßϸ-—¨0Ûwà’ájâB_¿ž pÞ‹“Æžs/È [å›Kc¤¢‡˜·êÌ:6Ò½aÈ%a¦“˜£ñºÈ3˜€à¨ÈßQX|}1‚°‡ºNX'·f«?c‘ox‡Q¨4ä:Q¥Ñ8¬ôcÄ‚•­j¿Ù­¤ù$ÔiÄÛ¨jb{|àGb¦fºê’Ã#LóT«ÞH±”Nåm]•øñ±´ (u®™›'tJ?„Ñ`­× ˜ô+6JMÔY8*´‡¶!é^œ‹çi¿o§yZ;È%{S©¨-sÓ:'#³Xip­É² ˆUk¾ŠƈQ—>éAK F^c ÂÑ—4«fOqÝÝüÊý ³ÃI‚¯ìÉŒÏoÎy_¼OÚC<ÉÊ)¦Æ‹ÂŸ(Ï“‚W7—¶´}ÓªÅ5„M’Kšc®:õ BibÊ{&a¤÷yÀñ»KÁ”šœéÑ´,‹TÂâ1æä‚k3*[J &m»5é8ÇÇ Ý&ê7Çb9þ¼0•š¯Sûù†ÍçE#œávdúâ[ð+ù •©v7WÇ-Ëw]:>ÑÜÂ×—ÐÛRÚd^ñ|Ó‘Y5>cA_ë³¾'¼_¼ëOéo'Ù:ˆ«ê¬Tì¨Q¦†Ñ“uÝR4¡n%ù Ì#n„éúÀ…â$NßäÒEñyÉ{lwÒ0XFkr¿­ôáËU)â×¥s”ªU•:Ó/ Ó0QðܳUƽSY.ø÷^ã&Dæ80ŒÞIºÙšq:£5a,,&aç,;Ζ̷0ßm„ÃR¤†}`Qƒ¹½"lKÄQ×öý‚y—uq Î¤ÄøÆ¨'¤ÇéK5¿MžÀ°ø¢ÏrâiTÎÒ3½ý"#dÎÓ˜{ÖÓüýVTIwÚ•XD‘Þµ9èûJ?ê6r]…;®cÄ™¢‰8â8n®“E•BæiCaEÖpgâ h·‡OÂÕÂÑEÇ)§ =äM6ÅC;º5—qý/3Å›š®Þ• W8KÅi;3ø÷_~ ‰C/jt¨Â½†p,Bà¶ßß% ,Môïså8ÜÊ‚k‰HUú¸­Ò Ü05înèk—Âpfpâfì8ìzݰò‡NOæÙô—WÀþýMdvIÃT)?2Þ-6.ÔØäÃs^€Ó²¦cË*„æ©Z·ªØ@úƒséÝ3Ý$„`³÷›MÀ>Ôûº3ÀÖ#PŠ&Iéàíp{¥BÜk^z‹€ÔzH˜ÜAsò%47¨UÛÁqŽ}C§û% 2kCëó."žIð÷ ®Ð·Á,¥ÈóÝ?±E ;ñ¢îƒ‚ É‘+æ]Ë¥Eø Ý`bޱÑ'µN‰‰1ƒ…ü~j;½,–‰¯e\Ø~g©|Ÿmò‚h6-f#:­æ‰YL2 >püäTôÅé¬Uðš¤;rœª=UÓÆ·W.ŒâyqáAü*]V2†RöÑ&"ò±ÉU`ø%BWdàúÝŽJÙI ‡)}<x´}íElÙ”/äÏÆ%)£Ð.}ûGÊo’á~…Ù-/µ`2¾ðð¥YðTluûdÈMHñ[DökI,®TG4_IÅêrb}òhw¤×ݘGßu¼ÄKq6Ð?šàjbã¯Ê¹[7’–@®è9c<¾ºTÿ‘w6@hs“£5êp¹¼†A;à¸G¬K>Ÿw¡Oøñ‘QÅ;FÊ8€ý _&îÔ°sÈ<Â@knû¯`øæ¡^Žo¸wý ÏmoÆ0zïq»?äa¢]§7 XHÖ´$R]ÄïrF|*3ÎɲT·¢ ©&JZGQH‚j53{™ÐQ§@=~tqÇK`#ì+1&k Z)kÅwXÛu›å²rÍ êí$o:Ð l±†Á¼ b¡ÑfØÌ‘e ºP<{ö°Jz±¾; “æ(ö[KâÍJï*Æ©P؇LñíôttÛëòH½5éF‡´£{Ÿ„Η±ç¸y™‰{µ¦Õ-º§ÍàU¿^ÒwÆ›bŒ 2Õ™‚ª×qÝ$x0/®×?½Ú`­Sà"¶Ùz‡ä.}˜‘6<€@O½!ÒH³÷„oJÈÅxœZχ¢:Œx6ë¿{g¨doÑ´{yŸN«'þ69ÛÚÃqK«dófZQŠÎ‹Ì¾±¿ë‚¡iƒU›x+)'$+'wq5Fˆã FÙó%ÎÜ®GWƒs+:…‹*!@°Úɲ¶Ò×®1ª>’JŽC^ä+"¨üy³·"ˆ‰pJh¬zÊ#ƶaš&ç™›ø¼·U²Öþ"üCF÷lÏ»ÿj%q_"€dH81ÕF7ƒ÷)á§’h†G…MÕ#Ô²ÿ@<Ÿ ΙÚ^+ßr KßÑíW§ýþ¸ÒË%&ÄŸ‡À»7JVý¢ùbø>œx~Lc¯³ÌˆÅ!Ò»ÂÄ:^æCâKŽÕ­=™ß0L¥%!½²zúa šŽ£ób·&³3ÒŽ×á*>"ŒyÿJ—È`‚-¦€c$i¥;Ù¹sKÒ}öõÙeª¼nz­HÔ7­‡BOÃi.xtR‰qq‘±çæ?È ü5;d4²sœn@ÓK‹—Cý{v‹íÞÌ>7²õ˜k¢ó§Iú¶õNAEŸ{I¦¡•Ól oKߤ7°ÄQ®|VèG†:ƒ2ŠPªï˜fXŠJ;Ý¢Ÿª Ìןó7Öã< Ú4«(=¨/v|Õ£ÈÈÄÄ «—ñ]8·Ìòá¹[×6‘LËuÐèÇáÑMJÓií ‡4¢–/C,Û0ÒÈ–¶c=æ´ŠU‘¦]øDo.Ùü#óSI„ut+£SûLùnîp%ßt‹ó¡ t´F¹ûË[Q ¼[›sj¥×à÷ô}—Qi ú(…£ìž8ÀÌñ‹ïºpòY\8ÙÜå#bÞ® šÞ‹´§ßûjË!ýøŽ‹Ò#ZÈÎB½æˆV||d4Å俀©èË­G…⪄ˆ$€[ûcHƒ>0|âë&sã;Ÿu?¬#Ì8ÅwÆçÆÕæз2F&µQø^f»œ”ïÕúIߢEz¤™|ß1¤OÈ–~AIÐ04¨ÊÉ ‡‡%D¸îö4Ìçü)+âQPÙkò•¼E£˜˜‹>,ò¢V ù' ²\5Nãã7ƒÚ­0é{s*ÅJëù!ÃBl>0ñF‡\e˜øùëÙ¯wž´Ê9$ÞÔÞô—9ÈÑ N Ûãßn/ ±µp?ÕgwW*ÁÜkÔb|xst§œ¢<]Ä6“fAÃ:ò½¢²Á½|[µL£é´ðciÁ½^– 9 Ü)_Å“Ž.·93 Ç –e²ÊÉJûåkDD¼9IÒ·²]«Ô‡kæáЯ‚о‘ÔØNžÓln,–kóI ?¯ Ê«KÒqkôЂ/½Ú÷Ç%ŒÏ °%ŽŠ"£YcühsKCøòØïÈ35êl‰¥J†[ ,ú¸„þT"¨¹xH—e þØà€§O©ß<ÁÞŽµæûÿ( ÄNJxnàìu¡ÙUe"zÝR!ëð’Åž•3;Öæàó>;ñ^ÌÉ+`xd õ?Ià™ç #ÑÃ)h”þœ˜"úÄSÐÜ*¬”B@UZh]²¯vPÑ}¦ü²ÃÛã—ÀìU$b stc ’é!'Tp‚´2á‰t/sº6/îÅ?ßòš¶Ò € îà\i.Ò¸©Ÿi œÇ+s9[ˆ¥tè#¦P׸ k.å .Æ¿`í÷ìÃKÆâËĶšðÉùI´›j7ƒ:²ræ–-_Ë)‡ãe1ŒÄ•ZÁ¼Þt'KÜÓýƺW—n@²Ãc`”o_ÿãô\¬ç$ÎÙéJmwèÖ£ÿ@ŽáÂdÅaD,?š?DÝU¤5{P+Õª»¢pL‰ºÖ‡‘)–/__@—QA ò>ÐéMªêè49‡¸³ú{‘¤!°o´´× ¾6m ©7ñ<Ìr`âb%­J‰Íiñꑦ"¥Ãõ\YtÑ»` Gî<=Þ°Q[žÂßóBoð09E f®¸£‹M–÷¡¡ 'afu2$‰qРâë×NÓpt©NÃ& 1d¥{e3Ge‰ƒ¶ÃBꥒ/Ù¨”ËÐÕˆäCj@_S¢ú„'ËÚ-]»‚{ô˜fYžzÏ3n§-âã^YdlU6î—ÆÂß•wk—@Nµ¸~² ( Ô!7È…±y6I]"æ€Ç§juبÐZS žÏl›ñêû¤›˜°6Bå¤Rüä¤?h‰†Ø¤žaÚPðÏo÷¾²û+ŸIùJ^ähÌpgþŽ9m󚌸+V%Sî sȘȧå'µLP:_ì]Ÿ2Ǻc¶o¬^„?ª»K Jì/²#îšfmLƒE)H®(ÝuºŠi™²cA†í¸ã’VQTKðcƒ÷ý¦ œnœe”ÏsÔd©»&¹±+ø¬¾ØÏ3gÔh4tš%‡«´F+E®Æ™–NÓÉ:/<0„øú¿Ð}­kæqubB>K–¼«8^Ó€^öÄþ¨ ¯ß¤ì(lüžŒ6õt&vJöfz벞ïÁͲšÑ_ þíô6Bœ…o"RÊ'+Ülö99Rõ¡¯›7¾¶-Û¢ß-í¹{Ò’ô’"v,­$õ7…„æÐ-'“špg—J£Q§Yq{a'_Œ­†UçúEÒ’Ùõ aK»=;­N‹Ks«¿l ÄÈätõüŒî÷œ*nòIÑTÒ!D´/í­¨yΓ¾Lï®â…ɧ^ëöŒýˆ³±?—†“u¬³Ã+ÂI[o'S¿¡öŠÑ¯ó¶)§š¥ÜwÆcÌ$RaÌÐÔ¦! “÷Âhèó Dć”±‘ÊXË*7ÇËÏEݘ*˜n‰žýªSŠLÄ¡kó/kÄS¾Øß õßm@ð½ÈÛžÉQæ|„!!)Ч{ä_ì4&MP¥ÝÐ †îDu±Íw}øŽkäÜ·ÿ™\Ã"¸Íë=67C™fhZ¼Ó]þC†ûä±ç ‡ë "F‚)®r}@òš¾ƒf)25îû=E û7ŽƒÓÒõIoÙç ÌVÈì‚ÄfÅÕMLFÛV)œû%õ¤Šó¨ªû–e•pÖ©¿Wâ×Ã*v™ ¨—C8&©ÑŽG‘‘ëý($ü!;êŸCÊê´Ô˜ÛµPèäÓݬÙwM‹¸=3|ò¸ª!x'Œéî=ì´ÚIã :*O­ñ>zˆÆÖLçþ„AW–j“(¤&„0 ßÒu• ï2(Pæ ã;Jb¹—»Y­ƒû¤Õ/ß™«Œðhk·Z“GÑÇí‚N"W«ncnèZÄ—JóÞ…ä¼ ·ÀE’Ep †6þ¹#. ·ç£—å·L ìD #Âoœ‡êéÄc›iÚšjí #i. Î6ÊGaF ÝMF5{(pf ã±5þ|Aú=^¾l“‘ ÝÄÚÿ´øù2ÓéÀ’þi$Kx±ƒÁP0ͻ݈ÔGè¡ÇiìNGÁSÎÜeç*Ó܇}éÛ$ªËÀW(ò¦]uæ Ù0̨;üË€a5ËòúRÈ<9S—Û­tŠSÊq÷tü ?“ǬqÝÙlìþg„žœé¨!ãÊ&Ê##óþm¼ö#†ÌÑ¥¦pIŸéhÛ1éÎ%Â'Ùe­øù>ñ¾Þi&Ÿ–õ?Ufä®N_5F#—i§ÈP_2$Œ ?Ö¼-k€Ol1ùQÅ¥yÃËè´%YEôY†/Þ{K1RÈõ–w¬C—®Td ë±â“m‹ŸÝAÚ£;6¾JÜ6™ÞVFHl‰h‡=.í¼4oè [DQ[h¬hœðã¬U; ܧ‚g‰ÉM²uxÑ‘¨+b-Åæ]N{^yQöîrùØÏΈ‘VÇhÏl <ü–Fƒú¡á If2ñ…×};ú/ÇVrR…î&GÄ XNá-é Œ0ÕëïÛÅ–I9,)VB‰3û´Öê󬀫 š9¡l¿Å‘ý±ÉÖÕµî_ÑVɵÅ:Ý[õÏJ­™K­o4^Üš»\$+¹ÔÜÇ•¸âH'¸«‰QMãôºæHk”ýƒ𪖩µ­©.6=´8ÿp±’ý)ö:£oI›”Ò´‘|ð¾ú™ôð1cwîPcNåø¿ìg!5%´”8w‘8XúÏÎ{?GaÙ2e¬„—íè:ND›³º”žß‚ÞUDpQòŸïåÎ>°ª@(³ûîÑJf´ð„Q˜âC‹Wåþz¿ðöö‹¡»éd¿%÷䯀 ö„|ÁÀ¡«¡¨Âr(6ÙŸuQÁ½K!ƒ[ÏMœŠ),~ª_×–žäó“Ií%ðê„6šÇøV—›.4µã^J•0yzâÍ8õö à,#¨—ô¼]š?ÓØ“Çë%ÚåÑcú0UÑV Þw!Çy¡:a&Ûfлc„ò¶³örÓ5~ëÞŸbEnØñæ$ÏÓÁz¸Ò;¯8̲)½y“×B;"m%:®€ÎO/Õbœ‚ý”cmÝ œF{J¸ÙJ<òÙb.YòV»õüJŽ“,ÅŸ™ðüR[Yà\£…—KëI¤ŠuŒŽ­©ªèâ*2ûyí/ø[öQæŸ"¶[cß[Ì'iwö¦Äyü”–¤Î6•ÛêâRÂVØTË7ÈY“¢O®ÕL±=y Samª;ôaÛ¾@AÝW†däOT˜)õÝ aɤ±.6„¥í²¢\Y%„ñÒ:·jø>ì ‰"‹%ÄRÑTkÊÅÄ‹pÀ0_dÁ"oª/@¢<£28TfDù»“ì@LùC°ÅìÚ÷k[F.¢o K,QÄ8äcvŒ|C½ÑÞǃðÛE̹‹ìÈT Ãô¦á†œV¤öP°Q¨R¤’œ"`¢3ŽXž¯d¥»ä©•M=a’8ߟ{$† Ï£vCT¤* A¸i…ƺV“0kÝšRå Ø¯†§l Æh¿yûÀ2setl<̵ã€UµÅ* ŸÌ.4DñS‚KùÃÆs0ÓXÝÓÈ ˆiá±cÑÛP›­ÃðÛӌі¸¸t¢âG³i¸qÜ¥ ÕóÔq~ŠŠØêå”èþƒ]îÞÚá;òâŠͬˆPMxÙôüy<¢Štn> ¶¾ë­ÌËR–¢ÜX y DÂûq¾ÕìÛ²€ú¾@¯J«‡Ð?&âkxº¸ÝÍ’†S›˜G¹´ ¿›\Ü §öÌáJ!Píø&vÖFD.XæCd^öº¾¦š‹ ŠÍ‡³liaJ}Èp'„Y‹Ñùê2á1øÁFȰò3Y§¼ü2ܻ若×Ú˜ìY%1þËs¬cOÖ™ –o„èQ³ÊŠ\L¨çW%xAûCÄq–ã›_#/ë2ù:Õ•F¢ r>²Uçj®ŠÅÈéW=ù! ̺à_8’uÔ¥&íç¿‘›×/1~Ie?°£½é„èž§®óÆ0Q)|ªäÂý¶¬Ê¦¥º]Âúˆ= Œ5”9%ɨCEüʩʣ‡‘9%°8„ß¿A¤sgŒº“>§¨èƒ­%AˆJ»ØÂE‚T™²õ4))bu]0°ý µzߪ ‚“j¼ºÆÕJÚùëg~¾âÑúÍ,åZÃG~—uGà(ûë>+®í·+Ù_P/ìò³Å¯¢‰íd ærñ啽ñH\¬•‘ØSKÙá8SØ< õÑ5•XM “Ö1ƒwAwšYLgm8fq2–EšçO*ó¬òr|ÍI;â oÃÃn~~‹¾œ4$Ï•æ:õìó1Ê ÏÎOQ¨aÏ’a;]m‚XG5¨5›4f‘Ç gG¼WeŒº&ºÏÏ¥NôPðøn4x!‘hßÑæùD]ţø,Ä/ImÒj´^ÜëpÛ®ÅCa<ÖVªé´²Ö¾“**‹=A~ð³ÕJcrk2:n]¥»£÷@õ»Ê8‘%¥4ÈÕwõùÀÈel «ˆªþc¡ýÕ—r;I<²ìp¿Õ”T“ï‘zèQ¾yµÙú3vu¥âK`VAøÆ¦¾ Âc(35š¤¦ñOtöôx1X ¢›^ÉTìëÕÅ©=Ù“HüÑ)|Mì„Nì´xìã~%˜!³Æ0-?Í›™–†È–&X]Ù†üBeÖY»,ÖßQ§uÝ,²4‡ÙvÎ1>z*¢³|»¨JO:ûøCê›VÝžà´Õ`†Ï!xÃi@_Á:BŒí‰7 ¤{¿Ìã@ >qlÒ ò¶ýè Ql,lùDõnÅÛœóøÜ_#"’¤F/¾ÔÑ[æÇ™×µSˆ) ù,mSÚPž–«ewv¯O@ã-‘ƒbk–Wí¡°0è„ù’ê·m.@R‡þóö Mt<'ÉFÝûnY%þ ñëåƒ ‡Û¬ïLn8µç%æP wº?ZÃóõn-èR‹¶Ÿ¡Q!ʃéRBs醂° ¶ºkéˆu¶ä?HQ^À{G¿ÄA¸èu¥—@µâ`ìë•êZä‘£K¼ŠRoÉ]ù™wß¡‘©¼®Iž½N–m­ôß±7¿:"¿F0ó<»ôk;SŽwÉy>ÏU;¶ ×¹¤®– mø’Y S)·)W´"@|°~ ˆŒð†^ÄBÖÆÏxËX†¤´ÁW~x;Å<…¥ír(æ6óz¡ÿñrÕûeUuäáùFÿžÞ´?Žˆ±0Vàîý*-n€êaî;}(å|zC‰Ôví‰K,¦ô9– ª½|oï?ÁIÇÖÓ¿ûŒ˜ø5•[hÙUW'è­FÓEý¤:£AÈçe_äNÃ6¦&3êLÅþØ-³§wÏ,ç3óÓŠÐK u9…Õ»¹üÅ<‰a»ÿ2Žüñ®œ&$Rùd5Ŷ ‹?ký𵆵oÌR´ôjn‰©$À²gP”òľ<Ì—ªf.™]Ãô-Ó*à“²@"œu§ƒføFdÀ·E:¼B3^"¾0_¤ç ½¸÷âKÅ™?MÊ™¥ÏáIç~¸SãbA²Õ$= Èð[§åÏž ( ÓL^¦\]pw<‘¯M2ŠŽ‚àj¬ÚM ?‚ÿü˜¼…St›(¼®Ss^óÞ°÷h8º°U£&¹ÍŽçºPz›þŒÂIÑè!¡½÷ó¨âF™wd£Í]ëQ*ë[²#Ôt;&…ÞÓEšžf›Øn§›VœP¼g:Ô“ž|™!ùòü—öKKYAaù÷úPC1OÁf BQUÖ­ñ‡h · —æâªdUAbÇ óüo¥ƒ ˜ïÎîx8G1Âìd§"•퓉€Mm4»}šÓuT=BSjAN…q>èûéžíû¾º0¥Ô)šËÅ/JÉÊ„96®XcÍ…,™~Ãq×_wÆô‹SF_J-8šÝÔsו‡‘[ž‘d@E6[ÃÀf)_w/þÞu‡"—O'´Aì}9¥ß+¡]ž [âÝ­rgÕíú«Ûf’Äü,âÄœHR ¡ºM]{ß5þ;Ò¨óDZò!˽GíW"å_ƒ Q)­ÀçtöT{=14Ë“Kû¼¡âˆ‚¨í»I½’r [íI–£Es¦•©‘º'Ž\ŸI㬇†·îw“Z Ó< õdÔë^8§Ÿ‘Jc_³ z|Nã÷ x«aøEFÙp^HGÒëëñûˆ»"ÒK {f„*”9‰ÿ'ÅI«&NAßü _zí¹”SB ÕêsÏm}>U€“Èh¢£/﫞zŒü´i&¤Ë­ƒü‘vT/¦ˆ•îÃÚ!ʹڴgkÌC.¹Kºå9ë><š†Ç†² Þ.MfÐߥKyòÓd’ç{ÞÛ ¡ËCgÉÀލMÏ1Ôò»«M@—úr wÝžÕÞvz~oÓÑpâõÔ:³y¿Â™êÉü q˜ûؤNoÇ<š_V¯8•zjßN–çÊóÐnjÛlYn»5v²ªïîtœ_ÉŸ1gDàu7–ÓLÏܦ[ ;l¬èì9ðErâÓ*PþQ˜ ÚgòÃeæQ¾°N·£îÑïÀµèR÷0ùJ•_KX¢ìæœ÷ÂQ-'N?#Ä[5]HªÿSe¡Øq?mrëkòÖÙŽ¤h>;-)‹{d¾n¨‡‹*W.ÖF=:EñʤÎÁ ÔKƒ-¨˜£)@X„üJ>¿îÆ$•­ºÈÒÞVs†ÀxNÓ–ÎQæ0ˆ}¦1'Õ–¡ÇÅ z9¨Â Ýô°!S/D1¼Ÿ‹YSo|—P¡ ýЦ —ðKÀµSêŒìP•ùG¾‘èüôÔµÁg%¾å—4§[vþ­¶c² 1·¸ ƾÍà Ú#[NhÈYœíPD'¨Ä@ ¶Yè¤ÄmìP\šx>c3A‘rRMýÏnVF¤úÉâ6 æe3L°ÊBçeÜ|²ø2ŠYëcc‰0˜(θ?Dˆ§¹‹‘²j¢¡+ƒš[Î9H\méHcU?ùŽ¡HËNéôZMÓô–~å~°Õ.è8Ä;ºÊo„†:%@ÇΩºœôæ|x¾‡DÒc›Ô}ß>9L#GðãÇ}ТóØ=‚sˆú7Í(Æ<-xÉÆ7 bû(|ÆÉ…q %@u¾‹¿¨Vorñ*Ò ¼”˜@Ÿ· só Èçi6’Óò› çf÷lì.‹YëÛÓRòË]±e»™Ó•<‰ž€½·w3¥¦»§H£òß²4G¼JïœGršòÎ^ •uÂß}’‹îo\°ß¡s Èv5®ÌþÚÒõ\¶úIc%³è‹AfK7"ÇÕía.F°@Bí}$/ÌÌà ԩ`!›ÀïK‹?ïSð–¿\„,Ô·97_r„AL,ãø2«Ó=[úk¥*®Â ¥}Ø>éi ¤¿N‘m¹Ÿ‚ ‰Ê¨”âbžÕÔ‡”‹(ž´¹8eyéƒîwEpPýWüç&ÃçW,¥Á¯‡qÂa{Ìvza‰]ÈEœÂö…´Ð)gz+)ÂúâúbÙð‡ ä[•AŸz†:o}V õ—w9‘ Šî²Ÿ)~ø”ï ²h½M–2ßëäŒ+HOãÖ c˼œõÁÞœQÖ:ÈÓ`O}$Ä›!kìK° Qàžëée´æ·MÛà @HÆDp’ UK¡;'{0:Æ`$¤…õ¬5I@¼â&Õ²G\aúÎÒ[ÓaoëÜ «À)«UŒS¶ˆÓG­._ä²¼qÜåA›®ÛX/©!®”ŸoÑ_,ò{ïûæC›U8®5Ö¹Äu»3&J»&Ž@ÃÊíºðlQñž¯Q[Õ‚í@v'>7ù¶ÊR¥;q¤°Â¾°³4Ñ_×/Y¹èS™ÔN`+*ë |¬cذjµÄô i,¡°S²ú2Q›Œ£Ki¸¥È7ÖëŠ:gÈLÿV^Ì1,½GIõ„„óaa—¤‰è&æ$î^jùäxƒXæ‡úxõ¨&®?6p½î–ß?±ùe°+’à‡ÑÎÊ[Z4æ²xV£T Ï'‹øÆ^W¤.Z~ |]íyÜ5ç®Ð¥9^¤µGaï|s¦~‹e»^£¨‰ÀP%PZ´ÆÎr†­0•ýFôÕ †¶%–œ–½:— Q@&TÙ1°ˆéô¶SfË Úíò\Óùö«kÌ¥'Sž‡‡çpI#ÿ¶çpkšCSçÌÐ!BŽbJXfêŠ`D³wÏÆ¸kI;=|=RƒKѵcÎ:f® zzœÿËë±O!ãP…n}¡´Æ u|ñ@™2Ín†=0ë',Ër‰ fl«ŽP¶qÜsÊ]ÎmðÃ8oŽÕ;uš0Ãæô·ò-•¢[+nÅIp5»^ê'˜õ\7(b1“Ä-Ýèëí=Æþª#ÃÇGÊr•ßÃH‰Ë¨×¿4\6·âLWŒ‹‰úRòîÇb¤&N9p0z)~³‘Ûï0ï`“YK!Øt5ìÜ®úÑ`ÀøÚ¯{>«dÇ:‘tžéÆVN^sÑß›Âzè—°•P[G¸ûš;y‡åÒ¸jôœ3:)IÿArü¾æº„ĸ5-r…¿ÑÖ@ÎrbÈ>O±~)ô3ÀN2Ô “Y­E³e–Ù?ľõz†Œ.èÐòCWA¿Ó'¨46õâ–ôuüÄÎ_èg÷\ê]·kBí}Ñ%xmÙ‹Ìýx¢œpœÖ໬¦ÇÊ.$ä†yé@€É–lÀ[oSªf¶¬IKÊ`vDL‹øh²ÄWǘk‚_}½å®†ÇŠ'èdý•|˜txVÊf”9* †ž¯b0—ûó²ô ƒf‹+TåcuFx¿ÿÉ¢X®x‰ˆ…¶ú{öPÒ¸imróïÒ2¤v!w:ÈW±Qj!ßu³žŒ†·T1ÙO³0…ÒZ³"K( ü#"ÚÂNCû?ãà5áV@»wvxï>­ÏCJ|ŒÑÍšÎN?%–ãðËÀ³ÜÅx4rªí ¬vuâSÎ ìw‹qô½ji-|Öîw‰gW¡óåeGMÃs¹øxߤà«¥­\"93¢âÆ!SÈèb¤v½E}ì™w;4Oq{eSØ£ùÃ}ËÔ‰(Ø„‚­¬17sli—%kè¿8,K%•pø%¾H50ÐÖ;Cï+ØܶD¤§þýæ£+B÷㸧™a_ô>‘™Å4†¤Ž½(fÂçpÌO ‚P!¤2™EØÅëØ-Û•ã”MÌZr7½097ÉXÇØ[Àv”$?hd›¨Ön¸ÇdrHkFöQÍ 2áÝ:ÉBÉØwÔ¯Ò!+õM(?™¨™R_²é¬Ã™¿qOçqœvKű§ú:M+OÞGEÊÙMl&cüü¼ÕDÚâä¸âGA0€ŠÐÇqÁÏPÃ\{b‹ŒoÖ‡ ÁO¯«ž?vc’®Qâµ×ƒúY®÷<ïÛ€7Ä'“‹ ±D¬9*“yáǯƒFŸ1hoEqêy¿Ì v¿ONá•Ñ1a Âp{2/ËI‡Àb[V¸ùÛ†¡YüÖø¨pééùŸ£‰%T/¨§¶:5¯èný«Õ² k¶?•¸¬ßý„¯C锊í{*dµŒÉ±oé1_»8“°tSÉï5^;…Øé¹&›ø@¼Z¶Kz»©zíMŒT–|œ£T½c³¾boœÒŽ`®Õ&s˜"ÐO9Âh,SNg’oG¤y 'Ñ©6â±Hµ†q-.äH³ÿJ‘BL;ÛQÑå×\Ñi»¬³øðaŸÏvÅñåÓA2¹˜ð¯¦üñCª\Æ·ö(~l[£¢Éè\buyaq:.FÝòêÜ÷E’ Jz7‘WPH˜žá%IïZÛš1lDIÅ$BÖbäÉ®ÆÞ™FÈNØ ‰K<âŽ*ä l°IS¸Yh¹ÂsOCøÜRÑé¿4Q½}F†³Èil}!}}{8¢/YúuÖ4åIJÀÁf¸!Èß¶€ÂfJž@òàS4b‰dÞù ŠÈ_…~2Êë*ôsQú(Ÿo(§5¼ËèV5¢ª'ã ù‘#qL<¢%Wä廯A½Ûƒ†w윴Œµ5Ö{ÛG[Ö‹¬lQä~m9î1ˆv>2ìä×=b˜”9ðlô_[Ùó²ž;3?I2´ànUt°21Å&[]f„½,Có‹£Ð pzMê¨b°7ŒÑÕ¸¯=iB;L˜ÆÏKp9lØ7͙п¿‡'">æéÝÚdñZwŸÂ  ²(ï´Ñµöu-<ù¶v7†hÞȨ…Û’A¼ëŒ”âlÿuv E+þx.È”@ض^tŸãOäá@ž al 7y‹×ÙÒφ~©oŠ™ö³0üØ‘°=Æñf€8Ý÷¦D¶Ù¤Ÿìöà‹ö„¢ÈÂÙÄ’ö¯aJAäÎ6±Gƒkß7ÒDõ®ï,ùˆž§ªv‚E"é’½ë¸;¥Õýw·Ë1ä];Œ-½¹^ZCfü+dÌ\ >î.RãÏ"Nu%Âíü·)ÏžÕ«òZå®?n:ÐV)Û~YiㆆŒ P`¹¤: jþ”µ}Óyåk³$8 $ÅZ³°ŒÀóT79ïc -.û68w‡°/ä ±¬Å` æs˜eCõžðÍäCÚxÉŽx»¶~ôÎ’ZKªT­Ìk÷3„9õµÐê?'ZŽÐñ{¶S¶³ÍœØÛÂéëæ¶FíW2eªÕlE=Swý¦=!;nö3Îk3®€Ftߟ]Å{äžÛ‚ˆïBYF8±°)õD!©„£©É¯½ƒ‡ nÛu^'–D Œ¿œs 2íAÐóe“ˆ ‰ÚföéCHù›ŒØ“ègÑ÷Wtæ;šT?ûÑÚw0KÃPoó )ŒWü|”vIkˆØÿÁoÕÄÉ Sª¹Í,¿^bµfs xÊ}——jŠ2ºÏøÑ{i‹yF…ð£²Õo]}24(šNÝëA‡Çomíœnçnù9't }’ÙT÷ë=ee“=l]/-k·ÎÐy9“B߇˜22ac'IßIUuå~nù’P„9"Ò0"Pµðym¦ýQ*ÎK…DØö…l@ÿ»žŽÊj°ÂWíñœk¾ Ëh¼žºî¥#©W%œv½·~#Tê^^il^Ì1èOƒÈŒ.û.nï\f’éÃ.Êú½«ª8¡ä(‰Ñ­ØáÛ°ks E ¥M.¿lŠ×FµCV—÷Q žô‘yù•hP3¢…©w˨W¨Q§ÿ”ÌÑ }Ø5a˜J]Qx!¿9 ÇFÙQ^j½cu§c0Ÿ¨)ð‘é\_]‚Së*/ß´—JÀL>NWM@yIÅZîtÚ"Ê/54šF‰&Ø®¾~ÉÂ’¢BUNâõ^Zg_`ãäÔ¢c\Íuiú¹•)šOG@{À"=hmAÂ2‘h_ú–¾×ˆâXGc± ½ÉÓz*é[ÔY4¾‘r°ã5°>ý› 3+Üžý£¦¢>GîÏׂ¾¸Â œ„‘ç®ì‹LžéŽHÐMyáIöZ¿\å¸zN¯|‡ §>6ç0Søð-1—þ9uÖ€¨Í|Ô»lÀ>ËÓ÷àçÜ™`;㜠µÖ8g±a8ëÆL†Tžýà»â«O2w«*¾è+ï’ÙkÙŽ·îŠãäÓ`ü×î…¥ˆ&¾¿aèM'å¸0–.Æ;"ƒQ#w´XUб­R®¼¬} iá]ó@ÞHuâ^— ×G«yp=ÍŽªØæ[ð‰Û¢Ò‡p¢Žº fC.0fáå3 «r`%3:ÑâpI“yþ”?»¡ñÎÃÎBê³”¸a!WNÂ4”òнpÑéÔð¹Áâýû”ˆËþ/èØ±~Œ§ï¿[Öü8{muj*zmE”oÎ X)èwû‚Ç~xq©(¸S[ñ¢ØµX"µøJ¨ù‰ÿ¤oë­eé„‘>Æà:ôÛ03Ûƒ…N62e7YÚî‰èQí³—…è¤ ~2â›~†¡]Þ’¼šº»0ḭ̀­©ORmOwŒÎnøc¤áyD¹Øn~Æb•$¨oú$×1 é^˜ülr?)Fܰu ¾ª¿UíTJ™7S¼ñMÕËY†'PÝÕð$÷lÜØ\œ6‡w VT]D– H&R•?xS¾ßåΖ[•bÙõaQÓyF," ’¯ô3Š(ïìä»2óhûÌçå÷/D, Ÿ{ûY¼F·ÅÞd“ÕçÞù6Wm 8k°Ô2ãnìAà5åiáÓLàkð´2_Tàq4¿PsµslÍš´µ”ÇCQ´i¾6|Á#FqØå0c= ŸQ|Ès‚ž®‡[j·-0?9uÕ„ÒA_o¤ÈøxÍzó-Nl´šÉ¥ªéÅzNkö6¼¨÷žR·8x~%£`"øM9‰‰mÇÜjéù ?ms]ZDŽ2n,gÏp¹r`‚]rˆÜ&c޲_¤3“.×jÐ#™~âÿ"õ› endstream endobj 89 0 obj << /Length1 721 /Length2 10244 /Length3 0 /Length 10811 /Filter /FlateDecode >> stream xÚmxePœÍÖ-îî‡ÀàîîÜd†àî$¸în‚‚»…àÜnÎ{î9·¾¯nõŸ-kW¯½zWu?=µâ¦íí âr²q´ä4U9ø88lÜhôôÒ. 70"cáè¬Z g'€‹ƒƒ uövÛÚ¹˜¬˜ÿ t-¬ÁN`€.Ôê¶²ˆxxxHx¸º³¹¸‹±ý-Ònv € Øþ n ¨&`’WÓȃ  G€º»¥#Ø  ¶A\Ą ÀñßÀ ±ÿ‹“+Û?  ·¿Äl\ NUYmI¹jÚYivmi€Ä ¢ð·âæ*ô ²rqúWw¬·ÿZŽÿµ,ÿký7ëâõo‹ “` ¶rX‚lÁ4ö馱øþ¶vwþOê/!׿üL5dXƒlþ¢ÝÕ,œ@&i¨“³»È  µ¹@šP' ÈPN`Gïÿ/îÿ"Ý,þê ±ý«Ç¿C`W9°ÈZìöWj Ç¿ý×ýû\TAÖ`w§׃þêñ÷D­¡Gïÿ»åß6þÙ]I_QFG‹å¿ðOZbµClZnµ´p±þoàŸ´ºøßÓó2ÿ™&çÿóU-Ü\À^#¶Ç¿Ö,“ÿ‡’’‚zù¹89@n.'?§ @‡ÇÿеrwqAÜþüo/ÿñÿ$È d…¶¼µ³Oo‰(-šª@d™š0×aYà„]ï>3ÂØY›íœ]j“å{bPN[ŠnÿV¼l¦±Haìý‹¥Ž2Y »ÿJ[aPóëQ£à¡>ÊôA—ÔÉJ á,úÂ-se9DýýOv¥¢¸òœ±æeßqÖ?/Í^Cä™Mñ² _1@[,Õ8Svá…§–â÷›Ëp‘ù¡gô¤fv…åÁÎ;‘—¶¯Üèz¿-!=~*Ý?ëÚª¤ Q®¢aƒ‰9*„<ÓdäK^–§çFWÚ2Øh]S’ÒÔßhISò”y¢¼¤UlX9Y±:ü(”—£vúƒó A.bËçkS¿"•Å0ý³uýÁލdʉÏÑýW.fö{’È’BµE"ÁݨSÑZ|½‰CèšVûà€Tܱ†=®Q=?O€Ø”°"D¦)ëúöû=Ó~ ÿö[$Õ&àv iWÇ¸ê™øÉ8x\Ë+¡ä\=øÉxé^ó7ÝŸöð°,ñi–eÀkRv¿(wòPùjÇ(~9’®º'Ø›9JÉÀ6Á²æˆp4Q@@[Ýum•Ñ><ÿØZ|‘ì8™9•ìÛt·ÀlÏHËŸ®ƒ j僞_q62:gŸs"Y5™ŒÁ$rÖ]¾´©°‹;·c8ë8’˜VÆaü:Y3J>¿t›`x|ìlÙ…ÛpG†ƒ;Gjµ¦w1Þf;X"ñl’=ÜëJ‹èBe\8ß“p+¨âz¤Ÿ¯§ð µÈ_ZÄÝŸ©8ifQ6—ŒÛšâJ{Žïl‰hé£uÒSå„5¦ëËX þ¿T4jÛHí6¶5ðü$ûûåeБßÍž÷Q¡}à{üi0¯Í—™?h½0ü‹i©Áµ<åÑï¡ þ†¹&ƒ™xO _"âØ÷þ wbÐ*õ¬ƒª[´Ì€vÔÙŸr{ÕÖ1h=¥xÑ/âfgѪÌoºø¥†Àb.w¬0XdÏm1[hÖ±ÓãŠu×Á;ÝV¹¿ˆ ÀŠÌ{×z5g~AnÎ’'S0Óˆ¬C½™… ÓÇ6þØ ¨V:±jEEsÞdÁíH£ÙÇ¢ÑùgO»ºéY;¯¢~£¡ª•ý˧6¼d@3…¿¤­¢†ìKiŒç-WÜ@Ýô'­ŸSEYüI 0 ‚Öée?"zdéµÂb|r?•¨‹V!ÛŸ–fË5ó‰‡âìç÷AÐ1ÃΞØ(Qæò¹Ъøà ‰À×ðöã.Ëâ7õ)±Ú«S¬”«šZÇ–߆‚ÛH“¶ºîaè¸Ü¿z½}/CtO/‡£IMÜAfL<±FGt­DL˜†û¹?ÂEG_×öéS8‰fÒ‡­[&¡|Á"¯·Ù1]¹ÐÞOÔŽfþ½<ĺ9D””¯s[Ük:—/øˆdçÊŠK®Ä`VÌ‚KGñd)/(J£F:ýÓðË›$ìAÅp2>ó;PÊtd§²ò˜†Œ©11ZY†^P¿Ô‡ÕA3Ïn½ä!Ó)&a*˜ x”i(.4ºZ˜û”MñffŸo>‘/ìP ¶rq½h^×٨ثqó™ŽI×è™Ã`—!Ìaιº6œ )} :nz¢¨tp½Ä)“¾•& ð©õvn̹_m,šC ¥ÜNƒìªo; ©”EÔöž±T%ÿêþÜå|%h/iÇ_wlVym1¡³râ9E2/sà’­.—üò†ÚcNLœnÝ$ùä øH‚‰-5ÜÊl»gëï†jœäÃ…j\RJSd ¾þùð›$dR¼}¼¸ýS1nàÀoàÑy—s9PØzúåŽv­ r_°ø‘H?Éà²Bƒcrˆ0Q¦Ò¨BÞ¹s×_ ®ÙÀ]`Bäeû&2,íõGœ-võž°¶ÛÀ“s/O¬Nõ! ¸åäsÊR¾’/ {Ü L¤ê¯æÄ!ÇU<˜TAÍÀ<ˆNÀ >ôÏöhëwÙ¨éó¤+Yî‘¡³;…é2—`‚JOÒXåM¡.ts“ÛRŒŸ{vÈê½ô}½väøËÇÞ‡´m›æ]º5ÞÓ…û¿eÂÖÁ§Û£©â „…,š»}÷¡ ¼"R½•! 5ßZÀ¢?Œv±ÜÀð…R7|ïZS³Éè±{½Ø»µ­Ã%É$MÒÚת › M4”L|eæhôu¼+f}Œp¾e¸¨ûŽ›»ÀeW´gùï'†äF¢zŽêêå9—í4à[œ\ðtcÉöiJ×Ä/(s³“D!g€@CaÄÏÜùð³ßu+d¾0šàUŠXÌcèûì¹×Wvêä'nÛR>ÅÍ䯨®,ye‘ÅHtiºÇé•S?˜aÉ©ˆ­ß.÷Hq)„KR®Ä‡üÑXý»ÃØ¿®8dƒˆôöig‘5$݉.#Ìn|RÀO+f…U~:‚xò¥q=0m€v`«WRék—cÂ/´Í¹â£¦æ6D2×ÐÜÒ¯GÂ2ù§Ñ]?¼%ýe2g˜ýí^-f¶]£×A¼Í«Xþ/­oq”Ҕß»ÑÚhÓÓ¼lÝ/q/$nå ÌX{Y‘^ÍZÿÙd™w#§C­ßhfýÕb´©Sß¼SªíNe·‘¾ùjæM¸¤G/ ÙáQI}hR µI³©šæƒxš±Ì°RÁìôÚ#å& ‚#íQæœÄŒ¡Ø÷èµ¥o$Y“.Õî”kÆ ¯ün<@¯Ù«!°Ùá³Ì©xg'•Êkþ»®˜sÒ#ßU‰q[’ó=×€%:ì·W™ðRùöÚ®ä8c^—’ý~¤—>ŒŠ@~3Ëž©ÉNTÿInH›’×Iˆfð¶H8é¿ç»xÁC><·I Ý¢î€Oä&s‚$Ìn‚Ö´‘× 0C„O ùÒËJ×^ â4†~ÒCh/‡žƒ'Ï_ày}6¢ð<Úˆó.uÐë LvèG_ß{p‹cï4Ý\a²4]Ò¡ù9©xt-‹px¸yb½Xã-K#_Ž¥?/â¾€ñ·5½þÀâçO=Uã>‚fr`†I?IžŸÞ°výoçNã…aN¶ç&’fZLH¾Ø/ãAÉZJêšÕ6˜óí÷y /‹‹B Öw­Æ¯t¶Û­­ÇŠq‰pF}ÊÍâÅ] MÉMy•F¡Õ[¢5“N$;O…÷Ãs«ö±«ZY¦©ˆ[Hüs°aL˜m]h7!¥{3vÛ²òû$I‘§¹jý ,åⲌRàô±/°_ð¦ì3tûëÓ.¨Q |0êÙ¬wæ•ôAñ9Å,?*j¬½+¿ô¸‰1ÛujÝBH;W¤éŠÉ?íÝ+×~ þò9o·¢Ó_Hlu›=q„Pl«æ`D&,¾ä3ÙJ"^IË~ÍO²ËPQDŠèÎ* c]‘é¦ uI7g`—òÉ=BÜü: ùŠ)ÃrØ@I;:Zv4³[¢"µ|c&¦CbcÈ{MLhE=M³š:O÷ÉaÂ×wgZ ‘âï’‘Ój¼8|%Ç™\ói«CúŽÇê 6<93¯æ–Ñuƒµ~¥¾‰h®*¹šwÀ}[¡ÇO.ëÓmâ[âZy¹Ê°F¥à]ãJšnE-*ˆëœ²×”ûÊýÙ#»1áDJVdÚŒ¡,.d×gkV‚%F!¡WØ‘èõ+t‰ýëå“ð¡a íGgý•Œ‹6­0ƒªô%šuu$Ñ÷ûÛT5IV±¨ÝCåºoßîo¹ˆ1v¨îÖ‚UÅ(>äž¶}¯ÌeÒ·f⾟$"<¾Û&üu¶=aÿø,À <ö£ûàÑK#5ïB!Î|#*"&~ ®6¶¨C«ûûv»³Ó¡£Òž™Å…Bõ_>ŽW¤ 2%ö¥ÍD“°…Ú8Xª½LE€Þ¾íf.žˆÀË„¾ ZÀÔR»¢D¦Ä—ìQò}¬¢SuæW©ø¸ŠV=‹ û[<ßʼnŸšz–*]f¬Å&Œg9¨ }櫾äòDi¸îY‚ьݤÒ(äÓ:7£<ü‹·c›JOFÜe'-.¥ÿpµ,â'‹Û‚6¥ƒÞÇøÊ¤ä×VñEÃàVof:ewÆw@⩊Ñ9¼¬UÔnbqåÇBœ[êëÓšk·ñ»—Z¬ Ð[Чh±û+ ¾á .³X´!ŸÙÏéb˜½ÃM:4ÈÒDuð6ivÙ _å> Z=“G¾­‡éô‰×î4¶à9R>Z²ñ¨Å1’‡‹¨/ÔÅÁ.+¯%†yóÖ(vұ舂?¦³/‹¶ñ€fzãêË(m¬ªþ^YÜIš€âëú¥%‰+ÏX‘QÐñ9:]阽ÜäúL7ð¢ g|N@b¦ %%¶,©ŸŸð¬£@úèªßâêš7½›™ö^&/L4%O*éð:£WxXê×}fì™NõÉ‹Cž« ËÌÑ´‘ŒÿyqI~eÁsù™ñddô!¯…˜ã•óiRN¢a8\ÛD}k³ÓdçD89Îì8©Õä¦u—¼MißþÞÆE¨-îÛm-„%+Å,äÄÁÙÓfnäIêct2‘îòÌí©Ê#rJ5Íé~ëx©°Ýùö[3MpFAZRº~N+ªdAñ!yG&ެqŠ w&[º´–®?~C9µ¢²™vUÈJ¸ÈÕ¢xkü¦DzÊkí©Üå2i0Ëî;gÆ‚Õ5 ¶¶) IKž§ŒÕ…­öØ_÷"{»Ú¹ƒé .ˆDKQ™Î1´ÑC™‡¥yª—PlÈz5Æl–^ 5[û•º3Ÿñ8þÔvóðá>ö'|ª|1é*:zödIùŽÌìœâ5e˲ãïË ~Ž/н Þ'^aÎ.{•Æ(­!ܵ®„‘¡í}ÞÙW×5¶·š;°k39¥‡aVx·åOûüÝ·è‡ã(ã‘`[ÏŒ¾í§¥#¤B,q¯&}ö ¢ K¨QC Whß³eúüû“&Š€æÄg'n¦°Û§ƒÒÝ-W’ƒ>'ué`â2Ýš,Þ\ô¤82Ò–ü­%vµ7aä:^M4ÃÆ¡›ýëÉKä=Ÿ›H¡–²ÊšwkˆU„C¦h—?Q¿^Š(,w•qÊç8É/¾> Ù¢ª((EV^=r[Œ¥¾«s Ë©‹1 ì¶Ž‰cê¦U×,¢þàMé˜ûƒõ!«<"¾úÚ"™TPm`Þî¨FP½U(‰œ†ÉÖDAQ&*,Ê„=nµQïæz{/•Q«³ÉÇG"æÄ˜¿Î±Å$–/b‹EóÜÒ¶æ¦CG§“.ÐJ¨‘®c{[ì@Ô£ªùºÏ/Ÿž€¾º˜—[ü•Ñêg³ºì»è”ãžçVõ©ðËme®rC›ëzR¸=OÌ5ÊS†óø*Àó‡rí-ÝW Ty“Š(ñå­ÆÆH9‹{"VÆWÓv5BÕùX ùP:mn¬«øì³Aw}b nÖïe¹fH§qF?idj*]öž˜=MÝò¦%‡µÿDD4™ˆÝÀMÅ)Koãç¶Ù ~|“ã9(|[Ï>½‹vìp>öÃj .ûÿtÚõÕ»®°ƒEµ\¦¾JòmY‚{4¶jåZxŒ×!ªÍˆÿæa:ñj¤þM¡YŠç4-çíÒ‰{xþÌ-gÛò3¶³åƒÊÏDZ\£a˜FÐÉCîðB»7Ï{- sÊR+`M; tšéB¦ŠÛ°{Kë±SV­jøò$‘T˜ˆ77h¶.`ʯ#xz$Š{Ô;¥ÿ2ò¹=H ’Æ“ruP+tÂîø´ú!}ö»nŸ»!Ê£~Y¢_çðŸW=­Êi¥‚Ä£ts‰FM攡üµö åË݇դa£'Îê^ú.¶Ë(,¤8‹Ë®ïßÛÀJÔìiOw¬ßD6·JÞý~M*^ß^u1úôõm4£Z5y&3ðœ;¬Q¸×PÄM?k±–óéC6ï uøSðé"hcx5˜úæ¤Pó¼èÓe¥‡´w»o†F:YÕxQwnd,#§uÇXYÄŽ^õJ”©;LE@ÉŠÑrÍÿ¹ÊAù‘ ïøwËÀAþ7ÐàL?eé-×òk÷²#8ßy94ÉØÔ/³ƒ&ŒÅkF(|Ûi}lÝJ,lB–ñIÆüÐH¯Ñï¬áabÒðØZÉŒ±š¹J0IÀþLÃÀR¯ ¹÷ÅIÚN8Fy‘·^b}?í}Ä;œ*2á9B^NÀIA´´p?6žhÌRçÎO9"(õÇÀ”‡ 4À¿ÿu:ª4j²¾ÎC8»ÆÙÈ…µ²4.ÒDýSÇž³ÎI£I~ÿ’°ŒŠîþ[<ëT){ɧœ Hõ¦ÛI†PÏ´e.Œw3*»‚SÌD4ð üÇsÖÍ©(x¾¹ïßmûcáѧBŽ(ÌéT,#}÷qîOdÛbþyÚ0Œw¸åG˜Ö/±¬âí²ÅAP9‹ºr1bMÎٞÒå{¢ÁßA1HiÚpY“šïšóÜŸS€ë«o¤˜YÔˆäª(fS¸…2¹îu#ÅÁý©ËC×s¬·eËk”qž\þQé‹÷V[-9»ínaûAhÃs`]VÏ¡\Cúkž[ÿTcq›Ô5‡°# Ù­øA i€-’q’«@ШƬ¿í×Kê+I-æ`[ AŸªcÚÐÕòk²Å››TEÆf—Z9&›„i#Rïµ.ŒÛ=yò‘ ;’GuY6ýæ%TCµý½€l Š£äÑÊÒ]åheÊ) NÞQ­Ð¡£XGMR0E‹sôˆ¤žóôPÓãè7÷ªÐªØµå¨•- rñ™ñ|Wú2K@·µ`z$µï¤†Òrn±C@½¤—ÇGVÄÁêýÈJ%î?éÞ$°(J\rÏóÈk«ç0âÊ¿ºC‘1‚>\£cû_´èŒ”­viž´&`%Üë¶]áÝÆ&YêAgJ’¼¡:¿/çVŽ‹ù¾I„ ‘½u›ù÷aÓøÙ´ŽT&ݽa Øpavoúr17 sÙÆÇÇoåqƒ¬†1é‘Õl~¨Ü˜;cWRɰÉÓÕÈ´RÈ“å$ìEAZ^0AsÓ[¹OdÜCô;Q®“™Ù-êG¶¶¾G/ë™ø×ÇO@ž°Éó)Ò‹ Îoû È1ñ‰‹UŒ:[›B–ÏÒ³6¿Æ}ø×¡1¿_ ÑÎ&õ”\O¿^Uɨ 5MÈ»÷¥²lð;bÞñýàîÖ3d¸³¢ˆ»¡DÊŽÙ£; &Îå%Ãͤùu  ]ßøÂ ‘T æb±Bí?œÄX=€iÁ¶%}çðçþd„§}?]×{¯Æ#4*I‰PMF¸±À@˜O¦wäºI˜èÈ´ª3òÈÜ+=†®÷µ‚‰±¤Å@oœõ4¾I9ÄÃ7@–n¦ú{’6²6Mº© H'ÆY>ýõÅ‹‡ƒ©Äf:ëé7o -„³Ö•UÏoH¤ƒ®bÑU¢×5z3¨Ÿ¿žqm#a¬Ç>¨þP“K¼¦Šc‘*½SíVQ!ˆ*ý¯·TŠú‚ )ÝX¦ªôM¢5<±-DÒD«r\bù’'T{ID‚Uá càß÷ž Ö¢6X?s·þh¥×HGyçXÀÆtÔó*TèëÏY¬„Ò&Àú,܃ßTœ¥m¡³ËK½ŠAü!àBíU_¯ê#÷äg×»Ôûï}+ßöSWØ'#}í±\(wõ.‡6¶Õã}g84—×–ñëÇ‚ÿ×ß±ìÕÐã[âZ⛞Ak]4õøÈ‰‹X!ŒÎÍýÍ’\L´þçñ=­l"vÙ‹ÆÀˆè&&½jÌO êKãE]%³_iÛ¥w‡ æ+ƒ'O4ËÍÒ#ãEçÆÎë"Z·ñb+ÉÂŽ^ËPç¥ñYmÃÄz2ɪ¦;·M[ «Ñ¦N6î©HËSPÑõªn¸}Ê^EµØ±v 3uƒ¤"N‹"QMJ—VÉRèýiCÔ5ÇwŽºÖ4k|ô„q¶q¹kj-ñ˜ïg#³T8m wõŽÙràƒŒüÛ#„öû€x…I”¯ßÍmÈÊíg0÷$pÌ(ÙÚ"<“ÌÒÊv™Š ©Æ‡JÍ7Öïü1 *cSt4\•tžeKßëL¶hlÏ"ÎŽ&Ÿ˜PÈÙjÏßÖ7Ø £;dÐH‡˜—ß- C‹ð c²ê÷ øSWv\Këð!Ø?ó ¯ì;Oû§ß€ÐßZ*÷¤Ú4_¯œaL«¶Š,åMG±’ñØ}zõ'wDú,MEtÃ;2þt…àtÐl¦hÀö²½›¹!Ý]ì´Íå:h‡Ý°pRí\È1ÊéZ¢'0gîuZ#*¾gÔ¼ ™ôçâ=›û.„=‚zZ-€æôÝÿ9û“ª†Ò/r&Y‡uœÕeJ”ÀÒÜiõPŽp!©B 6 ½L$ÜíC½nWÕ”ßhnL”^Y¤ÇvgéçÏõ”šUø¬W 8xÛ^ûR‘lö¥‘Õ²Ýþ >'e„)ñF¦´—‡'.¬.e PF8Ç Óš2f²ìÔ ‚…šÛ E¼ƒ!f¶ŠL䢴Õî»ðÚ¸ÏA§×ÔœsÐMªi€¡gFn ×4š¬ ÛuF}çªDÓ6²±Ë•‘=|Pÿ«ÜeìégM’)TíBƒãob+ª2’hTôJäÏd÷¦ë«[©F–¼Ù¯–nqe¿1›Øq笵¡<úÆ U‡è;}r”­¡Éùcu0?ª`º~ˆ_ë6p;Yöë ÌöS[¸>pEY¢CÀ¶¬úXÚ¸ÓÓÚ~îüwýϾ.ˆmöØ"B>]†¿M¥ò¡ÁAäÃÜ+Éöóè/iIïÐfSøJÏ7æÓŠXâÖÒÁ>ý¯#™Mm*·f&õŠ‘œâ…†¦2Í-8&‘V¤´ü çEÒIůòÆÆY\%NŽ… ;mîÐQ]– ÌÀ[í1A·» r0gáìE:!Ûx IUõãjDce #öZ!f™!ßgîFà€j)Ý­¯8D¥Š¥6™÷Âß5Ñ Ê–ÜǾHà~ÕÞWýÎÅŠo~¼†¼o·4Ú6O¶6Œ.Y­ïakš»üQÔ64¼£h¶c|<@€H™™p¢çWGFGBqo† ¡h ­iíôñó0‚7¦ý¶à}iUðø7âl_¥o¡ý9o)iñ×fÎH‚¼äÒxvЄ¼Øˆ¥yä*ª±©>üAKÁcñFŠÖ&ï!Šh“KüN˜õÈã³z0F?“˜dâ›ùÙéϺƗÑyÍJ³òà?ÉÖø¤)e5Aar÷ꡎ—.³ê+Éq©yb“˜@Ï(/%’ó­:‡K%·~N+(ïfAu|x°U—SŒÝ¶øOog³4 ×éB¾”±Ã¤ð&Ñò7,Ó­iiaÕ¼‹ƒ/3Æá(`ùTIæ>w…uCÆm.U)é5KwÞrÉ·ù.ØGêr8AjvN~ß";|‘½¯'îë°M´TK ¼Ì‰»Hühåx6ô­ÌY«² Ÿ­ú2¾óœ¾ ïs*»µT®‰iãE±ÞþäÒö§Gÿ4—…ÆãG`÷)W@kF­ò>WÇZù´îlt¼YÝŠæõÕîå{3…ìù^7J(kª qð>‚”Ÿ.†ÆÀNb3ŽõÑ+*O~û­§ÑÌHú­ÿ:†’¡)2Íõ)`•®%«åVÛ~ª%´‘yQÃNš³ÜÆ‹õ­²5iÒ͈fÑ-HI‡yùìUù:÷|郷2SNW4pŒ¯Áa%8» }=%`öuƒžÎŠDè¬ÏÞ@NBÅ‘nõjMÆoƒˆŸ¥\aóX"ñÀ‹‡Xûú®’Ô4ÅŸ¤ ûAx:e|pijñNxMÂa8î^m+Oœ…ïá€x±¾žK”–Ú.ƒÒKP–Þ}¸ñòÄõ‚ÕÃ.º¾DS¢Ýk·SçÍ>4N·é¤›k‘¨[áEïò63üÒHbMüá7}]PõùÄìräݤ:²ÞGv½)Ëb™“ vi¼P7†žFãUæÙ¼†È—·ŒøŠÌ-$GºÚ¹k({ ÑQW·bΕ1&NcŠßéŒi*‚‹±3ゥöËêåÁ®ó{˜¦Àìfôw-ùÚ}v‹g§“¨RdÖV£Ž¶E‘…‰³—ˆœÕ†6i¾îi¡…d¿ïâ'Ðó#Zº,6´.³*?wìÝ~§³6د-鸪«¼0wÑ>=~®ƒ<©f‰b½Îxõ¥½·™–tb5QÒÓKˆÑÏýæOî2Åëæ ‰pYÅ\°‹ $Ò«êÚÂÆvZ¼ Þ„Ä®mò×/Wˆ|0Iù=1¡œ+t\Ø=Uh´–Ø5Hoê…ÈZ'f2·¥º¿,Ö‚î ¨EmLÐ íóº]>D$~îâ´jÛ C~“º_RÙ?Ž'òòce€Ñu×ð-/*†ë†~*LöâKµ«Ì<½hæùƒWøò­Tþ._€Ì]cêñO¢Üp©'ÙÆ]¨(¡ô¼™ÁÙîñý•y6Í1ƒ+}:¦ysæò5’Ú£g!SmßhÌ“r‹=Ôt=•s6SD;þ´²Òÿô"¤ÔS,šq.ŒqÌ)_õ3\Ém½yHŽ3ÂípD̨æF*9Füg¼†G ïâÓj¥^å‚Dówº!w½¦¬ƒ@ÓÅK¤Év¼Åiÿúï-¦òõpç FcœTg'%ižºúƒí_Ö‚H¼×óÞk½s¤/ÀkáŸ%’ÊZ ƒ L’à2Q)9?4ÐnuÕíúÁ²`5ïÓ[Qn‡bX[5ô;ò9Áü2ÿêøiÐ1:ÙÉ Ã|Ý·h‹PBCç6m\áéQRåü‘„ÆÿKl§l¥™‡¬ó,8ü<æH™.V%‰‡­WâûJûبٗiïKQ†ÅsUÊ@p°ÙïÞO)Ø}RÞý¾9» {‚#»1}íÝä¯÷¤‚Ê¿‡*EoÖîÉËþÄÎ2]:ÒÖUzÒùŒX³Š Di$-ã¶ãnÇ÷‰ƒL»&ÍóaàˆÌÍ—}G¥W{8b1ÖŠñzj/¤:!Õv³LîŽG¸ù³œZ²Û Xhsʵ‡í—6ÒäooŠqWzx&J‘iÃå€õ O†ßÁf’)øfµ.¢òxkîÊÝmAÁAðkÅIC‘óSÉvŠAÔépÈ@lWãÜ:,.é)Óz{OX¶¯sÇôO¾ï§ËGƳà£É>é-­†&!úö ÐãL!.,ÉÝðÒ4½šáÑóºø±uoW<švŽu’Úq]vϾ“«=ø5Ö¦¡ƒR_éqòâ¼óõû›ýù4/s:Ü„QˆOxmr ‡§—›•ÔAˆ™(…ßDâ|€ ö„ìG±kéÓ×<î-SY€&Zùº¶~ͯ1ç'„ U‘wþ&J.Õ9°.&Ïψ7Â*²v2mðs&jï³­æ§œê½z¿0­é {q&J|}íêå%לF-NMFæ `›+”;S,ŒŒB®§.rê)¹4›ÍL¯ÔdÅôCî;ZÞšÝÐgÎÂ@n²ú¹u-·Ò2 y– þ.)@}½†RÚÚSyМœAüxö¹¡#äîîM8>×¶ÚwÜÕåt,²ÏQá'²(On†”;«1>öºÁCŠèžêú V ëöã¡ãNuó‹ûŸ?LûªcíØÕà¨Éí¸|w‰xfüøé_‰ÅíØ«ülÁ|Øæu5¦£\ Ù =R“oÆÕä(ñ ÷,¼éMðWņ랎…™Ã‰kf¨êƒñrH„G8ìboA3@Í>ö3²ÅÎįeµ¾w(Ÿ‡,XîÌã–þÐ 6.¢E>M?fD; ŽW¢®À*ÒMŽ›wöó“_÷¤7ËÕ`lø¢Þëe-×’­“ ‡ßnXqA…¸‹ô¦‘¸ôúÂmå=ÃíEnåöGrÇnêÜ? ¯r=H#—ïê¨åêü¹îIH²ŠWrÄJIqG#k* 4N.ê:ÔŸì0Ù? (­t¶¢²Ô]­õü"È?9Ã? ´Œ&¶„ ˆ_þÙ½hFçìô_?Œb´4ã}XGF½g‹¥2ÃK˜ßA._‹ÝkD÷³Q=ˆHÇr®•ƒ¬¨±nm«¾uºäÛÃ0Žûò}‚'" ¥¢…¨Æ¸W È͇Ð~JmIÆZ'ǤN­s3ÚB„Ò‹ôA=¿pOˆ­ÐÇv;w¦U¾oDˆwlSÕ'À`]%GAeåç%C¨+|0”?t"™>ÒçæÅUN r´Òæ©£l˲k'Ê—váÀë‰/Ó±õîHü$pR¥—‡‚Ÿ6*nï„=%ËëÌÿ~É¢y$Fvs¯›§Pmî¯Õ‡ë)#µ—Ðv.Yhö3ËTb£x7®Õ„Ú¸lg´µ·ÏûBª^ ×O{𤋻$ú¨ùª4ôÜpAÕ0˜+ÜÀdâH$ò‡^=3˜=U;ù2ˆN‚˜aoôR…ÅÑu\ÉÅa‰PŒc»l–J¿q»®Ì&Í´_a'ø«Ó®§FAô‚Xí@^Ì#f,Þý{]âôñ½@¨³Iá(JóÐÊÚŒ®À‰òÒ‡›‰¦¯åEï¹Æ€Bͽç|…0s»Ÿ"pg>µÚ严ÿ$¤å"ä¦X@‰OþÑQÒ0’48;{W½Öh€ÎáíSßèÉSXo»•<&Ã-d’\íÞ¿K®H1ÄÐ…µÔ”'²®ç–áDÁžP„LNÎè)ÈRôSXúâ• Ì7ñÜÑ£Ù à·ü|þŽ”,r.Ey6‹¾ˆüÄ4ZïŽKÐKôä© (d—@jsz~Ò¸P nÅm;÷Ék¸ÙôŒqÀß8ø45¡Æˆ¿G¤èÙcÞv¼¿–Lóã$Èå9€¾à³lÉÛ•ëLh,oÆÛ‰í*†u=‚´ÚCdçŠøkl P0çK±ÇnŸ7k»ÒGù÷ËtãOi.ŽÓÞkKácÌL‡„º¶-¢åÝ>ÆŒËi"§[>P’ú|ç8lôÍ1>(§¡4ºÔšJþ?2T ‚—K57«K3îzk\€Þðg‚=]ÉXÊ@¬BÐ¥À¯çê3ÝÐc¼¾RžCS ßËF!º€çg7*¶¨¿}5Üaû £sÒk†Qn¬ÿ\þÚ0 endstream endobj 91 0 obj << /Length1 721 /Length2 10037 /Length3 0 /Length 10623 /Filter /FlateDecode >> stream xÚmxePܲ-îîÎ`Á]‚»‚»ëtpww nÁÝ݇ÜÝœ—ó{έ[õjÿé^½ºöêµûצ£’u°‡hz:9Y9Ù8²êJü6n::)g ä`/m t€–  #€“ ÀÅÁÁ‰BrpôtYÛ@ Œÿ€m;3Kä Ðv°spYØ„ÝÜÜÄÝ\\Ùœ]EÙþ6iˆ `²¤TTõ>)Ë䔵r@{ ³™@ÕÕÜdø ²Ú»Vλ' {Kп4¹°ý#ÀÞ è ù+ÌÊÙ P’Ñ”UQÖÈH±kJÌì-Ÿåÿ¶ÛC\ÿ²ÎàMÇ€ü7²3ûodþßè¿UgGl(œœK`´Ù£°ÿË·OöV¾Ö®Žÿ)ýäòW€á¯‡ŒK Õ_¶«²`r;ºB€Î%K ³=@Ýlfÿ–dçùÿåýãÄì¯öÖãø7r‘y-UA¿V[™Ùýµè\øïwQZ‚\Áÿîþõãï‹Z:ØÛyþÏ•ÇøçBvUe]Eeæÿ.À?e{ K½5@ò×K3gËÿÿ”UÍ@ÿÞžÿˆùÏ68ÿ7W2ƒ8ƒ<lÿZŽÿDFÿË’”tððfåâà°rsq8yyyÜü¾ÿG®…«³3ÐòágùOþÏ"@ ”å ¡/é-aå~2E3ðÌ3S¦ZÌ œÐ‹“=—Ø ï6–&{ç$7š$ùîhäÓæ"[g›Ÿnš©Íâhã1TF $Å4Ö~5ëOjõÆpÚÄ` e¸ËÈkHÆÊr*ÓOVîI‚S©¶gŒiYG?<ÖFÂÒܽ£=N¦þp‡¹kÆ&´ðÂ\ìa{& ÓÍS–n¶krúêZSþ ßÇý¼‡.!+dÐÛ˜aeÓ¢¬ Ò³(‰7¢õ2e ñ”´‹÷ŸÝf*Báá#oà¶ ÍÅòRòŒk,ôdÊ‚4¥™Žò޶ìDY¶Øij/£­Š2Ï‚x‚ÄïÈHÇü7+ÝUçÞˆ»šÞø‘BëÍ]OêäaÇõ_UÔÞj7NÐl"ßÖóçœÍ(È~Å‚k»ÛÙÑ–Ç“ ¬1°âÂÁ„%~#°OæzÜä"±;3pµÐ4ñ›ú’û™ G [ÞïX¯ÁhK3‚¿ PÍIþð½ð`«¡¬V&L^Ï+¨ø‰TµÆ•^…Ñ?é@”VÁõ†Àº*LœÝdàÒ¬ò·(ì‘°¡Ñ³Oä8†€ü"¹zTÖN—´9k Ô^læRø7©Ls†â¾ßºôv?&™±ë7ý„×åPgn#âY/‹&ø³¦æQטȣÞÚŸêÛ5vÔUx¼ûÁ¸ßÎ ÝÉêõËOÝ7ù¹=K>ðò—Ü6êñøVªa9‡`Èì½³•£·­Iåe™øy[DÞT¬5XòÆÜNôÝÍ‚µpÂKœª*‰ œ-ëL,ýȽ,¹¾‘9ñˆ”)h²;ªá”€A’]Êõ Î홛ž ÔfZB’Ú¡7lÎûJÅý^x<ïéùë$´69Ѷ;s6Ì·p̭ϧt…éêAóEÓô¨­ù‰£%Í—‹¶kÒaä2ÎˉÝQw!÷lonmwC[㢻º`D$ÆŸQ~ìÌÏHúo“`¶)öss¢D¡ž'¿º±6Ó¬ôƒÆ•üTÂÙ#Vãìqg«ÅÏ'|–˜Ñï2ÆÖ¸~[NG½€à‹µK ãfo»Ñ©9fè£êºÇ’Ét7¯ÕƒeóWÞ²º[¢Wyêé&k»Ë1ø·µX‰iϬ¤¬ÂúrŸÿ¬œ> ³ ›©þ3ÍÒ3‡Ìa"Ñù¬Åÿ Ãà<ÕFTZ™¸BqoĘ)ò•Þ5Œ” “×ë…I!,Wú-ý^S –„jÝP‘ëNïZ+7Ñ©³#¨W@Ñ&G=½‚é-Ä×lÝá©OUÏ0vî R¦Â/yª¨„øog/ƒ^M^¹ÖZ î ØávnS ÷Vpß¶Þ¿OD¤øÕ ®I¥¨#¥Zâ\nõ³M–O[|e¨V;ðšèÅàªhÃÜWIq`rôê°?øUd)ÖP¬f ¨xÅ>¢ò†z—Z©lý’Ð*ÿ¡ròG¦ë!SÈdÌzû^ƒó‹Ÿ{harê:” ¦£‚8oµ¢7 "TzôQý×;L‹î“ÕNN¥º€3K¡ÏçªHVöØVwêÞŽ‘+¸p“™lû[“i*$7B"›¡sQQ×Ôc¨–~Yß‹¤?‰ùéÉãªò*‡Câs¢ÎÞŒ¼v_æÄ¼NéH‘ÏÌdï_è…ÿÈ4Œ`-ÇHdúÒ\á¶yùÙ³w8\ìMùߊÙcõ…‡¥Uå¬ÚEµûQš¼ô'ÁΫEíÓP˜ù-"ü®°()XòSØXü÷>3gÝ}0q± 0 ¾Þ`µk~åpί)f¾œ¥…籚kBêZ.¯MÏÕTZ×R+玠®Iëf ñÒG>”{çé­šíX Û Ó•]i÷êigN¿Ð릤vÕVµ{EõܦB°•jTTâ=#Ð:Ù].ò~vg5ó—à€ÛÔÐ’ìšðå5'«þ8l=VT°–È­tî°8²t}TT5+‰,¡Ì•ƒÊ霾?å *ùÆ[ÃãÁí¾í!Ü E4TéAW\qEÉ M²3S6YÊÛ ­¢?j@¾WŸ*Y~•;D«1¬X° Ø=7‘<øyµ¤“½þÍXÕñ§¿m¢WÎëÀL¬Óȹ0 ¤ë„㆙²6ê—·ÀÃK¥‘_ñºÄ»—½ÆpF¦Û±±!½åV8£F”¶Qÿ±KlýûÏ’]Äôù®CÂë]MŒîF«CìLù'L66“æ¶X, Ṉw”¡Åõ£‹K!ïµÎØ3è€Çù«›0å”|Ù¹šîÚPç« Ë’&dŸE”ýJa:KÕ}wÖÁúãõêfÚŠ%zr±r”ûY—ÂþDûýŒ³»~ßI¨¬Æ=Ó­-Qì+kžcÍ6T}ŸÐ2Ž9§REQòŽtª²êCíÓ0ò/ඬh{Óžúä:Ç`½ ÛùÊ 4]ì­!ÆN¼÷ã=ªŽ‡ Dâ÷qXÅl ,ØßËâp˜1Dh`µs„Ñ4Ϭhˇ•• ûå',.Î-?AÚÏ.eØ„¿xR±¯T¿UòE¹ŠÕðÊw=Îi‰­0 Š×Ô…Ä!Ò_Átø¥×Ü«ZÅQK±N ¾L|¾}{×N~}$tˆ!1š`EÔ©“["nD]ý´{}YJ5W”ÞÃüX¾D‘¦Ý;Œ6/5j0a2ˆ—”6’KÔOg©‹æ>‹ÕXãoHµ]¾ZèýŠ]K"•ØÚÕ™Ñ"o¨„zÔw…ÖY`?[%-sd…©Ð6àwýk[{h§‰ ŠË·ì ˜‰øÈ»R¿²ä‡N3œ®‰ý’“BÝ&T²<Šd]Í(ÎQ] ÜÜ@ë¿™ê~ Ý×+9ìY,£1Šöʃ…›Å'ßЫŽîŠ:@Z8ø_'¬=cüÑMÂ#`u÷šËáöš6n}ë-éÐ!È ¿Žw)óyc   ÁÓí{±«é0é9Œ¬× ažä|¹¬9Ž1S¼êz ³u…‹¥UÚé5u6çÛçŒ5€ÞY¥Š›•¬/lRÃûÀš<åMÜÀîû%@À¯”Á~Þ”Zqv9#,NæÔv° ¤ÆŠ´EŽÆW2¤x7‹»Ò÷¸ ! ovéß¶Ï›©@ÝJÆOÙù²ñ¨]bøRŠæVO%4%ÍÒû¦fgÇZ°õÃu‹©{¿åQ·±«“دœ =D~f(h©ÂíÎs7½6ÐFŽ)ËÞíÐ_ë•ï¨È*³à F0ÛœFlŽó$O$ÖØ”…ÿ>v*8ÂÁl„].ÂÎP:´ùªë¼dpC4:ß7\Bºï-°gXg‘ЊŒRž­gtˆÆDòÞé€òžÌ¬„!H ZBħžë?Ž;Hyª,üõ>2|ž¬°”i¥¦tCNRRšˆš¿† ºšèÕ¶,ë±>Óàyø$GȽðëÝâßO¶‡ÔoYʕɫ犤ô~Â(ߌΧhøIÌÞ}pJ6AUäEÈó­KÀʂ؅B?ÛëR-ÉhÔÒÀ7Ö}Â"™îº·éȦ¶”5Ž%þõ=Ì.làNAg–‰ÿjÉÎÞ*4·ç•³Aõàݼ6Ãß{Ó*IÌV«$MIÑSgxŒZþ…ó먲@¥š þ’ _Šæ‡†ñè<21CÓWFŽâèŒñE 8<šyÀ$ŠÉ¡²e®ÚnßÞ 3òüò•ž•k´®½îìó±0{([4 ÙÅÕn¿p1eÃkaÞ_mVòÓ%ebrVßXඇ¿±gãG\;Ñ|-)nÁNC}¤• ¡°e‰£EÕL¤—O›à)¾ÆþãòJ |<´ý‰â)ãЙb4^Ùá2ÃÁ™Œ‹‹ï¡SUXв8_.9äžwéêþ‚Óøº©GÖÅèIŠxvÉS›!:¯‹&RÒä¤ ¿3®­w-ƒ£O‰¤V·ÃÑ‘”h=)wB\Å ´xùáû(âïMæ:ãHX ïIw'Knm©T‚U©¢4üXÒ9~âRjéG³ F†þRŸ¤›{£ƒ°v[%…éx5z7N¨ký&¼“ÌbYÒ§T?gq3!¢œc F'ƒ‘u¸]Ë@^˜"jª…'£ó†ÏžÁÀf›mQ_®ŒF£ßK¢ðb8ªmÐÓìÊ…[L"?‚k–h“Š­Ë„_äo‘ª¤:¯E€)îiø =k1–7#awã±ù\j㵫\Sl†,ü(ðÈw,Uàc ±Pâ´—U5æ¸4WFÖò|©úB›ý6ó1VÒȆƒ¨˜“nLmã>÷ëQ,‘”5á[£~ô(}…- 2i“f8á ×ÃÐõf…K ÚÌÏù¨ŠâÀµñÇ’ä÷O9Çv 3 YÝW©ÀXUX¢“+ 6ïµarz»sRAø*g&Ô ;IW÷»#wqD©ç«ë|í²Ýö ™jöÉÙasóºpi çÒ‹þý›%ÈÙîm5;»î²s¼\ oªüŠÞùœ,Qq°A´û=91ÿßޔ+ç7œ*LØøŒ2zSŸ¡R¯/•sG”Ü.ÂèáÀ·ÓoU!‡2vûeç&R–F(¯9N;îK µ–ªö¦ ŠUùº@-òŒæ¾ÆjEþ#¦«, ÞWUÊ·¡hé@ûAD.ßù]þÇÏß\Az|—S*/ã±À‘¹ïg?êk¼|>²Ëž„¬¨Û­òûr“q‘¿q††‘xò7’ÍÑG^ŸjBébøa~Òûu‰Ðäxñ3Ïߣ‚07©?,žÛ‰‡ì<ç¬òî&p°7³¤ÌÃMYF-ðº¾1¦ÍHå´Lªâ‘N\Sq Ë]1Ò—6„È>ŒjðƒepÏâXŠ‹óYƒ÷€Ïš°¯pê÷p¼.öP·_¤H5;ÓÄ.-iýDAœJ/ÁÅà”÷ó‚ ù׺¸õ3fm÷'øÒÙíóÛ²YY‡ºì`Ž”õ‰@nNÒˆy‡}ÚÛp±·ú×0“{¯Äa±T>‘l;&*9DíA Y@ºl œy‰:«¶:çî[ÖÎôÐhÉ+”ñiú]Ò+[±è]ãQÑ ÙyàÁ«©ì[DZÁ)USiºµqƒœ™95>$ùû3E¨yZV«ã…]uÅò„Ÿ–”¿¿+ºµ jO‹°ˆ)çÆhEÊoÞŒ±ŽÇ¦Þ}QYf…¥SÄžCóÄHñ78Z€–¸¿ö –BÛ£÷ú\ì =”Rü(Œ@©Ö5ktÓüÛŽ8P©ª#¶rfά{"ȱ‡ñq"¶íÜ.ÙAº[6T™ò¼–°¹%P×™û™ÏH;ÿà;÷ßÚÏ EÔÏd5rpDâ3V÷¹NT )ŽŠS f)3¤Äò±•| X\¢zS;ðÒk¹Eñ,s°à8·Ðß*ê÷ "yÿç=ˆç‹S@ÔÀ¼ƒ[3ޤVv,Ê!›œ°1rô^æmÑ©CŸ…vN óM7ü¼ƒßY4màÌø!RÂ)¡º1ÉI—µ{Û‚Å :íŒ~½V”lá2¯G÷‹æ>/œ^øïbS5Uµª#Ĭ/$írL«ž¢­l8ù ØõS®Ö¡æœÕsÄÈ*‡¯á»ž g?eŽ _®}ö›õ—8׎yV˜¤Ÿ~^âeUYÃ^ŸÀ†%ïxùÝT‚†IÞ;X›?Bû§}dÓ8• ¤&…â˜Z‚Nâû6R \0^6ˆt=1g¾Ñÿü¦af…ö] ÞsXvyø´7;½Ë‰ñZ¥Dµ¾ÄÚÈba¹5HÔîN‹²5_&ŽËò·¸v„ýf‰xÙŠg‰{xýÊY.}°'[ÁöÛ.n‰ì¨÷â´ªìûø×™6ËÀ"ù7Æ–ÛýÀŸú&cºÐ8JQió bOáËh稙®S/f«+Rù¾ÒŠø¢ë§J[ÜIûƧæ¯-¥ eX{ )£±§.Í2ñÐ/}Å#ænXuPÈGÎvõˆ­¿F Œ@± ø‚³+†gzp×x&dý”¨u[¹>eþއ: 9¨[fu¬€›UÙm«)T5kñëí“‘ÀÊ¿2®Ü³1sõZձÌýÒcpŒ£Q:äPólf(­¢áƒMüK˜Ã±#Òö[çy¾ÊxV¹N™óŸ'(ÞØaC²%.´ÒãW‚;ª¡=ªÍkw­ù³:Mk­ X°µ×O-¹ˆ¨’6Š—ïþ¶‡¤as&4‰Ô<+Ç|ן$ÒS)TÔ©× ŸX•9/`ÙSÐ.Öè[Sã¨U¡%ÄôR8‘ê=}¹þqï:i>ðÒv&,1NUïÒl¯û¡kÍš¸8Âç Ç“å§|8“ETN¸пñ Œ0#Ê&M‹‚yÉÇV·»‚ߟ2ã¥)¸Q÷Eös¨•¿7_ªyäŠÏQYlŠõÆa{`º×ëåMðD ±«ó»°Ö«Ðñ‡Qˆ'ª«Ÿ¸îA“ÙU›AÚ3Ü4¸ {ÅÔa¾ŒÒŠzQO uìÍ´Ø#«dÏÝÀjä¹¼øð5ùUwò–¯ZZ|θfPÎð2Ý2h´EJЫá©kœÀŒÕ.xeËF§¬½`8+:aˆCø¡om-£éâZôCp©¦$úú€B½Åü$ï׌¾Ÿl1üǹ•ÿ$4|¬Y´6zòéÍóç¾^4•î×Iî®@kõû˜c[¬‰ª Ðc\nöcÄíƒ{»Å@pcó¬ qÉBKÖ¶~H Ç^(àÌ/ôñBH‚¶Í¬µ£—Bxž>ót±i€m7RÕ…—ö’âçéÚMC—÷R1ñ´ †öJàîG@NŽýžà¸Ñ'•¶ïƒí¹lÐÇ{‚Ã4»K#¸‡&« Š4é›üïùÕpæläÓСOžú%=³Iý'“a2Ž©=¹„t—s <[q²ùH(LÞ. 㨅^‰ãÇCüQ´Ÿ‚V^944»9’nÍ0©8´’ªHBÁ îÒù@3*Úûïqà‰o õq"ܬ¥ª®Ÿ/o`Š­ ¥ AËñ k$‘ÌŽ;pŠëȉÉ]δåPµ”ÏŒW6õz}÷ð=æ–.Y˜7·N˜ì%kI)ˆŽþŸ>Öû~1ýPp›!€ÿõ‡¤`Ò‚¸ ¼«àYƒã°èE7mýiö„‘¢rµžäOÅ×׆¸¤ŽOæÆ¾IÞ>âæj÷?pªÞø…µ—¹vÐÓï†x ú_ë|ç(¿à+j&¬´ E<Çáætr4wT‡  ¤¶x[hh©Æ¿492ìbÏ®Ÿ•¿Boî)[u`+F Ö#3]ïC"A ÇÌìí³KŠPçJä¨-ŒgU)q„­älúíâLîú.´„ß1ÞB“þ¦îKß%E°Š5užÇÖA‚Ues£C¦¦*Ö§Í~ÂM¡Qññû1ÕªGNÎi3"Àú÷؈ƒb™”nYÊÁ—T~xtw1 ^I[Û¹_Å&B_‚¬Ó [‰9V02b{3CÊyºQv}»ÖgŸ§rYÒ—`«Hô°U —Š;ö;·»hâõÀ‘™½ ö‹à®&”rêAܵðà¼wZ6÷Çøx¬Š™†8 ,%dšÍ¦r Ó2 5YÁÑí!Zt„TyÙ]› Ãüü¨>:­Û”ûö¨·ty(½ sZ­B¥Í^øúXøü4–Ì'¸äÐ/ ¬dˆÔd@Q‘çyîHgÑÿö—%a-&sTÉ/Êæ‡YaG- O›*z¶,O댳E]Uõ1¹9ì0ùM¾´19Õó#5è?†'“¦±ã&Êx»mj¼è¥èf;UDLÂ?Î%NE¯}›#ÀCN›Tkt£8U^¦›¥‚¤—ÅZóçð¯66œ–í/hÜerTË×±u83Ñ*¸ÊËo·J3pž"E1ˆG|ô²Áž™;cT-Ù‚G:Úf£™,H~ÇEð«H^üº…&ÿ“·Ue[²Ç0†Ëk½à°_æ8YµçÚÞtd×{­–aê) “:Z×Û£*ùÖÄýh?ê†Jê1"njxŽÛ¨sPoWžšÏ5‹Yˆ4ñ}ea¼B–Ÿ#u“¾ö¢’Ø8Å—¨ÅüË0'ÛKQ3 º}¾èº—ábv–î!Ò4ï[Úí0Ö¾bîeþt°r ðÝZ•&è¡–_`1c½„׌ÔÑÈì;ù÷ÿûo‹!Ÿ]ÿ a½††„ Ãêz!] ÏœÎNž:MìcÇöÔÙž',aVvýÔ¨y8ŒuìÙ’ |diÙ’ÚÈl[SÅOo ìјá¹¢U.÷‡QuiÐÁŠ%.ÉtØžÏúÅ)v‰äáϸ*ÏÍŽ/,:|¶Ñ+Gôº ƒµ@Ë+ãW”øš¦Ú ß_QÜógx8$‚w†«DäiÞ¤1¾> Ê&Ï£ò)«Û3š3.q\‰U—¾E²¦rûÒÚ{ert½ä :ÛÒX8(öøO\ÊU ¡~†/¶Bñf¼Qœà/U ¶Į̀QmÒ“áA^ªâŽUÓ ‹Y£8KÛº»?”)gµ£ñ+í±“,^õ(™³’\+2?nÓØ),Ç—O¸Î#Ï›bu›Ö•d´x&¯9[Ë"ĦL{+~Q5£U^tú{ü³åž[3D“‡ ÏÞ Sj¢Çáþ€Ý`§Q$TŠ&|§—ñE¾Uæ&Ç£“dÏ›dP;8­_MyTüÙ~N–}>ËÑ%Øs¿‰ßó~Ì ß‚*ø]ëcz~¯oއrû»ææÀAáÌëÞ„¨¼iÅþ*s4ÄyäYþºLÙ:lÂKÙ±ÑËvÌ ñ³¸)æ‚·gÙ…1ÓY¤•°lï©ïnÚíÎÇziñ„2ƒ ¾“Ó©a×öPkpš!ÄÚ{É1à'$‹ÍܾLhXhMdzÍùÙ=@öêjòшì$þé;cê3Ú¬‚P$ Mî%~c»‡ºL¡!ÚD$G È}aïx‰£—›#ƒW7á^‰ølá~+¯ÃñqïèÀ{›ÏäÏHS/¯Ò±jôPÛ¸u¬S9ë° Ó”38û?°SÃæ}å8‹™êâÕ.ìq$9»6ÎÛ·™µ*ü×êˆOo•\ï—^9a تß L Iå{[ýÛçÓÃÑÕûh¨OûRštØÐ*„$£ lG™Þük«"Åìn" Cšðb¥K­ŠHdD®>¿xÇWœ s¦E›!›Wç=AÍ„~ÈI?D–YÙlÑ7K·ù#Í7.Ø¡ß2 u¬?1×9«ÖáL¼øIœ*è0Sùº(ø¸5 ¬ûÓ@XCíÔÄßlBë©Ü]þciHüreyÎжÍ%|‰\ÙS ¸Ã 5 Y3ûŽo• –>¿õÄ\YÙâ%Ižï޵öËDÌ^%ÝÊp_ôIˆV„,5ŸÈº¶€œ¹ÄOLþ|òÂJ6<ú¸ù êuø™R%MCn×®}÷Vþ+N ÝAcg^æÑ±K“¾èw‘ÌEI²AD¥¢½žññØÏ¹9æxã…ÀZõJY•©^­ •¥(™ÉÕ@Ð;5Dj9Ÿ´ájßt׳^еv}‘ëljiV¢Ë4c¼ÈMˆ«Àüo+Ì|´]/ƒ/ uýrõ.¼¯/jû»ŠB(pãeÕà£ô´0y¤6'Ф‚³Ø³ÝL;0iG çî… ÙˆzkçÈÉíð¸ú÷2áÆ„{Ÿü³m kõÔ(1Í®’ó'-œZÈYpŸÝú°ΓX "Ýõ#¾ÂÍå„ZÎ%i? ù˹á{(½cO…¬›¶dtQë9xÀåW>%«$eúb‰o]ZsJKwõw‘¸Ôþ­l»5B0Çú:Ê)ŸéÒÜ*£µ¡ •ràûȇƒ+õË”®©uÆfQñBN?þ:f"¹UÒØå¾ââ',Òˆ ØÈÎïTEtK×|ô¾ {Aþ7 ûúʉý>E‰|É>eŒÎCýÐJ,KBDøwTc49¬S«Oñj_ .lÏÊ88ò|p——»=§»`]_å$E;M—H}ó.£åöaZ ³¡° î"ÄÆ°·`ÆÌnÜWDV¬D÷5óIOª“Éð–tVnŽG‡*Ië» sEòðÔóõ©Nžj†Bý úÓ¿M?Ð碗t‡Áh»\$#jæEŽLXì«„CÛÖÆÈÊu kä ¨½«FäMã =Ž7ú°žHÎ~«ÏOýð0fŸÁé¡F³·3lïÌT3¥/¿ÝÄÄ4FÿAš!f壖x¬ÿ§æ¨€_UܪO’ÙÅ…R’À]Ö‹ØýJòÇÞÃÓÊô<È’ %jÕß<ûŒ qQ)7R#n-J‡79­Çwø{˜ŠÖßÇÛKâ ©|QeâлºêdàÙi1`9êOïRÔMhñÚÊ“¦®Â¦Ð ê-äsDÏäÞžâM.vØXbYó˜¡Î†ºLz˜Ðª Á(ëFŠÏý¾¸Ã°bå„%Z*­Õáäñ79×G;YýÑ—wö.7øˆ¼ÚðÅ>æ+“˜vÉVl3áâ4HêÖÉ…òš®v{fHø­ N³˜Tª¬#Î=Ï»Ê袨Z€þNJC¡gªOy<í¢˜Qdø_´ IV~Ól6‰í{²HﯞZæ×þ>9(Ô|zlK`Ïwe€LVs@ ÷ãp¯‡ž{ò^k•°3Ëm;L3š[Ü-ÊpSÔŒ_ro}|õÕ¾4g޽WpºÿŽÔñ,ÿÄeûÌ6NÇjv1ué)³Úi·†Í%}s¯g¨žEû®is¼¾r¶»­¹°ýÝf´íJþ4ñ—ì0Uø:œ(Nôè|‘âÇ>ç!~ùÖÉÒÒßÜBÞi󇋘¶eCaµ ÊX^ŽwD(óè=6~Å–ÍÓë]ùü˜R2a4؃ˆ%²tÃ?o}ÅÃø-fh ’pSãX¡ž1tiH齄ŸÆÏW¿npšØh­+w;×KêaΕآ¾¨ìLWJ_äp-•ˆmÌÜ¿ƒƒ‡ç®s§˜ÌUñ­6üµã’š;ŸkU¯d*W;?ªfë‚Ñ\Å­j¨Dˆ{eÁ9´i‰¥ržv·:šì´~Oä·3ÈËe):FÒéòžè¸U7‹¿}jG:,××À7`hÌéBÓï ’Kï·l4QÏp–s^žEø"¨.2¡Mš,IVfà:µhcèþÿzRµê6Ž6Üh9ÅŠó ç†'Q@ÀÑ’«ÇͯñibEçh(‡8ŸI\qQó`¥j'¦·ºÐ&„#ÃUøuÈt(zÀý… 1! óódC×Lsuyâ> stream xÚmrg4jÔu :Ñ£ ¢£DÔè%.£E‰13Ì 3Ñ£÷N"D'щ5¢Dï½Fô½^7÷½÷]ßZßzþœ³Ï>ë쳟ÃË¥ŽAã!îÎ0HDT`¨n  ˆŠˆ“ñòª`P<ƒV…â2`ˆp€Äb¢¢ 2^€ ÆÙ‹´³Ç`‚@€±ŽD!±cŒÆ ³ȹºº*ºâž‹`Ÿ+ˆ\7"¼=`‹tBTôôÍ´À °@F`¡Nýç6NH@ C qA€- pú'À0h8òoM8‘?Ю,þZ˜-ƒèªA”ÔõÀ€šÊˆ Іt4¯ÛÑxœÌ5âþÞî>ÿ_äý/²ù/ú¯Šuû'!p$ °AØ!ÑdþöM m‹<ü†?wþ·t-w­ pí¡ Ž°½f?wrCQ€€ åüÀt1p 0À  èYPÒÉýÿËû_†zíƒÚîÚ9Ñ $N醀ë#ñ×VÛB®-úƒ› þù]ùõO?âÚë…cÐNîÿ;òz?èé<Ñ5úïþ”ÕÐ0 ‰¶⯽„báÿÊúPä?×󯘯 ú¿\ŠÇ"Ýæ¢"Ÿ‡èßïßÈòÿXÊÊ7OaÐ#i€°¸’|—òþäžc±4þá×»ü›ÿ9$ #›ÃÀd’ªƒ |Ôr o ôY Æ{·Íi‘­öðgK¿X÷ ¬™/(Øûýlä¿oÎkí}䆯 (Vº{"¹B-ÇXOÞñÚù”Ξý•uZjµuÓ˜ßÜÛÅ'OMúë{$Þ¦ÿ,}â’'O«Š´Î¯m¾E3;1|€Ö´ä§KyzIø!TB3`”½eóøda’0$3à;Å6/Ë3ûì?祳=»Kqr“ytnèEÊGuàÊ2ËrH˜tnèÞ%Mb’·÷ÞÔˆ‰Ìp¿ÄŸsäÚ§é¢ñÐ BJƒæ ;`ô¥ùeî`FX(óŒú¸8WD"¶ãûQã/ø]ýà*\Ò±aÎÈòR„¯ëƨ™oV@~ÊCMŸÂ…bÐýøÔ™eî3'3'>]·±ö¢ã—}TJTãÊ!™{ôÔQ¯ñyŦ–rõØžš{§ } ¤¥Ó2¹%.ÇE“vÊpùüz#Jõ,¡ï™’ƒÐÎ †Jc9u}-*žÕ;òÕÌ\‰­pf4Ñ«&Çwϯ,¦º÷3oäý…;Èô!Àï@ æLG€‰ßl¸É*É÷* ³7¼ï$ÂîWWpñœYQ5Ïš‘“5#­ çµoŒ9±-Ͱ‘Eq?sëHf =ûˆéR¼=]q'b."_{®88ƒ  æ8ixxãûs=™Å³Üe2´Ëèð6R>-M’Ôœ­y$l£$Hâr*Rú±©e³KòÀö¦\õw¬èá:‰(_é¬``¶Mó:‹Ç¦ÕB¸Ô²Ž¯ÃmhRÒ‹±§²@NP¢ „×÷‹ÒÛ>öÑ·šçUí%' 13Ãatã–Ljg„÷öt4Où¿Ú "ÖßÈ‘ò)±<­ÓÎÂþÎuâ·þ¤@V°ÝÕoYA¾38™IôÞG ï ²4_Ö?)o~[u³.á…¬p­Läñ½w¶ñš$,t«tQ«[ â\6Q‚ßbÔ})ÅŽî72K@žÕðw­>T¦8~5,N˜ä¹c-Tül v#$IÇ2<-ßfJÊLZ®õ¨®Øæ‘³lœru^ŸÔPd<»âùÓå=û­†‹.m1ÕMMf+k‘ùm(¢»ä=«[£3’/71¾„±æ,(ž¥m¶}!†˜ñ\Î.žÎ‡Ú”e=D‰„{ŠÏ‰M’^– ðÖEÅ2µÑ !®ÒÂw/ö3+¥§“H„6öì»= íÕMÁ4öA'àZæ‹,‹§DÆžú£iÖ*Ës\F.À® O¥Ë÷â¥N¼²ÄÞœÕ Á6 …Û¹³,öíÖW!£#%X…f¢oÖß·90 )!Usá*ï@¾†>i}áÞŸ|GvÙ‰-ÔÈzï Cù-d9œDí–u1N,t¨Aªª‰² po%ŒÇž†MÝ©° vI°üeʾË&Ä´6ºðÙÔòflVk•;‹âç;ÓÝv…þ^ñ-Yl¬M.#&Õl¬¥^ö°ÇDÒ3 KYÿò¾O¢•ôhËëòlò¸ýu9œZšåM:IQþt½ûf\”ÀjÃüwÉìwÕŶLaG|˜-;+ƒñÛqÔmŸó¹¢@Ù§µ N¥4 8ûÇÕ$ZT‡cgïÞ3-K¥üªøV˜nÊ*?ÉC¦¢“Œü•Ïm YÕ;º’S^cyס‰8'"èR\éRÏ.E°(/^,j&NyûŠøŽ[ë™§îºøÏ}çþ‡ƒxØÆŽ0Q;Ú>vd½àJKoÍÂ×7f>êÐ!ʵ–sø5hêr\TÐù°ÜØÅesn¥ÙëX´×͈à¬ï†œS)lY,Œ÷ýW%!%?íòbüŽ<ÈW¼‘Ó’º,þc‹{rNèå=˾ò^kNtÈ*tU"=ÆìIƒcÞÎÚê#¡â †V#ô{7¿Y3÷2LAÜxiÛS—ñ¡³¶mÓÒh½Ÿ‰§¢NúˆL’´Ã8‡²„œ¼ß‰ª_tòIDíÉp¤/pQ™,gMÉžéZX¨JÆXõoÊ7M2õmÿzC-}¬qõÁÊÓ¹×úîU†ûßm P ¹ˆ4î‡=9[ð+ƒwm™Ÿ+‘²Ù¢­¼¬ÎôþÚŒ®×hí)ÐÏxVmvÇÁæÝÒ5ÊŸßðبD.ò¶ÏmC9ÿÍ+}µÖßs™Ÿ#®@’}AõïûÔ½šÀ tŽž¯ƒ‡1Âû`Sz»?xUÙqeš1J§È€\$þÍ©-wRûxýÇÆ œiVúÎÅn¡Âø$á|3"j‰[=ts"$J5Ñ<,_{c@QÄ“GmîU:§I9;‘<’©ïJŸ­ºá±2–ÒztÁíñ.‰áYYò$ÈÀm~)ü½WŽYv\0 c»³ÓâegsºÂÈ_¸ýiéo_A|¢¯/ùètÃéÍ7÷•A„ˆÀÕ£rÚ‰üËÀY´»á"RMïæi|#!sÑ@‘i€ F™9P¬§Ê›Éï¿ùŒˆNLðW²÷¸ÅNíNu•ÀÈòélÇÔ¼ÄñúçÖšEMÐdo‹œÀïù#JR¶ûöž8›ÊKn•G¦ ì·’')»ëý_Ï{ òKSÁmíâ¹²3,n%K›óìGt~ä»ÀÛöôÙûÙ·7]„äñwœÖyæ÷‰ã=åÔu.G5TñnOMúJŽžOi‡÷½4­SUA}pä‘0AxQ¡')ùÚƒb”¨îÙ€>D>µ±bÝ6ô0Ç*/ë꘤”ùép&8³­yëÒ\¼/¦Ã+5¼D 8®ûÇ’Üšªñs¤Ï©µRúXK¼ÿ®I¿ÈÄõÅ×HdÝ¢xÞà›ñN®»» m&·¼ ÞV}ih6{ÆÍŽºÎQÍÎ Öëz|yøÅ„½'™Âú<3®röeh¡;­Xy³3ú•ìE÷ ="œë×A`¯.j÷“æïËbZ¡©×î_+Ú2fÝò·˜%·–÷§vãI^Ù‹7‰Ò¤zÃ3™qä |“…PïoÖü_-Ég畈—ƒ eWG°Ãßš&P¹‘J/$¦µ/µ32¢pDÇqDwu–&:`µî¤O#4) ½é=l·‚Øp7•‚Xø\¬~\НÄmÕ+Øû™r›¹ð-]òÜhQ"ßeï±ôGúùÄ>xÙñT˜h§Ž êžà›"#U…¨¥Ôêd¬—½5ûi\*ß!³ª–£Ô' ÿìx•ËA™‡EÔÉÛ@}oUïÅ4îÇgnô…¶ÅŸ5¯Y,tñ§lå·“:¯°/I÷šZ¦o8¬i‰oœ'’"ó·vî){¹g¨þdåÖXߟØ;¯ÐÙºEÅ+uÀ‡œ‹7ô×{<³Ï/&Uãi†ÑÝ*âv|0ï”l ¬§éÁ•›ÓµºÜ(k–N1²ööôS#´kÞ><éEÅWA);}:;%lo£µÈ ÈS½ÃË™Ë=Î/Ù³Ôm6•~™¯©zžü¼ñþLñâ+§]qWCoÖO‘b96ew?Ý{Y9Aû­yºý|Ž'?8*·Yf ’d‹W(ËâjP ]¨¯~:eÂ!=ˆ0ùÁÏiټ౱] ²ëP˜àÉEôËf-|ÑÆ6%ý~¿ˆRÇ)Ì'®µ¦ßryhz`“±v,ïz5¯búpìhѵý1¯[¦é³ô$¾1ʪÌ{ÜÂJb˜~ÞÔ¿Ä ÅÄs«;îÊ_<9|9t©«*°ʆãûXŒ|ºJy~¬ï˜Ž>üMÛ©^¾L(ÍÝ¡• £Ö£“å¼K”ØHÚª©¥Ž«z“ÄÔ´ñâD™jûøt󀳸±Þ˜yÂÌì&m=¦t9¢©óù+–rã‰é[Âl±ƒñS3΄ôQêD¡gy+3f^x_«ýhiÔÞ Ëdéd”­3ô¢­š57hm ¢OŠÚÚ»;=Èþ›Ö×FÖÓ!}ê¶7;––µí\+•9n"jqK5T—¤õ«ãÉç¾ç?ÉêÕÈ"Å(Ælœ ,A™]ØDn,•š’¿,fhéa‚¦P¥­)¡¨Fe‡¬¤ºèÉ»3o±ª›5Ñ2Èi@{;H8dg¿%Ìö¨“¯lo V¿éãÔÁÚUÜÞ{â#g‚ã–öÑZúîß#KÍðÑ ¢‡Î2f}õ{U Z³I¦Ý´ˆzEW1©M;7I^³_wó±›^Ã1ëò„cÅ=åÕÿâô!m endstream endobj 95 0 obj << /Length1 721 /Length2 5420 /Length3 0 /Length 6002 /Filter /FlateDecode >> stream xÚmUP”mצQDR¤–’Ž]¤;%—Î¥vaaÙ…¥¥$¤»‘T:¤¤A. i éôçõýÞ÷›oæŸgæ™s®s¹¯sÝgæfeTD!]u½œ @ /¿(@G¬ñóøyXYåÐPKW8 )oé @m:P'¸£ Xr('/4ÜÖÎÀnÍñè#,màŽp4@…@¹Ã­íâîîîÒî.n¼h7IÞ»&(àjÀà(@NSËHEC À®¤¡P‚"¡hK@ËÍ ·¨Á­¡H(†B'kÒþ—&Þ?îP´ë0åPWЕQÔÔÐ(ÈñéÊ,‘65å»v¤«‹èjvük:n€ë¿ÂòßÈêßèß*ÚóØÀ­]VP[8’€ï/ßT0@èoØÆÍéŸÒ —;}ö;96PØÛ аt„ØåPŽNn®P4@eE#`”£%ò–¥#áõÿòþÃPqµ¼óAi{çÿßÜEî µÑ‚»ÞY ³DÜYô7€þ}/êP¸›ãßýÐ;?înÔ…DxýçÈ»1þÈ6Ò–qý»Ê Hk” i Ðq½óÒmó/ð§¬e ÿ{{þóÏ6€ÿÍÕ-]ÑpO€ ?ï_ëÁÿ×÷Odö_–¬,ÊÓ›ø\À#âŸÝýDž|ÿG®µ Eºþ1ün–ò?‹…zB­ f&QÖbÁö)u¯KüòGßãr[èqM1§†Z÷MHá]v6µŸ4¿tiÞzÒZI|ß]RùUËd%\Œd 3›¤9ÇüÞÖ¯báR;÷âC˜ùŽ>µ£µÎ~ø¡kÚìÌ+-ÎÁgÙÛªÎE¤JÀH‹â¦\’ÅØéñc¤‡Yºñ-!t…«œdÔ.$oÏJê|y+ômÐwÂ}Vjˆ]^I ÓZ¨Ñ‘ {ƒÈÒ·Fž•_ŽM—€:m v“a±‘båö´¿ˆ% ýÉÑGt°ÂåÎ<-—AjÝçŠî‚ö-<ƒM*1²h%8³g²Q˜Ð¯›õçl yýo<¦î§àZðíÈ܃À\ëß?ìë+üGaÁ0t5ô2Züú ½s´•îɤ”užU¼ÖrWÇ5^®bÂ=<º/cŽÒ¢ªßm¸Bjý÷¡±ÍIHk¼mÙ'Èä¿ìÄôKŒAñö /ùGg}Ôw¥œûuÚÁÆ®0.«T°êj…#¢úE<ù':È“sgÈmúí防Lî£m¬]Á4-JãP·&ƒ¹ùHQ7±-4ÿÜ@r=!²ìáå·%Š~5ùQR6®Ù”ßj—ÏlXþ§ls_õByÒÉ,yK…ZrúmwĽ¥»âX?²xŒŠCÄú¡„GÞ'›Ë©5í¨;kQ£ƒùÀa/_gUì©(6ÅÇíÍÐ6\L7 ©L®”ú€Ar K\LŽÂlb*øa 1$^°Þ>À|:ΡÿðàÉêv8$ó÷ŒPœOÖÌñ—tÃKˆhE—Ô~¤ìør+gßy’$ˆKOÎÒø©<¯jB2ñ}“Œ$OŽÆcmÎ1ÝæODê÷¡z”~öÔƒÒŠŸ&µlß‚…ëCXž¤^,O¨ŠÛZ»1ɸ§VKUÞágªp|?ŒJÚ…½·þ¬øMµpËOú‡'999uö8×e‚¤…ç¡{ž­Êûùzn¶ÑtéØl›—jâÏGAœE¿ › ?/Ee´Û! «"¹$¹ä°iq¥Û¥ü¡Ý“"<ãšQPMÂoÉ)g\ÿûƒY$ËfccIÐV·ÿ vNIý^¹ Ý…ê÷klkDäo‹Ç8OÁ*¦r>+§]?À1>E‰y¶>/‰è±m†™¨¸tz‹ŸÕ±ñ6$ÇZS°zÖ…x<ïÏÔ=ÖTƒD“M7­eÜSrÄ ü ë4ñËX“~ ÔγÛG <+P" v(WE¯v<­¢ã³ýZá×zucY,[ž@f––pwœ™ßU™'–nÍñx- ÈÝ› »ðçë«pÆÆ²1IÊt‚Ze¨Ü4$ÌížZ ÇÖCd§Ï"Ëz›1„¦®Í¥·ñèùå¨>ßOÿö£ @5Å¥»ÁJ»ò=Äö±üfø€óŠFòÇTv>S[Åš ì¾ywæ|•×bÎïîJ¯L¹Cø,¯îβɢnÕ<ó¯ç¸ÀÏ( ä"˜”FÄÅ$;±æ³ûÔpòEî£Ç€Êc@ÚkµšI›Ïå&Èþçu—?ÜÎ[ÏC”Vh¶VµŠß§ò54J½9hýÚÐ0ÚaÀ=[È¡š0¨{M$¯ÈPvs|®5çãu)ÿ÷[ù$Nõ’i˜Ä]‘ìåyZ°IþºLÛ ‰wi½öUË'gþÇ'ÑZ³ü4œµ·‹ò‹œ—™µÕB{oB «ßq™Ë†½ÎY¤ n”² p*ûÈÓï}¡1ô¢•x+Ê&<ÞåŠLåy™õ¥(ÁaaJ„‰Ô>@WXòê¯ä á»D^Bò¯ŽæÐÝî¶½Öø»bKƒ¶M‹ !L‘Ø0îHm”’dк¦F0G¡ÅË"Ž®ík>÷‡•ÁÅl ›o«š½ŽxªÆ¥ëå±<]¸îæÅ \B>v¸„à 7†—ŸßH³´«–KúÒÚgz¡wÜ>bI¿%&õœé.ÀH‰Z/.3.ÅH³L¬ë®`:l.eqakËŒ h`ú×E° ‹`–-o-•`z`dRã¬æFh’1§N\ÜÈØÏ^šâé}›¼vòc9&i̦ºUÙ’Òû/×˹n;p­,ëiU+슂"ˆ¸7e;BhaÙqc5˹£>§øk·²m³ƒJOÛÌêÞt _KÑûâhK3ØE,¹g½š„¶Æ¦V;1å(6Ï÷²¾´0 sDláKdË5=U:Gìá­Í¶pœ<²ßOCÉGM0¼§Ö{Õ3Ÿ_*:²+W2èÓaw?RÿI·5pN6~šu˜4–JWdNïAµ÷˜ÓKÙE„ñ“y0œG|·›n×›Rfqo³lùS+®ÅÓÞ/‰+·tўôÂ’f¦!¤i¿Ì0ãÏáÔò^ôoËB; C g™Œ‹Þ§ñᆲö¹uÎ뢦eÅz5›ŽõndÓ’Aœ#²iqnPY1økäAZG ÍŒž,·ŽxðÔ'p†®ŠQ¤aR¥ª *».¹B%®vqÿ÷ñ7‘ô]ì›ùõ@¡žŽËDþ7­#˜¼š&›1³‚ì…/‡xˆ+z\¸=ìð£Æ[,ioÖŠj™•öy½wIù›p¶AˆbN÷ë—‰pN+FøÙqQÿî}—±y‚4ìÁ!»î÷kë ‹î¥6É SŠ÷ÔPô™yiß2$SÄsζ'`tHU3C ³[?~¡ÒîûøðH‹â’ºÐpéV”Vž”Ä.é}p÷oqÆ„S5"ÐËȬÔ+ãÈ$hfF=Á»–röT÷D:m4‘®ª¦‹y;oÓ¦|®\8G…dç0Haè~–ü0¦N­¯ûVòÅæã‹¾Bn\À¢´Ú?ªÐ‹û}Äs³x'Õ¦âã?ÜQÌ· ¢U–6 uÒü‚^ô §ãb X;ŠŸ¸(¬_9%û|e€4±`)ÐæÀüFA$1¦¢¦2oÑs—ER6…YÓYÛ ãÅøL #ĵ|óVÒ¸Kä°ס {I¶0òÊËýÃØ0ó‹LRóÔ¹@Ö @Üáýô-ãözÔ©‹µ‰¸//Ê /8ZMW¥~p8²ØÒìSì-Éjùä]–zêÕWRε±á91jÐâq¨Á滾rÙú‡Áä+³½å”J?˜îÂh1Öó¿ª?ÚЯÈs´ÏW;o~}Ü(>_…%™Ú’›$«¨B€ybA†#|³¤ á㥯‡_ú„÷Lý’S|!x6p/xâT\V§'£ƒ‘{X}·8±§Ì2€tK9eŸ ŸÒÃÃ#Idîá`¯±%E’g‚è Ì9ýeÅøö1žýàe 0µI÷zFQñ´m Ð  Ì<ƒïrƒX*odJö˜EÑÌ—/Ê"Ò‡Oˆ+ˆêÒ>ó#À_Öý{×W $ê®LoVcV¶Ú^ᇫ²ìÍk &G÷Ôa#³ yÈÎ{øÐÛ#΂ûö ‘)Ž%<>Ôc/bõT†–¼—z.5½][W°HÞÞzòA (ðÉO'Šïú¼Ã=r„ÅYôÏÅ>ì’´ŒÄ[Û”°¸´÷,­îùBÅ÷!½ÛìÃIå"›Æ…ÏRÔ_ö€%uoM¬§L^ 0AÚ!ä¬ò @V“ä«j¢ a® ÒYoÊÅ®m~€¦ÃŠbÕÐ×4-"F"¬üŠøàÚ´)n¡ îd}wbžÛIdRƆ.HÄΣÊy“=†æÄ…Òg-AŸìsìL2þFtÿÃ=‰ géʘZ X¼ŸpYàÅ”Ÿâ(éÅoîѬ¶5‚¹ølœ¸Ì¤ ï‚§¶'ã£óp«Wš&w—µ™?š0½:¤Æ§Ghþï3ñ,îmI¨*¿}b{¥r^<¦¿BÊ›%gc<¥9pÏ:åâ‹v Y£åoŸtV¬‹Cƒ<{8ƒH{Û½òwD ÅŽŒ¤3²¸®vÎ#* ׋ŠRý:~W4IPÍ DâY§LÍj o÷Þì1yª:Ër™Ÿ7Ì~œbÇà_“L 6¥çýERW¾ö“?+íŠÈɹ¼<Á9ÜŽ£HRTR o¦’Úw\yJ=:±etù@OLPpÙ',tq ÙXsX;ÑêÖg•ªXµËµ@ú˜ÜB ¨†jÓ"rN¨ÒñËsh•}m2 ϧh_N«b0\ÆFÆ^©×ÍÆÉ}“åã˜;‚{¨/Y!L¦›,yÏ^yDVqô¢“ÄÐquRüÉ7Þ0f ,*¥ð‰õÝWŒ\æãÅç˱í<"ôüF3y„2\uxíGl龿] ±àÑ@2ëSÏŒnö0Rι±ù¼=yû`j}¬I#6#÷Ž$(&…P/¢&½·bŒõ±N9[¹éK—zOO§Ë“R(BÊ7xùZ^uÊ2 ±š™|¿‹Ù D¿ï˜à×D}·ý•n#¤ä?*û[gLAìg’ër.àm†d¸Ë”Rsýç𾉃{`®ŒàB¥L;꾇p*ÒPÀâ°d2há3'©uòJÑ­A;_ü@ ©…vB0Ä~ü1™ ¢fhæŠx0v“Õ©ÊÒw×€z×^B¹u“~ÅÒÉM§2+ŠÙUByÊKW=QWˆ>=b¢áƒÛìtÜ-~â®_“EÝâ]L5íÆã—è씢K$¾j¹è±\UëQñÃR¥ZÀuÖÑùíYIByñ ÝäÛàñ4 Çb‡¨1ü,,kˆ.ÞR ½ÑC÷ñ¦}%}çO:Ùõ”Ô·ÇT„ýÀW¹eì&8ÔdÚëP;æ¶W‚_!ß-„ã> ?MÜФïa,\Ðq^L§ì”b>À N[Ÿ …W™H}è âi1é7\½ÃÞRa“96é#x§#â¬CK”¬Ë‡ ß"e¤äŒ%\°‰”¸³ÂÊÒ´`›ƒæ«Äû²­Ñm53Þ3ñ™]o8ö¥ ¸nïGÁ˰ØÝѦ%[²>TÆ­"Žïë_ÒxÃFPg/oü <µ'5YÐ HkG¹×éIË Ÿìö¦šd,Ú}Öî&)R¡ˆ¼¦2ŒãnYI{ÉÂÇš:˜m">“t$çjÚ?†å ¦X=Ícë»Ù/mÏ“Šúõ„ÂnxœC’’"”¾×jrÎTð´¤&Û¶‚uÊûG®ãÆo‘ÑøåŠüœYe„Òž_Œ4ûÏ/òPËòÖЧ‰åå¤ -seá•^…ƒà)³ìÅ*\ã@qr4ÍçÁ0F&š¡×Ïó¾w>Ó3ÉÈ¡XñadNUl>ýZA®º¶&Ã[9¶.Xu÷:êÏ¡Õ> ú~ià¢ÜàgpÏçK,aÓoǺxu u³Ü_:MÈ>Ê¢ñ£È89³9þ™.7ì4}¹&üùä÷sCHhÝÚÇ¢fY7ºq½¿>4Ã{&9>ýô[ ÈÀÉæÆêÉêäOâüR¾ 5n¥\% Çm}™™Ëiü<¶üÓ€ˆ ¹ÛÞWQuÀ%4Ls¯Düc+Ó$íœsÂÔ§™Çþ¤lÓ©ÑÁ4¨ÐQM‰.¯Ž8ÁsZ¬Ÿ=Ÿ›ÓOs–áZªÜÿù¥8ø´SBq=fð^Èéìf4‘L?ÐXkiè…’0‡€Ž|Èxcˆ¿³Ë8(:gþH$;lTæ±kê9”€dò‡]S»ôâ^ÈûÊ‹«EkEX"‡«>‹çÝ›äýyN)VQºí3’aEm)uö¾…kütÖÙqŒª¶ÑqF#1:¤vè Ådh†oÜ^“E½è†è’oëyý¥TÁ ¢Õ[Ô(;ëÞøcA&\`$vifN°Œ!µ,Üjì‰Ua“.7¨ !¦7n‹‡Î\›9±8gà.¡éï^‡ï8ÑR>1‰~öCÈ>öãÑ“æÞ½Ÿªt›p>E?Þ±ÛDûo)v7«ººÊ>ºÄ‰aH?¤°~e¦F"+%î“r@Y8—†E´p2 <úè:M0›g²:Âhðh'vÓXûòzËâ}rÖåxóÕûw¨Ö8µÿîfÔ endstream endobj 97 0 obj << /Length 741 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qØmUªÕ^!1ÝH ¤í¿__‚—m ñóøyÆÌÝ·—ÍDUíÎLÂGÎ^͹½t¥™¤ß·§àî.kËËÑ4ýc*S³ç'öÒµåÆôì>]gë¦î,yÝ”‡KeFÖ×$mÞëÆS°»3¿&åq÷GðÉîRúº™pßêþ`I_Î3[d·Eæý4ݹn›'&9ç¶7UÚaãL)l:ŠÛ×MÕ zØê!YU—ý0rßåÑžo>ν9®›},—lúj'Ï}÷á4>Óç®2]ݼ³û[ivjs92V+V™½íhýÿØ ›~éñÊyû8&ÝX®²­Ìù´-M·mÞM°ä|Å–E± LSý7—ЊÝ~¤&–Êçø U´ –2´XÆ(p‹m“¡¦ÂÜÂÂ∠ËXXœ(W°8X&˜LR4â=z¨Åu«kTÌGEåïm7hçáË8KÉc`Iu(à!a <#œG´Ž »>ÃÎn-tJ!]O2Çø`œúñãÌSŒóø#§¸­'œâ,<Ø“L€%q¡O8\Ï€™:Žó 3ht ‡,ª+à9­uçgŽCwËpÞDÿ‚|ŽOžRÇɉ#ɇÛW ºmè—’®1NÃwH=8!õ Á éŒ4ôDCp&q"p¢œüBCT/ôŒ9ñ¡!ɨ~Bü }ÒéîRqÒ‰óTÂçFIŸúܨ™ÏŠ|nTìs£Ÿ¥|neEA¼;~æó¤òÛ<©â6OšßæI‹ÏyÒòsžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçI§>O:óyҹϓ.|žRîó” Ÿ§Tú<¥³ë¹_¾û¥ãmÂKz}öÊK×ÙÑ=·î¡ÃW7æú"ŸÚV¹{ÊÇÿŒž‹à/@̪X endstream endobj 98 0 obj << /Length 741 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qØmUªÕ^!1ÝH ¤í¿__‚—m ñóøyÆÌÝ·—ÍDUíÎLÂGÎ^͹½t¥™¤ß·§àî.kËËÑ4ýc*S³ç'öÒµåÆôì>]gë¦î,yÝ”‡KeFÖ×$mÞëÆS°»3¿&åq÷GÈÉîRúº™pßêþ`I_Î3[d·Eæý4ݹn›'&9ç¶7UÚaãL)l:ŠÛ×MÕ zØê!YU—ý0rßåÑžo>ν9®›},—lúj'Ï}÷á4>Óç®2]ݼ³û[ivjs92V+V™½íhýÿØ ›~éñÊyû8&ÝX®²­Ìù´-M·mÞM°ä|Å–E± LSý7—ЊÝ~¤&–Êçø U´ –2´XÆ(p‹m“¡¦ÂÜÂÂ∠ËXXœ(W°8X&˜LR4â=z¨Åu«kTÌGEåïm7hçáË8KÉc`Iu(à!a <#œG´Ž »>ÃÎn-tJ!]O2Çø`œúñãÌSŒóø#§¸­'œâ,<Ø“L€%q¡O8\Ï€™:Žó 3ht ‡,ª+à9­uçgŽCwËpÞDÿ‚|ŽOžRÇɉ#ɇÛW ºmè—’®1NÃwH=8!õ Á éŒ4ôDCp&q"p¢œüBCT/ôŒ9ñ¡!ɨ~Bü }ÒéîRqÒ‰óTÂçFIŸúܨ™ÏŠ|nTìs£Ÿ¥|neEA¼;~æó¤òÛ<©â6OšßæI‹ÏyÒòsžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçI§>O:óyҹϓ.|žRîó” Ÿ§Tú<¥³ë¹_¾û¥ãmÂKz}öÊK×ÙÑ=·î¡ÃW7æú"ŸÚV¹{ÊÇÿŒž‹à/znªb endstream endobj 99 0 obj << /Length 696 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MS >Ù_êãP·ò{=éÇsæ@öd”ôÇöçºkŸ˜xäœ;`ÝVY×`Œs4½JaÓQÜ¡n«þª‡í¡.’Uu9\ßèY6î>¼ý<¶Ù´‡.Z.ÙôÍž‡þ“4>DÓ—¾²}Ý~°û¯ÒÜÑör:-d0­V¬²WÑÍÿ¼k,›þ8ãóþy²LÒ»ðºÊ®²çÓ®´ý®ý°Ñ’ó[Å*²mõíLrŸ²?ŒÜÔqù¥ã• â5F8@ šˆ=@Šð)&°  È8Ô¹€ÂÅRx u€Dº\j2H—†ª¡ÐVÁ¹0CzL]ø Âb°ct‘I ©g$`htÑ‹0œÆ\F„áŒ0ä†sê‡á jd< —Iê6œ»õñzgóñºË»þê W ¤qÈ’£+—Ÿ#ö•ñÌÇkÄÞ .‰bªsré…¤šáæÄç†bïmŽXú¾„Kß7ǵHß7Géû„û¾nb§>&jÊØµäuœ¯¼ú•ñ1ÜV™÷•âÜãâµÇ‰Ou$ÕŸqWèS/%1{\øxB!€§ÔK(hH©—TЖ枃»J©Ïϯv×ÜëÁ=küÒ2ø¥UðKÏ‚_:~é$ø¥Óà—ÖÁ/¿Œ ~™Eð+7¿èË¢/ ÿlì¡ÛÒ(/}ïö -+ZXukoûìÔE?Z„ãæÅÛKýqíƒÄ endstream endobj 100 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH ý÷ëñ#xÙö?ŸgìÁÜýx]OTÝmÍ$|äìÍœºs_™Iöss îîò®:L;<S›zœ==±×¾«Öf`÷Ù*_µÍð`É«¶ÚŸk3²¾'ióÑ´ž‚}Øý»ù=©½à“í¹ÙM;áà¾7ÃÞr¾›f¶ÆnjÌ-ùeúSÓµOLg~¼À8÷ã ãâþÈ)okà çA„8 ö$`I\èÎ×3`çAfŽã<ÈZ]ƒÂ!‹„ê xNkÇyã¹ãÐð"œ7Á¿ _¥ã“§Ìq âH`òáö•‚nú¥¤kÌÂðRONH=CpB:# =Ñ%8“ˆ88QA~¡!*ÉzÆœøÐäT?!~Ž> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH ý÷ëñ#xÙö?ŸgìÁÜýx]OTÝmÍ$|äìÍœºs_™Iöss îîò®:L;<S›zœ==±×¾«Öf`÷Ù*_µÍð`É«¶ÚŸk3²¾'ióÑ´ž‚}Øý»ù=©½“í¹ÙM;áà¾7ÃÞr¾›f¶ÆnjÌ-ùeúSÓµOLg~¼À8÷ã ãâþÈ)okà çA„8 ö$`I\èÎ×3`çAfŽã<ÈZ]ƒÂ!‹„ê xNkÇyã¹ãÐð"œ7Á¿ _¥ã“§Ìq âH`òáö•‚nú¥¤kÌÂðRONH=CpB:# =Ñ%8“ˆ88QA~¡!*ÉzÆœøÐäT?!~Ž> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvH U„dçCâ°mUªÕ^!1ÝHDI8ô߯Ÿá-Û@ãçñóŒ=˜»¯Û™®Ú½…œ½Ù¡=÷¥¥?w]pw—µåùd›ñÙÚÊVÓìðÄ^û¶Üڑݧ›lÓÔãƒ#ošòx®ìÄúždìGÝöa÷ïö÷¬<õBÍöçú8ÖÍŒ÷½ŽóÝ4s5vSc~É/ÛuÛ<1ñÈ9w…¼©Òö†`~ÑÁ擲CÝTýE Ûƒ´@HVÕåxùïòäo?‡Ñž6Í¡ ’„ÍßÜä0öŸ^áC0é+Û×Í»¿Qæf¶ç®;ZPÁx°^³Ê\Cçýyw²lþÁ+åý³³Lú±@Ue[Ù¡Û•¶ß56H8_³¤(Ömªÿæ®Ø&ªrT¾„¯PGë ‘¡Ã2†wØ`24XXºBX8aÁá ‰…ÃJû‚ÃA¢`R¥Ðˆ è¡¡‡^]wqº&j9)*ÿìú‹v®`‡ÆRò°Ä:(à!bx8ápŒØ÷¹ììׂN)¤ï‰&â>0Ni¼‚qFãÆù?ü‰SÜÖ€'¼ÂYðàNR–È}Â{àfØ{©çx2­¯AÃ! …u x‰k=Ç{ã™çàäàExo"ÿ}žžRÏÉ‘#£¿¯xÛ _J¼Æ °B ¾Cì©bÏ8!ž‘=Ñ%p&r"àD9ú Q¾ gÌ‘T†uà+ägÐG¡N—š£N8O-(7ZRntH¹Ñ ÊŽ(7:¦ÜhE¹Ñšr£1+ôè‹wÏÏ(O:¿Í“.nódømžŒøš'#¿æÉ„”'³ <™ˆòdbÊ“Q”'³¤<™åÉhÊ“1”'“RžLFy29åÉ”§”SžRAyJ%å)]\ïÌÿòý/Þ&xG¯¯^yî{÷ úÇÖ?tðÄÕ½¾Ç]ÛÁ*ÿñùô·£—"ø »s¨s endstream endobj 103 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°ÛªT«½Bbº‘ A!úï×ãGpÙö?ŸgìÁÜýxYOTÝmÍ$|äìÕœºs_™Iöss îîò®:L;ü2¦6õ8{zb/}W­ÍÀî³U¾j›áÁ’Wmµ?×fd}OÒæ½i=û°û7ógRúùd{nöCÓN8¨oͰ·”of™-±Ï%æü6ý©éÚ'&9ç¶P´uÖ`àL/"Øt”µkÚº¿(a[è „duS —‘û®ö$°xýqÌaÕîº MÙôÕNž†þÃé{¦Ï}mú¦}g÷Ÿ…Ù‰õùx܈` étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝ۹׬“B|Æœ‚>âþ)þ;ëvÇw%gÏçáí4Œ3‰ä§áô–’>\ ‚‚6ý§ã°¿ õEJ™€õØ7ûÆ8ó 1¿’{Æ~ºðÏ`W(-ú¡;]¾è·Û%=°ùñýxŠ»‡ñe_,—bþ+-OÓ;qü\ÌL}œ†ñUÜÿI--=ž‡·B«•èãKª˜æÿ¾ÝE1ÿpÆ[ÎÓû! Mߊyuû>Û.NÛñ5K)Wb¹Ù¬Š8ö­iÇ[ž_®¹uÊ•MúÑzQ­Š¥Ò)V†€Ú(TØ€àx¿àÞ¢ žjy‹°°!ÀÐÔ•µZÔÀ2àP="¦ZdÔ0\ÃG©R\¡·”).–2*ÎШa!„U¼Ä,†³ÔÛHð° `+jÐÃ.¸5Nα@èâ°èÐVK-àxŸ%ô˜Ü3š% A°YÓ€z¡ÎšÔ>kP#¬³¦õ™5m0W£oš¦Ã¾žj­®§Üý·.†ÐZ¡ŽT$X/©)n)æ#W—„o(æ“oÀRZÞ $K¢p4’ŽZ¶-bâ\­1¦Ü°Jä æP"Gñ‘XÔQ¬‚i/8ºkÉ^€ÂZqŒ:ZsŒ½š9”d š­Bù Ž)ßsLù-ï7½æx˜ÏJ›¡¾Ò`¯ažÉ½)f¥É$†µ’1™¸ dÑŠcªCZCù<£7Ã3JÊgózÌnøþHȰíáÌYÉšäTœ¯a…Šï¯Æ,_»œ-Ÿ—Oë87Ë}êÛKÔ´Ü—Ll¹oKñšò+Êg­JÌâ.¾GZyóº‹Vðc­48¸’ï¼äØWtù]Í:P~`áŒñ±–rZŽq.nÍ1]Ç ÇàSÿæ/©ßP•ýïuö¿7Ùÿ¾Ìþ÷Uö¿·ÙÿÞeÿû:û?Èìÿ ²ÿƒÎþ&û?”Ùÿ!dÿ‡&û¿1y–¦¼ÍH·œn5þ¹ã)º½ÝyšÒ“Bï½x#†1Þž´Ãþ€]ôGoáõñÅ×Mñ?®Xê endstream endobj 105 0 obj << /Length 750 /Filter /FlateDecode >> stream xÚmUMoâ0½çWx•ÚÅ$*B²ó!qض*Õj¯˜n$H¢$úï×3Cð²íh<~3~Ï~î~¼ngºj÷v¦9{³C{îK;Kîºàî.kËóÉ6ã³µ•­¦Ýችöm¹µ#»O7Ù¦©ÇÞ4åñ\Ù õ=ÈØºñ8‡Ý¿Ûß³ò4Ö‚Ïöçú8ÖÍŒø½ôí>sIv›dXôËöCÝ6OL xû9Œö´im$lþæ6‡±ÿDŽÁü¥¯l_7ìþ–šÛÚž»îhãÁzÍ*{pþçÝɲù·¯˜÷ÏÎ2‰kA¼Ê¶²C·+m¿k>lp¾fIQ¬ÛTÿíÅT±?LÐØAù>J‡ë ‘¡‹e .1›ÊPbéªpqH I$\kL¸8HbØŒShÄ…r =ôêzŠã51Xò‰Qùg×_¸sµ‚2¥äÄ’òÀ€+Š Ä ŠsˆC:CQŒ}.'c-ð”BbOEðƒuê×+Xg~Â:ÿ?aŠÛàj îB€.U ±$,ð¨›ĨA¦ˆA 2®‚žAÃ%‹˜òâ%Õ"µñ 1ô9h¨M„ _®ñ¤)ELN 1éÀs¥ ×þRÒ3fg =傸aîCÑYj¥ VÑÝà^¬w&L˜Ó=·° ½Ð3â„nqFyÀDŽϠOLüñ5'žpÏZx?iéý¤•÷“^x?éÐûIGÞO:ö~ÒÚûI“‡4ðÑíˆÏ¼Ït~ë3]ÜúÌð[ŸñÕgF~õ™QÞgfá}fBï3yŸ™ØûÌ,½ÏÌÊûÌhï3c¼ÏLê}f2ï3“{Ÿ™Âû,åÞg©ð>K¥÷Yº¸¾Nœ0³`Â^Çayî{7)q ã„ÑW7ö:©»¶ƒ*üሟþS`õRé̯ endstream endobj 106 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇQðÙáÒœÆÆÍ8ß›ñäIßž3d_ƒ “~Ù~hZ÷ÄÄ#çÜ W›ö c Ñü*…Í'qÇÆÕýU;€ºHHV7ÕxýÂwuö÷É»Ïa´ç­;¶ÑzÍæoþpûOÔøÍ_úÚöû`÷_¥ù£Ý¥ëNd0m6¬¶G_ÑÏÿ¼?[6ÿvÆçý³³Lâ·ºª¶¶C·¯l¿w6Zs¾aë²ÜDÖÕÿ%!ãpœ¨™§ò%¼b•l¢µËÜc€Ã¤ ¥¤ÀÈ ¤ÀPÀP«[ ßuªŸñ©_õgß_•ñxû4Ž$Oˇú<X^\NB8 ë\;c®‚šBbMx¹ ùy˜%ÆPÈ 3jok:E q:¹Œ/d4ˆ8ð€Q§4ÈA2="\¤ÂšYˆ+ÀË‹ÔÏsä(Äè5$ YŒ—Èú rŠÀ‘€ƒ~ì+A¿\HÈ•ÐWr߯{ÇNøxoËøŠ‡û• ¿”$¿TL~©ù¥òK¥ä—ÊÈ/¥È/¥ƒ†p˜1ðsòQä£*ÉGÍÉG-ÈG-ÉG“zA>ê„|Ô)ù¨3òQ/ÉG½"µ"µ&µ!uN>ê‚|Ô%ùh8ùhùh$ùhbòÅ,n~á†üá°nË£ºô½ß+¸´p]À¢hœ½íµ®í \ˆÓ†¯—2ú ¯M„Ç endstream endobj 107 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇq5;\šÓظî{3ž<ç»cæcìKŒaÊ/ÛM래xäœû@ájÓža†!š_u°ù¤ìظº¿Ša Éꦯ_ø®Îþ2 y÷9Œö¼uÇ6Z¯ÙüÍcÿ‰ ¢ùK_Û¾qìþ‹2²»tÝÉ‚ ƣ͆Õöè úÙŸ÷gËæß x£¼v–IüAUÕÖvèö•í÷îÃFkÎ7l]–›Èºú¿³$dŽ5óT¾„W¬’M´–Âc™B€{ìp˜”!°ôY ju«á»Nõ3>õ«þìû«2¯bŸÆ±“ä)`âPŸÇkÀ‹€ ÀIèÀ§ckgÌUPSH¬©¯@"7#?³d€Ã 9aFíïm-P§ˆ!.@'—1ð… cƒþ0ê”9¨Sæ G„‹TX3 qxr‘ƒúyŽ…¸ýB£†4 ƒñùA¿AN8pÐ}%è— ¹úJîÛxïxÀÀÉïmù_ñp?0£ä—’ä—ŠÉ/µ ¿TB~©”üRù¥ù¥tÐ3~N>ª‚|T%ù¨9ù¨ù¨%ù¨còQ/ÈG:%uF>ê%ù¨Wä£Vä£Öä£6ä£ÎÉG]º$ ' $ML¾˜ÅÍ/üÃð‚?¶ÑmwT—¾÷kW® X³·­ÖµdáƒëpZ¾ðõRF#üƒÿ endstream endobj 108 0 obj << /Length 720 /Filter /FlateDecode >> stream xÚ}TMo£0½ó+¼‡JíÆ6„˜*ŠÄ§”öUS­öš‚ÓEj9ôß¯ß IV«ªÐcüfüæÙÌÍçŸÔÝ›õƒ{)^ìØ†ÊúÙÏ}ïÝÜä]u:Úvz´¶¶õyu|ÏCWíì$n³m¾m›éΑ·mõqªí™õ5)µïM{¥`qûjûS5e$¥_ýñÔÛÁŸFåKä¼6Ó‡ã~GnM|¹&¨Ä/;ŒM×>u/¥t¢­³îˆÞFo1닳âCÓÖÃ,R¼A²§´¨›jš¿è]IHÞ}Ž“=nÛCç­×bñâÇiø$ÅwÞâi¨íдïâöK…ޱ;õý‡…!½ÍFÔöà ;o÷G+ß5~¡¾~öVhúV¬²êj;öûÊûöÝzk)7b]–϶õk+Îx;ÌÔÔ v/)öÖ&tØ,ÝKK@F¢(.Ð$”â° §+.¢^Ê ‡] C à@FºÎ ¢è¬¨ú³fíÒàÒ¤âŒ8äúò¤Îs`ÚWg+`î#)SÎ%~Æü8§NTâ°ÒŒ¡YEð,Ê ¯(îÒ6À*†3FÓª¼r44ëP#®Y§†fÍžhhÓ°CkE8ã8å²+ûj®"7Gö9ç¢~PpúCŠ+ªRî2CËÇ#`øp¿Ëœ1q îE—Œ‡£üˆEÈ5’=„ŸF]=7úz&`ÿq•p&b¡Ã°§|Ç _/ôcØS‰½MrõÎ¤× fÈ/öÝðù%Ðm ÆðȰw öŠù\Ô‰CÞúbÖ“ ÿxö5cÖ fÌw(¥:¤§ÐKœŸz‰gßqf1iXgù·á3NpÆ óéìÓy/hHS>Wø›ÎúÁÏ#ÊÍÁ/—«ù¯¡¿ÿ5fÒerT§apC… Œ‡¦µ—ÙÖw=²è¡¡xÍøz*½¿m©ŒË endstream endobj 109 0 obj << /Length 720 /Filter /FlateDecode >> stream xÚ}TMo£0½ó+¼‡JíÆ6„˜*ŠÄ§”öUS­öš‚ÓEj9ôß¯ß IV«ªÐcüfüæÙÌÍçŸÔÝ›õƒ{)^ìØ†ÊúÙÏ}ïÝÜä]u:Úvz´¶¶õyu|ÏCWíì$n³m¾m›éΑ·mõqªí™õ5)µïM{¥`qûjûS5¥‘Ò¯ŽþxêíàO£ò%r^›éÃq¿£ ·&¾\Tâ—Ʀk„º—Rº@ÑÖYwDo£·˜õ‰ÅYñ¡iëa)Þ ÙSZÔM5Í_ô®ŽÎ$$ï>ÇÉ·í¡óÖk±xq‹ã4|’â;oñ4ÔvhÚwqû¥BÇØúþÃBÞf#j{p…7û£‹ï¿P_?{+4}+VYuµû}e‡}ûn½µ”±.ËgÛú¿µg¼fjj»—”{k:l–F #Q—hJqØ ‡Ó HQ/e†Ã.!Pp #]gQtVTýÙ³v)#l-g„À!×7À'užÓ¾:[sI œr.ñ3æ§À9u¢‡•f Í*‚gQNxEq—æ°V1ô¨˜1šVå•£¡Y‡qÍ:54köDC›†Z+ÂÇ)—]ÑØWs͹8:а/È9õƒ‚ãÐR\Qýr—z\®8Ç€û]按Sp/ ¸d8ýãDœ(B®‘ì!ü4êê¹Ñ׳0û«„30û †=å;føz¡ÞJìm’«w&½^0C~±ï†Ï/nS0†G†½K°WÌçš Nò¾Ð³žýdzG¨³ž5c¾C)Õ!=E€^â”øÔK<ûŽ3‹Iò 8ûÈ¿ Ÿq‚3N˜OgŸÎ{ACšò¹ÂßtÖ~Qn~ɸ\Í ý%ø¯1“.“£: ƒ*4¸hH`<4­½Ì¶¾ë‘E ÅóhÆ×Séý uŒÕ endstream endobj 110 0 obj << /Length 719 /Filter /FlateDecode >> stream xÚ}TMo£0½ó+¼‡JíÆ6„˜*ŠÄ§”öUS­öš‚ÓEj9ôß¯ß IV«ªÐcüfüæÙÌÍçŸÔÝ›õƒ{)^ìØ†ÊúÙÏ}ïÝÜä]u:Úvz´¶¶õyu|ÏCWíì$n³m¾m›éΑ·mõqªí™õ5)µïM{¥`qûjûS5•”Ò¯ŽþxêíàO£ò%r^›éÃq¿£ ·&¾\Tâ—Ʀk„ºw(Ú:ëŽèmô³>±8+>4m=Ì"Å${J‹º©¦ù‹ÞÕÑ™„äÝç8Ùã¶=tÞz-/nqœ†OR|ç-ž†ÚMû.n¿Tè»SßX¨ÒÛlDm®°óæq´bñ]ãêëgo…¦oÅ*«®¶c¿¯ì°oß­·–r#Öe¹ñl[ÿ·¶âŒ·ÃL @ b÷’ÒaomB‡ÍÒ½´Ô$`$Šá@B)»@ápºâ@á)ê¥ÌpØ2 d¤ë¬ ŠÎŠª?ûaÖ.e„­¥âŒ8äúò¤Îs`ÚWg+`î#)SÎ%~Æü8§NTâ°ÒŒ¡YEð,Ê ¯(îÒ6À*†3FÓª¼r44ëP#®Y§†fÍžhhÓ°CkE8ã8å²+ûj®"7Gö9ç¢~PpúCŠ+ªRî2CËÇ#`øp¿Ëœ1q îE—Œ‡£üˆEÈ5’=„ŸF]=7úz&`ÿq•p&b¡Ã°§|Ç _/ôcØS‰½MrõÎ¤× fÈ/öÝðù%Ðm ÆðȰw öŠù\Ô‰CÞúbÖ“ ÿxö5cÖ fÌw(¥:¤§ÐKœŸz‰gßqf1iXgù·á3NpÆ óéìÓy/hHS>Wø›ÎúÁÏ#ÊÍÁ/—«ù¯¡¿ÿ5fÒerT§apC… Œ‡¦µ—ÙÖw=²è¡¡xÍøz*½¿î¡Œ² endstream endobj 111 0 obj << /Length 720 /Filter /FlateDecode >> stream xÚ}TMo£0½ó+¼‡JíÆ6„˜*ŠÄ§”öUS­öš‚ÓEj9ôß¯ß IV«ªÐcüfüæÙÌÍçŸÔÝ›õƒ{)^ìØ†ÊúÙÏ}ïÝÜä]u:Úvz´¶¶õyu|ÏCWíì$n³m¾m›éΑ·mõqªí™õ5)µïM{¥`qûjûS5•–Ò¯ŽþxêíàO£ò%r^›éÃq¿£ ·&¾\Tâ—Ʀk„º—Rº@ÑÖYwDo£·˜õ‰ÅYñ¡iëa)Þ ÙSZÔM5Í_ô®ŽÎ$$ï>ÇÉ·í¡óÖk±xq‹ã4|’â;oñ4ÔvhÚwqû¥BÇØúþÃBÞf#j{p…7û£‹ï¿P_?{+4}+VYuµû}e‡}ûn½µ”±.ËgÛú¿µg¼fjj»—”{k:l–F #Q—hJqØ ‡Ó HQ/e†Ã.!Pp #]gQtVTýÙ³v)#l-g„À!×7À'užÓ¾:[sI œr.ñ3æ§À9u¢‡•f Í*‚gQNxEq—æ°V1ô¨˜1šVå•£¡Y‡qÍ:54köDC›†Z+ÂÇ)—]ÑØWs͹8:а/È9õƒ‚ãÐR\Qýr—z\®8Ç€û]按Sp/ ¸d8ýãDœ(B®‘ì!ü4êê¹Ñ׳0û«„30û †=å;føz¡ÞJìm’«w&½^0C~±ï†Ï/nS0†G†½K°WÌçš Nò¾Ð³žýdzG¨³ž5c¾C)Õ!=E€^â”øÔK<ûŽ3‹Iò 8ûÈ¿ Ÿq‚3N˜OgŸÎ{ACšò¹ÂßtÖ~Qn~ɸ\Í ý%ø¯1“.“£: ƒ*4¸hH`<4­½Ì¶¾ë‘E ÅóhÆ×Séý!|Œ¼ endstream endobj 114 0 obj << /Producer (pdfTeX-1.40.28) /Creator (TeX) /CreationDate (D:20250703135408-07'00') /ModDate (D:20250703135408-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.28 (TeX Live 2025) kpathsea version 6.4.1) >> endobj 16 0 obj << /Type /ObjStm /N 72 /First 590 /Length 4090 /Filter /FlateDecode >> stream xÚí[[S9~÷¯ÐÛfj+Ö]-mMM!„@¸d`2©­Æn 7¶›ñ%æ×ï9’úŽ ™­}HeµtÎÑw.ºµdAáÄAâˆHàËi’¨D!ˆ6†CŒÖDh’¨„HAl"ˆ6£RÎ4K¹ÒD1£‘ !µ%JxàDƈR 9‘D·ÁšÁ?4,šs>Qš' Ñ ¾†ö‰ ¡HpN´…",zD†Á¿Äpb”†oøO,–$‘N Œ"‰å@¤‰ ¨c*”k¤#ÆÂ7àÝgœ€fNBû =¨B qUô6g)1£¡ÊrÈ$´`-+™ªd„…¶ƒ‚Ä"M‚ÍÊq@,@çb‘ÄÂÀè\r084%Èð-Ád ”›ƒiÀ À°'|;ˆ€U1p%ÖC˜ }ÈxfhYð.•XF0ë@k/4 E @Ë¡F+ €GkaœûèÆQ²ƒŸГۛŒÐÃô*Ðíb¶ÌfË‘fGz”-ŠÕ|”- æ|Á~6ÎÓgÅòA‘‰À>>lÉ~ùÅKÞiäçŸ ÝÅ`ÂÌ"Ƙ×Ç,FRfÑj1kÁ! 6å¬,ö& y#ómiМe;­‹yFçÅè8[’ ôó]BO²/Kò±Ä|§5ë™Ã>Ê ›Š5•i)éܱÉCuQ]]„xœ.µ“Öa®u|(è¤Zÿ ×9£Y0@ŠÊy{ö#“½Ž&×ÓîNUô=´éVdïÌFÅ8Ÿ] èóüò2:øA º¸IG;Œ&é”þ±*–ÙøbBg«éE6_äW3:.&“tNo2À0[Òt ¹E:âdô›žd—Ë›çW×@ºXfó|ñ‰ÞLV :*¦Ó”^ßÞ\g3”–cº˜¤‹kúW6/h1ËèòÏ‚.¯çYF/Aez™Îè"ÿBÙgàɼÐY„£bRÌ xš‡Ü$[,höÇ*Ыy–B³€.[,s¨K—t‹>£Ûô9Ý¡»ô}I÷è+úš¾¡ûô-= ‡ô=¢Çô„žÒ÷ôWzFÏéoôbžŽ>eK¯ÓdÔXZê7ÊóQ>­¦t5ƒYFÅ<)àNéÑ1]车9ýýD'tJg´ ótœítNtIWô3ý“~¡·ô/ßFÛ‡§F{Ë|2ÎèÅj2É–tg–‹ùÚéZó|VyÔ—e“I~³Ètœ^]Âú;hq9ɾ k–×ÅÊ»øx”ÎÁ„W«|â%{T;e“¿…êøÔÄá }.@/aÔåðª"[6£³©ÿ Z.ÁLÙ4¢‹ÀZT†ø+ÔŸsˆmÔ°ÖãâÏõÁ‹9~:ZͱÜÒ[¬‹yñ)›¡±ÙÈÇL%fTÜÜÆ¶æãKˆ7~c’M‹“â }9+–etϳ«›ÊÆtšŽØ8»Â°ÆŽ2 7@¨/V¾ÌCÈWOéhµÌèt…=)…Xº¹Ž½5ð2GÐÿ¡Ob—©¸Þâc5iá‹ÐgØ5æØ+ {N.C“±pQõo¨­¿[ÇV#2¶‚W¶*ëlÍÑ–[;t»„´˜wóNƒy§âÚ 4{f¯A³WÑì,¯éÛÐÜA ?ä òƒHPqMW“e~3¹¥¡·žÖÓÀzÚ`=­xÎCåÉu1‡øÊæSˆû‹É‚¦±‡ê´Á›†fÓJDêͰTš! ÌY`ÎÌYÅ•š<Ðä š¼¢ÉÀ ³Ð\È‹@^4È‹HPqóÏ9#¬ã*0®Œ«Šã6T.½nËâ?æÿç9äæÇìñcöø1{ü˜=þÏgØûŒW0 ‘'/ß×Åb¹ÍóØ©°!ÓCþìzpÄ…zã.yòü_‚ Í&¹Ô’©§,ùcÿºýbü-/ª€ÖÆŸa¸úýɧß"H;ää÷''ÙyS‚/ ²]vQ_BŽÂºœìÜf丸\þ 3È<É¡³’'Û[Ïù¿‡ ÷§ÎÌøeùâx ¸ôx‹\¦“EV§3˜`ÆQq/Xp/ ;Ê|¾Xn_§s¢Ì€¾Iブúk>^^ÃôJð=#ʺêÃÂ3ìøŽWK/…ò°C}žë‚ ¤ M>ƒáÛo^UÜS–S9¾—lîk°É×Àr.hýS×Jùm`JtÙ.0¹ÉηØgÿØ“íM9‘z¢yw÷­Ü½vßZÜ ¼ùšà¾oj>$I2´D3F|îc,oåÜ"àƒpØZò¡|Tä4S+ÌPá[èaÓP’@­%‰@“˜J,ç˜bhˆqy¥êH)-–k¥‡ø®Y½1J\"†.ÒDÉ^BÌ[Ž\Ž el%¶ëSÎoå*%š õ•‹J{Á ˆV^ …ê6hW,7 ڊ汨J iÒÅÐ(î|*«VB­WœgüË"©¹ç0 pÈcù}?a0à€ÅIsì+6aCŒC.…&k*½P— MõÝn²  þãÜ¡æX‘p1´_Åa­mò!-…ke†ÃÝ0<úãèÚ ×eá¹.Zc qßyŒ÷±§«%(­˜…”ÒSÈ’Û6T¤8Ü‚$h_ÃÜðãó?ûü°ø÷¶¦•8úø~R¢eL…Ÿf$óµŒõ>‰ÆJå§æ‡iAê©É1á‡dŽ&‹FŠ$¡™:פ’ÖwBŸV3]Y×€w°uÑC¤†A>¤¡UK`¥Z¾Ûë!Š%‡~¤“& "µž 츉õ±ÌóFé0¨ðhð(_sr&ªæµPq†ªíæ&ð¢7ù†÷|i˧¢–]¡ÛÔB:¥óò‚CµA©o£+8ûÆGÂ\¨Ê4¶¾­p¹ÒPbóK ë—hJ s<Ñ/˜$Ï̓=§c8÷¯.à I¬÷hb‘0ä-L š‰ Z¤ð sîõŽ(|šøøÈM#ßÕJk…†y&æÁRÜÏë#”–vðˆaÞ*KœÆPŒœu P ê®´OUhÖ[…|H㜗øþïUÞ4•¼‘*¿8CoÂjGÄŸ-¬½p±ç0º<-/Xo=DŠ&†Ñ&qˆ6‹+(\ ™DñÊ€A3 a3Eù¼•¸ÂÞ–Àj£<6̹1Rc“ 5¶s=pmá¼Pìþ›cßJúµžQëïK¦¡ÄÉ$RÔ´¡^iÄ¡€úHMåë‚…|×50q\ÆãÕ¿ðÅlîÐNHQJùI .¥•~Uƒi(I¤òËõÒG‰ò×1>²‚¤§‚6zœIÏ)üh¾vžK–òg”-˜_ôW²‘ >œ1S=hg[ ·sõŠQR#„*' ÜšõžÃ—i­¶<òVT¡NúÀ“á†|]à†¼OÑIÀH(o`è¢KƒœfšpçCC#¤¡ÝÃÆÎc ®Ã†Û#,ºù=„Œ”R Jx”€Côœ`|}”ê¹côÇÀgØ| ±MŸ:hY·J´Á¡ºi‰~¾Y$+æ÷’¼HpÛÖ¤‰¼¡ÜÈÑ6ØEJÞ¦LO#µòÃkNUMékƒF!ïÓûDØ«¿M§ø>çåñÁëÝnï?;ã *&éìÿÅ3¿õª y*pçx•J³ºµÀw¬`' ÜNo^ú³0°Plëžr¬Ü[¦“|´…‡Ä/³é{¼&6 g‘ &VqÎñ½ÀºC÷è)MãY@|×}Î6ü)G8¨ð ä&„Ã<YÑ/?%vshÚ¸þ=õ6Ù=Þýíðm°‰Xc‰6áxóÉ}›0·Ö&Û«\> ßÄÇ织ÏÞƒ%ö÷ÖE‡1:˜²ß°„üš%žbP[$¢a É›¦(«ð«¥–ÜD­wÇ;¯ÞmƒZGë´R¬ÔйÇhUù׸µ:Ý}܆Gmå1Û¯ôܵٚGk£xÄ }Ïñ§{)Øw:Ý'¾ôcçÎcÉxöØ8£Â«Ãi#ž;¶Ã®>§ÃË–³té,úòõáÞáKï q/×µîHº¦³x„‡¦çücå9àXç9Ýt:hÜâÏ+½µ³`Ý+oO´¦?ùŠ ¶›—æÃÜöÍ‘l»ï÷ŽÞìy$k Cì:…×uݽCW¯1¾¢¯C—µCÇ%4ª_ÔZã8tÛRÔn¢èëóÛ[¨¨]£g9/±„}—>š˜µ}ô ôÅ?_Tm앾®ü^ôœìËSë®ãmu"A÷ß½?ù”=>‡!é>æisÜi áÈSgpâæ¸¶Ð®èVWÀÇÊ@À²vhV-÷ã(šxÉ«¥ØÄÛç‡g/ŽŸ:'ëg]®C„úN3±k=>Šþ­®±õãÙn4éüvúì×C\iœ¬u@A¼a-a9çLC?Î[úác=r ñ½æ¼â<š×;ʈïN,å% fõsȲ1gôH«7Z³œî¼ÝÝòvvw›ÙD3ãuqgmæDÝÓÌ{ÞÀ¥y߃i«+?K3Y5Çgõ \/5¦ø0ý:·utTëUÑÑ+ Š£Äßm-…ô½¯´+Ñ’‚çœÑÙø“ h¬}Ûôï,T—zïÚ—’ø»•Æe×¼!êÛ&þ¡¾háÖ _ƒÓÝŠwàˆoÀa5Õƒc7‡ÓÝwà¨.\IUpL}wD÷ã6GÓÙÆvÀ˜.œÎ¶©ÑÑEý|s8­ÙÝ÷s®R-8¼†cúpøæp:¥ŽuúpÌ:8¶Gl§½i£±üëh¸«#'飑›£éîî¾³TãÍ@nt+­úpÔæpº«ÿŽyzýʹ5ÎÒ®Goާ»Vïàéu-¹á}<æãN{MÛc{pÚ]K×pXÎFåþ¢­Èõ§‰Ö-:Ù »·á´îC|ÀHÝ_u öBÜ£º£Ñ÷Àø€ñ»¿°ê`T}Œ­qŸJ;šocäÔû+¦FóUW«†“{ ¼cœÇÛŠ ¼®¸Â-ZýÓ?=ø:ÃZ(Ü7äá·“"ü´R„ËP'}s¿"œ¯®Ù·X“’4ü"1^ìpl§°F,®µjhþ KцH endstream endobj 115 0 obj << /Type /XRef /Index [0 116] /Size 116 /W [1 3 1] /Root 113 0 R /Info 114 0 R /ID [<100E7FF3F6A563359F5853966CC95AA9> <100E7FF3F6A563359F5853966CC95AA9>] /Length 335 /Filter /FlateDecode >> stream xÚ%Ï»/ÃaÆñó¼m©ºµU·º·´î¥¨»¢.›Ál0KÄ_@‚‰­“0L&ƒUÒH$‰„¤ ‰„J\‰„ÅÄûË'ßs~¿œäù5"^H©°FHŠ “)’ dˆL$'“dæûMÌ1ç™î¦‰‹8!î¬îòIÄ“ÓqŒ BêNt, nHÀ§£x Á ‹I i%E¤”t’Bâ…„žôç($üªÕAʈÒ|£»Y 够TJREªIÔZRGêIi$M$‰øõr²´­Õ Ùiµ@Žþ_üÜ =Õ± X¨×jַ쇃1»€L\«Ʊ£ƒ™NkõÀ¬¦´zaö†µâ0ÇI­>˜ó¨À\,Y.Ó–«}Ëõ•å–lÂr·byHZ7,Ïk–—eËû¦åãÐò™Ñ{sdæ+'p¸åõ€;y endstream endobj startxref 197970 %%EOF asymptote-3.05/doc/axis3.asy0000644000000000000000000000037315031566105014503 0ustar rootrootimport graph3; size(0,200); size3(200,IgnoreAspect); currentprojection=perspective(dir(75,20)); scale(Linear,Linear,Log); xaxis3("$x$",0,1,red,OutTicks(2,2)); yaxis3("$y$",0,1,red,OutTicks(2,2)); zaxis3("$z$",1,30,red,OutTicks(beginlabel=false)); asymptote-3.05/doc/HermiteSpline.asy0000644000000000000000000000050415031566105016220 0ustar rootrootimport graph; size(140mm,70mm,IgnoreAspect); scale(false); real[] x={1,3,4,5,6}; real[] y={1,5,2,0,4}; marker mark=marker(scale(1mm)*cross(6,false,r=0.35),red,Fill); draw(graph(x,y,Hermite),"Hermite Spline",mark); xaxis("$x$",Bottom,LeftTicks(x)); yaxis("$y$",Left,LeftTicks); attach(legend(),point(NW),40S+30E,UnFill); asymptote-3.05/doc/bezier2.asy0000644000000000000000000000064015031566105015013 0ustar rootrootimport beziercurve; pair midpoint(pair a, pair b) {return interp(a,b,0.5);} pair m0=midpoint(z0,c0); pair m1=midpoint(c0,c1); pair m2=midpoint(c1,z1); draw(m0--m1--m2,dashed); dot("$m_0$",m0,NW,red); dot("$m_1$",m1,N,red); dot("$m_2$",m2,red); pair m3=midpoint(m0,m1); pair m4=midpoint(m1,m2); pair m5=midpoint(m3,m4); draw(m3--m4,dashed); dot("$m_3$",m3,NW,red); dot("$m_4$",m4,NE,red); dot("$m_5$",m5,N,red); asymptote-3.05/doc/bezier.asy0000644000000000000000000000012115031566105014723 0ustar rootrootlabel("$(1-t)^3z_0+3t(1-t)^2c_0+3t^2(1-t)c_1+t^3z_1\qquad 0\le t\le 1$.",(0,0)); asymptote-3.05/doc/secondaryaxis.csv0000644000000000000000000013731715031566105016340 0ustar rootroot,"Proportion of crows",,,"Mosquitoes per crow",,, Time,Susceptible,Infectious,Dead,Larvae,Susceptible,Exposed,Infectious 0,1,0,0,,30,0.000,0.001 0.1,1.000,0.000,0.000,12.794,30.000,0.000,0.001 0.2,1.000,0.000,0.000,12.794,30.000,0.000,0.001 0.3,1.000,0.000,0.000,12.795,30.000,0.000,0.001 0.4,1.000,0.000,0.000,12.795,30.000,0.000,0.001 0.5,1.000,0.000,0.000,12.795,30.000,0.000,0.001 0.6,1.000,0.000,0.000,12.795,30.000,0.000,0.001 0.7,1.000,0.000,0.000,12.795,30.000,0.000,0.001 0.8,0.999,0.000,0.000,12.795,30.000,0.000,0.001 0.9,0.999,0.000,0.000,12.795,29.999,0.001,0.001 1,0.999,0.000,0.000,12.795,29.999,0.001,0.001 1.1,0.999,0.000,0.000,12.795,29.999,0.001,0.001 1.2,0.999,0.000,0.000,12.795,29.999,0.001,0.001 1.3,0.999,0.000,0.000,12.795,29.999,0.001,0.001 1.4,0.999,0.000,0.001,12.795,29.999,0.001,0.001 1.5,0.999,0.001,0.001,12.795,29.999,0.001,0.001 1.6,0.999,0.001,0.001,12.795,29.999,0.001,0.001 1.7,0.999,0.001,0.001,12.795,29.998,0.001,0.001 1.8,0.999,0.001,0.001,12.795,29.998,0.001,0.001 1.9,0.998,0.001,0.001,12.795,29.998,0.001,0.002 2,0.998,0.001,0.001,12.795,29.998,0.001,0.002 2.1,0.998,0.001,0.001,12.795,29.998,0.002,0.002 2.2,0.998,0.001,0.001,12.795,29.998,0.002,0.002 2.3,0.998,0.001,0.001,12.795,29.997,0.002,0.002 2.4,0.998,0.001,0.001,12.795,29.997,0.002,0.002 2.5,0.998,0.001,0.002,12.795,29.997,0.002,0.002 2.6,0.997,0.001,0.002,12.795,29.997,0.002,0.002 2.7,0.997,0.001,0.002,12.795,29.996,0.002,0.003 2.8,0.997,0.001,0.002,12.795,29.996,0.002,0.003 2.9,0.997,0.001,0.002,12.795,29.996,0.002,0.003 3,0.997,0.001,0.002,12.795,29.995,0.003,0.003 3.1,0.996,0.001,0.002,12.795,29.995,0.003,0.003 3.2,0.996,0.001,0.003,12.795,29.995,0.003,0.003 3.3,0.996,0.001,0.003,12.795,29.994,0.003,0.004 3.4,0.996,0.001,0.003,12.795,29.994,0.003,0.004 3.5,0.995,0.002,0.003,12.795,29.994,0.003,0.004 3.6,0.995,0.002,0.003,12.795,29.993,0.004,0.004 3.7,0.995,0.002,0.004,12.795,29.993,0.004,0.004 3.8,0.994,0.002,0.004,12.795,29.992,0.004,0.005 3.9,0.994,0.002,0.004,12.795,29.992,0.004,0.005 4,0.994,0.002,0.004,12.795,29.991,0.005,0.005 4.1,0.993,0.002,0.005,12.795,29.991,0.005,0.006 4.2,0.993,0.002,0.005,12.795,29.990,0.005,0.006 4.3,0.992,0.002,0.005,12.795,29.989,0.005,0.006 4.4,0.992,0.003,0.006,12.795,29.989,0.006,0.007 4.5,0.991,0.003,0.006,12.795,29.988,0.006,0.007 4.6,0.991,0.003,0.006,12.795,29.987,0.006,0.008 4.7,0.990,0.003,0.007,12.795,29.986,0.007,0.008 4.8,0.990,0.003,0.007,12.795,29.985,0.007,0.008 4.9,0.989,0.003,0.008,12.795,29.984,0.008,0.009 5,0.988,0.004,0.008,12.795,29.984,0.008,0.009 5.1,0.988,0.004,0.009,12.795,29.982,0.008,0.010 5.2,0.987,0.004,0.009,12.795,29.981,0.009,0.011 5.3,0.986,0.004,0.010,12.795,29.980,0.010,0.011 5.4,0.985,0.005,0.010,12.795,29.979,0.010,0.012 5.5,0.984,0.005,0.011,12.795,29.978,0.011,0.013 5.6,0.983,0.005,0.012,12.795,29.976,0.011,0.013 5.7,0.982,0.005,0.012,12.795,29.975,0.012,0.014 5.8,0.981,0.006,0.013,12.795,29.973,0.013,0.015 5.9,0.980,0.006,0.014,12.795,29.972,0.013,0.016 6,0.979,0.006,0.015,12.795,29.970,0.014,0.017 6.1,0.978,0.007,0.016,12.795,29.968,0.015,0.018 6.2,0.976,0.007,0.016,12.795,29.966,0.016,0.019 6.3,0.975,0.008,0.017,12.795,29.964,0.017,0.020 6.4,0.973,0.008,0.019,12.795,29.962,0.018,0.021 6.5,0.972,0.008,0.020,12.795,29.960,0.019,0.022 6.6,0.970,0.009,0.021,12.795,29.957,0.020,0.024 6.7,0.968,0.009,0.022,12.795,29.955,0.021,0.025 6.8,0.967,0.010,0.023,12.795,29.952,0.022,0.026 6.9,0.965,0.011,0.025,12.795,29.949,0.024,0.028 7,0.963,0.011,0.026,12.795,29.946,0.025,0.030 7.1,0.960,0.012,0.028,12.795,29.943,0.026,0.031 7.2,0.958,0.013,0.029,12.795,29.940,0.028,0.033 7.3,0.956,0.013,0.031,12.795,29.936,0.029,0.035 7.4,0.953,0.014,0.033,12.795,29.933,0.031,0.037 7.5,0.950,0.015,0.035,12.795,29.929,0.033,0.039 7.6,0.947,0.016,0.037,12.795,29.925,0.035,0.042 7.7,0.944,0.016,0.039,12.795,29.920,0.037,0.044 7.8,0.941,0.017,0.041,12.795,29.916,0.039,0.046 7.9,0.938,0.018,0.044,12.795,29.911,0.041,0.049 8,0.934,0.019,0.046,12.795,29.906,0.043,0.052 8.1,0.931,0.020,0.049,12.795,29.900,0.046,0.055 8.2,0.927,0.021,0.052,12.795,29.895,0.048,0.058 8.3,0.923,0.023,0.055,12.795,29.889,0.051,0.061 8.4,0.918,0.024,0.058,12.795,29.883,0.054,0.065 8.5,0.914,0.025,0.061,12.795,29.876,0.056,0.069 8.6,0.909,0.026,0.065,12.795,29.869,0.059,0.072 8.7,0.904,0.028,0.068,12.795,29.862,0.063,0.076 8.8,0.899,0.029,0.072,12.795,29.854,0.066,0.081 8.9,0.893,0.031,0.076,12.795,29.846,0.070,0.085 9,0.887,0.032,0.080,12.795,29.838,0.073,0.090 9.1,0.881,0.034,0.085,12.795,29.829,0.077,0.095 9.2,0.875,0.036,0.090,12.795,29.820,0.081,0.100 9.3,0.868,0.037,0.095,12.795,29.810,0.085,0.106 9.4,0.861,0.039,0.100,12.795,29.800,0.090,0.112 9.5,0.854,0.041,0.105,12.795,29.789,0.094,0.118 9.6,0.846,0.043,0.111,12.795,29.778,0.099,0.124 9.7,0.838,0.045,0.117,12.795,29.766,0.104,0.131 9.8,0.830,0.047,0.123,12.795,29.754,0.109,0.138 9.9,0.821,0.049,0.130,12.795,29.742,0.114,0.145 10,0.812,0.052,0.136,12.795,29.729,0.120,0.153 10.1,0.802,0.054,0.144,12.795,29.715,0.126,0.161 10.2,0.793,0.056,0.151,12.795,29.701,0.132,0.169 10.3,0.782,0.059,0.159,12.795,29.686,0.138,0.178 10.4,0.772,0.061,0.167,12.795,29.670,0.144,0.187 10.5,0.761,0.064,0.175,12.795,29.654,0.150,0.196 10.6,0.750,0.066,0.184,12.795,29.638,0.157,0.206 10.7,0.738,0.069,0.193,12.795,29.621,0.164,0.216 10.8,0.726,0.072,0.203,12.795,29.603,0.171,0.227 10.9,0.713,0.074,0.212,12.795,29.585,0.178,0.238 11,0.700,0.077,0.223,12.795,29.566,0.185,0.250 11.1,0.687,0.080,0.233,12.795,29.547,0.193,0.261 11.2,0.674,0.082,0.244,12.795,29.527,0.200,0.274 11.3,0.660,0.085,0.255,12.795,29.507,0.208,0.286 11.4,0.645,0.088,0.267,12.795,29.486,0.215,0.300 11.5,0.631,0.090,0.279,12.795,29.465,0.223,0.313 11.6,0.616,0.093,0.291,12.795,29.443,0.231,0.327 11.7,0.601,0.095,0.304,12.795,29.421,0.238,0.341 11.8,0.585,0.098,0.317,12.795,29.399,0.246,0.356 11.9,0.570,0.100,0.330,12.795,29.376,0.254,0.371 12,0.554,0.102,0.344,12.795,29.353,0.261,0.386 12.1,0.538,0.104,0.358,12.795,29.330,0.269,0.402 12.2,0.521,0.106,0.372,12.795,29.307,0.276,0.418 12.3,0.505,0.108,0.387,12.795,29.283,0.283,0.434 12.4,0.489,0.110,0.401,12.795,29.260,0.290,0.451 12.5,0.472,0.112,0.416,12.795,29.236,0.297,0.468 12.6,0.456,0.113,0.432,12.795,29.213,0.303,0.485 12.7,0.439,0.114,0.447,12.795,29.190,0.309,0.502 12.8,0.423,0.115,0.462,12.795,29.167,0.315,0.519 12.9,0.406,0.116,0.478,12.795,29.144,0.320,0.536 13,0.390,0.116,0.494,12.795,29.122,0.325,0.554 13.1,0.374,0.117,0.509,12.795,29.100,0.329,0.571 13.2,0.358,0.117,0.525,12.795,29.079,0.333,0.588 13.3,0.343,0.117,0.541,12.795,29.059,0.337,0.606 13.4,0.327,0.116,0.557,12.795,29.039,0.340,0.623 13.5,0.312,0.116,0.572,12.795,29.020,0.342,0.639 13.6,0.297,0.115,0.588,12.795,29.001,0.344,0.656 13.7,0.283,0.114,0.603,12.795,28.984,0.345,0.672 13.8,0.269,0.113,0.618,12.795,28.967,0.346,0.688 13.9,0.255,0.111,0.634,12.795,28.952,0.346,0.704 14,0.242,0.109,0.648,12.795,28.937,0.345,0.719 14.1,0.229,0.108,0.663,12.795,28.924,0.344,0.733 14.2,0.217,0.106,0.677,12.795,28.912,0.342,0.747 14.3,0.205,0.103,0.692,12.795,28.900,0.340,0.761 14.4,0.194,0.101,0.705,12.795,28.891,0.337,0.774 14.5,0.183,0.099,0.719,12.795,28.882,0.333,0.786 14.6,0.172,0.096,0.732,12.795,28.874,0.329,0.797 14.7,0.162,0.093,0.745,12.795,28.868,0.325,0.808 14.8,0.153,0.090,0.757,12.795,28.863,0.320,0.818 14.9,0.143,0.087,0.769,12.795,28.860,0.314,0.827 15,0.135,0.084,0.781,12.795,28.857,0.308,0.836 15.1,0.127,0.081,0.792,12.795,28.856,0.302,0.843 15.2,0.119,0.078,0.803,12.795,28.856,0.295,0.850 15.3,0.112,0.075,0.813,12.795,28.857,0.288,0.856 15.4,0.105,0.072,0.823,12.795,28.859,0.281,0.861 15.5,0.098,0.069,0.833,12.795,28.863,0.273,0.865 15.6,0.092,0.066,0.842,12.795,28.867,0.266,0.868 15.7,0.086,0.063,0.850,12.795,28.873,0.258,0.870 15.8,0.081,0.060,0.859,12.795,28.879,0.250,0.872 15.9,0.076,0.058,0.867,12.795,28.887,0.242,0.873 16,0.071,0.055,0.874,12.795,28.895,0.233,0.873 16.1,0.066,0.052,0.882,12.795,28.904,0.225,0.872 16.2,0.062,0.049,0.888,12.795,28.914,0.217,0.870 16.3,0.058,0.047,0.895,12.795,28.925,0.209,0.867 16.4,0.055,0.044,0.901,12.795,28.936,0.201,0.864 16.5,0.051,0.042,0.907,12.795,28.948,0.192,0.860 16.6,0.048,0.040,0.912,12.795,28.961,0.185,0.856 16.7,0.045,0.037,0.918,12.795,28.974,0.177,0.850 16.8,0.042,0.035,0.922,12.795,28.988,0.169,0.844 16.9,0.040,0.033,0.927,12.795,29.002,0.161,0.838 17,0.037,0.031,0.931,12.795,29.016,0.154,0.831 17.1,0.035,0.029,0.936,12.795,29.031,0.147,0.823 17.2,0.033,0.028,0.939,12.795,29.046,0.140,0.815 17.3,0.031,0.026,0.943,12.795,29.061,0.133,0.807 17.4,0.029,0.024,0.946,12.795,29.077,0.126,0.798 17.5,0.028,0.023,0.950,12.795,29.093,0.120,0.788 17.6,0.026,0.021,0.953,12.795,29.108,0.114,0.779 17.7,0.025,0.020,0.955,12.795,29.124,0.108,0.769 17.8,0.023,0.019,0.958,12.795,29.141,0.102,0.758 17.9,0.022,0.018,0.960,12.795,29.157,0.097,0.748 18,0.021,0.017,0.963,12.795,29.173,0.092,0.737 18.1,0.020,0.015,0.965,12.795,29.189,0.087,0.726 18.2,0.019,0.014,0.967,12.795,29.205,0.082,0.714 18.3,0.018,0.014,0.969,12.795,29.221,0.077,0.703 18.4,0.017,0.013,0.971,12.795,29.237,0.073,0.691 18.5,0.016,0.012,0.972,12.795,29.253,0.069,0.680 18.6,0.015,0.011,0.974,12.795,29.268,0.065,0.668 18.7,0.014,0.010,0.975,12.795,29.284,0.061,0.656 18.8,0.014,0.010,0.977,12.795,29.299,0.057,0.644 18.9,0.013,0.009,0.978,12.795,29.315,0.054,0.632 19,0.012,0.008,0.979,12.795,29.330,0.051,0.620 19.1,0.012,0.008,0.980,12.795,29.345,0.048,0.609 19.2,0.011,0.007,0.981,12.795,29.359,0.045,0.597 19.3,0.011,0.007,0.982,12.795,29.374,0.042,0.585 19.4,0.010,0.007,0.983,12.795,29.388,0.040,0.573 19.5,0.010,0.006,0.984,12.795,29.402,0.037,0.562 19.6,0.010,0.006,0.985,12.795,29.416,0.035,0.550 19.7,0.009,0.005,0.985,12.795,29.430,0.033,0.538 19.8,0.009,0.005,0.986,12.795,29.443,0.031,0.527 19.9,0.009,0.005,0.987,12.795,29.456,0.029,0.516 20,0.008,0.004,0.987,12.795,29.469,0.027,0.505 20.1,0.008,0.004,0.988,12.795,29.482,0.026,0.494 20.2,0.008,0.004,0.989,12.795,29.494,0.024,0.483 20.3,0.007,0.004,0.989,12.795,29.506,0.023,0.472 20.4,0.007,0.003,0.990,12.795,29.518,0.021,0.461 20.5,0.007,0.003,0.990,12.795,29.530,0.020,0.451 20.6,0.007,0.003,0.990,12.795,29.541,0.019,0.441 20.7,0.006,0.003,0.991,12.795,29.553,0.018,0.431 20.8,0.006,0.003,0.991,12.795,29.564,0.017,0.421 20.9,0.006,0.002,0.991,12.795,29.575,0.016,0.411 21,0.006,0.002,0.992,12.795,29.585,0.015,0.401 21.1,0.006,0.002,0.992,12.795,29.595,0.014,0.392 21.2,0.006,0.002,0.992,12.795,29.605,0.013,0.383 21.3,0.005,0.002,0.993,12.795,29.615,0.012,0.374 21.4,0.005,0.002,0.993,12.795,29.625,0.011,0.365 21.5,0.005,0.002,0.993,12.795,29.634,0.011,0.356 21.6,0.005,0.002,0.993,12.795,29.644,0.010,0.347 21.7,0.005,0.002,0.994,12.795,29.653,0.009,0.339 21.8,0.005,0.001,0.994,12.795,29.661,0.009,0.331 21.9,0.005,0.001,0.994,12.795,29.670,0.008,0.323 22,0.004,0.001,0.994,12.795,29.678,0.008,0.315 22.1,0.004,0.001,0.994,12.795,29.687,0.007,0.307 22.2,0.004,0.001,0.995,12.795,29.695,0.007,0.299 22.3,0.004,0.001,0.995,12.795,29.702,0.007,0.292 22.4,0.004,0.001,0.995,12.795,29.710,0.006,0.285 22.5,0.004,0.001,0.995,12.795,29.718,0.006,0.278 22.6,0.004,0.001,0.995,12.795,29.725,0.006,0.271 22.7,0.004,0.001,0.995,12.795,29.732,0.005,0.264 22.8,0.004,0.001,0.995,12.795,29.739,0.005,0.257 22.9,0.004,0.001,0.995,12.795,29.746,0.005,0.251 23,0.004,0.001,0.996,12.795,29.752,0.004,0.244 23.1,0.004,0.001,0.996,12.795,29.758,0.004,0.238 23.2,0.004,0.001,0.996,12.795,29.765,0.004,0.232 23.3,0.003,0.001,0.996,12.795,29.771,0.004,0.226 23.4,0.003,0.001,0.996,12.795,29.777,0.004,0.221 23.5,0.003,0.001,0.996,12.795,29.783,0.003,0.215 23.6,0.003,0.001,0.996,12.795,29.788,0.003,0.210 23.7,0.003,0.001,0.996,12.795,29.794,0.003,0.204 23.8,0.003,0.001,0.996,12.795,29.799,0.003,0.199 23.9,0.003,0.001,0.996,12.795,29.804,0.003,0.194 24,0.003,0.000,0.996,12.795,29.809,0.003,0.189 24.1,0.003,0.000,0.996,12.795,29.814,0.002,0.184 24.2,0.003,0.000,0.997,12.795,29.819,0.002,0.179 24.3,0.003,0.000,0.997,12.795,29.824,0.002,0.175 24.4,0.003,0.000,0.997,12.795,29.829,0.002,0.170 24.5,0.003,0.000,0.997,12.795,29.833,0.002,0.166 24.6,0.003,0.000,0.997,12.795,29.838,0.002,0.162 24.7,0.003,0.000,0.997,12.795,29.842,0.002,0.157 24.8,0.003,0.000,0.997,12.795,29.846,0.002,0.153 24.9,0.003,0.000,0.997,12.795,29.850,0.002,0.149 25,0.003,0.000,0.997,12.795,29.854,0.002,0.145 25.1,0.003,0.000,0.997,12.795,29.858,0.002,0.142 25.2,0.003,0.000,0.997,12.795,29.862,0.001,0.138 25.3,0.003,0.000,0.997,12.795,29.865,0.001,0.134 25.4,0.003,0.000,0.997,12.795,29.869,0.001,0.131 25.5,0.003,0.000,0.997,12.795,29.872,0.001,0.128 25.6,0.003,0.000,0.997,12.795,29.876,0.001,0.124 25.7,0.003,0.000,0.997,12.795,29.879,0.001,0.121 25.8,0.003,0.000,0.997,12.795,29.882,0.001,0.118 25.9,0.003,0.000,0.997,12.795,29.885,0.001,0.115 26,0.002,0.000,0.997,12.795,29.888,0.001,0.112 26.1,0.002,0.000,0.997,12.795,29.891,0.001,0.109 26.2,0.002,0.000,0.997,12.795,29.894,0.001,0.106 26.3,0.002,0.000,0.997,12.795,29.897,0.001,0.103 26.4,0.002,0.000,0.997,12.795,29.900,0.001,0.101 26.5,0.002,0.000,0.997,12.795,29.902,0.001,0.098 26.6,0.002,0.000,0.997,12.795,29.905,0.001,0.095 26.7,0.002,0.000,0.997,12.795,29.907,0.001,0.093 26.8,0.002,0.000,0.997,12.795,29.910,0.001,0.090 26.9,0.002,0.000,0.998,12.795,29.912,0.001,0.088 27,0.002,0.000,0.998,12.795,29.915,0.001,0.086 27.1,0.002,0.000,0.998,12.795,29.917,0.001,0.083 27.2,0.002,0.000,0.998,12.795,29.919,0.001,0.081 27.3,0.002,0.000,0.998,12.795,29.921,0.001,0.079 27.4,0.002,0.000,0.998,12.795,29.923,0.001,0.077 27.5,0.002,0.000,0.998,12.795,29.925,0.001,0.075 27.6,0.002,0.000,0.998,12.795,29.927,0.001,0.073 27.7,0.002,0.000,0.998,12.795,29.929,0.001,0.071 27.8,0.002,0.000,0.998,12.795,29.931,0.001,0.069 27.9,0.002,0.000,0.998,12.795,29.933,0.000,0.067 28,0.002,0.000,0.998,12.795,29.935,0.000,0.066 28.1,0.002,0.000,0.998,12.795,29.937,0.000,0.064 28.2,0.002,0.000,0.998,12.795,29.938,0.000,0.062 28.3,0.002,0.000,0.998,12.795,29.940,0.000,0.061 28.4,0.002,0.000,0.998,12.795,29.942,0.000,0.059 28.5,0.002,0.000,0.998,12.795,29.943,0.000,0.057 28.6,0.002,0.000,0.998,12.795,29.945,0.000,0.056 28.7,0.002,0.000,0.998,12.795,29.946,0.000,0.054 28.8,0.002,0.000,0.998,12.795,29.948,0.000,0.053 28.9,0.002,0.000,0.998,12.795,29.949,0.000,0.052 29,0.002,0.000,0.998,12.795,29.950,0.000,0.050 29.1,0.002,0.000,0.998,12.795,29.952,0.000,0.049 29.2,0.002,0.000,0.998,12.795,29.953,0.000,0.048 29.3,0.002,0.000,0.998,12.795,29.954,0.000,0.046 29.4,0.002,0.000,0.998,12.795,29.955,0.000,0.045 29.5,0.002,0.000,0.998,12.795,29.957,0.000,0.044 29.6,0.002,0.000,0.998,12.795,29.958,0.000,0.043 29.7,0.002,0.000,0.998,12.795,29.959,0.000,0.042 29.8,0.002,0.000,0.998,12.795,29.960,0.000,0.041 29.9,0.002,0.000,0.998,12.795,29.961,0.000,0.040 30,0.002,0.000,0.998,12.795,29.962,0.000,0.039 30.1,0.002,0.000,0.998,12.795,29.963,0.000,0.037 30.2,0.002,0.000,0.998,12.795,29.964,0.000,0.037 30.3,0.002,0.000,0.998,12.795,29.965,0.000,0.036 30.4,0.002,0.000,0.998,12.795,29.966,0.000,0.035 30.5,0.002,0.000,0.998,12.795,29.967,0.000,0.034 30.6,0.002,0.000,0.998,12.795,29.968,0.000,0.033 30.7,0.002,0.000,0.998,12.795,29.969,0.000,0.032 30.8,0.002,0.000,0.998,12.795,29.970,0.000,0.031 30.9,0.002,0.000,0.998,12.795,29.971,0.000,0.030 31,0.002,0.000,0.998,12.795,29.971,0.000,0.029 31.1,0.002,0.000,0.998,12.795,29.972,0.000,0.029 31.2,0.002,0.000,0.998,12.795,29.973,0.000,0.028 31.3,0.002,0.000,0.998,12.795,29.974,0.000,0.027 31.4,0.002,0.000,0.998,12.795,29.974,0.000,0.026 31.5,0.002,0.000,0.998,12.795,29.975,0.000,0.026 31.6,0.002,0.000,0.998,12.795,29.976,0.000,0.025 31.7,0.002,0.000,0.998,12.795,29.976,0.000,0.024 31.8,0.002,0.000,0.998,12.795,29.977,0.000,0.024 31.9,0.002,0.000,0.998,12.795,29.978,0.000,0.023 32,0.002,0.000,0.998,12.795,29.978,0.000,0.023 32.1,0.002,0.000,0.998,12.795,29.979,0.000,0.022 32.2,0.002,0.000,0.998,12.795,29.979,0.000,0.021 32.3,0.002,0.000,0.998,12.795,29.980,0.000,0.021 32.4,0.002,0.000,0.998,12.795,29.981,0.000,0.020 32.5,0.002,0.000,0.998,12.795,29.981,0.000,0.020 32.6,0.002,0.000,0.998,12.795,29.982,0.000,0.019 32.7,0.002,0.000,0.998,12.795,29.982,0.000,0.019 32.8,0.002,0.000,0.998,12.795,29.983,0.000,0.018 32.9,0.002,0.000,0.998,12.795,29.983,0.000,0.018 33,0.002,0.000,0.998,12.795,29.984,0.000,0.017 33.1,0.002,0.000,0.998,12.795,29.984,0.000,0.017 33.2,0.002,0.000,0.998,12.795,29.985,0.000,0.016 33.3,0.002,0.000,0.998,12.795,29.985,0.000,0.016 33.4,0.002,0.000,0.998,12.795,29.985,0.000,0.015 33.5,0.002,0.000,0.998,12.795,29.986,0.000,0.015 33.6,0.002,0.000,0.998,12.795,29.986,0.000,0.015 33.7,0.002,0.000,0.998,12.795,29.987,0.000,0.014 33.8,0.002,0.000,0.998,12.795,29.987,0.000,0.014 33.9,0.002,0.000,0.998,12.795,29.987,0.000,0.014 34,0.002,0.000,0.998,12.795,29.988,0.000,0.013 34.1,0.002,0.000,0.998,12.795,29.988,0.000,0.013 34.2,0.002,0.000,0.998,12.795,29.988,0.000,0.012 34.3,0.002,0.000,0.998,12.795,29.989,0.000,0.012 34.4,0.002,0.000,0.998,12.795,29.989,0.000,0.012 34.5,0.002,0.000,0.998,12.795,29.989,0.000,0.012 34.6,0.002,0.000,0.998,12.795,29.990,0.000,0.011 34.7,0.002,0.000,0.998,12.795,29.990,0.000,0.011 34.8,0.002,0.000,0.998,12.795,29.990,0.000,0.011 34.9,0.002,0.000,0.998,12.795,29.991,0.000,0.010 35,0.002,0.000,0.998,12.795,29.991,0.000,0.010 35.1,0.002,0.000,0.998,12.795,29.991,0.000,0.010 35.2,0.002,0.000,0.998,12.795,29.991,0.000,0.010 35.3,0.002,0.000,0.998,12.795,29.992,0.000,0.009 35.4,0.002,0.000,0.998,12.795,29.992,0.000,0.009 35.5,0.002,0.000,0.998,12.795,29.992,0.000,0.009 35.6,0.002,0.000,0.998,12.795,29.992,0.000,0.009 35.7,0.002,0.000,0.998,12.795,29.993,0.000,0.008 35.8,0.002,0.000,0.998,12.795,29.993,0.000,0.008 35.9,0.002,0.000,0.998,12.795,29.993,0.000,0.008 36,0.002,0.000,0.998,12.795,29.993,0.000,0.008 36.1,0.002,0.000,0.998,12.795,29.993,0.000,0.008 36.2,0.002,0.000,0.998,12.795,29.994,0.000,0.007 36.3,0.002,0.000,0.998,12.795,29.994,0.000,0.007 36.4,0.002,0.000,0.998,12.795,29.994,0.000,0.007 36.5,0.002,0.000,0.998,12.795,29.994,0.000,0.007 36.6,0.002,0.000,0.998,12.795,29.994,0.000,0.007 36.7,0.002,0.000,0.998,12.795,29.995,0.000,0.006 36.8,0.002,0.000,0.998,12.795,29.995,0.000,0.006 36.9,0.002,0.000,0.998,12.795,29.995,0.000,0.006 37,0.002,0.000,0.998,12.795,29.995,0.000,0.006 37.1,0.002,0.000,0.998,12.795,29.995,0.000,0.006 37.2,0.002,0.000,0.998,12.795,29.995,0.000,0.006 37.3,0.002,0.000,0.998,12.795,29.996,0.000,0.005 37.4,0.002,0.000,0.998,12.795,29.996,0.000,0.005 37.5,0.002,0.000,0.998,12.795,29.996,0.000,0.005 37.6,0.002,0.000,0.998,12.795,29.996,0.000,0.005 37.7,0.002,0.000,0.998,12.795,29.996,0.000,0.005 37.8,0.002,0.000,0.998,12.795,29.996,0.000,0.005 37.9,0.002,0.000,0.998,12.795,29.996,0.000,0.005 38,0.002,0.000,0.998,12.795,29.996,0.000,0.005 38.1,0.002,0.000,0.998,12.795,29.997,0.000,0.004 38.2,0.002,0.000,0.998,12.795,29.997,0.000,0.004 38.3,0.002,0.000,0.998,12.795,29.997,0.000,0.004 38.4,0.002,0.000,0.998,12.795,29.997,0.000,0.004 38.5,0.002,0.000,0.998,12.795,29.997,0.000,0.004 38.6,0.002,0.000,0.998,12.795,29.997,0.000,0.004 38.7,0.002,0.000,0.998,12.795,29.997,0.000,0.004 38.8,0.002,0.000,0.998,12.795,29.997,0.000,0.004 38.9,0.002,0.000,0.998,12.795,29.997,0.000,0.004 39,0.002,0.000,0.998,12.795,29.998,0.000,0.003 39.1,0.002,0.000,0.998,12.795,29.998,0.000,0.003 39.2,0.002,0.000,0.998,12.795,29.998,0.000,0.003 39.3,0.002,0.000,0.998,12.795,29.998,0.000,0.003 39.4,0.002,0.000,0.998,12.795,29.998,0.000,0.003 39.5,0.002,0.000,0.998,12.795,29.998,0.000,0.003 39.6,0.002,0.000,0.998,12.795,29.998,0.000,0.003 39.7,0.002,0.000,0.998,12.795,29.998,0.000,0.003 39.8,0.002,0.000,0.998,12.795,29.998,0.000,0.003 39.9,0.002,0.000,0.998,12.795,29.998,0.000,0.003 40,0.002,0.000,0.998,12.795,29.998,0.000,0.003 40.1,0.002,0.000,0.998,12.795,29.998,0.000,0.003 40.2,0.002,0.000,0.998,12.795,29.998,0.000,0.002 40.3,0.002,0.000,0.998,12.795,29.999,0.000,0.002 40.4,0.002,0.000,0.998,12.795,29.999,0.000,0.002 40.5,0.002,0.000,0.998,12.795,29.999,0.000,0.002 40.6,0.002,0.000,0.998,12.795,29.999,0.000,0.002 40.7,0.002,0.000,0.998,12.795,29.999,0.000,0.002 40.8,0.002,0.000,0.998,12.795,29.999,0.000,0.002 40.9,0.002,0.000,0.998,12.795,29.999,0.000,0.002 41,0.002,0.000,0.998,12.795,29.999,0.000,0.002 41.1,0.002,0.000,0.998,12.795,29.999,0.000,0.002 41.2,0.002,0.000,0.998,12.795,29.999,0.000,0.002 41.3,0.002,0.000,0.998,12.795,29.999,0.000,0.002 41.4,0.002,0.000,0.998,12.795,29.999,0.000,0.002 41.5,0.002,0.000,0.998,12.795,29.999,0.000,0.002 41.6,0.002,0.000,0.998,12.795,29.999,0.000,0.002 41.7,0.002,0.000,0.998,12.795,29.999,0.000,0.002 41.8,0.002,0.000,0.998,12.795,29.999,0.000,0.002 41.9,0.002,0.000,0.998,12.795,29.999,0.000,0.002 42,0.002,0.000,0.998,12.795,29.999,0.000,0.002 42.1,0.002,0.000,0.998,12.795,29.999,0.000,0.001 42.2,0.002,0.000,0.998,12.795,30.000,0.000,0.001 42.3,0.002,0.000,0.998,12.795,30.000,0.000,0.001 42.4,0.002,0.000,0.998,12.795,30.000,0.000,0.001 42.5,0.002,0.000,0.998,12.795,30.000,0.000,0.001 42.6,0.002,0.000,0.998,12.795,30.000,0.000,0.001 42.7,0.002,0.000,0.998,12.795,30.000,0.000,0.001 42.8,0.002,0.000,0.998,12.795,30.000,0.000,0.001 42.9,0.002,0.000,0.998,12.795,30.000,0.000,0.001 43,0.002,0.000,0.998,12.795,30.000,0.000,0.001 43.1,0.002,0.000,0.998,12.795,30.000,0.000,0.001 43.2,0.002,0.000,0.998,12.795,30.000,0.000,0.001 43.3,0.002,0.000,0.998,12.795,30.000,0.000,0.001 43.4,0.002,0.000,0.998,12.795,30.000,0.000,0.001 43.5,0.002,0.000,0.998,12.795,30.000,0.000,0.001 43.6,0.002,0.000,0.998,12.795,30.000,0.000,0.001 43.7,0.002,0.000,0.998,12.795,30.000,0.000,0.001 43.8,0.002,0.000,0.998,12.795,30.000,0.000,0.001 43.9,0.002,0.000,0.998,12.795,30.000,0.000,0.001 44,0.002,0.000,0.998,12.795,30.000,0.000,0.001 44.1,0.002,0.000,0.998,12.795,30.000,0.000,0.001 44.2,0.002,0.000,0.998,12.795,30.000,0.000,0.001 44.3,0.002,0.000,0.998,12.795,30.000,0.000,0.001 44.4,0.002,0.000,0.998,12.795,30.000,0.000,0.001 44.5,0.002,0.000,0.998,12.795,30.000,0.000,0.001 44.6,0.002,0.000,0.998,12.795,30.000,0.000,0.001 44.7,0.002,0.000,0.998,12.795,30.000,0.000,0.001 44.8,0.002,0.000,0.998,12.795,30.000,0.000,0.001 44.9,0.002,0.000,0.998,12.795,30.000,0.000,0.001 45,0.002,0.000,0.998,12.795,30.000,0.000,0.001 45.1,0.002,0.000,0.998,12.795,30.000,0.000,0.001 45.2,0.002,0.000,0.998,12.795,30.000,0.000,0.001 45.3,0.002,0.000,0.998,12.795,30.000,0.000,0.001 45.4,0.002,0.000,0.998,12.795,30.000,0.000,0.001 45.5,0.002,0.000,0.998,12.795,30.000,0.000,0.001 45.6,0.002,0.000,0.998,12.795,30.000,0.000,0.001 45.7,0.002,0.000,0.998,12.795,30.000,0.000,0.001 45.8,0.002,0.000,0.998,12.795,30.000,0.000,0.001 45.9,0.002,0.000,0.998,12.795,30.000,0.000,0.001 46,0.002,0.000,0.998,12.795,30.000,0.000,0.001 46.1,0.002,0.000,0.998,12.795,30.000,0.000,0.001 46.2,0.002,0.000,0.998,12.795,30.000,0.000,0.000 46.3,0.002,0.000,0.998,12.795,30.000,0.000,0.000 46.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 46.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 46.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 46.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 46.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 46.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 47,0.002,0.000,0.998,12.795,30.001,0.000,0.000 47.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 47.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 47.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 47.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 47.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 47.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 47.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 47.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 47.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 48,0.002,0.000,0.998,12.795,30.001,0.000,0.000 48.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 48.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 48.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 48.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 48.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 48.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 48.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 48.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 48.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 49,0.002,0.000,0.998,12.795,30.001,0.000,0.000 49.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 49.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 49.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 49.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 49.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 49.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 49.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 49.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 49.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 50,0.002,0.000,0.998,12.795,30.001,0.000,0.000 50.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 50.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 50.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 50.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 50.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 50.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 50.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 50.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 50.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 51,0.002,0.000,0.998,12.795,30.001,0.000,0.000 51.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 51.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 51.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 51.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 51.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 51.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 51.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 51.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 51.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 52,0.002,0.000,0.998,12.795,30.001,0.000,0.000 52.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 52.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 52.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 52.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 52.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 52.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 52.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 52.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 52.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 53,0.002,0.000,0.998,12.795,30.001,0.000,0.000 53.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 53.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 53.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 53.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 53.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 53.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 53.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 53.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 53.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 54,0.002,0.000,0.998,12.795,30.001,0.000,0.000 54.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 54.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 54.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 54.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 54.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 54.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 54.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 54.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 54.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 55,0.002,0.000,0.998,12.795,30.001,0.000,0.000 55.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 55.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 55.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 55.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 55.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 55.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 55.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 55.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 55.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 56,0.002,0.000,0.998,12.795,30.001,0.000,0.000 56.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 56.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 56.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 56.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 56.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 56.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 56.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 56.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 56.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 57,0.002,0.000,0.998,12.795,30.001,0.000,0.000 57.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 57.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 57.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 57.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 57.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 57.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 57.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 57.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 57.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 58,0.002,0.000,0.998,12.795,30.001,0.000,0.000 58.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 58.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 58.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 58.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 58.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 58.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 58.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 58.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 58.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 59,0.002,0.000,0.998,12.795,30.001,0.000,0.000 59.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 59.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 59.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 59.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 59.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 59.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 59.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 59.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 59.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 60,0.002,0.000,0.998,12.795,30.001,0.000,0.000 60.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 60.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 60.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 60.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 60.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 60.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 60.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 60.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 60.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 61,0.002,0.000,0.998,12.795,30.001,0.000,0.000 61.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 61.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 61.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 61.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 61.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 61.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 61.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 61.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 61.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 62,0.002,0.000,0.998,12.795,30.001,0.000,0.000 62.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 62.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 62.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 62.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 62.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 62.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 62.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 62.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 62.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 63,0.002,0.000,0.998,12.795,30.001,0.000,0.000 63.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 63.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 63.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 63.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 63.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 63.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 63.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 63.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 63.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 64,0.002,0.000,0.998,12.795,30.001,0.000,0.000 64.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 64.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 64.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 64.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 64.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 64.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 64.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 64.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 64.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 65,0.002,0.000,0.998,12.795,30.001,0.000,0.000 65.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 65.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 65.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 65.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 65.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 65.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 65.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 65.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 65.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 66,0.002,0.000,0.998,12.795,30.001,0.000,0.000 66.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 66.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 66.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 66.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 66.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 66.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 66.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 66.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 66.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 67,0.002,0.000,0.998,12.795,30.001,0.000,0.000 67.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 67.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 67.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 67.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 67.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 67.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 67.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 67.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 67.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 68,0.002,0.000,0.998,12.795,30.001,0.000,0.000 68.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 68.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 68.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 68.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 68.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 68.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 68.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 68.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 68.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 69,0.002,0.000,0.998,12.795,30.001,0.000,0.000 69.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 69.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 69.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 69.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 69.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 69.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 69.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 69.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 69.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 70,0.002,0.000,0.998,12.795,30.001,0.000,0.000 70.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 70.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 70.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 70.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 70.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 70.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 70.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 70.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 70.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 71,0.002,0.000,0.998,12.795,30.001,0.000,0.000 71.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 71.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 71.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 71.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 71.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 71.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 71.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 71.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 71.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 72,0.002,0.000,0.998,12.795,30.001,0.000,0.000 72.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 72.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 72.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 72.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 72.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 72.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 72.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 72.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 72.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 73,0.002,0.000,0.998,12.795,30.001,0.000,0.000 73.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 73.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 73.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 73.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 73.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 73.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 73.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 73.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 73.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 74,0.002,0.000,0.998,12.795,30.001,0.000,0.000 74.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 74.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 74.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 74.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 74.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 74.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 74.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 74.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 74.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 75,0.002,0.000,0.998,12.795,30.001,0.000,0.000 75.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 75.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 75.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 75.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 75.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 75.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 75.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 75.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 75.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 76,0.002,0.000,0.998,12.795,30.001,0.000,0.000 76.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 76.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 76.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 76.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 76.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 76.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 76.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 76.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 76.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 77,0.002,0.000,0.998,12.795,30.001,0.000,0.000 77.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 77.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 77.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 77.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 77.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 77.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 77.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 77.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 77.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 78,0.002,0.000,0.998,12.795,30.001,0.000,0.000 78.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 78.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 78.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 78.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 78.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 78.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 78.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 78.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 78.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 79,0.002,0.000,0.998,12.795,30.001,0.000,0.000 79.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 79.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 79.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 79.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 79.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 79.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 79.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 79.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 79.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 80,0.002,0.000,0.998,12.795,30.001,0.000,0.000 80.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 80.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 80.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 80.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 80.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 80.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 80.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 80.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 80.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 81,0.002,0.000,0.998,12.795,30.001,0.000,0.000 81.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 81.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 81.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 81.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 81.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 81.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 81.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 81.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 81.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 82,0.002,0.000,0.998,12.795,30.001,0.000,0.000 82.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 82.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 82.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 82.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 82.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 82.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 82.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 82.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 82.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 83,0.002,0.000,0.998,12.795,30.001,0.000,0.000 83.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 83.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 83.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 83.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 83.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 83.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 83.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 83.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 83.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 84,0.002,0.000,0.998,12.795,30.001,0.000,0.000 84.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 84.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 84.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 84.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 84.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 84.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 84.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 84.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 84.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 85,0.002,0.000,0.998,12.795,30.001,0.000,0.000 85.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 85.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 85.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 85.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 85.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 85.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 85.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 85.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 85.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 86,0.002,0.000,0.998,12.795,30.001,0.000,0.000 86.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 86.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 86.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 86.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 86.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 86.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 86.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 86.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 86.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 87,0.002,0.000,0.998,12.795,30.001,0.000,0.000 87.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 87.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 87.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 87.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 87.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 87.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 87.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 87.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 87.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 88,0.002,0.000,0.998,12.795,30.001,0.000,0.000 88.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 88.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 88.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 88.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 88.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 88.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 88.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 88.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 88.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 89,0.002,0.000,0.998,12.795,30.001,0.000,0.000 89.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 89.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 89.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 89.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 89.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 89.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 89.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 89.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 89.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 90,0.002,0.000,0.998,12.795,30.001,0.000,0.000 90.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 90.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 90.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 90.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 90.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 90.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 90.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 90.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 90.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 91,0.002,0.000,0.998,12.795,30.001,0.000,0.000 91.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 91.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 91.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 91.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 91.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 91.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 91.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 91.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 91.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 92,0.002,0.000,0.998,12.795,30.001,0.000,0.000 92.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 92.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 92.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 92.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 92.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 92.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 92.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 92.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 92.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 93,0.002,0.000,0.998,12.795,30.001,0.000,0.000 93.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 93.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 93.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 93.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 93.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 93.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 93.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 93.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 93.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 94,0.002,0.000,0.998,12.795,30.001,0.000,0.000 94.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 94.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 94.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 94.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 94.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 94.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 94.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 94.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 94.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 95,0.002,0.000,0.998,12.795,30.001,0.000,0.000 95.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 95.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 95.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 95.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 95.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 95.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 95.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 95.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 95.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 96,0.002,0.000,0.998,12.795,30.001,0.000,0.000 96.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 96.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 96.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 96.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 96.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 96.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 96.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 96.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 96.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 97,0.002,0.000,0.998,12.795,30.001,0.000,0.000 97.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 97.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 97.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 97.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 97.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 97.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 97.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 97.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 97.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 98,0.002,0.000,0.998,12.795,30.001,0.000,0.000 98.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 98.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 98.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 98.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 98.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 98.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 98.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 98.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 98.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 99,0.002,0.000,0.998,12.795,30.001,0.000,0.000 99.1,0.002,0.000,0.998,12.795,30.001,0.000,0.000 99.2,0.002,0.000,0.998,12.795,30.001,0.000,0.000 99.3,0.002,0.000,0.998,12.795,30.001,0.000,0.000 99.4,0.002,0.000,0.998,12.795,30.001,0.000,0.000 99.5,0.002,0.000,0.998,12.795,30.001,0.000,0.000 99.6,0.002,0.000,0.998,12.795,30.001,0.000,0.000 99.7,0.002,0.000,0.998,12.795,30.001,0.000,0.000 99.8,0.002,0.000,0.998,12.795,30.001,0.000,0.000 99.9,0.002,0.000,0.998,12.795,30.001,0.000,0.000 100,0.002,0.000,0.998,12.795,30.001,0.000,0.000 asymptote-3.05/doc/Makefile.in0000644000000000000000000000573215031566105015007 0ustar rootrootMANFILES = asy.1 xasy.1x ASYFILES = $(filter-out $(wildcard latexusage-*.asy),$(wildcard *.asy)) SOURCE = asymptote.texi version.texi options ASY = ../asy -dir ../base -config "" -render=0 DOCFILES = asymptote.pdf asy-latex.pdf CAD.pdf TeXShopAndAsymptote.pdf \ asyRefCard.pdf docdir = $(DESTDIR)@docdir@ infodir = $(DESTDIR)@infodir@ datarootdir = @datarootdir@ INSTALL = @INSTALL@ TEXI2DVI = @TEXI2DVI@ PERL5LIB = ./ export docdir infodir INSTALL PERL5LIB all: doc asy-latex.pdf: pdflatex asy-latex.dtx asymptote.sty: pdflatex asy-latex.dtx dvi: doc asymptote.dvi doc: $(DOCFILES) asy.1 faq cd png && $(MAKE) all manpage: $(MANFILES) man: $(DOCFILES) manpage cd png && $(MAKE) asymptote.info faq: cd FAQ && $(MAKE) faq %.eps: %.asy $(ASY) -f eps $< %.pdf: %.asy $(ASY) -f pdf -noprc $< latexusage.pdf: latexusage.tex asymptote.sty rm -f latexusage-* rm -f latexusage.pre rm -f latexusage.aux pdflatex latexusage $(ASY) -noprc latexusage-*.asy pdflatex latexusage options: ../settings.cc $(ASY) -h 2>&1 | grep -iv Asymptote > options asy.1: options asy.1.begin asy.1.end cat options | grep \^- | \ sed -e "s/-\(.*\) \([a-zA-Z0-9].*\)/.TP\n.B -\1\n\2\./" | \ sed -e "/^.B/ s/-/\\\\-/g" | cat asy.1.begin - asy.1.end > asy.1 asymptote.dvi: $(SOURCE) $(ASYFILES:.asy=.eps) latexusage.pdf ln -sf asymptote.texi asymptote_.texi -$(TEXI2DVI) asymptote_.texi mv asymptote_.dvi asymptote.dvi asymptote.pdf: $(SOURCE) $(ASYFILES:.asy=.pdf) latexusage.pdf -$(TEXI2DVI) --pdf asymptote.texi CAD.pdf: CAD.tex CAD1.eps pdflatex CAD pdflatex CAD pdflatex CAD TeXShopAndAsymptote.pdf: TeXShopAndAsymptote.tex pdflatex TeXShopAndAsymptote pdflatex TeXShopAndAsymptote asyRefCard.pdf: asyRefCard.tex pdftex asyRefCard clean: FORCE -rm -f asy-latex.{aux,idx,ins,log,toc,out,hd,ins} -rm -f $(ASYFILES:.asy=.pdf) -rm -f *.eps latexusage.{dvi,eps,pdf,log,aux,out,*.eps} latexusage-* \ latexusage.pre -rm -f \ {asymptote,asymptote_}.{aux,cp,cps,dvi,fn,info,ky,log,pg,toc,tp,vr} -rm -f asymptote_.texi -rm -f {CAD,TeXShopAndAsymptote,asyRefCard}.{aux,dvi,log,toc} -rm -f options asy.1 cd png && $(MAKE) clean install-man: ${INSTALL} -d -m 755 $(docdir) $(mandir)/man1 ${INSTALL} -p -m 644 $(DOCFILES) $(docdir) ${INSTALL} -p -m 644 $(MANFILES) $(mandir)/man1 install: man faq install-man cd png && $(MAKE) install cd FAQ && $(MAKE) install install-prebuilt: install-man options touch png/asymptote.info cd png && $(MAKE) install cd FAQ && $(MAKE) install-prebuilt install-all: $(DOCFILES) $(MANFILES) faq install-man cd png && $(MAKE) install-all cd FAQ && $(MAKE) install-info uninstall: uninstall-all uninstall-all: cd png && $(MAKE) uninstall cd FAQ && $(MAKE) uninstall -cd $(mandir)/man1 && rm -f $(MANFILES) -rm -f $(addprefix $(docdir)/,$(DOCFILES)) distclean: FORCE clean -rm -f version.texi Makefile -rm -f $(DOCFILES) cd png && $(MAKE) distclean cd FAQ && $(MAKE) distclean FORCE: Makefile: Makefile.in cd ..; config.status asymptote-3.05/doc/loggraph.asy0000644000000000000000000000040615031566105015254 0ustar rootrootimport graph; size(200,200,IgnoreAspect); real f(real t) {return 1/t;} scale(Log,Log); draw(graph(f,0.1,10)); //limits((1,0.1),(10,0.5),Crop); dot(Label("(3,5)",align=S),Scale((3,5))); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); asymptote-3.05/doc/triangulate.asy0000644000000000000000000000061415031566105015771 0ustar rootrootsize(200); int np=100; pair[] points; real r() {return 1.2*(rand()/randMax*2-1);} for(int i=0; i < np; ++i) points.push((r(),r())); int[][] trn=triangulate(points); for(int i=0; i < trn.length; ++i) { draw(points[trn[i][0]]--points[trn[i][1]]); draw(points[trn[i][1]]--points[trn[i][2]]); draw(points[trn[i][2]]--points[trn[i][0]]); } for(int i=0; i < np; ++i) dot(points[i],red); asymptote-3.05/doc/markers1.asy0000644000000000000000000000516215031566105015202 0ustar rootrootsize(12cm,0); import markers; pair A=(0,0), B=(1,0), C=(2,0), D=(3,0); path p=A--B--C--D; transform T=shift(-4,-1); transform t=shift(4,0); //line 1 ********** draw(p,marker(markinterval(3,dotframe,true))); label("$1$",point(p,0),3W); //line 2 ********** p=t*p; draw(p,marker(stickframe,markuniform(4))); label("$2$",point(p,0),3W); //line 3 ********** p=T*p; draw(p,marker(stickframe(red),markinterval(3,dotframe(blue),true))); label("$3$",point(p,0),3W); //line 4 ********** p=t*p; draw(p,StickIntervalMarker(3,2,blue,dotframe(red))); label("$4$",point(p,0),3W); //line 5 ********** p=T*p; pen pn=linewidth(4bp); draw(p,pn,StickIntervalMarker(3,3,angle=25,pn,dotframe(red+pn))); label("$5$",point(p,0),3W); //line 6 ********** p=t*p; draw(p,StickIntervalMarker(3,5,angle=25,size=4mm,space=2mm,offset=I*2mm, scale(2)*dotframe(red))); label("$6$",point(p,0),3W); //line 7 ********** p=T*p; draw(p,StickIntervalMarker(n=3,angle=45,size=10mm,space=3mm,dotframe)); label("$7$",point(p,0),3W); //line 8 ********** p=t*p; draw(p,CircleBarIntervalMarker(n=2,dotframe)); label("$8$",point(p,0),3W); //line 9 ********** p=T*p; draw(p,CircleBarIntervalMarker(n=3,angle=30,barsize=8mm,radius=2mm, FillDraw(.8red), dotframe)); label("$9$",point(p,0),3W); //line 10 ********** p=t*p; draw(p,CircleBarIntervalMarker(n=3,angle=30,barsize=8mm,radius=2mm, FillDraw(.8red),circleabove=true,dotframe)); label("$10$",point(p,0),3W); //line 11 ********** p=T*p; draw(p,CircleBarIntervalMarker(n=3,angle=30,barsize=8mm,radius=2mm, FillDraw(.8red),circleabove=true,dotframe, above=false)); label("$11$",point(p,0),3W); //line 12 ********** p=t*p; draw(p,TildeIntervalMarker(i=3,dotframe)); label("$12$",point(p,0),3W); //line 13 ********** p=T*p; draw(p,TildeIntervalMarker(i=3,n=2,angle=-20,dotframe)); label("$13$",point(p,0),3W); //line 14 ********** p=t*p; draw(p,CrossIntervalMarker(3,3,dotframe)); label("$14$",point(p,0),3W); //line 15 ********** p=shift(.25S)*T*p; path cle=shift(relpoint(p,.5))*scale(abs(A-D)/4)*unitcircle; draw(cle,StickIntervalMarker(5,3,dotframe(6bp+red))); label("$15$",point(p,0),3W); //line 16 ********** cle=t*cle; p=t*p; frame a; label(a,"$a$",(0,-2labelmargin())); draw(cle,marker(dotframe(6bp+red),markinterval(5,a,true))); label("$16$",point(p,0),3W); // line 17 ********** p=T*shift(relpoint(p,.5)+.65S)*scale(.5)*shift(-relpoint(p,.5))*rotate(45,relpoint(p,.5))*p; draw(p,TildeIntervalMarker(size=5mm,rotated=false,dotframe)); label("$17$",point(p,0),3W); asymptote-3.05/doc/basealign.asy0000644000000000000000000000201115031566105015370 0ustar rootrootimport fontsize; import three; settings.autobillboard=false; settings.embed=false; currentprojection=orthographic(Z); defaultpen(fontsize(100pt)); dot(O); label("acg",O,align=N,basealign); label("ace",O,align=N,red); label("acg",O,align=S,basealign); label("ace",O,align=S,red); label("acg",O,align=E,basealign); label("ace",O,align=E,red); label("acg",O,align=W,basealign); label("ace",O,align=W,red); picture pic; dot(pic,(labelmargin(),0,0),blue); dot(pic,(-labelmargin(),0,0),blue); dot(pic,(0,labelmargin(),0),blue); dot(pic,(0,-labelmargin(),0),blue); add(pic,O); dot((0,0)); label("acg",(0,0),align=N,basealign); label("ace",(0,0),align=N,red); label("acg",(0,0),align=S,basealign); label("ace",(0,0),align=S,red); label("acg",(0,0),align=E,basealign); label("ace",(0,0),align=E,red); label("acg",(0,0),align=W,basealign); label("ace",(0,0),align=W,red); picture pic; dot(pic,(labelmargin(),0),blue); dot(pic,(-labelmargin(),0),blue); dot(pic,(0,labelmargin()),blue); dot(pic,(0,-labelmargin()),blue); add(pic,(0,0)); asymptote-3.05/doc/install-sh0000755000000000000000000003253715031566105014751 0ustar rootroot#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: asymptote-3.05/doc/dots.asy0000644000000000000000000000006115031566105014417 0ustar rootrootdraw((0,0){up}..(100,25){right}..(200,0){down}); asymptote-3.05/doc/asyRefCard.tex0000644000000000000000000004712315031566105015507 0ustar rootroot% Reference Card for Asymptote % Copyright (c) 2011 John C. Bowman. May be freely distributed. % Thanks to Stephen Gildea for the multicolumn macro package % and Joseph H. Silverman for the C Reference card. %**start of header \newcount\columnsperpage \overfullrule=0pt % This file can be printed with 1, 2, or 3 columns per page (see below). % [For 2 or 3 columns, you'll need 6 and 8 point fonts.] % Specify how many you want here. Nothing else needs to be changed. \columnsperpage=2 % This reference card is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. % This file is intended to be processed by plain TeX (TeX82). % % The final reference card has six columns, three on each side. % This file can be used to produce it in any of three ways: % 1 column per page % produces six separate pages, each of which needs to be reduced to 80%. % This gives the best resolution. % 2 columns per page % produces three already-reduced pages. % You will still need to cut and paste. % 3 columns per page % produces two pages which must be printed sideways to make a % ready-to-use 8.5 x 11 inch reference card. % For this you need a dvi device driver that can print sideways. % Which mode to use is controlled by setting \columnsperpage above. % % (reference card macros due to Stephen Gildea) % \def\versionnumber{1.1} % Version of this reference card \def\year{2014} \def\month{May} \def\version{\month\ \year\ v\versionnumber} \def\shortcopyrightnotice{\vskip .5ex plus 2 fill \centerline{\small \copyright\ \year\ John C. Bowman Permissions on back. v\versionnumber}} \def\copyrightnotice{ \vskip 1ex plus 100 fill\begingroup\small \centerline{\version. Copyright \copyright\ \year\ John C. Bowman} Permission is granted to make and distribute copies of this card, with or without modifications, provided the copyright notice and this permission notice are preserved on all copies. \endgroup} % make \bye not \outer so that the \def\bye in the \else clause below % can be scanned without complaint. \def\bye{\par\vfill\supereject\end} \newdimen\intercolumnskip \newbox\columna \newbox\columnb \def\ncolumns{\the\columnsperpage} \message{[\ncolumns\space column\if 1\ncolumns\else s\fi\space per page]} \def\scaledmag#1{ scaled \magstep #1} % This multi-way format was designed by Stephen Gildea % October 1986. \if 1\ncolumns \hsize 4in \vsize 10in \voffset -.7in \font\titlefont=\fontname\tenbf \scaledmag3 \font\headingfont=\fontname\tenbf \scaledmag2 \font\headingfonttt=\fontname\tentt \scaledmag2 \font\smallfont=\fontname\sevenrm \font\smallsy=\fontname\sevensy \footline{\hss\folio} \def\makefootline{\baselineskip10pt\hsize6.5in\line{\the\footline}} \else \hsize 3.2in \vsize 7.95in \hoffset -.75in \voffset -.745in \font\titlefont=cmbx10 \scaledmag2 \font\headingfont=cmbx10 \scaledmag1 \font\headingfonttt=cmtt10 \scaledmag1 \font\smallfont=cmr6 \font\smallsy=cmsy6 \font\eightrm=cmr8 \font\eightbf=cmbx8 \font\eightit=cmti8 \font\eighttt=cmtt8 \font\eightsy=cmsy8 \font\eightsl=cmsl8 \font\eighti=cmmi8 \font\eightex=cmex10 at 8pt \textfont0=\eightrm \textfont1=\eighti \textfont2=\eightsy \textfont3=\eightex \def\rm{\fam0 \eightrm} \def\bf{\eightbf} \def\it{\eightit} \def\tt{\eighttt} \def\sl{\eightsl} \normalbaselineskip=.8\normalbaselineskip \normallineskip=.8\normallineskip \normallineskiplimit=.8\normallineskiplimit \normalbaselines\rm %make definitions take effect \if 2\ncolumns \let\maxcolumn=b \footline{\hss\rm\folio\hss} \def\makefootline{\vskip 2in \hsize=6.86in\line{\the\footline}} \else \if 3\ncolumns \let\maxcolumn=c \nopagenumbers \else \errhelp{You must set \columnsperpage equal to 1, 2, or 3.} \errmessage{Illegal number of columns per page} \fi\fi \intercolumnskip=.46in \def\abc{a} \output={% % This next line is useful when designing the layout. %\immediate\write16{Column \folio\abc\space starts with \firstmark} \if \maxcolumn\abc \multicolumnformat \global\def\abc{a} \else\if a\abc \global\setbox\columna\columnbox \global\def\abc{b} %% in case we never use \columnb (two-column mode) \global\setbox\columnb\hbox to -\intercolumnskip{} \else \global\setbox\columnb\columnbox \global\def\abc{c}\fi\fi} \def\multicolumnformat{\shipout\vbox{\makeheadline \hbox{\box\columna\hskip\intercolumnskip \box\columnb\hskip\intercolumnskip\columnbox} \makefootline}\advancepageno} \def\columnbox{\leftline{\pagebody}} \def\bye{\par\vfill\supereject \if a\abc \else\null\vfill\eject\fi \if a\abc \else\null\vfill\eject\fi \end} \fi % we won't be using math mode much, so redefine some of the characters % we might want to talk about \catcode`\^=12 %\catcode`\_=12 \catcode`\~=12 \chardef\\=`\\ \chardef\{=`\{ \chardef\}=`\} \chardef\underscore=`\_ \hyphenation{} \parindent 0pt \parskip .85ex plus .35ex minus .5ex \def\small{\smallfont\textfont2=\smallsy\baselineskip=.8\baselineskip} \outer\def\newcolumn{\vfill\eject} \outer\def\title#1{{\titlefont\centerline{#1}}\vskip 1ex plus .5ex} \outer\def\section#1{\par\filbreak \vskip .5ex minus .1ex {\headingfont #1}\mark{#1}% \vskip .3ex minus .1ex} \outer\def\librarysection#1#2{\par\filbreak \vskip .5ex minus .1ex {\headingfont #1}\quad{\headingfonttt<#2>}\mark{#1}% \vskip .3ex minus .1ex} \newdimen\keyindent \def\beginindentedkeys{\keyindent=1em} \def\endindentedkeys{\keyindent=0em} \def\begindoubleindentedkeys{\keyindent=2em} \def\enddoubleindentedkeys{\keyindent=1em} \endindentedkeys \def\paralign{\vskip\parskip\halign} \def\<#1>{$\langle${\rm #1}$\rangle$} \def\kbd#1{{\tt#1}\null} %\null so not an abbrev even if period follows \def\beginexample{\par\vskip1\jot \hrule width.5\hsize \vskip1\jot \begingroup\parindent=2em \obeylines\obeyspaces\parskip0pt\tt} {\obeyspaces\global\let =\ } \def\endexample{\endgroup} \def\Example{\qquad{\sl Example\/}.\enspace\ignorespaces} \def\key#1#2{\leavevmode\hbox to \hsize{\vtop {\hsize=.75\hsize\rightskip=1em \hskip\keyindent\relax#1}\kbd{#2}\hfil}} \newbox\metaxbox \setbox\metaxbox\hbox{\kbd{M-x }} \newdimen\metaxwidth \metaxwidth=\wd\metaxbox \def\metax#1#2{\leavevmode\hbox to \hsize{\hbox to .75\hsize {\hskip\keyindent\relax#1\hfil}% \hskip -\metaxwidth minus 1fil \kbd{#2}\hfil}} \def\threecol#1#2#3{\hskip\keyindent\relax#1\hfil&\kbd{#2}\quad &\kbd{#3}\quad\cr} % Define Italic Names \def\makedef#1 {% \expandafter\edef\csname#1\endcsname{\hbox{\it#1\/}}} \makedef array \makedef arg \makedef const \makedef dim \makedef expr \makedef filename \makedef f \makedef format \makedef member \makedef name \makedef statement \makedef statements \makedef string \makedef type \makedef value \makedef var %**end of header \title{Asymptote Reference Card} \section{Program structure/functions} \halign{\tt#\hfil&\qquad#\hfil\cr import "\filename"&import module\cr import "\filename" as name&import filename as module name\cr include "\filename"&include verbatim text from file\cr \type\ \f(\type,\dots);&optional function declaration\cr \type\ \name;&variable declaration\cr \type\ \f(\type\ \arg,\dots) \{&function definition\cr \quad\statements\cr \quad return \value;\cr \}\cr } \section{Data types/declarations} \key{boolean (true or false)}{bool} \key{tri-state boolean (true, default, or false)}{bool3} \key{integer}{int} \key{float (double precision)}{real} \key{ordered pair (complex number)}{pair} \key{character string}{string} \key{fixed piecewise cubic Bezier spline}{path} \key{unresolved piecewise cubic Bezier spline}{guide} \key{color, line type/width/cap, font, fill rule}{pen} \key{label with position, alignment, pen attributes}{Label} \key{drawing canvas}{picture} \key{affine transform}{transform} \key{constant (unchanging) value}{const} \key{allocate in higher scope}{static} \key{no value}{void} \key{inhibit implicit argument casting}{explicit} \key{structure}{struct} \key{create name by data type}{typedef \type\ \name} \section{3D data types (import three;)} \key{ordered triple}{triple} \key{3D path}{path3} \key{3D guide}{guide3} \key{3D affine transform}{transform3} \section{Constants} \key{exponential form}{6.02e23} \key{\TeX\ string constant}{"abc\dots de"} \key{\TeX\ strings: special characters}{\\\\, \\"} \key{C strings: constant}{'abc\dots de'} \key{C strings: special characters}{\\\\, \\" \\' \\?} \key{C strings: newline, cr, tab, backspace}{\\n \\r \\t \\b} \key{C strings: octal, hexadecimal bytes}{\\0-\\377 \\x0-\\xFF} \section{Operators} \key{arithmetic operations}{+ - * /} \key{modulus (remainder)}{\%} \key{comparisons}{== != > >= < <=} \key{not}{!} \key{and or (conditional evaluation of RHS)}{\&\& ||} \key{and or xor}{\& | ^} \key{cast expression to type}{(\type) \expr} \key{increment decrement prefix operators}{++ --} \key{assignment operators}{+= -= *= /= \%=} \key{conditional expression}{\expr$_1$\ {?}\ \expr$_2$\ {:}\ \expr$_3$} \key{structure member operator}{\name.\member} \key{expression evaluation separator}{,} \section{Flow control} \key{statement terminator}{;} \key{block delimeters}{\{\quad\}} \key{comment delimeters}{/*\quad*/} \key{comment to end of line delimiter}{//} \key{exit from \kbd{while}/\kbd{do}/\kbd{for}}{break;} \key{next iteration of \kbd{while}/\kbd{do}/\kbd{for}}{continue;} \key{return value from function}{return \expr;} \key{terminate execution}{exit();} \key{abort execution with error message}{abort(string);} \metax{{\bf Flow constructions} ({\tt if/while/for/do})\hidewidth}{} \beginexample if(\expr)\ \statement else if(\expr)\ \statement else \statement \endexample \beginexample while(\expr) \quad\statement \endexample \beginexample for(\expr$_1$; \expr$_2$; \expr$_3$) \quad\statement \endexample \beginexample for(\type var : \array) \quad\statement \endexample \beginexample do \statement \quad while(\expr); \endexample \section{Arrays} \key{array}{\type[]\ \name;} \key{array element i}{\name[i]} \key{array indexed by elements of int array {\tt A}}{\name[A]} \key{anonymous array}{new \type[\dim]} \key{array containing {\tt n} deep copies of {\tt x}}{array(n,x)} \key{length}{\name.length} \key{cyclic flag}{\name.cyclic} \key{pop element {\tt x}}{\name.pop()} \key{push element {\tt x}}{\name.push(x)} \key{append array {\tt a}}{\name.append(a)} \key{insert rest arguments at index {\tt i}}{\name.insert(i,\dots)} \key{delete element at index {\tt i}}{\name.delete(i)} \key{delete elements with indices in [{\tt i},{\tt j}]}{\name.delete(i,j)} \key{delete all elements}{\name.delete()} \key{test whether element n is initialized}{\name.initialized(n)} \key{array of indices of initialized elements}{\name.keys} \key{complement of int array in {\tt \{0,\dots,n-1\}}}{complement(a,n)} \key{deep copy of array {\tt a}}{copy(a)} \key{array {\tt \{0,1,\dots,n-1\}}}{sequence(n)} \key{array {\tt \{n,n+1,\dots,m\}}}{sequence(n,m)} \key{array {\tt \{n-1,n-2,\dots,0\}}}{reverse(n)} \key{array {\tt \{f(0),f(1),\dots,f(n-1)\}}}{sequence(f,n)} \key{array obtained by applying {\tt f} to array {\tt a}}{map(f,a)} \key{uniform partition of [{\tt a},{\tt b}] into n intervals}{uniform(a,b,n)} \key{concat specified 1D arrays}{concat(a,b,\dots)} \key{return sorted array}{sort(a)} \key{return array sorted using ordering {\tt less}}{sort(a,{\tt less})} \key{search sorted array {\tt a} for key}{search(a,key)} \key{index of first true value of bool array {\tt a}}{find(a)} \key{index of nth true value of bool array {\tt a}}{find(a,n)} \section{Initialization} \key{initialize variable}{\type\ \name=\value;} \key{initialize array}{\type[]\ \name=\{\dots\};} \section{path connectors} \key{straight segment}{--} \key{Bezi\'er segment with implicit control points}{..} \key{Bezi\'er segment with explicit control points}{..controls c0 and c1..} \key{concatenate}{\&} \key{lift pen}{^^} \key{..tension atleast 1..}{::} \key{..tension atleast infinity..}{---} \section{Labels} \key{implicit cast of string {\tt s} to Label}{s} \key{Label {\tt s} with relative position and alignment}{Label(s,real,pair)} \key{Label {\tt s} with absolute position and alignment}{Label(s,pair,pair)} \key{Label {\tt s} with specified pen}{Label(s,pen)} \section{draw commands} \key{draw path with current pen}{draw(path)} \key{draw path with pen}{draw(path,pen)} \key{draw labeled path}{draw(Label,path)} \key{draw arrow with pen}{draw(path,pen,Arrow)} \key{draw path on picture}{draw(picture,path)} \key{draw visible portion of line through two pairs}{drawline(pair,pair)} \section{fill commands} \key{fill path with current pen}{fill(path)} \key{fill path with pen}{fill(path,pen)} \key{fill path on picture}{fill(picture,path)} \section{label commands} \key{label a pair with optional alignment z}{label(Label,pair,{\tt z})} \key{label a path with optional alignment z}{label(Label,path,{\tt z})} \key{add label to picture}{label(picture,Label)} \section{clip commands} \key{clip to path}{clip(path)} \key{clip to path with fill rule}{clip(path,pen)} \key{clip picture to path}{clip(picture,path)} \section{pens} \key{Grayscale pen from value in [0,1]}{gray(g)} \key{RGB pen from values in [0,1]}{rgb(r,g,b)} \key{CMYK pen from values in [0,1]}{cmyk(r,g,b)} \key{RGB pen from heximdecimal string]}{rgb(string)} \key{heximdecimal string from rgb pen]}{hex(pen)} \key{hsv pen from values in [0,1]}{hsv(h,s,v)} \key{invisible pen}{invisible} \key{default pen}{defaultpen} \key{current pen}{currentpen} \key{solid pen}{solid} \key{dotted pen}{dotted} \key{wide dotted current pen}{Dotted} \key{wide dotted pen}{Dotted(pen)} \key{dashed pen}{dashed} \key{long dashed pen}{longdashed} \key{dash dotted pen}{dashdotted} \key{long dash dotted pen}{longdashdotted} \key{PostScript butt line cap}{squarecap} \key{PostScript round line cap}{roundcap} \key{PostScript projecting square line cap}{extendcap} \key{miter join}{miterjoin} \key{round join}{roundjoin} \key{bevel join}{beveljoin} \key{pen with miter limit}{miterlimit(real)} \key{zero-winding fill rule}{zerowinding} \key{even-odd fill rule}{evenodd} \key{align to character bounding box (default)}{nobasealign} \key{align to \TeX\ baseline}{basealign} \key{pen with font size (pt)}{fontsize(real)} \key{LaTeX pen from encoding,family,series,shape}{font(strings)} \key{\TeX\ pen}{font(string)} \key{scaled \TeX\ pen}{font(string,real)} \key{PostScript font from strings}{Courier(series,shape)} \key{pen with opacity in [0,1]}{opacity(real)} \key{construct pen nib from polygonal path}{makepen(path)} \key{pen mixing operator}{+} \section{path operations} \key{number of segments in path {\tt p}}{length(p)} \key{number of nodes in path {\tt p}}{size(p)} \key{is path {\tt p} cyclic?}{cyclic(p)} \key{is segment {\tt i} of path {\tt p} straight?}{straight(p,i)} \key{is path {\tt p} straight?}{piecewisestraight(p)} \key{coordinates of path {\tt p} at time {\tt t}}{point(p,t)} \key{direction of path {\tt p} at time {\tt t}}{dir(p,t)} \key{direction of path {\tt p} at {\tt length(p)}}{dir(p)} \key{unit(dir(p)+dir(q))}{dir(p,q)} \key{acceleration of path {\tt p} at time {\tt t}}{accel(p,t)} \key{radius of curvature of path {\tt p} at time {\tt t}}{radius(p,t)} \key{precontrol point of path {\tt p} at time {\tt t}}{precontrol(p,t)} \key{postcontrol point of path {\tt p} at time {\tt t}}{postcontrol(p,t)} \key{arclength of path {\tt p}}{arclength(p)} \key{time at which {\tt arclength(p)=L}}{arctime(p,L)} \key{point on path {\tt p} at arclength {\tt L}}{arcpoint(p,L)} \key{first value {\tt t} at which {\tt dir(p,t)=z}}{dirtime(p,z)} \key{time {\tt t} at relative fraction {\tt l} of {\tt arclength(p)}}{reltime(p,l)} \key{point at relative fraction {\tt l} of {\tt arclength(p)}}{relpoint(p,l)} \key{point midway along arclength of {\tt p}}{midpoint(p)} \key{path running backwards along {\tt p}}{reverse(p)} \key{subpath of {\tt p} between times {\tt a} and {\tt b}}{subpath(p,a,b)} \key{times for one intersection of paths {\tt p} and {\tt q}}{intersect(p,q)} \key{times at which {\tt p} reaches minimal extents}{mintimes(p)} \key{times at which {\tt p} reaches maximal extents}{maxtimes(p)} \key{intersection times of paths {\tt p} and {\tt q}}{intersections(p,q)} \key{intersection times of path {\tt p} with `{\tt --a--b--}'}{intersections(p,a,b)} \key{intersection times of path {\tt p} crossing $x=${\tt x}}{times(p,x)} \key{intersection times of path {\tt p} crossing $y=${\tt z.y}}{times(p,z)} \key{intersection point of paths {\tt p} and {\tt q}}{intersectionpoint(p,q)} \key{intersection points of {\tt p} and {\tt q}}{intersectionpoints(p,q)} \key{intersection of extension of {\tt P--Q} and {\tt p--q}}{extension(P,Q,p,q)} \key{lower left point of bounding box of path {\tt p}}{min(p)} \key{upper right point of bounding box of path {\tt p}}{max(p)} \key{subpaths of {\tt p} split by {\tt n}th cut of {\tt knife}}{cut(p,knife,n)} \key{winding number of path {\tt p} about pair {\tt z}}{windingnumber(p,z)} \key{pair {\tt z} lies within path {\tt p}?}{interior(p,z)} \key{pair {\tt z} lies within or on path {\tt p}?}{inside(p,z)} \key{path surrounding region bounded by paths}{buildcycle(\dots)} \key{path filled by \tt{draw(g,p)}}{strokepath(g,p)} \key{unit square with lower-left vertex at origin}{unitsquare} \key{unit circle centered at origin}{unitcircle} \key{circle of radius {\tt r} about {\tt c}}{circle(c,r)} \key{arc of radius {\tt r} about {\tt c} from angle {\tt a} to {\tt b}}{arc(c,r,a,b)} \key{unit {\tt n}-sided polygon}{polygon(n)} \key{unit {\tt n}-point cyclic cross}{cross(n)} \section{pictures} \key{add picture {\tt pic} to currentpicture}{add(pic)} \key{add picture {\tt pic} about pair {\tt z}}{add(pic,z)} \section{affine transforms} \key{identity transform}{identity()} \key{shift by values}{shift(real,real)} \key{shift by pair}{shift(pair)} \key{scale by {\tt x} in the $x$ direction}{xscale(x)} \key{scale by {\tt y} in the $y$ direction}{yscale(y)} \key{scale by {\tt x} in both directions}{scale(x)} \key{scale by real values {\tt x} and {\tt y}}{scale(x,y)} \key{map $(x,y) \rightarrow (x+${\tt s}$y,y)$}{slant(s)} \key{rotate by real {\tt angle} in degrees about pair {\tt z}}{rotate(angle,z=(0,0))} \key{reflect about line from {\tt P--Q}}{reflect(P,Q)} \section{string operations} \key{concatenate operator}{+} \key{string length}{length(string)} \key{position $\ge$ {\tt pos} of first occurence of {\tt t} in {\tt s}}{find({\tt s},{\tt t},pos=0)} \key{position $\le$ {\tt pos} of last occurence of {\tt t} in {\tt s}}{rfind({\tt s},{\tt t},pos=-1)} \key{string with {\tt t} inserted in {\tt s} at {\tt pos}}{insert({\tt s},{\tt pos},{\tt t})} \key{string {\tt s} with {\tt n} characters at {\tt pos} erased}{erase({\tt s},{\tt pos},{\tt n})} \key{substring of string {\tt s} of length {\tt n} at {\tt pos}}{substr({\tt s},{\tt pos},{\tt n})} \key{string {\tt s} reversed}{reverse({\tt s})} \key{string {\tt s} with {\tt before} changed to {\tt after}}{replace({\tt s},{\tt before},{\tt after})} \key{string {\tt s} translated via {\tt \{\{before,after\},\dots\}}}{replace({\tt s},string [][] table)} \key{format {\tt x} using C-style format string {\tt s} }{format({\tt s},x)} \key{casts hexadecimal string to an integer}{hex(s)} \key{casts {\tt x} to string using precision {\tt digits}}{string(x,digits=realDigits)} \key{current time formatted by {\tt format}}{time(format="\%a \%b \%d \%T \%Z \%Y")} \key{time in seconds of string {\tt t} using {\tt format}}{seconds(t,format)} \key{string corresponding to {\tt seconds} using {\tt format}}{time(seconds,format)} \key{split {\tt s} into strings separated by {\tt delimiter}}{split(s,delimiter="")} %%%%%%%%%%%%%%%%%%%%%%%%%% END LIBRARIES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % This goes at the bottom of the last page (column 6) \copyrightnotice % \bye % Local variables: % compile-command: "tex AsyRefCard" % End: asymptote-3.05/doc/unitcircle3.asy0000644000000000000000000000027215031566105015676 0ustar rootrootimport three; size(100); path3 g=(1,0,0)..(0,1,0)..(-1,0,0)..(0,-1,0)..cycle; draw(g); draw(O--Z,red+dashed,Arrow3); draw(((-1,-1,0)--(1,-1,0)--(1,1,0)--(-1,1,0)--cycle)); dot(g,red); asymptote-3.05/doc/Hobbydir.asy0000644000000000000000000000076415031566105015222 0ustar rootrootsize(200); pair z0=(0,0); pair z1=(1,2); pair z2=(2,1); path g=z0..z1..z2; label("$\ell_k$",z0--z1); draw("$\ell_{k+1}$",z1--z2,dashed); draw(z0--interp(z0,z1,1.5),dashed); pair d1=dir(g,1); draw(z1-d1..z1+d1,blue+dashed); draw(g,blue); draw(Label("$\theta_k$",0.4),arc(z1,0.4,degrees(z2-z1),degrees(d1)),blue,Arrow, EndPenMargin); draw("$\phi_k$",arc(z1,0.4,degrees(d1),degrees(z1-z0),CCW),Arrow, EndPenMargin); dot("$z_{k-1}$",z0,red); dot("$z_k$",z1,NW,red); dot("$z_{k+1}$",z2,red); asymptote-3.05/doc/grid3xyz.asy0000644000000000000000000000065215031566105015237 0ustar rootrootimport grid3; size(8cm,0,IgnoreAspect); currentprojection=orthographic(0.5,1,0.5); scale(Linear, Linear, Log); limits((-2,-2,1),(0,2,100)); grid3(XYZgrid); xaxis3(Label("$x$",position=EndPoint,align=S),Bounds(Min,Min), OutTicks()); yaxis3(Label("$y$",position=EndPoint,align=S),Bounds(Min,Min),OutTicks()); zaxis3(Label("$z$",position=EndPoint,align=(-1,0.5)),Bounds(Min,Min), OutTicks(beginlabel=false)); asymptote-3.05/doc/monthaxis.asy0000644000000000000000000000056615031566105015472 0ustar rootrootimport graph; size(400,150,IgnoreAspect); real[] x=sequence(12); real[] y=sin(2pi*x/12); scale(false); string[] month={"Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec"}; draw(graph(x,y),red,MarkFill[0]); xaxis(BottomTop,LeftTicks(new string(real x) { return month[round(x % 12)];})); yaxis("$y$",LeftRight,RightTicks(4)); asymptote-3.05/doc/asycolors.sty0000644000000000000000000000536015031566105015516 0ustar rootroot\usepackage{color} \definecolor{cyan}{cmyk}{1,0,0,0} \definecolor{magenta}{cmyk}{0,1,0,0} \definecolor{yellow}{cmyk}{0,0,1,0} \definecolor{black}{cmyk}{0,0,0,1} \definecolor{white}{cmyk}{0,0,0,0} \definecolor{gray}{cmyk}{0,0,0,0.5} \definecolor{red}{cmyk}{0,1,1,0} \definecolor{green}{cmyk}{1,0,1,0} \definecolor{blue}{cmyk}{1,1,0,0} \definecolor{palered}{cmyk}{0,0.25,0.25,0} \definecolor{palegreen}{cmyk}{0.25,0,0.25,0} \definecolor{paleblue}{cmyk}{0.25,0.25,0,0} \definecolor{palecyan}{cmyk}{0.25,0,0,0} \definecolor{palemagenta}{cmyk}{0,0.25,0,0} \definecolor{paleyellow}{cmyk}{0,0,0.25,0} \definecolor{palegray}{cmyk}{0,0,0,0.05} \definecolor{lightred}{cmyk}{0,0.5,0.5,0} \definecolor{lightgreen}{cmyk}{0.5,0,0.5,0} \definecolor{lightblue}{cmyk}{0.5,0.5,0,0} \definecolor{lightcyan}{cmyk}{0.5,0,0,0} \definecolor{lightmagenta}{cmyk}{0,0.5,0,0} \definecolor{lightyellow}{cmyk}{0,0,0.5,0} \definecolor{lightgray}{cmyk}{0,0,0,0.1} \definecolor{mediumred}{cmyk}{0,0.75,0.75,0} \definecolor{mediumgreen}{cmyk}{0.75,0,0.75,0} \definecolor{mediumblue}{cmyk}{0.75,0.75,0,0} \definecolor{mediumcyan}{cmyk}{0.75,0,0,0} \definecolor{mediummagenta}{cmyk}{0,0.75,0,0} \definecolor{mediumyellow}{cmyk}{0,0,0.75,0} \definecolor{mediumgray}{cmyk}{0,0,0,0.25} \definecolor{heavyred}{cmyk}{0,1,1,0.25} \definecolor{heavygreen}{cmyk}{1,0,1,0.25} \definecolor{heavyblue}{cmyk}{1,1,0,0.25} \definecolor{heavycyan}{cmyk}{1,0,0,0.25} \definecolor{heavymagenta}{cmyk}{0,1,0,0.25} \definecolor{lightolive}{cmyk}{0,0,1,0.25} \definecolor{heavygray}{cmyk}{0,0,0,0.75} \definecolor{deepred}{cmyk}{0,1,1,0.5} \definecolor{deepgreen}{cmyk}{1,0,1,0.5} \definecolor{deepblue}{cmyk}{1,1,0,0.5} \definecolor{deepcyan}{cmyk}{1,0,0,0.5} \definecolor{deepmagenta}{cmyk}{0,1,0,0.5} \definecolor{olive}{cmyk}{0,0,1,0.5} \definecolor{deepgray}{cmyk}{0,0,0,0.9} \definecolor{darkred}{cmyk}{0,1,1,0.75} \definecolor{darkgreen}{cmyk}{1,0,1,0.75} \definecolor{darkblue}{cmyk}{1,1,0,0.75} \definecolor{darkcyan}{cmyk}{1,0,0,0.75} \definecolor{darkmagenta}{cmyk}{0,1,0,0.75} \definecolor{darkolive}{cmyk}{0,0,1,0.75} \definecolor{darkgray}{cmyk}{0,0,0,0.95} \definecolor{orange}{cmyk}{0,0.5,1,0} \definecolor{fuchsia}{cmyk}{0,1,0.5,0} \definecolor{chartreuse}{cmyk}{0.5,0,1,0} \definecolor{springgreen}{cmyk}{1,0,0.5,0} \definecolor{purple}{cmyk}{0.5,1,0,0} \definecolor{royalblue}{cmyk}{1,0.5,0,0} \definecolor{salmon}{cmyk}{0,0.5,0.5,0} \definecolor{brown}{cmyk}{0,1,1,0.5} \definecolor{darkbrown}{cmyk}{0,1,1,0.75} \definecolor{pink}{cmyk}{0,0.25,0,0} \definecolor{palegrey}{cmyk}{0,0,0,0.05} \definecolor{lightgrey}{cmyk}{0,0,0,0.1} \definecolor{mediumgrey}{cmyk}{0,0,0,0.25} \definecolor{grey}{cmyk}{0,0,0,0.5} \definecolor{heavygrey}{cmyk}{0,0,0,0.5} \definecolor{deepgrey}{cmyk}{0,0,0,0.9} \definecolor{darkgrey}{cmyk}{0,0,0,0.95} asymptote-3.05/doc/Bode.asy0000644000000000000000000000124515031566105014324 0ustar rootrootimport graph; texpreamble("\def\Arg{\mathop {\rm Arg}\nolimits}"); size(10cm,5cm,IgnoreAspect); real ampl(real x) {return 2.5/sqrt(1+x^2);} real phas(real x) {return -atan(x)/pi;} scale(Log,Log); draw(graph(ampl,0.01,10)); ylimits(0.001,100); xaxis("$\omega\tau_0$",BottomTop,LeftTicks); yaxis("$|G(\omega\tau_0)|$",Left,RightTicks); picture q=secondaryY(new void(picture pic) { scale(pic,Log,Linear); draw(pic,graph(pic,phas,0.01,10),red); ylimits(pic,-1.0,1.5); yaxis(pic,"$\Arg G/\pi$",Right,red, LeftTicks("$% #.1f$", begin=false,end=false)); yequals(pic,1,Dotted); }); label(q,"(1,0)",Scale(q,(1,0)),red); add(q); asymptote-3.05/doc/beziercurve.asy0000644000000000000000000000035215031566105015776 0ustar rootrootsize(400); pair z0=(0,0); pair c0=(1,1); pair c1=(2,1); pair z1=(3,0); draw(z0..controls c0 and c1 .. z1,blue); draw(z0--c0--c1--z1,dashed); dot("$z_0$",z0,W,red); dot("$c_0$",c0,NW,red); dot("$c_1$",c1,NE,red); dot("$z_1$",z1,red); asymptote-3.05/doc/secondaryaxis.asy0000644000000000000000000000143015031566105016323 0ustar rootrootimport graph; size(9cm,6cm,IgnoreAspect); string data="secondaryaxis.csv"; file in=input(data).line().csv(); string[] titlelabel=in; string[] columnlabel=in; real[][] a=in; a=transpose(a); real[] t=a[0], susceptible=a[1], infectious=a[2], dead=a[3], larvae=a[4]; real[] susceptibleM=a[5], exposed=a[6], infectiousM=a[7]; scale(true); draw(graph(t,susceptible,t >= 10 & t <= 15)); draw(graph(t,dead,t >= 10 & t <= 15),dashed); xaxis("Time ($\tau$)",BottomTop,LeftTicks); yaxis(Left,RightTicks); picture secondary=secondaryY(new void(picture pic) { scale(pic,Linear(true),Log(true)); draw(pic,graph(pic,t,infectious,t >= 10 & t <= 15),red); yaxis(pic,Right,red,LeftTicks(begin=false,end=false)); }); add(secondary); label(shift(5mm*N)*"Proportion of crows",point(NW),E); asymptote-3.05/examples/0000755000000000000000000000000015031566105014004 5ustar rootrootasymptote-3.05/examples/strokeshade.asy0000644000000000000000000000025715031566105017042 0ustar rootrootsize(100); guide g=(0,0)..controls(70,30) and (-40,30)..(30,0); latticeshade(g,stroke=true,linewidth(10), new pen[][] {{red,orange,yellow},{green,blue,purple}}); asymptote-3.05/examples/sacylinder3D.asy0000644000000000000000000000052515031566105017050 0ustar rootrootimport solids; size(0,100); real r=1; real h=3; revolution R=cylinder(-h/2*Z,r,h); draw(surface(R),lightgreen+opacity(0.5),render(compression=Low)); draw((0,0,-h/2)--(0,0,h/2),dashed); dot((0,0,-h/2)); dot((0,0,h/2)); draw("$L$",(0,r,-h/2)--(0,r,h/2),W,black); draw("$r$",(0,0,-h/2)--(0,r,-h/2),red); draw(arc(O,1,90,90,90,0),red,Arrow3); asymptote-3.05/examples/markregular.asy0000644000000000000000000000155715031566105017046 0ustar rootrootimport graph; size(10cm,0); real xmin=-4,xmax=4; real ymin=-2,ymax=10; real f(real x) {return x^2;} marker mark=marker(scale(4)*plus, markuniform(new pair(real t) {return Scale((t,f(t)));}, xmin,xmax,round(2*(xmax-xmin))),1bp+red); draw(graph(f,xmin,xmax,n=400),linewidth(1bp),mark); ylimits(-2.5,10,Crop); xaxis(Label("$x$",position=EndPoint, align=NE),xmin=xmin,xmax=xmax, Ticks(scale(.7)*Label(align=E),NoZero,begin=false,beginlabel=false, end=false,endlabel=false,Step=1,step=.25, Size=1mm, size=.5mm,pTick=black,ptick=gray),Arrow); yaxis(Label("$y$",position=EndPoint, align=NE),ymin=ymin,ymax=ymax, Ticks(scale(.7)*Label(),NoZero,begin=false,beginlabel=false, end=false,endlabel=false,Step=1,step=.25,Size=1mm,size=.5mm, pTick=black,ptick=gray),Arrow); asymptote-3.05/examples/sin1x.asy0000644000000000000000000000050715031566105015566 0ustar rootrootimport graph; size(200,0); real f(real x) {return (x != 0) ? sin(1/x) : 0;} real T(real x) {return 2/(x*pi);} real a=-4/pi, b=4/pi; int n=150,m=5; xaxis("$x$",red); yaxis(red); draw(graph(f,a,-T(m),n)--graph(f,-m,-(m+n),n,T)--(0,f(0))--graph(f,m+n,m,n,T)-- graph(f,T(m),b,n)); label("$\sin\frac{1}{x}$",(b,f(b)),SW); asymptote-3.05/examples/teapotIBL.asy0000644000000000000000000000004215031566105016341 0ustar rootrootsettings.ibl=true; import teapot; asymptote-3.05/examples/spring2.asy0000644000000000000000000000005315031566105016104 0ustar rootrootimport spring; drawspring(40.0,"$L+x$"); asymptote-3.05/examples/cos2theta.asy0000644000000000000000000000035315031566105016417 0ustar rootrootimport graph; size(0,100); real f(real t) {return cos(2*t);} path g=polargraph(f,0,2pi,operator ..)--cycle; fill(g,green+white); xaxis("$x$",above=true); yaxis("$y$",above=true); draw(g); dot(Label,(1,0),NE); dot(Label,(0,1),NE); asymptote-3.05/examples/washermethod.asy0000644000000000000000000000176215031566105017222 0ustar rootrootimport graph3; import solids; size(0,150); currentprojection=perspective(0,0,11,up=Y); pen color1=green+opacity(0.25); pen color2=red; real alpha=240; real f(real x) {return 2x^2-x^3;} pair F(real x) {return (x,f(x));} triple F3(real x) {return (x,f(x),0);} ngraph=12; real x1=0.7476; real x2=1.7787; real x3=1.8043; path[] p={graph(F,x1,x2,Spline), graph(F,0.7,x1,Spline)--graph(F,x2,x3,Spline)&cycle, graph(F,0,0.7,Spline)--graph(F,x3,2,Spline)}; pen[] pn=new pen[] {color1,color2,color1}; render render=render(compression=0); for(int i=0; i < p.length; ++i) { revolution a=revolution(path3(p[i]),Y,0,alpha); draw(surface(a),pn[i],render); surface s=surface(p[i]--cycle); draw(s,pn[i],render); draw(rotate(alpha,Y)*s,pn[i],render); } draw((4/3,0,0)--F3(4/3),dashed); xtick("$\frac{4}{3}$",(4/3,0,0)); xaxis3(Label("$x$",1),Arrow3); yaxis3(Label("$y$",1),ymax=1.25,dashed,Arrow3); arrow("$y=2x^2-x^3$",F3(1.6),X+Y,0.75cm,red); draw(arc(1.1Y,0.3,90,0,7.5,180),Arrow3); asymptote-3.05/examples/sphere.asy0000644000000000000000000000021515031566105016006 0ustar rootrootimport three; size(200); //currentprojection=orthographic(5,4,3); draw(unitsphere,green+opacity(0.5),render(compression=Zero,merge=true)); asymptote-3.05/examples/electromagnetic.asy0000644000000000000000000000242215031566105017667 0ustar rootrootimport graph; import palette; texpreamble("\usepackage[amssymb,thinqspace,thinspace]{SIunits}"); size(800,200); real c=3e8; real nm=1e-9; real freq(real lambda) {return c/(lambda*nm);} real lambda(real f) {return c/(f*nm);} real fmin=10; real fmax=1e23; scale(Log(true),Linear(true)); xlimits(fmin,fmax); ylimits(0,1); real uv=freq(400); real ir=freq(700); bounds visible=bounds(Scale(uv).x,Scale(ir).x); palette(visible,uv,ir+(0,2),Bottom,Rainbow(),invisible); xaxis(Label("\hertz",1),Bottom,RightTicks,above=true); real log10Left(real x) {return -log10(x);} real pow10Left(real x) {return pow10(-x);} scaleT LogLeft=scaleT(log10Left,pow10Left,logarithmic=true); picture q=secondaryX(new void(picture p) { scale(p,LogLeft,Linear); xlimits(p,lambda(fmax),lambda(fmin)); ylimits(p,0,1); xaxis(p,Label("\nano\metre",1,0.01N),Top,LeftTicks(DefaultLogFormat,n=10)); }); add(q,above=true); margin margin=PenMargin(0,0); draw("radio",Scale((10,1))--Scale((5e12,1)),S,Arrow); draw("infrared",Scale((1e12,1.75))--Scale(shift(0,1.75)*ir),LeftSide,Arrows,margin); draw("UV",Scale(shift(0,1.75)*uv)--Scale((1e17,1.76)),LeftSide,Arrows,margin); draw("x-rays",Scale((1e16,1))--Scale((1e21,1)),RightSide,Arrows); draw("$\gamma$-rays",Scale((fmax,1.75))--Scale((2e18,1.75)),Arrow); asymptote-3.05/examples/genustwo.asy0000644000000000000000000000221415031566105016374 0ustar rootrootsize(10cm,0); import smoothcontour3; currentprojection=perspective((18,20,10)); if(settings.render < 0) settings.render=8; real tuberadius = 0.69; // Convert to cylindrical coordinates to draw // a circle revolved about the z axis. real toruscontour(real x, real y, real z) { real r = sqrt(x^2 + y^2); return (r-2)^2 + z^2 - tuberadius^2; } // Take the union of the two tangent tori (by taking // the product of the functions defining them). Then // add (or subtract) a bit of noise to smooth things // out. real f(real x, real y, real z) { real f1 = toruscontour(x - 2 - tuberadius, y, z); real f2 = toruscontour(x + 2 + tuberadius, y, z); return f1 * f2 - 0.1; } // The noisy function extends a bit farther than the union of // the two tori, so include a bit of extra space in the box. triple max = (2*(2+tuberadius), 2+tuberadius, tuberadius) + (0.1, 0.1, 0.1); triple min = -max; // Draw the implicit surface. draw(implicitsurface(f, min, max, overlapedges=true, nx=20, nz=5), surfacepen=material(diffusepen=gray(0.6), emissivepen=gray(0.3), specularpen=gray(0.1))); asymptote-3.05/examples/sin3.asy0000644000000000000000000000110315031566105015371 0ustar rootrootimport graph3; import palette; size(12cm,IgnoreAspect); currentprojection=orthographic(1,-2,1); real f(pair z) {return abs(sin(z));} real Arg(triple v) {return degrees(cos((v.x,v.y)),warn=false);} surface s=surface(f,(-pi,-2),(pi,2),20,Spline); s.colors(palette(s.map(Arg),Wheel())); draw(s,render(compression=Low,merge=true)); real xmin=point((-1,-1,-1)).x; real xmax=point((1,1,1)).x; draw((xmin,0,0)--(xmax,0,0),dashed); xaxis3("$\mathop{\rm Re} z$",Bounds,InTicks); yaxis3("$\mathop{\rm Im} z$",Bounds,InTicks(beginlabel=false)); zaxis3("$|\sin(z)|$",Bounds,InTicks); asymptote-3.05/examples/label3.asy0000644000000000000000000000026615031566105015670 0ustar rootrootimport three; currentprojection=perspective(0,0,1,up=Y); label(scale(4)*"$\displaystyle\int_{-\infty}^{+\infty} e^{-\alpha x^2}\,dx= \sqrt{\frac{\pi}{\alpha}}$",O,blue,Embedded); asymptote-3.05/examples/soccerball.asy0000644000000000000000000000510415031566105016633 0ustar rootrootimport graph3; size(400); currentlight.background=palegreen; settings.digits=15; real c=(1+sqrt(5))/2; triple[] z={(c,1,0),(-c,1,0),(-c,-1,0),(c,-1,0)}; triple[] x={(0,c,1),(0,-c,1),(0,-c,-1),(0,c,-1)}; triple[] y={(1,0,c),(1,0,-c),(-1,0,-c),(-1,0,c)}; triple[][] Q= { {z[0],y[1],x[3],x[0],y[0],z[3]}, {z[1],x[0],x[3],y[2],z[2],y[3]}, {z[2],z[1],y[2],x[2],x[1],y[3]}, {z[3],z[0],y[0],x[1],x[2],y[1]}, {x[0],x[3],z[1],y[3],y[0],z[0]}, {x[1],x[2],z[2],y[3],y[0],z[3]}, {x[2],x[1],z[3],y[1],y[2],z[2]}, {x[3],x[0],z[0],y[1],y[2],z[1]}, {y[0],y[3],x[1],z[3],z[0],x[0]}, {y[1],y[2],x[2],z[3],z[0],x[3]}, {y[2],y[1],x[3],z[1],z[2],x[2]}, {y[3],y[0],x[0],z[1],z[2],x[1]} }; int nArc=4; path3 p=Arc(O,Q[0][0],Q[0][1],nArc); real R=abs(point(p,reltime(p,1/3))); triple[][] P; for(int i=0;i < Q.length;++i){ P[i]=new triple[] ; for(int j=0;j < Q[i].length;++j){ P[i][j]=Q[i][j]/R; } } // FIXME: Use a baryicentric coordinate mesh surface sphericaltriangle(triple center, triple A, triple B, triple C, int nu=3, int nv=nu) { path3 tri1=Arc(center,A,B,nArc); path3 tri2=Arc(center,A,C,nArc); path3 tri3=Arc(center,B,C,nArc); triple tri(pair p) { path3 cr=Arc(O,relpoint(tri2,p.x),relpoint(tri3,p.x),nArc); return relpoint(cr,p.y); }; return surface(tri,(0,0),(1-sqrtEpsilon,1),nu,nv,Spline); } for(int i=0;i < P.length;++i){ triple[] pentagon=sequence(new triple(int k) { path3 p=Arc(O,P[i][0],P[i][k+1],nArc); return point(p,reltime(p,1/3)); },5); pentagon.cyclic=true; draw(sequence(new path3(int k) { return Arc(O,pentagon[k],pentagon[k+1],nArc);},5),linewidth(2pt)); triple M=unit(sum(pentagon)/5); for(int i=0;i < 5;++i){ surface sf=sphericaltriangle(O,pentagon[i],M,pentagon[i+1]); draw(sf,black); } } for(int i=0;i < P.length;++i) { for(int j=1;j <= 5;++j) { triple K=P[i][0]; triple A=P[i][j]; triple B=P[i][(j % 5)+1]; path3[] p={Arc(O,K,A,nArc),Arc(O,A,B,nArc),Arc(O,B,K,nArc)}; draw(subpath(p[0],reltime(p[0],1/3),reltime(p[0],2/3)),linewidth(4pt)); triple[] hexagon={point(p[0],reltime(p[0],1/3)), point(p[0],reltime(p[0],2/3)), point(p[1],reltime(p[1],1/3)), point(p[1],reltime(p[1],2/3)), point(p[2],reltime(p[2],1/3)), point(p[2],reltime(p[2],2/3))}; hexagon.cyclic=true; triple M=unit(sum(hexagon)/6); for(int i=0;i < 6;++i) { surface sf=sphericaltriangle(O,hexagon[i],M,hexagon[i+1]); draw(sf,white); } } } asymptote-3.05/examples/AiryDisk.asy0000644000000000000000000000057115031566105016244 0ustar rootrootimport graph3; import gsl; size(10cm,15cm,IgnoreAspect); currentprojection=orthographic(dir(70,60)); real f(pair z) {real r=abs(z); return r == 0 ? 1 : (2.0*J(1,r)/r)^2;} real R=15; surface s=surface(f,(-R,-R),(R,R),100,Spline); draw(s,green); xaxis3("$x$",Bounds,InTicks); yaxis3("$y$",Bounds,InTicks); zaxis3(rotate(90)*"$I(\sqrt{x^2+y^2})$",Bounds,InTicks("$%#.1f$")); asymptote-3.05/examples/uhrturm.obj0000644000000000000000000006053415031566105016216 0ustar rootrootThis file may be used freely for non commercial purposes. # Generated by CtrlView V3.00 # D:\saltel\3DS_FILES\uhrturm.obj g v 1.13195 1.87823 1.13195 v 1.13195 -1.87823 1.13195 v 1.13195 -1.87823 -1.13195 v 1.13195 1.87823 -1.13195 v -1.13195 1.87823 -1.13195 v -1.13195 1.87823 1.13195 v -1.13195 -1.87823 1.13195 v -1.13195 -1.87823 -1.13195 v -1.48021 1.33917 1.47956 v 1.47912 1.33917 1.48065 v 1.12573 1.33917 1.12694 v -1.1266 1.33917 1.12606 v -1.48021 0.589166 1.47956 v 1.47912 0.589166 1.48065 v -1.1266 0.589166 1.12606 v 1.12573 0.589166 1.12694 v 1.48108 1.33917 -1.47868 v 1.12727 1.33917 -1.12539 v 1.48108 0.589166 -1.47868 v 1.12727 0.589166 -1.12539 v -1.47824 0.589166 -1.48152 v -1.47824 1.33917 -1.48152 v -1.12505 0.589166 -1.1276 v -1.12505 1.33917 -1.1276 v -1.26581 1.48992 1.82059 v -1.26581 0.588913 1.82059 v -0.530699 0.588913 1.08569 v -0.530699 1.48992 1.08569 v -1.15829 1.48992 0.457918 v -1.15829 0.588913 0.457918 v -1.8934 0.588913 1.19281 v -1.8934 1.48992 1.19281 v 1.16926 1.87107 1.244 v 1.16932 1.87107 -1.24394 v 0.585613 4.34992 1.5e-005 v -0.593474 4.34992 -1.6e-005 v -1.16176 1.87107 -1.244 v -1.16183 1.87107 1.24394 v 0.20932 2.114 1.12512 v 0.20932 2.239 1.12512 v 0.209038 2.614 1.62512 v 0.208967 2.614 1.75012 v 0.208967 2.864 1.75012 v 0.209534 2.864 0.750118 v 0.289322 2.239 1.12516 v 0.289322 2.114 1.12516 v 0.289534 2.864 0.750164 v 0.289038 2.614 1.62516 v 0.288967 2.864 1.75016 v 0.288967 2.614 1.75016 v -0.29068 2.114 1.12484 v -0.29068 2.239 1.12484 v -0.290962 2.614 1.62484 v -0.291033 2.614 1.74984 v -0.291033 2.864 1.74984 v -0.290466 2.864 0.749836 v -0.210678 2.239 1.12488 v -0.210678 2.114 1.12488 v -0.210466 2.864 0.749881 v -0.210962 2.614 1.62488 v -0.211033 2.864 1.74988 v -0.211033 2.614 1.74988 v 0.398979 2.814 1.80184 v -0.00102 3.214 1.80168 v -0.00102 3.114 1.80168 v 0.34898 2.764 1.80182 v -0.40102 2.814 1.80153 v -0.351021 2.764 1.80155 v -0.000319 3.114 0.563502 v -0.000319 3.214 0.563502 v 0.399681 2.814 0.563655 v 0.349682 2.764 0.563636 v -0.350319 2.764 0.563368 v -0.400318 2.814 0.563349 v -1.36571 1.76335 1.30816 v -1.99019 1.4739 1.20524 v -1.26193 1.4739 1.93265 v -0.194054 1.4739 0.862978 v -0.922319 1.4739 0.135567 v -0.825571 1.76335 0.767107 v -1.52113 1.31426 1.52054 v 1.52009 1.31426 1.52158 v 1.10309 1.63426 1.10421 v -1.10388 1.63426 1.10341 v 1.52204 1.31426 -1.51964 v 1.10453 1.63426 -1.10276 v -1.51919 1.31426 -1.52249 v -1.10243 1.63426 -1.10486 v 1.1845 2.68385 0.281632 v 1.18441 2.88385 0.481632 v 1.18441 2.83385 0.481632 v 1.18449 2.65885 0.306632 v 1.18433 2.68385 0.681632 v 1.18434 2.65885 0.656632 v 0.565324 2.83385 0.481265 v 0.565324 2.88385 0.481265 v 0.565406 2.68385 0.281265 v 0.565396 2.65885 0.306265 v 0.565253 2.65885 0.656265 v 0.565242 2.68385 0.681265 v -1.80243 1.37433 1.2849 v -1.79277 0.840846 1.29455 v -1.38452 0.855616 1.70279 v -1.39417 1.38909 1.69314 v -1.17726 1.37433 1.73387 v -1.17335 0.840846 1.72996 v -1.00819 0.855616 1.56482 v -1.0121 1.38909 1.56872 v -1.63705 1.37433 0.935206 v -1.64095 0.840846 0.93911 v -1.80612 0.855616 1.10425 v -1.80222 1.38909 1.10035 v 1.88055 1.48992 1.20586 v 1.88055 0.588913 1.20586 v 1.14568 0.588913 0.470727 v 1.14568 1.48992 0.470727 v 0.517887 1.48992 1.0983 v 0.517887 0.588913 1.0983 v 1.25277 0.588913 1.83343 v 1.25277 1.48992 1.83343 v 1.36813 1.76335 1.30575 v 1.26519 1.4739 1.93023 v 1.99262 1.4739 1.20198 v 0.922974 1.4739 0.134077 v 0.195543 1.4739 0.862323 v 0.827085 1.76335 0.765592 v 1.34486 1.37433 1.74246 v 1.35451 0.840846 1.73281 v 1.76276 0.855616 1.32457 v 1.75311 1.38909 1.33422 v 1.79384 1.37433 1.1173 v 1.78993 0.840846 1.1134 v 1.62479 0.855616 0.948235 v 1.6287 1.38909 0.952139 v 0.995163 1.37433 1.57707 v 0.999067 0.840846 1.58098 v 1.1642 0.855616 1.74615 v 1.1603 1.38909 1.74225 v 1.26594 1.48992 -1.82051 v 1.26594 0.588913 -1.82051 v 0.530787 0.588913 -1.08565 v 0.530787 1.48992 -1.08565 v 1.15834 1.48992 -0.457845 v 1.15834 0.588913 -0.457845 v 1.89349 0.588913 -1.1927 v 1.89349 1.48992 -1.1927 v 1.36581 1.76335 -1.30808 v 1.99029 1.4739 -1.20512 v 1.26206 1.4739 -1.93257 v 0.194132 1.4739 -0.862956 v 0.922358 1.4739 -0.135507 v 0.825644 1.76335 -0.767052 v 1.80253 1.37433 -1.2848 v 1.79287 0.840846 -1.29445 v 1.38464 0.855616 -1.70271 v 1.39429 1.38909 -1.69306 v 1.17738 1.37433 -1.7338 v 1.17348 0.840846 -1.72989 v 1.00831 0.855616 -1.56475 v 1.01221 1.38909 -1.56865 v 1.63713 1.37433 -0.935107 v 1.64103 0.840846 -0.939011 v 1.80621 0.855616 -1.10414 v 1.80231 1.38909 -1.10024 v -1.10388 1.63426 1.10341 v 1.10309 1.63426 1.10421 v 1.52009 1.31426 1.52158 v -1.52113 1.31426 1.52054 v 1.10453 1.63426 -1.10276 v 1.52204 1.31426 -1.51964 v -1.10243 1.63426 -1.10486 v -1.51919 1.31426 -1.52249 v 1.13198 1.87823 -1.13191 v 1.13198 -1.87823 -1.13191 v -1.13191 -1.87823 -1.13198 v -1.13191 1.87823 -1.13198 v -1.13189 1.87823 -1.132 v -1.13189 -1.87823 -1.132 v -1.132 -1.87823 1.13189 v -1.132 1.87823 1.13189 v -1.13203 1.87823 1.13186 v -1.13203 -1.87823 1.13186 v 1.13186 -1.87823 1.13204 v 1.13186 1.87823 1.13204 v 0 0.425 1.134 v -0.122418 0.41429 1.134 v -0.241117 0.382486 1.134 v -0.352491 0.330553 1.134 v -0.453154 0.260071 1.134 v -0.54005 0.173179 1.134 v -0.610537 0.072519 1.134 v -0.662475 -0.038852 1.134 v -0.694284 -0.157549 1.134 v -0.705 -0.279967 1.134 v -0.694296 -0.402386 1.134 v -0.662497 -0.521087 1.134 v -0.61057 -0.632462 1.134 v -0.540092 -0.733129 1.134 v -0.453204 -0.820029 1.134 v -0.352547 -0.890521 1.134 v -0.241179 -0.942463 1.134 v -0.122483 -0.974279 1.134 v -6.5e-005 -0.985 1.134 v 0.122354 -0.974301 1.134 v 0.241056 -0.942508 1.134 v 0.352434 -0.890586 1.134 v 0.453104 -0.820113 1.134 v 0.540008 -0.733229 1.134 v 0.610504 -0.632575 1.134 v 0.662452 -0.521209 1.134 v 0.694273 -0.402515 1.134 v 0.705 -0.280098 1.134 v 0.694307 -0.157678 1.134 v 0.662519 -0.038975 1.134 v 0.610602 0.072406 1.134 v 0.540134 0.173079 1.134 v 0.453254 0.259987 1.134 v 0.352604 0.330488 1.134 v 0.24124 0.382441 1.134 v 0.122547 0.414267 1.134 v -0.022031 0.3569 1.144 v -0.022031 0.1031 1.144 v 0.022031 0.1031 1.144 v 0.022031 0.3569 1.144 v -0.337525 0.260559 1.144 v -0.210627 0.040761 1.144 v -0.172467 0.062792 1.144 v -0.299365 0.28259 1.144 v -0.562582 0.01938 1.144 v -0.342787 -0.107524 1.144 v -0.320755 -0.069365 1.144 v -0.54055 0.057539 1.144 v -0.636901 -0.302014 1.144 v -0.383101 -0.302021 1.144 v -0.383099 -0.257959 1.144 v -0.636899 -0.257952 1.144 v -0.540568 -0.617511 1.144 v -0.320766 -0.490618 1.144 v -0.342796 -0.452458 1.144 v -0.562598 -0.579351 1.144 v -0.299395 -0.842574 1.144 v -0.172485 -0.622782 1.144 v -0.210644 -0.60075 1.144 v -0.337553 -0.820541 1.144 v 0.021998 -0.916901 1.144 v 0.022011 -0.663101 1.144 v -0.022051 -0.663099 1.144 v -0.022065 -0.916899 1.144 v 0.337496 -0.820577 1.144 v 0.21061 -0.600772 1.144 v 0.172449 -0.622801 1.144 v 0.299336 -0.842606 1.144 v 0.562566 -0.57941 1.144 v 0.342778 -0.452494 1.144 v 0.320744 -0.490652 1.144 v 0.540532 -0.617567 1.144 v 0.636902 -0.258019 1.144 v 0.383102 -0.257999 1.144 v 0.383098 -0.302062 1.144 v 0.636898 -0.302082 1.144 v 0.540586 0.057482 1.144 v 0.320777 -0.069399 1.144 v 0.342805 -0.10756 1.144 v 0.562614 0.019321 1.144 v 0.299425 0.282558 1.144 v 0.172503 0.062773 1.144 v 0.210661 0.040738 1.144 v 0.337582 0.260523 1.144 v 0.569006 -0.128884 1.135 v -0.021876 -0.253928 1.135 v -0.013192 -0.313016 1.135 v 0.57769 -0.187972 1.135 v -0.343714 -0.249302 1.13464 v 0.036147 -0.31015 1.13464 v 0.042763 -0.250677 1.13464 v -0.337099 -0.18983 1.13464 v 1.134 0.425 0 v 1.134 0.41429 0.122418 v 1.134 0.382486 0.241117 v 1.134 0.330553 0.352491 v 1.134 0.260071 0.453154 v 1.134 0.173179 0.54005 v 1.134 0.072519 0.610537 v 1.134 -0.038852 0.662475 v 1.134 -0.157549 0.694284 v 1.134 -0.279967 0.705 v 1.134 -0.402386 0.694296 v 1.134 -0.521087 0.662497 v 1.134 -0.632462 0.61057 v 1.134 -0.733129 0.540092 v 1.134 -0.820029 0.453204 v 1.134 -0.890521 0.352547 v 1.134 -0.942463 0.241179 v 1.134 -0.974279 0.122483 v 1.134 -0.985 6.5e-005 v 1.134 -0.974301 -0.122354 v 1.134 -0.942508 -0.241056 v 1.134 -0.890586 -0.352434 v 1.134 -0.820113 -0.453104 v 1.134 -0.733229 -0.540008 v 1.134 -0.632575 -0.610504 v 1.134 -0.521209 -0.662452 v 1.134 -0.402515 -0.694273 v 1.134 -0.280098 -0.705 v 1.134 -0.157678 -0.694307 v 1.134 -0.038975 -0.662519 v 1.134 0.072406 -0.610602 v 1.134 0.173079 -0.540134 v 1.134 0.259987 -0.453254 v 1.134 0.330488 -0.352604 v 1.134 0.382441 -0.24124 v 1.134 0.414267 -0.122547 v 1.144 0.3569 0.022031 v 1.144 0.1031 0.022031 v 1.144 0.1031 -0.022031 v 1.144 0.3569 -0.022031 v 1.144 0.260559 0.337525 v 1.144 0.040761 0.210627 v 1.144 0.062792 0.172467 v 1.144 0.28259 0.299365 v 1.144 0.01938 0.562582 v 1.144 -0.107524 0.342787 v 1.144 -0.069365 0.320755 v 1.144 0.057539 0.54055 v 1.144 -0.302014 0.636901 v 1.144 -0.302021 0.383101 v 1.144 -0.257959 0.383099 v 1.144 -0.257952 0.636899 v 1.144 -0.617511 0.540568 v 1.144 -0.490618 0.320766 v 1.144 -0.452458 0.342796 v 1.144 -0.579351 0.562598 v 1.144 -0.842574 0.299395 v 1.144 -0.622782 0.172485 v 1.144 -0.60075 0.210644 v 1.144 -0.820541 0.337553 v 1.144 -0.916901 -0.021998 v 1.144 -0.663101 -0.022011 v 1.144 -0.663099 0.022051 v 1.144 -0.916899 0.022065 v 1.144 -0.820577 -0.337496 v 1.144 -0.600772 -0.21061 v 1.144 -0.622801 -0.172449 v 1.144 -0.842606 -0.299336 v 1.144 -0.57941 -0.562566 v 1.144 -0.452494 -0.342778 v 1.144 -0.490652 -0.320744 v 1.144 -0.617567 -0.540532 v 1.144 -0.258019 -0.636902 v 1.144 -0.257999 -0.383102 v 1.144 -0.302062 -0.383098 v 1.144 -0.302082 -0.636898 v 1.144 0.057482 -0.540586 v 1.144 -0.069399 -0.320777 v 1.144 -0.10756 -0.342805 v 1.144 0.019321 -0.562614 v 1.144 0.282558 -0.299425 v 1.144 0.062773 -0.172503 v 1.144 0.040738 -0.210661 v 1.144 0.260523 -0.337582 v 1.135 -0.128884 -0.569006 v 1.135 -0.253928 0.021876 v 1.135 -0.313016 0.013192 v 1.135 -0.187972 -0.57769 v 1.13464 -0.249302 0.343714 v 1.13464 -0.31015 -0.036147 v 1.13464 -0.250677 -0.042763 v 1.13464 -0.18983 0.337099 v 0 0.425 -1.134 v 0.122418 0.41429 -1.134 v 0.241117 0.382486 -1.134 v 0.352491 0.330553 -1.134 v 0.453154 0.260071 -1.134 v 0.54005 0.173179 -1.134 v 0.610537 0.072519 -1.134 v 0.662475 -0.038852 -1.134 v 0.694284 -0.157549 -1.134 v 0.705 -0.279967 -1.134 v 0.694296 -0.402386 -1.134 v 0.662497 -0.521087 -1.134 v 0.61057 -0.632462 -1.134 v 0.540092 -0.733129 -1.134 v 0.453204 -0.820029 -1.134 v 0.352547 -0.890521 -1.134 v 0.241179 -0.942463 -1.134 v 0.122483 -0.974279 -1.134 v 6.5e-005 -0.985 -1.134 v -0.122354 -0.974301 -1.134 v -0.241056 -0.942508 -1.134 v -0.352434 -0.890586 -1.134 v -0.453104 -0.820113 -1.134 v -0.540008 -0.733229 -1.134 v -0.610504 -0.632575 -1.134 v -0.662452 -0.521209 -1.134 v -0.694273 -0.402515 -1.134 v -0.705 -0.280098 -1.134 v -0.694307 -0.157678 -1.134 v -0.662519 -0.038975 -1.134 v -0.610602 0.072406 -1.134 v -0.540134 0.173079 -1.134 v -0.453254 0.259987 -1.134 v -0.352604 0.330488 -1.134 v -0.24124 0.382441 -1.134 v -0.122547 0.414267 -1.134 v 0.022031 0.3569 -1.144 v 0.022031 0.1031 -1.144 v -0.022031 0.1031 -1.144 v -0.022031 0.3569 -1.144 v 0.337525 0.260559 -1.144 v 0.210627 0.040761 -1.144 v 0.172467 0.062792 -1.144 v 0.299365 0.28259 -1.144 v 0.562582 0.01938 -1.144 v 0.342787 -0.107524 -1.144 v 0.320755 -0.069365 -1.144 v 0.54055 0.057539 -1.144 v 0.636901 -0.302014 -1.144 v 0.383101 -0.302021 -1.144 v 0.383099 -0.257959 -1.144 v 0.636899 -0.257952 -1.144 v 0.540568 -0.617511 -1.144 v 0.320766 -0.490618 -1.144 v 0.342796 -0.452458 -1.144 v 0.562598 -0.579351 -1.144 v 0.299395 -0.842574 -1.144 v 0.172485 -0.622782 -1.144 v 0.210644 -0.60075 -1.144 v 0.337553 -0.820541 -1.144 v -0.021998 -0.916901 -1.144 v -0.022011 -0.663101 -1.144 v 0.022051 -0.663099 -1.144 v 0.022065 -0.916899 -1.144 v -0.337496 -0.820577 -1.144 v -0.21061 -0.600772 -1.144 v -0.172449 -0.622801 -1.144 v -0.299336 -0.842606 -1.144 v -0.562566 -0.57941 -1.144 v -0.342778 -0.452494 -1.144 v -0.320744 -0.490652 -1.144 v -0.540532 -0.617567 -1.144 v -0.636902 -0.258019 -1.144 v -0.383102 -0.257999 -1.144 v -0.383098 -0.302062 -1.144 v -0.636898 -0.302082 -1.144 v -0.540586 0.057482 -1.144 v -0.320777 -0.069399 -1.144 v -0.342805 -0.10756 -1.144 v -0.562614 0.019321 -1.144 v -0.299425 0.282558 -1.144 v -0.172503 0.062773 -1.144 v -0.210661 0.040738 -1.144 v -0.337582 0.260523 -1.144 v -0.569006 -0.128884 -1.135 v 0.021876 -0.253928 -1.135 v 0.013192 -0.313016 -1.135 v -0.57769 -0.187972 -1.135 v 0.343714 -0.249302 -1.13464 v -0.036147 -0.31015 -1.13464 v -0.042763 -0.250677 -1.13464 v 0.337099 -0.18983 -1.13464 v -1.134 0.425 0 v -1.134 0.41429 -0.122418 v -1.134 0.382486 -0.241117 v -1.134 0.330553 -0.352491 v -1.134 0.260071 -0.453154 v -1.134 0.173179 -0.54005 v -1.134 0.072519 -0.610537 v -1.134 -0.038852 -0.662475 v -1.134 -0.157549 -0.694284 v -1.134 -0.279967 -0.705 v -1.134 -0.402386 -0.694296 v -1.134 -0.521087 -0.662497 v -1.134 -0.632462 -0.61057 v -1.134 -0.733129 -0.540092 v -1.134 -0.820029 -0.453204 v -1.134 -0.890521 -0.352547 v -1.134 -0.942463 -0.241179 v -1.134 -0.974279 -0.122483 v -1.134 -0.985 -6.5e-005 v -1.134 -0.974301 0.122354 v -1.134 -0.942508 0.241056 v -1.134 -0.890586 0.352434 v -1.134 -0.820113 0.453104 v -1.134 -0.733229 0.540008 v -1.134 -0.632575 0.610504 v -1.134 -0.521209 0.662452 v -1.134 -0.402515 0.694273 v -1.134 -0.280098 0.705 v -1.134 -0.157678 0.694307 v -1.134 -0.038975 0.662519 v -1.134 0.072406 0.610602 v -1.134 0.173079 0.540134 v -1.134 0.259987 0.453254 v -1.134 0.330488 0.352604 v -1.134 0.382441 0.24124 v -1.134 0.414267 0.122547 v -1.144 0.3569 -0.022031 v -1.144 0.1031 -0.022031 v -1.144 0.1031 0.022031 v -1.144 0.3569 0.022031 v -1.144 0.260559 -0.337525 v -1.144 0.040761 -0.210627 v -1.144 0.062792 -0.172467 v -1.144 0.28259 -0.299365 v -1.144 0.01938 -0.562582 v -1.144 -0.107524 -0.342787 v -1.144 -0.069365 -0.320755 v -1.144 0.057539 -0.54055 v -1.144 -0.302014 -0.636901 v -1.144 -0.302021 -0.383101 v -1.144 -0.257959 -0.383099 v -1.144 -0.257952 -0.636899 v -1.144 -0.617511 -0.540568 v -1.144 -0.490618 -0.320766 v -1.144 -0.452458 -0.342796 v -1.144 -0.579351 -0.562598 v -1.144 -0.842574 -0.299395 v -1.144 -0.622782 -0.172485 v -1.144 -0.60075 -0.210644 v -1.144 -0.820541 -0.337553 v -1.144 -0.916901 0.021998 v -1.144 -0.663101 0.022011 v -1.144 -0.663099 -0.022051 v -1.144 -0.916899 -0.022065 v -1.144 -0.820577 0.337496 v -1.144 -0.600772 0.21061 v -1.144 -0.622801 0.172449 v -1.144 -0.842606 0.299336 v -1.144 -0.57941 0.562566 v -1.144 -0.452494 0.342778 v -1.144 -0.490652 0.320744 v -1.144 -0.617567 0.540532 v -1.144 -0.258019 0.636902 v -1.144 -0.257999 0.383102 v -1.144 -0.302062 0.383098 v -1.144 -0.302082 0.636898 v -1.144 0.057482 0.540586 v -1.144 -0.069399 0.320777 v -1.144 -0.10756 0.342805 v -1.144 0.019321 0.562614 v -1.144 0.282558 0.299425 v -1.144 0.062773 0.172503 v -1.144 0.040738 0.210661 v -1.144 0.260523 0.337582 v -1.135 -0.128884 0.569006 v -1.135 -0.253928 -0.021876 v -1.135 -0.313016 -0.013192 v -1.135 -0.187972 0.57769 v -1.13464 -0.249302 -0.343714 v -1.13464 -0.31015 0.036147 v -1.13464 -0.250677 0.042763 v -1.13464 -0.18983 -0.337099 vn 1 0 0.000569096 vn -1 0 -0.000569096 vn -1 0 -0.000570691 vn 1 0 0.000565259 vn 0.000509719 -0.44721 -0.894429 vn -0.000499176 0 1 vn -0.000481064 0.266932 0.963715 vn -0.000488087 0.514492 0.857495 vn 0.00042804 -0.514498 -0.857492 vn -0.000299513 -0.8 0.6 vn -0.000138291 0.961524 0.274721 vn 0.000137137 -0.961524 -0.27472 vn 0 -1 0 vn 0 1 0 vn -0.000387739 0 1 vn 0.000382513 0 -1 vn 0.707107 0.707106 0.000400743 vn -1 0 -0.000566154 vn -0.600001 -0.799999 -0.00033981 vn -0.707107 -0.707107 -0.000400468 vn -0.707107 -0.707107 -0.000400332 vn 0.707113 -0.7071 0.000400901 vn 0.6 0.8 0.000340172 vn 1 0 0.000566154 vn -0.707107 0.707106 -0.000400744 vn 0.707107 -0.707107 0.000400469 vn -0.436532 0.786406 0.437042 vn 0.429319 0.794316 -0.429823 vn -0.346918 0.871609 -0.346332 vn 0 -1 0 vn 0.346918 0.871608 0.346334 vn -0.000209213 0.793494 0.608578 vn 0.608566 0.793503 0.000390815 vn 0.000571085 0.793502 -0.608568 vn -0.608802 0.793322 -0.000389153 vn 1 0 0.00042435 vn 0.000419184 0.707107 -0.707107 vn -0.000355678 -0.8 0.599999 vn -0.00041917 -0.707107 0.707107 vn 0.000419193 -0.707106 -0.707108 vn 0.000355696 0.8 -0.599999 vn -0.000419162 0.707107 0.707107 vn -0.000419164 -0.707105 0.707108 vn 0.000419163 -0.707107 -0.707107 vn -0.707094 -6.49068e-006 0.70712 vn -0.707098 0 0.707115 vn 0.707069 2.89744e-006 0.707144 vn 0.707064 0 0.70715 vn -0.707045 -4.84174e-006 -0.707169 vn 0.707098 0 0.707115 vn 0.707157 -1.26403e-005 -0.707056 vn -0.70719 4.67573e-006 0.707024 vn -0.707199 -1.1863e-006 0.707015 g f 4 1 2 f 4 2 3 f 4 5 6 f 4 6 1 f 2 7 8 f 2 8 3 g f 9 10 11 f 9 11 12 f 9 13 14 f 9 14 10 f 16 14 13 f 16 13 15 f 15 12 11 f 15 11 16 f 10 17 18 f 10 18 11 f 10 14 19 f 10 19 17 f 20 19 14 f 20 14 16 f 17 19 21 f 17 21 22 f 23 21 19 f 23 19 20 f 20 18 24 f 20 24 23 f 22 9 12 f 22 12 24 f 22 21 13 f 22 13 9 f 15 13 21 f 15 21 23 f 23 24 12 f 23 12 15 f 28 25 26 f 28 26 27 f 32 29 30 f 32 30 31 f 29 28 27 f 29 27 30 f 32 25 28 f 32 28 29 f 25 32 31 f 25 31 26 f 27 26 31 f 27 31 30 g f 33 34 35 f 36 37 38 f 35 34 37 f 35 37 36 f 33 38 37 f 33 37 34 f 38 33 35 f 38 35 36 g f 44//2 39//3 40//2 f 43//2 44//2 40//2 f 43//2 40//2 41//3 f 43//2 41//3 42//3 f 44//1 39//1 40//1 f 44//1 40//1 41//4 f 43//1 44//1 41//4 f 43//1 41//4 42//1 f 45//1 46//1 47//1 f 46//5 39//5 44//5 f 46//5 44//5 47//5 f 40//7 39//6 46//6 f 40//7 46//6 45//7 f 44//8 40//7 45//7 f 44//8 45//7 47//8 f 48//4 45//4 47//4 f 45//9 40//9 44//9 f 45//9 44//9 47//9 f 40//10 45//10 48//10 f 40//10 48//10 41//10 f 44//11 41//11 48//11 f 44//11 48//11 47//11 f 48//4 47//4 49//4 f 48//4 49//4 50//1 f 48//12 41//12 44//12 f 48//12 44//12 47//12 f 50//13 42//13 41//13 f 50//13 41//13 48//13 f 43//6 42//6 50//6 f 43//6 50//6 49//6 f 44//14 43//14 49//14 f 44//14 49//14 47//14 f 56//2 51//3 52//2 f 55//2 56//2 52//2 f 55//2 52//2 53//3 f 55//2 53//3 54//3 f 56//1 51//1 52//1 f 56//1 52//1 53//4 f 55//1 56//1 53//4 f 55//1 53//4 54//1 f 57//1 58//1 59//1 f 58//5 51//5 56//5 f 58//5 56//5 59//5 f 52//7 51//6 58//6 f 52//7 58//6 57//7 f 56//8 52//7 57//7 f 56//8 57//7 59//8 f 60//4 57//4 59//4 f 57//9 52//9 56//9 f 57//9 56//9 59//9 f 52//10 57//10 60//10 f 52//10 60//10 53//10 f 56//11 53//11 60//11 f 56//11 60//11 59//11 f 60//4 59//4 61//4 f 60//4 61//4 62//1 f 60//12 53//12 56//12 f 60//12 56//12 59//12 f 53//13 60//13 62//13 f 53//13 62//13 54//13 f 55//6 54//6 62//6 f 55//6 62//6 61//6 f 56//14 55//14 61//14 f 56//14 61//14 59//14 g f 63//15 64//15 65//15 f 65//15 66//15 63//15 f 65//15 64//15 67//15 f 65//15 67//15 68//15 f 69//16 70//16 71//16 f 63//17 71//17 70//17 f 63//17 70//17 64//17 f 65//18 64//18 70//18 f 65//18 70//18 69//18 f 69//19 71//19 63//19 f 69//19 63//19 65//19 f 71//16 72//16 69//16 f 69//20 72//20 66//20 f 69//20 66//20 65//21 f 72//22 71//22 63//22 f 72//22 63//22 66//22 f 63//23 71//23 69//23 f 63//23 69//23 65//23 f 74//16 70//16 69//16 f 74//16 69//16 73//16 f 64//24 65//24 69//24 f 64//24 69//24 70//24 f 74//25 67//25 64//25 f 74//25 64//25 70//25 f 74//21 73//21 68//21 f 74//21 68//21 67//21 f 65//26 68//26 73//26 f 65//26 73//26 69//22 f 75//27 76//27 77//27 f 78//28 79//28 80//28 f 80//29 79//29 76//29 f 80//29 76//29 75//29 f 76//30 79//30 78//30 f 76//30 78//30 77//30 f 77//31 78//31 80//31 f 77//31 80//31 75//31 f 81//32 82//32 83//32 f 81//32 83//32 84//32 f 82//33 85//33 86//33 f 82//33 86//33 83//33 f 85//34 87//34 88//34 f 85//34 88//34 86//34 f 87//35 81//35 84//35 f 87//35 84//35 88//35 f 89//36 90//24 91//36 f 91//36 92//36 89//36 f 91//36 90//24 93//36 f 91//36 93//36 94//36 f 95//18 96//18 97//18 f 89//37 97//37 96//37 f 89//37 96//37 90//37 f 91//15 90//15 96//15 f 91//15 96//15 95//15 f 95//38 97//38 89//38 f 95//38 89//38 91//38 f 97//18 98//18 95//18 f 95//39 98//39 92//39 f 95//39 92//39 91//39 f 89//40 92//40 98//40 f 89//40 98//40 97//40 f 89//41 97//41 95//41 f 89//41 95//41 91//41 f 100//18 96//18 95//18 f 100//18 95//18 99//18 f 90//16 91//16 95//16 f 90//16 95//16 96//16 f 100//42 93//42 90//42 f 100//42 90//42 96//42 f 94//43 93//43 100//43 f 94//43 100//43 99//43 f 91//44 94//44 99//44 f 91//44 99//44 95//44 g f 104//45 101//45 102//45 f 104//45 102//45 103//46 f 105//47 106//48 107//47 f 105//47 107//47 108//47 f 109//49 110//49 111//49 f 109//49 111//49 112//49 g f 116 113 114 f 116 114 115 f 120 117 118 f 120 118 119 f 117 116 115 f 117 115 118 f 116 117 120 f 116 120 113 f 113 120 119 f 113 119 114 f 119 118 115 f 119 115 114 g f 121 122 123 f 124 125 126 f 126 125 122 f 126 122 121 f 122 125 124 f 122 124 123 f 123 124 126 f 123 126 121 g f 130//50 127//50 128//50 f 130//50 128//50 129//50 f 131//51 132//51 133//51 f 131//51 133//51 134//51 f 135//52 136//52 137//52 f 135//52 137//52 138//53 g f 142 139 140 f 142 140 141 f 146 143 144 f 146 144 145 f 143 142 141 f 143 141 144 f 146 139 142 f 146 142 143 f 139 146 145 f 139 145 140 f 141 140 145 f 141 145 144 g f 147 148 149 f 150 151 152 f 152 151 148 f 152 148 147 f 150 149 148 f 150 148 151 f 149 150 152 f 149 152 147 g f 156 153 154 f 156 154 155 f 157 158 159 f 157 159 160 f 161 162 163 f 161 163 164 g f 166 167 168 f 166 168 165 f 169 170 167 f 169 167 166 f 171 172 170 f 171 170 169 f 165 168 172 f 165 172 171 g f 176 173 174 f 176 174 175 f 180 177 178 f 180 178 179 f 184 181 182 f 184 182 183 g f 220 185 186 f 220 186 187 f 220 187 188 f 220 188 189 f 220 189 190 f 220 190 191 f 220 191 192 f 220 192 193 f 220 193 194 f 220 194 195 f 220 195 196 f 220 196 197 f 220 197 198 f 220 198 199 f 220 199 200 f 220 200 201 f 219 220 201 f 218 219 201 f 217 218 201 f 216 217 201 f 215 216 201 f 214 215 201 f 213 214 201 f 212 213 201 f 211 212 201 f 210 211 201 f 209 210 201 f 209 201 202 f 209 202 203 f 209 203 204 f 209 204 205 f 209 205 206 f 209 206 207 f 209 207 208 g f 224 221 222 f 224 222 223 f 226 227 228 f 226 228 225 f 229 230 231 f 229 231 232 f 236 233 234 f 236 234 235 f 238 239 240 f 238 240 237 f 241 242 243 f 241 243 244 f 247 248 245 f 247 245 246 f 251 252 249 f 251 249 250 f 256 253 254 f 256 254 255 f 260 257 258 f 260 258 259 f 263 264 261 f 263 261 262 f 265 266 267 f 265 267 268 g f 272 269 270 f 272 270 271 f 275 276 273 f 275 273 274 g f 312 277 278 f 312 278 279 f 312 279 280 f 312 280 281 f 312 281 282 f 312 282 283 f 312 283 284 f 312 284 285 f 312 285 286 f 312 286 287 f 312 287 288 f 312 288 289 f 312 289 290 f 312 290 291 f 312 291 292 f 312 292 293 f 311 312 293 f 310 311 293 f 309 310 293 f 308 309 293 f 307 308 293 f 306 307 293 f 305 306 293 f 304 305 293 f 303 304 293 f 302 303 293 f 301 302 293 f 301 293 294 f 301 294 295 f 301 295 296 f 301 296 297 f 301 297 298 f 301 298 299 f 301 299 300 g f 316 313 314 f 316 314 315 f 318 319 320 f 318 320 317 f 321 322 323 f 321 323 324 f 328 325 326 f 328 326 327 f 330 331 332 f 330 332 329 f 333 334 335 f 333 335 336 f 339 340 337 f 339 337 338 f 343 344 341 f 343 341 342 f 348 345 346 f 348 346 347 f 352 349 350 f 352 350 351 f 355 356 353 f 355 353 354 f 357 358 359 f 357 359 360 g f 364 361 362 f 364 362 363 f 367 368 365 f 367 365 366 g f 404 369 370 f 404 370 371 f 404 371 372 f 404 372 373 f 404 373 374 f 404 374 375 f 404 375 376 f 404 376 377 f 404 377 378 f 404 378 379 f 404 379 380 f 404 380 381 f 404 381 382 f 404 382 383 f 404 383 384 f 404 384 385 f 403 404 385 f 402 403 385 f 401 402 385 f 400 401 385 f 399 400 385 f 398 399 385 f 397 398 385 f 396 397 385 f 395 396 385 f 394 395 385 f 393 394 385 f 393 385 386 f 393 386 387 f 393 387 388 f 393 388 389 f 393 389 390 f 393 390 391 f 393 391 392 g f 408 405 406 f 408 406 407 f 410 411 412 f 410 412 409 f 413 414 415 f 413 415 416 f 420 417 418 f 420 418 419 f 422 423 424 f 422 424 421 f 425 426 427 f 425 427 428 f 431 432 429 f 431 429 430 f 435 436 433 f 435 433 434 f 440 437 438 f 440 438 439 f 444 441 442 f 444 442 443 f 447 448 445 f 447 445 446 f 449 450 451 f 449 451 452 g f 456 453 454 f 456 454 455 f 459 460 457 f 459 457 458 g f 496 461 462 f 496 462 463 f 496 463 464 f 496 464 465 f 496 465 466 f 496 466 467 f 496 467 468 f 496 468 469 f 496 469 470 f 496 470 471 f 496 471 472 f 496 472 473 f 496 473 474 f 496 474 475 f 496 475 476 f 496 476 477 f 495 496 477 f 494 495 477 f 493 494 477 f 492 493 477 f 491 492 477 f 490 491 477 f 489 490 477 f 488 489 477 f 487 488 477 f 486 487 477 f 485 486 477 f 485 477 478 f 485 478 479 f 485 479 480 f 485 480 481 f 485 481 482 f 485 482 483 f 485 483 484 g f 500 497 498 f 500 498 499 f 502 503 504 f 502 504 501 f 505 506 507 f 505 507 508 f 512 509 510 f 512 510 511 f 514 515 516 f 514 516 513 f 517 518 519 f 517 519 520 f 523 524 521 f 523 521 522 f 527 528 525 f 527 525 526 f 532 529 530 f 532 530 531 f 536 533 534 f 536 534 535 f 539 540 537 f 539 537 538 f 541 542 543 f 541 543 544 g f 548 545 546 f 548 546 547 f 551 552 549 f 551 549 550 asymptote-3.05/examples/smoothelevation.asy0000644000000000000000000000104515031566105017742 0ustar rootrootimport graph3; import grid3; import palette; currentlight=Viewport; if(settings.render <= 0) settings.prc=false; currentprojection=orthographic(dir(40,60)); size(400,300,IgnoreAspect); real f(pair z) {return cos(2*pi*z.x)*sin(2*pi*z.y);} surface s=surface(f,(-1/2,-1/2),(1/2,1/2),20,Spline); s.colors(palette(s.map(zpart),Rainbow())); draw(s,render(tessellate=false)); scale(true); xaxis3(Label("$x$",0.5),Bounds,InTicks); yaxis3(Label("$y$",0.5),Bounds,InTicks); zaxis3(Label("$z$",0.5),Bounds,InTicks(beginlabel=false)); grid3(XYZgrid); asymptote-3.05/examples/conicurv.asy0000644000000000000000000000336215031566105016356 0ustar rootroot// Original name : conicurv.mp // Author : L. Nobre G. // Translators : J. Pienaar (2004) and John Bowman (2005) import three; texpreamble("\usepackage{bm}"); size(300,0); currentprojection=perspective(10,-5,5.44); real theta=30, width=3, shortradius=2, bord=2, refsize=1, vecsize=2; real height=0.3, anglar=1.75, totup=3; real longradius=shortradius+width*Cos(theta), updiff=width*Sin(theta); triple iplow=(0,shortradius,0), iphig=(0,longradius,updiff); triple oplow=(-shortradius,0,0), ophig=(-longradius,0,updiff); triple aplow=-iplow, aphig=(0,-longradius,updiff); triple eplow=-oplow, ephig=(longradius,0,updiff); triple anglebase=(0,longradius,0), centre=interp(iplow,iphig,0.5)+(0,0,height); triple central=(0,0,centre.z), refo=(0,0.5*centre.y,centre.z); triple refx=refsize*(0,Cos(theta),Sin(theta)); triple refy=refsize*(0,-Sin(theta),Cos(theta)); draw("$\theta$",arc(iplow,iplow+0.58*(iphig-iplow),anglebase),E); draw(central,linewidth(2bp)); draw(iplow--iphig); draw(oplow--ophig); draw(aplow--aphig); draw(eplow--ephig); draw(iphig--anglebase--aplow,dashed); draw(oplow--eplow,dashed); draw(central--centre,dashed); draw((0,0,-bord)--(0,longradius+bord,-bord)--(0,longradius+bord,totup) --(0,0,totup)--cycle); draw(Label("$y$",1),refo--refo+refy,SW,Arrow3); draw(Label("$x$",1),refo--refo+refx,SE,Arrow3); draw(Label("$\vec{R}_N$",1),centre--centre+vecsize*refy,E,Arrow3); draw(Label("$\vec{F}_a$",1),centre--centre+vecsize*refx,N,Arrow3); draw(Label("$\vec{F}_c$",1),centre--centre+vecsize*Y,NE,Arrow3); draw(Label("$\vec{P}$",1),centre--centre-vecsize*Z,E,Arrow3); draw(Label("$\vec{v}$",1),centre--centre+vecsize*X,E,Arrow3); draw(centre,10pt+blue); draw(circle((0,0,updiff),longradius),linewidth(2bp)); draw(circle(O,shortradius),linewidth(2bp)); asymptote-3.05/examples/bars3.asy0000644000000000000000000000076015031566105015537 0ustar rootrootimport three; import palette; import graph3; size(300); currentprojection=perspective(-30,-30,30,up=Z); surface s; for(int i = 0; i < 10; ++i) { for(int j = 0; j < 10; ++j) { s.append(shift(i,j,0)*scale(1,1,i+j)*unitcube); } } s.colors(palette(s.map(zpart),Rainbow())); draw(s,meshpen=black+thick(),nolight,render(merge=true)); xaxis3("$x$",Bounds,InTicks(endlabel=false,Label,2,2)); yaxis3(YZ()*"$y$",Bounds,InTicks(beginlabel=false,Label,2,2)); zaxis3(XZ()*"$z$",Bounds,InTicks); asymptote-3.05/examples/tiling.asy0000644000000000000000000000015015031566105016004 0ustar rootrootsize(0,150); import patterns; add("checker",checker(blue)); filldraw(unitcircle,pattern("checker")); asymptote-3.05/examples/quilt.asy0000644000000000000000000000133615031566105015663 0ustar rootrootimport math; int n=8, skip=3; pair r(int k) { return unityroot(n,k); } pen col=blue, col2=purple; guide square=box((1,1),(-1,-1)); guide step(int mult) { guide g; for(int k=0; k 1) e=substr(e,0,1)+downcase(substr(e,1,n-1)); int index=find(Element == e); if(index < 0) return currentpen; return rgb(Hexcolor[index]); } // ATOM string[] name,altLoc,resName,chainID,iCode,element,charge; int[] serial,resSeq; real[][] occupancy,tempFactor; bool newchain=true; struct bond { int i,j; void operator init(int i, int j) { this.i=i; this.j=j; } } bond[] bonds; struct atom { string name; triple v; void operator init(string name, triple v) { this.name=name; this.v=v; } } struct chain { int[] serial; atom[] a; } int[] serials; chain[] chains; atom[] atoms; while(true) { string line=data; if(eof(data)) break; string record=replace(substr(line,0,6)," ",""); if(record == "TER") {newchain=true; continue;} bool ATOM=record == "ATOM"; bool HETATOM=record == "HETATM"; int serial; atom a; if(ATOM || HETATOM) { serial=(int) substr(line,6,5); a.name=substr(line,76,2); a.v=((real) substr(line,30,8), (real) substr(line,38,8), (real) substr(line,46,8)); } if(ATOM) { if(newchain) { chains.push(new chain); newchain=false; } chain c=chains[chains.length-1]; c.serial.push(serial); c.a.push(a); continue; } if(HETATOM) { serials.push(serial); atoms.push(a); } if(record == "CONECT") { int k=0; int i=(int) substr(line,6,5); while(true) { string s=replace(substr(line,11+k,5)," ",""); if(s == "") break; k += 5; int j=(int) s; if(j <= i) continue; bonds.push(bond(i,j)); } } } write("Number of atomic chains: ",chains.length); int natoms; begingroup3("chained"); for(chain c : chains) { for(int i=0; i < c.a.length-1; ++i) draw(c.a[i].v--c.a[i+1].v,chainpen,currentlight); for(atom a : c.a) if(pixel) pixel(a.v,color(a.name),width); else dot(a.v,color(a.name),currentlight); natoms += c.a.length; } endgroup3(); write("Number of chained atoms: ",natoms); write("Number of hetero atoms: ",atoms.length); begingroup3("hetero"); for(atom h : atoms) if(pixel) pixel(h.v,color(h.name),width); else dot(h.v,color(h.name),currentlight); endgroup3(); write("Number of hetero bonds: ",bonds.length); begingroup3("bonds"); for(bond b : bonds) { triple v(int i) {return atoms[find(serials == i)].v;} draw(v(b.i)--v(b.j),hetpen,currentlight); } endgroup3(); string options; string viewfilename=prefix+".views"; if(!error(input(viewfilename,check=false))) options="3Dviews="+locatefile(viewfilename); shipout(options=options); asymptote-3.05/examples/slope.asy0000644000000000000000000000374415031566105015654 0ustar rootrootimport ode; import graph; import math; size(200,200,IgnoreAspect); real f(real t, real y) {return cos(y);} //real f(real t, real y) {return 1/(1+y);} typedef real function(real,real); real a=0; real b=1; real y0=0; real L[]={1,2}; int M=L.length; // Number of modes. //real Y0[]=array(M,y0); real Y0[]=new real[] {-1,2}; real[] F(real t, real[] y) { return sequence(new real(int m) {return f(t,y[M-m-1]);},M); // return new real[] {exp((L[1]-1)*t)*y[1], // -exp(-(L[1]-1)*t)*y[0]}; // return new real[]{-y[0]^2}; } real[] G(real t, real[] y) { return F(t,y)-sequence(new real(int m) {return L[m]*y[m];},M); } real lambda=sqrt(0.5); real[] tau,error,error2; int n=25; real order=3; for(int i=0; i < n-1; ++i) { real dt=(b-a)*lambda^(n-i); Solution S=integrate(Y0,G,a,b,dt,dynamic=false,0.0002,0.0004,RK3BS,verbose=false); real maxnorm=0; Solution E=integrate(Y0,G,a,b,1e-2*dt,dynamic=false,0.0002,0.0004,RK5); real[] exact=E.y[E.y.length-1]; // real[] exact=new real[] {exp(-b)*sin(b),exp(-L[1]*b)*cos(b)}; for(int m=0; m < M; ++m) maxnorm=max(maxnorm,abs(S.y[S.y.length-1][m]-exact[m])); if(maxnorm != 0) { tau.push(dt); // error.push(dt^-(order+1)*maxnorm); error.push(maxnorm); } } /* for(int i=0; i < n-1; ++i) { real dt=(b-a)*lambda^(n-i); real maxnorm=0; for(int m=0; m < M; ++m) { solution S=integrate(Y0[m],L[m],f,a,b,dt,dynamic=false,0.000,1000,RK4_375,verbose=false); maxnorm=max(maxnorm,abs(S.y[S.y.length-1]-exact[m])); } error2.push(dt^-order*maxnorm); } */ //scale(Log,Log); scale(Log,Linear); //draw(graph(tau,error),marker(scale(0.8mm)*unitcircle,red)); //draw(graph(tau,error2),marker(scale(0.8mm)*unitcircle,blue)); int[] index=sequence(error.length-1); real[] slope=log(error[index+1]/error[index])/log(tau[index+1]/tau[index]); real[] t=sqrt(tau[index]*tau[index+1]); //write(t,slope); draw(graph(t,slope),red); xaxis("$\tau$",BottomTop,LeftTicks); yaxis("$e/\tau^"+string(order)+"$",LeftRight,RightTicks); asymptote-3.05/examples/partialsurface.asy0000644000000000000000000000130715031566105017530 0ustar rootrootimport graph3; import palette; size(0,300); currentprojection=perspective(3,-2,2); real V(real r) {return r^4-r^2;} real V(pair pos) {return V(abs(pos));} real R=1/sqrt(2); real z=-0.2; bool active(pair pos) {return abs(pos) < R;} bool above(pair pos) {return V(pos) >= z;} pair a=(-1.5,-1); pair b=(0.5,1); real f=1.2; draw(plane(f*(b.x-a.x,0,z),(0,f*(b.y-a.y),z),(a.x,a.y,z)), lightgrey+opacity(0.5)); surface s=surface(V,a,b,40,Spline,active); draw(s,mean(palette(s.map(new real(triple v) { return above((v.x,v.y)) ? 1 : 0;}), new pen[] {lightblue,lightgreen})),black); xaxis3(Label("$\phi^\dagger\phi$",1),red,Arrow3); zaxis3(Label("$V(\phi^\dagger\phi)$",1),0,0.3,red,Arrow3); asymptote-3.05/examples/washer.asy0000644000000000000000000000055015031566105016013 0ustar rootrootimport three; size(10cm); path3[] p=reverse(unitcircle3)^^scale3(0.5)*unitcircle3; path[] g=reverse(unitcircle)^^scale(0.5)*unitcircle; triple H=-0.4Z; render render=render(merge=true); draw(surface(p,planar=true),render); draw(surface(shift(H)*p,planar=true),render); material m=material(lightgray,shininess=1.0); for(path pp : g) draw(extrude(pp,H),m); asymptote-3.05/examples/circles.asy0000644000000000000000000000110015031566105016136 0ustar rootrootsize(6cm,0); import math; currentpen=magenta; real r1=1; real r2=sqrt(7); real r3=4; pair O=0; path c1=circle(O,r1); draw(c1,green); draw(circle(O,r2),green); draw(circle(O,r3),green); real x=-0.6; real y=-0.8; real yD=0.3; pair A=(sqrt(r1^2-y^2),y); pair B=(-sqrt(r2^2-y^2),y); pair C=(x,sqrt(r3^2-x^2)); pair d=A+r2*dir(B--C); pair D=intersectionpoint(c1,A--d); draw(A--B--C--cycle); draw(interp(A,D,-0.5)--interp(A,D,1.5),blue); dot("$O$",O,S,red); dot("$A$",A,dir(C--A,B--A),red); dot("$B$",B,dir(C--B,A--B),red); dot("$C$",C,dir(A--C,B--C),red); dot("$D$",D,red); asymptote-3.05/examples/NURBSsphere.asy0000644000000000000000000000210015031566105016613 0ustar rootrootsettings.outformat="pdf"; settings.prc=true; import three; /* Reference: @article{Qin97, title={{Representing quadric surfaces using NURBS surfaces}}, author={Qin, K.}, journal={Journal of Computer Science and Technology}, volume={12}, number={3}, pages={210--216}, year={1997}, publisher={Springer} } */ size(10cm); currentprojection=perspective(5,4,2,autoadjust=false); // udegree=2, vdegree=3, nu=3, nv=4; real[] W={2/3,1/3,1}; real[] w={1,1/3,1/3,1}; // 10 distinct control points triple[][] P={{(0,0,1),(-2,-2,1),(-2,-2,-1),(0,0,-1)}, {(0,0,1),(2,-2,1),(2,-2,-1),(0,0,-1)}, {(0,0,1),(2,2,1),(2,2,-1),(0,0,-1)}, {(0,0,1),(-2,2,1),(-2,2,-1),(0,0,-1)}}; P.cyclic=true; real[][] weights=new real[3][4]; for(int i=0; i < 3; ++i) for(int j=0; j < 4; ++j) weights[i][j]=W[i]*w[j]; real[] uknot={0,0,1/3,1/2,1,1}; real[] vknot={0,0,0,0,1,1,1,1}; int N=1; for(int k=0; k < N; ++k) for(int i=0; i < 4; ++i) draw(shift(k*Z)*P[i:i+3],uknot,vknot,weights,blue); // draw(unitsphere,red+opacity(0.1)); asymptote-3.05/examples/triangle.asy0000644000000000000000000000031715031566105016330 0ustar rootrootsize(0,100); import geometry; triangle t=triangle(b=3,alpha=90,c=4); dot((0,0)); draw(t); draw(rotate(90)*t,red); draw(shift((-4,0))*t,blue); draw(reflect((0,0),(1,0))*t,green); draw(slant(2)*t,magenta); asymptote-3.05/examples/hyperboloid.asy0000644000000000000000000000047315031566105017046 0ustar rootrootsize(200); import solids; currentprojection=perspective(4,4,3); revolution hyperboloid=revolution(graph(new triple(real z) { return (sqrt(1+z*z),0,z);},-2,2,20,operator ..),axis=Z); draw(surface(hyperboloid),green,render(compression=Low,merge=true)); draw(hyperboloid,6,blue+0.15mm,longitudinalpen=nullpen); asymptote-3.05/examples/trefoilknot.asy0000644000000000000000000000111515031566105017060 0ustar rootrootimport tube; import graph3; import palette; currentlight=White; size(0,8cm); currentprojection=perspective(1,1,1,up=-Y); int e=1; real x(real t) {return cos(t)+2*cos(2t);} real y(real t) {return sin(t)-2*sin(2t);} real z(real t) {return 2*e*sin(3t);} path3 p=scale3(2)*graph(x,y,z,0,2pi,50,operator ..)&cycle; pen[] pens=Gradient(6,red,blue,purple); pens.push(yellow); for (int i=pens.length-2; i >= 0 ; --i) pens.push(pens[i]); path sec=scale(0.25)*texpath("$\pi$")[0]; coloredpath colorsec=coloredpath(sec, pens,colortype=coloredNodes); draw(tube(p,colorsec),render(merge=true)); asymptote-3.05/examples/dimension.asy0000644000000000000000000000077515031566105016520 0ustar rootrootsize(12cm,0); void distance(picture pic=currentpicture, pair A, pair B, Label L="", real n=0, pen p=currentpen) { real d=3mm; path g=A--B; transform T=shift(-n*d*unit(B-A)*I); pic.add(new void(frame f, transform t) { picture opic; path G=T*t*g; draw(opic,Label(L,Center,UnFill(1)),G,p,Arrows(NoFill),Bars,PenMargins); add(f,opic.fit()); }); pic.addBox(min(g),max(g),T*min(p),T*max(p)); } pair A=(0,0), B=(3,3); dot(A); dot(B); distance(A,B,"$\ell$",1); asymptote-3.05/examples/worksheet.asy0000644000000000000000000000172215031566105016537 0ustar rootrootimport fontsize; settings.outformat="pdf"; defaultpen(Helvetica()); picture pic; unitsize(pic,mm); pair z=(0,0); real length=88; real height=8; pair step=height*S; label(pic,"Word Wall Spelling",z,Align); z += step; frame f; label(f,"Name:"); pair z0=(max(f).x,min(f).y); draw(f,z0--z0+50mm); add(pic,f,z,Align); z += step; for(int i=1; i <= 15; ++i) { draw(pic,z--z+length); z += step; draw(pic,z--z+length,dashed+gray); z += step; void label(int i) { label(pic,string(i)+".",z,0.2NE,fontsize(0.8*1.5*2*height*mm)+gray); } if(i <= 10) label(i); else if(i == 11) { pair z0=z+length/2; pen p=fontsize(20pt); label(pic,"Challenge Word",z0+N*height,I*Align.y,p+basealign); label(pic,"(optional)",z0,I*Align.y,p); } else if(i == 12) label(1); else if(i == 13) label(2); else if(i == 14) label(3); } draw(pic,z--z+length); add(pic.fit(),(0,0),W); add(pic.fit(),(0,0),E); newpage(); add(pic.fit(),(0,0),W); add(pic.fit(),(0,0),E); asymptote-3.05/examples/unitoctantx.asy0000644000000000000000000000131215031566105017077 0ustar rootrootimport graph3; currentprojection=orthographic(5,4,2); size(0,150); patch s=octant1x; draw(surface(s),green+opacity(0.5)); draw(s.external(),blue); triple[][] P=s.P; for(int i=0; i < 4; ++i) dot(P[i],red); axes3("$x$","$y$",Label("$z$",align=Z)); triple P00=P[0][0]; triple P10=P[1][0]; triple P01=P[0][1]; triple P02=P[0][2]; triple P11=P[1][1]; triple P12=P[1][2]; triple Q11=XYplane(xypart(P11)); triple Q12=XYplane(xypart(P12)); draw(P11--Q11,dashed); draw(P12--Q12,dashed); draw(O--Q12--Q11--(Q11.x,0,0)); draw(Q12--(Q12.x,0,0)); label("$(1,0,0)$",P00,-2Y); label("$(1,a,0)$",P10,-Z); label("$(1,0,a)$",P01,-2Y); label("$(a,0,1)$",P02,Z+X-Y); label("$(1,a,a)$",P11,3X); label("$(a,a^2,1)$",P12,7X+Y); asymptote-3.05/examples/hyperboloidsilhouette.asy0000644000000000000000000000041315031566105021146 0ustar rootrootsize(200); import solids; settings.render=0; settings.prc=false; currentprojection=perspective(4,4,3); revolution hyperboloid=revolution(graph(new triple(real z) { return (sqrt(1+z*z),0,z);},-2,2,20,operator ..),axis=Z); draw(hyperboloid.silhouette(64),blue); asymptote-3.05/examples/dragon.asy0000644000000000000000000000230015031566105015767 0ustar rootrootpair crease(pair z1, pair z2, bool left) { pair dz = z2 - z1; if (left) return z1 + dz * (0.5, 0.5); else return z1 + dz * (0.5, -0.5); } pair[] fold(pair[] oldz) { int n = oldz.length; pair[] newz = new pair[2n-1]; for (int i = 0; i < n-1; ++i) { newz[2i] = oldz[i]; newz[2i+1] = crease(oldz[i], oldz[i+1], i%2==0); } newz[2(n-1)] = oldz[n-1]; return newz; } pair[] dragon(int n, pair[] base={}) { if (base.length == 0) if (n%2 == 0) base = new pair[] {(0,0), (1,1) }; else base = new pair[] {(0,0), (1,0) }; pair[] z = base; for (int i = 1; i < n; ++i) z = fold(z); return z; } void drawtris(pair[] z, pen p = currentpen) { int n = z.length; for (int i = 0; i < n-2; i+=2) fill(z[i]--z[i+1]--z[i+2]--cycle, p); } void drawtris(pair[] z, pen p1, pen p2) { int n = z.length; for (int i = 0; i < n-2; i+=2) fill(z[i]--z[i+1]--z[i+2]--cycle, 2i < n-1 ? p1 : p2); } size(500,0); int n = 10; drawtris(dragon(n, new pair[] {(0,0), (1,0)}), black); drawtris(dragon(n, new pair[] {(0,0), (0,-1)}), blue); drawtris(dragon(n, new pair[] {(0,0), (-1,0)}), red); drawtris(dragon(n, new pair[] {(0,0), (0,1)}), green); asymptote-3.05/examples/pathintersectsurface.asy0000644000000000000000000000065215031566105020753 0ustar rootrootsize(500); import graph3; currentprojection=perspective(-5,-4,2); path3 g=randompath3(10); draw(g,red); triple[][] P= { {(0,0,0),(1,0,0),(1,0,0),(2,0,0)}, {(0,4/3,0),(2/3,4/3,2),(4/3,4/3,2),(2,4/3,0)}, {(0,2/3,0),(2/3,2/3,0),(4/3,2/3,0),(2,2/3,0)}, {(0,2,0),(2/3,2,0),(4/3,2,0),(2,2,0)}}; surface s=surface(patch(P)); s.append(unitplane); draw(s,lightgray+opacity(0.9)); dot(intersectionpoints(g,s),blue); asymptote-3.05/examples/unitoctant.asy0000644000000000000000000000065615031566105016721 0ustar rootrootimport graph3; currentprojection=orthographic(5,5,8); size(0,150); patch s0=octant1.s[0]; patch s1=octant1.s[1]; draw(surface(s0),green+opacity(0.5)); draw(surface(s1),green+opacity(0.5)); draw(s0.external(),blue); draw(s1.external(),blue); triple[][] P0=s0.P; triple[][] P1=s1.P; for(int i=0; i < 4; ++i) dot(P0[i],red+0.75mm); for(int i=0; i < 4; ++i) dot(P1[i],red+0.65mm); axes3("$x$","$y$",Label("$z$",align=Z)); asymptote-3.05/examples/ring.asy0000644000000000000000000000021515031566105015457 0ustar rootrootsize(0,100); path g=scale(2)*unitcircle; label("$a \le r \le b$"); radialshade(unitcircle^^g,yellow+evenodd,(0,0),1.0,yellow+brown,(0,0),2); asymptote-3.05/examples/sphereskeleton.asy0000644000000000000000000000024215031566105017553 0ustar rootrootsize(100); import solids; currentprojection=orthographic(5,4,2); revolution sphere=sphere(1); draw(surface(sphere),green+opacity(0.2)); draw(sphere,m=7,blue); asymptote-3.05/examples/galleon.asy0000644000000000000000000000076315031566105016151 0ustar rootrootimport obj; size(15cm); currentprojection=orthographic(0,2,5,up=Y); // A compressed version of the required data file may be obtained from: // http://www.cs.technion.ac.il/~irit/data/Viewpoint/galleon.obj.gz pen[] surfacepen={darkred,brown,darkred+orange,heavyred,heavyred,darkred+orange, palegreen+blue+lightgrey,darkred,darkred,yellow,darkred,white, white,white,white,white,white}; surfacepen.cyclic=true; draw(obj("galleon.obj",verbose=false,surfacepen)); asymptote-3.05/examples/randompath3.asy0000644000000000000000000000011615031566105016740 0ustar rootrootimport three; size(300); path3 g=randompath3(100); draw(g,red,currentlight); asymptote-3.05/examples/interpolate1.asy0000644000000000000000000001131115031566105017126 0ustar rootroot// Lagrange and Hermite interpolation in Asymptote // Author: Olivier Guibé import interpolate; import graph; // Test 1: The Runge effect in the Lagrange interpolation of 1/(x^2+1). unitsize(2cm); real f(real x) {return(1/(x^2+1));} real df(real x) {return(-2*x/(x^2+1)^2);} real a=-5, b=5; int n=15; real[] x,y,dy; x=a+(b-a)*sequence(n+1)/n; y=map(f,x); dy=map(df,x); for(int i=0; i <= n; ++i) dot((x[i],y[i]),5bp+blue); horner h=diffdiv(x,y); fhorner p=fhorner(h); draw(graph(p,a,b,n=500),"$x\longmapsto{}L_{"+string(n)+"}$"); draw(graph(f,a,b),red,"$x\longmapsto{}\frac{1}{x^2+1}$"); xlimits(-5,5); ylimits(-1,1,Crop); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); attach(legend(),point(10S),30S); shipout("runge1"); erase(); // Test 2: The Runge effect in the Hermite interpolation of 1/(x^2+1). real f(real x) {return(1/(x^2+1));} real df(real x) {return(-2*x/(x^2+1)^2);} real a=-5, b=5; int n=16; real[] x,y,dy; x=a+(b-a)*sequence(n+1)/n; y=map(f,x); dy=map(df,x); for(int i=0; i <= n; ++i) dot((x[i],y[i]),5bp+blue); horner h=hdiffdiv(x,y,dy); fhorner ph=fhorner(h); draw(graph(p,a,b,n=500),"$x\longmapsto{}H_{"+string(n)+"}$"); draw(graph(f,a,b),red,"$x\longmapsto{}\frac{1}{x^2+1}$"); unitsize(2cm); xlimits(-5,5); ylimits(-1,5,Crop); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); attach(legend(),point(10S),30S); shipout("runge2"); erase(); // Test 3: The Runge effect does not occur for all functions: // Lagrange interpolation of a function whose successive derivatives // are bounded by a constant M (here M=1) is shown here to converge. real f(real x) {return(sin(x));} real df(real x) {return(cos(x));} real a=-5, b=5; int n=16; real[] x,y,dy; x=a+(b-a)*sequence(n+1)/n; y=map(f,x); dy=map(df,x); for(int i=0; i <= n; ++i) dot((x[i],y[i]),5bp+blue); horner h=diffdiv(x,y); fhorner p=fhorner(h); draw(graph(p,a,b,n=500),"$x\longmapsto{}L_{"+string(n)+"}$"); draw(graph(f,a,b),red,"$x\longmapsto{}\cos(x)$"); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); attach(legend(),point(10S),30S); shipout("runge3"); erase(); // Test 4: However, one notes here that numerical artifacts may arise // from limit precision (typically 1e-16). real f(real x) {return(sin(x));} real df(real x) {return(cos(x));} real a=-5, b=5; int n=72; real[] x,y,dy; x=a+(b-a)*sequence(n+1)/n; y=map(f,x); dy=map(df,x); for(int i=0; i <= n; ++i) dot((x[i],y[i]),5bp+blue); horner h=diffdiv(x,y); fhorner p=fhorner(h); draw(graph(p,a,b,n=500),"$x\longmapsto{}L_{"+string(n)+"}$"); draw(graph(f,a,b),red,"$x\longmapsto{}\cos(x)$"); ylimits(-1,5,Crop); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); attach(legend(),point(10S),30S); shipout("runge4"); erase(); // Test 5: The situation is much better using Tchebychev points. unitsize(2cm); real f(real x) {return(1/(x^2+1));} real df(real x) {return(-2*x/(x^2+1)^2);} real a=-5, b=5; int n=16; real[] x,y,dy; fhorner p,ph,ph1; for(int i=0; i <= n; ++i) x[i]=(a+b)/2+(b-a)/2*cos((2*i+1)/(2*n+2)*pi); y=map(f,x); dy=map(df,x); for(int i=0; i <= n; ++i) dot((x[i],y[i]),5bp+blue); horner h=diffdiv(x,y); fhorner p=fhorner(h); draw(graph(p,a,b,n=500),"$x\longmapsto{}T_{"+string(n)+"}$"); draw(graph(f,a,b),red,"$x\longmapsto{}\frac{1}{x^2+1}$"); xlimits(-5,5); ylimits(-1,2,Crop); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); attach(legend(),point(10S),30S); shipout("runge5"); erase(); // Test 6: Adding a few more Tchebychev points yields a very good result. unitsize(2cm); real f(real x) {return(1/(x^2+1));} real df(real x) {return(-2*x/(x^2+1)^2);} real a=-5, b=5; int n=26; real[] x,y,dy; for(int i=0; i <= n; ++i) x[i]=(a+b)/2+(b-a)/2*cos((2*i+1)/(2*n+2)*pi); y=map(f,x); dy=map(df,x); for(int i=0; i <= n; ++i) dot((x[i],y[i]),5bp+blue); horner h=diffdiv(x,y); fhorner p=fhorner(h); draw(graph(p,a,b,n=500),"$x\longmapsto{}T_{"+string(n)+"}$"); draw(graph(f,a,b),red,"$x\longmapsto{}\frac{1}{x^2+1}$"); xlimits(-5,5); ylimits(-1,2,Crop); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); attach(legend(),point(10S),30S); shipout("runge6"); erase(); // Test 7: Another Tchebychev example. unitsize(2cm); real f(real x) {return(sqrt(abs(x-1)));} real a=-2, b=2; int n=30; real[] x,y,dy; for(int i=0; i <= n; ++i) x[i]=(a+b)/2+(b-a)/2*cos((2*i+1)/(2*n+2)*pi); y=map(f,x); dy=map(df,x); for(int i=0; i <= n; ++i) dot((x[i],y[i]),5bp+blue); horner h=diffdiv(x,y); fhorner p=fhorner(h); draw(graph(p,a,b,n=500),"$x\longmapsto{}T_{"+string(n)+"}$"); draw(graph(f,a,b),red,"$x\longmapsto{}\sqrt{|x-1|}$"); xlimits(-2,2); ylimits(-0.5,2,Crop); xaxis("$x$",BottomTop,LeftTicks); yaxis("$y$",LeftRight,RightTicks); attach(legend(),point(10S),30S); shipout("runge7"); asymptote-3.05/examples/tetra.asy0000644000000000000000000000104315031566105015637 0ustar rootrootimport graph3; unitsize(1cm); currentprojection=orthographic(10,5,5); triple O=(0,0,0),N=(0,0,10),A=(8.66,0,-5), B=(-4.33,7.5,-5),C=(-4.33,-7.5,-5); path3[] D=N--A--B--C--N--B^^A--C; draw(surface(A--B--C--cycle),.5*blue+.5*white+opacity(.5)); draw(surface(N--B--C--cycle),.5*green+.5*white+opacity(.5)); draw(surface(N--C--A--cycle),.5*yellow+.5*white+opacity(.5)); draw(surface(N--A--B--cycle),.5*red+.5*white+opacity(.5)); draw(D,blue+1bp); dot(D);dot(O); label("$O$",O,E);label("$N$",N,N);label("$A$",A,SE);label("$B$",B,E);label("$C$",C,W+S); asymptote-3.05/examples/axialshade.asy0000644000000000000000000000007515031566105016627 0ustar rootrootsize(0,100); axialshade(unitsquare,red,(0,0),blue,(1,1)); asymptote-3.05/examples/truncatedIcosahedron.asy0000644000000000000000000000402715031566105020675 0ustar rootrootimport graph3; size(200); real c=(1+sqrt(5))/2; triple[] z={(c,1,0),(-c,1,0),(-c,-1,0),(c,-1,0)}; triple[] x={(0,c,1),(0,-c,1),(0,-c,-1),(0,c,-1)}; triple[] y={(1,0,c),(1,0,-c),(-1,0,-c),(-1,0,c)}; triple[][] Q= { {(c,1,0),(1,0,-c),(0,c,-1),(0,c,1),(1,0,c),(c,-1,0)}, {(-c,1,0),(0,c,1),(0,c,-1),(-1,0,-c),(-c,-1,0),(-1,0,c)}, {(-c,-1,0),(-c,1,0),(-1,0,-c),(0,-c,-1),(0,-c,1),(-1,0,c)}, {(c,-1,0),(c,1,0),(1,0,c),(0,-c,1),(0,-c,-1),(1,0,-c)}, {(0,c,1),(0,c,-1),(-c,1,0),(-1,0,c),(1,0,c),(c,1,0)}, {(0,-c,1),(0,-c,-1),(-c,-1,0),(-1,0,c),(1,0,c),(c,-1,0)}, {(0,-c,-1),(0,-c,1),(c,-1,0),(1,0,-c),(-1,0,-c),(-c,-1,0)}, {(0,c,-1),(0,c,1),(c,1,0),(1,0,-c),(-1,0,-c),(-c,1,0)}, {(1,0,c),(-1,0,c),(0,-c,1),(c,-1,0),(c,1,0),(0,c,1)}, {(1,0,-c),(-1,0,-c),(0,-c,-1),(c,-1,0),(c,1,0),(0,c,-1)}, {(-1,0,-c),(1,0,-c),(0,c,-1),(-c,1,0),(-c,-1,0),(0,-c,-1)}, {(-1,0,c),(1,0,c),(0,c,1),(-c,1,0),(-c,-1,0),(0,-c,1)} }; real R=abs(interp(Q[0][0],Q[0][1],1/3)); triple[][] P; for(int i=0; i < Q.length; ++i) { P[i]=new triple[] ; for(int j=0; j < Q[i].length; ++j) { P[i][j]=Q[i][j]/R; } } for(int i=0; i < P.length; ++i) { for(int j=1; j < P[i].length; ++j) { triple C=P[i][0]; triple A=P[i][j]; triple B=P[i][j % 5+1]; triple[] sixout=new triple[] {interp(C,A,1/3),interp(C,A,2/3),interp(A,B,1/3),interp(A,B,2/3), interp(B,C,1/3),interp(B,C,2/3)}; triple M=(sum(sixout))/6; triple[] sixin=sequence(new triple(int k) { return interp(sixout[k],M,0.1); },6); draw(surface(reverse(operator--(...sixout)--cycle)^^ operator--(...sixin)--cycle,planar=true),magenta); } } for(int i=0; i < P.length; ++i) { triple[] fiveout=sequence(new triple(int k) { return interp(P[i][0],P[i][k+1],1/3); },5); triple M=(sum(fiveout))/5; triple[] fivein=sequence(new triple(int k) { return interp(fiveout[k],M,0.1); },5); draw(surface(reverse(operator--(...fiveout)--cycle)^^ operator--(...fivein)--cycle,planar=true),cyan); } asymptote-3.05/examples/elevation.asy0000644000000000000000000000045215031566105016511 0ustar rootrootimport graph3; import grid3; import palette; currentprojection=orthographic(0.8,1,1); size(400,300,IgnoreAspect); real f(pair z) {return cos(2*pi*z.x)*sin(2*pi*z.y);} surface s=surface(f,(-1/2,-1/2),(1/2,1/2),50,Spline); draw(s,mean(palette(s.map(zpart),Rainbow(40))),black); grid3(XYZgrid); asymptote-3.05/examples/teapot.asy0000644000000000000000000003412415031566105016022 0ustar rootrootimport three; size(20cm); currentprojection=perspective(250,-250,250); currentlight=Viewport; triple[][][] Q={ { {(39.68504,0,68.0315),(37.91339,0,71.75197),(40.74803,0,71.75197),(42.51969,0,68.0315)}, {(39.68504,-22.22362,68.0315),(37.91339,-21.2315,71.75197),(40.74803,-22.8189,71.75197),(42.51969,-23.81102,68.0315)}, {(22.22362,-39.68504,68.0315),(21.2315,-37.91339,71.75197),(22.8189,-40.74803,71.75197),(23.81102,-42.51969,68.0315)}, {(0,-39.68504,68.0315),(0,-37.91339,71.75197),(0,-40.74803,71.75197),(0,-42.51969,68.0315)} }, { {(0,-39.68504,68.0315),(0,-37.91339,71.75197),(0,-40.74803,71.75197),(0,-42.51969,68.0315)}, {(-22.22362,-39.68504,68.0315),(-21.2315,-37.91339,71.75197),(-22.8189,-40.74803,71.75197),(-23.81102,-42.51969,68.0315)}, {(-39.68504,-22.22362,68.0315),(-37.91339,-21.2315,71.75197),(-40.74803,-22.8189,71.75197),(-42.51969,-23.81102,68.0315)}, {(-39.68504,0,68.0315),(-37.91339,0,71.75197),(-40.74803,0,71.75197),(-42.51969,0,68.0315)} }, { {(-39.68504,0,68.0315),(-37.91339,0,71.75197),(-40.74803,0,71.75197),(-42.51969,0,68.0315)}, {(-39.68504,22.22362,68.0315),(-37.91339,21.2315,71.75197),(-40.74803,22.8189,71.75197),(-42.51969,23.81102,68.0315)}, {(-22.22362,39.68504,68.0315),(-21.2315,37.91339,71.75197),(-22.8189,40.74803,71.75197),(-23.81102,42.51969,68.0315)}, {(0,39.68504,68.0315),(0,37.91339,71.75197),(0,40.74803,71.75197),(0,42.51969,68.0315)} }, { {(0,39.68504,68.0315),(0,37.91339,71.75197),(0,40.74803,71.75197),(0,42.51969,68.0315)}, {(22.22362,39.68504,68.0315),(21.2315,37.91339,71.75197),(22.8189,40.74803,71.75197),(23.81102,42.51969,68.0315)}, {(39.68504,22.22362,68.0315),(37.91339,21.2315,71.75197),(40.74803,22.8189,71.75197),(42.51969,23.81102,68.0315)}, {(39.68504,0,68.0315),(37.91339,0,71.75197),(40.74803,0,71.75197),(42.51969,0,68.0315)} }, { {(42.51969,0,68.0315),(49.60629,0,53.1496),(56.69291,0,38.26771),(56.69291,0,25.51181)}, {(42.51969,-23.81102,68.0315),(49.60629,-27.77952,53.1496),(56.69291,-31.74803,38.26771),(56.69291,-31.74803,25.51181)}, {(23.81102,-42.51969,68.0315),(27.77952,-49.60629,53.1496),(31.74803,-56.69291,38.26771),(31.74803,-56.69291,25.51181)}, {(0,-42.51969,68.0315),(0,-49.60629,53.1496),(0,-56.69291,38.26771),(0,-56.69291,25.51181)} }, { {(0,-42.51969,68.0315),(0,-49.60629,53.1496),(0,-56.69291,38.26771),(0,-56.69291,25.51181)}, {(-23.81102,-42.51969,68.0315),(-27.77952,-49.60629,53.1496),(-31.74803,-56.69291,38.26771),(-31.74803,-56.69291,25.51181)}, {(-42.51969,-23.81102,68.0315),(-49.60629,-27.77952,53.1496),(-56.69291,-31.74803,38.26771),(-56.69291,-31.74803,25.51181)}, {(-42.51969,0,68.0315),(-49.60629,0,53.1496),(-56.69291,0,38.26771),(-56.69291,0,25.51181)} }, { {(-42.51969,0,68.0315),(-49.60629,0,53.1496),(-56.69291,0,38.26771),(-56.69291,0,25.51181)}, {(-42.51969,23.81102,68.0315),(-49.60629,27.77952,53.1496),(-56.69291,31.74803,38.26771),(-56.69291,31.74803,25.51181)}, {(-23.81102,42.51969,68.0315),(-27.77952,49.60629,53.1496),(-31.74803,56.69291,38.26771),(-31.74803,56.69291,25.51181)}, {(0,42.51969,68.0315),(0,49.60629,53.1496),(0,56.69291,38.26771),(0,56.69291,25.51181)} }, { {(0,42.51969,68.0315),(0,49.60629,53.1496),(0,56.69291,38.26771),(0,56.69291,25.51181)}, {(23.81102,42.51969,68.0315),(27.77952,49.60629,53.1496),(31.74803,56.69291,38.26771),(31.74803,56.69291,25.51181)}, {(42.51969,23.81102,68.0315),(49.60629,27.77952,53.1496),(56.69291,31.74803,38.26771),(56.69291,31.74803,25.51181)}, {(42.51969,0,68.0315),(49.60629,0,53.1496),(56.69291,0,38.26771),(56.69291,0,25.51181)} }, { {(56.69291,0,25.51181),(56.69291,0,12.7559),(42.51969,0,6.377957),(42.51969,0,4.251961)}, {(56.69291,-31.74803,25.51181),(56.69291,-31.74803,12.7559),(42.51969,-23.81102,6.377957),(42.51969,-23.81102,4.251961)}, {(31.74803,-56.69291,25.51181),(31.74803,-56.69291,12.7559),(23.81102,-42.51969,6.377957),(23.81102,-42.51969,4.251961)}, {(0,-56.69291,25.51181),(0,-56.69291,12.7559),(0,-42.51969,6.377957),(0,-42.51969,4.251961)} }, { {(0,-56.69291,25.51181),(0,-56.69291,12.7559),(0,-42.51969,6.377957),(0,-42.51969,4.251961)}, {(-31.74803,-56.69291,25.51181),(-31.74803,-56.69291,12.7559),(-23.81102,-42.51969,6.377957),(-23.81102,-42.51969,4.251961)}, {(-56.69291,-31.74803,25.51181),(-56.69291,-31.74803,12.7559),(-42.51969,-23.81102,6.377957),(-42.51969,-23.81102,4.251961)}, {(-56.69291,0,25.51181),(-56.69291,0,12.7559),(-42.51969,0,6.377957),(-42.51969,0,4.251961)} }, { {(-56.69291,0,25.51181),(-56.69291,0,12.7559),(-42.51969,0,6.377957),(-42.51969,0,4.251961)}, {(-56.69291,31.74803,25.51181),(-56.69291,31.74803,12.7559),(-42.51969,23.81102,6.377957),(-42.51969,23.81102,4.251961)}, {(-31.74803,56.69291,25.51181),(-31.74803,56.69291,12.7559),(-23.81102,42.51969,6.377957),(-23.81102,42.51969,4.251961)}, {(0,56.69291,25.51181),(0,56.69291,12.7559),(0,42.51969,6.377957),(0,42.51969,4.251961)} }, { {(0,56.69291,25.51181),(0,56.69291,12.7559),(0,42.51969,6.377957),(0,42.51969,4.251961)}, {(31.74803,56.69291,25.51181),(31.74803,56.69291,12.7559),(23.81102,42.51969,6.377957),(23.81102,42.51969,4.251961)}, {(56.69291,31.74803,25.51181),(56.69291,31.74803,12.7559),(42.51969,23.81102,6.377957),(42.51969,23.81102,4.251961)}, {(56.69291,0,25.51181),(56.69291,0,12.7559),(42.51969,0,6.377957),(42.51969,0,4.251961)} }, { {(-45.35433,0,57.40157),(-65.19685,0,57.40157),(-76.53543,0,57.40157),(-76.53543,0,51.02362)}, {(-45.35433,-8.503932,57.40157),(-65.19685,-8.503932,57.40157),(-76.53543,-8.503932,57.40157),(-76.53543,-8.503932,51.02362)}, {(-42.51969,-8.503932,63.77952),(-70.86614,-8.503932,63.77952),(-85.03937,-8.503932,63.77952),(-85.03937,-8.503932,51.02362)}, {(-42.51969,0,63.77952),(-70.86614,0,63.77952),(-85.03937,0,63.77952),(-85.03937,0,51.02362)} }, { {(-42.51969,0,63.77952),(-70.86614,0,63.77952),(-85.03937,0,63.77952),(-85.03937,0,51.02362)}, {(-42.51969,8.503932,63.77952),(-70.86614,8.503932,63.77952),(-85.03937,8.503932,63.77952),(-85.03937,8.503932,51.02362)}, {(-45.35433,8.503932,57.40157),(-65.19685,8.503932,57.40157),(-76.53543,8.503932,57.40157),(-76.53543,8.503932,51.02362)}, {(-45.35433,0,57.40157),(-65.19685,0,57.40157),(-76.53543,0,57.40157),(-76.53543,0,51.02362)} }, { {(-76.53543,0,51.02362),(-76.53543,0,44.64566),(-70.86614,0,31.88976),(-56.69291,0,25.51181)}, {(-76.53543,-8.503932,51.02362),(-76.53543,-8.503932,44.64566),(-70.86614,-8.503932,31.88976),(-56.69291,-8.503932,25.51181)}, {(-85.03937,-8.503932,51.02362),(-85.03937,-8.503932,38.26771),(-75.11811,-8.503932,26.5748),(-53.85826,-8.503932,17.00787)}, {(-85.03937,0,51.02362),(-85.03937,0,38.26771),(-75.11811,0,26.5748),(-53.85826,0,17.00787)} }, { {(-85.03937,0,51.02362),(-85.03937,0,38.26771),(-75.11811,0,26.5748),(-53.85826,0,17.00787)}, {(-85.03937,8.503932,51.02362),(-85.03937,8.503932,38.26771),(-75.11811,8.503932,26.5748),(-53.85826,8.503932,17.00787)}, {(-76.53543,8.503932,51.02362),(-76.53543,8.503932,44.64566),(-70.86614,8.503932,31.88976),(-56.69291,8.503932,25.51181)}, {(-76.53543,0,51.02362),(-76.53543,0,44.64566),(-70.86614,0,31.88976),(-56.69291,0,25.51181)} }, { {(48.18897,0,40.3937),(73.70078,0,40.3937),(65.19685,0,59.52755),(76.53543,0,68.0315)}, {(48.18897,-18.70866,40.3937),(73.70078,-18.70866,40.3937),(65.19685,-7.086619,59.52755),(76.53543,-7.086619,68.0315)}, {(48.18897,-18.70866,17.00787),(87.87401,-18.70866,23.38582),(68.0315,-7.086619,57.40157),(93.5433,-7.086619,68.0315)}, {(48.18897,0,17.00787),(87.87401,0,23.38582),(68.0315,0,57.40157),(93.5433,0,68.0315)} }, { {(48.18897,0,17.00787),(87.87401,0,23.38582),(68.0315,0,57.40157),(93.5433,0,68.0315)}, {(48.18897,18.70866,17.00787),(87.87401,18.70866,23.38582),(68.0315,7.086619,57.40157),(93.5433,7.086619,68.0315)}, {(48.18897,18.70866,40.3937),(73.70078,18.70866,40.3937),(65.19685,7.086619,59.52755),(76.53543,7.086619,68.0315)}, {(48.18897,0,40.3937),(73.70078,0,40.3937),(65.19685,0,59.52755),(76.53543,0,68.0315)} }, { {(76.53543,0,68.0315),(79.37007,0,70.15748),(82.20472,0,70.15748),(79.37007,0,68.0315)}, {(76.53543,-7.086619,68.0315),(79.37007,-7.086619,70.15748),(82.20472,-4.251961,70.15748),(79.37007,-4.251961,68.0315)}, {(93.5433,-7.086619,68.0315),(99.92125,-7.086619,70.68897),(97.79527,-4.251961,71.22047),(90.70866,-4.251961,68.0315)}, {(93.5433,0,68.0315),(99.92125,0,70.68897),(97.79527,0,71.22047),(90.70866,0,68.0315)} }, { {(93.5433,0,68.0315),(99.92125,0,70.68897),(97.79527,0,71.22047),(90.70866,0,68.0315)}, {(93.5433,7.086619,68.0315),(99.92125,7.086619,70.68897),(97.79527,4.251961,71.22047),(90.70866,4.251961,68.0315)}, {(76.53543,7.086619,68.0315),(79.37007,7.086619,70.15748),(82.20472,4.251961,70.15748),(79.37007,4.251961,68.0315)}, {(76.53543,0,68.0315),(79.37007,0,70.15748),(82.20472,0,70.15748),(79.37007,0,68.0315)} }, { {(5.669294,0,76.53543),(11.33858,0,72.28346),(36.85039,0,72.28346),(36.85039,0,68.0315)}, {(5.669294,-3.174809,76.53543),(11.33858,-6.349609,72.28346),(36.85039,-20.63622,72.28346),(36.85039,-20.63622,68.0315)}, {(3.174809,-5.669294,76.53543),(6.349609,-11.33858,72.28346),(20.63622,-36.85039,72.28346),(20.63622,-36.85039,68.0315)}, {(0,-5.669294,76.53543),(0,-11.33858,72.28346),(0,-36.85039,72.28346),(0,-36.85039,68.0315)} }, { {(0,-5.669294,76.53543),(0,-11.33858,72.28346),(0,-36.85039,72.28346),(0,-36.85039,68.0315)}, {(-3.174809,-5.669294,76.53543),(-6.349609,-11.33858,72.28346),(-20.63622,-36.85039,72.28346),(-20.63622,-36.85039,68.0315)}, {(-5.669294,-3.174809,76.53543),(-11.33858,-6.349609,72.28346),(-36.85039,-20.63622,72.28346),(-36.85039,-20.63622,68.0315)}, {(-5.669294,0,76.53543),(-11.33858,0,72.28346),(-36.85039,0,72.28346),(-36.85039,0,68.0315)}, }, { {(-5.669294,0,76.53543),(-11.33858,0,72.28346),(-36.85039,0,72.28346),(-36.85039,0,68.0315)}, {(-5.669294,3.174809,76.53543),(-11.33858,6.349609,72.28346),(-36.85039,20.63622,72.28346),(-36.85039,20.63622,68.0315)}, {(-3.174809,5.669294,76.53543),(-6.349609,11.33858,72.28346),(-20.63622,36.85039,72.28346),(-20.63622,36.85039,68.0315)}, {(0,5.669294,76.53543),(0,11.33858,72.28346),(0,36.85039,72.28346),(0,36.85039,68.0315)} }, { {(0,5.669294,76.53543),(0,11.33858,72.28346),(0,36.85039,72.28346),(0,36.85039,68.0315)}, {(3.174809,5.669294,76.53543),(6.349609,11.33858,72.28346),(20.63622,36.85039,72.28346),(20.63622,36.85039,68.0315)}, {(5.669294,3.174809,76.53543),(11.33858,6.349609,72.28346),(36.85039,20.63622,72.28346),(36.85039,20.63622,68.0315)}, {(5.669294,0,76.53543),(11.33858,0,72.28346),(36.85039,0,72.28346),(36.85039,0,68.0315)} } }; triple[][][] Q0={ { {(0,0,89.29133),(22.67716,0,89.29133),(0,0,80.7874),(5.669294,0,76.53543)}, {(0,0,89.29133),(22.67716,-12.7559,89.29133),(0,0,80.7874),(5.669294,-3.174809,76.53543)}, {(0,0,89.29133),(12.7559,-22.67716,89.29133),(0,0,80.7874),(3.174809,-5.669294,76.53543)}, {(0,0,89.29133),(0,-22.67716,89.29133),(0,0,80.7874),(0,-5.669294,76.53543)} }, { {(0,0,89.29133),(0,-22.67716,89.29133),(0,0,80.7874),(0,-5.669294,76.53543)}, {(0,0,89.29133),(-12.7559,-22.67716,89.29133),(0,0,80.7874),(-3.174809,-5.669294,76.53543)}, {(0,0,89.29133),(-22.67716,-12.7559,89.29133),(0,0,80.7874),(-5.669294,-3.174809,76.53543)}, {(0,0,89.29133),(-22.67716,0,89.29133),(0,0,80.7874),(-5.669294,0,76.53543)} }, { {(0,0,89.29133),(-22.67716,0,89.29133),(0,0,80.7874),(-5.669294,0,76.53543)}, {(0,0,89.29133),(-22.67716,12.7559,89.29133),(0,0,80.7874),(-5.669294,3.174809,76.53543)}, {(0,0,89.29133),(-12.7559,22.67716,89.29133),(0,0,80.7874),(-3.174809,5.669294,76.53543)}, {(0,0,89.29133),(0,22.67716,89.29133),(0,0,80.7874),(0,5.669294,76.53543)} }, { {(0,0,89.29133),(0,22.67716,89.29133),(0,0,80.7874),(0,5.669294,76.53543)}, {(0,0,89.29133),(12.7559,22.67716,89.29133),(0,0,80.7874),(3.174809,5.669294,76.53543)}, {(0,0,89.29133),(22.67716,12.7559,89.29133),(0,0,80.7874),(5.669294,3.174809,76.53543)}, {(0,0,89.29133),(22.67716,0,89.29133),(0,0,80.7874),(5.669294,0,76.53543)} }, { {(0,0,0),(40.3937,0,0),(42.51969,0,2.12598),(42.51969,0,4.251961)}, {(0,0,0),(40.3937,22.62047,0),(42.51969,23.81102,2.12598),(42.51969,23.81102,4.251961)}, {(0,0,0),(22.62047,40.3937,0),(23.81102,42.51969,2.12598),(23.81102,42.51969,4.251961)}, {(0,0,0),(0,40.3937,0),(0,42.51969,2.12598),(0,42.51969,4.251961)} }, { {(0,0,0),(0,40.3937,0),(0,42.51969,2.12598),(0,42.51969,4.251961)}, {(0,0,0),(-22.62047,40.3937,0),(-23.81102,42.51969,2.12598),(-23.81102,42.51969,4.251961)}, {(0,0,0),(-40.3937,22.62047,0),(-42.51969,23.81102,2.12598),(-42.51969,23.81102,4.251961)}, {(0,0,0),(-40.3937,0,0),(-42.51969,0,2.12598),(-42.51969,0,4.251961)} }, { {(0,0,0),(-40.3937,0,0),(-42.51969,0,2.12598),(-42.51969,0,4.251961)}, {(0,0,0),(-40.3937,-22.62047,0),(-42.51969,-23.81102,2.12598),(-42.51969,-23.81102,4.251961)}, {(0,0,0),(-22.62047,-40.3937,0),(-23.81102,-42.51969,2.12598),(-23.81102,-42.51969,4.251961)}, {(0,0,0),(0,-40.3937,0),(0,-42.51969,2.12598),(0,-42.51969,4.251961)} }, { {(0,0,0),(0,-40.3937,0),(0,-42.51969,2.12598),(0,-42.51969,4.251961)}, {(0,0,0),(22.62047,-40.3937,0),(23.81102,-42.51969,2.12598),(23.81102,-42.51969,4.251961)}, {(0,0,0),(40.3937,-22.62047,0),(42.51969,-23.81102,2.12598),(42.51969,-23.81102,4.251961)}, {(0,0,0),(40.3937,0,0),(42.51969,0,2.12598),(42.51969,0,4.251961)} } }; surface regularize(triple[][] P, real fraction=0.002) { triple[][][] B=hsplit(P,fraction); triple[][] T=B[0]; surface s=surface(T[0][0]..controls T[3][1] and T[3][2].. T[3][3]..controls T[2][3] and T[1][3].. T[0][3]..controls T[0][2] and T[0][1]..cycle); s.append(surface(patch(B[1]))); return s; } surface S=surface(Q); for(triple[][] q : Q0) S.append(regularize(q)); // S.append(surface(patch(q))); pen color; real metallic; if(settings.ibl) { color=white; metallic=1; } else { color=blue; metallic=0; } draw(S,material(color,shininess=0.85,metallic=metallic), render(compression=Single)); asymptote-3.05/examples/label3ribbon.asy0000644000000000000000000000030415031566105017055 0ustar rootrootimport three; currentprojection=perspective(100,100,200,up=Y); draw(scale3(4)*extrude(texpath("$\displaystyle\int_{-\infty}^{+\infty} e^{-\alpha x^2}\,dx=\sqrt{\frac{\pi}{\alpha}}$"),2Z),blue); asymptote-3.05/examples/near_earth.asy0000644000000000000000000000303615031566105016634 0ustar rootrootimport three; import math; texpreamble("\usepackage{bm}"); size(300,0); pen thickp=linewidth(0.5mm); real radius=0.8, lambda=37, aux=60; currentprojection=perspective(4,1,2); // Planes pen bg=gray(0.9)+opacity(0.5); draw(surface((1.2,0,0)--(1.2,0,1.2)--(0,0,1.2)--(0,0,0)--cycle),bg); draw(surface((0,1.2,0)--(0,1.2,1.2)--(0,0,1.2)--(0,0,0)--cycle),bg); draw(surface((1.2,0,0)--(1.2,1.2,0)--(0,1.2,0)--(0,0,0)--cycle),bg); real r=1.5; pen p=rgb(0,0.7,0); draw(Label("$x$",1),O--r*X,p,Arrow3); draw(Label("$y$",1),O--r*Y,p,Arrow3); draw(Label("$z$",1),O--r*Z,p,Arrow3); label("$\rm O$",(0,0,0),W); // Point Q triple pQ=radius*dir(lambda,aux); draw(O--radius*dir(90,aux),dashed); label("$\rm Q$",pQ,N+3*W); draw("$\lambda$",arc(O,0.15pQ,0.15*Z),N+0.3E); // Particle triple m=pQ-(0.26,-0.4,0.28); real width=5; dot("$m$",m,SE,linewidth(width)); draw("$\bm{\rho}$",(0,0,0)--m,Arrow3,PenMargin3(0,width)); draw("$\bm{r}$",pQ--m,Arrow3,PenMargin3(0,width)); // Spherical octant real r=sqrt(pQ.x^2+pQ.y^2); draw(arc((0,0,pQ.z),(r,0,pQ.z),(0,r,pQ.z)),dashed); draw(arc(O,radius*Z,radius*dir(90,aux)),dashed); draw(arc(O,radius*Z,radius*X),thickp); draw(arc(O,radius*Z,radius*Y),thickp); draw(arc(O,radius*X,radius*Y),thickp); // Moving axes triple i=dir(90+lambda,aux); triple k=unit(pQ); triple j=cross(k,i); draw(Label("$x$",1),pQ--pQ+0.2*i,2W,red,Arrow3); draw(Label("$y$",1),pQ--pQ+0.32*j,red,Arrow3); draw(Label("$z$",1),pQ--pQ+0.26*k,red,Arrow3); draw("$\bm{R}$",O--pQ,Arrow3,PenMargin3); draw("$\omega\bm{K}$",arc(0.9Z,0.2,90,-120,90,160,CW),1.2N,Arrow3); asymptote-3.05/examples/linearregression.asy0000644000000000000000000000356615031566105020107 0ustar rootrootimport graph3; import math; // for the leastsquares routine Billboard.targetsize = true; // Perspective should not affect the labels. currentprojection = perspective(60 * (5, 2, 3)); file duncan = input("linearregression.dat"); string headers = duncan; real[][] independentvars; real[] dependentvars; while (!eof(duncan)) { string line = duncan; string[] entries = split(line); if (entries.length < 5) continue; string type = entries[1]; real income = (real)(entries[2]); real education = (real)(entries[3]); real prestige = (real)(entries[4]); // include 1.0 for the residue independentvars.push(new real[] {income, education, 1.0}); dependentvars.push(prestige); } real[] coeffs = leastsquares(independentvars, dependentvars, warn=false); if (coeffs.length == 0) { abort("Unable to find regression: independent variables are " + "linearly dependent."); } real f(pair xy) { return coeffs[0] * xy.x // income + coeffs[1] * xy.y // education + coeffs[2]; // residue } real xmin = infinity, xmax = -infinity, ymin = infinity, ymax = -infinity; for (real[] row : independentvars) { if (row[0] < xmin) xmin = row[0]; if (row[0] > xmax) xmax = row[0]; if (row[1] < ymin) ymin = row[1]; if (row[1] > ymax) ymax = row[1]; } // Draw the plane draw(surface(f, (xmin, ymin), (xmax, ymax)), surfacepen=emissive(blue + opacity(0.6)), meshpen = blue); for (int ii = 0; ii < independentvars.length; ++ii) { triple pt = (independentvars[ii][0], independentvars[ii][1], dependentvars[ii]); draw(shift(pt) * unitsphere, material(yellow, emissivepen=0.2*yellow)); real z = f((pt.x, pt.y)); if (pt.z > z) draw (pt -- (pt.x, pt.y, z), green); else draw(pt -- (pt.x, pt.y, z), red); } xaxis3("income", Bounds(Min, Min), InTicks); yaxis3("education", Bounds(Min, Min), InTicks); zaxis3("prestige", Bounds(Min, Min), InTicks); asymptote-3.05/examples/sacone.asy0000644000000000000000000000067515031566105016002 0ustar rootrootsize(0,150); pair z0=(0,0); real r=1; real h=1; real l=sqrt(r^2+h^2); real a=(1-r/l)*360; real a1=a/2; real a2=360-a/2; path g=arc(z0,r,a1,a2); fill((0,0)--g--cycle,lightgreen); draw(g); pair z1=point(g,0); pair z2=point(g,length(g)); real r2=1.1*r; path c=arc(0,r2,a1,a2); draw("$2\pi r$",c,red,Arrows,Bars,PenMargins); pen edge=blue+0.5mm; draw("$\ell$",z0--z1,0.5*SE,edge); draw(z0--z2,edge); draw(arc(z0,r,a2-360,a1),grey+dashed); dot(0); asymptote-3.05/examples/Klein.asy0000644000000000000000000000251015031566105015562 0ustar rootrootimport graph3; size(469pt); currentprojection= perspective(camera=(25.0851928432063,-30.3337528952473,19.3728775115443), up=Z, target=(-0.590622314050054,0.692357205025578,-0.627122488455679), zoom=1,autoadjust=false); triple f(pair t) { real u=t.x; real v=t.y; real r=2-cos(u); real x=3*cos(u)*(1+sin(u))+r*cos(v)*(u < pi ? cos(u) : -1); real y=8*sin(u)+(u < pi ? r*sin(u)*cos(v) : 0); real z=r*sin(v); return (x,y,z); } surface s=surface(f,(0,0),(2pi,2pi),8,8,Spline); draw(s,lightolive+white,"bottle",render(merge=true)); string lo="$\displaystyle u\in[0,\pi]: \cases{x=3\cos u(1+\sin u)+(2-\cos u)\cos u\cos v,\cr y=8\sin u+(2-\cos u)\sin u\cos v,\cr z=(2-\cos u)\sin v.\cr}$"; string hi="$\displaystyle u\in[\pi,2\pi]:\\\cases{x=3\cos u(1+\sin u)-(2-\cos u)\cos v,\cr y=8\sin u,\cr z=(2-\cos u)\sin v.\cr}$"; real h=0.0125; begingroup3("parametrization"); draw(surface(xscale(-0.38)*yscale(-0.18)*lo,s,0,1.7,h,bottom=false), "[0,pi]"); draw(surface(xscale(0.26)*yscale(0.1)*rotate(90)*hi,s,4.9,1.4,h,bottom=false), "[pi,2pi]"); endgroup3(); begingroup3("boundary"); draw(s.uequals(0),blue+dashed); draw(s.uequals(pi),blue+dashed); endgroup3(); add(new void(frame f, transform3 t, picture pic, projection P) { draw(f,invert(box(min(f,P),max(f,P)),P),"frame"); }); asymptote-3.05/examples/sphericalharmonic.asy0000644000000000000000000000057015031566105020217 0ustar rootrootimport graph3; import palette; size(200); currentprojection=orthographic(4,2,4); currentlight=Viewport; real r(real theta, real phi) {return 1+0.5*(sin(2*theta)*sin(2*phi))^2;} triple f(pair z) {return r(z.x,z.y)*expi(z.x,z.y);} surface s=surface(f,(0,0),(pi,2pi),50,Spline); s.colors(palette(s.map(abs),Gradient(yellow,red))); draw(s,render(compression=Low,merge=true)); asymptote-3.05/examples/tvgen.asy0000644000000000000000000011733115031566105015653 0ustar rootroot/* tvgen - draw pm5544-like television test cards. * Copyright (C) 2007, 2009, 2012, Servaas Vandenberghe. * * The tvgen code below is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with tvgen: see the file COPYING. If not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * tvgen-1.2/tvgen.asy http://picaros.org/ftp/soft/tvgen-1.2.tgz * This asy script generates pm5544-like television test cards. The image * parameters were derived from a 1990 recording. The basic parameters * conform to itu-r bt.470, bt.601, and bt.709. There is no unique image * since local variants exist and parameters have varied over time. */ //papertype="a4"; import plain; int verbose=settings.verbose/*+2*/; /* uncomment for debug info */ /* tv dot coordinates --> PS points */ pair tvps(real col, real row, real xd, real yd, int Nv) { real psx, psy; psx=col*xd; psy=(Nv-row)*yd; return (psx,psy); } path tvrect(int lc, int tr, int rc, int br, real xd, real yd, int Nv) { real lx, ty, rx, by; pair[] z; lx=lc*xd; ty=(Nv-tr)*yd; rx=rc*xd; by=(Nv-br)*yd; /* bl br tr tl */ z[0]=(lx, by); z[1]=(rx, by); z[2]=(rx, ty); z[3]=(lx, ty); return z[0]--z[1]--z[2]--z[3]--cycle; } /********************* horizontal castellations ********************/ /* Draw a horizontal red line in the top left and the bottom right * castellation. These testlines disappear if the monitor is not set * in a dot-exact mode. An example is image crop due to overscan. * * For 625 line systems any analog-compatible processing removes * these red testlines since the first halfline of the odd field and * the last halfline of the even field are ignored. A full 576 * visible line frame often results via a final copy paste operation. */ void castelhor(int colortv, int[] rccoll, int[] rccolr, int cmaxi, int Nh, int topdist, int botdist, pen pdef, real xd, real yd, int Nv) { pen pblack, pwhite, pred; int i; pblack = pdef+gray(0.0); pwhite = pdef+gray(1.0); pred = pdef+rgb(0.75, 0, 0); /** top and bottom: white corners. **/ for (i=-1; i<=cmaxi; ++i) { pen pcast; int inext, lc, rc, tr, br; path zzc; inext = i+1; if (inext%2 == 0) { pcast = pwhite; } else { pcast = pblack; } if (i >= 0) { lc = rccolr[i]; } else { lc = 0; } if (inext <= cmaxi) { rc = rccoll[inext]; } else { rc = Nh; } if (i == 0 && colortv > 0 && topdist > 1) { path zzr; zzr = tvrect(lc,0, rc,1, xd,yd,Nv); fill(zzr, p=pred); tr = 1; } else { tr = 0; } zzc = tvrect(lc,tr, rc,topdist, xd,yd,Nv); fill(zzc, p=pcast); if (inext == cmaxi && colortv > 0 && botdist+1 < Nv) { path zzr; zzr = tvrect(lc,Nv-1, rc,Nv, xd,yd,Nv); fill(zzr, p=pred); br = Nv-1; } else { br = Nv; } zzc = tvrect(lc,botdist, rc,br, xd,yd,Nv); fill(zzc, p=pcast); } return; } /********************* vertical castellations ********************/ /* The bottom right red rectangle tests for a non causal color FIR * filter in the receiver. The last 2..4 dots then typically appear * colorless, green, or cyan. * * This stems from the fact that the chroma subcarrier is of lower * bandwidth than luma and thus continues after the last active sample. * These trailing (y,u,v) samples result from an abrupt signal to zero * transition and depend on the transmit and receive filters. Samples * from VHS, system B/G/D/K, system I, or a DVD player output are * different. Nevertheless, a sharpening filter uses this data and so * adds false color to the last dots. */ void castelver(int colortv, int leftdist, int rightdist, int Nh, int[] rcrowb, int[] rcrowt, int rmaxi, pen pdef, real xd, real yd, int Nv) { pen pblack, pwhite; int i; pblack = pdef+gray(0.0); pwhite = pdef+gray(1.0); for (i=0; i0) { pcastr = pdef+rgb(0.75,0.0,0); } else { pcastr = pcastl; } tr=rcrowb[i]; br=rcrowt[i+1]; zzc=tvrect( 0,tr, leftdist,br, xd,yd,Nv); fill(zzc, p=pcastl); zzc=tvrect(rightdist,tr, Nh,br, xd,yd,Nv); fill(zzc, p=pcastr); } return; } /********************* image aspect ratio markers ********************/ void rimarkers(real rimage, int Nh, int Nhc, int os, int Nvc, int Nsy, pen pdef, real xd, real yd, int Nv) { int[] ridefN={ 4, 16 }; int[] ridefD={ 3, 9 }; int i; for (i=0; i<2; ++i) { real rid=ridefN[i]/ridefD[i]; if (rimage>rid) { int off, offa, offb; /* Nhdef=Nh*rid/rimage */ off=round(Nh*rid/rimage/2); offa=off+os; offb=off-os; // write(offa,offb); if (2*offa 0) { /* black, vertical gridlines redrawn below */ pair[] z; int col; z[0]=rcright[divsy]; col = rccolc[divsx+1]; z[1]=tvps(col,rcrowc[divsy], xd,yd,Nv); z[2]=tvps(col,rcrowc[divsy-1], xd,yd,Nv); col = rccolc[divsx]; z[3]=tvps(col,rcrowc[divsy-1], xd,yd,Nv); z[4]=tvps(col,rcrowc[divsy], xd,yd,Nv); z[5]=rcleft[divsy]; z[6]=rcleft[divsy+1]; z[7]=tvps(col,rcrowc[divsy+1], xd,yd,Nv); z[8]=tvps(col,rcrowc[divsy+2], xd,yd,Nv); col = rccolc[divsx+1]; z[9]=tvps(col,rcrowc[divsy+2], xd,yd,Nv); z[10]=tvps(col,rcrowc[divsy+1], xd,yd,Nv); z[11]=rcright[divsy+1]; fill(z[1]--z[2]--z[3]--z[4] //--z[5]--z[6] --arc(ccenter, z[5], z[6]) --z[7]--z[8]--z[9]--z[10] //--z[11]--z[0] --arc(ccenter,z[11], z[0]) --cycle, p=pblack); } else { /* 3 rows of black squares inside the gratings */ int i, imax = divsy+1; for (i=divsy-1; i<=imax; ++i) { /* all 3 rows */ int lmaxoff, lmincol, lmaxcol; int inext = i+1; int tr, br, j; /* XXX rcoff is relative to ccenter */ lmaxoff = min(floor(rcoff[i]), floor(rcoff[inext])); lmincol = Nhc-lmaxoff; lmaxcol = Nhc+lmaxoff; /* square top and bottom */ tr = rcrowb[i]; br = rcrowt[inext]; for (j=0; j 1) { write("centerline long : rows tr br ", rows, tr, br); } zz=tvrect(Nhc-os, tr, Nhc+os, br, xd,yd,Nv); fill(zz, p=pwhite); zz=tvrect(Nhc-maxoff,Nvc-1, Nhc+maxoff,Nvc+1, xd,yd,Nv); fill(zz, p=pwhite); /* vertical short lines */ rows=min(Nvc-rcrowc[divsy], rcrowc[divsy+1]-Nvc); tr=Nvc-rows; br=Nvc+rows; if (verbose > 1) { write("centerline short: rows tr br ", rows, tr, br); } if (colortv > 0) { int i; for (i=0; i<=cmaxi; ++i) { int coll, colr; coll=rccoll[i]; colr=rccolr[i]; if (mincol<=coll && colr<=maxcol) { path zzv; zzv=tvrect(coll, tr, colr, br, xd,yd,Nv); fill(zzv, p=pwhite); } } } return; } /************************ topbw **************************************/ void topbw(int[] coff, int Nhc, int os, int urow, int trow, int brow, pair ccenter, pair rclt, pair rclb, pair rcrt, pair rcrb, pen pdef, real xd, real yd, int Nv) { pen pblack=pdef+gray(0.0), pwhite=pdef+gray(1.0); pair[] ze; path zext, zref, zint; int off, col, cr; off=ceil((coff[2]+coff[3])/2); ze[0]=tvps(Nhc+off,trow, xd,yd,Nv); ze[1]=rcrt; ze[2]=rclt; ze[3]=tvps(Nhc-off,trow, xd,yd,Nv); ze[4]=tvps(Nhc-off,brow, xd,yd,Nv); col=Nhc-coff[2]-os; ze[5]=tvps(col,brow, xd,yd,Nv); ze[6]=tvps(col,trow, xd,yd,Nv); cr=col+3*os; /* reflection test black pulse */ zref=tvrect(col,trow, cr,brow, xd,yd,Nv); ze[7]=tvps(cr,trow, xd,yd,Nv); ze[8]=tvps(cr,brow, xd,yd,Nv); ze[9]=tvps(Nhc+off,brow, xd,yd,Nv); //dot(ze); zext=ze[0] // --ze[1]--ze[2] --arc(ccenter, ze[1], ze[2]) --ze[3]--ze[4]--ze[5]--ze[6]--ze[7]--ze[8]--ze[9]--cycle; off=ceil((coff[1]+coff[2])/2); zint=tvrect(Nhc-off,urow, Nhc+off,trow, xd,yd,Nv); /* paths are completely resolved; no free endpoint conditions */ fill(zext^^reverse(zint), p=pwhite); fill(zint, p=pblack); fill(zref, p=pblack); fill(arc(ccenter,rclt,rclb)--ze[4]--ze[3]--cycle, p=pblack); fill(arc(ccenter,rcrb,rcrt)--ze[0]--ze[9]--cycle, p=pblack); return; } /************************ testtone **************************************/ /* x on circle -> return y>=0 * in: * x x-coordinate relative to origin * crad circle radius in y units, true size=crad*yd */ real testcircx(real x, real crad, real xd, real yd) { real relx, ph, y; relx=x*xd/yd/crad; if (relx>1) { ph=0; } else { ph=acos(relx); } y=crad*sin(ph); // or (x*xd)^2+(y*yd)^2=(crad*yd)^2 return y; } /* y on circle -> return x>=0 */ real testcircy(real y, real crad, real xd, real yd) { real rely, ph, x; rely=y/crad; if (rely>1) { ph=pi/2; } else { ph=asin(rely); } x=crad*cos(ph)*yd/xd; // or (x*xd)^2+(y*yd)^2=(crad*yd)^2 return x; } /* brow>trow && xb>xt */ void testtone(real Tt, int trow, int brow, real ccol, real crow, real crad, pen pdef, real xd, real yd, int Nv) { int blocks, i; real yt, xt, yb, xb, Ttt=Tt/2; pair ccenter; yt=crow-trow; xt=testcircy(yt, crad, xd, yd); yb=crow-brow; xb=testcircy(yb, crad, xd, yd); //write('#xt yt\t',xt,yt); write('#xb yb\t',xb,yb); ccenter=tvps(ccol,crow, xd,yd,Nv); blocks=floor(2*xb/Tt); for (i=-blocks-1; i<=blocks; ++i) { real tl, tr; path zz; tl=max(-xb,min(i*Ttt,xb)); /* limit [-xb..xb] */ tr=max(-xb,min((i+1)*Ttt,xb)); if (tl<-xt && tr<=-xt || tr>xt && tl>=xt) { /* top full circle */ pair[] z; real yl, yr; yl=testcircx(tl, crad, xd, yd); yr=testcircx(tr, crad, xd, yd); z[0]=tvps(ccol+tl,brow, xd,yd,Nv); z[1]=tvps(ccol+tr,brow, xd,yd,Nv); z[2]=tvps(ccol+tr,crow-yr, xd,yd,Nv); z[3]=tvps(ccol+tl,crow-yl, xd,yd,Nv); zz=z[0]--z[1]--arc(ccenter,z[2],z[3])--cycle; } else if(tl<-xt) { /* tl in circel, tr not, partial */ pair[] z; real yl; yl=testcircx(tl, crad, xd, yd); z[0]=tvps(ccol+tl,brow, xd,yd,Nv); z[1]=tvps(ccol+tr,brow, xd,yd,Nv); z[2]=tvps(ccol+tr,trow, xd,yd,Nv); z[3]=tvps(ccol-xt,trow, xd,yd,Nv); z[4]=tvps(ccol+tl,crow-yl, xd,yd,Nv); zz=z[0]--z[1]--z[2]--arc(ccenter,z[3],z[4])--cycle; } else if(tr>xt) { /* tr in circle, tl not, partial */ pair[] z; real yr; yr=testcircx(tr, crad, xd, yd); z[0]=tvps(ccol+tl,brow, xd,yd,Nv); z[1]=tvps(ccol+tr,brow, xd,yd,Nv); z[2]=tvps(ccol+tr,crow-yr, xd,yd,Nv); z[3]=tvps(ccol+xt,trow, xd,yd,Nv); z[4]=tvps(ccol+tl,trow, xd,yd,Nv); zz=z[0]--z[1]--arc(ccenter,z[2],z[3])--z[4]--cycle; } else { /* full block */ pair[] z; z[0]=tvps(ccol+tr,trow, xd,yd,Nv); z[1]=tvps(ccol+tl,trow, xd,yd,Nv); z[2]=tvps(ccol+tl,brow, xd,yd,Nv); z[3]=tvps(ccol+tr,brow, xd,yd,Nv); zz=z[0]--z[1]--z[2]--z[3]--cycle; } if (tl1) { thetaret=0; } else { real dpi=2*pi; cycles-=coverflow*sgn(cycles); thetaret=theta+cycles*dpi; /* cycles=(-1 .. 1) */ if (thetaret>pi) { thetaret-=dpi; } else if (thetaret<-pi) { thetaret-=dpi; } } //write("addphase: ", step, theta, thetaret); return thetaret; } void testfreqs(real[] ftones, int[] coff, int Nhc, int trow,int crow,int brow, pair ccenter, pair rclt, pair rclb, pair rcrt, pair rcrb, pen pdef, real xd, real yd, int Nv) { int[] divc; real[] divfl, divfr; int i, divs, coffmax, off, divnext; real fl, fr, thr, thl; /* Segment info for PAL continental test card * segment i extends from (divc[i] .. divc[i+1]) with frequency divf[i] */ divs=2; // the number of segments to the right, total=2*divs+1 divc[0]=0; for (i=0; i<=divs; ++i) { int ii=i*2, il=divs-i, ir=divs+i; divc[i+1]=ceil((coff[ii]+coff[ii+1])/2); /* xdot distance to center */ divfl[i]=ftones[divs-i]; divfr[i]=ftones[divs+i]; } coffmax=divc[divs+1]; int trowlim=coff[0]; int tr; tr=crow; divnext=0; fl=0; fr=0; thl=0; /* ={ 0, -pi/2 } : initial angle at center vertical line Nhc */ thr=thl; /* draw a vertical line at off..off+1, use theta for off+1/2 */ for (off=0; off0) { if (verbose > 1) write("right ears"); cy=cyr; cu=cur; cv=cvr; } else { if (verbose > 1) write("left ears"); cy=cyl; cu=cul; cv=cvl; } lcol=Nhc+dright*coffa[5]; ccol=Nhc+dright*coff[6]; cicol=Nhc+dright*coffa[6]; rcol=Nhc+dright*coffb[7]; int urow, trow, crow, brow, arow; urow=rcrowb[divsy-5]; trow=rcrowt[divsy-3]; crow=Nvc; brow=rcrowb[divsy+4]; arow=rcrowt[divsy+6]; z[0]=tvps(ccol,urow, xd,yd,Nv); z[1]=tvps(ccol,trow, xd,yd,Nv); z[2]=tvps(cicol,trow, xd,yd,Nv); z[3]=tvps(cicol,crow, xd,yd,Nv); z[4]=tvps(rcol,crow, xd,yd,Nv); z[5]=tvps(rcol,urow, xd,yd,Nv); zz[0]=z[0]--z[1]--z[2]--z[3]--z[4]--z[5]--cycle; zz[1]=tvrect(lcol,urow, ccol,trow, xd,yd,Nv); zz[2]=tvrect(lcol,brow, ccol,arow, xd,yd,Nv); z[0]=tvps(ccol,arow, xd,yd,Nv); z[1]=tvps(ccol,brow, xd,yd,Nv); z[2]=tvps(cicol,brow, xd,yd,Nv); z[3]=tvps(cicol,crow, xd,yd,Nv); z[4]=tvps(rcol,crow, xd,yd,Nv); z[5]=tvps(rcol,arow, xd,yd,Nv); zz[3]=z[0]--z[1]--z[2]--z[3]--z[4]--z[5]--cycle; for (i=0; i<4; ++i) { real y, u, v, A, ph, By, Ry, Gy, R, G, B; y=cy[i]; u=cu[i]; v=cv[i]; A=hypot(u,v); ph= (u!=0 || v!=0) ? atan2(v,u) : 0.0; if (v>=0) { if (ph<0) ph=ph+pi; } else { if (ph>0) ph=ph-pi; } if (A>0) { u=u/A*cI; v=v/A*cI; } By=u/wu; Ry=v/wv; Gy=(-wr*Ry-wb*By)/wg; //write(y,Gy,A,ph*180/pi); R=Ry+y; G=Gy+y; B=By+y; if (verbose > 1) write(y*1000, round(R*1000), round(G*1000), round(B*1000)); fill(zz[i], p=pdef+rgb(R,G,B)); } return; } /****************************** NTSC bars ***********************************/ /* amplitude equals color burst smpte (pm: -V +U) * y campl sat R G B * left 0.5 0.21 70% -I? * right 0.5 0.17 60% +Q? */ void ntscbars(int[] rccoll, int[] rccolr, int divsx, int[] rcrowt, int[] rcrowb, int divsy, int dright, pen pdef, real xd, real yd, int Nv) { /* The amplitude of (i,q) as seen on a vectorscope, * max 0.292 Vn for 100% saturation in I==0 ears. * burst: 0.143 Vcvbs, 20 IRE or 0.200 V normalized. * pedestal: (yp,up,vp)=(p,0,0)+(1-p)*(y,u,v), p=0.075. * choice: equal amplitude for colorburst and subcarrier. */ real campl=0.200/0.925; /* wg=0.587, y=wr*R+wg*G+wb*B */ real wr=0.299, wb=0.114, wg=1-wr-wb; /* iT : iq -> RyBy : rotation+scaling */ real iT11=0.95, iT12=0.62, iT21=-1.11, iT22=1.71; /* bars -2 -1 0 1 2 */ real[] cyl={ 0.50, 0.50, 1, 0.50, 0.50 }; real[] cil={ 0, 0, 0, -1, 1 }; real[] cql={ -1, 1, 0, 0, 0 }; int[] indl={ -7, -8, 0, 8, 7 }; real cy, ci, cq; int rmaxi, dri, ind, ibase, lcol, rcol, i; rmaxi=2*divsy+1; if (dright<-2 || dright>2) { dri=2; } else { dri=2+dright; } cy=cyl[dri]; ci=cil[dri]; cq=cql[dri]; ind=indl[dri]; ibase=divsx+ind; lcol=rccolr[ibase]; rcol=rccoll[ibase+1]; real A, By, Ry, Gy, R, G, B; A=hypot(ci,cq); if (A>0) { ci=ci/A*campl; cq=cq/A*campl; } Ry=iT11*ci+iT12*cq; By=iT21*ci+iT22*cq; Gy=(-wr*Ry-wb*By)/wg; //write(cy,Ry,Gy,By); R=Ry+cy; G=Gy+cy; B=By+cy; if (verbose > 1) write(ind, cy*1000, round(ci*1000), round(cq*1000), round(R*1000), round(G*1000), round(B*1000)); for (i=0; i0) { trow=rcrowb[i]; } else { trow=floor((rcrowb[i]+rcrowt[inext])/2); } if (inext768 rerastering * 16 720->768 rerastering */ access settings; usersetting(); if (bsys<0 || bsys>12 || colortv<0 || colortv>3 || os<=0 || os>16) { write("Error: bad user input: bsys, colortv, os=\t", bsys, colortv, os); abort("Bad option -u bsys=N ?"); } int[] bNdot= { 12, 16, 12, 16, 1, 1, 1, 64, 10, 8, 10, 1, 1 }; int[] bDdot= { 11, 15, 11, 11, 1, 1, 1, 45, 11, 9, 11, 1, 1 }; int[] bNh= { 704, 720, 720, 720, 768, 768, 786, 720, 704, 720, 720, 1920, 1600 }; int[] bNv= { 576, 576, 576, 576, 576, 576, 576, 576, 480, 480, 480, 1080, 1200 }; real[] bfs= { 13.5,13.5,13.5,13.5, 14.75,14.4,14.75,13.5, 13.5,13.5,13.5, 36, 30 }; int[] bNsy= { 42, 42, 42, 42, 42, 42, 42, 42, 34, 34, 34, 78, 90 }; int[] bNsh= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* active lines for a 625 line frame * The number of active video lines decreased around 1997. * old: 3 run in + 575 visible + 3 run out = 581 lines * new: 6 teletext and WSS + 575 visible * Hence the image center shifted down by 3 lines. Thus * old TV + new testcard = bottom is cut off, * new TV + old testcard = top is cut off. * * To generate the old testcard either use Nv=582 Nsh=0 or Nv=576 Nsh=3. * * aspect ratio * rimage=xsize/ysize rimage=rdot*Nh/Nv * Nh=704 dots * Nv=576 lines * rd=ri*Nv/Nh=4/3*9/11=12/11 * * Nv: 480=2^5*3*5 576=2^6*3^2 * Nh: 704=2^6*11 720=2^4*3^2*5 * * horizontal line distance for pre 1997 test pattern * top 8 lines, 13 squares of Ny=43 lines, bottom 9 lines * top 12 lines, 13 squares of Ny=42 lines, bottom 18 lines * pairs are from odd even field * Interlace test: Ny must be odd for a cross-hatch without centerline. * * squares: ly=Nsy, lx=rd*Nsx, lx=ly ==> Nsx=Nsy/rd={ 39.4, 38.5 } * x line width 230 ns -> 3 dots * bottom 2.9us red -> 39.15 dots * * resolution DPI from image aspect ratio * Rv=Nv/ly, ly=4in * ri=Ni/Di, Ni={ 4, 15, 16} Di={ 3, 11, 9} * lx=ri*ly * * Rh=Nh/lx=Di*(Nh/(Ni*ly)) * integer Rh: * Ni=4 ri=4/Di => Nh=k*16 * Ni=15 ri=15/Di => Nh=k*60 * Ni=16 ri=16/Di => Nh=k*64 * * resolution DPI from dot aspect ratio, general algorithm, * * rd=Nd/Dd=ldx/ldy * * assume 1 dot = Nd x Dd square subdots at a resolution of k, in dpi, then * * ldx=Nd/k, ldy=Dd/k ==> Rh=k/Nd, Rv=k/Dd * * choosing k=m*Nd*Dd for integer Rh and Rv gives * * ldx=1/(m*Dd), ldy=1/(m*Nd), Rh=m*Dd, Rv=m*Nd * * and * * lx=Nh*ldx=Nh/(m*Dd), ly=Nv*ldy=Nv/(m*Nd) * * so choose m for the intended height Ly, in inch, as * * m=round(Nv/(Ly*Nd)) * * which limits Ly<=Nv/Nd since Rv>=Nd. */ //cm=72/2.540005; real Ly, ly, lx, ysize, xsize, rimage, xd, yd, pwidth; int Nd, Dd, m, Nh, Nv, Nshift, Na, Nsy; real fs, Ttone; Nd=bNdot[bsys]; Dd=bDdot[bsys]*os; Nh=bNh[bsys]*os; Nv=bNv[bsys]; Ly=4; // 4 inch vertical size m=floor(0.5+Nv/(Ly*Nd)); if (m < 1) m=1; ly=Nv/(m*Nd); lx=Nh/(m*Dd); ysize=ly*1inch; xsize=lx*1inch; rimage=xsize/ysize; if (verbose > 1) { write("#Nd Dd m ri:\t", Nd, Dd, m, rimage); } //size(xsize, ysize, Aspect); // should not have any effect Nsy=bNsy[bsys]; // grating size in lines 42,43 or 34,35 Nshift=bNsh[bsys]; // shift image up: pre 1997 =3, 2007 =0 fs=1e6*bfs[bsys]*os; Na=0; // add 1,0,-1 to height of hor center squares for even Na+Nsy Ttone=fs/250e3; // period of ft=250 kHz, fs/ft=54 real[] ftones={0.8e6/fs, 1.8e6/fs, 2.8e6/fs, 3.8e6/fs, 4.8e6/fs}; xd=xsize/Nh; yd=ysize/Nv; pwidth=min(abs(xd),abs(yd)); pen pdefault = squarecap+linewidth(pwidth); pen pblack = pdefault+gray(0.0); pen pwhite = pdefault+gray(1.0); /**** calculate grating repeats and size in tv dots ****/ /* horizontal lines */ int divsy, rdisty, Nvc, Nt, Nb, rmaxi; Nvc=floor(Nv/2)-Nshift; /* top half picture (Nv-2)/2-(Nsy+Na)/2 dots for divisions of Nsy dots */ divsy=floor(((Nv-2-Na)/Nsy-1)/2); rdisty=Na+Nsy*(1+2*divsy); /* first guess free lines top and bottom */ Nt=Nvc-ceil(rdisty/2); Nb=Nv-Nt-rdisty; if (verbose > 1) { write('#divsy t b: \t', divsy, Nt, Nb); } rmaxi=2*divsy+1; /* Nsyc: center square height * line pairing test: verify distance of center to top and bot * distance is odd ==> top=even/odd, cent=odd/even, bot=even/odd * * Nsyc odd: not possible * * Nsyc even: * Nsyc/2 odd --> OK * Nsyc/2 even --> stagger the raster one line upwards * * rcrowt top dist of hor line * rcrowc true center for color info, distance to top of image. * rcrowb bot dist of hor line * * offd = offu-Nsyc * Nt = Nvc-(offu+divsy*Nsy); * Nb = Nv-( Nvc-(offd-divsy*Nsy) ); * ==> Nt+Nb = Nv-Nsyc-2*divsy*Nsy */ int Nsyc, offu, offd, Nyst=0, i; int[] rcrowt, rcrowc, rcrowb; Nsyc=Nsy+Na; offu=floor(Nsyc/2); offd=offu-Nsyc; if (Nsyc%2 != 0) { Nyst=1; } else if (Nsyc%4 == 0) { Nyst=1; /* stagger */ } for (i=0; i<=divsy; ++i) { int iu, id, ou, od, ru, rd; iu=divsy-i; id=divsy+i+1; ou=offu+Nsy*i; od=offd-Nsy*i; if (verbose > 1) { write(ou,od); } rcrowc[iu]=Nvc-ou; rcrowc[id]=Nvc-od; ru=Nvc-(ou+Nyst); rd=Nvc-(od+Nyst); rcrowt[iu]=ru-1; rcrowb[iu]=ru+1; rcrowt[id]=rd-1; rcrowb[id]=rd+1; } Nt=floor((rcrowt[0]+rcrowb[0])/2); Nb=Nv-Nt-Nsyc-2*Nsy*divsy; if (verbose > 1) { write('#st t b: \t', Nyst, Nt, Nb); } /* vertical lines * (Nh-2*os)/2-Nsx/2 dots available for divisions of Nsx dots. * At least 5 dots margin left and right ==> use -10*os */ real lsq, Nsx, rdistx; int divsx, Nhc, Nl, Nr, cmaxi; lsq=Nsy*yd; Nsx=lsq/xd; /* floating point */ divsx=floor(((Nh-10*os)/Nsx-1)/2); Nhc=round(Nh/2); rdistx=(1+2*divsx)*Nsx; Nl=Nhc-round(rdistx/2); if (verbose > 1) { write('#divsx Nsx l:\t', divsx, Nsx, Nl); } cmaxi=2*divsx+1; int[] coff, coffl, coffr; int[] rccoll, rccolc, rccolr; for (i=0; i<=divsx; ++i) { int off, offl, offr, il, ir; real cdist; cdist=Nsx*(1+2*i); /* horizontal distance 2 symmetrical vert lines */ off=round(cdist/2); // write(cdist, off); offl=off-os; offr=off+os; coff[i]=off; coffl[i]=offl; coffr[i]=offr; if (verbose > 1) { write(cdist, off); } il=divsx-i; ir=divsx+i+1; rccoll[il]=Nhc-offr; rccolc[il]=Nhc-off; rccolr[il]=Nhc-offl; rccoll[ir]=Nhc+offl; rccolc[ir]=Nhc+off; rccolr[ir]=Nhc+offr; } Nl=rccolc[0]; Nr=Nh-rccolc[cmaxi]; if (verbose > 1) { write('#divsx Nsx l r:\t', divsx, Nsx, Nl, Nr); } /**** draw gray background ****/ { path zz; //zz=tvrect(0,0, Nh,Nv, xd,yd,Nv); /* keep white canvas for castellations */ zz=tvrect(rccoll[0],rcrowt[0], rccolr[cmaxi],rcrowb[rmaxi], xd,yd,Nv); fill(zz, p=pdefault+gray(0.5)); //dot(zz); } /**** draw center circle ****/ real cx, cy, crad; pair ccenter; path ccirc; cx=Nh/2; cy=Nv/2-Nshift; crad=6*Nsy; if (Nv%2 != 0) { crad+=0.5; } ccenter=tvps(cx,cy, xd,yd,Nv); ccirc=circle(ccenter, crad*yd); if (colortv<=0) { draw(ccirc, p=pwhite+linewidth(2*yd)); } /**** draw 2*divsy+2 horizontal gridlines ****/ real[] rcang, rcoff; pair[] rcright, rcleft; int i; for (i=0; i<=rmaxi; ++i) { real y, ph, x; path zzh; pair zd; zzh=tvrect(0,rcrowt[i], Nh,rcrowb[i], xd,yd,Nv); fill(zzh, p=pwhite); y=cy-rcrowc[i]; if (abs(y)4/3) { rimarkers(rimage, Nh, Nhc, os, Nvc, Nsy, pwhite, xd, yd, Nv); } /****** line pairing center ******/ centerline(colortv, rccoll, rccolc, rccolr, divsx, Nhc, os, rcrowt, rcrowc, rcrowb, divsy, Nvc, ccenter, rcoff, rcright, rcleft, pdefault, xd, yd, Nv); if (colortv>0) { /* topbw structure */ topbw(coff, Nhc, os, rcrowc[divsy-5], rcrowc[divsy-4], rcrowc[divsy-3], ccenter, rcleft[divsy-4], rcleft[divsy-3], rcright[divsy-4], rcright[divsy-3], pdefault, xd, yd, Nv); /* 250 kHz */ testtone(Ttone, rcrowc[divsy-3], rcrowc[divsy-2], cx, cy, crad, pdefault, xd, yd, Nv); /* color bars */ colorbars(coff, Nhc, rcrowc[divsy-2], rcrowc[divsy-1], rcrowc[divsy], ccenter, rcleft[divsy-2], rcleft[divsy], rcright[divsy-2], rcright[divsy], pdefault, xd, yd, Nv); /* test frequencies */ testfreqs(ftones, coff, Nhc, rcrowc[divsy+1], rcrowc[divsy+2], rcrowc[divsy+3], ccenter, rcleft[divsy+1], rcleft[divsy+3], rcright[divsy+1],rcright[divsy+3], pdefault, xd, yd, Nv); /* gray bars */ graybars(coff, Nhc, rcrowc[divsy+3], rcrowc[divsy+4], ccenter, rcleft[divsy+3], rcleft[divsy+4], rcright[divsy+3], rcright[divsy+4], pdefault, xd,yd,Nv); /* PAL ears */ if (colortv == 1) { palears(coff,coffr,coffl, Nhc, rcrowt, rcrowb, Nvc, divsy, -1, pdefault, xd, yd, Nv); palears(coff,coffr,coffl, Nhc, rcrowt, rcrowb, Nvc, divsy, 1, pdefault, xd, yd, Nv); } else if (colortv == 2) { ntscbars(rccoll, rccolr, divsx, rcrowt, rcrowb, divsy, -1, pdefault, xd, yd, Nv); ntscbars(rccoll, rccolr, divsx, rcrowt, rcrowb, divsy, 1, pdefault, xd, yd, Nv); ntscbars(rccoll, rccolr, divsx, rcrowt, rcrowb, divsy, -2, pdefault, xd, yd, Nv); ntscbars(rccoll, rccolr, divsx, rcrowt, rcrowb, divsy, 2, pdefault, xd, yd, Nv); } /* bottom wh - black - wh */ bottombw(round((coff[2]+coff[3])/2), Nhc, rcrowc[divsy+4], rcrowc[divsy+5], ccenter, rcleft[divsy+4], rcleft[divsy+5], rcright[divsy+4], rcright[divsy+5], pdefault, xd, yd, Nv); /* bottom yellow red circle */ bottomcirc(coff[0], Nhc, rcrowc[divsy+5], cx, cy, crad, ccenter, rcleft[divsy+5], rcright[divsy+5], pdefault, xd, yd, Nv); } /********************** set id *********************/ { /* dpi */ pair rpos=tvps(Nhc,round((rcrowc[divsy-4]+rcrowc[divsy-5])/2), xd,yd,Nv); string iRhor, iRver, ires; real Rh, Rv; Rh=Nh/xsize*inch; Rv=Nv/ysize*inch; iRhor=format("%.4gx", Rh); iRver=format("%.4gdpi", Rv); ires=insert(iRver,0, iRhor); /* size info */ int rowbot=round((rcrowc[divsy+4]+rcrowc[divsy+5])/2); pair tpos=tvps(Nhc,rowbot, xd,yd,Nv); string ihor, iver, itot, iasp, ifm; real asp, fm; ihor=format("%ix",Nh); iver=format("%i ",Nv); itot=insert(iver,0, ihor); asp=xsize/ysize; iasp=format("%.3g ",asp); fm=fs/1e6; ifm=format("%.4gMHz",fm); itot=insert(iasp,0, itot); itot=insert(ifm,0, itot); /* size of square */ int rowNsy, colNsy; pair Npos; string iNsy; pen pbw; rowNsy = round((rcrowc[divsy+5]+rcrowc[divsy+6])/2); colNsy = round((rccolc[divsx+5]+rccolc[divsx+6])/2); Npos = tvps(colNsy,rowNsy, xd,yd,Nv); iNsy = format("%i", Nsy); if (colortv>0) { pbw=pdefault+gray(1.0); } else { pbw=pdefault+gray(0.0); } label(ires, rpos, p=pbw); label(itot, tpos, p=pbw); label(iNsy, Npos, p=pbw); if (verbose > 1) write('#res:\t', ires, itot, iNsy); } asymptote-3.05/examples/magnetic.asy0000644000000000000000000000073715031566105016320 0ustar rootrootimport graph3; import contour3; size(200,0); currentprojection=orthographic((6,8,2),up=Y); real a(real z) {return (z < 6) ? 1 : exp((abs(z)-6)/4);} real b(real z) {return 1/a(z);} real B(real z) {return 1-0.5cos(pi*z/10);} real f(real x, real y, real z) {return 0.5B(z)*(a(z)*x^2+b(z)*y^2)-1;} draw(surface(contour3(f,(-2,-2,-10),(2,2,10),10)),blue+opacity(0.75), render(merge=true)); xaxis3(Label("$x$",1),red); yaxis3(Label("$y$",1),red); zaxis3(Label("$z$",1),red); asymptote-3.05/examples/grid.asy0000644000000000000000000000011415031566105015443 0ustar rootrootimport math; size(100,0); add(shift(-5,-5)*grid(10,10)); dot((0,0),red); asymptote-3.05/examples/tanh.asy0000644000000000000000000000030615031566105015453 0ustar rootrootimport graph; size(100,0); real f(real x) {return tanh(x);} pair F(real x) {return (x,f(x));} xaxis("$x$"); yaxis("$y$"); draw(graph(f,-2.5,2.5,operator ..)); label("$\tanh x$",F(1.5),1.25*N); asymptote-3.05/examples/spectrum.asy0000644000000000000000000000447215031566105016373 0ustar rootrootimport graph; usepackage("ocgx2"); settings.tex="pdflatex"; // Dan Bruton algorithm pen nm2rgb(real wl, real gamma=0.8, bool intensity=true) { triple rgb; if(wl >= 380 && wl <= 440) {rgb=((440-wl)/60,0,1);} if(wl > 440 && wl <= 490) {rgb=(0,(wl-440)/50,1);} if(wl > 490 && wl <= 510) {rgb=(0,1,(510-wl)/20);} if(wl > 510 && wl <= 580) {rgb=((wl-510)/70,1,0);} if(wl > 580 && wl <= 645) {rgb=(1,(645-wl)/65,0);} if(wl > 645 && wl <= 780) {rgb=(1,0,0);} real Intensity=1; if(intensity) { if(wl >= 700) {Intensity=0.3+0.7*(780-wl)/80;} else if(wl <= 420) {Intensity=0.3+0.7*(wl-380)/40;} } return rgb((Intensity*rgb.x)**gamma,(Intensity*rgb.y)**gamma, (Intensity*rgb.z)**gamma); } real width=1; real height=50; begin("spectrum"); for(real i=380 ; i <= 780 ; i += width) { draw((i,0)--(i,height),width+nm2rgb(wl=i,false)+squarecap); } begin("Extinction",false); // nested for(real i=380 ; i <= 780 ; i += width) { draw((i,0)--(i,height),width+nm2rgb(wl=i,true)+squarecap); } end(); end(); begin("Wavelength"); xaxis(scale(0.5)*"$\lambda$(nm)",BottomTop,380,780, RightTicks(scale(0.5)*rotate(90)*Label(),step=2,Step=10),above=true); end(); // From Astronomical Data Center(NASA) // Neutral only real[] Na={423.899, 424.208, 427.364, 427.679, 428.784, 429.101, 432.14, 432.462, 434.149, 434.474, 439.003, 439.334, 441.989, 442.325, 449.418, 449.766, 454.163, 454.519, 568.2633, 568.8204, 588.995, 589.5924}; begin("Na absorption"); for(int i=0; i < Na.length; ++i) { draw((Na[i],0)--(Na[i],height),0.1*width+squarecap); } end(); begin("Na emission"); for(int i=0; i < Na.length; ++i) { draw((Na[i],0)--(Na[i],-height),0.1*width+nm2rgb(Na[i],false)+squarecap); } end(); // Neutral only real[] Zn={388.334, 396.543, 411.321, 429.288, 429.833, 462.981, 468.014, 472.215, 481.053 , 506.866, 506.958, 518.198, 530.865, 531.024, 531.102, 577.21, 577.55, 577.711, 623.79, 623.917, 636.234, 647.918, 692.832, 693.847, 694.32, 779.936}; begin("Zn absorption",false); for(int i=0; i < Zn.length; ++i) { draw((Zn[i],0)--(Zn[i],height),width+squarecap); } end(); begin("Zn emission",false); for(int i=0; i < Zn.length; ++i) { draw((Zn[i],0)--(Zn[i],-height),width+nm2rgb(Zn[i],false)+squarecap); } end(); shipout(bbox(2mm,Fill(white))); asymptote-3.05/examples/centroidfg.asy0000644000000000000000000000126015031566105016645 0ustar rootrootimport graph; size(0,150); int a=-1, b=1; real f(real x) {return x^3-x+2;} real g(real x) {return x^2;} draw(graph(f,a,b,operator ..),red); draw(graph(g,a,b,operator ..),blue); xaxis(); int n=5; real width=(b-a)/(real) n; for(int i=0; i <= n; ++i) { real x=a+width*i; draw((x,g(x))--(x,f(x))); } labelx("$a$",a); labelx("$b$",b); draw((a,0)--(a,g(a)),dotted); draw((b,0)--(b,g(b)),dotted); real m=a+0.73*(b-a); arrow("$f(x)$",(m,f(m)),N,red); arrow("$g(x)$",(m,g(m)),E,0.8cm,blue); int j=2; real xi=b-j*width; real xp=xi+width; real xm=0.5*(xi+xp); pair dot=(xm,0.5*(f(xm)+g(xm))); dot(dot,darkgreen+4.0); arrow("$\left(x,\frac{f(x)+g(x)}{2}\right)$",dot,NE,2cm,darkgreen); asymptote-3.05/examples/shellmethod.asy0000644000000000000000000000205115031566105017030 0ustar rootrootimport graph3; import solids; size(400); currentprojection=perspective(2,3,30,up=Y); currentlight=light(gray(0.75),(0.25,-0.25,1),(0,1,0)); pen color=green; real alpha=240; real f(real x) {return 2x^2-x^3;} pair F(real x) {return (x,f(x));} triple F3(real x) {return (x,f(x),0);} int n=10; path3[] blocks=new path3[n]; for(int i=1; i <= n; ++i) { real height=f((i-0.5)*2/n); real left=(i-1)*2/n; real right=i*2/n; blocks[i-1]= (left,0,0)--(left,height,0)--(right,height,0)--(right,0,0)--cycle; } path p=graph(F,0,2,n,operator ..)--cycle; surface s=surface(p); path3 p3=path3(p); render render=render(compression=0,merge=true); revolution a=revolution(p3,Y,0,alpha); draw(surface(a),color,render); draw(rotate(alpha,Y)*s,color,render); for(int i=0; i < n; ++i) draw(surface(blocks[i]),color+opacity(0.5),black,render); draw(p3); xaxis3(Label("$x$",1,align=2X),Arrow3); yaxis3(Label("$y$",1,align=2Y),ymax=1.4,dashed,Arrow3); arrow("$y=2x^2-x^3$",XYplane(F(1.8)),X+Z,1.5cm,red,Arrow3(DefaultHead2)); draw(arc(1.17Y,0.3,90,0,7.5,180),ArcArrow3); asymptote-3.05/examples/spiral.asy0000644000000000000000000000032215031566105016011 0ustar rootrootsize(0,150); import graph; real f(real t) {return exp(-t/(2pi));} draw(polargraph(f,0,20*pi,operator ..)); xaxis("$x$",-infinity,1.3); yaxis("$y$",-infinity,1); labelx(1); labelx("$e^{-1}$",1.0/exp(1),SE); asymptote-3.05/examples/log.asy0000644000000000000000000000031615031566105015303 0ustar rootrootimport graph; size(150,0); real f(real x) {return log(x);} pair F(real x) {return (x,f(x));} xaxis("$x$",0); yaxis("$y$"); draw(graph(f,0.01,10,operator ..)); labelx(1,SSE); label("$\log x$",F(7),SE); asymptote-3.05/examples/refs.bib0000644000000000000000000000300115031566105015413 0ustar rootroot@ARTICLE{Hobby86, AUTHOR = "John D. Hobby", TITLE = "Smooth, Easy to Compute Interpolating Splines", JOURNAL = "Discrete Comput. Geom.", YEAR = 1986, VOLUME = 1, PAGES = "123-140"} @BOOK{Knuth86b, AUTHOR = "Donald E. Knuth", TITLE = "The \MF{}book", PUBLISHER = "Addison-Wesley", YEAR = 1986, ADDRESS = "Reading, Massachusetts"} @article{Bowman07, title={{The 3D {A}symptote generalization of MetaPost B\'ezier interpolation}}, author={John C. Bowman}, journal={Proceedings in Applied Mathematics and Mechanics}, volume={7}, number={1}, pages={2010021-2010022}, year={2007} } @article{Bowman08, title={Asymptote: A vector graphics language}, author={John C. Bowman and Andy Hammerlindl}, journal={TUGboat: The Communications of the \TeX\ Users Group}, volume={29}, number={2}, pages={288-294}, year={2008} } @article{Bowman09, title={Asymptote: Lifting {\TeX} to three dimensions}, author={John C. Bowman and Orest Shardt}, journal={TUGboat: The Communications of the \TeX\ Users Group}, volume={30}, number={1}, pages={58-63}, year={2009} } @article{Shardt12, title={Surface Parametrization of Nonsimply Connected Planar {B\'ezier} Regions}, author={Orest Shardt and John C. Bowman}, journal = {Computer-Aided Design}, volume={44}, number={5}, pages={484.e1-10}, year={2012}, } asymptote-3.05/examples/controlsystem.asy0000644000000000000000000000144215031566105017450 0ustar rootrootsize(0,4cm); import flowchart; block delay=roundrectangle("$e^{-sT_t}$",(0.33,0)); block system=roundrectangle("$\frac{s+3}{s^2+0.3s+1}$",(0.6,0)); block controller=roundrectangle("$0.06\left( 1 + \frac{1}{s}\right)$", (0.45,-0.25)); block sum1=circle("",(0.15,0),mindiameter=0.3cm); block junction1=circle("",(0.75,0),fillpen=currentpen); draw(delay); draw(system); draw(controller); draw(sum1); draw(junction1); add(new void(picture pic, transform t) { blockconnector operator --=blockconnector(pic,t); block(0,0)--Label("$u$",align=N)--Arrow--sum1--Arrow--delay--Arrow-- system--junction1--Label("$y$",align=N)--Arrow--block(1,0); junction1--Down--Left--Arrow--controller--Left--Up-- Label("$-$",position=3,align=ESE)--Arrow--sum1; }); asymptote-3.05/examples/extrudedcontour.asy0000644000000000000000000000075515031566105017767 0ustar rootrootimport contour; import palette; import graph3; currentprojection=orthographic(dir(60,25)); size(0,12cm); real a=3; real b=4; real f(pair z) {return (z.x+z.y)/(2+cos(z.x)*sin(z.y));} guide[][] g=contour(f,(-10,-10),(10,10),new real[]{8},150); for(guide p:g[0]){ draw(extrude(p,8Z),palered); draw(path3(p),red+2pt); } draw(lift(f,g),red+2pt); surface s=surface(f,(0,0),(10,10),20,Spline); s.colors(palette(s.map(zpart),Rainbow()+opacity(0.5))); draw(s); axes3("$x$","$y$","$z$",Arrow3); asymptote-3.05/examples/roll.asy0000644000000000000000000000027015031566105015471 0ustar rootrootimport graph3; size(200,0); triple f(pair t) { return(t.x+t.y/4+sin(t.y),cos(t.y),sin(t.y)); } surface s=surface(f,(0,0),(2pi,2pi),7,20,Spline); draw(s,olive,render(merge=true)); asymptote-3.05/examples/workcone.asy0000644000000000000000000000200615031566105016347 0ustar rootrootimport solids; size(0,150); currentprojection=orthographic(0,-30,5); real r=4; real h=10; real s=8; real x=r*s/h; real sr=5; real xr=r*sr/h; real s1=sr-0.1; real x1=r*s1/h; real s2=sr+0.2; real x2=r*s2/h; render render=render(compression=0,merge=true); draw(scale(x1,x1,-s1)*shift(-Z)*unitcone,lightblue+opacity(0.5),render); path3 p=(x2,0,s2)--(x,0,s); revolution a=revolution(p,Z); draw(surface(a),lightblue+opacity(0.5),render); path3 q=(x,0,s)--(r,0,h); revolution b=revolution(q,Z); draw(surface(b),white+opacity(0.5),render); draw((-r-1,0,0)--(r+1,0,0)); draw((0,0,0)--(0,0,h+1),dashed); path3 w=(x1,0,s1)--(x2,0,s2)--(0,0,s2); revolution b=revolution(w,Z); draw(surface(b),blue+opacity(0.5),render); draw(circle((0,0,s2),x2)); draw(circle((0,0,s1),x1)); draw("$x$",(xr,0,0)--(xr,0,sr),red,Arrow3,PenMargin3); draw("$r$",(0,0,sr)--(xr,0,sr),N,red); draw((string) r,(0,0,h)--(r,0,h),N,red); draw((string) h,(r,0,0)--(r,0,h),red,Arrow3,PenMargin3); draw((string) s,(-x,0,0)--(-x,0,s),W,red,Arrow3,Bar3,PenMargin3); asymptote-3.05/examples/cylinder.asy0000644000000000000000000000054015031566105016332 0ustar rootrootsize(0,100); import solids; currentlight=Viewport; triple v=O; real r=1; real h=1.5; triple axis=Y+Z; // Optimized cylinder surface cylinder=shift(v)*align(unit(axis))*scale(r,r,h)*unitcylinder; draw(cylinder,green,render(merge=true)); // Skeleton revolution r=cylinder(v,r,h,axis); //draw(surface(r),green,render(merge=true)); draw(r,blue+0.15mm); asymptote-3.05/examples/Gouraudcontour.asy0000644000000000000000000000115015031566105017537 0ustar rootrootimport graph; import palette; import contour; size(200); int n=100; real[] x=new real[n]; real[] y=new real[n]; real[] f=new real[n]; real F(real a, real b) {return a^2+b^2;} real r() {return 1.1*(rand()/randMax*2-1);} for(int i=0; i < n; ++i) { x[i]=r(); y[i]=r(); f[i]=F(x[i],y[i]); } pen Tickpen=black; pen tickpen=gray+0.5*linewidth(currentpen); pen[] Palette=BWRainbow(); bounds range=image(x,y,f,Range(0,2),Palette); draw(contour(pairs(x,y),f,new real[]{0.25,0.5,1},operator ..)); palette("$f(x,y)$",range,point(NW)+(0,0.5),point(NE)+(0,0.8),Top,Palette, PaletteTicks(Tickpen,tickpen)); asymptote-3.05/examples/venn.asy0000644000000000000000000000116215031566105015470 0ustar rootrootsize(0,150); pen colour1=red; pen colour2=green; pair z0=(0,0); pair z1=(-1,0); pair z2=(1,0); real r=1.5; path c1=circle(z1,r); path c2=circle(z2,r); fill(c1,colour1); fill(c2,colour2); picture intersection; fill(intersection,c1,colour1+colour2); clip(intersection,c2); add(intersection); draw(c1); draw(c2); label("$A$",z1); label("$B$",z2); pair z=(0,-2); real m=3; margin BigMargin=Margin(0,m*dot(unit(z1-z),unit(z0-z))); draw(Label("$A\cap B$",0),conj(z)--z0,Arrow,BigMargin); draw(Label("$A\cup B$",0),z--z0,Arrow,BigMargin); draw(z--z1,Arrow,Margin(0,m)); draw(z--z2,Arrow,Margin(0,m)); shipout(bbox(0.25cm)); asymptote-3.05/examples/partitionExample.asy0000644000000000000000000000203715031566105020051 0ustar rootrootsize(15cm); import bezulate; path[] p = texpath("$\sigma \Theta$"); pair m = min(p); pair M = max(p); real midy = 0.5(M.y+m.y); path[] alpha = p[0:2]; path[] theta = p[2:5]; filldraw(p,lightgrey,black); draw("{\tt partition}",(M.x+1mm,midy)--(M.x+5mm,midy),Arrow); draw((M.x+1mm,midy+1mm)--(M.x+5mm,midy+2mm),Arrow); draw((M.x+1mm,midy-1mm)--(M.x+5mm,midy-2mm),Arrow); filldraw(shift((M.x+8.5mm,midy+3.5mm))*alpha,lightgrey,black); filldraw(shift((M.x+5.5mm,0))*theta[0:2],lightgrey,black); filldraw(shift(M.x+5.5mm,midy-2.5mm)*theta[2:3],lightgrey,black); draw("{\tt merge}, {\tt bezulate}",(M.x+9mm,midy+3mm)--(M.x+15mm,midy+3mm),Arrow); draw("{\tt merge}, {\tt bezulate}",(M.x+9mm,midy)--(M.x+15mm,midy),Arrow); draw("{\tt bezulate}",(M.x+9mm,midy-2.5mm)--(M.x+15mm,midy-2.5mm),Arrow); filldraw(shift(M.x+16mm-min(alpha).x,midy+3.5mm)*bezulate(alpha),lightgrey,black); filldraw(shift(M.x+16mm-min(theta[0:2]).x,0)*bezulate(theta[0:2]),lightgrey,black); filldraw(shift(M.x+16mm-min(theta[0:2]).x,midy-2.5mm)*bezulate(theta[2:3]),lightgrey,black); asymptote-3.05/examples/spiral3.asy0000644000000000000000000000065015031566105016100 0ustar rootrootimport graph3; import palette; size3(10cm); currentprojection=orthographic(5,4,2); viewportmargin=(2cm,0); real r(real t) {return 3exp(-0.1*t);} real x(real t) {return r(t)*cos(t);} real y(real t) {return r(t)*sin(t);} real z(real t) {return t;} path3 p=graph(x,y,z,0,6*pi,50,operator ..); tube T=tube(p,2); surface s=T.s; s.colors(palette(s.map(zpart),BWRainbow())); draw(s,render(merge=true)); draw(T.center,thin()); asymptote-3.05/examples/rainbow.asy0000644000000000000000000000053115031566105016162 0ustar rootrootsize(200); pen indigo=rgb(102/255,0,238/255); void rainbow(path g) { draw(new path[] {scale(1.3)*g,scale(1.2)*g,scale(1.1)*g,g, scale(0.9)*g,scale(0.8)*g,scale(0.7)*g}, new pen[] {red,orange,yellow,green,blue,indigo,purple}); } rainbow((1,0){N}..(0,1){W}..{S}(-1,0)); rainbow(scale(4)*shift(-0.5,-0.5)*unitsquare); asymptote-3.05/examples/torus.asy0000644000000000000000000000064315031566105015701 0ustar rootrootsize(200); import graph3; currentprojection=perspective(5,4,4); real R=3; real a=1; /* import solids; revolution torus=revolution(reverse(Circle(R*X,a,Y,32)),Z,90,345); surface s=surface(torus); */ triple f(pair t) { return ((R+a*cos(t.y))*cos(t.x),(R+a*cos(t.y))*sin(t.x),a*sin(t.y)); } surface s=surface(f,(radians(90),0),(radians(345),2pi),8,8,Spline); draw(s,green,render(compression=Low,merge=true)); asymptote-3.05/examples/mergeExample.asy0000644000000000000000000000366015031566105017142 0ustar rootrootsize(16cm); import bezulate; pen edgepen=linewidth(1)+blue; pen dotpen=deepgreen; pen labelpen=fontsize(8pt); path outer = (0.5,5){E}..(5,-1){S}..{W}(4,-4)..{W}(2.5,-1.5){W}..(-0.3,-2.5){W}..(-3,0)..cycle; outer = subdivide(outer); path[] p = {outer,shift(-0.5,1.0)*rotate(-22)*scale(1.5,2.4)*subdivide(unitcircle),shift(2.3,0.3)*scale(0.7)*unitcircle}; // a filldraw(p,lightgrey+evenodd); real w = 1.1*(max(p).x-min(p).x); // b p = shift(w)*p; draw(p); path l = point(p[1],2)--point(p[0],4); draw(l,red); for(int i = 0; i < p.length; ++i) { real[][] ts = intersections(l,p[i]); for(real[] t:ts) dot(point(l,t[0])); } path l2 = point(l,intersections(l,p[0])[0][0])--point(l,intersections(l,p[2])[1][0]); real to = intersections(l,p[0])[0][1]; real ti = intersections(l,p[2])[1][1]; draw(l2,edgepen); label("$A$",point(l2,1),2E,labelpen); label("$B$",point(l2,0),1.5E,labelpen); // c p = shift(w)*p; l2 = shift(w)*l2; draw(p); real timeoffset=2; path t1=subpath(p[0],to,to+timeoffset); t1=t1--point(p[2],ti)--cycle; fill(t1,lightgrey); draw(point(p[2],ti)--point(p[0],to+4),red); dot(Label("$A$",labelpen),point(p[2],ti),2E,dotpen); dot(Label("$B$",labelpen),point(p[0],to),1.5E,dotpen); dot(Label("$C$",labelpen),point(p[0],to+timeoffset),1.5S,dotpen); draw(t1,edgepen); dot(point(p[0],to+4)); draw(shift(-0.5,-0.5)*subpath(p[0],to+4,to+timeoffset+0.5),Arrow(4)); // d p = shift(w)*p; p[0] = subpath(p[0],to+timeoffset,to+length(p[0]))--uncycle(p[2],ti)--cycle; p.delete(2); draw(p); // e p = shift(w)*p; path q=point(p[1],0)--subpath(p[0],15.4,16)--cycle; p[0] = subpath(p[0],16,15.4+length(p[0]))--uncycle(p[1],0)--cycle; p.delete(1); filldraw(p,lightgrey); // f p = shift(w)*p; filldraw(bezulate(p),lightgrey); filldraw(shift(3w)*t1,lightgrey); filldraw(shift(w)*q,lightgrey); real x = min(p).x - 4.5w; string l = "abcdef"; for(int i = 0; i < 6; ++i) { label("("+substr(l,i,1)+")",(x,min(p).y),3S,fontsize(10pt)); x += w; } asymptote-3.05/examples/arrows3.asy0000644000000000000000000000227515031566105016130 0ustar rootrootimport three; size(15cm); currentprojection=perspective(24,14,13); currentlight=light(gray(0.5),specularfactor=3, (0.5,-0.5,-0.25),(0.5,0.5,0.25),(0.5,0.5,1),(-0.5,-0.5,-1)); defaultpen(0.75mm); path3 g=arc(O,1,90,-60,90,60); draw(g,blue,Arrows3(TeXHead3),currentlight); draw(scale3(3)*g,green,ArcArrows3(HookHead3),currentlight); draw(scale3(6)*g,red,Arrows3(DefaultHead3),currentlight); transform3 t=shift(invert(3S,O)); draw(t*g,blue,Arrows3(TeXHead2),currentlight); draw(t*scale3(3)*g,green,ArcArrows3(HookHead2,NoFill),currentlight); draw(t*scale3(6)*g,red,Arrows3(DefaultHead2(normal=Z)),currentlight); transform3 t=shift(invert(6S,O)); draw(t*g,blue,Arrow3(TeXHead3,position=Relative(0.5)),currentlight); draw(t*scale3(3)*g,purple,Arrow3(HookHead3,position=Relative(0.5)), currentlight); draw(t*scale3(6)*g,red,Arrow3(DefaultHead3,position=Relative(0.5)), currentlight); transform3 t=shift(invert(9S,O)); draw(t*g,blue,Arrow3(TeXHead2,position=Relative(0.5)),currentlight); draw(t*scale3(3)*g,green,Arrow3(HookHead2,position=Relative(0.5),NoFill), currentlight); draw(t*scale3(6)*g,red,Arrow3(DefaultHead2(normal=Z),position=Relative(0.5)), currentlight); asymptote-3.05/examples/Gouraud.asy0000644000000000000000000000057715031566105016141 0ustar rootrootsize(200); pen[] p={red,green,blue,yellow}; pair[] z={(-1,0),(0,0),(0,1),(1,0)}; int[] edges={0,0,0,1}; gouraudshade(z[0]--z[2]--z[3]--cycle,p,z,edges); draw(z[0]--z[1]--z[2]--cycle); draw(z[1]--z[3]--z[2],dashed); dot(Label,z[0],W); dot(Label,z[1],S); dot(Label,z[2],N); dot(Label,z[3],E); label("0",z[0]--z[1],S,red); label("1",z[1]--z[2],E,red); label("2",z[2]--z[0],NW,red); asymptote-3.05/examples/cyclohexane.asy0000644000000000000000000000336515031566105017033 0ustar rootrootimport three; currentprojection=perspective(300,-650,500); currentlight.background=palecyan; surface carbon=scale3(70)*unitsphere; // 70 pm surface hydrogen=scale3(25)*unitsphere; // 25 pm real alpha=90+aSin(1/3); real CCbond=156; // 156 pm real CHbond=110; // 110 pm triple c1=(0,0,0); triple h1=c1+CHbond*Z; triple c2=rotate(alpha,c1,c1+Y)*(CCbond*Z); triple h2=rotate(120,c1,c2)*h1; triple h3=c2-CHbond*Z; triple h4=rotate(120,c2,c1)*h3; triple c3=rotate(120,c2,h3)*c1; triple h5=c3+CHbond*Z; triple h6=rotate(-120,c3,c2)*h5; triple c4=rotate(-120,c3,h5)*c2; triple h7=c4-CHbond*Z; triple h8=rotate(120,c4,c3)*h7; triple c5=rotate(120,c4,h7)*c3; triple h9=c5+CHbond*Z; triple h10=rotate(-120,c5,c4)*h9; triple c6=rotate(-120,c5,h9)*c4; triple h11=c6-CHbond*Z; triple h12=rotate(120,c6,c5)*h11; pen Black=gray(0.4); draw(shift(c1)*carbon,Black); draw(shift(c2)*carbon,Black); draw(shift(c3)*carbon,Black); draw(shift(c4)*carbon,Black); draw(shift(c5)*carbon,Black); draw(shift(c6)*carbon,Black); material White=material(diffusepen=gray(0.4),emissivepen=gray(0.6)); draw(shift(h1)*hydrogen,White); draw(shift(h2)*hydrogen,White); draw(shift(h3)*hydrogen,White); draw(shift(h4)*hydrogen,White); draw(shift(h5)*hydrogen,White); draw(shift(h6)*hydrogen,White); draw(shift(h7)*hydrogen,White); draw(shift(h8)*hydrogen,White); draw(shift(h9)*hydrogen,White); draw(shift(h10)*hydrogen,White); draw(shift(h11)*hydrogen,White); draw(shift(h12)*hydrogen,White); pen thick=linewidth(10); draw(c1--c2--c3--c4--c5--c6--cycle,thick); draw(c1--h1,thick); draw(c1--h2,thick); draw(c2--h3,thick); draw(c2--h4,thick); draw(c3--h5,thick); draw(c3--h6,thick); draw(c4--h7,thick); draw(c4--h8,thick); draw(c5--h9,thick); draw(c5--h10,thick); draw(c6--h11,thick); draw(c6--h12,thick); asymptote-3.05/examples/pipeintersection.asy0000644000000000000000000000055215031566105020110 0ustar rootrootimport graph3; currentprojection=orthographic(5,4,2); size(12cm,0); real f(pair z) {return min(sqrt(1-z.x^2),sqrt(1-z.y^2));} surface s=surface(f,(0,0),(1,1),40,Spline); transform3 t=rotate(90,O,Z), t2=t*t, t3=t2*t, i=xscale3(-1)*zscale3(-1); draw(surface(s,t*s,t2*s,t3*s,i*s,i*t*s,i*t2*s,i*t3*s),blue, render(compression=Low,closed=true,merge=true)); asymptote-3.05/examples/genusthree.asy0000644000000000000000000000124715031566105016677 0ustar rootrootsize(8cm); import smoothcontour3; // Erdos lemniscate of order n: real erdos(pair z, int n) { return abs(z^n-1)^2 - 1; } real h = 0.12; // Erdos lemniscate of order 3: real lemn3(real x, real y) { return erdos((x,y), 3); } // "Inflate" the order 3 (planar) lemniscate into a // smooth surface: real f(real x, real y, real z) { return lemn3(x,y)^2 + (16*abs((x,y))^4 + 1) * (z^2 - h^2); } // Draw the implicit surface on a box with diagonally opposite // corners at (-3,-3,-3), (3,3,3). draw(implicitsurface(f,a=(-3,-3,-3),b=(3,3,3),overlapedges=true), surfacepen=material(diffusepen=gray(0.5),emissivepen=gray(0.4), specularpen=gray(0.1))); asymptote-3.05/examples/SierpinskiSponge.asy0000644000000000000000000000453615031566105020026 0ustar rootrootsize(200); import palette; import three; currentprojection=orthographic(1,1,1); triple[] M= { (-1,-1,-1),(0,-1,-1),(1,-1,-1),(1,0,-1), (1,1,-1),(0,1,-1),(-1,1,-1),(-1,0,-1), (-1,-1,0),(1,-1,0),(1,1,0),(-1,1,0), (-1,-1,1),(0,-1,1),(1,-1,1),(1,0,1),(1,1,1),(0,1,1),(-1,1,1),(-1,0,1) }; surface[] Squares= { surface((1,-1,-1)--(1,1,-1)--(1,1,1)--(1,-1,1)--cycle), surface((-1,-1,-1)--(-1,1,-1)--(-1,1,1)--(-1,-1,1)--cycle), surface((1,1,-1)--(-1,1,-1)--(-1,1,1)--(1,1,1)--cycle), surface((1,-1,-1)--(-1,-1,-1)--(-1,-1,1)--(1,-1,1)--cycle), surface((1,-1,1)--(1,1,1)--(-1,1,1)--(-1,-1,1)--cycle), surface((1,-1,-1)--(1,1,-1)--(-1,1,-1)--(-1,-1,-1)--cycle), }; int[][] SquaresPoints= { {2,3,4,10,16,15,14,9}, {0,7,6,11,18,19,12,8}, {4,5,6,11,18,17,16,10}, {2,1,0,8,12,13,14,9}, {12,13,14,15,16,17,18,19}, {0,1,2,3,4,5,6,7} }; int[][] index= { {0,2,4},{0,1},{1,2,4},{2,3},{1,3,4},{0,1},{0,3,4},{2,3}, {4,5},{4,5},{4,5},{4,5}, {0,2,5},{0,1},{1,2,5},{2,3},{1,3,5},{0,1},{0,3,5},{2,3} }; int[] Sponge0=array(n=6,value=1); int[] eraseFaces(int n, int[] Sponge0) { int[] temp=copy(Sponge0); for(int k : index[n]) { temp[k]=0; } return temp; } int[][] Sponge1=new int[20][]; for(int n=0; n < 20; ++n) { Sponge1[n]=eraseFaces(n,Sponge0); } int[][] eraseFaces(int n, int[][] Sponge1) { int[][] temp=copy(Sponge1); for(int k : index[n]) for(int n1 : SquaresPoints[k]) temp[n1][k]=0; return temp; } int[][][] Sponge2=new int[20][][]; for(int n=0; n < 20; ++n) Sponge2[n]=eraseFaces(n,Sponge1); int[][][] eraseFaces(int n, int[][][] Sponge2) { int[][][] temp=copy(Sponge2); for(int k : index[n]) for(int n2: SquaresPoints[k]) for(int n1: SquaresPoints[k]) temp[n2][n1][k]=0; return temp; } int[][][][] Sponge3=new int[20][][][]; for(int n=0; n < 20; ++n) Sponge3[n]=eraseFaces(n,Sponge2); surface s3; real u=2/3; for(int n3=0; n3 < 20; ++n3) { surface s2; for(int n2=0; n2 < 20; ++n2) { surface s1; for(int n1=0; n1 < 20; ++n1) { for(int k=0; k < 6; ++k) { if(Sponge3[n3][n2][n1][k] > 0) { s1.append(scale3(u)*shift(M[n1])*scale3(0.5)*Squares[k]); } } } s2.append(scale3(u)*shift(M[n2])*scale3(0.5)*s1); } s3.append(scale3(u)*shift(M[n3])*scale3(0.5)*s2); } s3.colors(palette(s3.map(abs),Rainbow())); draw(s3); asymptote-3.05/examples/upint.asy0000644000000000000000000000030715031566105015661 0ustar rootrootimport graph; import lowupint; size(100,0); real a=-0.8, b=1.2; real c=-1.0/sqrt(3.0); partition(a,b,c,max); arrow("$f(x)$",F(0.5*(a+b)),NNE,red); label("$\cal{U}$",(0.5*(a+b),f(0.5*(a+b))/2)); asymptote-3.05/examples/BezierSurface.asy0000644000000000000000000000301415031566105017251 0ustar rootrootimport three; string viewpoint=" COO=-684.0787963867188 206.90650939941406 218.13809204101562 C2C=0.8244762420654297 -0.563306450843811 0.0540805421769619 ROO=1009.7407942621448 ROLL=17.39344555165265 "; // viewpoint=getstring("viewpoint",viewpoint); currentprojection=perspective(viewpoint); triple[][][] P= { { {(-1.6,0,1.875),(-2.3,0,1.875),(-2.7,0,1.875),(-2.7,0,1.65),}, {(-1.6,-0.3,1.875),(-2.3,-0.3,1.875),(-2.7,-0.3,1.875),(-2.7,-0.3,1.65),}, {(-1.5,-0.3,2.1),(-2.5,-0.3,2.1),(-3,-0.3,2.1),(-3,-0.3,1.65),}, {(-1.5,0,2.1),(-2.5,0,2.1),(-3,0,2.1),(-3,0,1.65),} }, { {(-2.7,0,1.65),(-2.7,0,1.425),(-2.5,0,0.975),(-2,0,0.75),}, {(-2.7,-0.3,1.65),(-2.7,-0.3,1.425),(-2.5,-0.3,0.975),(-2,-0.3,0.75),}, {(-3,-0.3,1.65),(-3,-0.3,1.2),(-2.65,-0.3,0.7275),(-1.9,-0.3,0.45),}, {(-3,0,1.65),(-3,0,1.2),(-2.65,0,0.7275),(-1.9,0,0.45),} }, { {(-2.7,0,1.65),(-2.7,0,1.875),(-2.3,0,1.875),(-1.6,0,1.875),}, {(-2.7,0.3,1.65),(-2.7,0.3,1.875),(-2.3,0.3,1.875),(-1.6,0.3,1.875),}, {(-3,0.3,1.65),(-3,0.3,2.1),(-2.5,0.3,2.1),(-1.5,0.3,2.1),}, {(-3,0,1.65),(-3,0,2.1),(-2.5,0,2.1),(-1.5,0,2.1),} }, { {(-2,0,0.75),(-2.5,0,0.975),(-2.7,0,1.425),(-2.7,0,1.65),}, {(-2,0.3,0.75),(-2.5,0.3,0.975),(-2.7,0.3,1.425),(-2.7,0.3,1.65),}, {(-1.9,0.3,0.45),(-2.65,0.3,0.7275),(-3,0.3,1.2),(-3,0.3,1.65),}, {(-1.9,0,0.45),(-2.65,0,0.7275),(-3,0,1.2),(-3,0,1.65),} } }; picture pic; size(pic,15cm); size3(pic,10cm); draw(pic,surface(P),blue); add(embed("label",pic),(0,0),N); asymptote-3.05/examples/floatingdisk.asy0000644000000000000000000000105615031566105017202 0ustar rootrootimport trembling; if(settings.outformat == "") settings.outformat="pdf"; size(6cm,0); real R=1/5; real h=0.5; real d=1/12; real l=.7; pair pA=(-l,0); pair pB=(l,0); tremble tr=tremble(angle=10,frequency=0.1,random=50,fuzz=1); path waterline=tr.deform(pA..pB); path disk=shift(0,-d)*scale(R)*unitcircle; path water=waterline--(l,-h)--(-l,-h)--(-l,0)--cycle; path container=(l,1/7)--(l,-h)--(-l,-h)--(-l,1/7); filldraw(disk,red,linewidth(.3)); fill(water,mediumgrey+opacity(0.5)); draw(waterline); draw(container,linewidth(1.5)); shipout(bbox(2mm)); asymptote-3.05/examples/annotation.asy0000644000000000000000000000035415031566105016676 0ustar rootrootimport annotate; settings.outformat="pdf"; size(200); draw(unitcircle); dot((0,0)); annotate("O","(0,0)",(0,0)); annotate("A","(1,0)",(1,0)); annotate("B","(0,1)",(0,1)); annotate("C","(-1,0)",(-1,0)); annotate("D","(0,-1)",(0,-1)); asymptote-3.05/examples/gamma3.asy0000644000000000000000000000130415031566105015665 0ustar rootrootimport graph3; import palette; size(12cm,IgnoreAspect); currentprojection=orthographic(dir(80,290)); real X=4.5; real M=abs(gamma((X,0))); pair Gamma(pair z) { return (z.x > 0 || z != floor(z.x)) ? gamma(z) : M; } real f(pair z) {return min(abs(Gamma(z)),M);} surface s=surface(f,(-2.1,-2),(X,2),70,Spline); real Arg(triple v) { return degrees(Gamma((v.x,v.y)),warn=false); } s.colors(palette(s.map(Arg),Wheel())); draw(s,render(tessellate=false)); real xmin=point((-1,-1,-1)).x; real xmax=point((1,1,1)).x; draw((xmin,0,0)--(xmax,0,0),dashed); xaxis3("$\mathop{\rm Re} z$",Bounds,InTicks); yaxis3("$\mathop{\rm Im} z$",Bounds,InTicks(beginlabel=false)); zaxis3("$|\Gamma(z)|$",Bounds,InTicks); asymptote-3.05/examples/worldmap.dat0000644000000000000000000464030115031566105016333 0ustar rootroot# -b 0.192440 5.669954 -0.114995 5.515063 -0.391921 5.360171 -0.657114 5.195893 -0.887104 5.151303 -1.262597 5.062123 -1.417488 5.008146 -1.560645 4.874377 -1.736658 4.775809 -1.936139 4.686630 -2.198985 4.787544 -2.410200 4.874377 -2.595600 4.930701 -2.771612 4.951822 # -b -2.771612 4.951822 -2.860792 4.963556 -3.003949 4.975290 -3.301997 5.052736 -3.611779 5.106713 -3.832382 5.184159 -4.238384 5.163037 -4.679589 5.106713 -5.198240 5.041002 -5.341397 5.008146 -5.430576 5.017534 -5.585468 4.984678 -5.848313 4.918966 -6.080650 4.796931 -6.223807 4.754688 -6.444409 4.677242 -6.643890 4.599797 -6.787047 4.543473 -6.873880 4.489496 -7.106217 4.388582 -7.293964 4.278280 -7.491098 4.257159 # -b -7.491098 4.257159 -7.523953 4.245425 -7.735169 4.334604 -8.164639 4.489496 -8.483809 4.588063 -8.835834 4.808665 -9.112761 5.008146 -9.464786 5.339050 -9.807424 5.681688 # -b -9.807424 5.681688 -10.004558 5.845966 -10.204039 5.989123 -10.412907 6.078303 -10.523209 6.132280 -10.645244 6.254316 -10.800135 6.364617 -10.886968 6.385738 -11.009004 6.409207 -11.095836 6.496040 -11.152161 6.507774 -11.185016 6.561751 -11.196750 6.594607 -11.152161 6.606341 -11.131039 6.639197 -11.163895 6.672052 -11.307052 6.761232 -11.351642 6.803475 # -b -11.351642 6.803475 -11.461943 6.892655 -11.790500 7.047546 -12.121403 7.178969 -12.299763 7.256414 -12.342006 7.322126 -12.365474 7.453548 -12.562608 7.641295 -12.705765 7.728128 -12.773824 7.805574 -12.794945 8.035563 -12.905246 8.122396 -13.036669 8.122396 -13.069525 8.265553 -13.048403 8.364120 -12.970958 8.474422 -12.982692 8.495543 -13.081259 8.551867 -13.114115 8.692677 -13.092993 8.802979 -13.114115 8.856956 -13.170439 8.922667 -13.179826 9.011847 # -b -13.179826 9.011847 -13.191560 9.021234 -13.247884 9.176125 -13.325330 9.262958 -13.391041 9.361525 -13.522464 9.481214 -13.555320 9.612637 -13.653887 9.678348 -13.754801 9.798037 -13.919079 9.938847 -14.029380 9.971702 # -b -12.431186 7.498138 -12.452307 7.486404 -12.541487 7.530994 -12.651788 7.486404 -12.762089 7.486404 -12.705765 7.408959 -12.586077 7.366715 -12.485163 7.376103 -12.431186 7.498138 # -b -49.917183 -0.018775 -49.774026 0.004694 -49.762292 0.136116 -49.863206 0.225296 # -b -50.027484 0.957509 -49.950039 1.056076 -49.973507 1.213314 -49.961773 1.300147 -49.884327 1.478506 -49.863206 1.731964 # -b -59.708179 8.277287 -59.773891 8.310143 -59.905313 8.462687 # -b -57.060949 5.791989 -57.117273 5.902290 -57.161863 6.066569 -57.272164 6.266050 -57.391853 6.308293 -57.546744 6.442062 -57.657045 6.585219 -57.767347 6.704908 -57.987949 6.836331 -58.208552 6.871533 -58.396299 6.836331 -58.506600 6.803475 -58.518334 6.803475 -58.483131 6.904389 -58.462010 7.014690 -58.462010 7.155500 -58.494866 7.354981 -58.572311 7.507526 -58.649757 7.606093 -58.769445 7.716394 -58.947805 7.847817 -59.168407 8.023829 -59.356154 8.220963 -59.520433 8.319531 -59.642468 8.375855 -59.642468 8.319531 -59.642468 8.265553 -59.696445 8.298409 -59.708179 8.277287 # -b -54.028838 5.482207 -54.028838 5.547918 -53.974861 5.735665 -53.986595 5.791989 -54.383210 5.935146 -54.779826 5.968002 -55.000428 5.968002 -55.045018 5.956268 -55.110729 5.869435 -55.307863 5.890556 -55.617646 5.911678 -55.805393 5.857700 -55.903960 5.801376 -55.925081 5.824845 -56.279453 5.834232 -56.500056 5.902290 -56.774635 5.956268 -56.863815 6.012592 -56.929527 5.956268 -56.974116 5.857700 -57.060949 5.791989 # -b -51.592823 4.069412 -51.581089 4.135123 -51.571702 4.299402 -51.759449 4.531739 -51.825160 4.510617 -52.034028 4.731220 -52.165451 4.841521 -52.233509 4.930701 -52.454112 5.106713 -52.740426 5.261604 -53.047861 5.383640 -53.301319 5.482207 -53.512535 5.538531 -53.599368 5.580774 -53.742524 5.714544 -53.798848 5.723931 -53.909150 5.547918 -54.028838 5.482207 # -b -50.194110 0.457633 -50.248087 0.413043 -50.337267 0.314476 -50.337267 0.204175 -50.215231 0.058671 -50.048606 0.037549 # -b -49.863206 0.225296 -50.006363 0.248765 -50.126052 0.335597 -50.194110 0.457633 # -b -50.931016 -0.007041 -50.733882 0.213562 -50.578991 0.326210 -50.435834 0.525691 -50.280943 0.701704 -50.158907 0.769762 -50.027484 0.957509 # -b -49.863206 1.731964 -50.083808 1.800023 -50.346654 1.809410 -50.445221 1.910324 -50.468689 2.020625 -50.555522 2.285817 -50.665824 2.619068 -50.820715 2.994562 -50.931016 3.337200 -50.963872 3.625860 -50.963872 3.780751 -51.053051 3.935643 -51.196208 4.135123 -51.294775 4.233691 -51.362834 4.278280 -51.383955 4.290015 -51.405077 4.189101 -51.482522 4.057678 -51.592823 4.069412 # -b -59.905313 8.462687 -60.027349 8.561255 -60.182240 8.594110 -60.280807 8.584723 -60.501410 8.408710 -60.632832 8.462687 -60.778336 8.486156 -60.942615 8.507277 -60.954349 8.584723 -60.820579 8.584723 -60.677422 8.671556 -60.644567 8.781857 -60.733746 8.758389 -60.743134 8.922667 -60.820579 9.239490 -60.921493 9.415503 -61.163217 9.546925 -61.372085 9.591515 -61.395554 9.600903 -61.472999 9.678348 -61.559832 9.699470 -61.649012 9.765181 -61.726458 9.798037 -61.735845 9.809771 -61.792169 9.852014 -61.803903 9.852014 -61.857880 9.842627 -62.022159 9.875482 -62.132460 9.875482 -62.266230 9.798037 -62.409387 9.896604 # -b -80.038812 9.065824 -79.994222 9.086946 -79.883921 9.110414 -79.851065 9.239490 -79.862799 9.469480 -79.719642 9.591515 -79.487306 9.612637 -79.254969 9.612637 -79.156402 9.600903 -79.111812 9.546925 -78.935800 9.502335 -78.726931 9.469480 -78.527450 9.415503 -78.297460 9.361525 -78.097979 9.251224 -77.954822 9.131535 -77.832787 9.021234 -77.713098 8.934401 -77.569942 8.781857 # -b -77.900845 7.244680 -78.065124 7.408959 -78.229402 7.596705 -78.363172 7.904141 -78.339703 8.068419 -78.297460 8.298409 -78.196546 8.375855 -78.065124 8.375855 -78.187159 8.486156 -78.440617 8.429832 -78.583774 8.626966 -78.837232 8.791244 -79.078957 8.922667 -79.344149 8.967257 -79.642197 8.856956 -79.740764 8.683290 -79.907389 8.429832 # -b -77.900845 7.244680 -77.900845 7.200090 -77.844521 7.101523 -77.745954 6.937245 -77.722486 6.859799 -77.635653 6.716642 -77.480762 6.672052 -77.415050 6.585219 -77.415050 6.409207 -77.424438 6.266050 -77.480762 6.144014 -77.424438 5.935146 -77.370461 5.791989 -77.370461 5.669954 -77.436172 5.613630 -77.525352 5.526797 -77.501883 5.515063 -77.469028 5.339050 -77.447906 5.008146 -77.391582 4.764075 -77.358726 4.632653 -77.370461 4.477761 -77.459640 4.290015 -77.492496 4.102268 -77.459640 3.935643 -77.415050 3.858197 -77.325871 3.858197 -77.084147 3.902787 -76.950377 3.956764 -77.060678 3.747896 -77.138124 3.682184 -77.227304 3.548415 -77.370461 3.405258 -77.480762 3.294957 -77.534739 3.161187 -77.635653 3.062620 -77.680243 2.907729 -77.767076 2.717635 -77.856255 2.663658 -78.032268 2.607334 -78.154303 2.619068 -78.384293 2.574478 -78.461739 2.562744 -78.583774 2.398466 -78.637751 2.252962 -78.682341 2.121539 -78.661220 1.931445 -78.628364 1.832878 -78.628364 1.800023 -78.715197 1.800023 -78.825498 1.743699 -78.968655 1.633397 -78.992124 1.612276 -78.992124 1.478506 -78.924065 1.412795 -78.881822 1.377592 # -b -78.870088 1.377592 -78.891210 1.311881 -79.001511 1.234435 -79.189258 1.112400 -79.433329 1.013833 -79.585873 0.901185 -79.642197 0.812005 -79.829944 0.823739 # -b -75.671352 10.016292 -75.683086 9.908338 -75.683086 9.809771 -75.683086 9.666614 -75.694820 9.546925 -75.826243 9.436624 -75.981134 9.415503 -76.147759 9.349791 -76.246327 9.197247 -76.344894 8.988379 -76.544375 8.847568 -76.720387 8.725533 -76.884666 8.650434 -76.908134 8.540133 -76.840076 8.453300 -76.764977 8.420444 -76.764977 8.385242 -76.764977 8.211576 -76.753243 8.056685 -76.786099 7.981586 -76.896400 7.936996 -76.962111 7.981586 -76.985580 8.145865 -77.051291 8.211576 -77.138124 8.342999 -77.248425 8.462687 -77.349339 8.540133 -77.415050 8.650434 -77.447906 8.659822 -77.569942 8.781857 # -b -71.317973 10.114859 -71.195937 9.938847 -71.109104 9.711204 -71.064515 9.481214 -71.064515 9.328670 -71.085636 9.218368 -71.261649 9.065824 -71.493985 9.021234 -71.616021 9.044703 -71.669998 9.251224 -71.803768 9.492948 -71.935190 9.600903 -71.979780 9.720591 -72.012636 9.875482 # -b -81.803632 7.707007 -81.759042 7.695272 -81.768430 7.707007 -81.878731 7.584971 -81.890465 7.432427 -81.747308 7.298657 -81.726187 7.486404 -81.714452 7.683538 -81.803632 7.707007 # -b -83.235202 10.114859 -83.038067 9.896604 -82.817465 9.732325 -82.718898 9.678348 # -b -82.718898 9.678348 -82.641452 9.657227 -82.474827 9.535191 -82.376260 9.328670 -82.254224 9.262958 -82.221369 9.316935 -82.155657 9.328670 -82.155657 9.176125 -82.167392 9.011847 -81.935055 9.000113 -81.735574 9.011847 -81.526706 8.868690 -81.284982 8.835834 -81.040911 8.868690 -80.897754 8.955523 -80.733475 9.044703 -80.533994 9.086946 -80.325126 9.176125 -80.092789 9.328670 -80.038812 9.251224 -80.038812 9.065824 # -b -79.907389 8.429832 -80.160847 8.298409 -80.336860 8.253819 -80.435427 8.166986 -80.468283 8.002708 -80.390837 7.871285 -80.259415 7.728128 -80.137379 7.629561 -80.083402 7.486404 -80.203091 7.432427 -80.357982 7.310391 -80.557463 7.223559 -80.766331 7.211824 -80.921222 7.223559 -80.930609 7.310391 -80.954078 7.420693 -80.954078 7.519260 -81.019789 7.629561 -81.064379 7.772718 -81.174680 7.793839 -81.207536 7.683538 -81.228657 7.596705 -81.362427 7.641295 -81.482116 7.772718 -81.592417 7.871285 -81.669862 8.014442 -81.681597 8.014442 -81.693331 8.035563 -81.768430 8.145865 -81.956176 8.188108 -82.188513 8.265553 -82.364526 8.277287 -82.463093 8.331265 -82.617984 8.319531 -82.751753 8.342999 -82.883176 8.319531 -82.916032 8.232698 -82.927766 8.134131 -82.972356 8.113009 -83.026333 8.310143 # -b -83.026333 8.310143 -83.082657 8.354733 -83.124900 8.408710 -83.157756 8.605844 -83.345503 8.704411 -83.479272 8.716146 -83.390093 8.561255 -83.368971 8.474422 -83.544984 8.495543 -83.720996 8.638700 -83.699875 8.824100 -83.720996 9.110414 -83.986189 9.295814 -84.239647 9.436624 -84.394538 9.525804 -84.558817 9.579781 -84.647996 9.678348 -84.701973 9.875482 -84.791153 9.938847 # -b -85.176034 10.016292 -85.044611 9.983437 -84.967166 9.863748 -85.021143 9.753447 -85.098589 9.645492 -85.232358 9.765181 -85.396637 9.863748 -85.551528 9.875482 -85.694685 9.962315 # -b -79.829944 0.823739 -80.071668 0.746294 -80.104523 0.570281 -80.071668 0.359066 -80.059934 0.171319 # -b -91.383413 0.147851 -91.371679 0.103261 # -b -91.526570 -0.051630 -91.493714 0.037549 -91.406881 0.114995 -91.383413 0.147851 # -b -157.343561 2.013585 -157.308359 2.034706 -157.287237 1.978382 -157.254381 1.968995 -157.198057 1.912671 -157.188670 1.814104 -157.144080 1.769514 -157.045513 1.713190 -157.010311 1.656866 -156.989189 1.591154 -157.111225 1.602888 -157.266116 1.624010 -157.364683 1.680334 -157.421007 1.701455 -157.430394 1.769514 -157.421007 1.778901 -157.331827 1.769514 -157.287237 1.814104 -157.275503 1.868081 -157.298971 1.924405 -157.343561 1.968995 -157.343561 1.990116 -157.343561 2.013585 # -b -162.079475 5.937493 -162.067740 5.958614 -162.056006 5.949227 -162.079475 5.892903 -162.079475 5.937493 # -b -176.564141 0.227643 -176.552407 0.173666 -176.552407 0.183053 -176.564141 0.227643 -176.552407 0.173666 -176.552407 0.183053 -176.564141 0.227643 # -b 170.884800 8.861649 170.950511 8.849915 170.950511 8.828794 170.962245 8.807672 171.006835 8.795938 171.072547 8.763082 171.117137 8.718493 171.171114 8.643394 171.171114 8.554214 171.149992 8.511971 171.105402 8.479115 171.060813 8.500237 170.995101 8.554214 170.938777 8.587070 170.894187 8.652781 170.861332 8.718493 170.840210 8.763082 170.840210 8.817060 170.828476 8.849915 170.851944 8.861649 170.884800 8.861649 # -b 172.860835 1.891549 172.881957 1.879815 172.881957 1.868081 172.926546 1.835225 172.959402 1.724924 172.959402 1.602888 172.971136 1.501974 173.015726 1.415142 173.048582 1.325962 173.048582 1.281372 172.959402 1.269638 172.905425 1.358818 172.905425 1.447997 172.905425 1.534830 172.905425 1.635744 172.881957 1.769514 172.860835 1.868081 172.860835 1.891549 # -b 163.112082 5.364865 163.133203 5.353131 163.133203 5.332009 163.058105 5.308541 163.001781 5.296807 162.990047 5.341397 163.013515 5.364865 163.067492 5.364865 163.112082 5.364865 # -b 166.909261 9.288773 166.942117 9.309895 166.953851 9.277039 167.031297 9.277039 167.087621 9.265305 167.162719 9.265305 167.240165 9.255918 167.317611 9.309895 167.395056 9.333363 167.439646 9.300508 167.505357 9.169085 167.582803 9.070518 167.639127 8.993072 167.660248 8.894505 167.671983 8.784204 167.627393 8.697371 167.561681 8.741961 167.538213 8.849915 167.505357 8.939095 167.463114 8.993072 167.362200 9.079905 167.240165 9.157351 167.141598 9.157351 167.087621 9.169085 166.998441 9.190206 166.899874 9.255918 166.888140 9.300508 166.909261 9.288773 # -b 169.549451 5.993817 169.537717 6.003204 169.493127 5.993817 169.493127 6.014938 169.549451 5.993817 169.549451 5.993817 # -b 152.126547 7.115604 152.171137 7.139072 152.150015 7.127338 152.138281 7.115604 152.126547 7.115604 # -b 153.661377 5.606589 153.640255 5.651179 153.684845 5.639445 153.717701 5.606589 153.705967 5.585468 153.673111 5.585468 153.661377 5.606589 # -b 158.286989 7.005303 158.331579 6.995916 158.387903 6.939591 158.397290 6.873880 158.387903 6.841024 158.343313 6.841024 158.277602 6.873880 158.254133 6.939591 158.265867 6.984181 158.286989 7.005303 # -b 134.729458 7.664764 134.738845 7.699966 134.738845 7.622520 134.738845 7.512219 134.705990 7.390184 134.628544 7.357328 134.595688 7.455895 134.607422 7.577931 134.628544 7.610786 134.694255 7.655376 134.729458 7.664764 # -b 138.240323 9.584475 138.240323 9.572740 138.273179 9.572740 138.282566 9.528151 138.240323 9.507029 138.216855 9.539885 138.240323 9.584475 # -b 123.368429 10.215773 123.246394 9.988130 123.192416 9.844973 123.180682 9.725285 123.168948 9.605596 123.192416 9.462439 123.237006 9.342751 123.225272 9.136229 123.058647 9.037662 122.903756 9.190206 122.793454 9.354485 122.673766 9.408462 122.539996 9.528151 122.429695 9.704163 122.486019 9.943540 122.563465 9.964662 # -b 125.687102 10.161796 125.698836 9.997518 125.719958 9.856708 125.687102 9.812118 125.654246 9.943540 # -b 126.018006 9.997518 126.071983 9.901297 126.107186 9.868442 126.116573 9.790996 126.071983 9.812118 126.006272 9.889563 126.018006 9.997518 # -b 123.699333 10.020986 123.633621 9.889563 123.544442 9.692429 123.490464 9.518763 123.413019 9.462439 123.368429 9.659573 123.368429 9.856708 # -b 123.833102 9.844973 123.833102 9.868442 123.887080 9.877829 123.985647 9.955275 # -b 124.572355 10.020986 124.572355 9.901297 124.539500 9.844973 124.548887 9.737019 124.504297 9.671308 124.393996 9.638452 124.250839 9.593862 124.107682 9.605596 123.976259 9.617330 123.908201 9.683042 123.854224 9.779262 123.833102 9.844973 # -b 125.421910 9.713551 125.410176 9.746406 125.454765 9.746406 125.499355 9.746406 125.597922 9.737019 125.654246 9.638452 125.719958 9.561006 125.851381 9.495295 125.928826 9.396728 126.029740 9.277039 126.128307 9.265305 126.205753 9.124495 126.316054 8.894505 126.327788 8.795938 126.238608 8.697371 126.161163 8.587070 126.194019 8.554214 126.337175 8.479115 126.348910 8.258513 126.426355 8.181067 126.438089 7.995667 126.447477 7.852510 126.515535 7.721088 126.581246 7.491098 126.581246 7.324472 126.569512 7.148460 126.482679 7.017037 126.370031 6.963060 126.283198 6.819903 126.271464 6.587566 126.271464 6.366964 126.149429 6.477265 126.083717 6.709602 126.071983 6.995916 125.973416 7.139072 125.895970 7.315085 125.818525 7.357328 125.731692 7.270495 125.675368 7.193050 125.576801 7.038159 125.466500 6.852759 125.421910 6.611035 125.543945 6.488999 125.642512 6.301252 125.708224 6.080650 125.698836 5.970349 125.565067 5.761480 125.475887 5.594855 125.344464 5.672301 125.288140 5.892903 125.278753 6.014938 125.123862 5.904637 124.936115 5.871781 124.769490 5.916371 124.572355 6.014938 124.372874 6.125240 124.229718 6.289518 124.131150 6.444409 124.107682 6.632156 124.053705 6.787047 124.009115 7.017037 124.086561 7.106217 124.217983 7.303351 124.217983 7.446508 124.074826 7.622520 123.865958 7.786799 123.699333 7.852510 123.567910 7.840776 123.511586 7.721088 123.424753 7.566196 123.413019 7.467629 123.389551 7.467629 123.290983 7.533341 123.192416 7.533341 123.192416 7.664764 123.082115 7.566196 122.948346 7.446508 122.927224 7.390184 122.915490 7.336207 122.849778 7.500485 122.805189 7.709353 122.662032 7.709353 122.528262 7.566196 122.450817 7.479364 122.385105 7.303351 122.319394 7.160194 122.230214 6.939591 122.119913 6.906736 122.009612 6.930204 121.943900 7.127338 122.000224 7.282229 122.077670 7.533341 122.110525 7.688232 122.152768 7.840776 122.331128 8.040257 122.518875 8.082500 122.673766 8.127090 122.903756 8.192801 122.960080 8.357080 123.091503 8.488503 123.279249 8.587070 123.389551 8.709105 123.478730 8.676249 123.743923 8.577682 123.833102 8.345346 123.743923 8.061379 123.732188 8.016789 123.908201 8.094234 124.131150 8.192801 124.274307 8.488503 124.462054 8.587070 124.593477 8.533093 124.692044 8.652781 124.727247 8.849915 124.814079 8.960217 124.936115 8.927361 125.025295 8.882771 125.112128 8.939095 125.245897 9.004806 125.377320 8.948482 125.466500 9.025928 125.487621 9.169085 125.487621 9.277039 125.475887 9.333363 125.454765 9.462439 125.421910 9.605596 125.421910 9.671308 125.421910 9.713551 # -b 121.833599 6.632156 121.932166 6.709602 122.065936 6.709602 122.253682 6.643890 122.307660 6.587566 122.176237 6.456143 122.000224 6.432675 121.899310 6.533589 121.833599 6.632156 # -b 120.951189 5.871781 120.951189 5.937493 120.984045 6.003204 121.106080 6.036060 121.204647 6.014938 121.347804 5.970349 121.425250 5.949227 121.347804 5.815457 121.183526 5.892903 121.049756 5.860047 120.951189 5.871781 # -b 119.967865 5.186506 120.089900 5.254564 120.221323 5.221708 120.254179 5.144263 120.134490 5.099673 # -b 121.115467 1.325962 121.204647 1.314228 121.314948 1.314228 121.446371 1.302493 121.481574 1.203926 121.601262 1.103013 121.735032 1.081891 121.899310 1.114747 122.009612 1.114747 122.152768 1.103013 122.263070 1.070157 122.417961 1.070157 122.584586 1.025567 122.662032 0.948121 122.748865 0.927000 122.861513 0.882410 122.960080 0.894144 123.091503 0.959856 123.246394 0.980977 123.457609 0.948121 123.621887 0.927000 123.788513 0.903532 123.908201 0.894144 124.164006 0.959856 124.274307 1.058423 124.405730 1.213314 124.548887 1.347083 124.692044 1.436263 124.837548 1.624010 125.025295 1.724924 125.135596 1.713190 125.177839 1.656866 125.213041 1.513709 125.189573 1.370552 125.102740 1.203926 124.957236 1.037301 124.804692 0.882410 124.626333 0.638339 124.450320 0.483448 124.262573 0.361413 124.020849 0.361413 123.797900 0.316823 123.556176 0.305089 123.389551 0.305089 123.192416 0.438858 122.903756 0.492835 122.760599 0.504570 122.596320 0.504570 122.363984 0.483448 122.152768 0.459980 121.922779 0.415390 121.767887 0.492835 121.624731 0.504570 121.547285 0.459980 121.368926 0.516304 121.282093 0.504570 121.127202 0.415390 120.906599 0.427124 120.697731 0.459980 120.498250 0.459980 120.331624 0.272233 120.188467 0.028162 # -b 119.956131 0.471714 120.057045 0.682929 120.134490 0.760375 120.265913 0.903532 120.343359 0.903532 120.474781 0.793230 120.608551 0.816699 120.772829 1.004445 120.817419 1.236782 120.927721 1.302493 121.049756 1.325962 121.115467 1.325962 # -b 125.433644 3.717387 125.454765 3.717387 125.520477 3.661063 125.576801 3.541374 125.597922 3.473316 125.642512 3.353627 125.543945 3.541374 125.466500 3.639941 125.433644 3.717387 # -b 126.768993 4.536432 126.834705 4.536432 126.867560 4.447253 126.867560 4.348685 126.891029 4.247772 126.879294 4.071759 126.822970 4.027169 126.813583 4.203182 126.780727 4.402663 126.768993 4.536432 # -b 128.557282 2.654271 128.590137 2.588559 128.644114 2.522848 128.667583 2.433668 128.655849 2.299898 128.655849 2.299898 128.611259 2.201331 128.524426 2.055828 128.336679 2.055828 128.303823 2.189597 128.280355 2.311633 128.292089 2.445402 128.381269 2.555703 128.500957 2.654271 # -b 127.937717 2.222453 127.961185 2.234187 128.015163 2.213066 128.026897 2.112152 127.949451 1.978382 127.872006 1.912671 127.862618 1.846959 127.937717 1.778901 128.005775 1.570033 128.026897 1.415142 128.005775 1.269638 127.949451 1.192192 127.785173 1.025567 127.639669 0.927000 127.651403 0.882410 127.794560 0.849554 127.904861 0.971590 128.059752 1.081891 128.148932 1.248516 128.238112 1.415142 128.402390 1.513709 128.601871 1.525443 128.655849 1.480853 128.723907 1.325962 128.723907 1.093625 128.601871 0.992711 128.446980 0.882410 128.324945 0.804964 128.324945 0.736906 128.512692 0.614871 128.634727 0.549159 128.667583 0.415390 128.723907 0.337944 128.834208 0.260499 128.667583 0.251111 128.500957 0.349678 128.226378 0.406002 128.038631 0.471714 127.949451 0.361413 127.928330 0.061018 # -b 127.749970 -0.269886 127.717115 0.093873 127.695993 0.293354 127.597426 0.537425 127.597426 0.760375 127.552836 0.927000 127.475391 0.992711 127.376823 1.147602 127.397945 1.335349 127.419066 1.347083 127.463656 1.513709 127.552836 1.778901 127.651403 1.957260 127.827416 2.133273 127.937717 2.222453 # -b 109.965654 1.835225 110.108811 1.778901 110.219112 1.757780 110.329413 1.769514 110.451449 1.790635 110.540628 1.757780 110.660317 1.680334 110.815208 1.635744 110.916122 1.635744 111.080400 1.602888 111.124990 1.602888 111.136724 1.614623 111.157846 1.736658 111.214170 1.856347 111.223557 1.924405 111.223557 1.957260 111.247026 2.034706 111.291615 2.133273 111.268147 2.245921 111.247026 2.323367 111.333859 2.389078 111.455894 2.356222 111.479362 2.323367 111.479362 2.532235 111.479362 2.588559 111.512218 2.666005 111.577929 2.764572 111.643641 2.842017 111.721086 2.898341 111.831388 2.910076 111.920567 2.919463 112.019134 2.919463 112.096580 2.954665 112.084846 2.964053 112.084846 2.964053 112.117701 2.975787 112.185760 2.987521 112.251471 2.987521 112.373506 2.987521 112.526051 3.020377 112.648086 3.020377 112.770122 3.032111 112.868689 3.086088 112.990724 3.208124 113.068170 3.285569 113.145615 3.395870 113.199592 3.463929 113.267651 3.529640 113.321628 3.595351 113.377952 3.705653 113.443663 3.806567 113.509375 3.884012 113.586820 3.949724 113.640797 3.982579 113.729977 4.060025 113.807423 4.137470 113.863747 4.238384 113.905990 4.280627 113.941192 4.348685 113.962314 4.426131 113.974048 4.480108 113.983435 4.545820 113.983435 4.569288 114.006904 4.590410 # -b 114.006904 4.590410 114.018638 4.613878 114.039759 4.623265 114.105471 4.634999 114.204038 4.679589 114.293218 4.679589 114.382397 4.691323 114.469230 4.712445 114.603000 4.789890 114.725035 4.888458 114.811868 4.965903 114.901048 5.031615 114.955025 5.076204 114.978493 5.022227 114.999615 4.944782 115.055939 4.933047 115.088795 4.933047 115.133385 4.944782 115.175628 4.944782 115.220217 4.933047 115.243686 4.933047 # -b 115.243686 4.933047 115.276542 4.933047 115.353987 4.944782 115.440820 5.010493 115.530000 5.144263 115.562855 5.186506 115.464288 5.242830 115.419698 5.353131 115.497144 5.475166 115.583977 5.508022 115.661422 5.496288 115.771724 5.508022 115.884372 5.639445 116.004060 5.782602 116.060384 5.904637 116.104974 5.993817 116.114362 6.092384 116.215276 6.214419 116.292721 6.289518 116.367820 6.390432 116.435878 6.444409 116.513324 6.521855 116.567301 6.599300 116.633012 6.718989 116.665868 6.841024 116.743313 6.951326 116.787903 6.939591 116.799638 6.895002 116.799638 6.829290 116.799638 6.697867 116.766782 6.599300 116.766782 6.542976 116.844227 6.632156 116.909939 6.709602 116.963916 6.787047 117.031974 6.930204 117.163397 6.930204 117.207987 6.873880 117.252577 6.754192 117.297167 6.620422 117.351144 6.575832 117.416855 6.542976 117.494301 6.599300 117.571746 6.533589 117.637458 6.477265 117.672660 6.444409 117.705516 6.324721 117.714903 6.235541 117.660926 6.158095 117.660926 6.026673 117.672660 5.916371 117.705516 5.892903 117.771227 5.925759 117.836939 5.916371 117.935506 5.970349 118.036420 5.970349 118.090397 5.883516 118.081010 5.782602 118.003564 5.716890 118.045807 5.672301 118.134987 5.672301 118.245288 5.773214 118.343855 5.749746 118.465890 5.695769 118.609047 5.585468 118.754551 5.484554 118.907095 5.430576 119.019744 5.409455 119.139432 5.374252 119.249733 5.296807 119.273202 5.209974 119.228612 5.120794 119.052599 5.055083 118.930564 4.977637 118.742817 4.900192 118.641903 4.888458 118.543336 4.867336 118.400179 4.944782 118.268756 4.879070 118.245288 4.757035 118.257022 4.700711 118.289878 4.646734 118.400179 4.545820 118.477625 4.524698 118.576192 4.458987 118.599660 4.390929 118.489359 4.369807 118.355589 4.348685 118.245288 4.292361 118.146721 4.271240 118.045807 4.226650 117.926118 4.238384 117.836939 4.271240 117.726637 4.348685 117.705516 4.336951 117.672660 4.247772 117.660926 4.193794 # -b 117.660926 4.193794 117.660926 4.160939 117.637458 4.125736 117.550625 4.071759 117.449711 4.048291 117.595215 3.982579 117.693782 3.884012 117.825204 3.851156 117.825204 3.696265 117.726637 3.639941 117.595215 3.672797 117.562359 3.618820 117.473179 3.607086 117.318288 3.607086 117.240843 3.541374 117.297167 3.452194 117.383999 3.353627 117.461445 3.309038 117.473179 3.240979 117.407468 3.187002 117.449711 3.109557 117.571746 3.020377 117.649192 2.919463 117.714903 2.788040 117.815817 2.633149 117.958974 2.412547 118.045807 2.278777 117.991830 2.189597 117.970708 2.112152 117.926118 2.067562 117.914384 1.990116 117.947240 1.891549 118.113865 1.746045 118.278144 1.591154 118.477625 1.424529 118.677106 1.257904 118.864852 1.103013 118.975154 0.992711 118.975154 0.903532 118.808528 0.849554 118.587926 0.837820 118.465890 0.826086 118.310999 0.870676 118.191311 0.894144 118.102131 1.013833 118.045807 1.070157 118.003564 0.980977 118.069275 0.837820 118.045807 0.793230 117.848673 0.704051 117.714903 0.528038 117.628070 0.370800 117.583480 0.215909 117.583480 0.007041 # -b 119.130045 10.009252 118.951685 9.943540 118.820263 9.856708 118.754551 9.593862 118.543336 9.363872 118.343855 9.211328 118.146721 9.037662 117.926118 8.807672 117.759493 8.676249 117.604602 8.643394 117.494301 8.511971 117.374612 8.411057 117.240843 8.434525 117.297167 8.664515 117.428589 8.894505 117.562359 9.025928 117.825204 9.223062 117.935506 9.244184 118.102131 9.420196 118.268756 9.605596 118.510480 9.844973 # -b 119.878685 4.989371 119.845830 5.031615 119.902154 5.132528 119.967865 5.186506 # -b 120.134490 5.099673 119.979599 5.043349 119.878685 4.989371 # -b 119.791852 -0.049284 119.913888 0.150197 119.913888 0.260499 119.956131 0.471714 # -b 104.049282 1.436263 104.049282 1.525443 104.049282 1.525443 104.037548 1.525443 104.037548 1.546564 104.025814 1.546564 104.016427 1.546564 104.016427 1.558299 103.938981 1.558299 103.816946 1.501974 103.751234 1.370552 103.751234 1.335349 103.870923 1.325962 103.992958 1.358818 104.049282 1.436263 # -b 100.207513 6.444409 100.073744 6.676746 # -b 102.216404 6.190951 102.437007 6.202685 102.559042 6.059528 102.678731 5.925759 102.789032 5.838926 102.922801 5.738012 103.087080 5.618323 103.241971 5.409455 103.385128 5.186506 103.495429 4.977637 103.528285 4.745301 103.528285 4.414397 103.507163 4.193794 103.474308 3.970845 103.495429 3.684531 103.507163 3.496784 103.518898 3.231592 103.629199 2.886607 103.760622 2.799774 103.938981 2.654271 104.037548 2.400812 104.213561 2.055828 104.323862 1.868081 104.279272 1.579420 104.201827 1.447997 104.082138 1.513709 103.938981 1.579420 103.805211 1.647478 103.694910 1.579420 103.650320 1.469119 103.572875 1.403407 103.518898 1.436263 103.673789 1.391673 103.650320 1.391673 103.584609 1.403407 103.518898 1.480853 103.507163 1.501974 103.441452 1.457385 103.230237 1.656866 102.988513 1.802369 102.812500 1.879815 102.547308 2.091030 102.293850 2.189597 102.138958 2.323367 101.906622 2.522848 101.608574 2.731716 101.441948 2.910076 101.409093 3.142412 101.298792 3.374749 101.134513 3.562496 100.946766 3.818301 100.803609 4.006048 100.780141 4.137470 100.669840 4.336951 100.693308 4.602144 100.681574 4.822746 100.538417 4.933047 100.470359 5.120794 100.449237 5.418842 100.437503 5.705156 100.371792 5.949227 100.327202 6.268397 100.249756 6.432675 100.207513 6.444409 # -b 99.909465 9.244184 100.008032 9.058784 100.040888 8.763082 100.130068 8.500237 100.294346 8.324224 100.404647 8.148212 100.470359 7.819655 100.526683 7.512219 100.615862 7.324472 100.625250 7.315085 100.714430 7.258761 100.946766 6.984181 101.265936 6.930204 101.575718 6.895002 101.840910 6.686133 102.061513 6.432675 102.216404 6.190951 # -b 106.630801 10.086697 106.609679 9.988130 # -b 106.499378 10.009252 106.443054 9.910685 106.543968 9.725285 106.478257 9.572740 106.299897 9.638452 106.145006 9.823852 106.013583 9.943540 106.013583 9.737019 106.135619 9.561006 106.145006 9.429584 106.102763 9.375606 106.079295 9.354485 105.903282 9.288773 105.694414 9.201941 105.527788 9.037662 105.340042 8.784204 105.086583 8.598804 104.919958 8.587070 104.887102 8.676249 104.976282 8.751348 104.887102 8.971951 104.842513 9.190206 104.833125 9.396728 104.842513 9.561006 104.865981 9.692429 104.997404 9.868442 # -b 99.885997 3.130678 100.052622 2.942931 100.106599 2.755184 100.228635 2.731716 100.350670 2.698860 100.460971 2.478258 100.604128 2.323367 100.714430 2.213066 100.824731 2.133273 100.923298 2.091030 100.935032 2.168476 100.979622 2.255309 101.155635 2.255309 101.277670 2.168476 101.364503 2.013585 101.399705 1.912671 101.441948 1.823491 101.477151 1.769514 101.519394 1.736658 101.608574 1.692068 101.697753 1.656866 101.796321 1.647478 101.862032 1.614623 102.005189 1.525443 102.094369 1.492587 102.171814 1.403407 102.216404 1.325962 102.282115 1.203926 102.359561 1.159337 102.371295 1.293106 102.371295 1.358818 102.446394 1.314228 102.535574 1.180458 102.669343 1.081891 102.821888 1.093625 103.021368 1.103013 103.164525 1.025567 103.209115 0.971590 103.187994 0.927000 103.176260 0.870676 103.122282 0.804964 103.042490 0.804964 103.065958 0.682929 103.098814 0.605483 103.110548 0.605483 103.131670 0.560894 103.131670 0.438858 103.009634 0.361413 102.911067 0.305089 102.889946 0.260499 102.922801 0.239377 103.042490 0.293354 103.164525 0.349678 103.286561 0.438858 103.408596 0.492835 103.507163 0.528038 103.596343 0.471714 103.739500 0.328557 103.816946 0.173666 103.838067 0.072752 # -b 101.817442 1.790635 101.730609 1.802369 101.730609 1.802369 101.697753 1.835225 101.641429 1.856347 101.596840 1.912671 101.552250 1.968995 101.542862 2.022972 101.552250 2.067562 101.620308 2.067562 101.697753 2.112152 101.784586 2.133273 101.840910 2.079296 101.894888 2.046440 101.894888 1.945526 101.894888 1.879815 101.873766 1.823491 101.840910 1.802369 101.817442 1.790635 # -b 102.160080 1.668600 102.160080 1.668600 102.204670 1.668600 102.303237 1.624010 102.371295 1.635744 102.458128 1.624010 102.523839 1.614623 102.580163 1.447997 102.601285 1.370552 102.580163 1.347083 102.547308 1.391673 102.469862 1.447997 102.371295 1.480853 102.270381 1.534830 102.192936 1.614623 102.160080 1.668600 # -b 104.666500 1.171071 104.743945 1.114747 104.765067 1.004445 104.732211 0.894144 104.645378 0.882410 104.600789 0.992711 104.544464 1.070157 104.457632 1.070157 104.424776 1.180458 104.445897 1.213314 104.535077 1.225048 104.621910 1.203926 104.666500 1.171071 # -b 109.623016 2.055828 109.679340 2.100417 109.723930 2.123886 109.745051 2.055828 109.777907 1.957260 109.843618 1.879815 109.965654 1.835225 # -b 109.202932 -0.082139 109.193545 0.138463 109.092631 0.316823 109.026920 0.382534 109.005798 0.483448 108.994064 0.638339 108.994064 0.816699 109.005798 0.927000 109.017532 1.058423 109.059775 1.225048 109.127833 1.415142 109.202932 1.579420 109.336702 1.724924 109.458737 1.945526 109.557304 2.001850 109.623016 2.055828 # -b 100.073744 6.676746 99.930587 6.819903 99.787430 6.972447 99.686516 7.225905 99.477647 7.413652 99.313369 7.655376 99.212455 7.807920 99.102154 7.864245 98.926141 8.040257 98.738394 8.258513 98.550648 8.246779 98.384022 8.225657 98.330045 8.389936 98.330045 8.664515 98.362901 8.981338 98.440346 9.255918 98.527179 9.551619 98.616359 9.812118 98.639827 9.964662 # -b 99.191334 10.009252 99.224189 9.704163 99.268779 9.396728 99.322756 9.244184 99.501116 9.201941 99.731106 9.288773 99.909465 9.244184 # -b 98.384022 8.115356 98.339432 8.105969 98.339432 7.939343 98.384022 7.840776 98.484936 7.929956 98.494324 8.049644 98.419225 8.148212 98.384022 8.115356 # -b 93.847590 7.282229 93.758410 7.303351 93.680965 7.204784 93.680965 7.028771 93.749023 6.829290 93.859324 6.951326 93.892180 7.181315 93.859324 7.315085 93.758410 7.303351 # -b 95.326096 5.606589 95.326096 5.594855 95.370686 5.606589 95.436397 5.606589 95.492721 5.630057 95.504456 5.630057 95.525577 5.630057 95.537311 5.630057 95.546699 5.630057 95.614757 5.630057 95.725058 5.630057 95.835359 5.606589 95.933926 5.552612 96.011372 5.442311 96.077083 5.341397 96.210853 5.332009 96.321154 5.320275 96.431455 5.263951 96.562878 5.263951 96.661445 5.254564 96.816336 5.275685 96.982962 5.287420 97.137853 5.275685 97.313865 5.186506 97.534468 5.198240 97.689359 5.165384 97.820782 5.055083 97.975673 4.933047 98.053119 4.801625 98.064853 4.691323 98.130564 4.590410 98.264334 4.512964 98.362901 4.348685 98.395756 4.292361 98.440346 4.170326 98.527179 4.092880 98.672683 3.982579 98.759516 3.872278 98.881551 3.750243 99.090420 3.661063 99.289901 3.562496 99.510503 3.463929 99.644273 3.330159 99.885997 3.130678 # -b 99.963442 -0.147851 99.864875 0.028162 99.721718 0.138463 99.543359 0.251111 99.411936 0.251111 99.379080 0.260499 99.355612 0.293354 99.301635 0.483448 99.268779 0.671195 99.212455 0.849554 99.146744 1.070157 99.057564 1.281372 98.937875 1.501974 98.937875 1.692068 98.792372 1.868081 98.604625 2.046440 98.419225 2.145007 98.252600 2.234187 98.076587 2.299898 97.855984 2.332754 97.799660 2.522848 97.755070 2.710595 97.701093 2.898341 97.567324 2.942931 97.557936 2.987521 97.513346 3.053233 97.424167 3.142412 97.334987 3.297303 97.215298 3.473316 97.027552 3.651675 96.884395 3.740855 96.696648 3.740855 96.508901 3.916868 96.354010 4.104615 96.231974 4.214916 96.065349 4.315830 95.901071 4.491842 95.790769 4.613878 95.647613 4.768769 95.546699 4.900192 95.459866 5.066817 95.382420 5.231096 95.370686 5.332009 95.370686 5.418842 95.358952 5.552612 95.326096 5.606589 # -b 95.868215 2.809162 95.844747 2.865486 95.879949 2.877220 95.922192 2.919463 96.055962 2.832630 96.199119 2.731716 96.342276 2.644883 96.476045 2.543969 96.530023 2.445402 96.551144 2.377344 96.530023 2.367957 96.407987 2.478258 96.231974 2.532235 96.077083 2.621415 95.945661 2.698860 95.868215 2.809162 # -b 97.302131 1.403407 97.292744 1.457385 97.334987 1.480853 97.424167 1.513709 97.501612 1.546564 97.644769 1.415142 97.755070 1.257904 97.855984 1.171071 98.031997 1.025567 98.041384 0.971590 98.041384 0.870676 98.053119 0.760375 98.053119 0.694663 98.008529 0.614871 97.909962 0.614871 97.820782 0.793230 97.743336 0.903532 97.644769 0.980977 97.534468 1.081891 97.424167 1.248516 97.370189 1.314228 97.334987 1.370552 97.302131 1.403407 # -b 80.024731 9.812118 80.024731 9.812118 # -b 79.926164 9.746406 80.048199 9.650186 80.203091 9.584475 80.278189 9.462439 80.191356 9.474173 80.081055 9.354485 80.048199 9.112761 # -b 79.893308 6.510121 80.048199 6.202685 80.212478 6.014938 80.510526 5.958614 80.754597 5.958614 80.951731 6.059528 81.240392 6.223807 81.526706 6.423288 81.735574 6.718989 81.791898 7.160194 81.813019 7.533341 81.780164 7.688232 81.658128 7.732822 81.571295 7.951077 81.482116 8.225657 81.371814 8.455647 81.240392 8.565948 81.195802 8.676249 81.195802 8.697371 81.130090 8.807672 81.106622 8.817060 81.040911 8.894505 80.918875 9.004806 80.853164 9.190206 80.665417 9.408462 80.501139 9.584475 80.334513 9.737019 80.179622 9.802730 80.024731 9.812118 # -b 79.186911 10.096085 79.154055 9.964662 79.032020 9.802730 78.900597 9.617330 78.877129 9.441318 78.888863 9.321629 78.900597 9.265305 78.787949 9.244184 78.590815 9.223062 78.391334 9.136229 78.182465 9.025928 78.149610 8.960217 78.126141 8.849915 78.048696 8.652781 78.072164 8.577682 78.027574 8.479115 77.917273 8.368814 77.839828 8.324224 77.795238 8.303103 77.795238 8.258513 77.640347 8.115356 77.330564 8.105969 77.100574 8.303103 76.835382 8.631660 76.603045 8.981338 76.481010 9.232449 76.337853 9.746406 # -b 80.024731 9.812118 79.926164 9.746406 # -b 80.048199 9.112761 79.926164 8.948482 79.905042 8.741961 79.869840 8.544827 79.827597 8.324224 79.804129 8.094234 79.726683 8.148212 79.672706 8.094234 79.672706 7.807920 79.726683 7.413652 79.771273 7.094483 79.815863 6.796435 79.893308 6.510121 # -b 50.832449 10.159449 50.755003 9.884870 50.710413 9.633758 50.722148 9.403768 50.656436 9.206634 50.555522 8.988379 50.402978 8.856956 50.325533 8.626966 50.170641 8.453300 50.072074 8.211576 # -b 50.072074 8.211576 49.994629 8.166986 49.872593 8.035563 49.806882 7.880672 49.762292 7.641295 49.663725 7.474670 49.553424 7.244680 49.389145 6.970100 49.288231 6.803475 49.168543 6.606341 49.091097 6.430328 49.091097 6.507774 49.067629 6.341149 49.023039 6.054835 48.947940 5.834232 48.804783 5.613630 48.551325 5.416495 48.351844 5.205280 48.142976 4.984678 48.065530 4.742954 47.966963 4.510617 47.767482 4.266546 47.645447 4.090534 47.436578 3.858197 47.194854 3.637594 47.084553 3.438113 46.917928 3.304344 46.819361 3.205777 46.687938 3.095476 46.587024 3.039151 46.422746 2.917116 46.288976 2.684779 46.178675 2.574478 46.047252 2.452443 45.915829 2.330407 45.704614 2.166129 45.507480 2.032359 45.307999 1.931445 45.099131 1.889202 44.845672 1.743699 44.735371 1.666253 44.613336 1.567686 44.416202 1.412795 44.338756 1.368205 44.204986 1.213314 44.007852 1.067810 43.820106 0.880063 43.632359 0.701704 43.500936 0.570281 43.390635 0.481101 43.247478 0.326210 43.137177 0.192440 # -b 36.101365 4.522351 36.091977 4.522351 36.211666 4.367460 36.300846 4.179713 36.300846 3.935643 36.366557 3.736162 36.289112 3.637594 36.312580 3.360668 36.378291 3.083741 36.521448 2.863139 36.631750 2.762225 36.720929 2.675392 36.742051 2.508767 36.753785 2.353876 36.664605 2.363263 36.631750 2.520501 36.566038 2.717635 36.422881 2.851405 36.211666 2.985174 36.091977 3.217511 36.047388 3.438113 35.969942 3.593005 35.892496 3.891053 35.915965 4.179713 35.958208 4.388582 35.991064 4.522351 # -b 34.029109 0.237030 34.019722 0.114995 # -b 34.073699 0.237030 33.975132 0.204175 33.808507 0.248765 33.665350 0.192440 33.423626 0.281620 33.301590 0.359066 33.203023 0.237030 33.080988 0.058671 32.937831 0.126729 32.740697 0.147851 32.651517 0.204175 32.618661 0.093873 32.529482 0.058671 32.419180 0.103261 # -b 5.001106 5.824845 4.965903 5.911678 4.822746 6.099424 4.592756 6.221460 4.449599 6.308293 4.271240 6.352883 4.074106 6.364617 3.865237 6.385738 3.543721 6.376351 3.248020 6.352883 2.982827 6.331761 2.872526 6.331761 2.795081 6.320027 # -b 2.795081 6.320027 2.729369 6.320027 2.574478 6.308293 2.332754 6.275437 2.121539 6.266050 1.978382 6.254316 # -b 1.978382 6.254316 1.825838 6.221460 1.605235 6.165136 1.372899 6.099424 1.274331 6.054835 # -b 1.274331 6.054835 1.218007 6.033713 1.095972 5.869435 1.009139 5.747399 0.842514 5.714544 0.767415 5.780255 0.621911 5.747399 0.403656 5.723931 0.192440 5.669954 # -b 5.001106 5.824845 5.076204 5.813111 5.120794 5.702809 5.186506 5.637098 5.254564 5.449351 5.385987 5.404761 5.451698 5.404761 5.353131 5.339050 5.364865 5.130182 5.451698 4.796931 5.561999 4.698364 5.672301 4.576329 5.761480 4.421437 5.982083 4.355726 6.167483 4.379194 6.212073 4.212569 6.411554 4.311136 6.533589 4.379194 6.566445 4.343992 6.632156 4.388582 6.730723 4.334604 6.787047 4.379194 6.829290 4.379194 6.897348 4.412050 6.963060 4.498883 7.028771 4.531739 7.106217 4.653774 7.249374 4.599797 7.523953 4.477761 7.735169 4.498883 7.932303 4.498883 8.152905 4.489496 8.176374 4.698364 8.242085 4.864989 8.340652 4.829787 8.396976 4.742954 # -b 9.232449 -0.194787 9.255918 0.248765 9.333363 0.237030 9.420196 0.147851 9.575087 0.093873 9.795690 0.082139 9.840280 0.136116 9.783956 0.180706 9.619677 0.213562 9.476520 0.314476 9.377953 0.403656 9.309895 0.513957 9.342751 0.603137 9.476520 0.612524 9.530497 0.701704 9.521110 0.880063 9.521110 0.978630 # -b 9.521110 0.978630 9.530497 0.957509 9.575087 1.023220 9.563353 1.067810 9.309895 1.222701 9.342751 1.290759 9.443665 1.433916 9.509376 1.544218 9.553966 1.755433 9.673654 1.987769 9.673654 2.166129 # -b 9.673654 2.166129 9.685389 2.231840 9.708857 2.321020 9.718244 2.541622 9.762834 2.795081 9.840280 3.083741 9.852014 3.194043 9.884870 3.238632 9.783956 3.372402 9.664267 3.494438 9.631411 3.560149 9.542232 3.682184 9.542232 3.747896 9.607943 3.769017 9.640799 3.846463 9.631411 4.001354 9.575087 4.045944 9.453052 4.034210 9.431930 3.968498 9.342751 3.947377 9.133882 4.024822 8.981338 4.102268 8.892158 4.266546 8.835834 4.421437 8.793591 4.543473 8.725533 4.543473 8.615232 4.543473 8.528399 4.510617 8.439219 4.566941 8.439219 4.609184 8.450953 4.677242 8.396976 4.742954 # -b 8.605844 3.813607 8.638700 3.792486 8.725533 3.747896 8.814713 3.703306 8.880424 3.625860 8.859303 3.515559 8.793591 3.337200 8.659822 3.262101 8.516665 3.294957 8.418098 3.393524 8.439219 3.449848 8.507277 3.581270 8.582376 3.747896 8.605844 3.813607 # -b 6.488999 0.314476 6.444409 0.326210 6.444409 0.237030 6.444409 0.082139 6.488999 0.082139 6.566445 0.171319 6.632156 0.302742 6.566445 0.302742 6.488999 0.314476 # -b -14.029380 9.971702 -14.249983 10.114859 -14.348550 10.168837 -14.437730 10.311994 -14.482320 10.419948 -14.503441 10.572492 -14.491707 10.659325 -14.580887 10.659325 -14.670066 10.692181 -14.670066 10.746158 -14.702922 10.856459 -14.691188 10.964414 -14.747512 10.952680 -14.822611 10.856459 -14.878935 10.769626 -14.968114 10.746158 -15.054947 10.832991 # -b -15.054947 10.832991 -15.087803 10.877581 -15.054947 11.051247 -15.022092 11.095836 -15.176983 11.072368 -15.275550 11.095836 -15.352995 11.203791 -15.385851 11.335214 -15.352995 11.431434 -15.331874 11.508879 -15.397585 11.616834 -15.430441 11.703667 -15.296671 11.799887 -15.198104 11.832743 -15.043213 11.844477 -14.857813 11.853864 -14.834345 11.943044 -15.043213 11.919576 -15.275550 11.898454 -15.418707 11.853864 -15.672165 11.736522 -15.815322 11.713054 -15.881033 11.736522 -15.892767 11.877333 -16.003069 11.865598 -16.190816 11.898454 -16.256527 11.985287 -16.268261 12.083854 -16.268261 12.147219 -16.432540 12.191808 # -b -16.432540 12.191808 -16.643755 12.255173 -16.754056 12.395983 -16.718853 12.548527 -16.718853 12.764436 -16.709466 12.893512 -16.697732 13.013201 # -b -16.697732 13.013201 -16.685998 13.078912 -16.718853 13.207988 -16.676610 13.391041 -16.620286 13.433284 -16.542841 13.337064 -16.444274 13.261965 -16.333972 13.238497 -16.301117 13.271353 -16.378562 13.358186 -16.399684 13.454406 # -b -16.399684 13.454406 -16.432540 13.541239 -16.500598 13.691436 -16.500598 13.757148 -16.653142 13.949588 -16.763443 14.186618 -16.906600 14.433036 -17.073226 14.594968 -17.183527 14.679454 -17.204648 14.724044 -17.204648 14.745165 -17.150671 14.841385 -17.007514 14.970461 -16.754056 15.289631 -16.521719 15.686246 -16.411418 15.866952 -16.399684 15.909195 # -b -16.399684 15.909195 -16.399684 15.942051 -16.399684 16.132145 -16.399684 16.556922 -16.333972 16.939456 -16.134492 17.385355 -16.024190 17.702177 -15.991335 18.122261 -15.981947 18.417962 -16.035924 18.901410 -16.101636 19.016405 -16.223671 19.131400 -16.345707 19.288638 -16.444274 19.413020 -16.465395 19.464651 -16.399684 19.455263 -16.345707 19.528015 -16.256527 19.694640 -16.202550 19.934018 # -b -15.881033 11.095836 -16.003069 11.105224 -16.134492 11.051247 -16.092248 10.943292 -15.937357 11.030125 -15.881033 11.095836 # -b -24.989100 17.141284 -25.188581 17.120162 -25.298883 17.120162 -25.275414 16.951190 -25.242559 16.908947 -25.078280 16.960577 -24.967979 17.035676 -24.944511 17.087307 -24.989100 17.141284 # -b -23.930678 16.556922 -23.975268 16.580390 -24.094956 16.589778 -24.249847 16.610899 -24.315559 16.622633 -24.327293 16.526413 -24.282703 16.472436 -24.216992 16.526413 -24.163014 16.535800 -24.029245 16.535800 -23.930678 16.556922 # -b -22.893377 16.887826 -22.905111 16.876091 -22.926232 16.737628 -22.926232 16.632021 -22.851134 16.632021 -22.815931 16.779871 -22.883989 16.866704 -22.893377 16.887826 # -b -22.872255 16.122757 -22.740832 16.143879 -22.663387 16.101636 -22.639918 15.984294 -22.740832 15.897461 -22.827665 15.897461 -22.883989 15.972560 -22.905111 16.035924 -22.872255 16.122757 # -b -23.698341 15.247388 -23.721809 15.247388 -23.721809 15.045560 -23.721809 14.883628 -23.611508 14.850773 -23.435496 14.904750 -23.390906 15.000970 -23.444883 15.076069 -23.578653 15.184023 -23.698341 15.247388 # -b -24.339027 14.916484 -24.348414 14.916484 -24.437594 14.904750 -24.458716 14.820264 -24.425860 14.766287 -24.339027 14.754552 -24.273316 14.829651 -24.339027 14.916484 # -b -70.060069 18.385106 -69.884056 18.469592 -69.729165 18.460205 -69.532031 18.439084 -69.320816 18.439084 -69.123682 18.439084 -68.924201 18.385106 -68.813900 18.270111 -68.661355 18.248990 -68.527586 18.354598 -68.417285 18.511835 -68.384429 18.680808 -68.506464 18.744172 -68.605031 18.816924 -68.703598 18.931919 -68.825634 19.004671 -69.013381 19.046914 -69.156538 19.058648 -69.201127 19.058648 -69.255105 19.068035 -69.398262 19.089157 -69.597743 19.161909 -69.597743 19.192418 -69.377140 19.173643 -69.233983 19.255782 -69.377140 19.361390 -69.609477 19.328534 -69.839467 19.464651 -69.949768 19.643010 # -b -66.046981 18.502448 -66.058715 18.523570 -65.892090 18.469592 -65.760667 18.385106 -65.671487 18.281846 -65.805257 18.164504 -65.981270 18.007266 -66.246462 17.974410 -66.455330 17.943901 -66.621956 17.995532 -66.830824 17.995532 -67.051426 17.974410 -67.203971 18.007266 -67.194583 18.197360 -67.239173 18.333476 -67.248561 18.439084 -67.138259 18.523570 -66.950513 18.532957 -66.697054 18.532957 -66.476452 18.532957 -66.246462 18.523570 -66.046981 18.502448 # -b -64.934581 18.406228 -65.021414 18.342863 -65.012027 18.291233 -64.934581 18.312355 -64.934581 18.406228 # -b -64.845401 17.765542 -64.868870 17.732686 -64.845401 17.681056 -64.735100 17.786663 -64.845401 17.765542 # -b -62.409387 9.896604 -62.463364 10.159449 -62.507954 10.180571 -62.597133 10.222814 -62.662845 10.333115 -62.728556 10.365971 -62.871713 10.365971 -62.960893 10.387092 -62.960893 10.506781 -62.716822 10.551371 -62.585399 10.551371 -62.507954 10.527902 -62.353063 10.527902 -62.233374 10.638204 -62.144194 10.638204 -61.979916 10.680447 -61.956447 10.725037 -62.209906 10.736771 -62.287351 10.746158 -62.287351 10.713302 -62.376531 10.692181 -62.618255 10.713302 -62.773146 10.746158 -62.928037 10.746158 -63.125171 10.757892 -63.291797 10.769626 -63.578110 10.713302 -63.831569 10.692181 -63.974726 10.692181 -64.129617 10.680447 -64.228184 10.671059 -64.249305 10.593614 -64.249305 10.560758 -64.139004 10.572492 -64.040437 10.572492 -63.852690 10.560758 -63.721267 10.539637 -63.697799 10.506781 -63.897280 10.431682 -64.183594 10.473925 -64.359607 10.375358 -64.493376 10.288525 -64.547353 10.246282 -64.713979 10.201692 -65.033148 10.147715 -65.274872 10.147715 -65.396908 10.168837 -65.408642 10.168837 -65.540065 10.168837 -65.716077 10.255670 -65.960148 10.398826 -66.025860 10.464538 -66.035247 10.473925 -66.046981 10.473925 -66.046981 10.518515 -66.046981 10.638204 -66.180751 10.659325 -66.366151 10.671059 -66.765113 10.638204 -66.973981 10.638204 -67.293150 10.572492 -67.612320 10.527902 -67.800067 10.495047 -67.889247 10.485659 -68.076993 10.527902 -68.196682 10.647591 -68.264740 10.800135 -68.274128 10.811869 -68.274128 10.877581 -68.241272 10.889315 -68.274128 11.084102 -68.363307 11.248381 -68.560441 11.302358 -68.682477 11.365723 -68.759922 11.419700 -68.992259 11.431434 -69.013381 11.431434 -69.123682 11.485411 -69.189393 11.508879 -69.210515 11.508879 -69.222249 11.508879 -69.266839 11.518267 -69.356019 11.508879 -69.431117 11.530001 -69.487441 11.530001 -69.586008 11.530001 -69.609477 11.572244 -69.630598 11.595712 -69.663454 11.637955 -69.708044 11.703667 -69.729165 11.757644 -69.762021 11.931310 -69.830079 12.147219 -69.940381 12.245786 # -b -70.017826 11.637955 -69.928646 11.670811 -69.872322 11.682545 -69.818345 11.551123 -69.818345 11.443168 -69.982624 11.431434 # -b -69.046236 12.299763 -69.123682 12.419452 -69.123682 12.386596 -69.111948 12.288029 -69.046236 12.191808 -68.935935 12.147219 -68.804512 12.093241 -68.804512 12.147219 -68.935935 12.201196 -69.046236 12.299763 # -b -68.375041 12.288029 -68.440753 12.342006 -68.396163 12.255173 -68.318717 12.180074 -68.274128 12.083854 -68.241272 12.072120 -68.220150 12.224664 -68.274128 12.266907 -68.375041 12.288029 # -b -63.897280 11.170935 -63.831569 11.116958 -63.786979 10.997269 -63.897280 10.943292 -64.007581 10.877581 -64.096761 10.898702 -64.162472 10.943292 -64.326751 10.943292 -64.371341 11.039512 -64.293895 11.095836 -64.195328 11.095836 -64.106148 11.030125 -63.974726 11.126345 -63.897280 11.170935 # -b -61.548098 12.180074 -61.592688 12.158953 -61.649012 12.137831 -61.702989 11.985287 -61.583301 12.050998 -61.548098 12.180074 # -b -61.031794 13.304208 -61.074037 13.283087 -61.085772 13.154011 -61.074037 13.067178 -61.031794 13.121155 -61.031794 13.261965 -61.031794 13.304208 # -b -60.921493 14.036421 -60.942615 13.940201 -60.975470 13.811125 -60.998939 13.736026 -60.921493 13.712558 -60.853435 13.745413 -60.853435 13.841634 -60.876903 13.973056 -60.921493 14.036421 # -b -61.196073 14.904750 -61.106893 14.883628 -60.998939 14.775674 -60.930880 14.627823 -60.853435 14.477626 -60.876903 14.454158 -60.998939 14.433036 -61.052916 14.477626 -61.118627 14.637211 -61.184339 14.754552 -61.207807 14.829651 -61.196073 14.904750 # -b -61.318108 15.620535 -61.372085 15.620535 -61.372085 15.514927 -61.372085 15.355342 -61.327496 15.238000 -61.240663 15.238000 -61.207807 15.343608 -61.217194 15.439828 -61.217194 15.557170 -61.318108 15.620535 # -b -61.416675 16.505291 -61.494121 16.493557 -61.515242 16.430193 -61.548098 16.345707 -61.649012 16.345707 -61.747579 16.366828 -61.803903 16.186122 -61.780435 16.014803 -61.637278 16.005416 -61.583301 16.186122 -61.538711 16.218978 -61.383820 16.228365 -61.252397 16.282342 -61.273518 16.345707 -61.372085 16.387950 -61.416675 16.505291 # -b -61.825025 17.153018 -61.846146 17.141284 -61.879002 17.066185 -61.869615 17.002821 -61.803903 16.993433 -61.714723 17.045064 -61.702989 17.087307 -61.768701 17.120162 -61.825025 17.153018 # -b -62.784880 17.427598 -62.895181 17.436985 -62.859979 17.343112 -62.794268 17.289134 -62.749678 17.310256 -62.749678 17.406476 -62.784880 17.427598 # -b -60.513144 11.344601 -60.522531 11.344601 -60.623445 11.311745 -60.722012 11.224912 -60.787724 11.182669 -60.743134 11.149814 -60.590589 11.248381 -60.513144 11.344601 # -b -60.942615 10.832991 -61.118627 10.811869 -61.494121 10.757892 -61.693602 10.671059 -61.571566 10.201692 -61.702989 10.126594 -61.759313 10.093738 -61.482387 10.070270 -61.252397 10.060882 -61.031794 10.159449 -60.963736 10.321381 -60.987204 10.539637 -60.987204 10.647591 -60.963736 10.757892 -60.942615 10.811869 -60.942615 10.832991 # -b -74.955567 20.006769 -75.274737 19.882387 -75.485952 19.882387 -75.781653 19.945752 -76.046846 19.955139 -76.300304 19.955139 -76.598352 19.976261 -76.917521 19.924630 -77.138124 19.891775 -77.337605 19.861266 -77.656774 19.840144 # -b -77.149858 18.469592 -77.072412 18.460205 -77.039557 18.439084 -76.908134 18.375719 -76.797833 18.260724 -76.642942 18.248990 -76.422339 18.248990 -76.344894 18.058896 -76.290916 17.922780 -76.466929 17.892271 -76.732121 17.965023 -76.929256 17.892271 -77.095881 17.892271 -77.161592 17.774929 -77.370461 17.786663 -77.469028 17.871150 -77.722486 17.892271 -77.877377 18.016653 -78.020534 18.155117 -78.220015 18.218481 -78.339703 18.342863 -78.306848 18.427349 -78.121448 18.481327 -77.966557 18.544691 -77.900845 18.565813 -77.722486 18.554079 -77.591063 18.523570 -77.447906 18.502448 -77.293015 18.481327 -77.149858 18.469592 # -b -73.047590 18.962428 -73.014735 18.941306 -72.895046 18.889676 -72.862190 18.732438 -72.993613 18.795803 -73.235337 18.816924 -73.324517 18.941306 -73.225950 18.983549 -73.047590 18.962428 # -b -71.803768 19.797901 -71.911722 19.767392 -72.132325 19.736883 -72.364661 19.758005 -72.629854 19.891775 -72.895046 19.955139 -73.202481 19.945752 -73.479408 19.779126 -73.411350 19.631276 -73.258805 19.652397 -73.038203 19.652397 -72.838722 19.518628 -72.794132 19.382511 -72.805866 19.204152 -72.817600 19.089157 -72.761276 18.995284 -72.585264 18.838046 -72.442107 18.732438 -72.453841 18.575200 -72.695565 18.523570 -72.949023 18.469592 -73.258805 18.481327 -73.554507 18.523570 -73.589709 18.584587 -73.819699 18.584587 -74.096626 18.626830 -74.359471 18.617443 -74.427529 18.439084 -74.284372 18.270111 -74.040301 18.227868 -73.908879 18.058896 -73.819699 18.164504 -73.643686 18.260724 -73.378494 18.260724 -73.181360 18.227868 -72.937289 18.185625 -72.784745 18.143382 -72.641588 18.155117 -72.552408 18.206747 -72.320071 18.270111 -72.132325 18.260724 -71.946925 18.122261 -71.768565 18.049509 # -b -71.768565 18.049509 -71.702854 17.953289 -71.693466 17.838294 -71.616021 17.765542 -71.550309 17.659934 -71.416540 17.723299 -71.252261 17.943901 -71.130226 18.164504 -71.031659 18.302967 -70.876768 18.363985 -70.700755 18.439084 -70.656165 18.312355 -70.524742 18.206747 -70.268937 18.248990 -70.060069 18.385106 # -b -69.949768 19.643010 -70.182105 19.664132 -70.435563 19.809635 -70.667899 19.830757 -70.921358 19.903509 -71.118492 19.912896 -71.306239 19.873000 -71.505720 19.924630 -71.702854 19.873000 -71.803768 19.797901 # -b -71.306239 11.823355 -71.261649 11.964165 -71.195937 12.093241 -71.195937 12.147219 -71.228793 12.224664 -71.317973 12.332619 -71.362563 12.374862 -71.461130 12.419452 -71.505720 12.428839 -71.693466 12.503938 -71.768565 12.503938 -71.836623 12.374862 -71.911722 12.365474 -71.911722 12.266907 -71.935190 12.224664 -72.066613 12.212930 -72.122937 12.158953 -72.200383 12.050998 -72.287216 11.877333 -72.430373 11.745910 -72.606385 11.682545 -72.728421 11.649690 -72.805866 11.626221 -72.895046 11.562857 -72.960757 11.518267 -73.059324 11.464290 -73.157891 11.377457 -73.235337 11.365723 -73.423084 11.290624 -73.589709 11.269502 -73.753988 11.278890 -73.920613 11.311745 -73.986324 11.323479 -74.007446 11.323479 -74.206927 11.290624 -74.326615 11.182669 -74.371205 10.997269 -74.514362 10.952680 -74.680987 10.964414 -74.800676 10.985535 -74.845266 11.009004 -75.044747 10.976148 -75.187904 10.877581 -75.385038 10.736771 -75.584519 10.617082 -75.629109 10.518515 -75.629109 10.354237 -75.638496 10.213426 -75.671352 10.016292 # -b -69.940381 12.245786 -70.083537 12.168340 -70.193839 12.006409 -70.280672 11.886720 -70.280672 11.713054 -70.203226 11.637955 -70.017826 11.637955 # -b -69.982624 11.431434 -70.259550 11.398578 -70.468418 11.323479 -70.623310 11.278890 -70.998803 11.138080 -71.195937 11.051247 -71.350828 10.952680 -71.395418 10.823604 -71.440008 10.746158 -71.461130 10.527902 -71.428274 10.354237 -71.317973 10.114859 # -b -72.012636 9.875482 -71.902335 10.103125 -71.869479 10.222814 -71.714588 10.387092 -71.604287 10.527902 -71.550309 10.617082 -71.550309 10.692181 -71.604287 10.877581 -71.604287 10.943292 -71.625408 11.018391 -71.759178 11.257768 -71.857745 11.410312 -71.890601 11.530001 -71.780299 11.605100 -71.604287 11.649690 -71.493985 11.670811 -71.395418 11.703667 -71.329707 11.790500 -71.306239 11.823355 # -b -87.492360 20.018504 -87.579193 19.851878 -87.689495 19.706375 -87.546338 19.643010 -87.536950 19.528015 -87.689495 19.422408 -87.602662 19.361390 -87.558072 19.288638 -87.602662 19.110278 -87.689495 18.859167 -87.757553 18.690195 -87.778674 18.490714 -87.832652 18.291233 -87.877241 18.122261 -87.942953 18.037775 -87.987543 18.206747 -87.966421 18.460205 -88.011011 18.523570 -88.086110 18.532957 -88.121312 18.544691 -88.097844 18.626830 -88.064988 18.816924 -88.196411 18.859167 -88.285591 18.732438 -88.395892 18.575200 # -b -88.395892 18.575200 -88.417013 18.406228 -88.363036 18.375719 -88.285591 18.396841 -88.163555 18.248990 -88.175289 17.986144 -88.264469 17.774929 -88.306712 17.479228 -88.318446 17.174139 -88.318446 16.845583 -88.339568 16.653142 -88.449869 16.472436 -88.560170 16.387950 -88.703327 16.270608 -88.837097 16.153266 -88.923930 15.909195 -88.959132 15.897461 # -b -88.959132 15.897461 -88.891074 15.920930 -88.804241 15.812975 -88.693940 15.728489 -88.571905 15.770732 -88.517927 15.834097 -88.649350 15.737876 -88.637616 15.737876 -88.616494 15.834097 -88.494459 15.855218 -88.339568 15.728489 # -b -88.285591 15.728489 -88.273857 15.728489 -88.154168 15.716755 -88.020398 15.782466 -87.832652 15.855218 -87.612049 15.845831 -87.337469 15.791854 -87.095745 15.770732 -86.785963 15.803588 -86.544239 15.845831 -86.300168 15.876340 -86.046710 15.920930 -85.992733 15.993681 -85.826107 15.984294 -85.661829 15.876340 -85.539794 15.876340 -85.342659 15.909195 -85.154913 15.951438 -85.000022 15.942051 -84.845130 15.876340 -84.624528 15.834097 -84.460249 15.834097 -84.338214 15.812975 -84.206791 15.728489 -84.096490 15.632269 -83.986189 15.514927 -83.819563 15.439828 -83.699875 15.355342 -83.566105 15.310752 -83.411214 15.226266 -83.303260 15.076069 -83.279791 14.895363 # -b -83.279791 14.895363 -83.291526 14.670066 -83.268057 14.369671 -83.521515 13.766535 -83.566105 13.337064 -83.577839 13.046056 -83.566105 12.851269 -83.589574 12.677603 -83.655285 12.482816 -83.655285 12.212930 -83.709262 12.050998 -83.699875 11.832743 -83.699875 11.691933 -83.774974 11.530001 -83.864153 11.344601 -83.843032 11.159201 -83.676407 10.877581 # -b -83.676407 10.877581 -83.655285 10.769626 -83.566105 10.572492 -83.434683 10.365971 -83.235202 10.114859 # -b -84.791153 9.938847 -84.889720 10.028027 -85.021143 10.103125 -85.154913 10.159449 -85.220624 10.114859 -85.176034 10.016292 # -b -85.694685 9.962315 -85.816720 10.168837 -85.894166 10.321381 -85.894166 10.527902 -85.793252 10.560758 -85.772130 10.659325 -85.804986 10.856459 -85.894166 10.898702 -85.858963 10.964414 -85.793252 11.051247 # -b -85.793252 11.051247 -85.793252 11.138080 -85.903553 11.269502 -86.079566 11.464290 -86.300168 11.605100 -86.520771 11.790500 -86.696783 12.060386 -86.830553 12.201196 -87.039421 12.365474 -87.248290 12.560262 -87.391447 12.698725 -87.536950 12.860657 -87.623783 12.938102 -87.635517 13.022588 -87.546338 13.013201 -87.403181 12.959224 -87.337469 13.022588 # -b -87.337469 13.022588 -87.382059 13.078912 -87.501748 13.238497 -87.492360 13.369920 -87.546338 13.412163 -87.668373 13.400429 -87.778674 13.423897 # -b -87.778674 13.423897 -87.877241 13.325330 -87.975808 13.238497 -88.196411 13.196254 -88.527315 13.196254 -88.848831 13.261965 -89.045965 13.337064 -89.299423 13.466140 -89.585737 13.520117 -89.806340 13.562360 # -b -85.551528 11.248381 -85.584383 11.248381 -85.739275 11.398578 -85.816720 11.595712 -85.903553 11.865598 -85.948143 12.060386 -85.849576 12.158953 -85.650095 12.027530 -85.518672 11.931310 -85.396637 11.865598 -85.286335 11.811621 -85.176034 11.703667 -85.077467 11.595712 -84.978900 11.508879 -84.922576 11.323479 -84.856865 11.126345 # -b -96.457271 20.002076 -96.400947 19.898815 -96.368091 19.826063 -96.325848 19.720456 -96.269524 19.574952 -96.224934 19.471691 -96.170957 19.377818 -96.147488 19.314453 -96.138101 19.262823 -96.138101 19.220580 -96.114633 19.199458 -96.102899 19.199458 -96.070043 19.199458 -96.016066 19.157215 -95.959742 19.105585 -95.905764 19.032833 -95.840053 18.990590 -95.795463 18.927225 -95.739139 18.863861 -95.640572 18.800496 -95.497415 18.758253 -95.375380 18.706623 -95.286200 18.664380 -95.143043 18.654992 -94.999886 18.647952 # -b -100.045582 16.944150 -99.878956 16.892519 -99.759268 16.817421 -99.681822 16.775178 -99.548052 16.723547 -99.426017 16.690691 -99.273473 16.648448 -99.106847 16.594471 -98.984812 16.542841 -98.829921 16.488864 -98.764210 16.488864 -98.665642 16.509985 -98.632787 16.488864 -98.555341 16.413765 -98.477896 16.341013 -98.355860 16.265914 -98.212703 16.190816 -98.057812 16.094595 -97.992101 16.073474 -97.947511 16.064086 -97.870065 16.064086 -97.780886 16.000722 -97.670584 15.956132 -97.595486 15.935011 -97.473450 15.892767 -97.372536 15.892767 -97.252848 15.871646 -97.065101 15.862259 -97.053367 15.850524 -96.964187 15.838790 -96.865620 15.787160 -96.776440 15.744917 -96.656752 15.700327 -96.600428 15.700327 -96.457271 15.625228 -96.335235 15.615841 -96.192078 15.615841 -96.070043 15.625228 -95.959742 15.679205 -95.882296 15.744917 -95.762607 15.787160 -95.685162 15.829403 -95.518537 15.862259 -95.375380 15.946745 -95.253344 16.042965 -95.143043 16.115717 -94.999886 16.186122 -95.044476 16.148573 # -b -94.999886 18.647952 -94.999886 18.680808 -94.922440 18.626830 -94.725306 18.375719 -94.481235 18.206747 -94.239511 18.206747 -94.063499 18.312355 -93.831162 18.439084 -93.589438 18.481327 -93.312512 18.523570 -93.159967 18.502448 -92.960486 18.532957 -92.718762 18.669073 -92.430102 18.753560 -92.122666 18.753560 -91.967775 18.711316 -91.956041 18.605709 -91.902064 18.523570 -91.791762 18.502448 -91.615750 18.523570 -91.449124 18.617443 -91.296580 18.690195 -91.329436 18.859167 -91.338823 19.025792 -91.075978 19.131400 -90.876497 19.319147 -90.787317 19.528015 -90.745074 19.746271 -90.634773 19.891775 # -b -89.806340 13.562360 -90.017555 13.703170 -90.259279 13.841634 # -b -90.259279 13.841634 -90.435292 13.895611 -90.766195 13.940201 -90.921087 13.940201 -91.031388 13.940201 -91.329436 13.961322 -91.615750 14.111520 -91.845740 14.303960 -92.078076 14.454158 -92.209499 14.562112 # -b -92.209499 14.562112 -92.244702 14.594968 -92.331534 14.670066 -92.552137 14.808530 -92.695294 14.970461 -92.883041 15.141780 -93.059053 15.301365 -93.202210 15.460950 -93.357101 15.611147 -93.533114 15.770732 -93.765451 15.888074 -93.974319 15.984294 -94.173800 16.059393 -94.370934 16.132145 -94.591537 16.195509 -94.734694 16.207243 -94.922440 16.195509 -94.999886 16.186122 # -b -105.356469 20.044319 -105.333001 19.908202 -105.288411 19.795554 -105.279024 19.753311 -105.112399 19.659438 -105.013832 19.544443 -104.924652 19.450570 -104.847206 19.366083 -104.748639 19.283944 -104.614870 19.178337 -104.516302 19.126706 -104.328556 19.072729 -104.197133 19.072729 -104.119687 19.032833 -104.018773 18.936613 -103.899085 18.833352 -103.744194 18.779375 -103.655014 18.697235 -103.601037 18.654992 -103.565834 18.579894 -103.577568 18.549385 -103.565834 18.528263 -103.500123 18.518876 -103.446146 18.476633 -103.434411 18.413268 -103.389822 18.328782 -103.291255 18.265418 -103.180953 18.244296 -103.115242 18.244296 -103.047184 18.234909 -102.936882 18.171544 -102.838315 18.159810 -102.805460 18.096446 -102.749136 18.087058 -102.695158 18.075324 -102.596591 18.044815 -102.408845 17.990838 -102.253953 17.948595 -102.110796 17.906352 -101.965293 17.896965 -101.887847 17.927474 -101.822136 17.906352 -101.702447 17.842987 -101.568678 17.770236 -101.514700 17.697484 -101.479498 17.643506 -101.470110 17.591876 -101.392665 17.570755 -101.336341 17.516777 -101.216652 17.462800 -101.094617 17.378314 -100.951460 17.326684 -100.939726 17.242198 -100.918604 17.221076 -100.829424 17.167099 -100.763713 17.188220 -100.707389 17.167099 -100.641678 17.115469 -100.552498 17.082613 -100.453931 17.052104 -100.355364 17.019248 -100.188738 16.998127 -100.045582 16.944150 # -b -113.150309 18.150423 -113.159696 18.138689 -113.150309 18.150423 -113.150309 18.129301 -113.150309 18.150423 # -b -155.752407 20.044319 -155.665574 19.980954 -155.564660 19.980954 -155.477827 19.950445 -155.344058 19.898815 -155.233756 19.856572 -155.189167 19.826063 -155.135189 19.762699 -155.090599 19.689947 -155.069478 19.659438 -155.024888 19.638316 -154.980298 19.617195 -154.923974 19.544443 -154.881731 19.481078 -154.813673 19.429448 -154.780817 19.323840 -154.792551 19.283944 -154.869997 19.136094 -154.959177 19.157215 -155.123455 19.168949 -155.257225 19.136094 -155.376913 19.051608 -155.388648 19.042220 -155.487215 18.927225 -155.520070 18.842739 -155.609250 18.769987 -155.743020 18.842739 -155.818118 18.978856 -155.853321 19.126706 -155.886177 19.356696 -155.940154 19.492813 -155.951888 19.617195 -155.841587 19.804942 -155.829853 19.919937 # -b 166.489178 19.366083 166.489178 19.356696 166.500912 19.344962 166.500912 19.323840 166.489178 19.344962 166.489178 19.366083 166.500912 19.323840 166.489178 19.344962 166.489178 19.366083 # -b 166.888140 11.415006 166.920995 11.436128 166.953851 11.436128 167.019562 11.447862 167.064152 11.403272 167.031297 11.370416 166.965585 11.316439 166.920995 11.217872 166.855284 11.142773 166.754370 11.154507 166.700393 11.208485 166.700393 11.295317 166.721514 11.361029 166.787226 11.415006 166.843550 11.415006 166.888140 11.415006 # -b 145.360621 20.013810 145.348887 19.971567 145.316031 19.950445 145.292563 19.992688 # -b 145.888659 18.138689 145.923861 18.171544 145.933249 18.159810 145.900393 18.087058 145.867537 18.075324 145.855803 18.087058 145.855803 18.096446 145.855803 18.108180 145.879272 18.117567 145.879272 18.129301 145.888659 18.129301 145.888659 18.138689 # -b 145.790092 15.017398 145.822948 15.050254 145.822948 14.996276 145.768970 14.975155 145.724380 14.975155 145.712646 15.017398 145.757236 15.050254 145.790092 15.038520 145.790092 15.017398 # -b 144.952272 13.513077 145.006249 13.513077 144.985127 13.449712 144.907682 13.405122 144.895948 13.374613 144.884214 13.287780 144.806768 13.254925 144.752791 13.330024 144.764525 13.374613 144.818502 13.437978 144.874826 13.470834 144.928803 13.513077 144.952272 13.513077 # -b 119.946743 11.891414 120.000721 11.858558 120.057045 11.795193 120.045311 11.741216 120.000721 11.696626 # -b 119.967865 12.227011 120.045311 12.163646 120.101635 12.151912 120.176733 12.163646 120.244791 12.076814 120.254179 12.032224 120.200202 12.032224 120.111022 12.022836 120.012455 12.086201 # -b 120.376214 13.416856 120.355093 13.470834 120.420804 13.480221 120.542840 13.480221 120.697731 13.470834 120.850275 13.470834 120.927721 13.480221 121.028634 13.459099 121.192913 13.416856 121.347804 13.287780 121.425250 13.179826 121.490961 13.168092 121.514429 12.963917 121.502695 12.780864 121.535551 12.682297 121.556672 12.574343 121.490961 12.508631 121.481574 12.367821 121.392394 12.292722 121.225769 12.184768 121.148323 12.325578 121.005166 12.445267 120.927721 12.607198 120.817419 12.823107 120.796298 13.039016 120.697731 13.189213 120.575695 13.254925 120.519371 13.395735 120.432538 13.428591 120.376214 13.416856 # -b 122.253682 18.422656 122.319394 18.371025 122.331128 18.307661 122.263070 18.213787 122.187971 18.011960 122.152768 17.833600 122.152768 17.622385 122.164503 17.441679 122.253682 17.326684 122.340515 17.284441 122.385105 17.188220 122.474285 17.082613 122.474285 16.913641 122.385105 16.690691 122.274804 16.479476 122.230214 16.298770 122.131647 16.106329 122.033080 16.031231 122.009612 16.073474 121.845333 15.977254 121.711563 15.871646 121.612996 15.712061 121.601262 15.552476 121.523817 15.369423 121.404128 15.296671 121.425250 15.134740 121.502695 14.954033 121.591875 14.792102 121.678708 14.695882 121.624731 14.611396 121.634118 14.416608 121.711563 14.266411 121.735032 14.116213 121.845333 14.019993 122.000224 13.890917 122.098791 13.879183 122.241948 13.933160 122.209093 14.008259 122.230214 14.181925 122.286538 14.149069 122.441429 14.287532 122.629176 14.266411 122.716009 14.332122 122.849778 14.287532 122.971814 14.170191 123.058647 13.977750 123.082115 13.804084 123.168948 13.728986 123.279249 13.836940 123.258128 14.029380 123.356695 13.998872 123.413019 13.954282 123.577297 13.912039 123.711067 13.846327 123.842490 13.794697 123.887080 13.707864 123.732188 13.686742 123.589032 13.567054 123.621887 13.428591 123.743923 13.330024 123.854224 13.297168 123.797900 13.158705 123.821368 13.092993 123.908201 13.092993 123.908201 13.081259 123.919935 13.081259 123.931669 13.039016 124.030237 13.017894 124.107682 12.942796 124.107682 12.790251 124.107682 12.607198 124.020849 12.508631 123.887080 12.628320 123.833102 12.769130 123.908201 12.823107 123.964525 12.865350 123.887080 12.888819 123.666477 12.877084 123.478730 13.017894 123.344961 13.060137 123.279249 13.266659 123.168948 13.416856 122.971814 13.513077 122.870900 13.611644 122.838044 13.675008 122.673766 13.836940 122.486019 13.890917 122.507141 13.663274 122.605708 13.459099 122.694887 13.266659 122.694887 13.200948 122.596320 13.212682 122.486019 13.416856 122.319394 13.545932 122.176237 13.696130 122.077670 13.794697 121.922779 13.879183 121.800743 13.912039 121.591875 13.890917 121.490961 13.707864 121.347804 13.621031 121.183526 13.611644 121.094346 13.707864 120.960576 13.740720 120.829153 13.846327 120.730586 13.782963 120.662528 13.944894 120.641407 14.127947 120.697731 14.266411 120.829153 14.395487 120.927721 14.536297 120.918333 14.653639 120.808032 14.738125 120.629672 14.749859 120.608551 14.491707 120.563961 14.407221 120.420804 14.566806 120.322237 14.749859 120.200202 14.759246 120.101635 15.050254 120.057045 15.306059 # -b 119.967865 16.211937 120.134490 16.042965 120.355093 16.106329 120.343359 16.392643 120.322237 16.636714 120.355093 16.901907 120.432538 17.157712 120.432538 17.462800 120.409070 17.676362 120.432538 17.906352 120.474781 18.117567 120.498250 18.295927 120.596817 18.464899 120.718852 18.601015 120.829153 18.579894 121.038022 18.579894 121.270358 18.528263 121.481574 18.401534 121.666974 18.307661 121.878189 18.295927 122.009612 18.338170 122.042467 18.528263 122.176237 18.537651 122.230214 18.476633 122.253682 18.422656 # -b 121.889923 14.996276 121.899310 15.071375 122.000224 15.038520 122.009612 14.921178 122.021346 14.749859 122.021346 14.684147 121.932166 14.663026 121.911044 14.813223 121.889923 14.930565 121.889923 14.996276 122.000224 15.038520 # -b 121.866455 13.320636 121.821865 13.362879 121.821865 13.384001 121.833599 13.503689 121.932166 13.503689 122.021346 13.524811 122.087057 13.470834 122.119913 13.374613 122.098791 13.266659 122.077670 13.200948 121.965022 13.200948 121.889923 13.287780 121.866455 13.320636 # -b 121.988490 12.445267 122.000224 12.508631 122.009612 12.607198 122.098791 12.607198 122.098791 12.412411 122.077670 12.205890 122.021346 12.130791 121.976756 12.238745 121.988490 12.445267 # -b 122.441429 12.445267 122.450817 12.478122 122.474285 12.478122 122.551730 12.466388 122.629176 12.412411 122.662032 12.358434 122.662032 12.304457 122.563465 12.337312 122.450817 12.358434 122.441429 12.445267 # -b 123.004670 13.114115 123.037525 13.135236 123.058647 13.071872 123.103237 13.027282 123.168948 12.942796 123.258128 12.898206 123.290983 12.855963 123.323839 12.801986 123.335573 12.736274 123.302718 12.780864 123.225272 12.790251 123.136092 12.909940 123.058647 12.996773 123.004670 13.060137 123.004670 13.114115 # -b 123.654743 12.628320 123.678211 12.661176 123.699333 12.618932 123.743923 12.508631 123.743923 12.424145 123.722801 12.412411 123.678211 12.520365 123.654743 12.628320 # -b 123.258128 12.562608 123.323839 12.532100 123.344961 12.487510 123.389551 12.466388 123.478730 12.466388 123.589032 12.367821 123.743923 12.250479 123.865958 12.151912 123.985647 12.043958 124.030237 11.924269 124.041971 11.849171 124.041971 11.762338 123.985647 11.783459 123.865958 11.816315 123.711067 11.924269 123.600766 12.109669 123.523320 12.163646 123.389551 12.086201 123.269862 11.968859 123.213538 12.001715 123.246394 12.163646 123.258128 12.238745 123.246394 12.346700 123.258128 12.433533 123.246394 12.508631 123.258128 12.553221 123.258128 12.562608 # -b 124.318897 12.520365 124.318897 12.532100 124.340019 12.532100 124.372874 12.532100 124.483176 12.520365 124.527766 12.508631 124.593477 12.508631 124.781224 12.499244 124.903259 12.553221 125.001826 12.586077 125.112128 12.562608 125.255284 12.478122 125.323343 12.337312 125.475887 12.217624 125.475887 12.151912 125.487621 12.022836 125.466500 11.750603 125.487621 11.567550 125.553333 11.415006 125.597922 11.295317 125.630778 11.208485 125.731692 11.055940 125.630778 11.067674 125.454765 11.055940 125.255284 11.109918 125.177839 11.295317 125.067538 11.337561 124.947849 11.447862 124.936115 11.534695 124.990092 11.675505 124.957236 11.729482 124.804692 11.891414 124.670923 12.011102 124.548887 12.065079 124.429199 12.217624 124.351753 12.391289 124.318897 12.478122 124.318897 12.520365 # -b 121.932166 11.870292 121.976756 11.891414 122.042467 11.870292 122.143381 11.849171 122.230214 11.795193 122.375718 11.684892 122.417961 11.576938 122.528262 11.555816 122.706622 11.544082 122.826310 11.544082 122.861513 11.480717 123.025791 11.522960 123.091503 11.511226 123.103237 11.295317 123.037525 11.088796 122.894368 11.001963 122.748865 10.816563 122.605708 10.708609 122.518875 10.664019 122.363984 10.642897 122.143381 10.556064 122.009612 10.391786 121.955634 10.598307 121.955634 10.828297 122.009612 11.067674 122.033080 11.316439 122.054201 11.567550 122.033080 11.675505 121.932166 11.771725 121.932166 11.870292 # -b 122.650298 10.664019 122.694887 10.642897 122.694887 10.565452 122.683153 10.490353 122.605708 10.434029 122.551730 10.434029 122.551730 10.556064 122.584586 10.631163 122.650298 10.664019 # -b 122.960080 10.828297 123.025791 10.882274 123.147827 10.957373 123.213538 10.924518 123.323839 10.915130 123.499852 10.870540 123.511586 10.717996 123.478730 10.499740 123.389551 10.424642 123.368429 10.215773 # -b 122.563465 9.964662 122.760599 10.042108 122.826310 10.194652 122.826310 10.499740 122.894368 10.664019 122.927224 10.783707 122.960080 10.828297 # -b 124.405730 11.654383 124.417464 11.717748 124.471442 11.684892 124.527766 11.654383 124.548887 11.576938 124.581743 11.534695 124.516031 11.490105 124.483176 11.490105 124.438586 11.576938 124.405730 11.654383 # -b 124.318897 11.490105 124.318897 11.501839 124.361140 11.403272 124.429199 11.337561 124.516031 11.382150 124.605211 11.328173 124.748368 11.349295 124.858669 11.349295 124.990092 11.163895 125.001826 10.957373 125.001826 10.717996 125.091006 10.556064 125.177839 10.337809 125.245897 10.239242 125.123862 10.185264 125.013560 10.227507 124.990092 10.030373 124.858669 10.074963 124.769490 10.260363 124.760102 10.490353 124.769490 10.717996 124.670923 10.924518 124.548887 10.882274 124.471442 10.870540 124.417464 11.077062 124.384609 11.304705 124.340019 11.382150 124.318897 11.480717 124.318897 11.490105 # -b 125.553333 10.161796 125.543945 10.185264 125.543945 10.304953 125.621391 10.466885 125.675368 10.380052 125.687102 10.161796 # -b 125.654246 9.943540 125.586188 10.042108 125.553333 10.161796 # -b 123.997381 11.217872 124.041971 11.241340 124.053705 11.163895 124.030237 11.055940 124.041971 10.849419 124.041971 10.642897 124.020849 10.391786 123.943404 10.314340 123.797900 10.206386 123.699333 10.020986 # -b 123.368429 9.856708 123.434140 10.042108 123.499852 10.206386 123.589032 10.337809 123.687599 10.511475 123.776778 10.717996 123.833102 10.858806 123.887080 11.011350 123.931669 11.163895 123.997381 11.217872 # -b 123.985647 9.955275 124.074826 10.074963 124.206249 10.161796 124.307163 10.119553 124.429199 10.074963 124.572355 10.119553 124.572355 10.020986 # -b 110.883266 20.034931 110.948978 19.814329 110.958365 19.680559 110.782352 19.523321 110.650929 19.283944 110.550016 19.105585 110.496038 18.915491 110.451449 18.800496 110.308292 18.697235 110.141666 18.537651 110.064221 18.455511 # -b 119.449214 11.337561 119.503192 11.382150 119.526660 11.349295 119.526660 11.217872 119.538394 11.109918 119.571250 11.044206 119.514926 10.947986 119.526660 10.804829 119.571250 10.664019 119.604106 10.544330 119.559516 10.424642 119.392890 10.314340 119.282589 10.152409 119.130045 10.009252 # -b 118.510480 9.844973 118.665371 10.030373 118.763939 10.086697 118.874240 10.260363 119.019744 10.370664 119.151166 10.424642 119.216878 10.532596 119.282589 10.664019 119.273202 10.771973 119.273202 10.849419 119.317792 10.762586 119.383503 10.816563 119.360035 10.882274 119.282589 10.947986 119.327179 11.001963 119.383503 11.142773 119.404625 11.295317 119.449214 11.337561 # -b 119.878685 11.924269 119.890419 11.924269 119.946743 11.891414 # -b 120.000721 11.696626 119.946743 11.741216 119.913888 11.816315 119.878685 11.882026 119.878685 11.924269 # -b 119.913888 12.292722 119.890419 12.283335 119.967865 12.227011 # -b 120.012455 12.086201 119.946743 12.250479 119.913888 12.292722 # -b 120.057045 15.306059 119.988986 15.465643 119.923275 15.712061 119.857564 15.892767 119.803586 16.202550 119.812974 16.265914 119.967865 16.211937 # -b 102.988513 11.642649 102.833622 11.717748 102.779644 11.828049 102.690465 12.065079 102.601285 12.119057 102.568429 12.076814 102.469862 12.151912 102.336093 12.205890 102.216404 12.367821 102.082634 12.466388 101.894888 12.640054 101.707141 12.682297 101.531128 12.649441 101.343381 12.670563 101.101657 12.682297 101.000743 12.670563 101.057067 12.607198 100.979622 12.618932 100.923298 12.748008 100.935032 12.985039 100.946766 13.179826 100.967888 13.384001 100.913911 13.480221 100.714430 13.534198 100.526683 13.557667 100.350670 13.534198 100.240369 13.534198 100.008032 13.449712 100.052622 13.243191 100.073744 13.039016 100.029154 12.769130 # -b 104.490487 10.466885 104.389573 10.490353 104.335596 10.544330 104.237029 10.598307 104.091525 10.610042 103.927247 10.631163 103.784090 10.556064 103.605730 10.565452 103.605730 10.762586 103.694910 10.882274 103.662054 11.055940 103.551753 11.121652 103.462573 11.077062 103.375741 10.924518 103.209115 10.891662 103.131670 11.109918 103.054224 11.349295 103.054224 11.403272 103.122282 11.337561 103.110548 11.424393 103.033103 11.534695 102.955657 11.609793 102.955657 11.675505 102.955657 11.663771 102.988513 11.642649 # -b 107.050884 17.030983 107.128330 16.967618 107.262100 16.796299 107.426378 16.681304 107.581269 16.542841 107.712692 16.350400 107.912173 16.308157 108.022474 16.298770 108.099920 16.190816 108.123388 16.148573 108.123388 16.115717 108.132775 16.064086 108.243077 16.073474 108.243077 16.139185 108.254811 16.139185 108.254811 16.085208 108.287667 15.892767 108.397968 15.721449 108.564593 15.573598 108.684282 15.456256 108.806317 15.327180 108.872028 15.092497 108.961208 14.857813 109.038654 14.632517 109.104365 14.407221 109.137221 14.149069 109.170077 13.900304 109.202932 13.836940 109.202932 13.815818 109.202932 13.663274 109.238135 13.534198 109.226401 13.437978 109.226401 13.320636 109.247522 13.179826 109.247522 13.039016 109.315580 12.996773 109.336702 12.834841 109.348436 12.682297 109.348436 12.640054 109.348436 12.703419 109.270990 12.726887 109.202932 12.628320 109.214666 12.499244 109.214666 12.424145 109.148955 12.478122 109.127833 12.412411 109.170077 12.227011 109.202932 12.001715 109.202932 11.914882 109.160689 11.924269 109.127833 11.858558 109.181811 11.795193 109.170077 11.684892 109.116099 11.654383 109.059775 11.598059 109.038654 11.436128 108.994064 11.328173 108.827439 11.316439 108.707750 11.196750 108.573980 11.142773 108.275932 11.001963 108.144510 10.936252 108.001353 10.739118 107.891051 10.717996 107.745548 10.664019 107.569535 10.565452 107.438112 10.478619 107.304343 10.401173 107.172920 10.412907 107.050884 10.466885 106.895993 10.434029 106.797426 10.401173 106.741102 10.281485 106.675391 10.227507 106.698859 10.074963 106.630801 10.086697 # -b 106.609679 9.988130 106.499378 10.009252 # -b 104.997404 9.868442 105.063115 10.030373 104.952814 10.140675 104.809657 10.194652 104.621910 10.260363 104.490487 10.466885 # -b 106.168474 20.053706 105.968993 19.877694 105.858692 19.647704 105.760125 19.417714 105.727269 19.199458 105.659211 19.032833 105.626355 18.800496 105.727269 18.579894 105.891548 18.413268 106.091029 18.234909 106.299897 18.108180 106.400811 17.854722 106.433667 17.634119 106.642535 17.474534 106.797426 17.284441 106.961705 17.167099 107.050884 17.030983 # -b 110.064221 18.455511 109.855352 18.401534 109.756785 18.265418 109.712195 18.192666 109.613628 18.213787 109.524449 18.274805 109.369558 18.317048 109.160689 18.380413 108.839173 18.464899 108.684282 18.676114 108.663160 18.957734 108.651426 19.126706 108.651426 19.302719 108.761727 19.387205 108.994064 19.617195 109.170077 19.741577 109.193545 19.804942 109.315580 19.887081 109.536183 19.980954 109.723930 19.992688 109.932798 19.992688 # -b 104.004692 10.445763 104.091525 10.347196 104.103259 10.206386 104.082138 10.107819 103.981224 10.215773 103.927247 10.326075 103.927247 10.391786 104.004692 10.445763 # -b 98.571769 10.173530 98.538913 10.314340 98.562382 10.544330 98.628093 10.783707 98.804106 11.217872 98.804106 11.415006 98.848696 11.576938 98.869817 11.729482 98.792372 11.771725 98.672683 11.837436 98.538913 11.936003 98.562382 12.065079 98.717273 12.032224 98.682070 12.217624 98.717273 12.466388 98.682070 12.694031 98.639827 12.942796 98.571769 13.092993 98.428612 13.416856 98.351167 13.750107 98.273721 13.686742 98.229131 13.611644 98.142298 13.890917 98.053119 14.308654 97.942817 14.587927 97.844250 14.954033 97.766805 15.390545 97.733949 15.754304 97.701093 16.064086 97.710481 16.211937 97.710481 16.413765 97.701093 16.413765 97.710481 16.425499 97.710481 16.509985 97.579058 16.542841 97.358455 16.648448 97.182443 16.796299 97.036939 16.955884 96.917250 16.901907 96.828071 17.242198 96.738891 17.432291 96.738891 17.094347 96.652058 16.702426 96.398600 16.552228 96.121673 16.425499 95.922192 16.254180 95.725058 16.127451 95.546699 15.977254 95.358952 15.766038 95.272119 15.838790 95.150083 15.829403 95.060904 15.925623 94.941215 15.754304 94.762856 15.838790 94.575109 15.904502 94.488276 15.977254 94.553987 16.127451 94.377975 16.010109 94.267673 16.052352 94.267673 16.073474 94.267673 16.031231 94.288795 16.169694 94.312263 16.362135 94.387362 16.606205 94.443686 16.892519 94.553987 17.178833 94.553987 17.537899 94.500010 17.803091 94.464808 18.065937 94.387362 18.202053 94.377975 18.328782 94.267673 18.537651 94.145638 18.727744 94.002481 18.936613 93.936770 19.126706 93.880446 18.906104 93.680965 19.011711 93.561276 19.241701 93.615253 19.387205 93.824122 19.302719 93.791266 19.398939 93.648109 19.492813 93.704433 19.596073 93.680965 19.701681 93.472096 19.804942 # -b 98.639827 9.964662 98.571769 10.173530 # -b 100.029154 12.769130 99.984564 12.454654 99.963442 12.163646 99.808551 11.914882 99.677128 11.654383 99.576215 11.349295 99.522237 11.175629 99.522237 10.978495 99.433058 10.795442 99.346225 10.717996 99.322756 10.532596 99.224189 10.370664 99.191334 10.260363 99.191334 10.009252 # -b 98.527179 11.804581 98.550648 11.771725 98.484936 11.828049 98.339432 11.588672 98.494324 11.555816 98.571769 11.576938 98.595237 11.717748 98.527179 11.804581 # -b 98.339432 11.762338 98.306577 11.741216 98.285455 11.588672 98.273721 11.490105 98.339432 11.588672 98.374635 11.771725 98.339432 11.762338 # -b 98.374635 12.670563 98.362901 12.628320 98.362901 12.424145 98.384022 12.358434 98.461468 12.424145 98.374635 12.670563 # -b 92.929977 13.524811 92.965180 13.567054 92.897122 13.470834 92.843145 13.287780 92.786820 13.081259 92.721109 12.682297 92.699988 12.487510 92.709375 12.337312 92.709375 12.227011 92.667132 12.097935 92.610808 11.978246 92.556831 11.891414 92.566218 11.708360 92.577952 11.642649 92.667132 11.534695 92.753965 11.567550 92.721109 11.684892 92.753965 11.914882 92.777433 12.076814 92.843145 12.259867 92.843145 12.379555 92.897122 12.541487 92.941712 12.790251 92.897122 12.909940 92.897122 13.027282 92.986301 13.092993 92.998036 13.254925 93.007423 13.362879 93.007423 13.524811 92.929977 13.524811 # -b 86.572401 20.199210 86.274353 19.941058 86.042016 19.847185 85.732234 19.762699 85.457654 19.617195 85.168994 19.459957 84.939004 19.283944 84.694933 19.011711 84.497799 18.769987 84.298318 18.528263 84.110571 18.359291 84.065981 18.349904 84.021391 18.286539 83.821910 18.171544 83.559065 17.981451 83.326728 17.727993 83.005212 17.516777 82.564007 17.167099 82.322283 17.009861 82.211981 16.838542 82.211981 16.636714 82.101680 16.500598 81.747308 16.371522 81.669862 16.341013 81.428138 16.308157 81.195802 16.244793 81.162946 16.223671 81.073766 16.010109 80.942344 15.787160 80.799187 15.721449 80.620827 15.817669 80.456549 15.808281 80.278189 15.712061 80.125645 15.465643 # -b 79.980141 14.888322 80.015344 14.674760 80.036465 14.632517 80.069321 14.587927 80.081055 14.587927 80.092789 14.545684 80.092789 14.374365 80.048199 14.257023 80.036465 14.181925 80.069321 14.019993 80.113911 13.869796 80.146766 13.717251 80.167888 13.621031 80.113911 13.686742 80.057587 13.621031 80.113911 13.578788 80.135032 13.491955 80.235946 13.405122 80.268802 13.233803 80.268802 13.158705 80.245334 13.017894 80.224212 12.963917 80.167888 12.757396 80.102177 12.532100 80.003610 12.271601 # -b 73.577975 15.754304 73.512264 15.871646 73.446552 15.935011 73.411350 16.031231 73.401962 16.127451 73.345638 16.169694 73.247071 16.362135 73.202481 16.509985 73.181360 16.732934 73.169626 16.880785 73.148504 17.030983 73.103914 17.145977 73.103914 17.314950 73.047590 17.432291 72.981879 17.634119 72.916167 17.824213 72.904433 17.885231 72.883312 17.885231 72.859843 18.033081 72.850456 18.192666 72.859843 18.253684 72.826988 18.286539 72.761276 18.401534 72.761276 18.497754 72.794132 18.748866 72.826988 18.842739 72.826988 18.906104 72.859843 18.969468 72.850456 19.084463 72.815254 19.147828 72.749542 19.105585 72.695565 19.042220 72.695565 19.105585 72.695565 19.199458 72.683831 19.323840 72.639241 19.398939 72.627507 19.513934 72.594651 19.617195 72.585264 19.701681 72.585264 19.887081 72.594651 19.950445 # -b 73.610831 15.744917 73.643686 15.712061 73.676542 15.573598 73.709398 15.486765 73.753988 15.456256 73.810312 15.510233 73.899491 15.498499 73.887757 15.465643 73.831433 15.402279 73.819699 15.317793 73.864289 15.209838 73.887757 15.092497 73.920613 15.005664 73.941734 14.954033 # -b 80.125645 15.465643 79.980141 15.284937 79.970754 15.146474 79.980141 14.888322 # -b 80.003610 12.271601 79.914430 12.086201 79.794741 11.828049 79.750151 11.630915 79.738417 11.403272 79.738417 11.109918 79.750151 10.957373 79.759539 10.771973 79.783007 10.586573 79.783007 10.466885 79.783007 10.347196 79.783007 10.337809 79.783007 10.272097 79.726683 10.272097 79.595260 10.272097 79.529549 10.337809 79.473225 10.337809 79.285478 10.293219 79.186911 10.096085 # -b 76.337853 9.746406 76.117251 10.260363 75.941238 10.685140 75.819203 11.142773 75.697167 11.490105 75.631456 11.567550 75.377998 11.882026 75.190251 12.043958 75.047094 12.283335 75.035360 12.292722 75.035360 12.379555 74.969648 12.553221 74.814757 13.050750 74.737312 13.395735 74.704456 13.588175 74.594155 13.846327 74.460385 14.019993 74.406408 14.278145 74.317228 14.470585 74.230395 14.663026 74.096626 14.728737 73.941734 14.954033 # -b 49.905449 11.497145 50.137786 11.539388 50.325533 11.682545 50.480424 11.931310 50.623581 11.898454 50.656436 11.964165 50.665824 11.964165 50.799593 11.910188 50.921629 11.898454 50.975606 11.877333 51.097641 11.823355 51.151618 11.659077 51.053051 11.530001 51.008462 11.302358 51.031930 11.192057 51.085907 11.018391 51.085907 10.769626 51.085907 10.593614 51.064786 10.485659 51.175087 10.495047 51.261920 10.398826 51.118763 10.387092 50.931016 10.333115 50.832449 10.159449 # -b 54.404332 12.569649 54.514633 12.560262 54.493512 12.503938 54.359742 12.374862 54.195464 12.342006 54.007717 12.255173 53.819970 12.288029 53.587633 12.332619 53.411621 12.461695 53.479679 12.656482 53.587633 12.689338 53.688547 12.602505 53.730790 12.569649 53.775380 12.569649 53.885681 12.569649 54.040573 12.635360 54.216585 12.602505 54.404332 12.569649 # -b 57.689901 20.070134 57.701635 19.945752 57.689901 19.830757 57.668780 19.736883 57.668780 19.621889 57.668780 19.570258 57.678167 19.518628 57.689901 19.403633 57.734491 19.319147 57.788468 19.140787 57.722757 19.037527 57.579600 18.995284 57.448177 18.995284 57.227575 18.953041 57.117273 18.983549 57.051562 18.901410 56.896671 18.859167 56.720658 18.732438 56.619744 18.532957 56.598623 18.375719 56.544646 18.185625 56.389754 17.995532 56.234863 17.922780 56.070585 17.932167 55.882838 17.901658 55.716213 17.871150 55.540200 17.838294 55.451020 17.744420 55.364188 17.638813 55.253886 17.542593 55.242152 17.448719 55.265620 17.310256 55.131851 17.108428 54.976960 17.002821 54.922983 16.939456 54.791560 16.951190 54.646056 16.993433 54.470043 17.023942 54.294031 17.014555 54.096897 17.002821 53.942005 16.887826 53.697935 16.791605 53.489066 16.770484 53.223874 16.685998 53.003271 16.610899 52.806137 16.526413 52.618390 16.430193 52.442378 16.312851 52.308608 16.165000 52.242897 15.984294 52.198307 15.909195 52.254631 15.770732 52.275752 15.632269 52.177185 15.568904 52.034028 15.590026 51.923727 15.536049 51.768836 15.493806 51.649148 15.460950 51.494256 15.280244 51.240798 15.193411 51.020196 15.172289 50.787859 15.108925 50.600112 15.012704 50.391244 14.958727 50.226965 14.883628 50.048606 14.820264 # -b 39.994764 15.301365 40.093331 15.097190 40.215367 15.000970 40.379645 15.000970 40.567392 14.946993 40.677693 14.862507 40.701162 14.766287 40.865440 14.724044 41.086043 14.658332 41.262055 14.552725 41.395825 14.369671 41.494392 14.228861 41.592959 14.090398 41.726729 13.928466 41.935597 13.799391 42.067020 13.691436 42.165587 13.606950 42.275888 13.498996 42.386189 13.325330 42.487103 13.229110 42.630260 13.130543 42.740561 12.980345 42.806273 12.851269 43.038609 12.806679 # -b 43.038609 12.806679 43.059731 12.797292 43.125442 12.698725 43.224009 12.527406 43.334311 12.386596 43.411756 12.180074 43.402369 12.060386 43.181766 11.898454 43.003407 11.769378 42.818007 11.682545 42.740561 11.605100 42.630260 11.539388 42.630260 11.443168 42.782804 11.485411 42.970551 11.530001 43.104321 11.539388 43.224009 11.452555 # -b 43.224009 11.452555 43.202888 11.497145 43.235744 11.452555 43.390635 11.356335 43.545526 11.182669 43.665214 10.985535 43.831840 10.769626 44.040708 10.551371 44.294166 10.419948 44.690781 10.333115 44.955974 10.365971 45.242288 10.539637 45.462890 10.671059 45.627169 10.779014 45.760938 10.856459 46.014396 10.779014 46.288976 10.692181 46.697325 10.680447 46.941396 10.877581 47.237097 11.149814 47.415457 11.248381 47.722892 11.149814 48.032675 11.116958 48.208687 11.126345 48.208687 10.779014 48.551325 11.269502 48.736725 11.236647 49.001917 11.248381 49.267110 11.290624 49.443122 11.377457 49.708315 11.464290 49.905449 11.497145 # -b 42.684237 16.409071 42.672503 16.463048 42.639647 16.526413 42.639647 16.622633 42.639647 16.695385 42.585670 16.779871 42.541080 16.854970 42.508225 16.918334 42.463635 17.002821 42.419045 17.066185 42.353334 17.108428 42.308744 17.174139 42.275888 17.216383 42.266501 17.237504 42.266501 17.258626 42.233645 17.385355 42.198442 17.521471 42.144465 17.584836 42.034164 17.669322 41.869886 17.828906 41.714994 17.901658 41.625815 17.995532 41.506126 18.155117 41.438068 18.260724 41.428681 18.270111 41.384091 18.375719 41.294911 18.544691 41.229200 18.659686 41.196344 18.690195 41.151754 18.711316 41.118898 18.762947 41.107164 18.838046 41.097777 18.859167 41.064921 18.962428 41.053187 19.161909 40.987476 19.319147 40.919417 19.413020 40.877174 19.497506 40.820850 19.549137 40.743405 19.612501 40.689427 19.725149 40.611982 19.788514 40.546271 19.882387 40.457091 19.997382 # -b 43.468080 12.698725 43.456346 12.764436 43.444612 12.839535 43.411756 12.905246 43.402369 12.947489 43.390635 12.959224 43.346045 13.001467 43.292068 13.088300 43.214622 13.175132 43.214622 13.283087 43.214622 13.337064 43.214622 13.520117 43.214622 13.649193 43.191154 13.811125 43.092587 13.907345 43.038609 14.036421 43.003407 14.198353 42.970551 14.327428 42.961164 14.444770 42.949430 14.529256 42.949430 14.552725 42.937696 14.658332 42.928308 14.700575 42.883718 14.799142 42.827394 14.883628 42.827394 14.979849 42.827394 15.033826 42.782804 15.097190 42.740561 15.162902 42.672503 15.247388 42.618526 15.289631 42.663116 15.334221 42.707706 15.322487 42.707706 15.385851 42.672503 15.460950 42.672503 15.620535 42.639647 15.716755 42.663116 15.749611 42.749949 15.812975 42.773417 15.888074 42.773417 16.014803 42.749949 16.174388 42.717093 16.366828 42.684237 16.409071 # -b 50.048606 14.820264 49.917183 14.799142 49.752905 14.775674 49.598014 14.754552 49.365677 14.648945 49.189664 14.583233 49.067629 14.498747 49.001917 14.369671 48.903350 14.240596 48.760193 14.090398 48.560712 13.940201 48.396434 13.940201 48.220421 13.961322 48.020940 13.949588 47.844928 13.940201 47.668915 13.832246 47.600857 13.790003 47.568001 13.712558 47.457700 13.628072 47.260566 13.520117 47.072819 13.475527 46.896806 13.433284 46.687938 13.369920 46.488457 13.391041 46.422746 13.412163 46.288976 13.412163 46.169287 13.391041 45.981541 13.391041 45.772672 13.379307 45.584926 13.250231 45.484012 13.046056 45.275143 12.947489 45.066275 12.860657 44.890262 12.743315 44.714250 12.731581 44.449057 12.743315 44.183865 12.656482 44.061830 12.668216 43.885817 12.623626 43.730926 12.710459 43.468080 12.698725 # -b 37.183256 20.152273 37.183256 19.861266 37.204377 19.673519 37.227846 19.455263 37.281823 19.204152 37.347534 18.931919 37.448448 18.784068 37.568137 18.711316 37.711294 18.659686 37.821595 18.605709 37.955365 18.575200 38.065666 18.481327 38.131377 18.302967 38.152499 18.270111 38.253413 18.302967 38.307390 18.248990 38.396570 18.248990 38.417691 18.155117 38.450547 18.091752 # -b 38.450547 18.091752 38.516258 18.091752 38.593704 17.995532 38.715739 17.765542 38.858896 17.521471 38.948076 17.268013 39.013787 16.981699 39.124088 16.737628 39.178066 16.409071 39.234390 16.122757 39.300101 15.876340 39.410402 15.695633 39.487848 15.536049 39.663861 15.289631 39.774162 15.108925 39.807017 15.226266 39.807017 15.397585 39.884463 15.514927 39.994764 15.301365 # -b 13.611644 14.411915 13.665621 14.294573 13.754801 14.198353 13.886223 14.123254 13.996525 13.982444 14.029380 13.757148 14.062236 13.595216 14.172537 13.583482 14.372018 13.541239 14.592621 13.574094 14.712309 13.508383 14.846079 13.475527 14.977502 13.520117 15.043213 13.423897 15.120659 13.261965 15.066682 13.175132 15.033826 13.034322 14.857813 12.893512 14.580887 12.818413 # -b 13.611644 14.411915 13.588175 14.348550 13.501342 14.336816 13.215029 14.327428 13.092993 14.249983 13.015548 14.123254 13.015548 14.024687 13.069525 13.919079 13.170439 13.712558 # -b 13.170439 13.712558 13.236150 13.649193 13.290127 13.498996 13.423897 13.315943 13.632765 13.207988 13.731332 13.067178 13.787656 12.893512 13.874489 12.668216 14.008259 12.482816 # -b 14.008259 12.482816 14.052849 12.515672 14.139682 12.536793 14.228861 12.644748 14.306307 12.764436 14.449464 12.806679 14.569152 12.806679 # -b -10.039761 29.387069 -9.950581 29.560735 -9.917725 29.598285 # -b -9.917725 29.598285 -9.894257 29.638181 -9.819158 29.753176 -9.729978 29.849396 # -b -16.179081 28.553943 -16.244793 28.563330 -16.411418 28.448335 -16.599165 28.368543 -16.796299 28.321606 -16.754056 28.145594 -16.599165 28.009477 -16.411418 28.077535 -16.345707 28.300485 -16.169694 28.417827 -16.101636 28.495272 -16.125104 28.535168 -16.179081 28.553943 # -b -15.606454 28.145594 -15.660431 28.077535 -15.737876 27.939072 -15.737876 27.852239 -15.728489 27.763060 -15.651043 27.713776 -15.496152 27.725510 -15.385851 27.772447 -15.341261 27.831118 -15.320140 27.892136 -15.320140 28.037639 -15.364730 28.086923 -15.517274 28.124472 -15.606454 28.145594 # -b -13.808778 28.690059 -13.820512 28.718221 -13.909692 28.708834 -13.996525 28.572718 -14.052849 28.448335 -14.139682 28.340381 -14.196006 28.241814 -14.184272 28.154981 -14.315694 28.077535 -14.196006 28.115085 -13.963669 28.204265 -13.865102 28.309872 -13.808778 28.436601 -13.808778 28.553943 -13.808778 28.690059 # -b -13.379307 29.185242 -13.445018 29.194629 -13.489608 29.117183 -13.578788 29.086675 -13.689089 29.030351 -13.754801 28.952905 -13.775922 28.863725 -13.698477 28.884847 -13.578788 28.913009 -13.501342 28.962292 -13.433284 29.049125 -13.379307 29.185242 # -b -16.202550 19.934018 -16.202550 20.091256 -16.157960 20.194516 -16.146226 20.236759 -16.157960 20.318899 -16.223671 20.443281 -16.322238 20.588785 -16.399684 20.682658 -16.432540 20.619293 -16.500598 20.579397 -16.587431 20.807040 -16.643755 20.910301 -16.709466 21.004174 -16.742322 21.065192 -16.763443 21.116822 -16.775178 21.116822 -16.918334 21.022949 # -b -16.918334 21.022949 -16.930069 21.095701 -16.930069 21.198962 -16.897213 21.417217 -16.864357 21.600271 -16.840889 21.827914 -16.754056 22.013314 -16.643755 22.269119 -16.423152 22.372379 -16.312851 22.576554 -16.190816 22.841746 -16.047659 23.045921 -16.092248 23.189078 -15.981947 23.341622 -15.737876 23.677220 -15.672165 23.787521 -15.660431 23.857926 -15.618188 23.979961 -15.540742 24.090263 -15.397585 24.242807 -15.209838 24.435247 -14.989236 24.655850 -14.867201 24.857678 -14.724044 25.068893 -14.679454 25.357554 -14.503441 25.756516 -14.404874 26.106194 -14.196006 26.345571 -14.118560 26.444138 -13.754801 26.601376 -13.445018 26.819632 -13.346451 27.115333 -13.203294 27.380525 -13.036669 27.645718 -12.938102 27.734898 # -b -12.938102 27.734898 -12.905246 27.821730 -12.860657 27.920298 -12.684644 27.969581 -12.452307 27.969581 -12.100282 28.047027 -11.846824 28.145594 -11.560510 28.232427 -11.361029 28.380277 -11.163895 28.572718 -10.898702 28.758118 -10.588920 28.875459 -10.380052 29.039738 -10.314340 29.135958 -10.236895 29.173507 # -b -10.236895 29.173507 -10.138328 29.250953 -10.039761 29.387069 # -b -78.076858 26.819632 -78.109714 26.829019 -78.086245 26.779736 -78.053390 26.779736 -77.966557 26.711677 -77.933701 26.573214 -78.011147 26.650660 -78.130835 26.711677 -78.273992 26.699943 -78.473473 26.631885 -78.694076 26.573214 -78.935800 26.582602 -79.001511 26.699943 -78.870088 26.699943 -78.726931 26.721065 -78.506329 26.800857 -78.339703 26.850141 -78.187159 26.850141 -78.076858 26.819632 # -b -77.128737 26.345571 -77.095881 26.561480 -77.095881 26.512196 -77.095881 26.404242 -77.138124 26.293941 -77.203835 26.164865 -77.248425 25.916100 -77.370461 26.085072 -77.325871 26.124969 -77.304749 26.195374 -77.314136 26.315062 -77.260159 26.484034 -77.239038 26.561480 -77.203835 26.582602 -77.138124 26.462913 -77.128737 26.345571 # -b -77.382195 25.038384 -77.325871 25.087668 -77.325871 25.108789 -77.403316 25.108789 -77.534739 25.097055 -77.558207 25.026650 -77.382195 25.038384 # -b -78.109714 25.078280 -78.065124 25.068893 -78.044002 24.977366 -77.943088 24.857678 -77.844521 24.735642 -77.832787 24.594832 -77.844521 24.505652 -77.865643 24.435247 -77.954822 24.374230 -78.086245 24.362495 -78.142569 24.414126 -78.220015 24.505652 -78.374906 24.594832 -78.407762 24.726255 -78.374906 24.827169 -78.318582 24.967979 -78.297460 25.097055 -78.306848 25.188581 -78.229402 25.197969 -78.154303 25.207356 -78.109714 25.078280 # -b -77.790544 24.313212 -77.778810 24.322599 -77.844521 24.252194 -77.921967 24.151280 -77.910233 24.080875 -77.790544 24.141893 -77.701364 24.282703 -77.790544 24.313212 # -b -77.832787 24.010470 -77.680243 24.212298 -77.645040 24.059754 -77.612185 23.869660 -77.645040 23.787521 -77.778810 23.839151 -77.832787 24.010470 # -b -76.246327 25.197969 -76.246327 25.258986 -76.222858 25.207356 -76.201737 25.127564 -76.201737 25.038384 -76.201737 24.946857 -76.213471 24.806047 -76.213471 24.695746 -76.333159 24.787273 -76.368362 24.906961 -76.300304 24.967979 -76.279182 25.108789 -76.246327 25.197969 # -b -75.441362 24.343721 -75.385038 24.353108 -75.363916 24.273316 -75.342795 24.172402 -75.417894 24.151280 -75.528195 24.181789 -75.485952 24.313212 -75.551663 24.423513 -75.629109 24.545549 -75.748797 24.686359 -75.805121 24.766151 -75.727676 24.756764 -75.638496 24.665237 -75.572785 24.564323 -75.495339 24.435247 -75.441362 24.343721 # -b -74.526096 24.163014 -74.580074 24.080875 -74.591808 24.001083 -74.481506 24.010470 -74.427529 24.163014 -74.514362 24.163014 # -b -75.298205 23.595080 -75.265349 23.543450 -75.220760 23.433149 -75.176170 23.289992 -75.122192 23.198465 -75.000157 23.158569 -74.922711 22.994291 -74.922711 22.914498 -74.988423 23.036534 -75.131580 23.116326 -75.187904 23.250096 -75.209025 23.360397 -75.220760 23.463658 -75.298205 23.595080 # -b -74.096626 22.658693 -74.096626 22.710324 -74.096626 22.719711 -74.096626 22.729098 -74.096626 22.710324 -74.129481 22.729098 -74.174071 22.729098 -74.249170 22.719711 -74.317228 22.729098 -74.404061 22.790116 -74.415795 22.832359 -74.382939 22.872255 -74.272638 22.832359 -74.150603 22.750220 -74.019180 22.750220 -73.953469 22.689202 -73.941734 22.534311 -74.084891 22.360645 -74.260904 22.229222 -74.305494 22.330136 -74.174071 22.454519 -74.063770 22.576554 -74.096626 22.658693 # -b -72.773011 22.341870 -72.826988 22.433397 -72.972491 22.442784 -73.148504 22.372379 -72.981879 22.391154 -72.862190 22.341870 -72.773011 22.341870 # -b -72.221504 21.971070 -72.099469 22.034435 -72.012636 21.961683 -71.890601 21.910053 -71.759178 21.849035 -71.604287 21.755162 -71.583165 21.724653 -71.702854 21.745774 -71.902335 21.879544 -72.057226 21.931174 -72.242626 21.818526 -72.376395 21.806792 -72.331806 21.888931 -72.221504 21.971070 # -b -73.047590 21.396096 -73.071059 21.396096 -73.071059 21.229471 -73.103914 21.086314 -73.235337 21.004174 -73.455940 20.971319 -73.655421 20.961931 -73.643686 21.168453 -73.455940 21.250592 -73.291661 21.198962 -73.148504 21.302222 -73.047590 21.396096 # -b -80.071668 22.933273 -79.907389 22.811237 -79.785354 22.771341 -79.663318 22.637572 -79.499040 22.485027 -79.355883 22.421663 -79.200992 22.402888 -79.046101 22.454519 -78.881822 22.402888 -78.780908 22.341870 -78.715197 22.421663 -78.583774 22.320749 -78.771521 22.360645 -78.703463 22.330136 -78.506329 22.229222 -78.374906 22.186979 -78.208281 22.074331 -78.097979 21.971070 -78.011147 21.879544 -77.943088 21.867810 -77.778810 21.827914 -77.656774 21.827914 -77.534739 21.736387 -77.436172 21.694144 -77.403316 21.755162 -77.304749 21.684757 -77.194448 21.600271 -77.084147 21.539253 -77.006701 21.457114 -76.917521 21.396096 -76.764977 21.332731 -76.687532 21.271714 -76.621820 21.241205 -76.598352 21.271714 -76.488051 21.271714 -76.290916 21.168453 -76.091435 21.126210 -75.915423 21.137944 -75.772266 21.137944 -75.706554 21.055805 -75.715942 20.961931 -75.793387 20.858671 -75.748797 20.764797 -75.629109 20.713167 -75.495339 20.755410 -75.319327 20.755410 -75.077603 20.755410 -74.857000 20.682658 -74.791289 20.567663 -74.690375 20.485524 -74.526096 20.361142 -74.371205 20.349407 -74.260904 20.340020 -74.206927 20.267268 -74.228048 20.152273 -74.394674 20.131152 -74.603542 20.091256 -74.955567 20.006769 # -b -77.656774 19.840144 -77.713098 20.006769 -77.403316 20.267268 -77.149858 20.494911 -77.227304 20.631028 -77.501883 20.713167 -77.778810 20.703780 -78.020534 20.722554 -78.229402 20.837549 -78.450005 20.961931 -78.518063 21.147331 -78.593162 21.365587 -78.715197 21.569762 -78.947534 21.612005 -79.245582 21.569762 -79.475572 21.612005 -79.729030 21.694144 -79.928511 21.694144 # -b -78.053390 22.290240 -78.163691 22.341870 -78.187159 22.290240 -78.285726 22.391154 -78.142569 22.238610 -78.086245 22.114227 -77.975944 22.043822 -77.900845 21.992192 -77.755341 21.919440 -77.689630 21.919440 -77.701364 22.013314 -77.778810 22.125962 -77.921967 22.217488 -78.053390 22.290240 # -b -81.449260 30.107548 -81.395283 29.924495 -81.350693 29.762563 -81.273247 29.579510 -81.207536 29.405844 -81.141825 29.250953 -81.019789 29.077287 -80.876632 28.884847 -80.745209 28.671285 -80.700620 28.563330 -80.677151 28.427214 -80.688885 28.223039 -80.644296 27.969581 -80.545728 27.842852 -80.468283 27.655105 -80.381450 27.439196 -80.271149 27.204513 -80.181969 27.016766 -80.181969 26.850141 -80.160847 26.641272 -80.160847 26.404242 -80.170235 26.195374 -80.203091 26.007627 -80.280536 25.808146 -80.346247 25.587543 -80.381450 25.437346 -80.381450 25.449080 -80.390837 25.418571 -80.524607 25.308270 -80.667764 25.247252 -80.864898 25.179194 -81.141825 25.148685 -81.240392 25.237865 -81.252126 25.308270 -81.228657 25.427959 -81.329571 25.676723 -81.416404 25.808146 -81.428138 25.836308 -81.493850 25.906713 -81.693331 25.927835 -81.813019 26.047523 -81.890465 26.315062 -82.000766 26.462913 -82.057090 26.561480 -81.967911 26.650660 -81.979645 26.690556 -82.089946 26.631885 -82.132189 26.800857 -82.143923 26.958095 -82.188513 26.918199 -82.287080 26.899424 -82.319936 26.927586 -82.376260 26.997991 -82.474827 27.105946 -82.573394 27.244409 -82.683695 27.439196 -82.707164 27.547151 -82.662574 27.734898 -82.585128 27.920298 -82.641452 27.978968 -82.740019 28.018865 -82.751753 27.861627 -82.838586 27.852239 -82.883176 28.096310 -82.850321 28.359156 -82.784609 28.593839 -82.784609 28.748730 -82.805731 29.018616 -82.871442 29.173507 -83.026333 29.213404 -83.202346 29.328399 -83.324381 29.455128 -83.446417 29.579510 -83.467538 29.570123 -83.479272 29.598285 -83.479272 29.722667 -83.598961 29.781338 -83.742118 29.964391 # -b -84.415660 30.079386 -84.448515 29.964391 -84.525961 29.973778 -84.624528 29.955004 -84.758298 29.868171 -84.824009 29.840009 -84.955432 29.809500 -85.065733 29.809500 -85.187768 29.771950 -85.342659 29.743788 -85.452961 29.877558 -85.495204 29.964391 # -b -89.862664 30.001940 -89.752363 29.992553 # -b -89.388603 30.020715 -89.409725 29.915107 -89.466049 29.849396 -89.585737 29.790725 -89.653796 29.722667 -89.719507 29.598285 -89.609206 29.464515 -89.466049 29.396457 -89.332279 29.347173 -89.212591 29.222791 -89.233712 29.135958 -89.299423 29.096062 -89.421459 29.049125 -89.475436 29.117183 -89.618593 29.309624 -89.818074 29.387069 -89.895520 29.445740 -89.961231 29.483290 # -b -82.310548 23.177344 -82.254224 23.198465 -82.122802 23.219587 -81.935055 23.177344 -81.759042 23.189078 -81.604151 23.137448 -81.472728 23.128060 -81.317837 23.106939 -81.186414 23.076430 -81.052645 23.076430 -80.888366 23.106939 -80.710007 23.076430 -80.578584 22.994291 -80.381450 22.963782 -80.235946 23.024799 -80.071668 22.933273 # -b -79.928511 21.694144 -80.125645 21.766896 -80.325126 21.888931 -80.489404 22.053210 -80.611440 22.095453 -80.745209 22.074331 -80.810921 22.074331 -80.986933 22.083719 -81.162946 22.156470 -81.219270 22.208101 -81.329571 22.064944 -81.449260 22.114227 -81.615885 22.186979 -81.836488 22.196367 -82.000766 22.247997 -82.167392 22.320749 -82.132189 22.412275 -81.890465 22.433397 -81.726187 22.515536 -81.836488 22.628184 -82.099333 22.658693 -82.319936 22.668081 -82.573394 22.698589 -82.772875 22.698589 -82.993477 22.607063 -83.181224 22.463906 -83.303260 22.299627 -83.488660 22.229222 -83.699875 22.196367 -83.920477 22.177592 -84.040166 22.053210 -84.096490 21.971070 -84.227913 21.940562 -84.448515 21.818526 -84.537695 21.745774 -84.558817 21.755162 -84.579938 21.806792 -84.603406 21.919440 -84.824009 21.858422 -85.000022 21.867810 -84.800541 21.931174 -84.690239 22.034435 -84.460249 22.013314 -84.448515 22.177592 -84.415660 22.503802 -84.272503 22.607063 -84.096490 22.729098 -83.852419 22.801850 -83.643551 22.881643 -83.479272 22.945007 -83.246936 22.975516 -83.047455 23.015412 -82.805731 23.076430 -82.629718 23.116326 -82.474827 23.198465 -82.310548 23.177344 # -b -83.014599 21.900665 -82.939500 21.919440 -82.772875 21.806792 -82.683695 21.539253 -82.927766 21.457114 -83.157756 21.529865 -83.148369 21.581496 -83.115513 21.684757 -83.124900 21.827914 -83.014599 21.900665 # -b -86.797697 20.609906 -86.929120 20.600519 -87.060543 20.422159 -87.051155 20.328286 -86.907998 20.433893 -86.797697 20.609906 # -b -90.017555 21.302222 -89.806340 21.384362 -89.630327 21.417217 -89.355748 21.417217 -89.189122 21.426605 -88.914543 21.447726 -88.715062 21.560374 -88.517927 21.612005 -88.339568 21.663635 -88.121312 21.684757 -87.799796 21.621392 -87.799796 21.417217 -87.569806 21.600271 -87.292879 21.569762 -87.018300 21.539253 -86.896264 21.396096 -86.851674 21.198962 -86.875143 21.022949 -86.929120 20.858671 -87.027687 20.755410 -87.149723 20.631028 -87.304614 20.516033 -87.382059 20.370529 -87.492360 20.164007 -87.492360 20.018504 # -b -94.999886 29.241566 -95.032742 29.142999 -95.044476 29.114837 -95.077332 29.037391 -95.089066 28.997495 -95.098453 28.959945 -95.121921 28.920049 -95.232223 28.851991 -95.297934 28.805054 -95.387114 28.736996 -95.473947 28.678325 -95.563126 28.629042 -95.628838 28.579758 -95.673428 28.560984 -95.762607 28.521087 -95.849440 28.492925 -95.926886 28.464763 -96.037187 28.434254 -96.114633 28.424867 -96.126367 28.424867 -96.126367 28.443642 -96.060655 28.492925 -95.971476 28.532821 -95.816585 28.600880 -95.739139 28.629042 -95.706283 28.657204 -95.685162 28.678325 -95.706283 28.687713 -95.750873 28.687713 -95.872909 28.638429 -95.917499 28.629042 -96.004331 28.600880 -96.027800 28.589146 -96.037187 28.579758 -96.048921 28.668938 -96.070043 28.736996 -96.081777 28.736996 -96.102899 28.715875 -96.114633 28.715875 -96.126367 28.697100 -96.126367 28.657204 -96.147488 28.647816 -96.170957 28.638429 -96.192078 28.619654 -96.203812 28.647816 -96.224934 28.697100 -96.302380 28.706487 -96.335235 28.657204 -96.325848 28.610267 -96.335235 28.579758 -96.358704 28.629042 -96.445536 28.687713 -96.501860 28.657204 -96.513595 28.610267 -96.501860 28.542209 -96.445536 28.511700 -96.391559 28.474151 -96.400947 28.424867 -96.436149 28.384971 -96.501860 28.356809 -96.579306 28.375584 -96.645017 28.375584 -96.689607 28.316913 -96.701341 28.260589 -96.734197 28.220692 -96.776440 28.171409 -96.811643 28.152634 -96.865620 28.171409 -96.921944 28.131513 -96.975921 28.122125 -97.065101 28.084576 -97.065101 28.063454 -97.065101 28.025905 -97.065101 27.995396 -97.032245 28.004784 -96.954800 28.035292 -96.943066 27.967234 -96.999390 27.878054 -97.032245 27.819384 -97.065101 27.800609 -97.130812 27.809996 -97.241114 27.800609 -97.262235 27.800609 -97.297438 27.779487 -97.273969 27.760713 -97.229379 27.683267 -97.208258 27.652758 -97.196524 27.554191 -97.196524 27.495520 -97.208258 27.387566 -97.229379 27.288999 -97.262235 27.251450 -97.339681 27.230328 -97.351415 27.251450 -97.351415 27.288999 -97.396005 27.270224 -97.494572 27.279612 -97.527427 27.230328 -97.506306 27.190432 -97.449982 27.190432 -97.384271 27.171657 -97.339681 27.152882 -97.339681 27.063703 -97.351415 26.974523 -97.351415 26.925239 -97.363149 26.915852 -97.407739 26.904118 -97.417126 26.836060 -97.407739 26.756267 -97.396005 26.678822 -97.363149 26.589642 -97.351415 26.500462 -97.351415 26.469953 -97.339681 26.469953 -97.339681 26.439445 -97.330293 26.371386 -97.318559 26.291594 -97.285703 26.282207 -97.241114 26.141397 -97.219992 26.092113 -97.163668 25.974771 -97.163668 25.944262 -97.119078 25.932528 -97.086222 25.913753 -97.086222 25.904366 -97.086222 25.894979 # -b -97.086222 25.894979 -97.086222 25.883245 -97.086222 25.864470 -97.142546 25.775290 -97.184790 25.664989 -97.196524 25.575809 -97.175402 25.564075 -97.142546 25.585197 -97.086222 25.643867 -97.053367 25.744781 -97.032245 25.735394 -97.032245 25.643867 -97.041633 25.564075 -97.086222 25.474895 -97.142546 25.395103 -97.196524 25.345819 -97.262235 25.324698 -97.330293 25.334085 -97.417126 25.364594 -97.494572 25.373981 -97.550896 25.315311 -97.550896 25.275414 -97.550896 25.174500 -97.560283 25.085321 -97.583751 24.984407 -97.628341 24.944511 -97.694053 24.904614 -97.738643 24.822475 -97.748030 24.763804 -97.771498 24.733295 -97.792620 24.672278 -97.792620 24.601873 -97.748030 24.540855 -97.748030 24.430554 -97.748030 24.289744 -97.748030 24.148933 -97.738643 24.026898 -97.738643 23.944759 -97.726908 23.904863 -97.726908 23.855579 -97.661197 23.773440 -97.616607 23.602121 -97.604873 23.388559 -97.604873 23.245402 -97.604873 23.062349 -97.595486 22.898070 -97.595486 22.776035 -97.637729 22.541351 -97.682319 22.377073 -97.694053 22.285546 -97.694053 22.276159 -97.682319 22.194020 -97.637729 22.081372 -97.572017 21.935868 -97.539162 21.874850 -97.482838 21.813833 -97.440595 21.783324 -97.351415 21.668329 -97.273969 21.597924 -97.196524 21.504050 -97.175402 21.443033 -97.175402 21.339772 -97.219992 21.278754 -97.262235 21.215390 -97.285703 21.154372 -97.262235 21.091007 -97.219992 20.978359 -97.196524 20.947850 -97.184790 20.936116 -97.175402 20.905607 -97.130812 20.832855 -97.032245 20.668577 -96.964187 20.553582 -96.877354 20.438587 -96.776440 20.344714 -96.656752 20.220331 -96.546450 20.138192 -96.457271 20.002076 # -b -97.318559 25.275414 -97.273969 25.284802 -97.262235 25.244905 -97.262235 25.183888 -97.262235 25.113483 -97.297438 25.054812 -97.330293 25.033690 -97.339681 25.024303 -97.396005 25.064199 -97.407739 25.143992 -97.396005 25.183888 -97.351415 25.244905 -97.318559 25.275414 # -b -96.865620 27.936725 -96.844498 27.936725 -96.832764 27.976622 -96.811643 28.014171 -96.755319 28.054067 -96.701341 28.103351 -96.666139 28.131513 -96.623896 28.131513 -96.546450 28.171409 -96.490126 28.239467 -96.424415 28.269976 -96.400947 28.248854 -96.412681 28.180796 -96.478392 28.122125 -96.579306 28.035292 -96.666139 27.955500 -96.755319 27.868667 -96.865620 27.751325 -96.931331 27.683267 -96.975921 27.673880 -96.999390 27.711429 -96.964187 27.760713 -96.898476 27.840505 -96.877354 27.878054 -96.865620 27.899176 -96.865620 27.936725 # -b -89.961231 29.483290 -90.071532 29.464515 -90.071532 29.377682 -90.137244 29.290849 -90.226423 29.185242 -90.357846 29.232178 -90.501003 29.232178 -90.557327 29.204016 -90.667628 29.260340 -90.822519 29.194629 -90.986798 29.222791 -91.040775 29.290849 -91.219135 29.272075 -91.338823 29.405844 -91.406881 29.551348 -91.582894 29.570123 -91.702583 29.694505 -91.845740 29.762563 -91.956041 29.818887 -92.134400 29.828274 -92.209499 29.762563 -92.200112 29.675730 -92.286945 29.598285 -92.364390 29.588897 -92.364390 29.598285 -92.531015 29.588897 -92.772739 29.656956 -92.927631 29.703892 -93.115377 29.743788 -93.345367 29.809500 -93.544848 29.809500 -93.831162 29.790725 -94.051765 29.762563 -94.293489 29.675730 -94.514091 29.588897 -94.624392 29.551348 -94.692451 29.520839 -94.791018 29.483290 -94.823873 29.520839 -94.701838 29.551348 -94.680716 29.638181 -94.812139 29.638181 -94.812139 29.809500 -94.889585 29.809500 -94.978764 29.762563 -94.988152 29.598285 -94.999886 29.511452 -94.999886 29.241566 -94.999886 29.396457 # -b -90.634773 19.891775 -90.566714 20.112377 -90.501003 20.403385 -90.491616 20.652149 -90.456413 20.910301 -90.381314 21.126210 -90.271013 21.210696 -90.181833 21.271714 -90.017555 21.302222 # -b -110.113504 24.238113 -109.949226 24.097303 -109.782600 23.987002 -109.716889 23.944759 -109.705155 23.864966 -109.627709 23.764053 -109.561998 23.693647 -109.496287 23.571612 -109.385985 23.480085 -109.341395 23.367437 -109.362517 23.236015 -109.439963 23.123367 -109.540876 23.010718 -109.705155 22.940313 -109.803722 22.837053 -109.892902 22.848787 -109.991469 22.970822 # -b -110.036059 27.054315 -109.958613 27.014419 -109.892902 26.955748 -109.827190 26.875956 -109.782600 26.777389 -109.749745 26.728105 -109.672299 26.678822 -109.648831 26.629538 -109.573732 26.629538 -109.461084 26.638926 -109.395373 26.638926 -109.263950 26.559133 -109.219360 26.439445 -109.174770 26.371386 -109.064469 26.331490 -109.064469 26.261085 -109.120793 26.171905 -109.174770 26.092113 -109.231094 26.063951 -109.263950 25.974771 -109.285071 25.864470 -109.296806 25.744781 -109.275684 25.664989 -109.186504 25.554688 -109.043347 25.545300 -108.965902 25.554688 -108.900190 25.585197 -108.843866 25.625093 -108.822745 25.643867 -108.789889 25.585197 -108.811011 25.514792 -108.843866 25.434999 -108.811011 25.364594 -108.688975 25.303576 -108.512963 25.214397 -108.381540 25.165113 -108.268892 25.143992 -108.182059 25.193275 -108.125735 25.143992 -108.038902 25.054812 -107.937988 24.963285 -107.839421 24.904614 -107.818299 24.773192 -107.818299 24.662890 -107.827687 24.592485 -107.783097 24.522080 -107.696264 24.451675 -107.553107 24.329640 -107.409950 24.228726 -107.264446 24.118425 -107.177613 24.057407 -107.076700 23.965880 -106.978133 23.886088 -106.888953 23.855579 -106.867831 23.834458 -106.846710 23.825070 -106.823241 23.794561 -106.769264 23.742931 -106.736408 23.663139 -106.736408 23.559878 -106.680084 23.510594 -106.558049 23.489473 -106.504072 23.419068 -106.447748 23.346316 -106.403158 23.266523 -106.382036 23.205506 -106.349181 23.144488 -106.271735 23.052961 -106.182555 22.980210 -106.062867 22.898070 -105.940831 22.776035 -105.851652 22.663387 -105.708495 22.571860 -105.577072 22.501455 -105.544216 22.388807 -105.565338 22.367686 -105.565338 22.276159 -105.509014 22.111881 -105.443302 21.947602 -105.422181 21.874850 -105.333001 21.762202 -105.311880 21.701184 -105.288411 21.586190 -105.178110 21.482929 -105.112399 21.360893 -105.067809 21.215390 -105.067809 21.060498 -105.112399 20.966625 -105.201578 20.884486 -105.288411 20.790612 -105.300145 20.760104 -105.288411 20.708473 -105.222700 20.668577 -105.145254 20.595825 -105.135867 20.523073 -105.267290 20.480830 -105.398712 20.429200 -105.487892 20.365835 -105.499626 20.304818 -105.455037 20.253187 -105.398712 20.147580 -105.356469 20.044319 # -b -114.375357 30.027755 -114.297911 29.912761 -114.232200 29.797766 -114.208732 29.710933 -114.143020 29.701545 -114.065575 29.701545 -114.011597 29.663996 -113.967008 29.586550 -113.877828 29.499718 -113.779261 29.443394 -113.680694 29.365948 -113.525803 29.248606 -113.514068 29.192282 -113.502334 29.152386 -113.481213 29.074940 -113.436623 28.997495 -113.415501 28.959945 -113.347443 28.851991 -113.260610 28.873113 -113.159696 28.783933 -113.105719 28.765158 -113.072863 28.793320 -113.016539 28.668938 -112.983684 28.551596 -112.896851 28.424867 -112.861648 28.396705 -112.807671 28.406092 -112.763081 28.384971 -112.741960 28.338034 -112.709104 28.328647 -112.685636 28.220692 -112.631658 28.103351 -112.619924 27.967234 -112.598803 27.859280 -112.563600 27.779487 -112.486155 27.692655 -112.354732 27.594087 -112.211575 27.446237 -112.113008 27.270224 -112.089539 27.141148 -112.089539 27.122374 -112.068418 27.112986 -112.012094 27.082477 -111.934648 27.054315 -111.880671 26.983910 -111.880671 26.944014 -111.824347 26.826672 -111.746901 26.706984 -111.737514 26.608417 -111.627213 26.500462 -111.603745 26.500462 -111.681190 26.568520 -111.704658 26.697596 -111.704658 26.777389 -111.681190 26.777389 -111.615479 26.777389 -111.538033 26.697596 -111.448853 26.629538 -111.394876 26.500462 -111.350286 26.420670 -111.317431 26.371386 -111.293962 26.251698 -111.239985 26.211802 -111.228251 26.113234 -111.218864 26.012321 -111.195395 25.883245 -111.150805 25.735394 -111.129684 25.695498 -111.040504 25.615705 -111.007648 25.545300 -110.920816 25.484283 -110.852757 25.444386 -110.852757 25.315311 -110.852757 25.205009 -110.852757 25.143992 -110.831636 25.153379 -110.765924 25.064199 -110.688479 24.953898 -110.622767 24.822475 -110.622767 24.662890 -110.632155 24.531468 -110.611033 24.451675 -110.533588 24.339027 -110.477264 24.249847 -110.378697 24.158321 -110.280130 24.106690 -110.169828 24.207604 -110.113504 24.238113 # -b -109.991469 22.970822 -110.080649 23.193772 -110.158094 23.376825 -110.280130 23.519982 -110.366962 23.602121 -110.488998 23.642017 -110.599299 23.742931 -110.742456 23.855579 -110.876226 23.956493 -110.974793 24.066794 -111.106216 24.148933 -111.251719 24.198217 -111.329165 24.249847 -111.404264 24.310865 -111.505177 24.400045 -111.516912 24.461063 -111.505177 24.482184 -111.559155 24.482184 -111.615479 24.491571 -111.692924 24.510346 -111.737514 24.561976 -111.758636 24.672278 -111.857203 24.723908 -111.925261 24.712174 -111.979238 24.702787 -112.023828 24.791966 -112.068418 24.773192 -112.113008 24.693399 -112.113008 24.791966 -112.044950 24.914002 -112.002707 25.064199 -111.979238 25.193275 -111.979238 25.345819 -111.979238 25.404490 -111.990972 25.575809 -112.023828 25.695498 -112.113008 25.883245 -112.199841 26.063951 -112.265552 26.162518 -112.366466 26.162518 -112.486155 26.211802 -112.587068 26.282207 -112.709104 26.340877 -112.784203 26.451179 -112.873382 26.559133 -112.929706 26.608417 -113.007152 26.706984 -112.995418 26.777389 -112.983684 26.826672 -113.016539 26.904118 -113.072863 26.836060 -113.150309 26.768001 -113.204286 26.697596 -113.326322 26.718718 -113.448357 26.737493 -113.568046 26.796164 -113.612635 26.836060 -113.657225 26.904118 -113.722937 26.925239 -113.812116 26.974523 -113.877828 26.993298 -113.910683 26.993298 -113.955273 27.091865 -114.053840 27.141148 -114.143020 27.141148 -114.220466 27.152882 -114.297911 27.190432 -114.330767 27.270224 -114.351888 27.378179 -114.396478 27.446237 -114.473924 27.476746 -114.563104 27.495520 -114.617081 27.535417 -114.661671 27.584700 -114.727382 27.624596 -114.771972 27.673880 -114.840030 27.624596 -114.882273 27.643371 -114.872886 27.770100 -114.694526 27.760713 -114.473924 27.732551 -114.286177 27.779487 -114.164142 27.819384 -114.044453 27.741938 -114.032719 27.819384 -114.065575 27.840505 -114.065575 27.917951 -114.011597 27.976622 -113.922418 27.995396 -113.934152 28.084576 -113.910683 28.143247 -113.945886 28.180796 -113.945886 28.269976 -113.934152 28.307525 -113.955273 28.434254 -114.032719 28.511700 -114.110164 28.600880 -114.164142 28.668938 -114.243934 28.736996 -114.330767 28.833216 -114.396478 28.861378 -114.452802 28.910662 -114.518514 28.997495 -114.584225 29.056166 -114.661671 29.084328 -114.717995 29.180548 -114.771972 29.269728 -114.816562 29.307277 -114.861152 29.375335 -114.938597 29.394110 -115.025430 29.394110 -115.093488 29.480943 -115.170934 29.549001 -115.281235 29.577163 -115.346947 29.626447 -115.522959 29.682771 -115.579283 29.741442 -115.612139 29.797766 -115.644995 29.903373 -115.656729 29.971431 # -b -112.685636 30.152138 -112.652780 29.971431 -112.631658 29.893986 -112.554213 29.788378 -112.486155 29.778991 -112.432177 29.720320 -112.420443 29.645221 -112.387587 29.518492 -112.366466 29.412885 -112.321876 29.335439 -112.277286 29.288502 -112.166985 29.229832 -112.101274 29.142999 -112.044950 29.016270 -112.012094 28.910662 -111.934648 28.861378 -111.868937 28.805054 -111.824347 28.736996 -111.779757 28.619654 -111.681190 28.511700 -111.615479 28.443642 -111.526299 28.406092 -111.472322 28.384971 -111.427732 28.366196 -111.415998 28.366196 -111.362021 28.307525 -111.272841 28.180796 -111.174274 28.063454 -111.085094 28.004784 -110.986527 27.936725 -110.897347 27.917951 -110.775312 27.908563 -110.676745 27.887442 -110.566443 27.859280 -110.510119 27.819384 -110.500732 27.770100 -110.500732 27.683267 -110.500732 27.594087 -110.510119 27.594087 -110.533588 27.516642 -110.500732 27.446237 -110.488998 27.359404 -110.456142 27.328895 -110.423286 27.288999 -110.390431 27.251450 -110.324719 27.190432 -110.247274 27.141148 -110.136973 27.091865 -110.036059 27.054315 # -b -118.228860 28.959945 -118.238247 28.969333 -118.238247 28.988108 -118.238247 29.006882 -118.238247 29.037391 -118.205392 29.084328 -118.172536 29.093715 -118.151415 29.037391 -118.151415 28.997495 -118.139680 28.901275 -118.139680 28.823829 -118.139680 28.805054 -118.160802 28.823829 -118.196004 28.882500 -118.228860 28.929437 -118.228860 28.959945 # -b -115.081754 27.976622 -115.114610 27.976622 -115.126344 28.014171 -115.159200 28.014171 -115.192055 28.054067 -115.203790 28.084576 -115.159200 28.131513 -115.138078 28.239467 -115.114610 28.298138 -115.060633 28.307525 -115.048899 28.220692 -115.048899 28.171409 -115.048899 28.103351 -115.037164 28.054067 -115.048899 28.035292 -115.048899 27.995396 -115.060633 27.967234 -115.081754 27.976622 # -b -112.983684 28.969333 -113.040008 28.950558 -113.072863 28.950558 -113.105719 28.997495 -113.150309 29.074940 -113.204286 29.142999 -113.269997 29.201670 -113.326322 29.269728 -113.370911 29.335439 -113.424889 29.412885 -113.448357 29.471556 -113.448357 29.490330 -113.382646 29.452781 -113.305200 29.375335 -113.237142 29.297890 -113.183165 29.220444 -113.082251 29.161773 -113.072863 29.065553 -113.040008 29.037391 -112.983684 29.006882 -112.983684 28.978720 -112.983684 28.969333 # -b -112.366466 28.978720 -112.366466 29.016270 -112.354732 29.093715 -112.342998 29.142999 -112.277286 29.142999 -112.223309 29.114837 -112.188106 29.065553 -112.155251 28.997495 -112.134129 28.929437 -112.145863 28.861378 -112.145863 28.793320 -112.145863 28.746383 -112.188106 28.736996 -112.232696 28.736996 -112.321876 28.746383 -112.375853 28.774546 -112.420443 28.833216 -112.432177 28.873113 -112.411056 28.901275 -112.375853 28.938824 -112.366466 28.978720 # -b -159.617644 22.090759 -159.605910 22.090759 -159.573055 22.090759 -159.528465 22.081372 -159.451019 22.081372 -159.385308 22.100146 -159.352452 22.100146 -159.286741 21.978111 -159.286741 21.905359 -159.373574 21.802098 -159.474488 21.719959 -159.549586 21.731693 -159.617644 21.802098 -159.695090 21.823220 -159.727946 21.905359 -159.695090 21.978111 -159.662234 22.029741 -159.617644 22.090759 # -b -158.115670 21.379668 -158.115670 21.452420 -158.038224 21.494663 -157.906802 21.421911 -157.773032 21.309263 -157.683852 21.227124 -157.728442 21.206002 -157.829356 21.194268 -157.949045 21.175493 -158.059346 21.236511 -158.160260 21.379668 -158.148526 21.421911 -158.115670 21.379668 # -b -157.242647 21.081620 -157.275503 20.987747 -157.242647 21.029990 -157.155814 21.051111 -156.968068 21.039377 -156.846032 21.060498 -156.747465 21.060498 -156.723997 21.020602 -156.723997 20.957238 -156.846032 20.914995 -157.000923 20.947850 -157.099490 20.966625 -157.165202 20.936116 -157.233260 20.926729 -157.266116 20.999481 -157.242647 21.081620 # -b -156.404827 20.790612 -156.381359 20.790612 -156.360237 20.790612 -156.315647 20.823468 -156.238202 20.760104 -156.095045 20.677964 -156.005865 20.626334 -156.005865 20.544195 -156.160756 20.429200 -156.238202 20.417466 -156.339116 20.450321 -156.414215 20.595825 -156.482273 20.687352 -156.547984 20.720207 -156.625430 20.802347 -156.646551 20.823468 -156.613695 20.884486 -156.526863 20.875098 -156.458804 20.823468 -156.404827 20.790612 # -b -155.874442 20.044319 -155.853321 20.023197 -155.853321 20.053706 -155.829853 20.053706 -155.752407 20.044319 # -b -155.829853 19.919937 -155.862708 20.034931 -155.862708 20.044319 -155.874442 20.044319 # -b -156.977455 20.750716 -157.000923 20.771838 -157.000923 20.781225 -156.968068 20.781225 -156.890622 20.781225 -156.824911 20.720207 -156.801442 20.677964 -156.834298 20.626334 -156.890622 20.614600 -156.935212 20.647455 -156.977455 20.699086 -156.977455 20.750716 -156.935212 20.647455 -156.977455 20.699086 -156.977455 20.750716 # -b -177.434817 28.162022 -177.434817 28.162022 # -b 153.950038 24.350761 153.938303 24.329640 153.905448 24.329640 153.881979 24.329640 153.938303 24.390657 153.950038 24.381270 153.872592 24.339027 153.881979 24.381270 153.926569 24.390657 153.938303 24.390657 # -b 145.316031 20.002076 145.360621 20.013810 # -b 145.292563 19.992688 145.304297 20.002076 145.316031 20.002076 # -b 119.913888 26.519237 120.033576 26.629538 120.066432 26.746880 120.078166 26.857181 120.134490 26.894731 120.254179 27.023807 120.355093 27.082477 120.409070 27.162270 120.465394 27.220941 120.542840 27.387566 120.552227 27.495520 120.596817 27.612862 120.662528 27.711429 120.739974 27.779487 120.829153 27.908563 120.951189 28.035292 121.082612 28.220692 121.183526 28.279363 121.270358 28.171409 121.347804 28.131513 121.436984 28.279363 121.469839 28.366196 121.458105 28.483538 121.458105 28.647816 121.535551 28.715875 121.568407 28.882500 121.580141 28.938824 121.556672 28.997495 121.523817 29.037391 121.481574 29.103102 121.490961 29.152386 121.702176 29.201670 121.800743 29.257994 121.833599 29.201670 121.845333 29.257994 121.854720 29.354214 121.854720 29.431659 121.854720 29.509105 121.845333 29.577163 121.756153 29.549001 121.556672 29.462168 121.490961 29.471556 121.657586 29.549001 121.800743 29.663996 121.922779 29.788378 122.021346 29.856437 121.943900 29.884599 121.800743 29.884599 121.666974 29.931535 121.568407 29.980819 # -b 121.446371 25.275414 121.502695 25.254293 121.580141 25.214397 121.657586 25.143992 121.744419 25.143992 121.800743 25.125217 121.854720 25.043078 121.845333 24.975019 121.789009 24.843597 121.779622 24.742683 121.800743 24.611260 121.756153 24.451675 121.657586 24.259235 121.601262 24.137199 121.568407 23.975268 121.547285 23.834458 121.535551 23.712422 121.502695 23.541103 121.458105 23.376825 121.413515 23.275911 121.380660 23.205506 121.326682 23.071736 121.225769 22.909805 121.138936 22.766648 121.016900 22.623491 120.939455 22.459212 120.883131 22.276159 120.850275 22.069638 120.817419 21.947602 120.739974 21.999232 120.674262 22.233916 120.552227 22.428703 120.364480 22.553086 120.188467 22.806544 120.143878 23.010718 120.101635 23.254789 120.078166 23.449577 120.078166 23.580999 120.111022 23.752318 120.254179 24.017511 120.364480 24.158321 120.519371 24.400045 120.685997 24.611260 120.840888 24.822475 120.951189 24.993794 121.127202 25.104095 121.258624 25.165113 121.336070 25.244905 121.404128 25.263680 # -b 123.732188 24.421166 123.809634 24.409432 123.865958 24.369536 123.865958 24.310865 123.833102 24.280356 123.732188 24.268622 123.711067 24.339027 123.732188 24.421166 # -b 124.107682 24.400045 124.074826 24.421166 124.107682 24.439941 124.185128 24.470450 124.229718 24.510346 124.250839 24.461063 124.217983 24.369536 124.131150 24.320252 124.107682 24.400045 # -b 127.794560 26.519237 127.872006 26.589642 127.872006 26.629538 127.883740 26.706984 127.972920 26.688209 128.137198 26.786776 128.193522 26.866569 128.202909 26.746880 128.137198 26.589642 128.005775 26.528624 127.916596 26.451179 127.862618 26.390161 127.862618 26.350265 127.785173 26.272819 127.785173 26.193027 127.740583 26.141397 127.674872 26.261085 127.695993 26.350265 127.717115 26.430057 127.749970 26.460566 127.773439 26.479341 127.794560 26.519237 # -b 128.932775 27.791222 128.942162 27.770100 128.942162 27.770100 128.953897 27.720817 128.909307 27.702042 128.876451 27.760713 128.867064 27.840505 128.876451 27.908563 128.888185 27.917951 128.899919 27.878054 128.909307 27.849892 128.909307 27.809996 128.921041 27.800609 128.932775 27.800609 128.932775 27.791222 # -b 129.395102 28.415480 129.472547 28.443642 129.582848 28.511700 129.618051 28.483538 129.594583 28.375584 129.505403 28.328647 129.463160 28.279363 129.430304 28.230080 129.352859 28.180796 129.320003 28.190184 129.275413 28.239467 129.263679 28.328647 129.296535 28.366196 129.352859 28.415480 129.395102 28.415480 # -b 125.311609 24.822475 125.267019 24.852984 125.267019 24.852984 125.278753 24.834209 125.332730 24.791966 125.410176 24.763804 125.433644 24.723908 125.356198 24.681665 125.311609 24.742683 125.311609 24.822475 # -b 109.911676 20.386957 110.099423 20.271962 110.385737 20.398691 110.397471 20.595825 110.329413 20.729595 110.186256 20.926729 110.284823 21.142638 110.397471 21.379668 110.561750 21.328038 110.826942 21.400790 110.993567 21.473541 111.035810 21.534559 111.202436 21.515784 111.444160 21.546293 111.643641 21.597924 111.831388 21.762202 111.998013 21.792711 112.019134 21.792711 112.075458 21.752815 112.075458 21.752815 112.239737 21.741081 112.361772 21.813833 112.448605 21.813833 112.561253 21.834954 112.671555 21.874850 112.835833 21.956989 112.913279 21.926481 112.969603 21.978111 112.969603 22.121268 112.946134 22.203407 112.957868 22.337177 113.023580 22.531964 113.068170 22.632878 113.112760 22.520230 113.244182 22.428703 113.342749 22.327789 113.399073 22.255038 113.455397 22.245650 113.521109 22.276159 113.530496 22.327789 113.509375 22.449825 113.509375 22.562473 113.509375 22.632878 113.521109 22.705630 113.542230 22.837053 113.542230 22.818278 113.598554 22.736139 113.741711 22.684508 113.873134 22.592982 113.929458 22.553086 113.983435 22.470946 113.962314 22.428703 113.983435 22.346564 114.138326 22.367686 114.204038 22.377073 114.293218 22.407582 114.272096 22.438091 114.227506 22.470946 114.204038 22.510843 114.204038 22.531964 114.204038 22.541351 114.215772 22.541351 114.227506 22.553086 114.281483 22.553086 114.358929 22.562473 114.436375 22.562473 114.525554 22.553086 114.570144 22.541351 114.579531 22.553086 114.570144 22.623491 114.579531 22.724405 114.647590 22.745526 114.734423 22.776035 114.734423 22.705630 114.790747 22.602369 114.912782 22.614103 115.011349 22.745526 115.175628 22.848787 115.321131 22.797156 115.330519 22.715017 115.431433 22.675121 115.551121 22.705630 115.562855 22.776035 115.640301 22.848787 115.738868 22.806544 115.893759 22.776035 116.048650 22.848787 116.104974 22.879296 116.126096 22.879296 116.191807 22.898070 116.313843 22.949701 116.403022 22.980210 116.513324 23.041227 116.567301 23.083470 116.623625 23.184384 116.722192 23.275911 116.787903 23.397946 116.844227 23.458964 116.921673 23.571612 117.053096 23.611508 117.130541 23.580999 117.229108 23.642017 117.306554 23.712422 117.374612 23.712422 117.440324 23.672526 117.449711 23.703035 117.461445 23.813336 117.562359 23.886088 117.604602 23.752318 117.628070 23.874354 117.660926 23.956493 117.747759 23.956493 117.860407 24.066794 118.003564 24.179442 118.069275 24.329640 118.003564 24.421166 117.991830 24.470450 118.024685 24.491571 118.134987 24.583098 118.278144 24.552589 118.423647 24.561976 118.555070 24.583098 118.587926 24.592485 118.599660 24.601873 118.641903 24.651156 118.686493 24.681665 118.709961 24.763804 118.721695 24.843597 118.796794 24.904614 118.853118 24.932776 118.907095 25.054812 118.951685 25.183888 119.061987 25.205009 119.130045 25.165113 119.184022 25.235518 119.205144 25.254293 119.162901 25.373981 119.240346 25.465508 119.350647 25.453774 119.437480 25.413878 119.470336 25.465508 119.437480 25.594584 119.449214 25.695498 119.503192 25.714273 119.547781 25.763556 119.604106 25.873857 119.625227 25.963037 119.625227 25.993546 119.615840 26.024055 119.615840 26.042829 119.615840 26.052217 119.636961 26.122622 119.702673 26.261085 119.726141 26.310369 119.714407 26.380774 119.681551 26.439445 119.615840 26.540358 119.580637 26.617804 119.559516 26.648313 119.702673 26.756267 119.857564 26.777389 119.878685 26.638926 119.878685 26.549746 119.913888 26.519237 # -b 110.496038 20.065440 110.463183 20.074828 110.550016 20.159314 110.683785 20.065440 110.883266 20.034931 # -b 109.932798 19.992688 110.054833 20.002076 110.186256 20.095949 110.329413 20.074828 110.418593 20.086562 110.496038 20.065440 # -b 113.950580 22.264425 113.905990 22.327789 113.873134 22.276159 113.863747 22.233916 113.929458 22.245650 113.950580 22.264425 # -b 107.945029 21.473541 108.099920 21.534559 108.198487 21.597924 108.254811 21.421911 108.254811 21.534559 108.421436 21.567415 108.496535 21.710572 108.573980 21.719959 108.707750 21.668329 109.059775 21.576802 109.083244 21.494663 109.170077 21.412524 109.357823 21.421911 109.536183 21.534559 109.655871 21.586190 109.733317 21.452420 109.667606 21.267020 109.601894 21.091007 109.590160 21.029990 109.623016 20.905607 109.777907 20.614600 109.911676 20.386957 # -b 107.945029 21.473541 107.933294 21.421911 107.879317 21.379668 107.724426 21.433645 107.569535 21.349159 107.381788 21.257633 107.348932 21.102741 107.172920 20.966625 106.996907 20.905607 106.830282 20.832855 106.752836 20.738982 106.621414 20.626334 106.553355 20.377569 106.356221 20.220331 106.168474 20.053706 # -b 92.268170 20.884486 92.223580 20.863364 92.092157 21.154372 92.026446 21.391402 91.960735 21.649554 91.937266 21.895972 91.871555 22.233916 91.737785 22.449825 91.561773 22.693896 91.439737 22.776035 91.242603 22.715017 91.010266 22.693896 90.867109 22.766648 90.766195 22.940313 90.691097 22.898070 90.623039 22.724405 90.491616 22.632878 90.536206 22.419316 90.545593 22.276159 90.545593 22.233916 90.458760 22.111881 90.280401 21.917093 90.193568 21.802098 90.116122 21.844341 # -b 93.472096 19.804942 92.953446 20.053706 92.941712 20.241453 92.786820 20.271962 92.676519 20.417466 92.643664 20.365835 92.521628 20.471443 92.444183 20.635721 92.345615 20.760104 92.268170 20.884486 # -b 90.613651 22.684508 90.613651 22.614103 90.623039 22.489721 90.623039 22.327789 90.766195 22.285546 90.855375 22.407582 90.855375 22.541351 90.766195 22.715017 90.691097 22.745526 90.613651 22.684508 # -b 88.891074 21.628433 88.780773 21.597924 88.747917 21.586190 88.691593 21.649554 88.637616 21.813833 88.593026 21.741081 88.581292 21.607311 88.503846 21.628433 88.405279 21.555681 88.262122 21.534559 88.194064 21.668329 88.140087 21.689450 88.095497 21.680063 88.083763 21.710572 88.083763 21.823220 88.083763 21.865463 88.083763 21.926481 88.107231 22.029741 88.116619 22.081372 88.116619 22.090759 88.116619 22.111881 88.116619 22.121268 88.062641 22.133002 87.964074 22.018007 87.928872 21.917093 87.842039 21.771589 87.720003 21.689450 87.543991 21.628433 87.123907 21.443033 86.959629 21.360893 86.846981 21.091007 86.924426 20.832855 86.959629 20.677964 86.771882 20.490218 86.727292 20.377569 86.572401 20.199210 # -b 90.116122 21.844341 89.940109 22.060250 89.850930 21.947602 89.818074 21.853729 89.707773 21.783324 89.642061 21.719959 89.585737 21.844341 89.487170 21.762202 89.376869 21.771589 89.287689 21.783324 89.275955 21.701184 89.210244 21.731693 89.144532 21.719959 89.088208 21.637820 89.013110 21.597924 88.891074 21.628433 # -b 72.594651 19.950445 72.627507 20.086562 72.672097 20.189823 72.728421 20.356448 72.728421 20.511339 72.704952 20.708473 72.627507 20.914995 72.606385 20.978359 72.594651 20.987747 72.585264 21.029990 72.561795 21.102741 72.561795 21.154372 72.496084 21.154372 72.484350 21.206002 72.484350 21.297529 72.496084 21.400790 72.540674 21.525172 72.594651 21.628433 72.484350 21.680063 72.439760 21.731693 72.451494 21.802098 72.463228 21.895972 72.474962 21.926481 72.418638 21.947602 72.430373 21.987498 72.474962 22.090759 72.496084 22.163511 72.573530 22.163511 72.695565 22.163511 72.737808 22.212794 72.794132 22.264425 72.782398 22.294934 72.650975 22.306668 72.507818 22.306668 72.385783 22.306668 72.254360 22.306668 72.186302 22.337177 72.141712 22.407582 72.141712 22.388807 72.132325 22.306668 72.108856 22.142389 72.076000 22.039129 72.054879 21.935868 72.054879 21.823220 72.043145 21.628433 72.031411 21.482929 71.944578 21.309263 71.834276 21.154372 71.679385 21.072233 71.524494 20.978359 71.414193 20.966625 71.357869 20.936116 71.271036 20.884486 71.238180 20.863364 71.226446 20.853977 71.116145 20.823468 70.916664 20.781225 70.686674 20.802347 70.585760 20.802347 70.442603 20.802347 70.344036 20.823468 70.278325 20.884486 70.266591 20.884486 70.132821 20.987747 # -b 69.825386 22.428703 70.013132 22.553086 70.200879 22.705630 70.266591 22.879296 70.344036 23.052961 70.287712 23.144488 70.200879 23.113979 70.132821 22.980210 70.013132 22.940313 # -b 68.025363 23.773440 68.079340 23.764053 67.992507 23.752318 67.858738 23.803949 67.760171 23.834458 67.694459 23.843845 67.551302 23.843845 67.494978 23.895475 67.462123 23.996389 67.340087 24.127812 67.253254 24.320252 67.185196 24.500959 67.140606 24.611260 67.131219 24.712174 67.053773 24.712174 66.866026 24.773192 66.732257 24.843597 66.699401 24.975019 66.678280 25.125217 66.666546 25.183888 66.612568 25.263680 66.478799 25.355207 66.356763 25.413878 66.180751 25.444386 65.993004 25.404490 65.805257 25.373981 65.563533 25.364594 65.429763 25.373981 65.298341 25.334085 65.155184 25.275414 65.000293 25.315311 # -b 70.132821 20.987747 69.945074 21.142638 69.715084 21.391402 69.262145 21.813833 69.172965 21.874850 68.964097 22.081372 68.919507 22.346564 68.996953 22.428703 69.083786 22.377073 69.151844 22.316055 69.262145 22.346564 69.360712 22.367686 69.503869 22.388807 69.604783 22.388807 69.825386 22.428703 # -b 70.013132 22.940313 69.968543 22.919192 69.945074 22.919192 69.679882 22.848787 69.426424 22.818278 69.283267 22.818278 69.128376 22.827665 68.919507 22.858174 68.752882 22.940313 68.565135 23.123367 68.433712 23.266523 68.299943 23.428455 68.234231 23.571612 68.189642 23.571612 68.135664 23.571612 68.102809 23.580999 68.091074 23.651404 68.079340 23.724156 68.025363 23.773440 # -b 61.616156 25.158073 61.571566 25.167460 61.437797 25.118176 61.174951 25.136951 60.942615 25.188581 60.632832 25.277761 60.501410 25.409184 60.379374 25.317657 60.015615 25.338779 # -b 65.000293 25.315311 64.824280 25.338779 64.723366 25.348166 64.591943 25.148685 64.502764 25.247252 64.282161 25.247252 64.117883 25.366941 63.864424 25.338779 63.622700 25.366941 63.479543 25.237865 63.235473 25.207356 62.970280 25.247252 62.716822 25.268374 62.519688 25.258986 62.364797 25.188581 62.242761 25.136951 62.111339 25.207356 61.968182 25.097055 61.825025 25.087668 61.726458 25.038384 61.681868 25.136951 61.616156 25.158073 # -b 49.938305 26.810245 50.027484 26.711677 50.015750 26.662394 50.006363 26.533318 50.072074 26.444138 50.149520 26.345571 50.158907 26.176599 50.137786 26.115581 50.060340 26.047523 50.083808 25.848042 50.203497 25.676723 50.358388 25.547647 50.480424 25.418571 50.513279 25.197969 50.623581 25.167460 50.743269 25.467855 50.853570 25.587543 50.931016 25.768250 50.975606 25.995893 51.074173 26.124969 51.175087 26.195374 51.273654 26.075685 51.362834 25.946609 51.461401 25.817533 51.470788 25.667336 51.461401 25.507751 51.470788 25.366941 51.527112 25.298883 51.538846 25.007875 51.482522 24.885840 51.416811 24.726255 51.318244 24.625341 51.327631 24.554936 51.405077 24.524427 51.351099 24.463409 51.318244 24.303825 51.482522 24.334333 51.571702 24.273316 51.658535 24.313212 51.703125 24.132506 51.726593 24.120771 51.768836 24.071488 51.968317 24.031592 52.221775 24.010470 52.364932 24.031592 52.463499 24.132506 52.606656 24.221685 52.850727 24.212298 53.047861 24.202911 53.181631 24.141893 53.334175 24.141893 53.467945 24.090263 53.676813 24.101997 53.897416 24.111384 54.073428 24.212298 54.118018 24.282703 54.183729 24.303825 54.261175 24.282703 54.371476 24.353108 54.359742 24.564323 54.514633 24.735642 54.735236 24.885840 55.000428 25.097055 55.209296 25.308270 55.408777 25.498364 55.561322 25.636827 55.749068 25.737741 55.948549 25.937222 56.035382 26.136703 56.145684 26.254045 56.202008 26.254045 56.300575 26.315062 56.378020 26.275166 56.366286 26.195374 56.312309 26.155478 56.300575 26.085072 56.345165 26.047523 56.345165 25.887938 56.246598 25.737741 56.223129 25.667336 56.267719 25.596931 56.267719 25.418571 56.255985 25.167460 56.279453 24.906961 56.366286 24.695746 56.565767 24.515040 56.720658 24.362495 56.819225 24.221685 56.929527 24.191177 57.072683 24.111384 57.161863 24.040979 57.039828 24.120771 57.028094 24.120771 57.060949 24.080875 57.182985 24.019858 57.326142 23.949452 57.502154 23.888435 57.591334 23.857926 57.713369 23.818030 57.889382 23.787521 58.053661 23.787521 58.196818 23.717116 58.307119 23.656098 58.440888 23.665485 58.605167 23.604468 58.659144 23.543450 58.769445 23.433149 58.814035 23.351010 58.914949 23.259483 58.957192 23.137448 59.058106 23.045921 59.144939 22.994291 59.177795 22.832359 59.266974 22.759607 59.365541 22.677468 59.499311 22.646959 59.586144 22.646959 59.619000 22.597675 59.684711 22.546045 59.762157 22.463906 59.719914 22.330136 59.651855 22.177592 59.630734 22.043822 59.487577 21.797405 59.344420 21.612005 59.210650 21.417217 59.079228 21.313957 58.914949 21.198962 58.769445 20.992440 58.715468 20.837549 58.638023 20.764797 58.539455 20.567663 58.417420 20.422159 58.297731 20.443281 58.229673 20.494911 58.187430 20.619293 58.098250 20.579397 57.955094 20.403385 57.767347 20.152273 57.689901 20.070134 # -b 50.555522 26.235270 50.480424 26.254045 50.424100 26.284553 50.424100 26.106194 50.456955 25.967731 50.546135 26.007627 50.555522 26.235270 # -b 60.015615 25.338779 59.752769 25.348166 59.421865 25.409184 59.210650 25.477242 59.123817 25.449080 59.090962 25.378675 58.870359 25.507751 58.626288 25.578156 58.307119 25.587543 57.931625 25.627440 57.734491 25.688457 57.415321 25.707232 57.260430 25.927835 57.117273 26.235270 57.051562 26.512196 57.028094 26.641272 57.016359 26.641272 56.983504 26.711677 56.896671 26.908812 56.619744 27.066050 56.443732 27.124720 56.300575 27.134108 56.169152 27.084824 55.925081 26.997991 55.727947 26.948708 55.573056 26.899424 55.462755 26.770348 55.307863 26.699943 55.131851 26.690556 54.833803 26.533318 54.624934 26.493422 54.359742 26.552093 54.240053 26.650660 53.963127 26.699943 53.709669 26.662394 53.587633 26.662394 53.411621 26.838407 53.479679 26.810245 53.467945 26.887690 53.334175 26.958095 53.026740 27.056662 52.749813 27.134108 52.597269 27.331242 52.597269 27.401647 52.430644 27.558885 52.165451 27.685614 51.923727 27.753672 51.625679 27.772447 51.461401 27.852239 51.327631 27.997743 51.306510 28.009477 51.261920 28.096310 51.175087 28.368543 51.008462 28.652510 50.942750 28.884847 50.755003 29.018616 50.578991 29.154733 50.501545 29.387069 50.424100 29.541961 50.269208 29.617059 50.170641 29.753176 50.072074 29.868171 50.048606 29.983166 # -b 56.169152 26.927586 56.091706 26.948708 55.925081 26.927586 55.760803 26.918199 55.683357 26.779736 55.474489 26.662394 55.253886 26.582602 55.275008 26.512196 55.540200 26.573214 55.760803 26.631885 56.035382 26.829019 56.169152 26.927586 # -b 40.457091 19.997382 40.346790 20.091256 40.281078 20.121764 40.182511 20.203904 40.083944 20.267268 # -b 48.495001 28.300485 48.506735 28.300485 48.539591 28.204265 48.584181 28.086923 48.649892 27.988356 48.727338 27.871014 48.879882 27.821730 48.980796 27.636330 49.112219 27.558885 49.234254 27.500214 49.267110 27.450931 49.201398 27.411034 49.255376 27.342976 49.288231 27.183391 49.389145 27.134108 49.443122 27.145842 49.520568 27.084824 49.675459 26.997991 49.806882 26.927586 49.938305 26.810245 # -b 48.262664 28.807401 48.274399 28.748730 48.295520 28.671285 48.318988 28.572718 48.405821 28.495272 48.473880 28.368543 48.495001 28.300485 # -b 48.372966 29.955004 48.372966 29.924495 # -b 48.065530 30.079386 47.966963 29.992553 48.009206 29.924495 48.208687 29.809500 48.274399 29.694505 48.152363 29.598285 47.910639 29.551348 47.746361 29.464515 47.690037 29.337786 47.767482 29.337786 47.889518 29.337786 48.042062 29.281462 48.098386 29.117183 48.142976 28.952905 48.220421 28.816789 # -b 48.551325 30.098161 48.473880 29.973778 # -b 49.663725 30.069999 49.532302 29.945616 49.487712 29.992553 # -b 32.365203 30.163872 32.386325 29.983166 32.386325 29.886945 32.353469 29.722667 32.365203 29.588897 32.419180 29.434006 32.529482 29.173507 32.630396 28.952905 32.696107 28.798014 32.794674 28.631389 32.916710 28.436601 33.092722 28.253548 33.292203 28.056414 33.411892 27.960194 33.456482 27.950806 33.477603 27.880401 33.477603 27.772447 33.489337 27.626943 33.522193 27.518989 33.655963 27.342976 33.787385 27.223287 33.853097 26.997991 33.909421 26.800857 33.951664 26.582602 34.085433 26.324450 34.216856 26.124969 34.327157 25.866817 34.493783 25.667336 34.592350 25.467855 34.702651 25.207356 34.812952 25.017262 34.923254 24.876452 35.045289 24.625341 35.120388 24.484531 35.242423 24.343721 35.373846 24.233420 35.561593 24.080875 35.716484 23.958840 35.728218 23.928331 35.728218 23.909556 35.716484 23.879047 35.716484 23.869660 35.662507 23.909556 35.484147 23.949452 35.418436 23.857926 35.474760 23.726503 35.474760 23.543450 35.495881 23.320501 35.552205 23.189078 # -b 36.831231 22.001579 36.852352 21.867810 36.852352 21.724653 36.896942 21.518131 37.040099 21.344465 37.159787 21.220083 37.204377 21.107435 37.150400 21.116822 37.159787 20.776531 37.183256 20.422159 37.183256 20.152273 # -b 35.552205 23.189078 35.573327 23.106939 35.662507 22.975516 35.793929 22.790116 36.059122 22.698589 36.256256 22.585941 36.467471 22.360645 36.631750 22.278506 36.831231 22.001579 # -b 34.890398 29.492677 34.934988 29.387069 34.911519 29.445740 34.801218 29.368295 34.756628 29.272075 34.735507 29.250953 34.735507 29.232178 34.679183 29.107796 34.646327 28.981067 34.592350 28.826176 34.547760 28.652510 34.482049 28.485885 34.392869 28.309872 34.383481 28.164368 34.392869 28.028252 34.360013 27.929685 34.294302 27.880401 34.139411 27.793568 33.942276 27.842852 33.820241 27.969581 33.632494 28.173756 33.477603 28.330994 33.379036 28.436601 33.224145 28.622001 33.191289 28.875459 33.104456 29.039738 32.893241 29.250953 32.827530 29.377682 32.705494 29.520839 32.672639 29.656956 32.663251 29.753176 32.651517 29.771950 32.630396 29.840009 32.574072 29.915107 32.552950 29.992553 # -b 37.910775 24.172402 37.877919 24.212298 37.854451 24.212298 37.821595 24.221685 37.800473 24.273316 37.734762 24.303825 37.657316 24.343721 37.547015 24.343721 37.481304 24.322599 37.403858 24.353108 37.371003 24.475144 37.281823 24.606566 37.159787 24.735642 37.159787 24.897574 37.183256 24.928083 37.126932 25.078280 37.072955 25.258986 37.007243 25.418571 36.906329 25.547647 36.786641 25.756516 36.631750 25.817533 36.577772 25.887938 36.542570 26.007627 36.422881 26.146090 36.333701 26.244657 36.256256 26.423017 36.169423 26.641272 36.059122 26.770348 35.925352 26.859528 35.772808 27.026153 35.695362 27.134108 35.671894 27.223287 35.617917 27.281958 35.540471 27.371138 35.517003 27.429809 35.474760 27.518989 35.409048 27.636330 35.319869 27.772447 35.254157 27.892136 35.197833 27.969581 35.155590 28.056414 35.054676 28.124472 34.899785 28.124472 34.747241 28.145594 34.714385 28.164368 34.625205 28.145594 34.580616 28.065801 34.604084 28.136206 34.702651 28.321606 34.789484 28.535168 34.801218 28.739343 34.801218 28.884847 34.834074 29.018616 34.857542 29.058513 34.911519 29.185242 34.890398 29.492677 # -b 40.083944 20.267268 39.973643 20.318899 39.938440 20.340020 39.938440 20.328286 39.896197 20.318899 39.785896 20.361142 39.684982 20.422159 39.532438 20.506645 39.398668 20.609906 39.321223 20.703780 39.255511 20.816428 39.201534 20.931423 39.145210 21.107435 39.124088 21.241205 39.100620 21.374974 39.091233 21.447726 39.079499 21.508744 39.067764 21.539253 39.058377 21.621392 39.046643 21.694144 39.023175 21.806792 38.990319 21.849035 38.957463 21.919440 38.948076 22.013314 38.990319 22.053210 39.034909 22.177592 39.058377 22.299627 39.058377 22.402888 39.023175 22.503802 38.980931 22.646959 38.924607 22.759607 38.847162 22.841746 38.781451 22.984903 38.748595 23.097551 38.736861 23.158569 38.671149 23.259483 38.593704 23.442536 38.483402 23.634977 38.363714 23.818030 38.220557 23.928331 38.086787 24.059754 37.955365 24.141893 37.910775 24.172402 # -b 0.072752 39.816405 -0.105608 39.628658 -0.171319 39.450299 -0.215909 39.389281 -0.225296 39.363466 -0.225296 39.330610 -0.159585 39.253164 -0.126729 39.107661 -0.082139 39.013787 # -b 0.225296 38.652375 -0.004694 38.504524 -0.183053 38.417691 -0.302742 38.314430 -0.391921 38.183008 -0.478754 38.079747 -0.523344 37.938937 -0.612524 37.826289 -0.657114 37.704253 -0.621911 37.617420 -0.788537 37.589258 -0.997405 37.582218 -1.196886 37.547015 -1.361164 37.432020 -1.570033 37.284170 -1.626357 37.150400 -1.692068 37.009590 -1.769514 36.894595 -1.868081 36.798375 -2.011238 36.779600 -2.231840 36.814803 -2.508767 36.725623 -2.738757 36.735010 -3.027417 36.788987 -3.323119 36.753785 -3.555455 36.779600 -3.874625 36.753785 -4.052984 36.725623 -4.217263 36.709195 -4.426131 36.530836 -4.658468 36.514408 -4.867336 36.441656 -5.022227 36.310233 -5.076204 36.221053 -5.165384 36.148301 -5.209974 36.138914 -5.242830 36.113099 -5.308541 36.084937 -5.407108 36.094324 -5.618323 36.129527 -5.838926 36.256256 -5.958614 36.397066 -6.036060 36.505020 -6.057181 36.629403 -6.190951 36.718582 -6.202685 36.868780 -6.277784 36.993162 -6.432675 37.098770 -6.575832 37.159787 -6.709602 37.211418 -6.841024 37.239580 -6.984181 37.239580 -7.237640 37.220805 # -b -8.725533 40.086291 -8.770123 39.943134 -8.847568 39.790590 -8.880424 39.687329 -8.990725 39.518357 -9.133882 39.372853 -9.211328 39.269592 -9.211328 39.166331 -9.211328 39.013787 -9.255918 38.901139 -9.288773 38.807266 -9.277039 38.762676 -9.124495 38.685230 -9.002460 38.546767 -8.946136 38.462281 -8.814713 38.504524 -8.650434 38.530339 -8.549520 38.539726 -8.561255 38.478709 -8.615232 38.417691 -8.605844 38.349633 -8.605844 38.192395 -8.650434 38.018729 -8.615232 37.922509 -8.626966 37.800473 -8.626966 37.781699 -8.626966 37.730068 -8.615232 37.598646 -8.650434 37.467223 -8.749001 37.284170 -8.760736 37.124585 -8.704411 37.070608 -8.507277 37.115198 -8.286675 37.115198 -8.054338 37.105810 -7.887713 37.063567 -7.690579 37.063567 -7.523953 37.105810 -7.392531 37.178562 -7.270495 37.204377 -7.237640 37.220805 # -b -1.945526 35.096919 -1.814104 35.106307 -1.570033 35.179059 -1.283719 35.312828 -1.140562 35.458332 -0.964549 35.664853 -0.755681 35.772808 -0.579668 35.791583 -0.469367 35.772808 -0.347332 35.845560 -0.258152 35.915965 -0.061018 35.845560 # -b -9.729978 29.849396 -9.619677 30.020715 -9.607943 30.098161 -9.607943 30.231930 -9.631411 30.384474 -9.697123 30.499469 -9.807424 30.670788 -9.762834 30.842107 -9.762834 31.060363 -9.751100 31.266884 -9.718244 31.391267 -9.619677 31.541464 -9.509376 31.691662 -9.399075 31.853593 -9.399075 31.909917 -9.166738 32.027259 -9.166738 32.027259 -9.211328 31.999097 -9.190206 32.046034 -9.124495 32.168069 -9.035315 32.355816 -9.068171 32.534175 -8.903892 32.700801 -8.659822 32.933137 -8.495543 33.146699 -8.319531 33.285163 -8.021482 33.404851 -7.735169 33.498725 -7.491098 33.580864 -7.228252 33.700552 -7.007650 33.810854 -6.808169 33.930542 -6.608688 34.122983 -6.477265 34.378788 -6.277784 34.597043 -6.167483 34.852848 -6.080650 35.096919 -5.982083 35.322216 -5.860047 35.566286 -5.782602 35.754033 -5.684035 35.817398 -5.517409 35.852600 -5.296807 35.915965 -5.231096 35.826785 -5.132528 35.655466 -5.010493 35.538124 -4.879070 35.430170 -4.813359 35.394967 -4.634999 35.305788 -4.482455 35.204874 -4.294708 35.169671 -4.074106 35.223648 -3.853503 35.287013 -3.722081 35.258851 -3.567189 35.268238 -3.379443 35.258851 -3.248020 35.268238 -3.081395 35.277626 -2.949972 35.322216 -2.806815 35.258851 -2.663658 35.169671 -2.475911 35.122735 -2.276430 35.141509 -1.945526 35.096919 # -b -16.775178 32.804061 -16.796299 32.813449 -16.873745 32.785287 -17.007514 32.813449 -17.040370 32.757125 -16.951190 32.644477 -16.754056 32.606927 -16.608552 32.644477 -16.632021 32.766512 -16.775178 32.804061 # -b -16.190816 33.118537 -16.268261 33.099763 -16.289383 33.052826 -16.301117 32.989461 -16.235405 32.989461 -16.223671 33.109150 # -b -28.572718 38.617172 -28.659551 38.581970 -28.626695 38.513911 -28.560984 38.539726 -28.572718 38.617172 # -b -28.042333 38.401263 -27.955500 38.427078 -28.054067 38.478709 -28.208958 38.520952 -28.340381 38.546767 -28.406092 38.520952 -28.396705 38.452894 -28.286404 38.408304 -28.164368 38.391876 -28.042333 38.401263 # -b -27.723163 38.572582 -27.678574 38.598397 -27.678574 38.607785 -27.734898 38.626559 -27.845199 38.633600 -27.976622 38.678190 -28.065801 38.720433 -28.108044 38.720433 -28.042333 38.659415 -27.899176 38.581970 -27.779487 38.539726 -27.723163 38.572582 # -b -27.051969 38.772063 -27.094212 38.797878 -27.227981 38.762676 -27.260837 38.704005 -27.183391 38.659415 -27.061356 38.633600 -26.983910 38.685230 -27.051969 38.772063 # -b -25.054812 37.835676 -25.087668 37.852104 -25.230824 37.852104 -25.573462 37.842716 -25.704885 37.861491 -25.695498 37.800473 -25.528873 37.739456 -25.331738 37.704253 -25.120523 37.739456 -25.054812 37.835676 # -b -24.932776 36.974387 -24.923389 37.009590 -24.944511 37.018977 -25.033690 36.974387 -24.989100 36.939185 -24.932776 36.974387 # -b -31.053322 39.440911 -31.065057 39.508969 -31.119034 39.518357 -31.163624 39.415096 -31.119034 39.372853 -31.053322 39.440911 # -b -64.613065 32.365203 -64.603677 32.430915 -64.613065 32.412140 -64.624799 32.374591 -64.669389 32.346429 -64.713979 32.308879 -64.735100 32.271330 -64.735100 32.252555 -64.713979 32.252555 -64.648267 32.271330 -64.624799 32.318267 -64.613065 32.365203 # -b -74.019180 40.001805 -74.040301 39.985377 # -b -74.073157 40.001805 -74.106013 39.975990 -74.138869 39.900891 -74.174071 39.799977 -74.183458 39.731919 -74.195193 39.696716 -74.206927 39.680288 -74.260904 39.628658 -74.326615 39.612230 -74.338350 39.518357 -74.371205 39.492542 -74.394674 39.450299 -74.460385 39.389281 -74.558952 39.337650 -74.603542 39.262552 -74.690375 39.166331 -74.758433 39.065418 -74.857000 38.987972 -74.878122 39.013787 -74.878122 39.149904 -74.868734 39.236737 -74.910977 39.243777 -75.000157 39.243777 -75.065868 39.253164 -75.143314 39.321223 -75.298205 39.356425 -75.363916 39.408055 -75.417894 39.457339 -75.462484 39.518357 -75.485952 39.544172 -75.495339 39.569987 -75.507073 39.619271 -75.518808 39.602843 -75.518808 39.466726 -75.474218 39.337650 -75.396772 39.192147 -75.363916 39.098273 -75.307592 38.969197 -75.197291 38.875324 -75.122192 38.788491 -75.077603 38.652375 -75.021279 38.565542 -75.054134 38.495137 -75.089337 38.391876 -75.098724 38.375448 -75.110458 38.356673 -75.197291 38.288615 -75.253615 38.208823 -75.286471 38.166580 -75.298205 38.157192 -75.298205 38.070359 -75.352182 38.028116 -75.417894 37.896694 -75.462484 37.816901 -75.518808 37.755884 -75.572785 37.659663 -75.596253 37.582218 -75.638496 37.502425 -75.661965 37.415592 -75.683086 37.352228 -75.739410 37.239580 -75.826243 37.178562 -75.882567 37.178562 -75.927157 37.204377 -75.960013 37.274782 -75.981134 37.352228 -75.992868 37.415592 -75.992868 37.493038 -75.960013 37.556403 -75.891954 37.659663 -75.837977 37.748843 -75.793387 37.852104 -75.760532 37.877919 -75.739410 37.877919 -75.694820 37.887306 -75.683086 37.906081 -75.661965 37.983527 -75.739410 37.992914 -75.805121 38.035157 -75.793387 38.105562 -75.793387 38.147805 -75.837977 38.192395 -75.849711 38.269840 -75.915423 38.321471 -76.002256 38.305043 -76.103170 38.305043 -76.157147 38.375448 -76.213471 38.401263 -76.222858 38.427078 -76.246327 38.488096 -76.258061 38.520952 -76.234592 38.581970 -76.190002 38.642987 -76.112557 38.668802 -76.103170 38.720433 -76.136025 38.797878 -76.124291 38.875324 -76.124291 38.910526 -76.157147 38.917567 -76.201737 38.917567 -76.279182 38.910526 -76.290916 38.969197 -76.213471 39.013787 -76.157147 39.065418 -76.124291 39.133476 -76.136025 39.140516 -76.157147 39.185106 -76.157147 39.227349 -76.168881 39.262552 -76.124291 39.356425 -76.070314 39.389281 -75.981134 39.415096 -75.936544 39.492542 -75.915423 39.525397 -75.992868 39.586415 -76.013990 39.586415 -76.046846 39.544172 -76.112557 39.440911 -76.190002 39.415096 -76.234592 39.408055 -76.300304 39.356425 -76.356628 39.304795 -76.401218 39.269592 -76.443461 39.262552 -76.532640 39.243777 -76.520906 39.210921 -76.455195 39.149904 -76.455195 39.117048 -76.455195 39.013787 -76.499785 38.943382 -76.511519 38.797878 -76.511519 38.685230 -76.511519 38.626559 -76.499785 38.530339 -76.455195 38.452894 -76.443461 38.443506 -76.488051 38.462281 -76.565496 38.469321 -76.499785 38.417691 -76.434073 38.375448 -76.401218 38.269840 -76.368362 38.166580 -76.356628 38.147805 -76.344894 38.114949 -76.389483 38.166580 -76.443461 38.175967 -76.499785 38.227597 -76.544375 38.279228 -76.621820 38.279228 -76.642942 38.279228 -76.696919 38.288615 -76.753243 38.349633 -76.797833 38.366061 -76.818954 38.349633 -76.896400 38.366061 -76.950377 38.279228 -76.863544 38.201782 -76.732121 38.157192 -76.631207 38.147805 -76.553762 38.114949 -76.443461 38.079747 -76.410605 38.053932 -76.368362 37.992914 -76.300304 37.948324 -76.290916 37.852104 -76.312038 37.748843 -76.344894 37.669051 -76.422339 37.669051 -76.410605 37.624461 -76.389483 37.582218 -76.401218 37.528241 -76.312038 37.502425 -76.258061 37.406205 -76.246327 37.352228 -76.290916 37.371003 -76.389483 37.345187 -76.389483 37.319372 -76.377749 37.274782 -76.344894 37.185603 -76.267448 37.178562 -76.234592 37.124585 -76.234592 37.098770 -76.290916 37.079995 -76.389483 37.063567 -76.488051 37.070608 -76.511519 37.009590 -76.466929 36.965000 -76.401218 36.948572 -76.333159 36.920410 -76.300304 36.920410 -76.267448 36.920410 -76.258061 36.974387 -76.180615 36.957960 -76.124291 36.929798 -76.037458 36.929798 -75.992868 36.885208 -75.969400 36.798375 -75.960013 36.664605 -75.915423 36.620015 -75.936544 36.549610 -75.936544 36.540223 -75.936544 36.486246 -75.936544 36.479205 -75.936544 36.451043 -75.927157 36.441656 -75.915423 36.441656 -75.915423 36.406453 -75.915423 36.352476 -75.882567 36.256256 -75.826243 36.202279 -75.793387 36.129527 -75.793387 36.084937 -75.805121 36.129527 -75.849711 36.202279 -75.960013 36.183504 -76.070314 36.237481 -76.070314 36.167076 -76.147759 36.174117 -76.180615 36.148301 -76.290916 36.113099 -76.377749 36.059122 -76.466929 36.049734 -76.553762 36.068509 -76.610086 36.174117 -76.621820 36.300846 -76.654676 36.272684 -76.675797 36.068509 -76.654676 35.934739 -76.499785 35.915965 -76.377749 35.934739 -76.157147 35.969942 -76.070314 35.969942 -76.058580 35.798623 -76.013990 35.709443 -75.903689 35.880762 -75.816856 35.960555 -75.748797 35.890150 -75.715942 35.718831 -75.727676 35.620264 -75.805121 35.592102 -75.936544 35.474760 -76.079701 35.359765 -76.201737 35.359765 -76.290916 35.350378 -76.333159 35.430170 -76.410605 35.413742 -76.422339 35.493534 -76.434073 35.538124 -76.520906 35.448945 -76.577230 35.439557 -76.797833 35.430170 -76.664063 35.376193 -76.520906 35.350378 -76.455195 35.277626 -76.532640 35.223648 -76.532640 35.186099 -76.621820 35.096919 -76.631207 35.087532 -76.642942 35.078145 -76.654676 35.078145 -76.664063 34.960803 -76.642942 34.998352 -76.532640 35.052329 -76.377749 35.005393 -76.401218 34.815299 -76.532640 34.751935 -76.687532 34.669795 -76.840076 34.669795 -77.051291 34.660408 -77.325871 34.533679 -77.424438 34.505517 -77.546473 34.423378 -77.558207 34.423378 -77.602797 34.350626 -77.713098 34.277874 -77.811666 34.151145 -77.832787 34.085433 -78.011147 34.003294 -78.163691 33.939930 -78.306848 33.930542 -78.506329 33.892993 -78.637751 33.810854 -78.804377 33.747489 -78.858354 33.728714 -79.024979 33.562089 -79.057835 33.508112 -79.111812 33.414239 -79.144668 33.395464 -79.222113 33.350874 -79.177524 33.266388 -79.245582 33.174861 -79.332415 33.099763 -79.433329 33.071601 -79.520162 33.036398 -79.543630 32.951912 -79.630463 32.895588 -79.642197 32.886201 -79.675053 32.895588 -79.761886 32.813449 -79.928511 32.682026 # -b -79.928511 32.682026 -80.050546 32.625702 -80.125645 32.571725 -80.235946 32.559991 -80.313392 32.571725 -80.435427 32.578765 -80.533994 32.597540 -80.599706 32.597540 -80.634908 32.597540 -80.710007 32.597540 -80.745209 32.559991 -80.721741 32.477851 -80.667764 32.412140 -80.623174 32.299492 -80.677151 32.233780 -80.733475 32.252555 -80.810921 32.215006 -80.942344 32.158682 -80.930609 32.102358 -80.897754 32.046034 -80.897754 32.036646 -81.008055 32.050727 -81.019789 32.022565 -81.085501 31.956854 -81.141825 31.834819 -81.186414 31.778494 -81.273247 31.607176 -81.371814 31.410041 -81.395283 31.344330 -81.428138 31.248110 -81.460994 31.154236 -81.460994 31.126074 -81.526706 31.060363 -81.592417 30.917206 -81.604151 30.764662 -81.615885 30.661401 -81.571295 30.583955 -81.550174 30.403249 -81.505584 30.250705 -81.449260 30.107548 # -b -83.742118 29.964391 -83.897009 30.048877 -84.105877 30.126323 -84.251381 30.135710 -84.326480 30.126323 -84.415660 30.079386 # -b -85.495204 29.964391 -85.551528 30.030102 -85.650095 30.079386 -85.804986 30.163872 -85.948143 30.241317 -86.147624 30.297642 -86.356492 30.384474 -86.401082 30.431411 -86.333024 30.440798 -86.323637 30.518244 -86.499649 30.546406 -86.720252 30.518244 -86.961976 30.471307 -87.149723 30.440798 -87.095745 30.508857 -87.072277 30.593343 -87.137988 30.574568 -87.194312 30.537019 -87.281145 30.537019 -87.426649 30.403249 -87.656639 30.346925 -87.799796 30.297642 -87.999277 30.260092 -88.032133 30.318763 -87.966421 30.480695 -88.011011 30.661401 -88.020398 30.860882 -88.064988 30.945368 -88.130700 30.727112 -88.208145 30.537019 -88.219879 30.422024 -88.306712 30.393862 -88.482725 30.403249 -88.649350 30.403249 -88.848831 30.422024 -89.034231 30.440798 -89.266568 30.337538 -89.376869 30.375087 -89.520026 30.297642 -89.585737 30.278867 -89.653796 30.260092 -89.796953 30.288254 -89.862664 30.297642 # -b -90.137244 30.107548 -89.972965 30.194381 -89.874398 30.184993 -89.883785 30.088773 -89.862664 30.001940 # -b -89.752363 29.992553 -89.609206 30.098161 -89.433193 30.163872 -89.365135 30.116935 -89.388603 30.020715 # -b -89.862664 30.297642 -90.005821 30.318763 -90.181833 30.431411 -90.402436 30.375087 -90.479882 30.194381 -90.324990 30.079386 -90.137244 30.107548 # -b -117.057789 32.449689 -117.057789 32.524788 -117.114113 32.656211 -117.135235 32.700801 -117.135235 32.860385 -117.156356 32.970687 -117.224415 33.083335 -117.290126 33.174861 -117.376959 33.231185 -117.487260 33.341487 -117.599908 33.454135 -117.719597 33.536274 -117.862754 33.609026 -118.008258 33.702899 -118.106825 33.728714 -118.205392 33.728714 -118.315693 33.747489 -118.327427 33.839016 -118.360283 33.930542 -118.482318 34.031456 -118.569151 34.078393 -118.670065 34.059618 -118.681799 34.015028 -118.702921 33.968092 -118.780366 34.040844 -118.902402 34.097168 -118.989235 34.115942 -119.078414 34.141757 -119.176982 34.188694 -119.221571 34.270833 -119.277895 34.298995 -119.364728 34.324811 -119.442174 34.362360 -119.585331 34.416337 -119.695632 34.425725 -119.763690 34.371747 -119.895113 34.435112 # -b -114.861152 31.963894 -114.828296 31.870021 -114.739116 31.776148 -114.717995 31.663500 -114.727382 31.607176 -114.750850 31.557892 -114.750850 31.407695 -114.727382 31.285659 -114.706261 31.114340 -114.661671 30.992305 -114.563104 30.877310 -114.541982 30.734153 -114.530248 30.581609 -114.530248 30.429064 -114.485658 30.285907 -114.452802 30.105201 -114.441068 30.095814 -114.375357 30.027755 # -b -115.656729 29.971431 -115.677850 30.086426 -115.710706 30.238971 -115.755296 30.372740 -115.809273 30.391515 -115.877331 30.344578 -115.898453 30.382128 -115.898453 30.534672 -115.964164 30.687216 -116.020488 30.802211 -116.086200 30.849148 -116.119055 30.924246 -116.163645 30.943021 -116.163645 31.020467 -116.208235 31.133115 -116.262212 31.219948 -116.351392 31.323208 -116.428838 31.426469 -116.518017 31.529730 -116.527405 31.586054 -116.527405 31.691662 -116.539139 31.785535 -116.593116 31.860634 -116.661174 31.870021 -116.682296 31.935732 -116.738620 32.001444 -116.792597 32.038993 -116.816065 32.104705 -116.848921 32.179803 -116.926367 32.273677 -116.926367 32.320613 -116.935754 32.402753 -117.057789 32.449689 # -b -114.861152 31.963894 -114.882273 32.001444 -114.882273 31.992056 -114.872886 31.945120 -114.828296 31.879408 -114.739116 31.832472 -114.673405 31.794922 -114.595959 31.747986 -114.530248 31.729211 -114.462190 31.672887 -114.363623 31.607176 -114.342501 31.625950 -114.319033 31.625950 -114.297911 31.557892 -114.220466 31.520343 -114.121899 31.473406 -114.011597 31.445244 -113.901296 31.454631 -113.823851 31.473406 -113.734671 31.482793 -113.645491 31.435857 -113.591514 31.398307 -113.579780 31.304434 -113.502334 31.266884 -113.370911 31.248110 -113.260610 31.210560 -113.159696 31.189439 -113.072863 31.123727 -113.007152 31.039241 -113.007152 30.973530 -113.007152 30.849148 -112.995418 30.724766 -112.962562 30.630892 -112.896851 30.544059 -112.819405 30.410290 -112.795937 30.295295 -112.751347 30.257745 -112.685636 30.152138 # -b -120.071126 33.996254 -119.993680 34.024416 -119.960824 33.996254 -119.916235 33.958704 -119.895113 33.914114 -119.927969 33.895340 # -b -119.784812 34.069006 -119.817668 34.097168 -119.805933 34.087780 -119.740222 34.040844 -119.686245 34.005641 -119.629921 33.986866 -119.531354 34.005641 -119.453908 34.015028 -119.453908 33.977479 -119.519619 33.968092 -119.585331 33.939930 -119.653389 33.914114 -119.740222 33.958704 -119.773078 34.015028 -119.784812 34.069006 # -b -118.393139 33.425973 -118.437728 33.416585 -118.416607 33.416585 -118.393139 33.416585 -118.348549 33.369649 -118.306306 33.369649 -118.271103 33.360261 -118.249982 33.296897 -118.261716 33.278122 -118.306306 33.278122 -118.306306 33.306284 -118.327427 33.350874 -118.372017 33.379036 -118.393139 33.425973 # -b -118.503440 33.017623 -118.482318 33.036398 -118.482318 33.008236 -118.437728 32.951912 -118.383751 32.879160 -118.315693 32.860385 -118.271103 32.813449 -118.238247 32.785287 -118.294572 32.766512 -118.339161 32.766512 -118.383751 32.813449 -118.425994 32.888547 -118.482318 32.951912 -118.503440 32.989461 -118.503440 33.017623 # -b -119.895113 34.435112 -120.017148 34.479702 -120.115716 34.498476 -120.193161 34.507864 -120.291728 34.507864 -120.425498 34.536026 -120.491209 34.590003 -120.512331 34.662755 -120.535799 34.744894 -120.535799 34.817646 -120.547533 34.871623 -120.547533 34.916213 -120.547533 34.944375 -120.547533 34.979578 -120.512331 35.010086 -120.512331 35.000699 -120.512331 35.010086 -120.512331 35.000699 -120.524065 35.017127 -120.524065 35.035902 -120.512331 35.064064 -120.535799 35.118041 -120.556921 35.143856 -120.613245 35.207221 -120.690690 35.244770 -120.768136 35.270585 -120.777523 35.279972 -120.777523 35.289360 -120.777523 35.362112 -120.777523 35.434864 -120.866703 35.460679 -120.944148 35.514656 -121.033328 35.596795 -121.087305 35.631998 -121.197607 35.739952 -121.307908 35.854947 -121.418209 36.000451 -121.540244 36.089631 -121.683401 36.214013 -121.826558 36.392372 -121.850027 36.570732 -121.793703 36.605934 -121.727991 36.650524 -121.739725 36.826537 -121.838293 36.976734 -121.993184 36.995509 -122.080017 36.995509 -122.180930 37.084689 -122.279498 37.232539 -122.302966 37.347534 -122.345209 37.478957 -122.422654 37.603339 -122.446123 37.734762 -122.401533 37.812208 -122.312353 37.777005 -122.279498 37.699560 -122.157462 37.584565 -122.014305 37.504772 -122.070629 37.636195 -122.225520 37.838023 -122.267763 37.943630 -122.190318 38.021076 -122.026039 38.046891 -121.904004 38.091481 -122.115219 38.161886 -122.225520 38.178314 -122.345209 38.178314 -122.434389 38.187701 -122.434389 38.075053 -122.434389 37.934243 -122.500100 37.892000 -122.565811 37.908428 -122.610401 37.953018 -122.666725 37.953018 -122.744171 37.985873 -122.798148 38.011689 -122.875594 38.091481 -122.887328 38.107909 -122.887328 38.152499 -122.887328 38.220557 -122.887328 38.239332 -122.941305 38.335552 -123.030485 38.403610 -123.129052 38.490443 -123.251087 38.593704 -123.340267 38.680537 -123.405978 38.757982 -123.537401 38.861243 -123.581991 39.006747 -123.593725 39.102967 -123.647702 39.239083 -123.692292 39.368159 -123.692292 39.487848 -123.682905 39.513663 -123.647702 39.614577 -123.692292 39.708450 -123.758004 39.792936 -123.847183 39.896197 -123.912895 39.980683 # -b -120.115716 33.968092 -120.160305 33.986866 -120.139184 33.986866 -120.071126 33.996254 # -b -119.927969 33.895340 -120.005414 33.895340 -120.061738 33.914114 -120.115716 33.968092 -120.005414 33.895340 -120.061738 33.914114 -120.115716 33.968092 # -b 141.960057 40.022926 142.058624 39.818752 142.103214 39.640392 142.157191 39.469073 142.136070 39.332957 142.070358 39.229696 142.046890 39.074805 141.927201 38.955116 141.805166 38.948076 141.727720 38.765023 141.638541 38.542073 141.638541 38.368408 141.629153 38.316777 141.396817 38.333205 141.143358 38.194742 141.054179 37.934243 141.087034 37.671397 141.143358 37.453142 141.143358 37.143360 141.164480 36.957960 140.976733 36.826537 140.854698 36.603588 140.812455 36.533182 140.756131 36.258603 140.744396 35.944127 140.887553 35.791583 140.922756 35.683628 140.767865 35.603836 140.589505 35.359765 140.479204 35.162631 140.237480 35.007740 # -b 139.984022 35.233036 140.016877 35.369152 140.148300 35.495881 140.192890 35.622610 # -b 139.972288 39.161638 140.070855 39.323569 140.138913 39.530091 140.148300 39.750693 140.016877 39.844567 # -b 140.237480 35.007740 139.993409 34.862236 139.951166 35.007740 139.984022 35.233036 # -b 140.192890 35.622610 139.951166 35.622610 139.894842 35.451291 139.805662 35.305788 139.784541 35.153243 139.653118 35.233036 139.409047 35.261198 139.298746 35.115694 139.254156 34.918560 139.209566 34.726119 139.089878 34.618165 138.956108 34.636940 138.911518 34.871623 138.946721 35.035902 138.791830 35.052329 138.625204 34.925600 138.460926 34.763669 138.348278 34.580616 138.315422 34.554800 138.195733 34.571228 137.996252 34.608778 137.731060 34.618165 137.477602 34.618165 137.256999 34.554800 137.212409 34.554800 137.278121 34.636940 137.388422 34.709692 137.266387 34.726119 137.167820 34.744894 137.113842 34.798871 137.057518 34.709692 136.935483 34.817646 136.926096 35.017127 136.836916 34.981924 136.714880 34.754281 136.628048 34.618165 136.771204 34.536026 136.968339 34.416337 136.968339 34.179307 136.836916 34.270833 136.714880 34.216856 136.583458 34.198081 136.449688 34.134717 136.372243 34.040844 136.351121 33.977479 136.229086 33.813201 136.064807 33.555049 135.853592 33.454135 135.701048 33.498725 135.579012 33.555049 135.478098 33.702899 135.290352 33.803813 135.236374 33.977479 135.248108 34.134717 135.248108 34.261446 135.334941 34.334198 135.501567 34.564188 135.522688 34.636940 135.478098 34.662755 135.325554 34.643980 135.147195 34.608778 134.926592 34.681530 134.684868 34.726119 134.464266 34.716732 134.264785 34.580616 134.142749 34.526638 133.978471 34.435112 133.955002 34.425725 133.901025 34.463274 133.835314 34.489089 133.680423 34.444499 133.579509 34.435112 133.403496 34.371747 133.281461 34.362360 133.161772 34.308383 133.016268 34.280221 132.851990 34.233284 132.664243 34.198081 132.530473 34.298995 132.420172 34.270833 132.300484 34.015028 132.244160 33.885952 132.154980 33.867178 131.924990 33.932889 131.758365 34.005641 131.570618 33.949317 131.427461 33.949317 131.338281 33.914114 131.162269 33.968092 130.986256 33.996254 130.974522 34.207469 130.997990 34.317770 131.195124 34.362360 131.460317 34.416337 131.636329 34.571228 131.814689 34.681530 132.122124 34.827033 132.321605 35.045289 132.563329 35.179059 132.718220 35.387927 132.917701 35.486494 133.138304 35.549859 133.304929 35.521697 133.459820 35.477107 133.800111 35.505269 134.077038 35.495881 134.309374 35.540471 134.583954 35.594448 134.795169 35.631998 134.959448 35.639038 135.137807 35.693015 135.325554 35.702403 135.313820 35.559246 135.412387 35.531084 135.733903 35.477107 135.820736 35.495881 135.909916 35.568633 136.031951 35.631998 136.142253 35.693015 136.142253 35.944127 136.151640 36.176464 136.440301 36.382985 136.682025 36.631750 136.836916 36.932144 136.848650 37.143360 136.893240 37.312332 137.233531 37.469570 137.388422 37.453142 137.355566 37.312332 137.212409 37.248967 137.057518 37.126932 137.036397 37.082342 137.113842 36.915717 137.113842 36.737357 137.224144 36.727970 137.433012 36.756132 137.609025 36.906329 137.853095 37.011937 138.151144 37.091729 138.470313 37.284170 138.681528 37.453142 138.836419 37.654970 139.012432 37.847410 139.233035 37.960058 139.244769 37.969446 139.254156 37.976486 139.355070 37.976486 139.507614 38.152499 139.531083 38.307390 139.575672 38.438813 139.695361 38.628906 139.850252 38.835428 139.927698 38.997359 139.972288 39.161638 # -b 140.016877 39.844567 139.805662 39.912625 139.906576 39.980683 # -b 138.604083 38.272187 138.580614 38.098521 138.625204 38.056278 138.514903 37.812208 138.360012 37.802820 138.327156 37.950671 138.449192 38.204129 138.604083 38.272187 # -b 134.276519 33.268735 134.065304 33.379036 133.800111 33.454135 133.570121 33.397811 133.391762 33.296897 133.293195 33.111497 133.105448 32.879160 133.084326 32.712535 132.905967 32.693760 132.751076 32.804061 132.685365 32.879160 132.553942 33.083335 132.575063 33.167821 132.509352 33.278122 132.387316 33.360261 132.223038 33.360261 132.488230 33.536274 132.697099 33.756876 132.896580 33.977479 133.105448 33.949317 133.239218 33.895340 133.436352 33.932889 133.624099 34.005641 133.689810 34.134717 133.823580 34.226244 133.933881 34.317770 134.065304 34.334198 134.264785 34.289608 134.452531 34.198081 134.619157 34.188694 134.661400 33.996254 134.717724 33.822588 134.762314 33.803813 134.771701 33.794426 134.762314 33.766264 134.652012 33.665350 134.551098 33.618413 134.452531 33.517499 134.363352 33.369649 134.276519 33.268735 # -b 135.060362 34.571228 135.027506 34.526638 134.872615 34.371747 134.762314 34.207469 134.872615 34.179307 134.982916 34.226244 135.004038 34.390522 135.060362 34.571228 # -b 130.864220 33.876565 130.920544 33.885952 130.831365 33.895340 130.676474 33.848403 130.521583 33.721674 130.423015 33.564436 130.279859 33.564436 130.178945 33.470563 130.035788 33.416585 # -b 129.916099 32.656211 130.146089 32.712535 130.324448 32.628049 130.411281 32.759472 130.289246 32.813449 130.235269 32.897935 130.235269 33.083335 130.333836 33.149046 130.444137 32.944872 130.577907 32.766512 130.577907 32.599887 130.622496 32.581112 130.631884 32.581112 130.622496 32.386325 130.521583 32.179803 130.401894 32.095317 130.300980 31.935732 130.289246 31.710436 130.345570 31.464019 130.289246 31.323208 130.401894 31.229335 130.655352 31.123727 130.709329 31.341983 130.631884 31.520343 130.688208 31.663500 130.852486 31.625950 130.775041 31.569626 130.753919 31.445244 130.810243 31.248110 130.810243 31.011079 130.941666 31.048629 131.096557 31.161277 131.108291 31.304434 131.251448 31.435857 131.361750 31.388920 131.483785 31.625950 131.549496 31.879408 131.615208 32.114092 131.725509 32.386325 131.835810 32.552950 131.967233 32.712535 132.023557 32.794674 132.035291 32.841611 132.023557 32.998849 131.978967 33.073947 131.924990 33.174861 131.680919 33.221798 131.648063 33.306284 131.746630 33.517499 131.692653 33.627801 131.537762 33.583211 131.239714 33.573823 131.051967 33.766264 131.040233 33.857790 130.962788 33.857790 130.864220 33.876565 # -b 130.146089 32.477851 130.092112 32.358163 130.080378 32.217353 130.113233 32.142254 130.247003 32.421527 130.146089 32.477851 # -b 131.117679 30.630892 131.084823 30.764662 131.030846 30.630892 130.962788 30.410290 131.030846 30.344578 131.117679 30.630892 # -b 130.545051 30.353966 130.512195 30.410290 130.455871 30.325804 130.512195 30.210809 130.676474 30.192034 130.676474 30.325804 130.545051 30.353966 # -b 130.897076 37.539975 130.843099 37.495385 130.843099 37.478957 130.885342 37.453142 130.974522 37.504772 130.897076 37.539975 # -b 130.035788 33.416585 129.970076 33.470563 129.859775 33.397811 129.770595 33.306284 129.660294 33.174861 129.770595 33.092722 129.838654 33.055173 129.880897 33.008236 129.948955 32.935484 129.958342 32.813449 129.871509 32.963646 129.749474 32.973034 129.782329 32.766512 129.815185 32.562337 129.916099 32.656211 # -b 128.855330 32.721922 128.712173 32.665598 128.712173 32.534175 128.867064 32.581112 128.855330 32.721922 # -b 129.219089 32.954259 129.197968 33.027011 129.132256 33.027011 129.054811 32.888547 129.097054 32.794674 129.219089 32.888547 129.219089 32.954259 # -b 129.749474 33.839016 129.728352 33.766264 129.749474 33.702899 129.815185 33.756876 129.749474 33.839016 # -b 129.284800 34.289608 129.197968 34.151145 129.230823 34.069006 129.320003 34.134717 129.284800 34.289608 # -b 129.406836 34.636940 129.484281 34.571228 129.484281 34.498476 129.484281 34.425725 129.463160 34.334198 129.439692 34.298995 129.385714 34.390522 129.373980 34.545413 129.406836 34.636940 # -b 128.435246 38.506871 128.512692 38.438813 128.655849 38.220557 128.810740 37.995261 128.986752 37.863838 129.165112 37.671397 129.308269 37.460182 129.430304 37.187949 129.496016 36.871127 129.484281 36.612975 129.472547 36.338395 129.505403 36.033307 129.618051 36.026266 129.549993 35.854947 129.463160 35.578021 129.329390 35.352724 129.132256 35.188446 128.942162 35.080492 128.756763 35.108654 128.601871 35.153243 128.557282 35.089879 128.536160 35.071104 128.491570 34.988965 128.491570 34.981924 128.479836 34.953762 128.425859 34.890398 128.346066 34.808259 128.280355 34.918560 128.181788 34.918560 128.071487 34.953762 127.994041 34.998352 127.895474 34.981924 127.773439 34.934988 127.674872 34.899785 127.749970 34.808259 127.707727 34.709692 127.606813 34.653368 127.541102 34.763669 127.463656 34.817646 127.451922 34.726119 127.451922 34.571228 127.341621 34.507864 127.254788 34.498476 127.198464 34.564188 127.332234 34.653368 127.341621 34.735507 127.231320 34.709692 127.078775 34.627552 126.989596 34.526638 126.945006 34.489089 126.933272 34.489089 126.900416 34.453887 126.834705 34.453887 126.790115 34.554800 126.724403 34.479702 126.548391 34.343585 126.524922 34.472661 126.360644 34.435112 126.294932 34.308383 126.238608 34.371747 126.316054 34.489089 126.348910 34.643980 126.447477 34.627552 126.536656 34.590003 126.524922 34.690917 126.581246 34.798871 126.492067 34.852848 126.393500 34.754281 126.337175 34.881011 126.393500 35.007740 126.438089 35.080492 126.438089 35.225995 126.524922 35.413742 126.625836 35.540471 126.569512 35.594448 126.736137 35.702403 126.780727 35.810357 126.712669 35.899537 126.712669 35.988717 126.592981 36.080243 126.569512 36.265643 126.515535 36.436962 126.492067 36.631750 126.381765 36.676339 126.426355 36.497980 126.337175 36.453390 126.238608 36.596547 126.140041 36.596547 126.161163 36.737357 126.294932 36.852352 126.447477 36.861739 126.569512 36.906329 126.691548 36.932144 126.855826 36.826537 126.923884 36.807762 126.834705 36.950919 126.834705 37.072955 126.768993 37.143360 126.790115 37.232539 126.834705 37.267742 126.736137 37.338147 126.679813 37.328760 126.602368 37.417939 126.592981 37.478957 126.646958 37.488344 126.614102 37.530587 126.536656 37.584565 126.503801 37.671397 126.503801 37.751190 126.503801 37.767618 # -b 126.327788 33.360261 126.226874 33.259347 126.238608 33.167821 126.426355 33.149046 126.691548 33.174861 126.933272 33.350874 126.900416 33.463522 126.614102 33.463522 126.327788 33.360261 # -b 128.005775 40.022926 127.928330 39.903238 127.749970 39.825792 127.552836 39.776509 127.541102 39.682635 127.552836 39.598149 127.564570 39.417443 127.541102 39.316529 127.529368 39.436218 127.451922 39.264899 127.496512 39.171025 127.728849 39.100620 127.928330 38.922261 128.181788 38.774410 128.381269 38.635947 128.435246 38.506871 # -b 126.569512 37.723028 126.426355 37.838023 126.238608 37.784046 126.161163 37.723028 126.039127 37.802820 125.907705 37.838023 125.785669 37.960058 125.663634 37.976486 125.719958 37.915468 125.654246 37.777005 125.543945 37.741803 125.466500 37.662010 125.332730 37.662010 125.288140 37.671397 125.234163 37.828635 125.112128 37.812208 125.091006 37.899040 125.189573 37.899040 125.255284 37.985873 125.267019 38.056278 125.091006 38.021076 124.870404 38.021076 124.804692 38.030463 124.947849 38.211170 125.034682 38.445853 125.156717 38.497483 125.177839 38.558501 125.344464 38.610132 125.454765 38.661762 125.311609 38.661762 125.267019 38.765023 125.377320 39.093580 125.443031 39.365812 125.511090 39.504276 125.410176 39.553559 125.245897 39.562947 125.135596 39.579374 124.903259 39.647433 124.727247 39.572334 124.670923 39.546519 124.593477 39.689676 124.462054 39.776509 124.361140 39.835179 124.393996 39.903238 # -b 121.568407 29.980819 121.514429 30.077039 121.514429 30.077039 121.347804 30.201421 121.192913 30.238971 121.016900 30.173259 120.817419 30.095814 120.608551 30.182647 120.387948 30.238971 120.211936 30.123976 120.364480 30.307029 120.563961 30.335191 120.850275 30.335191 121.061490 30.450186 121.127202 30.534672 121.148323 30.544059 121.270358 30.612117 121.469839 30.668441 121.657586 30.830373 121.922779 30.839760 121.932166 30.914859 121.800743 31.123727 121.645852 31.285659 121.392394 31.407695 121.204647 31.597788 120.972310 31.729211 120.772829 31.747986 120.718852 31.870021 120.629672 31.926345 120.409070 31.879408 120.155612 31.841859 120.155612 31.935732 120.409070 31.982669 120.641407 32.020218 120.873743 31.954507 121.106080 31.823084 121.314948 31.813697 121.568407 31.747986 121.767887 31.672887 121.911044 31.616563 121.922779 31.663500 121.833599 31.785535 121.711563 31.945120 121.634118 31.992056 121.514429 32.095317 121.392394 32.198578 121.368926 32.358163 121.127202 32.449689 120.960576 32.656211 120.883131 32.916710 120.763442 33.139659 120.707118 33.325059 120.653141 33.526887 120.596817 33.738102 120.465394 33.885952 120.376214 34.134717 120.254179 34.280221 120.078166 34.362360 # -b 119.845830 35.578021 120.045311 35.667200 120.176733 35.800970 120.254179 35.927699 120.111022 36.052081 120.244791 36.185851 120.420804 36.185851 120.474781 36.026266 120.662528 36.042694 120.796298 36.293805 120.883131 36.373598 120.939455 36.373598 120.906599 36.516755 120.894865 36.561344 121.106080 36.561344 121.326682 36.657565 121.601262 36.683380 121.723298 36.702155 121.845333 36.835924 121.976756 36.922757 122.087057 36.887555 122.197358 36.950919 122.241948 36.871127 122.263070 36.800722 122.340515 36.756132 122.518875 36.932144 122.507141 36.995509 122.605708 37.126932 122.638563 37.232539 122.650298 37.321719 122.584586 37.347534 122.352249 37.373349 122.176237 37.434367 122.119913 37.460182 121.965022 37.389777 121.744419 37.363962 121.591875 37.373349 121.458105 37.495385 121.270358 37.514160 121.106080 37.591605 120.995779 37.680785 120.906599 37.758230 120.772829 37.741803 120.542840 37.654970 120.364480 37.584565 120.233057 37.434367 120.024189 37.312332 # -b 119.803586 39.870382 120.012455 39.980683 # -b 121.955634 40.046395 121.756153 39.825792 121.556672 39.724878 121.523817 39.553559 121.347804 39.478461 121.469839 39.452645 121.624731 39.358772 121.756153 39.316529 121.702176 39.152250 121.624731 38.997359 121.359538 38.938688 121.192913 38.765023 121.303214 38.696964 121.645852 38.835428 121.756153 38.922261 121.922779 38.922261 121.976756 38.955116 122.119913 39.041949 122.241948 39.213268 122.408573 39.342344 122.739477 39.443258 123.046913 39.546519 123.323839 39.689676 123.401285 39.757734 123.511586 39.666207 123.654743 39.708450 123.908201 39.757734 124.107682 39.767121 124.250839 39.802324 124.372874 39.860995 124.393996 39.903238 # -b 120.078166 34.362360 119.890419 34.435112 119.648695 34.526638 119.482070 34.643980 119.282589 34.690917 119.249733 34.817646 119.392890 35.052329 119.547781 35.233036 119.615840 35.315175 119.726141 35.514656 119.845830 35.578021 # -b 120.024189 37.312332 119.935009 37.206724 119.812974 37.072955 119.559516 37.047139 119.327179 37.117544 119.061987 37.197337 118.918830 37.363962 118.907095 37.504772 118.874240 37.619767 118.796794 37.767618 118.599660 37.899040 118.444769 37.899040 118.355589 38.002301 118.224166 38.002301 118.069275 38.063319 117.991830 38.185354 117.825204 38.316777 117.672660 38.464628 117.726637 38.706352 117.836939 38.990319 118.012951 39.126435 118.233554 39.110007 118.355589 39.048990 118.555070 39.058377 118.763939 39.110007 119.019744 39.135823 119.195756 39.229696 119.350647 39.358772 119.404625 39.553559 119.526660 39.741306 119.681551 39.792936 119.803586 39.870382 # -b 49.973507 37.464876 50.170641 37.455489 50.304411 37.375696 50.435834 37.148053 50.689292 36.988468 51.041317 36.819496 51.372221 36.723276 51.682003 36.652871 51.902606 36.634096 52.045763 36.678686 52.210041 36.704501 52.430644 36.758479 52.674714 36.819496 52.916438 36.892248 53.235608 36.927451 53.489066 36.979081 53.655692 37.007243 53.578246 36.943879 53.334175 36.899289 53.479679 36.882861 53.655692 36.873474 53.885681 36.908676 54.073428 36.934491 54.061694 37.209071 53.951393 37.436714 53.918537 37.516506 # -b 53.918537 37.516506 53.930271 37.577524 53.885681 37.823942 53.819970 38.161886 53.798848 38.535033 53.876294 38.854202 54.040573 39.060724 53.841092 39.112354 53.655692 39.241430 53.521922 39.386934 53.378765 39.412749 53.378765 39.454992 53.554778 39.523050 53.754259 39.581721 53.876294 39.649780 53.676813 39.701410 53.533656 39.762428 53.390499 39.853954 53.587633 39.999458 53.709669 39.922012 53.885681 39.863341 # -b 53.092451 40.083944 52.961028 39.957215 52.850727 39.957215 # -b 48.879882 38.570235 48.891616 38.380142 48.924472 38.145458 49.001917 37.866185 49.100485 37.673744 49.321087 37.535281 49.520568 37.507119 49.708315 37.446101 49.973507 37.464876 # -b 49.508834 40.067516 49.475978 39.947828 49.443122 39.694369 49.332821 39.471420 49.278844 39.215615 49.255376 39.112354 49.112219 39.215615 49.023039 39.300101 48.980796 39.274286 48.891616 39.225002 48.847026 39.102967 48.837639 38.802572 48.858761 38.673496 48.879882 38.570235 # -b 48.372966 29.924495 48.253277 30.001940 48.065530 30.079386 # -b 48.560712 30.116935 48.551325 30.098161 # -b 50.048606 29.983166 49.982895 30.088773 49.884327 30.145097 49.663725 30.069999 # -b 49.487712 29.992553 49.389145 30.020715 49.332821 30.098161 49.201398 30.175606 49.112219 30.307029 49.091097 30.461920 49.001917 30.537019 48.847026 30.565181 48.760193 30.518244 48.804783 30.412636 48.760193 30.328150 48.769581 30.213155 48.626424 30.213155 48.593568 30.079386 # -b 29.861130 31.257497 30.093467 31.353717 30.236624 31.456978 30.457226 31.466365 30.677829 31.522689 30.710684 31.494527 30.468960 31.410041 30.412636 31.334943 30.468960 31.325555 30.612117 31.353717 30.809252 31.381879 30.931287 31.466365 30.987611 31.503915 30.975877 31.541464 31.208214 31.494527 31.548505 31.485140 31.813697 31.466365 31.935732 31.344330 32.100011 31.288006 32.111745 31.288006 # -b 31.724517 31.541464 31.724517 31.494527 31.747986 31.428816 31.715130 31.372492 31.682274 31.266884 31.614216 31.182398 31.682274 31.182398 31.759720 31.182398 31.780841 31.126074 31.780841 31.032201 31.935732 30.994652 32.022565 30.926593 32.088277 30.860882 32.144601 30.642626 32.177456 30.499469 32.198578 30.452533 32.198578 30.440798 32.189191 30.403249 32.198578 30.328150 32.287758 30.260092 32.365203 30.163872 # -b 35.937086 35.815051 35.948821 35.958208 35.991064 36.101365 35.915965 36.296152 35.991064 36.537876 36.169423 36.624709 36.246869 36.758479 36.080243 36.882861 35.981676 36.838271 35.761074 36.777253 35.728218 36.624709 35.585061 36.580119 35.340990 36.608281 35.155590 36.732663 34.934988 36.793681 34.801218 36.819496 34.690917 36.838271 34.944375 36.803068 34.756628 36.828884 34.547760 36.758479 34.404603 36.634096 34.216856 36.500327 34.139411 36.368904 33.951664 36.340742 33.808507 36.242175 33.721674 36.216360 33.623107 36.181157 33.423626 36.197585 33.235879 36.152995 33.071601 36.127180 32.904975 36.063815 32.740697 36.101365 32.562337 36.152995 32.386325 36.305539 32.308879 36.420534 32.198578 36.500327 32.022565 36.589506 31.870021 36.652871 31.682274 36.723276 31.560239 36.767866 31.494527 36.812456 31.339636 36.882861 31.173011 36.899289 31.029854 36.918063 30.853841 36.892248 30.698950 36.892248 30.644973 36.767866 30.644973 36.580119 30.579262 36.519101 30.555793 36.350129 30.403249 36.324314 30.192034 36.279724 # -b 34.040844 35.472413 34.094821 35.481800 34.282568 35.552205 34.404603 35.634345 34.580616 35.707096 34.658061 35.714137 34.604084 35.589755 34.449193 35.453638 34.315423 35.409048 34.216856 35.282319 34.118289 35.155590 34.151145 35.066410 34.040844 34.949069 33.820241 34.911519 33.611373 34.749588 33.325059 34.702651 33.137312 34.594697 33.027011 34.594697 32.815796 34.620512 32.585806 34.712038 32.442649 34.866930 32.353469 35.028861 32.430915 35.047636 32.585806 35.092226 32.750084 35.164978 32.926097 35.183752 33.048132 35.218955 33.059866 35.336297 33.071601 35.355071 33.137312 35.326909 33.235879 35.326909 33.357915 35.336297 33.501071 35.345684 33.688818 35.390274 33.853097 35.437210 34.040844 35.472413 # -b 35.991064 34.740200 35.948821 34.902132 36.002798 35.092226 35.991064 35.364459 35.904231 35.561593 35.847907 35.615570 35.883109 35.669547 35.937086 35.815051 # -b 35.474760 33.970438 35.474760 33.961051 35.474760 33.951664 35.474760 33.923502 35.463026 33.923502 35.441904 33.914114 35.385580 33.850750 35.340990 33.777998 35.298747 33.693512 35.287013 33.639535 35.254157 33.592598 35.188446 33.510459 35.164978 33.454135 35.132122 33.407198 35.111000 33.353221 35.087532 33.306284 35.066410 33.268735 35.045289 33.233532 35.000699 33.186596 34.988965 33.139659 34.977231 33.120884 35.474760 33.970438 35.578021 34.000947 35.660160 34.237978 35.721177 34.374094 35.843213 34.484395 36.026266 34.585309 35.991064 34.740200 # -b 32.144601 31.278619 32.177456 31.248110 32.231434 31.248110 32.332348 31.201173 32.376937 31.144849 32.419180 31.088525 32.496626 31.022814 32.728963 31.013426 32.872120 31.032201 32.937831 31.088525 33.015277 31.107300 33.080988 31.032201 33.104456 31.013426 33.214758 31.022814 33.357915 31.041588 33.522193 31.060363 33.688818 31.116687 33.853097 31.182398 34.029109 31.297393 34.130023 31.372492 34.130023 31.381879 34.162879 31.391267 34.261446 31.456978 34.360013 31.541464 34.437459 31.625950 34.493783 31.691662 34.514904 31.738598 34.514904 31.750332 # -b 34.514904 31.750332 34.559494 31.872368 34.580616 31.947467 34.604084 32.003791 34.636940 32.078889 34.646327 32.144601 34.679183 32.245515 34.702651 32.311226 34.723773 32.395712 34.747241 32.470811 34.780097 32.545910 34.780097 32.602234 34.801218 32.665598 34.857542 32.759472 34.899785 32.825183 34.934988 32.890894 34.944375 32.982421 34.944375 33.048132 34.956109 33.066907 # -b 32.552950 29.992553 32.520094 30.020715 32.475505 30.060611 32.463770 30.060611 32.430915 30.079386 32.409793 30.154485 32.341735 30.260092 32.308879 30.297642 32.222046 30.440798 32.198578 30.633239 32.198578 30.736500 32.189191 30.851495 32.189191 31.004039 32.189191 31.116687 32.189191 31.173011 32.165722 31.229335 # -b 25.364594 39.922012 25.308270 39.795283 25.331738 39.922012 25.320004 39.983030 25.209703 39.990071 25.066546 39.964255 25.021956 39.830486 25.087668 39.795283 25.143992 39.846914 25.188581 39.837526 25.275414 39.804671 25.298883 39.830486 25.364594 39.922012 # -b 26.533318 39.079499 26.643619 39.060724 26.554439 39.225002 26.455872 39.361119 26.366693 39.454992 26.223536 39.393974 26.080379 39.351731 25.916100 39.293061 25.871510 39.163985 25.991199 39.147557 26.136703 39.206228 26.247004 39.215615 26.157824 39.070111 26.312715 39.009094 26.465260 39.079499 26.465260 39.128782 26.533318 39.079499 # -b 25.970078 38.241678 26.047523 38.267494 26.092113 38.302696 26.124969 38.448200 26.136703 38.560848 26.092113 38.621866 25.880898 38.638294 25.880898 38.527992 25.991199 38.415344 25.904366 38.319124 25.904366 38.248719 25.970078 38.241678 # -b 28.098657 36.073203 28.176103 36.101365 28.197224 36.181157 28.274670 36.286765 28.319259 36.458084 28.218346 36.429922 28.054067 36.368904 27.866320 36.235134 27.788875 36.181157 27.767753 36.101365 27.779487 35.930046 27.922644 35.984023 28.098657 36.073203 # -b 25.066546 35.373846 24.923389 35.418436 24.747376 35.399661 24.569017 35.373846 24.371883 35.345684 24.249847 35.427823 24.151280 35.437210 24.195870 35.526390 24.118425 35.599142 24.008123 35.517003 23.808642 35.606183 23.742931 35.615570 23.698341 35.500575 23.599774 35.526390 23.578653 35.383233 23.545797 35.193140 23.644364 35.211914 23.799255 35.202527 23.975268 35.218955 24.195870 35.211914 24.348414 35.183752 24.470450 35.155590 24.569017 35.092226 24.723908 35.047636 24.813088 34.892745 25.111136 34.911519 25.298883 34.965497 25.463161 34.956109 25.606318 34.984271 25.805799 34.993659 25.970078 35.028861 26.157824 34.956109 26.322103 35.183752 26.289247 35.256504 26.169559 35.202527 26.068645 35.193140 25.937222 35.148550 25.782331 35.193140 25.695498 35.310481 25.496017 35.291707 25.373981 35.301094 25.188581 35.301094 25.066546 35.326909 25.066546 35.373846 # -b 24.944511 37.657316 25.000835 37.708947 25.000835 37.814554 24.967979 37.875572 24.845944 37.945977 24.712174 37.971792 24.702787 37.901387 24.789619 37.823942 24.845944 37.734762 24.890533 37.666704 24.944511 37.657316 # -b 25.430305 36.918063 25.552341 36.927451 25.573462 37.068261 25.585197 37.155094 25.517138 37.155094 25.474895 37.138666 25.385716 37.058874 25.385716 36.934491 25.430305 36.918063 # -b 22.034435 38.309737 21.912400 38.302696 21.792711 38.283921 21.527519 38.145458 21.384362 38.190048 21.173147 37.917815 21.130904 37.788739 21.250592 37.596299 21.527519 37.490691 21.658941 37.305291 21.572109 37.068261 21.614352 36.873474 21.715265 36.784294 21.858422 36.739704 21.903012 36.899289 22.022701 37.023671 22.100146 36.918063 22.243303 36.819496 22.332483 36.580119 22.353605 36.420534 22.442784 36.411147 22.475640 36.500327 22.520230 36.704501 22.684508 36.767866 22.794810 36.617669 22.937967 36.509714 23.092858 36.439309 23.069389 36.669299 23.060002 36.767866 23.015412 36.918063 22.926232 37.199684 22.794810 37.359268 22.740832 37.535281 22.815931 37.507119 22.937967 37.446101 23.069389 37.368656 23.104592 37.279476 23.191425 37.295904 23.313460 37.385084 23.468351 37.401511 23.435496 37.507119 23.334582 37.551709 23.214893 37.622114 23.137448 37.760577 23.081123 37.840370 23.092858 37.953018 22.926232 38.023423 22.475640 38.145458 22.255038 38.197089 22.156470 38.197089 22.088412 38.267494 22.034435 38.309737 # -b 20.731942 38.068013 20.776531 38.190048 20.645109 38.267494 20.600519 38.405957 20.501952 38.361367 20.370529 38.267494 20.358795 38.248719 20.445628 38.190048 20.501952 38.129030 20.633374 38.110256 20.731942 38.068013 # -b 24.569017 38.075053 24.613607 38.032810 24.604219 38.154846 24.416473 38.190048 24.315559 38.222904 24.205258 38.431772 24.205258 38.553807 24.106690 38.638294 23.832111 38.682883 23.644364 38.750942 23.477739 38.863590 23.358050 38.966850 23.325194 39.025521 23.214893 39.025521 23.036534 38.915220 22.961435 38.837775 23.003678 38.828387 23.146835 38.837775 23.268870 38.750942 23.358050 38.682883 23.534063 38.579623 23.566918 38.466975 23.721809 38.396570 23.930678 38.380142 23.996389 38.335552 24.127812 38.258106 24.195870 38.171273 24.238113 38.039851 24.339027 37.971792 24.449328 37.953018 24.536161 37.945977 24.569017 37.945977 24.569017 37.978833 24.569017 38.075053 # -b 20.049013 39.393974 20.060747 39.454992 # -b 19.938711 39.386934 20.049013 39.393974 # -b 23.942412 40.142615 23.963534 39.964255 # -b 23.501207 40.100372 23.665485 39.999458 23.566918 39.940787 # -b 22.607063 40.152002 22.639918 39.973643 22.761954 39.872729 22.839399 39.659167 23.027146 39.532438 23.158569 39.419790 23.247749 39.274286 23.289992 39.163985 23.203159 39.121742 23.125713 39.138169 23.158569 39.232043 23.081123 39.318876 22.916845 39.335304 22.872255 39.215615 22.949701 39.070111 22.970822 39.018481 22.916845 38.976238 22.827665 38.957463 22.717364 38.966850 22.541351 38.941035 22.618797 38.847162 22.827665 38.769716 22.994291 38.734514 23.125713 38.673496 23.289992 38.664109 23.379172 38.499830 23.501207 38.499830 23.632630 38.387182 23.775787 38.302696 23.874354 38.293309 24.008123 38.222904 24.017511 38.084440 24.017511 37.927203 24.017511 37.779352 24.029245 37.683132 23.787521 37.805167 23.599774 37.988220 23.358050 37.953018 23.092858 37.953018 22.926232 38.023423 23.113979 38.068013 23.146835 38.180661 22.937967 38.206476 22.806544 38.293309 22.684508 38.396570 22.574207 38.319124 22.398194 38.370754 22.165858 38.344939 21.945255 38.380142 21.626086 38.344939 21.372628 38.422385 21.306916 38.422385 21.274060 38.370754 21.163759 38.344939 21.086314 38.441159 20.987747 38.621866 20.877445 38.750942 20.755410 38.889405 20.943157 38.872977 21.119169 38.898792 21.053458 39.018481 20.788266 39.102967 20.743676 38.976238 20.645109 39.102967 20.469096 39.335304 20.293083 39.438564 20.260228 39.539478 20.215638 39.668554 20.182782 39.701410 20.159314 39.701410 # -b 20.081868 39.684982 20.081868 39.684982 # -b 19.938711 32.172763 20.072481 32.301839 20.215638 32.414487 20.379916 32.527135 20.555929 32.646823 20.853977 32.778246 21.152025 32.815796 21.372628 32.890894 21.647207 32.900282 21.935868 32.900282 22.165858 32.834570 22.463906 32.750084 22.595329 32.693760 22.740832 32.684373 22.916845 32.602234 22.926232 32.452036 22.905111 32.423874 22.860521 32.433261 22.893377 32.320613 23.069389 32.198578 23.158569 32.172763 23.247749 32.189191 23.510594 32.151641 23.754665 32.097664 23.864966 32.050727 24.017511 31.994403 24.315559 31.956854 24.559630 31.956854 24.768498 31.938079 24.923389 31.862981 25.000835 31.663500 25.021956 31.672887 # -b 25.066546 31.560239 25.188581 31.522689 25.507751 31.588401 25.782331 31.607176 26.014667 31.569626 26.223536 31.532077 26.488728 31.513302 26.763308 31.475753 27.127067 31.372492 27.359404 31.238722 27.624596 31.201173 27.788875 31.163624 27.932032 31.069750 28.230080 31.069750 28.462416 31.013426 28.727609 30.935981 28.913009 30.842107 29.201670 30.898431 29.487983 31.032201 29.652262 31.144849 29.861130 31.257497 # -b 30.192034 36.279724 29.938576 36.197585 29.729707 36.197585 29.553695 36.235134 29.377682 36.314927 29.222791 36.448696 29.178201 36.589506 29.157080 36.662258 29.157080 36.723276 29.023310 36.777253 28.981067 36.713889 28.990454 36.662258 28.924743 36.662258 28.769852 36.739704 28.671285 36.847658 28.626695 36.857046 28.474151 36.847658 28.352115 36.828884 28.307525 36.749091 28.131513 36.652871 28.086923 36.652871 28.152634 36.758479 28.119779 36.812456 27.899176 36.758479 27.678574 36.704501 27.502561 36.669299 27.601128 36.784294 27.779487 36.864086 28.021211 36.864086 28.143247 36.918063 28.176103 36.953266 28.328647 37.014284 28.384971 37.094076 28.241814 37.103463 28.032946 37.068261 27.866320 37.033058 27.669186 37.033058 27.436849 37.033058 27.392260 37.112851 27.490827 37.173868 27.612862 37.270089 27.547151 37.314679 27.481439 37.385084 27.413381 37.420286 27.314814 37.436714 27.338282 37.551709 27.436849 37.603339 27.469705 37.673744 27.347670 37.666704 27.270224 37.631501 27.216247 37.622114 27.127067 37.727722 27.249103 37.788739 27.281958 37.910775 27.195125 38.049238 27.084824 38.110256 26.929933 38.129030 26.840753 38.154846 26.709331 38.241678 26.620151 38.215863 26.542705 38.206476 26.455872 38.248719 26.354958 38.328511 26.345571 38.380142 26.465260 38.415344 26.488728 38.544420 26.465260 38.621866 26.509850 38.708699 26.575561 38.682883 26.685862 38.457587 26.796164 38.431772 26.951055 38.457587 27.117680 38.457587 27.171657 38.457587 27.127067 38.499830 26.929933 38.560848 26.840753 38.692271 26.873609 38.795532 27.016766 38.889405 26.974523 38.976238 26.873609 39.060724 26.873609 39.147557 26.763308 39.257858 26.786776 39.412749 26.951055 39.539478 26.906465 39.600496 26.742186 39.574681 26.620151 39.548866 26.432404 39.548866 26.289247 39.539478 26.178946 39.548866 26.169559 39.616924 26.190680 39.743653 26.223536 39.905585 # -b 20.060747 39.454992 19.971567 39.574681 19.894121 39.710797 19.786167 39.778855 19.652397 39.743653 19.750964 39.591109 19.819023 39.487848 19.938711 39.386934 # -b 20.081868 39.684982 19.995035 39.762428 19.962180 39.914972 # -b 15.331874 40.100372 15.418707 39.999458 # -b 15.683899 40.025273 15.728489 39.964255 15.737876 39.872729 15.803588 39.684982 15.904502 39.539478 16.003069 39.412749 16.035924 39.309488 16.080514 39.154597 16.134492 39.060724 16.179081 38.931648 16.223671 38.854202 15.970213 38.760329 15.827056 38.682883 15.892767 38.527992 15.770732 38.380142 15.695633 38.232291 15.705021 38.058625 15.749611 37.953018 15.770732 37.978833 15.761345 37.945977 15.892767 37.936590 16.035924 37.953018 16.092248 37.988220 16.134492 38.075053 16.179081 38.145458 16.235405 38.232291 16.289383 38.293309 16.411418 38.380142 16.533453 38.405957 16.575697 38.492790 16.587431 38.664109 16.587431 38.760329 16.587431 38.811959 16.643755 38.880018 16.786912 38.915220 16.974658 38.992666 17.061491 38.992666 17.094347 39.051337 17.084960 39.128782 17.094347 39.250818 17.073226 39.309488 17.073226 39.445605 17.061491 39.464380 16.984046 39.532438 16.808033 39.607536 16.718853 39.701410 16.599165 39.743653 16.521719 39.769468 16.533453 39.914972 # -b 17.997879 40.126187 18.131648 39.964255 18.307661 39.896197 18.328782 39.879769 18.328782 39.914972 # -b 15.618188 38.319124 15.552476 38.302696 15.561864 38.293309 15.540742 38.136071 15.430441 37.988220 15.287284 37.823942 15.165249 37.596299 15.099537 37.446101 15.087803 37.368656 15.165249 37.305291 15.176983 37.234886 15.221573 37.129279 15.263816 37.058874 15.209838 36.962653 15.153514 36.819496 15.132393 36.713889 15.010357 36.704501 14.857813 36.713889 14.646598 36.758479 14.449464 36.882861 14.294573 37.042446 14.041115 37.112851 13.874489 37.119891 13.731332 37.183256 13.599910 37.288863 13.391041 37.368656 13.170439 37.500079 12.949836 37.577524 12.783211 37.603339 12.640054 37.631501 12.541487 37.734762 12.485163 37.936590 12.518019 38.058625 12.553221 38.110256 12.595464 38.171273 12.672910 38.197089 12.738621 38.171273 12.839535 38.100868 12.949836 38.110256 13.081259 38.180661 13.247884 38.241678 13.325330 38.206476 13.412163 38.171273 13.489608 38.145458 13.621031 38.100868 13.698477 37.997608 13.832246 38.006995 13.951935 38.039851 14.139682 38.058625 14.294573 38.068013 14.381406 38.075053 14.393140 38.075053 14.515175 38.084440 14.658332 38.119643 14.822611 38.190048 15.076069 38.190048 15.153514 38.190048 15.263816 38.267494 15.308406 38.258106 15.475031 38.274534 15.618188 38.319124 # -b 14.372018 35.948821 14.372018 35.993410 14.416608 35.974636 14.491707 35.939433 14.515175 35.885456 14.580887 35.850253 14.559765 35.815051 14.449464 35.831479 14.372018 35.913618 14.372018 35.948821 # -b 9.873135 37.331106 10.028027 37.288863 10.192305 37.244273 10.171183 37.209071 10.225161 37.112851 10.302606 36.997856 10.281485 36.892248 10.281485 36.838271 10.469232 36.777253 10.546677 36.838271 10.678100 36.873474 10.788401 36.953266 10.886968 37.068261 11.020738 37.068261 11.119305 36.892248 11.020738 36.749091 10.910437 36.554304 10.689834 36.483899 10.546677 36.385332 10.490353 36.181157 10.556064 35.958208 10.645244 35.850253 10.832991 35.822091 10.886968 35.714137 11.030125 35.634345 11.053593 35.526390 11.074715 35.399661 11.131039 35.265891 11.053593 35.139162 10.964414 34.949069 10.854112 34.784790 10.722690 34.667449 10.612388 34.585309 10.490353 34.503170 10.391786 34.465621 10.281485 34.374094 10.126594 34.329504 10.093738 34.219203 10.082004 34.137064 10.082004 34.092474 # -b 9.929459 33.794426 10.028027 33.749836 10.126594 33.684125 10.236895 33.648922 10.347196 33.648922 10.445763 33.674737 10.502087 33.583211 10.579533 33.510459 10.743811 33.592598 10.832991 33.592598 10.898702 33.472909 10.964414 33.315671 10.964414 33.261694 11.030125 33.195983 11.152161 33.195983 11.217872 33.214758 11.316439 33.158434 # -b 10.776667 33.878912 10.743811 33.904727 10.788401 33.850750 10.821257 33.794426 10.821257 33.702899 10.732077 33.693512 10.612388 33.702899 10.588920 33.831975 10.633510 33.869525 10.710956 33.904727 10.776667 33.878912 # -b 11.316439 33.158434 11.515920 33.111497 11.748257 33.001196 12.046305 32.900282 12.243439 32.825183 12.628320 32.806408 12.994426 32.890894 13.269006 32.872120 13.477874 32.787634 13.721945 32.778246 14.029380 32.693760 14.184272 32.611621 14.569152 32.461424 14.801489 32.414487 15.043213 32.330001 15.153514 32.245515 15.221573 32.050727 15.230960 31.853593 15.406973 31.616563 15.683899 31.363105 16.080514 31.229335 16.333972 31.229335 16.718853 31.201173 17.007514 31.135462 17.293828 31.050976 17.535552 30.973530 17.666975 30.907819 17.800744 30.823333 17.943901 30.804558 18.098793 30.745887 18.209094 30.623852 18.352251 30.508857 18.528263 30.375087 18.638565 30.337538 18.802843 30.278867 19.046914 30.278867 19.222927 30.346925 19.398939 30.403249 19.565564 30.499469 19.750964 30.670788 19.851878 30.842107 19.971567 30.994652 19.983301 31.126074 19.894121 31.316168 19.884734 31.475753 19.774433 31.625950 19.762699 31.759720 19.762699 31.872368 19.795554 32.003791 19.828410 32.069502 19.938711 32.172763 # -b 0.403656 40.180164 0.258152 39.985377 0.072752 39.816405 # -b -0.082139 39.013787 0.004694 38.936342 0.105608 38.891752 0.248765 38.865937 0.314476 38.781451 0.225296 38.652375 # -b 1.593501 39.107661 1.626357 39.098273 1.638091 39.117048 1.680334 39.004400 1.570033 38.910526 1.494934 38.865937 1.361164 38.926954 1.426876 39.030215 1.593501 39.107661 # -b 3.290263 39.959562 3.290263 39.933747 3.280876 39.917319 3.248020 39.832833 3.257407 39.774162 3.412298 39.774162 3.501478 39.663861 3.412298 39.457339 3.212817 39.295407 3.093129 39.356425 2.926503 39.433871 2.860792 39.544172 2.717635 39.534785 2.619068 39.492542 2.508767 39.595802 2.684779 39.755387 2.971093 39.875076 3.170574 39.933747 3.280876 39.985377 3.301997 39.985377 3.290263 39.959562 # -b 4.327564 40.027620 4.339298 39.985377 4.348685 39.900891 4.348685 39.858648 4.250118 39.858648 4.085840 39.910278 # -b 9.673654 40.142615 9.673654 39.990071 9.673654 39.785896 9.664267 39.626311 9.652533 39.487848 9.652533 39.403362 9.598556 39.309488 9.586822 39.241430 9.488254 39.173372 9.377953 39.189800 9.244184 39.225002 9.145616 39.154597 9.068171 39.018481 8.946136 38.941035 8.871037 38.915220 8.770123 38.898792 8.683290 38.966850 8.650434 39.018481 8.626966 39.034909 8.561255 39.102967 8.483809 39.189800 8.450953 39.309488 8.462687 39.393974 8.406363 39.506623 8.429832 39.616924 8.439219 39.642739 8.450953 39.727225 8.462687 39.795283 8.528399 39.846914 8.540133 39.931400 8.495543 39.973643 # -b -0.061018 35.845560 0.138463 35.915965 0.248765 36.059122 0.380187 36.174117 0.490489 36.228094 0.645380 36.256256 0.776802 36.345436 0.833126 36.390026 1.009139 36.441656 1.328309 36.530836 1.548911 36.584813 1.835225 36.594200 2.243574 36.620015 2.508767 36.645831 2.738757 36.638790 2.917116 36.718582 3.093129 36.833577 3.212817 36.798375 3.290263 36.798375 3.400564 36.814803 3.433420 36.814803 3.489744 36.798375 3.534334 36.788987 3.698612 36.814803 3.865237 36.885208 3.984926 36.929798 4.128083 36.920410 4.282974 36.920410 4.426131 36.929798 4.548166 36.939185 4.703058 36.920410 4.846215 36.920410 4.965903 36.913370 5.001106 36.899289 # -b 5.001106 36.899289 5.043349 36.857046 5.099673 36.828884 5.165384 36.777253 5.364865 36.723276 5.561999 36.767866 5.728625 36.838271 6.024326 36.882861 6.223807 36.953266 6.378698 37.129279 6.599300 37.068261 6.754192 36.988468 6.852759 36.988468 7.017037 36.934491 7.228252 36.997856 7.326819 37.112851 7.556809 37.042446 7.699966 37.007243 7.854857 36.899289 8.075460 36.927451 8.218617 36.979081 8.340652 36.953266 8.483809 36.943879 8.582376 36.953266 8.716146 36.979081 # -b 8.716146 36.979081 8.793591 37.007243 8.847568 37.068261 9.002460 37.155094 9.232449 37.253661 9.431930 37.314679 9.673654 37.340494 9.873135 37.331106 # -b 10.082004 34.092474 9.861401 34.137064 9.861401 34.071352 9.861401 34.071352 9.861401 33.970438 9.884870 33.914114 9.929459 33.794426 # -b -5.508022 50.043912 -5.508022 49.994629 # -b -5.099673 50.029831 -5.043349 49.987588 # -b -8.638700 41.822949 -8.594110 41.649283 -8.540133 41.393478 -8.483809 41.210425 -8.495543 41.086043 -8.516665 40.961660 -8.549520 40.809116 -8.594110 40.651878 -8.650434 40.525149 -8.704411 40.297506 -8.725533 40.086291 # -b -1.692068 43.376554 -1.868081 43.336657 -2.198985 43.343698 -2.452443 43.409409 -2.827936 43.400022 -2.992215 43.392982 -3.346587 43.432878 -3.555455 43.479814 -3.797179 43.432878 -4.151551 43.416450 -4.470721 43.432878 -4.867336 43.489202 -5.076204 43.529098 -5.287420 43.536138 -5.627711 43.608890 -5.848313 43.632359 -6.036060 43.561954 -6.411554 43.552566 -6.787047 43.552566 -7.139072 43.601850 -7.413652 43.695723 -7.601399 43.728579 -7.777412 43.705111 -8.021482 43.655827 -8.141171 43.519711 -8.131784 43.423490 -8.274941 43.320230 -8.615232 43.310842 -8.826447 43.263906 -9.035315 43.151258 -9.124495 42.972898 -8.969604 42.867290 -8.835834 42.794539 -8.859303 42.681890 -8.737267 42.625566 -8.650434 42.632607 -8.770123 42.454247 -8.605844 42.395577 -8.659822 42.282929 -8.507277 42.299356 -8.626966 42.174974 -8.692677 42.013042 -8.683290 41.888660 -8.638700 41.822949 # -b -1.703802 43.367166 -1.516055 43.360126 -1.328309 43.449306 -1.250863 43.601850 -1.206273 43.801331 -1.128828 44.071217 -1.053729 44.388040 -0.919959 44.615683 -0.875370 44.655579 -1.009139 44.742412 -1.020873 44.772921 -0.997405 44.953627 -0.943428 45.202391 -0.931694 45.420647 -0.875370 45.521561 -0.722825 45.404219 -0.612524 45.312693 -0.556200 45.249328 -0.612524 45.420647 -0.755681 45.552070 -0.943428 45.636556 -1.009139 45.760938 -0.910572 45.899401 -0.910572 46.068374 -0.985671 46.173981 -0.985671 46.298363 -1.020873 46.288976 -1.030261 46.298363 -1.196886 46.319485 -1.426876 46.403971 -1.647478 46.509579 -1.814104 46.655082 -1.945526 46.821708 -1.912671 46.957824 -1.936139 47.100981 -1.990116 47.190161 -1.757780 47.220670 -1.626357 47.234751 -1.814104 47.288728 -2.121539 47.279341 -2.342141 47.288728 -2.332754 47.399029 -2.309286 47.497596 -2.365610 47.518718 -2.696514 47.518718 -2.607334 47.563308 -2.738757 47.593816 -2.959359 47.542186 -3.060273 47.563308 -3.081395 47.600857 -3.114250 47.631366 -3.280876 47.713505 -3.456888 47.758095 -3.731468 47.816766 -3.841769 47.854315 -4.008394 47.847275 -4.205529 47.786257 -4.306442 47.891864 -4.458987 47.988085 -4.536432 48.032675 -4.414397 48.067877 -4.261853 48.105426 -4.294708 48.164097 -4.437865 48.157057 -4.470721 48.215728 -4.393275 48.288480 -4.294708 48.295520 -4.261853 48.356538 -4.437865 48.340110 -4.634999 48.326029 -4.634999 48.391740 -4.569288 48.509082 -4.360420 48.581834 -4.160939 48.633464 -4.041250 48.647545 -3.865237 48.671014 -3.710346 48.671014 -3.588311 48.699176 -3.445154 48.720297 -3.424032 48.786009 -3.323119 48.823558 -3.248020 48.800090 -3.137719 48.816518 -2.926503 48.816518 -2.816202 48.764887 -2.651924 48.647545 -2.475911 48.560712 -2.299898 48.605302 -2.145007 48.633464 -2.100417 48.619383 -1.990116 48.612343 -1.858693 48.654586 -1.715536 48.678054 -1.638091 48.654586 -1.570033 48.605302 -1.361164 48.612343 -1.283719 48.671014 -1.405754 48.720297 -1.459731 48.865801 -1.459731 49.011305 -1.516055 49.133340 -1.560645 49.292925 -1.680334 49.351596 -1.736658 49.452510 -1.757780 49.595667 -1.769514 49.694234 -1.593501 49.659031 -1.349430 49.666072 -1.206273 49.673112 -1.140562 49.651991 -1.152296 49.609748 -1.164030 49.544036 -1.053729 49.466591 -0.943428 49.358636 -0.842514 49.365677 -0.556200 49.337515 -0.302742 49.292925 -0.105608 49.292925 # -b -60.071939 45.859505 -59.940516 45.936951 -59.839602 45.976847 -59.773891 45.997969 -59.762157 46.044905 -59.863070 46.068374 -59.839602 46.159900 -59.839602 46.227958 -59.949903 46.265508 # -b -56.288841 47.138530 -56.333430 47.122103 -56.333430 47.084553 -56.300575 46.957824 -56.288841 46.866298 -56.279453 46.805280 -56.213742 46.852217 -56.223129 46.988333 -56.213742 47.084553 -56.288841 47.138530 # -b -57.635924 50.036872 -57.722757 49.928917 -57.755613 49.851472 -57.844792 49.745864 -57.856526 49.623829 -57.823671 49.579239 -57.823671 49.529955 -57.966828 49.529955 -58.131106 49.400879 -58.196818 49.292925 -58.152228 49.243642 -58.020805 49.227214 -58.020805 49.192011 -58.065395 49.142728 -58.020805 49.062935 -58.086516 49.062935 -58.253142 49.084057 -58.351709 49.091097 -58.450276 48.931512 -58.605167 48.661626 -58.736590 48.605302 -58.814035 48.685095 -58.968926 48.633464 -59.123817 48.553672 -59.123817 48.509082 -58.936071 48.523163 -58.703734 48.539591 -58.518334 48.516123 -58.440888 48.429290 -58.682612 48.288480 -58.980660 48.112467 -59.288096 47.891864 -59.311564 47.713505 -59.222384 47.593816 -58.980660 47.563308 -58.616901 47.624325 -58.274263 47.652487 -58.053661 47.682996 -57.889382 47.661875 -57.657045 47.645447 -57.424709 47.645447 -57.260430 47.593816 -57.016359 47.586776 -56.730046 47.579735 -56.476587 47.624325 -56.324043 47.631366 -56.145684 47.652487 -56.025995 47.741667 -55.882838 47.802685 -55.739681 47.847275 -55.781924 47.713505 -55.781924 47.631366 -56.035382 47.556267 -56.091706 47.490556 -55.892225 47.497596 -55.859370 47.453006 -55.781924 47.460047 -55.662236 47.474128 -55.462755 47.481168 -55.373575 47.579735 -55.275008 47.668915 -55.122464 47.624325 -54.857271 47.624325 -54.779826 47.586776 -55.021550 47.474128 -55.209296 47.354439 -55.331332 47.220670 -55.429899 47.129143 -55.683357 47.084553 -55.826514 47.039963 -55.859370 46.920275 -55.662236 46.882725 -55.408777 46.920275 -55.221031 46.971905 -55.110729 47.077513 -55.045018 47.166692 -54.922983 47.258219 -54.779826 47.370867 -54.613200 47.415457 -54.493512 47.445966 -54.460656 47.429538 -54.437188 47.422497 -54.383210 47.535146 -54.282297 47.706464 -54.183729 47.927067 -54.028838 47.927067 -54.007717 47.786257 -53.930271 47.563308 -53.885681 47.354439 -54.040573 47.100981 -54.085162 46.873338 -53.942005 46.835789 -53.754259 47.032923 -53.587633 47.183120 -53.500800 47.122103 -53.578246 46.971905 -53.554778 46.852217 -53.566512 46.730181 -53.467945 46.617533 -53.280198 46.730181 -53.047861 46.692632 -52.916438 46.927315 -52.827259 47.220670 -52.695836 47.445966 -52.695836 47.713505 -52.794403 47.751054 -52.916438 47.607897 -53.038474 47.460047 -53.125307 47.535146 -53.137041 47.720546 -53.047861 47.905945 -52.961028 48.032675 -52.871849 48.098386 -52.871849 48.194606 -53.047861 48.105426 -53.247342 48.023287 -53.411621 47.823806 -53.500800 47.661875 -53.611102 47.652487 -53.709669 47.699424 -53.765993 47.786257 -53.709669 47.875437 -53.655692 48.032675 -53.688547 48.046756 -53.721403 48.112467 -53.864560 48.215728 -53.709669 48.253277 -53.489066 48.304907 -53.357643 48.429290 -53.181631 48.464492 -53.071330 48.595915 -53.104185 48.671014 -53.280198 48.605302 -53.423355 48.574793 -53.587633 48.516123 -53.688547 48.523163 -53.951393 48.450411 -54.007717 48.502042 -53.885681 48.605302 -53.754259 48.750806 -53.831704 48.816518 -53.942005 48.830599 -53.819970 48.997224 -53.622836 49.133340 -53.489066 49.299966 -53.512535 49.358636 -53.435089 49.271804 -53.423355 49.285885 -53.611102 49.372717 -53.963127 49.436082 -54.294031 49.407920 -54.437188 49.508834 -54.570957 49.473631 -54.812681 49.379758 -55.131851 49.278844 -55.319598 49.271804 -55.155319 49.494753 -55.131851 49.572198 -55.319598 49.501793 -55.364188 49.436082 -55.474489 49.480672 -55.629380 49.487712 -55.859370 49.501793 -55.849982 49.651991 -55.936815 49.680153 -56.035382 49.694234 -55.814780 49.816269 -55.483876 49.921877 -55.629380 49.966467 -55.849982 49.980548 -56.079972 49.987588 # -b -56.169152 50.128398 -56.366286 49.935958 -56.577501 49.802188 -56.720658 49.637910 -56.774635 49.722396 -56.798104 49.781067 -56.720658 49.914836 # -b -66.732257 50.072074 -66.851945 49.980548 -67.018571 49.823310 -67.117138 49.616788 -67.182849 49.501793 -67.260295 49.379758 -67.314272 49.358636 -67.558343 49.351596 -67.788333 49.344555 -68.008935 49.328128 -68.163826 49.227214 -68.220150 49.192011 -68.241272 49.133340 -68.330452 49.133340 -68.539320 49.004264 -68.670743 48.917431 -68.846755 48.858761 -68.957057 48.743766 -69.046236 48.654586 -69.189393 48.509082 -69.365406 48.326029 -69.564887 48.215728 -69.651720 48.201647 -69.762021 48.201647 -69.740900 48.002166 -69.895791 47.786257 # -b -70.116393 47.445966 -69.928646 47.556267 -69.762021 47.682996 -69.630598 47.847275 -69.532031 47.995125 -69.356019 48.091345 -69.135416 48.229809 -68.947669 48.363578 -68.846755 48.415209 -68.771657 48.429290 -68.670743 48.436330 -68.539320 48.532550 -68.339839 48.619383 -68.119236 48.678054 -67.933836 48.757847 -67.722621 48.851720 -67.534875 48.917431 -67.272029 48.983143 -67.072548 49.039467 -66.741644 49.149768 -66.544510 49.192011 -66.312173 49.236601 -65.993004 49.278844 -65.760667 49.271804 -65.551799 49.299966 -65.298341 49.285885 -65.021414 49.264763 -64.833667 49.220173 -64.547353 49.126300 -64.305629 49.011305 -64.207062 48.889269 -64.174207 48.830599 -64.249305 48.858761 -64.305629 48.872842 -64.338485 48.844680 -64.228184 48.750806 -64.228184 48.560712 -64.415931 48.436330 -64.657655 48.318988 -64.878257 48.194606 -65.176305 48.091345 -65.507209 48.105426 -65.793523 48.201647 -65.960148 48.178178 -66.180751 48.150016 -66.455330 48.084305 -66.521042 48.046756 -66.255849 48.053796 -65.981270 47.995125 -65.772401 47.943495 -65.683222 47.786257 -65.596389 47.727586 -65.340584 47.816766 -65.054270 47.920026 -64.988558 47.898905 -65.000293 47.847275 -64.845401 47.830847 -64.746834 47.772176 -64.758569 47.638406 -64.845401 47.490556 -64.922847 47.340358 -65.066004 47.234751 -65.220895 47.145571 -65.220895 47.115062 -65.066004 47.129143 -64.934581 47.115062 -64.800812 47.100981 -64.812546 46.971905 -64.833667 46.842829 -64.800812 46.746609 -64.713979 46.631614 -64.657655 46.509579 -64.570822 46.418052 -64.448786 46.349994 -64.469908 46.298363 -64.371341 46.281936 -64.162472 46.274895 -63.974726 46.220918 -63.775245 46.159900 -63.697799 46.112963 -63.864424 46.044905 -63.885546 45.967460 -63.733002 45.929910 -63.521786 45.913482 -63.235473 45.838384 -63.059460 45.821956 -62.871713 45.805528 -62.728556 45.784407 -62.662845 45.699920 -62.618255 45.699920 -62.531422 45.699920 -62.266230 45.730429 -62.066749 45.828996 -61.902470 45.906442 -61.813290 45.784407 -61.846146 45.667065 -61.735845 45.683493 -61.571566 45.667065 -61.383820 45.690533 -61.252397 45.582579 -61.252397 45.730429 -61.184339 45.521561 -61.294640 45.467584 -61.318108 45.397179 -61.196073 45.390138 -61.031794 45.380751 -60.954349 45.343202 -61.074037 45.279837 -61.240663 45.289224 -61.404941 45.218819 -61.548098 45.249328 -61.670134 45.188310 -61.780435 45.131986 -61.956447 45.070969 -62.155928 45.024032 -62.320207 44.946586 -62.409387 44.937199 -62.453976 44.866794 -62.618255 44.873834 -62.740290 44.812817 -62.806002 44.772921 -62.928037 44.772921 -63.005483 44.756493 -63.038338 44.779961 -63.104050 44.756493 -63.169761 44.742412 -63.214351 44.709556 -63.301184 44.672007 -63.434954 44.718943 -63.533521 44.742412 -63.500665 44.662619 -63.479543 44.568746 -63.500665 44.505381 -63.721267 44.505381 -63.843303 44.615683 -63.852690 44.679047 -63.941870 44.585174 -64.007581 44.505381 -64.063905 44.615683 -64.162472 44.491300 -64.174207 44.418548 -64.183594 44.378652 -64.207062 44.308247 -64.293895 44.268351 -64.392462 44.204986 -64.514498 44.094685 -64.624799 43.991424 -64.681123 43.921019 -64.758569 43.888164 -64.878257 43.848268 -64.988558 43.695723 -65.098860 43.735619 -65.131715 43.745007 -65.232629 43.705111 -65.253751 43.615931 -65.265485 43.568994 -65.364052 43.505630 -65.441498 43.505630 -65.629244 43.552566 -65.716077 43.728579 -65.826379 43.815412 -65.969535 43.824799 -66.058715 44.014893 -66.079837 44.204986 -66.035247 44.364571 -65.924946 44.498341 -65.816991 44.608642 -65.903824 44.538237 -66.103305 44.442017 -66.058715 44.552318 -65.781789 44.702516 -65.650366 44.686088 -65.474353 44.756493 -65.486087 44.826898 -65.298341 44.913731 -65.054270 45.047500 -64.824280 45.148414 -64.636533 45.232900 -64.383075 45.319733 -64.305629 45.265756 -64.272774 45.171883 -64.106148 45.108518 -64.052171 45.164842 -63.930136 45.242288 -63.754123 45.312693 -63.512399 45.343202 -63.324652 45.350242 -63.301184 45.427688 -63.578110 45.434728 -63.843303 45.397179 -64.096761 45.427688 -64.305629 45.458196 -64.537966 45.380751 -64.735100 45.357283 -64.767956 45.505133 -64.526232 45.636556 -64.305629 45.838384 -64.359607 45.845424 -64.448786 45.828996 -64.502764 45.929910 -64.570822 45.838384 -64.669389 45.706961 -64.824280 45.676452 -64.878257 45.667065 -64.889991 45.660024 -64.988558 45.599007 -65.242017 45.474624 -65.462619 45.350242 -65.638632 45.289224 -65.826379 45.272796 -65.960148 45.296265 -66.103305 45.188310 -66.234728 45.148414 -66.401353 45.131986 -66.511654 45.124946 -66.631343 45.108518 -66.741644 45.117905 -66.840211 45.164842 -66.962247 45.195351 -67.027958 45.195351 # -b -63.974726 49.959426 -64.007581 49.942998 -63.843303 49.935958 -63.533521 49.844431 -63.268328 49.823310 -63.005483 49.752905 -62.761412 49.694234 -62.552544 49.637910 -62.364797 49.529955 -62.233374 49.443122 -62.123073 49.422001 -62.045627 49.422001 -61.979916 49.393839 -61.879002 49.400879 -61.825025 49.351596 -61.803903 49.292925 -61.735845 49.236601 -61.702989 49.163849 -61.836759 49.112219 -62.066749 49.112219 -62.266230 49.105178 -62.531422 49.156809 -62.773146 49.170890 -62.970280 49.243642 -63.169761 49.278844 -63.390364 49.351596 -63.545255 49.459550 -63.610966 49.595667 -63.754123 49.644950 -63.918402 49.694234 -64.063905 49.752905 -64.195328 49.788107 -64.317364 49.830350 -64.415931 49.879634 -64.427665 49.950039 -64.195328 49.980548 -63.974726 49.959426 # -b -63.953604 46.988333 -63.918402 47.100981 -63.930136 47.100981 -63.941870 47.100981 -63.930136 47.032923 -63.930136 46.934356 -63.995847 46.859257 -64.028703 46.805280 -63.941870 46.737222 -63.885546 46.648042 -63.819834 46.579984 -63.709533 46.533047 -63.610966 46.570596 -63.411485 46.549475 -63.258941 46.509579 -63.092316 46.481417 -62.904569 46.418052 -62.662845 46.448561 -62.597133 46.464989 -62.463364 46.495498 -62.242761 46.488457 -62.022159 46.481417 -62.012771 46.411012 -62.221640 46.380503 -62.266230 46.328872 -62.310820 46.288976 -62.409387 46.251427 -62.421121 46.122351 -62.421121 46.082455 -62.397652 46.044905 -62.597133 46.007356 -62.817736 46.068374 -62.871713 46.129391 -62.883447 46.220918 -63.014870 46.281936 -63.080581 46.265508 -63.092316 46.197450 -63.258941 46.204490 -63.456075 46.251427 -63.655556 46.312444 -63.697799 46.380503 -63.721267 46.418052 -63.918402 46.434480 -64.052171 46.540087 -64.028703 46.617533 -64.162472 46.648042 -64.282161 46.692632 -64.293895 46.828748 -64.106148 46.957824 -63.962991 47.054044 -63.953604 46.988333 # -b -60.545999 46.995373 -60.599977 47.039963 -60.623445 46.920275 -60.778336 46.784158 -60.876903 46.685591 -60.987204 46.488457 -61.074037 46.389890 -61.174951 46.305404 -61.318108 46.173981 -61.327496 46.082455 -61.404941 45.913482 -61.404941 45.814915 -61.318108 45.737470 -61.252397 45.643596 -61.074037 45.599007 -60.987204 45.613088 -60.865169 45.660024 -60.811192 45.667065 -60.599977 45.652984 -60.468554 45.660024 -60.358253 45.699920 -60.247951 45.737470 -60.149384 45.784407 -60.071939 45.859505 # -b -59.949903 46.265508 -60.006227 46.298363 -60.050817 46.251427 -60.137650 46.136432 -60.170506 46.251427 -60.193974 46.251427 -60.313663 46.204490 -60.402843 46.159900 -60.522531 46.122351 -60.599977 46.143472 -60.501410 46.251427 -60.412230 46.328872 -60.435698 46.335913 -60.513144 46.359381 -60.379374 46.570596 -60.325397 46.737222 -60.304275 46.859257 -60.325397 46.903847 -60.346519 46.978946 -60.391108 47.009454 -60.501410 47.039963 -60.545999 46.995373 # -b -67.027958 45.195351 -67.027958 45.171883 -67.039692 45.148414 -67.027958 45.078009 -67.027958 45.024032 -67.027958 44.977095 -67.072548 44.937199 -67.093669 44.923118 -67.105404 44.890262 -67.051426 44.890262 -66.973981 44.890262 -66.950513 44.852713 -66.962247 44.772921 -67.027958 44.725984 -67.138259 44.679047 -67.215705 44.686088 -67.293150 44.648538 -67.415186 44.639151 -67.480897 44.585174 -67.602933 44.561705 -67.656910 44.568746 -67.713234 44.568746 -67.788333 44.545278 -67.823535 44.481913 -67.922102 44.442017 -67.976080 44.434976 -68.020669 44.451404 -68.065259 44.427936 -68.130971 44.371612 -68.163826 44.364571 -68.220150 44.291819 -68.318717 44.277738 -68.339839 44.301207 -68.384429 44.331716 -68.482996 44.378652 -68.518198 44.341103 -68.637887 44.355184 -68.670743 44.378652 -68.694211 44.442017 -68.715333 44.528850 -68.804512 44.514769 -68.903079 44.458445 -68.935935 44.324675 -69.001646 44.237842 -69.025115 44.141622 -69.057971 44.087645 -69.090826 44.031321 -69.144803 44.014893 -69.177659 44.031321 -69.266839 44.047749 -69.344284 43.991424 -69.409996 43.888164 -69.454586 43.888164 -69.541419 43.871736 -69.564887 43.895204 -69.586008 43.944488 -69.630598 43.935100 -69.651720 43.848268 -69.686922 43.801331 -69.719778 43.752047 -69.752634 43.735619 -69.773755 43.784903 -69.797224 43.841227 -69.839467 43.871736 -69.907525 43.871736 # -b -70.027213 41.764278 -69.994358 41.797134 -69.982624 41.813561 -69.982624 41.865192 -69.982624 41.921516 -69.994358 41.970799 -69.982624 41.996615 -69.928646 41.954372 -69.895791 41.839377 -69.872322 41.740810 -69.907525 41.714994 -69.982624 41.691526 # -b -69.895791 47.786257 -70.137515 47.497596 -70.226694 47.490556 -70.402707 47.363827 -70.623310 47.220670 -70.811056 47.093941 -70.954213 46.978946 -71.097370 46.889766 -71.073902 46.859257 -70.865034 46.903847 -70.677287 46.988333 -70.667899 46.988333 -70.656165 47.032923 -70.557598 47.070472 -70.456684 47.159652 -70.292406 47.272300 -70.116393 47.445966 # -b -69.907525 43.871736 -70.060069 43.824799 -70.170370 43.728579 -70.203226 43.672255 -70.214960 43.625318 -70.226694 43.585422 -70.268937 43.529098 -70.292406 43.519711 -70.304140 43.519711 -70.325261 43.496242 -70.402707 43.392982 -70.480153 43.310842 -70.489540 43.310842 -70.513008 43.287374 -70.545864 43.207582 -70.611575 43.118402 -70.667899 43.022182 -70.733611 42.916574 -70.766466 42.794539 -70.778201 42.778111 -70.778201 42.738215 -70.778201 42.731174 -70.778201 42.714746 -70.754732 42.672503 -70.710142 42.656075 -70.677287 42.616179 -70.754732 42.599751 -70.799322 42.510572 -70.820444 42.461288 -70.865034 42.470675 -70.942479 42.381496 -70.942479 42.322825 -70.853299 42.282929 -70.778201 42.257113 -70.721877 42.191402 -70.700755 42.184361 -70.689021 42.144465 -70.667899 42.095182 -70.667899 42.029470 -70.611575 42.003655 -70.578720 41.987227 -70.545864 41.914475 -70.524742 41.839377 -70.447297 41.797134 -70.346383 41.764278 -70.226694 41.747850 -70.116393 41.740810 -70.027213 41.764278 # -b -69.982624 41.691526 -70.092925 41.642243 -70.160983 41.625815 -70.226694 41.642243 -70.346383 41.609387 -70.456684 41.583572 -70.557598 41.583572 -70.590454 41.609387 -70.590454 41.642243 -70.599841 41.682139 -70.644431 41.691526 -70.742998 41.658670 -70.843912 41.609387 -70.888502 41.583572 -70.963601 41.557756 -71.019925 41.557756 -71.085636 41.557756 -71.141960 41.557756 -71.141960 41.625815 -71.163082 41.698567 -71.219406 41.740810 -71.273383 41.698567 -71.317973 41.642243 -71.350828 41.567144 -71.383684 41.485005 -71.482251 41.426334 -71.625408 41.393478 -71.726322 41.377050 -71.747444 41.377050 -71.747444 41.367663 -71.846011 41.351235 -72.012636 41.351235 -72.221504 41.334807 -72.540674 41.301951 -72.716686 41.292564 -72.826988 41.327767 -73.014735 41.259708 -73.071059 41.184610 -73.181360 41.168182 -73.324517 41.135326 -73.378494 41.102470 -73.488795 41.086043 -73.622565 41.010944 -73.721132 40.942886 -73.786843 40.910030 -73.810312 40.902989 -73.831433 40.893602 -73.843167 40.910030 -73.897145 40.910030 -73.974590 40.844319 -74.019180 40.785648 -74.084891 40.743405 -74.117747 40.710549 -74.183458 40.626063 -74.216314 40.558005 -74.216314 40.499334 -74.174071 40.475865 -74.063770 40.457091 -73.974590 40.349136 -73.941734 40.248222 -73.986324 40.086291 -74.019180 40.001805 # -b -74.040301 39.985377 -74.073157 40.001805 # -b -75.694820 44.552318 -75.650230 44.575786 -75.638496 44.575786 -75.781653 44.498341 -75.981134 44.371612 -76.213471 44.341103 -76.443461 44.268351 -76.654676 44.197946 -76.774364 44.158050 -76.908134 44.101726 -76.940990 44.087645 -76.962111 44.141622 -76.985580 44.174478 -77.060678 44.181518 -77.215569 44.158050 -77.248425 44.118154 -77.161592 44.118154 -77.117002 44.047749 -77.039557 43.967956 -77.018435 43.904592 -77.182714 43.881123 -77.260159 43.944488 -77.459640 43.951528 -77.680243 43.984384 -77.722486 43.984384 -77.745954 43.984384 -77.823400 43.998465 -78.130835 43.984384 -78.363172 43.928060 -78.572040 43.881123 -78.804377 43.848268 -78.947534 43.815412 -79.168136 43.761435 -79.278437 43.705111 -79.433329 43.615931 -79.487306 43.568994 -79.543630 43.536138 -79.597607 43.456346 -79.663318 43.409409 -79.752498 43.336657 -79.806475 43.287374 -79.773620 43.270946 -79.663318 43.247478 -79.531896 43.214622 -79.388739 43.191154 -79.233848 43.224009 -79.013245 43.256865 -78.881822 43.296761 -78.694076 43.327270 -78.506329 43.367166 -78.175425 43.392982 -78.109714 43.400022 -77.987678 43.400022 -77.844521 43.367166 -77.755341 43.360126 -77.722486 43.353085 -77.656774 43.303802 -77.569942 43.263906 -77.459640 43.287374 -77.403316 43.303802 -77.370461 43.310842 -77.304749 43.296761 -77.138124 43.296761 -76.940990 43.303802 -76.774364 43.343698 -76.610086 43.439918 -76.478663 43.512670 -76.312038 43.545526 -76.279182 43.545526 -76.168881 43.552566 -76.136025 43.641746 -76.168881 43.768475 -76.201737 43.791944 -76.258061 43.848268 -76.267448 43.888164 -76.246327 43.921019 -76.180615 43.911632 -76.112557 43.944488 -76.103170 43.951528 -76.103170 43.998465 -76.157147 44.047749 -76.201737 44.038361 -76.290916 44.047749 -76.312038 44.118154 -76.246327 44.174478 -76.136025 44.221414 -76.013990 44.277738 -75.870833 44.355184 -75.760532 44.491300 -75.694820 44.552318 # -b -78.881822 42.867290 -78.870088 42.836782 -78.891210 42.827394 -79.078957 42.850863 -79.409860 42.883718 -79.707908 42.876678 # -b -80.160847 42.174974 -79.961367 42.191402 -79.818210 42.266501 -79.686787 42.332212 -79.487306 42.428432 -79.299559 42.559855 -79.233848 42.566896 -79.168136 42.599751 -79.123546 42.656075 -79.102425 42.681890 -79.057835 42.705359 -78.947534 42.778111 -78.924065 42.787498 -78.914678 42.787498 -78.870088 42.820354 -78.881822 42.867290 # -b -80.038812 44.873834 -79.994222 44.836285 -79.928511 44.796389 -79.785354 44.796389 -79.707908 44.826898 -79.707908 44.843326 -79.761886 44.923118 -79.829944 44.953627 -79.928511 44.977095 # -b -72.200383 41.193997 -72.287216 41.144713 -72.397517 41.069615 -72.573530 40.994516 -72.740155 40.978088 -72.949023 40.978088 -73.059324 40.961660 -73.181360 40.942886 -73.291661 40.926458 -73.378494 40.910030 -73.467674 40.910030 -73.545119 40.886562 -73.599096 40.860746 -73.655421 40.851359 -73.676542 40.834931 -73.753988 40.818503 -73.775109 40.809116 -73.819699 40.759833 -73.831433 40.743405 -73.864289 40.743405 -73.920613 40.717589 -73.930000 40.668306 -73.941734 40.616676 -73.930000 40.600248 -73.920613 40.642491 -73.843167 40.658919 -73.831433 40.609635 -73.753988 40.593207 -73.655421 40.626063 -73.566241 40.668306 -73.467674 40.694121 -73.423084 40.694121 -73.336251 40.710549 -73.225950 40.726977 -73.136770 40.743405 -73.005347 40.776260 -72.883312 40.792688 -72.794132 40.802076 -72.650975 40.827891 -72.573530 40.827891 -72.453841 40.867787 -72.430373 40.877174 -72.385783 40.902989 -72.310684 40.910030 -72.176914 40.952273 -72.045492 41.001557 -71.956312 41.036759 -71.935190 41.043800 -71.979780 41.043800 -72.078347 41.060227 -72.144059 41.060227 -72.233238 41.027372 -72.298950 41.010944 -72.385783 40.952273 -72.507818 40.935845 -72.486697 40.978088 -72.409251 41.036759 -72.331806 41.086043 -72.254360 41.128286 -72.209770 41.177569 -72.200383 41.193997 # -b -82.132189 45.892361 -82.176779 45.875933 -82.352792 45.906442 -82.519417 45.899401 -82.650840 45.852465 -82.793997 45.892361 -82.960622 45.906442 -83.047455 45.906442 -83.181224 45.892361 -83.136634 45.821956 -83.005212 45.784407 -82.793997 45.744510 -82.662574 45.714001 -82.573394 45.660024 -82.387994 45.652984 -82.242490 45.591966 -82.021888 45.559110 -81.946789 45.545029 -81.824754 45.568498 -81.813019 45.582579 -81.747308 45.652984 -81.702718 45.730429 -81.660475 45.791447 -81.669862 45.859505 -81.759042 45.852465 -81.791898 45.730429 -81.791898 45.676452 -81.845875 45.613088 -81.902199 45.622475 -81.869343 45.699920 -81.869343 45.791447 -81.869343 45.859505 -81.923321 45.946338 -82.045356 45.946338 -82.111067 45.899401 -82.132189 45.892361 # -b -79.707908 42.876678 -80.050546 42.827394 -80.259415 42.761683 -80.381450 42.681890 -80.545728 42.576283 -80.754597 42.625566 -81.130090 42.672503 -81.472728 42.592711 -81.571295 42.552815 -81.648741 42.503531 -81.747308 42.381496 -81.791898 42.306397 -81.845875 42.322825 -82.057090 42.266501 -82.167392 42.184361 -82.352792 42.102222 -82.453705 42.029470 -82.463093 41.963759 -82.552272 41.980187 -82.740019 42.003655 -82.838586 41.980187 -83.103779 42.003655 -83.136634 41.996615 -83.258670 41.888660 -83.378358 41.806521 -83.455804 41.724382 -83.192958 41.642243 -83.059189 41.557756 -82.972356 41.534288 -82.838586 41.541329 -82.793997 41.492045 -82.674308 41.475617 -82.453705 41.452149 -82.265959 41.492045 -82.111067 41.534288 -81.956176 41.524901 -81.813019 41.534288 -81.681597 41.592959 -81.493850 41.682139 -81.338959 41.757237 -81.174680 41.829989 -81.031523 41.881620 -80.820308 41.947331 -80.656030 41.980187 -80.456549 42.036511 -80.313392 42.078754 -80.160847 42.174974 # -b -82.573394 42.625566 -82.662574 42.625566 -82.793997 42.625566 -82.904298 42.543427 -82.939500 42.470675 -82.939500 42.381496 -82.904298 42.332212 -82.850321 42.315784 -82.805731 42.306397 -82.718898 42.299356 -82.641452 42.306397 -82.552272 42.315784 -82.486561 42.339253 -82.453705 42.404964 -82.441971 42.444860 -82.463093 42.487103 -82.507683 42.494144 -82.552272 42.526999 -82.573394 42.592711 -82.573394 42.625566 # -b -82.463093 43.062078 -82.420850 43.094933 -82.420850 43.101974 -82.397381 43.101974 -82.265959 43.085546 -82.176779 43.151258 -82.132189 43.224009 -81.967911 43.231050 -81.813019 43.360126 -81.747308 43.576035 -81.759042 43.784903 -81.803632 43.998465 -81.791898 44.158050 -81.702718 44.261311 -81.559561 44.427936 -81.472728 44.528850 -81.404670 44.639151 -81.395283 44.733024 -81.395283 44.826898 -81.428138 44.913731 -81.460994 44.991176 -81.505584 45.054541 -81.550174 45.124946 -81.559561 45.164842 -81.625273 45.188310 -81.669862 45.256369 -81.637007 45.279837 -81.538440 45.265756 -81.428138 45.242288 -81.350693 45.242288 -81.338959 45.164842 -81.306103 45.070969 -81.240392 44.977095 -81.219270 44.930159 -81.195802 44.906690 -81.186414 44.906690 -81.151212 44.899650 -81.097235 44.953627 -81.052645 44.977095 -81.031523 44.984136 -81.040911 44.937199 -81.052645 44.873834 -81.064379 44.819857 -81.064379 44.796389 -81.031523 44.796389 -80.986933 44.796389 -80.954078 44.695475 -80.954078 44.615683 -80.930609 44.639151 -80.843777 44.695475 -80.810921 44.725984 -80.766331 44.742412 -80.710007 44.686088 -80.677151 44.632110 -80.578584 44.592214 -80.357982 44.538237 -80.181969 44.528850 -80.092789 44.538237 -80.017691 44.615683 -80.017691 44.679047 -80.038812 44.725984 -80.104523 44.803429 -80.083402 44.859753 -80.038812 44.873834 # -b -79.928511 44.977095 -80.005956 45.070969 -80.071668 45.131986 -80.017691 45.171883 -80.071668 45.279837 -80.059934 45.373710 -80.170235 45.380751 -80.292270 45.420647 -80.381450 45.512174 -80.557463 45.613088 -80.623174 45.744510 -80.656030 45.852465 -80.710007 45.875933 -80.832042 45.922870 -81.031523 45.946338 -81.186414 45.976847 -81.362427 45.990928 -81.482116 45.983888 -81.583030 45.960419 -81.615885 46.021437 -81.615885 46.082455 -81.660475 46.082455 -81.681597 46.068374 -81.845875 46.061333 -82.099333 46.082455 -82.287080 46.112963 -82.420850 46.129391 -82.519417 46.159900 -82.585128 46.143472 -82.707164 46.159900 -82.793997 46.213877 -82.904298 46.197450 -83.014599 46.183369 -83.059189 46.159900 -83.082657 46.152860 -83.192958 46.166941 -83.378358 46.220918 -83.566105 46.281936 -83.655285 46.298363 -83.798442 46.335913 -83.941599 46.328872 -84.030779 46.319485 -84.105877 46.298363 -84.129346 46.288976 -84.141080 46.389890 -84.195057 46.441520 -84.227913 46.481417 -84.239647 46.509579 -84.251381 46.533047 -84.293624 46.570596 -84.349948 46.601105 -84.371070 46.587024 -84.382804 46.556515 -84.394538 46.549475 -84.382804 46.549475 -84.394538 46.533047 -84.382804 46.488457 -84.338214 46.441520 -84.326480 46.380503 -84.284237 46.319485 -84.284237 46.265508 -84.272503 46.213877 -84.272503 46.173981 -84.227913 46.152860 -84.162201 46.129391 -84.129346 46.091842 -84.096490 46.061333 -84.007310 46.021437 -83.986189 45.983888 -83.995576 45.976847 -84.117612 45.976847 -84.150467 45.967460 -84.162201 45.967460 -84.260768 45.953379 -84.382804 45.936951 -84.448515 45.913482 -84.525961 45.983888 -84.615141 46.021437 -84.657384 45.967460 -84.680852 45.875933 -84.824009 45.875933 -84.901454 45.946338 -84.955432 45.967460 -84.967166 45.967460 -85.143178 46.037865 -85.363781 46.075414 -85.584383 46.044905 -85.706419 45.936951 -85.992733 45.913482 -86.246191 45.859505 -86.356492 45.791447 -86.443325 45.714001 -86.565361 45.622475 -86.663928 45.613088 -86.663928 45.744510 -86.654540 45.859505 -86.785963 45.784407 -86.929120 45.737470 -86.985444 45.744510 -87.170844 45.599007 -87.316348 45.413607 -87.492360 45.225860 -87.590928 45.085050 -87.701229 44.953627 -87.823264 44.873834 -87.865507 44.812817 -87.921831 44.725984 -87.999277 44.608642 -87.999277 44.545278 -87.910097 44.615683 -87.778674 44.695475 -87.579193 44.819857 -87.447771 44.836285 -87.403181 44.946586 -87.391447 45.054541 -87.281145 45.155455 -87.137988 45.256369 -87.095745 45.141374 -87.161457 45.031072 -87.238902 44.890262 -87.316348 44.789348 -87.403181 44.695475 -87.501748 44.528850 -87.546338 44.355184 -87.546338 44.237842 -87.602662 44.111113 -87.656639 43.991424 -87.701229 43.848268 -87.712963 43.672255 -87.799796 43.529098 -87.865507 43.400022 -87.921831 43.224009 -87.910097 42.998713 -87.888976 42.883718 -87.844386 42.761683 -87.832652 42.649035 -87.856120 42.494144 -87.844386 42.348640 -87.844386 42.282929 -87.778674 42.135078 -87.689495 41.980187 -87.623783 41.806521 -87.558072 41.731422 -87.480626 41.698567 -87.358591 41.665711 -87.206047 41.658670 -87.051155 41.740810 -86.851674 41.829989 -86.785963 41.855805 -86.708518 41.898048 -86.675662 42.013042 -86.577095 42.151506 -86.478528 42.289969 -86.368226 42.503531 -86.323637 42.576283 -86.300168 42.641994 -86.279047 42.860250 -86.267313 43.101974 -86.323637 43.224009 -86.433938 43.353085 -86.511383 43.529098 -86.553626 43.632359 -86.565361 43.665214 -86.511383 43.791944 -86.466793 43.951528 -86.422204 44.197946 -86.323637 44.254270 -86.344758 44.301207 -86.323637 44.465485 -86.290781 44.552318 -86.290781 44.561705 -86.290781 44.585174 -86.290781 44.632110 -86.290781 44.686088 -86.189867 44.772921 -86.157011 44.890262 -86.046710 44.946586 -85.915287 45.000564 -85.816720 45.078009 -85.727540 45.117905 -85.682951 45.047500 -85.673563 44.970055 -85.661829 44.873834 -85.638361 44.836285 -85.572649 44.913731 -85.485816 44.937199 -85.452961 45.078009 -85.452961 45.218819 -85.441227 45.256369 -85.274601 45.279837 -85.032877 45.350242 -85.000022 45.390138 -85.089201 45.474624 -85.110323 45.545029 -85.110323 45.613088 -85.044611 45.667065 -85.011756 45.699920 -84.922576 45.714001 -84.800541 45.714001 -84.701973 45.690533 -84.591672 45.667065 -84.558817 45.643596 -84.436781 45.660024 -84.338214 45.629515 -84.239647 45.575538 -84.105877 45.498093 -84.019044 45.474624 -83.908743 45.413607 -83.885275 45.404219 -83.875888 45.404219 -83.786708 45.390138 -83.631817 45.336161 -83.512128 45.256369 -83.434683 45.164842 -83.390093 45.085050 -83.422948 45.078009 -83.479272 45.024032 -83.467538 44.923118 -83.411214 44.836285 -83.368971 44.695475 -83.336115 44.561705 -83.336115 44.427936 -83.378358 44.348143 -83.488660 44.261311 -83.566105 44.134581 -83.676407 44.064176 -83.819563 43.984384 -83.908743 43.855308 -83.953333 43.735619 -83.908743 43.681642 -83.786708 43.648787 -83.676407 43.681642 -83.544984 43.745007 -83.455804 43.888164 -83.422948 43.951528 -83.390093 43.974997 -83.291526 44.007852 -83.092045 44.064176 -82.939500 44.078257 -82.829199 43.967956 -82.718898 43.824799 -82.641452 43.672255 -82.629718 43.519711 -82.608597 43.383594 -82.573394 43.240437 -82.519417 43.127789 -82.463093 43.062078 # -b -84.525961 46.488457 -84.481371 46.495498 -84.481371 46.509579 -84.537695 46.526006 -84.558817 46.624574 -84.493105 46.723141 -84.547082 46.706713 -84.570551 46.774771 -84.460249 46.859257 -84.460249 46.873338 -84.701973 46.964865 -84.767685 47.129143 -84.680852 47.333318 -84.955432 47.556267 -85.011756 47.645447 -84.978900 47.861356 -84.922576 47.995125 -85.044611 47.971657 -85.176034 47.964616 -85.352047 47.943495 -85.506938 47.943495 -85.748662 47.936454 -85.959877 48.039715 -86.147624 48.311948 -86.234457 48.436330 -86.344758 48.633464 -86.433938 48.727338 -86.466793 48.727338 -86.499649 48.736725 -86.588829 48.727338 -86.818819 48.786009 -87.095745 48.786009 -87.095745 48.311948 -87.447771 48.851720 -87.832652 48.945593 -88.086110 48.997224 -88.175289 48.959674 -88.196411 48.924472 -88.196411 48.844680 -88.175289 48.685095 -88.208145 48.640505 -88.297325 48.605302 -88.363036 48.574793 -88.449869 48.464492 -88.517927 48.436330 -88.560170 48.523163 -88.473338 48.640505 -88.417013 48.750806 -88.440482 48.816518 -88.527315 48.713257 -88.604760 48.581834 -88.703327 48.422249 -88.747917 48.377659 -88.858218 48.347150 -88.902808 48.450411 -88.891074 48.581834 -89.001375 48.502042 -89.144532 48.384700 -89.254834 48.194606 -89.332279 48.157057 -89.365135 48.098386 -89.409725 48.084305 -89.520026 48.060837 -89.609206 48.016247 -89.618593 48.016247 -89.630327 48.016247 -89.752363 47.981044 -89.928375 47.875437 # -b -90.071532 46.662123 -89.862664 46.774771 -89.642061 46.828748 -89.365135 46.866298 -89.168001 46.971905 -88.968520 47.047004 -88.747917 47.220670 -88.473338 47.347399 -88.264469 47.422497 -88.064988 47.467087 -87.865507 47.474128 -87.823264 47.467087 -87.823264 47.445966 -87.832652 47.408416 -87.999277 47.326277 -88.130700 47.227710 -88.297325 47.084553 -88.417013 47.039963 -88.506193 46.957824 -88.527315 46.805280 -88.517927 46.753649 -88.374770 46.852217 -88.285591 46.835789 -88.187024 46.842829 -87.999277 46.873338 -87.865507 46.828748 -87.778674 46.798239 -87.668373 46.746609 -87.558072 46.624574 -87.426649 46.526006 -87.349203 46.481417 -87.182578 46.502538 -87.006566 46.481417 -86.851674 46.457948 -86.764842 46.448561 -86.741373 46.441520 -86.642806 46.464989 -86.520771 46.563556 -86.356492 46.601105 -86.180480 46.678551 -85.969264 46.669163 -85.760396 46.662123 -85.617239 46.669163 -85.462348 46.692632 -85.286335 46.760690 -85.131444 46.753649 -85.089201 46.685591 -85.089201 46.549475 -84.967166 46.502538 -84.922576 46.488457 -84.791153 46.464989 -84.680852 46.481417 -84.615141 46.481417 -84.579938 46.481417 -84.525961 46.488457 # -b -89.928375 47.875437 -90.170099 47.727586 -90.524471 47.638406 -90.843641 47.474128 -91.075978 47.347399 -91.296580 47.220670 -91.472593 47.100981 -91.726051 46.950784 -91.979509 46.798239 -92.110932 46.699672 -92.033486 46.617533 -91.878595 46.601105 -91.648605 46.638655 -91.428003 46.737222 -91.251990 46.814667 -91.097099 46.873338 -90.975064 46.927315 -90.864763 46.852217 -90.855375 46.737222 -90.909352 46.594065 -90.888231 46.563556 -90.810785 46.617533 -90.655894 46.594065 -90.479882 46.579984 -90.214689 46.601105 -90.071532 46.662123 # -b -113.082251 41.745503 -113.061129 41.736116 -113.061129 41.745503 -112.971949 41.710301 -112.906238 41.670405 -112.896851 41.761931 -112.840527 41.745503 -112.784203 41.686832 -112.697370 41.693873 -112.641046 41.670405 -112.664514 41.562450 -112.718491 41.463883 -112.697370 41.414600 -112.598803 41.421640 -112.476767 41.330113 -112.387587 41.346541 -112.375853 41.454496 -112.375853 41.522554 -112.342998 41.529594 -112.310142 41.571837 -112.244431 41.562450 -112.178719 41.571837 -112.122395 41.555410 -112.101274 41.503779 -112.012094 41.487351 -111.979238 41.431027 -112.002707 41.395825 -112.077805 41.372356 -112.166985 41.323073 -112.155251 41.198691 -112.077805 41.097777 -111.946382 41.064921 -111.868937 40.980435 -111.913527 40.964007 -111.958117 40.872481 -111.946382 40.804422 -112.012094 40.764526 -112.089539 40.712896 -112.199841 40.696468 -112.289020 40.780954 -112.342998 40.830238 -112.342998 40.881868 -112.387587 40.905336 -112.443912 40.846665 -112.554213 40.980435 -112.631658 41.006250 -112.763081 41.140020 -112.795937 41.198691 -112.784203 41.323073 -112.861648 41.355929 -112.939094 41.454496 -112.995418 41.529594 -113.049395 41.588265 -113.072863 41.661017 -113.082251 41.719688 -113.082251 41.745503 # -b -125.304568 50.041565 -125.173145 49.957079 -125.039376 49.856165 -124.907953 49.757598 -124.884485 49.720049 -124.907953 49.663725 -124.875097 49.593320 -124.807039 49.541690 -124.729593 49.513528 -124.586436 49.433735 -124.422158 49.384452 -124.255533 49.377411 -124.166353 49.318740 -124.046664 49.290578 -123.945750 49.231907 -123.858918 49.175583 -123.781472 49.116912 -123.736882 49.053548 -123.725148 49.015999 -123.647702 48.929166 -123.593725 48.849373 -123.581991 48.783662 -123.528014 48.668667 -123.471690 48.609996 -123.450568 48.631118 -123.427100 48.682748 -123.361389 48.600609 -123.316799 48.520816 -123.361389 48.506735 -123.394244 48.426943 -123.516280 48.358885 -123.647702 48.368272 -123.715761 48.382353 -123.847183 48.410515 -123.969219 48.448064 -124.100642 48.499695 -124.255533 48.551325 -124.288388 48.565406 -124.288388 48.593568 -124.377568 48.617037 -124.487869 48.579487 -124.654495 48.638158 -124.753062 48.659280 -124.753062 48.717950 -124.687350 48.776621 -124.654495 48.842333 -124.708472 48.828252 -124.753062 48.755500 -124.863363 48.732031 -125.027641 48.821211 -125.062844 48.870495 -125.072231 48.936206 -124.973664 48.950287 -124.875097 49.023039 -124.973664 49.030080 -125.095700 49.074669 -125.194267 49.001917 -125.316302 49.023039 -125.536905 48.987836 -125.724652 49.088750 -125.647206 49.081710 -125.471193 49.102831 -125.536905 49.189664 -125.626084 49.231907 -125.724652 49.304659 -125.802097 49.311700 -125.924133 49.318740 -125.966376 49.384452 -126.154122 49.440776 -126.222181 49.433735 -126.353603 49.433735 -126.442783 49.447816 -126.508494 49.562811 -126.520229 49.586279 -126.431049 49.628522 -126.198712 49.621482 -125.989844 49.677806 -126.177591 49.734130 -126.341869 49.705968 -126.386459 49.743517 -126.419315 49.806882 -126.529616 49.750558 -126.607062 49.863206 -126.717363 49.919530 -126.783074 49.942998 -126.839398 49.919530 -126.893375 49.971160 -127.027145 49.898409 -127.158568 49.971160 # -b -122.786414 49.044161 -122.831004 49.060588 -122.863860 49.074669 -122.908449 49.088750 -122.997629 49.074669 -123.018751 49.102831 -122.997629 49.147421 -122.920184 49.161502 -122.798148 49.196705 -122.687847 49.203745 -122.577546 49.189664 -122.601014 49.248335 -122.654991 49.248335 -122.676113 49.283538 -122.711315 49.297619 -122.765292 49.276497 -122.831004 49.262416 -122.941305 49.248335 -123.042219 49.248335 -123.152520 49.269457 -123.173642 49.304659 -123.161908 49.318740 -123.173642 49.332821 -123.206497 49.377411 -123.206497 49.412614 -123.161908 49.433735 -123.161908 49.499447 -123.152520 49.562811 -123.152520 49.713009 -123.239353 49.734130 -123.251087 49.670766 -123.340267 49.607401 -123.405978 49.576892 -123.459956 49.520568 -123.516280 49.447816 -123.614847 49.464244 -123.659437 49.548730 -123.659437 49.593320 -123.626581 49.663725 -123.605459 49.713009 -123.682905 49.713009 -123.736882 49.713009 -123.736882 49.778720 -123.781472 49.778720 -123.793206 49.806882 -123.826062 49.842084 -123.814328 49.891368 -123.903507 49.957079 # -b -123.980953 50.027484 -123.936363 49.926571 -123.945750 49.870246 -124.023196 49.926571 -124.056052 49.964120 -124.067786 49.933611 -124.079520 49.919530 -124.124110 49.856165 -124.189821 49.820963 -124.279001 49.813922 -124.344712 49.820963 -124.410424 49.828003 -124.487869 49.863206 -124.577049 49.905449 -124.654495 49.964120 # -b -123.912895 39.980683 -123.969219 40.048741 -124.002075 40.098025 -124.091254 40.201286 -124.189821 40.292812 -124.267267 40.328015 -124.267267 40.410154 -124.246145 40.536883 -124.178087 40.611982 -124.091254 40.729324 -124.013809 40.830238 -124.023196 40.940539 -124.056052 40.931151 -124.023196 40.973395 -124.013809 41.048493 -124.013809 41.163488 -123.980953 41.339501 -123.980953 41.480311 -124.046664 41.637549 -124.112376 41.794787 -124.133497 41.966106 -124.189821 42.064673 -124.234411 42.156199 -124.311857 42.301703 -124.321244 42.458941 -124.344712 42.644341 -124.398690 42.799232 -124.398690 42.911880 -124.344712 43.057384 -124.300123 43.235744 -124.210943 43.381247 -124.100642 43.428184 -124.124110 43.533792 -124.166353 43.533792 -124.145231 43.597156 -124.100642 43.683989 -124.056052 43.820106 -124.034930 43.932754 -124.023196 44.052442 -124.013809 44.169784 -123.980953 44.312941 -123.980953 44.383346 -123.990340 44.446711 -123.990340 44.549971 -123.990340 44.690781 -123.990340 44.831591 -123.924629 44.988829 -123.912895 45.035766 -123.903507 45.167189 -123.903507 45.307999 -123.891773 45.432381 -123.835449 45.540336 -123.858918 45.594313 -123.858918 45.695227 -123.826062 45.779713 -123.880039 45.789100 -123.903507 45.850118 -123.891773 45.965113 -123.880039 46.033171 -123.868305 46.134085 -123.793206 46.188062 -123.638315 46.188062 -123.483424 46.202143 -123.340267 46.202143 -123.229966 46.157553 -123.173642 46.188062 -123.206497 46.232652 -123.295677 46.239693 -123.384857 46.286629 -123.450568 46.324179 -123.549135 46.317138 -123.682905 46.317138 -123.802594 46.310098 -123.880039 46.324179 -123.945750 46.361728 -123.990340 46.422746 -124.002075 46.568249 -124.002075 46.666817 -123.924629 46.622227 -123.912895 46.537741 -123.912895 46.469682 -123.858918 46.453255 -123.814328 46.476723 -123.802594 46.483763 -123.826062 46.544781 -123.835449 46.643348 -123.814328 46.727834 -123.835449 46.772424 -123.924629 46.765384 -124.002075 46.795892 -124.013809 46.878032 -123.936363 46.983639 -123.924629 47.037616 -123.990340 47.105675 -124.046664 47.075166 -124.091254 47.014148 -124.124110 47.089247 -124.156966 47.157305 -124.178087 47.262913 -124.210943 47.328624 -124.246145 47.420151 -124.267267 47.523411 -124.300123 47.612591 -124.356447 47.711158 -124.443280 47.828500 -124.544193 47.917680 -124.619292 47.999819 -124.663882 48.096039 -124.663882 48.227462 -124.619292 48.337763 -124.598171 48.382353 -124.544193 48.419902 -124.455014 48.396434 -124.344712 48.344804 -124.222677 48.323682 -124.145231 48.309601 -124.023196 48.272052 -123.903507 48.241543 -123.793206 48.213381 -123.647702 48.220421 -123.516280 48.199300 -123.361389 48.192259 -123.239353 48.192259 -123.206497 48.199300 -123.152520 48.199300 -123.009363 48.154710 -122.899062 48.117161 -122.765292 48.154710 -122.666725 48.138282 -122.633870 48.020940 -122.676113 47.917680 -122.798148 47.844928 -122.908449 47.701771 -123.009363 47.568001 -122.985895 47.403723 -122.854472 47.434232 -122.831004 47.509330 -122.908449 47.509330 -122.899062 47.523411 -122.798148 47.612591 -122.699581 47.657181 -122.577546 47.755748 -122.523568 47.859009 -122.434389 47.887171 -122.356943 47.880130 -122.324087 47.814419 -122.291232 47.790951 -122.279498 47.873090 -122.258376 47.924720 -122.258376 48.013900 -122.258376 48.058490 -122.246642 48.110120 -122.279498 48.182872 -122.291232 48.220421 -122.302966 48.227462 -122.335822 48.286133 -122.356943 48.316642 -122.368677 48.344804 -122.378065 48.375313 -122.413267 48.403475 -122.467244 48.410515 -122.488366 48.419902 -122.500100 48.433983 -122.556424 48.462145 -122.556424 48.485614 -122.488366 48.513776 -122.478979 48.520816 -122.455510 48.586528 -122.422654 48.579487 -122.422654 48.652239 -122.413267 48.717950 -122.345209 48.732031 -122.267763 48.696829 -122.267763 48.710910 -122.324087 48.755500 -122.413267 48.776621 -122.523568 48.790702 -122.601014 48.769581 -122.643257 48.821211 -122.699581 48.863454 -122.744171 48.929166 -122.765292 48.966715 -122.744171 49.001917 -122.753558 49.023039 -122.798148 49.030080 -122.798148 49.044161 # -b 154.832448 49.642603 154.799592 49.590973 154.722146 49.499447 154.644701 49.391492 154.611845 49.311700 154.743268 49.353943 154.799592 49.475978 154.832448 49.590973 154.832448 49.642603 # -b 154.224617 48.898657 154.236352 48.905697 154.191762 48.835292 154.126050 48.746112 154.137784 48.762540 154.248086 48.797743 154.280941 48.870495 154.224617 48.898657 # -b 152.293172 47.140877 152.281438 47.044657 152.182871 46.960171 152.072570 46.878032 151.917678 46.795892 151.828499 46.817014 151.938800 46.929662 152.093691 47.007108 152.203992 47.140877 152.293172 47.140877 # -b 150.570595 46.171634 150.537739 46.110617 150.382848 46.002662 150.227957 45.871239 150.051944 45.756245 # -b 149.843076 45.857158 150.084800 46.040212 150.293668 46.155206 150.460294 46.232652 150.549474 46.246733 150.570595 46.171634 # -b 140.702153 50.032178 140.556650 49.905449 140.580118 49.792801 140.589505 49.649644 140.612974 49.506487 140.589505 49.391492 140.502672 49.253029 140.446348 49.159155 140.413493 49.051201 140.392371 49.023039 140.425227 48.898657 140.359515 48.753153 140.326660 48.593568 140.303191 48.462145 140.148300 48.351844 140.016877 48.300214 # -b 144.067515 50.011057 144.168429 49.806882 144.222406 49.590973 144.323320 49.353943 144.421887 49.175583 144.565044 49.008958 144.764525 48.856414 144.797381 48.732031 144.708201 48.818864 144.553310 48.964368 144.398419 49.109872 144.156695 49.224867 143.870381 49.318740 143.593454 49.346902 143.372852 49.325781 143.140515 49.203745 143.051335 48.987836 143.009092 48.797743 142.875323 48.586528 142.776756 48.337763 142.699310 48.103080 142.654720 47.880130 142.666454 47.650140 142.809611 47.448313 142.952768 47.335665 143.107659 47.194854 143.140515 47.028229 143.206226 46.915581 143.307140 46.840482 143.462031 46.772424 143.516009 46.802933 143.572333 46.755996 143.626310 46.582330 143.670900 46.415705 143.649778 46.225612 143.548864 46.070720 143.494887 46.270201 143.417442 46.537741 143.173371 46.605799 142.943381 46.687938 142.699310 46.697325 142.523297 46.558862 142.434118 46.361728 142.356672 46.148166 142.258105 45.955725 142.025768 46.049599 141.969444 46.354687 141.960057 46.657429 142.025768 46.983639 142.070358 47.194854 142.091480 47.441272 142.124335 47.671262 142.157191 47.894211 142.279227 48.035021 142.258105 48.220421 142.124335 48.431637 142.004647 48.710910 142.004647 48.950287 142.091480 49.130993 142.157191 49.360983 142.201781 49.590973 142.213515 49.776373 142.213515 49.954733 142.246371 49.975854 142.267492 49.975854 # -b 150.051944 45.756245 149.798486 45.624822 149.643595 45.587272 149.688185 45.739817 149.843076 45.857158 # -b 148.958319 45.392485 148.970053 45.439422 148.958319 45.369017 148.871486 45.345548 148.693127 45.268103 148.495993 45.174229 148.317633 45.082703 148.141621 44.995870 148.031319 44.948933 147.909284 44.948933 147.789595 44.885569 147.679294 44.754146 147.566646 44.697822 147.435223 44.620376 147.313188 44.524156 147.214621 44.446711 147.071464 44.446711 147.125441 44.540584 147.235742 44.650885 147.280332 44.768227 147.381246 44.801083 147.590114 45.002910 147.733271 45.113212 147.864694 45.160148 147.953874 45.291571 148.097031 45.338508 148.153355 45.298612 148.197945 45.230553 148.329367 45.261062 148.528848 45.369017 148.693127 45.500439 148.859752 45.523908 148.948932 45.486358 148.958319 45.392485 # -b 146.937694 43.843574 147.015140 43.820106 146.928307 43.756741 146.761682 43.691030 146.663115 43.730926 146.761682 43.796637 146.937694 43.843574 # -b 146.210175 44.446711 146.231297 44.486607 146.287621 44.446711 146.365066 44.399774 146.419044 44.303554 146.320477 44.249576 146.120996 44.097032 145.912127 43.939794 145.724380 43.796637 145.614079 43.667561 145.536634 43.796637 145.703259 43.946835 145.900393 44.113460 146.067018 44.280085 146.144464 44.430283 146.210175 44.446711 # -b 145.083695 44.066523 145.149406 44.113460 145.370008 44.256617 145.447454 44.209680 145.348887 44.003159 145.182262 43.780209 145.250320 43.620625 145.426332 43.540832 145.426332 43.339004 145.646935 43.331964 145.912127 43.404716 145.813560 43.249825 145.492044 43.146564 145.226851 43.001060 145.050839 42.977592 144.952272 43.017488 144.841970 42.904840 144.508720 42.935349 144.234140 42.911880 143.957214 42.799232 143.692021 42.538734 143.516009 42.285275 143.450297 42.048245 143.328262 41.923863 143.051335 42.081101 142.842467 42.196096 142.478708 42.294663 142.180659 42.440166 141.960057 42.529346 141.650275 42.555161 141.417938 42.473022 141.253660 42.367415 141.054179 42.383842 140.845310 42.505878 140.556650 42.489450 140.404105 42.311091 140.502672 42.153853 140.702153 42.097529 140.922756 42.015389 141.110503 41.900394 141.241925 41.808868 141.176214 41.710301 140.955612 41.726729 140.788986 41.719688 140.624708 41.635202 140.523794 41.520207 140.270336 41.388784 140.138913 41.421640 140.082589 41.562450 140.160034 41.801827 140.216358 41.982534 140.028612 42.120997 # -b 139.927698 42.522306 140.094323 42.660769 140.326660 42.749949 140.514407 42.904840 140.568384 43.057384 140.469817 43.162992 140.514407 43.282680 140.744396 43.242784 140.964999 43.179420 141.152746 43.179420 141.363961 43.186460 141.495384 43.378901 141.462528 43.557260 141.462528 43.716845 141.596297 43.810718 141.727720 44.043055 141.739454 44.303554 141.805166 44.547624 141.870877 44.721290 141.805166 44.862100 141.727720 45.035766 141.683130 45.160148 141.694865 45.284531 141.793432 45.354936 141.903733 45.432381 141.992913 45.462890 142.124335 45.376057 142.136070 45.361976 142.180659 45.284531 142.347285 45.190657 142.490442 45.042807 142.610130 44.918424 142.765021 44.768227 142.931647 44.643845 143.140515 44.493647 143.339996 44.383346 143.516009 44.280085 143.736611 44.193252 143.936092 44.129888 144.144960 44.082951 144.332707 44.059483 144.443009 43.970303 144.654224 43.906938 144.863092 43.939794 145.083695 44.066523 # -b 141.241925 45.230553 141.131624 45.167189 141.241925 45.096784 141.340492 45.089743 141.363961 45.230553 141.241925 45.230553 # -b 141.209070 41.372356 141.230191 41.379397 141.363961 41.372356 141.485996 41.379397 141.528239 41.280830 141.518852 41.137673 141.495384 40.947579 141.518852 40.722283 141.605685 40.501681 141.793432 40.325668 141.903733 40.130881 141.960057 40.022926 # -b 139.906576 39.980683 140.082589 40.182511 140.070855 40.435969 140.061467 40.611982 140.148300 40.729324 140.282070 40.787995 140.314926 40.787995 140.336047 40.863093 140.347781 41.022678 140.413493 41.130632 140.547262 41.179916 140.657563 41.071962 140.744396 40.879521 140.821842 40.797382 140.943877 40.931151 141.075300 40.888908 141.197336 40.895949 141.319371 41.088389 141.331105 41.245627 141.185601 41.156448 140.943877 41.104817 140.878166 41.264402 140.943877 41.428681 141.042444 41.454496 141.209070 41.372356 # -b 132.729954 44.838632 132.786278 44.909037 132.828521 45.113212 132.741689 45.244634 132.521086 45.284531 132.178448 45.237594 132.089268 45.120252 132.199570 44.941893 132.199570 44.777614 132.300484 44.667313 132.476496 44.596908 132.697099 44.681394 132.729954 44.838632 # -b 140.016877 48.300214 139.972288 48.227462 139.784541 48.072571 139.620262 47.962270 139.420781 47.814419 139.265890 47.619632 139.122733 47.441272 138.934986 47.291075 138.747240 47.140877 138.592349 46.960171 138.538371 46.817014 138.460926 46.643348 138.404602 46.521313 138.261445 46.324179 138.139409 46.162247 138.261445 46.392237 138.172265 46.256120 138.085432 46.110617 137.885951 45.979194 137.787384 45.817262 137.587903 45.655331 137.379035 45.509827 137.212409 45.361976 137.012928 45.230553 136.869772 45.113212 136.804060 45.035766 136.682025 44.901997 136.538868 44.808123 136.395711 44.643845 136.297144 44.500688 136.097663 44.413855 135.921650 44.289473 135.776146 44.146316 135.755025 44.033668 135.632989 43.899898 135.513301 43.763781 135.346676 43.597156 135.093217 43.404716 134.872615 43.282680 134.628544 43.162992 134.330496 43.008101 134.065304 42.846169 133.877557 42.782804 133.746134 42.782804 133.546653 42.740561 133.326051 42.677197 133.105448 42.700665 132.995147 42.749949 132.929435 42.740561 132.762810 42.829741 132.563329 42.855556 132.410785 42.846169 132.377929 42.895452 132.366195 43.033916 132.399051 43.137177 132.399051 43.242784 132.288749 43.209928 132.068147 43.090240 132.002435 43.146564 132.089268 43.282680 131.934377 43.299108 131.913256 43.418797 131.847544 43.292068 131.781833 43.106668 131.648063 42.984632 131.558884 42.928308 131.504906 42.822701 131.382871 42.740561 131.284304 42.611485 131.073089 42.611485 130.908810 42.620873 130.753919 42.595058 130.810243 42.529346 130.843099 42.423739 130.622496 42.562202 # -b 140.028612 42.120997 139.883108 42.212523 139.894842 42.334559 139.927698 42.522306 # -b 130.699942 42.374455 130.732798 42.278235 130.610762 42.301703 130.476993 42.268848 130.324448 42.130384 130.103846 41.956718 # -b 130.103846 41.956718 129.981810 41.851111 129.904365 41.736116 129.749474 41.562450 129.704884 41.412253 129.770595 41.287870 129.761208 41.071962 129.749474 40.888908 129.639173 40.813810 129.373980 40.712896 129.230823 40.579126 129.064198 40.452397 128.834208 40.335055 128.712173 40.257610 128.655849 40.173124 128.435246 40.055782 128.170054 40.029967 128.005775 40.022926 # -b 120.012455 39.980683 120.265913 40.072210 120.474781 40.140268 120.552227 40.215367 120.662528 40.384339 120.772829 40.478212 120.883131 40.595554 121.038022 40.703508 121.183526 40.830238 121.347804 40.879521 121.547285 40.879521 121.779622 40.895949 121.866455 40.987476 121.965022 40.895949 122.033080 40.729324 122.152768 40.602595 122.187971 40.579126 122.241948 40.536883 122.286538 40.426582 122.152768 40.241182 121.955634 40.046395 # -b 74.903937 46.833442 74.979036 46.809973 75.178517 46.748956 75.443709 46.786505 75.730023 46.817014 76.072661 46.779465 76.415299 46.704366 76.725081 46.687938 77.023129 46.612839 77.255466 46.598758 77.541779 46.657429 77.851562 46.673857 78.072164 46.589371 78.203587 46.521313 78.391334 46.650389 78.579081 46.772424 78.787949 46.809973 78.987430 46.809973 79.085997 46.748956 79.097731 46.558862 78.888863 46.399277 78.701116 46.392237 78.522757 46.453255 78.325622 46.385196 77.950129 46.347647 77.640347 46.439174 77.386888 46.490804 77.044250 46.460295 76.713347 46.490804 76.403564 46.507232 76.117251 46.544781 75.875527 46.544781 75.586866 46.507232 75.399119 46.544781 75.366263 46.619880 75.288818 46.657429 75.255962 46.507232 75.178517 46.446214 74.979036 46.429786 74.803023 46.324179 74.648132 46.148166 74.450998 46.056639 74.239782 46.002662 74.174071 45.817262 74.129481 45.641250 74.052036 45.493399 74.063770 45.230553 74.141215 45.002910 74.328962 44.815164 74.096626 44.838632 73.920613 45.082703 73.709398 45.338508 73.488795 45.462890 73.401962 45.678799 73.434818 45.918176 73.545119 46.124698 73.765722 46.162247 73.899491 46.324179 74.084891 46.460295 74.340696 46.598758 74.549565 46.734875 74.716190 46.817014 74.903937 46.833442 # -b 59.973372 43.597156 60.170506 43.653480 60.423964 43.693376 60.489675 43.813065 60.611711 43.885817 60.710278 44.115807 60.853435 44.195599 60.998939 44.336409 61.041182 44.486607 61.174951 44.683741 61.482387 44.747105 61.637278 44.817510 61.735845 45.028726 61.649012 45.122599 61.559832 45.317386 61.461265 45.472277 61.350964 45.563804 61.163217 45.648290 61.052916 45.833690 61.008326 46.127044 61.085772 46.195103 61.261784 46.432133 61.449531 46.575290 61.604422 46.734875 61.616156 46.809973 61.461265 46.788852 61.240663 46.690285 61.064650 46.568249 60.888637 46.500191 60.778336 46.741915 60.656301 46.727834 60.578855 46.612839 60.567121 46.561209 60.456820 46.523660 60.379374 46.605799 60.280807 46.673857 60.149384 46.462642 60.161119 46.354687 60.269073 46.310098 60.468554 46.286629 60.632832 46.303057 60.799458 46.310098 60.820579 46.195103 60.545999 46.117657 60.480288 46.178675 60.304275 46.256120 60.193974 46.202143 # -b 53.885681 39.863341 53.775380 40.032314 53.402233 40.126187 53.092451 40.083944 # -b 52.850727 39.957215 52.785016 40.184858 52.728692 40.379645 52.761547 40.588514 52.895317 40.741058 52.904704 40.799729 52.895317 40.940539 52.883583 41.048493 52.871849 41.123592 52.904704 41.064921 52.970416 40.914724 53.059595 40.806769 53.280198 40.799729 53.444476 40.806769 53.622836 40.764526 53.808236 40.715243 53.995983 40.731670 54.282297 40.673000 54.448922 40.741058 54.272909 40.764526 54.249441 40.839625 54.526367 40.891255 54.756357 41.140020 54.350355 41.372356 54.052307 41.621121 53.942005 41.860498 53.754259 42.050592 53.721403 42.074060 53.500800 42.099875 53.169897 42.024777 52.895317 41.902741 52.728692 41.745503 52.728692 41.621121 52.817871 41.588265 52.817871 41.372356 52.827259 41.231546 52.785016 41.264402 52.540945 41.614081 52.463499 41.909782 52.463499 42.090488 52.454112 42.393230 52.618390 42.541080 52.651246 42.808620 52.442378 42.871984 52.221775 42.888412 51.858016 43.010447 51.682003 43.188807 51.538846 43.179420 51.318244 43.205235 51.285388 43.444612 51.261920 43.716845 51.053051 43.979690 50.909894 44.059483 50.766738 44.258964 50.358388 44.376305 50.149520 44.589867 50.280943 44.676700 50.611846 44.683741 50.931016 44.620376 51.107029 44.557012 51.252532 44.596908 51.505991 44.573440 51.416811 44.676700 51.351099 44.817510 51.306510 45.052194 51.405077 45.200045 51.581089 45.270450 51.581089 45.176576 51.780570 45.160148 51.989439 45.207085 52.034028 45.331467 52.210041 45.439422 52.529211 45.448809 52.817871 45.331467 53.104185 45.254022 53.390499 45.293918 53.554778 45.361976 53.578246 45.385445 53.643957 45.371364 53.730790 45.317386 54.061694 45.237594 54.282297 45.160148 54.470043 45.183617 54.702380 45.153108 54.756357 45.254022 54.624934 45.401872 54.812681 45.401872 54.681259 45.573191 54.470043 45.742163 54.294031 45.826650 54.207198 45.965113 54.007717 45.972153 53.798848 46.188062 53.697935 46.483763 53.566512 46.629267 53.512535 46.554168 53.378765 46.758343 53.280198 46.758343 53.247342 46.908541 52.993884 47.058738 52.895317 47.112715 52.684102 47.126796 52.684102 47.201895 52.442378 47.218323 52.242897 47.157305 52.066884 47.143224 51.869750 47.075166 51.813426 47.201895 51.682003 47.208935 51.548234 47.201895 51.461401 47.232404 51.217330 47.269953 50.963872 47.276994 50.644702 47.082206 50.337267 46.870991 # -b 49.950039 40.698815 50.083808 40.621369 50.194110 40.588514 50.280943 40.471172 50.337267 40.344443 50.137786 40.471172 # -b 59.973372 43.597156 59.973372 43.597156 # -b 60.193974 46.202143 59.982759 46.157553 59.917048 46.310098 59.830215 46.385196 59.684711 46.324179 59.651855 46.178675 59.642468 46.042558 59.541554 45.904095 59.344420 45.857158 59.344420 45.981541 59.365541 46.033171 59.123817 45.981541 58.837504 45.887667 58.715468 45.648290 58.527721 45.317386 58.220286 45.035766 58.196818 44.801083 58.241407 44.683741 58.220286 44.503035 58.285997 44.359878 58.351709 44.099379 58.372830 43.909285 58.408033 43.749700 58.539455 43.700417 58.638023 43.766128 58.703734 43.766128 58.858625 43.796637 58.990048 43.749700 59.144939 43.700417 59.266974 43.796637 59.421865 43.806025 59.619000 43.740313 59.696445 43.669908 59.785625 43.606544 59.895926 43.597156 59.973372 43.597156 # -b 41.506126 41.646936 41.592959 41.679792 41.703260 41.771318 41.736116 41.959065 41.714994 42.116303 41.571837 42.245379 41.538982 42.393230 41.506126 42.548121 41.438068 42.726480 41.318379 42.864944 41.130632 42.961164 41.020331 43.050344 40.910030 43.116055 40.799729 43.139523 40.644838 43.172379 40.480559 43.195847 40.292812 43.268599 40.149655 43.397675 # -b 39.994764 41.025025 40.379645 41.041453 40.799729 41.257362 41.118898 41.423987 41.449802 41.571837 41.506126 41.646936 # -b 50.337267 46.870991 49.973507 46.847523 49.508834 46.751303 49.034773 46.697325 48.617037 46.622227 48.760193 46.554168 49.034773 46.432133 48.715604 46.347647 48.605302 46.303057 48.462145 46.063680 48.372966 45.934604 48.295520 45.934604 48.196953 45.904095 48.053796 45.911136 47.966963 46.087148 47.866049 46.232652 47.877783 46.324179 47.690037 46.333566 47.469434 46.378156 47.645447 46.178675 47.624325 46.026131 47.546880 45.772672 47.403723 45.803181 47.347399 45.603700 47.293422 45.347895 47.117409 45.237594 47.084553 45.113212 47.051697 45.082703 46.995373 45.082703 46.852217 44.948933 46.831095 44.801083 46.676204 44.620376 46.753649 44.432629 46.950784 44.439670 47.171386 44.209680 47.347399 43.989078 47.391989 43.756741 47.448313 43.676949 47.612591 43.956222 47.657181 43.782556 47.525758 43.428184 47.525758 43.139523 47.591470 42.961164 47.755748 42.799232 47.898905 42.604445 48.086652 42.376802 48.241543 42.139772 48.318988 42.001308 48.527857 41.909782 48.736725 41.719688 48.957328 41.506126 49.100485 41.280830 49.267110 41.041453 49.431388 40.832584 49.574545 40.689427 49.720049 40.630757 49.950039 40.698815 # -b 50.137786 40.471172 49.872593 40.464131 49.684847 40.360871 49.541690 40.217714 49.508834 40.067516 # -b 40.149655 43.397675 39.994764 43.477468 39.863341 43.580728 39.675595 43.700417 39.532438 43.733273 39.410402 43.836533 39.276633 43.996118 39.058377 44.115807 38.814306 44.266004 38.527992 44.369265 38.274534 44.446711 38.032810 44.519462 37.910775 44.603948 37.767618 44.683741 37.669051 44.770574 37.591605 44.714250 37.403858 44.730678 37.227846 44.871488 37.126932 45.052194 36.906329 45.176576 36.676339 45.254022 36.852352 45.307999 36.852352 45.385445 36.918063 45.448809 37.194990 45.425341 37.436714 45.432381 37.612727 45.664718 37.788739 45.826650 37.999954 46.056639 38.110256 46.042558 38.229944 46.178675 38.474015 46.127044 38.527992 46.148166 38.340246 46.272548 38.175967 46.432133 38.075053 46.462642 37.943630 46.493151 37.779352 46.591718 37.821595 46.720794 38.009342 46.734875 38.286268 46.765384 38.474015 46.727834 38.560848 46.758343 38.483402 46.826401 38.474015 46.887419 38.682883 46.939049 38.980931 47.058738 39.189800 47.112715 39.365812 47.119756 39.398668 47.171386 39.344691 47.208935 39.255511 47.208935 39.210921 47.225363 39.201534 47.232404 39.189800 47.300462 39.079499 47.328624 38.924607 47.307503 38.826040 47.291075 38.694618 47.232404 38.584316 47.232404 38.527992 47.246485 38.429425 47.232404 38.197089 47.180773 38.032810 47.171386 37.845063 47.150265 37.600992 47.105675 37.424980 46.983639 37.293557 46.993027 37.138666 46.939049 36.950919 46.894460 36.896942 46.751303 36.774906 46.802933 36.676339 46.840482 36.500327 46.779465 36.390026 46.741915 36.267990 46.697325 36.211666 46.643348 36.190545 46.704366 35.991064 46.659776 35.847907 46.652736 35.728218 46.584677 35.561593 46.469682 35.495881 46.462642 35.397314 46.324179 35.254157 46.188062 35.120388 46.141125 35.164978 46.209184 35.287013 46.256120 35.364459 46.317138 35.331603 46.415705 35.287013 46.500191 35.197833 46.500191 35.176712 46.432133 35.111000 46.317138 35.010086 46.256120 34.934988 46.188062 34.977231 46.002662 34.977231 45.894708 34.977231 45.887667 34.956109 45.887667 34.890398 45.887667 34.890398 45.934604 34.845808 45.995622 34.789484 46.080108 34.812952 46.127044 34.768362 46.178675 34.646327 46.117657 34.568881 46.033171 34.536026 46.056639 34.580616 46.134085 34.536026 46.178675 34.404603 46.171634 34.294302 46.178675 34.273180 46.209184 34.261446 46.317138 34.195735 46.378156 34.162879 46.202143 34.118289 46.188062 34.029109 46.195103 33.942276 46.225612 33.841363 46.256120 33.787385 46.256120 33.874218 46.209184 33.963398 46.134085 34.040844 46.148166 34.094821 46.127044 34.139411 46.056639 34.151145 45.981541 34.216856 45.927563 34.261446 45.958072 34.273180 46.042558 34.360013 46.019090 34.449193 46.019090 34.536026 45.972153 34.636940 45.972153 34.613471 45.934604 34.547760 45.819609 34.592350 45.796141 34.714385 45.833690 34.756628 45.810222 34.747241 45.772672 34.723773 45.702267 34.857542 45.718695 34.956109 45.718695 35.066410 45.617781 35.078145 45.462890 35.120388 45.347895 35.176712 45.401872 35.418436 45.347895 35.507615 45.340855 35.528737 45.418300 35.728218 45.307999 35.937086 45.479318 36.014532 45.486358 36.059122 45.418300 36.202279 45.472277 36.444003 45.509827 36.652871 45.495746 36.620015 45.385445 36.542570 45.340855 36.521448 45.237594 36.533182 45.153108 36.521448 45.099131 36.467471 45.089743 36.321967 45.089743 36.190545 45.089743 36.157689 45.075662 36.124833 45.042807 35.937086 45.075662 35.793929 45.122599 35.552205 45.169536 35.385580 45.052194 35.221302 44.948933 35.066410 44.824551 34.845808 44.855060 34.679183 44.824551 34.580616 44.801083 34.679183 44.761186 34.559494 44.747105 34.470314 44.653232 34.449193 44.589867 34.392869 44.549971 34.273180 44.533543 34.162879 44.486607 34.061965 44.439670 33.930542 44.446711 33.766264 44.456098 33.709940 44.470179 33.644228 44.510075 33.501071 44.596908 33.555049 44.660273 33.578517 44.690781 33.578517 44.761186 33.578517 44.824551 33.611373 44.927812 33.587904 45.052194 33.501071 45.193004 33.379036 45.223513 33.247613 45.207085 33.113844 45.307999 32.904975 45.401872 32.794674 45.394832 32.618661 45.401872 32.606927 45.401872 32.597540 45.432381 32.663251 45.519214 32.839264 45.580232 32.893241 45.634209 33.071601 45.749204 33.235879 45.833690 33.325059 45.857158 33.566783 45.894708 33.742795 45.934604 33.820241 45.972153 33.742795 46.002662 33.731061 46.103576 33.611373 46.178675 33.512806 46.096536 33.402504 46.134085 33.334446 46.164594 33.325059 46.218571 33.235879 46.195103 33.158434 46.188062 33.137312 46.148166 33.015277 46.148166 32.850998 46.127044 32.684373 46.103576 32.606927 46.080108 32.430915 46.117657 32.308879 46.157553 32.266636 46.202143 32.198578 46.239693 32.088277 46.263161 32.013178 46.256120 31.879408 46.249080 31.858287 46.303057 32.046034 46.392237 32.100011 46.422746 32.067155 46.462642 31.956854 46.469682 31.780841 46.483763 31.682274 46.514272 31.825431 46.561209 32.088277 46.537741 32.276024 46.514272 32.276024 46.575290 32.165722 46.591718 32.046034 46.704366 31.956854 46.826401 31.912264 46.734875 31.769107 46.690285 31.604829 46.652736 31.614216 46.690285 31.637684 46.779465 31.527383 46.720794 31.318515 46.643348 31.173011 46.629267 31.020467 46.605799 30.898431 46.561209 30.767009 46.537741 30.755274 46.493151 30.743540 46.432133 30.623852 46.293670 30.534672 46.209184 30.468960 46.225612 30.403249 46.324179 30.325804 46.347647 30.248358 46.347647 30.182647 46.401624 30.227236 46.317138 30.391515 46.218571 30.424371 46.080108 30.314069 45.941644 30.227236 45.873586 30.105201 45.864199 # -b 29.929188 41.172876 30.182647 41.172876 30.391515 41.182263 30.579262 41.140020 30.710684 41.090736 30.788130 41.107164 30.987611 41.090736 31.173011 41.064921 31.428816 41.156448 31.548505 41.339501 31.769107 41.423987 31.980322 41.564797 32.231434 41.630508 32.419180 41.752544 32.651517 41.853458 32.860385 41.919169 33.125578 42.001308 33.435360 42.034164 33.731061 42.041204 34.139411 42.008349 34.493783 42.017736 34.812952 42.017736 35.033555 42.099875 35.164978 42.116303 35.265891 42.083448 35.265891 41.975493 35.409048 41.820602 35.662507 41.719688 35.892496 41.719688 36.136567 41.761931 36.256256 41.604693 36.399413 41.323073 36.676339 41.316032 36.896942 41.290217 37.040099 41.224506 37.314679 41.116551 37.535281 41.015638 37.645582 41.074308 37.755884 41.107164 38.131377 40.966354 38.527992 40.989822 38.826040 41.074308 39.091233 41.100124 39.365812 41.132979 39.696716 41.074308 39.994764 41.025025 # -b 29.640528 45.385445 29.696852 45.331467 29.685118 45.254022 29.685118 45.106171 29.652262 44.965361 29.509105 44.824551 29.321358 44.794042 29.133611 44.700169 28.990454 44.566399 28.859032 44.479566 28.814442 44.557012 28.936477 44.653232 29.046778 44.817510 29.035044 44.887916 29.046778 44.995870 28.903621 44.995870 28.870766 44.864447 28.837910 44.700169 28.748730 44.533543 28.715875 44.392733 28.659551 44.282432 28.659551 44.195599 28.659551 44.043055 28.638429 43.939794 28.659551 43.789597 # -b 28.659551 43.789597 28.617308 43.580728 28.516394 43.428184 28.176103 43.364820 27.955500 43.172379 27.943766 42.994020 27.943766 42.775764 27.788875 42.735868 27.734898 42.663116 27.657452 42.604445 27.535417 42.531693 27.591741 42.475369 27.678574 42.449554 27.756019 42.360374 27.821730 42.221911 27.899176 42.132731 28.021211 42.024777 28.032946 41.935597 # -b 28.032946 41.935597 28.009477 41.827643 28.065801 41.679792 28.197224 41.555410 28.340381 41.473270 28.593839 41.381744 28.903621 41.299605 29.079634 41.290217 29.091368 41.165835 28.981067 41.048493 28.715875 40.989822 28.572718 41.041453 28.319259 41.057881 28.032946 41.048493 27.833465 41.015638 27.612862 41.008597 27.457971 40.865440 27.127067 40.656572 26.885343 40.539230 26.664741 40.421888 26.488728 40.311587 26.366693 40.159043 26.223536 40.109759 26.223536 40.311587 26.247004 40.403114 26.444138 40.496987 26.709331 40.572086 26.840753 40.673000 26.631885 40.656572 26.354958 40.630757 26.235270 40.621369 26.101500 40.673000 26.059257 40.731670 # -b 26.354958 41.811215 26.399548 41.729075 26.566174 41.621121 26.542705 41.463883 26.345571 41.348888 26.312715 41.140020 26.247004 40.931151 26.059257 40.731670 # -b 24.712174 40.614329 24.813088 40.647184 24.768498 40.682387 24.756764 40.780954 24.669931 40.806769 24.515040 40.689427 24.526774 40.630757 24.637075 40.588514 24.712174 40.614329 # -b 26.059257 40.731670 25.892632 40.839625 25.606318 40.898296 25.331738 40.956967 25.197969 40.973395 25.033690 41.008597 24.857678 40.924111 24.756764 40.898296 24.625341 40.898296 24.425860 40.956967 24.238113 40.806769 23.942412 40.757486 23.665485 40.621369 23.820377 40.504027 23.942412 40.471172 24.085569 40.428929 24.184136 40.353830 24.261582 40.278731 24.306171 40.201286 24.228726 40.243529 24.106690 40.328015 23.930678 40.370258 23.820377 40.379645 23.742931 40.252916 23.942412 40.142615 # -b 23.963534 39.964255 23.820377 40.083944 23.710075 40.217714 23.534063 40.269344 23.456617 40.252916 23.501207 40.100372 # -b 23.566918 39.940787 23.379172 40.083944 23.280604 40.259957 23.092858 40.360871 22.860521 40.471172 22.851134 40.522802 22.905111 40.621369 22.815931 40.588514 22.651653 40.555658 22.607063 40.353830 22.607063 40.152002 # -b 30.105201 45.864199 29.971431 45.864199 29.929188 45.803181 29.818887 45.765632 29.807153 45.671758 29.717973 45.702267 29.696852 45.826650 29.663996 45.880627 29.663996 45.758591 29.663996 45.634209 29.675730 45.519214 29.696852 45.439422 29.640528 45.385445 # -b 26.411283 40.067516 26.533318 40.210673 26.676475 40.311587 26.807898 40.438316 26.929933 40.428929 27.040234 40.428929 27.138801 40.454744 27.314814 40.496987 27.413381 40.421888 27.624596 40.370258 27.833465 40.379645 27.788875 40.496987 27.767753 40.572086 27.922644 40.555658 28.032946 40.513415 28.021211 40.438316 28.143247 40.428929 28.384971 40.464131 28.605573 40.454744 28.880153 40.445357 29.112490 40.471172 29.091368 40.565045 28.936477 40.588514 28.913009 40.640144 29.091368 40.698815 29.333092 40.705855 29.520839 40.722283 29.708586 40.731670 29.896333 40.741058 29.884599 40.806769 29.741442 40.832584 29.631140 40.806769 29.464515 40.816157 29.387069 40.823197 29.333092 40.881868 29.255647 40.898296 29.222791 40.982782 29.112490 41.032065 29.157080 41.123592 29.234525 41.231546 29.267381 41.273789 29.288502 41.224506 29.455128 41.224506 29.685118 41.165835 29.929188 41.172876 # -b 26.223536 39.905585 26.312715 40.041701 26.322103 40.041701 26.411283 40.067516 # -b 19.962180 39.914972 19.840144 40.048741 19.520975 40.142615 19.354349 40.344443 19.276904 40.471172 19.410673 40.454744 19.410673 40.572086 19.344962 40.764526 19.410673 40.940539 19.443529 40.973395 19.431795 41.107164 19.464651 41.224506 19.387205 41.372356 19.410673 41.456843 19.443529 41.529594 19.476385 41.604693 19.553830 41.794787 19.464651 41.869886 19.309759 41.893354 # -b 19.309759 41.893354 19.211192 41.952025 19.100891 42.132731 18.946000 42.212523 18.737132 42.360374 18.626830 42.419045 18.549385 42.465982 18.396841 42.541080 18.230215 42.637301 18.054203 42.735868 17.887577 42.825047 17.723299 42.832088 17.591876 42.857903 17.303215 42.986979 17.073226 43.026875 17.138937 43.083199 17.338418 43.050344 17.436985 42.961164 17.535552 42.954123 17.514431 43.017488 17.359539 43.099627 17.127203 43.285027 16.864357 43.428184 16.542841 43.524404 16.322238 43.540832 16.068780 43.524404 15.991335 43.533792 15.958479 43.630012 15.881033 43.749700 15.683899 43.820106 15.561864 43.909285 15.374117 43.996118 15.176983 44.186212 15.165249 44.258964 15.221573 44.312941 15.406973 44.345797 15.209838 44.463138 15.033826 44.557012 14.890669 44.770574 14.890669 44.958321 14.834345 45.089743 14.756899 45.169536 14.702922 45.169536 14.658332 45.207085 14.548031 45.293918 14.327428 45.347895 14.205393 45.113212 14.106826 44.981789 14.008259 44.855060 13.909692 44.840979 13.820512 44.887916 13.665621 45.113212 13.578788 45.230553 13.534198 45.418300 13.510730 45.502786 13.653887 45.580232 13.698477 45.695227 13.632765 45.556764 # -b 14.503441 45.237594 14.515175 45.237594 14.526909 45.207085 14.536297 45.176576 14.559765 45.113212 14.625477 45.082703 14.691188 45.042807 14.712309 45.005257 14.712309 44.988829 14.658332 45.005257 14.580887 45.035766 14.470585 45.042807 14.416608 45.075662 14.437730 45.146067 14.458851 45.200045 14.503441 45.237594 # -b 14.282839 45.160148 14.271104 45.183617 14.306307 45.193004 14.315694 45.183617 14.339163 45.146067 14.339163 45.129640 14.339163 45.099131 14.339163 45.059234 14.360284 45.021685 14.372018 44.974748 14.372018 44.948933 14.372018 44.887916 14.372018 44.848019 14.393140 44.794042 14.425996 44.714250 14.437730 44.683741 14.416608 44.700169 14.315694 44.824551 14.261717 44.887916 14.261717 44.911384 14.282839 44.918424 14.339163 44.974748 14.339163 45.035766 14.306307 45.089743 14.282839 45.146067 14.282839 45.160148 # -b 16.390297 43.414103 16.411418 43.428184 16.423152 43.428184 16.432540 43.428184 16.477129 43.421144 16.533453 43.414103 16.599165 43.404716 16.664876 43.397675 16.742322 43.364820 16.808033 43.357779 16.829155 43.331964 16.819767 43.324923 16.808033 43.317883 16.786912 43.317883 16.730588 43.317883 16.620286 43.301455 16.533453 43.301455 16.432540 43.317883 16.399684 43.364820 16.390297 43.414103 # -b 16.643755 42.977592 16.676610 43.010447 16.730588 43.010447 16.819767 43.010447 16.930069 43.010447 17.007514 43.010447 17.073226 42.994020 17.094347 42.944736 17.040370 42.944736 16.984046 42.944736 16.906600 42.937696 16.796299 42.937696 16.685998 42.937696 16.653142 42.937696 16.643755 42.961164 16.643755 42.977592 # -b 9.861401 44.082951 10.171183 43.989078 10.225161 43.925713 10.258016 43.766128 10.358930 43.557260 10.502087 43.308495 10.556064 43.155951 10.546677 43.059731 10.600654 43.010447 10.800135 42.871984 10.919824 42.782804 11.095836 42.620873 11.131039 42.524653 11.163895 42.419045 11.307052 42.458941 11.438474 42.458941 11.605100 42.360374 11.736522 42.205483 11.858558 42.083448 12.034571 42.067020 12.133138 41.959065 12.365474 41.736116 12.595464 41.555410 12.860657 41.407559 13.048403 41.280830 13.146970 41.306645 13.456753 41.299605 13.632765 41.290217 13.743067 41.264402 13.874489 41.156448 14.008259 41.032065 14.085704 40.891255 14.249983 40.839625 14.381406 40.799729 14.404874 40.757486 14.381406 40.647184 14.559765 40.673000 14.724044 40.689427 14.822611 40.673000 14.900056 40.588514 14.968114 40.438316 14.956380 40.379645 14.932912 40.337402 15.022092 40.236488 15.230960 40.168430 15.331874 40.100372 # -b 15.418707 39.999458 15.507887 40.126187 15.606454 40.126187 15.627575 40.083944 15.683899 40.025273 # -b 16.533453 39.914972 16.587431 40.067516 16.620286 40.184858 16.775178 40.353830 16.984046 40.529843 17.183527 40.555658 17.282094 40.487600 17.481575 40.386686 17.735033 40.337402 17.932167 40.252916 17.997879 40.126187 # -b 18.328782 39.914972 18.385106 40.006498 18.471939 40.133228 18.417962 40.236488 18.307661 40.360871 18.131648 40.504027 18.021347 40.656572 17.932167 40.764526 17.744420 40.806769 17.481575 40.891255 17.282094 40.949926 17.138937 41.074308 16.918334 41.165835 16.697732 41.231546 16.488864 41.299605 16.268261 41.372356 16.125104 41.440415 16.014803 41.473270 15.937357 41.473270 15.881033 41.529594 15.881033 41.604693 15.991335 41.696220 16.125104 41.761931 16.146226 41.886313 16.092248 41.926210 16.024190 42.001308 15.925623 42.001308 15.838790 41.984880 15.761345 41.952025 15.904502 41.984880 15.770732 41.952025 15.606454 41.942637 15.430441 41.952025 15.209838 41.952025 15.198104 41.926210 15.198104 41.919169 15.198104 41.844070 14.968114 42.024777 14.890669 42.067020 14.780368 42.123344 14.724044 42.139772 14.691188 42.132731 14.646598 42.238339 14.569152 42.238339 14.515175 42.287622 14.327428 42.419045 14.196006 42.508225 14.095092 42.620873 13.963669 42.808620 13.897958 42.930655 13.853368 43.050344 13.787656 43.116055 13.731332 43.292068 13.677355 43.428184 13.611644 43.510323 13.534198 43.630012 13.456753 43.669908 13.346451 43.669908 13.325330 43.686336 13.313596 43.716845 13.236150 43.749700 13.146970 43.796637 13.060137 43.845921 12.938102 43.932754 12.794945 43.972650 12.640054 44.028974 12.553221 44.068870 12.442920 44.162743 12.342006 44.282432 12.288029 44.399774 12.288029 44.542931 12.288029 44.636804 12.299763 44.770574 12.320884 44.855060 12.431186 44.918424 12.452307 45.005257 12.398330 45.089743 12.266907 45.122599 12.243439 45.207085 12.222317 45.317386 12.255173 45.408913 12.342006 45.448809 12.452307 45.519214 12.518019 45.519214 12.541487 45.495746 12.628320 45.509827 12.816067 45.580232 13.092993 45.671758 13.224416 45.735123 13.391041 45.702267 13.555320 45.765632 13.689089 45.749204 13.698477 45.671758 13.665621 45.617781 13.632765 45.580232 13.689089 45.725736 # -b 5.132528 43.383594 5.120794 43.383594 5.066817 43.392982 4.965903 43.392982 4.933047 43.343698 4.780503 43.336657 4.625612 43.376554 4.581022 43.423490 4.524698 43.449306 4.393275 43.465733 4.250118 43.479814 4.184407 43.529098 4.085840 43.529098 3.919215 43.465733 3.820648 43.392982 3.764324 43.367166 3.621167 43.296761 3.489744 43.247478 3.269141 43.184113 3.158840 43.038609 3.114250 42.843822 3.137719 42.820354 3.179962 42.787498 3.224551 42.395577 # -b 3.224551 42.395577 3.358321 42.355680 3.358321 42.332212 3.391177 42.257113 3.236286 42.200789 3.257407 42.069367 3.323119 41.947331 3.158840 41.790093 2.827936 41.625815 2.464177 41.468577 2.222453 41.292564 1.900936 41.210425 1.504321 41.093083 1.140562 40.994516 0.919959 40.785648 0.919959 40.694121 0.767415 40.574433 0.546813 40.365564 0.403656 40.180164 # -b 4.306442 40.027620 4.327564 40.027620 # -b 4.085840 39.910278 3.952070 40.011192 4.029516 40.069863 4.196141 40.079250 4.261853 40.062822 4.306442 40.027620 # -b -0.105608 49.292925 0.049284 49.314047 0.237030 49.400879 0.457633 49.414960 0.612524 49.429041 0.645380 49.466591 0.535078 49.487712 0.269886 49.494753 0.258152 49.558117 0.380187 49.708315 0.657114 49.823310 0.919959 49.872593 1.239129 49.942998 # -b 7.547422 43.836533 7.523953 43.813065 7.425386 43.773169 7.293964 43.726232 7.183662 43.686336 7.160194 43.630012 7.049893 43.580728 6.951326 43.510323 6.841024 43.437571 6.730723 43.374207 6.676746 43.348392 6.665012 43.268599 6.620422 43.228703 6.488999 43.188807 6.355230 43.148911 6.256662 43.123095 6.190951 43.090240 6.167483 43.099627 6.036060 43.106668 5.904637 43.106668 5.848313 43.148911 5.794336 43.172379 5.738012 43.219316 5.618323 43.219316 5.529144 43.228703 5.463432 43.252171 5.430576 43.317883 5.320275 43.348392 5.186506 43.357779 5.099673 43.388288 5.043349 43.421144 5.132528 43.383594 # -b 7.547422 43.836533 7.699966 43.829493 7.866591 43.845921 8.066072 43.899898 8.152905 43.939794 8.185761 44.036014 8.263206 44.115807 8.352386 44.209680 8.439219 44.242536 8.472075 44.322328 8.561255 44.352837 8.626966 44.376305 8.793591 44.423242 8.946136 44.423242 9.124495 44.392733 9.309895 44.322328 9.652533 44.169784 9.861401 44.082951 # -b 9.133882 41.316032 9.199594 41.306645 9.211328 41.299605 9.267652 41.273789 9.342751 41.257362 9.377953 41.215119 9.431930 41.191650 9.476520 41.156448 9.497642 41.123592 9.530497 41.074308 9.563353 41.008597 9.598556 40.907683 9.673654 40.722283 9.708857 40.522802 9.708857 40.464131 9.697123 40.344443 9.664267 40.227101 9.673654 40.142615 # -b 8.495543 39.973643 8.462687 40.100372 8.483809 40.210673 8.472075 40.353830 8.439219 40.464131 8.385242 40.572086 8.352386 40.588514 8.263206 40.588514 8.209229 40.673000 8.209229 40.741058 8.209229 40.832584 8.218617 40.898296 8.209229 40.966354 8.218617 40.982782 8.296062 40.914724 8.385242 40.865440 8.561255 40.891255 8.683290 40.982782 8.802979 41.074308 8.925014 41.156448 9.035315 41.191650 9.089292 41.257362 9.133882 41.316032 # -b 9.342751 43.033916 9.431930 43.003407 9.443665 42.857903 9.453052 42.719440 9.453052 42.604445 9.497642 42.442513 9.553966 42.238339 9.521110 42.090488 9.453052 41.968453 9.420196 41.827643 9.377953 41.745503 9.342751 41.637549 9.309895 41.588265 9.277039 41.564797 9.223062 41.473270 9.211328 41.391131 9.124495 41.496739 9.023581 41.513167 8.903892 41.564797 8.847568 41.637549 8.859303 41.752544 8.737267 41.787746 8.704411 41.869886 8.692677 41.984880 8.692677 42.090488 8.683290 42.156199 8.615232 42.228951 8.605844 42.294663 8.626966 42.353334 8.615232 42.409658 8.615232 42.433126 8.615232 42.442513 8.626966 42.458941 8.638700 42.475369 8.659822 42.557508 8.704411 42.620873 8.781857 42.604445 8.903892 42.637301 9.014194 42.693625 9.101027 42.752296 9.267652 42.782804 9.309895 42.848516 9.321629 42.930655 9.342751 42.977592 9.342751 43.033916 # -b -1.274331 60.003881 -1.307187 59.888886 -1.250863 59.910007 -1.164030 59.982759 # -b -6.146361 58.445582 -6.167483 58.452623 -6.256662 58.436195 -6.456143 58.377524 -6.575832 58.314159 -6.709602 58.267223 -6.709602 58.227326 -6.676746 58.173349 -6.787047 58.156921 -6.918470 58.203858 -6.972447 58.109985 -6.972447 58.046620 -6.972447 57.980909 -6.918470 57.941012 -6.864493 57.894076 -6.939591 57.835405 -6.951326 57.807243 -6.918470 57.746225 -6.796435 57.769694 -6.730723 57.800202 -6.718989 57.854180 -6.643890 57.877648 -6.575832 57.929278 -6.456143 57.922238 -6.388085 57.941012 -6.312986 57.987949 -6.289518 58.039580 -6.289518 58.058354 -6.355230 58.063048 -6.355230 58.121719 -6.345842 58.128759 -6.322374 58.152228 -6.277784 58.173349 -6.179217 58.180390 -6.092384 58.220286 -6.134627 58.215592 -6.190951 58.255488 -6.167483 58.307119 -6.158095 58.361096 -6.146361 58.412726 -6.146361 58.445582 # -b -7.028771 57.612456 -6.972447 57.628883 -6.984181 57.635924 -7.082748 57.647658 -7.228252 57.635924 -7.326819 57.628883 -7.392531 57.624190 -7.404265 57.588987 -7.347941 57.577253 -7.303351 57.539704 -7.249374 57.523276 -7.160194 57.516235 -7.094483 57.516235 -7.061627 57.516235 -7.061627 57.546744 -7.049893 57.581947 -7.028771 57.612456 # -b -2.628455 58.945458 -2.607334 58.968926 -2.628455 58.973620 -2.663658 58.997088 -2.771612 58.990048 -2.872526 59.001782 -2.971093 59.001782 -3.003949 59.046372 -3.015683 59.093309 -3.114250 59.154326 -3.191696 59.154326 -3.224551 59.065147 -3.224551 58.990048 -3.125984 58.957192 -3.003949 58.950152 -2.872526 58.961886 -2.795081 58.950152 -2.750491 58.940764 -2.684779 58.929030 -2.628455 58.945458 # -b -3.102516 58.830463 -3.093129 58.865666 -3.147106 58.900868 -3.224551 58.921990 -3.290263 58.910255 -3.301997 58.853931 -3.236286 58.814035 -3.137719 58.821076 -3.102516 58.830463 # -b -5.254564 58.215592 -5.242830 58.208552 -5.242830 58.156921 -5.242830 58.105291 -5.242830 58.081823 -5.341397 58.051314 -5.308541 58.004377 -5.231096 57.969175 -5.165384 57.936319 -5.165384 57.922238 -5.242830 57.894076 -5.329663 57.870607 -5.418842 57.858873 -5.496288 57.816630 -5.585468 57.811937 -5.660566 57.781428 -5.651179 57.711023 -5.660566 57.675820 -5.651179 57.617149 -5.651179 57.577253 -5.594855 57.558478 -5.529144 57.535010 -5.561999 57.516235 -5.684035 57.527970 -5.738012 57.511542 -5.738012 57.481033 -5.738012 57.464605 -5.738012 57.457564 -5.738012 57.391853 -5.728625 57.361344 -5.606589 57.356651 -5.451698 57.375425 -5.397721 57.380119 -5.418842 57.333182 -5.517409 57.302673 -5.484554 57.290939 -5.407108 57.286245 -5.418842 57.267471 -5.508022 57.201759 -5.517409 57.171251 -5.529144 57.159516 -5.517409 57.117273 -5.508022 57.093805 -5.550265 57.086765 -5.618323 57.039828 -5.618323 57.028094 -5.618323 56.997585 -5.684035 56.962382 -5.728625 56.896671 -5.738012 56.870856 -5.728625 56.828613 -5.728625 56.769942 -5.738012 56.751167 -5.827192 56.739433 -5.925759 56.725352 -6.024326 56.690149 -6.014938 56.659641 -5.881169 56.654947 -5.848313 56.647906 -5.838926 56.647906 -5.827192 56.617397 -5.815457 56.556380 -5.728625 56.525871 -5.639445 56.476587 -5.594855 56.453119 -5.585468 56.453119 -5.561999 56.460160 -5.561999 56.464853 -5.496288 56.490668 -5.407108 56.521177 -5.320275 56.568114 -5.275685 56.593929 -5.242830 56.610357 -5.209974 56.624438 -5.198240 56.617397 -5.186506 56.605663 -5.186506 56.551686 -5.263951 56.464853 -5.308541 56.392101 -5.364865 56.324043 -5.397721 56.281800 -5.418842 56.239557 -5.439964 56.164458 -5.463432 56.122215 -5.463432 56.079972 -5.508022 56.023648 -5.529144 55.950896 -5.540878 55.906306 -5.540878 55.845289 -5.540878 55.819474 -5.439964 55.833555 -5.397721 55.796005 -5.407108 55.732641 -5.475166 55.671623 -5.561999 55.577750 -5.606589 55.490917 -5.639445 55.415818 -5.672301 55.333679 -5.672301 55.303170 -5.550265 55.303170 -5.496288 55.345413 -5.439964 55.472142 -5.341397 55.608258 -5.296807 55.676317 -5.242830 55.746722 -5.242830 55.781924 -5.242830 55.819474 -5.254564 55.882838 -5.308541 55.955590 -5.320275 56.000180 -5.296807 56.011914 -5.263951 56.030689 -5.198240 56.079972 -5.066817 56.178539 -5.043349 56.183233 -5.033961 56.190273 -5.043349 56.122215 -5.111407 56.035382 -5.177118 55.950896 -5.186506 55.875798 -5.177118 55.838248 -5.132528 55.875798 -5.087939 55.882838 -5.076204 55.882838 -5.055083 55.925081 -5.010493 55.943856 -4.965903 55.932122 -4.956516 55.932122 -4.911926 55.918041 -4.890804 55.901613 -4.879070 55.901613 -4.867336 55.906306 -4.855602 55.913347 -4.855602 55.936815 -4.855602 56.049463 -4.789890 56.023648 -4.691323 56.000180 -4.592756 55.955590 -4.581022 55.936815 -4.679589 55.925081 -4.724179 55.875798 -4.757035 55.819474 -4.768769 55.763149 -4.768769 55.713866 -4.780503 55.664582 -4.724179 55.615299 -4.613878 55.566015 -4.581022 55.458061 -4.679589 55.364188 -4.768769 55.225724 -4.890804 55.087261 -4.933047 55.000428 -4.923660 54.904208 -5.043349 54.960532 -5.076204 54.904208 -5.010493 54.789213 -4.933047 54.662484 -4.855602 54.624934 -4.813359 54.636669 -4.834480 54.777479 -4.813359 54.815028 -4.745301 54.829109 -4.625612 54.784519 -4.437865 54.695340 -4.339298 54.669524 -4.282974 54.732889 -4.282974 54.815028 -4.228997 54.822069 -4.095227 54.796253 -4.017782 54.796253 -3.853503 54.789213 -3.754936 54.822069 -3.665756 54.847884 -3.654022 54.852577 -3.555455 54.873699 -3.522600 54.904208 -3.391177 54.948798 -3.280876 54.941757 -3.125984 54.937064 -3.003949 54.922983 -3.060273 54.892474 -3.137719 54.892474 -3.191696 54.859618 -3.290263 54.815028 -3.346587 54.732889 -3.433420 54.636669 -3.510865 54.540448 -3.543721 54.458309 -3.501478 54.380864 -3.424032 54.322193 -3.367708 54.284643 -3.313731 54.200157 -3.290263 54.188423 -3.257407 54.218932 -3.248020 54.200157 -3.191696 54.155567 -3.137719 54.078122 -3.027417 54.103937 -2.881914 54.129752 -2.729369 54.218932 -2.651924 54.200157 -2.729369 54.136793 -2.729369 54.052307 -2.750491 53.949046 -2.849058 53.890375 -2.917116 53.765993 -2.839671 53.751912 -2.738757 53.733137 -2.849058 53.648651 -2.917116 53.543043 -2.938238 53.477332 -2.881914 53.425702 -2.795081 53.399887 -2.860792 53.371725 -2.949972 53.287238 -3.114250 53.294279 -3.358321 53.287238 -3.677491 53.298973 -3.919215 53.214487 -4.160939 53.087757 -4.360420 52.963375 -4.581022 52.822565 -4.491842 52.789709 -4.228997 52.895317 -4.029516 52.923479 -3.996660 52.822565 -3.996660 52.702876 -3.984926 52.601963 -3.963805 52.555026 -3.853503 52.508089 -3.930949 52.421256 -3.952070 52.386054 -4.041250 52.266365 -4.205529 52.198307 -4.414397 52.109127 -4.592756 52.036375 -4.801625 51.973011 -5.001106 51.900259 -5.153650 51.850975 -5.111407 51.818120 -5.076204 51.750061 -5.022227 51.693737 -4.977637 51.632720 -4.944782 51.618639 -4.933047 51.604558 -4.822746 51.592823 -4.691323 51.625679 -4.524698 51.721899 -4.360420 51.768836 -4.294708 51.750061 -4.271240 51.707818 -4.250118 51.604558 -4.184407 51.564661 -3.963805 51.557621 -3.832382 51.632720 -3.776058 51.639760 -3.722081 51.618639 -3.654022 51.557621 -3.543721 51.468441 -3.445154 51.398036 -3.334853 51.372221 -3.179962 51.379261 -3.069660 51.426198 -2.982827 51.508337 -2.860792 51.564661 -2.750491 51.592823 -2.586212 51.667922 -2.475911 51.721899 -2.464177 51.646801 -2.553357 51.557621 -2.705901 51.433239 -2.839671 51.337018 -2.881914 51.254879 -2.938238 51.212636 -3.003949 51.191515 -3.179962 51.177434 -3.489744 51.184474 -3.754936 51.177434 -4.017782 51.144578 -4.029516 51.116416 -4.118696 51.024889 -4.294708 50.949791 -4.414397 50.790206 -4.658468 50.621234 -4.867336 50.473383 -5.043349 50.353695 -5.165384 50.262168 -5.320275 50.198803 -5.451698 50.135439 -5.508022 50.043912 # -b -5.508022 49.994629 -5.451698 50.072074 -5.385987 50.100236 -5.263951 50.065034 -5.186506 50.022791 -5.099673 50.036872 -5.099673 50.029831 # -b -5.043349 49.987588 -4.965903 50.036872 -4.911926 50.135439 -4.712445 50.205844 -4.602144 50.332573 -4.449599 50.332573 -4.294708 50.346654 -4.172673 50.339614 -4.062372 50.339614 -3.942683 50.318492 -3.808913 50.290330 -3.710346 50.255127 -3.611779 50.241046 -3.567189 50.248087 -3.522600 50.283289 -3.445154 50.346654 -3.400564 50.501545 -3.367708 50.614193 -3.313731 50.628274 -3.269141 50.621234 -3.170574 50.621234 -2.982827 50.677558 -2.771612 50.712760 -2.696514 50.733882 -2.607334 50.677558 -2.508767 50.614193 -2.443055 50.564910 -2.398466 50.522667 # -b -2.398466 50.522667 -2.374997 50.515626 -2.374997 50.522667 -2.374997 50.529707 -2.321020 50.578991 -2.154395 50.607153 -1.968995 50.571950 -1.868081 50.600112 -1.924405 50.684598 -1.703802 50.684598 -1.459731 50.691639 -1.405754 50.726841 -1.283719 50.762044 -1.262597 50.816021 -1.262597 50.879386 -1.152296 50.823062 -1.030261 50.801940 -0.875370 50.823062 -0.833126 50.783165 -0.732213 50.733882 -0.546813 50.755003 -0.192440 50.797246 -0.037549 50.801940 # -b 0.004694 53.557124 -0.114995 53.622836 -0.248765 53.700281 -0.171319 53.726097 -0.061018 53.655692 # -b 0.093873 53.836398 -0.072752 53.974861 -0.138463 54.129752 -0.248765 54.244747 -0.258152 54.244747 -0.258152 54.251788 -0.269886 54.251788 -0.359066 54.362089 -0.523344 54.502899 -0.732213 54.554529 -0.985671 54.580345 -1.053729 54.617894 -1.128828 54.758704 -1.262597 54.878393 -1.372899 55.019203 -1.426876 55.131851 -1.438610 55.244499 -1.450344 55.326638 -1.459731 55.397043 -1.494934 55.528466 -1.659212 55.596524 -1.858693 55.720906 -1.978382 55.838248 -2.145007 55.901613 -2.353876 55.955590 -2.497033 56.000180 -2.595600 56.011914 -2.640190 56.004874 -2.729369 55.986099 -2.905382 55.943856 -3.048539 55.955590 -3.179962 55.986099 -3.191696 56.004874 -3.147106 56.084666 -3.036805 56.148030 -2.893648 56.171499 -2.696514 56.178539 -2.529888 56.220782 -2.619068 56.281800 -2.729369 56.368633 -2.816202 56.392101 -2.849058 56.446079 -2.673045 56.441385 -2.562744 56.483628 -2.452443 56.568114 -2.419587 56.654947 -2.309286 56.739433 -2.264696 56.769942 -2.231840 56.798104 -2.198985 56.840347 -2.177863 56.847387 -2.166129 56.870856 -2.145007 56.943608 -2.067562 57.058602 -2.046440 57.136048 -2.011238 57.220534 -1.924405 57.279205 -1.835225 57.326142 -1.757780 57.380119 -1.757780 57.476339 -1.757780 57.570213 -1.825838 57.652352 -1.924405 57.664086 -2.133273 57.664086 -2.374997 57.647658 -2.574478 57.671126 -2.783346 57.675820 -2.992215 57.659392 -3.212817 57.694595 -3.367708 57.664086 -3.698612 57.605415 -3.874625 57.570213 -4.008394 57.504501 -4.085840 57.539704 -4.041250 57.612456 -4.041250 57.640618 -4.196141 57.617149 -4.196141 57.664086 -3.930949 57.706329 -3.764324 57.795509 -3.820648 57.807243 -4.074106 57.811937 -4.041250 57.889382 -4.017782 57.877648 -3.841769 57.992643 -3.478010 58.117025 -3.334853 58.255488 -3.093129 58.337628 -3.069660 58.476091 -3.036805 58.584045 -3.257407 58.626288 -3.334853 58.614554 -3.367708 58.602820 -3.510865 58.579352 -3.764324 58.551190 -3.975539 58.551190 -4.095227 58.527721 -4.271240 58.511293 -4.294708 58.527721 -4.449599 58.551190 -4.503577 58.544149 -4.536432 58.551190 -4.646734 58.567617 -4.712445 58.551190 -4.846215 58.539455 -4.977637 58.429154 -5.033961 58.372830 -5.043349 58.290691 -5.043349 58.227326 -5.066817 58.220286 -5.186506 58.215592 -5.242830 58.220286 -5.254564 58.215592 # -b -1.095972 50.698679 -1.128828 50.726841 -1.173418 50.712760 -1.185152 50.712760 -1.229742 50.698679 -1.239129 50.698679 -1.250863 50.698679 -1.316575 50.670517 -1.349430 50.635315 -1.316575 50.607153 -1.173418 50.578991 -1.063116 50.593072 -1.009139 50.635315 -0.976283 50.656436 -0.985671 50.677558 -1.095972 50.698679 # -b -4.095227 53.221527 -3.996660 53.280198 -4.095227 53.338869 -4.217263 53.385806 -4.306442 53.392846 -4.437865 53.378765 # -b -4.306442 54.373823 -4.315830 54.369129 -4.405010 54.310459 -4.515311 54.233013 -4.625612 54.103937 -4.679589 54.045266 -4.524698 54.064041 -4.327564 54.129752 -4.238384 54.218932 -4.228997 54.277603 -4.228997 54.348008 -4.306442 54.373823 # -b -5.231096 55.657542 -5.242830 55.664582 -5.254564 55.589484 -5.242830 55.476836 -5.165384 55.401737 -5.066817 55.420512 -5.043349 55.490917 -5.022227 55.566015 -5.043349 55.664582 -5.087939 55.671623 -5.177118 55.664582 -5.209974 55.657542 -5.221708 55.657542 -5.231096 55.657542 # -b -6.080650 55.864063 -6.092384 55.875798 -6.113506 55.864063 -6.167483 55.838248 -6.322374 55.807739 -6.399819 55.690398 -6.388085 55.664582 -6.268397 55.751415 -6.235541 55.713866 -6.190951 55.638767 -6.167483 55.603565 -6.003204 55.652848 -5.991470 55.739681 -6.057181 55.819474 -6.080650 55.857023 -6.080650 55.864063 # -b -5.651179 56.072932 -5.627711 56.091706 -5.660566 56.079972 -5.782602 56.011914 -5.838926 55.962630 -5.848313 55.906306 -5.937493 55.845289 -5.949227 55.781924 -5.848313 55.800699 -5.803723 55.875798 -5.695769 55.981405 -5.651179 56.054157 -5.651179 56.072932 # -b -6.244928 56.288841 -6.277784 56.312309 -6.268397 56.274760 -6.167483 56.244251 -5.982083 56.244251 -5.860047 56.288841 -5.815457 56.319349 -5.738012 56.319349 -5.651179 56.338124 -5.672301 56.399142 -5.749746 56.434344 -5.770868 56.441385 -5.848313 56.483628 -5.949227 56.544646 -5.958614 56.551686 -5.970349 56.556380 -5.991470 56.598623 -6.113506 56.586889 -6.179217 56.544646 -6.167483 56.490668 -6.057181 56.460160 -6.014938 56.441385 -6.036060 56.392101 -6.036060 56.361592 -6.003204 56.349858 -6.036060 56.312309 -6.125240 56.288841 -6.202685 56.288841 -6.244928 56.288841 # -b -6.244928 57.671126 -6.277784 57.675820 -6.277784 57.664086 -6.301252 57.600721 -6.322374 57.511542 -6.334108 57.469299 -6.477265 57.546744 -6.542976 57.499807 -6.587566 57.469299 -6.632156 57.380119 -6.554711 57.351957 -6.423288 57.351957 -6.345842 57.236962 -6.244928 57.182985 -6.244928 57.124314 -6.167483 57.124314 -6.036060 57.129008 -5.881169 57.147782 -5.881169 57.100846 -5.871781 57.046868 -5.761480 57.070337 -5.705156 57.154823 -5.651179 57.213494 -5.782602 57.220534 -5.892903 57.232268 -5.958614 57.267471 -5.958614 57.368385 -5.991470 57.391853 -6.092384 57.464605 -6.092384 57.527970 -6.125240 57.593681 -6.223807 57.659392 -6.244928 57.671126 # -b -7.446508 54.941757 -7.446508 54.986347 -7.437121 54.986347 -7.458242 55.068486 -7.469976 55.202256 -7.491098 55.225724 -7.601399 55.213990 -7.690579 55.176441 -7.777412 55.157666 -7.845470 55.188175 -8.042604 55.113076 -8.185761 55.030937 -8.274941 55.012162 -8.328918 54.911248 -8.286675 54.866658 -8.307796 54.833803 -8.429832 54.751664 -8.594110 54.688299 -8.626966 54.674218 -8.638700 54.669524 -8.594110 54.606160 -8.439219 54.606160 -8.340652 54.585038 -8.242085 54.606160 -8.075460 54.606160 -8.066072 54.559223 -8.131784 54.470043 -8.209229 54.451269 -8.352386 54.392598 -8.450953 54.343314 -8.439219 54.296378 -8.450953 54.251788 -8.462687 54.233013 -8.737267 54.240053 -8.903892 54.218932 -9.068171 54.207198 -9.133882 54.270562 -9.321629 54.284643 -9.586822 54.296378 -9.697123 54.218932 -9.783956 54.115671 -9.751100 54.038226 -9.718244 53.949046 -9.828546 53.974861 -9.995171 53.953740 -9.861401 53.869254 -9.586822 53.843438 -9.476520 53.843438 -9.443665 53.777727 -9.598556 53.719056 -9.729978 53.674466 -9.795690 53.589980 -9.938847 53.531309 -9.950581 53.451517 -9.828546 53.378765 -9.741713 53.364684 -9.741713 53.306013 -9.619677 53.298973 -9.509376 53.313054 -9.476520 53.240302 -9.300508 53.228568 -9.023581 53.228568 -8.880424 53.228568 -8.826447 53.167550 -8.903892 53.127654 -9.133882 53.068983 -9.267652 52.982150 -9.288773 52.909398 -9.300508 52.822565 -9.377953 52.721651 -9.476520 52.655940 -9.598556 52.580841 -9.631411 52.576147 -9.640799 52.562066 -9.664267 52.555026 -9.640799 52.547985 -9.521110 52.562066 -9.497642 52.576147 -9.399075 52.576147 -9.232449 52.587882 -9.068171 52.609003 -8.925014 52.688795 -8.835834 52.761547 -8.826447 52.768588 -8.781857 52.789709 -8.770123 52.775628 -8.781857 52.702876 -8.770123 52.662980 -8.615232 52.648899 -8.605844 52.627778 -8.760736 52.594922 -8.990725 52.576147 -9.211328 52.533904 -9.497642 52.522170 -9.563353 52.447071 -9.697123 52.332077 -9.708857 52.259325 -9.762834 52.224122 -9.873135 52.238203 -9.983437 52.212388 # -b -10.039761 52.083312 -9.807424 52.102087 -9.774568 52.048109 # -b -10.004558 51.750061 -9.971702 51.750061 -9.873135 51.768836 -9.729978 51.796998 -9.563353 51.832201 -9.553966 51.761796 -9.718244 51.714859 -9.852014 51.646801 -9.929459 51.604558 -9.962315 51.585783 -9.884870 51.585783 -9.718244 51.632720 -9.607943 51.639760 -9.453052 51.674963 -9.420196 51.686697 -9.387341 51.653841 -9.431930 51.585783 -9.542232 51.578742 -9.652533 51.536499 -9.619677 51.508337 -9.619677 51.461401 -9.453052 51.508337 -9.309895 51.522418 -9.244184 51.496603 -9.157351 51.489563 -9.124495 51.496603 -9.112761 51.496603 -9.101027 51.503644 -9.089292 51.515378 -9.035315 51.536499 -9.023581 51.543540 -8.913280 51.536499 -8.793591 51.571702 -8.671556 51.578742 -8.528399 51.618639 -8.406363 51.646801 -8.396976 51.646801 -8.352386 51.674963 -8.263206 51.714859 -8.242085 51.789958 -8.251472 51.872097 -8.185761 51.858016 -8.152905 51.796998 -8.131784 51.789958 -8.075460 51.775877 -7.965158 51.811079 -7.845470 51.843935 -7.777412 51.919034 -7.723434 51.919034 -7.711700 51.919034 -7.613133 51.904953 -7.547422 51.954236 -7.502832 52.036375 -7.458242 52.076272 -7.249374 52.109127 -7.017037 52.130249 -6.918470 52.163104 -6.808169 52.177185 -6.575832 52.177185 -6.444409 52.144330 -6.312986 52.144330 -6.256662 52.217082 -6.322374 52.325036 -6.268397 52.393094 -6.202685 52.522170 -6.146361 52.681755 -6.125240 52.695836 -6.036060 52.808484 -5.991470 52.902357 -5.991470 52.928173 -6.036060 53.076023 -6.036060 53.120613 -6.057181 53.200406 -6.080650 53.280198 -6.101771 53.327135 -6.036060 53.345909 -6.014938 53.411621 -6.003204 53.517228 -6.068916 53.594674 -6.146361 53.719056 -6.202685 53.805889 -6.244928 53.869254 -6.235541 53.953740 -6.202685 53.960780 -6.080650 53.979555 -6.080650 53.986595 # -b -6.080650 53.986595 -6.068916 53.986595 -6.003204 54.012410 -5.838926 54.078122 -5.794336 54.188423 -5.561999 54.218932 -5.463432 54.291684 -5.463432 54.296378 -5.561999 54.418413 -5.594855 54.495859 -5.561999 54.477084 -5.451698 54.369129 -5.418842 54.491165 -5.508022 54.606160 -5.594855 54.636669 -5.848313 54.610853 -5.749746 54.721155 -5.761480 54.911248 -5.937493 55.037977 -6.047794 55.150626 -6.268397 55.188175 -6.355230 55.213990 -6.620422 55.157666 -6.796435 55.131851 -6.918470 55.068486 -7.049893 55.037977 -7.082748 55.075527 -6.972447 55.150626 -6.897348 55.206950 -6.939591 55.244499 -7.082748 55.303170 -7.183662 55.321944 -7.249374 55.314904 -7.249374 55.296129 -7.270495 55.263274 -7.326819 55.239805 -7.359675 55.176441 -7.338553 55.113076 -7.338553 55.030937 -7.371409 54.967572 -7.425386 54.941757 -7.446508 54.941757 # -b -9.983437 52.212388 -10.105472 52.224122 -10.215773 52.163104 -10.258016 52.069231 -10.039761 52.083312 # -b -9.774568 52.048109 -10.004558 51.980051 -10.159449 51.872097 -10.182918 51.804039 -10.060882 51.811079 -10.004558 51.761796 -10.004558 51.750061 # -b -43.963262 59.947557 -43.963262 59.750422 -43.984384 59.947557 -43.996118 59.914701 -44.028974 59.860724 -44.028974 59.832562 -43.996118 59.816134 -43.885817 59.816134 -43.766128 59.827868 -43.665214 59.860724 -43.655827 59.893579 -43.688683 59.910007 -43.864695 59.947557 -43.909285 59.947557 -43.963262 59.947557 # -b -43.918673 60.020308 -43.831840 59.971025 -43.676949 59.966331 -43.545526 59.971025 -43.512670 59.971025 # -b -60.006227 55.284395 -59.928782 55.239805 -59.839602 55.289089 -59.663589 55.340719 -59.642468 55.244499 -59.553288 55.232765 -59.454721 55.213990 -59.541554 55.075527 -59.675324 54.904208 -59.532167 54.974613 -59.311564 55.150626 -59.135552 55.221031 -59.156673 55.087261 -59.100349 55.087261 -58.980660 55.157666 -58.947805 55.030937 -58.891481 54.937064 -58.769445 54.878393 -58.551190 54.847884 -58.483131 54.829109 -58.307119 54.777479 -58.175696 54.810334 -58.187430 54.885433 -58.109985 54.922983 -58.020805 54.960532 -57.922238 54.904208 -57.877648 54.859618 -57.922238 54.777479 -57.833058 54.751664 -57.722757 54.744623 -57.603068 54.695340 -57.481033 54.681259 -57.382466 54.580345 -57.481033 54.514633 -57.469299 54.458309 -57.492767 54.439534 -57.657045 54.413719 -57.779081 54.432494 -57.910504 54.425453 -58.020805 54.399638 -58.152228 54.362089 -58.220286 54.322193 -58.241407 54.322193 -58.241407 54.303418 -58.297731 54.291684 -58.527721 54.207198 -58.760058 54.181383 -59.067493 54.155567 -59.377276 54.089856 -59.532167 54.000676 -59.299830 54.005370 -59.046372 54.059347 -58.781179 54.141486 -58.682612 54.122712 -58.990048 54.026492 -59.288096 53.949046 -59.574410 53.895069 -59.839602 53.895069 # -b -60.104794 53.334175 -59.851336 53.437436 -59.762157 53.524269 -59.553288 53.608755 -59.332686 53.726097 -59.025250 53.805889 -58.837504 53.942005 -58.626288 54.026492 -58.351709 54.078122 -58.098250 54.103937 -57.823671 54.071081 -57.701635 54.089856 -57.865914 54.136793 -58.131106 54.174342 -58.384564 54.141486 -58.429154 54.136793 -58.274263 54.181383 -57.943359 54.225972 -57.668780 54.207198 -57.457564 54.200157 -57.260430 54.207198 -57.204106 54.148527 -57.236962 54.038226 -57.194719 53.934965 -57.171251 53.805889 -57.305020 53.693241 -57.314408 53.594674 -57.281552 53.465598 -57.272164 53.411621 -57.236962 53.418661 -57.138395 53.543043 -57.006972 53.707322 -56.852081 53.777727 -56.610357 53.791808 -56.476587 53.765993 -56.532911 53.707322 -56.410876 53.681507 -56.190273 53.641611 -55.969671 53.601714 -55.859370 53.568859 -55.903960 53.589980 -55.892225 53.582940 -55.892225 53.531309 -56.002527 53.491413 -55.892225 53.392846 -55.781924 53.352950 -55.760803 53.280198 -55.683357 53.261423 -55.683357 53.174590 -55.781924 53.148775 -55.859370 53.087757 -56.058851 53.134694 -56.279453 53.188671 -56.234863 53.141735 -56.136296 53.054902 -56.035382 53.029087 -55.892225 53.029087 -55.826514 52.923479 -55.814780 52.883583 -55.892225 52.836646 -55.892225 52.801444 -55.814780 52.709917 -55.739681 52.641859 # -b -55.739681 52.641859 -55.727947 52.623084 -55.793658 52.623084 -55.903960 52.634818 -55.969671 52.569107 -55.859370 52.547985 -55.671623 52.508089 -55.584790 52.379013 -55.849982 52.393094 -55.981405 52.421256 -55.892225 52.346158 -55.704479 52.259325 -55.605912 52.177185 -55.781924 52.062190 -55.969671 51.904953 -56.300575 51.768836 -56.443732 51.646801 -56.577501 51.536499 -56.786370 51.522418 -56.863815 51.468441 -57.194719 51.475482 -57.535010 51.482522 -57.800202 51.398036 -58.098250 51.351099 -58.351709 51.329978 -58.572311 51.233758 -58.769445 51.053051 -58.870359 51.067132 -59.001782 50.914588 -59.090962 50.823062 -59.255240 50.684598 -59.398397 50.564910 -59.619000 50.473383 -59.818481 50.325533 -59.982759 50.262168 # -b -56.202008 51.508337 -56.333430 51.475482 -56.333430 51.468441 -56.410876 51.454360 -56.488322 51.419158 -56.631478 51.365180 -56.664334 51.268960 -56.741780 51.205596 -56.774635 51.144578 -56.863815 51.123456 -56.863815 51.088254 -56.974116 51.053051 -56.983504 50.949791 -57.016359 50.865305 -57.117273 50.790206 -57.272164 50.755003 -57.358997 50.705720 -57.305020 50.670517 -57.204106 50.628274 -57.236962 50.593072 -57.326142 50.543788 -57.382466 50.402978 -57.436443 50.276249 -57.424709 50.248087 -57.358997 50.219925 -57.293286 50.170641 -57.347263 50.149520 -57.436443 50.149520 -57.612456 50.100236 -57.635924 50.036872 # -b -56.079972 49.987588 -56.035382 50.121358 -56.169152 50.128398 # -b -56.720658 49.914836 -56.720658 50.065034 -56.509443 50.241046 -56.378020 50.438181 -56.190273 50.600112 -56.169152 50.712760 -56.190273 50.790206 -56.169152 50.914588 -56.091706 50.830102 -55.892225 50.907548 -55.814780 51.038970 -55.760803 51.170393 -55.814780 51.212636 -55.925081 51.261920 -55.903960 51.351099 -55.671623 51.365180 -55.519079 51.550580 -55.528466 51.639760 -55.695091 51.564661 -55.781924 51.592823 -55.969671 51.585783 -56.202008 51.508337 # -b -70.083537 59.926435 -69.916912 59.938169 -69.773755 59.914701 -69.686922 59.898273 -69.586008 59.860724 -69.553153 59.832562 -69.466320 59.799706 -69.431117 59.710526 -69.466320 59.682364 -69.421730 59.633081 -69.487441 59.572063 -69.576621 59.471149 -69.609477 59.407784 -69.675188 59.346767 -69.618864 59.313911 -69.466320 59.342073 -69.320816 59.351460 -69.222249 59.313911 -69.266839 59.266974 -69.487441 59.182488 -69.466320 59.133205 -69.388874 59.121471 -69.278573 59.133205 -69.210515 59.069840 -69.222249 59.018210 -69.245717 59.013516 -69.255105 58.990048 -69.344284 58.997088 -69.365406 59.025250 -69.466320 58.957192 -69.686922 58.853931 -69.729165 58.950152 -69.839467 59.008822 # -b -70.006092 58.968926 -69.907525 58.877400 -69.916912 58.814035 # -b -70.006092 58.734243 -69.895791 58.722509 -69.785489 58.654450 -69.618864 58.727202 -69.466320 58.814035 -69.320816 58.858625 -69.079092 58.858625 -68.881958 58.900868 -68.626153 58.910255 -68.461874 58.870359 -68.407897 58.745977 -68.339839 58.642716 -68.264740 58.591086 -68.229538 58.445582 -68.274128 58.302425 -68.318717 58.161615 -68.583910 58.039580 -68.992259 57.917544 -69.278573 57.835405 -69.025115 57.889382 -68.703598 57.957440 -68.318717 58.105291 -68.196682 58.243754 -68.076993 58.504253 -67.933836 58.614554 -67.943224 58.417420 -67.976080 58.354055 -67.811801 58.457316 -67.767211 58.365790 -67.800067 58.290691 -67.778945 58.145187 -67.734355 58.105291 -67.612320 58.267223 -67.436307 58.330587 -67.293150 58.361096 -67.060814 58.445582 -66.917657 58.476091 -66.675933 58.504253 -66.631343 58.630982 -66.521042 58.762405 -66.422475 58.849238 -66.255849 58.762405 -66.046981 58.710774 -65.981270 58.614554 -66.070449 58.440888 -65.993004 58.499559 -65.903824 58.607514 -65.838113 58.699040 -65.960148 58.790567 -66.079837 58.853931 -66.145548 58.921990 -65.960148 58.849238 -65.870968 58.870359 -65.772401 58.929030 -65.849847 58.957192 -65.816991 59.041678 -65.662100 59.036985 -65.605776 59.166060 -65.706690 59.297483 -65.596389 59.229425 -65.561186 59.266974 -65.507209 59.313911 -65.474353 59.330339 -65.375786 59.358501 -65.375786 59.431253 -65.209161 59.480536 -65.352318 59.593184 -65.486087 59.665936 -65.572920 59.750422 -65.474353 59.860724 -65.331196 59.987453 # -b -64.371341 60.036736 -64.371341 59.931129 -64.469908 59.872458 -64.317364 59.914701 -64.216450 59.872458 -64.216450 59.743382 -64.228184 59.665936 -64.019315 59.654202 -64.106148 59.626040 -64.096761 59.553288 -63.909014 59.576757 -63.733002 59.532167 -63.819834 59.464108 -63.962991 59.391357 -63.765857 59.374929 -63.709533 59.297483 -63.643822 59.374929 -63.545255 59.358501 -63.545255 59.245853 -63.446688 59.278709 -63.345774 59.245853 -63.369242 59.149633 -63.578110 59.086268 -63.786979 59.093309 -63.953604 59.093309 -64.183594 59.029944 -64.228184 58.978314 -64.052171 59.046372 -63.953604 59.013516 -63.819834 59.036985 -63.676678 59.041678 -63.533521 59.036985 -63.402098 59.065147 -63.247207 59.081574 -63.181495 59.069840 -63.226085 59.013516 -63.247207 58.968926 -63.190883 58.957192 -63.190883 58.877400 -63.235473 58.802301 -63.148640 58.821076 -63.026604 58.814035 -62.937424 58.809341 -62.982014 58.710774 -62.949159 58.677919 -62.817736 58.654450 -62.850592 58.602820 -63.014870 58.567617 -63.258941 58.544149 -63.402098 58.584045 -63.446688 58.574658 -63.467809 58.562924 -63.500665 58.555883 -63.512399 58.504253 -63.423219 58.476091 -63.235473 58.499559 -63.092316 58.499559 -62.904569 58.487825 -62.716822 58.504253 -62.585399 58.499559 -62.540809 58.389258 -62.662845 58.342321 -62.728556 58.290691 -62.707435 58.278957 -62.629989 58.267223 -62.740290 58.208552 -62.982014 58.180390 -63.181495 58.039580 -63.026604 58.046620 -62.871713 58.121719 -62.674579 58.128759 -62.531422 58.168656 -62.475098 58.121719 -62.409387 58.081823 -62.343675 58.027845 -62.442242 58.016111 -62.540809 57.952747 -62.552544 57.889382 -62.430508 57.917544 -62.353063 57.948053 -62.209906 57.905810 -62.209906 57.877648 -62.045627 57.769694 -61.890736 57.718063 -61.846146 57.628883 -62.022159 57.546744 -62.177050 57.488073 -62.385918 57.488073 -62.397652 57.422362 -62.200518 57.434096 -61.902470 57.434096 -61.768701 57.337876 -61.846146 57.248696 -61.759313 57.225228 -61.571566 57.194719 -61.437797 57.166557 -61.372085 57.032787 -61.571566 56.943608 -61.759313 56.828613 -61.693602 56.697190 -61.825025 56.683109 -62.111339 56.762901 -62.343675 56.835653 -62.397652 56.774635 -62.132460 56.732392 -62.132460 56.701884 -62.320207 56.683109 -62.695700 56.671375 -62.871713 56.640866 -62.573665 56.605663 -62.275617 56.605663 -61.979916 56.617397 -61.747579 56.593929 -61.693602 56.551686 -61.857880 56.532911 -61.911858 56.495362 -61.979916 56.471894 -61.956447 56.441385 -61.825025 56.392101 -61.702989 56.342818 -61.670134 56.281800 -61.846146 56.300575 -61.911858 56.202008 -61.702989 56.202008 -61.482387 56.220782 -61.318108 56.227823 -61.294640 56.122215 -61.252397 56.004874 -61.174951 55.962630 -61.273518 55.906306 -61.163217 55.901613 -60.909759 55.875798 -60.722012 55.875798 -60.599977 55.814780 -60.578855 55.713866 -60.468554 55.758456 -60.292541 55.763149 -60.292541 55.652848 -60.346519 55.582443 -60.259686 55.533160 -60.215096 55.439286 -60.423964 55.321944 -60.412230 55.277355 -60.292541 55.314904 -60.193974 55.352453 -60.104794 55.321944 -60.006227 55.284395 # -b -59.839602 53.895069 -60.039083 53.726097 -60.125916 53.641611 -60.346519 53.681507 -60.557734 53.773033 -60.787724 53.810583 -61.052916 53.805889 -61.031794 53.714362 -60.710278 53.688547 -60.447432 53.622836 -60.247951 53.543043 -60.269073 53.477332 -60.269073 53.399887 -60.304275 53.273157 -60.104794 53.334175 # -b -59.982759 50.262168 -60.104794 50.262168 -60.182240 50.318492 -60.104794 50.452262 -60.215096 50.424100 -60.292541 50.339614 -60.325397 50.290330 -60.557734 50.276249 -60.853435 50.248087 -61.074037 50.226965 -61.327496 50.177682 -61.548098 50.114317 -61.658399 50.135439 -61.681868 50.205844 -61.836759 50.269208 -62.155928 50.290330 -62.453976 50.297370 -62.728556 50.290330 -62.970280 50.304411 -63.258941 50.255127 -63.500665 50.276249 -63.733002 50.304411 -63.843303 50.325533 -63.843303 50.318492 -63.864424 50.318492 -63.974726 50.318492 -64.183594 50.339614 -64.427665 50.346654 -64.702245 50.311451 -64.922847 50.269208 -65.098860 50.297370 -65.331196 50.304411 -65.638632 50.276249 -65.882703 50.297370 -66.025860 50.255127 -66.136161 50.255127 -66.255849 50.255127 -66.345029 50.219925 -66.377885 50.135439 -66.553897 50.156560 -66.732257 50.072074 # -b -80.038812 51.184474 -79.895655 51.123456 -79.773620 51.053051 -79.707908 51.074173 -79.729030 51.233758 -79.761886 51.393342 -79.719642 51.454360 -79.597607 51.454360 -79.564751 51.529459 -79.564751 51.578742 -79.729030 51.433239 -79.740764 51.440279 -79.663318 51.454360 -79.630463 51.503644 -79.553017 51.604558 -79.409860 51.632720 -79.278437 51.625679 -79.278437 51.571702 -79.046101 51.475482 -79.001511 51.337018 -78.992124 51.247839 -78.881822 51.268960 -78.748053 51.329978 -78.748053 51.398036 -78.682341 51.447320 -78.661220 51.522418 -78.804377 51.564661 -78.914678 51.653841 -79.013245 51.750061 -79.046101 51.832201 -78.935800 51.836894 -78.813764 51.850975 -78.804377 51.904953 -78.661220 51.968317 -78.583774 52.083312 -78.506329 52.156064 -78.461739 52.184226 -78.396027 52.212388 -78.264605 52.205347 -78.053390 52.191266 -77.921967 52.224122 -77.943088 52.271059 -78.011147 52.266365 -78.086245 52.259325 -78.220015 52.238203 -78.363172 52.252284 -78.494595 52.313302 -78.539184 52.421256 -78.583774 52.475233 -78.604896 52.482274 -78.715197 52.508089 -78.780908 52.634818 -78.825498 52.709917 -78.771521 52.749813 -78.748053 52.808484 -78.825498 52.841340 -78.846620 52.989190 -78.870088 53.087757 -78.891210 53.214487 -78.902944 53.327135 -78.947534 53.432742 -78.956921 53.510188 -78.956921 53.622836 -78.968655 53.714362 -78.947534 53.798848 -78.968655 53.857519 -78.992124 53.942005 -79.046101 54.052307 -79.189258 54.155567 -79.266703 54.270562 -79.365270 54.373823 -79.409860 54.439534 -79.499040 54.502899 -79.642197 54.528714 # -b -79.642197 54.528714 -79.729030 54.554529 -79.719642 54.554529 -79.597607 54.599119 -79.388739 54.643709 -79.156402 54.721155 -78.902944 54.829109 -78.637751 54.904208 -78.407762 55.019203 -78.142569 55.131851 -77.910233 55.206950 -77.645040 55.352453 -77.391582 55.509691 -77.281281 55.596524 -77.403316 55.509691 -77.645040 55.408777 -77.525352 55.514385 -77.358726 55.627033 -77.182714 55.807739 -76.962111 56.004874 -76.851810 56.148030 -76.764977 56.194967 -76.610086 56.183233 -76.455195 56.117522 -76.401218 56.129256 -76.267448 56.159765 -76.213471 56.244251 -76.312038 56.258332 -76.368362 56.361592 -76.377749 56.429651 -76.410605 56.495362 -76.478663 56.563420 -76.544375 56.483628 -76.586618 56.403835 -76.631207 56.342818 -76.708653 56.263025 -76.753243 56.300575 -76.753243 56.354552 -76.753243 56.453119 -76.764977 56.525871 -76.786099 56.629132 -76.807220 56.769942 -76.840076 56.882590 -76.875278 56.974116 -76.950377 57.032787 -76.985580 57.100846 -76.994967 57.201759 -77.006701 57.297980 -77.060678 57.398894 -77.149858 57.546744 -77.203835 57.640618 -77.260159 57.776734 -77.304749 57.858873 -77.349339 57.948053 -77.382195 58.058354 -77.459640 58.128759 -77.513617 58.196818 -77.513617 58.243754 -77.534739 58.278957 -77.701364 58.271916 -77.900845 58.330587 -78.053390 58.377524 -78.142569 58.436195 -78.229402 58.464357 -78.384293 58.539455 -78.518063 58.591086 -78.616630 58.654450 -78.780908 58.738936 -78.825498 58.802301 -78.804377 58.802301 -78.759787 58.837504 -78.804377 58.910255 -78.825498 59.008822 -78.792643 59.086268 -78.682341 59.105043 -78.539184 59.149633 -78.440617 59.189529 -78.220015 59.201263 -78.097979 59.189529 -78.032268 59.250546 -77.921967 59.250546 -77.745954 59.262281 -77.734220 59.313911 -77.745954 59.386663 -77.844521 59.419519 -77.856255 59.515739 -77.832787 59.536860 -77.755341 59.626040 -77.680243 59.616653 -77.513617 59.588491 -77.436172 59.548595 -77.239038 59.572063 -77.072412 59.593184 -77.170980 59.616653 -77.358726 59.637774 -77.447906 59.694098 -77.436172 59.799706 -77.403316 59.853683 -77.325871 59.853683 -77.239038 59.938169 -77.203835 59.987453 -77.325871 59.947557 -77.436172 59.947557 -77.569942 59.966331 -77.745954 59.982759 # -b -70.909623 60.032043 -70.710142 59.982759 -70.578720 59.931129 -70.447297 59.926435 -70.292406 59.938169 -70.083537 59.926435 # -b -69.839467 59.008822 -70.027213 58.997088 -70.006092 58.968926 # -b -69.916912 58.814035 -70.092925 58.802301 -70.259550 58.785873 -70.468418 58.666185 -70.656165 58.555883 -70.811056 58.445582 -70.644431 58.539455 -70.379239 58.699040 -70.182105 58.734243 -70.006092 58.734243 # -b -90.026942 56.931873 -89.785218 56.854428 -89.585737 56.805144 -89.376869 56.793410 -89.212591 56.798104 -89.034231 56.732392 -88.902808 56.671375 -88.759651 56.624438 -88.616494 56.568114 -88.417013 56.502403 -88.306712 56.490668 -88.163555 56.446079 -88.032133 56.342818 -87.888976 56.232517 -87.778674 56.133949 -87.712963 56.068238 -87.722350 56.000180 -87.623783 55.950896 -87.536950 55.981405 -87.426649 55.955590 -87.358591 55.913347 -87.238902 55.894572 -87.072277 55.913347 -86.940854 55.894572 -86.797697 55.826514 -86.708518 55.788965 -86.588829 55.770190 -86.487915 55.746722 -86.433938 55.739681 -86.267313 55.702132 -86.070178 55.671623 -85.959877 55.652848 -85.826107 55.608258 -85.727540 55.558975 -85.682951 55.483876 -85.539794 55.427552 -85.396637 55.382962 -85.375515 55.314904 -85.485816 55.164707 -85.539794 55.030937 -85.661829 54.904208 -85.727540 54.815028 -85.617239 54.922983 -85.474082 55.037977 -85.396637 55.169400 -85.307457 55.263274 -85.021143 55.277355 -84.734829 55.270314 -84.493105 55.270314 -84.284237 55.270314 -84.096490 55.251539 -83.962720 55.221031 -83.786708 55.206950 -83.566105 55.225724 -83.411214 55.232765 -83.291526 55.221031 -83.192958 55.258580 -82.993477 55.239805 -82.948888 55.157666 -82.805731 55.176441 -82.617984 55.138891 -82.498295 55.082567 -82.430237 55.113076 -82.376260 55.124810 -82.352792 55.045018 -82.319936 54.955838 -82.287080 54.866658 -82.298814 54.700033 -82.331670 54.509940 -82.409116 54.310459 -82.430237 54.115671 -82.331670 54.005370 -82.277693 53.876294 -82.277693 53.634570 -82.242490 53.425702 -82.221369 53.273157 -82.319936 53.181631 -82.343404 52.989190 -82.254224 52.888276 -82.167392 52.855421 -82.132189 52.782669 -81.979645 52.670021 -81.824754 52.616044 -81.669862 52.529211 -81.592417 52.407175 -81.449260 52.285140 -81.449260 52.266365 -81.693331 52.245244 -81.869343 52.184226 -82.057090 52.116168 -82.155657 52.055150 -82.143923 52.041069 -82.033622 52.062190 -81.923321 52.090353 -81.747308 52.102087 -81.693331 52.109127 -81.550174 52.144330 -81.371814 52.130249 -81.240392 52.083312 -81.118356 52.008213 -81.008055 51.933115 -80.820308 51.832201 -80.710007 51.754755 -80.623174 51.653841 -80.590318 51.529459 -80.545728 51.440279 -80.611440 51.351099 -80.745209 51.268960 -80.876632 51.184474 -81.052645 51.074173 -81.141825 51.010808 -81.031523 51.053051 -80.897754 51.123456 -80.721741 51.191515 -80.599706 51.247839 -80.512873 51.315897 -80.414306 51.322937 -80.292270 51.261920 -80.181969 51.198555 -80.038812 51.184474 # -b -82.021888 53.108879 -81.857609 53.127654 -81.714452 53.141735 -81.669862 53.155816 -81.538440 53.174590 -81.395283 53.134694 -81.296716 53.115919 -81.097235 53.108879 -80.975199 53.036127 -80.897754 52.928173 -80.864898 52.815525 -80.778065 52.695836 -80.799187 52.648899 -80.954078 52.716957 -81.141825 52.716957 -81.338959 52.801444 -81.526706 52.888276 -81.681597 52.916438 -81.857609 52.923479 -81.956176 52.956335 -82.045356 52.975109 -82.122802 52.996231 -82.078212 53.040821 -82.021888 53.108879 # -b -98.003835 54.315152 -97.980367 54.315152 -97.926389 54.348008 -97.881800 54.340967 -97.881800 54.296378 -97.837210 54.251788 -97.837210 54.211891 -97.959245 54.122712 -98.046078 53.979555 -97.935777 53.960780 -97.816088 54.071081 -97.637729 54.089856 -97.560283 53.972514 -97.595486 53.965474 -97.705787 53.960780 -97.780886 53.913843 -97.780886 53.829357 -97.771498 53.744871 -97.738643 53.672119 -97.738643 53.634570 -97.661197 53.561818 -97.595486 53.430395 -97.583751 53.324788 -97.572017 53.205099 -97.473450 53.153469 -97.372536 53.092451 -97.262235 52.993884 -97.285703 52.975109 -97.306825 52.914092 -97.273969 52.787363 -97.241114 52.674714 -97.184790 52.592575 -97.130812 52.533904 -97.065101 52.458806 -97.041633 52.379013 -97.032245 52.310955 -97.032245 52.249937 -97.041633 52.174839 -96.964187 52.109127 -96.853886 52.048109 -96.776440 51.980051 -96.767053 51.937808 -96.767053 51.883831 -96.743585 51.794651 -96.666139 51.726593 -96.579306 51.672616 -96.513595 51.597517 -96.445536 51.541193 -96.445536 51.534153 -96.412681 51.508337 -96.314114 51.437932 -96.224934 51.341712 -96.138101 51.245492 -96.138101 51.189168 -96.170957 51.135191 -96.248402 51.078867 -96.269524 51.003768 -96.236668 50.869998 -96.281258 50.738575 -96.314114 50.640008 -96.335235 50.583684 -96.501860 50.640008 -96.546450 50.513279 -96.588693 50.407672 -96.710729 50.372469 -96.811643 50.379510 -96.865620 50.520320 -96.921944 50.696332 -96.910210 50.808981 -96.877354 50.926322 -96.821030 51.050705 -96.689607 51.149272 -96.579306 51.259573 -96.600428 51.294775 -96.633283 51.245492 -96.701341 51.217330 -96.799909 51.196208 -96.799909 51.376915 -96.689607 51.534153 -96.677873 51.623332 -96.755319 51.691391 -96.853886 51.747715 -96.975921 51.719553 -97.032245 51.630373 -97.053367 51.480175 -97.184790 51.466094 -97.330293 51.644454 -97.318559 51.761796 -97.273969 51.843935 -97.583751 52.012907 -97.583751 52.019947 -97.560283 52.041069 -97.539162 52.088006 -97.572017 52.134942 -97.705787 52.127902 -97.715174 52.059844 -97.726908 51.991785 -97.726908 51.958930 -97.726908 51.904953 -97.816088 51.876791 -98.057812 51.923727 -98.102402 52.034028 -98.102402 52.188920 -98.123524 52.310955 -98.257293 52.325036 -98.367594 52.379013 -98.412184 52.386054 -98.421572 52.386054 -98.421572 52.444725 -98.489630 52.505742 -98.621053 52.559720 -98.731354 52.627778 -98.743088 52.761547 -98.808799 52.907051 -98.743088 52.953988 -98.531873 52.975109 -98.466162 53.054902 -98.632787 53.059595 -98.808799 53.059595 -98.940222 53.054902 -98.975425 53.066636 -98.984812 53.139388 -99.160825 53.167550 -99.184293 53.284892 -99.205415 53.397540 -99.184293 53.416314 -99.160825 53.489066 -99.085726 53.528962 -99.029402 53.580593 -98.996546 53.667426 -98.996546 53.751912 -98.930835 53.770686 -98.886245 53.817623 -98.752475 53.855173 -98.677377 53.843438 -98.710232 53.784767 -98.576463 53.784767 -98.445040 53.789461 -98.257293 53.763646 -98.102402 53.719056 -97.968632 53.686200 -97.926389 53.700281 -97.947511 53.796502 -98.081281 53.843438 -98.179848 53.906803 -98.212703 54.012410 -98.168113 54.089856 -98.135258 54.148527 -98.090668 54.218932 -98.156379 54.179036 -98.200969 54.200157 -98.191582 54.263522 -98.200969 54.308112 -98.388716 54.270562 -98.564729 54.270562 -98.588197 54.333927 -98.477896 54.359742 -98.388716 54.385557 -98.301883 54.404332 -98.191582 54.404332 -98.114136 54.418413 -98.036691 54.399638 -98.036691 54.355048 -98.036691 54.308112 -98.003835 54.315152 -97.959245 54.348008 # -b -94.734694 60.093060 -94.758162 59.987453 -94.791018 59.881845 -94.812139 59.771544 -94.823873 59.694098 -94.823873 59.581450 -94.823873 59.447681 -94.802752 59.290443 -94.812139 59.201263 -94.901319 59.121471 -94.988152 59.036985 -94.823873 59.013516 -94.758162 58.921990 -94.713572 58.889134 -94.624392 58.809341 -94.504704 58.757711 -94.481235 58.750671 -94.436646 58.769445 -94.382668 58.790567 -94.349813 58.727202 -94.349813 58.562924 -94.338079 58.504253 -94.272367 58.562924 -94.260633 58.706081 -94.260633 58.769445 -94.194922 58.785873 -94.030643 58.785873 -93.864018 58.797607 -93.699739 58.790567 -93.589438 58.757711 -93.455669 58.750671 -93.378223 58.774139 -93.267922 58.745977 -93.225679 58.727202 -93.225679 58.722509 -93.225679 58.717815 -93.202210 58.706081 -93.169355 58.666185 -93.136499 58.562924 -93.103643 58.417420 -93.037932 58.325893 -92.948752 58.239061 -92.850185 58.109985 -92.772739 57.992643 -92.772739 57.795509 -92.751618 57.652352 -92.641317 57.558478 -92.519281 57.469299 -92.498160 57.314408 -92.486426 57.213494 -92.507547 57.124314 -92.575605 57.039828 -92.695294 56.974116 -92.829064 56.938914 -92.850185 56.920139 -92.784474 56.896671 -92.707028 56.920139 -92.575605 56.967076 -92.465304 57.009319 -92.420714 57.016359 -92.408980 56.962382 -92.408980 56.938914 -92.408980 56.931873 -92.343269 56.931873 -92.232967 56.967076 -92.045221 57.046868 -91.869208 57.086765 -91.648605 57.143089 -91.428003 57.194719 -91.174545 57.267471 -90.965676 57.232268 -90.777930 57.213494 -90.655894 57.147782 -90.447026 57.082071 -90.346112 56.997585 -90.214689 56.967076 -90.026942 56.931873 # -b -110.136973 59.266974 -109.958613 59.396050 -109.803722 59.475843 -109.761479 59.553288 -109.738011 59.649508 -109.627709 59.682364 -109.407107 59.726954 -109.252216 59.726954 -109.252216 59.755116 -109.341395 59.811440 -109.461084 59.860724 -109.362517 59.872458 -109.285071 59.921741 -109.141915 59.910007 -108.987023 59.914701 -108.888456 59.888886 -108.700709 59.905313 -108.611530 59.905313 -108.512963 59.888886 -108.524697 59.848989 -108.667854 59.820827 -108.733565 59.771544 -108.876722 59.787972 -109.031613 59.738688 -109.163036 59.677670 -109.198239 59.609612 -109.163036 59.553288 -109.141915 59.508698 -109.010492 59.508698 -108.965902 59.548595 -108.811011 59.569716 -108.700709 59.581450 -108.611530 59.536860 -108.733565 59.492271 -108.822745 59.396050 -108.822745 59.363195 -108.688975 59.370235 -108.566940 59.407784 -108.402661 59.452374 -108.214915 59.452374 -108.083492 59.452374 -107.937988 59.447681 -107.827687 59.447681 -107.729120 59.475843 -107.663408 59.452374 -107.707998 59.407784 -107.663408 59.414825 -107.529639 59.435946 -107.529639 59.414825 -107.529639 59.363195 -107.452193 59.346767 -107.309036 59.342073 -107.177613 59.342073 -107.034457 59.335033 -106.945277 59.335033 -106.778652 59.346767 -106.647229 59.330339 -106.492338 59.323298 -106.370302 59.302177 -106.492338 59.266974 -106.680084 59.262281 -106.813854 59.266974 -106.924155 59.290443 -107.043844 59.290443 -107.111902 59.290443 -107.222203 59.285749 -107.341892 59.285749 -107.475662 59.266974 -107.585963 59.262281 -107.717386 59.295136 -107.783097 59.234119 -107.895745 59.189529 -108.083492 59.154326 -108.268892 59.126164 -108.447251 59.137898 -108.634998 59.133205 -108.778155 59.121471 -108.921312 59.121471 -109.064469 59.121471 -109.186504 59.142592 -109.350783 59.105043 -109.540876 59.058106 -109.660565 59.041678 -109.848312 58.990048 -109.982081 58.950152 # -b -111.195395 58.717815 -111.218864 58.722509 -111.207129 58.727202 -111.162540 58.757711 -111.150805 58.814035 -111.106216 58.842197 -111.031117 58.825769 -110.843370 58.877400 -110.688479 58.973620 -110.599299 59.086268 -110.477264 59.166060 -110.312985 59.177795 -110.136973 59.266974 # -b -109.982081 58.950152 -110.092383 58.938417 -110.235540 58.929030 -110.235540 58.853931 -110.247274 58.797607 -110.202684 58.767098 -110.169828 58.717815 -110.268395 58.682612 -110.399818 58.659144 -110.477264 58.675572 -110.611033 58.654450 -110.733069 58.659144 -110.876226 58.647410 -110.953671 58.642716 -111.019383 58.663838 -111.096828 58.706081 -111.174274 58.710774 -111.183661 58.717815 -111.195395 58.717815 # -b -130.052216 53.510188 -129.963036 53.449170 -129.897324 53.350603 -129.843347 53.273157 -129.831613 53.200406 -129.897324 53.200406 -129.974770 53.273157 # -b -129.819879 53.660385 -129.787023 53.667426 -129.775289 53.667426 -129.763555 53.646304 -129.742433 53.620489 -129.697843 53.587633 -129.632132 53.554778 -129.566421 53.496107 -129.521831 53.456211 -129.521831 53.404580 -129.521831 53.338869 -129.521831 53.284892 -129.587542 53.219180 -129.655600 53.291932 -129.709578 53.364684 -129.754167 53.411621 -129.798757 53.470292 -129.831613 53.521922 -129.864469 53.554778 -129.918446 53.601714 -129.974770 53.634570 # -b -130.019360 53.829357 -129.986504 53.817623 -129.953648 53.789461 -129.918446 53.751912 -129.876203 53.704975 -129.843347 53.686200 -129.819879 53.660385 # -b -129.235517 52.867155 -129.223783 52.867155 -129.202661 52.867155 -129.179193 52.853074 -129.146337 52.794403 -129.101747 52.747466 -129.059504 52.714611 -129.014914 52.653593 -129.003180 52.592575 -129.003180 52.559720 -129.068892 52.580841 -129.146337 52.639512 -129.179193 52.693489 -129.256638 52.773282 -129.256638 52.808484 -129.247251 52.841340 -129.247251 52.860114 -129.235517 52.867155 # -b -127.512940 50.421753 -127.480084 50.428793 -127.480084 50.414712 -127.468350 50.428793 -127.512940 50.548482 -127.512940 50.590725 -127.512940 50.647049 -127.733542 50.647049 -127.888434 50.661130 -127.987001 50.731535 -128.064446 50.654089 -128.097302 50.583684 -128.240459 50.625927 -128.341373 50.689292 -128.341373 50.766738 -128.296783 50.823062 -128.198216 50.884079 -128.019856 50.891120 -127.822722 50.855917 -127.656097 50.801940 -127.545796 50.780819 -127.489472 50.780819 -127.325193 50.696332 -127.104591 50.632968 -126.905110 50.583684 -126.717363 50.541441 -126.529616 50.506239 -126.463905 50.506239 -126.353603 50.485117 -126.165857 50.456955 -126.043821 50.428793 -125.912398 50.393591 -125.769241 50.372469 -125.626084 50.365429 -125.536905 50.316145 -125.471193 50.245740 -125.459459 50.210538 -125.447725 50.140133 -125.304568 50.041565 # -b -127.158568 49.971160 -127.125712 50.076768 -127.071735 50.140133 -127.125712 50.140133 -127.259482 50.196457 -127.304072 50.104930 -127.313459 50.076768 -127.402639 50.154214 -127.447229 50.203497 -127.524674 50.189416 -127.611507 50.217578 -127.712421 50.133092 -127.799254 50.147173 -127.843844 50.189416 -127.799254 50.245740 -127.799254 50.302064 -127.787520 50.337267 -127.900168 50.379510 -127.909555 50.463996 -127.745277 50.499198 -127.590385 50.485117 -127.534061 50.449915 -127.512940 50.421753 # -b -123.903507 49.957079 -123.945750 50.048606 -123.980953 50.027484 # -b -124.654495 49.964120 -124.753062 50.041565 -124.785917 50.090849 -124.708472 50.133092 -124.642761 50.168295 -124.619292 50.210538 -124.631026 50.287983 -124.675616 50.344307 -124.654495 50.386550 -124.631026 50.435834 -124.696738 50.449915 -124.762449 50.421753 -124.807039 50.393591 -124.851629 50.386550 -124.917340 50.386550 -124.973664 50.435834 -125.006520 50.513279 -125.018254 50.555522 -125.039376 50.555522 -125.062844 50.555522 -125.128555 50.534401 -125.194267 50.499198 -125.271712 50.485117 -125.370279 50.506239 -125.471193 50.527360 -125.536905 50.492158 -125.602616 50.520320 -125.668327 50.569603 -125.701183 50.513279 -125.769241 50.485117 -125.846687 50.520320 -125.924133 50.527360 -126.043821 50.534401 -126.154122 50.541441 -126.255036 50.548482 -126.386459 50.548482 -126.452170 50.590725 -126.332482 50.611846 -126.222181 50.618887 -126.121267 50.654089 -125.978110 50.668170 -125.933520 50.710413 -126.043821 50.717454 -126.144735 50.717454 -126.121267 50.766738 -126.109532 50.823062 -126.186978 50.841836 -126.276158 50.869998 -126.398193 50.884079 -126.386459 50.898160 -126.264424 50.898160 -126.177591 50.926322 -126.264424 50.996727 -126.419315 51.003768 -126.562472 51.024889 -126.618796 50.982646 -126.684507 50.940403 -126.750218 50.982646 -126.851132 50.989687 -126.949699 50.989687 -127.071735 51.003768 -127.092856 50.947444 -127.048267 50.912241 -127.137446 50.898160 -127.259482 50.933363 -127.379170 50.968565 -127.468350 51.010808 -127.534061 51.024889 -127.545796 51.031930 -127.602120 51.064786 -127.688953 51.135191 -127.733542 51.210289 -127.733542 51.273654 -127.634975 51.306510 -127.512940 51.301816 -127.414373 51.327631 -127.447229 51.376915 -127.489472 51.383955 -127.534061 51.398036 -127.634975 51.390996 -127.733542 51.376915 -127.733542 51.405077 -127.712421 51.430892 -127.611507 51.452013 -127.545796 51.466094 -127.512940 51.487216 -127.402639 51.473135 -127.325193 51.473135 -127.259482 51.501297 -127.313459 51.520072 -127.456616 51.548234 -127.489472 51.590477 -127.435494 51.637413 -127.369783 51.679656 -127.435494 51.719553 -127.447229 51.754755 -127.489472 51.773530 -127.566917 51.719553 -127.611507 51.679656 -127.656097 51.630373 -127.754664 51.609251 -127.810988 51.630373 -127.843844 51.712512 -127.855578 51.768836 -127.855578 51.843935 -127.843844 51.911993 -127.810988 51.958930 -127.810988 51.991785 -127.855578 52.005866 -127.876699 52.041069 -127.876699 52.102087 -127.843844 52.163104 -127.822722 52.224122 -127.855578 52.296874 -127.909555 52.317996 -127.909555 52.397788 -127.942411 52.451765 -128.010469 52.425950 -128.141892 52.386054 -128.219337 52.379013 -128.263927 52.371973 -128.296783 52.371973 -128.273314 52.425950 -128.240459 52.451765 -128.240459 52.505742 -128.285049 52.559720 -128.395350 52.559720 -128.496264 52.545639 -128.571363 52.526864 -128.660542 52.533904 -128.759109 52.538598 -128.794312 52.573801 -128.803699 52.646552 -128.836555 52.726345 -128.892879 52.733385 -128.946856 52.754507 -128.982059 52.787363 -129.024302 52.827259 -129.068892 52.874195 -129.080626 52.935213 -129.113481 52.975109 -129.158071 53.015006 -129.146337 53.059595 -129.101747 53.132347 -129.047770 53.193365 -129.036036 53.252036 -129.036036 53.291932 -129.036036 53.310707 -129.036036 53.331828 -129.047770 53.371725 -129.047770 53.444476 -129.068892 53.470292 -129.113481 53.503147 -129.134603 53.510188 -129.167459 53.489066 -129.223783 53.470292 -129.247251 53.456211 -129.256638 53.430395 -129.301228 53.444476 -129.322350 53.477332 -129.345818 53.477332 -129.357552 53.477332 -129.432651 53.521922 -129.488975 53.573552 -129.554686 53.606408 -129.632132 53.653345 -129.688456 53.704975 -129.721312 53.751912 -129.763555 53.784767 -129.808145 53.817623 -129.864469 53.848132 -129.941914 53.880988 # -b -130.007626 54.141486 -129.918446 54.167302 -129.941914 54.230666 # -b -130.117927 55.061446 -130.162517 55.061446 -130.216494 55.061446 -130.272818 55.073180 -130.272818 55.080220 -130.251696 55.094301 -130.293940 55.042671 -130.338529 55.012162 -130.383119 54.972266 -130.415975 54.953491 -130.505155 54.897167 -130.582600 54.871352 -130.669433 54.871352 -130.692901 54.845537 -130.746879 54.819722 -130.824324 54.904208 -130.836058 54.859618 -130.857180 54.789213 -130.934626 54.800947 -130.967481 54.897167 -130.967481 54.953491 -130.967481 55.035631 -130.857180 55.068486 -130.779734 55.042671 -130.714023 55.080220 -130.669433 55.068486 -130.636577 55.124810 -130.559132 55.136545 -130.603722 55.199909 -130.636577 55.338372 -130.714023 55.357147 -130.770347 55.319598 -130.836058 55.319598 -130.880648 55.338372 -130.890036 55.375922 -130.890036 55.390003 -130.890036 55.495610 -130.868914 55.570709 -130.925238 55.627033 -130.934626 55.737334 -130.990950 55.774884 -131.023805 55.824167 -131.077782 55.875798 -131.134106 55.993139 -131.166962 55.943856 -131.145841 56.023648 -131.089517 56.084666 -131.134106 56.133949 -131.223286 56.122215 -131.277263 56.084666 -131.342975 56.028342 -131.432155 55.997833 -131.486132 55.936815 -131.554190 55.960284 -131.631636 55.974365 -131.706734 55.929775 -131.763058 55.911000 -131.819382 55.899266 -131.795914 55.857023 -131.828770 55.781924 -131.861625 55.751415 -131.861625 55.706825 -131.939071 55.650501 -131.995395 55.664582 -132.004782 55.589484 -132.082228 55.540200 -132.159673 55.582443 -132.237119 55.650501 -132.293443 55.737334 -132.260587 55.781924 -132.171408 55.793658 -132.105696 55.842942 -132.082228 55.842942 -132.061106 55.899266 -132.039985 55.906306 -132.016517 55.967324 -131.995395 56.011914 -131.995395 56.096400 -131.995395 56.152724 -131.906215 56.194967 -131.774792 56.213742 -131.608167 56.213742 -131.596433 56.244251 -131.673879 56.255985 -131.784180 56.274760 -131.852238 56.286494 -131.929684 56.305268 -131.995395 56.335777 -132.049372 56.378020 -132.117430 56.392101 -132.204263 56.422610 -132.269975 56.469547 -132.314565 56.525871 -132.326299 56.591582 -132.326299 56.617397 -132.326299 56.683109 -132.326299 56.701884 -132.347420 56.706577 -132.380276 56.713618 -132.502311 56.720658 -132.535167 56.755861 -132.535167 56.805144 -132.591491 56.840347 -132.701792 56.847387 -132.812094 56.859122 -132.844949 56.877896 -132.877805 56.894324 -132.889539 56.913099 -132.934129 56.948301 -132.976372 56.974116 -133.032696 57.028094 -133.053818 57.070337 -132.856683 56.985851 -132.779238 56.948301 -132.767504 56.917792 -132.844949 57.039828 -132.844949 57.124314 -132.922395 57.124314 -133.011575 57.082071 -133.086673 57.082071 -133.175853 57.117273 -133.187587 57.159516 -133.208709 57.171251 -133.286154 57.178291 -133.309623 57.147782 -133.384721 57.129008 -133.506757 57.201759 -133.530225 57.236962 -133.506757 57.290939 -133.363600 57.302673 -133.241564 57.302673 -133.175853 57.356651 -133.232177 57.361344 -133.396456 57.349610 -133.473901 57.380119 -133.485635 57.403587 -133.429311 57.438790 -133.452780 57.462258 -133.539613 57.469299 -133.539613 57.539704 -133.441045 57.574906 -133.452780 57.605415 -133.530225 57.605415 -133.649914 57.574906 -133.694504 57.605415 -133.673382 57.659392 -133.640526 57.706329 -133.551347 57.694595 -133.452780 57.659392 -133.351866 57.617149 -133.241564 57.598375 -133.187587 57.570213 -133.142997 57.523276 -133.098407 57.504501 -133.044430 57.504501 -133.086673 57.516235 -133.110142 57.539704 -133.187587 57.586640 -133.208709 57.675820 -133.274420 57.706329 -133.286154 57.664086 -133.375334 57.699288 -133.452780 57.753266 -133.530225 57.804896 -133.563081 57.863567 -133.506757 57.910504 -133.297888 57.887035 -133.241564 57.905810 -133.342478 57.929278 -133.497369 57.933972 -133.607671 57.933972 -133.673382 57.933972 -133.685116 57.922238 -133.685116 57.863567 -133.762562 57.816630 -133.816539 57.858873 -133.870516 57.933972 -133.861129 57.987949 -133.739093 57.992643 -133.673382 58.027845 -133.551347 58.074782 -133.584202 58.109985 -133.661648 58.074782 -133.750828 58.051314 -133.762562 58.086516 -133.717972 58.138147 -133.649914 58.196818 -133.762562 58.192124 -133.837661 58.161615 -133.882250 58.086516 -133.959696 58.027845 -134.069997 58.058354 -134.093466 58.086516 -134.102853 58.133453 -134.135709 58.168656 -134.135709 58.232020 -134.192033 58.267223 -134.246010 58.267223 -134.323455 58.232020 -134.400901 58.283650 -134.490081 58.325893 -134.555792 58.347015 -134.633238 58.389258 -134.776395 58.400992 -134.853840 58.417420 -134.910164 58.469050 -134.987610 58.572311 -135.065055 58.623942 -135.020465 58.687306 -135.065055 58.809341 -135.130767 58.797607 -135.163622 58.778833 -135.196478 58.865666 -135.252802 58.957192 -135.351369 59.142592 -135.473405 59.290443 -135.515648 59.407784 -135.550850 59.370235 -135.593093 59.330339 -135.560238 59.295136 -135.494526 59.194222 -135.506260 59.154326 -135.583706 59.194222 -135.527382 59.121471 -135.482792 59.036985 -135.482792 58.985354 -135.417081 58.910255 -135.339635 58.797607 -135.295045 58.670878 -135.285658 58.602820 -135.285658 58.619248 -135.175357 58.452623 -135.163622 58.382218 -135.252802 58.271916 -135.295045 58.232020 -135.449936 58.248448 -135.494526 58.337628 -135.539116 58.452623 -135.625949 58.504253 -135.637683 58.405686 -135.703394 58.412726 -135.858286 58.412726 -135.968587 58.417420 -135.959200 58.476091 -135.968587 58.584045 -135.902875 58.591086 -136.001443 58.635676 -136.111744 58.750671 -136.123478 58.853931 -136.078888 58.877400 -136.189189 58.938417 -136.245513 58.933724 -136.278369 58.809341 -136.376936 58.785873 -136.522440 58.853931 -136.632741 58.933724 -136.674984 58.985354 -136.743042 58.997088 -136.731308 58.945458 -136.775898 58.921990 -136.907321 58.968926 -137.005888 59.025250 -136.951911 58.968926 -136.996501 58.929030 -137.095068 58.921990 -137.106802 58.905562 -137.062212 58.905562 -137.041091 58.905562 -136.907321 58.898521 -136.743042 58.842197 -136.698453 58.790567 -136.719574 58.778833 -136.621007 58.738936 -136.522440 58.706081 -136.522440 58.654450 -136.477850 58.630982 -136.421526 58.654450 -136.344080 58.654450 -136.266635 58.591086 -136.200924 58.520681 -136.189189 58.464357 -136.212658 58.389258 -136.334693 58.347015 -136.433260 58.337628 -136.522440 58.330587 -136.564683 58.393952 -136.543561 58.382218 -136.555296 58.295385 -136.653863 58.271916 -136.743042 58.260182 -136.820488 58.295385 -136.951911 58.365790 -137.095068 58.424461 -137.228837 58.433848 -137.339139 58.457316 -137.449440 58.527721 -137.569128 58.572311 -137.702898 58.595779 -137.646574 58.659144 -137.613718 58.710774 -137.714632 58.717815 -137.813199 58.694347 -137.834321 58.710774 -137.890645 58.734243 -137.989212 58.797607 -138.132369 58.898521 -138.200427 58.957192 -138.287260 59.018210 -138.310728 59.105043 -138.266138 59.173101 -138.242670 59.257587 -138.221549 59.342073 -138.144103 59.386663 -138.000946 59.435946 -137.824933 59.508698 -137.857789 59.548595 -137.956356 59.576757 -138.087779 59.621346 -138.155837 59.642468 -138.045536 59.576757 -137.944622 59.536860 -138.000946 59.492271 -138.087779 59.492271 -138.200427 59.515739 -138.275526 59.447681 -138.310728 59.396050 -138.397561 59.419519 -138.442151 59.407784 -138.385827 59.330339 -138.397561 59.234119 -138.421030 59.210650 -138.507862 59.217691 -138.674488 59.222384 -138.728465 59.182488 -138.728465 59.142592 -138.784789 59.182488 -138.895090 59.234119 -138.993657 59.278709 -139.136814 59.318605 -139.315174 59.346767 -139.303440 59.374929 -139.348029 59.391357 -139.458331 59.386663 -139.547510 59.414825 -139.556898 59.442987 -139.634343 59.447681 -139.723523 59.475843 -139.833824 59.487577 -139.899536 59.525126 -139.822090 59.560329 -139.768113 59.593184 -139.690667 59.604919 -139.646078 59.637774 -139.613222 59.687058 -139.613222 59.738688 -139.667199 59.771544 -139.678933 59.827868 -139.667199 59.893579 -139.634343 59.942863 -139.547510 59.987453 -139.502921 59.971025 -139.446597 59.910007 -139.434862 59.844296 -139.458331 59.792665 -139.446597 59.731648 -139.434862 59.621346 -139.348029 59.569716 -139.303440 59.604919 -139.315174 59.677670 -139.348029 59.731648 -139.348029 59.799706 -139.282318 59.827868 -139.204873 59.860724 -139.136814 59.865417 -139.214260 59.877151 -139.324561 59.905313 -139.434862 59.954597 # -b -139.711789 60.057858 -139.768113 59.982759 -139.854946 59.938169 -139.955860 59.872458 # -b -134.943020 57.283899 -134.919552 57.314408 -134.910164 57.307367 -134.886696 57.248696 -134.865574 57.182985 -134.865574 57.136048 -134.910164 56.997585 -134.886696 57.086765 -134.832719 57.056256 -134.776395 56.997585 -134.764660 56.948301 -134.809250 56.917792 -134.809250 56.877896 -134.788129 56.816878 -134.788129 56.786370 -134.755273 56.755861 -134.710683 56.603316 -134.698949 56.598623 -134.710683 56.500056 -134.722417 56.495362 -134.722417 56.457813 -134.722417 56.427304 -134.722417 56.385061 -134.722417 56.354552 -134.722417 56.281800 -134.776395 56.225476 -134.865574 56.225476 -134.877309 56.300575 -134.877309 56.361592 -134.910164 56.366286 -134.996997 56.464853 -135.065055 56.586889 -135.053321 56.647906 -134.975876 56.713618 -134.919552 56.791063 -134.919552 56.852081 -134.954754 56.805144 -134.975876 56.744127 -135.029853 56.720658 -135.107298 56.720658 -135.163622 56.751167 -135.217600 56.828613 -135.306779 56.847387 -135.384225 56.894324 -135.339635 56.894324 -135.295045 56.955342 -135.351369 56.997585 -135.285658 57.028094 -135.273924 57.093805 -135.351369 57.129008 -135.395959 57.171251 -135.449936 57.255737 -135.506260 57.279205 -135.616562 57.314408 -135.661151 57.356651 -135.616562 57.398894 -135.625949 57.445830 -135.583706 57.511542 -135.515648 57.546744 -135.461670 57.492767 -135.428815 57.473992 -135.295045 57.457564 -135.229334 57.434096 -135.142501 57.391853 -135.119033 57.344916 -135.053321 57.302673 -134.987610 57.302673 -134.943020 57.283899 # -b -134.633238 57.617149 -134.666093 57.605415 -134.677828 57.628883 -134.731805 57.746225 -134.743539 57.757959 -134.799863 57.828364 -134.820984 57.898769 -134.820984 57.969175 -134.832719 58.016111 -134.832719 58.063048 -134.799863 58.149881 -134.743539 58.173349 -134.644972 58.180390 -134.534671 58.180390 -134.433757 58.180390 -134.368045 58.173349 -134.281212 58.161615 -134.236623 58.093557 -134.147443 58.023152 -134.069997 57.957440 -134.004286 57.898769 -133.959696 57.804896 -133.938574 57.729797 -133.905719 57.699288 -133.861129 57.621843 -133.849395 57.586640 -133.870516 57.605415 -133.915106 57.652352 -133.959696 57.699288 -134.004286 57.753266 -134.048876 57.811937 -134.093466 57.847139 -134.147443 57.910504 -134.192033 57.980909 -134.213154 58.016111 -134.257744 58.074782 -134.302334 58.070088 -134.314068 58.016111 -134.358658 58.016111 -134.358658 57.945706 -134.314068 57.851833 -134.257744 57.781428 -134.180298 57.753266 -134.135709 57.706329 -134.135709 57.687554 -134.037142 57.628883 -133.983164 57.563172 -133.947962 57.523276 -134.025407 57.539704 -134.081731 57.511542 -134.093466 57.485726 -134.037142 57.462258 -133.971430 57.434096 -133.971430 57.368385 -134.060610 57.361344 -134.126321 57.380119 -134.192033 57.398894 -134.192033 57.333182 -134.180298 57.248696 -134.203767 57.225228 -134.302334 57.283899 -134.346924 57.225228 -134.391514 57.178291 -134.433757 57.124314 -134.466612 57.086765 -134.567526 57.082071 -134.621503 57.093805 -134.666093 57.136048 -134.644972 57.171251 -134.644972 57.236962 -134.621503 57.267471 -134.633238 57.290939 -134.621503 57.321448 -134.612116 57.368385 -134.567526 57.384813 -134.457225 57.380119 -134.412635 57.415321 -134.466612 57.427056 -134.534671 57.457564 -134.567526 57.504501 -134.511202 57.527970 -134.445491 57.546744 -134.391514 57.593681 -134.466612 57.586640 -134.567526 57.551438 -134.612116 57.581947 -134.633238 57.617149 # -b -134.203767 56.647906 -134.236623 56.676068 -134.314068 56.671375 -134.358658 56.732392 -134.445491 56.755861 -134.466612 56.835653 -134.433757 56.877896 -134.379779 56.889630 -134.290600 56.894324 -134.246010 56.924833 -134.135709 56.863815 -134.048876 56.786370 -133.992552 56.791063 -133.870516 56.809838 -133.837661 56.647906 -133.882250 56.647906 -134.025407 56.659641 -133.971430 56.549339 -133.959696 56.464853 -133.947962 56.373327 -133.947962 56.342818 -133.959696 56.293534 -133.971430 56.213742 -133.992552 56.140990 -134.060610 56.267719 -134.135709 56.305268 -134.159177 56.213742 -134.246010 56.293534 -134.257744 56.366286 -134.281212 56.457813 -134.168564 56.446079 -134.081731 56.549339 -134.093466 56.586889 -134.135709 56.537605 -134.203767 56.556380 -134.246010 56.598623 -134.281212 56.617397 -134.281212 56.622091 -134.203767 56.647906 # -b -133.795418 56.924833 -133.816539 56.955342 -133.837661 56.967076 -133.893985 56.990544 -133.959696 57.016359 -134.025407 57.070337 -134.016020 57.098499 -133.947962 57.117273 -133.795418 57.093805 -133.607671 57.063296 -133.473901 57.032787 -133.429311 57.032787 -133.319010 57.032787 -133.208709 57.016359 -133.154732 57.009319 -133.077286 56.948301 -133.053818 56.906058 -133.044430 56.863815 -133.053818 56.840347 -133.065552 56.767595 -133.053818 56.706577 -133.053818 56.671375 -133.086673 56.664334 -133.131263 56.706577 -133.199321 56.755861 -133.253299 56.809838 -133.351866 56.859122 -133.384721 56.852081 -133.396456 56.774635 -133.319010 56.732392 -133.265033 56.676068 -133.208709 56.636172 -133.199321 56.603316 -133.187587 56.561073 -133.187587 56.495362 -133.253299 56.488322 -133.375334 56.514137 -133.462167 56.483628 -133.595937 56.476587 -133.649914 56.579848 -133.694504 56.701884 -133.717972 56.798104 -133.717972 56.852081 -133.717972 56.877896 -133.717972 56.882590 -133.727359 56.894324 -133.762562 56.877896 -133.828273 56.877896 -133.882250 56.906058 -133.882250 56.924833 -133.849395 56.924833 -133.795418 56.924833 # -b -132.856683 56.805144 -132.844949 56.809838 -132.844949 56.805144 -132.823828 56.779329 -132.779238 56.732392 -132.734648 56.683109 -132.645468 56.610357 -132.657202 56.586889 -132.713527 56.575154 -132.755770 56.591582 -132.767504 56.544646 -132.844949 56.544646 -132.910661 56.603316 -132.934129 56.664334 -132.934129 56.732392 -132.943516 56.791063 -132.943516 56.828613 -132.910661 56.828613 -132.856683 56.805144 # -b -132.767504 56.434344 -132.701792 56.427304 -132.722914 56.354552 -132.722914 56.317003 -132.755770 56.305268 -132.800359 56.293534 -132.856683 56.317003 -132.943516 56.335777 -133.032696 56.342818 -133.086673 56.396795 -133.044430 56.446079 -132.934129 56.464853 -132.856683 56.469547 -132.788625 56.457813 -132.779238 56.453119 -132.767504 56.434344 # -b -132.105696 56.335777 -132.082228 56.312309 -132.039985 56.286494 -131.995395 56.255985 -132.028251 56.251291 -132.093962 56.225476 -132.082228 56.213742 -132.105696 56.206701 -132.159673 56.244251 -132.227732 56.267719 -132.281709 56.293534 -132.326299 56.342818 -132.338033 56.385061 -132.347420 56.434344 -132.347420 56.446079 -132.314565 56.422610 -132.260587 56.392101 -132.215997 56.373327 -132.150286 56.366286 -132.105696 56.342818 -132.105696 56.335777 # -b -135.130767 58.081823 -135.086177 58.086516 -135.074443 58.081823 -135.041587 58.051314 -135.041587 57.987949 -135.041587 57.941012 -135.130767 57.952747 -135.252802 57.964481 -135.196478 57.922238 -135.119033 57.894076 -135.119033 57.816630 -135.217600 57.800202 -135.363103 57.840099 -135.506260 57.898769 -135.661151 57.929278 -135.682273 57.910504 -135.715129 57.882342 -135.682273 57.858873 -135.649417 57.851833 -135.571972 57.823671 -135.461670 57.788468 -135.363103 57.781428 -135.306779 57.769694 -135.241068 57.776734 -135.217600 57.776734 -135.142501 57.776734 -135.041587 57.746225 -135.020465 57.633577 -134.996997 57.551438 -135.029853 57.539704 -135.020465 57.481033 -135.175357 57.523276 -135.306779 57.558478 -135.395959 57.593681 -135.506260 57.645311 -135.649417 57.706329 -135.694007 57.776734 -135.804308 57.793162 -135.825430 57.722757 -135.825430 57.682861 -135.759719 57.628883 -135.715129 57.593681 -135.694007 57.546744 -135.694007 57.497461 -135.715129 57.427056 -135.825430 57.415321 -135.935731 57.434096 -136.036645 57.485726 -136.036645 57.516235 -135.959200 57.535010 -136.024911 57.593681 -136.123478 57.633577 -136.135212 57.694595 -136.189189 57.753266 -136.266635 57.769694 -136.355815 57.828364 -136.400405 57.905810 -136.388670 57.976215 -136.266635 57.910504 -136.257248 57.964481 -136.322959 58.039580 -136.409792 58.109985 -136.421526 58.161615 -136.400405 58.215592 -136.388670 58.227326 -136.311225 58.121719 -136.233779 58.149881 -136.212658 58.227326 -136.111744 58.232020 -136.057767 58.248448 -135.959200 58.318853 -135.881754 58.283650 -135.738597 58.239061 -135.661151 58.208552 -135.604827 58.138147 -135.506260 58.121719 -135.482792 58.145187 -135.372491 58.133453 -135.252802 58.133453 -135.196478 58.109985 -135.163622 58.086516 -135.130767 58.081823 # -b -132.812094 56.035382 -132.788625 56.023648 -132.746382 55.960284 -132.645468 55.899266 -132.546901 55.838248 -132.514046 55.800699 -132.502311 55.725600 -132.603225 55.718560 -132.579757 55.695091 -132.502311 55.683357 -132.457722 55.695091 -132.370889 55.627033 -132.269975 55.540200 -132.227732 55.483876 -132.269975 55.495610 -132.380276 55.540200 -132.502311 55.594177 -132.568023 55.612952 -132.558635 55.533160 -132.469456 55.495610 -132.436600 55.469795 -132.448334 55.413471 -132.380276 55.390003 -132.314565 55.408777 -132.183142 55.352453 -132.183142 55.293782 -132.227732 55.282048 -132.192529 55.225724 -132.105696 55.251539 -132.039985 55.218684 -132.039985 55.136545 -132.093962 55.117770 -132.150286 55.049712 -132.171408 54.986347 -132.105696 55.012162 -132.039985 54.991041 -132.028251 54.927676 -132.061106 54.904208 -132.039985 54.826762 -132.049372 54.744623 -132.105696 54.782172 -132.159673 54.770438 -132.192529 54.763398 -132.293443 54.737583 -132.326299 54.833803 -132.338033 54.904208 -132.347420 54.941757 -132.392010 55.023896 -132.424866 54.991041 -132.457722 54.967572 -132.535167 54.998081 -132.568023 55.073180 -132.568023 55.136545 -132.591491 55.155319 -132.678324 55.213990 -132.812094 55.263274 -132.889539 55.282048 -132.966985 55.275008 -133.011575 55.312557 -133.154732 55.338372 -133.241564 55.368881 -133.121876 55.382962 -133.011575 55.408777 -133.044430 55.469795 -133.065552 55.540200 -133.032696 55.556628 -132.976372 55.589484 -132.988106 55.631727 -133.044430 55.664582 -133.164119 55.627033 -133.297888 55.619993 -133.419924 55.676317 -133.363600 55.763149 -133.265033 55.831208 -133.253299 55.918041 -133.286154 56.028342 -133.286154 56.096400 -133.274420 56.159765 -133.309623 56.171499 -133.342478 56.084666 -133.363600 56.058851 -133.408190 56.047117 -133.506757 56.054157 -133.584202 55.993139 -133.661648 55.955590 -133.783683 55.955590 -133.739093 56.054157 -133.649914 56.115175 -133.617058 56.152724 -133.551347 56.220782 -133.661648 56.281800 -133.694504 56.335777 -133.649914 56.366286 -133.584202 56.366286 -133.473901 56.366286 -133.429311 56.305268 -133.363600 56.331084 -133.309623 56.354552 -133.241564 56.342818 -133.110142 56.274760 -133.110142 56.190273 -133.142997 56.145684 -133.131263 56.084666 -133.065552 56.084666 -132.976372 56.084666 -132.901273 56.065891 -132.856683 56.058851 -132.812094 56.035382 # -b -131.420420 55.312557 -131.420420 55.307863 -131.375831 55.300823 -131.321853 55.345413 -131.298385 55.394696 -131.244408 55.352453 -131.244408 55.263274 -131.223286 55.218684 -131.166962 55.188175 -131.101251 55.155319 -130.990950 55.162360 -130.946360 55.181134 -130.958094 55.237458 -131.023805 55.312557 -131.044927 55.401737 -131.044927 55.446327 -131.023805 55.514385 -131.000337 55.619993 -131.044927 55.725600 -131.089517 55.788965 -131.110638 55.849982 -131.145841 55.892225 -131.211552 55.943856 -131.288998 55.960284 -131.354709 55.948549 -131.408686 55.936815 -131.497866 55.911000 -131.542456 55.868757 -131.619901 55.849982 -131.673879 55.831208 -131.596433 55.788965 -131.608167 55.751415 -131.673879 55.737334 -131.652757 55.688051 -131.718468 55.594177 -131.697347 55.570709 -131.706734 55.533160 -131.795914 55.458061 -131.730203 55.375922 -131.608167 55.345413 -131.542456 55.390003 -131.554190 55.483876 -131.554190 55.521425 -131.521334 55.476836 -131.476744 55.432246 -131.399299 55.465101 -131.375831 55.570709 -131.387565 55.638767 -131.375831 55.619993 -131.333587 55.526119 -131.321853 55.465101 -131.333587 55.401737 -131.387565 55.357147 -131.432155 55.312557 -131.420420 55.312557 # -b -133.053818 55.035631 -133.032696 55.042671 -132.999840 55.023896 -132.955251 54.960532 -132.910661 54.897167 -132.856683 54.833803 -132.800359 54.770438 -132.866071 54.725848 -132.988106 54.796253 -133.044430 54.890127 -133.131263 54.972266 -133.208709 55.023896 -133.253299 55.087261 -133.265033 55.136545 -133.274420 55.213990 -133.253299 55.256233 -133.175853 55.232765 -133.110142 55.195215 -133.065552 55.124810 -133.065552 55.068486 -133.053818 55.035631 # -b -131.631636 55.312557 -131.596433 55.293782 -131.542456 55.275008 -131.497866 55.225724 -131.443889 55.206950 -131.408686 55.124810 -131.399299 55.073180 -131.399299 55.054405 -131.486132 55.035631 -131.542456 55.113076 -131.596433 55.155319 -131.575311 55.176441 -131.587046 55.237458 -131.619901 55.289089 -131.631636 55.312557 # -b -132.061106 54.049960 -131.995395 54.064041 -131.885094 54.096897 -131.819382 54.153221 -131.763058 54.134446 -131.730203 53.998329 -131.807648 53.822317 -131.906215 53.704975 -131.950805 53.573552 -131.950805 53.477332 -131.950805 53.378765 -132.004782 53.298973 -132.072841 53.233261 -132.126818 53.277851 -132.138552 53.284892 -132.171408 53.284892 -132.248853 53.298973 -132.281709 53.306013 -132.314565 53.284892 -132.403744 53.160509 -132.436600 53.233261 -132.525780 53.273157 -132.546901 53.350603 -132.568023 53.390499 -132.535167 53.364684 -132.415478 53.411621 -132.448334 53.496107 -132.568023 53.514881 -132.636081 53.521922 -132.755770 53.561818 -132.866071 53.627530 -132.934129 53.737831 -132.966985 53.822317 -133.032696 53.939659 -133.131263 53.972514 -133.131263 54.057000 -133.121876 54.141486 -133.110142 54.179036 -132.999840 54.179036 -132.833215 54.174342 -132.678324 54.174342 -132.636081 54.153221 -132.678324 54.042919 -132.678324 53.979555 -132.612613 54.042919 -132.502311 54.108631 -132.370889 54.134446 -132.326299 54.082816 -132.281709 54.012410 -132.260587 53.895069 -132.260587 53.843438 -132.359154 53.822317 -132.448334 53.784767 -132.568023 53.737831 -132.657202 53.693241 -132.558635 53.693241 -132.457722 53.700281 -132.481190 53.653345 -132.490577 53.627530 -132.370889 53.627530 -132.314565 53.667426 -132.237119 53.719056 -132.183142 53.784767 -132.138552 53.869254 -132.093962 53.913843 -132.093962 53.953740 -132.093962 53.979555 -132.093962 54.012410 -132.093962 54.038226 -132.093962 54.042919 -132.061106 54.049960 # -b -132.150286 52.740426 -132.150286 52.754507 -132.159673 52.761547 -132.192529 52.813178 -132.171408 52.895317 -132.150286 52.975109 -132.260587 52.895317 -132.326299 52.935213 -132.305177 52.979803 -132.227732 53.054902 -132.326299 53.080717 -132.424866 53.087757 -132.359154 53.113573 -132.260587 53.139388 -132.192529 53.153469 -132.105696 53.186325 -132.016517 53.226221 -131.950805 53.259076 -131.894481 53.291932 -131.840504 53.273157 -131.763058 53.186325 -131.706734 53.113573 -131.774792 53.120613 -131.929684 53.099492 -131.939071 53.073676 -131.840504 53.059595 -131.706734 53.033780 -131.673879 52.961028 -131.751324 52.900011 -131.861625 52.928173 -131.917949 52.900011 -131.906215 52.794403 -131.971927 52.773282 -131.939071 52.707570 -131.885094 52.646552 -131.852238 52.599616 -131.828770 52.592575 -131.706734 52.580841 -131.608167 52.566760 -131.575311 52.512783 -131.575311 52.491661 -131.497866 52.486968 -131.432155 52.386054 -131.333587 52.296874 -131.265529 52.217082 -131.265529 52.163104 -131.310119 52.156064 -131.408686 52.224122 -131.542456 52.303915 -131.641023 52.350851 -131.751324 52.411869 -131.774792 52.444725 -131.763058 52.451765 -131.751324 52.458806 -131.751324 52.505742 -131.828770 52.512783 -131.950805 52.587882 -132.039985 52.667674 -132.117430 52.733385 -132.150286 52.740426 # -b -130.660046 53.979555 -130.660046 53.991289 -130.636577 54.017104 -130.603722 54.042919 -130.570866 54.064041 -130.526276 54.082816 -130.460565 54.101590 -130.404241 54.075775 -130.326795 54.017104 -130.293940 53.946699 -130.338529 53.902109 -130.394853 53.869254 -130.472299 53.902109 -130.514542 53.932618 -130.570866 53.960780 -130.624843 53.965474 -130.660046 53.979555 # -b -130.538010 53.660385 -130.559132 53.672119 -130.549745 53.667426 -130.493421 53.646304 -130.394853 53.627530 -130.272818 53.601714 -130.162517 53.554778 -130.052216 53.510188 # -b -129.974770 53.273157 -130.096805 53.364684 -130.239962 53.416314 -130.305674 53.482026 -130.427709 53.543043 -130.493421 53.606408 -130.526276 53.646304 -130.538010 53.653345 -130.538010 53.660385 # -b -129.974770 53.634570 -130.028747 53.672119 -130.052216 53.704975 -130.052216 53.737831 -130.052216 53.770686 -130.096805 53.784767 -130.150783 53.784767 -130.195372 53.822317 -130.251696 53.869254 -130.251696 53.880988 -130.251696 53.906803 -130.207107 53.913843 -130.150783 53.902109 -130.106193 53.876294 -130.063950 53.848132 -130.019360 53.829357 # -b -129.941914 53.880988 -130.007626 53.913843 -130.085071 53.960780 -130.117927 54.005370 -130.085071 54.089856 -130.007626 54.141486 # -b -129.941914 54.230666 -130.040481 54.225972 -130.117927 54.218932 -130.183638 54.218932 -130.272818 54.237707 -130.317408 54.296378 -130.371385 54.348008 -130.404241 54.385557 -130.460565 54.411372 -130.472299 54.451269 -130.460565 54.488818 -130.460565 54.559223 -130.404241 54.610853 -130.383119 54.622588 -130.338529 54.692993 -130.239962 54.725848 -130.117927 54.662484 -130.096805 54.692993 -130.162517 54.756357 -130.162517 54.807988 -130.141395 54.852577 -130.106193 54.915942 -130.028747 54.948798 -130.019360 54.991041 -130.040481 55.012162 -130.052216 55.042671 -130.063950 55.054405 -130.117927 55.061446 # -b -139.955860 59.872458 -140.054427 59.811440 -140.209318 59.766850 -140.385331 59.731648 -140.551956 59.743382 -140.716234 59.755116 -140.915715 59.776238 -141.103462 59.799706 -141.258353 59.837255 -141.455487 59.881845 -141.532933 59.910007 -141.511811 59.938169 -141.389776 59.966331 -141.401510 59.992146 # -b -141.643234 60.008574 -141.786391 59.971025 -141.931895 59.975719 -142.084439 59.987453 # -b -147.484507 60.003881 -147.505628 59.954597 -147.583074 59.931129 -147.606542 59.881845 -147.639398 59.881845 -147.749699 59.837255 -147.913978 59.792665 -147.991423 59.816134 -147.970302 59.898273 -147.925712 59.947557 -147.836532 59.975719 # -b -148.742410 60.015615 -148.885567 59.959291 -149.052193 59.975719 -149.195350 59.975719 # -b -149.394831 60.008574 -149.472276 59.987453 # -b -149.547375 60.015615 -149.636555 59.959291 -149.648289 59.848989 -149.702266 59.715220 -149.770324 59.827868 -149.812567 59.959291 -149.880626 59.898273 -149.890013 59.865417 -149.857157 59.776238 -149.934603 59.698792 # -b -158.568609 56.366286 -158.622586 56.324043 -158.601465 56.342818 -158.568609 56.342818 -158.479429 56.347511 -158.446574 56.331084 -158.390250 56.305268 -158.446574 56.267719 -158.401984 56.244251 -158.446574 56.176192 -158.491164 56.096400 -158.524019 56.042423 -158.556875 56.084666 -158.568609 56.171499 -158.556875 56.255985 -158.556875 56.281800 -158.577996 56.312309 -158.568609 56.366286 # -b -154.771430 56.556380 -154.759696 56.568114 -154.736227 56.575154 -154.693984 56.579848 -154.670516 56.591582 -154.625926 56.603316 -154.604805 56.579848 -154.604805 56.525871 -154.670516 56.469547 -154.726840 56.415570 -154.780817 56.422610 -154.792551 56.483628 -154.771430 56.556380 # -b -154.241045 56.544646 -154.295022 56.544646 -154.339612 56.544646 -154.372468 56.556380 -154.363081 56.586889 -154.306757 56.617397 -154.241045 56.629132 -154.184721 56.617397 -154.184721 56.591582 -154.184721 56.568114 -154.241045 56.544646 # -b -153.192010 57.129008 -153.203744 57.117273 -153.236600 57.093805 -153.245987 57.086765 -153.346901 57.039828 -153.389144 57.070337 -153.433734 57.117273 -153.346901 57.194719 -153.257721 57.225228 -153.203744 57.206453 -153.081709 57.206453 -152.959673 57.213494 -152.947939 57.190025 -153.048853 57.152476 -153.168542 57.136048 -153.192010 57.129008 # -b -154.837141 57.373078 -154.902853 57.368385 -154.902853 57.398894 -154.848875 57.403587 -154.747962 57.403587 -154.736227 57.492767 -154.661129 57.551438 -154.515625 57.628883 -154.449914 57.621843 -154.372468 57.659392 -154.175334 57.671126 -154.074420 57.664086 -154.130744 57.621843 -154.175334 57.581947 -154.097888 57.570213 -154.053298 57.523276 -154.020443 57.445830 -153.952384 57.427056 -153.865552 57.427056 -153.842083 57.481033 -153.842083 57.535010 -153.809228 57.570213 -153.853817 57.621843 -153.766984 57.640618 -153.865552 57.722757 -153.975853 57.800202 -153.996974 57.863567 -153.931263 57.898769 -153.788106 57.910504 -153.687192 57.816630 -153.666071 57.711023 -153.612093 57.699288 -153.522914 57.793162 -153.433734 57.835405 -153.346901 57.816630 -153.257721 57.816630 -153.192010 57.858873 -153.168542 57.898769 -153.257721 57.957440 -153.159154 57.933972 -153.091096 57.945706 -152.980795 57.933972 -152.980795 57.804896 -152.915083 57.776734 -152.861106 57.835405 -152.760192 57.905810 -152.607648 57.922238 -152.572445 57.875301 -152.595914 57.753266 -152.617035 57.729797 -152.617035 57.671126 -152.584180 57.671126 -152.572445 57.617149 -152.485612 57.610109 -152.384699 57.617149 -152.286132 57.621843 -152.241542 57.617149 -152.330721 57.516235 -152.384699 57.473992 -152.539590 57.473992 -152.640504 57.511542 -152.750805 57.535010 -152.870493 57.570213 -152.992529 57.558478 -153.048853 57.473992 -152.959673 57.469299 -152.861106 57.462258 -152.739071 57.438790 -152.682747 57.398894 -152.682747 57.349610 -152.682747 57.314408 -152.771926 57.321448 -152.849372 57.333182 -152.861106 57.403587 -152.926818 57.398894 -153.015997 57.349610 -153.192010 57.326142 -153.159154 57.326142 -153.081709 57.279205 -153.168542 57.283899 -153.379757 57.241656 -153.457202 57.194719 -153.555769 57.110233 -153.677805 57.098499 -153.710660 57.063296 -153.677805 57.021053 -153.677805 56.948301 -153.766984 56.877896 -153.898407 56.852081 -154.008708 56.816878 -154.119010 56.791063 -154.041564 56.894324 -153.931263 56.967076 -153.942997 57.009319 -154.053298 57.016359 -154.097888 57.032787 -154.107276 57.093805 -154.086154 57.140742 -154.184721 57.178291 -154.339612 57.194719 -154.395936 57.171251 -154.363081 57.147782 -154.241045 57.136048 -154.229311 57.039828 -154.229311 56.948301 -154.351346 56.906058 -154.527359 56.985851 -154.571949 57.082071 -154.593070 57.182985 -154.649394 57.279205 -154.771430 57.307367 -154.837141 57.373078 # -b -153.478324 58.109985 -153.501792 58.109985 -153.478324 58.121719 -153.445468 58.145187 -153.379757 58.156921 -153.290577 58.145187 -153.203744 58.126412 -153.159154 58.086516 -153.114564 58.039580 -153.236600 58.074782 -153.314045 58.105291 -153.379757 58.093557 -153.457202 58.086516 -153.478324 58.109985 # -b -152.793048 58.290691 -152.771926 58.295385 -152.771926 58.314159 -152.893962 58.318853 -152.980795 58.354055 -152.905696 58.365790 -152.882228 58.405686 -152.828250 58.445582 -152.793048 58.452623 -152.694481 58.476091 -152.607648 58.464357 -152.506734 58.464357 -152.384699 58.469050 -152.384699 58.424461 -152.485612 58.393952 -152.462144 58.354055 -152.330721 58.365790 -152.241542 58.412726 -152.232154 58.337628 -152.241542 58.283650 -152.164096 58.307119 -152.142975 58.227326 -152.307253 58.227326 -152.384699 58.156921 -152.551324 58.145187 -152.649891 58.168656 -152.717949 58.114678 -152.849372 58.098250 -152.861106 58.074782 -152.905696 58.063048 -152.971407 58.070088 -153.004263 58.098250 -153.048853 58.133453 -153.081709 58.173349 -153.168542 58.192124 -153.224866 58.208552 -153.147420 58.208552 -153.126298 58.271916 -153.081709 58.302425 -152.980795 58.290691 -152.905696 58.278957 -152.828250 58.278957 -152.793048 58.290691 # -b -152.682747 58.647410 -152.661625 58.619248 -152.640504 58.619248 -152.628769 58.602820 -152.607648 58.602820 -152.551324 58.635676 -152.495000 58.635676 -152.452757 58.619248 -152.462144 58.555883 -152.495000 58.532415 -152.584180 58.532415 -152.661625 58.560577 -152.682747 58.607514 -152.682747 58.647410 # -b -160.002525 56.537605 -159.915693 56.591582 -159.892224 56.591582 -159.814779 56.586889 -159.662234 56.652600 -159.540199 56.701884 -159.429898 56.706577 -159.319596 56.732392 -159.185827 56.805144 -159.054404 56.870856 -158.976958 56.835653 -158.899513 56.863815 -158.789212 56.847387 -158.732888 56.913099 -158.688298 57.032787 -158.613199 57.129008 -158.568609 57.129008 -158.491164 57.194719 -158.413718 57.236962 -158.315151 57.307367 -158.279948 57.373078 -158.193116 57.384813 -158.127404 57.349610 -157.916189 57.570213 -157.850478 57.605415 -157.794154 57.659392 -157.751911 57.741532 -157.728442 57.875301 -157.695586 57.999683 -157.674465 58.074782 -157.641609 58.173349 -157.474984 58.271916 -157.397538 58.325893 -157.463250 58.330587 -157.552430 58.325893 -157.585285 58.337628 -157.540695 58.480785 -157.486718 58.595779 -157.298971 58.663838 -157.132346 58.774139 -157.144080 58.797607 -157.209792 58.809341 -157.087756 58.858625 -157.000923 58.945458 -156.900009 59.018210 -156.813176 59.098002 -156.846032 59.133205 -156.944599 59.109736 -157.078369 59.069840 -157.233260 58.997088 -157.308359 58.938417 -157.376417 58.905562 -157.463250 58.865666 -157.597019 58.809341 -157.683852 58.774139 -157.794154 58.745977 -157.895067 58.727202 -158.017103 58.694347 -158.148526 58.663838 -158.258827 58.663838 -158.324538 58.682612 -158.401984 58.734243 -158.524019 58.785873 -158.613199 58.837504 -158.601465 58.853931 -158.568609 58.905562 -158.535753 58.968926 -158.545141 59.029944 -158.613199 59.018210 -158.667176 58.968926 -158.744622 58.929030 -158.822067 58.893828 -158.899513 58.802301 -158.944103 58.767098 -158.953490 58.767098 -158.854923 58.670878 -158.843189 58.560577 -158.854923 58.520681 -158.998080 58.433848 -159.054404 58.433848 -159.066138 58.424461 -159.176439 58.469050 -159.242151 58.532415 -159.340718 58.642716 -159.439285 58.745977 -159.549586 58.825769 -159.662234 58.858625 -159.650500 58.917296 -159.727946 58.921990 -159.781923 58.950152 -159.826513 58.905562 -159.925080 58.870359 # -b -149.934603 59.698792 -150.033170 59.731648 -150.211529 59.682364 -150.256119 59.665936 -150.265506 59.565022 -150.399276 59.464108 -150.486109 59.374929 -150.432132 59.487577 -150.432132 59.588491 -150.563555 59.543901 -150.673856 59.548595 -150.763036 59.492271 -150.840481 59.442987 -150.962516 59.342073 -151.028228 59.278709 -151.138529 59.323298 -151.281686 59.351460 -151.314542 59.335033 -151.302808 59.238812 -151.448311 59.245853 -151.600856 59.234119 -151.800337 59.189529 -151.877782 59.238812 -152.020939 59.266974 -152.020939 59.342073 -151.922372 59.363195 -151.934106 59.419519 -151.866048 59.480536 -151.767481 59.419519 -151.734625 59.475843 -151.690035 59.499311 -151.636058 59.504005 -151.525757 59.475843 -151.424843 59.464108 -151.502289 59.504005 -151.481167 59.543901 -151.370866 59.543901 -151.248830 59.597878 -151.159651 59.670630 -151.072818 59.783278 -151.159651 59.792665 -151.338010 59.726954 -151.546878 59.661243 -151.636058 59.642468 -151.722891 59.661243 -151.866048 59.705833 -151.934106 59.766850 -151.898904 59.853683 -151.800337 59.947557 # -b -152.771926 60.020308 -152.849372 59.966331 -152.915083 59.910007 -153.081709 59.905313 -153.213131 59.898273 -153.323433 59.865417 -153.159154 59.837255 -153.147420 59.766850 -153.257721 59.715220 -153.457202 59.698792 -153.457202 59.783278 -153.588625 59.766850 -153.633215 59.687058 -153.743516 59.715220 -153.698926 59.642468 -153.710660 59.569716 -153.820962 59.532167 -153.820962 59.475843 -153.942997 59.419519 -154.184721 59.396050 -154.184721 59.358501 -154.250433 59.217691 -154.295022 59.126164 -154.339612 59.065147 -154.250433 59.041678 -153.987587 59.086268 -153.820962 59.058106 -153.788106 59.006476 -153.687192 58.985354 -153.600359 58.968926 -153.522914 58.945458 -153.468936 58.905562 -153.468936 58.837504 -153.490058 58.767098 -153.544035 58.727202 -153.612093 58.694347 -153.687192 58.670878 -153.776372 58.654450 -153.931263 58.630982 -154.020443 58.579352 -154.053298 58.544149 -154.163600 58.532415 -154.184721 58.476091 -154.151865 58.429154 -154.151865 58.393952 -154.327878 58.347015 -154.262167 58.314159 -154.208189 58.302425 -154.217577 58.239061 -154.217577 58.208552 -154.417058 58.149881 -154.527359 58.173349 -154.616539 58.121719 -154.661129 58.086516 -154.780817 58.074782 -154.813673 58.063048 -154.891119 58.063048 -155.111721 58.016111 -155.146924 57.964481 -155.189167 57.933972 -155.233756 57.905810 -155.332324 57.858873 -155.421503 57.851833 -155.444972 57.828364 -155.477827 57.788468 -155.510683 57.741532 -155.564660 57.753266 -155.588129 57.757959 -155.665574 57.781428 -155.785263 57.788468 -155.808731 57.699288 -155.862708 57.652352 -155.886177 57.605415 -156.050455 57.598375 -156.116166 57.610109 -156.193612 57.485726 -156.249936 57.523276 -156.360237 57.473992 -156.503394 57.415321 -156.559718 57.403587 -156.637164 57.344916 -156.592574 57.314408 -156.482273 57.321448 -156.491660 57.236962 -156.491660 57.190025 -156.580840 57.105539 -156.702875 57.056256 -156.735731 57.028094 -156.846032 57.056256 -156.857766 57.009319 -156.900009 56.985851 -156.989189 57.002278 -157.022045 56.948301 -157.111225 56.906058 -157.188670 56.877896 -157.275503 56.835653 -157.352949 56.840347 -157.486718 56.877896 -157.597019 56.852081 -157.618141 56.786370 -157.608754 56.720658 -157.597019 56.659641 -157.751911 56.659641 -157.838743 56.706577 -157.906802 56.694843 -158.071080 56.636172 -158.148526 56.586889 -157.972513 56.603316 -157.927923 56.591582 -157.981900 56.514137 -158.071080 56.514137 -158.237705 56.514137 -158.315151 56.507096 -158.502898 56.469547 -158.622586 56.410876 -158.768090 56.331084 -158.953490 56.342818 -159.030936 56.410876 -159.098994 56.518830 -159.209295 56.525871 -159.152971 56.427304 -159.054404 56.342818 -158.899513 56.274760 -158.744622 56.251291 -158.756356 56.183233 -158.732888 56.084666 -158.789212 56.035382 -158.833802 56.035382 -158.843189 56.035382 -158.899513 56.035382 -159.021548 55.974365 -159.108381 55.943856 -159.197561 55.936815 -159.263272 55.936815 -159.319596 55.925081 -159.429898 55.911000 -159.507343 55.911000 -159.549586 55.936815 -159.561320 55.925081 -159.561320 55.875798 -159.605910 55.788965 -159.650500 55.725600 -159.695090 55.664582 -159.749067 55.601218 -159.781923 55.612952 -159.749067 55.695091 -159.749067 55.737334 -159.749067 55.807739 -159.805391 55.875798 -159.925080 55.875798 -159.993138 55.824167 # -b -169.331195 52.801444 -169.321808 52.834299 -169.321808 52.874195 -169.277218 52.907051 -169.188038 52.953988 -169.110593 53.073676 -169.000291 53.179284 -168.913458 53.284892 -168.803157 53.324788 -168.735099 53.324788 -168.591942 53.343562 -168.582555 53.411621 -168.547352 53.482026 -168.359605 53.521922 -168.207061 53.561818 -168.106147 53.536003 -168.085026 53.456211 -168.117881 53.378765 -168.261038 53.343562 -168.437051 53.277851 -168.559086 53.212140 -168.615410 53.172244 -168.725712 53.099492 -168.758567 53.066636 -168.868869 53.007965 -169.101205 52.853074 -169.178651 52.841340 -169.298339 52.787363 -169.331195 52.801444 # -b -167.840955 53.317747 -167.918400 53.371725 -167.909013 53.383459 -167.840955 53.404580 -167.763509 53.416314 -167.721266 53.416314 -167.587497 53.430395 -167.488929 53.456211 -167.345773 53.528962 -167.310570 53.627530 -167.256593 53.672119 -167.212003 53.730790 -167.089968 53.679160 -167.003135 53.737831 -167.057112 53.784767 -167.179147 53.784767 -167.277714 53.880988 -167.256593 53.953740 -167.125170 53.991289 -166.970279 54.005370 -166.859978 53.965474 -166.791919 53.888028 -166.681618 53.960780 -166.615907 54.024145 -166.550195 54.017104 -166.484484 53.965474 -166.493871 53.939659 -166.538461 53.880988 -166.681618 53.803542 -166.714474 53.730790 -166.615907 53.770686 -166.594785 53.693241 -166.693352 53.627530 -166.791919 53.601714 -166.925689 53.561818 -166.979666 53.489066 -167.134557 53.477332 -167.289448 53.430395 -167.432605 53.350603 -167.533519 53.338869 -167.676676 53.324788 -167.819833 53.317747 -167.840955 53.317747 # -b -166.130112 54.277603 -166.108990 54.270562 -166.076135 54.237707 -165.975221 54.230666 -165.930631 54.179036 -165.897775 54.134446 -166.019811 54.064041 -166.108990 54.075775 -166.207557 54.082816 -166.240413 54.153221 -166.228679 54.237707 -166.130112 54.277603 # -b -165.048221 54.648403 -165.048221 54.655443 -164.905064 54.707074 -164.827618 54.756357 -164.696196 54.845537 -164.651606 54.915942 -164.595282 54.986347 -164.496715 54.979307 -164.330089 54.972266 -164.132955 54.998081 -163.987451 55.042671 -163.888884 55.094301 -163.811439 55.113076 -163.745727 55.113076 -163.668282 55.094301 -163.647160 55.042671 -163.623692 54.979307 -163.590836 54.927676 -163.569715 54.878393 -163.546246 54.864312 -163.513391 54.845537 -163.468801 54.833803 -163.426558 54.807988 -163.349112 54.807988 -163.304522 54.782172 -163.281054 54.737583 -163.316257 54.718808 -163.459414 54.751664 -163.581449 54.685952 -163.802051 54.655443 -164.055510 54.662484 -164.243256 54.662484 -164.440391 54.533408 -164.705583 54.392598 -164.827618 54.451269 -164.937920 54.495859 -164.982510 54.547489 -165.027099 54.610853 -165.048221 54.648403 # -b -162.896173 54.500552 -162.940763 54.495859 -162.884439 54.514633 -162.795259 54.521674 -162.729548 54.500552 -162.696692 54.455962 -162.708426 54.437188 -162.830462 54.418413 -162.884439 54.481778 -162.896173 54.500552 # -b -160.732391 55.368881 -160.809837 55.439286 -160.798103 55.408777 -160.798103 55.375922 -160.786368 55.368881 -160.744125 55.368881 -160.720657 55.413471 -160.676067 55.446327 -160.643211 55.401737 -160.643211 55.357147 -160.643211 55.312557 -160.622090 55.275008 -160.610356 55.270314 -160.610356 55.251539 -160.631477 55.206950 -160.744125 55.237458 -160.819224 55.213990 -160.863814 55.213990 -160.887282 55.289089 -160.908404 55.413471 -160.863814 55.432246 -160.842692 55.368881 -160.786368 55.352453 -160.732391 55.368881 # -b -160.854427 58.846891 -160.830958 58.858625 -160.854427 58.778833 -160.896670 58.710774 -160.985849 58.619248 -161.084416 58.595779 -161.161862 58.612207 -161.185330 58.699040 -161.152475 58.738936 -161.051561 58.757711 -160.941259 58.809341 -160.875548 58.842197 -160.854427 58.846891 # -b -165.688907 60.003881 -165.745231 59.975719 -165.897775 59.987453 -165.954099 59.942863 -166.064401 59.931129 -166.097256 59.910007 -166.186436 59.872458 -166.228679 59.804400 -166.416426 59.848989 -166.615907 59.872458 -166.749676 59.898273 -166.881099 59.942863 -166.991400 59.982759 -167.113436 59.975719 -167.212003 59.999187 # -b -163.435945 55.188175 -163.349112 55.195215 -163.292788 55.218684 -163.205955 55.244499 -163.149631 55.282048 -163.083920 55.289089 -163.006474 55.251539 -162.917295 55.289089 -162.907907 55.345413 -162.830462 55.375922 -162.675571 55.413471 -162.663836 55.465101 -162.675571 55.502651 -162.652102 55.526119 -162.598125 55.551934 -162.497211 55.650501 -162.398644 55.702132 -162.309464 55.751415 -162.199163 55.807739 -162.046619 55.861717 -161.901115 55.911000 -161.769692 55.960284 -161.638269 55.993139 -161.537356 56.011914 -161.471644 56.016608 -161.438789 56.042423 -161.382464 56.058851 -161.295632 56.072932 -161.218186 56.042423 -161.152475 56.035382 -161.030439 56.054157 -160.964728 56.058851 -160.974115 56.011914 -161.030439 55.960284 -160.952994 55.880491 -160.854427 55.857023 -160.776981 55.887532 -160.765247 55.936815 -160.744125 55.929775 -160.631477 55.911000 -160.511789 55.861717 -160.401487 55.849982 -160.345163 55.849982 -160.356898 55.849982 -160.356898 55.861717 -160.401487 55.906306 -160.544644 55.936815 -160.643211 55.960284 -160.622090 55.974365 -160.598622 56.058851 -160.589234 56.096400 -160.544644 56.171499 -160.422609 56.244251 -160.279452 56.392101 -160.213741 56.422610 -160.002525 56.537605 # -b -159.925080 58.870359 -160.002525 58.825769 -160.103439 58.853931 -160.190272 58.905562 -160.258330 58.893828 -160.312308 58.933724 -160.368632 58.957192 -160.389753 59.006476 -160.378019 59.074534 -160.324042 59.121471 -160.324042 59.222384 -160.356898 59.302177 -160.434343 59.229425 -160.521176 59.137898 -160.610356 59.058106 -160.744125 58.990048 -160.854427 58.938417 -160.964728 58.929030 -161.051561 58.938417 -161.194718 58.877400 -161.328487 58.825769 -161.459910 58.797607 -161.504500 58.774139 -161.516234 58.745977 -161.614801 58.687306 -161.692247 58.663838 -161.847138 58.623942 -162.034885 58.635676 -162.199163 58.654450 -162.067740 58.717815 -161.912849 58.722509 -161.736837 58.825769 -161.659391 58.830463 -161.725102 58.877400 -161.814282 58.865666 -161.835404 59.018210 -161.736837 59.086268 -161.647657 59.114430 -161.748571 59.149633 -161.891728 59.149633 -161.978561 59.109736 -162.079475 59.245853 -162.056006 59.318605 -161.990295 59.330339 -161.969173 59.370235 -161.826016 59.464108 -161.781426 59.504005 -161.781426 59.553288 -161.879994 59.633081 -161.936318 59.715220 -161.978561 59.792665 -162.056006 59.898273 -162.189776 59.982759 # -b -162.574657 60.081326 -162.642715 59.992146 -162.729548 59.921741 -162.839849 59.853683 -162.940763 59.783278 -163.060452 59.726954 -163.105041 59.670630 -163.227077 59.670630 -163.370234 59.705833 -163.492269 59.698792 -163.614305 59.726954 -163.689403 59.715220 -163.790317 59.738688 -163.900619 59.738688 -163.978064 59.776238 -164.121221 59.837255 -164.210401 59.905313 -164.076631 59.942863 -163.856029 59.954597 -163.802051 59.982759 -163.933474 59.982759 -164.067244 59.975719 # -b -159.993138 55.824167 -160.091705 55.824167 -160.180885 55.793658 -160.246596 55.737334 -160.333429 55.725600 -160.422609 55.718560 -160.500054 55.688051 -160.511789 55.650501 -160.610356 55.570709 -160.666680 55.594177 -160.732391 55.638767 -160.765247 55.594177 -160.819224 55.577750 -160.798103 55.514385 -160.842692 55.507344 -160.964728 55.526119 -161.051561 55.540200 -161.194718 55.476836 -161.316753 55.446327 -161.450523 55.439286 -161.570211 55.413471 -161.626535 55.465101 -161.492766 55.556628 -161.516234 55.669276 -161.647657 55.664582 -161.769692 55.608258 -161.826016 55.540200 -161.868259 55.469795 -161.891728 55.401737 -161.912849 55.338372 -162.034885 55.263274 -162.088862 55.181134 -162.156920 55.150626 -162.222631 55.176441 -162.276609 55.131851 -162.377523 55.098995 -162.443234 55.124810 -162.520680 55.117770 -162.553535 55.124810 -162.541801 55.150626 -162.541801 55.188175 -162.574657 55.237458 -162.619247 55.270314 -162.696692 55.307863 -162.708426 55.270314 -162.684958 55.213990 -162.675571 55.150626 -162.652102 55.080220 -162.762404 55.049712 -162.851583 55.030937 -162.961885 55.005122 -163.060452 55.054405 -163.137897 55.143585 -163.227077 55.150626 -163.205955 55.087261 -163.182487 55.016856 -163.227077 54.948798 -163.337378 54.908902 -163.414824 54.908902 -163.414824 54.960532 -163.391355 55.030937 -163.426558 55.087261 -163.459414 55.136545 -163.536859 55.131851 -163.546246 55.150626 -163.435945 55.188175 # -b -169.873314 56.647906 -169.894435 56.636172 -169.894435 56.617397 -169.894435 56.617397 -169.861580 56.610357 -169.784134 56.591582 -169.751279 56.603316 -169.697301 56.617397 -169.706689 56.561073 -169.774747 56.549339 -169.828724 56.603316 -169.873314 56.647906 -169.774747 56.549339 -169.828724 56.603316 -169.873314 56.647906 # -b -178.429875 51.916687 -178.450996 51.937808 -178.439262 51.951889 -178.406406 51.951889 -178.319574 51.951889 -178.230394 51.951889 -178.141214 51.923727 -178.075503 51.869750 -177.988670 51.862710 -177.843166 51.855669 -177.876022 51.815773 -177.965201 51.787611 -177.976936 51.686697 -178.054381 51.630373 -178.152948 51.644454 -178.242128 51.679656 -178.218660 51.719553 -178.185804 51.773530 -178.296105 51.843935 -178.418141 51.876791 -178.429875 51.916687 # -b -177.822045 51.686697 -177.789189 51.719553 -177.700009 51.747715 -177.610829 51.754755 -177.500528 51.780570 -177.434817 51.801692 -177.390227 51.855669 -177.336250 51.930768 -177.279926 51.916687 -177.237683 51.904953 -177.247070 51.855669 -177.303394 51.787611 -177.357371 51.733634 -177.523996 51.705472 -177.589708 51.705472 -177.732865 51.686697 -177.822045 51.686697 # -b -177.038202 51.808732 -177.026467 51.808732 -176.993612 51.808732 -176.927900 51.829854 -176.927900 51.883831 -176.960756 51.944849 -176.895045 51.973011 -176.805865 52.005866 -176.751888 51.980051 -176.751888 51.904953 -176.773009 51.855669 -176.695564 51.843935 -176.585262 51.848629 -176.531285 51.855669 -176.507817 51.773530 -176.531285 51.768836 -176.618118 51.740674 -176.707298 51.726593 -176.805865 51.691391 -176.862189 51.651494 -176.939635 51.637413 -176.972490 51.698431 -177.014733 51.705472 -177.026467 51.787611 -177.038202 51.808732 # -b -174.454336 52.386054 -174.498926 52.386054 -174.442602 52.404828 -174.367503 52.425950 -174.245468 52.386054 -174.189144 52.357892 -174.189144 52.271059 -174.299445 52.249937 -174.322913 52.181879 -174.355769 52.141983 -174.433215 52.095046 -174.520048 52.113821 -174.576372 52.066884 -174.719529 52.059844 -174.818096 52.095046 -174.818096 52.113821 -174.740650 52.156064 -174.665551 52.181879 -174.597493 52.217082 -174.487192 52.249937 -174.454336 52.296874 -174.454336 52.343811 -174.454336 52.386054 # -b -174.156288 52.156064 -174.212612 52.149023 -174.189144 52.156064 -174.123432 52.156064 -174.057721 52.149023 -174.001397 52.149023 -173.881708 52.149023 -173.771407 52.156064 -173.682227 52.127902 -173.548458 52.113821 -173.438157 52.127902 -173.351324 52.127902 -173.241022 52.113821 -173.229288 52.080965 -173.339589 52.052803 -173.515602 52.052803 -173.649372 52.041069 -173.771407 52.048109 -173.902830 52.066884 -174.001397 52.066884 -174.102311 52.113821 -174.156288 52.156064 # -b -172.698903 52.418909 -172.677782 52.411869 -172.654314 52.397788 -172.588602 52.386054 -172.490035 52.386054 -172.478301 52.339117 -172.621458 52.282793 -172.755228 52.282793 -172.755228 52.364932 -172.698903 52.418909 -172.755228 52.364932 -172.698903 52.418909 # -b -170.546856 57.201759 -170.558590 57.225228 -170.523387 57.236962 -170.448289 57.225228 -170.403699 57.178291 -170.457676 57.182985 -170.535121 57.178291 -170.546856 57.201759 -170.546856 57.201759 # -b 172.297595 52.928173 172.241271 52.928173 172.241271 52.935213 172.285860 52.939907 172.363306 52.961028 172.429017 52.975109 172.473607 53.015006 172.539319 53.007965 172.661354 52.986844 172.750534 52.993884 172.849101 52.975109 172.938281 52.975109 172.950015 52.928173 173.048582 52.935213 173.069703 52.907051 173.135415 52.860114 173.093172 52.834299 173.015726 52.808484 172.860835 52.787363 172.750534 52.747466 172.705944 52.794403 172.640233 52.820218 172.640233 52.895317 172.572174 52.867155 172.506463 52.874195 172.407896 52.888276 172.297595 52.914092 172.297595 52.928173 # -b 177.441857 52.141983 177.486447 52.195960 177.498181 52.195960 177.498181 52.181879 177.507569 52.113821 177.507569 52.073925 177.498181 52.034028 177.465326 51.991785 177.486447 51.965970 177.397267 51.944849 177.275232 51.923727 177.143809 51.829854 177.110954 51.911993 177.254110 51.980051 177.364412 52.048109 177.441857 52.141983 # -b 178.512014 51.665575 178.523748 51.686697 178.547217 51.691391 178.622315 51.686697 178.767819 51.630373 178.910976 51.541193 179.042399 51.480175 179.143313 51.452013 179.241880 51.437932 179.274735 51.376915 179.152700 51.369874 179.042399 51.390996 178.878120 51.480175 178.744351 51.548234 178.612928 51.597517 178.523748 51.637413 178.512014 51.665575 # -b 179.417892 52.041069 179.462482 52.034028 179.483604 52.019947 179.551662 51.991785 179.561049 51.951889 179.516460 51.904953 179.396771 51.897912 179.331060 51.951889 179.340447 51.973011 179.373303 51.998826 179.417892 52.041069 # -b 170.375537 60.048470 170.366149 59.971025 170.309825 59.938169 170.222992 59.942863 170.089223 59.971025 # -b 164.998937 59.804400 164.977816 59.799706 164.811191 59.820827 164.736092 59.942863 # -b 164.557732 60.036736 164.327743 59.959291 164.172851 59.848989 164.104793 59.935822 163.961636 59.975719 163.719912 59.886539 163.532165 59.860724 163.421864 59.792665 163.398396 59.694098 163.266973 59.581450 163.245852 59.452374 163.311563 59.330339 163.245852 59.274015 163.090960 59.227078 163.090960 59.154326 163.133203 59.086268 162.947804 59.119124 162.879745 59.069840 162.903214 58.973620 162.781178 58.853931 162.527720 58.699040 162.283649 58.515987 162.161614 58.377524 162.051312 58.208552 161.985601 58.086516 161.985601 57.910504 162.051312 57.800202 162.173348 57.746225 162.307118 57.722757 162.361095 57.765000 162.426806 57.898769 162.649755 57.933972 162.814034 57.882342 163.022902 57.804896 163.201262 57.757959 163.222383 57.664086 163.144938 57.574906 163.022902 57.473992 162.802300 57.368385 162.724854 57.272164 162.715467 57.152476 162.724854 57.063296 162.748323 56.936567 162.748323 56.821572 162.748323 56.713618 162.802300 56.683109 162.903214 56.683109 163.079226 56.701884 163.189528 56.615051 163.210649 56.495362 163.245852 56.366286 163.266973 56.255985 163.234117 56.145684 163.112082 56.040076 163.046371 55.986099 163.001781 55.979058 162.968925 55.979058 162.825768 56.028342 162.691998 56.157418 162.638021 56.225476 162.649755 56.237210 162.703733 56.305268 162.846890 56.359246 162.968925 56.476587 162.924335 56.518830 162.814034 56.446079 162.703733 56.446079 162.515986 56.420263 162.229672 56.359246 162.239059 56.305268 162.295383 56.267719 162.316505 56.244251 162.339973 56.232517 162.361095 56.176192 162.173348 56.115175 162.051312 56.065891 161.908156 55.929775 161.830710 55.800699 161.720409 55.669276 161.654697 55.495610 161.642963 55.364188 161.675819 55.237458 161.776733 55.080220 161.887034 54.998081 162.018457 54.890127 162.128758 54.789213 162.074781 54.692993 161.931624 54.603813 161.786120 54.526367 161.565518 54.488818 161.344915 54.488818 161.234614 54.585038 160.936566 54.545142 160.605662 54.430147 160.331082 54.270562 160.098746 54.146180 # -b 159.997832 53.153469 160.009566 53.146428 # -b 159.997832 59.194222 160.065890 59.234119 160.164457 59.306871 160.340470 59.358501 160.462505 59.525126 160.650252 59.586144 160.927178 59.654202 161.157168 59.799706 161.368383 59.954597 # -b 164.369986 59.170754 164.402841 59.177795 164.271419 59.102696 164.017960 59.058106 163.741034 59.013516 163.642467 58.954845 163.785624 58.933724 163.696444 58.790567 163.576755 58.659144 163.475841 58.567617 163.365540 58.452623 163.487576 58.497212 163.764502 58.640369 164.071938 58.762405 164.438044 58.842197 164.614056 58.950152 164.581201 59.102696 164.513143 59.182488 164.369986 59.170754 # -b 166.479790 60.008574 166.390611 59.971025 166.313165 59.921741 166.235720 59.853683 166.158274 59.804400 166.092563 59.811440 166.080828 59.853683 166.137152 59.898273 166.158274 59.954597 # -b 165.088117 60.069592 165.099851 59.999187 165.088117 59.954597 165.043527 59.877151 165.010672 59.860724 # -b 165.982261 55.319598 166.038585 55.300823 166.181742 55.289089 166.202864 55.282048 166.181742 55.270314 166.181742 55.244499 166.181742 55.195215 166.214598 55.136545 166.268575 55.098995 166.280309 55.035631 166.357755 54.953491 166.489178 54.897167 166.557236 54.807988 166.590092 54.744623 166.611213 54.692993 166.611213 54.700033 166.611213 54.692993 166.601826 54.737583 166.479790 54.700033 166.336633 54.796253 166.214598 54.845537 166.116031 54.948798 166.047973 55.030937 165.970527 55.131851 165.860226 55.244499 165.827370 55.263274 165.827370 55.307863 165.871960 55.307863 165.937671 55.312557 165.982261 55.319598 165.982261 55.312557 165.982261 55.319598 # -b 167.308223 54.871352 167.317611 54.878393 167.362200 54.852577 167.427912 54.789213 167.538213 54.681259 167.627393 54.707074 167.648514 54.685952 167.737694 54.648403 167.836261 54.566264 167.880851 54.533408 167.826874 54.514633 167.782284 54.552183 167.671983 54.636669 167.549947 54.681259 167.439646 54.681259 167.350466 54.819722 167.308223 54.871352 # -b 160.098746 54.146180 159.899265 54.005370 159.878143 53.829357 159.878143 53.672119 159.887530 53.554778 159.887530 53.435089 159.910999 53.390499 159.922733 53.291932 159.988444 53.219180 159.997832 53.153469 # -b 160.009566 53.146428 159.866409 53.172244 159.699784 53.219180 159.490915 53.172244 159.282047 53.125307 158.983999 52.993884 158.805639 52.881236 158.718807 52.932866 158.608505 52.939907 158.519326 52.846033 158.608505 52.806137 158.585037 52.733385 158.552181 52.639512 158.519326 52.620737 158.474736 52.559720 158.486470 52.451765 158.507591 52.357892 158.474736 52.214735 158.409024 52.099740 158.254133 51.876791 158.078121 51.733634 157.857518 51.581089 157.658037 51.491910 157.503146 51.334672 157.315399 51.182127 157.073675 51.064786 156.874194 50.919282 156.829604 50.898160 156.820217 50.933363 156.787361 51.050705 156.719303 51.168046 156.620736 51.320591 156.599614 51.555274 156.599614 51.815773 156.587880 52.059844 156.486966 52.317996 156.322688 52.545639 156.224121 52.813178 156.167797 53.059595 156.146675 53.350603 156.045761 53.573552 155.968316 53.796502 155.926073 53.958433 155.881483 53.998329 155.858015 54.057000 155.804037 54.256481 155.759448 54.488818 155.693736 54.648403 155.682002 54.953491 155.628025 55.181134 155.604556 55.432246 155.604556 55.643461 155.628025 55.929775 155.738326 56.176192 155.858015 56.446079 155.935460 56.683109 156.057496 56.809838 156.289832 56.882590 156.531556 57.002278 156.653592 57.032787 156.808483 57.091458 156.907050 57.265124 157.040819 57.492767 156.984495 57.680514 156.897663 57.800202 157.073675 57.816630 157.449169 57.765000 157.636916 57.870607 157.747217 57.969175 158.078121 57.969175 158.420759 58.063048 158.674217 58.236714 158.939409 58.386911 159.204601 58.508947 159.413470 58.670878 159.624685 58.802301 159.777229 58.898521 159.810085 59.069840 159.943855 59.149633 159.997832 59.194222 # -b 154.665822 60.086020 154.546134 59.935822 154.424098 59.816134 154.379508 59.816134 154.269207 59.860724 154.191762 59.816134 154.280941 59.710526 154.358387 59.604919 154.236352 59.541554 154.224617 59.468802 154.412364 59.480536 154.600111 59.504005 154.776124 59.459415 154.987339 59.419519 155.107027 59.323298 155.163351 59.234119 155.142230 59.154326 154.954483 59.154326 154.886425 59.109736 154.776124 59.149633 154.632967 59.154326 154.501544 59.159020 154.445220 59.081574 154.224617 59.041678 154.060339 59.053412 153.914835 59.142592 153.640255 59.194222 153.419653 59.130858 153.386797 59.069840 153.142726 59.041678 153.032425 58.950152 152.889268 58.893828 152.668666 58.938417 152.534896 59.013516 152.358883 58.966579 152.236848 58.870359 151.995124 58.830463 151.741666 58.818729 151.453005 58.835157 151.354438 58.905562 151.187813 59.018210 151.166691 59.074534 151.375559 59.126164 151.586775 59.126164 151.786256 59.119124 152.072570 59.137898 152.281438 59.182488 152.215726 59.250546 152.093691 59.262281 151.861354 59.290443 151.786256 59.386663 151.607896 59.480536 151.443618 59.541554 151.187813 59.569716 151.023534 59.548595 150.934354 59.431253 150.758342 59.459415 150.746608 59.496964 150.659775 59.520433 150.504884 59.586144 150.317137 59.581450 150.173980 59.621346 # -b 156.543290 50.827755 156.543290 50.877039 156.477579 50.834796 156.367278 50.771431 156.278098 50.696332 156.301566 50.647049 156.421255 50.654089 156.510435 50.750310 156.543290 50.827755 # -b 156.090351 50.717454 156.057496 50.689292 155.968316 50.632968 155.869749 50.527360 155.780569 50.421753 155.682002 50.365429 155.550579 50.337267 155.449665 50.273902 155.362832 50.273902 155.294774 50.217578 155.285387 50.090849 155.294774 50.048606 155.372220 50.018097 155.494255 50.076768 155.682002 50.175335 155.881483 50.210538 156.024640 50.330226 156.090351 50.421753 156.200653 50.513279 156.200653 50.618887 156.156063 50.710413 156.090351 50.710413 # -b 150.173980 59.621346 149.908788 59.658896 149.732775 59.698792 149.476970 59.719914 149.268102 59.710526 149.059233 59.637774 149.035765 59.581450 149.136679 59.513392 149.146066 59.459415 148.913729 59.452374 148.749451 59.407784 148.838631 59.330339 148.913729 59.330339 148.904342 59.238812 148.749451 59.215344 148.660271 59.210650 148.561704 59.215344 148.495993 59.290443 148.373957 59.367888 148.010198 59.374929 147.843573 59.330339 147.843573 59.250546 147.721537 59.234119 147.533790 59.234119 147.390633 59.262281 147.181765 59.311564 146.895451 59.351460 146.695970 59.407784 146.496489 59.440640 146.397922 59.407784 146.374454 59.222384 146.320477 59.177795 146.120996 59.142592 146.001307 59.159020 145.912127 59.238812 145.912127 59.358501 145.879272 59.367888 145.778358 59.358501 145.548368 59.391357 145.348887 59.386663 145.193996 59.403091 144.841970 59.374929 144.454743 59.367888 144.177816 59.374929 143.802323 59.351460 143.426829 59.330339 143.173371 59.330339 142.976237 59.290443 142.865935 59.250546 142.633599 59.194222 142.323816 59.069840 141.992913 58.914949 141.805166 58.743630 141.584563 58.584045 141.220804 58.429154 140.866432 58.271916 140.601239 58.086516 140.547262 57.941012 140.392371 57.774387 140.181156 57.711023 # -b 139.861986 54.146180 140.028612 54.108631 140.192890 54.031185 140.314926 53.946699 140.326660 53.810583 140.368903 53.744871 140.568384 53.653345 140.788986 53.521922 141.021323 53.423355 141.274781 53.317747 141.408551 53.296626 141.408551 53.226221 141.417938 53.179284 141.340492 53.106532 141.274781 53.052555 141.197336 53.019699 141.176214 53.019699 141.021323 53.080717 140.854698 53.146428 140.690419 53.132347 140.523794 53.153469 140.303191 53.252036 140.049733 53.259076 # -b 139.939432 53.186325 140.094323 53.198059 140.336047 53.153469 140.580118 53.059595 140.777252 53.073676 140.964999 52.961028 141.152746 52.885930 141.230191 52.754507 141.274781 52.606656 141.230191 52.519823 141.143358 52.404828 141.274781 52.310955 141.408551 52.235856 141.495384 52.167798 141.429672 52.059844 141.396817 52.031682 141.385082 51.916687 141.274781 51.827507 141.185601 51.705472 141.054179 51.658535 140.922756 51.534153 140.821842 51.430892 140.854698 51.362834 140.777252 51.313550 140.767865 51.252532 140.690419 51.238451 140.666951 51.107029 140.666951 51.001421 140.612974 50.841836 140.502672 50.724494 140.502672 50.625927 140.502672 50.478077 140.556650 50.344307 140.612974 50.161254 140.690419 50.119011 140.702153 50.032178 # -b 142.645333 54.340967 142.711044 54.366783 142.830733 54.326886 142.952768 54.134446 142.985624 53.946699 143.009092 53.730790 143.086538 53.521922 143.173371 53.350603 143.283672 53.146428 143.384586 52.813178 143.393973 52.566760 143.328262 52.329730 143.196839 52.275752 143.217961 52.073925 143.295406 51.869750 143.316528 51.698431 143.307140 51.534153 143.384586 51.548234 143.494887 51.369874 143.548864 51.182127 143.581720 51.139884 143.682634 50.834796 143.792935 50.548482 143.924358 50.273902 144.067515 50.011057 # -b 142.267492 49.975854 142.225249 50.048606 142.234637 50.182376 142.213515 50.358388 142.147804 50.492158 142.136070 50.703373 142.201781 50.919282 142.246371 51.085907 142.246371 51.231411 142.157191 51.369874 142.070358 51.498950 141.903733 51.623332 141.772310 51.691391 141.805166 51.766489 141.748842 51.890872 141.706599 52.120861 141.694865 52.317996 141.772310 52.472887 141.870877 52.639512 141.894346 52.841340 141.915467 53.012659 141.903733 53.198059 141.859143 53.331828 141.948323 53.463251 142.136070 53.521922 142.246371 53.500800 142.380140 53.430395 142.577275 53.442130 142.621864 53.500800 142.577275 53.566512 142.621864 53.658038 142.720432 53.653345 142.776756 53.686200 142.678188 53.822317 142.645333 53.920884 142.621864 53.925578 142.589009 54.010064 142.523297 54.087509 142.412996 54.204851 142.389528 54.275256 142.434118 54.301071 142.556153 54.301071 142.645333 54.340967 # -b 140.181156 57.711023 139.960553 57.605415 139.894842 57.621843 139.894842 57.617149 139.850252 57.556132 139.772807 57.469299 139.575672 57.368385 139.420781 57.265124 139.254156 57.279205 139.078143 57.147782 138.967842 57.056256 138.869275 57.009319 138.681528 56.917792 138.604083 56.821572 138.571227 56.786370 138.460926 56.798104 138.404602 56.713618 138.273179 56.615051 138.151144 56.556380 138.139409 56.476587 138.061964 56.378020 137.897685 56.317003 137.796771 56.218436 137.763916 56.183233 137.731060 56.138643 137.609025 56.065891 137.454133 55.986099 137.289855 55.911000 137.113842 55.805393 136.980073 55.744375 136.848650 55.669276 136.670291 55.589484 136.559989 55.575403 136.440301 55.514385 136.297144 55.357147 136.118784 55.275008 135.954506 55.192869 135.921650 55.192869 135.811349 55.162360 135.522688 55.016856 135.325554 54.934717 135.248108 54.782172 135.236374 54.723502 135.346676 54.685952 135.567278 54.634322 135.755025 54.540448 135.975627 54.545142 136.184496 54.552183 136.494278 54.596772 136.604579 54.622588 136.693759 54.615547 136.782939 54.596772 136.825182 54.500552 136.815794 54.423107 136.804060 54.359742 136.836916 54.315152 136.815794 54.256481 136.804060 54.218932 136.804060 54.186076 136.792326 54.094550 136.747736 53.972514 136.759470 53.770686 136.815794 53.744871 136.893240 53.829357 137.057518 53.829357 137.212409 53.932618 137.266387 54.010064 137.156085 54.108631 137.224144 54.204851 137.388422 54.270562 137.686470 54.282297 137.665349 54.223626 137.498723 54.113324 137.379035 54.094550 137.489336 53.991289 137.665349 53.932618 137.698204 53.855173 137.576169 53.737831 137.454133 53.658038 137.289855 53.620489 137.310977 53.566512 137.576169 53.547737 137.918807 53.606408 138.183999 53.679160 138.383480 53.815276 138.514903 53.920884 138.592349 53.815276 138.437457 53.653345 138.383480 53.500800 138.580614 53.566512 138.714384 53.789461 138.758974 53.958433 138.812951 54.057000 138.758974 54.061694 138.747240 54.197810 138.758974 54.282297 138.934986 54.230666 139.143855 54.186076 139.343336 54.186076 139.519348 54.230666 139.620262 54.256481 139.763419 54.256481 139.772807 54.171995 139.805662 54.256481 139.817396 54.204851 139.861986 54.146180 # -b 140.049733 53.259076 139.939432 53.186325 # -b 137.355566 54.833803 137.498723 54.934717 137.322711 54.800947 137.301589 54.718808 137.388422 54.800947 137.510458 54.744623 137.632493 54.648403 137.763916 54.622588 137.918807 54.711767 138.007987 54.793907 138.073698 54.946451 138.172265 55.023896 137.984518 55.124810 137.820240 55.162360 137.653614 55.192869 137.587903 55.091955 137.510458 54.941757 137.355566 54.833803 # -b 109.590160 55.688051 109.623016 55.688051 109.646484 55.688051 109.688727 55.676317 109.810763 55.638767 109.843618 55.533160 109.810763 55.368881 109.712195 55.148279 109.700461 54.946451 109.655871 54.775132 109.569038 54.570957 109.479859 54.366783 109.468125 54.134446 109.381292 53.892722 109.148955 53.658038 109.038654 53.547737 109.017532 53.749565 108.794583 53.679160 108.585715 53.449170 108.663160 53.430395 108.862641 53.463251 108.872028 53.296626 108.618570 53.198059 108.442558 53.085411 108.243077 52.860114 107.989618 52.707570 107.703305 52.653593 107.459234 52.613697 107.140064 52.526864 106.907727 52.343811 106.741102 52.289834 106.478257 52.249937 106.255307 52.031682 106.046439 51.766489 105.703801 51.569355 105.218006 51.452013 104.699356 51.381608 104.401308 51.402730 104.037548 51.452013 103.826333 51.562315 103.838067 51.630373 104.192439 51.705472 104.511609 51.752408 104.678234 51.740674 104.910571 51.801692 105.208619 51.827507 105.483199 51.951889 105.670945 52.127902 105.882161 52.350851 106.102763 52.484621 106.410198 52.632471 106.698859 52.780322 106.895993 52.907051 107.107208 52.986844 107.360667 53.052555 107.635246 53.179284 107.745548 53.270811 107.581269 53.205099 107.217510 53.045514 106.940583 52.986844 107.095474 53.205099 107.405257 53.336522 107.602391 53.489066 107.858196 53.697935 108.099920 53.862213 108.243077 54.057000 108.463679 54.249441 108.630304 54.423107 108.761727 54.655443 108.916618 54.864312 109.071509 55.061446 109.193545 55.199909 109.226401 55.338372 109.303846 55.533160 109.402413 55.631727 109.503327 55.681010 109.590160 55.688051 # -b 29.938576 59.924088 30.093467 59.924088 30.215502 59.963984 # -b 31.449938 60.083673 31.428816 59.980412 31.360758 59.935822 31.130768 59.912354 30.987611 59.940516 # -b 23.578653 60.006227 23.444883 59.963984 23.346316 59.980412 # -b 23.313460 60.090713 23.224280 59.996840 23.113979 59.907660 22.926232 59.858377 22.839399 59.870111 23.015412 59.935822 23.069389 59.989800 # -b 19.917590 54.934717 20.004423 54.991041 20.138192 54.984000 20.281349 54.998081 20.391650 55.002775 20.546542 55.066139 20.666230 55.136545 20.776531 55.218684 20.865711 55.300823 20.952544 55.387656 21.008868 55.488570 21.041724 55.575403 21.053458 55.669276 21.074579 55.725600 21.062845 55.662236 21.041724 55.568362 20.997134 55.436939 20.919688 55.350107 20.842243 55.249193 20.731942 55.148279 20.588785 55.061446 20.656843 54.976960 20.776531 54.991041 20.931423 54.946451 21.140291 54.946451 21.173147 55.035631 21.173147 55.204603 21.241205 55.256233 21.250592 55.300823 21.217736 55.380615 21.173147 55.380615 21.196615 55.462755 21.184881 55.544894 21.130904 55.669276 21.098048 55.774884 21.041724 55.854676 21.029990 55.953243 21.062845 55.711519 21.029990 55.779577 21.029990 55.922734 20.997134 56.028342 20.976012 56.145684 20.919688 56.255985 20.919688 56.305268 20.952544 56.389754 20.964278 56.523524 20.987747 56.633825 21.008868 56.765248 21.074579 56.856775 21.140291 56.929527 21.283448 57.044521 21.360893 57.168904 21.393749 57.323795 21.515784 57.466952 21.691797 57.586640 21.858422 57.650005 22.079025 57.673473 22.287893 57.727450 22.485027 57.762653 22.529617 57.727450 22.630531 57.626537 22.794810 57.520929 22.982556 57.420015 23.027146 57.312061 23.081123 57.246349 23.104592 57.300327 23.113979 57.354304 23.158569 57.276858 23.203159 57.187678 23.313460 57.110233 23.489473 57.056256 23.611508 57.018706 23.710075 57.018706 23.874354 57.060949 23.996389 57.091458 24.008123 57.030440 24.085569 56.971770 24.118425 57.121967 24.228726 57.187678 24.294437 57.258083 24.306171 57.412975 24.306171 57.560825 24.306171 57.661739 24.306171 57.797856 24.306171 57.879995 24.360149 57.997337 24.393004 58.114678 24.416473 58.241407 24.482184 58.347015 24.470450 58.398645 24.339027 58.415073 24.205258 58.415073 24.151280 58.339974 24.008123 58.293038 23.897822 58.375177 23.787521 58.370483 23.656098 58.391605 23.578653 58.501906 23.468351 58.581698 23.444883 58.680266 23.510594 58.771792 23.588040 58.771792 23.710075 58.788220 23.677220 58.823423 23.522328 58.835157 23.423761 58.839850 23.423761 58.868012 23.444883 58.966579 23.489473 58.994741 23.456617 59.039331 23.379172 59.046372 23.400293 59.114430 23.423761 59.163714 23.444883 59.236465 23.522328 59.276362 23.620896 59.288096 23.644364 59.292790 23.742931 59.304524 23.897822 59.339726 24.017511 59.349114 24.029245 59.389010 24.094956 59.424212 24.163014 59.433600 24.249847 59.445334 24.371883 59.501658 24.482184 59.501658 24.536161 59.501658 24.637075 59.496964 24.735642 59.496964 24.780232 59.586144 24.845944 59.557982 24.967979 59.529820 25.120523 59.541554 25.188581 59.546248 25.341126 59.546248 25.442040 59.586144 25.418571 59.647162 25.507751 59.647162 25.594584 59.630734 25.585197 59.647162 25.627440 59.696445 25.770597 59.619000 25.826921 59.635427 25.892632 59.630734 25.925488 59.647162 26.059257 59.635427 26.289247 59.586144 26.509850 59.574410 26.643619 59.557982 26.730452 59.501658 26.951055 59.461762 27.237369 59.468802 27.481439 59.468802 27.744285 59.457068 27.955500 59.496964 27.997743 59.562676 27.976622 59.663589 27.955500 59.708179 28.009477 59.790319 28.143247 59.757463 28.253548 59.696445 28.363849 59.731648 28.438948 59.825521 28.549249 59.846643 28.694753 59.802053 28.781586 59.825521 28.945864 59.879498 29.002189 59.947557 # -b 29.255647 60.006227 29.443394 59.989800 29.619406 59.956944 29.774297 59.940516 29.938576 59.924088 # -b 22.937967 58.640369 22.839399 58.652104 22.541351 58.628635 22.299627 58.633329 22.189326 58.530068 22.088412 58.541802 21.989845 58.508947 21.825567 58.541802 21.825567 58.454969 21.834954 58.398645 21.825567 58.370483 21.825567 58.316506 21.945255 58.241407 22.046169 58.213245 22.055557 58.142840 21.956989 58.056007 21.945255 57.985602 22.100146 58.091210 22.222182 58.213245 22.255038 58.283650 22.287893 58.323547 22.386460 58.311812 22.496762 58.283650 22.585941 58.283650 22.672774 58.300078 22.750220 58.370483 22.815931 58.386911 22.937967 58.415073 23.027146 58.473744 23.179691 58.485478 23.158569 58.525374 23.060002 58.565271 22.994291 58.612207 22.937967 58.623942 22.937967 58.652104 22.937967 58.640369 # -b 22.299627 58.978314 22.717364 59.046372 22.717364 59.046372 22.651653 59.062800 22.520230 59.130858 22.485027 59.095655 22.409929 59.046372 22.353605 58.983007 22.309015 58.978314 22.198713 58.978314 22.055557 58.966579 21.989845 58.931377 22.055557 58.907909 22.222182 58.907909 22.309015 58.835157 22.365339 58.743630 22.496762 58.748324 22.574207 58.835157 22.740832 58.875053 22.905111 58.891481 22.905111 58.983007 22.806544 59.034638 22.696243 59.055759 22.595329 59.102696 22.496762 59.114430 22.442784 59.074534 22.398194 59.015863 22.332483 58.987701 22.299627 58.978314 # -b 27.457971 59.022903 27.514295 59.034638 27.326548 59.027597 27.094212 58.994741 26.929933 58.926683 26.918199 58.839850 27.061356 58.715468 27.150536 58.588739 27.204513 58.426807 27.326548 58.304772 27.413381 58.149881 27.558885 58.102944 27.558885 58.241407 27.558885 58.370483 27.657452 58.497212 27.767753 58.640369 27.756019 58.806995 27.702042 58.943111 27.612862 59.006476 27.457971 59.022903 # -b 11.107571 59.123817 11.086449 59.170754 11.062981 59.170754 10.964414 59.163714 10.854112 59.220038 10.788401 59.243506 10.656978 59.227078 10.633510 59.283402 10.600654 59.332686 10.588920 59.428906 10.556064 59.602572 10.513821 59.708179 10.523209 59.764503 10.656978 59.797359 10.656978 59.863070 10.556064 59.891232 10.478619 59.874805 10.445763 59.858377 10.403520 59.863070 10.368318 59.834908 10.368318 59.769197 10.391786 59.691752 10.478619 59.614306 10.445763 59.550941 10.335462 59.534514 10.335462 59.607265 10.258016 59.680017 10.182918 59.712873 10.204039 59.668283 10.225161 59.602572 10.204039 59.557982 10.150062 59.541554 10.225161 59.461762 10.347196 59.396050 10.358930 59.292790 10.302606 59.259934 10.215773 59.231772 10.204039 59.159020 10.182918 59.107390 10.138328 59.051066 10.004558 59.015863 # -b 18.626830 60.055511 18.704276 59.973372 18.737132 59.919395 18.692542 59.841949 18.671420 59.764503 18.582241 59.719914 18.471939 59.630734 18.385106 59.550941 18.230215 59.506352 17.922780 59.428906 17.800744 59.396050 17.657588 59.417172 17.580142 59.518086 17.523818 59.546248 17.469841 59.489924 17.326684 59.518086 17.204648 59.569716 17.195261 59.534514 17.073226 59.501658 16.897213 59.590838 16.873745 59.579103 16.653142 59.595531 16.509985 59.574410 16.390297 59.590838 16.312851 59.529820 16.211937 59.501658 16.312851 59.473496 16.566309 59.496964 16.796299 59.440640 17.007514 59.396050 17.117815 59.344420 17.160058 59.283402 17.249238 59.316258 17.469841 59.292790 17.777276 59.323298 18.143382 59.360848 18.328782 59.384316 18.429696 59.400744 18.450818 59.356154 18.340517 59.311564 18.340517 59.255240 18.218481 59.255240 18.131648 59.299830 18.152770 59.248200 18.185625 59.180141 17.922780 59.067493 17.789010 58.947805 17.624732 58.931377 17.568408 58.936071 17.568408 59.051066 17.425251 59.074534 17.425251 58.959539 17.326684 58.891481 17.228117 58.828116 17.117815 58.783526 16.984046 58.788220 16.873745 58.776486 16.840889 58.692000 16.709466 58.656797 16.477129 58.696693 16.068780 58.675572 16.035924 58.645063 16.068780 58.645063 16.125104 58.640369 16.301117 58.633329 16.399684 58.623942 16.542841 58.605167 16.599165 58.581698 16.718853 58.525374 16.676610 58.478438 16.500598 58.466704 16.333972 58.497212 16.289383 58.485478 16.465395 58.438542 16.608552 58.375177 16.632021 58.328240 16.608552 58.229673 16.587431 58.166309 16.599165 58.119372 16.542841 58.060701 16.533453 58.020805 16.587431 57.955094 16.500598 57.950400 16.390297 57.978562 16.366828 57.938666 16.390297 57.884688 16.477129 57.821324 16.509985 57.732144 16.399684 57.633577 16.477129 57.567866 16.488864 57.462258 16.390297 57.361344 16.312851 57.241656 16.333972 57.103192 16.256527 56.971770 16.235405 56.765248 16.068780 56.596276 15.904502 56.366286 15.815322 56.169152 15.606454 56.169152 15.385851 56.206701 15.186370 56.176192 15.022092 56.211395 14.756899 56.218436 14.569152 56.150377 14.491707 56.047117 14.315694 56.077625 14.205393 55.960284 14.118560 55.817127 14.172537 55.598871 14.095092 55.455714 14.008259 55.413471 13.820512 55.462755 13.510730 55.455714 13.179826 55.387656 12.970958 55.425205 12.738621 55.418165 12.762089 55.469795 12.816067 55.481529 12.839535 55.537853 12.839535 55.598871 12.893512 55.655195 12.827801 55.756109 12.684644 55.873451 12.562608 56.021301 12.496897 56.119868 12.398330 56.225476 12.410064 56.291187 12.529753 56.255985 12.672910 56.248944 12.640054 56.286494 12.595464 56.347511 12.541487 56.413223 12.574343 56.450772 12.705765 56.439038 12.816067 56.474241 12.816067 56.554033 12.684644 56.657294 12.475776 56.737086 12.374862 56.852081 12.177727 56.952995 12.067426 57.133701 12.022836 57.253390 11.936003 57.384813 11.858558 57.396547 11.781112 57.389506 11.802234 57.502154 11.769378 57.567866 11.748257 57.650005 11.867945 57.732144 11.825702 57.851833 11.626221 57.828364 11.659077 57.915197 11.682545 57.985602 11.626221 58.079476 11.471330 58.107638 11.339907 58.138147 11.471330 58.236714 11.560510 58.271916 11.515920 58.293038 11.438474 58.288344 11.450209 58.304772 11.494798 58.379871 11.417353 58.422114 11.384497 58.351709 11.328173 58.316506 11.274196 58.283650 11.295317 58.316506 11.283583 58.391605 11.250728 58.433848 11.163895 58.445582 11.131039 58.497212 11.119305 58.581698 11.107571 58.623942 11.074715 58.727202 11.062981 58.795260 11.030125 58.886787 11.030125 58.983007 11.107571 59.074534 11.107571 59.107390 # -b 13.808778 58.851585 13.820512 58.926683 13.853368 59.022903 13.963669 59.095655 13.886223 59.142592 13.897958 59.259934 13.897958 59.339726 13.721945 59.372582 13.621031 59.396050 13.567054 59.412478 13.433284 59.412478 13.313596 59.377276 13.215029 59.384316 13.114115 59.367888 13.027282 59.344420 12.982692 59.266974 12.994426 59.163714 13.060137 59.046372 13.081259 58.987701 13.104727 58.926683 12.926368 59.062800 12.783211 59.107390 12.684644 59.095655 12.586077 59.011169 12.553221 58.943111 12.464041 58.823423 12.442920 58.736590 12.508631 58.675572 12.419452 58.525374 12.288029 58.450276 12.243439 58.410380 12.353740 58.454969 12.452307 58.403339 12.553221 58.462010 12.738621 58.548843 12.905246 58.623942 12.982692 58.537109 13.125849 58.577005 13.191560 58.652104 13.477874 58.696693 13.632765 58.720162 13.698477 58.771792 13.743067 58.816382 13.787656 58.839850 # -b 16.244793 56.279453 16.279995 56.305268 16.390297 56.378020 16.465395 56.493015 16.533453 56.669028 16.643755 56.852081 16.730588 56.983504 16.808033 57.152476 16.864357 57.288592 16.918334 57.335529 16.930069 57.377772 16.840889 57.330835 16.775178 57.258083 16.730588 57.168904 16.599165 56.934220 16.500598 56.852081 16.345707 56.669028 16.289383 56.523524 16.268261 56.427304 16.244793 56.328737 16.244793 56.279453 # -b 18.021347 56.964729 18.143382 57.006972 18.230215 57.084418 18.295927 57.164210 18.462552 57.241656 18.572853 57.307367 18.572853 57.347263 18.671420 57.389506 18.769987 57.431749 18.727744 57.520929 18.716010 57.727450 18.760600 57.767347 18.793456 57.767347 18.870901 57.802549 18.870901 57.856526 18.880289 57.922238 18.781722 57.943359 18.671420 57.884688 18.528263 57.922238 18.406228 57.844792 18.164504 57.685207 18.065937 57.579600 18.033081 57.478686 18.042468 57.396547 17.997879 57.300327 17.997879 57.234615 18.054203 57.187678 18.042468 57.110233 18.075324 57.114927 18.143382 57.114927 18.119914 57.056256 18.054203 57.002278 18.021347 56.964729 # -b 14.977502 55.021550 14.977502 55.047365 14.923525 55.181134 14.768633 55.256233 14.637211 55.286742 14.602008 55.185828 14.580887 55.110729 14.670066 55.054405 14.789755 55.028590 14.911790 55.028590 14.977502 55.021550 # -b 9.861401 57.560825 10.072616 57.614802 10.258016 57.668780 10.380052 57.720410 10.412907 57.696942 10.358930 57.633577 10.326075 57.537357 10.368318 57.462258 10.424642 57.342570 10.424642 57.258083 10.302606 57.152476 10.236895 57.072683 10.204039 57.002278 10.171183 56.934220 10.182918 56.863815 10.182918 56.814532 10.159449 56.802797 10.171183 56.814532 10.150062 56.718311 10.004558 56.687803 10.004558 56.638519 10.171183 56.669028 10.204039 56.645560 10.082004 56.572808 10.072616 56.511790 10.114859 56.462506 10.192305 56.530565 10.314340 56.530565 10.391786 56.469547 10.523209 56.500056 10.699221 56.511790 10.788401 56.488322 10.821257 56.413223 10.809523 56.305268 10.633510 56.206701 10.546677 56.169152 10.523209 56.206701 10.412907 56.126909 10.347196 56.194967 10.347196 56.241904 10.248629 56.225476 10.171183 56.101094 10.215773 55.972018 10.126594 55.903960 # -b 9.995171 54.385557 10.093738 54.385557 10.171183 54.448922 10.391786 54.397291 10.469232 54.326886 10.588920 54.326886 10.776667 54.359742 10.886968 54.390251 10.964414 54.352702 10.964414 54.256481 10.865847 54.186076 10.732077 54.127405 10.666366 54.028838 10.699221 53.977208 # -b 10.699221 53.977208 10.743811 53.913843 10.832991 53.958433 10.997269 54.010064 11.107571 53.984248 11.217872 53.972514 11.384497 53.972514 11.328173 54.028838 11.372763 54.042919 11.438474 54.082816 11.605100 54.164955 11.802234 54.197810 11.957125 54.216585 11.957125 54.146180 12.034571 54.179036 12.112016 54.282297 12.231705 54.359742 12.365474 54.455962 12.518019 54.474737 12.640054 54.460656 12.464041 54.397291 12.365474 54.338621 12.320884 54.282297 12.442920 54.333927 12.586077 54.364436 12.738621 54.390251 12.872391 54.397291 12.970958 54.326886 13.114115 54.275256 13.158705 54.197810 13.215029 54.190770 13.325330 54.134446 13.456753 54.139140 13.501342 54.146180 13.588175 54.075775 13.653887 53.998329 13.677355 53.925578 13.698477 53.855173 13.832246 53.822317 13.963669 53.796502 14.106826 53.775380 14.196006 53.770686 14.282839 53.730790 14.404874 53.690894 14.458851 53.756605 14.458851 53.841092 14.306307 53.880988 14.217127 53.888028 # -b 13.510730 54.467697 13.510730 54.448922 13.522464 54.404332 13.578788 54.345661 13.567054 54.301071 13.477874 54.338621 13.367573 54.319846 13.313596 54.289337 13.158705 54.308112 13.048403 54.364436 13.092993 54.411372 13.104727 54.460656 13.060137 54.545142 13.137583 54.556876 13.269006 54.512286 13.367573 54.493512 13.334717 54.545142 13.224416 54.589732 13.158705 54.641362 13.203294 54.678912 13.301862 54.667177 13.325330 54.615547 13.468487 54.608507 13.555320 54.582691 13.534198 54.519327 13.501342 54.474737 # -b 14.217127 53.888028 14.372018 53.951393 14.548031 53.991289 14.569152 53.951393 14.670066 54.010064 14.780368 54.082816 15.022092 54.160261 15.352995 54.197810 15.573598 54.237707 15.737876 54.268216 15.937357 54.301071 16.146226 54.397291 16.345707 54.507593 16.533453 54.596772 16.786912 54.646056 17.007514 54.723502 17.204648 54.775132 17.490962 54.805641 17.744420 54.845537 17.988491 54.871352 18.241949 54.871352 18.450818 54.838496 18.605709 54.793907 18.737132 54.711767 18.716010 54.641362 18.582241 54.685952 18.483673 54.730542 18.385106 54.761051 18.406228 54.692993 18.495408 54.552183 18.582241 54.437188 18.638565 54.345661 18.760600 54.312805 18.781722 54.352702 18.859167 54.390251 19.124359 54.397291 19.377818 54.430147 19.553830 54.486471 # -b 19.553830 54.486471 19.586686 54.519327 19.685253 54.563917 19.762699 54.601466 19.819023 54.653096 19.840144 54.697686 19.861266 54.716461 19.905856 54.805641 19.917590 54.934717 # -b -0.037549 50.801940 0.171319 50.769084 0.380187 50.797246 0.699357 50.858264 0.919959 50.893467 1.053729 50.928669 1.074850 50.970912 1.295453 51.060092 1.471466 51.151618 1.516055 51.276001 1.471466 51.322937 1.218007 51.329978 1.020873 51.315897 0.800271 51.329978 0.788537 51.433239 0.699357 51.503644 0.767415 51.515378 0.887104 51.543540 0.919959 51.604558 1.009139 51.667922 0.964549 51.700778 0.865982 51.728940 0.976283 51.775877 1.095972 51.804039 1.185152 51.768836 1.328309 51.796998 1.361164 51.865056 1.340043 51.904953 1.328309 51.968317 1.417488 51.961277 1.548911 52.001173 1.692068 52.109127 1.790635 52.346158 1.814104 52.515130 1.757780 52.695836 1.593501 52.836646 1.417488 52.909398 1.274331 52.942254 1.030261 52.949294 0.800271 52.916438 0.633645 52.902357 0.535078 52.808484 0.445899 52.749813 0.368453 52.796750 0.237030 52.815525 0.138463 52.822565 0.114995 52.822565 0.114995 52.829606 0.183053 52.928173 0.281620 52.989190 0.326210 53.022046 0.403656 53.087757 0.445899 53.155816 0.445899 53.261423 0.380187 53.327135 0.269886 53.404580 0.159585 53.465598 0.105608 53.524269 0.004694 53.557124 # -b -0.061018 53.655692 0.028162 53.615795 0.037549 53.615795 0.061018 53.615795 0.147851 53.601714 0.258152 53.594674 0.269886 53.601714 0.225296 53.773033 0.093873 53.836398 # -b 5.010493 53.214487 5.076204 53.254383 5.076204 53.240302 4.989371 53.141735 4.834480 53.029087 4.780503 52.935213 4.923660 52.996231 4.989371 53.101838 5.010493 53.214487 # -b 3.534334 51.351099 3.578924 51.372221 3.710346 51.379261 3.841769 51.315897 3.898093 51.301816 4.062372 51.358140 4.261853 51.372221 4.339298 51.365180 4.282974 51.398036 4.151551 51.412117 3.975539 51.398036 3.874625 51.419158 3.942683 51.508337 4.062372 51.522418 4.315830 51.564661 4.503577 51.625679 4.822746 51.674963 4.933047 51.714859 4.855602 51.754755 4.712445 51.714859 4.634999 51.700778 4.470721 51.707818 4.327564 51.743021 4.217263 51.804039 4.217263 51.904953 4.228997 51.947196 4.238384 51.968317 4.250118 51.968317 4.282974 51.994132 4.294708 51.994132 4.348685 52.041069 4.414397 52.083312 4.491842 52.144330 4.634999 52.259325 4.691323 52.447071 4.768769 52.674714 4.879070 52.862461 5.043349 52.902357 5.099673 52.916438 5.001106 52.946947 # -b 4.062372 51.761796 4.017782 51.789958 4.029516 51.789958 4.151551 51.796998 4.238384 51.743021 4.315830 51.700778 4.339298 51.667922 4.306442 51.667922 4.184407 51.714859 4.062372 51.761796 # -b 3.832382 51.693737 3.865237 51.714859 3.930949 51.721899 4.008394 51.700778 4.095227 51.674963 4.106961 51.639760 4.041250 51.646801 3.919215 51.686697 3.832382 51.693737 # -b 3.665756 51.536499 3.644635 51.461401 3.644635 51.433239 3.698612 51.433239 3.754936 51.468441 3.754936 51.508337 3.665756 51.536499 # -b 2.806815 51.095294 2.806815 51.137537 3.003949 51.205596 3.224551 51.287735 3.400564 51.337018 3.510865 51.351099 3.534334 51.351099 # -b 1.239129 49.942998 1.483200 50.057993 1.715536 50.205844 1.736658 50.283289 1.659212 50.332573 1.692068 50.508586 1.724924 50.684598 1.846959 50.900507 2.079296 50.963872 2.321020 51.010808 2.508767 51.024889 2.663658 51.053051 2.717635 51.060092 2.806815 51.095294 # -b 10.004558 59.015863 9.751100 59.015863 9.521110 59.083921 9.563353 59.006476 9.399075 58.907909 9.267652 58.839850 9.223062 58.783526 9.101027 58.731896 9.047049 58.628635 8.826447 58.569964 8.659822 58.462010 8.462687 58.311812 8.098928 58.182737 7.965158 58.288344 7.878326 58.161615 7.657723 58.060701 7.437121 58.013764 7.139072 58.072435 7.270495 58.154574 6.995916 58.166309 6.930204 58.079476 6.754192 58.131106 6.643890 58.084169 6.686133 58.206205 6.686133 58.375177 6.554711 58.253142 6.334108 58.271916 6.080650 58.358749 5.695769 58.537109 5.463432 58.696693 5.540878 58.875053 5.594855 58.999435 5.660566 58.999435 5.728625 58.931377 5.738012 58.931377 5.815457 58.947805 5.914025 58.943111 5.914025 58.966579 5.925759 58.983007 5.904637 59.051066 6.014938 59.107390 6.057181 59.170754 6.167483 59.255240 6.167483 59.288096 6.167483 59.349114 6.057181 59.344420 6.125240 59.389010 6.312986 59.506352 6.235541 59.541554 6.134627 59.480536 5.871781 59.405438 5.738012 59.445334 5.761480 59.389010 5.728625 59.339726 5.594855 59.332686 5.550265 59.417172 5.484554 59.332686 5.320275 59.316258 5.296807 59.356154 5.231096 59.384316 5.231096 59.461762 5.308541 59.546248 5.484554 59.658896 5.585468 59.630734 5.672301 59.658896 5.848313 59.651855 5.871781 59.691752 5.970349 59.748076 6.125240 59.780931 6.334108 59.825521 6.301252 59.858377 6.202685 59.813787 6.125240 59.818481 5.848313 59.809093 5.716890 59.851336 5.782602 59.902967 5.949227 59.989800 # -b 5.794336 60.083673 5.684035 59.980412 5.496288 59.919395 5.407108 59.956944 # -b 5.439964 59.741035 5.451698 59.780931 5.451698 59.841949 5.451698 59.891232 5.407108 59.912354 5.364865 59.952250 5.296807 59.947557 5.287420 59.886539 5.275685 59.834908 5.287420 59.797359 5.353131 59.769197 5.397721 59.752769 # -b 5.263951 59.159020 5.263951 59.215344 5.263951 59.276362 5.254564 59.327992 5.221708 59.356154 5.177118 59.327992 5.177118 59.266974 5.165384 59.175448 5.165384 59.163714 5.177118 59.159020 5.198240 59.163714 # -b 8.659822 54.908902 8.626966 55.009815 8.626966 55.122464 8.626966 55.230418 8.626966 55.350107 8.540133 55.451020 8.418098 55.526119 8.242085 55.587137 8.176374 55.563669 8.087194 55.563669 8.098928 55.617646 8.131784 55.737334 8.131784 55.880491 8.066072 55.979058 8.042604 56.119868 8.021482 56.267719 8.030870 56.396795 8.131784 56.542299 8.152905 56.664334 8.296062 56.917792 8.385242 57.018706 8.549520 57.114927 8.859303 57.152476 9.124495 57.168904 9.321629 57.199413 9.521110 57.283899 9.575087 57.384813 9.718244 57.478686 9.861401 57.560825 # -b 10.126594 55.903960 9.894257 55.915694 9.819158 55.880491 9.905991 55.798352 9.884870 55.730294 9.652533 55.749068 9.542232 55.725600 9.664267 55.655195 9.673654 55.617646 9.575087 55.563669 9.509376 55.512038 9.553966 55.474489 9.530497 55.443980 9.509376 55.361841 9.521110 55.275008 9.563353 55.275008 9.563353 55.237458 9.476520 55.204603 9.387341 55.167053 9.387341 55.084914 9.399075 55.028590 9.521110 55.028590 9.598556 54.991041 9.640799 54.946451 9.640799 54.901861 9.553966 54.908902 9.521110 54.934717 9.476520 54.927676 9.453052 54.908902 9.464786 54.894820 # -b 8.659822 54.908902 8.659822 54.934717 8.659822 54.857271 8.650434 54.800947 8.716146 54.742276 8.802979 54.646056 8.913280 54.577998 8.957870 54.507593 8.847568 54.460656 8.716146 54.423107 8.704411 54.385557 8.638700 54.333927 8.749001 54.326886 8.826447 54.294031 8.793591 54.230666 8.847568 54.164955 8.936748 54.120365 8.913280 54.075775 8.835834 54.068735 8.826447 53.984248 8.946136 53.932618 9.068171 53.888028 9.035315 53.859866 8.880424 53.855173 8.737267 53.848132 8.626966 53.855173 8.561255 53.782421 8.528399 53.730790 8.516665 53.620489 8.516665 53.540697 8.582376 53.409274 8.626966 53.317747 8.528399 53.395193 8.429832 53.533656 8.286675 53.559471 8.274941 53.449170 8.152905 53.442130 8.120050 53.573552 8.021482 53.679160 7.735169 53.709669 7.425386 53.683854 7.237640 53.653345 7.183662 53.566512 7.106217 53.521922 7.049893 53.442130 7.061627 53.416314 7.139072 53.395193 7.261108 53.383459 7.347941 53.343562 7.437121 53.291932 7.481710 53.191018 7.446508 53.198059 7.359675 53.296626 7.082748 53.256730 # -b 9.464786 54.894820 9.387341 54.894820 9.377953 54.857271 9.377953 54.845537 9.509376 54.850231 9.664267 54.812681 9.795690 54.793907 9.852014 54.730542 9.894257 54.678912 9.884870 54.582691 9.774568 54.500552 9.840280 54.460656 9.983437 54.460656 9.995171 54.385557 # -b 5.001106 52.946947 5.022227 52.925826 5.099673 52.827259 5.221708 52.752160 5.186506 52.705223 5.066817 52.679408 5.022227 52.592575 5.033961 52.484621 5.010493 52.411869 5.099673 52.343811 5.231096 52.315649 5.397721 52.296874 5.561999 52.336770 5.716890 52.404828 5.838926 52.498702 5.848313 52.585535 5.925759 52.653593 5.937493 52.700530 5.892903 52.733385 5.803723 52.780322 5.716890 52.860114 5.573733 52.878889 5.418842 52.878889 5.407108 52.946947 5.397721 53.045514 5.407108 53.158163 5.475166 53.230914 5.684035 53.329481 5.848313 53.383459 6.047794 53.402233 6.235541 53.362337 6.355230 53.390499 6.411554 53.428049 6.608688 53.449170 6.763579 53.428049 6.864493 53.390499 6.995916 53.324788 7.082748 53.277851 7.082748 53.244995 7.082748 53.256730 # -b -7.082748 62.064402 -7.073361 62.064402 -7.153153 62.090217 -7.293964 62.099604 -7.415999 62.116032 -7.458242 62.090217 -7.406612 62.059708 -7.284576 62.043280 -7.162541 62.043280 -7.082748 62.064402 # -b -6.775313 61.961141 -6.751845 61.956447 -6.751845 61.975222 -6.761232 62.033893 -6.826943 62.111339 -6.916123 62.172356 -6.995916 62.219293 -7.117951 62.270923 -7.183662 62.280311 -7.225905 62.223987 -7.258761 62.188784 -7.249374 62.151235 -7.160194 62.125420 -7.047546 62.106645 -6.963060 62.064402 -6.897348 62.038587 -6.897348 62.012771 -6.897348 61.970528 -6.873880 61.949407 -6.817556 61.961141 -6.775313 61.961141 # -b -6.665012 62.055014 -6.622769 62.064402 -6.589913 62.069095 -6.599300 62.099604 -6.646237 62.137154 -6.721336 62.184090 -6.754192 62.219293 -6.843371 62.240414 -6.899695 62.285004 -6.941938 62.301432 -7.007650 62.289698 -6.965407 62.219293 -6.866840 62.172356 -6.796435 62.120726 -6.754192 62.069095 -6.721336 62.059708 -6.665012 62.055014 # -b -6.456143 62.266230 -6.423288 62.275617 -6.488999 62.280311 -6.564098 62.289698 -6.662665 62.296738 -6.676746 62.254495 -6.629809 62.202865 -6.554711 62.172356 -6.488999 62.184090 -6.474918 62.202865 -6.474918 62.240414 -6.456143 62.266230 # -b -6.608688 61.756966 -6.599300 61.820331 -6.622769 61.867268 -6.754192 61.883696 -6.829290 61.862574 -6.829290 61.825025 -6.763579 61.810944 -6.763579 61.810944 -6.730723 61.778088 -6.688480 61.752273 -6.632156 61.742885 -6.608688 61.756966 # -b -6.897348 61.616156 -6.916123 61.649012 -6.916123 61.641971 -6.939591 61.595035 -6.930204 61.548098 -6.906736 61.458918 -6.850412 61.407288 -6.794088 61.395554 -6.751845 61.416675 -6.742457 61.470653 -6.761232 61.522283 -6.826943 61.580954 -6.897348 61.616156 # -b -1.239129 60.637526 -1.262597 60.646913 -1.262597 60.642220 -1.283719 60.625792 -1.316575 60.592936 -1.426876 60.550693 -1.471466 60.513144 -1.426876 60.475594 -1.405754 60.402843 -1.349430 60.344172 -1.417488 60.306622 -1.548911 60.250298 -1.504321 60.196321 -1.405754 60.168159 -1.283719 60.224483 -1.239129 60.179893 -1.239129 60.093060 -1.274331 60.003881 # -b -1.164030 59.982759 -1.086585 60.020308 -1.086585 60.097754 -1.074850 60.147038 -1.053729 60.179893 -1.063116 60.224483 -1.074850 60.273767 -1.053729 60.299582 -1.053729 60.327744 -1.053729 60.377027 -1.030261 60.419270 -1.063116 60.435698 -1.164030 60.452126 -1.218007 60.475594 -1.218007 60.522531 -1.239129 60.592936 -1.239129 60.637526 # -b -19.985648 63.545255 -19.985648 63.545255 # -b -20.072481 66.058715 -19.884734 65.976576 -19.795554 65.901477 -19.696987 65.833419 -19.640663 65.744239 -19.518628 65.744239 -19.420061 65.770054 -19.377818 65.887396 -19.387205 65.976576 -19.434142 66.049328 -19.363737 66.065756 -19.222927 66.084530 -19.110278 66.058715 -19.002324 66.143201 -18.936613 66.147895 -18.739479 66.199525 -18.739479 66.129120 -18.701929 66.133814 -18.650299 66.084530 -18.528263 66.070449 -18.481327 65.971882 -18.331129 65.910865 -18.227868 65.828725 -18.176238 65.711384 -18.119914 65.662100 -18.077671 65.774748 -18.077671 65.878009 -18.110527 65.936680 -18.185625 66.009432 -18.260724 66.098611 -18.274805 66.169016 -18.185625 66.187791 -17.988491 66.169016 -17.800744 66.103305 -17.655241 66.009432 -17.490962 66.021166 -17.392395 66.058715 -17.303215 66.129120 -17.303215 66.178404 -17.059145 66.192485 -17.026289 66.124427 -16.819767 66.115039 -16.650795 66.154935 -16.519372 66.164323 -16.463048 66.169016 -16.453661 66.248809 -16.463048 66.328601 -16.509985 66.422475 -16.566309 66.483492 -16.463048 66.490533 -16.364481 66.478799 -16.233059 66.539816 -16.078167 66.530429 -16.012456 66.438902 -15.782466 66.394313 -15.758998 66.312173 -15.801241 66.267584 -15.660431 66.234728 -15.505540 66.178404 -15.406973 66.173710 -15.364730 66.213606 -15.383504 66.267584 -15.097190 66.272277 -15.054947 66.319214 -14.998623 66.363804 -14.876588 66.389619 -14.646598 66.399006 -14.566806 66.363804 -14.834345 66.314520 -14.965768 66.222994 -15.073722 66.154935 -15.153514 66.103305 -15.097190 66.039941 -14.998623 66.004738 -14.735778 66.070449 -14.702922 66.021166 -14.665373 65.927292 -14.768633 65.807604 -14.768633 65.725465 -14.468239 65.748933 -14.327428 65.753627 -14.327428 65.734852 -14.360284 65.685568 -14.327428 65.622204 -14.041115 65.579961 -14.008259 65.690262 -13.919079 65.643325 -13.839287 65.551799 -13.717251 65.443844 -13.750107 65.352318 -13.862755 65.300687 -13.740720 65.190386 -13.609297 65.195080 -13.552973 65.242017 -13.543586 65.122328 -13.609297 65.023761 -13.764188 64.995599 -13.764188 64.906419 -13.839287 64.889991 -13.886223 64.847748 -13.961322 64.810199 -14.172537 64.777343 -14.336816 64.767956 -14.336816 64.702245 -14.501094 64.706938 -14.458851 64.678776 -14.557418 64.631839 -14.425996 64.622452 -14.228861 64.678776 -14.425996 64.498070 -14.590274 64.394809 -14.834345 64.357260 -14.909444 64.261039 -15.008011 64.279814 -15.130046 64.322057 -15.130046 64.376034 -15.242694 64.432358 -15.364730 64.437052 -15.397585 64.326751 -15.636962 64.246958 -15.735530 64.183594 -16.035924 64.059212 -16.345707 63.953604 -16.575697 63.894933 -16.674264 63.904321 -16.829155 63.909014 -17.007514 63.876159 -17.059145 63.923095 -17.171793 63.890240 -17.237504 63.845650 -17.246891 63.777591 -17.523818 63.740042 -17.720952 63.641475 -18.054203 63.495971 -18.307661 63.456075 -18.495408 63.430260 -18.636218 63.376283 -18.903757 63.425566 -19.035180 63.388017 -19.246395 63.456075 -19.452916 63.474850 -19.640663 63.514746 -19.786167 63.549948 -19.926977 63.540561 -19.983301 63.545255 # -b -22.189326 70.050682 -22.330136 69.982624 -22.419316 69.930993 -22.531964 69.975583 -22.621144 69.933340 -22.752567 69.926299 -22.874602 69.952115 -22.973169 69.902831 -23.137448 69.926299 -23.146835 69.874669 -23.268870 69.862935 -23.203159 69.827732 -23.095205 69.815998 -23.015412 69.783143 -23.179691 69.806611 -23.325194 69.844160 -23.358050 69.783143 -23.433149 69.771408 -23.620896 69.759674 -23.700688 69.759674 -23.911903 69.722125 -23.808642 69.672841 -23.710075 69.637639 -23.799255 69.625905 -23.724156 69.593049 -23.799255 69.529684 -23.954146 69.560193 -24.052713 69.607130 -24.132506 69.571927 -24.296784 69.583662 -24.395351 69.553153 -24.240460 69.527338 -24.151280 69.463973 -24.231073 69.475707 -24.296784 69.480401 -24.231073 69.449892 -24.174749 69.407649 -24.315559 69.431117 -24.428207 69.449892 -24.395351 69.402955 -24.451675 69.386527 -24.503306 69.384181 -24.648809 69.372446 -24.658197 69.306735 -24.860025 69.283267 -24.892880 69.252758 -24.789619 69.243370 -24.869412 69.219902 -24.991447 69.259798 -25.146338 69.278573 -25.352860 69.219902 -25.287149 69.205821 -25.146338 69.201127 -25.099402 69.189393 -25.099402 69.154191 -25.122870 69.126029 -25.090014 69.083786 -25.254293 69.114295 -25.366941 69.100214 -25.343473 69.025115 -25.399797 69.043889 -25.540607 69.055624 -25.672029 69.083786 -25.672029 69.027462 -25.620399 68.985219 -25.498364 68.957057 -25.672029 68.961750 -25.728354 68.910120 -25.751822 68.865530 -25.841002 68.865530 -25.906713 68.865530 -25.916100 68.835021 -25.972424 68.795125 -26.094460 68.774003 -26.324450 68.766963 -26.357305 68.743495 -26.380774 68.720026 -26.347918 68.682477 -26.469953 68.694211 -26.610764 68.687171 -26.657700 68.651968 -26.723412 68.698905 -26.789123 68.691864 -26.944014 68.675436 -27.009725 68.651968 -27.051969 68.567482 -27.150536 68.600338 -27.296039 68.595644 -27.338282 68.574522 -27.352363 68.527586 -27.436849 68.511158 -27.540110 68.555748 -27.648065 68.551054 -27.760713 68.527586 -27.737244 68.471262 -27.826424 68.461874 -27.901523 68.522892 -28.047027 68.551054 -28.065801 68.501771 -28.079882 68.478302 -28.089270 68.473609 -28.201918 68.454834 -28.366196 68.490036 -28.366196 68.417285 -28.507006 68.450140 -28.605573 68.421978 -28.708834 68.384429 -28.873113 68.384429 -29.046778 68.377388 -29.192282 68.360960 -29.225138 68.283515 -29.323705 68.316371 -29.389416 68.328105 -29.422272 68.281168 -29.487983 68.248312 -29.544307 68.243619 -29.689811 68.295249 -29.764910 68.321064 -29.830621 68.353920 -29.886945 68.400857 -29.929188 68.400857 # -b -19.985648 63.545255 -20.027891 63.528827 -20.173395 63.578110 -20.337673 63.603926 -20.501952 63.695452 -20.614600 63.730655 -20.868058 63.808100 -21.220083 63.866771 -21.454767 63.826875 -21.661288 63.857384 -21.792711 63.866771 -21.905359 63.840956 -22.079025 63.836262 -22.388807 63.852690 -22.534311 63.803407 -22.689202 63.817488 -22.675121 63.918402 -22.675121 63.958298 -22.740832 64.068599 -22.477987 63.991153 -22.379420 64.054518 -22.079025 64.108495 -21.816179 64.188288 -21.825567 64.307976 -21.816179 64.345526 -22.158817 64.307976 -21.980458 64.385422 -21.947602 64.432358 -21.971070 64.493376 -21.806792 64.577862 -21.994539 64.568475 -22.116574 64.483989 -22.215141 64.526232 -22.247997 64.577862 -22.332483 64.573169 -22.355951 64.608371 -22.370032 64.683470 -22.412275 64.767956 -22.445131 64.819586 -22.576554 64.833667 -22.722058 64.814893 -22.820625 64.786731 -22.909805 64.824280 -23.074083 64.843055 -23.294685 64.838361 -23.482432 64.814893 -23.656098 64.763262 -23.867313 64.744488 -23.956493 64.786731 -23.947106 64.843055 -23.933025 64.885298 -23.679566 64.894685 -23.351010 64.934581 -23.214893 64.981518 -22.994291 64.981518 -22.811237 65.056617 -22.698589 65.004986 -22.520230 65.066004 -22.332483 65.033148 -21.928827 65.028455 -21.872503 65.075391 -21.759855 65.209161 -21.895972 65.190386 -21.994539 65.108247 -22.135349 65.136409 -22.346564 65.148143 -22.534311 65.162224 -22.520230 65.223242 -22.501455 65.237323 -22.402888 65.291300 -22.266772 65.305381 -22.168205 65.352318 -22.027395 65.396908 -21.849035 65.448538 -21.858422 65.464966 -22.046169 65.521290 -22.149430 65.472006 -22.280853 65.472006 -22.290240 65.516596 -22.370032 65.549452 -22.379420 65.530677 -22.445131 65.594042 -22.510843 65.603429 -22.642265 65.603429 -22.754913 65.612817 -22.919192 65.622204 -23.050615 65.594042 -23.238361 65.502515 -23.393253 65.502515 -23.458964 65.488434 -23.524675 65.472006 -23.679566 65.443844 -23.792215 65.439151 -23.923637 65.474353 -23.989349 65.488434 -24.111384 65.516596 -24.275663 65.502515 -24.538508 65.464966 -24.486878 65.551799 -24.397698 65.629244 -24.285050 65.594042 -23.923637 65.525984 -23.768746 65.575267 -23.979961 65.612817 -23.914250 65.617510 -23.890782 65.676181 -24.078528 65.716077 -24.120771 65.760667 -24.177095 65.824032 -23.998736 65.784135 -23.745278 65.734852 -23.580999 65.643325 -23.261830 65.671487 -23.416721 65.711384 -23.304073 65.739546 -23.285298 65.798217 -23.623242 65.774748 -23.801602 65.861581 -23.792215 65.882703 -23.590387 65.901477 -23.735890 65.964842 -23.778134 65.990657 -23.867313 66.058715 -23.857926 66.039941 -23.604468 65.995351 -23.557531 66.016472 -23.688954 66.107999 -23.491820 66.070449 -23.637323 66.164323 -23.491820 66.187791 -23.139794 66.110346 -23.130407 66.000044 -23.083470 65.981270 -22.952048 65.967189 -22.844093 66.025860 -22.698589 65.950761 -22.642265 65.852194 -22.576554 65.936680 -22.477987 65.847500 -22.370032 65.950761 -22.501455 66.054022 -22.477987 66.098611 -22.623491 66.119733 -22.787769 66.159629 -22.942660 66.213606 -22.830012 66.298092 -22.675121 66.239422 -22.567167 66.239422 -22.501455 66.262890 -22.600022 66.307480 -22.665734 66.323908 -22.707977 66.359110 -22.830012 66.359110 -23.008372 66.314520 -23.163263 66.337989 -23.163263 66.354416 -23.097551 66.403700 -23.130407 66.469411 -23.041227 66.452984 -22.952048 66.455330 -22.961435 66.490533 -22.787769 66.417781 -22.675121 66.443596 -22.543698 66.408394 -22.468600 66.424821 -22.290240 66.293399 -22.013314 66.267584 -21.914746 66.187791 -21.806792 66.133814 -21.717612 66.093918 -21.619045 66.089224 -21.529865 66.070449 -21.398443 66.016472 -21.572109 65.960148 -21.487622 65.936680 -21.365587 65.906171 -21.342119 65.798217 -21.431298 65.770054 -21.454767 65.730158 -21.529865 65.697303 -21.759855 65.753627 -21.694144 65.662100 -21.464154 65.622204 -21.473541 65.544758 -21.365587 65.598736 -21.318650 65.493128 -21.417217 65.457925 -21.252939 65.425070 -21.234164 65.366399 -21.234164 65.232629 -21.098048 65.328849 -21.088660 65.406295 -20.868058 65.415682 -20.877445 65.589348 -20.792959 65.671487 -20.638068 65.666794 -20.591131 65.594042 -20.492564 65.516596 -20.384610 65.589348 -20.304818 65.706690 -20.281349 65.824032 -20.328286 65.910865 -20.384610 66.004738 -20.393997 66.103305 -20.281349 66.124427 -20.173395 66.107999 -20.074828 66.058715 # -b -29.931535 68.400857 -30.053571 68.377388 -30.086426 68.321064 -30.034796 68.227191 -30.217849 68.264740 -30.274173 68.222497 -30.133363 68.161479 -30.264786 68.091074 -30.419677 68.161479 -30.429064 68.231885 -30.659054 68.243619 -30.781090 68.267087 -30.781090 68.182601 -30.574568 68.145052 -30.541712 68.072300 -30.715378 68.067606 -30.917206 68.121583 -31.058016 68.156786 -31.067403 68.182601 -31.156583 68.177907 -31.147196 68.145052 -31.180052 68.121583 -31.090872 68.074647 -31.034548 68.041791 -31.170664 68.072300 -31.222295 68.067606 -31.334943 68.091074 -31.508608 68.091074 -31.611869 68.058219 -31.686968 68.041791 -31.677581 68.088728 -31.776148 68.116890 -31.874715 68.128624 -31.907570 68.210763 -31.841859 68.206069 -31.752679 68.189642 -31.696355 68.248312 -31.841859 68.255353 -32.062462 68.283515 -32.085930 68.332798 -32.151641 68.368001 -32.184497 68.393816 -32.184497 68.400857 -32.203272 68.461874 -32.259596 68.485343 -32.372244 68.400857 -32.405099 68.471262 -32.414487 68.529933 -32.414487 68.558095 -32.503667 68.590950 -32.592846 68.623806 -32.545910 68.546360 -32.602234 68.546360 -32.691413 68.527586 -32.780593 68.527586 -32.757125 68.490036 -32.602234 68.405550 -32.503667 68.360960 -32.405099 68.264740 -32.348775 68.222497 -32.480198 68.201376 -32.259596 68.161479 -32.128173 68.128624 -32.038993 68.062912 -32.193884 68.041791 -32.170416 67.952611 -32.226740 67.931490 -32.259596 67.872819 -32.315920 67.898634 -32.437955 67.861085 -32.527135 67.919755 -32.658558 67.861085 -32.644477 67.818842 -32.757125 67.781292 -32.865079 67.727315 -33.076294 67.678031 -33.264041 67.703847 -33.221798 67.635788 -33.231185 67.560690 -33.386077 67.546609 -33.418932 67.497325 -33.461175 67.426920 -33.451788 67.361209 -33.606679 67.370596 -33.540968 67.333047 -33.517499 67.248561 -33.550355 67.229786 -33.583211 67.135913 -33.606679 67.063161 -33.770958 67.030305 -33.836669 67.009183 -33.883606 66.964594 -34.015028 66.931738 -34.033803 66.901229 -33.968092 66.844905 -33.949317 66.805009 -34.080740 66.849599 -34.057271 66.793275 -34.146451 66.797968 -34.137064 66.767459 -34.202775 66.711135 -34.245018 66.626649 -34.287261 66.713482 -34.367054 66.645424 -34.432765 66.753378 -34.521945 66.650118 -34.554800 66.575019 -34.578269 66.523389 -34.653368 66.469411 -34.662755 66.399006 -34.742547 66.359110 -34.864583 66.359110 -34.972537 66.328601 -35.061717 66.347376 -35.103960 66.443596 -35.249464 66.347376 -35.118041 66.258196 -35.249464 66.262890 -35.479453 66.302786 -35.634345 66.328601 -35.845560 66.424821 -35.878415 66.354416 -35.822091 66.302786 -35.765767 66.272277 -35.681281 66.227687 -35.756380 66.150242 -35.756380 66.138508 -35.756380 66.070449 -35.920658 66.103305 -35.976983 66.054022 -36.019226 65.995351 -36.042694 65.910865 -36.174117 65.964842 -36.230441 65.936680 -36.319620 65.964842 -36.408800 65.936680 -36.361863 66.049328 -36.493286 66.044634 -36.563691 65.976576 -36.582466 65.955454 -36.615322 65.901477 -36.671646 65.828725 -36.746744 65.906171 -36.934491 65.896784 -37.056527 66.025860 -37.122238 66.054022 -37.220805 66.098611 -37.244273 65.995351 -37.234886 65.910865 -37.399165 65.946067 -37.244273 65.878009 -37.277129 65.824032 -37.375696 65.847500 -37.478957 65.887396 -37.610380 65.915558 -37.718334 65.915558 -37.765271 65.936680 -37.765271 65.964842 -37.816901 66.009432 -37.685478 66.058715 -37.629154 66.079837 -37.610380 66.169016 -37.478957 66.204219 -37.342841 66.258196 -37.169175 66.319214 -37.408552 66.307480 -37.521200 66.328601 -37.643235 66.302786 -37.741803 66.363804 -37.849757 66.422475 -37.929549 66.323908 -38.084440 66.363804 -38.051585 66.314520 -37.816901 66.234728 -37.929549 66.239422 -38.018729 66.199525 -37.971792 66.150242 -38.051585 66.124427 -38.192395 66.107999 -38.018729 66.044634 -38.060972 65.946067 -38.159539 65.946067 -38.248719 65.971882 -38.258106 65.910865 -38.361367 65.946067 -38.445853 66.000044 -38.492790 65.882703 -38.361367 65.819338 -38.272187 65.824032 -38.192395 65.798217 -38.239332 65.774748 -38.192395 65.701996 -38.281575 65.701996 -38.314430 65.633938 -38.370754 65.652713 -38.459934 65.652713 -38.535033 65.676181 -38.600744 65.671487 -38.699311 65.671487 -38.802572 65.676181 -38.666456 65.603429 -38.811959 65.589348 -38.952769 65.594042 -39.107661 65.570574 -39.154597 65.624551 -39.328263 65.685568 -39.375200 65.624551 -39.384587 65.612817 -39.426830 65.565880 -39.572334 65.575267 -39.614577 65.638632 -39.750693 65.666794 -39.816405 65.608123 -39.882116 65.521290 # -b -40.088638 65.457925 -39.957215 65.434457 -39.924359 65.378133 -39.947828 65.333543 -39.849260 65.270179 -39.900891 65.237323 # -b -39.879769 65.521290 -40.001805 65.551799 -40.076903 65.521290 -40.222407 65.502515 -40.086291 65.457925 # -b -39.900891 65.237323 -40.004152 65.195080 -40.079250 65.148143 -40.088638 65.084779 -40.201286 65.023761 -40.332709 65.084779 -40.421888 65.042536 -40.529843 65.094166 -40.675346 65.117634 -40.684734 65.028455 -40.806769 65.066004 -41.003903 65.056617 -41.125939 65.103553 -41.215119 65.004986 -41.304298 64.915806 -41.107164 64.939275 -41.074308 64.857136 -40.952273 64.819586 -40.853706 64.706938 -40.698815 64.641227 -40.642491 64.479295 -40.496987 64.418277 -40.332709 64.394809 -40.398420 64.357260 -40.511068 64.385422 -40.586167 64.399503 -40.905336 64.404196 -41.107164 64.361953 -41.337154 64.293895 -41.501432 64.307976 -41.445108 64.197675 -41.182263 64.188288 -40.919417 64.183594 -40.741058 64.164819 -40.642491 64.087374 -40.684734 64.049824 -40.773914 64.016969 -40.684734 63.909014 -40.642491 63.840956 -40.562698 63.758817 -40.839625 63.740042 -41.140020 63.777591 -41.402865 63.812794 -41.412253 63.758817 -41.074308 63.725961 -40.806769 63.695452 -40.741058 63.650862 -40.750445 63.559336 -40.853706 63.549948 -40.872481 63.456075 -40.905336 63.425566 -40.952273 63.425566 -41.050840 63.402098 -41.182263 63.430260 -41.172876 63.406792 -41.158794 63.376283 -41.083696 63.326999 -41.247974 63.317612 -41.205731 63.237819 -41.393478 63.258941 -41.590612 63.326999 -41.614081 63.298837 -41.501432 63.249554 -41.548369 63.214351 -41.656324 63.204964 -41.614081 63.134559 -41.379397 63.120478 -41.379397 63.064154 -41.567144 63.059460 -41.745503 63.075888 -41.853458 63.094662 -41.989574 63.153333 -42.106916 63.153333 -41.919169 63.075888 -41.745503 63.028951 -41.665711 63.000789 # -b -41.665711 63.000789 -41.482658 63.005483 -41.482658 63.010176 -41.482658 62.974974 -41.482658 62.918650 -41.506126 62.909262 -41.637549 62.913956 -41.670405 62.874060 -41.703260 62.850592 -41.801827 62.834164 -41.891007 62.829470 -41.956718 62.824776 -41.956718 62.820083 -41.970799 62.820083 -42.069367 62.813042 -42.210177 62.813042 -42.275888 62.834164 -42.412004 62.824776 -42.463635 62.798961 -42.477716 62.742637 -42.519959 62.714475 -42.618526 62.693354 -42.773417 62.688660 -42.806273 62.672232 -42.632607 62.641723 -42.477716 62.618255 -42.421392 62.561931 -42.379149 62.489179 -42.412004 62.453976 -42.289969 62.418774 -42.266501 62.310820 -42.257113 62.158275 -42.243032 62.055014 -42.125691 62.012771 -42.088141 61.944713 -42.158546 61.850840 -42.102222 61.803903 -42.200789 61.752273 -42.266501 61.679521 -42.355680 61.606769 -42.421392 61.559832 -42.477716 61.480040 -42.379149 61.480040 -42.463635 61.390860 -42.630260 61.322802 -42.672503 61.285253 -42.618526 61.264131 -42.630260 61.210154 -42.639647 61.189032 -42.663116 61.163217 -42.684237 61.066997 -42.695971 61.045875 -42.695971 61.041182 -42.728827 60.982511 -42.761683 60.954349 -42.806273 60.921493 -42.827394 60.858129 -42.827394 60.832313 -42.839128 60.799458 -42.860250 60.745480 -42.860250 60.703237 -42.839128 60.625792 -42.839128 60.592936 -42.928308 60.550693 -43.026875 60.545999 -43.080852 60.555387 -43.148911 60.517837 -43.292068 60.513144 -43.435225 60.534265 -43.644093 60.550693 -43.611237 60.529572 -43.435225 60.489675 -43.301455 60.435698 -43.214622 60.431005 -43.137177 60.348865 -43.104321 60.273767 -43.125442 60.224483 -43.104321 60.201015 -43.071465 60.163465 -43.071465 60.142344 -43.071465 60.147038 -43.181766 60.147038 -43.224009 60.142344 -43.411756 60.135303 -43.599503 60.142344 -43.876430 60.151731 -44.007852 60.158772 -44.052442 60.250298 -44.052442 60.290194 -44.151009 60.201015 -44.228455 60.163465 -44.404467 60.069592 -44.646191 60.036736 -44.801083 60.125916 -44.934852 60.114182 -44.988829 60.114182 -45.009951 60.114182 -45.066275 60.130610 -45.120252 60.191627 -45.131986 60.191627 -45.155455 60.191627 -45.155455 60.245605 -45.033419 60.332437 -44.944240 60.369987 -44.923118 60.409883 -44.911384 60.452126 -44.911384 60.468554 -44.890262 60.517837 -44.890262 60.567121 -45.045153 60.484982 -45.230553 60.447432 -45.275143 60.480288 -45.242288 60.550693 -45.197698 60.604670 -45.188310 60.670382 -45.265756 60.670382 -45.352589 60.637526 -45.441769 60.534265 -45.519214 60.480288 -45.552070 60.534265 -45.617781 60.583549 -45.650637 60.658648 -45.683493 60.679769 -45.695227 60.679769 -45.716348 60.696197 -45.728082 60.703237 -45.716348 60.717318 -45.638903 60.766602 -45.397179 60.846394 -45.340855 60.937921 -45.408913 60.966083 -45.528601 60.869863 -45.716348 60.794764 -45.871239 60.799458 -46.026131 60.745480 -46.091842 60.740787 -46.190409 60.757215 -46.058986 60.794764 -45.958072 60.832313 -46.103576 60.832313 -45.838384 60.900372 -45.662371 60.949655 -45.594313 60.991898 -45.882974 60.944961 -45.993275 60.966083 -45.969807 61.020060 -45.915829 61.076384 -45.981541 61.062303 -46.103576 61.045875 -46.213877 61.020060 -46.256120 61.055263 -46.378156 61.029448 -46.488457 60.991898 -46.619880 60.944961 -46.908541 60.959042 -47.051697 60.966083 -47.126796 60.954349 -47.194854 60.944961 -47.359133 60.970777 -47.380254 60.975470 -47.391989 60.975470 -47.436578 60.970777 -47.448313 60.944961 -47.424844 60.900372 -47.380254 60.858129 -47.535146 60.841701 -47.690037 60.841701 -47.746361 60.841701 -47.812072 60.841701 -47.898905 60.846394 -47.943495 60.858129 -47.976351 60.853435 -48.131242 60.832313 -48.053796 60.883944 -47.877783 60.928534 -47.746361 60.982511 -47.624325 61.020060 -47.591470 61.029448 -47.568001 61.055263 -47.636059 61.083425 -47.701771 61.071691 -47.877783 61.120974 -47.999819 61.125668 -48.020940 61.130361 -48.042062 61.135055 -48.077264 61.146789 -48.119507 61.214848 -48.185219 61.252397 -48.286133 61.238316 -48.396434 61.210154 -48.473880 61.221888 -48.593568 61.268825 -48.572447 61.343923 -48.506735 61.379126 -48.558366 61.395554 -48.694482 61.400247 -48.778968 61.395554 -48.835292 61.390860 -48.901004 61.374432 -48.966715 61.400247 -48.680401 61.454225 -48.295520 61.505855 -48.173485 61.531670 -48.361232 61.580954 -48.483267 61.580954 -48.793049 61.496468 -48.957328 61.470653 -49.023039 61.480040 -49.177930 61.526977 -49.234254 61.564526 -48.980796 61.616156 -48.891616 61.684215 -49.023039 61.700642 -49.013652 61.742885 -49.177930 61.789822 -49.299966 61.867268 -49.332821 61.918898 -49.187317 61.975222 -48.915085 62.047974 -48.933859 62.111339 -49.013652 62.137154 -49.187317 62.085523 -49.342209 62.022159 -49.422001 62.022159 -49.497100 62.003384 -49.576892 62.003384 -49.595667 62.055014 -49.661378 62.094911 -49.506487 62.116032 -49.375064 62.158275 -49.553424 62.141847 -49.619135 62.202865 -49.454857 62.249802 -49.562811 62.249802 -49.609748 62.249802 -49.806882 62.285004 -49.806882 62.362450 -49.750558 62.428161 -49.896062 62.475098 # -b -43.148911 60.064898 -43.092587 60.069592 -43.104321 60.069592 -43.202888 60.048470 -43.367166 60.069592 -43.468080 60.086020 -43.566647 60.097754 -43.709804 60.109488 -43.864695 60.109488 -43.951528 60.081326 -43.918673 60.020308 # -b -43.512670 59.971025 -43.500936 60.008574 -43.456346 60.048470 -43.378901 60.048470 -43.202888 60.036736 -43.148911 60.064898 # -b -50.686945 63.000789 -50.719801 63.035992 -50.719801 63.068847 -50.808981 63.080581 -50.921629 63.169761 -51.062439 63.277716 -51.118763 63.446688 -51.217330 63.425566 -51.273654 63.495971 -51.452013 63.627394 -51.273654 63.749429 -51.461401 63.721267 -51.414464 63.923095 -51.494256 64.035743 -51.517725 64.087374 -51.470788 64.164819 -51.193862 64.169513 -50.977953 64.232877 -50.921629 64.357260 -50.686945 64.380728 -50.480424 64.413584 -50.180029 64.469908 -50.513279 64.469908 -50.757350 64.549700 -50.743269 64.617758 -50.569603 64.688163 -50.302064 64.655308 -50.025138 64.636533 -50.147173 64.753875 -50.349001 64.735100 -50.686945 64.814893 -50.832449 64.688163 -51.076520 64.655308 -51.217330 64.678776 -51.484869 64.460520 -51.672616 64.270427 -51.935461 64.275121 -52.043416 64.242265 -52.109127 64.357260 -52.109127 64.422971 -52.109127 64.455827 -52.076272 64.545007 -52.090353 64.650614 -52.043416 64.716326 -51.822813 64.819586 -51.935461 64.843055 -51.935461 64.871217 -52.057497 64.805505 -52.109127 64.906419 -52.132596 65.000293 -52.287487 65.033148 -52.278099 65.089472 -52.245244 65.152837 -52.179532 65.185693 -52.221775 65.300687 -52.409522 65.190386 -52.484621 65.295994 -52.376666 65.333543 -52.179532 65.425070 -52.386054 65.425070 -52.400135 65.497822 -52.508089 65.488434 -52.672368 65.493128 -52.686449 65.622204 -52.705223 65.725465 -52.860114 65.685568 -53.113573 65.657406 -52.996231 65.744239 -53.038474 65.793523 -52.925826 65.866275 -52.817871 65.901477 -53.113573 65.838113 -53.137041 65.896784 -53.390499 65.936680 -53.381112 66.009432 -53.226221 66.061062 -53.080717 66.124427 -53.071330 66.119733 -52.916438 66.178404 -53.113573 66.147895 -53.348256 66.150242 -53.489066 66.178404 -53.291932 66.274624 -53.521922 66.274624 -53.554778 66.342682 -53.587633 66.443596 -53.489066 66.530429 -53.137041 66.504614 -53.249689 66.556244 -53.390499 66.614915 -53.179284 66.713482 -53.047861 66.748685 -53.038474 66.826130 -53.015006 66.896535 -53.334175 66.905923 -53.601714 66.887148 -53.554778 66.978675 -53.733137 67.034999 -53.888028 67.077242 -53.873947 67.187543 -53.873947 67.250907 -53.789461 67.318966 -53.676813 67.354168 -53.733137 67.426920 -53.348256 67.539568 -53.456211 67.509059 -53.643957 67.567730 -53.456211 67.666297 -53.503147 67.673338 -53.479679 67.781292 -53.512535 67.877512 -53.390499 67.910368 -53.249689 67.943224 -53.015006 67.947917 -53.193365 68.025363 -52.892970 67.964345 -52.785016 67.992507 -53.071330 68.112196 -53.235608 68.107502 -53.390499 68.112196 -53.249689 68.154439 -52.850727 68.107502 -52.850727 68.140358 -52.606656 68.173214 -52.376666 68.133317 -52.353198 68.133317 -52.179532 68.091074 -52.001173 68.058219 -51.855669 68.039444 -51.559968 68.051178 -51.250186 68.095768 -51.053051 68.058219 -50.940403 68.095768 -51.250186 68.156786 -51.315897 68.215457 -51.076520 68.194335 -51.315897 68.234231 -51.503644 68.276474 -51.231411 68.337492 -51.184474 68.365654 -51.142231 68.414938 -51.193862 68.433712 -51.550580 68.443100 -51.461401 68.384429 -51.372221 68.325758 -51.616292 68.295249 -52.010560 68.264740 -52.353198 68.215457 -52.465846 68.250659 -52.573801 68.271781 -52.808484 68.227191 -52.860114 68.304636 -52.827259 68.311677 -52.892970 68.382082 -52.606656 68.490036 -52.540945 68.551054 -52.123208 68.586257 -51.869750 68.579216 -51.559968 68.534626 -51.161006 68.579216 -51.053051 68.698905 -50.954484 68.755229 -51.193862 68.743495 -51.264267 68.774003 -51.043664 68.863183 -51.175087 68.917160 -51.175087 68.973484 -51.161006 68.973484 -51.175087 69.013381 -51.142231 69.111948 -51.010808 69.158884 -50.766738 69.135416 -50.644702 69.050930 -50.400631 69.060317 -50.569603 69.130722 -50.259821 69.201127 -50.391244 69.302041 -50.710413 69.217555 -50.977953 69.290307 -50.963872 69.348978 -50.963872 69.449892 -50.710413 69.492135 -50.766738 69.522644 -50.832449 69.618864 -50.588378 69.661107 -50.654089 69.771408 -50.334920 69.808958 -50.433487 69.907525 # -b -50.388897 70.006092 -50.961525 69.989664 # -b -53.191018 70.177411 -52.857768 69.989664 -52.552679 69.834773 -52.153717 69.794877 -51.909646 69.715084 -51.909646 69.668148 -51.909646 69.607130 -51.942502 69.541419 -52.219428 69.431117 -52.562066 69.384181 -52.914092 69.348978 -53.289585 69.306735 -53.608755 69.283267 -53.787114 69.290307 -53.909150 69.318469 -54.148527 69.384181 -54.139140 69.438158 -53.909150 69.452239 -53.674466 69.431117 -53.477332 69.456932 -53.467945 69.506216 -53.618142 69.463973 -53.650998 69.515603 -53.862213 69.517950 -53.871600 69.595396 -54.059347 69.546112 -54.467697 69.546112 -54.833803 69.595396 -54.866658 69.684575 -54.678912 69.703350 -54.359742 69.668148 -54.589732 69.759674 -54.890127 69.839467 -54.800947 69.884056 -54.566264 69.900484 -54.261175 69.895791 -54.524021 69.970889 # -b -49.928917 62.475098 -50.116664 62.479792 -50.182376 62.540809 -50.168295 62.653457 -50.083808 62.763759 -50.046259 62.798961 -50.116664 62.789574 -50.135439 62.784880 -50.215231 62.742637 -50.257474 62.723862 -50.290330 62.794268 -50.346654 62.834164 -50.379510 62.864673 -50.379510 62.935078 -50.398284 62.974974 -50.581338 62.996095 -50.684598 63.000789 # -b -68.806859 70.031907 -69.027462 69.938034 -68.839715 69.930993 -68.708292 69.930993 # -b -67.450388 70.031907 -67.187543 69.912218 -67.074895 69.815998 -67.239173 69.710391 -67.605280 69.771408 -67.891593 69.747940 -68.032404 69.672841 -68.276474 69.625905 -68.529933 69.644679 -68.651968 69.637639 -68.849102 69.529684 -68.694211 69.576621 -68.464221 69.522644 -68.318717 69.468667 -68.187295 69.409996 -68.102809 69.492135 -67.793026 69.431117 -67.417533 69.440505 -67.042039 69.421730 -66.746338 69.348978 -66.488186 69.264492 -66.488186 69.201127 -66.577366 69.147150 -66.854292 69.184700 -67.149994 69.137763 -67.426920 69.135416 -67.694459 69.182353 -68.046485 69.271532 -68.023016 69.189393 -68.168520 69.170619 -68.267087 69.196434 -68.421978 69.189393 -68.539320 69.170619 -68.520545 69.114295 -68.253006 69.123682 -67.947917 69.050930 -67.746090 68.980525 -67.793026 68.933588 -68.121583 68.945322 -68.154439 68.877264 -68.013629 68.825634 -67.835269 68.759922 -67.858738 68.722373 -67.694459 68.675436 -68.013629 68.668396 -68.023016 68.607378 -68.332798 68.600338 -68.234231 68.541667 -67.999548 68.506464 -67.638135 68.473609 -67.361209 68.438406 -67.164075 68.438406 -66.863680 68.410244 -66.690014 68.368001 -66.755725 68.292902 -66.877761 68.215457 -66.779194 68.170867 -66.535123 68.173214 -66.192485 68.210763 -66.046981 68.100462 -66.225341 68.055872 -66.258196 67.987814 -66.061062 67.959652 -65.948414 67.882206 -65.709037 67.980773 -65.319462 67.992507 -64.967437 68.030057 -64.981518 67.931490 -65.066004 67.889247 -65.112941 67.818842 -65.033148 67.774252 -64.836014 67.785986 -64.624799 67.807107 -64.460520 67.769558 -64.361953 67.732009 -64.216450 67.645176 -64.117883 67.567730 -63.920748 67.396411 -63.920748 67.328353 -64.150738 67.316619 -64.239918 67.274376 -64.028703 67.250907 -64.183594 67.196930 -63.930136 67.187543 -63.592191 67.208664 -63.357508 67.227439 -63.235473 67.274376 -63.028951 67.264988 -63.005483 67.192237 -63.193230 67.098363 -63.249554 66.964594 -63.301184 66.875414 -63.080581 66.912963 -62.892835 66.962247 -62.597133 66.973981 -62.399999 66.948166 -62.179397 66.964594 -62.033893 66.905923 -61.836759 66.870720 -61.705336 66.809702 -61.494121 66.722870 -61.362698 66.605528 -61.484734 66.518695 -61.658399 66.495227 -61.724111 66.417781 -61.780435 66.382578 -61.592688 66.298092 -61.691255 66.232381 -61.935326 66.234728 -62.367144 66.342682 -62.597133 66.298092 -62.301432 66.262890 -62.343675 66.154935 -62.564278 66.169016 -62.606521 66.070449 -62.221640 66.093918 -62.080830 66.004738 -62.254495 65.971882 -62.385918 65.960148 -62.385918 65.847500 -62.399999 65.774748 -62.606521 65.739546 -62.686313 65.657406 -62.719169 65.570574 -62.996095 65.584655 -63.235473 65.671487 -63.423219 65.744239 -63.437300 65.643325 -63.348121 65.525984 -63.282409 65.429763 -63.226085 65.291300 -63.380976 65.281913 -63.446688 65.171612 -63.470156 65.075391 -63.512399 65.000293 -63.578110 64.899379 -63.723614 64.939275 -63.822181 65.028455 -63.887893 65.122328 -64.108495 65.051923 -64.239918 65.237323 -64.418277 65.185693 -64.549700 65.162224 -64.746834 65.286606 -64.606024 65.406295 -64.657655 65.483741 -64.934581 65.420376 -65.066004 65.507209 -65.155184 65.556492 -65.277219 65.622204 -65.342930 65.685568 -65.422723 65.856887 -65.342930 65.981270 -65.572920 65.941373 -65.882703 65.946067 -65.948414 66.098611 -66.169016 66.138508 -66.389619 66.204219 -66.699401 66.298092 -66.976328 66.319214 -66.877761 66.389619 -66.896535 66.514001 -67.117138 66.525735 -67.328353 66.596140 -67.459776 66.525735 -67.196930 66.434209 -67.361209 66.438902 -67.206318 66.298092 -67.337740 66.298092 -67.581811 66.399006 -67.746090 66.460024 -67.915062 66.452984 -67.835269 66.373191 -67.933836 66.373191 -68.154439 66.382578 -68.032404 66.248809 -67.900981 66.208913 -67.548956 66.173710 -67.272029 66.070449 -67.149994 65.946067 -67.361209 65.936680 -67.506712 65.901477 -67.661604 65.873315 -67.769558 65.896784 -67.915062 65.873315 -67.858738 65.739546 -67.933836 65.612817 -67.915062 65.575267 -67.558343 65.648019 -67.272029 65.608123 -67.361209 65.540065 -67.328353 65.472006 -67.164075 65.396908 -67.272029 65.375786 -67.164075 65.314768 -67.239173 65.260791 -67.253254 65.218548 -66.999796 65.185693 -66.943472 65.103553 -66.929391 65.051923 -66.788581 64.948662 -66.699401 64.800812 -66.666546 64.843055 -66.633690 64.934581 -66.488186 64.953356 -66.267584 64.925194 -66.117386 64.934581 -66.337989 64.805505 -66.192485 64.763262 -66.070449 64.796118 -65.995351 64.833667 -65.896784 64.866523 -65.676181 64.861829 -65.643325 64.767956 -65.629244 64.596637 -65.488434 64.664695 -65.352318 64.711632 -65.277219 64.683470 -65.234976 64.622452 -65.244363 64.554394 -65.014374 64.582556 -64.958050 64.465214 -65.033148 64.326751 -65.253751 64.298589 -65.234976 64.150738 -65.112941 64.096761 -64.868870 64.035743 -64.624799 64.026356 -64.591943 63.927789 -64.559088 63.808100 -64.540313 63.794019 -64.437052 63.704840 -64.483989 63.622700 -64.493376 63.465462 -64.573169 63.437300 -64.516845 63.322305 -64.526232 63.282409 -64.746834 63.392711 -64.958050 63.465462 -64.967437 63.326999 -65.000293 63.263635 -64.901725 63.169761 -64.826627 63.075888 -64.793771 63.014870 -64.606024 63.024257 # -b -67.661604 63.010176 -67.661604 63.108743 -67.844657 63.089969 -67.933836 63.193230 -67.999548 63.223738 -68.065259 63.204964 -68.135664 63.228432 -68.253006 63.308224 -68.356267 63.357508 -68.520545 63.474850 -68.694211 63.559336 -68.896039 63.730655 -68.661355 63.763510 -68.520545 63.704840 -68.356267 63.662597 -68.243619 63.592191 -67.999548 63.474850 -67.746090 63.456075 -67.811801 63.549948 -67.647523 63.573417 -67.459776 63.441994 -67.239173 63.282409 -67.051426 63.228432 -66.844905 63.223738 -66.722870 63.040685 # -b -70.125780 60.874556 -69.994358 60.912106 -69.830079 60.937921 -69.752634 60.959042 -69.773755 61.024754 -69.651720 61.062303 -69.541419 60.970777 -69.442851 60.907412 -69.431117 60.853435 -69.454586 60.808845 -69.541419 60.745480 -69.696310 60.686810 -69.696310 60.616405 -69.729165 60.529572 -69.696310 60.452126 -69.708044 60.398149 -69.630598 60.386415 -69.597743 60.323050 -69.586008 60.250298 -69.487441 60.163465 -69.421730 60.093060 -69.532031 60.076632 -69.675188 60.076632 -69.696310 60.036736 -69.762021 60.003881 -69.982624 60.003881 # -b -65.331196 59.987453 -65.220895 60.069592 -65.077738 60.109488 -64.955703 60.175200 -64.934581 60.191627 -64.943969 60.208055 -64.911113 60.229177 -64.857136 60.306622 -64.779690 60.316010 -64.690510 60.316010 -64.526232 60.299582 -64.469908 60.245605 -64.547353 60.196321 -64.404196 60.179893 -64.415931 60.102448 -64.371341 60.036736 # -b -68.220150 60.484982 -68.274128 60.517837 -68.330452 60.316010 -68.274128 60.283154 -68.098115 60.355906 -67.954958 60.377027 -67.832923 60.468554 -67.865778 60.592936 -68.065259 60.592936 -68.163826 60.555387 -68.220150 60.484982 # -b -65.077738 61.705336 -65.054270 61.726458 -65.044882 61.710030 -64.955703 61.684215 -64.889991 61.616156 -64.782037 61.616156 -64.735100 61.590341 -64.758569 61.512896 -64.782037 61.386166 -64.904072 61.353311 -65.110594 61.395554 -65.143450 61.475346 -65.232629 61.470653 -65.364052 61.569220 -65.528330 61.552792 -65.509556 61.641971 -65.331196 61.700642 -65.190386 61.710030 -65.077738 61.705336 # -b -64.606024 63.024257 -64.526232 63.005483 -64.526232 62.974974 -64.446439 62.960893 -64.413584 62.909262 -64.469908 62.843551 -64.657655 62.859979 -64.779690 62.935078 -64.934581 62.949159 -65.009680 62.890488 -64.976824 62.829470 -64.911113 62.759065 -64.845401 62.688660 -64.821933 62.627642 -64.779690 62.597133 -64.756222 62.566625 -64.887644 62.545503 -64.976824 62.627642 -65.089472 62.658151 -65.188039 62.676926 -65.173958 62.723862 -65.108247 62.798961 -65.108247 62.850592 -65.263138 62.813042 -65.305381 62.843551 -65.375786 62.904569 -65.394561 62.960893 -65.460272 62.979668 -65.540065 62.935078 -65.572920 62.904569 -65.727811 62.935078 -65.849847 62.979668 -65.901477 62.918650 -65.915558 62.899875 -66.154935 63.035992 -66.389619 63.038338 -66.722870 63.040685 # -b -67.534875 63.000789 -67.412839 62.939771 -67.370596 62.878754 -67.337740 62.843551 -67.192237 62.794268 -67.027958 62.719169 -66.873067 62.693354 -66.765113 62.618255 -66.619609 62.566625 -66.455330 62.505607 -66.333295 62.432855 -66.136161 62.327247 -66.079837 62.249802 -66.103305 62.146541 -66.178404 62.094911 -66.178404 62.038587 -66.056368 61.970528 -66.023513 61.897777 -66.366151 61.876655 -66.455330 61.930632 -66.619609 62.003384 -66.840211 62.120726 -67.060814 62.047974 -67.314272 62.043280 -67.412839 62.059708 -67.600586 62.137154 -67.656910 62.202865 -67.830576 62.207559 -68.051178 62.207559 -68.220150 62.270923 -68.360960 62.249802 -68.558095 62.289698 -68.637887 62.353063 -68.759922 62.378878 -68.759922 62.484485 -68.844409 62.383571 -69.046236 62.414080 -69.219902 62.526728 -69.233983 62.611214 -69.309082 62.646417 -69.431117 62.646417 -69.487441 62.733250 -69.463973 62.768452 -69.440505 62.820083 -69.553153 62.789574 -69.726819 62.808349 -69.797224 62.742637 -69.947421 62.777840 -69.914565 62.890488 -69.947421 62.930384 # -b -76.384790 68.292902 -76.319078 68.321064 -76.286223 68.288209 -76.164187 68.243619 -75.985828 68.299943 -75.765225 68.288209 -75.680739 68.206069 -75.525848 68.194335 -75.314633 68.206069 -75.173823 68.095768 -75.150354 67.985467 -75.173823 67.818842 -75.108111 67.652216 -75.183210 67.502019 -75.460137 67.365902 -75.732370 67.274376 -76.089089 67.248561 -76.408258 67.222745 -76.638248 67.206318 -76.750896 67.234480 -77.037210 67.264988 -77.234344 67.417533 -77.323524 67.567730 -77.342299 67.703847 -77.309443 67.835269 -77.201488 67.903328 -77.102921 68.008935 -76.948030 68.133317 -76.760283 68.234231 -76.539681 68.255353 -76.384790 68.292902 # -b -74.807717 67.992507 -74.718537 68.055872 -74.563646 68.067606 -74.366512 68.145052 -74.310188 68.058219 -74.070810 68.023016 -73.925307 67.985467 -73.728172 67.969039 -73.563894 67.795373 -73.761028 67.727315 -74.136522 67.778945 -74.479160 67.769558 -74.765474 67.872819 -74.807717 67.992507 # -b -78.579081 69.208168 -78.579081 69.189393 -78.597855 69.154191 -78.687035 69.107254 -78.766827 69.048583 -78.851313 68.961750 -79.039060 68.905426 -79.240888 68.881958 -79.461491 68.877264 -79.447410 68.954710 -79.381698 68.992259 -79.259663 69.072052 -79.039060 69.114295 -78.921719 69.177659 -78.799683 69.248064 -78.654179 69.231636 -78.522757 69.205821 -78.410108 69.205821 -78.358478 69.241024 -78.358478 69.295001 -78.358478 69.341938 -78.442964 69.360712 -78.546225 69.365406 -78.644792 69.353672 -78.710503 69.325510 -78.719891 69.278573 -78.719891 69.259798 -78.579081 69.208168 # -b -80.066974 69.722125 -79.968407 69.715084 -79.836984 69.766715 -79.724336 69.783143 -79.560058 69.766715 -79.438022 69.722125 -79.480265 69.637639 -79.700868 69.611824 -79.888615 69.576621 # -b -78.501635 63.397404 -78.567346 63.397404 -78.525103 63.420873 -78.435924 63.446688 -78.248177 63.470156 -78.018187 63.456075 -77.919620 63.420873 -77.774116 63.416179 -77.633306 63.343427 -77.567595 63.214351 -77.717792 63.139252 -77.863296 63.085275 -78.116754 63.200270 -78.360825 63.317612 -78.501635 63.397404 # -b -77.454947 63.695452 -77.290668 63.657903 -77.055985 63.632088 -76.816607 63.568723 -76.736815 63.519440 -76.727428 63.474850 -76.703959 63.406792 -76.901094 63.406792 -77.121696 63.460769 -77.342299 63.554642 -77.398623 63.627394 -77.454947 63.695452 # -b -71.278077 63.000789 -71.301545 63.028951 -71.400112 63.064154 -71.498679 63.125171 -71.686426 63.153333 -71.831930 63.268328 -71.874173 63.331693 -71.986821 63.420873 -72.085388 63.549948 -71.874173 63.437300 -71.597246 63.479543 -71.343788 63.613313 -71.555003 63.613313 -71.611327 63.681371 -71.733363 63.709533 -71.939884 63.845650 -72.052532 63.749429 -72.061919 63.676678 -72.207423 63.700146 -72.305990 63.772898 -72.305990 63.836262 -72.395170 63.857384 -72.526593 63.808100 -72.625160 63.826875 -72.700259 63.894933 -72.756583 63.958298 -72.845762 63.981766 -72.977185 63.958298 -73.010041 64.035743 -73.052284 64.063905 -73.033509 64.127270 -73.075752 64.197675 -73.174319 64.270427 -73.286967 64.326751 -73.394922 64.303283 -73.460633 64.394809 -73.484102 64.488683 -73.427778 64.535619 -73.526345 64.608371 -73.662461 64.627146 -73.751641 64.596637 -73.803271 64.577862 -73.972243 64.683470 -74.037955 64.692857 -74.211620 64.669389 -74.310188 64.631839 -74.465079 64.692857 -74.497934 64.763262 -74.634051 64.697551 -74.666906 64.772650 -74.666906 64.866523 -74.765474 64.819586 -74.971995 64.791424 -74.962608 64.683470 -74.718537 64.645920 -74.554258 64.507457 -74.587114 64.549700 -74.718537 64.493376 -74.699762 64.408890 -74.873428 64.437052 -74.962608 64.441746 -75.328714 64.451133 -75.328714 64.455827 -75.380344 64.526232 -75.478911 64.596637 -75.666658 64.601331 -75.732370 64.596637 -75.967053 64.559088 -75.877873 64.474601 -75.901342 64.394809 -76.023377 64.371341 -76.351934 64.357260 -76.295610 64.289202 -76.563149 64.261039 -76.703959 64.237571 -76.760283 64.207062 -76.858850 64.251652 -77.234344 64.298589 -77.379848 64.279814 -77.609838 64.399503 -77.774116 64.394809 -77.994719 64.488683 -78.173078 64.650614 -78.182465 64.767956 -78.149610 64.904072 -77.994719 65.019067 -77.652081 65.136409 -77.431478 65.166918 -77.478415 65.352318 -77.290668 65.347624 -77.431478 65.434457 -77.224957 65.443844 -77.088840 65.392214 -76.868238 65.366399 -76.628861 65.366399 -76.243980 65.295994 -76.009296 65.319462 -75.854405 65.324156 -75.722982 65.324156 -75.394425 65.246710 -75.225453 65.272525 -75.192598 65.378133 -75.061175 65.382827 -74.742005 65.375786 -74.610582 65.410989 -74.455691 65.453232 -74.300800 65.472006 -74.244476 65.530677 -73.991018 65.474353 -73.981631 65.516596 -73.638993 65.448538 -73.638993 65.629244 -73.803271 65.657406 -73.883064 65.784135 -74.202233 65.910865 -74.432223 66.070449 -74.479160 66.154935 -74.333656 66.222994 -74.113053 66.298092 -73.868983 66.443596 -73.648380 66.509308 -73.563894 66.535123 -73.352679 66.661852 -73.240031 66.678280 -73.089833 66.687667 -73.019428 66.713482 -73.019428 66.753378 -73.010041 66.844905 -73.010041 66.973981 -72.855150 67.042039 -72.611079 67.086629 -72.460881 67.166421 -72.371702 67.264988 -72.493737 67.290804 -72.568836 67.408145 -72.578223 67.539568 -72.714340 67.626401 -72.756583 67.795373 -72.888005 67.856391 -73.000654 67.971386 -73.042897 68.133317 -73.197788 68.222497 -73.319823 68.288209 -73.540426 68.238925 -73.704704 68.276474 -73.850208 68.321064 -73.958162 68.426672 -73.948775 68.551054 -73.925307 68.670743 -74.291413 68.710639 -74.300800 68.642581 -74.178765 68.558095 -74.277332 68.518198 -74.530790 68.614419 -74.765474 68.727067 -74.953220 68.811553 -74.831185 68.903079 -74.929752 68.938282 -74.619970 68.966444 -74.343043 68.996953 -74.709149 69.025115 -75.070562 68.992259 -75.380344 68.893692 -75.633803 68.933588 -75.755838 68.830327 -76.309691 68.694211 -76.671104 68.651968 -76.638248 68.865530 -76.736815 69.032155 -76.473970 69.036849 -76.098476 68.996953 -75.732370 69.114295 -75.835630 69.259798 -76.206430 69.379487 -76.506825 69.475707 -76.727428 69.569581 -76.938643 69.614170 -77.159245 69.625905 -76.938643 69.684575 -76.901094 69.766715 -76.990273 69.808958 -77.210876 69.806611 -77.389235 69.855894 -77.464334 69.785489 -77.530045 69.752634 -77.684936 69.808958 -77.708405 69.942727 # -b -78.886516 70.111699 -78.787949 69.949768 -78.924065 69.877016 -79.327721 69.869975 -79.684440 69.825386 -79.825250 69.813651 -79.923817 69.900484 # -b -77.745954 59.982759 -77.745954 60.064898 -77.645040 60.041430 -77.534739 60.076632 -77.501883 60.158772 -77.612185 60.240911 -77.645040 60.245605 -77.680243 60.283154 -77.755341 60.348865 -77.811666 60.409883 -77.755341 60.513144 -77.722486 60.583549 -77.832787 60.604670 -77.844521 60.670382 -77.734220 60.679769 -77.501883 60.717318 -77.513617 60.733746 -77.689630 60.733746 -77.790544 60.771296 -77.933701 60.733746 -78.065124 60.750174 -78.196546 60.825273 -78.196546 60.933227 -78.011147 61.071691 -77.921967 61.231275 -77.799931 61.280559 -77.811666 61.390860 -77.795238 61.407288 -77.778810 61.407288 -77.729526 61.475346 -77.724833 61.559832 -77.656774 61.573913 -77.647387 61.649012 -77.640347 61.738192 -77.680243 61.674827 -77.757688 61.649012 -77.818706 61.695949 -77.889111 61.717070 -77.971250 61.794516 -77.987678 61.897777 -78.032268 61.982263 -78.044002 62.106645 -78.039309 62.214599 -78.027574 62.254495 -77.978291 62.280311 -77.929007 62.310820 -77.893805 62.362450 -77.884417 62.392959 -77.823400 62.479792 -77.741260 62.561931 -77.684936 62.587746 -77.680243 62.519688 -77.591063 62.536116 -77.520658 62.536116 -77.436172 62.526728 -77.361073 62.526728 -77.283628 62.514994 -77.217916 62.489179 -77.140471 62.465711 -77.079453 62.458670 -77.034863 62.423468 -77.023129 62.397652 -76.940990 62.362450 -76.851810 62.348369 -76.781405 62.341328 -76.720387 62.315513 -76.748549 62.240414 -76.725081 62.223987 -76.633554 62.280311 -76.560802 62.289698 -76.483357 62.285004 -76.445807 62.233374 -76.471623 62.172356 -76.422339 62.177050 -76.323772 62.167663 -76.295610 62.177050 -76.312038 62.223987 -76.262754 62.270923 -76.159494 62.310820 -76.058580 62.336635 -75.960013 62.371837 -75.887261 62.423468 -76.103170 62.322554 -76.107863 62.327247 -76.049192 62.348369 -75.915423 62.397652 -75.845018 62.475098 -75.772266 62.449283 -75.633803 62.362450 -75.539929 62.327247 -75.464830 62.219293 -75.403813 62.198171 -75.331061 62.167663 -75.244228 62.158275 -75.216066 62.111339 -75.209025 62.038587 -75.237187 61.986956 -75.286471 61.883696 -75.319327 61.810944 -75.286471 61.841452 -75.220760 61.820331 -75.192598 61.857880 -75.192598 61.949407 -75.138620 61.956447 -75.056481 61.923592 -75.056481 61.857880 -75.056481 61.794516 -74.990770 61.726458 -74.967301 61.663093 -75.044747 61.616156 -75.028319 61.543404 -74.939139 61.573913 -74.913324 61.641971 -74.840572 61.658399 -74.763127 61.641971 -74.709149 61.590341 -74.746699 61.522283 -74.795982 61.505855 -74.852306 61.458918 -74.845266 61.390860 -74.852306 61.369739 -74.795982 61.322802 -74.706803 61.264131 -74.551912 61.243010 -74.596501 61.184339 -74.584767 61.151483 -74.432223 61.172604 -74.253863 61.179645 -74.068464 61.163217 -74.012139 61.071691 -73.913572 60.996592 -73.857248 61.029448 -73.803271 61.062303 -73.702357 61.045875 -73.636646 61.041182 -73.516957 61.020060 -73.394922 61.045875 -73.284621 61.071691 -73.195441 61.013020 -73.162585 60.954349 -73.174319 60.883944 -73.085140 60.874556 # -b -69.982624 60.003881 -70.137515 60.025002 -70.182105 60.025002 -70.304140 60.025002 -70.480153 60.015615 -70.766466 60.036736 -70.975335 60.097754 -71.163082 60.086020 -71.261649 60.053164 -71.163082 60.048470 -70.909623 60.032043 # -b -80.083402 61.670134 -79.994222 61.564526 -79.872187 61.552792 -79.764232 61.649012 -79.773620 61.742885 -79.698521 61.799209 -79.585873 61.914204 -79.468531 62.073789 -79.398126 62.207559 -79.388739 62.280311 -79.553017 62.341328 -79.862799 62.362450 # -b -69.949768 62.930384 -70.104659 62.824776 -70.217307 62.794268 -70.226694 62.789574 -70.236082 62.773146 -70.292406 62.768452 -70.405054 62.813042 -70.513008 62.843551 -70.625656 62.843551 -70.658512 62.899875 -70.813403 62.930384 -71.001150 62.970280 -71.278077 63.000789 # -b -71.031659 62.784880 -70.961254 62.789574 -70.829831 62.754371 -70.674940 62.742637 -70.590454 62.728556 -70.510661 62.698047 -70.402707 62.646417 -70.444950 62.597133 -70.642084 62.566625 -70.829831 62.611214 -70.975335 62.683966 -71.064515 62.759065 -71.031659 62.784880 # -b -74.052036 62.693354 -74.075504 62.742637 -74.028567 62.719169 -74.009793 62.676926 -74.108360 62.641723 -74.286719 62.627642 -74.418142 62.637030 -74.657519 62.658151 -74.779555 62.693354 -74.671600 62.728556 -74.507322 62.698047 -74.328962 62.723862 -74.150603 62.733250 -74.052036 62.693354 # -b -90.015208 68.635540 -89.996434 68.670743 -89.958884 68.694211 -89.850930 68.694211 -89.827461 68.813900 -89.860317 68.933588 -89.860317 69.036849 -89.630327 69.130722 -89.498904 69.243370 -89.287689 69.283267 -89.057699 69.271532 -89.024844 69.217555 -88.959132 69.149497 -88.747917 69.036849 -88.438135 68.940629 -88.231614 68.870224 -88.128353 68.788084 -88.086110 68.670743 -88.029786 68.541667 -87.898363 68.410244 -87.874895 68.292902 -88.043867 68.248312 -88.208145 68.264740 -88.264469 68.295249 -88.264469 68.410244 -88.348955 68.344533 -88.438135 68.255353 -88.386505 68.133317 -88.452216 68.030057 -88.452216 67.954958 -88.250388 67.811801 -88.151821 67.710887 -87.996930 67.626401 -87.888976 67.539568 -87.710616 67.412839 -87.588581 67.323659 -87.480626 67.295497 -87.358591 67.229786 -87.161457 67.269682 -87.147376 67.323659 -87.095745 67.408145 -86.940854 67.438654 -86.851674 67.408145 -86.785963 67.448042 -86.739026 67.417533 -86.631072 67.405799 -86.551280 67.555996 -86.565361 67.694459 -86.541892 67.741396 -86.485568 67.795373 -86.377614 67.877512 -86.157011 67.971386 -86.058444 68.067606 -86.011507 68.133317 -85.945796 68.194335 -85.945796 68.250659 -85.945796 68.281168 -85.936409 68.292902 -85.823761 68.337492 -85.804986 68.445447 -85.772130 68.602684 -85.790905 68.654315 -85.692338 68.698905 -85.471735 68.708292 -85.415411 68.755229 -85.340313 68.738801 -85.265214 68.759922 -85.152566 68.774003 -84.922576 68.748188 -84.734829 68.762269 -84.824009 68.795125 -84.908495 68.799819 -85.063386 68.811553 -85.152566 68.853796 -85.077467 68.893692 -85.119710 68.928895 -84.955432 68.928895 -84.974206 68.980525 -84.889720 68.996953 -84.678505 68.978178 -84.720748 69.039196 -84.856865 69.043889 -84.997675 69.102560 -85.086854 69.118988 -85.241746 69.126029 -85.382556 69.196434 -85.462348 69.283267 -85.452961 69.348978 -85.415411 69.379487 -85.438880 69.421730 -85.485816 69.485094 -85.452961 69.550806 -85.518672 69.642332 -85.485816 69.668148 -85.452961 69.736206 -85.452961 69.801917 -85.349700 69.801917 -85.110323 69.776102 -84.955432 69.825386 -84.777072 69.827732 -84.556470 69.834773 -84.213832 69.801917 -84.091796 69.754981 -84.040166 69.733859 -83.819563 69.684575 -83.584880 69.654067 -83.378358 69.656413 -83.157756 69.675188 -83.012252 69.644679 -82.815118 69.656413 -82.669614 69.691616 -82.585128 69.642332 -82.571047 69.611824 -82.585128 69.534378 -82.552272 69.480401 -82.716551 69.452239 -82.571047 69.449892 -82.383300 69.353672 -82.242490 69.264492 -82.317589 69.219902 -82.275346 69.208168 -82.031275 69.224596 -81.744961 69.224596 -81.580683 69.177659 -81.402323 69.161231 -81.360080 69.100214 -81.449260 69.050930 -81.547827 69.003993 -81.669862 68.973484 -81.843528 68.926548 -81.956176 68.846755 -81.669862 68.835021 -81.566602 68.830327 -81.369468 68.813900 -81.280288 68.731760 -81.294369 68.630847 -81.392936 68.579216 -81.613538 68.518198 -81.735574 68.515852 -81.820060 68.450140 -81.843528 68.445447 -81.899852 68.389122 -82.021888 68.433712 -82.087599 68.527586 -82.209635 68.511158 -82.275346 68.466568 -82.538191 68.515852 -82.561660 68.473609 -82.627371 68.461874 -82.472480 68.377388 -82.317589 68.316371 -82.406769 68.295249 -82.406769 68.267087 -82.284733 68.260047 -82.284733 68.201376 -82.317589 68.149745 -82.120455 68.189642 -81.974951 68.215457 -82.078212 68.105155 -82.120455 67.987814 -82.096986 67.893940 -81.866997 67.753130 -81.637007 67.635788 -81.425792 67.560690 -81.303756 67.476204 -81.294369 67.429267 -81.303756 67.422226 -81.392936 67.391718 -81.392936 67.286110 -81.313144 67.218052 -81.425792 67.161728 -81.425792 67.103057 -81.533746 67.081935 -81.688637 67.056120 -81.801285 67.016224 -82.007807 66.922351 -82.031275 66.861333 -82.111067 66.819090 -82.129842 66.793275 -82.251878 66.732257 -82.463093 66.671239 -82.636759 66.589100 -82.791650 66.584406 -82.970009 66.556244 -83.035721 66.478799 -83.143675 66.438902 -83.232855 66.387272 -83.364277 66.389619 -83.444070 66.422475 -83.500394 66.478799 -83.688141 66.553897 -83.786708 66.589100 -83.885275 66.619609 -83.950986 66.671239 -84.026085 66.706442 -84.115265 66.666546 -84.138733 66.661852 -84.148120 66.650118 -84.129346 66.579713 -83.908743 66.452984 -83.885275 66.354416 -83.753852 66.222994 -83.763239 66.178404 -83.786708 66.222994 -83.993229 66.232381 -84.073022 66.274624 -84.237300 66.337989 -84.392191 66.368497 -84.425047 66.389619 -84.514227 66.389619 -84.514227 66.253503 -84.500146 66.213606 -84.687892 66.248809 -84.800541 66.262890 -84.931963 66.248809 -85.119710 66.307480 -85.161953 66.272277 -85.218277 66.354416 -85.307457 66.499920 -85.349700 66.579713 -85.504591 66.591447 -85.668870 66.539816 -85.790905 66.499920 -85.837842 66.490533 -85.856616 66.514001 -85.992733 66.504614 -86.180480 66.539816 -86.368226 66.560938 -86.499649 66.575019 -86.584135 66.549204 -86.631072 66.523389 -86.687396 66.504614 -86.663928 66.460024 -86.739026 66.443596 -86.687396 66.373191 -86.433938 66.328601 -86.264966 66.288705 -86.100687 66.279318 -86.002120 66.218300 -86.034976 66.150242 -86.044363 66.075143 -86.100687 66.049328 -86.100687 66.044634 -86.100687 66.009432 -86.166399 65.964842 -86.297821 65.915558 -86.368226 65.856887 -86.433938 65.784135 -86.541892 65.716077 -86.673315 65.666794 -86.706171 65.612817 -86.762495 65.603429 -86.926773 65.570574 -86.983097 65.493128 -87.048809 65.434457 -87.128601 65.392214 -87.316348 65.375786 -87.522869 65.371093 -87.757553 65.371093 -87.987543 65.352318 -88.043867 65.415682 -88.151821 65.483741 -88.250388 65.511903 -88.550783 65.633938 -88.705674 65.685568 -88.715062 65.701996 -88.846484 65.730158 -88.968520 65.753627 -89.024844 65.755973 -89.114024 65.765361 -89.334626 65.847500 -89.498904 65.892090 -89.639715 65.906171 -89.785218 65.873315 # -b -90.179487 65.819338 -89.827461 65.739546 -89.574003 65.617510 -89.353401 65.472006 -89.231365 65.415682 -89.043618 65.352318 -88.846484 65.342930 -88.527315 65.324156 -88.208145 65.277219 -88.095497 65.251404 -87.921831 65.281913 -87.799796 65.270179 -87.480626 65.272525 -87.269411 65.260791 -87.039421 65.251404 -87.006566 65.209161 -86.907998 65.213855 -86.973710 65.122328 -87.048809 65.051923 -87.048809 64.981518 -87.236555 64.889991 -87.316348 64.744488 -87.447771 64.716326 -87.522869 64.622452 -87.579193 64.563781 -87.710616 64.535619 -87.799796 64.521538 -87.823264 64.516845 -87.823264 64.483989 -87.823264 64.399503 -87.907750 64.345526 -88.029786 64.223490 -88.095497 64.174207 -88.151821 64.188288 -88.231614 64.150738 -88.348955 64.082680 -88.494459 64.049824 -88.672819 64.012275 -88.860565 64.035743 -89.043618 64.049824 -89.114024 63.991153 -89.254834 64.045131 -89.433193 64.082680 -89.484823 64.108495 -89.508292 64.077986 -89.498904 64.035743 -89.555229 64.077986 -89.606859 64.127270 -89.686651 64.108495 -89.818074 64.160126 -89.907254 64.141351 -89.850930 64.101455 -89.850930 64.068599 -89.850930 64.049824 -89.860317 64.031050 -89.841542 63.995847 -89.808687 63.958298 -89.818074 63.944217 -89.907254 63.944217 # -b -90.069185 63.890240 -89.970618 63.831569 # -b -86.652193 68.260047 -86.628725 68.264740 -86.581788 68.194335 -86.548933 68.107502 -86.539545 67.992507 -86.516077 67.868125 -86.595869 67.760171 -86.727292 67.769558 -86.980750 67.868125 -86.980750 67.964345 -87.004219 68.058219 -86.980750 68.140358 -86.957282 68.227191 -86.816472 68.311677 -86.694436 68.271781 -86.661581 68.260047 -86.652193 68.260047 # -b -85.814373 65.788829 -85.748662 65.819338 -85.739275 65.828725 -85.668870 65.882703 -85.570302 65.896784 -85.528059 65.809951 -85.307457 65.819338 -85.218277 65.692609 -85.063386 65.608123 -85.152566 65.535371 -85.086854 65.434457 -85.044611 65.286606 -84.889720 65.260791 -84.800541 65.371093 -84.645649 65.462619 -84.514227 65.453232 -84.303011 65.371093 -84.148120 65.352318 -84.148120 65.305381 -84.171589 65.223242 -83.974455 65.166918 -83.805482 65.148143 -83.688141 65.152837 -83.519169 65.143450 -83.453457 65.136409 -83.420601 65.075391 -83.354890 65.014374 -83.190612 64.925194 -82.970009 64.889991 -82.791650 64.796118 -82.571047 64.749181 -82.406769 64.763262 -82.186166 64.692857 -82.021888 64.664695 -81.998419 64.650614 -81.942095 64.577862 -81.834141 64.498070 -81.820060 64.446439 -81.801285 64.404196 -81.744961 64.251652 -81.646394 64.178900 -81.712106 64.077986 -81.599457 64.045131 -81.416404 64.073293 -81.280288 64.068599 -81.228657 64.035743 -81.125397 64.087374 -80.993974 64.150738 -80.829696 64.108495 -80.740516 64.035743 -80.618480 63.995847 -80.609093 63.948910 -80.599706 63.909014 -80.632561 63.880852 -80.566850 63.871465 -80.365022 63.857384 -80.233599 63.831569 -80.210131 63.777591 -80.379103 63.763510 -80.533994 63.690759 -80.674804 63.627394 -80.820308 63.587498 -80.918875 63.540561 -80.984587 63.500665 -81.125397 63.474850 -81.270901 63.500665 -81.402323 63.528827 -81.500890 63.578110 -81.500890 63.568723 -81.524359 63.603926 -81.646394 63.573417 -81.721493 63.646169 -81.890465 63.681371 -82.031275 63.686065 -82.120455 63.725961 -82.219022 63.686065 -82.439624 63.700146 -82.481867 63.754123 -82.397381 63.845650 -82.439624 63.934829 -82.571047 63.972379 -82.636759 63.972379 -82.791650 63.981766 -82.937153 64.005234 -82.955928 64.000541 -82.970009 63.991153 -82.979396 63.962991 -83.134288 64.000541 -83.045108 64.101455 -82.937153 64.160126 -82.970009 64.178900 -83.143675 64.164819 -83.354890 64.146045 -83.542637 64.101455 -83.631817 64.092067 -83.617736 64.040437 -83.650591 63.939523 -83.674060 63.904321 -83.631817 63.862078 -83.650591 63.768204 -83.697528 63.768204 -83.786708 63.763510 -83.852419 63.709533 -83.927518 63.695452 -83.983842 63.690759 -84.026085 63.636781 -84.129346 63.587498 -84.279543 63.592191 -84.415660 63.505359 -84.481371 63.430260 -84.556470 63.441994 -84.547082 63.420873 -84.603406 63.352814 -84.734829 63.273022 -84.941351 63.233126 -85.119710 63.200270 -85.274601 63.160374 -85.330925 63.183842 -85.471735 63.160374 -85.617239 63.303531 -85.659482 63.474850 -85.636014 63.641475 -85.692338 63.690759 -85.706419 63.812794 -85.739275 63.885546 -85.804986 63.845650 -85.814373 63.758817 -85.837842 63.716574 -85.969264 63.709533 -86.091300 63.667290 -86.232110 63.671984 -86.297821 63.667290 -86.377614 63.671984 -86.387001 63.681371 -86.452712 63.690759 -86.565361 63.681371 -86.687396 63.641475 -86.804738 63.599232 -86.926773 63.573417 -87.081664 63.559336 -87.170844 63.608619 -87.227168 63.690759 -87.170844 63.758817 -87.095745 63.840956 -87.015953 63.904321 -86.875143 63.967685 -86.640459 64.000541 -86.476181 64.077986 -86.288434 64.174207 -86.297821 64.270427 -86.368226 64.312670 -86.377614 64.399503 -86.387001 64.502764 -86.419857 64.563781 -86.387001 64.631839 -86.377614 64.688163 -86.279047 64.819586 -86.222723 64.939275 -86.232110 64.967437 -86.189867 65.051923 -86.180480 65.199774 -86.147624 65.347624 -86.166399 65.448538 -86.091300 65.525984 -86.011507 65.671487 -85.912940 65.744239 -85.814373 65.788829 # -b -83.894662 65.964842 -83.871194 65.946067 -83.805482 65.927292 -83.739771 65.922599 -83.720996 65.856887 -83.650591 65.765361 -83.552024 65.711384 -83.364277 65.680875 -83.345503 65.622204 -83.552024 65.624551 -83.763239 65.643325 -83.861806 65.716077 -84.091796 65.798217 -84.138733 65.861581 -84.279543 65.976576 -84.467290 66.070449 -84.481371 66.115039 -84.345255 66.115039 -84.148120 66.079837 -83.950986 65.990657 -83.894662 65.964842 # -b -80.254721 69.785489 -80.189010 69.747940 -80.109217 69.729165 -80.066974 69.722125 # -b -79.890961 69.576621 -80.069321 69.630598 -80.069321 69.541419 -80.069321 69.463973 -80.257068 69.541419 -80.388491 69.607130 -80.477670 69.703350 -80.533994 69.766715 -80.430734 69.766715 -80.257068 69.785489 # -b -79.923817 69.900484 -80.036465 69.970889 -80.167888 69.968543 # -b -80.275842 70.001398 -80.519913 69.968543 # -b -81.777817 70.027213 -81.402323 69.980277 -81.059685 69.827732 -80.961118 69.740900 -81.148865 69.745593 -81.378855 69.881710 -81.646394 69.938034 -81.876384 69.895791 -82.021888 69.797224 -82.153311 69.839467 -82.129842 69.855894 -82.195554 69.820692 -82.219022 69.806611 -82.275346 69.834773 -82.552272 69.846507 -82.857361 69.919259 -83.190612 69.989664 -83.467538 69.945074 -83.598961 69.921606 -83.617736 69.921606 -83.650591 69.881710 -83.918131 69.930993 -84.359336 69.956808 -84.856865 69.980277 # -b -85.626627 70.027213 -85.363781 69.970889 -85.584383 69.970889 # -b -82.540538 62.930384 -82.564007 62.913956 -82.826852 62.874060 -83.103779 62.813042 -83.300913 62.733250 -83.455804 62.618255 -83.563758 62.475098 -83.718650 62.341328 -83.807829 62.254495 -83.850072 62.116032 -83.718650 62.090217 -83.521515 62.158275 -83.446417 62.184090 -83.225814 62.188784 -83.080310 62.270923 -82.948888 62.296738 -82.836240 62.322554 -82.850321 62.414080 -82.737672 62.505607 -82.573394 62.531422 -82.460746 62.566625 -82.287080 62.637030 -82.155657 62.688660 -82.108721 62.784880 -82.043009 62.843551 -82.057090 62.895181 -82.188513 62.925690 -82.343404 62.960893 -82.540538 62.930384 # -b -80.050546 62.357756 -80.050546 62.341328 -80.074015 62.341328 -80.139726 62.331941 -80.163194 62.285004 -80.247680 62.259189 -80.294617 62.177050 -80.327473 62.055014 -80.360328 61.897777 -80.360328 61.785128 -80.205437 61.742885 -80.083402 61.670134 # -b -79.862799 62.362450 -80.050546 62.357756 # -b -96.936025 69.534378 -96.954800 69.550806 -96.987655 69.581315 -97.100303 69.644679 -97.198871 69.672841 -97.353762 69.668148 -97.306825 69.729165 -97.353762 69.766715 -97.527427 69.790183 -97.607220 69.851201 -97.771498 69.884056 -97.935777 69.881710 -97.959245 69.813651 -98.156379 69.747940 -98.245559 69.661107 -98.311270 69.600089 -98.203316 69.550806 -98.212703 69.517950 -98.301883 69.557846 -98.480243 69.557846 -98.555341 69.515603 -98.531873 69.487441 -98.545954 69.409996 -98.513098 69.356019 -98.456774 69.302041 -98.588197 69.255105 -98.644521 69.189393 -98.766556 69.184700 -98.883898 69.158884 -99.052870 69.130722 -99.174906 69.130722 -99.306328 69.118988 -99.461220 69.083786 -99.512850 69.003993 -99.503463 68.905426 -99.447139 68.891345 -99.339184 68.835021 -99.127969 68.802165 -99.137356 68.863183 -99.052870 68.898386 -98.921448 68.905426 -98.752475 68.865530 -98.700845 68.806859 -98.564729 68.783391 -98.513098 68.755229 -98.409837 68.778697 -98.367594 68.813900 -98.212703 68.774003 -98.203316 68.715333 -98.090668 68.703598 -97.870065 68.715333 -97.818435 68.675436 -97.682319 68.612072 -97.508653 68.574522 -97.330293 68.555748 -97.166015 68.546360 -97.100303 68.522892 -97.067448 68.574522 -97.011124 68.572176 -96.889088 68.534626 -96.734197 68.499424 -96.579306 68.478302 -96.471352 68.454834 -96.292992 68.482996 -96.185038 68.562788 -96.095858 68.619112 -95.973823 68.626153 -95.875256 68.659009 -95.710977 68.727067 -95.565473 68.731760 -95.556086 68.680130 -95.424663 68.703598 -95.255691 68.762269 -95.204061 68.825634 -95.288547 68.839715 -95.499762 68.795125 -95.588942 68.839715 -95.729752 68.893692 -95.818931 68.973484 -95.818931 69.036849 -95.973823 69.130722 -96.030147 69.182353 -96.095858 69.201127 -96.250749 69.241024 -96.339929 69.309082 -96.494820 69.360712 -96.593387 69.402955 -96.748278 69.461626 -96.879701 69.499176 -96.936025 69.534378 # -b -100.026807 67.861085 -99.693556 67.828229 -99.524584 67.849350 -99.355612 67.785986 -99.271126 67.755477 -99.214802 67.776599 -99.078685 67.785986 -99.078685 67.743743 -98.853389 67.776599 -98.684417 67.785986 -98.491977 67.785986 -98.407491 67.785986 -98.576463 67.870472 -98.576463 67.903328 -98.712579 67.964345 -98.768903 68.039444 -98.684417 68.091074 -98.576463 68.091074 -98.520139 68.069953 -98.435653 67.997201 -98.323005 67.954958 -98.323005 67.870472 -98.182194 67.785986 -98.017916 67.764864 -97.933430 67.701500 -97.679972 67.668644 -97.567324 67.626401 -97.346721 67.638135 -97.177749 67.713234 -97.177749 67.785986 -97.205911 67.954958 -97.290397 67.954958 -97.318559 67.903328 -97.454676 67.903328 -97.454676 67.954958 -97.539162 67.997201 -97.933430 67.985467 -98.017916 67.924449 -97.989754 67.903328 -97.961592 67.839963 -98.097708 67.861085 -98.154032 67.924449 -98.210356 67.997201 -98.379329 68.081687 -98.463815 68.142705 -98.323005 68.112196 -98.323005 68.173214 -98.323005 68.206069 -98.520139 68.267087 -98.520139 68.309330 -98.656255 68.370348 -98.712579 68.412591 -98.576463 68.412591 -98.463815 68.349226 -98.379329 68.382082 -98.379329 68.412591 -98.238518 68.400857 -98.182194 68.412591 -98.125870 68.370348 -97.933430 68.370348 -97.736296 68.391469 -97.736296 68.412591 -97.736296 68.412591 -98.041384 68.546360 -97.905268 68.565135 -97.679972 68.546360 -97.651810 68.494730 -97.454676 68.412591 -97.454676 68.412591 -97.539162 68.515852 -97.290397 68.504117 -97.177749 68.412591 -97.036939 68.382082 -97.008777 68.391469 -96.896129 68.360960 -97.008777 68.309330 -96.867967 68.278821 -96.703688 68.309330 -96.562878 68.330452 -96.562878 68.278821 -96.647364 68.206069 -96.675526 68.133317 -96.788174 68.091074 -96.703688 68.048831 -96.562878 68.081687 -96.478392 68.027710 -96.478392 68.163826 -96.060655 68.267087 -96.032493 68.257700 -96.060655 68.194335 -96.032493 68.112196 -96.060655 67.997201 -96.173304 67.903328 -96.201466 67.776599 -96.060655 67.668644 -96.281258 67.626401 -96.422068 67.584158 -96.337582 67.466816 -96.060655 67.478550 -96.060655 67.358862 -96.060655 67.304885 -95.976169 67.337740 -95.779035 67.412839 -95.694549 67.358862 -95.530271 67.424573 -95.530271 67.358862 -95.638225 67.316619 -95.558433 67.250907 -95.361299 67.241520 -95.304975 67.316619 -95.276813 67.358862 -95.361299 67.478550 -95.333137 67.584158 -95.417623 67.680378 -95.666387 67.743743 -95.666387 67.785986 -95.558433 67.945571 -95.530271 67.997201 -95.586595 68.027710 -95.638225 68.100462 -95.530271 68.100462 -95.445785 68.121583 -95.361299 68.100462 -95.333137 68.069953 -95.248651 68.091074 -94.943562 68.100462 -94.943562 68.100462 -95.060904 68.095768 -94.910706 68.067606 -94.826220 68.051178 -94.727653 68.072300 -94.624392 68.154439 -94.539906 68.194335 -94.417871 68.210763 -94.361547 68.238925 -94.295835 68.248312 -94.286448 68.309330 -94.173800 68.417285 -93.953198 68.482996 -93.709127 68.539320 -93.577704 68.612072 -93.774838 68.630847 -93.765451 68.682477 -93.741982 68.778697 -93.765451 68.865530 -93.821775 68.966444 -93.943810 68.980525 -94.051765 69.013381 -94.065846 68.966444 -94.117476 68.910120 -94.131557 68.846755 -94.009522 68.874917 -93.929729 68.917160 -93.995441 68.863183 -94.150332 68.759922 -94.295835 68.731760 -94.507051 68.715333 -94.624392 68.722373 -94.737040 68.734107 -94.680716 68.799819 -94.680716 68.846755 -94.671329 68.865530 -94.657248 68.940629 -94.572762 68.966444 -94.436646 68.954710 -94.370934 69.013381 -94.295835 69.090826 -94.295835 69.154191 -94.403790 69.126029 -94.403790 69.147150 -94.370934 69.231636 -94.230124 69.341938 -94.065846 69.367753 -93.878099 69.386527 -93.821775 69.414689 -93.943810 69.318469 -93.953198 69.219902 -93.896874 69.172965 -93.709127 69.266839 -93.643415 69.372446 -93.676271 69.426424 -93.732595 69.503869 -93.929729 69.503869 -94.051765 69.463973 -94.183187 69.426424 -94.427258 69.438158 -94.507051 69.492135 -94.680716 69.611824 -94.779284 69.644679 -94.769896 69.588355 -94.859076 69.557846 -94.999886 69.600089 -95.018661 69.630598 -95.018661 69.630598 -95.070291 69.632945 -95.206408 69.672841 -95.290894 69.679882 -95.347218 69.729165 -95.337830 69.759674 -95.445785 69.764368 -95.657000 69.745593 -95.821278 69.745593 -96.074737 69.806611 -96.140448 69.855894 -96.074737 69.895791 -96.173304 69.919259 -96.393906 69.952115 # -b -92.155522 70.050682 -92.014712 69.968543 -92.033486 69.942727 -92.089810 69.912218 -92.221233 69.855894 -92.343269 69.855894 -92.385512 69.834773 -92.465304 69.815998 -92.573258 69.815998 -92.596727 69.778449 -92.751618 69.736206 -92.695294 69.691616 -92.728150 69.668148 -92.507547 69.672841 -92.376124 69.675188 -92.277557 69.625905 -92.178990 69.539072 -91.944307 69.499176 -91.845740 69.510910 -91.704929 69.517950 -91.639218 69.546112 -91.517183 69.611824 -91.371679 69.618864 -91.362292 69.581315 -91.460859 69.522644 -91.338823 69.539072 -91.282499 69.506216 -91.230869 69.473360 -91.151076 69.496829 -91.061897 69.480401 -90.986798 69.452239 -90.911699 69.510910 -90.897618 69.503869 -90.874150 69.440505 -90.874150 69.414689 -90.921087 69.341938 -90.996185 69.297348 -91.165157 69.356019 -91.273112 69.332550 -91.418616 69.348978 -91.198013 69.248064 -90.977411 69.126029 -90.808438 69.107254 -90.789664 69.043889 -90.611304 68.940629 -90.634773 68.914814 -90.470494 68.806859 -90.545593 68.698905 -90.545593 68.583910 -90.587836 68.522892 -90.503350 68.417285 -90.414170 68.365654 -90.381314 68.316371 -90.357846 68.304636 -90.217036 68.349226 -90.104388 68.433712 -90.015208 68.511158 -90.015208 68.572176 -90.015208 68.635540 # -b -89.782872 65.873315 -90.078573 65.910865 -90.177140 65.819338 # -b -89.904907 63.944217 -90.036330 63.981766 -90.059798 63.894933 -90.069185 63.890240 # -b -89.970618 63.831569 -90.026942 63.789326 -90.102041 63.681371 -90.191221 63.618007 -90.322644 63.622700 -90.364887 63.564029 -90.454066 63.549948 -90.566714 63.568723 -90.641813 63.495971 -90.740380 63.559336 -90.853028 63.582804 -90.951595 63.632088 -91.040775 63.641475 -91.181585 63.671984 -91.294233 63.716574 -91.402188 63.754123 -91.481980 63.730655 -91.533611 63.836262 -91.669727 63.768204 -91.777681 63.763510 -91.857474 63.758817 -91.932573 63.798713 -91.998284 63.768204 -92.087464 63.763510 -92.120319 63.763510 -92.176643 63.768204 -92.373778 63.812794 -92.570912 63.840956 -92.636623 63.885546 -92.824370 63.923095 -92.969874 63.948910 -93.265575 64.021662 -93.467403 64.068599 -93.519033 64.026356 -93.551889 63.986460 -93.622294 63.944217 -93.575357 63.885546 -93.411079 63.836262 -93.289043 63.871465 -93.312512 63.904321 -93.298431 63.953604 -93.157620 63.885546 -92.857226 63.852690 -92.636623 63.803407 -92.584993 63.754123 -92.584993 63.716574 -92.472345 63.777591 -92.364390 63.758817 -92.120319 63.730655 -92.087464 63.681371 -92.162562 63.671984 -92.232967 63.641475 -92.284598 63.582804 -92.186031 63.573417 -92.120319 63.641475 -91.974816 63.686065 -91.791762 63.709533 -91.622790 63.681371 -91.571160 63.618007 -91.425656 63.564029 -91.359945 63.533521 -91.115874 63.505359 -91.073631 63.460769 -90.909352 63.486584 -90.871803 63.451381 -90.895271 63.406792 -90.829560 63.366895 -90.740380 63.326999 -90.707525 63.277716 -90.674669 63.219045 -90.655894 63.165067 -90.641813 63.129865 -90.618345 63.089969 -90.618345 63.054766 -90.632426 63.028951 -90.632426 63.019564 -90.632426 63.000789 # -b -90.632426 63.000789 -90.674669 62.944465 -90.763849 62.895181 -90.895271 62.899875 -91.064244 62.890488 -91.186279 62.890488 -91.303621 62.834164 -91.449124 62.803655 -91.636871 62.794268 -91.834005 62.813042 -92.078076 62.813042 -92.232967 62.789574 -92.439489 62.824776 -92.505200 62.763759 -92.340922 62.632336 -92.218886 62.632336 -92.045221 62.646417 -91.998284 62.587746 -92.232967 62.557237 -92.397246 62.580706 -92.608461 62.571318 -92.641317 62.500913 -92.683560 62.409387 -92.683560 62.310820 -92.641317 62.184090 -92.594380 62.059708 -92.707028 62.132460 -92.894775 62.223987 -93.012117 62.198171 -93.002729 62.137154 -93.157620 62.085523 -93.148233 62.029199 -93.223332 61.956447 -93.232719 61.918898 -93.246800 61.918898 -93.378223 61.918898 -93.519033 61.918898 -93.467403 61.825025 -93.378223 61.789822 -93.443934 61.717070 -93.556582 61.627890 -93.706780 61.569220 -93.941463 61.491774 -94.063499 61.421369 -94.260633 61.416675 -94.514091 61.411982 -94.603271 61.369739 -94.401443 61.301680 -94.204309 61.226582 -94.192575 61.167911 -94.248899 61.066997 -94.281754 60.944961 -94.335732 60.883944 -94.523478 60.853435 -94.511744 60.778336 -94.511744 60.696197 -94.511744 60.625792 -94.579803 60.538959 -94.722959 60.522531 -94.755815 60.480288 -94.744081 60.419270 -94.699491 60.332437 -94.722959 60.240911 -94.732347 60.093060 # -b -100.862280 70.013132 -100.951460 69.933340 -100.918604 69.851201 -100.904523 69.776102 -100.984316 69.684575 -101.115738 69.668148 -101.270629 69.691616 -101.378584 69.764368 -101.434908 69.801917 -101.434908 69.858241 -101.434908 69.945074 -101.500619 69.877016 -101.556943 69.808958 -101.566331 69.740900 -101.589799 69.686922 -101.646123 69.661107 -101.702447 69.724472 -101.810402 69.745593 -101.866726 69.703350 -101.974680 69.764368 -102.040391 69.846507 -102.040391 69.930993 -102.096715 69.881710 -102.209364 69.874669 -102.218751 69.895791 -102.284462 69.844160 -102.340786 69.806611 -102.406498 69.806611 -102.528533 69.776102 -102.617713 69.754981 -102.627100 69.715084 -102.552001 69.710391 -102.528533 69.632945 -102.528533 69.557846 -102.584857 69.553153 -102.659956 69.550806 -102.772604 69.576621 -102.889946 69.581315 -103.011981 69.583662 -103.091774 69.583662 -103.143404 69.571927 -103.157485 69.546112 -103.058918 69.463973 -103.035449 69.421730 -103.058918 69.384181 -103.058918 69.353672 -103.068305 69.313776 -103.058918 69.271532 -102.969738 69.344284 -102.871171 69.398262 -102.627100 69.452239 -102.561389 69.510910 -102.364255 69.510910 -102.284462 69.517950 -102.143652 69.515603 -102.096715 69.480401 -101.998148 69.473360 -101.932437 69.461626 -101.998148 69.421730 -102.031004 69.377140 -102.129571 69.332550 -102.120184 69.306735 -102.209364 69.313776 -102.242219 69.271532 -102.176508 69.208168 -102.063860 69.201127 -102.021617 69.273879 -101.890194 69.248064 -101.801014 69.229289 -101.589799 69.219902 -101.547556 69.154191 -101.580412 69.100214 -101.688366 69.090826 -101.735303 69.107254 -101.768159 69.060317 -101.866726 69.013381 -101.866726 68.985219 -102.007536 68.989912 -102.162427 68.961750 -102.364255 68.945322 -102.406498 68.881958 -102.650569 68.877264 -102.758523 68.905426 -102.791379 68.842062 -102.889946 68.823287 -102.946270 68.788084 -103.091774 68.825634 -103.256052 68.802165 -103.354619 68.783391 -103.509510 68.795125 -103.673789 68.813900 -103.838067 68.825634 -103.917860 68.881958 -104.058670 68.905426 -104.237029 68.914814 -104.335596 68.954710 -104.490487 68.950016 -104.570280 68.893692 -104.711090 68.910120 -105.030259 68.921854 -105.250862 68.954710 -105.274330 68.996953 -105.110052 69.050930 -104.988016 69.111948 -105.077196 69.147150 -105.142907 69.126029 -105.241475 69.123682 -105.396366 69.126029 -105.537176 69.130722 -105.570031 69.172965 -105.682680 69.189393 -105.823490 69.201127 -105.926750 69.184700 -106.067560 69.201127 -106.198983 69.201127 -106.367955 69.208168 -106.386730 69.271532 -106.321019 69.320816 -106.367955 69.426424 -106.443054 69.492135 -106.640188 69.517950 -106.696512 69.463973 -106.795079 69.414689 -107.048538 69.377140 -106.992214 69.318469 -106.949970 69.264492 -106.959358 69.212862 -107.128330 69.161231 -107.283221 69.074398 -107.414644 69.003993 -107.499130 68.989912 -107.841768 68.973484 -107.907479 68.966444 -108.085839 68.968791 -108.405008 68.961750 -108.583368 68.966444 -108.649079 68.961750 -108.550512 68.928895 -108.738259 68.818593 -109.024573 68.738801 -109.320274 68.703598 -109.564345 68.647274 -109.916370 68.626153 # -b -110.029018 67.997201 -109.977388 67.976080 # -b -110.029018 67.924449 -109.921064 67.903328 -109.864740 67.933836 -109.808416 67.870472 -109.752092 67.839963 -109.752092 67.785986 -109.808416 67.785986 -109.695768 67.776599 -109.470471 67.743743 -109.498633 67.785986 -109.165383 67.785986 -109.109059 67.776599 -108.996411 67.785986 -108.996411 67.764864 -109.024573 67.722621 -108.996411 67.680378 -109.024573 67.647523 -108.940087 67.584158 -108.996411 67.499672 -108.883763 67.445695 -108.883763 67.487938 -108.855601 67.455082 -108.771115 67.541915 -108.747646 67.668644 -108.663160 67.659257 -108.663160 67.584158 -108.578674 67.584158 -108.634998 67.520793 -108.634998 67.445695 -108.494188 67.424573 -108.409702 67.478550 -108.268892 67.358862 -108.104613 67.358862 -108.020127 67.295497 -107.963803 67.218052 -107.907479 67.164075 -108.048289 67.100710 -108.184406 67.121832 -108.353378 67.077242 -108.437864 67.100710 -108.381540 67.034999 -108.160937 66.924697 -107.991965 66.814396 -107.851155 66.781540 -107.822993 66.924697 -107.738507 66.936432 -107.574229 66.891842 -107.433419 66.969287 -107.264446 66.957553 -107.377094 67.034999 -107.461581 67.088976 -107.292608 67.142953 -107.320770 67.164075 -107.461581 67.164075 -107.574229 67.250907 -107.654021 67.358862 -107.794831 67.433961 -107.710345 67.466816 -107.710345 67.584158 -107.794831 67.617014 -107.794831 67.668644 -108.048289 67.722621 -108.132775 67.785986 -107.991965 67.903328 -107.879317 67.891593 -107.822993 67.945571 -107.710345 67.964345 -107.851155 67.985467 -107.794831 68.027710 -107.738507 68.091074 -107.489743 68.091074 -107.264446 68.142705 -107.236284 68.173214 -107.236284 68.133317 -106.818548 68.154439 -106.846710 68.236578 -106.677738 68.257700 -106.480603 68.245966 -106.508765 68.360960 -106.424279 68.382082 -106.372649 68.297596 -106.260001 68.412591 -106.175515 68.452487 -106.203677 68.515852 -105.950219 68.555748 -106.062867 68.576869 -105.922057 68.626153 -105.922057 68.687171 -106.062867 68.668396 -106.091029 68.687171 -106.372649 68.656662 -106.677738 68.607378 -106.536928 68.534626 -106.677738 68.525239 -106.846710 68.525239 -106.705900 68.412591 -106.677738 68.464221 -106.677738 68.400857 -106.677738 68.339839 -106.734062 68.309330 -106.790386 68.349226 -106.762224 68.382082 -106.846710 68.370348 -106.874872 68.412591 -106.982826 68.412591 -107.067312 68.412591 -107.151798 68.391469 -107.236284 68.349226 -107.264446 68.318717 -107.320770 68.360960 -107.461581 68.370348 -107.574229 68.370348 -107.625859 68.400857 -107.794831 68.370348 -107.879317 68.370348 -107.991965 68.330452 -107.935641 68.278821 -107.794831 68.267087 -107.794831 68.236578 -107.710345 68.215457 -107.907479 68.206069 -108.048289 68.163826 -108.132775 68.173214 -108.020127 68.206069 -108.184406 68.206069 -108.353378 68.184948 -108.353378 68.227191 -108.522350 68.206069 -108.466026 68.257700 -108.634998 68.257700 -108.578674 68.309330 -108.827439 68.278821 -108.883763 68.309330 -108.855601 68.382082 -108.663160 68.482996 -108.663160 68.525239 -108.522350 68.626153 -108.381540 68.668396 -108.104613 68.668396 -107.935641 68.687171 -107.794831 68.687171 -107.597697 68.720026 -107.377094 68.769310 -107.095474 68.799819 -106.982826 68.860836 -106.705900 68.891345 -106.677738 68.950016 -106.424279 68.931241 -106.260001 68.992259 -106.091029 68.950016 -106.034705 68.921854 -105.893895 68.910120 -105.837571 68.820940 -105.645130 68.769310 -105.588806 68.759922 -105.729616 68.720026 -105.701454 68.720026 -105.588806 68.656662 -105.560644 68.595644 -105.391672 68.565135 -105.391672 68.525239 -105.560644 68.525239 -105.673292 68.504117 -105.673292 68.473609 -105.560644 68.482996 -105.391672 68.412591 -105.279024 68.391469 -105.250862 68.360960 -105.086583 68.288209 -104.945773 68.278821 -104.833125 68.257700 -104.748639 68.257700 -104.776801 68.245966 -104.748639 68.184948 -104.748639 68.121583 -104.579667 68.069953 -104.443551 68.081687 -104.190092 68.039444 -104.021120 68.081687 -103.913166 68.048831 -103.856842 68.048831 -103.856842 68.112196 -103.716032 68.081687 -103.687870 68.091074 -103.631546 68.133317 -103.631546 68.206069 -103.326457 68.154439 -103.326457 68.039444 -103.044837 67.933836 -102.904027 67.903328 -102.767910 67.785986 -102.627100 67.785986 -102.345480 67.701500 -102.204670 67.713234 -102.204670 67.776599 -102.068553 67.764864 -102.012229 67.785986 -101.984067 67.776599 -101.871419 67.743743 -101.815095 67.764864 -101.566331 67.713234 -101.369197 67.755477 -101.228386 67.785986 -100.951460 67.764864 -100.838812 67.743743 -100.529030 67.785986 -100.364751 67.870472 -100.195779 67.870472 -100.026807 67.861085 # -b -110.024325 62.890488 -109.874127 62.869366 -109.705155 62.855285 -109.550264 62.838857 -109.428228 62.834164 -109.329661 62.820083 -109.221707 62.789574 -109.132527 62.733250 -109.099671 62.688660 -109.141915 62.658151 -109.278031 62.618255 -109.409454 62.557237 -109.451697 62.545503 -109.442309 62.601827 -109.475165 62.618255 -109.606588 62.658151 -109.794335 62.698047 -109.916370 62.728556 # -b -110.146360 62.552544 -109.949226 62.552544 -109.850659 62.531422 -109.883514 62.461017 # -b -120.017148 69.356019 -119.942050 69.356019 -119.777771 69.348978 -119.599412 69.306735 -119.378809 69.306735 -119.214531 69.285614 -119.026784 69.252758 -118.881280 69.255105 -118.717002 69.231636 -118.618435 69.165925 -118.496399 69.130722 -118.364977 69.095520 -118.120906 69.067358 -117.900303 69.015727 -117.745412 68.973484 -117.660926 68.957057 -117.482567 68.957057 -117.318288 68.954710 -117.182172 68.921854 -117.050749 68.910120 -116.985038 68.905426 -117.017893 68.931241 # -b -119.963171 66.990409 -119.963171 66.990409 # -b -120.061738 65.117634 -119.939703 65.152837 -119.972559 65.223242 -119.859911 65.281913 -119.662776 65.270179 -119.489111 65.256098 -119.456255 65.295994 -119.540741 65.366399 -119.709713 65.401601 -119.873992 65.434457 -119.939703 65.483741 -119.930316 65.525984 -119.827055 65.570574 -119.686245 65.612817 -119.686245 65.657406 -119.695632 65.690262 -119.564209 65.725465 -119.376462 65.711384 -119.212184 65.730158 -119.080761 65.748933 -118.944645 65.716077 -118.803835 65.666794 -118.672412 65.652713 -118.648944 65.598736 -118.583232 65.570574 -118.517521 65.575267 -118.451809 65.570574 -118.315693 65.589348 -118.217126 65.603429 -118.029379 65.629244 -117.987136 65.643325 -117.888569 65.648019 -117.865101 65.697303 -117.977749 65.701996 -118.029379 65.706690 -118.118559 65.706690 -118.217126 65.671487 -118.362630 65.638632 -118.461197 65.643325 -118.437728 65.697303 -118.249982 65.770054 -118.132640 65.819338 -118.062235 65.847500 -118.142027 65.866275 -118.132640 65.901477 -117.996523 65.931986 -117.930812 65.946067 -117.865101 65.971882 -117.879182 65.990657 -117.865101 66.025860 -117.841632 66.049328 -117.799389 66.079837 -117.700822 66.143201 -117.635111 66.173710 -117.611642 66.199525 -117.658579 66.204219 -117.743065 66.204219 -117.775921 66.244115 -117.691435 66.274624 -117.644498 66.288705 -117.635111 66.314520 -117.545931 66.359110 -117.480220 66.389619 -117.456751 66.452984 -117.437977 66.474105 -117.456751 66.478799 -117.536544 66.424821 -117.635111 66.403700 -117.710210 66.394313 -117.733678 66.452984 -117.691435 66.483492 -117.691435 66.525735 -117.578787 66.556244 -117.555318 66.570325 -117.578787 66.584406 -117.578787 66.619609 -117.658579 66.621956 -117.799389 66.600834 -117.912037 66.591447 -118.076316 66.530429 -118.249982 66.452984 -118.249982 66.424821 -118.151415 66.429515 -118.282837 66.359110 -118.461197 66.312173 -118.559764 66.298092 -118.672412 66.298092 -118.794447 66.288705 -119.047906 66.253503 -119.123004 66.262890 -119.268508 66.298092 -119.399931 66.293399 -119.531354 66.274624 -119.676857 66.272277 -119.639308 66.333295 -119.653389 66.337989 -119.742569 66.319214 -119.850523 66.342682 -119.996027 66.354416 # -b -120.073473 66.596140 -119.932662 66.621956 -119.777771 66.645424 -119.688592 66.652464 -119.557169 66.692361 -119.444521 66.722870 -119.303711 66.767459 -119.289630 66.779194 -119.280242 66.809702 -119.158207 66.809702 -119.059640 66.835518 -119.092495 66.856639 -119.181675 66.866026 -119.247387 66.887148 -119.322485 66.891842 -119.378809 66.891842 -119.500845 66.922351 -119.524313 66.948166 -119.599412 66.948166 -119.665123 66.943472 -119.697979 66.922351 -119.712060 66.905923 -119.763690 66.905923 -119.876338 66.927044 -119.951437 66.957553 -119.965518 66.973981 -119.965518 66.990409 # -b -114.889314 69.285614 -114.931557 69.278573 -114.978493 69.248064 -115.030124 69.248064 -115.030124 69.255105 -115.109916 69.252758 -115.241339 69.255105 -115.363374 69.248064 -115.518266 69.285614 -115.724787 69.285614 -115.912534 69.297348 -116.067425 69.325510 -116.212929 69.365406 -116.452306 69.426424 -116.574341 69.461626 -116.574341 69.529684 -116.776169 69.550806 -116.907592 69.593049 -116.916979 69.644679 -116.963916 69.717431 -117.161050 69.776102 -117.236149 69.825386 -117.292473 69.888750 -117.367572 69.952115 # -b -109.916370 68.626153 -110.047793 68.654315 -110.202684 68.635540 -110.291864 68.612072 -110.413899 68.623806 -110.568790 68.640234 -110.700213 68.602684 -110.789393 68.647274 -110.953671 68.623806 -111.052238 68.602684 -111.197742 68.600338 -111.329165 68.590950 -111.371408 68.572176 -111.239985 68.567482 -111.249372 68.539320 -111.493443 68.539320 -111.714046 68.522892 -111.911180 68.499424 -112.023828 68.522892 -112.145863 68.522892 -112.352385 68.522892 -112.784203 68.515852 -112.981337 68.511158 -113.258263 68.490036 -113.225408 68.515852 -113.028273 68.567482 -113.183165 68.595644 -113.370911 68.642581 -113.511722 68.734107 -113.577433 68.823287 -113.676000 68.893692 -113.676000 68.992259 -113.610289 69.065011 -113.610289 69.088479 -113.765180 69.123682 -113.774567 69.149497 -113.854359 69.189393 -114.018638 69.229289 -114.028025 69.266839 -114.182916 69.283267 -114.337807 69.297348 -114.506780 69.297348 -114.769625 69.290307 -114.891661 69.285614 # -b -117.015546 68.931241 -116.762088 68.910120 -116.457000 68.891345 -116.231703 68.900733 -116.034569 68.820940 -115.978245 68.879611 -116.147217 68.931241 -116.288027 68.980525 -116.203541 68.992259 -116.062731 69.001646 -115.954777 68.971138 -115.757643 68.961750 -115.757643 69.001646 -115.673157 68.992259 -115.560509 68.992259 -115.255420 68.961750 -115.363374 68.931241 -115.086448 68.870224 -115.058286 68.820940 -114.889314 68.851449 -114.889314 68.790431 -114.804828 68.769310 -114.696873 68.759922 -114.556063 68.720026 -114.471577 68.668396 -114.330767 68.595644 -114.218119 68.555748 -114.218119 68.412591 -114.082002 68.482996 -114.082002 68.400857 -114.138326 68.339839 -114.053840 68.297596 -114.218119 68.309330 -114.274443 68.257700 -114.387091 68.245966 -114.443415 68.288209 -114.471577 68.309330 -114.725035 68.278821 -115.058286 68.297596 -114.832990 68.257700 -114.973800 68.194335 -115.339906 68.215457 -115.339906 68.206069 -115.255420 68.173214 -115.339906 68.133317 -115.339906 68.100462 -115.339906 68.039444 -115.616833 67.976080 -115.504185 67.933836 -115.419698 67.924449 -115.283582 67.945571 -115.391536 67.903328 -115.170934 67.870472 -114.748504 67.785986 -114.668711 67.839963 -114.527901 67.818842 -114.443415 67.776599 -114.302605 67.776599 -114.218119 67.785986 -113.997516 67.755477 -113.631410 67.764864 -113.382646 67.734355 -113.044701 67.764864 -113.072863 67.743743 -112.852261 67.722621 -112.401668 67.734355 -112.350038 67.785986 -112.124742 67.785986 -112.012094 67.785986 -112.068418 67.734355 -111.871284 67.734355 -111.983932 67.764864 -111.843122 67.818842 -111.786798 67.764864 -111.594357 67.755477 -111.566195 67.785986 -111.425385 67.776599 -111.340899 67.891593 -111.148459 67.912715 -111.148459 67.870472 -111.171927 67.785986 -110.979486 67.785986 -110.838676 67.818842 -110.613380 67.945571 -110.420940 67.997201 -110.195643 67.997201 -110.111157 68.060566 -110.026671 67.997201 # -b -109.975041 67.976080 -110.026671 67.924449 # -b -115.788152 62.996095 -115.736521 63.031298 -115.736521 63.019564 -115.745909 62.974974 -115.755296 62.939771 -115.769377 62.890488 -115.755296 62.838857 -115.713053 62.798961 -115.623873 62.740290 -115.501838 62.688660 -115.393883 62.658151 -115.257767 62.597133 -115.116957 62.566625 -115.018390 62.510300 -114.905742 62.449283 -114.783706 62.414080 -114.628815 62.392959 -114.530248 62.414080 -114.422294 62.496219 -114.333114 62.526728 -114.319033 62.576012 -114.342501 62.693354 -114.375357 62.749678 -114.455149 62.829470 -114.441068 62.820083 -114.333114 62.768452 -114.267402 62.719169 -114.211078 62.667538 -114.154754 62.613561 -114.154754 62.583052 -114.178223 62.545503 -114.164142 62.510300 -114.178223 62.461017 -114.164142 62.418774 -114.112511 62.357756 -114.023332 62.296738 -113.910683 62.214599 -113.793342 62.158275 -113.722937 62.146541 -113.624370 62.167663 -113.582127 62.209906 -113.535190 62.285004 -113.502334 62.357756 -113.394380 62.331941 -113.384992 62.254495 -113.427235 62.209906 -113.469478 62.141847 -113.450704 62.085523 -113.305200 62.050321 -113.159696 62.038587 -112.986030 62.050321 -112.831139 62.076136 -112.652780 62.090217 -112.488501 62.116032 -112.277286 62.202865 -112.113008 62.310820 -111.948729 62.367144 -111.883018 62.439895 -111.836081 62.522035 -111.817307 62.597133 -111.704658 62.658151 -111.573236 62.719169 -111.418345 62.749678 -111.263453 62.789574 -111.075707 62.824776 -110.953671 62.850592 -110.831636 62.864673 -110.700213 62.890488 -110.545322 62.899875 -110.399818 62.916303 -110.301251 62.909262 -110.169828 62.899875 -110.024325 62.890488 # -b -109.914023 62.728556 -110.092383 62.740290 -110.247274 62.744984 -110.397471 62.740290 -110.542975 62.733250 -110.552362 62.723862 -110.467876 62.714475 -110.345841 62.698047 -110.190950 62.679273 -110.078302 62.672232 -110.111157 62.637030 -110.266049 62.637030 -110.388084 62.637030 -110.355228 62.592440 -110.233193 62.587746 -110.144013 62.552544 # -b -109.881168 62.461017 -110.059527 62.484485 -110.289517 62.479792 -110.420940 62.430508 -110.533588 62.414080 -110.674398 62.444589 -110.843370 62.444589 -110.960712 62.475098 -111.063972 62.496219 -111.031117 62.439895 -110.984180 62.383571 -110.974793 62.331941 -110.974793 62.310820 -111.171927 62.292045 -111.359674 62.235721 -111.439466 62.188784 -111.547421 62.146541 -111.678843 62.094911 -111.744555 62.106645 -111.768023 62.069095 -111.758636 62.012771 -111.777410 61.956447 -111.800879 61.897777 -111.932301 61.820331 -112.002707 61.778088 -112.087193 61.742885 -112.232696 61.674827 -112.307795 61.632584 -112.443912 61.564526 -112.631658 61.505855 -112.838180 61.501161 -112.903891 61.458918 -113.082251 61.454225 -113.260610 61.480040 -113.302853 61.400247 -113.413154 61.327496 -113.556311 61.318108 -113.711202 61.280559 -113.744058 61.243010 -113.765180 61.163217 -113.798035 61.088118 -113.875481 61.013020 -114.030372 60.975470 -114.185263 61.003632 -114.328420 61.050569 -114.516167 61.029448 -114.659324 60.991898 -114.837683 60.933227 -115.058286 60.900372 -115.210830 60.874556 -115.344600 60.858129 -115.487757 60.832313 -115.654382 60.832313 -115.785805 60.858129 -115.919574 60.841701 -116.083853 60.808845 -116.238744 60.799458 -116.337311 60.841701 -116.414757 60.933227 -116.503936 60.961389 -116.614238 61.008326 -116.724539 61.029448 -116.834840 61.050569 -116.924020 61.078731 -117.043708 61.109240 -117.165744 61.120974 -117.222068 61.151483 -117.287779 61.167911 -117.353491 61.184339 -117.463792 61.200766 -117.529503 61.221888 -117.618683 61.252397 -117.684394 61.280559 -117.740718 61.327496 -117.806430 61.374432 -117.937853 61.400247 -117.994177 61.416675 -117.994177 61.386166 -118.102131 61.395554 -118.224166 61.365045 -118.212432 61.311068 -118.111518 61.285253 -118.111518 61.273518 -118.200698 61.280559 -118.289878 61.280559 -118.400179 61.280559 -118.487012 61.280559 -118.609047 61.289946 -118.665371 61.311068 -118.707614 61.353311 -118.627822 61.395554 -118.562111 61.437797 -118.472931 61.496468 -118.397832 61.555139 -118.299265 61.585647 -118.153761 61.580954 -118.022339 61.555139 -117.843979 61.501161 -117.703169 61.470653 -117.590521 61.433103 -117.515422 61.407288 -117.402774 61.365045 -117.304207 61.332189 -117.247883 61.318108 -117.104726 61.311068 -116.905245 61.280559 -116.740967 61.285253 -116.696377 61.327496 -116.630665 61.416675 -116.485162 61.407288 -116.386595 61.353311 -116.264559 61.289946 -116.109668 61.264131 -115.954777 61.210154 -115.821007 61.205460 -115.811620 61.285253 -115.710706 61.318108 -115.710706 61.365045 -115.856210 61.395554 -115.799886 61.449531 -115.644995 61.437797 -115.560509 61.454225 -115.490104 61.416675 -115.292969 61.480040 -115.302357 61.505855 -115.391536 61.576260 -115.316438 61.590341 -115.260114 61.649012 -115.269501 61.705336 -115.194402 61.752273 -115.283582 61.799209 -115.236645 61.841452 -115.161547 61.853187 -115.072367 61.841452 -114.964412 61.825025 -114.861152 61.815637 -114.729729 61.810944 -114.607694 61.820331 -114.598306 61.857880 -114.621775 61.888389 -114.654630 61.930632 -114.795440 61.925939 -114.786053 61.970528 -114.664018 61.961141 -114.598306 61.970528 -114.556063 61.982263 -114.499739 62.012771 -114.556063 62.064402 -114.720342 62.064402 -114.875233 62.085523 -115.081754 62.101951 -115.039511 62.141847 -114.950331 62.177050 -114.917476 62.228680 -114.940944 62.249802 -115.006655 62.240414 -115.128691 62.228680 -115.227258 62.285004 -115.260114 62.367144 -115.358681 62.444589 -115.415005 62.479792 -115.560509 62.496219 -115.757643 62.514994 -115.757643 62.557237 -115.799886 62.637030 -115.954777 62.698047 -116.109668 62.754371 -116.067425 62.820083 -116.119055 62.881100 -116.264559 62.909262 -116.344352 62.939771 -116.428838 62.991402 -116.363126 63.010176 -116.222316 62.970280 -116.053344 62.956199 -115.945390 62.979668 -115.846822 62.996095 -115.799886 62.996095 # -b -113.061129 61.841452 -113.061129 61.846146 -113.018886 61.871961 -112.929706 61.879002 -112.807671 61.879002 -112.652780 61.897777 -112.497889 61.918898 -112.357079 61.951754 -112.225656 61.991650 -112.169332 61.991650 -112.169332 61.944713 -112.258512 61.897777 -112.277286 61.862574 -112.211575 61.825025 -112.235043 61.785128 -112.389934 61.773394 -112.446258 61.738192 -112.563600 61.717070 -112.610537 61.747579 -112.699717 61.778088 -112.784203 61.768701 -112.831139 61.794516 -112.929706 61.820331 -113.018886 61.825025 -113.061129 61.841452 # -b -116.440572 61.221888 -116.518017 61.217194 -116.428838 61.200766 -116.363126 61.163217 -116.285681 61.130361 -116.175379 61.092812 -116.163645 61.034141 -116.163645 60.998939 -116.241091 61.003632 -116.351392 61.045875 -116.482815 61.078731 -116.649440 61.109240 -116.616584 61.142096 -116.571995 61.196073 -116.518017 61.226582 -116.449959 61.221888 -116.440572 61.221888 # -b -111.261107 62.662845 -111.204783 62.658151 -111.171927 62.662845 -111.106216 62.658151 -111.007648 62.667538 -110.876226 62.698047 -110.805821 62.693354 -110.730722 62.688660 -110.665011 62.679273 -110.665011 62.613561 -110.763578 62.606521 -110.895000 62.601827 -111.031117 62.561931 -111.106216 62.557237 -111.195395 62.576012 -111.303350 62.571318 -111.350286 62.545503 -111.425385 62.536116 -111.556808 62.475098 -111.678843 62.449283 -111.702312 62.484485 -111.580276 62.566625 -111.481709 62.622949 -111.369061 62.627642 -111.261107 62.662845 # -b -129.613357 70.020173 -129.688456 69.980277 -129.852735 69.933340 -129.998238 69.895791 # -b -130.164864 69.703350 -129.953648 69.736206 -129.779983 69.801917 -129.592236 69.827732 -129.446732 69.839467 -129.273066 69.858241 -129.085319 69.914565 -128.953897 69.968543 -128.953897 69.926299 -128.986752 69.846507 -129.061851 69.851201 -129.174499 69.766715 -129.207355 69.703350 -129.085319 69.733859 -128.906960 69.764368 -128.766150 69.797224 -128.620646 69.877016 -128.423512 69.949768 # -b -127.163261 70.036601 -127.017758 69.956808 -126.942659 69.862935 -126.876948 69.783143 -126.797155 69.703350 -126.679813 69.623558 -126.501454 69.583662 -126.435743 69.522644 -126.402887 69.503869 -126.388806 69.487441 -126.355950 69.492135 -126.224527 69.449892 -126.060249 69.391221 -125.872502 69.365406 -125.694143 69.365406 -125.473540 69.360712 -125.487621 69.384181 -125.421910 69.398262 -125.234163 69.402955 -125.234163 69.433464 -125.374973 69.461626 -125.553333 69.445198 -125.694143 69.426424 -125.642512 69.496829 -125.497009 69.499176 -125.356198 69.503869 -125.210695 69.529684 -125.299874 69.534378 -125.407829 69.581315 -125.497009 69.630598 -125.389054 69.668148 -125.144983 69.703350 -125.144983 69.752634 -125.285793 69.764368 -125.285793 69.844160 -125.234163 69.785489 -125.079272 69.862935 -124.924381 69.921606 -124.858669 69.989664 # -b -124.914993 70.001398 -125.046416 69.975583 -125.121515 69.921606 -125.187226 69.942727 # -b -124.760102 70.027213 -124.703778 69.961502 # -b -124.429199 70.001398 -124.452667 69.961502 -124.462054 69.914565 -124.462054 69.869975 -124.476135 69.808958 -124.518378 69.766715 -124.494910 69.717431 -124.396343 69.691616 -124.264920 69.724472 -124.166353 69.722125 -124.067786 69.705697 -124.100642 69.686922 -124.142885 69.644679 -124.264920 69.569581 -124.410424 69.492135 -124.443280 69.445198 -124.485523 69.402955 -124.518378 69.463973 -124.560621 69.402955 -124.551234 69.360712 -124.429199 69.365406 -124.307163 69.344284 -124.175740 69.341938 -124.166353 69.341938 -124.110029 69.348978 -124.020849 69.391221 -123.898814 69.391221 -123.734535 69.377140 -123.635968 69.356019 -123.481077 69.398262 -123.438834 69.461626 -123.359042 69.496829 -123.260475 69.515603 -123.237006 69.588355 -123.138439 69.684575 -123.138439 69.729165 -123.119665 69.801917 -122.964773 69.801917 -122.875594 69.820692 -122.697234 69.839467 -122.500100 69.806611 -122.345209 69.813651 -122.213786 69.806611 -122.204399 69.790183 -122.115219 69.790183 -122.026039 69.806611 -121.927472 69.801917 -121.805437 69.801917 -121.650546 69.778449 -121.542591 69.776102 -121.397088 69.759674 -121.242196 69.710391 -121.101386 69.672841 -120.955883 69.632945 -120.833847 69.607130 -120.725893 69.546112 -120.571002 69.485094 -120.481822 69.433464 -120.317543 69.402955 -120.172040 69.377140 -120.153265 69.367753 -120.017148 69.356019 # -b -119.963171 66.990409 -120.005414 66.978675 -120.080513 66.964594 -120.183774 66.943472 -120.249485 66.901229 -120.258873 66.866026 -120.371521 66.835518 -120.456007 66.800315 -120.545186 66.809702 -120.624979 66.809702 -120.709465 66.800315 -120.812726 66.779194 -120.920680 66.762766 -121.019247 66.753378 -121.075571 66.718176 -121.131895 66.697054 -121.230462 66.687667 -121.286786 66.652464 -121.305561 66.605528 -121.404128 66.591447 -121.516776 66.584406 -121.605956 66.584406 -121.657586 66.596140 -121.760847 66.560938 -121.812477 66.535123 -121.892270 66.514001 -121.967368 66.518695 -122.080017 66.490533 -122.202052 66.483492 -122.286538 66.523389 -122.408573 66.499920 -122.497753 66.488186 -122.610401 66.478799 -122.676113 66.478799 -122.774680 66.478799 -122.840391 66.474105 -122.882634 66.460024 -122.929571 66.429515 -123.004670 66.417781 -123.093849 66.429515 -123.084462 66.488186 -123.103237 66.504614 -123.192416 66.483492 -123.272209 66.443596 -123.380163 66.408394 -123.558523 66.382578 -123.708720 66.342682 -123.844837 66.288705 -123.985647 66.253503 -124.051358 66.248809 -124.131150 66.272277 -124.253186 66.323908 -124.337672 66.328601 -124.361140 66.312173 -124.417464 66.284011 -124.473788 66.267584 -124.525419 66.248809 -124.623986 66.248809 -124.736634 66.248809 -124.825814 66.234728 -124.900912 66.244115 -125.013560 66.272277 -125.088659 66.248809 -125.121515 66.187791 -125.144983 66.143201 -125.154371 66.079837 -125.121515 66.025860 -125.112128 65.985963 -125.022948 65.936680 -124.947849 65.901477 -124.891525 65.887396 -124.868057 65.927292 -124.844588 65.976576 -124.746021 65.981270 -124.694391 65.950761 -124.638067 65.990657 -124.638067 66.079837 -124.558274 66.110346 -124.459707 66.124427 -124.318897 66.147895 -124.239105 66.150242 -124.220330 66.124427 -124.187475 66.079837 -124.107682 66.049328 -124.009115 66.054022 -123.919935 66.058715 -123.821368 66.049328 -123.675864 66.079837 -123.511586 66.107999 -123.389551 66.138508 -123.290983 66.115039 -123.225272 66.089224 -123.201804 66.044634 -123.183029 66.014125 -123.084462 66.025860 -123.051606 66.070449 -123.051606 66.115039 -123.051606 66.154935 -123.093849 66.192485 -122.971814 66.183097 -122.863860 66.173710 -122.751211 66.154935 -122.586933 66.164323 -122.455510 66.159629 -122.342862 66.164323 -122.202052 66.178404 -122.033080 66.164323 -121.948594 66.154935 -121.845333 66.143201 -121.746766 66.115039 -121.690442 66.098611 -121.671667 66.044634 -121.615343 66.009432 -121.540244 66.009432 -121.418209 66.016472 -121.319642 66.009432 -121.272705 65.964842 -121.338417 65.892090 -121.436984 65.868622 -121.559019 65.868622 -121.760847 65.861581 -121.911044 65.873315 -122.080017 65.892090 -122.220827 65.927292 -122.286538 65.960148 -122.366330 65.964842 -122.464898 65.950761 -122.539996 65.950761 -122.563465 65.922599 -122.563465 65.878009 -122.554077 65.847500 -122.432042 65.828725 -122.333475 65.819338 -122.253682 65.802910 -122.187971 65.755973 -122.211439 65.697303 -122.244295 65.648019 -122.253682 65.584655 -122.422654 65.530677 -122.539996 65.525984 -122.685500 65.516596 -122.774680 65.483741 -122.840391 65.448538 -122.840391 65.406295 -122.793454 65.371093 -122.793454 65.314768 -122.816923 65.270179 -122.849778 65.227936 -122.938958 65.190386 -123.014057 65.171612 -123.117318 65.157531 -123.201804 65.152837 -123.305065 65.148143 -123.436487 65.143450 -123.478730 65.122328 -123.469343 65.094166 -123.389551 65.089472 -123.370776 65.033148 -123.234659 65.028455 -123.150173 65.000293 -123.051606 64.962743 -122.971814 64.939275 -122.774680 64.929888 -122.577546 64.925194 -122.422654 64.929888 -122.319394 64.939275 -122.211439 64.889991 -122.047161 64.899379 -121.892270 64.948662 -121.760847 65.004986 -121.615343 65.051923 -121.615343 65.162224 -121.507389 65.223242 -121.507389 65.281913 -121.460452 65.319462 -121.272705 65.382827 -121.150670 65.425070 -120.953536 65.502515 -120.789257 65.535371 -120.624979 65.535371 -120.521718 65.535371 -120.456007 65.483741 -120.456007 65.425070 -120.423151 65.347624 -120.502943 65.265485 -120.568655 65.195080 -120.676609 65.141103 -120.789257 65.103553 -120.911293 65.098860 -120.977004 65.042536 -120.977004 64.981518 -121.117814 64.958050 -121.253931 64.906419 -121.361885 64.906419 -121.469839 64.861829 -121.493308 64.810199 -121.427596 64.749181 -121.319642 64.716326 -121.174138 64.758569 -121.052103 64.814893 -120.930067 64.847748 -120.812726 64.880604 -120.554574 64.915806 -120.413764 65.019067 -120.258873 65.080085 -120.193161 65.094166 -120.061738 65.117634 # -b -119.996027 66.354416 -120.080513 66.333295 -120.235404 66.323908 -120.357440 66.359110 -120.437232 66.403700 -120.371521 66.417781 -120.249485 66.424821 -120.258873 66.474105 -120.315197 66.518695 -120.216629 66.530429 -120.103981 66.549204 -120.071126 66.596140 # -b -140.033305 69.656413 -139.911270 69.656413 -139.746991 69.644679 -139.690667 69.595396 -139.535776 69.593049 -139.362110 69.588355 -139.225994 69.534378 -139.038247 69.473360 -138.906824 69.398262 -138.751933 69.306735 -138.634592 69.248064 -138.489088 69.248064 -138.432764 69.219902 -138.381133 69.259798 -138.310728 69.201127 -138.122982 69.130722 -137.939928 69.067358 -137.770956 69.036849 -137.639533 68.992259 -137.540966 68.950016 -137.418931 68.957057 -137.278121 68.945322 -137.132617 68.933588 -137.024663 68.914814 -136.888546 68.886652 -136.789979 68.877264 -136.733655 68.877264 -136.724268 68.886652 -136.635088 68.893692 -136.536521 68.870224 -136.536521 68.905426 -136.592845 68.950016 -136.428567 68.917160 -136.207964 68.893692 -136.118784 68.865530 -135.987362 68.858490 -135.785534 68.802165 -135.588400 68.734107 -135.400653 68.659009 -135.292698 68.668396 -135.269230 68.670743 -135.170663 68.663702 -135.226987 68.710639 -135.325554 68.759922 -135.424121 68.790431 -135.442896 68.830327 -135.480445 68.863183 -135.555544 68.893692 -135.433508 68.914814 -135.302086 68.891345 -135.156582 68.870224 -134.992303 68.886652 -134.828025 68.874917 -134.696602 68.839715 -134.663747 68.748188 -134.574567 68.691864 -134.410288 68.642581 -134.288253 68.600338 -134.241316 68.555748 -134.166217 68.630847 -134.189686 68.722373 -134.274172 68.759922 -134.330496 68.799819 -134.410288 68.846755 -134.508855 68.910120 -134.598035 68.968791 -134.649666 69.027462 -134.649666 69.065011 -134.565179 69.083786 -134.461919 69.114295 -134.297640 69.196434 -134.156830 69.231636 -134.020714 69.264492 -133.912759 69.330203 -133.800111 69.325510 -133.734400 69.365406 -133.560734 69.379487 -133.326051 69.391221 -133.175853 69.419383 -133.030349 69.475707 -133.006881 69.550806 -133.006881 69.611824 -132.875458 69.654067 -132.833215 69.630598 -132.744035 69.632945 -132.697099 69.684575 -132.589144 69.733859 -132.476496 69.733859 -132.467109 69.703350 -132.368542 69.710391 -132.204263 69.703350 -132.091615 69.745593 -132.058760 69.776102 -132.035291 69.776102 -132.002435 69.785489 -131.903868 69.785489 -131.748977 69.834773 -131.518987 69.881710 -131.509600 69.914565 -131.486132 69.949768 -131.321853 69.938034 -131.152881 69.907525 -131.021458 69.970889 # -b -129.998238 69.895791 -130.129661 69.874669 -130.261084 69.846507 -130.406588 69.806611 -130.570866 69.722125 -130.735145 69.684575 -130.913504 69.618864 -131.035539 69.560193 -131.166962 69.588355 -131.307772 69.600089 -131.462663 69.581315 -131.730203 69.557846 -131.927337 69.522644 -132.124471 69.461626 -132.190182 69.402955 -132.058760 69.409996 -132.180795 69.367753 -132.345073 69.325510 -132.401397 69.271532 -132.490577 69.285614 -132.589144 69.224596 -132.645468 69.161231 -132.664243 69.217555 -132.753423 69.231636 -132.974025 69.111948 -132.988106 69.050930 -132.842602 69.060317 -132.678324 69.118988 -132.565676 69.126029 -132.443640 69.158884 -132.312218 69.170619 -132.213651 69.182353 -132.049372 69.236330 -131.838157 69.330203 -131.814689 69.353672 -131.885094 69.384181 -131.828770 69.402955 -131.683266 69.433464 -131.594086 69.421730 -131.608167 69.332550 -131.575311 69.356019 -131.476744 69.414689 -131.443889 69.344284 -131.411033 69.360712 -131.354709 69.421730 -131.288998 69.456932 -131.242061 69.452239 -131.120025 69.480401 -131.021458 69.438158 -131.035539 69.344284 -131.087170 69.231636 -131.087170 69.201127 -130.955747 69.297348 -130.814937 69.384181 -130.749226 69.440505 -130.561479 69.546112 -130.439443 69.623558 -130.406588 69.686922 -130.162517 69.703350 # -b -135.060362 69.384181 -135.041587 69.377140 -135.018119 69.372446 -134.952407 69.365406 -134.905471 69.395915 -134.952407 69.431117 -135.027506 69.461626 -134.928939 69.461626 -134.830372 69.426424 -134.731805 69.452239 -134.652012 69.421730 -134.544058 69.461626 -134.497121 69.515603 -134.576914 69.492135 -134.652012 69.515603 -134.576914 69.546112 -134.520590 69.588355 -134.478347 69.637639 -134.553445 69.679882 -134.576914 69.736206 -134.497121 69.752634 -134.487734 69.733859 -134.497121 69.691616 -134.412635 69.668148 -134.314068 69.644679 -134.323455 69.588355 -134.257744 69.553153 -134.159177 69.529684 -134.055916 69.569581 -133.971430 69.602436 -133.882250 69.560193 -133.891638 69.492135 -133.938574 69.438158 -134.079385 69.379487 -134.201420 69.309082 -134.314068 69.236330 -134.454878 69.154191 -134.600382 69.107254 -134.717724 69.048583 -134.830372 69.050930 -134.938326 69.072052 -134.961795 69.050930 -134.952407 69.025115 -135.060362 69.072052 -135.041587 69.107254 -134.872615 69.090826 -134.741192 69.137763 -134.666093 69.208168 -134.750579 69.182353 -134.896083 69.135416 -134.994650 69.158884 -135.126073 69.201127 -135.215253 69.290307 -135.238721 69.365406 -135.327901 69.391221 -135.360757 69.426424 -135.313820 69.461626 -135.248108 69.461626 -135.158929 69.431117 -135.107298 69.391221 -135.074443 69.384181 -135.060362 69.384181 # -b -135.954506 69.266839 -135.987362 69.266839 -135.987362 69.264492 -135.996749 69.231636 -135.996749 69.208168 -135.987362 69.182353 -135.987362 69.147150 -135.931037 69.126029 -135.832470 69.107254 -135.785534 69.060317 -135.776146 69.043889 -135.686967 69.050930 -135.579012 69.036849 -135.480445 68.996953 -135.424121 68.973484 -135.325554 68.966444 -135.245762 68.961750 -135.203519 68.928895 -135.123726 68.914814 -135.039240 68.921854 -135.015772 68.957057 -135.058015 68.985219 -135.123726 69.020421 -135.170663 69.036849 -135.245762 69.043889 -135.292698 69.072052 -135.344329 69.083786 -135.400653 69.090826 -135.442896 69.102560 -135.433508 69.118988 -135.400653 69.147150 -135.433508 69.158884 -135.513301 69.170619 -135.597787 69.172965 -135.644724 69.189393 -135.686967 69.236330 -135.733903 69.266839 -135.785534 69.285614 -135.841858 69.290307 -135.884101 69.285614 -135.931037 69.271532 -135.954506 69.266839 # -b -139.434862 59.954597 -139.556898 60.025002 -139.634343 60.086020 -139.711789 60.057858 # -b -145.327765 70.008439 -145.313684 69.989664 -145.083695 69.989664 -144.952272 69.982624 # -b -144.919416 70.024867 -144.797381 69.982624 -144.609634 69.982624 # -b -142.560847 70.006092 -142.452892 69.956808 -142.462280 69.933340 -142.307389 69.914565 -142.110254 69.874669 -142.077399 69.834773 -141.974138 69.820692 -141.800472 69.806611 -141.687824 69.790183 -141.579870 69.766715 -141.500077 69.729165 -141.448447 69.691616 -141.392123 69.656413 -141.317024 69.637639 -141.270087 69.672841 -141.227844 69.698656 -141.227844 69.729165 -141.213763 69.740900 -141.162133 69.745593 -141.082341 69.745593 -141.026017 69.724472 -141.007242 69.722125 # -b -141.004895 69.722125 -140.990814 69.703350 -140.948571 69.698656 -140.826536 69.672841 -140.638789 69.654067 -140.375943 69.644679 -140.197584 69.649373 -140.033305 69.656413 # -b -141.401510 59.992146 -141.511811 60.032043 -141.643234 60.008574 # -b -142.084439 59.987453 -142.218209 60.003881 -142.340244 60.025002 -142.492789 60.036736 -142.614824 60.086020 -142.757981 60.097754 -142.835426 60.109488 -142.912872 60.069592 -143.023173 60.109488 -143.088885 60.114182 -143.145209 60.053164 -143.288366 60.048470 -143.466725 60.041430 -143.631004 60.048470 -143.753039 60.041430 -143.872728 60.025002 -143.973641 60.003881 -144.072209 60.003881 -144.137920 60.015615 -144.215366 60.032043 -144.182510 60.064898 -144.194244 60.097754 -144.292811 60.168159 -144.403112 60.201015 -144.492292 60.196321 -144.581472 60.224483 -144.635449 60.233870 -144.658917 60.196321 -144.724629 60.217443 -144.802074 60.273767 -144.912376 60.299582 -144.978087 60.323050 -144.978087 60.398149 -145.022677 60.459167 -145.076654 60.484982 -145.100122 60.492022 # -b -147.815411 60.015615 -147.791942 60.048470 -147.770821 60.053164 -147.681641 60.086020 -147.550218 60.130610 -147.472773 60.196321 -147.395327 60.233870 -147.317882 60.283154 -147.285026 60.360600 -147.263904 60.393455 -147.252170 60.377027 -147.195846 60.348865 -147.207580 60.311316 -147.085545 60.327744 -147.064423 60.294888 -147.219314 60.208055 -147.341350 60.130610 -147.472773 60.057858 -147.484507 60.003881 # -b -147.836532 59.975719 -147.827145 60.003881 -147.815411 60.015615 # -b -146.810965 60.386415 -146.855555 60.360600 -146.832087 60.381721 -146.822699 60.447432 -146.778109 60.492022 -146.688930 60.513144 -146.611484 60.484982 -146.557507 60.496716 -146.501183 60.442739 -146.379147 60.442739 -146.313436 60.447432 -146.259459 60.426311 -146.280580 60.386415 -146.480061 60.348865 -146.611484 60.311316 -146.667808 60.306622 -146.656074 60.355906 -146.721785 60.372334 -146.778109 60.360600 -146.810965 60.386415 # -b -145.154100 60.492022 -145.198689 60.484982 -145.255013 60.459167 -145.255013 60.414577 -145.287869 60.381721 -145.287869 60.348865 -145.431026 60.339478 -145.541327 60.372334 -145.628160 60.419270 -145.729074 60.475594 -145.815907 60.517837 -145.883965 60.529572 -145.916821 60.534265 -145.949677 60.545999 -145.926208 60.550693 -145.860497 60.604670 -145.815907 60.653954 -145.851110 60.675075 -145.926208 60.670382 -146.015388 60.670382 -146.059978 60.691503 -146.113955 60.703237 -146.268846 60.679769 -146.423737 60.658648 -146.346292 60.707931 -146.170279 60.815886 -146.247725 60.832313 -146.423737 60.783030 -146.566894 60.712625 -146.710051 60.717318 -146.832087 60.729053 -146.787497 60.745480 -146.623218 60.766602 -146.501183 60.808845 -146.346292 60.853435 -146.358026 60.900372 -146.480061 60.890984 -146.667808 60.846394 -146.787497 60.862822 -146.787497 60.933227 -146.778109 60.970777 -146.745254 61.013020 -146.733520 61.078731 -146.456593 61.104546 -146.435472 61.142096 -146.656074 61.142096 -146.876677 61.092812 -146.998712 61.003632 -147.162990 60.982511 -147.285026 60.998939 -147.383593 60.982511 -147.461038 60.982511 -147.571340 60.975470 -147.716844 60.982511 -147.716844 61.050569 -147.791942 61.172604 -147.827145 61.078731 -147.827145 60.937921 -147.892856 60.895678 -148.047747 60.890984 -148.146314 60.937921 -148.089990 61.029448 -147.913978 61.179645 -147.913978 61.268825 -148.101724 61.172604 -148.202638 61.066997 -148.268350 61.062303 -148.289471 61.099853 -148.301205 61.120974 -148.322327 61.130361 -148.399773 61.109240 -148.566398 61.008326 -148.432628 61.003632 -148.378651 60.991898 -148.477218 60.895678 -148.697821 60.862822 -148.765879 60.799458 -148.686086 60.787724 -148.697821 60.729053 -148.510074 60.745480 -148.510074 60.696197 -148.399773 60.740787 -148.378651 60.740787 -148.388038 60.653954 -148.554664 60.588243 -148.742410 60.562427 -148.709555 60.484982 -148.510074 60.517837 -148.399773 60.517837 -148.235494 60.604670 -148.146314 60.538959 -148.158049 60.492022 -148.190904 60.447432 -148.277737 60.442739 -148.322327 60.402843 -148.423241 60.360600 -148.510074 60.266726 -148.467831 60.266726 -148.388038 60.278460 -148.355183 60.250298 -148.289471 60.240911 -148.366917 60.168159 -148.488952 60.142344 -148.566398 60.151731 -148.610988 60.069592 -148.643843 60.020308 -148.742410 60.015615 # -b -149.195350 59.975719 -149.293917 60.008574 -149.394831 60.008574 # -b -149.472276 59.987453 -149.537988 60.102448 -149.547375 60.015615 # -b -150.044904 60.937921 -149.913481 60.961389 -149.714000 60.944961 -149.481664 60.916799 -149.239940 60.895678 -149.129638 60.895678 -149.195350 60.923840 -149.394831 60.954349 -149.514519 60.991898 -149.714000 61.024754 -149.880626 61.041182 -149.979193 61.045875 # -b -150.033170 61.226582 -149.967458 61.252397 -149.868891 61.336883 -149.702266 61.407288 -149.629514 61.437797 -149.559109 61.522283 -149.641248 61.517589 -149.779712 61.449531 # -b -160.072930 66.455330 -159.875796 66.464718 -159.678662 66.469411 -159.523771 66.509308 -159.523771 66.565632 -159.631725 66.589100 -159.875796 66.556244 # -b -160.105786 66.575019 -159.918039 66.614915 -159.800698 66.619609 -159.678662 66.640730 -159.589482 66.682973 -159.744374 66.678280 -159.875796 66.692361 # -b -151.800337 59.947557 -151.779215 60.015615 -151.678301 60.118875 -151.535144 60.201015 -151.457699 60.283154 -151.413109 60.435698 -151.424843 60.571815 -151.481167 60.691503 -151.403722 60.761908 -151.359132 60.766602 -151.227709 60.799458 -151.049349 60.841701 -150.885071 60.886291 -150.730180 60.961389 -150.596410 61.003632 -150.476722 61.020060 -150.354686 60.912106 -150.220917 60.895678 -150.044904 60.937921 # -b -149.979193 61.045875 -150.122350 61.109240 -150.134084 61.200766 -150.033170 61.226582 # -b -149.857157 61.449531 -150.021436 61.365045 -150.209182 61.264131 -150.373461 61.247703 -150.584676 61.247703 -150.683243 61.301680 -150.659775 61.400247 -150.603451 61.522283 -150.495496 61.623197 -150.382848 61.717070 -150.284281 61.832065 -150.260813 61.961141 -150.218570 62.094911 -150.195101 62.188784 -150.218570 62.266230 -150.307749 62.285004 -150.349993 62.188784 -150.349993 62.111339 -150.382848 62.033893 -150.472028 61.918898 -150.537739 61.815637 -150.626919 61.712377 -150.734873 61.623197 -150.800585 61.543404 -150.838134 61.437797 -150.800585 61.358004 -150.812319 61.296987 -150.988332 61.200766 -151.122101 61.146789 -151.244137 61.078731 -151.464739 61.029448 -151.629018 60.982511 -151.861354 60.923840 -151.894210 60.799458 -152.004511 60.733746 -152.114813 60.670382 -152.203992 60.609364 -152.248582 60.588243 -152.368271 60.409883 -152.445716 60.360600 -152.591220 60.299582 -152.689787 60.245605 -152.776620 60.245605 -152.922124 60.250298 -153.041812 60.316010 -153.163848 60.299582 -153.032425 60.240911 -152.889268 60.191627 -152.788354 60.142344 -152.743764 60.086020 -152.755499 60.020308 # -b -164.550692 63.050073 -164.705583 63.010176 -164.705583 63.024257 -164.663340 63.028951 -164.583548 63.045379 -164.484981 63.045379 -164.386413 63.028951 -164.330089 63.005483 # -b -163.757462 63.000789 -163.733993 63.005483 -163.668282 63.028951 -163.569715 63.059460 -163.480535 63.099356 -163.381968 63.064154 -163.184834 63.035992 -163.029943 63.064154 -162.917295 63.134559 -162.776485 63.188536 -162.612206 63.263635 -162.457315 63.362202 -162.358748 63.460769 -162.278955 63.491278 -162.105290 63.495971 -162.081821 63.474850 -162.180388 63.420873 -162.269568 63.388017 -162.203857 63.388017 -162.039578 63.420873 -161.870606 63.437300 -161.696940 63.420873 -161.574905 63.460769 -161.363690 63.456075 -161.222880 63.479543 -161.077376 63.540561 -160.945953 63.622700 -160.847386 63.700146 -160.791062 63.758817 -160.791062 63.808100 -160.767594 63.866771 -160.791062 63.923095 -160.823918 63.986460 -160.945953 64.026356 -160.913097 64.059212 -160.899016 64.127270 -160.955340 64.174207 -161.086763 64.284508 -161.175943 64.385422 -161.340221 64.418277 -161.443482 64.376034 -161.485725 64.432358 -161.476338 64.516845 -161.321447 64.516845 -161.166556 64.479295 -161.067989 64.502764 -160.936566 64.512151 -160.823918 64.582556 -160.748819 64.664695 -160.748819 64.772650 -160.833305 64.791424 -160.955340 64.861829 -161.044520 64.899379 -161.152475 64.866523 -161.265123 64.838361 -161.377771 64.777343 -161.476338 64.767956 -161.598373 64.796118 -161.762652 64.814893 -161.729796 64.758569 -161.894075 64.735100 -162.114677 64.688163 -162.222631 64.617758 -162.443234 64.526232 -162.598125 64.408890 -162.710773 64.284508 -162.776485 64.284508 -162.832809 64.422971 -162.851583 64.507457 -163.020555 64.559088 -163.128510 64.631839 -163.241158 64.627146 -163.391355 64.622452 -163.339725 64.577862 -163.217690 64.530926 -163.053411 64.512151 -163.072186 64.437052 -163.119122 64.404196 -163.184834 64.441746 -163.339725 64.512151 -163.569715 64.559088 -163.635426 64.573169 -163.691750 64.573169 -163.813786 64.559088 -163.870110 64.554394 -163.935821 64.535619 -164.090712 64.540313 -164.306621 64.563781 -164.494368 64.526232 -164.649259 64.493376 -164.869861 64.441746 -165.057608 64.488683 -165.226580 64.512151 -165.414327 64.507457 -165.611461 64.526232 -165.864920 64.540313 -166.038585 64.563781 -166.174702 64.568475 -166.216945 64.587250 -166.240413 64.608371 -166.329593 64.622452 -166.446935 64.683470 -166.512646 64.730407 -166.470403 64.828974 -166.479790 64.915806 -166.681618 65.004986 -166.789573 65.094166 -166.911608 65.195080 -166.855284 65.265485 -166.803654 65.232629 -166.822428 65.166918 -166.648763 65.141103 -166.503259 65.242017 -166.348368 65.277219 -166.193476 65.295994 -166.446935 65.319462 -166.681618 65.361705 -166.869365 65.382827 -166.780185 65.333543 -166.836509 65.319462 -167.122823 65.371093 -167.362200 65.392214 -167.582803 65.462619 -167.826874 65.535371 -168.024008 65.579961 -168.136656 65.624551 -168.136656 65.692609 -168.024008 65.730158 -167.916053 65.744239 -167.958297 65.701996 -168.038089 65.648019 -167.939522 65.652713 -167.826874 65.685568 -167.704838 65.716077 -167.517091 65.753627 -167.549947 65.765361 -167.549947 65.802910 -167.484236 65.852194 -167.310570 65.906171 -167.207309 65.856887 -167.024256 65.896784 -166.935076 65.960148 -166.911608 66.004738 -166.836509 65.981270 -166.733249 66.054022 -166.526727 66.110346 -166.306125 66.164323 -166.141846 66.187791 -166.118378 66.143201 -166.038585 66.110346 -165.832064 66.124427 -165.644317 66.124427 -165.555137 66.143201 -165.677173 66.218300 -165.841451 66.267584 -165.653704 66.354416 -165.498813 66.394313 -165.423715 66.422475 -165.343922 66.408394 -165.226580 66.438902 -165.071689 66.443596 -164.991897 66.455330 -164.827618 66.535123 -164.705583 66.591447 -164.564773 66.596140 -164.409882 66.591447 -164.208054 66.600834 -164.001532 66.626649 -163.799705 66.626649 -163.658895 66.614915 -163.701138 66.600834 -163.945208 66.600834 -164.001532 66.584406 -163.823173 66.539816 -163.780930 66.474105 -163.823173 66.382578 -163.799705 66.302786 -163.888884 66.267584 -164.100100 66.208913 -164.090712 66.199525 -163.888884 66.204219 -163.823173 66.192485 -163.823173 66.124427 -163.658895 66.070449 -163.438292 66.089224 -163.227077 66.084530 -163.020555 66.070449 -162.931376 66.049328 -162.865664 66.093918 -162.720160 66.103305 -162.743629 66.058715 -162.663836 66.084530 -162.621593 66.054022 -162.523026 66.061062 -162.391604 66.070449 -162.293037 66.039941 -162.260181 66.061062 -162.091209 66.075143 -161.992642 66.030553 -161.950399 65.981270 -161.828363 65.964842 -161.762652 66.000044 -161.762652 66.054022 -161.673472 66.110346 -161.584292 66.208913 -161.509194 66.279318 -161.443482 66.272277 -161.330834 66.248809 -161.208799 66.227687 -161.143087 66.222994 -161.100844 66.173710 -161.119619 66.133814 -160.955340 66.213606 -160.945953 66.274624 -161.067989 66.333295 -161.297978 66.368497 -161.551437 66.399006 -161.772039 66.408394 -161.861219 66.328601 -161.818976 66.293399 -161.959786 66.314520 -161.959786 66.394313 -161.870606 66.474105 -161.969173 66.549204 -162.081821 66.675933 -162.016110 66.636037 -161.903462 66.539816 -161.729796 66.478799 -161.560824 66.464718 -161.410626 66.474105 -161.274510 66.523389 -161.199411 66.530429 -161.166556 66.488186 -161.044520 66.478799 -160.988196 66.448290 -160.866161 66.424821 -160.781675 66.373191 -160.659639 66.363804 -160.424956 66.368497 -160.293533 66.382578 -160.218434 66.424821 -160.072930 66.455330 # -b -159.873449 66.556244 -160.051809 66.535123 -160.094052 66.495227 -160.192619 66.514001 -160.103439 66.575019 # -b -159.873449 66.692361 -160.004872 66.652464 -160.169151 66.671239 -160.225475 66.645424 -160.291186 66.614915 -160.338123 66.600834 -160.469546 66.589100 -160.568113 66.575019 -160.690148 66.614915 -160.854427 66.652464 -161.018705 66.645424 -161.150128 66.645424 -161.197064 66.605528 -161.262776 66.619609 -161.239308 66.692361 -161.305019 66.661852 -161.305019 66.579713 -161.351956 66.539816 -161.516234 66.579713 -161.647657 66.621956 -161.793161 66.711135 -161.882340 66.762766 -161.826016 66.823783 -161.769692 66.896535 -161.596026 66.922351 -161.525621 66.957553 -161.671125 67.011530 -161.802548 67.034999 -161.948052 67.042039 -162.023150 67.037345 -162.121718 67.030305 -162.309464 67.009183 -162.497211 66.962247 -162.577004 66.990409 -162.497211 67.051426 -162.422112 67.107751 -162.356401 67.161728 -162.422112 67.166421 -162.530067 67.149994 -162.530067 67.135913 -162.497211 67.107751 -162.511292 67.081935 -162.642715 67.088976 -162.774138 67.093669 -162.806993 67.037345 -162.882092 67.004490 -162.830462 66.969287 -163.051064 66.999796 -163.257586 67.037345 -163.412477 67.081935 -163.680016 67.107751 -163.755115 67.218052 -163.778583 67.302538 -163.745727 67.316619 -163.820826 67.354168 -163.877150 67.448042 -163.942862 67.506712 -164.107140 67.560690 -164.107140 67.593545 -164.186932 67.619361 -164.205707 67.631095 -164.374679 67.699153 -164.628137 67.757824 -164.815884 67.811801 -164.989550 67.882206 -165.167910 67.938530 -165.365044 68.006588 -165.585646 68.030057 -165.806249 68.079340 -165.984608 68.121583 -166.092563 68.194335 -166.280309 68.267087 -166.458669 68.304636 -166.613560 68.325758 -166.744983 68.339839 -166.885793 68.365654 -166.843550 68.405550 -166.698046 68.443100 -166.580704 68.473609 -166.510299 68.485343 -166.580704 68.426672 -166.698046 68.393816 -166.712127 68.384429 -166.599479 68.382082 -166.524380 68.426672 -166.425813 68.450140 -166.280309 68.471262 -166.172355 68.511158 -166.256841 68.494730 -166.336633 68.506464 -166.313165 68.558095 -166.303778 68.626153 -166.303778 68.734107 -166.280309 68.811553 -166.256841 68.846755 -166.270922 68.877264 # -b -166.270922 68.877264 -166.270922 68.891345 -166.205211 68.891345 -166.059707 68.891345 -165.871960 68.903079 -165.862573 68.881958 -166.017464 68.853796 -165.815636 68.846755 -165.595034 68.874917 -165.322801 68.905426 -165.088117 68.914814 -164.914451 68.933588 -164.693849 68.933588 -164.482634 68.954710 -164.285500 68.973484 -164.017960 68.992259 -163.952249 69.015727 -163.811439 69.067358 -163.567368 69.147150 -163.468801 69.229289 -163.337378 69.306735 -163.290441 69.372446 -163.224730 69.463973 -163.215343 69.356019 -163.159019 69.386527 -163.069839 69.499176 -163.018209 69.583662 -163.036983 69.644679 -162.882092 69.595396 -162.684958 69.550806 -162.619247 69.576621 -162.830462 69.618864 -163.036983 69.710391 -163.018209 69.733859 -162.896173 69.747940 -162.694345 69.747940 -162.398644 69.747940 -162.332933 69.764368 -162.454968 69.771408 -162.577004 69.776102 -162.750669 69.776102 -162.929029 69.801917 -162.797606 69.858241 -162.694345 69.912218 -162.530067 69.970889 # -b -162.290690 70.017826 -162.210897 69.980277 -162.070087 69.952115 -161.868259 69.921606 -161.694594 69.888750 -161.703981 69.926299 -161.901115 69.956808 # -b -162.466702 66.931738 -162.400991 66.908270 -162.368135 66.931738 -162.325892 66.957553 -162.269568 66.957553 -162.222631 66.896535 -162.147533 66.840211 -162.058353 66.793275 -162.016110 66.753378 -162.048966 66.722870 -162.222631 66.736951 -162.344667 66.741644 -162.424459 66.769806 -162.513639 66.830824 -162.532414 66.866026 -162.523026 66.896535 -162.523026 66.931738 -162.466702 66.931738 # -b -169.833418 63.035992 -169.833418 63.035992 -169.833418 63.080581 -169.885048 63.115784 # -b -170.075142 63.491278 -169.976575 63.465462 -169.845152 63.451381 -169.737198 63.420873 -169.648018 63.397404 -169.601081 63.352814 -169.568225 63.343427 -169.460271 63.338733 -169.371091 63.322305 -169.295993 63.303531 -169.239668 63.308224 -169.173957 63.331693 -169.019066 63.343427 -168.920499 63.312918 -168.798463 63.308224 -168.774995 63.268328 -168.798463 63.237819 -168.798463 63.214351 -168.840707 63.179149 -168.986210 63.153333 -169.117633 63.169761 -169.249056 63.188536 -169.371091 63.183842 -169.436803 63.134559 -169.493127 63.108743 -169.549451 63.075888 -169.568225 63.045379 -169.713729 63.045379 # -b -167.566375 60.262032 -167.542907 60.266726 -167.399750 60.262032 -167.256593 60.250298 -167.068846 60.266726 -166.881099 60.273767 -166.737942 60.327744 -166.615907 60.360600 -166.517340 60.393455 -166.395304 60.402843 -166.285003 60.393455 -166.162968 60.348865 -165.986955 60.339478 -165.855532 60.332437 -165.766352 60.323050 -165.721763 60.306622 -165.733497 60.217443 -165.745231 60.086020 -165.667785 60.097754 -165.656051 60.041430 -165.688907 60.003881 # -b -167.212003 59.999187 -167.322304 60.036736 -167.411484 60.081326 -167.477195 60.118875 -167.488929 60.184587 -167.566375 60.224483 -167.566375 60.262032 # -b -165.379125 60.670382 -165.369737 60.703237 -165.292292 60.729053 -165.191378 60.757215 -165.048221 60.804151 -165.003631 60.858129 -164.860474 60.837007 -164.663340 60.808845 -164.407535 60.761908 -164.320702 60.679769 -164.320702 60.621098 -164.440391 60.538959 -164.628137 60.435698 -164.738439 60.381721 -164.848740 60.463860 -164.937920 60.595283 -165.048221 60.621098 -165.191378 60.653954 -165.292292 60.653954 -165.379125 60.670382 # -b -164.330089 63.005483 -164.231522 62.974974 -164.297234 62.899875 -164.320702 62.829470 -164.367639 62.780187 -164.475593 62.780187 -164.597629 62.798961 -164.738439 62.794268 -164.841699 62.740290 -164.907411 62.702741 -164.963735 62.733250 -164.973122 62.780187 -164.973122 62.829470 -164.963735 62.881100 -164.550692 63.050073 # -b -162.189776 59.982759 -162.276609 60.064898 -162.288343 60.147038 -162.344667 60.240911 -162.443234 60.278460 -162.476090 60.316010 -162.443234 60.365293 -162.332933 60.447432 -162.156920 60.571815 -161.978561 60.653954 -161.802548 60.740787 -161.671125 60.804151 -161.560824 60.846394 -161.560824 60.853435 -161.570211 60.858129 -161.638269 60.846394 -161.802548 60.841701 -161.912849 60.799458 -162.046619 60.712625 -162.243753 60.653954 -162.344667 60.609364 -162.431500 60.529572 -162.574657 60.409883 -162.652102 60.355906 -162.586391 60.257339 -162.454968 60.212749 -162.431500 60.163465 -162.541801 60.142344 -162.574657 60.081326 # -b -164.067244 59.975719 -164.076631 60.003881 -164.010920 60.032043 -164.055510 60.076632 -164.198667 60.053164 -164.330089 60.008574 -164.419269 60.025002 -164.496715 60.093060 -164.585894 60.196321 -164.585894 60.273767 -164.541305 60.348865 -164.440391 60.431005 -164.341824 60.484982 -164.231522 60.555387 -164.165811 60.625792 -164.121221 60.653954 -163.966330 60.691503 -163.811439 60.707931 -163.724606 60.771296 -163.778583 60.862822 -163.945208 60.858129 -164.055510 60.825273 -164.154077 60.815886 -164.297234 60.820579 -164.407535 60.841701 -164.550692 60.853435 -164.696196 60.886291 -164.773641 60.900372 -164.672727 60.975470 -164.607016 61.034141 -164.738439 61.020060 -164.872208 61.020060 -164.937920 61.034141 -164.961388 61.113934 -165.027099 61.055263 -165.125667 60.991898 -165.203112 60.975470 -165.292292 61.003632 -165.369737 61.055263 -165.390859 61.125668 -165.447183 61.167911 -165.468304 61.210154 -165.501160 61.268825 -165.468304 61.336883 -165.390859 61.395554 -165.440142 61.407288 -165.496466 61.369739 -165.616155 61.322802 -165.726456 61.348617 -165.869613 61.400247 -165.864920 61.449531 -165.803902 61.517589 -165.726456 61.548098 -165.625542 61.555139 -165.531669 61.576260 -165.576259 61.606769 -165.515241 61.627890 -165.526975 61.665440 -165.620849 61.658399 -165.698294 61.637278 -165.747578 61.590341 -165.813289 61.564526 -165.881347 61.543404 -165.951752 61.548098 -165.996342 61.538711 -166.029198 61.512896 -166.024504 61.576260 -166.001036 61.637278 -165.951752 61.653706 -165.902469 61.658399 -165.874307 61.695949 -165.902469 61.721764 -165.951752 61.742885 -165.975221 61.768701 -165.975221 61.815637 -165.947059 61.836759 -165.890735 61.825025 -165.841451 61.841452 -165.803902 61.846146 -165.780434 61.888389 -165.787474 61.925939 -165.792168 61.977569 -165.792168 62.033893 -165.780434 62.085523 -165.764006 62.127766 -165.747578 62.167663 -165.719416 62.228680 -165.698294 62.270923 -165.686560 62.322554 -165.653704 62.362450 -165.625542 62.374184 -165.620849 62.383571 -165.587993 62.423468 -165.548097 62.470404 -165.505854 62.500913 -165.465958 62.552544 -165.404940 62.566625 -165.355656 62.540809 -165.339228 62.587746 -165.322801 62.618255 -165.268823 62.667538 -165.212499 62.728556 -165.151482 62.754371 -165.113932 62.754371 -165.085770 62.749678 -165.052915 62.740290 -165.003631 62.728556 -164.952001 62.723862 -164.919145 62.763759 -164.942613 62.834164 -164.963735 62.864673 -164.952001 62.899875 -164.919145 62.944465 -164.759560 63.000789 # -b -170.098610 66.159629 -169.943719 66.110346 -169.868620 66.133814 -169.690261 66.115039 -169.779441 66.030553 -169.957800 66.049328 # -b -169.887395 63.115784 -170.023511 63.139252 -170.197177 63.160374 -170.342681 63.193230 -170.474104 63.249554 -170.582058 63.289450 -170.685319 63.326999 -170.816742 63.357508 -170.957552 63.376283 -171.126524 63.383323 -171.243866 63.376283 -171.379982 63.326999 -171.511405 63.308224 -171.666296 63.338733 -171.788331 63.383323 -171.854043 63.430260 -171.905673 63.460769 -171.938529 63.505359 -171.905673 63.554642 -171.854043 63.622700 -171.821187 63.725961 -171.830574 63.784632 -171.741395 63.744736 -171.652215 63.695452 -171.431612 63.681371 -171.192235 63.641475 -171.093668 63.613313 -171.013876 63.592191 -170.891840 63.608619 -170.816742 63.641475 -170.694706 63.650862 -170.605527 63.690759 -170.516347 63.700146 -170.441248 63.690759 -170.328600 63.671984 -170.253501 63.636781 -170.140853 63.622700 -170.075142 63.564029 -170.065754 63.519440 -170.075142 63.491278 # -b -172.931240 60.545999 -172.910119 60.555387 -172.910119 60.550693 -172.919506 60.501410 -172.865529 60.475594 -172.788083 60.442739 -172.698903 60.409883 -172.600336 60.402843 -172.544012 60.377027 -172.555747 60.372334 -172.687169 60.365293 -172.776349 60.398149 -172.865529 60.435698 -172.975830 60.501410 -172.985217 60.522531 -172.996952 60.522531 -172.952362 60.545999 -172.931240 60.545999 # -b 179.943584 68.921854 180.000000 68.907751 # -b -180.000000 68.907750 -179.849895 68.870224 -179.680923 68.874917 -179.615212 68.874917 -179.563581 68.858490 -179.474402 68.813900 -179.319510 68.795125 -179.188088 68.762269 -179.042584 68.743495 -178.920548 68.743495 -178.821981 68.659009 -178.779738 68.579216 -178.765657 68.527586 -178.681171 68.490036 -178.601379 68.466568 -178.493424 68.466568 -178.423019 68.445447 -178.282209 68.421978 -178.239966 68.417285 -178.371389 68.494730 -178.404245 68.511158 -178.193030 68.438406 -178.103850 68.377388 -178.085075 68.337492 -178.127318 68.281168 -178.103850 68.243619 -177.948959 68.271781 -177.751825 68.295249 -177.564078 68.248312 -177.545303 68.243619 -177.531222 68.210763 -177.390412 68.227191 -177.301232 68.184948 -177.244908 68.154439 -177.254296 68.149745 -177.277764 68.107502 -177.136954 68.107502 -176.982063 68.107502 -176.935126 68.041791 -176.883496 68.006588 -176.982063 67.992507 -177.071242 67.943224 -176.869415 67.919755 -176.737992 67.877512 -176.540858 67.882206 -176.339030 67.865778 -176.174751 67.851697 -176.155977 67.849350 -176.198220 67.811801 -176.207607 67.743743 -176.385967 67.722621 -176.484534 67.685072 -176.395354 67.673338 -176.296787 67.640482 -176.132508 67.626401 -175.846194 67.546609 -175.714772 67.509059 -175.578655 67.464469 -175.437845 67.438654 -175.456620 67.502019 -175.545800 67.555996 -175.625592 67.551302 -175.733546 67.602933 -175.813339 67.652216 -175.888437 67.685072 -175.935374 67.722621 -175.954149 67.757824 -175.879050 67.774252 -175.766402 67.753130 -175.625592 67.727315 -175.470701 67.706193 -175.404989 67.685072 -175.390908 67.619361 -175.315810 67.530181 -175.160919 67.480897 -174.982559 67.448042 -174.865217 67.401105 -174.808893 67.340087 -174.841749 67.307231 -174.874605 67.384677 -174.996640 67.438654 -175.038883 67.384677 -174.963784 67.323659 -174.916848 67.243867 -174.865217 67.166421 -174.832362 67.056120 -174.696245 66.943472 -174.686858 66.866026 -174.729101 66.774500 -174.644615 66.722870 -174.489724 66.682973 -174.409931 66.661852 -174.433400 66.619609 -174.391157 66.544510 -174.334833 66.539816 -174.222185 66.560938 -174.114230 66.544510 -173.982807 66.523389 -173.982807 66.495227 -173.992195 66.413087 -174.025050 66.382578 -174.034438 66.328601 -173.959339 66.382578 -173.827916 66.387272 -173.795061 66.460024 -173.795061 66.530429 -173.893628 66.619609 -173.968726 66.645424 -174.034438 66.610221 -174.170554 66.626649 -174.147086 66.692361 -174.081374 66.800315 -174.081374 66.908270 -174.067293 66.978675 -174.114230 66.995102 -174.189329 67.009183 -174.334833 67.020918 -174.203410 67.042039 -174.222185 67.072548 -174.442787 67.051426 -174.489724 66.999796 -174.564822 67.056120 -174.377076 67.088976 -174.170554 67.098363 -174.048519 67.081935 -173.935871 67.067854 -173.893628 67.025611 -173.827916 67.009183 -173.780980 67.051426 -173.748124 67.088976 -173.771592 67.140606 -173.626088 67.124178 -173.583845 67.072548 -173.485278 67.081935 -173.396099 67.063161 -173.274063 67.037345 -173.428954 67.011530 -173.485278 66.948166 -173.386711 66.891842 -173.321000 66.823783 -173.241207 66.823783 -173.175496 66.882454 -173.217739 66.938778 -173.241207 66.988062 -173.198964 66.988062 -173.067542 66.948166 -172.898570 66.905923 -172.692048 66.882454 -172.504301 66.891842 -172.424509 66.948166 -172.626337 66.964594 -172.823471 66.990409 -172.659192 67.011530 -172.447977 67.009183 -172.250843 66.988062 -172.049015 66.978675 -171.931673 66.952859 -171.762701 66.948166 -171.729846 66.870720 -171.664134 66.809702 -171.467000 66.769806 -171.457613 66.711135 -171.335577 66.626649 -171.049263 66.539816 -170.946003 66.452984 -170.725400 66.399006 -170.518879 66.319214 -170.528266 66.284011 -170.650301 66.248809 -170.561122 66.204219 -170.518879 66.232381 -170.340519 66.293399 -170.185628 66.227687 -170.232565 66.173710 -170.101142 66.159629 # -b -169.955453 66.049328 -170.129119 66.039941 -170.293397 65.964842 -170.415433 65.936680 -170.528081 65.922599 -170.560937 65.838113 -170.593792 65.755973 -170.560937 65.685568 -170.617261 65.608123 -170.847251 65.624551 -170.978673 65.697303 -171.166420 65.744239 -171.354167 65.842806 -171.429266 65.784135 -171.377635 65.666794 -171.100709 65.594042 -171.034997 65.525984 -171.110096 65.479047 -171.330699 65.483741 -171.631093 65.525984 -171.884552 65.507209 -171.992506 65.479047 -172.156785 65.420376 -172.227190 65.333543 -172.180253 65.251404 -172.391468 65.242017 -172.654314 65.242017 -172.457179 65.204467 -172.269433 65.213855 -172.156785 65.112941 -172.058217 65.056617 -172.236577 64.995599 -172.480648 64.906419 -172.644926 64.958050 -172.644926 64.929888 -172.635539 64.885298 -172.710638 64.852442 -172.940627 64.857136 -173.086131 64.796118 -172.842060 64.824280 -172.734106 64.772650 -172.776349 64.725713 -172.973483 64.721019 -172.964096 64.678776 -172.856141 64.655308 -172.842060 64.631839 -172.687169 64.650614 -172.621458 64.655308 -172.513503 64.601331 -172.513503 64.577862 -172.391468 64.483989 -172.344531 64.432358 -172.579215 64.399503 -172.734106 64.479295 -172.898384 64.512151 -173.062663 64.493376 -173.039195 64.455827 -172.874916 64.446439 -172.865529 64.317364 -172.996952 64.256346 -173.109600 64.242265 -173.250410 64.261039 -173.395913 64.322057 -173.259797 64.469908 -173.226941 64.530926 -173.330202 64.582556 -173.339589 64.474601 -173.414688 64.385422 -173.569579 64.345526 -173.771407 64.376034 -173.733858 64.488683 -173.813650 64.413584 -174.034253 64.413584 -174.034253 64.498070 -174.245468 64.573169 -174.189144 64.622452 -174.297098 64.650614 -174.484845 64.650614 -174.663204 64.702245 -174.785240 64.753875 -174.639736 64.833667 -174.606880 64.953356 -174.639736 64.990905 -174.705447 64.934581 # -b -174.674939 64.967437 -174.707794 64.866523 -174.698407 64.810199 -174.773506 64.824280 -174.895541 64.824280 -174.942478 64.871217 -175.050432 64.786731 -174.975334 64.758569 -174.919009 64.739794 -175.008189 64.730407 -175.195936 64.767956 -175.383683 64.777343 -175.402458 64.828974 -175.491637 64.885298 -175.702852 64.962743 -175.909374 65.042536 -175.867131 65.127022 -175.857744 65.237323 -175.956311 65.319462 -175.956311 65.366399 -175.932842 65.453232 -176.120589 65.488434 -176.308336 65.493128 -176.397516 65.551799 -176.519551 65.598736 -176.561794 65.594042 -176.707298 65.584655 -176.848108 65.603429 -177.078098 65.612817 -177.265845 65.598736 -177.364412 65.535371 -177.566240 65.497822 -177.721131 65.488434 -177.876022 65.507209 -178.063769 65.525984 -178.303146 65.525984 -178.490893 65.565880 -178.490893 65.692609 -178.523748 65.744239 -178.580072 65.802910 -178.711495 65.807604 -178.791287 65.892090 -178.889855 65.964842 -178.908629 66.004738 -178.979034 66.065756 -178.842918 66.039941 -178.720882 66.044634 -178.570685 66.093918 -178.580072 66.192485 -178.514361 66.337989 -178.547217 66.354416 -178.655171 66.347376 -178.711495 66.272277 -178.810062 66.183097 -178.941485 66.159629 -179.143313 66.262890 -179.185556 66.342682 -179.232492 66.272277 -179.382690 66.328601 -179.373303 66.213606 -179.349834 66.147895 -179.561049 66.098611 -179.673697 66.154935 -179.781652 66.124427 -179.936543 66.124427 -179.880219 66.021166 -179.870832 65.873315 -179.692472 65.779442 -179.537581 65.716077 -179.331060 65.652713 -179.307591 65.535371 -179.462482 65.453232 -179.495338 65.342930 -179.650229 65.251404 -179.791039 65.166918 -179.969399 65.084779 # -b 169.885048 68.755229 170.072795 68.759922 170.246461 68.795125 170.448289 68.846755 170.621954 68.921854 170.758071 68.980525 170.866025 69.039196 170.997448 69.090826 170.964592 69.142457 170.898881 69.231636 170.898881 69.295001 170.790927 69.337244 170.720521 69.407649 170.668891 69.480401 170.589099 69.564887 170.335640 69.593049 170.058714 69.611824 170.138506 69.686922 170.335640 69.717431 170.467063 69.729165 170.481144 69.813651 170.481144 69.869975 170.415433 69.930993 # -b 171.330699 70.017826 171.584157 69.999051 171.856390 69.982624 172.067605 69.956808 172.330450 69.938034 172.475954 69.952115 172.687169 69.919259 172.950015 69.862935 173.226941 69.839467 173.447544 69.884056 173.677534 69.881710 173.855893 69.865282 174.118739 69.888750 174.386278 69.862935 174.559944 69.820692 174.738303 69.832426 174.827483 69.839467 174.827483 69.846507 174.860339 69.858241 174.911969 69.874669 175.066860 69.869975 175.221751 69.869975 175.409498 69.865282 175.630101 69.862935 175.860090 69.869975 176.071306 69.855894 176.259052 69.790183 176.437412 69.733859 176.620465 69.675188 176.841067 69.663454 177.099219 69.625905 177.230642 69.607130 177.305741 69.611824 177.362065 69.614170 177.638991 69.515603 177.878369 69.473360 178.066115 69.449892 178.211619 69.414689 178.300799 69.398262 178.385285 69.419383 178.422834 69.386527 178.507320 69.353672 178.718536 69.325510 178.939138 69.278573 179.126885 69.231636 179.300551 69.170619 179.478910 69.090826 179.657270 69.025115 179.812161 68.968791 179.943584 68.921854 # -b -179.969399 65.084779 -180.000000 65.073850 # -b 180.000000 65.073850 179.833467 65.014374 179.631639 64.906419 179.457974 64.814893 179.190434 64.786731 178.936976 64.735100 178.782085 64.645920 178.575564 64.577862 178.552095 64.622452 178.617807 64.683470 178.476997 64.664695 178.298637 64.660001 178.209457 64.716326 178.223538 64.744488 178.176602 64.725713 178.054566 64.683470 177.937225 64.697551 177.726009 64.725713 177.547650 64.786731 177.383371 64.843055 177.392759 64.911113 177.327047 64.948662 177.139301 65.014374 176.885842 65.066004 176.698096 65.056617 176.580754 65.066004 176.402394 65.070698 176.393007 65.136409 176.346070 65.166918 176.256891 65.080085 176.238116 65.019067 176.435250 64.976824 176.622997 64.953356 176.843599 65.009680 176.965635 64.943969 177.153382 64.899379 177.205012 64.810199 177.162769 64.772650 176.899923 64.796118 176.712177 64.852442 176.444637 64.847748 176.270972 64.894685 176.083225 64.958050 175.961189 64.981518 175.904865 64.915806 175.961189 64.857136 176.191179 64.824280 176.256891 64.721019 176.256891 64.697551 176.158324 64.636533 176.036288 64.521538 175.984658 64.404196 176.139549 64.350219 176.069144 64.197675 175.904865 64.174207 175.731200 64.150738 175.576308 64.049824 175.510597 64.005234 175.665488 64.059212 175.928334 64.141351 176.116080 64.150738 176.289746 64.270427 176.346070 64.380728 176.214648 64.446439 176.205260 64.559088 176.280359 64.631839 176.444637 64.655308 176.590141 64.601331 176.763807 64.622452 176.951554 64.674082 177.139301 64.725713 177.294192 64.725713 177.406840 64.725713 177.373984 64.636533 177.373984 64.559088 177.406840 64.460520 177.561731 64.371341 177.758865 64.340832 177.890288 64.270427 178.087422 64.228184 178.200070 64.261039 178.322105 64.357260 178.387817 64.261039 178.462916 64.178900 178.519240 64.073293 178.519240 64.063905 178.453528 64.087374 178.289250 64.063905 178.298637 64.016969 178.453528 63.918402 178.575564 63.944217 178.650662 63.967685 178.683518 63.794019 178.730455 63.650862 178.772698 63.592191 178.838409 63.425566 178.983913 63.298837 179.138804 63.204964 179.270227 63.200270 179.401650 63.068847 179.303083 63.040685 179.105948 63.050073 178.993300 63.028951 # -b 178.995462 63.028951 178.943832 63.026604 178.953219 63.005483 178.962606 62.974974 179.009543 62.944465 179.108110 62.930384 179.263001 62.899875 179.441361 62.834164 179.507072 62.749678 179.450748 62.632336 179.319325 62.536116 179.230146 62.484485 179.197290 62.449283 179.075255 62.444589 178.995462 62.331941 178.920363 62.310820 178.798328 62.336635 178.643437 62.362450 178.512014 62.414080 178.380591 62.444589 178.211619 62.514994 177.958161 62.552544 177.784495 62.557237 177.671847 62.618255 177.606136 62.683966 177.498181 62.679273 177.563893 62.627642 177.573280 62.566625 177.474713 62.566625 177.385533 62.571318 177.329209 62.597133 177.329209 62.644070 177.272885 62.648764 177.207174 62.693354 177.155543 62.723862 177.066364 62.820083 176.986571 62.869366 176.934941 62.838857 176.967797 62.763759 177.042895 62.698047 177.099219 62.627642 177.188399 62.601827 177.221255 62.571318 177.155543 62.540809 177.000652 62.514994 176.822293 62.500913 176.658014 62.465711 176.512511 62.418774 176.348232 62.367144 176.216809 62.310820 176.014981 62.240414 175.892946 62.219293 175.784992 62.188784 175.775604 62.177050 175.752136 62.188784 175.662956 62.177050 175.522146 62.146541 175.367255 62.111339 175.231139 62.076136 175.165427 62.076136 175.212364 62.127766 175.221751 62.167663 175.165427 62.162969 175.066860 62.153582 175.076247 62.085523 175.057473 62.033893 174.977680 61.970528 174.836870 61.935326 174.714835 61.909511 174.569331 61.841452 174.428521 61.815637 174.306486 61.806250 174.175063 61.794516 174.085883 61.773394 174.020172 61.747579 173.954460 61.717070 173.841812 61.658399 173.743245 61.637278 173.654065 61.653706 173.578967 61.726458 173.466319 61.738192 173.409995 61.674827 173.391220 61.569220 173.344283 61.522283 173.287959 61.522283 173.287959 61.517589 173.222248 61.454225 173.133068 61.407288 173.025114 61.374432 172.935934 61.374432 172.827979 61.416675 172.762268 61.390860 172.781043 61.353311 172.846754 61.301680 172.813898 61.259437 172.759921 61.259437 172.682476 61.226582 172.569828 61.189032 172.426671 61.196073 172.360959 61.196073 172.405549 61.142096 172.384428 61.071691 172.372693 61.029448 172.283514 60.998939 172.173212 61.013020 172.119235 61.034141 172.030055 61.083425 172.008934 61.034141 172.095767 60.998939 172.107501 60.949655 172.086379 60.912106 171.985466 60.900372 171.908020 60.862822 171.830574 60.862822 171.753129 60.853435 171.699152 60.825273 171.588850 60.787724 171.588850 60.745480 171.499671 60.733746 171.433959 60.691503 171.368248 60.658648 171.257947 60.571815 171.157033 60.571815 171.058466 60.616405 171.004488 60.545999 170.891840 60.534265 170.781539 60.496716 170.671238 60.459167 170.584405 60.447432 170.528081 60.431005 170.560937 60.409883 170.560937 60.355906 170.528081 60.299582 170.474104 60.250298 170.417780 60.179893 170.373190 60.118875 170.373190 60.048470 # -b 170.089223 59.971025 170.068101 60.020308 # -b 159.988444 69.778449 160.077624 69.722125 160.209047 69.722125 160.476586 69.722125 160.683108 69.679882 160.837999 69.628251 160.992890 69.553153 161.082070 69.536725 161.246348 69.555500 161.302672 69.492135 161.279204 69.381834 161.424708 69.363059 161.612454 69.435811 161.720409 69.517950 162.020804 69.510910 162.077128 69.621211 162.217938 69.614170 162.283649 69.668148 162.382216 69.693963 162.504252 69.698656 162.659143 69.682229 162.781178 69.656413 162.912601 69.682229 163.109735 69.717431 163.311563 69.722125 163.475841 69.701003 163.663588 69.698656 163.827867 69.736206 164.039082 69.778449 164.095406 69.740900 164.193973 69.679882 164.292540 69.614170 164.414575 69.590702 164.569467 69.555500 164.752520 69.567234 164.930879 69.564887 165.020059 69.560193 # -b 164.998937 69.569581 165.041180 69.553153 165.088117 69.571927 165.219540 69.593049 165.318107 69.595396 165.463611 69.581315 165.604421 69.571927 165.759312 69.571927 165.881347 69.571927 165.970527 69.550806 166.144193 69.517950 166.289697 69.492135 166.430507 69.492135 166.552542 69.492135 166.698046 69.496829 166.820081 69.475707 166.960892 69.487441 167.082927 69.529684 167.172107 69.576621 167.280061 69.630598 167.383322 69.672841 167.500664 69.717431 167.622699 69.754981 167.754122 69.771408 167.890238 69.747940 167.988805 69.717431 168.007580 69.691616 167.876157 69.668148 167.843302 69.611824 167.998193 69.593049 168.176552 69.571927 168.228183 69.503869 168.218795 69.440505 168.218795 69.377140 168.195327 69.306735 168.209408 69.255105 168.251651 69.208168 168.373686 69.172965 168.519190 69.172965 168.669388 69.170619 168.805504 69.158884 168.979170 69.118988 169.002638 69.083786 169.124674 69.060317 169.288952 69.015727 169.387519 68.940629 169.453230 68.853796 169.509555 68.799819 169.664446 68.766963 169.885048 68.755229 # -b 168.099107 69.994358 168.099107 69.994358 # -b 168.474600 70.020173 168.685815 69.961502 168.882950 69.930993 169.127020 69.884056 169.314767 69.844160 169.380479 69.778449 169.366398 69.729165 169.258443 69.710391 169.267831 69.663454 169.258443 69.611824 169.216200 69.553153 169.047228 69.539072 168.807851 69.564887 168.540312 69.595396 168.399502 69.668148 168.230529 69.710391 168.131962 69.776102 167.925441 69.815998 167.836261 69.888750 167.892585 69.956808 168.099107 69.994358 # -b 164.736092 59.942863 164.557732 60.036736 # -b 161.368383 59.954597 161.610107 60.097754 161.821323 60.189281 161.908156 60.299582 161.908156 60.414577 161.964480 60.452126 162.173348 60.496716 162.450274 60.560081 162.691998 60.567121 162.781178 60.642220 162.912601 60.724359 163.133203 60.761908 163.332684 60.745480 163.532165 60.799458 163.708178 60.879250 163.708178 60.937921 163.565021 60.996592 163.576755 61.097506 163.609611 61.151483 163.719912 61.184339 163.863069 61.264131 163.874803 61.374432 163.853682 61.426063 163.846641 61.522283 163.858376 61.585647 163.895925 61.627890 163.952249 61.679521 163.956943 61.810944 163.956943 61.914204 163.968677 62.022159 163.996839 62.090217 164.008573 62.141847 164.025001 62.223987 164.107140 62.310820 164.212748 62.397652 164.278459 62.439895 164.381720 62.414080 # -b 164.888636 62.407040 164.991897 62.519688 164.700889 62.646417 164.438044 62.681619 164.184586 62.646417 163.884191 62.592440 163.621345 62.545503 163.358500 62.432855 163.288095 62.346022 163.302176 62.275617 163.114429 62.132460 163.123816 62.059708 163.081573 61.923592 163.015862 61.799209 163.090960 61.717070 163.269320 61.688908 163.189528 61.606769 163.114429 61.538711 162.968925 61.526977 162.926682 61.595035 162.950150 61.674827 162.828115 61.717070 162.771791 61.641971 162.659143 61.611463 162.396297 61.599728 162.208550 61.496468 162.020804 61.379126 161.809588 61.306374 161.654697 61.226582 161.588986 61.184339 161.412973 61.118627 161.234614 61.013020 161.014011 60.883944 160.859120 60.792417 160.748819 60.717318 160.572806 60.712625 160.340470 60.604670 160.197313 60.567121 160.176191 60.658648 160.241903 60.799458 160.340470 60.916799 160.441384 61.013020 160.220781 60.991898 # -b 159.988444 61.066997 160.021300 61.135055 # -b 159.910999 61.315761 160.021300 61.395554 160.061196 61.484734 160.131601 61.552792 160.155070 61.667787 160.176191 61.799209 160.209047 61.956447 160.138642 61.893083 160.028341 61.794516 # -b 170.068101 60.020308 169.967187 60.097754 169.880354 60.158772 169.812296 60.212749 169.692608 60.294888 169.615162 60.402843 169.472005 60.447432 169.371091 60.496716 169.260790 60.513144 169.162223 60.545999 169.028453 60.555387 168.897031 60.571815 168.807851 60.571815 168.709284 60.578855 168.610717 60.571815 168.467560 60.588243 168.345524 60.595283 168.235223 60.583549 168.134309 60.621098 167.991152 60.550693 167.892585 60.538959 167.782284 60.538959 167.693104 60.501410 167.639127 60.496716 167.472502 60.426311 167.395056 60.409883 167.329345 60.414577 167.273021 60.409883 167.219043 60.377027 167.174454 60.372334 167.120476 60.339478 167.043031 60.372334 166.974973 60.398149 166.932730 60.372334 166.953851 60.278460 166.909261 60.229177 166.831816 60.184587 166.712127 60.125916 166.622947 60.086020 166.557236 60.057858 166.479790 60.008574 # -b 166.158274 59.954597 166.158274 60.032043 166.202864 60.118875 166.247454 60.175200 166.226332 60.250298 166.181742 60.344172 166.226332 60.381721 166.268575 60.414577 166.235720 60.475594 166.181742 60.496716 166.148887 60.513144 166.080828 60.484982 166.026851 60.452126 165.916550 60.360600 165.850839 60.323050 165.707682 60.273767 165.562178 60.257339 165.484732 60.233870 165.374431 60.217443 165.264130 60.179893 165.165563 60.109488 165.088117 60.069592 # -b 159.922733 70.095272 159.833553 69.996705 159.749067 69.921606 159.683356 69.851201 159.692743 69.801917 159.880490 69.785489 159.988444 69.778449 # -b 160.220781 60.991898 159.955589 60.928534 159.866409 60.966083 159.899265 61.024754 159.943855 61.045875 159.988444 61.066997 # -b 160.021300 61.135055 159.910999 61.205460 159.910999 61.315761 # -b 160.033034 61.794516 159.854675 61.688908 159.699784 61.688908 159.577748 61.679521 159.512037 61.778088 159.399389 61.846146 159.145931 61.918898 159.028589 61.928285 158.958184 61.871961 158.850229 61.836759 158.695338 61.829718 158.484123 61.803903 158.319845 61.794516 158.108629 61.764007 157.855171 61.782782 157.611100 61.782782 157.446822 61.717070 157.249688 61.679521 157.038473 61.573913 156.916437 61.517589 156.728690 61.447184 156.672366 61.315761 156.630123 61.221888 156.451764 61.146789 156.242896 61.034141 156.043415 60.916799 155.965969 60.837007 155.956582 60.754868 155.801691 60.679769 155.613944 60.588243 155.480174 60.534265 155.315896 60.452126 155.083559 60.398149 154.919281 60.316010 154.851222 60.287848 154.797245 60.201015 154.663475 60.086020 # -b 70.320568 66.640730 70.489540 66.650118 70.677287 66.671239 70.865034 66.741644 71.062168 66.805009 71.202978 66.819090 71.437661 66.851945 71.493985 66.819090 71.578471 66.692361 71.592552 66.657158 71.348482 66.671239 71.193590 66.605528 70.982375 66.544510 70.785241 66.499920 70.630350 66.504614 70.466072 66.556244 70.409748 66.584406 70.320568 66.640730 # -b 72.526593 70.006092 72.550061 69.945074 72.582917 69.914565 72.592304 69.914565 72.592304 69.884056 72.672097 69.844160 72.672097 69.715084 72.615773 69.672841 72.559449 69.623558 72.606385 69.541419 72.639241 69.468667 72.592304 69.426424 72.517205 69.386527 72.559449 69.297348 72.540674 69.205821 72.460881 69.118988 72.460881 69.003993 72.559449 68.940629 72.728421 68.863183 72.869231 68.783391 73.080446 68.708292 73.244724 68.654315 73.409003 68.602684 73.432471 68.494730 73.432471 68.410244 73.235337 68.309330 73.155545 68.250659 73.080446 68.138011 73.066365 68.058219 73.103914 67.954958 73.122689 67.823535 73.024122 67.753130 73.089833 67.703847 72.949023 67.626401 72.737808 67.598239 72.629854 67.572424 72.582917 67.502019 72.484350 67.417533 72.474962 67.349475 72.338846 67.281416 72.174568 67.281416 72.151099 67.222745 72.151099 67.159381 72.108856 67.133566 71.897641 67.114791 71.723975 67.103057 71.512760 67.154687 71.381337 67.187543 71.357869 67.093669 71.493985 67.051426 71.611327 67.081935 71.766218 67.086629 71.930497 67.081935 72.043145 67.020918 71.930497 66.964594 71.766218 66.943472 71.667651 66.936432 71.493985 66.948166 71.404806 66.927044 71.348482 66.880108 71.095023 66.835518 70.940132 66.887148 70.850953 66.814396 70.775854 66.767459 70.597494 66.767459 70.489540 66.701748 70.254856 66.692361 70.189145 66.753378 # -b 69.780796 66.697054 70.034254 66.678280 70.057722 66.591447 70.081191 66.499920 70.024867 66.460024 70.024867 66.389619 70.099965 66.363804 70.287712 66.342682 70.442603 66.337989 70.541170 66.333295 70.742998 66.337989 70.982375 66.368497 71.348482 66.354416 71.634795 66.293399 71.831930 66.258196 72.043145 66.222994 72.287216 66.258196 72.409251 66.403700 72.273135 66.525735 72.352927 66.579713 72.615773 66.619609 72.869231 66.657158 73.033509 66.743991 73.310436 66.805009 73.498183 66.870720 73.643686 66.964594 73.784496 67.051426 73.850208 67.192237 73.864289 67.295497 73.897145 67.340087 74.052036 67.405799 74.159990 67.464469 74.249170 67.509059 74.436917 67.588852 74.690375 67.673338 74.713843 67.706193 74.732618 67.795373 74.765474 67.856391 74.765474 67.919755 74.746699 67.985467 74.690375 68.067606 74.577727 68.116890 74.601195 68.184948 74.469772 68.231885 74.413448 68.299943 74.314881 68.321064 74.272638 68.393816 74.291413 68.410244 74.357124 68.454834 74.422836 68.539320 74.389980 68.623806 74.389980 68.682477 74.558952 68.727067 74.910977 68.774003 75.108111 68.818593 75.253615 68.858490 75.394425 68.858490 75.629109 68.877264 75.816856 68.893692 75.957666 68.921854 76.103170 68.933588 76.389483 68.938282 76.586618 68.957057 76.642942 68.903079 76.708653 68.842062 76.675797 68.759922 76.750896 68.698905 76.919868 68.659009 77.004354 68.602684 77.173326 68.572176 77.290668 68.511158 77.323524 68.471262 77.290668 68.417285 77.304749 68.365654 77.271893 68.349226 77.239038 68.299943 77.206182 68.260047 77.224957 68.194335 77.346992 68.210763 77.412704 68.182601 77.323524 68.107502 77.281281 68.067606 77.257812 67.969039 77.271893 67.889247 77.239038 67.823535 77.159245 67.790680 77.192101 67.715581 77.379848 67.678031 77.567595 67.640482 77.647387 67.586505 77.689630 67.527834 77.877377 67.534875 78.130835 67.530181 78.295114 67.513753 78.374906 67.506712 78.426536 67.518447 78.628364 67.534875 78.825498 67.544262 78.881822 67.567730 78.759787 67.602933 78.515716 67.652216 78.393681 67.645176 78.187159 67.647523 78.065124 67.661604 77.999412 67.678031 77.835134 67.715581 77.788197 67.710887 77.699017 67.710887 77.656774 67.703847 77.614531 67.699153 77.544126 67.760171 77.511271 67.889247 77.511271 67.959652 77.525352 68.055872 77.600450 68.138011 77.788197 68.189642 78.055736 68.206069 78.163691 68.260047 78.140222 68.339839 78.065124 68.344533 77.985331 68.414938 77.835134 68.518198 77.731873 68.612072 77.755341 68.682477 77.745954 68.790431 77.666162 68.853796 77.576982 68.870224 77.304749 68.914814 76.994967 68.980525 76.840076 69.020421 76.652329 69.083786 76.497438 69.111948 76.220511 69.177659 76.046846 69.205821 75.802775 69.217555 75.629109 69.208168 75.408506 69.170619 75.197291 69.114295 75.140967 69.055624 74.854653 69.072052 74.624663 69.107254 74.413448 69.107254 74.117747 69.074398 73.906532 69.088479 73.751641 69.194087 73.765722 69.252758 73.883064 69.360712 73.930000 69.456932 73.784496 69.583662 73.554507 69.736206 73.596750 69.862935 73.643686 69.942727 # -b 60.020308 70.050682 60.175200 69.970889 60.372334 69.893444 60.517837 69.815998 60.569468 69.754981 60.517837 69.729165 60.414577 69.663454 60.283154 69.698656 60.151731 69.703350 60.062551 69.675188 # -b 59.888886 68.691864 60.128263 68.694211 60.447432 68.710639 60.592936 68.778697 60.771296 68.853796 60.804151 68.858490 60.846394 68.893692 60.879250 68.961750 60.912106 69.036849 60.959042 69.118988 60.855782 69.130722 60.869863 69.083786 60.757215 69.212862 60.691503 69.302041 60.592936 69.353672 60.461513 69.438158 60.339478 69.546112 60.330091 69.607130 60.428658 69.630598 60.602324 69.656413 60.691503 69.686922 60.790070 69.740900 60.804151 69.806611 60.902718 69.827732 61.146789 69.825386 61.320455 69.806611 61.451878 69.783143 61.541058 69.745593 61.728804 69.747940 61.925939 69.729165 62.104298 69.733859 62.268576 69.722125 62.489179 69.717431 62.766106 69.724472 62.930384 69.684575 63.118131 69.642332 63.273022 69.642332 63.526480 69.607130 63.789326 69.553153 63.958298 69.529684 64.122576 69.517950 64.352566 69.440505 64.563781 69.377140 64.704591 69.325510 64.962743 69.290307 65.225589 69.219902 65.366399 69.182353 65.568227 69.158884 65.690262 69.154191 65.774748 69.130722 65.633938 69.130722 65.610470 69.072052 65.788829 69.050930 65.840460 69.043889 65.929639 69.032155 66.098611 69.008687 66.239422 68.957057 66.549204 68.877264 66.858986 68.853796 67.065507 68.799819 67.276723 68.710639 67.539568 68.572176 67.685072 68.511158 67.858738 68.482996 68.027710 68.438406 68.201376 68.353920 68.182601 68.260047 68.281168 68.206069 68.534626 68.276474 68.576869 68.360960 68.731760 68.511158 68.844409 68.640234 68.910120 68.734107 69.116641 68.842062 69.018074 68.886652 69.008687 68.926548 68.797472 68.903079 68.501771 68.978178 68.356267 69.111948 68.224844 69.201127 68.116890 69.302041 68.069953 69.360712 68.126277 69.499176 68.013629 69.503869 67.896287 69.480401 67.661604 69.557846 67.431614 69.600089 67.243867 69.654067 67.098363 69.632945 66.990409 69.614170 66.990409 69.522644 66.868373 69.618864 66.858986 69.764368 66.858986 69.888750 # -b 66.912963 70.036601 67.025611 69.975583 67.213358 69.975583 # -b 70.189145 66.753378 69.968543 66.809702 69.780796 66.779194 69.780796 66.697054 # -b 49.842084 68.008935 50.053300 68.067606 50.208191 68.116890 50.330226 68.138011 50.428793 68.182601 50.635315 68.248312 50.823062 68.309330 50.945097 68.328105 50.954484 68.328105 51.001421 68.311677 51.254879 68.360960 51.452013 68.389122 51.686697 68.426672 51.639760 68.454834 51.907299 68.482996 52.137289 68.506464 52.268712 68.429019 52.357892 68.337492 52.456459 68.349226 52.611350 68.400857 52.644206 68.466568 52.634818 68.522892 52.578494 68.583910 52.414216 68.567482 52.620737 68.663702 52.822565 68.734107 52.953988 68.734107 52.855421 68.680130 52.930519 68.619112 53.076023 68.595644 53.296626 68.626153 53.282545 68.680130 53.216833 68.766963 53.273157 68.795125 53.428049 68.813900 53.404580 68.865530 53.568859 68.893692 53.803542 68.933588 53.944352 68.945322 54.066388 68.945322 54.197810 68.933588 54.286990 68.945322 54.385557 68.961750 54.451269 68.966444 54.516980 68.973484 # -b 49.896062 69.259798 50.018097 69.170619 50.093196 69.161231 50.093196 69.278573 50.182376 69.184700 50.313798 69.083786 50.280943 68.996953 50.238700 69.039196 50.158907 69.090826 # -b 58.806995 69.963849 58.764752 69.968543 # -b 60.064898 69.675188 59.867764 69.672841 59.637774 69.733859 59.689405 69.790183 59.515739 69.834773 59.327992 69.844160 59.163714 69.877016 59.008822 69.914565 59.093309 69.844160 59.248200 69.771408 59.205957 69.729165 59.041678 69.846507 58.886787 69.938034 58.806995 69.963849 # -b 54.516980 68.973484 54.629628 68.985219 54.596772 68.968791 54.498205 68.950016 54.376170 68.926548 54.221279 68.917160 54.057000 68.921854 53.925578 68.917160 53.780074 68.881958 53.770686 68.813900 53.836398 68.818593 53.845785 68.874917 53.934965 68.853796 53.991289 68.823287 54.057000 68.778697 54.024145 68.680130 53.977208 68.640234 53.902109 68.579216 53.902109 68.527586 54.000676 68.490036 54.010064 68.377388 54.000676 68.311677 54.197810 68.281168 54.343314 68.248312 54.418413 68.267087 54.563917 68.189642 54.718808 68.145052 54.883086 68.145052 54.925329 68.206069 54.939410 68.281168 54.948798 68.344533 55.023896 68.410244 55.178788 68.445447 55.314904 68.494730 55.455714 68.541667 55.666929 68.539320 55.873451 68.595644 56.094053 68.635540 56.248944 68.612072 56.403835 68.572176 56.582195 68.579216 56.746473 68.602684 57.023400 68.579216 57.131354 68.522892 57.366038 68.529933 57.497461 68.595644 57.596028 68.670743 57.727450 68.734107 57.994990 68.774003 58.037233 68.811553 58.178043 68.881958 58.445582 68.926548 58.722509 68.973484 58.896174 68.996953 59.083921 68.985219 59.051066 68.926548 59.196569 68.842062 59.370235 68.750535 59.459415 68.720026 59.313911 68.682477 59.196569 68.626153 59.116777 68.555748 59.116777 68.438406 59.313911 68.365654 59.557982 68.321064 59.778584 68.360960 59.989800 68.466568 59.966331 68.529933 59.877151 68.595644 59.891232 68.691864 # -b 39.914972 68.079340 40.018233 68.046485 40.083944 67.987814 40.205979 67.938530 40.304547 67.886900 40.403114 67.856391 40.393726 67.795373 40.534536 67.736702 40.647184 67.769558 40.853706 67.720274 41.041453 67.624054 41.050840 67.523140 41.064921 67.471510 41.140020 67.365902 41.154101 67.318966 41.163488 67.208664 41.219812 67.180502 41.384091 67.145300 41.327767 66.978675 41.172876 66.800315 41.008597 66.697054 40.778607 66.553897 40.614329 66.488186 40.435969 66.399006 40.271691 66.354416 40.224754 66.333295 40.093331 66.274624 # -b 39.950174 64.608371 40.156696 64.573169 40.344443 64.545007 40.475865 64.526232 40.574433 64.540313 40.729324 64.502764 40.809116 64.474601 40.907683 64.451133 40.907683 64.498070 40.752792 64.601331 40.719936 64.669389 40.565045 64.810199 40.466478 64.915806 40.335055 65.028455 40.133228 65.141103 40.034660 65.213855 # -b 39.860995 65.617510 40.081597 65.648019 40.302200 65.720771 40.508721 65.802910 40.630757 65.915558 40.851359 65.976576 41.015638 65.976576 41.250321 66.021166 41.456843 66.054022 41.644589 66.138508 41.822949 66.244115 41.954372 66.298092 42.109263 66.368497 42.174974 66.448290 42.329865 66.523389 42.404964 66.490533 42.526999 66.452984 42.625566 66.399006 42.705359 66.382578 42.982285 66.382578 43.146564 66.382578 43.287374 66.354416 43.409409 66.307480 43.597156 66.248809 43.578382 66.164323 43.442265 66.049328 43.531445 66.089224 43.676949 66.133814 43.831840 66.143201 43.963262 66.070449 44.005506 65.985963 44.127541 65.915558 44.193252 65.873315 44.202640 65.960148 44.216721 66.035247 44.249576 66.143201 44.183865 66.234728 44.136928 66.272277 44.151009 66.293399 44.169784 66.337989 44.258964 66.448290 44.324675 66.495227 44.446711 66.565632 44.512422 66.697054 44.460792 66.779194 44.535890 66.870720 44.545278 66.957553 44.437323 67.046733 44.380999 67.093669 44.216721 67.149994 43.982037 67.149994 43.897551 67.180502 43.864695 67.297844 43.874083 67.396411 43.949181 67.487938 44.028974 67.593545 44.136928 67.741396 44.118154 67.844657 44.118154 67.849350 44.118154 67.856391 44.151009 67.903328 44.202640 67.992507 44.169784 68.091074 44.169784 68.215457 44.169784 68.321064 43.996118 68.389122 43.784903 68.445447 43.507976 68.527586 43.310842 68.600338 43.277987 68.663702 43.367166 68.647274 43.620625 68.600338 43.841227 68.567482 44.028974 68.522892 44.202640 68.506464 44.404467 68.527586 44.643845 68.522892 44.864447 68.511158 45.052194 68.515852 45.286877 68.518198 45.493399 68.482996 45.746857 68.461874 45.948685 68.405550 45.958072 68.295249 46.080108 68.264740 46.234999 68.138011 46.422746 68.173214 46.488457 68.051178 46.521313 67.922102 46.676204 67.811801 46.530700 67.807107 46.178675 67.760171 45.859505 67.748436 45.671758 67.732009 45.408913 67.694459 45.329121 67.602933 45.197698 67.534875 45.000564 67.527834 45.009951 67.422226 45.099131 67.316619 45.296265 67.250907 45.507480 67.161728 45.681146 67.077242 45.760938 66.988062 45.859505 66.908270 45.967460 66.844905 46.122351 66.800315 46.300710 66.800315 46.530700 66.856639 46.563556 66.753378 46.652736 66.650118 46.741915 66.797968 46.929662 66.819090 47.117409 66.861333 47.314543 66.849599 47.492903 66.891842 47.614938 66.912963 47.746361 66.999796 47.722892 67.103057 47.699424 67.180502 47.779216 67.264988 47.854315 67.375290 47.920026 67.485591 48.032675 67.577118 48.140629 67.560690 48.318988 67.609973 48.563059 67.619361 48.703869 67.635788 48.882229 67.685072 48.802437 67.703847 48.825905 67.811801 48.980796 67.802414 49.168543 67.856391 49.407920 67.919755 49.595667 67.959652 49.839738 68.008935 # -b 48.661626 69.445198 48.713257 69.461626 48.713257 69.473360 48.793049 69.475707 48.882229 69.449892 48.957328 69.461626 48.990183 69.480401 49.079363 69.499176 49.168543 69.499176 49.323434 69.452239 49.487712 69.391221 49.717702 69.325510 49.896062 69.259798 # -b 50.161254 69.090826 49.954733 69.008687 49.752905 68.893692 49.588626 68.818593 49.335168 68.766963 49.180277 68.766963 49.015999 68.694211 48.828252 68.687171 48.739072 68.734107 48.682748 68.680130 48.541938 68.731760 48.410515 68.813900 48.297867 68.823287 48.274399 68.731760 48.330723 68.687171 48.222768 68.755229 48.166444 68.825634 48.222768 68.910120 48.232156 69.032155 48.241543 69.137763 48.311948 69.236330 48.419902 69.313776 48.541938 69.391221 48.663973 69.445198 # -b 29.978472 69.703350 30.001940 69.684575 30.067652 69.642332 30.100507 69.656413 30.100507 69.736206 30.166219 69.693963 30.246011 69.684575 30.344578 69.675188 30.335191 69.654067 30.433758 69.654067 30.466614 69.729165 30.476001 69.785489 30.588649 69.783143 30.687216 69.759674 30.842107 69.754981 30.893738 69.754981 # -b 30.893738 69.754981 30.907819 69.754981 30.931287 69.764368 31.104953 69.729165 31.292700 69.705697 31.391267 69.675188 31.480446 69.630598 31.658806 69.632945 31.733905 69.675188 31.701049 69.745593 31.733905 69.794877 31.809003 69.764368 31.963894 69.771408 31.977975 69.869975 31.879408 69.919259 31.977975 69.900484 32.184497 69.881710 32.452036 69.825386 32.470811 69.794877 32.616315 69.752634 32.747737 69.766715 32.860385 69.747940 32.912016 69.733859 33.024664 69.736206 33.080988 69.722125 33.057520 69.656413 32.968340 69.607130 32.893241 69.557846 32.747737 69.576621 32.541216 69.571927 32.428568 69.618864 32.330001 69.614170 32.207965 69.642332 32.142254 69.722125 32.067155 69.618864 32.020218 69.539072 32.175110 69.541419 32.320613 69.546112 32.372244 69.503869 32.395712 69.461626 32.339388 69.414689 32.395712 69.414689 32.494279 69.440505 32.616315 69.456932 32.761818 69.456932 32.813449 69.445198 32.780593 69.377140 32.846304 69.402955 32.968340 69.421730 32.926097 69.348978 32.893241 69.295001 33.066907 69.341938 33.245266 69.395915 33.287509 69.377140 33.268735 69.332550 33.245266 69.295001 33.310978 69.273879 33.320365 69.271532 33.334446 69.259798 33.367302 69.241024 33.386077 69.208168 33.522193 69.248064 33.686471 69.248064 33.827282 69.259798 33.907074 69.306735 34.169919 69.259798 34.381135 69.243370 34.592350 69.219902 34.798871 69.208168 34.963150 69.182353 35.118041 69.149497 35.216608 69.149497 35.287013 69.182353 35.230689 69.217555 35.441904 69.189393 35.681281 69.172965 35.859641 69.165925 35.958208 69.130722 36.080243 69.107254 36.333701 69.060317 36.577772 69.008687 36.727970 68.938282 36.850005 68.905426 36.972041 68.870224 37.192643 68.823287 37.324066 68.762269 37.493038 68.710639 37.633848 68.675436 37.798127 68.607378 37.999954 68.541667 38.098521 68.499424 38.197089 68.471262 38.328511 68.400857 38.361367 68.349226 38.492790 68.276474 38.516258 68.281168 38.680537 68.248312 38.891752 68.234231 38.746248 68.353920 38.835428 68.304636 38.980931 68.250659 39.046643 68.166173 39.112354 68.128624 39.145210 68.184948 39.309488 68.116890 39.440911 68.074647 39.609883 68.041791 39.717838 68.006588 39.863341 68.025363 39.783549 68.116890 39.914972 68.079340 # -b 40.093331 66.274624 39.807017 66.227687 39.544172 66.178404 39.290714 66.129120 39.070111 66.115039 38.835428 66.070449 38.713392 66.075143 38.483402 66.084530 38.262800 66.089224 37.967099 66.093918 37.830982 66.107999 37.633848 66.129120 37.788739 66.107999 37.723028 66.115039 37.600992 66.124427 37.446101 66.194832 37.248967 66.222994 36.981428 66.272277 36.709195 66.288705 36.465124 66.284011 36.202279 66.342682 35.901884 66.373191 35.606183 66.403700 35.460679 66.474105 35.230689 66.474105 35.118041 66.544510 34.888051 66.575019 34.789484 66.584406 34.512557 66.539816 34.437459 66.626649 34.390522 66.722870 34.282568 66.736951 34.193388 66.687667 34.104208 66.711135 33.996254 66.661852 33.827282 66.713482 33.686471 66.819090 33.620760 66.753378 33.555049 66.736951 33.423626 66.774500 33.212411 66.830824 33.048132 66.870720 32.860385 66.973981 32.836917 67.056120 32.672639 67.093669 32.484892 67.140606 32.395712 67.128872 32.217353 67.128872 32.109398 67.114791 31.987363 67.056120 32.273677 67.020918 32.405099 66.936432 32.484892 66.823783 32.761818 66.713482 32.649170 66.675933 32.804061 66.631343 32.991808 66.560938 33.066907 66.518695 33.254654 66.455330 33.564436 66.438902 33.606679 66.403700 33.573823 66.337989 33.573823 66.288705 33.874218 66.239422 34.071352 66.234728 34.160532 66.138508 34.268487 66.133814 34.437459 66.119733 34.521945 66.079837 34.658061 65.927292 34.789484 65.868622 34.822340 65.788829 34.780097 65.594042 34.733160 65.507209 34.709692 65.425070 34.456233 65.392214 34.381135 65.333543 34.559494 65.195080 34.709692 65.051923 34.700304 64.939275 34.780097 64.920500 34.888051 64.871217 34.855195 64.739794 34.897438 64.582556 34.723773 64.507457 34.676836 64.441746 34.920907 64.498070 35.033555 64.399503 35.183752 64.340832 35.352724 64.289202 35.540471 64.298589 35.648426 64.345526 35.826785 64.303283 35.958208 64.218796 36.113099 64.164819 36.235134 64.077986 36.286765 64.016969 36.596547 63.981766 36.906329 63.904321 37.169175 63.845650 37.347534 63.831569 37.600992 63.768204 37.600992 63.798713 37.666704 63.857384 37.798127 63.904321 37.934243 63.939523 38.164233 63.904321 38.262800 63.880852 38.164233 63.944217 38.107909 64.087374 38.051585 64.202369 38.018729 64.317364 37.910775 64.446439 37.713641 64.413584 37.577524 64.385422 37.356922 64.340832 37.202030 64.418277 37.061220 64.474601 36.948572 64.573169 36.864086 64.660001 36.709195 64.692857 36.596547 64.805505 36.554304 64.889991 36.610628 64.889991 36.727970 64.915806 36.896942 65.004986 36.939185 65.162224 37.136319 65.143450 37.478957 65.075391 37.779352 64.990905 37.854451 64.885298 38.140765 64.861829 38.375448 64.819586 38.262800 64.805505 38.084440 64.753875 38.131377 64.655308 38.164233 64.591943 38.295656 64.692857 38.474015 64.749181 38.572582 64.796118 38.736861 64.749181 39.013787 64.730407 39.342344 64.622452 39.478461 64.591943 39.699063 64.554394 39.929053 64.535619 39.971296 64.563781 39.952521 64.608371 # -b 40.037007 65.213855 39.914972 65.319462 39.882116 65.453232 39.863341 65.521290 39.863341 65.617510 # -b 30.215502 59.963984 30.182647 60.001534 30.048877 60.013268 # -b 30.931287 61.681868 30.954755 61.693602 31.020467 61.677174 31.142502 61.672480 31.231682 61.646665 31.339636 61.613809 31.471059 61.531670 31.583707 61.482387 31.691662 61.388513 31.813697 61.329842 32.013178 61.308721 32.210312 61.271172 32.341735 61.207807 32.452036 61.135055 32.508360 61.069344 32.552950 60.973123 32.606927 60.898025 32.740697 60.867516 32.740697 60.768949 32.806408 60.689156 32.761818 60.560081 32.630396 60.531918 32.618661 60.395802 32.552950 60.330091 32.376937 60.189281 32.222046 60.177546 32.111745 60.222136 31.980322 60.243258 31.780841 60.231524 31.571973 60.182240 31.449938 60.083673 # -b 30.987611 59.940516 30.964143 60.055511 30.975877 60.182240 30.910165 60.304275 30.886697 60.423964 30.788130 60.553040 30.633239 60.646913 30.480695 60.722012 30.424371 60.759561 30.436105 60.768949 30.501816 60.839354 30.468960 60.872210 30.358659 60.959042 30.314069 60.980164 30.292948 61.031794 30.292948 61.043529 30.248358 61.048222 30.138057 61.102199 30.060611 61.059956 30.027755 61.329842 30.093467 61.379126 30.114588 61.426063 30.126323 61.472999 30.192034 61.531670 30.241317 61.541058 30.281214 61.604422 30.318763 61.630237 30.375087 61.672480 30.407943 61.672480 30.450186 61.667787 30.501816 61.688908 30.511204 61.735845 # -b 19.987995 69.806611 20.095949 69.888750 20.185129 69.895791 20.293083 69.914565 20.340020 69.785489 20.307164 69.672841 20.293083 69.522644 20.260228 69.449892 20.152273 69.377140 20.072481 69.318469 20.217985 69.377140 20.340020 69.503869 20.462055 69.553153 20.626334 69.595396 20.593478 69.632945 20.560623 69.733859 20.659190 69.747940 20.724901 69.827732 20.856324 69.888750 21.001828 69.914565 20.922035 69.846507 20.936116 69.806611 21.011215 69.783143 21.076926 69.827732 21.166106 69.825386 21.222430 69.893444 21.320997 69.888750 # -b 21.255286 70.013132 21.386709 69.970889 21.541600 69.914565 21.705878 69.839467 21.884238 69.736206 22.006273 69.698656 22.006273 69.790183 21.926481 69.858241 21.926481 69.930993 21.973417 69.989664 # -b 22.987250 70.048335 22.987250 69.989664 23.085817 69.952115 23.226627 69.956808 # -b 29.173507 70.001398 29.403497 69.956808 29.516145 69.919259 29.450434 69.884056 29.825928 69.895791 29.910414 69.855894 29.943269 69.815998 29.891639 69.778449 29.755523 69.766715 29.624100 69.729165 29.549001 69.649373 29.746135 69.691616 29.891639 69.693963 29.933882 69.703350 29.976125 69.703350 # -b 19.865959 63.650862 20.006769 63.704840 20.142886 63.681371 20.217985 63.721267 20.340020 63.744736 20.438587 63.777591 20.480830 63.812794 20.537154 63.845650 20.659190 63.876159 20.715514 63.923095 20.804693 64.005234 20.846936 64.077986 20.936116 64.131964 21.058152 64.183594 21.109782 64.232877 21.156719 64.289202 21.222430 64.336138 21.288141 64.385422 21.363240 64.427665 21.386709 64.385422 21.363240 64.303283 21.433645 64.350219 21.532212 64.408890 21.565068 64.446439 21.466501 64.488683 21.452420 64.530926 21.386709 64.563781 21.255286 64.617758 21.189574 64.650614 21.156719 64.702245 21.198962 64.716326 21.175493 64.772650 21.091007 64.814893 21.100395 64.843055 21.175493 64.875910 21.198962 64.925194 21.311610 64.948662 21.363240 64.958050 21.396096 65.000293 21.433645 65.042536 21.508744 65.094166 21.541600 65.143450 21.565068 65.195080 21.508744 65.232629 21.452420 65.281913 21.377321 65.333543 21.396096 65.352318 21.532212 65.382827 21.597924 65.406295 21.607311 65.462619 21.687103 65.472006 21.752815 65.453232 21.837301 65.443844 21.893625 65.453232 21.917093 65.502515 21.860769 65.540065 21.884238 65.549452 22.039129 65.549452 22.057903 65.589348 21.973417 65.648019 21.860769 65.706690 21.860769 65.734852 21.959336 65.701996 22.071984 65.671487 22.161164 65.612817 22.236263 65.612817 22.236263 65.652713 22.212794 65.734852 22.226876 65.720771 22.292587 65.734852 22.311362 65.819338 22.325443 65.892090 22.391154 65.901477 22.424010 65.892090 22.466253 65.901477 22.466253 65.861581 22.531964 65.819338 22.611756 65.807604 22.653999 65.868622 22.700936 65.906171 22.799503 65.873315 22.832359 65.838113 22.907458 65.798217 22.973169 65.798217 23.076430 65.760667 23.160916 65.852194 23.315807 65.856887 23.503554 65.856887 23.634977 65.866275 23.803949 65.824032 23.911903 65.765361 23.991696 65.824032 24.066794 65.847500 24.024551 65.936680 # -b 24.024551 65.936680 24.090263 65.910865 24.099650 65.910865 24.132506 65.892090 24.165361 65.878009 24.254541 65.866275 24.310865 65.814644 24.432901 65.788829 24.531468 65.828725 24.573711 65.784135 24.653503 65.701996 24.817781 65.648019 24.939817 65.622204 25.080627 65.551799 25.146338 65.516596 25.258986 65.443844 25.324698 65.378133 25.348166 65.338237 25.324698 65.272525 25.315311 65.213855 25.315311 65.152837 25.301230 65.112941 25.366941 65.047229 25.488976 64.962743 25.348166 64.972131 25.282455 64.911113 25.334085 64.838361 25.146338 64.885298 24.958592 64.875910 24.784926 64.838361 24.639422 64.814893 24.564323 64.702245 24.465756 64.540313 24.231073 64.437052 24.043326 64.326751 23.869660 64.223490 23.616202 64.092067 23.428455 64.005234 23.264177 63.904321 23.128060 63.817488 22.996637 63.700146 22.832359 63.578110 22.719711 63.500665 22.546045 63.446688 22.424010 63.357508 22.334830 63.322305 22.212794 63.244860 22.039129 63.244860 21.851382 63.223738 21.696491 63.254247 21.616698 63.179149 21.574455 63.134559 21.729346 63.059460 21.649554 63.040685 # -b 27.624596 60.585896 27.612862 60.602324 27.547151 60.553040 27.457971 60.522531 27.338282 60.536612 27.127067 60.543653 26.974523 60.592936 26.753920 60.531918 26.575561 60.499063 26.399548 60.494369 26.247004 60.489675 26.124969 60.440392 26.026402 60.433351 25.871510 60.461513 25.826921 60.489675 25.880898 60.400496 25.782331 60.374681 25.660295 60.353559 25.540607 60.337131 25.463161 60.423964 25.385716 60.346519 25.320004 60.297235 25.153379 60.287848 25.021956 60.254992 24.867065 60.198668 24.747376 60.226830 24.604219 60.210402 24.458716 60.161119 24.383617 60.107141 24.282703 60.062551 24.228726 60.067245 24.151280 60.107141 24.017511 60.078979 23.874354 60.078979 23.578653 60.006227 # -b 23.346316 59.980412 23.358050 60.067245 23.313460 60.090713 # -b 23.069389 59.989800 23.015412 60.001534 22.937967 60.025002 22.949701 60.083673 22.905111 60.123569 22.872255 60.156425 22.783075 60.215096 22.794810 60.325397 22.773688 60.374681 22.496762 60.292541 22.431050 60.320703 22.353605 60.341825 22.398194 60.407536 22.353605 60.449779 22.034435 60.489675 21.834954 60.536612 21.736387 60.597630 21.637820 60.635179 21.536906 60.663341 21.283448 60.668035 21.262326 60.731399 21.360893 60.738440 21.384362 60.780683 21.328038 60.785377 21.250592 60.808845 21.217736 60.855782 21.250592 60.898025 21.241205 60.952002 21.173147 61.001286 21.229471 61.090465 21.283448 61.090465 21.318650 61.135055 21.372628 61.214848 21.384362 61.292293 21.384362 61.341577 21.351506 61.414328 21.363240 61.472999 21.356200 61.524630 21.384362 61.562179 21.433645 61.566873 21.478235 61.519936 21.473541 61.545751 21.424258 61.595035 21.384362 61.667787 21.367934 61.749926 21.351506 61.796863 21.346812 61.890736 21.274060 61.968182 21.236511 62.057361 21.252939 62.181744 21.269367 62.277964 21.236511 62.381225 21.196615 62.432855 21.175493 62.493873 21.163759 62.573665 21.152025 62.665192 21.180187 62.756718 21.203655 62.822430 21.236511 62.883447 21.262326 62.902222 21.323344 62.906916 21.351506 62.977321 21.351506 63.017217 21.346812 63.021911 21.501703 63.040685 # -b 19.983301 60.025002 20.049013 60.090713 # -b 19.983301 60.222136 20.039625 60.280807 20.049013 60.325397 20.016157 60.346519 # -b 21.769243 60.210402 21.724653 60.254992 21.682410 60.247951 21.614352 60.243258 21.581496 60.182240 21.658941 60.139997 21.757508 60.139997 21.802098 60.156425 # -b 22.553086 60.050817 22.618797 60.083673 22.672774 60.172853 22.696243 60.264379 22.705630 60.304275 22.639918 60.271420 22.541351 60.254992 22.386460 60.215096 22.374726 60.144691 22.299627 60.116529 22.255038 60.067245 22.309015 60.074286 22.419316 60.083673 22.485027 60.062551 22.553086 60.050817 # -b 29.002189 59.947557 29.100756 60.001534 29.255647 60.006227 # -b 30.048877 60.013268 29.938576 60.046124 29.950310 60.090713 29.950310 60.132957 29.774297 60.198668 29.586550 60.231524 29.422272 60.215096 29.243913 60.189281 29.046778 60.189281 28.870766 60.254992 28.727609 60.320703 28.617308 60.353559 28.516394 60.358253 28.429561 60.433351 28.429561 60.569468 28.507006 60.553040 28.584452 60.489675 28.584452 60.494369 28.584452 60.564774 28.593839 60.646913 28.626695 60.693850 28.605573 60.754868 28.495272 60.731399 28.384971 60.700891 28.262935 60.663341 28.152634 60.602324 28.065801 60.553040 27.866320 60.560081 27.767753 60.569468 27.624596 60.585896 # -b 9.941194 63.411485 10.105472 63.397404 10.185264 63.411485 10.138328 63.465462 10.194652 63.495971 10.382399 63.495971 10.579533 63.519440 10.701568 63.549948 10.715649 63.578110 10.668712 63.603926 10.612388 63.636781 10.767280 63.704840 10.969107 63.763510 11.100530 63.768204 11.208485 63.798713 11.344601 63.831569 11.410312 63.880852 11.330520 63.904321 11.231953 63.845650 11.067674 63.808100 10.837685 63.768204 10.649938 63.704840 10.471578 63.650862 10.340156 63.603926 10.161796 63.554642 10.039761 63.578110 # -b 9.962315 63.754123 10.004558 63.798713 # -b 9.929459 63.923095 10.117206 63.977072 10.117206 64.005234 10.051495 64.087374 10.103125 64.136657 10.182918 64.183594 10.248629 64.237571 10.323728 64.275121 10.412907 64.336138 10.534943 64.385422 10.558411 64.432358 10.633510 64.455827 10.746158 64.488683 10.797788 64.540313 10.910437 64.608371 10.966761 64.608371 11.088796 64.559088 11.206138 64.512151 11.407966 64.540313 11.483064 64.596637 11.426740 64.683470 11.440821 64.763262 11.628568 64.810199 11.736522 64.819586 11.670811 64.847748 11.506533 64.800812 11.328173 64.777343 11.361029 64.843055 11.407966 64.934581 11.562857 64.958050 11.694279 65.004986 11.713054 65.075391 11.849171 65.152837 11.900801 65.148143 11.966512 65.127022 12.069773 65.185693 12.168340 65.171612 12.266907 65.143450 12.388943 65.195080 12.356087 65.251404 12.356087 65.305381 12.374862 65.338237 12.342006 65.371093 12.266907 65.305381 12.154259 65.281913 12.069773 65.305381 12.121403 65.378133 12.243439 65.401601 12.309150 65.443844 12.290376 65.511903 12.290376 65.570574 12.309150 65.549452 12.398330 65.474353 12.529753 65.457925 12.665869 65.392214 12.651788 65.464966 12.618932 65.540065 12.576689 65.549452 12.510978 65.575267 12.454654 65.652713 12.464041 65.652713 12.529753 65.697303 12.642401 65.671487 12.708112 65.690262 12.665869 65.755973 12.708112 65.802910 12.816067 65.842806 12.750355 65.868622 12.773824 65.936680 12.961570 65.910865 13.139930 65.882703 13.017894 65.981270 13.017894 66.054022 12.816067 66.016472 12.675257 65.955454 12.520365 65.946067 12.618932 66.049328 12.773824 66.070449 12.928715 66.119733 12.952183 66.178404 12.952183 66.227687 13.027282 66.258196 13.215029 66.272277 13.402775 66.279318 13.445018 66.347376 13.369920 66.382578 13.280740 66.328601 13.172786 66.389619 13.149317 66.495227 13.158705 66.509308 13.271353 66.478799 13.426244 66.514001 13.477874 66.556244 13.247884 66.575019 13.271353 66.640730 13.360532 66.666546 13.313596 66.706442 13.524811 66.718176 13.524811 66.788581 13.721945 66.800315 13.787656 66.835518 13.679702 66.905923 13.721945 66.938778 13.764188 66.952859 13.834593 66.988062 13.951935 66.990409 14.064583 67.016224 14.196006 67.004490 14.228861 67.063161 14.275798 67.140606 14.425996 67.161728 14.449464 67.196930 14.472932 67.255601 14.350897 67.255601 14.360284 67.318966 14.538644 67.375290 14.637211 67.492631 14.834345 67.560690 14.979849 67.567730 15.003317 67.518447 15.078416 67.487938 15.223919 67.485591 15.411666 67.459776 15.529008 67.487938 15.632269 67.534875 15.773079 67.593545 15.585332 67.560690 15.421054 67.546609 15.242694 67.572424 15.223919 67.598239 15.299018 67.593545 15.322487 67.593545 15.388198 67.614667 15.477378 67.694459 15.575945 67.715581 15.486765 67.753130 15.618188 67.778945 15.463297 67.823535 15.444522 67.893940 15.496152 67.952611 15.618188 67.987814 15.773079 68.001895 15.820016 68.030057 15.632269 68.058219 15.820016 68.072300 15.885727 68.161479 16.017150 68.173214 16.050005 68.105155 16.082861 67.992507 16.125104 67.915062 16.256527 67.926796 16.256527 68.001895 16.402031 67.980773 16.392643 68.055872 16.294076 68.154439 16.411418 68.149745 16.402031 68.201376 16.312851 68.267087 16.223671 68.311677 16.303464 68.365654 16.477129 68.398510 16.547534 68.421978 16.768137 68.400857 16.810380 68.365654 17.007514 68.360960 17.138937 68.337492 17.284441 68.304636 17.317296 68.398510 17.406476 68.445447 17.594223 68.445447 17.537899 68.501771 17.472188 68.522892 17.260972 68.466568 17.096694 68.506464 16.974658 68.534626 16.876091 68.494730 16.697732 68.471262 16.514679 68.518198 16.533453 68.541667 16.646102 68.572176 16.735281 68.630847 17.021595 68.670743 17.162405 68.654315 17.209342 68.703598 17.406476 68.670743 17.505043 68.708292 17.373620 68.762269 17.462800 68.774003 17.692790 68.748188 17.683403 68.795125 17.627079 68.858490 17.838294 68.853796 17.725646 68.910120 17.570755 68.891345 17.514431 68.938282 17.547286 69.008687 17.594223 69.060317 17.702177 69.095520 17.847681 69.126029 17.969717 69.142457 18.133995 69.177659 18.044815 69.224596 18.021347 69.283267 18.044815 69.325510 18.101139 69.384181 18.143382 69.438158 18.199706 69.473360 18.298273 69.433464 18.241949 69.344284 18.256030 69.313776 18.396841 69.348978 18.443777 69.266839 18.518876 69.306735 18.664380 69.259798 18.739479 69.283267 18.838046 69.320816 18.697235 69.365406 18.598668 69.402955 18.532957 69.463973 18.476633 69.510910 18.575200 69.517950 18.697235 69.527338 18.838046 69.468667 19.007018 69.365406 19.204152 69.320816 19.260476 69.271532 19.326187 69.217555 19.466997 69.208168 19.490466 69.273879 19.359043 69.360712 19.204152 69.384181 19.025792 69.473360 19.016405 69.539072 18.992937 69.602436 19.007018 69.632945 19.082116 69.693963 19.171296 69.747940 19.335575 69.754981 19.523321 69.759674 19.579645 69.766715 19.631276 69.771408 19.645357 69.705697 19.631276 69.623558 19.654744 69.529684 19.654744 69.438158 19.743924 69.564887 19.809635 69.715084 19.987995 69.806611 # -b 18.234909 63.000789 18.314701 63.019564 18.389800 63.050073 18.380413 63.085275 18.521223 63.120478 18.535304 63.200270 18.643258 63.219045 18.652646 63.317612 18.774681 63.326999 18.962428 63.312918 19.028139 63.338733 19.173643 63.388017 19.239354 63.474850 19.394246 63.524133 19.492813 63.568723 19.624235 63.514746 19.713415 63.533521 19.811982 63.573417 19.868306 63.650862 # -b 15.632269 68.926548 15.683899 68.938282 15.683899 68.940629 15.773079 68.945322 15.829403 68.893692 15.852871 68.839715 15.805935 68.778697 15.852871 68.795125 15.904502 68.734107 15.852871 68.659009 15.749611 68.583910 15.796547 68.612072 15.927970 68.640234 16.003069 68.734107 16.172041 68.750535 16.139185 68.799819 16.204897 68.865530 16.378562 68.839715 16.524066 68.771657 16.547534 68.682477 16.500598 68.623806 16.402031 68.572176 16.214284 68.551054 16.073474 68.499424 15.993681 68.426672 15.904502 68.490036 15.871646 68.471262 15.773079 68.443100 15.683899 68.393816 15.683899 68.349226 15.599413 68.309330 15.519621 68.360960 15.486765 68.429019 15.519621 68.466568 15.355342 68.372695 15.176983 68.304636 14.979849 68.243619 14.824958 68.210763 14.834345 68.255353 14.848426 68.276474 14.735778 68.281168 14.717003 68.281168 14.604355 68.217804 14.449464 68.201376 14.294573 68.173214 14.261717 68.206069 14.275798 68.255353 14.275798 68.299943 14.374365 68.316371 14.440077 68.365654 14.562112 68.360960 14.717003 68.400857 14.801489 68.393816 14.890669 68.438406 14.989236 68.445447 15.101884 68.457181 15.242694 68.490036 15.209838 68.534626 15.266163 68.555748 15.364730 68.600338 15.444522 68.626153 15.444522 68.698905 15.519621 68.720026 15.519621 68.774003 15.543089 68.818593 15.552476 68.858490 15.599413 68.910120 15.632269 68.926548 # -b 14.451811 68.680130 14.508135 68.694211 14.498747 68.708292 14.484666 68.727067 14.498747 68.762269 14.573846 68.734107 14.616089 68.778697 14.728737 68.759922 14.785061 68.799819 14.827304 68.877264 14.916484 68.813900 15.057294 68.823287 15.071375 68.881958 15.057294 68.957057 15.090150 68.950016 15.169942 68.893692 15.226266 68.858490 15.277897 68.818593 15.277897 68.755229 15.301365 68.710639 15.310752 68.640234 15.169942 68.630847 15.057294 68.590950 14.916484 68.574522 14.860160 68.630847 14.982195 68.675436 15.047907 68.727067 14.925871 68.670743 14.827304 68.675436 14.719350 68.651968 14.639558 68.630847 14.484666 68.586257 14.418955 68.626153 14.428342 68.663702 14.451811 68.680130 # -b 15.775426 69.194087 15.855218 69.196434 15.855218 69.208168 15.888074 69.252758 15.920930 69.302041 16.019497 69.306735 16.108676 69.285614 16.183775 69.271532 16.127451 69.224596 16.094595 69.147150 16.042965 69.107254 15.986641 69.050930 15.906849 69.025115 15.798894 69.001646 15.676859 68.980525 15.564211 68.985219 15.521968 69.025115 15.554823 69.111948 15.676859 69.130722 15.766038 69.154191 15.775426 69.194087 # -b 14.925871 67.795373 14.893016 67.797720 14.860160 67.828229 14.827304 67.868125 14.982195 67.844657 15.104231 67.849350 15.202798 67.877512 15.277897 67.910368 15.324833 67.861085 15.291978 67.807107 15.160555 67.785986 15.071375 67.727315 14.907097 67.682725 14.803836 67.673338 14.719350 67.699153 14.770980 67.732009 14.827304 67.764864 14.939952 67.774252 14.925871 67.795373 # -b 16.944150 69.194087 16.878438 69.208168 16.822114 69.229289 16.944150 69.219902 16.991086 69.248064 17.009861 69.285614 16.887826 69.302041 17.000474 69.318469 16.934762 69.348978 16.977005 69.367753 17.075572 69.395915 17.211689 69.365406 17.319643 69.414689 17.221076 69.461626 17.244545 69.463973 17.319643 69.480401 17.465147 69.452239 17.530858 69.485094 17.451066 69.569581 17.474534 69.564887 17.573101 69.503869 17.596570 69.560193 17.652894 69.571927 17.727993 69.564887 17.803091 69.503869 17.840641 69.480401 17.915739 69.445198 17.925127 69.426424 17.972063 69.360712 17.873496 69.290307 17.859415 69.236330 17.873496 69.161231 17.727993 69.147150 17.563714 69.147150 17.549633 69.189393 17.418210 69.172965 17.310256 69.083786 17.141284 69.079092 17.000474 69.067358 16.869051 69.036849 16.789259 69.083786 16.812727 69.095520 16.887826 69.111948 16.977005 69.135416 17.033329 69.170619 16.991086 69.172965 16.944150 69.194087 # -b 18.244296 69.693963 18.347557 69.686922 18.380413 69.691616 18.464899 69.691616 18.511835 69.710391 18.544691 69.783143 18.633871 69.729165 18.685501 69.729165 18.741825 69.797224 18.741825 69.855894 18.920185 69.815998 18.985896 69.766715 18.920185 69.722125 18.831005 69.656413 18.821618 69.602436 18.699582 69.576621 18.521223 69.557846 18.366332 69.541419 18.244296 69.550806 18.080018 69.569581 18.094099 69.600089 18.225522 69.595396 18.267765 69.625905 18.258377 69.654067 18.244296 69.693963 # -b 18.863861 70.020173 18.788762 69.989664 # -b 19.150175 70.031907 19.150175 69.994358 19.126706 69.952115 19.197111 69.952115 19.215886 69.987317 # -b 19.347309 70.006092 19.436489 69.989664 19.567911 69.975583 19.525668 69.938034 19.427101 69.881710 19.347309 69.827732 19.215886 69.797224 19.126706 69.820692 18.995284 69.865282 18.840392 69.900484 18.798149 69.952115 18.873248 69.930993 18.887329 69.975583 # -b 18.087058 63.012523 18.087058 63.007830 18.105833 63.007830 18.227868 62.989055 18.293580 62.963240 18.251337 62.937424 18.218481 62.918650 18.195013 62.852938 18.072977 62.883447 17.974410 62.801308 17.908699 62.791921 17.852375 62.817736 17.744420 62.852938 17.711565 62.892835 17.702177 62.932731 17.688096 62.862326 17.767889 62.770799 17.753808 62.700394 17.720952 62.634683 17.744420 62.608868 17.735033 62.585399 17.622385 62.507954 17.547286 62.489179 17.533205 62.463364 17.359539 62.512647 17.237504 62.538463 17.228117 62.416427 17.279747 62.346022 17.411170 62.263883 17.392395 62.216946 17.312603 62.113685 17.270360 62.005731 17.237504 61.932979 17.270360 61.829718 17.312603 61.745232 17.303215 61.672480 17.204648 61.698296 17.026289 61.745232 17.049757 61.693602 16.993433 61.625544 16.974658 61.562179 17.007514 61.489427 17.007514 61.435450 17.040370 61.367392 17.026289 61.292293 17.014555 61.207807 17.047410 61.076384 17.070879 60.963736 17.136590 60.883944 17.124856 60.792417 17.059145 60.722012 17.214036 60.705584 17.214036 60.592936 17.157712 60.506103 16.993433 60.433351 16.850276 60.362946 16.674264 60.325397 16.507638 60.243258 16.287036 60.222136 16.132145 60.165812 16.265914 60.144691 16.486517 60.177546 16.650795 60.177546 16.772831 60.222136 16.927722 60.287848 17.103734 60.353559 17.246891 60.449779 17.300869 60.531918 17.368927 60.618751 17.368927 60.656301 17.434638 60.651607 17.467494 60.607017 17.554327 60.553040 17.709218 60.576508 17.864109 60.576508 17.941555 60.489675 17.962676 60.400496 18.129301 60.353559 18.359291 60.308969 18.371025 60.276113 18.227868 60.271420 18.293580 60.231524 18.394494 60.139997 18.624484 60.055511 # -b 19.962180 60.391108 19.828410 60.407536 19.774433 60.433351 19.664132 60.391108 19.729843 60.346519 19.718109 60.287848 19.607808 60.304275 19.586686 60.222136 19.607808 60.139997 19.718109 60.128263 19.851878 60.100101 19.983301 60.025002 # -b 20.049013 60.090713 19.929324 60.123569 19.884734 60.198668 19.983301 60.222136 # -b 20.016157 60.346519 19.983301 60.369987 19.962180 60.391108 # -b 7.547422 63.010176 7.547422 63.024257 7.561503 63.068847 7.594358 63.125171 7.692926 63.143946 7.735169 63.160374 7.791493 63.165067 7.857204 63.179149 7.922915 63.183842 7.969852 63.174455 8.021482 63.179149 8.044951 63.200270 8.035563 63.237819 8.077807 63.273022 8.157599 63.282409 8.190455 63.244860 8.176374 63.214351 8.265553 63.209657 8.340652 63.219045 8.378201 63.249554 8.340652 63.308224 8.387589 63.308224 8.462687 63.303531 8.519012 63.352814 8.542480 63.392711 8.608191 63.430260 8.706758 63.451381 8.805325 63.470156 8.861649 63.470156 8.969604 63.505359 9.105720 63.524133 9.138576 63.474850 9.138576 63.406792 9.213675 63.352814 9.424890 63.406792 9.392034 63.446688 9.293467 63.486584 9.293467 63.505359 9.302854 63.545255 9.359178 63.564029 9.424890 63.599232 9.556313 63.608619 9.612637 63.646169 9.711204 63.650862 9.786302 63.613313 9.866095 63.549948 9.941194 63.491278 9.950581 63.446688 9.941194 63.411485 # -b 10.039761 63.578110 9.917725 63.676678 9.964662 63.754123 # -b 10.006905 63.798713 9.800383 63.758817 9.697123 63.798713 9.711204 63.880852 9.931806 63.923095 # -b 8.450953 63.568723 8.526052 63.573417 8.540133 63.599232 8.648087 63.592191 8.713799 63.622700 8.737267 63.657903 8.849915 63.681371 8.957870 63.700146 9.122148 63.700146 9.089292 63.667290 9.169085 63.636781 9.201941 63.582804 9.023581 63.559336 8.802979 63.533521 8.591763 63.474850 8.493196 63.524133 8.450953 63.568723 # -b 4.933047 61.130361 4.944782 61.151483 4.900192 61.120974 4.846215 61.099853 4.822746 61.088118 4.780503 61.062303 4.780503 61.041182 4.768769 61.029448 4.757035 61.003632 4.768769 60.987204 4.801625 60.987204 4.846215 60.991898 4.890804 61.008326 4.900192 61.034141 4.933047 61.092812 4.933047 61.130361 # -b 5.001106 60.670382 5.066817 60.778336 5.043349 60.778336 4.989371 60.778336 4.965903 60.750174 4.965903 60.712625 4.989371 60.675075 4.989371 60.675075 5.001106 60.670382 # -b 5.949227 59.989800 6.080650 60.083673 6.277784 60.139997 6.268397 60.165812 6.158095 60.210402 6.334108 60.308969 6.498386 60.440392 6.587566 60.428658 6.620422 60.325397 6.665012 60.386415 6.697867 60.477941 6.984181 60.548346 6.819903 60.564774 6.599300 60.531918 6.587566 60.569468 6.498386 60.614058 6.322374 60.543653 6.134627 60.362946 5.958614 60.247951 5.803723 60.193974 5.794336 60.083673 # -b 5.407108 59.956944 5.407108 60.001534 5.561999 60.062551 5.705156 60.074286 5.651179 60.128263 5.585468 60.172853 5.550265 60.193974 5.550265 60.276113 5.439964 60.210402 5.320275 60.165812 5.275685 60.226830 5.186506 60.276113 5.153650 60.346519 5.242830 60.400496 5.385987 60.440392 5.439964 60.456820 5.374252 60.494369 5.451698 60.560081 5.695769 60.677422 5.540878 60.663341 5.296807 60.581202 5.177118 60.592936 5.001106 60.759561 5.001106 60.785377 5.001106 60.785377 5.033961 60.785377 5.055083 60.808845 5.165384 60.759561 5.320275 60.726706 5.320275 60.801805 5.308541 60.855782 5.242830 60.839354 5.066817 60.851088 5.087939 60.942615 5.132528 60.984858 5.186506 61.048222 5.364865 61.022407 5.529144 61.010673 5.684035 61.081078 5.860047 61.069344 6.036060 61.085772 6.235541 61.064650 6.477265 61.097506 6.665012 61.097506 6.841024 61.031794 6.897348 60.968430 6.897348 60.872210 7.106217 60.930880 7.150807 60.947308 7.028771 61.010673 7.061627 61.097506 7.380796 61.144442 7.645989 61.245356 7.547422 61.271172 7.425386 61.235969 7.315085 61.224235 7.347941 61.266478 7.380796 61.367392 7.458242 61.503508 7.446508 61.541058 7.331513 61.477693 7.315085 61.358004 7.279883 61.278212 7.080402 61.170258 7.014690 61.181992 6.981835 61.203113 6.859799 61.177298 6.650931 61.177298 6.552364 61.203113 6.606341 61.320455 6.573485 61.404941 6.418594 61.271172 6.352883 61.165564 6.144014 61.165564 6.021979 61.207807 5.867088 61.186685 5.637098 61.128015 5.470473 61.102199 5.294460 61.106893 5.184159 61.128015 5.184159 61.191379 5.106713 61.224235 5.118447 61.287599 5.163037 61.325149 5.118447 61.383820 5.179465 61.463612 5.228749 61.498815 5.224055 61.524630 5.224055 61.557485 5.235789 61.613809 5.174771 61.625544 5.097326 61.656053 5.109060 61.719417 5.130182 61.735845 5.195893 61.731151 5.202933 61.778088 5.306194 61.855533 5.362518 61.855533 5.416495 61.817984 5.489247 61.817984 5.559652 61.817984 5.698116 61.834412 5.784949 61.886042 5.763827 61.907164 5.681688 61.881349 5.576080 61.876655 5.547918 61.902470 5.625364 61.942366 5.693422 61.975222 5.641792 61.968182 5.571387 61.949407 5.522103 61.932979 5.461085 61.916551 5.404761 61.916551 5.350784 61.923592 5.268645 61.916551 5.207627 61.916551 5.191199 61.942366 5.228749 61.989303 5.207627 62.052668 5.167731 62.118379 5.207627 62.148888 5.273339 62.104298 5.350784 62.040933 5.339050 62.087870 5.346090 62.139501 5.416495 62.134807 5.465779 62.134807 5.538531 62.160622 5.571387 62.092564 5.604242 62.062055 5.653526 62.040933 5.641792 62.097258 5.592508 62.144194 5.608936 62.174703 5.625364 62.226333 5.674647 62.294392 5.759133 62.346022 5.803723 62.294392 5.841273 62.174703 5.874128 62.186437 5.857700 62.252149 5.836579 62.320207 5.829538 62.381225 5.862394 62.416427 5.895250 62.468057 5.874128 62.468057 5.845966 62.442242 5.780255 62.437549 5.775561 62.482138 5.829538 62.493873 5.829538 62.503260 5.775561 62.524382 5.763827 62.543156 5.820151 62.585399 5.878822 62.573665 5.923412 62.608868 5.984430 62.615908 6.066569 62.599480 6.122893 62.604174 6.200338 62.585399 6.277784 62.590093 6.348189 62.554890 6.320027 62.608868 6.343495 62.646417 6.381045 62.676926 6.331761 62.700394 6.320027 62.721516 6.294212 62.756718 6.193298 62.726209 6.106465 62.747331 6.155749 62.796614 6.115852 62.827123 6.066569 62.852938 6.082997 62.906916 6.167483 62.967933 6.254316 62.958546 6.327068 62.918650 6.364617 63.010176 # -b 5.892903 62.238068 5.902290 62.252149 5.982083 62.308473 6.014938 62.350716 5.982083 62.381225 5.860047 62.395306 5.813111 62.364797 5.813111 62.308473 5.813111 62.268576 5.827192 62.238068 5.845966 62.233374 5.892903 62.238068 # -b 5.001106 61.761660 5.033961 61.796863 5.132528 61.825025 5.141916 61.850840 5.033961 61.864921 5.001106 61.876655 5.001106 61.881349 5.001106 61.829718 5.001106 61.796863 # -b -8.382895 71.076249 -8.514318 71.015231 -8.749001 70.963601 -8.955523 70.916664 -9.101027 70.853299 -9.101027 70.822791 -8.936748 70.848606 -8.856956 70.900236 -8.462687 70.961254 -8.185761 70.984722 -8.021482 71.069208 -7.998014 71.125532 -7.965158 71.160735 -8.030870 71.163082 -8.209229 71.158388 -8.382895 71.076249 # -b -17.746767 79.200992 -17.643506 79.210379 -17.587182 79.177524 -17.521471 79.135281 -17.540246 79.109465 -17.643506 79.090691 -17.605957 79.055488 -17.662281 79.027326 -17.812479 79.041407 -17.878190 78.999164 -17.962676 78.999164 -18.000225 79.057835 -17.981451 79.114159 -17.878190 79.158749 -17.746767 79.200992 # -b -17.735033 77.900845 -17.706871 77.896152 -17.650547 77.893805 -17.537899 77.844521 -17.575448 77.790544 -17.631772 77.713098 -17.772582 77.663815 -18.007266 77.638000 -18.091752 77.642693 -18.091752 77.727179 -17.950942 77.804625 -17.866456 77.877377 -17.735033 77.900845 # -b -20.072481 79.771273 -19.912896 79.794741 # -b -20.006769 79.923817 -19.781473 79.980141 # -b -17.514431 80.012997 -17.589529 79.984835 -17.645853 79.937898 -17.833600 79.874534 -17.861762 79.827597 -18.030734 79.768926 -18.115220 79.750151 -18.584587 79.724336 -18.772334 79.743111 -19.082116 79.764232 -19.213539 79.761886 -19.279251 79.747805 -19.373124 79.738417 -19.560871 79.665665 -19.598420 79.602301 -19.654744 79.524855 -19.654744 79.501387 -19.739230 79.438022 -19.626582 79.409860 -19.664132 79.360577 -19.692294 79.311293 -19.861266 79.222113 -19.851878 79.142321 -19.664132 79.231501 -19.598420 79.308946 -19.307413 79.308946 -19.100891 79.297212 -19.213539 79.212726 -19.288638 79.184564 -19.279251 79.250275 -19.466997 79.238541 -19.598420 79.184564 -19.589033 79.107119 -19.664132 79.100078 -19.682906 79.125893 -19.880040 79.093038 -19.945752 79.109465 -19.945752 79.015592 -19.898815 78.952227 -19.880040 78.888863 # -b -20.095949 77.814012 -19.626582 77.776463 -19.241701 77.734220 -19.053954 77.682590 -19.025792 77.598104 -19.288638 77.565248 -19.542096 77.612185 -19.851878 77.689630 # -b -20.006769 77.365767 -19.772086 77.368114 -19.396592 77.309443 -19.377818 77.234344 -19.143134 77.222610 -19.030486 77.231997 -19.049261 77.314136 -18.870901 77.358726 -18.720704 77.325871 -18.467246 77.293015 -18.335823 77.307096 -18.288886 77.297709 -18.279499 77.271893 -18.241949 77.185061 -18.204400 77.102921 -18.195013 77.044250 -18.204400 77.004354 -18.204400 76.999661 -18.204400 76.985580 # -b -18.197360 76.985580 -18.197360 76.985580 -18.206747 76.980886 -18.206747 76.938643 -18.253684 76.889359 -18.253684 76.858850 -18.385106 76.811914 -18.469592 76.776711 -18.610403 76.776711 -18.892023 76.814261 -19.239354 76.837729 -19.455263 76.861197 -19.746271 76.901094 # -b -20.215638 76.215818 -19.943405 76.199390 -19.858919 76.138372 -19.802595 76.084395 -19.811982 76.035111 # -b -20.084215 75.887261 -19.840144 75.819203 -19.624235 75.730023 -19.577299 75.706554 -19.572605 75.575132 -19.483425 75.417894 -19.483425 75.274737 -19.614848 75.131580 -19.661785 75.119846 -19.769739 75.112805 # -b -20.206250 74.631704 -19.943405 74.580074 -19.722802 74.608236 -19.520975 74.643438 -19.389552 74.544871 -19.192418 74.479160 -19.136094 74.406408 -19.300372 74.331309 -19.619542 74.216314 # -b -18.748866 76.502132 -18.748866 76.523253 -18.748866 76.394177 -18.739479 76.267448 -18.730091 76.145413 -18.664380 76.032765 -18.664380 75.929504 -18.720704 75.971747 -18.767641 76.044499 -18.786415 76.131332 -18.870901 76.239286 -18.889676 76.328466 -19.030486 76.396524 -19.068035 76.427033 -19.124359 76.490397 -19.143134 76.539681 -18.936613 76.558456 -18.852127 76.579577 -19.002324 76.586618 -19.049261 76.685185 -19.030486 76.722734 -18.852127 76.647635 -18.748866 76.577230 -18.748866 76.502132 # -b -17.976757 75.300552 -17.967370 75.267696 -18.155117 75.234841 -18.187972 75.194944 -18.145729 75.155048 -18.089405 75.136273 -17.957982 75.072909 -17.756155 75.072909 -17.648200 75.122192 -17.493309 75.133927 -17.469841 75.051787 -17.526165 74.986076 -17.648200 74.925058 -17.835947 74.976689 -17.990838 75.004851 -18.220828 74.976689 -18.385106 74.969648 -18.497754 74.957914 -18.671420 74.983729 -18.882635 74.976689 -18.938959 75.068215 -18.924878 75.122192 -18.915491 75.178517 -18.892023 75.239534 -18.948347 75.281777 -18.906104 75.319327 -18.718357 75.338101 -18.586934 75.342795 -18.464899 75.293511 -18.253684 75.314633 -18.187972 75.380344 -18.065937 75.387385 -18.009613 75.321673 -17.976757 75.300552 # -b -20.525420 80.012997 -20.431547 79.977794 -20.440934 79.940245 -20.609906 79.848718 -20.431547 79.836984 -20.356448 79.797088 -20.253187 79.750151 -20.065440 79.771273 # -b -19.908202 79.794741 -20.133499 79.801782 -20.133499 79.853412 -20.002076 79.923817 # -b -19.884734 78.888863 -20.213291 78.820805 -20.551235 78.846620 -20.729595 78.820805 -20.907954 78.785602 -21.067539 78.799683 -21.133250 78.771521 -21.076926 78.741012 -21.067539 78.684688 -21.095701 78.642445 -21.330384 78.635405 -21.255286 78.604896 -20.954891 78.609589 -21.058152 78.560306 -21.133250 78.494595 -21.292835 78.388987 -21.330384 78.264605 -21.414871 78.149610 -21.649554 78.114407 -21.330384 78.097979 -21.377321 78.058083 -21.612005 77.992372 -21.809139 77.882071 -21.668329 77.929007 -21.705878 77.835134 -21.893625 77.731873 -21.734040 77.659121 -21.489969 77.663815 -21.349159 77.752995 -21.198962 77.830440 -21.001828 77.931354 -20.804693 77.968903 -20.626334 77.938395 -20.598172 77.886764 -20.307164 77.842174 -20.100643 77.814012 # -b -19.851878 77.689630 -20.311858 77.691977 -20.602866 77.720139 -20.659190 77.689630 -20.781225 77.652081 -20.715514 77.621572 -20.415119 77.574635 -20.217985 77.537086 -20.508992 77.539433 -20.527767 77.520658 -20.508992 77.494843 -20.696739 77.487802 -20.274309 77.443212 -20.227372 77.403316 -20.602866 77.386888 -20.283696 77.370461 -20.002076 77.365767 # -b -19.753311 76.901094 -20.175742 76.919868 -20.494911 76.940990 -20.907954 76.945683 -21.161412 76.943337 -21.489969 76.948030 -21.715265 76.950377 -21.424258 76.924562 -21.142638 76.917521 -20.757757 76.896400 -20.701433 76.879972 -20.889179 76.847116 -21.198962 76.865891 -21.565068 76.868238 -21.677716 76.842423 -21.292835 76.814261 -21.039377 76.797833 -20.851630 76.793139 -21.123863 76.769671 -21.274060 76.757937 -21.433645 76.696919 -21.649554 76.647635 -21.752815 76.638248 -21.921787 76.720387 -22.137696 76.790792 -22.447478 76.772018 -22.456865 76.725081 -22.719711 76.682838 -22.644612 76.626514 -22.531964 76.577230 -22.531964 76.516213 -22.372379 76.574883 -22.250344 76.567843 -22.147083 76.513866 -21.865463 76.492744 -22.006273 76.450501 -21.827914 76.419992 -22.250344 76.438767 -22.466253 76.448154 -22.616450 76.422339 -22.316055 76.387137 -21.949949 76.384790 -21.705878 76.396524 -21.668329 76.370709 -21.649554 76.347240 -21.687103 76.328466 -21.687103 76.267448 -21.705878 76.220511 -21.583843 76.218164 -21.480582 76.215818 -21.424258 76.175921 -21.142638 76.154800 -21.264673 76.241633 -21.095701 76.213471 -20.870405 76.143066 -20.654496 76.133678 -20.851630 76.213471 -21.058152 76.279182 -20.861017 76.234592 -20.579397 76.192349 -20.222678 76.215818 # -b -19.819023 76.035111 -20.072481 76.028071 -20.297777 75.990521 -20.438587 75.988175 -20.616947 75.974094 -21.067539 75.978787 -21.076926 75.943585 -20.729595 75.929504 -20.504299 75.887261 -20.325939 75.875527 -20.222678 75.877873 -20.091256 75.887261 # -b -19.774433 75.112805 -20.018504 75.148008 -20.074828 75.248922 -20.215638 75.314633 -21.928827 75.544623 -21.961683 75.554010 -21.914746 75.546970 -21.661288 75.490646 -21.553334 75.450749 -21.881891 75.460137 -22.168205 75.462484 -21.938215 75.413200 -21.520478 75.403813 -21.267020 75.319327 -20.980706 75.244228 -20.703780 75.190251 -20.656843 75.112805 -20.900914 75.122192 -21.374974 75.070562 -21.628433 74.976689 -21.398443 74.995463 -21.121516 75.049441 -20.900914 75.037706 -20.769491 75.000157 -20.778878 74.932099 -20.825815 74.838225 -20.802347 74.758433 -20.858671 74.683334 -21.055805 74.659866 -21.065192 74.659866 -21.055805 74.641091 -20.943157 74.634051 -20.722554 74.655172 -20.525420 74.645785 -20.206250 74.631704 # -b -19.619542 74.216314 -20.098296 74.244476 -20.262575 74.319575 -20.384610 74.418142 -20.614600 74.450998 -20.900914 74.441610 -21.267020 74.465079 -21.741081 74.450998 -21.905359 74.504975 -22.116574 74.526096 -22.027395 74.418142 -21.994539 74.343043 -22.201060 74.307841 -22.567167 74.274985 -22.191673 74.263251 -22.168205 74.202233 -22.280853 74.171724 -22.370032 74.141215 -22.332483 74.077851 -22.445131 74.068464 -22.468600 74.028567 -22.135349 73.995712 -21.708225 74.026220 -21.506397 73.965203 -21.318650 73.946428 -21.234164 73.927653 -21.210696 73.922960 -20.933769 73.904185 -20.623987 73.873676 -20.403385 73.831433 -20.417466 73.789190 -20.572357 73.704704 -20.591131 73.617871 -20.591131 73.549813 -20.539501 73.491142 -20.703780 73.446552 -21.121516 73.444205 -21.473541 73.479408 -21.694144 73.411350 -21.806792 73.371453 -22.116574 73.333904 -22.215141 73.251765 -22.468600 73.244724 -22.787769 73.289314 -23.083470 73.324517 -23.416721 73.409003 -23.745278 73.502876 -24.045673 73.617871 -24.097303 73.756334 -24.266275 73.765722 -24.388311 73.751641 -24.439941 73.739907 -24.472797 73.667155 -24.505652 73.549813 -24.693399 73.561547 -24.960938 73.617871 -25.036037 73.634299 -24.960938 73.526345 -24.895227 73.474714 -25.200316 73.437165 -25.411531 73.397269 -25.542954 73.331557 -25.707232 73.279927 -25.918447 73.225950 -26.270472 73.228297 -26.547399 73.312783 -26.744533 73.303395 -26.955748 73.286967 -26.523931 73.232990 -26.692903 73.176666 -27.021460 73.136770 -26.866569 73.089833 -26.603723 73.146157 -26.171905 73.176666 -25.862123 73.134423 -25.655602 73.066365 -25.256640 73.054631 -25.059506 73.019428 -25.181541 72.953717 -25.289495 72.897393 -25.622746 72.866884 -25.876204 72.812907 -26.218842 72.780051 -26.523931 72.796479 -26.758614 72.798826 -26.589642 72.747195 -26.725758 72.728421 -26.866569 72.681484 -26.472300 72.707299 -26.472300 72.604038 -26.425364 72.606385 -26.171905 72.690871 -25.810493 72.773011 -25.524179 72.791785 -25.223784 72.730767 -24.881146 72.672097 -24.829516 72.559449 -24.829516 72.477309 -25.115830 72.437413 -25.599278 72.418638 -25.622746 72.374049 -25.411531 72.355274 -25.477242 72.252013 -25.566422 72.162833 -25.566422 72.083041 -25.411531 72.169874 -25.336432 72.284869 -25.200316 72.362314 -24.904614 72.418638 -24.716868 72.404557 -24.538508 72.355274 -24.308518 72.303643 -24.120771 72.261400 -24.045673 72.237932 -23.979961 72.214464 -23.867313 72.174568 -23.834458 72.115897 -23.571612 72.097122 -23.304073 72.054879 -23.238361 71.979780 -23.083470 71.968046 -22.787769 71.932844 -22.632878 71.902335 -22.773688 71.829583 -22.830012 71.773259 -23.050615 71.693466 -23.205506 71.571431 -23.116326 71.583165 -23.106939 71.585512 -23.083470 71.590206 -23.041227 71.606633 -22.909805 71.681732 -22.534311 71.766218 -22.543698 71.679385 -22.689202 71.569084 -22.576554 71.592552 -22.412275 71.672345 -22.280853 71.709894 -22.102493 71.709894 -22.191673 71.623061 -22.332483 71.562044 -22.600022 71.442355 -22.609410 71.271036 -22.468600 71.285117 -22.332483 71.432968 -22.201060 71.418887 -21.947602 71.498679 -21.806792 71.477558 -21.825567 71.364909 -21.825567 71.313279 -21.914746 71.271036 -21.858422 71.195937 -21.872503 71.177163 -21.895972 71.097370 -22.135349 71.050434 -21.914746 71.057474 -21.816179 70.994109 -21.858422 70.949520 -21.806792 70.841565 -21.905359 70.806363 -21.839648 70.752385 -21.773936 70.696061 -21.783324 70.656165 -21.792711 70.590454 -21.637820 70.574026 -21.661288 70.459031 -21.928827 70.423829 -22.060250 70.503621 -22.355951 70.482499 -22.445131 70.623310 -22.477987 70.801669 -22.600022 70.808710 -22.656346 70.696061 -22.665734 70.569332 -22.665734 70.440256 -23.041227 70.414441 -23.491820 70.477806 -23.867313 70.581067 -24.120771 70.733611 -24.242807 70.926051 -24.275663 71.062168 -24.571364 71.172469 -24.651156 71.280423 -24.782579 71.322666 -25.134604 71.313279 -25.434999 71.428274 -25.796412 71.536228 -26.148437 71.562044 -26.401895 71.608980 -26.636579 71.557350 -26.946361 71.576125 -27.242062 71.709894 -27.683267 71.806114 -27.650411 71.721628 -27.561232 71.641836 -27.838158 71.616021 -27.509601 71.578471 -27.307774 71.536228 -27.354710 71.463477 -27.030847 71.512760 -26.669434 71.454089 -26.369040 71.477558 -25.909060 71.461130 -25.641521 71.362563 -25.608665 71.210018 -25.894979 71.271036 -25.777637 71.167775 -26.031095 71.076249 -26.303328 71.015231 -26.678822 70.949520 -27.087171 70.940132 -27.439196 70.947173 -27.725510 71.043393 -27.763060 70.921358 -27.946113 70.956560 -28.279363 70.942479 -28.335687 70.893196 -28.091616 70.785241 -28.246508 70.623310 -28.410786 70.548211 -28.631389 70.508315 -28.983414 70.459031 -28.687713 70.451991 -28.476497 70.386279 -27.960194 70.374545 -27.462665 70.398013 -26.997991 70.426175 -26.702290 70.412094 -26.570867 70.334649 -26.824326 70.290059 -27.176351 70.278325 -27.406341 70.207920 -27.716123 70.132821 -28.002437 70.088231 -28.312219 70.137515 -28.654857 70.038948 -28.424867 70.027213 -28.002437 70.006092 -27.692655 70.008439 -27.373485 70.001398 -27.199819 70.163330 -26.777389 70.226694 -26.425364 70.177411 -26.162518 70.247816 -25.876204 70.292406 -25.477242 70.367505 -25.369288 70.285365 -25.181541 70.329955 -24.993794 70.348730 -25.003181 70.271284 -24.881146 70.290059 -24.496265 70.214960 -24.097303 70.163330 -23.810989 70.102312 -23.557531 70.102312 -23.163263 70.069456 -22.876949 70.062416 -22.590635 70.069456 -22.313708 70.114046 -22.149430 70.139861 # -b -22.147083 70.139861 -22.100146 70.139861 -22.133002 70.102312 -22.189326 70.050682 # -b -21.759855 74.361818 -21.971070 74.277332 -22.003926 74.195193 -21.849035 74.155296 -21.417217 74.122441 -21.210696 74.082545 -20.924382 74.103666 -20.614600 74.122441 -20.318899 74.134175 -20.206250 74.197539 -20.469096 74.244476 -20.483177 74.333656 -20.581744 74.394674 -20.980706 74.413448 -21.299876 74.432223 -21.562721 74.408755 -21.759855 74.361818 # -b -25.641521 73.207175 -25.688457 73.120342 -25.336432 73.092180 -24.937470 73.071059 -24.618301 73.024122 -24.341374 73.005347 -24.097303 73.014735 -23.890782 73.049937 -23.637323 73.064018 -23.271217 73.071059 -23.041227 73.099221 -22.994291 73.150851 -23.247749 73.169626 -23.623242 73.169626 -23.965880 73.188400 -24.299131 73.223603 -24.651156 73.261152 -24.895227 73.286967 -24.740336 73.282274 -24.364842 73.289314 -24.177095 73.258805 -23.900169 73.218909 -23.637323 73.216562 -23.383865 73.197788 -23.383865 73.244724 -23.524675 73.277580 -23.778134 73.308089 -23.965880 73.343291 -24.285050 73.378494 -24.726255 73.387881 -24.928083 73.399615 -25.082974 73.409003 -25.270721 73.352679 -25.420918 73.289314 -25.542954 73.232990 -25.641521 73.207175 # -b -22.036782 72.871578 -22.224529 72.831681 -22.247997 72.796479 -22.149430 72.747195 -22.027395 72.711993 -22.093106 72.714340 -22.266772 72.690871 -22.435744 72.711993 -22.576554 72.704952 -22.698589 72.714340 -22.707977 72.744848 -22.820625 72.782398 -22.942660 72.824641 -23.041227 72.848109 -23.271217 72.859843 -23.435496 72.864537 -23.670179 72.859843 -23.867313 72.880965 -24.153627 72.897393 -24.299131 72.899740 -24.571364 72.909127 -24.641769 72.960757 -24.430554 72.974838 -24.177095 72.984226 -23.810989 73.005347 -23.571612 73.014735 -23.318154 73.035856 -23.116326 73.005347 -22.895724 73.010041 -22.675121 72.974838 -22.501455 72.977185 -22.323096 72.941983 -22.201060 72.927902 -22.046169 72.899740 -22.036782 72.871578 # -b -23.062349 72.721380 -22.827665 72.622813 -22.409929 72.573530 -22.231569 72.493737 -22.067291 72.503124 -22.001579 72.385783 -22.198713 72.395170 -22.330136 72.423332 -22.630531 72.428026 -22.794810 72.367008 -22.550739 72.322418 -22.409929 72.256707 -22.222182 72.247319 -22.231569 72.200383 -22.231569 72.113550 -22.353605 72.099469 -22.550739 72.144059 -22.564820 72.205076 -22.794810 72.167527 -22.973169 72.244973 -23.193772 72.331806 -23.569265 72.397517 -23.789868 72.418638 -23.996389 72.458535 -24.132506 72.533633 -24.263928 72.554755 -24.385964 72.592304 -24.404739 72.655669 -24.493918 72.688524 -24.493918 72.728421 -24.536161 72.808213 -24.569017 72.831681 -24.451675 72.855150 -24.306171 72.866884 -24.141893 72.859843 -23.921290 72.845762 -23.667832 72.824641 -23.512941 72.845762 -23.367437 72.822294 -23.203159 72.791785 -23.062349 72.721380 # -b -25.453774 70.862687 -25.444386 70.768813 -25.444386 70.745345 -25.388062 70.635044 -25.453774 70.609229 -25.622746 70.581067 -25.819880 70.574026 -25.951303 70.588107 -26.017014 70.534130 -26.139050 70.541170 -26.369040 70.566985 -26.669434 70.522396 -26.946361 70.510661 -27.218594 70.477806 -27.495520 70.456684 -27.650411 70.456684 -27.894482 70.433216 -28.068148 70.444950 -28.058761 70.496580 -28.049373 70.550558 -28.002437 70.623310 -27.626943 70.705449 -27.232675 70.808710 -27.152882 70.848606 -26.890037 70.874421 -26.415976 70.914317 -26.162518 70.994109 -25.909060 71.043393 -25.829267 71.001150 -25.688457 70.954213 -25.524179 70.916664 -25.453774 70.862687 # -b -50.433487 69.907525 -50.391244 70.006092 # -b -50.963872 69.989664 -51.062439 70.027213 -51.339365 70.043641 -51.494256 70.001398 -51.813426 70.024867 -52.386054 70.069456 -52.817871 70.245469 -53.413968 70.334649 -53.911497 70.386279 -54.183729 70.524742 -54.493512 70.679634 -54.263522 70.785241 -53.963127 70.799322 -53.634570 70.775854 -53.216833 70.754732 -52.817871 70.745345 -52.418909 70.660859 -52.034028 70.548211 -51.672616 70.433216 -51.184474 70.367505 -50.654089 70.329955 -50.611846 70.405054 -50.686945 70.473112 -51.043664 70.426175 -51.207943 70.491887 -51.264267 70.588107 -50.963872 70.548211 -51.029583 70.606882 -50.808981 70.616269 -50.808981 70.667899 -51.095294 70.728917 -50.701026 70.681980 -50.808981 70.773507 -51.053051 70.869727 -51.315897 70.895542 -51.625679 70.949520 -51.902606 71.050434 -51.395689 70.975335 -51.339365 71.022272 -51.470788 71.069208 -51.395689 71.146654 -51.822813 71.125532 -52.188920 71.113798 -51.935461 71.228793 -51.672616 71.327360 -52.001173 71.263996 -52.531558 71.153694 -52.353198 71.252261 -52.264018 71.364909 -51.902606 71.440008 -52.498702 71.376644 -52.996231 71.400112 -52.775628 71.493985 -52.109127 71.564390 -51.869750 71.665304 -52.597269 71.623061 -52.775628 71.630102 -52.761547 71.648876 -52.874195 71.665304 -53.127654 71.693466 -53.104185 71.773259 -52.939907 71.895294 -53.235608 71.799074 -53.423355 71.899988 -53.545390 71.993861 -53.568859 71.820195 -53.873947 71.754484 -53.831704 71.695813 -53.953740 71.648876 -54.094550 71.688773 -54.174342 71.620714 -53.986595 71.550309 -54.010064 71.449395 -54.535755 71.355522 -54.901861 71.393071 -55.178788 71.484598 -55.366534 71.404806 -55.662236 71.583165 -55.751415 71.674692 -55.573056 71.761525 -55.263274 71.806114 -55.047365 71.895294 -54.812681 71.970393 -55.230418 71.923456 -55.540200 72.024370 -55.286742 72.061919 -55.023896 72.169874 -54.934717 72.221504 -54.869005 72.310684 -54.746970 72.355274 -54.826762 72.442107 -54.648403 72.465575 -54.690646 72.550061 -54.714114 72.646281 -54.690646 72.721380 -54.582691 72.749542 -54.559223 72.850456 -54.704727 72.941983 -55.047365 72.995960 -55.319598 73.019428 -55.638767 73.045243 -55.474489 73.085140 -55.385309 73.155545 -55.197562 73.190747 -55.399390 73.244724 -55.352453 73.305742 -55.277355 73.352679 -55.131851 73.397269 -55.451020 73.343291 -55.596524 73.336251 -55.563669 73.369107 -55.497957 73.446552 -55.521425 73.502876 -55.563669 73.533385 -55.662236 73.542772 -55.859370 73.589709 -55.995486 73.622565 -56.004874 73.664808 -55.972018 73.721132 -55.793658 73.695317 -55.817127 73.732866 -55.760803 73.836127 -55.892225 73.883064 -56.112828 73.941734 -55.962630 74.002752 -56.079972 74.044995 -56.300575 74.030914 -56.248944 74.150603 -56.248944 74.157643 -56.183233 74.249170 -56.225476 74.274985 -56.413223 74.296107 -56.643213 74.331309 -56.225476 74.331309 -56.281800 74.408755 -56.488322 74.397020 -56.821572 74.422836 -56.380367 74.455691 -56.248944 74.481506 -56.446079 74.549565 -56.568114 74.608236 -56.765248 74.669253 -57.018706 74.688028 -57.107886 74.746699 -57.042175 74.784248 -56.887284 74.819451 -56.920139 74.857000 -57.150129 74.892203 -57.319101 74.936792 -57.638271 74.988423 -57.910504 75.042400 -58.065395 75.108111 -58.121719 75.204332 -58.318853 75.293511 -58.300078 75.324020 -58.342321 75.389732 -58.530068 75.331061 -58.464357 75.396772 -58.285997 75.478911 -58.267223 75.528195 -58.342321 75.546970 -58.365790 75.603294 -58.398645 75.622068 -58.497212 75.664311 -58.562924 75.722982 -58.708428 75.697167 -58.783526 75.741757 -58.830463 75.746451 -58.891481 75.847365 -59.013516 75.776959 -59.135552 75.767572 -59.112083 75.877873 -59.140245 75.922463 -59.224731 75.913076 # -b -54.348008 70.327608 -54.216585 70.311180 -53.977208 70.264244 -53.643957 70.247816 -53.193365 70.177411 # -b -54.526367 69.970889 -54.756357 70.118740 -54.746970 70.238429 -54.516980 70.290059 -54.348008 70.327608 # -b -70.097618 70.806363 -69.942727 70.822791 # -b -70.142208 70.590454 -69.921606 70.696061 -69.813651 70.714836 -69.546112 70.738304 -69.339591 70.712489 -69.128376 70.656165 -69.086133 70.653818 -68.931241 70.635044 -68.720026 70.609229 -68.490036 70.566985 -68.475955 70.440256 -68.522892 70.355770 -68.565135 70.367505 -68.710639 70.437910 -68.818593 70.346383 -68.851449 70.301793 -69.128376 70.271284 -69.405302 70.226694 -69.668148 70.151596 -69.578968 70.102312 -69.358365 70.156289 -69.203474 70.156289 -68.940629 70.168024 -68.696558 70.170370 -68.696558 70.095272 -68.809206 70.031907 # -b -68.708292 69.930993 -68.562788 70.017826 -68.276474 70.095272 -68.309330 70.184451 -68.177907 70.278325 -67.825882 70.222001 -67.450388 70.031907 # -b -68.950016 77.264853 -68.978178 77.276587 -68.959403 77.278934 -68.856143 77.300055 -68.630847 77.318830 -68.508811 77.346992 -68.396163 77.384542 -68.161479 77.384542 -67.917409 77.391582 -67.682725 77.396276 -67.438654 77.396276 -67.241520 77.405663 -67.034999 77.396276 -66.781540 77.377501 -66.584406 77.346992 -66.462371 77.302402 -66.180751 77.278934 -65.936680 77.253119 -65.908518 77.224957 -66.171363 77.187407 -66.434209 77.166286 -66.687667 77.159245 -67.053773 77.187407 -67.372943 77.213223 -67.748436 77.231997 -68.114543 77.210876 -68.414938 77.215569 -68.649621 77.241385 -68.950016 77.264853 # -b -70.264244 77.227304 -69.963849 77.229650 -69.644679 77.220263 -69.231636 77.217916 -68.837368 77.192101 -68.612072 77.187407 -68.555748 77.185061 -68.508811 77.178020 -68.311677 77.168633 -68.227191 77.163939 -68.142705 77.168633 -67.954958 77.187407 -67.663950 77.199142 -67.316619 77.178020 -66.969287 77.152205 -66.593794 77.138124 -66.349723 77.107615 -66.180751 77.112309 -66.115039 77.156899 -65.795870 77.187407 -65.683222 77.217916 -65.655060 77.248425 -65.711384 77.271893 -66.011779 77.297709 -66.274624 77.335258 -66.377885 77.379848 -66.424821 77.426785 -66.274624 77.466681 -65.974229 77.459640 -65.824032 77.497190 -65.758320 77.567595 -65.824032 77.588716 -65.974229 77.607491 -66.011779 77.661468 -66.096265 77.701364 -66.359110 77.684936 -66.490533 77.635653 -66.621956 77.626266 -66.725216 77.656774 -66.462371 77.687283 -66.424821 77.734220 -66.612568 77.727179 -66.922351 77.663815 -67.175809 77.567595 -67.476204 77.553514 -67.663950 77.544126 -67.861085 77.546473 -68.227191 77.541779 -68.311677 77.607491 -68.555748 77.680243 -68.734107 77.668509 -68.602684 77.579329 -68.621459 77.520658 -69.025115 77.478415 -69.334897 77.485455 -69.644679 77.520658 # -b -70.118740 77.612185 -69.949768 77.630959 -69.621211 77.691977 -69.630598 77.727179 -69.996705 77.682590 # -b -70.109353 78.802030 -69.771408 78.811417 -69.574274 78.809070 -69.480401 78.827845 -69.433464 78.860701 -69.273879 78.874782 -69.086133 78.856007 -68.982872 78.853660 -68.954710 78.898250 -69.236330 78.914678 -69.339591 78.952227 -69.198781 78.987430 -69.020421 79.015592 -68.720026 79.055488 -68.466568 79.074263 -68.128624 79.081303 -67.912715 79.060182 -67.903328 79.095384 -67.678031 79.109465 -67.584158 79.125893 -67.462123 79.123546 -67.246214 79.147015 -67.114791 79.114159 -67.049080 79.081303 -66.964594 79.088344 -66.833171 79.111812 -66.664199 79.104772 -66.560938 79.097731 -66.495227 79.081303 -66.279318 79.083650 -66.204219 79.062529 -66.044634 79.088344 -65.978923 79.118853 -65.931986 79.161096 -65.781789 79.212726 -65.612817 79.266703 -65.509556 79.306600 -65.321809 79.337108 -65.256098 79.372311 -65.171612 79.407513 -65.021414 79.452103 -64.824280 79.491999 -64.843055 79.522508 -64.843055 79.578832 -64.918153 79.625769 -65.068351 79.675053 -65.237323 79.703215 -65.190386 79.754845 -65.124675 79.801782 -64.843055 79.785354 -64.570822 79.797088 -64.401850 79.841678 -64.505110 79.874534 -64.627146 79.916777 -64.833667 79.909736 -65.068351 79.940245 -64.880604 79.982488 # -b -65.497822 80.022384 -65.713730 79.984835 -65.985963 79.954326 -66.164323 79.989529 # -b -59.886539 75.913076 -60.205708 75.955319 -60.628139 76.049192 -60.665688 76.049192 -60.656301 76.016337 -60.665688 75.955319 -60.684463 75.992868 -60.806498 76.021030 -60.853435 76.063273 -60.909759 76.103170 -60.928534 76.107863 -61.069344 76.124291 -61.435450 76.133678 -61.726458 76.164187 -61.970528 76.180615 -62.101951 76.192349 -62.308473 76.199390 -62.430508 76.178268 -62.646417 76.201737 -62.815389 76.293263 -63.181495 76.312038 -63.406792 76.187656 -63.744736 76.112557 -63.904321 76.166534 -63.951257 76.192349 -63.960645 76.279182 -64.214103 76.241633 -64.430012 76.182962 -64.505110 76.114904 -64.645920 76.131332 -64.889991 76.103170 -65.077738 76.009296 -65.274872 75.971747 -65.584655 76.046846 -65.547105 76.159494 -65.425070 76.220511 -65.706690 76.241633 -65.960148 76.262754 -66.138508 76.178268 -66.204219 76.089089 -66.391966 76.096129 -66.654811 76.199390 -66.711135 76.215818 -66.927044 76.215818 -67.208664 76.121944 -66.908270 76.075008 -66.607875 75.964706 -66.298092 75.849711 -66.786234 75.903689 -67.227439 75.927157 -67.274376 75.929504 -67.584158 75.978787 -68.156786 76.013990 -68.513505 76.089089 -68.813900 76.152453 -69.011034 76.232245 -69.302041 76.295610 -69.527338 76.382443 -69.273879 76.457542 -68.860836 76.551415 -68.485343 76.551415 -68.166173 76.610086 -68.138011 76.671104 -68.560441 76.647635 -68.644928 76.645288 -68.926548 76.666410 -69.208168 76.668757 -69.480401 76.692225 -69.884056 76.734468 # -b -70.008439 76.833035 -69.830079 76.915175 -69.642332 76.987926 -69.764368 77.006701 -69.923953 76.929256 # -b -79.384045 76.969152 -79.158749 76.999661 -79.130587 77.016088 -79.083650 77.053638 -79.130587 77.091187 -79.271397 77.152205 -79.524855 77.163939 -79.844025 77.161592 # -b -80.254721 77.224957 -79.907389 77.229650 -79.588220 77.231997 -79.353536 77.229650 -79.147015 77.236691 -79.015592 77.290668 -78.865395 77.276587 -78.893557 77.250772 -78.884169 77.241385 -78.611936 77.278934 -78.349091 77.307096 -78.198893 77.370461 -78.095633 77.424438 -78.067471 77.487802 -78.086245 77.515964 -77.776463 77.541779 -77.757688 77.569942 -77.982984 77.626266 -78.114407 77.647387 -78.133182 77.684936 -78.086245 77.720139 -78.198893 77.783504 -78.330316 77.804625 -78.292767 77.809319 -78.292767 77.853909 -78.349091 77.896152 -78.349091 77.921967 -78.114407 77.896152 -77.832787 77.891458 -77.607491 77.882071 -77.447906 77.886764 -77.278934 77.891458 -77.156899 77.856255 -76.950377 77.863296 -76.790792 77.884417 -76.687532 77.921967 -76.556109 77.950129 -76.424686 77.971250 -76.133678 77.943088 -76.077354 77.912579 -76.002256 77.943088 -75.880220 77.978291 -75.805121 78.006453 -75.814509 78.020534 -75.767572 78.046349 -75.683086 78.076858 -75.795734 78.081552 -76.030418 78.088592 -76.208777 78.102673 -76.312038 78.097979 -76.509172 78.114407 -76.649982 78.114407 -76.884666 78.137876 -77.081800 78.149610 -77.034863 78.166038 -76.865891 78.191853 -76.762630 78.203587 -76.537334 78.196546 -76.387137 78.196546 -76.246327 78.182465 -75.955319 78.166038 -75.748797 78.140222 -75.683086 78.158997 -75.645537 78.182465 -75.607987 78.205934 -75.514114 78.245830 -75.373304 78.262258 -75.176170 78.281033 -75.138620 78.311541 -75.307592 78.370212 -75.542276 78.403068 -75.767572 78.414802 -75.983481 78.424190 -76.208777 78.459392 -76.452848 78.468779 -76.302651 78.489901 -76.002256 78.478167 -75.758185 78.480514 -75.542276 78.485207 -75.326367 78.492248 -75.110458 78.508676 -75.007198 78.539184 -74.857000 78.548572 -74.725577 78.576734 -74.857000 78.604896 -74.857000 78.644792 -74.810063 78.672954 -74.800676 78.672954 -74.791289 78.679995 -74.800676 78.703463 -74.800676 78.722238 -74.800676 78.741012 -74.828838 78.773868 -74.857000 78.811417 -75.054134 78.846620 -75.363916 78.874782 -75.570438 78.881822 -75.814509 78.872435 -76.086742 78.867741 -76.312038 78.863048 -76.302651 78.891210 -76.021030 78.909984 -75.880220 78.935800 -75.880220 78.954574 -75.955319 78.973349 -76.011643 78.989777 -76.124291 78.985083 -76.321425 78.978043 -76.537334 78.985083 -76.781405 78.987430 -77.081800 78.975696 -77.316483 78.973349 -77.560554 78.947534 -77.729526 78.902944 -77.860949 78.898250 -77.720139 78.952227 -77.663815 78.996817 -77.879724 79.001511 -77.917273 79.032020 -77.645040 79.024979 -77.476068 79.010898 -77.203835 79.017939 -76.931602 79.043754 -76.678144 79.055488 -76.358975 79.048448 -76.190002 79.048448 -76.190002 79.076610 -76.358975 79.097731 -76.612433 79.109465 -76.903440 79.118853 -77.231997 79.121200 -77.466681 79.121200 -77.776463 79.118853 -77.936048 79.139974 -77.682590 79.156402 -77.382195 79.161096 -77.185061 79.149362 -76.847116 79.161096 -76.640595 79.186911 -76.330813 79.177524 -76.021030 79.161096 -75.917770 79.130587 -75.936544 79.085997 -75.898995 79.062529 -75.842671 79.041407 -75.664311 79.020286 -75.448403 79.020286 -75.232494 79.008551 -74.950874 79.008551 -74.734965 78.994470 -74.594155 79.008551 -74.556605 79.043754 -74.575380 79.090691 -74.688028 79.111812 -74.828838 79.151708 -74.744352 79.179870 -74.622317 79.210379 -74.753739 79.233848 -75.054134 79.226807 -75.429628 79.226807 -75.617375 79.224460 -75.776959 79.219767 -75.964706 79.222113 -76.067967 79.250275 -76.236939 79.245582 -76.537334 79.238541 -76.865891 79.236194 -77.156899 79.226807 -77.372807 79.212726 -77.523005 79.196298 -77.635653 79.193951 -77.457293 79.222113 -77.438519 79.247929 -77.654428 79.269050 -77.832787 79.269050 -77.917273 79.283131 -77.982984 79.297212 -77.823400 79.313640 -77.691977 79.315987 -77.513617 79.313640 -77.222610 79.306600 -77.260159 79.344149 -77.325871 79.388739 -77.419744 79.409860 -77.288321 79.416901 -77.203835 79.398126 -77.119349 79.353536 -76.950377 79.332415 -76.725081 79.327721 -76.462235 79.325374 -76.302651 79.323027 -76.067967 79.318334 -76.002256 79.344149 -76.199390 79.384045 -76.246327 79.409860 -76.452848 79.416901 -76.753243 79.428635 -76.959764 79.447410 -77.147511 79.445063 -77.278934 79.484959 -77.147511 79.491999 -77.091187 79.487306 -77.006701 79.491999 -76.940990 79.489653 -76.725081 79.470878 -76.509172 79.470878 -76.283876 79.452103 -76.096129 79.412207 -75.955319 79.409860 -75.748797 79.381698 -75.485952 79.372311 -75.204332 79.365270 -75.072909 79.393432 -75.129233 79.447410 -74.997810 79.435675 -74.950874 79.430982 -74.922711 79.423941 -74.678641 79.423941 -74.387633 79.416901 -74.237436 79.461491 -74.256210 79.496693 -74.171724 79.489653 -74.087238 79.522508 -73.974590 79.480265 -73.692970 79.491999 -73.617871 79.545977 -73.636646 79.592913 -73.749294 79.660972 -73.786843 79.705561 -74.115400 79.710255 -74.443957 79.736070 -74.857000 79.743111 -74.791289 79.787701 -74.453344 79.801782 -74.256210 79.787701 -74.059076 79.761886 -73.758681 79.747805 -73.542772 79.745458 -73.589709 79.707908 -73.542772 79.665665 -73.383188 79.644544 -73.279927 79.637503 -73.082793 79.642197 -73.017081 79.644544 -73.017081 79.625769 -72.848109 79.635156 -72.594651 79.649237 -72.359968 79.649237 -72.162833 79.646891 # -b -72.160487 79.646891 -71.991514 79.675053 -71.775606 79.682093 -71.625408 79.719642 -71.503373 79.754845 -71.371950 79.808822 -71.531535 79.822903 -71.831930 79.815863 -71.794380 79.855759 -71.606633 79.905042 -71.231140 79.930858 -71.165428 79.959020 # -b -72.247319 80.005956 -72.707299 79.998916 # -b -80.189010 75.173823 -79.954326 75.204332 -79.747805 75.284124 -79.747805 75.319327 -79.766579 75.382691 -79.766579 75.457790 -79.790048 75.464830 -79.790048 75.471871 -79.921470 75.467177 -79.987182 75.504727 -79.944939 75.535235 # -b -79.229154 76.046846 -79.210379 76.039805 -79.238541 75.990521 -79.294865 75.962359 -79.360577 75.910729 -79.182217 75.868486 -79.078957 75.814509 -79.144668 75.812162 -79.323027 75.821549 -79.491999 75.809815 -79.491999 75.774613 -79.576486 75.760532 -79.689134 75.767572 -79.811169 75.798081 -79.905042 75.805121 -79.848718 75.837977 -79.792394 75.868486 -79.792394 75.903689 -79.689134 75.950625 -79.595260 75.997562 -79.585873 76.035111 -79.529549 76.060927 -79.529549 76.084395 -79.435675 76.093782 -79.304253 76.075008 -79.229154 76.046846 # -b -79.703215 74.847613 -79.562405 74.864041 -79.449756 74.906284 -79.604648 74.943833 -79.660972 75.002504 -79.660972 75.033013 -79.792394 75.028319 # -b -80.045853 74.817104 -79.947285 74.817104 -79.858106 74.838225 -79.792394 74.845266 -79.703215 74.847613 # -b -77.708405 69.942727 -77.699017 70.062416 -77.717792 70.207920 -77.952476 70.184451 -78.182465 70.240775 -78.271645 70.175064 -78.492248 70.247816 -78.703463 70.327608 -78.886516 70.386279 -79.285478 70.433216 -79.384045 70.433216 -79.595260 70.362811 -79.430982 70.318221 -79.154055 70.322915 -78.886516 70.111699 # -b -80.144420 72.357621 -79.937898 72.498431 -79.872187 72.404557 -79.881574 72.315378 -79.825250 72.310684 -79.703215 72.287216 -79.463837 72.364661 -79.262010 72.287216 -79.130587 72.223851 -78.933453 72.303643 -78.623670 72.303643 -78.403068 72.334152 -78.689382 72.413945 -78.665914 72.531286 -78.393681 72.620466 -78.238790 72.658016 -78.060430 72.681484 -77.699017 72.730767 -77.201488 72.721380 -76.793139 72.648628 -76.319078 72.592304 -76.131332 72.559449 -75.755838 72.557102 -75.370957 72.500778 -75.436668 72.446800 -75.272390 72.418638 -75.084643 72.284869 -75.028319 72.193342 -75.239534 72.099469 -75.126886 72.061919 -74.751393 72.066613 -74.366512 72.029064 -74.310188 71.902335 -74.432223 71.827236 -74.742005 71.761525 -74.887509 71.716935 -75.070562 71.655917 -74.774861 71.707547 -74.798329 71.597246 -74.652825 71.627755 -74.366512 71.747444 -74.089585 71.740403 -73.582669 71.782646 -73.549813 71.747444 -73.704704 71.688773 -73.859595 71.606633 -74.014486 71.508066 -74.103666 71.442355 -73.836127 71.557350 -73.648380 71.543269 -73.695317 71.411846 -73.549813 71.357869 -73.526345 71.322666 -73.296355 71.341441 -73.286967 71.292158 -73.254112 71.348482 -73.362066 71.526841 -73.132076 71.547963 -73.042897 71.522147 -72.878618 71.508066 -72.658016 71.592552 -72.592304 71.688773 -72.545368 71.693466 -72.428026 71.648876 -72.207423 71.590206 -71.841317 71.540922 -71.442355 71.475211 -71.188897 71.336747 -71.090330 71.207671 -71.188897 71.134920 -71.325013 71.064515 -71.611327 71.071555 -72.127631 71.031659 -71.874173 71.008190 -71.578471 71.001150 -71.432968 70.928398 -71.146654 70.954213 -70.860340 71.031659 -70.649125 71.022272 -70.583413 70.907277 -70.738304 70.766466 -70.883808 70.689021 -70.893196 70.623310 -70.559945 70.712489 -70.306487 70.745345 -70.099965 70.806363 # -b -69.942727 70.822791 -70.083537 70.700755 -70.327608 70.620963 -70.440256 70.524742 -70.440256 70.489540 -70.252510 70.566985 -70.139861 70.590454 # -b -80.320432 76.220511 -79.813516 76.260408 -79.484959 76.347240 -79.278437 76.434073 -79.090691 76.525600 -78.987430 76.396524 -78.583774 76.464582 -78.518063 76.530294 -78.151957 76.567843 -78.095633 76.631207 -78.048696 76.741509 -78.114407 76.861197 -78.283379 76.943337 -78.630711 76.915175 -78.846620 76.854157 -78.987430 76.793139 -79.184564 76.804873 -79.165789 76.872931 -79.325374 76.889359 -79.550670 76.919868 -79.513121 76.948030 -79.391086 76.969152 # -b -78.963962 73.603790 -78.743359 73.615524 -78.630711 73.622565 -78.245830 73.615524 -77.950129 73.568588 -77.640347 73.505223 -77.330564 73.465327 -77.199142 73.399615 -77.166286 73.345638 -77.011395 73.279927 -76.833035 73.244724 -76.668757 73.146157 -76.537334 73.085140 -76.340200 73.024122 -76.373056 72.984226 -76.316732 72.925555 -76.152453 72.866884 -76.307344 72.796479 -76.635901 72.789438 -77.077106 72.803519 -77.574635 72.859843 -77.936048 72.866884 -78.269298 72.866884 -78.654179 72.798826 -78.996817 72.737808 -79.428635 72.697912 -79.790048 72.754236 # -b -80.090442 73.664808 -79.649237 73.608484 -79.118853 73.577975 -78.963962 73.603790 # -b -71.299198 76.999661 -71.299198 77.004354 -71.271036 77.025476 -71.158388 77.046597 -71.139613 77.077106 -70.998803 77.124043 -70.754732 77.131083 -70.782894 77.178020 -70.491887 77.210876 -70.266591 77.227304 # -b -69.644679 77.520658 -70.029560 77.548820 -70.123434 77.612185 # -b -69.999051 77.682590 -70.205573 77.677896 -70.581067 77.682590 -70.468418 77.750648 -70.186798 77.828093 -70.092925 77.858602 -70.496580 77.830440 -70.825137 77.792891 -71.228793 77.781157 -71.322666 77.830440 -71.256955 77.879724 -71.519801 77.882071 -71.735709 77.919620 -71.876519 77.910233 -72.026717 77.931354 -72.205076 77.943088 -72.261400 77.966557 -72.261400 77.971250 -72.242626 78.013493 -72.327112 78.055736 -72.580570 78.081552 -72.702605 78.114407 -72.843416 78.137876 -72.927902 78.173078 -72.740155 78.191853 -72.674443 78.248177 -72.674443 78.273992 -72.486697 78.276339 -72.449147 78.288073 -72.796479 78.306848 -72.824641 78.344397 -72.702605 78.386640 -72.636894 78.419496 -72.646281 78.438271 -72.589957 78.492248 -72.345887 78.534491 -72.073654 78.546225 -71.885907 78.567346 -71.726322 78.618977 -71.529188 78.633058 -71.332054 78.644792 -71.247568 78.635405 -71.210018 78.635405 -71.097370 78.618977 -71.003497 78.609589 -70.928398 78.675301 -70.834525 78.726931 -70.571679 78.743359 -70.365158 78.757440 -70.205573 78.783255 -70.111699 78.802030 # -b -69.888750 76.734468 -70.010786 76.833035 # -b -69.921606 76.929256 -70.203226 76.793139 -70.559945 76.772018 -70.850953 76.823648 -70.832178 76.877625 -70.888502 76.912828 -71.095023 76.933949 -71.217059 76.955071 -71.320320 76.966805 -71.432968 76.959764 -71.292158 77.004354 # -b -87.245943 80.050546 -87.170844 79.989529 -87.161457 79.977794 -87.114520 79.947285 -87.170844 79.937898 -87.311654 79.907389 -87.302267 79.893308 -87.058196 79.912083 -87.030034 79.914430 -87.030034 79.898002 -87.095745 79.862799 -87.189619 79.806475 -87.274105 79.740764 -87.311654 79.689134 -87.508788 79.670359 -87.621436 79.628116 -87.621436 79.585873 -87.546338 79.590567 -87.433690 79.623422 -87.349203 79.653931 -87.236555 79.653931 -87.161457 79.653931 -87.048809 79.679746 -86.917386 79.703215 -86.832900 79.698521 -86.710864 79.675053 -86.607604 79.665665 -86.485568 79.623422 -86.419857 79.602301 -86.279047 79.578832 -86.260272 79.541283 -86.269659 79.513121 -86.222723 79.473225 -86.335371 79.452103 -86.325983 79.426288 -86.241497 79.447410 -86.138237 79.461491 -86.081913 79.491999 -86.091300 79.510774 -86.081913 79.529549 -86.016201 79.562405 -85.997426 79.585873 -85.959877 79.599954 -85.866004 79.597607 -85.856616 79.602301 -85.781518 79.574139 -85.668870 79.522508 -85.490510 79.475572 -85.349700 79.447410 -85.330925 79.428635 -85.283989 79.395779 -85.190115 79.374658 -85.124404 79.360577 -85.077467 79.332415 -85.096242 79.276091 -85.096242 79.243235 -85.199503 79.222113 -85.330925 79.193951 -85.471735 79.175177 -85.406024 79.189258 -85.509285 79.158749 -85.781518 79.116506 -86.091300 79.090691 -86.372920 79.064875 -86.579442 79.041407 -86.739026 79.029673 -86.767188 78.978043 -86.710864 78.968655 -86.776576 78.940493 -86.983097 78.902944 -86.992485 78.945187 -87.020647 78.973349 -87.030034 79.001511 -87.095745 79.017939 -87.123907 79.024979 -87.208393 79.034367 -87.217781 78.992124 -87.208393 78.945187 -87.180231 78.900597 -87.170844 78.846620 -87.424302 78.769174 -87.536950 78.701116 -87.677760 78.635405 -87.781021 78.623670 -87.931219 78.661220 -88.090803 78.719891 -88.128353 78.785602 -88.137740 78.848967 -88.137740 78.884169 -88.194064 78.914678 -88.222226 78.931106 -88.203451 78.952227 -88.194064 78.966308 -88.184677 79.006205 -88.137740 79.043754 -88.137740 79.071916 -88.194064 79.055488 -88.231614 79.006205 -88.287938 78.961615 -88.391198 78.900597 -88.391198 78.837232 -88.428748 78.794989 -88.419360 78.736319 -88.325487 78.663567 -88.353649 78.623670 -88.287938 78.621324 -88.156515 78.590815 -88.100191 78.527450 -88.118965 78.478167 -88.137740 78.461739 -88.137740 78.426536 -88.250388 78.428883 -88.391198 78.426536 -88.475684 78.478167 -88.635269 78.527450 -88.729143 78.553265 -88.757305 78.590815 -88.823016 78.593162 -88.860565 78.555612 -88.888727 78.522757 -88.869953 78.461739 -88.747917 78.412455 -88.635269 78.367865 -88.560170 78.351438 -88.597720 78.290420 -88.635269 78.227055 -88.691593 78.158997 -88.757305 78.114407 -88.888727 78.119101 -89.076474 78.166038 -89.170348 78.210628 -89.273608 78.262258 -89.358094 78.297460 -89.386256 78.337357 -89.480130 78.346744 -89.489517 78.346744 -89.517679 78.353784 -89.649102 78.388987 -89.771137 78.400721 -89.893173 78.440617 -89.968271 78.499288 # -b -90.080920 78.426536 -89.958884 78.374906 -89.902560 78.335010 -89.705426 78.281033 -89.517679 78.180119 -89.395644 78.114407 -89.433193 78.093286 -89.517679 78.140222 -89.752363 78.163691 -89.902560 78.227055 # -b -88.637616 76.999661 -88.637616 77.009048 -88.543743 77.011395 -88.487419 77.013742 -88.449869 77.020782 -88.440482 77.037210 -88.431094 77.067719 -88.355996 77.077106 -88.280897 77.077106 -88.187024 77.058331 -88.130700 77.067719 -88.093150 77.058331 -88.008664 77.041904 -87.952340 77.053638 -87.914791 77.072412 -87.830305 77.077106 -87.792755 77.077106 -87.783368 77.051291 -87.680107 77.055985 -87.539297 77.060678 -87.529910 77.067719 -87.614396 77.088840 -87.595621 77.107615 -87.539297 77.121696 -87.473586 77.124043 -87.407874 77.124043 -87.304614 77.138124 -87.229515 77.140471 -87.210740 77.117002 -87.098092 77.102921 -87.004219 77.088840 -86.994831 77.102921 -86.985444 77.117002 -86.900958 77.138124 -86.929120 77.145164 -87.098092 77.147511 -87.229515 77.161592 -87.314001 77.147511 -87.342163 77.161592 -87.342163 77.194448 -87.276452 77.203835 -87.154416 77.215569 -87.135641 77.231997 -87.285839 77.236691 -87.360938 77.236691 -87.370325 77.253119 -87.285839 77.276587 -87.173191 77.297709 -87.041768 77.309443 -87.051155 77.332911 -87.182578 77.335258 -87.295226 77.330564 -87.417262 77.307096 -87.492360 77.293015 -87.680107 77.297709 -87.802143 77.318830 -87.820917 77.351686 -87.886629 77.384542 -87.858467 77.426785 -87.849079 77.457293 -87.867854 77.469028 -87.905403 77.483109 -87.980502 77.511271 -88.064988 77.525352 -88.074376 77.546473 -88.196411 77.569942 -88.355996 77.586369 -88.393545 77.602797 -88.384158 77.638000 -88.374770 77.670855 -88.365383 77.696671 -88.421707 77.715445 -88.393545 77.727179 -88.421707 77.743607 -88.421707 77.769423 -88.309059 77.769423 -88.187024 77.806972 -88.064988 77.799931 -87.924178 77.816359 -87.792755 77.828093 -87.717657 77.846868 -87.623783 77.860949 -87.501748 77.865643 -87.426649 77.863296 -87.295226 77.867990 -87.107479 77.846868 -86.938507 77.851562 -86.778923 77.835134 -86.600563 77.825747 -86.478528 77.792891 -86.365880 77.767076 -86.300168 77.743607 -86.272006 77.731873 -86.243844 77.694324 -86.121809 77.661468 -86.046710 77.607491 -85.924675 77.562901 -85.915287 77.532392 -85.868351 77.492496 -85.858963 77.478415 -85.802639 77.454947 -85.821414 77.419744 -85.746315 77.429131 -85.577343 77.400969 -85.417758 77.379848 -85.267561 77.382195 -85.107976 77.368114 -85.014103 77.368114 -84.901454 77.356380 -84.854518 77.332911 -84.723095 77.316483 -84.638609 77.290668 -84.507186 77.293015 -84.469637 77.318830 -84.497799 77.342299 -84.572898 77.375154 -84.610447 77.386888 -84.422700 77.386888 -84.263115 77.389235 -84.094143 77.405663 -83.972108 77.379848 -83.821910 77.375154 -83.681100 77.356380 -83.568452 77.365767 -83.568452 77.391582 -83.634163 77.396276 -83.746812 77.403316 -83.774974 77.419744 -83.784361 77.440866 -83.784361 77.450253 -83.681100 77.461987 -83.568452 77.490149 -83.465191 77.513617 -83.455804 77.532392 -83.380705 77.555861 -83.258670 77.586369 -83.211733 77.607491 -83.117860 77.647387 -83.023986 77.687283 -82.995824 77.722486 -82.939500 77.748301 -82.817465 77.792891 -82.770528 77.821053 -82.714204 77.870336 -82.686042 77.900845 -82.695429 77.926660 -82.695429 77.959516 -82.610943 77.978291 -82.526457 77.997066 -82.460746 78.015840 -82.507683 78.022881 -82.686042 78.020534 -82.808078 77.992372 -82.873789 77.954822 -82.864402 77.910233 -82.920726 77.853909 -82.995824 77.804625 -83.136634 77.757688 -83.268057 77.691977 -83.380705 77.623919 -83.427642 77.584023 -83.615389 77.527698 -83.784361 77.504230 -83.943946 77.490149 -84.037819 77.501883 -84.188017 77.499536 -84.338214 77.518311 -84.460249 77.520658 -84.544736 77.513617 -84.610447 77.504230 -84.638609 77.506577 -84.732482 77.506577 -84.892067 77.513617 -84.901454 77.546473 -84.939004 77.574635 -84.901454 77.584023 -84.835743 77.623919 -84.779419 77.645040 -84.732482 77.677896 -84.760644 77.715445 -84.770032 77.734220 -84.816968 77.715445 -84.835743 77.666162 -84.901454 77.635653 -84.985941 77.602797 -85.032877 77.593410 -85.126751 77.612185 -85.220624 77.628612 -85.276948 77.635653 -85.342659 77.638000 -85.361434 77.668509 -85.408371 77.696671 -85.408371 77.713098 -85.380209 77.738914 -85.333272 77.760035 -85.211237 77.790544 -85.192462 77.806972 -85.295723 77.792891 -85.352047 77.790544 -85.361434 77.790544 -85.464695 77.790544 -85.539794 77.785850 -85.549181 77.806972 -85.539794 77.828093 -85.492857 77.839828 -85.352047 77.846868 -85.173687 77.851562 -85.107976 77.844521 -85.126751 77.830440 -85.051652 77.849215 -84.957778 77.870336 -84.845130 77.872683 -84.863905 77.889111 -84.948391 77.903192 -85.051652 77.879724 -85.173687 77.875030 -85.333272 77.867990 -85.483470 77.875030 -85.596118 77.846868 -85.699378 77.842174 -85.783864 77.877377 -85.868351 77.882071 -85.887125 77.900845 -85.746315 77.936048 -85.699378 77.959516 -85.549181 77.985331 -85.445920 77.997066 -85.333272 77.985331 -85.173687 77.978291 -85.042265 77.994719 -85.004715 78.001759 -85.089201 78.015840 -85.258173 78.020534 -85.239399 78.032268 -85.201849 78.058083 -85.201849 78.076858 -85.126751 78.088592 -85.089201 78.109714 -84.976553 78.109714 -84.835743 78.109714 -84.760644 78.121448 -84.760644 78.126141 -84.657384 78.128488 -84.450862 78.114407 -84.234953 78.093286 -84.150467 78.114407 -84.141080 78.144916 -84.272503 78.126141 -84.310052 78.144916 -84.319439 78.151957 -84.450862 78.163691 -84.629222 78.173078 -84.779419 78.168384 -84.920229 78.151957 -84.957778 78.170731 -84.957778 78.201240 -84.948391 78.236443 -84.892067 78.266952 -84.779419 78.283379 -84.685546 78.306848 -84.647996 78.335010 -84.666771 78.335010 -84.760644 78.313888 -84.845130 78.320929 -84.892067 78.346744 -84.863905 78.384293 -84.863905 78.424190 -84.854518 78.454698 -84.788806 78.489901 -84.760644 78.525103 -84.713708 78.555612 -84.713708 78.560306 -84.779419 78.532144 -84.835743 78.501635 -84.882680 78.478167 -84.892067 78.438271 -84.976553 78.388987 -85.004715 78.332663 -85.032877 78.290420 -85.126751 78.248177 -85.173687 78.198893 -85.286335 78.151957 -85.427146 78.095633 -85.549181 78.069817 -85.586730 78.083898 -85.652442 78.088592 -85.783864 78.076858 -85.934062 78.058083 -85.896513 78.069817 -85.999773 78.060430 -86.121809 78.036962 -86.243844 78.058083 -86.281394 78.083898 -86.272006 78.109714 -86.300168 78.130835 -86.215682 78.156650 -86.103034 78.201240 -86.037323 78.229402 -85.990386 78.269298 -85.934062 78.311541 -85.934062 78.337357 -85.990386 78.330316 -86.103034 78.306848 -86.112421 78.295114 -86.168745 78.283379 -86.178133 78.245830 -86.243844 78.198893 -86.328330 78.180119 -86.412816 78.180119 -86.469140 78.187159 -86.544239 78.142569 -86.581788 78.114407 -86.656887 78.105020 -86.741373 78.105020 -86.816472 78.083898 -86.919733 78.088592 -87.060543 78.069817 -87.210740 78.076858 -87.295226 78.079205 -87.351550 78.088592 -87.436036 78.093286 -87.539297 78.093286 -87.558072 78.102673 -87.511135 78.126141 -87.370325 78.156650 -87.182578 78.158997 -87.126254 78.168384 -87.210740 78.170731 -87.285839 78.182465 -87.398487 78.194200 -87.501748 78.180119 -87.558072 78.173078 -87.567459 78.201240 -87.558072 78.227055 -87.548684 78.257564 -87.576847 78.276339 -87.595621 78.309195 -87.595621 78.330316 -87.670720 78.370212 -87.698882 78.379600 -87.670720 78.398374 -87.605009 78.431230 -87.539297 78.459392 -87.407874 78.496941 -87.285839 78.508676 -87.060543 78.522757 -86.994831 78.541531 -87.088705 78.548572 -87.191966 78.555612 -87.163804 78.590815 -87.126254 78.635405 -87.060543 78.677648 -87.022993 78.715197 -86.910345 78.752746 -86.816472 78.769174 -86.675662 78.771521 -86.525464 78.776215 -86.328330 78.778562 -86.121809 78.780908 -85.887125 78.794989 -85.586730 78.811417 -85.511632 78.830192 -85.445920 78.858354 -85.417758 78.886516 -85.305110 78.888863 -85.239399 78.891210 -85.136138 78.881822 -85.032877 78.877129 -85.004715 78.872435 -84.760644 78.846620 -84.516573 78.839579 -84.338214 78.823151 -84.141080 78.820805 -83.972108 78.820805 -83.765586 78.773868 -83.596614 78.750400 -83.474579 78.717544 -83.380705 78.703463 -83.192958 78.654179 -82.986437 78.647139 -82.873789 78.614283 -82.798690 78.588468 -82.751753 78.553265 -82.573394 78.529797 -82.404422 78.515716 -82.366873 78.536838 -82.488908 78.581427 -82.610943 78.647139 -82.507683 78.647139 -82.357485 78.642445 -82.301161 78.670607 -82.357485 78.675301 -82.526457 78.677648 -82.686042 78.682341 -82.798690 78.675301 -82.873789 78.698769 -82.939500 78.701116 -83.052148 78.703463 -83.155409 78.726931 -83.268057 78.738665 -83.343156 78.771521 -83.314994 78.773868 -83.202346 78.799683 -82.995824 78.785602 -82.845627 78.785602 -82.629718 78.780908 -82.423197 78.776215 -82.310548 78.794989 -82.244837 78.799683 -82.179126 78.776215 -82.085252 78.759787 -82.000766 78.764481 -81.944442 78.790296 -81.935055 78.790296 -81.888118 78.785602 -81.822407 78.804377 -81.766083 78.820805 -81.813019 78.832539 -81.803632 78.860701 -81.766083 78.888863 -81.766083 78.891210 -81.709759 78.912331 -81.615885 78.945187 -81.615885 78.959268 -81.784857 78.949881 -81.888118 78.928759 -81.981992 78.900597 -82.047703 78.881822 -82.150964 78.879476 -82.188513 78.853660 -82.254224 78.846620 -82.366873 78.841926 -82.479521 78.839579 -82.564007 78.841926 -82.582781 78.841926 -82.648493 78.841926 -82.808078 78.841926 -82.958275 78.863048 -83.108472 78.879476 -83.239895 78.888863 -83.343156 78.888863 -83.437029 78.888863 -83.615389 78.891210 -83.784361 78.893557 -83.953333 78.900597 -84.094143 78.905291 -84.197404 78.905291 -84.291277 78.909984 -84.450862 78.931106 -84.563510 78.952227 -84.629222 78.975696 -84.779419 78.994470 -84.770032 78.994470 -84.835743 78.994470 -84.892067 79.027326 -84.901454 79.050794 -84.835743 79.071916 -84.760644 79.100078 -84.647996 79.109465 -84.535348 79.076610 -84.291277 79.069569 -84.188017 79.034367 -84.075368 78.999164 -83.878234 78.982736 -83.709262 78.975696 -83.530903 78.978043 -83.408867 79.003858 -83.399480 79.015592 -83.512128 79.003858 -83.652938 79.006205 -83.756199 79.039060 -83.774974 79.060182 -83.812523 79.088344 -83.943946 79.081303 -84.037819 79.111812 -84.150467 79.142321 -84.065981 79.175177 -84.037819 79.198645 -84.028432 79.210379 -84.141080 79.177524 -84.291277 79.161096 -84.403925 79.163443 -84.422700 79.193951 -84.460249 79.217420 -84.535348 79.250275 -84.507186 79.259663 -84.507186 79.294865 -84.572898 79.332415 -84.563510 79.372311 -84.591672 79.407513 -84.732482 79.442716 -84.882680 79.482612 -85.023490 79.508427 -85.107976 79.541283 -85.136138 79.569445 -85.145525 79.576486 -85.145525 79.581179 -85.173687 79.611688 -85.239399 79.644544 -85.361434 79.660972 -85.511632 79.679746 -85.614892 79.703215 -85.708766 79.717296 -85.746315 79.717296 -85.952837 79.724336 -86.187520 79.752498 -86.394042 79.773620 -86.591176 79.818210 -86.609950 79.841678 -86.609950 79.874534 -86.609950 79.926164 -86.600563 79.963713 -86.497302 79.973101 -86.328330 79.970754 -86.168745 79.940245 -85.924675 79.930858 -85.680604 79.905042 -85.521019 79.890961 -85.464695 79.907389 -85.474082 79.923817 -85.661829 79.954326 -85.830801 79.961367 -86.046710 79.980141 -86.215682 79.994222 -86.356492 79.998916 # -b -83.209386 80.005956 -82.993477 79.949632 -82.862055 79.919123 -82.683695 79.874534 -82.486561 79.829944 -82.383300 79.808822 -82.298814 79.783007 -82.298814 79.733724 -82.195554 79.717296 -82.167392 79.672706 -82.111067 79.644544 -81.989032 79.644544 -81.979645 79.616382 -81.970257 79.581179 -81.970257 79.562405 -81.970257 79.550670 -81.885771 79.555364 -81.791898 79.578832 -81.557214 79.578832 -81.369468 79.557711 -81.219270 79.531896 -81.050298 79.508427 -80.937650 79.496693 -80.909488 79.501387 -80.947037 79.515468 -80.947037 79.536589 -80.900101 79.560058 -80.806227 79.569445 -80.740516 79.571792 -80.609093 79.576486 -80.458896 79.592913 -80.299311 79.609341 -80.111564 79.609341 -80.064627 79.635156 -80.092789 79.653931 -80.224212 79.653931 -80.289923 79.653931 -80.346247 79.649237 -80.477670 79.635156 -80.618480 79.616382 -80.787452 79.614035 -80.928263 79.602301 -81.059685 79.616382 -81.181721 79.628116 -81.256820 79.649237 -81.378855 79.653931 -81.510278 79.665665 -81.632313 79.670359 -81.707412 79.700868 -81.707412 79.717296 -81.801285 79.717296 -81.810673 79.743111 -81.801285 79.768926 -81.820060 79.806475 -81.848222 79.848718 -81.885771 79.862799 -81.895159 79.869840 -81.782511 79.881574 -81.679250 79.893308 -81.660475 79.907389 -81.698025 79.919123 -81.763736 79.919123 -81.820060 79.930858 -81.923321 79.926164 -81.989032 79.937898 -82.045356 79.940245 -82.139230 79.954326 -82.308202 79.984835 -82.495948 79.996569 # -b -79.846372 77.161592 -80.062280 77.117002 -80.343901 77.037210 -80.437774 77.039557 -80.221865 77.117002 -80.240640 77.166286 -80.409612 77.163939 -80.587971 77.170980 -80.794493 77.196795 -81.047951 77.199142 -81.432832 77.178020 -81.686290 77.112309 -81.911587 77.044250 -81.977298 77.102921 -82.014847 77.178020 -82.127495 77.217916 -81.855262 77.206182 -81.489156 77.229650 -81.310797 77.255466 -81.310797 77.281281 -81.629966 77.328217 -81.695678 77.393929 -81.686290 77.433825 -81.385895 77.351686 -81.160599 77.304749 -80.897754 77.260159 -80.606746 77.229650 -80.250027 77.224957 # -b -90.125509 74.502628 -89.773484 74.502628 -89.637368 74.549565 -89.416765 74.615276 -89.430846 74.636398 -89.496558 74.659866 -89.627980 74.690375 -89.595125 74.751393 -89.627980 74.746699 -89.496558 74.758433 -89.351054 74.739658 -89.383910 74.810063 -89.243099 74.695068 -89.130451 74.648132 -89.041272 74.683334 -88.956786 74.742005 -88.942705 74.807717 -88.858218 74.800676 -88.778426 74.767820 -88.689246 74.756086 -88.689246 74.704456 -88.745570 74.594155 -88.754958 74.521403 -88.769039 74.479160 -88.754958 74.479160 -88.614148 74.465079 -88.501500 74.453344 -88.346608 74.479160 -88.163555 74.446304 -88.018052 74.486200 -87.952340 74.436917 -87.764593 74.458038 -87.586234 74.462732 -87.576847 74.528443 -87.445424 74.528443 -87.464198 74.462732 -87.281145 74.446304 -87.093398 74.453344 -86.905652 74.443957 -86.783616 74.467425 -86.816472 74.509669 -86.915039 74.568339 -86.849328 74.509669 -86.581788 74.462732 -86.440978 74.504975 -86.384654 74.570686 -86.253231 74.509669 -86.178133 74.443957 -86.121809 74.450998 -85.821414 74.462732 -85.689991 74.526096 -85.689991 74.652825 -85.582037 74.584767 -85.450614 74.497934 -85.337966 74.479160 -85.281642 74.521403 -85.117363 74.568339 -85.159606 74.636398 -85.173687 74.641091 -85.150219 74.688028 -85.126751 74.617623 -85.028184 74.504975 -84.821662 74.509669 -84.577591 74.504975 -84.192710 74.526096 -83.892315 74.537831 -83.695181 74.556605 -83.451110 74.688028 -83.376012 74.734965 -83.573146 74.788942 -83.671713 74.866387 -83.972108 74.894549 -83.892315 74.892203 -83.737424 74.896896 -83.540290 74.871081 -83.408867 74.800676 -83.207039 74.803023 -83.174184 74.730271 -83.188265 74.603542 -83.009905 74.535484 -82.869095 74.490894 -82.648493 74.504975 -82.592169 74.551912 -82.479521 74.502628 -82.404422 74.488547 -82.216675 74.465079 -81.963217 74.450998 -81.752002 74.509669 -81.531399 74.533137 -81.343652 74.551912 -81.193455 74.558952 -81.169987 74.556605 -81.005708 74.551912 -80.817961 74.558952 -80.803880 74.561299 -80.728782 74.551912 -80.531647 74.584767 -80.287577 74.587114 -80.287577 74.695068 -80.287577 74.725577 -80.287577 74.556605 -80.362675 74.756086 -80.320432 74.788942 -80.418999 74.840572 -80.672458 74.913324 -80.663070 74.983729 -80.648989 75.042400 -80.475323 75.063522 -80.287577 75.108111 -80.189010 75.173823 # -b -79.944939 75.535235 -80.123298 75.530542 -80.395531 75.514114 -80.564503 75.530542 -80.353288 75.561051 -80.376756 75.603294 -80.418999 75.624415 -80.550422 75.654924 -80.616134 75.657271 -80.728782 75.678392 -80.949384 75.659618 -81.169987 75.678392 -81.240392 75.687780 -81.226311 75.767572 -81.259166 75.802775 -81.306103 75.791040 -81.310797 75.795734 -81.456300 75.819203 -81.568949 75.833284 -81.648741 75.837977 -81.737921 75.849711 -81.813019 75.854405 -81.888118 75.835630 -82.005460 75.823896 -82.118108 75.781653 -82.193207 75.748797 -82.254224 75.765225 -82.334017 75.762878 -82.366873 75.798081 -82.423197 75.793387 -82.441971 75.786347 -82.502989 75.812162 -82.526457 75.819203 -82.596862 75.814509 -82.657880 75.767572 -82.728285 75.758185 -82.840933 75.713595 -82.930113 75.699514 -83.028680 75.673699 -83.014599 75.640843 -82.958275 75.624415 -83.080310 75.631456 -83.324381 75.652577 -83.502741 75.636149 -83.610695 75.579825 -83.652938 75.596253 -83.643551 75.582172 -83.620082 75.528195 -83.634163 75.504727 -83.652938 75.528195 -83.807829 75.535235 -83.873541 75.551663 -83.929865 75.591560 -84.126999 75.535235 -84.305358 75.537582 -84.418006 75.514114 -84.568204 75.497686 -84.591672 75.497686 -84.582285 75.462484 -84.385151 75.424934 -84.042513 75.399119 -83.995576 75.359223 -84.206791 75.385038 -84.385151 75.380344 -84.615141 75.387385 -84.779419 75.368610 -84.901454 75.345142 -84.924923 75.340448 -84.957778 75.331061 -85.131444 75.319327 -85.220624 75.342795 -85.032877 75.366263 -84.910842 75.387385 -85.023490 75.424934 -85.244092 75.436668 -85.441227 75.462484 -85.506938 75.500033 -85.619586 75.539929 -85.751009 75.563397 -85.915287 75.577478 -86.060791 75.523501 -86.037323 75.462484 -86.093647 75.424934 -86.126502 75.453096 -86.178133 75.523501 -86.281394 75.551663 -86.455059 75.497686 -86.501996 75.462484 -86.600563 75.429628 -86.689743 75.427281 -86.764842 75.431975 -86.689743 75.488299 -86.722599 75.507073 -86.877490 75.554010 -86.919733 75.582172 -86.929120 75.582172 -87.008912 75.596253 -87.140335 75.631456 -87.196659 75.629109 -87.295226 75.596253 -87.337469 75.544623 -87.295226 75.500033 -87.248290 75.431975 -87.370325 75.370957 -87.459505 75.413200 -87.548684 75.516461 -87.670720 75.539929 -87.825611 75.551663 -87.891322 75.525848 -87.900710 75.525848 -87.957034 75.507073 -88.046214 75.511767 -88.055601 75.525848 -88.013358 75.551663 -88.163555 75.535235 -88.144781 75.572785 -87.957034 75.575132 -87.778674 75.589213 -87.736431 75.631456 -87.647252 75.732370 -87.694188 75.744104 -87.731738 75.798081 -87.783368 75.784000 -87.858467 75.767572 -87.910097 75.765225 # -b -90.059798 75.784000 -89.994087 75.802775 -89.937763 75.833284 -89.956537 75.849711 # -b -90.268666 76.107863 -89.940109 76.089089 -89.686651 76.093782 -89.517679 76.121944 -89.423806 76.154800 -89.329932 76.225205 -89.386256 76.283876 -89.498904 76.279182 -89.696039 76.267448 -89.714813 76.272142 -89.799299 76.281529 -89.958884 76.283876 # -b -79.792394 75.028319 -80.036465 75.014238 -80.210131 74.988423 -80.224212 74.962608 -80.379103 74.969648 -80.487058 74.939139 -80.496445 74.932099 -80.421346 74.889856 -80.346247 74.852306 -80.191356 74.807717 -80.045853 74.817104 # -b -80.165541 69.968543 -80.273496 70.001398 # -b -80.519913 69.968543 -80.763984 70.008439 -81.059685 70.038948 -81.435179 70.088231 -81.721493 70.111699 -81.777817 70.027213 # -b -84.854518 69.980277 -85.361434 70.048335 -85.910594 70.036601 -85.624280 70.027213 # -b -85.582037 69.970889 -86.056097 70.017826 -86.384654 70.125780 -86.595869 70.257203 -86.652193 70.437910 -86.783616 70.308834 -87.135641 70.273631 -87.619090 70.311180 -87.872548 70.301793 -87.919484 70.266591 -88.262122 70.311180 -88.041520 70.327608 -88.346608 70.405054 -88.670472 70.463725 -89.078821 70.623310 -89.308811 70.787588 -89.496558 70.881461 -89.365135 70.989416 -89.529413 71.050434 -89.229018 71.022272 -88.858218 71.015231 -88.581292 70.954213 -88.248041 70.900236 -87.788062 70.907277 -87.454811 70.956560 -87.234209 70.977682 -87.553378 71.031659 -87.886629 71.132573 -88.093150 71.217059 -88.637616 71.238180 -89.041272 71.242874 -89.538801 71.285117 -89.956537 71.308585 # -b -90.125509 71.651223 -89.947150 71.761525 # -b -90.069185 72.054879 -89.881439 72.129978 -89.693692 72.167527 -89.970618 72.169874 # -b -90.048064 72.367008 -89.916641 72.437413 -89.907254 72.580570 -89.738282 72.606385 -89.696039 72.669750 -89.663183 72.747195 -89.320545 72.747195 -89.508292 72.780051 -89.484823 72.923208 -89.254834 72.967798 -89.386256 73.047590 -89.287689 73.120342 -89.179735 73.181360 -89.067087 73.207175 -88.945051 73.254112 -88.837097 73.298702 -88.715062 73.425431 -88.438135 73.512264 -88.109578 73.603790 -87.832652 73.664808 -87.522869 73.716438 -87.170844 73.761028 -86.706171 73.810312 -86.419857 73.815005 -86.166399 73.810312 -85.959877 73.791537 -85.725194 73.784496 -85.504591 73.791537 -85.274601 73.782150 -85.110323 73.735213 # -b -85.107976 73.735213 -84.995328 73.714091 -84.995328 73.695317 -85.173687 73.624912 -85.450614 73.542772 -85.689991 73.479408 -85.887125 73.371453 -86.121809 73.291661 -86.328330 73.176666 -86.408123 73.012388 -86.605257 72.885659 -86.769535 72.782398 -86.802391 72.613426 -86.572401 72.486697 -86.417510 72.362314 -86.581788 72.190995 -86.605257 72.031411 -86.440978 71.878866 -86.178133 71.752137 -86.009161 71.681732 -85.736928 71.569084 -85.525713 71.468170 -85.206543 71.442355 -85.117363 71.390725 -85.061039 71.313279 -85.061039 71.266342 -85.314497 71.285117 -85.502244 71.252261 -85.591424 71.217059 -85.769783 71.200631 -86.042016 71.186550 -86.262619 71.104411 -86.605257 71.024618 -86.717905 71.001150 -86.408123 70.984722 -86.243844 71.036353 -86.042016 71.085636 -85.779171 71.127879 -85.549181 71.149001 -85.295723 71.141960 -85.248786 71.139613 -85.126751 71.160735 -85.061039 71.127879 -85.117363 71.071555 -85.159606 70.963601 -85.061039 70.926051 -84.920229 71.050434 -84.906148 71.163082 -84.873292 71.245221 -84.906148 71.341441 -84.821662 71.386031 -84.821662 71.418887 -84.751257 71.547963 -84.807581 71.627755 -85.075120 71.627755 -85.460001 71.669998 -85.704072 71.766218 -85.713459 71.862438 -85.999773 71.923456 -86.065485 71.977433 -85.877738 72.017330 -85.666523 72.085388 -85.633667 72.151099 -85.549181 72.228545 -85.394290 72.228545 -85.215930 72.209770 -85.028184 72.268441 -84.929616 72.371702 -84.995328 72.397517 -85.107976 72.367008 -85.281642 72.362314 -85.624280 72.428026 -85.746315 72.517205 -85.666523 72.568836 -85.821414 72.714340 -85.835495 72.876271 -85.746315 72.927902 -85.525713 72.932595 -85.084508 72.899740 -84.863905 72.857497 -84.643303 72.812907 -84.356989 72.737808 -84.136386 72.749542 -84.497799 72.848109 -84.831049 72.892699 -85.140832 72.984226 -85.427146 73.003000 -85.614892 73.049937 -85.492857 73.071059 -85.370821 73.054631 -85.337966 73.101567 -84.887373 73.066365 -84.544736 73.024122 -84.277196 73.003000 -83.958027 72.986573 -83.925171 73.024122 -84.521267 73.082793 -84.995328 73.143810 -85.230011 73.228297 -85.117363 73.317476 -84.887373 73.340945 -84.666771 73.240031 -84.464943 73.207175 -84.633915 73.340945 -84.586979 73.401962 -84.258422 73.446552 -83.981495 73.409003 -83.850072 73.343291 -83.784361 73.286967 -83.718650 73.387881 -84.004963 73.470021 -83.648244 73.566241 -83.286832 73.631952 -83.056842 73.648380 -82.869095 73.695317 -82.568700 73.685929 -82.249531 73.700010 -81.906893 73.704704 -81.611192 73.707051 -81.522012 73.646033 -81.367121 73.577975 -81.334265 73.474714 -81.301409 73.380841 -81.268554 73.312783 -81.390589 73.263499 -81.522012 73.225950 -81.137131 73.188400 -80.850817 73.120342 -80.705313 73.054631 -80.728782 72.988919 -80.902447 72.951370 -80.883673 72.899740 -80.728782 72.796479 -80.573890 72.756583 -80.442468 72.711993 -80.564503 72.606385 -80.648989 72.484350 -80.728782 72.367008 -80.850817 72.284869 -80.935303 72.183955 -80.972852 72.153446 -80.860204 72.155793 -80.705313 72.090081 -80.752250 72.061919 -81.005708 72.085388 -81.090194 72.024370 -80.972852 71.963352 -81.005708 71.902335 -80.705313 71.975087 -80.475323 72.104162 -80.395531 72.200383 -80.231253 72.186302 -80.142073 72.317724 -80.142073 72.357621 # -b -88.553130 76.999661 -88.787813 76.976192 -88.787813 76.971499 -88.862912 76.938643 -88.984948 76.924562 -89.229018 76.879972 -89.501251 76.828342 -89.613899 76.741509 -89.576350 76.694572 -89.585737 76.628861 -89.632674 76.570190 -89.688998 76.534987 -89.623287 76.509172 -89.482477 76.445807 -89.341667 76.394177 -89.210244 76.384790 -88.975560 76.459888 -88.928624 76.534987 -88.881687 76.450501 -88.834750 76.408258 -88.703327 76.516213 -88.787813 76.628861 -88.853525 76.720387 -88.722102 76.769671 -88.665778 76.692225 -88.675165 76.605392 -88.675165 76.549068 -88.628229 76.441114 -88.600067 76.382443 -88.393545 76.373056 -88.252735 76.370709 -88.158862 76.321425 -88.018052 76.333159 -87.867854 76.347240 -87.783368 76.427033 -87.811530 76.518559 -87.755206 76.483357 -87.698882 76.436420 -87.426649 76.389483 -87.323388 76.344894 -87.088705 76.328466 -87.004219 76.410605 -86.797697 76.459888 -86.788310 76.567843 -86.694436 76.518559 -86.675662 76.448154 -86.769535 76.363668 -86.769535 76.337853 -86.459753 76.321425 -86.215682 76.302651 -86.797697 76.459888 -86.788310 76.567843 -86.694436 76.518559 -86.675662 76.448154 -86.769535 76.363668 -86.769535 76.337853 -86.459753 76.321425 -86.215682 76.302651 -86.018548 76.267448 -85.830801 76.272142 -85.586730 76.255714 -85.530406 76.213471 -85.286335 76.232245 -84.920229 76.239286 -84.685546 76.246327 -84.826356 76.293263 -85.201849 76.415299 -85.239399 76.434073 -85.276948 76.525600 -85.023490 76.396524 -84.770032 76.394177 -84.460249 76.466929 -84.460249 76.603045 -84.328827 76.556109 -84.037819 76.436420 -83.652938 76.382443 -83.408867 76.417645 -83.390093 76.527947 -83.596614 76.675797 -83.624776 76.722734 -83.493353 76.668757 -83.343156 76.560802 -83.211733 76.448154 -83.155409 76.391830 -82.892564 76.342547 -82.742366 76.363668 -82.395035 76.373056 -82.272999 76.481010 -82.423197 76.558456 -82.667267 76.649982 -82.498295 76.614780 -82.179126 76.600699 -82.150964 76.572537 -82.141576 76.499785 -82.038316 76.448154 -81.662822 76.429380 -81.531399 76.450501 -81.371814 76.462235 -81.184068 76.450501 -81.033870 76.394177 -81.015095 76.330813 -81.118356 76.227552 -81.231004 76.180615 -81.127744 76.121944 -80.921222 76.145413 -80.320432 76.220511 # -b -79.792394 72.754236 -80.092789 72.829335 -80.210131 72.944329 -80.242987 73.071059 -80.257068 73.176666 -80.477670 73.188400 -80.773371 73.223603 -80.984587 73.322170 -80.975199 73.432471 -80.871939 73.470021 -80.862551 73.603790 -80.717047 73.692970 -80.477670 73.702357 -80.233599 73.653074 -80.092789 73.664808 # -b -99.944668 71.871826 -99.986911 71.881213 # -b -100.000992 73.120342 -99.935280 73.106261 -99.888344 73.129729 # -b -100.090171 73.885410 -99.986911 73.861942 -99.921199 73.824393 -99.813245 73.782150 -99.658354 73.775109 -99.559787 73.761028 -99.437751 73.723479 -99.315716 73.707051 -99.240617 73.700010 -99.020015 73.711745 -98.930835 73.695317 -98.710232 73.721132 -98.489630 73.732866 -98.301883 73.763375 -98.179848 73.803271 -98.104749 73.815005 -98.057812 73.819699 -97.917002 73.843167 -97.804354 73.852555 -97.729255 73.850208 -97.574364 73.861942 -97.442941 73.880717 -97.410086 73.843167 -97.273969 73.803271 -97.175402 73.753988 -97.067448 73.742253 -97.076835 73.683583 -97.100303 73.624912 -97.208258 73.585015 -97.273969 73.547466 -97.320906 73.547466 -97.518040 73.538079 -97.583751 73.505223 -97.518040 73.495836 -97.564977 73.488795 -97.649463 73.484102 -97.630688 73.462980 -97.518040 73.458286 -97.452329 73.444205 -97.306825 73.446552 -97.273969 73.399615 -97.273969 73.355026 -97.288050 73.312783 -97.353762 73.331557 -97.550896 73.308089 -97.715174 73.270540 -97.794967 73.242378 -97.870065 73.214216 -97.968632 73.164932 -98.048425 73.117995 -98.189235 73.082793 -98.278415 73.031162 -98.409837 72.988919 -98.423918 72.958410 -98.433306 72.925555 -98.433306 72.892699 -98.423918 72.866884 -98.259640 72.918514 -98.024956 72.993613 -97.762111 73.014735 -97.597833 72.986573 -97.518040 72.951370 -97.428860 72.927902 -97.344374 72.899740 -97.344374 72.876271 -97.344374 72.848109 -97.353762 72.834028 -97.297438 72.817600 -97.264582 72.789438 -97.255195 72.763623 -97.166015 72.756583 -97.100303 72.723727 -97.076835 72.683831 -97.156627 72.636894 -97.156627 72.582917 -97.123772 72.585264 -96.898476 72.648628 -96.715422 72.658016 -96.701341 72.695565 -96.677873 72.721380 -96.612162 72.695565 -96.569919 72.669750 -96.579306 72.613426 -96.527676 72.585264 -96.471352 72.533633 -96.391559 72.442107 -96.391559 72.390476 -96.438496 72.357621 -96.560531 72.315378 -96.626243 72.298950 -96.701341 72.291909 -96.668486 72.270788 -96.593387 72.223851 -96.546450 72.174568 -96.527676 72.085388 -96.560531 72.047838 -96.677873 72.007942 -96.691954 71.991514 -96.546450 71.998555 -96.504207 71.961006 -96.480739 71.885907 -96.494820 71.813155 -96.569919 71.796727 -96.635630 71.820195 -96.832764 71.773259 -96.912557 71.672345 -97.100303 71.623061 -97.330293 71.569084 -97.574364 71.601940 -97.762111 71.601940 -97.902921 71.585512 -98.090668 71.601940 -98.137605 71.569084 -97.992101 71.508066 -97.917002 71.475211 -97.917002 71.418887 -98.071893 71.378990 -98.222091 71.343788 -98.259640 71.299198 -98.409837 71.252261 -98.531873 71.259302 -98.564729 71.249915 -98.611665 71.299198 -98.700845 71.362563 -98.808799 71.355522 -98.883898 71.308585 -99.038789 71.308585 -99.085726 71.355522 -99.137356 71.418887 -99.184293 71.508066 -99.207761 71.550309 -99.315716 71.599593 -99.395508 71.693466 -99.559787 71.761525 -99.700597 71.792033 -99.813245 71.820195 -99.878956 71.857745 -99.944668 71.871826 # -b -96.680220 72.974838 -96.670833 72.925555 -96.694301 72.941983 -96.670833 72.986573 -96.595734 73.038203 -96.637977 73.096874 -96.717769 73.117995 -96.792868 73.143810 -96.891435 73.160238 -97.069795 73.120342 -97.234073 73.071059 -97.201217 73.012388 -97.144893 72.970145 -97.088569 72.934942 -97.022858 72.880965 -96.825724 72.897393 -96.727157 72.934942 -96.703688 72.949023 -96.680220 72.974838 # -b -98.665642 73.800924 -98.581156 73.800924 -98.567075 73.810312 -98.501364 73.824393 -98.346473 73.833780 -98.215050 73.871329 -98.083627 73.913572 -97.938124 73.972243 -97.863025 74.028567 -97.872412 74.073157 -98.093015 74.077851 -98.360554 74.044995 -98.459121 74.028567 -98.646868 73.998058 -98.867470 73.988671 -99.031749 73.941734 -99.073992 73.906532 -99.228883 73.892451 -99.440098 73.850208 -99.383774 73.829086 -99.327450 73.831433 -99.285207 73.824393 -99.120929 73.810312 -99.064604 73.831433 -98.989506 73.831433 -98.933182 73.775109 -98.867470 73.800924 -98.811146 73.812658 -98.754822 73.793884 -98.665642 73.800924 # -b -96.393906 69.952115 -96.450230 70.008439 -96.605121 70.069456 -96.628590 70.156289 -96.637977 70.245469 -96.637977 70.329955 -96.614509 70.386279 -96.506554 70.419135 -96.440843 70.419135 -96.375131 70.477806 -96.318807 70.534130 -96.253096 70.574026 -96.196772 70.569332 -96.154529 70.536477 -96.088818 70.566985 -96.065349 70.656165 -96.140448 70.623310 -96.220240 70.679634 -96.318807 70.766466 -96.473698 70.827484 -96.473698 70.886155 -96.440843 70.968294 -96.361050 71.022272 -96.318807 71.050434 -96.375131 71.052780 -96.361050 71.118492 -96.328195 71.163082 -96.342276 71.210018 -96.328195 71.252261 -96.262483 71.280423 -96.173304 71.273383 -96.140448 71.294504 -96.131061 71.343788 -95.999638 71.378990 -95.821278 71.315626 -95.722711 71.263996 -95.657000 71.235834 -95.591288 71.245221 -95.567820 71.287464 -95.525577 71.341441 -95.567820 71.461130 -95.680468 71.468170 -95.788423 71.503373 -95.821278 71.569084 -95.722711 71.616021 -95.666387 71.658264 -95.502109 71.707547 -95.403542 71.754484 -95.337830 71.806114 -95.314362 71.862438 -95.206408 71.937537 -95.117228 71.949271 -95.037435 71.953965 # -b -96.410334 75.633803 -96.443190 75.640843 -96.518288 75.612681 -96.565225 75.584519 -96.607468 75.554010 -96.598081 75.532889 -96.630936 75.497686 -96.762359 75.481258 -96.752972 75.464830 -96.696648 75.450749 -96.771747 75.424934 -96.842152 75.424934 -96.950106 75.413200 -97.025205 75.434322 -97.015817 75.476565 -97.104997 75.500033 -97.137853 75.549316 -97.081529 75.568091 -96.950106 75.589213 -96.828071 75.622068 -96.738891 75.612681 -96.640324 75.638496 -96.508901 75.647884 -96.466658 75.685433 -96.452577 75.720635 -96.400947 75.708901 -96.363397 75.680739 -96.278911 75.657271 -96.175650 75.650230 -96.156876 75.612681 -96.124020 75.579825 -96.189731 75.549316 -96.297686 75.514114 -96.354010 75.539929 -96.485433 75.563397 -96.508901 75.600947 -96.508901 75.633803 # -b -97.689359 76.002256 -97.661197 75.990521 -97.689359 75.978787 -97.689359 75.955319 -97.661197 75.924810 -97.689359 75.880220 -97.773845 75.861446 -97.933430 75.828590 -97.961592 75.795734 -97.877106 75.800428 -97.783232 75.774613 -97.689359 75.772266 -97.623648 75.767572 -97.520387 75.776959 -97.492225 75.720635 -97.520387 75.654924 -97.520387 75.586866 -97.543855 75.521154 -97.534468 75.490646 -97.487531 75.450749 -97.487531 75.436668 -97.543855 75.471871 -97.600179 75.521154 -97.642422 75.577478 -97.731602 75.626762 -97.820782 75.645537 -97.886493 75.626762 -98.017916 75.633803 -98.074240 75.600947 -98.008529 75.598600 -97.928736 75.579825 -97.905268 75.537582 -97.928736 75.521154 -97.985060 75.556357 -98.074240 75.549316 -98.116483 75.535235 -98.116483 75.523501 -98.158726 75.507073 -98.116483 75.495339 -98.017916 75.469524 -98.107096 75.464830 -98.125870 75.439015 -98.083627 75.408506 -98.116483 75.403813 -98.215050 75.434322 -98.261987 75.408506 -98.304230 75.361570 -98.271374 75.328714 -98.182194 75.342795 -98.139951 75.319327 -98.060159 75.279430 -98.008529 75.253615 -97.872412 75.192598 -97.830169 75.157395 -97.905268 75.143314 -98.017916 75.159742 -98.116483 75.211372 -98.196275 75.227800 -98.294843 75.220760 -98.294843 75.187904 -98.261987 75.157395 -98.261987 75.133927 -98.172807 75.098724 -98.158726 75.049441 -98.337086 75.042400 -98.501364 75.030666 -98.632787 75.030666 -98.656255 75.070562 -98.745435 75.051787 -98.844002 75.023625 -98.966037 75.023625 -99.031749 75.044747 -99.008280 75.089337 -99.120929 75.075256 -99.153784 75.025972 -99.252351 75.033013 -99.341531 75.037706 -99.341531 75.086990 -99.397855 75.051787 -99.538665 75.030666 -99.604377 75.072909 -99.552746 75.122192 -99.585602 75.105765 -99.702944 75.037706 -99.773349 74.997810 # -b -100.062009 75.518808 -99.860182 75.518808 -99.850794 75.549316 # -b -100.050275 75.593906 -99.975176 75.612681 -99.745187 75.636149 -99.754574 75.657271 -99.843754 75.680739 -99.824979 75.713595 -99.731106 75.725329 -99.651313 75.737063 -99.557440 75.741757 -99.477647 75.741757 -99.411936 75.765225 -99.426017 75.786347 -99.482341 75.765225 -99.566827 75.769919 -99.660701 75.758185 -99.745187 75.751144 -99.759268 75.758185 -99.773349 75.765225 -99.843754 75.734716 # -b -100.083131 75.978787 -99.989258 75.974094 -99.885997 75.971747 -99.735799 76.004602 -99.717025 76.018683 -99.895384 76.006949 -99.970483 76.042152 # -b -100.094865 76.204083 -99.935280 76.204083 # -b -100.029154 76.645288 -99.935280 76.654676 -99.860182 76.661716 -99.766308 76.661716 -99.719371 76.642942 -99.681822 76.624167 -99.559787 76.600699 -99.494075 76.572537 -99.409589 76.563149 -99.400202 76.563149 -99.390815 76.565496 -99.259392 76.542028 -99.146744 76.542028 -99.109194 76.539681 -99.156131 76.499785 -99.118582 76.471623 -99.090420 76.499785 -99.024708 76.502132 -98.883898 76.481010 -98.818187 76.523253 -98.921448 76.579577 -98.958997 76.600699 -98.893285 76.626514 -98.743088 76.621820 -98.611665 76.614780 -98.536567 76.664063 -98.611665 76.671104 -98.724313 76.675797 -98.836961 76.689878 -98.714926 76.696919 -98.508405 76.687532 -98.395756 76.642942 -98.283108 76.612433 -98.170460 76.593658 -98.292496 76.610086 -98.405144 76.603045 -98.339432 76.579577 -98.217397 76.563149 -98.123524 76.565496 -97.982713 76.551415 -97.851291 76.513866 -97.776192 76.485704 -97.766805 76.431726 -97.823129 76.382443 -97.823129 76.347240 -97.823129 76.307344 -97.757417 76.276835 -97.682319 76.232245 -97.644769 76.166534 -97.710481 76.117251 -97.701093 76.086742 -97.719868 76.053886 -97.710481 76.016337 -97.691706 76.002256 # -b -95.065597 77.933701 -95.074985 77.936048 -95.121921 77.943088 -95.290894 77.943088 -95.422316 77.921967 -95.572514 77.914926 -95.750873 77.893805 -95.957395 77.867990 -96.192078 77.860949 -96.295339 77.877377 -96.436149 77.914926 -96.501860 77.896152 -96.595734 77.875030 -96.717769 77.849215 -96.661445 77.856255 -96.614509 77.842174 -96.614509 77.823400 -96.633283 77.816359 -96.736544 77.792891 -96.811643 77.760035 -96.943066 77.769423 -97.177749 77.792891 -97.224686 77.818706 -97.177749 77.844521 -97.065101 77.898498 -97.121425 77.917273 -97.252848 77.943088 -97.403045 77.987678 -97.478144 78.011147 -97.637729 78.029921 -97.750377 78.062777 -97.694053 78.093286 -97.665891 78.112060 -97.468757 78.116754 -97.205911 78.100326 -96.943066 78.102673 -96.755319 78.140222 -96.867967 78.144916 -96.821030 78.187159 -97.027552 78.198893 -97.205911 78.229402 -97.384271 78.248177 -97.543855 78.234096 -97.750377 78.243483 -97.872412 78.257564 -97.909962 78.278686 -97.919349 78.278686 -97.938124 78.281033 -97.872412 78.283379 -97.769151 78.299807 -97.797313 78.332663 -97.985060 78.342050 -98.022610 78.384293 -98.041384 78.426536 -98.013222 78.471126 -98.144645 78.478167 -98.285455 78.534491 -98.360554 78.572040 -98.313617 78.583774 -98.229131 78.588468 -98.125870 78.602549 -98.069546 78.630711 -98.097708 78.675301 -98.219744 78.691729 -98.276068 78.738665 -98.294843 78.764481 -98.294843 78.827845 -98.266681 78.839579 -98.276068 78.865395 -98.154032 78.893557 -97.956898 78.919372 -97.778539 78.914678 -97.609567 78.905291 -97.403045 78.898250 -97.196524 78.863048 -97.027552 78.839579 -96.905516 78.823151 -96.774093 78.790296 -96.642671 78.764481 -96.445536 78.757440 -96.295339 78.733972 -96.173304 78.698769 -96.060655 78.691729 -95.985557 78.663567 -96.041881 78.616630 -96.041881 78.579081 -96.070043 78.543878 -95.966782 78.539184 -95.816585 78.534491 -95.685162 78.553265 -95.525577 78.557959 -95.356605 78.525103 -95.187633 78.506329 -95.084372 78.494595 -95.084372 78.494595 -94.999886 78.450005 -94.952949 78.438271 -94.877851 78.419496 -94.812139 78.388987 -94.783977 78.360825 -94.793365 78.332663 -94.877851 78.323276 -94.990499 78.306848 -94.999886 78.297460 -94.999886 78.128488 -94.999886 78.128488 -94.990499 78.105020 -94.981111 78.116754 -94.859076 78.097979 -94.783977 78.074511 -94.802752 78.044002 -94.802752 78.013493 -94.868463 77.982984 -94.924787 77.954822 -94.943562 77.926660 -94.999886 77.917273 -95.065597 77.933701 # -b -100.029154 78.724584 -99.963442 78.698769 -99.897731 78.672954 -99.841407 78.698769 -99.775696 78.689382 -99.700597 78.668260 -99.681822 78.637751 -99.766308 78.614283 -99.775696 78.567346 -99.869569 78.532144 -99.972830 78.496941 -99.954055 78.466433 -99.907118 78.433577 -99.925893 78.403068 -99.925893 78.370212 -99.803858 78.365519 -99.672435 78.349091 -99.606723 78.281033 -99.494075 78.252871 -99.353265 78.191853 -99.231230 78.154303 -99.118582 78.112060 -99.034096 78.072164 -99.090420 78.032268 -99.203068 77.980638 -99.165518 77.931354 -99.259392 77.872683 -99.372040 77.867990 -99.550399 77.849215 -99.794470 77.853909 -99.935280 77.835134 # -b -98.341779 80.027078 -98.332392 79.982488 -98.276068 79.951979 -98.238518 79.919123 -98.266681 79.876880 -98.266681 79.832291 -98.238518 79.787701 -98.266681 79.743111 -98.313617 79.693827 -98.360554 79.653931 -98.426265 79.618729 -98.548301 79.632810 -98.632787 79.668012 -98.773597 79.707908 -98.914407 79.745458 -98.886245 79.768926 -98.905020 79.808822 -99.036442 79.834637 -99.167865 79.834637 -99.364999 79.827597 -99.533971 79.839331 -99.533971 79.862799 -99.543359 79.900349 -99.533971 79.935551 -99.533971 79.959020 # -b -89.970618 78.499288 -90.055104 78.543878 -90.120816 78.560306 -90.195915 78.553265 -90.214689 78.480514 -90.083266 78.426536 # -b -89.904907 78.227055 -90.130203 78.245830 -90.271013 78.236443 -90.411823 78.231749 -90.430598 78.234096 -90.468147 78.241136 -90.618345 78.241136 -90.599570 78.224709 -90.496309 78.196546 -90.317950 78.184812 -90.195915 78.166038 -90.130203 78.100326 -90.177140 78.072164 -90.336725 78.076858 -90.524471 78.065124 -90.806092 78.069817 -91.012613 78.088592 -91.172198 78.102673 -91.266071 78.102673 -91.350557 78.109714 -91.510142 78.109714 -91.660340 78.147263 -91.838699 78.151957 -92.007671 78.151957 -92.092157 78.201240 -92.176643 78.220015 -92.242355 78.234096 -92.214193 78.248177 -92.139094 78.262258 -92.148481 78.285726 -92.204805 78.295114 -92.223580 78.262258 -92.298679 78.259911 -92.355003 78.255217 -92.458264 78.266952 -92.495813 78.292767 -92.523975 78.295114 -92.580299 78.313888 -92.730496 78.337357 -92.833757 78.386640 -92.833757 78.424190 -92.843145 78.440617 -92.768046 78.438271 -92.646010 78.440617 -92.458264 78.459392 -92.401940 78.457045 -92.289291 78.459392 -92.101545 78.461739 -91.923185 78.468779 -91.754213 78.475820 -91.688502 78.480514 -91.650952 78.496941 -91.688502 78.508676 -91.791762 78.515716 -91.960735 78.506329 -92.092157 78.527450 -92.242355 78.546225 -92.345615 78.553265 -92.420714 78.548572 -92.570912 78.579081 -92.664785 78.569693 -92.749271 78.562653 -92.833757 78.560306 -92.899469 78.553265 -92.965180 78.555612 -93.087215 78.590815 -93.105990 78.614283 -93.059053 78.635405 -93.190476 78.635405 -93.293737 78.679995 -93.331286 78.729278 -93.237413 78.743359 -93.105990 78.722238 -92.899469 78.719891 -92.711722 78.715197 -92.739884 78.752746 -92.908856 78.764481 -93.021504 78.794989 -93.115377 78.804377 -93.265575 78.804377 -93.443934 78.797336 -93.519033 78.825498 -93.556582 78.863048 -93.725555 78.912331 -93.772491 78.959268 -93.556582 79.006205 -93.359448 79.015592 -93.274962 79.027326 -93.190476 79.048448 -93.096603 79.088344 -92.918243 79.125893 -92.702334 79.121200 -92.589686 79.121200 -92.458264 79.132934 -92.345615 79.142321 -92.035833 79.137627 -91.848086 79.142321 -91.660340 79.147015 -91.378719 79.168136 -91.068937 79.184564 -90.787317 79.191605 -90.524471 79.198645 -90.383661 79.200992 -90.327337 79.208032 -90.271013 79.240888 -90.186527 79.271397 -90.214689 79.269050 -90.402436 79.243235 -90.665282 79.238541 -90.937514 79.229154 -91.228522 79.222113 -91.359945 79.198645 -91.538304 79.205686 -91.660340 79.205686 -91.791762 79.198645 -91.951347 79.193951 -92.035833 79.203339 -92.054608 79.205686 -92.195418 79.217420 -92.279904 79.238541 -92.270517 79.264356 -92.082770 79.266703 -92.035833 79.287825 -91.895023 79.276091 -91.575854 79.283131 -91.341170 79.292518 -91.106487 79.308946 -91.022000 79.323027 -91.040775 79.337108 -91.284846 79.332415 -91.463205 79.323027 -91.650952 79.320681 -91.895023 79.315987 -92.082770 79.327721 -92.157869 79.346496 -92.110932 79.377005 -92.092157 79.402820 -92.279904 79.398126 -92.420714 79.388739 -92.552137 79.381698 -92.580299 79.372311 -92.589686 79.330068 -92.702334 79.327721 -92.749271 79.320681 -92.908856 79.308946 -92.983955 79.320681 -92.890081 79.374658 -92.852532 79.412207 -92.890081 79.442716 -92.965180 79.409860 -93.021504 79.358230 -93.096603 79.339455 -93.190476 79.332415 -93.228025 79.292518 -93.246800 79.276091 -93.425160 79.229154 -93.556582 79.226807 -93.669230 79.259663 -93.744329 79.259663 -93.734942 79.283131 -93.725555 79.313640 -93.678618 79.337108 -93.528420 79.353536 -93.472096 79.372311 -93.519033 79.377005 -93.594132 79.369964 -93.612906 79.369964 -93.659843 79.379351 -93.781879 79.393432 -93.856977 79.395779 -93.969625 79.400473 -94.101048 79.369964 -94.091661 79.353536 -94.072886 79.341802 -94.110436 79.318334 -94.166760 79.318334 -94.298182 79.301906 -94.467154 79.266703 -94.551641 79.229154 -94.626739 79.262010 -94.683063 79.287825 -94.701838 79.299559 -94.683063 79.315987 -94.767549 79.346496 -94.805099 79.379351 -94.823873 79.379351 -94.842648 79.384045 -94.908359 79.362924 -94.992846 79.362924 -95.002233 79.365270 -95.049170 79.386392 -95.067944 79.384045 -95.114881 79.381698 -95.199367 79.379351 -95.302628 79.402820 -95.377726 79.416901 -95.358952 79.454450 -95.396501 79.475572 -95.368339 79.503734 -95.246304 79.527202 -95.246304 79.527202 -95.002233 79.501387 -94.974071 79.494346 -94.927134 79.494346 -94.814486 79.510774 -94.636127 79.517815 -94.607965 79.534243 -94.373281 79.538936 -94.194922 79.538936 -93.997787 79.564751 -93.903914 79.583526 -93.885139 79.604648 -93.838203 79.623422 -93.819428 79.649237 -93.791266 79.663318 -93.885139 79.642197 -94.044724 79.616382 -94.119823 79.602301 -94.166760 79.588220 -94.326344 79.597607 -94.476542 79.618729 -94.598577 79.616382 -94.748775 79.618729 -94.927134 79.604648 -95.002233 79.597607 -95.077332 79.621075 -95.077332 79.621075 -95.161818 79.623422 -95.302628 79.642197 -95.452825 79.665665 -95.518537 79.703215 -95.649959 79.733724 -95.743833 79.780660 -95.837706 79.804129 -95.922192 79.818210 -95.865868 79.832291 -96.006678 79.844025 -96.072390 79.867493 -95.987904 79.876880 -95.678121 79.874534 -95.621797 79.898002 -95.668734 79.916777 -95.828319 79.919123 -96.016066 79.933204 -96.081777 79.973101 # -b -94.823873 80.003610 -94.730000 79.989529 # -b -94.349813 80.003610 -94.227777 79.994222 -94.162066 79.973101 -94.049418 79.949632 -94.068192 79.970754 # -b -95.065597 77.738914 -94.999886 77.727179 -94.990499 77.720139 -94.924787 77.720139 -94.849689 77.743607 -94.755815 77.738914 -94.652554 77.755341 -94.549294 77.752995 -94.549294 77.734220 -94.483582 77.734220 -94.314610 77.720139 -94.239511 77.734220 -94.164413 77.717792 -94.089314 77.715445 -93.986053 77.713098 -93.929729 77.694324 -93.835856 77.701364 -93.732595 77.701364 -93.666884 77.720139 -93.648109 77.734220 -93.601172 77.722486 -93.516686 77.696671 -93.375876 77.694324 -93.300777 77.680243 -93.272615 77.656774 -93.206904 77.621572 -93.235066 77.602797 -93.347714 77.593410 -93.441587 77.591063 -93.488524 77.569942 -93.441587 77.551167 -93.422813 77.515964 -93.460362 77.487802 -93.469750 77.461987 -93.432200 77.440866 -93.488524 77.419744 -93.526074 77.396276 -93.619947 77.391582 -93.666884 77.403316 -93.741982 77.398623 -93.845243 77.389235 -93.882792 77.389235 -93.967279 77.400969 -94.108089 77.398623 -94.258286 77.405663 -94.305223 77.419744 -94.370934 77.440866 -94.474195 77.431478 -94.596230 77.429131 -94.699491 77.429131 -94.727653 77.445559 -94.802752 77.443212 -94.868463 77.419744 -94.971724 77.415050 -94.999886 77.412704 -95.018661 77.431478 -95.018661 77.431478 -95.056210 77.433825 -95.206408 77.450253 -95.337830 77.447906 -95.572514 77.452600 -95.741486 77.494843 -95.882296 77.494843 -96.060655 77.548820 -96.135754 77.595757 -96.135754 77.621572 -96.192078 77.633306 -96.145142 77.680243 -95.957395 77.715445 -95.797810 77.731873 -95.628838 77.738914 -95.581901 77.762382 -95.553739 77.792891 -95.441091 77.792891 -95.375380 77.738914 -95.290894 77.745954 -95.197020 77.727179 -95.065597 77.738914 # -b -94.999886 76.211124 -94.990499 76.262754 -94.981111 76.286223 -94.859076 76.243980 -94.680716 76.243980 -94.446033 76.239286 -94.286448 76.211124 -94.108089 76.220511 -93.939117 76.206430 -93.817081 76.215818 -93.957891 76.234592 -93.939117 76.269795 -93.873405 76.279182 -93.807694 76.279182 -93.788919 76.265101 -93.648109 76.288570 -93.526074 76.312038 -93.497912 76.335506 -93.422813 76.356628 -93.244453 76.328466 -93.169355 76.241633 -93.075481 76.180615 -92.915896 76.121944 -92.831410 76.023377 -92.840798 75.950625 -92.746924 75.934197 -92.737537 75.934197 -92.531015 75.863792 -92.362043 75.784000 -92.343269 75.690127 -92.286945 75.605641 -92.155522 75.570438 -92.385512 75.504727 -92.653051 75.373304 -92.554484 75.354529 -92.587340 75.312286 -92.638970 75.237187 -92.662438 75.180863 -92.554484 75.105765 -92.286945 75.131580 -92.188378 75.126886 -92.254089 75.070562 -92.014712 75.098724 -91.944307 75.077603 -92.244702 75.051787 -92.352656 74.974342 -92.286945 74.854653 -92.310413 74.800676 -92.268170 74.784248 -92.235314 74.772514 -92.080423 74.725577 -91.892676 74.718537 -91.756560 74.695068 -91.878595 74.683334 -91.859821 74.643438 -91.756560 74.615276 -91.573507 74.622317 -91.418616 74.631704 -91.404535 74.716190 -91.315355 74.730271 -91.141689 74.795982 -91.010266 74.810063 -91.085365 74.770167 -91.198013 74.709149 -91.151076 74.690375 -91.075978 74.669253 -90.953942 74.617623 -90.911699 74.598848 -90.911699 74.730271 -90.723952 74.608236 -90.522125 74.605889 -90.587836 74.556605 -90.400089 74.544871 -90.334378 74.584767 -90.282747 74.514362 -90.127856 74.502628 # -b -89.937763 75.765225 -90.059798 75.784000 # -b -89.958884 75.849711 -90.062145 75.880220 -90.090307 75.910729 -90.193568 75.929504 -90.278054 75.884914 -90.343765 75.873180 -90.475188 75.903689 -90.615998 75.868486 -90.691097 75.859099 -90.681709 75.917770 -90.822519 75.901342 -90.944555 75.903689 -90.953942 75.915423 -91.057203 75.859099 -91.273112 75.786347 -91.413922 75.755838 -91.376373 75.849711 -91.226175 75.873180 -91.198013 75.894301 -91.310661 75.941238 -91.141689 75.955319 -90.878844 75.960013 -90.653547 75.969400 -90.550287 75.978787 -90.728646 76.009296 -90.963330 75.992868 -91.075978 76.025724 -91.019654 76.035111 -91.010266 76.053886 -91.085365 76.053886 -91.160464 76.084395 -91.395147 76.117251 -91.629831 76.112557 -91.714317 76.124291 -91.507795 76.175921 -91.629831 76.187656 -91.629831 76.201737 -91.601669 76.222858 -91.329436 76.147759 -91.066590 76.126638 -90.878844 76.133678 -90.644160 76.072661 -90.512737 76.072661 -90.681709 76.110210 -90.465801 76.114904 -90.268666 76.107863 # -b -89.958884 76.283876 -90.080920 76.295610 -90.221730 76.316732 -90.324990 76.335506 -90.456413 76.356628 -90.597223 76.363668 -90.681709 76.342547 -90.747421 76.370709 -90.850682 76.387137 -91.000879 76.403564 -91.085365 76.429380 -91.160464 76.434073 -91.263724 76.429380 -91.423309 76.434073 -91.582894 76.434073 -91.629831 76.462235 -91.629831 76.483357 -91.423309 76.478663 -91.310661 76.466929 -91.169851 76.466929 -91.104140 76.495091 -91.019654 76.462235 -90.869456 76.436420 -90.709871 76.427033 -90.559674 76.441114 -90.597223 76.469276 -90.615998 76.516213 -90.709871 76.551415 -90.897618 76.574883 -91.019654 76.605392 -91.188626 76.631207 -91.357598 76.642942 -91.470246 76.668757 -91.498408 76.671104 -91.517183 76.692225 -91.686155 76.701613 -91.714317 76.682838 -91.855127 76.675797 -91.949000 76.666410 -92.089810 76.649982 -92.258783 76.596005 -92.493466 76.579577 -92.606114 76.614780 -92.775086 76.579577 -92.953446 76.586618 -93.056707 76.596005 -93.178742 76.593658 -93.272615 76.551415 -93.347714 76.518559 -93.394651 76.492744 -93.479137 76.457542 -93.591785 76.427033 -93.648109 76.419992 -93.732595 76.408258 -93.704433 76.450501 -93.704433 76.471623 -93.713820 76.481010 -93.582398 76.539681 -93.497912 76.579577 -93.526074 76.628861 -93.469750 76.671104 -93.413425 76.739162 -93.479137 76.753243 -93.497912 76.802526 -93.610560 76.835382 -93.741982 76.903440 -93.807694 76.945683 -93.976666 76.931602 -94.070539 76.969152 -94.155025 76.931602 -94.248899 76.915175 -94.314610 76.915175 -94.399096 76.908134 -94.511744 76.955071 -94.652554 76.969152 -94.746428 76.994967 -94.877851 77.006701 -94.999886 77.030169 -94.999886 76.211124 -95.074985 76.267448 -95.168858 76.342547 -95.253344 76.354281 -95.337830 76.380096 -95.459866 76.382443 -95.600676 76.391830 -95.713324 76.394177 -96.060655 76.593658 -96.107592 76.586618 -96.192078 76.586618 -96.257790 76.617126 -96.323501 76.654676 -96.379825 76.645288 -96.483086 76.664063 -96.567572 76.678144 -96.586347 76.711000 -96.755319 76.725081 -96.896129 76.722734 -97.008777 76.748549 -96.999390 76.764977 -96.961840 76.816607 -96.896129 76.830688 -96.755319 76.793139 -96.623896 76.781405 -96.436149 76.772018 -96.323501 76.776711 -96.361050 76.793139 -96.567572 76.800180 -96.614509 76.818954 -96.454924 76.818954 -96.567572 76.844769 -96.680220 76.882319 -96.867967 76.896400 -96.905516 76.933949 -96.839805 76.959764 -96.896129 76.992620 -96.783481 76.990273 -96.633283 76.980886 -96.520635 77.009048 -96.511248 77.046597 -96.304726 77.065372 -96.088818 77.086493 -95.919845 77.093534 -95.750873 77.086493 -95.572514 77.081800 -95.450478 77.053638 -95.290894 77.048944 -95.168858 77.025476 -94.999886 77.030169 # -b -94.999886 75.657271 -95.032742 75.690127 -94.985805 75.636149 -94.873157 75.619722 -94.633780 75.589213 -94.446033 75.535235 -94.281754 75.511767 -94.291142 75.476565 -94.169106 75.474218 -94.079927 75.420241 -94.145638 75.342795 -93.948504 75.396772 -93.826468 75.340448 -93.840549 75.314633 -93.685658 75.279430 -93.587091 75.234841 -93.652803 75.206679 -93.662190 75.190251 -93.596479 75.126886 -93.605866 75.101071 -93.619947 75.068215 -93.652803 75.023625 -93.587091 74.934446 -93.540155 74.845266 -93.563623 74.763127 -93.587091 74.709149 -93.638722 74.671600 -93.793613 74.636398 -94.037684 74.641091 -94.267673 74.617623 -94.488276 74.636398 -94.732347 74.622317 -94.920094 74.666906 -94.952949 74.704456 -94.952949 74.704456 -94.985805 74.704456 -95.051516 74.711496 -95.107840 74.725577 -95.126615 74.744352 -95.150083 74.772514 -95.215795 74.803023 -95.295587 74.826491 -95.328443 74.819451 -95.403542 74.828838 -95.459866 74.807717 -95.427010 74.781901 -95.502109 74.774861 -95.567820 74.795982 -95.581901 74.812410 -95.591288 74.852306 -95.614757 74.861694 -95.666387 74.873428 -95.755567 74.873428 -95.802504 74.840572 -95.901071 74.861694 -95.943314 74.899243 -96.055962 74.953220 -96.055962 74.990770 -95.976169 75.033013 -96.041881 75.016585 -96.088818 75.056481 -96.145142 74.993117 -96.187385 74.962608 -96.276564 74.957914 -96.328195 75.018932 -96.417374 75.037706 -96.506554 75.126886 -96.530023 75.173823 -96.515942 75.216066 -96.407987 75.216066 -96.328195 75.234841 -96.384519 75.267696 -96.295339 75.279430 -96.107592 75.277084 -95.886990 75.288818 -95.957395 75.305246 -96.098205 75.312286 -95.877602 75.328714 -95.901071 75.349835 -96.065349 75.356876 -96.055962 75.382691 -95.957395 75.429628 -95.943314 75.399119 -95.802504 75.410853 -95.802504 75.457790 -95.966782 75.464830 -96.107592 75.420241 -96.121673 75.457790 -96.009025 75.485952 -95.854134 75.481258 -95.722711 75.469524 -95.722711 75.495339 -95.788423 75.565744 -95.722711 75.582172 -95.549045 75.615028 -95.412929 75.645537 -95.337830 75.666658 -95.140696 75.680739 -95.084372 75.690127 # -b -95.070291 74.073157 -94.999886 74.047342 -94.990499 74.077851 -94.835608 74.110707 -94.727653 74.068464 -94.507051 74.080198 -94.338079 74.091932 -94.173800 74.110707 -93.634028 74.171724 -93.488524 74.171724 -93.225679 74.143562 -92.962833 74.122441 -92.897122 74.110707 -92.883041 74.070810 -92.793861 74.040301 -92.742231 74.094279 -92.540403 74.077851 -92.399593 74.005099 -92.310413 73.955815 -92.178990 73.986324 -92.132053 74.016833 -92.047567 74.019180 -92.047567 74.023874 -91.944307 74.019180 -91.723704 74.019180 -91.592281 74.016833 -91.371679 74.009793 -91.216788 73.993365 -91.029041 73.976937 -90.733340 73.946428 -90.569061 73.915919 -90.423558 73.906532 -90.334378 73.901838 -90.348459 73.871329 -90.437639 73.845514 -90.470494 73.775109 -90.536206 73.692970 -90.658241 73.641340 -90.756808 73.580322 -90.874150 73.568588 -90.996185 73.561547 -91.094752 73.587362 -91.141689 73.540426 -91.019654 73.519304 -91.029041 73.462980 -91.094752 73.416043 -91.132302 73.380841 -91.207400 73.324517 -91.230869 73.272886 -91.470246 73.244724 -91.606362 73.216562 -91.428003 73.197788 -91.517183 73.096874 -91.625137 73.045243 -91.723704 72.951370 -91.859821 72.871578 -91.902064 72.864537 -91.902064 72.857497 -92.066342 72.770664 -92.188378 72.711993 -92.366737 72.704952 -92.408980 72.707299 -92.638970 72.758929 -92.840798 72.723727 -93.080175 72.747195 -93.249147 72.789438 -93.291390 72.796479 -93.455669 72.791785 -93.634028 72.770664 -93.929729 72.749542 -94.262980 72.747195 -94.394403 72.733114 -94.248899 72.714340 -94.216043 72.690871 -93.976666 72.690871 -93.896874 72.672097 -93.774838 72.589957 -93.624641 72.540674 -93.521380 72.460881 -93.634028 72.428026 -93.666884 72.406904 -93.699739 72.357621 -93.765451 72.310684 -93.864018 72.301297 -93.962585 72.256707 -93.995441 72.205076 -94.042377 72.167527 -94.150332 72.146406 -94.173800 72.129978 -94.150332 72.115897 -94.173800 72.078347 -94.262980 72.052532 -94.394403 72.040798 -94.427258 72.007942 -94.582149 72.022023 -94.638473 72.014983 -94.727653 72.005595 -94.835608 72.005595 -94.910706 72.005595 -94.990499 71.986821 -94.999886 72.005595 -95.004580 72.014983 -95.004580 72.014983 -95.037435 72.010289 -95.126615 72.000902 -95.225182 72.029064 -95.215795 72.076000 -95.117228 72.120590 -94.952949 72.144059 -94.995192 72.167527 -95.126615 72.153446 -95.215795 72.183955 -95.225182 72.263747 -95.225182 72.331806 -95.225182 72.406904 -95.182939 72.467922 -95.028048 72.510165 -94.938868 72.559449 -95.140696 72.535980 -95.248651 72.526593 -95.281506 72.557102 -95.337830 72.599345 -95.403542 72.632200 -95.525577 72.653322 -95.614757 72.690871 -95.647613 72.730767 -95.591288 72.754236 -95.657000 72.805866 -95.680468 72.855150 -95.689856 72.911474 -95.680468 72.963104 -95.680468 73.005347 -95.680468 73.047590 -95.680468 73.092180 -95.666387 73.117995 -95.600676 73.134423 -95.647613 73.171972 -95.624144 73.190747 -95.624144 73.235337 -95.624144 73.286967 -95.633532 73.340945 -95.657000 73.406656 -95.689856 73.462980 -95.699243 73.549813 -95.666387 73.589709 -95.666387 73.622565 -95.689856 73.664808 -95.713324 73.700010 -95.680468 73.735213 -95.591288 73.763375 -95.511496 73.793884 -95.459866 73.775109 -95.380073 73.770415 -95.290894 73.742253 -95.206408 73.730519 -95.150083 73.707051 -95.150083 73.707051 -94.999886 73.648380 -94.924787 73.657767 -94.859076 73.624912 -94.769896 73.608484 -94.624392 73.627258 -94.713572 73.667155 -94.877851 73.676542 -94.990499 73.702357 -94.990499 73.730519 -94.999886 73.735213 -95.037435 73.840820 -95.037435 73.840820 -95.060904 73.840820 -95.150083 73.840820 -95.272119 73.866636 -95.328443 73.885410 -95.403542 73.904185 -95.403542 73.955815 -95.403542 74.002752 -95.394154 74.030914 -95.281506 74.044995 -95.173552 74.066117 -95.070291 74.073157 # -b -94.999886 71.937537 -95.037435 71.953965 -94.999886 71.944578 -94.877851 71.939884 -94.704185 71.956312 -94.615005 71.932844 -94.507051 71.895294 -94.539906 71.850704 -94.591537 71.827236 -94.624392 71.775606 -94.591537 71.738056 -94.450727 71.775606 -94.450727 71.714588 -94.436646 71.672345 -94.272367 71.721628 -94.216043 71.773259 -94.042377 71.702854 -93.887486 71.723975 -93.732595 71.747444 -93.741982 71.686426 -93.798306 71.599593 -93.709127 71.529188 -93.521380 71.519801 -93.291390 71.407152 -93.159967 71.336747 -93.047319 71.292158 -92.995689 71.195937 -92.939365 71.104411 -92.939365 71.036353 -92.929977 70.982375 -92.948752 70.848606 -93.014463 70.855646 -93.005076 70.799322 -92.793861 70.785241 -92.742231 70.660859 -92.676519 70.672593 -92.474691 70.667899 -92.343269 70.613922 -92.333881 70.609229 -92.333881 70.588107 -92.319800 70.522396 -92.301026 70.484846 -92.146134 70.400360 -92.089810 70.336996 -92.066342 70.292406 -92.066342 70.273631 -92.014712 70.273631 -91.934919 70.311180 -91.911451 70.341689 -91.794109 70.304140 -91.770641 70.231388 -91.747173 70.193839 -91.625137 70.177411 -91.559426 70.130474 -91.573507 70.121087 -91.657993 70.111699 -91.780028 70.107006 -91.892676 70.102312 -92.047567 70.125780 -92.211846 70.158636 -92.333881 70.175064 -92.455917 70.163330 -92.432448 70.144555 -92.441836 70.107006 -92.507547 70.083537 -92.498160 70.069456 -92.155522 70.050682 # -b -89.958884 71.308585 -90.038677 71.343788 -90.127856 71.418887 -90.113775 71.529188 -90.127856 71.651223 # -b -89.949497 71.761525 -90.071532 71.836623 -90.193568 71.963352 -90.071532 72.054879 # -b -89.970618 72.169874 -90.045717 72.367008 # -b -110.068914 72.540674 -109.979735 72.564142 # -b -110.003203 72.653322 -109.914023 72.695565 # -b -110.068914 72.974838 -109.881168 72.951370 -109.848312 72.906780 -109.824844 72.890352 -109.702808 72.899740 -109.618322 72.897393 -109.627709 72.859843 -109.571385 72.824641 -109.482206 72.780051 -109.341395 72.747195 -109.242828 72.765970 -109.120793 72.730767 -109.120793 72.707299 -108.965902 72.674443 -108.989370 72.641588 -109.041001 72.625160 -109.008145 72.622813 -108.843866 72.606385 -108.712444 72.524246 -108.712444 72.437413 -108.735912 72.355274 -108.712444 72.294256 -108.670201 72.244973 -108.581021 72.193342 -108.566940 72.106509 -108.548165 72.031411 -108.501229 72.010289 -108.383887 71.984474 -108.280626 71.946925 -108.416742 71.864785 -108.402661 71.796727 -108.402661 71.766218 -108.402661 71.733363 -108.304094 71.728669 -108.196140 71.681732 -108.125735 71.648876 -108.027168 71.655917 -107.994312 71.672345 -107.975537 71.702854 -107.886358 71.721628 -107.740854 71.738056 -107.600044 71.796727 -107.576575 71.855398 -107.421684 71.878866 -107.421684 71.911722 -107.534332 71.961006 -107.642287 72.007942 -107.698611 72.073654 -107.684530 72.132325 -107.773710 72.162833 -107.830034 72.256707 -107.853502 72.327112 -107.862889 72.345887 -107.797178 72.350580 -107.830034 72.397517 -107.820646 72.458535 -107.895745 72.498431 -107.905132 72.564142 -107.905132 72.606385 -107.942682 72.674443 -107.961456 72.711993 -107.975537 72.723727 -108.050636 72.803519 -108.125735 72.911474 -108.172672 72.988919 -108.228996 73.024122 -108.149203 73.024122 -108.125735 73.089833 -108.205527 73.092180 -108.271239 73.150851 -108.196140 73.176666 -108.017780 73.179013 -107.975537 73.209522 -108.172672 73.263499 -108.163284 73.312783 -108.083492 73.308089 -108.092879 73.340945 -107.975537 73.340945 -107.830034 73.322170 -107.707998 73.317476 -107.576575 73.303395 -107.553107 73.270540 -107.365360 73.214216 -107.224550 73.176666 -107.003948 73.160238 -106.947624 73.146157 -106.914768 73.155545 -106.891300 73.190747 -106.989867 73.200135 -107.022722 73.242378 -107.022722 73.270540 -106.938236 73.279927 -106.825588 73.272886 -106.736408 73.254112 -106.694165 73.223603 -106.595598 73.214216 -106.548662 73.200135 -106.506419 73.150851 -106.473563 73.115648 -106.384383 73.075752 -106.196636 73.045243 -106.098069 73.021775 -105.943178 72.995960 -105.933791 72.960757 -105.868079 72.951370 -105.703801 72.918514 -105.656864 72.897393 -105.558297 72.871578 -105.525442 72.841069 -105.394019 72.805866 -105.370550 72.773011 -105.445649 72.737808 -105.492586 72.697912 -105.379938 72.697912 -105.337695 72.655669 -105.281371 72.604038 -105.281371 72.543021 -105.304839 72.510165 -105.271983 72.484350 -105.239128 72.460881 -105.215659 72.411598 -105.215659 72.402211 -105.192191 72.371702 -105.159335 72.327112 -105.107705 72.270788 -105.093624 72.214464 -105.093624 72.151099 -105.074849 72.066613 -105.074849 72.014983 -105.018525 71.993861 -104.985669 71.944578 -104.952814 71.885907 -104.929345 71.862438 -104.919958 71.857745 -104.633644 71.745097 -104.511609 71.674692 -104.445897 71.627755 -104.413042 71.585512 -104.445897 71.540922 -104.389573 71.503373 -104.380186 71.442355 -104.380186 71.400112 -104.413042 71.407152 -104.544464 71.376644 -104.544464 71.308585 -104.520996 71.263996 -104.520996 71.224099 -104.600789 71.153694 -104.530383 71.076249 -104.413042 71.038699 -104.267538 71.015231 -104.211214 70.961254 -104.070404 70.888502 -103.981224 70.839218 -103.938981 70.801669 -103.835720 70.785241 -103.638586 70.768813 -103.582262 70.719530 -103.497776 70.656165 -103.394515 70.632697 -103.286561 70.628003 -103.197381 70.623310 -103.089427 70.583413 -103.009634 70.609229 -103.009634 70.660859 -102.943923 70.679634 -102.746789 70.649125 -102.634141 70.616269 -102.681077 70.566985 -102.582510 70.529436 -102.347827 70.470765 -102.183548 70.405054 -101.986414 70.341689 -101.808055 70.308834 -101.587452 70.308834 -101.498272 70.266591 -101.531128 70.214960 -101.512353 70.158636 -101.343381 70.146902 -101.226040 70.177411 -101.179103 70.151596 -101.024212 70.170370 -100.939726 70.158636 -100.902176 70.092925 -100.859933 70.013132 # -b -104.973935 73.080446 -104.973935 73.120342 -104.908224 73.176666 -104.734558 73.261152 -104.645378 73.364413 -104.603135 73.453593 -104.589054 73.519304 -104.546811 73.556853 -104.621910 73.603790 -104.753333 73.608484 -104.865981 73.676542 -105.077196 73.714091 -105.250862 73.742253 -105.447996 73.753988 -105.626355 73.742253 -105.804715 73.725826 -105.978381 73.735213 -106.180209 73.721132 -106.433667 73.723479 -106.630801 73.692970 -106.729368 73.646033 -106.818548 73.589709 -107.025069 73.509917 -107.062619 73.458286 -106.982826 73.441859 -106.804467 73.432471 -106.705900 73.399615 -106.583864 73.387881 -106.475910 73.340945 -106.353874 73.303395 -106.245920 73.279927 -106.189596 73.244724 -106.076948 73.188400 -105.959606 73.160238 -105.856345 73.101567 -105.771859 73.066365 -105.739004 73.014735 -105.626355 72.974838 -105.462077 72.918514 -105.363510 72.883312 -105.316573 72.902086 -105.316573 72.925555 -105.218006 72.927902 -105.152295 72.960757 -105.053728 72.995960 -104.988016 73.047590 -104.973935 73.080446 # -b -99.989258 71.881213 -100.036194 71.895294 -100.111293 71.953965 -100.191085 72.007942 -100.200473 72.052532 -100.313121 72.092428 -100.444544 72.106509 -100.543111 72.085388 -100.641678 72.066613 -100.716776 72.137018 -100.852893 72.200383 -100.974928 72.200383 -101.017171 72.153446 -101.181450 72.169874 -101.448989 72.174568 -101.500619 72.228545 -101.514700 72.254360 -101.688366 72.308337 -101.711834 72.345887 -101.843257 72.378742 -102.054472 72.430373 -102.120184 72.477309 -102.260994 72.524246 -102.415885 72.592304 -102.429966 72.641588 -102.439353 72.697912 -102.406498 72.812907 -102.340786 72.899740 -102.176508 72.944329 -102.021617 72.944329 -101.941824 72.953717 -101.899581 72.932595 -101.786933 72.899740 -101.655510 72.876271 -101.636736 72.866884 -101.678979 72.829335 -101.580412 72.796479 -101.514700 72.789438 -101.369197 72.780051 -101.280017 72.747195 -101.270629 72.688524 -101.195531 72.653322 -101.139207 72.604038 -100.805956 72.596998 -100.683921 72.622813 -100.641678 72.648628 -100.552498 72.648628 -100.519642 72.636894 -100.388219 72.653322 -100.289652 72.674443 -100.177004 72.716686 -100.275571 72.773011 -100.313121 72.864537 -100.242716 72.864537 -100.111293 72.805866 -100.036194 72.822294 -100.022113 72.897393 -100.101906 72.934942 -100.177004 72.941983 -100.275571 72.937289 -100.313121 72.998307 -100.411688 73.010041 -100.411688 73.082793 -100.430463 73.146157 -100.397607 73.164932 -100.233328 73.176666 -100.101906 73.146157 -100.003339 73.120342 # -b -99.890690 73.129729 -100.036194 73.188400 -100.158230 73.244724 -100.289652 73.303395 -100.355364 73.272886 -100.388219 73.225950 -100.552498 73.207175 -100.754326 73.197788 -100.885749 73.228297 -101.040640 73.251765 -101.181450 73.336251 -101.326954 73.345638 -101.369197 73.427778 -101.345728 73.481755 -101.162675 73.493489 -100.984316 73.484102 -100.852893 73.451246 -100.805956 73.411350 -100.632290 73.380841 -100.585354 73.416043 -100.665146 73.479408 -100.651065 73.526345 -100.773100 73.533385 -100.895136 73.540426 -100.993703 73.585015 -101.148594 73.587362 -101.181450 73.622565 -101.228386 73.653074 -101.162675 73.690623 -101.040640 73.725826 -100.885749 73.761028 -100.707389 73.779803 -100.608822 73.744600 -100.486787 73.735213 -100.364751 73.725826 -100.266184 73.711745 -100.191085 73.690623 -100.144149 73.723479 -100.144149 73.761028 -100.299040 73.772762 -100.378832 73.789190 -100.453931 73.824393 -100.275571 73.864289 -100.092518 73.885410 # -b -99.775696 74.997810 -100.005685 75.002504 -100.216901 74.995463 -100.446890 75.025972 -100.587700 75.070562 -100.587700 75.105765 -100.587700 75.112805 -100.601781 75.145661 -100.611169 75.185557 -100.667493 75.225453 -100.644025 75.244228 -100.521989 75.255962 -100.390566 75.241881 -100.235675 75.246575 -100.137108 75.267696 -100.291999 75.279430 -100.423422 75.279430 -100.367098 75.335754 -100.348323 75.349835 -100.489133 75.345142 -100.658106 75.321673 -100.723817 75.373304 -100.667493 75.382691 -100.503214 75.408506 -100.554845 75.422587 -100.634637 75.443709 -100.756673 75.464830 -100.620556 75.467177 -100.423422 75.476565 -100.249756 75.467177 -100.179351 75.495339 -100.259144 75.507073 -100.062009 75.518808 # -b -99.850794 75.549316 -100.062009 75.544623 -100.259144 75.530542 -100.202819 75.549316 -100.005685 75.572785 -100.047928 75.593906 # -b -99.841407 75.734716 -100.019766 75.739410 -100.188738 75.725329 -100.310774 75.706554 -100.357711 75.701861 -100.479746 75.708901 -100.611169 75.694820 -100.733204 75.678392 -100.841159 75.661965 -101.010131 75.650230 -101.150941 75.638496 -101.296445 75.638496 -101.502966 75.647884 -101.606227 75.610334 -101.723569 75.633803 -101.789280 75.626762 -101.901928 75.589213 -102.033351 75.577478 -102.211710 75.577478 -102.352520 75.577478 -102.432313 75.565744 -102.507412 75.537582 -102.652915 75.554010 -102.751482 75.572785 -102.826581 75.636149 -102.784338 75.645537 -102.671690 75.645537 -102.699852 75.683086 -102.652915 75.722982 -102.512105 75.734716 -102.390070 75.722982 -102.268034 75.713595 -102.127224 75.701861 -102.174161 75.739410 -102.277422 75.755838 -102.221098 75.795734 -102.343133 75.795734 -102.324358 75.856752 -102.070900 75.896648 -101.948865 75.898995 -101.808055 75.866139 -101.704794 75.842671 -101.610921 75.828590 -101.545209 75.786347 -101.366850 75.781653 -101.179103 75.795734 -101.019518 75.837977 -101.150941 75.826243 -101.319913 75.802775 -101.329300 75.847365 -101.366850 75.880220 -101.507660 75.896648 -101.648470 75.931851 -101.582759 75.974094 -101.432561 76.016337 -101.432561 76.042152 -101.648470 76.011643 -101.873766 75.997562 -101.901928 76.051539 -102.023964 76.105516 -102.023964 76.168881 -101.958252 76.218164 -102.080288 76.227552 -102.221098 76.222858 -102.211710 76.283876 -102.239872 76.328466 -102.136612 76.375402 -102.023964 76.405911 -102.061513 76.415299 -101.995802 76.455195 -101.873766 76.476316 -101.770505 76.462235 -101.639083 76.462235 -101.545209 76.445807 -101.498272 76.443461 -101.423174 76.450501 -101.376237 76.429380 -101.366850 76.427033 -101.376237 76.405911 -101.366850 76.375402 -101.291751 76.382443 -101.197878 76.363668 -101.085230 76.342547 -101.141554 76.328466 -101.207265 76.288570 -101.104004 76.258061 -100.925645 76.204083 -100.812997 76.164187 -100.822384 76.147759 -100.756673 76.121944 -100.625250 76.138372 -100.512602 76.126638 -100.597088 76.112557 -100.625250 76.091435 -100.409341 76.056233 -100.230982 76.011643 -100.137108 75.990521 -100.099559 75.978787 # -b -99.972830 76.042152 -100.047928 76.075008 -100.113640 76.119597 -100.235675 76.192349 -100.094865 76.204083 # -b -99.939974 76.204083 -100.033847 76.241633 -100.193432 76.227552 -100.446890 76.227552 -100.615862 76.269795 -100.540764 76.293263 -100.334242 76.288570 -100.287306 76.321425 -100.127721 76.326119 -100.259144 76.342547 -100.409341 76.384790 -100.550151 76.377749 -100.719123 76.384790 -100.888095 76.419992 -101.038293 76.483357 -101.075842 76.499785 -101.057067 76.527947 -100.869321 76.534987 -100.794222 76.600699 -100.606475 76.638248 -100.475052 76.657023 -100.296693 76.657023 -100.155883 76.652329 -100.033847 76.645288 # -b -100.050275 78.736319 -100.069050 78.731625 -100.031501 78.724584 # -b -99.939974 77.835134 -100.024460 77.799931 -100.155883 77.816359 -100.259144 77.849215 -100.381179 77.844521 -100.559538 77.891458 -100.681574 77.914926 -100.690961 77.954822 -100.812997 78.008800 -100.869321 78.039309 -100.878708 78.069817 -100.878708 78.105020 -100.869321 78.126141 -100.972581 78.154303 -101.066455 78.184812 -101.075842 78.222362 -101.132166 78.231749 -101.197878 78.208281 -101.376237 78.203587 -101.479498 78.210628 -101.488885 78.241136 -101.554597 78.271645 -101.704794 78.271645 -101.826829 78.288073 -102.042738 78.297460 -102.268034 78.299807 -102.465169 78.271645 -102.643528 78.271645 -102.840662 78.304501 -102.878212 78.353784 -102.859437 78.384293 -103.009634 78.363172 -103.216156 78.351438 -103.432065 78.325622 -103.591649 78.327969 -103.770009 78.295114 -103.816946 78.278686 -103.723072 78.276339 -103.854495 78.250524 -104.070404 78.245830 -104.295700 78.259911 -104.445897 78.285726 -104.605482 78.306848 -104.718130 78.327969 -104.765067 78.339703 -104.830778 78.363172 -104.952814 78.405415 -104.962201 78.426536 -104.980976 78.461739 -104.990363 78.496941 -104.990363 78.525103 -104.896490 78.550919 -104.774454 78.562653 -104.567933 78.565000 -104.445897 78.553265 -104.229989 78.527450 -104.061016 78.508676 -103.901432 78.518063 -103.770009 78.508676 -103.591649 78.501635 -103.535325 78.548572 -103.432065 78.595508 -103.563487 78.609589 -103.816946 78.604896 -104.032854 78.616630 -103.995305 78.649486 -103.807558 78.656526 -103.619811 78.684688 -103.525938 78.722238 -103.507163 78.764481 -103.582262 78.757440 -103.666748 78.745706 -103.741847 78.757440 -103.854495 78.738665 -103.882657 78.780908 -103.901432 78.783255 -103.976530 78.785602 -104.070404 78.743359 -104.229989 78.757440 -104.267538 78.816111 -104.229989 78.830192 -104.192439 78.832539 -104.164277 78.832539 -104.126728 78.846620 -104.061016 78.870088 -104.023467 78.900597 -104.070404 78.945187 -104.154890 78.971002 -104.286313 78.975696 -104.380186 78.947534 -104.530383 78.935800 -104.633644 78.888863 -104.671194 78.846620 -104.736905 78.816111 -104.877715 78.806724 -105.009138 78.792643 -105.056075 78.806724 -105.103011 78.830192 -104.971588 78.851313 -104.943426 78.874782 -104.896490 78.909984 -104.840166 78.933453 -104.802616 78.956921 -104.793229 79.013245 -104.887102 79.010898 -105.027913 79.022632 -105.215659 78.999164 -105.431568 78.985083 -105.638090 78.989777 -105.656864 79.001511 -105.675639 79.041407 -105.703801 79.076610 -105.713188 79.118853 -105.741350 79.158749 -105.713188 79.186911 -105.647477 79.238541 -105.591153 79.280784 -105.544216 79.294865 -105.328307 79.273744 -105.046687 79.287825 -104.802616 79.297212 -104.624257 79.304253 -104.464672 79.327721 -104.220601 79.348843 -104.023467 79.337108 -103.816946 79.311293 -103.779396 79.294865 -103.854495 79.257316 -103.807558 79.264356 -103.629199 79.278437 -103.375741 79.273744 -103.310029 79.233848 -103.328804 79.189258 -103.338191 79.142321 -103.375741 79.074263 -103.385128 79.020286 -103.347579 79.017939 -103.263093 78.987430 -103.141057 78.954574 -103.084733 78.989777 -103.065958 79.027326 -103.065958 79.088344 -102.990860 79.128240 -102.831275 79.170483 -102.718627 79.198645 -102.530880 79.198645 -102.343133 79.184564 -102.239872 79.165789 -102.080288 79.114159 -101.920703 79.090691 -101.883153 79.060182 -101.892541 79.041407 -101.732956 79.060182 -101.695407 79.095384 -101.535822 79.060182 -101.507660 79.001511 -101.601533 78.938146 -101.610921 78.912331 -101.441948 78.893557 -101.451336 78.870088 -101.413786 78.860701 -101.282364 78.898250 -101.141554 78.914678 -101.000743 78.917025 -100.906870 78.942840 -100.784835 78.926412 -100.700349 78.909984 -100.615862 78.893557 -100.493827 78.893557 -100.418728 78.872435 -100.315468 78.858354 -100.249756 78.830192 -100.221594 78.802030 -100.296693 78.757440 -100.287306 78.738665 -100.221594 78.733972 -100.127721 78.745706 -100.071397 78.745706 -100.052622 78.736319 # -b -101.991108 77.947782 -101.981721 77.950129 -101.887847 77.954822 -101.765812 77.966557 -101.033599 77.842174 -100.920951 77.792891 -101.089923 77.790544 -101.305832 77.802278 -101.549903 77.790544 -101.718875 77.760035 -101.869072 77.750648 -102.113143 77.755341 -102.319665 77.795238 -102.498024 77.844521 -102.563736 77.867990 -102.610672 77.912579 -102.441700 77.931354 -102.263341 77.950129 -102.113143 77.950129 -101.991108 77.947782 # -b -105.023219 77.572288 -104.966895 77.553514 -104.919958 77.515964 -104.966895 77.461987 -104.938733 77.440866 -104.891796 77.429131 -104.769761 77.426785 -104.666500 77.417397 -104.666500 77.393929 -104.572627 77.365767 -104.478753 77.339952 -104.403654 77.337605 -104.356718 77.323524 -104.431816 77.285974 -104.582014 77.281281 -104.450591 77.271893 -104.291006 77.246078 -104.272232 77.220263 -104.272232 77.199142 -104.375492 77.156899 -104.497528 77.145164 -104.582014 77.109962 -104.788535 77.138124 -104.957507 77.178020 -105.135867 77.170980 -105.173416 77.224957 -105.257902 77.255466 -105.351776 77.300055 -105.464424 77.375154 -105.520748 77.389235 -105.605234 77.443212 -105.680333 77.492496 -105.652171 77.515964 -105.699107 77.544126 -105.755431 77.586369 -105.792981 77.621572 -105.839917 77.668509 -105.933791 77.713098 -106.008890 77.731873 -105.971340 77.764729 -105.896242 77.745954 -105.755431 77.741260 -105.577072 77.738914 -105.408100 77.701364 -105.323614 77.659121 -105.173416 77.633306 -105.107705 77.609838 -105.079543 77.574635 -105.023219 77.572288 # -b -104.009386 76.603045 -103.999999 76.596005 -103.943675 76.598352 -103.896738 76.628861 -103.802865 76.598352 -103.624505 76.570190 -103.586956 76.523253 -103.342885 76.497438 -103.277174 76.476316 -103.173913 76.450501 -103.080039 76.410605 -103.126976 76.380096 -103.202075 76.356628 -103.324110 76.347240 -103.455533 76.333159 -103.662054 76.316732 -103.831027 76.323772 -103.943675 76.328466 -104.131422 76.319078 -104.309781 76.330813 -104.281619 76.347240 -104.103259 76.351934 -104.122034 76.358975 -104.253457 76.375402 -104.375492 76.394177 -104.497528 76.419992 -104.441204 76.445807 -104.413042 76.499785 -104.413042 76.527947 -104.516302 76.495091 -104.572627 76.504478 -104.572627 76.537334 -104.619563 76.539681 -104.694662 76.556109 -104.694662 76.586618 -104.619563 76.612433 -104.544464 76.628861 -104.375492 76.657023 -104.215908 76.675797 -103.999999 76.673450 -103.953062 76.633554 -103.990611 76.617126 -103.999999 76.614780 -104.009386 76.603045 # -b -101.021865 76.739162 -100.946766 76.741509 -100.881055 76.748549 -100.749632 76.764977 -100.674533 76.743856 -100.552498 76.715694 -100.674533 76.687532 -100.852893 76.638248 -101.087576 76.603045 -101.322260 76.563149 -101.491232 76.563149 -101.632042 76.567843 -101.688366 76.581924 -101.678979 76.614780 -101.463070 76.642942 -101.294098 76.680491 -101.162675 76.725081 -101.031252 76.736815 -101.021865 76.739162 # -b -103.028409 76.323772 -103.000247 76.321425 -103.000247 76.323772 -102.925148 76.323772 -102.765563 76.323772 -102.699852 76.283876 -102.577817 76.248673 -102.605979 76.182962 -102.681077 76.145413 -102.859437 76.114904 -103.112895 76.084395 -103.338191 76.063273 -103.516551 76.060927 -103.704298 76.063273 -103.929594 76.056233 -103.995305 76.058580 -103.995305 76.082048 -104.061016 76.086742 -104.145503 76.058580 -104.276925 76.100823 -104.417735 76.103170 -104.464672 76.140719 -104.511609 76.178268 -104.445897 76.201737 -104.417735 76.239286 -104.258151 76.241633 -104.023467 76.248673 -103.723072 76.272142 -103.554100 76.297957 -103.366353 76.307344 -103.225543 76.321425 -103.131670 76.340200 -103.028409 76.323772 # -b -103.049531 76.070314 -102.965044 76.075008 -102.918108 76.075008 -102.777298 76.100823 -102.674037 76.105516 -102.523839 76.091435 -102.392417 76.079701 -102.420579 76.032765 -102.552001 76.002256 -102.730361 75.983481 -103.002594 75.962359 -103.256052 75.936544 -103.500123 75.922463 -103.706644 75.908382 -103.875616 75.903689 -103.931941 75.906035 -103.931941 75.931851 -103.922553 75.955319 -103.753581 75.976440 -103.565834 76.002256 -103.359313 76.030418 -103.199728 76.051539 -103.049531 76.070314 # -b -103.061265 75.917770 -102.995553 75.931851 -102.958004 75.943585 -102.864131 75.955319 -102.732708 75.964706 -102.526186 75.976440 -102.422926 75.995215 -102.263341 76.011643 -102.197629 75.990521 -102.122531 75.950625 -102.235179 75.929504 -102.413538 75.884914 -102.526186 75.842671 -102.582510 75.812162 -102.638834 75.774613 -102.742095 75.784000 -102.854743 75.788694 -102.995553 75.765225 -103.136363 75.748797 -103.324110 75.753491 -103.427371 75.774613 -103.399209 75.805121 -103.277174 75.845018 -103.220849 75.880220 -103.145751 75.908382 -103.061265 75.917770 # -b -104.086832 75.446056 -103.964796 75.427281 -103.964796 75.422587 -103.955409 75.420241 -103.931941 75.380344 -103.833373 75.347489 -103.777049 75.284124 -103.734806 75.239534 -103.636239 75.173823 -103.791130 75.103418 -103.988265 75.072909 -104.199480 75.049441 -104.471713 75.075256 -104.673540 75.084643 -104.861287 75.126886 -104.903530 75.180863 -104.772107 75.255962 -104.692315 75.305246 -104.640685 75.373304 -104.584361 75.429628 -104.420082 75.443709 -104.232335 75.453096 -104.086832 75.446056 # -b -110.043099 76.506825 -109.892902 76.511519 -109.817803 76.516213 -109.705155 76.556109 -109.705155 76.610086 -109.639444 76.638248 -109.564345 76.682838 -109.489246 76.734468 -109.451697 76.772018 -109.357823 76.816607 -109.198239 76.837729 -108.982330 76.830688 -108.794583 76.854157 -108.747646 76.825995 -108.634998 76.783752 -108.531737 76.743856 -108.541125 76.701613 -108.606836 76.675797 -108.728872 76.649982 -108.672547 76.598352 -108.559899 76.563149 -108.597449 76.532640 -108.569287 76.488051 -108.559899 76.455195 -108.512963 76.431726 -108.372153 76.427033 -108.278279 76.389483 -108.128082 76.347240 -108.109307 76.309691 -108.128082 76.283876 -108.137469 76.262754 -108.099920 76.241633 -108.240730 76.204083 -108.325216 76.164187 -108.409702 76.119597 -108.531737 76.098476 -108.578674 76.098476 -108.578674 76.093782 -108.466026 76.091435 -108.362765 76.072661 -108.250117 76.079701 -108.165631 76.077354 -108.043596 76.082048 -107.930948 76.093782 -107.790137 76.070314 -107.696264 76.032765 -107.602391 76.013990 -107.630553 75.985828 -107.696264 75.936544 -107.855849 75.934197 -107.930948 75.891954 -108.024821 75.847365 -107.987272 75.805121 -107.884011 75.842671 -107.799525 75.896648 -107.668102 75.915423 -107.480355 75.931851 -107.330158 75.920116 -107.151798 75.917770 -107.114249 75.898995 -107.086087 75.861446 -107.001601 75.793387 -106.926502 75.734716 -106.870178 75.704208 -106.813854 75.769919 -106.776305 75.812162 -106.682431 75.814509 -106.766917 75.840324 -106.795079 75.906035 -106.851403 75.969400 -106.738755 76.011643 -106.663657 76.065620 -106.475910 76.053886 -106.297550 76.053886 -106.269388 76.049192 -106.091029 76.032765 -105.865733 75.978787 -105.677986 75.931851 -105.565338 75.849711 -105.462077 75.795734 -105.480852 75.739410 -105.443302 75.706554 -105.438609 75.636149 -105.494933 75.570438 -105.673292 75.530542 -105.692067 75.476565 -105.739004 75.406160 -105.781247 75.331061 -105.870426 75.286471 -105.912669 75.225453 -105.978381 75.155048 -106.067560 75.105765 -106.123885 75.065868 -106.288163 75.072909 -106.419586 75.061175 -106.475910 75.047094 -106.565090 75.037706 -106.762224 74.967301 -106.996907 74.946180 -107.217510 74.943833 -107.334851 74.962608 -107.480355 74.971995 -107.644634 75.009544 -107.743201 75.044747 -107.724426 75.108111 -107.776056 75.098724 -107.888705 75.061175 -108.052983 75.007198 -108.118694 74.971995 -108.395621 74.967301 -108.419089 74.967301 -108.681935 74.979036 -108.757034 74.990770 -108.714791 74.995463 -108.583368 75.035360 -108.738259 75.094030 -108.738259 75.133927 -108.780502 75.122192 -108.879069 75.112805 -108.944780 75.063522 -109.090284 75.009544 -109.310887 74.990770 -109.418841 74.957914 -109.508021 74.925058 -109.728623 74.906284 -109.949226 74.887509 # -b -110.064221 75.577478 -109.796682 75.570438 -109.468125 75.556357 -109.148955 75.535235 -108.979983 75.549316 -108.947127 75.570438 -108.914271 75.622068 -108.904884 75.671352 -108.914271 75.722982 -108.975289 75.767572 -109.041001 75.791040 -109.073856 75.828590 -109.092631 75.849711 -109.209973 75.840324 -109.266297 75.863792 -109.294459 75.906035 -109.374251 75.875527 -109.430575 75.915423 -109.341395 75.936544 -109.214666 75.978787 -109.200585 76.030418 -109.102018 76.039805 -109.120793 76.100823 -109.148955 76.161840 -109.205279 76.206430 -109.294459 76.222858 -109.313233 76.248673 -109.407107 76.253367 -109.449350 76.262754 # -b -110.075955 78.093286 -109.888208 78.074511 -109.831884 78.029921 -109.869433 77.964210 -109.963307 77.929007 # -b -110.019631 78.604896 -110.000856 78.581427 -109.860046 78.567346 -109.738011 78.574387 -109.709849 78.543878 -109.559651 78.511022 -109.550264 78.478167 -109.512714 78.459392 -109.503327 78.431230 -109.503327 78.377253 -109.559651 78.318582 -109.700461 78.302154 -109.935145 78.290420 # -b -120.017148 72.230892 -119.899807 72.256707 -119.852870 72.277828 -119.665123 72.294256 -119.477376 72.327112 -119.378809 72.350580 -119.355341 72.406904 -119.322485 72.467922 -119.289630 72.514859 -119.237999 72.564142 -119.223918 72.636894 -119.069027 72.690871 -118.848425 72.740155 -118.726389 72.758929 -118.576192 72.773011 -118.397832 72.838722 -118.233554 72.864537 -117.989483 72.911474 -117.726637 72.986573 -117.571746 73.021775 -117.491954 73.028816 -117.337063 73.054631 -117.205640 73.101567 -117.064830 73.134423 -116.942794 73.162585 -116.764435 73.207175 -116.600157 73.249418 -116.356086 73.279927 -116.168339 73.303395 -115.947736 73.331557 -115.849169 73.355026 -115.792845 73.371453 -115.741215 73.387881 -115.652035 73.401962 -115.520612 73.434818 -115.389190 73.472367 -115.389190 73.521651 -115.398577 73.580322 -115.530000 73.606137 -115.661422 73.655421 -115.759990 73.702357 -115.914881 73.721132 -116.060384 73.770415 -116.234050 73.845514 -116.412410 73.892451 -116.656481 73.955815 -116.755048 74.007446 -116.877083 74.044995 -116.952182 74.073157 -117.107073 74.129481 -117.271351 74.157643 -117.416855 74.218661 -117.557665 74.256210 -117.778268 74.277332 -117.989483 74.284372 -118.153761 74.298453 -118.332121 74.305494 -118.562111 74.277332 -118.862506 74.239782 -118.970460 74.211620 -119.026784 74.171724 -118.895361 74.122441 -118.993928 74.080198 -119.026784 74.030914 -119.223918 73.998058 -119.280242 74.059076 -119.158207 74.098972 -119.167594 74.134175 -119.158207 74.176418 -119.191063 74.216314 -119.336566 74.218661 -119.458602 74.228048 -119.557169 74.195193 -119.557169 74.171724 -119.697979 74.143562 -119.754303 74.080198 -119.796546 74.047342 -119.843483 74.091932 -119.852870 74.152950 -119.763690 74.185805 -119.688592 74.218661 -119.777771 74.242129 -119.909194 74.265598 # -b -117.369918 69.952115 -117.416855 70.024867 -117.252577 70.048335 -117.041362 70.092925 -116.576688 70.144555 -116.304455 70.182105 -115.994673 70.226694 -115.792845 70.245469 -115.473676 70.266591 -115.253073 70.285365 -115.088795 70.290059 -114.835337 70.297099 -114.624121 70.327608 -114.459843 70.346383 -114.239240 70.353423 -113.976395 70.311180 -113.633757 70.301793 -113.267651 70.290059 -113.014192 70.271284 -112.882770 70.247816 -112.741960 70.247816 -112.554213 70.252510 -112.408709 70.297099 -112.352385 70.327608 -112.418096 70.367505 -112.408709 70.398013 -112.253818 70.360464 -112.098927 70.374545 -112.131782 70.407401 -112.244431 70.466072 -112.366466 70.491887 -112.530744 70.498927 -112.741960 70.515355 -112.807671 70.557598 -113.014192 70.555251 -113.150309 70.574026 -113.291119 70.599841 -113.389686 70.639737 -113.553965 70.646778 -113.666613 70.656165 -113.798035 70.642084 -113.896602 70.674940 -113.943539 70.686674 -114.173529 70.667899 -114.351888 70.653818 -114.436375 70.653818 -114.549023 70.653818 -114.727382 70.620963 -114.858805 70.609229 -114.999615 70.609229 -115.201443 70.576373 -115.389190 70.555251 -115.473676 70.541170 -115.506531 70.536477 -115.652035 70.569332 -115.792845 70.574026 -115.938349 70.569332 -116.126096 70.599841 -116.201195 70.642084 -116.421797 70.623310 -116.609544 70.609229 -116.909939 70.595148 -117.116460 70.635044 -117.238496 70.660859 -117.383999 70.653818 -117.557665 70.639737 -117.590521 70.674940 -117.581134 70.700755 -117.660926 70.714836 -117.834592 70.733611 -117.890916 70.761773 -118.031726 70.815750 -118.111518 70.869727 -118.233554 70.928398 -118.308653 71.022272 -118.144374 71.078596 -117.956627 71.149001 -117.792349 71.172469 -117.557665 71.202978 -117.369918 71.207671 -117.182172 71.217059 -116.928713 71.259302 -116.675255 71.308585 -116.487508 71.343788 -116.290374 71.357869 -116.135483 71.378990 -116.158952 71.350828 -116.069772 71.341441 -115.816314 71.350828 -115.708359 71.376644 -115.774071 71.400112 -115.896106 71.414193 -116.083853 71.414193 -116.027529 71.435314 -115.905493 71.468170 -115.750602 71.482251 -115.675504 71.482251 -115.562855 71.508066 -115.539387 71.536228 -115.717747 71.536228 -115.905493 71.526841 -116.191807 71.503373 -116.323230 71.486945 -116.478121 71.484598 -116.656481 71.475211 -116.844227 71.447049 -117.064830 71.442355 -117.163397 71.414193 -117.318288 71.414193 -117.402774 71.428274 -117.426243 71.456436 -117.571746 71.463477 -117.646845 71.447049 -117.557665 71.432968 -117.571746 71.397765 -117.670313 71.397765 -117.759493 71.393071 -117.834592 71.397765 -117.914384 71.369603 -118.144374 71.362563 -118.252328 71.390725 -118.275797 71.440008 -118.219473 71.491639 -118.111518 71.519801 -117.933159 71.522147 -117.825204 71.526841 -117.834592 71.569084 -117.858060 71.616021 -117.858060 71.651223 -117.956627 71.651223 -118.111518 71.634795 -118.341508 71.583165 -118.454156 71.599593 -118.463544 71.644183 -118.562111 71.658264 -118.717002 71.655917 -118.829650 71.634795 -118.946992 71.630102 -118.970460 71.686426 -119.050252 71.761525 -119.069027 71.864785 -118.970460 71.961006 -118.773326 72.040798 -118.660678 72.083041 -118.618435 72.113550 -118.487012 72.176914 -118.275797 72.209770 -118.120906 72.223851 -118.111518 72.261400 -118.144374 72.303643 -118.200698 72.334152 -118.355589 72.331806 -118.430688 72.334152 -118.496399 72.371702 -118.505787 72.465575 -118.430688 72.543021 -118.233554 72.625160 -117.966015 72.707299 -117.736025 72.796479 -117.515422 72.857497 -117.294820 72.899740 -117.097686 72.941983 -116.844227 72.993613 -116.722192 73.040550 -116.501589 73.056978 -116.388941 73.115648 -116.116709 73.127383 -115.914881 73.169626 -115.792845 73.190747 -115.539387 73.232990 -115.131038 73.286967 -114.891661 73.326864 -114.727382 73.352679 -114.614734 73.352679 -114.483311 73.336251 -114.426987 73.298702 -114.319033 73.279927 -114.295564 73.242378 -114.173529 73.190747 -114.117205 73.120342 -114.107818 73.066365 -114.098430 72.974838 -114.107818 72.885659 -114.117205 72.850456 -114.206385 72.838722 -114.337807 72.812907 -114.426987 72.765970 -114.450456 72.730767 -114.436375 72.707299 -114.483311 72.674443 -114.591266 72.658016 -114.727382 72.641588 -114.746157 72.615773 -114.638202 72.573530 -114.516167 72.613426 -114.417600 72.620466 -114.319033 72.658016 -114.182916 72.681484 -114.065575 72.681484 -114.042106 72.648628 -114.018638 72.625160 -113.844972 72.648628 -113.690081 72.674443 -113.610289 72.747195 -113.708856 72.770664 -113.708856 72.834028 -113.600901 72.918514 -113.455397 72.951370 -113.436623 72.986573 -113.380299 73.005347 -113.347443 73.012388 -113.248876 73.021775 -113.070517 73.021775 -112.906238 72.988919 -112.718491 72.953717 -112.596456 72.927902 -112.455646 72.918514 -112.244431 72.883312 -112.000360 72.871578 -111.859550 72.812907 -111.681190 72.791785 -111.549767 72.749542 -111.502831 72.747195 -111.394876 72.695565 -111.338552 72.669750 -111.305696 72.580570 -111.418345 72.526593 -111.493443 72.486697 -111.638947 72.430373 -111.859550 72.364661 -111.990972 72.334152 -111.990972 72.315378 -111.868937 72.324765 -111.793838 72.331806 -111.723433 72.334152 -111.681190 72.341193 -111.559155 72.388130 -111.493443 72.423332 -111.394876 72.451494 -111.305696 72.458535 -111.315084 72.420985 -111.362021 72.395170 -111.418345 72.355274 -111.418345 72.345887 -111.329165 72.338846 -111.263453 72.334152 -111.197742 72.322418 -111.141418 72.348233 -111.117950 72.390476 -111.061626 72.451494 -111.052238 72.491390 -110.930203 72.503124 -110.808167 72.564142 -110.733069 72.568836 -110.676745 72.564142 -110.620421 72.559449 -110.601646 72.550061 -110.479611 72.566489 -110.413899 72.554755 -110.390431 72.540674 -110.366962 72.526593 -110.291864 72.503124 -110.226152 72.477309 -110.169828 72.503124 -110.226152 72.559449 -110.268395 72.575876 -110.216765 72.582917 -110.160441 72.559449 -110.071261 72.540674 # -b -109.982081 72.564142 -110.014937 72.615773 -110.146360 72.641588 -110.235540 72.665056 -110.249621 72.690871 -110.216765 72.704952 -110.113504 72.681484 -110.005550 72.653322 # -b -109.916370 72.695565 -110.014937 72.733114 -110.071261 72.747195 -110.146360 72.775357 -110.179216 72.798826 -110.324719 72.817600 -110.446755 72.876271 -110.521854 72.944329 -110.535935 72.988919 -110.390431 72.995960 -110.235540 72.979532 -110.071261 72.974838 # -b -110.052487 76.502132 -110.043099 76.518559 -110.043099 76.506825 # -b -109.953919 74.887509 -110.165135 74.887509 -110.352881 74.849960 -110.427980 74.840572 -110.540628 74.838225 -110.681438 74.814757 -110.648583 74.772514 -110.714294 74.727924 -110.826942 74.711496 -110.836329 74.704456 -110.850410 74.704456 -110.869185 74.685681 -110.991221 74.666906 -111.188355 74.634051 -111.357327 74.624663 -111.376102 74.598848 -111.653028 74.589461 -111.784451 74.542524 -112.061377 74.500281 -112.272593 74.472119 -112.493195 74.458038 -112.657474 74.446304 -112.910932 74.453344 -113.155003 74.458038 -113.507028 74.462732 -113.704162 74.488547 -113.816810 74.521403 -114.023332 74.547218 -114.201691 74.594155 -114.342501 74.634051 -114.398825 74.650479 -114.488005 74.690375 -114.488005 74.716190 -114.398825 74.774861 -114.234547 74.821798 -114.089043 74.826491 -113.849666 74.871081 -113.629063 74.880468 -113.539884 74.859347 -113.427235 74.864041 -113.295813 74.889856 -113.295813 74.941486 -113.089291 75.018932 -112.821752 75.023625 -112.493195 75.042400 -112.183413 75.049441 -111.972198 75.044747 -111.915874 74.993117 -111.742208 74.993117 -111.653028 75.044747 -111.610785 75.070562 -111.432426 75.103418 -111.324471 75.164436 -111.089788 75.216066 -111.014689 75.263003 -111.024076 75.305246 -111.221210 75.305246 -111.455894 75.201985 -111.676496 75.216066 -111.831388 75.199638 -112.028522 75.183210 -112.357079 75.164436 -112.436871 75.218413 -112.380547 75.270043 -112.502582 75.244228 -112.634005 75.218413 -112.657474 75.279430 -112.746653 75.293511 -112.779509 75.199638 -112.920319 75.133927 -113.140922 75.126886 -113.206633 75.180863 -113.361524 75.115152 -113.629063 75.098724 -113.934152 75.049441 -114.046800 75.103418 -114.037413 75.133927 -113.934152 75.173823 -113.783954 75.211372 -113.859053 75.216066 -113.891909 75.284124 -113.868440 75.366263 -113.596208 75.410853 -113.441316 75.464830 -113.563352 75.457790 -113.727630 75.417894 -113.915377 75.434322 -114.070268 75.439015 -114.154754 75.335754 -114.225159 75.255962 -114.309645 75.241881 -114.445762 75.321673 -114.595959 75.335754 -114.610040 75.255962 -114.464537 75.201985 -114.478618 75.115152 -114.586572 75.101071 -114.610040 75.086990 -114.732076 75.058828 -114.872886 75.009544 -115.107569 75.018932 -115.206136 75.103418 -115.206136 75.185557 -115.304704 75.176170 -115.445514 75.140967 -115.633260 75.145661 -115.614486 75.058828 -115.623873 74.993117 -115.853863 75.004851 -116.074465 75.044747 -116.252825 75.089337 -116.163645 75.140967 -116.309149 75.169129 -116.295068 75.230147 -116.539139 75.206679 -116.647093 75.143314 -116.891164 75.159742 -117.003812 75.171476 -117.243189 75.180863 -117.520116 75.218413 -117.707863 75.277084 -117.675007 75.316980 -117.609296 75.347489 -117.496648 75.434322 -117.290126 75.502380 -117.046055 75.514114 -116.792597 75.518808 -116.637706 75.507073 -116.384248 75.507073 -116.121402 75.504727 -116.008754 75.521154 -115.802233 75.589213 -115.459595 75.633803 -115.337559 75.654924 -115.248380 75.699514 -115.206136 75.734716 -115.534693 75.671352 -115.919574 75.654924 -116.173033 75.600947 -116.337311 75.586866 -116.647093 75.565744 -117.013200 75.572785 -117.341756 75.579825 -117.341756 75.685433 -117.238496 75.795734 -117.092992 75.807468 -116.914632 75.812162 -116.844227 75.814509 -116.722192 75.840324 -116.604850 75.861446 -116.464040 75.866139 -116.356086 75.870833 -116.304455 75.875527 -116.238744 75.880220 -116.112015 75.938891 -116.102627 75.941238 -116.215276 75.922463 -116.318536 75.901342 -116.426491 75.898995 -116.539139 75.896648 -116.661174 75.887261 -116.797291 75.870833 -116.947488 75.870833 -117.036668 75.859099 -117.121154 75.891954 -117.111767 75.950625 -117.064830 75.999909 -116.994425 76.011643 -117.017893 76.049192 -117.083605 76.086742 -116.985038 76.180615 -116.844227 76.213471 -116.703417 76.204083 -116.604850 76.201737 -116.520364 76.208777 -116.464040 76.211124 -116.346698 76.190002 -116.257519 76.187656 -116.121402 76.171228 -116.079159 76.194696 -116.163645 76.199390 -116.238744 76.241633 -116.370167 76.255714 -116.506283 76.258061 -116.633012 76.262754 -116.698724 76.307344 -116.684643 76.344894 -116.623625 76.419992 -116.506283 76.481010 -116.384248 76.481010 -116.285681 76.483357 -116.205888 76.523253 -116.135483 76.513866 -116.027529 76.525600 -115.905493 76.502132 -115.806926 76.445807 -115.811620 76.398871 -115.806926 76.358975 -115.844476 76.330813 -115.821007 76.276835 -115.797539 76.229899 -115.684891 76.218164 -115.548774 76.229899 -115.468982 76.251020 -115.417352 76.279182 -115.332866 76.272142 -115.196749 76.281529 -115.187362 76.225205 -115.088795 76.215818 -114.990228 76.204083 -114.962066 76.147759 -114.924516 76.086742 -114.886967 76.063273 -114.793093 75.999909 -114.694526 75.999909 -114.619428 75.955319 -114.685139 75.924810 -114.797787 75.894301 -114.811868 75.845018 -114.713301 75.833284 -114.633509 75.852058 -114.488005 75.875527 -114.488005 75.856752 -114.450456 75.823896 -114.426987 75.772266 -114.488005 75.741757 -114.441068 75.746451 -114.398825 75.678392 -114.422294 75.629109 -114.436375 75.610334 -114.314339 75.565744 -114.150061 75.554010 -114.060881 75.563397 -114.018638 75.561051 -113.929458 75.586866 -113.798035 75.577478 -113.629063 75.598600 -113.497641 75.598600 -113.399073 75.563397 -113.047048 75.577478 # -b -109.986775 76.262754 -110.193297 76.316732 -110.371656 76.347240 -110.399818 76.389483 -110.399818 76.429380 -110.484304 76.459888 -110.381043 76.459888 -110.193297 76.476316 -110.090036 76.495091 -110.052487 76.502132 # -b -118.059888 76.049192 -118.200698 76.013990 -118.163149 76.035111 -118.041113 76.049192 -117.937853 76.100823 -117.750106 76.124291 -117.581134 76.112557 -117.590521 76.044499 -117.703169 75.974094 -117.843979 75.870833 -117.872141 75.840324 -117.966015 75.805121 -118.031726 75.720635 -118.134987 75.671352 -118.219473 75.612681 -118.477625 75.523501 -118.763939 75.514114 -118.881280 75.563397 -119.083108 75.584519 -119.313098 75.617375 -119.472683 75.690127 -119.406971 75.732370 -119.144126 75.788694 -119.031478 75.833284 -118.834344 75.896648 -118.627822 75.962359 -118.364977 75.990521 -118.289878 76.032765 -118.139680 76.049192 # -b -120.045311 77.041904 -119.904500 77.065372 -119.829402 77.112309 -119.688592 77.145164 -119.557169 77.152205 -119.519619 77.192101 -119.406971 77.229650 -119.341260 77.248425 -119.322485 77.304749 -119.209837 77.314136 -119.078414 77.323524 -118.900055 77.323524 -118.853118 77.358726 -118.702921 77.354033 -118.580885 77.321177 -118.515174 77.344645 -118.261716 77.346992 -118.186617 77.368114 -118.027032 77.372807 -118.064582 77.311790 -118.008258 77.246078 -117.914384 77.262506 -117.961321 77.318830 -117.895610 77.358726 -117.726637 77.316483 -117.491954 77.285974 -117.341756 77.285974 -117.388693 77.321177 -117.285432 77.321177 -117.097686 77.307096 -116.900551 77.356380 -116.928713 77.377501 -117.050749 77.372807 -117.210334 77.400969 -117.322982 77.454947 -117.266658 77.450253 -117.135235 77.469028 -117.031974 77.515964 -116.891164 77.525352 -116.675255 77.548820 -116.581382 77.527698 -116.459346 77.504230 -116.337311 77.487802 -116.271600 77.473721 -116.262212 77.450253 -116.027529 77.419744 -115.961817 77.405663 -115.802233 77.356380 -115.642648 77.323524 -115.633260 77.283628 -115.680197 77.260159 -115.755296 77.255466 -115.914881 77.243731 -115.980592 77.208529 -116.168339 77.196795 -116.262212 77.187407 -116.431184 77.189754 -116.496896 77.175673 -116.496896 77.156899 -116.553220 77.149858 -116.571995 77.119349 -116.496896 77.072412 -116.421797 77.046597 -116.252825 76.997314 -116.130790 76.973845 -116.065078 76.950377 -116.055691 76.901094 -116.196501 76.903440 -116.356086 76.938643 -116.496896 76.905787 -116.449959 76.849463 -116.299762 76.842423 -116.243438 76.795486 -116.187114 76.779058 -116.093240 76.696919 -116.243438 76.647635 -116.356086 76.624167 -116.534445 76.581924 -116.816065 76.572537 -117.013200 76.579577 -117.125848 76.546721 -117.182172 76.490397 -117.163397 76.427033 -117.135235 76.358975 -117.210334 76.300304 -117.351144 76.288570 -117.454405 76.272142 -117.679701 76.281529 -117.773574 76.321425 -117.933159 76.377749 -118.083356 76.445807 -118.092744 76.516213 -118.027032 76.584271 -118.036420 76.654676 -117.895610 76.755590 -117.876835 76.809567 -118.008258 76.811914 -118.158455 76.772018 -118.449463 76.781405 -118.468237 76.736815 -118.458850 76.711000 -118.599660 76.680491 -118.477625 76.654676 -118.468237 76.600699 -118.458850 76.546721 -118.646597 76.504478 -118.824956 76.560802 -118.975154 76.567843 -118.975154 76.539681 -119.069027 76.499785 -118.965766 76.469276 -118.853118 76.462235 -118.778020 76.452848 -118.731083 76.403564 -118.665371 76.349587 -118.721695 76.302651 -118.975154 76.262754 -119.012703 76.173575 -119.078414 76.126638 -119.115964 76.138372 -119.237999 76.121944 -119.350647 76.206430 -119.491457 76.276835 -119.547781 76.368362 -119.641655 76.333159 -119.773078 76.356628 -119.782465 76.304997 -119.744916 76.236939 -119.669817 76.208777 -119.688592 76.187656 -119.773078 76.164187 -119.641655 76.150106 -119.791852 76.138372 -119.960824 76.107863 -119.763690 76.079701 -119.641655 76.011643 -119.613493 75.978787 -119.763690 75.981134 -119.810627 75.903689 -119.970212 75.880220 # -b -114.154754 76.891706 -114.079656 76.894053 -113.976395 76.887012 -113.863747 76.865891 -113.863747 76.865891 -113.769873 76.833035 -113.647838 76.807220 -113.657225 76.776711 -113.713549 76.729775 -113.844972 76.729775 -114.004557 76.725081 -114.154754 76.715694 -114.276790 76.729775 -114.473924 76.741509 -114.586572 76.739162 -114.755544 76.748549 -114.971453 76.811914 -114.905742 76.844769 -114.520861 76.870585 -114.314339 76.884666 -114.154754 76.891706 # -b -112.094233 78.034615 -112.066071 78.029921 -111.972198 78.018187 -111.972198 78.032268 -111.775064 78.053390 -111.606091 78.062777 -111.502831 78.074511 -111.333859 78.076858 -111.193048 78.081552 -111.155499 78.053390 -110.995914 78.044002 -110.930203 78.069817 -110.836329 78.090939 -110.620421 78.100326 -110.348188 78.105020 -110.244927 78.095633 -110.075955 78.093286 # -b -109.965654 77.929007 -110.125238 77.919620 -110.247274 77.919620 -110.341147 77.903192 -110.510119 77.900845 -110.622767 77.886764 -110.782352 77.877377 -111.026423 77.877377 -111.063972 77.856255 -111.148459 77.851562 -111.195395 77.839828 -111.148459 77.825747 -111.063972 77.816359 -111.139071 77.802278 -111.326818 77.802278 -111.477015 77.802278 -111.599051 77.795238 -111.542727 77.783504 -111.542727 77.750648 -111.542727 77.736567 -111.411304 77.771769 -111.383142 77.743607 -111.477015 77.708405 -111.401917 77.720139 -111.261107 77.757688 -111.148459 77.757688 -111.139071 77.708405 -111.063972 77.724833 -111.035810 77.776463 -110.951324 77.795238 -110.876226 77.767076 -110.688479 77.752995 -110.510119 77.774116 -110.341147 77.774116 -110.312985 77.736567 -110.303598 77.696671 -110.266049 77.663815 -110.303598 77.616878 -110.303598 77.576982 -110.331760 77.525352 -110.435021 77.497190 -110.557056 77.473721 -110.726028 77.459640 -110.904388 77.445559 -111.045198 77.433825 -111.204783 77.424438 -111.354980 77.440866 -111.514565 77.422091 -111.674150 77.393929 -111.899446 77.370461 -112.096580 77.346992 -112.331263 77.346992 -112.556560 77.368114 -112.669208 77.415050 -112.687982 77.452600 -112.810018 77.466681 -113.044701 77.473721 -113.241835 77.494843 -113.373258 77.534739 -113.382646 77.586369 -113.335709 77.612185 -113.382646 77.654428 -113.382646 77.715445 -113.438970 77.741260 -113.495294 77.790544 -113.476519 77.823400 -113.429582 77.872683 -113.363871 77.891458 -113.251223 77.886764 -113.063476 77.917273 -112.913279 77.917273 -112.828792 77.954822 -112.669208 77.978291 -112.500236 77.966557 -112.462686 77.994719 -112.359425 78.018187 -112.274939 78.025228 -112.199841 78.015840 -112.143517 78.025228 -112.096580 78.034615 # -b -115.070020 77.940741 -115.041858 77.943088 -115.004309 77.952476 -114.957372 77.954822 -114.872886 77.938395 -114.882273 77.975944 -114.816562 78.006453 -114.656977 78.032268 -114.544329 78.041655 -114.488005 78.020534 -114.506780 77.997066 -114.478618 77.980638 -114.450456 77.957169 -114.290871 77.938395 -114.187610 77.910233 -114.103124 77.884417 -113.962314 77.867990 -113.840278 77.839828 -113.802729 77.814012 -113.755792 77.785850 -113.877828 77.738914 -114.046800 77.717792 -114.196997 77.703711 -114.356582 77.694324 -114.478618 77.722486 -114.628815 77.755341 -114.750850 77.802278 -114.863499 77.846868 -114.985534 77.844521 -115.032471 77.872683 -115.060633 77.905539 -115.182668 77.931354 -115.192055 77.936048 -115.126344 77.943088 -115.070020 77.940741 # -b -110.129932 78.630711 -110.092383 78.635405 -110.073608 78.635405 -110.017284 78.604896 # -b -109.932798 78.290420 -110.073608 78.309195 -110.233193 78.302154 -110.411552 78.285726 -110.589912 78.271645 -110.787046 78.283379 -111.012342 78.325622 -111.124990 78.363172 -111.293962 78.372559 -111.397223 78.405415 -111.500484 78.396027 -111.547421 78.419496 -111.538033 78.365519 -111.462934 78.320929 -111.584970 78.313888 -111.538033 78.271645 -111.669456 78.271645 -111.791491 78.266952 -111.913527 78.259911 -112.007400 78.295114 -112.082499 78.342050 -112.232696 78.346744 -112.392281 78.356131 -112.457993 78.386640 -112.598803 78.381946 -112.570641 78.358478 -112.580028 78.346744 -112.645739 78.353784 -112.711451 78.356131 -112.824099 78.342050 -112.927360 78.330316 -112.908585 78.295114 -112.936747 78.266952 -112.974296 78.288073 -113.058782 78.283379 -113.218367 78.262258 -113.349790 78.271645 -113.377952 78.311541 -113.490600 78.311541 -113.434276 78.351438 -113.349790 78.405415 -113.265304 78.428883 -113.077557 78.461739 -112.993071 78.442964 -112.852261 78.450005 -112.842874 78.471126 -112.739613 78.478167 -112.683289 78.487554 -112.533091 78.522757 -112.420443 78.529797 -112.279633 78.543878 -112.101274 78.541531 -111.951076 78.548572 -111.753942 78.569693 -111.594357 78.583774 -111.481709 78.630711 -111.472322 78.640098 -111.369061 78.679995 -111.293962 78.654179 -111.209476 78.679995 -111.059279 78.698769 -110.937243 78.736319 -110.833983 78.731625 -110.702560 78.731625 -110.599299 78.741012 -110.514813 78.726931 -110.505426 78.703463 -110.430327 78.698769 -110.383390 78.670607 -110.251968 78.672954 -110.129932 78.654179 -110.129932 78.637751 -110.129932 78.630711 # -b -130.141395 70.074150 -129.977117 70.099965 -129.878550 70.163330 -129.855081 70.207920 -129.714271 70.240775 -129.667335 70.193839 -129.559380 70.146902 -129.493669 70.064763 -129.559380 70.050682 -129.615704 70.020173 # -b -128.421165 69.949768 -128.331985 70.031907 -128.388309 70.081191 -128.299130 70.118740 -128.111383 70.146902 -127.956492 70.168024 -127.815682 70.184451 -127.703034 70.226694 -127.834456 70.238429 -127.979960 70.257203 -128.101996 70.297099 -128.069140 70.327608 -128.055059 70.381586 -128.101996 70.419135 -128.275661 70.398013 -128.266274 70.447297 -128.177094 70.508315 -128.087914 70.541170 -127.881393 70.503621 -127.679565 70.419135 -127.515287 70.355770 -127.341621 70.292406 -127.219586 70.207920 -127.186730 70.118740 -127.163261 70.036601 # -b -124.858669 69.989664 -124.914993 70.001398 # -b -125.189573 69.942727 -125.203654 70.001398 -125.147330 70.050682 -125.091006 70.048335 -125.025295 70.027213 -124.846935 70.048335 -124.762449 70.027213 # -b -124.703778 69.961502 -124.623986 70.017826 -124.492563 70.024867 -124.506644 70.064763 -124.647454 70.076497 -124.703778 70.095272 -124.736634 70.114046 -124.591130 70.121087 -124.473788 70.125780 -124.459707 70.095272 -124.408077 70.055375 -124.426852 70.001398 # -b -124.286042 74.016833 -124.149925 73.953469 -124.117069 73.953469 -124.009115 73.915919 -123.919935 73.864289 -124.009115 73.822046 -124.074826 73.793884 -124.149925 73.714091 -124.220330 73.646033 -124.286042 73.603790 -124.450320 73.556853 -124.450320 73.528691 -124.506644 73.465327 -124.591130 73.444205 -124.661535 73.373800 -124.661535 73.326864 -124.746021 73.282274 -124.811733 73.263499 -124.769490 73.218909 -124.825814 73.204828 -124.891525 73.155545 -124.990092 73.134423 -124.947849 73.080446 -124.835201 73.085140 -124.778877 73.045243 -124.661535 73.021775 -124.647454 72.993613 -124.670923 72.960757 -124.792958 72.941983 -124.933768 72.934942 -125.055804 72.909127 -125.201307 72.927902 -125.220082 72.892699 -125.187226 72.848109 -125.144983 72.829335 -125.144983 72.765970 -125.112128 72.756583 -125.121515 72.716686 -125.187226 72.639241 -125.088659 72.655669 -125.065191 72.599345 -125.187226 72.582917 -125.299874 72.535980 -125.168452 72.503124 -125.252938 72.482003 -125.389054 72.500778 -125.431297 72.460881 -125.497009 72.430373 -125.506396 72.402211 -125.506396 72.362314 -125.619044 72.338846 -125.586188 72.303643 -125.506396 72.291909 -125.440684 72.263747 -125.576801 72.261400 -125.628431 72.252013 -125.661287 72.244973 -125.764548 72.230892 -125.684755 72.216811 -125.661287 72.174568 -125.741079 72.181608 -125.806791 72.137018 -125.783322 72.092428 -125.708224 72.078347 -125.750467 72.052532 -125.839646 71.984474 -125.985150 71.975087 -125.928826 71.925803 -125.764548 71.953965 -125.595576 71.963352 -125.431297 71.977433 -125.252938 71.970393 -125.102740 71.956312 -125.055804 71.925803 -125.220082 71.944578 -125.220082 71.916416 -125.065191 71.888254 -124.891525 71.848357 -124.792958 71.810808 -124.778877 71.850704 -124.769490 71.874173 -124.623986 71.862438 -124.623986 71.827236 -124.614599 71.799074 -124.516031 71.792033 -124.361140 71.773259 -124.173394 71.745097 -124.041971 71.695813 -123.929323 71.634795 -123.854224 71.543269 -123.732188 71.486945 -123.643009 71.386031 -123.558523 71.294504 -123.469343 71.214712 -123.347308 71.141960 -123.234659 71.097370 -123.014057 71.111451 -122.840391 71.177163 -122.694887 71.238180 -122.497753 71.256955 -122.441429 71.263996 -122.253682 71.322666 -122.065936 71.386031 -121.911044 71.449395 -121.845333 71.503373 -121.803090 71.519801 -121.648199 71.477558 -121.615343 71.449395 -121.648199 71.407152 -121.483920 71.400112 -121.436984 71.397765 -121.272705 71.407152 -121.197607 71.456436 -121.174138 71.508066 -121.084958 71.461130 -121.009860 71.456436 -120.897212 71.475211 -120.690690 71.543269 -120.554574 71.627755 -120.545186 71.695813 -120.502943 71.738056 -120.545186 71.766218 -120.545186 71.827236 -120.535799 71.916416 -120.578042 71.968046 -120.512331 72.017330 -120.371521 72.085388 -120.315197 72.122937 -120.268260 72.193342 -120.258873 72.263747 -120.216629 72.277828 -120.136837 72.254360 -120.014802 72.230892 # -b -119.906847 74.265598 -120.103981 74.284372 -120.258873 74.310188 -120.423151 74.343043 -120.545186 74.394674 -120.676609 74.432223 -120.812726 74.462732 -120.911293 74.479160 -120.953536 74.533137 -121.075571 74.551912 -121.183526 74.556605 -121.329029 74.570686 -121.526163 74.591808 -121.657586 74.584767 -121.770234 74.580074 -121.835946 74.547218 -121.892270 74.528443 -121.990837 74.547218 -122.098791 74.549565 -122.253682 74.521403 -122.389799 74.514362 -122.497753 74.521403 -122.643257 74.509669 -122.751211 74.509669 -122.882634 74.509669 -123.028138 74.509669 -123.117318 74.504975 -123.136092 74.481506 -123.117318 74.469772 -123.093849 74.422836 -123.093849 74.373552 -123.117318 74.389980 -123.159561 74.422836 -123.234659 74.441610 -123.258128 74.490894 -123.323839 74.502628 -123.413019 74.453344 -123.469343 74.462732 -123.511586 74.493241 -123.666477 74.490894 -123.788513 74.479160 -123.788513 74.462732 -123.919935 74.469772 -124.074826 74.479160 -124.187475 74.474466 -124.187475 74.441610 -124.262573 74.436917 -124.459707 74.432223 -124.703778 74.401714 -124.614599 74.389980 -124.581743 74.343043 -124.525419 74.289066 -124.426852 74.260904 -124.286042 74.237436 -124.450320 74.211620 -124.459707 74.155296 -124.408077 74.101319 -124.351753 74.056729 -124.286042 74.016833 # -b -120.132143 77.011395 -120.094594 76.999661 -120.085207 77.018435 -120.047657 77.041904 # -b -119.967865 75.880220 -120.118062 75.884914 -120.164999 75.913076 -120.277647 75.941238 -120.305809 75.870833 -120.380908 75.823896 -120.521718 75.903689 -120.540493 75.962359 -120.540493 76.016337 -120.681303 76.018683 -120.840888 76.091435 -120.775176 76.143066 -120.793951 76.190002 -120.840888 76.227552 -121.047409 76.185309 -121.094346 76.100823 -121.094346 76.053886 -121.131895 76.016337 -121.263318 75.950625 -121.422903 76.004602 -121.629424 76.025724 -121.789009 76.032765 -121.882882 76.053886 -121.911044 76.082048 -121.864108 76.107863 -121.864108 76.140719 -121.873495 76.166534 -121.995531 76.063273 -122.117566 76.042152 -122.248989 75.971747 -122.389799 75.950625 -122.399186 75.945932 -122.539996 75.945932 -122.699581 75.992868 -122.690194 76.016337 -122.568158 76.105516 -122.483672 76.168881 -122.624482 76.187656 -122.887328 76.112557 -122.934265 76.194696 -122.915490 76.215818 -122.831004 76.239286 -122.662032 76.279182 -122.633870 76.375402 -122.427348 76.398871 -122.380411 76.427033 -122.220827 76.455195 -122.061242 76.455195 -121.845333 76.424686 -121.760847 76.445807 -121.638812 76.431726 -121.601262 76.459888 -121.488614 76.532640 -121.422903 76.567843 -121.291480 76.603045 -121.263318 76.633554 -121.282093 76.701613 -121.225769 76.671104 -121.103733 76.678144 -120.991085 76.701613 -120.915986 76.711000 -120.850275 76.743856 -120.718852 76.746202 -120.606204 76.776711 -120.474781 76.825995 -120.240098 76.847116 -120.409070 76.858850 -120.296422 76.926909 -120.240098 76.948030 -120.211936 76.987926 -120.127450 77.011395 # -b -131.023805 69.970889 -130.990950 70.031907 -130.915851 70.081191 -130.751572 70.118740 -130.671780 70.121087 -130.563826 70.158636 -130.451177 70.139861 -130.361998 70.107006 -130.221188 70.102312 -130.141395 70.074150 # -b -150.157552 70.423829 -149.871238 70.447297 -149.716347 70.489540 -149.570843 70.496580 -149.317385 70.491887 -149.110864 70.463725 -148.923117 70.426175 -148.669659 70.419135 -148.580479 70.405054 -148.557010 70.346383 -148.383345 70.348730 -148.247228 70.341689 -148.106418 70.315874 -147.951527 70.308834 -147.852960 70.266591 -147.796636 70.252510 -147.730925 70.257203 -147.576033 70.240775 -147.355431 70.203226 -147.158297 70.182105 -147.003406 70.144555 -146.839127 70.158636 -146.651380 70.175064 -146.430778 70.177411 -146.196094 70.177411 -146.041203 70.170370 -145.844069 70.130474 -145.670403 70.062416 -145.567143 70.050682 -145.416945 70.050682 -145.294910 70.048335 -145.327765 70.008439 # -b -144.952272 69.982624 -144.919416 70.024867 # -b -144.611981 69.982624 -144.489945 70.020173 -144.391378 70.031907 -144.381991 70.050682 -144.367910 70.055375 -144.358522 70.050682 -144.250568 70.055375 -144.072209 70.069456 -143.875074 70.081191 -143.785895 70.102312 -143.673247 70.081191 -143.541824 70.013132 -143.485500 70.050682 -143.508968 70.118740 -143.419788 70.099965 -143.311834 70.102312 -143.232042 70.125780 -143.044295 70.102312 -142.870629 70.064763 -142.757981 70.043641 -142.560847 70.006092 # -b -160.061196 70.290059 -159.972017 70.247816 -159.882837 70.292406 -159.873449 70.367505 -159.929774 70.414441 -159.873449 70.477806 -159.727946 70.473112 -159.563667 70.489540 -159.488569 70.510661 -159.662234 70.496580 -159.807738 70.524742 -159.896918 70.602188 # -b -160.105786 70.649125 -159.964976 70.667899 -159.964976 70.693715 -159.885184 70.745345 -159.655194 70.813403 -159.411123 70.860340 -159.181133 70.893196 -159.026242 70.907277 -159.091953 70.874421 -159.336024 70.841565 -159.359493 70.820444 -159.378267 70.792282 -159.443979 70.759426 -159.533158 70.733611 -159.411123 70.712489 -159.223376 70.667899 -159.270313 70.740651 -159.213989 70.745345 -159.101341 70.773507 -159.181133 70.801669 -158.993386 70.792282 -158.815027 70.773507 -158.528713 70.787588 -158.340966 70.801669 -158.373822 70.832178 -158.186075 70.834525 -157.965473 70.834525 -157.834050 70.869727 -157.679159 70.916664 -157.580592 70.947173 -157.482024 70.982375 -157.439781 71.003497 -157.359989 71.057474 -157.294278 71.085636 -157.252035 71.099717 -157.219179 71.132573 -157.162855 71.141960 -157.050207 71.120839 -156.984495 71.141960 -157.031432 71.207671 -156.975108 71.200631 -156.965721 71.214712 -156.951640 71.238180 -156.900009 71.259302 -156.843685 71.280423 -156.810830 71.315626 -156.712263 71.341441 -156.679407 71.322666 -156.646551 71.315626 -156.557371 71.285117 -156.411868 71.256955 -156.280445 71.273383 -156.125554 71.242874 -156.102085 71.177163 -156.083311 71.163082 -155.895564 71.186550 -155.731285 71.186550 -155.651493 71.172469 -155.576394 71.141960 -155.552926 71.092677 -155.576394 71.052780 -155.651493 71.024618 -155.764141 71.001150 -155.881483 70.961254 -156.026987 70.947173 -156.102085 70.926051 -156.214734 70.949520 -156.256977 70.909623 -156.346156 70.839218 -156.303913 70.855646 -156.158409 70.848606 -156.050455 70.815750 -155.947194 70.799322 -155.815772 70.768813 -155.773529 70.848606 -155.684349 70.775854 -155.585782 70.827484 -155.473134 70.785241 -155.454359 70.728917 -155.275999 70.726570 -155.308855 70.799322 -155.299468 70.841565 -155.463746 70.914317 -155.430891 71.001150 -155.308855 71.038699 -155.177432 71.031659 -155.200901 71.099717 -155.069478 71.057474 -155.078865 71.111451 -154.989686 71.104411 -154.759696 71.071555 -154.637660 70.977682 -154.557868 70.926051 -154.647048 70.879115 -154.515625 70.848606 -154.327878 70.841565 -154.219924 70.806363 -154.074420 70.806363 -153.952384 70.869727 -153.820962 70.900236 -153.745863 70.846259 -153.600359 70.869727 -153.600359 70.879115 -153.567503 70.879115 -153.412612 70.921358 -153.234253 70.935439 -153.069974 70.933092 -152.962020 70.862687 -152.915083 70.808710 -152.905696 70.775854 -152.774273 70.806363 -152.717949 70.775854 -152.760192 70.869727 -152.661625 70.867380 -152.473878 70.867380 -152.276744 70.846259 -152.135934 70.822791 -152.145321 70.752385 -152.267357 70.660859 -152.220420 70.623310 -152.056142 70.620963 -151.957575 70.581067 -152.135934 70.581067 -152.356537 70.574026 -152.234501 70.548211 -151.990430 70.555251 -151.779215 70.555251 -151.558613 70.548211 -151.582081 70.508315 -151.736972 70.456684 -151.582081 70.447297 -151.197200 70.437910 -151.065777 70.447297 -150.854562 70.459031 -150.699671 70.477806 -150.511924 70.503621 -150.333565 70.496580 -150.225610 70.482499 -150.183367 70.440256 -150.324177 70.426175 -150.357033 70.398013 -150.159899 70.423829 # -b -162.532414 69.970889 -162.457315 70.031907 -162.293037 70.017826 # -b -161.903462 69.956808 -162.039578 70.008439 -162.236712 70.062416 -162.203857 70.137515 -162.081821 70.222001 -161.992642 70.290059 -161.894075 70.285365 -161.804895 70.273631 -161.870606 70.257203 -161.903462 70.245469 -161.903462 70.219654 -161.917543 70.189145 -161.983254 70.132821 -161.861219 70.175064 -161.795507 70.214960 -161.617148 70.219654 -161.462257 70.233735 -161.241654 70.292406 -161.067989 70.315874 -160.880242 70.360464 -160.692495 70.405054 -160.579847 70.440256 -160.528216 70.470765 -160.748819 70.430869 -160.734738 70.456684 -160.528216 70.510661 -160.373325 70.550558 -160.237209 70.583413 -160.152723 70.576373 -160.063543 70.557598 -160.030687 70.508315 -160.138642 70.466072 -160.119867 70.398013 -160.227822 70.329955 -160.072930 70.367505 -160.063543 70.290059 # -b -159.896918 70.602188 -160.028341 70.616269 -160.103439 70.649125 # -b -179.945930 71.540922 -179.927156 71.526841 -179.805120 71.550309 -179.706553 71.550309 -179.706553 71.555003 -179.692472 71.547963 -179.640842 71.529188 -179.518806 71.526841 -179.462482 71.505720 -179.349834 71.533882 -179.241880 71.555003 -179.129232 71.540922 -179.077601 71.564390 -179.077601 71.555003 -178.979034 71.547963 -178.875774 71.529188 -178.711495 71.498679 -178.481505 71.484598 -178.368857 71.454089 -178.195191 71.447049 -178.115399 71.421233 -178.171723 71.400112 -178.162336 71.376644 -178.073156 71.355522 -177.951120 71.313279 -177.829085 71.285117 -177.655419 71.238180 -177.599095 71.167775 -177.664807 71.111451 -177.852553 71.062168 -178.026219 71.029312 -178.228047 71.001150 -178.382938 70.982375 -178.458037 70.977682 -178.603541 70.970641 -178.791287 70.942479 -178.941485 70.935439 -179.129232 70.900236 -179.284123 70.907277 -179.485951 70.921358 -179.593905 70.954213 -179.725328 70.961254 -179.903687 70.968294 # -b 179.821548 71.529188 180.000000 71.538293 # -b -180.000000 71.538293 -179.948462 71.540922 # -b 170.415433 69.930993 170.448289 70.008439 170.612567 70.048335 170.833170 70.055375 171.096015 70.043641 171.330699 70.017826 # -b -179.901340 70.968294 -180.000000 70.976516 # -b 180.000000 70.976516 179.901526 70.984722 179.746634 70.956560 179.633986 70.914317 179.591743 70.862687 179.483789 70.855646 179.296042 70.855646 179.183394 70.846259 179.127070 70.869727 179.051971 70.853299 178.906467 70.853299 178.784432 70.827484 178.751576 70.874421 178.667090 70.916664 178.634235 70.935439 178.554442 70.970641 178.479343 71.029312 178.554442 71.106758 178.718721 71.141960 178.784432 71.210018 178.972179 71.259302 179.127070 71.313279 179.239718 71.369603 179.347672 71.397765 179.502564 71.447049 179.624599 71.449395 179.699698 71.505720 179.821733 71.529188 # -b 159.922733 70.451991 160.002525 70.407401 160.002525 70.367505 160.044768 70.299446 160.044768 70.226694 # -b 168.099107 69.994358 168.164818 70.006092 168.263385 70.031907 168.474600 70.020173 # -b 149.965112 72.017330 150.030823 71.956312 150.049598 71.902335 150.040210 71.843664 # -b 149.920522 71.653570 150.098881 71.625408 150.239691 71.618368 150.328871 71.545616 150.474375 71.508066 150.662122 71.484598 150.662122 71.437661 150.727833 71.386031 150.901499 71.381337 151.211281 71.421233 151.422496 71.430621 151.619630 71.437661 151.652486 71.393071 151.732278 71.346135 151.882476 71.289811 152.004511 71.254608 152.215726 71.202978 152.370618 71.156041 152.337762 71.078596 152.206339 71.012884 151.971656 70.982375 151.783909 70.970641 151.896557 70.942479 152.126547 70.937785 152.304906 70.888502 152.478572 70.841565 152.591220 70.789935 152.732030 70.834525 152.943245 70.829831 153.130992 70.874421 153.187316 70.881461 153.229559 70.869727 153.309352 70.888502 153.384450 70.907277 153.529954 70.890849 153.661377 70.909623 153.858511 70.916664 154.046258 70.916664 154.210536 70.890849 154.341959 70.897889 154.454607 70.914317 154.562562 70.937785 154.618886 70.963601 154.740921 70.975335 154.970911 70.949520 155.224369 70.935439 155.426197 70.937785 155.557620 70.977682 155.764141 70.977682 155.951888 70.963601 156.055149 70.989416 156.285139 71.005844 156.529209 71.010537 156.749812 70.998803 156.946946 71.012884 157.158161 71.024618 157.364683 71.010537 157.650997 71.012884 157.885680 70.982375 158.092202 70.977682 158.359741 70.968294 158.622586 70.963601 158.843189 70.937785 158.998080 70.874421 159.162358 70.841565 159.284394 70.780547 159.350105 70.740651 159.472141 70.707796 159.627032 70.628003 159.725599 70.602188 159.814779 70.562292 159.814779 70.531783 159.922733 70.451991 # -b 160.044768 70.226694 159.979057 70.165677 159.922733 70.095272 # -b 149.887666 75.201985 150.009701 75.211372 150.220917 75.192598 150.352339 75.138620 150.629266 75.112805 150.849868 75.108111 151.089246 75.096377 150.901499 75.056481 150.901499 75.011891 150.924967 74.927405 150.694977 74.840572 150.305403 74.774861 150.155205 74.753739 150.033170 74.732618 # -b 139.984022 71.442355 140.040346 71.493985 140.030958 71.564390 # -b 139.906576 72.094775 140.005143 72.125284 140.145953 72.169874 140.366556 72.183955 140.512060 72.240279 140.643482 72.313031 140.690419 72.397517 140.723275 72.449147 140.821842 72.500778 141.009589 72.557102 141.164480 72.575876 141.117543 72.606385 141.009589 72.641588 140.995508 72.690871 140.807761 72.740155 140.831229 72.780051 140.976733 72.831681 141.117543 72.826988 141.281822 72.819947 141.352227 72.810560 141.469568 72.789438 141.549361 72.749542 141.704252 72.716686 141.859143 72.716686 141.976485 72.709646 142.023421 72.714340 142.065665 72.709646 142.197087 72.700259 142.474014 72.697912 142.694616 72.683831 142.896444 72.693218 143.102966 72.690871 143.290712 72.690871 143.534783 72.690871 143.764773 72.665056 144.008844 72.658016 144.248221 72.660362 144.525148 72.650975 144.670652 72.618119 144.825543 72.589957 144.966353 72.573530 145.243279 72.566489 145.520206 72.552408 145.707953 72.543021 145.815907 72.552408 145.905087 72.519552 146.092834 72.479656 146.214869 72.437413 146.346292 72.430373 146.501183 72.437413 146.623218 72.413945 146.745254 72.374049 146.609137 72.364661 146.388535 72.364661 146.135077 72.371702 145.961411 72.388130 145.806520 72.420985 145.693872 72.420985 145.421639 72.428026 145.130631 72.446800 144.825543 72.467922 144.590859 72.500778 144.548616 72.489043 144.417193 72.486697 144.351482 72.444454 144.426581 72.392823 144.459436 72.327112 144.450049 72.273135 144.351482 72.237932 144.248221 72.169874 144.182510 72.137018 144.285771 72.125284 144.623715 72.125284 144.891254 72.141712 145.144712 72.153446 145.421639 72.172221 145.604692 72.230892 145.806520 72.256707 146.003654 72.270788 146.167932 72.303643 146.355679 72.308337 146.566894 72.317724 146.764028 72.324765 146.820352 72.280175 146.623218 72.207423 146.435472 72.106509 146.200788 72.010289 146.069365 71.921109 145.914474 71.918763 145.881618 71.989168 145.895699 72.045492 145.895699 72.108856 145.862844 72.167527 145.905087 72.207423 145.980186 72.148752 146.069365 72.113550 146.158545 72.162833 146.149158 72.219157 145.994267 72.237932 145.848763 72.214464 145.726727 72.160487 145.726727 72.106509 145.693872 72.003249 145.661016 71.963352 145.553062 71.956312 145.440413 71.918763 145.341846 71.949271 145.186955 71.921109 144.999208 71.939884 144.966353 71.888254 145.144712 71.867132 145.266748 71.874173 145.398170 71.846011 145.351234 71.834276 145.233892 71.820195 145.130631 71.763871 145.013289 71.792033 144.877173 71.749790 144.924110 71.709894 144.956965 71.672345 144.999208 71.623061 145.163487 71.644183 145.252667 71.651223 145.252667 71.585512 145.299603 71.613674 145.421639 71.644183 145.585917 71.686426 145.750196 71.726322 145.914474 71.761525 146.003654 71.834276 146.182013 71.895294 146.355679 71.939884 146.510570 71.972740 146.576282 72.040798 146.632606 72.118244 146.745254 72.193342 146.876677 72.237932 147.017487 72.263747 147.040955 72.301297 147.172378 72.341193 147.360125 72.367008 147.538484 72.367008 147.669907 72.364661 147.867041 72.371702 148.031319 72.359968 148.111112 72.327112 148.120499 72.341193 148.134580 72.343540 148.209679 72.350580 148.373957 72.357621 148.486605 72.364661 148.641497 72.336499 148.848018 72.310684 148.960666 72.277828 149.049846 72.273135 149.232899 72.261400 149.444114 72.223851 149.608393 72.190995 149.786752 72.153446 149.852463 72.085388 149.965112 72.017330 # -b 150.042557 71.843664 149.934603 71.827236 149.798486 71.796727 149.690532 71.846011 149.577884 71.878866 149.469929 71.897641 149.347894 71.874173 149.235246 71.813155 149.117904 71.749790 149.005256 71.709894 149.005256 71.672345 149.103823 71.688773 149.235246 71.674692 149.380750 71.667651 149.479317 71.639489 149.667064 71.646530 149.765631 71.688773 149.920522 71.653570 # -b 139.960553 75.793387 140.045039 75.823896 140.167075 75.812162 140.336047 75.802775 140.307885 75.765225 140.336047 75.744104 140.270336 75.720635 140.214012 75.683086 140.251561 75.678392 140.232786 75.650230 140.265642 75.617375 140.411146 75.626762 140.509713 75.598600 140.608280 75.624415 140.697460 75.607987 140.786639 75.607987 140.838270 75.622068 140.828882 75.650230 140.828882 75.732370 140.913368 75.760532 140.894594 75.776959 140.781946 75.812162 140.781946 75.875527 140.753784 75.952972 140.772558 76.009296 140.828882 76.032765 140.941530 76.065620 141.082341 76.079701 141.232538 76.056233 141.363961 76.032765 141.542320 76.006949 141.664356 75.964706 141.795778 75.917770 141.908427 75.873180 141.945976 75.823896 142.011687 75.786347 142.096173 75.734716 142.265146 75.732370 142.405956 75.708901 142.410649 75.647884 142.335551 75.600947 142.302695 75.544623 142.222902 75.492992 142.124335 75.455443 142.072705 75.403813 142.072705 75.361570 142.105561 75.314633 142.204128 75.225453 142.302695 75.159742 142.457586 75.108111 142.556153 75.068215 142.753287 75.056481 142.941034 75.047094 143.128781 75.014238 143.260204 74.981382 143.316528 74.948527 143.293059 74.925058 143.095925 74.913324 142.922259 74.896896 142.678188 74.925058 142.457586 74.955567 142.410649 74.913324 142.401262 74.871081 142.213515 74.845266 142.124335 74.880468 141.903733 74.946180 141.805166 74.976689 141.917814 74.979036 141.936589 75.030666 141.762923 75.072909 141.617419 75.033013 141.495384 74.981382 141.209070 74.962608 141.002548 74.948527 140.767865 74.913324 140.514407 74.847613 140.228093 74.831185 139.998103 74.795982 # -b 141.328758 76.143066 141.375695 76.143066 141.469568 76.131332 141.619766 76.105516 141.751189 76.058580 141.920161 76.009296 142.107908 75.974094 142.229943 75.920116 142.342591 75.880220 142.502176 75.852058 142.699310 75.852058 142.943381 75.826243 143.121740 75.845018 143.271938 75.882567 143.450297 75.894301 143.638044 75.873180 143.844566 75.859099 143.966601 75.793387 144.088636 75.744104 144.220059 75.718289 144.398419 75.711248 144.520454 75.678392 144.651877 75.654924 144.839624 75.629109 144.985127 75.607987 145.135325 75.575132 145.257360 75.530542 145.379396 75.530542 145.412251 75.497686 145.346540 75.495339 145.205730 75.500033 145.083695 75.507073 144.914722 75.492992 144.849011 75.453096 144.642489 75.441362 144.694120 75.422587 144.661264 75.385038 144.661264 75.321673 144.764525 75.270043 144.675345 75.239534 144.619021 75.159742 144.374950 75.124539 144.299852 75.089337 144.022925 75.054134 143.849259 75.016585 143.670900 75.054134 143.337649 75.061175 142.999705 75.084643 142.732166 75.138620 142.577275 75.237187 142.436464 75.321673 142.323816 75.403813 142.356672 75.481258 142.436464 75.535235 142.502176 75.598600 142.591356 75.661965 142.675842 75.732370 142.694616 75.769919 142.544419 75.769919 142.478708 75.816856 142.356672 75.842671 142.234637 75.877873 142.121989 75.920116 142.018728 75.955319 141.877918 75.997562 141.774657 76.030418 141.671396 76.058580 141.521199 76.086742 141.417938 76.126638 141.399163 76.138372 141.389776 76.143066 141.371001 76.143066 # -b 146.292315 75.558704 146.306396 75.551663 146.404963 75.528195 146.569241 75.514114 146.667808 75.485952 146.724132 75.448403 146.888411 75.422587 147.165337 75.401466 147.442264 75.399119 147.573687 75.415547 147.761433 75.403813 147.991423 75.387385 148.221413 75.375651 148.366917 75.385038 148.554664 75.370957 148.596907 75.331061 148.456097 75.328714 148.432628 75.300552 148.221413 75.251268 148.343448 75.253615 148.629762 75.263003 148.916076 75.255962 149.052193 75.248922 149.202390 75.274737 149.380750 75.274737 149.559109 75.248922 149.667064 75.194944 149.887666 75.201985 # -b 150.030823 74.732618 149.843076 74.720884 149.721041 74.760780 149.622474 74.732618 149.476970 74.744352 149.387790 74.793636 149.345547 74.737312 149.148413 74.737312 148.862099 74.767820 148.660271 74.831185 148.373957 74.828838 148.120499 74.849960 147.956221 74.908630 147.777861 74.932099 147.613583 74.990770 147.439917 74.997810 147.270945 75.011891 147.064423 75.049441 147.064423 75.117499 147.040955 75.180863 146.810965 75.253615 146.721785 75.342795 146.510570 75.399119 146.322823 75.464830 146.257112 75.523501 146.247725 75.544623 146.257112 75.551663 146.289968 75.558704 # -b 140.953265 74.138869 140.976733 74.223355 140.807761 74.270291 140.521447 74.307841 140.249214 74.265598 140.103710 74.197539 140.080242 74.159990 140.094323 74.106013 140.127179 74.054382 140.145953 74.002752 140.145953 73.946428 140.282070 73.915919 140.479204 73.892451 140.544915 73.892451 140.436961 73.915919 140.390024 73.946428 140.488591 73.955815 140.666951 73.953469 140.699806 73.988671 140.798374 74.002752 140.864085 74.016833 140.896941 74.033261 140.967346 74.066117 141.047138 74.082545 140.915715 74.098972 140.953265 74.138869 # -b 141.328758 73.892451 141.338146 73.894798 141.403857 73.894798 141.516505 73.899491 141.638541 73.925307 141.769963 73.927653 141.943629 73.922960 142.131376 73.897145 142.333204 73.845514 142.497482 73.838474 142.727472 73.742253 142.872976 73.697664 143.060723 73.667155 143.201533 73.592056 143.347037 73.526345 143.422135 73.453593 143.422135 73.347985 143.501928 73.275233 143.511315 73.225950 143.323568 73.244724 143.182758 73.225950 142.938687 73.232990 142.694616 73.272886 142.572581 73.265846 142.398915 73.279927 142.187700 73.265846 141.877918 73.308089 141.746495 73.352679 141.502424 73.338598 141.206723 73.362066 140.887553 73.418390 140.535528 73.439512 140.282070 73.399615 140.028612 73.362066 # -b 139.784541 73.472367 140.047386 73.467674 140.314926 73.484102 140.399412 73.521651 140.535528 73.610831 140.634095 73.688276 140.742050 73.768069 140.756131 73.826739 140.840617 73.876023 140.953265 73.887757 141.117543 73.876023 141.248966 73.887757 141.328758 73.892451 # -b 139.972288 72.472616 140.005143 72.477309 140.061467 72.463228 140.178809 72.460881 140.366556 72.463228 140.535528 72.479656 140.676338 72.489043 140.709194 72.477309 140.690419 72.432719 140.587158 72.359968 140.554303 72.308337 140.469817 72.261400 140.446348 72.294256 140.446348 72.350580 140.446348 72.364661 140.347781 72.270788 140.282070 72.230892 140.136566 72.237932 # -b 129.946608 71.038699 130.054562 71.078596 130.143742 71.038699 130.232922 71.012884 130.232922 70.970641 130.322102 70.923704 130.462912 70.895542 130.599028 70.902583 130.706983 70.853299 130.838405 70.862687 130.861874 70.937785 130.936972 70.921358 130.993296 70.848606 131.049620 70.813403 131.115332 70.728917 131.213899 70.707796 131.335934 70.693715 131.401646 70.780547 131.580005 70.855646 131.631636 70.968294 131.734896 71.005844 131.899175 71.139613 132.030598 71.167775 132.021210 71.245221 132.007129 71.367256 132.054066 71.442355 132.077534 71.538575 132.218344 71.625408 132.349767 71.731016 132.438947 71.813155 132.514046 71.874173 132.626694 71.946925 132.725261 71.970393 132.758116 71.949271 132.781585 71.871826 132.837909 71.808461 132.903620 71.747444 133.011575 71.716935 133.091367 71.688773 133.157078 71.646530 133.208709 71.606633 133.265033 71.557350 133.419924 71.522147 133.565428 71.465823 133.673382 71.409499 133.837661 71.400112 134.048876 71.423580 134.227235 71.407152 134.358658 71.409499 134.546405 71.400112 134.635585 71.423580 134.720071 71.378990 134.823331 71.336747 134.832719 71.374297 134.776395 71.451742 134.823331 71.508066 134.907817 71.566737 135.020465 71.618368 135.184744 71.625408 135.363103 71.632449 135.583706 71.639489 135.790227 71.594899 135.959200 71.592552 136.057767 71.543269 136.264288 71.529188 136.367549 71.508066 136.508359 71.522147 136.597539 71.515107 136.621007 71.512760 136.728961 71.486945 136.860384 71.458783 137.113842 71.400112 137.245265 71.395418 137.414237 71.364909 137.479949 71.296851 137.634840 71.282770 137.634840 71.226446 137.719326 71.195937 137.855442 71.184203 137.963397 71.141960 138.061964 71.181856 138.273179 71.177163 138.329503 71.240527 138.493781 71.282770 138.582961 71.332054 138.714384 71.371950 138.737852 71.378990 138.756627 71.381337 138.845807 71.400112 138.934986 71.423580 138.977229 71.400112 139.066409 71.437661 139.211913 71.423580 139.333948 71.402459 139.343336 71.423580 139.432516 71.486945 139.451290 71.512760 139.639037 71.472864 139.817396 71.442355 139.981675 71.442355 # -b 140.028612 71.564390 139.981675 71.599593 139.817396 71.658264 139.728217 71.738056 139.718829 71.808461 139.704748 71.850704 139.883108 71.853051 139.859640 71.904682 139.793928 71.953965 139.751685 71.984474 139.775153 72.019676 139.906576 72.094775 # -b 136.013177 74.054382 136.013177 74.042648 136.069501 74.019180 136.182149 73.998058 136.257248 73.948775 136.224392 73.887757 136.215005 73.876023 136.078888 73.885410 135.970934 73.960509 135.750331 74.028567 135.670539 74.094279 135.496873 74.145909 135.417081 74.169377 135.431162 74.239782 135.539116 74.235089 135.684620 74.148256 135.848898 74.091932 135.980321 74.049689 136.013177 74.054382 # -b 135.848898 75.549316 135.816043 75.514114 135.792574 75.488299 135.726863 75.467177 135.783187 75.420241 135.806655 75.382691 135.717476 75.345142 135.628296 75.354529 135.487486 75.375651 135.417081 75.427281 135.464017 75.469524 135.407693 75.500033 135.464017 75.544623 135.496873 75.624415 135.464017 75.692473 135.478098 75.744104 135.482792 75.800428 135.482792 75.845018 135.487486 75.821549 135.510954 75.788694 135.553197 75.755838 135.623602 75.673699 135.764412 75.626762 135.886448 75.617375 135.853592 75.598600 135.797268 75.568091 135.755025 75.549316 # -b 139.918310 75.837977 139.955860 75.823896 139.965247 75.793387 # -b 140.005143 74.795982 139.850252 74.798329 139.671893 74.842919 139.817396 74.833532 139.948819 74.868734 139.775153 74.896896 139.639037 74.960261 139.639037 75.018932 139.629650 75.056481 139.563938 75.049441 139.385579 75.018932 139.376191 74.979036 139.366804 74.955567 139.333948 74.906284 139.498227 74.920365 139.409047 74.859347 139.333948 74.753739 139.221300 74.699762 139.042941 74.688028 138.878662 74.718537 138.737852 74.734965 138.568880 74.742005 138.306035 74.753739 138.127675 74.786595 137.939928 74.817104 137.799118 74.901590 137.766263 74.941486 137.719326 74.976689 137.653614 75.035360 137.433012 75.028319 137.282815 75.054134 137.193635 75.084643 137.095068 75.089337 136.949564 75.126886 136.860384 75.211372 136.771204 75.265349 136.705493 75.321673 136.672637 75.338101 136.860384 75.368610 137.038744 75.338101 137.259346 75.363916 137.170166 75.417894 136.991807 75.406160 136.949564 75.429628 136.991807 75.446056 137.146698 75.446056 137.127923 75.502380 136.916708 75.542276 136.818141 75.577478 136.794673 75.591560 136.827529 75.596253 136.916708 75.575132 136.991807 75.546970 137.048131 75.577478 137.062212 75.600947 137.080987 75.631456 136.982420 75.676046 136.982420 75.746451 137.057518 75.776959 137.184247 75.762878 137.221797 75.793387 137.203022 75.812162 137.174860 75.849711 137.132617 75.826243 137.099761 75.856752 137.057518 75.920116 137.080987 75.945932 137.151392 75.990521 137.203022 75.974094 137.278121 75.990521 137.362607 76.002256 137.442399 76.028071 137.479949 76.077354 137.531579 76.138372 137.559741 76.119597 137.601984 76.136025 137.658308 76.166534 137.770956 76.199390 137.822587 76.204083 137.911766 76.218164 137.944622 76.211124 137.897685 76.159494 137.911766 76.112557 137.972784 76.079701 138.066657 76.030418 138.155837 75.978787 138.202774 75.967053 138.287260 75.978787 138.306035 75.945932 138.376440 75.915423 138.320116 75.873180 138.362359 75.828590 138.409295 75.826243 138.446845 75.837977 # -b 140.028612 73.362066 139.840865 73.366760 139.704748 73.416043 139.653118 73.437165 139.784541 73.472367 # -b 137.038744 71.613674 137.048131 71.613674 137.080987 71.601940 137.193635 71.566737 137.301589 71.564390 137.367301 71.587859 137.512804 71.585512 137.733407 71.578471 137.907073 71.571431 137.977478 71.533882 137.855442 71.479904 137.775650 71.435314 137.620759 71.456436 137.489336 71.435314 137.348526 71.449395 137.203022 71.472864 136.958951 71.508066 136.771204 71.536228 136.738349 71.559697 136.785285 71.571431 136.907321 71.573778 136.949564 71.599593 137.015275 71.608980 137.038744 71.613674 # -b 138.043189 71.526841 138.061964 71.538575 138.160531 71.557350 138.249711 71.578471 138.348278 71.578471 138.460926 71.543269 138.517250 71.578471 138.526637 71.639489 138.634592 71.646530 138.803564 71.618368 138.934986 71.571431 138.958455 71.519801 138.958455 71.493985 138.944374 71.463477 138.902131 71.437661 138.822338 71.414193 138.723771 71.378990 138.559493 71.336747 138.437457 71.350828 138.315422 71.350828 138.240323 71.343788 138.108900 71.325013 137.996252 71.357869 137.874217 71.350828 137.864830 71.400112 137.986865 71.437661 138.052576 71.472864 138.029108 71.508066 138.029108 71.515107 138.029108 71.536228 138.043189 71.526841 # -b 139.972288 72.472616 139.972288 72.472616 # -b 140.138913 72.237932 139.960553 72.280175 139.810356 72.223851 139.599141 72.233238 139.533429 72.226198 139.486493 72.195689 139.387926 72.176914 139.265890 72.209770 139.157936 72.254360 139.233035 72.294256 139.369151 72.308337 139.336295 72.352927 139.378538 72.388130 139.509961 72.397517 139.509961 72.437413 139.467718 72.486697 139.608528 72.507818 139.777500 72.503124 139.894842 72.503124 139.960553 72.493737 139.974634 72.472616 # -b 119.977252 73.021775 120.141531 73.017081 120.296422 73.003000 120.460700 72.995960 120.671915 72.981879 120.892518 72.951370 121.047409 72.920861 121.080265 72.930248 121.122508 72.941983 121.244543 72.946676 121.432290 72.960757 121.563713 72.970145 121.718604 72.970145 121.915738 72.941983 122.028386 72.944329 122.094098 72.953717 122.206746 72.963104 122.291232 72.941983 122.347556 72.972491 122.460204 72.946676 122.577546 72.977185 122.732437 73.012388 122.999976 73.024122 123.140786 73.040550 123.239353 73.033509 123.384857 73.082793 123.450568 73.125036 123.352001 73.200135 123.220578 73.296355 123.164254 73.373800 123.173642 73.399615 123.229966 73.430124 123.140786 73.444205 123.154867 73.472367 123.206497 73.547466 123.309758 73.664808 123.319146 73.751641 123.352001 73.777456 123.441181 73.744600 123.525667 73.702357 123.638315 73.685929 123.802594 73.688276 123.858918 73.709398 123.826062 73.765722 123.826062 73.798577 123.858918 73.836127 123.966872 73.833780 124.070133 73.815005 124.187475 73.784496 124.398690 73.775109 124.544193 73.768069 124.642761 73.744600 124.708472 73.737560 124.816426 73.753988 124.938462 73.709398 125.027641 73.678889 125.093353 73.707051 125.173145 73.688276 125.215388 73.646033 125.224776 73.608484 125.281100 73.582669 125.393748 73.568588 125.459459 73.608484 125.558026 73.577975 125.647206 73.596750 125.712917 73.580322 125.788016 73.549813 125.919439 73.561547 125.999231 73.549813 126.088411 73.533385 126.205753 73.563894 126.327788 73.526345 126.407581 73.486448 126.539003 73.453593 126.562472 73.420737 126.614102 73.401962 126.679813 73.430124 126.750218 73.439512 126.801849 73.465327 126.937965 73.467674 126.970821 73.512264 127.045920 73.533385 127.177342 73.519304 127.266522 73.512264 127.275910 73.505223 127.299378 73.502876 127.355702 73.491142 127.454269 73.493489 127.543449 73.486448 127.642016 73.481755 127.764051 73.493489 127.829763 73.500529 127.961185 73.477061 128.139545 73.458286 128.191175 73.437165 128.261580 73.416043 128.191175 73.397269 128.280355 73.373800 128.402390 73.371453 128.491570 73.366760 128.524426 73.326864 128.500957 73.289314 128.646461 73.256459 128.820127 73.225950 128.932775 73.218909 128.932775 73.183707 129.087666 73.136770 129.176846 73.078099 129.341124 73.047590 129.449079 73.021775 129.463160 72.993613 129.514790 72.972491 129.472547 72.944329 129.463160 72.899740 129.430304 72.883312 129.308269 72.876271 129.341124 72.826988 129.317656 72.791785 129.341124 72.751889 129.416223 72.742502 129.359899 72.730767 129.373980 72.676790 129.373980 72.658016 129.251945 72.634547 129.219089 72.585264 129.308269 72.559449 129.397448 72.540674 129.350512 72.528940 129.251945 72.493737 129.228476 72.463228 129.383367 72.439760 129.538259 72.406904 129.627438 72.376395 129.547646 72.320071 129.463160 72.273135 129.463160 72.219157 129.505403 72.202730 129.406836 72.172221 129.416223 72.153446 129.528871 72.160487 129.416223 72.122937 129.219089 72.092428 129.195621 72.054879 129.261332 72.033757 129.176846 72.026717 129.073585 72.052532 129.040730 72.024370 128.965631 72.003249 128.899919 71.970393 128.834208 71.935190 128.712173 71.888254 128.735641 71.796727 128.768497 71.756831 128.843595 71.738056 128.885838 71.688773 128.843595 71.639489 128.942162 71.594899 129.031342 71.613674 129.120522 71.632449 129.139297 71.653570 129.176846 71.625408 129.176846 71.606633 129.195621 71.585512 129.261332 71.545616 129.261332 71.479904 129.317656 71.458783 129.373980 71.378990 129.496016 71.287464 129.505403 71.247568 129.561727 71.268689 129.693150 71.240527 129.749474 71.160735 129.815185 71.102064 129.904365 71.073902 129.946608 71.038699 # -b 109.942185 76.661716 110.064221 76.678144 110.176869 76.694572 110.251968 76.718040 110.383390 76.720387 110.514813 76.708653 110.627461 76.699266 110.777659 76.696919 110.956018 76.706306 111.078053 76.713347 111.078053 76.692225 111.068666 76.664063 111.134378 76.638248 111.228251 76.661716 111.397223 76.649982 111.472322 76.619473 111.406610 76.593658 111.453547 76.591311 111.500484 76.574883 111.613132 76.560802 111.772717 76.544375 111.857203 76.509172 111.922914 76.495091 112.044950 76.448154 112.073112 76.422339 112.073112 76.398871 112.204534 76.412952 112.354732 76.375402 112.476767 76.337853 112.617577 76.312038 112.673901 76.295610 112.636352 76.267448 112.608190 76.225205 112.551866 76.211124 112.476767 76.206430 112.580028 76.173575 112.664514 76.152453 112.720838 76.117251 112.749000 76.086742 112.795937 76.065620 112.889810 76.067967 112.908585 76.098476 113.077557 76.138372 113.021233 76.166534 112.964909 76.197043 113.058782 76.211124 113.143268 76.218164 113.246529 76.173575 113.340403 76.138372 113.424889 76.086742 113.406114 76.039805 113.424889 75.992868 113.471825 75.948278 113.490600 75.913076 113.631410 75.898995 113.753446 75.913076 113.809770 75.861446 113.809770 75.793387 113.734671 75.725329 113.668959 75.673699 113.603248 75.622068 113.490600 75.575132 113.368565 75.563397 113.424889 75.589213 113.490600 75.640843 113.349790 75.666658 112.993071 75.690127 112.871036 75.711248 112.739613 75.730023 112.617577 75.769919 112.429831 75.821549 112.289020 75.828590 112.242084 75.802775 112.364119 75.753491 112.504929 75.727676 112.608190 75.708901 112.542479 75.680739 112.631658 75.624415 112.631658 75.605641 112.730225 75.563397 112.795937 75.584519 112.828792 75.626762 112.969603 75.638496 113.025927 75.633803 113.040008 75.568091 113.190205 75.532889 113.279385 75.511767 113.424889 75.507073 113.523456 75.511767 113.546924 75.453096 113.556311 75.422587 113.392033 75.439015 113.401420 75.417894 113.457744 75.375651 113.499987 75.370957 113.499987 75.326367 113.499987 75.284124 113.401420 75.255962 113.335709 75.213719 113.227754 75.178517 113.124494 75.155048 113.124494 75.136273 113.072863 75.082296 112.936747 75.025972 112.861648 75.028319 112.763081 75.028319 112.608190 74.988423 112.608190 74.981382 112.706757 74.964955 112.598803 74.925058 112.476767 74.922711 112.345344 74.873428 112.387587 74.922711 112.312489 74.920365 112.124742 74.896896 111.988626 74.873428 111.936995 74.842919 112.054337 74.835879 112.199841 74.821798 112.068418 74.807717 111.890058 74.798329 111.782104 74.781901 111.627213 74.767820 111.636600 74.756086 111.725780 74.723231 111.636600 74.685681 111.613132 74.638744 111.514565 74.657519 111.397223 74.683334 111.293962 74.692722 111.176621 74.662213 111.031117 74.619970 110.918469 74.622317 110.876226 74.577727 110.852757 74.554258 110.665011 74.537831 110.599299 74.551912 110.491345 74.542524 110.547669 74.540177 110.557056 74.528443 110.425633 74.495587 110.223805 74.483853 110.172175 74.446304 110.190950 74.425182 110.073608 74.399367 109.904636 74.354777 109.853006 74.333656 # -b 109.986775 73.491142 110.085342 73.523998 110.174522 73.512264 110.230846 73.549813 110.296557 73.580322 110.427980 73.601443 110.625114 73.624912 110.845717 73.655421 110.780005 73.707051 110.714294 73.744600 110.559403 73.768069 110.474917 73.725826 110.287170 73.702357 110.151054 73.653074 # -b 109.787294 73.974590 110.017284 74.000405 110.294211 74.012139 110.491345 73.965203 110.702560 73.946428 110.791740 73.892451 110.866838 73.913572 110.899694 73.953469 111.031117 74.000405 111.265800 74.028567 111.495790 74.033261 111.472322 74.002752 111.308043 73.934694 111.265800 73.979284 111.176621 73.927653 111.200089 73.857248 111.275188 73.793884 111.472322 73.744600 111.641294 73.707051 111.683537 73.678889 111.861896 73.692970 112.115355 73.678889 112.411056 73.678889 112.711451 73.704704 112.828792 73.775109 112.875729 73.864289 112.819405 73.934694 112.777162 74.002752 112.875729 73.937041 112.983684 73.876023 113.138575 73.805618 113.171430 73.716438 113.269997 73.692970 113.359177 73.620218 113.368565 73.549813 113.251223 73.465327 113.185511 73.420737 113.269997 73.376147 113.218367 73.326864 113.326322 73.310436 113.504681 73.305742 113.438970 73.251765 113.185511 73.263499 113.129187 73.228297 113.406114 73.197788 113.734671 73.263499 113.866094 73.305742 114.100777 73.275233 114.250975 73.200135 114.250975 73.305742 114.462190 73.143810 114.626468 73.148504 114.485658 73.218909 114.288524 73.305742 114.044453 73.364413 113.823851 73.371453 113.645491 73.444205 113.546924 73.495836 113.776914 73.519304 114.044453 73.554507 114.185263 73.568588 114.396478 73.570934 114.593613 73.552160 114.673405 73.554507 114.706261 73.563894 114.861152 73.563894 115.034818 73.582669 115.278888 73.610831 115.321131 73.617871 115.321131 73.660114 115.476023 73.676542 115.663769 73.688276 115.818660 73.685929 116.029876 73.669502 116.217622 73.646033 116.358433 73.627258 116.602503 73.627258 116.823106 73.596750 117.020240 73.599096 117.254924 73.559200 117.508382 73.547466 117.705516 73.538079 117.846326 73.552160 118.034073 73.561547 118.235901 73.531038 118.400179 73.526345 118.597313 73.538079 118.728736 73.533385 118.864852 73.505223 118.916483 73.465327 # -b 113.018886 74.512015 113.084598 74.490894 113.150309 74.462732 113.305200 74.462732 113.352137 74.434570 113.352137 74.387633 113.328668 74.312534 113.262957 74.256210 113.206633 74.209274 113.051742 74.181112 112.910932 74.136522 112.779509 74.096626 112.577681 74.117747 112.389934 74.136522 112.192800 74.136522 111.981585 74.211620 111.807919 74.232742 111.610785 74.251517 111.474669 74.307841 111.488750 74.333656 111.554461 74.373552 111.685884 74.340696 111.817307 74.336003 111.929955 74.364165 112.005053 74.411101 111.981585 74.455691 111.929955 74.502628 112.005053 74.547218 112.117701 74.530790 112.291367 74.519056 112.446258 74.504975 112.577681 74.500281 112.699717 74.495587 112.812365 74.493241 112.943787 74.502628 113.018886 74.512015 # -b 118.942298 73.467674 118.942298 73.455940 118.876587 73.462980 118.810875 73.465327 118.778020 73.430124 118.688840 73.420737 118.580885 73.434818 118.458850 73.416043 118.425994 73.373800 118.458850 73.338598 118.468237 73.305742 118.458850 73.289314 118.435382 73.275233 118.435382 73.272886 118.435382 73.244724 118.444769 73.209522 118.533949 73.167279 118.688840 73.153198 118.867199 73.110955 119.064333 73.085140 119.228612 73.068712 119.392890 73.059324 119.529007 73.028816 119.636961 73.003000 119.758997 72.981879 119.937356 72.956064 119.988986 72.981879 119.979599 73.021775 # -b 99.864875 79.665665 100.015073 79.677399 100.118333 79.672706 100.230982 79.653931 # -b 99.975176 78.431230 100.031501 78.435924 100.087825 78.457045 100.087825 78.487554 100.153536 78.534491 100.275571 78.600202 100.228635 78.635405 100.388219 78.705810 100.547804 78.785602 100.604128 78.773868 100.735551 78.745706 100.866974 78.726931 101.064108 78.729278 100.989009 78.757440 100.791875 78.797336 100.791875 78.860701 100.782488 78.912331 100.810650 78.975696 100.895136 78.996817 100.998397 79.017939 101.054721 79.015592 101.148594 79.024979 101.035946 79.032020 101.026559 79.076610 101.148594 79.107119 101.336341 79.114159 101.223693 79.125893 101.233080 79.177524 101.420827 79.224460 101.589799 79.245582 101.617961 79.278437 101.589799 79.325374 101.711834 79.344149 101.815095 79.294865 101.862032 79.233848 101.965293 79.222113 102.153039 79.215073 102.190589 79.262010 102.181202 79.320681 102.153039 79.372311 102.228138 79.400473 102.359561 79.428635 102.444047 79.416901 102.594244 79.407513 102.763217 79.402820 102.866477 79.384045 102.875865 79.337108 102.866477 79.299559 102.904027 79.327721 102.988513 79.348843 103.119936 79.323027 103.119936 79.283131 102.997900 79.233848 102.904027 79.177524 102.922801 79.104772 102.866477 79.055488 102.875865 79.010898 103.054224 79.055488 103.138710 79.076610 103.307682 79.139974 103.307682 79.203339 103.410943 79.208032 103.542366 79.175177 103.598690 79.158749 103.626852 79.104772 103.673789 79.088344 103.795824 79.125893 103.852148 79.165789 103.870923 79.179870 104.039895 79.163443 103.964796 79.132934 104.039895 79.109465 104.114994 79.100078 104.068057 79.050794 104.077444 79.022632 104.199480 78.978043 104.302740 78.978043 104.274578 79.024979 104.330902 79.034367 104.424776 79.050794 104.462325 78.985083 104.499875 78.956921 104.565586 78.917025 104.659459 78.867741 104.865981 78.841926 105.053728 78.823151 105.194538 78.799683 105.269637 78.790296 105.410447 78.752746 105.438609 78.719891 105.457383 78.675301 105.457383 78.614283 105.401059 78.572040 105.457383 78.525103 105.457383 78.459392 105.288411 78.398374 105.128826 78.330316 104.931692 78.290420 104.819044 78.309195 104.650072 78.297460 104.434163 78.297460 104.190092 78.269298 103.992958 78.238790 103.748887 78.212974 103.448492 78.220015 103.260746 78.201240 103.063612 78.212974 102.988513 78.203587 102.950963 78.170731 102.810153 78.151957 102.716280 78.173078 102.537920 78.215321 102.406498 78.203587 102.246913 78.203587 102.040391 78.180119 101.918356 78.205934 101.739997 78.182465 101.467764 78.182465 101.111045 78.187159 101.045333 78.151957 100.998397 78.116754 100.904523 78.112060 100.744938 78.058083 100.529030 78.041655 100.294346 78.013493 100.069050 77.968903 # -b 99.986911 78.339703 100.033847 78.365519 # -b 107.022722 78.175425 107.041497 78.163691 107.107208 78.156650 107.219857 78.135529 107.351279 78.149610 107.454540 78.173078 107.604737 78.173078 107.642287 78.151957 107.773710 78.151957 107.801872 78.119101 107.642287 78.069817 107.585963 78.027574 107.473315 78.051043 107.276181 78.053390 107.022722 78.076858 106.910074 78.088592 106.694165 78.105020 106.534581 78.109714 106.600292 78.130835 106.759877 78.128488 106.844363 78.161344 106.966398 78.168384 107.022722 78.175425 # -b 99.951708 76.450501 100.092518 76.448154 100.299040 76.443461 100.439850 76.450501 100.590047 76.462235 100.712083 76.473970 100.862280 76.499785 101.012478 76.509172 101.115738 76.530294 101.134513 76.537334 101.068802 76.551415 101.068802 76.581924 101.068802 76.631207 101.068802 76.654676 101.115738 76.624167 101.228386 76.621820 101.322260 76.614780 101.341035 76.633554 101.228386 76.652329 101.190837 76.678144 101.181450 76.711000 101.059414 76.722734 100.927992 76.734468 100.852893 76.764977 100.852893 76.802526 100.815343 76.811914 100.899830 76.854157 100.984316 76.889359 100.993703 76.922215 101.106351 76.922215 101.172062 76.957418 101.162675 76.983233 101.190837 77.025476 101.294098 77.070066 101.387971 77.098228 101.444295 77.119349 101.510007 77.149858 101.556943 77.163939 101.678979 77.194448 101.707141 77.222610 101.819789 77.236691 101.866726 77.260159 101.988761 77.274240 102.082634 77.295362 102.101409 77.297709 102.110796 77.302402 102.129571 77.318830 102.185895 77.346992 102.289156 77.382195 102.373642 77.405663 102.476903 77.440866 102.542614 77.471374 102.617713 77.497190 102.683424 77.513617 102.777298 77.534739 102.927495 77.558207 102.946270 77.588716 102.993206 77.609838 103.143404 77.607491 103.312376 77.600450 103.425024 77.595757 103.537672 77.605144 103.631546 77.628612 103.640933 77.642693 103.716032 77.656774 103.838067 77.677896 103.903778 77.689630 104.007039 77.684936 104.100913 77.694324 104.157237 77.691977 104.260497 77.675549 104.260497 77.652081 104.279272 77.638000 104.391920 77.633306 104.448244 77.656774 104.523343 77.670855 104.635991 77.642693 104.701702 77.602797 104.823738 77.565248 104.973935 77.541779 105.114745 77.520658 105.293105 77.508924 105.443302 77.513617 105.527788 77.544126 105.593500 77.530045 105.696761 77.527698 105.743697 77.487802 105.800021 77.424438 105.884507 77.377501 105.978381 77.346992 106.044092 77.321177 105.884507 77.346992 105.743697 77.342299 105.612274 77.339952 105.612274 77.311790 105.527788 77.274240 105.452690 77.239038 105.274330 77.236691 105.049034 77.194448 104.945773 77.152205 104.823738 77.105268 104.711090 77.070066 104.607829 77.034863 104.476406 77.023129 104.326209 76.966805 104.260497 76.938643 104.373146 76.959764 104.542118 76.976192 104.720477 77.002007 104.898837 77.004354 105.039647 77.023129 105.152295 77.046597 105.274330 77.058331 105.396366 77.058331 105.518401 77.060678 105.631049 77.051291 105.677986 77.077106 105.734310 77.128737 105.743697 77.070066 105.668599 77.018435 105.668599 77.004354 105.781247 77.020782 105.865733 77.023129 105.968993 77.044250 106.025317 77.025476 106.100416 77.004354 106.175515 77.011395 106.241226 77.034863 106.400811 77.034863 106.466522 77.023129 106.560396 77.025476 106.597945 77.004354 106.663657 76.985580 106.738755 76.997314 106.748143 76.999661 106.804467 76.990273 106.898340 76.976192 107.020376 76.971499 107.133024 76.971499 107.226897 76.962111 107.208122 76.948030 107.217510 76.917521 107.311383 76.901094 107.311383 76.877625 107.179960 76.879972 107.151798 76.865891 107.208122 76.840076 107.057925 76.804873 106.982826 76.774364 106.992214 76.755590 107.086087 76.783752 107.179960 76.814261 107.283221 76.828342 107.179960 76.788445 107.095474 76.736815 106.926502 76.720387 106.842016 76.718040 106.776305 76.673450 106.644882 76.631207 106.560396 76.570190 106.475910 76.509172 106.400811 76.520906 106.306938 76.506825 106.175515 76.490397 106.081641 76.476316 106.119191 76.471623 106.119191 76.448154 106.166128 76.445807 106.306938 76.448154 106.485297 76.448154 106.644882 76.434073 106.748143 76.424686 106.907727 76.448154 107.057925 76.443461 107.189348 76.443461 107.311383 76.445807 107.367707 76.490397 107.414644 76.492744 107.442806 76.476316 107.630553 76.499785 107.733813 76.544375 107.743201 76.591311 107.808912 76.586618 107.865236 76.591311 107.987272 76.635901 107.949722 76.638248 107.799525 76.628861 107.855849 76.654676 107.884011 76.701613 107.940335 76.711000 108.090532 76.711000 108.118694 76.729775 108.128082 76.741509 108.240730 76.736815 108.268892 76.718040 108.193793 76.696919 108.165631 76.666410 108.259504 76.678144 108.343991 76.701613 108.372153 76.687532 108.447251 76.673450 108.606836 76.678144 108.757034 76.685185 108.954168 76.701613 108.991717 76.696919 109.085590 76.694572 109.235788 76.708653 109.310887 76.734468 109.367211 76.722734 109.489246 76.703959 109.592507 76.687532 109.676993 76.664063 109.770866 76.673450 109.808416 76.673450 109.845965 76.673450 109.939838 76.661716 # -b 110.031365 74.333656 109.993816 74.328962 109.993816 74.324269 109.984428 74.319575 109.928104 74.265598 109.885861 74.225701 109.730970 74.157643 109.510368 74.101319 109.224054 74.068464 108.937740 73.991018 108.707750 73.927653 108.637345 73.843167 108.505922 73.791537 108.365112 73.707051 108.252464 73.653074 108.144510 73.587362 108.031861 73.627258 107.858196 73.608484 107.604737 73.606137 107.360667 73.601443 107.116596 73.601443 107.107208 73.573281 107.196388 73.561547 107.018029 73.540426 107.064965 73.514610 107.027416 73.486448 106.910074 73.448899 106.806814 73.397269 106.764571 73.319823 106.586211 73.296355 106.332753 73.275233 106.168474 73.286967 106.037052 73.207175 105.980728 73.157891 105.971340 73.127383 105.882161 73.094527 105.792981 73.040550 105.717882 72.988919 105.652171 72.944329 105.595847 72.909127 105.450343 72.848109 105.333001 72.819947 105.196885 72.784745 105.112399 72.789438 104.999751 72.801173 104.779148 72.756583 104.713437 72.721380 104.549158 72.700259 104.427123 72.658016 104.305087 72.625160 104.140809 72.592304 104.164277 72.550061 104.281619 72.540674 104.328556 72.575876 104.558545 72.594651 104.638338 72.582917 104.558545 72.552408 104.657113 72.585264 104.826085 72.655669 105.023219 72.704952 105.131173 72.726074 105.262596 72.756583 105.464424 72.758929 105.652171 72.798826 105.760125 72.859843 105.882161 72.885659 106.013583 72.941983 106.182555 72.904433 106.421933 72.885659 106.609679 72.857497 106.788039 72.841069 106.919462 72.857497 106.886606 72.866884 106.708246 72.888005 106.511112 72.918514 106.290510 72.951370 106.168474 73.042897 106.145006 73.113302 106.248267 73.129729 106.346834 73.164932 106.656616 73.129729 106.853750 73.125036 106.985173 73.162585 107.262100 73.153198 107.515558 73.148504 107.590656 73.134423 107.745548 73.164932 107.956763 73.232990 108.111654 73.223603 108.299401 73.216562 108.243077 73.251765 108.275932 73.296355 108.487148 73.291661 108.660813 73.317476 108.881416 73.319823 109.134874 73.347985 109.191198 73.385534 109.167730 73.427778 109.266297 73.397269 109.336702 73.406656 109.224054 73.455940 109.102018 73.523998 109.116099 73.526345 109.181811 73.500529 109.289765 73.465327 109.435269 73.416043 109.641790 73.416043 109.810763 73.465327 109.984428 73.491142 # -b 110.151054 73.653074 109.977388 73.657767 109.799028 73.648380 109.691074 73.678889 109.676993 73.638993 109.775560 73.624912 109.667606 73.601443 109.522102 73.667155 109.437616 73.742253 109.447003 73.791537 109.644137 73.857248 109.742704 73.904185 109.789641 73.974590 # -b 92.366737 80.010650 92.573258 79.989529 92.761005 79.982488 92.948752 79.987182 93.108337 79.977794 93.296084 79.949632 93.465056 79.926164 93.634028 79.907389 93.662190 79.881574 93.540155 79.829944 93.408732 79.818210 93.314858 79.797088 93.258534 79.778313 93.098950 79.745458 92.892428 79.703215 92.761005 79.703215 92.667132 79.684440 92.507547 79.670359 92.301026 79.689134 92.122666 79.679746 91.953694 79.658625 91.775335 79.642197 91.625137 79.660972 91.493714 79.691480 91.324742 79.714949 91.334130 79.729030 91.446778 79.736070 91.615750 79.726683 91.690848 79.707908 91.812884 79.689134 91.925532 79.707908 91.991243 79.721989 92.132053 79.712602 92.216540 79.712602 92.254089 79.736070 92.132053 79.761886 91.963081 79.783007 91.803497 79.794741 91.615750 79.808822 91.456165 79.815863 91.315355 79.829944 91.334130 79.841678 91.446778 79.848718 91.428003 79.874534 91.399841 79.907389 91.296580 79.921470 91.146383 79.928511 91.127608 79.954326 91.193319 79.970754 91.259031 79.984835 91.268418 79.998916 # -b 94.030643 80.003610 93.833509 79.996569 # -b 98.057812 80.020037 98.132911 79.989529 98.132911 79.942592 98.114136 79.895655 97.926389 79.872187 97.672931 79.853412 97.672931 79.829944 97.654157 79.783007 97.494572 79.787701 97.372536 79.768926 97.175402 79.747805 96.987655 79.726683 96.893782 79.703215 96.987655 79.703215 97.137853 79.696174 97.325600 79.724336 97.447635 79.750151 97.560283 79.747805 97.729255 79.757192 97.832516 79.778313 97.898227 79.806475 97.992101 79.836984 98.151686 79.862799 98.339432 79.886268 98.405144 79.898002 98.423918 79.921470 98.433306 79.954326 98.452080 79.989529 # -b 98.862777 80.001263 98.937875 79.989529 99.097460 79.991875 # -b 99.280513 80.010650 99.515197 79.982488 99.533971 79.942592 99.656007 79.902696 99.731106 79.869840 99.881303 79.829944 99.843754 79.790048 99.975176 79.806475 99.956402 79.766579 99.853141 79.710255 99.862528 79.665665 # -b 100.228635 79.653931 99.918852 79.635156 99.881303 79.602301 99.815592 79.548324 99.731106 79.520162 99.712331 79.477918 99.665394 79.470878 99.665394 79.426288 99.693556 79.377005 99.674782 79.332415 99.674782 79.287825 99.599683 79.238541 99.421323 79.250275 99.233577 79.276091 99.073992 79.304253 98.970731 79.306600 99.008280 79.233848 99.120929 79.196298 99.327450 79.144668 99.505809 79.132934 99.477647 79.088344 99.590296 79.064875 99.702944 79.020286 99.712331 78.956921 99.665394 78.928759 99.693556 78.870088 99.477647 78.834886 99.233577 78.823151 99.224189 78.771521 98.980118 78.773868 98.782984 78.748053 98.557688 78.762134 98.341779 78.766827 98.069546 78.771521 97.881800 78.771521 97.656503 78.771521 97.581405 78.813764 97.459369 78.839579 97.262235 78.858354 97.083876 78.867741 96.990002 78.909984 96.642671 78.933453 96.426762 78.949881 96.220240 78.954574 96.229628 78.992124 96.041881 79.001511 95.854134 78.985083 95.779035 79.010898 95.760261 79.055488 95.750873 79.109465 95.694549 79.158749 95.591288 79.123546 95.459866 79.078957 95.178245 79.015592 95.028048 78.994470 94.924787 79.041407 94.830914 79.050794 94.708878 79.085997 94.605618 79.151708 94.352160 79.184564 94.230124 79.226807 94.211349 79.278437 94.211349 79.320681 94.220737 79.372311 94.201962 79.412207 94.136251 79.449756 94.136251 79.477918 93.986053 79.482612 93.901567 79.470878 93.779532 79.454450 93.741982 79.484959 93.666884 79.499040 93.516686 79.482612 93.441587 79.510774 93.385263 79.538936 93.216291 79.524855 93.197517 79.499040 93.206904 79.466184 93.141193 79.449756 93.075481 79.517815 92.944058 79.534243 92.822023 79.553017 92.953446 79.560058 93.131805 79.543630 93.272615 79.578832 93.404038 79.609341 93.544848 79.628116 93.695046 79.658625 93.732595 79.707908 93.826468 79.745458 93.882792 79.752498 94.051765 79.761886 94.286448 79.768926 94.474195 79.797088 94.483582 79.820556 94.323997 79.844025 94.239511 79.898002 94.295835 79.919123 94.352160 79.949632 94.492970 79.970754 94.577456 79.984835 # -b 99.942321 78.424190 99.970483 78.431230 # -b 100.064356 77.968903 99.942321 77.926660 99.792123 77.936048 99.632539 77.924314 99.444792 77.938395 99.463566 77.968903 99.557440 78.008800 99.529278 78.046349 99.332144 78.025228 99.379080 78.076858 99.397855 78.128488 99.472954 78.168384 99.594989 78.203587 99.717025 78.262258 99.885997 78.311541 99.942321 78.323276 99.979870 78.339703 # -b 100.031501 78.365519 99.928240 78.384293 99.928240 78.412455 99.947014 78.424190 # -b 89.914294 75.462484 90.078573 75.481258 90.003474 75.488299 # -b 89.980006 75.551663 90.111428 75.584519 90.332031 75.575132 90.463454 75.582172 90.763849 75.626762 90.796704 75.640843 90.904659 75.622068 91.050162 75.612681 91.172198 75.629109 91.303621 75.650230 91.435043 75.645537 91.524223 75.643190 91.524223 75.626762 91.524223 75.680739 91.547692 75.718289 91.580547 75.706554 91.622790 75.708901 91.688502 75.711248 91.744826 75.727676 91.852780 75.727676 91.913798 75.741757 91.956041 75.753491 92.040527 75.762878 92.101545 75.776959 92.162562 75.798081 92.232967 75.802775 92.326841 75.814509 92.444183 75.840324 92.491119 75.863792 92.500507 75.887261 92.481732 75.915423 92.491119 75.936544 92.448876 75.936544 92.416021 75.929504 92.420714 75.898995 92.411327 75.887261 92.373778 75.913076 92.355003 75.967053 92.270517 75.948278 92.181337 75.920116 92.148481 75.936544 92.153175 75.985828 92.148481 76.018683 92.186031 76.035111 92.200112 76.006949 92.223580 75.985828 92.279904 76.018683 92.350309 76.046846 92.406633 76.051539 92.383165 76.016337 92.401940 76.002256 92.523975 76.025724 92.631929 76.028071 92.636623 76.046846 92.566218 76.065620 92.580299 76.084395 92.697641 76.091435 92.744577 76.086742 92.829064 76.091435 92.871307 76.075008 92.908856 76.044499 92.951099 76.065620 93.002729 76.084395 93.007423 76.100823 93.030891 76.114904 93.115377 76.107863 93.171701 76.086742 93.256188 76.091435 93.284350 76.084395 93.321899 76.075008 93.326593 76.105516 93.368836 76.121944 93.420466 76.114904 93.462709 76.121944 93.542501 76.128985 93.631681 76.126638 93.711474 76.093782 93.777185 76.075008 93.763104 76.032765 93.730248 75.978787 93.641068 75.936544 93.575357 75.906035 93.551889 75.882567 93.584744 75.856752 93.669230 75.873180 93.734942 75.936544 93.824122 75.948278 93.903914 75.960013 93.946157 75.990521 93.960238 75.964706 94.054111 75.957666 94.044724 75.922463 93.988400 75.889608 93.960238 75.863792 93.988400 75.856752 94.110436 75.906035 94.147985 75.894301 94.176147 75.906035 94.218390 75.936544 94.265327 75.971747 94.321651 75.990521 94.331038 75.974094 94.331038 75.948278 94.331038 75.913076 94.401443 75.948278 94.438992 75.952972 94.481235 75.974094 94.532866 75.969400 94.593884 75.955319 94.640820 75.967053 94.636127 76.002256 94.607965 76.023377 94.542253 76.025724 94.579803 76.072661 94.617352 76.075008 94.687757 76.079701 94.715919 76.056233 94.762856 76.058580 94.767549 76.086742 94.744081 76.107863 94.725306 76.133678 94.762856 76.147759 94.837954 76.161840 94.903666 76.190002 94.992846 76.220511 95.063251 76.248673 95.119575 76.246327 95.114881 76.197043 95.175899 76.201737 95.274466 76.208777 95.293240 76.187656 95.283853 76.161840 95.260385 76.143066 95.260385 76.126638 95.354258 76.110210 95.448132 76.112557 95.476294 76.089089 95.476294 76.037458 95.532618 76.013990 95.593635 76.011643 95.626491 76.056233 95.626491 76.096129 95.626491 76.126638 95.626491 76.143066 95.635878 76.159494 95.654653 76.182962 95.664040 76.199390 95.654653 76.236939 95.593635 76.255714 95.504456 76.248673 95.424663 76.255714 95.429357 76.288570 95.354258 76.323772 95.293240 76.326119 95.260385 76.333159 95.246304 76.382443 95.189980 76.410605 95.194673 76.431726 95.166511 76.445807 95.161818 76.464582 # -b 98.804106 76.464582 98.888592 76.469276 98.935529 76.464582 99.001240 76.459888 99.104501 76.450501 99.245311 76.441114 99.376734 76.431726 99.536318 76.427033 99.714678 76.422339 99.817939 76.438767 99.874263 76.441114 99.883650 76.441114 99.958749 76.450501 # -b 96.321154 76.274489 96.321154 76.272142 96.283605 76.248673 96.283605 76.215818 96.330542 76.185309 96.311767 76.159494 96.321154 76.128985 96.189731 76.133678 96.058309 76.136025 95.926886 76.138372 95.757914 76.147759 95.645266 76.171228 95.504456 76.175921 95.448132 76.194696 95.326096 76.211124 95.288547 76.239286 95.269772 76.251020 95.354258 76.265101 95.373033 76.248673 95.438744 76.243980 95.457519 76.215818 95.513843 76.248673 95.607716 76.255714 95.710977 76.295610 95.776688 76.274489 95.917499 76.267448 96.011372 76.251020 96.030147 76.236939 96.133407 76.265101 96.274217 76.288570 96.424415 76.276835 96.555838 76.248673 96.584000 76.225205 96.574612 76.185309 96.555838 76.157147 96.508901 76.185309 96.490126 76.236939 96.396253 76.262754 96.321154 76.274489 # -b 96.300033 77.004354 96.300033 76.987926 96.196772 76.964458 96.084124 76.931602 95.999638 76.898747 95.868215 76.889359 95.736792 76.861197 95.671081 76.868238 95.671081 76.894053 95.755567 76.896400 95.877602 76.933949 95.868215 76.952724 95.736792 76.926909 95.577207 76.910481 95.436397 76.912828 95.239263 76.896400 95.173552 76.915175 95.333137 76.948030 95.483334 76.997314 95.633532 77.004354 95.868215 77.046597 96.027800 77.067719 96.121673 77.095881 96.271871 77.140471 96.337582 77.117002 96.393906 77.088840 96.393906 77.048944 96.365744 77.009048 96.337582 76.994967 96.328195 76.990273 96.300033 77.004354 # -b 80.341554 73.164932 80.454202 73.183707 80.562156 73.209522 80.585625 73.261152 80.519913 73.272886 80.407265 73.270540 80.341554 73.315129 80.407265 73.352679 80.463589 73.345638 80.552769 73.329210 80.552769 73.364413 80.651336 73.385534 80.782759 73.418390 80.829696 73.458286 80.740516 73.465327 80.707660 73.437165 80.641949 73.430124 80.576237 73.477061 80.552769 73.526345 80.627868 73.540426 80.740516 73.549813 80.839083 73.547466 80.871939 73.568588 81.036217 73.592056 81.148865 73.568588 81.247432 73.561547 81.303756 73.573281 81.303756 73.596750 81.402323 73.606137 81.491503 73.610831 81.599457 73.620218 81.712106 73.629605 81.843528 73.641340 81.965564 73.657767 82.054743 73.657767 82.172085 73.655421 82.294121 73.641340 82.449012 73.653074 82.636759 73.660114 82.716551 73.648380 82.801037 73.634299 82.932460 73.638993 83.176531 73.646033 83.373665 73.648380 83.664672 73.660114 83.918131 73.676542 84.068328 73.702357 84.171589 73.704704 84.368723 73.714091 84.547082 73.723479 84.753604 73.753988 84.819315 73.751641 84.852171 73.716438 84.983594 73.704704 85.194809 73.695317 85.429492 73.751641 85.481123 73.793884 85.626627 73.812658 85.758049 73.815005 85.847229 73.805618 85.969264 73.838474 86.077219 73.852555 86.199254 73.857248 86.264966 73.852555 86.485568 73.861942 86.663928 73.885410 86.673315 73.918266 86.574748 73.934694 86.541892 73.958162 86.631072 73.974590 86.574748 74.009793 86.584135 74.028567 86.696783 74.021527 86.795350 74.007446 86.837593 74.021527 86.893917 74.037955 86.785963 74.059076 86.715558 74.096626 86.682702 74.148256 86.640459 74.225701 86.518424 74.242129 86.354145 74.253863 86.189867 74.256210 86.077219 74.267944 85.969264 74.284372 85.856616 74.310188 85.847229 74.359471 85.889472 74.380593 86.002120 74.385286 86.077219 74.385286 86.067832 74.399367 86.020895 74.415795 86.142930 74.434570 86.241497 74.439263 86.274353 74.455691 86.307209 74.462732 86.377614 74.467425 86.443325 74.458038 86.541892 74.448651 86.584135 74.469772 86.518424 74.483853 86.518424 74.502628 86.509037 74.523750 86.584135 74.540177 86.509037 74.547218 86.462100 74.561299 86.344758 74.573033 86.232110 74.605889 86.020895 74.608236 85.833148 74.610582 85.692338 74.624663 85.668870 74.650479 85.748662 74.662213 85.701725 74.706803 85.814373 74.723231 85.889472 74.730271 85.969264 74.749046 85.912940 74.786595 85.870697 74.812410 85.889472 74.819451 85.955183 74.817104 86.002120 74.805370 86.086606 74.795982 86.189867 74.781901 86.232110 74.732618 86.330677 74.716190 86.476181 74.697415 86.518424 74.671600 86.584135 74.643438 86.649847 74.619970 86.771882 74.648132 86.663928 74.688028 86.715558 74.737312 86.828206 74.737312 86.884530 74.767820 86.917386 74.786595 86.950242 74.817104 87.048809 74.854653 87.091052 74.880468 87.156763 74.922711 87.114520 74.948527 87.170844 74.967301 87.260024 74.974342 87.292879 74.948527 87.400834 74.934446 87.588581 74.976689 87.654292 75.007198 87.522869 75.011891 87.358591 75.021279 87.260024 75.016585 87.114520 75.042400 86.950242 75.054134 86.828206 75.079949 86.917386 75.101071 87.072277 75.126886 87.245943 75.124539 87.490014 75.115152 87.644905 75.108111 87.701229 75.082296 87.734084 75.068215 87.776327 75.072909 87.898363 75.094030 87.987543 75.096377 88.039173 75.115152 88.020398 75.145661 88.039173 75.166782 88.241001 75.206679 88.325487 75.237187 88.395892 75.267696 88.438135 75.293511 88.503846 75.302899 88.616494 75.307592 88.649350 75.342795 88.790160 75.347489 88.968520 75.368610 88.921583 75.394425 88.823016 75.394425 88.846484 75.415547 88.968520 75.417894 89.067087 75.427281 89.189122 75.469524 89.278302 75.441362 89.376869 75.417894 89.475436 75.403813 89.606859 75.436668 89.728894 75.462484 89.916641 75.462484 # -b 90.003474 75.488299 89.890826 75.502380 89.834502 75.523501 89.980006 75.551663 # -b 89.496558 77.304749 89.468396 77.302402 89.468396 77.285974 89.440234 77.260159 89.505945 77.243731 89.515332 77.208529 89.590431 77.199142 89.571656 77.159245 89.487170 77.131083 89.336973 77.152205 89.280649 77.126390 89.196163 77.135777 89.139839 77.208529 89.196163 77.250772 89.261874 77.271893 89.365135 77.293015 89.449621 77.304749 89.496558 77.304749 # -b 82.188513 75.413200 82.254224 75.401466 82.272999 75.342795 82.230756 75.340448 82.108721 75.356876 82.043009 75.298205 82.052397 75.232494 82.043009 75.192598 81.944442 75.248922 81.920974 75.352182 81.831794 75.328714 81.723840 75.368610 81.611192 75.382691 81.601804 75.321673 81.658128 75.251268 81.690984 75.201985 81.625273 75.244228 81.545480 75.319327 81.493850 75.370957 81.503237 75.427281 81.658128 75.464830 81.681597 75.424934 81.766083 75.403813 81.855262 75.434322 81.888118 75.460137 81.986685 75.497686 81.822407 75.483605 81.855262 75.509420 82.075865 75.516461 82.240143 75.488299 82.155657 75.457790 82.188513 75.413200 # -b 82.319936 70.398013 82.319936 70.423829 82.352792 70.470765 82.441971 70.515355 82.564007 70.517702 82.639105 70.451991 82.714204 70.379239 82.770528 70.308834 82.817465 70.240775 82.747060 70.214960 82.648493 70.158636 82.517070 70.189145 82.427890 70.231388 82.385647 70.273631 82.352792 70.315874 82.319936 70.360464 82.319936 70.398013 # -b 79.961367 72.198036 80.181969 72.144059 80.379103 72.099469 80.590318 72.068960 80.843777 72.031411 80.843777 71.984474 80.918875 71.937537 81.153559 71.850704 81.294369 71.766218 81.327225 71.780299 81.416404 71.745097 81.538440 71.714588 81.669862 71.702854 81.834141 71.669998 81.989032 71.679385 82.167392 71.681732 82.355138 71.686426 82.575741 71.702854 82.716551 71.723975 82.885523 71.745097 82.984090 71.721628 83.106126 71.695813 83.303260 71.655917 83.279791 71.590206 83.270404 71.557350 83.115513 71.543269 83.073270 71.475211 83.059189 71.407152 83.016946 71.364909 82.674308 71.306239 82.430237 71.249915 82.298814 71.174816 82.331670 71.113798 82.355138 71.015231 82.298814 70.933092 82.312895 70.846259 82.322283 70.759426 82.387994 70.719530 82.298814 70.623310 82.242490 70.543517 82.233103 70.456684 82.233103 70.386279 82.242490 70.329955 82.242490 70.257203 82.289427 70.182105 82.387994 70.137515 82.477174 70.114046 82.632065 70.111699 82.796343 70.102312 82.951234 70.081191 83.092045 70.064763 83.246936 70.048335 83.303260 70.099965 83.237548 70.151596 83.148369 70.226694 83.181224 70.273631 83.312647 70.252510 83.523862 70.273631 83.598961 70.297099 83.720996 70.360464 83.800789 70.444950 83.810176 70.536477 83.767933 70.646778 83.678753 70.738304 83.622429 70.846259 83.589574 70.928398 83.448764 70.994109 83.303260 71.062168 83.336115 71.134920 83.270404 71.228793 83.401827 71.313279 83.425295 71.411846 83.613042 71.468170 83.688141 71.583165 83.702222 71.637142 83.655285 71.674692 83.547331 71.745097 83.481619 71.829583 83.425295 71.789687 83.270404 71.829583 83.082657 71.848357 82.894910 71.864785 82.716551 71.899988 82.585128 71.991514 82.477174 72.029064 82.275346 72.047838 82.345751 72.073654 82.430237 72.139365 82.322283 72.230892 82.200247 72.230892 82.054743 72.254360 81.913933 72.294256 81.716799 72.308337 81.482116 72.308337 81.228657 72.334152 81.106622 72.381089 80.975199 72.423332 80.900101 72.482003 80.886020 72.533633 80.900101 72.580570 80.810921 72.620466 80.787452 72.700259 80.834389 72.763623 80.867245 72.791785 80.942344 72.824641 80.951731 72.864537 81.022136 72.892699 80.918875 72.927902 80.867245 72.979532 80.843777 73.024122 80.820308 73.045243 80.754597 73.038203 80.646642 73.064018 80.665417 73.089833 80.580931 73.110955 80.510526 73.127383 80.458896 73.136770 80.444815 73.136770 80.341554 73.164932 # -b 70.243122 73.014735 70.144555 73.021775 70.177411 73.054631 70.275978 73.134423 70.285365 73.204828 70.233735 73.279927 70.341689 73.343291 70.473112 73.434818 70.806363 73.462980 71.092677 73.432471 71.214712 73.378494 71.158388 73.331557 71.083289 73.249418 71.181856 73.242378 71.346135 73.242378 71.524494 73.235337 71.599593 73.176666 71.336747 73.150851 71.181856 73.085140 70.862687 73.099221 70.660859 73.061671 70.520049 73.040550 70.454337 73.120342 70.374545 73.071059 70.341689 73.040550 70.318221 73.014735 70.243122 73.014735 # -b 74.202233 73.019428 74.258557 73.066365 74.413448 73.085140 74.634051 73.064018 74.854653 73.038203 74.878122 73.019428 74.732618 73.005347 74.657519 72.906780 74.657519 72.841069 74.469772 72.902086 74.225701 72.967798 74.202233 73.019428 # -b 79.276091 73.012388 79.266703 72.960757 79.379351 72.927902 79.496693 72.892699 79.529549 72.780051 79.529549 72.700259 79.445063 72.672097 79.323027 72.700259 79.055488 72.704952 78.834886 72.756583 78.703463 72.812907 78.816111 72.890352 78.971002 72.944329 79.078957 73.005347 79.177524 73.047590 79.243235 73.040550 79.308946 73.021775 79.276091 73.012388 # -b 77.368114 72.500778 77.466681 72.514859 77.490149 72.524246 77.588716 72.575876 77.720139 72.568836 77.931354 72.543021 78.184812 72.526593 78.316235 72.474962 78.269298 72.402211 78.086245 72.364661 77.884417 72.287216 77.588716 72.261400 77.321177 72.254360 77.203835 72.233238 77.025476 72.233238 76.969152 72.291909 77.081800 72.378742 77.222610 72.444454 77.368114 72.500778 # -b 69.947421 72.871578 70.144555 72.871578 70.365158 72.871578 70.473112 72.876271 70.792282 72.859843 70.970641 72.876271 71.289811 72.883312 71.566737 72.892699 71.665304 72.873924 71.829583 72.824641 72.106509 72.782398 72.383436 72.749542 72.505471 72.740155 72.589957 72.723727 # -b 72.592304 72.723727 72.629854 72.723727 72.629854 72.716686 72.550061 72.683831 72.629854 72.653322 72.629854 72.620466 72.592304 72.566489 72.592304 72.526593 72.615773 72.428026 72.681484 72.345887 72.681484 72.308337 72.639241 72.200383 72.526593 72.120590 72.507818 72.073654 72.409251 71.956312 72.254360 71.862438 72.273135 71.806114 72.263747 71.761525 72.118244 71.709894 72.085388 71.648876 71.986821 71.630102 71.799074 71.592552 71.789687 71.583165 71.766218 71.576125 71.756831 71.498679 71.878866 71.428274 72.000902 71.355522 72.188649 71.280423 72.409251 71.235834 72.559449 71.188897 72.540674 71.127879 72.517205 71.050434 72.648628 70.956560 72.770664 70.853299 72.770664 70.733611 72.681484 70.639737 72.695565 70.536477 72.728421 70.437910 72.714340 70.398013 72.573530 70.360464 72.484350 70.329955 72.409251 70.257203 72.442107 70.177411 72.559449 70.132821 72.573530 70.095272 72.526593 70.006092 # -b 73.641340 69.942727 73.763375 70.006092 73.749294 70.114046 73.796231 70.196186 74.059076 70.308834 74.082545 70.355770 74.237436 70.482499 74.303147 70.602188 74.303147 70.660859 74.134175 70.787588 73.894798 70.921358 73.838474 71.010537 73.796231 71.113798 73.627258 71.228793 73.495836 71.308585 73.387881 71.357869 73.186053 71.425927 72.998307 71.486945 72.998307 71.540922 73.120342 71.578471 73.284621 71.637142 73.355026 71.702854 73.364413 71.752137 73.340945 71.829583 73.528691 71.878866 73.650727 71.909375 73.880717 71.956312 74.101319 71.993861 74.223355 72.005595 74.246823 72.007942 74.279679 72.029064 74.589461 72.099469 74.842919 72.183955 74.983729 72.268441 74.997810 72.378742 74.983729 72.519552 74.899243 72.632200 74.763127 72.740155 74.753739 72.803519 75.016585 72.845762 75.105765 72.791785 75.326367 72.733114 75.392079 72.700259 75.373304 72.655669 75.415547 72.599345 75.570438 72.540674 75.593906 72.524246 75.439015 72.493737 75.481258 72.397517 75.537582 72.331806 75.612681 72.254360 75.561051 72.200383 75.439015 72.106509 75.359223 72.038451 75.204332 71.991514 75.359223 71.930497 75.302899 71.857745 75.251268 71.789687 75.260656 71.728669 75.359223 71.658264 75.471871 71.601940 75.481258 71.484598 75.457790 71.454089 75.218413 71.440008 75.171476 71.418887 75.251268 71.378990 75.359223 71.334401 75.537582 71.287464 75.767572 71.252261 75.978787 71.235834 76.110210 71.217059 76.288570 71.210018 76.485704 71.202978 76.729775 71.195937 76.917521 71.163082 77.170980 71.160735 77.335258 71.158388 77.400969 71.158388 77.574635 71.141960 77.752995 71.090330 77.809319 71.029312 77.950129 70.982375 78.128488 70.949520 78.414802 70.940132 78.414802 70.996456 78.184812 71.085636 78.161344 71.177163 78.151957 71.263996 77.940741 71.238180 77.865643 71.280423 77.907886 71.369603 77.729526 71.308585 77.612185 71.292158 77.555861 71.280423 77.541779 71.278077 77.443212 71.315626 77.288321 71.322666 77.114655 71.393071 76.861197 71.428274 76.617126 71.486945 76.438767 71.540922 76.340200 71.550309 76.297957 71.627755 76.199390 71.714588 76.119597 71.829583 76.002256 71.871826 76.175921 71.946925 76.373056 71.956312 76.551415 71.862438 76.837729 71.768565 76.837729 71.681732 77.203835 71.716935 77.490149 71.784993 77.832787 71.824889 78.029921 71.895294 78.105020 71.975087 77.865643 72.038451 77.654428 72.052532 77.368114 72.045492 77.433825 72.153446 77.598104 72.176914 77.832787 72.207423 77.940741 72.268441 78.095633 72.324765 78.381946 72.341193 78.724584 72.338846 79.010898 72.334152 79.320681 72.331806 79.574139 72.301297 79.813516 72.256707 79.959020 72.198036 # -b 59.933476 75.999909 60.017962 76.044499 60.111835 76.063273 60.215096 76.072661 60.355906 76.093782 60.449779 76.110210 60.599977 76.100823 60.656301 76.089089 60.534265 76.039805 60.440392 75.964706 60.609364 75.952972 60.703237 76.006949 60.881597 76.032765 61.031794 76.039805 61.116280 76.089089 60.984858 76.114904 60.919146 76.164187 60.919146 76.211124 60.919146 76.225205 61.041182 76.220511 61.106893 76.258061 61.022407 76.281529 61.397901 76.304997 61.426063 76.265101 61.623197 76.262754 61.782782 76.251020 61.998690 76.255714 62.242761 76.246327 62.252149 76.157147 62.439895 76.138372 62.590093 76.190002 62.749678 76.168881 62.834164 76.166534 63.050073 76.201737 63.237819 76.234592 63.406792 76.251020 63.500665 76.281529 63.632088 76.297957 63.829222 76.297957 63.876159 76.267448 63.932483 76.258061 64.101455 76.267448 64.185941 76.293263 64.307976 76.288570 64.383075 76.321425 64.542660 76.328466 64.664695 76.363668 64.889991 76.427033 65.058963 76.415299 65.237323 76.422339 65.312422 76.450501 65.406295 76.518559 65.575267 76.488051 65.716077 76.502132 65.838113 76.539681 65.819338 76.586618 65.772401 76.657023 65.847500 76.708653 65.913211 76.720387 66.063409 76.732121 66.241768 76.781405 66.279318 76.776711 66.251156 76.772018 66.391966 76.781405 66.467065 76.804873 66.589100 76.835382 66.664199 76.882319 66.795621 76.875278 66.898882 76.861197 67.171115 76.903440 67.349475 76.945683 67.565383 76.952724 67.771905 76.945683 67.931490 76.943337 68.072300 76.931602 68.269434 76.910481 68.475955 76.894053 68.626153 76.861197 68.710639 76.823648 68.860836 76.795486 68.842062 76.748549 68.879611 76.718040 68.973484 76.668757 69.039196 76.631207 69.029808 76.579577 68.870224 76.553762 68.795125 76.481010 68.898386 76.478663 69.048583 76.473970 69.001646 76.445807 68.795125 76.410605 68.682477 76.377749 68.597991 76.351934 68.551054 76.328466 68.466568 76.304997 68.419631 76.262754 68.344533 76.234592 68.241272 76.197043 68.297596 76.171228 68.372695 76.145413 68.231885 76.164187 68.072300 76.180615 67.912715 76.180615 67.743743 76.166534 67.584158 76.131332 67.387024 76.082048 67.255601 76.046846 67.030305 76.004602 66.880108 75.999909 66.654811 75.967053 66.467065 75.967053 66.269930 75.945932 66.082184 75.915423 65.866275 75.927157 65.659753 75.908382 65.500168 75.896648 65.368746 75.868486 65.321809 75.821549 65.124675 75.776959 65.030801 75.828590 64.871217 75.758185 64.514498 75.706554 64.153085 75.652577 63.857384 75.600947 63.744736 75.607987 63.669637 75.657271 63.528827 75.694820 63.416179 75.676046 63.449035 75.626762 63.392711 75.610334 63.341080 75.568091 63.106397 75.504727 62.810695 75.424934 62.655804 75.424934 62.369490 75.396772 62.313166 75.359223 62.223987 75.321673 62.148888 75.359223 62.036240 75.307592 61.914204 75.267696 61.782782 75.204332 61.651359 75.155048 61.454225 75.101071 61.299334 75.049441 61.135055 75.030666 60.956696 75.018932 60.815886 75.018932 60.726706 74.990770 60.693850 75.028319 60.482635 75.023625 60.407536 75.051787 60.294888 74.976689 60.426311 74.943833 60.571815 74.934446 60.628139 74.885162 60.449779 74.842919 60.262032 74.795982 60.163465 74.758433 60.205708 74.713843 60.130610 74.664560 59.999187 74.659866 # -b 59.766850 70.146902 60.020308 70.050682 # -b 66.858986 69.888750 66.910616 70.036601 # -b 67.211011 69.975583 67.333047 70.074150 67.220399 70.151596 67.178156 70.285365 67.318966 70.360464 67.309578 70.484846 67.318966 70.616269 67.417533 70.696061 67.300191 70.792282 67.032652 70.801669 66.891842 70.754732 66.779194 70.740651 66.638383 70.721877 66.525735 70.799322 66.614915 70.902583 66.802662 70.935439 66.943472 70.977682 67.032652 71.036353 67.032652 71.076249 67.032652 71.125532 66.976328 71.141960 66.858986 71.071555 66.779194 71.036353 66.690014 71.043393 66.690014 71.076249 66.736951 71.149001 66.812049 71.266342 66.934085 71.294504 67.309578 71.343788 67.652216 71.449395 68.013629 71.583165 68.201376 71.688773 68.370348 71.784993 68.445447 71.888254 68.511158 72.031411 68.567482 72.181608 68.666049 72.247319 68.764616 72.367008 68.820940 72.484350 68.886652 72.589957 69.018074 72.683831 69.172965 72.763623 69.262145 72.838722 69.262145 72.876271 69.351325 72.925555 69.360712 72.927902 69.515603 72.932595 69.726819 72.951370 69.858241 72.944329 69.736206 72.899740 69.947421 72.871578 # -b 58.797607 80.001263 58.684959 79.996569 58.591086 79.991875 58.581698 79.973101 58.562924 79.968407 58.553536 79.951979 58.562924 79.942592 58.638023 79.942592 58.675572 79.930858 58.750671 79.921470 58.741283 79.900349 58.778833 79.886268 58.806995 79.879227 58.872706 79.902696 58.891481 79.909736 58.957192 79.900349 59.032291 79.888615 59.022903 79.876880 59.051066 79.862799 59.116777 79.848718 59.210650 79.853412 59.276362 79.853412 59.351460 79.855759 59.379622 79.869840 59.473496 79.867493 59.520433 79.874534 59.492271 79.895655 59.473496 79.900349 59.557982 79.902696 59.595531 79.893308 59.698792 79.898002 59.745729 79.912083 59.689405 79.930858 59.689405 79.956673 59.651855 79.980141 59.651855 79.996569 # -b 53.744871 73.261152 53.801195 73.277580 53.899762 73.270540 54.054654 73.251765 54.251788 73.251765 54.406679 73.303395 54.636669 73.333904 54.871352 73.369107 55.101342 73.369107 55.298476 73.315129 55.462755 73.291661 55.730294 73.286967 55.918041 73.251765 56.138643 73.195441 56.359246 73.190747 56.500056 73.127383 56.546992 73.080446 56.401489 73.061671 56.260679 73.047590 56.049463 73.047590 55.918041 73.028816 56.091706 73.019428 56.293534 73.005347 56.424957 73.005347 56.345165 72.970145 56.138643 72.977185 55.903960 72.944329 55.716213 72.911474 55.936815 72.902086 56.148030 72.923208 56.302922 72.934942 56.326390 72.871578 56.246598 72.822294 56.091706 72.780051 55.918041 72.763623 55.697438 72.780051 55.575403 72.775357 55.551934 72.756583 55.519079 72.723727 55.819474 72.733114 55.885185 72.672097 55.828861 72.646281 55.753762 72.604038 55.697438 72.517205 55.584790 72.535980 55.519079 72.507818 55.584790 72.484350 55.575403 72.423332 55.453367 72.418638 55.462755 72.355274 55.443980 72.284869 55.462755 72.209770 55.551934 72.151099 55.542547 72.090081 55.420512 71.977433 55.443980 71.916416 55.519079 71.881213 55.551934 71.747444 55.584790 71.655917 55.664582 71.547963 55.716213 71.491639 55.871104 71.421233 56.025995 71.301545 56.082319 71.252261 56.105787 71.181856 56.326390 71.078596 56.523524 70.994109 56.720658 70.933092 56.866162 70.909623 57.039828 70.841565 57.175944 70.808710 57.340223 70.766466 57.438790 70.773507 57.635924 70.712489 57.518582 70.696061 57.518582 70.639737 57.405934 70.620963 57.340223 70.609229 57.175944 70.623310 56.964729 70.632697 56.866162 70.599841 56.974116 70.588107 57.161863 70.581067 57.283899 70.562292 57.143089 70.550558 57.110233 70.510661 57.110233 70.496580 56.955342 70.534130 56.800451 70.590454 56.701884 70.635044 56.598623 70.656165 56.654947 70.728917 56.467200 70.696061 56.302922 70.696061 56.213742 70.660859 56.246598 70.620963 56.359246 70.606882 56.448425 70.623310 56.481281 70.562292 56.326390 70.566985 56.227823 70.550558 56.040076 70.606882 55.936815 70.602188 55.993139 70.555251 55.903960 70.583413 55.786618 70.660859 55.730294 70.656165 55.631727 70.656165 55.476836 70.689021 55.420512 70.623310 55.345413 70.642084 55.298476 70.616269 55.289089 70.550558 55.176441 70.550558 54.979307 70.606882 54.791560 70.667899 54.725848 70.719530 54.937064 70.719530 54.922983 70.747692 54.627281 70.759426 54.528714 70.740651 54.397291 70.728917 54.284643 70.726570 54.218932 70.712489 54.087509 70.726570 53.998329 70.785241 53.923231 70.754732 53.787114 70.775854 53.754259 70.806363 53.744871 70.855646 53.768340 70.921358 53.754259 70.961254 53.679160 71.003497 53.744871 71.024618 53.956086 70.984722 53.998329 71.010537 53.932618 71.064515 54.087509 71.038699 54.308112 71.050434 54.326886 71.071555 54.106284 71.090330 54.195464 71.120839 54.073428 71.146654 53.932618 71.160735 53.843438 71.149001 53.735484 71.163082 53.566512 71.217059 53.566512 71.263996 53.632223 71.256955 53.655692 71.313279 53.754259 71.343788 53.988942 71.449395 53.899762 71.440008 53.744871 71.397765 53.566512 71.301545 53.458557 71.263996 53.458557 71.350828 53.411621 71.400112 53.425702 71.468170 53.458557 71.519801 53.303666 71.477558 53.270811 71.456436 53.237955 71.447049 53.106532 71.482251 53.040821 71.425927 52.918785 71.449395 52.853074 71.418887 52.796750 71.493985 52.796750 71.578471 52.651246 71.620714 52.552679 71.562044 52.496355 71.529188 52.477580 71.461130 52.430644 71.491639 52.388401 71.547963 52.299221 71.515107 52.275752 71.456436 52.055150 71.456436 51.947196 71.461130 51.881484 71.491639 51.759449 71.498679 51.660882 71.550309 51.613945 71.606633 51.529459 71.674692 51.496603 71.759178 51.482522 71.841317 51.515378 71.904682 51.529459 71.979780 51.595170 72.031411 51.768836 72.083041 51.858016 72.099469 51.970664 72.054879 52.078618 72.092428 52.242897 72.099469 52.233509 72.045492 52.332077 72.014983 52.397788 72.061919 52.430644 72.120590 52.510436 72.132325 52.519823 72.209770 52.519823 72.254360 52.641859 72.256707 52.651246 72.298950 52.599616 72.355274 52.651246 72.355274 52.740426 72.362314 52.740426 72.435066 52.820218 72.446800 52.895317 72.500778 53.003271 72.533633 53.040821 72.566489 52.838993 72.517205 52.763894 72.554755 52.820218 72.589957 52.862461 72.622813 52.698183 72.613426 52.562066 72.641588 52.411869 72.695565 52.430644 72.728421 52.477580 72.780051 52.609003 72.822294 52.782669 72.857497 53.003271 72.885659 53.139388 72.864537 53.359990 72.909127 53.191018 72.909127 53.106532 72.944329 53.172244 72.974838 53.294279 72.984226 53.247342 73.019428 53.148775 73.047590 53.125307 73.092180 53.223874 73.129729 53.458557 73.207175 53.669773 73.235337 53.744871 73.261152 # -b 53.669773 73.763375 53.669773 73.789190 53.754259 73.765722 53.974861 73.782150 54.096897 73.831433 54.242400 73.883064 54.481778 73.915919 54.758704 73.934694 54.669524 73.962856 54.768091 74.047342 54.946451 74.080198 55.068486 74.122441 55.279701 74.087238 55.533160 74.073157 55.786618 74.026220 56.105787 74.002752 55.927428 74.073157 55.683357 74.122441 55.378269 74.171724 55.077874 74.209274 55.223377 74.195193 55.551934 74.209274 55.631727 74.260904 55.354800 74.305494 55.190522 74.331309 55.223377 74.364165 55.509691 74.378246 55.852329 74.378246 56.007220 74.399367 55.871104 74.441610 55.664582 74.455691 55.551934 74.493241 55.462755 74.544871 55.453367 74.605889 55.509691 74.622317 55.608258 74.587114 55.772537 74.622317 56.016608 74.648132 56.180886 74.631704 56.415570 74.624663 56.645560 74.664560 56.434344 74.652825 56.312309 74.671600 56.204355 74.732618 56.007220 74.746699 55.852329 74.730271 55.641114 74.727924 55.584790 74.767820 55.598871 74.772514 55.730294 74.807717 55.852329 74.880468 55.903960 74.925058 55.805393 74.922711 55.796005 74.946180 55.716213 74.986076 55.551934 74.922711 55.542547 74.990770 55.429899 75.016585 55.551934 75.068215 55.500304 75.091684 55.598871 75.145661 55.730294 75.138620 55.918041 75.140967 55.927428 75.065868 56.072932 75.042400 56.270066 75.077603 56.467200 75.098724 56.636172 75.169129 56.701884 75.248922 56.866162 75.263003 57.021053 75.291165 57.152476 75.281777 57.260430 75.284124 57.349610 75.277084 57.481033 75.265349 57.626537 75.305246 57.847139 75.363916 57.870607 75.417894 57.790815 75.467177 57.856526 75.488299 57.870607 75.483605 57.978562 75.500033 57.936319 75.554010 58.213245 75.617375 58.288344 75.607987 58.396299 75.603294 58.452623 75.617375 58.565271 75.629109 58.499559 75.657271 58.541802 75.690127 58.574658 75.751144 58.640369 75.791040 58.724855 75.814509 58.804648 75.835630 58.860972 75.859099 58.945458 75.877873 59.053412 75.887261 59.147286 75.913076 59.212997 75.948278 59.236465 75.999909 # -b 60.076632 74.659866 59.874805 74.645785 59.710526 74.695068 59.447681 74.720884 59.489924 74.688028 59.710526 74.617623 59.823174 74.549565 59.888886 74.509669 59.856030 74.509669 59.677670 74.544871 59.433600 74.605889 59.212997 74.636398 59.039331 74.617623 59.058106 74.596501 59.039331 74.568339 59.128511 74.502628 59.212997 74.481506 59.015863 74.514362 58.983007 74.486200 59.081574 74.432223 59.090962 74.411101 59.058106 74.399367 59.025250 74.382939 59.015863 74.378246 58.973620 74.373552 58.860972 74.373552 58.785873 74.422836 58.565271 74.469772 58.255488 74.533137 58.222633 74.486200 58.466704 74.420489 58.598126 74.352431 58.687306 74.298453 58.738936 74.260904 58.753017 74.206927 58.663838 74.211620 58.616901 74.176418 58.598126 74.129481 58.485478 74.167031 58.443235 74.164684 58.452623 74.103666 58.499559 74.082545 58.419767 74.059076 58.255488 74.103666 58.213245 74.047342 58.246101 74.014486 58.264876 73.974590 58.255488 73.976937 58.124066 73.962856 58.034886 74.005099 57.903463 74.014486 57.837752 74.080198 57.715716 74.150603 57.560825 74.218661 57.504501 74.164684 57.448177 74.122441 57.495114 74.066117 57.504501 74.059076 57.429402 74.044995 57.274511 74.030914 57.363691 74.019180 57.570213 73.998058 57.692248 73.967550 57.701635 73.913572 57.879995 73.890104 57.781428 73.866636 57.823671 73.833780 57.837752 73.791537 57.804896 73.746947 57.790815 73.723479 57.617149 73.721132 57.527970 73.793884 57.405934 73.810312 57.241656 73.819699 56.941261 73.831433 56.776982 73.819699 56.941261 73.782150 57.208800 73.772762 57.373078 73.707051 57.462258 73.662461 57.518582 73.603790 57.462258 73.568588 57.363691 73.556853 57.330835 73.526345 57.129008 73.566241 57.039828 73.627258 56.842694 73.646033 56.931873 73.559200 57.021053 73.500529 57.063296 73.484102 57.152476 73.458286 57.185332 73.416043 57.152476 73.411350 57.039828 73.371453 57.006972 73.340945 56.955342 73.305742 56.842694 73.298702 56.833306 73.279927 56.800451 73.263499 56.711271 73.225950 56.565767 73.232990 56.434344 73.268193 56.359246 73.258805 56.237210 73.258805 56.105787 73.258805 55.918041 73.303395 55.763149 73.322170 55.566015 73.317476 55.443980 73.331557 55.298476 73.373800 55.157666 73.409003 54.922983 73.401962 54.782172 73.392575 54.585038 73.369107 54.481778 73.343291 54.373823 73.322170 54.284643 73.322170 54.106284 73.331557 54.143833 73.350332 54.317499 73.380841 54.397291 73.425431 54.275256 73.427778 54.284643 73.488795 54.373823 73.528691 54.495859 73.559200 54.702380 73.606137 54.838496 73.599096 54.979307 73.631952 55.091955 73.655421 55.077874 73.671848 54.922983 73.704704 54.838496 73.667155 54.636669 73.655421 54.495859 73.613177 54.416066 73.587362 54.242400 73.589709 54.007717 73.599096 53.974861 73.646033 53.866907 73.676542 53.754259 73.692970 53.702628 73.725826 53.679160 73.753988 53.669773 73.763375 # -b 52.310955 71.287464 52.310955 71.308585 52.390747 71.315626 52.578494 71.355522 52.752160 71.322666 52.921132 71.263996 52.963375 71.299198 53.127654 71.214712 53.183978 71.181856 53.193365 71.120839 53.174590 71.043393 53.127654 71.022272 53.151122 70.956560 53.207446 70.893196 53.141735 70.879115 53.005618 71.008190 52.874195 71.085636 52.766241 71.200631 52.620737 71.207671 52.381360 71.249915 52.310955 71.287464 # -b 58.764752 69.968543 58.708428 70.027213 58.666185 70.083537 58.666185 70.125780 58.577005 70.144555 58.534762 70.207920 58.699040 70.182105 58.877400 70.196186 58.788220 70.219654 58.633329 70.273631 58.699040 70.285365 58.797607 70.336996 58.863319 70.412094 59.027597 70.430869 59.196569 70.329955 59.360848 70.290059 59.393703 70.247816 59.468802 70.200879 59.769197 70.146902 # -b 47.624325 80.005956 47.643100 79.987182 47.652487 79.954326 47.727586 79.961367 47.793297 79.968407 47.830847 79.980141 47.915333 79.989529 # -b 29.957350 70.705449 30.055917 70.642084 30.229583 70.620963 30.332844 70.590454 30.163872 70.555251 30.318763 70.529436 30.605077 70.524742 30.684869 70.484846 30.759968 70.440256 30.971183 70.405054 31.013426 70.322915 30.882003 70.278325 30.661401 70.247816 30.539366 70.214960 30.375087 70.158636 30.196728 70.130474 29.999593 70.069456 # -b 19.987995 78.968655 20.232066 78.956921 20.307164 78.931106 20.354101 78.909984 20.485524 78.900597 20.626334 78.884169 20.861017 78.874782 21.067539 78.860701 21.217736 78.867741 21.358547 78.858354 21.424258 78.848967 21.414871 78.816111 21.424258 78.785602 21.443033 78.757440 21.405483 78.729278 21.377321 78.701116 21.349159 78.679995 21.283448 78.661220 21.161412 78.658873 21.067539 78.654179 20.936116 78.672954 20.738982 78.679995 20.654496 78.672954 20.523073 78.649486 20.457362 78.635405 20.260228 78.644792 20.166354 78.635405 20.119418 78.614283 20.025544 78.588468 # -b 21.389055 78.604896 21.435992 78.616630 21.454767 78.614283 21.398443 78.581427 21.304569 78.569693 21.398443 78.567346 21.614352 78.574387 21.802098 78.586121 21.914746 78.590815 22.121268 78.588468 22.130655 78.565000 22.215141 78.534491 22.337177 78.503982 22.477987 78.478167 22.384113 78.457045 22.215141 78.431230 22.186979 78.398374 22.158817 78.360825 22.121268 78.316235 22.130655 78.297460 22.093106 78.259911 21.933521 78.252871 21.783324 78.252871 21.661288 78.257564 21.548640 78.229402 21.389055 78.208281 21.182534 78.210628 21.144985 78.182465 21.032336 78.187159 20.891526 78.198893 20.788266 78.224709 20.760104 78.257564 20.656843 78.295114 20.647455 78.306848 20.609906 78.349091 20.638068 78.379600 20.638068 78.417149 20.403385 78.426536 20.318899 78.447658 20.178088 78.471126 20.271962 78.482860 20.431547 78.501635 20.675617 78.508676 20.769491 78.536838 20.891526 78.520410 21.013562 78.541531 21.051111 78.581427 21.107435 78.600202 21.276407 78.614283 21.389055 78.604896 # -b 22.888683 78.281033 22.935620 78.262258 22.935620 78.248177 22.926232 78.248177 22.926232 78.238790 22.935620 78.229402 22.982556 78.220015 23.001331 78.205934 23.020106 78.191853 23.076430 78.203587 23.132754 78.212974 23.170303 78.212974 23.170303 78.208281 23.226627 78.198893 23.236015 78.189506 23.254789 78.170731 23.320501 78.161344 23.358050 78.144916 23.358050 78.137876 23.301726 78.128488 23.292339 78.123795 23.292339 78.119101 23.292339 78.081552 23.301726 78.097979 23.311113 78.083898 23.245402 78.090939 23.132754 78.093286 23.104592 78.067471 23.076430 78.048696 23.048268 78.039309 23.048268 78.015840 23.038880 77.999412 23.085817 77.980638 23.113979 77.957169 23.170303 77.950129 23.236015 77.947782 23.273564 77.924314 23.358050 77.910233 23.386212 77.886764 23.498860 77.875030 23.573959 77.844521 23.630283 77.839828 23.714769 77.835134 23.808642 77.811666 23.930678 77.821053 24.033939 77.844521 24.109037 77.851562 24.137199 77.879724 24.202911 77.886764 24.249847 77.872683 24.324946 77.844521 24.428207 77.842174 24.465756 77.823400 24.512693 77.806972 24.522080 77.802278 24.512693 77.781157 24.531468 77.776463 24.615954 77.781157 24.644116 77.762382 24.644116 77.750648 24.691052 77.745954 24.747376 77.738914 24.822475 77.738914 24.888187 77.734220 24.906961 77.724833 24.897574 77.706058 24.831862 77.701364 24.766151 77.710752 24.709827 77.710752 24.691052 77.703711 24.644116 77.703711 24.578404 77.706058 24.493918 77.691977 24.409432 77.682590 24.315559 77.675549 24.202911 77.663815 24.146587 77.659121 24.127812 77.642693 24.127812 77.621572 24.071488 77.612185 24.024551 77.602797 24.005777 77.595757 23.940065 77.581676 23.921290 77.562901 23.864966 77.544126 23.855579 77.520658 23.864966 77.511271 23.818030 77.497190 23.771093 77.487802 23.752318 77.469028 23.714769 77.459640 23.630283 77.461987 23.592734 77.452600 23.611508 77.422091 23.611508 77.417397 23.517635 77.419744 23.461311 77.405663 23.451923 77.382195 23.395599 77.382195 23.367437 77.377501 23.358050 77.375154 23.301726 77.370461 23.273564 77.361073 23.198465 77.368114 23.189078 77.384542 23.160916 77.393929 23.132754 77.386888 23.132754 77.365767 23.057655 77.361073 22.973169 77.349339 22.926232 77.335258 22.879296 77.325871 22.851134 77.311790 22.851134 77.295362 22.869908 77.288321 22.869908 77.278934 22.794810 77.267200 22.757260 77.260159 22.691549 77.248425 22.663387 77.276587 22.663387 77.278934 22.597675 77.267200 22.578901 77.264853 22.550739 77.257812 22.503802 77.257812 22.485027 77.274240 22.438091 77.290668 22.391154 77.307096 22.466253 77.325871 22.503802 77.344645 22.597675 77.363420 22.616450 77.379848 22.578901 77.408010 22.569513 77.429131 22.616450 77.450253 22.672774 77.464334 22.729098 77.471374 22.804197 77.476068 22.804197 77.497190 22.832359 77.513617 22.869908 77.539433 22.832359 77.539433 22.729098 77.534739 22.682162 77.520658 22.663387 77.490149 22.635225 77.483109 22.597675 77.497190 22.578901 77.518311 22.607063 77.525352 22.635225 77.544126 22.616450 77.553514 22.541351 77.558207 22.447478 77.560554 22.381767 77.548820 22.297281 77.527698 22.278506 77.499536 22.259731 77.487802 22.194020 77.480762 22.137696 77.487802 22.071984 77.480762 22.053210 77.461987 21.987498 77.461987 21.884238 77.469028 21.799752 77.469028 21.715265 77.466681 21.658941 77.461987 21.565068 77.461987 21.508744 77.457293 21.424258 77.457293 21.377321 77.445559 21.311610 77.429131 21.245898 77.433825 21.189574 77.438519 21.161412 77.452600 21.114476 77.443212 21.058152 77.438519 20.992440 77.431478 20.926729 77.447906 20.851630 77.459640 20.851630 77.466681 20.870405 77.497190 20.851630 77.515964 20.842243 77.525352 20.907954 77.534739 20.936116 77.551167 20.926729 77.569942 20.954891 77.569942 21.048764 77.576982 21.152025 77.595757 21.217736 77.612185 21.236511 77.630959 21.217736 77.652081 21.236511 77.659121 21.245898 77.689630 21.236511 77.715445 21.255286 77.727179 21.339772 77.755341 21.339772 77.776463 21.367934 77.788197 21.414871 77.799931 21.480582 77.830440 21.499357 77.872683 21.536906 77.889111 21.565068 77.903192 21.555681 77.914926 21.480582 77.924314 21.396096 77.926660 21.302222 77.947782 21.208349 77.952476 21.142638 77.959516 21.152025 77.990025 21.142638 78.001759 21.058152 78.001759 20.992440 78.018187 20.964278 78.036962 20.851630 78.046349 20.842243 78.051043 20.879792 78.062777 20.879792 78.072164 20.898567 78.095633 20.992440 78.105020 21.086314 78.119101 21.161412 78.128488 21.245898 78.135529 21.367934 78.163691 21.499357 78.170731 21.649554 78.177772 21.734040 78.182465 21.780977 78.194200 21.846688 78.187159 21.978111 78.180119 22.062597 78.173078 22.128308 78.175425 22.194020 78.187159 22.306668 78.184812 22.372379 78.182465 22.447478 78.184812 22.541351 78.205934 22.550739 78.210628 22.550739 78.220015 22.578901 78.220015 22.691549 78.220015 22.729098 78.220015 22.719711 78.227055 22.757260 78.227055 22.785422 78.229402 22.813584 78.238790 22.832359 78.259911 22.860521 78.281033 22.888683 78.281033 # -b 26.427710 78.703463 26.465260 78.705810 26.465260 78.698769 26.465260 78.694076 26.512196 78.689382 26.540358 78.658873 26.540358 78.654179 26.596683 78.654179 26.671781 78.628364 26.737493 78.626017 26.821979 78.633058 26.868915 78.637751 26.897077 78.665914 26.934627 78.679995 26.934627 78.687035 26.887690 78.687035 26.803204 78.715197 26.775042 78.729278 26.671781 78.736319 26.643619 78.757440 26.634232 78.769174 26.615457 78.773868 26.568520 78.790296 26.484034 78.809070 26.446485 78.806724 26.418323 78.799683 26.418323 78.776215 26.399548 78.776215 26.352612 78.766827 26.361999 78.764481 26.380774 78.748053 26.399548 78.733972 26.399548 78.731625 26.408936 78.722238 26.418323 78.708157 26.427710 78.703463 # -b 28.976373 78.839579 29.004535 78.844273 29.004535 78.841926 29.023310 78.839579 29.089021 78.841926 29.126571 78.832539 29.201670 78.823151 29.276768 78.823151 29.286156 78.837232 29.304930 78.851313 29.408191 78.858354 29.436353 78.863048 29.502064 78.865395 29.549001 78.870088 29.558388 78.874782 29.549001 78.893557 29.530226 78.902944 29.483290 78.900597 29.483290 78.893557 29.473902 78.886516 29.380029 78.874782 29.304930 78.874782 29.229832 78.874782 29.164120 78.874782 29.098409 78.893557 29.032697 78.893557 28.976373 78.898250 28.966986 78.902944 29.004535 78.909984 29.023310 78.917025 28.976373 78.921719 28.873113 78.935800 28.788627 78.935800 28.685366 78.935800 28.657204 78.940493 28.619654 78.952227 28.600880 78.954574 28.553943 78.949881 28.478844 78.945187 28.441295 78.942840 28.441295 78.935800 28.460070 78.921719 28.460070 78.919372 28.460070 78.914678 28.441295 78.914678 28.394358 78.912331 28.375584 78.905291 28.338034 78.893557 28.291097 78.893557 28.234773 78.900597 28.187837 78.902944 28.150287 78.895903 28.018865 78.872435 28.000090 78.872435 28.000090 78.874782 28.000090 78.870088 27.990703 78.834886 27.981315 78.837232 27.915604 78.851313 27.849892 78.858354 27.793568 78.858354 27.793568 78.851313 27.793568 78.830192 27.802956 78.825498 27.793568 78.816111 27.793568 78.809070 27.849892 78.806724 27.924991 78.809070 28.000090 78.804377 28.037639 78.806724 28.037639 78.827845 28.103351 78.830192 28.150287 78.841926 28.178449 78.846620 28.272323 78.851313 28.338034 78.863048 28.347422 78.863048 28.356809 78.870088 28.347422 78.863048 28.347422 78.867741 28.403746 78.865395 28.478844 78.856007 28.553943 78.865395 28.544556 78.879476 28.535168 78.884169 28.553943 78.886516 28.610267 78.891210 28.713528 78.884169 28.807401 78.888863 28.854338 78.874782 28.901275 78.858354 28.938824 78.848967 28.976373 78.839579 # -b 27.112986 80.005956 27.103599 79.989529 27.122374 79.968407 27.037888 79.935551 27.047275 79.919123 27.028500 79.909736 27.075437 79.907389 27.141148 79.895655 27.178698 79.886268 27.169310 79.860453 27.122374 79.839331 27.094212 79.820556 27.037888 79.818210 26.962789 79.815863 26.850141 79.815863 26.775042 79.808822 26.756267 79.787701 26.699943 79.780660 26.587295 79.750151 26.587295 79.733724 26.615457 79.724336 26.587295 79.724336 26.512196 79.719642 26.465260 79.698521 26.446485 79.682093 26.390161 79.675053 26.361999 79.691480 26.324450 79.684440 26.296288 79.675053 26.258738 79.660972 26.221189 79.642197 26.164865 79.639850 26.108541 79.656278 26.052217 79.651584 26.033442 79.632810 25.986505 79.632810 25.958343 79.630463 25.873857 79.609341 25.826921 79.597607 25.826921 79.567098 25.836308 79.543630 25.920794 79.541283 25.948956 79.517815 25.902019 79.513121 25.911407 79.496693 25.902019 79.487306 25.892632 79.480265 25.883245 79.470878 25.817533 79.470878 25.779984 79.473225 25.751822 79.463837 25.761209 79.447410 25.779984 79.430982 25.751822 79.414554 25.695498 79.409860 25.704885 79.393432 25.704885 79.386392 25.657948 79.377005 25.592237 79.374658 25.526526 79.369964 25.442040 79.351189 25.404490 79.341802 25.376328 79.334762 25.338779 79.332415 25.291842 79.320681 25.244905 79.320681 25.207356 79.332415 25.160419 79.332415 25.141645 79.320681 25.122870 79.313640 25.066546 79.311293 25.019609 79.318334 25.019609 79.332415 24.963285 79.334762 24.897574 79.346496 24.869412 79.351189 24.841250 79.351189 24.822475 79.348843 24.784926 79.341802 24.700440 79.325374 24.625341 79.306600 24.531468 79.301906 24.437594 79.294865 24.371883 79.292518 24.296784 79.290172 24.240460 79.276091 24.240460 79.257316 24.240460 79.252622 24.221685 79.250275 24.212298 79.226807 24.155974 79.210379 24.137199 79.186911 24.090263 79.175177 24.052713 79.172830 24.024551 79.172830 23.996389 79.177524 23.949452 79.175177 23.940065 79.163443 23.902516 79.158749 23.827417 79.154055 23.752318 79.147015 23.695994 79.147015 23.686607 79.147015 23.686607 79.158749 23.630283 79.151708 23.592734 79.147015 23.555184 79.147015 23.451923 79.147015 23.386212 79.147015 23.376825 79.151708 23.386212 79.163443 23.367437 79.154055 23.311113 79.144668 23.245402 79.147015 23.236015 79.154055 23.236015 79.163443 23.226627 79.165789 23.170303 79.170483 23.104592 79.161096 23.020106 79.165789 22.935620 79.177524 22.916845 79.189258 22.945007 79.196298 22.954394 79.198645 22.888683 79.198645 22.832359 79.210379 22.804197 79.226807 22.822972 79.243235 22.832359 79.250275 22.813584 79.238541 22.785422 79.238541 22.700936 79.247929 22.672774 79.254969 22.644612 79.269050 22.616450 79.297212 22.607063 79.323027 22.635225 79.330068 22.691549 79.355883 22.700936 79.365270 22.719711 79.386392 22.682162 79.393432 22.644612 79.372311 22.597675 79.365270 22.550739 79.360577 22.494415 79.367617 22.409929 79.369964 22.306668 79.372311 22.231569 79.384045 22.165858 79.393432 22.118921 79.393432 22.090759 79.386392 22.062597 79.377005 21.987498 79.372311 21.921787 79.358230 21.865463 79.348843 21.780977 79.358230 21.734040 79.369964 21.696491 79.374658 21.621392 79.369964 21.565068 79.377005 21.546293 79.384045 21.546293 79.388739 21.555681 79.395779 21.536906 79.402820 21.480582 79.402820 21.461807 79.386392 21.471195 79.372311 21.443033 79.360577 21.377321 79.374658 21.339772 79.391086 21.302222 79.381698 21.255286 79.372311 21.189574 79.369964 21.123863 79.372311 21.095701 79.369964 21.095701 79.353536 21.067539 79.348843 21.029990 79.351189 20.992440 79.344149 20.926729 79.341802 20.879792 79.339455 20.832855 79.341802 20.785919 79.358230 20.729595 79.369964 20.729595 79.381698 20.738982 79.402820 20.720207 79.416901 20.682658 79.433329 20.654496 79.438022 20.598172 79.433329 20.513686 79.428635 20.429200 79.430982 20.344714 79.430982 20.325939 79.433329 20.232066 79.442716 20.166354 79.454450 20.119418 79.470878 20.091256 79.484959 # -b 19.931671 79.614035 20.044319 79.606994 20.138192 79.604648 20.185129 79.597607 20.185129 79.578832 20.279002 79.578832 20.325939 79.553017 20.438587 79.557711 20.588785 79.557711 20.682658 79.553017 20.776531 79.564751 20.851630 79.560058 20.898567 79.553017 20.926729 79.536589 21.029990 79.541283 21.095701 79.548324 21.067539 79.553017 21.029990 79.567098 21.039377 79.578832 21.020602 79.592913 20.926729 79.583526 20.814081 79.588220 20.804693 79.604648 20.767144 79.599954 20.682658 79.602301 20.598172 79.614035 20.551235 79.618729 20.607559 79.628116 20.626334 79.639850 20.616947 79.644544 20.579397 79.658625 20.616947 79.660972 20.673271 79.677399 20.767144 79.679746 20.870405 79.684440 20.870405 79.663318 20.936116 79.658625 20.973666 79.679746 21.020602 79.684440 21.114476 79.679746 21.170800 79.686787 21.255286 79.691480 21.311610 79.693827 21.311610 79.684440 21.349159 79.677399 21.508744 79.679746 21.630779 79.675053 21.752815 79.679746 21.809139 79.682093 21.837301 79.691480 21.809139 79.696174 21.818526 79.707908 21.884238 79.710255 21.921787 79.712602 21.940562 79.710255 21.978111 79.717296 21.978111 79.743111 21.996886 79.752498 21.968724 79.757192 21.846688 79.750151 21.799752 79.759539 21.837301 79.768926 21.921787 79.773620 21.931174 79.794741 21.931174 79.808822 21.884238 79.799435 21.846688 79.787701 21.780977 79.787701 21.724653 79.799435 21.649554 79.799435 21.612005 79.785354 21.555681 79.775967 21.443033 79.775967 21.339772 79.778313 21.302222 79.773620 21.217736 79.773620 21.114476 79.778313 21.001828 79.773620 20.870405 79.775967 20.842243 79.775967 20.814081 79.778313 20.785919 79.780660 20.738982 79.759539 20.598172 79.764232 20.466749 79.764232 20.372876 79.764232 20.363488 79.759539 20.354101 79.750151 20.241453 79.752498 20.156967 79.752498 20.138192 79.750151 20.110030 79.747805 20.025544 79.721989 # -b 22.128308 80.010650 22.184632 79.987182 22.297281 79.968407 22.325443 79.982488 22.353605 79.994222 22.438091 79.991875 # -b 21.320997 69.888750 21.255286 70.013132 # -b 21.973417 69.989664 21.973417 70.062416 21.851382 70.062416 21.696491 70.088231 21.541600 70.121087 21.541600 70.168024 21.541600 70.283018 21.607311 70.259550 21.687103 70.193839 21.795058 70.137515 21.804445 70.240775 21.893625 70.273631 21.940562 70.245469 22.057903 70.273631 22.090759 70.212613 22.161164 70.231388 22.212794 70.170370 22.212794 70.125780 22.358298 70.107006 22.447478 70.118740 22.391154 70.196186 22.564820 70.193839 22.785422 70.189145 22.921539 70.175064 22.940313 70.170370 22.963782 70.158636 22.874602 70.121087 22.841746 70.095272 23.085817 70.069456 22.987250 70.048335 # -b 23.228974 69.956808 23.252442 70.050682 23.299379 70.118740 23.252442 70.168024 23.275911 70.203226 23.365091 70.233735 23.505901 70.297099 23.595080 70.362811 23.825070 70.447297 24.111384 70.447297 24.280356 70.447297 24.214645 70.529436 24.346068 70.602188 24.599526 70.646778 24.566670 70.674940 24.421166 70.721877 24.313212 70.806363 24.378923 70.801669 24.566670 70.773507 24.585445 70.834525 24.599526 70.921358 24.730949 70.921358 24.787273 70.886155 24.960938 70.961254 24.984407 70.916664 25.050118 70.879115 25.172154 70.853299 25.195622 70.775854 25.359900 70.787588 25.505404 70.820444 25.622746 70.860340 25.702538 70.846259 25.801105 70.822791 25.669683 70.733611 25.589890 70.705449 25.425612 70.635044 25.270721 70.555251 25.214397 70.496580 25.148685 70.447297 25.172154 70.405054 25.129911 70.327608 25.115830 70.292406 25.129911 70.252510 25.026650 70.233735 24.928083 70.182105 24.909308 70.111699 24.928083 70.031907 25.082974 70.057722 25.214397 70.125780 25.336432 70.196186 25.481936 70.283018 25.327045 70.226694 25.434999 70.341689 25.603971 70.412094 25.711926 70.496580 25.810493 70.536477 25.833961 70.550558 26.012321 70.653818 26.176599 70.740651 26.331490 70.820444 26.439445 70.893196 26.561480 70.916664 26.641272 70.907277 26.674128 70.834525 26.674128 70.773507 26.660047 70.707796 26.495769 70.653818 26.528624 70.635044 26.674128 70.566985 26.584948 70.459031 26.561480 70.360464 26.692903 70.405054 26.824326 70.451991 27.035541 70.451991 27.026153 70.543517 27.091865 70.602188 27.223287 70.609229 27.199819 70.674940 27.246756 70.726570 27.368791 70.780547 27.453277 70.860340 27.500214 70.926051 27.556538 70.970641 27.589394 71.076249 27.673880 71.043393 27.786528 71.001150 28.016518 71.057474 28.129166 71.057474 28.260589 71.022272 28.227733 70.963601 28.448335 70.963601 28.424867 70.867380 28.293444 70.785241 27.974275 70.799322 27.861627 70.747692 28.016518 70.681980 27.753672 70.609229 27.917951 70.609229 28.204265 70.674940 28.284057 70.616269 28.115085 70.529436 27.917951 70.470765 27.974275 70.444950 28.096310 70.463725 28.171409 70.459031 28.284057 70.426175 28.349768 70.419135 28.570371 70.456684 28.523434 70.543517 28.537515 70.660859 28.570371 70.740651 28.734649 70.834525 28.880153 70.848606 28.997495 70.822791 29.166467 70.846259 29.208710 70.806363 29.283809 70.785241 29.297890 70.726570 29.274421 70.696061 29.283809 70.672593 29.316664 70.656165 29.438700 70.674940 29.673383 70.705449 29.715626 70.672593 29.715626 70.628003 29.837662 70.646778 29.959697 70.705449 # -b 30.001940 70.069456 29.739095 70.076497 29.518492 70.092925 29.372988 70.102312 29.232178 70.125780 29.096062 70.121087 28.922396 70.151596 28.678325 70.175064 28.678325 70.146902 28.645470 70.125780 28.725262 70.092925 28.978720 70.069456 29.063206 70.043641 29.175854 70.001398 # -b 19.999729 70.095272 20.065440 70.074150 # -b 20.682658 70.214960 20.734288 70.219654 20.748369 70.196186 20.790612 70.175064 20.757757 70.132821 20.748369 70.043641 20.701433 70.027213 20.626334 70.038948 20.626334 70.099965 20.560623 70.062416 20.471443 70.088231 20.471443 70.146902 20.527767 70.196186 20.682658 70.214960 # -b 22.733792 70.226694 22.700936 70.226694 22.602369 70.257203 22.466253 70.285365 22.447478 70.322915 22.499108 70.355770 22.602369 70.353423 22.686855 70.341689 22.752567 70.336996 22.822972 70.327608 22.921539 70.290059 22.930926 70.238429 22.888683 70.231388 22.766648 70.226694 22.733792 70.226694 # -b 22.358298 70.646778 22.414622 70.656165 22.414622 70.681980 22.433397 70.674940 22.489721 70.674940 22.522577 70.700755 22.555432 70.689021 22.555432 70.679634 22.555432 70.667899 22.564820 70.623310 22.644612 70.639737 22.766648 70.646778 22.776035 70.681980 22.766648 70.712489 22.874602 70.712489 22.921539 70.672593 23.043574 70.656165 23.095205 70.623310 23.085817 70.583413 22.987250 70.583413 22.963782 70.536477 22.888683 70.508315 22.752567 70.536477 22.668081 70.491887 22.564820 70.484846 22.499108 70.515355 22.358298 70.482499 22.301974 70.522396 22.245650 70.451991 22.194020 70.557598 22.179939 70.574026 22.048516 70.588107 22.081372 70.606882 22.170551 70.632697 22.301974 70.620963 22.358298 70.646778 # -b 23.383865 70.327608 23.332235 70.336996 23.332235 70.308834 23.243055 70.283018 23.163263 70.285365 23.064696 70.292406 22.989597 70.334649 22.966129 70.367505 22.989597 70.400360 22.966129 70.433216 22.933273 70.447297 23.008372 70.489540 23.111632 70.466072 23.163263 70.529436 23.243055 70.515355 23.332235 70.510661 23.416721 70.557598 23.496513 70.536477 23.562225 70.496580 23.585693 70.447297 23.505901 70.386279 23.383865 70.327608 # -b 23.935371 70.517702 23.846192 70.491887 23.813336 70.529436 23.747625 70.602188 23.691301 70.696061 23.738237 70.728917 23.789868 70.681980 23.879047 70.689021 24.001083 70.653818 24.033939 70.590454 24.057407 70.574026 24.043326 70.550558 24.043326 70.524742 23.935371 70.517702 # -b 25.831614 71.062168 25.897326 71.024618 25.920794 71.008190 25.977118 70.989416 25.995893 70.968294 25.995893 70.942479 25.920794 70.954213 25.831614 70.961254 25.765903 70.933092 25.723660 70.916664 25.634480 70.935439 25.554688 70.926051 25.503057 70.933092 25.479589 70.933092 25.465508 70.935439 25.423265 70.928398 25.390409 70.956560 25.521832 70.982375 25.568769 71.017578 25.399797 71.022272 25.282455 71.008190 25.301230 71.043393 25.456121 71.052780 25.611012 71.038699 25.653255 71.078596 25.634480 71.111451 25.742435 71.071555 25.831614 71.062168 # -b 14.749859 79.740764 14.937606 79.719642 14.975155 79.719642 15.031479 79.719642 15.040866 79.707908 15.050254 79.691480 15.115965 79.682093 15.162902 79.663318 15.200451 79.642197 15.228613 79.616382 15.256775 79.595260 15.275550 79.564751 15.284937 79.534243 15.294325 79.510774 15.322487 79.475572 15.341261 79.445063 15.369423 79.421594 15.369423 79.416901 15.369423 79.416901 15.369423 79.405167 15.369423 79.388739 15.388198 79.358230 15.444522 79.325374 15.491459 79.290172 15.491459 79.247929 15.482071 79.222113 15.491459 79.196298 15.435135 79.175177 15.388198 79.149362 15.416360 79.132934 15.472684 79.137627 15.491459 79.158749 15.557170 79.165789 15.632269 79.165789 15.716755 79.137627 15.829403 79.093038 15.885727 79.057835 15.970213 79.034367 16.035924 78.999164 16.082861 78.961615 16.195509 78.931106 16.308157 78.912331 16.458355 78.900597 16.486517 78.917025 16.411418 78.956921 16.289383 79.008551 16.223671 79.048448 16.120411 79.085997 16.064086 79.114159 16.007762 79.149362 15.998375 79.182217 15.979600 79.233848 15.913889 79.262010 15.885727 79.306600 15.876340 79.360577 15.848178 79.386392 15.829403 79.407513 15.829403 79.459144 15.829403 79.501387 15.829403 79.550670 15.791854 79.574139 15.782466 79.611688 15.754304 79.646891 15.754304 79.691480 15.744917 79.696174 15.679205 79.693827 15.669818 79.724336 15.669818 79.747805 15.735530 79.785354 15.735530 79.820556 15.763692 79.855759 15.876340 79.853412 16.035924 79.867493 15.998375 79.888615 15.932664 79.909736 15.970213 79.928511 15.988988 79.959020 15.998375 79.998916 # -b 16.556922 80.010650 16.556922 79.989529 16.575697 79.959020 16.575697 79.937898 16.575697 79.909736 16.575697 79.890961 16.575697 79.867493 16.678957 79.872187 16.735281 79.855759 16.857317 79.848718 16.866704 79.876880 16.819767 79.909736 16.951190 79.919123 17.063838 79.928511 17.138937 79.909736 17.251585 79.895655 17.401782 79.867493 17.542593 79.836984 17.683403 79.808822 17.777276 79.771273 17.908699 79.738417 17.871150 79.705561 17.861762 79.675053 17.777276 79.660972 17.749114 79.630463 17.730339 79.592913 17.692790 79.557711 17.570755 79.536589 17.523818 79.508427 17.580142 79.517815 17.645853 79.499040 17.674015 79.470878 17.711565 79.445063 17.702177 79.421594 17.645853 79.388739 17.561367 79.365270 17.570755 79.332415 17.645853 79.360577 17.730339 79.379351 17.758501 79.386392 17.805438 79.414554 17.936861 79.430982 18.049509 79.459144 18.058896 79.463837 17.965023 79.489653 17.983798 79.527202 18.002572 79.550670 18.058896 79.574139 18.115220 79.590567 18.199706 79.604648 18.274805 79.574139 18.453165 79.571792 18.509489 79.550670 18.593975 79.513121 18.650299 79.475572 18.687848 79.442716 18.725397 79.421594 18.781722 79.393432 18.838046 79.372311 18.828658 79.334762 18.781722 79.313640 18.781722 79.290172 18.716010 79.243235 18.725397 79.208032 18.762947 79.172830 18.913144 79.175177 19.044567 79.165789 19.194765 79.170483 19.373124 79.161096 19.504547 79.128240 19.635970 79.118853 19.645357 79.114159 19.673519 79.093038 19.701681 79.064875 19.767392 79.032020 19.842491 78.992124 19.983301 78.968655 # -b 20.020850 78.588468 19.926977 78.567346 19.823716 78.574387 19.758005 78.579081 19.692294 78.572040 19.513934 78.565000 19.589033 78.534491 19.560871 78.506329 19.523321 78.459392 19.354349 78.461739 19.288638 78.431230 19.147828 78.433577 19.016405 78.414802 19.063342 78.374906 19.063342 78.318582 19.035180 78.276339 19.072729 78.250524 19.007018 78.245830 19.016405 78.227055 19.044567 78.205934 18.969468 78.173078 18.969468 78.140222 18.969468 78.097979 18.997630 78.051043 18.969468 78.008800 18.903757 77.997066 18.819271 78.008800 18.687848 78.025228 18.575200 78.015840 18.425003 78.001759 18.425003 77.975944 18.453165 77.954822 18.453165 77.919620 18.434390 77.882071 18.453165 77.830440 18.490714 77.806972 18.462552 77.776463 18.406228 77.731873 18.406228 77.708405 18.387453 77.670855 18.434390 77.673202 18.425003 77.642693 18.387453 77.598104 18.349904 77.572288 18.331129 77.569942 18.331129 77.555861 18.331129 77.530045 18.274805 77.504230 18.274805 77.469028 18.209094 77.461987 18.068284 77.483109 17.946248 77.469028 17.758501 77.464334 17.580142 77.436172 17.608304 77.400969 17.739727 77.410357 17.777276 77.389235 17.814825 77.363420 17.749114 77.356380 17.627079 77.356380 17.467494 77.311790 17.401782 77.276587 17.373620 77.241385 17.383008 77.215569 17.373620 77.189754 17.373620 77.152205 17.392395 77.138124 17.401782 77.117002 17.392395 77.093534 17.354846 77.063025 17.307909 77.032516 17.336071 77.020782 17.383008 76.994967 17.317296 76.964458 17.373620 76.955071 17.354846 76.933949 17.279747 76.896400 17.176486 76.870585 17.082613 76.851810 17.045064 76.821301 17.073226 76.800180 17.063838 76.788445 17.016902 76.755590 17.101388 76.708653 17.120162 76.675797 17.063838 76.664063 17.054451 76.640595 17.045064 76.603045 16.951190 76.579577 16.847929 76.556109 16.678957 76.553762 16.556922 76.586618 16.556922 76.614780 16.538147 76.610086 16.491210 76.591311 16.425499 76.560802 16.331626 76.556109 16.350400 76.603045 16.322238 76.628861 16.331626 76.657023 16.303464 76.689878 16.143879 76.729775 15.965519 76.755590 15.730836 76.804873 15.599413 76.837729 15.599413 76.882319 15.674512 76.898747 15.758998 76.910481 15.918583 76.922215 16.050005 76.915175 16.181428 76.924562 16.218978 76.891706 16.369175 76.950377 16.369175 76.980886 16.256527 76.976192 16.134492 77.011395 16.059393 77.011395 15.909195 77.006701 15.824709 76.985580 15.730836 76.997314 15.608800 76.983233 15.467990 76.980886 15.299018 76.987926 15.195757 77.002007 15.195757 77.053638 15.054947 77.095881 14.970461 77.091187 14.782714 77.114655 14.613742 77.135777 14.416608 77.152205 14.369671 77.192101 14.303960 77.224957 14.228861 77.239038 14.172537 77.271893 14.144375 77.314136 14.088051 77.330564 14.022340 77.370461 14.050502 77.393929 14.097439 77.433825 14.012953 77.494843 14.116213 77.511271 14.275798 77.560554 14.416608 77.555861 14.529256 77.548820 14.548031 77.513617 14.585580 77.457293 14.726390 77.464334 14.773327 77.492496 14.782714 77.520658 14.970461 77.523005 15.026785 77.506577 15.158208 77.501883 15.280244 77.508924 15.374117 77.515964 15.374117 77.511271 15.411666 77.501883 15.571251 77.494843 15.740223 77.487802 15.974907 77.471374 15.993681 77.499536 15.881033 77.544126 15.758998 77.544126 15.571251 77.569942 15.383504 77.576982 15.242694 77.576982 15.045560 77.586369 14.895363 77.616878 14.848426 77.647387 14.895363 77.656774 14.998623 77.647387 15.111271 77.663815 15.242694 77.677896 15.317793 77.684936 15.486765 77.694324 15.599413 77.715445 15.693287 77.710752 15.796547 77.724833 15.890421 77.710752 15.909195 77.717792 16.068780 77.729526 16.078167 77.752995 16.143879 77.750648 16.294076 77.752995 16.303464 77.781157 16.331626 77.799931 16.434886 77.764729 16.509985 77.771769 16.556922 77.785850 16.707119 77.783504 16.829155 77.767076 16.932415 77.783504 16.876091 77.837481 16.791605 77.865643 16.876091 77.860949 16.857317 77.900845 16.810380 77.903192 16.669570 77.889111 16.632021 77.844521 16.538147 77.842174 16.406724 77.816359 16.256527 77.828093 16.068780 77.821053 15.927970 77.802278 15.852871 77.799931 15.796547 77.799931 15.712061 77.821053 15.608800 77.828093 15.543089 77.825747 15.411666 77.818706 15.336568 77.799931 15.242694 77.778810 15.242694 77.774116 15.176983 77.771769 15.092497 77.762382 14.998623 77.760035 14.961074 77.752995 14.895363 77.769423 14.839039 77.738914 14.726390 77.734220 14.688841 77.767076 14.604355 77.762382 14.604355 77.738914 14.519869 77.741260 14.454158 77.731873 14.332122 77.731873 14.238249 77.757688 14.163150 77.736567 14.059889 77.710752 13.890917 77.710752 13.759494 77.724833 13.759494 77.748301 13.797044 77.776463 13.740720 77.806972 13.721945 77.825747 13.703170 77.860949 13.665621 77.875030 13.665621 77.903192 13.646846 77.947782 13.656234 77.982984 13.646846 78.006453 13.721945 78.029921 13.853368 78.041655 13.928466 78.044002 14.022340 78.013493 14.088051 77.964210 14.219474 77.950129 14.275798 77.980638 14.172537 78.022881 14.200699 78.051043 14.369671 78.065124 14.548031 78.067471 14.754552 78.081552 14.867201 78.067471 15.045560 78.076858 15.036173 78.137876 15.111271 78.144916 15.167595 78.180119 15.289631 78.191853 15.355342 78.227055 15.486765 78.224709 15.627575 78.198893 15.683899 78.229402 15.561864 78.285726 15.627575 78.292767 15.730836 78.313888 15.852871 78.342050 15.927970 78.337357 16.059393 78.342050 16.134492 78.349091 16.256527 78.351438 16.284689 78.339703 16.350400 78.332663 16.425499 78.320929 16.613246 78.318582 16.763443 78.318582 16.800993 78.342050 16.885479 78.344397 16.988739 78.356131 17.054451 78.381946 17.110775 78.377253 17.279747 78.386640 17.364233 78.410108 17.307909 78.433577 17.148324 78.414802 16.951190 78.393681 16.894866 78.386640 16.894866 78.384293 16.772831 78.396027 16.660183 78.433577 16.603859 78.457045 16.547534 78.419496 16.425499 78.431230 16.378562 78.459392 16.406724 78.496941 16.472436 78.518063 16.500598 78.557959 16.632021 78.583774 16.697732 78.616630 16.791605 78.651833 16.688345 78.658873 16.669570 78.710503 16.613246 78.719891 16.538147 78.687035 16.378562 78.665914 16.406724 78.618977 16.378562 78.565000 16.265914 78.525103 16.106329 78.513369 16.068780 78.473473 15.881033 78.459392 15.730836 78.447658 15.599413 78.426536 15.496152 78.464086 15.355342 78.487554 15.299018 78.565000 15.289631 78.574387 15.402279 78.628364 15.477378 78.672954 15.543089 78.715197 15.524314 78.773868 15.430441 78.823151 15.252082 78.762134 15.214532 78.696422 15.214532 78.654179 15.111271 78.626017 15.054947 78.595508 14.961074 78.595508 14.857813 78.633058 14.876588 78.672954 14.857813 78.715197 14.754552 78.722238 14.623130 78.701116 14.576193 78.665914 14.529256 78.597855 14.519869 78.562653 14.501094 78.492248 14.416608 78.445311 14.538644 78.438271 14.641904 78.412455 14.688841 78.367865 14.594968 78.351438 14.454158 78.370212 14.369671 78.363172 14.275798 78.365519 14.172537 78.304501 14.181925 78.283379 14.144375 78.229402 14.041115 78.227055 13.994178 78.224709 13.900304 78.227055 13.834593 78.184812 13.703170 78.189506 13.581135 78.205934 13.552973 78.189506 13.515424 78.187159 13.449712 78.220015 13.393388 78.203587 13.355839 78.191853 13.252578 78.212974 13.205641 78.196546 13.074219 78.220015 13.027282 78.208281 12.942796 78.257564 13.036669 78.281033 13.017894 78.306848 12.989732 78.351438 12.877084 78.337357 12.792598 78.351438 12.642401 78.356131 12.623626 78.374906 12.595464 78.398374 12.445267 78.445311 12.473429 78.473473 12.689338 78.473473 12.820760 78.487554 12.970958 78.478167 13.158705 78.501635 13.196254 78.553265 12.989732 78.525103 12.848922 78.527450 12.689338 78.527450 12.567302 78.539184 12.398330 78.550919 12.219971 78.579081 12.032224 78.597855 12.004062 78.623670 11.882026 78.651833 11.910188 78.679995 11.806928 78.703463 11.656730 78.719891 11.675505 78.738665 11.750603 78.794989 11.872639 78.797336 11.910188 78.802030 11.966512 78.825498 11.938350 78.827845 11.788153 78.839579 11.591019 78.888863 11.459596 78.909984 11.346948 78.949881 11.562857 78.952227 11.684892 78.914678 11.938350 78.909984 12.135484 78.893557 12.379555 78.879476 12.417105 78.917025 12.398330 78.933453 12.323231 78.966308 12.126097 78.942840 11.966512 78.956921 11.947738 78.999164 11.844477 79.006205 11.656730 79.034367 11.703667 79.076610 11.853864 79.095384 11.806928 79.130587 11.853864 79.168136 12.004062 79.193951 11.975900 79.219767 12.022836 79.254969 12.022836 79.269050 11.882026 79.262010 11.778766 79.233848 11.769378 79.215073 11.675505 79.247929 11.468983 79.264356 11.365723 79.264356 11.506533 79.226807 11.628568 79.196298 11.450209 79.109465 11.271849 79.085997 11.177976 79.104772 11.159201 79.161096 11.121652 79.184564 11.112264 79.224460 10.999616 79.278437 10.999616 79.226807 10.980842 79.287825 10.933905 79.323027 10.886968 79.304253 10.886968 79.299559 10.830644 79.294865 10.811869 79.341802 10.811869 79.386392 10.811869 79.428635 10.774320 79.468531 10.689834 79.484959 10.671059 79.517815 10.811869 79.527202 10.952680 79.508427 11.009004 79.543630 10.896356 79.583526 10.802482 79.618729 10.774320 79.656278 10.793095 79.684440 10.905743 79.682093 10.990229 79.646891 11.055940 79.614035 11.271849 79.606994 11.309398 79.628116 11.206138 79.677399 11.131039 79.710255 11.140426 79.743111 11.206138 79.754845 11.300011 79.743111 11.403272 79.724336 11.497145 79.754845 11.459596 79.775967 11.459596 79.787701 11.515920 79.797088 11.534695 79.804129 11.637955 79.815863 11.703667 79.790048 11.750603 79.759539 11.844477 79.724336 11.947738 79.696174 12.013449 79.665665 12.079160 79.686787 12.154259 79.663318 12.210583 79.668012 12.201196 79.705561 12.154259 79.768926 12.135484 79.801782 12.135484 79.820556 12.285682 79.827597 12.323231 79.799435 12.323231 79.764232 12.464041 79.752498 12.482816 79.736070 12.623626 79.738417 12.726887 79.750151 12.895859 79.761886 12.970958 79.775967 13.149317 79.792394 13.261965 79.815863 13.477874 79.822903 13.590522 79.834637 13.759494 79.827597 13.797044 79.787701 13.862755 79.759539 13.853368 79.724336 13.768882 79.693827 13.665621 79.672706 13.459099 79.663318 13.337064 79.693827 13.280740 79.672706 13.017894 79.670359 12.961570 79.642197 12.726887 79.585873 12.633013 79.567098 12.435879 79.564751 12.370168 79.534243 12.464041 79.520162 12.595464 79.517815 12.726887 79.538936 12.942796 79.553017 13.102381 79.562405 13.261965 79.564751 13.449712 79.553017 13.393388 79.534243 13.355839 79.508427 13.205641 79.484959 13.271353 79.447410 13.233803 79.405167 13.318289 79.372311 13.421550 79.416901 13.459099 79.456797 13.656234 79.402820 13.740720 79.327721 13.872142 79.271397 14.097439 79.210379 14.228861 79.200992 14.116213 79.238541 14.031727 79.294865 14.012953 79.323027 13.947241 79.386392 13.872142 79.445063 13.872142 79.487306 13.843980 79.527202 13.900304 79.574139 14.088051 79.611688 14.097439 79.635156 14.266411 79.670359 14.303960 79.721989 14.341509 79.740764 14.454158 79.780660 14.519869 79.773620 14.641904 79.759539 14.745165 79.740764 # -b 10.513821 78.874782 10.513821 78.884169 10.626469 78.865395 10.757892 78.851313 10.861153 78.827845 10.870540 78.797336 10.992576 78.762134 11.142773 78.726931 11.161548 78.701116 11.161548 78.665914 11.199097 78.616630 11.217872 78.581427 11.283583 78.572040 11.339907 78.560306 11.302358 78.522757 11.368069 78.525103 11.433781 78.508676 11.443168 78.487554 11.630915 78.454698 11.743563 78.419496 11.837436 78.417149 11.874986 78.398374 11.856211 78.386640 11.884373 78.353784 11.940697 78.311541 12.043958 78.295114 12.090895 78.271645 12.072120 78.250524 12.100282 78.220015 12.137831 78.196546 12.025183 78.201240 11.912535 78.203587 11.856211 78.220015 11.818662 78.257564 11.809274 78.290420 11.771725 78.313888 11.649690 78.337357 11.602753 78.344397 11.593366 78.367865 11.443168 78.398374 11.405619 78.414802 11.339907 78.435924 11.264809 78.431230 11.161548 78.442964 11.077062 78.464086 11.020738 78.464086 10.889315 78.529797 10.879928 78.562653 10.832991 78.616630 10.757892 78.670607 10.673406 78.724584 10.570145 78.731625 10.504434 78.757440 10.513821 78.802030 10.513821 78.846620 10.513821 78.874782 # -b 18.884982 74.453344 18.894370 74.453344 18.894370 74.448651 18.894370 74.436917 18.903757 74.422836 18.960081 74.404061 19.025792 74.394674 19.016405 74.373552 18.974162 74.347737 19.016405 74.345390 19.072729 74.338350 19.138440 74.359471 19.204152 74.373552 19.213539 74.394674 19.213539 74.422836 19.237008 74.429876 19.269863 74.460385 19.269863 74.474466 19.227620 74.476813 19.171296 74.497934 19.091504 74.519056 19.049261 74.519056 19.039873 74.497934 19.025792 74.486200 18.960081 74.486200 18.917838 74.493241 18.870901 74.483853 18.870901 74.469772 18.884982 74.453344 # -b 20.086562 79.484959 19.983301 79.487306 19.908202 79.501387 19.889428 79.515468 19.851878 79.529549 19.795554 79.538936 19.729843 79.553017 19.692294 79.576486 19.692294 79.583526 19.701681 79.588220 19.776780 79.595260 19.851878 79.592913 19.917590 79.606994 19.926977 79.614035 # -b 20.020850 79.721989 19.926977 79.719642 19.833104 79.719642 19.739230 79.726683 19.711068 79.726683 19.711068 79.712602 19.664132 79.707908 19.570258 79.698521 19.513934 79.684440 19.438835 79.689134 19.438835 79.707908 19.354349 79.717296 19.298025 79.710255 19.232314 79.717296 19.166602 79.712602 19.129053 79.710255 19.072729 79.710255 18.997630 79.712602 18.941306 79.717296 18.875595 79.710255 18.847433 79.707908 18.809884 79.710255 18.791109 79.710255 18.762947 79.719642 18.678461 79.729030 18.706623 79.738417 18.744172 79.752498 18.678461 79.757192 18.650299 79.771273 18.659686 79.783007 18.622137 79.780660 18.556425 79.766579 18.528263 79.745458 18.490714 79.768926 18.425003 79.783007 18.425003 79.787701 18.425003 79.804129 18.368679 79.811169 18.302967 79.827597 18.312355 79.832291 18.312355 79.848718 18.312355 79.867493 18.274805 79.867493 18.180932 79.872187 18.152770 79.888615 18.190319 79.893308 18.274805 79.909736 18.378066 79.930858 18.453165 79.928511 18.556425 79.933204 18.565813 79.942592 18.500101 79.949632 18.471939 79.961367 18.509489 79.966060 18.565813 79.961367 18.697235 79.944939 18.725397 79.961367 18.706623 79.980141 18.725397 79.989529 # -b 18.863861 70.020173 18.863861 70.020173 # -b 18.786415 69.989664 18.730091 70.006092 18.683154 70.055375 18.739479 70.081191 18.852127 70.062416 19.039873 70.062416 19.114972 70.055375 19.147828 70.031907 # -b 19.215886 69.987317 19.347309 70.006092 # -b 18.884982 69.975583 18.917838 70.017826 18.861514 70.020173 # -b 19.821369 70.158636 19.854225 70.168024 19.877694 70.139861 19.943405 70.137515 19.999729 70.095272 # -b 20.065440 70.074150 19.990342 70.020173 19.844838 70.038948 19.722802 70.062416 19.704028 70.092925 19.624235 70.175064 19.549137 70.231388 19.600767 70.238429 19.689947 70.219654 19.713415 70.193839 19.746271 70.139861 19.821369 70.158636 # -b -14.205393 -7.918222 -14.249983 -7.873632 -14.249983 -7.927609 -14.228861 -7.962812 -14.205393 -7.951077 -14.205393 -7.918222 # -b -36.157689 -10.150062 -36.035653 -9.976396 -35.937086 -9.887216 -35.892496 -9.856708 -35.749340 -9.725285 -35.561593 -9.516416 -35.385580 -9.298161 -35.188446 -8.948482 -35.054676 -8.706758 -35.010086 -8.465034 -34.944375 -8.267900 -34.866930 -8.061379 -34.834074 -7.819655 -34.780097 -7.455895 -34.834074 -7.103870 -34.878664 -6.817556 -34.988965 -6.411554 -35.099266 -6.014938 -35.188446 -5.585468 -35.409048 -5.308541 -35.650772 -5.153650 -35.904231 -5.120794 -36.246869 -5.153650 -36.422881 -5.141916 -36.643484 -5.177118 -36.873474 -4.998759 -37.072955 -5.022227 -37.270089 -4.768769 -37.657316 -4.569288 -37.899040 -4.358073 -38.152499 -4.125736 -38.164233 -4.125736 -38.253413 -4.015435 -38.539726 -3.761977 -38.903486 -3.496784 -39.222656 -3.285569 -39.386934 -3.163534 -39.741306 -2.966400 -39.983030 -2.886607 # -b -50.048606 0.037549 -49.917183 -0.018775 # -b -39.983030 -2.886607 -40.248222 -2.886607 -40.412501 -2.886607 -40.832584 -2.910076 -41.163488 -2.966400 -41.581225 -2.931197 -42.001308 -2.820896 -42.451901 -2.731716 -42.707706 -2.666005 -42.904840 -2.588559 -43.148911 -2.466524 -43.301455 -2.478258 -43.313189 -2.489992 -43.324923 -2.478258 -43.500936 -2.454790 -43.545526 -2.400812 -43.578382 -2.335101 -43.766128 -2.532235 -43.864695 -2.600293 -43.984384 -2.654271 -44.172131 -2.743450 -44.249576 -2.755184 -44.305900 -2.766919 -44.350490 -2.776306 -44.371612 -2.788040 -44.425589 -2.809162 -44.493647 -2.809162 -44.493647 -2.600293 -44.350490 -2.433668 -44.282432 -2.323367 -44.327022 -2.257655 -44.416202 -2.177863 -44.503035 -2.177863 -44.603948 -2.201331 -44.690781 -2.112152 -44.559359 -2.091030 -44.493647 -1.990116 -44.657926 -1.757780 -44.714250 -1.581767 -44.747105 -1.513709 -44.866794 -1.513709 -44.866794 -1.513709 -45.033419 -1.546564 -45.176576 -1.624010 -45.340855 -1.724924 -45.340855 -1.492587 -45.364323 -1.337696 -45.573191 -1.225048 -45.782060 -1.203926 -45.847771 -1.147602 -45.892361 -1.093625 -45.993275 -1.126481 -46.124698 -1.004445 -46.443867 -1.025567 -46.631614 -0.938734 -46.885072 -0.837820 -47.093941 -0.748640 -47.138530 -0.694663 -47.260566 -0.605483 -47.281687 -0.605483 -47.403723 -0.661808 -47.624325 -0.638339 -47.734627 -0.650073 -47.943495 -0.694663 -47.966963 -0.715785 -47.988085 -0.715785 -47.999819 -0.793230 -48.020940 -0.861288 -48.110120 -0.870676 -48.142976 -1.081891 -48.196953 -1.081891 -48.286133 -1.081891 -48.340110 -1.260250 -48.351844 -1.447997 -48.450411 -1.570033 -48.527857 -1.546564 -48.605302 -1.537177 -48.727338 -1.591154 -48.980796 -1.736658 -49.013652 -1.814104 -49.058242 -1.936139 -49.156809 -2.177863 -49.201398 -2.267043 -49.234254 -2.344488 -49.278844 -2.511114 -49.311700 -2.555703 -49.365677 -2.412547 -49.365677 -2.245921 -49.332821 -2.100417 -49.267110 -1.924405 -49.222520 -1.846959 -49.222520 -1.814104 -49.278844 -1.802369 -49.332821 -1.724924 -49.201398 -1.659212 -48.957328 -1.525443 -48.804783 -1.424529 -48.649892 -1.248516 -48.605302 -1.114747 -48.462145 -0.837820 -48.450411 -0.528038 -48.384700 -0.328557 -48.372966 -0.295701 -48.682748 -0.218256 -48.947940 -0.185400 -49.091097 -0.218256 -49.112219 -0.251111 -49.123953 -0.251111 -49.222520 -0.307435 -49.499447 -0.283967 -49.785760 -0.206521 -49.938305 -0.206521 -49.950039 -0.206521 # -b -49.950039 -0.206521 -50.006363 -0.239377 -50.015750 -0.239377 -50.072074 -0.328557 -50.194110 -0.295701 -50.280943 -0.373147 -50.302064 -0.605483 -50.337267 -0.826086 -50.337267 -0.938734 -50.391244 -1.025567 -50.522667 -1.060769 -50.665824 -0.983324 -50.832449 -1.025567 -51.020196 -1.126481 -51.196208 -1.192192 -51.318244 -1.215661 -51.339365 -1.070157 -51.261920 -0.894144 -51.240798 -0.706397 -51.351099 -0.617218 -51.362834 -0.438858 -51.252532 -0.262846 -51.041317 -0.105608 -50.931016 -0.007041 # -b -80.017691 -2.290511 -79.928511 -2.189597 -79.895655 -2.177863 -79.907389 -2.257655 -79.907389 -2.356222 -79.907389 -2.522848 -79.862799 -2.555703 -79.785354 -2.489992 -79.761886 -2.478258 -79.752498 -2.555703 -79.797088 -2.666005 -79.818210 -2.853752 -79.862799 -2.966400 -79.895655 -3.109557 -79.928511 -3.154146 -79.982488 -3.240979 # -b -80.038812 -6.808169 -79.818210 -7.071014 -79.707908 -7.169581 -79.618729 -7.369062 -79.576486 -7.533341 -79.487306 -7.709353 -79.323027 -7.939343 -79.144668 -8.127090 -78.968655 -8.235044 -78.914678 -8.324224 -78.804377 -8.455647 -78.804377 -8.521358 -78.748053 -8.730227 -78.661220 -8.903892 -78.593162 -9.079905 -78.539184 -9.155004 -78.527450 -9.166738 -78.417149 -9.450705 -78.374906 -9.582128 -78.318582 -9.734672 -78.273992 -9.844973 -78.229402 -9.985783 # -b -89.355748 -0.748640 -89.332279 -0.727519 -89.332279 -0.804964 -89.355748 -0.870676 -89.466049 -0.971590 -89.552882 -0.992711 -89.609206 -0.959856 -89.609206 -0.882410 -89.543494 -0.837820 -89.466049 -0.783843 -89.409725 -0.760375 -89.355748 -0.748640 # -b -80.059934 0.171319 -80.137379 -0.018775 -80.292270 -0.218256 -80.402572 -0.361413 -80.423693 -0.516304 -80.402572 -0.682929 -80.468283 -0.715785 -80.590318 -0.905878 -80.745209 -0.983324 -80.864898 -1.081891 -80.820308 -1.382286 -80.820308 -1.591154 -80.864898 -1.692068 -80.820308 -1.957260 -80.799187 -2.079296 -80.832042 -2.189597 -80.855511 -2.201331 -80.888366 -2.245921 -80.843777 -2.335101 -80.745209 -2.412547 -80.634908 -2.466524 -80.512873 -2.543969 -80.402572 -2.644883 -80.336860 -2.677739 -80.313392 -2.677739 -80.304004 -2.654271 -80.235946 -2.576825 -80.160847 -2.511114 -80.125645 -2.466524 -80.083402 -2.367957 -80.017691 -2.290511 # -b -79.982488 -3.240979 -80.059934 -3.309038 -80.160847 -3.363015 -80.259415 -3.395870 -80.271149 -3.395870 # -b -80.271149 -3.395870 -80.292270 -3.419339 -80.346247 -3.508519 -80.524607 -3.595351 -80.677151 -3.729121 -80.799187 -3.851156 -80.897754 -3.949724 -81.019789 -4.083493 -81.174680 -4.203182 -81.252126 -4.315830 -81.273247 -4.512964 -81.284982 -4.691323 -81.207536 -4.900192 -81.151212 -4.977637 -81.130090 -5.087939 -81.141825 -5.153650 -81.097235 -5.329663 -80.986933 -5.451698 -80.888366 -5.594855 -80.864898 -5.728625 -81.040911 -5.848313 -81.141825 -5.970349 -80.998668 -6.113506 -80.888366 -6.212073 -80.623174 -6.366964 -80.435427 -6.488999 -80.226559 -6.632156 -80.038812 -6.808169 # -b -91.460859 -0.328557 -91.439737 -0.384881 -91.428003 -0.495182 -91.428003 -0.528038 -91.538304 -0.528038 -91.615750 -0.495182 -91.648605 -0.429471 -91.636871 -0.361413 -91.571160 -0.349678 -91.472593 -0.340291 -91.460859 -0.328557 # -b -91.371679 0.103261 -91.261378 -0.161932 -91.207400 -0.307435 -91.097099 -0.417737 -91.031388 -0.506916 -91.019654 -0.605483 -90.942208 -0.682929 -90.909352 -0.826086 -90.921087 -0.938734 -91.040775 -1.016180 -91.151076 -1.060769 -91.317702 -1.093625 -91.428003 -1.081891 -91.493714 -0.971590 -91.460859 -0.837820 -91.371679 -0.772109 -91.251990 -0.694663 -91.186279 -0.605483 -91.219135 -0.506916 -91.284846 -0.384881 -91.350557 -0.272233 -91.395147 -0.185400 -91.439737 -0.140810 -91.472593 -0.129076 -91.526570 -0.051630 # -b -90.712218 -0.206521 -90.831907 -0.218256 -90.876497 -0.295701 -90.876497 -0.373147 -90.810785 -0.384881 -90.733340 -0.417737 -90.667628 -0.417737 -90.623039 -0.349678 -90.623039 -0.272233 -90.712218 -0.206521 # -b -90.346112 -0.528038 -90.324990 -0.549159 -90.259279 -0.626605 -90.524471 -0.572628 -90.414170 -0.549159 -90.346112 -0.528038 -90.524471 -0.572628 -90.414170 -0.549159 -90.346112 -0.528038 # -b -140.030958 -8.727880 -139.988715 -8.760736 -139.955860 -8.849915 -139.965247 -8.903892 # -b -138.960802 -9.713551 -138.960802 -9.692429 -138.906824 -9.647839 -138.871622 -9.692429 -138.817645 -9.701816 -138.740199 -9.725285 -138.751933 -9.746406 -138.817645 -9.746406 -138.871622 -9.767528 -138.949067 -9.767528 -138.960802 -9.713551 # -b -140.087283 -8.727880 -140.054427 -8.718493 -140.030958 -8.727880 # -b -139.965247 -8.903892 -140.009837 -8.957870 -140.075548 -8.936748 -140.120138 -8.892158 -140.120138 -8.805325 -140.108404 -8.760736 -140.087283 -8.727880 # -b -157.906802 -9.002460 -157.895067 -8.990725 -157.850478 -8.969604 -157.784766 -9.014194 -157.740176 -9.079905 -157.751911 -9.101027 -157.805888 -9.089292 -157.850478 -9.035315 -157.906802 -9.002460 # -b -173.062663 -2.776306 -173.086131 -2.752838 -173.074397 -2.785693 -173.062663 -2.776306 # -b -170.668891 -3.705653 -170.690013 -3.715040 -170.690013 -3.672797 -170.657157 -3.693918 -170.657157 -3.738508 -170.668891 -3.705653 # -b -171.804759 -9.145616 -171.793025 -9.133882 -171.727314 -9.187860 -171.750782 -9.232449 -171.783638 -9.220715 -171.804759 -9.145616 # -b 174.318220 -0.635992 174.339341 -0.680582 174.372197 -0.769762 174.383931 -0.814352 174.372197 -0.758028 174.339341 -0.692316 174.318220 -0.635992 # -b 179.152700 -8.509624 179.164434 -8.596457 179.143313 -8.652781 179.098723 -8.629313 179.098723 -8.554214 179.098723 -8.521358 179.152700 -8.509624 # -b 160.816877 -8.389936 160.816877 -8.333612 160.849733 -8.324224 160.969421 -8.422791 161.046867 -8.575336 161.091457 -8.685637 161.091457 -8.772470 161.213492 -8.871037 161.323794 -9.035315 161.389505 -9.155004 161.368383 -9.232449 161.377771 -9.298161 161.478685 -9.319282 161.565518 -9.319282 161.654697 -9.429584 161.675819 -9.570394 161.666432 -9.614984 161.633576 -9.528151 161.445829 -9.483561 161.323794 -9.384994 161.147781 -9.199594 161.014011 -8.957870 160.903710 -8.739614 160.849733 -8.542480 160.837999 -8.422791 160.816877 -8.389936 # -b 160.263024 -8.990725 160.253637 -8.948482 160.340470 -8.925014 160.441384 -8.969604 160.518829 -9.056437 160.518829 -9.133882 160.417915 -9.133882 160.319348 -9.047049 160.263024 -8.990725 # -b 159.932120 -9.331016 160.098746 -9.352138 160.152723 -9.363872 160.209047 -9.363872 160.241903 -9.352138 160.263024 -9.352138 160.352204 -9.375606 160.429649 -9.363872 160.539951 -9.462439 160.671373 -9.537538 160.793409 -9.603249 160.891976 -9.680695 160.969421 -9.701816 160.960034 -9.833239 160.859120 -9.920072 160.694842 -9.887216 160.539951 -9.844973 160.363938 -9.823852 160.220781 -9.833239 160.075277 -9.833239 # -b 169.537717 -0.835473 169.525982 -0.814352 169.525982 -0.802618 169.558838 -0.802618 169.591694 -0.868329 169.591694 -0.924653 169.549451 -0.924653 169.525982 -0.880063 169.525982 -0.847207 169.537717 -0.835473 # -b 150.129390 -2.475911 150.141124 -2.431321 150.260813 -2.410200 150.371114 -2.410200 150.481415 -2.421934 150.549474 -2.565091 150.549474 -2.642536 150.448560 -2.663658 150.328871 -2.687126 150.206836 -2.576825 150.129390 -2.508767 150.129390 -2.475911 # -b 150.957823 -2.642536 150.967210 -2.586212 151.023534 -2.621415 151.145570 -2.698860 151.300461 -2.785693 151.410762 -2.886607 151.563306 -2.964053 151.741666 -3.086088 151.929413 -3.217511 152.126547 -3.240979 152.314294 -3.384136 152.424595 -3.494438 152.558364 -3.583617 152.668666 -3.661063 152.767233 -3.804220 152.889268 -3.905134 153.088749 -3.937989 153.154461 -4.015435 153.220172 -4.191448 153.297617 -4.313483 153.297617 -4.412050 153.220172 -4.545820 153.130992 -4.766422 152.966714 -4.778156 152.910390 -4.578675 152.844678 -4.313483 152.790701 -4.125736 152.713256 -3.905134 152.612342 -3.726774 152.513775 -3.571883 152.403473 -3.485050 152.304906 -3.461582 152.126547 -3.440460 151.938800 -3.318425 151.786256 -3.151800 151.664220 -3.140065 151.521063 -3.029764 151.410762 -2.975787 151.255871 -2.874873 151.100980 -2.764572 150.957823 -2.752838 150.957823 -2.687126 150.957823 -2.642536 # -b 149.908788 -5.517409 150.051944 -5.439964 150.051944 -5.317928 150.084800 -5.240483 150.150512 -5.109060 150.239691 -5.052736 150.293668 -5.085592 150.206836 -5.252217 150.195101 -5.428230 150.293668 -5.496288 150.448560 -5.461085 150.615185 -5.451698 150.746608 -5.517409 150.901499 -5.505675 151.035268 -5.451698 151.187813 -5.273339 151.354438 -5.052736 151.530451 -4.942435 151.640752 -4.954169 151.795643 -4.864989 151.819111 -4.677242 151.786256 -4.512964 151.708810 -4.346339 151.718197 -4.257159 151.873089 -4.224303 151.995124 -4.290015 152.105425 -4.280627 152.150015 -4.236037 152.269704 -4.203182 152.326028 -4.236037 152.403473 -4.257159 152.502040 -4.435518 152.513775 -4.677242 152.480919 -4.843868 152.370618 -4.954169 152.260316 -4.998759 152.203992 -5.130182 152.269704 -5.329663 152.150015 -5.550265 152.006858 -5.583121 151.786256 -5.550265 151.708810 -5.639445 151.697076 -5.770868 151.497595 -5.970349 151.255871 -6.090037 151.035268 -6.190951 150.856909 -6.244928 150.659775 -6.277784 150.472028 -6.277784 150.305403 -6.277784 150.105922 -6.322374 # -b 154.677557 -4.954169 154.656435 -4.965903 154.698678 -4.933047 154.743268 -5.076204 154.766736 -5.231096 154.766736 -5.329663 154.743268 -5.296807 154.689291 -5.153650 154.689291 -5.031615 154.677557 -4.954169 # -b 154.832448 -5.418842 154.886425 -5.428230 154.942749 -5.461085 155.097640 -5.484554 155.207941 -5.648832 155.351098 -5.827192 155.494255 -5.970349 155.628025 -6.113506 155.815772 -6.277784 156.012906 -6.432675 156.057496 -6.587566 156.069230 -6.686133 156.024640 -6.740110 155.902604 -6.805822 155.747713 -6.829290 155.592822 -6.796435 155.407422 -6.653278 155.329977 -6.498386 155.318242 -6.244928 155.163351 -6.146361 154.987339 -5.970349 154.865303 -5.770868 154.832448 -5.606589 154.844182 -5.505675 154.832448 -5.418842 # -b 156.587880 -6.596954 156.653592 -6.554711 156.775627 -6.686133 156.874194 -6.751845 157.061941 -6.784700 157.118265 -6.883267 157.195711 -6.972447 157.371723 -7.038159 157.449169 -7.124991 157.568857 -7.157847 157.604060 -7.279883 157.449169 -7.301004 157.249688 -7.202437 157.040819 -7.136726 156.796749 -6.895002 156.674713 -6.718989 156.587880 -6.596954 # -b 156.653592 -7.500485 156.742771 -7.533341 156.820217 -7.620174 156.862460 -7.709353 156.841338 -7.817308 156.820217 -7.883019 156.752159 -7.775065 156.665326 -7.664764 156.620736 -7.542728 156.653592 -7.500485 # -b 157.205098 -7.850164 157.261422 -7.918222 157.261422 -8.049644 157.172242 -8.082500 157.094797 -7.951077 157.085409 -7.784452 157.151121 -7.796186 157.205098 -7.850164 # -b 157.371723 -8.181067 157.359989 -8.115356 157.383457 -8.005055 157.493759 -7.960465 157.604060 -7.960465 157.658037 -8.082500 157.702627 -8.148212 157.878640 -8.246779 157.946698 -8.488503 157.834050 -8.488503 157.702627 -8.333612 157.580592 -8.223310 157.449169 -8.246779 157.371723 -8.181067 # -b 157.383457 -8.554214 157.348255 -8.476768 157.383457 -8.443913 157.449169 -8.422791 157.470290 -8.476768 157.482024 -8.563601 157.458556 -8.608191 157.383457 -8.554214 # -b 158.045265 -8.608191 158.000675 -8.587070 158.033531 -8.530746 158.089855 -8.509624 158.155566 -8.509624 158.188422 -8.575336 158.176688 -8.641047 158.110976 -8.673903 158.045265 -8.608191 # -b 158.629627 -7.509872 158.662483 -7.488751 158.796252 -7.566196 158.915941 -7.653029 159.061445 -7.742209 159.213989 -7.829042 159.326637 -7.906488 159.469794 -7.960465 159.601217 -8.016789 159.699784 -8.103622 159.800698 -8.136477 159.910999 -8.223310 159.932120 -8.324224 159.943855 -8.422791 159.932120 -8.455647 159.821819 -8.399323 159.666928 -8.312490 159.512037 -8.202189 159.368880 -8.103622 159.237457 -8.037910 159.082566 -7.951077 158.915941 -7.873632 158.763396 -7.742209 158.674217 -7.599052 158.629627 -7.509872 # -b 159.678662 -9.277039 159.767842 -9.220715 159.800698 -9.253571 159.932120 -9.331016 # -b 160.075277 -9.833239 159.910999 -9.758140 159.767842 -9.626718 159.666928 -9.504682 159.657541 -9.396728 159.678662 -9.277039 # -b 152.722643 -8.948482 152.844678 -9.047049 152.945592 -9.101027 153.065281 -9.166738 153.077015 -9.277039 152.933858 -9.277039 152.811823 -9.145616 152.746111 -8.981338 152.722643 -8.948482 # -b 150.648041 -9.342751 150.692630 -9.342751 150.746608 -9.363872 150.889765 -9.396728 151.035268 -9.495295 151.056390 -9.603249 151.077511 -9.701816 150.913233 -9.680695 150.692630 -9.626718 150.659775 -9.528151 150.636306 -9.408462 150.648041 -9.342751 # -b 150.967210 -9.800383 151.035268 -9.844973 151.133835 -9.943540 151.187813 -9.952928 151.288727 -9.931806 151.375559 -9.964662 # -b 151.122101 -10.018639 151.044656 -9.931806 150.990679 -9.833239 150.967210 -9.800383 # -b 149.953377 -9.593862 150.150512 -9.692429 150.019089 -9.767528 # -b 146.695970 -1.999504 146.728826 -1.978382 146.794537 -1.978382 146.850861 -2.032359 147.015140 -2.044093 147.202887 -2.011238 147.116054 -2.210719 147.015140 -2.166129 146.937694 -2.154395 146.895451 -2.198985 146.773416 -2.255309 146.695970 -2.154395 146.728826 -2.067562 146.707704 -2.055828 146.695970 -1.999504 # -b 149.664717 -1.335349 149.721041 -1.314228 149.775018 -1.401061 149.852463 -1.511362 149.798486 -1.579420 149.676451 -1.490240 149.643595 -1.379939 149.664717 -1.335349 # -b 147.181765 -5.252217 147.247476 -5.252217 147.303801 -5.296807 147.357778 -5.395374 147.292066 -5.472820 147.214621 -5.451698 147.170031 -5.341397 147.181765 -5.252217 # -b 147.921018 -5.538531 147.944487 -5.517409 147.986730 -5.529144 148.031319 -5.529144 148.108765 -5.561999 148.186211 -5.615976 148.207332 -5.738012 148.207332 -5.803723 148.097031 -5.803723 148.019585 -5.726278 147.977342 -5.639445 147.932752 -5.583121 147.921018 -5.538531 # -b 148.451403 -5.517409 148.484259 -5.472820 148.540583 -5.439964 148.650884 -5.496288 148.770572 -5.505675 148.937198 -5.517409 149.235246 -5.538531 149.357281 -5.561999 149.476970 -5.561999 149.599005 -5.538531 149.732775 -5.538531 149.908788 -5.517409 # -b 150.105922 -6.322374 149.852463 -6.334108 149.643595 -6.134627 149.509826 -6.134627 149.312691 -6.190951 149.113210 -6.047794 148.925464 -5.937493 148.672005 -5.869435 148.505380 -5.726278 148.451403 -5.529144 148.451403 -5.517409 # -b 141.119890 -2.576825 141.197336 -2.621415 141.373348 -2.698860 141.495384 -2.731716 141.650275 -2.752838 141.849756 -2.874873 142.025768 -2.919463 142.225249 -2.975787 142.422383 -3.095476 142.577275 -3.172921 142.776756 -3.217511 142.943381 -3.294957 143.128781 -3.318425 143.361118 -3.363015 143.527743 -3.428726 143.703755 -3.506172 143.891502 -3.595351 144.123839 -3.693918 144.323320 -3.759630 144.508720 -3.759630 144.609634 -3.860544 144.764525 -4.081146 144.985127 -4.214916 145.193996 -4.346339 145.438067 -4.468374 145.668056 -4.623265 145.867537 -4.855602 145.956717 -5.076204 145.966105 -5.252217 145.956717 -5.418842 146.022429 -5.505675 146.275887 -5.571387 146.484755 -5.615976 146.663115 -5.726278 146.827393 -5.827192 146.994018 -5.892903 147.214621 -5.946880 147.423489 -5.991470 147.590114 -5.979736 147.777861 -6.090037 147.932752 -6.266050 148.019585 -6.453797 147.998464 -6.718989 147.843573 -6.718989 147.712150 -6.784700 147.500935 -6.805822 147.268598 -6.805822 147.181765 -6.906736 147.268598 -7.049893 147.324922 -7.247027 147.435223 -7.477017 147.590114 -7.542728 147.798983 -7.775065 147.953874 -7.894753 148.075909 -7.972199 148.120499 -8.016789 148.141621 -8.049644 # -b 148.129886 -8.049644 148.186211 -8.049644 148.263656 -8.070766 148.308246 -8.115356 148.329367 -8.223310 148.341102 -8.465034 148.451403 -8.608191 148.582826 -8.706758 148.728329 -8.990725 148.871486 -9.079905 149.002909 -9.056437 149.146066 -9.047049 149.312691 -9.023581 149.399524 -9.101027 149.390137 -9.277039 149.357281 -9.441318 149.509826 -9.561006 149.721041 -9.561006 149.953377 -9.593862 # -b 150.019089 -9.767528 149.953377 -9.898951 # -b 147.899897 -10.051495 147.766127 -9.887216 147.622970 -9.713551 147.479813 -9.570394 147.348390 -9.474173 147.226355 -9.396728 147.202887 -9.396728 147.202887 -9.384994 147.104320 -9.277039 147.083198 -9.220715 147.125441 -9.079905 146.982284 -9.068171 146.773416 -9.035315 146.663115 -8.805325 146.552813 -8.652781 146.409656 -8.476768 146.365066 -8.246779 146.153851 -8.103622 145.966105 -8.049644 145.790092 -7.983933 145.602345 -7.972199 145.438067 -7.861898 145.337153 -7.850164 145.283175 -7.817308 145.259707 -7.817308 145.161140 -7.763331 145.029717 -7.730475 144.940538 -7.664764 144.928803 -7.599052 144.797381 -7.554462 144.687079 -7.620174 144.543922 -7.500485 144.443009 -7.566196 144.377297 -7.643642 144.255262 -7.697619 144.034659 -7.643642 143.903236 -7.554462 143.957214 -7.817308 144.013538 -7.972199 143.870381 -8.026176 143.649778 -8.005055 143.560599 -8.103622 143.605188 -8.190455 143.483153 -8.267900 143.316528 -8.324224 143.128781 -8.366467 143.241429 -8.465034 143.349383 -8.608191 143.426829 -8.793591 143.462031 -8.903892 143.372852 -9.002460 143.262550 -9.035315 143.173371 -9.079905 143.063069 -9.155004 142.908178 -9.253571 142.797877 -9.286427 142.678188 -9.253571 142.544419 -9.211328 142.511563 -9.187860 142.422383 -9.178472 142.290961 -9.178472 142.124335 -9.187860 141.960057 -9.232449 141.805166 -9.220715 141.650275 -9.178472 141.572829 -9.122148 141.518852 -9.133882 141.340492 -9.145616 # -b 141.340492 -9.145616 141.331105 -9.122148 141.119890 -9.056437 140.976733 -8.948482 140.666951 -8.685637 140.502672 -8.488503 140.314926 -8.300756 140.148300 -8.202189 140.115445 -8.136477 140.028612 -8.059032 # -b 139.927698 -2.344488 140.106057 -2.332754 140.192890 -2.288164 140.336047 -2.353876 140.436961 -2.332754 140.514407 -2.344488 140.612974 -2.398466 140.702153 -2.454790 140.800720 -2.464177 140.833576 -2.499379 140.833576 -2.553357 140.866432 -2.586212 140.964999 -2.586212 141.009589 -2.565091 141.075300 -2.576825 141.119890 -2.576825 # -b 140.028612 -8.059032 139.796275 -8.115356 139.620262 -8.181067 139.420781 -8.148212 139.265890 -8.124743 139.122733 -8.256166 139.024166 -8.169333 139.000698 -8.291369 139.012432 -8.333612 138.956108 -8.357080 138.824685 -8.366467 138.735505 -8.291369 138.538371 -8.357080 138.360012 -8.399323 138.205121 -8.411057 138.007987 -8.432179 137.864830 -8.422791 137.853095 -8.256166 137.975131 -8.059032 138.085432 -7.784452 138.240323 -7.599052 138.383480 -7.455895 138.604083 -7.378450 138.758974 -7.390184 138.934986 -7.509872 139.066409 -7.554462 139.066409 -7.423040 138.878662 -7.258761 138.902131 -7.202437 139.033554 -7.169581 138.836419 -7.103870 138.625204 -6.960713 138.726118 -6.916123 138.768361 -6.730723 138.801217 -6.608688 138.648673 -6.498386 138.503169 -6.256662 138.460926 -6.057181 138.437457 -5.881169 138.449192 -5.803723 138.371746 -5.738012 138.228589 -5.538531 138.183999 -5.451698 138.073698 -5.451698 137.951663 -5.407108 137.864830 -5.296807 137.841361 -5.296807 137.796771 -5.240483 137.752182 -5.174771 137.653614 -5.153650 137.555047 -5.130182 137.400156 -5.043349 137.224144 -4.965903 137.045784 -4.975290 136.893240 -4.897845 136.670291 -4.778156 136.428567 -4.710098 136.252554 -4.688977 136.064807 -4.599797 135.898182 -4.545820 135.701048 -4.534085 135.534422 -4.512964 135.391265 -4.480108 135.257496 -4.468374 135.147195 -4.456640 135.114339 -4.390929 135.060362 -4.379194 134.882002 -4.290015 134.783435 -4.158592 134.750579 -4.003701 134.595688 -4.015435 134.419676 -3.982579 134.396207 -4.102268 134.330496 -3.991967 134.154483 -3.872278 134.065304 -3.837075 134.023061 -3.726774 133.844701 -3.649329 133.811845 -3.527293 133.823580 -3.327812 133.901025 -3.118944 133.877557 -2.975787 133.835314 -3.095476 133.800111 -3.285569 133.746134 -3.428726 133.668688 -3.583617 133.602977 -3.693918 133.570121 -3.837075 133.492676 -3.959111 133.370640 -4.092880 133.194628 -4.114002 133.028002 -4.137470 132.941170 -4.092880 132.896580 -4.024822 132.884846 -3.860544 132.828521 -3.649329 132.851990 -3.562496 132.840256 -3.363015 132.718220 -3.363015 132.575063 -3.118944 132.387316 -2.996908 132.145592 -3.008643 131.990701 -2.952319 132.023557 -2.785693 132.190182 -2.708248 132.443640 -2.698860 132.697099 -2.752838 132.905967 -2.630802 133.060858 -2.553357 133.239218 -2.487645 133.424618 -2.553357 133.645220 -2.565091 133.811845 -2.499379 133.823580 -2.309286 133.889291 -2.187250 133.910412 -2.067562 133.734400 -2.145007 133.382375 -2.243574 132.974025 -2.332754 132.685365 -2.321020 132.521086 -2.276430 132.366195 -2.321020 132.101003 -2.177863 132.044679 -2.067562 131.957846 -1.900936 131.913256 -1.701455 131.802955 -1.600542 131.626942 -1.511362 131.448582 -1.534830 131.317160 -1.457385 131.272570 -1.579420 131.073089 -1.490240 130.986256 -1.457385 130.953400 -1.433916 130.962788 -1.412795 131.007377 -1.314228 131.096557 -1.201580 131.195124 -1.013833 131.251448 -0.868329 131.317160 -0.826086 131.504906 -0.781496 131.648063 -0.781496 131.835810 -0.725172 132.002435 -0.570281 132.166714 -0.427124 132.399051 -0.359066 132.664243 -0.359066 132.905967 -0.415390 133.138304 -0.570281 133.260339 -0.704051 133.415230 -0.790883 133.612364 -0.781496 133.811845 -0.781496 134.023061 -0.790883 134.088772 -1.079544 134.208461 -1.269638 134.231929 -1.555952 134.154483 -1.788288 134.133362 -2.022972 134.187339 -2.243574 134.243663 -2.454790 134.386820 -2.654271 134.473653 -2.797427 134.506509 -2.698860 134.518243 -2.541622 134.705990 -2.609681 134.795169 -2.907729 134.849147 -2.985174 134.938326 -3.184655 135.093217 -3.285569 135.248108 -3.372402 135.379531 -3.384136 135.623602 -3.363015 135.722169 -3.140065 135.853592 -3.086088 135.975627 -2.996908 136.008483 -2.853752 136.097663 -2.776306 136.219698 -2.675392 136.362855 -2.565091 136.473156 -2.264696 136.637435 -2.222453 136.771204 -2.222453 136.881506 -2.198985 137.102108 -2.145007 137.256999 -2.032359 137.245265 -1.889202 137.245265 -1.856347 137.322711 -1.778901 137.555047 -1.612276 137.620759 -1.579420 137.897685 -1.412795 138.017374 -1.469119 138.085432 -1.567686 138.205121 -1.600542 138.437457 -1.689721 138.648673 -1.788288 138.768361 -1.811757 138.845807 -1.889202 139.045288 -1.954914 139.277624 -2.022972 139.409047 -2.121539 139.563938 -2.222453 139.707095 -2.288164 139.817396 -2.321020 139.927698 -2.344488 # -b 135.489832 -0.748640 135.435855 -0.704051 135.513301 -0.692316 135.665845 -0.704051 135.733903 -0.736906 135.865326 -0.748640 136.020217 -0.826086 136.163374 -0.948121 136.252554 -1.046688 136.329999 -1.147602 136.252554 -1.180458 136.041339 -1.201580 135.942772 -1.135868 135.909916 -1.025567 135.766759 -0.912919 135.588400 -0.826086 135.489832 -0.748640 # -b 135.611868 -1.633397 135.611868 -1.600542 135.665845 -1.600542 135.755025 -1.600542 135.898182 -1.624010 136.031951 -1.645131 136.207964 -1.689721 136.383977 -1.689721 136.527134 -1.710843 136.747736 -1.722577 136.836916 -1.767167 136.869772 -1.877468 136.660903 -1.910324 136.449688 -1.889202 136.261941 -1.868081 136.074194 -1.811757 135.898182 -1.755433 135.733903 -1.701455 135.632989 -1.677987 135.611868 -1.633397 # -b 130.423015 -0.114995 130.378426 -0.114995 130.423015 -0.105608 130.500461 -0.070405 130.577907 -0.070405 130.699942 -0.049284 131.260836 -0.337944 131.141147 -0.349678 130.974522 -0.382534 130.852486 -0.436511 130.721064 -0.359066 130.577907 -0.305089 130.455871 -0.281620 130.366691 -0.215909 130.366691 -0.171319 130.423015 -0.114995 # -b 130.699942 -0.990364 130.721064 -0.990364 130.819631 -0.936387 130.908810 -0.912919 130.997990 -0.969243 131.007377 -1.112400 131.007377 -1.269638 130.897076 -1.290759 130.810243 -1.246169 130.732798 -1.091278 130.699942 -0.990364 # -b 129.958342 -1.800023 130.068643 -1.767167 130.169557 -1.710843 130.300980 -1.710843 130.390160 -1.832878 130.366691 -1.910324 130.390160 -1.999504 130.235269 -2.067562 130.047522 -2.088683 # -b 129.892631 -3.018030 130.035788 -3.041498 130.202413 -3.041498 130.345570 -3.008643 130.512195 -3.062620 130.587294 -3.240979 130.631884 -3.363015 130.699942 -3.449848 130.843099 -3.494438 130.864220 -3.726774 130.786775 -3.905134 130.655352 -3.804220 130.512195 -3.738508 130.357304 -3.649329 130.202413 -3.571883 130.035788 -3.473316 # -b 133.072592 -5.395374 133.084326 -5.383640 133.138304 -5.341397 133.194628 -5.362518 133.161772 -5.496288 133.084326 -5.672301 133.028002 -5.681688 133.049124 -5.517409 133.072592 -5.395374 # -b 134.297640 -5.803723 134.353964 -5.726278 134.440797 -5.571387 134.506509 -5.451698 134.652012 -5.505675 134.705990 -5.594855 134.762314 -5.726278 134.762314 -5.791989 134.762314 -5.881169 134.738845 -6.003204 134.738845 -6.057181 134.771701 -6.256662 134.705990 -6.376351 134.607422 -6.366964 134.497121 -6.322374 134.407941 -6.212073 134.353964 -6.068916 134.375086 -5.970349 134.431410 -5.836579 134.375086 -5.869435 134.297640 -5.803723 # -b 134.231929 -6.212073 134.220195 -6.167483 134.199073 -6.134627 134.199073 -6.101771 134.231929 -6.080650 134.276519 -6.122893 134.309374 -6.179217 134.363352 -6.244928 134.407941 -6.266050 134.518243 -6.310640 134.562833 -6.355230 134.574567 -6.420941 134.595688 -6.498386 134.583954 -6.531242 134.518243 -6.519508 134.452531 -6.432675 134.386820 -6.355230 134.297640 -6.298905 134.253050 -6.244928 134.231929 -6.212073 # -b 134.175605 -6.233194 134.243663 -6.266050 134.309374 -6.366964 134.375086 -6.432675 134.431410 -6.498386 134.485387 -6.564098 134.485387 -6.674399 134.452531 -6.796435 134.396207 -6.906736 134.264785 -6.939591 134.187339 -6.906736 134.121628 -6.796435 134.098159 -6.653278 134.133362 -6.564098 134.199073 -6.730723 134.243663 -6.695521 134.264785 -6.465531 134.231929 -6.477265 134.175605 -6.355230 134.166217 -6.233194 134.175605 -6.233194 # -b 131.183390 -7.784452 131.206858 -7.763331 131.260836 -7.751596 131.239714 -7.653029 131.227980 -7.521607 131.317160 -7.455895 131.460317 -7.345594 131.537762 -7.157847 131.603474 -7.124991 131.713775 -7.202437 131.713775 -7.411305 131.704387 -7.587318 131.594086 -7.763331 131.493172 -7.894753 131.394605 -8.026176 131.317160 -7.972199 131.183390 -7.873632 131.183390 -7.784452 # -b 129.782329 -1.856347 129.880897 -1.856347 129.958342 -1.800023 # -b 130.047522 -2.088683 129.925486 -2.011238 129.815185 -1.933792 129.782329 -1.856347 # -b 127.982307 -3.527293 127.937717 -3.485050 127.916596 -3.240979 127.961185 -3.130678 128.048018 -3.074354 128.137198 -2.952319 128.238112 -2.863139 128.390656 -2.874873 128.578403 -2.898341 128.700438 -2.907729 128.909307 -2.886607 129.087666 -2.842017 129.197968 -2.907729 129.373980 -2.863139 129.540605 -2.820896 129.728352 -2.898341 129.892631 -3.018030 # -b 130.035788 -3.473316 129.892631 -3.395870 129.704884 -3.363015 129.540605 -3.363015 129.540605 -3.440460 129.439692 -3.461582 129.242557 -3.449848 129.054811 -3.428726 128.965631 -3.351281 128.899919 -3.285569 128.745028 -3.351281 128.688704 -3.449848 128.536160 -3.485050 128.357801 -3.405258 128.247499 -3.285569 128.160666 -3.196389 128.116077 -3.250367 128.071487 -3.339546 128.026897 -3.461582 127.982307 -3.527293 # -b 129.650907 -7.906488 129.639173 -7.861898 129.749474 -7.861898 129.838654 -7.850164 129.848041 -7.939343 129.770595 -8.037910 129.716618 -8.026176 129.650907 -7.906488 # -b 128.590137 -7.181315 128.545547 -7.157847 128.634727 -7.124991 128.688704 -7.148460 128.688704 -7.223559 128.634727 -7.268148 128.590137 -7.181315 # -b 125.907705 -8.026176 125.830259 -7.927609 125.884236 -7.784452 125.961682 -7.697619 126.095451 -7.709353 126.259730 -7.709353 126.393500 -7.664764 126.482679 -7.599052 126.614102 -7.533341 126.679813 -7.608439 126.813583 -7.685885 126.855826 -7.730475 126.658692 -7.850164 126.515535 -7.972199 126.327788 -7.993320 126.161163 -7.983933 126.029740 -8.037910 125.907705 -8.026176 # -b 124.781224 -9.068171 124.814079 -9.056437 124.891525 -8.990725 124.990092 -8.903892 125.067538 -8.784204 125.123862 -8.662168 125.278753 -8.652781 125.421910 -8.629313 125.597922 -8.596457 125.797403 -8.563601 125.907705 -8.497890 126.071983 -8.530746 126.217487 -8.521358 126.405234 -8.521358 126.581246 -8.497890 126.780727 -8.432179 126.933272 -8.411057 127.043573 -8.357080 127.198464 -8.411057 127.231320 -8.476768 127.132753 -8.706758 126.834705 -8.793591 126.635224 -8.903892 126.393500 -9.023581 126.128307 -9.089292 125.895970 -9.211328 125.687102 -9.253571 125.511090 -9.286427 125.356198 -9.396728 125.213041 -9.483561 125.112128 -9.417849 # -b 125.112128 -9.417849 125.123862 -9.483561 125.102740 -9.504682 125.067538 -9.603249 125.025295 -9.692429 124.914993 -9.790996 124.825814 -9.887216 # -b 123.722801 -10.009252 123.678211 -9.887216 123.687599 -9.767528 123.711067 -9.626718 123.833102 -9.504682 123.976259 -9.384994 124.053705 -9.352138 124.140538 -9.331016 124.217983 -9.277039 124.307163 -9.232449 124.438586 -9.187860 124.539500 -9.133882 124.616945 -9.133882 124.692044 -9.122148 124.781224 -9.068171 # -b 124.494910 -8.190455 124.539500 -8.169333 124.605211 -8.181067 124.670923 -8.190455 124.769490 -8.181067 125.025295 -8.157599 125.112128 -8.267900 125.034682 -8.378201 124.914993 -8.432179 124.748368 -8.455647 124.581743 -8.455647 124.471442 -8.399323 124.527766 -8.300756 124.494910 -8.190455 # -b 124.020849 -8.465034 123.997381 -8.366467 124.063092 -8.324224 124.164006 -8.267900 124.274307 -8.235044 124.274307 -8.366467 124.173394 -8.554214 124.107682 -8.488503 124.020849 -8.465034 # -b 123.356695 -8.521358 123.380163 -8.455647 123.401285 -8.300756 123.466996 -8.223310 123.523320 -8.300756 123.577297 -8.333612 123.666477 -8.202189 123.765044 -8.181067 123.821368 -8.267900 123.722801 -8.432179 123.643009 -8.509624 123.535054 -8.587070 123.413019 -8.575336 123.356695 -8.521358 # -b 120.000721 -8.443913 120.057045 -8.443913 120.143878 -8.366467 120.254179 -8.324224 120.387948 -8.267900 120.498250 -8.235044 120.662528 -8.213923 120.763442 -8.291369 120.951189 -8.300756 121.138936 -8.345346 121.237503 -8.455647 121.359538 -8.521358 121.490961 -8.575336 121.624731 -8.509624 121.767887 -8.488503 121.955634 -8.443913 122.054201 -8.432179 122.110525 -8.509624 122.230214 -8.563601 122.429695 -8.596457 122.528262 -8.542480 122.638563 -8.411057 122.706622 -8.366467 122.816923 -8.333612 122.915490 -8.256166 122.915490 -8.291369 122.861513 -8.202189 122.870900 -8.037910 122.971814 -8.115356 123.014057 -8.324224 122.960080 -8.399323 122.915490 -8.488503 122.784067 -8.608191 122.596320 -8.706758 122.429695 -8.751348 122.220827 -8.751348 121.976756 -8.849915 121.711563 -8.817060 121.523817 -8.817060 121.336070 -8.903892 121.127202 -8.948482 120.939455 -8.859303 120.772829 -8.838181 120.596817 -8.793591 120.355093 -8.805325 120.188467 -8.805325 120.033576 -8.817060 # -b 119.878685 -8.488503 120.000721 -8.443913 # -b 120.000721 -9.277039 120.057045 -9.331016 120.134490 -9.450705 120.244791 -9.462439 120.298769 -9.528151 120.420804 -9.614984 120.608551 -9.713551 120.796298 -9.931806 # -b 119.902154 -9.352138 120.000721 -9.277039 # -b 120.188467 0.028162 120.143878 -0.215909 120.143878 -0.481101 120.155612 -0.758028 120.277647 -0.912919 120.474781 -0.980977 120.629672 -1.201580 120.751708 -1.401061 120.927721 -1.391673 121.138936 -1.379939 121.183526 -1.269638 121.326682 -1.135868 121.469839 -0.957509 121.666974 -0.868329 121.833599 -0.924653 121.899310 -0.924653 122.054201 -0.969243 122.143381 -0.826086 122.286538 -0.802618 122.429695 -0.790883 122.673766 -0.790883 122.838044 -0.790883 122.861513 -0.713438 122.882634 -0.635992 123.037525 -0.582015 123.168948 -0.537425 123.368429 -0.549159 123.478730 -0.692316 123.457609 -0.903532 123.344961 -1.025567 123.114971 -0.903532 122.894368 -0.957509 122.683153 -1.201580 122.518875 -1.412795 122.352249 -1.567686 122.077670 -1.701455 121.943900 -1.734311 121.744419 -1.856347 121.645852 -1.877468 121.413515 -1.800023 121.436984 -1.987769 121.690442 -2.145007 121.899310 -2.421934 122.054201 -2.663658 122.209093 -2.863139 122.298272 -2.898341 122.375718 -3.086088 122.486019 -3.217511 122.417961 -3.327812 122.286538 -3.372402 122.263070 -3.527293 122.286538 -3.637594 122.507141 -3.792486 122.605708 -3.914521 122.605708 -4.081146 122.716009 -4.158592 122.849778 -4.125736 122.894368 -4.280627 122.838044 -4.358073 122.760599 -4.447253 122.495406 -4.435518 122.230214 -4.501230 122.119913 -4.745301 121.932166 -4.864989 121.657586 -4.843868 121.568407 -4.634999 121.547285 -4.379194 121.624731 -4.158592 121.523817 -4.015435 121.314948 -3.860544 121.106080 -3.661063 120.984045 -3.395870 121.127202 -3.118944 121.127202 -2.907729 121.094346 -2.752838 121.049756 -2.642536 120.829153 -2.621415 120.585083 -2.752838 120.387948 -2.919463 120.298769 -3.151800 120.432538 -3.395870 120.441926 -3.649329 120.432538 -3.905134 120.420804 -4.257159 120.420804 -4.578675 120.486516 -4.745301 120.364480 -4.998759 120.387948 -5.285073 120.465394 -5.550265 120.409070 -5.594855 120.155612 -5.615976 # -b 121.866455 -5.198240 121.878189 -5.153650 121.943900 -5.120794 122.033080 -5.130182 122.110525 -5.240483 122.098791 -5.407108 122.009612 -5.439964 121.911044 -5.341397 121.866455 -5.219361 121.866455 -5.198240 # -b 122.375718 -4.721832 122.396839 -4.733566 122.417961 -4.733566 122.450817 -4.733566 122.507141 -4.721832 122.617442 -4.644387 122.694887 -4.667855 122.706622 -4.799278 122.739477 -4.954169 122.727743 -5.052736 122.673766 -5.198240 122.638563 -5.383640 122.596320 -5.317928 122.474285 -5.383640 122.331128 -5.341397 122.331128 -5.120794 122.340515 -4.965903 122.363984 -4.799278 122.375718 -4.721832 # -b 122.805189 -4.998759 122.849778 -4.954169 122.861513 -4.843868 122.861513 -4.677242 122.870900 -4.522351 122.927224 -4.468374 122.981201 -4.358073 123.046913 -4.423784 123.147827 -4.578675 123.201804 -4.754688 123.159561 -4.733566 123.046913 -4.864989 123.014057 -4.965903 123.025791 -5.052736 123.114971 -5.109060 123.168948 -5.240483 123.168948 -5.374252 123.046913 -5.439964 122.948346 -5.538531 122.793454 -5.672301 122.673766 -5.561999 122.673766 -5.439964 122.706622 -5.285073 122.760599 -5.174771 122.805189 -4.998759 # -b 123.037525 -4.015435 123.082115 -3.959111 123.082115 -3.959111 123.114971 -3.991967 123.201804 -4.024822 123.246394 -4.114002 123.213538 -4.224303 123.136092 -4.236037 123.046913 -4.179713 123.025791 -4.036556 123.037525 -4.015435 # -b 123.070381 -1.156990 123.091503 -1.156990 123.180682 -1.156990 123.201804 -1.213314 123.168948 -1.314228 123.103237 -1.412795 123.014057 -1.555952 122.861513 -1.546564 122.826310 -1.379939 122.861513 -1.290759 122.927224 -1.225048 123.004670 -1.192192 123.070381 -1.156990 # -b 123.225272 -1.379939 123.312105 -1.269638 123.389551 -1.246169 123.511586 -1.269638 123.535054 -1.314228 123.523320 -1.445650 123.457609 -1.555952 123.323839 -1.490240 123.279249 -1.591154 123.213538 -1.511362 123.201804 -1.412795 123.225272 -1.379939 # -b 124.417464 -1.668600 124.438586 -1.677987 124.494910 -1.668600 124.616945 -1.668600 124.769490 -1.677987 124.891525 -1.710843 124.957236 -1.746045 125.058150 -1.734311 125.135596 -1.734311 125.213041 -1.734311 125.245897 -1.755433 125.267019 -1.811757 125.213041 -1.823491 125.079272 -1.900936 124.936115 -1.910324 124.769490 -1.910324 124.605211 -2.022972 124.494910 -1.999504 124.450320 -1.910324 124.405730 -1.788288 124.393996 -1.734311 124.417464 -1.668600 # -b 125.421910 -1.823491 125.400788 -1.788288 125.487621 -1.811757 125.630778 -1.856347 125.764548 -1.823491 125.884236 -1.800023 125.996884 -1.800023 126.172897 -1.788288 126.283198 -1.778901 126.304320 -1.788288 126.238608 -1.844612 126.062596 -1.889202 125.907705 -1.910324 125.698836 -1.933792 125.543945 -1.954914 125.466500 -1.877468 125.421910 -1.823491 # -b 125.907705 -2.011238 125.952295 -1.966648 125.973416 -1.978382 125.973416 -2.177863 126.006272 -2.344488 126.039127 -2.443055 125.996884 -2.377344 125.895970 -2.154395 125.895970 -2.067562 125.907705 -2.011238 # -b 126.062596 -3.086088 126.095451 -3.086088 126.128307 -3.172921 126.238608 -3.140065 126.327788 -3.107210 126.492067 -3.062620 126.736137 -3.018030 126.945006 -3.140065 127.088163 -3.240979 127.088163 -3.327812 127.189077 -3.318425 127.231320 -3.562496 127.165608 -3.693918 126.966127 -3.771364 126.801849 -3.860544 126.548391 -3.804220 126.337175 -3.705653 126.205753 -3.539027 126.095451 -3.372402 126.039127 -3.208124 126.039127 -3.118944 126.062596 -3.086088 # -b 127.928330 0.061018 127.961185 -0.269886 128.048018 -0.459980 128.170054 -0.647726 128.303823 -0.802618 128.369535 -0.868329 128.280355 -0.891797 128.092608 -0.704051 127.928330 -0.481101 127.749970 -0.269886 # -b 127.353355 -0.359066 127.430801 -0.349678 127.519980 -0.359066 127.597426 -0.459980 127.618547 -0.603137 127.695993 -0.692316 127.839150 -0.781496 127.794560 -0.868329 127.674872 -0.781496 127.519980 -0.802618 127.487125 -0.668848 127.430801 -0.582015 127.365089 -0.427124 127.353355 -0.359066 # -b 127.409679 -1.445650 127.475391 -1.433916 127.618547 -1.356471 127.794560 -1.391673 127.949451 -1.457385 128.116077 -1.534830 128.160666 -1.600542 128.116077 -1.689721 127.928330 -1.689721 127.707727 -1.701455 127.541102 -1.734311 127.419066 -1.668600 127.397945 -1.591154 127.386211 -1.511362 127.409679 -1.445650 # -b 128.059752 -3.815954 128.005775 -3.783098 128.005775 -3.783098 128.005775 -3.705653 128.048018 -3.628207 128.160666 -3.583617 128.238112 -3.517906 128.313211 -3.527293 128.303823 -3.672797 128.247499 -3.750243 128.181788 -3.750243 128.059752 -3.815954 128.005775 -3.783098 # -b 112.150557 -8.256166 112.075458 -8.267900 111.962810 -8.256166 111.843122 -8.324224 111.753942 -8.357080 111.676496 -8.324224 111.554461 -8.291369 111.434772 -8.267900 111.333859 -8.223310 111.268147 -8.157599 111.223557 -8.213923 111.047545 -8.213923 110.859798 -8.181067 110.716641 -8.136477 110.582871 -8.091888 110.418593 -8.005055 110.296557 -7.906488 110.165135 -7.829042 110.010244 -7.763331 # -b 109.944532 -6.838678 110.087689 -6.873880 110.263702 -6.883267 110.418593 -6.939591 110.540628 -6.883267 110.639195 -6.707255 110.704907 -6.608688 110.737762 -6.477265 110.859798 -6.376351 111.002955 -6.388085 111.103869 -6.554711 111.235291 -6.662665 111.411304 -6.662665 111.566195 -6.575832 111.655375 -6.641543 111.753942 -6.662665 111.864243 -6.730723 111.986279 -6.763579 112.051990 -6.796435 112.051990 -6.796435 112.117701 -6.838678 112.117701 -6.838678 112.162291 -6.838678 112.251471 -6.829290 112.427484 -6.829290 112.570641 -6.906736 112.659820 -7.049893 112.713798 -7.169581 112.847567 -7.268148 112.880423 -7.444161 112.892157 -7.566196 113.056435 -7.653029 113.267651 -7.709353 113.455397 -7.697619 113.640797 -7.664764 113.840278 -7.676498 114.084349 -7.631908 114.293218 -7.664764 114.436375 -7.775065 114.448109 -8.016789 114.415253 -8.213923 114.391785 -8.389936 114.436375 -8.509624 114.504433 -8.608191 114.558410 -8.793591 114.469230 -8.751348 114.370663 -8.629313 114.084349 -8.554214 113.753446 -8.476768 113.464785 -8.357080 113.211327 -8.279634 112.978990 -8.357080 112.725532 -8.422791 112.493195 -8.378201 112.284327 -8.291369 112.206881 -8.267900 112.185760 -8.267900 112.150557 -8.256166 # -b 117.583480 0.007041 117.527156 -0.159585 117.517769 -0.370800 117.517769 -0.481101 117.383999 -0.647726 117.273698 -0.912919 117.142275 -1.180458 116.975650 -1.314228 116.898205 -1.269638 116.787903 -1.401061 116.633012 -1.511362 116.489855 -1.645131 116.325577 -1.767167 116.358433 -1.823491 116.457000 -1.856347 116.489855 -2.022972 116.489855 -2.154395 116.590769 -2.198985 116.689336 -2.255309 116.656481 -2.398466 116.590769 -2.597946 116.489855 -2.532235 116.435878 -2.586212 116.412410 -2.809162 116.346698 -2.964053 116.257519 -2.975787 116.236397 -3.062620 116.248131 -3.151800 116.224663 -3.217511 116.170686 -3.240979 116.104974 -3.318425 116.081506 -3.428726 116.048650 -3.539027 115.982939 -3.571883 115.905493 -3.637594 115.828048 -3.693918 115.771724 -3.705653 115.762336 -3.705653 115.684891 -3.759630 115.574590 -3.815954 115.419698 -3.881665 115.253073 -3.959111 115.100529 -4.036556 114.901048 -4.125736 114.746157 -4.170326 114.725035 -4.092880 114.701567 -3.970845 114.680445 -3.827688 114.656977 -3.715040 114.603000 -3.550762 114.546676 -3.506172 114.469230 -3.485050 114.391785 -3.416992 114.326073 -3.363015 114.194651 -3.363015 114.084349 -3.363015 113.929458 -3.416992 113.762833 -3.440460 113.720590 -3.351281 113.697121 -3.196389 113.521109 -3.208124 113.366218 -3.196389 113.255916 -3.130678 113.166737 -3.062620 113.068170 -3.029764 113.023580 -3.086088 113.044701 -3.184655 112.892157 -3.285569 112.648086 -3.384136 112.516663 -3.395870 112.406362 -3.372402 112.317182 -3.363015 112.218615 -3.395870 112.185760 -3.416992 112.150557 -3.428726 112.040256 -3.440460 112.040256 -3.440460 112.007400 -3.461582 111.962810 -3.485050 111.920567 -3.485050 111.908833 -3.473316 111.908833 -3.372402 111.897099 -3.273835 111.875977 -3.151800 111.831388 -2.996908 111.777410 -2.853752 111.742208 -2.776306 111.688231 -2.863139 111.655375 -2.907729 111.599051 -2.952319 111.545074 -2.931197 111.423038 -2.898341 111.333859 -2.919463 111.235291 -2.996908 111.157846 -3.029764 110.993567 -3.041498 110.892654 -3.008643 110.782352 -3.018030 110.716641 -3.029764 110.639195 -2.964053 110.528894 -2.886607 110.463183 -2.940584 110.329413 -2.952319 110.263702 -2.698860 110.263702 -2.541622 110.275436 -2.520501 110.209724 -2.431321 110.165135 -2.288164 110.132279 -2.145007 110.120545 -2.067562 110.021978 -1.856347 110.010244 -1.767167 110.054833 -1.710843 110.075955 -1.555952 110.043099 -1.347083 # -b 116.269253 -3.285569 116.292721 -3.273835 116.302108 -3.327812 116.334964 -3.440460 116.346698 -3.506172 116.358433 -3.628207 116.358433 -3.750243 116.367820 -3.804220 116.391288 -3.881665 116.367820 -3.914521 116.280987 -4.015435 116.191807 -4.024822 116.158952 -3.914521 116.137830 -3.771364 116.126096 -3.604739 116.126096 -3.527293 116.147217 -3.416992 116.170686 -3.339546 116.215276 -3.294957 116.257519 -3.262101 116.269253 -3.285569 # -b 120.033576 -8.817060 119.923275 -8.805325 119.878685 -8.751348 119.857564 -8.596457 119.878685 -8.488503 # -b 120.134490 -10.063229 119.913888 -9.943540 119.681551 -9.779262 119.460949 -9.790996 119.240346 -9.767528 119.094842 -9.593862 119.094842 -9.450705 119.216878 -9.396728 119.371769 -9.363872 119.547781 -9.352138 119.669817 -9.342751 119.824708 -9.363872 119.902154 -9.352138 # -b 117.109420 -8.411057 117.142275 -8.389936 117.285432 -8.357080 117.473179 -8.389936 117.628070 -8.432179 117.782961 -8.554214 117.848673 -8.641047 117.935506 -8.685637 118.024685 -8.685637 118.102131 -8.641047 118.245288 -8.608191 118.224166 -8.530746 118.036420 -8.432179 117.893263 -8.312490 117.848673 -8.148212 117.980096 -8.070766 118.146721 -8.169333 118.278144 -8.324224 118.411913 -8.312490 118.587926 -8.267900 118.709961 -8.357080 118.721695 -8.497890 118.796794 -8.411057 118.930564 -8.267900 119.029131 -8.411057 119.118311 -8.497890 119.130045 -8.619925 119.205144 -8.685637 119.094842 -8.718493 118.942298 -8.673903 118.918830 -8.718493 118.930564 -8.793591 118.686493 -8.826447 118.510480 -8.772470 118.489359 -8.685637 118.224166 -8.826447 117.958974 -8.903892 117.705516 -9.002460 117.473179 -9.035315 117.285432 -9.079905 117.064830 -9.068171 116.909939 -9.002460 116.853615 -8.892158 116.853615 -8.751348 116.832493 -8.619925 116.963916 -8.530746 117.064830 -8.488503 117.109420 -8.411057 # -b 116.104974 -8.455647 116.158952 -8.389936 116.236397 -8.345346 116.367820 -8.223310 116.567301 -8.213923 116.722192 -8.312490 116.743313 -8.521358 116.665868 -8.718493 116.656481 -8.903892 116.534445 -8.936748 116.334964 -8.936748 116.104974 -8.936748 115.959471 -8.871037 115.959471 -8.739614 116.081506 -8.685637 116.104974 -8.575336 116.104974 -8.455647 # -b 115.044205 -8.091888 115.088795 -8.091888 115.220217 -8.037910 115.398577 -8.082500 115.574590 -8.169333 115.673157 -8.300756 115.684891 -8.443913 115.530000 -8.521358 115.375109 -8.619925 115.264807 -8.817060 115.231952 -8.718493 115.100529 -8.530746 114.955025 -8.411057 114.802481 -8.389936 114.668711 -8.366467 114.579531 -8.300756 114.558410 -8.124743 114.603000 -8.049644 114.779012 -8.070766 114.912782 -8.070766 114.966759 -8.091888 115.023083 -8.091888 115.044205 -8.091888 # -b 112.802977 -6.927857 112.868689 -6.939591 113.002458 -6.862146 113.145615 -6.850412 113.399073 -6.862146 113.598554 -6.862146 113.807423 -6.873880 113.974048 -6.850412 114.072615 -7.049893 113.974048 -7.092136 113.762833 -7.136726 113.509375 -7.223559 113.300506 -7.193050 113.124494 -7.181315 112.946134 -7.157847 112.835833 -7.103870 112.802977 -7.014690 112.802977 -6.927857 # -b 115.297663 -6.784700 115.309397 -6.772966 115.541734 -6.772966 115.607445 -6.817556 115.619179 -6.895002 115.518266 -6.948979 115.398577 -7.005303 115.297663 -6.873880 115.297663 -6.784700 # -b 120.155612 -5.615976 119.923275 -5.672301 119.681551 -5.648832 119.526660 -5.571387 119.416359 -5.296807 119.460949 -5.141916 119.470336 -5.120794 119.547781 -4.921313 119.571250 -4.688977 119.625227 -4.358073 119.690938 -4.060025 119.636961 -3.947377 119.580637 -3.661063 119.547781 -3.461582 119.317792 -3.473316 119.106576 -3.506172 118.951685 -3.262101 118.918830 -3.018030 118.918830 -2.842017 118.930564 -2.663658 119.130045 -2.421934 119.249733 -2.109805 119.383503 -1.856347 119.371769 -1.591154 119.371769 -1.302493 119.470336 -1.103013 119.580637 -0.903532 119.714407 -0.769762 119.803586 -0.603137 119.845830 -0.781496 119.890419 -0.570281 119.878685 -0.183053 119.747262 -0.037549 119.791852 -0.049284 # -b 103.838067 0.072752 103.739500 -0.037549 103.596343 -0.171319 103.650320 -0.227643 103.772356 -0.248765 103.727766 -0.382534 103.596343 -0.492835 103.528285 -0.668848 103.617465 -0.802618 103.805211 -0.936387 103.960103 -1.002099 104.103259 -0.990364 104.269885 -1.046688 104.457632 -1.058423 104.556199 -1.257904 104.600789 -1.424529 104.612523 -1.600542 104.654766 -1.746045 104.621910 -1.877468 104.732211 -1.889202 104.898837 -1.966648 105.009138 -2.076949 104.931692 -2.264696 104.898837 -2.344488 105.041994 -2.309286 105.208619 -2.353876 105.372897 -2.344488 105.539523 -2.365610 105.727269 -2.431321 105.769512 -2.553357 105.891548 -2.698860 105.968993 -2.853752 106.102763 -2.975787 106.145006 -3.140065 106.102763 -3.306691 105.992462 -3.571883 105.968993 -3.726774 106.025317 -3.771364 106.046439 -3.881665 105.992462 -4.092880 105.968993 -4.224303 105.947872 -4.412050 105.968993 -4.566941 105.968993 -4.733566 105.968993 -4.909579 105.968993 -5.097326 105.968993 -5.273339 105.947872 -5.461085 105.924404 -5.606589 105.882161 -5.782602 105.781247 -5.791989 105.694414 -5.726278 105.581766 -5.615976 105.429221 -5.505675 105.372897 -5.561999 105.340042 -5.726278 105.218006 -5.759133 105.030259 -5.615976 104.865981 -5.505675 104.732211 -5.529144 104.800270 -5.660566 104.865981 -5.815457 104.776801 -5.860047 104.577320 -5.693422 104.445897 -5.550265 104.291006 -5.418842 104.147849 -5.285073 104.025814 -5.109060 103.894391 -4.965903 103.718379 -4.864989 103.605730 -4.843868 103.429718 -4.688977 103.265439 -4.522351 103.087080 -4.412050 102.967391 -4.334604 102.789032 -4.191448 102.601285 -4.114002 102.469862 -3.937989 102.404151 -3.705653 102.303237 -3.571883 102.094369 -3.440460 101.918356 -3.250367 101.784586 -3.086088 101.620308 -2.898341 101.498272 -2.741103 101.364503 -2.597946 101.221346 -2.464177 101.089923 -2.321020 101.012478 -2.198985 101.000743 -2.076949 100.979622 -1.877468 100.845852 -1.600542 100.669840 -1.269638 100.571273 -1.091278 100.538417 -0.868329 100.371792 -0.626605 100.261490 -0.537425 100.139455 -0.382534 100.029154 -0.305089 # -b 104.445897 -0.481101 104.424776 -0.415390 104.478753 -0.370800 104.556199 -0.349678 104.678234 -0.513957 104.654766 -0.558547 104.654766 -0.591402 104.544464 -0.603137 104.490487 -0.570281 104.645378 -0.359066 104.687621 -0.427124 104.699356 -0.471714 104.445897 -0.481101 # -b 105.262596 -1.889202 105.318920 -1.877468 105.396366 -1.800023 105.429221 -1.722577 105.295452 -1.922058 105.450343 -1.624010 105.516054 -1.567686 105.616968 -1.534830 105.727269 -1.567686 105.748391 -1.668600 105.769512 -1.710843 105.846958 -1.710843 105.870426 -1.689721 105.870426 -1.591154 105.915016 -1.490240 106.025317 -1.490240 106.091029 -1.656866 106.189596 -1.811757 106.245920 -2.088683 106.311631 -2.276430 106.400811 -2.398466 106.511112 -2.454790 106.609679 -2.508767 106.698859 -2.520501 106.809160 -2.508767 106.785692 -2.663658 106.752836 -2.797427 106.741102 -2.919463 106.785692 -3.018030 106.752836 -3.041498 106.687125 -3.062620 106.565090 -2.952319 106.389077 -2.874873 106.222452 -2.809162 106.112150 -2.708248 106.046439 -2.553357 106.058173 -2.443055 105.980728 -2.288164 105.882161 -2.145007 105.760125 -2.088683 105.649824 -2.022972 105.527788 -2.011238 105.396366 -1.978382 105.318920 -1.954914 105.295452 -1.922058 105.262596 -1.889202 # -b 107.790137 -2.541622 107.822993 -2.508767 107.912173 -2.508767 108.034208 -2.532235 108.132775 -2.597946 108.243077 -2.642536 108.341644 -2.752838 108.353378 -2.907729 108.332256 -3.041498 108.231342 -3.151800 108.123388 -3.196389 108.043596 -3.086088 107.956763 -3.130678 107.801872 -3.140065 107.736160 -3.086088 107.691570 -2.952319 107.679836 -2.820896 107.691570 -2.719982 107.736160 -2.630802 107.757282 -2.576825 107.790137 -2.541622 # -b 110.010244 -7.763331 109.876474 -7.742209 109.756785 -7.709353 109.634750 -7.697619 109.545570 -7.709353 109.425882 -7.676498 109.280378 -7.653029 109.193545 -7.676498 109.127833 -7.718741 109.038654 -7.709353 108.982330 -7.643642 108.806317 -7.643642 108.707750 -7.742209 108.618570 -7.784452 108.552859 -7.784452 108.442558 -7.763331 108.275932 -7.730475 108.067064 -7.685885 107.912173 -7.643642 107.691570 -7.533341 107.447500 -7.488751 107.217510 -7.488751 107.062619 -7.477017 106.874872 -7.423040 106.764571 -7.357328 106.642535 -7.312738 106.553355 -7.291617 106.478257 -7.223559 106.520500 -7.157847 106.642535 -7.005303 106.621414 -6.981835 106.466522 -6.972447 106.245920 -6.883267 106.102763 -6.829290 105.924404 -6.829290 105.769512 -6.817556 105.649824 -6.772966 105.560644 -6.763579 105.450343 -6.751845 105.384631 -6.674399 105.340042 -6.641543 105.340042 -6.629809 105.340042 -6.620422 105.351776 -6.531242 105.372897 -6.596954 105.417487 -6.608688 105.483199 -6.662665 105.593500 -6.662665 105.703801 -6.596954 105.760125 -6.465531 105.846958 -6.465531 105.947872 -6.322374 105.992462 -6.167483 106.067560 -5.991470 106.168474 -5.946880 106.299897 -5.914025 106.478257 -5.946880 106.731715 -5.979736 106.940583 -6.024326 107.083740 -5.946880 107.184654 -5.902290 107.393522 -5.902290 107.503824 -6.024326 107.560148 -6.167483 107.736160 -6.190951 107.891051 -6.167483 108.144510 -6.244928 108.320522 -6.266050 108.442558 -6.388085 108.564593 -6.498386 108.707750 -6.763579 108.794583 -6.772966 108.904884 -6.796435 108.994064 -6.784700 109.104365 -6.784700 109.202932 -6.796435 109.324968 -6.796435 109.468125 -6.805822 109.590160 -6.784700 109.810763 -6.829290 109.944532 -6.838678 # -b 110.043099 -1.347083 109.986775 -1.201580 109.899942 -1.034954 109.810763 -0.891797 109.766173 -0.781496 109.688727 -0.692316 109.623016 -0.659461 109.512714 -0.626605 109.414147 -0.513957 109.315580 -0.525691 109.238135 -0.459980 109.202932 -0.248765 109.202932 -0.082139 # -b 100.029154 -0.305089 99.963442 -0.147851 # -b 98.836961 -0.936387 98.902673 -0.912919 99.024708 -0.891797 99.069298 -0.948121 99.102154 -1.124134 99.235923 -1.401061 99.334490 -1.523096 99.411936 -1.624010 99.379080 -1.710843 99.245311 -1.755433 99.135010 -1.710843 99.015321 -1.624010 98.902673 -1.469119 98.804106 -1.257904 98.771250 -1.124134 98.771250 -1.079544 98.804106 -1.002099 98.836961 -0.936387 # -b 55.275008 -4.569288 55.286742 -4.569288 55.286742 -4.524698 55.275008 -4.569288 # -b 43.137177 0.192440 42.860250 -0.161932 42.806273 -0.150197 42.529346 -0.272233 42.606792 -0.161932 42.618526 -0.194787 42.639647 -0.361413 42.541080 -0.384881 42.487103 -0.560894 42.308744 -0.748640 42.123344 -0.971590 42.001308 -1.126481 41.869886 -1.304840 41.792440 -1.347083 # -b 41.792440 -1.347083 41.682139 -1.635744 41.506126 -1.846959 41.351235 -1.924405 41.196344 -1.957260 41.074308 -1.957260 40.987476 -2.067562 40.886562 -2.201331 40.877174 -2.377344 40.677693 -2.478258 40.435969 -2.600293 40.292812 -2.853752 40.248222 -3.175268 40.093331 -3.508519 # -b 46.443867 -9.417849 46.488457 -9.396728 46.357034 -9.396728 46.300710 -9.483561 46.443867 -9.495295 46.577637 -9.408462 46.443867 -9.417849 # -b 34.151145 -0.938734 34.061965 -1.025567 34.061965 -1.025567 34.007988 -1.147602 34.061965 -1.269638 34.040844 -1.325962 33.942276 -1.304840 33.918808 -1.403407 33.909421 -1.469119 33.808507 -1.492587 33.799120 -1.581767 33.742795 -1.635744 33.698206 -1.703802 33.677084 -1.781248 33.555049 -1.781248 33.501071 -1.835225 33.555049 -1.891549 33.468216 -1.957260 33.379036 -2.013585 33.346180 -2.067562 33.411892 -2.091030 33.501071 -2.145007 33.611373 -2.145007 33.698206 -2.135620 33.766264 -2.123886 33.808507 -2.201331 33.787385 -2.245921 33.599639 -2.400812 33.444747 -2.454790 33.146699 -2.466524 33.071601 -2.489992 33.015277 -2.666005 33.027011 -2.799774 32.904975 -2.898341 32.872120 -2.698860 32.860385 -2.532235 32.782940 -2.522848 32.672639 -2.588559 32.562337 -2.511114 32.386325 -2.311633 32.299492 -2.257655 32.198578 -2.377344 32.231434 -2.532235 32.123479 -2.543969 32.055421 -2.666005 32.055421 -2.677739 32.001444 -2.698860 31.912264 -2.755184 31.825431 -2.588559 31.834819 -2.454790 31.813697 -2.356222 31.769107 -2.201331 31.747986 -2.046440 31.747986 -1.868081 31.769107 -1.659212 31.846553 -1.415142 31.858287 -1.236782 31.870021 -1.049035 31.780841 -0.894144 # -b 29.861130 -6.388085 30.060611 -6.510121 30.260092 -6.608688 30.445492 -6.796435 30.588649 -6.960713 30.612117 -7.127338 30.600383 -7.369062 30.677829 -7.577931 30.755274 -7.786799 30.877310 -8.005055 30.964143 -8.225657 31.029854 -8.324224 31.163624 -8.554214 # -b 34.040844 -9.692429 34.052578 -9.614984 34.184000 -9.561006 34.404603 -9.746406 34.559494 -9.997518 # -b 34.040844 -9.692429 34.073699 -9.887216 # -b 29.994900 -7.237640 30.236624 -7.312738 30.412636 -7.533341 30.480695 -7.873632 30.579262 -8.148212 # -b 30.633239 -8.235044 30.612117 -8.279634 30.588649 -8.399323 30.612117 -8.554214 30.677829 -8.587070 30.809252 -8.608191 31.008733 -8.772470 31.163624 -8.554214 # -b 34.019722 0.114995 34.007988 -0.028162 34.073699 -0.105608 34.139411 -0.194787 34.195735 -0.349678 34.315423 -0.328557 34.437459 -0.272233 34.625205 -0.239377 34.812952 -0.251111 34.812952 -0.340291 34.604084 -0.417737 34.449193 -0.539772 34.249712 -0.539772 34.106555 -0.783843 34.151145 -0.938734 # -b 32.419180 0.103261 32.332348 -0.028162 32.156335 -0.096220 31.956854 -0.140810 31.945120 -0.239377 31.980322 -0.349678 31.902877 -0.506916 31.813697 -0.706397 31.769107 -0.804964 31.759720 -0.849554 31.780841 -0.894144 # -b 40.093331 -3.508519 39.872729 -3.893399 39.753040 -4.226650 39.586415 -4.524698 39.332957 -4.646734 # -b 39.929053 -5.087939 39.961909 -4.888458 39.950174 -4.956516 39.929053 -5.055083 39.950174 -5.209974 39.872729 -5.418842 39.774162 -5.341397 39.795283 -5.109060 39.785896 -4.888458 39.839873 -4.921313 39.905585 -4.888458 39.917319 -4.998759 39.929053 -5.087939 # -b 39.386934 -5.761480 39.443258 -5.815457 39.431524 -5.738012 39.431524 -5.916371 39.464380 -6.125240 39.520704 -6.202685 39.574681 -6.212073 39.607536 -6.334108 39.631005 -6.432675 39.553559 -6.388085 39.454992 -6.301252 39.386934 -6.256662 39.344691 -6.026673 39.332957 -5.892903 39.386934 -5.761480 # -b 39.332957 -4.646734 39.332957 -4.733566 39.300101 -4.855602 39.267245 -4.998759 39.189800 -5.287420 39.133476 -5.397721 39.067764 -5.639445 38.948076 -5.949227 38.891752 -6.080650 38.912873 -6.280131 38.948076 -6.388085 39.112354 -6.510121 39.234390 -6.587566 39.344691 -6.742457 39.497235 -6.873880 39.619271 -7.094483 39.619271 -7.169581 39.565293 -7.204784 39.476114 -7.336207 39.454992 -7.554462 39.422136 -7.676498 39.476114 -7.786799 39.476114 -7.873632 39.497235 -7.983933 39.476114 -8.159946 39.365812 -8.169333 39.332957 -8.300756 39.377547 -8.476768 39.476114 -8.706758 39.565293 -8.784204 39.565293 -8.828794 39.497235 -8.882771 39.541825 -8.936748 39.598149 -9.035315 39.642739 -9.091639 39.741306 -9.244184 39.753040 -9.342751 39.729572 -9.474173 39.828139 -9.561006 39.872729 -9.668961 39.872729 -9.790996 39.929053 -9.856708 39.929053 -9.997518 # -b 29.696852 -4.381541 29.696852 -4.480108 29.685118 -4.712445 29.708586 -5.010493 29.786031 -5.076204 29.851743 -5.177118 29.840009 -5.439964 29.884599 -5.684035 29.962044 -5.916371 29.905720 -6.036060 29.795419 -6.146361 29.861130 -6.388085 # -b 29.333092 -3.386483 29.410538 -3.407605 29.443394 -3.541374 29.464515 -3.729121 29.464515 -3.949724 29.497371 -4.116349 29.586550 -4.271240 29.696852 -4.381541 # -b 29.333092 -3.386483 29.288502 -3.473316 29.255647 -3.661063 29.178201 -3.928602 29.157080 -4.137470 29.166467 -4.247772 29.243913 -4.193794 29.276768 -4.390929 29.166467 -4.789890 29.157080 -5.087939 29.267381 -5.418842 29.387069 -5.660566 29.377682 -5.881169 29.333092 -6.113506 29.398804 -6.411554 29.497371 -6.542976 29.619406 -6.841024 29.750829 -7.005303 29.994900 -7.237640 # -b 13.290127 -10.018639 13.191560 -9.734672 13.125849 -9.450705 13.060137 -9.187860 13.060137 -9.068171 13.146970 -8.948482 13.280740 -8.817060 13.290127 -8.673903 13.280740 -8.509624 13.215029 -8.258513 13.158705 -8.192801 13.092993 -8.082500 13.015548 -7.861898 12.949836 -7.631908 12.884125 -7.413652 12.839535 -7.193050 12.783211 -7.049893 12.663522 -6.895002 12.541487 -6.730723 12.452307 -6.566445 12.342006 -6.411554 12.288029 -6.301252 12.288029 -6.247275 # -b 12.288029 -6.247275 12.266907 -6.169830 12.309150 -6.059528 12.299763 -5.916371 12.222317 -5.838926 # -b 12.222317 -5.838926 12.133138 -5.728625 12.100282 -5.594855 12.112016 -5.418842 12.067426 -5.165384 11.968859 -5.066817 # -b 11.968859 -5.066817 11.924269 -4.965903 11.846824 -4.801625 11.790500 -4.646734 11.682545 -4.503577 11.537041 -4.369807 11.417353 -4.247772 11.295317 -4.071759 11.074715 -3.970845 # -b 11.074715 -3.970845 11.041859 -3.916868 10.952680 -3.717387 10.767280 -3.541374 10.523209 -3.264448 10.302606 -3.064967 10.072616 -2.886607 # -b 10.072616 -2.886607 9.873135 -2.710595 9.729978 -2.489992 9.563353 -2.278777 9.366219 -2.034706 9.244184 -1.924405 9.166738 -1.746045 9.068171 -1.492587 8.990725 -1.248516 8.903892 -1.070157 8.814713 -0.870676 8.749001 -0.760375 8.826447 -0.748640 8.957870 -0.694663 9.068171 -0.539772 9.199594 -0.429471 9.232449 -0.194787 # -b -40.062822 -19.779126 -39.931400 -19.664132 -39.821098 -19.537402 -39.743653 -19.361390 -39.731919 -19.173643 -39.731919 -18.974162 -39.731919 -18.762947 -39.731919 -18.523570 -39.699063 -18.324089 -39.623964 -18.122261 -39.513663 -18.007266 -39.358772 -17.859415 -39.260205 -17.702177 -39.269592 -17.596570 -39.293061 -17.436985 -39.269592 -17.237504 -39.260205 -17.035676 -39.269592 -16.993433 -39.225002 -16.854970 -39.149904 -16.632021 -39.126435 -16.430193 -39.126435 -16.291729 -39.081845 -16.165000 -39.039602 -16.089902 -39.016134 -15.897461 -39.016134 -15.770732 -39.072458 -15.665124 -39.114701 -15.536049 -39.114701 -15.428094 -39.114701 -15.259122 -39.114701 -15.118312 -39.114701 -14.991583 -39.126435 -14.979849 -39.138169 -14.883628 -39.159291 -14.775674 -39.159291 -14.594968 -39.126435 -14.336816 -39.114701 -14.123254 -39.105314 -13.886223 -39.072458 -13.724292 -39.016134 -13.712558 -39.016134 -13.541239 -39.016134 -13.369920 -39.016134 -13.271353 -38.872977 -13.121155 -38.685230 -12.926368 -38.619519 -12.926368 -38.586663 -13.046056 -38.455240 -12.980345 -38.309737 -12.872391 -38.178314 -12.698725 -38.046891 -12.527406 -37.936590 -12.342006 -37.838023 -12.191808 -37.760577 -12.039264 -37.692519 -11.910188 -37.593952 -11.703667 -37.572830 -11.670811 -37.539975 -11.583978 -37.450795 -11.464290 -37.295904 -11.215525 # -b -37.295904 -11.215525 -37.183256 -11.133386 -37.101117 -11.067674 -37.028365 -10.999616 -37.016630 -10.978495 -36.929798 -10.837685 -36.643484 -10.661672 -36.509714 -10.586573 -36.300846 -10.368318 -36.157689 -10.150062 # -b -40.250569 -20.185129 -40.184858 -19.964526 -40.152002 -19.861266 -40.062822 -19.779126 # -b -70.097618 -15.406973 -69.975583 -15.343608 -69.898137 -15.334221 -69.820692 -15.205145 -69.710391 -15.334221 -69.567234 -15.439828 -69.456932 -15.514927 -69.370100 -15.599413 -69.236330 -15.665124 -69.170619 -15.791854 -69.006340 -15.812975 -68.806859 -15.824709 -68.752882 -15.876340 -68.863183 -15.972560 -68.905426 -16.026537 -68.795125 -16.111023 -68.675436 -16.195509 -68.684824 -16.378562 -68.785738 -16.333972 -68.851449 -16.409071 -69.006340 -16.451314 -69.137763 -16.345707 -69.215208 -16.240099 -69.346631 -16.195509 -69.480401 -16.111023 -69.546112 -16.005416 -69.644679 -15.909195 -69.766715 -15.812975 -69.865282 -15.791854 -69.886403 -15.812975 # -b -77.769423 -11.126345 -77.748301 -11.159201 -77.715445 -11.269502 -77.715445 -11.323479 -77.703711 -11.365723 -77.703711 -11.422047 -77.638000 -11.508879 -77.483109 -11.583978 -77.363420 -11.745910 -77.262506 -11.985287 -77.175673 -12.191808 -77.041904 -12.320884 -76.943337 -12.503938 -76.865891 -12.623626 -76.746202 -12.797292 -76.645288 -12.959224 -76.567843 -13.100034 -76.436420 -13.238497 -76.347240 -13.454406 -76.281529 -13.637459 -76.314385 -13.811125 -76.481010 -13.982444 -76.424686 -14.165497 -76.260408 -14.327428 -76.150106 -14.465892 -76.051539 -14.627823 -75.929504 -14.766287 -75.786347 -14.829651 -75.619722 -14.970461 -75.455443 -15.141780 -75.312286 -15.301365 -75.169129 -15.418707 -74.993117 -15.557170 -74.772514 -15.641656 -74.584767 -15.782466 -74.429876 -15.834097 -74.164684 -15.972560 -74.066117 -16.089902 -74.033261 -16.132145 -73.988671 -16.143879 -73.878370 -16.186122 -73.702357 -16.249486 -73.514610 -16.345707 -73.294008 -16.430193 -73.085140 -16.514679 -72.841069 -16.632021 -72.589957 -16.707119 -72.378742 -16.854970 -72.181608 -17.002821 -71.916416 -17.141284 -71.716935 -17.237504 -71.573778 -17.427598 -71.409499 -17.575448 -71.320320 -17.702177 -71.144307 -17.859415 -70.879115 -18.058896 -70.726570 -18.164504 -70.581067 -18.248990 -70.581067 -18.260724 # -b -70.581067 -18.260724 -70.571679 -18.260724 -70.527089 -18.354598 -70.473112 -18.532957 -70.437910 -18.744172 -70.405054 -18.974162 -70.362811 -19.192418 -70.339342 -19.434142 -70.339342 -19.579645 -70.327608 -19.673519 -70.261897 -19.830757 # -b -70.041294 -15.599413 -70.074150 -15.590026 -70.074150 -15.568904 -70.097618 -15.451562 -70.097618 -15.406973 # -b -69.886403 -15.812975 -70.031907 -15.803588 -70.053029 -15.686246 -70.041294 -15.599413 # -b -78.229402 -9.985783 -78.196546 -10.117206 -78.142569 -10.227507 -78.065124 -10.380052 -77.975944 -10.509128 -77.856255 -10.685140 -77.832787 -10.901049 -77.809319 -10.999616 -77.783504 -11.072368 -77.769423 -11.126345 # -b -149.453502 -17.568408 -149.420646 -17.547286 -149.444114 -17.655241 -149.444114 -17.697484 -149.387790 -17.727993 -149.289223 -17.791357 -149.354934 -17.918086 -149.420646 -17.770236 -149.575537 -17.770236 -149.674104 -17.643506 -149.674104 -17.505043 -149.554415 -17.537899 -149.453502 -17.568408 # -b -145.639894 -17.326684 -145.628160 -17.336071 -145.562449 -17.399436 -145.541327 -17.495656 -145.628160 -17.505043 -145.672750 -17.390048 -145.693872 -17.293828 -145.639894 -17.326684 -145.672750 -17.390048 -145.693872 -17.293828 -145.639894 -17.326684 # -b -145.121244 -16.073474 -145.121244 -16.042965 # -b -146.433125 -14.428342 -146.510570 -14.449464 -146.522304 -14.449464 -146.522304 -14.503441 -146.531692 -14.578540 -146.465980 -14.557418 -146.367413 -14.440077 -146.433125 -14.428342 # -b -146.113955 -14.374365 -146.179667 -14.395487 -146.200788 -14.440077 -146.191401 -14.503441 -146.113955 -14.491707 -146.024775 -14.395487 -146.036510 -14.353244 -146.113955 -14.374365 # -b -140.336047 -15.988988 -140.303191 -15.925623 -140.303191 -15.946745 -140.347781 -16.000722 -140.357169 -16.042965 -140.282070 -16.031231 -140.249214 -15.935011 -140.270336 -15.913889 -140.336047 -15.988988 # -b -140.589505 -19.678213 -140.568384 -19.689947 -140.523794 -19.638316 -140.535528 -19.596073 -140.568384 -19.605461 -140.577771 -19.617195 # -b -145.067267 -19.814329 -145.121244 -19.804942 -145.132978 -19.814329 -145.165834 -19.877694 -145.142365 -19.929324 -145.076654 -19.898815 -145.067267 -19.814329 # -b -150.005008 -17.568408 -149.993274 -17.589529 -149.939296 -17.559020 -149.918175 -17.495656 -149.960418 -17.483922 # -b -151.626671 -16.744669 -151.636058 -16.732934 -151.570347 -16.723547 -151.516370 -16.754056 -151.483514 -16.829155 -151.504635 -16.880785 -151.582081 -16.838542 -151.626671 -16.744669 # -b -150.005008 -17.505043 -150.005008 -17.568408 # -b -149.960418 -17.483922 -150.005008 -17.505043 # -b -160.908404 -10.368318 -160.896670 -10.323728 -160.854427 -10.347196 -160.809837 -10.389439 -160.809837 -10.422295 -160.875548 -10.434029 -160.908404 -10.401173 -160.908404 -10.368318 # -b -172.827979 -13.470834 -172.673088 -13.491955 -172.518197 -13.515424 -172.452486 -13.599910 -172.375040 -13.707864 -172.386774 -13.869796 -172.452486 -13.836940 -172.518197 -13.806431 -172.628498 -13.827553 -172.762268 -13.815818 -172.872569 -13.740720 -172.959402 -13.611644 -173.036848 -13.557667 -173.093172 -13.470834 -173.081438 -13.461446 -173.048582 -13.491955 -172.938281 -13.482568 -172.827979 -13.470834 # -b -171.945569 -13.848674 -171.879858 -13.848674 -171.802412 -13.869796 -171.757823 -13.881530 -171.724967 -13.935507 -171.626400 -13.944894 -171.605278 -14.031727 -171.680377 -14.052849 -171.879858 -14.062236 -171.978425 -14.041115 -172.055871 -14.031727 -172.133316 -14.041115 -172.231883 -13.977750 -172.276473 -13.890917 -172.210762 -13.827553 -172.112195 -13.836940 -172.034749 -13.836940 -171.945569 -13.848674 # -b -170.016471 -18.969468 -170.016471 -18.884982 -170.004737 -18.978856 -170.004737 -19.084463 -170.016471 -19.126706 -170.093916 -19.105585 -170.115038 -18.957734 -170.093916 -18.894370 -170.037592 -18.873248 -170.016471 -18.969468 # -b 177.789189 -17.420557 177.810310 -17.432291 177.878369 -17.420557 177.965201 -17.378314 178.030913 -17.357193 178.066115 -17.420557 178.108358 -17.453413 178.176417 -17.526165 178.286718 -17.537899 178.352429 -17.612998 178.385285 -17.706871 178.394672 -17.727993 178.418141 -17.864109 178.450996 -18.033081 178.429875 -18.117567 178.319574 -18.117567 178.176417 -18.129301 178.066115 -18.223175 177.965201 -18.244296 177.866634 -18.244296 177.777455 -18.232562 177.678888 -18.223175 177.580321 -18.223175 177.523996 -18.150423 177.437164 -18.129301 177.404308 -18.129301 177.249417 -18.117567 177.160237 -18.033081 177.127381 -17.906352 177.171971 -17.791357 177.204827 -17.655241 177.303394 -17.568408 177.437164 -17.462800 177.514609 -17.441679 177.589708 -17.420557 177.700009 -17.441679 177.789189 -17.420557 # -b 178.749044 -16.467742 178.826490 -16.521719 178.826490 -16.509985 178.847611 -16.467742 178.969647 -16.413765 179.112804 -16.362135 179.277082 -16.308157 179.453095 -16.233059 179.598599 -16.202550 179.840323 -16.181428 179.783999 -16.254180 179.631454 -16.350400 179.509419 -16.446621 179.420239 -16.594471 179.387384 -16.660183 179.476563 -16.594471 179.607986 -16.509985 179.697166 -16.467742 179.697166 -16.573350 179.697166 -16.648448 179.730022 -16.765790 179.619720 -16.754056 179.488297 -16.754056 179.300551 -16.765790 179.157394 -16.786912 179.133925 -16.690691 179.079948 -16.660183 178.969647 -16.754056 178.903936 -16.913641 178.814756 -16.923028 178.725576 -16.901907 178.638743 -16.988739 178.504974 -16.880785 178.462731 -16.817421 178.352429 -16.786912 178.352429 -16.660183 178.516708 -16.627327 178.638743 -16.552228 178.749044 -16.467742 # -b 159.967323 -11.731829 160.089358 -11.731829 160.209047 -11.764685 160.307614 -11.839783 160.319348 -11.905495 160.209047 -11.896107 160.089358 -11.839783 # -b 166.444588 -14.728737 166.477444 -14.707616 166.510299 -14.740471 166.531421 -14.815570 166.531421 -14.867201 166.576011 -14.942299 166.599479 -15.029132 166.608866 -15.113618 166.632335 -15.179330 166.698046 -15.209838 166.775492 -15.167595 166.820081 -15.083109 166.852937 -15.008011 166.897527 -14.963421 166.939770 -15.017398 166.951504 -15.083109 166.963238 -15.125352 166.996094 -15.134740 167.007828 -15.179330 167.028950 -15.221573 167.040684 -15.275550 167.050071 -15.381157 167.073540 -15.477378 167.028950 -15.519621 166.930383 -15.531355 166.862324 -15.531355 166.752023 -15.594719 166.665190 -15.606454 166.599479 -15.435135 166.531421 -15.306059 166.510299 -15.083109 166.477444 -14.932912 166.456322 -14.803836 166.444588 -14.728737 # -b 167.061805 -15.871646 167.082927 -15.862259 167.150985 -15.871646 167.204962 -15.913889 167.237818 -15.979600 167.270674 -16.031231 167.315264 -16.042965 167.336385 -16.073474 167.392709 -16.139185 167.437299 -16.211937 167.503010 -16.254180 167.568722 -16.308157 167.589843 -16.341013 167.613312 -16.371522 167.634433 -16.437233 167.601578 -16.488864 167.524132 -16.488864 167.413831 -16.500598 167.294142 -16.500598 167.270674 -16.319891 167.237818 -16.148573 167.226084 -16.073474 167.172107 -16.064086 167.082927 -16.010109 167.061805 -15.925623 167.061805 -15.871646 # -b 168.031048 -15.477378 168.054517 -15.456256 168.054517 -15.510233 168.063904 -15.594719 168.099107 -15.702674 168.131962 -15.744917 168.131962 -15.808281 168.131962 -15.892767 168.099107 -15.913889 168.054517 -15.820016 168.031048 -15.679205 168.021661 -15.519621 168.031048 -15.477378 # -b 168.021661 -16.085208 168.054517 -16.052352 168.054517 -16.052352 168.054517 -16.139185 168.063904 -16.223671 168.108494 -16.287036 168.141350 -16.329279 168.054517 -16.350400 167.965337 -16.350400 167.878504 -16.308157 167.833914 -16.223671 167.833914 -16.190816 167.911360 -16.169694 167.965337 -16.106329 168.021661 -16.085208 # -b 168.307975 -17.547286 168.329096 -17.559020 168.373686 -17.589529 168.394808 -17.676362 168.406542 -17.770236 168.329096 -17.800744 168.251651 -17.800744 168.153084 -17.791357 168.087372 -17.727993 168.099107 -17.664628 168.153084 -17.589529 168.242264 -17.537899 168.307975 -17.547286 # -b 168.836013 -18.643258 168.836013 -18.622137 168.859481 -18.622137 168.946314 -18.654992 168.979170 -18.727744 168.969782 -18.748866 168.990904 -18.842739 169.014372 -18.936613 168.969782 -18.936613 168.868869 -18.842739 168.826625 -18.727744 168.836013 -18.643258 168.868869 -18.842739 168.826625 -18.727744 168.836013 -18.643258 # -b 169.101205 -19.366083 169.145795 -19.344962 169.157529 -19.375471 169.223241 -19.438835 169.256096 -19.481078 169.232628 -19.553830 169.211506 -19.605461 169.124674 -19.565564 169.080084 -19.490466 169.080084 -19.408327 169.101205 -19.366083 # -b 161.488072 -10.182918 161.466951 -10.171183 161.565518 -10.248629 161.675819 -10.258016 161.842444 -10.323728 162.009069 -10.380052 162.173348 -10.445763 162.239059 -10.574839 162.349361 -10.652285 162.384563 -10.727383 162.438540 -10.771973 162.349361 -10.847072 162.128758 -10.781361 161.931624 -10.694528 161.786120 -10.520862 161.642963 -10.445763 161.556130 -10.281485 161.488072 -10.194652 161.488072 -10.182918 # -b 165.728803 -10.804829 165.740537 -10.837685 165.749925 -10.781361 165.794515 -10.717996 165.850839 -10.652285 165.961140 -10.652285 166.071441 -10.706262 166.080828 -10.793095 165.993995 -10.825950 165.937671 -10.814216 165.839104 -10.879928 165.827370 -10.825950 165.782780 -10.825950 165.728803 -10.804829 # -b 159.979057 -11.839783 159.878143 -11.806928 159.910999 -11.776419 159.967323 -11.731829 # -b 160.089358 -11.839783 159.979057 -11.839783 # -b 151.375559 -9.964662 151.387294 -10.105472 151.244137 -10.117206 151.122101 -10.018639 # -b 149.953377 -9.898951 150.173980 -10.018639 150.328871 -10.096085 150.516618 -10.161796 150.669162 -10.171183 150.814666 -10.194652 150.978944 -10.227507 151.011800 -10.314340 150.824053 -10.368318 150.615185 -10.347196 150.481415 -10.356583 150.615185 -10.389439 150.770076 -10.499740 150.680896 -10.607695 150.439172 -10.685140 150.173980 -10.607695 150.117656 -10.488006 150.105922 -10.422295 # -b 139.866680 -17.718605 140.045039 -17.781970 140.275029 -17.730339 140.474510 -17.645853 140.781946 -17.549633 140.859391 -17.434638 140.915715 -17.169446 140.936837 -17.063838 141.058872 -16.840889 141.169174 -16.639061 141.213763 -16.458355 141.279475 -16.204897 141.356920 -15.841137 141.443753 -15.543089 141.544667 -15.329527 141.586910 -15.115965 141.554054 -14.848426 141.455487 -14.515175 141.488343 -14.235902 141.467222 -14.010606 141.443753 -13.656234 141.544667 -13.461446 141.610379 -13.311249 141.586910 -13.128196 141.586910 -13.008507 141.676090 -12.825454 141.697211 -12.651788 141.577523 -12.621279 141.554054 -12.621279 141.577523 -12.414758 141.654968 -12.090895 141.852103 -12.025183 141.929548 -11.863252 141.999953 -11.525307 142.225249 -11.255421 142.225249 -11.025431 142.225249 -10.999616 # -b 142.722778 -11.025431 142.722778 -11.048900 142.746247 -11.123999 142.767368 -11.264809 142.779102 -11.515920 142.779102 -11.752950 142.833080 -11.926616 143.032561 -11.926616 143.077150 -12.046305 143.065416 -12.165993 143.041948 -12.295069 143.152249 -12.393636 143.229695 -12.576689 143.318874 -12.642401 143.318874 -12.825454 143.330609 -12.891165 143.417442 -12.933408 143.462031 -13.203294 143.539477 -13.419203 143.539477 -13.560013 143.527743 -13.785310 143.593454 -13.935507 143.626310 -14.109173 143.703755 -14.289879 143.837525 -14.430689 144.001804 -14.494054 144.123839 -14.386099 144.234140 -14.313347 144.398419 -14.247636 144.553310 -14.280492 144.619021 -14.409568 144.675345 -14.559765 144.851358 -14.634864 144.994515 -14.806183 145.137672 -14.881282 145.304297 -15.029132 145.259707 -15.212185 145.313684 -15.317793 145.292563 -15.489112 145.280829 -15.651043 145.346540 -15.820016 145.358274 -15.970213 145.435720 -16.129798 145.447454 -16.310504 145.447454 -16.416112 145.501431 -16.617940 145.623467 -16.765790 145.733768 -16.925375 145.876925 -16.925375 145.909780 -17.148324 145.987226 -17.307909 146.052937 -17.498003 146.097527 -17.697484 146.097527 -17.878190 146.106915 -17.983798 146.074059 -18.108180 146.064672 -18.277152 146.106915 -18.467246 146.228950 -18.570506 146.318130 -18.591628 146.294661 -18.676114 146.350985 -18.612749 146.350985 -18.654992 146.318130 -18.730091 146.339251 -18.769987 146.339251 -18.875595 146.404963 -19.053954 146.649034 -19.126706 146.726479 -19.232314 146.902492 -19.305066 147.078504 -19.335575 147.254517 -19.389552 147.331963 -19.377818 147.430530 -19.305066 147.496241 -19.598420 147.564299 -19.743924 147.662866 -19.816676 147.761433 -19.795554 147.838879 -19.765045 147.982036 -19.858919 148.148661 -19.889428 # -b 142.225249 -10.999616 142.225249 -10.978495 142.246371 -10.957373 142.302695 -10.912783 142.401262 -10.891662 142.544419 -10.804829 142.621864 -10.706262 142.720432 -10.750852 142.720432 -10.847072 142.727472 -10.858806 142.743900 -10.924518 142.762675 -10.990229 142.727472 -10.999616 142.727472 -11.025431 # -b 150.105922 -10.422295 149.852463 -10.389439 149.622474 -10.356583 149.378403 -10.302606 149.157800 -10.281485 148.970053 -10.236895 148.848018 -10.204039 148.540583 -10.194652 148.385692 -10.161796 148.174476 -10.150062 147.986730 -10.051495 147.899897 -10.051495 # -b 129.923140 -13.581135 130.110886 -13.581135 130.230575 -13.461446 130.209453 -13.245537 130.066297 -13.257272 130.099152 -13.149317 130.110886 -12.977998 130.188332 -12.792598 130.352610 -12.750355 130.507502 -12.684644 130.540357 -12.543834 130.683514 -12.576689 130.805550 -12.651788 130.882995 -12.783211 130.904117 -12.651788 130.793815 -12.480469 130.859527 -12.447614 130.958094 -12.295069 131.068395 -12.327925 131.202165 -12.381902 131.223286 -12.285682 131.279610 -12.285682 131.434501 -12.327925 131.664491 -12.306803 131.840504 -12.349046 131.995395 -12.349046 132.159673 -12.295069 132.237119 -12.273948 132.347420 -12.231705 132.514046 -12.133138 132.502311 -11.938350 132.502311 -11.698973 132.392010 -11.591019 132.204263 -11.569897 132.061106 -11.602753 131.929684 -11.504186 131.840504 -11.396231 # -b 131.840504 -11.396231 131.676225 -11.330520 131.687960 -11.309398 131.741937 -11.297664 131.819382 -11.330520 131.852238 -11.255421 131.908562 -11.199097 131.950805 -11.264809 131.974273 -11.417353 132.007129 -11.525307 132.084575 -11.405619 132.084575 -11.255421 132.138552 -11.231953 132.171408 -11.231953 132.227732 -11.309398 132.314565 -11.297664 132.370889 -11.396231 132.448334 -11.483064 132.546901 -11.569897 132.600878 -11.602753 132.645468 -11.471330 132.734648 -11.450209 132.812094 -11.504186 132.877805 -11.623874 133.009228 -11.764685 133.142997 -11.785806 133.274420 -11.830396 133.340132 -11.818662 133.417577 -11.839783 133.483288 -11.896107 133.605324 -11.806928 133.671035 -11.785806 133.671035 -11.806928 133.671035 -11.905495 133.769602 -11.950084 133.936228 -11.959472 134.013673 -12.025183 134.112240 -12.090895 134.278866 -12.058039 134.422023 -12.121403 134.586301 -12.046305 134.630891 -12.046305 134.729458 -12.165993 134.928939 -12.165993 135.015772 -12.219971 135.104952 -12.327925 135.137807 -12.295069 135.203519 -12.231705 135.313820 -12.133138 135.391265 -12.090895 135.456977 -12.067426 135.501567 -12.079160 135.546157 -12.079160 135.644724 -12.079160 135.776146 -12.025183 135.832470 -12.004062 135.766759 -12.112016 135.722169 -12.187115 135.755025 -12.241092 135.799615 -12.262214 135.898182 -12.177727 135.921650 -12.231705 135.921650 -12.295069 135.898182 -12.403024 135.898182 -12.534446 135.921650 -12.597811 135.975627 -12.567302 136.085929 -12.534446 136.196230 -12.339659 136.163374 -12.295069 136.175108 -12.133138 136.360508 -11.971206 136.416832 -12.025183 136.461422 -12.112016 136.482544 -12.381902 136.625701 -12.285682 136.736002 -12.273948 136.836916 -12.360781 136.780592 -12.435879 136.714880 -12.609545 136.616313 -12.792598 136.538868 -12.846575 136.461422 -12.837188 136.428567 -12.891165 136.470810 -12.945143 136.494278 -12.999120 136.538868 -13.041363 136.470810 -13.170439 136.416832 -13.245537 136.339387 -13.290127 136.285410 -13.278393 136.196230 -13.257272 136.151640 -13.161051 136.074194 -13.269006 136.097663 -13.430937 136.130518 -13.506036 136.064807 -13.440325 135.987362 -13.311249 135.898182 -13.299515 135.865326 -13.515424 135.811349 -13.677355 135.811349 -13.773575 135.886448 -13.752454 135.987362 -13.731332 135.954506 -13.860408 135.886448 -14.064583 135.886448 -14.130294 135.844205 -14.235902 135.710435 -14.472932 135.656458 -14.677107 135.534422 -14.848426 135.534422 -15.029132 135.644724 -15.104231 135.710435 -15.223919 135.853592 -15.191064 135.942772 -15.275550 135.954506 -15.287284 136.008483 -15.329527 136.118784 -15.383504 136.285410 -15.437481 136.327653 -15.618188 136.395711 -15.768385 136.395711 -16.012456 136.571723 -15.895114 136.768858 -15.949092 136.968339 -15.991335 137.210063 -15.979600 137.287508 -16.108676 137.475255 -16.226018 137.674736 -16.310504 137.839014 -16.406724 137.949316 -16.542841 138.104207 -16.671917 138.247364 -16.693038 138.378787 -16.765790 138.676835 -16.831502 138.885703 -16.883132 139.061716 -17.009861 139.129774 -17.202301 139.207219 -17.317296 139.350376 -17.413517 139.514655 -17.519124 139.746991 -17.655241 139.779847 -17.676362 139.866680 -17.718605 # -b 130.054562 -11.839783 130.000585 -11.851517 # -b 129.967729 -11.698973 130.009972 -11.677852 130.033441 -11.525307 130.110886 -11.417353 130.176598 -11.429087 130.221188 -11.569897 130.286899 -11.677852 130.364345 -11.752950 130.451177 -11.830396 130.408934 -11.839783 130.209453 -11.830396 130.054562 -11.839783 # -b 130.254043 -11.255421 130.298633 -11.309398 130.397200 -11.351642 130.462912 -11.417353 130.552091 -11.450209 130.617803 -11.471330 130.749226 -11.438474 130.871261 -11.405619 130.958094 -11.417353 131.080129 -11.342254 131.178696 -11.255421 131.267876 -11.285930 131.357056 -11.396231 131.378177 -11.471330 131.389912 -11.579285 131.312466 -11.656730 131.246755 -11.752950 131.103598 -11.830396 130.969828 -11.905495 130.826671 -11.905495 130.704636 -11.806928 130.552091 -11.710707 130.430056 -11.644996 130.364345 -11.515920 130.308021 -11.384497 130.254043 -11.255421 # -b 136.428567 -11.525307 136.395711 -11.525307 136.395711 -11.450209 136.416832 -11.297664 136.527134 -11.135733 136.592845 -11.112264 136.592845 -11.243687 136.482544 -11.396231 136.428567 -11.525307 # -b 136.405098 -13.818165 136.461422 -13.818165 136.482544 -13.872142 136.571723 -13.743067 136.625701 -13.893264 136.759470 -13.797044 136.780592 -14.085704 136.801713 -14.193659 136.869772 -14.259370 136.703146 -14.322735 136.494278 -14.313347 136.395711 -14.184272 136.405098 -13.818165 # -b 139.580366 -16.437233 139.669546 -16.470089 139.681280 -16.479476 139.779847 -16.566309 139.702402 -16.566309 139.535776 -16.617940 139.535776 -16.671917 139.470065 -16.723547 139.294052 -16.777524 139.207219 -16.650795 139.317521 -16.521719 139.404353 -16.500598 139.481799 -16.416112 139.580366 -16.437233 # -b 119.878685 -19.941058 120.045311 -19.910549 120.221323 -19.804942 120.474781 -19.765045 120.662528 -19.722802 120.871396 -19.628929 121.014553 -19.535056 121.113120 -19.441182 121.268012 -19.305066 121.321989 -19.262823 121.432290 -19.168949 121.488614 -19.053954 121.509736 -18.887329 121.598915 -18.760600 121.652893 -18.687848 121.688095 -18.612749 121.697482 -18.497754 121.819518 -18.509489 121.974409 -18.352251 122.204399 -18.141036 122.260723 -18.044815 122.195011 -18.002572 122.150422 -17.814825 122.094098 -17.624732 122.061242 -17.476881 122.084710 -17.265666 122.227867 -17.042717 122.305313 -16.988739 122.415614 -17.000474 122.469591 -16.873745 122.624482 -16.744669 122.678460 -16.744669 122.701928 -16.744669 122.678460 -16.650795 122.755905 -16.458355 122.800495 -16.437233 122.845085 -16.608552 122.922530 -16.714160 122.964773 -16.831502 123.032832 -16.988739 123.152520 -17.211689 123.262821 -17.338418 123.340267 -17.486269 123.417713 -17.570755 123.495158 -17.380661 123.506892 -17.117815 123.549135 -17.127203 123.682905 -17.094347 123.650049 -16.883132 123.516280 -16.681304 123.417713 -16.608552 123.462302 -16.521719 123.450568 -16.479476 123.438834 -16.235405 123.528014 -16.160307 123.715761 -16.247140 123.870652 -16.214284 123.957485 -16.343360 124.091254 -16.500598 124.234411 -16.512332 124.386955 -16.542841 124.431545 -16.416112 124.267267 -16.343360 124.300123 -16.129798 124.377568 -16.045312 124.487869 -15.949092 124.541847 -15.841137 124.508991 -15.735530 124.455014 -15.543089 124.541847 -15.437481 124.685004 -15.392892 124.884485 -15.500846 124.929074 -15.458603 124.872750 -15.350649 124.828161 -15.245041 124.839895 -15.137087 124.917340 -15.052601 125.072231 -15.094844 125.236510 -15.158208 125.236510 -15.073722 125.126209 -14.890669 125.116821 -14.677107 125.269366 -14.611396 125.358545 -14.602008 125.480581 -14.559765 125.522824 -14.548031 125.644859 -14.548031 125.665981 -14.698228 125.766895 -14.644251 125.898317 -14.538644 125.987497 -14.334469 125.987497 -14.235902 125.886583 -14.109173 125.942907 -14.001218 126.029740 -14.109173 126.064943 -14.259370 126.175244 -14.184272 126.240955 -14.076317 126.285545 -14.097439 126.306667 -14.184272 126.416968 -14.172537 126.527269 -14.109173 126.625836 -14.055196 126.691548 -13.989484 126.649305 -13.860408 126.801849 -13.839287 126.858173 -13.881530 126.968474 -13.926120 127.013064 -13.947241 127.189077 -13.947241 127.365089 -14.055196 127.508246 -14.172537 127.663137 -14.376712 127.806294 -14.569152 127.961185 -14.677107 128.059752 -14.752206 128.038631 -14.857813 127.994041 -15.052601 127.994041 -15.245041 127.961185 -15.414013 127.904861 -15.554823 127.818028 -15.651043 127.883740 -15.618188 127.970573 -15.437481 128.015163 -15.287284 128.048018 -15.308406 128.080874 -15.254428 128.113730 -15.125352 128.104342 -15.094844 128.104342 -15.073722 128.125464 -15.052601 128.191175 -14.986889 128.247499 -14.998623 128.268621 -14.965768 128.390656 -14.998623 128.378922 -14.881282 128.444633 -14.836692 128.622993 -14.902403 128.852983 -14.890669 129.061851 -14.857813 129.183887 -14.932912 129.261332 -15.019745 129.383367 -15.137087 129.503056 -15.254428 129.592236 -15.233307 129.535912 -14.956380 129.669681 -14.890669 129.681416 -14.857813 129.559380 -14.731084 129.437345 -14.602008 129.282454 -14.386099 129.371633 -14.109173 129.425611 -14.139682 129.514790 -14.097439 129.603970 -13.980097 129.657947 -13.881530 129.714271 -13.797044 129.714271 -13.667968 129.801104 -13.548279 129.923140 -13.581135 # -b 130.000585 -11.851517 129.967729 -11.743563 129.967729 -11.698973 # -b 124.825814 -9.887216 124.703778 -10.051495 124.572355 -10.105472 124.471442 -10.171183 124.295429 -10.204039 124.131150 -10.302606 123.964525 -10.347196 123.833102 -10.368318 123.666477 -10.356583 123.567910 -10.258016 123.699333 -10.105472 123.722801 -10.009252 # -b 122.903756 -10.901049 122.915490 -10.793095 122.981201 -10.771973 123.082115 -10.760239 123.180682 -10.673406 123.279249 -10.586573 123.380163 -10.509128 123.413019 -10.499740 123.424753 -10.541983 123.424753 -10.619429 123.380163 -10.717996 123.258128 -10.814216 123.103237 -10.924518 122.981201 -10.933905 122.903756 -10.901049 # -b 120.796298 -9.931806 120.850275 -10.117206 120.739974 -10.215773 120.552227 -10.290872 120.322237 -10.281485 120.134490 -10.063229 # -b 118.864852 -20.077175 119.008009 -19.952792 119.249733 -19.941058 # -b 119.425746 -20.034931 119.646349 -19.941058 119.878685 -19.941058 # -b 49.950039 -14.052849 50.027484 -14.332122 50.048606 -14.590274 50.104930 -14.878935 50.226965 -15.146474 50.259821 -15.423400 50.226965 -15.690940 50.137786 -15.904502 # -b 57.492767 -20.011463 57.558478 -19.980954 # -b 40.677693 -10.999616 40.633103 -11.112264 40.583820 -11.175629 40.532190 -11.262462 40.466478 -11.405619 40.400767 -11.534695 40.337402 -11.774072 40.358524 -12.013449 40.358524 -12.208236 40.412501 -12.543834 40.424235 -12.801986 40.313934 -12.900553 40.346790 -13.071872 40.403114 -13.071872 40.403114 -13.374613 40.379645 -13.675008 40.391379 -13.806431 40.412501 -13.966016 40.435969 -14.041115 40.424235 -14.095092 40.391379 -14.191312 40.468825 -14.245289 40.534536 -14.191312 40.600248 -14.320388 40.501681 -14.449464 40.579126 -14.461198 40.665959 -14.515175 40.665959 -14.674760 40.579126 -14.846079 40.513415 -15.038520 40.346790 -15.209838 40.489946 -15.252082 40.480559 -15.402279 40.445357 -15.531355 40.302200 -15.606454 40.292812 -15.606454 40.281078 -15.615841 40.116800 -15.796547 # -b 43.113708 -11.393885 43.113708 -11.351642 43.125442 -11.351642 43.202888 -11.361029 43.259212 -11.447862 43.301455 -11.600406 43.324923 -11.762338 43.378901 -11.849171 43.378901 -11.947738 43.324923 -11.926616 43.181766 -11.828049 43.158298 -11.666117 43.137177 -11.480717 43.113708 -11.393885 # -b 44.305900 -16.265914 44.371612 -16.169694 44.392733 -16.160307 44.437323 -16.169694 44.514769 -16.202550 44.812817 -16.181428 44.878528 -16.106329 44.988829 -16.042965 45.087396 -15.988988 45.120252 -16.085208 45.188310 -16.118064 45.286877 -16.000722 45.397179 -16.042965 45.495746 -15.925623 45.519214 -15.808281 45.695227 -15.766038 45.793794 -15.829403 45.915829 -15.723795 46.026131 -15.754304 46.112963 -15.935011 46.234999 -16.064086 46.378156 -16.096942 46.500191 -16.073474 46.455601 -15.913889 46.267855 -15.754304 46.288976 -15.585332 46.476723 -15.381157 46.697325 -15.252082 46.819361 -15.306059 46.840482 -15.435135 46.852217 -15.540742 46.995373 -15.552476 47.105675 -15.489112 47.051697 -15.369423 46.929662 -15.155861 47.051697 -15.050254 47.204242 -14.857813 47.161999 -14.815570 47.293422 -14.686494 47.347399 -14.815570 47.305156 -15.029132 47.424844 -14.878935 47.591470 -14.674760 47.746361 -14.686494 47.844928 -14.665373 47.800338 -14.590274 47.636059 -14.545684 47.546880 -14.407221 47.591470 -14.299266 47.746361 -14.095092 47.844928 -14.203046 47.856662 -13.977750 47.800338 -13.848674 47.746361 -13.632765 47.800338 -13.557667 47.988085 -13.623378 48.065530 -13.815818 48.164097 -13.665621 48.229809 -13.569401 48.295520 -13.482568 48.330723 -13.287780 48.462145 -13.386348 48.626424 -13.278393 48.715604 -13.017894 48.736725 -12.769130 48.736725 -12.607198 48.626424 -12.445267 48.715604 -12.478122 48.891616 -12.262214 49.023039 -12.175381 49.234254 -12.358434 49.398533 -12.597811 49.586279 -12.780864 49.586279 -12.769130 49.720049 -13.008507 49.785760 -13.254925 49.806882 -13.461446 49.905449 -13.761841 49.950039 -14.052849 # -b 50.137786 -15.904502 49.994629 -15.925623 49.884327 -15.690940 49.806882 -15.435135 49.642603 -15.444522 49.574545 -15.850524 49.574545 -16.127451 49.696581 -16.341013 49.696581 -16.627327 49.619135 -16.817421 49.508834 -16.934762 49.365677 -17.188220 49.321087 -17.495656 49.321087 -17.749114 49.267110 -18.075324 49.210786 -18.371025 49.145074 -18.654992 49.046507 -18.927225 48.947940 -19.166602 48.912738 -19.178337 48.891616 -19.335575 48.825905 -19.511587 48.760193 -19.732190 48.682748 -19.959833 # -b 44.315288 -20.023197 44.404467 -19.835451 44.359878 -19.659438 44.437323 -19.565564 44.383346 -19.396592 44.228455 -19.145481 44.129888 -18.812230 44.073564 -18.570506 44.019587 -18.328782 43.996118 -18.054203 43.996118 -17.800744 43.876430 -17.634119 43.808371 -17.526165 43.876430 -17.399436 44.052442 -17.136590 44.216721 -16.786912 44.315288 -16.552228 44.305900 -16.392643 44.305900 -16.265914 # -b 39.929053 -9.997518 40.006498 -10.051495 40.126187 -10.107819 40.227101 -10.281485 40.292812 -10.293219 40.391379 -10.323728 40.489946 -10.389439 # -b 40.489946 -10.389439 40.579126 -10.520862 40.644838 -10.553718 40.677693 -10.652285 40.644838 -10.694528 40.656572 -10.814216 40.656572 -10.945639 40.677693 -10.999616 # -b 40.116800 -15.796547 39.983030 -15.956132 39.905585 -16.118064 39.607536 -16.277648 39.652126 -16.308157 39.708450 -16.362135 39.631005 -16.509985 39.443258 -16.648448 39.222656 -16.775178 39.058377 -16.838542 38.948076 -17.030983 38.704005 -17.157712 38.560848 -17.145977 38.396570 -17.157712 38.152499 -17.242198 37.889653 -17.357193 37.579871 -17.495656 37.359268 -17.601263 37.051833 -17.821866 36.852352 -17.981451 36.807762 -18.150423 36.720929 -18.211441 36.620015 -18.223175 36.566038 -18.232562 36.488593 -18.265418 36.566038 -18.317048 36.610628 -18.359291 36.509714 -18.476633 36.390026 -18.601015 36.300846 -18.706623 36.178810 -18.894370 36.080243 -18.854473 36.026266 -18.685501 35.958208 -18.812230 35.904231 -18.957734 35.749340 -19.030486 35.662507 -19.126706 35.561593 -19.241701 35.397314 -19.396592 35.221302 -19.574952 34.988965 -19.720456 34.845808 -19.887081 34.646327 -19.938711 # -b 34.944375 -11.600406 34.899785 -11.501839 34.768362 -11.426740 34.679183 -11.307052 34.613471 -11.241340 34.568881 -11.055940 # -b 34.327157 -10.999616 34.327157 -11.034819 34.172266 -11.088796 34.172266 -11.142773 34.172266 -11.199097 34.130023 -11.253074 34.139411 -11.339907 34.184000 -11.468983 34.205122 -11.633262 34.216856 -11.752950 34.151145 -11.882026 34.073699 -12.013449 34.029109 -12.130791 34.007988 -12.304457 34.019722 -12.445267 34.061965 -12.597811 34.106555 -12.769130 34.162879 -12.921674 34.172266 -13.146970 34.172266 -13.362879 34.240325 -13.578788 34.371747 -13.590522 34.470314 -13.698477 34.482049 -13.890917 34.482049 -14.085704 34.526638 -14.214780 34.625205 -14.235902 34.714385 -14.257023 34.812952 -14.191312 34.944375 -14.214780 35.066410 -14.364978 35.209567 -14.470585 35.197833 -14.449464 35.164978 -14.386099 35.120388 -14.224168 35.087532 -14.010606 35.000699 -13.858061 34.878664 -13.773575 34.845808 -13.665621 34.824686 -13.665621 34.824686 -13.644499 34.789484 -13.644499 # -b 34.944375 -11.600406 34.845808 -11.600406 34.857542 -11.666117 34.866930 -11.774072 34.866930 -11.849171 34.845808 -11.968859 34.789484 -12.088548 34.723773 -12.229358 34.658061 -12.403024 34.636940 -12.543834 34.636940 -12.715153 34.646327 -12.867697 34.658061 -13.050750 34.658061 -13.233803 34.679183 -13.395735 34.735507 -13.545932 34.789484 -13.644499 34.845808 -13.644499 # -b 34.559494 -9.997518 34.646327 -10.293219 34.714385 -10.631163 34.643980 -10.750852 34.568881 -10.999616 # -b 34.073699 -9.887216 34.139411 -10.051495 34.195735 -10.248629 34.261446 -10.380052 34.315423 -10.541983 34.327157 -10.673406 34.327157 -10.793095 34.327157 -10.999616 # -b 11.626221 -17.314950 11.626221 -17.209342 11.605100 -17.073226 11.572244 -16.838542 11.572244 -16.636714 11.659077 -16.681304 11.682545 -16.796299 11.670811 -16.681304 11.659077 -16.488864 11.659077 -16.319891 11.659077 -16.139185 11.682545 -15.925623 11.825702 -15.775426 11.879679 -15.615841 11.945391 -15.338914 12.022836 -15.167595 12.046305 -14.921178 12.100282 -14.761593 12.133138 -14.545684 12.177727 -14.428342 12.210583 -14.235902 12.288029 -14.062236 12.353740 -13.912039 12.353740 -13.773575 12.419452 -13.686742 12.431186 -13.569401 12.475776 -13.449712 12.541487 -13.308902 12.705765 -13.179826 12.816067 -13.062484 12.827801 -12.942796 12.848922 -12.823107 13.015548 -12.748008 13.215029 -12.661176 13.334717 -12.532100 13.456753 -12.391289 13.543586 -12.241092 13.621031 -12.043958 13.653887 -11.882026 13.665621 -11.795193 13.665621 -11.785806 13.677355 -11.762338 13.677355 -11.666117 13.677355 -11.555816 13.677355 -11.459596 13.698477 -11.393885 13.721945 -11.307052 13.721945 -11.220219 13.710211 -11.100530 13.698477 -11.034819 # -b 12.893512 -20.053706 12.806679 -19.919937 12.762089 -19.793207 12.696378 -19.678213 12.651788 -19.605461 12.618932 -19.481078 12.529753 -19.387205 12.464041 -19.293332 12.431186 -19.187724 12.374862 -19.126706 12.309150 -19.063342 12.231705 -18.894370 12.121403 -18.748866 12.046305 -18.694889 11.968859 -18.643258 11.957125 -18.612749 11.936003 -18.601015 11.846824 -18.476633 11.757644 -18.317048 11.670811 -18.150423 11.670811 -17.981451 11.647343 -17.927474 11.614487 -17.821866 11.605100 -17.718605 11.614487 -17.580142 11.614487 -17.441679 11.626221 -17.336071 11.626221 -17.314950 # -b 13.698477 -11.034819 13.787656 -10.901049 13.754801 -10.781361 13.710211 -10.553718 13.477874 -10.368318 13.391041 -10.150062 13.290127 -10.018639 # -b -50.097889 -29.858783 -49.987588 -29.703892 -49.877287 -29.530226 -49.776373 -29.377682 -49.633216 -29.204016 -49.546383 -29.135958 -49.490059 -29.086675 -49.424348 -29.018616 -49.337515 -28.903621 -49.203745 -28.776892 -49.060588 -28.690059 -48.872842 -28.652510 -48.839986 -28.652510 -48.839986 -28.495272 -48.741419 -28.368543 -48.663973 -28.349768 -48.619383 -28.124472 -48.607649 -27.861627 -48.607649 -27.636330 -48.574793 -27.380525 -48.598262 -27.272571 -48.574793 -27.223287 -48.398781 -27.232675 -48.387047 -27.223287 -48.565406 -27.075437 -48.652239 -26.997991 -48.631118 -26.779736 -48.663973 -26.730452 -48.696829 -26.690556 -48.696829 -26.631885 -48.675707 -26.512196 -48.717950 -26.394855 -48.750806 -26.284553 -48.675707 -26.146090 -48.631118 -25.977118 -48.652239 -25.887938 -48.598262 -25.796412 -48.497348 -25.688457 -48.387047 -25.538260 -48.255624 -25.437346 -48.166444 -25.348166 -48.013900 -25.228478 -47.880130 -25.108789 -47.837887 -25.007875 -47.682996 -24.857678 -47.572695 -24.747376 -47.429538 -24.646463 -47.295768 -24.594832 -47.164346 -24.505652 -47.054044 -24.393004 -46.922622 -24.273316 -46.734875 -24.141893 -46.535394 -24.031592 -46.392237 -23.949452 -46.281936 -23.989349 -46.216224 -23.940065 -46.040212 -23.778134 -45.831343 -23.757012 -45.610741 -23.787521 -45.488705 -23.747625 -45.357283 -23.585693 -45.256369 -23.555184 -45.223513 -23.482432 -45.157802 -23.463658 -45.169536 -23.412027 -45.092090 -23.372131 -44.904343 -23.311113 -44.704862 -23.280604 -44.594561 -23.268870 -44.627417 -23.198465 -44.728331 -23.146835 -44.749452 -23.146835 -44.672007 -23.067042 -44.561705 -23.006025 -44.442017 -22.902764 -44.373959 -22.933273 -44.385693 -23.015412 -44.319981 -23.036534 -44.153356 -22.984903 -44.010199 -22.933273 -43.944488 -22.902764 -43.822452 -22.933273 -43.702764 -22.984903 -43.559607 -22.994291 -43.416450 -22.963782 -43.249825 -22.872255 -43.139523 -22.862868 -43.073812 -22.945007 -42.909533 -22.963782 -42.721787 -22.954394 -42.632607 -22.945007 -42.522306 -22.914498 -42.390883 -22.914498 -42.203136 -22.881643 -42.059979 -22.851134 -41.994268 -22.801850 -42.027123 -22.719711 -42.071713 -22.689202 -42.059979 -22.628184 -41.970799 -22.473293 -41.750197 -22.330136 -41.553063 -22.229222 -41.365316 -22.156470 -41.210425 -22.074331 -41.132979 -21.971070 -41.111858 -21.849035 -41.123592 -21.673022 -41.111858 -21.508744 -41.079002 -21.332731 -40.956967 -21.147331 -40.834931 -20.971319 -40.736364 -20.868058 -40.614329 -20.776531 -40.494640 -20.619293 -40.384339 -20.443281 -40.250569 -20.185129 # -b -50.184722 -30.116935 -50.140133 -29.964391 -50.097889 -29.858783 # -b -70.261897 -19.830757 -70.229041 -20.006769 -70.229041 -20.203904 -70.252510 -20.370529 -70.261897 -20.631028 -70.273631 -20.919688 -70.217307 -21.116822 -70.163330 -21.374974 -70.163330 -21.560374 -70.217307 -21.745774 -70.229041 -21.949949 -70.294753 -22.165858 -70.318221 -22.372379 -70.318221 -22.677468 -70.339342 -22.881643 -70.395667 -23.006025 -70.473112 -23.006025 -70.559945 -23.106939 -70.625656 -23.329888 -70.625656 -23.433149 -70.581067 -23.494166 -70.515355 -23.564572 -70.527089 -23.766399 -70.571679 -23.970574 -70.571679 -24.151280 -70.571679 -24.343721 -70.571679 -24.576057 -70.571679 -24.775538 -70.548211 -24.946857 -70.538823 -25.017262 -70.538823 -25.097055 -70.538823 -25.268374 -70.548211 -25.409184 -70.670246 -25.498364 -70.747692 -25.639174 -70.792282 -25.777637 -70.792282 -25.887938 -70.780547 -25.995893 -70.747692 -26.136703 -70.726570 -26.244657 -70.726570 -26.394855 -70.759426 -26.533318 -70.768813 -26.699943 -70.792282 -26.850141 -70.869727 -27.056662 -70.944826 -27.124720 -71.001150 -27.213900 -71.012884 -27.303080 -71.012884 -27.401647 -71.012884 -27.450931 -71.001150 -27.547151 -71.055127 -27.617556 -71.144307 -27.772447 -71.188897 -27.969581 -71.221752 -28.213652 -71.254608 -28.380277 -71.308585 -28.553943 -71.353175 -28.708834 -71.475211 -28.854338 -71.540922 -28.941171 # -b -71.540922 -28.941171 -71.597246 -29.049125 -71.606633 -29.126571 -71.606633 -29.204016 -71.564390 -29.272075 -71.519801 -29.398804 -71.486945 -29.504411 -71.442355 -29.591244 -71.442355 -29.706239 -71.430621 -29.802459 -71.397765 -29.889292 # -b -109.498633 -27.169310 -109.400066 -27.159923 -109.376598 -27.120027 -109.409454 -27.080131 -109.454044 -27.070743 -109.486899 -27.051969 -109.531489 -27.129414 -109.543223 -27.169310 # -b -124.945502 -24.641769 -124.978358 -24.712174 -124.922034 -24.712174 -124.912647 -24.651156 -124.954890 -24.672278 -124.945502 -24.641769 # -b -135.684620 -21.461807 -135.705741 -21.461807 -135.759719 -21.543946 -135.750331 -21.586190 -135.649417 -21.565068 -135.640030 -21.482929 -135.684620 -21.461807 # -b -130.270471 -25.043078 -130.282205 -25.082974 -130.247003 -25.092361 -130.237615 -25.043078 -130.270471 -25.043078 # -b -137.249959 -23.111632 -137.282815 -23.102245 -137.292202 -23.163263 -137.292202 -23.184384 -137.249959 -23.193772 -137.238225 -23.153875 -137.249959 -23.111632 # -b -140.798374 -21.750468 -140.756131 -21.658941 -140.788986 -21.668329 -140.810108 -21.771589 -140.756131 -21.762202 -140.732662 -21.677716 -140.744396 -21.668329 -140.798374 -21.750468 # -b -175.219404 -21.133250 -175.186549 -21.121516 -175.186549 -21.203655 -175.219404 -21.297529 -175.287463 -21.288141 -175.386030 -21.236511 -175.496331 -21.194268 -175.540921 -21.100395 -175.475209 -21.100395 -175.353174 -21.133250 -175.219404 -21.133250 # -b 165.010672 -21.431298 164.872208 -21.370281 164.642218 -21.248245 164.508449 -21.081620 164.409882 -20.947850 164.299581 -20.865711 164.212748 -20.659190 164.025001 -20.513686 164.025001 -20.368182 163.924087 -20.253187 164.034388 -20.222678 164.189279 -20.304818 164.278459 -20.283696 164.377026 -20.347061 164.520183 -20.450321 164.651606 -20.492564 164.675074 -20.586438 164.752520 -20.659190 164.851087 -20.668577 164.862821 -20.668577 164.998937 -20.717861 164.998937 -20.717861 165.010672 -20.738982 165.022406 -20.769491 165.066996 -20.821121 165.109239 -20.884486 165.153829 -20.957238 165.186684 -20.966625 165.243008 -21.008868 165.254742 -21.060498 165.275864 -21.112129 165.296985 -21.194268 165.365044 -21.215390 165.419021 -21.297529 165.550444 -21.370281 165.618502 -21.443033 165.651358 -21.482929 165.717069 -21.494663 165.771046 -21.607311 165.925937 -21.616698 166.036239 -21.658941 166.158274 -21.689450 166.289697 -21.811486 166.399998 -21.893625 166.489178 -21.978111 166.543155 -22.079025 166.653456 -22.060250 166.796613 -22.161164 166.841203 -22.316055 166.808347 -22.355951 166.730902 -22.355951 166.709780 -22.398194 166.698046 -22.480334 166.653456 -22.459212 166.620600 -22.377073 166.489178 -22.304321 166.444588 -22.255038 166.289697 -22.255038 166.191130 -22.182286 166.047973 -22.182286 166.003383 -22.121268 165.982261 -22.008620 165.893082 -22.008620 165.827370 -21.956989 165.738190 -21.956989 165.705335 -21.884238 165.627889 -21.884238 165.583299 -21.832607 165.472998 -21.811486 165.341575 -21.698838 165.231274 -21.689450 165.132707 -21.637820 165.109239 -21.525172 165.043527 -21.461807 165.010672 -21.431298 # -b 166.996094 -20.802347 167.028950 -20.811734 167.106395 -20.790612 167.172107 -20.821121 167.172107 -20.926729 167.216697 -20.987747 167.303530 -21.018255 167.303530 -21.121516 167.282408 -21.173147 167.226084 -21.194268 167.127517 -21.133250 167.007828 -21.060498 166.984360 -20.978359 167.007828 -20.914995 166.996094 -20.842243 166.996094 -20.802347 # -b 167.711879 -21.452420 167.667289 -21.421911 167.711879 -21.400790 167.768203 -21.410177 167.810446 -21.391402 167.878504 -21.443033 167.944215 -21.443033 167.965337 -21.494663 167.977071 -21.586190 167.944215 -21.647207 167.810446 -21.637820 167.744735 -21.555681 167.711879 -21.452420 # -b 149.922869 -22.203407 150.033170 -22.121268 150.089494 -22.285546 150.197448 -22.367686 150.396929 -22.459212 150.540086 -22.574207 150.561208 -22.459212 150.584676 -22.316055 150.662122 -22.379420 150.671509 -22.492068 150.716099 -22.541351 150.781810 -22.808891 150.781810 -23.062349 150.805279 -23.306420 150.870990 -23.541103 151.014147 -23.651404 151.124448 -23.785174 151.246484 -23.886088 151.389640 -23.996389 151.621977 -23.996389 151.753400 -24.087916 151.875435 -24.228726 151.983390 -24.411779 152.018592 -24.512693 152.171137 -24.641769 152.358883 -24.702787 152.349496 -24.752070 152.448063 -24.892880 152.591220 -25.064199 152.558364 -25.165113 152.767233 -25.244905 152.823557 -25.385716 152.844678 -25.524179 152.856412 -25.683764 152.954980 -25.843348 153.008957 -25.923141 153.077015 -25.824574 153.098136 -26.073338 153.044159 -26.322103 153.077015 -26.420670 153.098136 -26.488728 153.119258 -26.688209 153.142726 -26.944014 153.208438 -27.091865 153.130992 -27.051969 153.098136 -27.171657 153.130992 -27.230328 153.142726 -27.338282 153.208438 -27.406341 153.253028 -27.594087 153.297617 -27.702042 153.384450 -27.868667 153.429040 -27.986009 153.450162 -28.072842 153.506486 -28.211305 153.551076 -28.326300 153.551076 -28.443642 153.560463 -28.560984 153.560463 -28.589146 153.560463 -28.755771 153.518220 -29.006882 153.450162 -29.133611 153.363329 -29.394110 153.330473 -29.720320 # -b 153.098136 -24.794313 153.119258 -24.733295 153.175582 -24.803700 153.220172 -24.883493 153.274149 -24.975019 153.274149 -25.214397 153.175582 -25.413878 153.098136 -25.564075 153.065281 -25.674376 153.008957 -25.674376 152.976101 -25.493670 152.987835 -25.355207 152.976101 -25.214397 153.086402 -25.073587 153.154461 -24.923389 153.098136 -24.794313 # -b 153.450162 -27.347670 153.518220 -27.338282 153.539341 -27.406341 153.518220 -27.526029 153.473630 -27.622249 153.429040 -27.594087 153.417306 -27.446237 153.450162 -27.347670 153.417306 -27.446237 153.450162 -27.347670 # -b 148.148661 -19.889428 148.247228 -20.034931 148.357530 -20.138192 148.467831 -20.065440 148.554664 -20.138192 148.688433 -20.210944 148.775266 -20.264921 148.852712 -20.335326 148.897302 -20.532461 148.876180 -20.523073 148.765879 -20.501952 148.742410 -20.710820 148.852712 -20.814081 149.028724 -20.835202 149.073314 -20.926729 149.207084 -21.081620 149.239940 -21.236511 149.293917 -21.339772 149.326772 -21.454767 149.460542 -21.485276 149.481664 -21.597924 149.481664 -21.865463 149.493398 -22.050863 149.537988 -22.133002 149.547375 -22.142389 149.547375 -22.194020 149.570843 -22.276159 149.648289 -22.348911 149.690532 -22.492068 149.746856 -22.501455 149.812567 -22.459212 149.922869 -22.459212 149.922869 -22.203407 # -b 113.913030 -21.865463 114.023332 -21.773936 114.023332 -21.792711 114.023332 -21.856076 114.023332 -21.926481 114.013944 -22.039129 114.002210 -22.090759 113.957620 -22.154124 113.945886 -22.233916 114.002210 -22.276159 113.990476 -22.398194 113.957620 -22.492068 114.046800 -22.522577 114.201691 -22.398194 114.276790 -22.172898 114.365969 -22.050863 114.455149 -21.895972 114.586572 -21.844341 114.729729 -21.762202 114.851764 -21.731693 114.983187 -21.619045 115.126344 -21.588536 115.337559 -21.558027 115.424392 -21.412524 115.555815 -21.288141 115.689585 -21.217736 115.799886 -21.041724 115.919574 -20.978359 116.062731 -20.926729 116.173033 -20.844590 116.306802 -20.783572 116.494549 -20.647455 116.625972 -20.574704 116.691683 -20.553582 116.736273 -20.595825 116.891164 -20.616947 117.034321 -20.616947 117.189212 -20.668577 117.376959 -20.689698 117.529503 -20.659190 117.684394 -20.616947 117.872141 -20.462055 118.059888 -20.368182 118.235901 -20.325939 118.435382 -20.316552 118.611394 -20.283696 118.864852 -20.077175 # -b 119.249733 -19.941058 119.425746 -20.034931 # -b 114.962066 -30.105201 114.929210 -29.931535 114.929210 -29.769604 114.929210 -29.614712 114.929210 -29.431659 114.861152 -29.239219 114.807175 -29.142999 114.717995 -29.006882 114.565450 -28.793320 114.520861 -28.570371 114.344848 -28.347422 114.124245 -27.995396 114.100777 -27.622249 113.981089 -27.378179 113.870787 -27.051969 113.659572 -26.934627 113.495294 -26.756267 113.373258 -26.617804 113.328668 -26.469953 113.218367 -26.390161 113.185511 -26.300981 113.143268 -26.232923 113.164390 -26.141397 113.197246 -26.221189 113.286425 -26.232923 113.352137 -26.261085 113.406114 -26.380774 113.429582 -26.540358 113.507028 -26.500462 113.549271 -26.599029 113.683040 -26.617804 113.781608 -26.528624 113.760486 -26.380774 113.593861 -26.232923 113.483559 -25.984159 113.384992 -25.754169 113.373258 -25.585197 113.450704 -25.643867 113.539884 -25.824574 113.593861 -26.024055 113.626716 -26.211802 113.781608 -26.052217 113.826197 -26.193027 113.847319 -26.380774 113.981089 -26.399548 114.079656 -26.282207 114.124245 -26.073338 114.091390 -25.775290 113.957620 -25.655602 113.847319 -25.453774 113.802729 -25.505404 113.826197 -25.385716 113.760486 -25.294189 113.694775 -25.183888 113.528149 -24.852984 113.450704 -24.723908 113.295813 -24.451675 113.307547 -24.198217 113.295813 -23.947106 113.384992 -23.785174 113.528149 -23.651404 113.638451 -23.550491 113.671306 -23.388559 113.650185 -23.245402 113.671306 -23.031840 113.671306 -22.909805 113.617329 -22.818278 113.539884 -22.696243 113.584473 -22.522577 113.626716 -22.316055 113.727630 -22.172898 113.781608 -22.050863 113.837932 -21.917093 113.913030 -21.865463 # -b 55.122464 -20.987747 55.045018 -20.966625 55.155319 -20.945504 55.275008 -20.914995 55.429899 -20.893873 55.594177 -20.978359 55.704479 -21.142638 55.704479 -21.288141 55.683357 -21.391402 55.507344 -21.410177 55.340719 -21.318650 55.188175 -21.152025 55.122464 -20.987747 # -b 57.391853 -20.074828 57.415321 -20.044319 57.492767 -20.011463 # -b 57.558478 -19.980954 57.567866 -20.065440 57.567866 -20.126458 57.635924 -20.283696 57.612456 -20.417466 57.492767 -20.490218 57.293286 -20.501952 57.260430 -20.335326 57.326142 -20.159314 57.391853 -20.074828 # -b 48.682748 -19.959833 48.593568 -20.250840 48.516123 -20.429200 48.384700 -20.738982 48.295520 -21.142638 48.208687 -21.421911 48.098386 -21.792711 47.966963 -22.090759 47.844928 -22.489721 47.767482 -22.754913 47.711158 -22.959088 47.657181 -23.245402 47.568001 -23.519982 47.514024 -23.792215 47.436578 -24.076182 47.293422 -24.339027 47.194854 -24.580751 47.061085 -24.791966 46.974252 -24.932776 46.798239 -25.082974 46.631614 -25.162766 46.476723 -25.132257 46.190409 -25.193275 45.892361 -25.251946 45.594313 -25.423265 45.307999 -25.573462 45.054541 -25.613359 44.857407 -25.463161 44.714250 -25.373981 44.449057 -25.212050 44.204986 -25.092361 43.996118 -24.932776 43.852961 -24.730949 43.730926 -24.571364 43.622971 -24.278009 43.566647 -23.965880 43.566647 -23.731197 43.644093 -23.569265 43.554913 -23.294685 43.456346 -23.060002 43.292068 -22.928579 43.170032 -22.663387 43.170032 -22.416969 43.137177 -22.203407 43.137177 -21.893625 43.191154 -21.802098 43.268599 -21.698838 43.334311 -21.534559 43.402369 -21.421911 43.522057 -21.276407 43.665214 -21.224777 43.721538 -21.048764 43.831840 -20.760104 43.996118 -20.480830 44.151009 -20.210944 44.315288 -20.023197 # -b 32.815796 -26.735146 32.794674 -26.944014 32.750084 -27.120027 32.639783 -27.326548 32.630396 -27.542457 32.585806 -27.758366 32.487239 -27.964887 32.430915 -28.208958 32.386325 -28.453029 32.222046 -28.666591 32.013178 -28.812095 31.858287 -28.927090 31.691662 -28.976373 31.539117 -29.072594 31.384226 -29.246259 31.262191 -29.401150 31.229335 -29.459821 31.173011 -29.525533 31.107300 -29.689811 31.008733 -29.804806 30.954755 -29.929188 # -b 34.646327 -19.938711 34.636940 -20.086562 34.613471 -20.250840 34.592350 -20.450321 34.625205 -20.614600 34.735507 -20.696739 34.866930 -20.790612 34.944375 -20.893873 34.956109 -21.039377 34.988965 -21.069886 35.010086 -21.224777 35.054676 -21.349159 35.155590 -21.607311 35.230689 -21.811486 35.254157 -22.140043 35.287013 -22.222182 35.385580 -22.140043 35.463026 -22.203407 35.463026 -22.386460 35.451291 -22.581248 35.430170 -22.776035 35.418436 -22.980210 35.397314 -23.214893 35.319869 -23.437842 35.254157 -23.712422 35.164978 -23.996389 35.197833 -24.177095 35.265891 -24.024551 35.397314 -23.874354 35.397314 -23.935371 35.340990 -24.155974 35.242423 -24.348414 35.132122 -24.479837 34.977231 -24.651156 34.714385 -24.831862 34.383481 -24.951551 34.162879 -24.972673 33.909421 -25.061852 33.578517 -25.193275 33.346180 -25.294189 33.214758 -25.392756 33.027011 -25.484283 32.860385 -25.524179 32.773553 -25.603971 32.639783 -25.822227 32.475505 -26.012321 32.442649 -26.012321 32.585806 -26.132009 32.705494 -26.289247 32.815796 -26.209455 32.872120 -26.110888 32.850998 -26.279860 32.839264 -26.448832 32.839264 -26.596683 32.827530 -26.735146 32.815796 -26.735146 # -b 16.432540 -28.666591 16.378562 -28.636082 16.301117 -28.636082 16.179081 -28.530475 16.047659 -28.394358 15.958479 -28.326300 15.881033 -28.286404 15.782466 -28.208958 15.672165 -28.101004 15.585332 -27.946113 15.517274 -27.807649 15.442175 -27.720817 15.374117 -27.631637 15.263816 -27.514295 15.165249 -27.406341 15.144127 -27.258490 15.111271 -27.042581 15.043213 -26.864222 15.022092 -26.706984 15.000970 -26.538012 14.932912 -26.378427 14.900056 -26.329143 14.890669 -26.319756 14.923525 -26.150784 14.867201 -26.031095 14.801489 -25.911407 14.756899 -25.751822 14.747512 -25.564075 14.735778 -25.373981 14.756899 -25.242559 14.768633 -25.132257 14.747512 -25.012569 14.691188 -24.902268 14.580887 -24.712174 14.526909 -24.590138 14.491707 -24.479837 14.404874 -24.317906 14.372018 -24.137199 14.381406 -23.954146 14.381406 -23.834458 14.372018 -23.691301 14.372018 -23.519982 14.372018 -23.367437 14.360284 -23.203159 14.372018 -23.102245 14.393140 -22.907458 14.381406 -22.754913 14.348550 -22.560126 14.294573 -22.438091 14.196006 -22.243303 14.073970 -22.100146 13.951935 -21.956989 13.841634 -21.832607 13.764188 -21.677716 13.754801 -21.576802 13.621031 -21.421911 13.510730 -21.255286 13.433284 -21.112129 13.358186 -20.997134 13.290127 -20.863364 13.236150 -20.750716 13.191560 -20.605212 13.125849 -20.501952 13.092993 -20.356448 12.982692 -20.199210 12.893512 -20.053706 # -b 17.094347 -30.102854 17.040370 -29.938576 16.951190 -29.671037 16.840889 -29.441047 16.786912 -29.314318 16.685998 -29.072594 16.521719 -28.917702 16.465395 -28.840257 16.477129 -28.734649 16.432540 -28.666591 # -b -53.240302 -33.611373 -53.118266 -33.538621 -52.951641 -33.425973 -52.820218 -33.287509 -52.709917 -33.167821 -52.623084 -32.982421 -52.533904 -32.881507 -52.477580 -32.759472 -52.468193 -32.703148 -52.444725 -32.639783 -52.411869 -32.480198 -52.357892 -32.386325 -52.203001 -32.217353 -51.970664 -32.078889 -51.782917 -31.938079 -51.585783 -31.844206 -51.442626 -31.769107 -51.308856 -31.663500 -51.198555 -31.588401 -51.123456 -31.494527 -50.989687 -31.334943 -50.858264 -31.182398 -50.759697 -31.032201 -50.614193 -30.870269 -50.503892 -30.698950 -50.417059 -30.555793 -50.318492 -30.471307 -50.283289 -30.375087 -50.250434 -30.269479 -50.184722 -30.116935 # -b -60.020308 -38.828387 -59.853683 -38.809613 -59.665936 -38.809613 -59.435946 -38.776757 -59.194222 -38.725126 -58.983007 -38.664109 -58.795260 -38.603091 -58.708428 -38.560848 -58.684959 -38.560848 -58.541802 -38.560848 -58.311812 -38.499830 -58.067742 -38.429425 -57.826018 -38.335552 -57.626537 -38.187701 -57.584294 -38.030463 -57.516235 -37.838023 -57.396547 -37.680785 -57.175944 -37.488344 -57.021053 -37.295904 -56.833306 -37.094076 -56.711271 -36.889901 -56.711271 -36.704501 -56.711271 -36.472165 -56.744127 -36.331355 -56.922486 -36.347782 -57.164210 -36.251562 -57.373078 -36.045041 -57.441137 -35.857294 -57.351957 -35.714137 -57.241656 -35.488841 -57.241656 -35.444251 -57.253390 -35.336297 -57.373078 -35.237729 -57.539704 -35.092226 -57.769694 -34.927947 -57.957440 -34.819993 -58.201511 -34.702651 -58.410380 -34.611124 -58.508947 -34.418684 -58.553536 -34.310730 -58.497212 -34.273180 -58.464357 -34.146451 -58.476091 -34.007988 -58.476091 -33.998601 # -b -58.476091 -33.998601 -58.454969 -33.989213 -58.344668 -34.017375 -58.267223 -34.099514 -58.145187 -34.219203 -58.023152 -34.320117 -57.957440 -34.437459 -57.837752 -34.456233 -57.682861 -34.465621 -57.462258 -34.484395 -57.274511 -34.484395 -57.098499 -34.564188 -56.821572 -34.674489 -56.579848 -34.756628 -56.392101 -34.791831 -56.237210 -34.864583 -56.126909 -34.873970 -55.974365 -34.857542 -55.774884 -34.819993 -55.533160 -34.819993 -55.345413 -34.857542 -55.145932 -34.883357 -54.904208 -34.946722 -54.606160 -34.857542 -54.385557 -34.766016 -54.176689 -34.636940 -54.010064 -34.484395 -53.934965 -34.437459 -53.878641 -34.320117 -53.735484 -34.191041 -53.613449 -34.007988 -53.568859 -33.916461 -53.536003 -33.824935 -53.470292 -33.768611 -53.416314 -33.742795 -53.359990 -33.705246 -53.350603 -33.686471 -53.327135 -33.613720 # -b -51.266613 -30.004287 -51.254879 -30.060611 -51.243145 -30.119282 -51.243145 -30.194381 -51.198555 -30.262439 -51.132844 -30.328150 -51.123456 -30.377434 -51.123456 -30.424371 -51.034277 -30.443145 -50.956831 -30.386821 -50.846530 -30.368047 -50.703373 -30.328150 -50.614193 -30.281214 -50.548482 -30.337538 -50.548482 -30.461920 -50.593072 -30.520591 -50.658783 -30.529978 -50.682251 -30.490082 -50.682251 -30.461920 -50.747963 -30.461920 -50.736229 -30.558140 -50.736229 -30.652014 -50.736229 -30.776396 -50.846530 -30.900778 -50.923975 -30.957102 -50.989687 -30.975877 -51.022543 -31.004039 -51.078867 -31.090872 -51.177434 -31.156583 -51.198555 -31.269231 -51.231411 -31.372492 -51.254879 -31.449938 -51.266613 -31.534424 -51.365180 -31.571973 -51.452013 -31.628297 -51.585783 -31.712783 -51.707818 -31.797269 -51.815773 -31.853593 -51.926074 -31.891143 -52.026988 -31.872368 -52.104434 -31.872368 -52.113821 -31.947467 -52.092699 -32.050727 -52.104434 -32.050727 -52.181879 -31.985016 -52.224122 -31.919305 -52.268712 -31.862981 -52.280446 -31.787882 -52.268712 -31.759720 -52.191266 -31.731558 -52.170145 -31.628297 -52.125555 -31.628297 -52.104434 -31.543811 -52.092699 -31.431163 -52.048109 -31.363105 -51.926074 -31.353717 -51.794651 -31.344330 -51.728940 -31.269231 -51.728940 -31.241069 -51.618639 -31.194133 -51.562315 -31.050976 -51.520072 -30.938328 -51.475482 -30.813945 -51.442626 -30.729459 -51.419158 -30.757621 -51.386302 -30.720072 -51.365180 -30.614464 -51.320591 -30.529978 -51.299469 -30.452533 -51.299469 -30.386821 -51.299469 -30.281214 -51.299469 -30.138057 -51.266613 -30.004287 # -b -62.369490 -40.039354 -62.280311 -39.844567 -62.247455 -39.870382 -62.148888 -39.734266 -62.104298 -39.478461 -62.158275 -39.368159 -62.313166 -39.248471 -62.346022 -38.999706 -62.357756 -38.896445 -62.313166 -38.757982 -62.214599 -38.835428 -62.071442 -38.931648 -61.806250 -38.957463 -61.552792 -38.990319 -61.299334 -38.999706 -61.055263 -38.990319 -60.834660 -38.957463 -60.658648 -38.948076 -60.428658 -38.922261 -60.273767 -38.880018 -60.020308 -38.828387 # -b -71.397765 -29.889292 -71.454089 -30.041836 -71.486945 -30.184993 -71.585512 -30.234277 -71.707547 -30.299988 -71.728669 -30.499469 -71.749790 -30.701297 -71.749790 -30.851495 -71.728669 -31.041588 -71.716935 -31.203520 -71.684079 -31.372492 -71.662957 -31.562586 -71.630102 -31.750332 -71.618368 -31.947467 -71.618368 -32.163375 -71.585512 -32.294798 -71.529188 -32.482545 -71.529188 -32.649170 -71.529188 -32.872120 -71.597246 -33.031704 -71.716935 -33.205370 -71.728669 -33.390770 -71.716935 -33.623107 -71.716935 -33.759223 -71.850704 -33.888299 -71.937537 -34.146451 -71.982127 -34.329504 -72.005595 -34.345932 -72.014983 -34.437459 -72.014983 -34.538373 -72.071307 -34.646327 -72.137018 -34.791831 -72.214464 -34.991312 -72.235585 -35.118041 -72.345887 -35.263545 -72.435066 -35.390274 -72.533633 -35.542818 -72.611079 -35.714137 -72.643935 -35.812704 -72.676790 -35.946474 -72.775357 -36.063815 -72.819947 -36.242175 -72.852803 -36.385332 -72.918514 -36.526142 -72.974838 -36.659912 -73.040550 -36.695114 -73.106261 -36.641137 -73.216562 -36.685727 -73.216562 -36.800722 -73.195441 -36.934491 -73.195441 -37.065914 -73.195441 -37.180909 -73.338598 -37.234886 -73.493489 -37.180909 -73.636646 -37.314679 -73.636646 -37.481304 -73.636646 -37.593952 -73.657767 -37.734762 -73.657767 -37.830982 -73.624912 -37.917815 -73.559200 -38.030463 -73.514610 -38.187701 -73.559200 -38.560848 -73.580322 -38.560848 -73.592056 -38.586663 -73.559200 -38.654721 -73.502876 -38.750942 -73.448899 -38.828387 -73.416043 -38.948076 -73.371453 -39.102967 -73.350332 -39.257858 -73.338598 -39.384587 -73.338598 -39.523050 -73.404309 -39.675595 -73.493489 -39.760081 -73.526345 -39.844567 -73.636646 -39.886810 -73.702357 -39.912625 # -b 172.816245 -34.467968 172.839714 -34.449193 172.839714 -34.458580 172.849101 -34.458580 172.905425 -34.467968 172.905425 -34.514904 172.917159 -34.622859 172.971136 -34.742547 173.015726 -34.796524 173.015726 -34.850502 173.027460 -34.885704 173.114293 -34.986618 173.203473 -34.951416 173.290306 -34.869276 173.313774 -34.904479 173.302040 -34.977231 173.412341 -34.977231 173.510908 -34.967843 173.611822 -35.040595 173.731511 -35.059370 173.832425 -35.049983 173.952113 -35.132122 174.008437 -35.176712 173.975582 -35.195486 173.874668 -35.230689 174.008437 -35.303441 174.085883 -35.348031 174.118739 -35.284666 174.196184 -35.338643 174.205572 -35.420783 174.261896 -35.509962 174.339341 -35.582714 174.414440 -35.636691 174.449642 -35.690669 174.449642 -35.770461 174.491886 -35.887803 174.449642 -35.852600 174.294751 -35.789236 174.205572 -35.789236 174.229040 -35.897190 174.261896 -35.913618 174.304139 -35.906577 174.372197 -35.951167 174.414440 -36.066162 174.536475 -36.164729 174.658511 -36.333701 174.757078 -36.422881 174.780546 -36.458084 174.679632 -36.547263 174.646777 -36.655218 174.670245 -36.681033 174.724222 -36.706848 174.724222 -36.812456 174.658511 -36.821843 174.592799 -36.875820 174.635042 -36.911023 174.691366 -36.911023 174.757078 -36.946225 174.780546 -36.972041 174.846258 -36.972041 174.900235 -36.972041 174.956559 -36.946225 175.076247 -36.936838 175.153693 -36.965000 175.177161 -37.087036 175.219404 -37.202030 175.329706 -37.237233 175.407151 -37.157441 175.407151 -36.965000 175.397764 -36.777253 175.386030 -36.697461 175.320318 -36.617669 175.275728 -36.566038 175.353174 -36.556651 175.407151 -36.645831 175.540921 -36.681033 175.660609 -36.697461 175.660609 -36.786641 175.660609 -36.850005 175.705199 -36.875820 175.716933 -37.000203 175.749789 -37.079995 175.749789 -37.157441 175.738055 -37.211418 175.749789 -37.256008 175.761523 -37.307638 175.827235 -37.368656 175.871825 -37.457835 175.881212 -37.518853 175.904680 -37.615073 176.036103 -37.694866 176.202728 -37.694866 176.399862 -37.816901 176.632199 -37.877919 176.897392 -37.929549 177.040548 -37.999954 177.139116 -38.016382 177.216561 -38.016382 177.303394 -37.929549 177.380840 -37.929549 177.458285 -37.833329 177.523996 -37.772311 177.601442 -37.737109 177.690622 -37.666704 177.756333 -37.640889 177.833779 -37.605686 177.887756 -37.563443 177.988670 -37.535281 178.141214 -37.563443 178.263250 -37.615073 178.385285 -37.685478 178.385285 -37.755884 178.361817 -37.877919 178.328961 -37.964752 178.296105 -38.035157 178.274984 -38.077400 178.274984 -38.190048 178.274984 -38.312083 178.251515 -38.356673 178.263250 -38.450547 178.218660 -38.581970 178.054381 -38.666456 177.911224 -38.711045 177.887756 -38.795532 177.878369 -38.908180 177.845513 -38.959810 177.854900 -39.079499 177.911224 -39.105314 177.911224 -39.156944 177.810310 -39.260205 177.789189 -39.166331 177.768067 -39.088886 177.678888 -39.063071 177.556852 -39.063071 177.425429 -39.088886 177.282272 -39.088886 177.171971 -39.124088 177.082791 -39.192147 176.951369 -39.328263 176.873923 -39.396321 176.775356 -39.499582 176.787090 -39.558253 176.829333 -39.541825 176.885657 -39.661514 176.972490 -39.713144 176.951369 -39.830486 176.862189 -39.992417 # -b 175.001149 -40.034660 174.855645 -39.914972 174.635042 -39.891504 174.426174 -39.804671 174.271283 -39.694369 174.107005 -39.577028 173.898136 -39.551212 173.722124 -39.389281 173.743245 -39.217962 173.919258 -39.079499 174.095270 -39.002053 174.339341 -38.943382 174.491886 -38.814306 174.559944 -38.607785 174.569331 -38.441159 174.592799 -38.295656 174.646777 -38.138418 174.768812 -38.147805 174.801668 -38.103215 174.801668 -38.051585 174.801668 -37.964752 174.768812 -37.842716 174.855645 -37.772311 174.813402 -37.720681 174.757078 -37.528241 174.789934 -37.361615 174.724222 -37.387430 174.559944 -37.256008 174.524741 -37.166828 174.635042 -37.150400 174.691366 -37.096423 174.712488 -37.042446 174.703101 -36.990815 174.613921 -36.972041 174.426174 -37.007243 174.339341 -36.857046 174.229040 -36.697461 174.160982 -36.547263 174.139860 -36.502674 174.160982 -36.547263 174.196184 -36.601241 174.250161 -36.662258 174.315873 -36.610628 174.339341 -36.432269 174.261896 -36.432269 174.196184 -36.397066 174.238427 -36.352476 174.229040 -36.272684 174.238427 -36.190545 174.160982 -36.155342 174.118739 -36.209319 173.996703 -36.190545 173.975582 -36.272684 174.008437 -36.352476 174.008437 -36.387679 173.764367 -36.066162 173.611822 -35.906577 173.445197 -35.735259 173.346630 -35.592102 173.334896 -35.538124 173.412341 -35.455985 173.478053 -35.348031 173.424076 -35.312828 173.391220 -35.383233 173.269184 -35.474760 173.137762 -35.348031 173.060316 -35.202527 173.069703 -35.139162 173.081438 -35.113347 173.069703 -35.068757 173.036848 -34.967843 172.950015 -34.859889 172.872569 -34.758975 172.795124 -34.660408 172.684822 -34.559494 172.651967 -34.496130 172.738800 -34.477355 172.816245 -34.467968 # -b 153.330473 -29.720320 153.264762 -30.046530 153.229559 -30.217849 153.196704 -30.257745 153.119258 -30.429064 153.053547 -30.562834 153.032425 -30.762315 153.032425 -30.828026 153.020691 -30.849148 153.053547 -30.999345 153.065281 -31.142502 153.008957 -31.245763 152.999569 -31.339636 # -b 152.999569 -31.339636 152.800088 -31.764413 152.788354 -31.811350 152.734377 -31.942773 152.645197 -32.036646 152.567752 -32.158682 152.457450 -32.261943 152.457450 -32.365203 152.492653 -32.459077 152.415207 -32.550603 152.293172 -32.663251 152.239195 -32.710188 152.105425 -32.719575 152.084304 -32.766512 152.171137 -32.813449 151.974002 -32.858039 151.851967 -32.914363 151.797990 -33.043439 151.687689 -33.174861 151.577387 -33.404851 151.443618 -33.562089 151.323929 -33.580864 151.267605 -33.609026 151.246484 -33.672390 151.366172 -33.709940 151.356785 -33.902380 151.255871 -34.076046 151.213628 -34.085433 151.190160 -34.223897 151.035268 -34.388175 150.969557 -34.578269 150.892111 -34.815299 150.849868 -34.942028 150.793544 -35.078145 150.781810 -35.240076 150.739567 -35.204874 150.638653 -35.141509 150.584676 -35.258851 150.507230 -35.430170 150.408663 -35.528737 150.364074 -35.683628 150.298362 -35.709443 150.242038 -35.808010 150.220917 -36.023919 150.176327 -36.167076 150.155205 -36.282071 150.209182 -36.397066 150.164593 -36.460431 150.143471 -36.638790 150.077760 -36.735010 150.021436 -36.850005 # -b 149.988580 -37.079995 150.012048 -37.141013 150.044904 -37.220805 150.054291 -37.380390 150.021436 -37.502425 # -b 150.021436 -37.502425 150.021436 -37.502425 # -b 150.021436 -36.850005 149.979193 -36.990815 149.988580 -37.079995 # -b 150.021436 -37.502425 149.979193 -37.598646 149.833689 -37.537628 149.767977 -37.547015 149.735122 -37.739456 149.537988 -37.781699 149.371362 -37.816901 149.096783 -37.826289 148.843324 -37.826289 148.566398 -37.826289 148.378651 -37.835676 148.158049 -37.896694 147.949180 -37.974139 147.740312 -38.060972 147.573687 -38.183008 147.453998 -38.253413 147.331963 -38.321471 147.266251 -38.382489 147.200540 -38.427078 147.155950 -38.504524 146.935347 -38.617172 146.836780 -38.704005 146.768722 -38.642987 146.681889 -38.659415 146.515264 -38.704005 146.383841 -38.694618 146.306396 -38.711045 146.294661 -38.840121 146.350985 -38.910526 146.428431 -38.823694 146.538732 -38.755635 146.625565 -38.755635 146.548120 -38.910526 146.526998 -39.056030 146.449553 -39.133476 146.306396 -38.978585 146.196094 -38.875324 146.118649 -38.875324 145.963758 -38.823694 145.876925 -38.685230 145.799479 -38.678190 145.677444 -38.685230 145.546021 -38.572582 145.522553 -38.488096 145.578877 -38.330858 145.456841 -38.234638 145.325419 -38.314430 145.236239 -38.375448 145.060226 -38.427078 144.863092 -38.366061 144.785646 -38.288615 145.027370 -38.288615 145.071960 -38.131377 145.050839 -37.938937 144.884214 -37.870878 144.773912 -37.922509 144.586165 -38.044544 144.410153 -38.060972 144.487598 -38.096175 144.663611 -38.183008 144.675345 -38.227597 144.508720 -38.244025 144.311586 -38.321471 144.123839 -38.443506 143.947826 -38.650028 143.814057 -38.704005 143.682634 -38.755635 143.626310 -38.772063 143.384586 -38.823694 143.307140 -38.746248 142.943381 -38.617172 142.612477 -38.443506 142.448199 -38.391876 142.183006 -38.366061 141.950670 -38.305043 141.807513 -38.262800 141.654968 -38.288615 141.532933 -38.366061 141.500077 -38.375448 141.488343 -38.366061 141.356920 -38.201782 141.026017 -38.053932 140.683379 -38.028116 140.418186 -37.903734 140.253908 -37.748843 140.143607 -37.554056 # -b 147.904590 -39.797630 147.970302 -39.748347 148.047747 -39.790590 148.136927 -39.865688 148.280084 -39.959562 # -b 148.104071 -40.121493 147.993770 -39.959562 147.904590 -39.907931 147.860000 -39.865688 147.904590 -39.797630 # -b 140.143607 -37.554056 139.955860 -37.450795 139.812703 -37.194990 139.723523 -37.009590 139.714136 -36.929798 139.800969 -36.779600 139.812703 -36.584813 139.723523 -36.397066 139.681280 -36.272684 139.636690 -36.167076 139.592100 -36.113099 139.514655 -36.033307 139.392619 -35.906577 139.261197 -35.744646 139.216607 -35.700056 139.261197 -35.610876 139.338642 -35.458332 139.317521 -35.420783 139.183751 -35.430170 139.052328 -35.439557 138.942027 -35.474760 138.885703 -35.512309 138.775402 -35.556899 138.599389 -35.620264 138.479700 -35.655466 138.402255 -35.655466 138.291954 -35.674241 138.158184 -35.629651 138.291954 -35.474760 138.435111 -35.240076 138.500822 -35.005393 138.489088 -34.761322 138.378787 -34.496130 138.223895 -34.315423 138.092473 -34.223897 137.982171 -34.413990 137.871870 -34.568881 137.860136 -34.761322 137.794425 -34.942028 137.761569 -35.122735 137.728713 -35.169671 137.573822 -35.132122 137.376688 -35.214261 137.156085 -35.214261 136.980073 -35.312828 136.858037 -35.214261 136.902627 -35.087532 136.944870 -34.932641 137.198328 -34.951416 137.397809 -34.862236 137.454133 -34.641633 137.475255 -34.470314 137.442399 -34.442152 137.430665 -34.388175 137.454133 -34.296649 137.454133 -34.158185 137.496377 -34.085433 137.564435 -33.975132 137.674736 -33.738102 137.785037 -33.681778 137.883604 -33.524540 137.883604 -33.395464 137.883604 -33.219451 137.895339 -33.146699 137.993906 -33.165474 137.970437 -33.052826 137.928194 -32.951912 137.916460 -32.942525 137.916460 -32.794674 137.839014 -32.757125 137.839014 -32.588153 137.761569 -32.515401 137.707592 -32.644477 137.716979 -32.804061 137.716979 -32.951912 137.618412 -32.970687 137.486989 -33.156087 137.397809 -33.322712 137.275774 -33.498725 137.254653 -33.609026 137.165473 -33.728714 136.968339 -33.719327 136.890893 -33.747489 136.869772 -33.829628 136.616313 -33.930542 136.515399 -34.022069 136.395711 -34.066659 136.285410 -34.296649 136.142253 -34.432765 136.097663 -34.479702 135.921650 -34.597043 135.865326 -34.770709 135.853592 -34.780097 135.954506 -34.770709 135.954506 -35.033555 135.853592 -34.951416 135.722169 -34.988965 135.555544 -34.805912 135.370144 -34.723773 135.269230 -34.615818 135.116686 -34.606431 135.104952 -34.460927 135.182397 -34.496130 135.280964 -34.561841 135.391265 -34.634593 135.424121 -34.496130 135.370144 -34.287261 135.269230 -34.186347 135.226987 -33.965745 135.093217 -33.782692 134.928939 -33.681778 134.851493 -33.414239 134.774048 -33.332099 134.696602 -33.203023 134.598035 -33.228839 134.389167 -33.156087 134.222542 -33.062213 134.091119 -32.923750 134.091119 -32.766512 134.177952 -32.775899 134.222542 -32.559991 134.001939 -32.506013 133.837661 -32.477851 133.441045 -32.139907 133.340132 -32.102358 133.372987 -32.205618 133.372987 -32.224393 133.208709 -32.205618 133.020962 -32.102358 132.624347 -31.942773 132.514046 -31.961548 132.424866 -32.017872 132.359154 -32.046034 132.314565 -32.036646 # -b 132.314565 -32.036646 132.293443 -32.027259 132.194876 -31.989710 132.039985 -31.867674 131.687960 -31.614216 131.476744 -31.557892 131.267876 -31.529730 131.091863 -31.529730 130.892382 -31.520343 130.573213 -31.557892 130.286899 -31.586054 # -b 136.548255 -35.817398 136.592845 -35.772808 136.801713 -35.700056 136.980073 -35.664853 137.165473 -35.620264 137.308630 -35.592102 137.442399 -35.629651 137.552701 -35.636691 137.573822 -35.744646 137.684123 -35.772808 137.839014 -35.798623 137.993906 -35.798623 138.104207 -35.915965 137.883604 -35.897190 137.639533 -35.915965 137.618412 -35.995757 137.486989 -36.077896 137.299242 -36.033307 137.078640 -36.040347 136.879159 -36.040347 136.649169 -36.023919 136.538868 -35.880762 136.548255 -35.817398 # -b 130.286899 -31.586054 129.955995 -31.576667 129.535912 -31.567279 129.183887 -31.576667 128.808393 -31.726864 128.468102 -31.867674 128.092608 -32.083583 127.904861 -32.083583 127.630282 -32.111745 127.332234 -32.224393 126.956740 -32.271330 126.691548 -32.261943 126.592981 -32.271330 126.306667 -32.261943 126.086064 -32.215006 125.820872 -32.271330 125.633125 -32.412140 125.391401 -32.522441 125.149677 -32.644477 124.839895 -32.710188 124.685004 -32.822836 124.541847 -32.876813 124.332978 -32.895588 124.100642 -33.008236 124.002075 -33.193636 123.924629 -33.423626 123.837796 -33.508112 123.727495 -33.653616 123.659437 -33.782692 123.528014 -33.820241 123.307411 -33.864831 123.152520 -33.864831 122.976508 -33.810854 122.744171 -33.829628 122.591627 -33.848403 122.380411 -33.892993 122.183277 -33.930542 122.084710 -33.829628 121.995531 -33.782692 121.885229 -33.820241 121.598915 -33.848403 121.289133 -33.792079 121.068531 -33.792079 120.772829 -33.902380 120.484169 -33.902380 120.209589 -33.892993 120.188467 -33.892993 120.176733 -33.892993 # -b 120.176733 -33.892993 119.988986 -33.883606 119.789505 -33.956357 119.613493 -34.085433 119.526660 -34.195735 119.559516 -34.277874 119.526660 -34.287261 119.404625 -34.388175 119.205144 -34.423378 118.885974 -34.451540 118.799141 -34.514904 118.620782 -34.606431 118.456503 -34.751935 118.367323 -34.862236 118.235901 -34.951416 118.081010 -34.996005 117.904997 -34.925600 117.883875 -35.078145 117.750106 -35.033555 117.597561 -35.087532 117.475526 -34.970190 117.398080 -34.979578 117.132888 -34.996005 116.879430 -35.005393 116.593116 -34.970190 116.539139 -34.916213 116.471081 -34.862236 116.438225 -34.862236 116.306802 -34.805912 116.306802 -34.824686 116.119055 -34.805912 115.943043 -34.660408 115.844476 -34.578269 115.698972 -34.432765 115.501838 -34.296649 115.337559 -34.242671 115.093488 -34.205122 115.081754 -34.050231 115.072367 -33.892993 115.060633 -33.754530 115.072367 -33.571477 115.072367 -33.552702 # -b 115.072367 -33.552702 115.081754 -33.543314 115.105223 -33.562089 115.260114 -33.609026 115.424392 -33.580864 115.612139 -33.332099 115.722440 -33.118537 115.722440 -32.970687 115.644995 -32.775899 115.644995 -32.550603 115.666116 -32.644477 115.734174 -32.477851 115.710706 -32.290105 115.698972 -32.149294 115.743562 -31.877062 115.698972 -31.661153 115.600405 -31.482793 115.501838 -31.302087 115.391536 -31.076791 115.346947 -30.896084 115.248380 -30.790477 115.126344 -30.619158 115.006655 -30.342231 114.962066 -30.105201 # -b 30.954755 -29.929188 30.776396 -30.208462 30.656707 -30.398555 30.555793 -30.569874 30.391515 -30.759968 30.260092 -30.950062 30.060611 -31.196479 # -b 30.060611 -31.196479 29.861130 -31.358411 29.631140 -31.536770 29.455128 -31.649419 29.288502 -31.820738 29.178201 -31.952160 29.002189 -32.177456 28.781586 -32.372244 28.528128 -32.616315 28.274670 -32.773553 28.152634 -32.867426 27.976622 -33.043439 27.800609 -33.181902 27.633984 -33.273428 27.481439 -33.367302 27.281958 -33.486990 27.127067 -33.578517 26.929933 -33.672390 26.721065 -33.745142 26.521584 -33.773304 26.322103 -33.763917 26.136703 -33.754530 25.916100 -33.763917 25.761209 -33.789732 25.660295 -33.836669 25.627440 -33.864831 25.695498 -34.000947 25.683764 -34.111249 25.397450 -34.076046 25.165113 -34.019722 24.944511 -34.038497 24.813088 -34.230937 24.559630 -34.230937 24.327293 -34.167573 24.040979 -34.101861 23.874354 -34.066659 23.620896 -34.029109 23.379172 -34.047884 23.224280 -34.158185 23.081123 -34.167573 22.883989 -34.111249 22.651653 -34.057271 22.496762 -34.047884 22.353605 -34.066659 22.189326 -34.085433 22.100146 -34.167573 21.989845 -34.230937 21.825567 -34.284914 21.792711 -34.404603 21.682410 -34.432765 21.536906 -34.423378 21.295182 -34.404603 21.241205 -34.458580 21.062845 -34.432765 20.898567 -34.413990 20.731942 -34.442152 20.666230 -34.496130 20.567663 -34.496130 20.480830 -34.505517 20.335326 -34.514904 20.269615 -34.587656 20.149926 -34.704998 # -b 20.149926 -34.704998 19.983301 -34.742547 19.861266 -34.742547 19.774433 -34.742547 19.685253 -34.723773 19.619542 -34.695611 19.464651 -34.704998 19.354349 -34.651021 19.288638 -34.632246 19.255782 -34.604084 19.267516 -34.496130 19.190071 -34.423378 19.023446 -34.423378 18.847433 -34.442152 18.760600 -34.404603 18.781722 -34.303689 18.769987 -34.120636 18.605709 -34.111249 18.471939 -34.130023 18.429696 -34.186347 18.429696 -34.294302 18.450818 -34.395216 18.417962 -34.413990 18.319395 -34.275527 18.307661 -34.111249 18.319395 -33.993907 18.361638 -33.918808 18.396841 -33.874218 18.385106 -33.754530 18.241949 -33.606679 18.131648 -33.423626 18.054203 -33.376689 17.943901 -33.219451 18.009613 -33.200677 17.965023 -33.099763 17.845334 -33.024664 17.800744 -33.015277 17.812479 -32.848651 17.866456 -32.745391 18.075324 -32.820489 18.164504 -32.707841 18.251337 -32.569378 18.230215 -32.231434 18.209094 -31.942773 18.098793 -31.745639 17.932167 -31.527383 17.800744 -31.339636 17.702177 -31.226988 17.601263 -31.065057 17.502696 -30.818639 17.380661 -30.675482 17.293828 -30.504163 17.183527 -30.304682 17.094347 -30.102854 # -b -68.642581 -50.018097 -68.663702 -49.933611 -68.684824 -49.783414 -68.630847 -49.870246 # -b -67.990161 -50.067381 -67.837616 -49.954733 -67.748436 -49.776373 -67.682725 -49.598014 -67.617014 -49.412614 -67.593545 -49.339862 -67.748436 -49.419654 -67.703847 -49.274150 -67.539568 -49.037120 -67.307231 -48.898657 -67.262642 -48.884576 -67.175809 -48.811824 -67.009183 -48.687442 -66.866026 -48.635811 -66.678280 -48.520816 -66.525735 -48.448064 -66.391966 -48.358885 -66.215953 -48.241543 -66.072796 -48.175832 -65.929639 -48.175832 -65.908518 -48.042062 -65.763014 -48.004513 -65.786482 -47.887171 -65.863928 -47.739320 -65.798217 -47.701771 -65.664447 -47.553920 -65.664447 -47.352092 -65.709037 -47.215976 -65.840460 -47.126796 -66.061062 -47.147918 -66.293399 -47.140877 -66.502267 -47.096287 -66.746338 -47.021189 -66.943472 -46.870991 -67.142953 -46.711406 -67.307231 -46.619880 -67.441001 -46.476723 -67.551302 -46.300710 -67.584158 -46.209184 -67.572424 -46.141125 -67.527834 -46.002662 -67.417533 -45.871239 -67.318966 -45.763285 -67.262642 -45.655331 -67.164075 -45.547376 -67.086629 -45.486358 -67.009183 -45.422994 -66.856639 -45.298612 -66.668892 -45.237594 -66.481146 -45.237594 -66.359110 -45.120252 -66.171363 -45.049847 -65.983616 -45.059234 -65.852194 -45.073315 -65.655060 -45.082703 -65.565880 -45.082703 -65.509556 -45.002910 -65.521290 -44.941893 -65.619857 -44.761186 -65.500168 -44.627417 -65.366399 -44.587521 -65.279566 -44.524156 -65.202120 -44.376305 -65.202120 -44.169784 -65.178652 -43.986731 -65.246710 -43.787250 -65.202120 -43.627665 -65.047229 -43.484508 -64.981518 -43.371860 -64.904072 -43.282680 -64.749181 -43.226356 -64.606024 -43.170032 -64.528579 -43.139523 -64.430012 -43.097280 -64.352566 -43.057384 -64.286855 -43.040956 # -b -64.286855 -43.040956 -64.275121 -43.010447 -64.373688 -42.977592 -64.519191 -42.944736 -64.716326 -42.928308 -64.871217 -42.871984 -65.026108 -42.815660 -65.026108 -42.733521 -64.936928 -42.670156 -64.838361 -42.660769 -64.716326 -42.571589 -64.561434 -42.531693 -64.364300 -42.571589 -64.265733 -42.653728 -64.253999 -42.815660 -64.110842 -42.864944 -63.944217 -42.871984 -63.747083 -42.815660 -63.613313 -42.742908 -63.580457 -42.595058 -63.625047 -42.360374 -63.636781 -42.245379 -63.779938 -42.081101 -64.000541 -42.196096 -64.298589 -42.212523 -64.176553 -42.268848 -64.120229 -42.383842 -64.275121 -42.426085 -64.483989 -42.456594 -64.594290 -42.393230 -64.519191 -42.294663 -64.760915 -42.238339 -65.014374 -42.064673 -65.035495 -41.876926 -65.035495 -41.611734 -65.047229 -41.431027 -65.157531 -41.172876 -65.157531 -40.872481 -64.958050 -40.689427 -64.859482 -40.780954 -64.793771 -40.846665 -64.519191 -40.905336 -64.352566 -40.964007 -64.143698 -41.032065 -63.967685 -41.123592 -63.801060 -41.163488 -63.547602 -41.172876 -63.315265 -41.172876 -63.106397 -41.182263 -62.864673 -41.081349 -62.688660 -41.039106 -62.500913 -40.973395 -62.378878 -40.872481 -62.324901 -40.755139 -62.313166 -40.654225 -62.369490 -40.454744 -62.402346 -40.250569 -62.369490 -40.039354 # -b -73.702357 -39.912625 -73.714091 -40.039354 -73.702357 -40.065169 -73.702357 -40.184858 -73.714091 -40.393726 -73.723479 -40.562698 -73.812658 -40.738711 -73.845514 -40.898296 -73.866636 -41.064921 -73.878370 -41.271443 -73.857248 -41.431027 -73.800924 -41.529594 -73.714091 -41.555410 -73.657767 -41.637549 -73.681236 -41.719688 -73.559200 -41.768972 -73.427778 -41.801827 -73.272886 -41.768972 -73.195441 -41.752544 -73.106261 -41.693873 -73.085140 -41.595306 -72.974838 -41.546022 -72.808213 -41.555410 -72.688524 -41.661017 -72.578223 -41.703260 -72.479656 -41.703260 -72.357621 -41.661017 -72.313031 -41.653977 -72.313031 -41.670405 -72.423332 -41.752544 -72.533633 -41.778359 -72.709646 -41.867539 -72.765970 -41.998961 -72.611079 -42.048245 -72.456188 -42.048245 -72.444454 -42.156199 -72.423332 -42.334559 -72.423332 -42.489450 -72.512512 -42.301703 -72.655669 -42.278235 -72.733114 -42.409658 -72.632200 -42.538734 -72.533633 -42.611485 -72.665056 -42.588017 -72.808213 -42.733521 -72.775357 -42.879025 -72.754236 -43.017488 -72.819947 -43.170032 -72.852803 -43.259212 -72.951370 -43.331964 -72.995960 -43.388288 -73.019428 -43.477468 -73.007694 -43.564300 -72.951370 -43.597156 -72.897393 -43.627665 -72.909127 -43.653480 -72.930248 -43.716845 -72.885659 -43.787250 -72.986573 -43.867042 -73.052284 -43.963262 -73.085140 -44.059483 -73.150851 -44.099379 -73.207175 -44.129888 -73.228297 -44.169784 -73.249418 -44.169784 # -b -73.249418 -44.169784 -73.249418 -44.193252 -73.195441 -44.249576 -73.061671 -44.289473 -72.951370 -44.352837 -72.852803 -44.430283 -72.754236 -44.453751 -72.688524 -44.549971 -72.688524 -44.650885 -72.688524 -44.784655 -72.721380 -44.862100 -72.831681 -44.932505 -72.909127 -45.002910 -73.061671 -45.035766 -73.249418 -45.026379 -73.338598 -45.066275 -73.338598 -45.153108 -73.371453 -45.268103 -73.371453 -45.284531 -73.207175 -45.298612 -72.951370 -45.408913 -72.831681 -45.408913 -72.819947 -45.500439 -72.930248 -45.516867 -72.930248 -45.066275 -73.106261 -45.439422 -73.261152 -45.361976 -73.338598 -45.378404 -73.437165 -45.439422 -73.502876 -45.509827 -73.526345 -45.594313 -73.526345 -45.641250 -73.448899 -45.610741 -73.305742 -45.563804 -73.171972 -45.554417 -73.171972 -45.610741 -73.305742 -45.648290 -73.392575 -45.718695 -73.392575 -45.772672 -73.272886 -45.786753 -73.240031 -45.803181 -73.272886 -45.810222 -73.392575 -45.817262 -73.470021 -45.833690 -73.502876 -45.847771 -73.547466 -45.911136 -73.559200 -46.016743 -73.570934 -46.117657 -73.592056 -46.225612 -73.570934 -46.192756 -73.514610 -46.131738 -73.460633 -46.056639 -73.427778 -45.979194 -73.359719 -45.911136 -73.272886 -45.871239 -73.282274 -45.965113 -73.371453 -46.110617 -73.416043 -46.209184 -73.416043 -46.263161 -73.526345 -46.300710 -73.657767 -46.385196 -73.723479 -46.439174 -73.746947 -46.528353 -73.833780 -46.551822 -73.833780 -46.476723 -73.800924 -46.338260 -73.812658 -46.263161 -73.911226 -46.338260 -74.000405 -46.460295 -74.122441 -46.446214 -74.209274 -46.347647 -74.164684 -46.277242 -74.054382 -46.178675 -74.066117 -46.094189 -74.155296 -46.155206 -74.164684 -46.080108 -74.131828 -45.986234 -74.197539 -45.965113 -74.232742 -45.932257 -74.340696 -45.887667 -74.474466 -45.955725 -74.551912 -45.911136 -74.704456 -45.887667 -74.849960 -45.894708 -75.025972 -45.925217 -75.014238 -46.033171 -74.969648 -46.094189 -74.903937 -46.124698 -74.805370 -46.101229 -74.749046 -46.124698 -74.749046 -46.216224 -74.915671 -46.277242 -75.058828 -46.293670 -75.201985 -46.439174 -75.345142 -46.528353 -75.488299 -46.582330 -75.532889 -46.711406 -75.565744 -46.840482 -75.532889 -46.953130 -75.345142 -46.976599 -75.300552 -46.861604 -75.345142 -46.765384 -75.422587 -46.725487 -75.312286 -46.657429 -75.157395 -46.605799 -75.047094 -46.666817 -74.948527 -46.748956 -74.793636 -46.793546 -74.683334 -46.840482 -74.584767 -46.817014 -74.483853 -46.741915 -74.340696 -46.734875 -74.221008 -46.793546 -74.087238 -46.885072 -74.033261 -46.967211 -73.976937 -47.004761 -74.155296 -47.119756 -74.087238 -47.171386 -74.021527 -47.208935 -74.176418 -47.239444 -74.364165 -47.314543 -74.462732 -47.434232 -74.408755 -47.471781 -74.286719 -47.516371 -74.176418 -47.560961 -74.021527 -47.589123 -74.155296 -47.664221 -74.164684 -47.722892 -74.131828 -47.753401 -74.077851 -47.790951 -73.967550 -47.805032 -73.845514 -47.797991 -73.800924 -47.715852 -73.746947 -47.790951 -73.690623 -47.952882 -73.570934 -48.124201 -73.427778 -48.182872 -73.338598 -48.218075 -73.460633 -48.227462 -73.636646 -48.145323 -73.746947 -48.079611 -73.911226 -48.049102 -74.131828 -48.027981 -74.197539 -48.065530 -74.176418 -48.182872 -74.176418 -48.241543 -74.242129 -48.124201 -74.340696 -48.004513 -74.483853 -47.983391 -74.495587 -48.117161 -74.483853 -48.234502 -74.408755 -48.321335 -74.364165 -48.438677 -74.307841 -48.483267 -74.197539 -48.455105 -74.033261 -48.431637 -73.934694 -48.417556 -73.857248 -48.365925 -73.812658 -48.513776 -73.756334 -48.607649 -73.944081 -48.504388 -74.122441 -48.504388 -74.232742 -48.520816 -74.274985 -48.659280 -74.155296 -48.746112 -74.232742 -48.739072 -74.298453 -48.804783 -74.307841 -48.919778 -74.307841 -49.044161 -74.298453 -49.173236 -74.286719 -49.253029 -74.274985 -49.346902 -74.242129 -49.433735 -74.143562 -49.468938 -74.054382 -49.353943 -74.021527 -49.245988 -73.857248 -49.152115 -73.779803 -49.130993 -73.857248 -49.304659 -73.890104 -49.382105 -73.934694 -49.468938 -73.890104 -49.541690 -73.779803 -49.576892 -73.779803 -49.612095 -73.857248 -49.612095 -73.967550 -49.583933 -74.077851 -49.626176 -74.242129 -49.705968 -74.242129 -49.769333 -74.242129 -49.776373 -74.286719 -49.818616 -74.298453 -49.926571 # -b -73.878370 -41.752544 -73.833780 -41.726729 -73.833780 -41.745503 -73.824393 -41.834683 -73.812658 -41.876926 -73.746947 -41.867539 -73.681236 -41.867539 -73.603790 -41.883967 -73.570934 -41.933250 -73.526345 -42.024777 -73.481755 -42.123344 -73.470021 -42.196096 -73.404309 -42.327518 -73.392575 -42.400270 -73.547466 -42.426085 -73.636646 -42.571589 -73.702357 -42.555161 -73.746947 -42.620873 -73.756334 -42.660769 -73.681236 -42.759336 -73.580322 -42.775764 -73.538079 -42.864944 -73.702357 -42.879025 -73.681236 -42.961164 -73.592056 -43.090240 -73.580322 -43.212275 -73.746947 -43.202888 -73.702357 -43.364820 -73.779803 -43.444612 -73.944081 -43.435225 -74.286719 -43.364820 -74.397020 -43.195847 -74.298453 -43.057384 -74.242129 -42.904840 -74.176418 -42.733521 -74.164684 -42.578630 -74.188152 -42.426085 -74.176418 -42.278235 -74.110707 -42.113956 -74.098972 -41.966106 -74.066117 -41.883967 -73.988671 -41.860498 -73.911226 -41.768972 -73.878370 -41.752544 # -b -73.007694 -44.406814 -72.995960 -44.446711 -72.951370 -44.453751 -72.909127 -44.477219 -72.819947 -44.500688 -72.775357 -44.564052 -72.765970 -44.610989 -72.798826 -44.690781 -72.808213 -44.697822 -72.808213 -44.707209 -72.808213 -44.838632 -72.986573 -44.932505 -73.129729 -44.955974 -73.261152 -44.932505 -73.350332 -44.848019 -73.416043 -44.730678 -73.448899 -44.620376 -73.305742 -44.533543 -73.150851 -44.463138 -73.007694 -44.406814 # -b -74.298453 -44.650885 -74.319575 -44.660273 -74.298453 -44.643845 -74.209274 -44.643845 -74.110707 -44.643845 -74.033261 -44.660273 -73.967550 -44.681394 -73.955815 -44.714250 -74.077851 -44.761186 -74.197539 -44.784655 -74.232742 -44.744759 -74.274985 -44.707209 -74.298453 -44.650885 # -b -74.232742 -45.049847 -74.331309 -45.026379 -74.319575 -44.988829 -74.274985 -44.965361 -74.155296 -44.925465 -74.000405 -44.941893 -73.967550 -44.972402 -73.976937 -44.988829 -74.110707 -45.019338 -74.232742 -45.049847 # -b -74.164684 -45.129640 -74.232742 -45.129640 -74.188152 -45.106171 -74.110707 -45.106171 -73.955815 -45.089743 -73.812658 -45.082703 -73.746947 -45.190657 -73.746947 -45.291571 -73.866636 -45.244634 -74.000405 -45.160148 -74.098972 -45.153108 -74.164684 -45.129640 # -b -74.143562 -45.237594 -74.188152 -45.221166 -74.155296 -45.230553 -74.087238 -45.244634 -73.988671 -45.284531 -73.911226 -45.338508 -73.857248 -45.392485 -73.890104 -45.369017 -73.988671 -45.354936 -74.054382 -45.322080 -74.143562 -45.237594 # -b -73.866636 -45.796141 -73.824393 -45.772672 -73.768069 -45.826650 -73.746947 -45.932257 -73.756334 -45.941644 -73.857248 -45.948685 -73.878370 -45.847771 -73.878370 -45.779713 -73.866636 -45.826650 -73.866636 -45.796141 # -b -74.298453 -47.776870 -74.450998 -47.783910 -74.629357 -47.732280 -74.617623 -47.643100 -74.528443 -47.605551 -74.474466 -47.560961 -74.397020 -47.605551 -74.307841 -47.664221 -74.265598 -47.760442 -74.298453 -47.776870 # -b -74.981382 -47.701771 -74.981382 -47.753401 -75.070562 -47.835540 -75.213719 -47.849621 -75.300552 -47.812072 -75.291165 -47.805032 -75.255962 -47.753401 -75.201985 -47.739320 -75.079949 -47.701771 -74.981382 -47.701771 # -b -75.136273 -48.093692 -75.136273 -48.079611 -75.103418 -48.086652 -75.002504 -48.124201 -74.915671 -48.131242 -74.814757 -48.159404 -74.781901 -48.203994 -74.793636 -48.300214 -74.838225 -48.328376 -74.936792 -48.344804 -75.025972 -48.248583 -75.124539 -48.117161 -75.136273 -48.093692 # -b -75.443709 -48.168791 -75.455443 -48.072571 -75.443709 -48.072571 -75.399119 -48.065530 -75.324020 -48.027981 -75.300552 -48.065530 -75.267696 -48.159404 -75.246575 -48.218075 -75.201985 -48.300214 -75.157395 -48.396434 -75.103418 -48.462145 -75.070562 -48.513776 -75.070562 -48.570100 -75.112805 -48.607649 -75.169129 -48.541938 -75.213719 -48.417556 -75.300552 -48.365925 -75.377998 -48.300214 -75.443709 -48.168791 # -b -74.915671 -48.410515 -74.915671 -48.403475 -74.838225 -48.417556 -74.772514 -48.438677 -74.695068 -48.438677 -74.638744 -48.520816 -74.528443 -48.593568 -74.507322 -48.628771 -74.594155 -48.614690 -74.739658 -48.586528 -74.871081 -48.541938 -74.936792 -48.476226 -74.948527 -48.417556 -74.915671 -48.410515 # -b -75.467177 -48.607649 -75.488299 -48.541938 -75.488299 -48.520816 -75.488299 -48.497348 -75.443709 -48.476226 -75.377998 -48.462145 -75.324020 -48.504388 -75.300552 -48.570100 -75.291165 -48.621730 -75.356876 -48.694482 -75.434322 -48.746112 -75.476565 -48.687442 -75.467177 -48.607649 # -b -75.014238 -48.985490 -74.981382 -48.971409 -75.002504 -48.912738 -75.014238 -48.870495 -74.993117 -48.804783 -74.892203 -48.724991 -74.793636 -48.680401 -74.671600 -48.739072 -74.573033 -48.825905 -74.507322 -48.936206 -74.474466 -49.065282 -74.462732 -49.210786 -74.441610 -49.382105 -74.441610 -49.640257 -74.429876 -49.790454 -74.441610 -49.919530 # -b -74.727924 -50.046259 -74.849960 -49.933611 -74.849960 -49.804535 -74.849960 -49.720049 -74.849960 -49.633216 -74.805370 -49.562811 -74.814757 -49.518221 -74.903937 -49.483019 -75.079949 -49.433735 -75.190251 -49.339862 -75.234841 -49.304659 -75.201985 -49.260069 -75.112805 -49.274150 -74.981382 -49.332821 -74.960261 -49.196705 -75.070562 -49.187317 -75.169129 -49.116912 -75.124539 -49.044161 -75.014238 -48.985490 # -b -75.521154 -49.705968 -75.532889 -49.698928 -75.532889 -49.691887 -75.544623 -49.647297 -75.509420 -49.633216 -75.443709 -49.633216 -75.389732 -49.640257 -75.324020 -49.748211 -75.223106 -49.846778 -75.267696 -49.863206 -75.422587 -49.856165 -75.521154 -49.790454 -75.521154 -49.705968 # -b -176.322417 -43.791944 -176.313030 -43.775516 -176.313030 -43.822452 -176.345885 -43.871736 -176.378741 -43.942141 -176.378741 -44.021933 -176.399862 -44.045402 -176.510164 -44.068870 -176.608731 -44.118154 -176.686176 -44.068870 -176.632199 -43.935100 -176.653321 -43.885817 -176.742500 -43.878776 -176.862189 -43.838880 -176.841067 -43.815412 -176.676789 -43.775516 -176.510164 -43.766128 -176.399862 -43.806025 -176.322417 -43.791944 # -b 172.067605 -41.050840 172.100461 -41.060227 172.112195 -41.060227 172.112195 -40.985129 172.121582 -40.867787 172.177906 -40.825544 172.264739 -40.792688 172.332797 -40.734017 172.410243 -40.658919 172.485341 -40.649531 172.518197 -40.607288 172.595643 -40.574433 172.628498 -40.623716 172.628498 -40.691774 172.628498 -40.776260 172.696557 -40.858400 172.806858 -40.884215 172.905425 -40.874827 172.982871 -40.959314 172.982871 -41.050840 172.982871 -41.191650 173.036848 -41.292564 173.158883 -41.341848 173.236329 -41.283177 173.334896 -41.233893 173.358364 -41.208078 173.400607 -41.175222 173.501521 -41.142367 173.567232 -41.093083 173.588354 -41.060227 173.644678 -41.034412 173.698655 -41.008597 173.754979 -40.975741 173.841812 -40.966354 173.874668 -40.985129 173.853546 -41.001557 173.776101 -41.060227 173.797222 -41.083696 173.820691 -41.184610 173.787835 -41.266749 173.764367 -41.316032 173.832425 -41.276136 173.942726 -41.233893 173.942726 -41.226853 173.898136 -41.168182 173.919258 -41.151754 173.952113 -41.076655 173.975582 -41.050840 174.017825 -41.034412 174.074149 -41.034412 174.118739 -41.067268 174.139860 -41.109511 174.160982 -41.135326 174.118739 -41.191650 174.062415 -41.243281 174.008437 -41.283177 174.062415 -41.292564 174.128126 -41.374703 174.085883 -41.449802 174.053027 -41.524901 174.095270 -41.597653 174.139860 -41.689179 174.184450 -41.771318 174.139860 -41.862845 174.053027 -41.952025 173.975582 -42.043551 173.942726 -42.142118 173.832425 -42.264154 173.722124 -42.280582 173.698655 -42.336906 173.621210 -42.412004 173.501521 -42.510572 173.424076 -42.646688 173.346630 -42.761683 173.280919 -42.867290 173.236329 -42.890759 173.180005 -42.947083 173.114293 -42.972898 173.102559 -42.972898 173.093172 -42.986979 173.036848 -43.036263 172.950015 -43.076159 172.893691 -43.109014 172.881957 -43.116055 172.872569 -43.116055 172.872569 -43.125442 172.839714 -43.132483 172.827979 -43.141870 172.816245 -43.148911 172.806858 -43.148911 172.795124 -43.165339 172.783390 -43.191154 172.771655 -43.191154 172.771655 -43.205235 172.762268 -43.261559 172.738800 -43.357779 172.729412 -43.446959 172.729412 -43.519711 172.696557 -43.606544 172.684822 -43.662868 172.738800 -43.672255 172.860835 -43.702764 172.992258 -43.759088 173.036848 -43.871736 173.015726 -43.918673 172.926546 -43.831840 172.917159 -43.918673 172.717678 -43.871736 172.518197 -43.815412 172.398509 -43.766128 172.342185 -43.791944 172.342185 -43.878776 172.288207 -43.935100 172.199028 -43.878776 172.145050 -43.871736 172.112195 -43.949181 171.969038 -44.005506 171.835268 -44.038361 171.769557 -44.078257 171.670990 -44.125194 171.581810 -44.118154 171.548954 -44.045402 171.494977 -44.028974 171.459775 -44.038361 171.450387 -44.092338 171.459775 -44.155703 171.405797 -44.315288 171.283762 -44.481913 171.239172 -44.629764 171.229785 -44.779961 171.218050 -44.873834 171.119483 -44.920771 171.119483 -44.974748 171.140605 -45.078009 171.053772 -45.155455 170.964592 -45.225860 170.952858 -45.293918 170.920002 -45.394832 170.920002 -45.505133 170.854291 -45.589619 170.809701 -45.636556 170.699400 -45.711655 170.666544 -45.775019 170.657157 -45.798488 170.678278 -45.828996 170.666544 -45.873586 170.600833 -45.913482 170.621954 -45.920523 170.699400 -45.936951 170.657157 -46.021437 170.511653 -46.012050 170.359109 -46.089495 170.258195 -46.173981 170.171362 -46.258467 170.028205 -46.310098 # -b 169.995349 -43.350739 170.115038 -43.294414 170.138506 -43.181766 170.225339 -43.132483 170.335640 -43.052690 170.436554 -43.003407 170.546856 -42.996366 170.732256 -42.907187 170.854291 -42.818007 170.931737 -42.752296 171.009182 -42.656075 171.107749 -42.557508 171.140605 -42.468328 171.164073 -42.428432 171.206316 -42.313437 171.229785 -42.240685 171.250906 -42.142118 171.274375 -42.017736 171.372942 -41.853458 171.483243 -41.804174 171.570076 -41.747850 171.703845 -41.682139 171.814147 -41.656324 171.879858 -41.564797 171.990159 -41.400519 172.023015 -41.292564 172.055871 -41.142367 172.067605 -41.050840 # -b 176.862189 -39.992417 176.775356 -40.109759 176.709645 -40.220060 176.620465 -40.330362 176.587609 -40.440663 176.477308 -40.532190 176.367007 -40.649531 176.202728 -40.858400 176.080693 -41.017984 175.982126 -41.151754 175.770911 -41.374703 175.639488 -41.440415 175.451741 -41.531941 175.296850 -41.581225 175.177161 -41.492045 175.087982 -41.391131 174.712488 -41.400519 174.646777 -41.292564 174.646777 -41.151754 174.658511 -41.226853 174.745344 -41.125939 174.801668 -41.083696 174.879113 -40.942886 175.001149 -40.841972 175.099716 -40.682387 175.132571 -40.499334 175.186549 -40.363217 175.186549 -40.245876 175.111450 -40.144962 175.001149 -40.034660 # -b 167.878504 -46.744262 167.911360 -46.706713 167.911360 -46.713753 167.920747 -46.758343 167.988805 -46.812320 168.042783 -46.866298 168.063904 -46.910887 168.042783 -46.910887 167.953603 -46.934356 167.944215 -46.948437 168.021661 -46.971905 168.087372 -46.985986 168.099107 -47.016495 168.099107 -47.084553 168.009927 -47.098634 167.932481 -47.166692 167.833914 -47.197201 167.768203 -47.150265 167.690757 -47.166692 167.646167 -47.218323 167.601578 -47.309849 167.503010 -47.279341 167.481889 -47.225363 167.503010 -47.150265 167.524132 -47.091594 167.568722 -47.054044 167.613312 -47.000067 167.657902 -46.941396 167.700145 -46.866298 167.700145 -46.767730 167.711879 -46.720794 167.777590 -46.713753 167.833914 -46.720794 167.878504 -46.744262 # -b 170.028205 -46.310098 169.885048 -46.333566 169.816990 -46.364075 169.807603 -46.418052 169.718423 -46.441520 169.685567 -46.486110 169.673833 -46.523660 169.640977 -46.540087 169.587000 -46.563556 169.497820 -46.591718 169.366398 -46.622227 169.232628 -46.652736 169.157529 -46.645695 169.080084 -46.669163 168.958048 -46.690285 168.847747 -46.652736 168.814891 -46.547128 168.749180 -46.540087 168.638879 -46.584677 168.516843 -46.608146 168.451132 -46.591718 168.451132 -46.563556 168.340831 -46.591718 168.307975 -46.523660 168.307975 -46.448561 168.275119 -46.462642 168.230529 -46.462642 168.120228 -46.418052 168.009927 -46.418052 167.899626 -46.411012 167.768203 -46.401624 167.711879 -46.249080 167.613312 -46.188062 167.446686 -46.173981 167.371588 -46.211531 167.315264 -46.258467 167.150985 -46.279589 166.972626 -46.258467 166.775492 -46.242039 166.665190 -46.181022 166.719168 -46.089495 166.820081 -46.012050 166.874059 -45.927563 166.808347 -45.988581 166.676925 -46.073067 166.620600 -46.082455 166.653456 -45.997969 166.698046 -45.936951 166.686312 -45.920523 166.620600 -45.967460 166.489178 -45.981541 166.456322 -45.906442 166.510299 -45.843077 166.608866 -45.812569 166.742636 -45.798488 166.874059 -45.721042 166.829469 -45.711655 166.796613 -45.674105 166.874059 -45.636556 166.930383 -45.549723 166.841203 -45.559110 166.742636 -45.535642 166.730902 -45.458196 166.841203 -45.458196 166.897527 -45.394832 166.841203 -45.364323 166.841203 -45.310346 166.930383 -45.310346 166.972626 -45.350242 167.028950 -45.333814 167.061805 -45.326774 167.127517 -45.333814 167.172107 -45.310346 167.160373 -45.279837 167.073540 -45.270450 167.007828 -45.216472 167.017216 -45.146067 167.040684 -45.099131 167.050071 -45.068622 167.073540 -44.991176 167.106395 -44.960667 167.204962 -44.904343 167.270674 -44.890262 167.315264 -44.937199 167.336385 -45.014645 167.371588 -45.038113 167.425565 -45.038113 167.458421 -44.991176 167.425565 -44.866794 167.446686 -44.810470 167.503010 -44.796389 167.556988 -44.669660 167.711879 -44.639151 167.822180 -44.559359 167.843302 -44.425589 167.944215 -44.331716 168.063904 -44.284779 168.131962 -44.092338 168.209408 -44.085298 168.307975 -44.028974 168.430010 -44.028974 168.573167 -43.982037 168.704590 -43.982037 168.868869 -43.949181 169.014372 -43.885817 169.145795 -43.791944 169.267831 -43.719192 169.387519 -43.662868 169.530676 -43.599503 169.664446 -43.510323 169.861580 -43.407063 169.995349 -43.350739 # -b 148.280084 -39.959562 148.336408 -40.137921 148.324674 -40.222407 148.136927 -40.290465 148.104071 -40.121493 # -b 148.136927 -40.424235 148.092337 -40.372605 148.169783 -40.356177 148.280084 -40.339749 148.357530 -40.323321 148.467831 -40.356177 148.500686 -40.450050 148.369264 -40.466478 148.291818 -40.450050 148.136927 -40.424235 148.291818 -40.450050 148.136927 -40.424235 # -b 144.795034 -40.675346 144.806768 -40.675346 144.839624 -40.717589 144.982781 -40.759833 145.116550 -40.827891 145.226851 -40.776260 145.304297 -40.776260 145.435720 -40.818503 145.557755 -40.860746 145.787745 -40.985129 145.996613 -41.109511 146.217216 -41.135326 146.404963 -41.151754 146.583322 -41.168182 146.681889 -41.168182 146.759335 -41.118898 146.879023 -41.060227 147.066770 -41.001557 147.254517 -41.010944 147.463385 -40.985129 147.651132 -40.827891 147.761433 -40.867787 147.904590 -40.893602 147.960914 -40.769220 148.125193 -40.818503 148.280084 -40.968701 148.324674 -41.168182 148.345795 -41.276136 148.369264 -41.416946 148.336408 -41.567144 148.336408 -41.714994 148.336408 -41.839377 148.357530 -42.003655 148.369264 -42.085794 148.423241 -42.167934 148.378651 -42.339253 148.378651 -42.200789 148.357530 -42.076407 148.301205 -41.977840 148.268350 -42.052939 148.169783 -42.174974 148.080603 -42.299356 148.092337 -42.503531 148.005504 -42.519959 147.993770 -42.656075 147.982036 -42.771070 147.904590 -42.827394 147.784902 -42.827394 147.606542 -42.778111 147.564299 -42.834435 147.564299 -42.949430 147.496241 -43.062078 147.376552 -43.118402 147.331963 -43.254518 147.242783 -43.174726 147.144216 -43.141870 147.066770 -43.214622 147.033914 -43.360126 147.033914 -43.472774 146.902492 -43.592463 146.792190 -43.608890 146.681889 -43.536138 146.559854 -43.512670 146.473021 -43.552566 146.273540 -43.496242 146.097527 -43.496242 146.031816 -43.416450 146.151504 -43.383594 146.228950 -43.296761 146.052937 -43.296761 145.876925 -43.231050 145.743155 -43.029222 145.656322 -42.923615 145.590611 -42.883718 145.513165 -42.820354 145.435720 -42.731174 145.379396 -42.583323 145.325419 -42.444860 145.280829 -42.322825 145.226851 -42.142118 145.215117 -42.142118 145.325419 -42.289969 145.447454 -42.437820 145.567143 -42.289969 145.435720 -42.217217 145.313684 -42.076407 145.203383 -41.937944 145.104816 -41.764278 145.006249 -41.616427 144.940538 -41.508473 144.851358 -41.360622 144.773912 -41.217465 144.795034 -41.017984 144.785646 -40.844319 144.795034 -40.675346 # -b 70.027213 -49.163849 69.999051 -49.182624 69.999051 -49.255376 # -b 68.966444 -49.109872 69.999051 -49.145074 # -b 69.970889 -49.656684 70.168024 -49.691887 70.362811 -49.656684 70.252510 -49.602707 70.362811 -49.546383 70.252510 -49.511181 70.196186 -49.529955 70.139861 -49.583933 69.999051 -49.511181 69.999051 -49.365677 70.306487 -49.328128 70.419135 -49.419654 70.503621 -49.346902 70.585760 -49.220173 70.642084 -49.109872 70.559945 -49.034773 70.334649 -49.072323 70.306487 -49.145074 70.252510 -49.109872 70.139861 -49.145074 70.055375 -49.145074 # -b 69.999051 -49.255376 69.970889 -49.274150 69.916912 -49.292925 69.832426 -49.311700 69.747940 -49.311700 69.637639 -49.292925 69.637639 -49.220173 69.581315 -49.163849 69.468667 -49.109872 69.691616 -49.128647 69.747940 -49.109872 69.804264 -49.053548 69.747940 -49.018345 69.776102 -48.980796 69.665801 -48.943247 69.581315 -48.999571 69.384181 -49.053548 69.189393 -49.053548 69.104907 -49.034773 69.189393 -48.943247 69.133069 -48.908044 69.273879 -48.851720 69.273879 -48.741419 69.133069 -48.795396 69.161231 -48.666320 69.076745 -48.647545 68.966444 -48.631118 68.966444 -48.685095 68.910120 -48.741419 68.853796 -48.814171 68.910120 -48.889269 68.938282 -48.943247 68.910120 -49.034773 68.966444 -49.109872 # -b 69.999051 -49.145074 69.050930 -49.292925 69.161231 -49.292925 69.245717 -49.201398 69.245717 -49.328128 69.161231 -49.328128 69.076745 -49.438429 69.022768 -49.546383 69.189393 -49.675459 69.104907 -49.637910 69.189393 -49.619135 69.302041 -49.583933 69.412343 -49.511181 69.581315 -49.529955 69.581315 -49.656684 69.776102 -49.656684 69.776102 -49.529955 69.832426 -49.511181 69.916912 -49.565158 69.970889 -49.656684 # -b 37.612727 -46.880379 37.645582 -46.873338 37.701906 -46.856910 37.711294 -46.873338 37.812208 -46.910887 37.821595 -46.985986 37.800473 -47.016495 37.669051 -47.016495 37.600992 -46.924968 37.612727 -46.880379 # -b -26.359652 -58.408033 -26.303328 -58.415073 -26.282207 -58.403339 -26.261085 -58.443235 -26.261085 -58.494866 -26.359652 -58.494866 -26.458219 -58.459663 -26.491075 -58.431501 -26.491075 -58.403339 -26.437098 -58.403339 -26.359652 -58.408033 # -b -38.124337 -54.028838 -38.157192 -54.003023 -38.112602 -54.010064 -38.056278 -54.003023 -37.981180 -53.995983 -37.870878 -53.988942 -37.781699 -53.977208 -37.704253 -54.003023 -37.582218 -54.003023 -37.450795 -53.977208 -37.450795 -54.014757 -37.352228 -54.021798 -37.241927 -54.047613 -37.209071 -54.099243 -37.131625 -54.087509 -37.065914 -54.068735 -36.997856 -54.094550 -36.911023 -54.094550 -36.845312 -54.125059 -36.812456 -54.132099 -36.756132 -54.139140 -36.711542 -54.157914 -36.634096 -54.190770 -36.666952 -54.216585 -36.702155 -54.254135 -36.601241 -54.254135 -36.568385 -54.294031 -36.535529 -54.326886 -36.436962 -54.352702 -36.371251 -54.301071 -36.282071 -54.326886 -36.216360 -54.409026 -36.150648 -54.479431 -36.094324 -54.505246 -36.073203 -54.538102 -35.962902 -54.594426 -35.930046 -54.575651 -35.906577 -54.594426 -35.906577 -54.646056 -35.885456 -54.709421 -35.829132 -54.772785 -35.852600 -54.772785 -35.951167 -54.768091 -35.995757 -54.786866 -35.984023 -54.824415 -35.951167 -54.869005 -35.984023 -54.876046 -36.040347 -54.894820 -36.138914 -54.869005 -36.249215 -54.772785 -36.303193 -54.735236 -36.326661 -54.671871 -36.392372 -54.639015 -36.481552 -54.582691 -36.523795 -54.531061 -36.591853 -54.493512 -36.711542 -54.467697 -36.756132 -54.448922 -36.788987 -54.409026 -36.899289 -54.364436 -37.042446 -54.326886 -37.152747 -54.301071 -37.274782 -54.275256 -37.406205 -54.268216 -37.406205 -54.242400 -37.361615 -54.202504 -37.385084 -54.176689 -37.396818 -54.139140 -37.507119 -54.150874 -37.650276 -54.171995 -37.748843 -54.164955 -37.748843 -54.132099 -37.737109 -54.113324 -37.769965 -54.094550 -37.769965 -54.073428 -37.802820 -54.061694 -37.892000 -54.054654 -37.969446 -54.035879 -38.056278 -54.054654 -38.133724 -54.014757 -38.124337 -54.028838 # -b -59.313911 -51.423851 -59.292790 -51.388649 -59.269321 -51.416811 -59.182488 -51.437932 -59.159020 -51.491910 -59.203610 -51.527112 -59.248200 -51.616292 -59.346767 -51.649148 -59.445334 -51.738327 -59.555635 -51.841588 -59.633081 -51.874444 -59.677670 -51.923727 -59.755116 -51.991785 -59.853683 -52.003520 -59.931129 -51.991785 -59.975719 -51.996479 # -b -60.020308 -51.731287 -59.963984 -51.724246 # -b -60.041430 -51.505991 -59.942863 -51.470788 -59.898273 -51.449667 -59.710526 -51.463748 -59.546248 -51.491910 -59.424212 -51.491910 -59.313911 -51.484869 -59.313911 -51.423851 # -b -58.464357 -51.327631 -58.386911 -51.306510 -58.344668 -51.346406 -58.276610 -51.409770 -58.243754 -51.470788 -58.201511 -51.430892 -58.079476 -51.423851 -57.912850 -51.430892 -57.837752 -51.442626 -57.793162 -51.477829 -57.715716 -51.520072 -57.715716 -51.574049 -57.903463 -51.595170 -57.948053 -51.623332 -57.837752 -51.628026 -57.715716 -51.656188 -57.694595 -51.717206 -57.781428 -51.766489 -57.924585 -51.780570 -58.046620 -51.848629 -58.178043 -51.916687 -58.332934 -51.928421 -58.508947 -51.916687 -58.753017 -51.881484 -58.851585 -51.881484 -58.762405 -51.935461 -58.642716 -51.984745 -58.607514 -52.010560 -58.565271 -52.071578 -58.565271 -52.153717 -58.598126 -52.139636 -58.642716 -52.078618 -58.762405 -52.099740 -58.851585 -52.120861 -58.950152 -52.057497 -59.048719 -52.078618 -59.015863 -52.132596 -58.973620 -52.240550 -58.884440 -52.240550 -58.806995 -52.221775 -58.806995 -52.247590 -58.950152 -52.247590 -59.093309 -52.235856 -59.137898 -52.200654 -59.227078 -52.179532 -59.292790 -52.207694 -59.281055 -52.247590 -59.259934 -52.289834 -59.259934 -52.343811 -59.203610 -52.362585 -59.292790 -52.348504 -59.391357 -52.308608 -59.480536 -52.221775 -59.590838 -52.132596 -59.579103 -52.106780 -59.501658 -52.064537 -59.501658 -51.984745 -59.457068 -51.949542 -59.435946 -51.923727 -59.412478 -51.860363 -59.358501 -51.848629 -59.313911 -51.841588 -59.159020 -51.759449 -59.105043 -51.724246 -59.006476 -51.670269 -59.015863 -51.588130 -59.015863 -51.559968 -58.983007 -51.520072 -58.983007 -51.470788 -58.917296 -51.463748 -58.863319 -51.430892 -58.774139 -51.430892 -58.785873 -51.353446 -58.774139 -51.299469 -58.708428 -51.327631 -58.586392 -51.346406 -58.464357 -51.327631 # -b -70.064763 -52.578494 -69.898137 -52.517477 -69.799570 -52.510436 -69.600089 -52.484621 -69.522644 -52.409522 -69.480401 -52.322689 -69.358365 -52.275752 -69.226943 -52.247590 -69.083786 -52.254631 -69.006340 -52.289834 -68.839715 -52.343811 -68.642581 -52.343811 -68.431366 -52.376666 -68.365654 -52.362585 -68.365654 -52.322689 # -b -68.365654 -52.322689 -68.365654 -52.308608 -68.389122 -52.294527 -68.431366 -52.275752 -68.508811 -52.214735 -68.630847 -52.120861 -68.741148 -52.038722 -68.806859 -51.949542 -68.884305 -51.848629 -69.015727 -51.698431 -69.126029 -51.677310 -69.226943 -51.691391 -69.391221 -51.609251 -69.280920 -51.581089 -69.060317 -51.588130 -69.006340 -51.513031 -69.060317 -51.334672 -69.116641 -51.210289 -69.194087 -51.050705 -69.292654 -51.083560 -69.402955 -51.083560 -69.269186 -50.959178 -69.149497 -50.708067 -69.039196 -50.471036 -68.872571 -50.372469 -68.663702 -50.280943 -68.487690 -50.210538 -68.454834 -50.189416 -68.454834 -50.130745 -68.499424 -50.067381 -68.642581 -50.018097 # -b -68.630847 -49.870246 -68.487690 -50.032178 -68.353920 -50.116664 -68.243619 -50.123705 -68.168520 -50.123705 -67.990161 -50.067381 # -b -68.651968 -52.658287 -68.553401 -52.712264 -68.532279 -52.738079 -68.454834 -52.806137 -68.398510 -52.857768 -68.311677 -52.944601 -68.222497 -53.045514 -68.156786 -53.132347 -68.145052 -53.176937 -68.222497 -53.111226 -68.344533 -53.092451 -68.454834 -53.118266 -68.487690 -53.191018 -68.421978 -53.282545 -68.299943 -53.310707 -68.189642 -53.376418 -68.112196 -53.467945 -68.046485 -53.585286 -67.990161 -53.669773 -67.903328 -53.730790 -67.748436 -53.801195 -67.584158 -53.859866 -67.506712 -53.904456 -67.429267 -53.988942 -67.318966 -54.061694 -67.175809 -54.080469 -67.086629 -54.125059 -66.966940 -54.150874 -66.889495 -54.216585 -66.800315 -54.242400 -66.690014 -54.261175 -66.612568 -54.319846 -66.481146 -54.401985 -66.359110 -54.460656 -66.227687 -54.524021 -66.093918 -54.575651 -65.917905 -54.639015 -65.807604 -54.678912 -65.587001 -54.697686 -65.357012 -54.697686 -65.157531 -54.671871 -65.145796 -54.742276 -65.178652 -54.861965 -65.246710 -54.913595 -65.324156 -54.925329 -65.476700 -54.976960 -65.631591 -54.951145 -65.741892 -54.939410 -65.840460 -54.925329 -65.974229 -54.965226 -66.171363 -54.995734 -66.305133 -55.021550 -66.347376 -55.059099 -66.514001 -55.033284 -66.690014 -54.958185 -66.812049 -54.925329 -66.966940 -54.913595 -67.110097 -54.894820 -67.307231 -54.869005 -67.483244 -54.876046 -67.638135 -54.876046 -67.781292 -54.869005 -67.837616 -54.850231 -67.936183 -54.824415 -68.067606 -54.812681 -68.210763 -54.805641 -68.377388 -54.843190 -68.499424 -54.887780 -68.586257 -54.894820 # -b -69.158884 -54.995734 -69.149497 -55.007469 -69.248064 -55.021550 -69.370100 -55.033284 -69.501522 -55.059099 -69.632945 -55.059099 -69.733859 -55.077874 -69.776102 -55.077874 -69.811305 -55.066139 -69.844160 -55.014509 -69.844160 -54.976960 -69.844160 -54.932370 -69.799570 -54.920636 -69.766715 -54.913595 -69.733859 -54.925329 -69.644679 -54.913595 -69.513257 -54.906555 -69.468667 -54.920636 -69.280920 -54.939410 -69.194087 -54.958185 -69.158884 -54.995734 # -b -69.942727 -55.174094 -69.909872 -55.152972 -69.811305 -55.148279 -69.632945 -55.129504 -69.480401 -55.103689 -69.337244 -55.084914 -69.215208 -55.052058 -69.137763 -55.040324 -69.039196 -55.028590 -68.950016 -55.028590 -68.818593 -55.033284 -68.675436 -55.002775 -68.532279 -54.969919 -68.431366 -54.976960 -68.344533 -55.033284 -68.288209 -55.059099 -68.255353 -55.122464 -68.344533 -55.141238 -68.464221 -55.152972 -68.586257 -55.148279 -68.708292 -55.122464 -68.851449 -55.091955 -68.896039 -55.103689 -68.830327 -55.141238 -68.696558 -55.185828 -68.565135 -55.197562 -68.410244 -55.211643 -68.267087 -55.211643 -68.189642 -55.242152 -68.177907 -55.286742 -68.145052 -55.312557 -68.321064 -55.317251 -68.443100 -55.312557 -68.508811 -55.331332 -68.499424 -55.354800 -68.353920 -55.380615 -68.201376 -55.392350 -68.091074 -55.429899 -68.067606 -55.500304 -67.990161 -55.523772 -67.969039 -55.610605 -67.915062 -55.681010 -67.915062 -55.711519 -67.969039 -55.711519 -68.067606 -55.662236 -68.133317 -55.610605 -68.145052 -55.535506 -68.243619 -55.523772 -68.365654 -55.462755 -68.454834 -55.474489 -68.597991 -55.493263 -68.651968 -55.512038 -68.741148 -55.467448 -68.762269 -55.455714 -68.774003 -55.418165 -68.785738 -55.373575 -68.872571 -55.347760 -68.905426 -55.312557 -68.905426 -55.305517 -68.994606 -55.272661 -69.215208 -55.267967 -69.292654 -55.324291 -69.236330 -55.392350 -69.072052 -55.486223 -68.994606 -55.549588 -69.060317 -55.556628 -69.280920 -55.549588 -69.346631 -55.535506 -69.391221 -55.486223 -69.402955 -55.443980 -69.480401 -55.411124 -69.611824 -55.361841 -69.600089 -55.336026 -69.468667 -55.298476 -69.370100 -55.260927 -69.337244 -55.230418 -69.346631 -55.211643 -69.456932 -55.223377 -69.590702 -55.272661 -69.733859 -55.291436 -69.844160 -55.291436 -69.942727 -55.272661 -69.963849 -55.216337 -69.954462 -55.178788 -69.942727 -55.174094 # -b -68.091074 -55.014509 -68.112196 -55.033284 -68.210763 -55.021550 -68.255353 -55.007469 -68.278821 -54.958185 -68.222497 -54.951145 -68.067606 -54.951145 -67.947917 -54.932370 -67.793026 -54.920636 -67.638135 -54.939410 -67.506712 -54.958185 -67.340087 -54.965226 -67.175809 -54.976960 -67.110097 -55.028590 -67.077242 -55.110729 -67.042039 -55.178788 -67.042039 -55.216337 -67.053773 -55.253886 -67.131219 -55.305517 -67.229786 -55.331332 -67.330700 -55.336026 -67.363556 -55.317251 -67.372943 -55.267967 -67.396411 -55.242152 -67.494978 -55.223377 -67.572424 -55.223377 -67.572424 -55.267967 -67.682725 -55.272661 -67.727315 -55.260927 -67.694459 -55.235112 -67.781292 -55.230418 -67.891593 -55.223377 -68.013629 -55.204603 -68.046485 -55.152972 -68.067606 -55.103689 -68.079340 -55.052058 -68.091074 -55.014509 -66.600834 -55.223377 -66.558591 -55.216337 -66.481146 -55.211643 -66.424821 -55.249193 -66.436556 -55.272661 -66.514001 -55.305517 -66.579713 -55.286742 -66.612568 -55.253886 -66.612568 -55.216337 # -b -64.408890 -54.798600 -64.397156 -54.793907 -64.319710 -54.793907 -64.230531 -54.772785 -64.176553 -54.761051 -64.131964 -54.772785 -64.045131 -54.772785 -63.955951 -54.772785 -63.801060 -54.742276 -63.714227 -54.735236 -63.681371 -54.754010 -63.690759 -54.798600 -63.690759 -54.819722 -63.756470 -54.831456 -63.845650 -54.824415 -63.944217 -54.812681 -64.066252 -54.824415 -64.087374 -54.883086 -64.155432 -54.869005 -64.265733 -54.861965 -64.373688 -54.894820 -64.408890 -54.920636 -64.495723 -54.906555 -64.573169 -54.906555 -64.606024 -54.894820 -64.584903 -54.857271 -64.519191 -54.805641 -64.507457 -54.772785 -64.462867 -54.786866 -64.408890 -54.798600 # -b -60.890984 -51.820466 -60.846394 -51.799345 -60.834660 -51.827507 -60.801805 -51.827507 -60.768949 -51.841588 -60.792417 -51.949542 -60.869863 -51.991785 -60.980164 -51.963623 -61.066997 -51.909646 -61.156177 -51.874444 -61.198420 -51.841588 -61.198420 -51.785264 -61.210154 -51.717206 -61.144442 -51.691391 -61.132708 -51.717206 -61.177298 -51.780570 -61.156177 -51.848629 -61.099853 -51.874444 -61.088118 -51.834547 -61.045875 -51.799345 -60.944961 -51.799345 -60.890984 -51.820466 # -b -59.975719 -51.996479 -60.107141 -52.045763 -60.130610 -52.010560 -60.175200 -52.017601 -60.163465 -52.052803 -60.163465 -52.120861 -60.273767 -52.174839 -60.327744 -52.167798 -60.416924 -52.207694 -60.527225 -52.247590 -60.560081 -52.207694 -60.581202 -52.146677 -60.691503 -52.132596 -60.714972 -52.146677 -60.670382 -52.193613 -60.703237 -52.179532 -60.825273 -52.106780 -60.890984 -52.064537 -60.858129 -52.045763 -60.691503 -52.045763 -60.691503 -51.996479 -60.691503 -51.977704 -60.581202 -51.996479 -60.438045 -51.996479 -60.339478 -51.956583 -60.482635 -51.949542 -60.470901 -51.923727 -60.351212 -51.841588 -60.306622 -51.855669 -60.240911 -51.860363 -60.163465 -51.745368 -60.020308 -51.731287 # -b -59.963984 -51.724246 -60.029696 -51.670269 -60.107141 -51.642107 -60.184587 -51.581089 -60.229177 -51.552927 -60.360600 -51.559968 -60.405189 -51.534153 -60.339478 -51.527112 -60.327744 -51.498950 -60.372334 -51.463748 -60.482635 -51.449667 -60.506103 -51.381608 -60.428658 -51.416811 -60.318356 -51.456707 -60.184587 -51.484869 -60.041430 -51.505991 # -b -68.741148 -52.658287 -68.659009 -52.637165 -68.743495 -52.550332 -68.910120 -52.618390 -69.104907 -52.653593 -69.273879 -52.637165 -69.358365 -52.533904 -69.412343 -52.465846 -69.637639 -52.517477 -69.691616 -52.637165 -69.747940 -52.738079 -69.945074 -52.770935 # -b -69.999051 -53.395193 -69.776102 -53.343562 -69.553153 -53.327135 -69.412343 -53.343562 -69.330203 -53.428049 -69.384181 -53.561818 -69.637639 -53.611102 -69.860588 -53.643957 -69.916912 -53.693241 # -b -69.999051 -54.155567 -69.776102 -54.204851 -69.581315 -54.237707 -69.412343 -54.286990 -69.358365 -54.369129 -69.524991 -54.369129 -69.553153 -54.418413 -69.691616 -54.303418 -69.860588 -54.286990 -69.888750 -54.401985 # -b -69.999051 -54.887780 -69.970889 -54.854924 -69.804264 -54.854924 -69.553153 -54.854924 -69.273879 -54.887780 -69.022768 -55.000428 -68.910120 -54.951145 -68.743495 -54.951145 -68.797472 -54.887780 -68.602684 -54.887780 -68.586257 -54.894820 # -b -74.298453 -49.926571 -74.307841 -50.011057 -74.385286 -50.060340 -74.462732 -50.130745 -74.551912 -50.182376 -74.462732 -50.295024 -74.340696 -50.379510 -74.221008 -50.428793 -74.098972 -50.442874 -73.988671 -50.449915 -73.890104 -50.527360 -73.857248 -50.569603 -74.066117 -50.527360 -74.122441 -50.597765 -74.033261 -50.715107 -73.934694 -50.778472 -73.833780 -50.778472 -73.779803 -50.701026 -73.714091 -50.729188 -73.702357 -50.862958 -73.878370 -50.902854 -74.087238 -50.902854 -74.131828 -50.987340 -74.077851 -51.118763 -73.944081 -51.214983 -73.746947 -51.346406 -73.636646 -51.423851 -73.570934 -51.534153 -73.502876 -51.642107 -73.526345 -51.752408 -73.538079 -51.916687 -73.470021 -52.045763 -73.383188 -52.078618 -73.282274 -52.085659 -73.261152 -51.949542 -73.282274 -51.792304 -73.392575 -51.623332 -73.371453 -51.656188 -73.282274 -51.780570 -73.249418 -51.881484 -73.195441 -51.970664 -73.139117 -52.024641 -73.040550 -51.977704 -72.974838 -51.874444 -73.028816 -51.799345 -73.085140 -51.710165 -73.040550 -51.698431 -72.897393 -51.785264 -72.754236 -51.827507 -72.655669 -51.806385 -72.643935 -51.724246 -72.831681 -51.635067 -73.019428 -51.552927 -73.207175 -51.463748 -73.117995 -51.470788 -72.909127 -51.538846 -72.643935 -51.691391 -72.578223 -51.738327 -72.500778 -51.806385 -72.479656 -51.902606 -72.489043 -51.970664 -72.622813 -51.996479 -72.643935 -52.003520 -72.622813 -52.017601 -72.566489 -52.064537 -72.456188 -52.146677 -72.435066 -52.282793 -72.500778 -52.390747 -72.611079 -52.423603 -72.709646 -52.463499 -72.754236 -52.510436 -72.754236 -52.578494 -72.632200 -52.564413 -72.489043 -52.545639 -72.456188 -52.604309 -72.456188 -52.679408 -72.345887 -52.618390 -72.104162 -52.557373 -71.904682 -52.557373 -71.695813 -52.564413 -71.508066 -52.597269 -71.409499 -52.719304 -71.299198 -52.813178 -71.099717 -52.885930 -71.123185 -52.965722 -71.210018 -53.092451 -71.343788 -53.165203 -71.552656 -53.242649 -71.784993 -53.263770 -71.895294 -53.329481 -71.961006 -53.402233 -72.113550 -53.449170 -72.092428 -53.381112 -72.137018 -53.303666 -72.291909 -53.348256 -72.301297 -53.460904 -72.214464 -53.566512 -72.014983 -53.676813 -71.850704 -53.723750 -71.651223 -53.782421 -71.496332 -53.789461 -71.332054 -53.827011 -71.233487 -53.845785 -71.132573 -53.841092 -71.078596 -53.808236 -71.022272 -53.735484 -70.989416 -53.650998 -70.968294 -53.467945 -70.956560 -53.282545 -70.911970 -53.191018 -70.857993 -53.078370 -70.836872 -53.012659 -70.836872 -52.911745 -70.846259 -52.792056 -70.836872 -52.766241 -70.801669 -52.759201 -70.670246 -52.738079 -70.548211 -52.691142 -70.428522 -52.705223 -70.285365 -52.679408 -70.196186 -52.625431 -70.064763 -52.578494 # -b -74.441610 -49.919530 -74.551912 -50.032178 -74.727924 -50.046259 # -b -75.377998 -50.302064 -75.389732 -50.266862 -75.389732 -50.252781 -75.356876 -50.189416 -75.279430 -50.203497 -75.180863 -50.238700 -75.047094 -50.182376 -74.882815 -50.154214 -74.849960 -50.224619 -74.903937 -50.287983 -74.936792 -50.344307 -74.960261 -50.485117 -75.136273 -50.428793 -75.190251 -50.358388 -75.324020 -50.414712 -75.377998 -50.302064 # -b -74.441610 -50.686945 -74.573033 -50.665824 -74.573033 -50.644702 -74.573033 -50.597765 -74.629357 -50.527360 -74.695068 -50.428793 -74.695068 -50.393591 -74.629357 -50.379510 -74.528443 -50.471036 -74.364165 -50.555522 -74.253863 -50.637662 -74.188152 -50.743269 -74.155296 -50.827755 -74.188152 -50.834796 -74.298453 -50.764391 -74.373552 -50.722148 -74.441610 -50.686945 # -b -74.441610 -51.001421 -74.495587 -51.083560 -74.474466 -51.189168 -74.629357 -51.153965 -74.749046 -51.015502 -74.826491 -50.895813 -74.838225 -50.722148 -74.826491 -50.658783 -74.826491 -50.658783 -74.814757 -50.679905 -74.704456 -50.708067 -74.584767 -50.736229 -74.483853 -50.771431 -74.441610 -50.869998 -74.408755 -50.966218 # -b -74.882815 -51.430892 -74.871081 -51.395689 -74.859347 -51.334672 -74.826491 -51.306510 -74.749046 -51.264267 -74.695068 -51.210289 -74.629357 -51.182127 -74.594155 -51.327631 -74.573033 -51.388649 -74.629357 -51.416811 -74.749046 -51.442626 -74.838225 -51.423851 -74.859347 -51.416811 -74.871081 -51.416811 -74.882815 -51.430892 # -b -74.871081 -52.139636 -74.969648 -52.132596 -74.969648 -52.064537 -74.969648 -51.970664 -74.960261 -51.902606 -74.936792 -51.834547 -74.882815 -51.792304 -74.849960 -51.691391 -74.793636 -51.738327 -74.781901 -51.888525 -74.814757 -52.038722 -74.849960 -52.139636 -74.871081 -52.139636 # -b -74.054382 -51.677310 -73.976937 -51.766489 -73.922960 -51.820466 -73.866636 -51.881484 -73.967550 -51.867403 -74.110707 -51.792304 -74.164684 -51.710165 -74.164684 -51.670269 -74.164684 -51.656188 -74.164684 -51.602211 -74.122441 -51.567008 -74.054382 -51.677310 # -b -73.714091 -51.534153 -73.702357 -51.534153 -73.690623 -51.567008 -73.669502 -51.602211 -73.657767 -51.670269 -73.657767 -51.731287 -73.723479 -51.670269 -73.833780 -51.595170 -73.890104 -51.491910 -73.890104 -51.423851 -73.857248 -51.449667 -73.812658 -51.520072 -73.714091 -51.534153 # -b -73.538079 -52.221775 -73.514610 -52.214735 -73.514610 -52.207694 -73.502876 -52.179532 -73.460633 -52.167798 -73.371453 -52.207694 -73.272886 -52.221775 -73.195441 -52.167798 -73.085140 -52.139636 -73.007694 -52.179532 -72.986573 -52.282793 -72.951370 -52.336770 -72.852803 -52.289834 -72.819947 -52.214735 -72.787092 -52.153717 -72.841069 -52.106780 -72.864537 -52.024641 -72.798826 -52.038722 -72.676790 -52.092699 -72.632200 -52.193613 -72.611079 -52.329730 -72.688524 -52.390747 -72.798826 -52.470540 -72.918514 -52.644206 -72.841069 -52.665327 -72.754236 -52.691142 -72.655669 -52.759201 -72.622813 -52.824912 -72.554755 -52.871849 -72.444454 -52.918785 -72.369355 -52.857768 -72.235585 -52.792056 -72.137018 -52.712264 -72.005595 -52.705223 -71.773259 -52.733385 -71.606633 -52.719304 -71.552656 -52.726345 -71.486945 -52.806137 -71.486945 -52.900011 -71.630102 -52.965722 -71.761525 -53.031433 -71.904682 -53.104185 -72.038451 -53.151122 -72.181608 -53.132347 -72.259054 -53.144081 -72.247319 -53.209793 -72.291909 -53.237955 -72.378742 -53.205099 -72.489043 -53.249689 -72.456188 -53.315400 -72.521899 -53.348256 -72.521899 -53.442130 -72.467922 -53.507841 -72.622813 -53.474985 -72.754236 -53.402233 -72.909127 -53.322441 -73.085140 -53.230914 -73.117995 -53.191018 -72.974838 -53.176937 -72.798826 -53.230914 -72.697912 -53.191018 -72.688524 -53.125307 -72.787092 -53.078370 -72.876271 -52.958682 -72.918514 -53.012659 -72.995960 -53.057249 -73.085140 -53.057249 -73.272886 -53.045514 -73.240031 -52.984497 -73.240031 -52.932866 -73.416043 -52.892970 -73.460633 -52.838993 -73.448899 -52.759201 -73.481755 -52.745120 -73.592056 -52.766241 -73.570934 -52.691142 -73.570934 -52.585535 -73.538079 -52.477580 -73.559200 -52.369626 -73.538079 -52.289834 -73.538079 -52.221775 # -b -73.723479 -52.449418 -73.657767 -52.477580 -73.669502 -52.538598 -73.681236 -52.592575 -73.702357 -52.644206 -73.768069 -52.691142 -73.812658 -52.712264 -73.857248 -52.705223 -73.878370 -52.686449 -73.878370 -52.672368 -73.857248 -52.651246 -73.812658 -52.625431 -73.812658 -52.597269 -73.812658 -52.585535 -73.857248 -52.611350 -73.901838 -52.611350 -73.944081 -52.557373 -73.944081 -52.491661 -73.866636 -52.470540 -73.768069 -52.456459 -73.723479 -52.449418 # -b -74.671600 -52.759201 -74.695068 -52.752160 -74.671600 -52.752160 -74.605889 -52.777975 -74.540177 -52.817871 -74.474466 -52.871849 -74.418142 -52.911745 -74.298453 -52.944601 -74.209274 -52.977456 -74.131828 -52.998578 -74.054382 -53.019699 -73.934694 -53.052555 -73.833780 -53.071330 -73.723479 -53.104185 -73.603790 -53.137041 -73.538079 -53.165203 -73.502876 -53.242649 -73.460633 -53.242649 -73.416043 -53.209793 -73.371453 -53.216833 -73.294008 -53.270811 -73.216562 -53.303666 -73.129729 -53.343562 -73.106261 -53.388152 -73.207175 -53.381112 -73.305742 -53.388152 -73.404309 -53.355297 -73.502876 -53.336522 -73.570934 -53.270811 -73.723479 -53.183978 -73.812658 -53.118266 -73.833780 -53.165203 -73.812658 -53.205099 -73.866636 -53.216833 -74.012139 -53.191018 -74.077851 -53.172244 -74.087238 -53.158163 -74.209274 -53.118266 -74.340696 -53.057249 -74.474466 -53.019699 -74.561299 -52.939907 -74.617623 -52.857768 -74.650479 -52.799097 -74.671600 -52.759201 # -b -74.629357 -51.731287 -74.629357 -51.717206 -74.617623 -51.759449 -74.594155 -51.773530 -74.573033 -51.799345 -74.573033 -51.841588 -74.573033 -51.902606 -74.573033 -51.949542 -74.584767 -52.024641 -74.629357 -52.092699 -74.704456 -52.120861 -74.739658 -52.092699 -74.749046 -52.031682 -74.749046 -51.970664 -74.739658 -51.916687 -74.695068 -51.888525 -74.662213 -51.860363 -74.662213 -51.799345 -74.683334 -51.745368 -74.662213 -51.724246 -74.629357 -51.731287 # -b -73.613177 -53.395193 -73.592056 -53.388152 -73.526345 -53.381112 -73.437165 -53.402233 -73.416043 -53.460904 -73.359719 -53.467945 -73.240031 -53.474985 -73.162585 -53.519575 -73.085140 -53.526616 -73.085140 -53.449170 -73.052284 -53.442130 -72.974838 -53.449170 -72.930248 -53.474985 -72.864537 -53.526616 -72.831681 -53.474985 -72.775357 -53.519575 -72.688524 -53.632223 -72.643935 -53.618142 -72.599345 -53.592327 -72.489043 -53.606408 -72.435066 -53.643957 -72.435066 -53.683854 -72.334152 -53.723750 -72.235585 -53.756605 -72.202730 -53.794155 -72.214464 -53.819970 -72.214464 -53.852826 -72.345887 -53.859866 -72.357621 -53.951393 -72.369355 -54.035879 -72.423332 -54.080469 -72.545368 -54.061694 -72.599345 -54.021798 -72.622813 -54.054654 -72.599345 -54.132099 -72.665056 -54.150874 -72.808213 -54.120365 -72.909127 -54.125059 -72.974838 -54.099243 -72.897393 -54.073428 -72.808213 -54.061694 -72.909127 -54.035879 -73.028816 -54.021798 -73.139117 -54.028838 -73.240031 -54.014757 -73.294008 -53.970167 -73.282274 -53.918537 -73.294008 -53.866907 -73.272886 -53.819970 -73.272886 -53.794155 -73.350332 -53.789461 -73.448899 -53.761299 -73.470021 -53.716709 -73.481755 -53.676813 -73.514610 -53.625183 -73.526345 -53.592327 -73.603790 -53.533656 -73.681236 -53.453864 -73.681236 -53.428049 -73.613177 -53.395193 # -b -71.883560 -53.859866 -71.860092 -53.859866 -71.850704 -53.885681 -71.794380 -53.925578 -71.728669 -53.932618 -71.684079 -53.984248 -71.707547 -54.010064 -71.707547 -54.061694 -71.662957 -54.094550 -71.618368 -54.028838 -71.552656 -53.988942 -71.430621 -53.995983 -71.386031 -54.042919 -71.308585 -54.028838 -71.266342 -54.094550 -71.266342 -54.132099 -71.221752 -54.197810 -71.165428 -54.157914 -71.090330 -54.164955 -71.022272 -54.216585 -71.001150 -54.286990 -71.099717 -54.357395 -71.221752 -54.357395 -71.266342 -54.331580 -71.275730 -54.305765 -71.332054 -54.261175 -71.496332 -54.242400 -71.662957 -54.228319 -71.716935 -54.275256 -71.684079 -54.301071 -71.707547 -54.312805 -71.850704 -54.279950 -71.895294 -54.235360 -71.993861 -54.190770 -72.092428 -54.171995 -72.104162 -54.120365 -72.104162 -54.106284 -72.137018 -54.054654 -72.158140 -54.003023 -72.181608 -53.951393 -72.092428 -53.958433 -71.993861 -53.925578 -71.928150 -53.866907 -71.883560 -53.859866 # -b -70.548211 -53.592327 -70.515355 -53.592327 -70.515355 -53.599368 -70.482499 -53.611102 -70.473112 -53.697935 -70.473112 -53.782421 -70.449644 -53.866907 -70.428522 -53.937312 -70.395667 -53.988942 -70.372198 -54.054654 -70.383932 -54.094550 -70.428522 -54.087509 -70.494234 -54.054654 -70.571679 -54.003023 -70.637391 -53.984248 -70.625656 -54.087509 -70.571679 -54.176689 -70.505968 -54.216585 -70.383932 -54.223626 -70.318221 -54.279950 -70.351077 -54.286990 -70.461378 -54.275256 -70.548211 -54.249441 -70.649125 -54.183729 -70.747692 -54.132099 -70.825137 -54.054654 -70.846259 -53.970167 -70.836872 -53.904456 -70.792282 -53.878641 -70.726570 -53.873947 -70.649125 -53.873947 -70.616269 -53.845785 -70.625656 -53.782421 -70.670246 -53.730790 -70.658512 -53.702628 -70.581067 -53.643957 -70.548211 -53.592327 # -b -71.001150 -55.110729 -71.012884 -55.096648 -71.012884 -55.077874 -70.989416 -55.033284 -70.923704 -55.002775 -70.846259 -54.988694 -70.801669 -54.984000 -70.768813 -55.033284 -70.747692 -55.084914 -70.747692 -55.129504 -70.780547 -55.152972 -70.836872 -55.160013 -70.890849 -55.148279 -70.968294 -55.122464 -71.001150 -55.110729 # -b -70.362811 -55.272661 -70.395667 -55.260927 -70.395667 -55.267967 -70.449644 -55.267967 -70.538823 -55.223377 -70.604535 -55.167053 -70.616269 -55.129504 -70.571679 -55.115423 -70.515355 -55.122464 -70.437910 -55.148279 -70.362811 -55.141238 -70.327608 -55.192869 -70.339342 -55.235112 -70.362811 -55.272661 # -b -69.945074 -52.770935 -69.999051 -52.806137 -70.139861 -52.738079 -70.419135 -52.754507 -70.224348 -52.789709 -70.196186 -52.857768 -70.111699 -52.942254 -70.168024 -53.024393 -70.278325 -53.043168 -70.362811 -52.991537 -70.447297 -53.007965 -70.447297 -53.144081 -70.475459 -53.261423 -70.419135 -53.343562 -70.306487 -53.378765 -70.168024 -53.444476 -69.999051 -53.395193 # -b -69.916912 -53.693241 -70.083537 -53.693241 -70.139861 -53.777727 -70.111699 -53.909150 -70.055375 -54.106284 -69.999051 -54.155567 # -b -69.888750 -54.401985 -70.027213 -54.303418 -70.111699 -54.254135 -70.224348 -54.319846 -70.196186 -54.369129 -70.027213 -54.401985 -70.139861 -54.418413 -70.196186 -54.465350 -70.306487 -54.385557 -70.503621 -54.303418 -70.670246 -54.254135 -70.949520 -54.106284 -70.949520 -54.204851 -70.754732 -54.286990 -70.698408 -54.369129 -70.754732 -54.385557 -70.811056 -54.369129 -70.839218 -54.369129 -70.921358 -54.418413 -71.090330 -54.418413 -71.090330 -54.481778 -71.313279 -54.498205 -71.369603 -54.514633 -71.285117 -54.563917 -71.285117 -54.646056 -71.313279 -54.676565 -71.146654 -54.676565 -71.090330 -54.646056 -70.949520 -54.660137 -70.811056 -54.676565 -70.921358 -54.725848 -70.949520 -54.758704 -70.811056 -54.758704 -70.811056 -54.791560 -70.893196 -54.822069 -70.726570 -54.838496 -70.613922 -54.805641 -70.419135 -54.854924 -70.252510 -54.887780 -69.999051 -54.887780 # -b 166.167661 -50.600112 166.191130 -50.640008 166.179395 -50.696332 166.179395 -50.738575 166.179395 -50.808981 166.200517 -50.837143 166.223985 -50.872345 166.179395 -50.844183 166.146540 -50.851224 166.092563 -50.865305 166.069094 -50.886426 166.101950 -50.900507 166.101950 -50.954484 165.991649 -50.947444 165.914203 -50.912241 165.925937 -50.900507 165.947059 -50.844183 165.914203 -50.816021 165.947059 -50.752656 166.036239 -50.682251 166.101950 -50.600112 166.113684 -50.571950 166.134806 -50.571950 166.167661 -50.600112 # -b -1.509015 -70.053029 -1.415142 -69.984970 -1.410448 -69.938034 -1.462078 -69.877016 -1.072504 -69.745593 -0.908225 -69.696310 -0.880063 -69.656413 -0.988018 -69.637639 -0.988018 -69.492135 -0.959856 -69.370100 -1.119440 -69.271532 -1.227395 -69.154191 -1.020873 -69.111948 -0.776802 -69.142457 -0.420083 -69.081439 -0.326210 -69.067358 -0.213562 -69.121335 -0.138463 -69.123682 -0.147851 -69.130722 # -b 0.021122 -69.095520 -0.058671 -69.201127 # -b -45.697574 -60.548346 -45.620128 -60.548346 -45.500439 -60.548346 -45.399526 -60.553040 -45.312693 -60.595283 -45.235247 -60.644567 -45.169536 -60.665688 -45.113212 -60.710278 -45.059234 -60.743134 -45.059234 -60.764255 -45.146067 -60.743134 -45.235247 -60.719665 -45.333814 -60.698544 -45.432381 -60.693850 -45.575538 -60.705584 -45.664718 -60.644567 -45.685839 -60.618751 -45.775019 -60.639873 -45.885320 -60.651607 -45.974500 -60.635179 -45.983888 -60.618751 -45.941644 -60.585896 -45.697574 -60.548346 # -b -54.646056 -61.144442 -54.650750 -61.170258 -54.692993 -61.191379 -54.876046 -61.203113 -55.145932 -61.254744 -55.340719 -61.322802 -55.472142 -61.294640 -55.561322 -61.163217 -55.443980 -61.118627 -55.124810 -61.102199 -54.800947 -61.102199 -54.671871 -61.123321 -54.646056 -61.144442 # -b -58.943111 -62.273270 -58.980660 -62.268576 -58.924336 -62.223987 -58.830463 -62.184090 -58.736590 -62.153582 -58.642716 -62.106645 -58.544149 -62.090217 -58.478438 -62.069095 -58.365790 -62.045627 -58.112331 -62.010425 -57.858873 -61.984609 -57.699288 -61.996344 -57.638271 -62.076136 -57.802549 -62.104298 -57.938666 -62.123073 -58.102944 -62.151235 -58.201511 -62.223987 -58.347015 -62.266230 -58.422114 -62.247455 -58.600473 -62.301432 -58.703734 -62.308473 -58.802301 -62.273270 -58.943111 -62.273270 # -b -60.027349 -62.641723 -59.919395 -62.719169 # -b -58.316506 -64.448786 -58.297731 -64.448786 -58.194471 -64.408890 -58.171002 -64.364300 -58.194471 -64.300936 -58.250795 -64.244612 -58.466704 -64.235224 -58.466704 -64.235224 -58.438542 -64.141351 -58.335281 -64.110842 -58.297731 -64.007581 -58.091210 -63.953604 -57.879995 -63.913708 -57.894076 -64.021662 -57.682861 -64.031050 -57.527970 -64.045131 -57.391853 -64.103802 -57.204106 -64.197675 -57.241656 -64.291548 -57.448177 -64.357260 -57.495114 -64.434705 -57.847139 -64.476948 -58.105291 -64.502764 -58.203858 -64.491029 -58.316506 -64.448786 # -b -57.490420 -64.601331 -57.532663 -64.587250 -57.382466 -64.526232 -57.110233 -64.481642 -56.950648 -64.453480 -57.039828 -64.509804 -57.199413 -64.596637 # -b -60.062551 -63.953604 -59.799706 -63.890240 -59.762157 -63.887893 -59.583797 -63.920748 -59.499311 -63.883199 -59.353807 -63.808100 -59.227078 -63.742389 -59.039331 -63.740042 -58.846891 -63.587498 -58.405686 -63.517093 -58.185083 -63.510052 -57.912850 -63.441994 -57.668780 -63.399751 -57.354304 -63.359855 -57.138395 -63.343427 -57.011666 -63.383323 -56.931873 -63.493624 -57.025747 -63.643822 -57.194719 -63.681371 -57.218187 -63.615660 -57.316754 -63.556989 -57.466952 -63.552295 -57.664086 -63.625047 -57.734491 -63.686065 -57.748572 -63.704840 -57.894076 -63.714227 -58.128759 -63.779938 -58.382218 -63.864424 -58.532415 -63.981766 -58.677919 -64.106148 -58.804648 -64.246958 -58.907909 -64.453480 -58.842197 -64.606024 -58.907909 -64.751528 -58.968926 -64.979171 -59.090962 -65.162224 -59.255240 -65.319462 -59.466455 -65.464966 -59.499311 -65.565880 -59.565022 -65.678528 -59.823174 -65.950761 # -b -57.283899 -64.636533 -57.434096 -64.638880 -57.490420 -64.601331 # -b -57.739185 -63.937176 -57.678167 -63.899627 -57.363691 -63.876159 -57.222881 -63.906667 -57.204106 -63.948910 -57.391853 -64.002888 -57.485726 -64.009928 -57.607762 -63.977072 -57.739185 -63.937176 # -b -60.717318 -67.042039 -60.717318 -67.124178 -60.745480 -67.342434 -60.834660 -67.647523 -60.815886 -67.957305 -60.867516 -68.234231 -60.787724 -68.515852 -60.604670 -68.827981 -60.571815 -69.020421 -60.379374 -69.172965 -60.266726 -69.386527 -60.398149 -69.569581 -60.604670 -69.830079 # -b -61.120974 -62.763759 -61.102199 -62.777840 -61.083425 -62.770799 -61.106893 -62.747331 -61.045875 -62.709781 -60.909759 -62.688660 -60.858129 -62.669885 -60.778336 -62.625295 -60.675075 -62.611214 -60.496716 -62.608868 -60.233870 -62.604174 -60.097754 -62.580706 -60.074286 -62.594787 -60.027349 -62.641723 # -b -59.917048 -62.719169 -60.095407 -62.787227 -60.231524 -62.810695 -60.362946 -62.791921 -60.423964 -62.761412 -60.555387 -62.728556 -60.719665 -62.728556 -60.841701 -62.742637 -61.010673 -62.766106 -61.118627 -62.780187 -61.118627 -62.763759 # -b -62.691007 -64.566128 -62.648764 -64.582556 -62.644070 -64.507457 -62.658151 -64.425318 -62.479792 -64.345526 -62.554890 -64.256346 -62.545503 -64.183594 -62.348369 -64.136657 -62.254495 -64.141351 -62.094911 -64.192981 -62.071442 -64.216450 -62.094911 -64.291548 -62.226333 -64.378381 -62.329594 -64.455827 -62.357756 -64.491029 -62.489179 -64.512151 -62.578359 -64.537966 -62.691007 -64.566128 # -b -64.296242 -64.756222 -64.202369 -64.728060 -64.155432 -64.636533 -63.986460 -64.591943 -63.784632 -64.547353 -63.639128 -64.469908 -63.559336 -64.368994 -63.427913 -64.340832 -63.277716 -64.336138 -63.249554 -64.392462 -63.371589 -64.472255 -63.258941 -64.467561 -63.165067 -64.465214 -63.122824 -64.505110 -63.240166 -64.582556 -63.216698 -64.638880 -63.085275 -64.620105 -62.935078 -64.582556 -62.855285 -64.613065 -63.136905 -64.662348 -63.315265 -64.742141 -63.484237 -64.763262 -63.690759 -64.800812 -63.859731 -64.845401 -64.033396 -64.847748 -64.113189 -64.826627 -64.235224 -64.786731 -64.296242 -64.756222 # -b -66.248809 -65.941373 -66.225341 -65.948414 -66.309827 -65.892090 -66.187791 -65.856887 -66.131467 -65.807604 -66.093918 -65.751280 -65.995351 -65.676181 -65.915558 -65.617510 -65.699649 -65.591695 -65.638632 -65.631591 -65.591695 -65.723118 -65.751280 -65.748933 -65.868622 -65.814644 -65.967189 -65.889743 -66.107999 -65.941373 -66.225341 -65.948414 -66.248809 -65.941373 # -b -69.076745 -67.825882 -68.992259 -67.835269 -69.095520 -67.809454 -69.137763 -67.757824 -69.302041 -67.689766 -69.339591 -67.605280 -69.287960 -67.539568 -69.231636 -67.448042 -69.072052 -67.358862 -68.870224 -67.262642 -68.710639 -67.140606 -68.569829 -66.999796 -68.504117 -66.950513 -68.353920 -66.887148 -68.138011 -66.873067 -67.950264 -66.823783 -67.823535 -66.816743 -67.912715 -66.915310 -68.001895 -67.023264 -68.030057 -67.131219 -67.926796 -67.239173 -67.950264 -67.304885 -68.105155 -67.354168 -68.302290 -67.452735 -68.199029 -67.494978 -68.025363 -67.511406 -68.138011 -67.595892 -68.231885 -67.685072 -68.429019 -67.692112 -68.494730 -67.699153 -68.630847 -67.764864 -68.790431 -67.828229 -68.968791 -67.835269 -69.076745 -67.825882 # -b -70.064763 -69.295001 -69.933340 -69.363059 -69.722125 -69.367753 -69.557846 -69.395915 -69.553153 -69.529684 -69.510910 -69.581315 -69.374793 -69.632945 -69.351325 -69.834773 # -b -68.837368 -70.001398 -68.682477 -69.902831 -68.527586 -69.771408 -68.659009 -69.625905 -68.738801 -69.466320 -68.382082 -69.452239 -68.274128 -69.337244 -68.433712 -69.236330 -68.194335 -69.196434 -67.659257 -69.208168 -67.490285 -69.116641 -67.485591 -68.982872 -67.321313 -68.924201 -67.091323 -68.832674 -67.110097 -68.649621 -67.063161 -68.567482 -66.927044 -68.466568 -67.152340 -68.358614 -66.969287 -68.332798 -66.725216 -68.316371 -67.105404 -68.224844 -67.124178 -68.149745 -67.034999 -68.091074 -66.837864 -67.999548 -66.682973 -67.875166 -66.880108 -67.858738 -66.880108 -67.832923 -66.837864 -67.800067 -66.772153 -67.774252 -66.725216 -67.757824 -66.593794 -67.699153 -66.598487 -67.633442 -66.725216 -67.626401 -66.964594 -67.659257 -67.053773 -67.649869 -67.293150 -67.633442 -67.532528 -67.631095 -67.551302 -67.548956 -67.593545 -67.483244 -67.678031 -67.448042 -67.612320 -67.424573 -67.546609 -67.365902 -67.541915 -67.274376 -67.391718 -67.185196 -67.260295 -67.100710 -67.110097 -67.060814 -67.049080 -67.027958 -66.880108 -67.027958 -66.837864 -67.152340 -66.856639 -67.267335 -66.814396 -67.342434 -66.687667 -67.358862 -66.640730 -67.358862 -66.448290 -67.384677 -66.321561 -67.333047 -66.326254 -67.133566 -66.330948 -66.917657 -66.330948 -66.877761 -66.035247 -66.875414 -65.579961 -66.772153 -65.401601 -66.631343 -65.570574 -66.549204 -65.763014 -66.434209 -65.725465 -66.335642 -65.589348 -66.241768 -65.467313 -66.225341 -65.425070 -66.215953 -65.303034 -66.173710 -65.227936 -66.124427 -65.087125 -66.105652 -65.087125 -66.063409 -65.073044 -66.014125 -65.091819 -66.014125 -64.951009 -66.004738 -64.847748 -66.044634 -64.622452 -66.072796 -64.397156 -66.070449 -64.383075 -66.004738 -64.594290 -65.915558 -64.598984 -65.875662 -64.420624 -65.854541 -64.303283 -65.828725 -64.533272 -65.725465 -64.476948 -65.706690 -64.275121 -65.720771 -64.073293 -65.732505 -64.139004 -65.659753 -64.040437 -65.640979 -63.862078 -65.645672 -63.664943 -65.633938 -63.730655 -65.577614 -63.974726 -65.523637 -64.031050 -65.410989 -64.120229 -65.312422 -64.054518 -65.195080 -63.805753 -65.148143 -63.298837 -65.136409 -63.092316 -65.197427 -62.904569 -65.150490 -63.148640 -65.084779 -63.134559 -65.049576 -62.787227 -64.915806 -62.402346 -64.904072 -62.524382 -64.866523 -62.472751 -64.716326 -62.355409 -64.645920 -62.355409 -64.737447 -62.238068 -64.749181 -62.069095 -64.718672 -61.947060 -64.664695 -61.670134 -64.613065 -61.505855 -64.566128 -61.505855 -64.474601 -61.289946 -64.425318 -61.102199 -64.399503 -60.952002 -64.237571 -60.825273 -64.141351 -60.440392 -64.014622 -60.064898 -63.953604 # -b -59.825521 -65.950761 -60.210402 -66.169016 -60.445086 -66.361457 -60.632832 -66.596140 -60.722012 -66.807356 -60.754868 -66.992756 -60.717318 -67.042039 # -b -75.910729 -70.010786 -75.821549 -69.973236 -75.830937 -69.888750 -76.042152 -69.818345 -76.037458 -69.757327 -75.732370 -69.724472 -75.389732 -69.724472 -75.300552 -69.628251 -75.164436 -69.593049 -74.817104 -69.628251 -74.727924 -69.715084 -74.601195 -69.764368 -74.399367 -69.799570 -74.394674 -69.858241 -74.568339 -69.926299 -74.643438 -69.989664 # -b -74.573033 -70.001398 -74.361818 -69.893444 -74.352431 -69.869975 -74.174071 -69.851201 -73.836127 -69.799570 -73.493489 -69.797224 -73.301048 -69.794877 -73.005347 -69.790183 -72.704952 -69.750287 -72.639241 -69.701003 -72.648628 -69.651720 -72.803519 -69.604783 -72.798826 -69.578968 -72.658016 -69.508563 -72.540674 -69.445198 -72.470269 -69.438158 -72.287216 -69.471013 -71.996208 -69.546112 -71.784993 -69.569581 -71.681732 -69.532031 -71.695813 -69.388874 -71.902335 -69.264492 -72.033757 -69.226943 -71.780299 -69.158884 -71.573778 -69.072052 -71.348482 -69.003993 -71.057474 -68.945322 -70.611575 -68.921854 -70.353423 -68.919507 -70.245469 -68.973484 -70.146902 -69.057971 -70.038948 -69.135416 -70.038948 -69.118988 -70.090578 -69.168272 -70.067110 -69.295001 # -b -90.484575 -68.804512 -90.428251 -68.860836 -90.357846 -68.926548 -90.404783 -69.027462 -90.461107 -69.074398 -90.630079 -69.065011 -90.841294 -69.032155 -90.921087 -68.954710 -90.841294 -68.867877 -90.742727 -68.809206 -90.620692 -68.792778 -90.484575 -68.804512 # -b 159.753761 -69.675188 160.063543 -69.855894 160.265371 -69.977930 # -b 164.132955 -67.548956 164.165811 -67.504366 164.278459 -67.452735 164.419269 -67.466816 164.517836 -67.591199 164.456818 -67.647523 164.334783 -67.663950 164.170505 -67.624054 164.128262 -67.577118 164.189279 -67.523140 # -b 149.864198 -68.501771 150.094188 -68.447793 150.587023 -68.384429 150.995372 -68.414938 151.521063 -68.487690 152.239195 -68.522892 152.943245 -68.482996 153.393838 -68.407897 154.201149 -68.562788 154.492157 -68.656662 154.402977 -68.684824 154.374815 -68.750535 154.398283 -68.910120 154.684597 -69.065011 154.909893 -68.980525 155.398035 -69.025115 156.383706 -69.097867 156.923478 -69.191740 156.829604 -69.074398 156.820217 -68.950016 157.125306 -69.088479 157.289584 -69.219902 157.702627 -69.226943 158.153219 -69.269186 158.303417 -69.323163 158.721153 -69.351325 159.129503 -69.480401 159.753761 -69.675188 # -b 139.923004 -66.690014 140.636442 -66.767459 141.363961 -66.814396 141.640887 -66.793275 141.828634 -66.894189 142.114948 -67.011530 142.373100 -67.023264 142.762675 -66.955206 143.142862 -66.898882 143.527743 -67.042039 143.828138 -67.079588 144.161388 -67.088976 144.452396 -67.145300 144.973393 -67.002143 145.546021 -67.049080 145.827641 -67.234480 145.503778 -67.391718 145.147059 -67.546609 145.273788 -67.673338 145.560102 -67.645176 145.987226 -67.729662 146.301702 -67.818842 146.437818 -67.865778 146.620872 -67.910368 147.024527 -68.020669 147.493894 -68.041791 148.019585 -68.107502 148.155702 -68.267087 148.057135 -68.332798 147.737965 -68.393816 147.841226 -68.450140 148.202638 -68.436059 148.629762 -68.429019 148.864446 -68.377388 148.981788 -68.368001 149.136679 -68.459528 149.310345 -68.506464 149.432380 -68.452487 149.512172 -68.534626 149.662370 -68.525239 149.737469 -68.494730 149.826648 -68.511158 149.864198 -68.501771 # -b 129.894978 -66.007085 130.256390 -65.953108 130.425362 -66.096265 130.932279 -66.197178 131.293691 -66.192485 131.871013 -66.211259 132.133858 -66.192485 132.514046 -66.183097 132.842602 -66.136161 133.532572 -66.131467 133.955002 -66.190138 134.457225 -66.051675 134.518243 -65.863928 134.508855 -65.697303 134.705990 -65.476700 134.907817 -65.312422 135.217600 -65.108247 135.414734 -65.091819 135.588400 -65.249057 135.550850 -65.488434 135.447589 -65.772401 135.208212 -65.990657 134.790476 -66.077490 135.039240 -66.063409 135.226987 -66.077490 135.691660 -66.169016 135.893488 -66.190138 136.029605 -66.302786 136.583458 -66.359110 137.193635 -66.361457 137.616065 -66.476452 138.831726 -66.633690 138.911518 -66.645424 139.409047 -66.668892 139.920657 -66.690014 # -b 119.604106 -66.969287 120.017148 -66.858986 120.439579 -66.788581 120.932414 -66.805009 121.293827 -66.633690 121.650546 -66.462371 121.035675 -66.370844 120.829153 -66.124427 120.852622 -65.831072 121.181179 -65.720771 121.368926 -65.741892 121.523817 -66.009432 121.824212 -66.258196 122.166849 -66.396659 122.410920 -66.481146 122.523568 -66.600834 122.809882 -66.725216 123.007016 -66.786234 123.302718 -66.790928 123.635968 -66.673586 123.865958 -66.624302 123.875345 -66.598487 123.748616 -66.598487 123.542095 -66.572672 123.363735 -66.551551 123.279249 -66.455330 123.434140 -66.335642 123.828409 -66.239422 124.311857 -66.201872 124.861016 -66.258196 125.386707 -66.298092 125.856074 -66.349723 126.179938 -66.361457 126.461558 -66.445943 126.832358 -66.565632 126.926231 -66.582059 127.099897 -66.556244 127.376823 -66.682973 127.494165 -66.833171 127.813335 -67.023264 128.198216 -67.034999 128.705132 -67.006837 129.122869 -67.037345 129.442038 -66.966940 129.568767 -66.753378 129.535912 -66.619609 129.718965 -66.434209 129.714271 -66.340335 129.817532 -66.215953 129.897324 -66.007085 # -b 109.958613 -66.652464 110.212071 -66.650118 110.385737 -66.570325 110.474917 -66.530429 110.709600 -66.483492 110.573484 -66.399006 110.521854 -66.291052 110.925509 -66.164323 111.465281 -66.023513 111.897099 -65.936680 112.122395 -65.896784 112.404015 -65.840460 112.868689 -65.784135 113.248876 -65.753627 113.572739 -65.934333 113.877828 -66.049328 114.248628 -66.169016 114.502086 -66.307480 114.488005 -66.441249 114.703914 -66.537470 114.849418 -66.544510 115.032471 -66.492880 115.173281 -66.483492 115.314091 -66.431862 115.910187 -66.387272 116.360779 -66.518695 116.665868 -66.619609 116.698724 -66.701748 116.942794 -66.903576 117.332369 -66.943472 117.717250 -66.973981 117.740718 -66.981021 118.097437 -66.969287 118.510480 -66.922351 119.017397 -66.920004 119.604106 -66.969287 # -b 99.822632 -65.821685 100.198126 -65.704343 100.428116 -65.582308 100.775447 -65.469660 101.042986 -65.460272 101.263589 -65.540065 101.573371 -65.650366 101.972333 -65.758320 102.272728 -65.767708 102.582510 -65.716077 102.685771 -65.530677 102.906374 -65.354665 102.873518 -65.199774 103.065958 -65.164571 103.310029 -65.291300 103.624505 -65.406295 104.046935 -65.401601 104.525690 -65.457925 104.802616 -65.633938 105.009138 -65.845153 105.304839 -66.054022 104.999751 -66.054022 104.413042 -65.927292 104.140809 -65.885049 104.131422 -65.917905 104.037548 -65.995351 104.413042 -66.084530 104.844859 -66.136161 105.375244 -66.208913 105.830530 -66.333295 106.525193 -66.450637 107.008641 -66.497573 107.553107 -66.577366 107.876970 -66.614915 108.069411 -66.598487 108.219608 -66.661852 108.454292 -66.851945 108.703056 -66.966940 108.721831 -66.976328 109.050388 -66.936432 109.148955 -66.856639 109.280378 -66.711135 109.646484 -66.645424 109.914023 -66.650118 109.956266 -66.652464 # -b 89.545841 -66.920004 90.207649 -66.861333 90.892925 -66.748685 91.850433 -66.624302 92.235314 -66.619609 92.653051 -66.673586 93.047319 -66.678280 93.634028 -66.666546 94.047071 -66.600834 94.309916 -66.626649 # -b 94.300529 -66.636037 94.455420 -66.612568 94.737040 -66.537470 94.835608 -66.417781 94.999886 -66.431862 95.140696 -66.492880 95.173552 -66.481146 95.154777 -66.347376 95.300281 -66.323908 95.520883 -66.265237 95.614757 -66.093918 95.558433 -65.861581 95.497415 -65.619857 95.563126 -65.368746 95.755567 -65.195080 96.093511 -65.152837 96.562878 -65.211508 97.013471 -65.326503 97.318559 -65.450885 97.712827 -65.598736 98.116483 -65.737199 98.440346 -65.816991 98.862777 -65.868622 99.332144 -65.917905 99.524584 -65.946067 99.824979 -65.821685 # -b 79.768926 -68.034750 80.360328 -67.999548 81.083154 -67.943224 81.294369 -67.896287 81.500890 -67.689766 81.421098 -67.485591 81.791898 -67.396411 82.172085 -67.234480 82.284733 -67.114791 82.369219 -66.959900 81.820060 -66.713482 81.350693 -66.384925 81.336612 -66.049328 81.740268 -65.861581 82.082905 -65.819338 82.181473 -66.025860 82.495948 -66.150242 82.829199 -66.345029 83.265710 -66.504614 83.552024 -66.570325 83.843032 -66.502267 84.387498 -66.481146 84.711361 -66.523389 84.922576 -66.661852 85.283989 -66.551551 85.725194 -66.391966 86.152318 -66.328601 86.264966 -66.314520 86.884530 -66.164323 87.649598 -66.129120 88.273857 -66.192485 88.517927 -66.356763 88.921583 -66.701748 89.545841 -66.920004 # -b 69.682229 -68.053525 70.099965 -68.325758 70.240775 -68.440753 70.475459 -68.544014 70.597494 -68.630847 70.766466 -68.687171 71.357869 -68.734107 71.616021 -68.717679 72.038451 -68.553401 72.141712 -68.410244 72.474962 -68.393816 73.249418 -68.546360 73.493489 -68.609725 73.427778 -68.689517 73.301048 -68.900733 73.455940 -68.924201 73.883064 -68.792778 74.629357 -68.987565 74.347737 -69.046236 74.634051 -69.266839 74.788942 -69.438158 74.225701 -69.590702 73.939388 -69.661107 73.807965 -69.797224 74.192846 -69.818345 74.530790 -69.752634 74.990770 -69.590702 75.370957 -69.311429 75.718289 -69.344284 75.446056 -69.522644 75.535235 -69.578968 75.845018 -69.588355 76.042152 -69.524991 76.544375 -69.499176 77.140471 -69.311429 77.581676 -69.238677 77.929007 -69.048583 77.722486 -68.781044 77.886764 -68.640234 78.243483 -68.497077 78.745706 -68.330452 78.989777 -68.199029 79.768926 -68.034750 # -b 59.680017 -67.541915 60.088367 -67.527834 60.853435 -67.555996 61.158523 -67.581811 61.332189 -67.612320 61.275865 -67.652216 61.322802 -67.689766 61.327496 -67.678031 61.501161 -67.668644 61.923592 -67.668644 62.313166 -67.706193 62.580706 -67.762518 62.913956 -67.746090 63.289450 -67.656910 63.664943 -67.633442 64.228184 -67.701500 64.894685 -67.800067 65.326503 -67.809454 65.603429 -67.861085 66.410740 -67.882206 67.124178 -67.959652 67.908021 -67.961998 68.551054 -67.990161 69.161231 -67.900981 69.625905 -67.884553 69.682229 -68.053525 # -b 49.992282 -67.349475 50.273902 -67.302538 50.485117 -67.281416 50.250434 -67.196930 50.104930 -67.105404 50.391244 -67.030305 50.386550 -66.936432 50.039219 -66.887148 # -b 49.903102 -66.671239 50.062687 -66.593794 50.466343 -66.401353 50.799593 -66.368497 51.128150 -66.335642 51.569355 -66.176057 52.179532 -66.077490 52.545639 -66.070449 52.822565 -66.035247 53.385806 -66.016472 53.836398 -66.035247 54.244747 -66.070449 54.653096 -66.075143 55.023896 -66.079837 55.249193 -66.147895 55.615299 -66.258196 55.868757 -66.401353 56.084666 -66.443596 56.103441 -66.457677 56.258332 -66.535123 56.436691 -66.567978 56.802797 -66.638383 57.201759 -66.753378 57.201759 -66.842558 57.070337 -66.887148 56.723005 -66.858986 56.469547 -66.905923 56.450772 -66.999796 56.572808 -67.117138 56.624438 -67.222745 56.812185 -67.182849 57.032787 -67.206318 57.173597 -67.199277 57.412975 -67.157034 57.600721 -67.145300 57.811937 -67.192237 58.018458 -67.206318 58.154574 -67.239173 58.323547 -67.314272 58.562924 -67.330700 58.872706 -67.398758 58.722509 -67.417533 58.445582 -67.412839 58.656797 -67.497325 58.914949 -67.548956 59.182488 -67.506712 59.252893 -67.415186 59.403091 -67.424573 59.445334 -67.473857 59.487577 -67.523140 59.680017 -67.541915 # -b 39.940787 -68.966444 40.278731 -68.823287 40.597901 -68.771657 41.029719 -68.684824 41.395825 -68.581563 41.865192 -68.490036 42.184361 -68.447793 42.376802 -68.318717 42.606792 -68.210763 42.803926 -68.095768 43.310842 -67.983120 43.916326 -67.898634 44.268351 -67.757824 44.808123 -67.687419 45.024032 -67.689766 45.127293 -67.746090 45.620128 -67.696806 45.789100 -67.480897 46.249080 -67.344781 46.690285 -67.443348 46.915581 -67.494978 47.187814 -67.567730 47.018842 -67.586505 46.934356 -67.635788 47.070472 -67.713234 47.126796 -67.821188 47.328624 -67.851697 47.469434 -67.844657 47.779216 -67.818842 48.070224 -67.741396 48.380006 -67.640482 48.088999 -67.401105 48.689788 -67.558343 49.041814 -67.511406 48.994877 -67.436307 48.741419 -67.445695 48.614690 -67.459776 48.370619 -67.340087 48.164097 -67.248561 48.253277 -67.124178 48.417556 -67.084282 48.642852 -67.098363 48.971409 -67.074895 49.168543 -67.138259 49.492406 -67.203971 49.759945 -67.318966 49.661378 -67.375290 49.989935 -67.349475 # -b 50.036872 -66.887148 49.900755 -66.671239 # -b 29.858783 -69.353672 30.262439 -69.344284 30.365700 -69.238677 30.661401 -69.133069 30.905472 -69.156538 31.219948 -69.231636 31.590748 -69.205821 31.905224 -69.332550 32.149294 -69.445198 32.365203 -69.550806 32.904975 -69.604783 33.059866 -69.527338 33.012930 -69.334897 33.186596 -69.299695 32.970687 -69.201127 32.801715 -69.043889 33.186596 -68.766963 33.674737 -68.717679 33.961051 -68.774003 34.275527 -68.921854 34.543066 -69.055624 35.096919 -69.226943 35.524043 -69.407649 35.585061 -69.471013 35.810357 -69.590702 36.307886 -69.670494 36.556651 -69.745593 36.612975 -69.757327 36.819496 -69.731512 37.265395 -69.693963 37.575177 -69.811305 # -b 38.150152 -70.132821 38.535033 -69.940381 38.628906 -69.837120 38.863590 -69.752634 39.478461 -69.675188 39.342344 -69.602436 39.225002 -69.553153 39.351731 -69.557846 39.361119 -69.417036 39.314182 -69.327857 39.422136 -69.219902 39.370506 -69.130722 39.511316 -69.001646 39.699063 -68.992259 39.717838 -68.989912 39.943134 -68.966444 # -b 19.525668 -69.994358 20.041972 -69.987317 # -b 27.507255 -70.053029 27.633984 -69.956808 27.986009 -69.905178 28.582105 -69.844160 28.891887 -69.808958 28.999842 -69.764368 29.079634 -69.625905 29.398804 -69.489788 29.858783 -69.353672 # -b 9.868442 -69.975583 10.051495 -69.963849 # -b 12.600158 -70.104659 12.863003 -69.984970 12.665869 -69.930993 12.886472 -69.841813 13.313596 -69.783143 13.501342 -69.651720 13.477874 -69.548459 13.951935 -69.473360 14.289879 -69.417036 14.571499 -69.381834 14.717003 -69.372446 14.759246 -69.391221 14.839039 -69.370100 15.092497 -69.459279 15.280244 -69.644679 15.303712 -69.712738 15.327180 -69.841813 15.618188 -69.846507 16.345707 -69.792530 16.974658 -69.808958 17.561367 -69.813651 17.819519 -69.855894 17.974410 -69.902831 18.373372 -69.989664 # -b 19.147828 -70.043641 19.523321 -69.994358 # -b -0.150197 -69.130722 0.023468 -69.095520 # -b -0.053977 -69.201127 0.044590 -69.377140 0.208868 -69.520297 0.359066 -69.651720 0.673542 -69.851201 1.016180 -69.980277 # -b 1.342390 -70.062416 1.783595 -69.933340 # -b 6.824597 -70.010786 7.171928 -69.992011 # -b 7.545075 -70.003745 7.906488 -69.994358 8.239738 -69.989664 # -b 9.239490 -70.043641 9.103373 -69.989664 9.295814 -69.961502 9.868442 -69.975583 # -b -10.150062 -70.914317 -9.882523 -70.780547 -9.652533 -70.660859 -9.539885 -70.635044 -9.281733 -70.578720 -9.023581 -70.585760 -8.704411 -70.571679 -8.371161 -70.602188 -8.296062 -70.705449 -7.840776 -70.717183 -7.582624 -70.623310 -7.366715 -70.520049 -7.014690 -70.501274 -6.751845 -70.484846 -6.493693 -70.484846 -6.263703 -70.520049 -6.014938 -70.508315 -5.573733 -70.466072 -5.188852 -70.459031 -4.864989 -70.470765 -4.550513 -70.449644 -4.311136 -70.407401 -3.977886 -70.353423 -3.672797 -70.358117 -3.372402 -70.360464 -3.048539 -70.329955 -2.804468 -70.315874 -2.597946 -70.266591 -2.217759 -70.151596 -1.818797 -70.123434 -1.509015 -70.053029 # -b -20.105337 -73.479408 -19.767392 -73.315129 -19.560871 -73.164932 -19.452916 -73.066365 -19.237008 -72.998307 -18.969468 -72.911474 -18.955387 -72.869231 -18.931919 -72.761276 -18.734785 -72.634547 -18.495408 -72.629854 -17.983798 -72.686178 -17.500350 -72.688524 -17.101388 -72.613426 -16.833848 -72.571183 -16.542841 -72.533633 -16.420805 -72.486697 -16.261221 -72.428026 -15.913889 -72.287216 -15.529008 -72.209770 -15.125352 -72.134671 -14.590274 -72.061919 -14.139682 -72.019676 -13.773575 -72.010289 -13.515424 -72.059573 -13.318289 -72.104162 -12.980345 -72.076000 -12.928715 -72.026717 -13.046056 -71.989168 -12.956877 -71.895294 -12.778517 -71.831930 -12.501591 -71.770912 -12.295069 -71.651223 -12.304457 -71.524494 -12.140178 -71.407152 -11.853864 -71.350828 -11.576938 -71.238180 -11.370416 -71.141960 -11.009004 -71.059821 -10.671059 -71.031659 -10.375358 -70.994109 -10.150062 -70.914317 # -b -30.236624 -76.718040 -29.842355 -76.596005 -29.279115 -76.476316 -28.790973 -76.375402 -28.424867 -76.307344 -27.955500 -76.241633 -27.457971 -76.187656 -27.044928 -76.105516 -26.791470 -76.021030 -26.650660 -75.915423 -26.491075 -75.791040 -26.843100 -75.676046 -26.683515 -75.565744 -26.110888 -75.431975 -25.449080 -75.354529 -25.031343 -75.293511 -24.763804 -75.255962 -24.857678 -75.265349 -24.425860 -75.086990 -24.045673 -74.857000 -23.984655 -74.749046 -23.642017 -74.535484 -23.022453 -74.354777 -22.637572 -74.256210 -22.440438 -74.213967 -22.309015 -74.202233 -21.975764 -74.221008 -21.558027 -74.216314 -21.234164 -74.124788 -21.065192 -74.040301 -20.727248 -73.908879 -20.436240 -73.763375 -20.239106 -73.594403 -20.107683 -73.479408 # -b -31.975629 -77.117002 -31.571973 -77.126390 -31.215254 -76.973845 -31.008733 -76.910481 -30.708338 -76.828342 -30.238971 -76.718040 # -b -40.799729 -77.825747 -39.494888 -77.994719 -38.687577 -77.964210 -37.514160 -77.985331 -36.190545 -77.985331 -35.261198 -77.929007 -35.430170 -77.870336 -34.970190 -77.607491 -33.975132 -77.422091 -32.848651 -77.196795 -31.975629 -77.117002 # -b -50.323186 -77.659121 -49.713009 -77.736567 -49.027733 -77.689630 -47.966963 -77.722486 -47.657181 -77.755341 -46.746609 -77.912579 -45.920523 -78.058083 -44.906690 -78.123795 -44.944240 -78.126141 -44.427936 -78.250524 -43.573688 -78.184812 -42.907187 -77.966557 -42.428432 -77.818706 -41.921516 -77.684936 -40.795035 -77.825747 # -b -45.997969 -77.680243 -46.110617 -77.689630 -46.504885 -77.729526 -47.471781 -77.713098 -48.260318 -77.645040 -48.326029 -77.551167 -47.621978 -77.471374 -46.927315 -77.534739 -46.223265 -77.626266 -45.885320 -77.699017 -46.091842 -77.724833 # -b -60.238564 -72.160487 -59.961638 -72.303643 # -b -60.210402 -72.890352 -59.698792 -73.014735 -59.318605 -73.343291 -59.656549 -73.380841 # -b -60.590589 -75.281777 -59.637774 -75.448403 -58.764752 -75.607987 -58.093557 -75.748797 -57.633577 -76.004602 -57.168904 -76.241633 -56.765248 -76.422339 -56.511790 -76.457542 -56.131603 -76.673450 -55.826514 -76.788445 -55.540200 -76.854157 -55.225724 -76.896400 -54.709421 -77.046597 -54.451269 -77.077106 -54.132099 -77.140471 -54.085162 -77.241385 -54.225972 -77.269547 -54.460656 -77.309443 -54.446575 -77.457293 -54.207198 -77.659121 # -b -60.602324 -69.830079 -60.813539 -70.097618 -60.869863 -70.395667 -60.691503 -70.557598 -60.592936 -70.698408 -60.592936 -70.926051 -60.419270 -71.064515 -60.344172 -71.357869 -60.297235 -71.634795 -60.555387 -71.806114 -60.541306 -71.855398 -60.226830 -71.827236 -60.175200 -71.961006 -60.499063 -72.040798 -60.236217 -72.160487 # -b -59.961638 -72.303643 -60.205708 -72.472616 -60.459167 -72.693218 -60.210402 -72.890352 # -b -59.654202 -73.380841 -60.034389 -73.394922 -60.545999 -73.453593 -60.719665 -73.620218 -60.855782 -73.819699 -60.855782 -73.981631 -60.578855 -74.143562 -61.015367 -74.141215 -60.977817 -74.155296 -60.677422 -74.284372 -60.569468 -74.392327 -60.996592 -74.514362 -61.498815 -74.723231 -61.756966 -74.908630 -61.428409 -75.098724 -60.588243 -75.281777 # -b -69.353672 -69.834773 -69.208168 -70.013132 -69.015727 -70.057722 -68.837368 -70.001398 # -b -74.936792 -70.043641 -75.148008 -70.024867 -75.246575 -70.020173 -75.448403 -70.027213 -75.744104 -70.029560 -75.908382 -70.010786 # -b -74.643438 -69.989664 -74.666906 -70.048335 -74.793636 -70.060069 -74.939139 -70.043641 # -b -80.036465 -73.085140 -79.482612 -73.019428 -78.971002 -73.085140 -78.675301 -73.251765 -78.332663 -73.444205 -77.966557 -73.481755 -77.990025 -73.343291 -78.266952 -73.181360 -78.647139 -73.045243 -78.708157 -72.885659 -78.276339 -72.852803 -77.760035 -72.822294 -77.544126 -72.756583 -77.971250 -72.655669 -78.013493 -72.592304 -77.675549 -72.559449 -77.131083 -72.557102 -76.868238 -72.587611 -76.802526 -72.573530 -76.633554 -72.582917 -76.628861 -72.669750 -76.473970 -72.702605 -76.370709 -72.672097 -76.098476 -72.695565 -76.145413 -72.829335 -75.849711 -73.031162 -75.798081 -73.052284 -75.798081 -72.939636 -75.431975 -72.904433 -75.079949 -72.895046 -74.629357 -72.923208 -74.338350 -72.977185 -73.934694 -72.984226 -73.704704 -73.068712 -73.840820 -73.174319 -73.761028 -73.270540 -73.465327 -73.263499 -73.188400 -73.315129 -72.906780 -73.502876 -72.658016 -73.484102 -72.761276 -73.355026 -72.315378 -73.340945 -71.930497 -73.350332 -71.803768 -73.209522 -72.376395 -73.092180 -72.643935 -73.017081 -72.559449 -72.944329 -72.216811 -72.869231 -72.132325 -72.693218 -72.324765 -72.585264 -72.521899 -72.493737 -72.545368 -72.484350 -72.428026 -72.463228 -72.432719 -72.310684 -72.719033 -72.174568 -73.113302 -72.120590 -73.244724 -72.174568 -73.615524 -72.202730 -73.901838 -72.158140 -74.540177 -72.099469 -74.925058 -71.982127 -75.295858 -71.836623 -75.539929 -71.672345 -75.511767 -71.493985 -75.197291 -71.508066 -74.906284 -71.454089 -74.868734 -71.371950 -74.338350 -71.369603 -74.042648 -71.355522 -73.662461 -71.259302 -73.319823 -71.188897 -73.258805 -71.090330 -73.685929 -70.970641 -73.840820 -70.907277 -74.244476 -70.881461 -74.770167 -70.907277 -75.272390 -70.928398 -75.408506 -70.886155 -75.155048 -70.787588 -75.079949 -70.672593 -74.652825 -70.752385 -74.568339 -70.731264 -74.389980 -70.731264 -74.333656 -70.724223 -74.221008 -70.569332 -74.385286 -70.400360 -74.601195 -70.196186 -74.610582 -70.092925 -74.629357 -70.076497 -74.573033 -70.001398 # -b -90.301522 -72.496084 -89.963578 -72.493737 -89.437887 -72.505471 -88.818322 -72.517205 -88.198758 -72.528940 -87.757553 -72.561795 -87.311654 -72.540674 -86.593523 -72.636894 -86.175786 -72.789438 -85.800292 -72.880965 -85.293376 -72.885659 -84.486065 -72.866884 -83.880581 -72.885659 -82.998171 -72.927902 -82.275346 -72.988919 -81.721493 -73.033509 -81.252126 -73.007694 -80.496445 -73.061671 -80.036465 -73.085140 # -b -100.054969 -72.014983 -99.867222 -72.031411 # -b -100.045582 -72.087735 -99.773349 -72.141712 -99.524584 -72.179261 -99.463566 -72.181608 -99.275820 -72.169874 -99.120929 -72.268441 -98.956650 -72.221504 -98.642174 -72.270788 -98.440346 -72.348233 -98.280762 -72.317724 -98.177501 -72.219157 -98.243212 -72.137018 -98.468508 -72.155793 -98.421572 -72.036104 -98.135258 -72.019676 -97.961592 -72.092428 -98.003835 -72.212117 -97.802007 -72.240279 -97.562630 -72.282522 -97.539162 -72.120590 -97.374883 -72.101816 -97.327946 -72.176914 -97.093263 -72.219157 -96.957147 -72.099469 -96.797562 -72.047838 -96.544104 -71.996208 -96.628590 -72.108856 -96.581653 -72.252013 -96.337582 -72.207423 -95.929233 -72.209770 -95.891683 -72.291909 -96.206159 -72.374049 -96.126367 -72.437413 -95.760261 -72.411598 -95.694549 -72.479656 -96.116980 -72.533633 -95.919845 -72.634547 -95.539658 -72.726074 -95.304975 -72.756583 -95.197020 -72.714340 -95.121921 -72.707299 -95.018661 -72.704952 -94.906013 -72.733114 -94.525825 -72.716686 -94.079927 -72.660362 -93.676271 -72.704952 -93.282003 -72.733114 -92.887734 -72.744848 -92.408980 -72.737808 -91.953694 -72.690871 -91.470246 -72.599345 -90.860069 -72.543021 -90.301522 -72.496084 # -b -104.903530 -73.308089 -104.880062 -73.258805 -104.701702 -73.247071 -104.457632 -73.279927 -104.298047 -73.345638 -104.161930 -73.418390 -104.194786 -73.486448 -104.330902 -73.509917 -104.537424 -73.474714 -104.795576 -73.418390 -104.908224 -73.350332 -104.903530 -73.308089 # -b -110.029018 -74.350084 -109.681687 -74.448651 -109.686380 -74.587114 -109.193545 -74.718537 -108.329910 -74.910977 -107.602391 -75.040053 -107.010988 -75.070562 -107.208122 -74.871081 -107.494436 -74.605889 -107.597697 -74.392327 -107.226897 -74.289066 -106.612026 -74.260904 -105.607581 -74.274985 -104.795576 -74.352431 -104.894143 -74.439263 -105.250862 -74.657519 -105.480852 -74.814757 -105.222700 -74.878122 -104.931692 -74.810063 -104.631297 -74.805370 -103.711338 -74.894549 -102.843009 -75.016585 -102.106103 -75.143314 -101.505313 -75.115152 -101.181450 -75.009544 -101.350422 -74.833532 -101.636736 -74.720884 -101.890194 -74.652825 -101.791627 -74.526096 -101.927743 -74.314881 -101.988761 -74.218661 -101.927743 -74.138869 -102.021617 -73.983977 -102.134265 -73.838474 -102.317318 -73.749294 -101.998148 -73.739907 -101.556943 -73.753988 -101.143900 -73.751641 -100.876361 -73.700010 -100.974928 -73.589709 -101.289404 -73.498183 -101.594493 -73.458286 -102.016923 -73.498183 -102.331399 -73.507570 -102.678731 -73.500529 -103.011981 -73.430124 -103.124629 -73.376147 -103.274827 -73.291661 -103.415637 -73.218909 -103.495429 -73.150851 -103.490736 -73.078099 -103.227890 -73.017081 -103.115242 -72.958410 -102.899333 -72.941983 -102.800766 -72.890352 -102.838315 -72.859843 -102.871171 -72.758929 -102.997900 -72.669750 -103.335844 -72.564142 -103.589303 -72.496084 -103.584609 -72.423332 -103.152791 -72.404557 -102.650569 -72.411598 -102.279769 -72.324765 -102.214057 -72.226198 -101.786933 -72.141712 -101.214305 -72.050185 -100.712083 -72.061919 -100.054969 -72.014983 # -b -99.864875 -72.031411 -100.043235 -72.087735 # -b -120.141531 -73.915919 -119.808280 -73.951122 -119.521966 -73.986324 -118.954032 -74.037955 -118.306306 -74.059076 -117.588174 -74.127134 -117.179825 -74.155296 -116.611891 -74.103666 -115.987633 -74.134175 -115.424392 -74.181112 -114.734423 -74.136522 -114.147714 -74.012139 -113.978742 -74.061423 -114.147714 -74.162337 -113.748752 -74.141215 -113.448357 -74.190499 -113.194899 -74.289066 -112.622271 -74.326615 -112.026175 -74.371205 -111.692924 -74.340696 -111.472322 -74.232742 -111.031117 -74.267944 -110.603993 -74.331309 -110.026671 -74.350084 # -b -130.223534 -74.192846 -129.721312 -74.199886 -129.068892 -74.155296 -128.411778 -74.096626 # -b -127.503553 -73.988671 -127.024798 -73.913572 -126.409927 -73.803271 -125.954641 -73.718785 -125.668327 -73.620218 -125.752814 -73.516957 -125.513436 -73.369107 -124.889178 -73.336251 -124.466748 -73.369107 -124.030237 -73.470021 -123.804940 -73.568588 -123.499852 -73.624912 -123.030485 -73.700010 -122.528262 -73.725826 -121.880536 -73.765722 -121.214034 -73.807965 -120.763442 -73.852555 -120.392642 -73.892451 -120.247138 -73.904185 -120.143878 -73.915919 # -b -140.474510 -75.126886 -139.211913 -74.910977 -137.512804 -74.744352 -135.931037 -74.673947 -135.316167 -74.737312 # -b -135.318514 -74.737312 -134.839759 -74.824144 -134.515896 -74.807717 -134.201420 -74.765474 -133.891638 -74.739658 -133.520838 -74.706803 -133.046777 -74.634051 -132.783932 -74.603542 -132.333339 -74.540177 -131.948458 -74.418142 -131.446236 -74.307841 -131.131760 -74.249170 -130.629537 -74.199886 -130.225881 -74.192846 # -b -150.134084 -76.614780 -149.514519 -76.462235 -148.716595 -76.333159 -148.143968 -76.260408 # -b -145.801826 -75.335754 -145.750196 -75.488299 -146.186707 -75.596253 -146.623218 -75.666658 -146.956469 -75.690127 -147.224008 -75.607987 -146.979937 -75.554010 -146.674849 -75.497686 -146.247725 -75.424934 -145.923861 -75.349835 -145.801826 -75.335754 # -b -147.461038 -76.347240 -147.198193 -76.450501 -146.625565 -76.530294 -145.827641 -76.546721 -145.621120 -76.441114 -146.090487 -76.265101 -146.588016 -76.089089 -146.634953 -75.978787 -146.043550 -75.830937 -145.043798 -75.626762 -144.015885 -75.483605 -142.931647 -75.347489 -142.279227 -75.237187 -141.767616 -75.166782 -141.453141 -75.171476 -140.472163 -75.126886 # -b -160.464852 -77.975944 -159.629379 -77.900845 -158.634321 -77.823400 -158.568609 -77.652081 -158.624933 -77.499536 -158.709419 -77.285974 -158.465348 -77.203835 -157.348255 -77.173326 -156.202999 -77.138124 -154.935708 -77.117002 -154.353693 -77.161592 -153.856164 -77.163939 -153.283536 -77.276587 -152.701521 -77.260159 -151.894210 -77.255466 -151.415456 -77.107615 -150.936701 -76.884666 -150.542433 -76.772018 -150.157552 -76.718040 -150.157552 -76.711000 -150.129390 -76.614780 # -b -170.490532 -78.565000 -169.467311 -78.560306 -168.415929 -78.569693 -166.989054 -78.546225 -166.144193 -78.529797 -164.998937 -78.565000 -164.454472 -78.407762 -164.050816 -78.248177 -163.478188 -78.201240 -162.408031 -78.173078 -161.600720 -78.034615 -160.464852 -77.975944 # -b 179.938890 -78.330316 180.000000 -78.335895 # -b -180.000000 -78.335895 -178.981566 -78.428883 -177.667338 -78.513369 -176.287399 -78.506329 -175.067045 -78.534491 -173.949952 -78.515716 -173.865466 -78.520410 -173.621395 -78.508676 -171.837800 -78.574387 -170.486023 -78.565000 # -b 169.988309 -71.411846 170.199524 -71.585512 170.377884 -71.763871 170.485838 -71.914069 170.274623 -72.031411 # -b 169.910863 -77.530045 170.004737 -77.513617 170.661851 -77.562901 172.257698 -77.675549 173.524989 -77.752995 174.351075 -77.811666 175.299197 -77.851562 176.482002 -77.952476 177.439510 -78.048696 178.500280 -78.189506 179.936543 -78.330316 # -b 160.263024 -69.977930 160.281799 -70.020173 160.225475 -70.125780 160.671373 -70.322915 161.018705 -70.405054 161.201758 -70.348730 161.459910 -70.416788 161.858872 -70.456684 162.112330 -70.550558 162.271915 -70.719530 162.666183 -70.853299 162.839849 -70.825137 162.975966 -70.731264 163.590836 -70.792282 164.088365 -70.764120 164.247950 -70.752385 164.524877 -70.759426 165.304026 -70.717183 165.862573 -70.628003 166.275616 -70.658512 166.167661 -70.747692 166.299084 -70.759426 166.571317 -70.752385 166.890487 -70.850953 166.989054 -71.019925 167.458421 -70.994109 167.599231 -71.059821 168.124922 -71.170122 168.570820 -71.332054 169.021413 -71.510413 169.293646 -71.639489 169.589347 -71.681732 169.772400 -71.669998 169.880354 -71.571431 169.777094 -71.437661 169.988309 -71.411846 # -b 170.274623 -72.031411 169.974228 -72.080694 169.678527 -72.141712 169.903823 -72.298950 169.913210 -72.432719 169.852192 -72.660362 169.565879 -72.866884 169.331195 -73.014735 169.073043 -73.125036 168.796117 -73.244724 168.383074 -73.357372 168.054517 -73.446552 167.613312 -73.491142 167.021909 -73.723479 166.871712 -73.922960 166.618254 -74.103666 166.223985 -74.274985 165.571565 -74.310188 164.952001 -74.265598 164.895677 -74.296107 165.125667 -74.411101 165.332188 -74.561299 165.430755 -74.666906 164.740786 -74.652825 164.144689 -74.753739 163.839601 -74.918018 163.421864 -75.101071 163.501657 -75.263003 163.872457 -75.471871 164.360598 -75.549316 164.229175 -75.631456 163.431252 -75.577478 162.689652 -75.532889 162.708426 -75.593906 162.877398 -75.661965 162.445581 -75.837977 162.501905 -75.962359 162.642715 -76.121944 162.952497 -76.157147 162.802300 -76.295610 162.539454 -76.347240 162.614553 -76.398871 162.553535 -76.577230 162.539454 -76.715694 162.609859 -76.875278 162.445581 -76.936296 162.370482 -76.962111 162.483130 -77.006701 162.774138 -77.117002 162.736588 -77.269547 162.849236 -77.356380 162.957191 -77.461987 162.943110 -77.600450 163.182487 -77.717792 163.421864 -77.811666 163.487576 -77.954822 163.731646 -77.882071 163.830214 -77.882071 164.215094 -77.856255 164.365292 -77.785850 164.276112 -77.736567 163.971024 -77.638000 164.149383 -77.483109 164.313662 -77.332911 164.327743 -77.210876 164.416922 -77.145164 164.538958 -77.142818 164.675074 -77.217916 164.707930 -77.241385 164.825272 -77.288321 164.933226 -77.365767 165.294639 -77.424438 165.557484 -77.440866 165.810942 -77.476068 166.012770 -77.605144 166.177049 -77.530045 # -b 169.603428 -73.338598 169.373438 -73.315129 169.495474 -73.308089 169.603428 -73.338598 169.340582 -73.390228 169.373438 -73.315129 169.495474 -73.308089 169.603428 -73.338598 # -b 37.577524 -69.811305 37.962405 -70.020173 38.150152 -70.132821 # -b 20.041972 -69.987317 20.548888 -70.055375 21.083967 -70.095272 21.426605 -70.158636 21.328038 -70.156289 20.929076 -70.168024 21.022949 -70.236082 21.792711 -70.236082 22.459212 -70.207920 23.008372 -70.233735 23.332235 -70.393320 23.933025 -70.440256 24.378923 -70.339342 24.519733 -70.261897 24.641769 -70.226694 24.791966 -70.217307 24.867065 -70.243122 24.890533 -70.250163 25.284802 -70.203226 25.566422 -70.283018 25.730700 -70.189145 26.092113 -70.132821 26.279860 -70.078844 26.148437 -70.006092 26.617804 -70.022520 27.082477 -70.022520 27.509601 -70.053029 # -b 10.051495 -69.963849 10.084351 -70.027213 10.525556 -70.001398 10.764933 -70.020173 11.004310 -70.036601 11.422047 -70.057722 11.928963 -70.043641 12.327925 -70.095272 12.600158 -70.104659 # -b 18.373372 -69.989664 18.758253 -70.017826 19.147828 -70.043641 # -b 1.013833 -69.980277 1.342390 -70.062416 # -b 1.781248 -69.933340 2.208372 -70.015479 2.457136 -70.074150 2.813855 -70.111699 3.222205 -70.099965 3.630554 -70.107006 4.062372 -70.069456 4.677242 -70.024867 5.080898 -70.036601 5.118447 -70.128127 5.447004 -70.137515 5.615976 -70.207920 5.564346 -70.290059 5.775561 -70.259550 5.850660 -70.179758 5.972695 -70.158636 6.014938 -70.224348 6.277784 -70.252510 6.399819 -70.203226 6.259009 -70.128127 6.493693 -70.038948 6.822250 -70.010786 # -b 7.171928 -69.992011 7.547422 -70.003745 # -b 8.242085 -69.989664 8.838181 -70.008439 8.936748 -70.076497 9.194900 -70.107006 9.241837 -70.043641 # -b -19.443529 81.768430 -19.274557 81.791898 -19.039873 81.782511 -18.908451 81.744961 -18.720704 81.719146 -18.645605 81.686290 -18.561119 81.665169 -18.589281 81.644047 -18.777028 81.648741 -18.974162 81.686290 -19.283944 81.733227 -19.443529 81.768430 # -b -19.598420 80.231253 -19.504547 80.203091 -19.288638 80.186663 -19.063342 80.153807 -19.091504 80.123298 -19.391899 80.099830 -19.729843 80.052893 -19.926977 80.020037 -19.936364 80.099830 -19.898815 80.177275 -19.767392 80.212478 -19.598420 80.231253 # -b -20.018504 81.463341 -19.990342 81.496197 -19.811982 81.524359 -19.596073 81.522012 -19.333228 81.524359 -19.183030 81.522012 -18.948347 81.458647 -18.957734 81.510278 -18.704276 81.486809 -18.413268 81.449260 -18.225522 81.453954 -18.216134 81.496197 -18.300620 81.543133 -18.187972 81.559561 -17.981451 81.529052 -18.047162 81.573642 -17.812479 81.575989 -17.943901 81.611192 -18.065937 81.629966 -17.972063 81.662822 -18.065937 81.693331 -18.103486 81.709759 -18.075324 81.709759 -17.765542 81.705065 -17.568408 81.676903 -17.699831 81.712106 -17.643506 81.763736 -17.605957 81.824754 -17.455760 81.815366 -17.380661 81.852916 -17.221076 81.834141 -17.089653 81.845875 -16.977005 81.874037 -16.742322 81.869343 -16.423152 81.871690 -16.179081 81.890465 -15.878686 81.885771 -15.634616 81.878731 -15.456256 81.892812 -15.202798 81.904546 -14.761593 81.885771 -14.555071 81.852916 -14.376712 81.831794 -14.151416 81.815366 -13.944894 81.808326 -13.691436 81.810673 -13.475527 81.796592 -13.231456 81.766083 -12.959224 81.740268 -12.743315 81.683943 -12.546181 81.651088 -12.349046 81.615885 -12.292722 81.568949 -12.574343 81.496197 -12.837188 81.442219 -13.175132 81.388242 -13.269006 81.331918 -13.372267 81.296716 -13.691436 81.275594 -13.747760 81.221617 -13.851021 81.191108 -14.048155 81.165293 -14.038768 81.130090 -14.151416 81.108969 -14.264064 81.108969 -14.451811 81.111316 -14.695882 81.111316 -14.958727 81.116009 -15.118312 81.080807 -15.118312 81.047951 -15.071375 81.012749 -14.855466 80.972852 -14.742818 80.907141 -14.921178 80.853164 -15.306059 80.846123 -15.690940 80.832042 -15.963173 80.806227 -16.010109 80.794493 -16.010109 80.766331 -16.047659 80.731128 -16.329279 80.702966 -16.714160 80.705313 -17.070879 80.724088 -17.390048 80.731128 -17.718605 80.742863 -17.925127 80.782759 -18.094099 80.754597 -18.150423 80.702966 -18.319395 80.688885 -18.488367 80.658377 -18.591628 80.623174 -18.835699 80.613787 -19.145481 80.637255 -19.464651 80.646642 -19.736883 80.665417 # -b -20.018504 80.627868 -19.708721 80.606746 -19.502200 80.580931 -19.267516 80.559809 -18.929572 80.552769 -18.638565 80.538688 -18.206747 80.543382 -17.840641 80.566850 -17.718605 80.604399 -17.249238 80.595012 -16.948843 80.564503 -16.629674 80.552769 -16.263567 80.536341 -16.244793 80.496445 -16.376216 80.435427 -16.573350 80.386144 -16.704772 80.390837 -16.826808 80.383797 -16.704772 80.329820 -16.826808 80.278189 -17.061491 80.226559 -17.455760 80.217172 -17.774929 80.224212 -18.009613 80.224212 -18.366332 80.212478 -18.657339 80.224212 -19.042220 80.231253 -19.333228 80.250027 -19.530362 80.268802 -19.896468 80.271149 # -b -19.774433 79.980141 -19.652397 80.005956 -19.427101 80.034118 -19.107932 80.062280 -18.910797 80.052893 -18.694889 80.066974 -18.469592 80.102177 -18.272458 80.111564 -18.019000 80.125645 -17.709218 80.113911 -17.474534 80.071668 -17.512084 80.012997 # -b -21.121516 82.153311 -20.999481 82.139230 -20.905607 82.108721 -20.849283 82.080559 -20.670924 82.043009 -20.539501 82.010154 -20.314205 81.977298 -20.229719 81.925668 -20.051359 81.876384 -20.041972 81.834141 -20.239106 81.831794 -20.539501 81.855262 -20.792959 81.920974 -20.999481 81.979645 -21.206002 82.014847 -21.374974 82.071171 -21.299876 82.134536 -21.121516 82.153311 # -b -22.851134 82.033622 -22.785422 82.017194 -22.663387 81.956176 -22.560126 81.911587 -22.531964 81.871690 -22.494415 81.815366 -22.513189 81.761389 -22.531964 81.698025 -22.522577 81.625273 -22.550739 81.550174 -22.635225 81.477422 -22.710324 81.421098 -22.785422 81.390589 -22.898070 81.338959 -23.076430 81.294369 -23.414374 81.277941 -23.714769 81.231004 -23.564572 81.221617 -23.461311 81.242738 -23.217240 81.252126 -23.358050 81.179374 -23.461311 81.123050 -23.630283 81.036217 -23.808642 80.989280 -24.043326 80.923569 -24.146587 80.839083 -24.249847 80.745209 -24.597179 80.665417 -24.512693 80.639602 -24.737989 80.569197 -24.906961 80.482364 -24.963285 80.433080 -24.925736 80.430734 -24.709827 80.482364 -24.578404 80.524607 -24.484531 80.557463 -24.268622 80.590318 -24.146587 80.625521 -23.902516 80.688885 -23.921290 80.726435 -23.780480 80.773371 -23.686607 80.827349 -23.827417 80.829696 -23.818030 80.855511 -23.649058 80.874285 -23.442536 80.911835 -23.160916 80.944690 -23.020106 80.996321 -22.879296 81.047951 -22.691549 81.120703 -22.362992 81.188761 -22.071984 81.245085 -21.931174 81.294369 -21.762202 81.348346 -21.715265 81.402323 -21.546293 81.446913 -21.255286 81.517318 -20.954891 81.573642 -20.767144 81.594764 -20.513686 81.622926 -20.325939 81.648741 -20.532461 81.597111 -20.541848 81.543133 -20.466749 81.507931 -20.485524 81.479769 -20.438587 81.418751 -20.156967 81.453954 -20.025544 81.463341 # -b -19.741577 80.665417 -20.060747 80.679498 -20.567663 80.634908 -20.717861 80.576237 -21.497010 80.555116 -21.252939 80.531647 -20.990093 80.533994 -20.886833 80.487058 -20.614600 80.533994 -20.426853 80.555116 -20.286043 80.604399 -20.023197 80.627868 # -b -19.896468 80.271149 -20.084215 80.203091 -20.206250 80.139726 -20.553582 80.088096 -20.403385 80.078708 -20.525420 80.012997 # -b -30.175606 83.500394 -29.987859 83.502741 -29.893986 83.483966 # -b -30.053571 83.406520 -29.715626 83.399480 -29.584204 83.404174 -29.302583 83.420601 -29.471556 83.422948 -29.696852 83.444070 -29.584204 83.451110 -29.358907 83.460498 -28.983414 83.465191 -28.420173 83.451110 -27.706736 83.418255 -27.218594 83.373665 -26.936974 83.343156 -26.768001 83.303260 -26.880650 83.251629 -27.181044 83.195305 -27.537763 83.176531 -27.838158 83.150715 -28.345075 83.129594 -28.927090 83.136634 -29.208710 83.138981 -29.678077 83.146022 # -b -30.318763 83.089698 -29.924495 83.080310 -29.586550 83.061536 -29.586550 83.028680 -29.661649 82.993477 -29.398804 83.021640 -29.267381 83.052148 -28.798014 83.047455 -28.366196 83.040414 -27.971928 83.035721 -27.690308 83.042761 -27.427462 83.077964 -26.995644 83.108472 -26.582602 83.129594 -26.150784 83.129594 -25.925488 83.103779 -25.775290 83.089698 -25.944262 83.061536 -25.887938 83.014599 -25.756516 82.998171 -25.681417 82.974703 -25.756516 82.937153 -25.887938 82.906645 -25.925488 82.897257 -26.188333 82.864402 -26.469953 82.843280 -26.207108 82.845627 -26.310369 82.808078 -26.498115 82.782262 -26.873609 82.758794 -27.220941 82.732979 -27.023807 82.730632 -26.695250 82.744713 -26.282207 82.758794 -26.160171 82.784609 -25.831614 82.817465 -25.005528 82.862055 -24.648809 82.855014 -24.385964 82.873789 -24.423513 82.847974 -24.432901 82.831546 -24.357802 82.801037 -24.385964 82.768181 -24.339027 82.732979 -24.104344 82.775222 -23.907209 82.810424 -23.738237 82.819812 -23.588040 82.791650 -23.419068 82.768181 -23.297032 82.754100 -23.043574 82.749407 -22.930926 82.772875 -22.827665 82.782262 -22.715017 82.747060 -22.508496 82.737672 -22.273812 82.709510 -21.954643 82.664921 -21.719959 82.636759 -21.569762 82.594516 -21.588536 82.559313 -21.644860 82.535845 -21.654248 82.533498 -21.823220 82.526457 -22.039129 82.484214 -22.330136 82.451359 -22.583594 82.425543 -22.536658 82.380954 -22.686855 82.331670 -23.043574 82.296467 -23.353356 82.270652 -23.738237 82.256571 -24.010470 82.265959 -24.282703 82.256571 -24.789619 82.219022 -25.052465 82.172085 -25.521832 82.136883 -25.765903 82.125148 -25.916100 82.125148 -25.925488 82.125148 -26.207108 82.125148 -26.423017 82.122802 -26.685862 82.122802 -27.023807 82.134536 -27.333589 82.134536 -27.624596 82.155657 -27.953153 82.155657 -28.384971 82.158004 -28.788627 82.162698 -29.248606 82.150964 # -b -30.163872 81.946789 -29.901026 81.958523 -29.412885 81.974951 -29.178201 81.979645 -28.549249 81.979645 -28.164368 81.974951 -27.629290 81.979645 -27.188085 81.972604 -26.662394 81.970257 -26.596683 81.949136 -26.164865 81.909240 -26.127315 81.796592 -26.343224 81.716799 -26.981563 81.641700 -27.291346 81.620579 -27.685614 81.554868 -28.136206 81.507931 -28.258242 81.446913 -28.145594 81.430485 -27.995396 81.407017 -27.732551 81.404670 -27.169310 81.491503 -26.408936 81.575989 -25.742435 81.627619 -25.723660 81.665169 -25.338779 81.695678 -24.803700 81.695678 -24.615954 81.733227 -24.775538 81.763736 -24.784926 81.805979 -24.803700 81.850569 -24.860025 81.902199 -24.803700 81.951483 -24.550242 81.986685 -24.362495 82.005460 -23.893128 82.031275 -23.395599 82.035969 -22.907458 82.045356 -22.851134 82.033622 # -b -40.055782 83.155409 -39.886810 83.108472 # -b -40.079250 82.836240 -39.900891 82.770528 -39.722531 82.754100 -39.647433 82.808078 -39.853954 82.808078 -39.975990 82.850321 # -b -40.067516 82.991131 -39.767121 82.981743 -39.278980 82.988784 -38.959810 83.009905 -38.584316 82.986437 -38.584316 82.998171 -38.828387 83.019293 -39.147557 83.019293 -39.485501 83.026333 -39.842220 83.021640 -39.879769 83.049802 -39.560600 83.073270 -39.185106 83.096738 -38.772063 83.106126 -38.359020 83.110819 -38.302696 83.134288 -38.565542 83.141328 -38.847162 83.143675 -38.903486 83.153062 -39.091233 83.167143 -39.091233 83.185918 -39.335304 83.190612 -39.710797 83.185918 -39.898544 83.199999 -39.954868 83.216427 # -b -40.022926 83.251629 -39.947828 83.277445 -39.947828 83.298566 # -b -40.067516 83.359584 -39.879769 83.378358 # -b -40.001805 83.404174 -39.945481 83.429989 -39.757734 83.420601 -39.494888 83.406520 -39.325916 83.394786 -39.119395 83.366624 -39.006747 83.373665 -39.250818 83.420601 -39.175719 83.448764 -39.138169 83.479272 -38.894099 83.505088 -38.743901 83.495700 -38.687577 83.469885 -38.499830 83.460498 -38.236985 83.446417 -38.086787 83.411214 -37.861491 83.366624 -37.598646 83.345503 -37.561096 83.354890 -37.579871 83.376012 -37.805167 83.394786 -37.842716 83.422948 -37.767618 83.434683 -37.823942 83.460498 -38.049238 83.486313 -38.086787 83.514475 -37.917815 83.537943 -37.542322 83.554371 -37.166828 83.556718 -37.054180 83.542637 -36.866433 83.552024 -36.659912 83.547331 -36.509714 83.537943 -36.321967 83.563758 -36.190545 83.589574 -35.927699 83.591920 -35.758727 83.542637 -35.758727 83.568452 -35.608529 83.561412 -35.420783 83.507434 -35.214261 83.460498 -35.176712 83.495700 -35.270585 83.530903 -35.326909 83.561412 -35.064064 83.589574 -34.838767 83.603655 -34.538373 83.606001 -34.313076 83.608348 -34.050231 83.608348 -33.824935 83.606001 -33.768611 83.589574 -33.618413 83.568452 -33.336793 83.582533 -33.111497 83.596614 -32.923750 83.570799 -32.867426 83.566105 -32.642130 83.552024 -32.266636 83.570799 -31.816044 83.587227 -31.496874 83.577839 -31.158930 83.549677 -30.802211 83.528556 -30.670788 83.526209 -30.633239 83.481619 -30.332844 83.472232 -30.426717 83.498047 -30.163872 83.500394 # -b -29.886945 83.483966 -30.055917 83.474579 -30.281214 83.462845 -30.187340 83.444070 -30.149791 83.439376 -30.055917 83.406520 # -b -29.678077 83.146022 -30.109895 83.162450 -30.598036 83.167143 -31.198826 83.162450 -31.574320 83.157756 -31.855940 83.153062 -32.250208 83.117860 -32.531829 83.092045 -32.832223 83.066229 -33.264041 83.042761 -33.677084 83.056842 -33.902380 83.080310 -34.071352 83.099085 -34.202775 83.108472 -34.521945 83.131941 -34.709692 83.148369 -34.803565 83.122553 -34.521945 83.099085 -34.221550 83.087351 -33.921155 83.054495 -33.864831 83.028680 -34.184000 82.993477 -34.540719 82.974703 -34.934988 82.984090 -35.066410 82.960622 -35.329256 82.932460 -35.836172 82.923072 -36.211666 82.913685 -36.605934 82.899604 -36.756132 82.887870 -36.493286 82.880829 -36.587160 82.847974 -36.558998 82.803384 -36.436962 82.803384 -36.324314 82.843280 -36.042694 82.880829 -35.742299 82.894910 -35.685975 82.892564 -35.404355 82.885523 -35.197833 82.880829 -35.141509 82.843280 -35.150897 82.784609 -34.981924 82.803384 -34.981924 82.843280 -34.981924 82.876136 -34.906826 82.911338 -34.625205 82.927766 -34.381135 82.932460 -34.061965 82.930113 -33.817894 82.934807 -33.423626 82.948888 -33.160780 82.953581 -33.066907 82.911338 -32.935484 82.901951 -32.860385 82.948888 -32.785287 82.981743 -32.484892 83.016946 -32.128173 83.049802 -31.809003 83.054495 -31.546158 83.089698 -31.114340 83.103779 -30.701297 83.101432 -30.250705 83.089698 # -b -29.666343 82.150964 -30.192034 82.125148 -30.698950 82.104027 -31.177705 82.104027 -31.337289 82.118108 -31.543811 82.150964 -31.769107 82.155657 -31.994403 82.167392 -32.369897 82.174432 -32.904975 82.158004 -32.651517 82.141576 -32.219699 82.146270 -31.853593 82.136883 -31.590748 82.111067 -31.421776 82.092293 -31.384226 82.045356 -31.778494 82.014847 -32.144601 81.984338 -32.557644 81.958523 -32.782940 81.956176 -33.008236 81.930361 -33.374342 81.899852 -33.609026 81.871690 -34.050231 81.829447 -34.134717 81.756695 -34.106555 81.702718 -34.050231 81.637007 -33.731061 81.655781 -33.496378 81.681597 -33.167821 81.747308 -32.736003 81.801285 -32.332348 81.829447 -31.862981 81.852916 -31.449938 81.876384 -31.158930 81.897505 -30.914859 81.899852 -30.961796 81.848222 -30.661401 81.890465 -30.539366 81.925668 -30.163872 81.946789 # -b -48.415209 82.622678 -48.377659 82.625024 -48.067877 82.634412 -47.851968 82.650840 -47.758095 82.643799 -47.589123 82.632065 -47.560961 82.648493 -47.523411 82.671961 -47.354439 82.671961 -47.147918 82.669614 -46.913234 82.650840 -46.744262 82.625024 -46.575290 82.599209 -46.340606 82.575741 -46.171634 82.545232 -46.012050 82.535845 -45.843077 82.502989 -45.786753 82.465440 -45.655331 82.430237 -45.448809 82.402075 -45.326774 82.364526 -45.298612 82.324629 -45.505133 82.294121 -45.599007 82.289427 -45.786753 82.254224 -45.861852 82.226062 -45.927563 82.195554 -45.871239 82.160351 -45.758591 82.122802 -45.645943 82.082905 -45.664718 82.047703 -45.824303 82.028928 -46.012050 82.066478 -46.096536 82.122802 -46.227958 82.169738 -46.453255 82.202594 -46.669163 82.226062 -46.988333 82.268305 -47.213629 82.294121 -47.307503 82.317589 -47.476475 82.341057 -47.654834 82.369219 -47.814419 82.413809 -47.908292 82.477174 -48.077264 82.533498 -48.218075 82.578088 -48.358885 82.608597 -48.415209 82.622678 # -b -47.699424 82.944194 -47.661875 82.951234 -47.530452 82.937153 -47.305156 82.941847 -46.929662 82.897257 -46.948437 82.925419 -47.136184 82.965315 -47.267606 82.970009 -47.474128 82.972356 -47.530452 82.995824 -47.399029 83.035721 -47.136184 83.042761 -47.004761 83.073270 -46.835789 83.066229 -46.798239 83.038067 -46.629267 83.012252 -46.572943 82.998171 -46.328872 82.979396 -46.047252 82.937153 -45.990928 82.883176 -45.934604 82.843280 -46.103576 82.843280 -46.366422 82.855014 -46.554168 82.855014 -46.704366 82.840933 -46.929662 82.845627 -47.211282 82.850321 -47.436578 82.897257 -47.586776 82.916032 -47.699424 82.944194 # -b -42.538734 83.164796 -42.426085 83.164796 -42.182015 83.167143 -42.013042 83.155409 -41.900394 83.122553 -41.712648 83.073270 -41.487351 83.047455 -41.262055 83.023986 -41.093083 82.993477 -40.942886 82.960622 -41.168182 82.953581 -41.468577 82.970009 -41.731422 83.009905 -41.937944 83.047455 -42.238339 83.096738 -42.388536 83.124900 -42.519959 83.148369 -42.538734 83.164796 # -b -41.632855 83.134288 -41.632855 83.167143 -41.520207 83.164796 -41.201038 83.148369 -41.013291 83.124900 -40.825544 83.103779 -40.581473 83.082657 -40.412501 83.049802 -40.450050 83.016946 -40.525149 82.986437 -40.637797 82.955928 -40.844319 83.000518 -41.144713 83.054495 -41.463883 83.085004 -41.632855 83.134288 # -b -41.611734 83.361931 -41.536635 83.354890 -41.423987 83.331422 -41.104817 83.293872 -40.841972 83.263364 -40.654225 83.211733 -40.485253 83.185918 -40.259957 83.164796 -40.072210 83.155409 # -b -39.900891 83.108472 -40.013539 83.094391 -40.313934 83.120207 -40.651878 83.143675 -40.839625 83.185918 -41.008597 83.232855 -41.233893 83.244589 -41.515513 83.251629 -41.665711 83.265710 -41.740810 83.314994 -41.646936 83.333769 -41.609387 83.361931 # -b -50.135439 82.491255 -49.928917 82.470133 -49.656684 82.423197 -49.609748 82.364526 -49.253029 82.317589 -48.849373 82.280040 -48.483267 82.223716 -48.445718 82.162698 -48.192259 82.153311 -47.722892 82.118108 -47.338011 82.092293 -46.971905 82.038316 -46.802933 81.986685 -46.737222 81.939749 -46.558862 81.916280 -46.342953 81.866997 -46.051946 81.817713 -45.742163 81.766083 -45.441769 81.744961 -45.366670 81.768430 -45.178923 81.777817 -45.075662 81.796592 -45.075662 81.838835 -45.103824 81.855262 -45.329121 81.874037 -45.507480 81.911587 -45.582579 81.942095 -45.676452 81.960870 -45.770326 82.000766 -45.648290 82.024235 -45.516867 82.040662 -45.404219 82.064131 -44.991176 82.078212 -44.794042 82.057090 -44.503035 82.047703 -44.643845 82.061784 -44.925465 82.082905 -45.169536 82.106374 -45.254022 82.108721 -45.451156 82.104027 -45.573191 82.129842 -45.667065 82.167392 -45.601353 82.197900 -45.526255 82.228409 -45.404219 82.265959 -45.197698 82.301161 -44.765880 82.294121 -44.334062 82.256571 -43.902245 82.230756 -43.648787 82.190860 -43.517364 82.204941 -43.395328 82.207288 -43.489202 82.235450 -43.742660 82.258918 -43.911632 82.265959 -44.296513 82.280040 -44.503035 82.301161 -44.737718 82.329323 -44.653232 82.385647 -44.634457 82.387994 -44.784655 82.404422 -44.991176 82.444318 -45.282184 82.477174 -45.413607 82.507683 -45.507480 82.538191 -45.657677 82.573394 -45.826650 82.594516 -45.958072 82.639105 -46.267855 82.674308 -46.427439 82.714204 -46.521313 82.732979 -46.483763 82.768181 -46.202143 82.770528 -45.873586 82.775222 -45.535642 82.763488 -45.225860 82.758794 -44.812817 82.761141 -44.343450 82.772875 -43.883470 82.770528 -43.404716 82.768181 -43.151258 82.728285 -42.935349 82.669614 -42.925961 82.610943 -42.897799 82.528804 -42.841475 82.458399 -42.700665 82.474827 -42.681890 82.498295 -42.700665 82.545232 -42.710053 82.587475 -42.756989 82.625024 -42.775764 82.683695 -42.888412 82.723591 -42.766377 82.744713 -42.447207 82.718898 -42.212523 82.671961 -41.949678 82.639105 -41.799480 82.594516 -41.611734 82.554619 -41.348888 82.540538 -41.161141 82.484214 -41.095430 82.432584 -40.917070 82.392688 -40.917070 82.432584 -40.841972 82.481867 -40.917070 82.507683 -41.057881 82.547579 -40.964007 82.582781 -40.982782 82.615637 -40.964007 82.648493 -40.973395 82.648493 -41.123592 82.657880 -41.245627 82.683695 -41.536635 82.709510 -41.771318 82.711857 -41.893354 82.732979 -41.987227 82.756447 -42.118650 82.770528 -42.315784 82.775222 -42.550468 82.791650 -42.756989 82.817465 -43.019835 82.826852 -43.376554 82.843280 -43.564300 82.843280 -43.761435 82.843280 -43.883470 82.840933 -44.127541 82.833893 -44.559359 82.831546 -44.934852 82.836240 -45.178923 82.866748 -45.244634 82.901951 -45.178923 82.946541 -45.075662 82.932460 -44.831591 82.897257 -44.606295 82.899604 -44.484260 82.904298 -44.540584 82.918379 -44.634457 82.908991 -44.765880 82.916032 -44.869141 82.911338 -44.991176 82.932460 -45.085050 82.953581 -45.197698 82.981743 -45.310346 82.991131 -45.422994 83.009905 -45.376057 83.038067 -45.451156 83.054495 -45.516867 83.052148 -45.563804 83.094391 -45.488705 83.129594 -45.451156 83.108472 -45.376057 83.120207 -45.329121 83.138981 -45.291571 83.113166 -45.216472 83.094391 -45.141374 83.073270 -45.150761 83.096738 -45.188310 83.131941 -45.141374 83.153062 -44.981789 83.148369 -44.718943 83.108472 -44.615683 83.068576 -44.568746 83.080310 -44.615683 83.117860 -44.427936 83.108472 -44.277738 83.068576 -44.371612 83.110819 -44.540584 83.157756 -44.681394 83.153062 -44.794042 83.185918 -44.643845 83.204693 -44.465485 83.185918 -44.371612 83.211733 -44.409161 83.225814 -44.456098 83.235202 -44.409161 83.270404 -44.240189 83.263364 -44.108766 83.228161 -43.986731 83.228161 -43.845921 83.199999 -43.761435 83.169490 -43.752047 83.155409 -43.827146 83.129594 -43.855308 83.080310 -43.742660 83.087351 -43.592463 83.094391 -43.442265 83.061536 -43.339004 83.028680 -43.245131 82.991131 -43.123095 82.944194 -42.963511 82.937153 -42.879025 82.923072 -42.738215 82.934807 -42.559855 82.927766 -42.484756 82.887870 -42.259460 82.836240 # -b -39.978336 82.850321 -40.090985 82.892564 -40.241182 82.927766 -40.203633 82.970009 -40.072210 82.991131 # -b -39.957215 83.216427 -40.032314 83.228161 -40.032314 83.251629 # -b -39.957215 83.298566 -40.032314 83.329075 -40.069863 83.359584 # -b -39.879769 83.378358 -40.011192 83.404174 # -b -53.721403 82.317589 -53.674466 82.308202 -53.561818 82.301161 -53.355297 82.280040 -53.186325 82.256571 -53.186325 82.219022 -53.120613 82.179126 -52.895317 82.153311 -52.594922 82.122802 -52.397788 82.080559 -52.219428 82.038316 -51.956583 82.000766 -51.815773 81.972604 -51.834547 81.958523 -52.078618 81.944442 -52.238203 81.949136 -52.416563 81.949136 -52.651246 81.970257 -52.829606 81.981992 -53.017352 82.017194 -53.214487 82.050050 -53.392846 82.054743 -53.561818 82.075865 -53.740178 82.115761 -53.815276 82.165045 -53.927924 82.207288 -53.965474 82.247184 -53.899762 82.268305 -53.852826 82.296467 -53.721403 82.317589 # -b -60.193974 81.869343 -59.893579 81.857609 -59.611959 81.841181 -59.414825 81.789551 -59.396050 81.744961 -59.367888 81.712106 -59.311564 81.667516 -59.114430 81.625273 -58.898521 81.597111 -58.701387 81.571295 -58.429154 81.557214 -58.213245 81.533746 -58.053661 81.496197 -57.912850 81.470381 -57.790815 81.444566 -57.790815 81.416404 -57.659392 81.390589 -57.574906 81.425792 -57.659392 81.470381 -57.734491 81.538440 -58.016111 81.568949 -58.203858 81.601804 -58.316506 81.611192 -58.447929 81.620579 -58.485478 81.660475 -58.673225 81.646394 -58.804648 81.714452 -58.907909 81.768430 -58.992395 81.813019 -59.180141 81.871690 -59.414825 81.911587 -59.611959 81.916280 -59.799706 81.939749 # -b -60.029696 81.967911 -59.870111 82.005460 -59.644815 82.031275 -59.428906 82.059437 -59.147286 82.080559 -58.968926 82.094640 -58.649757 82.113414 -58.386911 82.120455 -58.124066 82.136883 -57.748572 82.150964 -57.476339 82.179126 -57.185332 82.200247 -57.025747 82.197900 -57.006972 82.162698 -56.894324 82.193207 -56.819225 82.233103 -56.462506 82.254224 -56.378020 82.237797 -56.171499 82.226062 -55.918041 82.237797 -56.011914 82.247184 -56.180886 82.244837 -56.199661 82.265959 -55.936815 82.294121 -55.739681 82.317589 -55.439286 82.352792 -55.176441 82.345751 -54.988694 82.329323 -54.847884 82.263612 -54.697686 82.237797 -54.594426 82.204941 -54.491165 82.165045 -54.322193 82.122802 -54.256481 82.045356 -54.190770 81.972604 -54.059347 81.930361 -54.040573 81.878731 -54.068735 81.813019 -54.134446 81.754349 -54.200157 81.705065 -54.256481 81.644047 -54.256481 81.587723 -54.200157 81.533746 -54.049960 81.526706 -53.880988 81.566602 -53.909150 81.627619 -53.927924 81.690984 -53.674466 81.749655 -53.496107 81.822407 -53.458557 81.888118 -53.496107 81.942095 -53.524269 82.000766 -53.270811 81.974951 -53.026740 81.949136 -52.792056 81.932708 -52.641859 81.916280 -52.604309 81.913933 -52.444725 81.906893 -52.134942 81.897505 -51.853322 81.848222 -51.571702 81.805979 -51.355793 81.759042 -51.074173 81.730880 -50.886426 81.702718 -50.623581 81.686290 -50.698679 81.730880 -50.933363 81.770776 -51.121110 81.794245 -51.299469 81.848222 -51.487216 81.883424 -51.656188 81.925668 -51.299469 81.902199 -50.877039 81.892812 -50.642355 81.859956 -50.435834 81.862303 -50.210538 81.895159 -50.285636 81.944442 -50.708067 81.989032 -50.886426 82.035969 -50.999074 82.085252 -51.186821 82.129842 -51.355793 82.167392 -51.477829 82.207288 -51.524765 82.251878 -51.524765 82.294121 -51.534153 82.334017 -51.571702 82.371566 -51.646801 82.397381 -51.759449 82.437278 -51.862710 82.479521 -51.834547 82.498295 -51.796998 82.507683 -51.787611 82.507683 # -b -51.789958 82.507683 -51.667922 82.507683 -51.480175 82.510029 -51.104682 82.514723 -50.813674 82.505336 -50.569603 82.502989 -50.287983 82.491255 -50.156560 82.491255 -50.137786 82.491255 # -b -70.196186 80.280536 -69.754981 80.329820 -69.651720 80.397878 -69.510910 80.451855 -69.398262 80.515220 -69.370100 80.548075 -69.201127 80.576237 -69.041543 80.620827 -68.797472 80.653683 -68.684824 80.700620 -68.497077 80.738169 -68.187295 80.747556 -68.121583 80.773371 -68.008935 80.801533 -67.877512 80.822655 -67.736702 80.850817 -67.595892 80.864898 -67.624054 80.878979 -67.558343 80.893060 -67.342434 80.914182 -67.088976 80.944690 -66.920004 80.996321 -66.779194 81.015095 -66.600834 81.047951 -66.525735 81.094888 -66.300439 81.146518 -66.122080 81.202842 -66.009432 81.202842 -65.793523 81.216923 -65.427417 81.273247 -65.108247 81.320184 -64.901725 81.348346 -64.751528 81.383549 -64.620105 81.418751 -64.591943 81.453954 -64.535619 81.498544 -64.591943 81.531399 -64.760915 81.529052 -64.901725 81.524359 -65.023761 81.524359 -65.324156 81.507931 -65.699649 81.484463 -66.018819 81.458647 -66.403700 81.416404 -66.647771 81.383549 -66.863680 81.355387 -67.126525 81.338959 -67.417533 81.327225 -67.689766 81.320184 -68.008935 81.294369 -68.299943 81.259166 -68.553401 81.231004 -68.816246 81.209883 -69.060317 81.177027 -69.276226 81.162946 -69.557846 81.169987 -69.783143 81.132437 -69.989664 81.090194 # -b -70.031907 81.172333 -69.928646 81.209883 -69.928646 81.238045 -69.900484 81.242738 -69.778449 81.231004 -69.581315 81.212230 -69.337244 81.221617 -69.083786 81.245085 -68.858490 81.273247 -68.605031 81.310797 -68.351573 81.350693 -68.116890 81.378855 -67.919755 81.404670 -67.666297 81.428138 -67.356515 81.458647 -67.121832 81.482116 -67.084282 81.496197 -67.056120 81.503237 -67.168768 81.519665 -67.356515 81.529052 -67.572424 81.529052 -67.891593 81.510278 -68.126277 81.500890 -68.304636 81.496197 -68.558095 81.500890 -68.745841 81.505584 -68.961750 81.493850 -69.149497 81.477422 -69.177659 81.512625 -69.168272 81.550174 -69.046236 81.533746 -68.811553 81.533746 -68.755229 81.554868 -68.914814 81.583030 -69.083786 81.615885 -69.233983 81.644047 -69.365406 81.676903 -69.449892 81.705065 -69.243370 81.676903 -69.046236 81.641700 -68.877264 81.601804 -68.680130 81.580683 -68.539320 81.561908 -68.238925 81.568949 -68.163826 81.585376 -68.304636 81.615885 -68.248312 81.613538 -68.041791 81.606498 -67.947917 81.594764 -67.741396 81.592417 -67.356515 81.587723 -67.168768 81.594764 -66.934085 81.615885 -66.727563 81.625273 -66.492880 81.604151 -66.211259 81.620579 -66.089224 81.625273 -65.910865 81.615885 -65.666794 81.641700 -65.479047 81.660475 -65.497822 81.665169 -65.770054 81.660475 -66.032900 81.662822 -65.863928 81.688637 -65.676181 81.700371 -65.469660 81.712106 -65.300687 81.721493 -65.047229 81.730880 -64.962743 81.707412 -64.850095 81.698025 -64.709285 81.690984 -64.549700 81.700371 -64.352566 81.719146 -64.352566 81.754349 -64.380728 81.770776 -64.324404 81.761389 -64.155432 81.740268 -64.080333 81.744961 -63.939523 81.770776 -63.836262 81.801285 -63.779938 81.820060 -63.629741 81.838835 -63.413832 81.848222 -63.066500 81.881078 -62.766106 81.916280 -62.625295 81.965564 -62.456323 81.979645 -62.146541 82.017194 -61.996344 82.068824 -61.930632 82.104027 -61.742885 82.122802 -61.545751 82.153311 -61.348617 82.176779 -61.282906 82.204941 -61.245356 82.219022 -61.198420 82.249531 -61.160870 82.291774 -61.170258 82.343404 -61.254744 82.373913 -61.395554 82.427890 -61.611463 82.451359 -61.893083 82.460746 -62.249802 82.470133 -62.390612 82.484214 -62.371837 82.500642 # -b -62.367144 82.500642 -62.385918 82.502989 -62.639376 82.502989 -62.817736 82.465440 -62.920997 82.491255 -63.136905 82.460746 -63.390364 82.416156 -63.268328 82.456052 -63.249554 82.491255 -63.174455 82.526457 -63.052419 82.559313 -63.240166 82.573394 -63.521786 82.603903 -63.596885 82.643799 -63.615660 82.671961 -63.822181 82.709510 -63.991153 82.732979 -63.756470 82.758794 -63.700146 82.801037 -63.803407 82.857361 -63.916055 82.843280 -64.019315 82.852667 -64.131964 82.836240 -64.282161 82.803384 -64.404196 82.782262 -64.545007 82.805731 -64.723366 82.815118 -64.732753 82.847974 -64.742141 82.873789 -64.789077 82.876136 -64.770303 82.894910 -64.779690 82.916032 -64.911113 82.908991 -64.976824 82.885523 -64.901725 82.866748 -64.976824 82.847974 -65.239670 82.808078 -65.173958 82.791650 -65.004986 82.761141 -65.117634 82.732979 -65.230282 82.779916 -65.427417 82.808078 -65.399255 82.847974 -65.502515 82.850321 -66.046981 82.803384 -66.450637 82.754100 -66.563285 82.732979 -66.628996 82.721245 -66.882454 82.711857 -66.920004 82.707164 -66.957553 82.704817 -67.135913 82.695429 -67.286110 82.671961 -67.492631 82.650840 -67.858738 82.646146 -68.224844 82.625024 -68.534626 82.608597 -68.337492 82.669614 -67.952611 82.695429 -67.464469 82.742366 -67.051426 82.789303 -66.704095 82.817465 -66.441249 82.864402 -66.366151 82.918379 -66.328601 82.951234 -66.441249 82.953581 -66.572672 82.958275 -66.657158 82.965315 -66.741644 82.965315 -66.854292 82.953581 -66.938778 82.974703 -67.023264 82.988784 -67.032652 82.991131 -67.107751 82.979396 -67.229786 82.972356 -67.295497 82.995824 -67.464469 83.016946 -67.558343 82.995824 -67.670991 82.993477 -67.736702 82.981743 -67.746090 82.958275 -67.811801 83.019293 # -b -64.880604 79.982488 -64.617758 80.015344 -64.430012 80.048199 -64.307976 80.081055 -64.242265 80.109217 -63.988807 80.102177 -63.744736 80.120951 -64.007581 80.130339 -64.157779 80.174929 -64.185941 80.226559 -64.120229 80.252374 -64.242265 80.261761 -64.279814 80.219518 -64.326751 80.160847 -64.458174 80.102177 -64.617758 80.071668 -64.899379 80.043506 -65.105900 80.041159 -65.284260 80.055240 -65.378133 80.081055 -65.490781 80.022384 # -b -66.159629 79.989529 -66.244115 80.031772 -66.460024 80.078708 -66.600834 80.055240 -66.797968 80.038812 -67.051426 80.022384 -67.192237 80.050546 -67.192237 80.052893 -67.248561 80.078708 -67.351821 80.106870 -67.511406 80.118604 -67.633442 80.149113 -67.661604 80.205437 -67.633442 80.214825 -67.633442 80.268802 -67.699153 80.308698 -67.670991 80.325126 -67.436307 80.350941 -67.304885 80.376756 -67.107751 80.390837 -67.023264 80.407265 -66.957553 80.414306 -66.835518 80.447161 -66.713482 80.489404 -66.732257 80.503485 -66.816743 80.536341 -66.704095 80.559809 -66.516348 80.562156 -66.394313 80.578584 -66.244115 80.604399 -66.037594 80.637255 -65.840460 80.637255 -65.680875 80.620827 -65.493128 80.592665 -65.427417 80.618480 -65.643325 80.641949 -65.727811 80.679498 -65.680875 80.712354 -65.530677 80.745209 -65.342930 80.768678 -65.145796 80.801533 -65.155184 80.846123 -64.986212 80.871939 -64.882951 80.911835 -64.920500 80.954078 -64.779690 80.991627 -64.526232 81.010402 -64.385422 81.040911 -64.338485 81.066726 -64.338485 81.066726 -64.291548 81.094888 -64.160126 81.134784 -64.066252 81.144171 -63.925442 81.134784 -63.822181 81.158252 -63.587498 81.202842 -63.371589 81.198149 -63.155680 81.188761 -62.827123 81.179374 -62.611214 81.158252 -62.498566 81.116009 -62.338982 81.097235 -62.085523 81.071420 -61.944713 81.097235 -61.785128 81.111316 -61.550445 81.155906 -61.559832 81.195802 -61.644318 81.242738 -61.728804 81.282635 -61.728804 81.306103 -61.766354 81.355387 -61.550445 81.399976 -61.390860 81.456300 -61.343923 81.505584 -61.550445 81.533746 -61.625544 81.554868 -61.634931 81.578336 -61.728804 81.608845 -61.756966 81.629966 -61.869615 81.644047 -61.869615 81.634660 -61.879002 81.646394 -61.944713 81.681597 -61.925939 81.719146 -61.869615 81.768430 -61.728804 81.813019 -61.484734 81.848222 -61.240663 81.876384 -61.024754 81.892812 -60.874556 81.909240 -60.771296 81.916280 # -b -60.768949 81.916280 -60.740787 81.920974 -60.628139 81.904546 -60.440392 81.885771 -60.186934 81.869343 # -b -59.797359 81.939749 -60.032043 81.967911 # -b -80.177275 80.498792 -79.970754 80.517566 -79.801782 80.526954 -79.548324 80.536341 -79.238541 80.536341 -79.050794 80.548075 -78.834886 80.559809 -78.656526 80.562156 -78.478167 80.564503 -78.403068 80.576237 -78.412455 80.587971 -78.609589 80.597359 -78.863048 80.595012 -79.088344 80.590318 -79.285478 80.611440 -79.548324 80.597359 -79.764232 80.595012 -79.895655 80.583278 # -b -80.210131 80.623174 -79.956673 80.637255 -79.834637 80.660723 -79.637503 80.688885 -79.477918 80.700620 -79.262010 80.719394 -79.158749 80.738169 -79.036713 80.740516 -78.961615 80.749903 -78.820805 80.759290 -78.539184 80.780412 -78.229402 80.801533 -78.013493 80.810921 -77.891458 80.806227 -77.835134 80.782759 -77.760035 80.782759 -77.760035 80.794493 -77.760035 80.817961 -77.656774 80.827349 -77.506577 80.827349 -77.337605 80.813268 -77.159245 80.815614 -77.027823 80.820308 -76.905787 80.822655 -76.821301 80.803880 -76.680491 80.787452 -76.558456 80.792146 -76.558456 80.817961 -76.586618 80.839083 -76.652329 80.853164 -76.624167 80.867245 -76.520906 80.876632 -76.389483 80.883673 -76.229899 80.860204 -76.136025 80.857858 -76.136025 80.881326 -76.164187 80.897754 -76.126638 80.911835 -75.948278 80.918875 -75.704208 80.918875 -75.563397 80.930609 -75.497686 80.937650 -75.497686 80.951731 -75.582172 80.954078 -75.685433 80.939997 -75.873180 80.932956 -76.126638 80.928263 -76.323772 80.916528 -76.483357 80.904794 -76.586618 80.900101 -76.736815 80.890713 -76.896400 80.886020 -77.018435 80.876632 -77.112309 80.876632 -77.224957 80.883673 -77.412704 80.883673 -77.506577 80.888366 -77.572288 80.900101 -77.684936 80.900101 -77.750648 80.900101 -77.835134 80.897754 -77.853909 80.904794 -77.938395 80.907141 -78.088592 80.897754 -78.201240 80.902447 -78.351438 80.895407 -78.454698 80.890713 -78.520410 80.888366 -78.604896 80.876632 -78.783255 80.874285 -78.924065 80.857858 -79.027326 80.853164 -79.093038 80.860204 -79.215073 80.843777 -79.365270 80.836736 -79.421594 80.848470 -79.487306 80.857858 -79.506080 80.881326 -79.515468 80.911835 -79.543630 80.954078 -79.449756 80.986933 -79.233848 81.026830 -79.130587 81.059685 -79.130587 81.104275 -79.130587 81.127744 -79.046101 81.162946 -78.848967 81.179374 -78.811417 81.221617 -78.773868 81.238045 -78.773868 81.242738 -78.755093 81.254473 -78.689382 81.270901 -78.595508 81.287328 -78.464086 81.299063 -78.398374 81.322531 -78.285726 81.338959 -78.135529 81.350693 -78.107367 81.355387 -78.013493 81.369468 -77.929007 81.383549 -77.844521 81.395283 -77.806972 81.414057 -77.694324 81.444566 -77.638000 81.465688 -77.713098 81.465688 -77.844521 81.449260 -77.947782 81.421098 -78.135529 81.399976 -78.285726 81.376508 -78.482860 81.357733 -78.604896 81.341306 -78.764481 81.317837 -78.942840 81.284982 -79.036713 81.247432 -79.177524 81.216923 -79.280784 81.184068 -79.365270 81.139478 -79.412207 81.116009 -79.421594 81.111316 -79.384045 81.106622 -79.393432 81.092541 -79.459144 81.083154 -79.534243 81.073766 -79.599954 81.083154 -79.675053 81.097235 -79.721989 81.106622 -79.731377 81.104275 -79.797088 81.106622 -79.890961 81.130090 # -b -80.066974 81.125397 -79.963713 81.104275 -79.869840 81.085501 -79.766579 81.052645 -79.851065 81.010402 -79.926164 80.935303 -79.869840 80.921222 -79.851065 80.947037 -79.738417 80.937650 -79.738417 80.911835 -79.804129 80.881326 -79.935551 80.853164 -79.935551 80.817961 # -b -71.167775 79.959020 -70.904930 80.001263 -70.886155 80.038812 -71.252261 80.062280 -71.665304 80.041159 -72.247319 80.005956 # -b -72.700259 79.998916 -72.493737 80.027078 -72.409251 80.078708 -72.240279 80.059934 -71.827236 80.066974 -71.526841 80.109217 -71.095023 80.149113 -70.681980 80.132685 -70.390973 80.137379 -70.334649 80.174929 -70.503621 80.224212 -70.804016 80.261761 -70.869727 80.313392 -70.804016 80.381450 -70.710142 80.407265 -70.681980 80.374409 -70.681980 80.318085 -70.625656 80.282883 -70.193839 80.280536 # -b -69.987317 81.090194 -70.146902 81.064379 -70.315874 81.047951 -70.325261 81.066726 -70.175064 81.113663 -70.212613 81.113663 -70.456684 81.097235 -70.879115 81.097235 -71.029312 81.125397 -71.057474 81.141825 -70.907277 81.139478 -70.757079 81.134784 -70.513008 81.132437 -70.250163 81.139478 -70.024867 81.172333 # -b -69.766715 83.019293 -70.029560 83.031027 -70.348730 83.014599 -70.517702 83.052148 -70.611575 83.087351 -70.667899 83.108472 -70.930745 83.106126 -71.231140 83.103779 -72.113550 83.052148 -72.132325 83.031027 -72.188649 83.005212 -72.207423 82.993477 -72.489043 83.019293 -72.395170 83.080310 -72.489043 83.094391 -72.920861 83.106126 -73.240031 83.085004 -73.709398 83.087351 -73.728172 83.087351 -73.822046 83.066229 -73.897145 83.056842 -73.972243 83.031027 -74.178765 82.991131 -74.347737 82.932460 -74.272638 82.892564 -74.216314 82.847974 -74.037955 82.789303 -73.803271 82.744713 -74.188152 82.775222 -74.366512 82.817465 -74.742005 82.864402 -74.892203 82.892564 -74.986076 82.911338 -75.136273 82.965315 -75.399119 83.012252 -75.812162 83.038067 -76.206430 83.038067 -76.394177 83.026333 -76.694572 83.033374 -77.032516 83.047455 -77.257812 83.040414 -77.276587 83.040414 -77.276587 83.040414 -77.539433 83.026333 -77.708405 83.007559 -77.971250 83.007559 -78.215321 83.014599 -78.478167 83.002865 -78.459392 82.958275 -78.346744 82.941847 -78.102673 82.911338 -77.821053 82.857361 -77.576982 82.815118 -77.398623 82.772875 -77.163939 82.770528 -77.220263 82.744713 -77.117002 82.686042 -76.760283 82.636759 -76.422339 82.582781 -76.187656 82.547579 -76.384790 82.507683 -76.703959 82.449012 -76.966805 82.416156 -77.004354 82.470133 -76.825995 82.521764 -76.938643 82.585128 -77.248425 82.639105 -77.576982 82.693083 -77.699017 82.744713 -77.980638 82.805731 -78.299807 82.866748 -78.675301 82.901951 -79.107119 82.932460 -79.294865 82.901951 -79.294865 82.876136 -79.445063 82.864402 -79.482612 82.843280 -79.670359 82.838586 -79.764232 82.876136 -79.839331 82.923072 -80.064627 82.930113 -80.214825 82.883176 -80.308698 82.876136 # -b -90.036330 80.526954 -89.811034 80.489404 -89.632674 80.484711 -89.670223 80.517566 -89.557575 80.512873 -89.463702 80.522260 -89.304117 80.519913 -89.229018 80.503485 -89.172694 80.494098 -89.060046 80.482364 -88.984948 80.447161 -88.947398 80.433080 -88.938011 80.402572 -88.938011 80.390837 -89.041272 80.390837 -89.088208 80.369716 -89.013110 80.360328 -88.975560 80.343901 -88.947398 80.308698 -88.994335 80.285230 -88.994335 80.233599 -88.994335 80.193703 -88.900462 80.158501 -88.815975 80.139726 -88.891074 80.160847 -88.853525 80.146766 -88.693940 80.111564 -88.571905 80.071668 -88.421707 80.064627 -88.374770 80.090442 -88.252735 80.088096 -88.140087 80.090442 -88.130700 80.102177 -88.130700 80.120951 -88.224573 80.139726 -88.205798 80.167888 -88.290284 80.181969 -88.440482 80.214825 -88.562517 80.252374 -88.571905 80.268802 -88.571905 80.315739 -88.562517 80.346247 -88.421707 80.402572 -88.187024 80.407265 -88.008664 80.393184 -87.858467 80.390837 -87.680107 80.372063 -87.595621 80.348594 -87.605009 80.294617 -87.548684 80.257068 -87.529910 80.224212 -87.529910 80.167888 -87.633171 80.158501 -87.670720 80.137379 -87.811530 80.120951 -87.858467 80.102177 -87.971115 80.097483 -87.989889 80.076361 -87.867854 80.059934 -87.736431 80.064627 -87.614396 80.081055 -87.539297 80.076361 -87.379712 80.064627 -87.248290 80.050546 # -b -86.354145 79.998916 -86.523118 80.008303 -86.673315 80.022384 -86.739026 80.071668 -86.739026 80.120951 -86.729639 80.163194 -86.729639 80.186663 -86.682702 80.210131 -86.654540 80.242987 -86.616991 80.266455 -86.523118 80.304004 -86.372920 80.318085 -86.185173 80.313392 -86.034976 80.318085 -85.819067 80.322779 -85.528059 80.280536 -85.283989 80.240640 -85.143178 80.226559 -85.068080 80.247680 -84.917882 80.259415 -84.542389 80.259415 -84.204444 80.235946 -84.026085 80.214825 -83.866500 80.167888 -83.631817 80.106870 -83.425295 80.069321 -83.209386 80.005956 # -b -82.493602 79.996569 -82.559313 80.020037 -82.559313 80.064627 -82.700123 80.104523 -82.859708 80.144420 -83.019293 80.174929 -83.131941 80.210131 -83.253976 80.240640 -83.376012 80.271149 -83.432336 80.280536 -83.422948 80.311045 -83.235202 80.322779 -83.056842 80.327473 -82.897257 80.327473 -82.793997 80.336860 -82.625024 80.350941 -82.390341 80.372063 -82.230756 80.360328 -82.061784 80.362675 -81.949136 80.355635 -81.920974 80.355635 -81.798938 80.365022 -81.592417 80.390837 -81.414057 80.407265 -81.169987 80.414306 -81.029176 80.416653 -80.841430 80.414306 -80.738169 80.430734 -80.597359 80.416653 -80.494098 80.416653 -80.437774 80.426040 -80.465936 80.437774 -80.597359 80.449508 -80.747556 80.465936 -80.710007 80.489404 -80.587971 80.508179 -80.503485 80.508179 -80.400225 80.501139 -80.174929 80.498792 # -b -79.890961 80.583278 -80.078708 80.573890 -80.163194 80.566850 -80.285230 80.569197 -80.463589 80.578584 -80.407265 80.590318 -80.332166 80.606746 -80.210131 80.623174 # -b -79.890961 81.130090 -79.994222 81.141825 -80.059934 81.177027 -80.163194 81.167640 -80.163194 81.146518 -80.059934 81.125397 # -b -79.935551 80.817961 -80.038812 80.796840 -80.160847 80.782759 -80.311045 80.759290 -80.442468 80.726435 -80.480017 80.721741 -80.555116 80.724088 -80.714701 80.702966 -80.874285 80.679498 -81.043258 80.646642 -81.240392 80.623174 -81.456300 80.602053 -81.662822 80.590318 -81.766083 80.571544 -81.925668 80.552769 -82.019541 80.541035 -82.132189 80.526954 -82.207288 80.524607 -82.329323 80.517566 -82.451359 80.508179 -82.639105 80.496445 -82.751753 80.491751 -82.845627 80.489404 -82.930113 80.480017 -83.136634 80.465936 -83.305607 80.451855 -83.465191 80.463589 -83.587227 80.508179 -83.596614 80.529301 -83.596614 80.552769 -83.493353 80.569197 -83.465191 80.590318 -83.314994 80.597359 -83.117860 80.625521 -82.930113 80.641949 -82.751753 80.641949 -82.676655 80.641949 -82.667267 80.665417 -82.573394 80.679498 -82.507683 80.710007 -82.338710 80.735822 -82.226062 80.752250 -82.085252 80.766331 -82.010154 80.773371 -81.991379 80.780412 -82.132189 80.775718 -82.263612 80.766331 -82.301161 80.782759 -82.310548 80.787452 -82.301161 80.803880 -82.272999 80.817961 -82.254224 80.822655 -82.319936 80.839083 -82.254224 80.862551 -82.235450 80.886020 -82.301161 80.874285 -82.404422 80.846123 -82.517070 80.843777 -82.639105 80.836736 -82.629718 80.825002 -82.479521 80.810921 -82.460746 80.782759 -82.554619 80.763984 -82.667267 80.726435 -82.817465 80.702966 -82.939500 80.688885 -83.061536 80.665417 -83.221121 80.646642 -83.390093 80.634908 -83.474579 80.618480 -83.502741 80.597359 -83.596614 80.597359 -83.615389 80.597359 -83.634163 80.597359 -83.746812 80.592665 -83.821910 80.587971 -83.850072 80.597359 -83.934558 80.604399 -83.943946 80.630215 -83.915784 80.648989 -83.878234 80.677151 -83.765586 80.693579 -83.756199 80.717047 -83.709262 80.738169 -83.662326 80.752250 -83.728037 80.756944 -83.812523 80.717047 -83.897009 80.686539 -84.037819 80.665417 -84.197404 80.651336 -84.216179 80.618480 -84.206791 80.585625 -84.131693 80.569197 -84.122305 80.552769 -84.188017 80.510526 -84.197404 80.508179 -84.253728 80.489404 -84.263115 80.468283 -84.338214 80.456549 -84.479024 80.456549 -84.629222 80.449508 -84.779419 80.454202 -84.920229 80.454202 -85.042265 80.475323 -85.136138 80.480017 -85.258173 80.480017 -85.352047 80.482364 -85.417758 80.496445 -85.380209 80.515220 -85.286335 80.536341 -85.154913 80.559809 -85.201849 80.576237 -85.342659 80.559809 -85.417758 80.524607 -85.492857 80.522260 -85.558568 80.515220 -85.586730 80.496445 -85.633667 80.489404 -85.661829 80.489404 -85.802639 80.498792 -85.952837 80.501139 -86.056097 80.515220 -86.234457 80.533994 -86.394042 80.543382 -86.431591 80.562156 -86.412816 80.578584 -86.365880 80.597359 -86.365880 80.634908 -86.272006 80.653683 -86.272006 80.665417 -86.234457 80.688885 -86.215682 80.710007 -86.187520 80.726435 -86.103034 80.745209 -86.046710 80.766331 -86.046710 80.773371 -85.999773 80.789799 -85.915287 80.808574 -85.821414 80.825002 -85.793252 80.843777 -85.680604 80.857858 -85.708766 80.871939 -85.652442 80.883673 -85.586730 80.897754 -85.530406 80.911835 -85.530406 80.923569 -85.361434 80.923569 -85.286335 80.937650 -85.145525 80.951731 -85.107976 80.963465 -84.920229 80.970506 -84.798194 80.989280 -84.713708 80.991627 -84.572898 80.982240 -84.403925 80.986933 -84.188017 80.991627 -84.028432 80.998668 -83.897009 81.015095 -83.746812 81.015095 -83.709262 81.015095 -83.662326 81.003361 -83.596614 81.022136 -83.408867 81.029176 -83.211733 81.047951 -83.061536 81.052645 -82.864402 81.054992 -82.629718 81.054992 -82.479521 81.078460 -82.244837 81.087847 -82.132189 81.099582 -82.132189 81.104275 -82.301161 81.097235 -82.432584 81.097235 -82.592169 81.085501 -82.808078 81.080807 -82.967662 81.073766 -83.127247 81.071420 -83.277445 81.073766 -83.465191 81.062032 -83.596614 81.057339 -83.765586 81.054992 -83.878234 81.047951 -84.019044 81.050298 -84.056594 81.054992 -84.150467 81.054992 -84.319439 81.047951 -84.450862 81.038564 -84.610447 81.029176 -84.704320 81.029176 -84.826356 81.022136 -84.967166 81.010402 -85.089201 81.005708 -85.230011 81.015095 -85.380209 81.015095 -85.455308 81.008055 -85.586730 80.991627 -85.671216 80.970506 -85.830801 80.954078 -85.896513 80.923569 -86.168745 80.883673 -86.328330 80.839083 -86.469140 80.789799 -86.525464 80.747556 -86.600563 80.714701 -86.741373 80.677151 -86.816472 80.634908 -86.816472 80.609093 -86.844634 80.583278 -86.938507 80.562156 -87.041768 80.552769 -87.135641 80.559809 -87.248290 80.559809 -87.323388 80.559809 -87.417262 80.569197 -87.511135 80.585625 -87.614396 80.613787 -87.661333 80.623174 -87.745819 80.630215 -87.914791 80.634908 -88.074376 80.651336 -88.121312 80.658377 -88.168249 80.663070 -88.280897 80.695926 -88.421707 80.733475 -88.600067 80.759290 -88.759651 80.785106 -88.928624 80.789799 -89.013110 80.796840 -89.116370 80.829696 -89.229018 80.841430 -89.304117 80.853164 -89.341667 80.864898 # -b -79.968407 82.876136 -80.024731 82.941847 -80.250027 82.962969 -80.531647 82.953581 -80.850817 82.944194 -81.188761 82.892564 -81.226311 82.876136 -81.038564 82.840933 -80.794493 82.838586 -80.794493 82.826852 -80.869592 82.775222 -80.700620 82.728285 -80.409612 82.709510 -80.240640 82.686042 -80.569197 82.695429 -80.860204 82.700123 -80.813268 82.660227 -80.813268 82.643799 -81.057339 82.695429 -81.329571 82.763488 -81.648741 82.786956 -82.005460 82.793997 -82.249531 82.798690 -82.362179 82.765834 -82.118108 82.723591 -82.005460 82.676655 -81.855262 82.639105 -81.676903 82.599209 -81.517318 82.592169 -81.479769 82.556966 -81.395283 82.524110 -81.292022 82.472480 -81.479769 82.458399 -81.789551 82.498295 -82.024235 82.545232 -82.305855 82.589822 -82.681348 82.617984 -83.000518 82.625024 -83.225814 82.608597 -83.338462 82.571047 -83.263364 82.545232 -83.000518 82.502989 -82.625024 82.491255 -82.493602 82.470133 -82.775222 82.463093 -82.962969 82.477174 -83.122553 82.477174 -83.347850 82.472480 -83.432336 82.444318 -83.544984 82.402075 -83.526209 82.348098 -83.404174 82.296467 -83.131941 82.265959 -82.775222 82.221369 -82.502989 82.188513 -82.343404 82.167392 -81.986685 82.136883 -81.705065 82.108721 -81.451607 82.108721 -81.536093 82.078212 -81.601804 82.045356 -81.376508 81.991379 -81.254473 81.958523 -81.714452 82.003113 -82.089946 82.038316 -82.334017 82.075865 -82.653186 82.118108 -82.906645 82.167392 -83.197652 82.214328 -83.413561 82.254224 -83.685794 82.265959 -83.845379 82.254224 -83.854766 82.216675 -83.732731 82.165045 -83.657632 82.139230 -83.563758 82.092293 -83.272751 82.082905 -83.197652 82.071171 -83.469885 82.075865 -83.751505 82.075865 -83.892315 82.075865 -83.845379 82.141576 -83.939252 82.195554 -84.136386 82.244837 -84.211485 82.291774 -84.352295 82.317589 -84.361682 82.317589 -84.408619 82.322283 -84.633915 82.336364 -84.840437 82.341057 -85.037571 82.315242 -85.178381 82.348098 -85.403677 82.373913 -85.422452 82.402075 -85.291029 82.430237 -85.544487 82.432584 -85.713459 82.437278 -85.910594 82.444318 -86.117115 82.437278 -86.417510 82.423197 -86.586482 82.397381 -86.370573 82.373913 -86.304862 82.348098 -86.295475 82.319936 -86.154664 82.301161 -86.210988 82.272999 -86.220376 82.247184 -86.492609 82.242490 -86.783616 82.216675 -87.055849 82.226062 -87.281145 82.226062 -87.365631 82.195554 -87.346857 82.150964 -87.065236 82.113414 -86.755454 82.113414 -86.520771 82.082905 -86.192214 82.054743 -85.863657 82.031275 -85.525713 82.017194 -85.272254 82.012500 -85.450614 81.996073 -85.403677 81.939749 -85.713459 81.993726 -86.042016 81.998419 -86.088953 81.953830 -85.929368 81.897505 -86.126502 81.932708 -86.436285 82.014847 -86.793004 82.050050 -87.065236 82.045356 -87.290533 82.038316 -87.281145 81.996073 -87.431343 81.977298 -87.262371 81.920974 -87.365631 81.920974 -87.543991 81.979645 -87.562765 82.031275 -87.656639 82.047703 -87.666026 82.050050 -87.675414 82.050050 -87.816224 82.059437 -88.013358 82.080559 -88.144781 82.066478 -88.313753 82.096986 -88.614148 82.094640 -88.745570 82.068824 -89.017803 82.057090 -89.243099 82.003113 -89.571656 81.965564 -89.562269 81.939749 -89.383910 81.899852 -89.261874 81.848222 -89.524720 81.902199 -89.674917 81.913933 -89.674917 81.859956 -89.646755 81.784857 -89.806340 81.827100 -89.956537 81.852916 # -b -90.036330 81.629966 -89.848583 81.599457 -89.782872 81.594764 -89.482477 81.601804 -89.397991 81.590070 -89.613899 81.564255 -89.970618 81.529052 # -b -90.059798 81.357733 -89.900213 81.378855 -89.637368 81.411711 -89.383910 81.428138 -89.149226 81.460994 -88.970867 81.486809 -88.632922 81.514971 -88.257429 81.536093 -88.097844 81.559561 -88.003970 81.538440 -87.750512 81.536093 -87.459505 81.526706 -87.337469 81.503237 -87.018300 81.507931 -86.652193 81.519665 -86.483221 81.505584 -86.624031 81.489156 -86.774229 81.453954 -86.980750 81.470381 -87.365631 81.475075 -87.712963 81.496197 -87.938259 81.505584 -88.126006 81.498544 -88.482725 81.477422 -88.632922 81.446913 -88.942705 81.404670 -89.393297 81.331918 -89.750016 81.310797 -89.750016 81.284982 -89.552882 81.266207 -89.261874 81.242738 -89.036578 81.231004 -88.783120 81.235698 -88.999029 81.200495 -89.365135 81.200495 -89.703079 81.193455 -89.890826 81.181721 -89.947150 81.139478 -89.918988 81.094888 -89.928375 81.057339 -89.768791 81.012749 -89.515332 80.991627 -89.205550 80.982240 -88.980254 81.008055 -88.764345 81.022136 -88.501500 81.017442 -88.285591 81.022136 -88.097844 81.029176 -87.750512 81.029176 -87.459505 81.033870 -87.234209 81.026830 -87.112173 81.033870 -86.868102 81.047951 -86.652193 81.069073 -86.426897 81.080807 -86.210988 81.123050 -85.985692 81.158252 -85.891819 81.186414 -85.694685 81.188761 -85.328578 81.212230 -85.000022 81.242738 -84.774725 81.259166 -84.502492 81.266207 -84.558817 81.235698 -84.765338 81.195802 -85.140832 81.162946 -85.506938 81.116009 -85.779171 81.066726 -85.769783 81.040911 -86.182826 81.012749 -86.539545 80.970506 -86.849328 80.954078 -87.121560 80.944690 -87.290533 80.937650 -87.534603 80.942344 -87.844386 80.963465 -88.163555 80.963465 -88.417013 80.961118 -88.576598 80.932956 -88.886381 80.925916 -89.149226 80.909488 -89.205550 80.881326 -89.365135 80.871939 -89.336973 80.864898 # -b -99.123275 80.076361 -99.085726 80.081055 -99.057564 80.074015 -99.010627 80.055240 -98.954303 80.041159 -98.907367 80.036465 -98.832268 80.045853 -98.729007 80.059934 -98.635134 80.057587 -98.475549 80.057587 -98.344126 80.027078 # -b -99.531625 79.959020 -99.484688 80.003610 -99.400202 80.024731 -99.343878 80.052893 -99.259392 80.066974 -99.118582 80.076361 # -b -95.187633 80.578584 -94.999886 80.573890 -94.952949 80.559809 -94.924787 80.559809 -94.765203 80.571544 -94.633780 80.573890 -94.511744 80.543382 -94.370934 80.538688 -94.164413 80.541035 -93.986053 80.543382 -93.835856 80.536341 -93.732595 80.529301 -93.601172 80.515220 -93.582398 80.550422 -93.648109 80.578584 -93.807694 80.576237 -93.957891 80.580931 -94.108089 80.585625 -94.136251 80.585625 -94.155025 80.585625 -94.211349 80.590318 -94.220737 80.616134 -94.258286 80.648989 -94.136251 80.658377 -93.976666 80.651336 -93.817081 80.651336 -93.713820 80.670111 -93.497912 80.674804 -93.582398 80.691232 -93.666884 80.702966 -93.817081 80.688885 -93.845243 80.705313 -93.882792 80.717047 -94.061152 80.712354 -94.183187 80.695926 -94.370934 80.695926 -94.474195 80.717047 -94.577456 80.717047 -94.615005 80.731128 -94.652554 80.742863 -94.615005 80.761637 -94.446033 80.775718 -94.446033 80.787452 -94.652554 80.773371 -94.812139 80.761637 -94.915400 80.766331 -94.971724 80.787452 -94.971724 80.815614 -94.887238 80.822655 -94.802752 80.843777 -94.765203 80.855511 -94.906013 80.853164 -94.952949 80.864898 -94.952949 80.888366 -94.943562 80.909488 -94.971724 80.935303 -94.924787 80.958771 -94.840301 80.977546 -94.699491 80.977546 -94.605618 80.991627 -94.596230 81.012749 -94.539906 80.996321 -94.370934 80.991627 -94.173800 80.984587 -94.173800 80.961118 -94.126863 80.951731 -94.155025 80.937650 -94.089314 80.930609 -94.032990 80.939997 -93.995441 80.958771 -93.920342 80.961118 -93.817081 80.958771 -93.807694 80.970506 -93.798306 80.979893 -93.732595 80.991627 -93.601172 80.982240 -93.582398 80.996321 -93.666884 81.010402 -93.788919 81.010402 -93.788919 81.026830 -93.920342 81.033870 -93.995441 81.064379 -93.873405 81.043258 -93.713820 81.033870 -93.591785 81.050298 -93.441587 81.047951 -93.366489 81.045604 -93.338327 81.045604 -93.216291 81.045604 -93.113031 81.036217 -93.028545 81.043258 -93.000382 81.045604 -92.953446 81.054992 -92.803248 81.069073 -92.746924 81.073766 -92.737537 81.090194 -92.699988 81.106622 -92.653051 81.123050 -92.671826 81.134784 -92.643664 81.155906 -92.681213 81.162946 -92.775086 81.144171 -92.850185 81.146518 -92.925284 81.160599 -92.925284 81.177027 -92.962833 81.181721 -93.113031 81.181721 -93.225679 81.188761 -93.300777 81.167640 -93.469750 81.155906 -93.610560 81.146518 -93.713820 81.144171 -93.807694 81.146518 -93.854630 81.162946 -93.939117 81.146518 -94.070539 81.155906 -94.239511 81.165293 -94.342772 81.174680 -94.399096 81.200495 -94.446033 81.216923 -94.436646 81.235698 -94.436646 81.247432 -94.399096 81.261513 -94.408484 81.270901 -94.464808 81.270901 -94.530519 81.270901 -94.605618 81.277941 -94.605618 81.294369 -94.511744 81.317837 -94.370934 81.327225 -94.248899 81.341306 -94.126863 81.317837 -93.939117 81.301409 -93.497912 81.270901 -93.404038 81.280288 -93.488524 81.322531 -93.554236 81.343652 -93.404038 81.338959 -93.235066 81.345999 -93.103643 81.329571 -92.953446 81.322531 -92.897122 81.313144 -92.859572 81.310797 -92.746924 81.289675 -92.427755 81.270901 -92.230621 81.254473 -92.080423 81.233351 -92.014712 81.195802 -91.789416 81.169987 -91.657993 81.125397 -91.545345 81.104275 -91.564119 81.073766 -91.545345 81.036217 -91.601669 81.029176 -91.582894 81.017442 -91.507795 81.001014 -91.404535 80.965812 -91.348211 80.925916 -91.329436 80.895407 -91.244950 80.867245 -91.207400 80.850817 -91.122914 80.843777 -91.066590 80.810921 -91.075978 80.801533 -91.029041 80.796840 -90.963330 80.761637 -90.963330 80.747556 -90.972717 80.712354 -90.935168 80.693579 -90.766195 80.686539 -90.709871 80.656030 -90.634773 80.616134 -90.569061 80.595012 -90.615998 80.576237 -90.691097 80.529301 -90.709871 80.503485 -90.700484 80.496445 -90.691097 80.496445 -90.653547 80.519913 -90.615998 80.552769 -90.512737 80.555116 -90.475188 80.566850 -90.437639 80.536341 -90.240504 80.526954 -90.033983 80.526954 # -b -96.079430 79.973101 -96.041881 80.001263 -95.816585 80.022384 -95.703937 80.038812 -95.901071 80.045853 -96.107592 80.034118 -96.192078 80.078708 -96.210853 80.123298 -96.220240 80.135032 -96.201466 80.142073 -96.070043 80.151460 -95.948007 80.146766 -95.797810 80.132685 -95.638225 80.118604 -95.506802 80.102177 -95.450478 80.090442 -95.319056 80.069321 -95.300281 80.036465 -95.112534 80.027078 -95.112534 80.027078 -94.999886 80.012997 -94.924787 80.005956 -94.849689 80.012997 -94.821527 80.003610 # -b -94.725306 79.989529 -94.593884 80.008303 -94.471848 80.017691 -94.349813 80.003610 # -b -94.072886 79.970754 -94.194922 80.008303 -94.298182 80.034118 -94.298182 80.066974 -94.176147 80.097483 -94.044724 80.109217 -93.885139 80.118604 -93.791266 80.120951 -93.669230 80.127992 -93.594132 80.130339 -93.678618 80.146766 -93.810041 80.142073 -93.969625 80.139726 -94.054111 80.158501 -94.091661 80.186663 -94.176147 80.189010 -94.288795 80.151460 -94.382668 80.120951 -94.551641 80.111564 -94.626739 80.088096 -94.823873 80.071668 -94.955296 80.090442 -95.067944 80.106870 -95.002233 80.095136 -95.067944 80.106870 -95.105494 80.111564 -95.199367 80.113911 -95.246304 80.132685 -95.330790 80.144420 -95.321402 80.153807 -95.199367 80.179622 -95.114881 80.181969 -95.321402 80.153807 -95.199367 80.179622 -95.114881 80.181969 -95.114881 80.181969 -95.002233 80.167888 -94.983458 80.167888 -94.842648 80.174929 -94.748775 80.167888 -94.664289 80.196050 -94.617352 80.226559 -94.720613 80.217172 -94.805099 80.214825 -94.927134 80.212478 -94.974071 80.200744 -94.992846 80.203091 -95.133656 80.233599 -95.002233 80.207784 -95.133656 80.233599 -95.161818 80.242987 -95.236916 80.235946 -95.312015 80.200744 -95.480987 80.184316 -95.603023 80.179622 -95.603023 80.217172 -95.706283 80.221865 -95.875256 80.240640 -96.063002 80.242987 -96.081777 80.273496 -96.063002 80.296964 -96.128714 80.313392 -96.278911 80.325126 -96.297686 80.339207 -96.203812 80.341554 -96.091164 80.365022 -95.940967 80.348594 -95.837706 80.374409 -95.696896 80.374409 -95.443438 80.367369 -95.255691 80.365022 -95.002233 80.332166 -94.927134 80.336860 -94.861423 80.343901 -94.870810 80.367369 -94.927134 80.365022 -94.945909 80.357982 -94.974071 80.369716 -94.992846 80.365022 -95.443438 80.367369 -95.002233 80.362675 -95.077332 80.383797 -95.180592 80.388491 -95.302628 80.400225 -95.424663 80.411959 -95.527924 80.430734 -95.696896 80.442468 -95.800157 80.451855 -95.762607 80.475323 -95.687509 80.480017 -95.687509 80.501139 -95.678121 80.519913 -95.668734 80.536341 -95.743833 80.569197 -95.687509 80.576237 -95.574861 80.576237 -95.434051 80.573890 -95.377726 80.576237 -95.340177 80.576237 -95.293240 80.576237 -95.189980 80.578584 # -b -89.949497 81.852916 -90.024596 81.902199 -90.193568 81.904546 -90.428251 81.897505 -90.653547 81.890465 -90.841294 81.857609 -91.104140 81.838835 -91.169851 81.791898 -91.291887 81.770776 -91.451471 81.782511 -91.629831 81.749655 -91.770641 81.733227 -91.826965 81.686290 -91.911451 81.665169 -91.958388 81.644047 -92.024099 81.615885 -91.873902 81.615885 -91.667380 81.604151 -91.507795 81.585376 -91.395147 81.552521 -91.395147 81.531399 -91.338823 81.517318 -91.066590 81.540787 -90.897618 81.561908 -90.878844 81.540787 -90.822519 81.568949 -90.691097 81.599457 -90.615998 81.629966 -90.409477 81.637007 -90.212342 81.611192 -90.156018 81.655781 -90.033983 81.669862 -90.033983 81.629966 # -b -89.970618 81.529052 -90.393049 81.458647 -90.655894 81.409364 -90.449373 81.383549 -90.317950 81.362427 -90.289788 81.334265 -90.064492 81.357733 # -b 91.296580 80.001263 91.296580 80.008303 91.212094 80.027078 91.090059 80.045853 91.024347 80.059934 91.061897 80.062280 91.230869 80.045853 91.315355 80.048199 91.399841 80.045853 91.456165 80.052893 91.578200 80.055240 91.653299 80.062280 91.765947 80.071668 91.841046 80.045853 91.991243 80.041159 92.141441 80.017691 92.366737 80.010650 # -b 91.275459 79.998916 91.303621 80.001263 # -b 90.911699 81.223964 90.930474 81.223964 91.052509 81.212230 91.202707 81.207536 91.418616 81.198149 91.559426 81.179374 91.653299 81.158252 91.653299 81.120703 91.512489 81.090194 91.334130 81.071420 91.127608 81.054992 90.949249 81.040911 90.770889 81.047951 90.601917 81.047951 90.395395 81.054992 90.207649 81.073766 90.048064 81.097235 # -b 89.972965 81.167640 90.123163 81.188761 90.320297 81.188761 90.545593 81.198149 90.742727 81.202842 90.874150 81.212230 90.911699 81.223964 # -b 94.870810 81.101928 94.908359 81.108969 95.021008 81.130090 95.105494 81.153559 95.067944 81.177027 95.021008 81.209883 95.227529 81.223964 95.443438 81.231004 95.565473 81.252126 95.668734 81.223964 95.818931 81.202842 95.950354 81.174680 96.044228 81.134784 96.109939 81.087847 96.203812 81.066726 96.307073 81.047951 96.363397 81.008055 96.419721 80.965812 96.504207 80.935303 96.598081 80.916528 96.682567 80.876632 96.860926 80.855511 96.964187 80.836736 97.058060 80.822655 97.189483 80.801533 97.302131 80.801533 97.377230 80.766331 97.461716 80.735822 97.452329 80.702966 97.452329 80.684192 97.593139 80.688885 97.705787 80.695926 97.780886 80.684192 97.649463 80.658377 97.433554 80.644296 97.339681 80.613787 97.123772 80.611440 97.048673 80.566850 97.058060 80.538688 97.039286 80.491751 97.020511 80.447161 96.964187 80.400225 97.048673 80.397878 97.217645 80.414306 97.255195 80.383797 97.217645 80.346247 97.255195 80.339207 97.330293 80.332166 97.330293 80.304004 97.264582 80.271149 97.104997 80.240640 96.926638 80.250027 96.710729 80.252374 96.541757 80.240640 96.297686 80.245334 96.100552 80.240640 95.828319 80.224212 95.574861 80.205437 95.424663 80.170235 95.208754 80.163194 94.880197 80.120951 94.767549 80.071668 94.532866 80.052893 94.241858 80.043506 94.035337 80.003610 # -b 93.833509 79.996569 93.664537 80.017691 93.467403 80.017691 93.354755 80.045853 93.195170 80.062280 93.044972 80.081055 92.969874 80.130339 92.744577 80.146766 92.481732 80.139726 92.284598 80.160847 92.078076 80.189010 92.162562 80.233599 92.275210 80.259415 92.031140 80.259415 91.862167 80.301658 91.646259 80.299311 91.561773 80.259415 91.374026 80.247680 91.383413 80.294617 91.496061 80.322779 91.561773 80.355635 91.702583 80.357982 91.937266 80.372063 92.012365 80.395531 91.824618 80.393184 91.777681 80.426040 91.909104 80.440121 92.125013 80.444815 92.312760 80.463589 92.481732 80.494098 92.641317 80.503485 92.631929 80.536341 92.753965 80.573890 92.810289 80.602053 92.744577 80.620827 92.650704 80.641949 92.519281 80.637255 92.453570 80.667764 92.472345 80.707660 92.566218 80.759290 92.688253 80.780412 92.810289 80.808574 93.016810 80.836736 93.110684 80.871939 93.129458 80.907141 93.223332 80.909488 93.364142 80.909488 93.551889 80.923569 93.720861 80.937650 93.917995 80.970506 94.021256 80.991627 94.209003 80.991627 94.396749 80.986933 94.575109 80.984587 94.706532 80.984587 94.837954 81.015095 94.866116 81.029176 94.828567 81.069073 94.856729 81.099582 94.866116 81.101928 # -b 94.880197 80.015344 94.917747 80.017691 94.974071 80.029425 94.927134 80.062280 94.927134 80.081055 95.067944 80.059934 95.246304 80.029425 95.377726 80.034118 95.340177 80.069321 95.499762 80.085749 95.640572 80.104523 95.856481 80.102177 95.940967 80.118604 96.156876 80.113911 96.288299 80.116258 96.438496 80.130339 96.757666 80.142073 96.954800 80.139726 97.170709 80.139726 97.217645 80.158501 97.433554 80.163194 97.471103 80.139726 97.546202 80.125645 97.583751 80.111564 97.658850 80.092789 97.733949 80.071668 97.902921 80.064627 98.062506 80.020037 # -b 98.454427 79.989529 98.360554 80.008303 98.341779 80.027078 98.379329 80.041159 98.463815 80.050546 98.557688 80.038812 98.651561 80.031772 98.792372 80.038812 98.905020 80.031772 98.867470 80.001263 # -b 99.104501 79.991875 99.282860 80.010650 # -b 94.572762 79.984835 94.657248 80.008303 94.779284 80.017691 94.854382 80.015344 94.873157 80.015344 # -b 79.982488 80.862551 80.048199 80.878979 80.160847 80.890713 80.292270 80.881326 80.404918 80.871939 80.639602 80.846123 80.705313 80.829696 80.799187 80.822655 80.874285 80.815614 80.921222 80.810921 80.930609 80.808574 80.930609 80.808574 80.968159 80.808574 81.033870 80.794493 80.986933 80.773371 80.846123 80.752250 80.677151 80.747556 80.517566 80.731128 80.273496 80.724088 80.076361 80.719394 # -b 90.050411 81.097235 89.947150 81.127744 89.975312 81.167640 # -b 79.926164 80.848470 79.944939 80.850817 79.982488 80.862551 # -b 80.069321 80.719394 79.872187 80.721741 79.721989 80.747556 79.628116 80.771025 79.628116 80.803880 79.750151 80.827349 79.834637 80.843777 79.900349 80.850817 79.919123 80.848470 # -b 60.506103 80.789799 60.487329 80.794493 60.449779 80.792146 60.355906 80.789799 60.271420 80.794493 60.252645 80.806227 60.158772 80.810921 60.093060 80.806227 # -b 59.933476 80.376756 60.017962 80.381450 60.074286 80.374409 60.149384 80.365022 60.196321 80.365022 60.233870 80.362675 60.262032 80.379103 60.355906 80.383797 60.412230 80.372063 60.487329 80.374409 60.581202 80.374409 60.590589 80.372063 60.590589 80.369716 60.599977 80.362675 60.693850 80.353288 60.815886 80.350941 60.919146 80.362675 60.984858 80.346247 61.069344 80.339207 61.153830 80.346247 61.275865 80.350941 61.285253 80.367369 61.350964 80.367369 61.472999 80.369716 61.538711 80.376756 61.538711 80.402572 61.510549 80.430734 61.482387 80.461242 61.482387 80.482364 61.482387 80.496445 61.472999 80.512873 61.416675 80.531647 61.397901 80.545728 61.360351 80.562156 61.266478 80.573890 61.200766 80.583278 61.163217 80.599706 61.172604 80.623174 61.200766 80.627868 61.210154 80.641949 61.257091 80.651336 61.360351 80.660723 61.407288 80.670111 61.538711 80.670111 61.698296 80.681845 61.810944 80.674804 61.970528 80.667764 62.101951 80.670111 62.214599 80.679498 62.299085 80.688885 62.289698 80.698273 62.280311 80.717047 62.289698 80.735822 62.280311 80.747556 62.205212 80.756944 62.186437 80.768678 62.177050 80.789799 62.167663 80.794493 62.158275 80.801533 62.167663 80.803880 62.148888 80.810921 62.092564 80.820308 62.083176 80.825002 62.083176 80.841430 62.064402 80.862551 61.998690 80.867245 61.932979 80.878979 61.839106 80.881326 61.726458 80.874285 61.698296 80.853164 61.613809 80.836736 61.519936 80.825002 61.472999 80.808574 61.397901 80.794493 61.322802 80.789799 61.257091 80.796840 61.210154 80.806227 61.106893 80.803880 61.022407 80.803880 60.956696 80.810921 60.881597 80.808574 60.844048 80.801533 60.797111 80.787452 60.712625 80.778065 60.637526 80.778065 60.609364 80.785106 60.571815 80.789799 60.506103 80.789799 # -b 60.980164 81.071420 60.980164 81.073766 60.970777 81.071420 60.961389 81.054992 60.961389 81.036217 60.905065 81.040911 60.783030 81.033870 60.660994 81.026830 60.548346 81.017442 60.492022 81.026830 60.426311 81.022136 60.379374 81.005708 60.219789 80.991627 60.172853 80.965812 60.116529 80.937650 60.191627 80.928263 60.257339 80.914182 60.294888 80.895407 60.398149 80.895407 60.520184 80.876632 60.660994 80.871939 60.792417 80.876632 60.886291 80.855511 60.989551 80.860204 61.120974 80.869592 61.299334 80.890713 61.421369 80.911835 61.487080 80.925916 61.515242 80.939997 61.534017 80.958771 61.468306 80.972852 61.327496 80.979893 61.327496 80.991627 61.299334 81.003361 61.299334 81.010402 61.365045 81.003361 61.440144 81.012749 61.430756 81.026830 61.289946 81.031523 61.149136 81.043258 61.055263 81.064379 61.017713 81.073766 60.980164 81.071420 # -b 63.528827 81.287328 63.510052 81.292022 63.472503 81.289675 63.434954 81.275594 63.312918 81.254473 63.237819 81.238045 63.115784 81.223964 63.012523 81.195802 62.909262 81.172333 62.843551 81.153559 62.787227 81.146518 62.721516 81.123050 62.646417 81.106622 62.618255 81.094888 62.655804 81.104275 62.721516 81.101928 62.730903 81.087847 62.730903 81.078460 62.749678 81.069073 62.834164 81.054992 62.843551 81.038564 62.796614 81.024483 62.777840 80.996321 62.665192 80.965812 62.561931 80.958771 62.477445 80.937650 62.458670 80.918875 62.496219 80.904794 62.618255 80.890713 62.796614 80.878979 62.843551 80.853164 62.974974 80.841430 63.068847 80.827349 63.068847 80.799187 63.181495 80.782759 63.303531 80.768678 63.341080 80.752250 63.378629 80.735822 63.472503 80.754597 63.556989 80.775718 63.575764 80.794493 63.603926 80.810921 63.707186 80.822655 63.754123 80.839083 63.763510 80.862551 63.866771 80.871939 63.941870 80.876632 63.941870 80.895407 64.016969 80.911835 64.063905 80.925916 64.120229 80.932956 64.204715 80.954078 64.326751 80.956425 64.430012 80.958771 64.552047 80.961118 64.627146 80.958771 64.749181 80.972852 64.852442 80.975199 64.927541 80.972852 65.012027 80.970506 65.030801 80.961118 65.058963 80.949384 65.105900 80.954078 65.199774 80.963465 65.256098 80.961118 65.312422 80.958771 65.378133 80.958771 65.425070 80.963465 65.490781 80.958771 65.509556 80.965812 65.443844 80.975199 65.378133 80.998668 65.312422 81.015095 65.199774 81.024483 65.143450 81.043258 65.143450 81.062032 65.134062 81.080807 65.134062 81.099582 65.049576 81.099582 64.965090 81.101928 64.946315 81.123050 64.871217 81.130090 64.833667 81.146518 64.824280 81.148865 64.814893 81.158252 64.749181 81.172333 64.777343 81.191108 64.814893 81.209883 64.889991 81.223964 64.918153 81.238045 64.918153 81.256820 64.899379 81.277941 64.899379 81.292022 64.899379 81.303756 64.946315 81.322531 64.965090 81.336612 64.918153 81.348346 64.871217 81.362427 64.805505 81.369468 64.702245 81.362427 64.674082 81.378855 64.617758 81.385895 64.505110 81.385895 64.392462 81.378855 64.307976 81.378855 64.232877 81.385895 64.139004 81.378855 64.063905 81.357733 63.913708 81.334265 63.801060 81.320184 63.688412 81.301409 63.622700 81.289675 63.566376 81.284982 63.528827 81.287328 # -b 63.538214 81.693331 63.613313 81.695678 63.632088 81.681597 63.669637 81.665169 63.688412 81.651088 63.632088 81.632313 63.556989 81.615885 63.406792 81.625273 63.256594 81.611192 63.162721 81.615885 63.125171 81.634660 62.974974 81.637007 62.852938 81.658128 62.806002 81.676903 62.712128 81.676903 62.599480 81.665169 62.524382 81.667516 62.458670 81.667516 62.411733 81.672209 62.421121 81.686290 62.421121 81.690984 62.392959 81.700371 62.411733 81.712106 62.421121 81.721493 62.468057 81.721493 62.552544 81.728533 62.599480 81.712106 62.627642 81.700371 62.674579 81.695678 62.730903 81.707412 62.777840 81.726187 62.843551 81.721493 62.909262 81.716799 62.937424 81.730880 62.974974 81.744961 63.059460 81.754349 63.162721 81.749655 63.200270 81.735574 63.265981 81.735574 63.359855 81.744961 63.406792 81.735574 63.444341 81.721493 63.500665 81.709759 63.538214 81.693331 # -b 50.844183 80.871939 50.834796 80.871939 50.769084 80.864898 50.693986 80.839083 50.374816 80.822655 50.252781 80.820308 50.299717 80.843777 50.393591 80.862551 50.393591 80.878979 50.374816 80.890713 50.337267 80.869592 50.299717 80.864898 50.243393 80.860204 50.224619 80.869592 50.149520 80.857858 50.065034 80.853164 # -b 49.996976 80.853164 50.006363 80.864898 # -b 49.928917 80.806227 50.013403 80.787452 50.069727 80.771025 50.097889 80.759290 50.050953 80.752250 50.032178 80.731128 # -b 49.964120 80.318085 50.039219 80.313392 50.114317 80.320432 50.057993 80.339207 50.067381 80.339207 50.161254 80.329820 50.217578 80.346247 50.245740 80.357982 50.226965 80.374409 50.255127 80.379103 50.292677 80.388491 50.283289 80.407265 50.283289 80.426040 50.180029 80.421346 50.076768 80.437774 # -b 49.964120 80.484711 50.067381 80.496445 50.067381 80.505832 50.142479 80.508179 50.264515 80.510526 50.283289 80.526954 50.292677 80.529301 50.377163 80.526954 50.480424 80.522260 50.583684 80.512873 50.696332 80.505832 50.743269 80.517566 50.818368 80.512873 50.884079 80.498792 50.987340 80.496445 51.043664 80.496445 51.043664 80.515220 51.109375 80.526954 51.231411 80.545728 51.306510 80.531647 51.362834 80.531647 51.372221 80.548075 51.400383 80.562156 51.494256 80.576237 51.513031 80.599706 51.513031 80.616134 51.569355 80.630215 51.578742 80.648989 51.578742 80.663070 51.578742 80.681845 51.531806 80.691232 51.466094 80.681845 51.419158 80.691232 51.390996 80.714701 51.362834 80.726435 51.297122 80.733475 51.231411 80.733475 51.165699 80.719394 51.062439 80.724088 50.959178 80.726435 50.893467 80.717047 50.837143 80.710007 50.790206 80.698273 50.696332 80.698273 50.564910 80.684192 50.452262 80.674804 50.349001 80.674804 50.292677 80.686539 50.283289 80.702966 50.302064 80.714701 50.311451 80.738169 50.349001 80.759290 50.424100 80.761637 50.555522 80.763984 50.640008 80.787452 50.705720 80.789799 50.818368 80.785106 50.893467 80.803880 50.884079 80.822655 50.884079 80.836736 50.931016 80.853164 50.959178 80.867245 50.977953 80.874285 50.959178 80.883673 50.959178 80.886020 50.884079 80.886020 50.865305 80.876632 50.837143 80.871939 # -b 53.029087 80.353288 53.066636 80.357982 53.085411 80.365022 53.104185 80.348594 53.113573 80.339207 53.226221 80.334513 53.357643 80.332166 53.376418 80.308698 53.470292 80.285230 53.573552 80.264108 53.573552 80.245334 53.639264 80.240640 53.714362 80.224212 53.676813 80.196050 53.658038 80.165541 53.611102 80.165541 53.554778 80.172582 53.460904 80.170235 53.385806 80.160847 53.460904 80.142073 53.460904 80.113911 53.413968 80.116258 53.357643 80.130339 53.273157 80.127992 53.169897 80.113911 53.132347 80.111564 53.076023 80.116258 53.038474 80.132685 52.963375 80.135032 52.944601 80.123298 52.953988 80.104523 52.897664 80.113911 52.831952 80.120951 52.775628 80.120951 52.691142 80.116258 52.653593 80.125645 52.672368 80.146766 52.634818 80.139726 52.540945 80.142073 52.503396 80.163194 52.437684 80.174929 52.381360 80.186663 52.371973 80.198397 52.343811 80.205437 52.353198 80.212478 52.465846 80.207784 52.559720 80.228906 52.653593 80.235946 52.794403 80.245334 52.813178 80.261761 52.850727 80.287577 52.850727 80.296964 52.785016 80.296964 52.785016 80.306351 52.831952 80.318085 52.831952 80.329820 52.822565 80.339207 52.878889 80.341554 52.935213 80.332166 52.972763 80.336860 52.982150 80.350941 53.029087 80.353288 # -b 56.767595 80.327473 56.758208 80.336860 56.739433 80.329820 56.579848 80.329820 56.598623 80.306351 56.636172 80.292270 56.626785 80.289923 56.532911 80.280536 56.476587 80.287577 56.410876 80.294617 56.298228 80.287577 56.204355 80.282883 56.157418 80.289923 56.072932 80.289923 55.988446 80.287577 55.922734 80.282883 55.866410 80.275842 55.857023 80.254721 55.913347 80.235946 55.913347 80.207784 55.932122 80.196050 55.922734 80.181969 55.885185 80.174929 55.857023 80.160847 55.866410 80.123298 55.866410 80.111564 55.810086 80.092789 55.781924 80.074015 55.800699 80.059934 55.875798 80.064627 55.941509 80.066974 55.997833 80.071668 56.044770 80.057587 56.138643 80.052893 56.194967 80.062280 56.260679 80.071668 56.298228 80.064627 56.326390 80.045853 56.420263 80.038812 56.495362 80.038812 56.551686 80.050546 56.579848 80.055240 56.598623 80.055240 56.626785 80.036465 56.711271 80.034118 56.786370 80.041159 56.889630 80.036465 56.936567 80.038812 56.955342 80.055240 56.917792 80.069321 56.870856 80.095136 56.861468 80.116258 56.805144 80.127992 56.880243 80.132685 56.917792 80.146766 56.936567 80.174929 56.983504 80.189010 57.002278 80.205437 56.992891 80.214825 57.011666 80.217172 57.067990 80.219518 57.058602 80.240640 57.105539 80.261761 57.105539 80.278189 57.077377 80.296964 57.049215 80.304004 56.936567 80.311045 56.880243 80.327473 56.833306 80.334513 56.805144 80.332166 56.767595 80.327473 # -b 58.102944 80.456549 58.084169 80.465936 58.027845 80.442468 57.962134 80.437774 57.924585 80.449508 57.868261 80.454202 57.811937 80.433080 57.765000 80.426040 57.671126 80.428387 57.558478 80.430734 57.445830 80.428387 57.370732 80.426040 57.351957 80.433080 57.351957 80.449508 57.286245 80.451855 57.220534 80.449508 57.173597 80.454202 57.107886 80.449508 57.098499 80.435427 57.098499 80.426040 57.126661 80.409612 57.201759 80.390837 57.220534 80.379103 57.201759 80.372063 57.201759 80.357982 57.220534 80.350941 57.267471 80.336860 57.314408 80.325126 57.314408 80.304004 57.305020 80.278189 57.258083 80.261761 57.258083 80.238293 57.229921 80.233599 57.220534 80.221865 57.258083 80.198397 57.239309 80.179622 57.220534 80.170235 57.136048 80.170235 57.117273 80.151460 57.107886 80.137379 57.145435 80.132685 57.248696 80.123298 57.267471 80.102177 57.323795 80.097483 57.408281 80.088096 57.408281 80.057587 57.483380 80.055240 57.567866 80.057587 57.671126 80.050546 57.736838 80.052893 57.793162 80.059934 57.765000 80.074015 57.755613 80.102177 57.708676 80.109217 57.671126 80.135032 57.671126 80.151460 57.614802 80.181969 57.689901 80.186663 57.811937 80.191356 57.962134 80.207784 58.027845 80.224212 58.168656 80.235946 58.206205 80.254721 58.271916 80.273496 58.375177 80.280536 58.459663 80.282883 58.553536 80.287577 58.609861 80.282883 58.694347 80.285230 58.778833 80.285230 58.872706 80.285230 58.910255 80.278189 58.947805 80.266455 59.004129 80.280536 59.079228 80.285230 59.116777 80.296964 59.116777 80.308698 59.098002 80.322779 58.975967 80.334513 58.910255 80.348594 58.806995 80.348594 58.675572 80.353288 58.581698 80.374409 58.459663 80.383797 58.337628 80.395531 58.318853 80.414306 58.243754 80.428387 58.149881 80.447161 58.121719 80.454202 58.102944 80.456549 # -b 59.227078 80.045853 59.217691 80.045853 59.189529 80.045853 59.142592 80.024731 59.076881 80.029425 58.954845 80.020037 58.804648 80.001263 # -b 59.656549 79.996569 59.590838 80.005956 59.496964 80.012997 59.412478 80.031772 59.337379 80.038812 59.262281 80.043506 59.224731 80.045853 # -b 60.097754 80.806227 60.003881 80.806227 59.938169 80.817961 59.816134 80.803880 59.712873 80.789799 59.665936 80.775718 59.684711 80.761637 59.665936 80.752250 59.637774 80.740516 59.590838 80.728782 59.590838 80.710007 59.600225 80.679498 59.543901 80.660723 59.478190 80.639602 59.384316 80.620827 59.356154 80.599706 59.290443 80.569197 59.271668 80.533994 59.252893 80.522260 59.318605 80.505832 59.337379 80.468283 59.346767 80.458896 59.356154 80.437774 59.384316 80.416653 59.496964 80.414306 59.534514 80.407265 59.525126 80.393184 59.534514 80.381450 59.590838 80.367369 59.665936 80.357982 59.759810 80.362675 59.825521 80.360328 59.881845 80.374409 59.938169 80.376756 # -b 58.422114 81.787204 58.422114 81.791898 58.403339 81.791898 58.365790 81.782511 58.309466 81.782511 58.253142 81.798938 58.168656 81.803632 58.112331 81.791898 58.009071 81.787204 57.924585 81.770776 57.933972 81.754349 57.933972 81.740268 57.887035 81.723840 57.933972 81.714452 57.896423 81.700371 57.877648 81.681597 57.980909 81.672209 58.027845 81.646394 58.149881 81.632313 58.271916 81.641700 58.384564 81.653435 58.469050 81.651088 58.525374 81.644047 58.609861 81.641700 58.656797 81.655781 58.750671 81.655781 58.825769 81.660475 58.891481 81.683943 58.966579 81.702718 58.966579 81.716799 58.966579 81.735574 58.994741 81.749655 58.957192 81.768430 58.872706 81.798938 58.760058 81.801285 58.703734 81.784857 58.628635 81.782511 58.515987 81.787204 58.422114 81.787204 # -b 57.671126 81.531399 57.586640 81.531399 57.558478 81.529052 57.455218 81.536093 57.408281 81.524359 57.380119 81.522012 57.239309 81.524359 57.126661 81.514971 57.098499 81.500890 56.985851 81.498544 56.873203 81.486809 56.854428 81.472728 56.798104 81.463341 56.704230 81.458647 56.723005 81.439873 56.704230 81.425792 56.694843 81.414057 56.779329 81.411711 56.910752 81.416404 56.985851 81.411711 57.051562 81.392936 57.117273 81.385895 57.145435 81.390589 57.192372 81.399976 57.248696 81.395283 57.295633 81.383549 57.370732 81.378855 57.473992 81.376508 57.539704 81.378855 57.539704 81.371814 57.539704 81.360080 57.605415 81.362427 57.699288 81.357733 57.755613 81.348346 57.765000 81.336612 57.877648 81.350693 57.980909 81.360080 58.056007 81.360080 58.140493 81.369468 58.187430 81.385895 58.234367 81.388242 58.271916 81.395283 58.318853 81.397630 58.365790 81.411711 58.384564 81.423445 58.337628 81.437526 58.206205 81.432832 58.178043 81.449260 58.112331 81.463341 58.046620 81.486809 57.933972 81.498544 57.877648 81.514971 57.811937 81.524359 57.793162 81.536093 57.671126 81.531399 # -b 56.535258 81.369468 56.535258 81.374161 56.422610 81.376508 56.366286 81.367121 56.366286 81.348346 56.356899 81.341306 56.356899 81.331918 56.422610 81.324878 56.450772 81.313144 56.413223 81.303756 56.403835 81.282635 56.431998 81.282635 56.507096 81.273247 56.469547 81.266207 56.403835 81.266207 56.403835 81.247432 56.413223 81.231004 56.413223 81.216923 56.356899 81.216923 56.300575 81.214576 56.281800 81.235698 56.225476 81.242738 56.178539 81.233351 56.131603 81.226311 56.065891 81.235698 56.009567 81.242738 55.981405 81.235698 55.896919 81.231004 55.859370 81.233351 55.849982 81.238045 55.849982 81.249779 55.812433 81.254473 55.746722 81.268554 55.671623 81.270901 55.615299 81.268554 55.549588 81.259166 55.427552 81.259166 55.408777 81.245085 55.418165 81.226311 55.436939 81.207536 55.521425 81.193455 55.605912 81.184068 55.681010 81.179374 55.727947 81.158252 55.803046 81.153559 55.925081 81.160599 56.009567 81.160599 56.065891 81.169987 56.169152 81.177027 56.197314 81.174680 56.197314 81.148865 56.234863 81.148865 56.375673 81.155906 56.488322 81.160599 56.535258 81.160599 56.544646 81.165293 56.488322 81.177027 56.525871 81.191108 56.638519 81.195802 56.732392 81.200495 56.873203 81.209883 56.948301 81.219270 56.948301 81.207536 57.060949 81.209883 57.192372 81.214576 57.295633 81.219270 57.380119 81.233351 57.455218 81.238045 57.502154 81.256820 57.567866 81.259166 57.633577 81.270901 57.671126 81.266207 57.680514 81.259166 57.727450 81.261513 57.793162 81.263860 57.793162 81.275594 57.774387 81.294369 57.727450 81.306103 57.624190 81.310797 57.558478 81.317837 57.520929 81.303756 57.502154 81.294369 57.427056 81.303756 57.305020 81.301409 57.229921 81.310797 57.229921 81.324878 57.098499 81.329571 56.948301 81.336612 56.873203 81.362427 56.798104 81.376508 56.685456 81.374161 56.535258 81.369468 # -b 58.708428 80.853164 58.727202 80.860204 58.727202 80.855511 58.745977 80.841430 58.708428 80.825002 58.774139 80.808574 58.774139 80.782759 58.745977 80.771025 58.661491 80.754597 58.558230 80.728782 58.445582 80.712354 58.361096 80.710007 58.342321 80.726435 58.276610 80.731128 58.210899 80.733475 58.117025 80.726435 58.060701 80.740516 57.985602 80.752250 57.863567 80.754597 57.769694 80.756944 57.760306 80.768678 57.854180 80.782759 57.948053 80.794493 58.060701 80.808574 58.088863 80.822655 58.182737 80.825002 58.257835 80.825002 58.285997 80.841430 58.323547 80.846123 58.408033 80.846123 58.492519 80.853164 58.548843 80.855511 58.614554 80.855511 58.680266 80.855511 58.708428 80.853164 # -b 56.105787 80.719394 56.068238 80.719394 56.030689 80.717047 55.983752 80.702966 55.908653 80.712354 55.796005 80.717047 55.730294 80.705313 55.711519 80.688885 55.608258 80.681845 55.476836 80.677151 55.401737 80.670111 55.429899 80.663070 55.533160 80.663070 55.589484 80.656030 55.504998 80.651336 55.495610 80.637255 55.523772 80.623174 55.504998 80.613787 55.551934 80.599706 55.645808 80.599706 55.720906 80.590318 55.796005 80.592665 55.918041 80.599706 56.049463 80.597359 56.162111 80.609093 56.227823 80.611440 56.246598 80.599706 56.312309 80.592665 56.424957 80.592665 56.546992 80.592665 56.603316 80.595012 56.603316 80.599706 56.622091 80.609093 56.706577 80.602053 56.828613 80.616134 56.884937 80.623174 56.922486 80.634908 56.922486 80.653683 56.913099 80.670111 56.847387 80.679498 56.762901 80.681845 56.791063 80.688885 56.762901 80.698273 56.669028 80.705313 56.565767 80.710007 56.537605 80.719394 56.490668 80.719394 56.387408 80.721741 56.302922 80.719394 56.180886 80.719394 56.105787 80.719394 # -b 54.606160 80.860204 54.615547 80.862551 54.596772 80.862551 54.512286 80.853164 54.399638 80.853164 54.258828 80.841430 54.108631 80.843777 54.014757 80.846123 54.014757 80.834389 54.071081 80.815614 54.071081 80.796840 54.071081 80.778065 54.052307 80.766331 54.099243 80.766331 54.183729 80.763984 54.324540 80.766331 54.399638 80.761637 54.474737 80.766331 54.559223 80.754597 54.606160 80.738169 54.606160 80.726435 54.577998 80.707660 54.643709 80.702966 54.709421 80.710007 54.784519 80.700620 54.869005 80.695926 54.953491 80.702966 55.037977 80.717047 55.160013 80.712354 55.244499 80.700620 55.282048 80.695926 55.319598 80.710007 55.422858 80.726435 55.554281 80.731128 55.695091 80.733475 55.732641 80.742863 55.798352 80.747556 55.807739 80.759290 55.695091 80.766331 55.648155 80.787452 55.591831 80.782759 55.544894 80.761637 55.432246 80.766331 55.310210 80.775718 55.253886 80.782759 55.282048 80.792146 55.357147 80.801533 55.357147 80.817961 55.300823 80.827349 55.216337 80.813268 55.094301 80.806227 54.981653 80.806227 54.972266 80.815614 54.972266 80.829696 55.000428 80.839083 54.991041 80.850817 54.934717 80.860204 54.859618 80.848470 54.765745 80.848470 54.681259 80.857858 54.606160 80.860204 # -b 55.864063 80.970506 55.826514 80.975199 55.817127 80.977546 55.751415 80.986933 55.695091 81.005708 55.610605 81.010402 55.469795 81.010402 55.394696 81.024483 55.282048 81.024483 55.216337 81.024483 55.150626 81.038564 55.019203 81.050298 54.934717 81.045604 54.840843 81.050298 54.737583 81.040911 54.653096 81.043258 54.559223 81.036217 54.531061 81.024483 54.531061 81.010402 54.484124 80.991627 54.465350 80.977546 54.371476 80.968159 54.418413 80.958771 54.512286 80.954078 54.531061 80.949384 54.643709 80.944690 54.765745 80.942344 54.793907 80.932956 54.775132 80.914182 54.878393 80.916528 55.000428 80.918875 55.094301 80.923569 55.235112 80.918875 55.319598 80.918875 55.394696 80.907141 55.366534 80.883673 55.394696 80.878979 55.479182 80.867245 55.563669 80.871939 55.657542 80.881326 55.685704 80.869592 55.742028 80.850817 55.788965 80.822655 55.788965 80.810921 55.948549 80.796840 56.070585 80.787452 56.192620 80.789799 56.305268 80.782759 56.417916 80.775718 56.511790 80.754597 56.577501 80.759290 56.661987 80.768678 56.708924 80.747556 56.708924 80.733475 56.708924 80.719394 56.737086 80.714701 56.830959 80.724088 56.877896 80.719394 56.877896 80.705313 56.877896 80.695926 56.887284 80.688885 56.952995 80.688885 56.999932 80.674804 56.999932 80.660723 56.981157 80.663070 57.056256 80.660723 57.131354 80.660723 57.290939 80.672458 57.488073 80.674804 57.525623 80.691232 57.591334 80.705313 57.610109 80.717047 57.619496 80.735822 57.638271 80.754597 57.572559 80.759290 57.459911 80.775718 57.412975 80.796840 57.290939 80.808574 57.178291 80.829696 57.103192 80.853164 57.018706 80.864898 56.915446 80.871939 56.849734 80.886020 56.765248 80.893060 56.690149 80.907141 56.633825 80.911835 56.605663 80.911835 56.549339 80.909488 56.408529 80.918875 56.305268 80.925916 56.286494 80.932956 56.324043 80.942344 56.342818 80.958771 56.248944 80.979893 56.183233 80.989280 56.051810 80.979893 55.929775 80.965812 55.864063 80.970506 # -b 56.821572 81.043258 56.821572 81.045604 56.699537 81.045604 56.558727 81.045604 56.530565 81.057339 56.455466 81.069073 56.370980 81.054992 56.286494 81.057339 56.230170 81.066726 56.183233 81.076113 56.108134 81.062032 56.117522 81.047951 56.202008 81.026830 56.342818 81.017442 56.446079 80.991627 56.549339 80.972852 56.708924 80.954078 56.802797 80.939997 56.821572 80.932956 56.877896 80.928263 56.934220 80.928263 56.971770 80.911835 57.065643 80.883673 57.225228 80.846123 57.337876 80.817961 57.488073 80.815614 57.553785 80.817961 57.553785 80.810921 57.553785 80.789799 57.685207 80.794493 57.769694 80.789799 57.816630 80.803880 57.835405 80.806227 57.872954 80.825002 57.919891 80.825002 57.948053 80.829696 57.966828 80.839083 58.004377 80.846123 58.013764 80.860204 58.023152 80.871939 58.023152 80.878979 57.948053 80.881326 57.816630 80.883673 57.713369 80.907141 57.675820 80.925916 57.572559 80.937650 57.450524 80.958771 57.366038 80.972852 57.253390 80.991627 57.150129 81.003361 57.056256 81.012749 56.990544 81.024483 56.887284 81.040911 56.821572 81.043258 # -b 46.511925 80.860204 46.324179 80.850817 46.202143 80.841430 46.098882 80.832042 46.080108 80.817961 45.995622 80.817961 45.826650 80.801533 45.714001 80.787452 45.714001 80.773371 45.667065 80.773371 45.573191 80.768678 45.460543 80.761637 45.413607 80.747556 45.385445 80.747556 45.329121 80.747556 45.272796 80.745209 45.207085 80.726435 45.150761 80.717047 45.085050 80.724088 45.019338 80.724088 44.934852 80.719394 44.859753 80.705313 44.831591 80.688885 44.765880 80.710007 44.690781 80.710007 44.615683 80.695926 44.521809 80.695926 44.465485 80.688885 44.437323 80.667764 44.380999 80.658377 44.324675 80.656030 44.324675 80.651336 44.362224 80.637255 44.334062 80.625521 44.258964 80.623174 44.193252 80.606746 44.249576 80.609093 44.277738 80.595012 44.212027 80.580931 44.212027 80.576237 44.296513 80.576237 44.277738 80.559809 44.230802 80.552769 44.249576 80.550422 44.305900 80.545728 44.268351 80.531647 44.212027 80.524607 44.249576 80.522260 44.296513 80.503485 44.371612 80.501139 44.465485 80.515220 44.521809 80.519913 44.606295 80.522260 44.747105 80.515220 44.887916 80.515220 44.963014 80.512873 45.056888 80.491751 45.122599 80.489404 45.122599 80.475323 45.094437 80.463589 45.141374 80.447161 45.225860 80.454202 45.272796 80.461242 45.300958 80.472977 45.300958 80.503485 45.347895 80.503485 45.413607 80.487058 45.488705 80.487058 45.516867 80.487058 45.554417 80.498792 45.648290 80.503485 45.751551 80.501139 45.779713 80.491751 45.807875 80.475323 45.845424 80.458896 45.948685 80.461242 45.976847 80.444815 46.005009 80.414306 46.080108 80.409612 46.136432 80.421346 46.145819 80.442468 46.145819 80.449508 46.220918 80.442468 46.249080 80.449508 46.192756 80.465936 46.145819 80.482364 46.098882 80.498792 46.089495 80.517566 46.183369 80.522260 46.202143 80.541035 46.098882 80.552769 45.967460 80.562156 45.920523 80.576237 45.911136 80.595012 45.958072 80.618480 45.958072 80.641949 45.967460 80.660723 46.061333 80.660723 46.127044 80.660723 46.155206 80.679498 46.211531 80.679498 46.277242 80.679498 46.286629 80.691232 46.286629 80.710007 46.267855 80.726435 46.333566 80.717047 46.399277 80.717047 46.446214 80.731128 46.474376 80.752250 46.540087 80.752250 46.624574 80.745209 46.690285 80.747556 46.840482 80.756944 46.981292 80.754597 47.103328 80.754597 47.262913 80.752250 47.413110 80.752250 47.591470 80.747556 47.638406 80.724088 47.722892 80.714701 47.779216 80.691232 47.873090 80.688885 47.910639 80.665417 47.948189 80.660723 47.995125 80.660723 48.051449 80.646642 48.145323 80.646642 48.211034 80.644296 48.286133 80.648989 48.370619 80.660723 48.408168 80.648989 48.455105 80.646642 48.586528 80.651336 48.708563 80.663070 48.905697 80.681845 48.896310 80.681845 48.905697 80.695926 48.811824 80.707660 48.708563 80.717047 48.605302 80.733475 48.492654 80.740516 48.464492 80.738169 48.380006 80.752250 48.276745 80.773371 48.107773 80.778065 47.995125 80.794493 47.910639 80.815614 47.835540 80.815614 47.779216 80.817961 47.666568 80.810921 47.619632 80.825002 47.506984 80.822655 47.384948 80.829696 47.384948 80.846123 47.300462 80.848470 47.225363 80.853164 47.169039 80.839083 47.131490 80.841430 47.047004 80.846123 46.990680 80.855511 46.943743 80.846123 46.924968 80.834389 46.896806 80.834389 46.821708 80.843777 46.652736 80.843777 46.577637 80.853164 46.511925 80.860204 # -b 50.062687 80.853164 49.996976 80.853164 # -b 50.006363 80.864898 49.987588 80.878979 49.931264 80.869592 49.884327 80.867245 49.762292 80.860204 49.677806 80.862551 49.630869 80.848470 49.677806 80.846123 49.734130 80.841430 49.677806 80.834389 49.612095 80.822655 49.621482 80.817961 49.687193 80.810921 49.762292 80.801533 49.828003 80.801533 49.931264 80.806227 # -b 50.029831 80.731128 49.964120 80.731128 49.870246 80.735822 49.795148 80.733475 49.738824 80.726435 49.673112 80.735822 49.569852 80.731128 49.504140 80.724088 49.475978 80.717047 49.466591 80.707660 49.485366 80.693579 49.485366 80.686539 49.466591 80.681845 49.410267 80.688885 49.353943 80.691232 49.335168 80.681845 49.278844 80.677151 49.250682 80.667764 49.297619 80.651336 49.278844 80.648989 49.260069 80.648989 49.231907 80.651336 49.194358 80.653683 49.175583 80.653683 49.166196 80.639602 49.231907 80.663070 49.288231 80.653683 49.278844 80.644296 49.213133 80.646642 49.175583 80.651336 49.147421 80.641949 49.044161 80.630215 48.987836 80.623174 48.912738 80.623174 48.856414 80.616134 48.856414 80.606746 48.781315 80.606746 48.668667 80.602053 48.640505 80.609093 48.593568 80.611440 48.527857 80.604399 48.415209 80.592665 48.311948 80.585625 48.302561 80.599706 48.236849 80.609093 48.152363 80.604399 48.086652 80.606746 48.011553 80.613787 47.945842 80.625521 47.870743 80.630215 47.861356 80.623174 47.851968 80.599706 47.786257 80.602053 47.758095 80.609093 47.701771 80.609093 47.589123 80.611440 47.467087 80.613787 47.382601 80.606746 47.316890 80.620827 47.232404 80.630215 47.176080 80.637255 47.110368 80.623174 47.035270 80.616134 46.950784 80.625521 46.875685 80.630215 46.819361 80.627868 46.781811 80.611440 46.669163 80.602053 46.650389 80.590318 46.669163 80.583278 46.631614 80.562156 46.594065 80.548075 46.537741 80.531647 46.528353 80.522260 46.565903 80.503485 46.622227 80.505832 46.706713 80.503485 46.819361 80.512873 46.903847 80.519913 46.941396 80.526954 46.941396 80.505832 46.978946 80.508179 47.147918 80.512873 47.241791 80.487058 47.363827 80.477670 47.391989 80.461242 47.363827 80.451855 47.316890 80.442468 47.298115 80.428387 47.382601 80.426040 47.448313 80.421346 47.514024 80.430734 47.589123 80.430734 47.579735 80.418999 47.551573 80.407265 47.645447 80.400225 47.654834 80.369716 47.579735 80.374409 47.485862 80.367369 47.457700 80.383797 47.354439 80.388491 47.279341 80.395531 47.269953 80.379103 47.213629 80.367369 47.129143 80.372063 47.063432 80.372063 46.988333 80.365022 46.988333 80.353288 46.988333 80.339207 46.894460 80.341554 46.856910 80.322779 46.875685 80.306351 46.819361 80.313392 46.791199 80.313392 46.734875 80.301658 46.669163 80.280536 46.697325 80.259415 46.697325 80.233599 46.622227 80.233599 46.603452 80.217172 46.650389 80.207784 46.725487 80.207784 46.819361 80.191356 46.809973 80.170235 46.856910 80.170235 46.978946 80.179622 46.969558 80.163194 46.875685 80.146766 46.913234 80.142073 46.960171 80.137379 46.922622 80.116258 46.978946 80.111564 47.044657 80.120951 47.138530 80.123298 47.204242 80.127992 47.288728 80.123298 47.391989 80.125645 47.420151 80.135032 47.420151 80.144420 47.476475 80.158501 47.589123 80.170235 47.682996 80.177275 47.720546 80.167888 47.720546 80.149113 47.711158 80.132685 47.682996 80.123298 47.739320 80.125645 47.805032 80.139726 47.851968 80.127992 47.889518 80.102177 47.889518 80.088096 47.861356 80.078708 47.786257 80.076361 47.701771 80.064627 47.645447 80.045853 47.645447 80.031772 47.617285 80.005956 # -b 47.910639 79.989529 47.985738 80.010650 48.013900 80.022384 47.995125 80.038812 48.023287 80.050546 48.088999 80.059934 48.145323 80.043506 48.145323 80.015344 48.220421 80.012997 48.304907 80.020037 48.314295 80.043506 48.361232 80.045853 48.351844 80.057587 48.304907 80.074015 48.314295 80.090442 48.304907 80.123298 48.333069 80.130339 48.417556 80.123298 48.436330 80.104523 48.473880 80.095136 48.567753 80.102177 48.652239 80.085749 48.689788 80.095136 48.689788 80.111564 48.661626 80.132685 48.689788 80.135032 48.774274 80.142073 48.821211 80.120951 48.877535 80.123298 48.943247 80.142073 48.962021 80.160847 48.924472 80.170235 48.858761 80.179622 48.896310 80.181969 48.915085 80.205437 48.868148 80.231253 48.915085 80.221865 48.971409 80.210131 48.990183 80.226559 48.924472 80.247680 48.877535 80.261761 48.858761 80.280536 48.821211 80.292270 48.727338 80.294617 48.661626 80.299311 48.624077 80.304004 48.624077 80.332166 48.605302 80.339207 48.680401 80.341554 48.774274 80.346247 48.821211 80.336860 48.943247 80.336860 49.027733 80.339207 49.065282 80.315739 49.159155 80.322779 49.168543 80.329820 49.290578 80.334513 49.346902 80.329820 49.375064 80.313392 49.412614 80.318085 49.468938 80.329820 49.515874 80.325126 49.534649 80.322779 49.562811 80.318085 49.619135 80.313392 49.684847 80.318085 49.731783 80.332166 49.759945 80.327473 49.806882 80.311045 49.910143 80.313392 49.966467 80.318085 # -b 50.083808 80.437774 49.999322 80.440121 49.914836 80.442468 49.886674 80.458896 49.877287 80.458896 49.896062 80.482364 49.971160 80.484711 # -b 33.463522 80.207784 33.491684 80.212478 33.491684 80.207784 33.491684 80.196050 33.538621 80.179622 33.510459 80.179622 33.416585 80.177275 33.350874 80.179622 33.313325 80.172582 33.200677 80.167888 33.125578 80.146766 33.022317 80.135032 32.947218 80.132685 32.900282 80.118604 32.825183 80.123298 32.703148 80.120951 32.590499 80.113911 32.562337 80.097483 32.430915 80.092789 32.393365 80.081055 32.346429 80.074015 32.280717 80.076361 32.261943 80.071668 32.196231 80.071668 32.092970 80.078708 32.083583 80.081055 32.083583 80.076361 32.064808 80.074015 32.036646 80.066974 32.036646 80.052893 32.008484 80.050546 31.970935 80.048199 31.961548 80.041159 31.952160 80.038812 31.877062 80.038812 31.820738 80.050546 31.698702 80.029425 31.642378 80.043506 31.614216 80.038812 31.557892 80.036465 31.501568 80.024731 31.435857 80.031772 31.435857 80.045853 31.435857 80.057587 31.435857 80.064627 31.370145 80.064627 31.323208 80.071668 31.370145 80.076361 31.445244 80.083402 31.510955 80.097483 31.557892 80.092789 31.661153 80.095136 31.745639 80.109217 31.820738 80.106870 31.933386 80.109217 32.064808 80.132685 32.092970 80.125645 32.177456 80.127992 32.261943 80.142073 32.337041 80.151460 32.374591 80.156154 32.430915 80.158501 32.468464 80.163194 32.534175 80.167888 32.637436 80.170235 32.703148 80.167888 32.759472 80.170235 32.797021 80.186663 32.815796 80.189010 32.881507 80.191356 32.947218 80.205437 32.956606 80.221865 32.975380 80.224212 33.059866 80.217172 33.106803 80.217172 33.172515 80.224212 33.238226 80.217172 33.322712 80.214825 33.416585 80.217172 33.454135 80.217172 33.463522 80.207784 # -b 22.778382 80.512873 22.759607 80.515220 22.759607 80.512873 22.806544 80.498792 22.825318 80.482364 22.909805 80.468283 23.031840 80.472977 23.106939 80.465936 23.182037 80.465936 23.219587 80.454202 23.228974 80.440121 23.200812 80.421346 23.200812 80.407265 23.182037 80.393184 23.078777 80.388491 23.069389 80.381450 23.116326 80.369716 23.135101 80.353288 23.163263 80.343901 23.200812 80.334513 23.238361 80.322779 23.200812 80.306351 23.182037 80.287577 23.172650 80.273496 23.163263 80.254721 23.097551 80.242987 23.041227 80.233599 23.031840 80.217172 23.031840 80.200744 23.003678 80.189010 22.966129 80.174929 22.947354 80.163194 22.928579 80.153807 22.919192 80.139726 22.937967 80.125645 22.975516 80.109217 23.013065 80.102177 23.060002 80.102177 23.069389 80.102177 23.069389 80.102177 23.106939 80.104523 23.153875 80.120951 23.153875 80.132685 23.153875 80.142073 23.182037 80.139726 23.238361 80.142073 23.247749 80.160847 23.257136 80.167888 23.285298 80.163194 23.285298 80.149113 23.294685 80.132685 23.313460 80.132685 23.360397 80.132685 23.379172 80.158501 23.379172 80.177275 23.407334 80.177275 23.435496 80.163194 23.473045 80.142073 23.482432 80.132685 23.482432 80.125645 23.473045 80.113911 23.501207 80.102177 23.557531 80.099830 23.604468 80.116258 23.585693 80.123298 23.576306 80.132685 23.642017 80.132685 23.698341 80.132685 23.726503 80.144420 23.707728 80.153807 23.679566 80.163194 23.660792 80.170235 23.698341 80.172582 23.754665 80.170235 23.810989 80.181969 23.810989 80.191356 23.764053 80.205437 23.726503 80.217172 23.726503 80.233599 23.764053 80.231253 23.820377 80.228906 23.857926 80.233599 23.848539 80.245334 23.773440 80.252374 23.735890 80.257068 23.735890 80.271149 23.773440 80.268802 23.820377 80.254721 23.876701 80.245334 23.951799 80.245334 24.017511 80.245334 24.026898 80.252374 24.026898 80.264108 23.989349 80.273496 23.979961 80.280536 23.998736 80.278189 24.064447 80.261761 24.120771 80.252374 24.186483 80.242987 24.205258 80.242987 24.205258 80.261761 24.148933 80.273496 24.120771 80.280536 24.130159 80.287577 24.177095 80.280536 24.214645 80.271149 24.299131 80.264108 24.374230 80.257068 24.421166 80.240640 24.468103 80.240640 24.524427 80.245334 24.571364 80.245334 24.590138 80.264108 24.646463 80.266455 24.693399 80.259415 24.730949 80.266455 24.768498 80.294617 24.806047 80.315739 24.815435 80.329820 24.815435 80.332166 24.834209 80.334513 24.881146 80.336860 24.890533 80.322779 24.890533 80.301658 24.881146 80.289923 24.862371 80.273496 24.862371 80.257068 24.862371 80.235946 24.862371 80.224212 24.777885 80.217172 24.730949 80.207784 24.655850 80.200744 24.618301 80.191356 24.618301 80.179622 24.618301 80.163194 24.590138 80.151460 24.552589 80.142073 24.524427 80.132685 24.486878 80.113911 24.486878 80.116258 24.524427 80.127992 24.608913 80.137379 24.693399 80.153807 24.730949 80.170235 24.759111 80.186663 24.796660 80.198397 24.834209 80.200744 24.899921 80.207784 24.928083 80.200744 24.946857 80.196050 25.012569 80.193703 25.068893 80.198397 25.087668 80.217172 25.115830 80.228906 25.172154 80.235946 25.284802 80.242987 25.350513 80.242987 25.388062 80.238293 25.369288 80.233599 25.303576 80.233599 25.247252 80.219518 25.219090 80.207784 25.256640 80.200744 25.312964 80.200744 25.341126 80.186663 25.350513 80.170235 25.425612 80.170235 25.444386 80.181969 25.444386 80.198397 25.453774 80.207784 25.510098 80.203091 25.528873 80.186663 25.538260 80.174929 25.566422 80.163194 25.613359 80.165541 25.660295 80.181969 25.697845 80.196050 25.726007 80.191356 25.763556 80.184316 25.782331 80.179622 25.791718 80.179622 25.819880 80.172582 25.810493 80.172582 25.810493 80.170235 25.810493 80.151460 25.782331 80.144420 25.782331 80.139726 25.848042 80.139726 25.894979 80.142073 25.932528 80.146766 25.970078 80.160847 26.017014 80.160847 26.026402 80.151460 26.167212 80.151460 26.270472 80.151460 26.354958 80.151460 26.458219 80.153807 26.533318 80.151460 26.599029 80.139726 26.645966 80.132685 26.664741 80.132685 26.730452 80.139726 26.796164 80.132685 26.843100 80.123298 26.824326 80.102177 26.824326 80.095136 26.880650 80.085749 26.908812 80.074015 26.955748 80.074015 26.955748 80.062280 26.955748 80.055240 26.974523 80.055240 27.040234 80.059934 27.105946 80.062280 27.115333 80.055240 27.134108 80.055240 27.134108 80.038812 27.115333 80.017691 27.105946 80.005956 # -b 19.955139 80.402572 20.030238 80.388491 20.133499 80.409612 20.217985 80.418999 20.302471 80.409612 20.302471 80.390837 20.321245 80.374409 20.358795 80.362675 20.433893 80.346247 20.452668 80.329820 20.424506 80.322779 20.433893 80.299311 20.462055 80.280536 20.555929 80.271149 20.649802 80.280536 20.734288 80.289923 20.743676 80.273496 20.734288 80.252374 20.734288 80.245334 20.781225 80.231253 20.781225 80.219518 20.781225 80.210131 20.781225 80.212478 20.781225 80.207784 20.846936 80.198397 20.959585 80.196050 21.053458 80.196050 21.109782 80.196050 21.222430 80.214825 21.241205 80.217172 21.288141 80.231253 21.306916 80.219518 21.372628 80.212478 21.457114 80.228906 21.494663 80.240640 21.579149 80.233599 21.644860 80.207784 21.748121 80.207784 21.757508 80.228906 21.757508 80.252374 21.785671 80.254721 21.860769 80.266455 21.907706 80.250027 21.898319 80.221865 21.917093 80.198397 21.917093 80.196050 21.841995 80.172582 21.738734 80.151460 21.710572 80.130339 21.541600 80.095136 21.588536 80.099830 21.682410 80.116258 21.795058 80.127992 21.841995 80.130339 21.907706 80.109217 22.001579 80.076361 22.039129 80.038812 22.123615 80.010650 # -b 22.435744 79.991875 22.445131 80.010650 22.370032 80.024731 22.323096 80.034118 22.407582 80.041159 22.426356 80.057587 22.379420 80.074015 22.370032 80.092789 22.351258 80.123298 22.360645 80.149113 22.379420 80.198397 22.407582 80.217172 22.426356 80.247680 22.426356 80.261761 22.445131 80.280536 22.445131 80.292270 22.445131 80.306351 22.416969 80.315739 22.323096 80.318085 22.323096 80.339207 22.351258 80.355635 22.379420 80.381450 22.379420 80.400225 22.379420 80.402572 22.435744 80.400225 22.501455 80.407265 22.539005 80.407265 22.548392 80.367369 22.614103 80.346247 22.632878 80.322779 22.717364 80.329820 22.792463 80.334513 22.792463 80.346247 22.801850 80.357982 22.783075 80.362675 22.792463 80.397878 22.820625 80.421346 22.811237 80.428387 22.792463 80.458896 22.792463 80.475323 22.764301 80.494098 22.764301 80.505832 22.754913 80.505832 22.764301 80.512873 22.783075 80.512873 # -b 15.996028 79.998916 16.099289 80.012997 16.183775 80.050546 16.305810 80.062280 16.409071 80.036465 16.512332 80.031772 16.559269 80.017691 16.559269 80.010650 # -b 18.730091 79.989529 18.814577 80.003610 18.870901 80.017691 18.880289 80.029425 18.823965 80.024731 18.720704 80.017691 18.645605 80.012997 18.561119 80.012997 18.504795 80.012997 18.495408 80.024731 18.457858 80.027078 18.429696 80.034118 18.392147 80.034118 18.382760 80.020037 18.345210 80.015344 18.317048 80.015344 18.279499 80.022384 18.204400 80.024731 18.157463 80.045853 18.091752 80.045853 18.063590 80.066974 18.082365 80.074015 18.138689 80.076361 18.138689 80.090442 18.063590 80.102177 18.035428 80.123298 18.016653 80.132685 17.950942 80.142073 17.904005 80.132685 17.847681 80.137379 17.810132 80.139726 17.781970 80.139726 17.763195 80.142073 17.650547 80.132685 17.547286 80.125645 17.547286 80.142073 17.622385 80.160847 17.753808 80.189010 17.828906 80.193703 17.913393 80.179622 18.035428 80.181969 18.091752 80.181969 18.101139 80.174929 18.119914 80.160847 18.204400 80.160847 18.317048 80.167888 18.410922 80.160847 18.476633 80.170235 18.561119 80.144420 18.654992 80.142073 18.701929 80.170235 18.720704 80.186663 18.786415 80.179622 18.852127 80.172582 18.908451 80.163194 18.908451 80.139726 18.908451 80.123298 18.983549 80.118604 19.086810 80.106870 19.096197 80.085749 19.161909 80.066974 19.161909 80.048199 19.274557 80.015344 19.359043 80.001263 19.424754 80.012997 19.424754 80.024731 19.405980 80.052893 19.405980 80.069321 19.359043 80.088096 19.387205 80.081055 19.452916 80.074015 19.509240 80.083402 19.462304 80.095136 19.452916 80.104523 19.424754 80.111564 19.387205 80.132685 19.415367 80.132685 19.490466 80.125645 19.565564 80.116258 19.603114 80.123298 19.603114 80.135032 19.565564 80.146766 19.509240 80.158501 19.405980 80.160847 19.330881 80.163194 19.283944 80.179622 19.171296 80.172582 19.133747 80.198397 19.124359 80.205437 19.068035 80.221865 19.039873 80.228906 19.039873 80.242987 19.096197 80.252374 19.096197 80.271149 19.096197 80.282883 19.086810 80.299311 19.086810 80.313392 19.077423 80.336860 19.077423 80.350941 19.124359 80.332166 19.190071 80.315739 19.255782 80.292270 19.340268 80.275842 19.387205 80.247680 19.415367 80.224212 19.481078 80.210131 19.528015 80.214825 19.574952 80.214825 19.659438 80.207784 19.725149 80.189010 19.781473 80.167888 19.828410 80.177275 19.837797 80.189010 19.856572 80.198397 19.856572 80.200744 19.856572 80.214825 19.828410 80.224212 19.828410 80.221865 19.762699 80.228906 19.734537 80.247680 19.734537 80.252374 19.800248 80.259415 19.800248 80.280536 19.828410 80.301658 19.800248 80.306351 19.772086 80.327473 19.828410 80.325126 19.847185 80.325126 19.847185 80.327473 19.790861 80.327473 19.743924 80.334513 19.734537 80.341554 19.762699 80.348594 19.847185 80.362675 19.884734 80.374409 19.865959 80.383797 19.781473 80.374409 19.725149 80.374409 19.715762 80.393184 19.715762 80.402572 19.678213 80.404918 19.640663 80.383797 19.612501 80.365022 19.584339 80.367369 19.574952 80.383797 19.546790 80.388491 19.509240 80.386144 19.490466 80.393184 19.443529 80.407265 19.443529 80.426040 19.490466 80.454202 19.518628 80.468283 19.565564 80.475323 19.603114 80.451855 19.668825 80.442468 19.678213 80.465936 19.668825 80.487058 19.668825 80.501139 19.706375 80.515220 19.743924 80.515220 19.762699 80.491751 19.800248 80.465936 19.959833 80.465936 19.987995 80.449508 19.950445 80.416653 19.959833 80.402572 asymptote-3.05/examples/oneoverx.asy0000644000000000000000000000046415031566105016373 0ustar rootrootimport graph; size(200,IgnoreAspect); real f(real x) {return 1/x;}; bool3 branch(real x) { static int lastsign=0; if(x == 0) return false; int sign=sgn(x); bool b=lastsign == 0 || sign == lastsign; lastsign=sign; return b ? true : default; } draw(graph(f,-1,1,branch)); axes("$x$","$y$",red); asymptote-3.05/examples/labelbox.asy0000644000000000000000000000041015031566105016305 0ustar rootrootsize(0,100); real margin=2mm; pair z1=(0,1); pair z0=(0,0); object Box=draw("small box",box,z1,margin); object Ellipse=draw("LARGE ELLIPSE",ellipse,z0,margin); add(new void(frame f, transform t) { draw(f,point(Box,SW,t){SW}..{SW}point(Ellipse,NNE,t)); }); asymptote-3.05/examples/sinxlex.asy0000644000000000000000000000057215031566105016220 0ustar rootrootimport geometry; size(0,100); real theta=30; pair A=(0,0); pair B=dir(theta); pair C=(1,0); pair D=(1,Tan(theta)); pair E=(Cos(theta),0); filldraw(A--C{N}..B--cycle,lightgrey); draw(B--C--D--cycle); draw(B--E); draw("$x$",arc(C,A,B,0.7),RightSide,Arrow,PenMargin); dot("$A$",A,W); dot("$B$",B,NW); dot("$C$",C); dot("$D$",D); dot(("$E$"),E,S); label("$1$",A--B,LeftSide); asymptote-3.05/examples/odetest.asy0000644000000000000000000000234315031566105016173 0ustar rootrootimport ode; write("integration test"); real f(real t, real x) {return cos(x);} write(integrate(1,f,0,10,0.1,dynamic=true,0.0002,0.0004,RK3BS,verbose=true)); write(); write("system integration test"); real[] f(real t, real[] x) {return new real[] {x[1],1.5*x[0]^2};} write(integrate(new real[] {4,-8},f,0,1,n=100,dynamic=true,tolmin=0.0002, tolmax=0.0004,RK3BS,verbose=false)); write(); write("simultaneous newton test"); real[] function(real[] x) { return new real[] {x[0]^2+x[1]^2-25,(x[0]-6)^2+x[1]^2-25}; } real[][] fJac(real[] x) { return new real[][] {{2*x[0],2*x[1]},{2*(x[0]-6),2*x[1]}}; } write(newton(function,fJac,new real[] {0,-1})); write(); write("BVP solver test"); write("Finding initial conditions that solve w''(t)=1.5*w(t), w(0)=4, w(1)=1"); real[] initial(real[] x) { return new real[] {4,x[0]}; } real[] discrepancy(real[] x) { real error=x[0]-1; write("Error: ",error); return new real[] {error}; } real[] w0=solveBVP(f,0,1,n=10,dynamic=true,tolmin=0.0002,tolmax=0.0004,RK3BS, initial,discrepancy,guess=new real[] {-30},iterations=10); write(w0); write(); write(integrate(w0,f,0,1,n=10,dynamic=true,tolmin=0.0002,tolmax=0.0004,RK3BS, verbose=false)); write(); asymptote-3.05/examples/stroke3.asy0000644000000000000000000000007315031566105016114 0ustar rootrootimport three; size(5cm); draw(O--X,red+1cm,currentlight); asymptote-3.05/examples/gamma.asy0000644000000000000000000000066715031566105015615 0ustar rootrootimport graph; size(300,IgnoreAspect); bool3 branch(real x) { static int lastsign=0; if(x <= 0 && x == floor(x)) return false; int sign=sgn(gamma(x)); bool b=lastsign == 0 || sign == lastsign; lastsign=sign; return b ? true : default; } draw(graph(gamma,-4,4,n=2000,branch),red); scale(false); xlimits(-4,4); ylimits(-6,6); crop(); xaxis("$x$",RightTicks(NoZero)); yaxis(LeftTicks(NoZero)); label("$\Gamma(x)$",(1,2),red); asymptote-3.05/examples/contextfonts.asy0000644000000000000000000000037615031566105017266 0ustar rootrootsettings.tex="context"; // Work around ConTeXT bug for font sizes less than 12pt: texpreamble("\setupbodyfont[8pt]"); usetypescript("iwona"); usetypescript("antykwa-torunska"); label("$A$",0,N,font("iwona")); label("$A$",0,S,font("antykwa",8pt)+red); asymptote-3.05/examples/alignedaxis.asy0000644000000000000000000000541615031566105017020 0ustar rootrootimport graph; real Freq=60.0; real margin=5mm; pair exp(pair x) { return exp(x.x)*(cos(x.y)+I*sin(x.y)); } real Merr(real x, real w) { real tau=x/(2*Freq); return 20*log(abs((tau*w+tau/(exp(I*2*pi*Freq*tau)-1))*(I*2*pi*Freq))); } real Aerr(real x, real w) { real tau=x/(2*Freq); return degrees((tau*w+tau/(exp(I*2*pi*Freq*tau)-1))*(I*2*pi*Freq)); } picture pic1; scale(pic1,Log,Linear); real Merr1(real x){return Merr(x,1);} draw(pic1,graph(pic1,Merr1,1e-4,1),black+1.2); ylimits(pic1,-60,20); yaxis(pic1,"magnitude (dB)",LeftRight,RightTicks(new real[] {-60,-40,-20,0,20})); xaxis(pic1,"$f/f_\mathrm{Ny}$",BottomTop,LeftTicks(N=5)); yequals(pic1,0,Dotted); yequals(pic1,-20,Dotted); yequals(pic1,-40,Dotted); xequals(pic1,1e-3,Dotted); xequals(pic1,1e-2,Dotted); xequals(pic1,1e-1,Dotted); size(pic1,100,100,point(pic1,SW),point(pic1,NE)); label(pic1,"$\theta=1$",point(pic1,N),2N); frame f1=pic1.fit(); add(f1); picture pic1p; scale(pic1p,Log,Linear); real Aerr1(real x){return Aerr(x,1);} draw(pic1p,graph(pic1p,Aerr1,1e-4,1),black+1.2); ylimits(pic1p,-5,95); yaxis(pic1p,"phase (deg)",LeftRight,RightTicks(new real[] {0,45,90})); xaxis(pic1p,"$f/f_\mathrm{Ny}$",BottomTop,LeftTicks(N=5)); yequals(pic1p,0,Dotted); yequals(pic1p,45,Dotted); yequals(pic1p,90,Dotted); xequals(pic1p,1e-3,Dotted); xequals(pic1p,1e-2,Dotted); xequals(pic1p,1e-1,Dotted); size(pic1p,100,100,point(pic1p,SW),point(pic1p,NE)); frame f1p=pic1p.fit(); f1p=shift(0,min(f1).y-max(f1p).y-margin)*f1p; add(f1p); picture pic2; scale(pic2,Log,Linear); real Merr2(real x){return Merr(x,0.75);} draw(pic2,graph(pic2,Merr2,1e-4,1),black+1.2); ylimits(pic2,-60,20); yaxis(pic2,"magnitude (dB)",LeftRight,RightTicks(new real[] {-60,-40,-20,0,20})); xaxis(pic2,"$f/f_\mathrm{Ny}$",BottomTop,LeftTicks(N=5)); yequals(pic2,0,Dotted); yequals(pic2,-20,Dotted); yequals(pic2,-40,Dotted); xequals(pic2,1e-3,Dotted); xequals(pic2,1e-2,Dotted); xequals(pic2,1e-1,Dotted); size(pic2,100,100,point(pic2,SW),point(pic2,NE)); label(pic2,"$\theta=0.75$",point(pic2,N),2N); frame f2=pic2.fit(); f2=shift(max(f1).x-min(f2).x+margin)*f2; add(f2); picture pic2p; scale(pic2p,Log,Linear); real Aerr2(real x){return Aerr(x,0.75);} draw(pic2p,graph(pic2p,Aerr2,1e-4,1),black+1.2); ylimits(pic2p,-5,95); yaxis(pic2p,"phase (deg)",LeftRight,RightTicks(new real[] {0,50,90})); xaxis(pic2p,"$f/f_\mathrm{Ny}$",BottomTop,LeftTicks(N=5)); yequals(pic2p,0,Dotted); yequals(pic2p,45,Dotted); yequals(pic2p,90,Dotted); xequals(pic2p,1e-3,Dotted); xequals(pic2p,1e-2,Dotted); xequals(pic2p,1e-1,Dotted); size(pic2p,100,100,point(pic2p,SW),point(pic2p,NE)); frame f2p=pic2p.fit(); f2p=shift(max(f1p).x-min(f2p).x+margin,min(f2).y-max(f2p).y-margin)*f2p; add(f2p); asymptote-3.05/examples/label3solid.asy0000644000000000000000000000027315031566105016721 0ustar rootrootimport three; currentprojection=perspective(100,100,200,up=Y); draw(scale3(4)*extrude("$\displaystyle\int_{-\infty}^{+\infty} e^{-\alpha x^2}\,dx=\sqrt{\frac{\pi}{\alpha}}$",2Z),blue); asymptote-3.05/examples/sqrtx01y1.asy0000644000000000000000000000110315031566105016311 0ustar rootrootimport graph3; import solids; size(0,150); currentprojection=perspective(0,1,10,up=Y); currentlight=White; real f(real x) {return sqrt(x);} pair F(real x) {return (x,f(x));} triple F3(real x) {return (x,f(x),0);} path p=graph(F,0,1,n=25,operator ..); path3 p3=path3(p); revolution a=revolution(p3,Y,0,360); draw(surface(a),green,render(compression=Low,merge=true)); draw(p3,blue); xaxis3(Label("$x$",1),Arrow3); yaxis3(Label("$y$",1),ymax=1.5,dashed,Arrow3); dot(Label("$(1,1)$"),(1,1,0)); arrow("$y=\sqrt{x}$",F3(0.5),X,0.75cm,red); draw(arc(1.2Y,0.3,90,0,7.5,140),Arrow3); asymptote-3.05/examples/splitpatch.asy0000644000000000000000000000416415031566105016702 0ustar rootrootimport three; size(300); // A structure to subdivide two intersecting patches about their intersection. struct split { surface[] S={new surface}; surface[] T={new surface}; struct tree { tree[] tree=new tree[2]; } // Default subdivision depth. int n=20; // Subdivide p and q to depth n if they overlap. void write(tree pt, tree qt, triple[][] p, triple[][] q, int depth=n) { --depth; triple[][][] Split(triple[][] P, real u=0)=depth % 2 == 0 ? hsplit : vsplit; triple[][][] P=Split(p); triple[][][] Q=Split(q); for(int i=0; i < 2; ++i) { triple[][] Pi=P[i]; for(int j=0; j < 2; ++j) { triple[][] Qj=Q[j]; if(overlap(Pi,Qj)) { if(!pt.tree.initialized(i)) pt.tree[i]=new tree; if(!qt.tree.initialized(j)) qt.tree[j]=new tree; if(depth > 0) write(pt.tree[i],qt.tree[j],Pi,Qj,depth); } } } } // Output the subpatches of p from subdivision. void read(surface[] S, tree t, triple[][] p, int depth=n) { --depth; triple[][][] Split(triple[][] P, real u=0)=depth % 2 == 0 ? hsplit : vsplit; triple[][][] P=Split(p); for(int i=0; i < 2; ++i) { if(t.tree.initialized(i)) read(S,t.tree[i],P[i],depth); else { S[0].push(patch(P[i])); } } } void operator init(triple[][] p, triple[][] q, int depth=n) { tree ptrunk,qtrunk; write(ptrunk,qtrunk,p,q,depth); read(T,ptrunk,p,depth); read(S,qtrunk,q,depth); } } currentprojection=orthographic(0,0,1); triple[][] A= { {(0,0,0),(1,0,0),(1,0,0),(2,0,0)}, {(0,4/3,0),(2/3,4/3,2),(4/3,4/3,2),(2,4/3,0)}, {(0,2/3,0),(2/3,2/3,0),(4/3,2/3,0),(2,2/3,0)}, {(0,2,0),(2/3,2,0),(4/3,2,0),(2,2,0)} }; triple[][] B= { {(0.5,0,-1),(0.5,1,-1),(0.5,2,-1),(0.5,3,-1)}, {(0.5,0,0),(0.5,1,0),(0.5,2,0),(0.5,3,0)}, {(0.5,0,1),(0.5,1,1),(0.5,2,1),(0.5,3,1)}, {(0.5,0,2),(0.5,1,2),(0.5,2,2),(0.5,3,2)} }; split S=split(B,A); for(int i=0; i < S.S[0].s.length; ++i) draw(surface(S.S[0].s[i]),Pen(i)); for(int i=0; i < S.T[0].s.length; ++i) draw(surface(S.T[0].s[i]),Pen(i)); asymptote-3.05/examples/mosquito.asy0000644000000000000000000000471015031566105016404 0ustar rootrootsize(9cm,10cm,IgnoreAspect); pair d=(1,0.25); real s=1.6d.x; real y=0.6; defaultpen(fontsize(8pt)); picture box(string s, pair z=(0,0)) { picture pic; draw(pic,box(-d/2,d/2)); label(pic,s,(0,0)); return shift(z)*pic; } label("Birds",(0,y)); picture removed=box("Removed ($R_B$)"); picture infectious=box("Infectious ($I_B$)",(0,-1.5)); picture susceptible=box("Susceptible ($S_B$)",(0,-3)); add(removed); add(infectious); add(susceptible); label("Mosquitoes",(s,y)); picture larval=box("Larval ($L_M$)",(s,0)); picture susceptibleM=box("Susceptible ($S_M$)",(s,-1)); picture exposed=box("Exposed ($E_M$)",(s,-2)); picture infectiousM=box("Infectious ($I_M$)",(s,-3)); add(larval); add(susceptibleM); add(exposed); add(infectiousM); path ls=point(larval,S)--point(susceptibleM,N); path se=point(susceptibleM,S)--point(exposed,N); path ei=point(exposed,S)--point(infectiousM,N); path si=point(susceptible,N)--point(infectious,S); draw(minipage("\flushright{recovery rate ($g$) \& death rate from virus ($\mu_V$)}",40pt),point(infectious,N)--point(removed,S),LeftSide,Arrow, PenMargin); draw(si,LeftSide,Arrow,PenMargin); draw(minipage("\flushright{maturation rate ($m$)}",50pt),ls,RightSide, Arrow,PenMargin); draw(minipage("\flushright{viral incubation rate ($k$)}",40pt),ei, RightSide,Arrow,PenMargin); path ise=point(infectious,E)--point(se,0.5); draw("$(ac)$",ise,LeftSide,dashed,Arrow,PenMargin); label(minipage("\flushleft{biting rate $\times$ transmission probability}",50pt),point(infectious,SE),dir(-60)+S); path isi=point(infectiousM,W)--point(si,2.0/3); draw("$(ab)$",isi,LeftSide,dashed,Arrow,PenMargin); draw(se,LeftSide,Arrow,PenMargin); real t=2.0; draw("$\beta_M$", point(susceptibleM,E){right}..tension t..{left}point(larval,E), 2*(S+SE),red,Arrow(Fill,0.5)); draw(minipage("\flushleft{birth rate ($\beta_M$)}",20pt), point(exposed,E){right}..tension t..{left}point(larval,E),2SW,red, Arrow(Fill,0.5)); draw("$\beta_M$", point(infectiousM,E){right}..tension t..{left}point(larval,E),2SW, red,Arrow(Fill,0.5)); path arrow=(0,0)--0.75cm*dir(35); draw(point(larval,NNE), Label(minipage("\flushleft{larval death rate ($\mu_L$)}",45pt),1), arrow,blue,Arrow); draw(point(susceptibleM,NNE), Label(minipage("\flushleft{adult death rate ($\mu_A$)}",20pt),1), arrow,N,blue,Arrow); draw(point(exposed,NNE),Label("$\mu_A$",1),arrow,blue,Arrow); draw(point(infectiousM,NNE),Label("$\mu_A$",1),arrow,blue,Arrow); asymptote-3.05/examples/cosaddition.asy0000644000000000000000000000071415031566105017024 0ustar rootrootsize(0,200); import geometry; real A=130; real B=40; pair O=(0,0); pair R=(1,0); pair P=dir(A); pair Q=dir(B); draw(circle(O,1.0)); draw(Q--O--P); draw(P--Q,red); draw(O--Q--R--cycle); draw("$A$",arc(R,O,P,0.3),blue,Arrow,PenMargin); draw("$B$",arc(R,O,Q,0.6),blue,Arrow,PenMargin); pair S=(Cos(B),0); draw(Q--S,blue); perpendicular(S,NE,blue); dot(O); dot("$R=(1,0)$",R); dot("$P=(\cos A,\sin A)$",P,dir(O--P)+W); dot("$Q=(\cos B,\sin B)$",Q,dir(O--Q)); asymptote-3.05/examples/xsin1x.asy0000644000000000000000000000110415031566105015750 0ustar rootrootimport graph; size(300,0); real f(real x) {return (x != 0.0) ? x * sin(1.0 / x) : 0.0;} pair F(real x) {return (x,f(x));} xaxis("$x$",red); yaxis(red); draw(graph(f,-1.2/pi,1.2/pi,1000)); label("$x\sin\frac{1}{x}$",F(1.1/pi),NW); picture pic; size(pic,50,IgnoreAspect); xaxis(pic,red); yaxis(pic,red); draw(pic,graph(pic,f,-0.1/pi,0.1/pi,1000)); add(new void(frame f, transform t) { frame G=shift(point(f,N+0.85W))*align(bbox(pic,blue),10SE); add(f,G); draw(f,t*box(min(pic,user=true),max(pic,user=true)),blue); draw(f,point(G,E)--t*point(pic,W),blue); }); asymptote-3.05/examples/1overx.asy0000644000000000000000000000024315031566105015745 0ustar rootrootimport graph; size(200,IgnoreAspect); real f(real x) {return 1/x;} bool3 branch(real x) { return x != 0; } draw(graph(f,-1,1,branch)); axes("$x$","$y$",red); asymptote-3.05/examples/buildcycle.asy0000644000000000000000000000100115031566105016631 0ustar rootrootsize(200); real w=1.35; path[] p; for(int k=0; k < 2; ++k) { int i=2+2*k; int ii=i^2; p[k]=(w/ii,1){1,-ii}::(w/i,1/i)::(w,1/ii){ii,-1}; } path q0=(0,0)--(w,0.5); path q1=(0,0)--(w,1.5); draw(q0); draw(p[0]); draw(q1); draw(p[1]); path s=buildcycle(q0,p[0],q1,p[1]); fill(s,mediumgrey); label("$P$",intersectionpoint(p[0],q0),N); label("$Q$",intersectionpoint(p[0],q1),E); label("$R$",intersectionpoint(p[1],q1),W); label("$S$",intersectionpoint(p[1],q0),S); label("$f > 0$",0.5*(min(s)+max(s)),UnFill); asymptote-3.05/examples/curvedlabel.asy0000644000000000000000000000026115031566105017011 0ustar rootrootsize(200); import labelpath; labelpath("This is a test of curved labels in Asymptote (implemented with the {\tt PSTricks pstextpath} macro).",reverse(rotate(-90)*unitcircle)); asymptote-3.05/examples/condor.asy0000644000000000000000000000134315031566105016007 0ustar rootroot// Peter Luschny's Condor function // http://www.luschny.de/math/asy/ElCondorYElGamma.html import palette; import graph3; size(300,300,IgnoreAspect); currentprojection=orthographic(0,-1,0,center=true); currentlight=White; real K=7; triple condor(pair t) { real y=t.y; real x=t.x*y; real e=gamma(y+1); real ymx=y-x; real ypx=y+x; real a=gamma((ymx+1)/2); real b=gamma((ymx+2)/2); real c=gamma((ypx+1)/2); real d=gamma((ypx+2)/2); real A=cos(pi*ymx); real B=cos(pi*ypx); return (x,y,log(e)+log(a)*((A-1)/2)+log(b)*((-A-1)/2)+log(c)*((B-1)/2)+ log(d)*((-B-1)/2)); } surface s=surface(condor,(-1,0),(1,K),16,Spline); s.colors(palette(s.map(zpart),Rainbow())); draw(s,render(compression=Low,merge=true)); asymptote-3.05/examples/functionshading.asy0000644000000000000000000000224115031566105017704 0ustar rootrootsize(200); settings.tex="pdflatex"; // PostScript Calculator routine to convert from [0,1]x[0,1] to RG: string redgreen="0"; // PostScript Calculator routine to convert from [0,1]x[0,1] to HS to RGB: // (http://www.texample.net/tikz/examples/hsv-shading): string hsv="0.5 sub exch 0.5 sub exch 2 copy 2 copy 0 eq exch 0 eq and { pop pop 0.0 } {atan 360.0 div} ifelse dup 360 eq { pop 0.0 }{} ifelse 3 1 roll dup mul exch dup mul add sqrt 2.5 mul 0.25 sub 1 1 index 1.0 eq { 3 1 roll pop pop dup dup } { 3 -1 roll 6.0 mul dup 4 1 roll floor dup 5 1 roll 3 index sub neg 1.0 3 index sub 2 index mul 6 1 roll dup 3 index mul neg 1.0 add 2 index mul 7 1 roll neg 1.0 add 2 index mul neg 1.0 add 1 index mul 7 2 roll pop pop dup 0 eq { pop exch pop } { dup 1 eq { pop exch 4 1 roll exch pop } { dup 2 eq { pop 4 1 roll pop } { dup 3 eq { pop exch 4 2 roll pop } { dup 4 eq { pop exch pop 3 -1 roll } { pop 3 1 roll exch pop } ifelse } ifelse } ifelse } ifelse } ifelse } ifelse cvr 3 1 roll cvr 3 1 roll cvr 3 1 roll"; path p=unitcircle; functionshade(p,rgb(zerowinding),redgreen); layer(); draw(p); path g=shift(2*dir(-45))*p; functionshade(g,rgb(zerowinding),hsv); layer(); draw(g); asymptote-3.05/examples/lever.asy0000644000000000000000000000071415031566105015641 0ustar rootrootsize(200,0); pair z0=(0,0); pair z1=(2,0); pair z2=(5,0); pair zf=z1+0.75*(z2-z1); draw(z1--z2); dot(z1,red+0.15cm); dot(z2,darkgreen+0.3cm); label("$m$",z1,1.2N,red); label("$M$",z2,1.5N,darkgreen); label("$\hat{\ }$",zf,0.2*S,fontsize(24pt)+blue); pair s=-0.2*I; draw("$x$",z0+s--z1+s,N,red,Arrows,Bars,PenMargins); s=-0.5*I; draw("$\bar{x}$",z0+s--zf+s,blue,Arrows,Bars,PenMargins); s=-0.95*I; draw("$X$",z0+s--z2+s,darkgreen,Arrows,Bars,PenMargins); asymptote-3.05/examples/roundpath.asy0000644000000000000000000000243515031566105016532 0ustar rootroot// example file for 'roundedpath.asy' // written by stefan knorr // import needed packages import roundedpath; // define open and closed path path A = (0,0)--(10,10)--(30,10)--(20,0)--(30,-10)--(10,-10); path B = A--cycle; draw(shift(-60,0)*A, green); draw(shift(-30,0)*roundedpath(A,1), red); // draw open path and some modifications for (int i = 1; i < 20; ++i) draw(roundedpath(A,i/4), rgb(1 - i*0.049, 0, i*0.049) + linewidth(0.5)); draw(shift(-60,-30)*B, green); draw(shift(-30,-30)*roundedpath(B,1), red); //draw closed path and some modifications for (int i = 1; i < 20; ++i) // only round edges draw(shift(0,-30)*roundedpath(B,i/4), rgb(0.5, i*0.049,0) + linewidth(0.5)); for (int i = 1; i < 20; ++i) // round edged and scale draw(shift(0,-60)*roundedpath(B,i/4,1-i/50), rgb(1, 1 - i*0.049,i*0.049) + linewidth(0.5)); for (int i = 1; i < 50; ++i) // shift (round edged und scaled shifted version) draw(shift(-30,-60)*shift(10,0)*roundedpath(shift(-10,0)*B,i/10,1-i/80), rgb( i*0.024, 1 - i*0.024,0) + linewidth(0.5)); for (int i = 1; i < 20; ++i) // shift (round edged und scaled shifted version) draw(shift(-60,-60)*shift(10,0)*roundedpath(shift(-10,0)*B,i/4,1-i/50), gray(i/40)); asymptote-3.05/examples/spheresilhouette.asy0000644000000000000000000000022615031566105020116 0ustar rootrootimport solids; settings.render=0; settings.prc=false; size(200); revolution r=sphere(O,1); draw(r,1,longitudinalpen=nullpen); draw(r.silhouette()); asymptote-3.05/examples/vectorfieldsphere.asy0000644000000000000000000000053715031566105020244 0ustar rootrootimport graph3; size(12cm); currentprojection=orthographic(1,-2,1); currentlight=(1,-1,0.5); triple f(pair z) {return expi(z.x,z.y);} path3 vector(pair z) { triple v=f(z); return O--(v.y,v.z,v.x); } add(vectorfield(vector,f,(0,0),(pi,2pi),10,0.25,red,render(merge=true))); draw(unitsphere,gray+opacity(0.5),render(compression=0,merge=true)); asymptote-3.05/examples/billboard.asy0000644000000000000000000000023215031566105016451 0ustar rootrootimport three; size(100); currentprojection=perspective(1,-2,1); draw(unitbox); label("Billboard",X,red,Billboard); label("Embedded",Y,blue,Embedded); asymptote-3.05/examples/RiemannSurface.asy0000644000000000000000000000053615031566105017430 0ustar rootrootimport graph3; import palette; size(200,300,keepAspect=false); //settings.nothin=true; currentprojection=orthographic(dir(70,60)); currentlight=(10,10,5); triple f(pair t) {return (exp(t.x)*cos(t.y),exp(t.x)*sin(t.y),t.y);} surface s=surface(f,(-4,-2pi),(0,4pi),8,16,Spline); s.colors(palette(s.map(zpart),Rainbow())); draw(s,render(merge=true)); asymptote-3.05/examples/transparentCubes.asy0000644000000000000000000000037215031566105020047 0ustar rootrootimport three; size(100,100); currentprojection=perspective(10,7,40); int N=4; real f=1+1/N; for(int k=0; k < N; ++k) { for(int m=0; m < N; ++m) { for(int n=0; n < N; ++n) { draw(shift((n,m,k)*f)*unitcube,red+opacity(0.5)); } } } asymptote-3.05/examples/Viviani.asy0000644000000000000000000000131215031566105016124 0ustar rootrootimport graph3; size(300); pen yellow=rgb("F1FA8C"); pen purple=rgb("BB95FF"); pen blue=rgb("7A8FFE"); pen darkblack=rgb("101010"); currentprojection=orthographic(3,3,1,up=Z); currentlight=light((1,0,1),(-1.5,0,-1)); currentlight.background=darkblack; real aS=2.5; draw(Label("$x$",EndPoint),-aS*X--aS*X,white,Arrow3); draw(Label("$y$",EndPoint),-aS*Y--aS*Y,white,Arrow3); draw(Label("$z$",EndPoint),-aS*Z--aS*Z,white,Arrow3); draw(shift(0.5,0,-2)*scale(0.5,0.5,4)*unitcylinder, material(blue+opacity(0.8),shininess=0.3)); draw(unitsphere,material(purple,shininess=0.3)); triple f(real t) {return(cos(t)^2,cos(t)*sin(t),sin(t));} path3 curve=graph(f,0,8pi,operator ..); draw(curve,yellow+linewidth(1)); asymptote-3.05/examples/RiemannSurfaceRoot.asy0000644000000000000000000000060215031566105020266 0ustar rootroot// Riemann surface of z^{1/n} import graph3; import palette; int n=3; size(200,300,keepAspect=false); currentprojection=orthographic(dir(60,60)); currentlight=(10,10,5); triple f(pair t) {return (t.x*cos(t.y),t.x*sin(t.y),t.x^(1/n)*sin(t.y/n));} surface s=surface(f,(0,0),(1,2pi*n),8,16,Spline); s.colors(palette(s.map(zpart),Rainbow())); draw(s,meshpen=black,render(merge=true)); asymptote-3.05/examples/100d.pdb10000644000000000000000000012450715031566105015231 0ustar rootrootHEADER DNA/RNA 05-DEC-94 XXXX TITLE CRYSTAL STRUCTURE OF THE HIGHLY DISTORTED CHIMERIC DECAMER TITLE 2 R(C)D(CGGCGCCG)R(G)-SPERMINE COMPLEX-SPERMINE BINDING TO TITLE 3 PHOSPHATE ONLY AND MINOR GROOVE TERTIARY BASE-PAIRING COMPND 5'-R(*CP*)-D(*CP*GP*GP*CP*GP*CP*CP*GP*)-R(*G)-3' KEYWDS A-DNA/RNA, DOUBLE HELIX EXPDTA X-RAY DIFFRACTION AUTHOR C.BAN, B.RAMAKRISHNAN, M.SUNDARALINGAM JRNL AUTH C.BAN, B.RAMAKRISHNAN, M.SUNDARALINGAM JRNL TITL CRYSTAL STRUCTURE OF THE HIGHLY DISTORTED CHIMERIC JRNL TITL 2 DECAMER R(C)D(CGGCGCCG)R(G).SPERMINE JRNL TITL 3 COMPLEX--SPERMINE BINDING TO PHOSPHATE ONLY AND JRNL TITL 4 MINOR GROOVE TERTIARY BASE-PAIRING. JRNL REF NUCLEIC ACIDS RES. V. 22 5466 1994 JRNL REFN ASTM NARHAD UK ISSN 0305-1048 REMARK 1 SEQRES 1 A 10 C DC DG DG DC DG DC DC DG G SEQRES 1 B 10 C DC DG DG DC DG DC DC DG G HETNAM SPM SPERMINE FORMUL 3 SPM C10 H26 N4 FORMUL 4 HOH *67(H2 O) CRYST1 23.980 40.770 44.840 90.00 90.00 90.00 P 21 21 21 8 ORIGX1 1.000000 0.000000 0.000000 0.00000 ORIGX2 0.000000 1.000000 0.000000 0.00000 ORIGX3 0.000000 0.000000 1.000000 0.00000 SCALE1 0.041701 0.000000 0.000000 0.00000 SCALE2 0.000000 0.024528 0.000000 0.00000 SCALE3 0.000000 0.000000 0.022302 0.00000 ATOM 1 N1 C A 1 -4.931 6.902 7.826 1.00 19.25 N ATOM 2 C2 C A 1 -4.838 7.263 9.158 1.00 16.72 C ATOM 3 O2 C A 1 -4.287 8.308 9.505 1.00 15.49 O ATOM 4 N3 C A 1 -5.367 6.448 10.085 1.00 15.96 N ATOM 5 C4 C A 1 -5.978 5.310 9.736 1.00 16.84 C ATOM 6 N4 C A 1 -6.592 4.588 10.676 1.00 19.14 N ATOM 7 C5 C A 1 -6.059 4.907 8.376 1.00 17.68 C ATOM 8 C6 C A 1 -5.522 5.732 7.461 1.00 17.68 C ATOM 9 O5' C A 1 -4.549 5.095 4.262 1.00 28.71 O ATOM 10 C5' C A 1 -4.176 6.323 3.646 1.00 27.35 C ATOM 11 C4' C A 1 -3.853 7.410 4.672 1.00 24.41 C ATOM 12 O4' C A 1 -4.992 7.650 5.512 1.00 22.53 O ATOM 13 C3' C A 1 -2.713 7.010 5.605 1.00 23.56 C ATOM 14 O3' C A 1 -1.379 7.127 5.060 1.00 21.02 O ATOM 15 C2' C A 1 -2.950 7.949 6.756 1.00 23.73 C ATOM 16 O2' C A 1 -2.407 9.267 6.554 1.00 23.93 O ATOM 17 C1' C A 1 -4.489 7.917 6.825 1.00 20.60 C ATOM 18 P DC A 2 -0.178 6.220 5.647 1.00 24.85 P ATOM 19 N1 DC A 2 -1.070 6.635 10.823 1.00 14.48 N ATOM 20 C2 DC A 2 -1.417 6.355 12.130 1.00 13.03 C ATOM 21 O2 DC A 2 -1.007 7.022 13.094 1.00 11.15 O ATOM 22 N3 DC A 2 -2.233 5.297 12.333 1.00 11.95 N ATOM 23 C4 DC A 2 -2.681 4.542 11.344 1.00 11.37 C ATOM 24 N4 DC A 2 -3.532 3.569 11.652 1.00 11.93 N ATOM 25 C5 DC A 2 -2.314 4.796 9.986 1.00 11.95 C ATOM 26 C6 DC A 2 -1.510 5.853 9.776 1.00 11.94 C ATOM 27 OP1 DC A 2 0.915 6.451 4.671 1.00 25.96 O ATOM 28 OP2 DC A 2 -0.948 4.954 5.664 1.00 24.57 O ATOM 29 O5' DC A 2 0.435 6.502 7.097 1.00 24.10 O ATOM 30 C5' DC A 2 1.020 7.793 7.281 1.00 19.66 C ATOM 31 C4' DC A 2 1.034 8.184 8.738 1.00 17.99 C ATOM 32 O4' DC A 2 -0.290 8.244 9.222 1.00 17.23 O ATOM 33 C3' DC A 2 1.724 7.167 9.617 1.00 18.98 C ATOM 34 O3' DC A 2 3.130 7.395 9.564 1.00 18.39 O ATOM 35 C2' DC A 2 1.152 7.607 10.934 1.00 17.33 C ATOM 36 C1' DC A 2 -0.273 7.853 10.599 1.00 15.44 C ATOM 37 P DG A 3 4.177 6.440 10.285 1.00 21.10 P ATOM 38 N9 DG A 3 1.615 4.437 14.168 1.00 11.63 N ATOM 39 C8 DG A 3 1.389 4.110 12.865 1.00 10.83 C ATOM 40 N7 DG A 3 0.474 3.204 12.690 1.00 12.03 N ATOM 41 C5 DG A 3 0.093 2.891 13.972 1.00 9.28 C ATOM 42 C6 DG A 3 -0.792 1.917 14.408 1.00 6.67 C ATOM 43 O6 DG A 3 -1.528 1.253 13.693 1.00 11.90 O ATOM 44 N1 DG A 3 -0.833 1.822 15.808 1.00 7.48 N ATOM 45 C2 DG A 3 -0.098 2.583 16.686 1.00 7.12 C ATOM 46 N2 DG A 3 -0.228 2.346 17.999 1.00 2.92 N ATOM 47 N3 DG A 3 0.745 3.531 16.259 1.00 7.08 N ATOM 48 C4 DG A 3 0.788 3.626 14.894 1.00 12.36 C ATOM 49 OP1 DG A 3 5.469 7.004 9.830 1.00 21.52 O ATOM 50 OP2 DG A 3 3.681 5.183 9.686 1.00 14.50 O ATOM 51 O5' DG A 3 4.378 6.142 11.832 1.00 19.95 O ATOM 52 C5' DG A 3 4.654 7.213 12.730 1.00 17.61 C ATOM 53 C4' DG A 3 4.016 6.885 14.035 1.00 17.62 C ATOM 54 O4' DG A 3 2.614 6.626 13.799 1.00 16.77 O ATOM 55 C3' DG A 3 4.595 5.586 14.598 1.00 16.31 C ATOM 56 O3' DG A 3 5.774 5.836 15.353 1.00 18.86 O ATOM 57 C2' DG A 3 3.484 5.274 15.528 1.00 17.71 C ATOM 58 C1' DG A 3 2.243 5.627 14.740 1.00 16.27 C ATOM 59 P DG A 4 6.647 4.633 15.976 1.00 19.10 P ATOM 60 N9 DG A 4 3.496 1.232 18.319 1.00 11.82 N ATOM 61 C8 DG A 4 3.617 1.742 17.054 1.00 8.09 C ATOM 62 N7 DG A 4 2.902 1.118 16.167 1.00 11.07 N ATOM 63 C5 DG A 4 2.252 0.091 16.894 1.00 11.16 C ATOM 64 C6 DG A 4 1.310 -0.920 16.456 1.00 9.75 C ATOM 65 O6 DG A 4 0.888 -1.151 15.321 1.00 9.97 O ATOM 66 N1 DG A 4 0.906 -1.749 17.502 1.00 8.27 N ATOM 67 C2 DG A 4 1.340 -1.630 18.818 1.00 8.31 C ATOM 68 N2 DG A 4 0.852 -2.494 19.717 1.00 6.42 N ATOM 69 N3 DG A 4 2.218 -0.681 19.223 1.00 9.10 N ATOM 70 C4 DG A 4 2.629 0.144 18.209 1.00 10.34 C ATOM 71 OP1 DG A 4 7.834 5.387 16.410 1.00 21.78 O ATOM 72 OP2 DG A 4 6.811 3.466 15.083 1.00 20.41 O ATOM 73 O5' DG A 4 5.837 4.160 17.304 1.00 19.69 O ATOM 74 C5' DG A 4 5.832 4.777 18.613 1.00 14.70 C ATOM 75 C4' DG A 4 5.349 3.746 19.615 1.00 15.74 C ATOM 76 O4' DG A 4 4.014 3.339 19.320 1.00 15.71 O ATOM 77 C3' DG A 4 6.144 2.446 19.549 1.00 14.86 C ATOM 78 O3' DG A 4 7.442 2.553 20.185 1.00 20.22 O ATOM 79 C2' DG A 4 5.194 1.467 20.191 1.00 13.42 C ATOM 80 C1' DG A 4 3.886 1.904 19.582 1.00 13.10 C ATOM 81 P DC A 5 8.623 1.481 19.918 1.00 16.11 P ATOM 82 N1 DC A 5 5.142 -2.576 17.527 1.00 12.08 N ATOM 83 C2 DC A 5 4.179 -3.389 16.962 1.00 12.60 C ATOM 84 O2 DC A 5 3.695 -4.327 17.591 1.00 10.69 O ATOM 85 N3 DC A 5 3.792 -3.162 15.680 1.00 10.73 N ATOM 86 C4 DC A 5 4.335 -2.176 14.967 1.00 10.86 C ATOM 87 N4 DC A 5 3.833 -1.904 13.765 1.00 7.57 N ATOM 88 C5 DC A 5 5.346 -1.339 15.528 1.00 12.31 C ATOM 89 C6 DC A 5 5.709 -1.571 16.800 1.00 10.26 C ATOM 90 OP1 DC A 5 9.474 2.225 20.879 1.00 21.84 O ATOM 91 OP2 DC A 5 8.908 1.639 18.468 1.00 19.79 O ATOM 92 O5' DC A 5 8.728 -0.072 20.325 1.00 19.47 O ATOM 93 C5' DC A 5 8.554 -1.158 19.407 1.00 15.29 C ATOM 94 C4' DC A 5 7.470 -2.178 19.802 1.00 12.49 C ATOM 95 O4' DC A 5 6.161 -1.717 19.496 1.00 12.55 O ATOM 96 C3' DC A 5 7.697 -3.468 19.046 1.00 11.96 C ATOM 97 O3' DC A 5 8.775 -4.194 19.666 1.00 14.17 O ATOM 98 C2' DC A 5 6.342 -4.056 19.192 1.00 10.58 C ATOM 99 C1' DC A 5 5.464 -2.822 18.946 1.00 10.97 C ATOM 100 P DG A 6 9.797 -5.058 18.800 1.00 14.87 P ATOM 101 N9 DG A 6 5.801 -7.550 16.290 1.00 13.78 N ATOM 102 C8 DG A 6 6.477 -6.339 16.189 1.00 11.32 C ATOM 103 N7 DG A 6 6.114 -5.628 15.161 1.00 11.53 N ATOM 104 C5 DG A 6 5.137 -6.431 14.528 1.00 15.14 C ATOM 105 C6 DG A 6 4.442 -6.239 13.291 1.00 14.51 C ATOM 106 O6 DG A 6 4.382 -5.224 12.595 1.00 15.52 O ATOM 107 N1 DG A 6 3.678 -7.348 12.942 1.00 15.78 N ATOM 108 C2 DG A 6 3.558 -8.503 13.679 1.00 16.04 C ATOM 109 N2 DG A 6 2.732 -9.421 13.210 1.00 15.11 N ATOM 110 N3 DG A 6 4.187 -8.691 14.842 1.00 14.81 N ATOM 111 C4 DG A 6 4.959 -7.617 15.206 1.00 13.90 C ATOM 112 OP1 DG A 6 10.851 -5.532 19.718 1.00 14.32 O ATOM 113 OP2 DG A 6 10.144 -4.575 17.432 1.00 10.67 O ATOM 114 O5' DG A 6 8.762 -6.277 18.626 1.00 15.18 O ATOM 115 C5' DG A 6 8.679 -7.438 19.428 1.00 15.40 C ATOM 116 C4' DG A 6 7.717 -8.446 18.789 1.00 15.34 C ATOM 117 O4' DG A 6 6.431 -7.834 18.520 1.00 16.46 O ATOM 118 C3' DG A 6 8.150 -9.052 17.449 1.00 16.54 C ATOM 119 O3' DG A 6 9.172 -10.043 17.595 1.00 18.58 O ATOM 120 C2' DG A 6 6.796 -9.650 17.066 1.00 17.79 C ATOM 121 C1' DG A 6 5.804 -8.517 17.397 1.00 13.96 C ATOM 122 P DC A 7 10.498 -10.100 16.665 1.00 17.81 P ATOM 123 N1 DC A 7 7.217 -9.334 12.285 1.00 7.65 N ATOM 124 C2 DC A 7 6.458 -8.793 11.230 1.00 10.22 C ATOM 125 O2 DC A 7 5.771 -9.507 10.500 1.00 15.05 O ATOM 126 N3 DC A 7 6.567 -7.461 10.942 1.00 6.65 N ATOM 127 C4 DC A 7 7.403 -6.694 11.658 1.00 5.07 C ATOM 128 N4 DC A 7 7.447 -5.391 11.420 1.00 4.65 N ATOM 129 C5 DC A 7 8.188 -7.242 12.730 1.00 4.20 C ATOM 130 C6 DC A 7 8.053 -8.558 13.000 1.00 6.45 C ATOM 131 OP1 DC A 7 11.307 -11.102 17.394 1.00 17.82 O ATOM 132 OP2 DC A 7 11.084 -8.759 16.374 1.00 20.08 O ATOM 133 O5' DC A 7 9.986 -10.722 15.264 1.00 17.30 O ATOM 134 C5' DC A 7 9.312 -11.986 15.170 1.00 16.36 C ATOM 135 C4' DC A 7 8.436 -12.095 13.916 1.00 15.85 C ATOM 136 O4' DC A 7 7.361 -11.148 13.955 1.00 16.34 O ATOM 137 C3' DC A 7 9.165 -11.823 12.595 1.00 14.83 C ATOM 138 O3' DC A 7 10.003 -12.907 12.161 1.00 16.25 O ATOM 139 C2' DC A 7 7.973 -11.600 11.717 1.00 11.20 C ATOM 140 C1' DC A 7 7.076 -10.772 12.582 1.00 10.61 C ATOM 141 P DC A 8 11.175 -12.651 11.083 1.00 18.77 P ATOM 142 N1 DC A 8 8.297 -9.310 7.883 1.00 6.87 N ATOM 143 C2 DC A 8 7.867 -8.224 7.123 1.00 9.10 C ATOM 144 O2 DC A 8 7.226 -8.387 6.080 1.00 7.86 O ATOM 145 N3 DC A 8 8.296 -6.966 7.459 1.00 7.75 N ATOM 146 C4 DC A 8 9.147 -6.784 8.485 1.00 9.21 C ATOM 147 N4 DC A 8 9.589 -5.560 8.779 1.00 7.67 N ATOM 148 C5 DC A 8 9.609 -7.891 9.258 1.00 7.40 C ATOM 149 C6 DC A 8 9.156 -9.121 8.923 1.00 9.24 C ATOM 150 OP1 DC A 8 11.871 -13.952 10.908 1.00 20.04 O ATOM 151 OP2 DC A 8 12.020 -11.472 11.376 1.00 20.24 O ATOM 152 O5' DC A 8 10.469 -12.357 9.649 1.00 18.79 O ATOM 153 C5' DC A 8 9.733 -13.334 8.924 1.00 12.85 C ATOM 154 C4' DC A 8 8.867 -12.647 7.941 1.00 14.40 C ATOM 155 O4' DC A 8 8.156 -11.587 8.589 1.00 10.91 O ATOM 156 C3' DC A 8 9.598 -11.936 6.845 1.00 14.90 C ATOM 157 O3' DC A 8 10.249 -12.831 5.936 1.00 15.23 O ATOM 158 C2' DC A 8 8.377 -11.232 6.304 1.00 9.34 C ATOM 159 C1' DC A 8 7.789 -10.648 7.568 1.00 8.80 C ATOM 160 P DG A 9 11.518 -12.329 5.128 1.00 14.64 P ATOM 161 N9 DG A 9 9.338 -8.006 2.891 1.00 5.76 N ATOM 162 C8 DG A 9 10.079 -8.162 4.036 1.00 7.27 C ATOM 163 N7 DG A 9 10.578 -7.077 4.541 1.00 5.05 N ATOM 164 C5 DG A 9 10.143 -6.100 3.664 1.00 6.30 C ATOM 165 C6 DG A 9 10.387 -4.694 3.690 1.00 6.32 C ATOM 166 O6 DG A 9 10.988 -4.056 4.538 1.00 8.77 O ATOM 167 N1 DG A 9 9.805 -4.022 2.632 1.00 5.02 N ATOM 168 C2 DG A 9 9.072 -4.651 1.658 1.00 7.22 C ATOM 169 N2 DG A 9 8.590 -3.921 0.680 1.00 5.13 N ATOM 170 N3 DG A 9 8.837 -5.970 1.631 1.00 8.90 N ATOM 171 C4 DG A 9 9.395 -6.649 2.656 1.00 5.39 C ATOM 172 OP1 DG A 9 11.889 -13.707 4.763 1.00 17.77 O ATOM 173 OP2 DG A 9 12.558 -11.435 5.714 1.00 16.33 O ATOM 174 O5' DG A 9 10.890 -11.645 3.793 1.00 13.73 O ATOM 175 C5' DG A 9 10.098 -12.334 2.826 1.00 10.04 C ATOM 176 C4' DG A 9 9.322 -11.365 2.036 1.00 8.60 C ATOM 177 O4' DG A 9 8.636 -10.420 2.864 1.00 9.95 O ATOM 178 C3' DG A 9 10.183 -10.481 1.201 1.00 11.49 C ATOM 179 O3' DG A 9 10.786 -11.138 0.073 1.00 12.29 O ATOM 180 C2' DG A 9 9.103 -9.503 0.858 1.00 7.88 C ATOM 181 C1' DG A 9 8.570 -9.111 2.181 1.00 8.58 C ATOM 182 P G A 10 12.244 -10.723 -0.414 1.00 18.00 P ATOM 183 N9 G A 10 11.582 -5.303 -1.017 1.00 15.40 N ATOM 184 C8 G A 10 12.179 -6.115 -0.061 1.00 15.00 C ATOM 185 N7 G A 10 12.826 -5.480 0.870 1.00 12.61 N ATOM 186 C5 G A 10 12.635 -4.148 0.522 1.00 13.15 C ATOM 187 C6 G A 10 13.133 -2.991 1.159 1.00 11.89 C ATOM 188 O6 G A 10 13.713 -2.965 2.241 1.00 12.64 O ATOM 189 N1 G A 10 12.806 -1.814 0.462 1.00 9.10 N ATOM 190 C2 G A 10 12.079 -1.777 -0.689 1.00 10.96 C ATOM 191 N2 G A 10 11.851 -0.582 -1.197 1.00 11.87 N ATOM 192 N3 G A 10 11.588 -2.874 -1.294 1.00 12.41 N ATOM 193 C4 G A 10 11.899 -4.020 -0.633 1.00 13.44 C ATOM 194 OP1 G A 10 12.221 -11.870 -1.354 1.00 19.65 O ATOM 195 OP2 G A 10 13.525 -10.237 0.168 1.00 21.55 O ATOM 196 O5' G A 10 11.507 -9.424 -1.092 1.00 18.23 O ATOM 197 C5' G A 10 10.721 -9.357 -2.288 1.00 18.20 C ATOM 198 C4' G A 10 10.589 -7.934 -2.878 1.00 17.37 C ATOM 199 O4' G A 10 10.102 -6.968 -1.936 1.00 15.12 O ATOM 200 C3' G A 10 11.859 -7.317 -3.471 1.00 17.88 C ATOM 201 O3' G A 10 12.164 -7.754 -4.846 1.00 16.65 O ATOM 202 C2' G A 10 11.470 -5.841 -3.464 1.00 16.83 C ATOM 203 O2' G A 10 10.607 -5.618 -4.583 1.00 18.75 O ATOM 204 C1' G A 10 10.721 -5.691 -2.168 1.00 15.79 C TER 205 G A 10 ATOM 206 N1 C B 11 13.988 2.735 1.589 1.00 16.99 N ATOM 207 C2 C B 11 13.552 1.541 1.023 1.00 15.65 C ATOM 208 O2 C B 11 12.869 1.532 0.006 1.00 14.94 O ATOM 209 N3 C B 11 13.773 0.359 1.678 1.00 16.15 N ATOM 210 C4 C B 11 14.386 0.347 2.865 1.00 16.53 C ATOM 211 N4 C B 11 14.619 -0.822 3.476 1.00 18.43 N ATOM 212 C5 C B 11 14.816 1.571 3.473 1.00 16.78 C ATOM 213 C6 C B 11 14.597 2.724 2.804 1.00 15.01 C ATOM 214 O5' C B 11 14.526 5.793 4.007 1.00 18.48 O ATOM 215 C5' C B 11 14.531 6.777 2.948 1.00 17.64 C ATOM 216 C4' C B 11 14.028 6.161 1.616 1.00 17.23 C ATOM 217 O4' C B 11 14.808 4.991 1.256 1.00 16.55 O ATOM 218 C3' C B 11 12.611 5.611 1.737 1.00 17.97 C ATOM 219 O3' C B 11 11.508 6.538 1.711 1.00 18.76 O ATOM 220 C2' C B 11 12.546 4.594 0.654 1.00 14.10 C ATOM 221 O2' C B 11 12.366 5.290 -0.579 1.00 13.63 O ATOM 222 C1' C B 11 13.918 3.977 0.766 1.00 14.14 C ATOM 223 P DC B 12 10.233 6.143 2.644 1.00 21.42 P ATOM 224 N1 DC B 12 9.527 0.825 1.326 1.00 15.29 N ATOM 225 C2 DC B 12 9.472 -0.563 1.382 1.00 14.49 C ATOM 226 O2 DC B 12 8.922 -1.257 0.518 1.00 17.30 O ATOM 227 N3 DC B 12 10.055 -1.190 2.418 1.00 11.60 N ATOM 228 C4 DC B 12 10.676 -0.500 3.383 1.00 15.58 C ATOM 229 N4 DC B 12 11.164 -1.186 4.430 1.00 14.28 N ATOM 230 C5 DC B 12 10.760 0.927 3.341 1.00 15.60 C ATOM 231 C6 DC B 12 10.166 1.544 2.298 1.00 15.73 C ATOM 232 OP1 DC B 12 9.634 7.406 2.139 1.00 21.29 O ATOM 233 OP2 DC B 12 10.077 5.869 4.079 1.00 22.13 O ATOM 234 O5' DC B 12 9.636 4.841 1.804 1.00 20.84 O ATOM 235 C5' DC B 12 8.999 5.040 0.519 1.00 19.83 C ATOM 236 C4' DC B 12 8.512 3.757 -0.108 1.00 18.55 C ATOM 237 O4' DC B 12 9.529 2.733 -0.171 1.00 19.79 O ATOM 238 C3' DC B 12 7.498 3.211 0.801 1.00 18.00 C ATOM 239 O3' DC B 12 6.305 3.969 0.629 1.00 19.14 O ATOM 240 C2' DC B 12 7.475 1.788 0.344 1.00 15.87 C ATOM 241 C1' DC B 12 8.913 1.473 0.156 1.00 15.45 C ATOM 242 P DG B 13 4.970 3.543 1.371 1.00 21.52 P ATOM 243 N9 DG B 13 6.185 -2.069 3.050 1.00 9.23 N ATOM 244 C8 DG B 13 6.745 -1.032 3.745 1.00 8.94 C ATOM 245 N7 DG B 13 7.370 -1.389 4.833 1.00 7.30 N ATOM 246 C5 DG B 13 7.209 -2.767 4.877 1.00 8.43 C ATOM 247 C6 DG B 13 7.692 -3.719 5.823 1.00 9.75 C ATOM 248 O6 DG B 13 8.258 -3.536 6.903 1.00 14.29 O ATOM 249 N1 DG B 13 7.361 -5.014 5.443 1.00 5.73 N ATOM 250 C2 DG B 13 6.655 -5.359 4.323 1.00 2.65 C ATOM 251 N2 DG B 13 6.506 -6.654 4.079 1.00 2.15 N ATOM 252 N3 DG B 13 6.190 -4.477 3.470 1.00 2.55 N ATOM 253 C4 DG B 13 6.497 -3.198 3.793 1.00 6.08 C ATOM 254 OP1 DG B 13 4.172 4.637 0.743 1.00 22.41 O ATOM 255 OP2 DG B 13 5.322 3.646 2.816 1.00 21.67 O ATOM 256 O5' DG B 13 4.263 2.118 1.102 1.00 18.28 O ATOM 257 C5' DG B 13 3.977 1.214 2.153 1.00 12.90 C ATOM 258 C4' DG B 13 3.997 -0.166 1.554 1.00 15.74 C ATOM 259 O4' DG B 13 5.326 -0.638 1.288 1.00 15.41 O ATOM 260 C3' DG B 13 3.328 -1.110 2.479 1.00 14.99 C ATOM 261 O3' DG B 13 1.948 -0.901 2.181 1.00 18.56 O ATOM 262 C2' DG B 13 3.943 -2.416 1.990 1.00 14.49 C ATOM 263 C1' DG B 13 5.414 -2.020 1.777 1.00 12.61 C ATOM 264 P DG B 14 0.784 -1.093 3.255 1.00 15.78 P ATOM 265 N9 DG B 14 3.152 -5.336 5.518 1.00 6.83 N ATOM 266 C8 DG B 14 3.420 -4.010 5.692 1.00 4.36 C ATOM 267 N7 DG B 14 4.172 -3.751 6.719 1.00 5.76 N ATOM 268 C5 DG B 14 4.412 -5.012 7.281 1.00 8.36 C ATOM 269 C6 DG B 14 5.175 -5.383 8.425 1.00 10.81 C ATOM 270 O6 DG B 14 5.939 -4.687 9.102 1.00 10.46 O ATOM 271 N1 DG B 14 5.100 -6.738 8.655 1.00 7.70 N ATOM 272 C2 DG B 14 4.415 -7.650 7.890 1.00 6.88 C ATOM 273 N2 DG B 14 4.444 -8.925 8.254 1.00 4.21 N ATOM 274 N3 DG B 14 3.730 -7.316 6.805 1.00 7.97 N ATOM 275 C4 DG B 14 3.774 -5.982 6.566 1.00 7.79 C ATOM 276 OP1 DG B 14 -0.388 -0.771 2.418 1.00 12.44 O ATOM 277 OP2 DG B 14 0.951 -0.425 4.562 1.00 16.99 O ATOM 278 O5' DG B 14 0.825 -2.666 3.590 1.00 12.34 O ATOM 279 C5' DG B 14 0.518 -3.657 2.618 1.00 15.26 C ATOM 280 C4' DG B 14 0.962 -5.042 3.026 1.00 11.81 C ATOM 281 O4' DG B 14 2.388 -5.092 3.261 1.00 14.56 O ATOM 282 C3' DG B 14 0.298 -5.494 4.281 1.00 10.90 C ATOM 283 O3' DG B 14 -1.014 -5.933 3.977 1.00 16.35 O ATOM 284 C2' DG B 14 1.223 -6.607 4.600 1.00 8.75 C ATOM 285 C1' DG B 14 2.583 -6.029 4.341 1.00 8.31 C ATOM 286 P DC B 15 -2.108 -5.846 5.127 1.00 18.17 P ATOM 287 N1 DC B 15 0.594 -8.193 8.784 1.00 10.36 N ATOM 288 C2 DC B 15 1.420 -8.271 9.913 1.00 13.07 C ATOM 289 O2 DC B 15 1.626 -9.323 10.519 1.00 11.62 O ATOM 290 N3 DC B 15 1.985 -7.143 10.391 1.00 9.60 N ATOM 291 C4 DC B 15 1.755 -5.962 9.810 1.00 9.75 C ATOM 292 N4 DC B 15 2.507 -4.945 10.242 1.00 10.36 N ATOM 293 C5 DC B 15 0.883 -5.835 8.681 1.00 8.80 C ATOM 294 C6 DC B 15 0.336 -6.973 8.201 1.00 11.04 C ATOM 295 OP1 DC B 15 -3.198 -6.237 4.195 1.00 23.53 O ATOM 296 OP2 DC B 15 -2.242 -4.630 5.951 1.00 23.09 O ATOM 297 O5' DC B 15 -1.783 -7.100 6.053 1.00 20.88 O ATOM 298 C5' DC B 15 -2.023 -8.439 5.585 1.00 16.99 C ATOM 299 C4' DC B 15 -1.560 -9.527 6.542 1.00 16.47 C ATOM 300 O4' DC B 15 -0.145 -9.414 6.793 1.00 14.34 O ATOM 301 C3' DC B 15 -2.235 -9.419 7.903 1.00 17.63 C ATOM 302 O3' DC B 15 -3.580 -9.983 8.004 1.00 16.81 O ATOM 303 C2' DC B 15 -1.174 -10.022 8.803 1.00 12.88 C ATOM 304 C1' DC B 15 0.116 -9.496 8.210 1.00 14.19 C ATOM 305 P DG B 16 -4.447 -9.204 9.118 1.00 23.27 P ATOM 306 N9 DG B 16 -0.792 -7.342 13.150 1.00 14.23 N ATOM 307 C8 DG B 16 -1.064 -6.617 12.000 1.00 13.86 C ATOM 308 N7 DG B 16 -0.426 -5.487 11.941 1.00 10.67 N ATOM 309 C5 DG B 16 0.313 -5.477 13.124 1.00 13.65 C ATOM 310 C6 DG B 16 1.184 -4.501 13.652 1.00 10.61 C ATOM 311 O6 DG B 16 1.552 -3.475 13.129 1.00 10.52 O ATOM 312 N1 DG B 16 1.683 -4.846 14.894 1.00 14.28 N ATOM 313 C2 DG B 16 1.388 -6.009 15.567 1.00 12.13 C ATOM 314 N2 DG B 16 1.910 -6.217 16.766 1.00 10.28 N ATOM 315 N3 DG B 16 0.578 -6.929 15.063 1.00 15.53 N ATOM 316 C4 DG B 16 0.082 -6.603 13.853 1.00 12.03 C ATOM 317 OP1 DG B 16 -5.486 -10.240 8.913 1.00 22.76 O ATOM 318 OP2 DG B 16 -4.614 -7.887 8.455 1.00 24.12 O ATOM 319 O5' DG B 16 -4.232 -8.798 10.672 1.00 18.16 O ATOM 320 C5' DG B 16 -4.091 -9.850 11.581 1.00 18.35 C ATOM 321 C4' DG B 16 -3.224 -9.555 12.771 1.00 17.50 C ATOM 322 O4' DG B 16 -1.873 -9.267 12.423 1.00 15.59 O ATOM 323 C3' DG B 16 -3.673 -8.498 13.727 1.00 17.67 C ATOM 324 O3' DG B 16 -4.857 -8.945 14.432 1.00 23.53 O ATOM 325 C2' DG B 16 -2.423 -8.573 14.568 1.00 16.53 C ATOM 326 C1' DG B 16 -1.278 -8.659 13.568 1.00 15.43 C ATOM 327 P DC B 17 -6.006 -7.956 15.048 1.00 19.94 P ATOM 328 N1 DC B 17 -2.194 -5.587 17.570 1.00 12.74 N ATOM 329 C2 DC B 17 -1.248 -4.622 17.829 1.00 13.09 C ATOM 330 O2 DC B 17 -0.698 -4.517 18.933 1.00 12.24 O ATOM 331 N3 DC B 17 -0.984 -3.712 16.852 1.00 14.35 N ATOM 332 C4 DC B 17 -1.639 -3.762 15.686 1.00 13.79 C ATOM 333 N4 DC B 17 -1.297 -2.921 14.711 1.00 16.68 N ATOM 334 C5 DC B 17 -2.631 -4.748 15.430 1.00 11.59 C ATOM 335 C6 DC B 17 -2.858 -5.633 16.400 1.00 8.53 C ATOM 336 OP1 DC B 17 -6.749 -9.243 15.142 1.00 18.85 O ATOM 337 OP2 DC B 17 -6.441 -6.892 14.132 1.00 21.49 O ATOM 338 O5' DC B 17 -5.598 -7.385 16.536 1.00 17.70 O ATOM 339 C5' DC B 17 -5.483 -8.267 17.659 1.00 17.29 C ATOM 340 C4' DC B 17 -4.462 -7.850 18.701 1.00 19.19 C ATOM 341 O4' DC B 17 -3.142 -7.783 18.121 1.00 20.08 O ATOM 342 C3' DC B 17 -4.754 -6.460 19.204 1.00 21.26 C ATOM 343 O3' DC B 17 -5.866 -6.375 20.121 1.00 23.03 O ATOM 344 C2' DC B 17 -3.399 -6.104 19.736 1.00 18.88 C ATOM 345 C1' DC B 17 -2.472 -6.604 18.629 1.00 18.39 C ATOM 346 P DC B 18 -7.007 -5.260 19.781 1.00 28.77 P ATOM 347 N1 DC B 18 -3.297 -1.380 18.786 1.00 18.17 N ATOM 348 C2 DC B 18 -2.446 -0.458 18.171 1.00 16.98 C ATOM 349 O2 DC B 18 -1.573 0.166 18.774 1.00 20.32 O ATOM 350 N3 DC B 18 -2.583 -0.258 16.848 1.00 16.82 N ATOM 351 C4 DC B 18 -3.505 -0.931 16.149 1.00 15.76 C ATOM 352 N4 DC B 18 -3.636 -0.665 14.860 1.00 13.34 N ATOM 353 C5 DC B 18 -4.372 -1.893 16.748 1.00 12.67 C ATOM 354 C6 DC B 18 -4.237 -2.080 18.066 1.00 14.81 C ATOM 355 OP1 DC B 18 -8.010 -5.697 20.796 1.00 27.91 O ATOM 356 OP2 DC B 18 -7.417 -4.926 18.375 1.00 24.48 O ATOM 357 O5' DC B 18 -6.346 -3.878 20.355 1.00 26.69 O ATOM 358 C5' DC B 18 -5.876 -3.663 21.675 1.00 22.45 C ATOM 359 C4' DC B 18 -4.868 -2.527 21.660 1.00 20.14 C ATOM 360 O4' DC B 18 -3.898 -2.791 20.621 1.00 17.95 O ATOM 361 C3' DC B 18 -5.383 -1.139 21.350 1.00 20.46 C ATOM 362 O3' DC B 18 -6.122 -0.495 22.422 1.00 22.52 O ATOM 363 C2' DC B 18 -4.069 -0.456 20.977 1.00 18.70 C ATOM 364 C1' DC B 18 -3.245 -1.549 20.252 1.00 18.68 C ATOM 365 P DG B 19 -7.015 0.794 21.992 1.00 18.68 P ATOM 366 N9 DG B 19 -3.670 3.314 18.697 1.00 8.91 N ATOM 367 C8 DG B 19 -4.569 2.317 18.417 1.00 7.23 C ATOM 368 N7 DG B 19 -4.814 2.192 17.179 1.00 8.80 N ATOM 369 C5 DG B 19 -4.038 3.182 16.585 1.00 8.99 C ATOM 370 C6 DG B 19 -3.831 3.450 15.217 1.00 9.86 C ATOM 371 O6 DG B 19 -4.361 2.871 14.270 1.00 14.98 O ATOM 372 N1 DG B 19 -2.868 4.446 14.998 1.00 8.65 N ATOM 373 C2 DG B 19 -2.192 5.116 15.998 1.00 8.58 C ATOM 374 N2 DG B 19 -1.417 6.149 15.640 1.00 8.82 N ATOM 375 N3 DG B 19 -2.387 4.836 17.299 1.00 9.44 N ATOM 376 C4 DG B 19 -3.324 3.871 17.515 1.00 8.64 C ATOM 377 OP1 DG B 19 -7.592 0.740 23.355 1.00 20.58 O ATOM 378 OP2 DG B 19 -7.881 0.644 20.808 1.00 18.98 O ATOM 379 O5' DG B 19 -6.137 2.085 21.765 1.00 14.67 O ATOM 380 C5' DG B 19 -5.282 2.635 22.743 1.00 14.92 C ATOM 381 C4' DG B 19 -4.265 3.471 22.044 1.00 11.67 C ATOM 382 O4' DG B 19 -3.668 2.725 20.993 1.00 13.34 O ATOM 383 C3' DG B 19 -4.831 4.632 21.315 1.00 12.46 C ATOM 384 O3' DG B 19 -5.233 5.692 22.194 1.00 12.97 O ATOM 385 C2' DG B 19 -3.646 4.994 20.460 1.00 10.60 C ATOM 386 C1' DG B 19 -3.149 3.663 20.010 1.00 11.00 C ATOM 387 P G B 20 -6.156 6.845 21.578 1.00 16.17 P ATOM 388 N9 G B 20 -4.621 7.966 16.781 1.00 8.70 N ATOM 389 C8 G B 20 -5.409 6.982 17.305 1.00 8.15 C ATOM 390 N7 G B 20 -5.951 6.226 16.408 1.00 9.88 N ATOM 391 C5 G B 20 -5.496 6.753 15.190 1.00 10.42 C ATOM 392 C6 G B 20 -5.780 6.342 13.855 1.00 11.50 C ATOM 393 O6 G B 20 -6.476 5.399 13.485 1.00 13.46 O ATOM 394 N1 G B 20 -5.138 7.125 12.924 1.00 8.26 N ATOM 395 C2 G B 20 -4.310 8.187 13.214 1.00 7.88 C ATOM 396 N2 G B 20 -3.735 8.801 12.170 1.00 6.62 N ATOM 397 N3 G B 20 -4.043 8.594 14.477 1.00 8.59 N ATOM 398 C4 G B 20 -4.676 7.821 15.410 1.00 7.98 C ATOM 399 OP1 G B 20 -6.346 7.569 22.839 1.00 11.59 O ATOM 400 OP2 G B 20 -7.348 6.334 20.882 1.00 19.70 O ATOM 401 O5' G B 20 -5.304 7.716 20.550 1.00 15.64 O ATOM 402 C5' G B 20 -4.166 8.497 20.960 1.00 13.60 C ATOM 403 C4' G B 20 -3.731 9.295 19.780 1.00 11.64 C ATOM 404 O4' G B 20 -3.346 8.405 18.762 1.00 12.78 O ATOM 405 C3' G B 20 -4.937 10.017 19.154 1.00 9.26 C ATOM 406 O3' G B 20 -5.162 11.232 19.849 1.00 8.82 O ATOM 407 C2' G B 20 -4.515 10.231 17.738 1.00 10.28 C ATOM 408 O2' G B 20 -3.496 11.210 17.640 1.00 14.06 O ATOM 409 C1' G B 20 -3.782 8.924 17.491 1.00 11.06 C TER 410 G B 20 HETATM 411 N1 SPM 21 10.683 -8.783 22.839 1.00 40.13 N HETATM 412 C2 SPM 21 11.531 -7.621 23.379 1.00 38.06 C HETATM 413 C3 SPM 21 10.826 -6.312 23.033 1.00 36.69 C HETATM 414 C4 SPM 21 11.754 -5.116 22.994 1.00 35.02 C HETATM 415 N5 SPM 21 10.958 -3.909 22.549 1.00 32.86 N HETATM 416 C6 SPM 21 12.018 -2.878 22.231 1.00 32.94 C HETATM 417 C7 SPM 21 11.419 -1.515 22.220 1.00 31.05 C HETATM 418 C8 SPM 21 12.460 -0.586 21.671 1.00 30.79 C HETATM 419 C9 SPM 21 12.057 0.847 21.888 1.00 28.48 C HETATM 420 N10 SPM 21 13.064 1.749 21.221 1.00 28.45 N HETATM 421 C11 SPM 21 13.493 2.749 22.270 1.00 30.71 C HETATM 422 C12 SPM 21 14.237 3.946 21.699 1.00 31.37 C HETATM 423 C13 SPM 21 14.691 4.712 22.920 1.00 32.44 C HETATM 424 N14 SPM 21 14.460 6.175 22.642 1.00 34.72 N HETATM 425 O HOH 22 -2.974 -2.437 11.925 1.00 16.09 O HETATM 426 O HOH 23 4.908 -5.520 0.996 1.00 18.38 O HETATM 427 O HOH 24 -7.781 4.610 18.814 1.00 18.46 O HETATM 428 O HOH 25 -0.410 11.047 5.984 1.00 21.92 O HETATM 429 O HOH 26 -8.768 2.303 25.439 1.00 63.34 O HETATM 430 O HOH 27 2.982 -6.730 19.716 1.00 59.88 O HETATM 431 O HOH 28 14.965 -12.628 -1.536 1.00 20.30 O HETATM 432 O HOH 29 11.946 -14.326 0.320 1.00 19.82 O HETATM 433 O HOH 30 10.067 -5.986 15.026 1.00 53.92 O HETATM 434 O HOH 31 12.687 -7.091 6.513 1.00 22.27 O HETATM 435 O HOH 32 12.609 -9.474 8.227 1.00 37.71 O HETATM 436 O HOH 33 -2.941 -7.858 2.063 1.00 27.19 O HETATM 437 O HOH 34 7.529 -3.577 14.088 1.00 21.79 O HETATM 438 O HOH 35 1.254 -0.882 12.378 1.00 24.27 O HETATM 439 O HOH 36 3.423 0.963 13.195 1.00 29.99 O HETATM 440 O HOH 37 7.112 -6.175 -0.485 1.00 27.77 O HETATM 441 O HOH 38 -0.686 -3.219 10.199 1.00 34.51 O HETATM 442 O HOH 39 9.580 7.535 14.458 1.00 36.42 O HETATM 443 O HOH 40 13.715 -4.726 5.032 1.00 69.56 O HETATM 444 O HOH 41 5.720 -2.345 11.434 1.00 31.09 O HETATM 445 O HOH 42 3.591 6.788 4.471 1.00 54.80 O HETATM 446 O HOH 43 10.402 4.780 14.504 1.00 68.31 O HETATM 447 O HOH 44 14.574 -10.275 18.466 1.00 49.77 O HETATM 448 O HOH 45 9.740 9.480 0.051 1.00 32.13 O HETATM 449 O HOH 46 0.657 2.761 2.939 1.00 32.50 O HETATM 450 O HOH 47 -4.337 -5.705 11.632 1.00 61.29 O HETATM 451 O HOH 48 8.511 0.032 6.773 1.00 19.39 O HETATM 452 O HOH 49 4.696 -1.081 7.336 1.00 33.58 O HETATM 453 O HOH 50 15.251 -12.102 2.108 1.00 32.25 O HETATM 454 O HOH 51 -6.031 -4.587 15.810 1.00 44.75 O HETATM 455 O HOH 52 3.985 7.860 0.750 1.00 43.33 O HETATM 456 O HOH 53 -9.947 -8.411 16.066 1.00 42.79 O HETATM 457 O HOH 54 14.022 -9.173 2.574 1.00 61.84 O HETATM 458 O HOH 55 8.927 4.925 21.552 1.00 21.30 O HETATM 459 O HOH 56 12.080 -9.656 20.565 1.00 39.11 O HETATM 460 O HOH 57 10.264 3.453 5.213 1.00 32.36 O HETATM 461 O HOH 58 7.585 8.903 10.458 1.00 55.81 O HETATM 462 O HOH 59 -6.958 -12.129 15.577 1.00 25.61 O HETATM 463 O HOH 60 7.487 1.041 16.040 1.00 46.35 O HETATM 464 O HOH 61 -0.194 -3.247 7.396 1.00 35.93 O HETATM 465 O HOH 62 8.225 6.727 12.206 1.00 60.91 O HETATM 466 O HOH 63 -7.060 4.463 4.604 1.00 46.27 O HETATM 467 O HOH 64 7.946 3.533 12.709 1.00 28.03 O HETATM 468 O HOH 65 6.779 -1.926 8.904 1.00 41.06 O HETATM 469 O HOH 66 -4.616 1.948 8.938 1.00 36.90 O HETATM 470 O HOH 67 2.587 3.984 4.922 1.00 71.03 O HETATM 471 O HOH 68 -2.870 3.373 6.568 1.00 35.34 O HETATM 472 O HOH 69 -2.641 -4.676 8.852 1.00 65.95 O HETATM 473 O HOH 70 7.896 2.158 5.060 1.00 37.59 O HETATM 474 O HOH 71 -10.031 -4.027 18.622 1.00 67.65 O HETATM 475 O HOH 72 -8.176 -1.645 24.639 1.00 49.61 O HETATM 476 O HOH 73 17.116 0.579 15.466 1.00 47.99 O HETATM 477 O HOH 74 -2.555 0.759 5.884 1.00 40.81 O HETATM 478 O HOH 75 5.250 1.995 7.543 1.00 70.98 O HETATM 479 O HOH 76 -10.113 -6.723 18.202 1.00 59.20 O HETATM 480 O HOH 77 1.829 -2.266 9.724 1.00 75.20 O HETATM 481 O HOH 78 -8.873 -3.504 22.680 1.00 79.41 O HETATM 482 O HOH 79 -9.310 -1.446 19.391 1.00 71.79 O HETATM 483 O HOH 80 -6.613 0.677 10.598 1.00 80.35 O HETATM 484 O HOH 81 -7.134 2.452 7.202 1.00 72.90 O HETATM 485 O HOH 82 13.359 4.222 15.085 1.00 55.82 O HETATM 486 O HOH 83 -1.981 3.230 3.724 1.00 91.06 O HETATM 487 O HOH 84 8.014 -16.765 6.352 1.00 97.71 O HETATM 488 O HOH 85 13.277 -1.574 6.340 1.00 80.86 O HETATM 489 O HOH 86 4.216 1.820 10.481 1.00 76.69 O HETATM 490 O HOH 87 10.662 -11.389 23.778 1.00 49.18 O HETATM 491 O HOH 88 -2.029 -10.316 17.858 1.00 83.02 O CONECT 411 412 CONECT 412 411 413 CONECT 413 412 414 CONECT 414 413 415 CONECT 415 414 416 CONECT 416 415 417 CONECT 417 416 418 CONECT 418 417 419 CONECT 419 418 420 CONECT 420 419 421 CONECT 421 420 422 CONECT 422 421 423 CONECT 423 422 424 CONECT 424 423 MASTER 0 0 0 0 0 0 0 6 489 2 14 2 END asymptote-3.05/examples/fermi.asy0000644000000000000000000000132715031566105015627 0ustar rootrootimport feynman; // set default line width to 0.8bp currentpen = linewidth(0.8); // scale all other defaults of the feynman module appropriately fmdefaults(); // disable middle arrows currentarrow = None; // define vertex and external points pair xu = (-40,+45); pair xl = (-40,-45); pair yu = (+40,+45); pair yl = (+40,-45); pair zu = ( 0,+ 5); pair zl = ( 0,- 5); // define mid points pair mxu = (xu+zu)/2; pair mxl = (xl+zl)/2; pair myu = (yu+zu)/2; pair myl = (yl+zl)/2; // draw fermion lines drawFermion(xu--zu--yu); drawFermion(xl--zl--yl); // draw vertices drawVertexOX(zu); drawVertexOX(zl); // draw gluon. Note that the underlying fermion line is blotted out. drawGluon(arc((0,0),mxu,myl,CW)); // shipout asymptote-3.05/examples/circumcircle.asy0000644000000000000000000000034415031566105017167 0ustar rootrootunitsize(1inch); path tri=(0,0)--(1,0)--(2,1)--cycle; pair p1=point(tri,0.5); pair p2=point(tri,1.5); pair z0=extension(p1,p1+I*dir(tri,0.5),p2,p2+I*dir(tri,1.5)); dot(z0); draw(circle(z0,abs(z0-point(tri,0)))); draw(tri,red); asymptote-3.05/examples/mosaic.asy0000644000000000000000000001214015031566105015773 0ustar rootroot// Calendar example contributed by Jens Schwaiger // transformations path similarpath(pair a, pair b, path p) { // transform p into a path starting at a and ending at b pair first; pair last; path p_; first=point(p,0); last=point(p,length(p)); p_=shift(-first)*p; p_=rotate(degrees(b-a))*p_; p_=scale(abs(b-a)/abs(last-first))*p_; p_=shift(a)*p_; return p_; } path c_line(path p) { // returns the path obtained by adding to p a copy rotated // around the endpoint of p by 180 degrees // works only if the initial point and the endpoint of p are different // a c_line is symetric with respect to the center of // the straight line between its endpoints // return p..rotate(180,point(p,length(p)))*reverse(p); } path tounitcircle(path p, int n=300) { // the transformation pair x --> x/sqrt(1+abs(x)^2) // is a bijection from the plane to the open unitdisk real l=arclength(p); path ghlp; for(int i=0; i <= n; ++i) { real at=arctime(p,l/n*i); pair phlp=point(p,at); real trhlp=1/(1+abs(phlp)^2)^(1/2); ghlp=ghlp--trhlp*phlp; } if(cyclic(p)) {ghlp=ghlp--cycle;} return ghlp; } void centershade(picture pic=currentpicture, path p, pen in, pen out, pen drawpen=currentpen) { pair center=0.5(max(p)+min(p)); real radius=0.5abs(max(p)-min(p)); radialshade(pic,p,in,center,0,out,center,radius); draw(pic,p,drawpen); } pair zentrum(path p) {return 0.5(min(p)+max(p));} //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% real scalefactor=19/13; // For output: height=scalefactor*width real outputwidth=13cm; picture kalender;// at first we produce a calendar for february 2006 texpreamble("\usepackage[latin1]{inputenc}"); size(outputwidth,0); real yc=0.5; pair diff=(-3.5,5*yc); pen farbe(int j) { pen hlp=0.8white; if(j % 7 == 6) {hlp=red+white;} return hlp;} // farbe=German word for color path kasten=yscale(yc)*unitsquare; // Kasten is a German word meaning something like box path Gkasten=shift((0,2*yc)+diff)*xscale(7)*yscale(2)*kasten; path tage[]= new path[7]; // Tag=day string wochentag[]={"MO","DI","MI","DO","FR","SA","SO"}; path[][] bx= new path[6][7]; string[][] entry= new string[6][7]; bool[][] holiday=new bool[6][7]; // Now the necessary information for February 2006 int start=2; int days=28; for(int i=0; i < entry.length; ++i) { for(int j=0; j < entry[0].length; ++j) { int day=i*7+j-start+1; entry[i][j]=(day > 0 && day <= days ? (string) day : ""); holiday[i][j]=false; } } for(int j=0; j < 7; ++j) { tage[j]=shift((j,yc)+diff)*kasten; filldraw(tage[j],farbe(j),black+2bp); label(wochentag[j],zentrum(tage[j]),Palatino()); for(int i=0; i < 6; ++i) {bx[i][j]=shift((j,-yc*i)+diff)*kasten; filldraw(bx[i][j],farbe(j),black+2bp); if(holiday[i][j]) {filldraw(bx[i][j],farbe(6),black+2bp);}; }; }; filldraw(Gkasten,0.3white,black+2bp); for(int j=0; j < 7; ++j) for(int i=0; i < 6 ; ++i) {label(entry[i][j],zentrum(bx[i][j]),Palatino());} label("\Huge Februar 2006",zentrum(Gkasten),Palatino()+white); // Zentrum=center; Februar=february add(kalender,currentpicture); erase(); // Now the mosaic is constructed pair a[]=new pair[4]; path p[]=new path[4]; path q[]=new path[4]; path kontur[]=new path[5]; picture temppic; a[1]=(0,0); a[2]=(1,0); a[3]=(0,1); // a triangle with abs(a[2]-a[1])=abs(a[3]-a[1] // and a right angle at a[1]; q[1]=(0,0){dir(-20)}::{dir(20)}(0.2,0){dir(-140)}..{dir(0)}(0.3,-0.2){dir(0)}.. {dir(140)}(0.4,0){dir(20)}..{dir(-20)}(1,0); q[2]=(0,0){dir(20)}..{dir(-20)}(0.8,0){dir(-140)}..{dir(0)}(0.9,-0.3){dir(0)}.. {dir(140)}(1,0); q[2]=c_line(q[2]); p[1]=similarpath(a[1],a[2],q[1]);// arbitrary path from a[1] to a[2] p[2]=similarpath(a[2],a[3],q[2]);// arbitrary c_line from a[2] to a[3] p[3]=rotate(90,a[1])*reverse(p[1]);// kontur[1]=p[1]..p[2]..p[3]..cycle;// first tile kontur[2]=rotate(90,a[1])*kontur[1];// second kontur[3]=rotate(180,a[1])*kontur[1];// third kontur[4]=rotate(270,a[1])*kontur[1];// fourth pair tri=2*(interp(a[2],a[3],0.5)-a[1]); pair trii=rotate(90)*tri; // translations of kontur[i], i=1,2,3,4, with respect to // j*tri+k*trii // fill the plane for(int j=-4; j < 4; ++j) for(int k=-4; k < 4; ++k) { transform tr=shift(j*tri+k*trii); for(int i=1; i < 5; ++i) { centershade(temppic,tr*kontur[i],(1-i/10)*white, (1-i/10)*chartreuse,black+2bp); } } // Now we produce the bijective images inside // a suitably scaled unitcircle for(int k=-1; k < 2; ++k) for(int l=-1; l < 2; ++l) { transform tr=shift(k*tri+l*trii); for(int i=1; i < 5; ++i) { centershade(temppic,scale(2.5)*tounitcircle(tr*kontur[i],380), (1-i/10)*white,(1-i/10)*orange,black+2bp); } } add(temppic); // We clip the picture to a suitable box pair piccenter=0.5*(temppic.min()+temppic.max()); pair picbox=temppic.max()-temppic.min(); real picwidth=picbox.x; transform trialtrans=shift(0,-1.5)*shift(piccenter)*yscale(scalefactor)* scale(0.25picwidth)*shift((-0.5,-0.5))*identity(); clip(trialtrans*unitsquare); // add the calendar at a suitable position add(kalender.fit(0.75*outputwidth),interp(point(S),point(N),1/13)); asymptote-3.05/examples/polarcircle.asy0000644000000000000000000000116415031566105017023 0ustar rootrootimport math; import graph; size(0,100); real f(real t) {return 2*cos(t);} pair F(real x) {return (x,f(x));} draw(polargraph(f,0,pi,operator ..)); defaultpen(fontsize(10pt)); xaxis("$x$"); yaxis("$y$"); real theta=radians(50); real r=f(theta); draw("$\theta$",arc((0,0),0.5,0,degrees(theta)),red,Arrow,PenMargins); pair z=polar(r,theta); draw(z--(z.x,0),dotted+red); draw((0,0)--(z.x,0),dotted+red); label("$r\cos\theta$",(0.5*z.x,0),0.5*S,red); label("$r\sin\theta$",(z.x,0.5*z.y),0.5*E,red); dot("$(x,y)$",z,N); draw("r",(0,0)--z,0.5*unit(z)*I,blue,Arrow,DotMargin); dot("$(a,0)$",(1,0),NE); dot("$(2a,0)$",(2,0),NE); asymptote-3.05/examples/triangles.asy0000644000000000000000000000067115031566105016516 0ustar rootrootimport three; size(10cm); currentlight=Headlamp; triple[] v={O,X,X+Y,Y}; triple[] n={Z,X}; int[][] vi={{0,1,2},{2,3,0}}; int[][] ni={{1,0,1},{1,1,1}}; // Adobe Reader exhibits a PRC rendering bug for opacities: pen[] p={red+opacity(0.5),green+opacity(0.5),blue+opacity(0.5), black+opacity(0.5)}; int[][] pi={{0,1,2},{2,3,0}}; draw(v,vi,n,ni,red); draw(v+Z,vi,n,ni,p,pi); //draw(v+Z,vi,p,pi); //draw(v,vi,red); //draw(v+Z,vi); asymptote-3.05/examples/imagehistogram.asy0000644000000000000000000000212715031566105017524 0ustar rootrootimport stats; import graph; import palette; import contour; size(20cm); scale(false); pair[] data=new pair[50000]; for(int i=0; i < data.length; ++i) data[i]=Gaussrandpair(); // Histogram limits and number of bins pair datamin=(-0.15,-0.15); pair datamax=(0.15,0.15); int Nx=30; int Ny=30; int[][] bins=frequency(data,datamin,datamax,Nx,Ny); real[] values=new real[Nx*Ny]; pair[] points=new pair[Nx*Ny]; int k=0; real dx=(datamax.x-datamin.x)/Nx; real dy=(datamax.y-datamin.y)/Ny; for(int i=0; i < Nx; ++i) { for(int j=0; j < Ny; ++j) { values[k]=bins[i][j]; points[k]=(datamin.x+(i+0.5)*dx,datamin.y+(j+0.5)*dy); ++k; } } // Create a color palette pen[] InvGrayscale(int NColors=256) { real ninv=1.0/(NColors-1.0); return sequence(new pen(int i) {return gray(1-17*i*ninv);},NColors); } // Draw the histogram, with axes bounds range=image(points,values,Range(0,40),InvGrayscale()); draw(contour(points,values,new real[] {1,2,3,4,8,12,16,20,24,28,32,36,40}, operator--),blue); xaxis("$x$",BottomTop,LeftTicks,above=true); yaxis("$y$",LeftRight,RightTicks,above=true); asymptote-3.05/examples/NURBSsurface.asy0000644000000000000000000000307615031566105016772 0ustar rootrootsettings.outformat="pdf"; settings.prc=true; import three; size(10cm); currentprojection=perspective(50,80,50); // Nonrational surface: // udegree=3, vdegree=3, nu=5, nv=6; real[] uknot={0,0,0,0,0.5,1,1,1,1}; real[] vknot={0,0,0,0,0.4,0.6,1,1,1,1}; triple[][] P= { { (-31.2061,12.001,6.45082), (-31.3952,14.7353,6.53707), (-31.5909,21.277,6.70051), (-31.4284,25.4933,6.76745), (-31.5413,30.3485,6.68777), (-31.4896,32.2839,6.58385) }, { (-28.279,12.001,7.89625), (-28.4187,14.7353,8.00954), (-28.5633,21.277,8.22422), (-28.4433,25.4933,8.31214), (-28.5266,30.3485,8.20749), (-28.4885,32.2839,8.07099) }, { (-20,12.001,10.0379), (-20,14.7353,10.2001), (-20,21.277,10.5076), (-20,25.4933,10.6335), (-20,30.3485,10.4836), (-20,32.2839,10.2881) }, { (-11.721,12.001,7.84024), (-11.5813,14.7353,7.95269), (-11.4367,21.277,8.16575), (-11.5567,25.4933,8.25302), (-11.4734,30.3485,8.14915), (-11.5115,32.2839,8.01367) }, { (-8.79391,12.001,6.39481), (-8.60483,14.7353,6.48022), (-8.40905,21.277,6.64204), (-8.57158,25.4933,6.70832), (-8.45874,30.3485,6.62943), (-8.51041,32.2839,6.52653) } }; draw(P,uknot,vknot,new pen[] {red,green,blue,magenta}); // Rational Bezier patch: // udegree=3, vdegree=3, nu=4, nv=4; real[] uknot={0,0,0,0,1,1,1,1}; real[] vknot={0,0,0,0,1,1,1,1}; triple[][] P=scale3(20)*octant1x.P; // Optional weights: real[][] weights=array(P.length,array(P[0].length,1.0)); weights[0][2]=5.0; draw(P,uknot,vknot,weights,blue); asymptote-3.05/examples/shade.asy0000644000000000000000000000010215031566105015577 0ustar rootrootsize(100,0); radialshade(unitsquare,yellow,(0,0),0,red,(0,0),1); asymptote-3.05/examples/cones.asy0000644000000000000000000000075715031566105015642 0ustar rootrootimport solids; size(200); currentprojection=orthographic(5,4,2); render render=render(compression=Low,merge=true); pen skeletonpen=blue+0.15mm; revolution upcone=cone(-Z,1,1); revolution downcone=cone(Z,1,-1); draw(surface(upcone),green,render); draw(surface(downcone),green,render); draw(upcone,5,skeletonpen,longitudinalpen=nullpen); draw(downcone,5,skeletonpen,longitudinalpen=nullpen); revolution cone=shift(2Y-2X)*cone(1,1); draw(surface(cone),green,render); draw(cone,5,skeletonpen); asymptote-3.05/examples/shadestroke.asy0000644000000000000000000000015715031566105017041 0ustar rootrootsize(100); radialshade(W..N..E--(0,0),stroke=true, red+linewidth(30),(0,0),0.25,yellow,(0,0),1); asymptote-3.05/examples/star.asy0000644000000000000000000000022115031566105015466 0ustar rootrootsize(100); import math; int n=5; path p; int i=0; do { p=p--unityroot(n,i); i=(i+2) % n; } while(i != 0); filldraw(p--cycle,red+evenodd); asymptote-3.05/examples/stereoscopic.asy0000644000000000000000000000024215031566105017222 0ustar rootrootimport three; currentprojection=perspective(50*dir(70,15)); picture pic; unitsize(pic,1cm); draw(pic,xscale3(10)*unitcube,yellow,blue); addStereoViews(pic); asymptote-3.05/examples/sacone3D.asy0000644000000000000000000000044015031566105016157 0ustar rootrootimport solids; size(0,75); real r=1; real h=1; revolution R=cone(r,h); draw(surface(R),lightgreen+opacity(0.5),render(compression=Low)); pen edge=blue+0.25mm; draw("$\ell$",(0,r,0)--(0,0,h),W,edge); draw("$r$",(0,0,0)--(r,0,0),red+dashed); draw((0,0,0)--(0,0,h),red+dashed); dot(h*Z); asymptote-3.05/examples/layers.asy0000644000000000000000000000126215031566105016022 0ustar rootrootusepackage("ocgx2"); settings.tex="pdflatex"; size(0,150); pen colour1=red; pen colour2=green; pair z0=(0,0); pair z1=(-1,0); pair z2=(1,0); real r=1.5; path c1=circle(z1,r); path c2=circle(z2,r); begin("A"); fill(c1,colour1); end(); fill(c2,colour2); picture intersection; fill(intersection,c1,colour1+colour2); clip(intersection,c2); add(intersection); draw(c1); draw(c2); label("$A$",z1); begin("B"); label("$B$",z2); end(); pair z=(0,-2); real m=3; margin BigMargin=Margin(0,m*dot(unit(z1-z),unit(z0-z))); draw(Label("$A\cap B$",0),conj(z)--z0,Arrow,BigMargin); draw(Label("$A\cup B$",0),z--z0,Arrow,BigMargin); draw(z--z1,Arrow,Margin(0,m)); draw(z--z2,Arrow,Margin(0,m)); asymptote-3.05/examples/shellsqrtx01.asy0000644000000000000000000000147515031566105017103 0ustar rootrootimport graph3; import solids; size(0,150); currentprojection=orthographic(1,0,10,up=Y); pen color=green; real alpha=-240; real f(real x) {return sqrt(x);} pair F(real x) {return (x,f(x));} triple F3(real x) {return (x,f(x),0);} path p=graph(F,0,1,n=30,operator ..)--(1,0)--cycle; path3 p3=path3(p); revolution a=revolution(p3,X,alpha,0); render render=render(compression=0,merge=true); draw(surface(a),color,render); draw(p3,blue); surface s=surface(p); draw(s,color,render); draw(rotate(alpha,X)*s,color,render); xaxis3(Label("$x$",1),xmax=1.25,dashed,Arrow3); yaxis3(Label("$y$",1),Arrow3); dot("$(1,1)$",(1,1,0)); arrow("$y=\sqrt{x}$",F3(0.8),Y,0.75cm,red); real r=0.4; draw(F3(r)--(1,f(r),0),red); real x=(1+r)/2; draw("$r$",(x,0,0)--(x,f(r),0),X+0.2Z,red,Arrow3,PenMargin3); draw(arc(1.1X,0.4,90,90,3,-90),Arrow3); asymptote-3.05/examples/venn3.asy0000644000000000000000000000150715031566105015556 0ustar rootrootsize(0,150); pen colour1=red; pen colour2=green; pen colour3=blue; real r=sqrt(3); pair z0=(0,0); pair z1=(-1,0); pair z2=(1,0); pair z3=(0,r); path c1=circle(z1,r); path c2=circle(z2,r); path c3=circle(z3,r); fill(c1,colour1); fill(c2,colour2); fill(c3,colour3); picture intersection12; fill(intersection12,c1,colour1+colour2); clip(intersection12,c2); picture intersection13; fill(intersection13,c1,colour1+colour3); clip(intersection13,c3); picture intersection23; fill(intersection23,c2,colour2+colour3); clip(intersection23,c3); picture intersection123; fill(intersection123,c1,colour1+colour2+colour3); clip(intersection123,c2); clip(intersection123,c3); add(intersection12); add(intersection13); add(intersection23); add(intersection123); draw(c1); draw(c2); draw(c3); label("$A$",z1); label("$B$",z2); label("$C$",z3); asymptote-3.05/examples/phase.asy0000644000000000000000000000055115031566105015623 0ustar rootrootimport graph; size(8cm,6cm,IgnoreAspect); pair S0=(4,0.2); pair S1=(2,3); pair S8=(0.5,0); xaxis("$S$"); yaxis(Label("$I$",0.5)); draw(S0{curl 0}..tension 1.5..S1{W}..tension 1.5..{curl 0}S8,Arrow(Fill,0.4)); draw((S1.x,0)..S1,dashed); draw((0,S1.y)..S1,dotted); labelx("$\frac{\gamma}{\beta}$",S1.x); labelx("$S_\infty$",S8.x); labely("$I_{\max}$",S1.y); asymptote-3.05/examples/pOrbital.asy0000644000000000000000000000120115031566105016270 0ustar rootrootimport graph3; import palette; size(200); currentprojection=orthographic(6,8,2); viewportmargin=(1cm,0); real c0=0.1; real f(real r) {return r*(1-r/6)*exp(-r/3);} triple f(pair t) { real r=t.x; real phi=t.y; real f=f(r); real s=max(min(f != 0 ? c0/f : 1,1),-1); real R=r*sqrt(1-s^2); return (R*cos(phi),R*sin(phi),r*s); } bool cond(pair t) {return f(t.x) != 0;} real R=abs((20,20,20)); surface s=surface(f,(0,0),(R,2pi),100,8,Spline,cond); s.colors(palette(s.map(abs),Gradient(palegreen,heavyblue))); render render=render(compression=Low,merge=true); draw(s,render); draw(zscale3(-1)*s); axes3("$x$","$y$","$z$",Arrow3); asymptote-3.05/examples/BezierTriangle.asy0000644000000000000000000000030715031566105017430 0ustar rootrootimport three; currentprojection=perspective(-2,5,1); size(10cm); surface s=surface((0,0,0)--(3,0,0)--(1.5,3*sqrt(3)/2,0)--cycle, new triple[] {(1.5,sqrt(3)/2,2)}); draw(s,red); asymptote-3.05/examples/lines.asy0000644000000000000000000000025015031566105015631 0ustar rootrootimport math; int n=7; size(200,0); draw(unitcircle,red); for (int i=0; i < n-1; ++i) for (int j=i+1; j < n; ++j) drawline(unityroot(n,i),unityroot(n,j),blue); asymptote-3.05/examples/delu.asy0000644000000000000000000000077215031566105015461 0ustar rootrootsize(7cm,0); pair z1=(1,-0.25); pair v1=dir(45); pair z2=-z1; pair v2=0.75*dir(260); pair z3=(z1.x,-3); // A centered random number real crand() {return unitrand()-0.5;} guide g; pair lastz; for(int i=0; i < 60; ++i) { pair z=0.75*lastz+(crand(),crand()); g=g..2.5*z; lastz=z; } g=shift(0,-.5)*g..cycle; draw(g,gray(0.7)); draw("$r$",z1--z2,RightSide,red,Arrows,DotMargins); draw(z1--z1+v1,Arrow); draw(z2--z2+v2,Arrow); draw(z3--z3+v1-v2,green,Arrow); dot("1",z1,S,blue); dot("2",z2,NW,blue); asymptote-3.05/examples/lowint.asy0000644000000000000000000000030415031566105016033 0ustar rootrootsize(100,0); import graph; import lowupint; real a=-0.8, b=1.2; real c=1.0/sqrt(3.0); partition(a,b,c,min); arrow("$f(x)$",F(0.5*(a+b)),NNE,red); label("$\cal{L}$",(0.5*(a+b),f(0.5*(a+b))/2)); asymptote-3.05/examples/Pythagoras.asy0000644000000000000000000000105515031566105016644 0ustar rootrootsize(0,150); import geometry; real a=3; real b=4; real c=hypot(a,b); pair z1=(0,b); pair z2=(a,0); pair z3=(a+b,0); perpendicular(z1,NE,z1--z2,blue); perpendicular(z3,NW,blue); draw(square((0,0),z3)); draw(square(z1,z2)); real d=0.3; pair v=unit(z2-z1); draw(baseline("$a$"),-d*I--z2-d*I,red,Bars,Arrows,PenMargins); draw(baseline("$b$"),z2-d*I--z3-d*I,red,Arrows,Bars,PenMargins); draw("$c$",z3+z2*I-d*v--z2-d*v,red,Arrows,PenMargins); draw("$a$",z3+d--z3+z2*I+d,red,Arrows,Bars,PenMargins); draw("$b$",z3+z2*I+d--z3+z3*I+d,red,Arrows,Bars,PenMargins); asymptote-3.05/examples/textpath.asy0000644000000000000000000000047015031566105016364 0ustar rootrootsize(300); fill(texpath(Label("test",TimesRoman())),pink); fill(texpath(Label("test",fontcommand('.fam T\n.ps 12')),tex=false),red); pair z=10S; fill(texpath(Label("$ \sqrt{x^2} $",z,TimesRoman())),pink); fill(texpath(Label("$ sqrt {x sup 2} $",z,fontcommand('.fam T\n.ps 12')), tex=false),red); asymptote-3.05/examples/fractaltree.asy0000644000000000000000000000125315031566105017017 0ustar rootrootsize(200); path ltrans(path p,int d) { path a=rotate(65)*scale(0.4)*p; return shift(point(p,(1/d)*length(p))-point(a,0))*a; } path rtrans(path p, int d) { path a=reflect(point(p,0),point(p,length(p)))*rotate(65)*scale(0.35)*p; return shift(point(p,(1/d)*length(p))-point(a,0))*a; } void drawtree(int depth, path branch) { if(depth == 0) return; real breakp=(1/depth)*length(branch); draw(subpath(branch,0,breakp),deepgreen); drawtree(depth-1,subpath(branch,breakp,length(branch))); drawtree(depth-1,ltrans(branch,depth)); drawtree(depth-1,rtrans(branch,depth)); return; } path start=(0,0)..controls (-1/10,1/3) and (-1/20,2/3)..(1/20,1); drawtree(6,start); asymptote-3.05/examples/cards.asy0000644000000000000000000000074515031566105015624 0ustar rootrootpicture rect; size(rect,0,2.5cm); real x=1; real y=1.25; filldraw(rect,box((-x,-y)/2,(x,y)/2),lightolive); label(rect,"1",(-x,y)*0.45,SE); label(rect,"2",(x,y)*0.45,SW); label(rect,"3",(-x,-y)*0.45,NE); label(rect,"4",(x,-y)*0.45,NW); frame rectf=rect.fit(); frame toplef=rectf; frame toprig=xscale(-1)*rectf; frame botlef=yscale(-1)*rectf; frame botrig=xscale(-1)*yscale(-1)*rectf; size(0,7.5cm); add(toplef,(-x,y)); add(toprig,(x,y)); add(botlef,(-x,-y)); add(botrig,(x,-y)); asymptote-3.05/examples/laserlattice.asy0000644000000000000000000000213215031566105017174 0ustar rootrootimport graph; import palette; int n=256; pen[] Palette=BWRainbow(); real w(real w0, real z0, real z) {return w0*sqrt(1+(z/z0)^2);} real pot(real lambda, real w0, real r, real z) { real z0=pi*w0^2/lambda, kappa=2pi/lambda; return exp(-2*(r/w(w0,z0,z))^2)*cos(kappa*z)^2; } picture make_field(real lambda, real w0) { real[][] v=new real[n][n]; for(int i=0; i < n; ++i) for(int j=0; j < n; ++j) v[i][j]=pot(lambda,w0,i-n/2,abs(j-n/2)); picture p=new picture; size(p,250,250,IgnoreAspect); real xm=-n/lambda, ym=-n/(2*w0), xx=n/lambda, yx=n/(2*w0); image(p,v,(xm,ym),(xx,yx),Palette); xlimits(p,xm,xx); ylimits(p,ym,yx); xaxis(p,"{\Large $z/\frac{\lambda}{2}$}",BottomTop,LeftTicks); yaxis(p,"{\Large $r/w_0$}",LeftRight,RightTicks); label(p,format("{\LARGE $w_0/\lambda=%.2f$}",w0/lambda),point(p,NW),5N); return p; } picture p=make_field(160,80); picture q=make_field(80,80); picture r=make_field(16,80); picture s=make_field(2,80); real margin=1cm; add(p.fit(),(0,0),margin*NW); add(q.fit(),(0,0),margin*NE); add(r.fit(),(0,0),margin*SW); add(s.fit(),(0,0),margin*SE); asymptote-3.05/examples/vectorfield3.asy0000644000000000000000000000101515031566105017110 0ustar rootrootimport graph3; size(12cm,0); currentprojection=orthographic(1,-2,1); currentlight=(1,-1,0.5); real f(pair z) {return abs(z)^2;} path3 gradient(pair z) { static real dx=sqrtEpsilon, dy=dx; return O--((f(z+dx)-f(z-dx))/2dx,(f(z+I*dy)-f(z-I*dy))/2dy,0); } pair a=(-1,-1); pair b=(1,1); triple F(pair z) {return (z.x,z.y,0);} add(vectorfield(gradient,F,a,b,red)); draw(surface(f,a,b,Spline),gray+opacity(0.5)); xaxis3(XY()*"$x$",OutTicks(XY()*Label)); yaxis3(XY()*"$y$",InTicks(YX()*Label)); zaxis3("$z$",OutTicks); asymptote-3.05/examples/Sierpinski.asy0000644000000000000000000000063215031566105016643 0ustar rootrootsize(10cm); // Draw Sierpinski triangle with top vertex A, side s, and depth q. void Sierpinski(pair A, real s, int q, bool top=true) { pair B=A-(1,sqrt(2))*s/2; pair C=B+s; if(top) fill(A--B--C--cycle); unfill((A+B)/2--(B+C)/2--(A+C)/2--cycle); if(q > 0) { Sierpinski(A,s/2,q-1,false); Sierpinski((A+B)/2,s/2,q-1,false); Sierpinski((A+C)/2,s/2,q-1,false); } } Sierpinski((0,1),1,5); asymptote-3.05/examples/polararea.asy0000644000000000000000000000164215031566105016473 0ustar rootrootimport math; import graph; size(0,150); real f(real t) {return 5+cos(10*t);} xaxis("$x$"); yaxis("$y$"); real theta1=pi/8; real theta2=pi/3; path k=graph(f,theta1,theta2,operator ..); real rmin=min(k).y; real rmax=max(k).y; draw((0,0)--rmax*expi(theta1),dotted); draw((0,0)--rmax*expi(theta2),dotted); path g=polargraph(f,theta1,theta2,operator ..); path h=(0,0)--g--cycle; fill(h,lightgray); draw(h); real thetamin=3*pi/10; real thetamax=2*pi/10; pair zmin=polar(f(thetamin),thetamin); pair zmax=polar(f(thetamax),thetamax); draw((0,0)--zmin,dotted+red); draw((0,0)--zmax,dotted+blue); draw("$\theta_*$",arc((0,0),0.5*rmin,0,degrees(thetamin)),red+fontsize(10pt), PenMargins); draw("$\theta^*$",arc((0,0),0.5*rmax,0,degrees(thetamax)),blue+fontsize(10pt), PenMargins); draw(arc((0,0),rmin,degrees(theta1),degrees(theta2)),red,PenMargins); draw(arc((0,0),rmax,degrees(theta1),degrees(theta2)),blue,PenMargins); asymptote-3.05/examples/limit.asy0000644000000000000000000000121615031566105015640 0ustar rootrootsize(200,200,IgnoreAspect); import graph; real L=1; real epsilon=0.25; real a(int n) {return L+1/n;} for(int i=1; i < 20; ++i) dot((i,a(i))); real N=1/epsilon; xaxis(Label("$n$",align=2S)); yaxis(Label("$a_n$",0.85)); xtick("$2$",2); ytick("$\frac{3}{2}$",3/2); ytick("$2$",2); yequals(Label("$L$",0,up),L,extend=true,blue); yequals(Label("$L+\epsilon$",1,NW),L+epsilon,extend=true,red+dashed); yequals(Label("$L-\epsilon$",1,SW),L-epsilon,extend=true,red+dashed); xequals(N,extend=true,darkgreen+dashed); labelx(shift(0,-10)*"$N=\frac{1}{\epsilon}$",N,E,darkgreen); label("$a_n=1+\frac{1}{n},\quad \epsilon=\frac{1}{4}$",point((0,1)),10S+E); asymptote-3.05/examples/sacylinder.asy0000644000000000000000000000062015031566105016655 0ustar rootrootimport graph; size(0,100); real r=1; real h=3; yaxis(dashed); real m=0.475*h; draw((r,0)--(r,h)); label("$L$",(r,0.5*h),E); real s=4; pair z1=(s,0); pair z2=z1+(2*pi*r,h); filldraw(box(z1,z2),lightgreen); pair zm=0.5*(z1+z2); label("$L$",(z1.x,zm.y),W); label("$2\pi r$",(zm.x,z2.y),N); draw("$r$",(0,m)--(r,m),N,red,Arrows); draw((0,1.015h),yscale(0.5)*arc(0,0.25cm,-250,70),red,ArcArrow); asymptote-3.05/examples/animations/0000755000000000000000000000000015031566105016146 5ustar rootrootasymptote-3.05/examples/animations/sphere.asy0000644000000000000000000000153015031566105020151 0ustar rootrootimport solids; import animation; currentprojection=orthographic((0,5,2)); currentlight=(0,5,5); settings.thick=false; settings.render=0; int nbpts=200; real step=2*pi/nbpts; int angle=10; unitsize(1cm); triple[] P=new triple[nbpts]; for(int i=0; i < nbpts; ++i) { real t=-pi+i*step; P[i]=(3sin(t)*cos(2t),3sin(t)*sin(2t),3cos(t)); } transform3 t=rotate(angle,(0,0,0),(1,0.25,0.25)); revolution r=sphere(O,3); draw(surface(r),lightgrey); draw(r,backpen=linetype("8 8",8)); animation A; for(int phi=0; phi < 360; phi += angle) { bool[] front=new bool[nbpts]; save(); for(int i=0; i < nbpts; ++i) { P[i]=t*P[i]; front[i]=dot(P[i],currentprojection.camera) > 0; } draw(segment(P,front,operator ..),1mm+blue+extendcap); draw(segment(P,!front,operator ..),grey); A.add(); restore(); } A.movie(0,200); currentpicture.erase(); asymptote-3.05/examples/animations/inlinemovie3.tex0000644000000000000000000000201515031566105021267 0ustar rootroot\documentclass{article} \usepackage[inline]{asymptote} %\usepackage{asymptote} \usepackage{animate} \begin{document} Here is an inline 3D PDF movie, generated with the commands \begin{verbatim} pdflatex inlinemovie3 asy inlinemovie3-*.asy pdflatex inlinemovie3 \end{verbatim} or equivalently, \begin{verbatim} latexmk -pdf inlinemovie3 \end{verbatim} \begin{center} \begin{asy} settings.render=4; settings.prc=false; import graph3; import animate; currentprojection=orthographic(1,-2,0.5); animation A=animation("movie3"); int n=20; for(int i=0; i < n; ++i) { picture pic; size3(pic,12cm,12cm,8cm); real k=i/n*pi; real f(pair z) {return 4cos(abs(z)-k)*exp(-abs(z)/6);} draw(pic,surface(f,(-4pi,-4pi),(4pi,4pi),Spline),paleblue); draw(pic,shift(i*6Z/n)*unitsphere,yellow); A.add(pic); } label(A.pdf("autoplay,loop",delay=20,keep=!settings.inlinetex)); \end{asy} %Uncomment the following line when not using the [inline] package option: %\ASYanimategraphics[autoplay,loop]{50}{movie3}{}{} \end{center} \end{document} asymptote-3.05/examples/animations/glmovie.asy0000644000000000000000000000063615031566105020333 0ustar rootrootsettings.autoplay=true; settings.loop=true; import graph3; import animate; currentprojection=orthographic(1,-2,0.5); animation A; int n=25; for(int i=0; i < n; ++i) { picture pic; size3(pic,6cm); real k=i/n*pi; real f(pair z) {return 4cos(abs(z)-k)*exp(-abs(z)/6);} draw(pic,surface(f,(-4pi,-4pi),(4pi,4pi),Spline),paleblue); draw(pic,shift(i*6Z/n)*unitsphere,yellow); A.add(pic); } A.glmovie(); asymptote-3.05/examples/animations/pdfmovie.asy0000644000000000000000000000050615031566105020476 0ustar rootrootimport animate; import patterns; settings.tex="pdflatex"; animation a; add("brick",brick(black)); int n=20; for(int i=0; i < 3.5n; ++i) { picture pic; size(pic,100); path g=circle((0,sin(pi/n*i)),1); fill(pic,g,mediumred); fill(pic,g,pattern("brick")); a.add(pic); } label(a.pdf("controls",multipage=false)); asymptote-3.05/examples/animations/externalmovie.asy0000644000000000000000000000063315031566105021550 0ustar rootroot// Embed a movie to be run in an external window. import external; // External movies require the pdflatex engine. settings.tex="pdflatex"; // Generated needed mpeg file if it doesn't already exist. asy("mp4","wheel"); // Produce a pdf file. settings.outformat="pdf"; // External movie: viewable even with the Linux version of acroread. label(embed("wheel.mp4"),(0,0),N); label(link("wheel.mp4"),(0,0),S); asymptote-3.05/examples/animations/embeddedu3d.asy0000644000000000000000000000030415031566105021026 0ustar rootroot// An embedded U3D object; // import embed; settings.tex="pdflatex"; label(embedplayer("dice.u3d","dice","activate=pagevisible,3Droo=27", settings.paperwidth,settings.paperheight)); asymptote-3.05/examples/animations/slidemovies.asy0000644000000000000000000000233715031566105021214 0ustar rootroot// Slide demo. // Command-line options to enable stepping and/or reverse video: // asy [-u stepping=true] [-u reverse=true] slidedemo orientation=Landscape; settings.tex="pdflatex"; import slide; // Optional movie modules: import animate; // For portable embedded PDF movies access external; // For portable external movies access embed; // For non-portable embedded movies usersetting(); titlepage("Slides with {\tt Asymptote}: Animations","John C. Bowman", "University of Alberta","\today","https://asymptote.sourceforge.io"); title("Embedded PDF movies (portable)"); animation a=animation("A"); animation b=animation("B"); int n=20; for(int i=0; i < 2n; ++i) { picture pic; size(pic,100); draw(pic,shift(0,sin(pi/n*i))*unitsquare); a.add(pic); if(i < 1.5n) b.add(rotate(45)*pic); } display(a.pdf("autoplay,loop,controls",multipage=false)); display(b.pdf("controls",multipage=false)); // Generated needed files if they don't already exist. asy("mp4","wheel"); title("External Movie (portable)"); display(external.embed("wheel.mp4",20cm,5.6cm)); display(external.link("wheel.mp4")); title("Embedded Movie (not portable)"); display(embed.embed("wheel.mp4",20cm,5.6cm)); display(embed.link("wheel.mp4")); asymptote-3.05/examples/animations/heatequation.asy0000644000000000000000000000334015031566105021353 0ustar rootrootimport graph3; import palette; import animate; settings.tex="pdflatex"; settings.render=0; settings.prc=false; unitsize(1cm); animation a; currentprojection=perspective(-20,-18,18); currentlight=light(1,1,10); int n=26; real L=2.5; real dx=2*L/n; real CFL=0.125; real dt=CFL*dx^2; real[][] Z=new real[n][n]; real[][] W=new real[n][n]; guide initcond1=shift((-1,-1))*scale(0.5)*unitcircle; guide initcond2=shift((0.5,0))*yscale(1.2)*unitcircle; real f(pair p) {return (inside(initcond1,p)||inside(initcond2,p)) ? 2 : 0;} //Initialize for(int i=0; i < n; ++i) for (int j=0; j < n; ++j) Z[i][j]=f((-L,-L)+(2*L/n)*(i,j)); real f(pair t) { int i=round((n/2)*(t.x/L+1)); int j=round((n/2)*(t.y/L+1)); if(i > n-1) i=n-1; if(j > n-1) j=n-1; return Z[i][j]; } surface sf; void advanceZ(int iter=20) { for(int k=0; k < iter; ++k) { for(int i=0; i < n; ++i) for(int j=0; j < n; ++j) W[i][j]=0; for(int i=1; i < n-1; ++i) for(int j=1; j< n-1; ++j) W[i][j]=Z[i][j]+(dt/dx^2)*(Z[i+1][j]+Z[i-1][j]+Z[i][j-1]+Z[i][j+1] -4*Z[i][j]); for(int i=0; i < n; ++i) for(int j=0; j < n; ++j) Z[i][j]=W[i][j]; }; } pen[] Pal=Rainbow(96); int endframe=40; for(int fr=0; fr < endframe; ++fr) { if(fr == 0) {// smoothing of initial state; no Spline, but full grid advanceZ(3); sf=surface(f,(-L,-L),(L,L),nx=n); } else // use Spline and fewer grid points to save memory sf=surface(f,(-L,-L),(L,L),nx=round(n/2),Spline); sf.colors(palette(sf.map(zpart),Pal[0:round(48*max(sf).z)])); draw(sf); a.add(); erase(); advanceZ(30); }; label(a.pdf(delay=400,"controls,loop")); shipout(bbox(3mm,darkblue+3bp+miterjoin,FillDraw(fillpen=paleblue)),"pdf"); asymptote-3.05/examples/animations/embeddedmovie.asy0000644000000000000000000000076715031566105021467 0ustar rootroot// An embedded movie; // // See http://mirror.ctan.org/macros/latex/contrib/media9/doc/media9.pdf // for documentation of the options. import embed; // Add embedded movie //import external; // Add external movie (use this form under Linux). // Generated needed mp4 file if it doesn't already exist. asy("mp4","wheel"); // Produce a pdf file. settings.outformat="pdf"; settings.twice=true; // An embedded movie: label(embed("wheel.mp4",20cm,5.6cm),(0,0),N); label(link("wheel.mp4"),(0,0),S); asymptote-3.05/examples/animations/earthmoon.asy0000644000000000000000000000357715031566105020674 0ustar rootrootimport graph3; import solids; import three; import animate; settings.render=2; settings.tex="pdflatex"; settings.prc=false; settings.thick=false; settings.outformat="mpg"; currentprojection=orthographic(5,4,2); currentlight=light(specular=black,(0.1,-0.1,1)); size(15cm,0); animation A; real Rst=20, Rl=0.7, Rtl=5; real ast=20, est=0.3, bst=ast*sqrt(1-est^2), cst=ast*est; real atl=5, etl=0.8, btl=atl*sqrt(1-etl^2), ctl=atl*etl; real xST(real t) {return ast*cos(t)+cst;} real yST(real t) {return bst*sin(t);} real zST(real t) {return 0;} real xTL(real t) {return atl*cos(27t);} real yTL(real t) {return btl*sin(27t);} real zTL(real t) {return 0;} real xLl(real t) {return Rl*cos(27t);} real yLl(real t) {return Rl*sin(27t);} real zLl(real t) {return 0;} real xTt(real t) {return Rtl*cos(100t)/5;} real yTt(real t) {return Rtl*sin(100t)/5;} real zTt(real t) {return 0;} real xl(real t) {return xST(t)+xTL(t)+xLl(t);} real yl(real t) {return yST(t)+yTL(t)+yLl(t);} real zl(real t) {return 0;} real xt(real t) {return xST(t)+xTt(t);} real yt(real t) {return yST(t)+yTt(t);} real zt(real t) {return 0;} real xL(real t) {return xST(t)+xTL(t);} real yL(real t) {return yST(t)+yTL(t);} real zL(real t) {return 0;} path3 Pl=graph(xl,yl,zl,0,2pi,1000),Pt=graph(xt,yt,zt,0,2pi,3000), Pts=graph(xST,yST,zST,0,2pi,500); picture pic; draw(pic,Pl,lightgray); draw(pic,Pt,lightblue); draw(pic,Pts,blue+dashed); draw(pic,shift(cst,0,0)*scale3(Rtl/2)*unitsphere,yellow); surface terre=scale3(Rtl/5)*unitsphere; surface lune=scale3(Rl)*unitsphere; int n=50; real step=2pi/n; for(int i=0; i < n; ++i) { real k=i*step; add(pic); draw(shift(xL(k),yL(k),0)*lune,lightgray); draw(shift(xST(k),yST(k),0)*terre,lightblue+lightgreen); A.add(); erase(); } A.movie(BBox(1mm,Fill(Black)),delay=500, options="-density 288x288 -geometry 50%x"); asymptote-3.05/examples/animations/wavepacket.asy0000644000000000000000000000273215031566105021022 0ustar rootroot// Author : Philippe Ivaldi // http://www.piprime.fr/ // 2006/11/10 import animation; import graph; unitsize(x=2cm,y=1.5cm); typedef real realfcn(real); real lambda=4; real T=2; real [] k=new real[3]; real [] w=new real[3]; k[0]=2pi/lambda; w[0]=2pi/T; real dk=-.5; k[1]=k[0]-dk; k[2]=k[0]+dk; real dw=1; w[1]=w[0]-dw; w[2]=w[0]+dw; real vp=w[1]/k[1]; real vg=dw/dk; realfcn F(real x) { return new real(real t) { return cos(k[1]*x-w[1]*t)+cos(k[2]*x-w[2]*t); }; }; realfcn G(real x) { return new real(real t) { return 2*cos(0.5*(k[2]-k[1])*x+0.5*(w[1]-w[2])*t); }; }; realfcn operator -(realfcn f) {return new real(real t) {return -f(t);};}; animation A; real tmax=abs(2pi/dk); real xmax=abs(2pi/dw); pen envelope=0.8*blue; pen fillpen=lightgrey; int n=50; real step=tmax/(n-1); for(int i=0; i < n; ++i) { save(); real t=i*step; real a=xmax*t/tmax-xmax/pi; real b=xmax*t/tmax; path f=graph(F(t),a,b); path g=graph(G(t),a,b); path h=graph(-G(t),a,b); fill(buildcycle(reverse(f),g),fillpen); draw(f); draw(g,envelope); draw(h,envelope); A.add(); restore(); } for(int i=0; i < n; ++i) { save(); real t=i*step; real a=-xmax/pi; real b=xmax; path f=graph(F(t),a,b); path g=graph(G(t),a,b); path h=graph(-G(t),a,b); path B=box((-xmax/pi,-2),(xmax,2)); fill(buildcycle(reverse(f),g,B),fillpen); fill(buildcycle(f,g,reverse(B)),fillpen); draw(f); draw(g,envelope); draw(h,envelope); A.add(); restore(); } A.movie(0,10); asymptote-3.05/examples/animations/dice.u3d0000644000000000000000000047164015031566105017503 0ustar rootrootU3DRx sj CreatedBy"3dif.x3d 4.0.17.1382 (3.5.10.1242)RHAdobeUnitsMeters0ÿÿÿÿÿÿtobject0!ÿÿÿOobject0€?€?€?€?ÿÿÿt_dice!ÿÿÿT_diceobject0€?€?€?€?ÿÿÿ¸object44"ÿÿÿcobject44_dice€?€?€?€?object44Eÿÿÿ$object44Materialÿÿÿ|_sphere0!ÿÿÿW_sphere0object0€?€?€?€?ÿÿÿÀobject42"ÿÿÿfobject42_sphere0€?€?€?À@€À€?object42Eÿÿÿ%object42 Material1ÿÿÿ€ _sphere0_0!ÿÿÿY _sphere0_0object0€?€?€?€?ÿÿÿÀobject40"ÿÿÿhobject40 _sphere0_0€?€?€?@À€À€?object40Eÿÿÿ%object40 Material1ÿÿÿ€ _sphere0_1!ÿÿÿY _sphere0_1object0€?€?€?€?ÿÿÿÀobject38"ÿÿÿhobject38 _sphere0_1€?€?€?À@€@€?object38Eÿÿÿ%object38 Material2ÿÿÿ„ _sphere0_0_1!ÿÿÿ[ _sphere0_0_1object0€?€?€?€?ÿÿÿÄobject36"ÿÿÿjobject36 _sphere0_0_1€?€?€?@À€@€?object36Eÿÿÿ%object36 Material2ÿÿÿ„ _sphere0_1_2!ÿÿÿ[ _sphere0_1_2object0€?€?€?€?ÿÿÿÄobject34"ÿÿÿjobject34 _sphere0_1_2€?€?€?€@€?object34Eÿÿÿ%object34 Material2ÿÿÿ„ _sphere0_1_3!ÿÿÿ[ _sphere0_1_3object0€?€?€?€?ÿÿÿÄobject32"ÿÿÿjobject32 _sphere0_1_3€?€?€?€À@À?€?object32Eÿÿÿ%object32 Material3ÿÿÿˆ_sphere0_0_1_3!ÿÿÿ]_sphere0_0_1_3object0€?€?€?€?ÿÿÿÄobject30"ÿÿÿlobject30_sphere0_0_1_3€?€?€?€À@À¿€?object30Eÿÿÿ%object30 Material3ÿÿÿˆ_sphere0_1_3_4!ÿÿÿ]_sphere0_1_3_4object0€?€?€?€?ÿÿÿÄobject28"ÿÿÿlobject28_sphere0_1_3_4€?€?€?€ÀÀ?€?object28Eÿÿÿ%object28 Material3ÿÿÿŒ_sphere0_0_1_3_4!ÿÿÿ__sphere0_0_1_3_4object0€?€?€?€?ÿÿÿÈobject26"ÿÿÿnobject26_sphere0_0_1_3_4€?€?€?€ÀÀÀ¿€?object26Eÿÿÿ%object26 Material3ÿÿÿŒ_sphere0_1_2_3_4!ÿÿÿ__sphere0_1_2_3_4object0€?€?€?€?ÿÿÿÈobject24"ÿÿÿnobject24_sphere0_1_2_3_4€?€?€?€ÀÀÀ?€?object24Eÿÿÿ%object24 Material3ÿÿÿ_sphere0_1_2_3_5_6!ÿÿÿa_sphere0_1_2_3_5_6object0€?€?€?€?ÿÿÿÈobject22"ÿÿÿpobject22_sphere0_1_2_3_5_6€?€?€?€@€?object22Eÿÿÿ%object22 Material4ÿÿÿ_sphere0_1_2_3_5_7!ÿÿÿa_sphere0_1_2_3_5_7object0€?€?€?€?ÿÿÿÈobject20"ÿÿÿpobject20_sphere0_1_2_3_5_7€?€?€?@€@À€?object20Eÿÿÿ%object20 Material4ÿÿÿ”_sphere0_1_2_3_5_6_7!ÿÿÿc_sphere0_1_2_3_5_6_7object0€?€?€?€?ÿÿÿÌobject18"ÿÿÿrobject18_sphere0_1_2_3_5_6_7€?€?€?@€@@€?object18Eÿÿÿ%object18 Material4ÿÿÿ”_sphere0_1_2_3_5_7_8!ÿÿÿc_sphere0_1_2_3_5_7_8object0€?€?€?€?ÿÿÿÌobject16"ÿÿÿrobject16_sphere0_1_2_3_5_7_8€?€?€?À€ÀÀ€?object16Eÿÿÿ%object16 Material5ÿÿÿ˜_sphere0_1_2_3_5_6_7_8!ÿÿÿe_sphere0_1_2_3_5_6_7_8object0€?€?€?€?ÿÿÿÌobject14"ÿÿÿtobject14_sphere0_1_2_3_5_6_7_8€?€?€?À€À@€?object14Eÿÿÿ%object14 Material5ÿÿÿ”_sphere0_1_2_3_5_7_9!ÿÿÿc_sphere0_1_2_3_5_7_9object0€?€?€?€?ÿÿÿÌobject12"ÿÿÿrobject12_sphere0_1_2_3_5_7_9€?€?€?@€ÀÀ€?object12Eÿÿÿ%object12 Material5ÿÿÿ˜_sphere0_1_2_3_5_6_7_9!ÿÿÿe_sphere0_1_2_3_5_6_7_9object0€?€?€?€?ÿÿÿÌobject10"ÿÿÿtobject10_sphere0_1_2_3_5_6_7_9€?€?€?@€À@€?object10Eÿÿÿ%object10 Material5ÿÿÿ˜_sphere0_1_2_3_5_7_8_9!ÿÿÿe_sphere0_1_2_3_5_7_8_9object0€?€?€?€?ÿÿÿÈobject8"ÿÿÿrobject8_sphere0_1_2_3_5_7_8_9€?€?€?À€@À€?object8Eÿÿÿ$object8 Material4ÿÿÿœ_sphere0_1_2_3_5_6_7_8_9!ÿÿÿg_sphere0_1_2_3_5_6_7_8_9object0€?€?€?€?ÿÿÿÈobject6"ÿÿÿtobject6_sphere0_1_2_3_5_6_7_8_9€?€?€?À€@@€?object6Eÿÿÿ$object6 Material4ÿÿÿŒ_sphere0_1_3_10!ÿÿÿ^_sphere0_1_3_10object0€?€?€?€?ÿÿÿÀobject4"ÿÿÿkobject4_sphere0_1_3_10€?€?€?€@€?object4Eÿÿÿ$object4 Material6ÿÿÿŒ_sphere0_1_3_4_12!ÿÿÿ`_sphere0_1_3_4_12object0€?€?€?€?ÿÿÿÄobject2"ÿÿÿmobject2_sphere0_1_3_4_12€?€?€?€ÀÀ¿€?object2Eÿÿÿ$object2 Material3ÿÿÿŒ AmbientLight#ÿÿÿb AmbientLight€?€?€?€? AmbientLightÿÿÿœobject441ÿÿÿvobject44 èèèسÝ7€8€8€8€8Êh?¿\|?ÿÿÿœobject421ÿÿÿvobject42àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject401ÿÿÿvobject40àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject381ÿÿÿvobject38àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject361ÿÿÿvobject36àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject341ÿÿÿvobject34àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject321ÿÿÿvobject32àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject301ÿÿÿvobject30àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject281ÿÿÿvobject28àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject261ÿÿÿvobject26àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject241ÿÿÿvobject24àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject221ÿÿÿvobject22àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject201ÿÿÿvobject20àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject181ÿÿÿvobject18àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject161ÿÿÿvobject16àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject141ÿÿÿvobject14àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject121ÿÿÿvobject12àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject101ÿÿÿvobject10àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject81ÿÿÿuobject8àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject61ÿÿÿuobject6àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject41ÿÿÿuobject4àrr™rrèèè€6€8€8€8€8Êh?¿\|?ÿÿÿœobject21ÿÿÿuobject2àrr™rrèèè€6€8€8€8€8Êh?¿\|?Sÿÿÿ0MaterialMaterialSÿÿÿ2 Material1 Material1Sÿÿÿ2 Material2 Material2Sÿÿÿ2 Material3 Material3Sÿÿÿ2 Material4 Material4Sÿÿÿ2 Material5 Material5Sÿÿÿ2 Material6 Material6TÿÿÿFMaterial?òðð=òðð=òðð=ÂÀ@?ÂÀ@?ÂÀ@?ÂÀ@?ÂÀ@?ÂÀ@?ÍÌL>€?TÿÿÿG Material1?ÍÌL>ÍÌL>ÍÌL>ÍÌL>ÍÌL?ÍÌL>ÍÌL>ÍÌL>ÍÌL>9Q¼>€?TÿÿÿG Material2?ÍÌL>ÍÌL>ÍÌL>€??ÍÌL?ÍÌL>ÍÌL>ÍÌL>9Q¼>€?TÿÿÿG Material3?ÍÌL>ÍÌL>ÍÌL>š™™>š™™>€?ÍÌL>ÍÌL>ÍÌL>9Q¼>€?TÿÿÿG Material4?ÍÌL>ÍÌL>ÍÌL>€?€?ÍÌL>ÍÌL>ÍÌL>9Q¼>€?TÿÿÿG Material5?ÍÌL>ÍÌL>ÍÌL>€?ÍÌL>ÍÌL>ÍÌL>9Q¼>€?TÿÿÿG Material6?ÍÌL>ÍÌL>ÍÌL>€?€?ÍÌL>ÍÌL>ÍÌL>9Q¼>€?Qÿÿÿ7 AmbientLightÍÌL>ÍÌL>ÍÌL>€?€?4C€?ÿÿÿ;ÿÿÿ=object44 €À€@€@€À€@€À€@€@€À€@€@€@€À€À€@€À€À€À€@€À€À€@€À€@€?€?€¿€¿€?€¿€?€?€?€?€?Á©hŠû«$±º«—ÚˆäòM°l5§Ažr“ZQÍ«Ÿ;ÿÿÿRobject42àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿€=>@>€> >À>à>?? ?0?@?P?`?p?€?>€=>>>@>>€>> >>À>>à>>?>?> ?>0?>@?>P?>`?>p?>€?>€>€=€>>€>@>€>€>€> >€>À>€>à>€>?€>?€> ?€>0?€>@?€>P?€>`?€>p?€>€?€>À>€=À>>À>@>À>€>À> >À>À>À>à>À>?À>?À> ?À>0?À>@?À>P?À>`?À>p?À>€?À>?€=?>?@>?€>? >?À>?à>????? ??0??@??P??`??p??€?? ?€= ?> ?@> ?€> ? > ?À> ?à> ?? ?? ? ? ?0? ?@? ?P? ?`? ?p? ?€? ?@?€=@?>@?@>@?€>@? >@?À>@?à>@??@??@? ?@?0?@?@?@?P?@?`?@?p?@?€?@?`?€=`?>`?@>`?€>`? >`?À>`?à>`??`??`? ?`?0?`?@?`?P?`?`?`?p?`?€?`?€?€=€?>€?@>€?€>€? >€?À>€?à>€??€??€? ?€?0?€?@?€?P?€?`?€?p?€?€?€?Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject40àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿ €= > @>€>  >À> à> ?? ?0? @? P?`?p?€? > €=>>>@>>€>>  >> À>>à>>/?>?> ?> 0?>@?>P?>`?> p?> €?>€>€=€>>€> @>€> €>€> >€>À>€>à>€> ?€> ?€> ?€>0?€>@?€> P?€> `?€>p?€>€?€>À> €=À> >À>@>À>€>À> >À> À>À> à>À>?À>?À> ?À> 0?À> @?À>P?À> `?À>p?À> €?À> ?€=?">?@>? €>?  >?À>?$à>??? ?? ??0??&@??P?? `?? p??€??( ?€= ? > ? @> ?€> ?* > ?À> ? à> ? ? ?? ?, ? ?0? ? @? ? P? ?`? ?.p? ?€? ? @? €=@?>@?O@>@?€>@?  >@? À>@?à>@?2?@??@? ?@? 0?@?@?@?4P?@?`?@? p?@? €?@?`?6€=`?>`? @>`? €>`? >`?8À>`?à>`? ?`? ?`? ?`?:0?`?@?`? P?`? `?`?p?`?<€?`?€? €=€? >€?@>€?>€>€? >€? À>€? à>€??€?@?€? ?€? 0?€? @?€?P?€?B`?€?p?€? €?€? Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject38àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿i€=Z>Z@>k€>\ >\À>mà>^?^?o ?`0?`@?bP?b`?qp?f€?f>q€=>j>>j@>>q€>>n >>nÀ>>qà>> ?>?> ?>$øô 0?>@?>P?>`?>p?>$øô €?>€>€=€>>€>@>€>$øô €>€> >€>À>€>à>€>?€>$øô ?€> ?€>0?€>@?€>P?€>$øô `?€>p?€>€?€>À>€=À>$øô >À>@>À>€>À> >À>À>À>$øô à>À>?À>?À> ?À>0?À>$øô @?À>P?À>`?À>p?À>€?À>$øô ?€=?>?@>?€>?$øô  >?À>?à>?????$øô ??0??@??P??`??$øô p??€?? ?€= ?> ?$øô @> ?€> ? > ?À> ?à> ?$øô ? ?? ? ? ?0? ?@? ?$øô P? ?`? ?p? ?€? ?@?$øô €=@?>@?@>@?€>@? >@?$øô À>@?à>@??@??@? ?@?$øô 0?@?@?@?P?@?`?@?p?@?$øô €?@?`?€=`?>`?@>`?$øô €>`? >`?À>`?à>`??`?$øô ?`? ?`?0?`?@?`?P?`?$øô `?`?p?`?€?`?€?€=€?$øô >€?@>€?€>€? >€?À>€?$øô à>€??€??€? ?€?0?€?$øô @?€?P?€?`?€?p?€?€?€?$øô Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject36àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿€=$øô >@>€> >À>$øô à>?? ?0?$øô @?P?`?p?€?$øô >€=>>>@>>€>>$øô  >>À>>à>>?>?>$øô ?>0?>@?>P?>`?>$øô p?>€?>€>€=€>>€>$øô @>€>€>€> >€>À>€>à>€>$øô ?€>?€> ?€>0?€>@?€>$øô P?€>`?€>p?€>€?€>À>$øô €=À>>À>@>À>€>À> >À>hÀ>À>à>À>?À>?À> ?À>0?À>@?À>P?À>`?À>p?À>€?À>?€=?>?@>?€>? >?À>?>à>?>??>??> ??>0??>@??>P??>`??>p??>€??> ?>€= ?>> ?>@> ?>€> ?> > ?>À> ?€>à> ?€>? ?€>? ?€> ? ?€>0? ?€>@? ?€>P? ?€>`? ?€>p? ?€>€? ?€>@?€>€=@?€>>@?€>@>@?€>€>@?€> >@?€>À>@?À>à>@?À>?@?À>?@?À> ?@?À>0?@?À>@?@?À>P?@?À>`?@?À>p?@?À>€?@?À>`?À>€=`?À>>`?À>@>`?À>€>`?À> >`?À>À>`??à>`???`???`?? ?`??0?`??@?`??P?`??`?`??p?`??€?`??€??€=€??>€??@>€??€>€?? >€??À>€? ?à>€? ??€? ??€? ? ?€? ?0?€? ?@?€? ?P?€? ?`?€? ?p?€? ?€?€? ?Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject34àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿2€=#>#@>4€>% >%À>6à>'?'?8 ?)0?)@?:P?+`?+p?<€?->-€=>>>>/@>>/€>>@ >>!À>>1à>>B?>3?>3 ?>D0?>5@?>5P?>F`?>7p?>7€?>H€>9€=€>9>€>J@>€>;€>€>; >€>LÀ>€>=à>€>=?€>N?€>? ?€>?0?€>P@?€>1P?€>A`?€>Rp?€>C€?€>CÀ>T€=À>E>À>E@>À>V€>À>G >À>GÀ>À>Xà>À>I?À>I?À>Z ?À>K0?À>K@?À>\P?À>M`?À>Mp?À>^€?À>O?O€=?`>?A@>?Q€>?b >?SÀ>?Sà>?d??U??U ??f0??W@??WP??h`??Yp??Y€??j ?[€= ?[> ?l@> ?]€> ?] > ?nÀ> ?_à> ?_? ?p? ?Q ? ?q0? ?d@? ?dP? ?q`? ?hp? ?h€? ?q@?l€=@?l>@?q@>@?p€>@?p >@?Pû À>@?^ƒl?à>@?Ô‹Š>?@?ôµ>?@?^ƒl? ?@?Ջо0?@?ö>@?@?^ƒl?P?@?֋о`?@?òµ¾p?@?^ƒl?€?@?Ö‹Š>`?ö¾€=`?ó5?>`?ÿÿÿ>@>`?u='?€>`?ó5? >`?¿À>`?Ó‹Š>à>`?ó5??`?¿?`?s='¿ ?`?ó5?0?`??@?`?Ì‹Š¾P?`?ïÃ>`?`?t='?p?`?y‚Z?€?`?ïÃ>€?u='¿€=€?òµ>>€?ïÃ>@>€?w='¿€>€?w‚Z¿ >€?ïÃ>À>€?v='?à>€?éµ¾?€?.½;³?€?ó5? ?€?_ƒl?0?€?.½;³@?€?ô5¿P?€?ïÃ>`?€?.½;³p?€?ö5¿€?€?]ƒl¿Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject32àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿…ýG2€=zmh?>e>@>ÆaÊ>€>zmh? >©Ÿ¾À>ŸÂ>à>zmh??e¾?Äaʾ ?zmh?0?©Ÿ>@?™Â¾P?6%5?`?°|ü>p?Ž(?€?6%5?>„Ž¿€=>õ†>>>6%5?@>>°|ü¾€>>(¿ >>5%5?À>>„Ž?à>>ñ†¾?>è,Ä>?>EQ&? ?>tðZ?0?>è,Ä>@?>R(¿P?>‹ª²>`?>è,Ä>p?>GQ&¿€?>rðZ¿€>è,Ä>€=€>U(?>€>‡ª²¾@>€> !›2€>€>ô5? >€>_ƒl?À>€>mJ±2à>€>ô5¿?€>ïÃ>?€>»sÇ2 ?€>ö5¿0?€>^ƒl¿@?€>mJ±2P?€>ö5?`?€>ïþp?€>ê,ľ€?€>S(?À>AûY?€=À>ì,ľ>À>EQ&¿@>À>rJ·>€>À>ì,ľ >À>T(¿À>À>@ûY¿à>À>ì,ľ?À>FQ&??À>jJ·¾ ?À>6%5¿0?À>ƒŽ?@?À>‡6&?P?À>6%5¿`?À>°|ü¾p?À>UÄŽ>€?À>6%5¿?„Ž¿€=?†6&¿>?6%5¿@>?°|ü>€>?QÄŽ¾ >?zmh¿À>?©Ÿ>à>?8”Á>??zmh¿??e¾ ??·C9>0??zmh¿@??©Ÿ¾P??7”Á¾`??zmh¿p??e>€??³C9¾ ?€¿€= ?xø > ?@> ?€> ? > ?À> ?à> ?? ?? ? ? ?0? ?@? ?P? ?`? ?p? ?€? ?@?€=@?>>@?>@>@?>€>@?> >@?>À>@?>à>@?>?@?>?@?> ?@?>0?@?>@?@?>P?@?>`?@?>p?@?>€?@?>`?>€=`?€>>`?€>@>`?€>€>`?€> >`?€>À>`?€>à>`?€>?`?€>?`?€> ?`?€>0?`?€>@?`?€>P?`?€>`?`?€>p?`?€>€?`?€>€?€>€=€?À>>€?À>@>€?À>€>€?À> >€?À>À>€?À>à>€?À>?€?À>?€?À> ?€?À>0?€?À>@?€?À>P?€?À>`?€?À>p?€?À>€?€?À>Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject30àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿€=>@>€> >À>à>?? ?0?@?P?`?p?€?>€=>>>@>>€>> >>À>>à>>?>?> ?>0?>@?>P?>`?>p?>€?>€>€=€>>€>@>€>€>€> >€>À>€>à>€>?€>?€> ?€>0?€>@?€>P?€>`?€>p?€>€?€>À>€=À>>À>@>À>€>À> >À>À>À>à>À>?À>?À> ?À>0?À>@?À>P?À>`?À>p?À>€?À>?€=?>?@>?€>? >?À>?à>????? ??0??@??P??`??p??€?? ?€= ?> ?@> ?€> ? > ?À> ?à> ?? ?? ? ? ?0? ?@? ?P? ?`? ?p? ?€? ?@?€=@?>@?@>@?€>@? >@?À>@?à>@??@??@? ?@?0?@?@?@?P?@?`?@?p?@?€?@?`?€=`?>`?@>`?€>`? >`?À>`?à>`??`??`? ?`?0?`?@?`?P?`?`?`?p?`?€?`?€?€=€?>€?@>€?€>€? >€?À>€?à>€??€??€? ?€?0?€?@?€?P?€?`?€?p?€?€?€?Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject28àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿€=>$øô @>€> >À>à>$øô ?? ?0?@?$øô P?`?p?€?>$øô €=>>>@>>€>> >>$øô À>>à>>?>?> ?>$øô 0?>@?>P?>`?>p?>$øô €?>€>€=€>>€>@>€>$øô €>€> >€>À>€>à>€>?€>$øô ?€> ?€>0?€>@?€>P?€>$øô `?€>p?€>€?€>À>€=À>$øô >À>@>À>€>À> >À>À>À>$øô à>À>?À>?À> ?À>0?À>$øô @?À>P?À>`?À>p?À>€?À>$øô ?€=?>?@>?€>?$øô  >?À>?à>?????$øô ??0??@??P??`??$øô p??€?? ?€= ?> ?$øô @> ?€> ? > ?À> ?à> ?$øô ? ?? ? ? ?0? ?@? ?$øô P? ?`? ?p? ?€? ?@?$øô €=@?>@?@>@?€>@? >@?$øô À>@?à>@??@??@? ?@?$øô 0?@?@?@?P?@?`?@?p?@?$øô €?@?`?€=`?>`?@>`?$øô €>`? >`?À>`?à>`??`?$øô ?`? ?`?0?`?@?`?P?`?$øô `?`?p?`?€?`?€?€=€?$øô >€?@>€?€>€? >€?À>€?à>€?…ýG2?€?zmh??€?e> ?€?ÆaÊ>0?€?zmh?@?€?©Ÿ¾P?€?ŸÂ>`?€?zmh?p?€?e¾€?€?ÄaʾÈðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject26àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿áJÖ>€=·C9>>zmh?@>w¸¼€>8”Á> >zmh?À>áJÖ¾à>´C9¾?zmh??T¸< ?8”Á¾0?zmh?@?Èà4?P?WÄŽ>`?5%5?p?ùï¼€?‡6&?>5%5?€=>Èà4¿>>QÄŽ¾@>>7%5?€>>jï< >>‡6&¿À>>5%5?à>>µul??>rJ·>?>é,Ä> ?>õ- »0?>AûY?@?>è,Ä>P?>µul¿`?>kJ·¾p?>ë,Ä>€?>©, ;€>CûY¿€=€>é,Ä>>€>€?@>€>ïÃ>€>€>!!›² >€>mJ1³À>€>^ƒl?à>€>¼sDz?€>€¿?€>ïþ ?€> !›²0?€>WÆó³@?€>^ƒl¿P?€>Ó÷„²`?€>´ul?p?€>Žª²>€?€>ë,ľÀ>®- ;€=À>rðZ?>À>ë,ľ@>À>µul¿€>À>ˆª²¾ >À>ë,ľÀ>À>ã. »à>À>rðZ¿?À>ë,ľ?À>Èà4? ?À>÷†>0?À>6%5¿@?À>Ÿï<P?À>Ž(?`?À>6%5¿p?À>Èà4¿€?À>ó†¾?6%5¿€=?7ð¼>?Ž(¿@>?6%5¿€>?ãJÖ> >? Â>À>?zmh¿à>?n¸<??ÅaÊ>??zmh¿ ??ãJÖ¾0??›Â¾@??zmh¿P??¦¸¼`??Çaʾp??zmh¿€??¬èC± ?€= ?> ?@> ?$øô €> ? > ?À> ?à> ?? ?$øô ? ? ? ?0? ?@? ?P? ?$øô `? ?p? ?€? ?@?€=@?$øô >@?@>@?€>@? >@?À>@?$øô à>@??@??@? ?@?0?@?$øô @?@?P?@?`?@?p?@?€?@?$øô `?€=`?>`?@>`?€>`?$øô  >`?À>`?à>`??`??`?$øô ?`?0?`?@?`?P?`?`?`?$øô p?`?€?`?€?€=€?>€?$øô @>€?€>€? >€?À>€?à>€?$øô ?€??€? ?€?0?€?@?€?$øô P?€?`?€?p?€?€?€?Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject24àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿€=>@>€> >À>à>?? ?0?@?P?`?p?€?>€=>>>@>>€>> >>À>>à>>?>?> ?>0?>@?>P?>`?>p?>€?>€>€=€>>€>@>€>€>€> >€>À>€>à>€>?€>?€> ?€>0?€>@?€>P?€>`?€>p?€>€?€>À>€=À>>À>@>À>€>À> >À>À>À>à>À>?À>?À> ?À>0?À>@?À>P?À>`?À>p?À>€?À>?€=?>?@>?€>? >?À>?à>????? ??0??@??P??`??p??€?? ?€= ?> ?@> ?€> ? > ?À> ?à> ?? ?? ? ? ?0? ?@? ?P? ?`? ?p? ?€? ?@?€=@?>@?@>@?€>@? >@?À>@?à>@??@??@? ?@?0?@?@?@?P?@?`?@?p?@?€?@?`?€=`?>`?@>`?€>`? >`?À>`?à>`??`??`? ?`?0?`?@?`?P?`?`?`?p?`?€?`?€?€=€?>€?@>€?€>€? >€?À>€?à>€??€??€? ?€?0?€?@?€?P?€?`?€?p?€?€?€?Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject22àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿€=>@>€> >À>à>?? ?0?@?P?`?p?€?>€=>>>@>>€>> >>À>>à>>?>?> ?>0?>@?>P?>`?>p?>€?>€>€=€>>€>@>€>€>€> >€>À>€>à>€>?€>?€> ?€>0?€>@?€>P?€>`?€>p?€>€?€>À>€=À>>À>@>À>€>À> >À>À>À>à>À>?À>?À> ?À>0?À>@?À>P?À>`?À>p?À>€?À>?€=?>?@>?€>? >?À>?à>????? ??0??@??P??`??p??€?? ?€= ?> ?@> ?€> ? > ?À> ?à> ?? ?? ? ? ?0? ?@? ?P? ?`? ?p? ?€? ?@?€=@?>@?@>@?€>@? >@?À>@?à>@??@??@? ?@?0?@?@?@?P?@?`?@?p?@?€?@?`?€=`?>`?@>`?€>`? >`?À>`?à>`??`??`? ?`?0?`?@?`?P?`?`?`?p?`?€?`?€?€=€?>€?@>€?€>€? >€?À>€?à>€??€??€? ?€?0?€?@?€?P?€?`?€?p?€?€?€?Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject20àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿áJÖ>€=·C9>>zmh?@>w¸¼€>8”Á> >zmh?À>áJÖ¾à>´C9¾?zmh??T¸< ?8”Á¾0?zmh?@?Èà4?P?WÄŽ>`?5%5?p?ùï¼€?‡6&?>5%5?€=>Èà4¿>>QÄŽ¾@>>7%5?€>>jï< >>‡6&¿À>>5%5?à>>µul??>rJ·>?>é,Ä> ?>õ- »0?>AûY?@?>è,Ä>P?>µul¿`?>kJ·¾p?>ë,Ä>€?>©, ;€>CûY¿€=€>é,Ä>>€>€?@>€>ïÃ>€>€>!!›² >€>mJ1³À>€>^ƒl?à>€>¼sDz?€>€¿?€>ïþ ?€> !›²0?€>WÆó³@?€>^ƒl¿P?€>Ó÷„²`?€>´ul?p?€>Žª²>€?€>ë,ľÀ>®- ;€=À>rðZ?>À>ë,ľ@>À>µul¿€>À>ˆª²¾ >À>ë,ľÀ>À>ã. »à>À>rðZ¿?À>ë,ľ?À>Èà4? ?À>÷†>0?À>6%5¿@?À>Ÿï<P?À>Ž(?`?À>6%5¿p?À>Èà4¿€?À>ó†¾?6%5¿€=?7ð¼>?Ž(¿@>?6%5¿€>?ãJÖ> >? Â>À>?zmh¿à>?n¸<??ÅaÊ>??zmh¿ ??ãJÖ¾0??›Â¾@??zmh¿P??¦¸¼`??Çaʾp??zmh¿€??¬èC± ?€= ?> ?@> ?€> ? > ?À> ?à> ?? ?? ? ? ?0? ?@? ?P? ?`? ?p? ?€? ?@?€=@?>@?@>@?€>@? >@?À>@?à>@??@??@? ?@?0?@?@?@?P?@?`?@?p?@?€?@?`?€=`?>`?@>`?€>`? >`?À>`?à>`??`??`? ?`?0?`?@?`?P?`?`?`?p?`?€?`?€?€=€?>€?@>€?€>€? >€?À>€?à>€??€??€? ?€?0?€?@?€?P?€?`?€?p?€?€?€?Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject18àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿áJÖ>€=·C9>>zmh?@>w¸¼€>8”Á> >zmh?À>áJÖ¾à>´C9¾?zmh??T¸< ?8”Á¾0?zmh?@?Èà4?P?WÄŽ>`?5%5?p?ùï¼€?‡6&?>5%5?€=>Èà4¿>>QÄŽ¾@>>7%5?€>>jï< >>‡6&¿À>>5%5?à>>µul??>rJ·>?>é,Ä> ?>õ- »0?>AûY?@?>è,Ä>P?>µul¿`?>kJ·¾p?>ë,Ä>€?>©, ;€>CûY¿€=€>é,Ä>>€>€?@>€>ïÃ>€>€>!!›² >€>mJ1³À>€>^ƒl?à>€>¼sDz?€>€¿?€>ïþ ?€> !›²0?€>WÆó³@?€>^ƒl¿P?€>Ó÷„²`?€>´ul?p?€>Žª²>€?€>ë,ľÀ>®- ;€=À>rðZ?>À>ë,ľ@>À>µul¿€>À>ˆª²¾ >À>ë,ľÀ>À>ã. »à>À>rðZ¿?À>ë,ľ?À>Èà4? ?À>÷†>0?À>6%5¿@?À>Ÿï<P?À>Ž(?`?À>6%5¿p?À>Èà4¿€?À>ó†¾?6%5¿€=?7ð¼>?Ž(¿@>?6%5¿€>?ãJÖ> >? Â>À>?zmh¿à>?n¸<??ÅaÊ>??zmh¿ ??ãJÖ¾0??›Â¾@??zmh¿P??¦¸¼`??Çaʾp??zmh¿€??¬èC± ?€= ?> ?@> ?€> ? > ?À> ?à> ?? ?? ? ? ?0? ?@? ?P? ?`? ?p? ?€? ?@?€=@?>@?@>@?€>@? >@?À>@?à>@??@??@? ?@?0?@?@?@?P?@?`?@?p?@?€?@?`?€=`?>`?@>`?€>`? >`?À>`?à>`??`??`? ?`?0?`?@?`?P?`?`?`?p?`?€?`?€?€=€?>€?@>€?€>€? >€?À>€?à>€??€??€? ?€?0?€?@?€?P?€?`?€?p?€?€?€?Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject16àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿€=>$øô @>€> >À>à>$øô ?? ?0?@?$øô P?`?p?€?>$øô €=>>>@>>€>> >>$øô À>>à>>?>?> ?>$øô 0?>@?>P?>`?>p?>$øô €?>€>€=€>>€>@>€>$øô €>€> >€>À>€>à>€>?€>$øô ?€> ?€>0?€>@?€>P?€>$øô `?€>p?€>€?€>À>€=À>$øô >À>@>À>€>À> >À>À>À>$øô à>À>?À>?À> ?À>0?À>$øô @?À>P?À>`?À>p?À>€?À>$øô ?€=?>?@>?€>?$øô  >?À>?à>?????$øô ??0??@??P??`??$øô p??€?? ?€= ?> ?$øô @> ?€> ? > ?À> ?à> ?$øô ? ?? ? ? ?0? ?@? ?$øô P? ?`? ?p? ?€? ?@?$øô €=@?>@?@>@?€>@? >@?$øô À>@?à>@??@??@? ?@?$øô 0?@?@?@?P?@?`?@?p?@?$øô €?@?`?€=`?>`?@>`?$øô €>`? >`?À>`?à>`??`?$øô ?`? ?`?0?`?@?`?P?`?$øô `?`?p?`?€?`?€?€=€?$øô >€?@>€?€>€? >€?À>€?à>€?…ýG2?€?zmh??€?e> ?€?ÆaÊ>0?€?zmh?@?€?©Ÿ¾P?€?ŸÂ>`?€?zmh?p?€?e¾€?€?ÄaʾÈðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject14àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿€=>@>€> >À>à>?? ?0?@?P?`?p?€?>€=>>>@>>€>> >>À>>à>>?>?> ?>0?>@?>P?>`?>p?>€?>€>€=€>>€>@>€>€>€> >€>À>€>à>€>?€>?€> ?€>0?€>@?€>P?€>`?€>p?€>€?€>À>€=À>>À>@>À>€>À> >À>À>À>à>À>?À>?À> ?À>0?À>@?À>P?À>`?À>p?À>€?À>?€=?>?@>?€>? >?À>?à>????? ??0??@??P??`??p??€?? ?€= ?> ?@> ?€> ? > ?À> ?à> ?? ?? ? ? ?0? ?@? ?P? ?`? ?p? ?€? ?@?€=@?>@?@>@?€>@? >@?À>@?à>@??@??@? ?@?0?@? @?@?P?@?`?@?p?@?€?@?`?€=`?>`?@>`?€>`? >`?À>`?à>`??`??`? ?`?0?`?@?`?P?`?`?`?p?`?€?`?€?€=€?>€?@>€?€>€? >€?À>€?à>€??€??€? ?€?0?€?@?€?P?€?`?€?p?€?€?€? Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject12àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿€=>$øô @>€> >À>à>$øô ?? ?0?@?$øô P?`?p?€?>$øô €=>>>@>>€>> >>$øô À>>à>>?>?> ?>$øô 0?>@?>P?>`?>p?>$øô €?>€>€=€>>€>@>€>$øô €>€> >€>À>€>à>€>?€>$øô ?€> ?€>0?€>@?€>P?€>$øô `?€>p?€>€?€>À>€=À>$øô >À>@>À>€>À> >À>À>À>$øô à>À>?À>?À> ?À>0?À>$øô @?À>P?À>`?À>p?À>€?À>$øô ?€=?>?@>?€>?$øô  >?À>?à>?????$øô ??0??@??P??`??$øô p??€?? ?€= ?> ?$øô @> ?€> ? > ?À> ?à> ?$øô ? ?? ? ? ?0? ?@? ?$øô P? ?`? ?p? ?€? ?@?$øô €=@?>@?@>@?€>@? >@?$øô À>@?à>@??@??@? ?@?$øô 0?@?@?@?P?@?`?@?p?@?$øô €?@?`?€=`?>`?@>`?$øô €>`? >`?À>`?à>`??`?$øô ?`? ?`?0?`?@?`?P?`?$øô `?`?p?`?€?`?€?€=€?$øô >€?@>€?€>€? >€?À>€?à>€?…ýG2?€?zmh??€?e> ?€?ÆaÊ>0?€?zmh?@?€?©Ÿ¾P?€?ŸÂ>`?€?zmh?p?€?e¾€?€?ÄaʾÈðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿRobject10àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿€=>@>€> >À>à>?? ?0?@?P?`?p?€?>€=>>>@>>€>> >>À>>à>>?>?> ?>0?>@?>P?>`?>p?>€?>€>€=€>>€>@>€>€>€> >€>À>€>à>€>?€>?€> ?€>0?€>@?€>P?€>`?€>p?€>€?€>À>€=À>>À>@>À>€>À> >À>À>À>à>À>?À>?À> ?À>0?À>@?À>P?À>`?À>p?À>€?À>?€=?>?@>?€>? >?À>?à>????? ??0??@??P??`??p??€?? ?€= ?> ?@> ?€> ? > ?À> ?à> ?? ?? ? ? ?0? ?@? ?P? ?`? ?p? ?€? ?@?€=@?>@?@>@?€>@? >@?À>@?à>@??@??@? ?@?0?@?@?@?P?@?`?@?p?@?€?@?`?€=`?>`?@>`?€>`? >`?À>`?à>`??`??`? ?`?0?`?@?`?P?`?`?`?p?`?€?`?€?€=€?>€?@>€?€>€? >€?À>€?à>€??€??€? ?€?0?€?@?€?P?€?`?€?p?€?€?€?Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿQobject8àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿€=o>o@>€>q >qÀ>ƒà>s?s?… ?u0?u@?xP?x`?‹p?|€?|>€=>€>>€@>>“€>>„ >>„À>>—à>>?>?> ?> 0?>@?>P?>`?>p?>€?>#€>'€=€>+>€>/@>€>3€>€>7 >€>;À>€>?à>€>C?€>G?€>K ?€>O0?€>S@?€>WP?€>[`?€>_p?€>c€?€>gÀ>k€=À>o>À>s@>À>w€>À>{ >À>À>À>ƒà>À>‡?À>‹?À> ?À>“0?À>—@?À>›P?À>Ÿ`?À>£p?À>§€?À>«?¯€=?³>?·@>?»€>?¿ >?ÃÀ>?Çà>?Ë??Ï??Ó ??×0??Û@??ßP??`??p??€?? ?€= ?> ? @> ? €> ? > ? À> ?à> ?? ?? ? ? ?0? ?@? ?P? ?`? ?p? ?€? ?@?€=@?>@?@>@?€>@?  >@? À>@?à>@? ?@? ?@? ?@?0?@?@?@?P?@?`?@?p?@?!€?@?`?€=`?#>`?@>`?€>`?% >`?À>`?à>`?'?`??`? ?`?)0?`?@?`?P?`?+`?`?p?`?€?`?-€?€=€?>€?/@>€? €>€?  >€?1À>€?"à>€?"?€?3?€?$ ?€?$0?€?5@?€?&P?€?&`?€?7p?€?(€?€?(Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿQobject6àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿Ô‹Š>€=ó5¿>¦÷(²@>t='?€>ó5¿ >ó5¿À>Ñ‹Š¾à>ó5¿?Ž*г?t='¿ ?ó5¿0?ïÃ>@?ö>P?^ƒl¿`?–ã¶±p?õµ>€?^ƒl¿>ïþ€=>ö¾>>^ƒl¿@>>JQa³€>>õµ¾ >>^ƒl¿À>>à>> ?>?> ?>$øô 0?>@?>P?>`?>p?>$øô €?>€>€=€>>€>@>€>$øô €>€> >€>À>€>à>€>?€>$øô ?€> ?€>0?€>@?€>P?€>$øô `?€>p?€>€?€>À>€=À>$øô >À>@>À>€>À> >À>À>À>$øô à>À>?À>?À> ?À>0?À>$øô @?À>P?À>`?À>p?À>€?À>$øô ?€=?>?@>?€>?$øô  >?À>?à>?????$øô ??0??@??P??`??$øô p??€?? ?€= ?> ?$øô @> ?€> ? > ?À> ?à> ?$øô ? ?? ? ? ?0? ?@? ?$øô P? ?`? ?p? ?€? ?@?$øô €=@?>@?@>@?€>@? >@?$øô À>@?à>@??@??@? ?@?$øô 0?@?@?@?P?@?`?@?p?@?$øô €?@?`?€=`?>`?@>`?$øô €>`? >`?À>`?à>`??`?$øô ?`? ?`?0?`?@?`?P?`?$øô `?`?p?`?€?`?€?€=€?$øô >€?@>€?€>€? >€?À>€?$øô à>€??€??€? ?€?0?€?$øô @?€?P?€?`?€?p?€?€?€?$øô Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿQobject4àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿i€=Z>Z@>k€>\ >\À>mà>^?^?o ?`0?`@?bP?b`?qp?f€?f>q€=>j>>j@>>q€>>n >>nÀ>>qà>>?>ïÃ>?>ö> ?>^ƒl?0?>•ã¶±@?>ôµ>P?>^ƒl?`?>ïþp?>ö¾€?>^ƒl?€>IQa³€=€>ôµ¾>€>^ƒl?@>€>ó5?€>€>Ô‹Š> >€>ó5?À>€>¦÷(²à>€>t='??€>ó5??€>ó5¿ ?€>Ñ‹Š¾0?€>ó5?@?€>Ž*гP?€>t='¿`?€>ó5?p?€>^ƒl?€?€>óµ>À>ïÃ>€=À>:Ä\²>À>y‚Z?@>À>ïÃ>€>À>^ƒl¿ >À>ïµ¾À>À>ïÃ>à>À>¼ý´?À>y‚Z¿?À>ïÃ> ?À>€?0?À>ïÃ>@?À>.½;³P?À>ºôn²`?À>^ƒl?p?À>.½;³€?À>€¿?ïþ€=?.½;³>?2´@>?^ƒl¿€>?.½;³ >?^ƒl?À>?óµ>à>?ïþ??:Ä\²??y‚Z? ??ïþ0??^ƒl¿@??ïµ¾P??ïþ`??¼ý´p??y‚Z¿€??ïþ ?ó5?€= ?Ô‹Š>> ?ó5¿@> ?¦÷(²€> ?t='? > ?ó5¿À> ?ó5¿à> ?Ñ‹Š¾? ?ó5¿? ?Ž*г ? ?t='¿0? ?ó5¿@? ?ïÃ>P? ?ö>`? ?^ƒl¿p? ?–ã¶±€? ?õµ>@?^ƒl¿€=@?ïþ>@?ö¾@>@?^ƒl¿€>@?JQa³ >@?õµ¾À>@?^ƒl¿à>@??@? ?@? ?@?0?@?$øô @?@?P?@?`?@?p?@?€?@?$øô `?€=`?>`?@>`?€>`?$øô  >`?À>`?à>`??`??`?$øô ?`?0?`?@?`?P?`?`?`?$øô p?`?€?`?€?€=€?>€?$øô @>€?€>€? >€?À>€?à>€?$øô ?€??€? ?€?0?€?@?€?$øô P?€?`?€?p?€?€?€?Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿;ÿÿÿQobject2àrr™€?ïÃ>^ƒl?ôµ>ö>^ƒl?Ô‹Š>Õ‹Š>^ƒl?ö>ôµ>^ƒl?•ã¶±ïÃ>^ƒl?ö¾ôµ>^ƒl?Õ‹Š¾Ô‹Š>^ƒl?ôµ¾ö>^ƒl?ïþ×tÊ2^ƒl?õµ¾ö¾^ƒl?Ö‹Š¾Ò‹Š¾^ƒl?!ö¾òµ¾^ƒl?IQa³ïþ^ƒl?ö>ôµ¾^ƒl?Ö‹Š>Ӌо^ƒl?öµ>ö¾^ƒl?ó5?ó5?t='?Ô‹Š>ó5?ÿÿÿ>?ó5?Ó‹Š>u='?ó5?¦÷(²ó5?ó5?Ջоt='?ó5?¿þÿÿ>ó5?t='¿Ó‹Š>ó5?ó5¿™ ;3ó5?u='¿Ñ‹Š¾ó5?¿üÿÿ¾ó5?Ú‹Š¾s='¿ó5?Ž*гó5¿ó5?Ô‹Š>t='¿ó5??ýÿÿ¾ó5?v='?Ì‹Š¾ó5?^ƒl?ïÃ>y‚Z?óµ>ïÃ>t='?t='?ïÃ>òµ>y‚Z?ïÃ>:Ä\²^ƒl?ïÃ>ôµ¾y‚Z?ïÃ>u='¿s='?ïÃ>y‚Z¿òµ>ïÃ>^ƒl¿ðbt3ïÃ>z‚Z¿ïµ¾ïÃ>w='¿r='¿ïÃ>ûµ¾w‚Z¿ïÃ>¼ý´^ƒl¿ïÃ>óµ>y‚Z¿ïÃ>v='?r='¿ïÃ>{‚Z?éµ¾ïÃ>€?.½;³^ƒl?ïÃ>.½;³ó5?ó5?.½;³ïÃ>_ƒl?.½;³ºôn²€?.½;³ïþ^ƒl?.½;³ô5¿ò5?.½;³_ƒl¿ïÃ>.½;³€¿ÒB„3.½;³_ƒl¿ïþ.½;³ö5¿ñ5¿.½;³ïþ]ƒl¿.½;³2´€¿.½;³ïÃ>^ƒl¿.½;³õ5?ñ5¿.½;³aƒl? ïþ.½;³^ƒl?ïþy‚Z?óµ>ïþt='?t='?ïþòµ>y‚Z?ïþ:Ä\²^ƒl?ïþôµ¾y‚Z?ïþu='¿s='?ïþy‚Z¿òµ>ïþ^ƒl¿ðbt3ïþz‚Z¿ïµ¾ïþw='¿r='¿ïþûµ¾w‚Z¿ïþ¼ý´^ƒl¿ïþóµ>y‚Z¿ïþv='?r='¿ïþ{‚Z?éµ¾ïþó5?ó5¿t='?Ô‹Š>ó5¿ÿÿÿ>?ó5¿Ó‹Š>u='?ó5¿¦÷(²ó5?ó5¿Õ‹Š¾t='?ó5¿¿þÿÿ>ó5¿t='¿Ó‹Š>ó5¿ó5¿™ ;3ó5¿u='¿Ñ‹Š¾ó5¿¿üÿÿ¾ó5¿Ú‹Š¾s='¿ó5¿Ž*гó5¿ó5¿Ô‹Š>t='¿ó5¿?ýÿÿ¾ó5¿v='?Ì‹Š¾ó5¿ïÃ>^ƒl¿õµ>ö>^ƒl¿Õ‹Š>Õ‹Š>^ƒl¿ö>õµ>^ƒl¿–ã¶±ïÃ>^ƒl¿ö¾õµ>^ƒl¿Ö‹Š¾Ô‹Š>^ƒl¿õµ¾ö>^ƒl¿ïþØtÊ2^ƒl¿öµ¾ö¾^ƒl¿×‹Š¾Ó‹Š¾^ƒl¿"ö¾óµ¾^ƒl¿JQa³ïþ^ƒl¿ö>õµ¾^ƒl¿×‹Š>Ӌо^ƒl¿÷µ>ö¾^ƒl¿€¿›²…ýG2€?áJÖ>¸·C9>zmh?e>©Ÿ>zmh?Â>ÆaÊ>zmh?w¸¼áJÖ>zmh?¸C9¾8”Á>zmh?©Ÿ¾e>zmh?ÆaʾŸÂ>zmh?áJÖ¾_¸¼zmh?9”Á¾´C9¾zmh?e¾©Ÿ¾zmh?¦Â¾Äaʾzmh?T¸<áJÖ¾zmh?¸C9>8”Á¾zmh?©Ÿ>e¾zmh?ÇaÊ>™Â¾zmh?Èà4?(ð<6%5?‡6&?WÄŽ>6%5?°|ü>ƒŽ?5%5?õ†>Ž(?6%5?ùï¼Èà4?6%5?WÄŽ¾‡6&?6%5?„Ž¿­|ü>5%5?Ž(¿õ†>6%5?Èà4¿€ï¼6%5?ˆ6&¿QÄŽ¾6%5?°|ü¾Ž¿7%5?û†¾(¿6%5?jï<Èà4¿5%5?VÄŽ>‡6&¿6%5?„Ž?¬|ü¾5%5?(?ñ†¾5%5?µul?. ;è,Ä>CûY?rJ·>é,Ä>EQ&?S(?é,Ä>ª²>tðZ?è,Ä>õ- »µul?è,Ä>rJ·¾AûY?è,Ä>R(¿DQ&?è,Ä>tðZ¿‹ª²>é,Ä>µul¿.- »è,Ä>CûY¿kJ·¾è,Ä>GQ&¿P(¿ë,Ä>“ª²¾rðZ¿é,Ä>©, ;µul¿è,Ä>rJ·>CûY¿é,Ä>U(?CQ&¿é,Ä>tðZ?‡ª²¾è,Ä>€?¨24 !›2^ƒl?ïÃ>mJ1±ô5?ó5?!!›²ïÃ>_ƒl?mJ1³€?mJ±2ïþ^ƒl?mJ1±ô5¿ó5?¼sDz_ƒl¿ïÃ>€¿ Ý2»sÇ2_ƒl¿ïþmJ±1ö5¿ñ5¿ !›²ïþ^ƒl¿WÆó³€¿mJ±2ïÃ>^ƒl¿mJ1±ö5?ò5¿Ó÷„²`ƒl?ïþnJ1±´ul?ö, »ê,ľrðZ?Žª²>ì,ľS(?EQ&?ë,ľqJ·>AûY?ë,ľ®- ;µul?ì,Ä¾Žª²¾rðZ?ì,ľEQ&¿Q(?ë,ľAûY¿rJ·>ì,ľµul¿N. ;ì,ľtðZ¿ˆª²¾ë,ľT(¿CQ&¿ë,ľuJ·¾@ûY¿ë,ľã. »µul¿ì,Ä¾Žª²>rðZ¿ì,ľFQ&?P(¿ë,ľCûY?jJ·¾ì,ľÈà4?sï¼6%5¿Ž(?÷†>6%5¿ƒŽ?¯|ü>6%5¿UÄŽ>‡6&?6%5¿Ÿï<Èà4?6%5¿÷†¾Ž(?6%5¿°|ü¾Ž?6%5¿‡6&¿UÄŽ>6%5¿Èà4¿ð<6%5¿Ž(¿ó†¾6%5¿„Ž¿¨|ü¾6%5¿YÄŽ¾†6&¿6%5¿7ð¼Èà4¿6%5¿÷†>Ž(¿6%5¿°|ü>Ž¿6%5¿ˆ6&?QÄŽ¾6%5¿ãJÖ>W¸¼zmh¿ÆaÊ> Â>zmh¿©Ÿ>e>zmh¿¸C9>8”Á>zmh¿n¸<áJÖ>zmh¿¡Â¾ÅaÊ>zmh¿e¾©Ÿ>zmh¿:”Á¾·C9>zmh¿ãJÖ¾¸Çaʾzmh¿e>©Ÿ¾zmh¿;”Á>³C9¾zmh¿¬èC±±€2€¿À>€=À>>À>@>À>€>À> >À>À>À>à>À>?À>?À> ??0??@??P??`??p??€??>?€=>?>>?@>>?€>>? >>?À>>?à>>??>??>? ?> ?0?> ?@?> ?P?> ?`?> ?p?> ?€?> ?€> ?€=€> ?>€> ?@>€> ?€>€> ? >€> ?À>€> ?à>€> ??€> ??€> ? ?€>@?0?€>@?@?€>@?P?€>@?`?€>@?p?€>@?€?€>@?À>@?€=À>@?>À>@?@>À>@?€>À>@? >À>@?À>À>@?à>À>@??À>@??À>@? ?À>`?0?À>`?@?À>`?P?À>`?`?À>`?p?À>`?€?À>`??`?€=?`?>?`?@>?`?€>?`? >?`?À>?`?à>?`???`???`? ??€?0??€?@??€?P??€?`??€?p??€?€??€? ?€?€= ?€?> ?€?@> ?€?€> ?€? > ?€?À> ?€?à> ?€?? ?€?? ?€? ? ?0? ?@? ?P? ?`? ?p? ?€? ?@? €=@?>@?@>@? €>@? >@?!À>@?à>@?#?@??@? ?@?%0?@?@?@?P?@?'`?@?p?@?€?@?)`?€=`?>`?+@>`?€>`? >`?-À>`?à>`??`?/?`? ?`?0?`?1@?`?!P?`?"`?`?4p?`?$€?`?$€?6€=€?&>€?&@>€?8€>€?( >€?(À>€?:à>€?*?€?*?€?< ?€?,0?€?,@?€?>P?€?.`?€?.p?€?@€?€?0Èðh®¶ `¥©Ãìqð1OP£&Ú`í[¹>¨- ±9…*¹¼D€”W·ÑNÕSE«†D,Ř¡â³D&Où.Ð’Ä)8ìUâï¢g> r,Ä¡‡Ž .\1ó€˜O¿'aÍEóìAÔY 3®%ý§]¬”ö<¢/’|B—0ˆ?%Ú•²®<¤Ì3S MU²›¹µ^F!ïYï[Û4ävAŠ´ÍkËÒäeŸu¿åŸ08râ¾xÂìSn ÈJVȬ¡„˜…ß̬³Íç­TÖ ˆûÉ´–eq#î»’bpOðVà®p†ÔÛÍ* þ±íl ’`ÿ›5ðòdN–ë'ëd³‰MPòÀ>Ûg†èènd™ÃHÚ‚+²jë gæŽÄÝåÞ!”’Yæe^¯j…ìÿÞê(àØ§”!äégQ˜JÕE6EÙ[øpR6d›ÕÏ0£jìÏKÒá(T ¤ÏÞ‘ ÷.ñÆÑqw‹W8F²-{hº_Sx T´BôxE™B}ó„Å—²ã´¾þž|^Õárt-°+ Y¾ÿŠYà(à9ÄM€WÂô…)ÁôrmÆQ'JÉãª_([3Â!®ÙazõëBoR““Ÿ‚‡(§Š®™q ïHsš‰˜ô?‚:]0¡È‡?kK|§ÎÎð«M6ÔOˆÄ8˜Äs´Ûkä_\ˆP®&^‰âÈV§¦üíÿ(K;öņM¸fx³˜†h°e[.¡hµI^L•bÛDÅú-3fz¢Øü©¾žy BVj™O~˦.<ãöQT=9âbõЧ÷ù™þ¿²¬ïݳ8Þ‘?KUë›õ…þUƒ°?@°3¬65¨Ê@F|f ˆ1UÉŽ\ö_ÖL°ÌÖ³{‹mœSlÄùeF9oƒ†³\äëŽõ}"n¯¶øîçž ×-!s_L)4/I=Í=×ÖšZ°òzô$^½yàÓ<|Û¾Øäyç`Æ7îÂÓÑYÎK/Å3gK„á_ƒ‰A|ž ÂR ü¾ÿ €·Œ‡ê}Ç?Ë‚X_`ö"£ÁÀò[ŽHO“"”Ž8èI›owšc‰¨·Uº½õHVº!¡«Uw~×<Ýl7_oûž}UG’)%àÞŠa?sôš2B5ÂpVŒpÞ,}‹Àv&ENqîúÖ½<_ùúc’í«6›ç‘êÆ³A¯gâµrHÐÆ]8ð …Û…@×”¡…"(ÝßÂmª_ÝY×_–ÎÏüøJ¯é¹àRA‹“ˆ#–ïø;l¹¯^ÿÓKV&œy7ðC;wžåefo®Þ€§^âNïþÝ€0ŸÃÕJñÀÑÎâÄ.ZIʸŸCV³«?½”ª«_l2-h[fî8ý×È[MÓ±È+lð%ÜcÌbôk6aØ.…ùE»¾Räi ßÜ5¸iΆúÊ¡Ÿ@KŠž…é ÌØhñWÎHig«¥šk*Ñ?êRç«/@^egÖ«å“U$ƦJ~æí¹(ˆ·š6CH½MÖ4”m _Öß›Ms åy‡ïÊ„À3îH@#²µ¹"[ª;ÓÇF¹:Å5ÖÚÞ=¢ Ÿy›xî]O‚·Ë£]àu–οØ^Ó¦öˆ ù‚"*Ö‹ÚZA¸h–æ5UY3|è%Ì.Âì_…l¾/oBµü6åû5 î?T­ÆÞ?"Ô€õÚ[&zÀÇ|ºô(#¼5¶\àa•àúï{ËéT5½ƒ²ëÊ0©ÿ7˜ÄœðԂ c “ ÙÆ²ù§/GQ,*Pcç¬Ør³®ýÈzl%”ch-owJƆxʃw†¾:k£ç×Ð"óÌ.0G& îm“ZqÓ'|àpÞÖVL(ȘÞÿÝÄŽŽÆNþÿ¶Š²Ì‘âs~êÒ.«ò¿QWÁÔfRýß@Fh‹üoXŽñ)ÌÃþ7£VH^„ÿ;ÈÎÚª;ïÿƒk4öÿyw$]ëùÿþˆ†ÈI¿asymptote-3.05/examples/animations/torusanimation.asy0000644000000000000000000000143615031566105021744 0ustar rootrootimport graph3; import animation; import solids; currentprojection=perspective(50,40,20); currentlight=(0,5,5); real R=3; real a=1; int n=8; path3[] p=new path3[n]; animation A; for(int i=0; i < n; ++i) { triple g(real s) { real twopi=2*pi; real u=twopi*s; real v=twopi/(1+i+s); real cosu=cos(u); return((R-a*cosu)*cos(v),(R-a*cosu)*sin(v),-a*sin(u)); } p[i]=graph(g,0,1,operator ..); } triple f(pair t) { real costy=cos(t.y); return((R+a*costy)*cos(t.x),(R+a*costy)*sin(t.x),a*sin(t.y)); } surface s=surface(f,(0,0),(2pi,2pi),8,8,Spline); for(int i=0; i < n; ++i){ picture fig; size(fig,20cm); draw(fig,s,yellow); for(int j=0; j <= i; ++j) draw(fig,p[j],blue+linewidth(4)); A.add(fig); } A.movie(BBox(10,Fill(rgb(0.98,0.98,0.9))),delay=100); asymptote-3.05/examples/animations/wheel.asy0000644000000000000000000000217515031566105017775 0ustar rootrootimport graph; // Uncomment the following 2 lines to support pdf animations: // usepackage("animate"); // settings.tex="pdflatex"; import animation; size(0,500); import fontsize; defaultpen(fontsize(48pt)+3); dotfactor=4; pair wheelpoint(real t) { return (t+cos(t),-sin(t)); } guide wheel(guide g=nullpath, real a, real b, int n) { real width=(b-a)/n; for(int i=0; i <= n; ++i) { real t=a+width*i; g=g--wheelpoint(t); } return g; } real t1=0; real t2=t1+2*pi; animation a; draw(circle((0,0),1)); draw(wheel(t1,t2,100),linetype("0 2")); yequals(Label("$y=-1$",1.0),-1,extend=true,linetype("4 4")); xaxis(Label("$x$",align=3SW),0); yaxis("$y$",0,1.2); pair z1=wheelpoint(t1); pair z2=wheelpoint(t2); dot(z1); dot(z2); int n=10; real dt=(t2-t1)/n; for(int i=0; i <= n; ++i) { save(); real t=t1+dt*i; draw(circle((t,0),1),red); dot(wheelpoint(t)); a.add(); // Add currentpicture to animation. restore(); } erase(); // Merge the images into a gif animation. a.movie(BBox(0.25cm),loops=10,delay=250); // Merge the images into a pdf animation. // label(a.pdf(BBox(0.25cm),delay=250,"controls",multipage=false)); asymptote-3.05/examples/animations/inlinemovie.tex0000644000000000000000000000232315031566105021206 0ustar rootroot\documentclass{article} \usepackage[inline]{asymptote} %\usepackage{asymptote} \usepackage{animate} \begin{document} Here is an inline PDF movie, generated with the commands \begin{verbatim} pdflatex inlinemovie asy inlinemovie-*.asy pdflatex inlinemovie \end{verbatim} or equivalently, \begin{verbatim} latexmk -pdf inlinemovie \end{verbatim} \begin{center} \begin{asy} import animate; animation A=animation("movie1"); real h=2pi/10; picture pic; unitsize(pic,2cm); for(int i=0; i < 10; ++i) { draw(pic,expi(i*h)--expi((i+1)*h)); A.add(pic); } label(A.pdf("controls",delay=50,keep=!settings.inlinetex)); \end{asy} %Uncomment the following line when not using the [inline] package option: %\ASYanimategraphics[controls]{50}{movie1}{}{} \end{center} And here is another one, clickable but without the control panel: \begin{center} \begin{asy} import animate; animation A=animation("movie2"); real h=2pi/10; picture pic; unitsize(pic,2cm); for(int i=0; i < 10; ++i) { draw(pic,expi(-i*h)--expi(-(i+1)*h),red); A.add(pic); } label(A.pdf(keep=!settings.inlinetex)); \end{asy} %Uncomment the following line when not using the [inline] package option: %\ASYanimategraphics[controls]{10}{movie2}{}{} \end{center} \end{document} asymptote-3.05/examples/animations/cube.asy0000644000000000000000000000166215031566105017607 0ustar rootrootimport math; import bsp; import animation; size(100,100); animation a; void face(face[] faces, path3 p, int j, int k) { picture pic=faces.push(p); filldraw(pic,project(p),Pen(j)); int sign=(k % 2 == 0) ? 1 : -1; transform t=scale(4)*transform(dir(p,0,sign),dir(p,0,-sign)); label(pic,t*(string) j,project(0.5*(min(p)+max(p)))); } void snapshot(transform3 t) { static transform3 s=shift(-0.5*(X+Y+Z)); save(); face[] faces; int j=-1; transform3 T=t*s; for(int k=0; k < 2; ++k) { face(faces,T*plane((1,0,0),(0,1,0),(0,0,k)),++j,k); face(faces,T*plane((0,1,0),(0,0,1),(k,0,0)),++j,k); face(faces,T*plane((0,0,1),(1,0,0),(0,k,0)),++j,k); } add(faces); a.add(); restore(); } int n=50; real step=360/n; for(int i=0; i < n; ++i) snapshot(rotate(i*step,X)); for(int i=0; i < n; ++i) snapshot(rotate(i*step,Y)); for(int i=0; i < n; ++i) snapshot(rotate(i*step,Z)); a.movie(loops=10,delay=50); asymptote-3.05/examples/fin.asy0000644000000000000000000001022415031566105015275 0ustar rootrootimport three; import palette; int N = 26; real[] C = array(N,0); real[][] A = new real[N][N]; for(int i = 0; i < N; ++i) for(int j = 0; j < N; ++j) A[i][j] = 0; real Tb = 100; // deg C real h = 240; // 240 W/m^2 K real k = 240; // W/m K real Tinf = 20; // deg C real L = 12; // cm real t = 2; // cm real delta = 0.01; // 1 cm = 0.01 m // (1,2)-(2,2)-(3,2)-...-(13,2) // | | | | // (1,1)-(2,1)-(3,1)-...-(13,1) // // | // \ / // V // // 13-14-15-...-24-25 // | | | ... | | // 0- 1- 2-...-11-12 // but, note zero-based array indexing, so counting starts at 0 int indexof(int m, int n) { return 13(n-1)+m-1; } int i = 0; // fixed temperature bottom left A[i][indexof(1,1)] = 1; C[i] = Tb; ++i; // fixed temperature middle left A[i][indexof(1,2)] = 1; C[i] = Tb; ++i; // interior nodes for(int m = 2; m<13; ++m) { A[i][indexof(m,2)] = -4; A[i][indexof(m-1,2)] = A[i][indexof(m+1,2)] = 1; A[i][indexof(m,1)] = 2; C[i] = 0; ++i; } // convective bottom side nodes for(int m = 2; m<13; ++m) { A[i][indexof(m,1)] = -(2+h*delta/k); A[i][indexof(m-1,1)] = A[i][indexof(m+1,1)] = 0.5; A[i][indexof(m,2)] = 1; C[i] = -h*delta*Tinf/k; ++i; } // convective bottom right corner node A[i][indexof(13,2)] = A[i][indexof(12,1)] = 0.5; A[i][indexof(13,1)] = -(1+h*delta/k); C[i] = -h*delta*Tinf/k; ++i; // convective middle right side node A[i][indexof(13,2)] = -(2+h*delta/k); A[i][indexof(13,1)] = 1; A[i][indexof(12,2)] = 1; C[i] = -h*delta*Tinf/k; ++i; real[] T = solve(A,C); pen[] Palette = Gradient(256,blue,cyan,yellow,orange,red); real[][] T = {T[0:13],T[13:26],T[0:13]}; T = transpose(T); size3(15cm); real w = 10; real h = 5; currentprojection = orthographic(2*(L,h,w),Y); draw((L,t,0)--(L,0,0)--(L,0,w)--(0,0,w)--(0,-h,w)); draw((0,t,w)--(0,t+h,w)--(0,t+h,0)--(0,t,0)); draw((L,0,w)--(L,t,w)--(0,t,w)--(0,t,0)--(L,t,0)--(L,t,w)); real wo2 = 0.5*w; draw((0,0,wo2)--(0,t,wo2)--(L,t,wo2)--(L,0,wo2)--cycle); // centre points surface square = surface(shift(-0.5,-0.5,wo2)*unitsquare3); surface bottomsquare = surface(shift(-0.5,-0.5,wo2)*scale(1,0.5,1)*unitsquare3); surface topsquare = surface(shift(-0.5,0,wo2)*scale(1,0.5,1)*unitsquare3); surface leftsquare = surface(shift(-0.5,-0.5,wo2)*scale(0.5,1,1)*unitsquare3); surface rightsquare = surface(shift(0,-0.5,wo2)*scale(0.5,1,1)*unitsquare3); surface NEcorner = surface(shift(0,0,wo2)*scale(0.5,0.5,1)*unitsquare3); surface SEcorner = surface(shift(0,-0.5,wo2)*scale(0.5,0.5,1)*unitsquare3); surface SWcorner = surface(shift(-0.5,-0.5,wo2)*scale(0.5,0.5,1)*unitsquare3); surface NWcorner = surface(shift(-0.5,0,wo2)*scale(0.5,0.5,1)*unitsquare3); material lookupColour(int m,int n) { int index = round(Palette.length*(T[m-1][n-1]-60)/(100-60)); if(index >= Palette.length) index = Palette.length-1; return emissive(Palette[index]); } draw(shift(0,1,0)*rightsquare,lookupColour(1,2)); for(int i = 2; i < 13; ++i) { draw(shift(i-1,1,0)*square,lookupColour(i,2)); } draw(shift(12,1,0)*leftsquare,lookupColour(13,2)); draw(shift(0,2,0)*SEcorner,lookupColour(1,3)); draw(shift(0,0,0)*NEcorner,lookupColour(1,1)); for(int i = 2; i < 13; ++i) { draw(shift(i-1,0,0)*topsquare,lookupColour(i,1)); draw(shift(i-1,2,0)*bottomsquare,lookupColour(i,3)); } draw(shift(12,2,0)*SWcorner,lookupColour(13,3)); draw(shift(12,0,0)*NWcorner,lookupColour(13,1)); // annotations draw("$x$",(0,-h/2,w)--(L/4,-h/2,w),Y,Arrow3(HookHead2(normal=Z)),BeginBar3(Y)); draw("$y$",(0,0,1.05*w)--(0,2t,1.05*w),Z,Arrow3(HookHead2(normal=X)), BeginBar3(Z)); draw("$z$",(L,-h/2,0)--(L,-h/2,w/4),Y,Arrow3(HookHead2(normal=X)),BeginBar3(Y)); draw("$L$",(0,-h/4,w)--(L,-h/4,w),-Y,Arrows3(HookHead2(normal=Z)), Bars3(Y),PenMargins2); draw("$w$",(L,-h/4,0)--(L,-h/4,w),-Y,Arrows3(HookHead2(normal=X)), Bars3(Y),PenMargins2); draw("$t$",(1.05*L,0,0)--(1.05*L,t,0),-2Z,Arrows3(HookHead2(normal=Z)), Bars3(X),PenMargins2); label(ZY()*"$T_b$",(0,t+h/2,wo2)); label("$h$,$T_\infty$",(L/2,t+h/2,0),Y); path3 air = (L/2,t+h/3,w/3.5)--(1.5*L/2,t+2*h/3,w/8); draw(air,EndArrow3(TeXHead2)); draw(shift(0.5,0,0)*air,EndArrow3(TeXHead2)); draw(shift(1.0,0,0)*air,EndArrow3(TeXHead2)); asymptote-3.05/examples/hierarchy.asy0000644000000000000000000000071315031566105016501 0ustar rootroottexpreamble("\def\Ham{\mathop {\rm Ham}\nolimits}"); pair align=2N; frame f; ellipse(f,Label("$\Ham(r,2)$",(0,0)),lightblue,Fill,above=false); ellipse(f,Label("BCH Codes",point(f,N),align),green,Fill,above=false); ellipse(f,Label("Cyclic Codes",point(f,N),align),lightmagenta,Fill,above=false); ellipse(f,Label("Linear Codes",point(f,N),align),-4mm,orange,Fill,above=false); box(f,Label("General Codes",point(f,N),align),2mm,yellow,Fill,above=false); add(f); asymptote-3.05/examples/fano.asy0000644000000000000000000000076215031566105015452 0ustar rootrootimport math; size(100,0); pair z4=(0,0); pair z7=(2,0); pair z1=point(rotate(60)*(z4--z7),1); pair z5=interp(z4,z7,0.5); pair z3=interp(z7,z1,0.5); pair z2=interp(z1,z4,0.5); pair z6=extension(z4,z3,z7,z2); draw(z4--z7--z1--cycle); draw(z4--z3); draw(z7--z2); draw(z1--z5); draw(circle(z6,abs(z3-z6))); label("1",z1,dir(z5--z1)); label("2",z2,dir(z7--z2)); label("3",z3,dir(z4--z3)); label("4",z4,dir(z3--z4)); label("5",z5,dir(z1--z5)); label("6",z6,2.5E+0.1*N); label("7",z7,dir(z2--z7)); asymptote-3.05/examples/threeviews.asy0000644000000000000000000000110015031566105016677 0ustar rootrootimport three; picture pic; unitsize(pic,5cm); if(settings.render < 0) settings.render=4; settings.toolbar=false; viewportmargin=(1cm,1cm); draw(pic,scale3(0.5)*unitsphere,green,render(compression=Low,merge=true)); draw(pic,Label("$x$",1),O--X); draw(pic,Label("$y$",1),O--Y); draw(pic,Label("$z$",1),O--Z); // Europe and Asia: //addViews(pic,ThreeViewsFR); //addViews(pic,SixViewsFR); // United Kingdom, United States, Canada, and Australia: addViews(pic,ThreeViewsUS); //addViews(pic,SixViewsUS); // Front, Top, Right, // Back, Bottom, Left: //addViews(pic,SixViews); asymptote-3.05/examples/triads.asy0000644000000000000000000000171415031566105016013 0ustar rootrootimport graph; path p=(10,75)..(15,85)..(20,90)..(35,85)..(40,79)--(78,30)..(85,15)..(87,5); pair l=point(p,3.5); pair m=point(p,4.5); pair s=point(p,4.9); pen c=linewidth(1.5); pair o=(m.x,0.5(m.x+l.y)); pen d=c+darkgreen; void drawarrow(string s="", pair p, pair q, side side=RightSide, bool upscale=false, pen c) { path g=p{dir(-5)}..{dir(-85)}q; if(upscale) g=reverse(g); draw(s,g,side,c,Arrow(Fill,0.65)); } void spectrum(pair l,pair m, pair s) { draw(p,c); d += 4.0; dot("$p$",l,SW,d); dot("$q$",m,SW,d); dot("$k$",s,SW,d); xaxis("$k$",0); yaxis("$E(k)$",0); } drawarrow("$T_p$",l,m,true,blue); drawarrow("$T_k$",m,s,LeftSide,red); spectrum(l,m,s); shipout("triadpqk"); erase(); drawarrow("$-T_p$",l,m,LeftSide,red); drawarrow("$-T_q$",m,s,true,blue); spectrum(l,s,m); shipout("triadpkq"); erase(); drawarrow("$T_k$",l,m,true,blue); drawarrow("$T_q$",m,s,LeftSide,red); spectrum(m,s,l); shipout("triadkpq"); erase(); asymptote-3.05/examples/transparency.asy0000644000000000000000000000027415031566105017236 0ustar rootrootsize(0,150); begingroup(); fill(shift(1.5dir(120))*unitcircle,green+opacity(0.75)); fill(shift(1.5dir(60))*unitcircle,red+opacity(0.75)); fill(unitcircle,blue+opacity(0.75)); endgroup(); asymptote-3.05/examples/label3zoom.asy0000644000000000000000000000117015031566105016570 0ustar rootrootimport three; currentlight=Headlamp; size(469.75499pt,0); currentprojection= perspective(camera=(160.119024441391,136.348802919248,253.822628496226), up=(-0.188035408976828,0.910392236102215,-0.368549401594584), target=(25.5462739598034,1.77605243766079,-9.93996244768584), zoom=5.59734733413271, angle=5.14449021168139, viewportshift=(0.813449720559684,-0.604674743165144), autoadjust=false); draw(scale3(4)*extrude("$\displaystyle\int\limits_{-\infty}^{+\infty}\!\! e^{-\alpha x^2}\!\!=\sqrt{\frac{\pi}{\alpha}}$",2Z), material(blue)); asymptote-3.05/examples/fequlogo.asy0000644000000000000000000000171515031566105016347 0ustar rootrootimport graph3; import obj; size(200,0); size3(200); if(settings.render < 0) settings.render=8; texpreamble("\usepackage[T1]{fontenc}"); texpreamble("\usepackage{ccfonts,eulervm}"); currentprojection=perspective(4,1,2); currentlight=(4,0,2); currentlight.background=black+opacity(0.0); real R=4; triple f1(pair t) {return (R*cos(t.x),R*sin(t.x),t.y);} draw(shift(-0.6Z)*scale3(0.66)*rotate(55,Z)*rotate(90,X)* obj("uhrturm.obj",orange)); surface s=surface(f1,(0,0),(2pi,2),8,8,Spline); string lo="$\displaystyle f(x+y)=f(x)+f(y)$"; string hi="$\displaystyle F_{t+s}=F_t\circ F_s$"; real h=0.0125; draw(surface(rotate(2)*xscale(0.32)*yscale(0.6)*lo,s,-pi/4-1.5*pi/20,0.5,h)); draw(surface(rotate(0)*xscale(-0.45)*yscale(0.3)*hi,s,0.8*pi,0.25,h),blue); add(new void(frame f, transform3 t, picture pic, projection P) { draw(f,surface(invert(box(min(f,P),max(f,P)),min3(f),P), new pen[] {orange,red,yellow,brown}+opacity(0.9))); } ); asymptote-3.05/examples/spline.asy0000644000000000000000000000114015031566105016010 0ustar rootrootimport graph; import interpolate; size(15cm,15cm,IgnoreAspect); real a=1997, b=2002; int n=5; real[] xpt=a+sequence(n+1)*(b-a)/n; real[] ypt={31,36,26,22,21,24}; horner h=diffdiv(xpt,ypt); fhorner L=fhorner(h); scale(false,true); pen p=linewidth(1); draw(graph(L,a,b),dashed+black+p,"Lagrange interpolation"); draw(graph(xpt,ypt,Hermite(natural)),red+p,"natural spline"); draw(graph(xpt,ypt,Hermite(monotonic)),blue+p,"monotone spline"); xaxis("$x$",BottomTop,LeftTicks(Step=1,step=0.25)); yaxis("$y$",LeftRight,RightTicks(Step=5)); dot(pairs(xpt,ypt),4bp+gray(0.3)); attach(legend(),point(10S),30S); asymptote-3.05/examples/spring0.asy0000644000000000000000000000004615031566105016104 0ustar rootrootimport spring; drawspring(0,"$L$"); asymptote-3.05/examples/planeproject.asy0000644000000000000000000000064215031566105017212 0ustar rootrootimport graph3; size3(200,IgnoreAspect); currentprojection=orthographic(4,6,3); real x(real t) {return 1+cos(2pi*t);} real y(real t) {return 1+sin(2pi*t);} real z(real t) {return t;} path3 p=graph(x,y,z,0,1,operator ..); draw(p,Arrow3); draw(planeproject(XY*unitsquare3)*p,red,Arrow3); draw(planeproject(YZ*unitsquare3)*p,green,Arrow3); draw(planeproject(ZX*unitsquare3)*p,blue,Arrow3); axes3("$x$","$y$","$z$"); asymptote-3.05/examples/xstitch.asy0000644000000000000000000000723315031566105016215 0ustar rootrootpair c=(0,0.8); int iters(pair z, int max=160) { int n=0; while(abs(z) < 2 && n < max) { z=z*z+c; ++n; } return n; } int[] cutoffs={12,15,20,30,40,60,200}; int key(pair z) { int i=iters(z); int j=0; while(cutoffs[j] < i) ++j; return j; } int width=210; int height=190; real zoom=2.5/200; int[][] values=new int[width][height]; int[] histogram; for(int v=0; v < 10; ++v) histogram.push(0); for(int i=0; i < width; ++i) { real x=zoom*(i-width/2); for(int j=0; j < height; ++j) { real y=zoom*(j-height/2); int v=key((x,y)); values[i][j]=v; ++histogram[v]; } } // Print out a histogram. write("histogram: "); write(histogram); pen linepen(int i, int max) { real w=i == -1 || i == max+1 ? 2.0 : i % 10 == 0 || i == max ? 1.0 : i % 5 == 0 ? 0.8 : 0.25; return linewidth(w); } pen xpen(int i) { return linepen(i,width)+(i == width/2 ? red : i == 75 || i == width-75 ? dashed : black); } pen ypen(int i) { return linepen(i,height)+(i == height/2 ? red : i == 75 || i == height-75 ? dashed : black); } // The length of the side of a cross stitch cell. real cell=2.3mm; transform t=scale(cell); picture tick; draw(tick,(0,0)--(1,1)); picture ell; draw(ell,(0,1)--(0,0)--(0.7,0)); picture cross; draw(cross,(0,0)--(1,1)); draw(cross,(1,0)--(0,1)); picture star; draw(star,(0.15,0.15)--(0.85,0.85)); draw(star,(0.85,0.15)--(0.15,0.85)); draw(star,(.5,0)--(.5,1)); draw(star,(0,.5)--(1,.5)); picture triangle; draw(triangle,(0,0)--(2,0)--(1,1.5)--cycle); picture circle; fill(circle,shift(1,1)*unitcircle); picture ocircle; draw(ocircle,shift(1,1)*unitcircle); picture spare; fill(spare,(0,0)--(1,1)--(0,1)--cycle); picture[] pics={tick,ell,cross,star,triangle,circle}; pen[] colors={black,0.2purple,0.4purple,0.6purple,0.8purple,purple, 0.8purple+0.2white}; frame[] icons; icons.push(newframe); for(picture pic : pics) { // Scaling factor, so that we don't need weird line widths. real X=1.0; frame f=pic.fit(.8X*cell,.8X*cell,Aspect); f=scale(1/X)*f; // Center the icon in the cell. f=shift((cell/2,cell/2)-0.5(max(f)-min(f)))*f; icons.push(f); } void drawSection(int xmin, int xmax, int ymin, int ymax) { static int shipoutNumber=0; // Draw directly to a frame for speed reasons. frame pic; for(int i=xmin; i <= xmax; ++i) { draw(pic,t*((i,ymin)--(i,ymax)),xpen(i)); if(i%10 == 0) { label(pic,string(i),t*(i,ymin),align=S); label(pic,string(i),t*(i,ymax),align=N); } } for(int j=ymin; j <= ymax; ++j) { draw(pic,t*((xmin,j)--(xmax,j)),ypen(j)); if(j%10 == 0) { label(pic,string(j),t*(xmin,j),align=W); label(pic,string(j),t*(xmax,j),align=E); } } if(xmin < 0) xmin=0; if(xmax >= width) xmax=width-1; if(ymin < 0) ymin=0; if(ymax >= height) ymax=height-1; int stitchCount=0; path box=scale(cell) *((0,0)--(1,0)--(1,1)--(0,1)--cycle); for(int i=xmin; i < xmax; ++i) for(int j=ymin; j < ymax; ++j) { int v=values[i][j]; add(pic,icons[v],(i*cell,j*cell)); //fill(pic,shift(i*cell,j*cell)*box,colors[v]); if(v != 0) ++stitchCount; } write("stitch count: ",stitchCount); // shipout("xstitch"+string(shipoutNumber),pic); shipout(pic); ++shipoutNumber; } //drawSection(-1,width+1,-1,height+1); //drawSection(-1,80,height-80,height+1); //drawSection(70,150,height-80,height+1); drawSection(quotient(width,2)-40,quotient(width,2)+40,quotient(height,2)-40,quotient(height,2)+40); //drawSection(width-150,width-70,-1,80); //drawSection(width-80,width+1,-1,80); asymptote-3.05/examples/vertexshading.asy0000644000000000000000000000144215031566105017376 0ustar rootrootimport three; size(200); currentprojection=perspective(4,5,5); draw(shift(2Z)*surface(O--X--Y--cycle, new pen[] {red+opacity(0.5),green,blue})); draw(shift(2Y+2Z)*surface(O--X--Y--cycle),blue); draw(shift(2Y+Z)*surface(unitsquare3),green); draw(surface(unitcircle3,new pen[] {red,green,blue,black})); draw(surface(shift(Z)*unitsquare3, new pen[] {red,green+opacity(0.5),blue,black}), prc() ? nolight : currentlight); draw(surface(shift(X)*((0,0,0)..controls (1,0,0) and (2,0,0)..(3,0,0).. controls (2.5,sqrt(3)/2,0) and (2,sqrt(3),0).. (1.5,3*sqrt(3)/2,0).. controls (1,sqrt(3),0) and (0.5,sqrt(3)/2,0)..cycle), new triple[] {(1.5,sqrt(3)/2,2)},new pen[] {red,green,blue})); asymptote-3.05/examples/xxsq01x-1.asy0000644000000000000000000000154215031566105016216 0ustar rootrootimport graph3; import solids; size(300); currentprojection=perspective(0,2,10,up=Y); currentlight=Viewport; pen color=green; real f(real x) {return x^2;} pair F(real x) {return (x,f(x));} triple F3(real x) {return (x,f(x),0);} path p=graph(F,0,1,n=10,operator ..)--cycle; path3 p3=path3(p); revolution a=revolution(-X,p3,Y,0,180); render render=render(merge=true); draw(surface(a),color); surface s=surface(p); draw(s,color); transform3 t=shift(-2X)*rotate(180,Y); draw(t*s,color); draw(p3); draw(t*p3); draw((-1,0,0)--(-1,1,0),dashed); xaxis3(Label("$x$",1),Arrow3); yaxis3(Label("$y$",1),Arrow3); dot(Label("$(1,1)$"),(1,1,0)); dot(Label("$(-1,1)$"),(-1,1,0),W); arrow("$y=x^{2}$",F3(0.7),X,1cm,red); arrow("$y=x$",(0.3,0.3,0),X,1.5cm,red); draw(circle((-1,1,0),2,Y),dashed); draw((-1,1,0)--(1,1,0),dashed); draw(shift(-X)*arc(0.02Y,0.3,90,0,0,0,CW),Arrow3); asymptote-3.05/examples/progrid.asy0000644000000000000000000000007215031566105016167 0ustar rootrootlabel("$\displaystyle X_i = \sum_{j=1}^{N} a_{ij} f_j$"); asymptote-3.05/examples/BezierPatch.asy0000644000000000000000000000062715031566105016727 0ustar rootrootimport three; size(10cm); currentlight=Headlamp; surface s=surface(patch(new triple[][] { {(0,0,0),(1,0,0),(1,0,0),(2,0,0)}, {(0,1,0),(1,0,1),(1,0,1),(2,1,0)}, {(0,1,0),(1,0,-1),(1,0,-1),(2,1,0)}, {(0,2,0),(1,2,0),(1,2,0),(2,2,0)}})); draw(s,yellow); draw(s.s[0].vequals(0.5),squarecap+2bp+blue,currentlight); draw(s.s[0].uequals(0.5),squarecap+2bp+red,currentlight); asymptote-3.05/examples/impact.asy0000644000000000000000000000114215031566105015775 0ustar rootroot// Contributed by Philippe Ivaldi. // http://www.piprime.fr/ import graph3 ; import contour; size (6cm,0); currentprojection=orthographic(1,1,1) ; real rc=1, hc=2, c=rc/hc; draw(shift(hc*Z)*scale(rc,rc,-hc)*unitcone,blue); triple Os=(0.5,0.5,1); real r=0.5; draw(shift(Os)*scale3(r)*unitsphere,red); real a=1+1/c^2; real b=abs(Os)^2-r^2; real f(pair z) { real x=z.x, y=z.y; return a*x^2-2*Os.x*x+a*y^2-2*Os.y*y-2*Os.z*sqrt(x^2+y^2)/c+b; } real g(pair z){return (sqrt(z.x^2+z.y^2))/c;} draw(lift(g,contour(f,(-rc,-rc),(rc,rc),new real[]{0})),linewidth(2bp)+yellow); axes3("$x$","$y$","$z$",Arrow3); asymptote-3.05/examples/cos3.asy0000644000000000000000000000110615031566105015367 0ustar rootrootimport graph3; import palette; size(12cm,IgnoreAspect); currentprojection=orthographic(1,-2,1); real f(pair z) {return abs(cos(z));} real Arg(triple v) {return degrees(cos((v.x,v.y)),warn=false);} surface s=surface(f,(-pi,-2),(pi,2),20,Spline); s.colors(palette(s.map(Arg),Wheel())); draw(s,render(compression=Low,merge=true)); real xmin=point((-1,-1,-1)).x; real xmax=point((1,1,1)).x; draw((xmin,0,0)--(xmax,0,0),dashed); xaxis3("$\mathop{\rm Re} z$",Bounds,InTicks); yaxis3("$\mathop{\rm Im} z$",Bounds,InTicks(beginlabel=false)); zaxis3("$|\cos(z)|$",Bounds,InTicks); asymptote-3.05/examples/triceratops.asy0000644000000000000000000000037315031566105017064 0ustar rootrootimport obj; size(15cm); currentprojection=orthographic(0,2,5,up=Y); // A compressed version of the required data file may be obtained from: // http://www.cs.technion.ac.il/~irit/data/Viewpoint/triceratops.obj.gz draw(obj("triceratops.obj",brown)); asymptote-3.05/examples/filesurface.asy0000644000000000000000000000104315031566105017010 0ustar rootrootimport graph3; import palette; size3(200,IgnoreAspect); currentprojection=perspective(dir(68,225)); file in=input("filesurface.dat").line(); real[] x=in; real[] y=in; real[][] z=in; surface s=surface(z,x,y); real[] level=uniform(min(z)*(1-sqrtEpsilon),max(z)*(1+sqrtEpsilon),256); s.colors(palette(s.map(new real(triple v) {return find(level >= v.z);}), Rainbow())); draw(s,meshpen=thick(),render(tessellate=true)); xaxis3("$x$",Bounds,InTicks); yaxis3("$y$",Bounds,InTicks(Step=1,step=0.1)); zaxis3("$z$",Bounds,InTicks); asymptote-3.05/examples/RiemannSphere.asy0000644000000000000000000000170415031566105017264 0ustar rootrootimport graph3; import solids; currentlight=White; size(10cm,0); pair k=(1,0.2); real r=abs(k); real theta=angle(k); real x(real t) { return r^t*cos(t*theta); } real y(real t) { return r^t*sin(t*theta); } real z(real t) { return 0; } real u(real t) { return x(t)/(x(t)^2+y(t)^2+1); } real v(real t) { return y(t)/(x(t)^2+y(t)^2+1); } real w(real t) { return (x(t)^2+y(t)^2)/(x(t)^2+y(t)^2+1); } real nb=3; for (int i=0; i<12; ++i) draw((0,0,0)--nb*(Cos(i*30),Sin(i*30),0),yellow); for (int i=0; i<=nb; ++i) draw(circle((0,0,0),i),lightgreen+white); path3 p=graph(x,y,z,-200,40,operator ..); path3 q=graph(u,v,w,-200,40,operator ..); revolution sph=sphere((0,0,0.5),0.5); draw(surface(sph),green+white+opacity(0.5)); draw(p,1bp+heavyred); draw(q,1bp+heavyblue); triple A=(0,0,1), B=(u(40),v(40),w(40)), C=(x(40),y(40),z(40)); path3 L=A--C; draw(L,1bp+black); pen p=fontsize(8pt); dot("$(0,0,1)$",A,N,p); dot("$(u,v,w)$",B,E,p); dot("$(x,y,0)$",C,E,p); asymptote-3.05/examples/coag.asy0000644000000000000000000000041015031566105015426 0ustar rootrootsize(0,200); import graph; pair z0=(0,0); pair m0=(0,1); pair tg=(1.5,0); pair mt=m0+tg; pair tf=(3,0); draw(m0--mt{dir(-70)}..{dir(0)}2tg+m0/4); xtick("$T_g$",tg,N); label("$M(t)$",mt,2NE); labely("$M_0$",m0); xaxis(Label("$t$",align=2S),Arrow); yaxis(Arrow); asymptote-3.05/examples/lowupint.asy0000644000000000000000000000122115031566105016377 0ustar rootrootimport graph; real f(real x) {return x^3-x+2;} pair F(real x) {return (x,f(x));} void rectangle(real a, real b, real c, real h(real,real)) { real height=(a < c && c < b) ? f(c) : h(f(a),f(b)); pair p=(a,0), q=(b,height); path g=box(p,q); fill(g,lightgray); draw(g); } void partition(real a, real b, real c, real h(real,real)) { rectangle(a,a+.4,c,h); rectangle(a+.4,a+.6,c,h); rectangle(a+.6,a+1.2,c,h); rectangle(a+1.2,a+1.6,c,h); rectangle(a+1.6,a+1.8,c,h); rectangle(a+1.8,b,c,h); draw((a,0)--(F(a))); draw((b,0)--(F(b))); draw(graph(f,a,b,operator ..),red); draw((a,0)--(b,0)); labelx("$a$",a); labelx("$b$",b); } asymptote-3.05/examples/xxsq01y.asy0000644000000000000000000000147115031566105016062 0ustar rootrootimport solids; size(0,150); currentprojection=perspective(0,0,10,up=Y); pen color=green; real alpha=240; real f(real x) {return x^2;} pair F(real x) {return (x,f(x));} triple F3(real x) {return (x,f(x),0);} path p=graph(F,0,1,n=10,operator ..)--cycle; path3 p3=path3(p); render render=render(compression=0,merge=true); draw(surface(revolution(p3,Y,0,alpha)),color,render); surface s=surface(p); draw(s,color,render); draw(rotate(alpha,Y)*s,color,render); draw(p3,blue); xaxis3(Label("$x$",1),Arrow3); yaxis3(Label("$y$",1),ymax=1.25,dashed,Arrow3); dot("$(1,1)$",(1,1,0),X); arrow("$y=x^{2}$",F3(0.7),X,0.75cm,red); arrow("$y=x$",(0.8,0.8,0),Y,1cm,red); real r=0.4; draw((r,f(r),0)--(r,r,0),red); draw("$r$",(0,(f(r)+r)*0.5,0)--(r,(f(r)+r)*0.5,0),N,red,Arrows3,PenMargins3); draw(arc(1.1Y,0.3,90,0,7.5,180),Arrow3); asymptote-3.05/examples/slidedemo.asy0000644000000000000000000000647015031566105016476 0ustar rootrootsettings.tex="pdflatex"; // Slide demo. // Command-line options to enable stepping and/or reverse video: // asy [-u stepping=true] [-u reverse=true] [-u itemstep=true] slidedemo orientation=Landscape; import slide; import three; viewportsize=pagewidth-2pagemargin; usersetting(); // Commands to generate optional bibtex citations: // asy slidedemo // bibtex slidedemo_ // asy slidedemo // bibliographystyle("alpha"); // Generated needed files if they don't already exist. asy(nativeformat(),"Pythagoras","log","PythagoreanTree"); usepackage("mflogo"); // Optional background color or header: // import x11colors; // fill(background,box((-1,-1),(1,1)),Azure); // label(background,"Header",(0,startposition.y)); titlepage(title="Slides with {\tt Asymptote}: A Demo", author="John C. Bowman", institution="University of Alberta", date="\today", url="https://asymptote.sourceforge.io"); outline("Basic Commands"); item("item"); subitem("subitem"); remark("remark"); item("draw \cite{Hobby86,Knuth86b}"); item("figure"); item("embedded and external animations: see {\tt slidemovie.asy}"); title("Items"); item("First item."); subitem("First subitem."); subitem("Second subitem."); item("Second item."); equation("a^2+b^2=c^2."); equations("\frac{\sin^2\theta+\cos^2\theta}{\cos^2\theta} &=&\frac{1}{\cos^2\theta}\nonumber\\ &=&\sec^2\theta."); remark("A remark."); item("To enable pausing between bullets:"); remark("{\tt asy -u stepping=true}"); item("To enable reverse video:"); remark("{\tt asy -u reverse=true}"); title("Can draw on a slide, preserving the aspect ratio:"); picture pic,pic2; draw(pic,unitcircle); add(pic.fit(15cm)); step(); fill(pic2,unitcircle,paleblue); label(pic2,"$\pi$",(0,0),fontsize(500pt)); add(pic2.fit(15cm)); newslide(); item("The slide \Red{title} \Green{can} \Blue{be} omitted."); figure("Pythagoras","height=12cm", "A simple proof of Pythagoras' Theorem."); newslide(); item("Single skip:"); skip(); item("Double skip:"); skip(2); figure(new string[] {"log."+nativeformat(),"PythagoreanTree."+nativeformat()}, "width=10cm",new string[] {"{\tt log.asy}","{\tt PythagoreanTree.asy}"}, "Examples of {\tt Asymptote} output."); title("Embedded Interactive 3D Graphics"); picture pic; import graph3; import solids; viewportmargin=(0,1cm); currentprojection=orthographic(1,0,10,up=Y); pen color=green; real alpha=-240; real f(real x) {return sqrt(x);} pair F(real x) {return (x,f(x));} triple F3(real x) {return (x,f(x),0);} path p=graph(pic,F,0,1,n=30,operator ..)--(1,0)--cycle; path3 p3=path3(p); revolution a=revolution(p3,X,alpha,0); render render=render(compression=0,merge=true); draw(pic,surface(a),color,render); draw(pic,p3,blue); surface s=surface(p); draw(pic,s,color,render); draw(pic,rotate(alpha,X)*s,color,render); xaxis3(pic,Label("$x$",1),xmax=1.25,dashed,Arrow3); yaxis3(pic,Label("$y$",1),Arrow3); dot(pic,"$(1,1)$",(1,1,0)); arrow(pic,"$y=\sqrt{x}$",F3(0.8),Y,0.75cm,red); real r=0.4; draw(pic,F3(r)--(1,f(r),0),red); real x=(1+r)/2; draw(pic,"$r$",(x,0,0)--(x,f(r),0),X+0.2Z,red,Arrow3); draw(pic,arc(1.1X,0.4,90,90,3,-90),Arrow3); add(pic.fit(0,14cm)); title("\mbox{Asymptote: 2D \& 3D Vector Graphics Language}"); asyinclude("logo3"); center("\tt https://asymptote.sourceforge.io"); center("(freely available under the LGPL license)"); bibliography("refs"); asymptote-3.05/examples/twistedtubes.asy0000644000000000000000000000151115031566105017246 0ustar rootrootimport graph3; import palette; size(300,300,keepAspect=true); real w=0.4; real f(triple t) {return sin(t.x);} triple f1(pair t) {return (cos(t.x)-2cos(w*t.y),sin(t.x)-2sin(w*t.y),t.y);} triple f2(pair t) {return (cos(t.x)+2cos(w*t.y),sin(t.x)+2sin(w*t.y),t.y);} triple f3(pair t) {return (cos(t.x)+2sin(w*t.y),sin(t.x)-2cos(w*t.y),t.y);} triple f4(pair t) {return (cos(t.x)-2sin(w*t.y),sin(t.x)+2cos(w*t.y),t.y);} surface s1=surface(f1,(0,0),(2pi,10),8,8,Spline); surface s2=surface(f2,(0,0),(2pi,10),8,8,Spline); surface s3=surface(f3,(0,0),(2pi,10),8,8,Spline); surface s4=surface(f4,(0,0),(2pi,10),8,8,Spline); pen[] Rainbow=Rainbow(); s1.colors(palette(s1.map(f),Rainbow)); s2.colors(palette(s2.map(f),Rainbow)); s3.colors(palette(s3.map(f),Rainbow)); s4.colors(palette(s4.map(f),Rainbow)); draw(s1); draw(s2); draw(s3); draw(s4); asymptote-3.05/examples/unitcircle.asy0000644000000000000000000000050215031566105016660 0ustar rootrootsize(0,150); pair z0=0; pair z1=1; real theta=30; pair z=dir(theta); draw(circle(z0,1)); filldraw(z0--arc(z0,1,0,theta)--cycle,lightgrey); dot(z0); dot(Label,z1); dot("$(x,y)=(\cos\theta,\sin\theta)$",z); arrow("area $\frac{\theta}{2}$",dir(0.5*theta),2E); draw("$\theta$",arc(z0,0.7,0,theta),LeftSide,Arrow,PenMargin); asymptote-3.05/examples/SierpinskiGasket.asy0000644000000000000000000000146515031566105020007 0ustar rootrootsize(200); import palette; import three; currentprojection=perspective(8,2,1); triple[] M={(0,0,1),1/3*(sqrt(8),0,-1), 1/3*((sqrt(8))*Cos(120),(sqrt(8))*Sin(120),-1), 1/3*((sqrt(8))*Cos(240),(sqrt(8))*Sin(240),-1)}; int level=5; surface s; void recur(triple p, real u, int l) { if(l < level) for(triple V : M) recur(p+u*V,u/2,l+1); else for(triple V : M) { s.append(surface((p+u*(V+M[0]))--(p+u*(V+M[1]))--(p+u*(V+M[2]))--cycle)); s.append(surface((p+u*(V+M[0]))--(p+u*(V+M[2]))--(p+u*(V+M[3]))--cycle)); s.append(surface((p+u*(V+M[0]))--(p+u*(V+M[3]))--(p+u*(V+M[1]))--cycle)); s.append(surface((p+u*(V+M[3]))--(p+u*(V+M[2]))--(p+u*(V+M[1]))--cycle)); } } recur(O,0.5,1); s.colors(palette(s.map(zpart),Rainbow())); draw(s,render(merge=true)); asymptote-3.05/examples/colorplanes.asy0000644000000000000000000000073015031566105017043 0ustar rootrootsize(6cm,0); import bsp; real u=2.5; real v=1; currentprojection=oblique; path3 y=plane((2u,0,0),(0,2v,0),(-u,-v,0)); path3 l=rotate(90,Z)*rotate(90,Y)*y; path3 g=rotate(90,X)*rotate(90,Y)*y; face[] faces; pen[] p={red,green,blue,black}; int[] edges={0,0,0,2}; gouraudshade(faces.push(y),project(y),p,edges); gouraudshade(faces.push(l),project(l),p,edges); gouraudshade(faces.push(g),project(g),new pen[]{cyan,magenta,yellow,black}, edges); add(faces); asymptote-3.05/examples/spring.asy0000644000000000000000000000123315031566105016023 0ustar rootrootpair coilpoint(real lambda, real r, real t) { return (2.0*lambda*t+r*cos(t),r*sin(t)); } guide coil(guide g=nullpath, real lambda, real r, real a, real b, int n) { real width=(b-a)/n; for(int i=0; i <= n; ++i) { real t=a+width*i; g=g..coilpoint(lambda,r,t); } return g; } void drawspring(real x, string label) { real r=8; real t1=-pi; real t2=10*pi; real lambda=(t2-t1+x)/(t2-t1); pair b=coilpoint(lambda,r,t1); pair c=coilpoint(lambda,r,t2); pair a=b-20; pair d=c+20; draw(a--b,BeginBar(2*barsize())); draw(c--d); draw(coil(lambda,r,t1,t2,100)); dot(d); pair h=20*I; draw(label,a-h--d-h,red,Arrow,Bars,PenMargin); } asymptote-3.05/examples/jump.asy0000644000000000000000000000044115031566105015474 0ustar rootrootimport graph; size(4inches,0); real f1(real x) {return (1+x^2);} real f2(real x) {return (4-x);} xaxis("$x$",LeftTicks,Arrow); yaxis("$y$",RightTicks,Arrow); draw("$y=1+x^2$",graph(f1,-2,1)); dot((1,f1(1)),UnFill); draw("$y=4-x$",graph(f2,1,5),LeftSide,red,Arrow); dot((1,f2(1)),red); asymptote-3.05/examples/cardioid.asy0000644000000000000000000000035115031566105016277 0ustar rootrootimport graph; size(0,100); real f(real t) {return 1+cos(t);} path g=polargraph(f,0,2pi,operator ..)--cycle; filldraw(g,pink); xaxis("$x$",above=true); yaxis("$y$",above=true); dot("$(a,0)$",(1,0),N); dot("$(2a,0)$",(2,0),N+E); asymptote-3.05/examples/floor.asy0000644000000000000000000000076415031566105015652 0ustar rootrootimport graph; unitsize(1cm); real Floor(real x) {return floor(x);} pair[] Close; pair[] Open; bool3 branch(real x) { static real lasty; static bool first=true; real y=floor(x); bool samebranch=first || lasty == y; first=false; if(samebranch) lasty=x; else { Close.push((x,lasty)); Open.push((x,y)); } lasty=y; return samebranch ? true : default; }; draw(graph(Floor,-5.5,5.5,500,branch)); axes("$x$",rotate(0)*"$\lfloor x\rfloor$",red); dot(Close); dot(Open,UnFill); asymptote-3.05/examples/NURBScurve.asy0000644000000000000000000000127715031566105016467 0ustar rootrootsettings.outformat="pdf"; settings.prc=true; import three; size(10cm); currentprojection=perspective(50,80,50); // Nonrational curve: // udegree=3, nu=6; real[] knot={0,0,0,0,0.4,0.6,1,1,1,1}; triple[] P= { (-31.2061,12.001,6.45082), (-31.3952,14.7353,6.53707), (-31.5909,21.277,6.70051), (-31.4284,25.4933,6.76745), (-31.5413,30.3485,6.68777), (-31.4896,32.2839,6.58385) }; draw(P,knot,green); // Rational Bezier curve: // udegree=3, nu=4; real[] knot={0,0,0,0,1,1,1,1}; path3 g=scale3(20)*(X{Y}..{-X}Y); triple[] P={point(g,0),postcontrol(g,0),precontrol(g,1),point(g,1)}; // Optional weights: real[] weights=array(P.length,1.0); weights[2]=5; draw(P,knot,weights,red); asymptote-3.05/examples/worldmap.asy0000644000000000000000000000510215031566105016345 0ustar rootrootsize(20cm); // The required data file is available here: // http://www.uni-graz.at/~schwaige/asymptote/worldmap.dat // This data was originally obtained from // http://www.ngdc.noaa.gov/mgg_coastline/mapit.jsp real findtheta(real phi, real epsilon=realEpsilon) { // Determine for given phi the unique solution -pi/2 <= theta <= pi/2 off // 2*theta+sin(2*theta)=pi*sin(phi) // in the non-trivial cases by Newton iteration; // theoretically the initial guess pi*sin(phi)/4 always works. real nwtn(real x, real y) {return x-(2x+sin(2x)-y)/(2+2*cos(2x));}; real y=pi*sin(phi); if(y == 0) return 0.0; if(abs(y) == 1) return pi/2; real startv=y/4; real endv=nwtn(startv,y); if(epsilon < 500*realEpsilon) epsilon=500*realEpsilon; while(abs(endv-startv) > epsilon) {startv=endv; endv=nwtn(startv,y);}; return endv; } pair mollweide(real lambda, real phi, real lambda0=0){ // calculate the Mollweide projection centered at lambda0 for the point // with coordinates(phi,lambda) static real c1=2*sqrt(2)/pi; static real c2=sqrt(2); real theta=findtheta(phi); return(c1*(lambda-lambda0)*cos(theta), c2*sin(theta)); } guide gfrompairs(pair[] data){ guide gtmp; for(int i=0; i < data.length; ++i) { pair tmp=mollweide(radians(data[i].y),radians(data[i].x)); gtmp=gtmp--tmp; } return gtmp; } string datafile="worldmap.dat"; file in=input(datafile,comment="/").line(); // new commentchar since "#" is contained in the file pair[][] arrarrpair=new pair[][] ; int cnt=-1; bool newseg=false; while(true) { if(eof(in)) break; string str=in; string[] spstr=split(str,""); if(spstr[0] == "#") {++cnt; arrarrpair[cnt]=new pair[] ; newseg=true;} if(spstr[0] != "#" && newseg) { string[] spstr1=split(str,'\t'); // separator is TAB not SPACE pair tmp=((real) spstr1[1],(real) spstr1[0]); arrarrpair[cnt].push(tmp); } } for(int i=0; i < arrarrpair.length; ++i) draw(gfrompairs(arrarrpair[i]),1bp+black); // lines of longitude and latitude pair[] constlong(real lambda, int np=100) { pair[] tmp; for(int i=0; i <= np; ++i) tmp.push((-90+i*180/np,lambda)); return tmp; } pair[] constlat(real phi, int np=100) { pair[] tmp; for(int i=0; i <= 2*np; ++i) tmp.push((phi,-180+i*180/np)); return tmp; } for(int j=1; j <= 5; ++j) draw(gfrompairs(constlong(-180+j/6*360)),white); draw(gfrompairs(constlong(-180)),1.5bp+white); draw(gfrompairs(constlong(180)),1.5bp+white); for(int j=0; j <= 12; ++j) draw(gfrompairs(constlat(-90+j/6*180)),white); //draw(gfrompairs(constlong(10)),dotted); close(in); shipout(bbox(1mm,darkblue,Fill(lightblue)), view=true); asymptote-3.05/examples/xxsq01.asy0000644000000000000000000000134715031566105015673 0ustar rootrootimport graph3; import solids; size(0,150); currentprojection=perspective(0,0,10,up=Y); pen color=green; real alpha=250; real f(real x) {return x^2;} pair F(real x) {return (x,f(x));} triple F3(real x) {return (x,f(x),0);} path p=graph(F,0,1,n=10,operator ..)--cycle; path3 p3=path3(p); revolution a=revolution(p3,X,-alpha,0); render render=render(compression=0,merge=true); draw(surface(a),color,render); surface s=surface(p); draw(s,color,render); draw(rotate(-alpha,X)*s,color,render); draw(p3,blue); xaxis3(Label("$x$",1),xmax=1.25,dashed,Arrow3); yaxis3(Label("$y$",1),Arrow3); dot(Label("$(1,1)$"),(1,1,0),X+Y); arrow("$y=x$",(0.7,0.7,0),Y,0.75cm,red); arrow("$y=x^2$",F3(0.7),X,0.75cm,red); draw(arc(1.1X,0.3,90,90,3,-90),Arrow3); asymptote-3.05/examples/wedge.asy0000644000000000000000000000116415031566105015617 0ustar rootrootimport graph3; import solids; size(0,150); currentprojection=perspective(8,10,2); currentlight=White; draw(circle(O,4,Z)); draw(shift(-4Z)*scale(4,4,8)*unitcylinder,green+opacity(0.2)); triple F(real x){return (x,sqrt(16-x^2),sqrt((16-x^2)/3));} path3 p=graph(F,0,4,operator ..); path3 q=reverse(p)--rotate(180,(0,4,4/sqrt(3)))*p--cycle; render render=render(merge=true); draw(surface(q--cycle),red,render); real t=2; path3 triangle=(t,0,0)--(t,sqrt(16-t^2),0)--F(t)--cycle; draw(surface(triangle),blue,render); xaxis3("$x$",Arrow3,PenMargin3(0,0.25)); yaxis3("$y$",Arrow3,PenMargin3(0,0.25)); zaxis3("$z$",dashed,Arrow3); asymptote-3.05/examples/cheese.asy0000644000000000000000000000050215031566105015753 0ustar rootrootimport graph3; import palette; import contour3; size(400); real f(real x, real y, real z) { return cos(x)*sin(y)+cos(y)*sin(z)+cos(z)*sin(x); } surface sf=surface(contour3(f,(-2pi,-2pi,-2pi),(2pi,2pi,2pi),12)); sf.colors(palette(sf.map(abs),Gradient(red,yellow))); currentlight=nolight; draw(sf,render(merge=true)); asymptote-3.05/examples/parametricelevation.asy0000644000000000000000000000037615031566105020566 0ustar rootrootimport graph3; import palette; size(200); currentprojection=orthographic(4,2,4); triple f(pair z) {return expi(z.x,z.y);} surface s=surface(f,(0,0),(pi,2pi),10,Spline); draw(s,mean(palette(s.map(zpart),BWRainbow())),black,nolight,render(merge=true)); asymptote-3.05/examples/projectrevolution.asy0000644000000000000000000000065315031566105020323 0ustar rootrootimport solids; import palette; currentprojection=orthographic(20,0,3); size(400,300,IgnoreAspect); revolution r=revolution(graph(new triple(real x) { return (x,0,sin(x)*exp(-x/2));},0,2pi,operator ..),axis=Z); surface s=surface(r); surface S=planeproject(shift(-Z)*unitsquare3)*s; S.colors(palette(s.map(zpart),Rainbow())); render render=render(compression=Low,merge=true); draw(S,render); draw(s,lightgray,render); asymptote-3.05/examples/thermodynamics.asy0000644000000000000000000002035515031566105017555 0ustar rootroot// example file for roundedpath() in roundedpath.asy // written by stefan knorr // import needed packages import roundedpath; // function definition picture CreateKOOS(real Scale, string legend) // draw labeled coordinate system as picture { picture ReturnPic; real S = 1.2*Scale; draw(ReturnPic, ((-S,0)--(S,0)), bar = EndArrow); // x axis draw(ReturnPic, ((0,-S)--(0,S)), bar = EndArrow); // y axis label(ReturnPic, "$\varepsilon$", (S,0), SW); // x axis label label(ReturnPic, "$\sigma$", (0,S), SW); // y axis label label(ReturnPic, legend, (0.7S, -S), NW); // add label 'legend' return ReturnPic; // return picture } // some global definitions real S = 13mm; // universal scale factor for the whole file real grad = 0.25; // gradient for lines real radius = 0.04; // radius for the rounded path' real lw = 2; // linewidth pair A = (-1, -1); // start point for graphs pair E = ( 1, 1); // end point for graphs path graph; // local graph pen ActPen; // actual pen for each drawing picture T[]; // vector of all four diagrams real inc = 2.8; // increment-offset for combining pictures //////////////////////////////////////// 1st diagram T[1] = CreateKOOS(S, "$T_1$"); // initialise T[1] as empty diagram with label $T_1$ graph = A; // # pointwise definition of current path 'graph' graph = graph -- (A.x + grad*1.6, A.y + 1.6); // # graph = graph -- (E.x - grad*0.4, E.y - 0.4); // # graph = graph -- E; // # graph = roundedpath(graph, radius, S); // round edges of 'graph' using roundedpath() in roundedpath.asy ActPen = rgb(0,0,0.6) + linewidth(lw); // define pen for drawing in 1st diagram draw(T[1], graph, ActPen); // draw 'graph' with 'ActPen' into 'T[1]' (1st hysteresis branch) draw(T[1], rotate(180,(0,0))*graph, ActPen); // draw rotated 'graph' (2nd hysteresis branch) graph = (0,0) -- (grad*0.6, 0.6) -- ( (grad*0.6, 0.6) + (0.1, 0) ); // define branch from origin to hysteresis graph = roundedpath(graph, radius, S); // round this path draw(T[1], graph, ActPen); // draw this path into 'T[1]' //////////////////////////////////////// 2nd diagram T[2] = CreateKOOS(S, "$T_2$"); // initialise T[2] as empty diagram with label $T_2$ graph = A; // # pointwise definition of current path 'graph' graph = graph -- (A.x + grad*1.3, A.y + 1.3); // # graph = graph -- (E.x - grad*0.7 , E.y - 0.7); // # graph = graph -- E; // # graph = roundedpath(graph, radius, S); // round edges of 'graph' using roundedpath() in roundedpath.asy ActPen = rgb(0.2,0,0.4) + linewidth(lw); // define pen for drawing in 2nd diagram draw(T[2], graph, ActPen); // draw 'graph' with 'ActPen' into 'T[2]' (1st hysteresis branch) draw(T[2], rotate(180,(0,0))*graph, ActPen); // draw rotated 'graph' (2nd hysteresis branch) graph = (0,0) -- (grad*0.3, 0.3) -- ( (grad*0.3, 0.3) + (0.1, 0) ); // define branch from origin to hysteresis graph = roundedpath(graph, radius, S); // round this path draw(T[2], graph, ActPen); // draw this path into 'T[2]' //////////////////////////////////////// 3rd diagram T[3] = CreateKOOS(S, "$T_3$"); // initialise T[3] as empty diagram with label $T_3$ graph = A; // # pointwise definition of current path 'graph' graph = graph -- (A.x + grad*0.7, A.y + 0.7); // # graph = graph -- ( - grad*0.3 , - 0.3); // # graph = graph -- (0,0); // # graph = graph -- (grad*0.6, 0.6); // # graph = graph -- (E.x - grad*0.4, E.y - 0.4); // # graph = graph -- E; // # graph = roundedpath(graph, radius, S); // round edges of 'graph' using roundedpath() in roundedpath.asy ActPen = rgb(0.6,0,0.2) + linewidth(lw); // define pen for drawing in 3rd diagram draw(T[3], graph, ActPen); // draw 'graph' with 'ActPen' into 'T[3]' (1st hysteresis branch) draw(T[3], rotate(180,(0,0))*graph, ActPen); // draw rotated 'graph' (2nd hysteresis branch) //////////////////////////////////////// 4th diagram T[4] = CreateKOOS(S, "$T_4$"); // initialise T[4] as empty diagram with label $T_4$ graph = A; // # pointwise definition of current path 'graph' graph = graph -- (A.x + grad*0.4, A.y + 0.4); // # graph = graph -- ( - grad*0.6 , - 0.6); // # graph = graph -- (0,0); // # graph = graph -- (grad*0.9, 0.9); // # graph = graph -- (E.x - grad*0.1, E.y - 0.1); // # graph = graph -- E; // # graph = roundedpath(graph, radius, S); // round edges of 'graph' using roundedpath() in roundedpath.asy ActPen = rgb(0.6,0,0) + linewidth(lw); // define pen for drawing in 4th diagram draw(T[4], graph, ActPen); // draw 'graph' with 'ActPen' into 'T[4]' (1st hysteresis branch) draw(T[4], rotate(180,(0,0))*graph, ActPen); // draw rotated 'graph' (3nd hysteresis branch) // add some labels and black dots to the first two pictures pair SWW = (-0.8, -0.6); label(T[1], "$\sigma_f$", (0, 0.6S), NE); // sigma_f draw(T[1], (0, 0.6S), linewidth(3) + black); label(T[2], "$\sigma_f$", (0, 0.3S), NE); // sigma_f draw(T[2], (0, 0.3S), linewidth(3) + black); label(T[1], "$\varepsilon_p$", (0.7S, 0), SWW); // epsilon_p draw(T[1], (0.75S, 0), linewidth(3) + black); label(T[2], "$\varepsilon_p$", (0.7S, 0), SWW); // epsilon_p draw(T[2], (0.75S, 0), linewidth(3) + black); // add all pictures T[1...4] to the current one add(T[1],(0,0)); add(T[2],(1*inc*S,0)); add(T[3],(2*inc*S,0)); add(T[4],(3*inc*S,0)); // draw line of constant \sigma and all intersection points with the graphs in T[1...4] ActPen = linewidth(1) + dashed + gray(0.5); // pen definition draw((-S, 0.45*S)--((3*inc+1)*S, 0.45*S), ActPen); // draw backgoundline label("$\sigma_s$", (-S, 0.45S), W); // label 'sigma_s' path mark = scale(2)*unitcircle; // define mark-symbol to be used for intersections ActPen = linewidth(1) + gray(0.5); // define pen for intersection mark draw(shift(( 1 - grad*0.55 + 0*inc)*S, 0.45*S)*mark, ActPen); // # draw all intersections draw(shift((-1 + grad*1.45 + 0*inc)*S, 0.45*S)*mark, ActPen); // # draw(shift(( 1 - grad*0.55 + 1*inc)*S, 0.45*S)*mark, ActPen); // # draw(shift(( 1 - grad*0.55 + 2*inc)*S, 0.45*S)*mark, ActPen); // # draw(shift(( grad*0.45 + 2*inc)*S, 0.45*S)*mark, ActPen); // # draw(shift(( grad*0.45 + 3*inc)*S, 0.45*S)*mark, ActPen); // # asymptote-3.05/examples/piicon.png0000644000000000000000000005453115031566105016003 0ustar rootroot‰PNG  IHDR“ qY» &iCCPiccH‰••gP“YÇïó<é…@B‡PC‘*%€”Z(Ò«¨@èPElˆ¸+Šˆ4EE\•"kE ‹‚tƒ,ʺqQAYpß÷?¼ÿ™{ÏoþsæÞsÏùp ˆƒeÁË{bRºÀÛÉŽÌß(ŒŸ–ÂñôtßÕ»­Ä{ºßÏù®‘iü常¼rù)‚t ìeÖÌJOYá£ËLÿÂgWX°\à2ßXáèyìKο,ú’ãëÍ]~ )úÿ†ÿsïŠT8‚ôبÈl¦OrTzV˜ ’™¶Ò —Ëô$GÅ&D~Sðÿ•ü¥Gf§¯DnrÊ&AltL:ó5204_gñÆëK!FÿÏgE_½äzØs û¾zá•tî@úÑWOm¹¯”|:îð3™ÿz¨• €è@(U  t0–À8à|AØø $ȹ`(E`8ª@-hM œà<¸®ƒÛà.L‚—@Þ‚°¢A2¤é@F²† 7È ‚B¡h( Ê€r¡PT UAuPô tºÝ„¡‡Ð84ý }„˜ÓaXÖ‡Ù0v…}áõp4œ çÀùð^¸®‡OÂðø6< á—ð"Â@”]„p$‰BÈV¤)Gê‘V¤éCî!Bdù€Â h(&Je‰rFù¡ø¨TÔVT1ª uÕêEÝC£D¨Ïh2Z­ƒ¶@óÐèhtº]ŽnD·£¯¡‡Ñ“èw †aaÌ0Θ Lf3¦sÓ†¹ŒÄL`æ°X¬ Vk…õÀ†aÓ±ØJìIì%ìvûGÄ)áŒpޏ`\.WŽkÆ]Ä á¦p xq¼:ÞïÀo—àðÝø;øIüA‚À"X| q„„ B+áaŒð†H$ª͉^ÄXâvbññqœøD%i“¸¤Ri/é8é2é!é ™LÖ Û’ƒÉéä½ä&òUòSò{1š˜žO,Bl›XµX‡ØØ+ ž¢NáP6Pr(å”3”;”Yq¼¸†8WJ)Hq¤"¥öHµJ IÍKËIÛJGJJ·IK”aÊ8ÈÄËì—é”y"‹’Õ–õ’Í’="{MvVŽ.g)Ç—+”;-÷H–×–÷–ß,L¾_~NAQÁI!E¡RáªÂ¬"CÑV1N±Lñ¢âŒMÉZ)V©Lé’Ò ¦$“ÃL`V0{™"eyegå å:åå–ŠŸJžJ›ÊU‚*[5JµLµGU¤¦¤æ®–«Ö¢öH¯ÎVQ?¤Þ§>¯ÁÒÐØ­Ñ©1Í’fñX9¬Ö˜&YÓF3U³^ó¾F‹­¯uXë®6¬m¢£]­}GÖ1Õ‰Õ9¬3¸ ½Ê|UÒªúU£º$]Žn¦n‹î¸CÏM/O¯Sš~°þ~ý>ýÏ&   ©†.†y†Ý†iñªî¯&¯v\½mu×êׯ:Æ‘ÆGŒ˜ÐLÜMv›ô˜|253˜¶šÎ˜©™…šÕ˜²élOv1û†9ÚÜÎ|›ùyó¦é§-þ²ÔµŒ·l¶œ^ÃZ¹¦aÍ„•ŠU˜U•Кij}ÔZh£lfSoóÌVÕ6¶ÑvУʼnãœä¼²3°صÛÍs-¸[¸—í{'ûBûªƒŸC•ÃSGÇhÇG‘“‰Óf§ËÎhgWçýΣ<Ÿ×Ĺ˜¹lqéu%¹ú¸V¹>sÓv¸u»Ãî.îÜÇÖª¯MZÛé—ˆÿ2Â6¢,b&Ò*²4r*Ê*ª4j:Ú*ú@ôLŒMLyÌl,7¶*öuœs\mÜ|¼Güñø¥„€„¶D\bhâ¹$jR|Ro²brvò`ŠNJAŠ0Õ"õ`ªHà*hLƒÒÖ§u¥Ó—?Åþ ÍŒ]ã™Ö™Õ™ï³ü³ÎdKd'e÷oÒÞ´gÓTŽcÎO›Q›ù›{r•swäŽoál©Û m ßÚ³Mu[þ¶ÉíNÛOì ìˆßñ[žA^iÞÛ;»óò·çOìrÚÕR V (Ým¹»öÔ±? ìY½§rÏçˆÂ[EEåE‹Åüâ[?þXñãÒÞ¨½%¦%Göaö%íÙo³ÿD©DiNéÄ÷e̲²·7¼Yn\^{ˆp(ã°Â­¢«R­r_åbULÕpµ]u[|ÍžšùÇ‡ŽØi­U¨-ªýx4öèƒ:§ºŽzúòc˜c™Çž7ø7ôýÄþ©©Q¶±¨ñÓñ¤ãÂÞ'z›Ìšššå›KZà–Œ–™“!'ïþlÿsW«nk]£­è8•qêÅ/¡¿Œœv=Ýs†}¦õ¬úÙšvZ{aÔ±©CÔÓ)ì ê<çr®§Û²»ýW½_ŸW>_}AòBÉEÂÅü‹K—r.Í]N¹<{%úÊDÏÆžÇW¯Þïõê¸æzíÆuÇëWû8}—nXÝ8Óâæ¹[ì[·Mowô›ô·ÿfò[û€é@dz;]wÍïv®¼8d3tåžý½ë÷y÷o¯ñy02*|ñ`úaÂÃ×2-<Þ>†+|"þ¤ü©üÓúßµ~oš /ŒÛ÷?óyöx‚?ñò´?'󟓟—O)M5MMŸŸqœ¹ûb݋ɗ)/f þ”ø³æ•櫳ÙþÕ/ M¾¼^ú»øÌ›ãoßöÌyÎ=}—øna¾ð½ÌûØú>|œZÈZÄ.V|ÒúÔýÙõóØRâÒÒ?B,¾“sMT cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYsHHFÉk>NæIDATxÚíw˜Õ•öUÕÕ¹{òŒ²F9'Pe$@BlŒq€ÀlÀlpZÛëݵ½¶± 69˜5¶ÁÀ%¡,¡PeirÎÓÓ¹Âýþ¨î™IÈ”f?ÎóÌ3-MuÕ osî9ï=WB.sB I‘P{ÿgSîø"Ñ@ˆ­o¼Âн~ðäQÒÒüí×ýÿ&É~7·´òí/ âú+£L›=’î³oedz¿¢Î»„E_þ7 ]C±©¬ò¥ˆH$ ºùÿxþ!‘$dùâŒQדHü &0¥Ë^±^R‘ENùÇ”®& %K3‰>×LçIºàj—.&KûhZS˜€&˜†‰a&ÿú¹œMåâÉv©;ûIÄ4 ›Ì(³¦ „.Bâò_>\JIÀè"©Œ.¢™,‘Œ $nýߥnÔå(–K (‹•‹ ] L6UÆ–X™ÂDˆÏM\ªH€AÊå"K—“" $I$S@ÜàsS—*2)«Þ‹ÿè.#Xë\YBÒÁÀÔ禮C’ë“ÔA¹X¸êR`R”DÐ $àó0S‡FòåJŒ‹(éù] L €H˜9¬Wðs÷÷åbMr×Sr…+'')*Ü&âs7üœr±F§KÄ™’"Iÿaý¦¸l=ðdViêï€$'´ÿý¼'¨¥ù|¥K ™„0sÿ †R'7)’d­ Ïg<&yI’0 $ EQ;=ßúm`¦.dDâ-9/ÀºïW—“ØÔIH¦@|L ËJ’„iꀄ,+˜††Hj‰Ó&úÓJ*` CGQl„Cmì]ÿ,Y@[ˆ¬üéôrB8œ®D¼Ì@˜&’œ:% õû©r1gÆ’.&Y)1¸ÐþÞ u’,ÛˆÇbÄã!<^_ûÄ aògTg³f (6ØÂ‘õÿIf|i“ÆasD‰}Ý[‚(þq¨YãP³®`ä„ù–S–IL1…Ÿ T—ÀîR`RÂÊ a‚~–¸Œ3­–ah(ŠJéñml_þë2vê—Éîwyýg Ú$$I$LTgSøˆi „0{w|À_~}3S‡JL¾a®±3¶t0cHÑ6ÂÕETŸx“†=O²¿tjÎ z½_ZŽHCC’:œÄ—$ˆéÈW&›/N»î|p!?î…»ä`:Ý1Ma˜jŠ¢bf/N$‚BBÓ,[§iŠ"£(r§û a¢(*G÷­á­'odt“QCò ÏP_ñ›ÿ"Ëó · ¡¡øÔšI–A`ã¿x¥ûÞd@¯Lp99u¼g髨V&Þnù¸»õ¦ÿ‰ 1‡¨9ð$‡ßxoÿ¯‘?á~<¾ŒNšõïN2²,°) ÚdT¥]á!IÒgÖ¸ºnÍ¢Hþ—L©Ðu!6›YîÜiC¶&X–eëRÇ+'@U-ž…Ýn#‹ EÛM„0MT‡—ª«xág7Ò-SÆéÉÁ¥*ô›ztÊàC[Ù·ñË”ïŸÏä/¼@,&a·Å‰p_‡^H>ôì"L§ÛGá®åßõ6"LyF(!PAº§†t÷ <>•Ìœ 2zåãî?‚þ ¿Eß¶ ªw¾É¿ü³ç ˜ôN» YŠ!„rš’J¶J ª*@XL"†æ[”–6h#Žf@°5ˆÜÉ'û{d'K['Ÿ%I^¯I’/<Èr‡–’.6¼³ƒ*$PÃ0Âdåʽ¬Ys Ç‹™$¾ ¡d 5ÿ_»Œqwþ€¦ÙòÁž]¡Åã¤ù¼8NÖ­ÛÆ »q¹¼˜fbÀ%CoD׿M(dáÔõÈ¡¿,zŸ€3fk E«^eóž0¿|c*E•ýPäVLa³)á¨ËäDŒÂ2‰V᲌¦5cšV cÌ€b†÷Ú‹Mšn‡¼ô(™ÞÝrìtK÷‘é Gß^dŒ˜„’7˜xÝQN­ù ï®ëÎ/ß^ŠY1…œò<™ödœ$!LA4Ħ€b“‘C‹!$;6Õ™’kIÑèHã™t ±¦00…˜šŽË%¸ýö,Ê‚ùãÐu¢HíóyÑ4SêrY×vU)IË—ïæý¥Gxûã´ìÈøñ¥ v7ŠÍ†MµÑT&ä+8&&; â˸‹Ukûà´µ`šn÷fκÖzsd+ƒYQ$!Kì«üšËh Fh¨n ØAr 2ðÆ%øü¯Ðܼ”7ö>Nv·ëf32²e.’3Iø$ÉŽ=aKÂ"íKVŸã¦áhC–¹IrÑÛEDœ¤¢|Òñ÷Ðzd§QQ}‚ž§Jè3lã®fè?¡× 7é‘ù,œú-ÂyNµkM›tÊ;«EQh½ 3¡¡Í„ù>] Ó¢$ ‹¹*ÀH¼ ¦©a QÓâÄ5ƒ›Jy饘3gï¼³‘xÙà"™¹Tm”ôkdÖ®-äG?^ÅÎAúæaöÌ»IKOÇáT‰FÂDcáh Yh"“îJ†iX2ºiàrf3zÄplR¦°¡]70Iø>ˆ”,º†ÅMÿΡâq<õ &Ô·3²ùUúν¼é·q}óãhêÛ¬:>!të¥FIÇ0S§ƒ„M(k€a"£Sg&Ì¥†00EHùÄã“iªÀæÂÝ éµƒQu´ú¨m>€ÊJúÌÁ7á6îÈÈ ÿòâ7+[Ø[:Ÿ;„aÊã–§ÄÐÚÿ%uº6ùÙš°Éߥä‹'!aCQPddY Ë*ãÆ cÞÜ«øó_Þ`ÁÂ?°jåÃaÝñ‚‚©Ý–JR»c­ª ~XÈ÷¿¿œÅ™0á*–Ü?Žp$ĉGÙ²}Mu˜Z C„ˆ#K:±¨—9ãöá˜o©kaØì>Š‹Þcðۦi%:-%(ÀÔA²ÀgÙ7L/© Ùñ}ÜEï)_檦§xoöÎDV¢˜fjº4u ¥„ù0,°µ³Š’¡zK•)Óh&’dÃfóaˆ™Uer d'S†×1a˜°¢-°œ! ¸F^KÁ"'K"ßçžßÍáø¡>HR!ζþ×ϱ'~ë‰ç)íE$Ú¥žŽÿ§ÐnJ%@èÈŠ—ñWNçŽ/ßΟ_yŠ¥ïïaá¢+1Œ ¦TWL× l6…H8Îüt¿üõnšÁƒ\E}c¬\JIñ!´xÂ@°&_²TaVd‡„BÅi/V£ÅÕÓrtÈN¨îàJ Ž©7%&×Αâ4ŽËÜ»0ˆÏ%áûh%™“¾Ä°‰×ðpÍJkõq$Éù.­­p³ÿ.n¼á6ntQUUO9 γ˜¦)„Â0LëB!Þ}w§PՇĨ1KÅw¿«‹y×íN×Ï,²|—€™ú‹3n~¸YD"AÛï§ëq!„ëÞú/±ù·>!ôŸ‹¦ Ä[?I_¸&O446·_kÖ3kŠ7‹Ì"ò}!‚ßoç‹ÿú:âåg~"„B×4ëúD{#1]|wÉ\ñûûm¢äBèOˆ¶Ã_ïþ4]Û’è“~FDÛ¶®øƒXÿ ›Íü7Qü—<ñ‹%½Dkk Ó¸|Òñ‹Æ4ñ¯,_œŽxõ'=Åö?t‘} …O‹ÐÅ?ô‹Cû6X}Ñ5!„M­â–é>ñÚ?#j7!;žNK_ù~¢ÏñO5Ÿñ¸õ½ï}ï‡ ›ín!Ë?_ûz©=v¥øÑÞBœÝè~fdšÓ¨ªÂ»ïîáÆßâškîâÚ«góÖ»o±âƒ¿•!I•˜æ6fÌÈfÆ—øðÃW™6m N§»ÝE<®¡ëºfmÐÍÎZÁòJ,§ ƒ¬hmfÃo¤Ï¸‰`Ë£|õ 6ìlædSOæÝô †i¢ë:º®FqÚæÜü(‡ª\”U©>‚7 YéðöË?!50M“x\CÓ¬Ÿx<Ž$«ÔÕ7°ñÝÿ¤WÿAàëMóÑ=¬ÝQGÿ‰Kðû}Ä¢t]oÿÞ¹~t]'cWež~é¼}°t}%¥ G¶í&v`5îQ×1kþû~Ö^±4²‰7Í‹âHG7,IȰyºP$"ôÃ0:õå\í1+Ž™3§Yc§‡0Í5µµx=٘ œÇÕ\,GW’L®»îW¬Yãë_‡ÝÆ+ý3uÕû±Ù¢Æ1œÎ^{í×\ý‚v“hÝÇ \&3í¦l™Y’;ŒƒdZ¾/6ÕRÉvÕF,®³ë­ÅL-èFÚ˜y„÷¬ ª¢Ž½ÇZ?çòr³Ðu UíØs¯ª*º®qõœkh,ÿ.‡¶ÿ€‘e'põK¿AÙuìñXngz'_Ð4 $ 6}ð}|5äOXZ„ºc…Ô„sXtÝÝV»Ž”<Û'G»MæÉ—Þá¡Å7°zË(Óz m߯0‡ì‚¯‚ñÞ¼·¼†]¶àbšB‰Ðt„’r yŠ¢X+µOÐ[%“'OÂçSik :--ºåöcç®m€q~Ò§ !˜;÷·lÚ¤ðà’&nåÏyžºê}¨jºþóç÷¡¡á#-ša†a9q¶ä2ZêôÛz„f­¹$P¤Ž…¯$+ìXþKìÍïÐkÎW0*pü£=ì<ÖÊþò,n½ã[홼wÒ·SkÄ®^´˜°-Úâ ñõèGwˆÒã»}íÐŽŠb£¾¡‰ã[Ÿaâ•°õB¨h?‡ŽT¡y¯ +;—d`󓯆“íIFûUEæ/¼G4m6«wTSR'qtÓfâÇ?${Ú=äfŸbß_L€…ÄÊ2å~|öíáɶ뺆±ö>)Š‚¢Jlß~ÖֶϦÓ$„É5sŸ`Ͼ4zè;9q”·Þ~…P¨¨Àn?Ìü¯½ö4n·'DJòãòG¦ËÇN¤„•wÂrn ÷¬%pè1&ßúU0e*·®âXUœíÇ%¾óï/“›“‰iœîwYqRÙì ©© #Ј¯÷Üö § ×%:lM–åPÆ¥ÏÐ×[Nþ„© ëÔÙGa™ÌÕ7>Œ"Ón"þ‘œX* LÓÄfSøÚâeõnÁŽ#mœ¬Ñ9¶qZñzÎyî9ÇØ÷æhHíÛS,ôÈÖþ‹Ï4·I±ÙTdÙ 8'½zô¤¼¼’î_HZZúgÓÙ€4wîÓ?–Ã7ï]̇›6³jåßF=P„¢ìåoûo~ò“Ááp%ÊvaL´ß;õÇšÀdRÉD‘Éúž! xÓÏ=&µO-;WPTÞÆòõŒ›ó(×]·MӕΚ/õ³ahd¤û˜6÷œ*j"ÚX ÞlÊgï–¿ÐÜÚ†œ0½Šb£¡¡‰“;ŸaÒÄ(}F*ÚÇÁ%8»Íaòô¹ LdùÓ q{ŠÂfC×u®¹æžxá}Þþ0ÄGGB¯Ñ9±i5zÙ.z_ý0ݲ±ÿ¿„Ž5žP©}’OÓsý˜¦üÇ;|¦·¸ |iytï޲ңȲÂùÔ>Ó™@2˜;ïYNuç+_½™+W°wÏ9€à.W%¯¿þ4 Ì%‹a·ÛÛ'1 ËÜ¥d¡mr"›¼NÆÐtÐ#ØP$…‰Û—Áöe?'›Mô½îß1«PyâÛ5àÏŸËCßùQb‚äö˜W*@“,]7p¹TêÛœ44@¸ºÏàédtïI¿œ“˜zÓôÇ­<à²géá(§×¸¯cj&•ö³û\»ø[ØdˆÅôs€IjOj'Åj‹qÖk#‘( ,@ûÃÛ<ºäLa"Ë6,gÐL“n³¾‰¤¼ÌÜSA1Ьv›L‚ÿC¬IIRÚ_béÒ5Ü|ó e1}Úl"úúƒL›ö¥O¦³éyJJ{ó…ÛðÞûïp¸p#ªFÓv²`Á8^}N§ Ã0p8íèOš9k`åĦë­ ­¸ˆaèøÓÓ G¢¸Lñ’°  øüvnø_Ú>MÁõ·j…²µkÙuBgÛ‰{ð ªM¦©©ÇÝþl‹ó#:±l‰¼Â_[ÂS‡~GÍ©SäL “? ‡¶…M«þÄ_z§ÓIÉÑe¸+ɯLÆ1h¿øÅ-LŸ>Ã0±ÙË–ífõš£x<LS`S$ZÚ *eR0°’p})îܾ Ì÷±æ£Ýì:² #ÖÄžu¿§OV>;G þ÷c ì;2˜ì}©ù¯¥„CQÇ\ÖØ9vî¿.ÙÙ~LÓZÞ755óÌ3ˉD䘬Ⱥ•û²DÓ4òòºÓ&¾ÄŸ?xž;晘†S_Åà™1Ü£2Ov³w݇¼ð»­<ðÝ)}Ê7nG©ƒš#l‰¤µ )Á‹PI²ƒd 7*’”Afæ"† ÎØ1ãÑu×_û3--;øÞ÷iתÿ˜Rß(Y¶h#sç=MqqnùÂ<Þ}û-ŽÛ–ÐHÛ™?ï¾û2²lK¨o91‰ š¦Q_ßÂ+ÞÊûïdÓær\N/‘°ŒÝ‘MFf.|‡ÃŽb³!$ŸózáoBs=èabºwÏ—˜——$i˜†, L,Bœd "±Â4 GâìÝû!‹}Ÿ¢¢¿’žžÎ¢EÿÅÒ¥Ò2û-$tt#“ù#¨h8°Ê"ܽGÓw@Ú6¯â±·¯D–.Ï}l>ñuA$a‚:Õ.#JÚxûý]XädN.™áíŸ% ~ñ‹íüõ¯_ä†&òÁŠ-Ü|Óo‰Å²"'å;R€$¹G ˆRÒÓFãò>ÍúƒB‹mG˜yëÖ3$Ã7r¤0ZʨA‹iŒÏÁ©DE±!K&²lCVT$É ÈŠ‚b³áPmØlvìi~ªªb“%lªŠnÀÞûùhçj ý8Ë–þ ×\sE»výTšI‹žpíµ¿çÈ‘L¾öõ›x÷½·9~lkB#mfþü1¼ûî+Ȳå§X HËœlXï~ïvïiE–3é“?”ëÞ@Vv6n·UµÆh¨¯%®é¦ ÂЉDã„›Ðâq ÓF ¨£(m€Ü^ÙJ #¡Ø|ÂÐ=f4¹¹™|°ì/¾¸ ·ÛÇÒ¥Çùâ—þƒžÝòˆD4dEF``³ù))R)«_F[e9F oaLzŠ{¿6Ḍ& ae×Ù´¸?¦@VüFHɽ´&š ²deä%añ¶UeÍêu|íkOQ]=‚?üþ5¢Qã'ÜÂø+Æ£†$##£HÖË!$,) ¤ö1ѵ›ØuâvtsÂìNlÃ&ú×—‘–•Ü)9Èî7Y]z’œnèÓÀ0 tÃzÙ4ÃÄ4ã˜&h†Ž¡k†F ¦±¡-E7â4¶´P]^‚¦Äé ñÎÛÿÌüW¢iz»iþÄ`Jj¥x\Çn·ñƒ¼ÉæÍQ¾óè¬]»š£‡“¦móçá½÷þÜ®‰TUA’`ýúÃüà‡ï³mkMâ¶/L"77‹@(B]M ÷R_[E( …ÑMÓƒ0Pmq¾8F£¥>„f„ÔFÙ‘Ç)ªîƒ$ÅÜÓÉ’’É—¿r?µ5€ÌÎ…<8]£ÈÎÊä­wÞ ºº·Ë“I[ݦeQ_Û@ï†R<}‡Ñ¯Ç2JVÿŽu…Õø]m 9Ú÷ñ%õŽ"Ù¬¥¸„Å•,iš˜¦ Y’1õ(³f]MŸ¾ùTV¤ÓÜÜÌÎ'¡tïÑ‹Úúz6mÙˆÛ­¶ï 4›¬Àd²‹-~•µ —×ý´EŠÈJ«D3Ò]­”úWÖî» ·#hm­tSXß7&CÇ4ÃÉÙNhÔ$¡Ycš°hÑ`^{í9œNGbnmí‹™O¦$ ÃÄn·±bÅ>~÷Ä ¾q׃ìÝ·—];×¢È4mgHj縨ªÂúõ…üð‡Ëغµ‘ÁC§rßý³e‰£‡±þÃhl¬! €hIt hâ@‡#§3 Cq¬4Ì€ždt]ãÊÁ[(®®'Í#Œ´áteYÔT²¬ÐÒj£W±¤ûý”—— ôí;”×_o wï™hšNUUñØbÑzÀH¬blÚcgÞ­ô9¼“î#†ãKïÆ¤»Y¾ÕK4à¤3#àlmÒTÉX¬ob’rQm in*ÁåRرc/2’ì&3=“'ŽÐPû!’Ôšˆ¡ížIó)-Mù”U–±hJWMÊ!+¬a—uªêâ”VìÃŒ iñó!–r/€8»5ÆBD]1eP¨‰Y³&²`Átn¿}6™™i¨ªÃ0, œBzü‡5“aüâë˜0~.†n²~ýr$©Ã<ÊüùWòÞ{Ï%=ˆÅâ\ý3|ðA Æ_Å7—X Ú½{'ì"ª‚@PKzz¡P5³ggöìE„Ã-D"­Ìž=ƒÙ³gŽh<ùï7³ûàjúôíAm‹¨ÑÊ·nÝM, ž½ÇŸ~ Ó°To]]ƒÿ„î=ú´P_WBff.{ö”P^7Ü0”êš*â±fœŽ*ùÎB\®4 CG’ÝHz5‡Ê£ç‘SD›êhhäd›L±EéÁU‹¾‰jwXo·”äþtÓ4ñx¼¬_·+Wãðû»át;©®.ÇáhcëÖm#==»ÓNUuN§Î?ýÓBT5yÿ¤îKWÀ&¦ çíìÙñW~÷ÊJF”pØÂÕƒ/|ã›Øíîö@kïÊD–!jeöì™Ìž}¡P0%œaí´q:]8.À¢Z›¦Ù)ó‰7œnÞ¾÷½·(<äfñÝãùó_ÿDê¹jöüìgÿœ œ%“§?yh;­cpX"Óµá”êyøŸ憯>ˆ¡ëíÌÄ?Ã0ù—ù?þñ“üô§ËÈëÞ»ÃAeE9·ß>ŸÏ ''—ËMIñI¾ûÝ›ùÿø"šf´ÇÛ>É<µ¶ÞÈSOþ»Åãqsë—“•ÝIƒœKÒÓÓÏ¢@L4MGQ”ö0Jòo"äŸLu˜·ßÿá0w~íavìÚAEy!’Ô‚Çøã#33€÷ßßÇõ×ÿk®½“1£F²k÷GìÚµp¨ hŠÉȰóÐC·ðÀ_Æï÷b·;;=/×HîÜNÆ LÓdÆÌ«ö^1úã³hZaD˜4å*fÏ™‡0uL³c›TS“z“™‘Îöm›€ Ý»§ó§ÿÙDvîL\;Ue@5“&d"‘ªªbN§ƒk¿ð(¿úîzê­8Üvo"df3}ÁƒV S` ãcØ®£Øµ« ȦgÞZ@9={ão[d’––E$*±Û{V(à“†…x½¾÷ýœF•Ö9÷¾»Ž1>}Ï¡iŠDÒ½süël üÄšÉ0t~þ‹µŒ»b.q-Ζ-k¤B”²`Á®¿~¡PˆÿþÅûüæw§¸í¶ûÉÌNç/¯þ‰êªB$)”‘aðío߯·¿ýU23³Këhš–H¶ŠNŒÔ(¹(ƒÜìLþù_¾ßémK?ABUe‚ÁÏ>»!C®ÅÐ4êjË&¦M»†¢¢:2²z †¨¯«lLœ8‡ÃŽ,˨ªΘ2í¾õã·ø×‡nG!F?ÿÍKdffbªµAícƒ“É¿ÕÕU³qc!0š¾}zsªø$`PP0’W_Ý xÉÍëAUM  3eʈD{Tdù“k& ½{qÕìÙ8ìjJ{ÎM+I&jÁ`ýú@½ûô#ŽÐÜxŒ9WãàÁB ˆÏ›Ýî ¦¶SÔ`±Ä=.èüŸWùØ”vçÕÛ&\y ÑhœÍ[V#K„(fþüñ,Xp×^ûßlÝ ,y”ŠŠJ^óOhñj IÚûïþE‹æµ«ß$ˆ>©Søˆª*ƒm<ûÜfzö‡¢(TV•,\8>8In÷(6;•å@Ÿ¯sŸOoSRk&“°Ÿô°þ@€íÛŽÝéÓ§/UUU@)³g#/o(`'=#—ÓAeU)S§'--í|Wú¹àr˜’ªi²,ñþMáa7'ŽgŪ÷Ñbµ˜¢¯·eËþÈ~ô&«Wøæ7æø‰“¼ÿþ«½¤ã¸\'yç§Y°`>ñ¸†Ívá@”J>‹„5Â!ýú ¡¥©‘Æúrœ†!()ic@¿A´4·ÐX_†Çãeñâ/tŠ›œÞ¾¤)N]Áœ«ý––´ÔäÖ­û´¹pyrHó§sâÄT5[nžÊ²e›€ ÒÒÒ‘Ä#5LŸ>Ñu½KRÕ Lg3oOšæ@ õu@a¶±uëIz÷ÉÇ”jj+^oÒé>ÿÓò—Zزy/C^^zòr]ìÞ½›P(‚bó‘žžNSC=N—)SÆY“ó)Yš—J¬= éºÝ®°rå>žøÃan»ív|ôe…@ 6[¿yìG<øàR ¦ÜˆáÃxó¿ÐÒx Y®B–ñÊ+¿#33]×/šF‚÷Âó«‰Ç :”’Òb´xÝ») >œŠ ‰~†ÐØÐDkS^O‹ßД;’dVÄã!ò@ò“••Cyy1²’ƃßúË—¯âx¼Ù(6•ºú„Y×%WrpšfJr”~öó Œ?]‹±eóꄟTÊüùcøëk-¤gNeâÄɼùæß¨©>Œ,×!I‡yï½§X°àºvt!ý£Ó%©׬=‚Ó5„ôôtJŠOµÌ¹z4ÅÅM€Æ€~ý¨­.‚x¼aŽ ã/%W~Ï?ÿ:mÁFòºõ@µÛ©¬¬@–êmÎ<øýi8œ.*«+™:uiié]n% wø­óæýšâ¢,&MÏŠ•ïÕ D9£FÁàÁײrU \ÇÊ•ïS^¾Ei@– y÷ÝÇY°`n"’­\4DZ³‰«gÓæS >–`[["ŽÔÊèÑ}8|8Ьäãv9(«,ʸûî¹ø|éÄ_JJ0hm§ÎËëŽ")Ô×–pÕU£ƒ?üH##-YRˆGj»ìJ@NîÀ•e‰eËö²m{Œ›n¹•M›7Q^V4ãóÕrÝu×ó̳Å|ñÖ/säðAÚ†$µa{yë­_±`Áµhšµ¹ñb™¶¤t˜¸•hq'ÃG §´¬„X´ŠŒ …[oÇÒ¥;4`(¦iRS]Ø™9s’5ÀÑUU@3Ï=÷Ѓìì\›€fÌÀÆ;€t¼ÞL­ Óhj¿GWZÉAB3Y„vÇÛ¬™7SWWËö¥6 Ù³‡s°ÐM~¿I¸=.6lX‰$…â8 ^Á¢EM\< Aª‰;ŠÝ9”ŒôtNj™={4ÅÅ̓*ùúSSWK$\ßcòd+—û:¿¢‹¹?={ô¤¦º ™´µé€·×]µQYYÊÔi]w% kšÇãåK·O¤¸¨”!ƒ†áõy0º~S¦ÜÁ€þyï½7‰Çª0ÍR22êyùåÇ/iÃOTnÚ\ÌèÑãh ´Q]]ÔrýõyýÍhZ!ƒQ][ƒ¯Ãït ^˜`e€-[yôìÙ“ŠÊJ † ª^ÀNFzªÃC[k-Ó¦ ¤.¹’ƒÄj`Μì?°Evðµ¯ÞÇw<Ä]÷<ÄACxûí7h¨;‰,×£(Çyå•ß’••…a\:óVýp€çŸ[G<îeè°¡œ:uŠx¬GâwÝDYiÈ#3;—ªêJ ©SGuò—ΗœžÜmksáòdá÷y)+)Æîˆ0sÆX¶oߤãóxÑba !âîÕÕĦ(hþüq\5k/ÿϿӷßz÷ì…f±£ûim)*¤Ã¼ûîÓ,XpM§Ý Hí[kåwÖ®;†?miiéœ:u¨aæÌèšÌïÿ°”ìÜ™Ømvª*JZ&Mº°Q§é³J2¹«( ;v¢ôêÕ‡ÓNqñIfÍ‚Ïµ‰íÛö#q{½­@—û쌅®"˜–¯½v?¿üå;üö·+)-nÆrΣHR+.WŒ×_Œ ®9#žt±%•Q¹jÕ&Ö­+äê«ÿ‰¦úªªNQ}ôÀN0¨2vPB¡Vê+H¥è&ý¥ó¹’³’»F"¹Ûܼn´˜F Ó¦ÍÀ0$d%°“‘™K}C3ªÝË}÷]ð‰Šp]ŽbƒŽB.—“Ÿþôzè:ž{îMb1 !4Ž÷Ý÷e²²r¼ç‹˜L•ÔÜ׺u‡n 4]íÑHf¦ÉìÙü÷¿a˜ 4˜êêjt½î¬Ýó)IióæB`={ô¤¶®hDU­MŽVù?p‘æÏ ¸á8²m§étA¥€-uÛŠ,[‡Ùdf¦ó½ï-î˜$Óðb&oÏ&©&.hãÙgw0 ÿldEåTÑ ”»ï¾ ©« “¤è:²ŸÓ)ºŠrþb9IIQ¶oßG[›·+› &ûö@U=ÜsÏ ¼øâ_ …êq{&à°+455!ˆrf%ß®%2t>òIU­š<š¦[ÅIukçH’`Ÿ”KiÓ“qœmÛŽÒÒ¢0fÌx*+Ëhn,4®kižçž[KÞ#õœÝó!©d¸mÛvòº÷Æf·S]U†Ûm'áÅãV1 ·Û‡ª(45×ãtĬzK]X::èDQµêuü¨—$Â}º$µR²-¿úÕë(¶>ôîÕ›#‡÷ dfjÌ™=•Õ«· ê ì7ˆ–¦æ¿KÑ=?m³Ú¥ëé@¹9yèZŒ¶À)X²ˆôôŒDûÝ€ŸÏƒÃ馶ºšûî»Çß^9¸+J—ŠÙ[Ôò)Ù¼¥†1£'ŒF(+/*¹ÿþ›‘$•?ÜØé߯ÕµU\HŠnRTU!háé§ÿÈ#=+—†Æf »=Ø~]×ùå uÞ‰R 䙑M,%<Á7¿yii‰gËáT}&àõû8zìPÔ‚Ade[åyži%ñ¨Ä°Áƒ©¯©#ªÅ—bJÁX«Ãç9…’Zƒà™ç^%ØROϽq¨n*«*©Ç®Ò^~93vÕŽ")DBA0Ãü½"]A.{0A‡¯´eËQZ›ýŒ3ŽúÚjë,6ÃŒ™ƒeË”ZGNN&•U%@Ó¦Çï÷]’ L=îÜdfå"Û º¦’©Ó†âó§#e' â°«H²p8„Ã%è®R»t‰.´;Þë tġÅÄ#5ätOçž»o  òÌó«éÙ{²ê¤¢²¨aÒ„^$)'ç{ÙÝÁ¬4Ù¶ó AzZm-0*™2yÉ­K–Xµ/ívŠê ¦¾Žû_ÇãëÒÑo¸ÌÁ”4qªªÐÐÐÌ3Ïïbô˜)hº ¨ä$PÂâoL'7§B"á8áž½új R]WHL¼@ݤHZ›Ùºe/NVf-­m@Õ¡vµu €ÝnGU,‡<ɰîÕu¦ËLÐÁ¦|öù´6LÅŧhn´j̘am ’$‰ç_Z3lÈ`*kjУ5dws1}Úd«³€r’I¶#+9 ;HÏH§¡±Õ•Æý÷ZL[ûyïV±yÙfG‘%„¡‘ZA·«F¿á2ÓélÊuëNáOIvfÇÊ™;oª«J€*ßuÝY«Â¿vZ¿cñ8š®¢Ú=¨ª“ÆÆd9ÖIëtˆ„ÝfGH ˆø?T7òr–ËLɨ²$ÁªU›Y·æ'L¢¡¹òÊb ‰™3‘ܪÕ±uk1ýûĦʉRÍA|~ËW¹Pôbðîÿü ¯Ô‘™‘‰TZZ[‘D´ÓÉ™–XG½+6)Q0¾ëj¢Óå²S'6åúã@O† ̱c‡‰†ªHËйë7–ϲeÛa"a7ýú  ±±…ºš2<>?‹ïº0)”d“`ŽE퀯ׇî pº4ä3¸2  !·Ÿ£÷E.K0ufSyî…0d6YåÄñã@“'u'/¯'ñ¸¥¶m; ( ÈïGMMˆfÜž N×…£œt*Ú*;~:v47Vsïâëñ&Vi× ,Ú‰„ùG)—)˜ …M¹ýÍ 2WŒ½‚ÊÊjjëK€0ëÜ_ƒ¤‘im‘€deeP]UÊ…¦œ$%5, Û².·»]¢©¹‰ÉSGàó§¥ `¢ÂÔðzýlÛ²‡¶@K—&ÆÁe¦Žp€å¨>öØ[ØÔA >”Ç÷ •“•£rïâŽÕ™ª*CAž{a ½ûæ:)«°Niº”“¤¤Þ×4@Åëñ#L-ÚÄÔ‚1œ½Ö’Bë eMQl™ ÿù_vrY€ RÃMlÚÜÀã ÐucÇŽ•|ë[ד‹¦éíàÛ¼i-ýû "ØÚDM}ƒrbµ75`imªt:}„B ˆ c7JjdÙ:ú;®˜˜ØT†uÒx—K¦ä@w„Ö g2~ü9rˆ–ærüéK¾Ù±ÌNFÇ·o?Ø0 ŸŠšjŒX9Ýl…rÉ€eK"`™‰Ëí¢-B(R’Ç”L0'vØè­@]70Mjw`£ùLŸY:vž(47·òÛ߬aÈÐ 8 ÷ä“Ó­]{%kFnÝQ‰ÃÙŸ/ÊòR š{îZpA)'§‹i@,⤥ù‰F£@‡³óó“ýÉS¦iDbQ$t¼7B8ùLçARwžüî‰÷ikµQP0•“E§¨­+©Gú*а¶Ù´ñùý†bªª“”Ñ~ß‹²Ì–½ »HOóÓØÔ€í,Ë$˜ &MÀ›î# ¡ëN·D‡¶íºk¹K ¦N쀶6žx|-½{O ;;›ƒ÷ƒYÌܹƒ˜;÷šÄ) r‡‰Ûq‚hØOÿþ¨©¯§¡¾ÏÆâ»n. å¤sÛ­ßñ¸†¡+¨v76›ƒÆ†Z%~FÀ²#Zn˜:‘h —Ã…$ÙÛÁÖ•õÓ%×Lí쀭Çiiöp優ªª(.;Dxäá;°œX³Óõë)”ü>}¨¬¶R(3fŽ";'·Ý^HÍÔ~ÐÎ ¯nk /;›¬ÒÜ܂̙¤¸öh¹,!Ë1 B[0ˆÛã!³uûDÿºnÁ¯K¦Ó«Ïýê±÷qºû2 >û÷z-9y :Vftzƒ<ûâ&rºÀårS^VŒ•BéÎ…N¡œ.ñ¨ ¨x}i¨ RœÃAV>N+ 0#€I($Ýï4¶mI‚©ëºKª™:‚”ÛX»º˜iÓfÐÚÚBQ©µódÉý ñû3Îp¦#á8¡6ù½û‰…¨¨*»h)”3GÐb x<$YÐÚRË}‹oÆû1…»dY`wÆ8ÁP ^HÇ”¼‰+¤.¿$`:[R¶å3rÄp i+!»›‡o}ë+‰ëäöÞi5ñhœ!C‡RYQE,\‹?-À”-vñr\6¬­KNâÑ(m?ÃîôÒ=š¦ãõfpï=_‰Æ"¸<Àƒ0/ü‰¡Z.¡™ëà,mÚÜ̸±S0 Á±ãG€ î½k2Y™ÙhšŽ$uÞì¸nm!’­/Y™™”—[ à‚ɃñûÓ/7È*?h·«Dã'µÐéÙŠÉ:  Ðu·7›­Û¢Kçç.˜’AÊ?<µšhØË„+¯äèÑ£47–ƒÔÊŒgš¬dH`˶"Š")‰Â§ Ìœ5 ë`KqT„„¢¨‰•Z ¤0%Ûb$ Õ¡`x 4˜—8ÓjbGHà8ÑP:ƒ¤®¾ŽúÚr<~•»;U.þ›-²$c-ÄD‚AÙY¬Ò؉XÓÔI€u2©ë¤ed")™íõºª\Í”ô},Î’ÁäÉT”WPU} òðÃ_:‚”ÐÂuk÷6úå÷£´²¨eÆŒ‘äæv;ïgÇýCC( Dû²þìÏoÓä+ðe8‰„ÚÐ4ì¬L4ÍÞNCî¢Vîâ‚©ƒ³¤`q–JñøÇгGöîßF#9yáN\¤¤$kY>÷ÒfzöjwS^zŠ‹Åª<[?: £,'P Îñ=ë·iè`¶ašš›ÉÌÊA¶ðìóoV «+úM]3u„v²vÍ1fLICC=åå'€ÒD8 ½0’¼Í›÷Ñ\oÒ¿ÿBm-TÖ”2'´:s‘B5ŸÈØÆß 8&¿f³É8\£¡±ž4¿ð‹:>æ]C.˜Î ¼‹Í>€aCs ð Ñp%™Ù6¾ý­¯µ_—ÐÎ,ƒ÷§¼¢-RKn•éÓ&&¾sqBvòÆã€„¬ÈVÖ“s[¡i^o÷Þó ¶`ˆ´4I,žÔF]3Öt‘Í\*g©ž+¯(@ÓãœÉ&ªª¢SS[MVv غåPbºÞ*Lgp–žXKÏ^W’“ˡ½ ÎÒ@æÎÝÎYJ~¯ÃǪcãæ“ 2E‘)++š™5k4—.ê É•ˆçßÚÊtî1¿?iÓÆ-ÔÕW“““t'®{Úïý¹f:‹tp–NÒÒäaâ„)TWWsªä呇¿L*g)éÿ´s†^\J<¢0bèêꨯ-Ãã—¸ûÖ1¤—*Ÿ%Iâ´3â’Ÿ•s|GB×5@aÒø~@ M!“—ן§žYI0ê’NøÓY9Kž| ìÏÞ}»@¯#'/DAA2N$wúnò{­Í —ž½zRV^ T3cƈKõN¶ÑÀÔÛ%%Z/ŸsX…èо“&ÉAMM5±x„Þ}ú Ú‰Fâ‰k»Övñ ®™,Ó%±rå.Ö®.媳iin¦¸ä8PÌ’û$8KÖÒ>y*'$£Þ!ž}a½zÄ®z(+)jS¢ÞÚ§mÚgËTeP0e FÉbÞâäÛÔÝ”‚qøü"¡š›šÈÏH<åù—V$¼+ùM L§k¥_?¶»s C‡ 㣽{ ËÈÌVøv;g©#H™zJÒÖ­…´4Æ8h@5e€`⤎UÜÅËTé€LÁä+ 1-Ž¢¨€Óè0Q§Y,0ú™6m$Ð@ye9ݺe9´6w˜ûÏ5SB:´ÒNÖ¬.cÆô« ‡‚œ8q(ã[ßšÖ ej=Ëõë÷† DYYF¬šÜ2Ó§M²:pQ‰p´·¯ãs0ˆF#8*`ï”ý?[Û:ùMz5ÔÕÔâP=tË̳/®% ¶Wî*€º `:C+ýfvç`FÉî= ”™£ðí­“’±—ÔoO쾸•ì¼Q¸=.ŠJŠ€Jî¾s^oÚEz'¥s;Á¢àq8]@&[·íÅ*Da;+Rý&+¯¨PVUL0ÒFÿACii0Ùº­ Qq¸k˜º ¦™:´ÒÖ¬*eÚôÙ„BÁÄùp¥|ëÁ¹d¦0)“’“Ú¼yMõ‚AD¨¬,`æÌ+KõNi©ÕO½‰„ðxœ8<ÙlÝr€À9 Q¤úMÓ§M$·»ƒX¨Žšªjú÷عk9áçL§×¤|ì7˰©ƒ3r{÷ï¶´R¶|N­Ô‘Ø=¨ 2ŒòŠ ¢ájr{¨LI9èïR t;7iÊ•€‹æ¦&ÉŽ×åBRº!Iö¿{]7ðzýÜý@9Å¥¥ädgâKÎó/m't)SwA4S²üÊU[X½ªˆ‚)3ˆÇ5Ž=TðíoÏ?«VJJGb·§{(þô4JJOåÜ}ç |¾´N«¿K2p©D·t/uuDâq|¾ ´¸D<~n¢›¥U­Ï3gŽLŠJŽ£ë:C ±Ö`ûŽ#íãÙ伂©ãøSëßÖº3nìhÒÚRŽ?=Î’oÞ œ©•:|­ŽÄîÐ!ÃÑ4âÒS€ÄÌ™W´çRúIF Ó¨# ¢ëz÷éE,ÜÂ3Ͻ•ø»ñwý¦©SÆ’kl©¤´¢œ#F~{ìUk’ä®À<¯`JMè65·ðÔs»1j&22…‡ö5g¡8]’‰Ýþ¸ŽXÔΈá鮨"¨J˜8ëàKi⬾Z€JOÏ`êôјZ#‘P„̬À‰·§\{ö]²¿^¯Ÿ\Tpüø1²³sÈÎÉæ-UÔÕÕvl1¿ÌMÝy×LíÇŸ>¾”@“`òĉ;YDScH5›ÐMJjb×nïCNNÅ¥'Rî¾s>Ÿÿ’›¸ä³“±¦)‡uÔÖ×’îOòزý(`|ìŠ.y¤vzàþp{MNœ}G±qS í »œå¼‚)õˆ §«ùùùìÛ¿Œ눊'UN?[nýºc(j>Ýóºqªè8PŤ‰=HKK¿¤‰ÝÓ%Ù§SÅíRßXC4¤ÿ@œÛ¿E²ßwc!””ÑÔÜÈèQ£‰EÏ¥äê.õKt.9f®ƒß½m[='N'j£´ì8PÆK%vœÝWê8[n=kVïc̨+Ð “¢â@”G¹ 1ÍË+ùimðqßÝó0õR›[ÈÍκ±ã£rþž‰êXÉBnn.Ó¦³’SÅ¥ôêÝÈ$î»VÎ ˜¬ãØ-õô³k ‡|Œ5œÃ‡ ”ãõÃK¬ åé¹´Žp‚õ{ÇG †EUU%–Rr{Ø™O>ó.Á`ÛeO˜;ošÉ²û‚í»ŠèÛM 4µÖ- 蟋Óé<ë÷RKåüþÉ7hn1fôhšÎ©¢Ã@”3-òÜå°ŠK•dÛZe3}ÚPj«JˆG#ôëÛÈfÆ£$“¾É>Ÿ> àšlß±pGf·×o-XºÀÙtçÍg’$h 4³eónzvïESs Z$’žÝÑÖÖÖ>x©<MÓ±Ûm477ð»Ç×€2œáCStò$¡¶Ì»ns¯½ª=b|9ªù¤Æ¼jö` šâ² zõι'›·œ ¡¡áŒÕX*³B×õÄ.ç¬\¾ätdIB±Ù©¯k䛋oüØâa—“œWÜçÏ`ÆŒID£‘ ¢¸´™lÜ´°V$ñ¸Ö®TÕ†®ÇøêÿNK£‹‘ÃÇàö¦±ÿà ™‡²öÒ%}ªËI3%¥c5v5.àðáB²³²èÓg ¡6O=cÕÐu£Ó‹$„@×ul6ÃÐyì±?½/™Y98nZZëHK?w4ýr‘óæ3Yà¸òŠ^TÕT“–ž…lw ‹›n¹÷—.EUUl6‹U©iQ6nÚÂì«ïaÙ{'p83þʉ””SSµ¹× bîÜ)ít–ËQ:¯Ær˜6­%Ň ¶µ1tÈH ?¾”¦æFìv±X]×Ûµ™,+D"!n¸é ¬^uÅ1 „ƒ!‡ÑÐØ„ÛÕÌ}‹gþÆÏ*çÍgJNö¤ÉýˆÇZðz=d¤ç€áBRú‚9ŒëÝÆ¼7òØoÇôŸôÊŸÆÕ×<Ħƒ cܸIdeç²}Ç ŠG¾žÔÌåüV&ÓC~çF ’ƒ‡Ó¯_üýij°óµ¯ÿ]ápرÙl e°lù2²»õcù²BÇ$Œ¸›¬¬ÞŒ5‚í;¶1z´“Üܬ‹RAø³Êy‰Ñ[9&ëóœÙÃhmYJ µ±c'°vM%Â00;²­+—Ÿ`åòBÀôGRrÕFœÄìÙsøpãª+?dÑØ{íäN@½œ%Y£|¸æÚX¿a#WŒÇÐ!£Ø¹£ŠeïïdÁ¢{™={‘H„x<Îó/¾FK“†ˆâè¡¥!«¹Ìš9—P(JqÉ>~û[k;W²zÌå,ç5ác&>¯›§Ÿ^À£®â‹·…H8ÄŽ›0â.„ìER{"ËLÆ0|þÞL)˜Å•WŒeÓÆMlÙô ®Â[oü+¦ÙÁù¹œßȤ”¬Žòè£ X½êq:ÈÄ “(*:DCcŒÕ+³jŇ@ P¾È¶nHj:†æÁnÏeÎìy :„ÿþåñÏÿ:œ¹×\¦¨êå_ëRç±…ÉÁ”$¸þ†'9P˜Å-7ÝJC]%[wn§®¶œx\Ãf³‘““Cÿ~C;f4ѨÆo¾AsË^~ðƒ™üÓwàñxo£|ñŽ®øÌ}O ª$Xxòì½fîºç{hZŒ·ßz`¸›¢ ]äxèÞm ×^;—Œ´,ž|êIf]Ë—~I²u‰ Î#˜Roc›Mæwr×â Œ1áÃ")6dI%haó–­œ:¹“©32øù-bú´hš¢ÈȲÔ%€tú¦0XxýïX»:Âý÷=D4cÍÚUTUŸBÓâ dvyÝz1fô8Bá¡“ìܵ‚û—ôå»ÿ2ÇÝ)”r¹Ãy×LɎ뺉ª*|°bË?(aÇ-Ä£Â08ª#F,VÍM7áúE#˜7w ¦)0 £}µ×ðlýo?TG˜,¼áqV,«cÑ¢o0`@>z #include #include "common.h" #include "settings.h" #include "symbolmaps.h" using std::ostream; struct handled_error : std::exception {}; // Exception to process next file. struct interrupted : std::exception {}; // Exception to interrupt execution. struct quit : std::exception {}; // Exception to quit current operation. struct EofException : std::exception {}; // Exception to exit interactive mode. class fileinfo : public gc { string filename; size_t lineNum; public: fileinfo(string filename, size_t lineNum=1) : filename(filename), lineNum(lineNum) {} size_t line() const { return lineNum; } string name() const { return filename; } // The filename without the directory and without the '.asy' suffix. // Note that this assumes name are separated by a forward slash. string moduleName() const { size_t start = filename.rfind('/'); if (start == filename.npos) start = 0; else // Step over slash. ++start; size_t end = filename.rfind(".asy"); if (end != filename.size() - 4) end = filename.size(); return filename.substr(start, end-start); } // Specifies a newline symbol at the character position given. void newline() { ++lineNum; } }; inline bool operator == (const fileinfo& a, const fileinfo& b) { return a.line() == b.line() && a.name() == b.name(); } class position : public gc { fileinfo *file; size_t line; size_t column; public: void init(fileinfo *f, Int p) { file = f; if (file) { line = file->line(); column = p; } else { line = column = 0; } } string filename() const { return file ? file->name() : ""; } size_t Line() const { return line; } size_t Column() const { return column; } position shift(unsigned int offset) const { position P=*this; P.line -= offset; return P; } std::pairLineColumn() const { return std::pair(line,column); } bool match(const string& s) { return file && file->name() == s; } bool match(size_t l) { return line == l; } bool matchColumn(size_t c) { return column == c; } bool operator! () const { return (file == 0); } friend ostream& operator << (ostream& out, const position& pos); typedef std::pair posInFile; typedef std::pair filePos; explicit operator AsymptoteLsp::filePos() { return std::make_pair((std::string) file->name().c_str(),LineColumn()); } void print(ostream& out) const { if (file) { out << file->name() << ":" << line << "." << column; } } // Write out just the module name and line number. void printTerse(ostream& out) const { if (file) { out << file->moduleName() << ":" << line; } } }; extern position nullPos; struct nullPosInitializer { nullPosInitializer() {nullPos.init(NULL,0);} }; inline bool operator == (const position& a, const position& b) { return a.Line() == b.Line() && a.Column() == b.Column() && a.filename() == b.filename(); } string warning(string s); class errorstream { ostream& out; bool anyErrors; bool anyWarnings; bool floating; // Was a message output without a terminating newline? // Is there an error that warrants the asy process to return 1 instead of 0? bool anyStatusErrors; public: static bool interrupt; // Is there a pending interrupt? using traceback_t = mem::list ; traceback_t traceback; errorstream(ostream& out = cerr) : out(out), anyErrors(false), anyWarnings(false), floating(false), anyStatusErrors(false) {} void clear(); void message(position pos, const string& s); void Interrupt(bool b) { interrupt=b; } // An error is encountered, not in the user's code, but in the way the // compiler works! This may be augmented in the future with a message // to contact the compiler writers. void compiler(); void compiler(position pos); // An error encountered when running compiled code. This method does // not stop the executable, but the executable should be stopped // shortly after calling this method. void runtime(position pos); // Errors encountered when compiling making it impossible to run the code. void error(position pos); // Indicate potential problems in the code, but the code is still usable. void warning(position pos); void warning(position pos, string s); // Single a fatal error and execute the main process. void fatal(position pos); // Print out position in code to aid debugging. void trace(position pos); // Sends stuff to out to print. // NOTE: May later make it do automatic line breaking for long messages. template errorstream& operator << (const T& x) { flush(out); out << x; return *this; } // Reporting errors to the stream may be incomplete. This draws the // appropriate newlines or file excerpts that may be needed at the end. void sync(bool reportTraceback=false); void cont(); bool errors() const { return anyErrors; } bool warnings() const { return anyWarnings || errors(); } void statusError() { anyStatusErrors=true; } // Returns true if no errors have occured that should be reported by the // return value of the process. bool processStatus() const { return !anyStatusErrors; } }; extern errorstream em; void outOfMemory(); GC_DECLARE_PTRFREE(nullPosInitializer); #endif asymptote-3.05/record.h0000644000000000000000000000540215031566105013616 0ustar rootroot/***** * record.h * Andy Hammerlindl 2003/07/09 * * The type for records and modules in the language. *****/ #ifndef RECORD_H #define RECORD_H #include "types.h" #include "env.h" #include "frame.h" #include "access.h" namespace vm { struct lambda; } using trans::frame; using trans::protoenv; using trans::varEntry; using trans::tyEntry; namespace types { class record : public ty { // The base name of this type. symbol name; // The frame. Like a frame for a function, it allocates the accesses // for fields and specifies the size of the record. frame *level; // The runtime representation of the record used by the virtual machine. vm::lambda *init; public: // The name bindings for fields of the record. protoenv e; // These are name bindings that should be added to the enclosing environment // after translation of the record is completed. Constructors implicitly // defined by "operator init" are stored here. protoenv postdefenv; record(symbol name, frame *level); ~record(); symbol getName() { return name; } symbol getTemplateIndex() { return getName(); // May change in the future. } bool isReference() { return true; } size_t hash() const { // Use the pointer, as two records are equivalent only if they are the // same object. return (size_t)this; } // Initialize to null by default. trans::access *initializer(); frame *getLevel(bool statically = false) { if (statically) { frame *f=level->getParent(); return f ? f : level; } else return level; } vm::lambda *getInit() { return init; } // Allocates a new dynamic field in the record. trans::access *allocField(bool statically) { frame *underlevel = getLevel(statically); assert(underlevel); return underlevel->allocLocal(); } // Create a statically enclosed record from this record. record *newRecord(symbol id, bool statically); void print(ostream& out) const { out << name; } void debug(ostream& out) const { out << "struct " << name << endl; out << "types:" << endl; out << "re-implement" << endl; //out << te; out << "fields: " << endl; out << "re-implement" << endl; //out << ve; } }; // A record that is being used just for its fields and types, and has no real // initializer. This is for modules such as settings that are built into the // language. class dummyRecord : public record { public: dummyRecord(symbol name); dummyRecord(string s); // Convenient functions for adding fields. void add(string name, ty *t, trans::access *a, trans::permission perm=trans::PUBLIC); void add(string name, function *t, vm::bltin f, trans::permission perm=trans::PUBLIC); }; } //namespace types #endif asymptote-3.05/lspfundec.cc0000644000000000000000000000515015031566105014461 0ustar rootroot/** * @file lspfundec.cc * @brief For createSymMap and other lsp-related functions * specific to Lsp in *fundef classes. * @author Supakorn 'Jamie' Rassameemasmuang (jamievlin at outlook.com) */ #include "common.h" #include "fundec.h" #include "stm.h" #define DEC_CREATE_SYM_MAP_FUNDEC(derived_class) \ void derived_class::createSymMap(AsymptoteLsp::SymbolContext* symContext) namespace absyntax { #ifdef HAVE_LSP DEC_CREATE_SYM_MAP_FUNDEC(formals) { for (auto& field : fields) { field->createSymMap(symContext); } if (rest) { rest->createSymMap(symContext); } } void formals::addArgumentsToFnInfo(AsymptoteLsp::FunctionInfo& fnInfo) { for (auto const& field : fields) { fnInfo.arguments.emplace_back(field->fnInfo()); } if (rest) { fnInfo.restArgs= rest->fnInfo(); } // handle rest case as well } void fundef::addArgumentsToFnInfo(AsymptoteLsp::FunctionInfo& fnInfo) { params->addArgumentsToFnInfo(fnInfo); // handle rest case as well } DEC_CREATE_SYM_MAP_FUNDEC(fundef) { auto* declCtx(symContext->newContext( getPos().LineColumn() )); params->createSymMap(declCtx); body->createSymMap(declCtx); } DEC_CREATE_SYM_MAP_FUNDEC(fundec) { AsymptoteLsp::FunctionInfo& fnInfo= symContext->symMap.addFunDef( static_cast(id), getPos().LineColumn(), static_cast(*fun.result) ); fun.addArgumentsToFnInfo(fnInfo); fun.createSymMap(symContext); } DEC_CREATE_SYM_MAP_FUNDEC(formal) { if (start) { start->createSymMap(symContext); } } std::pair> formal::fnInfo() const { std::string typeName(static_cast(*base)); return start != nullptr ? std::make_pair( typeName, make_optional( static_cast(start->getName()) ) ) : std::make_pair(typeName, nullopt); } #else # define DEC_CREATE_SYM_MAP_FUNDEC_EMPTY(derived_class) \ DEC_CREATE_SYM_MAP_FUNDEC(derived_class) {} DEC_CREATE_SYM_MAP_FUNDEC_EMPTY(formals) DEC_CREATE_SYM_MAP_FUNDEC_EMPTY(fundef) DEC_CREATE_SYM_MAP_FUNDEC_EMPTY(fundec) DEC_CREATE_SYM_MAP_FUNDEC_EMPTY(formal) void formals::addArgumentsToFnInfo(AsymptoteLsp::FunctionInfo& fnInfo) {} void fundef::addArgumentsToFnInfo(AsymptoteLsp::FunctionInfo& fnInfo) {} std::pair> formal::fnInfo() const { return std::make_pair("", nullopt); } #endif }// namespace absyntax asymptote-3.05/runfile.h0000644000000000000000000000163615031566132014011 0ustar rootroot/***** Autogenerated from runfile.in; changes will be overwritten *****/ #pragma once namespace run { void nullFile(vm::stack *); void namePart(vm::stack *); void modePart(vm::stack *); void dimensionSetHelper(vm::stack *); void dimensionSet(vm::stack *); void dimensionPart(vm::stack *); void lineSetHelper(vm::stack *); void lineSet(vm::stack *); void linePart(vm::stack *); void csvSetHelper(vm::stack *); void csvSet(vm::stack *); void csvPart(vm::stack *); void wordSetHelper(vm::stack *); void wordSet(vm::stack *); void wordPart(vm::stack *); void singlerealSetHelper(vm::stack *); void singlerealSet(vm::stack *); void singlerealPart(vm::stack *); void singleintSetHelper(vm::stack *); void singleintSet(vm::stack *); void singleintPart(vm::stack *); void signedintSetHelper(vm::stack *); void signedintSet(vm::stack *); void signedintPart(vm::stack *); void readSetHelper(vm::stack *); void readSet(vm::stack *); } asymptote-3.05/guideflags.h0000644000000000000000000000044615031566105014455 0ustar rootroot/***** * guideflags.h * Tom Prince 2004/5/12 * * These flags are used to indicate what specifications of the join are * put on the stack. *****/ #ifndef GUIDEFLAGS_H #define GUIDEFLAGS_H namespace camp { #undef OUT #undef IN enum side { OUT, IN, END, JOIN }; } #endif //GUIDEFLAGS_H asymptote-3.05/shaders.h0000644000000000000000000000131115031566105013764 0ustar rootroot#ifndef __TOGL_SHADERSPROC #define __TOGL_SHADERSPROC #define GLEW_NO_GLU #include #include extern int GLSLversion; typedef std::pair ShaderfileModePair; GLuint compileAndLinkShader( std::vector const& shaders, std::vector const& defineflags, bool ssbo=true, bool interlock=false, bool compute=false, bool test=false); GLuint createShaderFile(std::string file, int shaderType, std::vector const& constflags, bool ssbo, bool interlock, bool compute, bool test); enum attrib {positionAttrib=0,normalAttrib,materialAttrib,colorAttrib, widthAttrib}; #endif asymptote-3.05/exp.h0000644000000000000000000007315515031566105013146 0ustar rootroot/***** * exp.h * Andy Hammerlindl 2002/8/19 * * Represents the abstract syntax tree for the expressions in the * language. this is translated into virtual machine code using trans() * and with the aid of the environment class. *****/ #ifndef EXP_H #define EXP_H #include "types.h" #include "symbol.h" #include "absyn.h" #include "varinit.h" #include "name.h" #include "guideflags.h" namespace trans { class coenv; class coder; struct label_t; typedef label_t *label; class application; } namespace absyntax { using trans::coenv; using trans::label; using trans::application; using trans::access; using sym::symbol; using types::record; using types::array; class exp : public varinit { protected: // The cached type (from a call to cgetType). types::ty *ct; public: exp(position pos) : varinit(pos), ct(0) {} void prettyprint(ostream &out, Int indent) = 0; // When reporting errors with function calls, it is nice to say "no // function f(int)" instead of "no function matching signature // (int)." Hence, this method returns the name of the expression if // there is one. virtual symbol getName() { return symbol::nullsym; } // Checks if the expression can be used as the right side of a scale // expression. ie. 3sin(x) // If a "non-scalable" expression is scaled a warning is issued. virtual bool scalable() { return true; } // Specifies if the value of the expression should be written to interactive // prompt if typed as a stand-alone expression. For example: // > 2+3; // should write 5, but // > x=2+3; // shouldn't. (These choices are largely aesthetic) virtual bool writtenToPrompt() { return true; } // Translates the expression to the given target type. This should only be // called with a type returned by getType(). It does not perform implicit // casting. virtual void transAsType(coenv &e, types::ty *target); // Translates the expression to the given target type, possibly using an // implicit cast. void transToType(coenv &e, types::ty *target); // Translates the expression and returns the resultant type. // For some expressions, this will be ambiguous and return an error. // Trans may only return ty_error, if it (or one of its recursively // called children in the syntax tree) reported an error to em. virtual types::ty *trans(coenv &) = 0; // getType() figures out the type of the expression without translating // the code into the virtual machine language or reporting errors to em. // This must follow a few rules to ensure proper translation: // 1. If this returns a valid type, t, trans(e) must return t or // report an error, and transToType(e, t) must run either reporting // an error or reporting no error and yielding the same result as // trans(e). // 2. If this returns a superposition of types (ie. for overloaded // functions), trans must not return a singular type, and every // type in the superposition must run without error properly // if fed to transAsType(e, t). // 3. If this returns ty_error, then so must a call to trans(e) and any // call to trans, transAsType, or transToType must report an error // to em. // 4. Any call to transAsType(e, t) with a type that is not returned by // getType() (or one of the subtypes in case of a superposition) // must report an error. // Any call to transToType(e, t) with a type that is not returned by // getType() (or one of the subtypes in case of a superposition) // or any type not implicitly castable from the above must report an // error. virtual types::ty *getType(coenv &) = 0; // This is an optimization which works in some cases to by-pass the slow // overloaded function resolution provided by the application class. // // If an expression is called with arguments given by sig, getCallee must // either return 0 (the default), or if it returns a varEntry, the varEntry // must correspond to the function which would be called after normal // function resolution. // // The callee must produce no side effects as there are no guarantees when // the varEntry will be translated. virtual trans::varEntry *getCallee(coenv &e, types::signature *sig) { //#define DEBUG_GETAPP #if DEBUG_GETAPP cout << "exp fail" << endl; cout << "exp fail at " << getPos() << endl; prettyprint(cout, 2); #endif return 0; } // Same result as getType, but caches the result so that subsequent // calls are faster. For this to work correctly, the expression should // only be used in one place, so the environment doesn't change between // calls. virtual types::ty *cgetType(coenv &e) { #ifdef DEBUG_CACHE testCachedType(e); #endif return ct ? ct : ct = getType(e); } void testCachedType(coenv &e); // The expression is being written. Translate code such that the value // (represented by the exp value) is stored into the address represented by // this expression. // In terms of side-effects, this expression must be evaluated (once) before // value is evaluated (once). virtual void transWrite(coenv &e, types::ty *t, exp *value) { em.error(getPos()); em << "expression cannot be used as an address"; // Translate the value for errors. value->transToType(e, t); } // Translates code for calling a function. The arguments, in the order they // appear in the function's signature, must all be on the stack. virtual void transCall(coenv &e, types::ty *target); // transConditionalJump must produce code equivalent to the following: // Evaluate the expression as a boolean. If the result equals cond, jump to // the label dest, otherwise do not jump. In either case, no value is left // on the stack. virtual void transConditionalJump(coenv &e, bool cond, label dest); // This is used to ensure the proper order and number of evaluations. When // called, it immediately translates code to perform the side-effects // consistent with a corresponding call to transAsType(e, target). // // The return value, called an evaluation for lack of a better name, is // another expression that responds to the trans methods exactly as would the // original expression, but without producing side-effects. It is also no // longer overloaded, due to the resolution effected by giving a target type // to evaluate(). // // The methods transAsType, transWrite, and transCall of the evaluation must // be called with the same target type as the original call to evaluate. // When evaluate() is called during the translation of a function, that // function must still be in translation when the evaluation is translated. // // The base implementation uses a tempExp (see below). This is // sufficient for most expressions. virtual exp *evaluate(coenv &e, types::ty *target); // NOTE: could add a "side-effects" method which says if the expression has // side-effects. This might allow some small optimizations in translating. }; class tempExp : public exp { access *a; types::ty *t; public: tempExp(coenv &e, varinit *v, types::ty *t); void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &) { return t; } }; // Wrap a varEntry so that it can be used as an expression. // Translating the varEntry must cause no side-effects. class varEntryExp : public exp { trans::varEntry *v; public: varEntryExp(position pos, trans::varEntry *v) : exp(pos), v(v) {} varEntryExp(position pos, types::ty *t, access *a); varEntryExp(position pos, types::ty *t, vm::bltin f); void prettyprint(ostream &out, Int indent); types::ty *getType(coenv &); types::ty *trans(coenv &e); trans::varEntry *getCallee(coenv &e, types::signature *sig); void transAct(action act, coenv &e, types::ty *target); void transAsType(coenv &e, types::ty *target); void transWrite(coenv &e, types::ty *t, exp *value); void transCall(coenv &e, types::ty *target); }; class nameExp : public exp { name *value; public: nameExp(position pos, name *value) : exp(pos), value(value) {} nameExp(position pos, symbol id) : exp(pos), value(new simpleName(pos, id)) {} nameExp(position pos, string s) : exp(pos), value(new simpleName(pos, symbol::trans(s))) {} void prettyprint(ostream &out, Int indent) override; void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; symbol getName() override { return value->getName(); } void transAsType(coenv &e, types::ty *target) override { value->varTrans(trans::READ, e, target); // After translation, the cached type is no longer needed and should be // garbage collected. This could presumably be done in every class derived // from exp, but here it is most important as nameExp can have heavily // overloaded types cached. ct=0; } types::ty *trans(coenv &e) override { types::ty *t=cgetType(e); if (t->kind == types::ty_error) { em.error(getPos()); em << "no matching variable \'" << *value << "\'"; return types::primError(); } if (t->kind == types::ty_overloaded) { em.error(getPos()); em << "use of variable \'" << *value << "\' is ambiguous"; return types::primError(); } else { transAsType(e, t); return t; } } types::ty *getType(coenv &e) override { types::ty *t=value->varGetType(e); return t ? t : types::primError(); } trans::varEntry *getCallee(coenv &e, types::signature *sig) override { #ifdef DEBUG_GETAPP cout << "nameExp" << endl; #endif return value->getCallee(e, sig); } void transWrite(coenv &e, types::ty *target, exp *newValue) override { newValue->transToType(e, target); this->value->varTrans(trans::WRITE, e, target); ct=0; // See note in transAsType. } void transCall(coenv &e, types::ty *target) override { value->varTrans(trans::CALL, e, target); ct=0; // See note in transAsType. } exp *evaluate(coenv &, types::ty *) override { // Names have no side-effects. return this; } }; // Most fields accessed are handled as parts of qualified names, but in cases // like f().x or (new t).x, a separate expression is needed. class fieldExp : public nameExp { exp *object; symbol field; // fieldExp has a lot of common functionality with qualifiedName, so we // essentially hack qualifiedName, by making our object expression look // like a name. class pseudoName : public name { exp *object; public: pseudoName(exp *object) : name(object->getPos()), object(object) {} // As a variable: void varTrans(trans::action act, coenv &e, types::ty *target) { assert(act == trans::READ); object->transToType(e, target); } types::ty *varGetType(coenv &e) { return object->getType(e); } trans::varEntry *getCallee(coenv &, types::signature *) { #ifdef DEBUG_GETAPP cout << "pseudoName" << endl; #endif return 0; } // As a type: types::ty *typeTrans(coenv &, bool tacit = false) { if (!tacit) { em.error(getPos()); em << "expression is not a type"; } return types::primError(); } trans::varEntry *getVarEntry(coenv &) { em.compiler(getPos()); em << "expression cannot be used as part of a type"; return 0; } trans::tyEntry *tyEntryTrans(coenv &) { em.compiler(getPos()); em << "expression cannot be used as part of a type"; return 0; } trans::frame *tyFrameTrans(coenv &) { return 0; } void prettyprint(ostream &out, Int indent); void print(ostream& out) const { out << ""; } symbol getName() const { return object->getName(); } AsymptoteLsp::SymbolLit getLit() const { return AsymptoteLsp::SymbolLit(static_cast(object->getName())); } }; // Try to get this into qualifiedName somehow. types::ty *getObject(coenv &e); public: fieldExp(position pos, exp *object, symbol field) : nameExp(pos, new qualifiedName(pos, new pseudoName(object), field)), object(object), field(field) {} void prettyprint(ostream &out, Int indent); symbol getName() { return field; } exp *evaluate(coenv &e, types::ty *) { // Evaluate the object. return new fieldExp(getPos(), new tempExp(e, object, getObject(e)), field); } }; class arrayExp : public exp { protected: exp *set; array *getArrayType(coenv &e); array *transArray(coenv &e); public: arrayExp(position pos, exp *set) : exp(pos), set(set) {} }; class subscriptExp : public arrayExp { exp *index; public: subscriptExp(position pos, exp *set, exp *index) : arrayExp(pos, set), index(index) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &e); void transWrite(coenv &e, types::ty *t, exp *value); exp *evaluate(coenv &e, types::ty *) { return new subscriptExp(getPos(), new tempExp(e, set, getArrayType(e)), new tempExp(e, index, types::primInt())); } }; class slice : public absyn { exp *left; exp *right; public: slice(position pos, exp *left, exp *right) : absyn(pos), left(left), right(right) {} void prettyprint(ostream &out, Int indent); exp *getLeft() { return left; } exp *getRight() { return right; } // Translates code to put the left and right expressions on the stack (in that // order). If left is omitted, zero is pushed on the stack in it's place. If // right is omitted, nothing is pushed in its place. void trans(coenv &e); slice *evaluate(coenv &e) { return new slice(getPos(), left ? new tempExp(e, left, types::primInt()) : 0, right ? new tempExp(e, right, types::primInt()) : 0); } }; class sliceExp : public arrayExp { slice *index; public: sliceExp(position pos, exp *set, slice *index) : arrayExp(pos, set), index(index) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &e); void transWrite(coenv &e, types::ty *t, exp *value); exp *evaluate(coenv &e, types::ty *) { return new sliceExp(getPos(), new tempExp(e, set, getArrayType(e)), index->evaluate(e)); } }; // The expression "this," that evaluates to the lexically enclosing record. class thisExp : public exp { public: thisExp(position pos) : exp(pos) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &e); exp *evaluate(coenv &, types::ty *) { // this has no side-effects return this; } }; class literalExp : public exp { public: literalExp(position pos) : exp(pos) {} bool scalable() { return false; } exp *evaluate(coenv &, types::ty *) { // Literals are constant, they have no side-effects. return this; } }; class intExp : public literalExp { Int value; public: intExp(position pos, Int value) : literalExp(pos), value(value) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &) { return types::primInt(); } template [[nodiscard]] T getValue() const { return static_cast(value); } }; class realExp : public literalExp { protected: double value; public: realExp(position pos, double value) : literalExp(pos), value(value) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &) { return types::primReal(); } template [[nodiscard]] T getValue() const { return static_cast(value); } }; class stringExp : public literalExp { string str; public: stringExp(position pos, string str) : literalExp(pos), str(str) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &) { return types::primString(); } const string& getString() { return str; } }; class booleanExp : public literalExp { bool value; public: booleanExp(position pos, bool value) : literalExp(pos), value(value) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &) { return types::primBoolean(); } }; class cycleExp : public literalExp { public: cycleExp(position pos) : literalExp(pos) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &) { return types::primCycleToken(); } }; class newPictureExp : public literalExp { public: newPictureExp(position pos) : literalExp(pos) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &) { return types::primPicture(); } }; class nullPathExp : public literalExp { public: nullPathExp(position pos) : literalExp(pos) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &) { return types::primPath(); } }; class nullExp : public literalExp { public: nullExp(position pos) : literalExp(pos) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &) { return types::primNull(); } }; class quoteExp : public exp { runnable *value; public: quoteExp(position pos, runnable *value) : exp(pos), value(value) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &) { return types::primCode(); } }; // A list of expressions used in a function call. class explist : public absyn { typedef mem::vector expvector; expvector exps; public: explist(position pos) : absyn(pos) {} virtual ~explist() {} virtual void add(exp *e) { exps.push_back(e); } virtual void prettyprint(ostream &out, Int indent); virtual size_t size() { return exps.size(); } virtual exp * operator[] (size_t index) { return exps[index]; } }; struct argument { exp *val; symbol name; // No constructor due to the union in camp.y #if 0 argument(exp *val=0, symbol name=0) : val(val), name(name) {} #endif void prettyprint(ostream &out, Int indent); void createSymMap(AsymptoteLsp::SymbolContext* symContext); }; class arglist : public gc { public: typedef mem::vector argvector; argvector args; argument rest; // As the language allows named arguments after rest arguments, store the // index of the rest argument in order to ensure proper left-to-right // execution. static const size_t DUMMY_REST_POSITION = 9999; size_t restPosition; arglist() : args(), rest(), restPosition(DUMMY_REST_POSITION) {} virtual ~arglist() {} virtual void addFront(argument a) { args.insert(args.begin(), a); } virtual void addFront(exp *val, symbol name=symbol::nullsym) { argument a; a.val=val; a.name=name; addFront(a); } virtual void add(argument a) { if (rest.val && !a.name) { em.error(a.val->getPos()); em << "unnamed argument after rest argument"; return; } args.push_back(a); } virtual void add(exp *val, symbol name=symbol::nullsym) { argument a; a.val=val; a.name=name; add(a); } virtual void addRest(argument a) { if (rest.val) { em.error(a.val->getPos()); em << "additional rest argument"; return; } rest = a; assert(restPosition == DUMMY_REST_POSITION); restPosition = size(); } virtual void prettyprint(ostream &out, Int indent); virtual size_t size() { return args.size(); } virtual argument& operator[] (size_t index) { return args[index]; } virtual argument& getRest() { return rest; } virtual void createSymMap(AsymptoteLsp::SymbolContext* symContext); }; // callExp has a global cache of resolved overloaded functions. This clears // this cache so the associated data can be garbage collected. void clearCachedCalls(); class callExp : public exp { protected: exp *callee; arglist *args; private: // Per object caching - Cache the application when it's determined. application *cachedApp; // In special cases, no application object is needed and we can store the // varEntry used in advance. trans::varEntry *cachedVarEntry; types::signature *argTypes(coenv& e, bool *searchable); void reportArgErrors(coenv &e); application *resolve(coenv &e, types::overloaded *o, types::signature *source, bool tacit); application *resolveWithCache(coenv &e, types::overloaded *o, types::signature *source, bool tacit); void reportMismatch(types::function *ft, types::signature *source); void reportNonFunction(); // Caches either the application object used to apply the function to the // arguments, or in cases where the arguments match the function perfectly, // the varEntry of the callee (or neither in case of an error). Returns // what getType should return. types::ty *cacheAppOrVarEntry(coenv &e, bool tacit); types::ty *transPerfectMatch(coenv &e); public: callExp(position pos, exp *callee, arglist *args) : exp(pos), callee(callee), args(args), cachedApp(0), cachedVarEntry(0) { assert(args); } callExp(position pos, exp *callee) : exp(pos), callee(callee), args(new arglist()), cachedApp(0), cachedVarEntry(0) {} callExp(position pos, exp *callee, exp *arg1) : exp(pos), callee(callee), args(new arglist()), cachedApp(0), cachedVarEntry(0) { args->add(arg1); } callExp(position pos, exp *callee, exp *arg1, exp *arg2) : exp(pos), callee(callee), args(new arglist()), cachedApp(0), cachedVarEntry(0) { args->add(arg1); args->add(arg2); } callExp(position pos, exp *callee, exp *arg1, exp *arg2, exp *arg3) : exp(pos), callee(callee), args(new arglist()), cachedApp(0), cachedVarEntry(0) { args->add(arg1); args->add(arg2); args->add(arg3); } void prettyprint(ostream &out, Int indent) override; void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; using colorInfo = std::tuple; /** * @return nullopt if callExp is not a color, pair if color is RGB, * and pair if color is RGBA. */ optional, AsymptoteLsp::posInFile, AsymptoteLsp::posInFile>> getColorInformation(); types::ty *trans(coenv &e) override; types::ty *getType(coenv &e) override; // Returns true if the function call resolves uniquely without error. Used // in implementing the special == and != operators for functions. virtual bool resolved(coenv &e); }; class pairExp : public exp { exp *x; exp *y; public: pairExp(position pos, exp *x, exp *y) : exp(pos), x(x), y(y) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &) { return types::primPair(); } }; class tripleExp : public exp { exp *x; exp *y; exp *z; public: tripleExp(position pos, exp *x, exp *y, exp *z) : exp(pos), x(x), y(y), z(z) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &) { return types::primTriple(); } }; class transformExp : public exp { exp *x; exp *y; exp *xx,*xy,*yx,*yy; public: transformExp(position pos, exp *x, exp *y, exp *xx, exp *xy, exp *yx, exp *yy) : exp(pos), x(x), y(y), xx(xx), xy(xy), yx(yx), yy(yy) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &) { return types::primTransform(); } }; class castExp : public exp { astType *target; exp *castee; types::ty *tryCast(coenv &e, types::ty *t, types::ty *s, symbol csym); public: castExp(position pos, astType *target, exp *castee) : exp(pos), target(target), castee(castee) {} void prettyprint(ostream &out, Int indent) override; types::ty *trans(coenv &e) override; types::ty *getType(coenv &e) override; void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; class nullaryExp : public callExp { public: nullaryExp(position pos, symbol op) : callExp(pos, new nameExp(pos, op)) {} }; class unaryExp : public callExp { public: unaryExp(position pos, exp *base, symbol op) : callExp(pos, new nameExp(pos, op), base) {} }; class binaryExp : public callExp { public: binaryExp(position pos, exp *left, symbol op, exp *right) : callExp(pos, new nameExp(pos, op), left, right) {} }; class equalityExp : public callExp { public: equalityExp(position pos, exp *left, symbol op, exp *right) : callExp(pos, new nameExp(pos, op), left, right) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &e); }; // Scaling expressions such as 3sin(x). class scaleExp : public binaryExp { exp *getLeft() { return (*this->args)[0].val; } exp *getRight() { return (*this->args)[1].val; } public: scaleExp(position pos, exp *left, exp *right) : binaryExp(pos, left, symbol::trans("*"), right) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); //types::ty *getType(coenv &e); bool scalable() { return false; } }; // Used for tension, which takes two real values, and a boolean to denote if it // is a tension atleast case. class ternaryExp : public callExp { public: ternaryExp(position pos, exp *left, symbol op, exp *right, exp *last) : callExp(pos, new nameExp(pos, op), left, right, last) {} }; // The a ? b : c ternary operator. class conditionalExp : public exp { exp *test; exp *onTrue; exp *onFalse; public: conditionalExp(position pos, exp *test, exp *onTrue, exp *onFalse) : exp(pos), test(test), onTrue(onTrue), onFalse(onFalse) {} void prettyprint(ostream &out, Int indent); void baseTransToType(coenv &e, types::ty *target); void transToType(coenv &e, types::ty *target); types::ty *trans(coenv &e); types::ty *getType(coenv &e); }; class andOrExp : public exp { protected: exp *left; symbol op; exp *right; public: andOrExp(position pos, exp *left, symbol op, exp *right) : exp(pos), left(left), op(op), right(right) {} virtual types::ty *trans(coenv &e) override = 0; virtual types::ty *getType(coenv &) override { return types::primBoolean(); } void createSymMap(AsymptoteLsp::SymbolContext* symContext) override { left->createSymMap(symContext); right->createSymMap(symContext); } }; class orExp : public andOrExp { public: orExp(position pos, exp *left, symbol op, exp *right) : andOrExp(pos, left, op, right) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); void transConditionalJump(coenv &e, bool cond, label dest); }; class andExp : public andOrExp { public: andExp(position pos, exp *left, symbol op, exp *right) : andOrExp(pos, left, op, right) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); void transConditionalJump(coenv &e, bool cond, label dest); }; class joinExp : public callExp { public: joinExp(position pos, symbol op) : callExp(pos, new nameExp(pos, op)) {} void pushFront(exp *e) { args->addFront(e); } void pushBack(exp *e) { args->add(e); } void prettyprint(ostream &out, Int indent); }; class specExp : public exp { symbol op; exp *arg; camp::side s; public: specExp(position pos, symbol op, exp *arg, camp::side s=camp::OUT) : exp(pos), op(op), arg(arg), s(s) {} void setSide(camp::side ss) { s=ss; } void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &e); }; class assignExp : public exp { protected: exp *dest; exp *value; // This is basically a hook to facilitate selfExp. dest is given as an // argument since it will be a temporary in translation in order to avoid // multiple evaluation. virtual exp *ultimateValue(exp *) { return value; } public: assignExp(position pos, exp *dest, exp *value) : exp(pos), dest(dest), value(value) {} void prettyprint(ostream &out, Int indent) override; // Don't write the result of an assignment to the prompt. bool writtenToPrompt() override { return false; } void transAsType(coenv &e, types::ty *target) override; types::ty *trans(coenv &e) override; types::ty *getType(coenv &e) override; void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; class selfExp : public assignExp { symbol op; exp *ultimateValue(exp *dest) override { return new binaryExp(getPos(), dest, op, value); } public: selfExp(position pos, exp *dest, symbol op, exp *value) : assignExp(pos, dest, value), op(op) {} void prettyprint(ostream &out, Int indent) override; void transAsType(coenv &e, types::ty *target) override; }; class prefixExp : public exp { exp *dest; symbol op; public: prefixExp(position pos, exp *dest, symbol op) : exp(pos), dest(dest), op(op) {} void prettyprint(ostream &out, Int indent) override; bool scalable() override { return false; } // Don't write the result to the prompt. bool writtenToPrompt() override { return false; } types::ty *trans(coenv &e) override; types::ty *getType(coenv &e) override; }; // Postfix expresions are illegal. This is caught here as we can give a // more meaningful error message to the user, rather than a "parse // error." class postfixExp : public exp { exp *dest; symbol op; public: postfixExp(position pos, exp *dest, symbol op) : exp(pos), dest(dest), op(op) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &) { return types::primError(); } }; } // namespace absyntax #endif asymptote-3.05/path3.cc0000644000000000000000000011214715031566105013522 0ustar rootroot/***** * path3.cc * John Bowman * * Compute information for a three-dimensional path. *****/ #include #include "path3.h" #include "util.h" #include "camperror.h" #include "mathop.h" namespace camp { using run::operator *; using vm::array; path3 nullpath3; void checkEmpty3(Int n) { if(n == 0) reportError("nullpath3 has no points"); } triple path3::point(double t) const { checkEmpty3(n); Int i = Floor(t); Int iplus; t = fmod(t,1); if (t < 0) t += 1; if (cycles) { i = imod(i,n); iplus = imod(i+1,n); } else if (i < 0) return nodes[0].point; else if (i >= n-1) return nodes[n-1].point; else iplus = i+1; double one_t = 1.0-t; triple a = nodes[i].point, b = nodes[i].post, c = nodes[iplus].pre, d = nodes[iplus].point, ab = one_t*a + t*b, bc = one_t*b + t*c, cd = one_t*c + t*d, abc = one_t*ab + t*bc, bcd = one_t*bc + t*cd, abcd = one_t*abc + t*bcd; return abcd; } triple path3::precontrol(double t) const { checkEmpty3(n); Int i = Floor(t); Int iplus; t = fmod(t,1); if (t < 0) t += 1; if (cycles) { i = imod(i,n); iplus = imod(i+1,n); } else if (i < 0) return nodes[0].pre; else if (i >= n-1) return nodes[n-1].pre; else iplus = i+1; double one_t = 1.0-t; triple a = nodes[i].point, b = nodes[i].post, c = nodes[iplus].pre, ab = one_t*a + t*b, bc = one_t*b + t*c, abc = one_t*ab + t*bc; return (abc == a) ? nodes[i].pre : abc; } triple path3::postcontrol(double t) const { checkEmpty3(n); Int i = Floor(t); Int iplus; t = fmod(t,1); if (t < 0) t += 1; if (cycles) { i = imod(i,n); iplus = imod(i+1,n); } else if (i < 0) return nodes[0].post; else if (i >= n-1) return nodes[n-1].post; else iplus = i+1; double one_t = 1.0-t; triple b = nodes[i].post, c = nodes[iplus].pre, d = nodes[iplus].point, bc = one_t*b + t*c, cd = one_t*c + t*d, bcd = one_t*bc + t*cd; return (bcd == d) ? nodes[iplus].post : bcd; } path3 path3::reverse() const { mem::vector nodes(n); Int len=length(); for (Int i = 0, j = len; i < n; i++, j--) { nodes[i].pre = postcontrol(j); nodes[i].point = point(j); nodes[i].post = precontrol(j); nodes[i].straight = straight(j-1); } return path3(nodes, n, cycles); } path3 path3::subpath(Int a, Int b) const { if(empty()) return path3(); if (a > b) { const path3 &rp = reverse(); Int len=length(); path3 result = rp.subpath(len-a, len-b); return result; } if (!cycles) { if (a < 0) { a = 0; if(b < 0) b = 0; } if (b > n-1) { b = n-1; if(a > b) a = b; } } Int sn = b-a+1; mem::vector nodes(sn); for (Int i = 0, j = a; j <= b; i++, j++) { nodes[i].pre = precontrol(j); nodes[i].point = point(j); nodes[i].post = postcontrol(j); nodes[i].straight = straight(j); } nodes[0].pre = nodes[0].point; nodes[sn-1].post = nodes[sn-1].point; return path3(nodes, sn); } inline triple split(double t, const triple& x, const triple& y) { return x+(y-x)*t; } inline void splitCubic(solvedKnot3 sn[], double t, const solvedKnot3& left_, const solvedKnot3& right_) { solvedKnot3 &left=(sn[0]=left_), &mid=sn[1], &right=(sn[2]=right_); if(left.straight) { mid.point=split(t,left.point,right.point); triple deltaL=third*(mid.point-left.point); left.post=left.point+deltaL; mid.pre=mid.point-deltaL; triple deltaR=third*(right.point-mid.point); mid.post=mid.point+deltaR; right.pre=right.point-deltaR; mid.straight=true; } else { triple x=split(t,left.post,right.pre); // m1 left.post=split(t,left.point,left.post); // m0 right.pre=split(t,right.pre,right.point); // m2 mid.pre=split(t,left.post,x); // m3 mid.post=split(t,x,right.pre); // m4 mid.point=split(t,mid.pre,mid.post); // m5 } } path3 path3::subpath(double a, double b) const { if(empty()) return path3(); if (a > b) { const path3 &rp = reverse(); Int len=length(); return rp.subpath(len-a, len-b); } solvedKnot3 aL, aR, bL, bR; if (!cycles) { if (a < 0) { a = 0; if (b < 0) b = 0; } if (b > n-1) { b = n-1; if (a > b) a = b; } aL = nodes[(Int)floor(a)]; aR = nodes[(Int)ceil(a)]; bL = nodes[(Int)floor(b)]; bR = nodes[(Int)ceil(b)]; } else { if(run::validInt(a) && run::validInt(b)) { aL = nodes[imod((Int) floor(a),n)]; aR = nodes[imod((Int) ceil(a),n)]; bL = nodes[imod((Int) floor(b),n)]; bR = nodes[imod((Int) ceil(b),n)]; } else reportError("invalid path3 index"); } if (a == b) return path3(point(a)); solvedKnot3 sn[3]; path3 p = subpath(Ceil(a), Floor(b)); if (a > floor(a)) { if (b < ceil(a)) { splitCubic(sn,a-floor(a),aL,aR); splitCubic(sn,(b-a)/(ceil(b)-a),sn[1],sn[2]); return path3(sn[0],sn[1]); } splitCubic(sn,a-floor(a),aL,aR); p=concat(path3(sn[1],sn[2]),p); } if (ceil(b) > b) { splitCubic(sn,b-floor(b),bL,bR); p=concat(p,path3(sn[0],sn[1])); } return p; } // Special case of subpath for paths of length 1 used by intersect. void path3::halve(path3 &first, path3 &second) const { solvedKnot3 sn[3]; splitCubic(sn,0.5,nodes[0],nodes[1]); first=path3(sn[0],sn[1]); second=path3(sn[1],sn[2]); } // Calculate the coefficients of a Bezier derivative divided by 3. static inline void derivative(triple& a, triple& b, triple& c, const triple& z0, const triple& c0, const triple& c1, const triple& z1) { a=z1-z0+3.0*(c0-c1); b=2.0*(z0+c1)-4.0*c0; c=c0-z0; } bbox3 path3::bounds() const { if(!box.empty) return box; if (empty()) { // No bounds return bbox3(); } Int len=length(); box.add(point(len)); times=bbox3(len,len,len,len,len,len); for (Int i = 0; i < len; i++) { addpoint(box,i); if(straight(i)) continue; triple a,b,c; derivative(a,b,c,point(i),postcontrol(i),precontrol(i+1),point(i+1)); // Check x coordinate quadraticroots x(a.getx(),b.getx(),c.getx()); if(x.distinct != quadraticroots::NONE && goodroot(x.t1)) addpoint(box,i+x.t1); if(x.distinct == quadraticroots::TWO && goodroot(x.t2)) addpoint(box,i+x.t2); // Check y coordinate quadraticroots y(a.gety(),b.gety(),c.gety()); if(y.distinct != quadraticroots::NONE && goodroot(y.t1)) addpoint(box,i+y.t1); if(y.distinct == quadraticroots::TWO && goodroot(y.t2)) addpoint(box,i+y.t2); // Check z coordinate quadraticroots z(a.getz(),b.getz(),c.getz()); if(z.distinct != quadraticroots::NONE && goodroot(z.t1)) addpoint(box,i+z.t1); if(z.distinct == quadraticroots::TWO && goodroot(z.t2)) addpoint(box,i+z.t2); } return box; } // Return f evaluated at controlling vertex of bounding box of convex hull for // similiar-triangle transform x'=x/z, y'=y/z, where z < 0. double ratiobound(triple z0, triple c0, triple c1, triple z1, double (*m)(double, double), double (*f)(const triple&)) { double MX=m(m(m(-z0.getx(),-c0.getx()),-c1.getx()),-z1.getx()); double MY=m(m(m(-z0.gety(),-c0.gety()),-c1.gety()),-z1.gety()); double Z=m(m(m(z0.getz(),c0.getz()),c1.getz()),z1.getz()); double MZ=m(m(m(-z0.getz(),-c0.getz()),-c1.getz()),-z1.getz()); return m(f(triple(-MX,-MY,Z)),f(triple(-MX,-MY,-MZ))); } double bound(triple z0, triple c0, triple c1, triple z1, double (*m)(double, double), double (*f)(const triple&), double b, double fuzz, int depth) { b=m(b,m(f(z0),f(z1))); if(m(-1.0,1.0)*(b-ratiobound(z0,c0,c1,z1,m,f)) >= -fuzz || depth == 0) return b; --depth; fuzz *= 2; triple m0=0.5*(z0+c0); triple m1=0.5*(c0+c1); triple m2=0.5*(c1+z1); triple m3=0.5*(m0+m1); triple m4=0.5*(m1+m2); triple m5=0.5*(m3+m4); // Check both Bezier subpaths. b=bound(z0,m0,m3,m5,m,f,b,fuzz,depth); return bound(m5,m4,m2,z1,m,f,b,fuzz,depth); } pair path3::ratio(double (*m)(double, double)) const { double fuzz=Fuzz*(max()-min()).length(); checkEmpty3(n); triple v=point((Int) 0); pair B=pair(xratio(v),yratio(v)); Int n=length(); for(Int i=0; i <= n; ++i) { if(straight(i)) { triple v=point(i); B=pair(m(B.getx(),xratio(v)),m(B.gety(),yratio(v))); } else { triple z0=point(i); triple c0=postcontrol(i); triple c1=precontrol(i+1); triple z1=point(i+1); B=pair(bound(z0,c0,c1,z1,m,xratio,B.getx(),fuzz), bound(z0,c0,c1,z1,m,yratio,B.gety(),fuzz)); } } return B; } // {{{ Arclength Calculations static triple a,b,c; static double ds(double t) { double dx=quadratic(a.getx(),b.getx(),c.getx(),t); double dy=quadratic(a.gety(),b.gety(),c.gety(),t); double dz=quadratic(a.getz(),b.getz(),c.getz(),t); return sqrt(dx*dx+dy*dy+dz*dz); } // Calculates arclength of a cubic Bezier curve using adaptive Simpson // integration. double arcLength(const triple& z0, const triple& c0, const triple& c1, const triple& z1) { double integral; derivative(a,b,c,z0,c0,c1,z1); if(!simpson(integral,ds,0.0,1.0,DBL_EPSILON,1.0)) reportError("nesting capacity exceeded in computing arclength"); return integral; } double path3::cubiclength(Int i, double goal) const { const triple& z0=point(i); const triple& z1=point(i+1); double L; if(straight(i)) { L=(z1-z0).length(); return (goal < 0 || goal >= L) ? L : -goal/L; } double integral=arcLength(z0,postcontrol(i),precontrol(i+1),z1); L=3.0*integral; if(goal < 0 || goal >= L) return L; double t=goal/L; goal *= third; static double dxmin=sqrt(DBL_EPSILON); if(!unsimpson(goal,ds,0.0,t,100.0*DBL_EPSILON,integral,1.0,dxmin)) reportError("nesting capacity exceeded in computing arctime"); return -t; } double path3::arclength() const { if (cached_length != -1) return cached_length; double L=0.0; for (Int i = 0; i < n-1; i++) { L += cubiclength(i); } if(cycles) L += cubiclength(n-1); cached_length = L; return cached_length; } double path3::arctime(double goal) const { if (cycles) { if (goal == 0 || cached_length == 0) return 0; if (goal < 0) { const path3 &rp = this->reverse(); double result = -rp.arctime(-goal); return result; } if (cached_length > 0 && goal >= cached_length) { Int loops = (Int)(goal / cached_length); goal -= loops*cached_length; return loops*n+arctime(goal); } } else { if (goal <= 0) return 0; if (cached_length > 0 && goal >= cached_length) return n-1; } double l,L=0; for (Int i = 0; i < n-1; i++) { l = cubiclength(i,goal); if (l < 0) return (-l+i); else { L += l; goal -= l; if (goal <= 0) return i+1; } } if (cycles) { l = cubiclength(n-1,goal); if (l < 0) return -l+n-1; if (cached_length > 0 && cached_length != L+l) { reportError("arclength != length.\n" "path3::arclength(double) must have broken semantics.\n" "Please report this error."); } cached_length = L += l; goal -= l; return arctime(goal)+n; } else { cached_length = L; return length(); } } // }}} // {{{ Path3 Intersection Calculations // Return all intersection times of path3 g with the triple v. void intersections(std::vector& T, const path3& g, const triple& v, double fuzz) { double fuzz2=fuzz*fuzz; Int n=g.length(); bool cycles=g.cyclic(); for(Int i=0; i < n; ++i) { // Check all directions to circumvent degeneracy. std::vector r; roots(r,g.point(i).getx(),g.postcontrol(i).getx(), g.precontrol(i+1).getx(),g.point(i+1).getx(),v.getx()); roots(r,g.point(i).gety(),g.postcontrol(i).gety(), g.precontrol(i+1).gety(),g.point(i+1).gety(),v.gety()); roots(r,g.point(i).getz(),g.postcontrol(i).getz(), g.precontrol(i+1).getz(),g.point(i+1).getz(),v.getz()); size_t m=r.size(); for(size_t j=0 ; j < m; ++j) { double t=r[j]; if(t >= -Fuzz2 && t <= 1.0+Fuzz2) { double s=i+t; if((g.point(s)-v).abs2() <= fuzz2) { if(cycles && s >= n-Fuzz2) s=0; T.push_back(s); } } } } } // An optimized implementation of intersections(g,p--q); // if there are an infinite number of intersection points, the returned list is // only guaranteed to include the endpoint times of the intersection. void intersections(std::vector& S, std::vector& T, const path3& g, const triple& p, double fuzz) { std::vector S1; intersections(S1,g,p,fuzz); size_t n=S1.size(); for(size_t i=0; i < n; ++i) { S.push_back(S1[i]); T.push_back(0.0); } } void add(std::vector& S, std::vector& T, double s, double t, const path3& p, const path3& q, double fuzz2) { triple P=p.point(s); for(size_t i=0; i < S.size(); ++i) if((p.point(S[i])-P).abs2() <= fuzz2) return; S.push_back(s); T.push_back(t); } void add(double& s, double& t, std::vector& S, std::vector& T, std::vector& S1, std::vector& T1, double pscale, double qscale, double poffset, double qoffset, const path3& p, const path3& q, double fuzz2, bool single) { if(single) { s=s*pscale+poffset; t=t*qscale+qoffset; } else { size_t n=S1.size(); for(size_t i=0; i < n; ++i) add(S,T,pscale*S1[i]+poffset,qscale*T1[i]+qoffset,p,q,fuzz2); } } void add(double& s, double& t, std::vector& S, std::vector& T, std::vector& S1, std::vector& T1, const path3& p, const path3& q, double fuzz2, bool single) { size_t n=S1.size(); if(single) { if(n > 0) { s=S1[0]; t=T1[0]; } } else { for(size_t i=0; i < n; ++i) add(S,T,S1[i],T1[i],p,q,fuzz2); } } bool intersections(double &s, double &t, std::vector& S, std::vector& T, path3& p, path3& q, double fuzz, bool single, bool exact, unsigned depth) { if(errorstream::interrupt) throw interrupted(); double fuzz2=max(fuzzFactor*fuzz*fuzz,Fuzz2); Int lp=p.length(); if(lp == 0 && exact) { std::vector T1,S1; intersections(T1,S1,q,p.point(lp),fuzz); add(s,t,S,T,S1,T1,p,q,fuzz2,single); return S1.size() > 0; } Int lq=q.length(); if(lq == 0 && exact) { std::vector S1,T1; intersections(S1,T1,p,q.point(lq),fuzz); add(s,t,S,T,S1,T1,p,q,fuzz2,single); return S1.size() > 0; } triple maxp=p.max(); triple minp=p.min(); triple maxq=q.max(); triple minq=q.min(); if(maxp.getx()+fuzz >= minq.getx() && maxp.gety()+fuzz >= minq.gety() && maxp.getz()+fuzz >= minq.getz() && maxq.getx()+fuzz >= minp.getx() && maxq.gety()+fuzz >= minp.gety() && maxq.getz()+fuzz >= minp.getz()) { // Overlapping bounding boxes --depth; // fuzz *= 2; if((maxp-minp).length()+(maxq-minq).length() <= fuzz || depth == 0) { if(single) { s=0.5; t=0.5; } else { S.push_back(0.5); T.push_back(0.5); } return true; } path3 p1,p2; double pscale,poffset; std::vector S1,T1; // fuzz2=max(fuzzFactor*fuzz*fuzz,Fuzz2); if(lp <= 1) { if(lp == 1) p.halve(p1,p2); if(lp == 0 || p1 == p || p2 == p) { intersections(T1,S1,q,p.point((Int) 0),fuzz); add(s,t,S,T,S1,T1,p,q,fuzz2,single); return S1.size() > 0; } pscale=poffset=0.5; } else { Int tp=lp/2; p1=p.subpath(0,tp); p2=p.subpath(tp,lp); poffset=tp; pscale=1.0; } path3 q1,q2; double qscale,qoffset; if(lq <= 1) { if(lq == 1) q.halve(q1,q2); if(lq == 0 || q1 == q || q2 == q) { intersections(S1,T1,p,q.point((Int) 0),fuzz); add(s,t,S,T,S1,T1,p,q,fuzz2,single); return S1.size() > 0; } qscale=qoffset=0.5; } else { Int tq=lq/2; q1=q.subpath(0,tq); q2=q.subpath(tq,lq); qoffset=tq; qscale=1.0; } bool Short=lp == 1 && lq == 1; static size_t maxcount=9; size_t count=0; if(intersections(s,t,S1,T1,p1,q1,fuzz,single,exact,depth)) { add(s,t,S,T,S1,T1,pscale,qscale,0.0,0.0,p,q,fuzz2,single); if(single || depth <= mindepth) return true; count += S1.size(); if(Short && count > maxcount) return true; } S1.clear(); T1.clear(); if(intersections(s,t,S1,T1,p1,q2,fuzz,single,exact,depth)) { add(s,t,S,T,S1,T1,pscale,qscale,0.0,qoffset,p,q,fuzz2,single); if(single || depth <= mindepth) return true; count += S1.size(); if(Short && count > maxcount) return true; } S1.clear(); T1.clear(); if(intersections(s,t,S1,T1,p2,q1,fuzz,single,exact,depth)) { add(s,t,S,T,S1,T1,pscale,qscale,poffset,0.0,p,q,fuzz2,single); if(single || depth <= mindepth) return true; count += S1.size(); if(Short && count > maxcount) return true; } S1.clear(); T1.clear(); if(intersections(s,t,S1,T1,p2,q2,fuzz,single,exact,depth)) { add(s,t,S,T,S1,T1,pscale,qscale,poffset,qoffset,p,q,fuzz2,single); if(single || depth <= mindepth) return true; count += S1.size(); if(Short && count > maxcount) return true; } return S.size() > 0; } return false; } // }}} path3 concat(const path3& p1, const path3& p2) { Int n1 = p1.length(), n2 = p2.length(); if (n1 == -1) return p2; if (n2 == -1) return p1; triple a=p1.point(n1); triple b=p2.point((Int) 0); mem::vector nodes(n1+n2+1); Int i = 0; nodes[0].pre = p1.point((Int) 0); for (Int j = 0; j < n1; j++) { nodes[i].point = p1.point(j); nodes[i].straight = p1.straight(j); nodes[i].post = p1.postcontrol(j); nodes[i+1].pre = p1.precontrol(j+1); i++; } for (Int j = 0; j < n2; j++) { nodes[i].point = p2.point(j); nodes[i].straight = p2.straight(j); nodes[i].post = p2.postcontrol(j); nodes[i+1].pre = p2.precontrol(j+1); i++; } nodes[i].point = nodes[i].post = p2.point(n2); return path3(nodes, i+1); } path3 transformed(const array& t, const path3& p) { Int n = p.size(); mem::vector nodes(n); for (Int i = 0; i < n; ++i) { nodes[i].pre = t * p.precontrol(i); nodes[i].point = t * p.point(i); nodes[i].post = t * p.postcontrol(i); nodes[i].straight = p.straight(i); } return path3(nodes, n, p.cyclic()); } path3 transformed(const double* t, const path3& p) { Int n = p.size(); mem::vector nodes(n); for(Int i=0; i < n; ++i) { nodes[i].pre=t*p.precontrol(i); nodes[i].point=t*p.point(i); nodes[i].post=t*p.postcontrol(i); nodes[i].straight=p.straight(i); } return path3(nodes, n, p.cyclic()); } template struct Split { T m0,m1,m2,m3,m4,m5; Split(T z0, T c0, T c1, T z1) { m0=0.5*(z0+c0); m1=0.5*(c0+c1); m2=0.5*(c1+z1); m3=0.5*(m0+m1); m4=0.5*(m1+m2); m5=0.5*(m3+m4); } }; double cornerbound(double *P, double (*m)(double, double)) { double b=m(P[0],P[3]); b=m(b,P[12]); return m(b,P[15]); } double controlbound(double *P, double (*m)(double, double)) { double b=m(P[1],P[2]); b=m(b,P[4]); b=m(b,P[5]); b=m(b,P[6]); b=m(b,P[7]); b=m(b,P[8]); b=m(b,P[9]); b=m(b,P[10]); b=m(b,P[11]); b=m(b,P[13]); return m(b,P[14]); } double bound(double *P, double (*m)(double, double), double b, double fuzz, int depth) { b=m(b,cornerbound(P,m)); if(m(-1.0,1.0)*(b-controlbound(P,m)) >= -fuzz || depth == 0) return b; --depth; fuzz *= 2; Split c0(P[0],P[1],P[2],P[3]); Split c1(P[4],P[5],P[6],P[7]); Split c2(P[8],P[9],P[10],P[11]); Split c3(P[12],P[13],P[14],P[15]); Split c4(P[12],P[8],P[4],P[0]); Split c5(c3.m0,c2.m0,c1.m0,c0.m0); Split c6(c3.m3,c2.m3,c1.m3,c0.m3); Split c7(c3.m5,c2.m5,c1.m5,c0.m5); Split c8(c3.m4,c2.m4,c1.m4,c0.m4); Split c9(c3.m2,c2.m2,c1.m2,c0.m2); Split c10(P[15],P[11],P[7],P[3]); // Check all 4 Bezier subpatches. double s0[]={c4.m5,c5.m5,c6.m5,c7.m5,c4.m3,c5.m3,c6.m3,c7.m3, c4.m0,c5.m0,c6.m0,c7.m0,P[12],c3.m0,c3.m3,c3.m5}; b=bound(s0,m,b,fuzz,depth); double s1[]={P[0],c0.m0,c0.m3,c0.m5,c4.m2,c5.m2,c6.m2,c7.m2, c4.m4,c5.m4,c6.m4,c7.m4,c4.m5,c5.m5,c6.m5,c7.m5}; b=bound(s1,m,b,fuzz,depth); double s2[]={c0.m5,c0.m4,c0.m2,P[3],c7.m2,c8.m2,c9.m2,c10.m2, c7.m4,c8.m4,c9.m4,c10.m4,c7.m5,c8.m5,c9.m5,c10.m5}; b=bound(s2,m,b,fuzz,depth); double s3[]={c7.m5,c8.m5,c9.m5,c10.m5,c7.m3,c8.m3,c9.m3,c10.m3, c7.m0,c8.m0,c9.m0,c10.m0,c3.m5,c3.m4,c3.m2,P[15]}; return bound(s3,m,b,fuzz,depth); } double cornerbound(triple *P, double (*m)(double, double), double (*f)(const triple&)) { double b=m(f(P[0]),f(P[3])); b=m(b,f(P[12])); return m(b,f(P[15])); } // Return f evaluated at controlling vertex of bounding box of n control // net points for similiar-triangle transform x'=x/z, y'=y/z, where z < 0. double ratiobound(triple *P, double (*m)(double, double), double (*f)(const triple&), int n) { double MX=-P[0].getx(); double MY=-P[0].gety(); double Z=P[0].getz(); double MZ=-Z; for(int i=1; i < n; ++i) { triple v=P[i]; MX=m(MX,-v.getx()); MY=m(MY,-v.gety()); Z=m(Z,v.getz()); MZ=m(MZ,-v.getz()); } return m(f(triple(-MX,-MY,Z)),f(triple(-MX,-MY,-MZ))); } double controlbound(triple *P, double (*m)(double, double), double (*f)(const triple&)) { double b=m(f(P[1]),f(P[2])); b=m(b,f(P[4])); b=m(b,f(P[5])); b=m(b,f(P[6])); b=m(b,f(P[7])); b=m(b,f(P[8])); b=m(b,f(P[9])); b=m(b,f(P[10])); b=m(b,f(P[11])); b=m(b,f(P[13])); return m(b,f(P[14])); } double bound(triple *P, double (*m)(double, double), double (*f)(const triple&), double b, double fuzz, int depth) { b=m(b,cornerbound(P,m,f)); if(m(-1.0,1.0)*(b-ratiobound(P,m,f,16)) >= -fuzz || depth == 0) return b; --depth; fuzz *= 2; Split c0(P[0],P[1],P[2],P[3]); Split c1(P[4],P[5],P[6],P[7]); Split c2(P[8],P[9],P[10],P[11]); Split c3(P[12],P[13],P[14],P[15]); Split c4(P[12],P[8],P[4],P[0]); Split c5(c3.m0,c2.m0,c1.m0,c0.m0); Split c6(c3.m3,c2.m3,c1.m3,c0.m3); Split c7(c3.m5,c2.m5,c1.m5,c0.m5); Split c8(c3.m4,c2.m4,c1.m4,c0.m4); Split c9(c3.m2,c2.m2,c1.m2,c0.m2); Split c10(P[15],P[11],P[7],P[3]); // Check all 4 Bezier subpatches. triple s0[]={c4.m5,c5.m5,c6.m5,c7.m5,c4.m3,c5.m3,c6.m3,c7.m3, c4.m0,c5.m0,c6.m0,c7.m0,P[12],c3.m0,c3.m3,c3.m5}; b=bound(s0,m,f,b,fuzz,depth); triple s1[]={P[0],c0.m0,c0.m3,c0.m5,c4.m2,c5.m2,c6.m2,c7.m2, c4.m4,c5.m4,c6.m4,c7.m4,c4.m5,c5.m5,c6.m5,c7.m5}; b=bound(s1,m,f,b,fuzz,depth); triple s2[]={c0.m5,c0.m4,c0.m2,P[3],c7.m2,c8.m2,c9.m2,c10.m2, c7.m4,c8.m4,c9.m4,c10.m4,c7.m5,c8.m5,c9.m5,c10.m5}; b=bound(s2,m,f,b,fuzz,depth); triple s3[]={c7.m5,c8.m5,c9.m5,c10.m5,c7.m3,c8.m3,c9.m3,c10.m3, c7.m0,c8.m0,c9.m0,c10.m0,c3.m5,c3.m4,c3.m2,P[15]}; return bound(s3,m,f,b,fuzz,depth); } template struct Splittri { T l003,p102,p012,p201,p111,p021,r300,p210,p120,u030; T u021,u120; T p033,p231,p330; T p123; T l012,p312,r210,l102,p303,r201; T u012,u210,l021,p4xx,r120,px4x,pxx4,l201,r102; T l210,r012,l300; T r021,u201,r030; T u102,l120,l030; T l111,r111,u111,c111; Splittri(const T *p) { l003=p[0]; p102=p[1]; p012=p[2]; p201=p[3]; p111=p[4]; p021=p[5]; r300=p[6]; p210=p[7]; p120=p[8]; u030=p[9]; u021=0.5*(u030+p021); u120=0.5*(u030+p120); p033=0.5*(p021+p012); p231=0.5*(p120+p111); p330=0.5*(p120+p210); p123=0.5*(p012+p111); l012=0.5*(p012+l003); p312=0.5*(p111+p201); r210=0.5*(p210+r300); l102=0.5*(l003+p102); p303=0.5*(p102+p201); r201=0.5*(p201+r300); u012=0.5*(u021+p033); u210=0.5*(u120+p330); l021=0.5*(p033+l012); p4xx=0.5*p231+0.25*(p111+p102); r120=0.5*(p330+r210); px4x=0.5*p123+0.25*(p111+p210); pxx4=0.25*(p021+p111)+0.5*p312; l201=0.5*(l102+p303); r102=0.5*(p303+r201); l210=0.5*(px4x+l201); // = m120 r012=0.5*(px4x+r102); // = m021 l300=0.5*(l201+r102); // = r003 = m030 r021=0.5*(pxx4+r120); // = m012 u201=0.5*(u210+pxx4); // = m102 r030=0.5*(u210+r120); // = u300 = m003 u102=0.5*(u012+p4xx); // = m201 l120=0.5*(l021+p4xx); // = m210 l030=0.5*(u012+l021); // = u003 = m300 l111=0.5*(p123+l102); r111=0.5*(p312+r210); u111=0.5*(u021+p231); c111=0.25*(p033+p330+p303+p111); } }; // Return the extremum of the vertices of a Bezier triangle. double cornerboundtri(double *P, double (*m)(double, double)) { double b=m(P[0],P[6]); return m(b,P[9]); } double cornerboundtri(triple *P, double (*m)(double, double), double (*f)(const triple&)) { double b=m(f(P[0]),f(P[6])); return m(b,f(P[9])); } // Return the extremum of the non-vertex control points of a Bezier triangle. double controlboundtri(double *P, double (*m)(double, double)) { double b=m(P[1],P[2]); b=m(b,P[3]); b=m(b,P[4]); b=m(b,P[5]); b=m(b,P[7]); return m(b,P[8]); } double controlboundtri(triple *P, double (*m)(double, double), double (*f)(const triple&)) { double b=m(f(P[1]),f(P[2])); b=m(b,f(P[3])); b=m(b,f(P[4])); b=m(b,f(P[5])); b=m(b,f(P[7])); return m(b,f(P[8])); } // Return the global bound of a Bezier triangle. double boundtri(double *P, double (*m)(double, double), double b, double fuzz, int depth) { b=m(b,cornerboundtri(P,m)); if(m(-1.0,1.0)*(b-controlboundtri(P,m)) >= -fuzz || depth == 0) return b; --depth; fuzz *= 2; Splittri s(P); double l[]={s.l003,s.l102,s.l012,s.l201,s.l111, s.l021,s.l300,s.l210,s.l120,s.l030}; // left b=boundtri(l,m,b,fuzz,depth); double r[]={s.l300,s.r102,s.r012,s.r201,s.r111, s.r021,s.r300,s.r210,s.r120,s.r030}; // right b=boundtri(r,m,b,fuzz,depth); double u[]={s.l030,s.u102,s.u012,s.u201,s.u111, s.u021,s.r030,s.u210,s.u120,s.u030}; // up b=boundtri(u,m,b,fuzz,depth); double c[]={s.r030,s.u201,s.r021,s.u102,s.c111, s.r012,s.l030,s.l120,s.l210,s.l300}; // center return boundtri(c,m,b,fuzz,depth); } double boundtri(triple *P, double (*m)(double, double), double (*f)(const triple&), double b, double fuzz, int depth) { b=m(b,cornerboundtri(P,m,f)); if(m(-1.0,1.0)*(b-ratiobound(P,m,f,10)) >= -fuzz || depth == 0) return b; --depth; fuzz *= 2; Splittri s(P); triple l[]={s.l003,s.l102,s.l012,s.l201,s.l111, s.l021,s.l300,s.l210,s.l120,s.l030}; // left b=boundtri(l,m,f,b,fuzz,depth); triple r[]={s.l300,s.r102,s.r012,s.r201,s.r111, s.r021,s.r300,s.r210,s.r120,s.r030}; // right b=boundtri(r,m,f,b,fuzz,depth); triple u[]={s.l030,s.u102,s.u012,s.u201,s.u111, s.u021,s.r030,s.u210,s.u120,s.u030}; // up b=boundtri(u,m,f,b,fuzz,depth); triple c[]={s.r030,s.u201,s.r021,s.u102,s.c111, s.r012,s.l030,s.l120,s.l210,s.l300}; // center return boundtri(c,m,f,b,fuzz,depth); } inline void add(std::vector& T, std::vector& U, std::vector& V, double t, double u, double v, const path3& p, double fuzz2) { triple z=p.point(t); size_t n=T.size(); for(size_t i=0; i < n; ++i) if((p.point(T[i])-z).abs2() <= fuzz2) return; T.push_back(t); U.push_back(u); V.push_back(v); } void add(std::vector& T, std::vector& U, std::vector& V, std::vector& T1, std::vector& U1, std::vector& V1, const path3& p, double tscale, double toffset, double uoffset, double voffset, double fuzz2) { size_t n=T1.size(); for(size_t i=0; i < n; ++i) add(T,U,V,tscale*T1[i]+toffset,0.5*U1[i]+uoffset,0.5*V1[i]+voffset,p, fuzz2); } void bounds(triple& Pmin, triple& Pmax, triple *P, double fuzz) { double Px[]={P[0].getx(),P[1].getx(),P[2].getx(),P[3].getx(), P[4].getx(),P[5].getx(),P[6].getx(),P[7].getx(), P[8].getx(),P[9].getx(),P[10].getx(),P[11].getx(), P[12].getx(),P[13].getx(),P[14].getx(),P[15].getx()}; double bx=Px[0]; double xmin=bound(Px,min,bx,fuzz,maxdepth); double xmax=bound(Px,max,bx,fuzz,maxdepth); double Py[]={P[0].gety(),P[1].gety(),P[2].gety(),P[3].gety(), P[4].gety(),P[5].gety(),P[6].gety(),P[7].gety(), P[8].gety(),P[9].gety(),P[10].gety(),P[11].gety(), P[12].gety(),P[13].gety(),P[14].gety(),P[15].gety()}; double by=Py[0]; double ymin=bound(Py,min,by,fuzz,maxdepth); double ymax=bound(Py,max,by,fuzz,maxdepth); double Pz[]={P[0].getz(),P[1].getz(),P[2].getz(),P[3].getz(), P[4].getz(),P[5].getz(),P[6].getz(),P[7].getz(), P[8].getz(),P[9].getz(),P[10].getz(),P[11].getz(), P[12].getz(),P[13].getz(),P[14].getz(),P[15].getz()}; double bz=Pz[0]; double zmin=bound(Pz,min,bz,fuzz,maxdepth); double zmax=bound(Pz,max,bz,fuzz,maxdepth); Pmin=triple(xmin,ymin,zmin); Pmax=triple(xmax,ymax,zmax); } inline double abs2(double x, double y, double z) { return x*x+y*y+z*z; } bool intersections(double& U, double& V, const triple& v, triple *P, double fuzz, unsigned depth) { if(errorstream::interrupt) throw interrupted(); triple Pmin,Pmax; bounds(Pmin,Pmax,P,fuzz); double x=P[0].getx(); double y=P[0].gety(); double z=P[0].getz(); double X=x, Y=y, Z=z; for(int i=1; i < 16; ++i) { triple v=P[i]; double vx=v.getx(); x=min(x,vx); X=max(X,vx); double vy=v.gety(); y=min(y,vy); Y=max(Y,vy); double vz=v.getz(); z=min(z,vz); Z=max(Z,vz); } if(X+fuzz >= v.getx() && Y+fuzz >= v.gety() && Z+fuzz >= v.getz() && v.getx()+fuzz >= x && v.gety()+fuzz >= y && v.getz()+fuzz >= z) { // Overlapping bounding boxes --depth; // fuzz *= 2; if(abs2(X-x,Y-y,Z-z) <= fuzz*fuzz || depth == 0) { U=0.5; V=0.5; return true; } // Compute the control points of the four subpatches obtained by splitting // the patch with control points P at u=v=1/2. Split c0(P[0],P[1],P[2],P[3]); Split c1(P[4],P[5],P[6],P[7]); Split c2(P[8],P[9],P[10],P[11]); Split c3(P[12],P[13],P[14],P[15]); Split c4(P[12],P[8],P[4],P[0]); Split c5(c3.m0,c2.m0,c1.m0,c0.m0); Split c6(c3.m3,c2.m3,c1.m3,c0.m3); Split c7(c3.m5,c2.m5,c1.m5,c0.m5); Split c8(c3.m4,c2.m4,c1.m4,c0.m4); Split c9(c3.m2,c2.m2,c1.m2,c0.m2); Split c10(P[15],P[11],P[7],P[3]); // Check all 4 Bezier subpatches. double U1,V1; triple Q0[]={P[0],c0.m0,c0.m3,c0.m5,c4.m2,c5.m2,c6.m2,c7.m2, c4.m4,c5.m4,c6.m4,c7.m4,c4.m5,c5.m5,c6.m5,c7.m5}; if(intersections(U1,V1,v,Q0,fuzz,depth)) { U=0.5*U1; V=0.5*V1; return true; } triple Q1[]={c0.m5,c0.m4,c0.m2,P[3],c7.m2,c8.m2,c9.m2,c10.m2, c7.m4,c8.m4,c9.m4,c10.m4,c7.m5,c8.m5,c9.m5,c10.m5}; if(intersections(U1,V1,v,Q1,fuzz,depth)) { U=0.5*U1; V=0.5*V1+0.5; return true; } triple Q2[]={c7.m5,c8.m5,c9.m5,c10.m5,c7.m3,c8.m3,c9.m3,c10.m3, c7.m0,c8.m0,c9.m0,c10.m0,c3.m5,c3.m4,c3.m2,P[15]}; if(intersections(U1,V1,v,Q2,fuzz,depth)) { U=0.5*U1+0.5; V=0.5*V1+0.5; return true; } triple Q3[]={c4.m5,c5.m5,c6.m5,c7.m5,c4.m3,c5.m3,c6.m3,c7.m3, c4.m0,c5.m0,c6.m0,c7.m0,P[12],c3.m0,c3.m3,c3.m5}; if(intersections(U1,V1,v,Q3,fuzz,depth)) { U=0.5*U1+0.5; V=0.5*V1; return true; } } return false; } bool intersections(std::vector& T, std::vector& U, std::vector& V, path3& p, triple *P, double fuzz, bool single, unsigned depth) { if(errorstream::interrupt) throw interrupted(); double fuzz2=max(fuzzFactor*fuzz*fuzz,Fuzz2); triple pmin=p.min(); triple pmax=p.max(); double x=P[0].getx(); double y=P[0].gety(); double z=P[0].getz(); double X=x, Y=y, Z=z; for(int i=1; i < 16; ++i) { triple v=P[i]; double vx=v.getx(); x=min(x,vx); X=max(X,vx); double vy=v.gety(); y=min(y,vy); Y=max(Y,vy); double vz=v.getz(); z=min(z,vz); Z=max(Z,vz); } if(X+fuzz >= pmin.getx() && Y+fuzz >= pmin.gety() && Z+fuzz >= pmin.getz() && pmax.getx()+fuzz >= x && pmax.gety()+fuzz >= y && pmax.getz()+fuzz >= z) { // Overlapping bounding boxes --depth; // fuzz *= 2; if(((pmax-pmin).length()+sqrt(abs2(X-x,Y-y,Z-z)) <= fuzz) || depth == 0) { T.push_back(0.5); U.push_back(0.5); V.push_back(0.5); return true; } Int lp=p.length(); path3 p0,p1; p.halve(p0,p1); std::vector T1,U1,V1; double tscale,toffset; if(lp <= 1) { if(lp == 1) p.halve(p0,p1); if(lp == 0 || p0 == p || p1 == p) { double u,v; if(intersections(u,v,p.point((Int) 0),P,fuzz,depth)) { T1.push_back(0.0); U1.push_back(u); V1.push_back(v); add(T,U,V,T1,U1,V1,p,1.0,0.0,0.0,0.0,fuzz2); } return T1.size() > 0; } tscale=toffset=0.5; } else { Int tp=lp/2; p0=p.subpath(0,tp); p1=p.subpath(tp,lp); toffset=tp; tscale=1.0; } Split c0(P[0],P[1],P[2],P[3]); Split c1(P[4],P[5],P[6],P[7]); Split c2(P[8],P[9],P[10],P[11]); Split c3(P[12],P[13],P[14],P[15]); Split c4(P[12],P[8],P[4],P[0]); Split c5(c3.m0,c2.m0,c1.m0,c0.m0); Split c6(c3.m3,c2.m3,c1.m3,c0.m3); Split c7(c3.m5,c2.m5,c1.m5,c0.m5); Split c8(c3.m4,c2.m4,c1.m4,c0.m4); Split c9(c3.m2,c2.m2,c1.m2,c0.m2); Split c10(P[15],P[11],P[7],P[3]); static size_t maxcount=9; size_t count=0; bool Short=lp == 1; // Check all 4 Bezier subpatches against p0. triple Q0[]={P[0],c0.m0,c0.m3,c0.m5,c4.m2,c5.m2,c6.m2,c7.m2, c4.m4,c5.m4,c6.m4,c7.m4,c4.m5,c5.m5,c6.m5,c7.m5}; if(intersections(T1,U1,V1,p0,Q0,fuzz,single,depth)) { add(T,U,V,T1,U1,V1,p,tscale,0.0,0.0,0.0,fuzz2); if(single || depth <= mindepth) return true; count += T1.size(); if(Short && count > maxcount) return true; } T1.clear(); U1.clear(); V1.clear(); triple Q1[]={c0.m5,c0.m4,c0.m2,P[3],c7.m2,c8.m2,c9.m2,c10.m2, c7.m4,c8.m4,c9.m4,c10.m4,c7.m5,c8.m5,c9.m5,c10.m5}; if(intersections(T1,U1,V1,p0,Q1,fuzz,single,depth)) { add(T,U,V,T1,U1,V1,p,tscale,0.0,0.0,0.5,fuzz2); if(single || depth <= mindepth) return true; count += T1.size(); if(Short && count > maxcount) return true; } T1.clear(); U1.clear(); V1.clear(); triple Q2[]={c7.m5,c8.m5,c9.m5,c10.m5,c7.m3,c8.m3,c9.m3,c10.m3, c7.m0,c8.m0,c9.m0,c10.m0,c3.m5,c3.m4,c3.m2,P[15]}; if(intersections(T1,U1,V1,p0,Q2,fuzz,single,depth)) { add(T,U,V,T1,U1,V1,p,tscale,0.0,0.5,0.5,fuzz2); if(single || depth <= mindepth) return true; count += T1.size(); if(Short && count > maxcount) return true; } T1.clear(); U1.clear(); V1.clear(); triple Q3[]={c4.m5,c5.m5,c6.m5,c7.m5,c4.m3,c5.m3,c6.m3,c7.m3, c4.m0,c5.m0,c6.m0,c7.m0,P[12],c3.m0,c3.m3,c3.m5}; if(intersections(T1,U1,V1,p0,Q3,fuzz,single,depth)) { add(T,U,V,T1,U1,V1,p,tscale,0.0,0.5,0.0,fuzz2); if(single || depth <= mindepth) return true; count += T1.size(); if(Short && count > maxcount) return true; } // Check all 4 Bezier subpatches against p1. T1.clear(); U1.clear(); V1.clear(); if(intersections(T1,U1,V1,p1,Q0,fuzz,single,depth)) { add(T,U,V,T1,U1,V1,p,tscale,toffset,0.0,0.0,fuzz2); if(single || depth <= mindepth) return true; count += T1.size(); if(Short && count > maxcount) return true; } T1.clear(); U1.clear(); V1.clear(); if(intersections(T1,U1,V1,p1,Q1,fuzz,single,depth)) { add(T,U,V,T1,U1,V1,p,tscale,toffset,0.0,0.5,fuzz2); if(single || depth <= mindepth) return true; count += T1.size(); if(Short && count > maxcount) return true; } T1.clear(); U1.clear(); V1.clear(); if(intersections(T1,U1,V1,p1,Q2,fuzz,single,depth)) { add(T,U,V,T1,U1,V1,p,tscale,toffset,0.5,0.5,fuzz2); if(single || depth <= mindepth) return true; count += T1.size(); if(Short && count > maxcount) return true; } T1.clear(); U1.clear(); V1.clear(); if(intersections(T1,U1,V1,p1,Q3,fuzz,single,depth)) { add(T,U,V,T1,U1,V1,p,tscale,toffset,0.5,0.0,fuzz2); if(single || depth <= mindepth) return true; count += T1.size(); if(Short && count > maxcount) return true; } return T.size() > 0; } return false; } } //namespace camp asymptote-3.05/deconstruct0000644000000000000000000000004615031566105014446 0ustar rootrootKEY=1.5 00 -0.25 -0.25 1.25 1.25 Done asymptote-3.05/asyprocess.h0000644000000000000000000001147415031566105014541 0ustar rootroot/***** * process.h * Andy Hammerlindl 2006/08/19 * * Handles processing blocks of code (including files, strings, and the * interactive prompt, for listing and parse-only modes as well as actually * running it. *****/ #pragma once #include "common.h" #include "stm.h" #include "stack.h" #include "pipestream.h" #include "callable.h" #include "pen.h" #include "dec.h" #include "transform.h" #include "asyparser.h" #ifdef HAVE_LIBTIRPC #include "xstream.h" #endif // Process the code respecting the parseonly and listvariables flags of // settings. void processCode(absyntax::block *code); void processFile(const string& filename, bool purge=false); void processPrompt(); // Run the code in its own environment. void runCode(absyntax::block *code); void runString(const string& s, bool interactiveWrite=false); void runFile(const string& filename); void runPrompt(); // Run the code in a given run-time environment. typedef vm::interactiveStack istack; void runCodeEmbedded(absyntax::block *code, trans::coenv &e, istack &s); void runStringEmbedded(const string& str, trans::coenv &e, istack &s); void runPromptEmbedded(trans::coenv &e, istack &s); // Basic listing. void doUnrestrictedList(); template class terminator { public: typedef mem::vector Pointer; Pointer pointer; // Return first available index size_t available() { size_t index=0; for(auto p=pointer.begin(); p != pointer.end(); ++p) { if(*p == NULL) {return index;} ++index; } pointer.push_back(NULL); return index; } size_t add(T *p) { size_t index=available(); pointer[index]=p; return index; } void remove(size_t index) { pointer[index]=NULL; } ~terminator() { for(auto p=pointer.begin(); p != pointer.end(); ++p) { if(*p != NULL) { (*p)->~T(); (*p)=NULL; } } } }; class texstream : public iopipestream { public: ~texstream(); }; typedef std::pair linecolumn; typedef mem::map xkey_t; typedef mem::deque xtransform_t; typedef mem::map xmap_t; typedef mem::map sigMap_t; struct processDataStruct { texstream tex; // Bi-directional pipe to latex (to find label bbox) mem::list TeXpipepreamble; mem::list TeXpreamble; vm::callable *atExitFunction; vm::callable *atUpdateFunction; vm::callable *atBreakpointFunction; camp::pen defaultpen; camp::pen currentpen; sigMap_t sigMap; // For xasy: string fileName; position topPos; string KEY; xkey_t xkey; xmap_t xmap; unsigned int xmapCount; terminator ofile; terminator ifile; #ifdef HAVE_LIBTIRPC terminator ixfile; terminator oxfile; #endif processDataStruct() : xmapCount(0) { atExitFunction=NULL; atUpdateFunction=NULL; atBreakpointFunction=NULL; defaultpen=camp::pen::initialpen(); currentpen=camp::pen(); } }; enum transMode { TRANS_INTERACTIVE, TRANS_NORMAL }; // Abstract base class for the core object being run in line-at-a-time mode, it // may be a block of code, file, or interactive prompt. struct icore { virtual ~icore() {} virtual void doParse() = 0; virtual void doList() = 0; public: virtual void preRun(trans::coenv &e, istack &s); virtual void run(trans::coenv &e, istack &s, transMode tm=TRANS_NORMAL) = 0; virtual void postRun(trans::coenv &, istack &s); virtual void doRun(bool purge=false, transMode tm=TRANS_NORMAL); virtual void process(bool purge=false); }; // Abstract base class for one-time processing of an abstract syntax tree. class itree : public icore { string name; absyntax::block *cachedTree; public: itree(string name=""); virtual absyntax::block *buildTree() = 0; // Build the tree, possibly throwing a handled_error if it cannot be built. virtual absyntax::block *getTree(); virtual string getName(); void doParse(); void doList(); void run(trans::coenv &e, istack &s, transMode tm=TRANS_NORMAL); void doExec(transMode tm=TRANS_NORMAL); }; class ifile : public itree { string filename; string outname; string outname_save; public: ifile(const string& filename); absyntax::block *buildTree(); void preRun(trans::coenv& e, istack& s); void postRun(trans::coenv &e, istack& s); void process(bool purge=false); }; class icode : public itree { absyntax::block *tree; public: icode(absyntax::block *tree, string name="") : itree(name), tree(tree) {} absyntax::block *buildTree() { return tree; } }; class istring : public itree { string str; public: istring(const string& str, string name="") : itree(name), str(str) {} absyntax::block *buildTree() { return parser::parseString(str, getName()); } }; processDataStruct &processData(); asymptote-3.05/drawclipbegin.h0000644000000000000000000000347315031566105015160 0ustar rootroot/***** * drawclipbegin.h * John Bowman * * Begin clip of picture to specified path. *****/ #ifndef DRAWCLIPBEGIN_H #define DRAWCLIPBEGIN_H #include "drawelement.h" #include "path.h" #include "drawpath.h" namespace camp { class drawClipBegin : public drawSuperPathPenBase { bool gsave; bool stroke; public: void noncyclic() { reportError("cannot clip to non-cyclic path"); } drawClipBegin(const vm::array& src, bool stroke, pen pentype, bool gsave=true, const string& key="") : drawElement(key), drawSuperPathPenBase(src,pentype), gsave(gsave), stroke(stroke) { if(!stroke && !cyclic()) noncyclic(); } virtual ~drawClipBegin() {} bool beginclip() {return true;} void bounds(bbox& b, iopipestream& iopipe, boxvector& vbox, bboxlist& bboxstack) { bboxstack.push_back(b); bbox bpath; if(stroke) strokebounds(bpath); else drawSuperPathPenBase::bounds(bpath,iopipe,vbox,bboxstack); bboxstack.push_back(bpath); } bool begingroup() {return true;} bool svg() {return true;} void save(bool b) { gsave=b; } bool draw(psfile *out) { if(gsave) out->gsave(); if(empty()) return true; out->beginclip(); writepath(out,false); if(stroke) strokepath(out); out->endclip(pentype); return true; } bool write(texfile *out, const bbox& bpath) { if(gsave) out->gsave(); if(empty()) return true; if(out->toplevel()) out->beginpicture(bpath); out->begingroup(); out->beginspecial(); out->beginraw(); writeshiftedpath(out); if(stroke) strokepath(out); out->endclip(pentype); out->endraw(); out->endspecial(); return true; } drawElement *transformed(const transform& t) { return new drawClipBegin(transpath(t),stroke,transpen(t),gsave,KEY); } }; } #endif asymptote-3.05/builtin.h0000644000000000000000000000312315031566105014004 0ustar rootroot/***** * builtin.h * Tom Prince 2004/08/25 * * Initialize builtins. *****/ #ifndef BUILTIN_H #define BUILTIN_H #include "vm.h" #include "types.h" #include "arrayop.h" namespace trans { class tenv; class venv; // The base environments for built-in types and functions void base_tenv(tenv &); void base_venv(venv &); extern const types::formal noformal; // Add a function with one or more default arguments. varEntry *addFunc(venv &ve, vm::bltin f, types::ty *result, symbol name, types::formal f1=noformal, types::formal f2=noformal, types::formal f3=noformal, types::formal f4=noformal, types::formal f5=noformal, types::formal f6=noformal, types::formal f7=noformal, types::formal f8=noformal, types::formal f9=noformal, types::formal fA=noformal, types::formal fB=noformal, types::formal fC=noformal, types::formal fD=noformal, types::formal fE=noformal, types::formal fF=noformal, types::formal fG=noformal, types::formal fH=noformal, types::formal fI=noformal); // Adds standard functions for a newly added types. void addArrayOps(venv &ve, types::array *t); void addRecordOps(types::record *r); #ifdef HAVE_LIBGSL types::record *getGSLModule(); void GSLrngFree(); #endif } //namespace trans namespace run { extern double infinity; void single(vm::stack *Stack); void arrayDeleteHelper(vm::stack *Stack); // Used by to optimize conditional jumps. extern const vm::bltin intLess; extern const vm::bltin intGreater; } #endif //BUILTIN_H asymptote-3.05/generate_enums.py0000644000000000000000000001376715031566105015557 0ustar rootroot#!/usr/bin/env python3 # pylint: disable=too-many-locals,unused-argument,keyword-arg-before-vararg # A script to generate enums in different languages from a CSV file. # A CSV File contains # enum1, 0 # enum2, .. # ... # enumn, n # where 0,...,n are numbers. # # Written by Supakorn "Jamie" Rassameemasmuang import argparse import io import os import re import sys import time from datetime import datetime, timezone from typing import List, Tuple, Union def cleanComment(s): return re.sub(r" *#", " ", s) def parse_args(): parser = argparse.ArgumentParser() parser.add_argument("-language", "--language", type=str, required=True) parser.add_argument("-o", "--output", type=str, required=True) parser.add_argument("-i", "--input", type=str, required=True) parser.add_argument("-name", "--name", type=str, required=True) parser.add_argument("-xopt", "--xopt", type=str, nargs="*") return parser.parse_args() def create_enums(filename: str) -> List[Union[Tuple[str, int, str], Tuple[str, int]]]: final_list = [] with io.open(filename, newline="", encoding="utf-8") as rawfile: for line in rawfile.readlines(): if line.startswith("#") or line.strip() == "": continue raw_line = line.strip().split(",") raw_str, raw_number = raw_line[0:2] comment = None if len(raw_line) >= 3: comment = raw_line[-1] final_list.append((raw_str.strip(), int(raw_number.strip()), comment)) else: final_list.append((raw_str.strip(), int(raw_number.strip()))) return final_list def datetime_now(): return datetime.fromtimestamp( int(os.environ.get("SOURCE_DATE_EPOCH", time.time())), tz=timezone.utc ) def generate_enum_cpp(outname, enums, name, comment=None, *args, **kwargs): with io.open(outname, "w", encoding="utf-8") as fil: fil.write(f"// Enum class for {name}\n") if comment is not None: fil.write(f"// {comment}\n") if "namespace" in kwargs: fil.write(f"namespace {kwargs['namespace']}\n") fil.write("{\n") fil.write(f"enum {name} : uint32_t\n") fil.write("{\n") for enumTxt, enumNum, *ar in enums: if len(ar) > 0: comment = cleanComment(ar[-1]) if comment is not None: fil.write(f"// {comment.strip()}\n") fil.write(f"{enumTxt}={enumNum},\n\n") fil.write("};\n\n") if "namespace" in kwargs: fil.write(f"}} // namespace {kwargs['namespace']}\n") fil.write("// End of File\n") def generate_enum_java(outname, enums, name, comment=None, *args, **kwargs): with io.open(outname, "w", encoding="utf-8") as fil: fil.write(f"// Enum class for {name}\n") if comment is not None: fil.write(f"// {comment}\n") if "package" in kwargs: fil.write(f"package {kwargs['package']};\n") fil.write("\n") fil.write(f"public enum {name} {{\n") spaces = kwargs.get("spaces", 4) spaces_tab = " " * spaces for i, enum in enumerate(enums): enumTxt, enumNum, *ar = enum endsep = "," if i < len(enums) - 1 else ";" fil.write(f"{spaces_tab}{enumTxt}({enumNum}){endsep}\n") if len(ar) > 0: comment = cleanComment(ar[-1]) if comment is not None: fil.write(f"// {comment.strip()}\n\n") out_lines = [ "", f"{name}(int value) {{", f"{spaces_tab}this.value=value;", "}", "public String toString() {", f"{spaces_tab}return Integer.toString(value);", "}", "private int value;", ] for line in out_lines: fil.write(spaces_tab) fil.write(line) fil.write("\n") fil.write("};\n\n") fil.write("// End of File\n") def generate_enum_asy(outname, enums, name, comment=None, *args, **kwargs): with io.open(outname, "w", encoding="utf-8") as fil: fil.write(f"// Enum class for {name}\n") if comment is not None: fil.write(f"// {comment}\n") fil.write(f"struct {name}\n") fil.write("{\n") for enumTxt, enumNum, *ar in enums: fil.write(f" int {enumTxt}={enumNum};\n") if len(ar) > 0: comment = cleanComment(ar[-1]) if comment is not None: fil.write(f"// {comment.strip()}\n\n") fil.write("};\n\n") fil.write(f"{name} {name};") fil.write("// End of File\n") def generate_enum_py(outname, enums, name, comment=None, *args, **kwargs): with io.open(outname, "w", encoding="utf-8") as fil: fil.write("#!/usr/bin/env python3\n") fil.write(f"# Enum class for {name}\n") if comment is not None: fil.write(f'""" {comment} """\n') fil.write(f"class {name}:\n") for enumTxt, enumNum, *ar in enums: fil.write(f" {name}_{enumTxt}={enumNum}\n") if len(ar) > 0: comment = cleanComment(ar[-1]) if comment is not None: fil.write(f" # {comment.strip()}\n\n") fil.write("# End of File\n") def main(): arg = parse_args() if arg.language in {"python", "py"}: fn = generate_enum_py elif arg.language in {"cxx", "c++", "cpp"}: fn = generate_enum_cpp elif arg.language in {"asy", "asymptote"}: fn = generate_enum_asy elif arg.language in {"java"}: fn = generate_enum_java else: return 1 custom_args = {} if arg.xopt is not None: for xopt in arg.xopt: key, val = xopt.split("=") custom_args[key] = val enums = create_enums(arg.input) fn(arg.output, enums, arg.name, "AUTO-GENERATED from " + arg.input, **custom_args) return 0 if __name__ == "__main__": sys.exit(main() or 0) asymptote-3.05/runlabel.in0000644000000000000000000002636515031566105014336 0ustar rootroot/***** * runlabel.in * * Runtime functions for label operations. * *****/ pen => primPen() pair => primPair() path => primPath() picture* => primPicture() transform => primTransform() realarray* => realArray() stringarray* => stringArray() penarray* => penArray() patharray* => pathArray() patharray2* => pathArray2() #include "picture.h" #include "drawlabel.h" #include "locate.h" using namespace camp; using namespace vm; using namespace settings; typedef array realarray; typedef array stringarray; typedef array penarray; typedef array patharray; typedef array patharray2; using types::realArray; using types::stringArray; using types::penArray; using types::pathArray; using types::pathArray2; void cannotread(const string& s) { ostringstream buf; buf << "Cannot read from " << s; error(buf); } void cannotwrite(const string& s) { ostringstream buf; buf << "Cannot write to " << s; error(buf); } pair readpair(stringstream& s, double hscale=1.0, double vscale=1.0) { double x,y; s >> y; s >> x; return pair(hscale*x,vscale*y); } string ASYx="/ASYx {( ) print ASYX sub 12 string cvs print} bind def"; string ASYy="/ASYy {( ) print ASYY sub 12 string cvs print} bind def"; string pathforall="{(M) print ASYy ASYx} {(L) print ASYy ASYx} {(C) print ASYy ASYx ASYy ASYx ASYy ASYx} {(c) print} pathforall"; string currentpoint="print currentpoint ASYy ASYx "; string ASYinit="/ASYX currentpoint pop def /ASYY currentpoint exch pop def "; string ASY1="ASY1 {"+ASYinit+"/ASY1 false def} if "; void endpath(std::ostream& ps) { ps << ASY1 << pathforall << " (M) " << currentpoint << "currentpoint newpath moveto} bind def" << endl; } void fillpath(std::ostream& ps) { ps << "/fill {closepath "; endpath(ps); } void showpath(std::ostream& ps) { ps << ASYx << newl << ASYy << newl << "/ASY1 true def" << newl << "/stroke {strokepath "; endpath(ps); fillpath(ps); } array *readpath(const string& psname, bool keep, double hscale=1.0, double vsign=1.0) { double vscale=vsign*hscale; array *PP=new array(0); char *oldPath=NULL; string dir=stripFile(outname()); if(!dir.empty()) { oldPath=getPath(); setPath(dir.c_str()); } mem::vector cmd; cmd.push_back(getSetting("gs")); cmd.push_back("-q"); cmd.push_back("-dBATCH"); cmd.push_back("-P"); if(safe) cmd.push_back("-dSAFER"); #ifdef __MSDOS__ const string null="NUL"; #else const string null="/dev/null"; #endif string psdriver=getSetting("psdriver"); cmd.push_back("-sDEVICE="+psdriver); cmd.push_back("-sOutputFile="+null); cmd.push_back(stripDir(psname)); iopipestream gs(cmd,"gs","Ghostscript"); while(gs.running()) { stringstream buf; string s=gs.readline(); if(s.empty()) break; gs << newl; // Workaround broken stringstream container in libc++. #ifdef _LIBCPP_VERSION for(string::iterator i=s.begin(); i != s.end(); ++i) { if(isalpha(*i) && *i != 'e') {buf << " ";} buf << *i; } #else buf << s; #endif if(verbose > 2) cout << endl; mem::vector nodes; solvedKnot node; bool active=false; array *P=new array(0); PP->push(P); while(!buf.eof()) { char c='>'; buf >> c; if(c == '>') break; switch(c) { case 'M': { node.pre=node.point=readpair(buf,hscale,vscale); node.straight=false; break; } case 'L': { pair point=readpair(buf,hscale,vscale); pair delta=(point-node.point)*third; node.post=node.point+delta; node.straight=true; nodes.push_back(node); active=true; node.pre=point-delta; node.point=point; break; } case 'C': { pair point=readpair(buf,hscale,vscale); pair pre=readpair(buf,hscale,vscale); node.post=readpair(buf,hscale,vscale); node.straight=false; nodes.push_back(node); active=true; node.pre=pre; node.point=point; break; } case 'c': { if(active) { if(node.point == nodes[0].point) nodes[0].pre=node.pre; else { pair delta=(nodes[0].point-node.point)*third; node.post=node.point+delta; nodes[0].pre=nodes[0].point-delta; node.straight=true; nodes.push_back(node); } P->push(path(nodes,nodes.size(),true)); // Discard noncyclic paths nodes.clear(); } active=false; node.straight=false; break; } } } } if(oldPath != NULL) setPath(oldPath); if(!keep) unlink(psname.c_str()); return PP; } // Autogenerated routines: void label(picture *f, string *s, string *size, transform t, pair position, pair align, pen p) { f->append(new drawLabel(*s,*size,t,position,align,p)); } bool labels(picture *f) { return f->havelabels(); } realarray *texsize(string *s, pen p=CURRENTPEN) { texinit(); processDataStruct &pd=processData(); string texengine=getSetting("tex"); setpen(pd.tex,texengine,p); double width,height,depth; texbounds(width,height,depth,pd.tex,*s); array *t=new array(3); (*t)[0]=width; (*t)[1]=height; (*t)[2]=depth; return t; } patharray2 *_texpath(stringarray *s, penarray *p) { size_t n=checkArrays(s,p); if(n == 0) return new array(0); string prefix=cleanpath(outname()); string psname=auxname(prefix,"ps"); string texname=auxname(prefix,"tex"); string dviname=auxname(prefix,"dvi"); bbox b; string texengine=getSetting("tex"); bool xe=settings::xe(texengine) || settings::lua(texengine) || settings::context(texengine); texfile tex(texname,b,true); tex.miniprologue(); for(size_t i=0; i < n; ++i) { tex.setfont(read(p,i)); if(i != 0) { if(texengine == "context") tex.verbatimline("}\\page\\hbox{%"); else if(texengine == "luatex" || texengine == "tex" || texengine == "pdftex") tex.verbatimline("\\eject"); else tex.verbatimline("\\newpage"); } if(!xe) { tex.verbatimline("\\special{ps:"); tex.verbatimline(ASYx); tex.verbatimline(ASYy); tex.verbatimline("/ASY1 true def"); tex.verbatimline("/show {"+ASY1+ "currentpoint newpath moveto false charpath "+pathforall+ "} bind def"); tex.verbatimline("/V {"+ASY1+"Ry neg Rx 4 copy 4 2 roll 2 copy 6 2 roll 2 copy (M) print ASYy ASYx (L) print ASYy add ASYx (L) print add ASYy add ASYx (L) print add ASYy ASYx (c) print} bind def}"); } tex.verbatimline(read(s,i)+"\\ %"); } tex.epilogue(true); tex.close(); int status=opentex(texname,prefix,!xe); string pdfname,psname2; bool keep=getSetting("keep"); if(!status) { if(xe) { string psdriver=getSetting("psdriver"); pdfname=auxname(prefix,"pdf"); psname2=auxname(prefix+"_","ps"); if(!fs::exists(pdfname)) return new array(n); std::ofstream ps(psname.c_str(),std::ios::binary); if(!ps) cannotwrite(psname); showpath(ps); mem::vector cmd; cmd.push_back(getSetting("gs")); cmd.push_back("-q"); cmd.push_back("-dNoOutputFonts"); cmd.push_back("-dNOPAUSE"); cmd.push_back("-dBATCH"); if(safe) cmd.push_back("-dSAFER"); cmd.push_back("-sDEVICE="+psdriver); cmd.push_back("-sOutputFile="+psname2); cmd.push_back(pdfname); status=System(cmd,0,true,"gs"); std::ifstream in(psname2.c_str()); ps << in.rdbuf(); ps.close(); } else { if(!fs::exists(dviname)) return new array(n); mem::vector dcmd; dcmd.push_back(getSetting("dvips")); dcmd.push_back("-R"); dcmd.push_back("-Pdownload35"); dcmd.push_back("-D600"); push_split(dcmd,getSetting("dvipsOptions")); if(verbose <= 2) dcmd.push_back("-q"); dcmd.push_back("-o"+psname); dcmd.push_back(dviname); status=System(dcmd,0,true,"dvips"); } } else error("texpath failed"); if(!keep) { // Delete temporary files. unlink(texname.c_str()); if(!getSetting("keepaux")) unlink(auxname(prefix,"aux").c_str()); unlink(auxname(prefix,"log").c_str()); unlink(xe ? pdfname.c_str() : dviname.c_str()); if(settings::context(texengine)) { unlink(auxname(prefix,"top").c_str()); unlink(auxname(prefix,"tua").c_str()); unlink(auxname(prefix,"tuc").c_str()); unlink(auxname(prefix,"tui").c_str()); } } return xe ? readpath(psname,keep,0.1) : readpath(psname,keep,0.12,-1.0); } patharray2 *textpath(stringarray *s, penarray *p) { size_t n=checkArrays(s,p); if(n == 0) return new array(0); string prefix=cleanpath(outname()); string outputname=auxname(prefix,getSetting("textoutformat")); string textname=auxname(prefix,getSetting("textextension")); std::ofstream text(textname.c_str()); if(!text) cannotwrite(textname); for(size_t i=0; i < n; ++i) { text << getSetting("textprologue") << newl << read(p,i).Font() << newl << read(s,i) << newl << getSetting("textepilogue") << endl; } text.close(); string psname=auxname(prefix,"ps"); std::ofstream ps(psname.c_str()); if(!ps) cannotwrite(psname); showpath(ps); mem::vector cmd; cmd.push_back(getSetting("textcommand")); push_split(cmd,getSetting("textcommandOptions")); cmd.push_back(textname); iopipestream typesetter(cmd); typesetter.block(true,false); mem::vector cmd2; cmd2.push_back(getSetting("gs")); cmd2.push_back("-q"); cmd2.push_back("-dNoOutputFonts"); cmd2.push_back("-dNOPAUSE"); cmd2.push_back("-dBATCH"); cmd2.push_back("-P"); if(safe) cmd2.push_back("-dSAFER"); cmd2.push_back("-sDEVICE="+getSetting("psdriver")); cmd2.push_back("-sOutputFile=-"); cmd2.push_back("-"); iopipestream gs(cmd2,"gs","Ghostscript"); gs.block(false,false); // TODO: Simplify by connecting the pipes directly. for(;;) { string out; if(typesetter.isopen()) { typesetter >> out; if(!out.empty()) gs << out; else if(!typesetter.running()) { typesetter.pipeclose(); gs.eof(); } } string out2; gs >> out2; if(out2.empty() && !gs.running()) break; ps << out2; } ps.close(); if(verbose > 2) cout << endl; bool keep=getSetting("keep"); if(!keep) // Delete temporary files. unlink(textname.c_str()); return readpath(psname,keep,0.1); } patharray *_strokepath(path g, pen p=CURRENTPEN) { array *P=new array(0); if(g.size() == 0) return P; string prefix=cleanpath(outname()); string psname=auxname(prefix,"ps"); bbox b; psfile ps(psname,false); ps.prologue(b); ps.verbatimline(ASYx); ps.verbatimline(ASYy); ps.verbatimline("/stroke {"+ASYinit+pathforall+"} bind def"); ps.resetpen(); ps.setpen(p); ps.write(g); ps.strokepath(); ps.stroke(p); ps.verbatimline("(M) "+currentpoint); ps.epilogue(); ps.close(); array *a=readpath(psname,getSetting("keep")); return a->size() > 0 ? read(a,0) : a; } asymptote-3.05/libatomic_ops/0000755000000000000000000000000015031566105015012 5ustar rootrootasymptote-3.05/libatomic_ops/ChangeLog0000644000000000000000000010674715031566105016603 0ustar rootroot == [7.8.2] 2023-12-15 == * Eliminate 'atomic_thread_fence is unsupported with tsan' gcc-11 warning * Eliminate 'comparing signed/unsigned values' lcc warning in add_chunk_as * Fix 'undefined reference to AO_pt_lock' if configure is using clang-16 * Fix 'undefined reference to __atomic_load/store/cas_16' Mingw64-gcc error * Fix 'undefined reference' linker errors if shared build on OpenBSD (CMake) * Fix get_chunk for case of mmap area is located before AO_initial_heap * Fix typo in AO_HAVE_compare_and_swap_double name in atomic_ops_stack.h * Fix typo in comment of run_one_test of test_stack * Fix typos in comments of atomic_ops_malloc.c and atomic_ops_stack.c/h * Update cmake minimum required version to 3.5 == [7.8.0] 2023-03-26 == * Add AUTHORS file to the list of installed documentation * Add goal to Makefile.msft to build all tests but not execute them * Allocate marks[] dynamically and report all found errors in test_stack * Always export stack_init/push_release/pop_acquire from atomic_ops_gpl * Always use 'mfence' for nop_full if target CPU supports SSE2 (MS VC/x86) * Avoid 'cast increases required alignment' warnings in atomic_ops_malloc.c * Avoid breaking strict-aliasing rules in test_malloc and test_stack * Avoid code duplication in AO_stack_push_explicit_aux_release * Better document test_stack internals * Build atomic_ops.lib by Makefile.msft (MS VC) * Build test object and executable files in tests folder (MS VC) * Define AO_stack_t uniformly * Define double_compare_and_swap_full if MS VS 2017+ (x86) * Do not expose AO_REAL_HEAD/NEXT_PTR implementation in header by default * Document config macros in README_win32 and remove them from configure * Eliminate 'function is never used' cppcheck warning for AO_stack_init * Enforce most strict level of compiler warnings (MS VC) * Ensure atomic_ops.c global symbols are always declared as extern 'C' * Explicitly outline symbols exported in AO shared libraries with AO_API * Hide AO_free_list symbol * Implement AO_stack_init using memset * Implement AO_test_and_set using InterlockedExchange8 (MS VC) * Implement and/or/xor for AO_t, short and int types (MS VC) * Implement nf/acq/rel variants of primitives on Windows RT (MS VC) * Mention MIT near core library licensing terms in LICENSE file * Move all README_*.txt and license files to the top folder * Move all non-double intrinsic-based primitives to msftc/common32_defs.h * Move gcc-4/alpha workaround outside AO_stack_pop_explicit_aux_acquire * New AO_stack_is_lock_free API function * New configure option (--disable-gpl) to skip building of libatomic_ops_gpl * Print message of almost-lock-free implementation in test_stack if used * Refine LICENSE and README about code parts covered by MIT and GPL-2.0 * Refine copyright terms in GPL source files * Reformat atomic_ops_stack.c/h files * Remove 'lib' prefix for atomic_ops_gpl.lib in Makefile.msft * Remove redundant assert in AO_stack_pop_explicit_aux_acquire * Remove redundant cast to AO_t in lock-free AO_stack_pop_acquire * Rename LICENSING.txt to LICENSE file * Rename VERBOSE macro to VERBOSE_STACK in test_stack (refactoring) * Rename fetch_and_add to fetch_then_add in test_stack (refactoring) * Replace obsolete AC_HELP_STRING with AS_HELP_STRING in configure * Replace obsolete AC_TRY_COMPILE with AC_COMPILE_IFELSE in configure * Split test_stack main into several functions (refactoring) * Support Elbrus 2000 (gcc/e2k) * Support build with CMake * Support double-wide CAS on armv7+ and UWP/arm64 (MS VC) * Support test_atomic with MS build w/o the need to run GNU make first * Update autotools for release tarball preparation (ac-2.71, m4-1.4.19) * Use GCC atomic intrinsics for SPARC * Use builtin_expect in AO_stack_push_explicit_aux_release == [7.6.16] 2023-12-15 == * Eliminate 'atomic_thread_fence is unsupported with tsan' gcc-11 warning * Eliminate 'comparing signed/unsigned values' lcc warning in add_chunk_as * Fix 'undefined reference to AO_pt_lock' if configure is using clang-16 * Fix 'undefined reference to __atomic_load/store/cas_16' Mingw64-gcc error * Fix get_chunk for case of mmap area is located before AO_initial_heap * Fix typo in AO_HAVE_compare_and_swap_double name in atomic_ops_stack.h * Fix typos in comments of atomic_ops_malloc.c and atomic_ops_stack.c/h == [7.6.14] 2022-08-25 == * Add note to README that AO malloc code has same license as AO stack * Adjust/reformat content of LICENSING.txt * Avoid AO_stack_t to cross CPU cache line boundary * Do not assume 'ordered except earlier write' for UWP/arm64 * Do not name GCC intrinsics as C11 ones in ChangeLog and configure * Eliminate '-pedantic is not option that controls warnings' GCC-6.3 message * Ensure result of AO_test_and_set is always AO_TS_CLEAR or AO_TS_SET * Fix 'AO_malloc redefinition' MS VC warning caused by attributes mismatch * Fix 'use of undeclared SIG_BLOCK' Clang error if -std=c89 on Cygwin * Fix AO_compare_and_swap_full asm code for clang on sparc * Fix a typo in comment of AO_stack_push_explicit_aux_release * Fix code indentation in main() of test_stack.c * Refine AO_UNIPROCESSOR macro description in configure * Remove outdated comment about unsupported Win64 in atomic_ops_stack.h * Repeat black list check on CAS fail in stack_push_explicit_aux_release == [7.6.12] 2021-09-13 == * Allow to generalize bool-CAS for sparc (gcc) * Declare argument of AO_load_next with const in atomic_ops_stack * Describe double_compare_and_swap operation in README_details * Document CAS operations better in README_details * Fix gcc/sunc x86 AO_compare_double_and_swap_double missing side effect * Fix library name in README_details * Fix link fail caused by missing GCC char/short atomic primitives on riscv64 * Fix size of local variable passed to cas[x] (gcc/sparc) * Implement fetch-CAS for sparc (gcc) * Refactor gcc x86 memory constraints * Refine and reformat description of size prefix in README_details * Remove outdated notes in README_details * Replace x86 setz instruction by asm flag output operand (gcc) * Support MSYS host (configure) * Turn off compare_double_and_swap_double_full PIC hack for GCC 5+ (x86) * Update README_win32 to match Makefile.msft * Use GCC atomic intrinsics for s390x (clang 8.0+ and gcc 5.4+) * Use __alignof__ instead of sizeof in atomic variable alignment assertions * Workaround assertion violation in AO_load/store on m68k == [7.6.10] 2019-03-01 == * Eliminate 'my_chunk_ptr-AO_initial_heap out of bounds' cppcheck warning * Fix 'AO_*_TS_T is not defined' compiler warnings (GCC-8) * Fix 'duplicate symbol' error for test_malloc/stack with static libs (OS X) * Workaround 'argument to function assert is always 1' cppcheck warnings == [7.6.8] 2018-12-11 == * Eliminate 'casting signed to bigger unsigned int' CSA warning (test_stack) * Eliminate 'redundant blank line at start/end of block' CodeFactor warning * Fix 'Cannot implement CAS_full on this architecture' build error (nios2) * Fix a typo in arm_v6.h * Support aarch64-ilp32 (GCC) and UWP/arm64 (MS VC) targets * Undefine AO_ARM_HAVE_* private macros after their usage * Use standalone private macro to guard against AO_GCC_BARRIER redefinition * Workaround 'condition my_chunk_ptr is always false' cppcheck false positive == [7.6.6] 2018-08-07 == * COPYING: sync with FSF's gpl-2.0.txt * Fix 'undefined reference to __atomic_load/store/cas_16' error (gcc-7/x64) * Fix a typo in the overview section of README * Fix comments style in configure.ac and Makefile.am * Update copyright information in README and some header files == [7.6.4] 2018-03-27 == * Add RISC-V support * Convert atomic_ops_malloc.c and tests to valid C++ code * Eliminate 'function is never used' cppcheck warning for load_before_cas * Eliminate 'using argument that points at uninitialized var' cppcheck error * Fix 'AO_pt_lock undefined' error if cross-compiling manually (MinGW) * Fix public headers inclusion from clients C++ code * Remove gcc/nios2.h file (include gcc/generic.h directly for nios2) * Support MIPS rel6 == [7.6.2] 2017-12-24 == * Allow to alter DEFAULT/MAX_NTHREADS values in test_malloc/stack * Allow to select almost-non-blocking stack implementation explicitly * Annotate AO_malloc with 'alloc_size' and 'malloc' attributes * Avoid misleading 'AO_t undefined' error if wrong atomic_ops.h included * Define AO_TS_SET to 1 (true) if GCC atomic_test_and_set is used * Disable workaround in stack_pop_acquire that was needed for ancient Clang * Do not define AO_GCC_FORCE_HAVE_CAS for Clang 3.8+ (Aarch64) * Do not disallow to define double_load using built-in atomics (Aarch64) * Do not expose AO_GCC_FORCE_HAVE_CAS macro to client code (GCC) * Do not install documentation if configure --disable-docs (new option) * Do not produce .tar.bz2 distribution file (configure) * Eliminate '-pedantic is not an option that controls warnings' GCC message * Eliminate data race in cons() of test_malloc * Eliminate GCC-5 ASan global-buffer-overflow false positive for AO_stack_bl * Fill in allocated memory with values depending on thread id (test_malloc) * Fix 'bad register name %sil' assembler error (GCC-4.4/x86) * Fix 'unknown attribute no_sanitize' compiler warning for GCC * Fix AO_malloc for sizes near CHUNK_SIZE * Fix memory leak in test_malloc * Fix test failures for Clang-3.8 and older (Aarch64) * Fix test_stack failure if AO_PREFER_BUILTIN_ATOMICS (GCC/Aarch64) * Fix typo in AO_REAL_NEXT_PTR comment * Increase the default number of threads to 16 in test_malloc/stack * Mark unallocated/freed memory as inaccessible using ASan functionality * New macro (DONT_USE_MMAP) to support testing as if mmap() is unavailable * New macro to select stack implementation based on CAS-double * Place no_sanitize attributes in a GCC-compliant way * Prevent too long run of test_atomic_generalized (especially with TSan) * Simplify '#if' expressions in gcc/x86.h (code refactoring) * Test smallest allocation of large type (test_malloc) * Use __builtin_expect in atomic_ops_malloc * Use built-in atomics for load/store/CAS for Clang by default (Aarch64) * Use double-word atomic intrinsics for recent Clang versions (gcc/x86.h) * Use GCC atomic intrinsics for Hexagon (clang 3.9+) * Use generalized double-wide load/store if AO_PREFER_GENERALIZED (Aarch64) * Workaround 'unused result' code defects in atomic_ops.c, list_atomic * Workaround Thread Sanitizer (TSan) false positive warnings Also, includes 7.4.8 changes == [7.6.0] 2017-05-19 == * Add *_and/or/xor* and *_[fetch_]compare_and_swap* tests to test_atomic * Add asm-based and/or/xor implementation for char/short/int (gcc/x86) * Add asm-based char/short/int CAS implementation for gcc/x86[_64] * Add configure '--disable-atomic-intrinsics' option * Add dd_acquire_read case to test_atomic * Add initial nios2 architecture support * Add Makefile target (check-nolink) to compile all source without linking * Add Makefile target to run all tests without test-driver * Add test_atomic_generalized to Makefile and Makefile.msft * Allow alternate CC (CROSS_CC) for AC_TRY_COMPILE (configure) * Always define word-wide CAS for x86 (MS VC++ 8+) * Avoid atomic_compare_exchange_n if no __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n * Avoid extra nop_full in stack_pop_acquire if atomic intrinsics used (x86) * Basic support of TILE-Gx and TILEPro CPUs * Code refactoring of int-wide primitives in gcc/x86.h * Define AO_TS_SET as __GCC_ATOMIC_TEST_AND_SET_TRUEVAL if applicable * Define CLANG/GNUC_PREREQ macros to check gcc/clang minimum version * Do not define print_list() unless used (tests) * Eliminate 'condition sizeof(long)>4 is always true' cppcheck style warning * Eliminate 'ISO C90 does not support long long' compiler pedantic warning * Eliminate 'scope of variable can be reduced' cppcheck warnings * Eliminate redundant lwsync 2nd call in CAS_full on fail (gcc/PowerPC) * Fix 'unknown attribute no_sanitize' compiler warning (clang prior to v3.8) * Fix 'variable new value is never used' cppcheck style warning * Fix missing double_compare_and_swap_dd_acquire_read * Fix reporting about missing and/or/xor_dd_acquire_read (test_atomic) * Hide AO_locks symbol * Implement AO_CLEAR using atomic intrinsic (GCC) * Implement CAS_acquire/release/full using __atomic_compare_exchange_n (gcc) * Implement char and/or/xor and short CAS for msftc ARM and X86[_64] * Implement char CAS and char/short add for msftc X86[_64] (VS 2013+) * Implement compiler_barrier using __atomic_signal_fence (GCC) * Implement int CAS/inc/dec for msftc/x86_64 * Implement short inc/dec directly for msftc ARM and X86[_64] * Initial ibmc/powerpc (xlc) support * New configure option (--enable-werror) to treat warnings as compiler errors * New macro AO_PREFER_BUILTIN_ATOMICS to rely on GCC atomics fully (AArch64) * Refine AO_nop_write comment for ARM big.LITTLE architecture * Refine configure messages when checking for compiler options * Refine documentation about _full memory ordering suffix * Refine README how to build the library source from the repository * Relax shareability domain for dmb st in AO_nop_write (ARM/AArch64) * Remove redundant include windows.h from headers (msftc/x86[_64]) * Remove spaces at EOLn in asm code * Report gcc/clang pedantic warnings (configure) * Support NaCl/arm * Suppress 'ISO C does not support __int128 type' GCC/Clang pedantic warning * Test store/CAS emulation explicitly * Update shared libraries version info to 2:0:1 * Use GCC atomic intrinsics for PowerPC 32/64 (GCC 4.8+ and clang 3.8+) * Use GCC atomic intrinsics for x86, x64, ARM, MIPS (gcc 4.9+, clang 3.5+) * Use generalized double-wide load/store if AO_PREFER_GENERALIZED (gcc/x86) * Workaround '#error' cppcheck error messages * Workaround 'condition always true', 'unused stored value' cppcheck warnings * Workaround 'function is never used' cppcheck style warnings * Workaround 'obsolescent ftime called' cppcheck style warning (POSIX) * Workaround 'overflow in pointer subtraction' cppcheck warning * Workaround 'shifting 32-bit value by 32 bits undefined' cppcheck warning * Workaround 'uninitialized memory use' code analyzer false warning (tests) * Workaround 'uninitialized variable' cppcheck error in hpc/hppa.h * Workaround 'value of macro is unknown' cppcheck information messages * Workaround a bug in double-wide intrinsics of Clang/x64 with ASan enabled * Workaround MSan warning about uninitialized data read by generalized store Also, includes 7.4.6 changes == [7.4.20] 2023-12-15 == * Eliminate 'comparing signed/unsigned values' lcc warning in add_chunk_as * Fix get_chunk for case of mmap area is located before AO_initial_heap * Fix typo in AO_HAVE_compare_and_swap_double name in atomic_ops_stack.h * Fix typos in comments of atomic_ops_malloc.c and atomic_ops_stack.c/h == [7.4.18] 2022-08-25 == * Avoid AO_stack_t to cross CPU cache line boundary * Do not assume 'ordered except earlier write' for UWP/arm64 * Ensure result of AO_test_and_set is always AO_TS_CLEAR or AO_TS_SET * Fix 'use of undeclared SIG_BLOCK' Clang error if -std=c89 on Cygwin * Fix a typo in comment of AO_stack_push_explicit_aux_release * Fix code indentation in main of test_stack.c * Remove outdated comment about unsupported Win64 in atomic_ops_stack.h * Repeat black list check on CAS fail in stack_push_explicit_aux_release == [7.4.16] 2021-09-13 == * Fix gcc/sunc x86 AO_compare_double_and_swap_double missing side effect * Fix library name in README_details * Fix size of local variable passed to cas[x] (gcc/sparc) * Workaround assertion violation in AO_load/store on m68k == [7.4.14] 2019-03-01 == * Fix 'AO_*_TS_T is not defined' compiler warnings (GCC-8) == [7.4.12] 2018-12-11 == * COPYING: sync with FSF's gpl-2.0.txt * Fix a typo in arm_v6.h * Fix a typo in the overview section of README * Support ILP32 in AArch64 assembly routines (GCC) * Support UWP/arm64 target == [7.4.10] 2017-12-22 == * Fix AO_malloc for sizes near CHUNK_SIZE * Fix memory leak in test_malloc * Fix typo in AO_REAL_NEXT_PTR comment == [7.4.8] 2017-10-18 == * Fix 'missing select.h', 'undefined sigprocmask' compiler errors (Hexagon) * Update README about bugs reporting and new releases notification * Workaround misspelling in GCC to detect ARMv6KZ platform == [7.4.6] 2017-05-18 == * Add assertion that double-wide CAS target is aligned (msftc/x86[_64]) * Add configure --enable-gcov option (enable code coverage analysis) * Code refactoring of gcc/powerpc.h to avoid code duplication * Eliminate 'cast to long from void*' compiler warning in test_atomic * Eliminate 'implicit declaration of close' warning in 'strict ANSI' mode * Eliminate 'missing braces around initializer' gcc warning (hppa) * Eliminate 'printf format specifies type void*' GCC pedantic warnings * Eliminate 'value shift followed by expansion' false code defect warning * Enable limited testing in Makefile.msft without Cygwin * Fix (delete) comment for AO_and_full (x86) * Fix block_all_signals compilation in 'strict ANSI' mode * Fix missing .exe for test filenames in Makefile (MinGW) * Fix missing printed value names (test_stack) * Implement fetch-CAS for s390[x] (gcc) * Move libraries version info to the beginning of Makefile.am * Refine documentation in Makefile.msft how to run all tests (MS VC) * Refine README about library downloading * Rename doc/README.txt to doc/README_details.txt * Support AIX/ppc (gcc) * Support CFLAGS_EXTRA to pass extra user-defined compiler flags (make) * Support n32 ABI for mips64 * Update shared libraries version info for 7.4.6+ (to 1:4:0) * Use 'inline code' format for commands in README.md * Use LLD and SCD instructions on mips64 * Workaround 'resource leak' false positives in AO_malloc, add_elements * Workaround 'uninitialized memory use' MemorySanitizer warning (test_atomic) Also, includes 7.2h changes == [7.4.4] 2016-05-24 == * Eliminate 'signed-to-unsigned value extension' compiler warning in malloc * Eliminate 'variable set but not used' Cppcheck warnings in test_stack * Fix GCC 5.x compatibility for AArch64 double-wide primitives * Fix makefile preventing AO_pause undefined in libatomic_ops_gpl * Fix missing casts to match printf format specifier in test_atomic * Fix missing output folder on making auto-generated test files (Automake) * Fix typo in configure.ac (in description of AO_ASM_X64_AVAILABLE) * Minor fix of code alignment in mips AO_compare_and_swap * Remove TODO file * Restore contribution info in ChangeLog for authors not listed in git log Also, includes 7.2g changes == [7.4.2] 2014-05-02 == * Fix a typo in doc/README.txt (remove redundant "an" article) * Update emails/links due to project site transition Also, includes 7.2f changes == [7.4.0] 2013-11-17 == * Add and/or/xor entries to list_atomic (tests) * Add char/short/int/AO_double_t and dd_acquire cases to list_atomic (tests) * Add compile-time assertion for size of 'standard' AO_double_t * Add double_store pthread-based implementation and tests * Add generalized CAS primitives of char/short/int size * Add generalized atomic and/or/xor operations for char/short/int types * Add generalized fetch_and_add_acquire/release (for ARMv6+) * Add generic implementation of double_load primitives * Add information about AO_ASSUME_VISTA to README_win32 * Add internal header containing only char/short/int/AO_t atomic loads * Add load/store primitives generalization based on CAS * Add lock-based implementation of char/short/int_fetch_compare_and_swap * Add makefile rule to test list_atomic.template syntax (tests) * Add missing 'const' in aligned-atomic XSIZE_load implementation * Add missing double_compare_and_swap to generalization * Add missing generalization of no-barrier CAS in template * Add negative double-CAS test cases to test_atomic_include (tests) * Add test_stack to Makefile.msft (tests) * Adjust fprintf arguments type matching specifier in test_stack (tests) * Adjust included filenames in atomic_ops_malloc and test_stack * Adjust quotes in echo command of Makefile.msft (Win32) * Always use 'mfence' for nop_full if target CPU supports SSE2 (gcc/x86) * Better document configure THREADDLLIBS variable * Cast away volatile on dereference in CAS-based generalization primitives * Change policy regarding version numbers ("micro" part instead of "alpha") * Convert README to Markdown format * Define AO_NO_PTHREADS in configure if no pthreads (Win32 and VxWorks) * Define AO_int_X operations for ARM and avr32 * Define double-wide ordered loads/stores for x86 * Define int_and/or/xor primitives in ao_t_is_int header * Define nop_full as compiler barrier for pre-ARMv6 single-core case * Do not duplicate BUILT_SOURCES entries in nobase_private_HEADERS (Makefile) * Do not include standard_ao_double_t.h where double-CAS is unimplemented * Do not report absence of meaningless nop, load and store in test_atomic * Do not use deprecated AO_T and AO_TS_T (tests) * Eliminate 'missing initializer' warning for AO_stack_t value initializer * Eliminate 64-bit compiler warnings in atomic_ops_malloc * Eliminate arithmetic shifts in double-CAS (gcc/arm, msftc/x86) * Eliminate warning for fetch_and_add argument in test_atomic_include (tests) * Enable Makefile.msft for Win64 * Enable build using toolchain without pthreads * Enable double_compare_and_swap for non-cpp code (msftc/x86.h) * Enable generalization of all variants of CAS via fetch_compare_and_swap * Enable test_stack for pthreads-w32 and Win32 with native threads * Fix generalized AO_char/short_compare_and_swap args (missing 'unsigned') * Fix makefile sed rule for list_atomic (tests) * Fix missing abort() usage in atomic_ops_malloc and tests on WinCE * Generalize compare_double_and_swap_double using double_compare_and_swap * Generalize double_load/store for x86_64 (GCC) * Generate ao_t_is_int, 'loadstore' headers from templates * Generate generalized AO_t load/store/fetch_and_add primitives from template * Generate ordered_loads/stores_only headers from templates * Group all X_acquire_release_volatile.h and X_[aligned_]atomic_load_store.h * Implement and/or/xor, AO_double_load for ARM * Implement atomic store using direct write by default on ARMv6+ * Implement char/short/int-wide primitives using GCC built-in atomic/sync * Implement char/short/int_fetch_and_add for msftc/x86[_64] (Win32) * Implement char/short_fetch_and_add, char/short_load for ARMv6+ (GCC) * Implement char/short_store primitives at aligned addresses for ARM * Implement compare_double_and_swap_double for SunCC/x86 * Implement double_load/store based on guaranteed x86 access atomicity * Implement double_store for ARMv7 using LDREXD/STREXD * Implement load/store via simple LDR/STR for ARMv6+ (msftc) * Implement nop_full/write using 'dmb' instruction if available (gcc/arm) * Improve debug printing in test_stack (tests) * Log messages to stdout instead of stderr (tests) * Make AO_ASSUME_VISTA also enables Win98 code in msftc/x86.h (Win32) * Minimize gcc/generic-arithm template by factoring out barriers * Move 'unsigned' keyword to XCTYPE in generalize-small template * Move default compiler options to CFLAGS in Makefile.msft (Win32) * Move definitions of ordered loads/stores to inner separate headers * Move gcc-generic AO_t-wide primitives to generic-small/arithm headers * Move generalized arithmetical primitives to 'generalize-arithm' template * Optimize AO_spin manually to minimize compiler influence on its duration * Parameterize list_atomic template with XSIZE (tests) * Perform only few list reversals in test_malloc if AO based on pthreads * Put autogen.sh to 'dist' package (Automake) * Remote duplicate definition of test_and_set_acquire in generalize.h * Remove X_aligned_atomic_load_store headers and template * Remove duplicate AO_spin and AO_pause definition in atomic_ops_stack * Remove gcc/x86_64.h eliminating code duplication of gcc/x86.h * Remove nested AO_USE_PTHREAD_DEFS macro check in atomic_ops.h (gcc/arm) * Remove redundant 'cc' clobber for LDREXD instruction (gcc/arm) * Remove store_full from msftc/arm.h in favor of generalized primitive * Remove sunc/x86_64.h eliminating code duplication of sunc/x86.h * Remove unsafe emulation-based implementation of double CAS (SunCC/x86_64) * Remove useless 'perror' call in run_parallel.h (tests) * Reorder AO_double_t union elements for AO_DOUBLE_T_INITIALIZER portability * Replace atomic_load_store.template with atomic_load and atomic_store ones * Replace some FIXME items with TODO in atomic_ops.c and sysdeps headers * Specify fetch_and_add/sub1 result as unused in test_atomic (tests) * Support AArch64 (64-bit ARM) target (GCC) * Support ARMv8 target (gcc/arm) * Test double_compare_and_swap in test_atomic (tests) * Use AO_ prefix for internal functions in arm_v6.h, hppa.h * Use __atomic GCC built-in to implement generic double-wide CAS * Use built-in __sync CAS for double-CAS if AO_USE_SYNC_CAS_BUILTIN for x86 * Workaround GCC 4.4.3 warning reported for 'val' of list_atomic.c (tests) Also, includes 7.2e changes == [7.3alpha2] 2012-05-11 == * Add '-no-undefined' to LDFLAGS in src/Makefile.am * Add AO_and, AO_xor atomic operations * Add AO_fetch_compare_and_swap primitives * Add and fill in AUTHORS, TODO files * Add autogen.sh file * Adjust AO_..._H macros in public headers * Code refactoring of gcc/arm.h by introducing AO_ARM_HAVE_x macros * Define AO macros for libatomic_ops version identification * Do not define NDEBUG if '--enable-assertions' passed to configure * Eliminate compiler warnings in various functions and macros * Generalize AO_compare_and_swap primitives via AO_fetch_compare_and_swap * Generalize acquire/release/full CAS primitives for MIPS * Implement fetch_and_add, test_and_set primitives for MIPS * Improve Makefile for MS VC++; pass '-W3' option to MS compiler * Include ao_t_is_int.h from atomic_ops.h after first generalization pass * Merge all Makefile.am files in src tree * Minor code refactoring of atomic_ops.c, generic_pthread.h * Minor configure build improvements (e.g., ensure proper autoconf version) * Place only major per-release changes description to ChangeLog (this file) * Recognize AO_PREFER_GENERALIZED macro to favor generalization over assembly * Remove all auto-generated files except for generalize-small.h from the repo * Remove duplicate doc/COPYING and empty NEWS files * Replace atomic_ops_malloc static mmap-related empty functions with macros * Replace pointer relational comparisons with non-pointer ones * Require autoconf 2.61 instead of v2.64 * Show extra compiler warnings (GCC only) * Turn off AO primitives inlining if AO_NO_INLINE defined * Use __builtin_expect in CAS failure loop condition checks (GCC only) Also, includes 7.2 changes == [7.2l] 2023-12-15 == * Fix get_chunk for case of mmap area is located before AO_initial_heap * Fix typo in AO_HAVE_compare_and_swap_double name in atomic_ops_stack.h * Fix typos in comments of atomic_ops_malloc.c and atomic_ops_stack.c/h == [7.2k] 2022-08-24 == * Avoid AO_stack_t to cross CPU cache line boundary * Fix a typo in comment of AO_stack_push_explicit_aux_release * Fix code indentation in main of test_stack.c * Remove outdated comment about unsupported Win64 in atomic_ops_stack.h * Repeat black list check on CAS fail in stack_push_explicit_aux_release == [7.2j] 2021-09-12 == * Fix a typo in arm_v6.h * Fix asm constraints of primitives in sunc/x86_64.h * Fix gcc/sunc x86 AO_compare_double_and_swap_double missing side effect * Fix library name in README details * Fix size of local variable passed to cas[x] (gcc/sparc) * Workaround assertion violation in AO_load/store on m68k == [7.2i] 2017-12-21 == * Fix 'missing select.h', 'undefined sigprocmask' compiler errors (Hexagon) * Fix AO_malloc for sizes near CHUNK_SIZE * Fix typo in AO_REAL_NEXT_PTR comment == [7.2h] 2017-05-17 == * Add 'clean' target to Makefile.msft * Enable Makefile.msft for Win64 * Exclude 'check' from nmake all (Makefile.msft) * Fix 'Cannot implement CAS_full on this architecture' build error (cris) * Fix 'doc' files installation folder * Fix (improve) AO_REQUIRE_CAS description in README * Fix AO_SIZE_MAX definition (Linux/musl-gcc) * Fix assertions style in test_atomic_include * Fix size value wrap around in AO_malloc_large * Fix test_atomic failure caused unaligned AO_double_t access (x86) * Fix type of general AO_TS_INITIALIZER * Fix typo in comments in gcc/arm.h * Fix typos in 'error' pragma messages * Workaround test_stack failure on AIX/ppc == [7.2g] 2016-05-23 == * Add disclaimer to README to favor C11/C++14 atomics over libatomic_ops use * Regenerate configure files using official libtool release (v2.4.2) * Remove inclusion of acquire_release_volatile.h on MIPS * Remove obsolete information from README about C++0x standard future * Update links due to project site transition == [7.2f] 2014-05-02 == * Fix a typo in doc/README.txt (remove redundant "an" article) * Regenerate configure files by new automake (v1.14.1), libtool (v2.4.2.418) == [7.2e] 2013-11-10 == * Fix (remove) invalid include of read_ordered.h for ARM * Fix AM_CONFIG_HEADER in configure for autoconf-2.69-1 * Fix AO_pause sleep delay for particular argument values (Win32) * Fix ARMv7 LDREXD/STREXD double-wide operand specification (GCC/Clang) * Fix LDREXD/STREXD use for pre-Clang3.3/arm * Fix README regarding _acquire_read barrier * Fix XSIZE_load/store definition order in generalize-small template * Fix asm constraint of CAS memory operand for gcc/alpha, clang-3.1/mips * Fix asm constraints of primitives in sunc/x86.h * Fix cmpxchg16b-based compare_double_and_swap_double for SunCC/x86_64 * Fix compare_double_and_swap_double and double_ptr_storage for gcc/x32 * Fix compare_double_and_swap_double for clang3.0/x86 in PIC mode * Fix compare_double_and_swap_double_full definition condition in emul_cas * Fix generalize-small template adding missed CAS-based fetch_and_add * Fix generalized fetch_and_add function * Fix missing compiler barrier in nop_full for uniprocessor ARM * Fix ordered_except_wr header inclusion for s390 * Fix return type of AO_int_X primitives defined in ao_t_is_int header * Fix return type of char/short/int_load_read() in read_ordered.h * Fix template-based headers regeneration order in src/Makefile * Fix typos in ao_t_is_int, atomic_ops.h, generalize.h, msftc/arm.h comments * Fix variable type to match printf format specifier in test_stack * Fix visibility and initial value of 'dummy' variable in atomic_ops_stack * Terminate tests with abort after error reported == [7.2d] 2012-08-09 == * Fix AO_compare_double_and_swap_double_full for gcc-4.2.1/x86 in PIC mode * Fix AO_compiler_barrier missing parentheses * Fix missing 'unsigned' for generalized AO_char/short_fetch_and_add result == [7.2] 2012-05-11 == * Add atomic_ops.pc.in and atomic_ops-uninstalled.pc.in to pkgconfig folder * Define and use AO_PTRDIFF_T in tests for casts between pointer and integer * Fix AO_compare_and_swap return type for s390 and PowerPC * Fix AO_compare_double_and_swap_double_full for gcc/x86 (PIC mode) * Fix AO_stack_push_release to workaround bug in clang-1.1/x86 compiler * Fix AO_test_and_setXX in tests/list_atomic.template * Fix AO_test_and_set_full (gcc/x86[_64].h) to work-around a bug in LLVM v2.7 * Fix AO_test_and_set_full on m68k * Fix __ARM_ARCH_5__ macro handling for Android NDK (ARMv7) * Fix configure for Cygwin, mingw-w64/32 * Fix configure to define __PIC__ macro explicitly if needed (GCC) * Fix double_ptr_storage definition for GCC pre-v4 (x86_64) * Fix for x32 by removing 'q' suffix in x86-64 instructions * Fix generalization for IA-64 (regarding AO_or, AO_..._read/write primitives) * Fix generalized AO__fetch_and_add() return type * Fix test_atomic_include for the case of missing CAS primitive * Fix test_malloc - allocate less memory in case of missing mmap * Implement the basic atomic primitives for the hexagon CPU == [7.2alpha6] 2011-06-14 == * Add missing AO_HAVE_ macros * Add support of avr32 CPU * Better support of various models of ARM * Disable AO_compare_double_and_swap_double_full for SunCC x86 as not working * Enable ARM Thumb-2 mode * Fix AO_test_and_set_full for SunCC (x86) * Fix bugs in tests * Fix clobbers in AO_compare_and_swap_full (x86.h) * Fix typos in identifiers and comments * Improve AO_sync for PowerPC * Improve make scripts (configure.ac) * Make get_mmaped() in atomic_ops_malloc.c more portable * Support Intel compiler * Support NaCl target * Suppress compiler warnings in various places * Test more predefined macros (ARM, PowerPC) * Use assembly code only for MS VC if available (x86_64) * Use built-in __sync_bool_compare_and_swap if available (x86_64) * Workaround bugs in LLVM GCC and SunCC regarding XCHG (x86, x86_64) == [7.2alpha4] 2009-12-02 == * Fix typos in comments, identifiers and documentation * Implement AO_compare_and_swap_full for SPARC * Refine ARM-specific code * Refine code and comments for MS VC * Regenerate make scripts * Share common code for all 32-bit CPUs (MS VC) * Support DigitalMars and Watcom compilers * Support MS VC for ARM (WinCE) * Support SH CPU * Support win32-pthreads * Support x86 and x86_64 for SunCC compiler == [7.2alpha2] 2009-05-27 == * Add MIPS support * Add better support for m68k * Add "const" to first parameter of load calls * Add parentheses around address argument for various macros * Add some platform-specific documentation to INSTALL * Add untested 64-bit support for PowerPC * Fix AO_compare_and_swap_double_acquire * Fix AO_int_fetch_and_add_full (x86_64) * Fix comments * Fix s390 include paths * Fix use of lwz instruction (PowerPC) * Refine clobbers (PowerPC) * Remove outdated info about Windows support in README * Replace K&R-style function definition with ANSI C one * add AO_compare_double_and_swap_double for ARMv6 * gcc/powerpc.h: Consider __NO_LWSYNC__ == [7.1] 2008-02-11 == * Add test_and_set, AO_double_compare_and_swap generalizations * Conditionally add compare_double_and_swap_double (x86) * Conditionally add compare_double_and_swap_double (x86) * Fix AO_compare_double_and_swap_double_full (x86) for PIC mode * Fix AO_load_acquire for PowerPC * Fix double-width CAS (x86) * Refine README (add more warnings about data dependencies) * Refine double_ptr_storage type definition * Support ARMv6+ in GCC * Support ArmCC compiler * Use _InterlockedExchangeAdd for MS VC (x86) == [7.0] 2007-06-28 == * Add 64-bit version of AO_load_acquire for PowerPC (by Luca Barbato) * Add support of x86 and x86_64 for MS VC * Do not assume that "mfence" is always present (x86.h) * Fix ARM AO_test_and_set_full * Include windows.h (MS VC) * Update README to reflect C++0x effort == [1.2] 2006-07-11 == * Add prototypes to suppress compiler warnings * Add simple VxWorks support * Fix InterlockedCompareExchange proto usage * Fix typos (ia64) * Include all_acquire_release_volatile.h and all_atomic_load_store.h (ia64) * Initial support for 64-bit targets * Use "=q" for AO_test_and_set_full (x86) * Use inline assembler to generate "mfence" and byte sized XCHG * Use new intrinsics available in MSVC 2003 and MSVC 2005 == [1.1] 2005-09-27 == * Add and use read_ordered.h * Change function naming from "byte" to "char" * Fix AO_test_and_set for ARM; define AO_CAN_EMUL_CAS == [1.0] 2005-03-21 == * Add atomic_ops primitives for different sized data * Add compare_double_and_swap_double and compare_and_swap_double * Add gcc/cris.h (originally comes from Hans-Peter Nilsson) * Add gcc/m68k.h (contributed by Tony Mantler) * Add gcc/powerpc.h (with help of Maged Michael, Doug Lea, Roger Hoover) * Add initial support for atomic_ops for VC++/Windows/X86 and HP/UX * Add minimal support for the Sun SPARC compiler * Add support for platforms that require out-of-line assembly code * Add support of int-wide operations on platforms with int-sized pointers * Added libatomic_ops_gpl library with support for lock-free stack and malloc * Change atomic_ops include file structure * Change most platforms to use byte-wide test-and-set locations * Define AO_CLEAR, __ldcw[_align] macros in gcc/hppa.h (by Carlos O'Donell) * Fix various bugs * Install under "atomic_ops" instead of "ao" * Remove compiler_barrier workaround for gcc 3.4+ * Renamed various types to end in _t * Replace AO_HAVE_NOP_FULL with AO_HAVE_nop_full (by Ranko Zivojnovic) * Use autoconf, automake asymptote-3.05/libatomic_ops/README.md0000644000000000000000000001225515031566105016276 0ustar rootroot# The atomic_ops library (`libatomic_ops`) IN NEW CODE, PLEASE USE C11 OR C++14 STANDARD ATOMICS INSTEAD OF THE CORE LIBRARY IN THIS PACKAGE. This is version 7.8.2 of libatomic_ops. License: [MIT](LICENSE) for core library / [GPL-2.0](COPYING) for gpl extension. ## Download You might find a more recent/stable version on the [Download](https://github.com/ivmai/libatomic_ops/wiki/Download) page, or [BDWGC site](http://www.hboehm.info/gc/). Also, the latest bug fixes and new features are available in the [development repository](https://github.com/ivmai/libatomic_ops). ## Overview This package provides semi-portable access to hardware-provided atomic memory update operations on a number of architectures. These might allow you to write code: * That does more interesting things in signal handlers. * Makes more effective use of multiprocessors by allowing you to write clever lock-free code. Note that such code is very difficult to get right, and will unavoidably be less portable than lock-based code. It is also not always faster than lock-based code. But it may occasionally be a large performance win. * To experiment with new and much better thread programming paradigms, etc. Please see other README files for the details: * [README_details.txt](README_details.txt) - details about atomic_ops.h * [README_malloc.txt](README_malloc.txt) - a simple almost-lock-free malloc implementation (part of libatomic_ops_gpl) * [README_stack.txt](README_stack.txt) - an almost lock-free LIFO linked lists (stack) implementation (part of libatomic_ops_gpl) ## Installation and Usage The configuration and build scripts for this package were generated by Automake/Autoconf. `./configure; make; sudo make install` in this directory should work. For a more customized build, see the output of `./configure --help`. To build it from the development repository, `./autogen.sh` should be executed first. Alternatively, CMake could be use to build this package, e.g. `cmake . && cmake --build .` in this directory should work. Note that much of the content of this library is in the header files. However, two small libraries are built and installed: * `libatomic_ops.a` is a support (core) library, which is not needed on some platforms. This is intended to be usable, under some mild restrictions, in free or proprietary code, as are all the header files. See [LICENSE](LICENSE) for more details about the licensing. * `libatomic_ops_gpl.a` is a so called gpl extension library containing some higher level facilities. This code is covered by the GPL. The contents correspond to the headers `atomic_ops_malloc.h` and `atomic_ops_stack.h`. Not built and not installed if `--disable-gpl` option is passed to `configure` (or if `-Denable_gpl=OFF` option is passed to `cmake` if the latter is used to build the package). The licensing details are given in [COPYING](COPYING) and [LICENSE](LICENSE) files. ## Platform Specific Notes Win32/64: src/Makefile.msft contains a very simple Makefile for building and running tests and building the gpl library. The core `libatomic_ops` implementation is entirely in header files (libatomic_ops.lib is built anyway to match that of the configure-based build process, but libatomic_ops.lib has only the implementation of the internal AO_pause() used by the gpl library). More information is provided in [README_win32.txt](README_win32.txt) file. HP-UX/PA-RISC: `aCC -Ae` won't work as a C compiler, since it doesn't support inline assembly code. Use cc. ## Feedback, Contribution, Questions and Notifications Please address bug reports and new feature ideas to [GitHub issues](https://github.com/ivmai/libatomic_ops/issues). Before the submission please check that it has not been done yet by someone else. If you want to contribute, submit a [pull request](https://github.com/ivmai/libatomic_ops/pulls) to GitHub. If you need help, use [Stack Overflow](https://stackoverflow.com/questions/tagged/atomic-ops). Older questions on the site can be found by [this query](https://stackoverflow.com/search?q=atomic_ops). Older technical discussions are also available in `bdwgc` mailing list archive - it can be downloaded as a [compressed file](https://github.com/ivmai/bdwgc/files/1038163/bdwgc-mailing-list-archive-2017_04.tar.gz) or browsed at [Narkive](http://bdwgc.opendylan.narkive.com) (please search for _atomic_ keyword). To get new release announcements, subscribe to [RSS feed](https://github.com/ivmai/libatomic_ops/releases.atom). (To receive the notifications by email, a 3rd-party free service like [IFTTT RSS Feed](https://ifttt.com/feed) can be setup.) To be notified on all issues, please [watch](https://github.com/ivmai/libatomic_ops/watchers) the project on GitHub. ## Copyright & Warranty, Contributors Please be aware of the dual nature of the license of libatomic_ops: * the core part (implementing semi-portable access to hardware-provided atomic memory operations) is released under MIT license * the gpl extension (almost lock-free malloc and stack implementations) and the tests are released under GPL-2.0 license The exact licensing information is provided in [LICENSE](LICENSE) file. The library contributors are listed in [AUTHORS](AUTHORS) file. asymptote-3.05/libatomic_ops/compile0000755000000000000000000001760115031566105016375 0ustar rootroot#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2025-02-03.05; # UTC # Copyright (C) 1999-2025 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file unneeded_conversions # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) UNNEEDED_CONVERSIONS, no # conversion will take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) if test -n "$MSYSTEM" && (cygpath --version) >/dev/null 2>&1; then # MSYS2 environment. file_conv=cygwin else # Original MinGW environment. file_conv=mingw fi ;; MSYS*) # Old MSYS environment, or MSYS2 with 32-bit MSYS2 shell. file_conv=cygwin ;; CYGWIN*) # Cygwin environment. file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) # This is the optimization mentioned above: # If UNNEEDED_CONVERSIONS contains $file_conv, don't convert. ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -w "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.lo | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . GNU Automake home page: . General help using GNU software: . EOF exit $? ;; -v | --v*) echo "compile (GNU Automake) $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ clang-cl | *[/\\]clang-cl | clang-cl.exe | *[/\\]clang-cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp nil t) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: asymptote-3.05/libatomic_ops/CMakeLists.txt0000644000000000000000000003735315031566105017565 0ustar rootroot# # Copyright (c) 2021-2022 Ivan Maidanski ## # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. ## cmake_minimum_required(VERSION 3.5) set(PACKAGE_VERSION 7.8.2) # Version must match that in AC_INIT of configure.ac and that in README. # Version must conform to: [0-9]+[.][0-9]+[.][0-9]+ # Info (current:revision:age) for the Libtool versioning system. # These values should match those in src/Makefile.am. set(LIBATOMIC_OPS_VER_INFO 3:0:2) set(LIBATOMIC_OPS_GPL_VER_INFO 3:1:2) project(libatomic_ops C) if (POLICY CMP0057) # Required for CheckLinkerFlag, at least. cmake_policy(SET CMP0057 NEW) endif() include(CheckCCompilerFlag) include(CheckFunctionExists) include(CMakePackageConfigHelpers) include(CTest) include(GNUInstallDirs) if (NOT (${CMAKE_VERSION} VERSION_LESS "3.18.0")) include(CheckLinkerFlag) endif() # Customize the build by passing "-D=ON|OFF" in the command line. option(BUILD_SHARED_LIBS "Build shared libraries" OFF) option(build_tests "Build tests" OFF) option(enable_assertions "Enable assertion checking" OFF) option(enable_werror "Treat warnings as errors" OFF) option(enable_atomic_intrinsics "Use GCC atomic intrinsics" ON) option(enable_docs "Build and install documentation" ON) option(enable_gpl "Build atomic_ops_gpl library" ON) option(install_headers "Install header and pkg-config metadata files" ON) # Override the default build type to RelWithDebInfo (this instructs cmake to # pass -O2 -g -DNDEBUG options to the compiler). if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build." FORCE) set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "RelWithDebInfo" "MinSizeRel") endif() # Convert VER_INFO values to [SO]VERSION ones. if (BUILD_SHARED_LIBS) # atomic_ops: string(REGEX REPLACE "(.+):.+:.+" "\\1" ao_cur ${LIBATOMIC_OPS_VER_INFO}) string(REGEX REPLACE ".+:(.+):.+" "\\1" ao_rev ${LIBATOMIC_OPS_VER_INFO}) string(REGEX REPLACE ".+:.+:(.+)$" "\\1" ao_age ${LIBATOMIC_OPS_VER_INFO}) math(EXPR AO_SOVERSION "${ao_cur} - ${ao_age}") set(AO_VERSION_PROP "${AO_SOVERSION}.${ao_age}.${ao_rev}") message(STATUS "AO_VERSION_PROP = ${AO_VERSION_PROP}") # atomic_ops_gpl: string(REGEX REPLACE "(.+):.+:.+" "\\1" ao_gpl_cur ${LIBATOMIC_OPS_GPL_VER_INFO}) string(REGEX REPLACE ".+:(.+):.+" "\\1" ao_gpl_rev ${LIBATOMIC_OPS_GPL_VER_INFO}) string(REGEX REPLACE ".+:.+:(.+)$" "\\1" ao_gpl_age ${LIBATOMIC_OPS_GPL_VER_INFO}) math(EXPR AO_GPL_SOVERSION "${ao_gpl_cur} - ${ao_gpl_age}") set(AO_GPL_VERSION_PROP "${AO_GPL_SOVERSION}.${ao_gpl_age}.${ao_gpl_rev}") message(STATUS "AO_GPL_VERSION_PROP = ${AO_GPL_VERSION_PROP}") endif(BUILD_SHARED_LIBS) # Output all warnings. if (MSVC) # All warnings but ignoring "conditional expression is constant" ones. add_compile_options(/W4 /wd4127) else() # TODO: add -[W]pedantic -Wno-long-long add_compile_options(-Wall -Wextra) endif() find_package(Threads REQUIRED) message(STATUS "Thread library: ${CMAKE_THREAD_LIBS_INIT}") include_directories(${Threads_INCLUDE_DIR}) set(THREADDLLIBS_LIST ${CMAKE_THREAD_LIBS_INIT}) if (CMAKE_USE_PTHREADS_INIT) # Required define if using POSIX threads. add_compile_options(-D_REENTRANT) else() # No pthreads library available. add_compile_options(-DAO_NO_PTHREADS) endif() if (enable_assertions) # In case NDEBUG macro is defined e.g. by cmake -DCMAKE_BUILD_TYPE=Release. add_compile_options(-UNDEBUG) else() # Define to disable assertion checking. add_compile_options(-DNDEBUG) endif() if (NOT enable_atomic_intrinsics) # Define to avoid GCC atomic intrinsics even if available. add_compile_options(-DAO_DISABLE_GCC_ATOMICS) endif() # AO API symbols export control. if (BUILD_SHARED_LIBS) add_compile_options(-DAO_DLL) endif() if (enable_werror) if (MSVC) add_compile_options(/WX) else() add_compile_options(-Werror) endif() endif(enable_werror) # Extra user-defined flags to pass to the C compiler. if (DEFINED CFLAGS_EXTRA) separate_arguments(CFLAGS_EXTRA_LIST UNIX_COMMAND "${CFLAGS_EXTRA}") add_compile_options(${CFLAGS_EXTRA_LIST}) endif() set(SRC src/atomic_ops.c) if (CMAKE_C_COMPILER_ID STREQUAL "SunPro") # SunCC compiler on SunOS (Solaris). set(SRC ${SRC} src/atomic_ops_sysdeps.S) endif() add_library(atomic_ops ${SRC}) target_link_libraries(atomic_ops PRIVATE ${THREADDLLIBS_LIST}) target_include_directories(atomic_ops PUBLIC "$" INTERFACE "$") if (enable_gpl) set(AO_GPL_SRC src/atomic_ops_malloc.c src/atomic_ops_stack.c) add_library(atomic_ops_gpl ${AO_GPL_SRC}) check_function_exists(mmap HAVE_MMAP) if (HAVE_MMAP) target_compile_definitions(atomic_ops_gpl PRIVATE HAVE_MMAP) endif() target_link_libraries(atomic_ops_gpl PRIVATE atomic_ops) target_include_directories(atomic_ops_gpl PUBLIC "$" INTERFACE "$") if (BUILD_SHARED_LIBS) set_property(TARGET atomic_ops_gpl PROPERTY VERSION ${AO_GPL_VERSION_PROP}) set_property(TARGET atomic_ops_gpl PROPERTY SOVERSION ${AO_GPL_SOVERSION}) endif() install(TARGETS atomic_ops_gpl EXPORT Atomic_opsTargets LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") endif(enable_gpl) if (BUILD_SHARED_LIBS) if (NOT (${CMAKE_SYSTEM_NAME} MATCHES "BSD")) if (${CMAKE_VERSION} VERSION_LESS "3.18.0") set(WL_NO_UNDEFINED_OPT "-Wl,--no-undefined") check_c_compiler_flag(${WL_NO_UNDEFINED_OPT} HAVE_FLAG_WL_NO_UNDEFINED) else() set(WL_NO_UNDEFINED_OPT "LINKER:--no-undefined") check_linker_flag(C "${WL_NO_UNDEFINED_OPT}" HAVE_FLAG_WL_NO_UNDEFINED) endif() if (HAVE_FLAG_WL_NO_UNDEFINED) # Declare that the libraries do not refer to external symbols. if (${CMAKE_VERSION} VERSION_LESS "3.13.0") target_link_libraries(atomic_ops PRIVATE ${WL_NO_UNDEFINED_OPT}) if (enable_gpl) target_link_libraries(atomic_ops_gpl PRIVATE ${WL_NO_UNDEFINED_OPT}) endif(enable_gpl) else() target_link_options(atomic_ops PRIVATE ${WL_NO_UNDEFINED_OPT}) if (enable_gpl) target_link_options(atomic_ops_gpl PRIVATE ${WL_NO_UNDEFINED_OPT}) endif(enable_gpl) endif() endif(HAVE_FLAG_WL_NO_UNDEFINED) endif() set_property(TARGET atomic_ops PROPERTY VERSION ${AO_VERSION_PROP}) set_property(TARGET atomic_ops PROPERTY SOVERSION ${AO_SOVERSION}) endif(BUILD_SHARED_LIBS) install(TARGETS atomic_ops EXPORT Atomic_opsTargets LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") if (install_headers) install(FILES src/atomic_ops.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") if (enable_gpl) install(FILES src/atomic_ops_malloc.h src/atomic_ops_stack.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") endif() install(FILES src/atomic_ops/ao_version.h src/atomic_ops/generalize-arithm.h src/atomic_ops/generalize-small.h src/atomic_ops/generalize.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops") install(FILES src/atomic_ops/sysdeps/all_acquire_release_volatile.h src/atomic_ops/sysdeps/all_aligned_atomic_load_store.h src/atomic_ops/sysdeps/all_atomic_load_store.h src/atomic_ops/sysdeps/all_atomic_only_load.h src/atomic_ops/sysdeps/ao_t_is_int.h src/atomic_ops/sysdeps/emul_cas.h src/atomic_ops/sysdeps/generic_pthread.h src/atomic_ops/sysdeps/ordered.h src/atomic_ops/sysdeps/ordered_except_wr.h src/atomic_ops/sysdeps/read_ordered.h src/atomic_ops/sysdeps/standard_ao_double_t.h src/atomic_ops/sysdeps/test_and_set_t_is_ao_t.h src/atomic_ops/sysdeps/test_and_set_t_is_char.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps") install(FILES src/atomic_ops/sysdeps/armcc/arm_v6.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/armcc") install(FILES src/atomic_ops/sysdeps/gcc/aarch64.h src/atomic_ops/sysdeps/gcc/alpha.h src/atomic_ops/sysdeps/gcc/arm.h src/atomic_ops/sysdeps/gcc/avr32.h src/atomic_ops/sysdeps/gcc/cris.h src/atomic_ops/sysdeps/gcc/e2k.h src/atomic_ops/sysdeps/gcc/generic-arithm.h src/atomic_ops/sysdeps/gcc/generic-small.h src/atomic_ops/sysdeps/gcc/generic.h src/atomic_ops/sysdeps/gcc/hexagon.h src/atomic_ops/sysdeps/gcc/hppa.h src/atomic_ops/sysdeps/gcc/ia64.h src/atomic_ops/sysdeps/gcc/m68k.h src/atomic_ops/sysdeps/gcc/mips.h src/atomic_ops/sysdeps/gcc/powerpc.h src/atomic_ops/sysdeps/gcc/riscv.h src/atomic_ops/sysdeps/gcc/s390.h src/atomic_ops/sysdeps/gcc/sh.h src/atomic_ops/sysdeps/gcc/sparc.h src/atomic_ops/sysdeps/gcc/tile.h src/atomic_ops/sysdeps/gcc/x86.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/gcc") install(FILES src/atomic_ops/sysdeps/hpc/hppa.h src/atomic_ops/sysdeps/hpc/ia64.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/hpc") install(FILES src/atomic_ops/sysdeps/ibmc/powerpc.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/ibmc") install(FILES src/atomic_ops/sysdeps/icc/ia64.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/icc") install(FILES src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.h src/atomic_ops/sysdeps/loadstore/atomic_load.h src/atomic_ops/sysdeps/loadstore/atomic_store.h src/atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h src/atomic_ops/sysdeps/loadstore/char_atomic_load.h src/atomic_ops/sysdeps/loadstore/char_atomic_store.h src/atomic_ops/sysdeps/loadstore/double_atomic_load_store.h src/atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h src/atomic_ops/sysdeps/loadstore/int_atomic_load.h src/atomic_ops/sysdeps/loadstore/int_atomic_store.h src/atomic_ops/sysdeps/loadstore/ordered_loads_only.h src/atomic_ops/sysdeps/loadstore/ordered_stores_only.h src/atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h src/atomic_ops/sysdeps/loadstore/short_atomic_load.h src/atomic_ops/sysdeps/loadstore/short_atomic_store.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/loadstore") install(FILES src/atomic_ops/sysdeps/msftc/arm.h src/atomic_ops/sysdeps/msftc/arm64.h src/atomic_ops/sysdeps/msftc/common32_defs.h src/atomic_ops/sysdeps/msftc/x86.h src/atomic_ops/sysdeps/msftc/x86_64.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/msftc") install(FILES src/atomic_ops/sysdeps/sunc/sparc.h src/atomic_ops/sysdeps/sunc/x86.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/sunc") # Provide pkg-config metadata. set(prefix "${CMAKE_INSTALL_PREFIX}") set(exec_prefix \${prefix}) set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}") set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}") string(REPLACE ";" " " THREADDLLIBS "${THREADDLLIBS_LIST}") # PACKAGE_VERSION is defined above. configure_file(pkgconfig/atomic_ops.pc.in pkgconfig/atomic_ops.pc @ONLY) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/atomic_ops.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") # TODO: handle atomic_ops-uninstalled.pc.in endif(install_headers) if (build_tests) add_executable(test_atomic tests/test_atomic.c) target_link_libraries(test_atomic PRIVATE atomic_ops ${THREADDLLIBS_LIST}) add_test(NAME test_atomic COMMAND test_atomic) add_executable(test_atomic_generalized tests/test_atomic.c) target_compile_definitions(test_atomic_generalized PRIVATE AO_PREFER_GENERALIZED AO_TEST_EMULATION) target_link_libraries(test_atomic_generalized PRIVATE atomic_ops ${THREADDLLIBS_LIST}) add_test(NAME test_atomic_generalized COMMAND test_atomic_generalized) if (CMAKE_USE_PTHREADS_INIT) add_executable(test_atomic_pthreads tests/test_atomic.c) target_compile_definitions(test_atomic_pthreads PRIVATE AO_USE_PTHREAD_DEFS) target_link_libraries(test_atomic_pthreads PRIVATE atomic_ops ${THREADDLLIBS_LIST}) add_test(NAME test_atomic_pthreads COMMAND test_atomic_pthreads) endif() if (enable_gpl) add_executable(test_stack tests/test_stack.c) target_link_libraries(test_stack PRIVATE atomic_ops atomic_ops_gpl ${THREADDLLIBS_LIST}) add_test(NAME test_stack COMMAND test_stack) add_executable(test_malloc tests/test_malloc.c) target_link_libraries(test_malloc PRIVATE atomic_ops atomic_ops_gpl ${THREADDLLIBS_LIST}) add_test(NAME test_malloc COMMAND test_malloc) endif() endif(build_tests) if (enable_docs) install(FILES AUTHORS ChangeLog LICENSE README.md README_details.txt README_win32.txt DESTINATION "${CMAKE_INSTALL_DOCDIR}") if (enable_gpl) install(FILES COPYING README_malloc.txt README_stack.txt DESTINATION "${CMAKE_INSTALL_DOCDIR}") endif() endif(enable_docs) # CMake config/targets files. install(EXPORT Atomic_opsTargets FILE Atomic_opsTargets.cmake NAMESPACE Atomic_ops:: DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/atomic_ops") configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/Atomic_opsConfig.cmake" INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/atomic_ops" NO_SET_AND_CHECK_MACRO) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/Atomic_opsConfigVersion.cmake" VERSION "${PACKAGE_VERSION}" COMPATIBILITY AnyNewerVersion) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/Atomic_opsConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/Atomic_opsConfigVersion.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/atomic_ops") export(EXPORT Atomic_opsTargets FILE "${CMAKE_CURRENT_BINARY_DIR}/Atomic_opsTargets.cmake") asymptote-3.05/libatomic_ops/config.sub0000755000000000000000000011544115031566105017003 0ustar rootroot#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2024 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268,SC2162 # see below for rationale timestamp='2024-05-27' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Split fields of configuration type saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 basic_os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in cloudabi*-eabi* \ | kfreebsd*-gnu* \ | knetbsd*-gnu* \ | kopensolaris*-gnu* \ | linux-* \ | managarm-* \ | netbsd*-eabi* \ | netbsd*-gnu* \ | nto-qnx* \ | os2-emx* \ | rtmk-nova* \ | storm-chaos* \ | uclinux-gnu* \ | uclinux-uclibc* \ | windows-* ) basic_machine=$field1 basic_os=$maybe_os ;; android-linux) basic_machine=$field1-unknown basic_os=linux-android ;; *) basic_machine=$field1-$field2 basic_os=$field3 ;; esac ;; *-*) case $field1-$field2 in # Shorthands that happen to contain a single dash convex-c[12] | convex-c3[248]) basic_machine=$field2-convex basic_os= ;; decstation-3100) basic_machine=mips-dec basic_os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Do not treat sunos as a manufacturer sun*os*) basic_machine=$field1 basic_os=$field2 ;; # Manufacturers 3100* \ | 32* \ | 3300* \ | 3600* \ | 7300* \ | acorn \ | altos* \ | apollo \ | apple \ | atari \ | att* \ | axis \ | be \ | bull \ | cbm \ | ccur \ | cisco \ | commodore \ | convergent* \ | convex* \ | cray \ | crds \ | dec* \ | delta* \ | dg \ | digital \ | dolphin \ | encore* \ | gould \ | harris \ | highlevel \ | hitachi* \ | hp \ | ibm* \ | intergraph \ | isi* \ | knuth \ | masscomp \ | microblaze* \ | mips* \ | motorola* \ | ncr* \ | news \ | next \ | ns \ | oki \ | omron* \ | pc533* \ | rebel \ | rom68k \ | rombug \ | semi \ | sequent* \ | siemens \ | sgi* \ | siemens \ | sim \ | sni \ | sony* \ | stratus \ | sun \ | sun[234]* \ | tektronix \ | tti* \ | ultra \ | unicom* \ | wec \ | winbond \ | wrs) basic_machine=$field1-$field2 basic_os= ;; zephyr*) basic_machine=$field1-unknown basic_os=$field2 ;; *) basic_machine=$field1 basic_os=$field2 ;; esac ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc basic_os=bsd ;; a29khif) basic_machine=a29k-amd basic_os=udi ;; adobe68k) basic_machine=m68010-adobe basic_os=scout ;; alliant) basic_machine=fx80-alliant basic_os= ;; altos | altos3068) basic_machine=m68k-altos basic_os= ;; am29k) basic_machine=a29k-none basic_os=bsd ;; amdahl) basic_machine=580-amdahl basic_os=sysv ;; amiga) basic_machine=m68k-unknown basic_os= ;; amigaos | amigados) basic_machine=m68k-unknown basic_os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown basic_os=sysv4 ;; apollo68) basic_machine=m68k-apollo basic_os=sysv ;; apollo68bsd) basic_machine=m68k-apollo basic_os=bsd ;; aros) basic_machine=i386-pc basic_os=aros ;; aux) basic_machine=m68k-apple basic_os=aux ;; balance) basic_machine=ns32k-sequent basic_os=dynix ;; blackfin) basic_machine=bfin-unknown basic_os=linux ;; cegcc) basic_machine=arm-unknown basic_os=cegcc ;; cray) basic_machine=j90-cray basic_os=unicos ;; crds | unos) basic_machine=m68k-crds basic_os= ;; da30) basic_machine=m68k-da30 basic_os= ;; decstation | pmax | pmin | dec3100 | decstatn) basic_machine=mips-dec basic_os= ;; delta88) basic_machine=m88k-motorola basic_os=sysv3 ;; dicos) basic_machine=i686-pc basic_os=dicos ;; djgpp) basic_machine=i586-pc basic_os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd basic_os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson basic_os=ose ;; gmicro) basic_machine=tron-gmicro basic_os=sysv ;; go32) basic_machine=i386-pc basic_os=go32 ;; h8300hms) basic_machine=h8300-hitachi basic_os=hms ;; h8300xray) basic_machine=h8300-hitachi basic_os=xray ;; h8500hms) basic_machine=h8500-hitachi basic_os=hms ;; harris) basic_machine=m88k-harris basic_os=sysv3 ;; hp300 | hp300hpux) basic_machine=m68k-hp basic_os=hpux ;; hp300bsd) basic_machine=m68k-hp basic_os=bsd ;; hppaosf) basic_machine=hppa1.1-hp basic_os=osf ;; hppro) basic_machine=hppa1.1-hp basic_os=proelf ;; i386mach) basic_machine=i386-mach basic_os=mach ;; isi68 | isi) basic_machine=m68k-isi basic_os=sysv ;; m68knommu) basic_machine=m68k-unknown basic_os=linux ;; magnum | m3230) basic_machine=mips-mips basic_os=sysv ;; merlin) basic_machine=ns32k-utek basic_os=sysv ;; mingw64) basic_machine=x86_64-pc basic_os=mingw64 ;; mingw32) basic_machine=i686-pc basic_os=mingw32 ;; mingw32ce) basic_machine=arm-unknown basic_os=mingw32ce ;; monitor) basic_machine=m68k-rom68k basic_os=coff ;; morphos) basic_machine=powerpc-unknown basic_os=morphos ;; moxiebox) basic_machine=moxie-unknown basic_os=moxiebox ;; msdos) basic_machine=i386-pc basic_os=msdos ;; msys) basic_machine=i686-pc basic_os=msys ;; mvs) basic_machine=i370-ibm basic_os=mvs ;; nacl) basic_machine=le32-unknown basic_os=nacl ;; ncr3000) basic_machine=i486-ncr basic_os=sysv4 ;; netbsd386) basic_machine=i386-pc basic_os=netbsd ;; netwinder) basic_machine=armv4l-rebel basic_os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony basic_os=newsos ;; news1000) basic_machine=m68030-sony basic_os=newsos ;; necv70) basic_machine=v70-nec basic_os=sysv ;; nh3000) basic_machine=m68k-harris basic_os=cxux ;; nh[45]000) basic_machine=m88k-harris basic_os=cxux ;; nindy960) basic_machine=i960-intel basic_os=nindy ;; mon960) basic_machine=i960-intel basic_os=mon960 ;; nonstopux) basic_machine=mips-compaq basic_os=nonstopux ;; os400) basic_machine=powerpc-ibm basic_os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson basic_os=ose ;; os68k) basic_machine=m68k-none basic_os=os68k ;; paragon) basic_machine=i860-intel basic_os=osf ;; parisc) basic_machine=hppa-unknown basic_os=linux ;; psp) basic_machine=mipsallegrexel-sony basic_os=psp ;; pw32) basic_machine=i586-unknown basic_os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc basic_os=rdos ;; rdos32) basic_machine=i386-pc basic_os=rdos ;; rom68k) basic_machine=m68k-rom68k basic_os=coff ;; sa29200) basic_machine=a29k-amd basic_os=udi ;; sei) basic_machine=mips-sei basic_os=seiux ;; sequent) basic_machine=i386-sequent basic_os= ;; sps7) basic_machine=m68k-bull basic_os=sysv2 ;; st2000) basic_machine=m68k-tandem basic_os= ;; stratus) basic_machine=i860-stratus basic_os=sysv4 ;; sun2) basic_machine=m68000-sun basic_os= ;; sun2os3) basic_machine=m68000-sun basic_os=sunos3 ;; sun2os4) basic_machine=m68000-sun basic_os=sunos4 ;; sun3) basic_machine=m68k-sun basic_os= ;; sun3os3) basic_machine=m68k-sun basic_os=sunos3 ;; sun3os4) basic_machine=m68k-sun basic_os=sunos4 ;; sun4) basic_machine=sparc-sun basic_os= ;; sun4os3) basic_machine=sparc-sun basic_os=sunos3 ;; sun4os4) basic_machine=sparc-sun basic_os=sunos4 ;; sun4sol2) basic_machine=sparc-sun basic_os=solaris2 ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun basic_os= ;; sv1) basic_machine=sv1-cray basic_os=unicos ;; symmetry) basic_machine=i386-sequent basic_os=dynix ;; t3e) basic_machine=alphaev5-cray basic_os=unicos ;; t90) basic_machine=t90-cray basic_os=unicos ;; toad1) basic_machine=pdp10-xkl basic_os=tops20 ;; tpf) basic_machine=s390x-ibm basic_os=tpf ;; udi29k) basic_machine=a29k-amd basic_os=udi ;; ultra3) basic_machine=a29k-nyu basic_os=sym1 ;; v810 | necv810) basic_machine=v810-nec basic_os=none ;; vaxv) basic_machine=vax-dec basic_os=sysv ;; vms) basic_machine=vax-dec basic_os=vms ;; vsta) basic_machine=i386-pc basic_os=vsta ;; vxworks960) basic_machine=i960-wrs basic_os=vxworks ;; vxworks68) basic_machine=m68k-wrs basic_os=vxworks ;; vxworks29k) basic_machine=a29k-wrs basic_os=vxworks ;; xbox) basic_machine=i686-pc basic_os=mingw32 ;; ymp) basic_machine=ymp-cray basic_os=unicos ;; *) basic_machine=$1 basic_os= ;; esac ;; esac # Decode 1-component or ad-hoc basic machines case $basic_machine in # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) cpu=hppa1.1 vendor=winbond ;; op50n) cpu=hppa1.1 vendor=oki ;; op60c) cpu=hppa1.1 vendor=oki ;; ibm*) cpu=i370 vendor=ibm ;; orion105) cpu=clipper vendor=highlevel ;; mac | mpw | mac-mpw) cpu=m68k vendor=apple ;; pmac | pmac-mpw) cpu=powerpc vendor=apple ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) cpu=m68000 vendor=att ;; 3b*) cpu=we32k vendor=att ;; bluegene*) cpu=powerpc vendor=ibm basic_os=cnk ;; decsystem10* | dec10*) cpu=pdp10 vendor=dec basic_os=tops10 ;; decsystem20* | dec20*) cpu=pdp10 vendor=dec basic_os=tops20 ;; delta | 3300 | delta-motorola | 3300-motorola | motorola-delta | motorola-3300) cpu=m68k vendor=motorola ;; # This used to be dpx2*, but that gets the RS6000-based # DPX/20 and the x86-based DPX/2-100 wrong. See # https://oldskool.silicium.org/stations/bull_dpx20.htm # https://www.feb-patrimoine.com/english/bull_dpx2.htm # https://www.feb-patrimoine.com/english/unix_and_bull.htm dpx2 | dpx2[23]00 | dpx2[23]xx) cpu=m68k vendor=bull ;; dpx2100 | dpx21xx) cpu=i386 vendor=bull ;; dpx20) cpu=rs6000 vendor=bull ;; encore | umax | mmax) cpu=ns32k vendor=encore ;; elxsi) cpu=elxsi vendor=elxsi basic_os=${basic_os:-bsd} ;; fx2800) cpu=i860 vendor=alliant ;; genix) cpu=ns32k vendor=ns ;; h3050r* | hiux*) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) cpu=m68000 vendor=hp ;; hp9k3[2-9][0-9]) cpu=m68k vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) cpu=hppa1.1 vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; i*86v32) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv32 ;; i*86v4*) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv4 ;; i*86v) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv ;; i*86sol2) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=solaris2 ;; j90 | j90-cray) cpu=j90 vendor=cray basic_os=${basic_os:-unicos} ;; iris | iris4d) cpu=mips vendor=sgi case $basic_os in irix*) ;; *) basic_os=irix4 ;; esac ;; miniframe) cpu=m68000 vendor=convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) cpu=m68k vendor=atari basic_os=mint ;; news-3600 | risc-news) cpu=mips vendor=sony basic_os=newsos ;; next | m*-next) cpu=m68k vendor=next ;; np1) cpu=np1 vendor=gould ;; op50n-* | op60c-*) cpu=hppa1.1 vendor=oki basic_os=proelf ;; pa-hitachi) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; pbd) cpu=sparc vendor=tti ;; pbb) cpu=m68k vendor=tti ;; pc532) cpu=ns32k vendor=pc532 ;; pn) cpu=pn vendor=gould ;; power) cpu=power vendor=ibm ;; ps2) cpu=i386 vendor=ibm ;; rm[46]00) cpu=mips vendor=siemens ;; rtpc | rtpc-*) cpu=romp vendor=ibm ;; sde) cpu=mipsisa32 vendor=sde basic_os=${basic_os:-elf} ;; simso-wrs) cpu=sparclite vendor=wrs basic_os=vxworks ;; tower | tower-32) cpu=m68k vendor=ncr ;; vpp*|vx|vx-*) cpu=f301 vendor=fujitsu ;; w65) cpu=w65 vendor=wdc ;; w89k-*) cpu=hppa1.1 vendor=winbond basic_os=proelf ;; none) cpu=none vendor=none ;; leon|leon[3-9]) cpu=sparc vendor=$basic_machine ;; leon-*|leon[3-9]-*) cpu=sparc vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; *-*) saved_IFS=$IFS IFS="-" read cpu vendor <&2 exit 1 ;; esac ;; esac # Here we canonicalize certain aliases for manufacturers. case $vendor in digital*) vendor=dec ;; commodore*) vendor=cbm ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if test x"$basic_os" != x then # First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. obj= case $basic_os in gnu/linux*) kernel=linux os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` ;; os2-emx) kernel=os2 os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` ;; nto-qnx*) kernel=nto os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` ;; *-*) saved_IFS=$IFS IFS="-" read kernel os <&2 fi ;; *) echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 exit 1 ;; esac case $obj in aout* | coff* | elf* | pe*) ;; '') # empty is fine ;; *) echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 exit 1 ;; esac # Here we handle the constraint that a (synthetic) cpu and os are # valid only in combination with each other and nowhere else. case $cpu-$os in # The "javascript-unknown-ghcjs" triple is used by GHC; we # accept it here in order to tolerate that, but reject any # variations. javascript-ghcjs) ;; javascript-* | *-ghcjs) echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. case $kernel-$os-$obj in linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \ | linux-mlibc*- | linux-musl*- | linux-newlib*- \ | linux-relibc*- | linux-uclibc*- | linux-ohos*- ) ;; uclinux-uclibc*- | uclinux-gnu*- ) ;; managarm-mlibc*- | managarm-kernel*- ) ;; windows*-msvc*-) ;; -dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \ | -uclibc*- ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 exit 1 ;; -kernel*- ) echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 exit 1 ;; *-kernel*- ) echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 exit 1 ;; *-msvc*- ) echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 exit 1 ;; kfreebsd*-gnu*- | knetbsd*-gnu*- | netbsd*-gnu*- | kopensolaris*-gnu*-) ;; vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) ;; nto-qnx*-) ;; os2-emx-) ;; rtmk-nova-) ;; *-eabi*- | *-gnueabi*-) ;; none--*) # None (no kernel, i.e. freestanding / bare metal), # can be paired with an machine code file format ;; -*-) # Blank kernel with real OS is always fine. ;; --*) # Blank kernel and OS with real machine code file format is always fine. ;; *-*-*) echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 exit 1 ;; esac # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) case $cpu-$os in *-riscix*) vendor=acorn ;; *-sunos* | *-solaris*) vendor=sun ;; *-cnk* | *-aix*) vendor=ibm ;; *-beos*) vendor=be ;; *-hpux*) vendor=hp ;; *-mpeix*) vendor=hp ;; *-hiux*) vendor=hitachi ;; *-unos*) vendor=crds ;; *-dgux*) vendor=dg ;; *-luna*) vendor=omron ;; *-genix*) vendor=ns ;; *-clix*) vendor=intergraph ;; *-mvs* | *-opened*) vendor=ibm ;; *-os400*) vendor=ibm ;; s390-* | s390x-*) vendor=ibm ;; *-ptx*) vendor=sequent ;; *-tpf*) vendor=ibm ;; *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; *-aux*) vendor=apple ;; *-hms*) vendor=hitachi ;; *-mpw* | *-macos*) vendor=apple ;; *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; *-vos*) vendor=stratus ;; esac ;; esac echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: asymptote-3.05/libatomic_ops/README_stack.txt0000644000000000000000000000771015031566105017702 0ustar rootrootNote that the AO_stack implementation is licensed under the GPL, unlike the lower level routines. The header file atomic_ops_stack.h defines a linked stack abstraction. Stacks may be accessed by multiple concurrent threads. The implementation is 1-lock-free, i.e. it will continue to make progress if at most one thread becomes inactive while operating on the data structure. (The implementation can be built to be N-lock-free for any given N. But that seems to rarely be useful, especially since larger N involve some slowdown.) This makes it safe to access these data structures from non-reentrant signal handlers, provided at most one non-signal-handler thread is accessing the data structure at once. This latter condition can be ensured by acquiring an ordinary lock around the non-handler accesses to the data structure. For details see: Hans-J. Boehm, "An Almost Non-Blocking Stack", PODC 2004, http://portal.acm.org/citation.cfm?doid=1011767.1011774 (This is not exactly the implementation described there, since the interface was cleaned up in the interim. But it should perform very similarly.) We use a fully lock-free implementation when the underlying hardware makes that less expensive, i.e. when we have a double-wide compare-and-swap operation available. (The fully lock-free implementation uses an AO_t- sized version count, and assumes it does not wrap during the time any given operation is active. This seems reasonably safe on 32-bit hardware, and very safe on 64-bit hardware.) If a fully lock-free implementation, AO_stack_is_lock_free() returns 1 (also, the macro AO_STACK_IS_LOCK_FREE is defined in this case but its usage by client is deprecated). The implementation is interesting only because it allows reuse of existing nodes. This is necessary, for example, to implement a memory allocator. Since we want to leave the precise stack node type up to the client, we insist only that each stack node contains a link field of type AO_t. When a new node is pushed on the stack, the push operation expects to be passed the pointer to this link field, which will then be overwritten by this link field. Similarly, the pop operation returns a pointer to the link field of the object that previously was on the top of the stack. The cleanest way to use these routines is probably to define the stack node type with an initial AO_t link field, so that the conversion between the link-field pointer and the stack element pointer is just a compile-time cast. But other possibilities exist. (This would be cleaner in C++ with templates.) A stack is represented by an AO_stack_t structure. (This is normally 2 or 3 times the size of a pointer.) It may be statically initialized by setting it to AO_STACK_INITIALIZER, or dynamically initialized to an empty stack with AO_stack_init. There are only three operations for accessing stacks: void AO_stack_init(AO_stack_t *list); void AO_stack_push_release(AO_stack_t *list, AO_t *new_element); AO_t * AO_stack_pop_acquire(volatile AO_stack_t *list); We require that the objects pushed as list elements remain addressable as long as any push or pop operation are in progress. (It is OK for an object to be "popped" off a stack and "deallocated" with a concurrent "pop" on the same stack still in progress, but only if "deallocation" leaves the object addressable. The second "pop" may still read the object, but the value it reads will not matter.) We require that the headers (AO_stack objects) remain allocated and valid as long as any operations on them are still in-flight. We also provide macros AO_REAL_HEAD_PTR that converts an AO_stack_t to a pointer to the link field in the next element, and AO_REAL_NEXT_PTR that converts a link field to a real, dereferencable, pointer to the link field in the next element. This is intended only for debugging, or to traverse the list after modification has ceased. There is otherwise no guarantee that walking a stack using this macro will produce any kind of consistent picture of the data structure. asymptote-3.05/libatomic_ops/autogen.sh0000755000000000000000000000032715031566105017015 0ustar rootroot#!/bin/sh set -e # This script creates (or regenerates) configure (as well as aclocal.m4, # config.h.in, Makefile.in, etc.) missing in the source repository. autoreconf -i echo echo "Ready to run './configure'." asymptote-3.05/libatomic_ops/Config.cmake.in0000644000000000000000000000024115031566105017623 0ustar rootroot# The Atomic_ops CMake configuration file. @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/Atomic_opsTargets.cmake") check_required_components(libatomic_ops) asymptote-3.05/libatomic_ops/README_malloc.txt0000644000000000000000000000615715031566105020050 0ustar rootrootThe atomic_ops_gpl includes a simple almost-lock-free malloc implementation. Note that the AO malloc implementation is licensed under the GPL, unlike the lower level routines. This is intended as a safe way to allocate memory from a signal handler, or to allocate memory in the context of a library that does not know what thread library it will be used with. In either case locking is impossible. Note that the operations are only guaranteed to be 1-lock-free, i.e. a single blocked thread will not prevent progress, but multiple blocked threads may. To safely use these operations in a signal handler, the handler should be non-reentrant, i.e. it should not be interruptable by another handler using these operations. Furthermore use outside of signal handlers in a multithreaded application should be protected by a lock, so that at most one invocation may be interrupted by a signal. The header will define the macro "AO_MALLOC_IS_LOCK_FREE" on platforms on which malloc is completely lock-free, and hence these restrictions do not apply. In the presence of threads, but absence of contention, the time performance of this package should be as good, or slightly better than, most system malloc implementations. Its space performance is theoretically optimal (to within a constant factor), but probably quite poor in practice. In particular, no attempt is made to coalesce free small memory blocks. Something like Doug Lea's malloc is likely to use significantly less memory for complex applications. Performance on platforms without an efficient compare-and-swap implementation will be poor. This package was not designed for processor-scalability in the face of high allocation rates. If all threads happen to allocate different-sized objects, you might get lucky. Otherwise expect contention and false-sharing problems. If this is an issue, something like Maged Michael's algorithm (PLDI 2004) would be technically a far better choice. If you are concerned only with scalability, and not signal-safety, you might also consider using Hoard instead. We have seen a factor of 3 to 4 slowdown from the standard glibc malloc implementation with contention, even when the performance without contention was faster. (To make the implementation more scalable, one would need to replicate at least the free list headers, so that concurrent access is possible without cache conflicts.) Unfortunately there is no portable async-signal-safe way to obtain large chunks of memory from the OS. Based on reading of the source code, mmap-based allocation appears safe under Linux, and probably BSD variants. It is probably unsafe for operating systems built on Mach, such as Apple's Darwin. Without use of mmap, the allocator is limited to a fixed size, statically preallocated heap (2MB by default), and will fail to allocate objects above a certain size (just under 64K by default). Use of mmap to circumvent these limitations requires an explicit call. The entire interface to the AO_malloc package currently consists of: #include /* includes atomic_ops.h */ void *AO_malloc(size_t sz); void AO_free(void *p); void AO_malloc_enable_mmap(void); asymptote-3.05/libatomic_ops/pkgconfig/0000755000000000000000000000000015031566105016761 5ustar rootrootasymptote-3.05/libatomic_ops/pkgconfig/atomic_ops.pc.in0000644000000000000000000000040715031566105022050 0ustar rootrootprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: The atomic_ops library Description: Atomic memory update operations portable implementation Version: @PACKAGE_VERSION@ Libs: -L${libdir} -latomic_ops Cflags: -I${includedir} asymptote-3.05/libatomic_ops/pkgconfig/atomic_ops-uninstalled.pc.in0000644000000000000000000000046715031566105024376 0ustar rootrootprefix=@prefix@ exec_prefix=@exec_prefix@ top_builddir=@abs_top_builddir@ top_srcdir=@abs_top_srcdir@ Name: The atomic_ops library (uninstalled) Description: Atomic memory update operations Version: @PACKAGE_VERSION@ Libs: ${top_builddir}/src/libatomic_ops.la Cflags: -I${top_builddir}/src -I${top_srcdir}/src asymptote-3.05/libatomic_ops/src/0000755000000000000000000000000015031566105015601 5ustar rootrootasymptote-3.05/libatomic_ops/src/atomic_ops.c0000644000000000000000000002114015031566105020100 0ustar rootroot/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * Initialized data and out-of-line functions to support atomic_ops.h * go here. Currently this is needed only for pthread-based atomics * emulation, or for compare-and-swap emulation. * Pthreads emulation isn't useful on a native Windows platform, and * cas emulation is not needed. Thus we skip this on Windows. */ #if defined(HAVE_CONFIG_H) # include "config.h" #endif #if (defined(__hexagon__) || defined(__native_client__)) \ && !defined(AO_USE_NO_SIGNALS) && !defined(AO_USE_NANOSLEEP) /* Hexagon QuRT does not have sigprocmask (but Hexagon does not need */ /* emulation, so it is OK not to bother about signals blocking). */ /* Since NaCl is not recognized by configure yet, we do it here. */ # define AO_USE_NO_SIGNALS # define AO_USE_NANOSLEEP #endif #if defined(AO_USE_WIN32_PTHREADS) && !defined(AO_USE_NO_SIGNALS) # define AO_USE_NO_SIGNALS #endif #if (defined(__CYGWIN__) || defined(__GLIBC__) || defined(__GNU__) \ || defined(__linux__)) \ && !defined(AO_USE_NO_SIGNALS) && !defined(_GNU_SOURCE) # define _GNU_SOURCE 1 #endif #ifndef AO_BUILD # define AO_BUILD #endif #undef AO_REQUIRE_CAS #include "atomic_ops.h" /* Without cas emulation! */ #ifdef __cplusplus extern "C" { #endif AO_API void AO_pause(int); /* defined below */ #ifdef __cplusplus } /* extern "C" */ #endif #if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__BORLANDC__) \ || defined(AO_USE_NO_SIGNALS) #ifndef AO_NO_PTHREADS # include #endif #ifndef AO_USE_NO_SIGNALS # include #endif #ifdef AO_USE_NANOSLEEP /* This requires _POSIX_TIMERS feature. */ # include # include #elif defined(AO_USE_WIN32_PTHREADS) # include /* for Sleep() */ #elif defined(_HPUX_SOURCE) # include #else # include #endif #ifndef AO_HAVE_double_t # include "atomic_ops/sysdeps/standard_ao_double_t.h" #endif #ifdef __cplusplus extern "C" { #endif AO_API AO_t AO_fetch_compare_and_swap_emulation(volatile AO_t *addr, AO_t old_val, AO_t new_val); AO_API int AO_compare_double_and_swap_double_emulation(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2); AO_API void AO_store_full_emulation(volatile AO_t *addr, AO_t val); /* Lock for pthreads-based implementation. */ #ifndef AO_NO_PTHREADS AO_API pthread_mutex_t AO_pt_lock; #endif #ifdef __cplusplus } /* extern "C" */ #endif #ifndef AO_NO_PTHREADS pthread_mutex_t AO_pt_lock = PTHREAD_MUTEX_INITIALIZER; #endif /* * Out of line compare-and-swap emulation based on test and set. * * We use a small table of locks for different compare_and_swap locations. * Before we update perform a compare-and-swap, we grab the corresponding * lock. Different locations may hash to the same lock, but since we * never acquire more than one lock at a time, this can't deadlock. * We explicitly disable signals while we perform this operation. * * TODO: Probably also support emulation based on Lamport * locks, since we may not have test_and_set either. */ #define AO_HASH_SIZE 16 #define AO_HASH(x) (((unsigned long)(x) >> 12) & (AO_HASH_SIZE-1)) static AO_TS_t AO_locks[AO_HASH_SIZE] = { AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, }; static void lock_ool(volatile AO_TS_t *l) { int i = 0; while (AO_test_and_set_acquire(l) == AO_TS_SET) AO_pause(++i); } AO_INLINE void lock(volatile AO_TS_t *l) { if (AO_EXPECT_FALSE(AO_test_and_set_acquire(l) == AO_TS_SET)) lock_ool(l); } AO_INLINE void unlock(volatile AO_TS_t *l) { AO_CLEAR(l); } #ifndef AO_USE_NO_SIGNALS static sigset_t all_sigs; static volatile AO_t initialized = 0; static volatile AO_TS_t init_lock = AO_TS_INITIALIZER; AO_INLINE void block_all_signals(sigset_t *old_sigs_ptr) { if (AO_EXPECT_FALSE(!AO_load_acquire(&initialized))) { lock(&init_lock); if (!initialized) sigfillset(&all_sigs); unlock(&init_lock); AO_store_release(&initialized, 1); } sigprocmask(SIG_BLOCK, &all_sigs, old_sigs_ptr); /* Neither sigprocmask nor pthread_sigmask is 100% */ /* guaranteed to work here. Sigprocmask is not */ /* guaranteed be thread safe, and pthread_sigmask */ /* is not async-signal-safe. Under linuxthreads, */ /* sigprocmask may block some pthreads-internal */ /* signals. So long as we do that for short periods, */ /* we should be OK. */ } #endif /* !AO_USE_NO_SIGNALS */ AO_API AO_t AO_fetch_compare_and_swap_emulation(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_TS_t *my_lock = AO_locks + AO_HASH(addr); AO_t fetched_val; # ifndef AO_USE_NO_SIGNALS sigset_t old_sigs; block_all_signals(&old_sigs); # endif lock(my_lock); fetched_val = *addr; if (fetched_val == old_val) *addr = new_val; unlock(my_lock); # ifndef AO_USE_NO_SIGNALS sigprocmask(SIG_SETMASK, &old_sigs, NULL); # endif return fetched_val; } AO_API int AO_compare_double_and_swap_double_emulation(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { AO_TS_t *my_lock = AO_locks + AO_HASH(addr); int result; # ifndef AO_USE_NO_SIGNALS sigset_t old_sigs; block_all_signals(&old_sigs); # endif lock(my_lock); if (addr -> AO_val1 == old_val1 && addr -> AO_val2 == old_val2) { addr -> AO_val1 = new_val1; addr -> AO_val2 = new_val2; result = 1; } else result = 0; unlock(my_lock); # ifndef AO_USE_NO_SIGNALS sigprocmask(SIG_SETMASK, &old_sigs, NULL); # endif return result; } AO_API void AO_store_full_emulation(volatile AO_t *addr, AO_t val) { AO_TS_t *my_lock = AO_locks + AO_HASH(addr); lock(my_lock); *addr = val; unlock(my_lock); } #else /* Non-posix platform */ # include # define AO_USE_WIN32_PTHREADS /* define to use Sleep() */ extern int AO_non_posix_implementation_is_entirely_in_headers; #endif static AO_t spin_dummy = 1; /* Spin for 2**n units. */ static void AO_spin(int n) { AO_t j = AO_load(&spin_dummy); int i = 2 << n; while (i-- > 0) j += (j - 1) << 2; /* Given 'spin_dummy' is initialized to 1, j is 1 after the loop. */ AO_store(&spin_dummy, j); } AO_API void AO_pause(int n) { if (n < 12) AO_spin(n); else { # ifdef AO_USE_NANOSLEEP struct timespec ts; ts.tv_sec = 0; ts.tv_nsec = n > 28 ? 100000L * 1000 : 1L << (n - 2); nanosleep(&ts, 0); # elif defined(AO_USE_WIN32_PTHREADS) Sleep(n > 28 ? 100 /* millis */ : n < 22 ? 1 : (DWORD)1 << (n - 22)); # else struct timeval tv; /* Short async-signal-safe sleep. */ int usec = n > 28 ? 100000 : 1 << (n - 12); /* Use an intermediate variable (of int type) to avoid */ /* "shift followed by widening conversion" warning. */ tv.tv_sec = 0; tv.tv_usec = usec; (void)select(0, 0, 0, 0, &tv); # endif } } asymptote-3.05/libatomic_ops/src/atomic_ops/0000755000000000000000000000000015031566105017736 5ustar rootrootasymptote-3.05/libatomic_ops/src/atomic_ops/generalize-small.template0000644000000000000000000005077515031566105024744 0ustar rootroot/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* XSIZE_fetch_compare_and_swap */ #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) AO_INLINE XCTYPE AO_XSIZE_fetch_compare_and_swap_acquire(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { XCTYPE result = AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val); AO_nop_full(); return result; } # define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) # define AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) \ (AO_nop_full(), \ AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val)) # define AO_HAVE_XSIZE_fetch_compare_and_swap_release #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_full) # if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) # define AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_release # endif # if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) # define AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire # endif # if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write) # define AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_write # endif # if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read) # define AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_read # endif #endif /* AO_HAVE_XSIZE_fetch_compare_and_swap_full */ #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) # define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap #endif #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) # define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap #endif #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write) # define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap #endif #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read) # define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_full) # define AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) \ (AO_nop_full(), \ AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val)) # define AO_HAVE_XSIZE_fetch_compare_and_swap_full #endif #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write) # define AO_XSIZE_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) # define AO_XSIZE_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read) # define AO_XSIZE_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) # define AO_XSIZE_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read) # define AO_XSIZE_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_XSIZE_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_XSIZE_fetch_compare_and_swap) # define AO_XSIZE_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* XSIZE_compare_and_swap */ #if defined(AO_HAVE_XSIZE_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_acquire) AO_INLINE int AO_XSIZE_compare_and_swap_acquire(volatile XCTYPE *addr, XCTYPE old, XCTYPE new_val) { int result = AO_XSIZE_compare_and_swap(addr, old, new_val); AO_nop_full(); return result; } # define AO_HAVE_XSIZE_compare_and_swap_acquire #endif #if defined(AO_HAVE_XSIZE_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_release) # define AO_XSIZE_compare_and_swap_release(addr, old, new_val) \ (AO_nop_full(), AO_XSIZE_compare_and_swap(addr, old, new_val)) # define AO_HAVE_XSIZE_compare_and_swap_release #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_full) # if !defined(AO_HAVE_XSIZE_compare_and_swap_release) # define AO_XSIZE_compare_and_swap_release(addr, old, new_val) \ AO_XSIZE_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_release # endif # if !defined(AO_HAVE_XSIZE_compare_and_swap_acquire) # define AO_XSIZE_compare_and_swap_acquire(addr, old, new_val) \ AO_XSIZE_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_acquire # endif # if !defined(AO_HAVE_XSIZE_compare_and_swap_write) # define AO_XSIZE_compare_and_swap_write(addr, old, new_val) \ AO_XSIZE_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_write # endif # if !defined(AO_HAVE_XSIZE_compare_and_swap_read) # define AO_XSIZE_compare_and_swap_read(addr, old, new_val) \ AO_XSIZE_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_read # endif #endif /* AO_HAVE_XSIZE_compare_and_swap_full */ #if !defined(AO_HAVE_XSIZE_compare_and_swap) \ && defined(AO_HAVE_XSIZE_compare_and_swap_release) # define AO_XSIZE_compare_and_swap(addr, old, new_val) \ AO_XSIZE_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap #endif #if !defined(AO_HAVE_XSIZE_compare_and_swap) \ && defined(AO_HAVE_XSIZE_compare_and_swap_acquire) # define AO_XSIZE_compare_and_swap(addr, old, new_val) \ AO_XSIZE_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap #endif #if !defined(AO_HAVE_XSIZE_compare_and_swap) \ && defined(AO_HAVE_XSIZE_compare_and_swap_write) # define AO_XSIZE_compare_and_swap(addr, old, new_val) \ AO_XSIZE_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap #endif #if !defined(AO_HAVE_XSIZE_compare_and_swap) \ && defined(AO_HAVE_XSIZE_compare_and_swap_read) # define AO_XSIZE_compare_and_swap(addr, old, new_val) \ AO_XSIZE_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_full) # define AO_XSIZE_compare_and_swap_full(addr, old, new_val) \ (AO_nop_full(), \ AO_XSIZE_compare_and_swap_acquire(addr, old, new_val)) # define AO_HAVE_XSIZE_compare_and_swap_full #endif #if !defined(AO_HAVE_XSIZE_compare_and_swap_release_write) \ && defined(AO_HAVE_XSIZE_compare_and_swap_write) # define AO_XSIZE_compare_and_swap_release_write(addr, old, new_val) \ AO_XSIZE_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_release_write #endif #if !defined(AO_HAVE_XSIZE_compare_and_swap_release_write) \ && defined(AO_HAVE_XSIZE_compare_and_swap_release) # define AO_XSIZE_compare_and_swap_release_write(addr, old, new_val) \ AO_XSIZE_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_release_write #endif #if !defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read) \ && defined(AO_HAVE_XSIZE_compare_and_swap_read) # define AO_XSIZE_compare_and_swap_acquire_read(addr, old, new_val) \ AO_XSIZE_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read) \ && defined(AO_HAVE_XSIZE_compare_and_swap_acquire) # define AO_XSIZE_compare_and_swap_acquire_read(addr, old, new_val) \ AO_XSIZE_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read) # define AO_XSIZE_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_XSIZE_compare_and_swap_acquire_read(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_XSIZE_compare_and_swap) # define AO_XSIZE_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_XSIZE_compare_and_swap(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* XSIZE_load */ #if defined(AO_HAVE_XSIZE_load_full) && !defined(AO_HAVE_XSIZE_load_acquire) # define AO_XSIZE_load_acquire(addr) AO_XSIZE_load_full(addr) # define AO_HAVE_XSIZE_load_acquire #endif #if defined(AO_HAVE_XSIZE_load_acquire) && !defined(AO_HAVE_XSIZE_load) # define AO_XSIZE_load(addr) AO_XSIZE_load_acquire(addr) # define AO_HAVE_XSIZE_load #endif #if defined(AO_HAVE_XSIZE_load_full) && !defined(AO_HAVE_XSIZE_load_read) # define AO_XSIZE_load_read(addr) AO_XSIZE_load_full(addr) # define AO_HAVE_XSIZE_load_read #endif #if !defined(AO_HAVE_XSIZE_load_acquire_read) \ && defined(AO_HAVE_XSIZE_load_acquire) # define AO_XSIZE_load_acquire_read(addr) AO_XSIZE_load_acquire(addr) # define AO_HAVE_XSIZE_load_acquire_read #endif #if defined(AO_HAVE_XSIZE_load) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_load_acquire) AO_INLINE XCTYPE AO_XSIZE_load_acquire(const volatile XCTYPE *addr) { XCTYPE result = AO_XSIZE_load(addr); /* Acquire barrier would be useless, since the load could be delayed */ /* beyond it. */ AO_nop_full(); return result; } # define AO_HAVE_XSIZE_load_acquire #endif #if defined(AO_HAVE_XSIZE_load) && defined(AO_HAVE_nop_read) \ && !defined(AO_HAVE_XSIZE_load_read) AO_INLINE XCTYPE AO_XSIZE_load_read(const volatile XCTYPE *addr) { XCTYPE result = AO_XSIZE_load(addr); AO_nop_read(); return result; } # define AO_HAVE_XSIZE_load_read #endif #if defined(AO_HAVE_XSIZE_load_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_load_full) # define AO_XSIZE_load_full(addr) (AO_nop_full(), AO_XSIZE_load_acquire(addr)) # define AO_HAVE_XSIZE_load_full #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_read) \ && !defined(AO_HAVE_XSIZE_load_read) # define AO_XSIZE_CAS_BASED_LOAD_READ AO_ATTR_NO_SANITIZE_THREAD AO_INLINE XCTYPE AO_XSIZE_load_read(const volatile XCTYPE *addr) { XCTYPE result; do { result = *(const XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_read( (volatile XCTYPE *)addr, result, result))); return result; } # define AO_HAVE_XSIZE_load_read #endif #if !defined(AO_HAVE_XSIZE_load_acquire_read) \ && defined(AO_HAVE_XSIZE_load_read) # define AO_XSIZE_load_acquire_read(addr) AO_XSIZE_load_read(addr) # define AO_HAVE_XSIZE_load_acquire_read #endif #if defined(AO_HAVE_XSIZE_load_acquire_read) && !defined(AO_HAVE_XSIZE_load) \ && (!defined(AO_XSIZE_CAS_BASED_LOAD_READ) \ || !defined(AO_HAVE_XSIZE_compare_and_swap)) # define AO_XSIZE_load(addr) AO_XSIZE_load_acquire_read(addr) # define AO_HAVE_XSIZE_load #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_load_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE XCTYPE AO_XSIZE_load_full(const volatile XCTYPE *addr) { XCTYPE result; do { result = *(const XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full( (volatile XCTYPE *)addr, result, result))); return result; } # define AO_HAVE_XSIZE_load_full #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_acquire) \ && !defined(AO_HAVE_XSIZE_load_acquire) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE XCTYPE AO_XSIZE_load_acquire(const volatile XCTYPE *addr) { XCTYPE result; do { result = *(const XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_acquire( (volatile XCTYPE *)addr, result, result))); return result; } # define AO_HAVE_XSIZE_load_acquire #endif #if defined(AO_HAVE_XSIZE_compare_and_swap) && !defined(AO_HAVE_XSIZE_load) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE XCTYPE AO_XSIZE_load(const volatile XCTYPE *addr) { XCTYPE result; do { result = *(const XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap( (volatile XCTYPE *)addr, result, result))); return result; } # define AO_HAVE_XSIZE_load #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_XSIZE_load_acquire_read) # define AO_XSIZE_load_dd_acquire_read(addr) \ AO_XSIZE_load_acquire_read(addr) # define AO_HAVE_XSIZE_load_dd_acquire_read # endif #else # if defined(AO_HAVE_XSIZE_load) # define AO_XSIZE_load_dd_acquire_read(addr) AO_XSIZE_load(addr) # define AO_HAVE_XSIZE_load_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* XSIZE_store */ #if defined(AO_HAVE_XSIZE_store_full) && !defined(AO_HAVE_XSIZE_store_release) # define AO_XSIZE_store_release(addr, val) AO_XSIZE_store_full(addr, val) # define AO_HAVE_XSIZE_store_release #endif #if defined(AO_HAVE_XSIZE_store_release) && !defined(AO_HAVE_XSIZE_store) # define AO_XSIZE_store(addr, val) AO_XSIZE_store_release(addr, val) # define AO_HAVE_XSIZE_store #endif #if defined(AO_HAVE_XSIZE_store_full) && !defined(AO_HAVE_XSIZE_store_write) # define AO_XSIZE_store_write(addr, val) AO_XSIZE_store_full(addr, val) # define AO_HAVE_XSIZE_store_write #endif #if defined(AO_HAVE_XSIZE_store_release) \ && !defined(AO_HAVE_XSIZE_store_release_write) # define AO_XSIZE_store_release_write(addr, val) \ AO_XSIZE_store_release(addr, val) # define AO_HAVE_XSIZE_store_release_write #endif #if defined(AO_HAVE_XSIZE_store_write) && !defined(AO_HAVE_XSIZE_store) # define AO_XSIZE_store(addr, val) AO_XSIZE_store_write(addr, val) # define AO_HAVE_XSIZE_store #endif #if defined(AO_HAVE_XSIZE_store) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_store_release) # define AO_XSIZE_store_release(addr, val) \ (AO_nop_full(), AO_XSIZE_store(addr, val)) # define AO_HAVE_XSIZE_store_release #endif #if defined(AO_HAVE_XSIZE_store) && defined(AO_HAVE_nop_write) \ && !defined(AO_HAVE_XSIZE_store_write) # define AO_XSIZE_store_write(addr, val) \ (AO_nop_write(), AO_XSIZE_store(addr, val)) # define AO_HAVE_XSIZE_store_write #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_write) \ && !defined(AO_HAVE_XSIZE_store_write) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_XSIZE_store_write(volatile XCTYPE *addr, XCTYPE new_val) { XCTYPE old_val; do { old_val = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_write(addr, old_val, new_val))); } # define AO_HAVE_XSIZE_store_write #endif #if defined(AO_HAVE_XSIZE_store_write) \ && !defined(AO_HAVE_XSIZE_store_release_write) # define AO_XSIZE_store_release_write(addr, val) \ AO_XSIZE_store_write(addr, val) # define AO_HAVE_XSIZE_store_release_write #endif #if defined(AO_HAVE_XSIZE_store_release) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_store_full) # define AO_XSIZE_store_full(addr, val) \ (AO_XSIZE_store_release(addr, val), \ AO_nop_full()) # define AO_HAVE_XSIZE_store_full #endif #if defined(AO_HAVE_XSIZE_compare_and_swap) && !defined(AO_HAVE_XSIZE_store) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_XSIZE_store(volatile XCTYPE *addr, XCTYPE new_val) { XCTYPE old_val; do { old_val = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap(addr, old_val, new_val))); } # define AO_HAVE_XSIZE_store #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_release) \ && !defined(AO_HAVE_XSIZE_store_release) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_XSIZE_store_release(volatile XCTYPE *addr, XCTYPE new_val) { XCTYPE old_val; do { old_val = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_release(addr, old_val, new_val))); } # define AO_HAVE_XSIZE_store_release #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_store_full) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_XSIZE_store_full(volatile XCTYPE *addr, XCTYPE new_val) { XCTYPE old_val; do { old_val = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old_val, new_val))); } # define AO_HAVE_XSIZE_store_full #endif asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/0000755000000000000000000000000015031566105021430 5ustar rootrootasymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/ibmc/0000755000000000000000000000000015031566105022342 5ustar rootrootasymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/ibmc/powerpc.h0000644000000000000000000001424715031566105024202 0ustar rootroot /* Memory model documented at http://www-106.ibm.com/developerworks/ */ /* eserver/articles/archguide.html and (clearer) */ /* http://www-106.ibm.com/developerworks/eserver/articles/powerpc.html. */ /* There appears to be no implicit ordering between any kind of */ /* independent memory references. */ /* Architecture enforces some ordering based on control dependence. */ /* I don't know if that could help. */ /* Data-dependent loads are always ordered. */ /* Based on the above references, eieio is intended for use on */ /* uncached memory, which we don't support. It does not order loads */ /* from cached memory. */ /* Thanks to Maged Michael, Doug Lea, and Roger Hoover for helping to */ /* track some of this down and correcting my misunderstandings. -HB */ #include "../all_aligned_atomic_load_store.h" #include "../test_and_set_t_is_ao_t.h" void AO_sync(void); #pragma mc_func AO_sync { "7c0004ac" } #ifdef __NO_LWSYNC__ # define AO_lwsync AO_sync #else void AO_lwsync(void); #pragma mc_func AO_lwsync { "7c2004ac" } #endif #define AO_nop_write() AO_lwsync() #define AO_HAVE_nop_write #define AO_nop_read() AO_lwsync() #define AO_HAVE_nop_read /* We explicitly specify load_acquire and store_release, since these */ /* rely on the fact that lwsync is also a LoadStore barrier. */ AO_INLINE AO_t AO_load_acquire(const volatile AO_t *addr) { AO_t result = *addr; AO_lwsync(); return result; } #define AO_HAVE_load_acquire AO_INLINE void AO_store_release(volatile AO_t *addr, AO_t value) { AO_lwsync(); *addr = value; } #define AO_HAVE_store_release #ifndef AO_PREFER_GENERALIZED /* This is similar to the code in the garbage collector. Deleting */ /* this and having it synthesized from compare_and_swap would probably */ /* only cost us a load immediate instruction. */ AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { #if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__) /* Completely untested. And we should be using smaller objects anyway. */ unsigned long oldval; unsigned long temp = 1; /* locked value */ __asm__ __volatile__( "1:ldarx %0,0,%1\n" /* load and reserve */ "cmpdi %0, 0\n" /* if load is */ "bne 2f\n" /* non-zero, return already set */ "stdcx. %2,0,%1\n" /* else store conditional */ "bne- 1b\n" /* retry if lost reservation */ "2:\n" /* oldval is zero if we set */ : "=&r"(oldval) : "r"(addr), "r"(temp) : "memory", "cr0"); #else int oldval; int temp = 1; /* locked value */ __asm__ __volatile__( "1:lwarx %0,0,%1\n" /* load and reserve */ "cmpwi %0, 0\n" /* if load is */ "bne 2f\n" /* non-zero, return already set */ "stwcx. %2,0,%1\n" /* else store conditional */ "bne- 1b\n" /* retry if lost reservation */ "2:\n" /* oldval is zero if we set */ : "=&r"(oldval) : "r"(addr), "r"(temp) : "memory", "cr0"); #endif return (AO_TS_VAL_t)oldval; } #define AO_HAVE_test_and_set AO_INLINE AO_TS_VAL_t AO_test_and_set_acquire(volatile AO_TS_t *addr) { AO_TS_VAL_t result = AO_test_and_set(addr); AO_lwsync(); return result; } #define AO_HAVE_test_and_set_acquire AO_INLINE AO_TS_VAL_t AO_test_and_set_release(volatile AO_TS_t *addr) { AO_lwsync(); return AO_test_and_set(addr); } #define AO_HAVE_test_and_set_release AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { AO_TS_VAL_t result; AO_lwsync(); result = AO_test_and_set(addr); AO_lwsync(); return result; } #define AO_HAVE_test_and_set_full #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t fetched_val; # if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__) __asm__ __volatile__( "1:ldarx %0,0,%1\n" /* load and reserve */ "cmpd %0, %3\n" /* if load is not equal to */ "bne 2f\n" /* old_val, fail */ "stdcx. %2,0,%1\n" /* else store conditional */ "bne- 1b\n" /* retry if lost reservation */ "2:\n" : "=&r"(fetched_val) : "r"(addr), "r"(new_val), "r"(old_val) : "memory", "cr0"); # else __asm__ __volatile__( "1:lwarx %0,0,%1\n" /* load and reserve */ "cmpw %0, %3\n" /* if load is not equal to */ "bne 2f\n" /* old_val, fail */ "stwcx. %2,0,%1\n" /* else store conditional */ "bne- 1b\n" /* retry if lost reservation */ "2:\n" : "=&r"(fetched_val) : "r"(addr), "r"(new_val), "r"(old_val) : "memory", "cr0"); # endif return fetched_val; } #define AO_HAVE_fetch_compare_and_swap AO_INLINE AO_t AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t result = AO_fetch_compare_and_swap(addr, old_val, new_val); AO_lwsync(); return result; } #define AO_HAVE_fetch_compare_and_swap_acquire AO_INLINE AO_t AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_lwsync(); return AO_fetch_compare_and_swap(addr, old_val, new_val); } #define AO_HAVE_fetch_compare_and_swap_release AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t result; AO_lwsync(); result = AO_fetch_compare_and_swap(addr, old_val, new_val); AO_lwsync(); return result; } #define AO_HAVE_fetch_compare_and_swap_full /* TODO: Implement AO_fetch_and_add, AO_and/or/xor directly. */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/msftc/0000755000000000000000000000000015031566105022544 5ustar rootrootasymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86.h0000644000000000000000000001274415031566105023352 0ustar rootroot/* * Copyright (c) 2003 Hewlett-Packard Development Company, L.P. * Copyright (c) 2009-2021 Ivan Maidanski * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include "../all_aligned_atomic_load_store.h" #if !defined(AO_ASSUME_VISTA) && _MSC_VER >= 1910 /* Visual Studio 2017 (15.0) discontinued support of Windows XP. */ /* We assume Windows Server 2003, Vista or later. */ # define AO_ASSUME_VISTA #endif #if !defined(AO_ASSUME_WINDOWS98) \ && (defined(AO_ASSUME_VISTA) || _MSC_VER >= 1400) /* Visual Studio 2005 (MS VC++ 8.0) discontinued support of Windows 95. */ # define AO_ASSUME_WINDOWS98 #endif #if !defined(AO_USE_PENTIUM4_INSTRS) && _M_IX86_FP >= 2 /* SSE2 */ /* "mfence" is a part of SSE2 set (introduced on Intel Pentium 4). */ # define AO_USE_PENTIUM4_INSTRS #endif #define AO_T_IS_INT #ifndef AO_USE_INTERLOCKED_INTRINSICS /* _Interlocked primitives (Inc, Dec, Xchg, Add) are always available */ # define AO_USE_INTERLOCKED_INTRINSICS #endif #include "common32_defs.h" /* As far as we can tell, the lfence and sfence instructions are not */ /* currently needed or useful for cached memory accesses. */ /* Unfortunately mfence doesn't exist everywhere. */ /* IsProcessorFeaturePresent(PF_COMPARE_EXCHANGE128) is */ /* probably a conservative test for it? */ #if defined(AO_USE_PENTIUM4_INSTRS) AO_INLINE void AO_nop_full(void) { __asm { mfence } } #define AO_HAVE_nop_full #else /* We could use the cpuid instruction. But that seems to be slower */ /* than the default implementation based on test_and_set_full. Thus */ /* we omit that bit of misinformation here. */ #endif #if !defined(AO_NO_ASM_XADD) && !defined(AO_HAVE_char_fetch_and_add_full) AO_INLINE unsigned char AO_char_fetch_and_add_full(volatile unsigned char *p, unsigned char incr) { __asm { mov al, incr mov ebx, p lock xadd byte ptr [ebx], al } /* Ignore possible "missing return value" warning here. */ } # define AO_HAVE_char_fetch_and_add_full AO_INLINE unsigned short AO_short_fetch_and_add_full(volatile unsigned short *p, unsigned short incr) { __asm { mov ax, incr mov ebx, p lock xadd word ptr [ebx], ax } /* Ignore possible "missing return value" warning here. */ } # define AO_HAVE_short_fetch_and_add_full #endif /* !AO_NO_ASM_XADD */ #ifndef AO_HAVE_test_and_set_full # include "../test_and_set_t_is_char.h" AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { __asm { mov eax,0xff ; /* AO_TS_SET */ mov ebx,addr ; xchg byte ptr [ebx],al ; } /* Ignore possible "missing return value" warning here. */ } # define AO_HAVE_test_and_set_full #endif #if defined(_WIN64) && !defined(CPPCHECK) # error wrong architecture #endif #ifdef AO_ASSUME_VISTA # include "../standard_ao_double_t.h" /* Reading or writing a quadword aligned on a 64-bit boundary is */ /* always carried out atomically (requires at least a Pentium). */ # define AO_ACCESS_double_CHECK_ALIGNED # include "../loadstore/double_atomic_load_store.h" /* Whenever we run on a Pentium class machine, we have that certain */ /* function. */ # pragma intrinsic (_InterlockedCompareExchange64) /* Returns nonzero if the comparison succeeded. */ AO_INLINE int AO_double_compare_and_swap_full(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_ASSERT_ADDR_ALIGNED(addr); return (double_ptr_storage)_InterlockedCompareExchange64( (__int64 volatile *)addr, new_val.AO_whole /* exchange */, old_val.AO_whole) == old_val.AO_whole; } # define AO_HAVE_double_compare_and_swap_full #endif /* AO_ASSUME_VISTA */ /* Real X86 implementations, except for some old WinChips, appear */ /* to enforce ordering between memory operations, EXCEPT that a later */ /* read can pass earlier writes, presumably due to the visible */ /* presence of store buffers. */ /* We ignore both the WinChips, and the fact that the official specs */ /* seem to be much weaker (and arguably too weak to be usable). */ #include "../ordered_except_wr.h" asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/msftc/arm.h0000644000000000000000000001077315031566105023504 0ustar rootroot/* * Copyright (c) 2003 Hewlett-Packard Development Company, L.P. * Copyright (c) 2009-2021 Ivan Maidanski * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Some ARM slide set, if it has been read correctly, claims that Loads */ /* followed by either a Load or a Store are ordered, but nothing else. */ /* It is assumed that Windows interrupt handlers clear the LL/SC flag. */ /* Unaligned accesses are not guaranteed to be atomic. */ #include "../all_aligned_atomic_load_store.h" #define AO_T_IS_INT #ifndef AO_ASSUME_WINDOWS98 /* CAS is always available */ # define AO_ASSUME_WINDOWS98 #endif #include "common32_defs.h" /* If only a single processor is used, we can define AO_UNIPROCESSOR. */ #ifdef AO_UNIPROCESSOR AO_INLINE void AO_nop_full(void) { AO_compiler_barrier(); } # define AO_HAVE_nop_full #else /* AO_nop_full() is emulated using AO_test_and_set_full(). */ #endif #ifndef AO_HAVE_test_and_set_full # include "../test_and_set_t_is_ao_t.h" /* AO_test_and_set_full() is emulated. */ #endif #if _M_ARM >= 7 && !defined(AO_NO_DOUBLE_CAS) # include "../standard_ao_double_t.h" /* These intrinsics are supposed to use LDREXD/STREXD. */ # pragma intrinsic (_InterlockedCompareExchange64) # pragma intrinsic (_InterlockedCompareExchange64_acq) # pragma intrinsic (_InterlockedCompareExchange64_nf) # pragma intrinsic (_InterlockedCompareExchange64_rel) AO_INLINE int AO_double_compare_and_swap(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_ASSERT_ADDR_ALIGNED(addr); return (double_ptr_storage)_InterlockedCompareExchange64_nf( (__int64 volatile *)addr, new_val.AO_whole /* exchange */, old_val.AO_whole) == old_val.AO_whole; } # define AO_HAVE_double_compare_and_swap AO_INLINE int AO_double_compare_and_swap_acquire(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_ASSERT_ADDR_ALIGNED(addr); return (double_ptr_storage)_InterlockedCompareExchange64_acq( (__int64 volatile *)addr, new_val.AO_whole /* exchange */, old_val.AO_whole) == old_val.AO_whole; } # define AO_HAVE_double_compare_and_swap_acquire AO_INLINE int AO_double_compare_and_swap_release(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_ASSERT_ADDR_ALIGNED(addr); return (double_ptr_storage)_InterlockedCompareExchange64_rel( (__int64 volatile *)addr, new_val.AO_whole /* exchange */, old_val.AO_whole) == old_val.AO_whole; } # define AO_HAVE_double_compare_and_swap_release AO_INLINE int AO_double_compare_and_swap_full(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_ASSERT_ADDR_ALIGNED(addr); return (double_ptr_storage)_InterlockedCompareExchange64( (__int64 volatile *)addr, new_val.AO_whole /* exchange */, old_val.AO_whole) == old_val.AO_whole; } # define AO_HAVE_double_compare_and_swap_full #endif /* _M_ARM >= 7 && !AO_NO_DOUBLE_CAS */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86_64.h0000644000000000000000000001221415031566105023653 0ustar rootroot/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * Copyright (c) 2009-2021 Ivan Maidanski * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include "../all_aligned_atomic_load_store.h" /* Real X86 implementations appear */ /* to enforce ordering between memory operations, EXCEPT that a later */ /* read can pass earlier writes, presumably due to the visible */ /* presence of store buffers. */ /* We ignore the fact that the official specs */ /* seem to be much weaker (and arguably too weak to be usable). */ #include "../ordered_except_wr.h" #ifndef AO_ASSUME_WINDOWS98 /* CAS is always available */ # define AO_ASSUME_WINDOWS98 #endif #ifndef AO_USE_INTERLOCKED_INTRINSICS # define AO_USE_INTERLOCKED_INTRINSICS #endif #include "common32_defs.h" #ifdef AO_ASM_X64_AVAILABLE #if _MSC_VER < 1800 AO_INLINE unsigned char AO_char_fetch_and_add_full(volatile unsigned char *p, unsigned char incr) { __asm { mov al, incr mov rbx, p lock xadd byte ptr [rbx], al } } # define AO_HAVE_char_fetch_and_add_full AO_INLINE unsigned short AO_short_fetch_and_add_full(volatile unsigned short *p, unsigned short incr) { __asm { mov ax, incr mov rbx, p lock xadd word ptr [rbx], ax } } # define AO_HAVE_short_fetch_and_add_full #endif /* _MSC_VER < 1800 */ /* As far as we can tell, the lfence and sfence instructions are not */ /* currently needed or useful for cached memory accesses. */ AO_INLINE void AO_nop_full(void) { /* Note: "mfence" (SSE2) is supported on all x86_64/amd64 chips. */ __asm { mfence } } # define AO_HAVE_nop_full # ifndef AO_HAVE_test_and_set_full # include "../test_and_set_t_is_char.h" AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { __asm { mov rax,AO_TS_SET ; mov rbx,addr ; xchg byte ptr [rbx],al ; } } # define AO_HAVE_test_and_set_full # endif #endif /* AO_ASM_X64_AVAILABLE */ #ifndef AO_HAVE_test_and_set_full # include "../test_and_set_t_is_ao_t.h" /* AO_test_and_set_full() is emulated using word-wide CAS. */ #endif #ifdef AO_CMPXCHG16B_AVAILABLE # if _MSC_VER >= 1500 # include "../standard_ao_double_t.h" # pragma intrinsic (_InterlockedCompareExchange128) AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { __int64 comparandResult[2]; AO_ASSERT_ADDR_ALIGNED(addr); comparandResult[0] = old_val1; /* low */ comparandResult[1] = old_val2; /* high */ return _InterlockedCompareExchange128((volatile __int64 *)addr, new_val2 /* high */, new_val1 /* low */, comparandResult); } # define AO_HAVE_compare_double_and_swap_double_full # elif defined(AO_ASM_X64_AVAILABLE) # include "../standard_ao_double_t.h" /* If there is no intrinsic _InterlockedCompareExchange128 then we */ /* need basically what's given below. */ AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { __asm { mov rdx,QWORD PTR [old_val2] ; mov rax,QWORD PTR [old_val1] ; mov rcx,QWORD PTR [new_val2] ; mov rbx,QWORD PTR [new_val1] ; lock cmpxchg16b [addr] ; setz rax ; } } # define AO_HAVE_compare_double_and_swap_double_full # endif /* AO_ASM_X64_AVAILABLE && (_MSC_VER < 1500) */ #endif /* AO_CMPXCHG16B_AVAILABLE */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/msftc/arm64.h0000644000000000000000000001116015031566105023645 0ustar rootroot/* * Copyright (c) 2003 Hewlett-Packard Development Company, L.P. * Copyright (c) 2021 Ivan Maidanski * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include "../all_aligned_atomic_load_store.h" #ifndef AO_ASSUME_WINDOWS98 # define AO_ASSUME_WINDOWS98 #endif #ifndef AO_USE_INTERLOCKED_INTRINSICS # define AO_USE_INTERLOCKED_INTRINSICS #endif #include "common32_defs.h" #ifndef AO_HAVE_test_and_set_full # include "../test_and_set_t_is_ao_t.h" /* AO_test_and_set_full() is emulated using word-wide CAS. */ #endif #ifndef AO_NO_DOUBLE_CAS # include "../standard_ao_double_t.h" # pragma intrinsic (_InterlockedCompareExchange128) # pragma intrinsic (_InterlockedCompareExchange128_acq) # pragma intrinsic (_InterlockedCompareExchange128_nf) # pragma intrinsic (_InterlockedCompareExchange128_rel) AO_INLINE int AO_compare_double_and_swap_double(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { __int64 comparandResult[2]; AO_ASSERT_ADDR_ALIGNED(addr); comparandResult[0] = old_val1; /* low */ comparandResult[1] = old_val2; /* high */ return _InterlockedCompareExchange128_nf((volatile __int64 *)addr, new_val2 /* high */, new_val1 /* low */, comparandResult); } # define AO_HAVE_compare_double_and_swap_double AO_INLINE int AO_compare_double_and_swap_double_acquire(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { __int64 comparandResult[2]; AO_ASSERT_ADDR_ALIGNED(addr); comparandResult[0] = old_val1; /* low */ comparandResult[1] = old_val2; /* high */ return _InterlockedCompareExchange128_acq((volatile __int64 *)addr, new_val2 /* high */, new_val1 /* low */, comparandResult); } # define AO_HAVE_compare_double_and_swap_double_acquire AO_INLINE int AO_compare_double_and_swap_double_release(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { __int64 comparandResult[2]; AO_ASSERT_ADDR_ALIGNED(addr); comparandResult[0] = old_val1; /* low */ comparandResult[1] = old_val2; /* high */ return _InterlockedCompareExchange128_rel((volatile __int64 *)addr, new_val2 /* high */, new_val1 /* low */, comparandResult); } # define AO_HAVE_compare_double_and_swap_double_release AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { __int64 comparandResult[2]; AO_ASSERT_ADDR_ALIGNED(addr); comparandResult[0] = old_val1; /* low */ comparandResult[1] = old_val2; /* high */ return _InterlockedCompareExchange128((volatile __int64 *)addr, new_val2 /* high */, new_val1 /* low */, comparandResult); } # define AO_HAVE_compare_double_and_swap_double_full #endif /* !AO_NO_DOUBLE_CAS */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/msftc/common32_defs.h0000644000000000000000000011466315031566105025366 0ustar rootroot/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * Copyright (c) 2009-2021 Ivan Maidanski * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* This file contains AO primitives based on VC++ built-in intrinsic */ /* functions commonly available across 32- and 64-bit architectures. */ /* This file should be included from arch-specific header files. */ /* Define AO_USE_INTERLOCKED_INTRINSICS if _Interlocked primitives */ /* (used below) are available as intrinsic ones for a target arch */ /* (otherwise "Interlocked" functions family is used instead). */ /* Define AO_ASSUME_WINDOWS98 if CAS is available. */ #if _MSC_VER <= 1400 || !defined(AO_USE_INTERLOCKED_INTRINSICS) \ || defined(_WIN32_WCE) # include /* Seems like over-kill, but that's what MSDN recommends. */ /* And apparently winbase.h is not always self-contained. */ /* Optionally, client could define WIN32_LEAN_AND_MEAN before */ /* include atomic_ops.h to reduce amount of Windows internal */ /* headers included by windows.h one. */ #endif #if _MSC_VER < 1310 || !defined(AO_USE_INTERLOCKED_INTRINSICS) # define _InterlockedIncrement InterlockedIncrement # define _InterlockedDecrement InterlockedDecrement # define _InterlockedExchangeAdd InterlockedExchangeAdd # define _InterlockedCompareExchange InterlockedCompareExchange # define AO_INTERLOCKED_VOLATILE /**/ #else /* elif _MSC_VER >= 1310 */ # if _MSC_VER >= 1400 # ifndef _WIN32_WCE # include # endif # else /* elif _MSC_VER < 1400 */ # ifdef __cplusplus extern "C" { # endif LONG __cdecl _InterlockedIncrement(LONG volatile *); LONG __cdecl _InterlockedDecrement(LONG volatile *); LONG __cdecl _InterlockedExchangeAdd(LONG volatile *, LONG); LONG __cdecl _InterlockedCompareExchange(LONG volatile *, LONG /* Exchange */, LONG /* Comp */); # ifdef __cplusplus } /* extern "C" */ # endif # endif /* _MSC_VER < 1400 */ # if !defined(AO_PREFER_GENERALIZED) || !defined(AO_ASSUME_WINDOWS98) # pragma intrinsic (_InterlockedIncrement) # pragma intrinsic (_InterlockedDecrement) # pragma intrinsic (_InterlockedExchangeAdd) # ifndef AO_T_IS_INT # pragma intrinsic (_InterlockedIncrement64) # pragma intrinsic (_InterlockedDecrement64) # pragma intrinsic (_InterlockedExchangeAdd64) # endif # endif /* !AO_PREFER_GENERALIZED */ # pragma intrinsic (_InterlockedCompareExchange) # ifndef AO_T_IS_INT # pragma intrinsic (_InterlockedCompareExchange64) # endif # define AO_INTERLOCKED_VOLATILE volatile #endif /* _MSC_VER >= 1310 */ #if !defined(AO_PREFER_GENERALIZED) || !defined(AO_ASSUME_WINDOWS98) AO_INLINE AO_t AO_fetch_and_add_full(volatile AO_t *p, AO_t incr) { # ifdef AO_T_IS_INT return _InterlockedExchangeAdd((long AO_INTERLOCKED_VOLATILE *)p, incr); # else return _InterlockedExchangeAdd64((__int64 volatile *)p, incr); # endif } # define AO_HAVE_fetch_and_add_full AO_INLINE AO_t AO_fetch_and_add1_full(volatile AO_t *p) { # ifdef AO_T_IS_INT return _InterlockedIncrement((long AO_INTERLOCKED_VOLATILE *)p) - 1; # else return _InterlockedIncrement64((__int64 volatile *)p) - 1; # endif } # define AO_HAVE_fetch_and_add1_full AO_INLINE AO_t AO_fetch_and_sub1_full(volatile AO_t *p) { # ifdef AO_T_IS_INT return _InterlockedDecrement((long AO_INTERLOCKED_VOLATILE *)p) + 1; # else return _InterlockedDecrement64((__int64 volatile *)p) + 1; # endif } # define AO_HAVE_fetch_and_sub1_full # ifndef AO_T_IS_INT AO_INLINE unsigned int AO_int_fetch_and_add_full(volatile unsigned int *p, unsigned int incr) { return _InterlockedExchangeAdd((long volatile *)p, incr); } # define AO_HAVE_int_fetch_and_add_full AO_INLINE unsigned int AO_int_fetch_and_add1_full(volatile unsigned int *p) { return _InterlockedIncrement((long volatile *)p) - 1; } # define AO_HAVE_int_fetch_and_add1_full AO_INLINE unsigned int AO_int_fetch_and_sub1_full(volatile unsigned int *p) { return _InterlockedDecrement((long volatile *)p) + 1; } # define AO_HAVE_int_fetch_and_sub1_full # endif /* !AO_T_IS_INT */ #endif /* !AO_PREFER_GENERALIZED */ #ifdef AO_ASSUME_WINDOWS98 AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { # ifndef AO_T_IS_INT return (AO_t)_InterlockedCompareExchange64((__int64 volatile *)addr, new_val, old_val); # elif defined(AO_OLD_STYLE_INTERLOCKED_COMPARE_EXCHANGE) return (AO_t)_InterlockedCompareExchange( (void *AO_INTERLOCKED_VOLATILE *)addr, (void *)new_val, (void *)old_val); # else return _InterlockedCompareExchange((long AO_INTERLOCKED_VOLATILE *)addr, new_val, old_val); # endif } # define AO_HAVE_fetch_compare_and_swap_full # ifndef AO_T_IS_INT AO_INLINE unsigned int AO_int_fetch_compare_and_swap_full(volatile unsigned int *addr, unsigned int old_val, unsigned int new_val) { return _InterlockedCompareExchange((long volatile *)addr, new_val, old_val); } # define AO_HAVE_int_fetch_compare_and_swap_full # endif /* !AO_T_IS_INT */ #endif /* AO_ASSUME_WINDOWS98 */ #if (_MSC_VER > 1400) && (!defined(_M_ARM) || _MSC_VER >= 1800) # if _MSC_VER < 1800 || !defined(AO_PREFER_GENERALIZED) # pragma intrinsic (_InterlockedAnd8) # pragma intrinsic (_InterlockedOr8) # pragma intrinsic (_InterlockedXor8) AO_INLINE void AO_char_and_full(volatile unsigned char *p, unsigned char value) { _InterlockedAnd8((char volatile *)p, value); } # define AO_HAVE_char_and_full AO_INLINE void AO_char_or_full(volatile unsigned char *p, unsigned char value) { _InterlockedOr8((char volatile *)p, value); } # define AO_HAVE_char_or_full AO_INLINE void AO_char_xor_full(volatile unsigned char *p, unsigned char value) { _InterlockedXor8((char volatile *)p, value); } # define AO_HAVE_char_xor_full # endif /* _MSC_VER < 1800 || !AO_PREFER_GENERALIZED */ # pragma intrinsic (_InterlockedCompareExchange16) AO_INLINE unsigned short AO_short_fetch_compare_and_swap_full(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { return _InterlockedCompareExchange16((short volatile *)addr, new_val, old_val); } # define AO_HAVE_short_fetch_compare_and_swap_full # ifndef AO_PREFER_GENERALIZED # pragma intrinsic (_InterlockedIncrement16) # pragma intrinsic (_InterlockedDecrement16) AO_INLINE unsigned short AO_short_fetch_and_add1_full(volatile unsigned short *p) { return _InterlockedIncrement16((short volatile *)p) - 1; } # define AO_HAVE_short_fetch_and_add1_full AO_INLINE unsigned short AO_short_fetch_and_sub1_full(volatile unsigned short *p) { return _InterlockedDecrement16((short volatile *)p) + 1; } # define AO_HAVE_short_fetch_and_sub1_full # endif /* !AO_PREFER_GENERALIZED */ #endif /* _MSC_VER > 1400 */ #if _MSC_VER >= 1800 /* Visual Studio 2013+ */ # ifndef AO_PREFER_GENERALIZED # pragma intrinsic (_InterlockedAnd16) # pragma intrinsic (_InterlockedOr16) # pragma intrinsic (_InterlockedXor16) AO_INLINE void AO_short_and_full(volatile unsigned short *p, unsigned short value) { (void)_InterlockedAnd16((short volatile *)p, value); } # define AO_HAVE_short_and_full AO_INLINE void AO_short_or_full(volatile unsigned short *p, unsigned short value) { (void)_InterlockedOr16((short volatile *)p, value); } # define AO_HAVE_short_or_full AO_INLINE void AO_short_xor_full(volatile unsigned short *p, unsigned short value) { (void)_InterlockedXor16((short volatile *)p, value); } # define AO_HAVE_short_xor_full # pragma intrinsic (_InterlockedAnd) # pragma intrinsic (_InterlockedOr) # pragma intrinsic (_InterlockedXor) # ifndef AO_T_IS_INT AO_INLINE void AO_int_and_full(volatile unsigned int *p, unsigned int value) { (void)_InterlockedAnd((long volatile *)p, value); } # define AO_HAVE_int_and_full AO_INLINE void AO_int_or_full(volatile unsigned int *p, unsigned int value) { (void)_InterlockedOr((long volatile *)p, value); } # define AO_HAVE_int_or_full AO_INLINE void AO_int_xor_full(volatile unsigned int *p, unsigned int value) { (void)_InterlockedXor((long volatile *)p, value); } # define AO_HAVE_int_xor_full # pragma intrinsic (_InterlockedAnd64) # pragma intrinsic (_InterlockedOr64) # pragma intrinsic (_InterlockedXor64) # endif /* !AO_T_IS_INT */ AO_INLINE void AO_and_full(volatile AO_t *p, AO_t value) { # ifdef AO_T_IS_INT (void)_InterlockedAnd((long volatile *)p, value); # else (void)_InterlockedAnd64((__int64 volatile *)p, value); # endif } # define AO_HAVE_and_full AO_INLINE void AO_or_full(volatile AO_t *p, AO_t value) { # ifdef AO_T_IS_INT (void)_InterlockedOr((long volatile *)p, value); # else (void)_InterlockedOr64((__int64 volatile *)p, value); # endif } # define AO_HAVE_or_full AO_INLINE void AO_xor_full(volatile AO_t *p, AO_t value) { # ifdef AO_T_IS_INT (void)_InterlockedXor((long volatile *)p, value); # else (void)_InterlockedXor64((__int64 volatile *)p, value); # endif } # define AO_HAVE_xor_full # endif /* !AO_PREFER_GENERALIZED */ # if !defined(AO_PREFER_GENERALIZED) && (defined(_M_ARM) || defined(_M_ARM64)) # pragma intrinsic (_InterlockedAnd8_acq) # pragma intrinsic (_InterlockedAnd8_nf) # pragma intrinsic (_InterlockedAnd8_rel) # pragma intrinsic (_InterlockedOr8_acq) # pragma intrinsic (_InterlockedOr8_nf) # pragma intrinsic (_InterlockedOr8_rel) # pragma intrinsic (_InterlockedXor8_acq) # pragma intrinsic (_InterlockedXor8_nf) # pragma intrinsic (_InterlockedXor8_rel) AO_INLINE void AO_char_and(volatile unsigned char *p, unsigned char value) { _InterlockedAnd8_nf((char volatile *)p, value); } # define AO_HAVE_char_and AO_INLINE void AO_char_or(volatile unsigned char *p, unsigned char value) { _InterlockedOr8_nf((char volatile *)p, value); } # define AO_HAVE_char_or AO_INLINE void AO_char_xor(volatile unsigned char *p, unsigned char value) { _InterlockedXor8_nf((char volatile *)p, value); } # define AO_HAVE_char_xor AO_INLINE void AO_char_and_acquire(volatile unsigned char *p, unsigned char value) { _InterlockedAnd8_acq((char volatile *)p, value); } # define AO_HAVE_char_and_acquire AO_INLINE void AO_char_or_acquire(volatile unsigned char *p, unsigned char value) { _InterlockedOr8_acq((char volatile *)p, value); } # define AO_HAVE_char_or_acquire AO_INLINE void AO_char_xor_acquire(volatile unsigned char *p, unsigned char value) { _InterlockedXor8_acq((char volatile *)p, value); } # define AO_HAVE_char_xor_acquire AO_INLINE void AO_char_and_release(volatile unsigned char *p, unsigned char value) { _InterlockedAnd8_rel((char volatile *)p, value); } # define AO_HAVE_char_and_release AO_INLINE void AO_char_or_release(volatile unsigned char *p, unsigned char value) { _InterlockedOr8_rel((char volatile *)p, value); } # define AO_HAVE_char_or_release AO_INLINE void AO_char_xor_release(volatile unsigned char *p, unsigned char value) { _InterlockedXor8_rel((char volatile *)p, value); } # define AO_HAVE_char_xor_release # pragma intrinsic (_InterlockedAnd16_acq) # pragma intrinsic (_InterlockedAnd16_nf) # pragma intrinsic (_InterlockedAnd16_rel) # pragma intrinsic (_InterlockedOr16_acq) # pragma intrinsic (_InterlockedOr16_nf) # pragma intrinsic (_InterlockedOr16_rel) # pragma intrinsic (_InterlockedXor16_acq) # pragma intrinsic (_InterlockedXor16_nf) # pragma intrinsic (_InterlockedXor16_rel) AO_INLINE void AO_short_and(volatile unsigned short *p, unsigned short value) { (void)_InterlockedAnd16_nf((short volatile *)p, value); } # define AO_HAVE_short_and AO_INLINE void AO_short_or(volatile unsigned short *p, unsigned short value) { (void)_InterlockedOr16_nf((short volatile *)p, value); } # define AO_HAVE_short_or AO_INLINE void AO_short_xor(volatile unsigned short *p, unsigned short value) { (void)_InterlockedXor16_nf((short volatile *)p, value); } # define AO_HAVE_short_xor AO_INLINE void AO_short_and_acquire(volatile unsigned short *p, unsigned short value) { (void)_InterlockedAnd16_acq((short volatile *)p, value); } # define AO_HAVE_short_and_acquire AO_INLINE void AO_short_or_acquire(volatile unsigned short *p, unsigned short value) { (void)_InterlockedOr16_acq((short volatile *)p, value); } # define AO_HAVE_short_or_acquire AO_INLINE void AO_short_xor_acquire(volatile unsigned short *p, unsigned short value) { (void)_InterlockedXor16_acq((short volatile *)p, value); } # define AO_HAVE_short_xor_acquire AO_INLINE void AO_short_and_release(volatile unsigned short *p, unsigned short value) { (void)_InterlockedAnd16_rel((short volatile *)p, value); } # define AO_HAVE_short_and_release AO_INLINE void AO_short_or_release(volatile unsigned short *p, unsigned short value) { (void)_InterlockedOr16_rel((short volatile *)p, value); } # define AO_HAVE_short_or_release AO_INLINE void AO_short_xor_release(volatile unsigned short *p, unsigned short value) { (void)_InterlockedXor16_rel((short volatile *)p, value); } # define AO_HAVE_short_xor_release # pragma intrinsic (_InterlockedAnd_acq) # pragma intrinsic (_InterlockedAnd_nf) # pragma intrinsic (_InterlockedAnd_rel) # pragma intrinsic (_InterlockedOr_acq) # pragma intrinsic (_InterlockedOr_nf) # pragma intrinsic (_InterlockedOr_rel) # pragma intrinsic (_InterlockedXor_acq) # pragma intrinsic (_InterlockedXor_nf) # pragma intrinsic (_InterlockedXor_rel) # ifndef AO_T_IS_INT AO_INLINE void AO_int_and(volatile unsigned int *p, unsigned int value) { (void)_InterlockedAnd_nf((long volatile *)p, value); } # define AO_HAVE_int_and AO_INLINE void AO_int_or(volatile unsigned int *p, unsigned int value) { (void)_InterlockedOr_nf((long volatile *)p, value); } # define AO_HAVE_int_or AO_INLINE void AO_int_xor(volatile unsigned int *p, unsigned int value) { (void)_InterlockedXor_nf((long volatile *)p, value); } # define AO_HAVE_int_xor AO_INLINE void AO_int_and_acquire(volatile unsigned int *p, unsigned int value) { (void)_InterlockedAnd_acq((long volatile *)p, value); } # define AO_HAVE_int_and_acquire AO_INLINE void AO_int_or_acquire(volatile unsigned int *p, unsigned int value) { (void)_InterlockedOr_acq((long volatile *)p, value); } # define AO_HAVE_int_or_acquire AO_INLINE void AO_int_xor_acquire(volatile unsigned int *p, unsigned int value) { (void)_InterlockedXor_acq((long volatile *)p, value); } # define AO_HAVE_int_xor_acquire AO_INLINE void AO_int_and_release(volatile unsigned int *p, unsigned int value) { (void)_InterlockedAnd_rel((long volatile *)p, value); } # define AO_HAVE_int_and_release AO_INLINE void AO_int_or_release(volatile unsigned int *p, unsigned int value) { (void)_InterlockedOr_rel((long volatile *)p, value); } # define AO_HAVE_int_or_release AO_INLINE void AO_int_xor_release(volatile unsigned int *p, unsigned int value) { (void)_InterlockedXor_rel((long volatile *)p, value); } # define AO_HAVE_int_xor_release # pragma intrinsic (_InterlockedAnd64_acq) # pragma intrinsic (_InterlockedAnd64_nf) # pragma intrinsic (_InterlockedAnd64_rel) # pragma intrinsic (_InterlockedOr64_acq) # pragma intrinsic (_InterlockedOr64_nf) # pragma intrinsic (_InterlockedOr64_rel) # pragma intrinsic (_InterlockedXor64_acq) # pragma intrinsic (_InterlockedXor64_nf) # pragma intrinsic (_InterlockedXor64_rel) # endif /* !AO_T_IS_INT */ AO_INLINE void AO_and(volatile AO_t *p, AO_t value) { # ifdef AO_T_IS_INT (void)_InterlockedAnd_nf((long volatile *)p, value); # else (void)_InterlockedAnd64_nf((__int64 volatile *)p, value); # endif } # define AO_HAVE_and AO_INLINE void AO_or(volatile AO_t *p, AO_t value) { # ifdef AO_T_IS_INT (void)_InterlockedOr_nf((long volatile *)p, value); # else (void)_InterlockedOr64_nf((__int64 volatile *)p, value); # endif } # define AO_HAVE_or AO_INLINE void AO_xor(volatile AO_t *p, AO_t value) { # ifdef AO_T_IS_INT (void)_InterlockedXor_nf((long volatile *)p, value); # else (void)_InterlockedXor64_nf((__int64 volatile *)p, value); # endif } # define AO_HAVE_xor AO_INLINE void AO_and_acquire(volatile AO_t *p, AO_t value) { # ifdef AO_T_IS_INT (void)_InterlockedAnd_acq((long volatile *)p, value); # else (void)_InterlockedAnd64_acq((__int64 volatile *)p, value); # endif } # define AO_HAVE_and_acquire AO_INLINE void AO_or_acquire(volatile AO_t *p, AO_t value) { # ifdef AO_T_IS_INT (void)_InterlockedOr_acq((long volatile *)p, value); # else (void)_InterlockedOr64_acq((__int64 volatile *)p, value); # endif } # define AO_HAVE_or_acquire AO_INLINE void AO_xor_acquire(volatile AO_t *p, AO_t value) { # ifdef AO_T_IS_INT (void)_InterlockedXor_acq((long volatile *)p, value); # else (void)_InterlockedXor64_acq((__int64 volatile *)p, value); # endif } # define AO_HAVE_xor_acquire AO_INLINE void AO_and_release(volatile AO_t *p, AO_t value) { # ifdef AO_T_IS_INT (void)_InterlockedAnd_rel((long volatile *)p, value); # else (void)_InterlockedAnd64_rel((__int64 volatile *)p, value); # endif } # define AO_HAVE_and_release AO_INLINE void AO_or_release(volatile AO_t *p, AO_t value) { # ifdef AO_T_IS_INT (void)_InterlockedOr_rel((long volatile *)p, value); # else (void)_InterlockedOr64_rel((__int64 volatile *)p, value); # endif } # define AO_HAVE_or_release AO_INLINE void AO_xor_release(volatile AO_t *p, AO_t value) { # ifdef AO_T_IS_INT (void)_InterlockedXor_rel((long volatile *)p, value); # else (void)_InterlockedXor64_rel((__int64 volatile *)p, value); # endif } # define AO_HAVE_xor_release # pragma intrinsic (_InterlockedDecrement16_acq) # pragma intrinsic (_InterlockedDecrement16_nf) # pragma intrinsic (_InterlockedDecrement16_rel) # pragma intrinsic (_InterlockedIncrement16_acq) # pragma intrinsic (_InterlockedIncrement16_nf) # pragma intrinsic (_InterlockedIncrement16_rel) AO_INLINE unsigned short AO_short_fetch_and_add1(volatile unsigned short *p) { return _InterlockedIncrement16_nf((short volatile *)p) - 1; } # define AO_HAVE_short_fetch_and_add1 AO_INLINE unsigned short AO_short_fetch_and_sub1(volatile unsigned short *p) { return _InterlockedDecrement16_nf((short volatile *)p) + 1; } # define AO_HAVE_short_fetch_and_sub1 AO_INLINE unsigned short AO_short_fetch_and_add1_acquire(volatile unsigned short *p) { return _InterlockedIncrement16_acq((short volatile *)p) - 1; } # define AO_HAVE_short_fetch_and_add1_acquire AO_INLINE unsigned short AO_short_fetch_and_sub1_acquire(volatile unsigned short *p) { return _InterlockedDecrement16_acq((short volatile *)p) + 1; } # define AO_HAVE_short_fetch_and_sub1_acquire AO_INLINE unsigned short AO_short_fetch_and_add1_release(volatile unsigned short *p) { return _InterlockedIncrement16_rel((short volatile *)p) - 1; } # define AO_HAVE_short_fetch_and_add1_release AO_INLINE unsigned short AO_short_fetch_and_sub1_release(volatile unsigned short *p) { return _InterlockedDecrement16_rel((short volatile *)p) + 1; } # define AO_HAVE_short_fetch_and_sub1_release # pragma intrinsic (_InterlockedExchangeAdd_acq) # pragma intrinsic (_InterlockedExchangeAdd_nf) # pragma intrinsic (_InterlockedExchangeAdd_rel) # pragma intrinsic (_InterlockedDecrement_acq) # pragma intrinsic (_InterlockedDecrement_nf) # pragma intrinsic (_InterlockedDecrement_rel) # pragma intrinsic (_InterlockedIncrement_acq) # pragma intrinsic (_InterlockedIncrement_nf) # pragma intrinsic (_InterlockedIncrement_rel) # ifndef AO_T_IS_INT # pragma intrinsic (_InterlockedExchangeAdd64_acq) # pragma intrinsic (_InterlockedExchangeAdd64_nf) # pragma intrinsic (_InterlockedExchangeAdd64_rel) # pragma intrinsic (_InterlockedDecrement64_acq) # pragma intrinsic (_InterlockedDecrement64_nf) # pragma intrinsic (_InterlockedDecrement64_rel) # pragma intrinsic (_InterlockedIncrement64_acq) # pragma intrinsic (_InterlockedIncrement64_nf) # pragma intrinsic (_InterlockedIncrement64_rel) # endif AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *p, AO_t incr) { # ifdef AO_T_IS_INT return _InterlockedExchangeAdd_nf((long volatile *)p, incr); # else return _InterlockedExchangeAdd64_nf((__int64 volatile *)p, incr); # endif } # define AO_HAVE_fetch_and_add AO_INLINE AO_t AO_fetch_and_add1(volatile AO_t *p) { # ifdef AO_T_IS_INT return _InterlockedIncrement_nf((long volatile *)p) - 1; # else return _InterlockedIncrement64_nf((__int64 volatile *)p) - 1; # endif } # define AO_HAVE_fetch_and_add1 AO_INLINE AO_t AO_fetch_and_sub1(volatile AO_t *p) { # ifdef AO_T_IS_INT return _InterlockedDecrement_nf((long volatile *)p) + 1; # else return _InterlockedDecrement64_nf((__int64 volatile *)p) + 1; # endif } # define AO_HAVE_fetch_and_sub1 AO_INLINE AO_t AO_fetch_and_add_acquire(volatile AO_t *p, AO_t incr) { # ifdef AO_T_IS_INT return _InterlockedExchangeAdd_acq((long volatile *)p, incr); # else return _InterlockedExchangeAdd64_acq((__int64 volatile *)p, incr); # endif } # define AO_HAVE_fetch_and_add_acquire AO_INLINE AO_t AO_fetch_and_add1_acquire(volatile AO_t *p) { # ifdef AO_T_IS_INT return _InterlockedIncrement_acq((long volatile *)p) - 1; # else return _InterlockedIncrement64_acq((__int64 volatile *)p) - 1; # endif } # define AO_HAVE_fetch_and_add1_acquire AO_INLINE AO_t AO_fetch_and_sub1_acquire(volatile AO_t *p) { # ifdef AO_T_IS_INT return _InterlockedDecrement_acq((long volatile *)p) + 1; # else return _InterlockedDecrement64_acq((__int64 volatile *)p) + 1; # endif } # define AO_HAVE_fetch_and_sub1_acquire AO_INLINE AO_t AO_fetch_and_add_release(volatile AO_t *p, AO_t incr) { # ifdef AO_T_IS_INT return _InterlockedExchangeAdd_rel((long volatile *)p, incr); # else return _InterlockedExchangeAdd64_rel((__int64 volatile *)p, incr); # endif } # define AO_HAVE_fetch_and_add_release AO_INLINE AO_t AO_fetch_and_add1_release(volatile AO_t *p) { # ifdef AO_T_IS_INT return _InterlockedIncrement_rel((long volatile *)p) - 1; # else return _InterlockedIncrement64_rel((__int64 volatile *)p) - 1; # endif } # define AO_HAVE_fetch_and_add1_release AO_INLINE AO_t AO_fetch_and_sub1_release(volatile AO_t *p) { # ifdef AO_T_IS_INT return _InterlockedDecrement_rel((long volatile *)p) + 1; # else return _InterlockedDecrement64_rel((__int64 volatile *)p) + 1; # endif } # define AO_HAVE_fetch_and_sub1_release # ifndef AO_T_IS_INT AO_INLINE unsigned int AO_int_fetch_and_add(volatile unsigned int *p, unsigned int incr) { return _InterlockedExchangeAdd_nf((long volatile *)p, incr); } # define AO_HAVE_int_fetch_and_add AO_INLINE unsigned int AO_int_fetch_and_add1(volatile unsigned int *p) { return _InterlockedIncrement_nf((long volatile *)p) - 1; } # define AO_HAVE_int_fetch_and_add1 AO_INLINE unsigned int AO_int_fetch_and_sub1(volatile unsigned int *p) { return _InterlockedDecrement_nf((long volatile *)p) + 1; } # define AO_HAVE_int_fetch_and_sub1 AO_INLINE unsigned int AO_int_fetch_and_add_acquire(volatile unsigned int *p, unsigned int incr) { return _InterlockedExchangeAdd_acq((long volatile *)p, incr); } # define AO_HAVE_int_fetch_and_add_acquire AO_INLINE unsigned int AO_int_fetch_and_add1_acquire(volatile unsigned int *p) { return _InterlockedIncrement_acq((long volatile *)p) - 1; } # define AO_HAVE_int_fetch_and_add1_acquire AO_INLINE unsigned int AO_int_fetch_and_sub1_acquire(volatile unsigned int *p) { return _InterlockedDecrement_acq((long volatile *)p) + 1; } # define AO_HAVE_int_fetch_and_sub1_acquire AO_INLINE unsigned int AO_int_fetch_and_add_release(volatile unsigned int *p, unsigned int incr) { return _InterlockedExchangeAdd_rel((long volatile *)p, incr); } # define AO_HAVE_int_fetch_and_add_release AO_INLINE unsigned int AO_int_fetch_and_add1_release(volatile unsigned int *p) { return _InterlockedIncrement_rel((long volatile *)p) - 1; } # define AO_HAVE_int_fetch_and_add1_release AO_INLINE unsigned int AO_int_fetch_and_sub1_release(volatile unsigned int *p) { return _InterlockedDecrement_rel((long volatile *)p) + 1; } # define AO_HAVE_int_fetch_and_sub1_release # endif /* !AO_T_IS_INT */ # endif /* !AO_PREFER_GENERALIZED && (_M_ARM || _M_ARM64) */ # pragma intrinsic (_InterlockedCompareExchange8) AO_INLINE unsigned char AO_char_fetch_compare_and_swap_full(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { return _InterlockedCompareExchange8((char volatile *)addr, new_val, old_val); } # define AO_HAVE_char_fetch_compare_and_swap_full # if defined(_M_ARM) || defined(_M_ARM64) # pragma intrinsic (_InterlockedCompareExchange_acq) # pragma intrinsic (_InterlockedCompareExchange_nf) # pragma intrinsic (_InterlockedCompareExchange_rel) # ifndef AO_T_IS_INT # pragma intrinsic (_InterlockedCompareExchange64_acq) # pragma intrinsic (_InterlockedCompareExchange64_nf) # pragma intrinsic (_InterlockedCompareExchange64_rel) # endif AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { # ifdef AO_T_IS_INT return _InterlockedCompareExchange_nf((long volatile *)addr, new_val, old_val); # else return (AO_t)_InterlockedCompareExchange64_nf( (__int64 volatile *)addr, new_val, old_val); # endif } # define AO_HAVE_fetch_compare_and_swap AO_INLINE AO_t AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { # ifdef AO_T_IS_INT return _InterlockedCompareExchange_acq((long volatile *)addr, new_val, old_val); # else return (AO_t)_InterlockedCompareExchange64_acq( (__int64 volatile *)addr, new_val, old_val); # endif } # define AO_HAVE_fetch_compare_and_swap_acquire AO_INLINE AO_t AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { # ifdef AO_T_IS_INT return _InterlockedCompareExchange_rel((long volatile *)addr, new_val, old_val); # else return (AO_t)_InterlockedCompareExchange64_rel( (__int64 volatile *)addr, new_val, old_val); # endif } # define AO_HAVE_fetch_compare_and_swap_release # ifndef AO_T_IS_INT AO_INLINE unsigned int AO_int_fetch_compare_and_swap(volatile unsigned int *addr, unsigned int old_val, unsigned int new_val) { return _InterlockedCompareExchange_nf((long volatile *)addr, new_val, old_val); } # define AO_HAVE_int_fetch_compare_and_swap AO_INLINE unsigned int AO_int_fetch_compare_and_swap_acquire(volatile unsigned int *addr, unsigned int old_val, unsigned int new_val) { return _InterlockedCompareExchange_acq((long volatile *)addr, new_val, old_val); } # define AO_HAVE_int_fetch_compare_and_swap_acquire AO_INLINE unsigned int AO_int_fetch_compare_and_swap_release(volatile unsigned int *addr, unsigned int old_val, unsigned int new_val) { return _InterlockedCompareExchange_rel((long volatile *)addr, new_val, old_val); } # define AO_HAVE_int_fetch_compare_and_swap_release # endif /* !AO_T_IS_INT */ # pragma intrinsic (_InterlockedCompareExchange16_acq) # pragma intrinsic (_InterlockedCompareExchange16_nf) # pragma intrinsic (_InterlockedCompareExchange16_rel) # pragma intrinsic (_InterlockedCompareExchange8_acq) # pragma intrinsic (_InterlockedCompareExchange8_nf) # pragma intrinsic (_InterlockedCompareExchange8_rel) AO_INLINE unsigned short AO_short_fetch_compare_and_swap(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { return _InterlockedCompareExchange16_nf((short volatile *)addr, new_val, old_val); } # define AO_HAVE_short_fetch_compare_and_swap AO_INLINE unsigned short AO_short_fetch_compare_and_swap_acquire(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { return _InterlockedCompareExchange16_acq((short volatile *)addr, new_val, old_val); } # define AO_HAVE_short_fetch_compare_and_swap_acquire AO_INLINE unsigned short AO_short_fetch_compare_and_swap_release(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { return _InterlockedCompareExchange16_rel((short volatile *)addr, new_val, old_val); } # define AO_HAVE_short_fetch_compare_and_swap_release AO_INLINE unsigned char AO_char_fetch_compare_and_swap(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { return _InterlockedCompareExchange8_nf((char volatile *)addr, new_val, old_val); } # define AO_HAVE_char_fetch_compare_and_swap AO_INLINE unsigned char AO_char_fetch_compare_and_swap_acquire(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { return _InterlockedCompareExchange8_acq((char volatile *)addr, new_val, old_val); } # define AO_HAVE_char_fetch_compare_and_swap_acquire AO_INLINE unsigned char AO_char_fetch_compare_and_swap_release(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { return _InterlockedCompareExchange8_rel((char volatile *)addr, new_val, old_val); } # define AO_HAVE_char_fetch_compare_and_swap_release # endif /* _M_ARM || _M_ARM64 */ # if !defined(AO_PREFER_GENERALIZED) && !defined(_M_ARM) # pragma intrinsic (_InterlockedExchangeAdd16) # pragma intrinsic (_InterlockedExchangeAdd8) AO_INLINE unsigned char AO_char_fetch_and_add_full(volatile unsigned char *p, unsigned char incr) { return _InterlockedExchangeAdd8((char volatile *)p, incr); } # define AO_HAVE_char_fetch_and_add_full AO_INLINE unsigned short AO_short_fetch_and_add_full(volatile unsigned short *p, unsigned short incr) { return _InterlockedExchangeAdd16((short volatile *)p, incr); } # define AO_HAVE_short_fetch_and_add_full # if defined(_M_ARM64) # pragma intrinsic (_InterlockedExchangeAdd16_acq) # pragma intrinsic (_InterlockedExchangeAdd16_nf) # pragma intrinsic (_InterlockedExchangeAdd16_rel) # pragma intrinsic (_InterlockedExchangeAdd8_acq) # pragma intrinsic (_InterlockedExchangeAdd8_nf) # pragma intrinsic (_InterlockedExchangeAdd8_rel) AO_INLINE unsigned char AO_char_fetch_and_add(volatile unsigned char *p, unsigned char incr) { return _InterlockedExchangeAdd8_nf((char volatile *)p, incr); } # define AO_HAVE_char_fetch_and_add AO_INLINE unsigned short AO_short_fetch_and_add(volatile unsigned short *p, unsigned short incr) { return _InterlockedExchangeAdd16_nf((short volatile *)p, incr); } # define AO_HAVE_short_fetch_and_add AO_INLINE unsigned char AO_char_fetch_and_add_acquire(volatile unsigned char *p, unsigned char incr) { return _InterlockedExchangeAdd8_acq((char volatile *)p, incr); } # define AO_HAVE_char_fetch_and_add_acquire AO_INLINE unsigned short AO_short_fetch_and_add_acquire(volatile unsigned short *p, unsigned short incr) { return _InterlockedExchangeAdd16_acq((short volatile *)p, incr); } # define AO_HAVE_short_fetch_and_add_acquire AO_INLINE unsigned char AO_char_fetch_and_add_release(volatile unsigned char *p, unsigned char incr) { return _InterlockedExchangeAdd8_rel((char volatile *)p, incr); } # define AO_HAVE_char_fetch_and_add_release AO_INLINE unsigned short AO_short_fetch_and_add_release(volatile unsigned short *p, unsigned short incr) { return _InterlockedExchangeAdd16_rel((short volatile *)p, incr); } # define AO_HAVE_short_fetch_and_add_release # endif /* _M_ARM64 */ # endif /* !AO_PREFER_GENERALIZED && !_M_ARM */ # if !defined(_M_ARM) || _M_ARM >= 6 # include "../test_and_set_t_is_char.h" # pragma intrinsic (_InterlockedExchange8) AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { return (AO_TS_VAL_t)(_InterlockedExchange8((char volatile *)addr, (AO_TS_t)AO_TS_SET) & 0xff); /* Note: bitwise "and 0xff" is applied to the result because cast */ /* to unsigned char does not work properly (for a reason) if /J */ /* option is passed to the MS VC compiler. */ } # define AO_HAVE_test_and_set_full # endif /* !_M_ARM || _M_ARM >= 6 */ # if _M_ARM >= 6 || defined(_M_ARM64) # pragma intrinsic (_InterlockedExchange8_acq) # pragma intrinsic (_InterlockedExchange8_nf) # pragma intrinsic (_InterlockedExchange8_rel) AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { return (AO_TS_VAL_t)(_InterlockedExchange8_nf((char volatile *)addr, (AO_TS_t)AO_TS_SET) & 0xff); } # define AO_HAVE_test_and_set AO_INLINE AO_TS_VAL_t AO_test_and_set_acquire(volatile AO_TS_t *addr) { return (AO_TS_VAL_t)(_InterlockedExchange8_acq((char volatile *)addr, (AO_TS_t)AO_TS_SET) & 0xff); } # define AO_HAVE_test_and_set_acquire AO_INLINE AO_TS_VAL_t AO_test_and_set_release(volatile AO_TS_t *addr) { return (AO_TS_VAL_t)(_InterlockedExchange8_rel((char volatile *)addr, (AO_TS_t)AO_TS_SET) & 0xff); } # define AO_HAVE_test_and_set_release # endif /* _M_ARM >= 6 || _M_ARM64 */ #endif /* _MSC_VER >= 1800 */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/ordered_except_wr.h0000644000000000000000000000336515031566105025314 0ustar rootroot/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * These are common definitions for architectures that provide processor * ordered memory operations except that a later read may pass an * earlier write. Real x86 implementations seem to be in this category, * except apparently for some IDT WinChips, which we ignore. */ #include "read_ordered.h" AO_INLINE void AO_nop_write(void) { /* AO_nop_write implementation is the same as of AO_nop_read. */ AO_compiler_barrier(); /* sfence according to Intel docs. Pentium 3 and up. */ /* Unnecessary for cached accesses? */ } #define AO_HAVE_nop_write #include "loadstore/ordered_stores_only.h" asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_load_store.h0000644000000000000000000000303715031566105026123 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Describes architectures on which AO_t, unsigned char, unsigned */ /* short, and unsigned int loads and stores are atomic for all normally */ /* legal alignments. */ #include "all_atomic_only_load.h" #include "loadstore/atomic_store.h" #include "loadstore/char_atomic_store.h" #include "loadstore/short_atomic_store.h" #include "loadstore/int_atomic_store.h" asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.h0000644000000000000000000005604015031566105024075 0ustar rootroot/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Inclusion of this file signifies that AO_t is in fact int. */ /* Hence any AO_... operation can also serve as AO_int_... operation. */ #if defined(AO_HAVE_load) && !defined(AO_HAVE_int_load) # define AO_int_load(addr) \ (unsigned)AO_load((const volatile AO_t *)(addr)) # define AO_HAVE_int_load #endif #if defined(AO_HAVE_store) && !defined(AO_HAVE_int_store) # define AO_int_store(addr, val) \ AO_store((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_store #endif #if defined(AO_HAVE_fetch_and_add) \ && !defined(AO_HAVE_int_fetch_and_add) # define AO_int_fetch_and_add(addr, incr) \ (unsigned)AO_fetch_and_add((volatile AO_t *)(addr), \ (AO_t)(incr)) # define AO_HAVE_int_fetch_and_add #endif #if defined(AO_HAVE_fetch_and_add1) \ && !defined(AO_HAVE_int_fetch_and_add1) # define AO_int_fetch_and_add1(addr) \ (unsigned)AO_fetch_and_add1((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_add1 #endif #if defined(AO_HAVE_fetch_and_sub1) \ && !defined(AO_HAVE_int_fetch_and_sub1) # define AO_int_fetch_and_sub1(addr) \ (unsigned)AO_fetch_and_sub1((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_sub1 #endif #if defined(AO_HAVE_and) && !defined(AO_HAVE_int_and) # define AO_int_and(addr, val) \ AO_and((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_and #endif #if defined(AO_HAVE_or) && !defined(AO_HAVE_int_or) # define AO_int_or(addr, val) \ AO_or((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_or #endif #if defined(AO_HAVE_xor) && !defined(AO_HAVE_int_xor) # define AO_int_xor(addr, val) \ AO_xor((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_xor #endif #if defined(AO_HAVE_fetch_compare_and_swap) \ && !defined(AO_HAVE_int_fetch_compare_and_swap) # define AO_int_fetch_compare_and_swap(addr, old, new_val) \ (unsigned)AO_fetch_compare_and_swap((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_fetch_compare_and_swap #endif #if defined(AO_HAVE_compare_and_swap) \ && !defined(AO_HAVE_int_compare_and_swap) # define AO_int_compare_and_swap(addr, old, new_val) \ AO_compare_and_swap((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_compare_and_swap #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Inclusion of this file signifies that AO_t is in fact int. */ /* Hence any AO_... operation can also serve as AO_int_... operation. */ #if defined(AO_HAVE_load_full) && !defined(AO_HAVE_int_load_full) # define AO_int_load_full(addr) \ (unsigned)AO_load_full((const volatile AO_t *)(addr)) # define AO_HAVE_int_load_full #endif #if defined(AO_HAVE_store_full) && !defined(AO_HAVE_int_store_full) # define AO_int_store_full(addr, val) \ AO_store_full((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_store_full #endif #if defined(AO_HAVE_fetch_and_add_full) \ && !defined(AO_HAVE_int_fetch_and_add_full) # define AO_int_fetch_and_add_full(addr, incr) \ (unsigned)AO_fetch_and_add_full((volatile AO_t *)(addr), \ (AO_t)(incr)) # define AO_HAVE_int_fetch_and_add_full #endif #if defined(AO_HAVE_fetch_and_add1_full) \ && !defined(AO_HAVE_int_fetch_and_add1_full) # define AO_int_fetch_and_add1_full(addr) \ (unsigned)AO_fetch_and_add1_full((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_add1_full #endif #if defined(AO_HAVE_fetch_and_sub1_full) \ && !defined(AO_HAVE_int_fetch_and_sub1_full) # define AO_int_fetch_and_sub1_full(addr) \ (unsigned)AO_fetch_and_sub1_full((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_sub1_full #endif #if defined(AO_HAVE_and_full) && !defined(AO_HAVE_int_and_full) # define AO_int_and_full(addr, val) \ AO_and_full((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_and_full #endif #if defined(AO_HAVE_or_full) && !defined(AO_HAVE_int_or_full) # define AO_int_or_full(addr, val) \ AO_or_full((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_or_full #endif #if defined(AO_HAVE_xor_full) && !defined(AO_HAVE_int_xor_full) # define AO_int_xor_full(addr, val) \ AO_xor_full((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_xor_full #endif #if defined(AO_HAVE_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_full) # define AO_int_fetch_compare_and_swap_full(addr, old, new_val) \ (unsigned)AO_fetch_compare_and_swap_full((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_fetch_compare_and_swap_full #endif #if defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_int_compare_and_swap_full) # define AO_int_compare_and_swap_full(addr, old, new_val) \ AO_compare_and_swap_full((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_compare_and_swap_full #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Inclusion of this file signifies that AO_t is in fact int. */ /* Hence any AO_... operation can also serve as AO_int_... operation. */ #if defined(AO_HAVE_load_acquire) && !defined(AO_HAVE_int_load_acquire) # define AO_int_load_acquire(addr) \ (unsigned)AO_load_acquire((const volatile AO_t *)(addr)) # define AO_HAVE_int_load_acquire #endif #if defined(AO_HAVE_store_acquire) && !defined(AO_HAVE_int_store_acquire) # define AO_int_store_acquire(addr, val) \ AO_store_acquire((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_store_acquire #endif #if defined(AO_HAVE_fetch_and_add_acquire) \ && !defined(AO_HAVE_int_fetch_and_add_acquire) # define AO_int_fetch_and_add_acquire(addr, incr) \ (unsigned)AO_fetch_and_add_acquire((volatile AO_t *)(addr), \ (AO_t)(incr)) # define AO_HAVE_int_fetch_and_add_acquire #endif #if defined(AO_HAVE_fetch_and_add1_acquire) \ && !defined(AO_HAVE_int_fetch_and_add1_acquire) # define AO_int_fetch_and_add1_acquire(addr) \ (unsigned)AO_fetch_and_add1_acquire((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_add1_acquire #endif #if defined(AO_HAVE_fetch_and_sub1_acquire) \ && !defined(AO_HAVE_int_fetch_and_sub1_acquire) # define AO_int_fetch_and_sub1_acquire(addr) \ (unsigned)AO_fetch_and_sub1_acquire((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_sub1_acquire #endif #if defined(AO_HAVE_and_acquire) && !defined(AO_HAVE_int_and_acquire) # define AO_int_and_acquire(addr, val) \ AO_and_acquire((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_and_acquire #endif #if defined(AO_HAVE_or_acquire) && !defined(AO_HAVE_int_or_acquire) # define AO_int_or_acquire(addr, val) \ AO_or_acquire((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_or_acquire #endif #if defined(AO_HAVE_xor_acquire) && !defined(AO_HAVE_int_xor_acquire) # define AO_int_xor_acquire(addr, val) \ AO_xor_acquire((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_xor_acquire #endif #if defined(AO_HAVE_fetch_compare_and_swap_acquire) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_acquire) # define AO_int_fetch_compare_and_swap_acquire(addr, old, new_val) \ (unsigned)AO_fetch_compare_and_swap_acquire((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_fetch_compare_and_swap_acquire #endif #if defined(AO_HAVE_compare_and_swap_acquire) \ && !defined(AO_HAVE_int_compare_and_swap_acquire) # define AO_int_compare_and_swap_acquire(addr, old, new_val) \ AO_compare_and_swap_acquire((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_compare_and_swap_acquire #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Inclusion of this file signifies that AO_t is in fact int. */ /* Hence any AO_... operation can also serve as AO_int_... operation. */ #if defined(AO_HAVE_load_release) && !defined(AO_HAVE_int_load_release) # define AO_int_load_release(addr) \ (unsigned)AO_load_release((const volatile AO_t *)(addr)) # define AO_HAVE_int_load_release #endif #if defined(AO_HAVE_store_release) && !defined(AO_HAVE_int_store_release) # define AO_int_store_release(addr, val) \ AO_store_release((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_store_release #endif #if defined(AO_HAVE_fetch_and_add_release) \ && !defined(AO_HAVE_int_fetch_and_add_release) # define AO_int_fetch_and_add_release(addr, incr) \ (unsigned)AO_fetch_and_add_release((volatile AO_t *)(addr), \ (AO_t)(incr)) # define AO_HAVE_int_fetch_and_add_release #endif #if defined(AO_HAVE_fetch_and_add1_release) \ && !defined(AO_HAVE_int_fetch_and_add1_release) # define AO_int_fetch_and_add1_release(addr) \ (unsigned)AO_fetch_and_add1_release((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_add1_release #endif #if defined(AO_HAVE_fetch_and_sub1_release) \ && !defined(AO_HAVE_int_fetch_and_sub1_release) # define AO_int_fetch_and_sub1_release(addr) \ (unsigned)AO_fetch_and_sub1_release((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_sub1_release #endif #if defined(AO_HAVE_and_release) && !defined(AO_HAVE_int_and_release) # define AO_int_and_release(addr, val) \ AO_and_release((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_and_release #endif #if defined(AO_HAVE_or_release) && !defined(AO_HAVE_int_or_release) # define AO_int_or_release(addr, val) \ AO_or_release((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_or_release #endif #if defined(AO_HAVE_xor_release) && !defined(AO_HAVE_int_xor_release) # define AO_int_xor_release(addr, val) \ AO_xor_release((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_xor_release #endif #if defined(AO_HAVE_fetch_compare_and_swap_release) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_release) # define AO_int_fetch_compare_and_swap_release(addr, old, new_val) \ (unsigned)AO_fetch_compare_and_swap_release((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_fetch_compare_and_swap_release #endif #if defined(AO_HAVE_compare_and_swap_release) \ && !defined(AO_HAVE_int_compare_and_swap_release) # define AO_int_compare_and_swap_release(addr, old, new_val) \ AO_compare_and_swap_release((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_compare_and_swap_release #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Inclusion of this file signifies that AO_t is in fact int. */ /* Hence any AO_... operation can also serve as AO_int_... operation. */ #if defined(AO_HAVE_load_write) && !defined(AO_HAVE_int_load_write) # define AO_int_load_write(addr) \ (unsigned)AO_load_write((const volatile AO_t *)(addr)) # define AO_HAVE_int_load_write #endif #if defined(AO_HAVE_store_write) && !defined(AO_HAVE_int_store_write) # define AO_int_store_write(addr, val) \ AO_store_write((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_store_write #endif #if defined(AO_HAVE_fetch_and_add_write) \ && !defined(AO_HAVE_int_fetch_and_add_write) # define AO_int_fetch_and_add_write(addr, incr) \ (unsigned)AO_fetch_and_add_write((volatile AO_t *)(addr), \ (AO_t)(incr)) # define AO_HAVE_int_fetch_and_add_write #endif #if defined(AO_HAVE_fetch_and_add1_write) \ && !defined(AO_HAVE_int_fetch_and_add1_write) # define AO_int_fetch_and_add1_write(addr) \ (unsigned)AO_fetch_and_add1_write((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_add1_write #endif #if defined(AO_HAVE_fetch_and_sub1_write) \ && !defined(AO_HAVE_int_fetch_and_sub1_write) # define AO_int_fetch_and_sub1_write(addr) \ (unsigned)AO_fetch_and_sub1_write((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_sub1_write #endif #if defined(AO_HAVE_and_write) && !defined(AO_HAVE_int_and_write) # define AO_int_and_write(addr, val) \ AO_and_write((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_and_write #endif #if defined(AO_HAVE_or_write) && !defined(AO_HAVE_int_or_write) # define AO_int_or_write(addr, val) \ AO_or_write((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_or_write #endif #if defined(AO_HAVE_xor_write) && !defined(AO_HAVE_int_xor_write) # define AO_int_xor_write(addr, val) \ AO_xor_write((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_xor_write #endif #if defined(AO_HAVE_fetch_compare_and_swap_write) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_write) # define AO_int_fetch_compare_and_swap_write(addr, old, new_val) \ (unsigned)AO_fetch_compare_and_swap_write((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_fetch_compare_and_swap_write #endif #if defined(AO_HAVE_compare_and_swap_write) \ && !defined(AO_HAVE_int_compare_and_swap_write) # define AO_int_compare_and_swap_write(addr, old, new_val) \ AO_compare_and_swap_write((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_compare_and_swap_write #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Inclusion of this file signifies that AO_t is in fact int. */ /* Hence any AO_... operation can also serve as AO_int_... operation. */ #if defined(AO_HAVE_load_read) && !defined(AO_HAVE_int_load_read) # define AO_int_load_read(addr) \ (unsigned)AO_load_read((const volatile AO_t *)(addr)) # define AO_HAVE_int_load_read #endif #if defined(AO_HAVE_store_read) && !defined(AO_HAVE_int_store_read) # define AO_int_store_read(addr, val) \ AO_store_read((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_store_read #endif #if defined(AO_HAVE_fetch_and_add_read) \ && !defined(AO_HAVE_int_fetch_and_add_read) # define AO_int_fetch_and_add_read(addr, incr) \ (unsigned)AO_fetch_and_add_read((volatile AO_t *)(addr), \ (AO_t)(incr)) # define AO_HAVE_int_fetch_and_add_read #endif #if defined(AO_HAVE_fetch_and_add1_read) \ && !defined(AO_HAVE_int_fetch_and_add1_read) # define AO_int_fetch_and_add1_read(addr) \ (unsigned)AO_fetch_and_add1_read((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_add1_read #endif #if defined(AO_HAVE_fetch_and_sub1_read) \ && !defined(AO_HAVE_int_fetch_and_sub1_read) # define AO_int_fetch_and_sub1_read(addr) \ (unsigned)AO_fetch_and_sub1_read((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_sub1_read #endif #if defined(AO_HAVE_and_read) && !defined(AO_HAVE_int_and_read) # define AO_int_and_read(addr, val) \ AO_and_read((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_and_read #endif #if defined(AO_HAVE_or_read) && !defined(AO_HAVE_int_or_read) # define AO_int_or_read(addr, val) \ AO_or_read((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_or_read #endif #if defined(AO_HAVE_xor_read) && !defined(AO_HAVE_int_xor_read) # define AO_int_xor_read(addr, val) \ AO_xor_read((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_xor_read #endif #if defined(AO_HAVE_fetch_compare_and_swap_read) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_read) # define AO_int_fetch_compare_and_swap_read(addr, old, new_val) \ (unsigned)AO_fetch_compare_and_swap_read((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_fetch_compare_and_swap_read #endif #if defined(AO_HAVE_compare_and_swap_read) \ && !defined(AO_HAVE_int_compare_and_swap_read) # define AO_int_compare_and_swap_read(addr, old, new_val) \ AO_compare_and_swap_read((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_compare_and_swap_read #endif asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/armcc/0000755000000000000000000000000015031566105022515 5ustar rootrootasymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/armcc/arm_v6.h0000644000000000000000000001624715031566105024072 0ustar rootroot/* * Copyright (c) 2007 by NEC LE-IT: All rights reserved. * A transcription of ARMv6 atomic operations for the ARM Realview Toolchain. * This code works with armcc from RVDS 3.1 * This is based on work in gcc/arm.h by * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #include "../test_and_set_t_is_ao_t.h" /* Probably suboptimal */ #if __TARGET_ARCH_ARM < 6 # if !defined(CPPCHECK) # error Do not use with ARM instruction sets lower than v6 # endif #else #define AO_ACCESS_CHECK_ALIGNED #define AO_ACCESS_short_CHECK_ALIGNED #define AO_ACCESS_int_CHECK_ALIGNED #include "../all_atomic_only_load.h" #include "../standard_ao_double_t.h" /* NEC LE-IT: ARMv6 is the first architecture providing support for simple LL/SC * A data memory barrier must be raised via CP15 command (see documentation). * * ARMv7 is compatible to ARMv6 but has a simpler command for issuing a * memory barrier (DMB). Raising it via CP15 should still work as told me by the * support engineers. If it turns out to be much quicker than we should implement * custom code for ARMv7 using the asm { dmb } command. * * If only a single processor is used, we can define AO_UNIPROCESSOR * and do not need to access CP15 for ensuring a DMB at all. */ AO_INLINE void AO_nop_full(void) { # ifndef AO_UNIPROCESSOR unsigned int dest=0; /* Issue a data memory barrier (keeps ordering of memory transactions */ /* before and after this operation). */ __asm { mcr p15,0,dest,c7,c10,5 }; # else AO_compiler_barrier(); # endif } #define AO_HAVE_nop_full /* NEC LE-IT: atomic "store" - according to ARM documentation this is * the only safe way to set variables also used in LL/SC environment. * A direct write won't be recognized by the LL/SC construct in other CPUs. * * HB: Based on subsequent discussion, I think it would be OK to use an * ordinary store here if we knew that interrupt handlers always cleared * the reservation. They should, but there is some doubt that this is * currently always the case for e.g. Linux. */ AO_INLINE void AO_store(volatile AO_t *addr, AO_t value) { unsigned long tmp; retry: __asm { ldrex tmp, [addr] strex tmp, value, [addr] teq tmp, #0 bne retry }; } #define AO_HAVE_store /* NEC LE-IT: replace the SWAP as recommended by ARM: "Applies to: ARM11 Cores Though the SWP instruction will still work with ARM V6 cores, it is recommended to use the new V6 synchronization instructions. The SWP instruction produces locked read and write accesses which are atomic, i.e. another operation cannot be done between these locked accesses which ties up external bus (AHB,AXI) bandwidth and can increase worst case interrupt latencies. LDREX,STREX are more flexible, other instructions can be done between the LDREX and STREX accesses. " */ #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { AO_TS_VAL_t oldval; unsigned long tmp; unsigned long one = 1; retry: __asm { ldrex oldval, [addr] strex tmp, one, [addr] teq tmp, #0 bne retry } return oldval; } #define AO_HAVE_test_and_set AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *p, AO_t incr) { unsigned long tmp,tmp2; AO_t result; retry: __asm { ldrex result, [p] add tmp, incr, result strex tmp2, tmp, [p] teq tmp2, #0 bne retry } return result; } #define AO_HAVE_fetch_and_add AO_INLINE AO_t AO_fetch_and_add1(volatile AO_t *p) { unsigned long tmp,tmp2; AO_t result; retry: __asm { ldrex result, [p] add tmp, result, #1 strex tmp2, tmp, [p] teq tmp2, #0 bne retry } return result; } #define AO_HAVE_fetch_and_add1 AO_INLINE AO_t AO_fetch_and_sub1(volatile AO_t *p) { unsigned long tmp,tmp2; AO_t result; retry: __asm { ldrex result, [p] sub tmp, result, #1 strex tmp2, tmp, [p] teq tmp2, #0 bne retry } return result; } #define AO_HAVE_fetch_and_sub1 #endif /* !AO_PREFER_GENERALIZED */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS /* Returns nonzero if the comparison succeeded. */ AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t result, tmp; retry: __asm__ { mov result, #2 ldrex tmp, [addr] teq tmp, old_val # ifdef __thumb__ it eq # endif strexeq result, new_val, [addr] teq result, #1 beq retry } return !(result&2); } # define AO_HAVE_compare_and_swap #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t fetched_val, tmp; retry: __asm__ { mov tmp, #2 ldrex fetched_val, [addr] teq fetched_val, old_val # ifdef __thumb__ it eq # endif strexeq tmp, new_val, [addr] teq tmp, #1 beq retry } return fetched_val; } #define AO_HAVE_fetch_compare_and_swap /* helper functions for the Realview compiler: LDREXD is not usable * with inline assembler, so use the "embedded" assembler as * suggested by ARM Dev. support (June 2008). */ __asm inline double_ptr_storage AO_load_ex(const volatile AO_double_t *addr) { LDREXD r0,r1,[r0] } __asm inline int AO_store_ex(AO_t val1, AO_t val2, volatile AO_double_t *addr) { STREXD r3,r0,r1,[r2] MOV r0,r3 } AO_INLINE AO_double_t AO_double_load(const volatile AO_double_t *addr) { AO_double_t result; result.AO_whole = AO_load_ex(addr); return result; } #define AO_HAVE_double_load AO_INLINE int AO_compare_double_and_swap_double(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { double_ptr_storage old_val = ((double_ptr_storage)old_val2 << 32) | old_val1; double_ptr_storage tmp; int result; while(1) { tmp = AO_load_ex(addr); if(tmp != old_val) return 0; result = AO_store_ex(new_val1, new_val2, addr); if(!result) return 1; } } #define AO_HAVE_compare_double_and_swap_double #endif /* __TARGET_ARCH_ARM >= 6 */ #define AO_T_IS_INT asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/standard_ao_double_t.h0000644000000000000000000001013415031566105025734 0ustar rootroot/* * Copyright (c) 2004-2011 Hewlett-Packard Development Company, L.P. * Copyright (c) 2012-2021 Ivan Maidanski * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* For 64-bit systems, we expect the double type to hold two int64's. */ #if ((defined(__x86_64__) && defined(AO_GCC_ATOMIC_TEST_AND_SET)) \ || defined(__aarch64__)) && !defined(__ILP32__) /* x86-64: __m128 is not applicable to atomic intrinsics. */ # if AO_GNUC_PREREQ(4, 7) || AO_CLANG_PREREQ(3, 6) # pragma GCC diagnostic push /* Suppress warning about __int128 type. */ # if defined(__clang__) || AO_GNUC_PREREQ(6, 0) # pragma GCC diagnostic ignored "-Wpedantic" # else /* GCC before ~4.8 does not accept "-Wpedantic" quietly. */ # pragma GCC diagnostic ignored "-pedantic" # endif typedef unsigned __int128 double_ptr_storage; # pragma GCC diagnostic pop # else /* pragma diagnostic is not supported */ typedef unsigned __int128 double_ptr_storage; # endif #elif defined(_M_ARM64) && defined(_MSC_VER) /* __int128 does not seem to be available. */ typedef __declspec(align(16)) unsigned __int64 double_ptr_storage[2]; #elif ((defined(__x86_64__) && AO_GNUC_PREREQ(4, 0)) || defined(_WIN64)) \ && !defined(__ILP32__) /* x86-64 (except for x32): __m128 serves as a placeholder which also */ /* requires the compiler to align it on 16-byte boundary (as required */ /* by cmpxchg16b). */ /* Similar things could be done for PPC 64-bit using a VMX data type. */ # include typedef __m128 double_ptr_storage; #elif defined(_WIN32) && !defined(__GNUC__) typedef unsigned __int64 double_ptr_storage; #elif defined(__i386__) && defined(__GNUC__) typedef unsigned long long double_ptr_storage __attribute__((__aligned__(8))); #else typedef unsigned long long double_ptr_storage; #endif # define AO_HAVE_DOUBLE_PTR_STORAGE typedef union { struct { AO_t AO_v1; AO_t AO_v2; } AO_parts; /* Note that AO_v1 corresponds to the low or the high part of */ /* AO_whole depending on the machine endianness. */ double_ptr_storage AO_whole; /* AO_whole is now (starting from v7.3alpha3) the 2nd element */ /* of this union to make AO_DOUBLE_T_INITIALIZER portable */ /* (because __m128 definition could vary from a primitive type */ /* to a structure or array/vector). */ } AO_double_t; #define AO_HAVE_double_t /* Note: AO_double_t volatile variables are not intended to be local */ /* ones (at least those which are passed to AO double-wide primitives */ /* as the first argument), otherwise it is the client responsibility to */ /* ensure they have double-word alignment. */ /* Dummy declaration as a compile-time assertion for AO_double_t size. */ struct AO_double_t_size_static_assert { char dummy[sizeof(AO_double_t) == 2 * sizeof(AO_t) ? 1 : -1]; }; #define AO_DOUBLE_T_INITIALIZER { { (AO_t)0, (AO_t)0 } } #define AO_val1 AO_parts.AO_v1 #define AO_val2 AO_parts.AO_v2 asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/0000755000000000000000000000000015031566105023424 5ustar rootrootasymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.template0000644000000000000000000000250315031566105031245 0ustar rootroot/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifdef AO_HAVE_XSIZE_store # define AO_XSIZE_store_release(addr, val) \ (AO_nop_write(), AO_XSIZE_store(addr, val)) # define AO_HAVE_XSIZE_store_release #endif asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.h0000644000000000000000000001505715031566105027671 0ustar rootroot/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifdef AO_HAVE_char_store # define AO_char_store_release(addr, val) \ (AO_nop_write(), AO_char_store(addr, val)) # define AO_HAVE_char_store_release #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifdef AO_HAVE_short_store # define AO_short_store_release(addr, val) \ (AO_nop_write(), AO_short_store(addr, val)) # define AO_HAVE_short_store_release #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifdef AO_HAVE_int_store # define AO_int_store_release(addr, val) \ (AO_nop_write(), AO_int_store(addr, val)) # define AO_HAVE_int_store_release #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifdef AO_HAVE_store # define AO_store_release(addr, val) \ (AO_nop_write(), AO_store(addr, val)) # define AO_HAVE_store_release #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifdef AO_HAVE_double_store # define AO_double_store_release(addr, val) \ (AO_nop_write(), AO_double_store(addr, val)) # define AO_HAVE_double_store_release #endif asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h0000644000000000000000000000510615031566105031501 0ustar rootroot/* * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* This file adds definitions appropriate for environments in which */ /* volatile load of a given type has acquire semantics, and volatile */ /* store of a given type has release semantics. This is arguably */ /* supposed to be true with the standard Itanium software conventions. */ /* Empirically gcc/ia64 does some reordering of ordinary operations */ /* around volatiles even when we think it should not. GCC v3.3 and */ /* earlier could reorder a volatile store with another store. As of */ /* March 2005, gcc pre-4 reuses some previously computed common */ /* subexpressions across a volatile load; hence, we now add compiler */ /* barriers for gcc. */ #ifndef AO_HAVE_GCC_BARRIER /* TODO: Check GCC version (if workaround not needed for modern GCC). */ # if defined(__GNUC__) # define AO_GCC_BARRIER() AO_compiler_barrier() # else # define AO_GCC_BARRIER() (void)0 # endif # define AO_HAVE_GCC_BARRIER #endif AO_INLINE unsigned AO_int_load_acquire(const volatile unsigned *addr) { unsigned result = *addr; /* A normal volatile load generates an ld.acq (on IA-64). */ AO_GCC_BARRIER(); return result; } #define AO_HAVE_int_load_acquire AO_INLINE void AO_int_store_release(volatile unsigned *addr, unsigned new_val) { AO_GCC_BARRIER(); /* A normal volatile store generates an st.rel (on IA-64). */ *addr = new_val; } #define AO_HAVE_int_store_release asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_store.h0000644000000000000000000000312015031566105027500 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Definitions for architectures on which stores of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE void AO_short_store(volatile unsigned/**/short *addr, unsigned/**/short new_val) { # ifdef AO_ACCESS_short_CHECK_ALIGNED AO_ASSERT_ADDR_ALIGNED(addr); # endif *(unsigned/**/short *)addr = new_val; } #define AO_HAVE_short_store asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.template0000644000000000000000000000250115031566105031026 0ustar rootroot/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifdef AO_HAVE_XSIZE_load /* XSIZE_load_read is defined in generalize-small. */ # define AO_XSIZE_load_acquire(addr) AO_XSIZE_load_read(addr) # define AO_HAVE_XSIZE_load_acquire #endif asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.h0000644000000000000000000000322615031566105026053 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Definitions for architectures on which loads of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE AO_t AO_load(const volatile AO_t *addr) { # ifdef AO_ACCESS_CHECK_ALIGNED AO_ASSERT_ADDR_ALIGNED(addr); # endif /* Cast away the volatile for architectures like IA64 where */ /* volatile adds barrier (fence) semantics. */ return *(const AO_t *)addr; } #define AO_HAVE_load asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.h0000644000000000000000000000302715031566105026267 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Definitions for architectures on which stores of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE void AO_store(volatile AO_t *addr, AO_t new_val) { # ifdef AO_ACCESS_CHECK_ALIGNED AO_ASSERT_ADDR_ALIGNED(addr); # endif *(AO_t *)addr = new_val; } #define AO_HAVE_store asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_load.h0000644000000000000000000000331115031566105027043 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Definitions for architectures on which loads of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE unsigned/**/char AO_char_load(const volatile unsigned/**/char *addr) { # ifdef AO_ACCESS_char_CHECK_ALIGNED AO_ASSERT_ADDR_ALIGNED(addr); # endif /* Cast away the volatile for architectures like IA64 where */ /* volatile adds barrier (fence) semantics. */ return *(const unsigned/**/char *)addr; } #define AO_HAVE_char_load asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.template0000644000000000000000000000305715031566105027656 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Definitions for architectures on which stores of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE void AO_XSIZE_store(volatile XCTYPE *addr, XCTYPE new_val) { # ifdef AO_ACCESS_XSIZE_CHECK_ALIGNED AO_ASSERT_ADDR_ALIGNED(addr); # endif *(XCTYPE *)addr = new_val; } #define AO_HAVE_XSIZE_store asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.template0000644000000000000000000000510415031566105032211 0ustar rootroot/* * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* This file adds definitions appropriate for environments in which */ /* volatile load of a given type has acquire semantics, and volatile */ /* store of a given type has release semantics. This is arguably */ /* supposed to be true with the standard Itanium software conventions. */ /* Empirically gcc/ia64 does some reordering of ordinary operations */ /* around volatiles even when we think it should not. GCC v3.3 and */ /* earlier could reorder a volatile store with another store. As of */ /* March 2005, gcc pre-4 reuses some previously computed common */ /* subexpressions across a volatile load; hence, we now add compiler */ /* barriers for gcc. */ #ifndef AO_HAVE_GCC_BARRIER /* TODO: Check GCC version (if workaround not needed for modern GCC). */ # if defined(__GNUC__) # define AO_GCC_BARRIER() AO_compiler_barrier() # else # define AO_GCC_BARRIER() (void)0 # endif # define AO_HAVE_GCC_BARRIER #endif AO_INLINE XCTYPE AO_XSIZE_load_acquire(const volatile XCTYPE *addr) { XCTYPE result = *addr; /* A normal volatile load generates an ld.acq (on IA-64). */ AO_GCC_BARRIER(); return result; } #define AO_HAVE_XSIZE_load_acquire AO_INLINE void AO_XSIZE_store_release(volatile XCTYPE *addr, XCTYPE new_val) { AO_GCC_BARRIER(); /* A normal volatile store generates an st.rel (on IA-64). */ *addr = new_val; } #define AO_HAVE_XSIZE_store_release asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h0000644000000000000000000000516215031566105031626 0ustar rootroot/* * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* This file adds definitions appropriate for environments in which */ /* volatile load of a given type has acquire semantics, and volatile */ /* store of a given type has release semantics. This is arguably */ /* supposed to be true with the standard Itanium software conventions. */ /* Empirically gcc/ia64 does some reordering of ordinary operations */ /* around volatiles even when we think it should not. GCC v3.3 and */ /* earlier could reorder a volatile store with another store. As of */ /* March 2005, gcc pre-4 reuses some previously computed common */ /* subexpressions across a volatile load; hence, we now add compiler */ /* barriers for gcc. */ #ifndef AO_HAVE_GCC_BARRIER /* TODO: Check GCC version (if workaround not needed for modern GCC). */ # if defined(__GNUC__) # define AO_GCC_BARRIER() AO_compiler_barrier() # else # define AO_GCC_BARRIER() (void)0 # endif # define AO_HAVE_GCC_BARRIER #endif AO_INLINE unsigned/**/char AO_char_load_acquire(const volatile unsigned/**/char *addr) { unsigned/**/char result = *addr; /* A normal volatile load generates an ld.acq (on IA-64). */ AO_GCC_BARRIER(); return result; } #define AO_HAVE_char_load_acquire AO_INLINE void AO_char_store_release(volatile unsigned/**/char *addr, unsigned/**/char new_val) { AO_GCC_BARRIER(); /* A normal volatile store generates an st.rel (on IA-64). */ *addr = new_val; } #define AO_HAVE_char_store_release asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_store.h0000644000000000000000000000305715031566105027144 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Definitions for architectures on which stores of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE void AO_int_store(volatile unsigned *addr, unsigned new_val) { # ifdef AO_ACCESS_int_CHECK_ALIGNED AO_ASSERT_ADDR_ALIGNED(addr); # endif *(unsigned *)addr = new_val; } #define AO_HAVE_int_store asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.h0000644000000000000000000001503515031566105027450 0ustar rootroot/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifdef AO_HAVE_char_load /* char_load_read is defined in generalize-small. */ # define AO_char_load_acquire(addr) AO_char_load_read(addr) # define AO_HAVE_char_load_acquire #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifdef AO_HAVE_short_load /* short_load_read is defined in generalize-small. */ # define AO_short_load_acquire(addr) AO_short_load_read(addr) # define AO_HAVE_short_load_acquire #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifdef AO_HAVE_int_load /* int_load_read is defined in generalize-small. */ # define AO_int_load_acquire(addr) AO_int_load_read(addr) # define AO_HAVE_int_load_acquire #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifdef AO_HAVE_load /* load_read is defined in generalize-small. */ # define AO_load_acquire(addr) AO_load_read(addr) # define AO_HAVE_load_acquire #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifdef AO_HAVE_double_load /* double_load_read is defined in generalize-small. */ # define AO_double_load_acquire(addr) AO_double_load_read(addr) # define AO_HAVE_double_load_acquire #endif asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.h0000644000000000000000000000504215031566105030626 0ustar rootroot/* * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* This file adds definitions appropriate for environments in which */ /* volatile load of a given type has acquire semantics, and volatile */ /* store of a given type has release semantics. This is arguably */ /* supposed to be true with the standard Itanium software conventions. */ /* Empirically gcc/ia64 does some reordering of ordinary operations */ /* around volatiles even when we think it should not. GCC v3.3 and */ /* earlier could reorder a volatile store with another store. As of */ /* March 2005, gcc pre-4 reuses some previously computed common */ /* subexpressions across a volatile load; hence, we now add compiler */ /* barriers for gcc. */ #ifndef AO_HAVE_GCC_BARRIER /* TODO: Check GCC version (if workaround not needed for modern GCC). */ # if defined(__GNUC__) # define AO_GCC_BARRIER() AO_compiler_barrier() # else # define AO_GCC_BARRIER() (void)0 # endif # define AO_HAVE_GCC_BARRIER #endif AO_INLINE AO_t AO_load_acquire(const volatile AO_t *addr) { AO_t result = *addr; /* A normal volatile load generates an ld.acq (on IA-64). */ AO_GCC_BARRIER(); return result; } #define AO_HAVE_load_acquire AO_INLINE void AO_store_release(volatile AO_t *addr, AO_t new_val) { AO_GCC_BARRIER(); /* A normal volatile store generates an st.rel (on IA-64). */ *addr = new_val; } #define AO_HAVE_store_release asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h0000644000000000000000000000517315031566105032052 0ustar rootroot/* * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* This file adds definitions appropriate for environments in which */ /* volatile load of a given type has acquire semantics, and volatile */ /* store of a given type has release semantics. This is arguably */ /* supposed to be true with the standard Itanium software conventions. */ /* Empirically gcc/ia64 does some reordering of ordinary operations */ /* around volatiles even when we think it should not. GCC v3.3 and */ /* earlier could reorder a volatile store with another store. As of */ /* March 2005, gcc pre-4 reuses some previously computed common */ /* subexpressions across a volatile load; hence, we now add compiler */ /* barriers for gcc. */ #ifndef AO_HAVE_GCC_BARRIER /* TODO: Check GCC version (if workaround not needed for modern GCC). */ # if defined(__GNUC__) # define AO_GCC_BARRIER() AO_compiler_barrier() # else # define AO_GCC_BARRIER() (void)0 # endif # define AO_HAVE_GCC_BARRIER #endif AO_INLINE unsigned/**/short AO_short_load_acquire(const volatile unsigned/**/short *addr) { unsigned/**/short result = *addr; /* A normal volatile load generates an ld.acq (on IA-64). */ AO_GCC_BARRIER(); return result; } #define AO_HAVE_short_load_acquire AO_INLINE void AO_short_store_release(volatile unsigned/**/short *addr, unsigned/**/short new_val) { AO_GCC_BARRIER(); /* A normal volatile store generates an st.rel (on IA-64). */ *addr = new_val; } #define AO_HAVE_short_store_release asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_load.h0000644000000000000000000000325615031566105026730 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Definitions for architectures on which loads of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE unsigned AO_int_load(const volatile unsigned *addr) { # ifdef AO_ACCESS_int_CHECK_ALIGNED AO_ASSERT_ADDR_ALIGNED(addr); # endif /* Cast away the volatile for architectures like IA64 where */ /* volatile adds barrier (fence) semantics. */ return *(const unsigned *)addr; } #define AO_HAVE_int_load asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_load.h0000644000000000000000000000331715031566105027273 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Definitions for architectures on which loads of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE unsigned/**/short AO_short_load(const volatile unsigned/**/short *addr) { # ifdef AO_ACCESS_short_CHECK_ALIGNED AO_ASSERT_ADDR_ALIGNED(addr); # endif /* Cast away the volatile for architectures like IA64 where */ /* volatile adds barrier (fence) semantics. */ return *(const unsigned/**/short *)addr; } #define AO_HAVE_short_load asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.template0000644000000000000000000000325615031566105027442 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Definitions for architectures on which loads of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE XCTYPE AO_XSIZE_load(const volatile XCTYPE *addr) { # ifdef AO_ACCESS_XSIZE_CHECK_ALIGNED AO_ASSERT_ADDR_ALIGNED(addr); # endif /* Cast away the volatile for architectures like IA64 where */ /* volatile adds barrier (fence) semantics. */ return *(const XCTYPE *)addr; } #define AO_HAVE_XSIZE_load asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_store.h0000644000000000000000000000311215031566105027257 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Definitions for architectures on which stores of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE void AO_char_store(volatile unsigned/**/char *addr, unsigned/**/char new_val) { # ifdef AO_ACCESS_char_CHECK_ALIGNED AO_ASSERT_ADDR_ALIGNED(addr); # endif *(unsigned/**/char *)addr = new_val; } #define AO_HAVE_char_store asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/loadstore/double_atomic_load_store.h0000644000000000000000000000372715031566105030627 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * Copyright (c) 2013 Ivan Maidanski * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Definitions for architectures on which AO_double_t loads and stores */ /* are atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE AO_double_t AO_double_load(const volatile AO_double_t *addr) { AO_double_t result; # ifdef AO_ACCESS_double_CHECK_ALIGNED AO_ASSERT_ADDR_ALIGNED(addr); # endif /* Cast away the volatile in case it adds fence semantics. */ result.AO_whole = ((const AO_double_t *)addr)->AO_whole; return result; } #define AO_HAVE_double_load AO_INLINE void AO_double_store(volatile AO_double_t *addr, AO_double_t new_val) { # ifdef AO_ACCESS_double_CHECK_ALIGNED AO_ASSERT_ADDR_ALIGNED(addr); # endif ((AO_double_t *)addr)->AO_whole = new_val.AO_whole; } #define AO_HAVE_double_store asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/read_ordered.h0000644000000000000000000000303615031566105024222 0ustar rootroot/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * These are common definitions for architectures that provide processor * ordered memory operations except that a later read may pass an * earlier write. Real x86 implementations seem to be in this category, * except apparently for some IDT WinChips, which we ignore. */ AO_INLINE void AO_nop_read(void) { AO_compiler_barrier(); } #define AO_HAVE_nop_read #include "loadstore/ordered_loads_only.h" asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/0000755000000000000000000000000015031566105022164 5ustar rootrootasymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic.h0000644000000000000000000002012615031566105023752 0ustar rootroot/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * Copyright (c) 2013-2017 Ivan Maidanski * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ /* The following implementation assumes GCC 4.7 or later. */ /* For the details, see GNU Manual, chapter 6.52 (Built-in functions */ /* for memory model aware atomic operations). */ #define AO_GCC_ATOMIC_TEST_AND_SET #include "../test_and_set_t_is_char.h" #if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1) \ || defined(AO_GCC_FORCE_HAVE_CAS) # define AO_GCC_HAVE_char_SYNC_CAS #endif #if (__SIZEOF_SHORT__ == 2 && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)) \ || defined(AO_GCC_FORCE_HAVE_CAS) # define AO_GCC_HAVE_short_SYNC_CAS #endif #if (__SIZEOF_INT__ == 4 && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)) \ || (__SIZEOF_INT__ == 8 && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)) \ || defined(AO_GCC_FORCE_HAVE_CAS) # define AO_GCC_HAVE_int_SYNC_CAS #endif #if (__SIZEOF_SIZE_T__ == 4 && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)) \ || (__SIZEOF_SIZE_T__ == 8 \ && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)) \ || defined(AO_GCC_FORCE_HAVE_CAS) # define AO_GCC_HAVE_SYNC_CAS #endif #undef AO_compiler_barrier #define AO_compiler_barrier() __atomic_signal_fence(__ATOMIC_SEQ_CST) #ifdef AO_UNIPROCESSOR /* If only a single processor (core) is used, AO_UNIPROCESSOR could */ /* be defined by the client to avoid unnecessary memory barrier. */ AO_INLINE void AO_nop_full(void) { AO_compiler_barrier(); } # define AO_HAVE_nop_full #elif defined(AO_THREAD_SANITIZER) && !defined(AO_USE_ATOMIC_THREAD_FENCE) /* Workaround a compiler warning (reported by gcc-11, at least) */ /* that atomic_thread_fence is unsupported with thread sanitizer. */ #else AO_INLINE void AO_nop_read(void) { __atomic_thread_fence(__ATOMIC_ACQUIRE); } # define AO_HAVE_nop_read # ifndef AO_HAVE_nop_write AO_INLINE void AO_nop_write(void) { __atomic_thread_fence(__ATOMIC_RELEASE); } # define AO_HAVE_nop_write # endif AO_INLINE void AO_nop_full(void) { /* __sync_synchronize() could be used instead. */ __atomic_thread_fence(__ATOMIC_SEQ_CST); } # define AO_HAVE_nop_full #endif /* !AO_UNIPROCESSOR && !AO_THREAD_SANITIZER */ #include "generic-small.h" #ifndef AO_PREFER_GENERALIZED # include "generic-arithm.h" # define AO_CLEAR(addr) __atomic_clear(addr, __ATOMIC_RELEASE) # define AO_HAVE_CLEAR AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { return (AO_TS_VAL_t)(__atomic_test_and_set(addr, __ATOMIC_RELAXED) ? AO_TS_SET : AO_TS_CLEAR); } # define AO_HAVE_test_and_set AO_INLINE AO_TS_VAL_t AO_test_and_set_acquire(volatile AO_TS_t *addr) { return (AO_TS_VAL_t)(__atomic_test_and_set(addr, __ATOMIC_ACQUIRE) ? AO_TS_SET : AO_TS_CLEAR); } # define AO_HAVE_test_and_set_acquire AO_INLINE AO_TS_VAL_t AO_test_and_set_release(volatile AO_TS_t *addr) { return (AO_TS_VAL_t)(__atomic_test_and_set(addr, __ATOMIC_RELEASE) ? AO_TS_SET : AO_TS_CLEAR); } # define AO_HAVE_test_and_set_release AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { return (AO_TS_VAL_t)(__atomic_test_and_set(addr, __ATOMIC_SEQ_CST) ? AO_TS_SET : AO_TS_CLEAR); } # define AO_HAVE_test_and_set_full #endif /* !AO_PREFER_GENERALIZED */ #ifdef AO_HAVE_DOUBLE_PTR_STORAGE # if ((__SIZEOF_SIZE_T__ == 4 \ && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)) \ || (__SIZEOF_SIZE_T__ == 8 /* half of AO_double_t */ \ && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16))) \ && !defined(AO_SKIPATOMIC_double_compare_and_swap_ANY) # define AO_GCC_HAVE_double_SYNC_CAS # endif # if !defined(AO_GCC_HAVE_double_SYNC_CAS) || !defined(AO_PREFER_GENERALIZED) # if !defined(AO_HAVE_double_load) && !defined(AO_SKIPATOMIC_double_load) AO_INLINE AO_double_t AO_double_load(const volatile AO_double_t *addr) { AO_double_t result; result.AO_whole = __atomic_load_n(&addr->AO_whole, __ATOMIC_RELAXED); return result; } # define AO_HAVE_double_load # endif # if !defined(AO_HAVE_double_load_acquire) \ && !defined(AO_SKIPATOMIC_double_load_acquire) AO_INLINE AO_double_t AO_double_load_acquire(const volatile AO_double_t *addr) { AO_double_t result; result.AO_whole = __atomic_load_n(&addr->AO_whole, __ATOMIC_ACQUIRE); return result; } # define AO_HAVE_double_load_acquire # endif # if !defined(AO_HAVE_double_store) && !defined(AO_SKIPATOMIC_double_store) AO_INLINE void AO_double_store(volatile AO_double_t *addr, AO_double_t value) { __atomic_store_n(&addr->AO_whole, value.AO_whole, __ATOMIC_RELAXED); } # define AO_HAVE_double_store # endif # if !defined(AO_HAVE_double_store_release) \ && !defined(AO_SKIPATOMIC_double_store_release) AO_INLINE void AO_double_store_release(volatile AO_double_t *addr, AO_double_t value) { __atomic_store_n(&addr->AO_whole, value.AO_whole, __ATOMIC_RELEASE); } # define AO_HAVE_double_store_release # endif #endif /* !AO_GCC_HAVE_double_SYNC_CAS || !AO_PREFER_GENERALIZED */ #endif /* AO_HAVE_DOUBLE_PTR_STORAGE */ #ifdef AO_GCC_HAVE_double_SYNC_CAS # ifndef AO_HAVE_double_compare_and_swap AO_INLINE int AO_double_compare_and_swap(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return (int)__atomic_compare_exchange_n(&addr->AO_whole, &old_val.AO_whole /* p_expected */, new_val.AO_whole /* desired */, 0 /* is_weak: false */, __ATOMIC_RELAXED /* success */, __ATOMIC_RELAXED /* failure */); } # define AO_HAVE_double_compare_and_swap # endif # ifndef AO_HAVE_double_compare_and_swap_acquire AO_INLINE int AO_double_compare_and_swap_acquire(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return (int)__atomic_compare_exchange_n(&addr->AO_whole, &old_val.AO_whole, new_val.AO_whole, 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); } # define AO_HAVE_double_compare_and_swap_acquire # endif # ifndef AO_HAVE_double_compare_and_swap_release AO_INLINE int AO_double_compare_and_swap_release(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return (int)__atomic_compare_exchange_n(&addr->AO_whole, &old_val.AO_whole, new_val.AO_whole, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED /* failure */); } # define AO_HAVE_double_compare_and_swap_release # endif # ifndef AO_HAVE_double_compare_and_swap_full AO_INLINE int AO_double_compare_and_swap_full(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return (int)__atomic_compare_exchange_n(&addr->AO_whole, &old_val.AO_whole, new_val.AO_whole, 0, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE /* failure */); } # define AO_HAVE_double_compare_and_swap_full # endif #endif /* AO_GCC_HAVE_double_SYNC_CAS */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/m68k.h0000644000000000000000000000421615031566105023125 0ustar rootroot/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ /* The cas instruction causes an emulation trap for the */ /* 060 with a misaligned pointer, so let's avoid this. */ #undef AO_t typedef unsigned long AO_t __attribute__((__aligned__(4))); /* FIXME. Very incomplete. */ #include "../all_aligned_atomic_load_store.h" /* Are there any m68k multiprocessors still around? */ /* AFAIK, Alliants were sequentially consistent. */ #include "../ordered.h" #include "../test_and_set_t_is_char.h" AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { AO_TS_t oldval; /* The value at addr is semi-phony. */ /* 'tas' sets bit 7 while the return */ /* value pretends all bits were set, */ /* which at least matches AO_TS_SET. */ __asm__ __volatile__( "tas %1; sne %0" : "=d" (oldval), "=m" (*addr) : "m" (*addr) : "memory"); /* This cast works due to the above. */ return (AO_TS_VAL_t)oldval; } #define AO_HAVE_test_and_set_full /* Returns nonzero if the comparison succeeded. */ AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { char result; __asm__ __volatile__( "cas.l %3,%4,%1; seq %0" : "=d" (result), "=m" (*addr) : "m" (*addr), "d" (old), "d" (new_val) : "memory"); return -result; } #define AO_HAVE_compare_and_swap_full /* TODO: implement AO_fetch_compare_and_swap. */ #define AO_T_IS_INT asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/riscv.h0000644000000000000000000000222715031566105023466 0ustar rootroot/* * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ #if defined(__clang__) || defined(AO_PREFER_BUILTIN_ATOMICS) /* All __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n macros are still missing. */ /* The operations are lock-free even for the types smaller than word. */ # define AO_GCC_FORCE_HAVE_CAS #else /* As of gcc-7.5, CAS and arithmetic atomic operations for char and */ /* short are supported by the compiler but require -latomic flag. */ # if !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1) # define AO_NO_char_ARITHM # endif # if !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2) # define AO_NO_short_ARITHM # endif #endif /* !__clang__ */ #include "generic.h" #undef AO_GCC_FORCE_HAVE_CAS #undef AO_NO_char_ARITHM #undef AO_NO_short_ARITHM asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.h0000644000000000000000000005632715031566105025074 0ustar rootroot/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #if !defined(AO_GCC_HAVE_char_SYNC_CAS) || !defined(AO_PREFER_GENERALIZED) AO_INLINE unsigned/**/char AO_char_load(const volatile unsigned/**/char *addr) { return __atomic_load_n(addr, __ATOMIC_RELAXED); } #define AO_HAVE_char_load AO_INLINE unsigned/**/char AO_char_load_acquire(const volatile unsigned/**/char *addr) { return __atomic_load_n(addr, __ATOMIC_ACQUIRE); } #define AO_HAVE_char_load_acquire /* char_load_read is defined using load and nop_read. */ /* TODO: Map it to ACQUIRE. We should be strengthening the read and */ /* write stuff to the more general acquire/release versions. It almost */ /* never makes a difference and is much less error-prone. */ /* char_load_full is generalized using load and nop_full. */ /* TODO: Map it to SEQ_CST and clarify the documentation. */ /* TODO: Map load_dd_acquire_read to ACQUIRE. Ideally it should be */ /* mapped to CONSUME, but the latter is currently broken. */ /* char_store_full definition is omitted similar to load_full reason. */ /* TODO: Map store_write to RELEASE. */ #ifndef AO_SKIPATOMIC_char_store AO_INLINE void AO_char_store(volatile unsigned/**/char *addr, unsigned/**/char value) { __atomic_store_n(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_char_store #endif #ifndef AO_SKIPATOMIC_char_store_release AO_INLINE void AO_char_store_release(volatile unsigned/**/char *addr, unsigned/**/char value) { __atomic_store_n(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_char_store_release #endif #endif /* !AO_GCC_HAVE_char_SYNC_CAS || !AO_PREFER_GENERALIZED */ #ifdef AO_GCC_HAVE_char_SYNC_CAS AO_INLINE unsigned/**/char AO_char_fetch_compare_and_swap(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { (void)__atomic_compare_exchange_n(addr, &old_val /* p_expected */, new_val /* desired */, 0 /* is_weak: false */, __ATOMIC_RELAXED /* success */, __ATOMIC_RELAXED /* failure */); return old_val; } # define AO_HAVE_char_fetch_compare_and_swap AO_INLINE unsigned/**/char AO_char_fetch_compare_and_swap_acquire(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); return old_val; } # define AO_HAVE_char_fetch_compare_and_swap_acquire AO_INLINE unsigned/**/char AO_char_fetch_compare_and_swap_release(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED /* failure */); return old_val; } # define AO_HAVE_char_fetch_compare_and_swap_release AO_INLINE unsigned/**/char AO_char_fetch_compare_and_swap_full(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE /* failure */); return old_val; } # define AO_HAVE_char_fetch_compare_and_swap_full # ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_char_compare_and_swap(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); } # define AO_HAVE_char_compare_and_swap AO_INLINE int AO_char_compare_and_swap_acquire(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); } # define AO_HAVE_char_compare_and_swap_acquire AO_INLINE int AO_char_compare_and_swap_release(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED /* failure */); } # define AO_HAVE_char_compare_and_swap_release AO_INLINE int AO_char_compare_and_swap_full(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE /* failure */); } # define AO_HAVE_char_compare_and_swap_full # endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ #endif /* AO_GCC_HAVE_char_SYNC_CAS */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #if !defined(AO_GCC_HAVE_short_SYNC_CAS) || !defined(AO_PREFER_GENERALIZED) AO_INLINE unsigned/**/short AO_short_load(const volatile unsigned/**/short *addr) { return __atomic_load_n(addr, __ATOMIC_RELAXED); } #define AO_HAVE_short_load AO_INLINE unsigned/**/short AO_short_load_acquire(const volatile unsigned/**/short *addr) { return __atomic_load_n(addr, __ATOMIC_ACQUIRE); } #define AO_HAVE_short_load_acquire /* short_load_read is defined using load and nop_read. */ /* TODO: Map it to ACQUIRE. We should be strengthening the read and */ /* write stuff to the more general acquire/release versions. It almost */ /* never makes a difference and is much less error-prone. */ /* short_load_full is generalized using load and nop_full. */ /* TODO: Map it to SEQ_CST and clarify the documentation. */ /* TODO: Map load_dd_acquire_read to ACQUIRE. Ideally it should be */ /* mapped to CONSUME, but the latter is currently broken. */ /* short_store_full definition is omitted similar to load_full reason. */ /* TODO: Map store_write to RELEASE. */ #ifndef AO_SKIPATOMIC_short_store AO_INLINE void AO_short_store(volatile unsigned/**/short *addr, unsigned/**/short value) { __atomic_store_n(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_short_store #endif #ifndef AO_SKIPATOMIC_short_store_release AO_INLINE void AO_short_store_release(volatile unsigned/**/short *addr, unsigned/**/short value) { __atomic_store_n(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_short_store_release #endif #endif /* !AO_GCC_HAVE_short_SYNC_CAS || !AO_PREFER_GENERALIZED */ #ifdef AO_GCC_HAVE_short_SYNC_CAS AO_INLINE unsigned/**/short AO_short_fetch_compare_and_swap(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { (void)__atomic_compare_exchange_n(addr, &old_val /* p_expected */, new_val /* desired */, 0 /* is_weak: false */, __ATOMIC_RELAXED /* success */, __ATOMIC_RELAXED /* failure */); return old_val; } # define AO_HAVE_short_fetch_compare_and_swap AO_INLINE unsigned/**/short AO_short_fetch_compare_and_swap_acquire(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); return old_val; } # define AO_HAVE_short_fetch_compare_and_swap_acquire AO_INLINE unsigned/**/short AO_short_fetch_compare_and_swap_release(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED /* failure */); return old_val; } # define AO_HAVE_short_fetch_compare_and_swap_release AO_INLINE unsigned/**/short AO_short_fetch_compare_and_swap_full(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE /* failure */); return old_val; } # define AO_HAVE_short_fetch_compare_and_swap_full # ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_short_compare_and_swap(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); } # define AO_HAVE_short_compare_and_swap AO_INLINE int AO_short_compare_and_swap_acquire(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); } # define AO_HAVE_short_compare_and_swap_acquire AO_INLINE int AO_short_compare_and_swap_release(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED /* failure */); } # define AO_HAVE_short_compare_and_swap_release AO_INLINE int AO_short_compare_and_swap_full(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE /* failure */); } # define AO_HAVE_short_compare_and_swap_full # endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ #endif /* AO_GCC_HAVE_short_SYNC_CAS */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #if !defined(AO_GCC_HAVE_int_SYNC_CAS) || !defined(AO_PREFER_GENERALIZED) AO_INLINE unsigned AO_int_load(const volatile unsigned *addr) { return __atomic_load_n(addr, __ATOMIC_RELAXED); } #define AO_HAVE_int_load AO_INLINE unsigned AO_int_load_acquire(const volatile unsigned *addr) { return __atomic_load_n(addr, __ATOMIC_ACQUIRE); } #define AO_HAVE_int_load_acquire /* int_load_read is defined using load and nop_read. */ /* TODO: Map it to ACQUIRE. We should be strengthening the read and */ /* write stuff to the more general acquire/release versions. It almost */ /* never makes a difference and is much less error-prone. */ /* int_load_full is generalized using load and nop_full. */ /* TODO: Map it to SEQ_CST and clarify the documentation. */ /* TODO: Map load_dd_acquire_read to ACQUIRE. Ideally it should be */ /* mapped to CONSUME, but the latter is currently broken. */ /* int_store_full definition is omitted similar to load_full reason. */ /* TODO: Map store_write to RELEASE. */ #ifndef AO_SKIPATOMIC_int_store AO_INLINE void AO_int_store(volatile unsigned *addr, unsigned value) { __atomic_store_n(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_int_store #endif #ifndef AO_SKIPATOMIC_int_store_release AO_INLINE void AO_int_store_release(volatile unsigned *addr, unsigned value) { __atomic_store_n(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_int_store_release #endif #endif /* !AO_GCC_HAVE_int_SYNC_CAS || !AO_PREFER_GENERALIZED */ #ifdef AO_GCC_HAVE_int_SYNC_CAS AO_INLINE unsigned AO_int_fetch_compare_and_swap(volatile unsigned *addr, unsigned old_val, unsigned new_val) { (void)__atomic_compare_exchange_n(addr, &old_val /* p_expected */, new_val /* desired */, 0 /* is_weak: false */, __ATOMIC_RELAXED /* success */, __ATOMIC_RELAXED /* failure */); return old_val; } # define AO_HAVE_int_fetch_compare_and_swap AO_INLINE unsigned AO_int_fetch_compare_and_swap_acquire(volatile unsigned *addr, unsigned old_val, unsigned new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); return old_val; } # define AO_HAVE_int_fetch_compare_and_swap_acquire AO_INLINE unsigned AO_int_fetch_compare_and_swap_release(volatile unsigned *addr, unsigned old_val, unsigned new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED /* failure */); return old_val; } # define AO_HAVE_int_fetch_compare_and_swap_release AO_INLINE unsigned AO_int_fetch_compare_and_swap_full(volatile unsigned *addr, unsigned old_val, unsigned new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE /* failure */); return old_val; } # define AO_HAVE_int_fetch_compare_and_swap_full # ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_int_compare_and_swap(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); } # define AO_HAVE_int_compare_and_swap AO_INLINE int AO_int_compare_and_swap_acquire(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); } # define AO_HAVE_int_compare_and_swap_acquire AO_INLINE int AO_int_compare_and_swap_release(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED /* failure */); } # define AO_HAVE_int_compare_and_swap_release AO_INLINE int AO_int_compare_and_swap_full(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE /* failure */); } # define AO_HAVE_int_compare_and_swap_full # endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ #endif /* AO_GCC_HAVE_int_SYNC_CAS */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #if !defined(AO_GCC_HAVE_SYNC_CAS) || !defined(AO_PREFER_GENERALIZED) AO_INLINE AO_t AO_load(const volatile AO_t *addr) { return __atomic_load_n(addr, __ATOMIC_RELAXED); } #define AO_HAVE_load AO_INLINE AO_t AO_load_acquire(const volatile AO_t *addr) { return __atomic_load_n(addr, __ATOMIC_ACQUIRE); } #define AO_HAVE_load_acquire /* load_read is defined using load and nop_read. */ /* TODO: Map it to ACQUIRE. We should be strengthening the read and */ /* write stuff to the more general acquire/release versions. It almost */ /* never makes a difference and is much less error-prone. */ /* load_full is generalized using load and nop_full. */ /* TODO: Map it to SEQ_CST and clarify the documentation. */ /* TODO: Map load_dd_acquire_read to ACQUIRE. Ideally it should be */ /* mapped to CONSUME, but the latter is currently broken. */ /* store_full definition is omitted similar to load_full reason. */ /* TODO: Map store_write to RELEASE. */ #ifndef AO_SKIPATOMIC_store AO_INLINE void AO_store(volatile AO_t *addr, AO_t value) { __atomic_store_n(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_store #endif #ifndef AO_SKIPATOMIC_store_release AO_INLINE void AO_store_release(volatile AO_t *addr, AO_t value) { __atomic_store_n(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_store_release #endif #endif /* !AO_GCC_HAVE_SYNC_CAS || !AO_PREFER_GENERALIZED */ #ifdef AO_GCC_HAVE_SYNC_CAS AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { (void)__atomic_compare_exchange_n(addr, &old_val /* p_expected */, new_val /* desired */, 0 /* is_weak: false */, __ATOMIC_RELAXED /* success */, __ATOMIC_RELAXED /* failure */); return old_val; } # define AO_HAVE_fetch_compare_and_swap AO_INLINE AO_t AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); return old_val; } # define AO_HAVE_fetch_compare_and_swap_acquire AO_INLINE AO_t AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED /* failure */); return old_val; } # define AO_HAVE_fetch_compare_and_swap_release AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE /* failure */); return old_val; } # define AO_HAVE_fetch_compare_and_swap_full # ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); } # define AO_HAVE_compare_and_swap AO_INLINE int AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); } # define AO_HAVE_compare_and_swap_acquire AO_INLINE int AO_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED /* failure */); } # define AO_HAVE_compare_and_swap_release AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE /* failure */); } # define AO_HAVE_compare_and_swap_full # endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ #endif /* AO_GCC_HAVE_SYNC_CAS */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/ia64.h0000644000000000000000000002346615031566105023113 0ustar rootroot/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include "../all_atomic_load_store.h" #include "../all_acquire_release_volatile.h" #include "../test_and_set_t_is_char.h" #ifdef _ILP32 /* 32-bit HP/UX code. */ /* This requires pointer "swizzling". Pointers need to be expanded */ /* to 64 bits using the addp4 instruction before use. This makes it */ /* hard to share code, but we try anyway. */ # define AO_LEN "4" /* We assume that addr always appears in argument position 1 in asm */ /* code. If it is clobbered due to swizzling, we also need it in */ /* second position. Any later arguments are referenced symbolically, */ /* so that we don't have to worry about their position. This requires*/ /* gcc 3.1, but you shouldn't be using anything older than that on */ /* IA64 anyway. */ /* The AO_MASK macro is a workaround for the fact that HP/UX gcc */ /* appears to otherwise store 64-bit pointers in ar.ccv, i.e. it */ /* doesn't appear to clear high bits in a pointer value we pass into */ /* assembly code, even if it is supposedly of type AO_t. */ # define AO_IN_ADDR "1"(addr) # define AO_OUT_ADDR , "=r"(addr) # define AO_SWIZZLE "addp4 %1=0,%1;;\n" # define AO_MASK(ptr) __asm__ __volatile__("zxt4 %1=%1": "=r"(ptr) : "0"(ptr)) #else # define AO_LEN "8" # define AO_IN_ADDR "r"(addr) # define AO_OUT_ADDR # define AO_SWIZZLE # define AO_MASK(ptr) /* empty */ #endif /* !_ILP32 */ AO_INLINE void AO_nop_full(void) { __asm__ __volatile__("mf" : : : "memory"); } #define AO_HAVE_nop_full #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add1_acquire (volatile AO_t *addr) { AO_t result; __asm__ __volatile__ (AO_SWIZZLE "fetchadd" AO_LEN ".acq %0=[%1],1": "=r" (result) AO_OUT_ADDR: AO_IN_ADDR :"memory"); return result; } #define AO_HAVE_fetch_and_add1_acquire AO_INLINE AO_t AO_fetch_and_add1_release (volatile AO_t *addr) { AO_t result; __asm__ __volatile__ (AO_SWIZZLE "fetchadd" AO_LEN ".rel %0=[%1],1": "=r" (result) AO_OUT_ADDR: AO_IN_ADDR :"memory"); return result; } #define AO_HAVE_fetch_and_add1_release AO_INLINE AO_t AO_fetch_and_sub1_acquire (volatile AO_t *addr) { AO_t result; __asm__ __volatile__ (AO_SWIZZLE "fetchadd" AO_LEN ".acq %0=[%1],-1": "=r" (result) AO_OUT_ADDR: AO_IN_ADDR :"memory"); return result; } #define AO_HAVE_fetch_and_sub1_acquire AO_INLINE AO_t AO_fetch_and_sub1_release (volatile AO_t *addr) { AO_t result; __asm__ __volatile__ (AO_SWIZZLE "fetchadd" AO_LEN ".rel %0=[%1],-1": "=r" (result) AO_OUT_ADDR: AO_IN_ADDR :"memory"); return result; } #define AO_HAVE_fetch_and_sub1_release #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE AO_t AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val) { AO_t fetched_val; AO_MASK(old); __asm__ __volatile__(AO_SWIZZLE "mov ar.ccv=%[old] ;; cmpxchg" AO_LEN ".acq %0=[%1],%[new_val],ar.ccv" : "=r"(fetched_val) AO_OUT_ADDR : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"(old) : "memory"); return fetched_val; } #define AO_HAVE_fetch_compare_and_swap_acquire AO_INLINE AO_t AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old, AO_t new_val) { AO_t fetched_val; AO_MASK(old); __asm__ __volatile__(AO_SWIZZLE "mov ar.ccv=%[old] ;; cmpxchg" AO_LEN ".rel %0=[%1],%[new_val],ar.ccv" : "=r"(fetched_val) AO_OUT_ADDR : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"(old) : "memory"); return fetched_val; } #define AO_HAVE_fetch_compare_and_swap_release AO_INLINE unsigned char AO_char_fetch_compare_and_swap_acquire(volatile unsigned char *addr, unsigned char old, unsigned char new_val) { unsigned char fetched_val; __asm__ __volatile__(AO_SWIZZLE "mov ar.ccv=%[old] ;; cmpxchg1.acq %0=[%1],%[new_val],ar.ccv" : "=r"(fetched_val) AO_OUT_ADDR : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"((AO_t)old) : "memory"); return fetched_val; } #define AO_HAVE_char_fetch_compare_and_swap_acquire AO_INLINE unsigned char AO_char_fetch_compare_and_swap_release(volatile unsigned char *addr, unsigned char old, unsigned char new_val) { unsigned char fetched_val; __asm__ __volatile__(AO_SWIZZLE "mov ar.ccv=%[old] ;; cmpxchg1.rel %0=[%1],%[new_val],ar.ccv" : "=r"(fetched_val) AO_OUT_ADDR : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"((AO_t)old) : "memory"); return fetched_val; } #define AO_HAVE_char_fetch_compare_and_swap_release AO_INLINE unsigned short AO_short_fetch_compare_and_swap_acquire(volatile unsigned short *addr, unsigned short old, unsigned short new_val) { unsigned short fetched_val; __asm__ __volatile__(AO_SWIZZLE "mov ar.ccv=%[old] ;; cmpxchg2.acq %0=[%1],%[new_val],ar.ccv" : "=r"(fetched_val) AO_OUT_ADDR : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"((AO_t)old) : "memory"); return fetched_val; } #define AO_HAVE_short_fetch_compare_and_swap_acquire AO_INLINE unsigned short AO_short_fetch_compare_and_swap_release(volatile unsigned short *addr, unsigned short old, unsigned short new_val) { unsigned short fetched_val; __asm__ __volatile__(AO_SWIZZLE "mov ar.ccv=%[old] ;; cmpxchg2.rel %0=[%1],%[new_val],ar.ccv" : "=r"(fetched_val) AO_OUT_ADDR : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"((AO_t)old) : "memory"); return fetched_val; } #define AO_HAVE_short_fetch_compare_and_swap_release #ifdef _ILP32 # define AO_T_IS_INT /* TODO: Add compare_double_and_swap_double for the _ILP32 case. */ #else # ifndef AO_PREFER_GENERALIZED AO_INLINE unsigned int AO_int_fetch_and_add1_acquire(volatile unsigned int *addr) { unsigned int result; __asm__ __volatile__("fetchadd4.acq %0=[%1],1" : "=r" (result) : AO_IN_ADDR : "memory"); return result; } # define AO_HAVE_int_fetch_and_add1_acquire AO_INLINE unsigned int AO_int_fetch_and_add1_release(volatile unsigned int *addr) { unsigned int result; __asm__ __volatile__("fetchadd4.rel %0=[%1],1" : "=r" (result) : AO_IN_ADDR : "memory"); return result; } # define AO_HAVE_int_fetch_and_add1_release AO_INLINE unsigned int AO_int_fetch_and_sub1_acquire(volatile unsigned int *addr) { unsigned int result; __asm__ __volatile__("fetchadd4.acq %0=[%1],-1" : "=r" (result) : AO_IN_ADDR : "memory"); return result; } # define AO_HAVE_int_fetch_and_sub1_acquire AO_INLINE unsigned int AO_int_fetch_and_sub1_release(volatile unsigned int *addr) { unsigned int result; __asm__ __volatile__("fetchadd4.rel %0=[%1],-1" : "=r" (result) : AO_IN_ADDR : "memory"); return result; } # define AO_HAVE_int_fetch_and_sub1_release # endif /* !AO_PREFER_GENERALIZED */ AO_INLINE unsigned int AO_int_fetch_compare_and_swap_acquire(volatile unsigned int *addr, unsigned int old, unsigned int new_val) { unsigned int fetched_val; __asm__ __volatile__("mov ar.ccv=%3 ;; cmpxchg4.acq %0=[%1],%2,ar.ccv" : "=r"(fetched_val) : AO_IN_ADDR, "r"(new_val), "r"((AO_t)old) : "memory"); return fetched_val; } # define AO_HAVE_int_fetch_compare_and_swap_acquire AO_INLINE unsigned int AO_int_fetch_compare_and_swap_release(volatile unsigned int *addr, unsigned int old, unsigned int new_val) { unsigned int fetched_val; __asm__ __volatile__("mov ar.ccv=%3 ;; cmpxchg4.rel %0=[%1],%2,ar.ccv" : "=r"(fetched_val) : AO_IN_ADDR, "r"(new_val), "r"((AO_t)old) : "memory"); return fetched_val; } # define AO_HAVE_int_fetch_compare_and_swap_release #endif /* !_ILP32 */ /* TODO: Add compare_and_swap_double as soon as there is widely */ /* available hardware that implements it. */ #undef AO_IN_ADDR #undef AO_LEN #undef AO_MASK #undef AO_OUT_ADDR #undef AO_SWIZZLE asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/x86.h0000644000000000000000000006165615031566105023000 0ustar rootroot/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * Copyright (c) 2008-2018 Ivan Maidanski * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * * Some of the machine specific code was borrowed from our GC distribution. */ #if (AO_GNUC_PREREQ(4, 8) || AO_CLANG_PREREQ(3, 4)) \ && !defined(__INTEL_COMPILER) /* TODO: test and enable icc */ \ && !defined(AO_DISABLE_GCC_ATOMICS) # define AO_GCC_ATOMIC_TEST_AND_SET # if defined(__APPLE_CC__) /* OS X 10.7 clang-425 lacks __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n */ /* predefined macro (unlike e.g. OS X 10.11 clang-703). */ # define AO_GCC_FORCE_HAVE_CAS # ifdef __x86_64__ # if !AO_CLANG_PREREQ(9, 0) /* < Apple clang-900 */ /* Older Apple clang (e.g., clang-600 based on LLVM 3.5svn) had */ /* some bug in the double word CAS implementation for x64. */ # define AO_SKIPATOMIC_double_compare_and_swap_ANY # endif # elif defined(__MACH__) /* OS X 10.8 lacks __atomic_load/store symbols for arch i386 */ /* (even with a non-Apple clang). */ # ifndef MAC_OS_X_VERSION_MIN_REQUIRED /* Include this header just to import the version macro. */ # include # endif # if MAC_OS_X_VERSION_MIN_REQUIRED < 1090 /* MAC_OS_X_VERSION_10_9 */ # define AO_SKIPATOMIC_DOUBLE_LOAD_STORE_ANY # endif # endif /* __i386__ */ # elif defined(__clang__) # if !defined(__x86_64__) # if !defined(AO_PREFER_BUILTIN_ATOMICS) && !defined(__CYGWIN__) \ && !AO_CLANG_PREREQ(5, 0) /* At least clang-3.8/i686 (from NDK r11c) required to specify */ /* -latomic in case of a double-word atomic operation use. */ # define AO_SKIPATOMIC_double_compare_and_swap_ANY # define AO_SKIPATOMIC_DOUBLE_LOAD_STORE_ANY # endif /* !AO_PREFER_BUILTIN_ATOMICS */ # elif !defined(__ILP32__) # if (!AO_CLANG_PREREQ(3, 5) && !defined(AO_PREFER_BUILTIN_ATOMICS)) \ || (!AO_CLANG_PREREQ(4, 0) && defined(AO_ADDRESS_SANITIZER)) \ || defined(AO_THREAD_SANITIZER) /* clang-3.4/x64 required -latomic. clang-3.9/x64 seems to */ /* pass double-wide arguments to atomic operations incorrectly */ /* in case of ASan/TSan. */ /* TODO: As of clang-4.0, lock-free test_stack fails if TSan. */ # define AO_SKIPATOMIC_double_compare_and_swap_ANY # define AO_SKIPATOMIC_DOUBLE_LOAD_STORE_ANY # endif # endif /* __x86_64__ */ # elif defined(__x86_64__) && !defined(AO_PREFER_BUILTIN_ATOMICS) \ && !defined(AO_THREAD_SANITIZER) /* gcc/x64 (as of gcc-12.2) requires -latomic flag in case */ /* of double-word atomic operations use (but not in case of TSan). */ /* TODO: Revise it for the future gcc releases. */ # define AO_SKIPATOMIC_double_compare_and_swap_ANY # define AO_SKIPATOMIC_DOUBLE_LOAD_STORE_ANY # endif /* __x86_64__ && !__clang__ */ # ifdef AO_SKIPATOMIC_DOUBLE_LOAD_STORE_ANY # define AO_SKIPATOMIC_double_load # define AO_SKIPATOMIC_double_load_acquire # define AO_SKIPATOMIC_double_store # define AO_SKIPATOMIC_double_store_release # undef AO_SKIPATOMIC_DOUBLE_LOAD_STORE_ANY # endif #else /* AO_DISABLE_GCC_ATOMICS */ /* The following really assume we have a 486 or better. Unfortunately */ /* gcc doesn't define a suitable feature test macro based on command */ /* line options. */ /* We should perhaps test dynamically. */ #include "../all_aligned_atomic_load_store.h" #include "../test_and_set_t_is_char.h" #if defined(__SSE2__) && !defined(AO_USE_PENTIUM4_INSTRS) /* "mfence" is a part of SSE2 set (introduced on Intel Pentium 4). */ # define AO_USE_PENTIUM4_INSTRS #endif #if defined(AO_USE_PENTIUM4_INSTRS) AO_INLINE void AO_nop_full(void) { __asm__ __volatile__("mfence" : : : "memory"); } # define AO_HAVE_nop_full #else /* We could use the cpuid instruction. But that seems to be slower */ /* than the default implementation based on test_and_set_full. Thus */ /* we omit that bit of misinformation here. */ #endif /* !AO_USE_PENTIUM4_INSTRS */ /* As far as we can tell, the lfence and sfence instructions are not */ /* currently needed or useful for cached memory accesses. */ /* Really only works for 486 and later */ #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add_full (volatile AO_t *p, AO_t incr) { AO_t result; __asm__ __volatile__ ("lock; xadd %0, %1" : "=r" (result), "+m" (*p) : "0" (incr) : "memory"); return result; } # define AO_HAVE_fetch_and_add_full #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE unsigned char AO_char_fetch_and_add_full (volatile unsigned char *p, unsigned char incr) { unsigned char result; __asm__ __volatile__ ("lock; xaddb %0, %1" : "=q" (result), "+m" (*p) : "0" (incr) : "memory"); return result; } #define AO_HAVE_char_fetch_and_add_full AO_INLINE unsigned short AO_short_fetch_and_add_full (volatile unsigned short *p, unsigned short incr) { unsigned short result; __asm__ __volatile__ ("lock; xaddw %0, %1" : "=r" (result), "+m" (*p) : "0" (incr) : "memory"); return result; } #define AO_HAVE_short_fetch_and_add_full #ifndef AO_PREFER_GENERALIZED AO_INLINE void AO_and_full (volatile AO_t *p, AO_t value) { __asm__ __volatile__ ("lock; and %1, %0" : "+m" (*p) : "r" (value) : "memory"); } # define AO_HAVE_and_full AO_INLINE void AO_or_full (volatile AO_t *p, AO_t value) { __asm__ __volatile__ ("lock; or %1, %0" : "+m" (*p) : "r" (value) : "memory"); } # define AO_HAVE_or_full AO_INLINE void AO_xor_full (volatile AO_t *p, AO_t value) { __asm__ __volatile__ ("lock; xor %1, %0" : "+m" (*p) : "r" (value) : "memory"); } # define AO_HAVE_xor_full /* AO_store_full could be implemented directly using "xchg" but it */ /* could be generalized efficiently as an ordinary store accomplished */ /* with AO_nop_full ("mfence" instruction). */ AO_INLINE void AO_char_and_full (volatile unsigned char *p, unsigned char value) { __asm__ __volatile__ ("lock; andb %1, %0" : "+m" (*p) : "r" (value) : "memory"); } #define AO_HAVE_char_and_full AO_INLINE void AO_char_or_full (volatile unsigned char *p, unsigned char value) { __asm__ __volatile__ ("lock; orb %1, %0" : "+m" (*p) : "r" (value) : "memory"); } #define AO_HAVE_char_or_full AO_INLINE void AO_char_xor_full (volatile unsigned char *p, unsigned char value) { __asm__ __volatile__ ("lock; xorb %1, %0" : "+m" (*p) : "r" (value) : "memory"); } #define AO_HAVE_char_xor_full AO_INLINE void AO_short_and_full (volatile unsigned short *p, unsigned short value) { __asm__ __volatile__ ("lock; andw %1, %0" : "+m" (*p) : "r" (value) : "memory"); } #define AO_HAVE_short_and_full AO_INLINE void AO_short_or_full (volatile unsigned short *p, unsigned short value) { __asm__ __volatile__ ("lock; orw %1, %0" : "+m" (*p) : "r" (value) : "memory"); } #define AO_HAVE_short_or_full AO_INLINE void AO_short_xor_full (volatile unsigned short *p, unsigned short value) { __asm__ __volatile__ ("lock; xorw %1, %0" : "+m" (*p) : "r" (value) : "memory"); } #define AO_HAVE_short_xor_full #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { unsigned char oldval; /* Note: the "xchg" instruction does not need a "lock" prefix */ __asm__ __volatile__ ("xchgb %0, %1" : "=q" (oldval), "+m" (*addr) : "0" ((unsigned char)0xff) : "memory"); return (AO_TS_VAL_t)oldval; } #define AO_HAVE_test_and_set_full #ifndef AO_GENERALIZE_ASM_BOOL_CAS /* Returns nonzero if the comparison succeeded. */ AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { # ifdef AO_USE_SYNC_CAS_BUILTIN return (int)__sync_bool_compare_and_swap(addr, old, new_val /* empty protection list */); /* Note: an empty list of variables protected by the */ /* memory barrier should mean all globally accessible */ /* variables are protected. */ # else char result; # if defined(__GCC_ASM_FLAG_OUTPUTS__) AO_t dummy; __asm__ __volatile__ ("lock; cmpxchg %3, %0" : "+m" (*addr), "=@ccz" (result), "=a" (dummy) : "r" (new_val), "a" (old) : "memory"); # else __asm__ __volatile__ ("lock; cmpxchg %2, %0; setz %1" : "+m" (*addr), "=a" (result) : "r" (new_val), "a" (old) : "memory"); # endif return (int)result; # endif } # define AO_HAVE_compare_and_swap_full #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { # ifdef AO_USE_SYNC_CAS_BUILTIN return __sync_val_compare_and_swap(addr, old_val, new_val /* empty protection list */); # else AO_t fetched_val; __asm__ __volatile__ ("lock; cmpxchg %3, %1" : "=a" (fetched_val), "+m" (*addr) : "a" (old_val), "r" (new_val) : "memory"); return fetched_val; # endif } #define AO_HAVE_fetch_compare_and_swap_full AO_INLINE unsigned char AO_char_fetch_compare_and_swap_full(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { # ifdef AO_USE_SYNC_CAS_BUILTIN return __sync_val_compare_and_swap(addr, old_val, new_val /* empty protection list */); # else unsigned char fetched_val; __asm__ __volatile__ ("lock; cmpxchgb %3, %1" : "=a" (fetched_val), "+m" (*addr) : "a" (old_val), "q" (new_val) : "memory"); return fetched_val; # endif } # define AO_HAVE_char_fetch_compare_and_swap_full AO_INLINE unsigned short AO_short_fetch_compare_and_swap_full(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { # ifdef AO_USE_SYNC_CAS_BUILTIN return __sync_val_compare_and_swap(addr, old_val, new_val /* empty protection list */); # else unsigned short fetched_val; __asm__ __volatile__ ("lock; cmpxchgw %3, %1" : "=a" (fetched_val), "+m" (*addr) : "a" (old_val), "r" (new_val) : "memory"); return fetched_val; # endif } # define AO_HAVE_short_fetch_compare_and_swap_full # if defined(__x86_64__) && !defined(__ILP32__) AO_INLINE unsigned int AO_int_fetch_compare_and_swap_full(volatile unsigned int *addr, unsigned int old_val, unsigned int new_val) { # ifdef AO_USE_SYNC_CAS_BUILTIN return __sync_val_compare_and_swap(addr, old_val, new_val /* empty protection list */); # else unsigned int fetched_val; __asm__ __volatile__ ("lock; cmpxchgl %3, %1" : "=a" (fetched_val), "+m" (*addr) : "a" (old_val), "r" (new_val) : "memory"); return fetched_val; # endif } # define AO_HAVE_int_fetch_compare_and_swap_full # ifndef AO_PREFER_GENERALIZED AO_INLINE unsigned int AO_int_fetch_and_add_full (volatile unsigned int *p, unsigned int incr) { unsigned int result; __asm__ __volatile__ ("lock; xaddl %0, %1" : "=r" (result), "+m" (*p) : "0" (incr) : "memory"); return result; } # define AO_HAVE_int_fetch_and_add_full AO_INLINE void AO_int_and_full (volatile unsigned int *p, unsigned int value) { __asm__ __volatile__ ("lock; andl %1, %0" : "+m" (*p) : "r" (value) : "memory"); } # define AO_HAVE_int_and_full AO_INLINE void AO_int_or_full (volatile unsigned int *p, unsigned int value) { __asm__ __volatile__ ("lock; orl %1, %0" : "+m" (*p) : "r" (value) : "memory"); } # define AO_HAVE_int_or_full AO_INLINE void AO_int_xor_full (volatile unsigned int *p, unsigned int value) { __asm__ __volatile__ ("lock; xorl %1, %0" : "+m" (*p) : "r" (value) : "memory"); } # define AO_HAVE_int_xor_full # endif /* !AO_PREFER_GENERALIZED */ # else # define AO_T_IS_INT # endif /* !x86_64 || ILP32 */ /* Real X86 implementations, except for some old 32-bit WinChips, */ /* appear to enforce ordering between memory operations, EXCEPT that */ /* a later read can pass earlier writes, presumably due to the */ /* visible presence of store buffers. */ /* We ignore both the WinChips and the fact that the official specs */ /* seem to be much weaker (and arguably too weak to be usable). */ # include "../ordered_except_wr.h" #endif /* AO_DISABLE_GCC_ATOMICS */ #if defined(AO_GCC_ATOMIC_TEST_AND_SET) \ && !defined(AO_SKIPATOMIC_double_compare_and_swap_ANY) # if defined(__ILP32__) || !defined(__x86_64__) /* 32-bit AO_t */ \ || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16) /* 64-bit AO_t */ # include "../standard_ao_double_t.h" # endif #elif !defined(__x86_64__) && (!defined(AO_USE_SYNC_CAS_BUILTIN) \ || defined(AO_GCC_ATOMIC_TEST_AND_SET)) # include "../standard_ao_double_t.h" /* Reading or writing a quadword aligned on a 64-bit boundary is */ /* always carried out atomically on at least a Pentium according to */ /* Chapter 8.1.1 of Volume 3A Part 1 of Intel processor manuals. */ # ifndef AO_PREFER_GENERALIZED # define AO_ACCESS_double_CHECK_ALIGNED # include "../loadstore/double_atomic_load_store.h" # endif /* Returns nonzero if the comparison succeeded. */ /* Really requires at least a Pentium. */ AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { char result; # if defined(__PIC__) && !(AO_GNUC_PREREQ(5, 1) || AO_CLANG_PREREQ(4, 0)) AO_t saved_ebx; AO_t dummy; /* The following applies to an ancient GCC (and, probably, it was */ /* never needed for Clang): */ /* If PIC is turned on, we cannot use ebx as it is reserved for the */ /* GOT pointer. We should save and restore ebx. The proposed */ /* solution is not so efficient as the older alternatives using */ /* push ebx or edi as new_val1 (w/o clobbering edi and temporary */ /* local variable usage) but it is more portable (it works even if */ /* ebx is not used as GOT pointer, and it works for the buggy GCC */ /* releases that incorrectly evaluate memory operands offset in the */ /* inline assembly after push). */ # ifdef __OPTIMIZE__ __asm__ __volatile__("mov %%ebx, %2\n\t" /* save ebx */ "lea %0, %%edi\n\t" /* in case addr is in ebx */ "mov %7, %%ebx\n\t" /* load new_val1 */ "lock; cmpxchg8b (%%edi)\n\t" "mov %2, %%ebx\n\t" /* restore ebx */ "setz %1" : "+m" (*addr), "=a" (result), "=m" (saved_ebx), "=d" (dummy) : "d" (old_val2), "a" (old_val1), "c" (new_val2), "m" (new_val1) : "%edi", "memory"); # else /* A less-efficient code manually preserving edi if GCC invoked */ /* with -O0 option (otherwise it fails while finding a register */ /* in class 'GENERAL_REGS'). */ AO_t saved_edi; __asm__ __volatile__("mov %%edi, %3\n\t" /* save edi */ "mov %%ebx, %2\n\t" /* save ebx */ "lea %0, %%edi\n\t" /* in case addr is in ebx */ "mov %8, %%ebx\n\t" /* load new_val1 */ "lock; cmpxchg8b (%%edi)\n\t" "mov %2, %%ebx\n\t" /* restore ebx */ "mov %3, %%edi\n\t" /* restore edi */ "setz %1" : "+m" (*addr), "=a" (result), "=m" (saved_ebx), "=m" (saved_edi), "=d" (dummy) : "d" (old_val2), "a" (old_val1), "c" (new_val2), "m" (new_val1) : "memory"); # endif # else /* For non-PIC mode, this operation could be simplified (and be */ /* faster) by using ebx as new_val1. Reuse of the PIC hard */ /* register, instead of using a fixed register, is implemented */ /* in Clang and GCC 5.1+, at least. (Older GCC refused to compile */ /* such code for PIC mode). */ # if defined(__GCC_ASM_FLAG_OUTPUTS__) __asm__ __volatile__ ("lock; cmpxchg8b %0" : "+m" (*addr), "=@ccz" (result), "+d" (old_val2), "+a" (old_val1) : "c" (new_val2), "b" (new_val1) : "memory"); # else AO_t dummy; /* an output for clobbered edx */ __asm__ __volatile__ ("lock; cmpxchg8b %0; setz %1" : "+m" (*addr), "=a" (result), "=d" (dummy) : "d" (old_val2), "a" (old_val1), "c" (new_val2), "b" (new_val1) : "memory"); # endif # endif return (int) result; } # define AO_HAVE_compare_double_and_swap_double_full #elif defined(__ILP32__) || !defined(__x86_64__) # include "../standard_ao_double_t.h" /* Reading or writing a quadword aligned on a 64-bit boundary is */ /* always carried out atomically (requires at least a Pentium). */ # ifndef AO_PREFER_GENERALIZED # define AO_ACCESS_double_CHECK_ALIGNED # include "../loadstore/double_atomic_load_store.h" # endif /* X32 has native support for 64-bit integer operations (AO_double_t */ /* is a 64-bit integer and we could use 64-bit cmpxchg). */ /* This primitive is used by compare_double_and_swap_double_full. */ AO_INLINE int AO_double_compare_and_swap_full(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { /* It is safe to use __sync CAS built-in here. */ return __sync_bool_compare_and_swap(&addr->AO_whole, old_val.AO_whole, new_val.AO_whole /* empty protection list */); } # define AO_HAVE_double_compare_and_swap_full #elif defined(AO_CMPXCHG16B_AVAILABLE) \ || (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16) \ && !defined(AO_THREAD_SANITIZER)) # include "../standard_ao_double_t.h" /* The Intel and AMD Architecture Programmer Manuals state roughly */ /* the following: */ /* - CMPXCHG16B (with a LOCK prefix) can be used to perform 16-byte */ /* atomic accesses in 64-bit mode (with certain alignment */ /* restrictions); */ /* - SSE instructions that access data larger than a quadword (like */ /* MOVDQA) may be implemented using multiple memory accesses; */ /* - LOCK prefix causes an invalid-opcode exception when used with */ /* 128-bit media (SSE) instructions. */ /* Thus, currently, the only way to implement lock-free double_load */ /* and double_store on x86_64 is to use CMPXCHG16B (if available). */ /* NEC LE-IT: older AMD Opterons are missing this instruction. */ /* On these machines SIGILL will be thrown. */ /* Define AO_WEAK_DOUBLE_CAS_EMULATION to have an emulated (lock */ /* based) version available. */ /* HB: Changed this to not define either by default. There are */ /* enough machines and tool chains around on which cmpxchg16b */ /* doesn't work. And the emulation is unsafe by our usual rules. */ /* However both are clearly useful in certain cases. */ AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { char result; # if defined(__GCC_ASM_FLAG_OUTPUTS__) __asm__ __volatile__("lock; cmpxchg16b %0" : "+m" (*addr), "=@ccz" (result), "+d" (old_val2), "+a" (old_val1) : "c" (new_val2), "b" (new_val1) : "memory"); # else AO_t dummy; /* an output for clobbered rdx */ __asm__ __volatile__("lock; cmpxchg16b %0; setz %1" : "+m" (*addr), "=a" (result), "=d" (dummy) : "d" (old_val2), "a" (old_val1), "c" (new_val2), "b" (new_val1) : "memory"); # endif return (int) result; } # define AO_HAVE_compare_double_and_swap_double_full #elif defined(AO_WEAK_DOUBLE_CAS_EMULATION) # include "../standard_ao_double_t.h" # ifdef __cplusplus extern "C" { # endif /* This one provides spinlock based emulation of CAS implemented in */ /* atomic_ops.c. We probably do not want to do this here, since it */ /* is not atomic with respect to other kinds of updates of *addr. */ /* On the other hand, this may be a useful facility on occasion. */ int AO_compare_double_and_swap_double_emulation( volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2); # ifdef __cplusplus } /* extern "C" */ # endif AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { return AO_compare_double_and_swap_double_emulation(addr, old_val1, old_val2, new_val1, new_val2); } # define AO_HAVE_compare_double_and_swap_double_full #endif /* x86_64 && !ILP32 && CAS_EMULATION && !AO_CMPXCHG16B_AVAILABLE */ #ifdef AO_GCC_ATOMIC_TEST_AND_SET # include "generic.h" #endif #undef AO_GCC_FORCE_HAVE_CAS #undef AO_SKIPATOMIC_double_compare_and_swap_ANY #undef AO_SKIPATOMIC_double_load #undef AO_SKIPATOMIC_double_load_acquire #undef AO_SKIPATOMIC_double_store #undef AO_SKIPATOMIC_double_store_release asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/arm.h0000644000000000000000000006162015031566105023121 0ustar rootroot/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * Copyright (c) 2008-2017 Ivan Maidanski * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #if (AO_GNUC_PREREQ(4, 8) || AO_CLANG_PREREQ(3, 5)) \ && !defined(AO_DISABLE_GCC_ATOMICS) /* Probably, it could be enabled even for earlier gcc/clang versions. */ # define AO_GCC_ATOMIC_TEST_AND_SET #endif #ifdef __native_client__ /* Mask instruction should immediately precede access instruction. */ # define AO_MASK_PTR(reg) " bical " reg ", " reg ", #0xc0000000\n" # define AO_BR_ALIGN " .align 4\n" #else # define AO_MASK_PTR(reg) /* empty */ # define AO_BR_ALIGN /* empty */ #endif #if defined(__thumb__) && !defined(__thumb2__) /* Thumb One mode does not have ARM "mcr", "swp" and some load/store */ /* instructions, so we temporarily switch to ARM mode and go back */ /* afterwards (clobbering "r3" register). */ # define AO_THUMB_GO_ARM \ " adr r3, 4f\n" \ " bx r3\n" \ " .align\n" \ " .arm\n" \ AO_BR_ALIGN \ "4:\n" # define AO_THUMB_RESTORE_MODE \ " adr r3, 5f + 1\n" \ " bx r3\n" \ " .thumb\n" \ AO_BR_ALIGN \ "5:\n" # define AO_THUMB_SWITCH_CLOBBERS "r3", #else # define AO_THUMB_GO_ARM /* empty */ # define AO_THUMB_RESTORE_MODE /* empty */ # define AO_THUMB_SWITCH_CLOBBERS /* empty */ #endif /* !__thumb__ */ /* NEC LE-IT: gcc has no way to easily check the arm architecture */ /* but it defines only one (or several) of __ARM_ARCH_x__ to be true. */ #if !defined(__ARM_ARCH_2__) && !defined(__ARM_ARCH_3__) \ && !defined(__ARM_ARCH_3M__) && !defined(__ARM_ARCH_4__) \ && !defined(__ARM_ARCH_4T__) \ && ((!defined(__ARM_ARCH_5__) && !defined(__ARM_ARCH_5E__) \ && !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) \ && !defined(__ARM_ARCH_5TEJ__) && !defined(__ARM_ARCH_6M__)) \ || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ || defined(__ARM_ARCH_8A__)) # define AO_ARM_HAVE_LDREX # if !defined(__ARM_ARCH_6__) && !defined(__ARM_ARCH_6J__) \ && !defined(__ARM_ARCH_6T2__) /* LDREXB/STREXB and LDREXH/STREXH are present in ARMv6K/Z+. */ # define AO_ARM_HAVE_LDREXBH # endif # if !defined(__ARM_ARCH_6__) && !defined(__ARM_ARCH_6J__) \ && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6Z__) \ && !defined(__ARM_ARCH_6ZT2__) # if !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6KZ__) \ && !defined(__ARM_ARCH_6ZK__) /* DMB is present in ARMv6M and ARMv7+. */ # define AO_ARM_HAVE_DMB # endif # if (!defined(__thumb__) \ || (defined(__thumb2__) && !defined(__ARM_ARCH_7__) \ && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__))) \ && (!defined(__clang__) || AO_CLANG_PREREQ(3, 3)) /* LDREXD/STREXD present in ARMv6K/M+ (see gas/config/tc-arm.c). */ /* In the Thumb mode, this works only starting from ARMv7 (except */ /* for the base and 'M' models). Clang3.2 (and earlier) does not */ /* allocate register pairs for LDREXD/STREXD properly (besides, */ /* Clang3.1 does not support "%H" operand specification). */ # define AO_ARM_HAVE_LDREXD # endif /* !thumb || ARMv7A || ARMv7R+ */ # endif /* ARMv7+ */ #endif /* ARMv6+ */ #if !defined(__ARM_ARCH_2__) && !defined(__ARM_ARCH_6M__) \ && !defined(__ARM_ARCH_8A__) && !defined(__thumb2__) # define AO_ARM_HAVE_SWP /* Note: ARMv6M is excluded due to no ARM mode support. */ /* Also, SWP is obsoleted for ARMv8+. */ #endif /* !__thumb2__ */ #if !defined(AO_UNIPROCESSOR) && defined(AO_ARM_HAVE_DMB) \ && !defined(AO_PREFER_BUILTIN_ATOMICS) AO_INLINE void AO_nop_write(void) { /* AO_THUMB_GO_ARM is empty. */ /* This will target the system domain and thus be overly */ /* conservative as the CPUs (even in case of big.LITTLE SoC) will */ /* occupy the inner shareable domain. */ /* The plain variant (dmb st) is theoretically slower, and should */ /* not be needed. That said, with limited experimentation, a CPU */ /* implementation for which it actually matters has not been found */ /* yet, though they should already exist. */ /* Anyway, note that the "st" and "ishst" barriers are actually */ /* quite weak and, as the libatomic_ops documentation states, */ /* usually not what you really want. */ __asm__ __volatile__("dmb ishst" : : : "memory"); } # define AO_HAVE_nop_write #endif /* AO_ARM_HAVE_DMB */ #ifndef AO_GCC_ATOMIC_TEST_AND_SET #ifdef AO_UNIPROCESSOR /* If only a single processor (core) is used, AO_UNIPROCESSOR could */ /* be defined by the client to avoid unnecessary memory barrier. */ AO_INLINE void AO_nop_full(void) { AO_compiler_barrier(); } # define AO_HAVE_nop_full #elif defined(AO_ARM_HAVE_DMB) /* ARMv7 is compatible to ARMv6 but has a simpler command for issuing */ /* a memory barrier (DMB). Raising it via CP15 should still work */ /* (but slightly less efficient because it requires the use of */ /* a general-purpose register). */ AO_INLINE void AO_nop_full(void) { /* AO_THUMB_GO_ARM is empty. */ __asm__ __volatile__("dmb" : : : "memory"); } # define AO_HAVE_nop_full #elif defined(AO_ARM_HAVE_LDREX) /* ARMv6 is the first architecture providing support for a simple */ /* LL/SC. A data memory barrier must be raised via CP15 command. */ AO_INLINE void AO_nop_full(void) { unsigned dest = 0; /* Issue a data memory barrier (keeps ordering of memory */ /* transactions before and after this operation). */ __asm__ __volatile__("@AO_nop_full\n" AO_THUMB_GO_ARM " mcr p15,0,%0,c7,c10,5\n" AO_THUMB_RESTORE_MODE : "=&r"(dest) : /* empty */ : AO_THUMB_SWITCH_CLOBBERS "memory"); } # define AO_HAVE_nop_full #else /* AO_nop_full() is emulated using AO_test_and_set_full(). */ #endif /* !AO_UNIPROCESSOR && !AO_ARM_HAVE_LDREX */ #endif /* !AO_GCC_ATOMIC_TEST_AND_SET */ #ifdef AO_ARM_HAVE_LDREX /* "ARM Architecture Reference Manual" (chapter A3.5.3) says that the */ /* single-copy atomic processor accesses are all byte accesses, all */ /* halfword accesses to halfword-aligned locations, all word accesses */ /* to word-aligned locations. */ /* There is only a single concern related to AO store operations: */ /* a direct write (by STR[B/H] instruction) will not be recognized */ /* by the LL/SC construct on the same CPU (i.e., according to ARM */ /* documentation, e.g., see CortexA8 TRM reference, point 8.5, */ /* atomic "store" (using LDREX/STREX[B/H]) is the only safe way to */ /* set variables also used in LL/SC environment). */ /* This is only a problem if interrupt handlers do not clear the */ /* reservation (by CLREX instruction or a dummy STREX one), as they */ /* almost certainly should (e.g., see restore_user_regs defined in */ /* arch/arm/kernel/entry-header.S of Linux. Nonetheless, there is */ /* a doubt this was properly implemented in some ancient OS releases. */ # ifdef AO_BROKEN_TASKSWITCH_CLREX # define AO_SKIPATOMIC_store # define AO_SKIPATOMIC_store_release # define AO_SKIPATOMIC_char_store # define AO_SKIPATOMIC_char_store_release # define AO_SKIPATOMIC_short_store # define AO_SKIPATOMIC_short_store_release # define AO_SKIPATOMIC_int_store # define AO_SKIPATOMIC_int_store_release # ifndef AO_PREFER_BUILTIN_ATOMICS AO_INLINE void AO_store(volatile AO_t *addr, AO_t value) { int flag; __asm__ __volatile__("@AO_store\n" AO_THUMB_GO_ARM AO_BR_ALIGN "1: " AO_MASK_PTR("%2") " ldrex %0, [%2]\n" AO_MASK_PTR("%2") " strex %0, %3, [%2]\n" " teq %0, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (flag), "+m" (*addr) : "r" (addr), "r" (value) : AO_THUMB_SWITCH_CLOBBERS "cc"); } # define AO_HAVE_store # ifdef AO_ARM_HAVE_LDREXBH AO_INLINE void AO_char_store(volatile unsigned char *addr, unsigned char value) { int flag; __asm__ __volatile__("@AO_char_store\n" AO_THUMB_GO_ARM AO_BR_ALIGN "1: " AO_MASK_PTR("%2") " ldrexb %0, [%2]\n" AO_MASK_PTR("%2") " strexb %0, %3, [%2]\n" " teq %0, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (flag), "+m" (*addr) : "r" (addr), "r" (value) : AO_THUMB_SWITCH_CLOBBERS "cc"); } # define AO_HAVE_char_store AO_INLINE void AO_short_store(volatile unsigned short *addr, unsigned short value) { int flag; __asm__ __volatile__("@AO_short_store\n" AO_THUMB_GO_ARM AO_BR_ALIGN "1: " AO_MASK_PTR("%2") " ldrexh %0, [%2]\n" AO_MASK_PTR("%2") " strexh %0, %3, [%2]\n" " teq %0, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (flag), "+m" (*addr) : "r" (addr), "r" (value) : AO_THUMB_SWITCH_CLOBBERS "cc"); } # define AO_HAVE_short_store # endif /* AO_ARM_HAVE_LDREXBH */ # endif /* !AO_PREFER_BUILTIN_ATOMICS */ # elif !defined(AO_GCC_ATOMIC_TEST_AND_SET) # include "../loadstore/atomic_store.h" /* AO_int_store is defined in ao_t_is_int.h. */ # endif /* !AO_BROKEN_TASKSWITCH_CLREX */ #endif /* AO_ARM_HAVE_LDREX */ #ifndef AO_GCC_ATOMIC_TEST_AND_SET # include "../test_and_set_t_is_ao_t.h" /* Probably suboptimal */ #ifdef AO_ARM_HAVE_LDREX /* AO_t/char/short/int load is simple reading. */ /* Unaligned accesses are not guaranteed to be atomic. */ # define AO_ACCESS_CHECK_ALIGNED # define AO_ACCESS_short_CHECK_ALIGNED # define AO_ACCESS_int_CHECK_ALIGNED # include "../all_atomic_only_load.h" # ifndef AO_HAVE_char_store # include "../loadstore/char_atomic_store.h" # include "../loadstore/short_atomic_store.h" # endif /* NEC LE-IT: replace the SWAP as recommended by ARM: "Applies to: ARM11 Cores Though the SWP instruction will still work with ARM V6 cores, it is recommended to use the new V6 synchronization instructions. The SWP instruction produces 'locked' read and write accesses which are atomic, i.e. another operation cannot be done between these locked accesses which ties up external bus (AHB, AXI) bandwidth and can increase worst case interrupt latencies. LDREX, STREX are more flexible, other instructions can be done between the LDREX and STREX accesses." */ #ifndef AO_PREFER_GENERALIZED #if !defined(AO_FORCE_USE_SWP) || !defined(AO_ARM_HAVE_SWP) /* But, on the other hand, there could be a considerable performance */ /* degradation in case of a race. Eg., test_atomic.c executing */ /* test_and_set test on a dual-core ARMv7 processor using LDREX/STREX */ /* showed around 35 times lower performance than that using SWP. */ /* To force use of SWP instruction, use -D AO_FORCE_USE_SWP option */ /* (the latter is ignored if SWP instruction is unsupported). */ AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { AO_TS_VAL_t oldval; int flag; __asm__ __volatile__("@AO_test_and_set\n" AO_THUMB_GO_ARM AO_BR_ALIGN "1: " AO_MASK_PTR("%3") " ldrex %0, [%3]\n" AO_MASK_PTR("%3") " strex %1, %4, [%3]\n" " teq %1, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r"(oldval), "=&r"(flag), "+m"(*addr) : "r"(addr), "r"(1) : AO_THUMB_SWITCH_CLOBBERS "cc"); return oldval; } # define AO_HAVE_test_and_set #endif /* !AO_FORCE_USE_SWP */ AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *p, AO_t incr) { AO_t result, tmp; int flag; __asm__ __volatile__("@AO_fetch_and_add\n" AO_THUMB_GO_ARM AO_BR_ALIGN "1: " AO_MASK_PTR("%5") " ldrex %0, [%5]\n" /* get original */ " add %2, %0, %4\n" /* sum up in incr */ AO_MASK_PTR("%5") " strex %1, %2, [%5]\n" /* store them */ " teq %1, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r"(result), "=&r"(flag), "=&r"(tmp), "+m"(*p) /* 0..3 */ : "r"(incr), "r"(p) /* 4..5 */ : AO_THUMB_SWITCH_CLOBBERS "cc"); return result; } #define AO_HAVE_fetch_and_add AO_INLINE AO_t AO_fetch_and_add1(volatile AO_t *p) { AO_t result, tmp; int flag; __asm__ __volatile__("@AO_fetch_and_add1\n" AO_THUMB_GO_ARM AO_BR_ALIGN "1: " AO_MASK_PTR("%4") " ldrex %0, [%4]\n" /* get original */ " add %1, %0, #1\n" /* increment */ AO_MASK_PTR("%4") " strex %2, %1, [%4]\n" /* store them */ " teq %2, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r"(result), "=&r"(tmp), "=&r"(flag), "+m"(*p) : "r"(p) : AO_THUMB_SWITCH_CLOBBERS "cc"); return result; } #define AO_HAVE_fetch_and_add1 AO_INLINE AO_t AO_fetch_and_sub1(volatile AO_t *p) { AO_t result, tmp; int flag; __asm__ __volatile__("@AO_fetch_and_sub1\n" AO_THUMB_GO_ARM AO_BR_ALIGN "1: " AO_MASK_PTR("%4") " ldrex %0, [%4]\n" /* get original */ " sub %1, %0, #1\n" /* decrement */ AO_MASK_PTR("%4") " strex %2, %1, [%4]\n" /* store them */ " teq %2, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r"(result), "=&r"(tmp), "=&r"(flag), "+m"(*p) : "r"(p) : AO_THUMB_SWITCH_CLOBBERS "cc"); return result; } #define AO_HAVE_fetch_and_sub1 AO_INLINE void AO_and(volatile AO_t *p, AO_t value) { AO_t tmp, result; __asm__ __volatile__("@AO_and\n" AO_THUMB_GO_ARM AO_BR_ALIGN "1: " AO_MASK_PTR("%4") " ldrex %0, [%4]\n" " and %1, %0, %3\n" AO_MASK_PTR("%4") " strex %0, %1, [%4]\n" " teq %0, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (tmp), "=&r" (result), "+m" (*p) : "r" (value), "r" (p) : AO_THUMB_SWITCH_CLOBBERS "cc"); } #define AO_HAVE_and AO_INLINE void AO_or(volatile AO_t *p, AO_t value) { AO_t tmp, result; __asm__ __volatile__("@AO_or\n" AO_THUMB_GO_ARM AO_BR_ALIGN "1: " AO_MASK_PTR("%4") " ldrex %0, [%4]\n" " orr %1, %0, %3\n" AO_MASK_PTR("%4") " strex %0, %1, [%4]\n" " teq %0, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (tmp), "=&r" (result), "+m" (*p) : "r" (value), "r" (p) : AO_THUMB_SWITCH_CLOBBERS "cc"); } #define AO_HAVE_or AO_INLINE void AO_xor(volatile AO_t *p, AO_t value) { AO_t tmp, result; __asm__ __volatile__("@AO_xor\n" AO_THUMB_GO_ARM AO_BR_ALIGN "1: " AO_MASK_PTR("%4") " ldrex %0, [%4]\n" " eor %1, %0, %3\n" AO_MASK_PTR("%4") " strex %0, %1, [%4]\n" " teq %0, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (tmp), "=&r" (result), "+m" (*p) : "r" (value), "r" (p) : AO_THUMB_SWITCH_CLOBBERS "cc"); } #define AO_HAVE_xor #endif /* !AO_PREFER_GENERALIZED */ #ifdef AO_ARM_HAVE_LDREXBH AO_INLINE unsigned char AO_char_fetch_and_add(volatile unsigned char *p, unsigned char incr) { unsigned result, tmp; int flag; __asm__ __volatile__("@AO_char_fetch_and_add\n" AO_THUMB_GO_ARM AO_BR_ALIGN "1: " AO_MASK_PTR("%5") " ldrexb %0, [%5]\n" " add %2, %0, %4\n" AO_MASK_PTR("%5") " strexb %1, %2, [%5]\n" " teq %1, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (result), "=&r" (flag), "=&r" (tmp), "+m" (*p) : "r" ((unsigned)incr), "r" (p) : AO_THUMB_SWITCH_CLOBBERS "cc"); return (unsigned char)result; } # define AO_HAVE_char_fetch_and_add AO_INLINE unsigned short AO_short_fetch_and_add(volatile unsigned short *p, unsigned short incr) { unsigned result, tmp; int flag; __asm__ __volatile__("@AO_short_fetch_and_add\n" AO_THUMB_GO_ARM AO_BR_ALIGN "1: " AO_MASK_PTR("%5") " ldrexh %0, [%5]\n" " add %2, %0, %4\n" AO_MASK_PTR("%5") " strexh %1, %2, [%5]\n" " teq %1, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (result), "=&r" (flag), "=&r" (tmp), "+m" (*p) : "r" ((unsigned)incr), "r" (p) : AO_THUMB_SWITCH_CLOBBERS "cc"); return (unsigned short)result; } # define AO_HAVE_short_fetch_and_add #endif /* AO_ARM_HAVE_LDREXBH */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS /* Returns nonzero if the comparison succeeded. */ AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t result, tmp; __asm__ __volatile__("@AO_compare_and_swap\n" AO_THUMB_GO_ARM AO_BR_ALIGN "1: mov %0, #2\n" /* store a flag */ AO_MASK_PTR("%3") " ldrex %1, [%3]\n" /* get original */ " teq %1, %4\n" /* see if match */ AO_MASK_PTR("%3") # ifdef __thumb2__ /* TODO: Eliminate warning: it blocks containing wide Thumb */ /* instructions are deprecated in ARMv8. */ " it eq\n" # endif " strexeq %0, %5, [%3]\n" /* store new one if matched */ " teq %0, #1\n" " beq 1b\n" /* if update failed, repeat */ AO_THUMB_RESTORE_MODE : "=&r"(result), "=&r"(tmp), "+m"(*addr) : "r"(addr), "r"(old_val), "r"(new_val) : AO_THUMB_SWITCH_CLOBBERS "cc"); return !(result&2); /* if succeeded then return 1 else 0 */ } # define AO_HAVE_compare_and_swap #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t fetched_val; int flag; __asm__ __volatile__("@AO_fetch_compare_and_swap\n" AO_THUMB_GO_ARM AO_BR_ALIGN "1: mov %0, #2\n" /* store a flag */ AO_MASK_PTR("%3") " ldrex %1, [%3]\n" /* get original */ " teq %1, %4\n" /* see if match */ AO_MASK_PTR("%3") # ifdef __thumb2__ " it eq\n" # endif " strexeq %0, %5, [%3]\n" /* store new one if matched */ " teq %0, #1\n" " beq 1b\n" /* if update failed, repeat */ AO_THUMB_RESTORE_MODE : "=&r"(flag), "=&r"(fetched_val), "+m"(*addr) : "r"(addr), "r"(old_val), "r"(new_val) : AO_THUMB_SWITCH_CLOBBERS "cc"); return fetched_val; } #define AO_HAVE_fetch_compare_and_swap #ifdef AO_ARM_HAVE_LDREXD # include "../standard_ao_double_t.h" /* "ARM Architecture Reference Manual ARMv7-A/R edition" (chapter */ /* A3.5.3) says that memory accesses caused by LDREXD and STREXD */ /* instructions to doubleword-aligned locations are single-copy */ /* atomic; accesses to 64-bit elements by other instructions might */ /* not be single-copy atomic as they are executed as a sequence of */ /* 32-bit accesses. */ AO_INLINE AO_double_t AO_double_load(const volatile AO_double_t *addr) { AO_double_t result; /* AO_THUMB_GO_ARM is empty. */ __asm__ __volatile__("@AO_double_load\n" AO_MASK_PTR("%1") " ldrexd %0, %H0, [%1]" : "=&r" (result.AO_whole) : "r" (addr) /* : no clobber */); return result; } # define AO_HAVE_double_load AO_INLINE void AO_double_store(volatile AO_double_t *addr, AO_double_t new_val) { AO_double_t old_val; int status; do { /* AO_THUMB_GO_ARM is empty. */ __asm__ __volatile__("@AO_double_store\n" AO_MASK_PTR("%3") " ldrexd %0, %H0, [%3]\n" AO_MASK_PTR("%3") " strexd %1, %4, %H4, [%3]" : "=&r" (old_val.AO_whole), "=&r" (status), "+m" (*addr) : "r" (addr), "r" (new_val.AO_whole) : "cc"); } while (AO_EXPECT_FALSE(status)); } # define AO_HAVE_double_store AO_INLINE int AO_double_compare_and_swap(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { double_ptr_storage tmp; int result = 1; do { /* AO_THUMB_GO_ARM is empty. */ __asm__ __volatile__("@AO_double_compare_and_swap\n" AO_MASK_PTR("%1") " ldrexd %0, %H0, [%1]\n" /* get original to r1 & r2 */ : "=&r"(tmp) : "r"(addr) /* : no clobber */); if (tmp != old_val.AO_whole) break; __asm__ __volatile__( AO_MASK_PTR("%2") " strexd %0, %3, %H3, [%2]\n" /* store new one if matched */ : "=&r"(result), "+m"(*addr) : "r" (addr), "r" (new_val.AO_whole) : "cc"); } while (AO_EXPECT_FALSE(result)); return !result; /* if succeeded then return 1 else 0 */ } # define AO_HAVE_double_compare_and_swap #endif /* AO_ARM_HAVE_LDREXD */ #else /* pre ARMv6 architectures ... */ /* I found a slide set that, if I read it correctly, claims that */ /* Loads followed by either a Load or Store are ordered, but nothing */ /* else is. */ /* It appears that SWP is the only simple memory barrier. */ #include "../all_aligned_atomic_load_store.h" /* The code should run correctly on a multi-core ARMv6+ as well. */ #endif /* !AO_ARM_HAVE_LDREX */ #if !defined(AO_HAVE_test_and_set_full) && !defined(AO_HAVE_test_and_set) \ && defined (AO_ARM_HAVE_SWP) && (!defined(AO_PREFER_GENERALIZED) \ || !defined(AO_HAVE_fetch_compare_and_swap)) AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { AO_TS_VAL_t oldval; /* SWP on ARM is very similar to XCHG on x86. */ /* The first operand is the result, the second the value */ /* to be stored. Both registers must be different from addr. */ /* Make the address operand an early clobber output so it */ /* doesn't overlap with the other operands. The early clobber */ /* on oldval is necessary to prevent the compiler allocating */ /* them to the same register if they are both unused. */ __asm__ __volatile__("@AO_test_and_set_full\n" AO_THUMB_GO_ARM AO_MASK_PTR("%3") " swp %0, %2, [%3]\n" /* Ignore GCC "SWP is deprecated for this architecture" */ /* warning here (for ARMv6+). */ AO_THUMB_RESTORE_MODE : "=&r"(oldval), "=&r"(addr) : "r"(1), "1"(addr) : AO_THUMB_SWITCH_CLOBBERS "memory"); return oldval; } # define AO_HAVE_test_and_set_full #endif /* !AO_HAVE_test_and_set[_full] && AO_ARM_HAVE_SWP */ #define AO_T_IS_INT #else /* AO_GCC_ATOMIC_TEST_AND_SET */ # if defined(__clang__) && !defined(AO_ARM_HAVE_LDREX) /* As of clang-3.8, it cannot compile __atomic_and/or/xor_fetch */ /* library calls yet for pre ARMv6. */ # define AO_SKIPATOMIC_ANY_and_ANY # define AO_SKIPATOMIC_ANY_or_ANY # define AO_SKIPATOMIC_ANY_xor_ANY # endif # ifdef AO_ARM_HAVE_LDREXD # include "../standard_ao_double_t.h" # endif # include "generic.h" #endif /* AO_GCC_ATOMIC_TEST_AND_SET */ #undef AO_ARM_HAVE_DMB #undef AO_ARM_HAVE_LDREX #undef AO_ARM_HAVE_LDREXBH #undef AO_ARM_HAVE_LDREXD #undef AO_ARM_HAVE_SWP #undef AO_BR_ALIGN #undef AO_MASK_PTR #undef AO_SKIPATOMIC_ANY_and_ANY #undef AO_SKIPATOMIC_ANY_or_ANY #undef AO_SKIPATOMIC_ANY_xor_ANY #undef AO_SKIPATOMIC_char_store #undef AO_SKIPATOMIC_char_store_release #undef AO_SKIPATOMIC_int_store #undef AO_SKIPATOMIC_int_store_release #undef AO_SKIPATOMIC_short_store #undef AO_SKIPATOMIC_short_store_release #undef AO_SKIPATOMIC_store #undef AO_SKIPATOMIC_store_release #undef AO_THUMB_GO_ARM #undef AO_THUMB_RESTORE_MODE #undef AO_THUMB_SWITCH_CLOBBERS asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/aarch64.h0000644000000000000000000002201515031566105023565 0ustar rootroot/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * Copyright (c) 2013-2017 Ivan Maidanski * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ /* As of clang-5.0 (and gcc-5.4), __atomic_thread_fence is always */ /* translated to DMB (which is inefficient for AO_nop_write). */ /* TODO: Update it for newer Clang and GCC releases. */ #if !defined(AO_PREFER_BUILTIN_ATOMICS) && !defined(AO_THREAD_SANITIZER) \ && !defined(AO_UNIPROCESSOR) AO_INLINE void AO_nop_write(void) { __asm__ __volatile__("dmb ishst" : : : "memory"); } # define AO_HAVE_nop_write #endif /* There were some bugs in the older clang releases (related to */ /* optimization of functions dealing with __int128 values, supposedly), */ /* so even asm-based implementation did not work correctly. */ #if !defined(__clang__) || AO_CLANG_PREREQ(3, 9) # include "../standard_ao_double_t.h" /* As of gcc-5.4, all built-in load/store and CAS atomics for double */ /* word require -latomic, are not lock-free and cause test_stack */ /* failure, so the asm-based implementation is used for now. */ /* TODO: Update it for newer GCC releases. */ #if (!defined(__ILP32__) && !defined(__clang__)) \ || defined(AO_AARCH64_ASM_LOAD_STORE_CAS) # ifndef AO_PREFER_GENERALIZED AO_INLINE AO_double_t AO_double_load(const volatile AO_double_t *addr) { AO_double_t result; int status; /* Note that STXP cannot be discarded because LD[A]XP is not */ /* single-copy atomic (unlike LDREXD for 32-bit ARM). */ do { __asm__ __volatile__("//AO_double_load\n" # ifdef __ILP32__ " ldxp %w0, %w1, %3\n" " stxp %w2, %w0, %w1, %3" # else " ldxp %0, %1, %3\n" " stxp %w2, %0, %1, %3" # endif : "=&r" (result.AO_val1), "=&r" (result.AO_val2), "=&r" (status) : "Q" (*addr)); } while (AO_EXPECT_FALSE(status)); return result; } # define AO_HAVE_double_load AO_INLINE AO_double_t AO_double_load_acquire(const volatile AO_double_t *addr) { AO_double_t result; int status; do { __asm__ __volatile__("//AO_double_load_acquire\n" # ifdef __ILP32__ " ldaxp %w0, %w1, %3\n" " stxp %w2, %w0, %w1, %3" # else " ldaxp %0, %1, %3\n" " stxp %w2, %0, %1, %3" # endif : "=&r" (result.AO_val1), "=&r" (result.AO_val2), "=&r" (status) : "Q" (*addr)); } while (AO_EXPECT_FALSE(status)); return result; } # define AO_HAVE_double_load_acquire AO_INLINE void AO_double_store(volatile AO_double_t *addr, AO_double_t value) { AO_double_t old_val; int status; do { __asm__ __volatile__("//AO_double_store\n" # ifdef __ILP32__ " ldxp %w0, %w1, %3\n" " stxp %w2, %w4, %w5, %3" # else " ldxp %0, %1, %3\n" " stxp %w2, %4, %5, %3" # endif : "=&r" (old_val.AO_val1), "=&r" (old_val.AO_val2), "=&r" (status), "=Q" (*addr) : "r" (value.AO_val1), "r" (value.AO_val2)); /* Compared to the arm.h implementation, the 'cc' (flags) are */ /* not clobbered because A64 has no concept of conditional */ /* execution. */ } while (AO_EXPECT_FALSE(status)); } # define AO_HAVE_double_store AO_INLINE void AO_double_store_release(volatile AO_double_t *addr, AO_double_t value) { AO_double_t old_val; int status; do { __asm__ __volatile__("//AO_double_store_release\n" # ifdef __ILP32__ " ldxp %w0, %w1, %3\n" " stlxp %w2, %w4, %w5, %3" # else " ldxp %0, %1, %3\n" " stlxp %w2, %4, %5, %3" # endif : "=&r" (old_val.AO_val1), "=&r" (old_val.AO_val2), "=&r" (status), "=Q" (*addr) : "r" (value.AO_val1), "r" (value.AO_val2)); } while (AO_EXPECT_FALSE(status)); } # define AO_HAVE_double_store_release # endif /* !AO_PREFER_GENERALIZED */ AO_INLINE int AO_double_compare_and_swap(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_double_t tmp; int result = 1; do { __asm__ __volatile__("//AO_double_compare_and_swap\n" # ifdef __ILP32__ " ldxp %w0, %w1, %2\n" # else " ldxp %0, %1, %2\n" # endif : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2) : "Q" (*addr)); if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2) break; __asm__ __volatile__( # ifdef __ILP32__ " stxp %w0, %w2, %w3, %1\n" # else " stxp %w0, %2, %3, %1\n" # endif : "=&r" (result), "=Q" (*addr) : "r" (new_val.AO_val1), "r" (new_val.AO_val2)); } while (AO_EXPECT_FALSE(result)); return !result; } # define AO_HAVE_double_compare_and_swap AO_INLINE int AO_double_compare_and_swap_acquire(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_double_t tmp; int result = 1; do { __asm__ __volatile__("//AO_double_compare_and_swap_acquire\n" # ifdef __ILP32__ " ldaxp %w0, %w1, %2\n" # else " ldaxp %0, %1, %2\n" # endif : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2) : "Q" (*addr)); if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2) break; __asm__ __volatile__( # ifdef __ILP32__ " stxp %w0, %w2, %w3, %1\n" # else " stxp %w0, %2, %3, %1\n" # endif : "=&r" (result), "=Q" (*addr) : "r" (new_val.AO_val1), "r" (new_val.AO_val2)); } while (AO_EXPECT_FALSE(result)); return !result; } # define AO_HAVE_double_compare_and_swap_acquire AO_INLINE int AO_double_compare_and_swap_release(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_double_t tmp; int result = 1; do { __asm__ __volatile__("//AO_double_compare_and_swap_release\n" # ifdef __ILP32__ " ldxp %w0, %w1, %2\n" # else " ldxp %0, %1, %2\n" # endif : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2) : "Q" (*addr)); if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2) break; __asm__ __volatile__( # ifdef __ILP32__ " stlxp %w0, %w2, %w3, %1\n" # else " stlxp %w0, %2, %3, %1\n" # endif : "=&r" (result), "=Q" (*addr) : "r" (new_val.AO_val1), "r" (new_val.AO_val2)); } while (AO_EXPECT_FALSE(result)); return !result; } # define AO_HAVE_double_compare_and_swap_release AO_INLINE int AO_double_compare_and_swap_full(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_double_t tmp; int result = 1; do { __asm__ __volatile__("//AO_double_compare_and_swap_full\n" # ifdef __ILP32__ " ldaxp %w0, %w1, %2\n" # else " ldaxp %0, %1, %2\n" # endif : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2) : "Q" (*addr)); if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2) break; __asm__ __volatile__( # ifdef __ILP32__ " stlxp %w0, %w2, %w3, %1\n" # else " stlxp %w0, %2, %3, %1\n" # endif : "=&r" (result), "=Q" (*addr) : "r" (new_val.AO_val1), "r" (new_val.AO_val2)); } while (AO_EXPECT_FALSE(result)); return !result; } # define AO_HAVE_double_compare_and_swap_full #endif /* !__ILP32__ && !__clang__ || AO_AARCH64_ASM_LOAD_STORE_CAS */ /* As of clang-5.0 and gcc-8.1, __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 */ /* macro is still missing (while the double-word CAS is available). */ # ifndef __ILP32__ # define AO_GCC_HAVE_double_SYNC_CAS # endif #endif /* !__clang__ || AO_CLANG_PREREQ(3, 9) */ #if (defined(__clang__) && !AO_CLANG_PREREQ(3, 8)) || defined(__APPLE_CC__) /* __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n macros are missing. */ # define AO_GCC_FORCE_HAVE_CAS #endif #include "generic.h" #undef AO_GCC_FORCE_HAVE_CAS #undef AO_GCC_HAVE_double_SYNC_CAS asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/sh.h0000644000000000000000000000174415031566105022755 0ustar rootroot/* * Copyright (c) 2009 by Takashi YOSHII. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ #include "../all_atomic_load_store.h" #include "../ordered.h" /* sh has tas.b(byte) only */ #include "../test_and_set_t_is_char.h" AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { int oldval; __asm__ __volatile__( "tas.b @%1; movt %0" : "=r" (oldval) : "r" (addr) : "t", "memory"); return oldval? AO_TS_CLEAR : AO_TS_SET; } #define AO_HAVE_test_and_set_full /* TODO: Very incomplete. */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/sparc.h0000644000000000000000000000612015031566105023444 0ustar rootroot/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #if (AO_GNUC_PREREQ(12, 0) || AO_CLANG_PREREQ(13, 0)) \ && !defined(AO_DISABLE_GCC_ATOMICS) /* Probably, it could be enabled for earlier compiler versions as well. */ # include "generic.h" #else /* AO_DISABLE_GCC_ATOMICS */ #include "../all_atomic_load_store.h" /* Real SPARC code uses TSO: */ #include "../ordered_except_wr.h" /* Test_and_set location is just a byte. */ #include "../test_and_set_t_is_char.h" AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { AO_TS_VAL_t oldval; __asm__ __volatile__("ldstub %1,%0" : "=r"(oldval), "=m"(*addr) : "m"(*addr) : "memory"); return oldval; } #define AO_HAVE_test_and_set_full #ifndef AO_NO_SPARC_V9 # ifndef AO_GENERALIZE_ASM_BOOL_CAS /* Returns nonzero if the comparison succeeded. */ AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { __asm__ __volatile__ ("membar #StoreLoad | #LoadLoad\n\t" # if defined(__arch64__) "casx [%1],%2,%0\n\t" # else "cas [%1],%2,%0\n\t" /* 32-bit version */ # endif "membar #StoreLoad | #StoreStore\n\t" : "+r" (new_val) : "r" (addr), "r" (old) : "memory"); return new_val == old; } # define AO_HAVE_compare_and_swap_full # endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { __asm__ __volatile__ ("membar #StoreLoad | #LoadLoad\n\t" # if defined(__arch64__) "casx [%1],%2,%0\n\t" # else "cas [%1],%2,%0\n\t" /* 32-bit version */ # endif "membar #StoreLoad | #StoreStore\n\t" : "+r" (new_val) : "r" (addr), "r" (old) : "memory"); return new_val; } #define AO_HAVE_fetch_compare_and_swap_full #endif /* !AO_NO_SPARC_V9 */ /* TODO: Extend this for SPARC v8 and v9 (V8 also has swap, V9 has CAS, */ /* there are barriers like membar #LoadStore, CASA (32-bit) and */ /* CASXA (64-bit) instructions added in V9). */ #endif /* AO_DISABLE_GCC_ATOMICS */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/hppa.h0000644000000000000000000000757515031566105023303 0ustar rootroot/* * Copyright (c) 2003 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include "../all_atomic_load_store.h" /* Some architecture set descriptions include special "ordered" memory */ /* operations. As far as we can tell, no existing processors actually */ /* require those. Nor does it appear likely that future processors */ /* will. */ #include "../ordered.h" /* GCC will not guarantee the alignment we need, use four lock words */ /* and select the correctly aligned datum. See the glibc 2.3.2 */ /* linuxthread port for the original implementation. */ struct AO_pa_clearable_loc { int data[4]; }; #undef AO_TS_INITIALIZER #define AO_TS_t struct AO_pa_clearable_loc #define AO_TS_INITIALIZER { { 1, 1, 1, 1 } } /* Switch meaning of set and clear, since we only have an atomic clear */ /* instruction. */ typedef enum {AO_PA_TS_set = 0, AO_PA_TS_clear = 1} AO_PA_TS_val; #define AO_TS_VAL_t AO_PA_TS_val #define AO_TS_CLEAR AO_PA_TS_clear #define AO_TS_SET AO_PA_TS_set /* The hppa only has one atomic read and modify memory operation, */ /* load and clear, so hppa spinlocks must use zero to signify that */ /* someone is holding the lock. The address used for the ldcw */ /* semaphore must be 16-byte aligned. */ #define AO_ldcw(a, ret) \ __asm__ __volatile__("ldcw 0(%2), %0" \ : "=r" (ret), "=m" (*(a)) : "r" (a)) /* Because malloc only guarantees 8-byte alignment for malloc'd data, */ /* and GCC only guarantees 8-byte alignment for stack locals, we can't */ /* be assured of 16-byte alignment for atomic lock data even if we */ /* specify "__attribute ((aligned(16)))" in the type declaration. So, */ /* we use a struct containing an array of four ints for the atomic lock */ /* type and dynamically select the 16-byte aligned int from the array */ /* for the semaphore. */ #define AO_PA_LDCW_ALIGNMENT 16 #define AO_ldcw_align(addr) \ ((volatile unsigned *)(((unsigned long)(addr) \ + (AO_PA_LDCW_ALIGNMENT - 1)) \ & ~(AO_PA_LDCW_ALIGNMENT - 1))) /* Works on PA 1.1 and PA 2.0 systems */ AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t * addr) { volatile unsigned int ret; volatile unsigned *a = AO_ldcw_align(addr); AO_ldcw(a, ret); return (AO_TS_VAL_t)ret; } #define AO_HAVE_test_and_set_full AO_INLINE void AO_pa_clear(volatile AO_TS_t * addr) { volatile unsigned *a = AO_ldcw_align(addr); AO_compiler_barrier(); *a = 1; } #define AO_CLEAR(addr) AO_pa_clear(addr) #define AO_HAVE_CLEAR #undef AO_PA_LDCW_ALIGNMENT #undef AO_ldcw #undef AO_ldcw_align asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/cris.h0000644000000000000000000000522715031566105023303 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* FIXME: seems to be untested. */ #include "../all_atomic_load_store.h" #include "../ordered.h" /* There are no multiprocessor implementations. */ #include "../test_and_set_t_is_ao_t.h" /* * The architecture apparently supports an "f" flag which is * set on preemption. This essentially gives us load-locked, * store-conditional primitives, though I'm not quite sure how * this would work on a hypothetical multiprocessor. -HB * * For details, see * http://developer.axis.com/doc/hardware/etrax100lx/prog_man/ * 1_architectural_description.pdf * * TODO: Presumably many other primitives (notably CAS, including the double- * width versions) could be implemented in this manner, if someone got * around to it. */ AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { /* Ripped from linuxthreads/sysdeps/cris/pt-machine.h */ register unsigned long int ret; /* Note the use of a dummy output of *addr to expose the write. The memory barrier is to stop *other* writes being moved past this code. */ __asm__ __volatile__("clearf\n" "0:\n\t" "movu.b [%2],%0\n\t" "ax\n\t" "move.b %3,[%2]\n\t" "bwf 0b\n\t" "clearf" : "=&r" (ret), "=m" (*addr) : "r" (addr), "r" ((int) 1), "m" (*addr) : "memory"); return ret; } #define AO_HAVE_test_and_set_full asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/avr32.h0000644000000000000000000000461515031566105023300 0ustar rootroot/* * Copyright (C) 2009 Bradley Smith * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "../all_atomic_load_store.h" #include "../ordered.h" /* There are no multiprocessor implementations. */ #include "../test_and_set_t_is_ao_t.h" #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { register long ret; __asm__ __volatile__( "xchg %[oldval], %[mem], %[newval]" : [oldval] "=&r"(ret) : [mem] "r"(addr), [newval] "r"(1) : "memory"); return (AO_TS_VAL_t)ret; } # define AO_HAVE_test_and_set_full #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { register long ret; __asm__ __volatile__( "1: ssrf 5\n" " ld.w %[res], %[mem]\n" " eor %[res], %[oldval]\n" " brne 2f\n" " stcond %[mem], %[newval]\n" " brne 1b\n" "2:\n" : [res] "=&r"(ret), [mem] "=m"(*addr) : "m"(*addr), [newval] "r"(new_val), [oldval] "r"(old) : "cc", "memory"); return (int)ret; } #define AO_HAVE_compare_and_swap_full /* TODO: implement AO_fetch_compare_and_swap. */ #define AO_T_IS_INT asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.h0000644000000000000000000006233415031566105025243 0ustar rootroot/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_char_ARITHM AO_INLINE unsigned/**/char AO_char_fetch_and_add(volatile unsigned/**/char *addr, unsigned/**/char incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED); } #define AO_HAVE_char_fetch_and_add #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_char_and(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_char_and #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_char_or(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_char_or #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_char_xor(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_char_xor #endif #endif /* !AO_NO_char_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_short_ARITHM AO_INLINE unsigned/**/short AO_short_fetch_and_add(volatile unsigned/**/short *addr, unsigned/**/short incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED); } #define AO_HAVE_short_fetch_and_add #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_short_and(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_short_and #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_short_or(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_short_or #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_short_xor(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_short_xor #endif #endif /* !AO_NO_short_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_int_ARITHM AO_INLINE unsigned AO_int_fetch_and_add(volatile unsigned *addr, unsigned incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED); } #define AO_HAVE_int_fetch_and_add #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_int_and(volatile unsigned *addr, unsigned value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_int_and #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_int_or(volatile unsigned *addr, unsigned value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_int_or #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_int_xor(volatile unsigned *addr, unsigned value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_int_xor #endif #endif /* !AO_NO_int_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_ARITHM AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *addr, AO_t incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED); } #define AO_HAVE_fetch_and_add #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_and(volatile AO_t *addr, AO_t value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_and #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_or(volatile AO_t *addr, AO_t value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_or #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_xor(volatile AO_t *addr, AO_t value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_xor #endif #endif /* !AO_NO_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_char_ARITHM AO_INLINE unsigned/**/char AO_char_fetch_and_add_acquire(volatile unsigned/**/char *addr, unsigned/**/char incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE); } #define AO_HAVE_char_fetch_and_add_acquire #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_char_and_acquire(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE); } # define AO_HAVE_char_and_acquire #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_char_or_acquire(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE); } # define AO_HAVE_char_or_acquire #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_char_xor_acquire(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE); } # define AO_HAVE_char_xor_acquire #endif #endif /* !AO_NO_char_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_short_ARITHM AO_INLINE unsigned/**/short AO_short_fetch_and_add_acquire(volatile unsigned/**/short *addr, unsigned/**/short incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE); } #define AO_HAVE_short_fetch_and_add_acquire #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_short_and_acquire(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE); } # define AO_HAVE_short_and_acquire #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_short_or_acquire(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE); } # define AO_HAVE_short_or_acquire #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_short_xor_acquire(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE); } # define AO_HAVE_short_xor_acquire #endif #endif /* !AO_NO_short_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_int_ARITHM AO_INLINE unsigned AO_int_fetch_and_add_acquire(volatile unsigned *addr, unsigned incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE); } #define AO_HAVE_int_fetch_and_add_acquire #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_int_and_acquire(volatile unsigned *addr, unsigned value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE); } # define AO_HAVE_int_and_acquire #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_int_or_acquire(volatile unsigned *addr, unsigned value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE); } # define AO_HAVE_int_or_acquire #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_int_xor_acquire(volatile unsigned *addr, unsigned value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE); } # define AO_HAVE_int_xor_acquire #endif #endif /* !AO_NO_int_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_ARITHM AO_INLINE AO_t AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE); } #define AO_HAVE_fetch_and_add_acquire #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_and_acquire(volatile AO_t *addr, AO_t value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE); } # define AO_HAVE_and_acquire #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_or_acquire(volatile AO_t *addr, AO_t value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE); } # define AO_HAVE_or_acquire #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_xor_acquire(volatile AO_t *addr, AO_t value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE); } # define AO_HAVE_xor_acquire #endif #endif /* !AO_NO_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_char_ARITHM AO_INLINE unsigned/**/char AO_char_fetch_and_add_release(volatile unsigned/**/char *addr, unsigned/**/char incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE); } #define AO_HAVE_char_fetch_and_add_release #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_char_and_release(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_char_and_release #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_char_or_release(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_char_or_release #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_char_xor_release(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_char_xor_release #endif #endif /* !AO_NO_char_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_short_ARITHM AO_INLINE unsigned/**/short AO_short_fetch_and_add_release(volatile unsigned/**/short *addr, unsigned/**/short incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE); } #define AO_HAVE_short_fetch_and_add_release #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_short_and_release(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_short_and_release #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_short_or_release(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_short_or_release #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_short_xor_release(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_short_xor_release #endif #endif /* !AO_NO_short_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_int_ARITHM AO_INLINE unsigned AO_int_fetch_and_add_release(volatile unsigned *addr, unsigned incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE); } #define AO_HAVE_int_fetch_and_add_release #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_int_and_release(volatile unsigned *addr, unsigned value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_int_and_release #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_int_or_release(volatile unsigned *addr, unsigned value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_int_or_release #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_int_xor_release(volatile unsigned *addr, unsigned value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_int_xor_release #endif #endif /* !AO_NO_int_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_ARITHM AO_INLINE AO_t AO_fetch_and_add_release(volatile AO_t *addr, AO_t incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE); } #define AO_HAVE_fetch_and_add_release #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_and_release(volatile AO_t *addr, AO_t value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_and_release #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_or_release(volatile AO_t *addr, AO_t value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_or_release #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_xor_release(volatile AO_t *addr, AO_t value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_xor_release #endif #endif /* !AO_NO_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_char_ARITHM AO_INLINE unsigned/**/char AO_char_fetch_and_add_full(volatile unsigned/**/char *addr, unsigned/**/char incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST); } #define AO_HAVE_char_fetch_and_add_full #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_char_and_full(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST); } # define AO_HAVE_char_and_full #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_char_or_full(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST); } # define AO_HAVE_char_or_full #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_char_xor_full(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST); } # define AO_HAVE_char_xor_full #endif #endif /* !AO_NO_char_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_short_ARITHM AO_INLINE unsigned/**/short AO_short_fetch_and_add_full(volatile unsigned/**/short *addr, unsigned/**/short incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST); } #define AO_HAVE_short_fetch_and_add_full #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_short_and_full(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST); } # define AO_HAVE_short_and_full #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_short_or_full(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST); } # define AO_HAVE_short_or_full #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_short_xor_full(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST); } # define AO_HAVE_short_xor_full #endif #endif /* !AO_NO_short_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_int_ARITHM AO_INLINE unsigned AO_int_fetch_and_add_full(volatile unsigned *addr, unsigned incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST); } #define AO_HAVE_int_fetch_and_add_full #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_int_and_full(volatile unsigned *addr, unsigned value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST); } # define AO_HAVE_int_and_full #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_int_or_full(volatile unsigned *addr, unsigned value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST); } # define AO_HAVE_int_or_full #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_int_xor_full(volatile unsigned *addr, unsigned value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST); } # define AO_HAVE_int_xor_full #endif #endif /* !AO_NO_int_ARITHM */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_ARITHM AO_INLINE AO_t AO_fetch_and_add_full(volatile AO_t *addr, AO_t incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST); } #define AO_HAVE_fetch_and_add_full #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_and_full(volatile AO_t *addr, AO_t value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST); } # define AO_HAVE_and_full #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_or_full(volatile AO_t *addr, AO_t value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST); } # define AO_HAVE_or_full #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_xor_full(volatile AO_t *addr, AO_t value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST); } # define AO_HAVE_xor_full #endif #endif /* !AO_NO_ARITHM */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/alpha.h0000644000000000000000000000400215031566105023416 0ustar rootroot/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #include "../loadstore/atomic_load.h" #include "../loadstore/atomic_store.h" #include "../test_and_set_t_is_ao_t.h" #define AO_NO_DD_ORDERING /* Data dependence does not imply read ordering. */ AO_INLINE void AO_nop_full(void) { __asm__ __volatile__("mb" : : : "memory"); } #define AO_HAVE_nop_full AO_INLINE void AO_nop_write(void) { __asm__ __volatile__("wmb" : : : "memory"); } #define AO_HAVE_nop_write /* mb should be used for AO_nop_read(). That's the default. */ /* TODO: implement AO_fetch_and_add explicitly. */ /* We believe that ldq_l ... stq_c does not imply any memory barrier. */ AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val) { unsigned long was_equal; unsigned long temp; __asm__ __volatile__( "1: ldq_l %0,%1\n" " cmpeq %0,%4,%2\n" " mov %3,%0\n" " beq %2,2f\n" " stq_c %0,%1\n" " beq %0,1b\n" "2:\n" : "=&r" (temp), "+m" (*addr), "=&r" (was_equal) : "r" (new_val), "Ir" (old) :"memory"); return (int)was_equal; } #define AO_HAVE_compare_and_swap /* TODO: implement AO_fetch_compare_and_swap */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/powerpc.h0000644000000000000000000002566715031566105024034 0ustar rootroot/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ /* Memory model documented at http://www-106.ibm.com/developerworks/ */ /* eserver/articles/archguide.html and (clearer) */ /* http://www-106.ibm.com/developerworks/eserver/articles/powerpc.html. */ /* There appears to be no implicit ordering between any kind of */ /* independent memory references. */ /* TODO: Implement double-wide operations if available. */ #if (AO_GNUC_PREREQ(4, 8) || AO_CLANG_PREREQ(3, 8)) \ && !defined(AO_DISABLE_GCC_ATOMICS) /* Probably, it could be enabled even for earlier gcc/clang versions. */ /* TODO: As of clang-3.8.1, it emits lwsync in AO_load_acquire */ /* (i.e., the code is less efficient than the one given below). */ # include "generic.h" #else /* AO_DISABLE_GCC_ATOMICS */ /* Architecture enforces some ordering based on control dependence. */ /* I don't know if that could help. */ /* Data-dependent loads are always ordered. */ /* Based on the above references, eieio is intended for use on */ /* uncached memory, which we don't support. It does not order loads */ /* from cached memory. */ #include "../all_aligned_atomic_load_store.h" #include "../test_and_set_t_is_ao_t.h" /* There seems to be no byte equivalent of lwarx, so this */ /* may really be what we want, at least in the 32-bit case. */ AO_INLINE void AO_nop_full(void) { __asm__ __volatile__("sync" : : : "memory"); } #define AO_HAVE_nop_full /* lwsync apparently works for everything but a StoreLoad barrier. */ AO_INLINE void AO_lwsync(void) { #ifdef __NO_LWSYNC__ __asm__ __volatile__("sync" : : : "memory"); #else __asm__ __volatile__("lwsync" : : : "memory"); #endif } #define AO_nop_write() AO_lwsync() #define AO_HAVE_nop_write #define AO_nop_read() AO_lwsync() #define AO_HAVE_nop_read #if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__) /* ppc64 uses ld not lwz */ # define AO_PPC_LD "ld" # define AO_PPC_LxARX "ldarx" # define AO_PPC_CMPx "cmpd" # define AO_PPC_STxCXd "stdcx." # define AO_PPC_LOAD_CLOBBER "cr0" #else # define AO_PPC_LD "lwz" # define AO_PPC_LxARX "lwarx" # define AO_PPC_CMPx "cmpw" # define AO_PPC_STxCXd "stwcx." # define AO_PPC_LOAD_CLOBBER "cc" /* FIXME: We should get gcc to allocate one of the condition */ /* registers. I always got "impossible constraint" when I */ /* tried the "y" constraint. */ # define AO_T_IS_INT #endif #ifdef _AIX /* Labels are not supported on AIX. */ /* ppc64 has same size of instructions as 32-bit one. */ # define AO_PPC_L(label) /* empty */ # define AO_PPC_BR_A(labelBF, addr) addr #else # define AO_PPC_L(label) label ": " # define AO_PPC_BR_A(labelBF, addr) labelBF #endif /* We explicitly specify load_acquire, since it is important, and can */ /* be implemented relatively cheaply. It could be implemented */ /* with an ordinary load followed by a lwsync. But the general wisdom */ /* seems to be that a data dependent branch followed by an isync is */ /* cheaper. And the documentation is fairly explicit that this also */ /* has acquire semantics. */ AO_INLINE AO_t AO_load_acquire(const volatile AO_t *addr) { AO_t result; __asm__ __volatile__ ( AO_PPC_LD "%U1%X1 %0,%1\n" "cmpw %0,%0\n" "bne- " AO_PPC_BR_A("1f", "$+4") "\n" AO_PPC_L("1") "isync\n" : "=r" (result) : "m"(*addr) : "memory", AO_PPC_LOAD_CLOBBER); return result; } #define AO_HAVE_load_acquire /* We explicitly specify store_release, since it relies */ /* on the fact that lwsync is also a LoadStore barrier. */ AO_INLINE void AO_store_release(volatile AO_t *addr, AO_t value) { AO_lwsync(); *addr = value; } #define AO_HAVE_store_release #ifndef AO_PREFER_GENERALIZED /* This is similar to the code in the garbage collector. Deleting */ /* this and having it synthesized from compare_and_swap would probably */ /* only cost us a load immediate instruction. */ AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { /* TODO: And we should be using smaller objects anyway. */ AO_t oldval; AO_t temp = 1; /* locked value */ __asm__ __volatile__( AO_PPC_L("1") AO_PPC_LxARX " %0,0,%1\n" /* load and reserve */ AO_PPC_CMPx "i %0, 0\n" /* if load is */ "bne " AO_PPC_BR_A("2f", "$+12") "\n" /* non-zero, return already set */ AO_PPC_STxCXd " %2,0,%1\n" /* else store conditional */ "bne- " AO_PPC_BR_A("1b", "$-16") "\n" /* retry if lost reservation */ AO_PPC_L("2") "\n" /* oldval is zero if we set */ : "=&r"(oldval) : "r"(addr), "r"(temp) : "memory", "cr0"); return (AO_TS_VAL_t)oldval; } #define AO_HAVE_test_and_set AO_INLINE AO_TS_VAL_t AO_test_and_set_acquire(volatile AO_TS_t *addr) { AO_TS_VAL_t result = AO_test_and_set(addr); AO_lwsync(); return result; } #define AO_HAVE_test_and_set_acquire AO_INLINE AO_TS_VAL_t AO_test_and_set_release(volatile AO_TS_t *addr) { AO_lwsync(); return AO_test_and_set(addr); } #define AO_HAVE_test_and_set_release AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { AO_TS_VAL_t result; AO_lwsync(); result = AO_test_and_set(addr); AO_lwsync(); return result; } #define AO_HAVE_test_and_set_full #endif /* !AO_PREFER_GENERALIZED */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val) { AO_t oldval; int result = 0; __asm__ __volatile__( AO_PPC_L("1") AO_PPC_LxARX " %0,0,%2\n" /* load and reserve */ AO_PPC_CMPx " %0, %4\n" /* if load is not equal to */ "bne " AO_PPC_BR_A("2f", "$+16") "\n" /* old, fail */ AO_PPC_STxCXd " %3,0,%2\n" /* else store conditional */ "bne- " AO_PPC_BR_A("1b", "$-16") "\n" /* retry if lost reservation */ "li %1,1\n" /* result = 1; */ AO_PPC_L("2") "\n" : "=&r"(oldval), "=&r"(result) : "r"(addr), "r"(new_val), "r"(old), "1"(result) : "memory", "cr0"); return result; } # define AO_HAVE_compare_and_swap AO_INLINE int AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val) { int result = AO_compare_and_swap(addr, old, new_val); AO_lwsync(); return result; } # define AO_HAVE_compare_and_swap_acquire AO_INLINE int AO_compare_and_swap_release(volatile AO_t *addr, AO_t old, AO_t new_val) { AO_lwsync(); return AO_compare_and_swap(addr, old, new_val); } # define AO_HAVE_compare_and_swap_release AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { int result; AO_lwsync(); result = AO_compare_and_swap(addr, old, new_val); if (result) AO_lwsync(); return result; } # define AO_HAVE_compare_and_swap_full #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t fetched_val; __asm__ __volatile__( AO_PPC_L("1") AO_PPC_LxARX " %0,0,%1\n" /* load and reserve */ AO_PPC_CMPx " %0, %3\n" /* if load is not equal to */ "bne " AO_PPC_BR_A("2f", "$+12") "\n" /* old_val, fail */ AO_PPC_STxCXd " %2,0,%1\n" /* else store conditional */ "bne- " AO_PPC_BR_A("1b", "$-16") "\n" /* retry if lost reservation */ AO_PPC_L("2") "\n" : "=&r"(fetched_val) : "r"(addr), "r"(new_val), "r"(old_val) : "memory", "cr0"); return fetched_val; } #define AO_HAVE_fetch_compare_and_swap AO_INLINE AO_t AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t result = AO_fetch_compare_and_swap(addr, old_val, new_val); AO_lwsync(); return result; } #define AO_HAVE_fetch_compare_and_swap_acquire AO_INLINE AO_t AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_lwsync(); return AO_fetch_compare_and_swap(addr, old_val, new_val); } #define AO_HAVE_fetch_compare_and_swap_release AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t result; AO_lwsync(); result = AO_fetch_compare_and_swap(addr, old_val, new_val); if (result == old_val) AO_lwsync(); return result; } #define AO_HAVE_fetch_compare_and_swap_full #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *addr, AO_t incr) { AO_t oldval; AO_t newval; __asm__ __volatile__( AO_PPC_L("1") AO_PPC_LxARX " %0,0,%2\n" /* load and reserve */ "add %1,%0,%3\n" /* increment */ AO_PPC_STxCXd " %1,0,%2\n" /* store conditional */ "bne- " AO_PPC_BR_A("1b", "$-12") "\n" /* retry if lost reservation */ : "=&r"(oldval), "=&r"(newval) : "r"(addr), "r"(incr) : "memory", "cr0"); return oldval; } #define AO_HAVE_fetch_and_add AO_INLINE AO_t AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr) { AO_t result = AO_fetch_and_add(addr, incr); AO_lwsync(); return result; } #define AO_HAVE_fetch_and_add_acquire AO_INLINE AO_t AO_fetch_and_add_release(volatile AO_t *addr, AO_t incr) { AO_lwsync(); return AO_fetch_and_add(addr, incr); } #define AO_HAVE_fetch_and_add_release AO_INLINE AO_t AO_fetch_and_add_full(volatile AO_t *addr, AO_t incr) { AO_t result; AO_lwsync(); result = AO_fetch_and_add(addr, incr); AO_lwsync(); return result; } #define AO_HAVE_fetch_and_add_full #endif /* !AO_PREFER_GENERALIZED */ #undef AO_PPC_BR_A #undef AO_PPC_CMPx #undef AO_PPC_L #undef AO_PPC_LD #undef AO_PPC_LOAD_CLOBBER #undef AO_PPC_LxARX #undef AO_PPC_STxCXd #endif /* AO_DISABLE_GCC_ATOMICS */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/tile.h0000644000000000000000000000251015031566105023270 0ustar rootroot/* * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ #if (AO_GNUC_PREREQ(4, 8) || AO_CLANG_PREREQ(3, 4)) \ && !defined(AO_DISABLE_GCC_ATOMICS) # include "generic.h" #else /* AO_DISABLE_GCC_ATOMICS */ /* Minimal support for tile. */ # include "../all_atomic_load_store.h" # include "../test_and_set_t_is_ao_t.h" AO_INLINE void AO_nop_full(void) { __sync_synchronize(); } # define AO_HAVE_nop_full AO_INLINE AO_t AO_fetch_and_add_full(volatile AO_t *p, AO_t incr) { return __sync_fetch_and_add(p, incr); } # define AO_HAVE_fetch_and_add_full AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return __sync_val_compare_and_swap(addr, old_val, new_val /* empty protection list */); } # define AO_HAVE_fetch_compare_and_swap_full #endif /* AO_DISABLE_GCC_ATOMICS */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.template0000644000000000000000000000306315031566105026621 0ustar rootroot/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #ifndef AO_NO_XSIZE_ARITHM AO_INLINE XCTYPE AO_XSIZE_fetch_and_add_XBAR(volatile XCTYPE *addr, XCTYPE incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_XGCCBAR); } #define AO_HAVE_XSIZE_fetch_and_add_XBAR #ifndef AO_SKIPATOMIC_ANY_and_ANY AO_INLINE void AO_XSIZE_and_XBAR(volatile XCTYPE *addr, XCTYPE value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_XGCCBAR); } # define AO_HAVE_XSIZE_and_XBAR #endif #ifndef AO_SKIPATOMIC_ANY_or_ANY AO_INLINE void AO_XSIZE_or_XBAR(volatile XCTYPE *addr, XCTYPE value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_XGCCBAR); } # define AO_HAVE_XSIZE_or_XBAR #endif #ifndef AO_SKIPATOMIC_ANY_xor_ANY AO_INLINE void AO_XSIZE_xor_XBAR(volatile XCTYPE *addr, XCTYPE value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_XGCCBAR); } # define AO_HAVE_XSIZE_xor_XBAR #endif #endif /* !AO_NO_XSIZE_ARITHM */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/mips.h0000644000000000000000000001314115031566105023305 0ustar rootroot/* * Copyright (c) 2005,2007 Thiemo Seufer * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ /* * FIXME: This should probably make finer distinctions. SGI MIPS is * much more strongly ordered, and in fact closer to sequentially * consistent. This is really aimed at modern embedded implementations. */ /* Data dependence does not imply read ordering. */ #define AO_NO_DD_ORDERING /* #include "../standard_ao_double_t.h" */ /* TODO: Implement double-wide operations if available. */ #if (AO_GNUC_PREREQ(4, 9) || AO_CLANG_PREREQ(3, 5)) \ && !defined(AO_DISABLE_GCC_ATOMICS) /* Probably, it could be enabled even for earlier gcc/clang versions. */ /* As of clang-3.6/mips[64], __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n missing. */ # if defined(__clang__) # define AO_GCC_FORCE_HAVE_CAS # endif # include "generic.h" #else /* AO_DISABLE_GCC_ATOMICS */ # include "../test_and_set_t_is_ao_t.h" # include "../all_aligned_atomic_load_store.h" # if !defined(_ABI64) || _MIPS_SIM != _ABI64 # define AO_T_IS_INT # if __mips_isa_rev >= 6 /* Encoding of ll/sc in mips rel6 differs from that of mips2/3. */ # define AO_MIPS_SET_ISA "" # else # define AO_MIPS_SET_ISA " .set mips2\n" # endif # define AO_MIPS_LL_1(args) " ll " args "\n" # define AO_MIPS_SC(args) " sc " args "\n" # else # if __mips_isa_rev >= 6 # define AO_MIPS_SET_ISA "" # else # define AO_MIPS_SET_ISA " .set mips3\n" # endif # define AO_MIPS_LL_1(args) " lld " args "\n" # define AO_MIPS_SC(args) " scd " args "\n" # endif /* _MIPS_SIM == _ABI64 */ #ifdef AO_ICE9A1_LLSC_WAR /* ICE9 rev A1 chip (used in very few systems) is reported to */ /* have a low-frequency bug that causes LL to fail. */ /* To workaround, just issue the second 'LL'. */ # define AO_MIPS_LL(args) AO_MIPS_LL_1(args) AO_MIPS_LL_1(args) #else # define AO_MIPS_LL(args) AO_MIPS_LL_1(args) #endif AO_INLINE void AO_nop_full(void) { __asm__ __volatile__( " .set push\n" AO_MIPS_SET_ISA " .set noreorder\n" " .set nomacro\n" " sync\n" " .set pop" : : : "memory"); } #define AO_HAVE_nop_full #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *addr, AO_t incr) { register int result; register int temp; __asm__ __volatile__( " .set push\n" AO_MIPS_SET_ISA " .set noreorder\n" " .set nomacro\n" "1: " AO_MIPS_LL("%0, %2") " addu %1, %0, %3\n" AO_MIPS_SC("%1, %2") " beqz %1, 1b\n" " nop\n" " .set pop" : "=&r" (result), "=&r" (temp), "+m" (*addr) : "Ir" (incr) : "memory"); return (AO_t)result; } #define AO_HAVE_fetch_and_add AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { register int oldval; register int temp; __asm__ __volatile__( " .set push\n" AO_MIPS_SET_ISA " .set noreorder\n" " .set nomacro\n" "1: " AO_MIPS_LL("%0, %2") " move %1, %3\n" AO_MIPS_SC("%1, %2") " beqz %1, 1b\n" " nop\n" " .set pop" : "=&r" (oldval), "=&r" (temp), "+m" (*addr) : "r" (1) : "memory"); return (AO_TS_VAL_t)oldval; } #define AO_HAVE_test_and_set /* TODO: Implement AO_and/or/xor primitives directly. */ #endif /* !AO_PREFER_GENERALIZED */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val) { register int was_equal = 0; register int temp; __asm__ __volatile__( " .set push\n" AO_MIPS_SET_ISA " .set noreorder\n" " .set nomacro\n" "1: " AO_MIPS_LL("%0, %1") " bne %0, %4, 2f\n" " move %0, %3\n" AO_MIPS_SC("%0, %1") " .set pop\n" " beqz %0, 1b\n" " li %2, 1\n" "2:" : "=&r" (temp), "+m" (*addr), "+r" (was_equal) : "r" (new_val), "r" (old) : "memory"); return was_equal; } # define AO_HAVE_compare_and_swap #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val) { register int fetched_val; register int temp; __asm__ __volatile__( " .set push\n" AO_MIPS_SET_ISA " .set noreorder\n" " .set nomacro\n" "1: " AO_MIPS_LL("%0, %2") " bne %0, %4, 2f\n" " move %1, %3\n" AO_MIPS_SC("%1, %2") " beqz %1, 1b\n" " nop\n" " .set pop\n" "2:" : "=&r" (fetched_val), "=&r" (temp), "+m" (*addr) : "r" (new_val), "Jr" (old) : "memory"); return (AO_t)fetched_val; } #define AO_HAVE_fetch_compare_and_swap #endif /* AO_DISABLE_GCC_ATOMICS */ /* CAS primitives with acquire, release and full semantics are */ /* generated automatically (and AO_int_... primitives are */ /* defined properly after the first generalization pass). */ #undef AO_GCC_FORCE_HAVE_CAS #undef AO_MIPS_LL #undef AO_MIPS_LL_1 #undef AO_MIPS_SC #undef AO_MIPS_SET_ISA asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.template0000644000000000000000000001330315031566105026443 0ustar rootroot/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #if !defined(AO_GCC_HAVE_XSIZE_SYNC_CAS) || !defined(AO_PREFER_GENERALIZED) AO_INLINE XCTYPE AO_XSIZE_load(const volatile XCTYPE *addr) { return __atomic_load_n(addr, __ATOMIC_RELAXED); } #define AO_HAVE_XSIZE_load AO_INLINE XCTYPE AO_XSIZE_load_acquire(const volatile XCTYPE *addr) { return __atomic_load_n(addr, __ATOMIC_ACQUIRE); } #define AO_HAVE_XSIZE_load_acquire /* XSIZE_load_read is defined using load and nop_read. */ /* TODO: Map it to ACQUIRE. We should be strengthening the read and */ /* write stuff to the more general acquire/release versions. It almost */ /* never makes a difference and is much less error-prone. */ /* XSIZE_load_full is generalized using load and nop_full. */ /* TODO: Map it to SEQ_CST and clarify the documentation. */ /* TODO: Map load_dd_acquire_read to ACQUIRE. Ideally it should be */ /* mapped to CONSUME, but the latter is currently broken. */ /* XSIZE_store_full definition is omitted similar to load_full reason. */ /* TODO: Map store_write to RELEASE. */ #ifndef AO_SKIPATOMIC_XSIZE_store AO_INLINE void AO_XSIZE_store(volatile XCTYPE *addr, XCTYPE value) { __atomic_store_n(addr, value, __ATOMIC_RELAXED); } # define AO_HAVE_XSIZE_store #endif #ifndef AO_SKIPATOMIC_XSIZE_store_release AO_INLINE void AO_XSIZE_store_release(volatile XCTYPE *addr, XCTYPE value) { __atomic_store_n(addr, value, __ATOMIC_RELEASE); } # define AO_HAVE_XSIZE_store_release #endif #endif /* !AO_GCC_HAVE_XSIZE_SYNC_CAS || !AO_PREFER_GENERALIZED */ #ifdef AO_GCC_HAVE_XSIZE_SYNC_CAS AO_INLINE XCTYPE AO_XSIZE_fetch_compare_and_swap(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { (void)__atomic_compare_exchange_n(addr, &old_val /* p_expected */, new_val /* desired */, 0 /* is_weak: false */, __ATOMIC_RELAXED /* success */, __ATOMIC_RELAXED /* failure */); return old_val; } # define AO_HAVE_XSIZE_fetch_compare_and_swap AO_INLINE XCTYPE AO_XSIZE_fetch_compare_and_swap_acquire(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); return old_val; } # define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire AO_INLINE XCTYPE AO_XSIZE_fetch_compare_and_swap_release(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED /* failure */); return old_val; } # define AO_HAVE_XSIZE_fetch_compare_and_swap_release AO_INLINE XCTYPE AO_XSIZE_fetch_compare_and_swap_full(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE /* failure */); return old_val; } # define AO_HAVE_XSIZE_fetch_compare_and_swap_full # ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_XSIZE_compare_and_swap(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); } # define AO_HAVE_XSIZE_compare_and_swap AO_INLINE int AO_XSIZE_compare_and_swap_acquire(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); } # define AO_HAVE_XSIZE_compare_and_swap_acquire AO_INLINE int AO_XSIZE_compare_and_swap_release(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED /* failure */); } # define AO_HAVE_XSIZE_compare_and_swap_release AO_INLINE int AO_XSIZE_compare_and_swap_full(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE /* failure */); } # define AO_HAVE_XSIZE_compare_and_swap_full # endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ #endif /* AO_GCC_HAVE_XSIZE_SYNC_CAS */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/e2k.h0000644000000000000000000000237515031566105023025 0ustar rootroot/* * Copyright (c) 2022 Ivan Maidanski * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* As of clang-9, all __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n are missing. */ #define AO_GCC_FORCE_HAVE_CAS #include "generic.h" #undef AO_GCC_FORCE_HAVE_CAS asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/s390.h0000644000000000000000000000633615031566105023043 0ustar rootroot/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #if (AO_GNUC_PREREQ(5, 4) || AO_CLANG_PREREQ(8, 0)) && defined(__s390x__) \ && !defined(AO_DISABLE_GCC_ATOMICS) /* Probably, it could be enabled for earlier clang/gcc versions. */ /* But, e.g., clang-3.8.0 produces a backend error for AtomicFence. */ # include "generic.h" #else /* AO_DISABLE_GCC_ATOMICS */ /* The relevant documentation appears to be at */ /* http://publibz.boulder.ibm.com/epubs/pdf/dz9zr003.pdf */ /* around page 5-96. Apparently: */ /* - Memory references in general are atomic only for a single */ /* byte. But it appears that the most common load/store */ /* instructions also guarantee atomicity for aligned */ /* operands of standard types. WE FOOLISHLY ASSUME that */ /* compilers only generate those. If that turns out to be */ /* wrong, we need inline assembly code for AO_load and */ /* AO_store. */ /* - A store followed by a load is unordered since the store */ /* may be delayed. Otherwise everything is ordered. */ /* - There is a hardware compare-and-swap (CS) instruction. */ #include "../all_aligned_atomic_load_store.h" #include "../ordered_except_wr.h" #include "../test_and_set_t_is_ao_t.h" /* TODO: Is there a way to do byte-sized test-and-set? */ /* TODO: AO_nop_full should probably be implemented directly. */ /* It appears that certain BCR instructions have that effect. */ /* Presumably they're cheaper than CS? */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { int retval; __asm__ __volatile__ ( # ifndef __s390x__ " cs %1,%2,0(%3)\n" # else " csg %1,%2,0(%3)\n" # endif " ipm %0\n" " srl %0,28\n" : "=&d" (retval), "+d" (old) : "d" (new_val), "a" (addr) : "cc", "memory"); return retval == 0; } #define AO_HAVE_compare_and_swap_full #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { __asm__ __volatile__ ( # ifndef __s390x__ " cs %0,%2,%1\n" # else " csg %0,%2,%1\n" # endif : "+d" (old), "=Q" (*addr) : "d" (new_val), "m" (*addr) : "cc", "memory"); return old; } #define AO_HAVE_fetch_compare_and_swap_full #endif /* AO_DISABLE_GCC_ATOMICS */ /* TODO: Add double-wide operations for 32-bit executables. */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/gcc/hexagon.h0000644000000000000000000001115215031566105023766 0ustar rootroot/* * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ #if AO_CLANG_PREREQ(3, 9) && !defined(AO_DISABLE_GCC_ATOMICS) /* Probably, it could be enabled for earlier clang versions as well. */ /* As of clang-3.9, __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n are missing. */ # define AO_GCC_FORCE_HAVE_CAS # define AO_GCC_HAVE_double_SYNC_CAS # include "../standard_ao_double_t.h" # include "generic.h" #else /* AO_DISABLE_GCC_ATOMICS */ #include "../all_aligned_atomic_load_store.h" #include "../test_and_set_t_is_ao_t.h" /* There's also "isync" and "barrier"; however, for all current CPU */ /* versions, "syncht" should suffice. Likewise, it seems that the */ /* auto-defined versions of *_acquire, *_release or *_full suffice for */ /* all current ISA implementations. */ AO_INLINE void AO_nop_full(void) { __asm__ __volatile__("syncht" : : : "memory"); } #define AO_HAVE_nop_full /* The Hexagon has load-locked, store-conditional primitives, and so */ /* resulting code is very nearly identical to that of PowerPC. */ #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *addr, AO_t incr) { AO_t oldval; AO_t newval; __asm__ __volatile__( "1:\n" " %0 = memw_locked(%3);\n" /* load and reserve */ " %1 = add (%0,%4);\n" /* increment */ " memw_locked(%3,p1) = %1;\n" /* store conditional */ " if (!p1) jump 1b;\n" /* retry if lost reservation */ : "=&r"(oldval), "=&r"(newval), "+m"(*addr) : "r"(addr), "r"(incr) : "memory", "p1"); return oldval; } #define AO_HAVE_fetch_and_add AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { int oldval; int locked_value = 1; __asm__ __volatile__( "1:\n" " %0 = memw_locked(%2);\n" /* load and reserve */ " {\n" " p2 = cmp.eq(%0,#0);\n" /* if load is not zero, */ " if (!p2.new) jump:nt 2f;\n" /* we are done */ " }\n" " memw_locked(%2,p1) = %3;\n" /* else store conditional */ " if (!p1) jump 1b;\n" /* retry if lost reservation */ "2:\n" /* oldval is zero if we set */ : "=&r"(oldval), "+m"(*addr) : "r"(addr), "r"(locked_value) : "memory", "p1", "p2"); return (AO_TS_VAL_t)oldval; } #define AO_HAVE_test_and_set #endif /* !AO_PREFER_GENERALIZED */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val) { AO_t __oldval; int result = 0; __asm__ __volatile__( "1:\n" " %0 = memw_locked(%3);\n" /* load and reserve */ " {\n" " p2 = cmp.eq(%0,%4);\n" /* if load is not equal to */ " if (!p2.new) jump:nt 2f;\n" /* old, fail */ " }\n" " memw_locked(%3,p1) = %5;\n" /* else store conditional */ " if (!p1) jump 1b;\n" /* retry if lost reservation */ " %1 = #1\n" /* success, result = 1 */ "2:\n" : "=&r" (__oldval), "+r" (result), "+m"(*addr) : "r" (addr), "r" (old), "r" (new_val) : "p1", "p2", "memory" ); return result; } # define AO_HAVE_compare_and_swap #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t __oldval; __asm__ __volatile__( "1:\n" " %0 = memw_locked(%2);\n" /* load and reserve */ " {\n" " p2 = cmp.eq(%0,%3);\n" /* if load is not equal to */ " if (!p2.new) jump:nt 2f;\n" /* old_val, fail */ " }\n" " memw_locked(%2,p1) = %4;\n" /* else store conditional */ " if (!p1) jump 1b;\n" /* retry if lost reservation */ "2:\n" : "=&r" (__oldval), "+m"(*addr) : "r" (addr), "r" (old_val), "r" (new_val) : "p1", "p2", "memory" ); return __oldval; } #define AO_HAVE_fetch_compare_and_swap #define AO_T_IS_INT #endif /* AO_DISABLE_GCC_ATOMICS */ #undef AO_GCC_FORCE_HAVE_CAS #undef AO_GCC_HAVE_double_SYNC_CAS asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/sunc/0000755000000000000000000000000015031566105022400 5ustar rootrootasymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/sunc/x86.h0000644000000000000000000001750215031566105023203 0ustar rootroot/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * Copyright (c) 2009-2016 Ivan Maidanski * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * * Some of the machine specific code was borrowed from our GC distribution. */ /* The following really assume we have a 486 or better. */ #include "../all_aligned_atomic_load_store.h" #include "../test_and_set_t_is_char.h" #if !defined(AO_USE_PENTIUM4_INSTRS) && !defined(__i386) /* "mfence" (SSE2) is supported on all x86_64/amd64 chips. */ # define AO_USE_PENTIUM4_INSTRS #endif #if defined(AO_USE_PENTIUM4_INSTRS) AO_INLINE void AO_nop_full(void) { __asm__ __volatile__ ("mfence" : : : "memory"); } # define AO_HAVE_nop_full #else /* We could use the cpuid instruction. But that seems to be slower */ /* than the default implementation based on test_and_set_full. Thus */ /* we omit that bit of misinformation here. */ #endif /* !AO_USE_PENTIUM4_INSTRS */ /* As far as we can tell, the lfence and sfence instructions are not */ /* currently needed or useful for cached memory accesses. */ /* Really only works for 486 and later */ #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add_full (volatile AO_t *p, AO_t incr) { AO_t result; __asm__ __volatile__ ("lock; xadd %0, %1" : "=r" (result), "+m" (*p) : "0" (incr) : "memory"); return result; } # define AO_HAVE_fetch_and_add_full #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE unsigned char AO_char_fetch_and_add_full (volatile unsigned char *p, unsigned char incr) { unsigned char result; __asm__ __volatile__ ("lock; xaddb %0, %1" : "=q" (result), "+m" (*p) : "0" (incr) : "memory"); return result; } #define AO_HAVE_char_fetch_and_add_full AO_INLINE unsigned short AO_short_fetch_and_add_full (volatile unsigned short *p, unsigned short incr) { unsigned short result; __asm__ __volatile__ ("lock; xaddw %0, %1" : "=r" (result), "+m" (*p) : "0" (incr) : "memory"); return result; } #define AO_HAVE_short_fetch_and_add_full #ifndef AO_PREFER_GENERALIZED AO_INLINE void AO_and_full (volatile AO_t *p, AO_t value) { __asm__ __volatile__ ("lock; and %1, %0" : "+m" (*p) : "r" (value) : "memory"); } # define AO_HAVE_and_full AO_INLINE void AO_or_full (volatile AO_t *p, AO_t value) { __asm__ __volatile__ ("lock; or %1, %0" : "+m" (*p) : "r" (value) : "memory"); } # define AO_HAVE_or_full AO_INLINE void AO_xor_full (volatile AO_t *p, AO_t value) { __asm__ __volatile__ ("lock; xor %1, %0" : "+m" (*p) : "r" (value) : "memory"); } # define AO_HAVE_xor_full #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE AO_TS_VAL_t AO_test_and_set_full (volatile AO_TS_t *addr) { AO_TS_t oldval; /* Note: the "xchg" instruction does not need a "lock" prefix */ __asm__ __volatile__ ("xchg %b0, %1" : "=q" (oldval), "+m" (*addr) : "0" (0xff) : "memory"); return (AO_TS_VAL_t)oldval; } #define AO_HAVE_test_and_set_full #ifndef AO_GENERALIZE_ASM_BOOL_CAS /* Returns nonzero if the comparison succeeded. */ AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { char result; __asm__ __volatile__ ("lock; cmpxchg %2, %0; setz %1" : "+m" (*addr), "=a" (result) : "r" (new_val), "a" (old) : "memory"); return (int) result; } # define AO_HAVE_compare_and_swap_full #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t fetched_val; __asm__ __volatile__ ("lock; cmpxchg %2, %0" : "+m" (*addr), "=a" (fetched_val) : "r" (new_val), "a" (old_val) : "memory"); return fetched_val; } #define AO_HAVE_fetch_compare_and_swap_full #if defined(__i386) # ifndef AO_NO_CMPXCHG8B # include "../standard_ao_double_t.h" /* Reading or writing a quadword aligned on a 64-bit boundary is */ /* always carried out atomically (requires at least a Pentium). */ # define AO_ACCESS_double_CHECK_ALIGNED # include "../loadstore/double_atomic_load_store.h" /* Returns nonzero if the comparison succeeded. */ /* Really requires at least a Pentium. */ AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { AO_t dummy; /* an output for clobbered edx */ char result; __asm__ __volatile__ ("lock; cmpxchg8b %0; setz %1" : "+m" (*addr), "=a" (result), "=d" (dummy) : "d" (old_val2), "a" (old_val1), "c" (new_val2), "b" (new_val1) : "memory"); return (int) result; } # define AO_HAVE_compare_double_and_swap_double_full # endif /* !AO_NO_CMPXCHG8B */ # define AO_T_IS_INT #else /* x64 */ AO_INLINE unsigned int AO_int_fetch_and_add_full (volatile unsigned int *p, unsigned int incr) { unsigned int result; __asm__ __volatile__ ("lock; xaddl %0, %1" : "=r" (result), "+m" (*p) : "0" (incr) : "memory"); return result; } # define AO_HAVE_int_fetch_and_add_full # ifdef AO_CMPXCHG16B_AVAILABLE # include "../standard_ao_double_t.h" /* Older AMD Opterons are missing this instruction (SIGILL should */ /* be thrown in this case). */ AO_INLINE int AO_compare_double_and_swap_double_full (volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { AO_t dummy; char result; __asm__ __volatile__ ("lock; cmpxchg16b %0; setz %1" : "+m" (*addr), "=a" (result), "=d" (dummy) : "d" (old_val2), "a" (old_val1), "c" (new_val2), "b" (new_val1) : "memory"); return (int) result; } # define AO_HAVE_compare_double_and_swap_double_full # endif /* !AO_CMPXCHG16B_AVAILABLE */ #endif /* x64 */ /* Real X86 implementations, except for some old 32-bit WinChips, */ /* appear to enforce ordering between memory operations, EXCEPT that */ /* a later read can pass earlier writes, presumably due to the visible */ /* presence of store buffers. */ /* We ignore both the WinChips and the fact that the official specs */ /* seem to be much weaker (and arguably too weak to be usable). */ #include "../ordered_except_wr.h" asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.h0000644000000000000000000000322315031566105023661 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include "../all_atomic_load_store.h" /* Real SPARC code uses TSO: */ #include "../ordered_except_wr.h" /* Test_and_set location is just a byte. */ #include "../test_and_set_t_is_char.h" #ifdef __cplusplus extern "C" { #endif extern AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr); /* Implemented in separate .S file, for now. */ #define AO_HAVE_test_and_set_full /* TODO: Like the gcc version, extend this for V8 and V9. */ #ifdef __cplusplus } /* extern "C" */ #endif asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.S0000644000000000000000000000020115031566105023625 0ustar rootroot .seg "text" .globl AO_test_and_set_full AO_test_and_set_full: retl ldstub [%o0],%o0 asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_char.h0000644000000000000000000000356715031566105026303 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * These are common definitions for architectures on which test_and_set * operates on byte sized quantities, the "clear" value contains * all zeroes, and the "set" value contains all ones typically. */ #ifndef AO_GCC_ATOMIC_TEST_AND_SET # define AO_TS_SET_TRUEVAL 0xff #elif defined(__GCC_ATOMIC_TEST_AND_SET_TRUEVAL) \ && !defined(AO_PREFER_GENERALIZED) # define AO_TS_SET_TRUEVAL __GCC_ATOMIC_TEST_AND_SET_TRUEVAL #else # define AO_TS_SET_TRUEVAL 1 /* true */ #endif typedef enum { AO_BYTE_TS_clear = 0, AO_BYTE_TS_set = AO_TS_SET_TRUEVAL } AO_BYTE_TS_val; #define AO_TS_VAL_t AO_BYTE_TS_val #define AO_TS_CLEAR AO_BYTE_TS_clear #define AO_TS_SET AO_BYTE_TS_set #define AO_TS_t unsigned char #define AO_CHAR_TS_T 1 #undef AO_TS_SET_TRUEVAL asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/generic_pthread.h0000644000000000000000000002611515031566105024731 0ustar rootroot/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* The following is useful primarily for debugging and documentation. */ /* We define various atomic operations by acquiring a global pthread */ /* lock. The resulting implementation will perform poorly, but should */ /* be correct unless it is used from signal handlers. */ /* We assume that all pthread operations act like full memory barriers. */ /* (We believe that is the intent of the specification.) */ #include #include "test_and_set_t_is_ao_t.h" /* This is not necessarily compatible with the native */ /* implementation. But those can't be safely mixed anyway. */ #ifdef __cplusplus extern "C" { #endif /* We define only the full barrier variants, and count on the */ /* generalization section below to fill in the rest. */ AO_API pthread_mutex_t AO_pt_lock; #ifdef __cplusplus } /* extern "C" */ #endif AO_INLINE void AO_nop_full(void) { pthread_mutex_lock(&AO_pt_lock); pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_nop_full AO_INLINE AO_t AO_load_full(const volatile AO_t *addr) { AO_t result; pthread_mutex_lock(&AO_pt_lock); result = *addr; pthread_mutex_unlock(&AO_pt_lock); return result; } #define AO_HAVE_load_full AO_INLINE void AO_store_full(volatile AO_t *addr, AO_t val) { pthread_mutex_lock(&AO_pt_lock); *addr = val; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_store_full AO_INLINE unsigned char AO_char_load_full(const volatile unsigned char *addr) { unsigned char result; pthread_mutex_lock(&AO_pt_lock); result = *addr; pthread_mutex_unlock(&AO_pt_lock); return result; } #define AO_HAVE_char_load_full AO_INLINE void AO_char_store_full(volatile unsigned char *addr, unsigned char val) { pthread_mutex_lock(&AO_pt_lock); *addr = val; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_char_store_full AO_INLINE unsigned short AO_short_load_full(const volatile unsigned short *addr) { unsigned short result; pthread_mutex_lock(&AO_pt_lock); result = *addr; pthread_mutex_unlock(&AO_pt_lock); return result; } #define AO_HAVE_short_load_full AO_INLINE void AO_short_store_full(volatile unsigned short *addr, unsigned short val) { pthread_mutex_lock(&AO_pt_lock); *addr = val; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_short_store_full AO_INLINE unsigned int AO_int_load_full(const volatile unsigned int *addr) { unsigned int result; pthread_mutex_lock(&AO_pt_lock); result = *addr; pthread_mutex_unlock(&AO_pt_lock); return result; } #define AO_HAVE_int_load_full AO_INLINE void AO_int_store_full(volatile unsigned int *addr, unsigned int val) { pthread_mutex_lock(&AO_pt_lock); *addr = val; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_int_store_full AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { AO_TS_VAL_t result; pthread_mutex_lock(&AO_pt_lock); result = (AO_TS_VAL_t)(*addr); *addr = AO_TS_SET; pthread_mutex_unlock(&AO_pt_lock); assert(result == AO_TS_SET || result == AO_TS_CLEAR); return result; } #define AO_HAVE_test_and_set_full AO_INLINE AO_t AO_fetch_and_add_full(volatile AO_t *p, AO_t incr) { AO_t old_val; pthread_mutex_lock(&AO_pt_lock); old_val = *p; *p = old_val + incr; pthread_mutex_unlock(&AO_pt_lock); return old_val; } #define AO_HAVE_fetch_and_add_full AO_INLINE unsigned char AO_char_fetch_and_add_full(volatile unsigned char *p, unsigned char incr) { unsigned char old_val; pthread_mutex_lock(&AO_pt_lock); old_val = *p; *p = old_val + incr; pthread_mutex_unlock(&AO_pt_lock); return old_val; } #define AO_HAVE_char_fetch_and_add_full AO_INLINE unsigned short AO_short_fetch_and_add_full(volatile unsigned short *p, unsigned short incr) { unsigned short old_val; pthread_mutex_lock(&AO_pt_lock); old_val = *p; *p = old_val + incr; pthread_mutex_unlock(&AO_pt_lock); return old_val; } #define AO_HAVE_short_fetch_and_add_full AO_INLINE unsigned int AO_int_fetch_and_add_full(volatile unsigned int *p, unsigned int incr) { unsigned int old_val; pthread_mutex_lock(&AO_pt_lock); old_val = *p; *p = old_val + incr; pthread_mutex_unlock(&AO_pt_lock); return old_val; } #define AO_HAVE_int_fetch_and_add_full AO_INLINE void AO_and_full(volatile AO_t *p, AO_t value) { pthread_mutex_lock(&AO_pt_lock); *p &= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_and_full AO_INLINE void AO_or_full(volatile AO_t *p, AO_t value) { pthread_mutex_lock(&AO_pt_lock); *p |= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_or_full AO_INLINE void AO_xor_full(volatile AO_t *p, AO_t value) { pthread_mutex_lock(&AO_pt_lock); *p ^= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_xor_full AO_INLINE void AO_char_and_full(volatile unsigned char *p, unsigned char value) { pthread_mutex_lock(&AO_pt_lock); *p &= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_char_and_full AO_INLINE void AO_char_or_full(volatile unsigned char *p, unsigned char value) { pthread_mutex_lock(&AO_pt_lock); *p |= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_char_or_full AO_INLINE void AO_char_xor_full(volatile unsigned char *p, unsigned char value) { pthread_mutex_lock(&AO_pt_lock); *p ^= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_char_xor_full AO_INLINE void AO_short_and_full(volatile unsigned short *p, unsigned short value) { pthread_mutex_lock(&AO_pt_lock); *p &= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_short_and_full AO_INLINE void AO_short_or_full(volatile unsigned short *p, unsigned short value) { pthread_mutex_lock(&AO_pt_lock); *p |= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_short_or_full AO_INLINE void AO_short_xor_full(volatile unsigned short *p, unsigned short value) { pthread_mutex_lock(&AO_pt_lock); *p ^= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_short_xor_full AO_INLINE void AO_int_and_full(volatile unsigned *p, unsigned value) { pthread_mutex_lock(&AO_pt_lock); *p &= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_int_and_full AO_INLINE void AO_int_or_full(volatile unsigned *p, unsigned value) { pthread_mutex_lock(&AO_pt_lock); *p |= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_int_or_full AO_INLINE void AO_int_xor_full(volatile unsigned *p, unsigned value) { pthread_mutex_lock(&AO_pt_lock); *p ^= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_int_xor_full AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t fetched_val; pthread_mutex_lock(&AO_pt_lock); fetched_val = *addr; if (fetched_val == old_val) *addr = new_val; pthread_mutex_unlock(&AO_pt_lock); return fetched_val; } #define AO_HAVE_fetch_compare_and_swap_full AO_INLINE unsigned char AO_char_fetch_compare_and_swap_full(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { unsigned char fetched_val; pthread_mutex_lock(&AO_pt_lock); fetched_val = *addr; if (fetched_val == old_val) *addr = new_val; pthread_mutex_unlock(&AO_pt_lock); return fetched_val; } #define AO_HAVE_char_fetch_compare_and_swap_full AO_INLINE unsigned short AO_short_fetch_compare_and_swap_full(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { unsigned short fetched_val; pthread_mutex_lock(&AO_pt_lock); fetched_val = *addr; if (fetched_val == old_val) *addr = new_val; pthread_mutex_unlock(&AO_pt_lock); return fetched_val; } #define AO_HAVE_short_fetch_compare_and_swap_full AO_INLINE unsigned AO_int_fetch_compare_and_swap_full(volatile unsigned *addr, unsigned old_val, unsigned new_val) { unsigned fetched_val; pthread_mutex_lock(&AO_pt_lock); fetched_val = *addr; if (fetched_val == old_val) *addr = new_val; pthread_mutex_unlock(&AO_pt_lock); return fetched_val; } #define AO_HAVE_int_fetch_compare_and_swap_full /* Unlike real architectures, we define both double-width CAS variants. */ typedef struct { AO_t AO_val1; AO_t AO_val2; } AO_double_t; #define AO_HAVE_double_t #define AO_DOUBLE_T_INITIALIZER { (AO_t)0, (AO_t)0 } AO_INLINE AO_double_t AO_double_load_full(const volatile AO_double_t *addr) { AO_double_t result; pthread_mutex_lock(&AO_pt_lock); result.AO_val1 = addr->AO_val1; result.AO_val2 = addr->AO_val2; pthread_mutex_unlock(&AO_pt_lock); return result; } #define AO_HAVE_double_load_full AO_INLINE void AO_double_store_full(volatile AO_double_t *addr, AO_double_t value) { pthread_mutex_lock(&AO_pt_lock); addr->AO_val1 = value.AO_val1; addr->AO_val2 = value.AO_val2; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_double_store_full AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old1, AO_t old2, AO_t new1, AO_t new2) { pthread_mutex_lock(&AO_pt_lock); if (addr -> AO_val1 == old1 && addr -> AO_val2 == old2) { addr -> AO_val1 = new1; addr -> AO_val2 = new2; pthread_mutex_unlock(&AO_pt_lock); return 1; } else pthread_mutex_unlock(&AO_pt_lock); return 0; } #define AO_HAVE_compare_double_and_swap_double_full AO_INLINE int AO_compare_and_swap_double_full(volatile AO_double_t *addr, AO_t old1, AO_t new1, AO_t new2) { pthread_mutex_lock(&AO_pt_lock); if (addr -> AO_val1 == old1) { addr -> AO_val1 = new1; addr -> AO_val2 = new2; pthread_mutex_unlock(&AO_pt_lock); return 1; } else pthread_mutex_unlock(&AO_pt_lock); return 0; } #define AO_HAVE_compare_and_swap_double_full /* We can't use hardware loads and stores, since they don't */ /* interact correctly with atomic updates. */ asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_only_load.h0000644000000000000000000000277015031566105025753 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Describes architectures on which AO_t, unsigned char, unsigned */ /* short, and unsigned int loads are atomic for all normally legal */ /* alignments. */ #include "loadstore/atomic_load.h" #include "loadstore/char_atomic_load.h" #include "loadstore/short_atomic_load.h" #include "loadstore/int_atomic_load.h" asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.template0000644000000000000000000000751215031566105025461 0ustar rootroot/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Inclusion of this file signifies that AO_t is in fact int. */ /* Hence any AO_... operation can also serve as AO_int_... operation. */ #if defined(AO_HAVE_load_XBAR) && !defined(AO_HAVE_int_load_XBAR) # define AO_int_load_XBAR(addr) \ (unsigned)AO_load_XBAR((const volatile AO_t *)(addr)) # define AO_HAVE_int_load_XBAR #endif #if defined(AO_HAVE_store_XBAR) && !defined(AO_HAVE_int_store_XBAR) # define AO_int_store_XBAR(addr, val) \ AO_store_XBAR((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_store_XBAR #endif #if defined(AO_HAVE_fetch_and_add_XBAR) \ && !defined(AO_HAVE_int_fetch_and_add_XBAR) # define AO_int_fetch_and_add_XBAR(addr, incr) \ (unsigned)AO_fetch_and_add_XBAR((volatile AO_t *)(addr), \ (AO_t)(incr)) # define AO_HAVE_int_fetch_and_add_XBAR #endif #if defined(AO_HAVE_fetch_and_add1_XBAR) \ && !defined(AO_HAVE_int_fetch_and_add1_XBAR) # define AO_int_fetch_and_add1_XBAR(addr) \ (unsigned)AO_fetch_and_add1_XBAR((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_add1_XBAR #endif #if defined(AO_HAVE_fetch_and_sub1_XBAR) \ && !defined(AO_HAVE_int_fetch_and_sub1_XBAR) # define AO_int_fetch_and_sub1_XBAR(addr) \ (unsigned)AO_fetch_and_sub1_XBAR((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_sub1_XBAR #endif #if defined(AO_HAVE_and_XBAR) && !defined(AO_HAVE_int_and_XBAR) # define AO_int_and_XBAR(addr, val) \ AO_and_XBAR((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_and_XBAR #endif #if defined(AO_HAVE_or_XBAR) && !defined(AO_HAVE_int_or_XBAR) # define AO_int_or_XBAR(addr, val) \ AO_or_XBAR((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_or_XBAR #endif #if defined(AO_HAVE_xor_XBAR) && !defined(AO_HAVE_int_xor_XBAR) # define AO_int_xor_XBAR(addr, val) \ AO_xor_XBAR((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_xor_XBAR #endif #if defined(AO_HAVE_fetch_compare_and_swap_XBAR) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_XBAR) # define AO_int_fetch_compare_and_swap_XBAR(addr, old, new_val) \ (unsigned)AO_fetch_compare_and_swap_XBAR((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_fetch_compare_and_swap_XBAR #endif #if defined(AO_HAVE_compare_and_swap_XBAR) \ && !defined(AO_HAVE_int_compare_and_swap_XBAR) # define AO_int_compare_and_swap_XBAR(addr, old, new_val) \ AO_compare_and_swap_XBAR((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_compare_and_swap_XBAR #endif asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_ao_t.h0000644000000000000000000000313415031566105026276 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * These are common definitions for architectures on which test_and_set * operates on pointer-sized quantities, the "clear" value contains * all zeroes, and the "set" value contains only one lowest bit set. * This can be used if test_and_set is synthesized from compare_and_swap. */ typedef enum {AO_TS_clear = 0, AO_TS_set = 1} AO_TS_val; #define AO_TS_VAL_t AO_TS_val #define AO_TS_CLEAR AO_TS_clear #define AO_TS_SET AO_TS_set #define AO_TS_t AO_t #define AO_AO_TS_T 1 asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/all_acquire_release_volatile.h0000644000000000000000000000305415031566105027463 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Describes architectures on which volatile AO_t, unsigned char, */ /* unsigned short, and unsigned int loads and stores have */ /* acquire/release semantics for all normally legal alignments. */ #include "loadstore/acquire_release_volatile.h" #include "loadstore/char_acquire_release_volatile.h" #include "loadstore/short_acquire_release_volatile.h" #include "loadstore/int_acquire_release_volatile.h" asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/README0000644000000000000000000000054115031566105022310 0ustar rootrootThere are two kinds of entities in this directory: - Subdirectories corresponding to specific compilers (or compiler/OS combinations). Each of these includes one or more architecture-specific headers. - More generic header files corresponding to a particular ordering and/or atomicity property that might be shared by multiple hardware platforms. asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/hpc/0000755000000000000000000000000015031566105022202 5ustar rootrootasymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/hpc/ia64.h0000644000000000000000000001166715031566105023131 0ustar rootroot/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * This file specifies Itanimum primitives for use with the HP compiler * under HP/UX. We use intrinsics instead of the inline assembly code in the * gcc file. */ #include "../all_atomic_load_store.h" #include "../all_acquire_release_volatile.h" #include "../test_and_set_t_is_char.h" #include #ifdef __LP64__ # define AO_T_FASIZE _FASZ_D # define AO_T_SIZE _SZ_D #else # define AO_T_FASIZE _FASZ_W # define AO_T_SIZE _SZ_W #endif AO_INLINE void AO_nop_full(void) { _Asm_mf(); } #define AO_HAVE_nop_full #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add1_acquire (volatile AO_t *p) { return _Asm_fetchadd(AO_T_FASIZE, _SEM_ACQ, p, 1, _LDHINT_NONE, _DOWN_MEM_FENCE); } #define AO_HAVE_fetch_and_add1_acquire AO_INLINE AO_t AO_fetch_and_add1_release (volatile AO_t *p) { return _Asm_fetchadd(AO_T_FASIZE, _SEM_REL, p, 1, _LDHINT_NONE, _UP_MEM_FENCE); } #define AO_HAVE_fetch_and_add1_release AO_INLINE AO_t AO_fetch_and_sub1_acquire (volatile AO_t *p) { return _Asm_fetchadd(AO_T_FASIZE, _SEM_ACQ, p, -1, _LDHINT_NONE, _DOWN_MEM_FENCE); } #define AO_HAVE_fetch_and_sub1_acquire AO_INLINE AO_t AO_fetch_and_sub1_release (volatile AO_t *p) { return _Asm_fetchadd(AO_T_FASIZE, _SEM_REL, p, -1, _LDHINT_NONE, _UP_MEM_FENCE); } #define AO_HAVE_fetch_and_sub1_release #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE AO_t AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { _Asm_mov_to_ar(_AREG_CCV, old_val, _DOWN_MEM_FENCE); return _Asm_cmpxchg(AO_T_SIZE, _SEM_ACQ, addr, new_val, _LDHINT_NONE, _DOWN_MEM_FENCE); } #define AO_HAVE_fetch_compare_and_swap_acquire AO_INLINE AO_t AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { _Asm_mov_to_ar(_AREG_CCV, old_val, _UP_MEM_FENCE); return _Asm_cmpxchg(AO_T_SIZE, _SEM_REL, addr, new_val, _LDHINT_NONE, _UP_MEM_FENCE); } #define AO_HAVE_fetch_compare_and_swap_release AO_INLINE unsigned char AO_char_fetch_compare_and_swap_acquire(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { _Asm_mov_to_ar(_AREG_CCV, old_val, _DOWN_MEM_FENCE); return _Asm_cmpxchg(_SZ_B, _SEM_ACQ, addr, new_val, _LDHINT_NONE, _DOWN_MEM_FENCE); } #define AO_HAVE_char_fetch_compare_and_swap_acquire AO_INLINE unsigned char AO_char_fetch_compare_and_swap_release(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { _Asm_mov_to_ar(_AREG_CCV, old_val, _UP_MEM_FENCE); return _Asm_cmpxchg(_SZ_B, _SEM_REL, addr, new_val, _LDHINT_NONE, _UP_MEM_FENCE); } #define AO_HAVE_char_fetch_compare_and_swap_release AO_INLINE unsigned short AO_short_fetch_compare_and_swap_acquire(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { _Asm_mov_to_ar(_AREG_CCV, old_val, _DOWN_MEM_FENCE); return _Asm_cmpxchg(_SZ_B, _SEM_ACQ, addr, new_val, _LDHINT_NONE, _DOWN_MEM_FENCE); } #define AO_HAVE_short_fetch_compare_and_swap_acquire AO_INLINE unsigned short AO_short_fetch_compare_and_swap_release(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { _Asm_mov_to_ar(_AREG_CCV, old_val, _UP_MEM_FENCE); return _Asm_cmpxchg(_SZ_B, _SEM_REL, addr, new_val, _LDHINT_NONE, _UP_MEM_FENCE); } #define AO_HAVE_short_fetch_compare_and_swap_release #ifndef __LP64__ # define AO_T_IS_INT #endif #undef AO_T_FASIZE #undef AO_T_SIZE asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/hpc/hppa.h0000644000000000000000000001042115031566105023301 0ustar rootroot/* * Copyright (c) 2003 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * Derived from the corresponding header file for gcc. */ #include "../loadstore/atomic_load.h" #include "../loadstore/atomic_store.h" /* Some architecture set descriptions include special "ordered" memory */ /* operations. As far as we can tell, no existing processors actually */ /* require those. Nor does it appear likely that future processors */ /* will. */ /* FIXME: The PA emulator on Itanium may obey weaker restrictions. */ /* There should be a mode in which we don't assume sequential */ /* consistency here. */ #include "../ordered.h" #include /* GCC will not guarantee the alignment we need, use four lock words */ /* and select the correctly aligned datum. See the glibc 2.3.2 */ /* linuxthread port for the original implementation. */ struct AO_pa_clearable_loc { int data[4]; }; #undef AO_TS_INITIALIZER #define AO_TS_t struct AO_pa_clearable_loc #define AO_TS_INITIALIZER {1,1,1,1} /* Switch meaning of set and clear, since we only have an atomic clear */ /* instruction. */ typedef enum {AO_PA_TS_set = 0, AO_PA_TS_clear = 1} AO_PA_TS_val; #define AO_TS_VAL_t AO_PA_TS_val #define AO_TS_CLEAR AO_PA_TS_clear #define AO_TS_SET AO_PA_TS_set /* The hppa only has one atomic read and modify memory operation, */ /* load and clear, so hppa spinlocks must use zero to signify that */ /* someone is holding the lock. The address used for the ldcw */ /* semaphore must be 16-byte aligned. */ #define AO_ldcw(a, ret) \ _LDCWX(0 /* index */, 0 /* s */, a /* base */, ret) /* Because malloc only guarantees 8-byte alignment for malloc'd data, */ /* and GCC only guarantees 8-byte alignment for stack locals, we can't */ /* be assured of 16-byte alignment for atomic lock data even if we */ /* specify "__attribute ((aligned(16)))" in the type declaration. So, */ /* we use a struct containing an array of four ints for the atomic lock */ /* type and dynamically select the 16-byte aligned int from the array */ /* for the semaphore. */ #define AO_PA_LDCW_ALIGNMENT 16 #define AO_ldcw_align(addr) \ ((volatile unsigned *)(((unsigned long)(addr) \ + (AO_PA_LDCW_ALIGNMENT - 1)) \ & ~(AO_PA_LDCW_ALIGNMENT - 1))) /* Works on PA 1.1 and PA 2.0 systems */ AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t * addr) { register unsigned int ret; register unsigned long a = (unsigned long)AO_ldcw_align(addr); # if defined(CPPCHECK) ret = 0; /* to void 'uninitialized variable' warning */ # endif AO_ldcw(a, ret); return (AO_TS_VAL_t)ret; } #define AO_HAVE_test_and_set_full AO_INLINE void AO_pa_clear(volatile AO_TS_t * addr) { volatile unsigned *a = AO_ldcw_align(addr); AO_compiler_barrier(); *a = 1; } #define AO_CLEAR(addr) AO_pa_clear(addr) #define AO_HAVE_CLEAR #undef AO_PA_LDCW_ALIGNMENT #undef AO_ldcw #undef AO_ldcw_align asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/all_aligned_atomic_load_store.h0000644000000000000000000000347515031566105027614 0ustar rootroot/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Describes architectures on which AO_t, unsigned char, unsigned */ /* short, and unsigned int loads and stores are atomic but only if data */ /* is suitably aligned. */ #if defined(__m68k__) && !defined(AO_ALIGNOF_SUPPORTED) /* Even though AO_t is redefined in m68k.h, some clients use AO */ /* pointer size primitives to access variables not declared as AO_t. */ /* Such variables may have 2-byte alignment, while their sizeof is 4. */ #else # define AO_ACCESS_CHECK_ALIGNED #endif /* Check for char type is a misnomer. */ #define AO_ACCESS_short_CHECK_ALIGNED #define AO_ACCESS_int_CHECK_ALIGNED #include "all_atomic_load_store.h" asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/emul_cas.h0000644000000000000000000000657715031566105023410 0ustar rootroot/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * Ensure, if at all possible, that AO_compare_and_swap_full() is * available. The emulation should be brute-force signal-safe, even * though it actually blocks. * Including this file will generate an error if AO_compare_and_swap_full() * cannot be made available. * This will be included from platform-specific atomic_ops files * if appropriate, and if AO_REQUIRE_CAS is defined. It should not be * included directly, especially since it affects the implementation * of other atomic update primitives. * The implementation assumes that only AO_store_XXX and AO_test_and_set_XXX * variants are defined, and that AO_test_and_set_XXX is not used to * operate on compare_and_swap locations. */ #ifndef AO_ATOMIC_OPS_H # error This file should not be included directly. #endif #ifndef AO_HAVE_double_t # include "standard_ao_double_t.h" #endif #ifdef __cplusplus extern "C" { #endif AO_API AO_t AO_fetch_compare_and_swap_emulation(volatile AO_t *addr, AO_t old_val, AO_t new_val); AO_API int AO_compare_double_and_swap_double_emulation(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2); AO_API void AO_store_full_emulation(volatile AO_t *addr, AO_t val); #ifndef AO_HAVE_fetch_compare_and_swap_full # define AO_fetch_compare_and_swap_full(addr, old, newval) \ AO_fetch_compare_and_swap_emulation(addr, old, newval) # define AO_HAVE_fetch_compare_and_swap_full #endif #ifndef AO_HAVE_compare_double_and_swap_double_full # define AO_compare_double_and_swap_double_full(addr, old1, old2, \ newval1, newval2) \ AO_compare_double_and_swap_double_emulation(addr, old1, old2, \ newval1, newval2) # define AO_HAVE_compare_double_and_swap_double_full #endif #undef AO_store #undef AO_HAVE_store #undef AO_store_write #undef AO_HAVE_store_write #undef AO_store_release #undef AO_HAVE_store_release #undef AO_store_full #undef AO_HAVE_store_full #define AO_store_full(addr, val) AO_store_full_emulation(addr, val) #define AO_HAVE_store_full #ifdef __cplusplus } /* extern "C" */ #endif asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/icc/0000755000000000000000000000000015031566105022166 5ustar rootrootasymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/icc/ia64.h0000644000000000000000000001446115031566105023110 0ustar rootroot/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * This file specifies Itanimum primitives for use with the Intel (ecc) * compiler. We use intrinsics instead of the inline assembly code in the * gcc file. */ #include "../all_atomic_load_store.h" #include "../test_and_set_t_is_char.h" #include /* The acquire release semantics of volatile can be turned off. And volatile */ /* operations in icc9 don't imply ordering with respect to other nonvolatile */ /* operations. */ #define AO_INTEL_PTR_t void * AO_INLINE AO_t AO_load_acquire(const volatile AO_t *p) { return (AO_t)(__ld8_acq((AO_INTEL_PTR_t)p)); } #define AO_HAVE_load_acquire AO_INLINE void AO_store_release(volatile AO_t *p, AO_t val) { __st8_rel((AO_INTEL_PTR_t)p, (__int64)val); } #define AO_HAVE_store_release AO_INLINE unsigned char AO_char_load_acquire(const volatile unsigned char *p) { /* A normal volatile load generates an ld.acq */ return (__ld1_acq((AO_INTEL_PTR_t)p)); } #define AO_HAVE_char_load_acquire AO_INLINE void AO_char_store_release(volatile unsigned char *p, unsigned char val) { __st1_rel((AO_INTEL_PTR_t)p, val); } #define AO_HAVE_char_store_release AO_INLINE unsigned short AO_short_load_acquire(const volatile unsigned short *p) { /* A normal volatile load generates an ld.acq */ return (__ld2_acq((AO_INTEL_PTR_t)p)); } #define AO_HAVE_short_load_acquire AO_INLINE void AO_short_store_release(volatile unsigned short *p, unsigned short val) { __st2_rel((AO_INTEL_PTR_t)p, val); } #define AO_HAVE_short_store_release AO_INLINE unsigned int AO_int_load_acquire(const volatile unsigned int *p) { /* A normal volatile load generates an ld.acq */ return (__ld4_acq((AO_INTEL_PTR_t)p)); } #define AO_HAVE_int_load_acquire AO_INLINE void AO_int_store_release(volatile unsigned int *p, unsigned int val) { __st4_rel((AO_INTEL_PTR_t)p, val); } #define AO_HAVE_int_store_release AO_INLINE void AO_nop_full(void) { __mf(); } #define AO_HAVE_nop_full #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add1_acquire(volatile AO_t *p) { return __fetchadd8_acq((unsigned __int64 *)p, 1); } #define AO_HAVE_fetch_and_add1_acquire AO_INLINE AO_t AO_fetch_and_add1_release(volatile AO_t *p) { return __fetchadd8_rel((unsigned __int64 *)p, 1); } #define AO_HAVE_fetch_and_add1_release AO_INLINE AO_t AO_fetch_and_sub1_acquire(volatile AO_t *p) { return __fetchadd8_acq((unsigned __int64 *)p, -1); } #define AO_HAVE_fetch_and_sub1_acquire AO_INLINE AO_t AO_fetch_and_sub1_release(volatile AO_t *p) { return __fetchadd8_rel((unsigned __int64 *)p, -1); } #define AO_HAVE_fetch_and_sub1_release #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE AO_t AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return _InterlockedCompareExchange64_acq(addr, new_val, old_val); } #define AO_HAVE_fetch_compare_and_swap_acquire AO_INLINE AO_t AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return _InterlockedCompareExchange64_rel(addr, new_val, old_val); } #define AO_HAVE_fetch_compare_and_swap_release AO_INLINE unsigned char AO_char_fetch_compare_and_swap_acquire(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { return _InterlockedCompareExchange8_acq(addr, new_val, old_val); } #define AO_HAVE_char_fetch_compare_and_swap_acquire AO_INLINE unsigned char AO_char_fetch_compare_and_swap_release(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { return _InterlockedCompareExchange8_rel(addr, new_val, old_val); } #define AO_HAVE_char_fetch_compare_and_swap_release AO_INLINE unsigned short AO_short_fetch_compare_and_swap_acquire(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { return _InterlockedCompareExchange16_acq(addr, new_val, old_val); } #define AO_HAVE_short_fetch_compare_and_swap_acquire AO_INLINE unsigned short AO_short_fetch_compare_and_swap_release(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { return _InterlockedCompareExchange16_rel(addr, new_val, old_val); } #define AO_HAVE_short_fetch_compare_and_swap_release AO_INLINE unsigned int AO_int_fetch_compare_and_swap_acquire(volatile unsigned int *addr, unsigned int old_val, unsigned int new_val) { return _InterlockedCompareExchange_acq(addr, new_val, old_val); } #define AO_HAVE_int_fetch_compare_and_swap_acquire AO_INLINE unsigned int AO_int_fetch_compare_and_swap_release(volatile unsigned int *addr, unsigned int old_val, unsigned int new_val) { return _InterlockedCompareExchange_rel(addr, new_val, old_val); } #define AO_HAVE_int_fetch_compare_and_swap_release #undef AO_INTEL_PTR_t asymptote-3.05/libatomic_ops/src/atomic_ops/sysdeps/ordered.h0000644000000000000000000000257115031566105023232 0ustar rootroot/* * Copyright (c) 2003 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* These are common definitions for architectures that provide */ /* processor ordered memory operations. */ #include "ordered_except_wr.h" AO_INLINE void AO_nop_full(void) { AO_compiler_barrier(); } #define AO_HAVE_nop_full asymptote-3.05/libatomic_ops/src/atomic_ops/generalize-arithm.template0000644000000000000000000010051615031566105025105 0ustar rootroot/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* XSIZE_compare_and_swap (based on fetch_compare_and_swap) */ #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_full) AO_INLINE int AO_XSIZE_compare_and_swap_full(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_full #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_acquire) AO_INLINE int AO_XSIZE_compare_and_swap_acquire(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_acquire #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_release) AO_INLINE int AO_XSIZE_compare_and_swap_release(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_release #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_write) AO_INLINE int AO_XSIZE_compare_and_swap_write(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_write #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_read) AO_INLINE int AO_XSIZE_compare_and_swap_read(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_read #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ && !defined(AO_HAVE_XSIZE_compare_and_swap) AO_INLINE int AO_XSIZE_compare_and_swap(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release_write) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_release_write) AO_INLINE int AO_XSIZE_compare_and_swap_release_write(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_release_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_release_write #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read) AO_INLINE int AO_XSIZE_compare_and_swap_acquire_read(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_acquire_read #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_dd_acquire_read) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_dd_acquire_read) AO_INLINE int AO_XSIZE_compare_and_swap_dd_acquire_read(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_dd_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_dd_acquire_read #endif /* XSIZE_fetch_and_add */ /* We first try to implement fetch_and_add variants in terms of the */ /* corresponding compare_and_swap variants to minimize adding barriers. */ #if defined(AO_HAVE_XSIZE_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_fetch_and_add_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE XCTYPE AO_XSIZE_fetch_and_add_full(volatile XCTYPE *addr, XCTYPE incr) { XCTYPE old; do { old = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old, old + incr))); return old; } # define AO_HAVE_XSIZE_fetch_and_add_full #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_acquire) \ && !defined(AO_HAVE_XSIZE_fetch_and_add_acquire) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE XCTYPE AO_XSIZE_fetch_and_add_acquire(volatile XCTYPE *addr, XCTYPE incr) { XCTYPE old; do { old = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_acquire(addr, old, old + incr))); return old; } # define AO_HAVE_XSIZE_fetch_and_add_acquire #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_release) \ && !defined(AO_HAVE_XSIZE_fetch_and_add_release) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE XCTYPE AO_XSIZE_fetch_and_add_release(volatile XCTYPE *addr, XCTYPE incr) { XCTYPE old; do { old = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_release(addr, old, old + incr))); return old; } # define AO_HAVE_XSIZE_fetch_and_add_release #endif #if defined(AO_HAVE_XSIZE_compare_and_swap) \ && !defined(AO_HAVE_XSIZE_fetch_and_add) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE XCTYPE AO_XSIZE_fetch_and_add(volatile XCTYPE *addr, XCTYPE incr) { XCTYPE old; do { old = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap(addr, old, old + incr))); return old; } # define AO_HAVE_XSIZE_fetch_and_add #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_full) # if !defined(AO_HAVE_XSIZE_fetch_and_add_release) # define AO_XSIZE_fetch_and_add_release(addr, val) \ AO_XSIZE_fetch_and_add_full(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_release # endif # if !defined(AO_HAVE_XSIZE_fetch_and_add_acquire) # define AO_XSIZE_fetch_and_add_acquire(addr, val) \ AO_XSIZE_fetch_and_add_full(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_acquire # endif # if !defined(AO_HAVE_XSIZE_fetch_and_add_write) # define AO_XSIZE_fetch_and_add_write(addr, val) \ AO_XSIZE_fetch_and_add_full(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_write # endif # if !defined(AO_HAVE_XSIZE_fetch_and_add_read) # define AO_XSIZE_fetch_and_add_read(addr, val) \ AO_XSIZE_fetch_and_add_full(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_read # endif #endif /* AO_HAVE_XSIZE_fetch_and_add_full */ #if defined(AO_HAVE_XSIZE_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_fetch_and_add_acquire) AO_INLINE XCTYPE AO_XSIZE_fetch_and_add_acquire(volatile XCTYPE *addr, XCTYPE incr) { XCTYPE result = AO_XSIZE_fetch_and_add(addr, incr); AO_nop_full(); return result; } # define AO_HAVE_XSIZE_fetch_and_add_acquire #endif #if defined(AO_HAVE_XSIZE_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_fetch_and_add_release) # define AO_XSIZE_fetch_and_add_release(addr, incr) \ (AO_nop_full(), AO_XSIZE_fetch_and_add(addr, incr)) # define AO_HAVE_XSIZE_fetch_and_add_release #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add) \ && defined(AO_HAVE_XSIZE_fetch_and_add_release) # define AO_XSIZE_fetch_and_add(addr, val) \ AO_XSIZE_fetch_and_add_release(addr, val) # define AO_HAVE_XSIZE_fetch_and_add #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add) \ && defined(AO_HAVE_XSIZE_fetch_and_add_acquire) # define AO_XSIZE_fetch_and_add(addr, val) \ AO_XSIZE_fetch_and_add_acquire(addr, val) # define AO_HAVE_XSIZE_fetch_and_add #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add) \ && defined(AO_HAVE_XSIZE_fetch_and_add_write) # define AO_XSIZE_fetch_and_add(addr, val) \ AO_XSIZE_fetch_and_add_write(addr, val) # define AO_HAVE_XSIZE_fetch_and_add #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add) \ && defined(AO_HAVE_XSIZE_fetch_and_add_read) # define AO_XSIZE_fetch_and_add(addr, val) \ AO_XSIZE_fetch_and_add_read(addr, val) # define AO_HAVE_XSIZE_fetch_and_add #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire) \ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_XSIZE_fetch_and_add_full) # define AO_XSIZE_fetch_and_add_full(addr, val) \ (AO_nop_full(), AO_XSIZE_fetch_and_add_acquire(addr, val)) # define AO_HAVE_XSIZE_fetch_and_add_full #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \ && defined(AO_HAVE_XSIZE_fetch_and_add_write) # define AO_XSIZE_fetch_and_add_release_write(addr, val) \ AO_XSIZE_fetch_and_add_write(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \ && defined(AO_HAVE_XSIZE_fetch_and_add_release) # define AO_XSIZE_fetch_and_add_release_write(addr, val) \ AO_XSIZE_fetch_and_add_release(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_and_add_read) # define AO_XSIZE_fetch_and_add_acquire_read(addr, val) \ AO_XSIZE_fetch_and_add_read(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_acquire_read #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_and_add_acquire) # define AO_XSIZE_fetch_and_add_acquire_read(addr, val) \ AO_XSIZE_fetch_and_add_acquire(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) # define AO_XSIZE_fetch_and_add_dd_acquire_read(addr, val) \ AO_XSIZE_fetch_and_add_acquire_read(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_dd_acquire_read # endif #else # if defined(AO_HAVE_XSIZE_fetch_and_add) # define AO_XSIZE_fetch_and_add_dd_acquire_read(addr, val) \ AO_XSIZE_fetch_and_add(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* XSIZE_fetch_and_add1 */ #if defined(AO_HAVE_XSIZE_fetch_and_add_full) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_full) # define AO_XSIZE_fetch_and_add1_full(addr) \ AO_XSIZE_fetch_and_add_full(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1_full #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_release) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_release) # define AO_XSIZE_fetch_and_add1_release(addr) \ AO_XSIZE_fetch_and_add_release(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1_release #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire) # define AO_XSIZE_fetch_and_add1_acquire(addr) \ AO_XSIZE_fetch_and_add_acquire(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1_acquire #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_write) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_write) # define AO_XSIZE_fetch_and_add1_write(addr) \ AO_XSIZE_fetch_and_add_write(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1_write #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_read) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_read) # define AO_XSIZE_fetch_and_add1_read(addr) \ AO_XSIZE_fetch_and_add_read(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1_read #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_release_write) # define AO_XSIZE_fetch_and_add1_release_write(addr) \ AO_XSIZE_fetch_and_add_release_write(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1_release_write #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read) # define AO_XSIZE_fetch_and_add1_acquire_read(addr) \ AO_XSIZE_fetch_and_add_acquire_read(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1_acquire_read #endif #if defined(AO_HAVE_XSIZE_fetch_and_add) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1) # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1 #endif #if defined(AO_HAVE_XSIZE_fetch_and_add1_full) # if !defined(AO_HAVE_XSIZE_fetch_and_add1_release) # define AO_XSIZE_fetch_and_add1_release(addr) \ AO_XSIZE_fetch_and_add1_full(addr) # define AO_HAVE_XSIZE_fetch_and_add1_release # endif # if !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire) # define AO_XSIZE_fetch_and_add1_acquire(addr) \ AO_XSIZE_fetch_and_add1_full(addr) # define AO_HAVE_XSIZE_fetch_and_add1_acquire # endif # if !defined(AO_HAVE_XSIZE_fetch_and_add1_write) # define AO_XSIZE_fetch_and_add1_write(addr) \ AO_XSIZE_fetch_and_add1_full(addr) # define AO_HAVE_XSIZE_fetch_and_add1_write # endif # if !defined(AO_HAVE_XSIZE_fetch_and_add1_read) # define AO_XSIZE_fetch_and_add1_read(addr) \ AO_XSIZE_fetch_and_add1_full(addr) # define AO_HAVE_XSIZE_fetch_and_add1_read # endif #endif /* AO_HAVE_XSIZE_fetch_and_add1_full */ #if !defined(AO_HAVE_XSIZE_fetch_and_add1) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_release) # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_release(addr) # define AO_HAVE_XSIZE_fetch_and_add1 #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add1) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_acquire) # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_acquire(addr) # define AO_HAVE_XSIZE_fetch_and_add1 #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add1) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_write) # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_write(addr) # define AO_HAVE_XSIZE_fetch_and_add1 #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add1) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_read) # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_read(addr) # define AO_HAVE_XSIZE_fetch_and_add1 #endif #if defined(AO_HAVE_XSIZE_fetch_and_add1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_full) # define AO_XSIZE_fetch_and_add1_full(addr) \ (AO_nop_full(), AO_XSIZE_fetch_and_add1_acquire(addr)) # define AO_HAVE_XSIZE_fetch_and_add1_full #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add1_release_write) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_write) # define AO_XSIZE_fetch_and_add1_release_write(addr) \ AO_XSIZE_fetch_and_add1_write(addr) # define AO_HAVE_XSIZE_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add1_release_write) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_release) # define AO_XSIZE_fetch_and_add1_release_write(addr) \ AO_XSIZE_fetch_and_add1_release(addr) # define AO_HAVE_XSIZE_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_read) # define AO_XSIZE_fetch_and_add1_acquire_read(addr) \ AO_XSIZE_fetch_and_add1_read(addr) # define AO_HAVE_XSIZE_fetch_and_add1_acquire_read #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_acquire) # define AO_XSIZE_fetch_and_add1_acquire_read(addr) \ AO_XSIZE_fetch_and_add1_acquire(addr) # define AO_HAVE_XSIZE_fetch_and_add1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read) # define AO_XSIZE_fetch_and_add1_dd_acquire_read(addr) \ AO_XSIZE_fetch_and_add1_acquire_read(addr) # define AO_HAVE_XSIZE_fetch_and_add1_dd_acquire_read # endif #else # if defined(AO_HAVE_XSIZE_fetch_and_add1) # define AO_XSIZE_fetch_and_add1_dd_acquire_read(addr) \ AO_XSIZE_fetch_and_add1(addr) # define AO_HAVE_XSIZE_fetch_and_add1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* XSIZE_fetch_and_sub1 */ #if defined(AO_HAVE_XSIZE_fetch_and_add_full) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_full) # define AO_XSIZE_fetch_and_sub1_full(addr) \ AO_XSIZE_fetch_and_add_full(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1_full #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_release) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_release) # define AO_XSIZE_fetch_and_sub1_release(addr) \ AO_XSIZE_fetch_and_add_release(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1_release #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire) # define AO_XSIZE_fetch_and_sub1_acquire(addr) \ AO_XSIZE_fetch_and_add_acquire(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1_acquire #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_write) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_write) # define AO_XSIZE_fetch_and_sub1_write(addr) \ AO_XSIZE_fetch_and_add_write(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1_write #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_read) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_read) # define AO_XSIZE_fetch_and_sub1_read(addr) \ AO_XSIZE_fetch_and_add_read(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1_read #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_release_write) # define AO_XSIZE_fetch_and_sub1_release_write(addr) \ AO_XSIZE_fetch_and_add_release_write(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1_release_write #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read) # define AO_XSIZE_fetch_and_sub1_acquire_read(addr) \ AO_XSIZE_fetch_and_add_acquire_read(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1_acquire_read #endif #if defined(AO_HAVE_XSIZE_fetch_and_add) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1) # define AO_XSIZE_fetch_and_sub1(addr) \ AO_XSIZE_fetch_and_add(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1 #endif #if defined(AO_HAVE_XSIZE_fetch_and_sub1_full) # if !defined(AO_HAVE_XSIZE_fetch_and_sub1_release) # define AO_XSIZE_fetch_and_sub1_release(addr) \ AO_XSIZE_fetch_and_sub1_full(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_release # endif # if !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire) # define AO_XSIZE_fetch_and_sub1_acquire(addr) \ AO_XSIZE_fetch_and_sub1_full(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_acquire # endif # if !defined(AO_HAVE_XSIZE_fetch_and_sub1_write) # define AO_XSIZE_fetch_and_sub1_write(addr) \ AO_XSIZE_fetch_and_sub1_full(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_write # endif # if !defined(AO_HAVE_XSIZE_fetch_and_sub1_read) # define AO_XSIZE_fetch_and_sub1_read(addr) \ AO_XSIZE_fetch_and_sub1_full(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_read # endif #endif /* AO_HAVE_XSIZE_fetch_and_sub1_full */ #if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_release) # define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_release(addr) # define AO_HAVE_XSIZE_fetch_and_sub1 #endif #if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire) # define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_acquire(addr) # define AO_HAVE_XSIZE_fetch_and_sub1 #endif #if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_write) # define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_write(addr) # define AO_HAVE_XSIZE_fetch_and_sub1 #endif #if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_read) # define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_read(addr) # define AO_HAVE_XSIZE_fetch_and_sub1 #endif #if defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_full) # define AO_XSIZE_fetch_and_sub1_full(addr) \ (AO_nop_full(), AO_XSIZE_fetch_and_sub1_acquire(addr)) # define AO_HAVE_XSIZE_fetch_and_sub1_full #endif #if !defined(AO_HAVE_XSIZE_fetch_and_sub1_release_write) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_write) # define AO_XSIZE_fetch_and_sub1_release_write(addr) \ AO_XSIZE_fetch_and_sub1_write(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_and_sub1_release_write) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_release) # define AO_XSIZE_fetch_and_sub1_release_write(addr) \ AO_XSIZE_fetch_and_sub1_release(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_read) # define AO_XSIZE_fetch_and_sub1_acquire_read(addr) \ AO_XSIZE_fetch_and_sub1_read(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_acquire_read #endif #if !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire) # define AO_XSIZE_fetch_and_sub1_acquire_read(addr) \ AO_XSIZE_fetch_and_sub1_acquire(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read) # define AO_XSIZE_fetch_and_sub1_dd_acquire_read(addr) \ AO_XSIZE_fetch_and_sub1_acquire_read(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_dd_acquire_read # endif #else # if defined(AO_HAVE_XSIZE_fetch_and_sub1) # define AO_XSIZE_fetch_and_sub1_dd_acquire_read(addr) \ AO_XSIZE_fetch_and_sub1(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* XSIZE_and */ #if defined(AO_HAVE_XSIZE_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_and_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_XSIZE_and_full(volatile XCTYPE *addr, XCTYPE value) { XCTYPE old; do { old = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old, old & value))); } # define AO_HAVE_XSIZE_and_full #endif #if defined(AO_HAVE_XSIZE_and_full) # if !defined(AO_HAVE_XSIZE_and_release) # define AO_XSIZE_and_release(addr, val) AO_XSIZE_and_full(addr, val) # define AO_HAVE_XSIZE_and_release # endif # if !defined(AO_HAVE_XSIZE_and_acquire) # define AO_XSIZE_and_acquire(addr, val) AO_XSIZE_and_full(addr, val) # define AO_HAVE_XSIZE_and_acquire # endif # if !defined(AO_HAVE_XSIZE_and_write) # define AO_XSIZE_and_write(addr, val) AO_XSIZE_and_full(addr, val) # define AO_HAVE_XSIZE_and_write # endif # if !defined(AO_HAVE_XSIZE_and_read) # define AO_XSIZE_and_read(addr, val) AO_XSIZE_and_full(addr, val) # define AO_HAVE_XSIZE_and_read # endif #endif /* AO_HAVE_XSIZE_and_full */ #if !defined(AO_HAVE_XSIZE_and) && defined(AO_HAVE_XSIZE_and_release) # define AO_XSIZE_and(addr, val) AO_XSIZE_and_release(addr, val) # define AO_HAVE_XSIZE_and #endif #if !defined(AO_HAVE_XSIZE_and) && defined(AO_HAVE_XSIZE_and_acquire) # define AO_XSIZE_and(addr, val) AO_XSIZE_and_acquire(addr, val) # define AO_HAVE_XSIZE_and #endif #if !defined(AO_HAVE_XSIZE_and) && defined(AO_HAVE_XSIZE_and_write) # define AO_XSIZE_and(addr, val) AO_XSIZE_and_write(addr, val) # define AO_HAVE_XSIZE_and #endif #if !defined(AO_HAVE_XSIZE_and) && defined(AO_HAVE_XSIZE_and_read) # define AO_XSIZE_and(addr, val) AO_XSIZE_and_read(addr, val) # define AO_HAVE_XSIZE_and #endif #if defined(AO_HAVE_XSIZE_and_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_and_full) # define AO_XSIZE_and_full(addr, val) \ (AO_nop_full(), AO_XSIZE_and_acquire(addr, val)) # define AO_HAVE_XSIZE_and_full #endif #if !defined(AO_HAVE_XSIZE_and_release_write) \ && defined(AO_HAVE_XSIZE_and_write) # define AO_XSIZE_and_release_write(addr, val) AO_XSIZE_and_write(addr, val) # define AO_HAVE_XSIZE_and_release_write #endif #if !defined(AO_HAVE_XSIZE_and_release_write) \ && defined(AO_HAVE_XSIZE_and_release) # define AO_XSIZE_and_release_write(addr, val) AO_XSIZE_and_release(addr, val) # define AO_HAVE_XSIZE_and_release_write #endif #if !defined(AO_HAVE_XSIZE_and_acquire_read) \ && defined(AO_HAVE_XSIZE_and_read) # define AO_XSIZE_and_acquire_read(addr, val) AO_XSIZE_and_read(addr, val) # define AO_HAVE_XSIZE_and_acquire_read #endif #if !defined(AO_HAVE_XSIZE_and_acquire_read) \ && defined(AO_HAVE_XSIZE_and_acquire) # define AO_XSIZE_and_acquire_read(addr, val) AO_XSIZE_and_acquire(addr, val) # define AO_HAVE_XSIZE_and_acquire_read #endif /* XSIZE_or */ #if defined(AO_HAVE_XSIZE_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_or_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_XSIZE_or_full(volatile XCTYPE *addr, XCTYPE value) { XCTYPE old; do { old = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old, old | value))); } # define AO_HAVE_XSIZE_or_full #endif #if defined(AO_HAVE_XSIZE_or_full) # if !defined(AO_HAVE_XSIZE_or_release) # define AO_XSIZE_or_release(addr, val) AO_XSIZE_or_full(addr, val) # define AO_HAVE_XSIZE_or_release # endif # if !defined(AO_HAVE_XSIZE_or_acquire) # define AO_XSIZE_or_acquire(addr, val) AO_XSIZE_or_full(addr, val) # define AO_HAVE_XSIZE_or_acquire # endif # if !defined(AO_HAVE_XSIZE_or_write) # define AO_XSIZE_or_write(addr, val) AO_XSIZE_or_full(addr, val) # define AO_HAVE_XSIZE_or_write # endif # if !defined(AO_HAVE_XSIZE_or_read) # define AO_XSIZE_or_read(addr, val) AO_XSIZE_or_full(addr, val) # define AO_HAVE_XSIZE_or_read # endif #endif /* AO_HAVE_XSIZE_or_full */ #if !defined(AO_HAVE_XSIZE_or) && defined(AO_HAVE_XSIZE_or_release) # define AO_XSIZE_or(addr, val) AO_XSIZE_or_release(addr, val) # define AO_HAVE_XSIZE_or #endif #if !defined(AO_HAVE_XSIZE_or) && defined(AO_HAVE_XSIZE_or_acquire) # define AO_XSIZE_or(addr, val) AO_XSIZE_or_acquire(addr, val) # define AO_HAVE_XSIZE_or #endif #if !defined(AO_HAVE_XSIZE_or) && defined(AO_HAVE_XSIZE_or_write) # define AO_XSIZE_or(addr, val) AO_XSIZE_or_write(addr, val) # define AO_HAVE_XSIZE_or #endif #if !defined(AO_HAVE_XSIZE_or) && defined(AO_HAVE_XSIZE_or_read) # define AO_XSIZE_or(addr, val) AO_XSIZE_or_read(addr, val) # define AO_HAVE_XSIZE_or #endif #if defined(AO_HAVE_XSIZE_or_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_or_full) # define AO_XSIZE_or_full(addr, val) \ (AO_nop_full(), AO_XSIZE_or_acquire(addr, val)) # define AO_HAVE_XSIZE_or_full #endif #if !defined(AO_HAVE_XSIZE_or_release_write) \ && defined(AO_HAVE_XSIZE_or_write) # define AO_XSIZE_or_release_write(addr, val) AO_XSIZE_or_write(addr, val) # define AO_HAVE_XSIZE_or_release_write #endif #if !defined(AO_HAVE_XSIZE_or_release_write) \ && defined(AO_HAVE_XSIZE_or_release) # define AO_XSIZE_or_release_write(addr, val) AO_XSIZE_or_release(addr, val) # define AO_HAVE_XSIZE_or_release_write #endif #if !defined(AO_HAVE_XSIZE_or_acquire_read) && defined(AO_HAVE_XSIZE_or_read) # define AO_XSIZE_or_acquire_read(addr, val) AO_XSIZE_or_read(addr, val) # define AO_HAVE_XSIZE_or_acquire_read #endif #if !defined(AO_HAVE_XSIZE_or_acquire_read) \ && defined(AO_HAVE_XSIZE_or_acquire) # define AO_XSIZE_or_acquire_read(addr, val) AO_XSIZE_or_acquire(addr, val) # define AO_HAVE_XSIZE_or_acquire_read #endif /* XSIZE_xor */ #if defined(AO_HAVE_XSIZE_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_xor_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_XSIZE_xor_full(volatile XCTYPE *addr, XCTYPE value) { XCTYPE old; do { old = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old, old ^ value))); } # define AO_HAVE_XSIZE_xor_full #endif #if defined(AO_HAVE_XSIZE_xor_full) # if !defined(AO_HAVE_XSIZE_xor_release) # define AO_XSIZE_xor_release(addr, val) AO_XSIZE_xor_full(addr, val) # define AO_HAVE_XSIZE_xor_release # endif # if !defined(AO_HAVE_XSIZE_xor_acquire) # define AO_XSIZE_xor_acquire(addr, val) AO_XSIZE_xor_full(addr, val) # define AO_HAVE_XSIZE_xor_acquire # endif # if !defined(AO_HAVE_XSIZE_xor_write) # define AO_XSIZE_xor_write(addr, val) AO_XSIZE_xor_full(addr, val) # define AO_HAVE_XSIZE_xor_write # endif # if !defined(AO_HAVE_XSIZE_xor_read) # define AO_XSIZE_xor_read(addr, val) AO_XSIZE_xor_full(addr, val) # define AO_HAVE_XSIZE_xor_read # endif #endif /* AO_HAVE_XSIZE_xor_full */ #if !defined(AO_HAVE_XSIZE_xor) && defined(AO_HAVE_XSIZE_xor_release) # define AO_XSIZE_xor(addr, val) AO_XSIZE_xor_release(addr, val) # define AO_HAVE_XSIZE_xor #endif #if !defined(AO_HAVE_XSIZE_xor) && defined(AO_HAVE_XSIZE_xor_acquire) # define AO_XSIZE_xor(addr, val) AO_XSIZE_xor_acquire(addr, val) # define AO_HAVE_XSIZE_xor #endif #if !defined(AO_HAVE_XSIZE_xor) && defined(AO_HAVE_XSIZE_xor_write) # define AO_XSIZE_xor(addr, val) AO_XSIZE_xor_write(addr, val) # define AO_HAVE_XSIZE_xor #endif #if !defined(AO_HAVE_XSIZE_xor) && defined(AO_HAVE_XSIZE_xor_read) # define AO_XSIZE_xor(addr, val) AO_XSIZE_xor_read(addr, val) # define AO_HAVE_XSIZE_xor #endif #if defined(AO_HAVE_XSIZE_xor_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_xor_full) # define AO_XSIZE_xor_full(addr, val) \ (AO_nop_full(), AO_XSIZE_xor_acquire(addr, val)) # define AO_HAVE_XSIZE_xor_full #endif #if !defined(AO_HAVE_XSIZE_xor_release_write) \ && defined(AO_HAVE_XSIZE_xor_write) # define AO_XSIZE_xor_release_write(addr, val) AO_XSIZE_xor_write(addr, val) # define AO_HAVE_XSIZE_xor_release_write #endif #if !defined(AO_HAVE_XSIZE_xor_release_write) \ && defined(AO_HAVE_XSIZE_xor_release) # define AO_XSIZE_xor_release_write(addr, val) AO_XSIZE_xor_release(addr, val) # define AO_HAVE_XSIZE_xor_release_write #endif #if !defined(AO_HAVE_XSIZE_xor_acquire_read) \ && defined(AO_HAVE_XSIZE_xor_read) # define AO_XSIZE_xor_acquire_read(addr, val) AO_XSIZE_xor_read(addr, val) # define AO_HAVE_XSIZE_xor_acquire_read #endif #if !defined(AO_HAVE_XSIZE_xor_acquire_read) \ && defined(AO_HAVE_XSIZE_xor_acquire) # define AO_XSIZE_xor_acquire_read(addr, val) AO_XSIZE_xor_acquire(addr, val) # define AO_HAVE_XSIZE_xor_acquire_read #endif /* XSIZE_and/or/xor_dd_acquire_read are meaningless. */ asymptote-3.05/libatomic_ops/src/atomic_ops/generalize-small.h0000644000000000000000000031255515031566105023355 0ustar rootroot/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* char_fetch_compare_and_swap */ #if defined(AO_HAVE_char_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_fetch_compare_and_swap_acquire) AO_INLINE unsigned/**/char AO_char_fetch_compare_and_swap_acquire(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { unsigned/**/char result = AO_char_fetch_compare_and_swap(addr, old_val, new_val); AO_nop_full(); return result; } # define AO_HAVE_char_fetch_compare_and_swap_acquire #endif #if defined(AO_HAVE_char_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_fetch_compare_and_swap_release) # define AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) \ (AO_nop_full(), \ AO_char_fetch_compare_and_swap(addr, old_val, new_val)) # define AO_HAVE_char_fetch_compare_and_swap_release #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_full) # if !defined(AO_HAVE_char_fetch_compare_and_swap_release) # define AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_release # endif # if !defined(AO_HAVE_char_fetch_compare_and_swap_acquire) # define AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_acquire # endif # if !defined(AO_HAVE_char_fetch_compare_and_swap_write) # define AO_char_fetch_compare_and_swap_write(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_write # endif # if !defined(AO_HAVE_char_fetch_compare_and_swap_read) # define AO_char_fetch_compare_and_swap_read(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_read # endif #endif /* AO_HAVE_char_fetch_compare_and_swap_full */ #if !defined(AO_HAVE_char_fetch_compare_and_swap) \ && defined(AO_HAVE_char_fetch_compare_and_swap_release) # define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap #endif #if !defined(AO_HAVE_char_fetch_compare_and_swap) \ && defined(AO_HAVE_char_fetch_compare_and_swap_acquire) # define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap #endif #if !defined(AO_HAVE_char_fetch_compare_and_swap) \ && defined(AO_HAVE_char_fetch_compare_and_swap_write) # define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap #endif #if !defined(AO_HAVE_char_fetch_compare_and_swap) \ && defined(AO_HAVE_char_fetch_compare_and_swap_read) # define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_fetch_compare_and_swap_full) # define AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) \ (AO_nop_full(), \ AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val)) # define AO_HAVE_char_fetch_compare_and_swap_full #endif #if !defined(AO_HAVE_char_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_char_fetch_compare_and_swap_write) # define AO_char_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_char_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_char_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_char_fetch_compare_and_swap_release) # define AO_char_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_char_fetch_compare_and_swap_read) # define AO_char_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_char_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_char_fetch_compare_and_swap_acquire) # define AO_char_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) # define AO_char_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_char_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_char_fetch_compare_and_swap) # define AO_char_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_char_fetch_compare_and_swap(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* char_compare_and_swap */ #if defined(AO_HAVE_char_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_compare_and_swap_acquire) AO_INLINE int AO_char_compare_and_swap_acquire(volatile unsigned/**/char *addr, unsigned/**/char old, unsigned/**/char new_val) { int result = AO_char_compare_and_swap(addr, old, new_val); AO_nop_full(); return result; } # define AO_HAVE_char_compare_and_swap_acquire #endif #if defined(AO_HAVE_char_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_compare_and_swap_release) # define AO_char_compare_and_swap_release(addr, old, new_val) \ (AO_nop_full(), AO_char_compare_and_swap(addr, old, new_val)) # define AO_HAVE_char_compare_and_swap_release #endif #if defined(AO_HAVE_char_compare_and_swap_full) # if !defined(AO_HAVE_char_compare_and_swap_release) # define AO_char_compare_and_swap_release(addr, old, new_val) \ AO_char_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_release # endif # if !defined(AO_HAVE_char_compare_and_swap_acquire) # define AO_char_compare_and_swap_acquire(addr, old, new_val) \ AO_char_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_acquire # endif # if !defined(AO_HAVE_char_compare_and_swap_write) # define AO_char_compare_and_swap_write(addr, old, new_val) \ AO_char_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_write # endif # if !defined(AO_HAVE_char_compare_and_swap_read) # define AO_char_compare_and_swap_read(addr, old, new_val) \ AO_char_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_read # endif #endif /* AO_HAVE_char_compare_and_swap_full */ #if !defined(AO_HAVE_char_compare_and_swap) \ && defined(AO_HAVE_char_compare_and_swap_release) # define AO_char_compare_and_swap(addr, old, new_val) \ AO_char_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_char_compare_and_swap #endif #if !defined(AO_HAVE_char_compare_and_swap) \ && defined(AO_HAVE_char_compare_and_swap_acquire) # define AO_char_compare_and_swap(addr, old, new_val) \ AO_char_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_char_compare_and_swap #endif #if !defined(AO_HAVE_char_compare_and_swap) \ && defined(AO_HAVE_char_compare_and_swap_write) # define AO_char_compare_and_swap(addr, old, new_val) \ AO_char_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_char_compare_and_swap #endif #if !defined(AO_HAVE_char_compare_and_swap) \ && defined(AO_HAVE_char_compare_and_swap_read) # define AO_char_compare_and_swap(addr, old, new_val) \ AO_char_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_char_compare_and_swap #endif #if defined(AO_HAVE_char_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_compare_and_swap_full) # define AO_char_compare_and_swap_full(addr, old, new_val) \ (AO_nop_full(), \ AO_char_compare_and_swap_acquire(addr, old, new_val)) # define AO_HAVE_char_compare_and_swap_full #endif #if !defined(AO_HAVE_char_compare_and_swap_release_write) \ && defined(AO_HAVE_char_compare_and_swap_write) # define AO_char_compare_and_swap_release_write(addr, old, new_val) \ AO_char_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_release_write #endif #if !defined(AO_HAVE_char_compare_and_swap_release_write) \ && defined(AO_HAVE_char_compare_and_swap_release) # define AO_char_compare_and_swap_release_write(addr, old, new_val) \ AO_char_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_release_write #endif #if !defined(AO_HAVE_char_compare_and_swap_acquire_read) \ && defined(AO_HAVE_char_compare_and_swap_read) # define AO_char_compare_and_swap_acquire_read(addr, old, new_val) \ AO_char_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_char_compare_and_swap_acquire_read) \ && defined(AO_HAVE_char_compare_and_swap_acquire) # define AO_char_compare_and_swap_acquire_read(addr, old, new_val) \ AO_char_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_char_compare_and_swap_acquire_read) # define AO_char_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_char_compare_and_swap_acquire_read(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_char_compare_and_swap) # define AO_char_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_char_compare_and_swap(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* char_load */ #if defined(AO_HAVE_char_load_full) && !defined(AO_HAVE_char_load_acquire) # define AO_char_load_acquire(addr) AO_char_load_full(addr) # define AO_HAVE_char_load_acquire #endif #if defined(AO_HAVE_char_load_acquire) && !defined(AO_HAVE_char_load) # define AO_char_load(addr) AO_char_load_acquire(addr) # define AO_HAVE_char_load #endif #if defined(AO_HAVE_char_load_full) && !defined(AO_HAVE_char_load_read) # define AO_char_load_read(addr) AO_char_load_full(addr) # define AO_HAVE_char_load_read #endif #if !defined(AO_HAVE_char_load_acquire_read) \ && defined(AO_HAVE_char_load_acquire) # define AO_char_load_acquire_read(addr) AO_char_load_acquire(addr) # define AO_HAVE_char_load_acquire_read #endif #if defined(AO_HAVE_char_load) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_load_acquire) AO_INLINE unsigned/**/char AO_char_load_acquire(const volatile unsigned/**/char *addr) { unsigned/**/char result = AO_char_load(addr); /* Acquire barrier would be useless, since the load could be delayed */ /* beyond it. */ AO_nop_full(); return result; } # define AO_HAVE_char_load_acquire #endif #if defined(AO_HAVE_char_load) && defined(AO_HAVE_nop_read) \ && !defined(AO_HAVE_char_load_read) AO_INLINE unsigned/**/char AO_char_load_read(const volatile unsigned/**/char *addr) { unsigned/**/char result = AO_char_load(addr); AO_nop_read(); return result; } # define AO_HAVE_char_load_read #endif #if defined(AO_HAVE_char_load_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_load_full) # define AO_char_load_full(addr) (AO_nop_full(), AO_char_load_acquire(addr)) # define AO_HAVE_char_load_full #endif #if defined(AO_HAVE_char_compare_and_swap_read) \ && !defined(AO_HAVE_char_load_read) # define AO_char_CAS_BASED_LOAD_READ AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/char AO_char_load_read(const volatile unsigned/**/char *addr) { unsigned/**/char result; do { result = *(const unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_read( (volatile unsigned/**/char *)addr, result, result))); return result; } # define AO_HAVE_char_load_read #endif #if !defined(AO_HAVE_char_load_acquire_read) \ && defined(AO_HAVE_char_load_read) # define AO_char_load_acquire_read(addr) AO_char_load_read(addr) # define AO_HAVE_char_load_acquire_read #endif #if defined(AO_HAVE_char_load_acquire_read) && !defined(AO_HAVE_char_load) \ && (!defined(AO_char_CAS_BASED_LOAD_READ) \ || !defined(AO_HAVE_char_compare_and_swap)) # define AO_char_load(addr) AO_char_load_acquire_read(addr) # define AO_HAVE_char_load #endif #if defined(AO_HAVE_char_compare_and_swap_full) \ && !defined(AO_HAVE_char_load_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/char AO_char_load_full(const volatile unsigned/**/char *addr) { unsigned/**/char result; do { result = *(const unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full( (volatile unsigned/**/char *)addr, result, result))); return result; } # define AO_HAVE_char_load_full #endif #if defined(AO_HAVE_char_compare_and_swap_acquire) \ && !defined(AO_HAVE_char_load_acquire) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/char AO_char_load_acquire(const volatile unsigned/**/char *addr) { unsigned/**/char result; do { result = *(const unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_acquire( (volatile unsigned/**/char *)addr, result, result))); return result; } # define AO_HAVE_char_load_acquire #endif #if defined(AO_HAVE_char_compare_and_swap) && !defined(AO_HAVE_char_load) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/char AO_char_load(const volatile unsigned/**/char *addr) { unsigned/**/char result; do { result = *(const unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap( (volatile unsigned/**/char *)addr, result, result))); return result; } # define AO_HAVE_char_load #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_char_load_acquire_read) # define AO_char_load_dd_acquire_read(addr) \ AO_char_load_acquire_read(addr) # define AO_HAVE_char_load_dd_acquire_read # endif #else # if defined(AO_HAVE_char_load) # define AO_char_load_dd_acquire_read(addr) AO_char_load(addr) # define AO_HAVE_char_load_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* char_store */ #if defined(AO_HAVE_char_store_full) && !defined(AO_HAVE_char_store_release) # define AO_char_store_release(addr, val) AO_char_store_full(addr, val) # define AO_HAVE_char_store_release #endif #if defined(AO_HAVE_char_store_release) && !defined(AO_HAVE_char_store) # define AO_char_store(addr, val) AO_char_store_release(addr, val) # define AO_HAVE_char_store #endif #if defined(AO_HAVE_char_store_full) && !defined(AO_HAVE_char_store_write) # define AO_char_store_write(addr, val) AO_char_store_full(addr, val) # define AO_HAVE_char_store_write #endif #if defined(AO_HAVE_char_store_release) \ && !defined(AO_HAVE_char_store_release_write) # define AO_char_store_release_write(addr, val) \ AO_char_store_release(addr, val) # define AO_HAVE_char_store_release_write #endif #if defined(AO_HAVE_char_store_write) && !defined(AO_HAVE_char_store) # define AO_char_store(addr, val) AO_char_store_write(addr, val) # define AO_HAVE_char_store #endif #if defined(AO_HAVE_char_store) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_store_release) # define AO_char_store_release(addr, val) \ (AO_nop_full(), AO_char_store(addr, val)) # define AO_HAVE_char_store_release #endif #if defined(AO_HAVE_char_store) && defined(AO_HAVE_nop_write) \ && !defined(AO_HAVE_char_store_write) # define AO_char_store_write(addr, val) \ (AO_nop_write(), AO_char_store(addr, val)) # define AO_HAVE_char_store_write #endif #if defined(AO_HAVE_char_compare_and_swap_write) \ && !defined(AO_HAVE_char_store_write) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_char_store_write(volatile unsigned/**/char *addr, unsigned/**/char new_val) { unsigned/**/char old_val; do { old_val = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_write(addr, old_val, new_val))); } # define AO_HAVE_char_store_write #endif #if defined(AO_HAVE_char_store_write) \ && !defined(AO_HAVE_char_store_release_write) # define AO_char_store_release_write(addr, val) \ AO_char_store_write(addr, val) # define AO_HAVE_char_store_release_write #endif #if defined(AO_HAVE_char_store_release) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_store_full) # define AO_char_store_full(addr, val) \ (AO_char_store_release(addr, val), \ AO_nop_full()) # define AO_HAVE_char_store_full #endif #if defined(AO_HAVE_char_compare_and_swap) && !defined(AO_HAVE_char_store) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_char_store(volatile unsigned/**/char *addr, unsigned/**/char new_val) { unsigned/**/char old_val; do { old_val = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap(addr, old_val, new_val))); } # define AO_HAVE_char_store #endif #if defined(AO_HAVE_char_compare_and_swap_release) \ && !defined(AO_HAVE_char_store_release) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_char_store_release(volatile unsigned/**/char *addr, unsigned/**/char new_val) { unsigned/**/char old_val; do { old_val = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_release(addr, old_val, new_val))); } # define AO_HAVE_char_store_release #endif #if defined(AO_HAVE_char_compare_and_swap_full) \ && !defined(AO_HAVE_char_store_full) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_char_store_full(volatile unsigned/**/char *addr, unsigned/**/char new_val) { unsigned/**/char old_val; do { old_val = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old_val, new_val))); } # define AO_HAVE_char_store_full #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* short_fetch_compare_and_swap */ #if defined(AO_HAVE_short_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_fetch_compare_and_swap_acquire) AO_INLINE unsigned/**/short AO_short_fetch_compare_and_swap_acquire(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { unsigned/**/short result = AO_short_fetch_compare_and_swap(addr, old_val, new_val); AO_nop_full(); return result; } # define AO_HAVE_short_fetch_compare_and_swap_acquire #endif #if defined(AO_HAVE_short_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_fetch_compare_and_swap_release) # define AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) \ (AO_nop_full(), \ AO_short_fetch_compare_and_swap(addr, old_val, new_val)) # define AO_HAVE_short_fetch_compare_and_swap_release #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_full) # if !defined(AO_HAVE_short_fetch_compare_and_swap_release) # define AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_release # endif # if !defined(AO_HAVE_short_fetch_compare_and_swap_acquire) # define AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_acquire # endif # if !defined(AO_HAVE_short_fetch_compare_and_swap_write) # define AO_short_fetch_compare_and_swap_write(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_write # endif # if !defined(AO_HAVE_short_fetch_compare_and_swap_read) # define AO_short_fetch_compare_and_swap_read(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_read # endif #endif /* AO_HAVE_short_fetch_compare_and_swap_full */ #if !defined(AO_HAVE_short_fetch_compare_and_swap) \ && defined(AO_HAVE_short_fetch_compare_and_swap_release) # define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap #endif #if !defined(AO_HAVE_short_fetch_compare_and_swap) \ && defined(AO_HAVE_short_fetch_compare_and_swap_acquire) # define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap #endif #if !defined(AO_HAVE_short_fetch_compare_and_swap) \ && defined(AO_HAVE_short_fetch_compare_and_swap_write) # define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap #endif #if !defined(AO_HAVE_short_fetch_compare_and_swap) \ && defined(AO_HAVE_short_fetch_compare_and_swap_read) # define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_fetch_compare_and_swap_full) # define AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) \ (AO_nop_full(), \ AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val)) # define AO_HAVE_short_fetch_compare_and_swap_full #endif #if !defined(AO_HAVE_short_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_short_fetch_compare_and_swap_write) # define AO_short_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_short_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_short_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_short_fetch_compare_and_swap_release) # define AO_short_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_short_fetch_compare_and_swap_read) # define AO_short_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_short_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_short_fetch_compare_and_swap_acquire) # define AO_short_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) # define AO_short_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_short_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_short_fetch_compare_and_swap) # define AO_short_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_short_fetch_compare_and_swap(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* short_compare_and_swap */ #if defined(AO_HAVE_short_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_compare_and_swap_acquire) AO_INLINE int AO_short_compare_and_swap_acquire(volatile unsigned/**/short *addr, unsigned/**/short old, unsigned/**/short new_val) { int result = AO_short_compare_and_swap(addr, old, new_val); AO_nop_full(); return result; } # define AO_HAVE_short_compare_and_swap_acquire #endif #if defined(AO_HAVE_short_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_compare_and_swap_release) # define AO_short_compare_and_swap_release(addr, old, new_val) \ (AO_nop_full(), AO_short_compare_and_swap(addr, old, new_val)) # define AO_HAVE_short_compare_and_swap_release #endif #if defined(AO_HAVE_short_compare_and_swap_full) # if !defined(AO_HAVE_short_compare_and_swap_release) # define AO_short_compare_and_swap_release(addr, old, new_val) \ AO_short_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_release # endif # if !defined(AO_HAVE_short_compare_and_swap_acquire) # define AO_short_compare_and_swap_acquire(addr, old, new_val) \ AO_short_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_acquire # endif # if !defined(AO_HAVE_short_compare_and_swap_write) # define AO_short_compare_and_swap_write(addr, old, new_val) \ AO_short_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_write # endif # if !defined(AO_HAVE_short_compare_and_swap_read) # define AO_short_compare_and_swap_read(addr, old, new_val) \ AO_short_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_read # endif #endif /* AO_HAVE_short_compare_and_swap_full */ #if !defined(AO_HAVE_short_compare_and_swap) \ && defined(AO_HAVE_short_compare_and_swap_release) # define AO_short_compare_and_swap(addr, old, new_val) \ AO_short_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_short_compare_and_swap #endif #if !defined(AO_HAVE_short_compare_and_swap) \ && defined(AO_HAVE_short_compare_and_swap_acquire) # define AO_short_compare_and_swap(addr, old, new_val) \ AO_short_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_short_compare_and_swap #endif #if !defined(AO_HAVE_short_compare_and_swap) \ && defined(AO_HAVE_short_compare_and_swap_write) # define AO_short_compare_and_swap(addr, old, new_val) \ AO_short_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_short_compare_and_swap #endif #if !defined(AO_HAVE_short_compare_and_swap) \ && defined(AO_HAVE_short_compare_and_swap_read) # define AO_short_compare_and_swap(addr, old, new_val) \ AO_short_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_short_compare_and_swap #endif #if defined(AO_HAVE_short_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_compare_and_swap_full) # define AO_short_compare_and_swap_full(addr, old, new_val) \ (AO_nop_full(), \ AO_short_compare_and_swap_acquire(addr, old, new_val)) # define AO_HAVE_short_compare_and_swap_full #endif #if !defined(AO_HAVE_short_compare_and_swap_release_write) \ && defined(AO_HAVE_short_compare_and_swap_write) # define AO_short_compare_and_swap_release_write(addr, old, new_val) \ AO_short_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_release_write #endif #if !defined(AO_HAVE_short_compare_and_swap_release_write) \ && defined(AO_HAVE_short_compare_and_swap_release) # define AO_short_compare_and_swap_release_write(addr, old, new_val) \ AO_short_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_release_write #endif #if !defined(AO_HAVE_short_compare_and_swap_acquire_read) \ && defined(AO_HAVE_short_compare_and_swap_read) # define AO_short_compare_and_swap_acquire_read(addr, old, new_val) \ AO_short_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_short_compare_and_swap_acquire_read) \ && defined(AO_HAVE_short_compare_and_swap_acquire) # define AO_short_compare_and_swap_acquire_read(addr, old, new_val) \ AO_short_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_short_compare_and_swap_acquire_read) # define AO_short_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_short_compare_and_swap_acquire_read(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_short_compare_and_swap) # define AO_short_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_short_compare_and_swap(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* short_load */ #if defined(AO_HAVE_short_load_full) && !defined(AO_HAVE_short_load_acquire) # define AO_short_load_acquire(addr) AO_short_load_full(addr) # define AO_HAVE_short_load_acquire #endif #if defined(AO_HAVE_short_load_acquire) && !defined(AO_HAVE_short_load) # define AO_short_load(addr) AO_short_load_acquire(addr) # define AO_HAVE_short_load #endif #if defined(AO_HAVE_short_load_full) && !defined(AO_HAVE_short_load_read) # define AO_short_load_read(addr) AO_short_load_full(addr) # define AO_HAVE_short_load_read #endif #if !defined(AO_HAVE_short_load_acquire_read) \ && defined(AO_HAVE_short_load_acquire) # define AO_short_load_acquire_read(addr) AO_short_load_acquire(addr) # define AO_HAVE_short_load_acquire_read #endif #if defined(AO_HAVE_short_load) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_load_acquire) AO_INLINE unsigned/**/short AO_short_load_acquire(const volatile unsigned/**/short *addr) { unsigned/**/short result = AO_short_load(addr); /* Acquire barrier would be useless, since the load could be delayed */ /* beyond it. */ AO_nop_full(); return result; } # define AO_HAVE_short_load_acquire #endif #if defined(AO_HAVE_short_load) && defined(AO_HAVE_nop_read) \ && !defined(AO_HAVE_short_load_read) AO_INLINE unsigned/**/short AO_short_load_read(const volatile unsigned/**/short *addr) { unsigned/**/short result = AO_short_load(addr); AO_nop_read(); return result; } # define AO_HAVE_short_load_read #endif #if defined(AO_HAVE_short_load_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_load_full) # define AO_short_load_full(addr) (AO_nop_full(), AO_short_load_acquire(addr)) # define AO_HAVE_short_load_full #endif #if defined(AO_HAVE_short_compare_and_swap_read) \ && !defined(AO_HAVE_short_load_read) # define AO_short_CAS_BASED_LOAD_READ AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/short AO_short_load_read(const volatile unsigned/**/short *addr) { unsigned/**/short result; do { result = *(const unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_read( (volatile unsigned/**/short *)addr, result, result))); return result; } # define AO_HAVE_short_load_read #endif #if !defined(AO_HAVE_short_load_acquire_read) \ && defined(AO_HAVE_short_load_read) # define AO_short_load_acquire_read(addr) AO_short_load_read(addr) # define AO_HAVE_short_load_acquire_read #endif #if defined(AO_HAVE_short_load_acquire_read) && !defined(AO_HAVE_short_load) \ && (!defined(AO_short_CAS_BASED_LOAD_READ) \ || !defined(AO_HAVE_short_compare_and_swap)) # define AO_short_load(addr) AO_short_load_acquire_read(addr) # define AO_HAVE_short_load #endif #if defined(AO_HAVE_short_compare_and_swap_full) \ && !defined(AO_HAVE_short_load_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/short AO_short_load_full(const volatile unsigned/**/short *addr) { unsigned/**/short result; do { result = *(const unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full( (volatile unsigned/**/short *)addr, result, result))); return result; } # define AO_HAVE_short_load_full #endif #if defined(AO_HAVE_short_compare_and_swap_acquire) \ && !defined(AO_HAVE_short_load_acquire) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/short AO_short_load_acquire(const volatile unsigned/**/short *addr) { unsigned/**/short result; do { result = *(const unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_acquire( (volatile unsigned/**/short *)addr, result, result))); return result; } # define AO_HAVE_short_load_acquire #endif #if defined(AO_HAVE_short_compare_and_swap) && !defined(AO_HAVE_short_load) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/short AO_short_load(const volatile unsigned/**/short *addr) { unsigned/**/short result; do { result = *(const unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap( (volatile unsigned/**/short *)addr, result, result))); return result; } # define AO_HAVE_short_load #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_short_load_acquire_read) # define AO_short_load_dd_acquire_read(addr) \ AO_short_load_acquire_read(addr) # define AO_HAVE_short_load_dd_acquire_read # endif #else # if defined(AO_HAVE_short_load) # define AO_short_load_dd_acquire_read(addr) AO_short_load(addr) # define AO_HAVE_short_load_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* short_store */ #if defined(AO_HAVE_short_store_full) && !defined(AO_HAVE_short_store_release) # define AO_short_store_release(addr, val) AO_short_store_full(addr, val) # define AO_HAVE_short_store_release #endif #if defined(AO_HAVE_short_store_release) && !defined(AO_HAVE_short_store) # define AO_short_store(addr, val) AO_short_store_release(addr, val) # define AO_HAVE_short_store #endif #if defined(AO_HAVE_short_store_full) && !defined(AO_HAVE_short_store_write) # define AO_short_store_write(addr, val) AO_short_store_full(addr, val) # define AO_HAVE_short_store_write #endif #if defined(AO_HAVE_short_store_release) \ && !defined(AO_HAVE_short_store_release_write) # define AO_short_store_release_write(addr, val) \ AO_short_store_release(addr, val) # define AO_HAVE_short_store_release_write #endif #if defined(AO_HAVE_short_store_write) && !defined(AO_HAVE_short_store) # define AO_short_store(addr, val) AO_short_store_write(addr, val) # define AO_HAVE_short_store #endif #if defined(AO_HAVE_short_store) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_store_release) # define AO_short_store_release(addr, val) \ (AO_nop_full(), AO_short_store(addr, val)) # define AO_HAVE_short_store_release #endif #if defined(AO_HAVE_short_store) && defined(AO_HAVE_nop_write) \ && !defined(AO_HAVE_short_store_write) # define AO_short_store_write(addr, val) \ (AO_nop_write(), AO_short_store(addr, val)) # define AO_HAVE_short_store_write #endif #if defined(AO_HAVE_short_compare_and_swap_write) \ && !defined(AO_HAVE_short_store_write) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_short_store_write(volatile unsigned/**/short *addr, unsigned/**/short new_val) { unsigned/**/short old_val; do { old_val = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_write(addr, old_val, new_val))); } # define AO_HAVE_short_store_write #endif #if defined(AO_HAVE_short_store_write) \ && !defined(AO_HAVE_short_store_release_write) # define AO_short_store_release_write(addr, val) \ AO_short_store_write(addr, val) # define AO_HAVE_short_store_release_write #endif #if defined(AO_HAVE_short_store_release) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_store_full) # define AO_short_store_full(addr, val) \ (AO_short_store_release(addr, val), \ AO_nop_full()) # define AO_HAVE_short_store_full #endif #if defined(AO_HAVE_short_compare_and_swap) && !defined(AO_HAVE_short_store) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_short_store(volatile unsigned/**/short *addr, unsigned/**/short new_val) { unsigned/**/short old_val; do { old_val = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap(addr, old_val, new_val))); } # define AO_HAVE_short_store #endif #if defined(AO_HAVE_short_compare_and_swap_release) \ && !defined(AO_HAVE_short_store_release) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_short_store_release(volatile unsigned/**/short *addr, unsigned/**/short new_val) { unsigned/**/short old_val; do { old_val = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_release(addr, old_val, new_val))); } # define AO_HAVE_short_store_release #endif #if defined(AO_HAVE_short_compare_and_swap_full) \ && !defined(AO_HAVE_short_store_full) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_short_store_full(volatile unsigned/**/short *addr, unsigned/**/short new_val) { unsigned/**/short old_val; do { old_val = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old_val, new_val))); } # define AO_HAVE_short_store_full #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* int_fetch_compare_and_swap */ #if defined(AO_HAVE_int_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_acquire) AO_INLINE unsigned AO_int_fetch_compare_and_swap_acquire(volatile unsigned *addr, unsigned old_val, unsigned new_val) { unsigned result = AO_int_fetch_compare_and_swap(addr, old_val, new_val); AO_nop_full(); return result; } # define AO_HAVE_int_fetch_compare_and_swap_acquire #endif #if defined(AO_HAVE_int_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_release) # define AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) \ (AO_nop_full(), \ AO_int_fetch_compare_and_swap(addr, old_val, new_val)) # define AO_HAVE_int_fetch_compare_and_swap_release #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_full) # if !defined(AO_HAVE_int_fetch_compare_and_swap_release) # define AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_release # endif # if !defined(AO_HAVE_int_fetch_compare_and_swap_acquire) # define AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_acquire # endif # if !defined(AO_HAVE_int_fetch_compare_and_swap_write) # define AO_int_fetch_compare_and_swap_write(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_write # endif # if !defined(AO_HAVE_int_fetch_compare_and_swap_read) # define AO_int_fetch_compare_and_swap_read(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_read # endif #endif /* AO_HAVE_int_fetch_compare_and_swap_full */ #if !defined(AO_HAVE_int_fetch_compare_and_swap) \ && defined(AO_HAVE_int_fetch_compare_and_swap_release) # define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap #endif #if !defined(AO_HAVE_int_fetch_compare_and_swap) \ && defined(AO_HAVE_int_fetch_compare_and_swap_acquire) # define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap #endif #if !defined(AO_HAVE_int_fetch_compare_and_swap) \ && defined(AO_HAVE_int_fetch_compare_and_swap_write) # define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap #endif #if !defined(AO_HAVE_int_fetch_compare_and_swap) \ && defined(AO_HAVE_int_fetch_compare_and_swap_read) # define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_full) # define AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) \ (AO_nop_full(), \ AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val)) # define AO_HAVE_int_fetch_compare_and_swap_full #endif #if !defined(AO_HAVE_int_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_int_fetch_compare_and_swap_write) # define AO_int_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_int_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_int_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_int_fetch_compare_and_swap_release) # define AO_int_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_int_fetch_compare_and_swap_read) # define AO_int_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_int_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_int_fetch_compare_and_swap_acquire) # define AO_int_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) # define AO_int_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_int_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_int_fetch_compare_and_swap) # define AO_int_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_int_fetch_compare_and_swap(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* int_compare_and_swap */ #if defined(AO_HAVE_int_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_compare_and_swap_acquire) AO_INLINE int AO_int_compare_and_swap_acquire(volatile unsigned *addr, unsigned old, unsigned new_val) { int result = AO_int_compare_and_swap(addr, old, new_val); AO_nop_full(); return result; } # define AO_HAVE_int_compare_and_swap_acquire #endif #if defined(AO_HAVE_int_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_compare_and_swap_release) # define AO_int_compare_and_swap_release(addr, old, new_val) \ (AO_nop_full(), AO_int_compare_and_swap(addr, old, new_val)) # define AO_HAVE_int_compare_and_swap_release #endif #if defined(AO_HAVE_int_compare_and_swap_full) # if !defined(AO_HAVE_int_compare_and_swap_release) # define AO_int_compare_and_swap_release(addr, old, new_val) \ AO_int_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_release # endif # if !defined(AO_HAVE_int_compare_and_swap_acquire) # define AO_int_compare_and_swap_acquire(addr, old, new_val) \ AO_int_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_acquire # endif # if !defined(AO_HAVE_int_compare_and_swap_write) # define AO_int_compare_and_swap_write(addr, old, new_val) \ AO_int_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_write # endif # if !defined(AO_HAVE_int_compare_and_swap_read) # define AO_int_compare_and_swap_read(addr, old, new_val) \ AO_int_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_read # endif #endif /* AO_HAVE_int_compare_and_swap_full */ #if !defined(AO_HAVE_int_compare_and_swap) \ && defined(AO_HAVE_int_compare_and_swap_release) # define AO_int_compare_and_swap(addr, old, new_val) \ AO_int_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_int_compare_and_swap #endif #if !defined(AO_HAVE_int_compare_and_swap) \ && defined(AO_HAVE_int_compare_and_swap_acquire) # define AO_int_compare_and_swap(addr, old, new_val) \ AO_int_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_int_compare_and_swap #endif #if !defined(AO_HAVE_int_compare_and_swap) \ && defined(AO_HAVE_int_compare_and_swap_write) # define AO_int_compare_and_swap(addr, old, new_val) \ AO_int_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_int_compare_and_swap #endif #if !defined(AO_HAVE_int_compare_and_swap) \ && defined(AO_HAVE_int_compare_and_swap_read) # define AO_int_compare_and_swap(addr, old, new_val) \ AO_int_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_int_compare_and_swap #endif #if defined(AO_HAVE_int_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_compare_and_swap_full) # define AO_int_compare_and_swap_full(addr, old, new_val) \ (AO_nop_full(), \ AO_int_compare_and_swap_acquire(addr, old, new_val)) # define AO_HAVE_int_compare_and_swap_full #endif #if !defined(AO_HAVE_int_compare_and_swap_release_write) \ && defined(AO_HAVE_int_compare_and_swap_write) # define AO_int_compare_and_swap_release_write(addr, old, new_val) \ AO_int_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_release_write #endif #if !defined(AO_HAVE_int_compare_and_swap_release_write) \ && defined(AO_HAVE_int_compare_and_swap_release) # define AO_int_compare_and_swap_release_write(addr, old, new_val) \ AO_int_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_release_write #endif #if !defined(AO_HAVE_int_compare_and_swap_acquire_read) \ && defined(AO_HAVE_int_compare_and_swap_read) # define AO_int_compare_and_swap_acquire_read(addr, old, new_val) \ AO_int_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_int_compare_and_swap_acquire_read) \ && defined(AO_HAVE_int_compare_and_swap_acquire) # define AO_int_compare_and_swap_acquire_read(addr, old, new_val) \ AO_int_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_int_compare_and_swap_acquire_read) # define AO_int_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_int_compare_and_swap_acquire_read(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_int_compare_and_swap) # define AO_int_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_int_compare_and_swap(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* int_load */ #if defined(AO_HAVE_int_load_full) && !defined(AO_HAVE_int_load_acquire) # define AO_int_load_acquire(addr) AO_int_load_full(addr) # define AO_HAVE_int_load_acquire #endif #if defined(AO_HAVE_int_load_acquire) && !defined(AO_HAVE_int_load) # define AO_int_load(addr) AO_int_load_acquire(addr) # define AO_HAVE_int_load #endif #if defined(AO_HAVE_int_load_full) && !defined(AO_HAVE_int_load_read) # define AO_int_load_read(addr) AO_int_load_full(addr) # define AO_HAVE_int_load_read #endif #if !defined(AO_HAVE_int_load_acquire_read) \ && defined(AO_HAVE_int_load_acquire) # define AO_int_load_acquire_read(addr) AO_int_load_acquire(addr) # define AO_HAVE_int_load_acquire_read #endif #if defined(AO_HAVE_int_load) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_load_acquire) AO_INLINE unsigned AO_int_load_acquire(const volatile unsigned *addr) { unsigned result = AO_int_load(addr); /* Acquire barrier would be useless, since the load could be delayed */ /* beyond it. */ AO_nop_full(); return result; } # define AO_HAVE_int_load_acquire #endif #if defined(AO_HAVE_int_load) && defined(AO_HAVE_nop_read) \ && !defined(AO_HAVE_int_load_read) AO_INLINE unsigned AO_int_load_read(const volatile unsigned *addr) { unsigned result = AO_int_load(addr); AO_nop_read(); return result; } # define AO_HAVE_int_load_read #endif #if defined(AO_HAVE_int_load_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_load_full) # define AO_int_load_full(addr) (AO_nop_full(), AO_int_load_acquire(addr)) # define AO_HAVE_int_load_full #endif #if defined(AO_HAVE_int_compare_and_swap_read) \ && !defined(AO_HAVE_int_load_read) # define AO_int_CAS_BASED_LOAD_READ AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned AO_int_load_read(const volatile unsigned *addr) { unsigned result; do { result = *(const unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_read( (volatile unsigned *)addr, result, result))); return result; } # define AO_HAVE_int_load_read #endif #if !defined(AO_HAVE_int_load_acquire_read) \ && defined(AO_HAVE_int_load_read) # define AO_int_load_acquire_read(addr) AO_int_load_read(addr) # define AO_HAVE_int_load_acquire_read #endif #if defined(AO_HAVE_int_load_acquire_read) && !defined(AO_HAVE_int_load) \ && (!defined(AO_int_CAS_BASED_LOAD_READ) \ || !defined(AO_HAVE_int_compare_and_swap)) # define AO_int_load(addr) AO_int_load_acquire_read(addr) # define AO_HAVE_int_load #endif #if defined(AO_HAVE_int_compare_and_swap_full) \ && !defined(AO_HAVE_int_load_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned AO_int_load_full(const volatile unsigned *addr) { unsigned result; do { result = *(const unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full( (volatile unsigned *)addr, result, result))); return result; } # define AO_HAVE_int_load_full #endif #if defined(AO_HAVE_int_compare_and_swap_acquire) \ && !defined(AO_HAVE_int_load_acquire) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned AO_int_load_acquire(const volatile unsigned *addr) { unsigned result; do { result = *(const unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_acquire( (volatile unsigned *)addr, result, result))); return result; } # define AO_HAVE_int_load_acquire #endif #if defined(AO_HAVE_int_compare_and_swap) && !defined(AO_HAVE_int_load) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned AO_int_load(const volatile unsigned *addr) { unsigned result; do { result = *(const unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap( (volatile unsigned *)addr, result, result))); return result; } # define AO_HAVE_int_load #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_int_load_acquire_read) # define AO_int_load_dd_acquire_read(addr) \ AO_int_load_acquire_read(addr) # define AO_HAVE_int_load_dd_acquire_read # endif #else # if defined(AO_HAVE_int_load) # define AO_int_load_dd_acquire_read(addr) AO_int_load(addr) # define AO_HAVE_int_load_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* int_store */ #if defined(AO_HAVE_int_store_full) && !defined(AO_HAVE_int_store_release) # define AO_int_store_release(addr, val) AO_int_store_full(addr, val) # define AO_HAVE_int_store_release #endif #if defined(AO_HAVE_int_store_release) && !defined(AO_HAVE_int_store) # define AO_int_store(addr, val) AO_int_store_release(addr, val) # define AO_HAVE_int_store #endif #if defined(AO_HAVE_int_store_full) && !defined(AO_HAVE_int_store_write) # define AO_int_store_write(addr, val) AO_int_store_full(addr, val) # define AO_HAVE_int_store_write #endif #if defined(AO_HAVE_int_store_release) \ && !defined(AO_HAVE_int_store_release_write) # define AO_int_store_release_write(addr, val) \ AO_int_store_release(addr, val) # define AO_HAVE_int_store_release_write #endif #if defined(AO_HAVE_int_store_write) && !defined(AO_HAVE_int_store) # define AO_int_store(addr, val) AO_int_store_write(addr, val) # define AO_HAVE_int_store #endif #if defined(AO_HAVE_int_store) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_store_release) # define AO_int_store_release(addr, val) \ (AO_nop_full(), AO_int_store(addr, val)) # define AO_HAVE_int_store_release #endif #if defined(AO_HAVE_int_store) && defined(AO_HAVE_nop_write) \ && !defined(AO_HAVE_int_store_write) # define AO_int_store_write(addr, val) \ (AO_nop_write(), AO_int_store(addr, val)) # define AO_HAVE_int_store_write #endif #if defined(AO_HAVE_int_compare_and_swap_write) \ && !defined(AO_HAVE_int_store_write) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_int_store_write(volatile unsigned *addr, unsigned new_val) { unsigned old_val; do { old_val = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_write(addr, old_val, new_val))); } # define AO_HAVE_int_store_write #endif #if defined(AO_HAVE_int_store_write) \ && !defined(AO_HAVE_int_store_release_write) # define AO_int_store_release_write(addr, val) \ AO_int_store_write(addr, val) # define AO_HAVE_int_store_release_write #endif #if defined(AO_HAVE_int_store_release) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_store_full) # define AO_int_store_full(addr, val) \ (AO_int_store_release(addr, val), \ AO_nop_full()) # define AO_HAVE_int_store_full #endif #if defined(AO_HAVE_int_compare_and_swap) && !defined(AO_HAVE_int_store) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_int_store(volatile unsigned *addr, unsigned new_val) { unsigned old_val; do { old_val = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap(addr, old_val, new_val))); } # define AO_HAVE_int_store #endif #if defined(AO_HAVE_int_compare_and_swap_release) \ && !defined(AO_HAVE_int_store_release) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_int_store_release(volatile unsigned *addr, unsigned new_val) { unsigned old_val; do { old_val = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_release(addr, old_val, new_val))); } # define AO_HAVE_int_store_release #endif #if defined(AO_HAVE_int_compare_and_swap_full) \ && !defined(AO_HAVE_int_store_full) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_int_store_full(volatile unsigned *addr, unsigned new_val) { unsigned old_val; do { old_val = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old_val, new_val))); } # define AO_HAVE_int_store_full #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* fetch_compare_and_swap */ #if defined(AO_HAVE_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_fetch_compare_and_swap_acquire) AO_INLINE AO_t AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t result = AO_fetch_compare_and_swap(addr, old_val, new_val); AO_nop_full(); return result; } # define AO_HAVE_fetch_compare_and_swap_acquire #endif #if defined(AO_HAVE_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_fetch_compare_and_swap_release) # define AO_fetch_compare_and_swap_release(addr, old_val, new_val) \ (AO_nop_full(), \ AO_fetch_compare_and_swap(addr, old_val, new_val)) # define AO_HAVE_fetch_compare_and_swap_release #endif #if defined(AO_HAVE_fetch_compare_and_swap_full) # if !defined(AO_HAVE_fetch_compare_and_swap_release) # define AO_fetch_compare_and_swap_release(addr, old_val, new_val) \ AO_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_release # endif # if !defined(AO_HAVE_fetch_compare_and_swap_acquire) # define AO_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ AO_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_acquire # endif # if !defined(AO_HAVE_fetch_compare_and_swap_write) # define AO_fetch_compare_and_swap_write(addr, old_val, new_val) \ AO_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_write # endif # if !defined(AO_HAVE_fetch_compare_and_swap_read) # define AO_fetch_compare_and_swap_read(addr, old_val, new_val) \ AO_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_read # endif #endif /* AO_HAVE_fetch_compare_and_swap_full */ #if !defined(AO_HAVE_fetch_compare_and_swap) \ && defined(AO_HAVE_fetch_compare_and_swap_release) # define AO_fetch_compare_and_swap(addr, old_val, new_val) \ AO_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap #endif #if !defined(AO_HAVE_fetch_compare_and_swap) \ && defined(AO_HAVE_fetch_compare_and_swap_acquire) # define AO_fetch_compare_and_swap(addr, old_val, new_val) \ AO_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap #endif #if !defined(AO_HAVE_fetch_compare_and_swap) \ && defined(AO_HAVE_fetch_compare_and_swap_write) # define AO_fetch_compare_and_swap(addr, old_val, new_val) \ AO_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap #endif #if !defined(AO_HAVE_fetch_compare_and_swap) \ && defined(AO_HAVE_fetch_compare_and_swap_read) # define AO_fetch_compare_and_swap(addr, old_val, new_val) \ AO_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap #endif #if defined(AO_HAVE_fetch_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_fetch_compare_and_swap_full) # define AO_fetch_compare_and_swap_full(addr, old_val, new_val) \ (AO_nop_full(), \ AO_fetch_compare_and_swap_acquire(addr, old_val, new_val)) # define AO_HAVE_fetch_compare_and_swap_full #endif #if !defined(AO_HAVE_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_fetch_compare_and_swap_write) # define AO_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_fetch_compare_and_swap_release) # define AO_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_fetch_compare_and_swap_read) # define AO_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_fetch_compare_and_swap_acquire) # define AO_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_fetch_compare_and_swap_acquire_read) # define AO_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_fetch_compare_and_swap) # define AO_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_fetch_compare_and_swap(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* compare_and_swap */ #if defined(AO_HAVE_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_and_swap_acquire) AO_INLINE int AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val) { int result = AO_compare_and_swap(addr, old, new_val); AO_nop_full(); return result; } # define AO_HAVE_compare_and_swap_acquire #endif #if defined(AO_HAVE_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_and_swap_release) # define AO_compare_and_swap_release(addr, old, new_val) \ (AO_nop_full(), AO_compare_and_swap(addr, old, new_val)) # define AO_HAVE_compare_and_swap_release #endif #if defined(AO_HAVE_compare_and_swap_full) # if !defined(AO_HAVE_compare_and_swap_release) # define AO_compare_and_swap_release(addr, old, new_val) \ AO_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_compare_and_swap_release # endif # if !defined(AO_HAVE_compare_and_swap_acquire) # define AO_compare_and_swap_acquire(addr, old, new_val) \ AO_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_compare_and_swap_acquire # endif # if !defined(AO_HAVE_compare_and_swap_write) # define AO_compare_and_swap_write(addr, old, new_val) \ AO_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_compare_and_swap_write # endif # if !defined(AO_HAVE_compare_and_swap_read) # define AO_compare_and_swap_read(addr, old, new_val) \ AO_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_compare_and_swap_read # endif #endif /* AO_HAVE_compare_and_swap_full */ #if !defined(AO_HAVE_compare_and_swap) \ && defined(AO_HAVE_compare_and_swap_release) # define AO_compare_and_swap(addr, old, new_val) \ AO_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_compare_and_swap #endif #if !defined(AO_HAVE_compare_and_swap) \ && defined(AO_HAVE_compare_and_swap_acquire) # define AO_compare_and_swap(addr, old, new_val) \ AO_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_compare_and_swap #endif #if !defined(AO_HAVE_compare_and_swap) \ && defined(AO_HAVE_compare_and_swap_write) # define AO_compare_and_swap(addr, old, new_val) \ AO_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_compare_and_swap #endif #if !defined(AO_HAVE_compare_and_swap) \ && defined(AO_HAVE_compare_and_swap_read) # define AO_compare_and_swap(addr, old, new_val) \ AO_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_compare_and_swap #endif #if defined(AO_HAVE_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_and_swap_full) # define AO_compare_and_swap_full(addr, old, new_val) \ (AO_nop_full(), \ AO_compare_and_swap_acquire(addr, old, new_val)) # define AO_HAVE_compare_and_swap_full #endif #if !defined(AO_HAVE_compare_and_swap_release_write) \ && defined(AO_HAVE_compare_and_swap_write) # define AO_compare_and_swap_release_write(addr, old, new_val) \ AO_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_compare_and_swap_release_write #endif #if !defined(AO_HAVE_compare_and_swap_release_write) \ && defined(AO_HAVE_compare_and_swap_release) # define AO_compare_and_swap_release_write(addr, old, new_val) \ AO_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_compare_and_swap_release_write #endif #if !defined(AO_HAVE_compare_and_swap_acquire_read) \ && defined(AO_HAVE_compare_and_swap_read) # define AO_compare_and_swap_acquire_read(addr, old, new_val) \ AO_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_compare_and_swap_acquire_read) \ && defined(AO_HAVE_compare_and_swap_acquire) # define AO_compare_and_swap_acquire_read(addr, old, new_val) \ AO_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_compare_and_swap_acquire_read) # define AO_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_compare_and_swap_acquire_read(addr, old, new_val) # define AO_HAVE_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_compare_and_swap) # define AO_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_compare_and_swap(addr, old, new_val) # define AO_HAVE_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* load */ #if defined(AO_HAVE_load_full) && !defined(AO_HAVE_load_acquire) # define AO_load_acquire(addr) AO_load_full(addr) # define AO_HAVE_load_acquire #endif #if defined(AO_HAVE_load_acquire) && !defined(AO_HAVE_load) # define AO_load(addr) AO_load_acquire(addr) # define AO_HAVE_load #endif #if defined(AO_HAVE_load_full) && !defined(AO_HAVE_load_read) # define AO_load_read(addr) AO_load_full(addr) # define AO_HAVE_load_read #endif #if !defined(AO_HAVE_load_acquire_read) \ && defined(AO_HAVE_load_acquire) # define AO_load_acquire_read(addr) AO_load_acquire(addr) # define AO_HAVE_load_acquire_read #endif #if defined(AO_HAVE_load) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_load_acquire) AO_INLINE AO_t AO_load_acquire(const volatile AO_t *addr) { AO_t result = AO_load(addr); /* Acquire barrier would be useless, since the load could be delayed */ /* beyond it. */ AO_nop_full(); return result; } # define AO_HAVE_load_acquire #endif #if defined(AO_HAVE_load) && defined(AO_HAVE_nop_read) \ && !defined(AO_HAVE_load_read) AO_INLINE AO_t AO_load_read(const volatile AO_t *addr) { AO_t result = AO_load(addr); AO_nop_read(); return result; } # define AO_HAVE_load_read #endif #if defined(AO_HAVE_load_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_load_full) # define AO_load_full(addr) (AO_nop_full(), AO_load_acquire(addr)) # define AO_HAVE_load_full #endif #if defined(AO_HAVE_compare_and_swap_read) \ && !defined(AO_HAVE_load_read) # define AO_CAS_BASED_LOAD_READ AO_ATTR_NO_SANITIZE_THREAD AO_INLINE AO_t AO_load_read(const volatile AO_t *addr) { AO_t result; do { result = *(const AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_read( (volatile AO_t *)addr, result, result))); return result; } # define AO_HAVE_load_read #endif #if !defined(AO_HAVE_load_acquire_read) \ && defined(AO_HAVE_load_read) # define AO_load_acquire_read(addr) AO_load_read(addr) # define AO_HAVE_load_acquire_read #endif #if defined(AO_HAVE_load_acquire_read) && !defined(AO_HAVE_load) \ && (!defined(AO_CAS_BASED_LOAD_READ) \ || !defined(AO_HAVE_compare_and_swap)) # define AO_load(addr) AO_load_acquire_read(addr) # define AO_HAVE_load #endif #if defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_load_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE AO_t AO_load_full(const volatile AO_t *addr) { AO_t result; do { result = *(const AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_full( (volatile AO_t *)addr, result, result))); return result; } # define AO_HAVE_load_full #endif #if defined(AO_HAVE_compare_and_swap_acquire) \ && !defined(AO_HAVE_load_acquire) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE AO_t AO_load_acquire(const volatile AO_t *addr) { AO_t result; do { result = *(const AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_acquire( (volatile AO_t *)addr, result, result))); return result; } # define AO_HAVE_load_acquire #endif #if defined(AO_HAVE_compare_and_swap) && !defined(AO_HAVE_load) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE AO_t AO_load(const volatile AO_t *addr) { AO_t result; do { result = *(const AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap( (volatile AO_t *)addr, result, result))); return result; } # define AO_HAVE_load #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_load_acquire_read) # define AO_load_dd_acquire_read(addr) \ AO_load_acquire_read(addr) # define AO_HAVE_load_dd_acquire_read # endif #else # if defined(AO_HAVE_load) # define AO_load_dd_acquire_read(addr) AO_load(addr) # define AO_HAVE_load_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* store */ #if defined(AO_HAVE_store_full) && !defined(AO_HAVE_store_release) # define AO_store_release(addr, val) AO_store_full(addr, val) # define AO_HAVE_store_release #endif #if defined(AO_HAVE_store_release) && !defined(AO_HAVE_store) # define AO_store(addr, val) AO_store_release(addr, val) # define AO_HAVE_store #endif #if defined(AO_HAVE_store_full) && !defined(AO_HAVE_store_write) # define AO_store_write(addr, val) AO_store_full(addr, val) # define AO_HAVE_store_write #endif #if defined(AO_HAVE_store_release) \ && !defined(AO_HAVE_store_release_write) # define AO_store_release_write(addr, val) \ AO_store_release(addr, val) # define AO_HAVE_store_release_write #endif #if defined(AO_HAVE_store_write) && !defined(AO_HAVE_store) # define AO_store(addr, val) AO_store_write(addr, val) # define AO_HAVE_store #endif #if defined(AO_HAVE_store) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_store_release) # define AO_store_release(addr, val) \ (AO_nop_full(), AO_store(addr, val)) # define AO_HAVE_store_release #endif #if defined(AO_HAVE_store) && defined(AO_HAVE_nop_write) \ && !defined(AO_HAVE_store_write) # define AO_store_write(addr, val) \ (AO_nop_write(), AO_store(addr, val)) # define AO_HAVE_store_write #endif #if defined(AO_HAVE_compare_and_swap_write) \ && !defined(AO_HAVE_store_write) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_store_write(volatile AO_t *addr, AO_t new_val) { AO_t old_val; do { old_val = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_write(addr, old_val, new_val))); } # define AO_HAVE_store_write #endif #if defined(AO_HAVE_store_write) \ && !defined(AO_HAVE_store_release_write) # define AO_store_release_write(addr, val) \ AO_store_write(addr, val) # define AO_HAVE_store_release_write #endif #if defined(AO_HAVE_store_release) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_store_full) # define AO_store_full(addr, val) \ (AO_store_release(addr, val), \ AO_nop_full()) # define AO_HAVE_store_full #endif #if defined(AO_HAVE_compare_and_swap) && !defined(AO_HAVE_store) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_store(volatile AO_t *addr, AO_t new_val) { AO_t old_val; do { old_val = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap(addr, old_val, new_val))); } # define AO_HAVE_store #endif #if defined(AO_HAVE_compare_and_swap_release) \ && !defined(AO_HAVE_store_release) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_store_release(volatile AO_t *addr, AO_t new_val) { AO_t old_val; do { old_val = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_release(addr, old_val, new_val))); } # define AO_HAVE_store_release #endif #if defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_store_full) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_store_full(volatile AO_t *addr, AO_t new_val) { AO_t old_val; do { old_val = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old_val, new_val))); } # define AO_HAVE_store_full #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* double_fetch_compare_and_swap */ #if defined(AO_HAVE_double_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_fetch_compare_and_swap_acquire) AO_INLINE AO_double_t AO_double_fetch_compare_and_swap_acquire(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_double_t result = AO_double_fetch_compare_and_swap(addr, old_val, new_val); AO_nop_full(); return result; } # define AO_HAVE_double_fetch_compare_and_swap_acquire #endif #if defined(AO_HAVE_double_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_fetch_compare_and_swap_release) # define AO_double_fetch_compare_and_swap_release(addr, old_val, new_val) \ (AO_nop_full(), \ AO_double_fetch_compare_and_swap(addr, old_val, new_val)) # define AO_HAVE_double_fetch_compare_and_swap_release #endif #if defined(AO_HAVE_double_fetch_compare_and_swap_full) # if !defined(AO_HAVE_double_fetch_compare_and_swap_release) # define AO_double_fetch_compare_and_swap_release(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_release # endif # if !defined(AO_HAVE_double_fetch_compare_and_swap_acquire) # define AO_double_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_acquire # endif # if !defined(AO_HAVE_double_fetch_compare_and_swap_write) # define AO_double_fetch_compare_and_swap_write(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_write # endif # if !defined(AO_HAVE_double_fetch_compare_and_swap_read) # define AO_double_fetch_compare_and_swap_read(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_read # endif #endif /* AO_HAVE_double_fetch_compare_and_swap_full */ #if !defined(AO_HAVE_double_fetch_compare_and_swap) \ && defined(AO_HAVE_double_fetch_compare_and_swap_release) # define AO_double_fetch_compare_and_swap(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap #endif #if !defined(AO_HAVE_double_fetch_compare_and_swap) \ && defined(AO_HAVE_double_fetch_compare_and_swap_acquire) # define AO_double_fetch_compare_and_swap(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap #endif #if !defined(AO_HAVE_double_fetch_compare_and_swap) \ && defined(AO_HAVE_double_fetch_compare_and_swap_write) # define AO_double_fetch_compare_and_swap(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap #endif #if !defined(AO_HAVE_double_fetch_compare_and_swap) \ && defined(AO_HAVE_double_fetch_compare_and_swap_read) # define AO_double_fetch_compare_and_swap(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap #endif #if defined(AO_HAVE_double_fetch_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_fetch_compare_and_swap_full) # define AO_double_fetch_compare_and_swap_full(addr, old_val, new_val) \ (AO_nop_full(), \ AO_double_fetch_compare_and_swap_acquire(addr, old_val, new_val)) # define AO_HAVE_double_fetch_compare_and_swap_full #endif #if !defined(AO_HAVE_double_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_double_fetch_compare_and_swap_write) # define AO_double_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_double_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_double_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_double_fetch_compare_and_swap_release) # define AO_double_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_double_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_double_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_double_fetch_compare_and_swap_read) # define AO_double_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_double_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_double_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_double_fetch_compare_and_swap_acquire) # define AO_double_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_double_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_double_fetch_compare_and_swap_acquire_read) # define AO_double_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_double_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_double_fetch_compare_and_swap) # define AO_double_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_double_fetch_compare_and_swap(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* double_compare_and_swap */ #if defined(AO_HAVE_double_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_compare_and_swap_acquire) AO_INLINE int AO_double_compare_and_swap_acquire(volatile AO_double_t *addr, AO_double_t old, AO_double_t new_val) { int result = AO_double_compare_and_swap(addr, old, new_val); AO_nop_full(); return result; } # define AO_HAVE_double_compare_and_swap_acquire #endif #if defined(AO_HAVE_double_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_compare_and_swap_release) # define AO_double_compare_and_swap_release(addr, old, new_val) \ (AO_nop_full(), AO_double_compare_and_swap(addr, old, new_val)) # define AO_HAVE_double_compare_and_swap_release #endif #if defined(AO_HAVE_double_compare_and_swap_full) # if !defined(AO_HAVE_double_compare_and_swap_release) # define AO_double_compare_and_swap_release(addr, old, new_val) \ AO_double_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_release # endif # if !defined(AO_HAVE_double_compare_and_swap_acquire) # define AO_double_compare_and_swap_acquire(addr, old, new_val) \ AO_double_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_acquire # endif # if !defined(AO_HAVE_double_compare_and_swap_write) # define AO_double_compare_and_swap_write(addr, old, new_val) \ AO_double_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_write # endif # if !defined(AO_HAVE_double_compare_and_swap_read) # define AO_double_compare_and_swap_read(addr, old, new_val) \ AO_double_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_read # endif #endif /* AO_HAVE_double_compare_and_swap_full */ #if !defined(AO_HAVE_double_compare_and_swap) \ && defined(AO_HAVE_double_compare_and_swap_release) # define AO_double_compare_and_swap(addr, old, new_val) \ AO_double_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_double_compare_and_swap #endif #if !defined(AO_HAVE_double_compare_and_swap) \ && defined(AO_HAVE_double_compare_and_swap_acquire) # define AO_double_compare_and_swap(addr, old, new_val) \ AO_double_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_double_compare_and_swap #endif #if !defined(AO_HAVE_double_compare_and_swap) \ && defined(AO_HAVE_double_compare_and_swap_write) # define AO_double_compare_and_swap(addr, old, new_val) \ AO_double_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_double_compare_and_swap #endif #if !defined(AO_HAVE_double_compare_and_swap) \ && defined(AO_HAVE_double_compare_and_swap_read) # define AO_double_compare_and_swap(addr, old, new_val) \ AO_double_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_double_compare_and_swap #endif #if defined(AO_HAVE_double_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_compare_and_swap_full) # define AO_double_compare_and_swap_full(addr, old, new_val) \ (AO_nop_full(), \ AO_double_compare_and_swap_acquire(addr, old, new_val)) # define AO_HAVE_double_compare_and_swap_full #endif #if !defined(AO_HAVE_double_compare_and_swap_release_write) \ && defined(AO_HAVE_double_compare_and_swap_write) # define AO_double_compare_and_swap_release_write(addr, old, new_val) \ AO_double_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_release_write #endif #if !defined(AO_HAVE_double_compare_and_swap_release_write) \ && defined(AO_HAVE_double_compare_and_swap_release) # define AO_double_compare_and_swap_release_write(addr, old, new_val) \ AO_double_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_release_write #endif #if !defined(AO_HAVE_double_compare_and_swap_acquire_read) \ && defined(AO_HAVE_double_compare_and_swap_read) # define AO_double_compare_and_swap_acquire_read(addr, old, new_val) \ AO_double_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_double_compare_and_swap_acquire_read) \ && defined(AO_HAVE_double_compare_and_swap_acquire) # define AO_double_compare_and_swap_acquire_read(addr, old, new_val) \ AO_double_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_double_compare_and_swap_acquire_read) # define AO_double_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_double_compare_and_swap_acquire_read(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_double_compare_and_swap) # define AO_double_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_double_compare_and_swap(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* double_load */ #if defined(AO_HAVE_double_load_full) && !defined(AO_HAVE_double_load_acquire) # define AO_double_load_acquire(addr) AO_double_load_full(addr) # define AO_HAVE_double_load_acquire #endif #if defined(AO_HAVE_double_load_acquire) && !defined(AO_HAVE_double_load) # define AO_double_load(addr) AO_double_load_acquire(addr) # define AO_HAVE_double_load #endif #if defined(AO_HAVE_double_load_full) && !defined(AO_HAVE_double_load_read) # define AO_double_load_read(addr) AO_double_load_full(addr) # define AO_HAVE_double_load_read #endif #if !defined(AO_HAVE_double_load_acquire_read) \ && defined(AO_HAVE_double_load_acquire) # define AO_double_load_acquire_read(addr) AO_double_load_acquire(addr) # define AO_HAVE_double_load_acquire_read #endif #if defined(AO_HAVE_double_load) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_load_acquire) AO_INLINE AO_double_t AO_double_load_acquire(const volatile AO_double_t *addr) { AO_double_t result = AO_double_load(addr); /* Acquire barrier would be useless, since the load could be delayed */ /* beyond it. */ AO_nop_full(); return result; } # define AO_HAVE_double_load_acquire #endif #if defined(AO_HAVE_double_load) && defined(AO_HAVE_nop_read) \ && !defined(AO_HAVE_double_load_read) AO_INLINE AO_double_t AO_double_load_read(const volatile AO_double_t *addr) { AO_double_t result = AO_double_load(addr); AO_nop_read(); return result; } # define AO_HAVE_double_load_read #endif #if defined(AO_HAVE_double_load_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_load_full) # define AO_double_load_full(addr) (AO_nop_full(), AO_double_load_acquire(addr)) # define AO_HAVE_double_load_full #endif #if defined(AO_HAVE_double_compare_and_swap_read) \ && !defined(AO_HAVE_double_load_read) # define AO_double_CAS_BASED_LOAD_READ AO_ATTR_NO_SANITIZE_THREAD AO_INLINE AO_double_t AO_double_load_read(const volatile AO_double_t *addr) { AO_double_t result; do { result = *(const AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_read( (volatile AO_double_t *)addr, result, result))); return result; } # define AO_HAVE_double_load_read #endif #if !defined(AO_HAVE_double_load_acquire_read) \ && defined(AO_HAVE_double_load_read) # define AO_double_load_acquire_read(addr) AO_double_load_read(addr) # define AO_HAVE_double_load_acquire_read #endif #if defined(AO_HAVE_double_load_acquire_read) && !defined(AO_HAVE_double_load) \ && (!defined(AO_double_CAS_BASED_LOAD_READ) \ || !defined(AO_HAVE_double_compare_and_swap)) # define AO_double_load(addr) AO_double_load_acquire_read(addr) # define AO_HAVE_double_load #endif #if defined(AO_HAVE_double_compare_and_swap_full) \ && !defined(AO_HAVE_double_load_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE AO_double_t AO_double_load_full(const volatile AO_double_t *addr) { AO_double_t result; do { result = *(const AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_full( (volatile AO_double_t *)addr, result, result))); return result; } # define AO_HAVE_double_load_full #endif #if defined(AO_HAVE_double_compare_and_swap_acquire) \ && !defined(AO_HAVE_double_load_acquire) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE AO_double_t AO_double_load_acquire(const volatile AO_double_t *addr) { AO_double_t result; do { result = *(const AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_acquire( (volatile AO_double_t *)addr, result, result))); return result; } # define AO_HAVE_double_load_acquire #endif #if defined(AO_HAVE_double_compare_and_swap) && !defined(AO_HAVE_double_load) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE AO_double_t AO_double_load(const volatile AO_double_t *addr) { AO_double_t result; do { result = *(const AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap( (volatile AO_double_t *)addr, result, result))); return result; } # define AO_HAVE_double_load #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_double_load_acquire_read) # define AO_double_load_dd_acquire_read(addr) \ AO_double_load_acquire_read(addr) # define AO_HAVE_double_load_dd_acquire_read # endif #else # if defined(AO_HAVE_double_load) # define AO_double_load_dd_acquire_read(addr) AO_double_load(addr) # define AO_HAVE_double_load_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* double_store */ #if defined(AO_HAVE_double_store_full) && !defined(AO_HAVE_double_store_release) # define AO_double_store_release(addr, val) AO_double_store_full(addr, val) # define AO_HAVE_double_store_release #endif #if defined(AO_HAVE_double_store_release) && !defined(AO_HAVE_double_store) # define AO_double_store(addr, val) AO_double_store_release(addr, val) # define AO_HAVE_double_store #endif #if defined(AO_HAVE_double_store_full) && !defined(AO_HAVE_double_store_write) # define AO_double_store_write(addr, val) AO_double_store_full(addr, val) # define AO_HAVE_double_store_write #endif #if defined(AO_HAVE_double_store_release) \ && !defined(AO_HAVE_double_store_release_write) # define AO_double_store_release_write(addr, val) \ AO_double_store_release(addr, val) # define AO_HAVE_double_store_release_write #endif #if defined(AO_HAVE_double_store_write) && !defined(AO_HAVE_double_store) # define AO_double_store(addr, val) AO_double_store_write(addr, val) # define AO_HAVE_double_store #endif #if defined(AO_HAVE_double_store) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_store_release) # define AO_double_store_release(addr, val) \ (AO_nop_full(), AO_double_store(addr, val)) # define AO_HAVE_double_store_release #endif #if defined(AO_HAVE_double_store) && defined(AO_HAVE_nop_write) \ && !defined(AO_HAVE_double_store_write) # define AO_double_store_write(addr, val) \ (AO_nop_write(), AO_double_store(addr, val)) # define AO_HAVE_double_store_write #endif #if defined(AO_HAVE_double_compare_and_swap_write) \ && !defined(AO_HAVE_double_store_write) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_double_store_write(volatile AO_double_t *addr, AO_double_t new_val) { AO_double_t old_val; do { old_val = *(AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_write(addr, old_val, new_val))); } # define AO_HAVE_double_store_write #endif #if defined(AO_HAVE_double_store_write) \ && !defined(AO_HAVE_double_store_release_write) # define AO_double_store_release_write(addr, val) \ AO_double_store_write(addr, val) # define AO_HAVE_double_store_release_write #endif #if defined(AO_HAVE_double_store_release) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_store_full) # define AO_double_store_full(addr, val) \ (AO_double_store_release(addr, val), \ AO_nop_full()) # define AO_HAVE_double_store_full #endif #if defined(AO_HAVE_double_compare_and_swap) && !defined(AO_HAVE_double_store) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_double_store(volatile AO_double_t *addr, AO_double_t new_val) { AO_double_t old_val; do { old_val = *(AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap(addr, old_val, new_val))); } # define AO_HAVE_double_store #endif #if defined(AO_HAVE_double_compare_and_swap_release) \ && !defined(AO_HAVE_double_store_release) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_double_store_release(volatile AO_double_t *addr, AO_double_t new_val) { AO_double_t old_val; do { old_val = *(AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_release(addr, old_val, new_val))); } # define AO_HAVE_double_store_release #endif #if defined(AO_HAVE_double_compare_and_swap_full) \ && !defined(AO_HAVE_double_store_full) AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_double_store_full(volatile AO_double_t *addr, AO_double_t new_val) { AO_double_t old_val; do { old_val = *(AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_full(addr, old_val, new_val))); } # define AO_HAVE_double_store_full #endif asymptote-3.05/libatomic_ops/src/atomic_ops/ao_version.h0000644000000000000000000000355015031566105022256 0ustar rootroot/* * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P. * Copyright (c) 2011-2018 Ivan Maidanski * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef AO_ATOMIC_OPS_H # error This file should not be included directly. #endif /* The policy regarding version numbers: development code has odd */ /* "minor" number (and "micro" part is 0); when development is finished */ /* and a release is prepared, "minor" number is incremented (keeping */ /* "micro" number still zero), whenever a defect is fixed a new release */ /* is prepared incrementing "micro" part to odd value (the most stable */ /* release has the biggest "micro" number). */ /* The version here should match that in configure.ac and README. */ #define AO_VERSION_MAJOR 7 #define AO_VERSION_MINOR 8 #define AO_VERSION_MICRO 2 /* 7.8.2 */ asymptote-3.05/libatomic_ops/src/atomic_ops/generalize.h0000644000000000000000000007320615031566105022244 0ustar rootroot/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * Generalize atomic operations for atomic_ops.h. * Should not be included directly. * * We make no attempt to define useless operations, such as * AO_nop_acquire * AO_nop_release * * We have also so far neglected to define some others, which * do not appear likely to be useful, e.g. stores with acquire * or read barriers. * * This file is sometimes included twice by atomic_ops.h. * All definitions include explicit checks that we are not replacing * an earlier definition. In general, more desirable expansions * appear earlier so that we are more likely to use them. * * We only make safe generalizations, except that by default we define * the ...dd_acquire_read operations to be equivalent to those without * a barrier. On platforms for which this is unsafe, the platform-specific * file must define AO_NO_DD_ORDERING. */ #ifndef AO_ATOMIC_OPS_H # error This file should not be included directly. #endif /* Generate test_and_set_full, if necessary and possible. */ #if !defined(AO_HAVE_test_and_set) && !defined(AO_HAVE_test_and_set_release) \ && !defined(AO_HAVE_test_and_set_acquire) \ && !defined(AO_HAVE_test_and_set_read) \ && !defined(AO_HAVE_test_and_set_full) /* Emulate AO_compare_and_swap() via AO_fetch_compare_and_swap(). */ # if defined(AO_HAVE_fetch_compare_and_swap) \ && !defined(AO_HAVE_compare_and_swap) AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap # endif # if defined(AO_HAVE_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_compare_and_swap_full) AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_full(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_full # endif # if defined(AO_HAVE_fetch_compare_and_swap_acquire) \ && !defined(AO_HAVE_compare_and_swap_acquire) AO_INLINE int AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_acquire(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_acquire # endif # if defined(AO_HAVE_fetch_compare_and_swap_release) \ && !defined(AO_HAVE_compare_and_swap_release) AO_INLINE int AO_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_release(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_release # endif # if defined(AO_CHAR_TS_T) # define AO_TS_COMPARE_AND_SWAP_FULL(a,o,n) \ AO_char_compare_and_swap_full(a,o,n) # define AO_TS_COMPARE_AND_SWAP_ACQUIRE(a,o,n) \ AO_char_compare_and_swap_acquire(a,o,n) # define AO_TS_COMPARE_AND_SWAP_RELEASE(a,o,n) \ AO_char_compare_and_swap_release(a,o,n) # define AO_TS_COMPARE_AND_SWAP(a,o,n) AO_char_compare_and_swap(a,o,n) # endif # if defined(AO_AO_TS_T) # define AO_TS_COMPARE_AND_SWAP_FULL(a,o,n) AO_compare_and_swap_full(a,o,n) # define AO_TS_COMPARE_AND_SWAP_ACQUIRE(a,o,n) \ AO_compare_and_swap_acquire(a,o,n) # define AO_TS_COMPARE_AND_SWAP_RELEASE(a,o,n) \ AO_compare_and_swap_release(a,o,n) # define AO_TS_COMPARE_AND_SWAP(a,o,n) AO_compare_and_swap(a,o,n) # endif # if (defined(AO_AO_TS_T) && defined(AO_HAVE_compare_and_swap_full)) \ || (defined(AO_CHAR_TS_T) && defined(AO_HAVE_char_compare_and_swap_full)) AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { if (AO_TS_COMPARE_AND_SWAP_FULL(addr, AO_TS_CLEAR, AO_TS_SET)) return AO_TS_CLEAR; else return AO_TS_SET; } # define AO_HAVE_test_and_set_full # endif /* AO_HAVE_compare_and_swap_full */ # if (defined(AO_AO_TS_T) && defined(AO_HAVE_compare_and_swap_acquire)) \ || (defined(AO_CHAR_TS_T) \ && defined(AO_HAVE_char_compare_and_swap_acquire)) AO_INLINE AO_TS_VAL_t AO_test_and_set_acquire(volatile AO_TS_t *addr) { if (AO_TS_COMPARE_AND_SWAP_ACQUIRE(addr, AO_TS_CLEAR, AO_TS_SET)) return AO_TS_CLEAR; else return AO_TS_SET; } # define AO_HAVE_test_and_set_acquire # endif /* AO_HAVE_compare_and_swap_acquire */ # if (defined(AO_AO_TS_T) && defined(AO_HAVE_compare_and_swap_release)) \ || (defined(AO_CHAR_TS_T) \ && defined(AO_HAVE_char_compare_and_swap_release)) AO_INLINE AO_TS_VAL_t AO_test_and_set_release(volatile AO_TS_t *addr) { if (AO_TS_COMPARE_AND_SWAP_RELEASE(addr, AO_TS_CLEAR, AO_TS_SET)) return AO_TS_CLEAR; else return AO_TS_SET; } # define AO_HAVE_test_and_set_release # endif /* AO_HAVE_compare_and_swap_release */ # if (defined(AO_AO_TS_T) && defined(AO_HAVE_compare_and_swap)) \ || (defined(AO_CHAR_TS_T) && defined(AO_HAVE_char_compare_and_swap)) AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { if (AO_TS_COMPARE_AND_SWAP(addr, AO_TS_CLEAR, AO_TS_SET)) return AO_TS_CLEAR; else return AO_TS_SET; } # define AO_HAVE_test_and_set # endif /* AO_HAVE_compare_and_swap */ #endif /* No prior test and set */ /* Nop */ #if !defined(AO_HAVE_nop) AO_INLINE void AO_nop(void) {} # define AO_HAVE_nop #endif #if defined(AO_HAVE_test_and_set_full) && !defined(AO_HAVE_nop_full) AO_INLINE void AO_nop_full(void) { AO_TS_t dummy = AO_TS_INITIALIZER; AO_test_and_set_full(&dummy); } # define AO_HAVE_nop_full #endif #if defined(AO_HAVE_nop_acquire) && !defined(CPPCHECK) # error AO_nop_acquire is useless: do not define. #endif #if defined(AO_HAVE_nop_release) && !defined(CPPCHECK) # error AO_nop_release is useless: do not define. #endif #if defined(AO_HAVE_nop_full) && !defined(AO_HAVE_nop_read) # define AO_nop_read() AO_nop_full() # define AO_HAVE_nop_read #endif #if defined(AO_HAVE_nop_full) && !defined(AO_HAVE_nop_write) # define AO_nop_write() AO_nop_full() # define AO_HAVE_nop_write #endif /* Test_and_set */ #if defined(AO_HAVE_test_and_set) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_test_and_set_release) # define AO_test_and_set_release(addr) (AO_nop_full(), AO_test_and_set(addr)) # define AO_HAVE_test_and_set_release #endif #if defined(AO_HAVE_test_and_set) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_test_and_set_acquire) AO_INLINE AO_TS_VAL_t AO_test_and_set_acquire(volatile AO_TS_t *addr) { AO_TS_VAL_t result = AO_test_and_set(addr); AO_nop_full(); return result; } # define AO_HAVE_test_and_set_acquire #endif #if defined(AO_HAVE_test_and_set_full) # if !defined(AO_HAVE_test_and_set_release) # define AO_test_and_set_release(addr) AO_test_and_set_full(addr) # define AO_HAVE_test_and_set_release # endif # if !defined(AO_HAVE_test_and_set_acquire) # define AO_test_and_set_acquire(addr) AO_test_and_set_full(addr) # define AO_HAVE_test_and_set_acquire # endif # if !defined(AO_HAVE_test_and_set_write) # define AO_test_and_set_write(addr) AO_test_and_set_full(addr) # define AO_HAVE_test_and_set_write # endif # if !defined(AO_HAVE_test_and_set_read) # define AO_test_and_set_read(addr) AO_test_and_set_full(addr) # define AO_HAVE_test_and_set_read # endif #endif /* AO_HAVE_test_and_set_full */ #if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_release) # define AO_test_and_set(addr) AO_test_and_set_release(addr) # define AO_HAVE_test_and_set #endif #if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_acquire) # define AO_test_and_set(addr) AO_test_and_set_acquire(addr) # define AO_HAVE_test_and_set #endif #if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_write) # define AO_test_and_set(addr) AO_test_and_set_write(addr) # define AO_HAVE_test_and_set #endif #if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_read) # define AO_test_and_set(addr) AO_test_and_set_read(addr) # define AO_HAVE_test_and_set #endif #if defined(AO_HAVE_test_and_set_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_test_and_set_full) # define AO_test_and_set_full(addr) \ (AO_nop_full(), AO_test_and_set_acquire(addr)) # define AO_HAVE_test_and_set_full #endif #if !defined(AO_HAVE_test_and_set_release_write) \ && defined(AO_HAVE_test_and_set_write) # define AO_test_and_set_release_write(addr) AO_test_and_set_write(addr) # define AO_HAVE_test_and_set_release_write #endif #if !defined(AO_HAVE_test_and_set_release_write) \ && defined(AO_HAVE_test_and_set_release) # define AO_test_and_set_release_write(addr) AO_test_and_set_release(addr) # define AO_HAVE_test_and_set_release_write #endif #if !defined(AO_HAVE_test_and_set_acquire_read) \ && defined(AO_HAVE_test_and_set_read) # define AO_test_and_set_acquire_read(addr) AO_test_and_set_read(addr) # define AO_HAVE_test_and_set_acquire_read #endif #if !defined(AO_HAVE_test_and_set_acquire_read) \ && defined(AO_HAVE_test_and_set_acquire) # define AO_test_and_set_acquire_read(addr) AO_test_and_set_acquire(addr) # define AO_HAVE_test_and_set_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_test_and_set_acquire_read) # define AO_test_and_set_dd_acquire_read(addr) \ AO_test_and_set_acquire_read(addr) # define AO_HAVE_test_and_set_dd_acquire_read # endif #else # if defined(AO_HAVE_test_and_set) # define AO_test_and_set_dd_acquire_read(addr) AO_test_and_set(addr) # define AO_HAVE_test_and_set_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ #include "generalize-small.h" #include "generalize-arithm.h" /* Compare_double_and_swap_double based on double_compare_and_swap. */ #ifdef AO_HAVE_DOUBLE_PTR_STORAGE # if defined(AO_HAVE_double_compare_and_swap) \ && !defined(AO_HAVE_compare_double_and_swap_double) AO_INLINE int AO_compare_double_and_swap_double(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { AO_double_t old_w; AO_double_t new_w; old_w.AO_val1 = old_val1; old_w.AO_val2 = old_val2; new_w.AO_val1 = new_val1; new_w.AO_val2 = new_val2; return AO_double_compare_and_swap(addr, old_w, new_w); } # define AO_HAVE_compare_double_and_swap_double # endif # if defined(AO_HAVE_double_compare_and_swap_acquire) \ && !defined(AO_HAVE_compare_double_and_swap_double_acquire) AO_INLINE int AO_compare_double_and_swap_double_acquire(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { AO_double_t old_w; AO_double_t new_w; old_w.AO_val1 = old_val1; old_w.AO_val2 = old_val2; new_w.AO_val1 = new_val1; new_w.AO_val2 = new_val2; return AO_double_compare_and_swap_acquire(addr, old_w, new_w); } # define AO_HAVE_compare_double_and_swap_double_acquire # endif # if defined(AO_HAVE_double_compare_and_swap_release) \ && !defined(AO_HAVE_compare_double_and_swap_double_release) AO_INLINE int AO_compare_double_and_swap_double_release(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { AO_double_t old_w; AO_double_t new_w; old_w.AO_val1 = old_val1; old_w.AO_val2 = old_val2; new_w.AO_val1 = new_val1; new_w.AO_val2 = new_val2; return AO_double_compare_and_swap_release(addr, old_w, new_w); } # define AO_HAVE_compare_double_and_swap_double_release # endif # if defined(AO_HAVE_double_compare_and_swap_full) \ && !defined(AO_HAVE_compare_double_and_swap_double_full) AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { AO_double_t old_w; AO_double_t new_w; old_w.AO_val1 = old_val1; old_w.AO_val2 = old_val2; new_w.AO_val1 = new_val1; new_w.AO_val2 = new_val2; return AO_double_compare_and_swap_full(addr, old_w, new_w); } # define AO_HAVE_compare_double_and_swap_double_full # endif #endif /* AO_HAVE_DOUBLE_PTR_STORAGE */ /* Compare_double_and_swap_double */ #if defined(AO_HAVE_compare_double_and_swap_double) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_double_and_swap_double_acquire) AO_INLINE int AO_compare_double_and_swap_double_acquire(volatile AO_double_t *addr, AO_t o1, AO_t o2, AO_t n1, AO_t n2) { int result = AO_compare_double_and_swap_double(addr, o1, o2, n1, n2); AO_nop_full(); return result; } # define AO_HAVE_compare_double_and_swap_double_acquire #endif #if defined(AO_HAVE_compare_double_and_swap_double) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_double_and_swap_double_release) # define AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2) \ (AO_nop_full(), AO_compare_double_and_swap_double(addr,o1,o2,n1,n2)) # define AO_HAVE_compare_double_and_swap_double_release #endif #if defined(AO_HAVE_compare_double_and_swap_double_full) # if !defined(AO_HAVE_compare_double_and_swap_double_release) # define AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_release # endif # if !defined(AO_HAVE_compare_double_and_swap_double_acquire) # define AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_acquire # endif # if !defined(AO_HAVE_compare_double_and_swap_double_write) # define AO_compare_double_and_swap_double_write(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_write # endif # if !defined(AO_HAVE_compare_double_and_swap_double_read) # define AO_compare_double_and_swap_double_read(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_read # endif #endif /* AO_HAVE_compare_double_and_swap_double_full */ #if !defined(AO_HAVE_compare_double_and_swap_double) \ && defined(AO_HAVE_compare_double_and_swap_double_release) # define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double #endif #if !defined(AO_HAVE_compare_double_and_swap_double) \ && defined(AO_HAVE_compare_double_and_swap_double_acquire) # define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double #endif #if !defined(AO_HAVE_compare_double_and_swap_double) \ && defined(AO_HAVE_compare_double_and_swap_double_write) # define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_write(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double #endif #if !defined(AO_HAVE_compare_double_and_swap_double) \ && defined(AO_HAVE_compare_double_and_swap_double_read) # define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_read(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double #endif #if defined(AO_HAVE_compare_double_and_swap_double_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_double_and_swap_double_full) # define AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2) \ (AO_nop_full(), \ AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2)) # define AO_HAVE_compare_double_and_swap_double_full #endif #if !defined(AO_HAVE_compare_double_and_swap_double_release_write) \ && defined(AO_HAVE_compare_double_and_swap_double_write) # define AO_compare_double_and_swap_double_release_write(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_write(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_release_write #endif #if !defined(AO_HAVE_compare_double_and_swap_double_release_write) \ && defined(AO_HAVE_compare_double_and_swap_double_release) # define AO_compare_double_and_swap_double_release_write(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_release_write #endif #if !defined(AO_HAVE_compare_double_and_swap_double_acquire_read) \ && defined(AO_HAVE_compare_double_and_swap_double_read) # define AO_compare_double_and_swap_double_acquire_read(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_read(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_acquire_read #endif #if !defined(AO_HAVE_compare_double_and_swap_double_acquire_read) \ && defined(AO_HAVE_compare_double_and_swap_double_acquire) # define AO_compare_double_and_swap_double_acquire_read(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_compare_double_and_swap_double_acquire_read) # define AO_compare_double_and_swap_double_dd_acquire_read(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_acquire_read(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_dd_acquire_read # endif #else # if defined(AO_HAVE_compare_double_and_swap_double) # define AO_compare_double_and_swap_double_dd_acquire_read(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* Compare_and_swap_double */ #if defined(AO_HAVE_compare_and_swap_double) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_and_swap_double_acquire) AO_INLINE int AO_compare_and_swap_double_acquire(volatile AO_double_t *addr, AO_t o1, AO_t n1, AO_t n2) { int result = AO_compare_and_swap_double(addr, o1, n1, n2); AO_nop_full(); return result; } # define AO_HAVE_compare_and_swap_double_acquire #endif #if defined(AO_HAVE_compare_and_swap_double) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_and_swap_double_release) # define AO_compare_and_swap_double_release(addr,o1,n1,n2) \ (AO_nop_full(), AO_compare_and_swap_double(addr,o1,n1,n2)) # define AO_HAVE_compare_and_swap_double_release #endif #if defined(AO_HAVE_compare_and_swap_double_full) # if !defined(AO_HAVE_compare_and_swap_double_release) # define AO_compare_and_swap_double_release(addr,o1,n1,n2) \ AO_compare_and_swap_double_full(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_release # endif # if !defined(AO_HAVE_compare_and_swap_double_acquire) # define AO_compare_and_swap_double_acquire(addr,o1,n1,n2) \ AO_compare_and_swap_double_full(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_acquire # endif # if !defined(AO_HAVE_compare_and_swap_double_write) # define AO_compare_and_swap_double_write(addr,o1,n1,n2) \ AO_compare_and_swap_double_full(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_write # endif # if !defined(AO_HAVE_compare_and_swap_double_read) # define AO_compare_and_swap_double_read(addr,o1,n1,n2) \ AO_compare_and_swap_double_full(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_read # endif #endif /* AO_HAVE_compare_and_swap_double_full */ #if !defined(AO_HAVE_compare_and_swap_double) \ && defined(AO_HAVE_compare_and_swap_double_release) # define AO_compare_and_swap_double(addr,o1,n1,n2) \ AO_compare_and_swap_double_release(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double #endif #if !defined(AO_HAVE_compare_and_swap_double) \ && defined(AO_HAVE_compare_and_swap_double_acquire) # define AO_compare_and_swap_double(addr,o1,n1,n2) \ AO_compare_and_swap_double_acquire(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double #endif #if !defined(AO_HAVE_compare_and_swap_double) \ && defined(AO_HAVE_compare_and_swap_double_write) # define AO_compare_and_swap_double(addr,o1,n1,n2) \ AO_compare_and_swap_double_write(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double #endif #if !defined(AO_HAVE_compare_and_swap_double) \ && defined(AO_HAVE_compare_and_swap_double_read) # define AO_compare_and_swap_double(addr,o1,n1,n2) \ AO_compare_and_swap_double_read(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double #endif #if defined(AO_HAVE_compare_and_swap_double_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_and_swap_double_full) # define AO_compare_and_swap_double_full(addr,o1,n1,n2) \ (AO_nop_full(), AO_compare_and_swap_double_acquire(addr,o1,n1,n2)) # define AO_HAVE_compare_and_swap_double_full #endif #if !defined(AO_HAVE_compare_and_swap_double_release_write) \ && defined(AO_HAVE_compare_and_swap_double_write) # define AO_compare_and_swap_double_release_write(addr,o1,n1,n2) \ AO_compare_and_swap_double_write(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_release_write #endif #if !defined(AO_HAVE_compare_and_swap_double_release_write) \ && defined(AO_HAVE_compare_and_swap_double_release) # define AO_compare_and_swap_double_release_write(addr,o1,n1,n2) \ AO_compare_and_swap_double_release(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_release_write #endif #if !defined(AO_HAVE_compare_and_swap_double_acquire_read) \ && defined(AO_HAVE_compare_and_swap_double_read) # define AO_compare_and_swap_double_acquire_read(addr,o1,n1,n2) \ AO_compare_and_swap_double_read(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_acquire_read #endif #if !defined(AO_HAVE_compare_and_swap_double_acquire_read) \ && defined(AO_HAVE_compare_and_swap_double_acquire) # define AO_compare_and_swap_double_acquire_read(addr,o1,n1,n2) \ AO_compare_and_swap_double_acquire(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_compare_and_swap_double_acquire_read) # define AO_compare_and_swap_double_dd_acquire_read(addr,o1,n1,n2) \ AO_compare_and_swap_double_acquire_read(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_dd_acquire_read # endif #else # if defined(AO_HAVE_compare_and_swap_double) # define AO_compare_and_swap_double_dd_acquire_read(addr,o1,n1,n2) \ AO_compare_and_swap_double(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_dd_acquire_read # endif #endif /* Convenience functions for AO_double compare-and-swap which types and */ /* reads easier in code. */ #if defined(AO_HAVE_compare_double_and_swap_double) \ && !defined(AO_HAVE_double_compare_and_swap) AO_INLINE int AO_double_compare_and_swap(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap #endif #if defined(AO_HAVE_compare_double_and_swap_double_release) \ && !defined(AO_HAVE_double_compare_and_swap_release) AO_INLINE int AO_double_compare_and_swap_release(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double_release(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap_release #endif #if defined(AO_HAVE_compare_double_and_swap_double_acquire) \ && !defined(AO_HAVE_double_compare_and_swap_acquire) AO_INLINE int AO_double_compare_and_swap_acquire(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double_acquire(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap_acquire #endif #if defined(AO_HAVE_compare_double_and_swap_double_read) \ && !defined(AO_HAVE_double_compare_and_swap_read) AO_INLINE int AO_double_compare_and_swap_read(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double_read(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap_read #endif #if defined(AO_HAVE_compare_double_and_swap_double_write) \ && !defined(AO_HAVE_double_compare_and_swap_write) AO_INLINE int AO_double_compare_and_swap_write(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double_write(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap_write #endif #if defined(AO_HAVE_compare_double_and_swap_double_release_write) \ && !defined(AO_HAVE_double_compare_and_swap_release_write) AO_INLINE int AO_double_compare_and_swap_release_write(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double_release_write(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap_release_write #endif #if defined(AO_HAVE_compare_double_and_swap_double_acquire_read) \ && !defined(AO_HAVE_double_compare_and_swap_acquire_read) AO_INLINE int AO_double_compare_and_swap_acquire_read(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double_acquire_read(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap_acquire_read #endif #if defined(AO_HAVE_compare_double_and_swap_double_full) \ && !defined(AO_HAVE_double_compare_and_swap_full) AO_INLINE int AO_double_compare_and_swap_full(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double_full(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap_full #endif #ifndef AO_HAVE_double_compare_and_swap_dd_acquire_read /* Duplicated from generalize-small because double CAS might be */ /* defined after the include. */ # ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_double_compare_and_swap_acquire_read) # define AO_double_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_double_compare_and_swap_acquire_read(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_dd_acquire_read # endif # elif defined(AO_HAVE_double_compare_and_swap) # define AO_double_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_double_compare_and_swap(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_dd_acquire_read # endif /* !AO_NO_DD_ORDERING */ #endif asymptote-3.05/libatomic_ops/src/atomic_ops/generalize-arithm.h0000644000000000000000000037324715031566105023536 0ustar rootroot/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* char_compare_and_swap (based on fetch_compare_and_swap) */ #if defined(AO_HAVE_char_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_char_compare_and_swap_full) AO_INLINE int AO_char_compare_and_swap_full(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_full #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_acquire) \ && !defined(AO_HAVE_char_compare_and_swap_acquire) AO_INLINE int AO_char_compare_and_swap_acquire(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_acquire #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_release) \ && !defined(AO_HAVE_char_compare_and_swap_release) AO_INLINE int AO_char_compare_and_swap_release(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_release #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_write) \ && !defined(AO_HAVE_char_compare_and_swap_write) AO_INLINE int AO_char_compare_and_swap_write(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_write #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_read) \ && !defined(AO_HAVE_char_compare_and_swap_read) AO_INLINE int AO_char_compare_and_swap_read(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_read #endif #if defined(AO_HAVE_char_fetch_compare_and_swap) \ && !defined(AO_HAVE_char_compare_and_swap) AO_INLINE int AO_char_compare_and_swap(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_release_write) \ && !defined(AO_HAVE_char_compare_and_swap_release_write) AO_INLINE int AO_char_compare_and_swap_release_write(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_release_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_release_write #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) \ && !defined(AO_HAVE_char_compare_and_swap_acquire_read) AO_INLINE int AO_char_compare_and_swap_acquire_read(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_acquire_read #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_dd_acquire_read) \ && !defined(AO_HAVE_char_compare_and_swap_dd_acquire_read) AO_INLINE int AO_char_compare_and_swap_dd_acquire_read(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_dd_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_dd_acquire_read #endif /* char_fetch_and_add */ /* We first try to implement fetch_and_add variants in terms of the */ /* corresponding compare_and_swap variants to minimize adding barriers. */ #if defined(AO_HAVE_char_compare_and_swap_full) \ && !defined(AO_HAVE_char_fetch_and_add_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/char AO_char_fetch_and_add_full(volatile unsigned/**/char *addr, unsigned/**/char incr) { unsigned/**/char old; do { old = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old, old + incr))); return old; } # define AO_HAVE_char_fetch_and_add_full #endif #if defined(AO_HAVE_char_compare_and_swap_acquire) \ && !defined(AO_HAVE_char_fetch_and_add_acquire) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/char AO_char_fetch_and_add_acquire(volatile unsigned/**/char *addr, unsigned/**/char incr) { unsigned/**/char old; do { old = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_acquire(addr, old, old + incr))); return old; } # define AO_HAVE_char_fetch_and_add_acquire #endif #if defined(AO_HAVE_char_compare_and_swap_release) \ && !defined(AO_HAVE_char_fetch_and_add_release) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/char AO_char_fetch_and_add_release(volatile unsigned/**/char *addr, unsigned/**/char incr) { unsigned/**/char old; do { old = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_release(addr, old, old + incr))); return old; } # define AO_HAVE_char_fetch_and_add_release #endif #if defined(AO_HAVE_char_compare_and_swap) \ && !defined(AO_HAVE_char_fetch_and_add) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/char AO_char_fetch_and_add(volatile unsigned/**/char *addr, unsigned/**/char incr) { unsigned/**/char old; do { old = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap(addr, old, old + incr))); return old; } # define AO_HAVE_char_fetch_and_add #endif #if defined(AO_HAVE_char_fetch_and_add_full) # if !defined(AO_HAVE_char_fetch_and_add_release) # define AO_char_fetch_and_add_release(addr, val) \ AO_char_fetch_and_add_full(addr, val) # define AO_HAVE_char_fetch_and_add_release # endif # if !defined(AO_HAVE_char_fetch_and_add_acquire) # define AO_char_fetch_and_add_acquire(addr, val) \ AO_char_fetch_and_add_full(addr, val) # define AO_HAVE_char_fetch_and_add_acquire # endif # if !defined(AO_HAVE_char_fetch_and_add_write) # define AO_char_fetch_and_add_write(addr, val) \ AO_char_fetch_and_add_full(addr, val) # define AO_HAVE_char_fetch_and_add_write # endif # if !defined(AO_HAVE_char_fetch_and_add_read) # define AO_char_fetch_and_add_read(addr, val) \ AO_char_fetch_and_add_full(addr, val) # define AO_HAVE_char_fetch_and_add_read # endif #endif /* AO_HAVE_char_fetch_and_add_full */ #if defined(AO_HAVE_char_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_fetch_and_add_acquire) AO_INLINE unsigned/**/char AO_char_fetch_and_add_acquire(volatile unsigned/**/char *addr, unsigned/**/char incr) { unsigned/**/char result = AO_char_fetch_and_add(addr, incr); AO_nop_full(); return result; } # define AO_HAVE_char_fetch_and_add_acquire #endif #if defined(AO_HAVE_char_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_fetch_and_add_release) # define AO_char_fetch_and_add_release(addr, incr) \ (AO_nop_full(), AO_char_fetch_and_add(addr, incr)) # define AO_HAVE_char_fetch_and_add_release #endif #if !defined(AO_HAVE_char_fetch_and_add) \ && defined(AO_HAVE_char_fetch_and_add_release) # define AO_char_fetch_and_add(addr, val) \ AO_char_fetch_and_add_release(addr, val) # define AO_HAVE_char_fetch_and_add #endif #if !defined(AO_HAVE_char_fetch_and_add) \ && defined(AO_HAVE_char_fetch_and_add_acquire) # define AO_char_fetch_and_add(addr, val) \ AO_char_fetch_and_add_acquire(addr, val) # define AO_HAVE_char_fetch_and_add #endif #if !defined(AO_HAVE_char_fetch_and_add) \ && defined(AO_HAVE_char_fetch_and_add_write) # define AO_char_fetch_and_add(addr, val) \ AO_char_fetch_and_add_write(addr, val) # define AO_HAVE_char_fetch_and_add #endif #if !defined(AO_HAVE_char_fetch_and_add) \ && defined(AO_HAVE_char_fetch_and_add_read) # define AO_char_fetch_and_add(addr, val) \ AO_char_fetch_and_add_read(addr, val) # define AO_HAVE_char_fetch_and_add #endif #if defined(AO_HAVE_char_fetch_and_add_acquire) \ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_char_fetch_and_add_full) # define AO_char_fetch_and_add_full(addr, val) \ (AO_nop_full(), AO_char_fetch_and_add_acquire(addr, val)) # define AO_HAVE_char_fetch_and_add_full #endif #if !defined(AO_HAVE_char_fetch_and_add_release_write) \ && defined(AO_HAVE_char_fetch_and_add_write) # define AO_char_fetch_and_add_release_write(addr, val) \ AO_char_fetch_and_add_write(addr, val) # define AO_HAVE_char_fetch_and_add_release_write #endif #if !defined(AO_HAVE_char_fetch_and_add_release_write) \ && defined(AO_HAVE_char_fetch_and_add_release) # define AO_char_fetch_and_add_release_write(addr, val) \ AO_char_fetch_and_add_release(addr, val) # define AO_HAVE_char_fetch_and_add_release_write #endif #if !defined(AO_HAVE_char_fetch_and_add_acquire_read) \ && defined(AO_HAVE_char_fetch_and_add_read) # define AO_char_fetch_and_add_acquire_read(addr, val) \ AO_char_fetch_and_add_read(addr, val) # define AO_HAVE_char_fetch_and_add_acquire_read #endif #if !defined(AO_HAVE_char_fetch_and_add_acquire_read) \ && defined(AO_HAVE_char_fetch_and_add_acquire) # define AO_char_fetch_and_add_acquire_read(addr, val) \ AO_char_fetch_and_add_acquire(addr, val) # define AO_HAVE_char_fetch_and_add_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_char_fetch_and_add_acquire_read) # define AO_char_fetch_and_add_dd_acquire_read(addr, val) \ AO_char_fetch_and_add_acquire_read(addr, val) # define AO_HAVE_char_fetch_and_add_dd_acquire_read # endif #else # if defined(AO_HAVE_char_fetch_and_add) # define AO_char_fetch_and_add_dd_acquire_read(addr, val) \ AO_char_fetch_and_add(addr, val) # define AO_HAVE_char_fetch_and_add_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* char_fetch_and_add1 */ #if defined(AO_HAVE_char_fetch_and_add_full) \ && !defined(AO_HAVE_char_fetch_and_add1_full) # define AO_char_fetch_and_add1_full(addr) \ AO_char_fetch_and_add_full(addr, 1) # define AO_HAVE_char_fetch_and_add1_full #endif #if defined(AO_HAVE_char_fetch_and_add_release) \ && !defined(AO_HAVE_char_fetch_and_add1_release) # define AO_char_fetch_and_add1_release(addr) \ AO_char_fetch_and_add_release(addr, 1) # define AO_HAVE_char_fetch_and_add1_release #endif #if defined(AO_HAVE_char_fetch_and_add_acquire) \ && !defined(AO_HAVE_char_fetch_and_add1_acquire) # define AO_char_fetch_and_add1_acquire(addr) \ AO_char_fetch_and_add_acquire(addr, 1) # define AO_HAVE_char_fetch_and_add1_acquire #endif #if defined(AO_HAVE_char_fetch_and_add_write) \ && !defined(AO_HAVE_char_fetch_and_add1_write) # define AO_char_fetch_and_add1_write(addr) \ AO_char_fetch_and_add_write(addr, 1) # define AO_HAVE_char_fetch_and_add1_write #endif #if defined(AO_HAVE_char_fetch_and_add_read) \ && !defined(AO_HAVE_char_fetch_and_add1_read) # define AO_char_fetch_and_add1_read(addr) \ AO_char_fetch_and_add_read(addr, 1) # define AO_HAVE_char_fetch_and_add1_read #endif #if defined(AO_HAVE_char_fetch_and_add_release_write) \ && !defined(AO_HAVE_char_fetch_and_add1_release_write) # define AO_char_fetch_and_add1_release_write(addr) \ AO_char_fetch_and_add_release_write(addr, 1) # define AO_HAVE_char_fetch_and_add1_release_write #endif #if defined(AO_HAVE_char_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_char_fetch_and_add1_acquire_read) # define AO_char_fetch_and_add1_acquire_read(addr) \ AO_char_fetch_and_add_acquire_read(addr, 1) # define AO_HAVE_char_fetch_and_add1_acquire_read #endif #if defined(AO_HAVE_char_fetch_and_add) \ && !defined(AO_HAVE_char_fetch_and_add1) # define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add(addr, 1) # define AO_HAVE_char_fetch_and_add1 #endif #if defined(AO_HAVE_char_fetch_and_add1_full) # if !defined(AO_HAVE_char_fetch_and_add1_release) # define AO_char_fetch_and_add1_release(addr) \ AO_char_fetch_and_add1_full(addr) # define AO_HAVE_char_fetch_and_add1_release # endif # if !defined(AO_HAVE_char_fetch_and_add1_acquire) # define AO_char_fetch_and_add1_acquire(addr) \ AO_char_fetch_and_add1_full(addr) # define AO_HAVE_char_fetch_and_add1_acquire # endif # if !defined(AO_HAVE_char_fetch_and_add1_write) # define AO_char_fetch_and_add1_write(addr) \ AO_char_fetch_and_add1_full(addr) # define AO_HAVE_char_fetch_and_add1_write # endif # if !defined(AO_HAVE_char_fetch_and_add1_read) # define AO_char_fetch_and_add1_read(addr) \ AO_char_fetch_and_add1_full(addr) # define AO_HAVE_char_fetch_and_add1_read # endif #endif /* AO_HAVE_char_fetch_and_add1_full */ #if !defined(AO_HAVE_char_fetch_and_add1) \ && defined(AO_HAVE_char_fetch_and_add1_release) # define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add1_release(addr) # define AO_HAVE_char_fetch_and_add1 #endif #if !defined(AO_HAVE_char_fetch_and_add1) \ && defined(AO_HAVE_char_fetch_and_add1_acquire) # define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add1_acquire(addr) # define AO_HAVE_char_fetch_and_add1 #endif #if !defined(AO_HAVE_char_fetch_and_add1) \ && defined(AO_HAVE_char_fetch_and_add1_write) # define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add1_write(addr) # define AO_HAVE_char_fetch_and_add1 #endif #if !defined(AO_HAVE_char_fetch_and_add1) \ && defined(AO_HAVE_char_fetch_and_add1_read) # define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add1_read(addr) # define AO_HAVE_char_fetch_and_add1 #endif #if defined(AO_HAVE_char_fetch_and_add1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_fetch_and_add1_full) # define AO_char_fetch_and_add1_full(addr) \ (AO_nop_full(), AO_char_fetch_and_add1_acquire(addr)) # define AO_HAVE_char_fetch_and_add1_full #endif #if !defined(AO_HAVE_char_fetch_and_add1_release_write) \ && defined(AO_HAVE_char_fetch_and_add1_write) # define AO_char_fetch_and_add1_release_write(addr) \ AO_char_fetch_and_add1_write(addr) # define AO_HAVE_char_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_char_fetch_and_add1_release_write) \ && defined(AO_HAVE_char_fetch_and_add1_release) # define AO_char_fetch_and_add1_release_write(addr) \ AO_char_fetch_and_add1_release(addr) # define AO_HAVE_char_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_char_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_char_fetch_and_add1_read) # define AO_char_fetch_and_add1_acquire_read(addr) \ AO_char_fetch_and_add1_read(addr) # define AO_HAVE_char_fetch_and_add1_acquire_read #endif #if !defined(AO_HAVE_char_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_char_fetch_and_add1_acquire) # define AO_char_fetch_and_add1_acquire_read(addr) \ AO_char_fetch_and_add1_acquire(addr) # define AO_HAVE_char_fetch_and_add1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_char_fetch_and_add1_acquire_read) # define AO_char_fetch_and_add1_dd_acquire_read(addr) \ AO_char_fetch_and_add1_acquire_read(addr) # define AO_HAVE_char_fetch_and_add1_dd_acquire_read # endif #else # if defined(AO_HAVE_char_fetch_and_add1) # define AO_char_fetch_and_add1_dd_acquire_read(addr) \ AO_char_fetch_and_add1(addr) # define AO_HAVE_char_fetch_and_add1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* char_fetch_and_sub1 */ #if defined(AO_HAVE_char_fetch_and_add_full) \ && !defined(AO_HAVE_char_fetch_and_sub1_full) # define AO_char_fetch_and_sub1_full(addr) \ AO_char_fetch_and_add_full(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1_full #endif #if defined(AO_HAVE_char_fetch_and_add_release) \ && !defined(AO_HAVE_char_fetch_and_sub1_release) # define AO_char_fetch_and_sub1_release(addr) \ AO_char_fetch_and_add_release(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1_release #endif #if defined(AO_HAVE_char_fetch_and_add_acquire) \ && !defined(AO_HAVE_char_fetch_and_sub1_acquire) # define AO_char_fetch_and_sub1_acquire(addr) \ AO_char_fetch_and_add_acquire(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1_acquire #endif #if defined(AO_HAVE_char_fetch_and_add_write) \ && !defined(AO_HAVE_char_fetch_and_sub1_write) # define AO_char_fetch_and_sub1_write(addr) \ AO_char_fetch_and_add_write(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1_write #endif #if defined(AO_HAVE_char_fetch_and_add_read) \ && !defined(AO_HAVE_char_fetch_and_sub1_read) # define AO_char_fetch_and_sub1_read(addr) \ AO_char_fetch_and_add_read(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1_read #endif #if defined(AO_HAVE_char_fetch_and_add_release_write) \ && !defined(AO_HAVE_char_fetch_and_sub1_release_write) # define AO_char_fetch_and_sub1_release_write(addr) \ AO_char_fetch_and_add_release_write(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1_release_write #endif #if defined(AO_HAVE_char_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_char_fetch_and_sub1_acquire_read) # define AO_char_fetch_and_sub1_acquire_read(addr) \ AO_char_fetch_and_add_acquire_read(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1_acquire_read #endif #if defined(AO_HAVE_char_fetch_and_add) \ && !defined(AO_HAVE_char_fetch_and_sub1) # define AO_char_fetch_and_sub1(addr) \ AO_char_fetch_and_add(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1 #endif #if defined(AO_HAVE_char_fetch_and_sub1_full) # if !defined(AO_HAVE_char_fetch_and_sub1_release) # define AO_char_fetch_and_sub1_release(addr) \ AO_char_fetch_and_sub1_full(addr) # define AO_HAVE_char_fetch_and_sub1_release # endif # if !defined(AO_HAVE_char_fetch_and_sub1_acquire) # define AO_char_fetch_and_sub1_acquire(addr) \ AO_char_fetch_and_sub1_full(addr) # define AO_HAVE_char_fetch_and_sub1_acquire # endif # if !defined(AO_HAVE_char_fetch_and_sub1_write) # define AO_char_fetch_and_sub1_write(addr) \ AO_char_fetch_and_sub1_full(addr) # define AO_HAVE_char_fetch_and_sub1_write # endif # if !defined(AO_HAVE_char_fetch_and_sub1_read) # define AO_char_fetch_and_sub1_read(addr) \ AO_char_fetch_and_sub1_full(addr) # define AO_HAVE_char_fetch_and_sub1_read # endif #endif /* AO_HAVE_char_fetch_and_sub1_full */ #if !defined(AO_HAVE_char_fetch_and_sub1) \ && defined(AO_HAVE_char_fetch_and_sub1_release) # define AO_char_fetch_and_sub1(addr) AO_char_fetch_and_sub1_release(addr) # define AO_HAVE_char_fetch_and_sub1 #endif #if !defined(AO_HAVE_char_fetch_and_sub1) \ && defined(AO_HAVE_char_fetch_and_sub1_acquire) # define AO_char_fetch_and_sub1(addr) AO_char_fetch_and_sub1_acquire(addr) # define AO_HAVE_char_fetch_and_sub1 #endif #if !defined(AO_HAVE_char_fetch_and_sub1) \ && defined(AO_HAVE_char_fetch_and_sub1_write) # define AO_char_fetch_and_sub1(addr) AO_char_fetch_and_sub1_write(addr) # define AO_HAVE_char_fetch_and_sub1 #endif #if !defined(AO_HAVE_char_fetch_and_sub1) \ && defined(AO_HAVE_char_fetch_and_sub1_read) # define AO_char_fetch_and_sub1(addr) AO_char_fetch_and_sub1_read(addr) # define AO_HAVE_char_fetch_and_sub1 #endif #if defined(AO_HAVE_char_fetch_and_sub1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_fetch_and_sub1_full) # define AO_char_fetch_and_sub1_full(addr) \ (AO_nop_full(), AO_char_fetch_and_sub1_acquire(addr)) # define AO_HAVE_char_fetch_and_sub1_full #endif #if !defined(AO_HAVE_char_fetch_and_sub1_release_write) \ && defined(AO_HAVE_char_fetch_and_sub1_write) # define AO_char_fetch_and_sub1_release_write(addr) \ AO_char_fetch_and_sub1_write(addr) # define AO_HAVE_char_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_char_fetch_and_sub1_release_write) \ && defined(AO_HAVE_char_fetch_and_sub1_release) # define AO_char_fetch_and_sub1_release_write(addr) \ AO_char_fetch_and_sub1_release(addr) # define AO_HAVE_char_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_char_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_char_fetch_and_sub1_read) # define AO_char_fetch_and_sub1_acquire_read(addr) \ AO_char_fetch_and_sub1_read(addr) # define AO_HAVE_char_fetch_and_sub1_acquire_read #endif #if !defined(AO_HAVE_char_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_char_fetch_and_sub1_acquire) # define AO_char_fetch_and_sub1_acquire_read(addr) \ AO_char_fetch_and_sub1_acquire(addr) # define AO_HAVE_char_fetch_and_sub1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_char_fetch_and_sub1_acquire_read) # define AO_char_fetch_and_sub1_dd_acquire_read(addr) \ AO_char_fetch_and_sub1_acquire_read(addr) # define AO_HAVE_char_fetch_and_sub1_dd_acquire_read # endif #else # if defined(AO_HAVE_char_fetch_and_sub1) # define AO_char_fetch_and_sub1_dd_acquire_read(addr) \ AO_char_fetch_and_sub1(addr) # define AO_HAVE_char_fetch_and_sub1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* char_and */ #if defined(AO_HAVE_char_compare_and_swap_full) \ && !defined(AO_HAVE_char_and_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_char_and_full(volatile unsigned/**/char *addr, unsigned/**/char value) { unsigned/**/char old; do { old = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old, old & value))); } # define AO_HAVE_char_and_full #endif #if defined(AO_HAVE_char_and_full) # if !defined(AO_HAVE_char_and_release) # define AO_char_and_release(addr, val) AO_char_and_full(addr, val) # define AO_HAVE_char_and_release # endif # if !defined(AO_HAVE_char_and_acquire) # define AO_char_and_acquire(addr, val) AO_char_and_full(addr, val) # define AO_HAVE_char_and_acquire # endif # if !defined(AO_HAVE_char_and_write) # define AO_char_and_write(addr, val) AO_char_and_full(addr, val) # define AO_HAVE_char_and_write # endif # if !defined(AO_HAVE_char_and_read) # define AO_char_and_read(addr, val) AO_char_and_full(addr, val) # define AO_HAVE_char_and_read # endif #endif /* AO_HAVE_char_and_full */ #if !defined(AO_HAVE_char_and) && defined(AO_HAVE_char_and_release) # define AO_char_and(addr, val) AO_char_and_release(addr, val) # define AO_HAVE_char_and #endif #if !defined(AO_HAVE_char_and) && defined(AO_HAVE_char_and_acquire) # define AO_char_and(addr, val) AO_char_and_acquire(addr, val) # define AO_HAVE_char_and #endif #if !defined(AO_HAVE_char_and) && defined(AO_HAVE_char_and_write) # define AO_char_and(addr, val) AO_char_and_write(addr, val) # define AO_HAVE_char_and #endif #if !defined(AO_HAVE_char_and) && defined(AO_HAVE_char_and_read) # define AO_char_and(addr, val) AO_char_and_read(addr, val) # define AO_HAVE_char_and #endif #if defined(AO_HAVE_char_and_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_and_full) # define AO_char_and_full(addr, val) \ (AO_nop_full(), AO_char_and_acquire(addr, val)) # define AO_HAVE_char_and_full #endif #if !defined(AO_HAVE_char_and_release_write) \ && defined(AO_HAVE_char_and_write) # define AO_char_and_release_write(addr, val) AO_char_and_write(addr, val) # define AO_HAVE_char_and_release_write #endif #if !defined(AO_HAVE_char_and_release_write) \ && defined(AO_HAVE_char_and_release) # define AO_char_and_release_write(addr, val) AO_char_and_release(addr, val) # define AO_HAVE_char_and_release_write #endif #if !defined(AO_HAVE_char_and_acquire_read) \ && defined(AO_HAVE_char_and_read) # define AO_char_and_acquire_read(addr, val) AO_char_and_read(addr, val) # define AO_HAVE_char_and_acquire_read #endif #if !defined(AO_HAVE_char_and_acquire_read) \ && defined(AO_HAVE_char_and_acquire) # define AO_char_and_acquire_read(addr, val) AO_char_and_acquire(addr, val) # define AO_HAVE_char_and_acquire_read #endif /* char_or */ #if defined(AO_HAVE_char_compare_and_swap_full) \ && !defined(AO_HAVE_char_or_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_char_or_full(volatile unsigned/**/char *addr, unsigned/**/char value) { unsigned/**/char old; do { old = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old, old | value))); } # define AO_HAVE_char_or_full #endif #if defined(AO_HAVE_char_or_full) # if !defined(AO_HAVE_char_or_release) # define AO_char_or_release(addr, val) AO_char_or_full(addr, val) # define AO_HAVE_char_or_release # endif # if !defined(AO_HAVE_char_or_acquire) # define AO_char_or_acquire(addr, val) AO_char_or_full(addr, val) # define AO_HAVE_char_or_acquire # endif # if !defined(AO_HAVE_char_or_write) # define AO_char_or_write(addr, val) AO_char_or_full(addr, val) # define AO_HAVE_char_or_write # endif # if !defined(AO_HAVE_char_or_read) # define AO_char_or_read(addr, val) AO_char_or_full(addr, val) # define AO_HAVE_char_or_read # endif #endif /* AO_HAVE_char_or_full */ #if !defined(AO_HAVE_char_or) && defined(AO_HAVE_char_or_release) # define AO_char_or(addr, val) AO_char_or_release(addr, val) # define AO_HAVE_char_or #endif #if !defined(AO_HAVE_char_or) && defined(AO_HAVE_char_or_acquire) # define AO_char_or(addr, val) AO_char_or_acquire(addr, val) # define AO_HAVE_char_or #endif #if !defined(AO_HAVE_char_or) && defined(AO_HAVE_char_or_write) # define AO_char_or(addr, val) AO_char_or_write(addr, val) # define AO_HAVE_char_or #endif #if !defined(AO_HAVE_char_or) && defined(AO_HAVE_char_or_read) # define AO_char_or(addr, val) AO_char_or_read(addr, val) # define AO_HAVE_char_or #endif #if defined(AO_HAVE_char_or_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_or_full) # define AO_char_or_full(addr, val) \ (AO_nop_full(), AO_char_or_acquire(addr, val)) # define AO_HAVE_char_or_full #endif #if !defined(AO_HAVE_char_or_release_write) \ && defined(AO_HAVE_char_or_write) # define AO_char_or_release_write(addr, val) AO_char_or_write(addr, val) # define AO_HAVE_char_or_release_write #endif #if !defined(AO_HAVE_char_or_release_write) \ && defined(AO_HAVE_char_or_release) # define AO_char_or_release_write(addr, val) AO_char_or_release(addr, val) # define AO_HAVE_char_or_release_write #endif #if !defined(AO_HAVE_char_or_acquire_read) && defined(AO_HAVE_char_or_read) # define AO_char_or_acquire_read(addr, val) AO_char_or_read(addr, val) # define AO_HAVE_char_or_acquire_read #endif #if !defined(AO_HAVE_char_or_acquire_read) \ && defined(AO_HAVE_char_or_acquire) # define AO_char_or_acquire_read(addr, val) AO_char_or_acquire(addr, val) # define AO_HAVE_char_or_acquire_read #endif /* char_xor */ #if defined(AO_HAVE_char_compare_and_swap_full) \ && !defined(AO_HAVE_char_xor_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_char_xor_full(volatile unsigned/**/char *addr, unsigned/**/char value) { unsigned/**/char old; do { old = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old, old ^ value))); } # define AO_HAVE_char_xor_full #endif #if defined(AO_HAVE_char_xor_full) # if !defined(AO_HAVE_char_xor_release) # define AO_char_xor_release(addr, val) AO_char_xor_full(addr, val) # define AO_HAVE_char_xor_release # endif # if !defined(AO_HAVE_char_xor_acquire) # define AO_char_xor_acquire(addr, val) AO_char_xor_full(addr, val) # define AO_HAVE_char_xor_acquire # endif # if !defined(AO_HAVE_char_xor_write) # define AO_char_xor_write(addr, val) AO_char_xor_full(addr, val) # define AO_HAVE_char_xor_write # endif # if !defined(AO_HAVE_char_xor_read) # define AO_char_xor_read(addr, val) AO_char_xor_full(addr, val) # define AO_HAVE_char_xor_read # endif #endif /* AO_HAVE_char_xor_full */ #if !defined(AO_HAVE_char_xor) && defined(AO_HAVE_char_xor_release) # define AO_char_xor(addr, val) AO_char_xor_release(addr, val) # define AO_HAVE_char_xor #endif #if !defined(AO_HAVE_char_xor) && defined(AO_HAVE_char_xor_acquire) # define AO_char_xor(addr, val) AO_char_xor_acquire(addr, val) # define AO_HAVE_char_xor #endif #if !defined(AO_HAVE_char_xor) && defined(AO_HAVE_char_xor_write) # define AO_char_xor(addr, val) AO_char_xor_write(addr, val) # define AO_HAVE_char_xor #endif #if !defined(AO_HAVE_char_xor) && defined(AO_HAVE_char_xor_read) # define AO_char_xor(addr, val) AO_char_xor_read(addr, val) # define AO_HAVE_char_xor #endif #if defined(AO_HAVE_char_xor_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_xor_full) # define AO_char_xor_full(addr, val) \ (AO_nop_full(), AO_char_xor_acquire(addr, val)) # define AO_HAVE_char_xor_full #endif #if !defined(AO_HAVE_char_xor_release_write) \ && defined(AO_HAVE_char_xor_write) # define AO_char_xor_release_write(addr, val) AO_char_xor_write(addr, val) # define AO_HAVE_char_xor_release_write #endif #if !defined(AO_HAVE_char_xor_release_write) \ && defined(AO_HAVE_char_xor_release) # define AO_char_xor_release_write(addr, val) AO_char_xor_release(addr, val) # define AO_HAVE_char_xor_release_write #endif #if !defined(AO_HAVE_char_xor_acquire_read) \ && defined(AO_HAVE_char_xor_read) # define AO_char_xor_acquire_read(addr, val) AO_char_xor_read(addr, val) # define AO_HAVE_char_xor_acquire_read #endif #if !defined(AO_HAVE_char_xor_acquire_read) \ && defined(AO_HAVE_char_xor_acquire) # define AO_char_xor_acquire_read(addr, val) AO_char_xor_acquire(addr, val) # define AO_HAVE_char_xor_acquire_read #endif /* char_and/or/xor_dd_acquire_read are meaningless. */ /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* short_compare_and_swap (based on fetch_compare_and_swap) */ #if defined(AO_HAVE_short_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_short_compare_and_swap_full) AO_INLINE int AO_short_compare_and_swap_full(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_full #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_acquire) \ && !defined(AO_HAVE_short_compare_and_swap_acquire) AO_INLINE int AO_short_compare_and_swap_acquire(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_acquire #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_release) \ && !defined(AO_HAVE_short_compare_and_swap_release) AO_INLINE int AO_short_compare_and_swap_release(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_release #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_write) \ && !defined(AO_HAVE_short_compare_and_swap_write) AO_INLINE int AO_short_compare_and_swap_write(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_write #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_read) \ && !defined(AO_HAVE_short_compare_and_swap_read) AO_INLINE int AO_short_compare_and_swap_read(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_read #endif #if defined(AO_HAVE_short_fetch_compare_and_swap) \ && !defined(AO_HAVE_short_compare_and_swap) AO_INLINE int AO_short_compare_and_swap(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_release_write) \ && !defined(AO_HAVE_short_compare_and_swap_release_write) AO_INLINE int AO_short_compare_and_swap_release_write(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_release_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_release_write #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) \ && !defined(AO_HAVE_short_compare_and_swap_acquire_read) AO_INLINE int AO_short_compare_and_swap_acquire_read(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_acquire_read #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_dd_acquire_read) \ && !defined(AO_HAVE_short_compare_and_swap_dd_acquire_read) AO_INLINE int AO_short_compare_and_swap_dd_acquire_read(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_dd_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_dd_acquire_read #endif /* short_fetch_and_add */ /* We first try to implement fetch_and_add variants in terms of the */ /* corresponding compare_and_swap variants to minimize adding barriers. */ #if defined(AO_HAVE_short_compare_and_swap_full) \ && !defined(AO_HAVE_short_fetch_and_add_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/short AO_short_fetch_and_add_full(volatile unsigned/**/short *addr, unsigned/**/short incr) { unsigned/**/short old; do { old = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old, old + incr))); return old; } # define AO_HAVE_short_fetch_and_add_full #endif #if defined(AO_HAVE_short_compare_and_swap_acquire) \ && !defined(AO_HAVE_short_fetch_and_add_acquire) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/short AO_short_fetch_and_add_acquire(volatile unsigned/**/short *addr, unsigned/**/short incr) { unsigned/**/short old; do { old = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_acquire(addr, old, old + incr))); return old; } # define AO_HAVE_short_fetch_and_add_acquire #endif #if defined(AO_HAVE_short_compare_and_swap_release) \ && !defined(AO_HAVE_short_fetch_and_add_release) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/short AO_short_fetch_and_add_release(volatile unsigned/**/short *addr, unsigned/**/short incr) { unsigned/**/short old; do { old = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_release(addr, old, old + incr))); return old; } # define AO_HAVE_short_fetch_and_add_release #endif #if defined(AO_HAVE_short_compare_and_swap) \ && !defined(AO_HAVE_short_fetch_and_add) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned/**/short AO_short_fetch_and_add(volatile unsigned/**/short *addr, unsigned/**/short incr) { unsigned/**/short old; do { old = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap(addr, old, old + incr))); return old; } # define AO_HAVE_short_fetch_and_add #endif #if defined(AO_HAVE_short_fetch_and_add_full) # if !defined(AO_HAVE_short_fetch_and_add_release) # define AO_short_fetch_and_add_release(addr, val) \ AO_short_fetch_and_add_full(addr, val) # define AO_HAVE_short_fetch_and_add_release # endif # if !defined(AO_HAVE_short_fetch_and_add_acquire) # define AO_short_fetch_and_add_acquire(addr, val) \ AO_short_fetch_and_add_full(addr, val) # define AO_HAVE_short_fetch_and_add_acquire # endif # if !defined(AO_HAVE_short_fetch_and_add_write) # define AO_short_fetch_and_add_write(addr, val) \ AO_short_fetch_and_add_full(addr, val) # define AO_HAVE_short_fetch_and_add_write # endif # if !defined(AO_HAVE_short_fetch_and_add_read) # define AO_short_fetch_and_add_read(addr, val) \ AO_short_fetch_and_add_full(addr, val) # define AO_HAVE_short_fetch_and_add_read # endif #endif /* AO_HAVE_short_fetch_and_add_full */ #if defined(AO_HAVE_short_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_fetch_and_add_acquire) AO_INLINE unsigned/**/short AO_short_fetch_and_add_acquire(volatile unsigned/**/short *addr, unsigned/**/short incr) { unsigned/**/short result = AO_short_fetch_and_add(addr, incr); AO_nop_full(); return result; } # define AO_HAVE_short_fetch_and_add_acquire #endif #if defined(AO_HAVE_short_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_fetch_and_add_release) # define AO_short_fetch_and_add_release(addr, incr) \ (AO_nop_full(), AO_short_fetch_and_add(addr, incr)) # define AO_HAVE_short_fetch_and_add_release #endif #if !defined(AO_HAVE_short_fetch_and_add) \ && defined(AO_HAVE_short_fetch_and_add_release) # define AO_short_fetch_and_add(addr, val) \ AO_short_fetch_and_add_release(addr, val) # define AO_HAVE_short_fetch_and_add #endif #if !defined(AO_HAVE_short_fetch_and_add) \ && defined(AO_HAVE_short_fetch_and_add_acquire) # define AO_short_fetch_and_add(addr, val) \ AO_short_fetch_and_add_acquire(addr, val) # define AO_HAVE_short_fetch_and_add #endif #if !defined(AO_HAVE_short_fetch_and_add) \ && defined(AO_HAVE_short_fetch_and_add_write) # define AO_short_fetch_and_add(addr, val) \ AO_short_fetch_and_add_write(addr, val) # define AO_HAVE_short_fetch_and_add #endif #if !defined(AO_HAVE_short_fetch_and_add) \ && defined(AO_HAVE_short_fetch_and_add_read) # define AO_short_fetch_and_add(addr, val) \ AO_short_fetch_and_add_read(addr, val) # define AO_HAVE_short_fetch_and_add #endif #if defined(AO_HAVE_short_fetch_and_add_acquire) \ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_short_fetch_and_add_full) # define AO_short_fetch_and_add_full(addr, val) \ (AO_nop_full(), AO_short_fetch_and_add_acquire(addr, val)) # define AO_HAVE_short_fetch_and_add_full #endif #if !defined(AO_HAVE_short_fetch_and_add_release_write) \ && defined(AO_HAVE_short_fetch_and_add_write) # define AO_short_fetch_and_add_release_write(addr, val) \ AO_short_fetch_and_add_write(addr, val) # define AO_HAVE_short_fetch_and_add_release_write #endif #if !defined(AO_HAVE_short_fetch_and_add_release_write) \ && defined(AO_HAVE_short_fetch_and_add_release) # define AO_short_fetch_and_add_release_write(addr, val) \ AO_short_fetch_and_add_release(addr, val) # define AO_HAVE_short_fetch_and_add_release_write #endif #if !defined(AO_HAVE_short_fetch_and_add_acquire_read) \ && defined(AO_HAVE_short_fetch_and_add_read) # define AO_short_fetch_and_add_acquire_read(addr, val) \ AO_short_fetch_and_add_read(addr, val) # define AO_HAVE_short_fetch_and_add_acquire_read #endif #if !defined(AO_HAVE_short_fetch_and_add_acquire_read) \ && defined(AO_HAVE_short_fetch_and_add_acquire) # define AO_short_fetch_and_add_acquire_read(addr, val) \ AO_short_fetch_and_add_acquire(addr, val) # define AO_HAVE_short_fetch_and_add_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_short_fetch_and_add_acquire_read) # define AO_short_fetch_and_add_dd_acquire_read(addr, val) \ AO_short_fetch_and_add_acquire_read(addr, val) # define AO_HAVE_short_fetch_and_add_dd_acquire_read # endif #else # if defined(AO_HAVE_short_fetch_and_add) # define AO_short_fetch_and_add_dd_acquire_read(addr, val) \ AO_short_fetch_and_add(addr, val) # define AO_HAVE_short_fetch_and_add_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* short_fetch_and_add1 */ #if defined(AO_HAVE_short_fetch_and_add_full) \ && !defined(AO_HAVE_short_fetch_and_add1_full) # define AO_short_fetch_and_add1_full(addr) \ AO_short_fetch_and_add_full(addr, 1) # define AO_HAVE_short_fetch_and_add1_full #endif #if defined(AO_HAVE_short_fetch_and_add_release) \ && !defined(AO_HAVE_short_fetch_and_add1_release) # define AO_short_fetch_and_add1_release(addr) \ AO_short_fetch_and_add_release(addr, 1) # define AO_HAVE_short_fetch_and_add1_release #endif #if defined(AO_HAVE_short_fetch_and_add_acquire) \ && !defined(AO_HAVE_short_fetch_and_add1_acquire) # define AO_short_fetch_and_add1_acquire(addr) \ AO_short_fetch_and_add_acquire(addr, 1) # define AO_HAVE_short_fetch_and_add1_acquire #endif #if defined(AO_HAVE_short_fetch_and_add_write) \ && !defined(AO_HAVE_short_fetch_and_add1_write) # define AO_short_fetch_and_add1_write(addr) \ AO_short_fetch_and_add_write(addr, 1) # define AO_HAVE_short_fetch_and_add1_write #endif #if defined(AO_HAVE_short_fetch_and_add_read) \ && !defined(AO_HAVE_short_fetch_and_add1_read) # define AO_short_fetch_and_add1_read(addr) \ AO_short_fetch_and_add_read(addr, 1) # define AO_HAVE_short_fetch_and_add1_read #endif #if defined(AO_HAVE_short_fetch_and_add_release_write) \ && !defined(AO_HAVE_short_fetch_and_add1_release_write) # define AO_short_fetch_and_add1_release_write(addr) \ AO_short_fetch_and_add_release_write(addr, 1) # define AO_HAVE_short_fetch_and_add1_release_write #endif #if defined(AO_HAVE_short_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_short_fetch_and_add1_acquire_read) # define AO_short_fetch_and_add1_acquire_read(addr) \ AO_short_fetch_and_add_acquire_read(addr, 1) # define AO_HAVE_short_fetch_and_add1_acquire_read #endif #if defined(AO_HAVE_short_fetch_and_add) \ && !defined(AO_HAVE_short_fetch_and_add1) # define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add(addr, 1) # define AO_HAVE_short_fetch_and_add1 #endif #if defined(AO_HAVE_short_fetch_and_add1_full) # if !defined(AO_HAVE_short_fetch_and_add1_release) # define AO_short_fetch_and_add1_release(addr) \ AO_short_fetch_and_add1_full(addr) # define AO_HAVE_short_fetch_and_add1_release # endif # if !defined(AO_HAVE_short_fetch_and_add1_acquire) # define AO_short_fetch_and_add1_acquire(addr) \ AO_short_fetch_and_add1_full(addr) # define AO_HAVE_short_fetch_and_add1_acquire # endif # if !defined(AO_HAVE_short_fetch_and_add1_write) # define AO_short_fetch_and_add1_write(addr) \ AO_short_fetch_and_add1_full(addr) # define AO_HAVE_short_fetch_and_add1_write # endif # if !defined(AO_HAVE_short_fetch_and_add1_read) # define AO_short_fetch_and_add1_read(addr) \ AO_short_fetch_and_add1_full(addr) # define AO_HAVE_short_fetch_and_add1_read # endif #endif /* AO_HAVE_short_fetch_and_add1_full */ #if !defined(AO_HAVE_short_fetch_and_add1) \ && defined(AO_HAVE_short_fetch_and_add1_release) # define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add1_release(addr) # define AO_HAVE_short_fetch_and_add1 #endif #if !defined(AO_HAVE_short_fetch_and_add1) \ && defined(AO_HAVE_short_fetch_and_add1_acquire) # define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add1_acquire(addr) # define AO_HAVE_short_fetch_and_add1 #endif #if !defined(AO_HAVE_short_fetch_and_add1) \ && defined(AO_HAVE_short_fetch_and_add1_write) # define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add1_write(addr) # define AO_HAVE_short_fetch_and_add1 #endif #if !defined(AO_HAVE_short_fetch_and_add1) \ && defined(AO_HAVE_short_fetch_and_add1_read) # define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add1_read(addr) # define AO_HAVE_short_fetch_and_add1 #endif #if defined(AO_HAVE_short_fetch_and_add1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_fetch_and_add1_full) # define AO_short_fetch_and_add1_full(addr) \ (AO_nop_full(), AO_short_fetch_and_add1_acquire(addr)) # define AO_HAVE_short_fetch_and_add1_full #endif #if !defined(AO_HAVE_short_fetch_and_add1_release_write) \ && defined(AO_HAVE_short_fetch_and_add1_write) # define AO_short_fetch_and_add1_release_write(addr) \ AO_short_fetch_and_add1_write(addr) # define AO_HAVE_short_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_short_fetch_and_add1_release_write) \ && defined(AO_HAVE_short_fetch_and_add1_release) # define AO_short_fetch_and_add1_release_write(addr) \ AO_short_fetch_and_add1_release(addr) # define AO_HAVE_short_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_short_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_short_fetch_and_add1_read) # define AO_short_fetch_and_add1_acquire_read(addr) \ AO_short_fetch_and_add1_read(addr) # define AO_HAVE_short_fetch_and_add1_acquire_read #endif #if !defined(AO_HAVE_short_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_short_fetch_and_add1_acquire) # define AO_short_fetch_and_add1_acquire_read(addr) \ AO_short_fetch_and_add1_acquire(addr) # define AO_HAVE_short_fetch_and_add1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_short_fetch_and_add1_acquire_read) # define AO_short_fetch_and_add1_dd_acquire_read(addr) \ AO_short_fetch_and_add1_acquire_read(addr) # define AO_HAVE_short_fetch_and_add1_dd_acquire_read # endif #else # if defined(AO_HAVE_short_fetch_and_add1) # define AO_short_fetch_and_add1_dd_acquire_read(addr) \ AO_short_fetch_and_add1(addr) # define AO_HAVE_short_fetch_and_add1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* short_fetch_and_sub1 */ #if defined(AO_HAVE_short_fetch_and_add_full) \ && !defined(AO_HAVE_short_fetch_and_sub1_full) # define AO_short_fetch_and_sub1_full(addr) \ AO_short_fetch_and_add_full(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1_full #endif #if defined(AO_HAVE_short_fetch_and_add_release) \ && !defined(AO_HAVE_short_fetch_and_sub1_release) # define AO_short_fetch_and_sub1_release(addr) \ AO_short_fetch_and_add_release(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1_release #endif #if defined(AO_HAVE_short_fetch_and_add_acquire) \ && !defined(AO_HAVE_short_fetch_and_sub1_acquire) # define AO_short_fetch_and_sub1_acquire(addr) \ AO_short_fetch_and_add_acquire(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1_acquire #endif #if defined(AO_HAVE_short_fetch_and_add_write) \ && !defined(AO_HAVE_short_fetch_and_sub1_write) # define AO_short_fetch_and_sub1_write(addr) \ AO_short_fetch_and_add_write(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1_write #endif #if defined(AO_HAVE_short_fetch_and_add_read) \ && !defined(AO_HAVE_short_fetch_and_sub1_read) # define AO_short_fetch_and_sub1_read(addr) \ AO_short_fetch_and_add_read(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1_read #endif #if defined(AO_HAVE_short_fetch_and_add_release_write) \ && !defined(AO_HAVE_short_fetch_and_sub1_release_write) # define AO_short_fetch_and_sub1_release_write(addr) \ AO_short_fetch_and_add_release_write(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1_release_write #endif #if defined(AO_HAVE_short_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_short_fetch_and_sub1_acquire_read) # define AO_short_fetch_and_sub1_acquire_read(addr) \ AO_short_fetch_and_add_acquire_read(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1_acquire_read #endif #if defined(AO_HAVE_short_fetch_and_add) \ && !defined(AO_HAVE_short_fetch_and_sub1) # define AO_short_fetch_and_sub1(addr) \ AO_short_fetch_and_add(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1 #endif #if defined(AO_HAVE_short_fetch_and_sub1_full) # if !defined(AO_HAVE_short_fetch_and_sub1_release) # define AO_short_fetch_and_sub1_release(addr) \ AO_short_fetch_and_sub1_full(addr) # define AO_HAVE_short_fetch_and_sub1_release # endif # if !defined(AO_HAVE_short_fetch_and_sub1_acquire) # define AO_short_fetch_and_sub1_acquire(addr) \ AO_short_fetch_and_sub1_full(addr) # define AO_HAVE_short_fetch_and_sub1_acquire # endif # if !defined(AO_HAVE_short_fetch_and_sub1_write) # define AO_short_fetch_and_sub1_write(addr) \ AO_short_fetch_and_sub1_full(addr) # define AO_HAVE_short_fetch_and_sub1_write # endif # if !defined(AO_HAVE_short_fetch_and_sub1_read) # define AO_short_fetch_and_sub1_read(addr) \ AO_short_fetch_and_sub1_full(addr) # define AO_HAVE_short_fetch_and_sub1_read # endif #endif /* AO_HAVE_short_fetch_and_sub1_full */ #if !defined(AO_HAVE_short_fetch_and_sub1) \ && defined(AO_HAVE_short_fetch_and_sub1_release) # define AO_short_fetch_and_sub1(addr) AO_short_fetch_and_sub1_release(addr) # define AO_HAVE_short_fetch_and_sub1 #endif #if !defined(AO_HAVE_short_fetch_and_sub1) \ && defined(AO_HAVE_short_fetch_and_sub1_acquire) # define AO_short_fetch_and_sub1(addr) AO_short_fetch_and_sub1_acquire(addr) # define AO_HAVE_short_fetch_and_sub1 #endif #if !defined(AO_HAVE_short_fetch_and_sub1) \ && defined(AO_HAVE_short_fetch_and_sub1_write) # define AO_short_fetch_and_sub1(addr) AO_short_fetch_and_sub1_write(addr) # define AO_HAVE_short_fetch_and_sub1 #endif #if !defined(AO_HAVE_short_fetch_and_sub1) \ && defined(AO_HAVE_short_fetch_and_sub1_read) # define AO_short_fetch_and_sub1(addr) AO_short_fetch_and_sub1_read(addr) # define AO_HAVE_short_fetch_and_sub1 #endif #if defined(AO_HAVE_short_fetch_and_sub1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_fetch_and_sub1_full) # define AO_short_fetch_and_sub1_full(addr) \ (AO_nop_full(), AO_short_fetch_and_sub1_acquire(addr)) # define AO_HAVE_short_fetch_and_sub1_full #endif #if !defined(AO_HAVE_short_fetch_and_sub1_release_write) \ && defined(AO_HAVE_short_fetch_and_sub1_write) # define AO_short_fetch_and_sub1_release_write(addr) \ AO_short_fetch_and_sub1_write(addr) # define AO_HAVE_short_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_short_fetch_and_sub1_release_write) \ && defined(AO_HAVE_short_fetch_and_sub1_release) # define AO_short_fetch_and_sub1_release_write(addr) \ AO_short_fetch_and_sub1_release(addr) # define AO_HAVE_short_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_short_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_short_fetch_and_sub1_read) # define AO_short_fetch_and_sub1_acquire_read(addr) \ AO_short_fetch_and_sub1_read(addr) # define AO_HAVE_short_fetch_and_sub1_acquire_read #endif #if !defined(AO_HAVE_short_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_short_fetch_and_sub1_acquire) # define AO_short_fetch_and_sub1_acquire_read(addr) \ AO_short_fetch_and_sub1_acquire(addr) # define AO_HAVE_short_fetch_and_sub1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_short_fetch_and_sub1_acquire_read) # define AO_short_fetch_and_sub1_dd_acquire_read(addr) \ AO_short_fetch_and_sub1_acquire_read(addr) # define AO_HAVE_short_fetch_and_sub1_dd_acquire_read # endif #else # if defined(AO_HAVE_short_fetch_and_sub1) # define AO_short_fetch_and_sub1_dd_acquire_read(addr) \ AO_short_fetch_and_sub1(addr) # define AO_HAVE_short_fetch_and_sub1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* short_and */ #if defined(AO_HAVE_short_compare_and_swap_full) \ && !defined(AO_HAVE_short_and_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_short_and_full(volatile unsigned/**/short *addr, unsigned/**/short value) { unsigned/**/short old; do { old = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old, old & value))); } # define AO_HAVE_short_and_full #endif #if defined(AO_HAVE_short_and_full) # if !defined(AO_HAVE_short_and_release) # define AO_short_and_release(addr, val) AO_short_and_full(addr, val) # define AO_HAVE_short_and_release # endif # if !defined(AO_HAVE_short_and_acquire) # define AO_short_and_acquire(addr, val) AO_short_and_full(addr, val) # define AO_HAVE_short_and_acquire # endif # if !defined(AO_HAVE_short_and_write) # define AO_short_and_write(addr, val) AO_short_and_full(addr, val) # define AO_HAVE_short_and_write # endif # if !defined(AO_HAVE_short_and_read) # define AO_short_and_read(addr, val) AO_short_and_full(addr, val) # define AO_HAVE_short_and_read # endif #endif /* AO_HAVE_short_and_full */ #if !defined(AO_HAVE_short_and) && defined(AO_HAVE_short_and_release) # define AO_short_and(addr, val) AO_short_and_release(addr, val) # define AO_HAVE_short_and #endif #if !defined(AO_HAVE_short_and) && defined(AO_HAVE_short_and_acquire) # define AO_short_and(addr, val) AO_short_and_acquire(addr, val) # define AO_HAVE_short_and #endif #if !defined(AO_HAVE_short_and) && defined(AO_HAVE_short_and_write) # define AO_short_and(addr, val) AO_short_and_write(addr, val) # define AO_HAVE_short_and #endif #if !defined(AO_HAVE_short_and) && defined(AO_HAVE_short_and_read) # define AO_short_and(addr, val) AO_short_and_read(addr, val) # define AO_HAVE_short_and #endif #if defined(AO_HAVE_short_and_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_and_full) # define AO_short_and_full(addr, val) \ (AO_nop_full(), AO_short_and_acquire(addr, val)) # define AO_HAVE_short_and_full #endif #if !defined(AO_HAVE_short_and_release_write) \ && defined(AO_HAVE_short_and_write) # define AO_short_and_release_write(addr, val) AO_short_and_write(addr, val) # define AO_HAVE_short_and_release_write #endif #if !defined(AO_HAVE_short_and_release_write) \ && defined(AO_HAVE_short_and_release) # define AO_short_and_release_write(addr, val) AO_short_and_release(addr, val) # define AO_HAVE_short_and_release_write #endif #if !defined(AO_HAVE_short_and_acquire_read) \ && defined(AO_HAVE_short_and_read) # define AO_short_and_acquire_read(addr, val) AO_short_and_read(addr, val) # define AO_HAVE_short_and_acquire_read #endif #if !defined(AO_HAVE_short_and_acquire_read) \ && defined(AO_HAVE_short_and_acquire) # define AO_short_and_acquire_read(addr, val) AO_short_and_acquire(addr, val) # define AO_HAVE_short_and_acquire_read #endif /* short_or */ #if defined(AO_HAVE_short_compare_and_swap_full) \ && !defined(AO_HAVE_short_or_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_short_or_full(volatile unsigned/**/short *addr, unsigned/**/short value) { unsigned/**/short old; do { old = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old, old | value))); } # define AO_HAVE_short_or_full #endif #if defined(AO_HAVE_short_or_full) # if !defined(AO_HAVE_short_or_release) # define AO_short_or_release(addr, val) AO_short_or_full(addr, val) # define AO_HAVE_short_or_release # endif # if !defined(AO_HAVE_short_or_acquire) # define AO_short_or_acquire(addr, val) AO_short_or_full(addr, val) # define AO_HAVE_short_or_acquire # endif # if !defined(AO_HAVE_short_or_write) # define AO_short_or_write(addr, val) AO_short_or_full(addr, val) # define AO_HAVE_short_or_write # endif # if !defined(AO_HAVE_short_or_read) # define AO_short_or_read(addr, val) AO_short_or_full(addr, val) # define AO_HAVE_short_or_read # endif #endif /* AO_HAVE_short_or_full */ #if !defined(AO_HAVE_short_or) && defined(AO_HAVE_short_or_release) # define AO_short_or(addr, val) AO_short_or_release(addr, val) # define AO_HAVE_short_or #endif #if !defined(AO_HAVE_short_or) && defined(AO_HAVE_short_or_acquire) # define AO_short_or(addr, val) AO_short_or_acquire(addr, val) # define AO_HAVE_short_or #endif #if !defined(AO_HAVE_short_or) && defined(AO_HAVE_short_or_write) # define AO_short_or(addr, val) AO_short_or_write(addr, val) # define AO_HAVE_short_or #endif #if !defined(AO_HAVE_short_or) && defined(AO_HAVE_short_or_read) # define AO_short_or(addr, val) AO_short_or_read(addr, val) # define AO_HAVE_short_or #endif #if defined(AO_HAVE_short_or_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_or_full) # define AO_short_or_full(addr, val) \ (AO_nop_full(), AO_short_or_acquire(addr, val)) # define AO_HAVE_short_or_full #endif #if !defined(AO_HAVE_short_or_release_write) \ && defined(AO_HAVE_short_or_write) # define AO_short_or_release_write(addr, val) AO_short_or_write(addr, val) # define AO_HAVE_short_or_release_write #endif #if !defined(AO_HAVE_short_or_release_write) \ && defined(AO_HAVE_short_or_release) # define AO_short_or_release_write(addr, val) AO_short_or_release(addr, val) # define AO_HAVE_short_or_release_write #endif #if !defined(AO_HAVE_short_or_acquire_read) && defined(AO_HAVE_short_or_read) # define AO_short_or_acquire_read(addr, val) AO_short_or_read(addr, val) # define AO_HAVE_short_or_acquire_read #endif #if !defined(AO_HAVE_short_or_acquire_read) \ && defined(AO_HAVE_short_or_acquire) # define AO_short_or_acquire_read(addr, val) AO_short_or_acquire(addr, val) # define AO_HAVE_short_or_acquire_read #endif /* short_xor */ #if defined(AO_HAVE_short_compare_and_swap_full) \ && !defined(AO_HAVE_short_xor_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_short_xor_full(volatile unsigned/**/short *addr, unsigned/**/short value) { unsigned/**/short old; do { old = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old, old ^ value))); } # define AO_HAVE_short_xor_full #endif #if defined(AO_HAVE_short_xor_full) # if !defined(AO_HAVE_short_xor_release) # define AO_short_xor_release(addr, val) AO_short_xor_full(addr, val) # define AO_HAVE_short_xor_release # endif # if !defined(AO_HAVE_short_xor_acquire) # define AO_short_xor_acquire(addr, val) AO_short_xor_full(addr, val) # define AO_HAVE_short_xor_acquire # endif # if !defined(AO_HAVE_short_xor_write) # define AO_short_xor_write(addr, val) AO_short_xor_full(addr, val) # define AO_HAVE_short_xor_write # endif # if !defined(AO_HAVE_short_xor_read) # define AO_short_xor_read(addr, val) AO_short_xor_full(addr, val) # define AO_HAVE_short_xor_read # endif #endif /* AO_HAVE_short_xor_full */ #if !defined(AO_HAVE_short_xor) && defined(AO_HAVE_short_xor_release) # define AO_short_xor(addr, val) AO_short_xor_release(addr, val) # define AO_HAVE_short_xor #endif #if !defined(AO_HAVE_short_xor) && defined(AO_HAVE_short_xor_acquire) # define AO_short_xor(addr, val) AO_short_xor_acquire(addr, val) # define AO_HAVE_short_xor #endif #if !defined(AO_HAVE_short_xor) && defined(AO_HAVE_short_xor_write) # define AO_short_xor(addr, val) AO_short_xor_write(addr, val) # define AO_HAVE_short_xor #endif #if !defined(AO_HAVE_short_xor) && defined(AO_HAVE_short_xor_read) # define AO_short_xor(addr, val) AO_short_xor_read(addr, val) # define AO_HAVE_short_xor #endif #if defined(AO_HAVE_short_xor_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_xor_full) # define AO_short_xor_full(addr, val) \ (AO_nop_full(), AO_short_xor_acquire(addr, val)) # define AO_HAVE_short_xor_full #endif #if !defined(AO_HAVE_short_xor_release_write) \ && defined(AO_HAVE_short_xor_write) # define AO_short_xor_release_write(addr, val) AO_short_xor_write(addr, val) # define AO_HAVE_short_xor_release_write #endif #if !defined(AO_HAVE_short_xor_release_write) \ && defined(AO_HAVE_short_xor_release) # define AO_short_xor_release_write(addr, val) AO_short_xor_release(addr, val) # define AO_HAVE_short_xor_release_write #endif #if !defined(AO_HAVE_short_xor_acquire_read) \ && defined(AO_HAVE_short_xor_read) # define AO_short_xor_acquire_read(addr, val) AO_short_xor_read(addr, val) # define AO_HAVE_short_xor_acquire_read #endif #if !defined(AO_HAVE_short_xor_acquire_read) \ && defined(AO_HAVE_short_xor_acquire) # define AO_short_xor_acquire_read(addr, val) AO_short_xor_acquire(addr, val) # define AO_HAVE_short_xor_acquire_read #endif /* short_and/or/xor_dd_acquire_read are meaningless. */ /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* int_compare_and_swap (based on fetch_compare_and_swap) */ #if defined(AO_HAVE_int_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_int_compare_and_swap_full) AO_INLINE int AO_int_compare_and_swap_full(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_full #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_acquire) \ && !defined(AO_HAVE_int_compare_and_swap_acquire) AO_INLINE int AO_int_compare_and_swap_acquire(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_acquire #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_release) \ && !defined(AO_HAVE_int_compare_and_swap_release) AO_INLINE int AO_int_compare_and_swap_release(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_release #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_write) \ && !defined(AO_HAVE_int_compare_and_swap_write) AO_INLINE int AO_int_compare_and_swap_write(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_write #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_read) \ && !defined(AO_HAVE_int_compare_and_swap_read) AO_INLINE int AO_int_compare_and_swap_read(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_read #endif #if defined(AO_HAVE_int_fetch_compare_and_swap) \ && !defined(AO_HAVE_int_compare_and_swap) AO_INLINE int AO_int_compare_and_swap(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_release_write) \ && !defined(AO_HAVE_int_compare_and_swap_release_write) AO_INLINE int AO_int_compare_and_swap_release_write(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_release_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_release_write #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) \ && !defined(AO_HAVE_int_compare_and_swap_acquire_read) AO_INLINE int AO_int_compare_and_swap_acquire_read(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_acquire_read #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_dd_acquire_read) \ && !defined(AO_HAVE_int_compare_and_swap_dd_acquire_read) AO_INLINE int AO_int_compare_and_swap_dd_acquire_read(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_dd_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_dd_acquire_read #endif /* int_fetch_and_add */ /* We first try to implement fetch_and_add variants in terms of the */ /* corresponding compare_and_swap variants to minimize adding barriers. */ #if defined(AO_HAVE_int_compare_and_swap_full) \ && !defined(AO_HAVE_int_fetch_and_add_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned AO_int_fetch_and_add_full(volatile unsigned *addr, unsigned incr) { unsigned old; do { old = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old, old + incr))); return old; } # define AO_HAVE_int_fetch_and_add_full #endif #if defined(AO_HAVE_int_compare_and_swap_acquire) \ && !defined(AO_HAVE_int_fetch_and_add_acquire) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned AO_int_fetch_and_add_acquire(volatile unsigned *addr, unsigned incr) { unsigned old; do { old = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_acquire(addr, old, old + incr))); return old; } # define AO_HAVE_int_fetch_and_add_acquire #endif #if defined(AO_HAVE_int_compare_and_swap_release) \ && !defined(AO_HAVE_int_fetch_and_add_release) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned AO_int_fetch_and_add_release(volatile unsigned *addr, unsigned incr) { unsigned old; do { old = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_release(addr, old, old + incr))); return old; } # define AO_HAVE_int_fetch_and_add_release #endif #if defined(AO_HAVE_int_compare_and_swap) \ && !defined(AO_HAVE_int_fetch_and_add) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE unsigned AO_int_fetch_and_add(volatile unsigned *addr, unsigned incr) { unsigned old; do { old = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap(addr, old, old + incr))); return old; } # define AO_HAVE_int_fetch_and_add #endif #if defined(AO_HAVE_int_fetch_and_add_full) # if !defined(AO_HAVE_int_fetch_and_add_release) # define AO_int_fetch_and_add_release(addr, val) \ AO_int_fetch_and_add_full(addr, val) # define AO_HAVE_int_fetch_and_add_release # endif # if !defined(AO_HAVE_int_fetch_and_add_acquire) # define AO_int_fetch_and_add_acquire(addr, val) \ AO_int_fetch_and_add_full(addr, val) # define AO_HAVE_int_fetch_and_add_acquire # endif # if !defined(AO_HAVE_int_fetch_and_add_write) # define AO_int_fetch_and_add_write(addr, val) \ AO_int_fetch_and_add_full(addr, val) # define AO_HAVE_int_fetch_and_add_write # endif # if !defined(AO_HAVE_int_fetch_and_add_read) # define AO_int_fetch_and_add_read(addr, val) \ AO_int_fetch_and_add_full(addr, val) # define AO_HAVE_int_fetch_and_add_read # endif #endif /* AO_HAVE_int_fetch_and_add_full */ #if defined(AO_HAVE_int_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_fetch_and_add_acquire) AO_INLINE unsigned AO_int_fetch_and_add_acquire(volatile unsigned *addr, unsigned incr) { unsigned result = AO_int_fetch_and_add(addr, incr); AO_nop_full(); return result; } # define AO_HAVE_int_fetch_and_add_acquire #endif #if defined(AO_HAVE_int_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_fetch_and_add_release) # define AO_int_fetch_and_add_release(addr, incr) \ (AO_nop_full(), AO_int_fetch_and_add(addr, incr)) # define AO_HAVE_int_fetch_and_add_release #endif #if !defined(AO_HAVE_int_fetch_and_add) \ && defined(AO_HAVE_int_fetch_and_add_release) # define AO_int_fetch_and_add(addr, val) \ AO_int_fetch_and_add_release(addr, val) # define AO_HAVE_int_fetch_and_add #endif #if !defined(AO_HAVE_int_fetch_and_add) \ && defined(AO_HAVE_int_fetch_and_add_acquire) # define AO_int_fetch_and_add(addr, val) \ AO_int_fetch_and_add_acquire(addr, val) # define AO_HAVE_int_fetch_and_add #endif #if !defined(AO_HAVE_int_fetch_and_add) \ && defined(AO_HAVE_int_fetch_and_add_write) # define AO_int_fetch_and_add(addr, val) \ AO_int_fetch_and_add_write(addr, val) # define AO_HAVE_int_fetch_and_add #endif #if !defined(AO_HAVE_int_fetch_and_add) \ && defined(AO_HAVE_int_fetch_and_add_read) # define AO_int_fetch_and_add(addr, val) \ AO_int_fetch_and_add_read(addr, val) # define AO_HAVE_int_fetch_and_add #endif #if defined(AO_HAVE_int_fetch_and_add_acquire) \ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_int_fetch_and_add_full) # define AO_int_fetch_and_add_full(addr, val) \ (AO_nop_full(), AO_int_fetch_and_add_acquire(addr, val)) # define AO_HAVE_int_fetch_and_add_full #endif #if !defined(AO_HAVE_int_fetch_and_add_release_write) \ && defined(AO_HAVE_int_fetch_and_add_write) # define AO_int_fetch_and_add_release_write(addr, val) \ AO_int_fetch_and_add_write(addr, val) # define AO_HAVE_int_fetch_and_add_release_write #endif #if !defined(AO_HAVE_int_fetch_and_add_release_write) \ && defined(AO_HAVE_int_fetch_and_add_release) # define AO_int_fetch_and_add_release_write(addr, val) \ AO_int_fetch_and_add_release(addr, val) # define AO_HAVE_int_fetch_and_add_release_write #endif #if !defined(AO_HAVE_int_fetch_and_add_acquire_read) \ && defined(AO_HAVE_int_fetch_and_add_read) # define AO_int_fetch_and_add_acquire_read(addr, val) \ AO_int_fetch_and_add_read(addr, val) # define AO_HAVE_int_fetch_and_add_acquire_read #endif #if !defined(AO_HAVE_int_fetch_and_add_acquire_read) \ && defined(AO_HAVE_int_fetch_and_add_acquire) # define AO_int_fetch_and_add_acquire_read(addr, val) \ AO_int_fetch_and_add_acquire(addr, val) # define AO_HAVE_int_fetch_and_add_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_int_fetch_and_add_acquire_read) # define AO_int_fetch_and_add_dd_acquire_read(addr, val) \ AO_int_fetch_and_add_acquire_read(addr, val) # define AO_HAVE_int_fetch_and_add_dd_acquire_read # endif #else # if defined(AO_HAVE_int_fetch_and_add) # define AO_int_fetch_and_add_dd_acquire_read(addr, val) \ AO_int_fetch_and_add(addr, val) # define AO_HAVE_int_fetch_and_add_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* int_fetch_and_add1 */ #if defined(AO_HAVE_int_fetch_and_add_full) \ && !defined(AO_HAVE_int_fetch_and_add1_full) # define AO_int_fetch_and_add1_full(addr) \ AO_int_fetch_and_add_full(addr, 1) # define AO_HAVE_int_fetch_and_add1_full #endif #if defined(AO_HAVE_int_fetch_and_add_release) \ && !defined(AO_HAVE_int_fetch_and_add1_release) # define AO_int_fetch_and_add1_release(addr) \ AO_int_fetch_and_add_release(addr, 1) # define AO_HAVE_int_fetch_and_add1_release #endif #if defined(AO_HAVE_int_fetch_and_add_acquire) \ && !defined(AO_HAVE_int_fetch_and_add1_acquire) # define AO_int_fetch_and_add1_acquire(addr) \ AO_int_fetch_and_add_acquire(addr, 1) # define AO_HAVE_int_fetch_and_add1_acquire #endif #if defined(AO_HAVE_int_fetch_and_add_write) \ && !defined(AO_HAVE_int_fetch_and_add1_write) # define AO_int_fetch_and_add1_write(addr) \ AO_int_fetch_and_add_write(addr, 1) # define AO_HAVE_int_fetch_and_add1_write #endif #if defined(AO_HAVE_int_fetch_and_add_read) \ && !defined(AO_HAVE_int_fetch_and_add1_read) # define AO_int_fetch_and_add1_read(addr) \ AO_int_fetch_and_add_read(addr, 1) # define AO_HAVE_int_fetch_and_add1_read #endif #if defined(AO_HAVE_int_fetch_and_add_release_write) \ && !defined(AO_HAVE_int_fetch_and_add1_release_write) # define AO_int_fetch_and_add1_release_write(addr) \ AO_int_fetch_and_add_release_write(addr, 1) # define AO_HAVE_int_fetch_and_add1_release_write #endif #if defined(AO_HAVE_int_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_int_fetch_and_add1_acquire_read) # define AO_int_fetch_and_add1_acquire_read(addr) \ AO_int_fetch_and_add_acquire_read(addr, 1) # define AO_HAVE_int_fetch_and_add1_acquire_read #endif #if defined(AO_HAVE_int_fetch_and_add) \ && !defined(AO_HAVE_int_fetch_and_add1) # define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add(addr, 1) # define AO_HAVE_int_fetch_and_add1 #endif #if defined(AO_HAVE_int_fetch_and_add1_full) # if !defined(AO_HAVE_int_fetch_and_add1_release) # define AO_int_fetch_and_add1_release(addr) \ AO_int_fetch_and_add1_full(addr) # define AO_HAVE_int_fetch_and_add1_release # endif # if !defined(AO_HAVE_int_fetch_and_add1_acquire) # define AO_int_fetch_and_add1_acquire(addr) \ AO_int_fetch_and_add1_full(addr) # define AO_HAVE_int_fetch_and_add1_acquire # endif # if !defined(AO_HAVE_int_fetch_and_add1_write) # define AO_int_fetch_and_add1_write(addr) \ AO_int_fetch_and_add1_full(addr) # define AO_HAVE_int_fetch_and_add1_write # endif # if !defined(AO_HAVE_int_fetch_and_add1_read) # define AO_int_fetch_and_add1_read(addr) \ AO_int_fetch_and_add1_full(addr) # define AO_HAVE_int_fetch_and_add1_read # endif #endif /* AO_HAVE_int_fetch_and_add1_full */ #if !defined(AO_HAVE_int_fetch_and_add1) \ && defined(AO_HAVE_int_fetch_and_add1_release) # define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add1_release(addr) # define AO_HAVE_int_fetch_and_add1 #endif #if !defined(AO_HAVE_int_fetch_and_add1) \ && defined(AO_HAVE_int_fetch_and_add1_acquire) # define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add1_acquire(addr) # define AO_HAVE_int_fetch_and_add1 #endif #if !defined(AO_HAVE_int_fetch_and_add1) \ && defined(AO_HAVE_int_fetch_and_add1_write) # define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add1_write(addr) # define AO_HAVE_int_fetch_and_add1 #endif #if !defined(AO_HAVE_int_fetch_and_add1) \ && defined(AO_HAVE_int_fetch_and_add1_read) # define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add1_read(addr) # define AO_HAVE_int_fetch_and_add1 #endif #if defined(AO_HAVE_int_fetch_and_add1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_fetch_and_add1_full) # define AO_int_fetch_and_add1_full(addr) \ (AO_nop_full(), AO_int_fetch_and_add1_acquire(addr)) # define AO_HAVE_int_fetch_and_add1_full #endif #if !defined(AO_HAVE_int_fetch_and_add1_release_write) \ && defined(AO_HAVE_int_fetch_and_add1_write) # define AO_int_fetch_and_add1_release_write(addr) \ AO_int_fetch_and_add1_write(addr) # define AO_HAVE_int_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_int_fetch_and_add1_release_write) \ && defined(AO_HAVE_int_fetch_and_add1_release) # define AO_int_fetch_and_add1_release_write(addr) \ AO_int_fetch_and_add1_release(addr) # define AO_HAVE_int_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_int_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_int_fetch_and_add1_read) # define AO_int_fetch_and_add1_acquire_read(addr) \ AO_int_fetch_and_add1_read(addr) # define AO_HAVE_int_fetch_and_add1_acquire_read #endif #if !defined(AO_HAVE_int_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_int_fetch_and_add1_acquire) # define AO_int_fetch_and_add1_acquire_read(addr) \ AO_int_fetch_and_add1_acquire(addr) # define AO_HAVE_int_fetch_and_add1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_int_fetch_and_add1_acquire_read) # define AO_int_fetch_and_add1_dd_acquire_read(addr) \ AO_int_fetch_and_add1_acquire_read(addr) # define AO_HAVE_int_fetch_and_add1_dd_acquire_read # endif #else # if defined(AO_HAVE_int_fetch_and_add1) # define AO_int_fetch_and_add1_dd_acquire_read(addr) \ AO_int_fetch_and_add1(addr) # define AO_HAVE_int_fetch_and_add1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* int_fetch_and_sub1 */ #if defined(AO_HAVE_int_fetch_and_add_full) \ && !defined(AO_HAVE_int_fetch_and_sub1_full) # define AO_int_fetch_and_sub1_full(addr) \ AO_int_fetch_and_add_full(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1_full #endif #if defined(AO_HAVE_int_fetch_and_add_release) \ && !defined(AO_HAVE_int_fetch_and_sub1_release) # define AO_int_fetch_and_sub1_release(addr) \ AO_int_fetch_and_add_release(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1_release #endif #if defined(AO_HAVE_int_fetch_and_add_acquire) \ && !defined(AO_HAVE_int_fetch_and_sub1_acquire) # define AO_int_fetch_and_sub1_acquire(addr) \ AO_int_fetch_and_add_acquire(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1_acquire #endif #if defined(AO_HAVE_int_fetch_and_add_write) \ && !defined(AO_HAVE_int_fetch_and_sub1_write) # define AO_int_fetch_and_sub1_write(addr) \ AO_int_fetch_and_add_write(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1_write #endif #if defined(AO_HAVE_int_fetch_and_add_read) \ && !defined(AO_HAVE_int_fetch_and_sub1_read) # define AO_int_fetch_and_sub1_read(addr) \ AO_int_fetch_and_add_read(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1_read #endif #if defined(AO_HAVE_int_fetch_and_add_release_write) \ && !defined(AO_HAVE_int_fetch_and_sub1_release_write) # define AO_int_fetch_and_sub1_release_write(addr) \ AO_int_fetch_and_add_release_write(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1_release_write #endif #if defined(AO_HAVE_int_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_int_fetch_and_sub1_acquire_read) # define AO_int_fetch_and_sub1_acquire_read(addr) \ AO_int_fetch_and_add_acquire_read(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1_acquire_read #endif #if defined(AO_HAVE_int_fetch_and_add) \ && !defined(AO_HAVE_int_fetch_and_sub1) # define AO_int_fetch_and_sub1(addr) \ AO_int_fetch_and_add(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1 #endif #if defined(AO_HAVE_int_fetch_and_sub1_full) # if !defined(AO_HAVE_int_fetch_and_sub1_release) # define AO_int_fetch_and_sub1_release(addr) \ AO_int_fetch_and_sub1_full(addr) # define AO_HAVE_int_fetch_and_sub1_release # endif # if !defined(AO_HAVE_int_fetch_and_sub1_acquire) # define AO_int_fetch_and_sub1_acquire(addr) \ AO_int_fetch_and_sub1_full(addr) # define AO_HAVE_int_fetch_and_sub1_acquire # endif # if !defined(AO_HAVE_int_fetch_and_sub1_write) # define AO_int_fetch_and_sub1_write(addr) \ AO_int_fetch_and_sub1_full(addr) # define AO_HAVE_int_fetch_and_sub1_write # endif # if !defined(AO_HAVE_int_fetch_and_sub1_read) # define AO_int_fetch_and_sub1_read(addr) \ AO_int_fetch_and_sub1_full(addr) # define AO_HAVE_int_fetch_and_sub1_read # endif #endif /* AO_HAVE_int_fetch_and_sub1_full */ #if !defined(AO_HAVE_int_fetch_and_sub1) \ && defined(AO_HAVE_int_fetch_and_sub1_release) # define AO_int_fetch_and_sub1(addr) AO_int_fetch_and_sub1_release(addr) # define AO_HAVE_int_fetch_and_sub1 #endif #if !defined(AO_HAVE_int_fetch_and_sub1) \ && defined(AO_HAVE_int_fetch_and_sub1_acquire) # define AO_int_fetch_and_sub1(addr) AO_int_fetch_and_sub1_acquire(addr) # define AO_HAVE_int_fetch_and_sub1 #endif #if !defined(AO_HAVE_int_fetch_and_sub1) \ && defined(AO_HAVE_int_fetch_and_sub1_write) # define AO_int_fetch_and_sub1(addr) AO_int_fetch_and_sub1_write(addr) # define AO_HAVE_int_fetch_and_sub1 #endif #if !defined(AO_HAVE_int_fetch_and_sub1) \ && defined(AO_HAVE_int_fetch_and_sub1_read) # define AO_int_fetch_and_sub1(addr) AO_int_fetch_and_sub1_read(addr) # define AO_HAVE_int_fetch_and_sub1 #endif #if defined(AO_HAVE_int_fetch_and_sub1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_fetch_and_sub1_full) # define AO_int_fetch_and_sub1_full(addr) \ (AO_nop_full(), AO_int_fetch_and_sub1_acquire(addr)) # define AO_HAVE_int_fetch_and_sub1_full #endif #if !defined(AO_HAVE_int_fetch_and_sub1_release_write) \ && defined(AO_HAVE_int_fetch_and_sub1_write) # define AO_int_fetch_and_sub1_release_write(addr) \ AO_int_fetch_and_sub1_write(addr) # define AO_HAVE_int_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_int_fetch_and_sub1_release_write) \ && defined(AO_HAVE_int_fetch_and_sub1_release) # define AO_int_fetch_and_sub1_release_write(addr) \ AO_int_fetch_and_sub1_release(addr) # define AO_HAVE_int_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_int_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_int_fetch_and_sub1_read) # define AO_int_fetch_and_sub1_acquire_read(addr) \ AO_int_fetch_and_sub1_read(addr) # define AO_HAVE_int_fetch_and_sub1_acquire_read #endif #if !defined(AO_HAVE_int_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_int_fetch_and_sub1_acquire) # define AO_int_fetch_and_sub1_acquire_read(addr) \ AO_int_fetch_and_sub1_acquire(addr) # define AO_HAVE_int_fetch_and_sub1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_int_fetch_and_sub1_acquire_read) # define AO_int_fetch_and_sub1_dd_acquire_read(addr) \ AO_int_fetch_and_sub1_acquire_read(addr) # define AO_HAVE_int_fetch_and_sub1_dd_acquire_read # endif #else # if defined(AO_HAVE_int_fetch_and_sub1) # define AO_int_fetch_and_sub1_dd_acquire_read(addr) \ AO_int_fetch_and_sub1(addr) # define AO_HAVE_int_fetch_and_sub1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* int_and */ #if defined(AO_HAVE_int_compare_and_swap_full) \ && !defined(AO_HAVE_int_and_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_int_and_full(volatile unsigned *addr, unsigned value) { unsigned old; do { old = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old, old & value))); } # define AO_HAVE_int_and_full #endif #if defined(AO_HAVE_int_and_full) # if !defined(AO_HAVE_int_and_release) # define AO_int_and_release(addr, val) AO_int_and_full(addr, val) # define AO_HAVE_int_and_release # endif # if !defined(AO_HAVE_int_and_acquire) # define AO_int_and_acquire(addr, val) AO_int_and_full(addr, val) # define AO_HAVE_int_and_acquire # endif # if !defined(AO_HAVE_int_and_write) # define AO_int_and_write(addr, val) AO_int_and_full(addr, val) # define AO_HAVE_int_and_write # endif # if !defined(AO_HAVE_int_and_read) # define AO_int_and_read(addr, val) AO_int_and_full(addr, val) # define AO_HAVE_int_and_read # endif #endif /* AO_HAVE_int_and_full */ #if !defined(AO_HAVE_int_and) && defined(AO_HAVE_int_and_release) # define AO_int_and(addr, val) AO_int_and_release(addr, val) # define AO_HAVE_int_and #endif #if !defined(AO_HAVE_int_and) && defined(AO_HAVE_int_and_acquire) # define AO_int_and(addr, val) AO_int_and_acquire(addr, val) # define AO_HAVE_int_and #endif #if !defined(AO_HAVE_int_and) && defined(AO_HAVE_int_and_write) # define AO_int_and(addr, val) AO_int_and_write(addr, val) # define AO_HAVE_int_and #endif #if !defined(AO_HAVE_int_and) && defined(AO_HAVE_int_and_read) # define AO_int_and(addr, val) AO_int_and_read(addr, val) # define AO_HAVE_int_and #endif #if defined(AO_HAVE_int_and_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_and_full) # define AO_int_and_full(addr, val) \ (AO_nop_full(), AO_int_and_acquire(addr, val)) # define AO_HAVE_int_and_full #endif #if !defined(AO_HAVE_int_and_release_write) \ && defined(AO_HAVE_int_and_write) # define AO_int_and_release_write(addr, val) AO_int_and_write(addr, val) # define AO_HAVE_int_and_release_write #endif #if !defined(AO_HAVE_int_and_release_write) \ && defined(AO_HAVE_int_and_release) # define AO_int_and_release_write(addr, val) AO_int_and_release(addr, val) # define AO_HAVE_int_and_release_write #endif #if !defined(AO_HAVE_int_and_acquire_read) \ && defined(AO_HAVE_int_and_read) # define AO_int_and_acquire_read(addr, val) AO_int_and_read(addr, val) # define AO_HAVE_int_and_acquire_read #endif #if !defined(AO_HAVE_int_and_acquire_read) \ && defined(AO_HAVE_int_and_acquire) # define AO_int_and_acquire_read(addr, val) AO_int_and_acquire(addr, val) # define AO_HAVE_int_and_acquire_read #endif /* int_or */ #if defined(AO_HAVE_int_compare_and_swap_full) \ && !defined(AO_HAVE_int_or_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_int_or_full(volatile unsigned *addr, unsigned value) { unsigned old; do { old = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old, old | value))); } # define AO_HAVE_int_or_full #endif #if defined(AO_HAVE_int_or_full) # if !defined(AO_HAVE_int_or_release) # define AO_int_or_release(addr, val) AO_int_or_full(addr, val) # define AO_HAVE_int_or_release # endif # if !defined(AO_HAVE_int_or_acquire) # define AO_int_or_acquire(addr, val) AO_int_or_full(addr, val) # define AO_HAVE_int_or_acquire # endif # if !defined(AO_HAVE_int_or_write) # define AO_int_or_write(addr, val) AO_int_or_full(addr, val) # define AO_HAVE_int_or_write # endif # if !defined(AO_HAVE_int_or_read) # define AO_int_or_read(addr, val) AO_int_or_full(addr, val) # define AO_HAVE_int_or_read # endif #endif /* AO_HAVE_int_or_full */ #if !defined(AO_HAVE_int_or) && defined(AO_HAVE_int_or_release) # define AO_int_or(addr, val) AO_int_or_release(addr, val) # define AO_HAVE_int_or #endif #if !defined(AO_HAVE_int_or) && defined(AO_HAVE_int_or_acquire) # define AO_int_or(addr, val) AO_int_or_acquire(addr, val) # define AO_HAVE_int_or #endif #if !defined(AO_HAVE_int_or) && defined(AO_HAVE_int_or_write) # define AO_int_or(addr, val) AO_int_or_write(addr, val) # define AO_HAVE_int_or #endif #if !defined(AO_HAVE_int_or) && defined(AO_HAVE_int_or_read) # define AO_int_or(addr, val) AO_int_or_read(addr, val) # define AO_HAVE_int_or #endif #if defined(AO_HAVE_int_or_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_or_full) # define AO_int_or_full(addr, val) \ (AO_nop_full(), AO_int_or_acquire(addr, val)) # define AO_HAVE_int_or_full #endif #if !defined(AO_HAVE_int_or_release_write) \ && defined(AO_HAVE_int_or_write) # define AO_int_or_release_write(addr, val) AO_int_or_write(addr, val) # define AO_HAVE_int_or_release_write #endif #if !defined(AO_HAVE_int_or_release_write) \ && defined(AO_HAVE_int_or_release) # define AO_int_or_release_write(addr, val) AO_int_or_release(addr, val) # define AO_HAVE_int_or_release_write #endif #if !defined(AO_HAVE_int_or_acquire_read) && defined(AO_HAVE_int_or_read) # define AO_int_or_acquire_read(addr, val) AO_int_or_read(addr, val) # define AO_HAVE_int_or_acquire_read #endif #if !defined(AO_HAVE_int_or_acquire_read) \ && defined(AO_HAVE_int_or_acquire) # define AO_int_or_acquire_read(addr, val) AO_int_or_acquire(addr, val) # define AO_HAVE_int_or_acquire_read #endif /* int_xor */ #if defined(AO_HAVE_int_compare_and_swap_full) \ && !defined(AO_HAVE_int_xor_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_int_xor_full(volatile unsigned *addr, unsigned value) { unsigned old; do { old = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old, old ^ value))); } # define AO_HAVE_int_xor_full #endif #if defined(AO_HAVE_int_xor_full) # if !defined(AO_HAVE_int_xor_release) # define AO_int_xor_release(addr, val) AO_int_xor_full(addr, val) # define AO_HAVE_int_xor_release # endif # if !defined(AO_HAVE_int_xor_acquire) # define AO_int_xor_acquire(addr, val) AO_int_xor_full(addr, val) # define AO_HAVE_int_xor_acquire # endif # if !defined(AO_HAVE_int_xor_write) # define AO_int_xor_write(addr, val) AO_int_xor_full(addr, val) # define AO_HAVE_int_xor_write # endif # if !defined(AO_HAVE_int_xor_read) # define AO_int_xor_read(addr, val) AO_int_xor_full(addr, val) # define AO_HAVE_int_xor_read # endif #endif /* AO_HAVE_int_xor_full */ #if !defined(AO_HAVE_int_xor) && defined(AO_HAVE_int_xor_release) # define AO_int_xor(addr, val) AO_int_xor_release(addr, val) # define AO_HAVE_int_xor #endif #if !defined(AO_HAVE_int_xor) && defined(AO_HAVE_int_xor_acquire) # define AO_int_xor(addr, val) AO_int_xor_acquire(addr, val) # define AO_HAVE_int_xor #endif #if !defined(AO_HAVE_int_xor) && defined(AO_HAVE_int_xor_write) # define AO_int_xor(addr, val) AO_int_xor_write(addr, val) # define AO_HAVE_int_xor #endif #if !defined(AO_HAVE_int_xor) && defined(AO_HAVE_int_xor_read) # define AO_int_xor(addr, val) AO_int_xor_read(addr, val) # define AO_HAVE_int_xor #endif #if defined(AO_HAVE_int_xor_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_xor_full) # define AO_int_xor_full(addr, val) \ (AO_nop_full(), AO_int_xor_acquire(addr, val)) # define AO_HAVE_int_xor_full #endif #if !defined(AO_HAVE_int_xor_release_write) \ && defined(AO_HAVE_int_xor_write) # define AO_int_xor_release_write(addr, val) AO_int_xor_write(addr, val) # define AO_HAVE_int_xor_release_write #endif #if !defined(AO_HAVE_int_xor_release_write) \ && defined(AO_HAVE_int_xor_release) # define AO_int_xor_release_write(addr, val) AO_int_xor_release(addr, val) # define AO_HAVE_int_xor_release_write #endif #if !defined(AO_HAVE_int_xor_acquire_read) \ && defined(AO_HAVE_int_xor_read) # define AO_int_xor_acquire_read(addr, val) AO_int_xor_read(addr, val) # define AO_HAVE_int_xor_acquire_read #endif #if !defined(AO_HAVE_int_xor_acquire_read) \ && defined(AO_HAVE_int_xor_acquire) # define AO_int_xor_acquire_read(addr, val) AO_int_xor_acquire(addr, val) # define AO_HAVE_int_xor_acquire_read #endif /* int_and/or/xor_dd_acquire_read are meaningless. */ /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* compare_and_swap (based on fetch_compare_and_swap) */ #if defined(AO_HAVE_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_compare_and_swap_full) AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_full(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_full #endif #if defined(AO_HAVE_fetch_compare_and_swap_acquire) \ && !defined(AO_HAVE_compare_and_swap_acquire) AO_INLINE int AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_acquire(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_acquire #endif #if defined(AO_HAVE_fetch_compare_and_swap_release) \ && !defined(AO_HAVE_compare_and_swap_release) AO_INLINE int AO_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_release(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_release #endif #if defined(AO_HAVE_fetch_compare_and_swap_write) \ && !defined(AO_HAVE_compare_and_swap_write) AO_INLINE int AO_compare_and_swap_write(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_write #endif #if defined(AO_HAVE_fetch_compare_and_swap_read) \ && !defined(AO_HAVE_compare_and_swap_read) AO_INLINE int AO_compare_and_swap_read(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_read #endif #if defined(AO_HAVE_fetch_compare_and_swap) \ && !defined(AO_HAVE_compare_and_swap) AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap #endif #if defined(AO_HAVE_fetch_compare_and_swap_release_write) \ && !defined(AO_HAVE_compare_and_swap_release_write) AO_INLINE int AO_compare_and_swap_release_write(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_release_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_release_write #endif #if defined(AO_HAVE_fetch_compare_and_swap_acquire_read) \ && !defined(AO_HAVE_compare_and_swap_acquire_read) AO_INLINE int AO_compare_and_swap_acquire_read(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_acquire_read #endif #if defined(AO_HAVE_fetch_compare_and_swap_dd_acquire_read) \ && !defined(AO_HAVE_compare_and_swap_dd_acquire_read) AO_INLINE int AO_compare_and_swap_dd_acquire_read(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_dd_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_dd_acquire_read #endif /* fetch_and_add */ /* We first try to implement fetch_and_add variants in terms of the */ /* corresponding compare_and_swap variants to minimize adding barriers. */ #if defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_fetch_and_add_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE AO_t AO_fetch_and_add_full(volatile AO_t *addr, AO_t incr) { AO_t old; do { old = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old, old + incr))); return old; } # define AO_HAVE_fetch_and_add_full #endif #if defined(AO_HAVE_compare_and_swap_acquire) \ && !defined(AO_HAVE_fetch_and_add_acquire) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE AO_t AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr) { AO_t old; do { old = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_acquire(addr, old, old + incr))); return old; } # define AO_HAVE_fetch_and_add_acquire #endif #if defined(AO_HAVE_compare_and_swap_release) \ && !defined(AO_HAVE_fetch_and_add_release) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE AO_t AO_fetch_and_add_release(volatile AO_t *addr, AO_t incr) { AO_t old; do { old = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_release(addr, old, old + incr))); return old; } # define AO_HAVE_fetch_and_add_release #endif #if defined(AO_HAVE_compare_and_swap) \ && !defined(AO_HAVE_fetch_and_add) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *addr, AO_t incr) { AO_t old; do { old = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap(addr, old, old + incr))); return old; } # define AO_HAVE_fetch_and_add #endif #if defined(AO_HAVE_fetch_and_add_full) # if !defined(AO_HAVE_fetch_and_add_release) # define AO_fetch_and_add_release(addr, val) \ AO_fetch_and_add_full(addr, val) # define AO_HAVE_fetch_and_add_release # endif # if !defined(AO_HAVE_fetch_and_add_acquire) # define AO_fetch_and_add_acquire(addr, val) \ AO_fetch_and_add_full(addr, val) # define AO_HAVE_fetch_and_add_acquire # endif # if !defined(AO_HAVE_fetch_and_add_write) # define AO_fetch_and_add_write(addr, val) \ AO_fetch_and_add_full(addr, val) # define AO_HAVE_fetch_and_add_write # endif # if !defined(AO_HAVE_fetch_and_add_read) # define AO_fetch_and_add_read(addr, val) \ AO_fetch_and_add_full(addr, val) # define AO_HAVE_fetch_and_add_read # endif #endif /* AO_HAVE_fetch_and_add_full */ #if defined(AO_HAVE_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_fetch_and_add_acquire) AO_INLINE AO_t AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr) { AO_t result = AO_fetch_and_add(addr, incr); AO_nop_full(); return result; } # define AO_HAVE_fetch_and_add_acquire #endif #if defined(AO_HAVE_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_fetch_and_add_release) # define AO_fetch_and_add_release(addr, incr) \ (AO_nop_full(), AO_fetch_and_add(addr, incr)) # define AO_HAVE_fetch_and_add_release #endif #if !defined(AO_HAVE_fetch_and_add) \ && defined(AO_HAVE_fetch_and_add_release) # define AO_fetch_and_add(addr, val) \ AO_fetch_and_add_release(addr, val) # define AO_HAVE_fetch_and_add #endif #if !defined(AO_HAVE_fetch_and_add) \ && defined(AO_HAVE_fetch_and_add_acquire) # define AO_fetch_and_add(addr, val) \ AO_fetch_and_add_acquire(addr, val) # define AO_HAVE_fetch_and_add #endif #if !defined(AO_HAVE_fetch_and_add) \ && defined(AO_HAVE_fetch_and_add_write) # define AO_fetch_and_add(addr, val) \ AO_fetch_and_add_write(addr, val) # define AO_HAVE_fetch_and_add #endif #if !defined(AO_HAVE_fetch_and_add) \ && defined(AO_HAVE_fetch_and_add_read) # define AO_fetch_and_add(addr, val) \ AO_fetch_and_add_read(addr, val) # define AO_HAVE_fetch_and_add #endif #if defined(AO_HAVE_fetch_and_add_acquire) \ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_fetch_and_add_full) # define AO_fetch_and_add_full(addr, val) \ (AO_nop_full(), AO_fetch_and_add_acquire(addr, val)) # define AO_HAVE_fetch_and_add_full #endif #if !defined(AO_HAVE_fetch_and_add_release_write) \ && defined(AO_HAVE_fetch_and_add_write) # define AO_fetch_and_add_release_write(addr, val) \ AO_fetch_and_add_write(addr, val) # define AO_HAVE_fetch_and_add_release_write #endif #if !defined(AO_HAVE_fetch_and_add_release_write) \ && defined(AO_HAVE_fetch_and_add_release) # define AO_fetch_and_add_release_write(addr, val) \ AO_fetch_and_add_release(addr, val) # define AO_HAVE_fetch_and_add_release_write #endif #if !defined(AO_HAVE_fetch_and_add_acquire_read) \ && defined(AO_HAVE_fetch_and_add_read) # define AO_fetch_and_add_acquire_read(addr, val) \ AO_fetch_and_add_read(addr, val) # define AO_HAVE_fetch_and_add_acquire_read #endif #if !defined(AO_HAVE_fetch_and_add_acquire_read) \ && defined(AO_HAVE_fetch_and_add_acquire) # define AO_fetch_and_add_acquire_read(addr, val) \ AO_fetch_and_add_acquire(addr, val) # define AO_HAVE_fetch_and_add_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_fetch_and_add_acquire_read) # define AO_fetch_and_add_dd_acquire_read(addr, val) \ AO_fetch_and_add_acquire_read(addr, val) # define AO_HAVE_fetch_and_add_dd_acquire_read # endif #else # if defined(AO_HAVE_fetch_and_add) # define AO_fetch_and_add_dd_acquire_read(addr, val) \ AO_fetch_and_add(addr, val) # define AO_HAVE_fetch_and_add_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* fetch_and_add1 */ #if defined(AO_HAVE_fetch_and_add_full) \ && !defined(AO_HAVE_fetch_and_add1_full) # define AO_fetch_and_add1_full(addr) \ AO_fetch_and_add_full(addr, 1) # define AO_HAVE_fetch_and_add1_full #endif #if defined(AO_HAVE_fetch_and_add_release) \ && !defined(AO_HAVE_fetch_and_add1_release) # define AO_fetch_and_add1_release(addr) \ AO_fetch_and_add_release(addr, 1) # define AO_HAVE_fetch_and_add1_release #endif #if defined(AO_HAVE_fetch_and_add_acquire) \ && !defined(AO_HAVE_fetch_and_add1_acquire) # define AO_fetch_and_add1_acquire(addr) \ AO_fetch_and_add_acquire(addr, 1) # define AO_HAVE_fetch_and_add1_acquire #endif #if defined(AO_HAVE_fetch_and_add_write) \ && !defined(AO_HAVE_fetch_and_add1_write) # define AO_fetch_and_add1_write(addr) \ AO_fetch_and_add_write(addr, 1) # define AO_HAVE_fetch_and_add1_write #endif #if defined(AO_HAVE_fetch_and_add_read) \ && !defined(AO_HAVE_fetch_and_add1_read) # define AO_fetch_and_add1_read(addr) \ AO_fetch_and_add_read(addr, 1) # define AO_HAVE_fetch_and_add1_read #endif #if defined(AO_HAVE_fetch_and_add_release_write) \ && !defined(AO_HAVE_fetch_and_add1_release_write) # define AO_fetch_and_add1_release_write(addr) \ AO_fetch_and_add_release_write(addr, 1) # define AO_HAVE_fetch_and_add1_release_write #endif #if defined(AO_HAVE_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_fetch_and_add1_acquire_read) # define AO_fetch_and_add1_acquire_read(addr) \ AO_fetch_and_add_acquire_read(addr, 1) # define AO_HAVE_fetch_and_add1_acquire_read #endif #if defined(AO_HAVE_fetch_and_add) \ && !defined(AO_HAVE_fetch_and_add1) # define AO_fetch_and_add1(addr) AO_fetch_and_add(addr, 1) # define AO_HAVE_fetch_and_add1 #endif #if defined(AO_HAVE_fetch_and_add1_full) # if !defined(AO_HAVE_fetch_and_add1_release) # define AO_fetch_and_add1_release(addr) \ AO_fetch_and_add1_full(addr) # define AO_HAVE_fetch_and_add1_release # endif # if !defined(AO_HAVE_fetch_and_add1_acquire) # define AO_fetch_and_add1_acquire(addr) \ AO_fetch_and_add1_full(addr) # define AO_HAVE_fetch_and_add1_acquire # endif # if !defined(AO_HAVE_fetch_and_add1_write) # define AO_fetch_and_add1_write(addr) \ AO_fetch_and_add1_full(addr) # define AO_HAVE_fetch_and_add1_write # endif # if !defined(AO_HAVE_fetch_and_add1_read) # define AO_fetch_and_add1_read(addr) \ AO_fetch_and_add1_full(addr) # define AO_HAVE_fetch_and_add1_read # endif #endif /* AO_HAVE_fetch_and_add1_full */ #if !defined(AO_HAVE_fetch_and_add1) \ && defined(AO_HAVE_fetch_and_add1_release) # define AO_fetch_and_add1(addr) AO_fetch_and_add1_release(addr) # define AO_HAVE_fetch_and_add1 #endif #if !defined(AO_HAVE_fetch_and_add1) \ && defined(AO_HAVE_fetch_and_add1_acquire) # define AO_fetch_and_add1(addr) AO_fetch_and_add1_acquire(addr) # define AO_HAVE_fetch_and_add1 #endif #if !defined(AO_HAVE_fetch_and_add1) \ && defined(AO_HAVE_fetch_and_add1_write) # define AO_fetch_and_add1(addr) AO_fetch_and_add1_write(addr) # define AO_HAVE_fetch_and_add1 #endif #if !defined(AO_HAVE_fetch_and_add1) \ && defined(AO_HAVE_fetch_and_add1_read) # define AO_fetch_and_add1(addr) AO_fetch_and_add1_read(addr) # define AO_HAVE_fetch_and_add1 #endif #if defined(AO_HAVE_fetch_and_add1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_fetch_and_add1_full) # define AO_fetch_and_add1_full(addr) \ (AO_nop_full(), AO_fetch_and_add1_acquire(addr)) # define AO_HAVE_fetch_and_add1_full #endif #if !defined(AO_HAVE_fetch_and_add1_release_write) \ && defined(AO_HAVE_fetch_and_add1_write) # define AO_fetch_and_add1_release_write(addr) \ AO_fetch_and_add1_write(addr) # define AO_HAVE_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_fetch_and_add1_release_write) \ && defined(AO_HAVE_fetch_and_add1_release) # define AO_fetch_and_add1_release_write(addr) \ AO_fetch_and_add1_release(addr) # define AO_HAVE_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_fetch_and_add1_read) # define AO_fetch_and_add1_acquire_read(addr) \ AO_fetch_and_add1_read(addr) # define AO_HAVE_fetch_and_add1_acquire_read #endif #if !defined(AO_HAVE_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_fetch_and_add1_acquire) # define AO_fetch_and_add1_acquire_read(addr) \ AO_fetch_and_add1_acquire(addr) # define AO_HAVE_fetch_and_add1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_fetch_and_add1_acquire_read) # define AO_fetch_and_add1_dd_acquire_read(addr) \ AO_fetch_and_add1_acquire_read(addr) # define AO_HAVE_fetch_and_add1_dd_acquire_read # endif #else # if defined(AO_HAVE_fetch_and_add1) # define AO_fetch_and_add1_dd_acquire_read(addr) \ AO_fetch_and_add1(addr) # define AO_HAVE_fetch_and_add1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* fetch_and_sub1 */ #if defined(AO_HAVE_fetch_and_add_full) \ && !defined(AO_HAVE_fetch_and_sub1_full) # define AO_fetch_and_sub1_full(addr) \ AO_fetch_and_add_full(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1_full #endif #if defined(AO_HAVE_fetch_and_add_release) \ && !defined(AO_HAVE_fetch_and_sub1_release) # define AO_fetch_and_sub1_release(addr) \ AO_fetch_and_add_release(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1_release #endif #if defined(AO_HAVE_fetch_and_add_acquire) \ && !defined(AO_HAVE_fetch_and_sub1_acquire) # define AO_fetch_and_sub1_acquire(addr) \ AO_fetch_and_add_acquire(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1_acquire #endif #if defined(AO_HAVE_fetch_and_add_write) \ && !defined(AO_HAVE_fetch_and_sub1_write) # define AO_fetch_and_sub1_write(addr) \ AO_fetch_and_add_write(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1_write #endif #if defined(AO_HAVE_fetch_and_add_read) \ && !defined(AO_HAVE_fetch_and_sub1_read) # define AO_fetch_and_sub1_read(addr) \ AO_fetch_and_add_read(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1_read #endif #if defined(AO_HAVE_fetch_and_add_release_write) \ && !defined(AO_HAVE_fetch_and_sub1_release_write) # define AO_fetch_and_sub1_release_write(addr) \ AO_fetch_and_add_release_write(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1_release_write #endif #if defined(AO_HAVE_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_fetch_and_sub1_acquire_read) # define AO_fetch_and_sub1_acquire_read(addr) \ AO_fetch_and_add_acquire_read(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1_acquire_read #endif #if defined(AO_HAVE_fetch_and_add) \ && !defined(AO_HAVE_fetch_and_sub1) # define AO_fetch_and_sub1(addr) \ AO_fetch_and_add(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1 #endif #if defined(AO_HAVE_fetch_and_sub1_full) # if !defined(AO_HAVE_fetch_and_sub1_release) # define AO_fetch_and_sub1_release(addr) \ AO_fetch_and_sub1_full(addr) # define AO_HAVE_fetch_and_sub1_release # endif # if !defined(AO_HAVE_fetch_and_sub1_acquire) # define AO_fetch_and_sub1_acquire(addr) \ AO_fetch_and_sub1_full(addr) # define AO_HAVE_fetch_and_sub1_acquire # endif # if !defined(AO_HAVE_fetch_and_sub1_write) # define AO_fetch_and_sub1_write(addr) \ AO_fetch_and_sub1_full(addr) # define AO_HAVE_fetch_and_sub1_write # endif # if !defined(AO_HAVE_fetch_and_sub1_read) # define AO_fetch_and_sub1_read(addr) \ AO_fetch_and_sub1_full(addr) # define AO_HAVE_fetch_and_sub1_read # endif #endif /* AO_HAVE_fetch_and_sub1_full */ #if !defined(AO_HAVE_fetch_and_sub1) \ && defined(AO_HAVE_fetch_and_sub1_release) # define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_release(addr) # define AO_HAVE_fetch_and_sub1 #endif #if !defined(AO_HAVE_fetch_and_sub1) \ && defined(AO_HAVE_fetch_and_sub1_acquire) # define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_acquire(addr) # define AO_HAVE_fetch_and_sub1 #endif #if !defined(AO_HAVE_fetch_and_sub1) \ && defined(AO_HAVE_fetch_and_sub1_write) # define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_write(addr) # define AO_HAVE_fetch_and_sub1 #endif #if !defined(AO_HAVE_fetch_and_sub1) \ && defined(AO_HAVE_fetch_and_sub1_read) # define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_read(addr) # define AO_HAVE_fetch_and_sub1 #endif #if defined(AO_HAVE_fetch_and_sub1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_fetch_and_sub1_full) # define AO_fetch_and_sub1_full(addr) \ (AO_nop_full(), AO_fetch_and_sub1_acquire(addr)) # define AO_HAVE_fetch_and_sub1_full #endif #if !defined(AO_HAVE_fetch_and_sub1_release_write) \ && defined(AO_HAVE_fetch_and_sub1_write) # define AO_fetch_and_sub1_release_write(addr) \ AO_fetch_and_sub1_write(addr) # define AO_HAVE_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_fetch_and_sub1_release_write) \ && defined(AO_HAVE_fetch_and_sub1_release) # define AO_fetch_and_sub1_release_write(addr) \ AO_fetch_and_sub1_release(addr) # define AO_HAVE_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_fetch_and_sub1_read) # define AO_fetch_and_sub1_acquire_read(addr) \ AO_fetch_and_sub1_read(addr) # define AO_HAVE_fetch_and_sub1_acquire_read #endif #if !defined(AO_HAVE_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_fetch_and_sub1_acquire) # define AO_fetch_and_sub1_acquire_read(addr) \ AO_fetch_and_sub1_acquire(addr) # define AO_HAVE_fetch_and_sub1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_fetch_and_sub1_acquire_read) # define AO_fetch_and_sub1_dd_acquire_read(addr) \ AO_fetch_and_sub1_acquire_read(addr) # define AO_HAVE_fetch_and_sub1_dd_acquire_read # endif #else # if defined(AO_HAVE_fetch_and_sub1) # define AO_fetch_and_sub1_dd_acquire_read(addr) \ AO_fetch_and_sub1(addr) # define AO_HAVE_fetch_and_sub1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* and */ #if defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_and_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_and_full(volatile AO_t *addr, AO_t value) { AO_t old; do { old = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old, old & value))); } # define AO_HAVE_and_full #endif #if defined(AO_HAVE_and_full) # if !defined(AO_HAVE_and_release) # define AO_and_release(addr, val) AO_and_full(addr, val) # define AO_HAVE_and_release # endif # if !defined(AO_HAVE_and_acquire) # define AO_and_acquire(addr, val) AO_and_full(addr, val) # define AO_HAVE_and_acquire # endif # if !defined(AO_HAVE_and_write) # define AO_and_write(addr, val) AO_and_full(addr, val) # define AO_HAVE_and_write # endif # if !defined(AO_HAVE_and_read) # define AO_and_read(addr, val) AO_and_full(addr, val) # define AO_HAVE_and_read # endif #endif /* AO_HAVE_and_full */ #if !defined(AO_HAVE_and) && defined(AO_HAVE_and_release) # define AO_and(addr, val) AO_and_release(addr, val) # define AO_HAVE_and #endif #if !defined(AO_HAVE_and) && defined(AO_HAVE_and_acquire) # define AO_and(addr, val) AO_and_acquire(addr, val) # define AO_HAVE_and #endif #if !defined(AO_HAVE_and) && defined(AO_HAVE_and_write) # define AO_and(addr, val) AO_and_write(addr, val) # define AO_HAVE_and #endif #if !defined(AO_HAVE_and) && defined(AO_HAVE_and_read) # define AO_and(addr, val) AO_and_read(addr, val) # define AO_HAVE_and #endif #if defined(AO_HAVE_and_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_and_full) # define AO_and_full(addr, val) \ (AO_nop_full(), AO_and_acquire(addr, val)) # define AO_HAVE_and_full #endif #if !defined(AO_HAVE_and_release_write) \ && defined(AO_HAVE_and_write) # define AO_and_release_write(addr, val) AO_and_write(addr, val) # define AO_HAVE_and_release_write #endif #if !defined(AO_HAVE_and_release_write) \ && defined(AO_HAVE_and_release) # define AO_and_release_write(addr, val) AO_and_release(addr, val) # define AO_HAVE_and_release_write #endif #if !defined(AO_HAVE_and_acquire_read) \ && defined(AO_HAVE_and_read) # define AO_and_acquire_read(addr, val) AO_and_read(addr, val) # define AO_HAVE_and_acquire_read #endif #if !defined(AO_HAVE_and_acquire_read) \ && defined(AO_HAVE_and_acquire) # define AO_and_acquire_read(addr, val) AO_and_acquire(addr, val) # define AO_HAVE_and_acquire_read #endif /* or */ #if defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_or_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_or_full(volatile AO_t *addr, AO_t value) { AO_t old; do { old = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old, old | value))); } # define AO_HAVE_or_full #endif #if defined(AO_HAVE_or_full) # if !defined(AO_HAVE_or_release) # define AO_or_release(addr, val) AO_or_full(addr, val) # define AO_HAVE_or_release # endif # if !defined(AO_HAVE_or_acquire) # define AO_or_acquire(addr, val) AO_or_full(addr, val) # define AO_HAVE_or_acquire # endif # if !defined(AO_HAVE_or_write) # define AO_or_write(addr, val) AO_or_full(addr, val) # define AO_HAVE_or_write # endif # if !defined(AO_HAVE_or_read) # define AO_or_read(addr, val) AO_or_full(addr, val) # define AO_HAVE_or_read # endif #endif /* AO_HAVE_or_full */ #if !defined(AO_HAVE_or) && defined(AO_HAVE_or_release) # define AO_or(addr, val) AO_or_release(addr, val) # define AO_HAVE_or #endif #if !defined(AO_HAVE_or) && defined(AO_HAVE_or_acquire) # define AO_or(addr, val) AO_or_acquire(addr, val) # define AO_HAVE_or #endif #if !defined(AO_HAVE_or) && defined(AO_HAVE_or_write) # define AO_or(addr, val) AO_or_write(addr, val) # define AO_HAVE_or #endif #if !defined(AO_HAVE_or) && defined(AO_HAVE_or_read) # define AO_or(addr, val) AO_or_read(addr, val) # define AO_HAVE_or #endif #if defined(AO_HAVE_or_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_or_full) # define AO_or_full(addr, val) \ (AO_nop_full(), AO_or_acquire(addr, val)) # define AO_HAVE_or_full #endif #if !defined(AO_HAVE_or_release_write) \ && defined(AO_HAVE_or_write) # define AO_or_release_write(addr, val) AO_or_write(addr, val) # define AO_HAVE_or_release_write #endif #if !defined(AO_HAVE_or_release_write) \ && defined(AO_HAVE_or_release) # define AO_or_release_write(addr, val) AO_or_release(addr, val) # define AO_HAVE_or_release_write #endif #if !defined(AO_HAVE_or_acquire_read) && defined(AO_HAVE_or_read) # define AO_or_acquire_read(addr, val) AO_or_read(addr, val) # define AO_HAVE_or_acquire_read #endif #if !defined(AO_HAVE_or_acquire_read) \ && defined(AO_HAVE_or_acquire) # define AO_or_acquire_read(addr, val) AO_or_acquire(addr, val) # define AO_HAVE_or_acquire_read #endif /* xor */ #if defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_xor_full) AO_ATTR_NO_SANITIZE_THREAD AO_INLINE void AO_xor_full(volatile AO_t *addr, AO_t value) { AO_t old; do { old = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old, old ^ value))); } # define AO_HAVE_xor_full #endif #if defined(AO_HAVE_xor_full) # if !defined(AO_HAVE_xor_release) # define AO_xor_release(addr, val) AO_xor_full(addr, val) # define AO_HAVE_xor_release # endif # if !defined(AO_HAVE_xor_acquire) # define AO_xor_acquire(addr, val) AO_xor_full(addr, val) # define AO_HAVE_xor_acquire # endif # if !defined(AO_HAVE_xor_write) # define AO_xor_write(addr, val) AO_xor_full(addr, val) # define AO_HAVE_xor_write # endif # if !defined(AO_HAVE_xor_read) # define AO_xor_read(addr, val) AO_xor_full(addr, val) # define AO_HAVE_xor_read # endif #endif /* AO_HAVE_xor_full */ #if !defined(AO_HAVE_xor) && defined(AO_HAVE_xor_release) # define AO_xor(addr, val) AO_xor_release(addr, val) # define AO_HAVE_xor #endif #if !defined(AO_HAVE_xor) && defined(AO_HAVE_xor_acquire) # define AO_xor(addr, val) AO_xor_acquire(addr, val) # define AO_HAVE_xor #endif #if !defined(AO_HAVE_xor) && defined(AO_HAVE_xor_write) # define AO_xor(addr, val) AO_xor_write(addr, val) # define AO_HAVE_xor #endif #if !defined(AO_HAVE_xor) && defined(AO_HAVE_xor_read) # define AO_xor(addr, val) AO_xor_read(addr, val) # define AO_HAVE_xor #endif #if defined(AO_HAVE_xor_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_xor_full) # define AO_xor_full(addr, val) \ (AO_nop_full(), AO_xor_acquire(addr, val)) # define AO_HAVE_xor_full #endif #if !defined(AO_HAVE_xor_release_write) \ && defined(AO_HAVE_xor_write) # define AO_xor_release_write(addr, val) AO_xor_write(addr, val) # define AO_HAVE_xor_release_write #endif #if !defined(AO_HAVE_xor_release_write) \ && defined(AO_HAVE_xor_release) # define AO_xor_release_write(addr, val) AO_xor_release(addr, val) # define AO_HAVE_xor_release_write #endif #if !defined(AO_HAVE_xor_acquire_read) \ && defined(AO_HAVE_xor_read) # define AO_xor_acquire_read(addr, val) AO_xor_read(addr, val) # define AO_HAVE_xor_acquire_read #endif #if !defined(AO_HAVE_xor_acquire_read) \ && defined(AO_HAVE_xor_acquire) # define AO_xor_acquire_read(addr, val) AO_xor_acquire(addr, val) # define AO_HAVE_xor_acquire_read #endif /* and/or/xor_dd_acquire_read are meaningless. */ asymptote-3.05/libatomic_ops/src/atomic_ops_malloc.h0000644000000000000000000000523315031566105021441 0ustar rootroot/* * Copyright (c) 2005 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Almost lock-free malloc implementation based on stack implementation. */ /* See README_malloc.txt file for detailed usage rules. */ #ifndef AO_MALLOC_H #define AO_MALLOC_H #include "atomic_ops_stack.h" #include /* for size_t */ #ifdef __cplusplus extern "C" { #endif #ifdef AO_STACK_IS_LOCK_FREE # define AO_MALLOC_IS_LOCK_FREE #endif #ifndef AO_ATTR_MALLOC # if AO_GNUC_PREREQ(3, 1) # define AO_ATTR_MALLOC __attribute__((__malloc__)) # elif defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(__EDG__) # define AO_ATTR_MALLOC \ __declspec(allocator) __declspec(noalias) __declspec(restrict) # elif defined(_MSC_VER) && _MSC_VER >= 1400 # define AO_ATTR_MALLOC __declspec(noalias) __declspec(restrict) # else # define AO_ATTR_MALLOC /* empty */ # endif #endif #ifndef AO_ATTR_ALLOC_SIZE # ifdef __clang__ # if __has_attribute(__alloc_size__) # define AO_ATTR_ALLOC_SIZE(argnum) \ __attribute__((__alloc_size__(argnum))) # else # define AO_ATTR_ALLOC_SIZE(argnum) /* empty */ # endif # elif AO_GNUC_PREREQ(4, 3) && !defined(__ICC) # define AO_ATTR_ALLOC_SIZE(argnum) __attribute__((__alloc_size__(argnum))) # else # define AO_ATTR_ALLOC_SIZE(argnum) /* empty */ # endif #endif AO_API void AO_free(void *); AO_API AO_ATTR_MALLOC AO_ATTR_ALLOC_SIZE(1) void * AO_malloc(size_t); /* Allow use of mmap to grow the heap. No-op on some platforms. */ AO_API void AO_malloc_enable_mmap(void); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* !AO_MALLOC_H */ asymptote-3.05/libatomic_ops/src/atomic_ops.h0000644000000000000000000005306215031566105020115 0ustar rootroot/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * Copyright (c) 2008-2022 Ivan Maidanski * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef AO_ATOMIC_OPS_H #define AO_ATOMIC_OPS_H #include "atomic_ops/ao_version.h" /* Define version numbers here to allow */ /* test on build machines for cross-builds. */ #include #include /* We define various atomic operations on memory in a */ /* machine-specific way. Unfortunately, this is complicated */ /* by the fact that these may or may not be combined with */ /* various memory barriers. Thus the actual operations we */ /* define have the form AO__, for all */ /* plausible combinations of and . */ /* This of course results in a mild combinatorial explosion. */ /* To deal with it, we try to generate derived */ /* definitions for as many of the combinations as we can, as */ /* automatically as possible. */ /* */ /* Our assumption throughout is that the programmer will */ /* specify the least demanding operation and memory barrier */ /* that will guarantee correctness for the implementation. */ /* Our job is to find the least expensive way to implement it */ /* on the applicable hardware. In many cases that will */ /* involve, for example, a stronger memory barrier, or a */ /* combination of hardware primitives. */ /* */ /* Conventions: */ /* "plain" atomic operations are not guaranteed to include */ /* a barrier. The suffix in the name specifies the barrier */ /* type. Suffixes are: */ /* _release: Earlier operations may not be delayed past it. */ /* _acquire: Later operations may not move ahead of it. */ /* _read: Subsequent reads must follow this operation and */ /* preceding reads. */ /* _write: Earlier writes precede both this operation and */ /* later writes. */ /* _full: Ordered with respect to both earlier and later memory */ /* operations. */ /* _release_write: Ordered with respect to earlier writes. */ /* _acquire_read: Ordered with respect to later reads. */ /* */ /* Currently we try to define the following atomic memory */ /* operations, in combination with the above barriers: */ /* AO_nop */ /* AO_load */ /* AO_store */ /* AO_test_and_set (binary) */ /* AO_fetch_and_add */ /* AO_fetch_and_add1 */ /* AO_fetch_and_sub1 */ /* AO_and */ /* AO_or */ /* AO_xor */ /* AO_compare_and_swap */ /* AO_fetch_compare_and_swap */ /* */ /* Note that atomicity guarantees are valid only if both */ /* readers and writers use AO_ operations to access the */ /* shared value, while ordering constraints are intended to */ /* apply all memory operations. If a location can potentially */ /* be accessed simultaneously from multiple threads, and one of */ /* those accesses may be a write access, then all such */ /* accesses to that location should be through AO_ primitives. */ /* However if AO_ operations enforce sufficient ordering to */ /* ensure that a location x cannot be accessed concurrently, */ /* or can only be read concurrently, then x can be accessed */ /* via ordinary references and assignments. */ /* */ /* AO_compare_and_swap takes an address and an expected old */ /* value and a new value, and returns an int. Non-zero result */ /* indicates that it succeeded. */ /* AO_fetch_compare_and_swap takes an address and an expected */ /* old value and a new value, and returns the real old value. */ /* The operation succeeded if and only if the expected old */ /* value matches the old value returned. */ /* */ /* Test_and_set takes an address, atomically replaces it by */ /* AO_TS_SET, and returns the prior value. */ /* An AO_TS_t location can be reset with the */ /* AO_CLEAR macro, which normally uses AO_store_release. */ /* AO_fetch_and_add takes an address and an AO_t increment */ /* value. The AO_fetch_and_add1 and AO_fetch_and_sub1 variants */ /* are provided, since they allow faster implementations on */ /* some hardware. AO_and, AO_or, AO_xor do atomically and, or, */ /* xor (respectively) an AO_t value into a memory location, */ /* but do not provide access to the original. */ /* */ /* We expect this list to grow slowly over time. */ /* */ /* Note that AO_nop_full is a full memory barrier. */ /* */ /* Note that if some data is initialized with */ /* data.x = ...; data.y = ...; ... */ /* AO_store_release_write(&data_is_initialized, 1) */ /* then data is guaranteed to be initialized after the test */ /* if (AO_load_acquire_read(&data_is_initialized)) ... */ /* succeeds. Furthermore, this should generate near-optimal */ /* code on all common platforms. */ /* */ /* All operations operate on unsigned AO_t, which */ /* is the natural word size, and usually unsigned long. */ /* It is possible to check whether a particular operation op */ /* is available on a particular platform by checking whether */ /* AO_HAVE_op is defined. We make heavy use of these macros */ /* internally. */ /* The rest of this file basically has three sections: */ /* */ /* Some utility and default definitions. */ /* */ /* The architecture dependent section: */ /* This defines atomic operations that have direct hardware */ /* support on a particular platform, mostly by including the */ /* appropriate compiler- and hardware-dependent file. */ /* */ /* The synthesis section: */ /* This tries to define other atomic operations in terms of */ /* those that are explicitly available on the platform. */ /* This section is hardware independent. */ /* We make no attempt to synthesize operations in ways that */ /* effectively introduce locks, except for the debugging/demo */ /* pthread-based implementation at the beginning. A more */ /* realistic implementation that falls back to locks could be */ /* added as a higher layer. But that would sacrifice */ /* usability from signal handlers. */ /* The synthesis section is implemented almost entirely in */ /* atomic_ops/generalize.h. */ /* Some common defaults. Overridden for some architectures. */ #define AO_t size_t /* The test_and_set primitive returns an AO_TS_VAL_t value. */ /* AO_TS_t is the type of an in-memory test-and-set location. */ #define AO_TS_INITIALIZER ((AO_TS_t)AO_TS_CLEAR) /* Convenient internal macro to test version of GCC. */ #if defined(__GNUC__) && defined(__GNUC_MINOR__) # define AO_GNUC_PREREQ(major, minor) \ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((major) << 16) + (minor)) #else # define AO_GNUC_PREREQ(major, minor) 0 /* false */ #endif /* Convenient internal macro to test version of Clang. */ #if defined(__clang__) && defined(__clang_major__) # define AO_CLANG_PREREQ(major, minor) \ ((__clang_major__ << 16) + __clang_minor__ >= ((major) << 16) + (minor)) #else # define AO_CLANG_PREREQ(major, minor) 0 /* false */ #endif /* Platform-dependent stuff: */ #if (defined(__GNUC__) || defined(_MSC_VER) || defined(__INTEL_COMPILER) \ || defined(__DMC__) || defined(__WATCOMC__)) && !defined(AO_NO_INLINE) # define AO_INLINE static __inline #elif defined(__sun) && !defined(AO_NO_INLINE) # define AO_INLINE static inline #else # define AO_INLINE static #endif #if AO_GNUC_PREREQ(3, 0) && !defined(LINT2) # define AO_EXPECT_FALSE(expr) __builtin_expect(expr, 0) /* Equivalent to (expr) but predict that usually (expr) == 0. */ #else # define AO_EXPECT_FALSE(expr) (expr) #endif /* !__GNUC__ */ #if defined(__has_feature) /* __has_feature() is supported. */ # if __has_feature(address_sanitizer) # define AO_ADDRESS_SANITIZER # endif # if __has_feature(memory_sanitizer) # define AO_MEMORY_SANITIZER # endif # if __has_feature(thread_sanitizer) # define AO_THREAD_SANITIZER # endif #else # ifdef __SANITIZE_ADDRESS__ /* GCC v4.8+ */ # define AO_ADDRESS_SANITIZER # endif #endif /* !__has_feature */ #ifndef AO_ATTR_NO_SANITIZE_MEMORY # ifndef AO_MEMORY_SANITIZER # define AO_ATTR_NO_SANITIZE_MEMORY /* empty */ # elif AO_CLANG_PREREQ(3, 8) # define AO_ATTR_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory"))) # else # define AO_ATTR_NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory)) # endif #endif /* !AO_ATTR_NO_SANITIZE_MEMORY */ #ifndef AO_ATTR_NO_SANITIZE_THREAD # ifndef AO_THREAD_SANITIZER # define AO_ATTR_NO_SANITIZE_THREAD /* empty */ # elif AO_CLANG_PREREQ(3, 8) # define AO_ATTR_NO_SANITIZE_THREAD __attribute__((no_sanitize("thread"))) # else # define AO_ATTR_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread)) # endif #endif /* !AO_ATTR_NO_SANITIZE_THREAD */ #if (AO_GNUC_PREREQ(7, 5) || __STDC_VERSION__ >= 201112L) && !defined(LINT2) # define AO_ALIGNOF_SUPPORTED 1 #endif #if defined(AO_DLL) && !defined(AO_API) # ifdef AO_BUILD # if defined(__CEGCC__) || (defined(__MINGW32__) && !defined(__cplusplus)) # define AO_API __declspec(dllexport) # elif defined(_MSC_VER) || defined(__BORLANDC__) || defined(__CYGWIN__) \ || defined(__DMC__) || defined(__MINGW32__) || defined(__WATCOMC__) # define AO_API extern __declspec(dllexport) # endif # else # if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__CEGCC__) \ || defined(__CYGWIN__) || defined(__DMC__) # define AO_API __declspec(dllimport) # elif defined(__MINGW32_DELAY_LOAD__) # define AO_API __declspec(dllexport) # elif defined(__MINGW32__) || defined(__WATCOMC__) # define AO_API extern __declspec(dllimport) # endif # endif #endif /* AO_DLL */ #ifndef AO_API # define AO_API extern #endif #ifdef AO_ALIGNOF_SUPPORTED # define AO_ASSERT_ADDR_ALIGNED(addr) \ assert(((size_t)(addr) & (__alignof__(*(addr)) - 1)) == 0) #else # define AO_ASSERT_ADDR_ALIGNED(addr) \ assert(((size_t)(addr) & (sizeof(*(addr)) - 1)) == 0) #endif /* !AO_ALIGNOF_SUPPORTED */ #if defined(__GNUC__) && !defined(__INTEL_COMPILER) # define AO_compiler_barrier() __asm__ __volatile__("" : : : "memory") #elif defined(_MSC_VER) || defined(__DMC__) || defined(__BORLANDC__) \ || defined(__WATCOMC__) # if defined(_AMD64_) || defined(_M_X64) || _MSC_VER >= 1400 # if defined(_WIN32_WCE) /* # include */ # elif defined(_MSC_VER) # include # endif # pragma intrinsic(_ReadWriteBarrier) # define AO_compiler_barrier() _ReadWriteBarrier() /* We assume this does not generate a fence instruction. */ /* The documentation is a bit unclear. */ # else # define AO_compiler_barrier() __asm { } /* The preceding implementation may be preferable here too. */ /* But the documentation warns about VC++ 2003 and earlier. */ # endif #elif defined(__INTEL_COMPILER) # define AO_compiler_barrier() __memory_barrier() /* FIXME: Too strong? IA64-only? */ #elif defined(_HPUX_SOURCE) # if defined(__ia64) # include # define AO_compiler_barrier() _Asm_sched_fence() # else /* FIXME - We do not know how to do this. This is a guess. */ /* And probably a bad one. */ static volatile int AO_barrier_dummy; # define AO_compiler_barrier() (void)(AO_barrier_dummy = AO_barrier_dummy) # endif #else /* We conjecture that the following usually gives us the right */ /* semantics or an error. */ # define AO_compiler_barrier() asm("") #endif #if defined(AO_USE_PTHREAD_DEFS) # include "atomic_ops/sysdeps/generic_pthread.h" #endif /* AO_USE_PTHREAD_DEFS */ #if (defined(__CC_ARM) || defined(__ARMCC__)) && !defined(__GNUC__) \ && !defined(AO_USE_PTHREAD_DEFS) # include "atomic_ops/sysdeps/armcc/arm_v6.h" # define AO_GENERALIZE_TWICE #endif #if defined(__GNUC__) && !defined(AO_USE_PTHREAD_DEFS) \ && !defined(__INTEL_COMPILER) # if defined(__i386__) /* We don't define AO_USE_SYNC_CAS_BUILTIN for x86 here because */ /* it might require specifying additional options (like -march) */ /* or additional link libraries (if -march is not specified). */ # include "atomic_ops/sysdeps/gcc/x86.h" # elif defined(__x86_64__) # if AO_GNUC_PREREQ(4, 2) && !defined(AO_USE_SYNC_CAS_BUILTIN) /* It is safe to use __sync CAS built-in on this architecture. */ # define AO_USE_SYNC_CAS_BUILTIN # endif # include "atomic_ops/sysdeps/gcc/x86.h" # elif defined(__ia64__) # include "atomic_ops/sysdeps/gcc/ia64.h" # define AO_GENERALIZE_TWICE # elif defined(__hppa__) # include "atomic_ops/sysdeps/gcc/hppa.h" # define AO_CAN_EMUL_CAS # elif defined(__alpha__) # include "atomic_ops/sysdeps/gcc/alpha.h" # define AO_GENERALIZE_TWICE # elif defined(__s390__) # include "atomic_ops/sysdeps/gcc/s390.h" # elif defined(__sparc__) # include "atomic_ops/sysdeps/gcc/sparc.h" # define AO_CAN_EMUL_CAS # elif defined(__m68k__) # include "atomic_ops/sysdeps/gcc/m68k.h" # elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) \ || defined(__powerpc64__) || defined(__ppc64__) || defined(_ARCH_PPC) # include "atomic_ops/sysdeps/gcc/powerpc.h" # elif defined(__aarch64__) # include "atomic_ops/sysdeps/gcc/aarch64.h" # define AO_CAN_EMUL_CAS # elif defined(__arm__) # include "atomic_ops/sysdeps/gcc/arm.h" # define AO_CAN_EMUL_CAS # elif defined(__cris__) || defined(CRIS) # include "atomic_ops/sysdeps/gcc/cris.h" # define AO_CAN_EMUL_CAS # define AO_GENERALIZE_TWICE # elif defined(__mips__) # include "atomic_ops/sysdeps/gcc/mips.h" # elif defined(__sh__) || defined(SH4) # include "atomic_ops/sysdeps/gcc/sh.h" # define AO_CAN_EMUL_CAS # elif defined(__avr32__) # include "atomic_ops/sysdeps/gcc/avr32.h" # elif defined(__e2k__) # include "atomic_ops/sysdeps/gcc/e2k.h" # elif defined(__hexagon__) # include "atomic_ops/sysdeps/gcc/hexagon.h" # elif defined(__nios2__) # include "atomic_ops/sysdeps/gcc/generic.h" # define AO_CAN_EMUL_CAS # elif defined(__riscv) # include "atomic_ops/sysdeps/gcc/riscv.h" # elif defined(__tile__) # include "atomic_ops/sysdeps/gcc/tile.h" # else /* etc. */ # include "atomic_ops/sysdeps/gcc/generic.h" # endif #endif /* __GNUC__ && !AO_USE_PTHREAD_DEFS */ #if (defined(__IBMC__) || defined(__IBMCPP__)) && !defined(__GNUC__) \ && !defined(AO_USE_PTHREAD_DEFS) # if defined(__powerpc__) || defined(__powerpc) || defined(__ppc__) \ || defined(__PPC__) || defined(_M_PPC) || defined(_ARCH_PPC) \ || defined(_ARCH_PWR) # include "atomic_ops/sysdeps/ibmc/powerpc.h" # define AO_GENERALIZE_TWICE # endif #endif #if defined(__INTEL_COMPILER) && !defined(AO_USE_PTHREAD_DEFS) # if defined(__ia64__) # include "atomic_ops/sysdeps/icc/ia64.h" # define AO_GENERALIZE_TWICE # endif # if defined(__GNUC__) /* Intel Compiler in GCC compatible mode */ # if defined(__i386__) # include "atomic_ops/sysdeps/gcc/x86.h" # endif /* __i386__ */ # if defined(__x86_64__) # if (__INTEL_COMPILER > 1110) && !defined(AO_USE_SYNC_CAS_BUILTIN) # define AO_USE_SYNC_CAS_BUILTIN # endif # include "atomic_ops/sysdeps/gcc/x86.h" # endif /* __x86_64__ */ # endif #endif #if defined(_HPUX_SOURCE) && !defined(__GNUC__) && !defined(AO_USE_PTHREAD_DEFS) # if defined(__ia64) # include "atomic_ops/sysdeps/hpc/ia64.h" # define AO_GENERALIZE_TWICE # else # include "atomic_ops/sysdeps/hpc/hppa.h" # define AO_CAN_EMUL_CAS # endif #endif #if defined(_MSC_VER) || defined(__DMC__) || defined(__BORLANDC__) \ || (defined(__WATCOMC__) && defined(__NT__)) # if defined(_AMD64_) || defined(_M_X64) # include "atomic_ops/sysdeps/msftc/x86_64.h" # elif defined(_M_ARM64) # include "atomic_ops/sysdeps/msftc/arm64.h" # elif defined(_M_IX86) || defined(x86) # include "atomic_ops/sysdeps/msftc/x86.h" # elif defined(_M_ARM) || defined(ARM) || defined(_ARM_) # include "atomic_ops/sysdeps/msftc/arm.h" # define AO_GENERALIZE_TWICE # endif #endif #if defined(__sun) && !defined(__GNUC__) && !defined(AO_USE_PTHREAD_DEFS) /* Note: use -DAO_USE_PTHREAD_DEFS if Sun CC does not handle inline asm. */ # if defined(__i386) || defined(__x86_64) || defined(__amd64) # include "atomic_ops/sysdeps/sunc/x86.h" # endif #endif #if !defined(__GNUC__) && (defined(sparc) || defined(__sparc)) \ && !defined(AO_USE_PTHREAD_DEFS) # include "atomic_ops/sysdeps/sunc/sparc.h" # define AO_CAN_EMUL_CAS #endif #if (defined(AO_REQUIRE_CAS) && !defined(AO_HAVE_compare_and_swap) \ && !defined(AO_HAVE_fetch_compare_and_swap) \ && !defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_compare_and_swap_acquire) \ && !defined(AO_HAVE_fetch_compare_and_swap_acquire)) || defined(CPPCHECK) # if defined(AO_CAN_EMUL_CAS) # include "atomic_ops/sysdeps/emul_cas.h" # elif !defined(CPPCHECK) # error Cannot implement AO_compare_and_swap_full on this architecture. # endif #endif /* AO_REQUIRE_CAS && !AO_HAVE_compare_and_swap ... */ /* The most common way to clear a test-and-set location */ /* at the end of a critical section. */ #if defined(AO_AO_TS_T) && !defined(AO_HAVE_CLEAR) # define AO_CLEAR(addr) AO_store_release((AO_TS_t *)(addr), AO_TS_CLEAR) # define AO_HAVE_CLEAR #endif #if defined(AO_CHAR_TS_T) && !defined(AO_HAVE_CLEAR) # define AO_CLEAR(addr) AO_char_store_release((AO_TS_t *)(addr), AO_TS_CLEAR) # define AO_HAVE_CLEAR #endif /* The generalization section. */ #if !defined(AO_GENERALIZE_TWICE) && defined(AO_CAN_EMUL_CAS) \ && !defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_fetch_compare_and_swap_full) # define AO_GENERALIZE_TWICE #endif /* Theoretically we should repeatedly include atomic_ops/generalize.h. */ /* In fact, we observe that this converges after a small fixed number */ /* of iterations, usually one. */ #include "atomic_ops/generalize.h" #if !defined(AO_GENERALIZE_TWICE) \ && defined(AO_HAVE_compare_double_and_swap_double) \ && (!defined(AO_HAVE_double_load) || !defined(AO_HAVE_double_store)) # define AO_GENERALIZE_TWICE #endif #ifdef AO_T_IS_INT /* Included after the first generalization pass. */ # include "atomic_ops/sysdeps/ao_t_is_int.h" # ifndef AO_GENERALIZE_TWICE /* Always generalize again. */ # define AO_GENERALIZE_TWICE # endif #endif /* AO_T_IS_INT */ #ifdef AO_GENERALIZE_TWICE # include "atomic_ops/generalize.h" #endif /* For compatibility with version 0.4 and earlier */ #define AO_TS_T AO_TS_t #define AO_T AO_t #define AO_TS_VAL AO_TS_VAL_t #endif /* !AO_ATOMIC_OPS_H */ asymptote-3.05/libatomic_ops/src/atomic_ops_stack.h0000644000000000000000000002005215031566105021273 0ustar rootroot/* * Copyright (c) 2005 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * The implementation of the routines described here is covered by the GPL. * This header file is covered by the above license. */ /* Almost lock-free LIFO linked lists (linked stacks). */ #ifndef AO_STACK_H #define AO_STACK_H #include "atomic_ops.h" #ifndef AO_HAVE_double_t /* Can happen if we are using CAS emulation, since we do not want to */ /* force that here, in case other atomic_ops clients do not want it. */ # include "atomic_ops/sysdeps/standard_ao_double_t.h" #endif #ifdef __cplusplus extern "C" { #endif #ifdef AO_USE_ALMOST_LOCK_FREE /* Use the almost-non-blocking implementation regardless of the */ /* double-word CAS availability. */ #elif !defined(AO_HAVE_compare_double_and_swap_double) \ && !defined(AO_HAVE_compare_and_swap_double) \ && defined(AO_HAVE_compare_and_swap) # define AO_USE_ALMOST_LOCK_FREE #else /* If we have no compare-and-swap operation defined, we assume */ /* that we will actually be using CAS emulation. If we do that, */ /* it's cheaper to use the version-based implementation. */ # define AO_STACK_IS_LOCK_FREE #endif /* * These are not guaranteed to be completely lock-free. * List insertion may spin under extremely unlikely conditions. * It cannot deadlock due to recursive reentry unless AO_list_remove * is called while at least AO_BL_SIZE activations of * AO_list_remove are currently active in the same thread, i.e. * we must have at least AO_BL_SIZE recursive signal handler * invocations. * * All operations take an AO_list_aux argument. It is safe to * share a single AO_list_aux structure among all lists, but that * may increase contention. Any given list must always be accessed * with the same AO_list_aux structure. * * We make some machine-dependent assumptions: * - We have a compare-and-swap operation. * - At least AO_N_BITS low order bits in pointers are * zero and normally unused. * - size_t and pointers have the same size. * * We do use a fully lock-free implementation if double-width * compare-and-swap operations are available. */ /* AO_stack_aux should be treated as opaque. It is fully defined */ /* here, so it can be allocated, and also to facilitate debugging. */ /* Note: changing the value of AO_BL_SIZE leads to the ABI change. */ #ifndef AO_BL_SIZE # define AO_BL_SIZE 2 #endif /* The number of low order pointer bits we can use for a small */ /* version number. */ #if defined(__LP64__) || defined(_LP64) || defined(_WIN64) # define AO_N_BITS 3 #else # define AO_N_BITS 2 #endif #define AO_BIT_MASK ((1 << AO_N_BITS) - 1) #if AO_BL_SIZE > (1 << AO_N_BITS) # error AO_BL_SIZE too big #endif #ifndef AO_STACK_ATTR_ALLIGNED /* Enforce proper alignment of AO_stack_t.AO_pa to avoid the */ /* structure value to cross the CPU cache line boundary. */ /* A workaround for almost-lock-free push/pop test failures */ /* on aarch64, at least. */ # if AO_BL_SIZE == 1 /* AO_vp is double-word aligned, so no extra align of AO_pa is needed. */ # define AO_STACK_ATTR_ALLIGNED /* empty */ # elif AO_GNUC_PREREQ(3, 1) # define AO_STACK_LOG_BL_SZP1 (AO_BL_SIZE > 7 ? 4 : AO_BL_SIZE > 3 ? 3 : 2) # define AO_STACK_ATTR_ALLIGNED \ __attribute__((__aligned__(sizeof(AO_t) << AO_STACK_LOG_BL_SZP1))) # elif defined(_MSC_VER) && _MSC_VER >= 1400 /* Visual Studio 2005+ */ /* MS compiler accepts only a literal number in align, not expression. */ /* AO_STACK_ALLIGN_N is 1 << (AO_N_BITS + AO_STACK_LOG_BL_SZP1). */ # if AO_N_BITS > 2 && AO_BL_SIZE > 7 # define AO_STACK_ALLIGN_N 128 # elif (AO_N_BITS > 2 && AO_BL_SIZE > 3) || AO_BL_SIZE > 7 # define AO_STACK_ALLIGN_N 64 # elif AO_N_BITS > 2 || AO_BL_SIZE > 3 # define AO_STACK_ALLIGN_N 32 # else # define AO_STACK_ALLIGN_N 16 # endif # define AO_STACK_ATTR_ALLIGNED __declspec(align(AO_STACK_ALLIGN_N)) # else # define AO_STACK_ATTR_ALLIGNED /* TODO: alignment is not enforced */ # endif #endif /* !AO_STACK_ATTR_ALLIGNED */ typedef struct AO__stack_aux { volatile AO_t AO_stack_bl[AO_BL_SIZE]; } AO_stack_aux; struct AO__stack_ptr_aux { volatile AO_t AO_ptr; AO_stack_aux AO_aux; }; /* The AO stack type. Should be treated as opaque. */ /* Note: AO_stack_t variables are not intended to be local ones, */ /* otherwise it is the client responsibility to ensure they have */ /* double-word alignment. */ typedef union AO__stack { AO_STACK_ATTR_ALLIGNED struct AO__stack_ptr_aux AO_pa; volatile AO_double_t AO_vp; } AO_stack_t; /* The static initializer of the AO stack type. */ #define AO_STACK_INITIALIZER { /* .AO_pa= */ { 0, { {0} } } } #ifdef AO_USE_ALMOST_LOCK_FREE /* The following two routines should not normally be used directly. */ /* We make them visible here for the rare cases in which it makes */ /* sense to share the AO_stack_aux between stacks. */ AO_API void AO_stack_push_explicit_aux_release(volatile AO_t *list, AO_t *new_element, AO_stack_aux *); AO_API AO_t * AO_stack_pop_explicit_aux_acquire(volatile AO_t *list, AO_stack_aux *); #endif /* AO_USE_ALMOST_LOCK_FREE */ #ifndef AO_REAL_PTR_AS_MACRO /* The stack implementation knows only about the location of */ /* link fields in nodes, and nothing about the rest of the */ /* stack elements. Link fields hold an AO_t, which is not */ /* necessarily a real pointer. This converts the AO_t to a */ /* real (AO_t *) which is either NULL, or points at the link */ /* field in the next node. */ # define AO_REAL_NEXT_PTR(x) AO_stack_next_ptr(x) /* Convert an AO_stack_t to a pointer to the link field in */ /* the first element. */ # define AO_REAL_HEAD_PTR(x) AO_stack_head_ptr(&(x)) #elif defined(AO_USE_ALMOST_LOCK_FREE) # define AO_REAL_NEXT_PTR(x) (AO_t *)((x) & ~AO_BIT_MASK) # define AO_REAL_HEAD_PTR(x) AO_REAL_NEXT_PTR((x).AO_pa.AO_ptr) #else # define AO_REAL_NEXT_PTR(x) (AO_t *)(x) # define AO_REAL_HEAD_PTR(x) (AO_t *)((x).AO_vp.AO_val2 /* ptr */) #endif /* AO_REAL_PTR_AS_MACRO && !AO_USE_ALMOST_LOCK_FREE */ AO_API void AO_stack_push_release(AO_stack_t *list, AO_t *new_element); #define AO_HAVE_stack_push_release #define AO_stack_push(l, e) AO_stack_push_release(l, e) #define AO_HAVE_stack_push AO_API AO_t *AO_stack_pop_acquire(AO_stack_t *list); #define AO_HAVE_stack_pop_acquire #define AO_stack_pop(l) AO_stack_pop_acquire(l) #define AO_HAVE_stack_pop AO_API void AO_stack_init(AO_stack_t *list); AO_API int AO_stack_is_lock_free(void); AO_API AO_t *AO_stack_head_ptr(const AO_stack_t *list); AO_API AO_t *AO_stack_next_ptr(AO_t /* next */); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* !AO_STACK_H */ asymptote-3.05/libatomic_ops/src/Makefile.msft0000644000000000000000000000437615031566105020223 0ustar rootroot# # Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P. # # The really trivial win32/VC++ Makefile. Note that atomic_ops.c defines # only AO_pause (used by atomic_ops_stack). # And we rely on a pre-built test_atomic_include.h and generalize-small.h, # since we can't rely on sed. To run all the tests, type: # nmake -f Makefile.msft check # To install, copy atomic_ops.h and the atomic_ops/... tree to your favorite # include directory. #!include CFLAGS_EXTRA= CFLAGS=-O2 -W4 $(CFLAGS_EXTRA) LIB_OBJS=atomic_ops.obj LIB_GPL_OBJS=atomic_ops_malloc.obj atomic_ops_stack.obj all-disable-gpl: atomic_ops.lib all: all-disable-gpl atomic_ops_gpl.lib atomic_ops.obj: cl $(CFLAGS) -c atomic_ops.c atomic_ops_stack.obj: cl $(CFLAGS) -c atomic_ops_stack.c atomic_ops_malloc.obj: cl $(CFLAGS) /wd4127 -c atomic_ops_malloc.c atomic_ops.lib: $(LIB_OBJS) lib /out:atomic_ops.lib $(LIB_OBJS) atomic_ops_gpl.lib: $(LIB_GPL_OBJS) lib /out:atomic_ops_gpl.lib $(LIB_GPL_OBJS) ..\tests\test_atomic: ..\tests\test_atomic.c ..\tests\test_atomic_include.h cl $(CFLAGS) -I. ..\tests\test_atomic.c \ /Fo..\tests\test_atomic /Fe..\tests\test_atomic ..\tests\test_atomic_generalized: ..\tests\test_atomic.c \ ..\tests\test_atomic_include.h cl $(CFLAGS) -DAO_PREFER_GENERALIZED -I. ..\tests\test_atomic.c \ /Fo..\tests\test_atomic_generalized \ /Fe..\tests\test_atomic_generalized ..\tests\test_malloc: ..\tests\test_malloc.c atomic_ops.lib atomic_ops_gpl.lib cl $(CFLAGS) -I. ..\tests\test_malloc.c /Fo..\tests\test_malloc \ /Fe..\tests\test_malloc atomic_ops.lib atomic_ops_gpl.lib ..\tests\test_stack: ..\tests\test_stack.c atomic_ops.lib atomic_ops_gpl.lib cl $(CFLAGS) -I. ..\tests\test_stack.c /Fo..\tests\test_stack \ /Fe..\tests\test_stack atomic_ops.lib atomic_ops_gpl.lib check-deps: check-noautogen-deps ..\tests\test_atomic \ ..\tests\test_atomic_generalized check: check-deps check-noautogen @echo "The following will print some 'Missing ...' messages" ..\tests\test_atomic ..\tests\test_atomic_generalized check-noautogen-deps: ..\tests\test_malloc ..\tests\test_stack check-noautogen: check-noautogen-deps ..\tests\test_malloc ..\tests\test_stack clean: del *.obj atomic_ops*.lib ..\tests\*.obj ..\tests\*.exe asymptote-3.05/libatomic_ops/src/atomic_ops_stack.c0000644000000000000000000003304215031566105021271 0ustar rootroot/* * Copyright (c) 2005 Hewlett-Packard Development Company, L.P. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #if defined(HAVE_CONFIG_H) # include "config.h" #endif #include #include #include #ifndef AO_BUILD # define AO_BUILD #endif #ifndef AO_REAL_PTR_AS_MACRO # define AO_REAL_PTR_AS_MACRO #endif #define AO_REQUIRE_CAS #include "atomic_ops_stack.h" AO_API void AO_stack_init(AO_stack_t *list) { memset(list, 0, sizeof(AO_stack_t)); } AO_API int AO_stack_is_lock_free(void) { # ifdef AO_USE_ALMOST_LOCK_FREE return 0; # else return 1; # endif } AO_API AO_t *AO_stack_head_ptr(const AO_stack_t *list) { return AO_REAL_HEAD_PTR(*list); } AO_API AO_t *AO_stack_next_ptr(AO_t next) { return AO_REAL_NEXT_PTR(next); } /* This function call must be a part of a do-while loop with a CAS */ /* designating the condition of the loop (see the use cases below). */ #ifdef AO_THREAD_SANITIZER AO_ATTR_NO_SANITIZE_THREAD static void store_before_cas(AO_t *addr, AO_t value) { *addr = value; } #else # define store_before_cas(addr, value) (void)(*(addr) = (value)) #endif #ifdef AO_USE_ALMOST_LOCK_FREE # ifdef __cplusplus extern "C" { # endif AO_API void AO_pause(int); /* defined in atomic_ops.c */ # ifdef __cplusplus } /* extern "C" */ # endif # if defined(__alpha__) && (__GNUC__ == 4) /* Workaround __builtin_expect bug found in */ /* gcc-4.6.3/alpha causing test_stack failure. */ # undef AO_EXPECT_FALSE # define AO_EXPECT_FALSE(expr) (expr) # endif /* LIFO linked lists based on compare-and-swap. We need to avoid */ /* the case of a node deletion and reinsertion while I'm deleting */ /* it, since that may cause my CAS to succeed eventhough the next */ /* pointer is now wrong. Our solution is not fully lock-free, but it */ /* is good enough for signal handlers, provided we have a suitably */ /* low bound on the number of recursive signal handler reentries. */ /* A list consists of a first pointer and a blacklist of pointer */ /* values that are currently being removed. No list element on */ /* the blacklist may be inserted. If we would otherwise do so, we */ /* are allowed to insert a variant that differs only in the least */ /* significant, ignored, bits. If the list is full, we wait. */ /* Crucial observation: A particular padded pointer x (i.e. pointer */ /* plus arbitrary low order bits) can never be newly inserted into */ /* a list while it's in the corresponding auxiliary data structure. */ /* The second argument is a pointer to the link field of the element */ /* to be inserted. */ /* Both list headers and link fields contain "perturbed" pointers, */ /* i.e. pointers with extra bits or'ed into the low order bits. */ AO_API void AO_stack_push_explicit_aux_release(volatile AO_t *list, AO_t *x, AO_stack_aux *a) { AO_t x_bits = (AO_t)x; AO_t next; /* No deletions of x can start here, since x is not */ /* currently in the list. */ retry: do { next = AO_load_acquire(list); store_before_cas(x, next); { # if AO_BL_SIZE == 2 /* Start all loads as close to concurrently as possible. */ AO_t entry1 = AO_load(&a->AO_stack_bl[0]); AO_t entry2 = AO_load(&a->AO_stack_bl[1]); if (AO_EXPECT_FALSE(entry1 == x_bits || entry2 == x_bits)) # else int i; for (i = 0; i < AO_BL_SIZE; ++i) if (AO_EXPECT_FALSE(AO_load(&a->AO_stack_bl[i]) == x_bits)) # endif { /* Entry is currently being removed. Change it a little. */ ++x_bits; if ((x_bits & AO_BIT_MASK) == 0) /* Version count overflowed; EXTREMELY unlikely, but possible. */ x_bits = (AO_t)x; goto retry; } } /* x_bits value is not currently being deleted. */ } while (AO_EXPECT_FALSE(!AO_compare_and_swap_release(list, next, x_bits))); } /* I concluded experimentally that checking a value first before */ /* performing a compare-and-swap is usually beneficial on x86, but */ /* slows things down appreciably with contention on Itanium. */ /* Since the Itanium behavior makes more sense to me (more cache line */ /* movement unless we're mostly reading, but back-off should guard */ /* against that), we take Itanium as the default. Measurements on */ /* other multiprocessor architectures would be useful. */ /* (On a uniprocessor, the initial check is almost certainly a very */ /* small loss.) - HB */ # ifdef __i386__ # define PRECHECK(a) (a) == 0 && # else # define PRECHECK(a) # endif /* This function is used before CAS in the below AO_stack_pop and the */ /* data race (reported by TSan) is OK because it results in a retry. */ # ifdef AO_THREAD_SANITIZER AO_ATTR_NO_SANITIZE_THREAD static AO_t AO_load_next(const volatile AO_t *first_ptr) { /* Assuming an architecture on which loads of word type are */ /* atomic. AO_load cannot be used here because it cannot be */ /* instructed to suppress the warning about the race. */ return *first_ptr; } # else # define AO_load_next AO_load # endif AO_API AO_t *AO_stack_pop_explicit_aux_acquire(volatile AO_t *list, AO_stack_aux *a) { unsigned i; int j = 0; AO_t first; AO_t * first_ptr; AO_t next; retry: first = AO_load(list); if (0 == first) return 0; /* Insert first into aux black list. */ /* This may spin if more than AO_BL_SIZE removals using auxiliary */ /* structure a are currently in progress. */ for (i = 0; ; ) { if (PRECHECK(a -> AO_stack_bl[i]) AO_compare_and_swap_acquire(a->AO_stack_bl+i, 0, first)) break; if (++i >= AO_BL_SIZE) { i = 0; AO_pause(++j); } } # ifndef AO_THREAD_SANITIZER assert(a -> AO_stack_bl[i] == first); /* No actual race with the above CAS. */ # endif /* first is on the auxiliary black list. It may be removed by */ /* another thread before we get to it, but a new insertion of x */ /* cannot be started here. Only we can remove it from the black */ /* list. We need to make sure that first is still the first entry */ /* on the list. Otherwise it is possible that a reinsertion of it */ /* was already started before we added the black list entry. */ if (AO_EXPECT_FALSE(first != AO_load_acquire(list))) /* Workaround test failure on AIX, at least, by */ /* using acquire ordering semantics for this */ /* load. Probably, it is not the right fix. */ { AO_store_release(a->AO_stack_bl+i, 0); goto retry; } first_ptr = AO_REAL_NEXT_PTR(first); next = AO_load_next(first_ptr); if (AO_EXPECT_FALSE(!AO_compare_and_swap_release(list, first, next))) { AO_store_release(a->AO_stack_bl+i, 0); goto retry; } # ifndef AO_THREAD_SANITIZER assert(*list != first); /* No actual race with the above CAS. */ # endif /* Since we never insert an entry on the black list, this cannot */ /* have succeeded unless first remained on the list while we were */ /* running. Thus, its next link cannot have changed out from under */ /* us, and we removed exactly one entry and preserved the rest of */ /* the list. Note that it is quite possible that an additional */ /* entry was inserted and removed while we were running; this is OK */ /* since the part of the list following first must have remained */ /* unchanged, and first must again have been at the head of the */ /* list when the compare_and_swap succeeded. */ AO_store_release(a->AO_stack_bl+i, 0); return first_ptr; } AO_API void AO_stack_push_release(AO_stack_t *list, AO_t *x) { AO_stack_push_explicit_aux_release(&list->AO_pa.AO_ptr, x, &list->AO_pa.AO_aux); } AO_API AO_t *AO_stack_pop_acquire(AO_stack_t *list) { return AO_stack_pop_explicit_aux_acquire(&list->AO_pa.AO_ptr, &list->AO_pa.AO_aux); } #else /* !AO_USE_ALMOST_LOCK_FREE */ /* The functionality is the same as of AO_load_next but the atomicity */ /* is not needed. The usage is similar to that of store_before_cas. */ # if defined(AO_THREAD_SANITIZER) \ && (defined(AO_HAVE_compare_and_swap_double) \ || defined(AO_HAVE_compare_double_and_swap_double)) /* TODO: If compiled by Clang (as of clang-4.0) with -O3 flag, */ /* no_sanitize attribute is ignored unless the argument is volatile.*/ # if defined(__clang__) # define LOAD_BEFORE_CAS_VOLATILE volatile # else # define LOAD_BEFORE_CAS_VOLATILE /* empty */ # endif AO_ATTR_NO_SANITIZE_THREAD static AO_t load_before_cas(const LOAD_BEFORE_CAS_VOLATILE AO_t *addr) { return *addr; } # else # define load_before_cas(addr) (*(addr)) # endif /* !AO_THREAD_SANITIZER */ /* Better names for fields in AO_stack_t. */ # define version AO_vp.AO_val1 # define ptr AO_vp.AO_val2 # if defined(AO_HAVE_compare_double_and_swap_double) \ && !(defined(AO_STACK_PREFER_CAS_DOUBLE) \ && defined(AO_HAVE_compare_and_swap_double)) # ifdef LINT2 volatile /* non-static */ AO_t AO_noop_sink; # endif AO_API void AO_stack_push_release(AO_stack_t *list, AO_t *element) { AO_t next; do { next = AO_load(&list->ptr); store_before_cas(element, next); } while (AO_EXPECT_FALSE(!AO_compare_and_swap_release(&list->ptr, next, (AO_t)element))); /* This uses a narrow CAS here, an old optimization suggested */ /* by Treiber. Pop is still safe, since we run into the ABA */ /* problem only if there were both intervening pops and pushes. */ /* In that case we still see a change in the version number. */ # ifdef LINT2 /* Instruct static analyzer that element is not lost. */ AO_noop_sink = (AO_t)element; # endif } AO_API AO_t *AO_stack_pop_acquire(AO_stack_t *list) { # if defined(__clang__) && !AO_CLANG_PREREQ(3, 5) AO_t *volatile cptr; /* Use volatile to workaround a bug in */ /* clang-1.1/x86 causing test_stack failure. */ # else AO_t *cptr; # endif AO_t next; AO_t cversion; do { /* Version must be loaded first. */ cversion = AO_load_acquire(&list->version); cptr = (AO_t *)AO_load(&list->ptr); if (NULL == cptr) return NULL; next = load_before_cas((/* no volatile */ AO_t *)cptr); } while (AO_EXPECT_FALSE(!AO_compare_double_and_swap_double_release( &list->AO_vp, cversion, (AO_t)cptr, cversion+1, next))); return cptr; } # elif defined(AO_HAVE_compare_and_swap_double) /* Needed for future IA64 processors. No current clients? */ /* TODO: Not tested thoroughly. */ /* We have a wide CAS, but only does an AO_t-wide comparison. */ /* We cannot use the Treiber optimization, since we only check */ /* for an unchanged version number, not an unchanged pointer. */ AO_API void AO_stack_push_release(AO_stack_t *list, AO_t *element) { AO_t cversion; do { AO_t next_ptr; /* Again version must be loaded first, for different reason. */ cversion = AO_load_acquire(&list->version); next_ptr = AO_load(&list->ptr); store_before_cas(element, next_ptr); } while (!AO_compare_and_swap_double_release(&list->AO_vp, cversion, cversion+1, (AO_t)element)); } AO_API AO_t *AO_stack_pop_acquire(AO_stack_t *list) { AO_t *cptr; AO_t next; AO_t cversion; do { cversion = AO_load_acquire(&list->version); cptr = (AO_t *)AO_load(&list->ptr); if (NULL == cptr) return NULL; next = load_before_cas(cptr); } while (!AO_compare_double_and_swap_double_release(&list->AO_vp, cversion, (AO_t)cptr, cversion+1, next)); return cptr; } # endif /* AO_HAVE_compare_and_swap_double */ # undef ptr # undef version #endif /* !AO_USE_ALMOST_LOCK_FREE */ asymptote-3.05/libatomic_ops/src/Makefile.am0000644000000000000000000002625415031566105017646 0ustar rootroot # Info (current:revision:age) for the Libtool versioning system. # These numbers should be updated at most once just before the release, # and, optionally, at most once during the development (after the release). LIBATOMIC_OPS_VER_INFO = 3:0:2 LIBATOMIC_OPS_GPL_VER_INFO = 3:1:2 AM_CFLAGS=@PICFLAG@ AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src CFLAGS += $(CFLAGS_EXTRA) include_HEADERS = atomic_ops.h lib_LTLIBRARIES = libatomic_ops.la if NEED_ASM libatomic_ops_la_SOURCES = atomic_ops.c atomic_ops_sysdeps.S else libatomic_ops_la_SOURCES = atomic_ops.c endif libatomic_ops_la_LDFLAGS = -version-info $(LIBATOMIC_OPS_VER_INFO) \ -no-undefined if ENABLE_GPL include_HEADERS += atomic_ops_malloc.h atomic_ops_stack.h lib_LTLIBRARIES += libatomic_ops_gpl.la libatomic_ops_gpl_la_SOURCES = atomic_ops_stack.c atomic_ops_malloc.c libatomic_ops_gpl_la_LDFLAGS = -version-info $(LIBATOMIC_OPS_GPL_VER_INFO) \ -no-undefined libatomic_ops_gpl_la_LIBADD = libatomic_ops.la endif EXTRA_DIST = Makefile.msft atomic_ops/sysdeps/README \ atomic_ops/generalize-arithm.template \ atomic_ops/generalize-small.template \ atomic_ops/sysdeps/ao_t_is_int.template \ atomic_ops/sysdeps/gcc/generic-arithm.template \ atomic_ops/sysdeps/gcc/generic-small.template \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template \ atomic_ops/sysdeps/loadstore/atomic_load.template \ atomic_ops/sysdeps/loadstore/atomic_store.template \ atomic_ops/sysdeps/loadstore/ordered_loads_only.template \ atomic_ops/sysdeps/loadstore/ordered_stores_only.template \ atomic_ops/sysdeps/sunc/sparc.S BUILT_SOURCES = atomic_ops/generalize-arithm.h \ atomic_ops/generalize-small.h \ atomic_ops/sysdeps/ao_t_is_int.h \ atomic_ops/sysdeps/gcc/generic-arithm.h \ atomic_ops/sysdeps/gcc/generic-small.h \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.h \ atomic_ops/sysdeps/loadstore/atomic_load.h \ atomic_ops/sysdeps/loadstore/atomic_store.h \ atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h \ atomic_ops/sysdeps/loadstore/char_atomic_load.h \ atomic_ops/sysdeps/loadstore/char_atomic_store.h \ atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h \ atomic_ops/sysdeps/loadstore/int_atomic_load.h \ atomic_ops/sysdeps/loadstore/int_atomic_store.h \ atomic_ops/sysdeps/loadstore/ordered_loads_only.h \ atomic_ops/sysdeps/loadstore/ordered_stores_only.h \ atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h \ atomic_ops/sysdeps/loadstore/short_atomic_load.h \ atomic_ops/sysdeps/loadstore/short_atomic_store.h #Private Headers privatedir=${includedir}/ nobase_private_HEADERS = atomic_ops/ao_version.h \ atomic_ops/generalize.h \ $(BUILT_SOURCES) \ \ atomic_ops/sysdeps/all_acquire_release_volatile.h \ atomic_ops/sysdeps/all_aligned_atomic_load_store.h \ atomic_ops/sysdeps/all_atomic_load_store.h \ atomic_ops/sysdeps/all_atomic_only_load.h \ atomic_ops/sysdeps/emul_cas.h \ atomic_ops/sysdeps/generic_pthread.h \ atomic_ops/sysdeps/ordered.h \ atomic_ops/sysdeps/ordered_except_wr.h \ atomic_ops/sysdeps/read_ordered.h \ atomic_ops/sysdeps/standard_ao_double_t.h \ atomic_ops/sysdeps/test_and_set_t_is_ao_t.h \ atomic_ops/sysdeps/test_and_set_t_is_char.h \ \ atomic_ops/sysdeps/armcc/arm_v6.h \ \ atomic_ops/sysdeps/gcc/aarch64.h \ atomic_ops/sysdeps/gcc/alpha.h \ atomic_ops/sysdeps/gcc/arm.h \ atomic_ops/sysdeps/gcc/avr32.h \ atomic_ops/sysdeps/gcc/cris.h \ atomic_ops/sysdeps/gcc/e2k.h \ atomic_ops/sysdeps/gcc/generic.h \ atomic_ops/sysdeps/gcc/hexagon.h \ atomic_ops/sysdeps/gcc/hppa.h \ atomic_ops/sysdeps/gcc/ia64.h \ atomic_ops/sysdeps/gcc/m68k.h \ atomic_ops/sysdeps/gcc/mips.h \ atomic_ops/sysdeps/gcc/powerpc.h \ atomic_ops/sysdeps/gcc/riscv.h \ atomic_ops/sysdeps/gcc/s390.h \ atomic_ops/sysdeps/gcc/sh.h \ atomic_ops/sysdeps/gcc/sparc.h \ atomic_ops/sysdeps/gcc/tile.h \ atomic_ops/sysdeps/gcc/x86.h \ \ atomic_ops/sysdeps/hpc/hppa.h \ atomic_ops/sysdeps/hpc/ia64.h \ \ atomic_ops/sysdeps/ibmc/powerpc.h \ \ atomic_ops/sysdeps/icc/ia64.h \ \ atomic_ops/sysdeps/loadstore/double_atomic_load_store.h \ \ atomic_ops/sysdeps/msftc/arm.h \ atomic_ops/sysdeps/msftc/arm64.h \ atomic_ops/sysdeps/msftc/common32_defs.h \ atomic_ops/sysdeps/msftc/x86.h \ atomic_ops/sysdeps/msftc/x86_64.h \ \ atomic_ops/sysdeps/sunc/sparc.h \ atomic_ops/sysdeps/sunc/x86.h atomic_ops/generalize-small.h: atomic_ops/generalize-small.template mkdir -p `dirname $@` sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g $? >> $@ atomic_ops/generalize-arithm.h: atomic_ops/generalize-arithm.template mkdir -p `dirname $@` sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ atomic_ops/sysdeps/ao_t_is_int.h: atomic_ops/sysdeps/ao_t_is_int.template mkdir -p `dirname $@` sed -e s:_XBAR::g $? > $@ sed -e s:XBAR:full:g $? >> $@ sed -e s:XBAR:acquire:g $? >> $@ sed -e s:XBAR:release:g $? >> $@ sed -e s:XBAR:write:g $? >> $@ sed -e s:XBAR:read:g $? >> $@ atomic_ops/sysdeps/gcc/generic-arithm.h: \ atomic_ops/sysdeps/gcc/generic-arithm.template mkdir -p `dirname $@` sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? >> $@ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? >> $@ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? >> $@ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ atomic_ops/sysdeps/gcc/generic-small.h: \ atomic_ops/sysdeps/gcc/generic-small.template mkdir -p `dirname $@` sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ atomic_ops/sysdeps/loadstore/ordered_loads_only.h: \ atomic_ops/sysdeps/loadstore/ordered_loads_only.template mkdir -p `dirname $@` sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g $? >> $@ atomic_ops/sysdeps/loadstore/ordered_stores_only.h: \ atomic_ops/sysdeps/loadstore/ordered_stores_only.template mkdir -p `dirname $@` sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g $? >> $@ atomic_ops/sysdeps/loadstore/acquire_release_volatile.h: \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template mkdir -p `dirname $@` sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? > $@ atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h: \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template mkdir -p `dirname $@` sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h: \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template mkdir -p `dirname $@` sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? > $@ atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h: \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template mkdir -p `dirname $@` sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? > $@ atomic_ops/sysdeps/loadstore/atomic_load.h: \ atomic_ops/sysdeps/loadstore/atomic_load.template mkdir -p `dirname $@` sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? > $@ atomic_ops/sysdeps/loadstore/char_atomic_load.h: \ atomic_ops/sysdeps/loadstore/atomic_load.template mkdir -p `dirname $@` sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ atomic_ops/sysdeps/loadstore/int_atomic_load.h: \ atomic_ops/sysdeps/loadstore/atomic_load.template mkdir -p `dirname $@` sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? > $@ atomic_ops/sysdeps/loadstore/short_atomic_load.h: \ atomic_ops/sysdeps/loadstore/atomic_load.template mkdir -p `dirname $@` sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? > $@ atomic_ops/sysdeps/loadstore/atomic_store.h: \ atomic_ops/sysdeps/loadstore/atomic_store.template mkdir -p `dirname $@` sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? > $@ atomic_ops/sysdeps/loadstore/char_atomic_store.h: \ atomic_ops/sysdeps/loadstore/atomic_store.template mkdir -p `dirname $@` sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ atomic_ops/sysdeps/loadstore/int_atomic_store.h: \ atomic_ops/sysdeps/loadstore/atomic_store.template mkdir -p `dirname $@` sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? > $@ atomic_ops/sysdeps/loadstore/short_atomic_store.h: \ atomic_ops/sysdeps/loadstore/atomic_store.template mkdir -p `dirname $@` sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? > $@ asymptote-3.05/libatomic_ops/src/atomic_ops_malloc.c0000644000000000000000000002530615031566105021437 0ustar rootroot/* * Copyright (c) 2005 Hewlett-Packard Development Company, L.P. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #if defined(HAVE_CONFIG_H) # include "config.h" #endif #ifdef DONT_USE_MMAP /* for testing */ # undef HAVE_MMAP #endif #ifndef AO_BUILD # define AO_BUILD #endif #define AO_REQUIRE_CAS #include "atomic_ops_malloc.h" #include /* for ffs, which is assumed reentrant. */ #include #include #ifdef AO_TRACE_MALLOC # include # include #endif #if defined(AO_ADDRESS_SANITIZER) && !defined(AO_NO_MALLOC_POISON) /* #include "sanitizer/asan_interface.h" */ void __asan_poison_memory_region(void *, size_t); void __asan_unpoison_memory_region(void *, size_t); # define ASAN_POISON_MEMORY_REGION(addr, size) \ __asan_poison_memory_region(addr, size) # define ASAN_UNPOISON_MEMORY_REGION(addr, size) \ __asan_unpoison_memory_region(addr, size) #else # define ASAN_POISON_MEMORY_REGION(addr, size) (void)0 # define ASAN_UNPOISON_MEMORY_REGION(addr, size) (void)0 #endif /* !AO_ADDRESS_SANITIZER */ #if (defined(_WIN32_WCE) || defined(__MINGW32CE__)) && !defined(AO_HAVE_abort) # define abort() _exit(-1) /* there is no abort() in WinCE */ #endif /* * We round up each allocation request to the next power of two * minus one word. * We keep one stack of free objects for each size. Each object * has an initial word (offset -sizeof(AO_t) from the visible pointer) * which contains either * The binary log of the object size in bytes (small objects) * The object size (a multiple of CHUNK_SIZE) for large objects. * The second case only arises if mmap-based allocation is supported. * We align the user-visible part of each object on an ALIGNMENT * byte boundary. That means that the actual (hidden) start of * the object starts a word before this boundary. */ #ifndef LOG_MAX_SIZE # define LOG_MAX_SIZE 16 /* We assume that 2**LOG_MAX_SIZE is a multiple of page size. */ #endif #ifndef ALIGNMENT # define ALIGNMENT 16 /* Assumed to be at least sizeof(AO_t). */ #endif #define CHUNK_SIZE (1 << LOG_MAX_SIZE) #ifndef AO_INITIAL_HEAP_SIZE # define AO_INITIAL_HEAP_SIZE (2*(LOG_MAX_SIZE+1)*CHUNK_SIZE) #endif char AO_initial_heap[AO_INITIAL_HEAP_SIZE]; static volatile AO_t initial_heap_ptr = (AO_t)AO_initial_heap; #if defined(HAVE_MMAP) #include #include #include #include #if defined(MAP_ANONYMOUS) || defined(MAP_ANON) # define USE_MMAP_ANON #endif #ifdef USE_MMAP_FIXED # define GC_MMAP_FLAGS (MAP_FIXED | MAP_PRIVATE) /* Seems to yield better performance on Solaris 2, but can */ /* be unreliable if something is already mapped at the address. */ #else # define GC_MMAP_FLAGS MAP_PRIVATE #endif #ifdef USE_MMAP_ANON # if defined(CPPCHECK) # define OPT_MAP_ANON 0x20 /* taken from linux */ # elif defined(MAP_ANONYMOUS) # define OPT_MAP_ANON MAP_ANONYMOUS # else # define OPT_MAP_ANON MAP_ANON # endif #else # include /* for close() */ # define OPT_MAP_ANON 0 #endif static volatile AO_t mmap_enabled = 0; AO_API void AO_malloc_enable_mmap(void) { # if defined(__sun) AO_store_release(&mmap_enabled, 1); /* Workaround for Sun CC */ # else AO_store(&mmap_enabled, 1); # endif } static char *get_mmaped(size_t sz) { char * result; # ifdef USE_MMAP_ANON # define zero_fd -1 # else int zero_fd; # endif assert(!(sz & (CHUNK_SIZE - 1))); if (!mmap_enabled) return 0; # ifndef USE_MMAP_ANON zero_fd = open("/dev/zero", O_RDONLY); if (zero_fd == -1) return 0; # endif result = (char *)mmap(0, sz, PROT_READ | PROT_WRITE, GC_MMAP_FLAGS | OPT_MAP_ANON, zero_fd, 0 /* offset */); # ifndef USE_MMAP_ANON close(zero_fd); # endif if (AO_EXPECT_FALSE(result == MAP_FAILED)) result = NULL; return result; } #ifndef SIZE_MAX # include #endif #if defined(SIZE_MAX) && !defined(CPPCHECK) # define AO_SIZE_MAX ((size_t)SIZE_MAX) /* Extra cast to workaround some buggy SIZE_MAX definitions. */ #else # define AO_SIZE_MAX (~(size_t)0) #endif /* Saturated addition of size_t values. Used to avoid value wrap */ /* around on overflow. The arguments should have no side effects. */ #define SIZET_SAT_ADD(a, b) \ (AO_EXPECT_FALSE((a) >= AO_SIZE_MAX - (b)) ? AO_SIZE_MAX : (a) + (b)) /* Allocate an object of size (incl. header) of size > CHUNK_SIZE. */ /* sz includes space for an AO_t-sized header. */ static char * AO_malloc_large(size_t sz) { void *result; /* The header will force us to waste ALIGNMENT bytes, incl. header. */ /* Round to multiple of CHUNK_SIZE. */ sz = SIZET_SAT_ADD(sz, ALIGNMENT + CHUNK_SIZE - 1) & ~(CHUNK_SIZE - 1); assert(sz > LOG_MAX_SIZE); result = get_mmaped(sz); if (AO_EXPECT_FALSE(NULL == result)) return NULL; result = (AO_t *)result + ALIGNMENT / sizeof(AO_t); ((AO_t *)result)[-1] = (AO_t)sz; return (char *)result; } static void AO_free_large(void *p) { AO_t sz = ((AO_t *)p)[-1]; if (munmap((AO_t *)p - ALIGNMENT / sizeof(AO_t), (size_t)sz) != 0) abort(); /* Programmer error. Not really async-signal-safe, but ... */ } #else /* No MMAP */ AO_API void AO_malloc_enable_mmap(void) { } #define get_mmaped(sz) ((char*)0) #define AO_malloc_large(sz) ((char*)0) #define AO_free_large(p) abort() /* Programmer error. Not really async-signal-safe, but ... */ #endif /* No MMAP */ static char * get_chunk(void) { char *my_chunk_ptr; for (;;) { char *initial_ptr = (char *)AO_load(&initial_heap_ptr); my_chunk_ptr = (char *)(((AO_t)initial_ptr + (ALIGNMENT - 1)) & ~(ALIGNMENT - 1)); if (initial_ptr != my_chunk_ptr) { /* Align correctly. If this fails, someone else did it for us. */ (void)AO_compare_and_swap_acquire(&initial_heap_ptr, (AO_t)initial_ptr, (AO_t)my_chunk_ptr); } if (AO_EXPECT_FALSE((AO_t)my_chunk_ptr - (AO_t)AO_initial_heap > (size_t)(AO_INITIAL_HEAP_SIZE - CHUNK_SIZE))) { /* We failed. The initial heap is used up. */ my_chunk_ptr = get_mmaped(CHUNK_SIZE); # if !defined(CPPCHECK) assert(((AO_t)my_chunk_ptr & (ALIGNMENT-1)) == 0); # endif break; } if (AO_compare_and_swap(&initial_heap_ptr, (AO_t)my_chunk_ptr, (AO_t)(my_chunk_ptr + CHUNK_SIZE))) { break; } } return my_chunk_ptr; } /* Object free lists. Ith entry corresponds to objects */ /* of total size 2**i bytes. */ static AO_stack_t AO_free_list[LOG_MAX_SIZE+1]; /* Break up the chunk, and add it to the object free list for */ /* the given size. We have exclusive access to chunk. */ static void add_chunk_as(void * chunk, unsigned log_sz) { size_t ofs, limit; size_t sz = (size_t)1 << log_sz; assert((size_t)CHUNK_SIZE >= sz); assert(sz % sizeof(AO_t) == 0); limit = (size_t)CHUNK_SIZE - sz; for (ofs = ALIGNMENT - sizeof(AO_t); ofs <= limit; ofs += sz) { ASAN_POISON_MEMORY_REGION((char *)chunk + ofs + sizeof(AO_t), sz - sizeof(AO_t)); AO_stack_push(&AO_free_list[log_sz], (AO_t *)chunk + ofs / sizeof(AO_t)); } } static const unsigned char msbs[16] = { 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4 }; /* Return the position of the most significant set bit in the */ /* argument. */ /* We follow the conventions of ffs(), i.e. the least */ /* significant bit is number one. */ static unsigned msb(size_t s) { unsigned result = 0; if ((s & 0xff) != s) { # if (__SIZEOF_SIZE_T__ == 8) && !defined(CPPCHECK) unsigned v = (unsigned)(s >> 32); if (AO_EXPECT_FALSE(v != 0)) { s = v; result += 32; } # elif __SIZEOF_SIZE_T__ == 4 /* No op. */ # else unsigned v; /* The following is a tricky code ought to be equivalent to */ /* "(v = s >> 32) != 0" but suppresses warnings on 32-bit arch's. */ # define SIZEOF_SIZE_T_GT_4 (sizeof(size_t) > 4) if (SIZEOF_SIZE_T_GT_4 && (v = (unsigned)(s >> (SIZEOF_SIZE_T_GT_4 ? 32 : 0))) != 0) { s = v; result += 32; } # endif /* !defined(__SIZEOF_SIZE_T__) */ if (AO_EXPECT_FALSE((s >> 16) != 0)) { s >>= 16; result += 16; } if ((s >> 8) != 0) { s >>= 8; result += 8; } } if (s > 15) { s >>= 4; result += 4; } result += msbs[s]; return result; } AO_API AO_ATTR_MALLOC AO_ATTR_ALLOC_SIZE(1) void * AO_malloc(size_t sz) { AO_t *result; unsigned log_sz; if (AO_EXPECT_FALSE(sz > CHUNK_SIZE - sizeof(AO_t))) return AO_malloc_large(sz); log_sz = msb(sz + (sizeof(AO_t) - 1)); assert(log_sz <= LOG_MAX_SIZE); assert(((size_t)1 << log_sz) >= sz + sizeof(AO_t)); result = AO_stack_pop(AO_free_list+log_sz); while (AO_EXPECT_FALSE(NULL == result)) { void * chunk = get_chunk(); if (AO_EXPECT_FALSE(NULL == chunk)) return NULL; add_chunk_as(chunk, log_sz); result = AO_stack_pop(AO_free_list+log_sz); } *result = log_sz; # ifdef AO_TRACE_MALLOC fprintf(stderr, "%p: AO_malloc(%lu) = %p\n", (void *)pthread_self(), (unsigned long)sz, (void *)(result + 1)); # endif ASAN_UNPOISON_MEMORY_REGION(result + 1, sz); return result + 1; } AO_API void AO_free(void *p) { AO_t *base; int log_sz; if (AO_EXPECT_FALSE(NULL == p)) return; base = (AO_t *)p - 1; log_sz = (int)(*base); # ifdef AO_TRACE_MALLOC fprintf(stderr, "%p: AO_free(%p sz:%lu)\n", (void *)pthread_self(), p, log_sz > LOG_MAX_SIZE ? (unsigned)log_sz : 1UL << log_sz); # endif if (AO_EXPECT_FALSE(log_sz > LOG_MAX_SIZE)) { AO_free_large(p); } else { ASAN_POISON_MEMORY_REGION(base + 1, ((size_t)1 << log_sz) - sizeof(AO_t)); AO_stack_push(AO_free_list + log_sz, base); } } asymptote-3.05/libatomic_ops/src/atomic_ops_sysdeps.S0000644000000000000000000000046215031566105021636 0ustar rootroot/* * Include the appropriate system-dependent assembly file, if any. * This is used only if the platform supports neither inline assembly * code, nor appropriate compiler intrinsics. */ #if !defined(__GNUC__) && (defined(sparc) || defined(__sparc)) # include "atomic_ops/sysdeps/sunc/sparc.S" #endif asymptote-3.05/libatomic_ops/m4/0000755000000000000000000000000015031566105015332 5ustar rootrootasymptote-3.05/libatomic_ops/depcomp0000755000000000000000000005622515031566105016401 0ustar rootroot#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2024-12-03.03; # UTC # Copyright (C) 1999-2025 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . GNU Automake home page: . General help using GNU software: . EOF exit $? ;; -v | --v*) echo "depcomp (GNU Automake) $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interference from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. ## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp nil t) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: asymptote-3.05/libatomic_ops/configure.ac0000644000000000000000000002051215031566105017300 0ustar rootroot# Copyright (c) 2005-2006 Hewlett-Packard Development Company, L.P. # Copyright (c) 2009-2021 Ivan Maidanski # # THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED # OR IMPLIED. ANY USE IS AT YOUR OWN RISK. # # Permission is hereby granted to use or copy this program # for any purpose, provided the above notices are retained on all copies. # Permission to modify the code and to distribute modified code is granted, # provided the above notices are retained, and a notice that the code was # modified is included with the above copyright notice. dnl Process this file with autoconf to produce configure. AC_INIT([libatomic_ops],[7.8.2],https://github.com/ivmai/libatomic_ops/issues) AC_PREREQ(2.61) AC_CANONICAL_TARGET([]) AC_CONFIG_SRCDIR(src/atomic_ops.c) AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE([foreign nostdinc]) AM_MAINTAINER_MODE AC_CONFIG_HEADERS([src/config.h]) dnl Checks for programs. AM_PROG_CC_C_O AM_PROG_AS AC_PROG_INSTALL LT_INIT([disable-shared]) dnl Checks for functions. AC_FUNC_MMAP # Determine PIC flag. need_asm=false PICFLAG= AC_MSG_CHECKING(for PIC compiler flag) if test "$GCC" = yes; then old_CC="$CC" if test -n "$CROSS_CC"; then CC="$CROSS_CC" fi case "$host" in *-*-cygwin* | *-*-mingw* | *-*-msys*) # Cygwin and Mingw[-w32/64] do not need -fPIC. AC_MSG_RESULT([not needed]) ;; *) AC_MSG_RESULT(-fPIC) PICFLAG=-fPIC AC_MSG_CHECKING(whether -fPIC compiler option causes __PIC__ definition) # Workaround: at least GCC 3.4.6 (Solaris) does not define this macro. old_CFLAGS="$CFLAGS" CFLAGS="$PICFLAG $CFLAGS" AC_COMPILE_IFELSE( [AC_LANG_SOURCE([ #ifndef __PIC__ # error #endif ])], [ac_cv_pic_macro=yes], [ac_cv_pic_macro=no]) CFLAGS="$old_CFLAGS" AC_MSG_RESULT($ac_cv_pic_macro) AS_IF([test "$ac_cv_pic_macro" = yes], [], [PICFLAG="-D__PIC__=1 $PICFLAG"]) ;; esac # Output all warnings. AC_MSG_CHECKING([whether compiler supports -Wextra]) old_CFLAGS="$CFLAGS" CFLAGS="-Wextra $CFLAGS" AC_COMPILE_IFELSE([AC_LANG_SOURCE([])], [ac_cv_cc_wextra=yes], [ac_cv_cc_wextra=no]) CFLAGS="$old_CFLAGS" AC_MSG_RESULT($ac_cv_cc_wextra) AS_IF([test "$ac_cv_cc_wextra" = yes], [WEXTRA="-Wextra"], [WEXTRA="-W"]) AC_MSG_CHECKING([whether compiler supports -Wpedantic]) CFLAGS="-Wpedantic -Wno-long-long $CFLAGS" AC_COMPILE_IFELSE([AC_LANG_SOURCE([ extern int quiet; ])], [ac_cv_cc_pedantic=yes], [ac_cv_cc_pedantic=no]) CFLAGS="$old_CFLAGS" AC_MSG_RESULT($ac_cv_cc_pedantic) WPEDANTIC= AS_IF([test "$ac_cv_cc_pedantic" = yes], [WPEDANTIC="-Wpedantic -Wno-long-long"]) CFLAGS="-Wall $WEXTRA $WPEDANTIC $CFLAGS" CC="$old_CC" else case "$host" in *-*-hpux*) AC_MSG_RESULT([+Z]) PICFLAG="+Z" CFLAGS="+O2 -mt $CFLAGS" ;; *-*-solaris*) AC_MSG_RESULT(-Kpic) PICFLAG=-Kpic CFLAGS="-O $CFLAGS" need_asm=true ;; *-*-linux*) AC_MSG_RESULT(-fPIC) PICFLAG=-fPIC # Any Linux compiler had better be gcc compatible. ;; *) AC_MSG_RESULT([none]) ;; esac fi AC_ARG_ENABLE(assertions, [AS_HELP_STRING([--enable-assertions], [Assertion checking])]) if test "$enable_assertions" != yes; then AC_DEFINE([NDEBUG], 1, [Define to disable assertion checking.]) fi AC_ARG_ENABLE(atomic-intrinsics, [AS_HELP_STRING([--disable-atomic-intrinsics], [Do not use GCC atomic intrinsics])]) if test "$enable_atomic_intrinsics" = no; then AC_DEFINE([AO_DISABLE_GCC_ATOMICS], 1, [Define to avoid GCC atomic intrinsics even if available.]) fi AC_ARG_ENABLE(gcov, AS_HELP_STRING([--enable-gcov], [Turn on code coverage analysis])) if test "$enable_gcov" = "yes"; then CFLAGS="$CFLAGS --coverage" # Turn off code optimization to get accurate line numbers. CFLAGS=`echo "$CFLAGS" | sed -e 's/-O\(1\|2\|3\|4\|s\|fast\)\?//g'` fi AC_ARG_ENABLE(gpl, [AS_HELP_STRING([--disable-gpl], [Do not build atomic_ops_gpl library])]) AM_CONDITIONAL(ENABLE_GPL, test x$enable_gpl != xno) AC_ARG_ENABLE(docs, [AS_HELP_STRING([--disable-docs], [Do not build and install documentation])]) AM_CONDITIONAL(ENABLE_DOCS, test x$enable_docs != xno) AC_SUBST(PICFLAG) AC_SUBST(DEFS) dnl Extra user-defined C flags. AC_SUBST([CFLAGS_EXTRA]) AH_TEMPLATE([_PTHREADS], [Indicates the use of pthreads (NetBSD).]) AH_TEMPLATE([AO_USE_NANOSLEEP], [Use nanosleep() instead of select() (only if atomic operations \ are emulated)]) AH_TEMPLATE([AO_USE_NO_SIGNALS], [Do not block signals in compare_and_swap (only if atomic operations \ are emulated)]) AH_TEMPLATE([AO_USE_WIN32_PTHREADS], [Use Win32 Sleep() instead of select() (only if atomic operations \ are emulated)]) AH_TEMPLATE([AO_TRACE_MALLOC], [Trace AO_malloc/free calls (for debug only)]) dnl These macros are tested in public headers. AH_TEMPLATE([AO_GENERALIZE_ASM_BOOL_CAS], [Force compare_and_swap definition via fetch_compare_and_swap]) AH_TEMPLATE([AO_PREFER_GENERALIZED], [Prefer generalized definitions to direct assembly-based ones]) AH_TEMPLATE([AO_USE_PTHREAD_DEFS], [Emulate atomic operations via slow and async-signal-unsafe \ pthread locking]) AH_TEMPLATE([AO_CMPXCHG16B_AVAILABLE], [Assume target is not old AMD Opteron chip (only x86_64)]) AH_TEMPLATE([AO_FORCE_USE_SWP], [Force test_and_set to use SWP instruction instead of LDREX/STREX \ (only arm v6+)]) AH_TEMPLATE([AO_NO_SPARC_V9], [Assume target is not sparc v9+ (only sparc)]) AH_TEMPLATE([AO_UNIPROCESSOR], [Assume single-core target (only arm v6+ or GCC intrinsics)]) AH_TEMPLATE([AO_USE_PENTIUM4_INSTRS], [Use Pentium 4 'mfence' instruction (only x86)]) AH_TEMPLATE([AO_USE_SYNC_CAS_BUILTIN], [Prefer GCC built-in CAS intrinsics in favor of inline assembly \ (only gcc/x86, gcc/x86_64)]) AH_TEMPLATE([AO_WEAK_DOUBLE_CAS_EMULATION], [Emulate double-width CAS via pthread locking in case of no hardware \ support (only gcc/x86_64, the emulation is unsafe)]) AH_TEMPLATE([AO_PREFER_BUILTIN_ATOMICS], [Prefer GCC atomic intrinsics over assembly-based implementation \ even in case of inefficient implementation (do not use assembly for \ any atomic_ops primitive if the atomic intrinsics are available)]) AC_DEFINE(_REENTRANT, 1, [Required define if using POSIX threads.]) # Libraries needed to support threads (if any). have_pthreads=false AC_CHECK_LIB(pthread, pthread_self, have_pthreads=true) if test x$have_pthreads = xtrue; then THREADDLLIBS=-lpthread case "$host" in *-*-netbsd*) # Indicates the use of pthreads. AC_DEFINE(_PTHREADS) ;; *-*-openbsd* | *-*-kfreebsd*-gnu | *-*-dgux*) THREADDLLIBS=-pthread ;; *-*-cygwin* | *-*-darwin*) # Cygwin does not have a real libpthread, so Libtool cannot link # against it. THREADDLLIBS= ;; *-*-mingw* | *-*-msys*) # Use Win32 threads for tests anyway. THREADDLLIBS= # Skip test_atomic_pthreads. have_pthreads=false ;; esac else AC_DEFINE([AO_NO_PTHREADS], 1, [No pthreads library available]) # Assume VxWorks or Win32. THREADDLLIBS= fi AC_SUBST(THREADDLLIBS) # AO API symbols export control. # Compile with AO_DLL defined unless building static libraries. if test x$enable_shared = xyes -a x$enable_static = xno; then CFLAGS="-DAO_DLL $CFLAGS" fi # Turn compiler warnings into errors, if requested. # Note: this check is placed after AC_CHECK_LIB(pthread) to workaround # a missing void in pthread_self declaration generated by autoconf. AC_ARG_ENABLE(werror, [AS_HELP_STRING([--enable-werror], [Pass -Werror to the C compiler])]) if test "$enable_werror" = yes -a "$GCC" = yes; then CFLAGS="-Werror $CFLAGS" fi AM_CONDITIONAL(ENABLE_SHARED, test x$enable_shared = xyes) AM_CONDITIONAL(HAVE_PTHREAD_H, test x$have_pthreads = xtrue) AM_CONDITIONAL(NEED_ASM, test x$need_asm = xtrue) AC_CONFIG_FILES([ Makefile src/Makefile tests/Makefile pkgconfig/atomic_ops.pc pkgconfig/atomic_ops-uninstalled.pc ]) AC_CONFIG_COMMANDS([default],[[]],[[ PICFLAG="${PICFLAG}" CC="${CC}" DEFS="${DEFS}" ]]) AC_OUTPUT asymptote-3.05/libatomic_ops/Makefile.am0000644000000000000000000000145415031566105017052 0ustar rootrootSUBDIRS = src tests ACLOCAL_AMFLAGS = -I m4 pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = pkgconfig/atomic_ops.pc noinst_DATA = pkgconfig/atomic_ops-uninstalled.pc # Installed documentation. if ENABLE_DOCS dist_doc_DATA = AUTHORS ChangeLog LICENSE README.md README_details.txt \ README_win32.txt if ENABLE_GPL dist_doc_DATA += COPYING README_malloc.txt README_stack.txt endif endif EXTRA_DIST = autogen.sh CMakeLists.txt Config.cmake.in ## TODO: After migration to autoconf-1.13+, remove check-nolink definition ## from this Makefile.am and add AM_EXTRA_RECURSIVE_TARGETS([check-nolink]) ## back to configure.ac file. .PHONY: check-nolink check-nolink-local check-nolink: check-nolink-local $(MAKE) --directory tests $(AM_MAKEFLAGS) check-nolink-local check-nolink-local: all #distclean-local: asymptote-3.05/libatomic_ops/AUTHORS0000644000000000000000000000425615031566105016071 0ustar rootrootOriginally written by Hans Boehm, with some platform-dependent code imported from the Boehm-Demers-Weiser GC, where it was contributed by many others. Currently maintained by Ivan Maidanski. Alexey Pavlov Andreas Tobler Andrew Agno Andy Li Bradley Smith Bruce Mitchener Carlos O'Donell Chris Metcalf Daniel Grayson David Mosberger Doug Lea Earl Chew Emmanuel Stapf Fabrizio Fabbri Frank Schaefer Frederic Recoules George Koehler Gilles Talis Gregory Farnum H.J. Lu Hans Boehm Hans-Peter Nilsson Ian Wienand Ivan Maidanski James Cowgill Jean Girardet Jeremy Huddleston Jim Marshall Joerg Wagner Linas Vepstas Luca Barbato Kochin Chang Maged Michael Manuel Serrano Marek Vasut Max Horn Michael Hope Mikael Urankar Patrick Marlier Pavel Raiskup Petter Urkedal Philipp Zambelli Ranko Zivojnovic Roger Hoover Sebastian Siewior Shea Levy Steve Capper Takashi Yoshii Tautvydas Zilys Thiemo Seufer Thorsten Glaser Tobias Leich Tony Mantler YunQiang Su Yvan Roux asymptote-3.05/libatomic_ops/tests/0000755000000000000000000000000015031566105016154 5ustar rootrootasymptote-3.05/libatomic_ops/tests/test_atomic.c0000644000000000000000000001625015031566105020637 0ustar rootroot/* * Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #if defined(HAVE_CONFIG_H) # include "config.h" #endif #if (defined(AO_NO_PTHREADS) || defined(__MINGW32__)) \ && defined(AO_USE_PTHREAD_DEFS) # include int main(void) { printf("test skipped\n"); return 0; } #else #include "run_parallel.h" #include "test_atomic_include.h" #if defined(AO_USE_PTHREAD_DEFS) || defined(AO_PREFER_GENERALIZED) # define NITERS 100000 #else # define NITERS 10000000 #endif void * add1sub1_thr(void * id); int add1sub1_test(void); void * acqrel_thr(void *id); int acqrel_test(void); void * test_and_set_thr(void * id); int test_and_set_test(void); #if defined(AO_HAVE_fetch_and_add1) && defined(AO_HAVE_fetch_and_sub1) AO_t counter = 0; void * add1sub1_thr(void * id) { int me = (int)(AO_PTRDIFF_T)id; int i; for (i = 0; i < NITERS; ++i) if ((me & 1) != 0) { (void)AO_fetch_and_sub1(&counter); } else { (void)AO_fetch_and_add1(&counter); } return 0; } int add1sub1_test(void) { return counter == 0; } #endif /* defined(AO_HAVE_fetch_and_add1) && defined(AO_HAVE_fetch_and_sub1) */ #if defined(AO_HAVE_store_release_write) && defined(AO_HAVE_load_acquire_read) /* Invariant: counter1 >= counter2 */ AO_t counter1 = 0; AO_t counter2 = 0; void * acqrel_thr(void *id) { int me = (int)(AO_PTRDIFF_T)id; int i; for (i = 0; i < NITERS; ++i) if (me & 1) { AO_t my_counter1; if (me != 1) { fprintf(stderr, "acqrel test: too many threads\n"); abort(); } my_counter1 = AO_load(&counter1); AO_store(&counter1, my_counter1 + 1); AO_store_release_write(&counter2, my_counter1 + 1); } else { AO_t my_counter1a, my_counter2a; AO_t my_counter1b, my_counter2b; my_counter2a = AO_load_acquire_read(&counter2); my_counter1a = AO_load(&counter1); /* Redo this, to make sure that the second load of counter1 */ /* is not viewed as a common subexpression. */ my_counter2b = AO_load_acquire_read(&counter2); my_counter1b = AO_load(&counter1); if (my_counter1a < my_counter2a) { fprintf(stderr, "Saw release store out of order: %lu < %lu\n", (unsigned long)my_counter1a, (unsigned long)my_counter2a); abort(); } if (my_counter1b < my_counter2b) { fprintf(stderr, "Saw release store out of order (bad CSE?): %lu < %lu\n", (unsigned long)my_counter1b, (unsigned long)my_counter2b); abort(); } } return 0; } int acqrel_test(void) { return counter1 == NITERS && counter2 == NITERS; } #endif /* AO_HAVE_store_release_write && AO_HAVE_load_acquire_read */ #if defined(AO_HAVE_test_and_set_acquire) AO_TS_t lock = AO_TS_INITIALIZER; unsigned long locked_counter; volatile unsigned long junk = 13; AO_ATTR_NO_SANITIZE_THREAD void do_junk(void) { junk *= 17; junk *= 19; } void * test_and_set_thr(void * id) { unsigned long i; for (i = 0; i < NITERS/10; ++i) { while (AO_test_and_set_acquire(&lock) != AO_TS_CLEAR); ++locked_counter; if (locked_counter != 1) { fprintf(stderr, "Test and set failure 1, counter = %ld, id = %d\n", (long)locked_counter, (int)(AO_PTRDIFF_T)id); abort(); } locked_counter *= 2; locked_counter -= 1; locked_counter *= 5; locked_counter -= 4; if (locked_counter != 1) { fprintf(stderr, "Test and set failure 2, counter = %ld, id = %d\n", (long)locked_counter, (int)(AO_PTRDIFF_T)id); abort(); } --locked_counter; AO_CLEAR(&lock); /* Spend a bit of time outside the lock. */ do_junk(); } return 0; } int test_and_set_test(void) { return locked_counter == 0; } #endif /* defined(AO_HAVE_test_and_set_acquire) */ #if (!defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__BORLANDC__) \ || defined(AO_USE_NO_SIGNALS) || defined(AO_USE_WIN32_PTHREADS)) \ && defined(AO_TEST_EMULATION) # ifdef __cplusplus extern "C" { # endif AO_API void AO_store_full_emulation(volatile AO_t *addr, AO_t val); AO_API AO_t AO_fetch_compare_and_swap_emulation(volatile AO_t *addr, AO_t old_val, AO_t new_val); # ifdef AO_HAVE_double_t AO_API int AO_compare_double_and_swap_double_emulation(volatile AO_double_t *, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2); # endif # ifdef __cplusplus } /* extern "C" */ # endif void test_atomic_emulation(void) { AO_t x; # ifdef AO_HAVE_double_t AO_double_t w; /* double-word alignment not needed */ w.AO_val1 = 0; w.AO_val2 = 0; TA_assert(!AO_compare_double_and_swap_double_emulation(&w, 4116, 2121, 8537, 6410)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_double_and_swap_double_emulation(&w, 0, 0, 8537, 6410)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); # endif AO_store_full_emulation(&x, 1314); TA_assert(x == 1314); TA_assert(AO_fetch_compare_and_swap_emulation(&x, 14, 13117) == 1314); TA_assert(x == 1314); TA_assert(AO_fetch_compare_and_swap_emulation(&x, 1314, 14117) == 1314); TA_assert(x == 14117); } #else # define test_atomic_emulation() (void)0 #endif /* _MSC_VER && !AO_USE_NO_SIGNALS || !AO_TEST_EMULATION */ int main(void) { test_atomic(); test_atomic_acquire(); test_atomic_release(); test_atomic_read(); test_atomic_write(); test_atomic_full(); test_atomic_release_write(); test_atomic_acquire_read(); test_atomic_dd_acquire_read(); # if defined(AO_HAVE_fetch_and_add1) && defined(AO_HAVE_fetch_and_sub1) run_parallel(4, add1sub1_thr, add1sub1_test, "add1/sub1"); # endif # if defined(AO_HAVE_store_release_write) && defined(AO_HAVE_load_acquire_read) run_parallel(3, acqrel_thr, acqrel_test, "store_release_write/load_acquire_read"); # endif # if defined(AO_HAVE_test_and_set_acquire) run_parallel(5, test_and_set_thr, test_and_set_test, "test_and_set"); # endif test_atomic_emulation(); return 0; } #endif /* !AO_NO_PTHREADS || !AO_USE_PTHREAD_DEFS */ asymptote-3.05/libatomic_ops/tests/test_malloc.c0000644000000000000000000001372215031566105020633 0ustar rootroot/* * Copyright (c) 2005 Hewlett-Packard Development Company, L.P. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #if defined(HAVE_CONFIG_H) # include "config.h" #endif #ifdef DONT_USE_MMAP # undef HAVE_MMAP #endif #include "run_parallel.h" #include #include #include "atomic_ops_malloc.h" #ifndef DEFAULT_NTHREADS # ifdef HAVE_MMAP # define DEFAULT_NTHREADS 16 /* must be <= MAX_NTHREADS */ # else # define DEFAULT_NTHREADS 3 # endif #endif #ifndef N_REVERSALS # ifdef AO_USE_PTHREAD_DEFS # define N_REVERSALS 4 # else # define N_REVERSALS 1000 /* must be even */ # endif #endif #ifndef LIST_LENGTH # ifdef HAVE_MMAP # define LIST_LENGTH 1000 # else # define LIST_LENGTH 100 # endif #endif #ifndef LARGE_OBJ_SIZE # ifdef HAVE_MMAP # define LARGE_OBJ_SIZE 200000 # else # define LARGE_OBJ_SIZE 20000 # endif #endif #ifdef USE_STANDARD_MALLOC # define AO_malloc(n) malloc(n) # define AO_free(p) free(p) # define AO_malloc_enable_mmap() #endif typedef struct list_node { struct list_node *next; int data; } ln; ln *cons(int d, ln *tail) { # ifdef AO_HAVE_fetch_and_add1 static volatile AO_t extra = 0; size_t my_extra = (size_t)AO_fetch_and_add1(&extra) % 101; # else static size_t extra = 0; /* data race in extra is OK */ size_t my_extra = (extra++) % 101; # endif ln *result; char *extras; unsigned i; result = (ln *)AO_malloc(sizeof(ln) + sizeof(int)*my_extra); if (result == 0) { fprintf(stderr, "Out of memory\n"); /* Normal for more than about 10 threads without mmap? */ exit(2); } result -> data = d; result -> next = tail; extras = (char *)(result+1); for (i = 0; i < my_extra; ++i) extras[i*sizeof(int)] = 42; return result; } #ifdef DEBUG_RUN_ONE_TEST void print_list(ln *l) { ln *p; for (p = l; p != 0; p = p -> next) { printf("%d, ", p -> data); } printf("\n"); } #endif /* DEBUG_RUN_ONE_TEST */ /* Check that l contains numbers from m to n inclusive in ascending order */ void check_list(ln *l, int m, int n) { ln *p; int i; for (p = l, i = m; p != 0 && i <= n; p = p -> next, ++i) { if (i != p -> data) { fprintf(stderr, "Found %d, expected %d\n", p -> data, i); abort(); } } if (i <= n) { fprintf(stderr, "Number not found: %d\n", i); abort(); } if (p != 0) { fprintf(stderr, "Found unexpected number: %d\n", i); abort(); } } /* Create a list of integers from m to n */ ln * make_list(int m, int n) { if (m > n) return 0; return cons(m, make_list(m+1, n)); } void free_list(ln *x) { while (x != NULL) { ln *next = x -> next; AO_free(x); x = next; } } /* Reverse list x, and concatenate it to y, deallocating no longer needed */ /* nodes in x. */ ln * reverse(ln *x, ln *y) { ln * result; if (x == 0) return y; result = reverse(x -> next, cons(x -> data, y)); AO_free(x); return result; } int dummy_test(void) { return 1; } void * run_one_test(void * arg) { ln * x = make_list(1, LIST_LENGTH); int i; char *p = (char *)AO_malloc(LARGE_OBJ_SIZE); char *q; char a = 'a' + ((int)((AO_PTRDIFF_T)arg) * 2) % ('z' - 'a' + 1); char b = a + 1; if (0 == p) { # ifdef HAVE_MMAP fprintf(stderr, "AO_malloc(%d) failed\n", LARGE_OBJ_SIZE); abort(); # else fprintf(stderr, "AO_malloc(%d) failed: This is normal without mmap\n", LARGE_OBJ_SIZE); # endif } else { p[0] = p[LARGE_OBJ_SIZE/2] = p[LARGE_OBJ_SIZE-1] = a; q = (char *)AO_malloc(LARGE_OBJ_SIZE); if (q == 0) { fprintf(stderr, "Out of memory\n"); /* Normal for more than about 10 threads without mmap? */ exit(2); } q[0] = q[LARGE_OBJ_SIZE/2] = q[LARGE_OBJ_SIZE-1] = b; if (p[0] != a || p[LARGE_OBJ_SIZE/2] != a || p[LARGE_OBJ_SIZE-1] != a) { fprintf(stderr, "First large allocation smashed\n"); abort(); } AO_free(p); if (q[0] != b || q[LARGE_OBJ_SIZE/2] != b || q[LARGE_OBJ_SIZE-1] != b) { fprintf(stderr, "Second large allocation smashed\n"); abort(); } AO_free(q); } # ifdef DEBUG_RUN_ONE_TEST x = reverse(x, 0); print_list(x); x = reverse(x, 0); print_list(x); # endif for (i = 0; i < N_REVERSALS; ++i) { x = reverse(x, 0); } check_list(x, 1, LIST_LENGTH); free_list(x); return NULL; } #ifndef LOG_MAX_SIZE # define LOG_MAX_SIZE 16 #endif #define CHUNK_SIZE (1 << LOG_MAX_SIZE) int main(int argc, char **argv) { int nthreads; if (1 == argc) { nthreads = DEFAULT_NTHREADS; } else if (2 == argc) { nthreads = atoi(argv[1]); if (nthreads < 1 || nthreads > MAX_NTHREADS) { fprintf(stderr, "Invalid # of threads argument\n"); exit(1); } } else { fprintf(stderr, "Usage: %s [# of threads]\n", argv[0]); exit(1); } printf("Performing %d reversals of %d element lists in %d threads\n", N_REVERSALS, LIST_LENGTH, nthreads); AO_malloc_enable_mmap(); /* Test various corner cases. */ AO_free(NULL); AO_free(AO_malloc(0)); # ifdef HAVE_MMAP AO_free(AO_malloc(CHUNK_SIZE - (sizeof(AO_t)-1))); /* large alloc */ # endif run_parallel(nthreads, run_one_test, dummy_test, "AO_malloc/AO_free"); return 0; } asymptote-3.05/libatomic_ops/tests/test_atomic_include.template0000644000000000000000000005127615031566105023742 0ustar rootroot/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Some basic sanity tests. These do not test the barrier semantics. */ #undef TA_assert #define TA_assert(e) \ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: XX)\n", \ __FILE__, __LINE__), exit(1); } #undef MISSING #define MISSING(name) \ printf("Missing: %s\n", #name "XX") #if defined(CPPCHECK) void list_atomicXX(void); void char_list_atomicXX(void); void short_list_atomicXX(void); void int_list_atomicXX(void); void double_list_atomicXX(void); #endif void test_atomicXX(void) { AO_t x; unsigned char b; unsigned short s; unsigned int zz; # if defined(AO_HAVE_test_and_setXX) AO_TS_t z = AO_TS_INITIALIZER; # endif # if defined(AO_HAVE_double_compare_and_swapXX) \ || defined(AO_HAVE_double_loadXX) \ || defined(AO_HAVE_double_storeXX) static AO_double_t old_w; /* static to avoid misalignment */ AO_double_t new_w; # endif # if defined(AO_HAVE_compare_and_swap_doubleXX) \ || defined(AO_HAVE_compare_double_and_swap_doubleXX) \ || defined(AO_HAVE_double_compare_and_swapXX) static AO_double_t w; /* static to avoid misalignment */ w.AO_val1 = 0; w.AO_val2 = 0; # endif # if defined(CPPCHECK) list_atomicXX(); char_list_atomicXX(); short_list_atomicXX(); int_list_atomicXX(); double_list_atomicXX(); # endif # if defined(AO_HAVE_nopXX) AO_nopXX(); # elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write) MISSING(AO_nop); # endif # if defined(AO_HAVE_storeXX) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */ # endif AO_storeXX(&x, 13); TA_assert(x == 13); # else # if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \ || !defined(AO_HAVE_store_release) \ || !defined(AO_HAVE_store_release_write) \ || !defined(AO_HAVE_store_write) MISSING(AO_store); # endif x = 13; # endif # if defined(AO_HAVE_loadXX) TA_assert(AO_loadXX(&x) == 13); # elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \ || !defined(AO_HAVE_load_acquire_read) \ || !defined(AO_HAVE_load_dd_acquire_read) \ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read) MISSING(AO_load); # endif # if defined(AO_HAVE_test_and_setXX) TA_assert(AO_test_and_setXX(&z) == AO_TS_CLEAR); TA_assert(AO_test_and_setXX(&z) == AO_TS_SET); TA_assert(AO_test_and_setXX(&z) == AO_TS_SET); AO_CLEAR(&z); # else MISSING(AO_test_and_set); # endif # if defined(AO_HAVE_fetch_and_addXX) TA_assert(AO_fetch_and_addXX(&x, 42) == 13); TA_assert(AO_fetch_and_addXX(&x, (AO_t)(-42)) == 55); # else MISSING(AO_fetch_and_add); # endif # if defined(AO_HAVE_fetch_and_add1XX) TA_assert(AO_fetch_and_add1XX(&x) == 13); # else MISSING(AO_fetch_and_add1); ++x; # endif # if defined(AO_HAVE_fetch_and_sub1XX) TA_assert(AO_fetch_and_sub1XX(&x) == 14); # else MISSING(AO_fetch_and_sub1); --x; # endif # if defined(AO_HAVE_short_storeXX) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile short *)&s = 0; # endif AO_short_storeXX(&s, 13); # else # if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \ || !defined(AO_HAVE_short_store_release) \ || !defined(AO_HAVE_short_store_release_write) \ || !defined(AO_HAVE_short_store_write) MISSING(AO_short_store); # endif s = 13; # endif # if defined(AO_HAVE_short_loadXX) TA_assert(AO_short_load(&s) == 13); # elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \ || !defined(AO_HAVE_short_load_acquire_read) \ || !defined(AO_HAVE_short_load_dd_acquire_read) \ || !defined(AO_HAVE_short_load_full) \ || !defined(AO_HAVE_short_load_read) MISSING(AO_short_load); # endif # if defined(AO_HAVE_short_fetch_and_addXX) TA_assert(AO_short_fetch_and_addXX(&s, 42) == 13); TA_assert(AO_short_fetch_and_addXX(&s, (unsigned short)-42) == 55); # else MISSING(AO_short_fetch_and_add); # endif # if defined(AO_HAVE_short_fetch_and_add1XX) TA_assert(AO_short_fetch_and_add1XX(&s) == 13); # else MISSING(AO_short_fetch_and_add1); ++s; # endif # if defined(AO_HAVE_short_fetch_and_sub1XX) TA_assert(AO_short_fetch_and_sub1XX(&s) == 14); # else MISSING(AO_short_fetch_and_sub1); --s; # endif TA_assert(*(volatile short *)&s == 13); # if defined(AO_HAVE_char_storeXX) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile char *)&b = 0; # endif AO_char_storeXX(&b, 13); # else # if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \ || !defined(AO_HAVE_char_store_release) \ || !defined(AO_HAVE_char_store_release_write) \ || !defined(AO_HAVE_char_store_write) MISSING(AO_char_store); # endif b = 13; # endif # if defined(AO_HAVE_char_loadXX) TA_assert(AO_char_load(&b) == 13); # elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \ || !defined(AO_HAVE_char_load_acquire_read) \ || !defined(AO_HAVE_char_load_dd_acquire_read) \ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read) MISSING(AO_char_load); # endif # if defined(AO_HAVE_char_fetch_and_addXX) TA_assert(AO_char_fetch_and_addXX(&b, 42) == 13); TA_assert(AO_char_fetch_and_addXX(&b, (unsigned char)-42) == 55); # else MISSING(AO_char_fetch_and_add); # endif # if defined(AO_HAVE_char_fetch_and_add1XX) TA_assert(AO_char_fetch_and_add1XX(&b) == 13); # else MISSING(AO_char_fetch_and_add1); ++b; # endif # if defined(AO_HAVE_char_fetch_and_sub1XX) TA_assert(AO_char_fetch_and_sub1XX(&b) == 14); # else MISSING(AO_char_fetch_and_sub1); --b; # endif TA_assert(*(volatile char *)&b == 13); # if defined(AO_HAVE_int_storeXX) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile int *)&zz = 0; # endif AO_int_storeXX(&zz, 13); # else # if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \ || !defined(AO_HAVE_int_store_release) \ || !defined(AO_HAVE_int_store_release_write) \ || !defined(AO_HAVE_int_store_write) MISSING(AO_int_store); # endif zz = 13; # endif # if defined(AO_HAVE_int_loadXX) TA_assert(AO_int_load(&zz) == 13); # elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \ || !defined(AO_HAVE_int_load_acquire_read) \ || !defined(AO_HAVE_int_load_dd_acquire_read) \ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read) MISSING(AO_int_load); # endif # if defined(AO_HAVE_int_fetch_and_addXX) TA_assert(AO_int_fetch_and_addXX(&zz, 42) == 13); TA_assert(AO_int_fetch_and_addXX(&zz, (unsigned int)-42) == 55); # else MISSING(AO_int_fetch_and_add); # endif # if defined(AO_HAVE_int_fetch_and_add1XX) TA_assert(AO_int_fetch_and_add1XX(&zz) == 13); # else MISSING(AO_int_fetch_and_add1); ++zz; # endif # if defined(AO_HAVE_int_fetch_and_sub1XX) TA_assert(AO_int_fetch_and_sub1XX(&zz) == 14); # else MISSING(AO_int_fetch_and_sub1); --zz; # endif TA_assert(*(volatile int *)&zz == 13); # if defined(AO_HAVE_compare_and_swapXX) TA_assert(!AO_compare_and_swapXX(&x, 14, 42)); TA_assert(x == 13); TA_assert(AO_compare_and_swapXX(&x, 13, 42)); TA_assert(x == 42); # else MISSING(AO_compare_and_swap); if (*(volatile AO_t *)&x == 13) x = 42; # endif # if defined(AO_HAVE_orXX) AO_orXX(&x, 66); TA_assert(x == 106); # else # if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write) MISSING(AO_or); # endif x |= 66; # endif # if defined(AO_HAVE_xorXX) AO_xorXX(&x, 181); TA_assert(x == 223); # else # if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write) MISSING(AO_xor); # endif x ^= 181; # endif # if defined(AO_HAVE_andXX) AO_andXX(&x, 57); TA_assert(x == 25); # else # if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write) MISSING(AO_and); # endif x &= 57; # endif # if defined(AO_HAVE_fetch_compare_and_swapXX) TA_assert(AO_fetch_compare_and_swapXX(&x, 14, 117) == 25); TA_assert(x == 25); TA_assert(AO_fetch_compare_and_swapXX(&x, 25, 117) == 25); # else MISSING(AO_fetch_compare_and_swap); if (x == 25) x = 117; # endif TA_assert(x == 117); # if defined(AO_HAVE_short_compare_and_swapXX) TA_assert(!AO_short_compare_and_swapXX(&s, 14, 42)); TA_assert(s == 13); TA_assert(AO_short_compare_and_swapXX(&s, 13, 42)); TA_assert(s == 42); # else MISSING(AO_short_compare_and_swap); if (*(volatile short *)&s == 13) s = 42; # endif # if defined(AO_HAVE_short_orXX) AO_short_orXX(&s, 66); TA_assert(s == 106); # else # if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \ || !defined(AO_HAVE_short_or_acquire_read) \ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \ || !defined(AO_HAVE_short_or_release) \ || !defined(AO_HAVE_short_or_release_write) \ || !defined(AO_HAVE_short_or_write) MISSING(AO_short_or); # endif s |= 66; # endif # if defined(AO_HAVE_short_xorXX) AO_short_xorXX(&s, 181); TA_assert(s == 223); # else # if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \ || !defined(AO_HAVE_short_xor_acquire_read) \ || !defined(AO_HAVE_short_xor_full) \ || !defined(AO_HAVE_short_xor_read) \ || !defined(AO_HAVE_short_xor_release) \ || !defined(AO_HAVE_short_xor_release_write) \ || !defined(AO_HAVE_short_xor_write) MISSING(AO_short_xor); # endif s ^= 181; # endif # if defined(AO_HAVE_short_andXX) AO_short_andXX(&s, 57); TA_assert(s == 25); # else # if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \ || !defined(AO_HAVE_short_and_acquire_read) \ || !defined(AO_HAVE_short_and_full) \ || !defined(AO_HAVE_short_and_read) \ || !defined(AO_HAVE_short_and_release) \ || !defined(AO_HAVE_short_and_release_write) \ || !defined(AO_HAVE_short_and_write) MISSING(AO_short_and); # endif s &= 57; # endif # if defined(AO_HAVE_short_fetch_compare_and_swapXX) TA_assert(AO_short_fetch_compare_and_swapXX(&s, 14, 117) == 25); TA_assert(s == 25); TA_assert(AO_short_fetch_compare_and_swapXX(&s, 25, 117) == 25); # else MISSING(AO_short_fetch_compare_and_swap); if (s == 25) s = 117; # endif TA_assert(s == 117); # if defined(AO_HAVE_char_compare_and_swapXX) TA_assert(!AO_char_compare_and_swapXX(&b, 14, 42)); TA_assert(b == 13); TA_assert(AO_char_compare_and_swapXX(&b, 13, 42)); TA_assert(b == 42); # else MISSING(AO_char_compare_and_swap); if (*(volatile char *)&b == 13) b = 42; # endif # if defined(AO_HAVE_char_orXX) AO_char_orXX(&b, 66); TA_assert(b == 106); # else # if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \ || !defined(AO_HAVE_char_or_acquire_read) \ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \ || !defined(AO_HAVE_char_or_release) \ || !defined(AO_HAVE_char_or_release_write) \ || !defined(AO_HAVE_char_or_write) MISSING(AO_char_or); # endif b |= 66; # endif # if defined(AO_HAVE_char_xorXX) AO_char_xorXX(&b, 181); TA_assert(b == 223); # else # if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \ || !defined(AO_HAVE_char_xor_acquire_read) \ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \ || !defined(AO_HAVE_char_xor_release) \ || !defined(AO_HAVE_char_xor_release_write) \ || !defined(AO_HAVE_char_xor_write) MISSING(AO_char_xor); # endif b ^= 181; # endif # if defined(AO_HAVE_char_andXX) AO_char_andXX(&b, 57); TA_assert(b == 25); # else # if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \ || !defined(AO_HAVE_char_and_acquire_read) \ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \ || !defined(AO_HAVE_char_and_release) \ || !defined(AO_HAVE_char_and_release_write) \ || !defined(AO_HAVE_char_and_write) MISSING(AO_char_and); # endif b &= 57; # endif # if defined(AO_HAVE_char_fetch_compare_and_swapXX) TA_assert(AO_char_fetch_compare_and_swapXX(&b, 14, 117) == 25); TA_assert(b == 25); TA_assert(AO_char_fetch_compare_and_swapXX(&b, 25, 117) == 25); # else MISSING(AO_char_fetch_compare_and_swap); if (b == 25) b = 117; # endif TA_assert(b == 117); # if defined(AO_HAVE_int_compare_and_swapXX) TA_assert(!AO_int_compare_and_swapXX(&zz, 14, 42)); TA_assert(zz == 13); TA_assert(AO_int_compare_and_swapXX(&zz, 13, 42)); TA_assert(zz == 42); # else MISSING(AO_int_compare_and_swap); if (*(volatile int *)&zz == 13) zz = 42; # endif # if defined(AO_HAVE_int_orXX) AO_int_orXX(&zz, 66); TA_assert(zz == 106); # else # if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \ || !defined(AO_HAVE_int_or_acquire_read) \ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \ || !defined(AO_HAVE_int_or_release) \ || !defined(AO_HAVE_int_or_release_write) \ || !defined(AO_HAVE_int_or_write) MISSING(AO_int_or); # endif zz |= 66; # endif # if defined(AO_HAVE_int_xorXX) AO_int_xorXX(&zz, 181); TA_assert(zz == 223); # else # if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \ || !defined(AO_HAVE_int_xor_acquire_read) \ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \ || !defined(AO_HAVE_int_xor_release) \ || !defined(AO_HAVE_int_xor_release_write) \ || !defined(AO_HAVE_int_xor_write) MISSING(AO_int_xor); # endif zz ^= 181; # endif # if defined(AO_HAVE_int_andXX) AO_int_andXX(&zz, 57); TA_assert(zz == 25); # else # if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \ || !defined(AO_HAVE_int_and_acquire_read) \ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \ || !defined(AO_HAVE_int_and_release) \ || !defined(AO_HAVE_int_and_release_write) \ || !defined(AO_HAVE_int_and_write) MISSING(AO_int_and); # endif zz &= 57; # endif # if defined(AO_HAVE_int_fetch_compare_and_swapXX) TA_assert(AO_int_fetch_compare_and_swapXX(&zz, 14, 117) == 25); TA_assert(zz == 25); TA_assert(AO_int_fetch_compare_and_swapXX(&zz, 25, 117) == 25); # else MISSING(AO_int_fetch_compare_and_swap); if (zz == 25) zz = 117; # endif TA_assert(zz == 117); # if defined(AO_HAVE_double_loadXX) || defined(AO_HAVE_double_storeXX) /* Initialize old_w even for store to workaround MSan warning. */ old_w.AO_val1 = 3316; old_w.AO_val2 = 2921; # endif # if defined(AO_HAVE_double_loadXX) new_w = AO_double_loadXX(&old_w); TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921); # elif !defined(AO_HAVE_double_load) \ || !defined(AO_HAVE_double_load_acquire) \ || !defined(AO_HAVE_double_load_acquire_read) \ || !defined(AO_HAVE_double_load_dd_acquire_read) \ || !defined(AO_HAVE_double_load_full) \ || !defined(AO_HAVE_double_load_read) MISSING(AO_double_load); # endif # if defined(AO_HAVE_double_storeXX) new_w.AO_val1 = 1375; new_w.AO_val2 = 8243; AO_double_storeXX(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); AO_double_storeXX(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); new_w.AO_val1 ^= old_w.AO_val1; new_w.AO_val2 ^= old_w.AO_val2; AO_double_storeXX(&old_w, new_w); TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0); # elif !defined(AO_HAVE_double_store) \ || !defined(AO_HAVE_double_store_full) \ || !defined(AO_HAVE_double_store_release) \ || !defined(AO_HAVE_double_store_release_write) \ || !defined(AO_HAVE_double_store_write) MISSING(AO_double_store); # endif # if defined(AO_HAVE_compare_double_and_swap_doubleXX) TA_assert(!AO_compare_double_and_swap_doubleXX(&w, 17, 42, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_double_and_swap_doubleXX(&w, 0, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_doubleXX(&w, 12, 14, 64, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_doubleXX(&w, 11, 13, 85, 82)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_doubleXX(&w, 13, 12, 17, 42)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_double_and_swap_doubleXX(&w, 12, 13, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_double_and_swap_doubleXX(&w, 17, 42, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_double_and_swap_double); # endif # if defined(AO_HAVE_compare_and_swap_doubleXX) TA_assert(!AO_compare_and_swap_doubleXX(&w, 17, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_and_swap_doubleXX(&w, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_doubleXX(&w, 13, 12, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_doubleXX(&w, 1213, 48, 86)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_and_swap_doubleXX(&w, 12, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_and_swap_doubleXX(&w, 17, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_and_swap_double); # endif # if defined(AO_HAVE_double_compare_and_swapXX) old_w.AO_val1 = 4116; old_w.AO_val2 = 2121; new_w.AO_val1 = 8537; new_w.AO_val2 = 6410; TA_assert(!AO_double_compare_and_swapXX(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_double_compare_and_swapXX(&w, w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = 29; new_w.AO_val1 = 820; new_w.AO_val2 = 5917; TA_assert(!AO_double_compare_and_swapXX(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = 11; old_w.AO_val2 = 6410; new_w.AO_val1 = 3552; new_w.AO_val2 = 1746; TA_assert(!AO_double_compare_and_swapXX(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 8537; new_w.AO_val1 = 4116; new_w.AO_val2 = 2121; TA_assert(!AO_double_compare_and_swapXX(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 6410; new_w.AO_val1 = 1; TA_assert(AO_double_compare_and_swapXX(&w, old_w, new_w)); TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = w.AO_val2; new_w.AO_val1--; new_w.AO_val2 = 0; TA_assert(AO_double_compare_and_swapXX(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_double_compare_and_swap); # endif } asymptote-3.05/libatomic_ops/tests/list_atomic.template0000644000000000000000000001036015031566105022220 0ustar rootroot/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* This generates a compilable program. But it is really meant to be */ /* be used only with cc -E, to inspect the expensions generated by */ /* primitives. */ /* The result will not link or run. */ #include /* for exit() */ void XSIZE_list_atomicXX(void) { # if defined(AO_HAVE_XSIZE_loadXX) || defined(AO_HAVE_XSIZE_storeXX) \ || defined(AO_HAVE_XSIZE_fetch_and_addXX) \ || defined(AO_HAVE_XSIZE_fetch_and_add1XX) \ || defined(AO_HAVE_XSIZE_andXX) \ || defined(AO_HAVE_XSIZE_compare_and_swapXX) \ || defined(AO_HAVE_XSIZE_fetch_compare_and_swapXX) static volatile XCTYPE val /* = 0 */; # endif # if defined(AO_HAVE_XSIZE_compare_and_swapXX) \ || defined(AO_HAVE_XSIZE_fetch_compare_and_swapXX) static XCTYPE oldval /* = 0 */; # endif # if defined(AO_HAVE_XSIZE_storeXX) \ || defined(AO_HAVE_XSIZE_compare_and_swapXX) \ || defined(AO_HAVE_XSIZE_fetch_compare_and_swapXX) static XCTYPE newval /* = 0 */; # endif # if defined(AO_HAVE_test_and_setXX) AO_TS_t ts = AO_TS_INITIALIZER; # endif # if defined(AO_HAVE_XSIZE_fetch_and_addXX) || defined(AO_HAVE_XSIZE_andXX) \ || defined(AO_HAVE_XSIZE_orXX) || defined(AO_HAVE_XSIZE_xorXX) static XCTYPE incr /* = 0 */; # endif # if defined(AO_HAVE_nopXX) (void)"AO_nopXX(): "; AO_nopXX(); # else (void)"No AO_nopXX"; # endif # ifdef AO_HAVE_XSIZE_loadXX (void)"AO_XSIZE_loadXX(&val):"; (void)AO_XSIZE_loadXX(&val); # else (void)"No AO_XSIZE_loadXX"; # endif # ifdef AO_HAVE_XSIZE_storeXX (void)"AO_XSIZE_storeXX(&val, newval):"; AO_XSIZE_storeXX(&val, newval); # else (void)"No AO_XSIZE_storeXX"; # endif # ifdef AO_HAVE_XSIZE_fetch_and_addXX (void)"AO_XSIZE_fetch_and_addXX(&val, incr):"; (void)AO_XSIZE_fetch_and_addXX(&val, incr); # else (void)"No AO_XSIZE_fetch_and_addXX"; # endif # ifdef AO_HAVE_XSIZE_fetch_and_add1XX (void)"AO_XSIZE_fetch_and_add1XX(&val):"; (void)AO_XSIZE_fetch_and_add1XX(&val); # else (void)"No AO_XSIZE_fetch_and_add1XX"; # endif # ifdef AO_HAVE_XSIZE_fetch_and_sub1XX (void)"AO_XSIZE_fetch_and_sub1XX(&val):"; (void)AO_XSIZE_fetch_and_sub1XX(&val); # else (void)"No AO_XSIZE_fetch_and_sub1XX"; # endif # ifdef AO_HAVE_XSIZE_andXX (void)"AO_XSIZE_andXX(&val, incr):"; AO_XSIZE_andXX(&val, incr); # else (void)"No AO_XSIZE_andXX"; # endif # ifdef AO_HAVE_XSIZE_orXX (void)"AO_XSIZE_orXX(&val, incr):"; AO_XSIZE_orXX(&val, incr); # else (void)"No AO_XSIZE_orXX"; # endif # ifdef AO_HAVE_XSIZE_xorXX (void)"AO_XSIZE_xorXX(&val, incr):"; AO_XSIZE_xorXX(&val, incr); # else (void)"No AO_XSIZE_xorXX"; # endif # ifdef AO_HAVE_XSIZE_compare_and_swapXX (void)"AO_XSIZE_compare_and_swapXX(&val, oldval, newval):"; if (!AO_XSIZE_compare_and_swapXX(&val, oldval, newval)) exit(1); # else (void)"No AO_XSIZE_compare_and_swapXX"; # endif /* TODO: Add AO_compare_double_and_swap_doubleXX */ /* TODO: Add AO_compare_and_swap_doubleXX */ # ifdef AO_HAVE_XSIZE_fetch_compare_and_swapXX (void)"AO_XSIZE_fetch_compare_and_swapXX(&val, oldval, newval):"; if (AO_XSIZE_fetch_compare_and_swapXX(&val, oldval, newval) != oldval) exit(1); # else (void)"No AO_XSIZE_fetch_compare_and_swapXX"; # endif # if defined(AO_HAVE_test_and_setXX) (void)"AO_test_and_setXX(&ts):"; (void)AO_test_and_setXX(&ts); # else (void)"No AO_test_and_setXX"; # endif } asymptote-3.05/libatomic_ops/tests/test_stack.c0000644000000000000000000002436315031566105020474 0ustar rootroot/* * Copyright (c) 2005 Hewlett-Packard Development Company, L.P. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #if defined(HAVE_CONFIG_H) # include "config.h" #endif #include #if defined(__vxworks) int main(void) { printf("test skipped\n"); return 0; } #else #if ((defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__)) \ || defined(_MSC_VER) || defined(_WIN32_WINCE)) \ && !defined(AO_USE_WIN32_PTHREADS) # define USE_WINTHREADS #endif #ifdef USE_WINTHREADS # include #else # include #endif #include #include #include "atomic_ops_stack.h" /* includes atomic_ops.h as well */ #if (defined(_WIN32_WCE) || defined(__MINGW32CE__)) && !defined(AO_HAVE_abort) # define abort() _exit(-1) /* there is no abort() in WinCE */ #endif #ifndef MAX_NTHREADS # define MAX_NTHREADS 100 #endif #ifndef DEFAULT_NTHREADS # define DEFAULT_NTHREADS 16 /* must be <= MAX_NTHREADS */ #endif #ifdef NO_TIMES # define get_msecs() 0 #elif (defined(USE_WINTHREADS) || defined(AO_USE_WIN32_PTHREADS)) \ && !defined(CPPCHECK) # include unsigned long get_msecs(void) { struct timeb tb; ftime(&tb); return (unsigned long)tb.time * 1000 + tb.millitm; } #else /* Unix */ # include # include unsigned long get_msecs(void) { struct timeval tv; gettimeofday(&tv, 0); return (unsigned long)tv.tv_sec * 1000 + tv.tv_usec/1000; } #endif /* !NO_TIMES */ struct le { AO_t next; /* must be the first field */ int data; }; typedef union le_u { AO_t next; struct le e; } list_element; #if defined(CPPCHECK) AO_stack_t the_list; /* to test AO_stack_init() */ #else AO_stack_t the_list = AO_STACK_INITIALIZER; #endif /* Add elements from 1 to n to the list (1 is pushed first). */ /* This is called from a single thread only. */ void add_elements(int n) { list_element * le; if (n == 0) return; add_elements(n-1); le = (list_element *)malloc(sizeof(list_element)); if (le == 0) { fprintf(stderr, "Out of memory\n"); exit(2); } # if defined(CPPCHECK) le->e.next = 0; /* mark field as used */ # endif le->e.data = n; AO_stack_push(&the_list, &le->next); } #ifdef VERBOSE_STACK void print_list(void) { AO_t *p; for (p = AO_REAL_HEAD_PTR(the_list); p != 0; p = AO_REAL_NEXT_PTR(*p)) printf("%d\n", ((list_element*)p)->e.data); } #endif /* VERBOSE_STACK */ /* Check that the list contains only values from 1 to n, in any order, */ /* w/o duplications. Executed when the list mutation is finished. */ void check_list(int n) { AO_t *p; int i; int err_cnt = 0; char *marks = (char*)calloc(n + 1, 1); if (0 == marks) { fprintf(stderr, "Out of memory (marks)\n"); exit(2); } for (p = AO_REAL_HEAD_PTR(the_list); p != 0; p = AO_REAL_NEXT_PTR(*p)) { i = ((list_element*)p)->e.data; if (i > n || i <= 0) { fprintf(stderr, "Found erroneous list element %d\n", i); err_cnt++; } else if (marks[i] != 0) { fprintf(stderr, "Found duplicate list element %d\n", i); abort(); } else marks[i] = 1; } for (i = 1; i <= n; ++i) if (marks[i] != 1) { fprintf(stderr, "Missing list element %d\n", i); err_cnt++; } free(marks); if (err_cnt > 0) abort(); } volatile AO_t ops_performed = 0; #ifndef LIMIT /* Total number of push/pop ops in all threads per test. */ # ifdef AO_USE_PTHREAD_DEFS # define LIMIT 20000 # else # define LIMIT 1000000 # endif #endif #ifdef AO_HAVE_fetch_and_add # define fetch_then_add(addr, val) AO_fetch_and_add(addr, val) #else /* OK to perform it in two atomic steps, but really quite */ /* unacceptable for timing purposes. */ AO_INLINE AO_t fetch_then_add(volatile AO_t * addr, AO_t val) { AO_t result = AO_load(addr); AO_store(addr, result + val); return result; } #endif #ifdef USE_WINTHREADS DWORD WINAPI run_one_test(LPVOID arg) #else void * run_one_test(void * arg) #endif { AO_t *t[MAX_NTHREADS + 1]; unsigned index = (unsigned)(size_t)arg; unsigned i; # ifdef VERBOSE_STACK unsigned j = 0; printf("starting thread %u\n", index); # endif assert(index <= MAX_NTHREADS); while (fetch_then_add(&ops_performed, index + 1) + index + 1 < LIMIT) { /* Pop index+1 elements (where index is the thread's one), then */ /* push them back (in the same order of operations). */ /* Note that this is done in parallel by many threads. */ for (i = 0; i <= index; ++i) { t[i] = AO_stack_pop(&the_list); if (0 == t[i]) { /* This should not happen as at most n*(n+1)/2 elements */ /* could be popped off at a time. */ fprintf(stderr, "Failed - nothing to pop\n"); abort(); } } for (i = 0; i <= index; ++i) { AO_stack_push(&the_list, t[i]); } # ifdef VERBOSE_STACK j += index + 1; # endif } /* Repeat until LIMIT push/pop operations are performed (by all */ /* the threads simultaneously). */ # ifdef VERBOSE_STACK printf("finished thread %u: %u total ops\n", index, j); # endif return 0; } #ifndef N_EXPERIMENTS # define N_EXPERIMENTS 1 #endif unsigned long times[MAX_NTHREADS + 1][N_EXPERIMENTS]; void run_one_experiment(int max_nthreads, int exper_n) { int nthreads; assert(max_nthreads <= MAX_NTHREADS); assert(exper_n < N_EXPERIMENTS); for (nthreads = 1; nthreads <= max_nthreads; ++nthreads) { unsigned i; # ifdef USE_WINTHREADS DWORD thread_id; HANDLE thread[MAX_NTHREADS]; # else pthread_t thread[MAX_NTHREADS]; # endif int list_length = nthreads*(nthreads+1)/2; unsigned long start_time; AO_t *le; # ifdef VERBOSE_STACK printf("Before add_elements: exper_n=%d, nthreads=%d," " max_nthreads=%d, list_length=%d\n", exper_n, nthreads, max_nthreads, list_length); # endif /* Create a list with n*(n+1)/2 elements. */ assert(0 == AO_REAL_HEAD_PTR(the_list)); add_elements(list_length); # ifdef VERBOSE_STACK printf("Initial list (nthreads = %d):\n", nthreads); print_list(); # endif ops_performed = 0; start_time = get_msecs(); /* Start n-1 threads to run_one_test in parallel. */ for (i = 1; (int)i < nthreads; ++i) { int code; # ifdef USE_WINTHREADS thread[i] = CreateThread(NULL, 0, run_one_test, (LPVOID)(size_t)i, 0, &thread_id); code = thread[i] != NULL ? 0 : (int)GetLastError(); # else code = pthread_create(&thread[i], 0, run_one_test, (void *)(size_t)i); # endif if (code != 0) { fprintf(stderr, "Thread creation failed %u\n", (unsigned)code); exit(3); } } /* We use the main thread to run one test. This allows */ /* gprof profiling to work, for example. */ run_one_test(0); /* Wait for all the threads to complete. */ for (i = 1; (int)i < nthreads; ++i) { int code; # ifdef USE_WINTHREADS code = WaitForSingleObject(thread[i], INFINITE) == WAIT_OBJECT_0 ? 0 : (int)GetLastError(); # else code = pthread_join(thread[i], 0); # endif if (code != 0) { fprintf(stderr, "Thread join failed %u\n", (unsigned)code); abort(); } } times[nthreads][exper_n] = get_msecs() - start_time; # ifdef VERBOSE_STACK printf("nthreads=%d, time_ms=%lu\n", nthreads, times[nthreads][exper_n]); printf("final list (should be reordered initial list):\n"); print_list(); # endif /* Ensure that no element is lost or duplicated. */ check_list(list_length); /* And, free the entire list. */ while ((le = AO_stack_pop(&the_list)) != 0) free(le); /* Retry with larger n values. */ } } void run_all_experiments(int max_nthreads) { int exper_n; for (exper_n = 0; exper_n < N_EXPERIMENTS; ++exper_n) run_one_experiment(max_nthreads, exper_n); } /* Output the performance statistic. */ void output_stat(int max_nthreads) { int nthreads; assert(max_nthreads <= MAX_NTHREADS); for (nthreads = 1; nthreads <= max_nthreads; ++nthreads) { # ifndef NO_TIMES int exper_n; unsigned long sum = 0; # endif printf("About %d pushes + %d pops in %d threads:", LIMIT, LIMIT, nthreads); # ifndef NO_TIMES for (exper_n = 0; exper_n < N_EXPERIMENTS; ++exper_n) { # ifdef VERBOSE_STACK printf(" [%lums]", times[nthreads][exper_n]); # endif sum += times[nthreads][exper_n]; } printf(" %lu msecs\n", (sum + N_EXPERIMENTS/2)/N_EXPERIMENTS); # else printf(" completed\n"); # endif } } int main(int argc, char **argv) { int max_nthreads = DEFAULT_NTHREADS; if (2 == argc) { max_nthreads = atoi(argv[1]); if (max_nthreads < 1 || max_nthreads > MAX_NTHREADS) { fprintf(stderr, "Invalid max # of threads argument\n"); exit(1); } } else if (argc > 2) { fprintf(stderr, "Usage: %s [max # of threads]\n", argv[0]); exit(1); } if (!AO_stack_is_lock_free()) printf("Use almost-lock-free implementation\n"); # if defined(CPPCHECK) AO_stack_init(&the_list); # endif run_all_experiments(max_nthreads); output_stat(max_nthreads); return 0; } #endif asymptote-3.05/libatomic_ops/tests/test_atomic_include.h0000644000000000000000000060446015031566105022355 0ustar rootroot/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Some basic sanity tests. These do not test the barrier semantics. */ #undef TA_assert #define TA_assert(e) \ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: )\n", \ __FILE__, __LINE__), exit(1); } #undef MISSING #define MISSING(name) \ printf("Missing: %s\n", #name "") #if defined(CPPCHECK) void list_atomic(void); void char_list_atomic(void); void short_list_atomic(void); void int_list_atomic(void); void double_list_atomic(void); #endif void test_atomic(void) { AO_t x; unsigned char b; unsigned short s; unsigned int zz; # if defined(AO_HAVE_test_and_set) AO_TS_t z = AO_TS_INITIALIZER; # endif # if defined(AO_HAVE_double_compare_and_swap) \ || defined(AO_HAVE_double_load) \ || defined(AO_HAVE_double_store) static AO_double_t old_w; /* static to avoid misalignment */ AO_double_t new_w; # endif # if defined(AO_HAVE_compare_and_swap_double) \ || defined(AO_HAVE_compare_double_and_swap_double) \ || defined(AO_HAVE_double_compare_and_swap) static AO_double_t w; /* static to avoid misalignment */ w.AO_val1 = 0; w.AO_val2 = 0; # endif # if defined(CPPCHECK) list_atomic(); char_list_atomic(); short_list_atomic(); int_list_atomic(); double_list_atomic(); # endif # if defined(AO_HAVE_nop) AO_nop(); # elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write) MISSING(AO_nop); # endif # if defined(AO_HAVE_store) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */ # endif AO_store(&x, 13); TA_assert(x == 13); # else # if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \ || !defined(AO_HAVE_store_release) \ || !defined(AO_HAVE_store_release_write) \ || !defined(AO_HAVE_store_write) MISSING(AO_store); # endif x = 13; # endif # if defined(AO_HAVE_load) TA_assert(AO_load(&x) == 13); # elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \ || !defined(AO_HAVE_load_acquire_read) \ || !defined(AO_HAVE_load_dd_acquire_read) \ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read) MISSING(AO_load); # endif # if defined(AO_HAVE_test_and_set) TA_assert(AO_test_and_set(&z) == AO_TS_CLEAR); TA_assert(AO_test_and_set(&z) == AO_TS_SET); TA_assert(AO_test_and_set(&z) == AO_TS_SET); AO_CLEAR(&z); # else MISSING(AO_test_and_set); # endif # if defined(AO_HAVE_fetch_and_add) TA_assert(AO_fetch_and_add(&x, 42) == 13); TA_assert(AO_fetch_and_add(&x, (AO_t)(-42)) == 55); # else MISSING(AO_fetch_and_add); # endif # if defined(AO_HAVE_fetch_and_add1) TA_assert(AO_fetch_and_add1(&x) == 13); # else MISSING(AO_fetch_and_add1); ++x; # endif # if defined(AO_HAVE_fetch_and_sub1) TA_assert(AO_fetch_and_sub1(&x) == 14); # else MISSING(AO_fetch_and_sub1); --x; # endif # if defined(AO_HAVE_short_store) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile short *)&s = 0; # endif AO_short_store(&s, 13); # else # if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \ || !defined(AO_HAVE_short_store_release) \ || !defined(AO_HAVE_short_store_release_write) \ || !defined(AO_HAVE_short_store_write) MISSING(AO_short_store); # endif s = 13; # endif # if defined(AO_HAVE_short_load) TA_assert(AO_short_load(&s) == 13); # elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \ || !defined(AO_HAVE_short_load_acquire_read) \ || !defined(AO_HAVE_short_load_dd_acquire_read) \ || !defined(AO_HAVE_short_load_full) \ || !defined(AO_HAVE_short_load_read) MISSING(AO_short_load); # endif # if defined(AO_HAVE_short_fetch_and_add) TA_assert(AO_short_fetch_and_add(&s, 42) == 13); TA_assert(AO_short_fetch_and_add(&s, (unsigned short)-42) == 55); # else MISSING(AO_short_fetch_and_add); # endif # if defined(AO_HAVE_short_fetch_and_add1) TA_assert(AO_short_fetch_and_add1(&s) == 13); # else MISSING(AO_short_fetch_and_add1); ++s; # endif # if defined(AO_HAVE_short_fetch_and_sub1) TA_assert(AO_short_fetch_and_sub1(&s) == 14); # else MISSING(AO_short_fetch_and_sub1); --s; # endif TA_assert(*(volatile short *)&s == 13); # if defined(AO_HAVE_char_store) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile char *)&b = 0; # endif AO_char_store(&b, 13); # else # if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \ || !defined(AO_HAVE_char_store_release) \ || !defined(AO_HAVE_char_store_release_write) \ || !defined(AO_HAVE_char_store_write) MISSING(AO_char_store); # endif b = 13; # endif # if defined(AO_HAVE_char_load) TA_assert(AO_char_load(&b) == 13); # elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \ || !defined(AO_HAVE_char_load_acquire_read) \ || !defined(AO_HAVE_char_load_dd_acquire_read) \ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read) MISSING(AO_char_load); # endif # if defined(AO_HAVE_char_fetch_and_add) TA_assert(AO_char_fetch_and_add(&b, 42) == 13); TA_assert(AO_char_fetch_and_add(&b, (unsigned char)-42) == 55); # else MISSING(AO_char_fetch_and_add); # endif # if defined(AO_HAVE_char_fetch_and_add1) TA_assert(AO_char_fetch_and_add1(&b) == 13); # else MISSING(AO_char_fetch_and_add1); ++b; # endif # if defined(AO_HAVE_char_fetch_and_sub1) TA_assert(AO_char_fetch_and_sub1(&b) == 14); # else MISSING(AO_char_fetch_and_sub1); --b; # endif TA_assert(*(volatile char *)&b == 13); # if defined(AO_HAVE_int_store) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile int *)&zz = 0; # endif AO_int_store(&zz, 13); # else # if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \ || !defined(AO_HAVE_int_store_release) \ || !defined(AO_HAVE_int_store_release_write) \ || !defined(AO_HAVE_int_store_write) MISSING(AO_int_store); # endif zz = 13; # endif # if defined(AO_HAVE_int_load) TA_assert(AO_int_load(&zz) == 13); # elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \ || !defined(AO_HAVE_int_load_acquire_read) \ || !defined(AO_HAVE_int_load_dd_acquire_read) \ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read) MISSING(AO_int_load); # endif # if defined(AO_HAVE_int_fetch_and_add) TA_assert(AO_int_fetch_and_add(&zz, 42) == 13); TA_assert(AO_int_fetch_and_add(&zz, (unsigned int)-42) == 55); # else MISSING(AO_int_fetch_and_add); # endif # if defined(AO_HAVE_int_fetch_and_add1) TA_assert(AO_int_fetch_and_add1(&zz) == 13); # else MISSING(AO_int_fetch_and_add1); ++zz; # endif # if defined(AO_HAVE_int_fetch_and_sub1) TA_assert(AO_int_fetch_and_sub1(&zz) == 14); # else MISSING(AO_int_fetch_and_sub1); --zz; # endif TA_assert(*(volatile int *)&zz == 13); # if defined(AO_HAVE_compare_and_swap) TA_assert(!AO_compare_and_swap(&x, 14, 42)); TA_assert(x == 13); TA_assert(AO_compare_and_swap(&x, 13, 42)); TA_assert(x == 42); # else MISSING(AO_compare_and_swap); if (*(volatile AO_t *)&x == 13) x = 42; # endif # if defined(AO_HAVE_or) AO_or(&x, 66); TA_assert(x == 106); # else # if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write) MISSING(AO_or); # endif x |= 66; # endif # if defined(AO_HAVE_xor) AO_xor(&x, 181); TA_assert(x == 223); # else # if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write) MISSING(AO_xor); # endif x ^= 181; # endif # if defined(AO_HAVE_and) AO_and(&x, 57); TA_assert(x == 25); # else # if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write) MISSING(AO_and); # endif x &= 57; # endif # if defined(AO_HAVE_fetch_compare_and_swap) TA_assert(AO_fetch_compare_and_swap(&x, 14, 117) == 25); TA_assert(x == 25); TA_assert(AO_fetch_compare_and_swap(&x, 25, 117) == 25); # else MISSING(AO_fetch_compare_and_swap); if (x == 25) x = 117; # endif TA_assert(x == 117); # if defined(AO_HAVE_short_compare_and_swap) TA_assert(!AO_short_compare_and_swap(&s, 14, 42)); TA_assert(s == 13); TA_assert(AO_short_compare_and_swap(&s, 13, 42)); TA_assert(s == 42); # else MISSING(AO_short_compare_and_swap); if (*(volatile short *)&s == 13) s = 42; # endif # if defined(AO_HAVE_short_or) AO_short_or(&s, 66); TA_assert(s == 106); # else # if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \ || !defined(AO_HAVE_short_or_acquire_read) \ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \ || !defined(AO_HAVE_short_or_release) \ || !defined(AO_HAVE_short_or_release_write) \ || !defined(AO_HAVE_short_or_write) MISSING(AO_short_or); # endif s |= 66; # endif # if defined(AO_HAVE_short_xor) AO_short_xor(&s, 181); TA_assert(s == 223); # else # if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \ || !defined(AO_HAVE_short_xor_acquire_read) \ || !defined(AO_HAVE_short_xor_full) \ || !defined(AO_HAVE_short_xor_read) \ || !defined(AO_HAVE_short_xor_release) \ || !defined(AO_HAVE_short_xor_release_write) \ || !defined(AO_HAVE_short_xor_write) MISSING(AO_short_xor); # endif s ^= 181; # endif # if defined(AO_HAVE_short_and) AO_short_and(&s, 57); TA_assert(s == 25); # else # if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \ || !defined(AO_HAVE_short_and_acquire_read) \ || !defined(AO_HAVE_short_and_full) \ || !defined(AO_HAVE_short_and_read) \ || !defined(AO_HAVE_short_and_release) \ || !defined(AO_HAVE_short_and_release_write) \ || !defined(AO_HAVE_short_and_write) MISSING(AO_short_and); # endif s &= 57; # endif # if defined(AO_HAVE_short_fetch_compare_and_swap) TA_assert(AO_short_fetch_compare_and_swap(&s, 14, 117) == 25); TA_assert(s == 25); TA_assert(AO_short_fetch_compare_and_swap(&s, 25, 117) == 25); # else MISSING(AO_short_fetch_compare_and_swap); if (s == 25) s = 117; # endif TA_assert(s == 117); # if defined(AO_HAVE_char_compare_and_swap) TA_assert(!AO_char_compare_and_swap(&b, 14, 42)); TA_assert(b == 13); TA_assert(AO_char_compare_and_swap(&b, 13, 42)); TA_assert(b == 42); # else MISSING(AO_char_compare_and_swap); if (*(volatile char *)&b == 13) b = 42; # endif # if defined(AO_HAVE_char_or) AO_char_or(&b, 66); TA_assert(b == 106); # else # if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \ || !defined(AO_HAVE_char_or_acquire_read) \ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \ || !defined(AO_HAVE_char_or_release) \ || !defined(AO_HAVE_char_or_release_write) \ || !defined(AO_HAVE_char_or_write) MISSING(AO_char_or); # endif b |= 66; # endif # if defined(AO_HAVE_char_xor) AO_char_xor(&b, 181); TA_assert(b == 223); # else # if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \ || !defined(AO_HAVE_char_xor_acquire_read) \ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \ || !defined(AO_HAVE_char_xor_release) \ || !defined(AO_HAVE_char_xor_release_write) \ || !defined(AO_HAVE_char_xor_write) MISSING(AO_char_xor); # endif b ^= 181; # endif # if defined(AO_HAVE_char_and) AO_char_and(&b, 57); TA_assert(b == 25); # else # if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \ || !defined(AO_HAVE_char_and_acquire_read) \ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \ || !defined(AO_HAVE_char_and_release) \ || !defined(AO_HAVE_char_and_release_write) \ || !defined(AO_HAVE_char_and_write) MISSING(AO_char_and); # endif b &= 57; # endif # if defined(AO_HAVE_char_fetch_compare_and_swap) TA_assert(AO_char_fetch_compare_and_swap(&b, 14, 117) == 25); TA_assert(b == 25); TA_assert(AO_char_fetch_compare_and_swap(&b, 25, 117) == 25); # else MISSING(AO_char_fetch_compare_and_swap); if (b == 25) b = 117; # endif TA_assert(b == 117); # if defined(AO_HAVE_int_compare_and_swap) TA_assert(!AO_int_compare_and_swap(&zz, 14, 42)); TA_assert(zz == 13); TA_assert(AO_int_compare_and_swap(&zz, 13, 42)); TA_assert(zz == 42); # else MISSING(AO_int_compare_and_swap); if (*(volatile int *)&zz == 13) zz = 42; # endif # if defined(AO_HAVE_int_or) AO_int_or(&zz, 66); TA_assert(zz == 106); # else # if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \ || !defined(AO_HAVE_int_or_acquire_read) \ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \ || !defined(AO_HAVE_int_or_release) \ || !defined(AO_HAVE_int_or_release_write) \ || !defined(AO_HAVE_int_or_write) MISSING(AO_int_or); # endif zz |= 66; # endif # if defined(AO_HAVE_int_xor) AO_int_xor(&zz, 181); TA_assert(zz == 223); # else # if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \ || !defined(AO_HAVE_int_xor_acquire_read) \ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \ || !defined(AO_HAVE_int_xor_release) \ || !defined(AO_HAVE_int_xor_release_write) \ || !defined(AO_HAVE_int_xor_write) MISSING(AO_int_xor); # endif zz ^= 181; # endif # if defined(AO_HAVE_int_and) AO_int_and(&zz, 57); TA_assert(zz == 25); # else # if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \ || !defined(AO_HAVE_int_and_acquire_read) \ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \ || !defined(AO_HAVE_int_and_release) \ || !defined(AO_HAVE_int_and_release_write) \ || !defined(AO_HAVE_int_and_write) MISSING(AO_int_and); # endif zz &= 57; # endif # if defined(AO_HAVE_int_fetch_compare_and_swap) TA_assert(AO_int_fetch_compare_and_swap(&zz, 14, 117) == 25); TA_assert(zz == 25); TA_assert(AO_int_fetch_compare_and_swap(&zz, 25, 117) == 25); # else MISSING(AO_int_fetch_compare_and_swap); if (zz == 25) zz = 117; # endif TA_assert(zz == 117); # if defined(AO_HAVE_double_load) || defined(AO_HAVE_double_store) /* Initialize old_w even for store to workaround MSan warning. */ old_w.AO_val1 = 3316; old_w.AO_val2 = 2921; # endif # if defined(AO_HAVE_double_load) new_w = AO_double_load(&old_w); TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921); # elif !defined(AO_HAVE_double_load) \ || !defined(AO_HAVE_double_load_acquire) \ || !defined(AO_HAVE_double_load_acquire_read) \ || !defined(AO_HAVE_double_load_dd_acquire_read) \ || !defined(AO_HAVE_double_load_full) \ || !defined(AO_HAVE_double_load_read) MISSING(AO_double_load); # endif # if defined(AO_HAVE_double_store) new_w.AO_val1 = 1375; new_w.AO_val2 = 8243; AO_double_store(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); AO_double_store(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); new_w.AO_val1 ^= old_w.AO_val1; new_w.AO_val2 ^= old_w.AO_val2; AO_double_store(&old_w, new_w); TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0); # elif !defined(AO_HAVE_double_store) \ || !defined(AO_HAVE_double_store_full) \ || !defined(AO_HAVE_double_store_release) \ || !defined(AO_HAVE_double_store_release_write) \ || !defined(AO_HAVE_double_store_write) MISSING(AO_double_store); # endif # if defined(AO_HAVE_compare_double_and_swap_double) TA_assert(!AO_compare_double_and_swap_double(&w, 17, 42, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_double_and_swap_double(&w, 0, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double(&w, 12, 14, 64, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double(&w, 11, 13, 85, 82)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double(&w, 13, 12, 17, 42)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_double_and_swap_double(&w, 12, 13, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_double_and_swap_double(&w, 17, 42, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_double_and_swap_double); # endif # if defined(AO_HAVE_compare_and_swap_double) TA_assert(!AO_compare_and_swap_double(&w, 17, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_and_swap_double(&w, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double(&w, 13, 12, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double(&w, 1213, 48, 86)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_and_swap_double(&w, 12, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_and_swap_double(&w, 17, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_and_swap_double); # endif # if defined(AO_HAVE_double_compare_and_swap) old_w.AO_val1 = 4116; old_w.AO_val2 = 2121; new_w.AO_val1 = 8537; new_w.AO_val2 = 6410; TA_assert(!AO_double_compare_and_swap(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_double_compare_and_swap(&w, w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = 29; new_w.AO_val1 = 820; new_w.AO_val2 = 5917; TA_assert(!AO_double_compare_and_swap(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = 11; old_w.AO_val2 = 6410; new_w.AO_val1 = 3552; new_w.AO_val2 = 1746; TA_assert(!AO_double_compare_and_swap(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 8537; new_w.AO_val1 = 4116; new_w.AO_val2 = 2121; TA_assert(!AO_double_compare_and_swap(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 6410; new_w.AO_val1 = 1; TA_assert(AO_double_compare_and_swap(&w, old_w, new_w)); TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = w.AO_val2; new_w.AO_val1--; new_w.AO_val2 = 0; TA_assert(AO_double_compare_and_swap(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_double_compare_and_swap); # endif } /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Some basic sanity tests. These do not test the barrier semantics. */ #undef TA_assert #define TA_assert(e) \ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _release)\n", \ __FILE__, __LINE__), exit(1); } #undef MISSING #define MISSING(name) \ printf("Missing: %s\n", #name "_release") #if defined(CPPCHECK) void list_atomic_release(void); void char_list_atomic_release(void); void short_list_atomic_release(void); void int_list_atomic_release(void); void double_list_atomic_release(void); #endif void test_atomic_release(void) { AO_t x; unsigned char b; unsigned short s; unsigned int zz; # if defined(AO_HAVE_test_and_set_release) AO_TS_t z = AO_TS_INITIALIZER; # endif # if defined(AO_HAVE_double_compare_and_swap_release) \ || defined(AO_HAVE_double_load_release) \ || defined(AO_HAVE_double_store_release) static AO_double_t old_w; /* static to avoid misalignment */ AO_double_t new_w; # endif # if defined(AO_HAVE_compare_and_swap_double_release) \ || defined(AO_HAVE_compare_double_and_swap_double_release) \ || defined(AO_HAVE_double_compare_and_swap_release) static AO_double_t w; /* static to avoid misalignment */ w.AO_val1 = 0; w.AO_val2 = 0; # endif # if defined(CPPCHECK) list_atomic_release(); char_list_atomic_release(); short_list_atomic_release(); int_list_atomic_release(); double_list_atomic_release(); # endif # if defined(AO_HAVE_nop_release) AO_nop_release(); # elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write) MISSING(AO_nop); # endif # if defined(AO_HAVE_store_release) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */ # endif AO_store_release(&x, 13); TA_assert(x == 13); # else # if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \ || !defined(AO_HAVE_store_release) \ || !defined(AO_HAVE_store_release_write) \ || !defined(AO_HAVE_store_write) MISSING(AO_store); # endif x = 13; # endif # if defined(AO_HAVE_load_release) TA_assert(AO_load_release(&x) == 13); # elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \ || !defined(AO_HAVE_load_acquire_read) \ || !defined(AO_HAVE_load_dd_acquire_read) \ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read) MISSING(AO_load); # endif # if defined(AO_HAVE_test_and_set_release) TA_assert(AO_test_and_set_release(&z) == AO_TS_CLEAR); TA_assert(AO_test_and_set_release(&z) == AO_TS_SET); TA_assert(AO_test_and_set_release(&z) == AO_TS_SET); AO_CLEAR(&z); # else MISSING(AO_test_and_set); # endif # if defined(AO_HAVE_fetch_and_add_release) TA_assert(AO_fetch_and_add_release(&x, 42) == 13); TA_assert(AO_fetch_and_add_release(&x, (AO_t)(-42)) == 55); # else MISSING(AO_fetch_and_add); # endif # if defined(AO_HAVE_fetch_and_add1_release) TA_assert(AO_fetch_and_add1_release(&x) == 13); # else MISSING(AO_fetch_and_add1); ++x; # endif # if defined(AO_HAVE_fetch_and_sub1_release) TA_assert(AO_fetch_and_sub1_release(&x) == 14); # else MISSING(AO_fetch_and_sub1); --x; # endif # if defined(AO_HAVE_short_store_release) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile short *)&s = 0; # endif AO_short_store_release(&s, 13); # else # if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \ || !defined(AO_HAVE_short_store_release) \ || !defined(AO_HAVE_short_store_release_write) \ || !defined(AO_HAVE_short_store_write) MISSING(AO_short_store); # endif s = 13; # endif # if defined(AO_HAVE_short_load_release) TA_assert(AO_short_load(&s) == 13); # elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \ || !defined(AO_HAVE_short_load_acquire_read) \ || !defined(AO_HAVE_short_load_dd_acquire_read) \ || !defined(AO_HAVE_short_load_full) \ || !defined(AO_HAVE_short_load_read) MISSING(AO_short_load); # endif # if defined(AO_HAVE_short_fetch_and_add_release) TA_assert(AO_short_fetch_and_add_release(&s, 42) == 13); TA_assert(AO_short_fetch_and_add_release(&s, (unsigned short)-42) == 55); # else MISSING(AO_short_fetch_and_add); # endif # if defined(AO_HAVE_short_fetch_and_add1_release) TA_assert(AO_short_fetch_and_add1_release(&s) == 13); # else MISSING(AO_short_fetch_and_add1); ++s; # endif # if defined(AO_HAVE_short_fetch_and_sub1_release) TA_assert(AO_short_fetch_and_sub1_release(&s) == 14); # else MISSING(AO_short_fetch_and_sub1); --s; # endif TA_assert(*(volatile short *)&s == 13); # if defined(AO_HAVE_char_store_release) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile char *)&b = 0; # endif AO_char_store_release(&b, 13); # else # if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \ || !defined(AO_HAVE_char_store_release) \ || !defined(AO_HAVE_char_store_release_write) \ || !defined(AO_HAVE_char_store_write) MISSING(AO_char_store); # endif b = 13; # endif # if defined(AO_HAVE_char_load_release) TA_assert(AO_char_load(&b) == 13); # elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \ || !defined(AO_HAVE_char_load_acquire_read) \ || !defined(AO_HAVE_char_load_dd_acquire_read) \ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read) MISSING(AO_char_load); # endif # if defined(AO_HAVE_char_fetch_and_add_release) TA_assert(AO_char_fetch_and_add_release(&b, 42) == 13); TA_assert(AO_char_fetch_and_add_release(&b, (unsigned char)-42) == 55); # else MISSING(AO_char_fetch_and_add); # endif # if defined(AO_HAVE_char_fetch_and_add1_release) TA_assert(AO_char_fetch_and_add1_release(&b) == 13); # else MISSING(AO_char_fetch_and_add1); ++b; # endif # if defined(AO_HAVE_char_fetch_and_sub1_release) TA_assert(AO_char_fetch_and_sub1_release(&b) == 14); # else MISSING(AO_char_fetch_and_sub1); --b; # endif TA_assert(*(volatile char *)&b == 13); # if defined(AO_HAVE_int_store_release) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile int *)&zz = 0; # endif AO_int_store_release(&zz, 13); # else # if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \ || !defined(AO_HAVE_int_store_release) \ || !defined(AO_HAVE_int_store_release_write) \ || !defined(AO_HAVE_int_store_write) MISSING(AO_int_store); # endif zz = 13; # endif # if defined(AO_HAVE_int_load_release) TA_assert(AO_int_load(&zz) == 13); # elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \ || !defined(AO_HAVE_int_load_acquire_read) \ || !defined(AO_HAVE_int_load_dd_acquire_read) \ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read) MISSING(AO_int_load); # endif # if defined(AO_HAVE_int_fetch_and_add_release) TA_assert(AO_int_fetch_and_add_release(&zz, 42) == 13); TA_assert(AO_int_fetch_and_add_release(&zz, (unsigned int)-42) == 55); # else MISSING(AO_int_fetch_and_add); # endif # if defined(AO_HAVE_int_fetch_and_add1_release) TA_assert(AO_int_fetch_and_add1_release(&zz) == 13); # else MISSING(AO_int_fetch_and_add1); ++zz; # endif # if defined(AO_HAVE_int_fetch_and_sub1_release) TA_assert(AO_int_fetch_and_sub1_release(&zz) == 14); # else MISSING(AO_int_fetch_and_sub1); --zz; # endif TA_assert(*(volatile int *)&zz == 13); # if defined(AO_HAVE_compare_and_swap_release) TA_assert(!AO_compare_and_swap_release(&x, 14, 42)); TA_assert(x == 13); TA_assert(AO_compare_and_swap_release(&x, 13, 42)); TA_assert(x == 42); # else MISSING(AO_compare_and_swap); if (*(volatile AO_t *)&x == 13) x = 42; # endif # if defined(AO_HAVE_or_release) AO_or_release(&x, 66); TA_assert(x == 106); # else # if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write) MISSING(AO_or); # endif x |= 66; # endif # if defined(AO_HAVE_xor_release) AO_xor_release(&x, 181); TA_assert(x == 223); # else # if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write) MISSING(AO_xor); # endif x ^= 181; # endif # if defined(AO_HAVE_and_release) AO_and_release(&x, 57); TA_assert(x == 25); # else # if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write) MISSING(AO_and); # endif x &= 57; # endif # if defined(AO_HAVE_fetch_compare_and_swap_release) TA_assert(AO_fetch_compare_and_swap_release(&x, 14, 117) == 25); TA_assert(x == 25); TA_assert(AO_fetch_compare_and_swap_release(&x, 25, 117) == 25); # else MISSING(AO_fetch_compare_and_swap); if (x == 25) x = 117; # endif TA_assert(x == 117); # if defined(AO_HAVE_short_compare_and_swap_release) TA_assert(!AO_short_compare_and_swap_release(&s, 14, 42)); TA_assert(s == 13); TA_assert(AO_short_compare_and_swap_release(&s, 13, 42)); TA_assert(s == 42); # else MISSING(AO_short_compare_and_swap); if (*(volatile short *)&s == 13) s = 42; # endif # if defined(AO_HAVE_short_or_release) AO_short_or_release(&s, 66); TA_assert(s == 106); # else # if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \ || !defined(AO_HAVE_short_or_acquire_read) \ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \ || !defined(AO_HAVE_short_or_release) \ || !defined(AO_HAVE_short_or_release_write) \ || !defined(AO_HAVE_short_or_write) MISSING(AO_short_or); # endif s |= 66; # endif # if defined(AO_HAVE_short_xor_release) AO_short_xor_release(&s, 181); TA_assert(s == 223); # else # if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \ || !defined(AO_HAVE_short_xor_acquire_read) \ || !defined(AO_HAVE_short_xor_full) \ || !defined(AO_HAVE_short_xor_read) \ || !defined(AO_HAVE_short_xor_release) \ || !defined(AO_HAVE_short_xor_release_write) \ || !defined(AO_HAVE_short_xor_write) MISSING(AO_short_xor); # endif s ^= 181; # endif # if defined(AO_HAVE_short_and_release) AO_short_and_release(&s, 57); TA_assert(s == 25); # else # if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \ || !defined(AO_HAVE_short_and_acquire_read) \ || !defined(AO_HAVE_short_and_full) \ || !defined(AO_HAVE_short_and_read) \ || !defined(AO_HAVE_short_and_release) \ || !defined(AO_HAVE_short_and_release_write) \ || !defined(AO_HAVE_short_and_write) MISSING(AO_short_and); # endif s &= 57; # endif # if defined(AO_HAVE_short_fetch_compare_and_swap_release) TA_assert(AO_short_fetch_compare_and_swap_release(&s, 14, 117) == 25); TA_assert(s == 25); TA_assert(AO_short_fetch_compare_and_swap_release(&s, 25, 117) == 25); # else MISSING(AO_short_fetch_compare_and_swap); if (s == 25) s = 117; # endif TA_assert(s == 117); # if defined(AO_HAVE_char_compare_and_swap_release) TA_assert(!AO_char_compare_and_swap_release(&b, 14, 42)); TA_assert(b == 13); TA_assert(AO_char_compare_and_swap_release(&b, 13, 42)); TA_assert(b == 42); # else MISSING(AO_char_compare_and_swap); if (*(volatile char *)&b == 13) b = 42; # endif # if defined(AO_HAVE_char_or_release) AO_char_or_release(&b, 66); TA_assert(b == 106); # else # if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \ || !defined(AO_HAVE_char_or_acquire_read) \ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \ || !defined(AO_HAVE_char_or_release) \ || !defined(AO_HAVE_char_or_release_write) \ || !defined(AO_HAVE_char_or_write) MISSING(AO_char_or); # endif b |= 66; # endif # if defined(AO_HAVE_char_xor_release) AO_char_xor_release(&b, 181); TA_assert(b == 223); # else # if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \ || !defined(AO_HAVE_char_xor_acquire_read) \ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \ || !defined(AO_HAVE_char_xor_release) \ || !defined(AO_HAVE_char_xor_release_write) \ || !defined(AO_HAVE_char_xor_write) MISSING(AO_char_xor); # endif b ^= 181; # endif # if defined(AO_HAVE_char_and_release) AO_char_and_release(&b, 57); TA_assert(b == 25); # else # if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \ || !defined(AO_HAVE_char_and_acquire_read) \ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \ || !defined(AO_HAVE_char_and_release) \ || !defined(AO_HAVE_char_and_release_write) \ || !defined(AO_HAVE_char_and_write) MISSING(AO_char_and); # endif b &= 57; # endif # if defined(AO_HAVE_char_fetch_compare_and_swap_release) TA_assert(AO_char_fetch_compare_and_swap_release(&b, 14, 117) == 25); TA_assert(b == 25); TA_assert(AO_char_fetch_compare_and_swap_release(&b, 25, 117) == 25); # else MISSING(AO_char_fetch_compare_and_swap); if (b == 25) b = 117; # endif TA_assert(b == 117); # if defined(AO_HAVE_int_compare_and_swap_release) TA_assert(!AO_int_compare_and_swap_release(&zz, 14, 42)); TA_assert(zz == 13); TA_assert(AO_int_compare_and_swap_release(&zz, 13, 42)); TA_assert(zz == 42); # else MISSING(AO_int_compare_and_swap); if (*(volatile int *)&zz == 13) zz = 42; # endif # if defined(AO_HAVE_int_or_release) AO_int_or_release(&zz, 66); TA_assert(zz == 106); # else # if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \ || !defined(AO_HAVE_int_or_acquire_read) \ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \ || !defined(AO_HAVE_int_or_release) \ || !defined(AO_HAVE_int_or_release_write) \ || !defined(AO_HAVE_int_or_write) MISSING(AO_int_or); # endif zz |= 66; # endif # if defined(AO_HAVE_int_xor_release) AO_int_xor_release(&zz, 181); TA_assert(zz == 223); # else # if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \ || !defined(AO_HAVE_int_xor_acquire_read) \ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \ || !defined(AO_HAVE_int_xor_release) \ || !defined(AO_HAVE_int_xor_release_write) \ || !defined(AO_HAVE_int_xor_write) MISSING(AO_int_xor); # endif zz ^= 181; # endif # if defined(AO_HAVE_int_and_release) AO_int_and_release(&zz, 57); TA_assert(zz == 25); # else # if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \ || !defined(AO_HAVE_int_and_acquire_read) \ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \ || !defined(AO_HAVE_int_and_release) \ || !defined(AO_HAVE_int_and_release_write) \ || !defined(AO_HAVE_int_and_write) MISSING(AO_int_and); # endif zz &= 57; # endif # if defined(AO_HAVE_int_fetch_compare_and_swap_release) TA_assert(AO_int_fetch_compare_and_swap_release(&zz, 14, 117) == 25); TA_assert(zz == 25); TA_assert(AO_int_fetch_compare_and_swap_release(&zz, 25, 117) == 25); # else MISSING(AO_int_fetch_compare_and_swap); if (zz == 25) zz = 117; # endif TA_assert(zz == 117); # if defined(AO_HAVE_double_load_release) || defined(AO_HAVE_double_store_release) /* Initialize old_w even for store to workaround MSan warning. */ old_w.AO_val1 = 3316; old_w.AO_val2 = 2921; # endif # if defined(AO_HAVE_double_load_release) new_w = AO_double_load_release(&old_w); TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921); # elif !defined(AO_HAVE_double_load) \ || !defined(AO_HAVE_double_load_acquire) \ || !defined(AO_HAVE_double_load_acquire_read) \ || !defined(AO_HAVE_double_load_dd_acquire_read) \ || !defined(AO_HAVE_double_load_full) \ || !defined(AO_HAVE_double_load_read) MISSING(AO_double_load); # endif # if defined(AO_HAVE_double_store_release) new_w.AO_val1 = 1375; new_w.AO_val2 = 8243; AO_double_store_release(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); AO_double_store_release(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); new_w.AO_val1 ^= old_w.AO_val1; new_w.AO_val2 ^= old_w.AO_val2; AO_double_store_release(&old_w, new_w); TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0); # elif !defined(AO_HAVE_double_store) \ || !defined(AO_HAVE_double_store_full) \ || !defined(AO_HAVE_double_store_release) \ || !defined(AO_HAVE_double_store_release_write) \ || !defined(AO_HAVE_double_store_write) MISSING(AO_double_store); # endif # if defined(AO_HAVE_compare_double_and_swap_double_release) TA_assert(!AO_compare_double_and_swap_double_release(&w, 17, 42, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_double_and_swap_double_release(&w, 0, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_release(&w, 12, 14, 64, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_release(&w, 11, 13, 85, 82)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_release(&w, 13, 12, 17, 42)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_double_and_swap_double_release(&w, 12, 13, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_double_and_swap_double_release(&w, 17, 42, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_double_and_swap_double); # endif # if defined(AO_HAVE_compare_and_swap_double_release) TA_assert(!AO_compare_and_swap_double_release(&w, 17, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_and_swap_double_release(&w, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_release(&w, 13, 12, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_release(&w, 1213, 48, 86)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_and_swap_double_release(&w, 12, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_and_swap_double_release(&w, 17, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_and_swap_double); # endif # if defined(AO_HAVE_double_compare_and_swap_release) old_w.AO_val1 = 4116; old_w.AO_val2 = 2121; new_w.AO_val1 = 8537; new_w.AO_val2 = 6410; TA_assert(!AO_double_compare_and_swap_release(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_double_compare_and_swap_release(&w, w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = 29; new_w.AO_val1 = 820; new_w.AO_val2 = 5917; TA_assert(!AO_double_compare_and_swap_release(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = 11; old_w.AO_val2 = 6410; new_w.AO_val1 = 3552; new_w.AO_val2 = 1746; TA_assert(!AO_double_compare_and_swap_release(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 8537; new_w.AO_val1 = 4116; new_w.AO_val2 = 2121; TA_assert(!AO_double_compare_and_swap_release(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 6410; new_w.AO_val1 = 1; TA_assert(AO_double_compare_and_swap_release(&w, old_w, new_w)); TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = w.AO_val2; new_w.AO_val1--; new_w.AO_val2 = 0; TA_assert(AO_double_compare_and_swap_release(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_double_compare_and_swap); # endif } /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Some basic sanity tests. These do not test the barrier semantics. */ #undef TA_assert #define TA_assert(e) \ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _acquire)\n", \ __FILE__, __LINE__), exit(1); } #undef MISSING #define MISSING(name) \ printf("Missing: %s\n", #name "_acquire") #if defined(CPPCHECK) void list_atomic_acquire(void); void char_list_atomic_acquire(void); void short_list_atomic_acquire(void); void int_list_atomic_acquire(void); void double_list_atomic_acquire(void); #endif void test_atomic_acquire(void) { AO_t x; unsigned char b; unsigned short s; unsigned int zz; # if defined(AO_HAVE_test_and_set_acquire) AO_TS_t z = AO_TS_INITIALIZER; # endif # if defined(AO_HAVE_double_compare_and_swap_acquire) \ || defined(AO_HAVE_double_load_acquire) \ || defined(AO_HAVE_double_store_acquire) static AO_double_t old_w; /* static to avoid misalignment */ AO_double_t new_w; # endif # if defined(AO_HAVE_compare_and_swap_double_acquire) \ || defined(AO_HAVE_compare_double_and_swap_double_acquire) \ || defined(AO_HAVE_double_compare_and_swap_acquire) static AO_double_t w; /* static to avoid misalignment */ w.AO_val1 = 0; w.AO_val2 = 0; # endif # if defined(CPPCHECK) list_atomic_acquire(); char_list_atomic_acquire(); short_list_atomic_acquire(); int_list_atomic_acquire(); double_list_atomic_acquire(); # endif # if defined(AO_HAVE_nop_acquire) AO_nop_acquire(); # elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write) MISSING(AO_nop); # endif # if defined(AO_HAVE_store_acquire) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */ # endif AO_store_acquire(&x, 13); TA_assert(x == 13); # else # if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \ || !defined(AO_HAVE_store_release) \ || !defined(AO_HAVE_store_release_write) \ || !defined(AO_HAVE_store_write) MISSING(AO_store); # endif x = 13; # endif # if defined(AO_HAVE_load_acquire) TA_assert(AO_load_acquire(&x) == 13); # elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \ || !defined(AO_HAVE_load_acquire_read) \ || !defined(AO_HAVE_load_dd_acquire_read) \ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read) MISSING(AO_load); # endif # if defined(AO_HAVE_test_and_set_acquire) TA_assert(AO_test_and_set_acquire(&z) == AO_TS_CLEAR); TA_assert(AO_test_and_set_acquire(&z) == AO_TS_SET); TA_assert(AO_test_and_set_acquire(&z) == AO_TS_SET); AO_CLEAR(&z); # else MISSING(AO_test_and_set); # endif # if defined(AO_HAVE_fetch_and_add_acquire) TA_assert(AO_fetch_and_add_acquire(&x, 42) == 13); TA_assert(AO_fetch_and_add_acquire(&x, (AO_t)(-42)) == 55); # else MISSING(AO_fetch_and_add); # endif # if defined(AO_HAVE_fetch_and_add1_acquire) TA_assert(AO_fetch_and_add1_acquire(&x) == 13); # else MISSING(AO_fetch_and_add1); ++x; # endif # if defined(AO_HAVE_fetch_and_sub1_acquire) TA_assert(AO_fetch_and_sub1_acquire(&x) == 14); # else MISSING(AO_fetch_and_sub1); --x; # endif # if defined(AO_HAVE_short_store_acquire) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile short *)&s = 0; # endif AO_short_store_acquire(&s, 13); # else # if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \ || !defined(AO_HAVE_short_store_release) \ || !defined(AO_HAVE_short_store_release_write) \ || !defined(AO_HAVE_short_store_write) MISSING(AO_short_store); # endif s = 13; # endif # if defined(AO_HAVE_short_load_acquire) TA_assert(AO_short_load(&s) == 13); # elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \ || !defined(AO_HAVE_short_load_acquire_read) \ || !defined(AO_HAVE_short_load_dd_acquire_read) \ || !defined(AO_HAVE_short_load_full) \ || !defined(AO_HAVE_short_load_read) MISSING(AO_short_load); # endif # if defined(AO_HAVE_short_fetch_and_add_acquire) TA_assert(AO_short_fetch_and_add_acquire(&s, 42) == 13); TA_assert(AO_short_fetch_and_add_acquire(&s, (unsigned short)-42) == 55); # else MISSING(AO_short_fetch_and_add); # endif # if defined(AO_HAVE_short_fetch_and_add1_acquire) TA_assert(AO_short_fetch_and_add1_acquire(&s) == 13); # else MISSING(AO_short_fetch_and_add1); ++s; # endif # if defined(AO_HAVE_short_fetch_and_sub1_acquire) TA_assert(AO_short_fetch_and_sub1_acquire(&s) == 14); # else MISSING(AO_short_fetch_and_sub1); --s; # endif TA_assert(*(volatile short *)&s == 13); # if defined(AO_HAVE_char_store_acquire) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile char *)&b = 0; # endif AO_char_store_acquire(&b, 13); # else # if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \ || !defined(AO_HAVE_char_store_release) \ || !defined(AO_HAVE_char_store_release_write) \ || !defined(AO_HAVE_char_store_write) MISSING(AO_char_store); # endif b = 13; # endif # if defined(AO_HAVE_char_load_acquire) TA_assert(AO_char_load(&b) == 13); # elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \ || !defined(AO_HAVE_char_load_acquire_read) \ || !defined(AO_HAVE_char_load_dd_acquire_read) \ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read) MISSING(AO_char_load); # endif # if defined(AO_HAVE_char_fetch_and_add_acquire) TA_assert(AO_char_fetch_and_add_acquire(&b, 42) == 13); TA_assert(AO_char_fetch_and_add_acquire(&b, (unsigned char)-42) == 55); # else MISSING(AO_char_fetch_and_add); # endif # if defined(AO_HAVE_char_fetch_and_add1_acquire) TA_assert(AO_char_fetch_and_add1_acquire(&b) == 13); # else MISSING(AO_char_fetch_and_add1); ++b; # endif # if defined(AO_HAVE_char_fetch_and_sub1_acquire) TA_assert(AO_char_fetch_and_sub1_acquire(&b) == 14); # else MISSING(AO_char_fetch_and_sub1); --b; # endif TA_assert(*(volatile char *)&b == 13); # if defined(AO_HAVE_int_store_acquire) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile int *)&zz = 0; # endif AO_int_store_acquire(&zz, 13); # else # if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \ || !defined(AO_HAVE_int_store_release) \ || !defined(AO_HAVE_int_store_release_write) \ || !defined(AO_HAVE_int_store_write) MISSING(AO_int_store); # endif zz = 13; # endif # if defined(AO_HAVE_int_load_acquire) TA_assert(AO_int_load(&zz) == 13); # elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \ || !defined(AO_HAVE_int_load_acquire_read) \ || !defined(AO_HAVE_int_load_dd_acquire_read) \ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read) MISSING(AO_int_load); # endif # if defined(AO_HAVE_int_fetch_and_add_acquire) TA_assert(AO_int_fetch_and_add_acquire(&zz, 42) == 13); TA_assert(AO_int_fetch_and_add_acquire(&zz, (unsigned int)-42) == 55); # else MISSING(AO_int_fetch_and_add); # endif # if defined(AO_HAVE_int_fetch_and_add1_acquire) TA_assert(AO_int_fetch_and_add1_acquire(&zz) == 13); # else MISSING(AO_int_fetch_and_add1); ++zz; # endif # if defined(AO_HAVE_int_fetch_and_sub1_acquire) TA_assert(AO_int_fetch_and_sub1_acquire(&zz) == 14); # else MISSING(AO_int_fetch_and_sub1); --zz; # endif TA_assert(*(volatile int *)&zz == 13); # if defined(AO_HAVE_compare_and_swap_acquire) TA_assert(!AO_compare_and_swap_acquire(&x, 14, 42)); TA_assert(x == 13); TA_assert(AO_compare_and_swap_acquire(&x, 13, 42)); TA_assert(x == 42); # else MISSING(AO_compare_and_swap); if (*(volatile AO_t *)&x == 13) x = 42; # endif # if defined(AO_HAVE_or_acquire) AO_or_acquire(&x, 66); TA_assert(x == 106); # else # if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write) MISSING(AO_or); # endif x |= 66; # endif # if defined(AO_HAVE_xor_acquire) AO_xor_acquire(&x, 181); TA_assert(x == 223); # else # if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write) MISSING(AO_xor); # endif x ^= 181; # endif # if defined(AO_HAVE_and_acquire) AO_and_acquire(&x, 57); TA_assert(x == 25); # else # if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write) MISSING(AO_and); # endif x &= 57; # endif # if defined(AO_HAVE_fetch_compare_and_swap_acquire) TA_assert(AO_fetch_compare_and_swap_acquire(&x, 14, 117) == 25); TA_assert(x == 25); TA_assert(AO_fetch_compare_and_swap_acquire(&x, 25, 117) == 25); # else MISSING(AO_fetch_compare_and_swap); if (x == 25) x = 117; # endif TA_assert(x == 117); # if defined(AO_HAVE_short_compare_and_swap_acquire) TA_assert(!AO_short_compare_and_swap_acquire(&s, 14, 42)); TA_assert(s == 13); TA_assert(AO_short_compare_and_swap_acquire(&s, 13, 42)); TA_assert(s == 42); # else MISSING(AO_short_compare_and_swap); if (*(volatile short *)&s == 13) s = 42; # endif # if defined(AO_HAVE_short_or_acquire) AO_short_or_acquire(&s, 66); TA_assert(s == 106); # else # if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \ || !defined(AO_HAVE_short_or_acquire_read) \ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \ || !defined(AO_HAVE_short_or_release) \ || !defined(AO_HAVE_short_or_release_write) \ || !defined(AO_HAVE_short_or_write) MISSING(AO_short_or); # endif s |= 66; # endif # if defined(AO_HAVE_short_xor_acquire) AO_short_xor_acquire(&s, 181); TA_assert(s == 223); # else # if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \ || !defined(AO_HAVE_short_xor_acquire_read) \ || !defined(AO_HAVE_short_xor_full) \ || !defined(AO_HAVE_short_xor_read) \ || !defined(AO_HAVE_short_xor_release) \ || !defined(AO_HAVE_short_xor_release_write) \ || !defined(AO_HAVE_short_xor_write) MISSING(AO_short_xor); # endif s ^= 181; # endif # if defined(AO_HAVE_short_and_acquire) AO_short_and_acquire(&s, 57); TA_assert(s == 25); # else # if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \ || !defined(AO_HAVE_short_and_acquire_read) \ || !defined(AO_HAVE_short_and_full) \ || !defined(AO_HAVE_short_and_read) \ || !defined(AO_HAVE_short_and_release) \ || !defined(AO_HAVE_short_and_release_write) \ || !defined(AO_HAVE_short_and_write) MISSING(AO_short_and); # endif s &= 57; # endif # if defined(AO_HAVE_short_fetch_compare_and_swap_acquire) TA_assert(AO_short_fetch_compare_and_swap_acquire(&s, 14, 117) == 25); TA_assert(s == 25); TA_assert(AO_short_fetch_compare_and_swap_acquire(&s, 25, 117) == 25); # else MISSING(AO_short_fetch_compare_and_swap); if (s == 25) s = 117; # endif TA_assert(s == 117); # if defined(AO_HAVE_char_compare_and_swap_acquire) TA_assert(!AO_char_compare_and_swap_acquire(&b, 14, 42)); TA_assert(b == 13); TA_assert(AO_char_compare_and_swap_acquire(&b, 13, 42)); TA_assert(b == 42); # else MISSING(AO_char_compare_and_swap); if (*(volatile char *)&b == 13) b = 42; # endif # if defined(AO_HAVE_char_or_acquire) AO_char_or_acquire(&b, 66); TA_assert(b == 106); # else # if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \ || !defined(AO_HAVE_char_or_acquire_read) \ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \ || !defined(AO_HAVE_char_or_release) \ || !defined(AO_HAVE_char_or_release_write) \ || !defined(AO_HAVE_char_or_write) MISSING(AO_char_or); # endif b |= 66; # endif # if defined(AO_HAVE_char_xor_acquire) AO_char_xor_acquire(&b, 181); TA_assert(b == 223); # else # if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \ || !defined(AO_HAVE_char_xor_acquire_read) \ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \ || !defined(AO_HAVE_char_xor_release) \ || !defined(AO_HAVE_char_xor_release_write) \ || !defined(AO_HAVE_char_xor_write) MISSING(AO_char_xor); # endif b ^= 181; # endif # if defined(AO_HAVE_char_and_acquire) AO_char_and_acquire(&b, 57); TA_assert(b == 25); # else # if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \ || !defined(AO_HAVE_char_and_acquire_read) \ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \ || !defined(AO_HAVE_char_and_release) \ || !defined(AO_HAVE_char_and_release_write) \ || !defined(AO_HAVE_char_and_write) MISSING(AO_char_and); # endif b &= 57; # endif # if defined(AO_HAVE_char_fetch_compare_and_swap_acquire) TA_assert(AO_char_fetch_compare_and_swap_acquire(&b, 14, 117) == 25); TA_assert(b == 25); TA_assert(AO_char_fetch_compare_and_swap_acquire(&b, 25, 117) == 25); # else MISSING(AO_char_fetch_compare_and_swap); if (b == 25) b = 117; # endif TA_assert(b == 117); # if defined(AO_HAVE_int_compare_and_swap_acquire) TA_assert(!AO_int_compare_and_swap_acquire(&zz, 14, 42)); TA_assert(zz == 13); TA_assert(AO_int_compare_and_swap_acquire(&zz, 13, 42)); TA_assert(zz == 42); # else MISSING(AO_int_compare_and_swap); if (*(volatile int *)&zz == 13) zz = 42; # endif # if defined(AO_HAVE_int_or_acquire) AO_int_or_acquire(&zz, 66); TA_assert(zz == 106); # else # if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \ || !defined(AO_HAVE_int_or_acquire_read) \ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \ || !defined(AO_HAVE_int_or_release) \ || !defined(AO_HAVE_int_or_release_write) \ || !defined(AO_HAVE_int_or_write) MISSING(AO_int_or); # endif zz |= 66; # endif # if defined(AO_HAVE_int_xor_acquire) AO_int_xor_acquire(&zz, 181); TA_assert(zz == 223); # else # if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \ || !defined(AO_HAVE_int_xor_acquire_read) \ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \ || !defined(AO_HAVE_int_xor_release) \ || !defined(AO_HAVE_int_xor_release_write) \ || !defined(AO_HAVE_int_xor_write) MISSING(AO_int_xor); # endif zz ^= 181; # endif # if defined(AO_HAVE_int_and_acquire) AO_int_and_acquire(&zz, 57); TA_assert(zz == 25); # else # if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \ || !defined(AO_HAVE_int_and_acquire_read) \ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \ || !defined(AO_HAVE_int_and_release) \ || !defined(AO_HAVE_int_and_release_write) \ || !defined(AO_HAVE_int_and_write) MISSING(AO_int_and); # endif zz &= 57; # endif # if defined(AO_HAVE_int_fetch_compare_and_swap_acquire) TA_assert(AO_int_fetch_compare_and_swap_acquire(&zz, 14, 117) == 25); TA_assert(zz == 25); TA_assert(AO_int_fetch_compare_and_swap_acquire(&zz, 25, 117) == 25); # else MISSING(AO_int_fetch_compare_and_swap); if (zz == 25) zz = 117; # endif TA_assert(zz == 117); # if defined(AO_HAVE_double_load_acquire) || defined(AO_HAVE_double_store_acquire) /* Initialize old_w even for store to workaround MSan warning. */ old_w.AO_val1 = 3316; old_w.AO_val2 = 2921; # endif # if defined(AO_HAVE_double_load_acquire) new_w = AO_double_load_acquire(&old_w); TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921); # elif !defined(AO_HAVE_double_load) \ || !defined(AO_HAVE_double_load_acquire) \ || !defined(AO_HAVE_double_load_acquire_read) \ || !defined(AO_HAVE_double_load_dd_acquire_read) \ || !defined(AO_HAVE_double_load_full) \ || !defined(AO_HAVE_double_load_read) MISSING(AO_double_load); # endif # if defined(AO_HAVE_double_store_acquire) new_w.AO_val1 = 1375; new_w.AO_val2 = 8243; AO_double_store_acquire(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); AO_double_store_acquire(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); new_w.AO_val1 ^= old_w.AO_val1; new_w.AO_val2 ^= old_w.AO_val2; AO_double_store_acquire(&old_w, new_w); TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0); # elif !defined(AO_HAVE_double_store) \ || !defined(AO_HAVE_double_store_full) \ || !defined(AO_HAVE_double_store_release) \ || !defined(AO_HAVE_double_store_release_write) \ || !defined(AO_HAVE_double_store_write) MISSING(AO_double_store); # endif # if defined(AO_HAVE_compare_double_and_swap_double_acquire) TA_assert(!AO_compare_double_and_swap_double_acquire(&w, 17, 42, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_double_and_swap_double_acquire(&w, 0, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_acquire(&w, 12, 14, 64, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_acquire(&w, 11, 13, 85, 82)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_acquire(&w, 13, 12, 17, 42)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_double_and_swap_double_acquire(&w, 12, 13, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_double_and_swap_double_acquire(&w, 17, 42, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_double_and_swap_double); # endif # if defined(AO_HAVE_compare_and_swap_double_acquire) TA_assert(!AO_compare_and_swap_double_acquire(&w, 17, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_and_swap_double_acquire(&w, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_acquire(&w, 13, 12, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_acquire(&w, 1213, 48, 86)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_and_swap_double_acquire(&w, 12, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_and_swap_double_acquire(&w, 17, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_and_swap_double); # endif # if defined(AO_HAVE_double_compare_and_swap_acquire) old_w.AO_val1 = 4116; old_w.AO_val2 = 2121; new_w.AO_val1 = 8537; new_w.AO_val2 = 6410; TA_assert(!AO_double_compare_and_swap_acquire(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_double_compare_and_swap_acquire(&w, w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = 29; new_w.AO_val1 = 820; new_w.AO_val2 = 5917; TA_assert(!AO_double_compare_and_swap_acquire(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = 11; old_w.AO_val2 = 6410; new_w.AO_val1 = 3552; new_w.AO_val2 = 1746; TA_assert(!AO_double_compare_and_swap_acquire(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 8537; new_w.AO_val1 = 4116; new_w.AO_val2 = 2121; TA_assert(!AO_double_compare_and_swap_acquire(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 6410; new_w.AO_val1 = 1; TA_assert(AO_double_compare_and_swap_acquire(&w, old_w, new_w)); TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = w.AO_val2; new_w.AO_val1--; new_w.AO_val2 = 0; TA_assert(AO_double_compare_and_swap_acquire(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_double_compare_and_swap); # endif } /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Some basic sanity tests. These do not test the barrier semantics. */ #undef TA_assert #define TA_assert(e) \ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _read)\n", \ __FILE__, __LINE__), exit(1); } #undef MISSING #define MISSING(name) \ printf("Missing: %s\n", #name "_read") #if defined(CPPCHECK) void list_atomic_read(void); void char_list_atomic_read(void); void short_list_atomic_read(void); void int_list_atomic_read(void); void double_list_atomic_read(void); #endif void test_atomic_read(void) { AO_t x; unsigned char b; unsigned short s; unsigned int zz; # if defined(AO_HAVE_test_and_set_read) AO_TS_t z = AO_TS_INITIALIZER; # endif # if defined(AO_HAVE_double_compare_and_swap_read) \ || defined(AO_HAVE_double_load_read) \ || defined(AO_HAVE_double_store_read) static AO_double_t old_w; /* static to avoid misalignment */ AO_double_t new_w; # endif # if defined(AO_HAVE_compare_and_swap_double_read) \ || defined(AO_HAVE_compare_double_and_swap_double_read) \ || defined(AO_HAVE_double_compare_and_swap_read) static AO_double_t w; /* static to avoid misalignment */ w.AO_val1 = 0; w.AO_val2 = 0; # endif # if defined(CPPCHECK) list_atomic_read(); char_list_atomic_read(); short_list_atomic_read(); int_list_atomic_read(); double_list_atomic_read(); # endif # if defined(AO_HAVE_nop_read) AO_nop_read(); # elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write) MISSING(AO_nop); # endif # if defined(AO_HAVE_store_read) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */ # endif AO_store_read(&x, 13); TA_assert(x == 13); # else # if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \ || !defined(AO_HAVE_store_release) \ || !defined(AO_HAVE_store_release_write) \ || !defined(AO_HAVE_store_write) MISSING(AO_store); # endif x = 13; # endif # if defined(AO_HAVE_load_read) TA_assert(AO_load_read(&x) == 13); # elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \ || !defined(AO_HAVE_load_acquire_read) \ || !defined(AO_HAVE_load_dd_acquire_read) \ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read) MISSING(AO_load); # endif # if defined(AO_HAVE_test_and_set_read) TA_assert(AO_test_and_set_read(&z) == AO_TS_CLEAR); TA_assert(AO_test_and_set_read(&z) == AO_TS_SET); TA_assert(AO_test_and_set_read(&z) == AO_TS_SET); AO_CLEAR(&z); # else MISSING(AO_test_and_set); # endif # if defined(AO_HAVE_fetch_and_add_read) TA_assert(AO_fetch_and_add_read(&x, 42) == 13); TA_assert(AO_fetch_and_add_read(&x, (AO_t)(-42)) == 55); # else MISSING(AO_fetch_and_add); # endif # if defined(AO_HAVE_fetch_and_add1_read) TA_assert(AO_fetch_and_add1_read(&x) == 13); # else MISSING(AO_fetch_and_add1); ++x; # endif # if defined(AO_HAVE_fetch_and_sub1_read) TA_assert(AO_fetch_and_sub1_read(&x) == 14); # else MISSING(AO_fetch_and_sub1); --x; # endif # if defined(AO_HAVE_short_store_read) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile short *)&s = 0; # endif AO_short_store_read(&s, 13); # else # if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \ || !defined(AO_HAVE_short_store_release) \ || !defined(AO_HAVE_short_store_release_write) \ || !defined(AO_HAVE_short_store_write) MISSING(AO_short_store); # endif s = 13; # endif # if defined(AO_HAVE_short_load_read) TA_assert(AO_short_load(&s) == 13); # elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \ || !defined(AO_HAVE_short_load_acquire_read) \ || !defined(AO_HAVE_short_load_dd_acquire_read) \ || !defined(AO_HAVE_short_load_full) \ || !defined(AO_HAVE_short_load_read) MISSING(AO_short_load); # endif # if defined(AO_HAVE_short_fetch_and_add_read) TA_assert(AO_short_fetch_and_add_read(&s, 42) == 13); TA_assert(AO_short_fetch_and_add_read(&s, (unsigned short)-42) == 55); # else MISSING(AO_short_fetch_and_add); # endif # if defined(AO_HAVE_short_fetch_and_add1_read) TA_assert(AO_short_fetch_and_add1_read(&s) == 13); # else MISSING(AO_short_fetch_and_add1); ++s; # endif # if defined(AO_HAVE_short_fetch_and_sub1_read) TA_assert(AO_short_fetch_and_sub1_read(&s) == 14); # else MISSING(AO_short_fetch_and_sub1); --s; # endif TA_assert(*(volatile short *)&s == 13); # if defined(AO_HAVE_char_store_read) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile char *)&b = 0; # endif AO_char_store_read(&b, 13); # else # if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \ || !defined(AO_HAVE_char_store_release) \ || !defined(AO_HAVE_char_store_release_write) \ || !defined(AO_HAVE_char_store_write) MISSING(AO_char_store); # endif b = 13; # endif # if defined(AO_HAVE_char_load_read) TA_assert(AO_char_load(&b) == 13); # elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \ || !defined(AO_HAVE_char_load_acquire_read) \ || !defined(AO_HAVE_char_load_dd_acquire_read) \ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read) MISSING(AO_char_load); # endif # if defined(AO_HAVE_char_fetch_and_add_read) TA_assert(AO_char_fetch_and_add_read(&b, 42) == 13); TA_assert(AO_char_fetch_and_add_read(&b, (unsigned char)-42) == 55); # else MISSING(AO_char_fetch_and_add); # endif # if defined(AO_HAVE_char_fetch_and_add1_read) TA_assert(AO_char_fetch_and_add1_read(&b) == 13); # else MISSING(AO_char_fetch_and_add1); ++b; # endif # if defined(AO_HAVE_char_fetch_and_sub1_read) TA_assert(AO_char_fetch_and_sub1_read(&b) == 14); # else MISSING(AO_char_fetch_and_sub1); --b; # endif TA_assert(*(volatile char *)&b == 13); # if defined(AO_HAVE_int_store_read) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile int *)&zz = 0; # endif AO_int_store_read(&zz, 13); # else # if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \ || !defined(AO_HAVE_int_store_release) \ || !defined(AO_HAVE_int_store_release_write) \ || !defined(AO_HAVE_int_store_write) MISSING(AO_int_store); # endif zz = 13; # endif # if defined(AO_HAVE_int_load_read) TA_assert(AO_int_load(&zz) == 13); # elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \ || !defined(AO_HAVE_int_load_acquire_read) \ || !defined(AO_HAVE_int_load_dd_acquire_read) \ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read) MISSING(AO_int_load); # endif # if defined(AO_HAVE_int_fetch_and_add_read) TA_assert(AO_int_fetch_and_add_read(&zz, 42) == 13); TA_assert(AO_int_fetch_and_add_read(&zz, (unsigned int)-42) == 55); # else MISSING(AO_int_fetch_and_add); # endif # if defined(AO_HAVE_int_fetch_and_add1_read) TA_assert(AO_int_fetch_and_add1_read(&zz) == 13); # else MISSING(AO_int_fetch_and_add1); ++zz; # endif # if defined(AO_HAVE_int_fetch_and_sub1_read) TA_assert(AO_int_fetch_and_sub1_read(&zz) == 14); # else MISSING(AO_int_fetch_and_sub1); --zz; # endif TA_assert(*(volatile int *)&zz == 13); # if defined(AO_HAVE_compare_and_swap_read) TA_assert(!AO_compare_and_swap_read(&x, 14, 42)); TA_assert(x == 13); TA_assert(AO_compare_and_swap_read(&x, 13, 42)); TA_assert(x == 42); # else MISSING(AO_compare_and_swap); if (*(volatile AO_t *)&x == 13) x = 42; # endif # if defined(AO_HAVE_or_read) AO_or_read(&x, 66); TA_assert(x == 106); # else # if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write) MISSING(AO_or); # endif x |= 66; # endif # if defined(AO_HAVE_xor_read) AO_xor_read(&x, 181); TA_assert(x == 223); # else # if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write) MISSING(AO_xor); # endif x ^= 181; # endif # if defined(AO_HAVE_and_read) AO_and_read(&x, 57); TA_assert(x == 25); # else # if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write) MISSING(AO_and); # endif x &= 57; # endif # if defined(AO_HAVE_fetch_compare_and_swap_read) TA_assert(AO_fetch_compare_and_swap_read(&x, 14, 117) == 25); TA_assert(x == 25); TA_assert(AO_fetch_compare_and_swap_read(&x, 25, 117) == 25); # else MISSING(AO_fetch_compare_and_swap); if (x == 25) x = 117; # endif TA_assert(x == 117); # if defined(AO_HAVE_short_compare_and_swap_read) TA_assert(!AO_short_compare_and_swap_read(&s, 14, 42)); TA_assert(s == 13); TA_assert(AO_short_compare_and_swap_read(&s, 13, 42)); TA_assert(s == 42); # else MISSING(AO_short_compare_and_swap); if (*(volatile short *)&s == 13) s = 42; # endif # if defined(AO_HAVE_short_or_read) AO_short_or_read(&s, 66); TA_assert(s == 106); # else # if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \ || !defined(AO_HAVE_short_or_acquire_read) \ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \ || !defined(AO_HAVE_short_or_release) \ || !defined(AO_HAVE_short_or_release_write) \ || !defined(AO_HAVE_short_or_write) MISSING(AO_short_or); # endif s |= 66; # endif # if defined(AO_HAVE_short_xor_read) AO_short_xor_read(&s, 181); TA_assert(s == 223); # else # if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \ || !defined(AO_HAVE_short_xor_acquire_read) \ || !defined(AO_HAVE_short_xor_full) \ || !defined(AO_HAVE_short_xor_read) \ || !defined(AO_HAVE_short_xor_release) \ || !defined(AO_HAVE_short_xor_release_write) \ || !defined(AO_HAVE_short_xor_write) MISSING(AO_short_xor); # endif s ^= 181; # endif # if defined(AO_HAVE_short_and_read) AO_short_and_read(&s, 57); TA_assert(s == 25); # else # if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \ || !defined(AO_HAVE_short_and_acquire_read) \ || !defined(AO_HAVE_short_and_full) \ || !defined(AO_HAVE_short_and_read) \ || !defined(AO_HAVE_short_and_release) \ || !defined(AO_HAVE_short_and_release_write) \ || !defined(AO_HAVE_short_and_write) MISSING(AO_short_and); # endif s &= 57; # endif # if defined(AO_HAVE_short_fetch_compare_and_swap_read) TA_assert(AO_short_fetch_compare_and_swap_read(&s, 14, 117) == 25); TA_assert(s == 25); TA_assert(AO_short_fetch_compare_and_swap_read(&s, 25, 117) == 25); # else MISSING(AO_short_fetch_compare_and_swap); if (s == 25) s = 117; # endif TA_assert(s == 117); # if defined(AO_HAVE_char_compare_and_swap_read) TA_assert(!AO_char_compare_and_swap_read(&b, 14, 42)); TA_assert(b == 13); TA_assert(AO_char_compare_and_swap_read(&b, 13, 42)); TA_assert(b == 42); # else MISSING(AO_char_compare_and_swap); if (*(volatile char *)&b == 13) b = 42; # endif # if defined(AO_HAVE_char_or_read) AO_char_or_read(&b, 66); TA_assert(b == 106); # else # if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \ || !defined(AO_HAVE_char_or_acquire_read) \ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \ || !defined(AO_HAVE_char_or_release) \ || !defined(AO_HAVE_char_or_release_write) \ || !defined(AO_HAVE_char_or_write) MISSING(AO_char_or); # endif b |= 66; # endif # if defined(AO_HAVE_char_xor_read) AO_char_xor_read(&b, 181); TA_assert(b == 223); # else # if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \ || !defined(AO_HAVE_char_xor_acquire_read) \ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \ || !defined(AO_HAVE_char_xor_release) \ || !defined(AO_HAVE_char_xor_release_write) \ || !defined(AO_HAVE_char_xor_write) MISSING(AO_char_xor); # endif b ^= 181; # endif # if defined(AO_HAVE_char_and_read) AO_char_and_read(&b, 57); TA_assert(b == 25); # else # if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \ || !defined(AO_HAVE_char_and_acquire_read) \ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \ || !defined(AO_HAVE_char_and_release) \ || !defined(AO_HAVE_char_and_release_write) \ || !defined(AO_HAVE_char_and_write) MISSING(AO_char_and); # endif b &= 57; # endif # if defined(AO_HAVE_char_fetch_compare_and_swap_read) TA_assert(AO_char_fetch_compare_and_swap_read(&b, 14, 117) == 25); TA_assert(b == 25); TA_assert(AO_char_fetch_compare_and_swap_read(&b, 25, 117) == 25); # else MISSING(AO_char_fetch_compare_and_swap); if (b == 25) b = 117; # endif TA_assert(b == 117); # if defined(AO_HAVE_int_compare_and_swap_read) TA_assert(!AO_int_compare_and_swap_read(&zz, 14, 42)); TA_assert(zz == 13); TA_assert(AO_int_compare_and_swap_read(&zz, 13, 42)); TA_assert(zz == 42); # else MISSING(AO_int_compare_and_swap); if (*(volatile int *)&zz == 13) zz = 42; # endif # if defined(AO_HAVE_int_or_read) AO_int_or_read(&zz, 66); TA_assert(zz == 106); # else # if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \ || !defined(AO_HAVE_int_or_acquire_read) \ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \ || !defined(AO_HAVE_int_or_release) \ || !defined(AO_HAVE_int_or_release_write) \ || !defined(AO_HAVE_int_or_write) MISSING(AO_int_or); # endif zz |= 66; # endif # if defined(AO_HAVE_int_xor_read) AO_int_xor_read(&zz, 181); TA_assert(zz == 223); # else # if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \ || !defined(AO_HAVE_int_xor_acquire_read) \ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \ || !defined(AO_HAVE_int_xor_release) \ || !defined(AO_HAVE_int_xor_release_write) \ || !defined(AO_HAVE_int_xor_write) MISSING(AO_int_xor); # endif zz ^= 181; # endif # if defined(AO_HAVE_int_and_read) AO_int_and_read(&zz, 57); TA_assert(zz == 25); # else # if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \ || !defined(AO_HAVE_int_and_acquire_read) \ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \ || !defined(AO_HAVE_int_and_release) \ || !defined(AO_HAVE_int_and_release_write) \ || !defined(AO_HAVE_int_and_write) MISSING(AO_int_and); # endif zz &= 57; # endif # if defined(AO_HAVE_int_fetch_compare_and_swap_read) TA_assert(AO_int_fetch_compare_and_swap_read(&zz, 14, 117) == 25); TA_assert(zz == 25); TA_assert(AO_int_fetch_compare_and_swap_read(&zz, 25, 117) == 25); # else MISSING(AO_int_fetch_compare_and_swap); if (zz == 25) zz = 117; # endif TA_assert(zz == 117); # if defined(AO_HAVE_double_load_read) || defined(AO_HAVE_double_store_read) /* Initialize old_w even for store to workaround MSan warning. */ old_w.AO_val1 = 3316; old_w.AO_val2 = 2921; # endif # if defined(AO_HAVE_double_load_read) new_w = AO_double_load_read(&old_w); TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921); # elif !defined(AO_HAVE_double_load) \ || !defined(AO_HAVE_double_load_acquire) \ || !defined(AO_HAVE_double_load_acquire_read) \ || !defined(AO_HAVE_double_load_dd_acquire_read) \ || !defined(AO_HAVE_double_load_full) \ || !defined(AO_HAVE_double_load_read) MISSING(AO_double_load); # endif # if defined(AO_HAVE_double_store_read) new_w.AO_val1 = 1375; new_w.AO_val2 = 8243; AO_double_store_read(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); AO_double_store_read(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); new_w.AO_val1 ^= old_w.AO_val1; new_w.AO_val2 ^= old_w.AO_val2; AO_double_store_read(&old_w, new_w); TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0); # elif !defined(AO_HAVE_double_store) \ || !defined(AO_HAVE_double_store_full) \ || !defined(AO_HAVE_double_store_release) \ || !defined(AO_HAVE_double_store_release_write) \ || !defined(AO_HAVE_double_store_write) MISSING(AO_double_store); # endif # if defined(AO_HAVE_compare_double_and_swap_double_read) TA_assert(!AO_compare_double_and_swap_double_read(&w, 17, 42, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_double_and_swap_double_read(&w, 0, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_read(&w, 12, 14, 64, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_read(&w, 11, 13, 85, 82)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_read(&w, 13, 12, 17, 42)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_double_and_swap_double_read(&w, 12, 13, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_double_and_swap_double_read(&w, 17, 42, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_double_and_swap_double); # endif # if defined(AO_HAVE_compare_and_swap_double_read) TA_assert(!AO_compare_and_swap_double_read(&w, 17, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_and_swap_double_read(&w, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_read(&w, 13, 12, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_read(&w, 1213, 48, 86)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_and_swap_double_read(&w, 12, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_and_swap_double_read(&w, 17, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_and_swap_double); # endif # if defined(AO_HAVE_double_compare_and_swap_read) old_w.AO_val1 = 4116; old_w.AO_val2 = 2121; new_w.AO_val1 = 8537; new_w.AO_val2 = 6410; TA_assert(!AO_double_compare_and_swap_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_double_compare_and_swap_read(&w, w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = 29; new_w.AO_val1 = 820; new_w.AO_val2 = 5917; TA_assert(!AO_double_compare_and_swap_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = 11; old_w.AO_val2 = 6410; new_w.AO_val1 = 3552; new_w.AO_val2 = 1746; TA_assert(!AO_double_compare_and_swap_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 8537; new_w.AO_val1 = 4116; new_w.AO_val2 = 2121; TA_assert(!AO_double_compare_and_swap_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 6410; new_w.AO_val1 = 1; TA_assert(AO_double_compare_and_swap_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = w.AO_val2; new_w.AO_val1--; new_w.AO_val2 = 0; TA_assert(AO_double_compare_and_swap_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_double_compare_and_swap); # endif } /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Some basic sanity tests. These do not test the barrier semantics. */ #undef TA_assert #define TA_assert(e) \ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _write)\n", \ __FILE__, __LINE__), exit(1); } #undef MISSING #define MISSING(name) \ printf("Missing: %s\n", #name "_write") #if defined(CPPCHECK) void list_atomic_write(void); void char_list_atomic_write(void); void short_list_atomic_write(void); void int_list_atomic_write(void); void double_list_atomic_write(void); #endif void test_atomic_write(void) { AO_t x; unsigned char b; unsigned short s; unsigned int zz; # if defined(AO_HAVE_test_and_set_write) AO_TS_t z = AO_TS_INITIALIZER; # endif # if defined(AO_HAVE_double_compare_and_swap_write) \ || defined(AO_HAVE_double_load_write) \ || defined(AO_HAVE_double_store_write) static AO_double_t old_w; /* static to avoid misalignment */ AO_double_t new_w; # endif # if defined(AO_HAVE_compare_and_swap_double_write) \ || defined(AO_HAVE_compare_double_and_swap_double_write) \ || defined(AO_HAVE_double_compare_and_swap_write) static AO_double_t w; /* static to avoid misalignment */ w.AO_val1 = 0; w.AO_val2 = 0; # endif # if defined(CPPCHECK) list_atomic_write(); char_list_atomic_write(); short_list_atomic_write(); int_list_atomic_write(); double_list_atomic_write(); # endif # if defined(AO_HAVE_nop_write) AO_nop_write(); # elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write) MISSING(AO_nop); # endif # if defined(AO_HAVE_store_write) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */ # endif AO_store_write(&x, 13); TA_assert(x == 13); # else # if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \ || !defined(AO_HAVE_store_release) \ || !defined(AO_HAVE_store_release_write) \ || !defined(AO_HAVE_store_write) MISSING(AO_store); # endif x = 13; # endif # if defined(AO_HAVE_load_write) TA_assert(AO_load_write(&x) == 13); # elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \ || !defined(AO_HAVE_load_acquire_read) \ || !defined(AO_HAVE_load_dd_acquire_read) \ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read) MISSING(AO_load); # endif # if defined(AO_HAVE_test_and_set_write) TA_assert(AO_test_and_set_write(&z) == AO_TS_CLEAR); TA_assert(AO_test_and_set_write(&z) == AO_TS_SET); TA_assert(AO_test_and_set_write(&z) == AO_TS_SET); AO_CLEAR(&z); # else MISSING(AO_test_and_set); # endif # if defined(AO_HAVE_fetch_and_add_write) TA_assert(AO_fetch_and_add_write(&x, 42) == 13); TA_assert(AO_fetch_and_add_write(&x, (AO_t)(-42)) == 55); # else MISSING(AO_fetch_and_add); # endif # if defined(AO_HAVE_fetch_and_add1_write) TA_assert(AO_fetch_and_add1_write(&x) == 13); # else MISSING(AO_fetch_and_add1); ++x; # endif # if defined(AO_HAVE_fetch_and_sub1_write) TA_assert(AO_fetch_and_sub1_write(&x) == 14); # else MISSING(AO_fetch_and_sub1); --x; # endif # if defined(AO_HAVE_short_store_write) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile short *)&s = 0; # endif AO_short_store_write(&s, 13); # else # if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \ || !defined(AO_HAVE_short_store_release) \ || !defined(AO_HAVE_short_store_release_write) \ || !defined(AO_HAVE_short_store_write) MISSING(AO_short_store); # endif s = 13; # endif # if defined(AO_HAVE_short_load_write) TA_assert(AO_short_load(&s) == 13); # elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \ || !defined(AO_HAVE_short_load_acquire_read) \ || !defined(AO_HAVE_short_load_dd_acquire_read) \ || !defined(AO_HAVE_short_load_full) \ || !defined(AO_HAVE_short_load_read) MISSING(AO_short_load); # endif # if defined(AO_HAVE_short_fetch_and_add_write) TA_assert(AO_short_fetch_and_add_write(&s, 42) == 13); TA_assert(AO_short_fetch_and_add_write(&s, (unsigned short)-42) == 55); # else MISSING(AO_short_fetch_and_add); # endif # if defined(AO_HAVE_short_fetch_and_add1_write) TA_assert(AO_short_fetch_and_add1_write(&s) == 13); # else MISSING(AO_short_fetch_and_add1); ++s; # endif # if defined(AO_HAVE_short_fetch_and_sub1_write) TA_assert(AO_short_fetch_and_sub1_write(&s) == 14); # else MISSING(AO_short_fetch_and_sub1); --s; # endif TA_assert(*(volatile short *)&s == 13); # if defined(AO_HAVE_char_store_write) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile char *)&b = 0; # endif AO_char_store_write(&b, 13); # else # if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \ || !defined(AO_HAVE_char_store_release) \ || !defined(AO_HAVE_char_store_release_write) \ || !defined(AO_HAVE_char_store_write) MISSING(AO_char_store); # endif b = 13; # endif # if defined(AO_HAVE_char_load_write) TA_assert(AO_char_load(&b) == 13); # elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \ || !defined(AO_HAVE_char_load_acquire_read) \ || !defined(AO_HAVE_char_load_dd_acquire_read) \ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read) MISSING(AO_char_load); # endif # if defined(AO_HAVE_char_fetch_and_add_write) TA_assert(AO_char_fetch_and_add_write(&b, 42) == 13); TA_assert(AO_char_fetch_and_add_write(&b, (unsigned char)-42) == 55); # else MISSING(AO_char_fetch_and_add); # endif # if defined(AO_HAVE_char_fetch_and_add1_write) TA_assert(AO_char_fetch_and_add1_write(&b) == 13); # else MISSING(AO_char_fetch_and_add1); ++b; # endif # if defined(AO_HAVE_char_fetch_and_sub1_write) TA_assert(AO_char_fetch_and_sub1_write(&b) == 14); # else MISSING(AO_char_fetch_and_sub1); --b; # endif TA_assert(*(volatile char *)&b == 13); # if defined(AO_HAVE_int_store_write) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile int *)&zz = 0; # endif AO_int_store_write(&zz, 13); # else # if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \ || !defined(AO_HAVE_int_store_release) \ || !defined(AO_HAVE_int_store_release_write) \ || !defined(AO_HAVE_int_store_write) MISSING(AO_int_store); # endif zz = 13; # endif # if defined(AO_HAVE_int_load_write) TA_assert(AO_int_load(&zz) == 13); # elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \ || !defined(AO_HAVE_int_load_acquire_read) \ || !defined(AO_HAVE_int_load_dd_acquire_read) \ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read) MISSING(AO_int_load); # endif # if defined(AO_HAVE_int_fetch_and_add_write) TA_assert(AO_int_fetch_and_add_write(&zz, 42) == 13); TA_assert(AO_int_fetch_and_add_write(&zz, (unsigned int)-42) == 55); # else MISSING(AO_int_fetch_and_add); # endif # if defined(AO_HAVE_int_fetch_and_add1_write) TA_assert(AO_int_fetch_and_add1_write(&zz) == 13); # else MISSING(AO_int_fetch_and_add1); ++zz; # endif # if defined(AO_HAVE_int_fetch_and_sub1_write) TA_assert(AO_int_fetch_and_sub1_write(&zz) == 14); # else MISSING(AO_int_fetch_and_sub1); --zz; # endif TA_assert(*(volatile int *)&zz == 13); # if defined(AO_HAVE_compare_and_swap_write) TA_assert(!AO_compare_and_swap_write(&x, 14, 42)); TA_assert(x == 13); TA_assert(AO_compare_and_swap_write(&x, 13, 42)); TA_assert(x == 42); # else MISSING(AO_compare_and_swap); if (*(volatile AO_t *)&x == 13) x = 42; # endif # if defined(AO_HAVE_or_write) AO_or_write(&x, 66); TA_assert(x == 106); # else # if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write) MISSING(AO_or); # endif x |= 66; # endif # if defined(AO_HAVE_xor_write) AO_xor_write(&x, 181); TA_assert(x == 223); # else # if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write) MISSING(AO_xor); # endif x ^= 181; # endif # if defined(AO_HAVE_and_write) AO_and_write(&x, 57); TA_assert(x == 25); # else # if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write) MISSING(AO_and); # endif x &= 57; # endif # if defined(AO_HAVE_fetch_compare_and_swap_write) TA_assert(AO_fetch_compare_and_swap_write(&x, 14, 117) == 25); TA_assert(x == 25); TA_assert(AO_fetch_compare_and_swap_write(&x, 25, 117) == 25); # else MISSING(AO_fetch_compare_and_swap); if (x == 25) x = 117; # endif TA_assert(x == 117); # if defined(AO_HAVE_short_compare_and_swap_write) TA_assert(!AO_short_compare_and_swap_write(&s, 14, 42)); TA_assert(s == 13); TA_assert(AO_short_compare_and_swap_write(&s, 13, 42)); TA_assert(s == 42); # else MISSING(AO_short_compare_and_swap); if (*(volatile short *)&s == 13) s = 42; # endif # if defined(AO_HAVE_short_or_write) AO_short_or_write(&s, 66); TA_assert(s == 106); # else # if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \ || !defined(AO_HAVE_short_or_acquire_read) \ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \ || !defined(AO_HAVE_short_or_release) \ || !defined(AO_HAVE_short_or_release_write) \ || !defined(AO_HAVE_short_or_write) MISSING(AO_short_or); # endif s |= 66; # endif # if defined(AO_HAVE_short_xor_write) AO_short_xor_write(&s, 181); TA_assert(s == 223); # else # if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \ || !defined(AO_HAVE_short_xor_acquire_read) \ || !defined(AO_HAVE_short_xor_full) \ || !defined(AO_HAVE_short_xor_read) \ || !defined(AO_HAVE_short_xor_release) \ || !defined(AO_HAVE_short_xor_release_write) \ || !defined(AO_HAVE_short_xor_write) MISSING(AO_short_xor); # endif s ^= 181; # endif # if defined(AO_HAVE_short_and_write) AO_short_and_write(&s, 57); TA_assert(s == 25); # else # if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \ || !defined(AO_HAVE_short_and_acquire_read) \ || !defined(AO_HAVE_short_and_full) \ || !defined(AO_HAVE_short_and_read) \ || !defined(AO_HAVE_short_and_release) \ || !defined(AO_HAVE_short_and_release_write) \ || !defined(AO_HAVE_short_and_write) MISSING(AO_short_and); # endif s &= 57; # endif # if defined(AO_HAVE_short_fetch_compare_and_swap_write) TA_assert(AO_short_fetch_compare_and_swap_write(&s, 14, 117) == 25); TA_assert(s == 25); TA_assert(AO_short_fetch_compare_and_swap_write(&s, 25, 117) == 25); # else MISSING(AO_short_fetch_compare_and_swap); if (s == 25) s = 117; # endif TA_assert(s == 117); # if defined(AO_HAVE_char_compare_and_swap_write) TA_assert(!AO_char_compare_and_swap_write(&b, 14, 42)); TA_assert(b == 13); TA_assert(AO_char_compare_and_swap_write(&b, 13, 42)); TA_assert(b == 42); # else MISSING(AO_char_compare_and_swap); if (*(volatile char *)&b == 13) b = 42; # endif # if defined(AO_HAVE_char_or_write) AO_char_or_write(&b, 66); TA_assert(b == 106); # else # if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \ || !defined(AO_HAVE_char_or_acquire_read) \ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \ || !defined(AO_HAVE_char_or_release) \ || !defined(AO_HAVE_char_or_release_write) \ || !defined(AO_HAVE_char_or_write) MISSING(AO_char_or); # endif b |= 66; # endif # if defined(AO_HAVE_char_xor_write) AO_char_xor_write(&b, 181); TA_assert(b == 223); # else # if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \ || !defined(AO_HAVE_char_xor_acquire_read) \ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \ || !defined(AO_HAVE_char_xor_release) \ || !defined(AO_HAVE_char_xor_release_write) \ || !defined(AO_HAVE_char_xor_write) MISSING(AO_char_xor); # endif b ^= 181; # endif # if defined(AO_HAVE_char_and_write) AO_char_and_write(&b, 57); TA_assert(b == 25); # else # if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \ || !defined(AO_HAVE_char_and_acquire_read) \ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \ || !defined(AO_HAVE_char_and_release) \ || !defined(AO_HAVE_char_and_release_write) \ || !defined(AO_HAVE_char_and_write) MISSING(AO_char_and); # endif b &= 57; # endif # if defined(AO_HAVE_char_fetch_compare_and_swap_write) TA_assert(AO_char_fetch_compare_and_swap_write(&b, 14, 117) == 25); TA_assert(b == 25); TA_assert(AO_char_fetch_compare_and_swap_write(&b, 25, 117) == 25); # else MISSING(AO_char_fetch_compare_and_swap); if (b == 25) b = 117; # endif TA_assert(b == 117); # if defined(AO_HAVE_int_compare_and_swap_write) TA_assert(!AO_int_compare_and_swap_write(&zz, 14, 42)); TA_assert(zz == 13); TA_assert(AO_int_compare_and_swap_write(&zz, 13, 42)); TA_assert(zz == 42); # else MISSING(AO_int_compare_and_swap); if (*(volatile int *)&zz == 13) zz = 42; # endif # if defined(AO_HAVE_int_or_write) AO_int_or_write(&zz, 66); TA_assert(zz == 106); # else # if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \ || !defined(AO_HAVE_int_or_acquire_read) \ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \ || !defined(AO_HAVE_int_or_release) \ || !defined(AO_HAVE_int_or_release_write) \ || !defined(AO_HAVE_int_or_write) MISSING(AO_int_or); # endif zz |= 66; # endif # if defined(AO_HAVE_int_xor_write) AO_int_xor_write(&zz, 181); TA_assert(zz == 223); # else # if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \ || !defined(AO_HAVE_int_xor_acquire_read) \ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \ || !defined(AO_HAVE_int_xor_release) \ || !defined(AO_HAVE_int_xor_release_write) \ || !defined(AO_HAVE_int_xor_write) MISSING(AO_int_xor); # endif zz ^= 181; # endif # if defined(AO_HAVE_int_and_write) AO_int_and_write(&zz, 57); TA_assert(zz == 25); # else # if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \ || !defined(AO_HAVE_int_and_acquire_read) \ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \ || !defined(AO_HAVE_int_and_release) \ || !defined(AO_HAVE_int_and_release_write) \ || !defined(AO_HAVE_int_and_write) MISSING(AO_int_and); # endif zz &= 57; # endif # if defined(AO_HAVE_int_fetch_compare_and_swap_write) TA_assert(AO_int_fetch_compare_and_swap_write(&zz, 14, 117) == 25); TA_assert(zz == 25); TA_assert(AO_int_fetch_compare_and_swap_write(&zz, 25, 117) == 25); # else MISSING(AO_int_fetch_compare_and_swap); if (zz == 25) zz = 117; # endif TA_assert(zz == 117); # if defined(AO_HAVE_double_load_write) || defined(AO_HAVE_double_store_write) /* Initialize old_w even for store to workaround MSan warning. */ old_w.AO_val1 = 3316; old_w.AO_val2 = 2921; # endif # if defined(AO_HAVE_double_load_write) new_w = AO_double_load_write(&old_w); TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921); # elif !defined(AO_HAVE_double_load) \ || !defined(AO_HAVE_double_load_acquire) \ || !defined(AO_HAVE_double_load_acquire_read) \ || !defined(AO_HAVE_double_load_dd_acquire_read) \ || !defined(AO_HAVE_double_load_full) \ || !defined(AO_HAVE_double_load_read) MISSING(AO_double_load); # endif # if defined(AO_HAVE_double_store_write) new_w.AO_val1 = 1375; new_w.AO_val2 = 8243; AO_double_store_write(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); AO_double_store_write(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); new_w.AO_val1 ^= old_w.AO_val1; new_w.AO_val2 ^= old_w.AO_val2; AO_double_store_write(&old_w, new_w); TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0); # elif !defined(AO_HAVE_double_store) \ || !defined(AO_HAVE_double_store_full) \ || !defined(AO_HAVE_double_store_release) \ || !defined(AO_HAVE_double_store_release_write) \ || !defined(AO_HAVE_double_store_write) MISSING(AO_double_store); # endif # if defined(AO_HAVE_compare_double_and_swap_double_write) TA_assert(!AO_compare_double_and_swap_double_write(&w, 17, 42, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_double_and_swap_double_write(&w, 0, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_write(&w, 12, 14, 64, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_write(&w, 11, 13, 85, 82)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_write(&w, 13, 12, 17, 42)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_double_and_swap_double_write(&w, 12, 13, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_double_and_swap_double_write(&w, 17, 42, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_double_and_swap_double); # endif # if defined(AO_HAVE_compare_and_swap_double_write) TA_assert(!AO_compare_and_swap_double_write(&w, 17, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_and_swap_double_write(&w, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_write(&w, 13, 12, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_write(&w, 1213, 48, 86)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_and_swap_double_write(&w, 12, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_and_swap_double_write(&w, 17, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_and_swap_double); # endif # if defined(AO_HAVE_double_compare_and_swap_write) old_w.AO_val1 = 4116; old_w.AO_val2 = 2121; new_w.AO_val1 = 8537; new_w.AO_val2 = 6410; TA_assert(!AO_double_compare_and_swap_write(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_double_compare_and_swap_write(&w, w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = 29; new_w.AO_val1 = 820; new_w.AO_val2 = 5917; TA_assert(!AO_double_compare_and_swap_write(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = 11; old_w.AO_val2 = 6410; new_w.AO_val1 = 3552; new_w.AO_val2 = 1746; TA_assert(!AO_double_compare_and_swap_write(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 8537; new_w.AO_val1 = 4116; new_w.AO_val2 = 2121; TA_assert(!AO_double_compare_and_swap_write(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 6410; new_w.AO_val1 = 1; TA_assert(AO_double_compare_and_swap_write(&w, old_w, new_w)); TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = w.AO_val2; new_w.AO_val1--; new_w.AO_val2 = 0; TA_assert(AO_double_compare_and_swap_write(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_double_compare_and_swap); # endif } /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Some basic sanity tests. These do not test the barrier semantics. */ #undef TA_assert #define TA_assert(e) \ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _full)\n", \ __FILE__, __LINE__), exit(1); } #undef MISSING #define MISSING(name) \ printf("Missing: %s\n", #name "_full") #if defined(CPPCHECK) void list_atomic_full(void); void char_list_atomic_full(void); void short_list_atomic_full(void); void int_list_atomic_full(void); void double_list_atomic_full(void); #endif void test_atomic_full(void) { AO_t x; unsigned char b; unsigned short s; unsigned int zz; # if defined(AO_HAVE_test_and_set_full) AO_TS_t z = AO_TS_INITIALIZER; # endif # if defined(AO_HAVE_double_compare_and_swap_full) \ || defined(AO_HAVE_double_load_full) \ || defined(AO_HAVE_double_store_full) static AO_double_t old_w; /* static to avoid misalignment */ AO_double_t new_w; # endif # if defined(AO_HAVE_compare_and_swap_double_full) \ || defined(AO_HAVE_compare_double_and_swap_double_full) \ || defined(AO_HAVE_double_compare_and_swap_full) static AO_double_t w; /* static to avoid misalignment */ w.AO_val1 = 0; w.AO_val2 = 0; # endif # if defined(CPPCHECK) list_atomic_full(); char_list_atomic_full(); short_list_atomic_full(); int_list_atomic_full(); double_list_atomic_full(); # endif # if defined(AO_HAVE_nop_full) AO_nop_full(); # elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write) MISSING(AO_nop); # endif # if defined(AO_HAVE_store_full) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */ # endif AO_store_full(&x, 13); TA_assert(x == 13); # else # if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \ || !defined(AO_HAVE_store_release) \ || !defined(AO_HAVE_store_release_write) \ || !defined(AO_HAVE_store_write) MISSING(AO_store); # endif x = 13; # endif # if defined(AO_HAVE_load_full) TA_assert(AO_load_full(&x) == 13); # elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \ || !defined(AO_HAVE_load_acquire_read) \ || !defined(AO_HAVE_load_dd_acquire_read) \ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read) MISSING(AO_load); # endif # if defined(AO_HAVE_test_and_set_full) TA_assert(AO_test_and_set_full(&z) == AO_TS_CLEAR); TA_assert(AO_test_and_set_full(&z) == AO_TS_SET); TA_assert(AO_test_and_set_full(&z) == AO_TS_SET); AO_CLEAR(&z); # else MISSING(AO_test_and_set); # endif # if defined(AO_HAVE_fetch_and_add_full) TA_assert(AO_fetch_and_add_full(&x, 42) == 13); TA_assert(AO_fetch_and_add_full(&x, (AO_t)(-42)) == 55); # else MISSING(AO_fetch_and_add); # endif # if defined(AO_HAVE_fetch_and_add1_full) TA_assert(AO_fetch_and_add1_full(&x) == 13); # else MISSING(AO_fetch_and_add1); ++x; # endif # if defined(AO_HAVE_fetch_and_sub1_full) TA_assert(AO_fetch_and_sub1_full(&x) == 14); # else MISSING(AO_fetch_and_sub1); --x; # endif # if defined(AO_HAVE_short_store_full) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile short *)&s = 0; # endif AO_short_store_full(&s, 13); # else # if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \ || !defined(AO_HAVE_short_store_release) \ || !defined(AO_HAVE_short_store_release_write) \ || !defined(AO_HAVE_short_store_write) MISSING(AO_short_store); # endif s = 13; # endif # if defined(AO_HAVE_short_load_full) TA_assert(AO_short_load(&s) == 13); # elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \ || !defined(AO_HAVE_short_load_acquire_read) \ || !defined(AO_HAVE_short_load_dd_acquire_read) \ || !defined(AO_HAVE_short_load_full) \ || !defined(AO_HAVE_short_load_read) MISSING(AO_short_load); # endif # if defined(AO_HAVE_short_fetch_and_add_full) TA_assert(AO_short_fetch_and_add_full(&s, 42) == 13); TA_assert(AO_short_fetch_and_add_full(&s, (unsigned short)-42) == 55); # else MISSING(AO_short_fetch_and_add); # endif # if defined(AO_HAVE_short_fetch_and_add1_full) TA_assert(AO_short_fetch_and_add1_full(&s) == 13); # else MISSING(AO_short_fetch_and_add1); ++s; # endif # if defined(AO_HAVE_short_fetch_and_sub1_full) TA_assert(AO_short_fetch_and_sub1_full(&s) == 14); # else MISSING(AO_short_fetch_and_sub1); --s; # endif TA_assert(*(volatile short *)&s == 13); # if defined(AO_HAVE_char_store_full) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile char *)&b = 0; # endif AO_char_store_full(&b, 13); # else # if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \ || !defined(AO_HAVE_char_store_release) \ || !defined(AO_HAVE_char_store_release_write) \ || !defined(AO_HAVE_char_store_write) MISSING(AO_char_store); # endif b = 13; # endif # if defined(AO_HAVE_char_load_full) TA_assert(AO_char_load(&b) == 13); # elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \ || !defined(AO_HAVE_char_load_acquire_read) \ || !defined(AO_HAVE_char_load_dd_acquire_read) \ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read) MISSING(AO_char_load); # endif # if defined(AO_HAVE_char_fetch_and_add_full) TA_assert(AO_char_fetch_and_add_full(&b, 42) == 13); TA_assert(AO_char_fetch_and_add_full(&b, (unsigned char)-42) == 55); # else MISSING(AO_char_fetch_and_add); # endif # if defined(AO_HAVE_char_fetch_and_add1_full) TA_assert(AO_char_fetch_and_add1_full(&b) == 13); # else MISSING(AO_char_fetch_and_add1); ++b; # endif # if defined(AO_HAVE_char_fetch_and_sub1_full) TA_assert(AO_char_fetch_and_sub1_full(&b) == 14); # else MISSING(AO_char_fetch_and_sub1); --b; # endif TA_assert(*(volatile char *)&b == 13); # if defined(AO_HAVE_int_store_full) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile int *)&zz = 0; # endif AO_int_store_full(&zz, 13); # else # if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \ || !defined(AO_HAVE_int_store_release) \ || !defined(AO_HAVE_int_store_release_write) \ || !defined(AO_HAVE_int_store_write) MISSING(AO_int_store); # endif zz = 13; # endif # if defined(AO_HAVE_int_load_full) TA_assert(AO_int_load(&zz) == 13); # elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \ || !defined(AO_HAVE_int_load_acquire_read) \ || !defined(AO_HAVE_int_load_dd_acquire_read) \ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read) MISSING(AO_int_load); # endif # if defined(AO_HAVE_int_fetch_and_add_full) TA_assert(AO_int_fetch_and_add_full(&zz, 42) == 13); TA_assert(AO_int_fetch_and_add_full(&zz, (unsigned int)-42) == 55); # else MISSING(AO_int_fetch_and_add); # endif # if defined(AO_HAVE_int_fetch_and_add1_full) TA_assert(AO_int_fetch_and_add1_full(&zz) == 13); # else MISSING(AO_int_fetch_and_add1); ++zz; # endif # if defined(AO_HAVE_int_fetch_and_sub1_full) TA_assert(AO_int_fetch_and_sub1_full(&zz) == 14); # else MISSING(AO_int_fetch_and_sub1); --zz; # endif TA_assert(*(volatile int *)&zz == 13); # if defined(AO_HAVE_compare_and_swap_full) TA_assert(!AO_compare_and_swap_full(&x, 14, 42)); TA_assert(x == 13); TA_assert(AO_compare_and_swap_full(&x, 13, 42)); TA_assert(x == 42); # else MISSING(AO_compare_and_swap); if (*(volatile AO_t *)&x == 13) x = 42; # endif # if defined(AO_HAVE_or_full) AO_or_full(&x, 66); TA_assert(x == 106); # else # if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write) MISSING(AO_or); # endif x |= 66; # endif # if defined(AO_HAVE_xor_full) AO_xor_full(&x, 181); TA_assert(x == 223); # else # if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write) MISSING(AO_xor); # endif x ^= 181; # endif # if defined(AO_HAVE_and_full) AO_and_full(&x, 57); TA_assert(x == 25); # else # if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write) MISSING(AO_and); # endif x &= 57; # endif # if defined(AO_HAVE_fetch_compare_and_swap_full) TA_assert(AO_fetch_compare_and_swap_full(&x, 14, 117) == 25); TA_assert(x == 25); TA_assert(AO_fetch_compare_and_swap_full(&x, 25, 117) == 25); # else MISSING(AO_fetch_compare_and_swap); if (x == 25) x = 117; # endif TA_assert(x == 117); # if defined(AO_HAVE_short_compare_and_swap_full) TA_assert(!AO_short_compare_and_swap_full(&s, 14, 42)); TA_assert(s == 13); TA_assert(AO_short_compare_and_swap_full(&s, 13, 42)); TA_assert(s == 42); # else MISSING(AO_short_compare_and_swap); if (*(volatile short *)&s == 13) s = 42; # endif # if defined(AO_HAVE_short_or_full) AO_short_or_full(&s, 66); TA_assert(s == 106); # else # if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \ || !defined(AO_HAVE_short_or_acquire_read) \ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \ || !defined(AO_HAVE_short_or_release) \ || !defined(AO_HAVE_short_or_release_write) \ || !defined(AO_HAVE_short_or_write) MISSING(AO_short_or); # endif s |= 66; # endif # if defined(AO_HAVE_short_xor_full) AO_short_xor_full(&s, 181); TA_assert(s == 223); # else # if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \ || !defined(AO_HAVE_short_xor_acquire_read) \ || !defined(AO_HAVE_short_xor_full) \ || !defined(AO_HAVE_short_xor_read) \ || !defined(AO_HAVE_short_xor_release) \ || !defined(AO_HAVE_short_xor_release_write) \ || !defined(AO_HAVE_short_xor_write) MISSING(AO_short_xor); # endif s ^= 181; # endif # if defined(AO_HAVE_short_and_full) AO_short_and_full(&s, 57); TA_assert(s == 25); # else # if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \ || !defined(AO_HAVE_short_and_acquire_read) \ || !defined(AO_HAVE_short_and_full) \ || !defined(AO_HAVE_short_and_read) \ || !defined(AO_HAVE_short_and_release) \ || !defined(AO_HAVE_short_and_release_write) \ || !defined(AO_HAVE_short_and_write) MISSING(AO_short_and); # endif s &= 57; # endif # if defined(AO_HAVE_short_fetch_compare_and_swap_full) TA_assert(AO_short_fetch_compare_and_swap_full(&s, 14, 117) == 25); TA_assert(s == 25); TA_assert(AO_short_fetch_compare_and_swap_full(&s, 25, 117) == 25); # else MISSING(AO_short_fetch_compare_and_swap); if (s == 25) s = 117; # endif TA_assert(s == 117); # if defined(AO_HAVE_char_compare_and_swap_full) TA_assert(!AO_char_compare_and_swap_full(&b, 14, 42)); TA_assert(b == 13); TA_assert(AO_char_compare_and_swap_full(&b, 13, 42)); TA_assert(b == 42); # else MISSING(AO_char_compare_and_swap); if (*(volatile char *)&b == 13) b = 42; # endif # if defined(AO_HAVE_char_or_full) AO_char_or_full(&b, 66); TA_assert(b == 106); # else # if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \ || !defined(AO_HAVE_char_or_acquire_read) \ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \ || !defined(AO_HAVE_char_or_release) \ || !defined(AO_HAVE_char_or_release_write) \ || !defined(AO_HAVE_char_or_write) MISSING(AO_char_or); # endif b |= 66; # endif # if defined(AO_HAVE_char_xor_full) AO_char_xor_full(&b, 181); TA_assert(b == 223); # else # if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \ || !defined(AO_HAVE_char_xor_acquire_read) \ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \ || !defined(AO_HAVE_char_xor_release) \ || !defined(AO_HAVE_char_xor_release_write) \ || !defined(AO_HAVE_char_xor_write) MISSING(AO_char_xor); # endif b ^= 181; # endif # if defined(AO_HAVE_char_and_full) AO_char_and_full(&b, 57); TA_assert(b == 25); # else # if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \ || !defined(AO_HAVE_char_and_acquire_read) \ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \ || !defined(AO_HAVE_char_and_release) \ || !defined(AO_HAVE_char_and_release_write) \ || !defined(AO_HAVE_char_and_write) MISSING(AO_char_and); # endif b &= 57; # endif # if defined(AO_HAVE_char_fetch_compare_and_swap_full) TA_assert(AO_char_fetch_compare_and_swap_full(&b, 14, 117) == 25); TA_assert(b == 25); TA_assert(AO_char_fetch_compare_and_swap_full(&b, 25, 117) == 25); # else MISSING(AO_char_fetch_compare_and_swap); if (b == 25) b = 117; # endif TA_assert(b == 117); # if defined(AO_HAVE_int_compare_and_swap_full) TA_assert(!AO_int_compare_and_swap_full(&zz, 14, 42)); TA_assert(zz == 13); TA_assert(AO_int_compare_and_swap_full(&zz, 13, 42)); TA_assert(zz == 42); # else MISSING(AO_int_compare_and_swap); if (*(volatile int *)&zz == 13) zz = 42; # endif # if defined(AO_HAVE_int_or_full) AO_int_or_full(&zz, 66); TA_assert(zz == 106); # else # if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \ || !defined(AO_HAVE_int_or_acquire_read) \ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \ || !defined(AO_HAVE_int_or_release) \ || !defined(AO_HAVE_int_or_release_write) \ || !defined(AO_HAVE_int_or_write) MISSING(AO_int_or); # endif zz |= 66; # endif # if defined(AO_HAVE_int_xor_full) AO_int_xor_full(&zz, 181); TA_assert(zz == 223); # else # if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \ || !defined(AO_HAVE_int_xor_acquire_read) \ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \ || !defined(AO_HAVE_int_xor_release) \ || !defined(AO_HAVE_int_xor_release_write) \ || !defined(AO_HAVE_int_xor_write) MISSING(AO_int_xor); # endif zz ^= 181; # endif # if defined(AO_HAVE_int_and_full) AO_int_and_full(&zz, 57); TA_assert(zz == 25); # else # if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \ || !defined(AO_HAVE_int_and_acquire_read) \ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \ || !defined(AO_HAVE_int_and_release) \ || !defined(AO_HAVE_int_and_release_write) \ || !defined(AO_HAVE_int_and_write) MISSING(AO_int_and); # endif zz &= 57; # endif # if defined(AO_HAVE_int_fetch_compare_and_swap_full) TA_assert(AO_int_fetch_compare_and_swap_full(&zz, 14, 117) == 25); TA_assert(zz == 25); TA_assert(AO_int_fetch_compare_and_swap_full(&zz, 25, 117) == 25); # else MISSING(AO_int_fetch_compare_and_swap); if (zz == 25) zz = 117; # endif TA_assert(zz == 117); # if defined(AO_HAVE_double_load_full) || defined(AO_HAVE_double_store_full) /* Initialize old_w even for store to workaround MSan warning. */ old_w.AO_val1 = 3316; old_w.AO_val2 = 2921; # endif # if defined(AO_HAVE_double_load_full) new_w = AO_double_load_full(&old_w); TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921); # elif !defined(AO_HAVE_double_load) \ || !defined(AO_HAVE_double_load_acquire) \ || !defined(AO_HAVE_double_load_acquire_read) \ || !defined(AO_HAVE_double_load_dd_acquire_read) \ || !defined(AO_HAVE_double_load_full) \ || !defined(AO_HAVE_double_load_read) MISSING(AO_double_load); # endif # if defined(AO_HAVE_double_store_full) new_w.AO_val1 = 1375; new_w.AO_val2 = 8243; AO_double_store_full(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); AO_double_store_full(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); new_w.AO_val1 ^= old_w.AO_val1; new_w.AO_val2 ^= old_w.AO_val2; AO_double_store_full(&old_w, new_w); TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0); # elif !defined(AO_HAVE_double_store) \ || !defined(AO_HAVE_double_store_full) \ || !defined(AO_HAVE_double_store_release) \ || !defined(AO_HAVE_double_store_release_write) \ || !defined(AO_HAVE_double_store_write) MISSING(AO_double_store); # endif # if defined(AO_HAVE_compare_double_and_swap_double_full) TA_assert(!AO_compare_double_and_swap_double_full(&w, 17, 42, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_double_and_swap_double_full(&w, 0, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_full(&w, 12, 14, 64, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_full(&w, 11, 13, 85, 82)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_full(&w, 13, 12, 17, 42)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_double_and_swap_double_full(&w, 12, 13, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_double_and_swap_double_full(&w, 17, 42, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_double_and_swap_double); # endif # if defined(AO_HAVE_compare_and_swap_double_full) TA_assert(!AO_compare_and_swap_double_full(&w, 17, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_and_swap_double_full(&w, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_full(&w, 13, 12, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_full(&w, 1213, 48, 86)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_and_swap_double_full(&w, 12, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_and_swap_double_full(&w, 17, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_and_swap_double); # endif # if defined(AO_HAVE_double_compare_and_swap_full) old_w.AO_val1 = 4116; old_w.AO_val2 = 2121; new_w.AO_val1 = 8537; new_w.AO_val2 = 6410; TA_assert(!AO_double_compare_and_swap_full(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_double_compare_and_swap_full(&w, w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = 29; new_w.AO_val1 = 820; new_w.AO_val2 = 5917; TA_assert(!AO_double_compare_and_swap_full(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = 11; old_w.AO_val2 = 6410; new_w.AO_val1 = 3552; new_w.AO_val2 = 1746; TA_assert(!AO_double_compare_and_swap_full(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 8537; new_w.AO_val1 = 4116; new_w.AO_val2 = 2121; TA_assert(!AO_double_compare_and_swap_full(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 6410; new_w.AO_val1 = 1; TA_assert(AO_double_compare_and_swap_full(&w, old_w, new_w)); TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = w.AO_val2; new_w.AO_val1--; new_w.AO_val2 = 0; TA_assert(AO_double_compare_and_swap_full(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_double_compare_and_swap); # endif } /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Some basic sanity tests. These do not test the barrier semantics. */ #undef TA_assert #define TA_assert(e) \ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _release_write)\n", \ __FILE__, __LINE__), exit(1); } #undef MISSING #define MISSING(name) \ printf("Missing: %s\n", #name "_release_write") #if defined(CPPCHECK) void list_atomic_release_write(void); void char_list_atomic_release_write(void); void short_list_atomic_release_write(void); void int_list_atomic_release_write(void); void double_list_atomic_release_write(void); #endif void test_atomic_release_write(void) { AO_t x; unsigned char b; unsigned short s; unsigned int zz; # if defined(AO_HAVE_test_and_set_release_write) AO_TS_t z = AO_TS_INITIALIZER; # endif # if defined(AO_HAVE_double_compare_and_swap_release_write) \ || defined(AO_HAVE_double_load_release_write) \ || defined(AO_HAVE_double_store_release_write) static AO_double_t old_w; /* static to avoid misalignment */ AO_double_t new_w; # endif # if defined(AO_HAVE_compare_and_swap_double_release_write) \ || defined(AO_HAVE_compare_double_and_swap_double_release_write) \ || defined(AO_HAVE_double_compare_and_swap_release_write) static AO_double_t w; /* static to avoid misalignment */ w.AO_val1 = 0; w.AO_val2 = 0; # endif # if defined(CPPCHECK) list_atomic_release_write(); char_list_atomic_release_write(); short_list_atomic_release_write(); int_list_atomic_release_write(); double_list_atomic_release_write(); # endif # if defined(AO_HAVE_nop_release_write) AO_nop_release_write(); # elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write) MISSING(AO_nop); # endif # if defined(AO_HAVE_store_release_write) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */ # endif AO_store_release_write(&x, 13); TA_assert(x == 13); # else # if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \ || !defined(AO_HAVE_store_release) \ || !defined(AO_HAVE_store_release_write) \ || !defined(AO_HAVE_store_write) MISSING(AO_store); # endif x = 13; # endif # if defined(AO_HAVE_load_release_write) TA_assert(AO_load_release_write(&x) == 13); # elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \ || !defined(AO_HAVE_load_acquire_read) \ || !defined(AO_HAVE_load_dd_acquire_read) \ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read) MISSING(AO_load); # endif # if defined(AO_HAVE_test_and_set_release_write) TA_assert(AO_test_and_set_release_write(&z) == AO_TS_CLEAR); TA_assert(AO_test_and_set_release_write(&z) == AO_TS_SET); TA_assert(AO_test_and_set_release_write(&z) == AO_TS_SET); AO_CLEAR(&z); # else MISSING(AO_test_and_set); # endif # if defined(AO_HAVE_fetch_and_add_release_write) TA_assert(AO_fetch_and_add_release_write(&x, 42) == 13); TA_assert(AO_fetch_and_add_release_write(&x, (AO_t)(-42)) == 55); # else MISSING(AO_fetch_and_add); # endif # if defined(AO_HAVE_fetch_and_add1_release_write) TA_assert(AO_fetch_and_add1_release_write(&x) == 13); # else MISSING(AO_fetch_and_add1); ++x; # endif # if defined(AO_HAVE_fetch_and_sub1_release_write) TA_assert(AO_fetch_and_sub1_release_write(&x) == 14); # else MISSING(AO_fetch_and_sub1); --x; # endif # if defined(AO_HAVE_short_store_release_write) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile short *)&s = 0; # endif AO_short_store_release_write(&s, 13); # else # if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \ || !defined(AO_HAVE_short_store_release) \ || !defined(AO_HAVE_short_store_release_write) \ || !defined(AO_HAVE_short_store_write) MISSING(AO_short_store); # endif s = 13; # endif # if defined(AO_HAVE_short_load_release_write) TA_assert(AO_short_load(&s) == 13); # elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \ || !defined(AO_HAVE_short_load_acquire_read) \ || !defined(AO_HAVE_short_load_dd_acquire_read) \ || !defined(AO_HAVE_short_load_full) \ || !defined(AO_HAVE_short_load_read) MISSING(AO_short_load); # endif # if defined(AO_HAVE_short_fetch_and_add_release_write) TA_assert(AO_short_fetch_and_add_release_write(&s, 42) == 13); TA_assert(AO_short_fetch_and_add_release_write(&s, (unsigned short)-42) == 55); # else MISSING(AO_short_fetch_and_add); # endif # if defined(AO_HAVE_short_fetch_and_add1_release_write) TA_assert(AO_short_fetch_and_add1_release_write(&s) == 13); # else MISSING(AO_short_fetch_and_add1); ++s; # endif # if defined(AO_HAVE_short_fetch_and_sub1_release_write) TA_assert(AO_short_fetch_and_sub1_release_write(&s) == 14); # else MISSING(AO_short_fetch_and_sub1); --s; # endif TA_assert(*(volatile short *)&s == 13); # if defined(AO_HAVE_char_store_release_write) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile char *)&b = 0; # endif AO_char_store_release_write(&b, 13); # else # if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \ || !defined(AO_HAVE_char_store_release) \ || !defined(AO_HAVE_char_store_release_write) \ || !defined(AO_HAVE_char_store_write) MISSING(AO_char_store); # endif b = 13; # endif # if defined(AO_HAVE_char_load_release_write) TA_assert(AO_char_load(&b) == 13); # elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \ || !defined(AO_HAVE_char_load_acquire_read) \ || !defined(AO_HAVE_char_load_dd_acquire_read) \ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read) MISSING(AO_char_load); # endif # if defined(AO_HAVE_char_fetch_and_add_release_write) TA_assert(AO_char_fetch_and_add_release_write(&b, 42) == 13); TA_assert(AO_char_fetch_and_add_release_write(&b, (unsigned char)-42) == 55); # else MISSING(AO_char_fetch_and_add); # endif # if defined(AO_HAVE_char_fetch_and_add1_release_write) TA_assert(AO_char_fetch_and_add1_release_write(&b) == 13); # else MISSING(AO_char_fetch_and_add1); ++b; # endif # if defined(AO_HAVE_char_fetch_and_sub1_release_write) TA_assert(AO_char_fetch_and_sub1_release_write(&b) == 14); # else MISSING(AO_char_fetch_and_sub1); --b; # endif TA_assert(*(volatile char *)&b == 13); # if defined(AO_HAVE_int_store_release_write) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile int *)&zz = 0; # endif AO_int_store_release_write(&zz, 13); # else # if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \ || !defined(AO_HAVE_int_store_release) \ || !defined(AO_HAVE_int_store_release_write) \ || !defined(AO_HAVE_int_store_write) MISSING(AO_int_store); # endif zz = 13; # endif # if defined(AO_HAVE_int_load_release_write) TA_assert(AO_int_load(&zz) == 13); # elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \ || !defined(AO_HAVE_int_load_acquire_read) \ || !defined(AO_HAVE_int_load_dd_acquire_read) \ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read) MISSING(AO_int_load); # endif # if defined(AO_HAVE_int_fetch_and_add_release_write) TA_assert(AO_int_fetch_and_add_release_write(&zz, 42) == 13); TA_assert(AO_int_fetch_and_add_release_write(&zz, (unsigned int)-42) == 55); # else MISSING(AO_int_fetch_and_add); # endif # if defined(AO_HAVE_int_fetch_and_add1_release_write) TA_assert(AO_int_fetch_and_add1_release_write(&zz) == 13); # else MISSING(AO_int_fetch_and_add1); ++zz; # endif # if defined(AO_HAVE_int_fetch_and_sub1_release_write) TA_assert(AO_int_fetch_and_sub1_release_write(&zz) == 14); # else MISSING(AO_int_fetch_and_sub1); --zz; # endif TA_assert(*(volatile int *)&zz == 13); # if defined(AO_HAVE_compare_and_swap_release_write) TA_assert(!AO_compare_and_swap_release_write(&x, 14, 42)); TA_assert(x == 13); TA_assert(AO_compare_and_swap_release_write(&x, 13, 42)); TA_assert(x == 42); # else MISSING(AO_compare_and_swap); if (*(volatile AO_t *)&x == 13) x = 42; # endif # if defined(AO_HAVE_or_release_write) AO_or_release_write(&x, 66); TA_assert(x == 106); # else # if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write) MISSING(AO_or); # endif x |= 66; # endif # if defined(AO_HAVE_xor_release_write) AO_xor_release_write(&x, 181); TA_assert(x == 223); # else # if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write) MISSING(AO_xor); # endif x ^= 181; # endif # if defined(AO_HAVE_and_release_write) AO_and_release_write(&x, 57); TA_assert(x == 25); # else # if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write) MISSING(AO_and); # endif x &= 57; # endif # if defined(AO_HAVE_fetch_compare_and_swap_release_write) TA_assert(AO_fetch_compare_and_swap_release_write(&x, 14, 117) == 25); TA_assert(x == 25); TA_assert(AO_fetch_compare_and_swap_release_write(&x, 25, 117) == 25); # else MISSING(AO_fetch_compare_and_swap); if (x == 25) x = 117; # endif TA_assert(x == 117); # if defined(AO_HAVE_short_compare_and_swap_release_write) TA_assert(!AO_short_compare_and_swap_release_write(&s, 14, 42)); TA_assert(s == 13); TA_assert(AO_short_compare_and_swap_release_write(&s, 13, 42)); TA_assert(s == 42); # else MISSING(AO_short_compare_and_swap); if (*(volatile short *)&s == 13) s = 42; # endif # if defined(AO_HAVE_short_or_release_write) AO_short_or_release_write(&s, 66); TA_assert(s == 106); # else # if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \ || !defined(AO_HAVE_short_or_acquire_read) \ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \ || !defined(AO_HAVE_short_or_release) \ || !defined(AO_HAVE_short_or_release_write) \ || !defined(AO_HAVE_short_or_write) MISSING(AO_short_or); # endif s |= 66; # endif # if defined(AO_HAVE_short_xor_release_write) AO_short_xor_release_write(&s, 181); TA_assert(s == 223); # else # if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \ || !defined(AO_HAVE_short_xor_acquire_read) \ || !defined(AO_HAVE_short_xor_full) \ || !defined(AO_HAVE_short_xor_read) \ || !defined(AO_HAVE_short_xor_release) \ || !defined(AO_HAVE_short_xor_release_write) \ || !defined(AO_HAVE_short_xor_write) MISSING(AO_short_xor); # endif s ^= 181; # endif # if defined(AO_HAVE_short_and_release_write) AO_short_and_release_write(&s, 57); TA_assert(s == 25); # else # if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \ || !defined(AO_HAVE_short_and_acquire_read) \ || !defined(AO_HAVE_short_and_full) \ || !defined(AO_HAVE_short_and_read) \ || !defined(AO_HAVE_short_and_release) \ || !defined(AO_HAVE_short_and_release_write) \ || !defined(AO_HAVE_short_and_write) MISSING(AO_short_and); # endif s &= 57; # endif # if defined(AO_HAVE_short_fetch_compare_and_swap_release_write) TA_assert(AO_short_fetch_compare_and_swap_release_write(&s, 14, 117) == 25); TA_assert(s == 25); TA_assert(AO_short_fetch_compare_and_swap_release_write(&s, 25, 117) == 25); # else MISSING(AO_short_fetch_compare_and_swap); if (s == 25) s = 117; # endif TA_assert(s == 117); # if defined(AO_HAVE_char_compare_and_swap_release_write) TA_assert(!AO_char_compare_and_swap_release_write(&b, 14, 42)); TA_assert(b == 13); TA_assert(AO_char_compare_and_swap_release_write(&b, 13, 42)); TA_assert(b == 42); # else MISSING(AO_char_compare_and_swap); if (*(volatile char *)&b == 13) b = 42; # endif # if defined(AO_HAVE_char_or_release_write) AO_char_or_release_write(&b, 66); TA_assert(b == 106); # else # if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \ || !defined(AO_HAVE_char_or_acquire_read) \ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \ || !defined(AO_HAVE_char_or_release) \ || !defined(AO_HAVE_char_or_release_write) \ || !defined(AO_HAVE_char_or_write) MISSING(AO_char_or); # endif b |= 66; # endif # if defined(AO_HAVE_char_xor_release_write) AO_char_xor_release_write(&b, 181); TA_assert(b == 223); # else # if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \ || !defined(AO_HAVE_char_xor_acquire_read) \ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \ || !defined(AO_HAVE_char_xor_release) \ || !defined(AO_HAVE_char_xor_release_write) \ || !defined(AO_HAVE_char_xor_write) MISSING(AO_char_xor); # endif b ^= 181; # endif # if defined(AO_HAVE_char_and_release_write) AO_char_and_release_write(&b, 57); TA_assert(b == 25); # else # if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \ || !defined(AO_HAVE_char_and_acquire_read) \ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \ || !defined(AO_HAVE_char_and_release) \ || !defined(AO_HAVE_char_and_release_write) \ || !defined(AO_HAVE_char_and_write) MISSING(AO_char_and); # endif b &= 57; # endif # if defined(AO_HAVE_char_fetch_compare_and_swap_release_write) TA_assert(AO_char_fetch_compare_and_swap_release_write(&b, 14, 117) == 25); TA_assert(b == 25); TA_assert(AO_char_fetch_compare_and_swap_release_write(&b, 25, 117) == 25); # else MISSING(AO_char_fetch_compare_and_swap); if (b == 25) b = 117; # endif TA_assert(b == 117); # if defined(AO_HAVE_int_compare_and_swap_release_write) TA_assert(!AO_int_compare_and_swap_release_write(&zz, 14, 42)); TA_assert(zz == 13); TA_assert(AO_int_compare_and_swap_release_write(&zz, 13, 42)); TA_assert(zz == 42); # else MISSING(AO_int_compare_and_swap); if (*(volatile int *)&zz == 13) zz = 42; # endif # if defined(AO_HAVE_int_or_release_write) AO_int_or_release_write(&zz, 66); TA_assert(zz == 106); # else # if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \ || !defined(AO_HAVE_int_or_acquire_read) \ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \ || !defined(AO_HAVE_int_or_release) \ || !defined(AO_HAVE_int_or_release_write) \ || !defined(AO_HAVE_int_or_write) MISSING(AO_int_or); # endif zz |= 66; # endif # if defined(AO_HAVE_int_xor_release_write) AO_int_xor_release_write(&zz, 181); TA_assert(zz == 223); # else # if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \ || !defined(AO_HAVE_int_xor_acquire_read) \ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \ || !defined(AO_HAVE_int_xor_release) \ || !defined(AO_HAVE_int_xor_release_write) \ || !defined(AO_HAVE_int_xor_write) MISSING(AO_int_xor); # endif zz ^= 181; # endif # if defined(AO_HAVE_int_and_release_write) AO_int_and_release_write(&zz, 57); TA_assert(zz == 25); # else # if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \ || !defined(AO_HAVE_int_and_acquire_read) \ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \ || !defined(AO_HAVE_int_and_release) \ || !defined(AO_HAVE_int_and_release_write) \ || !defined(AO_HAVE_int_and_write) MISSING(AO_int_and); # endif zz &= 57; # endif # if defined(AO_HAVE_int_fetch_compare_and_swap_release_write) TA_assert(AO_int_fetch_compare_and_swap_release_write(&zz, 14, 117) == 25); TA_assert(zz == 25); TA_assert(AO_int_fetch_compare_and_swap_release_write(&zz, 25, 117) == 25); # else MISSING(AO_int_fetch_compare_and_swap); if (zz == 25) zz = 117; # endif TA_assert(zz == 117); # if defined(AO_HAVE_double_load_release_write) || defined(AO_HAVE_double_store_release_write) /* Initialize old_w even for store to workaround MSan warning. */ old_w.AO_val1 = 3316; old_w.AO_val2 = 2921; # endif # if defined(AO_HAVE_double_load_release_write) new_w = AO_double_load_release_write(&old_w); TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921); # elif !defined(AO_HAVE_double_load) \ || !defined(AO_HAVE_double_load_acquire) \ || !defined(AO_HAVE_double_load_acquire_read) \ || !defined(AO_HAVE_double_load_dd_acquire_read) \ || !defined(AO_HAVE_double_load_full) \ || !defined(AO_HAVE_double_load_read) MISSING(AO_double_load); # endif # if defined(AO_HAVE_double_store_release_write) new_w.AO_val1 = 1375; new_w.AO_val2 = 8243; AO_double_store_release_write(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); AO_double_store_release_write(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); new_w.AO_val1 ^= old_w.AO_val1; new_w.AO_val2 ^= old_w.AO_val2; AO_double_store_release_write(&old_w, new_w); TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0); # elif !defined(AO_HAVE_double_store) \ || !defined(AO_HAVE_double_store_full) \ || !defined(AO_HAVE_double_store_release) \ || !defined(AO_HAVE_double_store_release_write) \ || !defined(AO_HAVE_double_store_write) MISSING(AO_double_store); # endif # if defined(AO_HAVE_compare_double_and_swap_double_release_write) TA_assert(!AO_compare_double_and_swap_double_release_write(&w, 17, 42, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_double_and_swap_double_release_write(&w, 0, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_release_write(&w, 12, 14, 64, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_release_write(&w, 11, 13, 85, 82)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_release_write(&w, 13, 12, 17, 42)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_double_and_swap_double_release_write(&w, 12, 13, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_double_and_swap_double_release_write(&w, 17, 42, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_double_and_swap_double); # endif # if defined(AO_HAVE_compare_and_swap_double_release_write) TA_assert(!AO_compare_and_swap_double_release_write(&w, 17, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_and_swap_double_release_write(&w, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_release_write(&w, 13, 12, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_release_write(&w, 1213, 48, 86)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_and_swap_double_release_write(&w, 12, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_and_swap_double_release_write(&w, 17, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_and_swap_double); # endif # if defined(AO_HAVE_double_compare_and_swap_release_write) old_w.AO_val1 = 4116; old_w.AO_val2 = 2121; new_w.AO_val1 = 8537; new_w.AO_val2 = 6410; TA_assert(!AO_double_compare_and_swap_release_write(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_double_compare_and_swap_release_write(&w, w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = 29; new_w.AO_val1 = 820; new_w.AO_val2 = 5917; TA_assert(!AO_double_compare_and_swap_release_write(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = 11; old_w.AO_val2 = 6410; new_w.AO_val1 = 3552; new_w.AO_val2 = 1746; TA_assert(!AO_double_compare_and_swap_release_write(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 8537; new_w.AO_val1 = 4116; new_w.AO_val2 = 2121; TA_assert(!AO_double_compare_and_swap_release_write(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 6410; new_w.AO_val1 = 1; TA_assert(AO_double_compare_and_swap_release_write(&w, old_w, new_w)); TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = w.AO_val2; new_w.AO_val1--; new_w.AO_val2 = 0; TA_assert(AO_double_compare_and_swap_release_write(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_double_compare_and_swap); # endif } /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Some basic sanity tests. These do not test the barrier semantics. */ #undef TA_assert #define TA_assert(e) \ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _acquire_read)\n", \ __FILE__, __LINE__), exit(1); } #undef MISSING #define MISSING(name) \ printf("Missing: %s\n", #name "_acquire_read") #if defined(CPPCHECK) void list_atomic_acquire_read(void); void char_list_atomic_acquire_read(void); void short_list_atomic_acquire_read(void); void int_list_atomic_acquire_read(void); void double_list_atomic_acquire_read(void); #endif void test_atomic_acquire_read(void) { AO_t x; unsigned char b; unsigned short s; unsigned int zz; # if defined(AO_HAVE_test_and_set_acquire_read) AO_TS_t z = AO_TS_INITIALIZER; # endif # if defined(AO_HAVE_double_compare_and_swap_acquire_read) \ || defined(AO_HAVE_double_load_acquire_read) \ || defined(AO_HAVE_double_store_acquire_read) static AO_double_t old_w; /* static to avoid misalignment */ AO_double_t new_w; # endif # if defined(AO_HAVE_compare_and_swap_double_acquire_read) \ || defined(AO_HAVE_compare_double_and_swap_double_acquire_read) \ || defined(AO_HAVE_double_compare_and_swap_acquire_read) static AO_double_t w; /* static to avoid misalignment */ w.AO_val1 = 0; w.AO_val2 = 0; # endif # if defined(CPPCHECK) list_atomic_acquire_read(); char_list_atomic_acquire_read(); short_list_atomic_acquire_read(); int_list_atomic_acquire_read(); double_list_atomic_acquire_read(); # endif # if defined(AO_HAVE_nop_acquire_read) AO_nop_acquire_read(); # elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write) MISSING(AO_nop); # endif # if defined(AO_HAVE_store_acquire_read) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */ # endif AO_store_acquire_read(&x, 13); TA_assert(x == 13); # else # if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \ || !defined(AO_HAVE_store_release) \ || !defined(AO_HAVE_store_release_write) \ || !defined(AO_HAVE_store_write) MISSING(AO_store); # endif x = 13; # endif # if defined(AO_HAVE_load_acquire_read) TA_assert(AO_load_acquire_read(&x) == 13); # elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \ || !defined(AO_HAVE_load_acquire_read) \ || !defined(AO_HAVE_load_dd_acquire_read) \ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read) MISSING(AO_load); # endif # if defined(AO_HAVE_test_and_set_acquire_read) TA_assert(AO_test_and_set_acquire_read(&z) == AO_TS_CLEAR); TA_assert(AO_test_and_set_acquire_read(&z) == AO_TS_SET); TA_assert(AO_test_and_set_acquire_read(&z) == AO_TS_SET); AO_CLEAR(&z); # else MISSING(AO_test_and_set); # endif # if defined(AO_HAVE_fetch_and_add_acquire_read) TA_assert(AO_fetch_and_add_acquire_read(&x, 42) == 13); TA_assert(AO_fetch_and_add_acquire_read(&x, (AO_t)(-42)) == 55); # else MISSING(AO_fetch_and_add); # endif # if defined(AO_HAVE_fetch_and_add1_acquire_read) TA_assert(AO_fetch_and_add1_acquire_read(&x) == 13); # else MISSING(AO_fetch_and_add1); ++x; # endif # if defined(AO_HAVE_fetch_and_sub1_acquire_read) TA_assert(AO_fetch_and_sub1_acquire_read(&x) == 14); # else MISSING(AO_fetch_and_sub1); --x; # endif # if defined(AO_HAVE_short_store_acquire_read) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile short *)&s = 0; # endif AO_short_store_acquire_read(&s, 13); # else # if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \ || !defined(AO_HAVE_short_store_release) \ || !defined(AO_HAVE_short_store_release_write) \ || !defined(AO_HAVE_short_store_write) MISSING(AO_short_store); # endif s = 13; # endif # if defined(AO_HAVE_short_load_acquire_read) TA_assert(AO_short_load(&s) == 13); # elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \ || !defined(AO_HAVE_short_load_acquire_read) \ || !defined(AO_HAVE_short_load_dd_acquire_read) \ || !defined(AO_HAVE_short_load_full) \ || !defined(AO_HAVE_short_load_read) MISSING(AO_short_load); # endif # if defined(AO_HAVE_short_fetch_and_add_acquire_read) TA_assert(AO_short_fetch_and_add_acquire_read(&s, 42) == 13); TA_assert(AO_short_fetch_and_add_acquire_read(&s, (unsigned short)-42) == 55); # else MISSING(AO_short_fetch_and_add); # endif # if defined(AO_HAVE_short_fetch_and_add1_acquire_read) TA_assert(AO_short_fetch_and_add1_acquire_read(&s) == 13); # else MISSING(AO_short_fetch_and_add1); ++s; # endif # if defined(AO_HAVE_short_fetch_and_sub1_acquire_read) TA_assert(AO_short_fetch_and_sub1_acquire_read(&s) == 14); # else MISSING(AO_short_fetch_and_sub1); --s; # endif TA_assert(*(volatile short *)&s == 13); # if defined(AO_HAVE_char_store_acquire_read) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile char *)&b = 0; # endif AO_char_store_acquire_read(&b, 13); # else # if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \ || !defined(AO_HAVE_char_store_release) \ || !defined(AO_HAVE_char_store_release_write) \ || !defined(AO_HAVE_char_store_write) MISSING(AO_char_store); # endif b = 13; # endif # if defined(AO_HAVE_char_load_acquire_read) TA_assert(AO_char_load(&b) == 13); # elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \ || !defined(AO_HAVE_char_load_acquire_read) \ || !defined(AO_HAVE_char_load_dd_acquire_read) \ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read) MISSING(AO_char_load); # endif # if defined(AO_HAVE_char_fetch_and_add_acquire_read) TA_assert(AO_char_fetch_and_add_acquire_read(&b, 42) == 13); TA_assert(AO_char_fetch_and_add_acquire_read(&b, (unsigned char)-42) == 55); # else MISSING(AO_char_fetch_and_add); # endif # if defined(AO_HAVE_char_fetch_and_add1_acquire_read) TA_assert(AO_char_fetch_and_add1_acquire_read(&b) == 13); # else MISSING(AO_char_fetch_and_add1); ++b; # endif # if defined(AO_HAVE_char_fetch_and_sub1_acquire_read) TA_assert(AO_char_fetch_and_sub1_acquire_read(&b) == 14); # else MISSING(AO_char_fetch_and_sub1); --b; # endif TA_assert(*(volatile char *)&b == 13); # if defined(AO_HAVE_int_store_acquire_read) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile int *)&zz = 0; # endif AO_int_store_acquire_read(&zz, 13); # else # if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \ || !defined(AO_HAVE_int_store_release) \ || !defined(AO_HAVE_int_store_release_write) \ || !defined(AO_HAVE_int_store_write) MISSING(AO_int_store); # endif zz = 13; # endif # if defined(AO_HAVE_int_load_acquire_read) TA_assert(AO_int_load(&zz) == 13); # elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \ || !defined(AO_HAVE_int_load_acquire_read) \ || !defined(AO_HAVE_int_load_dd_acquire_read) \ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read) MISSING(AO_int_load); # endif # if defined(AO_HAVE_int_fetch_and_add_acquire_read) TA_assert(AO_int_fetch_and_add_acquire_read(&zz, 42) == 13); TA_assert(AO_int_fetch_and_add_acquire_read(&zz, (unsigned int)-42) == 55); # else MISSING(AO_int_fetch_and_add); # endif # if defined(AO_HAVE_int_fetch_and_add1_acquire_read) TA_assert(AO_int_fetch_and_add1_acquire_read(&zz) == 13); # else MISSING(AO_int_fetch_and_add1); ++zz; # endif # if defined(AO_HAVE_int_fetch_and_sub1_acquire_read) TA_assert(AO_int_fetch_and_sub1_acquire_read(&zz) == 14); # else MISSING(AO_int_fetch_and_sub1); --zz; # endif TA_assert(*(volatile int *)&zz == 13); # if defined(AO_HAVE_compare_and_swap_acquire_read) TA_assert(!AO_compare_and_swap_acquire_read(&x, 14, 42)); TA_assert(x == 13); TA_assert(AO_compare_and_swap_acquire_read(&x, 13, 42)); TA_assert(x == 42); # else MISSING(AO_compare_and_swap); if (*(volatile AO_t *)&x == 13) x = 42; # endif # if defined(AO_HAVE_or_acquire_read) AO_or_acquire_read(&x, 66); TA_assert(x == 106); # else # if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write) MISSING(AO_or); # endif x |= 66; # endif # if defined(AO_HAVE_xor_acquire_read) AO_xor_acquire_read(&x, 181); TA_assert(x == 223); # else # if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write) MISSING(AO_xor); # endif x ^= 181; # endif # if defined(AO_HAVE_and_acquire_read) AO_and_acquire_read(&x, 57); TA_assert(x == 25); # else # if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write) MISSING(AO_and); # endif x &= 57; # endif # if defined(AO_HAVE_fetch_compare_and_swap_acquire_read) TA_assert(AO_fetch_compare_and_swap_acquire_read(&x, 14, 117) == 25); TA_assert(x == 25); TA_assert(AO_fetch_compare_and_swap_acquire_read(&x, 25, 117) == 25); # else MISSING(AO_fetch_compare_and_swap); if (x == 25) x = 117; # endif TA_assert(x == 117); # if defined(AO_HAVE_short_compare_and_swap_acquire_read) TA_assert(!AO_short_compare_and_swap_acquire_read(&s, 14, 42)); TA_assert(s == 13); TA_assert(AO_short_compare_and_swap_acquire_read(&s, 13, 42)); TA_assert(s == 42); # else MISSING(AO_short_compare_and_swap); if (*(volatile short *)&s == 13) s = 42; # endif # if defined(AO_HAVE_short_or_acquire_read) AO_short_or_acquire_read(&s, 66); TA_assert(s == 106); # else # if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \ || !defined(AO_HAVE_short_or_acquire_read) \ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \ || !defined(AO_HAVE_short_or_release) \ || !defined(AO_HAVE_short_or_release_write) \ || !defined(AO_HAVE_short_or_write) MISSING(AO_short_or); # endif s |= 66; # endif # if defined(AO_HAVE_short_xor_acquire_read) AO_short_xor_acquire_read(&s, 181); TA_assert(s == 223); # else # if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \ || !defined(AO_HAVE_short_xor_acquire_read) \ || !defined(AO_HAVE_short_xor_full) \ || !defined(AO_HAVE_short_xor_read) \ || !defined(AO_HAVE_short_xor_release) \ || !defined(AO_HAVE_short_xor_release_write) \ || !defined(AO_HAVE_short_xor_write) MISSING(AO_short_xor); # endif s ^= 181; # endif # if defined(AO_HAVE_short_and_acquire_read) AO_short_and_acquire_read(&s, 57); TA_assert(s == 25); # else # if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \ || !defined(AO_HAVE_short_and_acquire_read) \ || !defined(AO_HAVE_short_and_full) \ || !defined(AO_HAVE_short_and_read) \ || !defined(AO_HAVE_short_and_release) \ || !defined(AO_HAVE_short_and_release_write) \ || !defined(AO_HAVE_short_and_write) MISSING(AO_short_and); # endif s &= 57; # endif # if defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) TA_assert(AO_short_fetch_compare_and_swap_acquire_read(&s, 14, 117) == 25); TA_assert(s == 25); TA_assert(AO_short_fetch_compare_and_swap_acquire_read(&s, 25, 117) == 25); # else MISSING(AO_short_fetch_compare_and_swap); if (s == 25) s = 117; # endif TA_assert(s == 117); # if defined(AO_HAVE_char_compare_and_swap_acquire_read) TA_assert(!AO_char_compare_and_swap_acquire_read(&b, 14, 42)); TA_assert(b == 13); TA_assert(AO_char_compare_and_swap_acquire_read(&b, 13, 42)); TA_assert(b == 42); # else MISSING(AO_char_compare_and_swap); if (*(volatile char *)&b == 13) b = 42; # endif # if defined(AO_HAVE_char_or_acquire_read) AO_char_or_acquire_read(&b, 66); TA_assert(b == 106); # else # if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \ || !defined(AO_HAVE_char_or_acquire_read) \ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \ || !defined(AO_HAVE_char_or_release) \ || !defined(AO_HAVE_char_or_release_write) \ || !defined(AO_HAVE_char_or_write) MISSING(AO_char_or); # endif b |= 66; # endif # if defined(AO_HAVE_char_xor_acquire_read) AO_char_xor_acquire_read(&b, 181); TA_assert(b == 223); # else # if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \ || !defined(AO_HAVE_char_xor_acquire_read) \ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \ || !defined(AO_HAVE_char_xor_release) \ || !defined(AO_HAVE_char_xor_release_write) \ || !defined(AO_HAVE_char_xor_write) MISSING(AO_char_xor); # endif b ^= 181; # endif # if defined(AO_HAVE_char_and_acquire_read) AO_char_and_acquire_read(&b, 57); TA_assert(b == 25); # else # if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \ || !defined(AO_HAVE_char_and_acquire_read) \ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \ || !defined(AO_HAVE_char_and_release) \ || !defined(AO_HAVE_char_and_release_write) \ || !defined(AO_HAVE_char_and_write) MISSING(AO_char_and); # endif b &= 57; # endif # if defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) TA_assert(AO_char_fetch_compare_and_swap_acquire_read(&b, 14, 117) == 25); TA_assert(b == 25); TA_assert(AO_char_fetch_compare_and_swap_acquire_read(&b, 25, 117) == 25); # else MISSING(AO_char_fetch_compare_and_swap); if (b == 25) b = 117; # endif TA_assert(b == 117); # if defined(AO_HAVE_int_compare_and_swap_acquire_read) TA_assert(!AO_int_compare_and_swap_acquire_read(&zz, 14, 42)); TA_assert(zz == 13); TA_assert(AO_int_compare_and_swap_acquire_read(&zz, 13, 42)); TA_assert(zz == 42); # else MISSING(AO_int_compare_and_swap); if (*(volatile int *)&zz == 13) zz = 42; # endif # if defined(AO_HAVE_int_or_acquire_read) AO_int_or_acquire_read(&zz, 66); TA_assert(zz == 106); # else # if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \ || !defined(AO_HAVE_int_or_acquire_read) \ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \ || !defined(AO_HAVE_int_or_release) \ || !defined(AO_HAVE_int_or_release_write) \ || !defined(AO_HAVE_int_or_write) MISSING(AO_int_or); # endif zz |= 66; # endif # if defined(AO_HAVE_int_xor_acquire_read) AO_int_xor_acquire_read(&zz, 181); TA_assert(zz == 223); # else # if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \ || !defined(AO_HAVE_int_xor_acquire_read) \ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \ || !defined(AO_HAVE_int_xor_release) \ || !defined(AO_HAVE_int_xor_release_write) \ || !defined(AO_HAVE_int_xor_write) MISSING(AO_int_xor); # endif zz ^= 181; # endif # if defined(AO_HAVE_int_and_acquire_read) AO_int_and_acquire_read(&zz, 57); TA_assert(zz == 25); # else # if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \ || !defined(AO_HAVE_int_and_acquire_read) \ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \ || !defined(AO_HAVE_int_and_release) \ || !defined(AO_HAVE_int_and_release_write) \ || !defined(AO_HAVE_int_and_write) MISSING(AO_int_and); # endif zz &= 57; # endif # if defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) TA_assert(AO_int_fetch_compare_and_swap_acquire_read(&zz, 14, 117) == 25); TA_assert(zz == 25); TA_assert(AO_int_fetch_compare_and_swap_acquire_read(&zz, 25, 117) == 25); # else MISSING(AO_int_fetch_compare_and_swap); if (zz == 25) zz = 117; # endif TA_assert(zz == 117); # if defined(AO_HAVE_double_load_acquire_read) || defined(AO_HAVE_double_store_acquire_read) /* Initialize old_w even for store to workaround MSan warning. */ old_w.AO_val1 = 3316; old_w.AO_val2 = 2921; # endif # if defined(AO_HAVE_double_load_acquire_read) new_w = AO_double_load_acquire_read(&old_w); TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921); # elif !defined(AO_HAVE_double_load) \ || !defined(AO_HAVE_double_load_acquire) \ || !defined(AO_HAVE_double_load_acquire_read) \ || !defined(AO_HAVE_double_load_dd_acquire_read) \ || !defined(AO_HAVE_double_load_full) \ || !defined(AO_HAVE_double_load_read) MISSING(AO_double_load); # endif # if defined(AO_HAVE_double_store_acquire_read) new_w.AO_val1 = 1375; new_w.AO_val2 = 8243; AO_double_store_acquire_read(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); AO_double_store_acquire_read(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); new_w.AO_val1 ^= old_w.AO_val1; new_w.AO_val2 ^= old_w.AO_val2; AO_double_store_acquire_read(&old_w, new_w); TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0); # elif !defined(AO_HAVE_double_store) \ || !defined(AO_HAVE_double_store_full) \ || !defined(AO_HAVE_double_store_release) \ || !defined(AO_HAVE_double_store_release_write) \ || !defined(AO_HAVE_double_store_write) MISSING(AO_double_store); # endif # if defined(AO_HAVE_compare_double_and_swap_double_acquire_read) TA_assert(!AO_compare_double_and_swap_double_acquire_read(&w, 17, 42, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_double_and_swap_double_acquire_read(&w, 0, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_acquire_read(&w, 12, 14, 64, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_acquire_read(&w, 11, 13, 85, 82)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_acquire_read(&w, 13, 12, 17, 42)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_double_and_swap_double_acquire_read(&w, 12, 13, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_double_and_swap_double_acquire_read(&w, 17, 42, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_double_and_swap_double); # endif # if defined(AO_HAVE_compare_and_swap_double_acquire_read) TA_assert(!AO_compare_and_swap_double_acquire_read(&w, 17, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_and_swap_double_acquire_read(&w, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_acquire_read(&w, 13, 12, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_acquire_read(&w, 1213, 48, 86)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_and_swap_double_acquire_read(&w, 12, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_and_swap_double_acquire_read(&w, 17, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_and_swap_double); # endif # if defined(AO_HAVE_double_compare_and_swap_acquire_read) old_w.AO_val1 = 4116; old_w.AO_val2 = 2121; new_w.AO_val1 = 8537; new_w.AO_val2 = 6410; TA_assert(!AO_double_compare_and_swap_acquire_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_double_compare_and_swap_acquire_read(&w, w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = 29; new_w.AO_val1 = 820; new_w.AO_val2 = 5917; TA_assert(!AO_double_compare_and_swap_acquire_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = 11; old_w.AO_val2 = 6410; new_w.AO_val1 = 3552; new_w.AO_val2 = 1746; TA_assert(!AO_double_compare_and_swap_acquire_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 8537; new_w.AO_val1 = 4116; new_w.AO_val2 = 2121; TA_assert(!AO_double_compare_and_swap_acquire_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 6410; new_w.AO_val1 = 1; TA_assert(AO_double_compare_and_swap_acquire_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = w.AO_val2; new_w.AO_val1--; new_w.AO_val2 = 0; TA_assert(AO_double_compare_and_swap_acquire_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_double_compare_and_swap); # endif } /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Some basic sanity tests. These do not test the barrier semantics. */ #undef TA_assert #define TA_assert(e) \ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _dd_acquire_read)\n", \ __FILE__, __LINE__), exit(1); } #undef MISSING #define MISSING(name) \ printf("Missing: %s\n", #name "_dd_acquire_read") #if defined(CPPCHECK) void list_atomic_dd_acquire_read(void); void char_list_atomic_dd_acquire_read(void); void short_list_atomic_dd_acquire_read(void); void int_list_atomic_dd_acquire_read(void); void double_list_atomic_dd_acquire_read(void); #endif void test_atomic_dd_acquire_read(void) { AO_t x; unsigned char b; unsigned short s; unsigned int zz; # if defined(AO_HAVE_test_and_set_dd_acquire_read) AO_TS_t z = AO_TS_INITIALIZER; # endif # if defined(AO_HAVE_double_compare_and_swap_dd_acquire_read) \ || defined(AO_HAVE_double_load_dd_acquire_read) \ || defined(AO_HAVE_double_store_dd_acquire_read) static AO_double_t old_w; /* static to avoid misalignment */ AO_double_t new_w; # endif # if defined(AO_HAVE_compare_and_swap_double_dd_acquire_read) \ || defined(AO_HAVE_compare_double_and_swap_double_dd_acquire_read) \ || defined(AO_HAVE_double_compare_and_swap_dd_acquire_read) static AO_double_t w; /* static to avoid misalignment */ w.AO_val1 = 0; w.AO_val2 = 0; # endif # if defined(CPPCHECK) list_atomic_dd_acquire_read(); char_list_atomic_dd_acquire_read(); short_list_atomic_dd_acquire_read(); int_list_atomic_dd_acquire_read(); double_list_atomic_dd_acquire_read(); # endif # if defined(AO_HAVE_nop_dd_acquire_read) AO_nop_dd_acquire_read(); # elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write) MISSING(AO_nop); # endif # if defined(AO_HAVE_store_dd_acquire_read) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */ # endif AO_store_dd_acquire_read(&x, 13); TA_assert(x == 13); # else # if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \ || !defined(AO_HAVE_store_release) \ || !defined(AO_HAVE_store_release_write) \ || !defined(AO_HAVE_store_write) MISSING(AO_store); # endif x = 13; # endif # if defined(AO_HAVE_load_dd_acquire_read) TA_assert(AO_load_dd_acquire_read(&x) == 13); # elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \ || !defined(AO_HAVE_load_acquire_read) \ || !defined(AO_HAVE_load_dd_acquire_read) \ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read) MISSING(AO_load); # endif # if defined(AO_HAVE_test_and_set_dd_acquire_read) TA_assert(AO_test_and_set_dd_acquire_read(&z) == AO_TS_CLEAR); TA_assert(AO_test_and_set_dd_acquire_read(&z) == AO_TS_SET); TA_assert(AO_test_and_set_dd_acquire_read(&z) == AO_TS_SET); AO_CLEAR(&z); # else MISSING(AO_test_and_set); # endif # if defined(AO_HAVE_fetch_and_add_dd_acquire_read) TA_assert(AO_fetch_and_add_dd_acquire_read(&x, 42) == 13); TA_assert(AO_fetch_and_add_dd_acquire_read(&x, (AO_t)(-42)) == 55); # else MISSING(AO_fetch_and_add); # endif # if defined(AO_HAVE_fetch_and_add1_dd_acquire_read) TA_assert(AO_fetch_and_add1_dd_acquire_read(&x) == 13); # else MISSING(AO_fetch_and_add1); ++x; # endif # if defined(AO_HAVE_fetch_and_sub1_dd_acquire_read) TA_assert(AO_fetch_and_sub1_dd_acquire_read(&x) == 14); # else MISSING(AO_fetch_and_sub1); --x; # endif # if defined(AO_HAVE_short_store_dd_acquire_read) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile short *)&s = 0; # endif AO_short_store_dd_acquire_read(&s, 13); # else # if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \ || !defined(AO_HAVE_short_store_release) \ || !defined(AO_HAVE_short_store_release_write) \ || !defined(AO_HAVE_short_store_write) MISSING(AO_short_store); # endif s = 13; # endif # if defined(AO_HAVE_short_load_dd_acquire_read) TA_assert(AO_short_load(&s) == 13); # elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \ || !defined(AO_HAVE_short_load_acquire_read) \ || !defined(AO_HAVE_short_load_dd_acquire_read) \ || !defined(AO_HAVE_short_load_full) \ || !defined(AO_HAVE_short_load_read) MISSING(AO_short_load); # endif # if defined(AO_HAVE_short_fetch_and_add_dd_acquire_read) TA_assert(AO_short_fetch_and_add_dd_acquire_read(&s, 42) == 13); TA_assert(AO_short_fetch_and_add_dd_acquire_read(&s, (unsigned short)-42) == 55); # else MISSING(AO_short_fetch_and_add); # endif # if defined(AO_HAVE_short_fetch_and_add1_dd_acquire_read) TA_assert(AO_short_fetch_and_add1_dd_acquire_read(&s) == 13); # else MISSING(AO_short_fetch_and_add1); ++s; # endif # if defined(AO_HAVE_short_fetch_and_sub1_dd_acquire_read) TA_assert(AO_short_fetch_and_sub1_dd_acquire_read(&s) == 14); # else MISSING(AO_short_fetch_and_sub1); --s; # endif TA_assert(*(volatile short *)&s == 13); # if defined(AO_HAVE_char_store_dd_acquire_read) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile char *)&b = 0; # endif AO_char_store_dd_acquire_read(&b, 13); # else # if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \ || !defined(AO_HAVE_char_store_release) \ || !defined(AO_HAVE_char_store_release_write) \ || !defined(AO_HAVE_char_store_write) MISSING(AO_char_store); # endif b = 13; # endif # if defined(AO_HAVE_char_load_dd_acquire_read) TA_assert(AO_char_load(&b) == 13); # elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \ || !defined(AO_HAVE_char_load_acquire_read) \ || !defined(AO_HAVE_char_load_dd_acquire_read) \ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read) MISSING(AO_char_load); # endif # if defined(AO_HAVE_char_fetch_and_add_dd_acquire_read) TA_assert(AO_char_fetch_and_add_dd_acquire_read(&b, 42) == 13); TA_assert(AO_char_fetch_and_add_dd_acquire_read(&b, (unsigned char)-42) == 55); # else MISSING(AO_char_fetch_and_add); # endif # if defined(AO_HAVE_char_fetch_and_add1_dd_acquire_read) TA_assert(AO_char_fetch_and_add1_dd_acquire_read(&b) == 13); # else MISSING(AO_char_fetch_and_add1); ++b; # endif # if defined(AO_HAVE_char_fetch_and_sub1_dd_acquire_read) TA_assert(AO_char_fetch_and_sub1_dd_acquire_read(&b) == 14); # else MISSING(AO_char_fetch_and_sub1); --b; # endif TA_assert(*(volatile char *)&b == 13); # if defined(AO_HAVE_int_store_dd_acquire_read) # if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \ && defined(AO_PREFER_GENERALIZED) *(volatile int *)&zz = 0; # endif AO_int_store_dd_acquire_read(&zz, 13); # else # if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \ || !defined(AO_HAVE_int_store_release) \ || !defined(AO_HAVE_int_store_release_write) \ || !defined(AO_HAVE_int_store_write) MISSING(AO_int_store); # endif zz = 13; # endif # if defined(AO_HAVE_int_load_dd_acquire_read) TA_assert(AO_int_load(&zz) == 13); # elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \ || !defined(AO_HAVE_int_load_acquire_read) \ || !defined(AO_HAVE_int_load_dd_acquire_read) \ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read) MISSING(AO_int_load); # endif # if defined(AO_HAVE_int_fetch_and_add_dd_acquire_read) TA_assert(AO_int_fetch_and_add_dd_acquire_read(&zz, 42) == 13); TA_assert(AO_int_fetch_and_add_dd_acquire_read(&zz, (unsigned int)-42) == 55); # else MISSING(AO_int_fetch_and_add); # endif # if defined(AO_HAVE_int_fetch_and_add1_dd_acquire_read) TA_assert(AO_int_fetch_and_add1_dd_acquire_read(&zz) == 13); # else MISSING(AO_int_fetch_and_add1); ++zz; # endif # if defined(AO_HAVE_int_fetch_and_sub1_dd_acquire_read) TA_assert(AO_int_fetch_and_sub1_dd_acquire_read(&zz) == 14); # else MISSING(AO_int_fetch_and_sub1); --zz; # endif TA_assert(*(volatile int *)&zz == 13); # if defined(AO_HAVE_compare_and_swap_dd_acquire_read) TA_assert(!AO_compare_and_swap_dd_acquire_read(&x, 14, 42)); TA_assert(x == 13); TA_assert(AO_compare_and_swap_dd_acquire_read(&x, 13, 42)); TA_assert(x == 42); # else MISSING(AO_compare_and_swap); if (*(volatile AO_t *)&x == 13) x = 42; # endif # if defined(AO_HAVE_or_dd_acquire_read) AO_or_dd_acquire_read(&x, 66); TA_assert(x == 106); # else # if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write) MISSING(AO_or); # endif x |= 66; # endif # if defined(AO_HAVE_xor_dd_acquire_read) AO_xor_dd_acquire_read(&x, 181); TA_assert(x == 223); # else # if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write) MISSING(AO_xor); # endif x ^= 181; # endif # if defined(AO_HAVE_and_dd_acquire_read) AO_and_dd_acquire_read(&x, 57); TA_assert(x == 25); # else # if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write) MISSING(AO_and); # endif x &= 57; # endif # if defined(AO_HAVE_fetch_compare_and_swap_dd_acquire_read) TA_assert(AO_fetch_compare_and_swap_dd_acquire_read(&x, 14, 117) == 25); TA_assert(x == 25); TA_assert(AO_fetch_compare_and_swap_dd_acquire_read(&x, 25, 117) == 25); # else MISSING(AO_fetch_compare_and_swap); if (x == 25) x = 117; # endif TA_assert(x == 117); # if defined(AO_HAVE_short_compare_and_swap_dd_acquire_read) TA_assert(!AO_short_compare_and_swap_dd_acquire_read(&s, 14, 42)); TA_assert(s == 13); TA_assert(AO_short_compare_and_swap_dd_acquire_read(&s, 13, 42)); TA_assert(s == 42); # else MISSING(AO_short_compare_and_swap); if (*(volatile short *)&s == 13) s = 42; # endif # if defined(AO_HAVE_short_or_dd_acquire_read) AO_short_or_dd_acquire_read(&s, 66); TA_assert(s == 106); # else # if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \ || !defined(AO_HAVE_short_or_acquire_read) \ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \ || !defined(AO_HAVE_short_or_release) \ || !defined(AO_HAVE_short_or_release_write) \ || !defined(AO_HAVE_short_or_write) MISSING(AO_short_or); # endif s |= 66; # endif # if defined(AO_HAVE_short_xor_dd_acquire_read) AO_short_xor_dd_acquire_read(&s, 181); TA_assert(s == 223); # else # if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \ || !defined(AO_HAVE_short_xor_acquire_read) \ || !defined(AO_HAVE_short_xor_full) \ || !defined(AO_HAVE_short_xor_read) \ || !defined(AO_HAVE_short_xor_release) \ || !defined(AO_HAVE_short_xor_release_write) \ || !defined(AO_HAVE_short_xor_write) MISSING(AO_short_xor); # endif s ^= 181; # endif # if defined(AO_HAVE_short_and_dd_acquire_read) AO_short_and_dd_acquire_read(&s, 57); TA_assert(s == 25); # else # if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \ || !defined(AO_HAVE_short_and_acquire_read) \ || !defined(AO_HAVE_short_and_full) \ || !defined(AO_HAVE_short_and_read) \ || !defined(AO_HAVE_short_and_release) \ || !defined(AO_HAVE_short_and_release_write) \ || !defined(AO_HAVE_short_and_write) MISSING(AO_short_and); # endif s &= 57; # endif # if defined(AO_HAVE_short_fetch_compare_and_swap_dd_acquire_read) TA_assert(AO_short_fetch_compare_and_swap_dd_acquire_read(&s, 14, 117) == 25); TA_assert(s == 25); TA_assert(AO_short_fetch_compare_and_swap_dd_acquire_read(&s, 25, 117) == 25); # else MISSING(AO_short_fetch_compare_and_swap); if (s == 25) s = 117; # endif TA_assert(s == 117); # if defined(AO_HAVE_char_compare_and_swap_dd_acquire_read) TA_assert(!AO_char_compare_and_swap_dd_acquire_read(&b, 14, 42)); TA_assert(b == 13); TA_assert(AO_char_compare_and_swap_dd_acquire_read(&b, 13, 42)); TA_assert(b == 42); # else MISSING(AO_char_compare_and_swap); if (*(volatile char *)&b == 13) b = 42; # endif # if defined(AO_HAVE_char_or_dd_acquire_read) AO_char_or_dd_acquire_read(&b, 66); TA_assert(b == 106); # else # if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \ || !defined(AO_HAVE_char_or_acquire_read) \ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \ || !defined(AO_HAVE_char_or_release) \ || !defined(AO_HAVE_char_or_release_write) \ || !defined(AO_HAVE_char_or_write) MISSING(AO_char_or); # endif b |= 66; # endif # if defined(AO_HAVE_char_xor_dd_acquire_read) AO_char_xor_dd_acquire_read(&b, 181); TA_assert(b == 223); # else # if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \ || !defined(AO_HAVE_char_xor_acquire_read) \ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \ || !defined(AO_HAVE_char_xor_release) \ || !defined(AO_HAVE_char_xor_release_write) \ || !defined(AO_HAVE_char_xor_write) MISSING(AO_char_xor); # endif b ^= 181; # endif # if defined(AO_HAVE_char_and_dd_acquire_read) AO_char_and_dd_acquire_read(&b, 57); TA_assert(b == 25); # else # if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \ || !defined(AO_HAVE_char_and_acquire_read) \ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \ || !defined(AO_HAVE_char_and_release) \ || !defined(AO_HAVE_char_and_release_write) \ || !defined(AO_HAVE_char_and_write) MISSING(AO_char_and); # endif b &= 57; # endif # if defined(AO_HAVE_char_fetch_compare_and_swap_dd_acquire_read) TA_assert(AO_char_fetch_compare_and_swap_dd_acquire_read(&b, 14, 117) == 25); TA_assert(b == 25); TA_assert(AO_char_fetch_compare_and_swap_dd_acquire_read(&b, 25, 117) == 25); # else MISSING(AO_char_fetch_compare_and_swap); if (b == 25) b = 117; # endif TA_assert(b == 117); # if defined(AO_HAVE_int_compare_and_swap_dd_acquire_read) TA_assert(!AO_int_compare_and_swap_dd_acquire_read(&zz, 14, 42)); TA_assert(zz == 13); TA_assert(AO_int_compare_and_swap_dd_acquire_read(&zz, 13, 42)); TA_assert(zz == 42); # else MISSING(AO_int_compare_and_swap); if (*(volatile int *)&zz == 13) zz = 42; # endif # if defined(AO_HAVE_int_or_dd_acquire_read) AO_int_or_dd_acquire_read(&zz, 66); TA_assert(zz == 106); # else # if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \ || !defined(AO_HAVE_int_or_acquire_read) \ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \ || !defined(AO_HAVE_int_or_release) \ || !defined(AO_HAVE_int_or_release_write) \ || !defined(AO_HAVE_int_or_write) MISSING(AO_int_or); # endif zz |= 66; # endif # if defined(AO_HAVE_int_xor_dd_acquire_read) AO_int_xor_dd_acquire_read(&zz, 181); TA_assert(zz == 223); # else # if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \ || !defined(AO_HAVE_int_xor_acquire_read) \ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \ || !defined(AO_HAVE_int_xor_release) \ || !defined(AO_HAVE_int_xor_release_write) \ || !defined(AO_HAVE_int_xor_write) MISSING(AO_int_xor); # endif zz ^= 181; # endif # if defined(AO_HAVE_int_and_dd_acquire_read) AO_int_and_dd_acquire_read(&zz, 57); TA_assert(zz == 25); # else # if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \ || !defined(AO_HAVE_int_and_acquire_read) \ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \ || !defined(AO_HAVE_int_and_release) \ || !defined(AO_HAVE_int_and_release_write) \ || !defined(AO_HAVE_int_and_write) MISSING(AO_int_and); # endif zz &= 57; # endif # if defined(AO_HAVE_int_fetch_compare_and_swap_dd_acquire_read) TA_assert(AO_int_fetch_compare_and_swap_dd_acquire_read(&zz, 14, 117) == 25); TA_assert(zz == 25); TA_assert(AO_int_fetch_compare_and_swap_dd_acquire_read(&zz, 25, 117) == 25); # else MISSING(AO_int_fetch_compare_and_swap); if (zz == 25) zz = 117; # endif TA_assert(zz == 117); # if defined(AO_HAVE_double_load_dd_acquire_read) || defined(AO_HAVE_double_store_dd_acquire_read) /* Initialize old_w even for store to workaround MSan warning. */ old_w.AO_val1 = 3316; old_w.AO_val2 = 2921; # endif # if defined(AO_HAVE_double_load_dd_acquire_read) new_w = AO_double_load_dd_acquire_read(&old_w); TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921); # elif !defined(AO_HAVE_double_load) \ || !defined(AO_HAVE_double_load_acquire) \ || !defined(AO_HAVE_double_load_acquire_read) \ || !defined(AO_HAVE_double_load_dd_acquire_read) \ || !defined(AO_HAVE_double_load_full) \ || !defined(AO_HAVE_double_load_read) MISSING(AO_double_load); # endif # if defined(AO_HAVE_double_store_dd_acquire_read) new_w.AO_val1 = 1375; new_w.AO_val2 = 8243; AO_double_store_dd_acquire_read(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); AO_double_store_dd_acquire_read(&old_w, new_w); TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243); new_w.AO_val1 ^= old_w.AO_val1; new_w.AO_val2 ^= old_w.AO_val2; AO_double_store_dd_acquire_read(&old_w, new_w); TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0); # elif !defined(AO_HAVE_double_store) \ || !defined(AO_HAVE_double_store_full) \ || !defined(AO_HAVE_double_store_release) \ || !defined(AO_HAVE_double_store_release_write) \ || !defined(AO_HAVE_double_store_write) MISSING(AO_double_store); # endif # if defined(AO_HAVE_compare_double_and_swap_double_dd_acquire_read) TA_assert(!AO_compare_double_and_swap_double_dd_acquire_read(&w, 17, 42, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_double_and_swap_double_dd_acquire_read(&w, 0, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_dd_acquire_read(&w, 12, 14, 64, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_dd_acquire_read(&w, 11, 13, 85, 82)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_double_and_swap_double_dd_acquire_read(&w, 13, 12, 17, 42)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_double_and_swap_double_dd_acquire_read(&w, 12, 13, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_double_and_swap_double_dd_acquire_read(&w, 17, 42, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_double_and_swap_double); # endif # if defined(AO_HAVE_compare_and_swap_double_dd_acquire_read) TA_assert(!AO_compare_and_swap_double_dd_acquire_read(&w, 17, 12, 13)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_compare_and_swap_double_dd_acquire_read(&w, 0, 12, 13)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_dd_acquire_read(&w, 13, 12, 33)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(!AO_compare_and_swap_double_dd_acquire_read(&w, 1213, 48, 86)); TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13); TA_assert(AO_compare_and_swap_double_dd_acquire_read(&w, 12, 17, 42)); TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42); TA_assert(AO_compare_and_swap_double_dd_acquire_read(&w, 17, 0, 0)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_compare_and_swap_double); # endif # if defined(AO_HAVE_double_compare_and_swap_dd_acquire_read) old_w.AO_val1 = 4116; old_w.AO_val2 = 2121; new_w.AO_val1 = 8537; new_w.AO_val2 = 6410; TA_assert(!AO_double_compare_and_swap_dd_acquire_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); TA_assert(AO_double_compare_and_swap_dd_acquire_read(&w, w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = 29; new_w.AO_val1 = 820; new_w.AO_val2 = 5917; TA_assert(!AO_double_compare_and_swap_dd_acquire_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = 11; old_w.AO_val2 = 6410; new_w.AO_val1 = 3552; new_w.AO_val2 = 1746; TA_assert(!AO_double_compare_and_swap_dd_acquire_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 8537; new_w.AO_val1 = 4116; new_w.AO_val2 = 2121; TA_assert(!AO_double_compare_and_swap_dd_acquire_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410); old_w.AO_val1 = old_w.AO_val2; old_w.AO_val2 = 6410; new_w.AO_val1 = 1; TA_assert(AO_double_compare_and_swap_dd_acquire_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121); old_w.AO_val1 = new_w.AO_val1; old_w.AO_val2 = w.AO_val2; new_w.AO_val1--; new_w.AO_val2 = 0; TA_assert(AO_double_compare_and_swap_dd_acquire_read(&w, old_w, new_w)); TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0); # else MISSING(AO_double_compare_and_swap); # endif } asymptote-3.05/libatomic_ops/tests/run_parallel.h0000644000000000000000000001247415031566105021015 0ustar rootroot/* * Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #if defined(_MSC_VER) || \ defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__) || \ defined(_WIN32_WINCE) # define USE_WINTHREADS #elif defined(__vxworks) # define USE_VXTHREADS #else # define USE_PTHREADS #endif #include #include #ifdef USE_PTHREADS # include #endif #ifdef USE_VXTHREADS # include # include #endif #ifdef USE_WINTHREADS # include #endif #include "atomic_ops.h" #if !defined(AO_ATOMIC_OPS_H) && !defined(CPPCHECK) # error Wrong atomic_ops.h included. #endif #if (defined(_WIN32_WCE) || defined(__MINGW32CE__)) && !defined(AO_HAVE_abort) # define abort() _exit(-1) /* there is no abort() in WinCE */ #endif #ifndef AO_PTRDIFF_T # define AO_PTRDIFF_T ptrdiff_t #endif #ifndef MAX_NTHREADS # define MAX_NTHREADS 100 #endif typedef void * (* thr_func)(void *); typedef int (* test_func)(void); /* Returns != 0 on success */ void * run_parallel(int nthreads, thr_func f1, test_func t, const char *name); #ifdef USE_PTHREADS void * run_parallel(int nthreads, thr_func f1, test_func t, const char *name) { pthread_attr_t attr; pthread_t thr[MAX_NTHREADS]; int i; printf("Testing %s\n", name); if (nthreads > MAX_NTHREADS) { fprintf(stderr, "run_parallel: requested too many threads\n"); abort(); } # ifdef _HPUX_SOURCE /* Default stack size is too small, especially with the 64 bit ABI */ /* Increase it. */ if (pthread_default_stacksize_np(1024*1024, 0) != 0) { fprintf(stderr, "pthread_default_stacksize_np failed. " "OK after first call.\n"); } # endif pthread_attr_init(&attr); for (i = 0; i < nthreads; ++i) { int code = pthread_create(thr + i, &attr, f1, (void *)(long)i); if (code != 0) { fprintf(stderr, "pthread_create returned %d, thread %d\n", code, i); abort(); } } for (i = 0; i < nthreads; ++i) { int code = pthread_join(thr[i], NULL); if (code != 0) { fprintf(stderr, "pthread_join returned %d, thread %d\n", code, i); abort(); } } if (t()) { printf("Succeeded\n"); } else { fprintf(stderr, "Failed\n"); abort(); } return 0; } #endif /* USE_PTHREADS */ #ifdef USE_VXTHREADS void * run_parallel(int nthreads, thr_func f1, test_func t, const char *name) { int thr[MAX_NTHREADS]; int i; printf("Testing %s\n", name); if (nthreads > MAX_NTHREADS) { fprintf(stderr, "run_parallel: requested too many threads\n"); taskSuspend(0); } for (i = 0; i < nthreads; ++i) { thr[i] = taskSpawn((char*) name, 180, 0, 32768, (FUNCPTR) f1, i, 1, 2, 3, 4, 5, 6, 7, 8, 9); if (thr[i] == ERROR) { fprintf(stderr, "taskSpawn failed with %d, thread %d\n", errno, i); taskSuspend(0); } } for (i = 0; i < nthreads; ++i) { while (taskIdVerify(thr[i]) == OK) taskDelay(60); } if (t()) { printf("Succeeded\n"); } else { fprintf(stderr, "Failed\n"); taskSuspend(0); } return 0; } #endif /* USE_VXTHREADS */ #ifdef USE_WINTHREADS struct tramp_args { thr_func fn; long arg; }; DWORD WINAPI tramp(LPVOID param) { struct tramp_args *args = (struct tramp_args *)param; return (DWORD)(AO_PTRDIFF_T)(*args->fn)((LPVOID)(AO_PTRDIFF_T)args->arg); } void * run_parallel(int nthreads, thr_func f1, test_func t, const char *name) { HANDLE thr[MAX_NTHREADS]; struct tramp_args args[MAX_NTHREADS]; int i; printf("Testing %s\n", name); if (nthreads > MAX_NTHREADS) { fprintf(stderr, "run_parallel: requested too many threads\n"); abort(); } for (i = 0; i < nthreads; ++i) { args[i].fn = f1; args[i].arg = i; if ((thr[i] = CreateThread(NULL, 0, tramp, (LPVOID)(args+i), 0, NULL)) == NULL) { fprintf(stderr, "CreateThread failed with %lu, thread %d\n", (unsigned long)GetLastError(), i); abort(); } } for (i = 0; i < nthreads; ++i) { DWORD code = WaitForSingleObject(thr[i], INFINITE); if (code != WAIT_OBJECT_0) { fprintf(stderr, "WaitForSingleObject returned %lu, thread %d\n", (unsigned long)code, i); abort(); } } if (t()) { printf("Succeeded\n"); } else { fprintf(stderr, "Failed\n"); abort(); } return 0; } #endif /* USE_WINTHREADS */ asymptote-3.05/libatomic_ops/tests/Makefile.am0000644000000000000000000001514315031566105020214 0ustar rootrootEXTRA_DIST=test_atomic_include.template list_atomic.template run_parallel.h \ test_atomic_include.h list_atomic.c # We distribute test_atomic_include.h and list_atomic.c, since it is hard # to regenerate them on Windows without sed. BUILT_SOURCES = test_atomic_include.h list_atomic.i list_atomic.o CLEANFILES = list_atomic.i list_atomic.o AM_CPPFLAGS = \ -I$(top_builddir)/src -I$(top_srcdir)/src \ -I$(top_builddir)/tests -I$(top_srcdir)/tests CFLAGS += $(CFLAGS_EXTRA) TESTS = test_atomic$(EXEEXT) test_atomic_generalized$(EXEEXT) TEST_OBJS = test_atomic.o test_atomic_generalized-test_atomic.o check_PROGRAMS = test_atomic test_atomic_generalized if HAVE_PTHREAD_H TESTS += test_atomic_pthreads$(EXEEXT) TEST_OBJS += test_atomic_pthreads-test_atomic.o check_PROGRAMS += test_atomic_pthreads test_atomic_pthreads_SOURCES=$(test_atomic_SOURCES) test_atomic_pthreads_CPPFLAGS=-DAO_USE_PTHREAD_DEFS $(AM_CPPFLAGS) test_atomic_pthreads_LDADD=$(test_atomic_LDADD) endif test_atomic_SOURCES=test_atomic.c test_atomic_LDADD = $(THREADDLLIBS) $(top_builddir)/src/libatomic_ops.la test_atomic_generalized_SOURCES=$(test_atomic_SOURCES) test_atomic_generalized_CPPFLAGS= \ -DAO_PREFER_GENERALIZED -DAO_TEST_EMULATION $(AM_CPPFLAGS) test_atomic_generalized_LDADD=$(test_atomic_LDADD) if ENABLE_GPL TESTS += test_malloc$(EXEEXT) test_stack$(EXEEXT) TEST_OBJS += test_malloc.o test_stack.o check_PROGRAMS += test_malloc test_stack test_stack_SOURCES=test_stack.c test_stack_LDADD = $(THREADDLLIBS) \ $(top_builddir)/src/libatomic_ops_gpl.la test_malloc_SOURCES=test_malloc.c test_malloc_LDADD = $(THREADDLLIBS) \ $(top_builddir)/src/libatomic_ops_gpl.la ## In case of static libraries build, libatomic_ops.a is already referenced ## in dependency_libs attribute of libatomic_ops_gpl.la file. if ENABLE_SHARED test_malloc_LDADD += $(top_builddir)/src/libatomic_ops.la test_stack_LDADD += $(top_builddir)/src/libatomic_ops.la endif check-gpl-without-test-driver: test_malloc$(EXEEXT) test_stack$(EXEEXT) ./test_stack$(EXEEXT) ./test_malloc$(EXEEXT) else # Nothing to do. check-gpl-without-test-driver: endif .PHONY: check-gpl-without-test-driver # Run the tests directly (without test-driver): .PHONY: check-without-test-driver check-without-test-driver: $(TESTS) check-gpl-without-test-driver @echo "The following will print some 'Missing ...' messages" ./test_atomic$(EXEEXT) ./test_atomic_generalized$(EXEEXT) test ! -f test_atomic_pthreads$(EXEEXT) || ./test_atomic_pthreads$(EXEEXT) test_atomic_include.h: test_atomic_include.template mkdir -p `dirname $@` sed -e s:XX::g $? > $@ sed -e s:XX:_release:g $? >> $@ sed -e s:XX:_acquire:g $? >> $@ sed -e s:XX:_read:g $? >> $@ sed -e s:XX:_write:g $? >> $@ sed -e s:XX:_full:g $? >> $@ sed -e s:XX:_release_write:g $? >> $@ sed -e s:XX:_acquire_read:g $? >> $@ sed -e s:XX:_dd_acquire_read:g $? >> $@ list_atomic.c: list_atomic.template mkdir -p `dirname $@` echo "#include \"atomic_ops.h\"" > $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX::g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_release:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_acquire:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_read:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_write:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_full:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_release_write:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_acquire_read:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_dd_acquire_read:g $? >> $@ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX::g $? >> $@ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_release:g $? >> $@ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_acquire:g $? >> $@ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_read:g $? >> $@ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_write:g $? >> $@ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_full:g $? >> $@ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_release_write:g $? >> $@ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_acquire_read:g $? >> $@ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_dd_acquire_read:g $? >> $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX::g $? >> $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_release:g $? >> $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_acquire:g $? >> $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_read:g $? >> $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_write:g $? >> $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_full:g $? >> $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_release_write:g $? >> $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_acquire_read:g $? >> $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_dd_acquire_read:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX::g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_release:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_acquire:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_read:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_write:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_full:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_release_write:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_acquire_read:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_dd_acquire_read:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX::g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_release:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_acquire:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_read:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_write:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_full:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_release_write:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_acquire_read:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_dd_acquire_read:g $? >> $@ list_atomic.i: list_atomic.c mkdir -p `dirname $@` $(COMPILE) $? -E > $@ # Verify list_atomic.c syntax: list_atomic.o: list_atomic.c $(COMPILE) -c -o $@ $? # Just compile all tests (without linking and execution): check-nolink-local: $(TEST_OBJS) asymptote-3.05/libatomic_ops/README_details.txt0000644000000000000000000003062615031566105020224 0ustar rootrootUsage: 0) If possible, do this on a multiprocessor, especially if you are planning on modifying or enhancing the package. It will work on a uniprocessor, but the tests are much more likely to pass in the presence of serious problems. 1) Type ./configure --prefix=; make; make check in the directory containing unpacked source. The usual GNU build machinery is used, except that only static, but position-independent, libraries are normally built. On Windows, follow README_win32.txt to use src/Makefile.msft instead of the above sequence. Alternatively, the libraries could be built with CMake, even for Windows, like this: > mkdir out > cd out > cmake -Dbuild_tests=ON .. > cmake --build . --config Release > ctest --build-config Release The available options in the CMake script to customize the build is roughly the same as those in the configure one, please see the exact option list in CMakeLists.txt file. 2) Applications should include atomic_ops.h. Nearly all operations are implemented by header files included from it. It is sometimes necessary, and always recommended to also link against libatomic_ops.a. To use the almost non-blocking stack or malloc implementations, see the corresponding README files, and also link against libatomic_ops_gpl.a before linking against libatomic_ops.a. OVERVIEW: Atomic_ops.h defines a large collection of operations, each one of which is a combination of an (optional) atomic memory operation, and a memory barrier. Also defines associated feature-test macros to determine whether a particular operation is available on the current target hardware (either directly or by synthesis). This is an attempt to replace various existing files with similar goals, since they usually do not handle differences in memory barrier styles with sufficient generality. If this is included after defining AO_REQUIRE_CAS, then the package makes an attempt to emulate [fetch_]compare_and_swap* (single-width) in a way that, at least on Linux, should still be async-signal-safe. As a result, most other atomic operations may then be defined using the compare-and-swap emulation. This emulation is slow, since it needs to disable signals. And it needs to block in case of contention. If you care about performance on a platform that can't directly provide compare-and-swap, there are probably better alternatives. But this allows easy ports to some such platforms (e.g. PA_RISC). The option is ignored if compare-and-swap can be implemented directly. If atomic_ops.h is included after defining AO_USE_PTHREAD_DEFS, then all atomic operations will be emulated with pthread locking. This is NOT async-signal-safe. And it is slow. It is intended primarily for debugging of the atomic_ops package itself. Note that the implementation reflects our understanding of real processor behavior. This occasionally diverges from the documented behavior. (E.g. the documented X86 behavior seems to be weak enough that it is impractical to use. Current real implementations appear to be much better behaved.) We of course are in no position to guarantee that future processors (even HPs) will continue to behave this way, though we hope they will. Corrections/additions for other platforms are greatly appreciated. OPERATIONS: Most operations handle values of type AO_t, which are unsigned integers whose size matches that of pointers on the given architecture. Additionally, on most supported architectures the operations are also implemented to handle smaller integers types; such operations are indicated by the appropriate size prefix: - char_... Operates on unsigned char values; - short_... Operates on unsigned short values; - int_... Operates on unsigned int values. The notable exception is AO_test_and_set operating only on AO_TS_t, which is whatever size the hardware supports with good performance. In some cases this is the length of a cache line, in some other cases it is a byte. In many cases AO_TS_t is equivalent to AO_t. The defined operations are all of the form AO_[](). The component specifies an atomic memory operation. It may be one of the following, where the corresponding argument and result types are also specified: void nop() No atomic operation. The barrier may still be useful. AO_t load(const volatile AO_t * addr) Atomic load of *addr. void store(volatile AO_t * addr, AO_t new_val) Atomically store new_val to *addr. AO_t fetch_and_add(volatile AO_t *addr, AO_t incr) Atomically add incr to *addr, and return the original value of *addr. AO_t fetch_and_add1(volatile AO_t *addr) Equivalent to AO_fetch_and_add(addr, 1). AO_t fetch_and_sub1(volatile AO_t *addr) Equivalent to AO_fetch_and_add(addr, (AO_t)(-1)). void and(volatile AO_t *addr, AO_t value) Atomically 'and' value into *addr. void or(volatile AO_t *addr, AO_t value) Atomically 'or' value into *addr. void xor(volatile AO_t *addr, AO_t value) Atomically 'xor' value into *addr. int compare_and_swap(volatile AO_t * addr, AO_t old_val, AO_t new_val) Atomically compare *addr to old_val, and replace *addr by new_val if the first comparison succeeds; returns nonzero if the comparison succeeded and *addr was updated; cannot fail spuriously. AO_t fetch_compare_and_swap(volatile AO_t * addr, AO_t old_val, AO_t new_val) Atomically compare *addr to old_val, and replace *addr by new_val if the first comparison succeeds; returns the original value of *addr; cannot fail spuriously. AO_TS_VAL_t test_and_set(volatile AO_TS_t * addr) Atomically read the binary value at *addr, and set it. AO_TS_VAL_t is an enumeration type which includes two values AO_TS_SET and AO_TS_CLEAR. An AO_TS_t location is capable of holding an AO_TS_VAL_t, but may be much larger, as dictated by hardware constraints. Test_and_set logically sets the value to AO_TS_SET. It may be reset to AO_TS_CLEAR with the AO_CLEAR(AO_TS_t *) macro. AO_TS_t locations should be initialized to AO_TS_INITIALIZER. The values of AO_TS_SET and AO_TS_CLEAR are hardware dependent. (On PA-RISC, AO_TS_SET is zero!) Test_and_set is a more limited version of compare_and_swap. Its only advantage is that it is more easily implementable on some hardware. It should thus be used if only binary test-and-set functionality is needed. If available, we also provide compare_and_swap operations that operate on wider values. Since standard data types for double width values may not be available, these explicitly take pairs of arguments for the new and/or old value. Unfortunately, there are two common variants, neither of which can easily and efficiently emulate the other. The first performs a comparison against the entire value being replaced, where the second replaces a double-width replacement, but performs a single-width comparison: int compare_double_and_swap_double(volatile AO_double_t * addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2); int compare_and_swap_double(volatile AO_double_t * addr, AO_t old_val1, AO_t new_val1, AO_t new_val2); where AO_double_t is a structure containing AO_val1 and AO_val2 fields, both of type AO_t. For compare_and_swap_double, we compare against the val1 field. AO_double_t exists only if AO_HAVE_double_t is defined. If this type is available then the following operation is provided for convenience, fully equivalent to compare_double_and_swap_double: int double_compare_and_swap(volatile AO_double_t * addr, AO_double_t old_val, AO_double_t new_val) Please note that AO_double_t (and AO_stack_t) variables should be properly aligned (8-byte alignment on 32-bit targets, 16-byte alignment on 64-bit ones) otherwise the behavior of a double-wide atomic primitive might be undefined (or an assertion violation might occur) if such a misaligned variable is passed (as a reference) to the primitive. Global and static variables should already have proper alignment automatically but automatic variables (i.e. located on the stack) might be misaligned because the stack might be word-aligned (e.g. 4-byte stack alignment is the default one for x86). Luckily, stack-allocated AO variables operated atomically are used rarely in practice. ORDERING CONSTRAINTS: Each operation name also includes a suffix that specifies the associated ordering semantics. The ordering constraint limits reordering of this operation with respect to other atomic operations and ordinary memory references. The current implementation assumes that all memory references are to ordinary cacheable memory; the ordering guarantee is with respect to other threads or processes, not I/O devices. (Whether or not this distinction is important is platform-dependent.) Ordering suffixes are one of the following: : No memory barrier. A plain AO_nop() really does nothing. _release: Earlier operations must become visible to other threads before the atomic operation. _acquire: Later operations must become visible after this operation. _read: Subsequent reads must become visible after reads included in the atomic operation or preceding it. Rarely useful for clients? _write: Earlier writes become visible before writes during or after the atomic operation. Rarely useful for clients? _full: The associated operation is ordered with respect to both earlier and later memory ops. If the associated operation is nop, then this orders all earlier memory operations with respect to subsequent ones. AO_store_full or AO_nop_full are the normal ways to force a store to be ordered with respect to a later load. _release_write: Ordered with respect to earlier writes. This is normally implemented as either a _write or _release barrier. _acquire_read: Ordered with respect to later reads. This is normally implemented as either a _read or _acquire barrier. _dd_acquire_read: Ordered with respect to later reads that are data dependent on this one. This is needed on a pointer read, which is later dereferenced to read a second value, with the expectation that the second read is ordered after the first one. On most architectures, this is equivalent to no barrier. (This is very hard to define precisely. It should probably be avoided. A major problem is that optimizers tend to try to eliminate dependencies from the generated code, since dependencies force the hardware to execute the code serially.) We assume that if a store is data-dependent on a previous load, then the two are always implicitly ordered. It is possible to test whether AO_[] is available on the target platform by checking whether AO_HAVE_[] is defined as a macro. Note that we generally don't implement operations that are either meaningless (e.g. AO_nop_acquire, AO_nop_release) or which appear to have no clear use (e.g. AO_load_release, AO_store_acquire, AO_load_write, AO_store_read). On some platforms (e.g. PA-RISC) many operations will remain undefined unless AO_REQUIRE_CAS is defined before including the package. When typed in the package build directory, the following command will print operations that are unimplemented on the platform: make test_atomic; ./test_atomic The following command generates a file "list_atomic.i" containing the macro expansions of all implemented operations on the platform: make list_atomic.i Known issues include: We should be more precise in defining the semantics of the ordering constraints, and if and how we can guarantee sequential consistency. Dd_acquire_read is very hard or impossible to define in a way that cannot be invalidated by reasonably standard compiler transformations. Example: If you want to initialize an object, and then "publish" a pointer to it in a global location p, such that other threads reading the new value of p are guaranteed to see an initialized object, it suffices to use AO_release_write(p, ...) to write the pointer to the object, and to retrieve it in other threads with AO_acquire_read(p). Platform notes: All X86: We quietly assume 486 or better. Gcc on x86: Define AO_USE_PENTIUM4_INSTRS to use the Pentium 4 mfence instruction. Currently this is appears to be of marginal benefit. asymptote-3.05/libatomic_ops/LICENSE0000644000000000000000000000625515031566105016027 0ustar rootrootMIT License (core library) / GPL-2.0 (gpl extension library) Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. Copyright (c) 1999-2011 Hewlett-Packard Development Company, L.P. Copyright (c) 2005, 2007 Thiemo Seufer Copyright (c) 2007 by NEC LE-IT. All rights reserved. Copyright (c) 2008-2022 Ivan Maidanski Copyright (c) 2009 Bradley Smith Copyright (c) 2009 by Takashi Yoshii. All rights reserved. Our intent is to make it easy to use libatomic_ops, in both free and proprietary software. Hence most of code (core library) that we expect to be linked into a client application is covered by a MIT or MIT-style license. However, a few library routines (the gpl extension library) are covered by the GNU General Public License. These are put into a separate library, libatomic_ops_gpl.a file. Most of the test code is covered by the GNU General Public License too. The low-level (core) part of the library (libatomic_ops.a) is mostly covered by the MIT license: ---------------------------------------- Copyright (c) ... Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------- Some files in the atomic_ops/sysdeps directory (part of core library) were inherited in part from the Boehm-Demers-Weiser conservative garbage collector, and are covered by its license, which is similar in spirit to MIT license: -------------------------------- Copyright (c) ... THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. Permission is hereby granted to use or copy this program for any purpose, provided the above notices are retained on all copies. Permission to modify the code and to distribute modified code is granted, provided the above notices are retained, and a notice that the code was modified is included with the above copyright notice. ---------------------------------- A few files are covered by the GNU General Public License. (See file "COPYING".) This applies only to the test code and the atomic_ops_gpl portion of the library. Thus, atomic_ops_gpl should generally not be linked into proprietary code. (This distinction was motivated by patent considerations.) asymptote-3.05/libatomic_ops/config.guess0000755000000000000000000014306715031566105017345 0ustar rootroot#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2024 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2024-07-27' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.guess # # Please send patches to . # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system '$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi # Just in case it came from the environment. GUESS= # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still # use 'HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. tmp= # shellcheck disable=SC2172 trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 set_cc_for_build() { # prevent multiple calls if $tmp is already set test "$tmp" && return 0 : "${TMPDIR=/tmp}" # shellcheck disable=SC2039,SC3028 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } dummy=$tmp/dummy case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c17 c99 c89 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD=$driver break fi done if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac } # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case $UNAME_SYSTEM in Linux|GNU|GNU/*) LIBC=unknown set_cc_for_build cat <<-EOF > "$dummy.c" #if defined(__ANDROID__) LIBC=android #else #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #elif defined(__GLIBC__) LIBC=gnu #elif defined(__LLVM_LIBC__) LIBC=llvm #else #include /* First heuristic to detect musl libc. */ #ifdef __DEFINED_va_list LIBC=musl #endif #endif #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" # Second heuristic to detect musl libc. if [ "$LIBC" = unknown ] && command -v ldd >/dev/null && ldd --version 2>&1 | grep -q ^musl; then LIBC=musl fi # If the system lacks a compiler, then just pick glibc. # We could probably try harder. if [ "$LIBC" = unknown ]; then LIBC=gnu fi ;; esac # Note: order is significant - the case branches are not exclusive. case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ echo unknown)` case $UNAME_MACHINE_ARCH in aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-unknown ;; *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case $UNAME_MACHINE_ARCH in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case $UNAME_MACHINE_ARCH in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case $UNAME_VERSION in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. GUESS=$machine-${os}${release}${abi-} ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE ;; *:SecBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE ;; *:MidnightBSD:*:*) GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE ;; *:ekkoBSD:*:*) GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE ;; *:SolidBSD:*:*) GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE ;; *:OS108:*:*) GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE ;; macppc:MirBSD:*:*) GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE ;; *:MirBSD:*:*) GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE ;; *:Sortix:*:*) GUESS=$UNAME_MACHINE-unknown-sortix ;; *:Twizzler:*:*) GUESS=$UNAME_MACHINE-unknown-twizzler ;; *:Redox:*:*) GUESS=$UNAME_MACHINE-unknown-redox ;; mips:OSF1:*.*) GUESS=mips-dec-osf1 ;; alpha:OSF1:*:*) # Reset EXIT trap before exiting to avoid spurious non-zero exit code. trap '' 0 case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case $ALPHA_CPU_TYPE in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` GUESS=$UNAME_MACHINE-dec-osf$OSF_REL ;; Amiga*:UNIX_System_V:4.0:*) GUESS=m68k-unknown-sysv4 ;; *:[Aa]miga[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-amigaos ;; *:[Mm]orph[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-morphos ;; *:OS/390:*:*) GUESS=i370-ibm-openedition ;; *:z/VM:*:*) GUESS=s390-ibm-zvmoe ;; *:OS400:*:*) GUESS=powerpc-ibm-os400 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) GUESS=arm-acorn-riscix$UNAME_RELEASE ;; arm*:riscos:*:*|arm*:RISCOS:*:*) GUESS=arm-unknown-riscos ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) GUESS=hppa1.1-hitachi-hiuxmpp ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. case `(/bin/universe) 2>/dev/null` in att) GUESS=pyramid-pyramid-sysv3 ;; *) GUESS=pyramid-pyramid-bsd ;; esac ;; NILE*:*:*:dcosx) GUESS=pyramid-pyramid-svr4 ;; DRS?6000:unix:4.0:6*) GUESS=sparc-icl-nx6 ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) GUESS=sparc-icl-nx7 ;; esac ;; s390x:SunOS:*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL ;; sun4H:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-hal-solaris2$SUN_REL ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris2$SUN_REL ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) GUESS=i386-pc-auroraux$UNAME_RELEASE ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$SUN_ARCH-pc-solaris2$SUN_REL ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris3$SUN_REL ;; sun4*:SunOS:*:*) case `/usr/bin/arch -k` in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like '4.1.3-JL'. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` GUESS=sparc-sun-sunos$SUN_REL ;; sun3*:SunOS:*:*) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case `/bin/arch` in sun3) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac ;; aushp:SunOS:*:*) GUESS=sparc-auspex-sunos$UNAME_RELEASE ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) GUESS=m68k-milan-mint$UNAME_RELEASE ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) GUESS=m68k-hades-mint$UNAME_RELEASE ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) GUESS=m68k-unknown-mint$UNAME_RELEASE ;; m68k:machten:*:*) GUESS=m68k-apple-machten$UNAME_RELEASE ;; powerpc:machten:*:*) GUESS=powerpc-apple-machten$UNAME_RELEASE ;; RISC*:Mach:*:*) GUESS=mips-dec-mach_bsd4.3 ;; RISC*:ULTRIX:*:*) GUESS=mips-dec-ultrix$UNAME_RELEASE ;; VAX*:ULTRIX*:*:*) GUESS=vax-dec-ultrix$UNAME_RELEASE ;; 2020:CLIX:*:* | 2430:CLIX:*:*) GUESS=clipper-intergraph-clix$UNAME_RELEASE ;; mips:*:*:UMIPS | mips:*:*:RISCos) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } GUESS=mips-mips-riscos$UNAME_RELEASE ;; Motorola:PowerMAX_OS:*:*) GUESS=powerpc-motorola-powermax ;; Motorola:*:4.3:PL8-*) GUESS=powerpc-harris-powermax ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) GUESS=powerpc-harris-powermax ;; Night_Hawk:Power_UNIX:*:*) GUESS=powerpc-harris-powerunix ;; m88k:CX/UX:7*:*) GUESS=m88k-harris-cxux7 ;; m88k:*:4*:R4*) GUESS=m88k-motorola-sysv4 ;; m88k:*:3*:R3*) GUESS=m88k-motorola-sysv3 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ test "$TARGET_BINARY_INTERFACE"x = x then GUESS=m88k-dg-dgux$UNAME_RELEASE else GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else GUESS=i586-dg-dgux$UNAME_RELEASE fi ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) GUESS=m88k-dolphin-sysv3 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 GUESS=m88k-motorola-sysv3 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) GUESS=m88k-tektronix-sysv3 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) GUESS=m68k-tektronix-bsd ;; *:IRIX*:*:*) IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` GUESS=mips-sgi-irix$IRIX_REL ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) GUESS=i386-ibm-aix ;; ia64:AIX:*:*) if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include int main () { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then GUESS=$SYSTEM_NAME else GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then GUESS=rs6000-ibm-aix3.2.4 else GUESS=rs6000-ibm-aix3.2 fi ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if test -x /usr/bin/lslpp ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$IBM_ARCH-ibm-aix$IBM_REV ;; *:AIX:*:*) GUESS=rs6000-ibm-aix ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) GUESS=romp-ibm-bsd4.4 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) GUESS=rs6000-bull-bosx ;; DPX/2?00:B.O.S.:*:*) GUESS=m68k-bull-sysv3 ;; 9000/[34]??:4.3bsd:1.*:*) GUESS=m68k-hp-bsd ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) GUESS=m68k-hp-bsd4.4 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` case $UNAME_MACHINE in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if test -x /usr/bin/getconf; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case $sc_cpu_version in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case $sc_kernel_bits in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if test "$HP_ARCH" = ""; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if test "$HP_ARCH" = hppa2.0w then set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi GUESS=$HP_ARCH-hp-hpux$HPUX_REV ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` GUESS=ia64-hp-hpux$HPUX_REV ;; 3050*:HI-UX:*:*) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } GUESS=unknown-hitachi-hiuxwe2 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) GUESS=hppa1.1-hp-bsd ;; 9000/8??:4.3bsd:*:*) GUESS=hppa1.0-hp-bsd ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) GUESS=hppa1.0-hp-mpeix ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) GUESS=hppa1.1-hp-osf ;; hp8??:OSF1:*:*) GUESS=hppa1.0-hp-osf ;; i*86:OSF1:*:*) if test -x /usr/sbin/sysversion ; then GUESS=$UNAME_MACHINE-unknown-osf1mk else GUESS=$UNAME_MACHINE-unknown-osf1 fi ;; parisc*:Lites*:*:*) GUESS=hppa1.1-hp-lites ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) GUESS=c1-convex-bsd ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) GUESS=c34-convex-bsd ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) GUESS=c38-convex-bsd ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) GUESS=c4-convex-bsd ;; CRAY*Y-MP:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=ymp-cray-unicos$CRAY_REL ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=t90-cray-unicos$CRAY_REL ;; CRAY*T3E:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=alphaev5-cray-unicosmk$CRAY_REL ;; CRAY*SV1:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=sv1-cray-unicos$CRAY_REL ;; *:UNICOS/mp:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=craynv-cray-unicosmp$CRAY_REL ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE ;; sparc*:BSD/OS:*:*) GUESS=sparc-unknown-bsdi$UNAME_RELEASE ;; *:BSD/OS:*:*) GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE ;; arm:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi else FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf fi ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL ;; i*:CYGWIN*:*) GUESS=$UNAME_MACHINE-pc-cygwin ;; *:MINGW64*:*) GUESS=$UNAME_MACHINE-pc-mingw64 ;; *:MINGW*:*) GUESS=$UNAME_MACHINE-pc-mingw32 ;; *:MSYS*:*) GUESS=$UNAME_MACHINE-pc-msys ;; i*:PW*:*) GUESS=$UNAME_MACHINE-pc-pw32 ;; *:SerenityOS:*:*) GUESS=$UNAME_MACHINE-pc-serenity ;; *:Interix*:*) case $UNAME_MACHINE in x86) GUESS=i586-pc-interix$UNAME_RELEASE ;; authenticamd | genuineintel | EM64T) GUESS=x86_64-unknown-interix$UNAME_RELEASE ;; IA64) GUESS=ia64-unknown-interix$UNAME_RELEASE ;; esac ;; i*:UWIN*:*) GUESS=$UNAME_MACHINE-pc-uwin ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) GUESS=x86_64-pc-cygwin ;; prep*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=powerpcle-unknown-solaris2$SUN_REL ;; *:GNU:*:*) # the GNU system GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL ;; *:GNU/*:*:*) # other systems with GNU libc and userland GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC ;; x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*) GUESS="$UNAME_MACHINE-pc-managarm-mlibc" ;; *:[Mm]anagarm:*:*) GUESS="$UNAME_MACHINE-unknown-managarm-mlibc" ;; *:Minix:*:*) GUESS=$UNAME_MACHINE-unknown-minix ;; aarch64:Linux:*:*) set_cc_for_build CPU=$UNAME_MACHINE LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then ABI=64 sed 's/^ //' << EOF > "$dummy.c" #ifdef __ARM_EABI__ #ifdef __ARM_PCS_VFP ABI=eabihf #else ABI=eabi #endif #endif EOF cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` eval "$cc_set_abi" case $ABI in eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;; esac fi GUESS=$CPU-unknown-linux-$LIBCABI ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi ;; avr32*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; cris:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; crisv32:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; e2k:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; frv:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; hexagon:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:Linux:*:*) GUESS=$UNAME_MACHINE-pc-linux-$LIBC ;; ia64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; k1om:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; kvx:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; kvx:cos:*:*) GUESS=$UNAME_MACHINE-unknown-cos ;; kvx:mbr:*:*) GUESS=$UNAME_MACHINE-unknown-mbr ;; loongarch32:Linux:*:* | loongarch64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m32r*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m68*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build IS_GLIBC=0 test x"${LIBC}" = xgnu && IS_GLIBC=1 sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef mips #undef mipsel #undef mips64 #undef mips64el #if ${IS_GLIBC} && defined(_ABI64) LIBCABI=gnuabi64 #else #if ${IS_GLIBC} && defined(_ABIN32) LIBCABI=gnuabin32 #else LIBCABI=${LIBC} #endif #endif #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa64r6 #else #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa32r6 #else #if defined(__mips64) CPU=mips64 #else CPU=mips #endif #endif #endif #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) MIPS_ENDIAN= #else MIPS_ENDIAN= #endif #endif EOF cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` eval "$cc_set_vars" test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; openrisc*:Linux:*:*) GUESS=or1k-unknown-linux-$LIBC ;; or32:Linux:*:* | or1k*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; padre:Linux:*:*) GUESS=sparc-unknown-linux-$LIBC ;; parisc64:Linux:*:* | hppa64:Linux:*:*) GUESS=hppa64-unknown-linux-$LIBC ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; *) GUESS=hppa-unknown-linux-$LIBC ;; esac ;; ppc64:Linux:*:*) GUESS=powerpc64-unknown-linux-$LIBC ;; ppc:Linux:*:*) GUESS=powerpc-unknown-linux-$LIBC ;; ppc64le:Linux:*:*) GUESS=powerpc64le-unknown-linux-$LIBC ;; ppcle:Linux:*:*) GUESS=powerpcle-unknown-linux-$LIBC ;; riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; s390:Linux:*:* | s390x:Linux:*:*) GUESS=$UNAME_MACHINE-ibm-linux-$LIBC ;; sh64*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sh*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sparc:Linux:*:* | sparc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; tile*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; vax:Linux:*:*) GUESS=$UNAME_MACHINE-dec-linux-$LIBC ;; x86_64:Linux:*:*) set_cc_for_build CPU=$UNAME_MACHINE LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then ABI=64 sed 's/^ //' << EOF > "$dummy.c" #ifdef __i386__ ABI=x86 #else #ifdef __ILP32__ ABI=x32 #endif #endif EOF cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` eval "$cc_set_abi" case $ABI in x86) CPU=i686 ;; x32) LIBCABI=${LIBC}x32 ;; esac fi GUESS=$CPU-pc-linux-$LIBCABI ;; xtensa*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. GUESS=i386-sequent-sysv4 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ;; i*86:OS/2:*:*) # If we were able to find 'uname', then EMX Unix compatibility # is probably installed. GUESS=$UNAME_MACHINE-pc-os2-emx ;; i*86:XTS-300:*:STOP) GUESS=$UNAME_MACHINE-unknown-stop ;; i*86:atheos:*:*) GUESS=$UNAME_MACHINE-unknown-atheos ;; i*86:syllable:*:*) GUESS=$UNAME_MACHINE-pc-syllable ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) GUESS=i386-unknown-lynxos$UNAME_RELEASE ;; i*86:*DOS:*:*) GUESS=$UNAME_MACHINE-pc-msdosdjgpp ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv32 fi ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. GUESS=i586-pc-msdosdjgpp ;; Intel:Mach:3*:*) GUESS=i386-pc-mach3 ;; paragon:*:*:*) GUESS=i860-intel-osf1 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi ;; mini*:CTIX:SYS*5:*) # "miniframe" GUESS=m68010-convergent-sysv ;; mc68k:UNIX:SYSTEM5:3.51m) GUESS=m68k-convergent-sysv ;; M680?0:D-NIX:5.3:*) GUESS=m68k-diab-dnix ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) GUESS=m68k-unknown-lynxos$UNAME_RELEASE ;; mc68030:UNIX_System_V:4.*:*) GUESS=m68k-atari-sysv4 ;; TSUNAMI:LynxOS:2.*:*) GUESS=sparc-unknown-lynxos$UNAME_RELEASE ;; rs6000:LynxOS:2.*:*) GUESS=rs6000-unknown-lynxos$UNAME_RELEASE ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) GUESS=powerpc-unknown-lynxos$UNAME_RELEASE ;; SM[BE]S:UNIX_SV:*:*) GUESS=mips-dde-sysv$UNAME_RELEASE ;; RM*:ReliantUNIX-*:*:*) GUESS=mips-sni-sysv4 ;; RM*:SINIX-*:*:*) GUESS=mips-sni-sysv4 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` GUESS=$UNAME_MACHINE-sni-sysv4 else GUESS=ns32k-sni-sysv fi ;; PENTIUM:*:4.0*:*) # Unisys 'ClearPath HMP IX 4000' SVR4/MP effort # says GUESS=i586-unisys-sysv4 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm GUESS=hppa1.1-stratus-sysv4 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. GUESS=i860-stratus-sysv4 ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. GUESS=$UNAME_MACHINE-stratus-vos ;; *:VOS:*:*) # From Paul.Green@stratus.com. GUESS=hppa1.1-stratus-vos ;; mc68*:A/UX:*:*) GUESS=m68k-apple-aux$UNAME_RELEASE ;; news*:NEWS-OS:6*:*) GUESS=mips-sony-newsos6 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if test -d /usr/nec; then GUESS=mips-nec-sysv$UNAME_RELEASE else GUESS=mips-unknown-sysv$UNAME_RELEASE fi ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. GUESS=powerpc-be-beos ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. GUESS=powerpc-apple-beos ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. GUESS=i586-pc-beos ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. GUESS=i586-pc-haiku ;; ppc:Haiku:*:*) # Haiku running on Apple PowerPC GUESS=powerpc-apple-haiku ;; *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) GUESS=$UNAME_MACHINE-unknown-haiku ;; SX-4:SUPER-UX:*:*) GUESS=sx4-nec-superux$UNAME_RELEASE ;; SX-5:SUPER-UX:*:*) GUESS=sx5-nec-superux$UNAME_RELEASE ;; SX-6:SUPER-UX:*:*) GUESS=sx6-nec-superux$UNAME_RELEASE ;; SX-7:SUPER-UX:*:*) GUESS=sx7-nec-superux$UNAME_RELEASE ;; SX-8:SUPER-UX:*:*) GUESS=sx8-nec-superux$UNAME_RELEASE ;; SX-8R:SUPER-UX:*:*) GUESS=sx8r-nec-superux$UNAME_RELEASE ;; SX-ACE:SUPER-UX:*:*) GUESS=sxace-nec-superux$UNAME_RELEASE ;; Power*:Rhapsody:*:*) GUESS=powerpc-apple-rhapsody$UNAME_RELEASE ;; *:Rhapsody:*:*) GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE ;; arm64:Darwin:*:*) GUESS=aarch64-apple-darwin$UNAME_RELEASE ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac if command -v xcode-select > /dev/null 2> /dev/null && \ ! xcode-select --print-path > /dev/null 2> /dev/null ; then # Avoid executing cc if there is no toolchain installed as # cc will be a stub that puts up a graphical alert # prompting the user to install developer tools. CC_FOR_BUILD=no_compiler_found else set_cc_for_build fi if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then # uname -m returns i386 or x86_64 UNAME_PROCESSOR=$UNAME_MACHINE fi GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE ;; *:QNX:*:4*) GUESS=i386-pc-qnx ;; NEO-*:NONSTOP_KERNEL:*:*) GUESS=neo-tandem-nsk$UNAME_RELEASE ;; NSE-*:NONSTOP_KERNEL:*:*) GUESS=nse-tandem-nsk$UNAME_RELEASE ;; NSR-*:NONSTOP_KERNEL:*:*) GUESS=nsr-tandem-nsk$UNAME_RELEASE ;; NSV-*:NONSTOP_KERNEL:*:*) GUESS=nsv-tandem-nsk$UNAME_RELEASE ;; NSX-*:NONSTOP_KERNEL:*:*) GUESS=nsx-tandem-nsk$UNAME_RELEASE ;; *:NonStop-UX:*:*) GUESS=mips-compaq-nonstopux ;; BS2000:POSIX*:*:*) GUESS=bs2000-siemens-sysv ;; DS/*:UNIX_System_V:*:*) GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "${cputype-}" = 386; then UNAME_MACHINE=i386 elif test "x${cputype-}" != x; then UNAME_MACHINE=$cputype fi GUESS=$UNAME_MACHINE-unknown-plan9 ;; *:TOPS-10:*:*) GUESS=pdp10-unknown-tops10 ;; *:TENEX:*:*) GUESS=pdp10-unknown-tenex ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) GUESS=pdp10-dec-tops20 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) GUESS=pdp10-xkl-tops20 ;; *:TOPS-20:*:*) GUESS=pdp10-unknown-tops20 ;; *:ITS:*:*) GUESS=pdp10-unknown-its ;; SEI:*:*:SEIUX) GUESS=mips-sei-seiux$UNAME_RELEASE ;; *:DragonFly:*:*) DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case $UNAME_MACHINE in A*) GUESS=alpha-dec-vms ;; I*) GUESS=ia64-dec-vms ;; V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) GUESS=i386-pc-xenix ;; i*86:skyos:*:*) SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL ;; i*86:rdos:*:*) GUESS=$UNAME_MACHINE-pc-rdos ;; i*86:Fiwix:*:*) GUESS=$UNAME_MACHINE-pc-fiwix ;; *:AROS:*:*) GUESS=$UNAME_MACHINE-unknown-aros ;; x86_64:VMkernel:*:*) GUESS=$UNAME_MACHINE-unknown-esx ;; amd64:Isilon\ OneFS:*:*) GUESS=x86_64-unknown-onefs ;; *:Unleashed:*:*) GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE ;; *:Ironclad:*:*) GUESS=$UNAME_MACHINE-unknown-ironclad ;; esac # Do we have a guess based on uname results? if test "x$GUESS" != x; then echo "$GUESS" exit fi # No uname command or uname output not recognized. set_cc_for_build cat > "$dummy.c" < #include #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #include #if defined(_SIZE_T_) || defined(SIGLOST) #include #endif #endif #endif int main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) #if !defined (ultrix) #include #if defined (BSD) #if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); #else #if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); #else printf ("vax-dec-bsd\n"); exit (0); #endif #endif #else printf ("vax-dec-bsd\n"); exit (0); #endif #else #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname un; uname (&un); printf ("vax-dec-ultrix%s\n", un.release); exit (0); #else printf ("vax-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname *un; uname (&un); printf ("mips-dec-ultrix%s\n", un.release); exit (0); #else printf ("mips-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } echo "$0: unable to guess system type" >&2 case $UNAME_MACHINE:$UNAME_SYSTEM in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 <&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF fi exit 1 # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: asymptote-3.05/libatomic_ops/README_win32.txt0000644000000000000000000000474115031566105017540 0ustar rootrootMost of the atomic_ops functionality is available under Win32 with the Microsoft tools, but the build process is somewhat different from that on Linux/Unix platforms. To build and test the package: 1) Make sure the Microsoft command-line tools (e.g. nmake) are available. 2) Go to the src directory in the distribution and run "nmake -f Makefile.msft check". This should build atomic_ops.lib and atomic_ops_gpl.lib, and execute some tests. Alternatively, CMake could be used (e.g., see how to in README_details.txt). To compile applications, you will need to retain or copy the following pieces from the resulting src directory contents: "atomic_ops.h" - Header file defining low-level primitives. This includes files from the following folder. "atomic_ops" - Subdirectory containing implementation header files. The atomic_ops.h implementation is entirely in the header files in Win32. "atomic_ops.lib" - Library containing implementation of AO_pause() defined in atomic_ops.c (AO_pause is needed for the almost lock-free stack implementation). "atomic_ops_stack.h" - Header file describing almost lock-free stack. "atomic_ops_malloc.h" - Header file describing almost lock-free malloc. "atomic_ops_gpl.lib" - Library containing implementation of the above two. Note that atomic_ops_gpl.lib is covered by the GNU General Public License, while the top 3 of these pieces allow use in proprietary code. There are several macros a client could use to configure the build with the Microsoft tools (except for AO_CMPXCHG16B_AVAILABLE one, others should be rarely needed in practice): * AO_ASM_X64_AVAILABLE - inline assembly available (only x86_64) * AO_ASSUME_VISTA - assume Windows Server 2003, Vista or later target (only x86, implied if Visual Studio 2015 or older) * AO_CMPXCHG16B_AVAILABLE - assume target is not old AMD Opteron chip (only x86_64) * AO_OLD_STYLE_INTERLOCKED_COMPARE_EXCHANGE - assume ancient MS VS Win32 headers (only arm and x86) * AO_PREFER_GENERALIZED - prefer generalized definitions to direct assembly-based ones * AO_UNIPROCESSOR - assume single-core target (only arm) * AO_USE_INTERLOCKED_INTRINSICS - assume Win32 _Interlocked* primitives available as intrinsics (only arm) * AO_USE_PENTIUM4_INSTRS - use mfence instruction instead of xchg (only x86, implied if SSE2 is available) asymptote-3.05/libatomic_ops/install-sh0000755000000000000000000003612315031566105017023 0ustar rootroot#!/bin/sh # install - install a program, script, or datafile scriptversion=2024-12-03.03; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Report bugs to . GNU Automake home page: . General help using GNU software: ." while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 (GNU Automake) $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibility with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp nil t) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: asymptote-3.05/libatomic_ops/COPYING0000644000000000000000000004325415031566105016055 0ustar rootroot GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. asymptote-3.05/primitives.h0000644000000000000000000000232215031566105014531 0ustar rootroot/***** * primitives.h * Andy Hammerlindl 2007/04/27 * * A list of the primative types in Asymptote, defined using the * PRIMITIVE(name,Name,asyName) macro. This macro should be defined in by the * code including this file for the context at hand. * * name - the name of the type in C++ code ex: boolean * Name - the same name capitalized ex: Boolean * asyName - the name in Asymptote code ex: bool * *****/ // No ifndef because this file may be included multiple times in different // contexts. PRIMITIVE(void,Void,void) PRIMITIVE(inferred,Inferred,var) /* null is not a primitive type. */ #ifdef PRIMERROR PRIMITIVE(error,Error,) #endif PRIMITIVE(boolean,Boolean,bool) PRIMITIVE(Int,Int,int) PRIMITIVE(real,Real,real) PRIMITIVE(string,String,string) PRIMITIVE(pair,Pair,pair) PRIMITIVE(triple,Triple,triple) PRIMITIVE(transform,Transform,transform) PRIMITIVE(guide,Guide,guide) PRIMITIVE(path,Path,path) PRIMITIVE(path3,Path3,path3) PRIMITIVE(cycleToken,CycleToken,cycleToken) PRIMITIVE(tensionSpecifier,TensionSpecifier,tensionSpecifier) PRIMITIVE(curlSpecifier,CurlSpecifier,curlSpecifier) PRIMITIVE(pen,Pen,pen) PRIMITIVE(picture,Picture,frame) PRIMITIVE(file,File,file) PRIMITIVE(code,Code,code) asymptote-3.05/fileio.h0000644000000000000000000004675015031566105013622 0ustar rootroot/****** * fileio.h * Tom Prince and John Bowman 2004/05/10 * * Handle input/output ******/ #ifndef FILEIO_H #define FILEIO_H #include #include #include #include #include "common.h" #ifdef HAVE_LIBTIRPC #include "xstream.h" #endif #include "pair.h" #include "triple.h" #include "guide.h" #include "pen.h" #include "camperror.h" #include "interact.h" #include "errormsg.h" #include "util.h" #include "asyprocess.h" #include "locate.h" #include "asyparser.h" namespace vm { extern bool indebugger; } namespace camp { extern string tab; extern string newline; enum Mode {NOMODE,INPUT,OUTPUT,UPDATE,BINPUT,BOUTPUT,BUPDATE,XINPUT,XINPUTGZ, XOUTPUT,XUPDATE,OPIPE}; static const string FileModes[]= {"none","input","output","output(update)", "input(binary)","output(binary)","output(binary,update)", "input(xdr)","input(xdrgz)","output(xdr)","output(xdr,update)","output(pipe)"}; extern FILE *pipeout; void openpipeout(); string locatefile(string name); class file : public gc { protected: string name; bool check; // Check whether input file exists. Mode type; Int nx,ny,nz; // Array dimensions bool linemode; // Array reads will stop at eol instead of eof. bool csvmode; // Read comma-separated values. bool wordmode; // Delimit strings by white space instead of eol. bool singlereal; // Read/write single-precision XDR/binary reals. bool singleint; // Read/write single-precision XDR/binary ints. bool signedint; // Read/write signed XDR/binary ints. bool closed; // File has been closed. bool standard; // Standard input/output bool binary; // Read in binary mode. bool nullfield; // Used to detect a null field in cvs mode. string whitespace; size_t index; // Terminator index. public: bool Standard(); bool enabled() {return !standard || settings::verbose > 1 || interact::interactive || !settings::getSetting("quiet");} void standardEOF(); template void purgeStandard(T&) { if(standard) { int c; if(cin.eof()) standardEOF(); else { cin.clear(); while((c=cin.peek()) != EOF) { cin.ignore(); if(c == '\n') break; } } } } void purgeStandard(string&); void dimension(Int Nx=-1, Int Ny=-1, Int Nz=-1); file(const string& name, bool check=true, Mode type=NOMODE, bool binary=false, bool closed=false); virtual bool isBinary() {return false;} virtual bool isXDR() {return false;} virtual void open() {} void Check(); virtual ~file(); bool isOpen(); string filename() {return name;} virtual bool eol() {return false;} virtual bool nexteol() {return false;} virtual bool text() {return false;} virtual bool eof() {return true;} virtual bool error() {return true;} virtual void close() {} virtual void clear() {} virtual Int precision(Int) {return 0;} virtual void flush() {} virtual size_t tell() {return 0;} virtual void seek(Int, bool=true) {} string FileMode() {return FileModes[type];} void unsupported(const char *rw, const char *type); void noread(const char *type) {unsupported("Read",type);} void nowrite(const char *type) {unsupported("Write",type);} virtual void Read(bool&) {noread("bool");} virtual void Read(Int&) {noread("int");} virtual void Read(double&) {noread("real");} virtual void Read(float&) {noread("real");} virtual void Read(pair&) {noread("pair");} virtual void Read(triple&) {noread("triple");} virtual void Read(char&) {noread("char");} virtual void Read(string&) {noread("string");} virtual void readwhite(string&) {noread("string");} virtual void write(bool) {nowrite("bool");} virtual void write(char) {nowrite("char");} virtual void write(Int) {nowrite("int");} virtual void write(double) {nowrite("real");} virtual void write(const pair&) {nowrite("pair");} virtual void write(const triple&) {nowrite("triple");} virtual void write(const string&) {nowrite("string");} virtual void write(const pen&) {nowrite("pen");} virtual void write(guide *) {nowrite("guide");} virtual void write(const transform&) {nowrite("transform");} virtual void writeline() {nowrite("string");} virtual void ignoreComment() {}; virtual void csv() {}; template void ignoreComment(T&) { ignoreComment(); } void ignoreComment(string&) {} void ignoreComment(char&) {} template void setDefault(T& val) { val=T(); } #if COMPACT void setDefault(Int& val) { val=vm::Undefined; } #endif template void read(T& val) { if(binary) Read(val); else { if(standard) clear(); if(errorstream::interrupt) throw interrupted(); else { ignoreComment(val); setDefault(val); if(!nullfield) Read(val); csv(); whitespace=""; } } } Int Nx() {return nx;} Int Ny() {return ny;} Int Nz() {return nz;} void Nx(Int n) {nx=n;} void Ny(Int n) {ny=n;} void Nz(Int n) {nz=n;} void LineMode(bool b) {linemode=b;} bool LineMode() {return linemode;} void CSVMode(bool b) {csvmode=b; if(b) wordmode=false;} bool CSVMode() {return csvmode;} void WordMode(bool b) {wordmode=b; if(b) csvmode=false;} bool WordMode() {return wordmode;} void SingleReal(bool b) {singlereal=b;} bool SingleReal() {return singlereal;} void SingleInt(bool b) {singleint=b;} bool SingleInt() {return singleint;} void SignedInt(bool b) {signedint=b;} bool SignedInt() {return signedint;} }; class opipe : public file { public: opipe(const string& name) : file(name,false,OPIPE) {standard=false;} void open() { openpipeout(); } bool text() {return true;} bool eof() {return pipeout ? feof(pipeout) : true;} bool error() {return pipeout ? ferror(pipeout) : true;} void clear() {if(pipeout) clearerr(pipeout);} void flush(); void seek(Int pos, bool begin=true) { if(!standard && pipeout) { clear(); fseek(pipeout,pos,begin ? SEEK_SET : SEEK_END); } } size_t tell() { return pipeout ? ftell(pipeout) : 0; } void write(const string& val); void write(bool val) { ostringstream s; s << val; write(s.str()); } void write(Int val) { ostringstream s; s << val; write(s.str()); } void write(double val) { ostringstream s; s << val; write(s.str()); } void write(const pair& val) { ostringstream s; s << val; write(s.str()); } void write(const triple& val) { ostringstream s; s << val; write(s.str()); } void write(const pen &val) { ostringstream s; s << val; write(s.str()); } void write(guide *val) { ostringstream s; s << *val; write(s.str()); } void write(const transform& val) { ostringstream s; s << val; write(s.str()); } void writeline() { fprintf(pipeout,"\n"); if(errorstream::interrupt) throw interrupted(); } }; class ifile : public file { protected: istream *stream; std::fstream *fstream; stringstream buf; char comment; std::ios::openmode mode; bool comma; public: ifile(const string& name, char comment, bool check=true, Mode type=INPUT, std::ios::openmode mode=std::ios::in) : file(name,check,type), stream(&cin), fstream(NULL), comment(comment), mode(mode), comma(false) {} // Binary file ifile(const string& name, bool check=true, Mode type=BINPUT, std::ios::openmode mode=std::ios::in) : file(name,check,type,true), mode(mode) {} ~ifile() {close();} void open(); bool eol(); bool nexteol(); bool text() {return true;} bool eof() {return stream->eof();} bool error() {return stream->fail();} void close() { if(!standard && fstream) { fstream->close(); closed=true; delete fstream; fstream=NULL; processData().ifile.remove(index); } } void clear() {stream->clear();} void seek(Int pos, bool begin=true) { if(!standard && fstream) { clear(); fstream->seekg(pos,begin ? std::ios::beg : std::ios::end); } } size_t tell() { if(fstream) return fstream->tellg(); else return 0; } void csv(); virtual void ignoreComment(); // Skip over white space void readwhite(string& val) {val=string(); *stream >> val;} void Read(bool &val) {string t; readwhite(t); val=(t == "true");} void Read(Int& val) {*stream >> val;} void Read(double& val); void Read(pair& val) {*stream >> val;} void Read(triple& val) {*stream >> val;} void Read(char& val) {stream->get(val);} void Read(string& val); }; class iofile : public ifile { public: iofile(const string& name, char comment=0) : ifile(name,comment,true,UPDATE,std::ios::in | std::ios::out) {} Int precision(Int p) { return p == 0 ? stream->precision(settings::getSetting("digits")) : stream->precision(p); } void flush() {if(fstream) fstream->flush();} void write(bool val) {*fstream << (val ? "true " : "false ");} void write(Int val) {*fstream << val;} void write(double val) {*fstream << val;} void write(const pair& val) {*fstream << val;} void write(const triple& val) {*fstream << val;} void write(const string& val) {*fstream << val;} void write(const pen& val) {*fstream << val;} void write(guide *val) {*fstream << *val;} void write(const transform& val) {*fstream << val;} void writeline(); }; class ofile : public file { protected: ostream *stream; std::ofstream *fstream; std::ios::openmode mode; public: ofile(const string& name, Mode type=OUTPUT, std::ios::openmode mode=std::ios::trunc) : file(name,true,type), stream(&cout), fstream(NULL), mode(mode) {} ~ofile() {close();} void open(); bool text() {return true;} bool eof() {return stream->eof();} bool error() {return stream->fail();} void close(); void clear() {stream->clear();} Int precision(Int p); void flush() {stream->flush();} void seek(Int pos, bool begin=true); size_t tell(); bool enabled(); void write(bool val) {*stream << (val ? "true " : "false ");} void write(Int val) {*stream << val;} void write(double val) {*stream << val;} void write(const pair& val) {*stream << val;} void write(const triple& val) {*stream << val;} void write(const string& val) {*stream << val;} void write(const pen& val) {*stream << val;} void write(guide *val) {*stream << *val;} void write(const transform& val) {*stream << val;} void writeline(); }; class ibfile : public ifile { public: ibfile(const string& name, bool check=true, Mode type=BINPUT, std::ios::openmode mode=std::ios::in) : ifile(name,check,type,mode | std::ios::binary) {} bool isBinary() {return true;} template void iread(T& val) { val=T(); if(fstream) fstream->read((char *) &val,sizeof(T)); } void Read(bool& val) {iread(val);} void Read(Int& val) { if(signedint) { if(singleint) {int ival; iread(ival); val=ival;} else iread(val); } else { if(singleint) {unsigned ival; iread(ival); val=Intcast(ival);} else {unsignedInt ival; iread(ival); val=Intcast(ival);} } } void Read(char& val) {iread(val);} void Read(string& val) { size_t n=0; if(wordmode) iread(n); else n=SIZE_MAX; string s; for(size_t i=0; i < n; ++i) { char c; Read(c); if(eof() || error()) return; s += c; } val=s; } void Read(double& val) { if(singlereal) {float fval; iread(fval); val=fval;} else iread(val); } }; class iobfile : public ibfile { public: iobfile(const string& name) : ibfile(name,true,BUPDATE,std::ios::in | std::ios::out) {} bool isBinary() {return true;} void flush() {if(fstream) fstream->flush();} template void iwrite(T val) { if(fstream) fstream->write((char *) &val,sizeof(T)); } void write(bool val) {iwrite(val);} void write(Int val) { if(signedint) { if(singleint) iwrite(intcast(val)); else iwrite(val); } else { if(singleint) iwrite(unsignedcast(val)); else iwrite(unsignedIntcast(val)); } } void write(const string& val) { size_t n=val.size(); if(wordmode) iwrite(n); for(size_t i=0; i < n; ++i) fstream->write((char *) &val[i],1); } void write(const pen& val) {iwrite(val);} void write(guide *val) {iwrite(val);} void write(const transform& val) {iwrite(val);} void write(double val) { if(singlereal) iwrite((float) val); else iwrite(val); } void write(const pair& val) { write(val.getx()); write(val.gety()); } void write(const triple& val) { write(val.getx()); write(val.gety()); write(val.getz()); } void writeline() {} }; class obfile : public ofile { public: obfile(const string& name) : ofile(name,BOUTPUT,std::ios::binary) {} bool isBinary() {return true;} template void iwrite(T val) { if(fstream) fstream->write((char *) &val,sizeof(T)); } void write(bool val) {iwrite(val);} void write(Int val) { if(signedint) { if(singleint) iwrite(intcast(val)); else iwrite(val); } else { if(singleint) iwrite(unsignedcast(val)); else iwrite(unsignedIntcast(val)); } } void write(const string& val) { size_t n=val.size(); if(wordmode) iwrite(n); for(size_t i=0; i < n; ++i) fstream->write((char *) &val[i],1); } void write(const pen& val) {iwrite(val);} void write(guide *val) {iwrite(val);} void write(const transform& val) {iwrite(val);} void write(double val) { if(singlereal) iwrite((float) val); else iwrite(val); } void write(const pair& val) { write(val.getx()); write(val.gety()); } void write(const triple& val) { write(val.getx()); write(val.gety()); write(val.getz()); } void writeline() {} }; #ifdef HAVE_LIBTIRPC class ixfile : public file { protected: xdr::ixstream *fstream; xdr::xios::open_mode mode; public: ixfile(const string& name, bool check=true, Mode type=XINPUT, xdr::xios::open_mode mode=xdr::xios::in) : file(name,check,type,true), fstream(NULL), mode(mode) {} bool isXDR() override {return true;} void open() override { name=locatefile(inpath(name)); fstream=new xdr::ixstream(name.c_str(),mode); index=processData().ixfile.add(fstream); if(check) Check(); } void close() override { if(fstream) { fstream->close(); closed=true; delete fstream; fstream=NULL; processData().ixfile.remove(index); } } ~ixfile() {close();} bool eof() override {return fstream ? fstream->eof() : true;} bool error() override {return fstream ? fstream->fail() : true;} void clear() override {if(fstream) fstream->clear();} void seek(Int pos, bool begin=true) override { if(!standard && fstream) { clear(); fstream->seek(pos,begin ? xdr::xios::beg : xdr::xios::end); } } size_t tell() override { if(fstream) return fstream->tell(); else return 0; } void Read(char& val) override { xdr::xbyte b; *fstream >> b; val=b; } void Read(string& val) override { size_t n=0; if(wordmode) *fstream >> n; else n=SIZE_MAX; val=""; string s; for(size_t i=0; i < n; ++i) { char c; Read(c); if(eof() || error()) return; s += c; } val=s; } void Read(Int& val) override { if(signedint) { if(singleint) {int ival=0; *fstream >> ival; val=ival;} else {val=0; *fstream >> val;} } else { if(singleint) {unsigned ival=0; *fstream >> ival; val=Intcast(ival);} else {unsignedInt ival=0; *fstream >> ival; val=Intcast(ival);} } } void Read(double& val) override { if(singlereal) {float fval=0.0; *fstream >> fval; val=fval;} else { val=0.0; *fstream >> val; } } void Read(pair& val) override { double x,y; Read(x); Read(y); val=pair(x,y); } void Read(triple& val) override { double x,y,z; Read(x); Read(y); Read(z); val=triple(x,y,z); } }; class igzxfile : public ixfile { protected: std::vector readData; size_t const readSize; gzFile gzfile; public: igzxfile(const string& name, bool check=true, Mode type=XINPUT, xdr::xios::open_mode mode=xdr::xios::in, size_t readSize=32768) : ixfile(name,check,type,mode), readSize(readSize){} bool error() override {return !gzfile;} void open() override; void close() override { closeFile(); } ~igzxfile() override {closeFile();} protected: void closeFile(); }; class ioxfile : public ixfile { public: ioxfile(const string& name) : ixfile(outpath(name),true,XUPDATE,xdr::xios::out) {} void open() override { name=locatefile(inpath(name)); ioxfstreamRef=new xdr::ioxstream(name.c_str(),mode); fstream=static_cast(ioxfstreamRef); index=processData().ixfile.add(fstream); if(check) Check(); } void flush() override {if(fstream) ioxfstreamRef->flush();} void write(const string& val) override { size_t n=val.size(); if(wordmode) *ioxfstreamRef << n; for(size_t i=0; i < n; ++i) *ioxfstreamRef << (xdr::xbyte) val[i]; } void write(Int val) override { if(signedint) { if(singleint) *ioxfstreamRef << intcast(val); else *ioxfstreamRef << val; } else { if(singleint) *ioxfstreamRef << unsignedcast(val); else *ioxfstreamRef << unsignedIntcast(val); } } void write(double val) override { if(singlereal) *ioxfstreamRef << (float) val; else *ioxfstreamRef << val; } void write(const pair& val) override { write(val.getx()); write(val.gety()); } void write(const triple& val) override { write(val.getx()); write(val.gety()); write(val.getz()); } private: xdr::ioxstream* ioxfstreamRef; }; class oxfile : public file { xdr::oxstream *fstream; public: oxfile(const string& name) : file(name,true,XOUTPUT), fstream(NULL) {} bool isXDR() override {return true;} void open() override { fstream=new xdr::oxstream(outpath(name).c_str(),xdr::xios::trunc); index=processData().oxfile.add(fstream); Check(); } void close() override { if(fstream) { fstream->close(); closed=true; delete fstream; fstream=NULL; processData().oxfile.remove(index); } } ~oxfile() {close();} bool eof() override {return fstream ? fstream->eof() : true;} bool error() override {return fstream ? fstream->fail() : true;} void clear() override {if(fstream) fstream->clear();} void flush() override {if(fstream) fstream->flush();} void seek(Int pos, bool begin=true) override { if(!standard && fstream) { clear(); fstream->seek(pos,begin ? xdr::xios::beg : xdr::xios::end); } } size_t tell() override { if(fstream) return fstream->tell(); else return 0; } void write(const string& val) override { size_t n=val.size(); if(wordmode) *fstream << n; for(size_t i=0; i < n; ++i) *fstream << (xdr::xbyte) val[i]; } void write(Int val) override { if(signedint) { if(singleint) *fstream << intcast(val); else *fstream << val; } else { if(singleint) *fstream << unsignedcast(val); else *fstream << unsignedIntcast(val); } } void write(double val) override { if(singlereal) *fstream << (float) val; else *fstream << val; } void write(const pair& val) override { write(val.getx()); write(val.gety()); } void write(const triple& val) override { write(val.getx()); write(val.gety()); write(val.getz()); } }; #endif extern ofile Stdout; extern file nullfile; } // namespace camp #endif // FILEIO_H asymptote-3.05/util.h0000644000000000000000000000700315031566105013314 0ustar rootroot/***** * util.h * Andy Hammerlindl 2004/05/10 * * A place for useful utility functions. *****/ #ifndef UTIL_H #define UTIL_H #include #include #include #include #include "common.h" #include #if !defined(_MSC_VER) #include #else #include #define strcasecmp _stricmp #define strncasecmp _strnicmp #endif // Demangle a typeid name (if the proper library is installed. string demangle(const char *s); // Duplicate a string. char *Strdup(string s); char *StrdupNoGC(string s); char *StrdupMalloc(string s); // Strip the directory from a filename. string stripDir(string name); // Strip the file from a filename, returning the directory. string stripFile(string name); // Strip the extension from a filename. string stripExt(string name, const string& suffix=""); // Escapes characters specified in set string escapeCharacters(string const& inText, std::unordered_set const& charactersToEscape); void readDisabled(); void writeDisabled(); // Replace spaces in file part of name with underscores. string cleanpath(string name); // Construct the full path name, checking access. string inpath(string name); string outpath(string name); // Construct a filename from the original, adding aux at the end, and // changing the suffix. string buildname(string filename, string suffix="", string aux=""); // Construct an alternate filename for a temporary file in the current // directory. string auxname(string filename, string suffix=""); // Cast argument to a string. template string String(T x) { ostringstream buf; buf << x; return buf.str(); } typedef void (*sighandler_t)(int); // Portable signal (sigaction wrapper). sighandler_t Signal(int signum, sighandler_t handler); // Split string S and push the pieces onto vector a. void push_split(mem::vector& a, const string& S); // Wrapper to append /c start "" to MSDOS cmd. void push_command(mem::vector& a, const string& s); // Return an argv array corresponding to the fields in command delimited // by spaces not within matching single quotes. char **args(const mem::vector &args, bool quiet=false); // Similar to the standard system call except allows interrupts and does // not invoke a shell. int System(const mem::vector &command, int quiet=0, bool wait=true, const char *hint=NULL, const char *application="", int *pid=NULL); extern bool False; // Strip blank lines (which would break the bidirectional TeX pipe) string stripblanklines(const string& s); const char *startPath(); const char* setPath(const char *s, bool quiet=false); const char *changeDirectory(const char *s); extern char *startpath; extern void recursive_delete(char *name); void backslashToSlash(string& s); void spaceToUnderscore(string& s); string Getenv(const char *name, bool msdos); char *getPath(char *p=NULL); void execError(const char *command, const char *hint, const char *application); // This invokes a viewer to display the manual. Subsequent calls will only // pop-up a new viewer if the old one has been closed. void popupHelp(); inline Int Abs(Int x) { #ifdef HAVE_LONG_LONG return llabs(x); #else #ifdef HAVE_LONG return labs(x); #else return abs(x); #endif #endif } unsigned unsignedcast(Int n); unsignedInt unsignedIntcast(Int n); int intcast(Int n); Int Intcast(unsignedInt n); bool fileExists(string const& path); #if defined(_WIN32) int setenv(const char *name, const char *value, bool overwrite); int unsetenv(const char *name); #endif #endif asymptote-3.05/env.cc0000644000000000000000000001275015031566105013272 0ustar rootroot/***** * env.cc * Andy Hammerlindl 2002/6/20 * * Keeps track of the namespaces of variables and types when traversing * the abstract syntax. *****/ #include "env.h" #include "record.h" #include "genv.h" #include "builtin.h" using namespace types; namespace trans { // Instances of this class are passed to types::ty objects so that they can // call back to env when checking casting of subtypes. class envCaster : public caster { protoenv &e; symbol name; public: envCaster(protoenv &e, symbol name) : e(e), name(name) {} access *operator() (ty *target, ty *source) { return e.lookupCast(target, source, name); } bool castable(ty *target, ty *source) { return e.castable(target, source, name); } }; access *protoenv::baseLookupCast(ty *target, ty *source, symbol name) { static identAccess id; assert(target->kind != ty_overloaded && source->kind != ty_overloaded); // If errors already exist, don't report more. This may, however, cause // problems with resoving the signature of an overloaded function. The // abstract syntax should check if any of the parameters had an error before // finding the signature. if (target->kind == ty_error || source->kind == ty_error) return &id; else if (equivalent(target,source)) return &id; else { varEntry *v=lookupVarByType(name,new function(target,source)); return v ? v->getLocation() : 0; } } access *protoenv::lookupCast(ty *target, ty *source, symbol name) { access *a=baseLookupCast(target, source, name); if (a) return a; envCaster ec(*this, name); return source->castTo(target, ec); } bool protoenv::castable(ty *target, ty *source, symbol name) { struct castTester : public tester { protoenv &e; symbol name; castTester(protoenv &e, symbol name) : e(e), name(name) {} bool base(ty *t, ty *s) { access *a=e.baseLookupCast(t, s, name); if (a) return true; envCaster ec(e, name); return s->castable(t, ec); } }; castTester ct(*this, name); return ct.test(target,source); } bool protoenv::fastCastable(ty *target, ty *source) { assert(target->kind != types::ty_overloaded); assert(target->kind != types::ty_error); assert(source->kind != types::ty_error); // To avoid memory allocation, fill one static variable with new parameters // in each call. // Warning: This is not re-entrant if asy ever goes multi-threaded. static types::function castFunc(primVoid(), primVoid()); castFunc.result = target; if (source->kind == types::ty_overloaded) { bool result = false; types::ty_vector& v = ((overloaded *)source)->sub; for (size_t i = 0; i < v.size(); ++i) { castFunc.sig.formals[0].t = v[i]; if (lookupVarByType(symbol::castsym, &castFunc)) { result = true; break; } } //assert(result == castable(target, source, symbol::castsym)); //cout << "fc OVERLOADED " << (result ? "CAST" : "FAIL") << endl; return result; } //else cout << "fc SIMPLE" << endl; // Don't test for equivalent, as that is already done by the castScore // code. Assert disabled for speed. #if 0 assert(!equivalent(target, source)); #endif castFunc.sig.formals[0].t = source; if (lookupVarByType(symbol::castsym, &castFunc)) return true; // Test for generic casts of null. This should be moved to a types.h // routine. return source->kind == ty_null && target->isReference(); } access *protoenv::fastLookupCast(ty *target, ty *source) { assert(target->kind != types::ty_overloaded); assert(target->kind != types::ty_error); assert(source->kind != types::ty_overloaded); assert(source->kind != types::ty_error); // Warning: This is not re-entrant. static types::function castFunc(primVoid(), primVoid()); castFunc.result = target; castFunc.sig.formals[0].t = source; varEntry *ve = lookupVarByType(symbol::castsym, &castFunc); if (ve) return ve->getLocation(); // Fall back on slow routine. return lookupCast(target, source, symbol::castsym); } ty *protoenv::castTarget(ty *target, ty *source, symbol name) { struct resolver : public collector { protoenv &e; symbol name; resolver(protoenv &e, symbol name) : e(e), name(name) {} types::ty *base(types::ty *target, types::ty *source) { return e.castable(target, source, name) ? target : 0; } }; resolver r(*this, name); return r.collect(target, source); } ty *protoenv::castSource(ty *target, ty *source, symbol name) { struct resolver : public collector { protoenv &e; symbol name; resolver(protoenv &e, symbol name) : e(e), name(name) {} types::ty *base(types::ty *target, types::ty *source) { return e.castable(target, source, name) ? source : 0; } }; resolver r(*this, name); return r.collect(target, source); } void protoenv::addArrayOps(array *a) { trans::addArrayOps(ve, a); } void protoenv::addRecordOps(record *r) { trans::addRecordOps(r); } env::env(genv &ge) : protoenv(venv::file_env_tag()), ge(ge) { // NOTE: May want to make this initial environment into a "builtin" module, // and then import the builtin module. base_tenv(te); base_venv(ve); } env::~env() { } record *env::getModule(symbol id, string filename) { return ge.getModule(id, filename); } record *env::getTemplatedModule(string filename, mem::vector* args) { return ge.getTemplatedModule(filename, args); } record *env::getLoadedModule(symbol id) { return ge.getLoadedModule(id); } } asymptote-3.05/shaders.cc0000644000000000000000000000714315031566105014133 0ustar rootroot// shader handling // Author: Supakorn "Jamie" Rassameemasmuang #include "common.h" #ifdef HAVE_GL #include #include #include #include #include #include "settings.h" #include "fpu.h" #include "shaders.h" int GLSLversion; GLuint compileAndLinkShader(std::vector const& shaders, std::vector const& defineflags, bool ssbo, bool interlock, bool compute, bool test) { GLuint shader = glCreateProgram(); std::vector compiledShaders; size_t n=shaders.size(); for(size_t i=0; i < n; ++i) { GLint newshader=createShaderFile(shaders[i].first,shaders[i].second, defineflags,ssbo,interlock,compute,test); if(test && newshader == 0) return 0; glAttachShader(shader,newshader); compiledShaders.push_back(newshader); } glBindAttribLocation(shader,positionAttrib,"position"); glBindAttribLocation(shader,normalAttrib,"normal"); glBindAttribLocation(shader,materialAttrib,"material"); glBindAttribLocation(shader,colorAttrib,"color"); glBindAttribLocation(shader,widthAttrib,"width"); fpu_trap(false); // Work around FE_INVALID glLinkProgram(shader); fpu_trap(settings::trap()); for(size_t i=0; i < n; ++i) { glDetachShader(shader,compiledShaders[i]); glDeleteShader(compiledShaders[i]); } return shader; } GLuint createShader(const std::string& src, int shaderType, const std::string& filename, bool ssbo, bool interlock, bool compute, bool test) { const GLchar *source=src.c_str(); GLuint shader=glCreateShader(shaderType); glShaderSource(shader, 1, &source, NULL); glCompileShader(shader); GLint status; glGetShaderiv(shader, GL_COMPILE_STATUS, &status); if(status != GL_TRUE) { if(test) return 0; GLint length; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length); std::vector msg(length); glGetShaderInfoLog(shader, length, &length, msg.data()); size_t n=msg.size(); for(size_t i=0; i < n; ++i) std::cerr << msg[i]; std::cerr << std::endl << "GL Compile error" << std::endl; std::stringstream s(src); std::string line; unsigned int k=0; while(getline(s,line)) std::cerr << ++k << ": " << line << std::endl; exit(-1); } return shader; } GLuint createShaderFile(std::string file, int shaderType, std::vector const& defineflags, bool ssbo, bool interlock, bool compute, bool test) { std::ifstream shaderFile; shaderFile.open(file.c_str()); std::stringstream shaderSrc; shaderSrc << "#version " << GLSLversion << "\n"; #ifndef __APPLE__ shaderSrc << "#extension GL_ARB_uniform_buffer_object : enable" << "\n"; #ifdef HAVE_SSBO if(ssbo) { shaderSrc << "#extension GL_ARB_shader_storage_buffer_object : enable" << "\n"; shaderSrc << "#extension GL_ARB_shader_atomic_counters : enable" << "\n"; if(interlock) shaderSrc << "#extension GL_ARB_fragment_shader_interlock : enable" << "\n"; if(compute) shaderSrc << "#extension GL_ARB_compute_shader : enable" << "\n"; } #endif #endif size_t n=defineflags.size(); for(size_t i=0; i < n; ++i) shaderSrc << "#define " << defineflags[i] << "\n"; if(shaderFile) { shaderSrc << shaderFile.rdbuf(); shaderFile.close(); } else { std::cerr << "Cannot read from shader file " << file << std::endl; exit(-1); } return createShader(shaderSrc.str(),shaderType,file,ssbo,interlock,compute, test); } #endif asymptote-3.05/GUI/0000755000000000000000000000000015031566356012622 5ustar rootrootasymptote-3.05/GUI/xasyqtui/0000755000000000000000000000000015031566355014510 5ustar rootrootasymptote-3.05/GUI/xasyqtui/labelTextEditor.py0000644000000000000000000001416315031566355020162 0ustar rootroot# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'windows/labelTextEditor.ui' # # Created by: PyQt5 UI code generator 5.15.11 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(473, 424) self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) self.verticalLayout.setObjectName("verticalLayout") self.frame = QtWidgets.QFrame(Dialog) self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) self.frame.setObjectName("frame") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.frame) self.verticalLayout_3.setObjectName("verticalLayout_3") self.gridLayout = QtWidgets.QGridLayout() self.gridLayout.setContentsMargins(-1, 0, -1, -1) self.gridLayout.setObjectName("gridLayout") spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem, 0, 2, 1, 1) self.chkMathMode = QtWidgets.QCheckBox(self.frame) self.chkMathMode.setObjectName("chkMathMode") self.gridLayout.addWidget(self.chkMathMode, 0, 0, 1, 1) self.cmbMathStyle = QtWidgets.QComboBox(self.frame) self.cmbMathStyle.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cmbMathStyle.sizePolicy().hasHeightForWidth()) self.cmbMathStyle.setSizePolicy(sizePolicy) self.cmbMathStyle.setMinimumSize(QtCore.QSize(100, 0)) self.cmbMathStyle.setObjectName("cmbMathStyle") self.cmbMathStyle.addItem("") self.cmbMathStyle.addItem("") self.cmbMathStyle.addItem("") self.gridLayout.addWidget(self.cmbMathStyle, 0, 1, 1, 1) self.verticalLayout_3.addLayout(self.gridLayout) self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setObjectName("verticalLayout_2") self.txtLabelEdit = QtWidgets.QPlainTextEdit(self.frame) self.txtLabelEdit.setObjectName("txtLabelEdit") self.verticalLayout_2.addWidget(self.txtLabelEdit) self.verticalLayout_3.addLayout(self.verticalLayout_2) self.verticalLayout_4 = QtWidgets.QVBoxLayout() self.verticalLayout_4.setContentsMargins(-1, 0, -1, -1) self.verticalLayout_4.setObjectName("verticalLayout_4") self.label = QtWidgets.QLabel(self.frame) self.label.setObjectName("label") self.verticalLayout_4.addWidget(self.label) self.lblLabelPreview = QtWidgets.QLabel(self.frame) self.lblLabelPreview.setMinimumSize(QtCore.QSize(0, 100)) self.lblLabelPreview.setFrameShape(QtWidgets.QFrame.Box) self.lblLabelPreview.setText("") self.lblLabelPreview.setObjectName("lblLabelPreview") self.verticalLayout_4.addWidget(self.lblLabelPreview) self.verticalLayout_3.addLayout(self.verticalLayout_4) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) self.btnGetText = QtWidgets.QPushButton(self.frame) self.btnGetText.setMaximumSize(QtCore.QSize(32, 32)) self.btnGetText.setText("") icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(":/icons/text.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnGetText.setIcon(icon) self.btnGetText.setFlat(True) self.btnGetText.setObjectName("btnGetText") self.horizontalLayout.addWidget(self.btnGetText) self.btnPreview = QtWidgets.QPushButton(self.frame) self.btnPreview.setMaximumSize(QtCore.QSize(32, 32)) self.btnPreview.setText("") icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(":/icons/eye.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnPreview.setIcon(icon1) self.btnPreview.setFlat(True) self.btnPreview.setObjectName("btnPreview") self.horizontalLayout.addWidget(self.btnPreview) self.btnCancel = QtWidgets.QPushButton(self.frame) self.btnCancel.setMaximumSize(QtCore.QSize(32, 32)) self.btnCancel.setText("") icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap(":/icons/android-close.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnCancel.setIcon(icon2) self.btnCancel.setFlat(True) self.btnCancel.setObjectName("btnCancel") self.horizontalLayout.addWidget(self.btnCancel) self.btnAccept = QtWidgets.QPushButton(self.frame) self.btnAccept.setMaximumSize(QtCore.QSize(32, 32)) self.btnAccept.setText("") icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap(":/icons/android-done.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnAccept.setIcon(icon3) self.btnAccept.setFlat(True) self.btnAccept.setObjectName("btnAccept") self.horizontalLayout.addWidget(self.btnAccept) self.verticalLayout_3.addLayout(self.horizontalLayout) self.verticalLayout.addWidget(self.frame) self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): _translate = QtCore.QCoreApplication.translate Dialog.setWindowTitle(_translate("Dialog", "Dialog")) self.chkMathMode.setText(_translate("Dialog", "Math Mode")) self.cmbMathStyle.setItemText(0, _translate("Dialog", "Inline Style")) self.cmbMathStyle.setItemText(1, _translate("Dialog", "Display Style")) self.cmbMathStyle.setItemText(2, _translate("Dialog", "Script Style")) self.label.setText(_translate("Dialog", "Preview")) from xasyicons import icons_rc asymptote-3.05/GUI/xasyqtui/widg_addPolyOpt.py0000644000000000000000000000561515031566355020162 0ustar rootroot# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'windows/widg_addPolyOpt.ui' # # Created by: PyQt5 UI code generator 5.15.11 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.setWindowModality(QtCore.Qt.NonModal) Form.resize(326, 35) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth()) Form.setSizePolicy(sizePolicy) Form.setMinimumSize(QtCore.QSize(0, 35)) Form.setMaximumSize(QtCore.QSize(16777215, 35)) self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form) self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_2.setSpacing(0) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.chkInscribed = QtWidgets.QCheckBox(Form) self.chkInscribed.setObjectName("chkInscribed") self.horizontalLayout.addWidget(self.chkInscribed) spacerItem = QtWidgets.QSpacerItem(19, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.label = QtWidgets.QLabel(Form) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) self.label.setSizePolicy(sizePolicy) self.label.setObjectName("label") self.horizontalLayout.addWidget(self.label) self.txtSides = QtWidgets.QLineEdit(Form) self.txtSides.setObjectName("txtSides") self.horizontalLayout.addWidget(self.txtSides) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) self.horizontalLayout_2.addLayout(self.horizontalLayout) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) self.chkInscribed.setText(_translate("Form", "Start at Vertex")) self.label.setText(_translate("Form", "Sides: ")) self.txtSides.setToolTip(_translate("Form", "Number of Sides")) self.txtSides.setPlaceholderText(_translate("Form", "Sides")) asymptote-3.05/GUI/xasyqtui/widg_addLabel.py0000644000000000000000000001610215031566355017564 0ustar rootroot# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'windows/widg_addLabel.ui' # # Created by: PyQt5 UI code generator 5.15.11 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.setWindowModality(QtCore.Qt.NonModal) Form.resize(599, 35) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth()) Form.setSizePolicy(sizePolicy) Form.setMinimumSize(QtCore.QSize(0, 35)) Form.setMaximumSize(QtCore.QSize(16777215, 35)) self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form) self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_2.setSpacing(0) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.txtLabelText = QtWidgets.QLineEdit(Form) self.txtLabelText.setObjectName("txtLabelText") self.horizontalLayout.addWidget(self.txtLabelText) self.btnAdvancedEdit = QtWidgets.QPushButton(Form) self.btnAdvancedEdit.setMaximumSize(QtCore.QSize(25, 25)) self.btnAdvancedEdit.setText("") icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(":/icons/edit.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnAdvancedEdit.setIcon(icon) self.btnAdvancedEdit.setFlat(True) self.btnAdvancedEdit.setObjectName("btnAdvancedEdit") self.horizontalLayout.addWidget(self.btnAdvancedEdit) self.label = QtWidgets.QLabel(Form) self.label.setObjectName("label") self.horizontalLayout.addWidget(self.label) self.cmbAlign = QtWidgets.QComboBox(Form) self.cmbAlign.setObjectName("cmbAlign") self.cmbAlign.addItem("") self.cmbAlign.addItem("") self.cmbAlign.addItem("") self.cmbAlign.addItem("") self.cmbAlign.addItem("") self.cmbAlign.addItem("") self.cmbAlign.addItem("") self.cmbAlign.addItem("") self.cmbAlign.addItem("") self.cmbAlign.addItem("") self.horizontalLayout.addWidget(self.cmbAlign) self.label_3 = QtWidgets.QLabel(Form) self.label_3.setObjectName("label_3") self.horizontalLayout.addWidget(self.label_3) self.cmbFontSize = QtWidgets.QComboBox(Form) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cmbFontSize.sizePolicy().hasHeightForWidth()) self.cmbFontSize.setSizePolicy(sizePolicy) self.cmbFontSize.setEditable(True) self.cmbFontSize.setObjectName("cmbFontSize") self.cmbFontSize.addItem("") self.cmbFontSize.addItem("") self.cmbFontSize.addItem("") self.cmbFontSize.addItem("") self.cmbFontSize.addItem("") self.cmbFontSize.addItem("") self.cmbFontSize.addItem("") self.cmbFontSize.addItem("") self.cmbFontSize.addItem("") self.cmbFontSize.addItem("") self.cmbFontSize.addItem("") self.horizontalLayout.addWidget(self.cmbFontSize) self.label_2 = QtWidgets.QLabel(Form) self.label_2.setObjectName("label_2") self.horizontalLayout.addWidget(self.label_2) self.txtShiftX = QtWidgets.QLineEdit(Form) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.txtShiftX.sizePolicy().hasHeightForWidth()) self.txtShiftX.setSizePolicy(sizePolicy) self.txtShiftX.setMaximumSize(QtCore.QSize(50, 16777215)) self.txtShiftX.setObjectName("txtShiftX") self.horizontalLayout.addWidget(self.txtShiftX) self.txtShiftY = QtWidgets.QLineEdit(Form) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.txtShiftY.sizePolicy().hasHeightForWidth()) self.txtShiftY.setSizePolicy(sizePolicy) self.txtShiftY.setMaximumSize(QtCore.QSize(50, 16777215)) self.txtShiftY.setObjectName("txtShiftY") self.horizontalLayout.addWidget(self.txtShiftY) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.horizontalLayout_2.addLayout(self.horizontalLayout) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) self.txtLabelText.setToolTip(_translate("Form", "Number of Sides")) self.txtLabelText.setPlaceholderText(_translate("Form", "Text")) self.label.setText(_translate("Form", "Align")) self.cmbAlign.setItemText(0, _translate("Form", "Center")) self.cmbAlign.setItemText(1, _translate("Form", "N")) self.cmbAlign.setItemText(2, _translate("Form", "E")) self.cmbAlign.setItemText(3, _translate("Form", "W")) self.cmbAlign.setItemText(4, _translate("Form", "S")) self.cmbAlign.setItemText(5, _translate("Form", "NW")) self.cmbAlign.setItemText(6, _translate("Form", "NE")) self.cmbAlign.setItemText(7, _translate("Form", "SW")) self.cmbAlign.setItemText(8, _translate("Form", "SE")) self.cmbAlign.setItemText(9, _translate("Form", "Custom")) self.label_3.setText(_translate("Form", "Font Size")) self.cmbFontSize.setItemText(0, _translate("Form", "-")) self.cmbFontSize.setItemText(1, _translate("Form", "8")) self.cmbFontSize.setItemText(2, _translate("Form", "9")) self.cmbFontSize.setItemText(3, _translate("Form", "10")) self.cmbFontSize.setItemText(4, _translate("Form", "11")) self.cmbFontSize.setItemText(5, _translate("Form", "12")) self.cmbFontSize.setItemText(6, _translate("Form", "14")) self.cmbFontSize.setItemText(7, _translate("Form", "18")) self.cmbFontSize.setItemText(8, _translate("Form", "24")) self.cmbFontSize.setItemText(9, _translate("Form", "48")) self.cmbFontSize.setItemText(10, _translate("Form", "72")) self.label_2.setText(_translate("Form", "Custom Align")) self.txtShiftX.setPlaceholderText(_translate("Form", "Shift X")) self.txtShiftY.setPlaceholderText(_translate("Form", "Shift Y")) from xasyicons import icons_rc asymptote-3.05/GUI/xasyqtui/setCustomAnchor.py0000644000000000000000000000560115031566355020205 0ustar rootroot# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'windows/setCustomAnchor.ui' # # Created by: PyQt5 UI code generator 5.15.11 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(245, 161) self.verticalLayoutWidget = QtWidgets.QWidget(Dialog) self.verticalLayoutWidget.setGeometry(QtCore.QRect(20, 20, 201, 121)) self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.formLayout = QtWidgets.QFormLayout() self.formLayout.setFieldGrowthPolicy(QtWidgets.QFormLayout.AllNonFixedFieldsGrow) self.formLayout.setObjectName("formLayout") self.label = QtWidgets.QLabel(self.verticalLayoutWidget) self.label.setObjectName("label") self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label) self.lineEditX = QtWidgets.QLineEdit(self.verticalLayoutWidget) self.lineEditX.setObjectName("lineEditX") self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEditX) self.label_2 = QtWidgets.QLabel(self.verticalLayoutWidget) self.label_2.setObjectName("label_2") self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_2) self.lineEditY = QtWidgets.QLineEdit(self.verticalLayoutWidget) self.lineEditY.setObjectName("lineEditY") self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.lineEditY) self.verticalLayout.addLayout(self.formLayout) self.buttonBox = QtWidgets.QDialogButtonBox(self.verticalLayoutWidget) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Reset) self.buttonBox.setObjectName("buttonBox") self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) self.buttonBox.accepted.connect(Dialog.accept) # type: ignore self.buttonBox.rejected.connect(Dialog.reject) # type: ignore QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): _translate = QtCore.QCoreApplication.translate Dialog.setWindowTitle(_translate("Dialog", "Set Custom Anchor")) self.label.setText(_translate("Dialog", "X:")) self.lineEditX.setText(_translate("Dialog", "0")) self.label_2.setText(_translate("Dialog", "Y:")) self.lineEditY.setText(_translate("Dialog", "0")) asymptote-3.05/GUI/xasyqtui/__init__.py0000644000000000000000000000000015031566355016607 0ustar rootrootasymptote-3.05/GUI/xasyqtui/window1.py0000644000000000000000000016431315031566355016462 0ustar rootroot# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'windows/window1.ui' # # Created by: PyQt5 UI code generator 5.15.11 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1000, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth()) self.centralwidget.setSizePolicy(sizePolicy) self.centralwidget.setMouseTracking(True) self.centralwidget.setObjectName("centralwidget") self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.centralwidget) self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_4.setSpacing(0) self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.mainWidget = QtWidgets.QWidget(self.centralwidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.mainWidget.sizePolicy().hasHeightForWidth()) self.mainWidget.setSizePolicy(sizePolicy) self.mainWidget.setMouseTracking(True) self.mainWidget.setObjectName("mainWidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.mainWidget) self.verticalLayout.setContentsMargins(2, 2, 2, 2) self.verticalLayout.setSpacing(4) self.verticalLayout.setObjectName("verticalLayout") self.menuFrame = QtWidgets.QFrame(self.mainWidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.menuFrame.sizePolicy().hasHeightForWidth()) self.menuFrame.setSizePolicy(sizePolicy) self.menuFrame.setFrameShape(QtWidgets.QFrame.NoFrame) self.menuFrame.setObjectName("menuFrame") self.horizontalLayout = QtWidgets.QHBoxLayout(self.menuFrame) self.horizontalLayout.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setSpacing(4) self.horizontalLayout.setObjectName("horizontalLayout") self.btnUndo = QtWidgets.QPushButton(self.menuFrame) self.btnUndo.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnUndo.sizePolicy().hasHeightForWidth()) self.btnUndo.setSizePolicy(sizePolicy) self.btnUndo.setMaximumSize(QtCore.QSize(25, 25)) self.btnUndo.setBaseSize(QtCore.QSize(32, 32)) self.btnUndo.setText("") icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(":/icons/undo.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnUndo.setIcon(icon) self.btnUndo.setIconSize(QtCore.QSize(16, 16)) self.btnUndo.setFlat(True) self.btnUndo.setObjectName("btnUndo") self.horizontalLayout.addWidget(self.btnUndo) self.btnRedo = QtWidgets.QPushButton(self.menuFrame) self.btnRedo.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnRedo.sizePolicy().hasHeightForWidth()) self.btnRedo.setSizePolicy(sizePolicy) self.btnRedo.setMaximumSize(QtCore.QSize(25, 25)) self.btnRedo.setBaseSize(QtCore.QSize(32, 32)) self.btnRedo.setText("") icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(":/icons/redo.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnRedo.setIcon(icon1) self.btnRedo.setIconSize(QtCore.QSize(16, 16)) self.btnRedo.setFlat(True) self.btnRedo.setObjectName("btnRedo") self.horizontalLayout.addWidget(self.btnRedo) self.btnLoadFile = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnLoadFile.sizePolicy().hasHeightForWidth()) self.btnLoadFile.setSizePolicy(sizePolicy) self.btnLoadFile.setMaximumSize(QtCore.QSize(25, 25)) self.btnLoadFile.setBaseSize(QtCore.QSize(32, 32)) self.btnLoadFile.setText("") icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap(":/icons/android-folder-open.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnLoadFile.setIcon(icon2) self.btnLoadFile.setIconSize(QtCore.QSize(16, 16)) self.btnLoadFile.setFlat(True) self.btnLoadFile.setObjectName("btnLoadFile") self.horizontalLayout.addWidget(self.btnLoadFile) self.btnSave = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnSave.sizePolicy().hasHeightForWidth()) self.btnSave.setSizePolicy(sizePolicy) self.btnSave.setMaximumSize(QtCore.QSize(25, 25)) self.btnSave.setBaseSize(QtCore.QSize(32, 32)) self.btnSave.setText("") icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap(":/icons/save.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnSave.setIcon(icon3) self.btnSave.setIconSize(QtCore.QSize(16, 16)) self.btnSave.setFlat(True) self.btnSave.setObjectName("btnSave") self.horizontalLayout.addWidget(self.btnSave) self.btnViewCode = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnViewCode.sizePolicy().hasHeightForWidth()) self.btnViewCode.setSizePolicy(sizePolicy) self.btnViewCode.setMaximumSize(QtCore.QSize(24, 24)) self.btnViewCode.setBaseSize(QtCore.QSize(20, 20)) self.btnViewCode.setText("") icon4 = QtGui.QIcon() icon4.addPixmap(QtGui.QPixmap(":/icons/code.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnViewCode.setIcon(icon4) self.btnViewCode.setIconSize(QtCore.QSize(16, 16)) self.btnViewCode.setFlat(True) self.btnViewCode.setObjectName("btnViewCode") self.horizontalLayout.addWidget(self.btnViewCode) self.btnQuickScreenshot = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnQuickScreenshot.sizePolicy().hasHeightForWidth()) self.btnQuickScreenshot.setSizePolicy(sizePolicy) self.btnQuickScreenshot.setMaximumSize(QtCore.QSize(25, 25)) self.btnQuickScreenshot.setBaseSize(QtCore.QSize(32, 32)) self.btnQuickScreenshot.setText("") icon5 = QtGui.QIcon() icon5.addPixmap(QtGui.QPixmap(":/icons/android-camera.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnQuickScreenshot.setIcon(icon5) self.btnQuickScreenshot.setIconSize(QtCore.QSize(16, 16)) self.btnQuickScreenshot.setFlat(True) self.btnQuickScreenshot.setObjectName("btnQuickScreenshot") self.horizontalLayout.addWidget(self.btnQuickScreenshot) spacerItem = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.btnDrawAxes = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnDrawAxes.sizePolicy().hasHeightForWidth()) self.btnDrawAxes.setSizePolicy(sizePolicy) self.btnDrawAxes.setMaximumSize(QtCore.QSize(25, 25)) self.btnDrawAxes.setBaseSize(QtCore.QSize(32, 32)) font = QtGui.QFont() font.setFamily("Roboto") font.setBold(True) font.setWeight(75) self.btnDrawAxes.setFont(font) self.btnDrawAxes.setText("") icon6 = QtGui.QIcon() icon6.addPixmap(QtGui.QPixmap(":/icons/plus-round.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnDrawAxes.setIcon(icon6) self.btnDrawAxes.setIconSize(QtCore.QSize(16, 16)) self.btnDrawAxes.setCheckable(True) self.btnDrawAxes.setChecked(True) self.btnDrawAxes.setFlat(True) self.btnDrawAxes.setObjectName("btnDrawAxes") self.horizontalLayout.addWidget(self.btnDrawAxes) self.btnDrawGrid = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnDrawGrid.sizePolicy().hasHeightForWidth()) self.btnDrawGrid.setSizePolicy(sizePolicy) self.btnDrawGrid.setMaximumSize(QtCore.QSize(25, 25)) self.btnDrawGrid.setBaseSize(QtCore.QSize(32, 32)) font = QtGui.QFont() font.setFamily("Roboto") font.setBold(True) font.setWeight(75) self.btnDrawGrid.setFont(font) self.btnDrawGrid.setText("") icon7 = QtGui.QIcon() icon7.addPixmap(QtGui.QPixmap(":/icons/grid.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnDrawGrid.setIcon(icon7) self.btnDrawGrid.setIconSize(QtCore.QSize(16, 16)) self.btnDrawGrid.setCheckable(True) self.btnDrawGrid.setChecked(False) self.btnDrawGrid.setFlat(True) self.btnDrawGrid.setObjectName("btnDrawGrid") self.horizontalLayout.addWidget(self.btnDrawGrid) self.btnSetZoom = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnSetZoom.sizePolicy().hasHeightForWidth()) self.btnSetZoom.setSizePolicy(sizePolicy) self.btnSetZoom.setMaximumSize(QtCore.QSize(25, 25)) self.btnSetZoom.setBaseSize(QtCore.QSize(32, 32)) self.btnSetZoom.setText("") icon8 = QtGui.QIcon() icon8.addPixmap(QtGui.QPixmap(":/icons/magnifying-glass.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnSetZoom.setIcon(icon8) self.btnSetZoom.setIconSize(QtCore.QSize(16, 16)) self.btnSetZoom.setFlat(True) self.btnSetZoom.setObjectName("btnSetZoom") self.horizontalLayout.addWidget(self.btnSetZoom) self.btnPanCenter = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnPanCenter.sizePolicy().hasHeightForWidth()) self.btnPanCenter.setSizePolicy(sizePolicy) self.btnPanCenter.setMaximumSize(QtCore.QSize(25, 25)) self.btnPanCenter.setBaseSize(QtCore.QSize(32, 32)) self.btnPanCenter.setText("") icon9 = QtGui.QIcon() icon9.addPixmap(QtGui.QPixmap(":/icons/center.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnPanCenter.setIcon(icon9) self.btnPanCenter.setIconSize(QtCore.QSize(16, 16)) self.btnPanCenter.setFlat(True) self.btnPanCenter.setObjectName("btnPanCenter") self.horizontalLayout.addWidget(self.btnPanCenter) self.btnResetPan = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnResetPan.sizePolicy().hasHeightForWidth()) self.btnResetPan.setSizePolicy(sizePolicy) self.btnResetPan.setMaximumSize(QtCore.QSize(25, 25)) self.btnResetPan.setBaseSize(QtCore.QSize(32, 32)) self.btnResetPan.setText("") icon10 = QtGui.QIcon() icon10.addPixmap(QtGui.QPixmap(":/icons/centerorigin.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnResetPan.setIcon(icon10) self.btnResetPan.setIconSize(QtCore.QSize(16, 16)) self.btnResetPan.setFlat(True) self.btnResetPan.setObjectName("btnResetPan") self.horizontalLayout.addWidget(self.btnResetPan) self.btnAlignX = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnAlignX.sizePolicy().hasHeightForWidth()) self.btnAlignX.setSizePolicy(sizePolicy) self.btnAlignX.setMaximumSize(QtCore.QSize(32, 25)) self.btnAlignX.setBaseSize(QtCore.QSize(32, 32)) font = QtGui.QFont() font.setFamily("Roboto") font.setBold(True) font.setWeight(75) self.btnAlignX.setFont(font) self.btnAlignX.setIconSize(QtCore.QSize(16, 16)) self.btnAlignX.setCheckable(True) self.btnAlignX.setFlat(True) self.btnAlignX.setObjectName("btnAlignX") self.horizontalLayout.addWidget(self.btnAlignX) self.btnAlignY = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnAlignY.sizePolicy().hasHeightForWidth()) self.btnAlignY.setSizePolicy(sizePolicy) self.btnAlignY.setMaximumSize(QtCore.QSize(32, 25)) self.btnAlignY.setBaseSize(QtCore.QSize(32, 32)) font = QtGui.QFont() font.setFamily("Roboto") font.setBold(True) font.setWeight(75) self.btnAlignY.setFont(font) self.btnAlignY.setIconSize(QtCore.QSize(16, 16)) self.btnAlignY.setCheckable(True) self.btnAlignY.setFlat(True) self.btnAlignY.setObjectName("btnAlignY") self.horizontalLayout.addWidget(self.btnAlignY) spacerItem1 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) self.btnSelectEdit = QtWidgets.QPushButton(self.menuFrame) self.btnSelectEdit.setEnabled(True) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnSelectEdit.sizePolicy().hasHeightForWidth()) self.btnSelectEdit.setSizePolicy(sizePolicy) self.btnSelectEdit.setMaximumSize(QtCore.QSize(25, 25)) self.btnSelectEdit.setText("") icon11 = QtGui.QIcon() icon11.addPixmap(QtGui.QPixmap(":/icons/edit.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnSelectEdit.setIcon(icon11) self.btnSelectEdit.setIconSize(QtCore.QSize(16, 16)) self.btnSelectEdit.setCheckable(True) self.btnSelectEdit.setFlat(True) self.btnSelectEdit.setObjectName("btnSelectEdit") self.horizontalLayout.addWidget(self.btnSelectEdit) self.btnDeleteMode = QtWidgets.QPushButton(self.menuFrame) self.btnDeleteMode.setEnabled(True) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnDeleteMode.sizePolicy().hasHeightForWidth()) self.btnDeleteMode.setSizePolicy(sizePolicy) self.btnDeleteMode.setMaximumSize(QtCore.QSize(25, 25)) self.btnDeleteMode.setBaseSize(QtCore.QSize(32, 32)) self.btnDeleteMode.setText("") icon12 = QtGui.QIcon() icon12.addPixmap(QtGui.QPixmap(":/icons/android-delete.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnDeleteMode.setIcon(icon12) self.btnDeleteMode.setIconSize(QtCore.QSize(16, 16)) self.btnDeleteMode.setCheckable(True) self.btnDeleteMode.setFlat(True) self.btnDeleteMode.setObjectName("btnDeleteMode") self.horizontalLayout.addWidget(self.btnDeleteMode) spacerItem2 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem2) self.btnPan = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnPan.sizePolicy().hasHeightForWidth()) self.btnPan.setSizePolicy(sizePolicy) self.btnPan.setMaximumSize(QtCore.QSize(25, 25)) self.btnPan.setBaseSize(QtCore.QSize(32, 32)) self.btnPan.setText("") icon13 = QtGui.QIcon() icon13.addPixmap(QtGui.QPixmap(":/icons/android-hand.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnPan.setIcon(icon13) self.btnPan.setIconSize(QtCore.QSize(16, 16)) self.btnPan.setCheckable(True) self.btnPan.setFlat(True) self.btnPan.setObjectName("btnPan") self.horizontalLayout.addWidget(self.btnPan) self.btnTranslate = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnTranslate.sizePolicy().hasHeightForWidth()) self.btnTranslate.setSizePolicy(sizePolicy) self.btnTranslate.setMaximumSize(QtCore.QSize(25, 25)) self.btnTranslate.setBaseSize(QtCore.QSize(32, 32)) self.btnTranslate.setText("") icon14 = QtGui.QIcon() icon14.addPixmap(QtGui.QPixmap(":/icons/arrow-move.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnTranslate.setIcon(icon14) self.btnTranslate.setIconSize(QtCore.QSize(16, 16)) self.btnTranslate.setCheckable(True) self.btnTranslate.setChecked(True) self.btnTranslate.setFlat(True) self.btnTranslate.setObjectName("btnTranslate") self.horizontalLayout.addWidget(self.btnTranslate) self.btnScale = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnScale.sizePolicy().hasHeightForWidth()) self.btnScale.setSizePolicy(sizePolicy) self.btnScale.setMaximumSize(QtCore.QSize(25, 25)) self.btnScale.setBaseSize(QtCore.QSize(32, 32)) self.btnScale.setText("") icon15 = QtGui.QIcon() icon15.addPixmap(QtGui.QPixmap(":/icons/arrow-resize.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnScale.setIcon(icon15) self.btnScale.setIconSize(QtCore.QSize(16, 16)) self.btnScale.setCheckable(True) self.btnScale.setFlat(True) self.btnScale.setObjectName("btnScale") self.horizontalLayout.addWidget(self.btnScale) self.btnRotate = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnRotate.sizePolicy().hasHeightForWidth()) self.btnRotate.setSizePolicy(sizePolicy) self.btnRotate.setMaximumSize(QtCore.QSize(25, 25)) self.btnRotate.setBaseSize(QtCore.QSize(32, 32)) self.btnRotate.setText("") icon16 = QtGui.QIcon() icon16.addPixmap(QtGui.QPixmap(":/icons/android-refresh.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnRotate.setIcon(icon16) self.btnRotate.setIconSize(QtCore.QSize(16, 16)) self.btnRotate.setCheckable(True) self.btnRotate.setFlat(True) self.btnRotate.setObjectName("btnRotate") self.horizontalLayout.addWidget(self.btnRotate) spacerItem3 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem3) self.btnAnchor = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnAnchor.sizePolicy().hasHeightForWidth()) self.btnAnchor.setSizePolicy(sizePolicy) self.btnAnchor.setMaximumSize(QtCore.QSize(25, 25)) self.btnAnchor.setBaseSize(QtCore.QSize(32, 32)) self.btnAnchor.setText("") icon17 = QtGui.QIcon() icon17.addPixmap(QtGui.QPixmap(":/icons/anchor.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnAnchor.setIcon(icon17) self.btnAnchor.setIconSize(QtCore.QSize(16, 16)) self.btnAnchor.setCheckable(True) self.btnAnchor.setChecked(False) self.btnAnchor.setFlat(True) self.btnAnchor.setObjectName("btnAnchor") self.horizontalLayout.addWidget(self.btnAnchor) self.comboAnchor = QtWidgets.QComboBox(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.comboAnchor.sizePolicy().hasHeightForWidth()) self.comboAnchor.setSizePolicy(sizePolicy) self.comboAnchor.setMinimumSize(QtCore.QSize(127, 0)) self.comboAnchor.setMaximumSize(QtCore.QSize(127, 25)) self.comboAnchor.setLayoutDirection(QtCore.Qt.LeftToRight) self.comboAnchor.setEditable(False) self.comboAnchor.setInsertPolicy(QtWidgets.QComboBox.InsertAtCurrent) self.comboAnchor.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContentsOnFirstShow) self.comboAnchor.setIconSize(QtCore.QSize(0, 0)) self.comboAnchor.setDuplicatesEnabled(False) self.comboAnchor.setFrame(False) self.comboAnchor.setModelColumn(0) self.comboAnchor.setObjectName("comboAnchor") self.comboAnchor.addItem("") self.comboAnchor.addItem("") self.comboAnchor.addItem("") self.comboAnchor.addItem("") self.comboAnchor.addItem("") self.comboAnchor.addItem("") self.comboAnchor.addItem("") self.horizontalLayout.addWidget(self.comboAnchor) self.btnToggleVisible = QtWidgets.QPushButton(self.menuFrame) self.btnToggleVisible.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnToggleVisible.sizePolicy().hasHeightForWidth()) self.btnToggleVisible.setSizePolicy(sizePolicy) self.btnToggleVisible.setMaximumSize(QtCore.QSize(25, 25)) self.btnToggleVisible.setBaseSize(QtCore.QSize(32, 32)) self.btnToggleVisible.setText("") icon18 = QtGui.QIcon() icon18.addPixmap(QtGui.QPixmap(":/icons/eye.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnToggleVisible.setIcon(icon18) self.btnToggleVisible.setIconSize(QtCore.QSize(16, 16)) self.btnToggleVisible.setCheckable(False) self.btnToggleVisible.setFlat(True) self.btnToggleVisible.setObjectName("btnToggleVisible") self.horizontalLayout.addWidget(self.btnToggleVisible) self.btnCustTransform = QtWidgets.QPushButton(self.menuFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnCustTransform.sizePolicy().hasHeightForWidth()) self.btnCustTransform.setSizePolicy(sizePolicy) self.btnCustTransform.setMaximumSize(QtCore.QSize(25, 25)) self.btnCustTransform.setBaseSize(QtCore.QSize(32, 32)) self.btnCustTransform.setText("") icon19 = QtGui.QIcon() icon19.addPixmap(QtGui.QPixmap(":/icons/android-expand.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnCustTransform.setIcon(icon19) self.btnCustTransform.setIconSize(QtCore.QSize(16, 16)) self.btnCustTransform.setFlat(True) self.btnCustTransform.setObjectName("btnCustTransform") self.horizontalLayout.addWidget(self.btnCustTransform) self.btnSendBackwards = QtWidgets.QPushButton(self.menuFrame) self.btnSendBackwards.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnSendBackwards.sizePolicy().hasHeightForWidth()) self.btnSendBackwards.setSizePolicy(sizePolicy) self.btnSendBackwards.setMaximumSize(QtCore.QSize(25, 25)) self.btnSendBackwards.setBaseSize(QtCore.QSize(32, 32)) self.btnSendBackwards.setText("") icon20 = QtGui.QIcon() icon20.addPixmap(QtGui.QPixmap(":/icons/chevron-with-circle-left.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnSendBackwards.setIcon(icon20) self.btnSendBackwards.setIconSize(QtCore.QSize(16, 16)) self.btnSendBackwards.setFlat(True) self.btnSendBackwards.setObjectName("btnSendBackwards") self.horizontalLayout.addWidget(self.btnSendBackwards) self.btnSendForwards = QtWidgets.QPushButton(self.menuFrame) self.btnSendForwards.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnSendForwards.sizePolicy().hasHeightForWidth()) self.btnSendForwards.setSizePolicy(sizePolicy) self.btnSendForwards.setMaximumSize(QtCore.QSize(25, 25)) self.btnSendForwards.setBaseSize(QtCore.QSize(32, 32)) self.btnSendForwards.setText("") icon21 = QtGui.QIcon() icon21.addPixmap(QtGui.QPixmap(":/icons/chevron-with-circle-right.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnSendForwards.setIcon(icon21) self.btnSendForwards.setIconSize(QtCore.QSize(16, 16)) self.btnSendForwards.setFlat(True) self.btnSendForwards.setObjectName("btnSendForwards") self.horizontalLayout.addWidget(self.btnSendForwards) spacerItem4 = QtWidgets.QSpacerItem(40, 25, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem4) self.btnUndo.raise_() self.btnRedo.raise_() self.btnLoadFile.raise_() self.btnSave.raise_() self.btnViewCode.raise_() self.btnQuickScreenshot.raise_() self.btnDrawAxes.raise_() self.btnDrawGrid.raise_() self.btnSetZoom.raise_() self.btnPanCenter.raise_() self.btnResetPan.raise_() self.btnAlignX.raise_() self.btnAlignY.raise_() self.btnPan.raise_() self.btnTranslate.raise_() self.btnScale.raise_() self.btnCustTransform.raise_() self.btnSendBackwards.raise_() self.btnSendForwards.raise_() self.comboAnchor.raise_() self.btnToggleVisible.raise_() self.btnAnchor.raise_() self.btnRotate.raise_() self.btnSelectEdit.raise_() self.btnDeleteMode.raise_() self.verticalLayout.addWidget(self.menuFrame) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setSpacing(4) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setSpacing(3) self.verticalLayout_2.setObjectName("verticalLayout_2") self.addOption = QtWidgets.QHBoxLayout() self.addOption.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint) self.addOption.setContentsMargins(6, -1, -1, 0) self.addOption.setSpacing(6) self.addOption.setObjectName("addOption") self.btnFill = QtWidgets.QPushButton(self.mainWidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnFill.sizePolicy().hasHeightForWidth()) self.btnFill.setSizePolicy(sizePolicy) self.btnFill.setMaximumSize(QtCore.QSize(32, 32)) self.btnFill.setBaseSize(QtCore.QSize(32, 32)) self.btnFill.setAutoFillBackground(False) self.btnFill.setStyleSheet("") self.btnFill.setText("") icon22 = QtGui.QIcon() icon22.addPixmap(QtGui.QPixmap(":/icons/bucket.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) icon22.addPixmap(QtGui.QPixmap(":/icons/filledbucket.svg"), QtGui.QIcon.Normal, QtGui.QIcon.On) self.btnFill.setIcon(icon22) self.btnFill.setIconSize(QtCore.QSize(16, 16)) self.btnFill.setCheckable(True) self.btnFill.setDefault(False) self.btnFill.setFlat(True) self.btnFill.setObjectName("btnFill") self.addOption.addWidget(self.btnFill) self.addOptionLayout = QtWidgets.QGridLayout() self.addOptionLayout.setSpacing(6) self.addOptionLayout.setObjectName("addOptionLayout") self.addOption.addLayout(self.addOptionLayout) spacerItem5 = QtWidgets.QSpacerItem(40, 35, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Minimum) self.addOption.addItem(spacerItem5) self.label = QtWidgets.QLabel(self.mainWidget) self.label.setObjectName("label") self.addOption.addWidget(self.label) self.txtLineWidth = QtWidgets.QLineEdit(self.mainWidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.txtLineWidth.sizePolicy().hasHeightForWidth()) self.txtLineWidth.setSizePolicy(sizePolicy) self.txtLineWidth.setMaximumSize(QtCore.QSize(75, 16777215)) self.txtLineWidth.setObjectName("txtLineWidth") self.addOption.addWidget(self.txtLineWidth) self.frameCurrColor = QtWidgets.QFrame(self.mainWidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.frameCurrColor.sizePolicy().hasHeightForWidth()) self.frameCurrColor.setSizePolicy(sizePolicy) self.frameCurrColor.setMinimumSize(QtCore.QSize(15, 15)) self.frameCurrColor.setAutoFillBackground(False) self.frameCurrColor.setStyleSheet("QFrame{ \n" "padding: 4.0;\n" "border-radius: 3.0; \n" "background: rgb(0, 0, 0)\n" "}") self.frameCurrColor.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frameCurrColor.setFrameShadow(QtWidgets.QFrame.Sunken) self.frameCurrColor.setObjectName("frameCurrColor") self.addOption.addWidget(self.frameCurrColor) self.btnSelectColor = QtWidgets.QPushButton(self.mainWidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnSelectColor.sizePolicy().hasHeightForWidth()) self.btnSelectColor.setSizePolicy(sizePolicy) self.btnSelectColor.setMaximumSize(QtCore.QSize(25, 25)) self.btnSelectColor.setBaseSize(QtCore.QSize(32, 32)) self.btnSelectColor.setAutoFillBackground(False) self.btnSelectColor.setStyleSheet("") self.btnSelectColor.setText("") icon23 = QtGui.QIcon() icon23.addPixmap(QtGui.QPixmap(":/icons/android-color-palette.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnSelectColor.setIcon(icon23) self.btnSelectColor.setIconSize(QtCore.QSize(16, 16)) self.btnSelectColor.setDefault(False) self.btnSelectColor.setFlat(True) self.btnSelectColor.setObjectName("btnSelectColor") self.addOption.addWidget(self.btnSelectColor) self.verticalLayout_2.addLayout(self.addOption) self.horizontalLayout_7 = QtWidgets.QHBoxLayout() self.horizontalLayout_7.setContentsMargins(-1, 6, -1, -1) self.horizontalLayout_7.setSpacing(6) self.horizontalLayout_7.setObjectName("horizontalLayout_7") self.formFrame = QtWidgets.QFrame(self.mainWidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.formFrame.sizePolicy().hasHeightForWidth()) self.formFrame.setSizePolicy(sizePolicy) self.formFrame.setFrameShape(QtWidgets.QFrame.NoFrame) self.formFrame.setFrameShadow(QtWidgets.QFrame.Plain) self.formFrame.setLineWidth(0) self.formFrame.setObjectName("formFrame") self.formLayout = QtWidgets.QFormLayout(self.formFrame) self.formLayout.setContentsMargins(0, 0, 0, 0) self.formLayout.setSpacing(0) self.formLayout.setObjectName("formLayout") self.btnOpenPoly = QtWidgets.QPushButton(self.formFrame) self.btnOpenPoly.setEnabled(True) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnOpenPoly.sizePolicy().hasHeightForWidth()) self.btnOpenPoly.setSizePolicy(sizePolicy) self.btnOpenPoly.setMaximumSize(QtCore.QSize(32, 32)) self.btnOpenPoly.setText("") icon24 = QtGui.QIcon() icon24.addPixmap(QtGui.QPixmap(":/icons/openpolygon.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnOpenPoly.setIcon(icon24) self.btnOpenPoly.setIconSize(QtCore.QSize(16, 16)) self.btnOpenPoly.setCheckable(True) self.btnOpenPoly.setFlat(True) self.btnOpenPoly.setObjectName("btnOpenPoly") self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.btnOpenPoly) self.btnClosedPoly = QtWidgets.QPushButton(self.formFrame) self.btnClosedPoly.setEnabled(True) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnClosedPoly.sizePolicy().hasHeightForWidth()) self.btnClosedPoly.setSizePolicy(sizePolicy) self.btnClosedPoly.setMaximumSize(QtCore.QSize(32, 32)) self.btnClosedPoly.setText("") icon25 = QtGui.QIcon() icon25.addPixmap(QtGui.QPixmap(":/icons/closedpolygon.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnClosedPoly.setIcon(icon25) self.btnClosedPoly.setIconSize(QtCore.QSize(16, 16)) self.btnClosedPoly.setCheckable(True) self.btnClosedPoly.setFlat(True) self.btnClosedPoly.setObjectName("btnClosedPoly") self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.btnClosedPoly) self.btnOpenCurve = QtWidgets.QPushButton(self.formFrame) self.btnOpenCurve.setEnabled(True) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnOpenCurve.sizePolicy().hasHeightForWidth()) self.btnOpenCurve.setSizePolicy(sizePolicy) self.btnOpenCurve.setMaximumSize(QtCore.QSize(32, 32)) self.btnOpenCurve.setText("") icon26 = QtGui.QIcon() icon26.addPixmap(QtGui.QPixmap(":/icons/opencurve.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnOpenCurve.setIcon(icon26) self.btnOpenCurve.setIconSize(QtCore.QSize(16, 16)) self.btnOpenCurve.setCheckable(True) self.btnOpenCurve.setFlat(True) self.btnOpenCurve.setObjectName("btnOpenCurve") self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.btnOpenCurve) self.btnClosedCurve = QtWidgets.QPushButton(self.formFrame) self.btnClosedCurve.setEnabled(True) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnClosedCurve.sizePolicy().hasHeightForWidth()) self.btnClosedCurve.setSizePolicy(sizePolicy) self.btnClosedCurve.setMaximumSize(QtCore.QSize(32, 32)) self.btnClosedCurve.setText("") icon27 = QtGui.QIcon() icon27.addPixmap(QtGui.QPixmap(":/icons/closedcurve.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnClosedCurve.setIcon(icon27) self.btnClosedCurve.setIconSize(QtCore.QSize(16, 16)) self.btnClosedCurve.setCheckable(True) self.btnClosedCurve.setFlat(True) self.btnClosedCurve.setObjectName("btnClosedCurve") self.formLayout.setWidget(7, QtWidgets.QFormLayout.LabelRole, self.btnClosedCurve) self.btnAddPoly = QtWidgets.QPushButton(self.formFrame) self.btnAddPoly.setEnabled(True) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnAddPoly.sizePolicy().hasHeightForWidth()) self.btnAddPoly.setSizePolicy(sizePolicy) self.btnAddPoly.setMaximumSize(QtCore.QSize(32, 32)) self.btnAddPoly.setText("") icon28 = QtGui.QIcon() icon28.addPixmap(QtGui.QPixmap(":/icons/triangle-stroked-15.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnAddPoly.setIcon(icon28) self.btnAddPoly.setIconSize(QtCore.QSize(16, 16)) self.btnAddPoly.setCheckable(True) self.btnAddPoly.setFlat(True) self.btnAddPoly.setObjectName("btnAddPoly") self.formLayout.setWidget(8, QtWidgets.QFormLayout.LabelRole, self.btnAddPoly) self.btnAddCircle = QtWidgets.QPushButton(self.formFrame) self.btnAddCircle.setEnabled(True) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnAddCircle.sizePolicy().hasHeightForWidth()) self.btnAddCircle.setSizePolicy(sizePolicy) self.btnAddCircle.setMaximumSize(QtCore.QSize(32, 32)) self.btnAddCircle.setText("") icon29 = QtGui.QIcon() icon29.addPixmap(QtGui.QPixmap(":/icons/circle.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnAddCircle.setIcon(icon29) self.btnAddCircle.setIconSize(QtCore.QSize(16, 16)) self.btnAddCircle.setCheckable(True) self.btnAddCircle.setFlat(True) self.btnAddCircle.setObjectName("btnAddCircle") self.formLayout.setWidget(10, QtWidgets.QFormLayout.LabelRole, self.btnAddCircle) self.btnAddLabel = QtWidgets.QPushButton(self.formFrame) self.btnAddLabel.setEnabled(True) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnAddLabel.sizePolicy().hasHeightForWidth()) self.btnAddLabel.setSizePolicy(sizePolicy) self.btnAddLabel.setMaximumSize(QtCore.QSize(32, 32)) self.btnAddLabel.setText("") icon30 = QtGui.QIcon() icon30.addPixmap(QtGui.QPixmap(":/icons/text.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnAddLabel.setIcon(icon30) self.btnAddLabel.setIconSize(QtCore.QSize(16, 16)) self.btnAddLabel.setCheckable(True) self.btnAddLabel.setFlat(True) self.btnAddLabel.setObjectName("btnAddLabel") self.formLayout.setWidget(11, QtWidgets.QFormLayout.LabelRole, self.btnAddLabel) self.btnAddFreehand = QtWidgets.QPushButton(self.formFrame) self.btnAddFreehand.setEnabled(True) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnAddFreehand.sizePolicy().hasHeightForWidth()) self.btnAddFreehand.setSizePolicy(sizePolicy) self.btnAddFreehand.setMaximumSize(QtCore.QSize(32, 32)) self.btnAddFreehand.setText("") icon31 = QtGui.QIcon() icon31.addPixmap(QtGui.QPixmap(":/icons/brush.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnAddFreehand.setIcon(icon31) self.btnAddFreehand.setIconSize(QtCore.QSize(16, 16)) self.btnAddFreehand.setCheckable(True) self.btnAddFreehand.setFlat(True) self.btnAddFreehand.setObjectName("btnAddFreehand") self.formLayout.setWidget(12, QtWidgets.QFormLayout.LabelRole, self.btnAddFreehand) self.horizontalLayout_7.addWidget(self.formFrame) self.imgFrame = QtWidgets.QFrame(self.mainWidget) self.imgFrame.setMinimumSize(QtCore.QSize(0, 6)) self.imgFrame.setMouseTracking(True) self.imgFrame.setFrameShape(QtWidgets.QFrame.NoFrame) self.imgFrame.setFrameShadow(QtWidgets.QFrame.Raised) self.imgFrame.setObjectName("imgFrame") self.gridLayout = QtWidgets.QGridLayout(self.imgFrame) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setSpacing(0) self.gridLayout.setObjectName("gridLayout") self.imgLabel = QtWidgets.QLabel(self.imgFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.imgLabel.sizePolicy().hasHeightForWidth()) self.imgLabel.setSizePolicy(sizePolicy) self.imgLabel.setMouseTracking(True) self.imgLabel.setFrameShape(QtWidgets.QFrame.Panel) self.imgLabel.setText("") self.imgLabel.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.imgLabel.setObjectName("imgLabel") self.gridLayout.addWidget(self.imgLabel, 0, 1, 1, 1) self.horizontalLayout_7.addWidget(self.imgFrame) self.verticalLayout_2.addLayout(self.horizontalLayout_7) self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint) self.horizontalLayout_3.setContentsMargins(-1, 0, -1, -1) self.horizontalLayout_3.setSpacing(0) self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.btnTogglePython = QtWidgets.QPushButton(self.mainWidget) self.btnTogglePython.setEnabled(True) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnTogglePython.sizePolicy().hasHeightForWidth()) self.btnTogglePython.setSizePolicy(sizePolicy) self.btnTogglePython.setText("") icon32 = QtGui.QIcon() icon32.addPixmap(QtGui.QPixmap(":/icons/social-python.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnTogglePython.setIcon(icon32) self.btnTogglePython.setIconSize(QtCore.QSize(16, 16)) self.btnTogglePython.setCheckable(True) self.btnTogglePython.setFlat(True) self.btnTogglePython.setObjectName("btnTogglePython") self.horizontalLayout_3.addWidget(self.btnTogglePython) self.txtTerminalPrompt = QtWidgets.QLineEdit(self.mainWidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.txtTerminalPrompt.sizePolicy().hasHeightForWidth()) self.txtTerminalPrompt.setSizePolicy(sizePolicy) self.txtTerminalPrompt.setObjectName("txtTerminalPrompt") self.horizontalLayout_3.addWidget(self.txtTerminalPrompt) self.btnEnterCommand = QtWidgets.QPushButton(self.mainWidget) self.btnEnterCommand.setEnabled(True) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnEnterCommand.sizePolicy().hasHeightForWidth()) self.btnEnterCommand.setSizePolicy(sizePolicy) self.btnEnterCommand.setText("") icon33 = QtGui.QIcon() icon33.addPixmap(QtGui.QPixmap(":/icons/subdirectory-left.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnEnterCommand.setIcon(icon33) self.btnEnterCommand.setIconSize(QtCore.QSize(16, 16)) self.btnEnterCommand.setFlat(True) self.btnEnterCommand.setObjectName("btnEnterCommand") self.horizontalLayout_3.addWidget(self.btnEnterCommand) self.verticalLayout_2.addLayout(self.horizontalLayout_3) self.horizontalLayout_2.addLayout(self.verticalLayout_2) self.verticalLayout.addLayout(self.horizontalLayout_2) self.horizontalLayout_4.addWidget(self.mainWidget) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 26)) self.menubar.setObjectName("menubar") self.menuFIle = QtWidgets.QMenu(self.menubar) self.menuFIle.setObjectName("menuFIle") self.menuOpenRecent = QtWidgets.QMenu(self.menuFIle) self.menuOpenRecent.setObjectName("menuOpenRecent") self.menuEdit = QtWidgets.QMenu(self.menubar) self.menuEdit.setObjectName("menuEdit") self.menuOptions = QtWidgets.QMenu(self.menubar) self.menuOptions.setObjectName("menuOptions") self.menuHelp = QtWidgets.QMenu(self.menubar) self.menuHelp.setObjectName("menuHelp") self.menuTools = QtWidgets.QMenu(self.menubar) self.menuTools.setObjectName("menuTools") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setSizeGripEnabled(False) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.actionAbout = QtWidgets.QAction(MainWindow) self.actionAbout.setObjectName("actionAbout") self.actionManual = QtWidgets.QAction(MainWindow) self.actionManual.setObjectName("actionManual") self.actionSettings = QtWidgets.QAction(MainWindow) self.actionSettings.setObjectName("actionSettings") self.actionPause = QtWidgets.QAction(MainWindow) self.actionPause.setObjectName("actionPause") self.actionSaveAs = QtWidgets.QAction(MainWindow) self.actionSaveAs.setObjectName("actionSaveAs") self.actionEnterCommand = QtWidgets.QAction(MainWindow) self.actionEnterCommand.setObjectName("actionEnterCommand") self.actionQuit = QtWidgets.QAction(MainWindow) self.actionQuit.setObjectName("actionQuit") self.actionUndo = QtWidgets.QAction(MainWindow) self.actionUndo.setEnabled(False) self.actionUndo.setObjectName("actionUndo") self.actionRedo = QtWidgets.QAction(MainWindow) self.actionRedo.setEnabled(False) self.actionRedo.setObjectName("actionRedo") self.actionShow_Grid = QtWidgets.QAction(MainWindow) self.actionShow_Grid.setObjectName("actionShow_Grid") self.actionShow_Local_Grid = QtWidgets.QAction(MainWindow) self.actionShow_Local_Grid.setObjectName("actionShow_Local_Grid") self.actionTransform = QtWidgets.QAction(MainWindow) self.actionTransform.setObjectName("actionTransform") self.actionExportAsymptote = QtWidgets.QAction(MainWindow) self.actionExportAsymptote.setObjectName("actionExportAsymptote") self.actionSave = QtWidgets.QAction(MainWindow) self.actionSave.setObjectName("actionSave") self.actionOpen = QtWidgets.QAction(MainWindow) self.actionOpen.setObjectName("actionOpen") self.actionClearRecent = QtWidgets.QAction(MainWindow) self.actionClearRecent.setObjectName("actionClearRecent") self.actionNewFile = QtWidgets.QAction(MainWindow) self.actionNewFile.setObjectName("actionNewFile") self.actionExportToAsy = QtWidgets.QAction(MainWindow) self.actionExportToAsy.setObjectName("actionExportToAsy") self.actionKeymaps = QtWidgets.QAction(MainWindow) self.actionKeymaps.setObjectName("actionKeymaps") self.menuOpenRecent.addSeparator() self.menuOpenRecent.addAction(self.actionClearRecent) self.menuFIle.addAction(self.actionNewFile) self.menuFIle.addAction(self.actionOpen) self.menuFIle.addAction(self.menuOpenRecent.menuAction()) self.menuFIle.addAction(self.actionSave) self.menuFIle.addAction(self.actionSaveAs) self.menuFIle.addAction(self.actionExportToAsy) self.menuFIle.addAction(self.actionExportAsymptote) self.menuFIle.addSeparator() self.menuFIle.addAction(self.actionQuit) self.menuEdit.addAction(self.actionUndo) self.menuEdit.addAction(self.actionRedo) self.menuEdit.addSeparator() self.menuOptions.addAction(self.actionSettings) self.menuOptions.addAction(self.actionKeymaps) self.menuHelp.addAction(self.actionManual) self.menuHelp.addAction(self.actionAbout) self.menuTools.addAction(self.actionEnterCommand) self.menubar.addAction(self.menuFIle.menuAction()) self.menubar.addAction(self.menuEdit.menuAction()) self.menubar.addAction(self.menuOptions.menuAction()) self.menubar.addAction(self.menuTools.menuAction()) self.menubar.addAction(self.menuHelp.menuAction()) self.retranslateUi(MainWindow) self.comboAnchor.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "xasy")) self.btnUndo.setToolTip(_translate("MainWindow", "Undo")) self.btnRedo.setToolTip(_translate("MainWindow", "Redo")) self.btnLoadFile.setToolTip(_translate("MainWindow", "

    Open file

    ")) self.btnSave.setToolTip(_translate("MainWindow", "

    Save file

    ")) self.btnViewCode.setToolTip(_translate("MainWindow", "

    Edit code

    ")) self.btnQuickScreenshot.setToolTip(_translate("MainWindow", "

    Screenshot

    ")) self.btnDrawAxes.setToolTip(_translate("MainWindow", "

    Toggle display axes

    ")) self.btnDrawGrid.setToolTip(_translate("MainWindow", "

    Toggle grid

    ")) self.btnSetZoom.setToolTip(_translate("MainWindow", "Zoom")) self.btnPanCenter.setToolTip(_translate("MainWindow", "

    Center

    ")) self.btnResetPan.setToolTip(_translate("MainWindow", "

    Center about origin

    ")) self.btnAlignX.setToolTip(_translate("MainWindow", "

    Lock transform to X axis

    ")) self.btnAlignX.setText(_translate("MainWindow", "X")) self.btnAlignY.setToolTip(_translate("MainWindow", "

    Lock transform to Y axis

    ")) self.btnAlignY.setText(_translate("MainWindow", "Y")) self.btnSelectEdit.setToolTip(_translate("MainWindow", "

    Bézier editor

    ")) self.btnDeleteMode.setToolTip(_translate("MainWindow", "

    Delete

    ")) self.btnPan.setToolTip(_translate("MainWindow", "Pan")) self.btnTranslate.setToolTip(_translate("MainWindow", "Translate")) self.btnScale.setToolTip(_translate("MainWindow", "Scale")) self.btnRotate.setToolTip(_translate("MainWindow", "Rotate")) self.btnAnchor.setToolTip(_translate("MainWindow", "

    Set custom anchor

    ")) self.comboAnchor.setToolTip(_translate("MainWindow", "

    Anchor

    ")) self.comboAnchor.setCurrentText(_translate("MainWindow", "Center")) self.comboAnchor.setItemText(0, _translate("MainWindow", "Center")) self.comboAnchor.setItemText(1, _translate("MainWindow", "Origin")) self.comboAnchor.setItemText(2, _translate("MainWindow", "Top Left")) self.comboAnchor.setItemText(3, _translate("MainWindow", "Top Right")) self.comboAnchor.setItemText(4, _translate("MainWindow", "Bottom Right")) self.comboAnchor.setItemText(5, _translate("MainWindow", "Bottom Left")) self.comboAnchor.setItemText(6, _translate("MainWindow", "Custom")) self.btnCustTransform.setToolTip(_translate("MainWindow", "


    ")) self.btnSendBackwards.setToolTip(_translate("MainWindow", "


    ")) self.btnSendForwards.setToolTip(_translate("MainWindow", "Translate")) self.btnFill.setToolTip(_translate("MainWindow", "

    Toggle fill/outline

    ")) self.label.setText(_translate("MainWindow", "Line Width:")) self.txtLineWidth.setToolTip(_translate("MainWindow", "

    Current pen width

    ")) self.frameCurrColor.setToolTip(_translate("MainWindow", "

    Current pen color

    ")) self.btnSelectColor.setToolTip(_translate("MainWindow", "

    Set color

    ")) self.btnOpenPoly.setToolTip(_translate("MainWindow", "

    Open polygon

    ")) self.btnClosedPoly.setToolTip(_translate("MainWindow", "

    Closed polygon

    ")) self.btnOpenCurve.setToolTip(_translate("MainWindow", "

    Open Bézier curve

    ")) self.btnClosedCurve.setToolTip(_translate("MainWindow", "

    Closed Bézier curve

    ")) self.btnAddPoly.setToolTip(_translate("MainWindow", "

    Regular polygon

    ")) self.btnAddCircle.setToolTip(_translate("MainWindow", "

    Circle

    ")) self.btnAddLabel.setToolTip(_translate("MainWindow", "

    Text

    ")) self.btnAddFreehand.setToolTip(_translate("MainWindow", "

    Freehand

    ")) self.menuFIle.setTitle(_translate("MainWindow", "&File")) self.menuOpenRecent.setTitle(_translate("MainWindow", "Open Recent")) self.menuEdit.setTitle(_translate("MainWindow", "&Edit")) self.menuOptions.setTitle(_translate("MainWindow", "Optio&ns")) self.menuHelp.setTitle(_translate("MainWindow", "&Help")) self.menuTools.setTitle(_translate("MainWindow", "&Tools")) self.actionAbout.setText(_translate("MainWindow", "&About")) self.actionManual.setText(_translate("MainWindow", "&Manual")) self.actionSettings.setText(_translate("MainWindow", "&Settings")) self.actionPause.setText(_translate("MainWindow", "Pause ")) self.actionSaveAs.setText(_translate("MainWindow", "&Save as")) self.actionEnterCommand.setText(_translate("MainWindow", "&Enter Command")) self.actionQuit.setText(_translate("MainWindow", "&Quit")) self.actionUndo.setText(_translate("MainWindow", "&Undo")) self.actionRedo.setText(_translate("MainWindow", "&Redo")) self.actionShow_Grid.setText(_translate("MainWindow", "&Show Grid")) self.actionShow_Local_Grid.setText(_translate("MainWindow", "Show &Local Grid")) self.actionTransform.setText(_translate("MainWindow", "&Transform")) self.actionExportAsymptote.setText(_translate("MainWindow", "Export as...")) self.actionSave.setText(_translate("MainWindow", "Save")) self.actionOpen.setText(_translate("MainWindow", "Open")) self.actionClearRecent.setText(_translate("MainWindow", "Clear Menu")) self.actionNewFile.setText(_translate("MainWindow", "New File")) self.actionExportToAsy.setText(_translate("MainWindow", "Export as Asy")) self.actionKeymaps.setText(_translate("MainWindow", "&Keymaps")) from xasyicons import icons_rc asymptote-3.05/GUI/xasyqtui/widgetPointEditor.py0000644000000000000000000001124515031566355020531 0ustar rootroot# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'windows/widgetPointEditor.ui' # # Created by: PyQt5 UI code generator 5.15.11 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(324, 67) self.verticalLayout = QtWidgets.QVBoxLayout(Form) self.verticalLayout.setObjectName("verticalLayout") self.nameLabel = QtWidgets.QLabel(Form) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.nameLabel.sizePolicy().hasHeightForWidth()) self.nameLabel.setSizePolicy(sizePolicy) self.nameLabel.setObjectName("nameLabel") self.verticalLayout.addWidget(self.nameLabel) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.lineXorA = QtWidgets.QLineEdit(Form) self.lineXorA.setEnabled(False) self.lineXorA.setReadOnly(False) self.lineXorA.setObjectName("lineXorA") self.horizontalLayout.addWidget(self.lineXorA) self.lineYorM = QtWidgets.QLineEdit(Form) self.lineYorM.setEnabled(False) self.lineYorM.setAutoFillBackground(False) self.lineYorM.setReadOnly(False) self.lineYorM.setObjectName("lineYorM") self.horizontalLayout.addWidget(self.lineYorM) self.btnRelative = QtWidgets.QPushButton(Form) self.btnRelative.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnRelative.sizePolicy().hasHeightForWidth()) self.btnRelative.setSizePolicy(sizePolicy) self.btnRelative.setText("") icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(":/icons/android-locate.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnRelative.setIcon(icon) self.btnRelative.setCheckable(True) self.btnRelative.setFlat(False) self.btnRelative.setObjectName("btnRelative") self.horizontalLayout.addWidget(self.btnRelative) self.btnPolar = QtWidgets.QPushButton(Form) self.btnPolar.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnPolar.sizePolicy().hasHeightForWidth()) self.btnPolar.setSizePolicy(sizePolicy) self.btnPolar.setText("") icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(":/icons/android-radio-button-off.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnPolar.setIcon(icon1) self.btnPolar.setCheckable(True) self.btnPolar.setFlat(False) self.btnPolar.setObjectName("btnPolar") self.horizontalLayout.addWidget(self.btnPolar) self.btnManualAdj = QtWidgets.QPushButton(Form) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnManualAdj.sizePolicy().hasHeightForWidth()) self.btnManualAdj.setSizePolicy(sizePolicy) self.btnManualAdj.setText("") icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap(":/icons/edit.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnManualAdj.setIcon(icon2) self.btnManualAdj.setCheckable(True) self.btnManualAdj.setFlat(False) self.btnManualAdj.setObjectName("btnManualAdj") self.horizontalLayout.addWidget(self.btnManualAdj) self.verticalLayout.addLayout(self.horizontalLayout) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) self.nameLabel.setText(_translate("Form", "Left Control Point")) self.lineXorA.setToolTip(_translate("Form", "X")) self.lineXorA.setPlaceholderText(_translate("Form", "X")) self.lineYorM.setToolTip(_translate("Form", "X")) self.lineYorM.setPlaceholderText(_translate("Form", "Y")) from xasyicons import icons_rc asymptote-3.05/GUI/xasyqtui/widg_editBezier.py0000644000000000000000000001153215031566355020164 0ustar rootroot# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'windows/widg_editBezier.ui' # # Created by: PyQt5 UI code generator 5.15.11 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.setWindowModality(QtCore.Qt.NonModal) Form.resize(692, 35) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth()) Form.setSizePolicy(sizePolicy) Form.setMinimumSize(QtCore.QSize(0, 35)) Form.setMaximumSize(QtCore.QSize(16777215, 35)) self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form) self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_2.setSpacing(0) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.cmbLockMode = QtWidgets.QComboBox(Form) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cmbLockMode.sizePolicy().hasHeightForWidth()) self.cmbLockMode.setSizePolicy(sizePolicy) self.cmbLockMode.setObjectName("cmbLockMode") self.cmbLockMode.addItem("") self.cmbLockMode.addItem("") self.cmbLockMode.addItem("") self.horizontalLayout.addWidget(self.cmbLockMode) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.chkRecompute = QtWidgets.QCheckBox(Form) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.chkRecompute.sizePolicy().hasHeightForWidth()) self.chkRecompute.setSizePolicy(sizePolicy) self.chkRecompute.setObjectName("chkRecompute") self.horizontalLayout.addWidget(self.chkRecompute) self.btnForceRecompute = QtWidgets.QPushButton(Form) self.btnForceRecompute.setObjectName("btnForceRecompute") self.horizontalLayout.addWidget(self.btnForceRecompute) self.btnOk = QtWidgets.QPushButton(Form) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnOk.sizePolicy().hasHeightForWidth()) self.btnOk.setSizePolicy(sizePolicy) self.btnOk.setMaximumSize(QtCore.QSize(25, 25)) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(":/icons/check.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnOk.setIcon(icon) self.btnOk.setFlat(True) self.btnOk.setObjectName("btnOk") self.horizontalLayout.addWidget(self.btnOk) self.btnCancel = QtWidgets.QPushButton(Form) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btnCancel.sizePolicy().hasHeightForWidth()) self.btnCancel.setSizePolicy(sizePolicy) self.btnCancel.setMaximumSize(QtCore.QSize(25, 25)) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(":/icons/close-round.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnCancel.setIcon(icon1) self.btnCancel.setFlat(True) self.btnCancel.setObjectName("btnCancel") self.horizontalLayout.addWidget(self.btnCancel) self.horizontalLayout_2.addLayout(self.horizontalLayout) self.retranslateUi(Form) self.cmbLockMode.setCurrentIndex(1) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) self.cmbLockMode.setItemText(0, _translate("Form", "No Lock")) self.cmbLockMode.setItemText(1, _translate("Form", "Lock Angle")) self.cmbLockMode.setItemText(2, _translate("Form", "Lock Angle & Scale")) self.chkRecompute.setText(_translate("Form", "Recompute Path")) self.btnForceRecompute.setText(_translate("Form", "Recompute Once")) from xasyicons import icons_rc asymptote-3.05/GUI/xasyqtui/custMatTransform.py0000644000000000000000000002350215031566355020400 0ustar rootroot# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'windows/custMatTransform.ui' # # Created by: PyQt5 UI code generator 5.15.11 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(500, 320) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth()) Dialog.setSizePolicy(sizePolicy) Dialog.setMinimumSize(QtCore.QSize(500, 320)) Dialog.setMaximumSize(QtCore.QSize(500, 320)) Dialog.setMouseTracking(False) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(":/icons/android-expand.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) Dialog.setWindowIcon(icon) Dialog.setSizeGripEnabled(True) Dialog.setModal(False) self.centralFrame = QtWidgets.QFrame(Dialog) self.centralFrame.setGeometry(QtCore.QRect(20, 20, 461, 271)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.centralFrame.sizePolicy().hasHeightForWidth()) self.centralFrame.setSizePolicy(sizePolicy) self.centralFrame.setBaseSize(QtCore.QSize(0, 0)) self.centralFrame.setObjectName("centralFrame") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.centralFrame) self.verticalLayout_3.setSpacing(4) self.verticalLayout_3.setObjectName("verticalLayout_3") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.label = QtWidgets.QLabel(self.centralFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) self.label.setSizePolicy(sizePolicy) self.label.setObjectName("label") self.verticalLayout.addWidget(self.label) self.gridFrame = QtWidgets.QFrame(self.centralFrame) self.gridFrame.setFrameShape(QtWidgets.QFrame.Box) self.gridFrame.setObjectName("gridFrame") self.gridLayout = QtWidgets.QGridLayout(self.gridFrame) self.gridLayout.setObjectName("gridLayout") self.lineMat00 = QtWidgets.QLineEdit(self.gridFrame) self.lineMat00.setMaximumSize(QtCore.QSize(70, 16777215)) self.lineMat00.setObjectName("lineMat00") self.gridLayout.addWidget(self.lineMat00, 1, 0, 1, 1) self.lineMat11 = QtWidgets.QLineEdit(self.gridFrame) self.lineMat11.setMaximumSize(QtCore.QSize(70, 16777215)) self.lineMat11.setObjectName("lineMat11") self.gridLayout.addWidget(self.lineMat11, 2, 1, 1, 1) self.lineMat10 = QtWidgets.QLineEdit(self.gridFrame) self.lineMat10.setMaximumSize(QtCore.QSize(70, 16777215)) self.lineMat10.setObjectName("lineMat10") self.gridLayout.addWidget(self.lineMat10, 2, 0, 1, 1) self.lineMat01 = QtWidgets.QLineEdit(self.gridFrame) self.lineMat01.setMaximumSize(QtCore.QSize(70, 16777215)) self.lineMat01.setObjectName("lineMat01") self.gridLayout.addWidget(self.lineMat01, 1, 1, 1, 1) self.verticalLayout.addWidget(self.gridFrame) self.horizontalLayout_3.addLayout(self.verticalLayout) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem) self.verticalLayout_4 = QtWidgets.QVBoxLayout() self.verticalLayout_4.setObjectName("verticalLayout_4") self.label_3 = QtWidgets.QLabel(self.centralFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth()) self.label_3.setSizePolicy(sizePolicy) self.label_3.setObjectName("label_3") self.verticalLayout_4.addWidget(self.label_3) self.gridFrame_2 = QtWidgets.QFrame(self.centralFrame) self.gridFrame_2.setFrameShape(QtWidgets.QFrame.Box) self.gridFrame_2.setObjectName("gridFrame_2") self.gridLayout_2 = QtWidgets.QGridLayout(self.gridFrame_2) self.gridLayout_2.setObjectName("gridLayout_2") self.lineMatTy = QtWidgets.QLineEdit(self.gridFrame_2) self.lineMatTy.setMaximumSize(QtCore.QSize(70, 16777215)) self.lineMatTy.setObjectName("lineMatTy") self.gridLayout_2.addWidget(self.lineMatTy, 2, 1, 1, 1) self.lineMatTx = QtWidgets.QLineEdit(self.gridFrame_2) self.lineMatTx.setMaximumSize(QtCore.QSize(70, 16777215)) self.lineMatTx.setObjectName("lineMatTx") self.gridLayout_2.addWidget(self.lineMatTx, 1, 1, 1, 1) self.verticalLayout_4.addWidget(self.gridFrame_2) self.horizontalLayout_3.addLayout(self.verticalLayout_4) self.horizontalLayout.addLayout(self.horizontalLayout_3) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setObjectName("verticalLayout_2") self.label_2 = QtWidgets.QLabel(self.centralFrame) self.label_2.setObjectName("label_2") self.verticalLayout_2.addWidget(self.label_2) self.imgPreview = QtWidgets.QLabel(self.centralFrame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.imgPreview.sizePolicy().hasHeightForWidth()) self.imgPreview.setSizePolicy(sizePolicy) self.imgPreview.setMinimumSize(QtCore.QSize(150, 150)) self.imgPreview.setBaseSize(QtCore.QSize(300, 300)) self.imgPreview.setFrameShape(QtWidgets.QFrame.Box) self.imgPreview.setText("") self.imgPreview.setObjectName("imgPreview") self.verticalLayout_2.addWidget(self.imgPreview) self.horizontalLayout.addLayout(self.verticalLayout_2) self.verticalLayout_3.addLayout(self.horizontalLayout) self.lblAnchor = QtWidgets.QLabel(self.centralFrame) self.lblAnchor.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.lblAnchor.setObjectName("lblAnchor") self.verticalLayout_3.addWidget(self.lblAnchor) self.lblCoordsMode = QtWidgets.QLabel(self.centralFrame) self.lblCoordsMode.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.lblCoordsMode.setObjectName("lblCoordsMode") self.verticalLayout_3.addWidget(self.lblCoordsMode) spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_3.addItem(spacerItem2) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem3) self.btnReset = QtWidgets.QPushButton(self.centralFrame) self.btnReset.setObjectName("btnReset") self.horizontalLayout_2.addWidget(self.btnReset) self.btnCancel = QtWidgets.QPushButton(self.centralFrame) self.btnCancel.setObjectName("btnCancel") self.horizontalLayout_2.addWidget(self.btnCancel) self.btnAccept = QtWidgets.QPushButton(self.centralFrame) self.btnAccept.setObjectName("btnAccept") self.horizontalLayout_2.addWidget(self.btnAccept) self.verticalLayout_3.addLayout(self.horizontalLayout_2) self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): _translate = QtCore.QCoreApplication.translate Dialog.setWindowTitle(_translate("Dialog", "Set Custom Transformation")) self.label.setText(_translate("Dialog", "Transformation Matrix")) self.lineMat00.setText(_translate("Dialog", "1")) self.lineMat11.setText(_translate("Dialog", "1")) self.lineMat10.setText(_translate("Dialog", "0")) self.lineMat01.setText(_translate("Dialog", "0")) self.label_3.setText(_translate("Dialog", "Translation")) self.lineMatTy.setText(_translate("Dialog", "0")) self.lineMatTx.setText(_translate("Dialog", "0")) self.label_2.setText(_translate("Dialog", "Preview:")) self.imgPreview.setToolTip(_translate("Dialog", "Shows a red square if transformation determinant is negative.")) self.lblAnchor.setText(_translate("Dialog", "Anchor: Top Left")) self.lblCoordsMode.setText(_translate("Dialog", "Coordinates: Global")) self.btnReset.setText(_translate("Dialog", "Reset")) self.btnCancel.setText(_translate("Dialog", "Cancel")) self.btnAccept.setText(_translate("Dialog", "Accept")) from xasyicons import icons_rc asymptote-3.05/GUI/GuidesManager.py0000644000000000000000000000332715031566105015704 0ustar rootroot#!/usr/bin/env python3 import PyQt5.QtGui as QtGui import PyQt5.QtCore as QtCore import numpy as numpy class Guide: def __init__(self, pen=None): if pen is None: pen = QtGui.QPen() assert isinstance(pen, QtGui.QPen) self.pen = pen def drawShape(self, pen): assert isinstance(pen, QtGui.QPainter) pen.save() pen.setPen(self.pen) class LineGuide(Guide): def __init__(self, origin, direction, pen=None): super().__init__(pen) self.origin = origin self.direction = direction def drawShape(self, pen): super().drawShape(pen) p1 = self.origin + (9999 * QtCore.QPointF(numpy.cos(self.direction), numpy.sin(self.direction))) p2 = self.origin - (9999 * QtCore.QPointF(numpy.cos(self.direction), numpy.sin(self.direction))) pen.drawLine(QtCore.QLineF(p1, p2)) pen.restore() class ArcGuide(Guide): @classmethod def radTo16Deg(cls, radians): return int(round(numpy.rad2deg(radians) * 16)) def __init__(self, center=None, radius=1, startAng=0, endAng=(2*numpy.pi), pen=None): if center is None: center = QtCore.QPointF(0, 0) super().__init__(pen) self.center = center self.radius = int(radius) self.startAng = startAng self.endAng = endAng def drawShape(self, pen): super().drawShape(pen) assert isinstance(pen, QtGui.QPainter) x, y = int(round(self.center.x())), int(round(self.center.y())) pen.drawArc(x - self.radius, y - self.radius, 2 * self.radius, 2 * self.radius, ArcGuide.radTo16Deg(self.startAng), -ArcGuide.radTo16Deg(self.endAng - self.startAng)) pen.restore() asymptote-3.05/GUI/locale/0000755000000000000000000000000015031566105014051 5ustar rootrootasymptote-3.05/GUI/locale/th/0000755000000000000000000000000015031566105014464 5ustar rootrootasymptote-3.05/GUI/locale/th/LC_MESSAGES/0000755000000000000000000000000015031566105016251 5ustar rootrootasymptote-3.05/GUI/locale/th/LC_MESSAGES/base.po0000644000000000000000000000127415031566105017527 0ustar rootroot# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Supakorn Rassameemasmuang, 2018. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-05-16 17:07-0600\n" "PO-Revision-Date: 2018-05-16 17:20-0700\n" "Last-Translator: Supakorn Rassameemasmuang \n" "Language-Team: English \n" "Language: th\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 2.0\n" #: xasyStrings.py:10 msgid "Rotate" msgstr "หมุน" asymptote-3.05/GUI/Widg_addPolyOpt.py0000644000000000000000000000155415031566105016222 0ustar rootroot#!/usr/bin/env python3 from xasyqtui.widg_addPolyOpt import Ui_Form import PyQt5.QtWidgets as QtWidgets import PyQt5.QtGui as QtGui import sys class Widg_addPolyOpt(QtWidgets.QWidget): def __init__(self, info): super().__init__() self.ui = Ui_Form() self.info = info self.ui.setupUi(self) self.setFixedSize(self.size()) self.ui.chkInscribed.setChecked(self.info['inscribed']) self.ui.txtSides.setText(str(self.info['sides'])) self.ui.txtSides.setValidator(QtGui.QIntValidator()) self.ui.chkInscribed.stateChanged.connect(self.chkInscribedUpdate) self.ui.txtSides.textChanged.connect(self.txtSidesUpdate) def chkInscribedUpdate(self, checked): self.info['inscribed'] = checked def txtSidesUpdate(self, text): if text: self.info['sides'] = int(text) asymptote-3.05/GUI/buildtool.py0000644000000000000000000000643215031566105015166 0ustar rootroot#!/usr/bin/env python3 import argparse import pathlib import sys import subprocess import shutil from typing import Optional from PyQt5.uic import compileUiDir import os BUILD_ROOT_DIRECTORY = pathlib.Path(os.path.dirname(os.path.abspath(__file__))) sys.path.append(str(BUILD_ROOT_DIRECTORY.parent)) import determine_pkg_info XASY_ICONS_MODULE_NAME = "xasyicons" PY_UI_FILE_DIR = BUILD_ROOT_DIRECTORY / "xasyqtui" PY_ICONS_FILE_DIR = BUILD_ROOT_DIRECTORY / XASY_ICONS_MODULE_NAME PY_VERSION_MODULE_DIR = BUILD_ROOT_DIRECTORY / "xasyversion" def _map_ui_file(_: str, fileName: str): return str(PY_UI_FILE_DIR), fileName def make_init_py_at_dir(dir_name: pathlib.Path): (dir_name / "__init__.py").touch(exist_ok=True) def build_ui(): compileUiDir( "windows", map=_map_ui_file, from_imports=True, import_from=XASY_ICONS_MODULE_NAME, ) make_init_py_at_dir(PY_UI_FILE_DIR) def build_icons(): PY_ICONS_FILE_DIR.mkdir(exist_ok=True) make_init_py_at_dir(PY_ICONS_FILE_DIR) subprocess.run( [ "pyrcc5", str(BUILD_ROOT_DIRECTORY / "res" / "icons.qrc"), "-o", str(PY_ICONS_FILE_DIR / "icons_rc.py"), ] ) def determine_asy_version() -> str: version_base = determine_pkg_info.determine_asy_pkg_info( BUILD_ROOT_DIRECTORY.parent / "configure.ac" ).get("version-base") if not version_base: return "0.0.0-SNAPSHOT" return version_base def build_verison_module(version_override: Optional[str] = None): PY_VERSION_MODULE_DIR.mkdir(exist_ok=True) make_init_py_at_dir(PY_VERSION_MODULE_DIR) if version_override is not None: version = version_override else: version = determine_asy_version() with open(PY_VERSION_MODULE_DIR / "version.py", "w", encoding="utf-8") as f: f.write(f'VERSION="{version}"\n') def clean(): if PY_UI_FILE_DIR.exists(): shutil.rmtree(PY_UI_FILE_DIR) if PY_ICONS_FILE_DIR.exists(): shutil.rmtree(PY_ICONS_FILE_DIR) if PY_VERSION_MODULE_DIR.exists(): shutil.rmtree(PY_VERSION_MODULE_DIR) def parse_args(): parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(help="subcommands", dest="subcommand") version_parser = subparsers.add_parser( "buildversionmodule", help="build version module" ) build_parser = subparsers.add_parser("build", help="build command") for subparser in [build_parser, version_parser]: subparser.add_argument("--version-override", required=False, type=str) subparsers.add_parser("clean", help="clean command") subparsers.add_parser("buildicons", help="build icons") subparsers.add_parser("buildui", help="build ui files") return parser.parse_args() def main(): args = parse_args() if args.subcommand == "buildui": build_ui() elif args.subcommand == "buildicons": build_icons() elif args.subcommand == "buildversionmodule": build_verison_module(args.version_override) elif args.subcommand == "build": build_ui() build_icons() build_verison_module(args.version_override) elif args.subcommand == "clean": clean() else: raise RuntimeError("Unknown subcommand") if __name__ == "__main__": main() asymptote-3.05/GUI/xasyValidator.py0000644000000000000000000000035615031566105016022 0ustar rootroot#!/usr/bin/env python3 def validateFloat(text): try: float(text) return True except ValueError: return False if __name__ == '__main__': assert validateFloat('0.5') assert not validateFloat('.-') asymptote-3.05/GUI/requirements.txt0000644000000000000000000000004615031566105016076 0ustar rootrootnumpy~=1.26.4 cson~=0.8 PyQt5~=5.15.0 asymptote-3.05/GUI/SetCustomAnchor.py0000644000000000000000000000265015031566105016250 0ustar rootroot#!/usr/bin/env python3 import PyQt5.QtWidgets as QtWidgets import PyQt5.QtGui as QtGui import PyQt5.QtCore as QtCore from xasyqtui.setCustomAnchor import Ui_Dialog class CustomAnchorDialog(QtWidgets.QDialog): def __init__(self): super().__init__() self.ui = Ui_Dialog() self.ui.setupUi(self) self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Reset).clicked.connect(self.resetDialog) validator = QtGui.QDoubleValidator() self.ui.lineEditX.setValidator(validator) self.ui.lineEditY.setValidator(validator) self.ui.lineEditX.textChanged.connect(self.checkTextChanged) self.ui.lineEditY.textChanged.connect(self.checkTextChanged) def checkTextChanged(self, text): if str(text) not in {'.', '-', '.-', '-.'} and str(text): self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setEnabled(True) else: self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setEnabled(False) def getPoint(self): xPoint = float(self.ui.lineEditX.text()) yPoint = float(self.ui.lineEditY.text()) return QtCore.QPointF(xPoint, yPoint) def handleBtnBoxClick(self, button): assert isinstance(button, QtWidgets.QAbstractButton) if button.text() == 'Reset': self.resetDialog() def resetDialog(self): self.ui.lineEditX.setText('0') self.ui.lineEditY.setText('0') asymptote-3.05/GUI/Widg_editBezier.py0000644000000000000000000000317115031566105016226 0ustar rootroot#!/usr/bin/env python3 from xasyqtui.widg_editBezier import Ui_Form import PyQt5.QtWidgets as QtWidgets import PyQt5.QtCore as QtCore class LockMode: noLock = 0 angleLock = 1 angleAndScaleLock = 2 class Widg_editBezier(QtWidgets.QWidget): def __init__(self, info: dict, enableCurveFeatures: bool=True): super().__init__() self.ui = Ui_Form() self.ui.setupUi(self) self.info = info self.ui.chkRecompute.setChecked(self.info['autoRecompute']) self.ui.cmbLockMode.setCurrentIndex(self.info['editBezierlockMode']) self.ui.cmbLockMode.currentIndexChanged[int].connect(self.cmbLockIndexChange) self.ui.chkRecompute.stateChanged.connect(self.chkRecomputeChanged) self.disableOnAutoRecompute = {self.ui.cmbLockMode, self.ui.btnForceRecompute} self.curveBtnsOnly = {self.ui.cmbLockMode, self.ui.btnForceRecompute, self.ui.chkRecompute} for elem in self.curveBtnsOnly: elem.setEnabled(enableCurveFeatures) @property def autoRecompute(self) -> bool: return self.ui.chkRecompute.isChecked() @property def lockMode(self) -> int: return self.ui.cmbLockMode.currentIndex() @QtCore.pyqtSlot(int) def cmbLockIndexChange(self, index: int): self.info['editBezierlockMode'] = index @QtCore.pyqtSlot(int) def chkRecomputeChanged(self, checked: int): isChecked = (checked == 2) for obj in self.disableOnAutoRecompute: obj.setEnabled(not checked) self.info['autoRecompute'] = checked if isChecked: self.ui.btnForceRecompute.clicked.emit() asymptote-3.05/GUI/xasyUtils.py0000644000000000000000000000300615031566105015170 0ustar rootroot#!/usr/bin/env python3 import re import typing as typing import math import itertools def tuple2StrWOspaces(val: tuple) -> str: newStr = ','.join(['{:.6g}'.format(value) for value in val]) return '({0})'.format(newStr) def tryParse(val, typ=float): try: return typ(val) except ValueError: return None def funcOnList(list1: typing.Union[typing.List, typing.Tuple], list2: typing.Union[typing.List, typing.Tuple], func: typing.Callable) -> tuple: """Returns [f(x[i], y[i]) : i in 1, ..., n - 1] in order with f as func and x and y as list1 and 2. """ assert len(list1) == len(list2) return tuple([func(list1[i], list2[i]) for i in range(len(list1))]) def listize(str, typ, delim='()') -> list: str = str.strip(delim) raw_elem = str.split(',') final_list = [] if isinstance(typ, (list, tuple)): for i in range(len(raw_elem)): if i < len(typ): curr_typ = typ[i] else: curr_typ = typ[-1] final_list.append(curr_typ(raw_elem[i].strip())) else: for elem in raw_elem: final_list.append(typ(elem.strip())) return final_list def twonorm(vec: typing.Iterable[typing.Union[float, int]]) -> float: rawSquared = sum(map(lambda x: x*x, vec)) return math.sqrt(rawSquared) def tryParseKey(raw_key): """Returns None if raw key is not in #.# format""" # See https://regex101.com/r/6G9MZD/1/ # for the regex data return re.fullmatch(r'^(\d+)\.(\d+)$', raw_key) asymptote-3.05/GUI/PrimitiveShape.py0000644000000000000000000000461515031566105016123 0ustar rootroot#!/usr/bin/env python3 import xasy2asy as xasy2asy import numpy as numpy import math import PyQt5.QtCore as QtCore import PyQt5.QtGui as QtGui class PrimitiveShape: # The magic number. # see https://www.desmos.com/calculator/lw6j7khikj for unitcircle # optimal_ctl_pt = 0.5447 @staticmethod def pos_to_tuple(pos): if isinstance(pos, tuple) or isinstance(pos, numpy.ndarray): return pos elif isinstance(pos, QtCore.QPoint) or isinstance(pos, QtCore.QPointF): return pos.x(), pos.y() else: raise TypeError("Position must be a valid type!") @staticmethod def euclideanNorm(p1, p2): x1, y1 = PrimitiveShape.pos_to_tuple(p1) x2, y2 = PrimitiveShape.pos_to_tuple(p2) normSq = ((x1 - x2) ** 2) + ((y1 - y2) ** 2) return math.sqrt(normSq) @classmethod def circle(cls, position, radius): pos_x, pos_y = PrimitiveShape.pos_to_tuple(position) newCircle = xasy2asy.asyPath() ptsList = [(pos_x + radius, pos_y), (pos_x, pos_y + radius), (pos_x - radius, pos_y), (pos_x, pos_y - radius), 'cycle'] # cycle doesn't work for now. lkList = ['..', '..', '..', '..'] newCircle.initFromNodeList(ptsList, lkList) return newCircle @classmethod def inscribedRegPolygon(cls, sides, position, radius, starting_rad, qpoly=False): pos_x, pos_y = PrimitiveShape.pos_to_tuple(position) lkList = ['--'] * sides ptsList = [] for ang in numpy.linspace(starting_rad, starting_rad + math.tau, sides, endpoint=False): ptsList.append((pos_x + radius * math.cos(ang), pos_y + radius * math.sin(ang))) if qpoly: ptsList.append((pos_x + radius * math.cos(starting_rad), pos_y + radius * math.sin(starting_rad))) qpoints = [QtCore.QPointF(x, y) for (x, y) in ptsList] return QtGui.QPolygonF(qpoints) else: ptsList.append('cycle') newPoly = xasy2asy.asyPath() newPoly.initFromNodeList(ptsList, lkList) return newPoly @classmethod def exscribedRegPolygon(cls, sides, position, length, starting_rad, qpoly=False): ang = math.tau/sides # see notes adjusted_radius = length / math.cos(ang/2) return cls.inscribedRegPolygon(sides, position, adjusted_radius, starting_rad - ang/2, qpoly) asymptote-3.05/GUI/xasyversion/0000755000000000000000000000000015031566356015214 5ustar rootrootasymptote-3.05/GUI/xasyversion/version.py0000644000000000000000000000001715031566356017251 0ustar rootrootVERSION="3.05" asymptote-3.05/GUI/xasyversion/__init__.py0000644000000000000000000000000015031566356017313 0ustar rootrootasymptote-3.05/GUI/xasyBezierInterface.py0000644000000000000000000003277015031566105017143 0ustar rootroot#!/usr/bin/env python3 import PyQt5.QtWidgets as QtWidgets import PyQt5.QtCore as QtCore import PyQt5.QtGui as QtGui import xasy2asy as xasy2asy import xasyUtils as xasyUtils import Widg_editBezier as Web import InplaceAddObj import math class CurrentlySelctedType: none = -1 node = 0 ctrlPoint = 1 class InteractiveBezierEditor(InplaceAddObj.InplaceObjProcess): editAccepted = QtCore.pyqtSignal() editRejected = QtCore.pyqtSignal() def __init__(self, parent: QtCore.QObject, obj: xasy2asy.xasyDrawnItem, info: dict={}): super().__init__(parent) self.info = info self.asyPathBackup = xasy2asy.asyPath.fromPath(obj.path) self.asyPath = obj.path self.curveMode = self.asyPath.containsCurve assert isinstance(self.asyPath, xasy2asy.asyPath) self.transf = obj.transfKeymap[obj.transfKey][0] self._active = True self.currentSelMode = None # (Node index, Node subindex for ) self.currentSelIndex = (None, 0) self.nodeSelRects = [] self.ctrlSelRects = [] self.setSelectionBoundaries() self.lastSelPoint = None self.preCtrlOffset = None self.postCtrlOffset = None self.inTransformMode = False self.opt = None self.obj = obj self.prosectiveNodes = [] self.prospectiveCtrlPts = [] #The magnification isn't being set. Here I'm manually setting it to be the square root of the determinant. self.info['magnification'] = math.sqrt(abs(self.transf.xx * self.transf.yy - self.transf.xy * self.transf.yx)) def setSelectionBoundaries(self): self.nodeSelRects = self.handleNodeSelectionBounds() if self.curveMode: self.ctrlSelRects = self.handleCtrlSelectionBoundaries() def handleNodeSelectionBounds(self): nodeSelectionBoundaries = [] for node in self.asyPath.nodeSet: if node == 'cycle': nodeSelectionBoundaries.append(None) continue selEpsilon = 6/self.info['magnification'] newRect = QtCore.QRectF(0, 0, 2 * selEpsilon, 2 * selEpsilon) x, y = self.transf * node x = int(round(x)) y = int(round(y)) newRect.moveCenter(QtCore.QPoint(x, y)) nodeSelectionBoundaries.append(newRect) return nodeSelectionBoundaries def handleCtrlSelectionBoundaries(self): ctrlPointSelBoundaries = [] for nodes in self.asyPath.controlSet: nodea, nodeb = nodes selEpsilon = 6/self.info['magnification'] newRect = QtCore.QRectF(0, 0, 2 * selEpsilon, 2 * selEpsilon) newRectb = QtCore.QRectF(0, 0, 2 * selEpsilon, 2 * selEpsilon) x, y = self.transf * nodea x2, y2 = self.transf * nodeb x = int(round(x)) y = int(round(y)) x2 = int(round(x2)) y2 = int(round(y2)) newRect.moveCenter(QtCore.QPoint(x, y)) newRectb.moveCenter(QtCore.QPoint(x2, y2)) ctrlPointSelBoundaries.append((newRect, newRectb)) return ctrlPointSelBoundaries def postDrawPreview(self, canvas: QtGui.QPainter): assert canvas.isActive() dashedPen = QtGui.QPen(QtCore.Qt.DashLine) dashedPen.setCosmetic(True) # draw the base points canvas.save() canvas.setWorldTransform(self.transf.toQTransform(), True) epsilonSize = 6/self.info['magnification'] if self.info['autoRecompute'] or not self.curveMode: ctrlPtsColor = 'gray' else: ctrlPtsColor = 'red' canvas.setPen(dashedPen) canvas.drawPath(self.asyPath.toQPainterPath()) nodePen = QtGui.QPen(QtGui.QColor('blue')) nodePen.setCosmetic(True) ctlPtsPen = QtGui.QPen(QtGui.QColor(ctrlPtsColor)) ctlPtsPen.setCosmetic(True) for index in range(len(self.asyPath.nodeSet)): point = self.asyPath.nodeSet[index] if point != 'cycle': basePoint = QtCore.QPointF(point[0], point[1]) canvas.setPen(nodePen) canvas.drawEllipse(basePoint, epsilonSize, epsilonSize) else: point = self.asyPath.nodeSet[0] basePoint = QtCore.QPointF(point[0], point[1]) if self.curveMode: if index != 0: canvas.setPen(ctlPtsPen) postCtrolSet = self.asyPath.controlSet[index - 1][1] postCtrlPoint = QtCore.QPointF(postCtrolSet[0], postCtrolSet[1]) canvas.drawEllipse(postCtrlPoint, epsilonSize, epsilonSize) canvas.setPen(dashedPen) canvas.drawLine(basePoint, postCtrlPoint) if index != len(self.asyPath.nodeSet) - 1: canvas.setPen(ctlPtsPen) preCtrlSet = self.asyPath.controlSet[index][0] preCtrlPoint = QtCore.QPointF(preCtrlSet[0], preCtrlSet[1]) canvas.drawEllipse(preCtrlPoint, epsilonSize, epsilonSize) canvas.setPen(dashedPen) canvas.drawLine(basePoint, preCtrlPoint) canvas.restore() def getPreAndPostCtrlPts(self, index): isCycle = self.asyPath.nodeSet[-1] == 'cycle' if index == 0 and not isCycle: preCtrl = None else: preCtrl = self.asyPath.controlSet[index - 1][1] if index == len(self.asyPath.nodeSet) - 1 and not isCycle: postCtrl = None else: postCtrl = self.asyPath.controlSet[index % (len(self.asyPath.nodeSet) - 1)][0] return preCtrl, postCtrl def findLinkingNode(self, index, subindex): """index and subindex are of the control points list.""" if subindex == 0: return index else: if self.asyPath.nodeSet[index + 1] == 'cycle': return 0 else: return index + 1 def resetObj(self): self.asyPath.setInfo(self.asyPathBackup) self.setSelectionBoundaries() def mouseDown(self, pos, info, mouseEvent: QtGui.QMouseEvent=None): self.lastSelPoint = pos if self.inTransformMode: return if self.prosectiveNodes and not self.inTransformMode: self.currentSelMode = CurrentlySelctedType.node self.currentSelIndex = (self.prosectiveNodes[0], 0) self.inTransformMode = True self.parentNodeIndex = self.currentSelIndex[0] elif self.prospectiveCtrlPts and not self.inTransformMode: self.currentSelMode = CurrentlySelctedType.ctrlPoint self.currentSelIndex = self.prospectiveCtrlPts[0] self.inTransformMode = True self.parentNodeIndex = self.findLinkingNode(*self.currentSelIndex) if self.inTransformMode: parentNode = self.asyPath.nodeSet[self.parentNodeIndex] # find the offset of each control point to the node if not self.curveMode: return preCtrl, postCtrl = self.getPreAndPostCtrlPts(self.parentNodeIndex) if parentNode == 'cycle': parentNode = self.asyPath.nodeSet[0] self.parentNodeIndex = 0 if preCtrl is not None: self.preCtrlOffset = xasyUtils.funcOnList( preCtrl, parentNode, lambda a, b: a - b) else: self.preCtrlOffset = None if postCtrl is not None: self.postCtrlOffset = xasyUtils.funcOnList( postCtrl, parentNode, lambda a, b: a - b) else: self.postCtrlOffset = None def mouseMove(self, pos, event: QtGui.QMouseEvent): if self.currentSelMode is None and not self.inTransformMode: # in this case, search for prosective nodes. prospectiveNodes = [] prospectiveCtrlpts = [] for i in range(len(self.nodeSelRects)): rect = self.nodeSelRects[i] if rect is None: continue if rect.contains(pos): prospectiveNodes.append(i) self.prosectiveNodes = prospectiveNodes if not self.info['autoRecompute'] and self.curveMode: for i in range(len(self.ctrlSelRects)): recta, rectb = self.ctrlSelRects[i] if recta.contains(pos): prospectiveCtrlpts.append((i, 0)) if rectb.contains(pos): prospectiveCtrlpts.append((i, 1)) self.prospectiveCtrlPts = prospectiveCtrlpts else: self.prospectiveCtrlPts = [] if self.inTransformMode: index, subindex = self.currentSelIndex newNode = (self.transf.inverted().toQTransform().map(pos.x(), pos.y())) if self.currentSelMode == CurrentlySelctedType.node: # static throughout the moving if self.asyPath.nodeSet[index] == 'cycle': return self.asyPath.setNode(index, newNode) # if also move node: if self.curveMode: checkPre, checkPost = self.getPreAndPostCtrlPts(index) if 1 == 1: # TODO: Replace this with an option to also move control pts. if checkPre is not None: self.asyPath.controlSet[index - 1][1] = xasyUtils.funcOnList( newNode, self.preCtrlOffset, lambda a, b: a + b ) if checkPost is not None: self.asyPath.controlSet[index][0] = xasyUtils.funcOnList( newNode, self.postCtrlOffset, lambda a, b: a + b ) if self.info['autoRecompute']: self.quickRecalculateCtrls() elif self.currentSelMode == CurrentlySelctedType.ctrlPoint and self.curveMode: self.asyPath.controlSet[index][subindex] = newNode parentNode = self.asyPath.nodeSet[self.parentNodeIndex] if parentNode == 'cycle': parentNode = self.asyPath.nodeSet[0] isCycle = True else: isCycle = False if self.parentNodeIndex == 0 and self.asyPath.nodeSet[-1] == 'cycle': isCycle = True rawNewNode = xasyUtils.funcOnList(newNode, parentNode, lambda a, b: a - b) rawAngle = math.atan2(rawNewNode[1], rawNewNode[0]) newNorm = xasyUtils.twonorm(rawNewNode) if self.info['editBezierlockMode'] >= Web.LockMode.angleLock: otherIndex = 1 - subindex # 1 if 0, 0 otherwise. if otherIndex == 0: if index < (len(self.asyPath.controlSet) - 1) or isCycle: newIndex = 0 if isCycle else index + 1 oldOtherCtrlPnt = xasyUtils.funcOnList( self.asyPath.controlSet[newIndex][0], parentNode, lambda a, b: a - b) if self.info['editBezierlockMode'] >= Web.LockMode.angleAndScaleLock: rawNorm = newNorm else: rawNorm = xasyUtils.twonorm(oldOtherCtrlPnt) newPnt = (rawNorm * math.cos(rawAngle + math.pi), rawNorm * math.sin(rawAngle + math.pi)) self.asyPath.controlSet[newIndex][0] = xasyUtils.funcOnList( newPnt, parentNode, lambda a, b: a + b) else: if index > 0 or isCycle: newIndex = -1 if isCycle else index - 1 oldOtherCtrlPnt = xasyUtils.funcOnList( self.asyPath.controlSet[newIndex][1], parentNode, lambda a, b: a - b) if self.info['editBezierlockMode'] >= Web.LockMode.angleAndScaleLock: rawNorm = newNorm else: rawNorm = xasyUtils.twonorm(oldOtherCtrlPnt) newPnt = (rawNorm * math.cos(rawAngle + math.pi), rawNorm * math.sin(rawAngle + math.pi)) self.asyPath.controlSet[newIndex][1] = xasyUtils.funcOnList( newPnt, parentNode, lambda a, b: a + b) def recalculateCtrls(self): self.quickRecalculateCtrls() self.setSelectionBoundaries() def quickRecalculateCtrls(self): self.asyPath.controlSet.clear() self.asyPath.computeControls() def mouseRelease(self): if self.inTransformMode: self.inTransformMode = False self.currentSelMode = None self.setSelectionBoundaries() def forceFinalize(self): self.objectUpdated.emit() def createOptWidget(self, info): self.opt = Web.Widg_editBezier(self.info, self.curveMode) self.opt.ui.btnOk.clicked.connect(self.editAccepted) self.opt.ui.btnCancel.clicked.connect(self.editRejected) self.opt.ui.btnForceRecompute.clicked.connect(self.recalculateCtrls) return self.opt def getObject(self): pass def getXasyObject(self): pass asymptote-3.05/GUI/xasySvg.py0000644000000000000000000000203115031566105014624 0ustar rootroot#!/usr/bin/env python3 import PyQt5.QtGui as QtGui import PyQt5.QtWidgets as QtWidgets import subprocess import sys import xasyOptions as xo class SvgObject: def __init__(self, file: str): self.file = file def _create_call_arguments(self, dpi: int): settings = xo.BasicConfigs.defaultOpt return [ settings.get("rsvgConverterPath") or "rsvg-convert", f"--dpi-x={dpi}", f"--dpi-y={dpi}", "--format=png", self.file, ] def render(self, dpi: int) -> QtGui.QImage: callArgs = self._create_call_arguments(dpi) try: rawDataProc = subprocess.run( callArgs, stdout=subprocess.PIPE, ) except OSError: QtWidgets.QMessageBox.about( None, "rsvg-convert missing", "Please install rsvg-convert version >= 2.40.", ) sys.exit(-1) return QtGui.QImage.fromData(rawDataProc.stdout, "PNG") asymptote-3.05/GUI/windows/0000755000000000000000000000000015031566105014304 5ustar rootrootasymptote-3.05/GUI/windows/setCustomAnchor.ui0000644000000000000000000000510715031566105017767 0ustar rootroot Dialog 0 0 245 161 Set Custom Anchor 20 20 201 121 QFormLayout::AllNonFixedFieldsGrow X: 0 Y: 0 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 asymptote-3.05/GUI/windows/widg_addPolyOpt.ui0000644000000000000000000000557515031566105017750 0ustar rootroot Form Qt::NonModal 0 0 326 35 0 0 0 35 16777215 35 Form 0 0 0 0 0 Start at Vertex Qt::Horizontal QSizePolicy::Fixed 19 20 0 0 Sides: Number of Sides Sides Qt::Horizontal 40 20 asymptote-3.05/GUI/windows/widgetPointEditor.ui0000644000000000000000000001010615031566105020305 0ustar rootroot Form 0 0 324 67 Form 0 0 Left Control Point false X false X false X false false Y false 0 0 :/icons/android-locate.svg:/icons/android-locate.svg true false false 0 0 :/icons/android-radio-button-off.svg:/icons/android-radio-button-off.svg true false 0 0 :/icons/edit.svg:/icons/edit.svg true false asymptote-3.05/GUI/windows/widg_editBezier.ui0000644000000000000000000001057215031566105017750 0ustar rootroot Form Qt::NonModal 0 0 692 35 0 0 0 35 16777215 35 Form 0 0 0 0 0 0 0 1 No Lock Lock Angle Lock Angle & Scale Qt::Horizontal 40 20 0 0 Recompute Path Recompute Once 0 0 25 25 :/icons/check.svg:/icons/check.svg true 0 0 25 25 :/icons/close-round.svg:/icons/close-round.svg true asymptote-3.05/GUI/windows/labelTextEditor.ui0000644000000000000000000001463015031566105017742 0ustar rootroot Dialog 0 0 473 424 Dialog QFrame::StyledPanel QFrame::Raised 0 Qt::Horizontal 40 20 Math Mode false 0 0 100 0 Inline Style Display Style Script Style 0 Preview 0 100 QFrame::Box Qt::Horizontal 40 20 32 32 :/icons/text.svg:/icons/text.svg true 32 32 :/icons/eye.svg:/icons/eye.svg true 32 32 :/icons/android-close.svg:/icons/android-close.svg true 32 32 :/icons/android-done.svg:/icons/android-done.svg true asymptote-3.05/GUI/windows/custMatTransform.ui0000644000000000000000000002403715031566105020165 0ustar rootroot Dialog 0 0 500 320 0 0 500 320 500 320 false Set Custom Transformation :/icons/android-expand.svg:/icons/android-expand.svg true false 20 20 461 271 0 0 0 0 4 0 0 Transformation Matrix QFrame::Box 70 16777215 1 70 16777215 1 70 16777215 0 70 16777215 0 Qt::Horizontal 40 20 0 0 Translation QFrame::Box 70 16777215 0 70 16777215 0 Qt::Horizontal 40 20 Preview: 0 0 150 150 300 300 Shows a red square if transformation determinant is negative. QFrame::Box Anchor: Top Left Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Coordinates: Global Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Vertical 20 40 Qt::Horizontal 40 20 Reset Cancel Accept asymptote-3.05/GUI/windows/window1.ui0000644000000000000000000023223315031566105016240 0ustar rootroot MainWindow 0 0 1000 600 xasy 0 0 true 0 0 0 0 0 0 0 true 4 2 2 2 2 0 0 QFrame::NoFrame 4 QLayout::SetMinimumSize 0 0 0 0 false 0 0 25 25 32 32 Undo :/icons/undo.svg:/icons/undo.svg 16 16 true false 0 0 25 25 32 32 Redo :/icons/redo.svg:/icons/redo.svg 16 16 true 0 0 25 25 32 32 <html><head/><body><p>Open file</p></body></html> :/icons/android-folder-open.svg:/icons/android-folder-open.svg 16 16 true 0 0 25 25 32 32 <html><head/><body><p>Save file</p></body></html> :/icons/save.svg:/icons/save.svg 16 16 true 0 0 24 24 20 20 <html><head/><body><p>Edit code</p></body></html> :/icons/code.svg:/icons/code.svg 16 16 true 0 0 25 25 32 32 <html><head/><body><p>Screenshot</p></body></html> :/icons/android-camera.svg:/icons/android-camera.svg 16 16 true Qt::Horizontal QSizePolicy::Minimum 20 20 0 0 25 25 32 32 Roboto 75 true <html><head/><body><p>Toggle display axes</p></body></html> :/icons/plus-round.svg:/icons/plus-round.svg 16 16 true true true 0 0 25 25 32 32 Roboto 75 true <html><head/><body><p>Toggle grid</p></body></html> :/icons/grid.svg:/icons/grid.svg 16 16 true false true 0 0 25 25 32 32 Zoom :/icons/magnifying-glass.svg:/icons/magnifying-glass.svg 16 16 true 0 0 25 25 32 32 <html><head/><body><p>Center</p></body></html> :/icons/center.svg:/icons/center.svg 16 16 true 0 0 25 25 32 32 <html><head/><body><p>Center about origin</p></body></html> :/icons/centerorigin.svg:/icons/centerorigin.svg 16 16 true 0 0 32 25 32 32 Roboto 75 true <html><head/><body><p>Lock transform to X axis</p></body></html> X 16 16 true true 0 0 32 25 32 32 Roboto 75 true <html><head/><body><p>Lock transform to Y axis</p></body></html> Y 16 16 true true Qt::Horizontal QSizePolicy::Minimum 20 20 true 0 0 25 25 <html><head/><body><p>Bézier editor</p></body></html> :/icons/edit.svg:/icons/edit.svg 16 16 true true true 0 0 25 25 32 32 <html><head/><body><p>Delete</p></body></html> :/icons/android-delete.svg:/icons/android-delete.svg 16 16 true true Qt::Horizontal QSizePolicy::Minimum 20 20 0 0 25 25 32 32 Pan :/icons/android-hand.svg:/icons/android-hand.svg 16 16 true true 0 0 25 25 32 32 Translate :/icons/arrow-move.svg:/icons/arrow-move.svg 16 16 true true true 0 0 25 25 32 32 Scale :/icons/arrow-resize.svg:/icons/arrow-resize.svg 16 16 true true 0 0 25 25 32 32 Rotate :/icons/android-refresh.svg:/icons/android-refresh.svg 16 16 true true Qt::Horizontal QSizePolicy::Minimum 20 20 0 0 25 25 32 32 <html><head/><body><p>Set custom anchor</p></body></html> :/icons/anchor.svg:/icons/anchor.svg 16 16 true false true 0 0 127 0 127 25 <html><head/><body><p>Anchor</p></body></html> Qt::LeftToRight false Center 0 QComboBox::InsertAtCurrent QComboBox::AdjustToContentsOnFirstShow 0 0 false false 0 Center Origin Top Left Top Right Bottom Right Bottom Left Custom false 0 0 25 25 32 32 :/icons/eye.svg:/icons/eye.svg 16 16 false true 0 0 25 25 32 32 <html><head/><body><p><br/></p></body></html> :/icons/android-expand.svg:/icons/android-expand.svg 16 16 true false 0 0 25 25 32 32 <html><head/><body><p><br/></p></body></html> :/icons/chevron-with-circle-left.svg:/icons/chevron-with-circle-left.svg 16 16 true false 0 0 25 25 32 32 Translate :/icons/chevron-with-circle-right.svg:/icons/chevron-with-circle-right.svg 16 16 true Qt::Horizontal QSizePolicy::Fixed 40 25 btnUndo btnRedo btnLoadFile btnSave btnViewCode btnQuickScreenshot btnDrawAxes btnDrawGrid btnSetZoom btnPanCenter btnResetPan btnAlignX btnAlignY btnPan btnTranslate btnScale btnCustTransform btnSendBackwards btnSendForwards comboAnchor btnToggleVisible btnAnchor btnRotate btnSelectEdit btnDeleteMode horizontalSpacer_4 horizontalSpacer_5 horizontalSpacer_6 4 3 6 QLayout::SetDefaultConstraint 6 0 0 0 32 32 32 32 <html><head/><body><p>Toggle fill/outline</p></body></html> false :/icons/bucket.svg :/icons/filledbucket.svg:/icons/bucket.svg 16 16 true false true Qt::Horizontal QSizePolicy::MinimumExpanding 40 35 Line Width: 0 0 75 16777215 <html><head/><body><p>Current pen width</p></body></html> 0 0 15 15 <html><head/><body><p>Current pen color</p></body></html> false QFrame{ padding: 4.0; border-radius: 3.0; background: rgb(0, 0, 0) } QFrame::StyledPanel QFrame::Sunken 0 0 25 25 32 32 <html><head/><body><p>Set color</p></body></html> false :/icons/android-color-palette.svg:/icons/android-color-palette.svg 16 16 false true 6 0 0 QFrame::NoFrame QFrame::Plain 0 0 0 0 0 0 0 true 0 0 32 32 <html><head/><body><p>Open polygon</p></body></html> :/icons/openpolygon.svg:/icons/openpolygon.svg 16 16 true true true 0 0 32 32 <html><head/><body><p>Closed polygon</p></body></html> :/icons/closedpolygon.svg:/icons/closedpolygon.svg 16 16 true true true 0 0 32 32 <html><head/><body><p>Open Bézier curve</p></body></html> :/icons/opencurve.svg:/icons/opencurve.svg 16 16 true true true 0 0 32 32 <html><head/><body><p>Closed Bézier curve</p></body></html> :/icons/closedcurve.svg:/icons/closedcurve.svg 16 16 true true true 0 0 32 32 <html><head/><body><p>Regular polygon</p></body></html> :/icons/triangle-stroked-15.svg:/icons/triangle-stroked-15.svg 16 16 true true true 0 0 32 32 <html><head/><body><p>Circle</p></body></html> :/icons/circle.svg:/icons/circle.svg 16 16 true true true 0 0 32 32 <html><head/><body><p>Text</p></body></html> :/icons/text.svg:/icons/text.svg 16 16 true true true 0 0 32 32 <html><head/><body><p>Freehand</p></body></html> :/icons/brush.svg:/icons/brush.svg 16 16 true true 0 6 true QFrame::NoFrame QFrame::Raised 0 0 0 0 0 0 0 true QFrame::Panel Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 0 QLayout::SetDefaultConstraint 0 true 0 0 :/icons/social-python.svg:/icons/social-python.svg 16 16 true true 0 0 true 0 0 :/icons/subdirectory-left.svg:/icons/subdirectory-left.svg 16 16 true 0 0 1000 26 &File Open Recent &Edit Optio&ns &Help &Tools false &About &Manual &Settings Pause &Save as &Enter Command &Quit false &Undo false &Redo &Show Grid Show &Local Grid &Transform Export as... Save Open Clear Menu New File Export as Asy &Keymaps 10 10 true true true asymptote-3.05/GUI/windows/widg_addLabel.ui0000644000000000000000000001536015031566105017352 0ustar rootroot Form Qt::NonModal 0 0 599 35 0 0 0 35 16777215 35 Form 0 0 0 0 0 Number of Sides Text 25 25 :/icons/edit.svg:/icons/edit.svg true Align Center N E W S NW NE SW SE Custom Font Size 0 0 true - 8 9 10 11 12 14 18 24 48 72 Custom Align 0 0 50 16777215 Shift X 0 0 50 16777215 Shift Y Qt::Horizontal 40 20 asymptote-3.05/GUI/xasyArgs.py0000644000000000000000000000274515031566105014775 0ustar rootroot#!/usr/bin/env python3 import argparse from xasyversion.version import VERSION as xasyVersion import PyQt5.QtCore as QtCore # Add arguments here. def parseArgs(args): parser = argparse.ArgumentParser(args) parser.add_argument('-p', '-asypath', '--asypath', help='Custom path to asy executable') parser.add_argument('-v', '-version', '--version', help='Version number', action='version', version='xasy v{0}'.format(xasyVersion)) parser.add_argument('-l', '-language', '--language', help='language') parser.add_argument('-x', '-mag', '--mag', help='Initial magnification. Defaults to 1', default=1, type=float) parser.add_argument('-render', '--render', help='Number of pixels per bp in 3D rendered bitmaps', default=None, type=float) parser.add_argument('-additional-asy-args', '--additional-asy-args', help='Comma-separated values of additional arguments to pass' 'to Asymptote', dest='additionalAsyArgs', type=str, default=None) parser.add_argument( 'filename', help='Filename to load (if omitted, initialize blank canvas)', nargs='?', default=None) return parser.parse_args() def getArgs(): return parseArgs(QtCore.QCoreApplication.arguments()) asymptote-3.05/GUI/labelEditor.py0000644000000000000000000001222715031566105015416 0ustar rootroot#!/usr/bin/env python3 from xasyqtui.labelTextEditor import Ui_Dialog import PyQt5.QtWidgets as QtWidgets import PyQt5.QtSvg as QtSvg import PyQt5.QtGui as QtGui import PyQt5.QtCore as QtCore import xasyArgs as xasyArgs import xasy2asy as xasy2asy import xasyOptions as xasyOptions import xasyUtils as xasyUtils import subprocess import tempfile import uuid import os import io class labelEditor(QtWidgets.QDialog): def __init__(self, text=''): super().__init__() self.ui = Ui_Dialog() self.ui.setupUi(self) self.ui.btnAccept.clicked.connect(self.accept) self.ui.btnCancel.clicked.connect(self.reject) self.ui.chkMathMode.stateChanged.connect(self.chkMathModeChecked) self.ui.btnPreview.clicked.connect(self.btnPreviewOnClick) self.ui.btnGetText.clicked.connect(self.btnGetTextOnClick) self.svgPreview = None self.initializeText(text) def initializeText(self, text: str): if text[0] == '$' and text[-1] == '$': self.ui.chkMathMode.setChecked(True) text = text.strip('$') if text.startswith('\\displaystyle{'): self.ui.cmbMathStyle.setCurrentText('Display Style') text = text.rstrip('}') text = text.replace('\\displaystyle{', '', 1) elif text.startswith('\\scriptstyle{'): self.ui.cmbMathStyle.setCurrentText('Script Style') text = text.rstrip('}') text = text.replace('\\scriptstyle{', '', 1) self.ui.txtLabelEdit.setPlainText(text) def chkMathModeChecked(self, checked): self.ui.cmbMathStyle.setEnabled(checked) def getText(self): rawText = self.ui.txtLabelEdit.toPlainText() rawText.replace('\n', ' ') if self.ui.chkMathMode.isChecked(): prefix = '' suffix = '' if self.ui.cmbMathStyle.currentText() == 'Display Style': prefix = '\\displaystyle{' suffix = '}' elif self.ui.cmbMathStyle.currentText() == 'Script Style': prefix = '\\scriptstyle{' suffix = '}' return '${0}{1}{2}$'.format(prefix, rawText, suffix) else: return rawText def btnPreviewOnClick(self): path = xasyArgs.getArgs().asypath if path is None: opt = xo.BasicConfigs.defaultOpt path = opt['asyPath'] asyInput = """ frame f; label(f, "{0}"); write(min(f), newl); write(max(f), newl); shipout(f); """ self.svgPreview = QtSvg.QSvgRenderer() with tempfile.TemporaryDirectory(prefix='xasylbl_') as tmpdir: id = str(uuid.uuid4()) tmpFile = os.path.join(tmpdir, 'lbl-{0}.svg'.format(id)) with subprocess.Popen(args=[path, '-fsvg', '-o', tmpFile, '-'], encoding='utf-8', stdin=subprocess.PIPE, stdout=subprocess.PIPE) as asy: asy.stdin.write(asyInput.format(self.getText())) asy.stdin.close() out = asy.stdout.read() raw_array = out.splitlines() bounds_1, bounds_2 = [val.strip() for val in raw_array] min_bounds = xasyUtils.listize(bounds_1, (float, float)) max_bounds = xasyUtils.listize(bounds_2, (float, float)) new_rect = self.processBounds(min_bounds, max_bounds) self.svgPreview.load(tmpFile) self.drawPreview(new_rect) def drawPreview(self, naturalBounds): img = QtGui.QPixmap(self.ui.lblLabelPreview.size()) img.fill(QtGui.QColor.fromRgbF(1, 1, 1, 1)) if self.svgPreview is None: pass else: with QtGui.QPainter(img) as pnt: scale_ratio = self.getIdealScaleRatio(naturalBounds, self.ui.lblLabelPreview.rect()) pnt.translate(self.ui.lblLabelPreview.rect().center()) pnt.scale(scale_ratio, scale_ratio) self.svgPreview.render(pnt, naturalBounds) self.ui.lblLabelPreview.setPixmap(img) def getIdealScaleRatio(self, rect, boundsRect): assert isinstance(rect, (QtCore.QRect, QtCore.QRectF)) assert isinstance(rect, (QtCore.QRect, QtCore.QRectF)) magic_ratio = 0.50 idealRatioHeight = (magic_ratio * boundsRect.height()) / rect.height() magicRatioWidth = 0.50 if idealRatioHeight * rect.width() > magicRatioWidth * boundsRect.width(): idealRatioWidth = (magicRatioWidth * boundsRect.width()) / rect.width() idealRatio = min(idealRatioHeight, idealRatioWidth) else: idealRatio = idealRatioHeight return idealRatio def processBounds(self, minPt, maxPt): p1x, p1y = minPt p2x, p2y = maxPt minPt = QtCore.QPointF(p1x, p1y) maxPt = QtCore.QPointF(p2x, p2y) newRect = QtCore.QRectF(minPt, maxPt) return newRect def btnGetTextOnClick(self): msgbox = QtWidgets.QMessageBox() msgbox.setText('Text Preview:\n' + self.getText()) msgbox.setWindowTitle('Text preview') msgbox.show() return msgbox.exec_() asymptote-3.05/GUI/DebugFlags.py0000644000000000000000000000014415031566105015166 0ustar rootroot#!/usr/bin/env python3 keepFiles = False printAsyTranscript = False printDeconstTranscript = False asymptote-3.05/GUI/CustMatTransform.py0000644000000000000000000000700715031566105016444 0ustar rootroot#!/usr/bin/env python3 import PyQt5.QtWidgets as QtWidgets import PyQt5.QtGui as QtGui import PyQt5.QtCore as QtCore import numpy as numpy import xasy2asy as xasy2asy from xasyqtui.custMatTransform import Ui_Dialog class CustMatTransform(QtWidgets.QDialog): def __init__(self): super().__init__() self.ui = Ui_Dialog() self.ui.setupUi(self) self.ui.btnAccept.clicked.connect(self.accept) self.ui.btnCancel.clicked.connect(self.reject) self.ui.btnReset.clicked.connect(self.resetDialog) self.mainTransformation = QtGui.QTransform() self.mainTransformation.scale(1, -1) self.matrixLineInputs = [ self.ui.lineMat00, self.ui.lineMat01, self.ui.lineMatTx, self.ui.lineMat10, self.ui.lineMat11, self.ui.lineMatTy] validator = QtGui.QDoubleValidator() for lineInput in self.matrixLineInputs: lineInput.setValidator(validator) lineInput.textChanged.connect(self.handleUpdateText) def show(self): super().show() self.createCanvas() self.updatePreview() def createCanvas(self): self.canvSize = self.ui.imgPreview.size() self.previewPixmap = QtGui.QPixmap(self.canvSize) tx, ty = self.canvSize.width() / 2, self.canvSize.height() / 2 self.mainTransformation.translate(tx, -ty) def handleUpdateText(self, text): if str(text) not in {'.', '-', '.-', '-.'} and str(text): self.updatePreview() self.ui.btnAccept.setEnabled(True) else: self.previewPixmap.fill() self.ui.imgPreview.setPixmap(self.previewPixmap) self.ui.btnAccept.setEnabled(False) def updatePreview(self): self.previewPixmap.fill() canvas = QtGui.QPainter(self.previewPixmap) if not canvas.isActive(): return canvas.setTransform(self.mainTransformation) canvas.save() canvas.setPen(QtCore.Qt.lightGray) self.drawBasicGrid(canvas) transform = xasy2asy.asyTransform.fromNumpyMatrix(self.getTransformationMatrix()) canvTransform = transform.toQTransform() canvas.setTransform(canvTransform, True) canvas.setPen(QtCore.Qt.black) if canvTransform.isInvertible(): self.drawBasicGrid(canvas, False) if canvTransform.determinant() <= 0: canvas.setPen(QtCore.Qt.red) canvas.drawRect(QtCore.QRect(QtCore.QPoint(0, 0), QtCore.QSize(20, 20))) self.ui.imgPreview.setPixmap(self.previewPixmap) def resetDialog(self): self.ui.lineMatTx.setText('0') self.ui.lineMatTx.setText('0') self.ui.lineMat00.setText('1') self.ui.lineMat01.setText('0') self.ui.lineMat10.setText('0') self.ui.lineMat11.setText('1') def drawBasicGrid(self, canvas, grid=True): canvas.drawLine(QtCore.QLine(-9999, 0, 9999, 0)) canvas.drawLine(QtCore.QLine(0, -9999, 0, 9999)) fromIter, toIter = -7, 7 gridSize = 20 if grid: for iterIndex in range(fromIter, toIter + 1): canvas.drawLine(QtCore.QLine(-9999, iterIndex * gridSize, 9999, iterIndex * gridSize)) canvas.drawLine(QtCore.QLine(iterIndex * gridSize, -9999, iterIndex * gridSize, 9999)) def getTransformationMatrix(self): rawMatrixNum = [float(lineInput.text()) for lineInput in self.matrixLineInputs] rawMatrixNum.extend([0, 0, 1]) return numpy.matrix(rawMatrixNum).reshape((3, 3)) asymptote-3.05/GUI/xasy.py0000755000000000000000000000127015031566105014153 0ustar rootroot#!/usr/bin/env python3 import sys import pathlib sys.path.append(str(pathlib.Path(__file__).resolve().parent)) import signal, os import PyQt5.QtWidgets as QtWidgets import PyQt5.QtCore as QtCore from Window1 import MainWindow1 def main(args): os.environ["QT_LOGGING_RULES"]="*.debug=false;qt.qpa.*=false" QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps,True) QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling,True) qtApp = QtWidgets.QApplication(args) signal.signal(signal.SIGINT,signal.SIG_DFL) mainWin1 = MainWindow1() mainWin1.show() return qtApp.exec_() if __name__ == '__main__': sys.exit(main(sys.argv) or 0) asymptote-3.05/GUI/__init__.py0000644000000000000000000000002715031566105014722 0ustar rootroot#!/usr/bin/env python3 asymptote-3.05/GUI/xasyStrings.py0000644000000000000000000000111215031566105015515 0ustar rootroot#!/usr/bin/env python3 import gettext p = property class xasyString: def __init__(self, lang=None): s = self if lang is None: _ = lambda x: x else: lng = gettext.translation('base', localedir='GUI/locale', languages=[lang]) lng.install() _ = lng.gettext s.rotate = _('Rotate') s.scale = _('Scale') s.translate = _('Translate') s.fileOpenFailed = _('File Opening Failed.') s.fileOpenFailedText = _('File could not be opened.') s.asyfyComplete = _('Ready.') asymptote-3.05/GUI/InplaceAddObj.py0000644000000000000000000003702715031566105015614 0ustar rootroot#!/usr/bin/env python3 import PyQt5.QtCore as QtCore import PyQt5.QtGui as QtGui import xasy2asy as xasy2asy import PrimitiveShape import math import Widg_addPolyOpt import Widg_addLabel class InplaceObjProcess(QtCore.QObject): objectCreated = QtCore.pyqtSignal(QtCore.QObject) objectUpdated = QtCore.pyqtSignal() def __init__(self, parent=None): super().__init__(parent) self._active = False pass @property def active(self): return self._active def mouseDown(self, pos, info, mouseEvent: QtGui.QMouseEvent=None): raise NotImplementedError def mouseMove(self, pos, event: QtGui.QMouseEvent): raise NotImplementedError def mouseRelease(self): raise NotImplementedError def forceFinalize(self): raise NotImplementedError def getPreview(self): return None def getObject(self): raise NotImplementedError def getXasyObject(self): raise NotImplementedError def postDrawPreview(self, canvas: QtGui.QPainter): pass def createOptWidget(self, info): return None class AddCircle(InplaceObjProcess): def __init__(self, parent=None): super().__init__(parent) self.center = QtCore.QPointF(0, 0) self.radius = 0 def mouseDown(self, pos, info, mouseEvent: QtGui.QMouseEvent=None): x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos) self.radius = 0 self.center.setX(x) self.center.setY(y) self.fill = info['fill'] self._active = True def mouseMove(self, pos, event): self.radius = PrimitiveShape.PrimitiveShape.euclideanNorm(pos, self.center) def mouseRelease(self): self.objectCreated.emit(self.getXasyObject()) self._active = False def getPreview(self): x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(self.center) boundRect = QtCore.QRectF(x - self.radius, y - self.radius, 2 * self.radius, 2 * self.radius) # because the internal image is flipped... newPath = QtGui.QPainterPath() newPath.addEllipse(boundRect) # newPath.addRect(boundRect) return newPath def getObject(self): return PrimitiveShape.PrimitiveShape.circle(self.center, self.radius) def getXasyObject(self): if self.fill: newObj = xasy2asy.xasyFilledShape(self.getObject(), None) else: newObj = xasy2asy.xasyShape(self.getObject(), None) return newObj def forceFinalize(self): self.mouseRelease() class AddLabel(InplaceObjProcess): def __init__(self, parent=None): super().__init__(parent) self.alignMode = None self.opt = None self.text = None self.anchor = QtCore.QPointF(0, 0) self._active = False self.fontSize = 12 def createOptWidget(self, info): self.opt = Widg_addLabel.Widg_addLabel(info) return self.opt def getPreview(self): return None def mouseRelease(self): self.objectCreated.emit(self.getXasyObject()) self._active = False def mouseMove(self, pos, event): x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos) self.anchor.setX(x) self.anchor.setY(y) def mouseDown(self, pos, info, mouseEvent: QtGui.QMouseEvent=None): if self.opt is not None: self.text = self.opt.labelText x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos) self.anchor.setX(x) self.anchor.setY(y) self.alignMode = info['align'] self.fontSize = info['fontSize'] self._active = True def getObject(self): finalTuple = PrimitiveShape.PrimitiveShape.pos_to_tuple(self.anchor) return {'txt': self.text, 'align': str(self.alignMode), 'anchor': finalTuple} def getXasyObject(self): text = self.text align = str(self.alignMode) anchor = PrimitiveShape.PrimitiveShape.pos_to_tuple(self.anchor) newLabel = xasy2asy.xasyText(text=text, location=anchor, pen=None, align=align, asyengine=None, fontsize=self.fontSize) newLabel.asyfied = False return newLabel def forceFinalize(self): self.mouseRelease() class AddBezierShape(InplaceObjProcess): def __init__(self, parent=None): super().__init__(parent) self.asyengine = None self.basePath = None self.basePathPreview = None self.closedPath = None self.info = None self.fill = False self.opt = None # list of "committed" points with Linkage information. # Linkmode should be to the last point. # (x, y, linkmode), (u, v, lm2) <==> (x, y) <=lm2=> (u, v) self.pointsList = [] self.currentPoint = QtCore.QPointF(0, 0) self.pendingPoint = None self.useLegacy = False def mouseDown(self, pos, info, mouseEvent: QtGui.QMouseEvent=None): x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos) self.currentPoint.setX(x) self.currentPoint.setY(y) self.info = info if not self._active: self._active = True self.fill = info['fill'] self.asyengine = info['asyengine'] self.closedPath = info['closedPath'] self.useBezierBase = info['useBezier'] self.useLegacy = self.info['options']['useLegacyDrawMode'] self.pointsList.clear() self.pointsList.append((x, y, None)) else: # see http://doc.qt.io/archives/qt-4.8/qt.html#MouseButton-enum if (int(mouseEvent.buttons()) if mouseEvent is not None else 0) & 0x2 and self.useLegacy: self.forceFinalize() def _getLinkType(self): if self.info['useBezier']: return '..' else: return '--' def mouseMove(self, pos, event): # in postscript coords. if self._active: x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos) if self.useLegacy or int(event.buttons()) != 0: self.currentPoint.setX(x) self.currentPoint.setY(y) else: self.forceFinalize() def createOptWidget(self, info): return None # self.opt = Widg_addBezierInPlace.Widg_addBezierInplace(info) # return self.opt def finalizeClosure(self): if self.active: self.closedPath = True self.forceFinalize() def mouseRelease(self): x, y = self.currentPoint.x(), self.currentPoint.y() self.pointsList.append((x, y, self._getLinkType())) # self.updateBasePath() def updateBasePath(self): self.basePath = xasy2asy.asyPath(asyengine=self.asyengine, forceCurve=self.useBezierBase) newNode = [(x, y) for x, y, _ in self.pointsList] newLink = [lnk for *args, lnk in self.pointsList[1:]] if self.useLegacy: newNode += [(self.currentPoint.x(), self.currentPoint.y())] newLink += [self._getLinkType()] if self.closedPath: newNode.append('cycle') newLink.append(self._getLinkType()) self.basePath.initFromNodeList(newNode, newLink) if self.useBezierBase: self.basePath.computeControls() def updateBasePathPreview(self): self.basePathPreview = xasy2asy.asyPath( asyengine=self.asyengine, forceCurve=self.useBezierBase) newNode = [(x, y) for x, y, _ in self.pointsList] + [(self.currentPoint.x(), self.currentPoint.y())] newLink = [lnk for *args, lnk in self.pointsList[1:]] + [self._getLinkType()] if self.closedPath: newNode.append('cycle') newLink.append(self._getLinkType()) self.basePathPreview.initFromNodeList(newNode, newLink) if self.useBezierBase: self.basePathPreview.computeControls() def forceFinalize(self): self.updateBasePath() self._active = False self.pointsList.clear() self.objectCreated.emit(self.getXasyObject()) self.basePath = None def getObject(self): if self.basePath is None: raise RuntimeError('BasePath is None') self.basePath.asyengine = self.asyengine return self.basePath def getPreview(self): if self._active: if self.pointsList: self.updateBasePathPreview() newPath = self.basePathPreview.toQPainterPath() return newPath def getXasyObject(self): if self.fill: return xasy2asy.xasyFilledShape(self.getObject(), None) else: return xasy2asy.xasyShape(self.getObject(), None) class AddPoly(InplaceObjProcess): def __init__(self, parent=None): super().__init__(parent) self.center = QtCore.QPointF(0, 0) self.currPos = QtCore.QPointF(0, 0) self.sides = None self.inscribed = None self.centermode = None self.asyengine = None self.fill = None self.opt = None def mouseDown(self, pos, info, mouseEvent: QtGui.QMouseEvent=None): self._active = True self.sides = info['sides'] self.inscribed = info['inscribed'] self.centermode = info['centermode'] self.fill = info['fill'] x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos) self.center.setX(x) self.center.setY(y) self.currPos = QtCore.QPointF(self.center) def mouseMove(self, pos, event): x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos) self.currPos.setX(x) self.currPos.setY(y) def mouseRelease(self): if self.active: self.objectCreated.emit(self.getXasyObject()) self._active = False def forceFinalize(self): self.mouseRelease() def getObject(self): if self.inscribed: return PrimitiveShape.PrimitiveShape.inscribedRegPolygon(self.sides, self.center, self._rad(), self._angle()) else: return PrimitiveShape.PrimitiveShape.exscribedRegPolygon(self.sides, self.center, self._rad(), self._angle()) def getPreview(self): if self.inscribed: poly = PrimitiveShape.PrimitiveShape.inscribedRegPolygon(self.sides, self.center, self._rad(), self._angle(), qpoly=True) else: poly = PrimitiveShape.PrimitiveShape.exscribedRegPolygon(self.sides, self.center, self._rad(), self._angle(), qpoly=True) newPath = QtGui.QPainterPath() newPath.addPolygon(poly) return newPath def createOptWidget(self, info): self.opt = Widg_addPolyOpt.Widg_addPolyOpt(info) return self.opt def _rad(self): return PrimitiveShape.PrimitiveShape.euclideanNorm(self.currPos, self.center) def _angle(self): dist_x = self.currPos.x() - self.center.x() dist_y = self.currPos.y() - self.center.y() if dist_x == 0 and dist_y == 0: return 0 else: return math.atan2(dist_y, dist_x) def getXasyObject(self): if self.fill: newObj = xasy2asy.xasyFilledShape(self.getObject(), None) else: newObj = xasy2asy.xasyShape(self.getObject(), None) return newObj class AddFreehand(InplaceObjProcess): # TODO: At the moment this is just a copy-paste of the AddBezierObj. # Must find a better algorithm for constructing the obj rather than # a node for every pixel the mouse moves. def __init__(self, parent=None): super().__init__(parent) self.asyengine = None self.basePath = None self.basePathPreview = None self.closedPath = None self.info = None self.fill = False self.opt = None # list of "committed" points with Linkage information. # Linkmode should be to the last point. # (x, y, linkmode), (u, v, lm2) <==> (x, y) <=lm2=> (u, v) self.pointsList = [] self.currentPoint = QtCore.QPointF(0, 0) self.pendingPoint = None self.useLegacy = False def mouseDown(self, pos, info, mouseEvent: QtGui.QMouseEvent=None): x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos) self.currentPoint.setX(x) self.currentPoint.setY(y) self.info = info if not self._active: self._active = True self.fill = info['fill'] self.asyengine = info['asyengine'] self.closedPath = info['closedPath'] self.useBezierBase = info['useBezier'] self.useLegacy = self.info['options']['useLegacyDrawMode'] self.pointsList.clear() self.pointsList.append((x, y, None)) else: # see http://doc.qt.io/archives/qt-4.8/qt.html#MouseButton-enum if (int(mouseEvent.buttons()) if mouseEvent is not None else 0) & 0x2 and self.useLegacy: self.forceFinalize() def _getLinkType(self): if self.info['useBezier']: return '..' else: return '--' def mouseMove(self, pos, event): # in postscript coords. if self._active: x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos) if self.useLegacy or int(event.buttons()) != 0: self.currentPoint.setX(x) self.currentPoint.setY(y) self.pointsList.append((x, y, self._getLinkType())) def createOptWidget(self, info): return None def mouseRelease(self): self.updateBasePath() self._active = False self.pointsList.clear() self.objectCreated.emit(self.getXasyObject()) self.basePath = None def updateBasePath(self): self.basePath = xasy2asy.asyPath(asyengine=self.asyengine, forceCurve=self.useBezierBase) newNode = [(x, y) for x, y, _ in self.pointsList] newLink = [lnk for *args, lnk in self.pointsList[1:]] if self.useLegacy: newNode += [(self.currentPoint.x(), self.currentPoint.y())] newLink += [self._getLinkType()] if self.closedPath: newNode.append('cycle') newLink.append(self._getLinkType()) self.basePath.initFromNodeList(newNode, newLink) if self.useBezierBase: self.basePath.computeControls() def updateBasePathPreview(self): self.basePathPreview = xasy2asy.asyPath( asyengine=self.asyengine, forceCurve=self.useBezierBase) newNode = [(x, y) for x, y, _ in self.pointsList] + [(self.currentPoint.x(), self.currentPoint.y())] newLink = [lnk for *args, lnk in self.pointsList[1:]] + [self._getLinkType()] if self.closedPath: newNode.append('cycle') newLink.append(self._getLinkType()) self.basePathPreview.initFromNodeList(newNode, newLink) if self.useBezierBase: self.basePathPreview.computeControls() def getObject(self): if self.basePath is None: raise RuntimeError('BasePath is None') self.basePath.asyengine = self.asyengine return self.basePath def getPreview(self): if self._active: if self.pointsList: self.updateBasePathPreview() newPath = self.basePathPreview.toQPainterPath() return newPath def getXasyObject(self): self.fill = False return xasy2asy.xasyShape(self.getObject(), None) asymptote-3.05/GUI/Window1.py0000644000000000000000000027770515031566105014536 0ustar rootroot#!/usr/bin/env python3 from xasyqtui.window1 import Ui_MainWindow import PyQt5.QtWidgets as Qw import PyQt5.QtGui as Qg import PyQt5.QtCore as Qc from xasyversion.version import VERSION as xasyVersion import numpy as np import os import json import io import pathlib import webbrowser import subprocess import tempfile import datetime import string import atexit import pickle import xasyUtils as xu import xasy2asy as x2a import xasyFile as xf import xasyOptions as xo import UndoRedoStack as Urs import xasyArgs as xa import xasyBezierInterface as xbi from xasyTransform import xasyTransform as xT import xasyStrings as xs import PrimitiveShape import InplaceAddObj import ContextWindow import CustMatTransform import SetCustomAnchor import GuidesManager class ActionChanges: pass # State Invariance: When ActionChanges is at the top, all state of the program & file # is exactly like what it was the event right after that ActionChanges was created. class TransformationChanges(ActionChanges): def __init__(self, objIndex, transformation, isLocal=False): self.objIndex = objIndex self.transformation = transformation self.isLocal = isLocal class ObjCreationChanges(ActionChanges): def __init__(self, obj): self.object = obj class HardDeletionChanges(ActionChanges): def __init__(self, obj, pos): self.item = obj self.objIndex = pos class SoftDeletionChanges(ActionChanges): def __init__(self, obj, keyPos): self.item = obj self.keyMap = keyPos class EditBezierChanges(ActionChanges): def __init__(self, obj, pos, oldPath, newPath): self.item = obj self.objIndex = pos self.oldPath = oldPath self.newPath = newPath class AnchorMode: center = 0 origin = 1 topLeft = 2 topRight = 3 bottomRight = 4 bottomLeft = 5 customAnchor = 6 class GridMode: cartesian = 0 polar = 1 class SelectionMode: select = 0 pan = 1 translate = 2 rotate = 3 scale = 4 delete = 5 setAnchor = 6 selectEdit = 7 openPoly = 8 closedPoly = 9 openCurve = 10 closedCurve = 11 addPoly = 12 addCircle = 13 addLabel = 14 addFreehand = 15 class AddObjectMode: Circle = 0 Arc = 1 Polygon = 2 class MainWindow1(Qw.QMainWindow): defaultFrameStyle = """ QFrame{{ padding: 4.0; border-radius: 3.0; background: rgb({0}, {1}, {2}) }} """ def __init__(self): self.testingActions = [] super().__init__() self.ui = Ui_MainWindow() global devicePixelRatio devicePixelRatio=self.devicePixelRatio() self.ui.setupUi(self) self.ui.menubar.setNativeMenuBar(False) self.setWindowIcon(Qg.QIcon("../asy.ico")) self.settings = xo.BasicConfigs.defaultOpt self.keyMaps = xo.BasicConfigs.keymaps self.openRecent = xo.BasicConfigs.openRecent self.raw_args = Qc.QCoreApplication.arguments() self.args = xa.parseArgs(self.raw_args) self.strings = xs.xasyString(self.args.language) self.asy2psmap = x2a.yflip() if self.settings['asyBaseLocation'] is not None: os.environ['ASYMPTOTE_DIR'] = self.settings['asyBaseLocation'] addrAsyArgsRaw: str = self.args.additionalAsyArgs or \ self.settings.get('additionalAsyArgs', "") self.asyPath = self.args.asypath or self.settings.get('asyPath') self.asyEngine = x2a.AsymptoteEngine( self.asyPath, None if not addrAsyArgsRaw else addrAsyArgsRaw.split(',') ) try: self.asyEngine.start() finally: atexit.register(self.asyEngine.cleanup) # For initialization purposes self.canvSize = Qc.QSize() self.fileName = None self.asyFileName = None self.currDir = None self.mainCanvas = None self.dpi = 300 self.canvasPixmap = None self.tx=0 self.ty=0 # Actions # Connecting Actions self.ui.txtLineWidth.setValidator(Qg.QDoubleValidator()) self.connectActions() self.connectButtons() self.ui.txtLineWidth.returnPressed.connect(self.btnTerminalCommandOnClick) # # Base Transformations self.mainTransformation = Qg.QTransform() self.mainTransformation.scale(1, 1) self.localTransform = Qg.QTransform() self.screenTransformation = Qg.QTransform() self.panTranslation = Qg.QTransform() # Internal Settings self.magnification = self.args.mag self.inMidTransformation = False self.addMode = None self.currentlySelectedObj = {'key': None, 'allSameKey': set(), 'selectedIndex': None, 'keyIndex': None} self.pendingSelectedObjList = [] self.pendingSelectedObjIndex = -1 self.savedMousePosition = None self.currentBoundingBox = None self.selectionDelta = None self.newTransform = None self.origBboxTransform = None self.deltaAngle = 0 self.scaleFactor = 1 self.panOffset = [0, 0] # Keyboard can focus outside of textboxes self.setFocusPolicy(Qc.Qt.StrongFocus) super().setMouseTracking(True) # setMouseTracking(True) self.undoRedoStack = Urs.actionStack() self.lockX = False self.lockY = False self.anchorMode = AnchorMode.center self.currentAnchor = Qc.QPointF(0, 0) self.customAnchor = None self.useGlobalCoords = True self.drawAxes = True self.drawGrid = False self.gridSnap = False # TODO: for now. turn it on later self.fileChanged = False self.terminalPythonMode = self.ui.btnTogglePython.isChecked() self.savedWindowMousePos = None self.finalPixmap = None self.postCanvasPixmap = None self.previewCurve = None self.mouseDown = False self.globalObjectCounter = 1 self.fileItems = [] self.drawObjects = [] self.xasyDrawObj = {'drawDict': self.drawObjects} self.modeButtons = { self.ui.btnTranslate, self.ui.btnRotate, self.ui.btnScale, # self.ui.btnSelect, self.ui.btnPan, self.ui.btnDeleteMode, self.ui.btnAnchor, self.ui.btnSelectEdit, self.ui.btnOpenPoly, self.ui.btnClosedPoly, self.ui.btnOpenCurve, self.ui.btnClosedCurve, self.ui.btnAddPoly, self.ui.btnAddCircle, self.ui.btnAddLabel, self.ui.btnAddFreehand } self.objButtons = {self.ui.btnCustTransform, self.ui.actionTransform, self.ui.btnSendForwards, self.ui.btnSendBackwards, self.ui.btnToggleVisible } self.globalTransformOnlyButtons = (self.ui.comboAnchor, self.ui.btnAnchor) self.ui.txtTerminalPrompt.setFont(Qg.QFont(self.settings['terminalFont'])) self.currAddOptionsWgt = None self.currAddOptions = { 'options': self.settings, 'inscribed': True, 'sides': 3, 'centermode': True, 'fontSize': None, 'asyengine': self.asyEngine, 'fill': self.ui.btnFill.isChecked(), 'closedPath': False, 'useBezier': True, 'magnification': self.magnification, 'editBezierlockMode': xbi.Web.LockMode.angleLock, 'autoRecompute': False } self.currentModeStack = [SelectionMode.translate] self.drawGridMode = GridMode.cartesian self.setAllInSetEnabled(self.objButtons, False) self._currentPen = x2a.asyPen() self.currentGuides = [] self.selectAsGroup = self.settings['groupObjDefault'] # commands switchboard self.commandsFunc = { 'quit': self.btnCloseFileonClick, 'undo': self.btnUndoOnClick, 'redo': self.btnRedoOnClick, 'manual': self.actionManual, 'about': self.actionAbout, 'loadFile': self.btnLoadFileonClick, 'save': self.actionSave, 'saveAs': self.actionSaveAs, 'transform': self.btnCustTransformOnClick, 'commandPalette': self.enterCustomCommand, 'clearGuide': self.clearGuides, 'finalizeAddObj': self.finalizeAddObj, 'finalizeCurve': self.finalizeCurve, 'finalizeCurveClosed': self.finalizeCurveClosed, 'setMag': self.setMagPrompt, 'deleteObject': self.btnSelectiveDeleteOnClick, 'anchorMode': self.switchToAnchorMode, 'moveUp': lambda: self.translate(0, -1), 'moveDown': lambda: self.translate(0, 1), 'moveLeft': lambda: self.translate(-1, 0), 'moveRight': lambda: self.translate(1, 0), 'scrollLeft': lambda: self.arrowButtons(-1, 0, True), 'scrollRight': lambda: self.arrowButtons(1, 0, True), 'scrollUp': lambda: self.arrowButtons(0, 1, True), 'scrollDown': lambda: self.arrowButtons(0, -1, True), 'zoomIn': lambda: self.arrowButtons(0, 1, False, True), 'zoomOut': lambda: self.arrowButtons(0, -1, False, True), 'open': self.btnLoadFileonClick, 'save': self.actionSave, 'export': self.btnExportAsymptoteOnClick, 'copy': self.copyItem, 'paste': self.pasteItem } self.hiddenKeys = set() # Coordinates Label self.coordLabel = Qw.QLabel(self.ui.statusbar) self.ui.statusbar.addPermanentWidget(self.coordLabel) # Settings Initialization # from xasyoptions config file self.loadKeyMaps() self.setupXasyOptions() self.populateOpenRecent() self.colorDialog = Qw.QColorDialog(x2a.asyPen.convertToQColor(self._currentPen.color), self) self.initPenInterface() def arrowButtons(self, x:int , y:int, shift: bool=False, ctrl: bool=False): "x, y indicates update button orientation on the cartesian plane." if not (shift or ctrl): self.changeSelection(y) elif not (shift and ctrl): self.mouseWheel(30*x, 30*y) self.quickUpdate() def translate(self, x:int , y:int): "x, y indicates update button orientation on the cartesian plane." if self.lockX: x = 0 if self.lockY: y = 0 self.tx += x self.ty += y self.newTransform=Qg.QTransform.fromTranslate(self.tx,self.ty) self.quickUpdate() def cleanup(self): self.asyengine.cleanup() def getScrsTransform(self): # pipeline: # assuming origin <==> top left # (Pan) * (Translate) * (Flip the images) * (Zoom) * (Obj transform) * (Base Information) # pipeline --> let x, y be the postscript point # p = (mx + cx + panoffset, -ny + cy + panoffset) factor=0.5/devicePixelRatio; cx, cy = self.canvSize.width()*factor, self.canvSize.height()*factor newTransf = Qg.QTransform() newTransf.translate(*self.panOffset) newTransf.translate(cx, cy) newTransf.scale(1, 1) newTransf.scale(self.magnification, self.magnification) return newTransf def finalizeCurve(self): if self.addMode is not None: if self.addMode.active and isinstance(self.addMode, InplaceAddObj.AddBezierShape): self.addMode.forceFinalize() self.fileChanged = True def finalizeCurveClosed(self): if self.addMode is not None: if self.addMode.active and isinstance(self.addMode, InplaceAddObj.AddBezierShape): self.addMode.finalizeClosure() self.fileChanged = True def getAllBoundingBox(self) -> Qc.QRectF: newRect = Qc.QRectF() for majitem in self.drawObjects: for minitem in majitem: newRect = newRect.united(minitem.boundingBox) return newRect def finalizeAddObj(self): if self.addMode is not None: if self.addMode.active: self.addMode.forceFinalize() self.fileChanged = True def openAndReloadSettings(self): settingsFile = self.settings.settingsFileLocation() subprocess.run(args=self.getExternalEditor(asypath=settingsFile)) self.settings.load() self.quickUpdate() def openAndReloadKeymaps(self): keymapsFile = self.keyMaps.settingsFileLocation() subprocess.run(args=self.getExternalEditor(asypath=keymapsFile)) self.settings.load() self.quickUpdate() def setMagPrompt(self): commandText, result = Qw.QInputDialog.getText(self, '', 'Enter magnification:') if result: self.magnification = float(commandText) self.currAddOptions['magnification'] = self.magnification self.quickUpdate() def setTextPrompt(self): commandText, result = Qw.QInputDialog.getText(self, '', 'Enter new text:') if result: return commandText def btnTogglePythonOnClick(self, checked): self.terminalPythonMode = checked def internationalize(self): self.ui.btnRotate.setToolTip(self.strings.rotate) def handleArguments(self): if self.args.filename is not None: if os.path.exists(self.args.filename): self.actionOpen(os.path.abspath(self.args.filename)) else: self.loadFile(self.args.filename) else: self.initializeEmptyFile() if self.args.language != 'en': self.internationalize() def initPenInterface(self): self.ui.txtLineWidth.setText(str(self._currentPen.width)) self.updateFrameDispColor() def updateFrameDispColor(self): r, g, b = [int(x * 255) for x in self._currentPen.color] self.ui.frameCurrColor.setStyleSheet(MainWindow1.defaultFrameStyle.format(r, g, b)) def initDebug(self): debugFunc = { } self.commandsFunc = {**self.commandsFunc, **debugFunc} def dbgRecomputeCtrl(self): if isinstance(self.addMode, xbi.InteractiveBezierEditor): self.addMode.recalculateCtrls() self.quickUpdate() def objectUpdated(self): self.removeAddMode() self.clearSelection() self.asyfyCanvas() def connectActions(self): self.ui.actionQuit.triggered.connect(lambda: self.execCustomCommand('quit')) self.ui.actionUndo.triggered.connect(lambda: self.execCustomCommand('undo')) self.ui.actionRedo.triggered.connect(lambda: self.execCustomCommand('redo')) self.ui.actionTransform.triggered.connect(lambda: self.execCustomCommand('transform')) self.ui.actionNewFile.triggered.connect(self.actionNewFile) self.ui.actionOpen.triggered.connect(self.actionOpen) self.ui.actionClearRecent.triggered.connect(self.actionClearRecent) self.ui.actionSave.triggered.connect(self.actionSave) self.ui.actionSaveAs.triggered.connect(self.actionSaveAs) self.ui.actionManual.triggered.connect(self.actionManual) self.ui.actionAbout.triggered.connect(self.actionAbout) self.ui.actionSettings.triggered.connect(self.openAndReloadSettings) self.ui.actionKeymaps.triggered.connect(self.openAndReloadKeymaps) self.ui.actionEnterCommand.triggered.connect(self.enterCustomCommand) self.ui.actionExportAsymptote.triggered.connect(self.btnExportAsymptoteOnClick) self.ui.actionExportToAsy.triggered.connect(self.btnExportToAsyOnClick) def setupXasyOptions(self): if self.settings['debugMode']: self.initDebug() newColor = Qg.QColor(self.settings['defaultPenColor']) newWidth = self.settings['defaultPenWidth'] self._currentPen.setColorFromQColor(newColor) self._currentPen.setWidth(newWidth) def connectButtons(self): # Button initialization self.ui.btnUndo.clicked.connect(self.btnUndoOnClick) self.ui.btnRedo.clicked.connect(self.btnRedoOnClick) self.ui.btnLoadFile.clicked.connect(self.btnLoadFileonClick) self.ui.btnSave.clicked.connect(self.btnSaveonClick) self.ui.btnQuickScreenshot.clicked.connect(self.btnQuickScreenshotOnClick) # self.ui.btnExportAsy.clicked.connect(self.btnExportAsymptoteOnClick) self.ui.btnDrawAxes.clicked.connect(self.btnDrawAxesOnClick) # self.ui.btnAsyfy.clicked.connect(lambda: self.asyfyCanvas(True)) self.ui.btnSetZoom.clicked.connect(self.setMagPrompt) self.ui.btnResetPan.clicked.connect(self.resetPan) self.ui.btnPanCenter.clicked.connect(self.btnPanCenterOnClick) self.ui.btnTranslate.clicked.connect(self.btnTranslateonClick) self.ui.btnRotate.clicked.connect(self.btnRotateOnClick) self.ui.btnScale.clicked.connect(self.btnScaleOnClick) # self.ui.btnSelect.clicked.connect(self.btnSelectOnClick) self.ui.btnPan.clicked.connect(self.btnPanOnClick) # self.ui.btnDebug.clicked.connect(self.pauseBtnOnClick) self.ui.btnAlignX.clicked.connect(self.btnAlignXOnClick) self.ui.btnAlignY.clicked.connect(self.btnAlignYOnClick) self.ui.comboAnchor.currentIndexChanged.connect(self.handleAnchorComboIndex) self.ui.btnCustTransform.clicked.connect(self.btnCustTransformOnClick) self.ui.btnViewCode.clicked.connect(self.btnLoadEditorOnClick) self.ui.btnAnchor.clicked.connect(self.btnAnchorModeOnClick) self.ui.btnSelectColor.clicked.connect(self.btnColorSelectOnClick) self.ui.txtLineWidth.textEdited.connect(self.txtLineWidthEdited) # self.ui.btnCreateCurve.clicked.connect(self.btnCreateCurveOnClick) self.ui.btnDrawGrid.clicked.connect(self.btnDrawGridOnClick) self.ui.btnAddCircle.clicked.connect(self.btnAddCircleOnClick) self.ui.btnAddPoly.clicked.connect(self.btnAddPolyOnClick) self.ui.btnAddLabel.clicked.connect(self.btnAddLabelOnClick) self.ui.btnAddFreehand.clicked.connect(self.btnAddFreehandOnClick) # self.ui.btnAddBezierInplace.clicked.connect(self.btnAddBezierInplaceOnClick) self.ui.btnClosedCurve.clicked.connect(self.btnAddClosedCurveOnClick) self.ui.btnOpenCurve.clicked.connect(self.btnAddOpenCurveOnClick) self.ui.btnClosedPoly.clicked.connect(self.btnAddClosedLineOnClick) self.ui.btnOpenPoly.clicked.connect(self.btnAddOpenLineOnClick) self.ui.btnFill.clicked.connect(self.btnFillOnClick) self.ui.btnSendBackwards.clicked.connect(self.btnSendBackwardsOnClick) self.ui.btnSendForwards.clicked.connect(self.btnSendForwardsOnClick) # self.ui.btnDelete.clicked.connect(self.btnSelectiveDeleteOnClick) self.ui.btnDeleteMode.clicked.connect(self.btnDeleteModeOnClick) # self.ui.btnSoftDelete.clicked.connect(self.btnSoftDeleteOnClick) self.ui.btnToggleVisible.clicked.connect(self.btnSetVisibilityOnClick) self.ui.btnEnterCommand.clicked.connect(self.btnTerminalCommandOnClick) self.ui.btnTogglePython.clicked.connect(self.btnTogglePythonOnClick) self.ui.btnSelectEdit.clicked.connect(self.btnSelectEditOnClick) def btnDeleteModeOnClick(self): if self.currentModeStack[-1] != SelectionMode.delete: self.currentModeStack = [SelectionMode.delete] self.ui.statusbar.showMessage('Delete mode') self.clearSelection() self.updateChecks() else: self.btnTranslateonClick() def btnTerminalCommandOnClick(self): if self.terminalPythonMode: exec(self.ui.txtTerminalPrompt.text()) self.fileChanged = True else: pass # TODO: How to handle this case? # Like AutoCAD? self.ui.txtTerminalPrompt.clear() def btnFillOnClick(self, checked): self.currAddOptions['fill'] = checked self.ui.btnOpenCurve.setEnabled(not checked) self.ui.btnOpenPoly.setEnabled(not checked) def btnSelectEditOnClick(self): if self.currentModeStack[-1] != SelectionMode.selectEdit: self.currentModeStack = [SelectionMode.selectEdit] self.ui.statusbar.showMessage('Edit mode') self.clearSelection() self.updateChecks() else: self.btnTranslateonClick() @property def currentPen(self): return x2a.asyPen.fromAsyPen(self._currentPen) pass def debug(self): print('Put a breakpoint here.') def execPythonCmd(self): commandText, result = Qw.QInputDialog.getText(self, '', 'enter python cmd') if result: exec(commandText) def deleteAddOptions(self): if self.currAddOptionsWgt is not None: self.currAddOptionsWgt.hide() self.ui.addOptionLayout.removeWidget(self.currAddOptionsWgt) self.currAddOptionsWgt = None def updateOptionWidget(self): try: self.addMode.objectCreated.disconnect() except Exception: pass #self.currentModeStack[-1] = None self.addMode.objectCreated.connect(self.addInPlace) self.updateModeBtnsOnly() self.deleteAddOptions() self.currAddOptionsWgt = self.addMode.createOptWidget(self.currAddOptions) if self.currAddOptionsWgt is not None: self.ui.addOptionLayout.addWidget(self.currAddOptionsWgt) def addInPlace(self, obj): obj.asyengine = self.asyEngine if isinstance(obj, x2a.xasyText): obj.label.pen = self.currentPen else: obj.pen = self.currentPen obj.onCanvas = self.xasyDrawObj obj.setKey(str(self.globalObjectCounter)) self.globalObjectCounter = self.globalObjectCounter + 1 self.fileItems.append(obj) self.fileChanged = True self.addObjCreationUrs(obj) self.asyfyCanvas() def addObjCreationUrs(self, obj): newAction = self.createAction(ObjCreationChanges(obj)) self.undoRedoStack.add(newAction) self.checkUndoRedoButtons() def clearGuides(self): self.currentGuides.clear() self.quickUpdate() LegacyHint='Click and drag to draw; right click or space bar to finalize' Hint='Click and drag to draw; release and click in place to add node; continue dragging' HintClose=' or c to close.' def drawHint(self): if self.settings['useLegacyDrawMode']: self.ui.statusbar.showMessage(self.LegacyHint+'.') else: self.ui.statusbar.showMessage(self.Hint+'.') def drawHintOpen(self): if self.settings['useLegacyDrawMode']: self.ui.statusbar.showMessage(self.LegacyHint+self.HintClose) else: self.ui.statusbar.showMessage(self.Hint+self.HintClose) def btnAddBezierInplaceOnClick(self): self.fileChanged = True self.addMode = InplaceAddObj.AddBezierShape(self) self.updateOptionWidget() def btnAddOpenLineOnClick(self): if self.currentModeStack[-1] != SelectionMode.openPoly: self.currentModeStack = [SelectionMode.openPoly] self.currAddOptions['useBezier'] = False self.currAddOptions['closedPath'] = False self.drawHintOpen() self.btnAddBezierInplaceOnClick() else: self.btnTranslateonClick() def btnAddClosedLineOnClick(self): if self.currentModeStack[-1] != SelectionMode.closedPoly: self.currentModeStack = [SelectionMode.closedPoly] self.currAddOptions['useBezier'] = False self.currAddOptions['closedPath'] = True self.drawHint() self.btnAddBezierInplaceOnClick() else: self.btnTranslateonClick() def btnAddOpenCurveOnClick(self): if self.currentModeStack[-1] != SelectionMode.openCurve: self.currentModeStack = [SelectionMode.openCurve] self.currAddOptions['useBezier'] = True self.currAddOptions['closedPath'] = False self.drawHintOpen() self.btnAddBezierInplaceOnClick() else: self.btnTranslateonClick() def btnAddClosedCurveOnClick(self): if self.currentModeStack[-1] != SelectionMode.closedCurve: self.currentModeStack = [SelectionMode.closedCurve] self.currAddOptions['useBezier'] = True self.currAddOptions['closedPath'] = True self.drawHint() self.btnAddBezierInplaceOnClick() else: self.btnTranslateonClick() def btnAddPolyOnClick(self): if self.currentModeStack[-1] != SelectionMode.addPoly: self.currentModeStack = [SelectionMode.addPoly] self.addMode = InplaceAddObj.AddPoly(self) self.ui.statusbar.showMessage('Add polygon on click') self.updateOptionWidget() else: self.btnTranslateonClick() def btnAddCircleOnClick(self): if self.currentModeStack[-1] != SelectionMode.addCircle: self.currentModeStack = [SelectionMode.addCircle] self.addMode = InplaceAddObj.AddCircle(self) self.ui.statusbar.showMessage('Add circle on click') self.updateOptionWidget() else: self.btnTranslateonClick() def btnAddLabelOnClick(self): if self.currentModeStack[-1] != SelectionMode.addLabel: self.currentModeStack = [SelectionMode.addLabel] self.addMode = InplaceAddObj.AddLabel(self) self.ui.statusbar.showMessage('Add label on click') self.updateOptionWidget() else: self.btnTranslateonClick() def btnAddFreehandOnClick(self): if self.currentModeStack[-1] != SelectionMode.addFreehand: self.currentModeStack = [SelectionMode.addFreehand] self.currAddOptions['useBezier'] = False self.currAddOptions['closedPath'] = False self.ui.statusbar.showMessage("Draw freehand") self.addMode = InplaceAddObj.AddFreehand(self) self.updateOptionWidget() else: self.btnTranslateonClick() def addTransformationChanges(self, objIndex, transform, isLocal=False): self.undoRedoStack.add(self.createAction(TransformationChanges(objIndex, transform, isLocal))) self.checkUndoRedoButtons() def btnSendForwardsOnClick(self): if self.currentlySelectedObj['selectedIndex'] is not None: maj, minor = self.currentlySelectedObj['selectedIndex'] selectedObj = self.drawObjects[maj][minor] index = self.fileItems.index(selectedObj.parent()) self.clearSelection() if index == len(self.fileItems) - 1: return else: self.fileItems[index], self.fileItems[index + 1] = self.fileItems[index + 1], self.fileItems[index] self.asyfyCanvas() def btnSelectiveDeleteOnClick(self): if self.currentlySelectedObj['selectedIndex'] is not None: maj, minor = self.currentlySelectedObj['selectedIndex'] selectedObj = self.drawObjects[maj][minor] parent = selectedObj.parent() if isinstance(parent, x2a.xasyScript): objKey=(selectedObj.key, selectedObj.keyIndex) self.hiddenKeys.add(objKey) self.undoRedoStack.add(self.createAction( SoftDeletionChanges(selectedObj.parent(), objKey) )) self.softDeleteObj((maj, minor)) else: index = self.fileItems.index(selectedObj.parent()) self.undoRedoStack.add(self.createAction( HardDeletionChanges(selectedObj.parent(), index) )) self.fileItems.remove(selectedObj.parent()) self.checkUndoRedoButtons() self.fileChanged = True self.clearSelection() self.asyfyCanvas() else: result = self.selectOnHover() if result: self.btnSelectiveDeleteOnClick() def btnSetVisibilityOnClick(self): if self.currentlySelectedObj['selectedIndex'] is not None: maj, minor = self.currentlySelectedObj['selectedIndex'] selectedObj = self.drawObjects[maj][minor] self.hiddenKeys.symmetric_difference_update({(selectedObj.key, selectedObj.keyIndex)}) self.clearSelection() self.quickUpdate() def btnSendBackwardsOnClick(self): if self.currentlySelectedObj['selectedIndex'] is not None: maj, minor = self.currentlySelectedObj['selectedIndex'] selectedObj = self.drawObjects[maj][minor] index = self.fileItems.index(selectedObj.parent()) self.clearSelection() if index == 0: return else: self.fileItems[index], self.fileItems[index - 1] = self.fileItems[index - 1], self.fileItems[index] self.asyfyCanvas() def btnUndoOnClick(self): if self.currentlySelectedObj['selectedIndex'] is not None: # avoid deleting currently selected object maj, minor = self.currentlySelectedObj['selectedIndex'] selectedObj = self.drawObjects[maj][minor] if selectedObj != self.drawObjects[-1][0]: self.undoRedoStack.undo() self.checkUndoRedoButtons() else: self.undoRedoStack.undo() self.checkUndoRedoButtons() def btnRedoOnClick(self): self.undoRedoStack.redo() self.checkUndoRedoButtons() def checkUndoRedoButtons(self): self.ui.btnUndo.setEnabled(self.undoRedoStack.changesMade()) self.ui.actionUndo.setEnabled(self.undoRedoStack.changesMade()) self.ui.btnRedo.setEnabled(len(self.undoRedoStack.redoStack) > 0) self.ui.actionRedo.setEnabled(len(self.undoRedoStack.redoStack) > 0) def handleUndoChanges(self, change): assert isinstance(change, ActionChanges) if isinstance(change, TransformationChanges): self.transformObject(change.objIndex, change.transformation.inverted(), change.isLocal) elif isinstance(change, ObjCreationChanges): self.fileItems.pop() elif isinstance(change, HardDeletionChanges): self.fileItems.insert(change.objIndex, change.item) elif isinstance(change, SoftDeletionChanges): key, keyIndex = change.keyMap self.hiddenKeys.remove((key, keyIndex)) change.item.transfKeymap[key][keyIndex].deleted = False elif isinstance(change, EditBezierChanges): self.fileItems[change.objIndex].path = change.oldPath self.asyfyCanvas() def handleRedoChanges(self, change): assert isinstance(change, ActionChanges) if isinstance(change, TransformationChanges): self.transformObject( change.objIndex, change.transformation, change.isLocal) elif isinstance(change, ObjCreationChanges): self.fileItems.append(change.object) elif isinstance(change, HardDeletionChanges): self.fileItems.remove(change.item) elif isinstance(change, SoftDeletionChanges): key, keyIndex = change.keyMap self.hiddenKeys.add((key, keyIndex)) change.item.transfKeymap[key][keyIndex].deleted = True elif isinstance(change, EditBezierChanges): self.fileItems[change.objIndex].path = change.newPath self.asyfyCanvas() # is this a "pythonic" way? def createAction(self, changes): def _change(): return self.handleRedoChanges(changes) def _undoChange(): return self.handleUndoChanges(changes) return Urs.action((_change, _undoChange)) def execCustomCommand(self, command): if command in self.commandsFunc: self.commandsFunc[command]() else: self.ui.statusbar.showMessage('Command {0} not found'.format(command)) def enterCustomCommand(self): commandText, result = Qw.QInputDialog.getText(self, 'Enter Custom Command', 'Enter Custom Command') if result: self.execCustomCommand(commandText) def addXasyShapeFromPath(self, path, pen = None, transform = x2a.identity(), key = None, fill = False): dashPattern = pen['dashPattern'] #? if not pen: pen = self.currentPen else: pen = x2a.asyPen(self.asyEngine, color = pen['color'], width = pen['width'], pen_options = pen['options']) if dashPattern: pen.setDashPattern(dashPattern) newItem = x2a.xasyShape(path, self.asyEngine, pen = pen, transform = transform) if fill: newItem.swapFill() newItem.setKey(key) self.fileItems.append(newItem) def addXasyArrowFromPath(self, pen, transform, key, arrowSettings, code, dashPattern = None): if not pen: pen = self.currentPen else: pen = x2a.asyPen(self.asyEngine, color = pen['color'], width = pen['width'], pen_options = pen['options']) if dashPattern: pen.setDashPattern(dashPattern) newItem = x2a.asyArrow(self.asyEngine, pen, transform, key, canvas=self.xasyDrawObj, code=code) newItem.setKey(key) newItem.arrowSettings = arrowSettings self.fileItems.append(newItem) def addXasyTextFromData(self, text, location, pen, transform, key, align, fontSize): if not pen: pen = self.currentPen else: pen = x2a.asyPen(self.asyEngine, color = pen['color'], width = pen['width'], pen_options = pen['options']) newItem = x2a.xasyText(text, location, self.asyEngine, pen, transform, key, align, fontSize) newItem.setKey(key) newItem.onCanvas = self.xasyDrawObj self.fileItems.append(newItem) def actionManual(self): asyManualURL = 'https://asymptote.sourceforge.io/asymptote.pdf' webbrowser.open_new(asyManualURL) def actionAbout(self): Qw.QMessageBox.about(self,"xasy","This is xasy "+xasyVersion+"; a graphical front end to the Asymptote vector graphics language: https://asymptote.sourceforge.io/") def actionExport(self, pathToFile): asyFile = io.open(os.path.realpath(pathToFile), 'w') xf.saveFile(asyFile, self.fileItems, self.asy2psmap) asyFile.close() self.ui.statusbar.showMessage(f"Exported to '{pathToFile}' as an Asymptote file.") def btnExportToAsyOnClick(self): if self.fileName: pathToFile = os.path.splitext(self.fileName)[0]+'.asy' else: self.btnExportAsymptoteOnClick() return if os.path.isfile(pathToFile): reply = Qw.QMessageBox.question(self, 'Message', f'"{os.path.split(pathToFile)[1]}" already exists. Do you want to overwrite it?', Qw.QMessageBox.Yes, Qw.QMessageBox.No) if reply == Qw.QMessageBox.No: return self.actionExport(pathToFile) def btnExportAsymptoteOnClick(self): diag = Qw.QFileDialog(self) diag.setAcceptMode(Qw.QFileDialog.AcceptSave) formatId = { 'asy': { 'name': 'Asymptote Files', 'ext': ['*.asy'] }, 'pdf': { 'name': 'PDF Files', 'ext': ['*.pdf'] }, 'svg': { 'name': 'Scalable Vector Graphics', 'ext': ['*.svg'] }, 'eps': { 'name': 'Postscript Files', 'ext': ['*.eps'] }, 'png': { 'name': 'Portable Network Graphics', 'ext': ['*.png'] }, '*': { 'name': 'Any Files', 'ext': ['*.*'] } } formats = ['asy', 'pdf', 'svg', 'eps', 'png', '*'] formatText = ';;'.join('{0:s} ({1:s})'.format(formatId[form]['name'], ' '.join(formatId[form]['ext'])) for form in formats) if self.currDir is not None: diag.setDirectory(self.currDir) rawFile = os.path.splitext(os.path.basename(self.fileName))[0] + '.asy' diag.selectFile(rawFile) diag.setNameFilter(formatText) diag.show() result = diag.exec_() if result != diag.Accepted: return finalFiles = diag.selectedFiles() finalString = xf.xasy2asyCode(self.fileItems, self.asy2psmap) for file in finalFiles: ext = os.path.splitext(file) if len(ext) < 2: ext = 'asy' else: ext = ext[1][1:] if ext == '': ext='asy' if ext == 'asy': pathToFile = os.path.splitext(file)[0]+'.'+ext self.updateScript() self.actionExport(pathToFile) else: with subprocess.Popen(args=[self.asyPath, '-f{0}'.format(ext), '-o{0}'.format(file), '-'], encoding='utf-8', stdin=subprocess.PIPE) as asy: asy.stdin.write(finalString) asy.stdin.close() asy.wait(timeout=35) def actionExportXasy(self, file): xasyObjects, asyItems = xf.xasyToDict(self.fileName, self.fileItems, self.asy2psmap) if asyItems: # Save imported items into the twin asy file asyScriptItems = [item['item'] for item in asyItems if item['type'] == 'xasyScript'] prefix = os.path.splitext(self.fileName)[0] asyFilePath = prefix + '.asy' saveAsyFile = io.open(asyFilePath, 'w') xf.saveFile(saveAsyFile, asyScriptItems, self.asy2psmap) saveAsyFile.close() self.updateScript() openFile = open(file, 'wb') pickle.dump(xasyObjects, openFile) openFile.close() def actionLoadXasy(self, file): self.erase() self.ui.statusbar.showMessage('Load {0}'.format(file)) # TODO: This doesn't show on the UI self.fileName = file self.currDir = os.path.dirname(self.fileName) input_file = open(file, 'rb') xasyObjects = pickle.load(input_file) input_file.close() prefix = os.path.splitext(self.fileName)[0] asyFilePath = prefix + '.asy' rawText = None existsAsy = False if os.path.isfile(asyFilePath): asyFile = io.open(asyFilePath, 'r') rawText = asyFile.read() asyFile.close() rawText, transfDict = xf.extractTransformsFromFile(rawText) obj = x2a.xasyScript(canvas=self.xasyDrawObj, engine=self.asyEngine, transfKeyMap=transfDict) obj.setScript(rawText) self.fileItems.append(obj) existsAsy = True self.asyfyCanvas(force=True) for item in xasyObjects['objects']: key=item['transfKey'] if existsAsy: if(key) in obj.transfKeymap.keys(): continue obj.maxKey=max(obj.maxKey,int(key)) if item['type'] == 'xasyScript': print("Uh oh, there should not be any asy objects loaded") elif item['type'] == 'xasyText': self.addXasyTextFromData( text = item['text'], location = item['location'], pen = None, transform = x2a.asyTransform(item['transform']), key = item['transfKey'], align = item['align'], fontSize = item['fontSize'] ) elif item['type'] == 'xasyShape': nodeSet = item['nodes'] linkSet = item['links'] path = x2a.asyPath(self.asyEngine) path.initFromNodeList(nodeSet, linkSet) self.addXasyShapeFromPath(path, pen = item['pen'], transform = x2a.asyTransform(item['transform']), key = item['transfKey'], fill = item['fill']) elif item['type'] == 'asyArrow': self.addXasyArrowFromPath(item['pen'], x2a.asyTransform(item['transform']), item['transfKey'], item['settings'], item['code']) #self.addXasyArrowFromPath(item['oldpath'], item['pen'], x2a.asyTransform(item['transform']), item['transfKey'], item['settings']) else: print("ERROR") self.asy2psmap = x2a.asyTransform(xasyObjects['asy2psmap']) if existsAsy: self.globalObjectCounter = obj.maxKey+1 self.asyfyCanvas() if existsAsy: self.ui.statusbar.showMessage(f"Corresponding Asymptote File '{os.path.basename(asyFilePath)}' found. Loaded both files.") else: self.ui.statusbar.showMessage("No Asymptote file found. Loaded exclusively GUI objects.") def loadKeyMaps(self): """Inverts the mapping of the key Input map is in format 'Action' : 'Key Sequence' """ for action, key in self.keyMaps.options.items(): shortcut = Qw.QShortcut(self) shortcut.setKey(Qg.QKeySequence(key)) # hate doing this, but python doesn't have explicit way to pass a # string to a lambda without an identifier # attached to it. exec('shortcut.activated.connect(lambda: self.execCustomCommand("{0}"))'.format(action), {'self': self, 'shortcut': shortcut}) def initializeButtons(self): self.ui.btnDrawAxes.setChecked(self.settings['defaultShowAxes']) self.btnDrawAxesOnClick(self.settings['defaultShowAxes']) self.ui.btnDrawGrid.setChecked(self.settings['defaultShowGrid']) self.btnDrawGridOnClick(self.settings['defaultShowGrid']) def erase(self): self.fileItems.clear() self.hiddenKeys.clear() self.undoRedoStack.clear() self.checkUndoRedoButtons() self.fileChanged = False #We include this function to keep the general program flow consistent def closeEvent(self, event): if self.actionClose() == Qw.QMessageBox.Cancel: event.ignore() def actionNewFile(self): if self.fileChanged: reply = self.saveDialog() if reply == Qw.QMessageBox.Yes: self.actionSave() elif reply == Qw.QMessageBox.Cancel: return self.erase() self.asyfyCanvas(force=True) self.fileName = None self.updateTitle() def actionOpen(self, fileName = None): if self.fileChanged: reply = self.saveDialog() if reply == Qw.QMessageBox.Yes: self.actionSave() elif reply == Qw.QMessageBox.Cancel: return if fileName: # Opening via open recent or cmd args _, file_extension = os.path.splitext(fileName) if file_extension == '.xasy': self.actionLoadXasy(fileName) else: self.loadFile(fileName) self.populateOpenRecent(fileName) else: filename = Qw.QFileDialog.getOpenFileName(self, 'Open Xasy/Asymptote File','', '(*.xasy *.asy)') if filename[0]: _, file_extension = os.path.splitext(filename[0]) if file_extension == '.xasy': self.actionLoadXasy(filename[0]) else: self.loadFile(filename[0]) self.populateOpenRecent(filename[0].strip()) def actionClearRecent(self): self.ui.menuOpenRecent.clear() self.openRecent.clear() self.ui.menuOpenRecent.addAction("Clear", self.actionClearRecent) def populateOpenRecent(self, recentOpenedFile = None): self.ui.menuOpenRecent.clear() if recentOpenedFile: self.openRecent.insert(recentOpenedFile) for count, path in enumerate(self.openRecent.pathList): if count > 8: break action = Qw.QAction(path, self, triggered = lambda state, path = path: self.actionOpen(fileName = path)) self.ui.menuOpenRecent.addAction(action) self.ui.menuOpenRecent.addSeparator() self.ui.menuOpenRecent.addAction("Clear", self.actionClearRecent) def saveDialog(self) -> bool: save = "Save current file?" replyBox = Qw.QMessageBox() replyBox.setText("Save current file?") replyBox.setWindowTitle("Message") replyBox.setStandardButtons(Qw.QMessageBox.Yes | Qw.QMessageBox.No | Qw.QMessageBox.Cancel) reply = replyBox.exec() return reply def actionClose(self): if self.fileChanged: reply = self.saveDialog() if reply == Qw.QMessageBox.Yes: self.actionSave() Qc.QCoreApplication.quit() elif reply == Qw.QMessageBox.No: Qc.QCoreApplication.quit() else: return reply else: Qc.QCoreApplication.quit() def actionSave(self): if self.fileName is None: self.actionSaveAs() else: _, file_extension = os.path.splitext(self.fileName) if file_extension == ".asy": if self.existsXasy(): warning = "Choose save format. Note that objects saved in asy format cannot be edited graphically." replyBox = Qw.QMessageBox() replyBox.setWindowTitle('Warning') replyBox.setText(warning) replyBox.addButton("Save as .xasy", replyBox.NoRole) replyBox.addButton("Save as .asy", replyBox.YesRole) replyBox.addButton(Qw.QMessageBox.Cancel) reply = replyBox.exec() if reply == 1: saveFile = io.open(self.fileName, 'w') xf.saveFile(saveFile, self.fileItems, self.asy2psmap) saveFile.close() self.ui.statusbar.showMessage('File saved as {}'.format(self.fileName)) self.fileChanged = False elif reply == 0: prefix = os.path.splitext(self.fileName)[0] xasyFilePath = prefix + '.xasy' if os.path.isfile(xasyFilePath): warning = f'"{os.path.basename(xasyFilePath)}" already exists. Do you want to overwrite it?' reply = Qw.QMessageBox.question(self, "Same File", warning, Qw.QMessageBox.No, Qw.QMessageBox.Yes) if reply == Qw.QMessageBox.No: return self.actionExportXasy(xasyFilePath) self.fileName = xasyFilePath self.ui.statusbar.showMessage('File saved as {}'.format(self.fileName)) self.fileChanged = False else: return else: saveFile = io.open(self.fileName, 'w') xf.saveFile(saveFile, self.fileItems, self.asy2psmap) saveFile.close() self.fileChanged = False elif file_extension == ".xasy": self.actionExportXasy(self.fileName) self.ui.statusbar.showMessage('File saved as {}'.format(self.fileName)) self.fileChanged = False else: print("ERROR: file extension not supported") self.updateScript() self.updateTitle() def updateScript(self): for item in self.fileItems: if isinstance(item, x2a.xasyScript): if item.updatedCode: item.setScript(item.updatedCode) item.updatedCode = None def existsXasy(self): for item in self.fileItems: if not isinstance(item, x2a.xasyScript): return True return False def actionSaveAs(self): initSave = os.path.splitext(str(self.fileName))[0]+'.xasy' saveLocation = Qw.QFileDialog.getSaveFileName(self, 'Save File', initSave, "Xasy File (*.xasy)")[0] if saveLocation: _, file_extension = os.path.splitext(saveLocation) if not file_extension: saveLocation += '.xasy' self.actionExportXasy(saveLocation) elif file_extension == ".xasy": self.actionExportXasy(saveLocation) else: print("ERROR: file extension not supported") self.fileName = saveLocation self.updateScript() self.fileChanged = False self.updateTitle() self.populateOpenRecent(saveLocation) def btnQuickScreenshotOnClick(self): saveLocation = Qw.QFileDialog.getSaveFileName(self, 'Save Screenshot','') if saveLocation[0]: self.ui.imgLabel.pixmap().save(saveLocation[0]) def btnLoadFileonClick(self): self.actionOpen() def btnCloseFileonClick(self): self.actionClose() def btnSaveonClick(self): self.actionSave() @Qc.pyqtSlot(int) def handleAnchorComboIndex(self, index: int): self.anchorMode = index if self.anchorMode == AnchorMode.customAnchor: if self.customAnchor is not None: self.anchorMode = AnchorMode.customAnchor else: self.ui.comboAnchor.setCurrentIndex(AnchorMode.center) self.anchorMode = AnchorMode.center self.quickUpdate() def btnColorSelectOnClick(self): self.colorDialog.show() result = self.colorDialog.exec() if result == Qw.QDialog.Accepted: self._currentPen.setColorFromQColor(self.colorDialog.selectedColor()) self.updateFrameDispColor() def txtLineWidthEdited(self, text): new_val = xu.tryParse(text, float) if new_val is not None: if new_val > 0: self._currentPen.setWidth(new_val) def isReady(self): return self.mainCanvas is not None def resizeEvent(self, resizeEvent): # super().resizeEvent(resizeEvent) assert isinstance(resizeEvent, Qg.QResizeEvent) if self.isReady(): if self.mainCanvas.isActive(): self.mainCanvas.end() self.canvSize = self.ui.imgFrame.size()*devicePixelRatio self.ui.imgFrame.setSizePolicy(Qw.QSizePolicy.Ignored, Qw.QSizePolicy.Ignored) self.canvasPixmap = Qg.QPixmap(self.canvSize) self.canvasPixmap.setDevicePixelRatio(devicePixelRatio) self.postCanvasPixmap = Qg.QPixmap(self.canvSize) self.canvasPixmap.setDevicePixelRatio(devicePixelRatio) self.quickUpdate() def show(self): super().show() self.createMainCanvas() # somehow, the coordinates doesn't get updated until after showing. self.initializeButtons() self.postShow() def postShow(self): self.handleArguments() def roundPositionSnap(self, oldPoint): minorGridSize = self.settings['gridMajorAxesSpacing'] / (self.settings['gridMinorAxesCount'] + 1) if isinstance(oldPoint, list) or isinstance(oldPoint, tuple): return [round(val / minorGridSize) * minorGridSize for val in oldPoint] elif isinstance(oldPoint, Qc.QPoint) or isinstance(oldPoint, Qc.QPointF): x, y = oldPoint.x(), oldPoint.y() x = round(x / minorGridSize) * minorGridSize y = round(y / minorGridSize) * minorGridSize return Qc.QPointF(x, y) else: raise Exception def getAsyCoordinates(self): canvasPosOrig = self.getCanvasCoordinates() return canvasPosOrig, canvasPosOrig def mouseMoveEvent(self, mouseEvent: Qg.QMouseEvent): # TODO: Actually refine grid snapping... if not self.ui.imgLabel.underMouse() and not self.mouseDown: return self.updateMouseCoordLabel() asyPos, canvasPos = self.getAsyCoordinates() # add mode if self.addMode is not None: if self.addMode.active: self.addMode.mouseMove(asyPos, mouseEvent) self.quickUpdate() return # pan mode if self.currentModeStack[-1] == SelectionMode.pan and int(mouseEvent.buttons()) and self.savedWindowMousePos is not None: mousePos = self.getWindowCoordinates() newPos = mousePos - self.savedWindowMousePos tx, ty = newPos.x(), newPos.y() if self.lockX: tx = 0 if self.lockY: ty = 0 self.panOffset[0] += tx self.panOffset[1] += ty self.savedWindowMousePos = self.getWindowCoordinates() self.quickUpdate() return # otherwise, in transformation if self.inMidTransformation: if self.currentModeStack[-1] == SelectionMode.translate: newPos = canvasPos - self.savedMousePosition if self.gridSnap: newPos = self.roundPositionSnap(newPos) # actually round to the nearest minor grid afterwards... self.tx, self.ty = newPos.x(), newPos.y() if self.lockX: self.tx = 0 if self.lockY: self.ty = 0 self.newTransform = Qg.QTransform.fromTranslate(self.tx, self.ty) elif self.currentModeStack[-1] == SelectionMode.rotate: if self.gridSnap: canvasPos = self.roundPositionSnap(canvasPos) adjustedSavedMousePos = self.savedMousePosition - self.currentAnchor adjustedCanvasCoords = canvasPos - self.currentAnchor origAngle = np.arctan2(adjustedSavedMousePos.y(), adjustedSavedMousePos.x()) newAng = np.arctan2(adjustedCanvasCoords.y(), adjustedCanvasCoords.x()) self.deltaAngle = newAng - origAngle self.newTransform = xT.makeRotTransform(self.deltaAngle, self.currentAnchor).toQTransform() elif self.currentModeStack[-1] == SelectionMode.scale: if self.gridSnap: canvasPos = self.roundPositionSnap(canvasPos) x, y = int(round(canvasPos.x())), int(round(canvasPos.y())) # otherwise it crashes... canvasPos = Qc.QPoint(x, y) originalDeltaPts = self.savedMousePosition - self.currentAnchor scaleFactor = Qc.QPointF.dotProduct(canvasPos - self.currentAnchor, originalDeltaPts) /\ (xu.twonorm((originalDeltaPts.x(), originalDeltaPts.y())) ** 2) if not self.lockX: self.scaleFactorX = scaleFactor else: self.scaleFactorX = 1 if not self.lockY: self.scaleFactorY = scaleFactor else: self.scaleFactorY = 1 self.newTransform = xT.makeScaleTransform(self.scaleFactorX, self.scaleFactorY, self.currentAnchor).\ toQTransform() self.quickUpdate() return # otherwise, select a candidate for selection if self.currentlySelectedObj['selectedIndex'] is None: selectedIndex, selKeyList = self.selectObject() if selectedIndex is not None: if self.pendingSelectedObjList != selKeyList: self.pendingSelectedObjList = selKeyList self.pendingSelectedObjIndex = -1 else: self.pendingSelectedObjList.clear() self.pendingSelectedObjIndex = -1 self.quickUpdate() return def mouseReleaseEvent(self, mouseEvent): assert isinstance(mouseEvent, Qg.QMouseEvent) if not self.mouseDown: return self.tx=0 self.ty=0 self.mouseDown = False if self.addMode is not None: self.addMode.mouseRelease() if self.inMidTransformation: self.clearSelection() self.inMidTransformation = False self.quickUpdate() def clearSelection(self): if self.currentlySelectedObj['selectedIndex'] is not None: self.releaseTransform() self.setAllInSetEnabled(self.objButtons, False) self.currentlySelectedObj['selectedIndex'] = None self.currentlySelectedObj['key'] = None self.currentlySelectedObj['allSameKey'].clear() self.newTransform = Qg.QTransform() self.currentBoundingBox = None self.quickUpdate() def changeSelection(self, offset): if self.pendingSelectedObjList: if offset > 0: if self.pendingSelectedObjIndex + offset <= -1: self.pendingSelectedObjIndex = self.pendingSelectedObjIndex + offset else: if self.pendingSelectedObjIndex + offset >= -len(self.pendingSelectedObjList): self.pendingSelectedObjIndex = self.pendingSelectedObjIndex + offset def mouseWheel(self, rawAngleX: float, rawAngle: float, defaultModifiers: int=0): keyModifiers = int(Qw.QApplication.keyboardModifiers()) keyModifiers = keyModifiers | defaultModifiers if keyModifiers & int(Qc.Qt.ControlModifier): oldMag = self.magnification factor = 0.5/devicePixelRatio cx, cy = self.canvSize.width()*factor, self.canvSize.height()*factor centerPoint = Qc.QPointF(cx, cy) * self.getScrsTransform().inverted()[0] self.magnification += (rawAngle/100) if self.magnification < self.settings['minimumMagnification']: self.magnification = self.settings['minimumMagnification'] elif self.magnification > self.settings['maximumMagnification']: self.magnification = self.settings['maximumMagnification'] # set the new pan. Let c be the fixed point (center point), # Let m the old mag, n the new mag # find t2 such that # mc + t1 = nc + t2 ==> t2 = (m - n)c + t1 centerPoint = (oldMag - self.magnification) * centerPoint self.panOffset = [ self.panOffset[0] + centerPoint.x(), self.panOffset[1] + centerPoint.y() ] self.currAddOptions['magnification'] = self.magnification if self.addMode is xbi.InteractiveBezierEditor: self.addMode.setSelectionBoundaries() elif keyModifiers & (int(Qc.Qt.ShiftModifier) | int(Qc.Qt.AltModifier)): self.panOffset[1] += rawAngle/1 self.panOffset[0] -= rawAngleX/1 # handle scrolling else: # process selection layer change if rawAngle >= 15: self.changeSelection(1) elif rawAngle <= -15: self.changeSelection(-1) self.quickUpdate() def wheelEvent(self, event: Qg.QWheelEvent): rawAngle = event.angleDelta().y() / 8 rawAngleX = event.angleDelta().x() / 8 self.mouseWheel(rawAngleX, rawAngle) def selectOnHover(self): """Returns True if selection happened, False otherwise. """ if self.pendingSelectedObjList: selectedIndex = self.pendingSelectedObjList[self.pendingSelectedObjIndex] self.pendingSelectedObjList.clear() maj, minor = selectedIndex self.currentlySelectedObj['selectedIndex'] = selectedIndex self.currentlySelectedObj['key'], self.currentlySelectedObj['allSameKey'] = self.selectObjectSet( ) self.currentBoundingBox = self.drawObjects[maj][minor].boundingBox if self.selectAsGroup: for selItems in self.currentlySelectedObj['allSameKey']: obj = self.drawObjects[selItems[0]][selItems[1]] self.currentBoundingBox = self.currentBoundingBox.united(obj.boundingBox) self.origBboxTransform = self.drawObjects[maj][minor].transform.toQTransform() self.newTransform = Qg.QTransform() return True else: return False def mousePressEvent(self, mouseEvent: Qg.QMouseEvent): # we make an exception for bezier curve bezierException = False if self.addMode is not None: if self.addMode.active and isinstance(self.addMode, InplaceAddObj.AddBezierShape): bezierException = True if not self.ui.imgLabel.underMouse() and not bezierException: return self.mouseDown = True asyPos, self.savedMousePosition = self.getAsyCoordinates() if self.addMode is not None: self.addMode.mouseDown(asyPos, self.currAddOptions, mouseEvent) elif self.currentModeStack[-1] == SelectionMode.pan: self.savedWindowMousePos = self.getWindowCoordinates() elif self.currentModeStack[-1] == SelectionMode.setAnchor: self.customAnchor = self.savedMousePosition self.currentModeStack.pop() self.anchorMode = AnchorMode.customAnchor self.ui.comboAnchor.setCurrentIndex(AnchorMode.customAnchor) self.updateChecks() self.quickUpdate() elif self.inMidTransformation: pass elif self.pendingSelectedObjList: self.selectOnHover() if self.currentModeStack[-1] in {SelectionMode.translate, SelectionMode.rotate, SelectionMode.scale}: self.setAllInSetEnabled(self.objButtons, False) self.inMidTransformation = True self.setAnchor() elif self.currentModeStack[-1] == SelectionMode.delete: self.btnSelectiveDeleteOnClick() elif self.currentModeStack[-1] == SelectionMode.selectEdit: self.setupSelectEdit() else: self.setAllInSetEnabled(self.objButtons, True) self.inMidTransformation = False self.setAnchor() else: self.setAllInSetEnabled(self.objButtons, False) self.currentBoundingBox = None self.inMidTransformation = False self.clearSelection() self.quickUpdate() def removeAddMode(self): self.addMode = None self.deleteAddOptions() def editAccepted(self, obj, objIndex): self.undoRedoStack.add(self.createAction( EditBezierChanges(obj, objIndex, self.addMode.asyPathBackup, self.addMode.asyPath ) )) self.checkUndoRedoButtons() self.addMode.forceFinalize() self.removeAddMode() self.fileChanged = True self.quickUpdate() def editRejected(self): self.addMode.resetObj() self.addMode.forceFinalize() self.removeAddMode() self.fileChanged = True self.quickUpdate() def setupSelectEdit(self): """For Select-Edit mode. For now, if the object selected is a bezier curve, opens up a bezier editor""" maj, minor = self.currentlySelectedObj['selectedIndex'] obj = self.fileItems[maj] if isinstance(obj, x2a.xasyDrawnItem): # bezier path self.addMode = xbi.InteractiveBezierEditor(self, obj, self.currAddOptions) self.addMode.objectUpdated.connect(self.objectUpdated) self.addMode.editAccepted.connect(lambda: self.editAccepted(obj, maj)) self.addMode.editRejected.connect(self.editRejected) self.updateOptionWidget() self.currentModeStack[-1] = SelectionMode.selectEdit self.fileChanged = True elif isinstance(obj, x2a.xasyText): newText = self.setTextPrompt() if newText: self.drawObjects.remove(obj.generateDrawObjects(False)) obj.label.setText(newText) self.drawObjects.append(obj.generateDrawObjects(True)) self.fileChanged = True else: self.ui.statusbar.showMessage('Warning: Selected object cannot be edited') self.clearSelection() self.quickUpdate() def setAnchor(self): if self.anchorMode == AnchorMode.center: self.currentAnchor = self.currentBoundingBox.center() elif self.anchorMode == AnchorMode.topLeft: self.currentAnchor = self.currentBoundingBox.topLeft() elif self.anchorMode == AnchorMode.topRight: self.currentAnchor = self.currentBoundingBox.topRight() elif self.anchorMode == AnchorMode.bottomLeft: self.currentAnchor = self.currentBoundingBox.bottomLeft() elif self.anchorMode == AnchorMode.bottomRight: self.currentAnchor = self.currentBoundingBox.bottomRight() elif self.anchorMode == AnchorMode.customAnchor: self.currentAnchor = self.customAnchor else: self.currentAnchor = Qc.QPointF(0, 0) if self.anchorMode != AnchorMode.origin: pass # TODO: Record base points/bbox before hand and use that for # anchor? # adjTransform = # self.drawObjects[selectedIndex].transform.toQTransform() # self.currentAnchor = adjTransform.map(self.currentAnchor) def releaseTransform(self): if self.newTransform.isIdentity(): return newTransform = x2a.asyTransform.fromQTransform(self.newTransform) objKey = self.currentlySelectedObj['selectedIndex'] self.addTransformationChanges(objKey, newTransform, not self.useGlobalCoords) self.transformObject(objKey, newTransform, not self.useGlobalCoords) def adjustTransform(self, appendTransform): self.screenTransformation = self.screenTransformation * appendTransform def createMainCanvas(self): self.canvSize = devicePixelRatio*self.ui.imgFrame.size() self.ui.imgFrame.setSizePolicy(Qw.QSizePolicy.Ignored, Qw.QSizePolicy.Ignored) factor=0.5/devicePixelRatio; x, y = self.canvSize.width()*factor, self.canvSize.height()*factor self.canvasPixmap = Qg.QPixmap(self.canvSize) self.canvasPixmap.setDevicePixelRatio(devicePixelRatio) self.canvasPixmap.fill() self.finalPixmap = Qg.QPixmap(self.canvSize) self.finalPixmap.setDevicePixelRatio(devicePixelRatio) self.postCanvasPixmap = Qg.QPixmap(self.canvSize) self.postCanvasPixmap.setDevicePixelRatio(devicePixelRatio) self.mainCanvas = Qg.QPainter(self.canvasPixmap) self.mainCanvas.setRenderHint(Qg.QPainter.Antialiasing) self.mainCanvas.setRenderHint(Qg.QPainter.SmoothPixmapTransform) self.mainCanvas.setRenderHint(Qg.QPainter.HighQualityAntialiasing) self.xasyDrawObj['canvas'] = self.mainCanvas self.mainTransformation = Qg.QTransform() self.mainTransformation.scale(1, 1) self.mainTransformation.translate(x, y) self.mainCanvas.setTransform(self.getScrsTransform(), True) self.ui.imgLabel.setPixmap(self.canvasPixmap) def resetPan(self): self.panOffset = [0, 0] self.quickUpdate() def btnPanCenterOnClick(self): newCenter = self.getAllBoundingBox().center() # adjust to new magnification # technically, doable through getscrstransform() # and subtract pan offset and center points # but it's much more work... newCenter = self.magnification * newCenter self.panOffset = [-newCenter.x(), -newCenter.y()] self.quickUpdate() def selectObject(self): if not self.ui.imgLabel.underMouse(): return None, [] canvasCoords = self.getCanvasCoordinates() highestDrawPriority = -np.inf collidedObjKey = None rawObjNumList = [] for objKeyMaj in range(len(self.drawObjects)): for objKeyMin in range(len(self.drawObjects[objKeyMaj])): obj = self.drawObjects[objKeyMaj][objKeyMin] if obj.collide(canvasCoords) and (obj.key, obj.keyIndex) not in self.hiddenKeys: rawObjNumList.append(((objKeyMaj, objKeyMin), obj.drawOrder)) if obj.drawOrder > highestDrawPriority: collidedObjKey = (objKeyMaj, objKeyMin) if collidedObjKey is not None: rawKey = self.drawObjects[collidedObjKey[0]][collidedObjKey[1]].key # self.ui.statusbar.showMessage('Collide with {0}, Key is {1}'.format(str(collidedObjKey), rawKey), 2500) self.ui.statusbar.showMessage('Key: {0}'.format(rawKey), 2500) return collidedObjKey, [rawObj[0] for rawObj in sorted(rawObjNumList, key=lambda ordobj: ordobj[1])] else: return None, [] def selectObjectSet(self): objKey = self.currentlySelectedObj['selectedIndex'] if objKey is None: return set() assert isinstance(objKey, (tuple, list)) and len(objKey) == 2 rawObj = self.drawObjects[objKey[0]][objKey[1]] rawKey = rawObj.key rawSet = {objKey} for objKeyMaj in range(len(self.drawObjects)): for objKeyMin in range(len(self.drawObjects[objKeyMaj])): obj = self.drawObjects[objKeyMaj][objKeyMin] if obj.key == rawKey: rawSet.add((objKeyMaj, objKeyMin)) return rawKey, rawSet def getCanvasCoordinates(self): # assert self.ui.imgLabel.underMouse() uiPos = self.mapFromGlobal(Qg.QCursor.pos()) canvasPos = self.ui.imgLabel.mapFrom(self, uiPos) # Issue: For magnification, should xasy treats this at xasy level, or asy level? return canvasPos * self.getScrsTransform().inverted()[0] def getWindowCoordinates(self): # assert self.ui.imgLabel.underMouse() return self.mapFromGlobal(Qg.QCursor.pos()) def refreshCanvas(self): if self.mainCanvas.isActive(): self.mainCanvas.end() self.mainCanvas.begin(self.canvasPixmap) self.mainCanvas.setTransform(self.getScrsTransform()) def asyfyCanvas(self, force=False): self.drawObjects = [] self.populateCanvasWithItems(force) self.quickUpdate() if self.currentModeStack[-1] == SelectionMode.translate: self.ui.statusbar.showMessage(self.strings.asyfyComplete) def updateMouseCoordLabel(self): *args, canvasPos = self.getAsyCoordinates() nx, ny = self.asy2psmap.inverted() * (canvasPos.x(), canvasPos.y()) self.coordLabel.setText('{0:.2f}, {1:.2f} '.format(nx, ny)) def quickUpdate(self): # TODO: Some documentation here would be nice since this is one of the # main functions that gets called everywhere. self.updateMouseCoordLabel() self.refreshCanvas() self.preDraw(self.mainCanvas) # coordinates/background self.quickDraw() self.mainCanvas.end() self.postDraw() self.updateScreen() self.updateTitle() def quickDraw(self): assert self.isReady() dpi = self.magnification * self.dpi activeItem = None for majorItem in self.drawObjects: for item in majorItem: # hidden objects - toggleable if (item.key, item.keyIndex) in self.hiddenKeys: continue isSelected = item.key == self.currentlySelectedObj['key'] if not self.selectAsGroup and isSelected and self.currentlySelectedObj['selectedIndex'] is not None: maj, min_ = self.currentlySelectedObj['selectedIndex'] isSelected = isSelected and item is self.drawObjects[maj][min_] if isSelected and self.settings['enableImmediatePreview']: activeItem = item if self.useGlobalCoords: item.draw(self.newTransform, canvas=self.mainCanvas, dpi=dpi) else: item.draw(self.newTransform, applyReverse=True, canvas=self.mainCanvas, dpi=dpi) else: item.draw(canvas=self.mainCanvas, dpi=dpi) if self.settings['drawSelectedOnTop']: if self.pendingSelectedObjList: maj, minor = self.pendingSelectedObjList[self.pendingSelectedObjIndex] self.drawObjects[maj][minor].draw(canvas=self.mainCanvas, dpi=dpi) # and apply the preview too... elif activeItem is not None: if self.useGlobalCoords: activeItem.draw(self.newTransform, canvas=self.mainCanvas, dpi=dpi) else: activeItem.draw(self.newTransform, applyReverse=True, canvas=self.mainCanvas, dpi=dpi) activeItem = None def updateTitle(self): # TODO: Undo redo doesn't update appropriately. Have to find a fix for this. title = '' if self.fileName: title += os.path.basename(self.fileName) else: title += "[Not Saved]" if self.fileChanged: title += ' *' self.setWindowTitle(title) def updateScreen(self): self.finalPixmap = Qg.QPixmap(self.canvSize) self.finalPixmap.setDevicePixelRatio(devicePixelRatio) self.finalPixmap.fill(Qc.Qt.black) with Qg.QPainter(self.finalPixmap) as finalPainter: drawPoint = Qc.QPoint(0, 0) finalPainter.drawPixmap(drawPoint, self.canvasPixmap) finalPainter.drawPixmap(drawPoint, self.postCanvasPixmap) self.ui.imgLabel.setPixmap(self.finalPixmap) def drawCartesianGrid(self, preCanvas): majorGrid = self.settings['gridMajorAxesSpacing'] * self.asy2psmap.xx minorGridCount = self.settings['gridMinorAxesCount'] majorGridCol = Qg.QColor(self.settings['gridMajorAxesColor']) minorGridCol = Qg.QColor(self.settings['gridMinorAxesColor']) panX, panY = self.panOffset factor=0.5/devicePixelRatio; cx, cy = self.canvSize.width()*factor, self.canvSize.height()*factor x_range = (cx + (2 * abs(panX)))/self.magnification y_range = (cy + (2 * abs(panY)))/self.magnification for x in np.arange(0, 2 * x_range + 1, majorGrid): # have to do # this in two stages... preCanvas.setPen(minorGridCol) self.makePenCosmetic(preCanvas) for xMinor in range(1, minorGridCount + 1): xCoord = round(x + ((xMinor / (minorGridCount + 1)) * majorGrid)) preCanvas.drawLine(Qc.QLine(xCoord, -9999, xCoord, 9999)) preCanvas.drawLine(Qc.QLine(-xCoord, -9999, -xCoord, 9999)) for y in np.arange(0, 2 * y_range + 1, majorGrid): preCanvas.setPen(minorGridCol) self.makePenCosmetic(preCanvas) for yMinor in range(1, minorGridCount + 1): yCoord = round(y + ((yMinor / (minorGridCount + 1)) * majorGrid)) preCanvas.drawLine(Qc.QLine(-9999, yCoord, 9999, yCoord)) preCanvas.drawLine(Qc.QLine(-9999, -yCoord, 9999, -yCoord)) preCanvas.setPen(majorGridCol) self.makePenCosmetic(preCanvas) roundY = round(y) preCanvas.drawLine(Qc.QLine(-9999, roundY, 9999, roundY)) preCanvas.drawLine(Qc.QLine(-9999, -roundY, 9999, -roundY)) for x in np.arange(0, 2 * x_range + 1, majorGrid): preCanvas.setPen(majorGridCol) self.makePenCosmetic(preCanvas) roundX = round(x) preCanvas.drawLine(Qc.QLine(roundX, -9999, roundX, 9999)) preCanvas.drawLine(Qc.QLine(-roundX, -9999, -roundX, 9999)) def drawPolarGrid(self, preCanvas): center = Qc.QPointF(0, 0) majorGridCol = Qg.QColor(self.settings['gridMajorAxesColor']) minorGridCol = Qg.QColor(self.settings['gridMinorAxesColor']) majorGrid = self.settings['gridMajorAxesSpacing'] minorGridCount = self.settings['gridMinorAxesCount'] majorAxisAng = (np.pi/4) # 45 degrees - for now. minorAxisCount = 2 # 15 degrees each subRadiusSize = int(round((majorGrid / (minorGridCount + 1)))) subAngleSize = majorAxisAng / (minorAxisCount + 1) for radius in range(majorGrid, 9999 + 1, majorGrid): preCanvas.setPen(majorGridCol) preCanvas.drawEllipse(center, radius, radius) preCanvas.setPen(minorGridCol) for minorRing in range(minorGridCount): subRadius = round(radius - (subRadiusSize * (minorRing + 1))) preCanvas.drawEllipse(center, subRadius, subRadius) currAng = majorAxisAng while currAng <= (2 * np.pi): preCanvas.setPen(majorGridCol) p1 = center + (9999 * Qc.QPointF(np.cos(currAng), np.sin(currAng))) preCanvas.drawLine(Qc.QLineF(center, p1)) preCanvas.setPen(minorGridCol) for minorAngLine in range(minorAxisCount): newAng = currAng - (subAngleSize * (minorAngLine + 1)) p1 = center + (9999 * Qc.QPointF(np.cos(newAng), np.sin(newAng))) preCanvas.drawLine(Qc.QLineF(center, p1)) currAng = currAng + majorAxisAng def preDraw(self, painter): self.canvasPixmap.fill() preCanvas = painter preCanvas.setTransform(self.getScrsTransform()) if self.drawAxes: preCanvas.setPen(Qc.Qt.gray) self.makePenCosmetic(preCanvas) preCanvas.drawLine(Qc.QLine(-9999, 0, 9999, 0)) preCanvas.drawLine(Qc.QLine(0, -9999, 0, 9999)) if self.drawGrid: if self.drawGridMode == GridMode.cartesian: self.drawCartesianGrid(painter) elif self.drawGridMode == GridMode.polar: self.drawPolarGrid(painter) if self.currentGuides: for guide in self.currentGuides: guide.drawShape(preCanvas) # preCanvas.end() def drawAddModePreview(self, painter): if self.addMode is not None: if self.addMode.active: # Preview Object if self.addMode.getPreview() is not None: painter.setPen(self.currentPen.toQPen()) painter.drawPath(self.addMode.getPreview()) self.addMode.postDrawPreview(painter) def drawTransformPreview(self, painter): if self.currentBoundingBox is not None and self.currentlySelectedObj['selectedIndex'] is not None: painter.save() maj, minor = self.currentlySelectedObj['selectedIndex'] selObj = self.drawObjects[maj][minor] self.makePenCosmetic(painter) if not self.useGlobalCoords: painter.save() painter.setTransform( selObj.transform.toQTransform(), True) # painter.setTransform(selObj.baseTransform.toQTransform(), True) painter.setPen(Qc.Qt.gray) painter.drawLine(Qc.QLine(-9999, 0, 9999, 0)) painter.drawLine(Qc.QLine(0, -9999, 0, 9999)) painter.setPen(Qc.Qt.black) painter.restore() painter.setTransform(selObj.getInteriorScrTransform( self.newTransform).toQTransform(), True) painter.drawRect(selObj.localBoundingBox) else: painter.setTransform(self.newTransform, True) painter.drawRect(self.currentBoundingBox) painter.restore() def postDraw(self): self.postCanvasPixmap.fill(Qc.Qt.transparent) with Qg.QPainter(self.postCanvasPixmap) as postCanvas: postCanvas.setRenderHints(self.mainCanvas.renderHints()) postCanvas.setTransform(self.getScrsTransform()) self.makePenCosmetic(postCanvas) self.drawTransformPreview(postCanvas) if self.pendingSelectedObjList: maj, minor = self.pendingSelectedObjList[self.pendingSelectedObjIndex] postCanvas.drawRect(self.drawObjects[maj][minor].boundingBox) self.drawAddModePreview(postCanvas) if self.customAnchor is not None and self.anchorMode == AnchorMode.customAnchor: self.drawAnchorCursor(postCanvas) # postCanvas.drawRect(self.getAllBoundingBox()) def drawAnchorCursor(self, painter): painter.drawEllipse(self.customAnchor, 6, 6) newCirclePath = Qg.QPainterPath() newCirclePath.addEllipse(self.customAnchor, 2, 2) painter.fillPath(newCirclePath, Qg.QColor.fromRgb(0, 0, 0)) def updateModeBtnsOnly(self): if self.currentModeStack[-1] == SelectionMode.translate: activeBtn = self.ui.btnTranslate elif self.currentModeStack[-1] == SelectionMode.rotate: activeBtn = self.ui.btnRotate elif self.currentModeStack[-1] == SelectionMode.scale: activeBtn = self.ui.btnScale elif self.currentModeStack[-1] == SelectionMode.pan: activeBtn = self.ui.btnPan elif self.currentModeStack[-1] == SelectionMode.setAnchor: activeBtn = self.ui.btnAnchor elif self.currentModeStack[-1] == SelectionMode.delete: activeBtn = self.ui.btnDeleteMode elif self.currentModeStack[-1] == SelectionMode.selectEdit: activeBtn = self.ui.btnSelectEdit elif self.currentModeStack[-1] == SelectionMode.openPoly: activeBtn = self.ui.btnOpenPoly elif self.currentModeStack[-1] == SelectionMode.closedPoly: activeBtn = self.ui.btnClosedPoly elif self.currentModeStack[-1] == SelectionMode.openCurve: activeBtn = self.ui.btnOpenCurve elif self.currentModeStack[-1] == SelectionMode.closedCurve: activeBtn = self.ui.btnClosedCurve elif self.currentModeStack[-1] == SelectionMode.addPoly: activeBtn = self.ui.btnAddPoly elif self.currentModeStack[-1] == SelectionMode.addCircle: activeBtn = self.ui.btnAddCircle elif self.currentModeStack[-1] == SelectionMode.addLabel: activeBtn = self.ui.btnAddLabel elif self.currentModeStack[-1] == SelectionMode.addFreehand: activeBtn = self.ui.btnAddFreehand else: activeBtn = None disableFill = isinstance(self.addMode, InplaceAddObj.AddBezierShape) and not self.currAddOptions['closedPath'] if isinstance(self.addMode, xbi.InteractiveBezierEditor): disableFill = disableFill or not (self.addMode.obj.path.nodeSet[-1] == "cycle") self.ui.btnFill.setEnabled(not disableFill) if disableFill and self.ui.btnFill.isEnabled(): self.ui.btnFill.setChecked(not disableFill) for button in self.modeButtons: button.setChecked(button is activeBtn) if activeBtn in [self.ui.btnDeleteMode,self.ui.btnSelectEdit]: self.ui.btnAlignX.setEnabled(False) self.ui.btnAlignY.setEnabled(False) else: self.ui.btnAlignX.setEnabled(True) self.ui.btnAlignY.setEnabled(True) def updateChecks(self): self.removeAddMode() self.updateModeBtnsOnly() self.quickUpdate() def btnAlignXOnClick(self, checked): if self.currentModeStack[0] in [SelectionMode.selectEdit,SelectionMode.delete]: self.ui.btnAlignX.setChecked(False) else: self.lockY = checked if self.lockX: self.lockX = False self.ui.btnAlignY.setChecked(False) def btnAlignYOnClick(self, checked): if self.currentModeStack[0] in [SelectionMode.selectEdit,SelectionMode.delete]: self.ui.btnAlignY.setChecked(False) else: self.lockX = checked if self.lockY: self.lockY = False self.ui.btnAlignX.setChecked(False) def btnAnchorModeOnClick(self): if self.currentModeStack[-1] != SelectionMode.setAnchor: self.currentModeStack.append(SelectionMode.setAnchor) self.updateChecks() def switchToAnchorMode(self): if self.currentModeStack[-1] != SelectionMode.setAnchor: self.currentModeStack.append(SelectionMode.setAnchor) self.updateChecks() def btnTranslateonClick(self): self.currentModeStack = [SelectionMode.translate] self.ui.statusbar.showMessage('Translate mode') self.clearSelection() self.updateChecks() def btnRotateOnClick(self): if self.currentModeStack[-1] != SelectionMode.rotate: self.currentModeStack = [SelectionMode.rotate] self.ui.statusbar.showMessage('Rotate mode') self.clearSelection() self.updateChecks() else: self.btnTranslateonClick() def btnScaleOnClick(self): if self.currentModeStack[-1] != SelectionMode.scale: self.currentModeStack = [SelectionMode.scale] self.ui.statusbar.showMessage('Scale mode') self.clearSelection() self.updateChecks() else: self.btnTranslateonClick() def btnPanOnClick(self): if self.currentModeStack[-1] != SelectionMode.pan: self.currentModeStack = [SelectionMode.pan] self.ui.statusbar.showMessage('Pan mode') self.clearSelection() self.updateChecks() else: self.btnTranslateonClick() def btnWorldCoordsOnClick(self, checked): self.useGlobalCoords = checked if not self.useGlobalCoords: self.ui.comboAnchor.setCurrentIndex(AnchorMode.origin) self.setAllInSetEnabled(self.globalTransformOnlyButtons, checked) def setAllInSetEnabled(self, widgetSet, enabled): for widget in widgetSet: widget.setEnabled(enabled) def btnDrawAxesOnClick(self, checked): self.drawAxes = checked self.quickUpdate() def btnDrawGridOnClick(self, checked): self.drawGrid = checked self.quickUpdate() def btnCustTransformOnClick(self): matrixDialog = CustMatTransform.CustMatTransform() matrixDialog.show() result = matrixDialog.exec_() if result == Qw.QDialog.Accepted: objKey = self.currentlySelectedObj['selectedIndex'] self.transformObject(objKey, matrixDialog.getTransformationMatrix(), not self.useGlobalCoords) # for now, unless we update the bouding box transformation. self.clearSelection() self.quickUpdate() def btnLoadEditorOnClick(self): pathToFile = os.path.splitext(self.fileName)[0]+'.asy' if self.fileChanged: save = "Save current file?" reply = Qw.QMessageBox.question(self, 'Message', save, Qw.QMessageBox.Yes, Qw.QMessageBox.No) if reply == Qw.QMessageBox.Yes: self.actionExport(pathToFile) subprocess.run(args=self.getExternalEditor(asypath=pathToFile)); self.loadFile(pathToFile) def btnAddCodeOnClick(self): header = """ // xasy object created at $time // Object Number: $uid // This header is automatically generated by xasy. // Your code here """ header = string.Template(header).substitute(time=str(datetime.datetime.now()), uid=str(self.globalObjectCounter)) with tempfile.TemporaryDirectory() as tmpdir: newPath = os.path.join(tmpdir, 'tmpcode.asy') f = io.open(newPath, 'w') f.write(header) f.close() subprocess.run(args=self.getExternalEditor(asypath=newPath)) f = io.open(newPath, 'r') newItem = x2a.xasyScript(engine=self.asyEngine, canvas=self.xasyDrawObj) newItem.setScript(f.read()) f.close() # newItem.replaceKey(str(self.globalObjectCounter) + ':') self.fileItems.append(newItem) self.addObjCreationUrs(newItem) self.asyfyCanvas() self.globalObjectCounter = self.globalObjectCounter + 1 def softDeleteObj(self, objKey): maj, minor = objKey drawObj = self.drawObjects[maj][minor] item = drawObj.originalObj key = drawObj.key keyIndex = drawObj.keyIndex item.transfKeymap[key][keyIndex].deleted = True # item.asyfied = False def getSelectedObjInfo(self, objIndex): maj, minor = objIndex drawObj = self.drawObjects[maj][minor] item = drawObj.originalObj key = drawObj.key keyIndex = drawObj.keyIndex return item, key, keyIndex def transformObjKey(self, item, key, keyIndex, transform, applyFirst=False, drawObj=None): if isinstance(transform, np.ndarray): obj_transform = x2a.asyTransform.fromNumpyMatrix(transform) elif isinstance(transform, Qg.QTransform): assert transform.isAffine() obj_transform = x2a.asyTransform.fromQTransform(transform) else: obj_transform = transform scr_transform = obj_transform if not applyFirst: item.transfKeymap[key][keyIndex] = obj_transform * \ item.transfKeymap[key][keyIndex] if drawObj is not None: drawObj.transform = scr_transform * drawObj.transform else: item.transfKeymap[key][keyIndex] = item.transfKeymap[key][keyIndex] * obj_transform if drawObj is not None: drawObj.transform = drawObj.transform * scr_transform if self.selectAsGroup: for (maj2, min2) in self.currentlySelectedObj['allSameKey']: if (maj2, min2) == (maj, minor): continue obj = self.drawObjects[maj2][min2] newIndex = obj.keyIndex if not applyFirst: item.transfKeymap[key][newIndex] = obj_transform * \ item.transfKeymap[key][newIndex] obj.transform = scr_transform * obj.transform else: item.transfKeymap[key][newIndex] = item.transfKeymap[key][newIndex] * obj_transform obj.transform = obj.transform * scr_transform self.fileChanged = True self.quickUpdate() def transformObject(self, objKey, transform, applyFirst=False): maj, minor = objKey drawObj = self.drawObjects[maj][minor] item, key, keyIndex = self.getSelectedObjInfo(objKey) self.transformObjKey(item, key, keyIndex, transform, applyFirst, drawObj) def initializeEmptyFile(self): pass def getExternalEditor(self, **kwargs) -> str: editor = os.getenv("VISUAL") if(editor == None) : editor = os.getenv("EDITOR") if(editor == None) : rawExternalEditor = self.settings['externalEditor'] rawExtEditorArgs = self.settings['externalEditorArgs'] else: s = editor.split() rawExternalEditor = s[0] rawExtEditorArgs = s[1:]+["$asypath"] execEditor = [rawExternalEditor] for arg in rawExtEditorArgs: execEditor.append(string.Template(arg).substitute(**kwargs)) return execEditor def loadFile(self, name): filename = os.path.abspath(name) if not os.path.isfile(filename): parts = os.path.splitext(filename) if parts[1] == '': filename = parts[0] + '.asy' if not os.path.isfile(filename): self.ui.statusbar.showMessage('File {0} not found'.format(filename)) return self.ui.statusbar.showMessage('Load {0}'.format(filename)) self.fileName = filename self.asyFileName = filename self.currDir = os.path.dirname(self.fileName) self.erase() f = open(self.fileName, 'rt') try: rawFileStr = f.read() except IOError: Qw.QMessageBox.critical(self, self.strings.fileOpenFailed, self.strings.fileOpenFailedText) else: rawText, transfDict = xf.extractTransformsFromFile(rawFileStr) item = x2a.xasyScript(canvas=self.xasyDrawObj, engine=self.asyEngine, transfKeyMap=transfDict) item.setScript(rawText) self.fileItems.append(item) self.asyfyCanvas(force=True) self.globalObjectCounter = item.maxKey+1 self.asy2psmap = item.asy2psmap finally: f.close() self.btnPanCenterOnClick() def populateCanvasWithItems(self, forceUpdate=False): self.itemCount = 0 for item in self.fileItems: self.drawObjects.append(item.generateDrawObjects(forceUpdate)) def makePenCosmetic(self, painter): localPen = painter.pen() localPen.setCosmetic(True) painter.setPen(localPen) def copyItem(self): self.selectOnHover() if self.currentlySelectedObj['selectedIndex'] is not None: maj, minor = self.currentlySelectedObj['selectedIndex'] if isinstance(self.fileItems[maj],x2a.xasyShape) or isinstance(self.fileItems[maj],x2a.xasyText): self.copiedObject = self.fileItems[maj].copy() else: self.ui.statusbar.showMessage('Copying not supported with current item type') else: self.ui.statusbar.showMessage('No object selected to copy') self.copiedObject = None self.clearSelection() def pasteItem(self): if hasattr(self, 'copiedObject') and not self.copiedObject is None: self.copiedObject = self.copiedObject.copy() self.addInPlace(self.copiedObject) mousePos = self.getWindowCoordinates() - self.copiedObject.path.toQPainterPath().boundingRect().center() - (Qc.QPointF(self.canvSize.width(), self.canvSize.height()) + Qc.QPointF(62, 201))/2 #I don't really know what that last constant is? Is it the size of the framing? newTransform = Qg.QTransform.fromTranslate(mousePos.x(), mousePos.y()) self.currentlySelectedObj['selectedIndex'] = (self.globalObjectCounter - 1,0) self.currentlySelectedObj['key'], self.currentlySelectedObj['allSameKey'] = self.selectObjectSet() newTransform = x2a.asyTransform.fromQTransform(newTransform) objKey = self.currentlySelectedObj['selectedIndex'] self.addTransformationChanges(objKey, newTransform, not self.useGlobalCoords) self.transformObject(objKey, newTransform, not self.useGlobalCoords) self.quickUpdate() else: self.ui.statusbar.showMessage('No object to paste') def contextMenuEvent(self, event): #Note that we can't get anything from self.selectOnHover() here. try: self.contextWindowIndex = self.selectObject()[0] #for arrowifying maj = self.contextWindowIndex[0] except: return item=self.fileItems[maj] if item is not None and isinstance(item, x2a.xasyDrawnItem): self.contextWindowObject = item #For arrowifying self.contextWindow = ContextWindow.AnotherWindow(item,self) self.contextWindow.setMinimumWidth(420) #self.setCentralWidget(self.contextWindow) #I don't know what this does tbh. self.contextWindow.show() def focusInEvent(self,event): if self.mainCanvas.isActive(): self.quickUpdate() def replaceObject(self,objectIndex,newObject): maj, minor = self.contextWindowIndex selectedObj = self.drawObjects[maj][minor] parent = selectedObj.parent() if isinstance(parent, x2a.xasyScript): objKey=(selectedObj.key, selectedObj.keyIndex) self.hiddenKeys.add(objKey) self.undoRedoStack.add(self.createAction( SoftDeletionChanges(selectedObj.parent(), objKey) )) self.softDeleteObj((maj, minor)) else: index = self.fileItems.index(selectedObj.parent()) self.undoRedoStack.add(self.createAction( HardDeletionChanges(selectedObj.parent(), index) )) self.fileItems.remove(selectedObj.parent()) self.fileItems.append(newObject) self.drawObjects.append(newObject.generateDrawObjects(True)) #THIS DOES WORK, IT'S JUST REGENERATING THE SHAPE. self.checkUndoRedoButtons() self.fileChanged = True self.clearSelection() #self.asyfyCanvas() #self.quickUpdate() def terminateContextWindow(self): if self.contextWindow is not None: self.contextWindow.close() self.asyfyCanvas() self.quickUpdate() asymptote-3.05/GUI/UndoRedoStack.py0000644000000000000000000000704015031566105015672 0ustar rootroot#!/usr/bin/env python3 ########################################################################### # # UndoRedoStack implements the usual undo/redo capabilities of a GUI # # Author: Orest Shardt # Created: July 23, 2007 # ########################################################################### class action: def __init__(self, actions): act, inv = actions self.act = act self.inv = inv def undo(self): # print ("Undo:",self) self.inv() def redo(self): # print ("Redo:",self) self.act() def __str__(self): return "A generic action" class beginActionGroup: pass class endActionGroup: pass class actionStack: def __init__(self): self.clear() def add(self, action): self.undoStack.append(action) # print ("Added",action) self.redoStack = [] def undo(self): if len(self.undoStack) > 0: op = self.undoStack.pop() if op is beginActionGroup: level = 1 self.redoStack.append(endActionGroup) while level > 0: op = self.undoStack.pop() if op is endActionGroup: level -= 1 self.redoStack.append(beginActionGroup) elif op is beginActionGroup: level += 1 self.redoStack.append(endActionGroup) else: op.undo() self.redoStack.append(op) elif op is endActionGroup: raise Exception("endActionGroup without previous beginActionGroup") else: self.redoStack.append(op) op.undo() # print ("undid",op) else: pass # print ("nothing to undo") def redo(self): if len(self.redoStack) > 0: op = self.redoStack.pop() if op is beginActionGroup: level = 1 self.undoStack.append(endActionGroup) while level > 0: op = self.redoStack.pop() if op is endActionGroup: level -= 1 self.undoStack.append(beginActionGroup) elif op is beginActionGroup: level += 1 self.undoStack.append(endActionGroup) else: op.redo() self.undoStack.append(op) elif op is endActionGroup: raise Exception("endActionGroup without previous beginActionGroup") else: self.undoStack.append(op) op.redo() # print ("redid",op) else: pass # print ("nothing to redo") def setCommitLevel(self): self.commitLevel = len(self.undoStack) def changesMade(self): if len(self.undoStack) != self.commitLevel: return True else: return False def clear(self): self.redoStack = [] self.undoStack = [] self.commitLevel = 0 if __name__ == '__main__': import sys def opq(): print("action1") def unopq(): print("inverse1") q = action(opq, unopq) w = action(lambda: sys.stdout.write("action2\n"), lambda: sys.stdout.write("inverse2\n")) e = action(lambda: sys.stdout.write("action3\n"), lambda: sys.stdout.write("inverse3\n")) s = actionStack() s.add(q) s.add(w) s.add(e) asymptote-3.05/GUI/xasyFile.py0000644000000000000000000001141715031566105014754 0ustar rootroot#!/usr/bin/env python3 ########################################################################### # # xasyFile implements the loading, parsing, and saving of an asy file. # # # Author: Orest Shardt # Created: June 29, 2007 # ############################################################################ from string import * import xasy2asy as xasy2asy import io import re class xasyParseError(Exception): """A parsing error""" pass class xasyFileError(Exception): """An i/o error or other error not related to parsing""" pass def extractTransform(line): """Returns key and the new transform.""" # see https://regex101.com/r/6DqkRJ/4 for info mapString = xasy2asy.xasyItem.mapString testMatch = re.match( r'^{0:s}\s*\(\s*\"([^\"]+)\"\s*,\s*\(([-\d, .]+)\)\s*\)'.format(mapString), line.strip()) if testMatch is None: mapOnlyMatch = re.match(r'^{0:s}\s*\(\s*\"([^\"]+)\"\s*\)'.format(mapString), line.strip()) if mapOnlyMatch is None: return None else: key = mapOnlyMatch.group(1) return key, xasy2asy.identity() else: key = testMatch.group(1) rawStr = testMatch.group(2) rawStrArray = rawStr.split(',') if len(rawStrArray) != 6: return None transf = [float(val.strip()) for val in rawStrArray] return key, xasy2asy.asyTransform(transf) def extractTransformsFromFile(fileStr): transfDict = {} maxItemCount = 0 with io.StringIO() as rawCode: for line in fileStr.splitlines(): test_transf = extractTransform(line.rstrip()) if test_transf is None: rawCode.write(line + '\n') else: key, transf = test_transf if key not in transfDict.keys(): transfDict[key] = [] transfDict[key].append(transf) final_str = rawCode.getvalue() return final_str, transfDict def xasy2asyCode(xasyItems, asy2psmap): with io.StringIO() as asyCode: for item in xasyItems: asyCode.write(item.getTransformCode(asy2psmap)) for item in xasyItems: asyCode.write(item.getObjectCode(asy2psmap)) asyCode.write( 'size('+str(asy2psmap*xasy2asy.yflip())+'); ' + xasy2asy.xasyItem.resizeComment + '\n' ) return asyCode.getvalue() def saveFile(file, xasyItems, asy2psmap): """Write a list of xasyItems to a file""" file.write(xasy2asyCode(xasyItems, asy2psmap)) def xasyToDict(file, xasyItems, asy2psmap): fileItems = [] asyItems = [] for item in xasyItems: if isinstance(item, xasy2asy.xasyScript): # reusing xasyFile code for objects # imported from asy script. asyItems.append({'item':item, 'type': 'xasyScript'}) elif isinstance(item, xasy2asy.xasyText): # At the moment xasyText cannot be edited # so we treat it the same as xasyScript penData = {'color': item.pen.color, 'width': item.pen.width, 'options': item.pen.options} fileItems.append({'type': 'xasyText', 'align': item.label.align, 'location': item.label.location, 'fontSize': item.label.fontSize, 'text': item.label.text, 'transform': item.transfKeymap[item.transfKey][0].t, 'transfKey': item.transfKey, 'pen': penData }) elif isinstance(item, xasy2asy.xasyShape): penData = {'color': item.pen.color, 'width': item.pen.width, 'dashPattern': item.pen.dashPattern, 'options': item.pen.options} fileItems.append({'type': 'xasyShape', 'nodes': item.path.nodeSet, 'links': item.path.linkSet, 'fill': item.path.fill, 'transform': item.transfKeymap[item.transfKey][0].t, 'transfKey': item.transfKey, 'pen': penData }) elif isinstance(item, xasy2asy.asyArrow): #Will this ever even be reached? penData = {'color': item.pen.color, 'width': item.pen.width, 'dashPattern': item.pen.dashPattern, 'options': item.pen.options} fileItems.append({'type': 'asyArrow', 'pen': penData, 'arrowSettings': item.arrowSettings, 'transform': item.transfKeymap[item.transfKey][0].t, 'transfKey': item.transfKey, 'settings': item.arrowSettings, 'code': item.code }) else: # DEBUGGING PURPOSES ONLY print(type(item)) return {'objects': fileItems, 'asy2psmap': asy2psmap.t}, asyItems asymptote-3.05/GUI/xasyOptions.py0000644000000000000000000001545315031566105015534 0ustar rootroot#!/usr/bin/env python3 ########################################################################### # # xasyOptions provides a mechanism for storing and restoring a user's # preferences. # # # Author: Orest Shardt # Created: June 29, 2007 # ########################################################################### import sys import io import os import platform import shutil import configs import cson class xasyOptions: def defaultOptions(self): if self._defaultOptions is None: f = io.open(self._defaultOptLocation) try: opt = cson.loads(f.read()) finally: f.close() self._defaultOptions = opt return self._defaultOptions def overrideSettings(self): settingsName = platform.system() if settingsName not in self.options: return for key in self.options[settingsName]: self.options[key] = self.options[settingsName][key] def settingsFileLocation(self): folder = os.path.expanduser("~/.asy/") searchOrder = ['.cson', ''] searchIndex = 0 found = False currentFile = '' while searchIndex < len(searchOrder) and not found: currentFile = os.path.join(folder, self.configName + searchOrder[searchIndex]) if os.path.isfile(currentFile): found = True searchIndex += 1 if found: return os.path.normcase(currentFile) else: return os.path.normcase(os.path.join(folder, self.configName + '.cson')) def __init__(self, configName, defaultConfigLocation): self.configName = configName self.defaultConfigName = defaultConfigLocation self._defaultOptions = None self._defaultOptLocation = os.path.join(defaultConfigLocation) self.options = self.defaultOptions() self.load() def __getitem__(self, key): return self.options[key] def __contains__(self, key): return key in self.options def get(self, key, default=None): if key not in self.options: return default return self.options[key] def __setitem__(self, key, value): self.options[key] = value def load(self): fileName = self.settingsFileLocation() if not os.path.exists(fileName): # make folder thedir = os.path.dirname(fileName) if not os.path.exists(thedir): os.makedirs(thedir) if not os.path.isdir(thedir): raise Exception("Configuration folder path does not point to a folder") self.setDefaults() f = io.open(fileName, 'r') try: ext = os.path.splitext(fileName)[1] newOptions = cson.loads(f.read()) except (IOError, ModuleNotFoundError): self.setDefaults() else: for key, val in self.options.items(): if key in newOptions: if val is not None: assert isinstance(newOptions[key], type(val)) else: newOptions[key] = self.options[key] self.options = newOptions finally: f.close() self.overrideSettings() def setDefaults(self): self.options = self.defaultOptions() if sys.platform[:3] == 'win': # for windows, wince, win32, etc # setAsyPathFromWindowsRegistry() pass folder = os.path.expanduser("~/.asy/") defaultPath = os.path.join(folder, self.configName + '.cson') shutil.copy2(self._defaultOptLocation, defaultPath) # TODO: Figure out how to merge this back. """ def setAsyPathFromWindowsRegistry(): if os.name == 'nt': import _winreg as registry # test both registry locations try: key = registry.OpenKey(registry.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Asymptote") options['asyPath'] = registry.QueryValueEx(key, "Path")[0] + "\\asy.exe" registry.CloseKey(key) except: key = registry.OpenKey(registry.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Asymptote") options['asyPath'] = registry.QueryValueEx(key, "InstallLocation")[0] + "\\asy.exe" registry.CloseKey(key) """ class xasyOpenRecent: def __init__(self, configName, defaultConfigLocation): self.configName = configName self.fileName = self.settingsFileLocation() if not os.path.isfile(self.fileName): f = io.open(self.fileName, 'w') f.write('') f.close() def settingsFileLocation(self): folder = os.path.expanduser("~/.asy/") currentFile = os.path.join(folder, self.configName + '.txt') return os.path.normcase(currentFile) def insert(self, path): if not os.path.exists(self.fileName): # make folder thedir = os.path.dirname(self.fileName) if not os.path.exists(thedir): os.makedirs(thedir) if not os.path.isdir(thedir): raise Exception("Configuration folder path does not point to a folder") f = io.open(self.fileName, 'r') lines = f.readlines() f.close() f = io.open(self.fileName, 'w') f.write(path.strip() + '\n') for line in lines: if line.strip() != path.strip(): f.write(line.strip() + '\n') f.close() @property def pathList(self): self.findingPaths=True return self.findPath() def findPath(self): f = io.open(self.fileName, 'r') paths = [path.strip() for path in f.readlines()] f.close() trueFiles = list(map(lambda path: os.path.isfile(os.path.expanduser(path)), paths)) if all(trueFiles): return paths else: if self.findingPaths == False: raise RecursionError self.findingPaths = False self.removeNotFound(list(trueFiles), paths) return self.findPath() def removeNotFound(self, trueFiles, paths): f = io.open(self.fileName, 'w') for index, path in enumerate(paths): if trueFiles[index] == True: f.write(path + '\n') f.close() def clear(self): f = io.open(self.fileName, 'w') f.write('') f.close() class BasicConfigs: _configPath = list(configs.__path__)[0] defaultOpt = xasyOptions( 'xasyconfig', os.path.join(_configPath, 'xasyconfig.cson')) keymaps = xasyOptions('xasykeymap', os.path.join( _configPath, 'xasykeymap.cson')) openRecent = xasyOpenRecent('xasyrecents', os.path.join( _configPath, "xasyrecent.txt")) asymptote-3.05/GUI/xasy2asy.py0000644000000000000000000020162115031566105014751 0ustar rootroot#!/usr/bin/env python3 ########################################################################### # # xasy2asy provides a Python interface to Asymptote # # # Authors: Orest Shardt, Supakorn Rassameemasmuang, and John C. Bowman # ########################################################################### import PyQt5.QtWidgets as QtWidgets import PyQt5.QtGui as QtGui import PyQt5.QtCore as QtCore import PyQt5.QtSvg as QtSvg import numpy as numpy import sys import os import signal import threading import string import subprocess import tempfile import re import shutil import copy import queue import io import atexit import DebugFlags import threading from typing import Optional import xasyUtils as xu import xasyArgs as xa import xasyOptions as xo import xasySvg as xs class AsymptoteEngine: """ Purpose: -------- Class that makes it possible for xasy to communicate with asy through a background pipe. It communicates with asy through a subprocess of an existing xasy process. Attributes: ----------- istream : input stream ostream : output stream keepFiles : keep communicated files tmpdir : temporary directory args : system call arguments to start a required subprocess asyPath : directory path to asymptote asyProcess : the subprocess through which xasy communicates with asy Virtual Methods: NULL ---------------- Static Methods: --------------- NULL Class Methods: -------------- NULL Object Methods: --------------- start() wait() stop() cleanup() """ xasy=chr(4)+'\n' def __init__( self, path=None, addrArgsParam: Optional[list[str]] = None, keepFiles=DebugFlags.keepFiles, keepDefaultArgs=True ): addrArgs = addrArgsParam or [] if path is None: path = xa.getArgs().asypath if path is None: opt = xo.BasicConfigs.defaultOpt opt.load() path = opt['asyPath'] if sys.platform[:3] == 'win': rx = 0 # stdin wa = 2 # stderr else: rx, wx = os.pipe() ra, wa = os.pipe() os.set_inheritable(rx, True) os.set_inheritable(wx, True) os.set_inheritable(ra, True) os.set_inheritable(wa, True) self.ostream = os.fdopen(wx, 'w') self.istream = os.fdopen(ra, 'r') self.keepFiles = keepFiles self.tmpdir = tempfile.mkdtemp(prefix='xasyData_')+os.sep if xa.getArgs().render: renderDensity=xa.getArgs().render else: try: renderDensity = xo.BasicConfigs.defaultOpt['renderDensity'] except: renderDensity = 2 renderDensity=max(renderDensity,1) self.args=addrArgs + [ '-xasy', '-noV', '-q', '-outformat=', '-inpipe=' + str(rx), '-outpipe=' + str(wa), '-render='+str(renderDensity), '-o', self.tmpdir] self.asyPath = path self.asyProcess = None def start(self): """ starts a subprocess (opens a pipe) """ try: if sys.platform[:3] == 'win': self.asyProcess = subprocess.Popen( [self.asyPath] + self.args, stdin=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) self.ostream = self.asyProcess.stdin self.istream = self.asyProcess.stderr else: self.asyProcess = subprocess.Popen([self.asyPath] + self.args,close_fds=False) finally: atexit.register(self.cleanup) def wait(self): """ wait for the pipe to finish any outstanding communication """ if self.asyProcess.returncode is not None: return else: return self.asyProcess.wait() def __enter__(self): self.start() return self def __exit__(self, exc_type, exc_val, exc_tb): self.stop() self.wait() @property def tempDirName(self): return self.tmpdir def startThenStop(self): self.start() self.stop() self.wait() @property def active(self): if self.asyProcess is None: return False return self.asyProcess.returncode is None def stop(self): """ kill an active asyProcess and close the pipe """ if self.active: self.asyProcess.kill() def cleanup(self): """ terminate processes and cleans up communication files """ self.stop() if self.asyProcess is not None: self.asyProcess.wait() if not self.keepFiles: if os.path.isdir(self.tempDirName + os.sep): shutil.rmtree(self.tempDirName, ignore_errors=True) class asyTransform(QtCore.QObject): """ Purpose: -------- A python implementation of an asy transform. This class takes care of calibrating asymptote coordinate system with the one used in PyQt to handle all existing inconsistencies. To understand how this class works, having enough acquaintance with asymptote transform feature is required. It is a child class of QtCore.QObject class. Attributes: ----------- t : The tuple x, y, xx, xy, yx, yy : Coordinates corresponding to 6 entries _deleted : Private local flag Virtual Methods: NULL ---------------- Static Methods: NULL --------------- Class Methods: -------------- zero : Class method that returns an asyTransform object initialized with 6 zero entries fromQTransform : Class method that converts QTransform object to asyTransform object fromNumpyMatrix : Class method that converts transform matrix object to asyTransform object Object Methods: -------------- getRawCode : Returns the tuple entries getCode : Returns the textual format of the asy code corresponding to the given transform scale : Returns the scales version of the existing asyTransform toQTransform : Converts asy transform object to QTransform object identity : Return Identity asyTransform object isIdentity : Check whether the asyTransform object is identity object inverted : Applies the QTransform object's inverted method on the asyTransform object yflip : Returns y-flipped asyTransform object """ def __init__(self, initTuple, delete=False): """ Initialize the transform with a 6 entry tuple """ super().__init__() if isinstance(initTuple, (tuple, list)) and len(initTuple) == 6: self.t = initTuple self.x, self.y, self.xx, self.xy, self.yx, self.yy = initTuple self._deleted = delete else: raise TypeError("Illegal initializer for asyTransform") @property def deleted(self): return self._deleted @deleted.setter def deleted(self, value): self._deleted = value @classmethod def zero(cls): return asyTransform((0, 0, 0, 0, 0, 0)) @classmethod def fromQTransform(cls, transform: QtGui.QTransform): tx, ty = transform.dx(), transform.dy() xx, xy, yx, yy = transform.m11(), transform.m21(), transform.m12(), transform.m22() return asyTransform((tx, ty, xx, xy, yx, yy)) @classmethod def fromNumpyMatrix(cls, transform: numpy.ndarray): assert transform.shape == (3, 3) tx = transform[0, 2] ty = transform[1, 2] xx, xy, yx, yy = transform[0:2, 0:2].ravel().tolist()[0] return asyTransform((tx, ty, xx, xy, yx, yy)) def getRawCode(self): return xu.tuple2StrWOspaces(self.t) def getCode(self, asy2psmap = None): """ Obtain the asy code that represents this transform """ if asy2psmap is None: asy2psmap = asyTransform((0, 0, 1, 0, 0, 1)) if self.deleted: return 'zeroTransform' else: return (asy2psmap.inverted() * self * asy2psmap).getRawCode() def scale(self, s): return asyTransform((0, 0, s, 0, 0, s)) * self def toQTransform(self): return QtGui.QTransform(self.xx, self.yx, self.xy, self.yy, self.x, self.y) def __str__(self): """ Equivalent functionality to getCode(). It allows the expression str(asyTransform) to be meaningful """ return self.getCode() def isIdentity(self): return self == identity() def inverted(self): return asyTransform.fromQTransform(self.toQTransform().inverted()[0]) def __eq__(self, other): return list(self.t) == list(other.t) def __mul__(self, other): """ Define multiplication of transforms as composition """ if isinstance(other, tuple): if len(other) == 6: return self * asyTransform(other) elif len(other) == 2: return ((self.t[0] + self.t[2] * other[0] + self.t[3] * other[1]), (self.t[1] + self.t[4] * other[0] + self.t[5] * other[1])) else: raise Exception("Illegal multiplier of {:s}".format(str(type(other)))) elif isinstance(other, asyTransform): result = asyTransform((0, 0, 0, 0, 0, 0)) result.x = self.x + self.xx * other.x + self.xy * other.y result.y = self.y + self.yx * other.x + self.yy * other.y result.xx = self.xx * other.xx + self.xy * other.yx result.xy = self.xx * other.xy + self.xy * other.yy result.yx = self.yx * other.xx + self.yy * other.yx result.yy = self.yx * other.xy + self.yy * other.yy result.t = (result.x, result.y, result.xx, result.xy, result.yx, result.yy) return result elif isinstance(other, str): if other != 'cycle': raise TypeError else: return 'cycle' else: raise TypeError("Illegal multiplier of {:s}".format(str(type(other)))) def identity(): return asyTransform((0, 0, 1, 0, 0, 1)) def yflip(): return asyTransform((0, 0, 1, 0, 0, -1)) class asyObj(QtCore.QObject): """ Purpose: -------- A base class to create a Python object which contains all common data and behaviors required during the translation of an xasy object to its Asymptote code. Attributes: ----------- asyCode :The corresponding Asymptote code for the asyObj instance Virtual Methods: ---------------- updateCode :Must to be re-implemented Static Methods: NULL -------------- Class Methods: NULL -------------- Object Methods: --------------- getCode :Return the Asymptote code that corresponds to the passed object """ def __init__(self): """ Initialize the object """ super().__init__() self.asyCode = '' def updateCode(self, ps2asymap = identity()): """ Update the object's code: should be overridden """ raise NotImplementedError def getCode(self, ps2asymap = identity()): """ Return the code describing the object """ self.updateCode(ps2asymap) return self.asyCode class asyPen(asyObj): """ Purpose: -------- A Python object that corresponds to an Asymptote pen type. It extends the 'asyObj' class to include a pen object. This object will be used to make the corresponding Asymptote pen when an xasy object gets translated to Asymptote code. Attributes: ----------- color : The color of Path options : The options that can be passed to the path width : The path width _asyengine : The Asymptote engine that will be used _deferAsyfy : ? Virtual Methods: NULL ---------------- Static Methods: --------------- getColorFromQColor : convertToQColor : Class Methods: -------------- fromAsyPen : Object Methods: --------------- asyEngine : updateCode : setWidth : setColor : setColorFromQColor : computeColor : tkColor : toQPen : """ @staticmethod def getColorFromQColor(color): return color.redF(), color.greenF(), color.blueF() @staticmethod def convertToQColor(color): r, g, b = color return QtGui.QColor.fromRgbF(r, g, b) @classmethod def fromAsyPen(cls, pen): assert isinstance(pen, cls) return cls(asyengine = pen._asyengine, color = pen.color, width = pen.width, pen_options = pen.options) def __init__(self, asyengine = None, color=(0, 0, 0), width = 0.5, pen_options = ""): """ Initialize the pen """ asyObj.__init__(self) self.color = (0, 0, 0) self.options = pen_options self.width = width self.style = "solid" self.capStyle = QtCore.Qt.PenCapStyle.SquareCap self.opacity = 255 #Should these be in a dictionary? self.dashPattern = [1,0] self._asyengine = asyengine self._deferAsyfy = False if pen_options: self._deferAsyfy = True self.updateCode() self.setColor(color) @property def asyEngine(self): return self._asyengine @asyEngine.setter def asyEngine(self, value): self._asyengine = value def qtCapStyleToAsyCapStyle(self, style): lineCapList = [QtCore.Qt.PenCapStyle.SquareCap,QtCore.Qt.PenCapStyle.FlatCap,QtCore.Qt.PenCapStyle.RoundCap] asyCapList = ["extendcap","flatcap","roundcap"] if style in lineCapList: return asyCapList[lineCapList.index(style)] else: return False def updateCode(self, asy2psmap = identity()): """ Generate the pen's code """ if self._deferAsyfy: self.computeColor() self.asyCode = 'rgb({:g},{:g},{:g})+{:s}'.format(self.color[0], self.color[1], self.color[2], str(self.width)) if len(self.options) > 0: self.asyCode = self.asyCode + '+' + self.options if self.style != "solid": self.asyCode = self.style + '+' + self.asyCode def setWidth(self, newWidth): """ Set the pen's width """ self.width = newWidth self.updateCode() def setDashPattern(self, pattern): self.dashPattern = pattern self.updateCode() #Get working def setStyle(self, style): self.style = style self.updateCode() def setCapStyle(self, style): self.capStyle = style self.updateCode() def setOpacity(self, opacity): self.opacity = opacity self.updateCode() def setColor(self, color): """ Set the pen's color """ if isinstance(color, tuple) and len(color) == 3: self.color = color else: self.color = (0, 0, 0) self.updateCode() def setColorFromQColor(self, color): self.setColor(asyPen.getColorFromQColor(color)) def computeColor(self): """ Find out the color of an arbitrary Asymptote pen """ assert isinstance(self.asyEngine, AsymptoteEngine) assert self.asyEngine.active fout = self.asyEngine.ostream fin = self.asyEngine.istream fout.write("pen p=" + self.getCode() + ';\n') fout.write("write(_outpipe,colorspace(p),newl);\n") fout.write("write(_outpipe,colors(p));\n") fout.write("flush(_outpipe);\n") fout.write(self.asyEngine.xasy) fout.flush() colorspace = fin.readline() if colorspace.find("cmyk") != -1: lines = fin.readline() + fin.readline() + fin.readline() + fin.readline() parts = lines.split() c, m, y, k = eval(parts[0]), eval(parts[1]), eval(parts[2]), eval(parts[3]) k = 1 - k r, g, b = ((1 - c) * k, (1 - m) * k, (1 - y) * k) elif colorspace.find("rgb") != -1: lines = fin.readline() + fin.readline() + fin.readline() parts = lines.split() r, g, b = eval(parts[0]), eval(parts[1]), eval(parts[2]) elif colorspace.find("gray") != -1: lines = fin.readline() parts = lines.split() r = g = b = eval(parts[0]) else: raise ChildProcessError('Asymptote error.') self.color = (r, g, b) self._deferAsyfy = False def toQPen(self): if self._deferAsyfy: self.computeColor() newPen = QtGui.QPen() color = asyPen.convertToQColor(self.color) color.setAlpha(self.opacity) newPen.setColor(color) newPen.setCapStyle(self.capStyle) newPen.setWidthF(self.width) if self.dashPattern: newPen.setDashPattern(self.dashPattern) return newPen class asyPath(asyObj): """ Purpose: -------- A Python object that corresponds to an Asymptote path type. It extends the 'asyObj' class to include a path object. This object will be used to make the corresponding Asymptote path object when an xasy object gets translated to its Asymptote code. Attributes: ----------- Virtual Methods: ---------------- Static Methods: --------------- Class Methods: -------------- Object Methods: --------------- """ def __init__(self, asyengine: AsymptoteEngine=None, forceCurve=False): """ Initialize the path to be an empty path: a path with no nodes, control points, or links """ super().__init__() self.nodeSet = [] self.linkSet = [] self.forceCurve = forceCurve self.controlSet = [] self.computed = False self.asyengine = asyengine self.fill = False @classmethod def fromPath(cls, oldPath): newObj = asyPath(None) newObj.nodeSet = copy.copy(oldPath.nodeSet) newObj.linkSet = copy.copy(oldPath.linkSet) newObj.fill = copy.copy(oldPath.fill) newObj.controlSet = copy.deepcopy(oldPath.controlSet) newObj.computed = oldPath.computed newObj.asyengine = oldPath.asyengine return newObj def setInfo(self, path): self.nodeSet = copy.copy(path.nodeSet) self.linkSet = copy.copy(path.linkSet) self.fill = copy.copy(path.fill) self.controlSet = copy.deepcopy(path.controlSet) self.computed = path.computed @property def isEmpty(self): return len(self.nodeSet) == 0 @property def isDrawable(self): return len(self.nodeSet) >= 2 def toQPainterPath(self) -> QtGui.QPainterPath: return self.toQPainterPathCurve() if self.containsCurve else self.toQPainterPathLine() def toQPainterPathLine(self): baseX, baseY = self.nodeSet[0] painterPath = QtGui.QPainterPath(QtCore.QPointF(baseX, baseY)) for pointIndex in range(1, len(self.nodeSet)): node = self.nodeSet[pointIndex] if self.nodeSet[pointIndex] == 'cycle': node = self.nodeSet[0] painterPath.lineTo(*node) return painterPath def toQPainterPathCurve(self): if not self.computed: self.computeControls() baseX, baseY = self.nodeSet[0] painterPath = QtGui.QPainterPath(QtCore.QPointF(baseX, baseY)) for pointIndex in range(1, len(self.nodeSet)): node = self.nodeSet[pointIndex] if self.nodeSet[pointIndex] == 'cycle': node = self.nodeSet[0] endPoint = QtCore.QPointF(node[0], node[1]) ctrlPoint1 = QtCore.QPointF(self.controlSet[pointIndex-1][0][0], self.controlSet[pointIndex-1][0][1]) ctrlPoint2 = QtCore.QPointF(self.controlSet[pointIndex-1][1][0], self.controlSet[pointIndex-1][1][1]) painterPath.cubicTo(ctrlPoint1, ctrlPoint2, endPoint) return painterPath def initFromNodeList(self, nodeSet, linkSet): """ Initialize the path from a set of nodes and link types, '--', '..', or '::' """ if len(nodeSet) > 0: self.nodeSet = nodeSet[:] self.linkSet = linkSet[:] self.computed = False def initFromControls(self, nodeSet, controlSet): """ Initialize the path from nodes and control points """ self.controlSet = controlSet[:] self.nodeSet = nodeSet[:] self.computed = True def makeNodeStr(self, node): """ Represent a node as a string """ if node == 'cycle': return node else: # if really want to, disable this rounding # shouldn't be to much of a problem since 10e-6 is quite small... return '({:.6g},{:.6g})'.format(node[0], node[1]) def updateCode(self, ps2asymap=identity()): """ Generate the code describing the path """ # currently at postscript. Convert to asy asy2psmap = ps2asymap.inverted() with io.StringIO() as rawAsyCode: count = 0 rawAsyCode.write(self.makeNodeStr(asy2psmap * self.nodeSet[0])) for node in self.nodeSet[1:]: if not self.computed or count >= len(self.controlSet): rawAsyCode.write(self.linkSet[count]) rawAsyCode.write(self.makeNodeStr(asy2psmap * node)) else: rawAsyCode.write('..controls ') rawAsyCode.write(self.makeNodeStr(asy2psmap * self.controlSet[count][0])) rawAsyCode.write(' and ') rawAsyCode.write(self.makeNodeStr(asy2psmap * self.controlSet[count][1])) rawAsyCode.write(".." + self.makeNodeStr(asy2psmap * node)) count = count + 1 self.asyCode = rawAsyCode.getvalue() @property def containsCurve(self): return '..' in self.linkSet or self.forceCurve def getNode(self, index): """ Return the requested node """ return self.nodeSet[index] def getLink(self, index): """ Return the requested link """ return self.linkSet[index] def setNode(self, index, newNode): """ Set a node to a new position """ self.nodeSet[index] = newNode def moveNode(self, index, offset): """ Translate a node """ if self.nodeSet[index] != "cycle": self.nodeSet[index] = (self.nodeSet[index][0] + offset[0], self.nodeSet[index][1] + offset[1]) def setLink(self, index, ltype): """ Change the specified link """ self.linkSet[index] = ltype def addNode(self, point, ltype): """ Add a node to the end of a path """ self.nodeSet.append(point) if len(self.nodeSet) != 1: self.linkSet.append(ltype) if self.computed: self.computeControls() def insertNode(self, index, point, ltype=".."): """ Insert a node, and its corresponding link, at the given index """ self.nodeSet.insert(index, point) self.linkSet.insert(index, ltype) if self.computed: self.computeControls() def setControl(self, index, position): """ Set a control point to a new position """ self.controlSet[index] = position def popNode(self): if len(self.controlSet) == len(self.nodeSet): self.controlSet.pop() self.nodeSet.pop() self.linkSet.pop() def moveControl(self, index, offset): """ Translate a control point """ self.controlSet[index] = (self.controlSet[index][0] + offset[0], self.controlSet[index][1] + offset[1]) def computeControls(self): """ Evaluate the code of the path to obtain its control points """ # For now, if no asymptote process is given spawns a new one. # Only happens if asyengine is None. if self.asyengine is not None: assert isinstance(self.asyengine, AsymptoteEngine) assert self.asyengine.active asy = self.asyengine startUp = False else: startUp = True asy = AsymptoteEngine() asy.start() fout = asy.ostream fin = asy.istream fout.write("path p=" + self.getCode() + ';\n') fout.write("write(_outpipe,length(p),newl);\n") fout.write("write(_outpipe,unstraighten(p),endl);\n") fout.write(asy.xasy) fout.flush() lengthStr = fin.readline() pathSegments = eval(lengthStr.split()[-1]) pathStrLines = [] for i in range(pathSegments + 1): line = fin.readline() line = line.replace("\n", "") pathStrLines.append(line) oneLiner = "".join(pathStrLines).replace(" ", "") splitList = oneLiner.split("..") nodes = [a for a in splitList if a.find("controls") == -1] self.nodeSet = [] for a in nodes: if a == 'cycle': self.nodeSet.append(a) else: self.nodeSet.append(eval(a)) controls = [a.replace("controls", "").split("and") for a in splitList if a.find("controls") != -1] self.controlSet = [[eval(a[0]), eval(a[1])] for a in controls] self.computed = True if startUp: asy.stop() class asyLabel(asyObj): """ Purpose: -------- A Python object that corresponds to an asymptote label type. It extends the 'asyObj' class to include a label object. This object will be used to make the corresponding Asymptote label object when an xasy object gets translated to its asymptote code. Attributes: ----------- Virtual Methods: ---------------- Static Methods: --------------- Class Methods: -------------- Object Methods: --------------- """ def __init__(self, text = "", location = (0, 0), pen = None, align = None, fontSize:int = None): """Initialize the label with the given test, location, and pen""" asyObj.__init__(self) self.align = align self.pen = pen self.fontSize = fontSize if align is None: self.align = 'SE' if pen is None: self.pen = asyPen() self.text = text self.location = location def updateCode(self, asy2psmap = identity()): """ Generate the code describing the label """ newLoc = asy2psmap.inverted() * self.location locStr = xu.tuple2StrWOspaces(newLoc) self.asyCode = 'Label("{0}",{1},p={2}{4},align={3})'.format(self.text, locStr, self.pen.getCode(), self.align, self.getFontSizeText()) def getFontSizeText(self): if self.fontSize is not None: return '+fontsize({:.6g})'.format(self.fontSize) else: return '' def setText(self, text): """ Set the label's text """ self.text = text self.updateCode() def setPen(self, pen): """ Set the label's pen """ self.pen = pen self.updateCode() def moveTo(self, newl): """ Translate the label's location """ self.location = newl class asyImage: """ Purpose: -------- A Python object that is a container for an image coming from Asymptote that is populated with the format, bounding box, and IDTag, Asymptote key. Attributes: ----------- Virtual Methods: ---------------- Static Methods: --------------- Class Methods: -------------- Object Methods: --------------- """ def __init__(self, image, format, bbox, transfKey=None, keyIndex=0): self.image = image self.format = format self.bbox = bbox self.IDTag = None self.key = transfKey self.keyIndex = keyIndex class xasyItem(QtCore.QObject): """ Purpose: -------- A base class for any xasy object that can be drawn in PyQt. This class takes care of all common behaviors available on any xasy item as well as all common actions that can be done or applied to every xasy item. Attributes: ----------- Virtual Methods: ---------------- Static Methods: --------------- Class Methods: -------------- Object Methods: --------------- """ mapString = 'xmap' setKeyFormatStr = string.Template('$map("{:s}",{:s});').substitute(map=mapString) setKeyAloneFormatStr = string.Template('$map("{:s}");').substitute(map=mapString) resizeComment="// Resize to initial xasy transform" asySize="" def __init__(self, canvas=None, asyengine=None): """ Initialize the item to an empty item """ super().__init__() self.transfKeymap = {} # the new keymap. # should be a dictionary to a list... self.asyCode = '' self.imageList = [] self.IDTag = None self.asyfied = False self.onCanvas = canvas self.keyBuffer = None self._asyengine = asyengine self.drawObjects = [] self.drawObjectsMap = {} self.setKeyed = True self.unsetKeys = set() self.userKeys = set() self.imageHandleQueue = queue.Queue() def updateCode(self, ps2asymap = identity()): """ Update the item's code: to be overridden """ with io.StringIO() as rawCode: transfCode = self.getTransformCode() objCode = self.getObjectCode() rawCode.write(transfCode) rawCode.write(objCode) self.asyCode = rawCode.getvalue() return len(transfCode.splitlines()), len(objCode.splitlines()) @property def asyengine(self): return self._asyengine @asyengine.setter def asyengine(self, value): self._asyengine = value def getCode(self, ps2asymap = identity()): """ Return the code describing the item """ self.updateCode(ps2asymap) return self.asyCode def getTransformCode(self, asy2psmap = identity()): raise NotImplementedError def getObjectCode(self, asy2psmap = identity()): raise NotImplementedError def generateDrawObjects(self): raise NotImplementedError def handleImageReception(self, file, fileformat, bbox, count, key = None, localCount = 0, containsClip = False): """ Receive an image from an asy deconstruction. It replaces the default n asyProcess """ # image = Image.open(file).transpose(Image.FLIP_TOP_BOTTOM) if fileformat == 'svg': if containsClip: image = xs.SvgObject(self.asyengine.tempDirName+file) else: image = QtSvg.QSvgRenderer(file) assert image.isValid() else: raise Exception('Format {} not supported!'.format(fileformat)) self.imageList.append(asyImage(image, fileformat, bbox, transfKey = key, keyIndex = localCount)) if self.onCanvas is not None: # self.imageList[-1].iqt = ImageTk.PhotoImage(image) currImage = self.imageList[-1] currImage.iqt = image currImage.originalImage = image currImage.originalImage.theta = 0.0 currImage.originalImage.bbox = list(bbox) currImage.performCanvasTransform = False # handle this case if transform is not in the map yet. # if deleted - set transform to (0,0,0,0,0,0) transfExists = key in self.transfKeymap.keys() if transfExists: transfExists = localCount <= len(self.transfKeymap[key]) - 1 if transfExists: validKey = not self.transfKeymap[key][localCount].deleted #Does this ever exist? else: validKey = False if (not transfExists) or validKey: currImage.IDTag = str(file) newDrawObj = DrawObject(currImage.iqt, self.onCanvas['canvas'], transform=identity(), btmRightanchor=QtCore.QPointF(bbox[0], bbox[2]), drawOrder=-1, key=key, parentObj=self, keyIndex=localCount) newDrawObj.setBoundingBoxPs(bbox) newDrawObj.setParent(self) self.drawObjects.append(newDrawObj) if key not in self.drawObjectsMap.keys(): self.drawObjectsMap[key] = [newDrawObj] else: self.drawObjectsMap[key].append(newDrawObj) return containsClip def asyfy(self, force = False): if self.asyengine is None: return 1 if self.asyfied and not force: return self.drawObjects = [] self.drawObjectsMap.clear() assert isinstance(self.asyengine, AsymptoteEngine) self.imageList = [] self.unsetKeys.clear() self.userKeys.clear() self.imageHandleQueue = queue.Queue() worker = threading.Thread(target = self.asyfyThread, args = []) worker.start() item = self.imageHandleQueue.get() cwd=os.getcwd(); os.chdir(self.asyengine.tempDirName) while item != (None,) and item[0] != "ERROR": if item[0] == "OUTPUT": print(item[1]) else: keepFile = self.handleImageReception(*item) if not DebugFlags.keepFiles and not keepFile: try: os.remove(item[0]) pass except OSError: pass finally: pass item = self.imageHandleQueue.get() # self.imageHandleQueue.task_done() os.chdir(cwd); worker.join() def asyfyThread(self): """ Convert the item to a list of images by deconstructing this item's code """ assert self.asyengine.active fout = self.asyengine.ostream fin = self.asyengine.istream self.maxKey=0 fout.write("reset\n") fout.flush(); for line in self.getCode().splitlines(): if DebugFlags.printAsyTranscript: print(line) fout.write(line+"\n") fout.write(self.asySize) fout.write('deconstruct();\n') fout.write('write(_outpipe,yscale(-1)*currentpicture.calculateTransform(),endl);\n') fout.write(self.asyengine.xasy) fout.flush() imageInfos = [] # of (box, key) n = 0 keyCounts = {} def render(): for i in range(len(imageInfos)): box, key, localCount, useClip = imageInfos[i] l, b, r, t = [float(a) for a in box.split()] name = '_{:d}.{:s}'.format(1+i, fileformat) self.imageHandleQueue.put((name, fileformat, (l, -t, r, -b), i, key, localCount, useClip)) # key first, box second. # if key is 'Done' raw_text = fin.readline() text = '' if DebugFlags.printDeconstTranscript: print(self.asyengine.tmpdir) print(raw_text.strip()) fileformat = 'svg' # Output format while raw_text != 'Done\n' and raw_text != 'Error\n': # print(raw_text) text = fin.readline() # the actual bounding box. # print('TESTING:', text) keydata = raw_text.strip().replace('KEY=', '', 1) # key clipflag = keydata[-1] == '1' deleted = keydata[-1] == '2' userkey = keydata[-2] == '1' keydata = keydata[:-3] if not userkey: self.unsetKeys.add(keydata) # the line and column to replace. else: if keydata.isdigit(): self.maxKey=max(self.maxKey,int(keydata)) self.userKeys.add(keydata) # print(line, col) if deleted: raw_text = fin.readline() continue if keydata not in keyCounts.keys(): keyCounts[keydata] = 0 imageInfos.append((text, keydata, keyCounts[keydata], clipflag)) # key-data pair # for the next item keyCounts[keydata] += 1 raw_text = fin.readline() if DebugFlags.printDeconstTranscript: print(text.rstrip()) print(raw_text.rstrip()) n += 1 if raw_text != 'Error\n': if text == 'Error\n': self.imageHandleQueue.put(('ERROR', fin.readline())) else: render() self.asy2psmap = asyTransform(xu.listize(fin.readline().rstrip(),float)) else: self.asy2psmap = yflip() self.imageHandleQueue.put((None,)) self.asyfied = True class xasyDrawnItem(xasyItem): """ Purpose: -------- A base class dedicated to any xasy item that is drawn with the GUI. Each object of this class corresponds to a particular drawn xasy item. Attributes: ----------- Virtual Methods: ---------------- Static Methods: --------------- Class Methods: -------------- Object Methods: --------------- """ def __init__(self, path, engine, pen = None, transform = identity(), key = None): """ Initialize the item with a path, pen, and transform """ super().__init__(canvas=None, asyengine=engine) if pen is None: pen = asyPen() self.path = path self.path.asyengine = engine self.asyfied = True self.pen = pen self._asyengine = engine self.rawIdentifier = '' self.transfKey = key self.transfKeymap = {self.transfKey: [transform]} @property def asyengine(self): return self._asyengine @asyengine.setter def asyengine(self, value: AsymptoteEngine): self._asyengine = value self.path.asyengine = value def setKey(self, newKey=None): transform = self.transfKeymap[self.transfKey][0] self.transfKey = newKey self.transfKeymap = {self.transfKey: [transform]} def generateDrawObjects(self, forceUpdate=False): raise NotImplementedError def appendPoint(self, point, link=None): """ Append a point to the path. If the path is cyclic, add this point before the 'cycle' node """ if self.path.nodeSet[-1] == 'cycle': self.path.nodeSet[-1] = point self.path.nodeSet.append('cycle') else: self.path.nodeSet.append(point) self.path.computed = False self.asyfied = False if len(self.path.nodeSet) > 1 and link is not None: self.path.linkSet.append(link) def clearTransform(self): """ Reset the item's transform """ self.transform = [identity()] self.asyfied = False def removeLastPoint(self): """ Remove the last point in the path. If the path is cyclic, remove the node before the 'cycle' node """ if self.path.nodeSet[-1] == 'cycle': del self.path.nodeSet[-2] else: del self.path.nodeSet[-1] del self.path.linkSet[-1] self.path.computed = False self.asyfied = False def setLastPoint(self, point): """ Modify the last point in the path. If the path is cyclic, modify the node before the 'cycle' node """ if self.path.nodeSet[-1] == 'cycle': self.path.nodeSet[-2] = point else: self.path.nodeSet[-1] = point self.path.computed = False self.asyfied = False class xasyShape(xasyDrawnItem): """ An outlined shape drawn on the GUI """ """ Purpose: -------- Attributes: ----------- Virtual Methods: ---------------- Static Methods: --------------- Class Methods: -------------- Object Methods: --------------- """ def __init__(self, path, asyengine, pen=None, transform=identity()): """Initialize the shape with a path, pen, and transform""" super().__init__(path=path, engine=asyengine, pen=pen, transform=transform) def getObjectCode(self, asy2psmap=identity()): if self.path.fill: return 'fill(KEY="{0}",{1},{2});'.format(self.transfKey, self.path.getCode(asy2psmap), self.pen.getCode())+'\n\n' else: return 'draw(KEY="{0}",{1},{2});'.format(self.transfKey, self.path.getCode(asy2psmap), self.pen.getCode())+'\n\n' def getTransformCode(self, asy2psmap=identity()): transf = self.transfKeymap[self.transfKey][0] if transf == identity(): return '' else: return xasyItem.setKeyFormatStr.format(self.transfKey, transf.getCode(asy2psmap))+'\n' def generateDrawObjects(self, forceUpdate=False): if self.path.containsCurve: self.path.computeControls() transf = self.transfKeymap[self.transfKey][0] newObj = DrawObject(self.path.toQPainterPath(), None, drawOrder=0, transform=transf, pen=self.pen, key=self.transfKey) newObj.originalObj = self newObj.setParent(self) newObj.fill=self.path.fill return [newObj] def __str__(self): """ Create a string describing this shape """ return "xasyShape code:{:s}".format("\n\t".join(self.getCode().splitlines())) def swapFill(self): self.path.fill = not self.path.fill def copy(self): return type(self)(self.path,self._asyengine,self.pen) def arrowify(self,arrowhead=0): newObj = asyArrow(self.path.asyengine, pen=self.pen, transfKey = self.transfKey, transfKeymap = self.transfKeymap, canvas = self.onCanvas, arrowActive = arrowhead, code = self.path.getCode(yflip())) #transform newObj.arrowSettings["fill"] = self.path.fill return newObj class xasyFilledShape(xasyShape): """ A filled shape drawn on the GUI """ """ Purpose: -------- Attributes: ----------- Virtual Methods: ---------------- Static Methods: --------------- Class Methods: -------------- Object Methods: --------------- """ def __init__(self, path, asyengine, pen = None, transform = identity()): """ Initialize this shape with a path, pen, and transform """ if path.nodeSet[-1] != 'cycle': raise Exception("Filled paths must be cyclic") super().__init__(path, asyengine, pen, transform) self.path.fill=True def getObjectCode(self, asy2psmap=identity()): if self.path.fill: return 'fill(KEY="{0}",{1},{2});'.format(self.transfKey, self.path.getCode(asy2psmap), self.pen.getCode())+'\n\n' else: return 'draw(KEY="{0}",{1},{2});'.format(self.transfKey, self.path.getCode(asy2psmap), self.pen.getCode())+'\n\n' def generateDrawObjects(self, forceUpdate = False): if self.path.containsCurve: self.path.computeControls() newObj = DrawObject(self.path.toQPainterPath(), None, drawOrder = 0, transform = self.transfKeymap[self.transfKey][0], pen = self.pen, key = self.transfKey, fill = True) newObj.originalObj = self newObj.setParent(self) newObj.fill=self.path.fill return [newObj] def __str__(self): """ Return a string describing this shape """ return "xasyFilledShape code:{:s}".format("\n\t".join(self.getCode().splitlines())) def swapFill(self): self.path.fill = not self.path.fill class xasyText(xasyItem): """ Text created by the GUI """ """ Purpose: -------- Attributes: ----------- Virtual Methods: ---------------- Static Methods: --------------- Class Methods: -------------- Object Methods: --------------- """ def __init__(self, text, location, asyengine, pen = None, transform = yflip(), key = None, align = None, fontsize:int = None): """ Initialize this item with text, a location, pen, and transform """ super().__init__(asyengine = asyengine) if pen is None: pen = asyPen(asyengine = asyengine) if pen.asyEngine is None: pen.asyEngine = asyengine self.label = asyLabel(text, location, pen, align, fontSize = fontsize) # self.transform = [transform] self.transfKey = key self.transfKeymap = {self.transfKey: [transform]} self.asyfied = False self.onCanvas = None self.pen = pen def setKey(self, newKey = None): transform = self.transfKeymap[self.transfKey][0] self.transfKey = newKey self.transfKeymap = {self.transfKey: [transform]} def getTransformCode(self, asy2psmap = yflip()): transf = self.transfKeymap[self.transfKey][0] if transf == yflip(): # return xasyItem.setKeyAloneFormatStr.format(self.transfKey) return '' else: return xasyItem.setKeyFormatStr.format(self.transfKey, transf.getCode(asy2psmap))+"\n" def getObjectCode(self, asy2psmap = yflip()): return 'label(KEY="{0}",{1});'.format(self.transfKey, self.label.getCode(asy2psmap))+'\n' def generateDrawObjects(self, forceUpdate = False): self.asyfy(forceUpdate) return self.drawObjects def getBoundingBox(self): self.asyfy() return self.imageList[0].bbox def __str__(self): return "xasyText code:{:s}".format("\n\t".join(self.getCode().splitlines())) def copy(self): return type(self)(self.label.text,self.label.location,self._asyengine) class xasyScript(xasyItem): """ A set of images create from asymptote code. It is always deconstructed """ """ Purpose: -------- Attributes: ----------- Virtual Methods: ---------------- Static Methods: --------------- Class Methods: -------------- Object Methods: --------------- """ def __init__(self, canvas, engine, script="", transforms=None, transfKeyMap=None): """ Initialize this script item """ super().__init__(canvas, asyengine=engine) if transfKeyMap is not None: self.transfKeymap = transfKeyMap else: self.transfKeymap = {} self.script = script self.key2imagemap = {} self.namedUnsetKeys = {} self.keyPrefix = '' self.scriptAsyfied = False self.updatedPrefix = True def clearTransform(self): """ Reset the transforms for each of the deconstructed images """ # self.transform = [identity()] * len(self.imageList) keyCount = {} for im in self.imageList: if im.key not in keyCount.keys(): keyCount[im.key] = 1 else: keyCount[im.key] += 1 for key in keyCount: self.transfKeymap[key] = [identity()] * keyCount[key] def getTransformCode(self, asy2psmap=identity()): with io.StringIO() as rawAsyCode: if self.transfKeymap: for key in self.transfKeymap.keys(): val = self.transfKeymap[key] writeval = list(reversed(val)) # need to map all transforms in a list if there is any non-identity # unfortunately, have to check all transformations in the list. while not all((checktransf == identity() and not checktransf.deleted) for checktransf in writeval) and writeval: transf = writeval.pop() if transf.deleted: rawAsyCode.write(xasyItem.setKeyFormatStr.format(key, transf.getCode(asy2psmap))) else: if transf == identity(): rawAsyCode.write(xasyItem.setKeyAloneFormatStr.format(key)) else: rawAsyCode.write(xasyItem.setKeyFormatStr.format(key, transf.getCode(asy2psmap))) rawAsyCode.write('\n') result = rawAsyCode.getvalue() return result def findNonIdKeys(self): return {key for key in self.transfKeymap if not all(not transf.deleted and transf == identity() for transf in self.transfKeymap[key]) } def getObjectCode(self, asy2psmap=identity()): numeric=r'([-+]?(?:(?:\d*\.\d+)|(?:\d+\.?)))' rSize=re.compile(r"size\(\("+numeric+","+numeric+","+numeric+"," +numeric+","+numeric+","+numeric+r"\)\); "+ self.resizeComment) newScript = self.getReplacedKeysCode(self.findNonIdKeys()) with io.StringIO() as rawAsyCode: for line in newScript.splitlines(): if(rSize.match(line)): self.asySize=line.rstrip()+'\n' else: raw_line = line.rstrip().replace('\t', ' ' * 4) rawAsyCode.write(raw_line + '\n') self.updatedCode = rawAsyCode.getvalue() return self.updatedCode def setScript(self, script): """ Sets the content of the script item """ self.script = script self.updateCode() def setKeyPrefix(self, newPrefix=''): self.keyPrefix = newPrefix self.updatedPrefix = False def getReplacedKeysCode(self, key2replace: set=None) -> str: keylist = {} prefix = '' key2replaceSet = self.unsetKeys if key2replace is None else \ self.unsetKeys & key2replace linenum2key = {} if not self.updatedPrefix: prefix = self.keyPrefix for key in key2replaceSet: actualkey = key key = key.split(':')[0] raw_parsed = xu.tryParseKey(key) assert raw_parsed is not None line, col = [int(val) for val in raw_parsed.groups()] if line not in keylist: keylist[line] = set() keylist[line].add(col) linenum2key[(line, col)] = actualkey self.unsetKeys.discard(key) raw_code_lines = self.script.splitlines() with io.StringIO() as raw_str: for i in range(len(raw_code_lines)): curr_str = raw_code_lines[i] if i + 1 in keylist.keys(): # this case, we have a key. with io.StringIO() as raw_line: n=len(curr_str) for j in range(n): raw_line.write(curr_str[j]) if j + 1 in keylist[i + 1]: # at this point, replace keys with xkey sep=',' k=j+1 # assume begingroup is on a single line for now while k < n: c=curr_str[k] if c == ')': sep='' break if not c.isspace(): break ++k raw_line.write('KEY="{0:s}"'.format(linenum2key[(i + 1, j + 1)])+sep) self.userKeys.add(linenum2key[(i + 1, j + 1)]) curr_str = raw_line.getvalue() # else, skip and just write the line. raw_str.write(curr_str + '\n') return raw_str.getvalue() def getUnusedKey(self, oldkey) -> str: baseCounter = 0 newKey = oldkey while newKey in self.userKeys: newKey = oldkey + ':' + str(baseCounter) baseCounter += 1 return newKey def asyfy(self, keyOnly = False): """ Generate the list of images described by this object and adjust the length of the transform list """ super().asyfy() # Id --> Transf --> asyfied --> Transf # Transf should keep the original, raw transformation # but for all new drawn objects - assign Id as transform. if self.scriptAsyfied: return keyCount = {} settedKey = {} for im in self.imageList: if im.key in self.unsetKeys and im.key not in settedKey.keys(): oldkey = im.key self.unsetKeys.remove(im.key) im.key = self.getUnusedKey(im.key) self.unsetKeys.add(im.key) for drawobj in self.drawObjectsMap[oldkey]: drawobj.key = im.key self.drawObjectsMap[im.key] = self.drawObjectsMap[oldkey] self.drawObjectsMap.pop(oldkey) settedKey[oldkey] = im.key elif im.key in settedKey.keys(): im.key = settedKey[im.key] if im.key not in keyCount.keys(): keyCount[im.key] = 1 else: keyCount[im.key] += 1 if im.key not in self.key2imagemap.keys(): self.key2imagemap[im.key] = [im] else: self.key2imagemap[im.key].append(im) for key in keyCount: if key not in self.transfKeymap.keys(): self.transfKeymap[key] = [identity()] * keyCount[key] else: while len(self.transfKeymap[key]) < keyCount[key]: self.transfKeymap[key].append(identity()) # while len(self.transfKeymap[key]) > keyCount[key]: # self.transfKeymap[key].pop() # change of basis for keylist in self.transfKeymap.values(): for i in range(len(keylist)): if keylist[i] != identity(): keylist[i] = self.asy2psmap * keylist[i] * self.asy2psmap.inverted() self.updateCode() self.scriptAsyfied = True def generateDrawObjects(self, forceUpdate=False): self.asyfy(forceUpdate) return self.drawObjects def __str__(self): """ Return a string describing this script """ retVal = "xasyScript\n\tTransforms:\n" for xform in self.transform: retVal += "\t" + str(xform) + "\n" retVal += "\tCode Omitted" return retVal class DrawObject(QtCore.QObject): """ Purpose: -------- The main Python class to draw an object with the help of PyQt graphical library. Every instance of the class is Attributes: ----------- Virtual Methods: ---------------- Static Methods: --------------- Class Methods: -------------- Object Methods: --------------- """ def __init__(self, drawObject, mainCanvas = None, transform = identity(), btmRightanchor = QtCore.QPointF(0, 0), drawOrder = (-1, -1), pen = None, key = None, parentObj = None, fill = False, keyIndex = 0): super().__init__() self.drawObject = drawObject self.mainCanvas = mainCanvas self.pTransform = transform self.baseTransform = transform self.drawOrder = drawOrder self.btmRightAnchor = btmRightanchor self.originalObj = parentObj self.explicitBoundingBox = None self.useCanvasTransformation = False self.key = key self.cachedSvgImg = None self.cachedDPI = None self.maxDPI=0 self.keyIndex = keyIndex self.pen = pen self.fill = fill def getInteriorScrTransform(self, transform): """ Generates the transform with Interior transform applied beforehand """ if isinstance(transform, QtGui.QTransform): transform = asyTransform.fromQTransform(transform) return self.transform * transform * self.baseTransform.inverted() @property def transform(self): return self.pTransform @transform.setter def transform(self, value): self.pTransform = value def setBoundingBoxPs(self, bbox): l, b, r, t = bbox self.explicitBoundingBox = QtCore.QRectF(QtCore.QPointF(l, b), QtCore.QPointF(r, t)) # self.explicitBoundingBox = QtCore.QRectF(0, 0, 100, 100) @property def boundingBox(self): if self.explicitBoundingBox is not None: tempItem = self.baseTransform.toQTransform().mapRect(self.explicitBoundingBox) testBbox = self.getScreenTransform().toQTransform().mapRect(tempItem) elif isinstance(self.drawObject, QtGui.QPainterPath): tempItem = self.baseTransform.toQTransform().map(self.drawObject) testBbox = self.getScreenTransform().toQTransform().map(tempItem).boundingRect() else: raise TypeError('drawObject is not a valid type!') if self.pen is not None: lineWidth = self.pen.width const = lineWidth/2 bl = QtCore.QPointF(-const, const) br = QtCore.QPointF(const, const) tl = QtCore.QPointF(-const, -const) tr = QtCore.QPointF(const, -const) pointList = [testBbox.topLeft(), testBbox.topRight(), testBbox.bottomLeft(), testBbox.bottomRight() ] else: pointList = [testBbox.topLeft(), testBbox.topRight(), testBbox.bottomLeft(), testBbox.bottomRight() ] return QtGui.QPolygonF(pointList).boundingRect() @property def localBoundingBox(self): testBbox = self.drawObject.rect() testBbox.moveTo(self.btmRightAnchor.toPoint()) return testBbox def getScreenTransform(self): scrTransf = self.baseTransform.toQTransform().inverted()[0] * self.pTransform.toQTransform() # print(asyTransform.fromQTransform(scrTransf).t) return asyTransform.fromQTransform(scrTransf) def draw(self, additionalTransformation = None, applyReverse = False, canvas: QtGui.QPainter = None, dpi = 300): if canvas is None: canvas = self.mainCanvas if additionalTransformation is None: additionalTransformation = QtGui.QTransform() assert canvas.isActive() canvas.save() if self.pen: oldPen = QtGui.QPen(canvas.pen()) localPen = self.pen.toQPen() # localPen.setCosmetic(True) canvas.setPen(localPen) #this fixes the object but not the box else: oldPen = QtGui.QPen() if not applyReverse: canvas.setTransform(additionalTransformation, True) canvas.setTransform(self.transform.toQTransform(), True) else: canvas.setTransform(self.transform.toQTransform(), True) canvas.setTransform(additionalTransformation, True) canvas.setTransform(self.baseTransform.toQTransform().inverted()[0], True) if isinstance(self.drawObject, xs.SvgObject): threshold = 1.44 if self.cachedDPI is None or self.cachedSvgImg is None \ or dpi > self.maxDPI*threshold: self.cachedDPI = dpi self.maxDPI=max(self.maxDPI,dpi) self.cachedSvgImg = self.drawObject.render(dpi) canvas.drawImage(self.explicitBoundingBox, self.cachedSvgImg) elif isinstance(self.drawObject, QtSvg.QSvgRenderer): self.drawObject.render(canvas, self.explicitBoundingBox) elif isinstance(self.drawObject, QtGui.QPainterPath): path = self.baseTransform.toQTransform().map(self.drawObject) if self.fill: if self.pen: brush = self.pen.toQPen().brush() else: brush = QtGui.QBrush() canvas.fillPath(path, brush) else: canvas.drawPath(path) if self.pen: canvas.setPen(oldPen) canvas.restore() def collide(self, coords, canvasCoordinates = True): # modify these values to grow/shrink the fuzz. fuzzTolerance = 1 marginGrowth = 1 leftMargin = marginGrowth if self.boundingBox.width() < fuzzTolerance else 0 topMargin = marginGrowth if self.boundingBox.height() < fuzzTolerance else 0 newMargin = QtCore.QMarginsF(leftMargin, topMargin, leftMargin, topMargin) return self.boundingBox.marginsAdded(newMargin).contains(coords) def getID(self): return self.originalObj class asyArrow(xasyItem): def __init__(self, asyengine, pen=None, transform=identity(), transfKey=None, transfKeymap = None, canvas=None, arrowActive=False, code=None): #super().__init__(path=path, engine=asyengine, pen=pen, transform=transform) """Initialize the label with the given test, location, and pen""" #asyObj.__init__(self) super().__init__(canvas=canvas, asyengine=asyengine) #CANVAS? Seems to work. if pen is None: pen = asyPen() if pen.asyEngine is None: pen.asyEngine = asyengine self.pen = pen self.fillPen = asyPen() self.fillPen.asyEngine = asyengine self.code = code #self.path = path #self.path.asyengine = asyengine self.transfKey = transfKey if transfKeymap == None: #Better way? self.transfKeymap = {self.transfKey: [transform]} else: self.transfKeymap = transfKeymap self.location = (0,0) self.asyfied = False self.onCanvas = canvas self.arrowSettings = {"active": arrowActive, "style": 0, "fill": 0} #Rename active? self.arrowList = ["","Arrow","ArcArrow"] #The first setting corresponds to no arrow. self.arrowStyleList = ["","SimpleHead","HookHead","TeXHead"] self.arrowFillList = ["","FillDraw","Fill","NoFill","UnFill","Draw"] def getArrowSettings(self): settings = "(" if self.arrowSettings["style"] != 0: settings += "arrowhead=" settings += self.arrowStyleList[self.arrowSettings["style"]] if "size" in self.arrowSettings: if settings != "(": #This is really messy. settings += "," settings += "size=" + str(self.arrowSettings["size"]) #Should I add options to this? Like for cm? if "angle" in self.arrowSettings: #This is so similar, you should be able to turn this into a function or something. if settings != "(": settings += "," settings += "angle=" + str(self.arrowSettings["angle"]) if self.arrowSettings["fill"] != 0: if settings != "(": settings += "," settings += "filltype=" settings += self.arrowFillList[self.arrowSettings["fill"]] settings += ")" #print(settings) return settings def setKey(self, newKey = None): transform = self.transfKeymap[self.transfKey][0] self.transfKey = newKey self.transfKeymap = {self.transfKey: [transform]} def updateCode(self, asy2psmap = identity()): newLoc = asy2psmap.inverted() * self.location self.asyCode = '' if self.arrowSettings["active"]: if self.arrowSettings["fill"]: self.asyCode += 'begingroup(KEY="{0}");'.format(self.transfKey)+'\n\n' self.asyCode += 'fill({0},{1});'.format(self.code, self.fillPen.getCode())+'\n\n' self.asyCode += 'draw({0},{1},arrow={2}{3});'.format(self.code, self.pen.getCode(), self.arrowList[self.arrowSettings["active"]],self.getArrowSettings())+'\n\n' else: self.asyCode += 'draw(KEY="{0}",{1},{2},arrow={3}{4});'.format(self.transfKey, self.code, self.pen.getCode(), self.arrowList[self.arrowSettings["active"]],self.getArrowSettings())+'\n\n' if self.arrowSettings["fill"]: self.asyCode += 'endgroup();\n\n' else: self.asyCode = 'draw(KEY="{0}",{1},{2});'.format(self.transfKey, self.code, self.pen.getCode())+'\n\n' def setPen(self, pen): """ Set the label's pen """ self.pen = pen self.updateCode() def moveTo(self, newl): """ Translate the label's location """ self.location = newl def getObjectCode(self, asy2psmap=identity()): self.updateCode() return self.asyCode def getTransformCode(self, asy2psmap=identity()): transf = self.transfKeymap[self.transfKey][0] if transf == identity(): return '' else: return xasyItem.setKeyFormatStr.format(self.transfKey, transf.getCode(asy2psmap))+'\n' def generateDrawObjects(self, forceUpdate=False): self.asyfy(forceUpdate) transf = self.transfKeymap[self.transfKey][0] for drawObject in self.drawObjects: drawObject.pTransform = transf return self.drawObjects def __str__(self): """ Create a string describing this shape """ return "xasyShape code:{:s}".format("\n\t".join(self.getCode().splitlines())) def swapFill(self): self.arrowSettings["fill"] = not self.arrowSettings["fill"] def getBoundingBox(self): self.asyfy() return self.imageList[0].bbox def copy(self): #Include all parameters? return type(self)(self._asyengine,pen=self.pen,canvas=self.onCanvas,arrowActive=self.arrowSettings["active"]) asymptote-3.05/GUI/Widg_addLabel.py0000644000000000000000000000630215031566105015627 0ustar rootroot#!/usr/bin/env python3 from xasyqtui.widg_addLabel import Ui_Form import PyQt5.QtWidgets as QtWidgets import PyQt5.QtGui as QtGui import labelEditor import xasyUtils as xu class Widg_addLabel(QtWidgets.QWidget): def __init__(self, info): super().__init__() self.ui = Ui_Form() self.info = info self.ui.setupUi(self) self.setFixedSize(self.size()) if 'alignIndex' not in self.info.keys(): self.info['alignIndex'] = 0 if 'shift_x' not in self.info.keys(): self.info['shift_x'] = None if 'shift_y' not in self.info.keys(): self.info['shift_y'] = None if 'align' not in self.info.keys(): self.info['align'] = (0, 0) if self.info['shift_x'] is not None: self.ui.txtShiftX.setText(str(self.info['shift_x'])) if self.info['shift_y'] is not None: self.ui.txtShiftY.setText(str(self.info['shift_y'])) self.ui.cmbFontSize.setCurrentText(str(self.info['fontSize']) if self.info['fontSize'] is not None else '-') self.ui.cmbAlign.setCurrentIndex(self.info['alignIndex']) validator = QtGui.QDoubleValidator() self.ui.txtShiftX.setValidator(validator) self.ui.txtShiftY.setValidator(validator) self.ui.cmbFontSize.setValidator(validator) self.ui.cmbAlign.currentTextChanged.connect(self.updateCheck) self.ui.cmbAlign.currentIndexChanged.connect(self.cmbIndexUpdate) self.ui.txtShiftX.textEdited.connect(self.shftXUpdate) self.ui.txtShiftY.textEdited.connect(self.shftYUpdate) self.ui.btnAdvancedEdit.clicked.connect(self.btnAdvancedEditClicked) self.ui.cmbFontSize.currentTextChanged.connect(self.cmbFontSizeTextChanged) self.updateCheck(self.ui.cmbAlign.currentText()) def cmbFontSizeTextChanged(self, text: str): tryParseVal = xu.tryParse(text, float) self.info['fontSize'] = tryParseVal def btnAdvancedEditClicked(self): advancedEditDialog = labelEditor.labelEditor(self.ui.txtLabelText.text()) advancedEditDialog.show() result = advancedEditDialog.exec_() if result == QtWidgets.QDialog.Accepted: self.ui.txtLabelText.setText(advancedEditDialog.getText()) @property def labelText(self): return self.ui.txtLabelText.text() def updateCheck(self, a0): self.ui.txtShiftX.setEnabled(a0 == 'Custom') self.ui.txtShiftY.setEnabled(a0 == 'Custom') def shftXUpdate(self, text): if text: self.info['shift_x'] = float(text) self.updateAlign() def shftYUpdate(self, text): if text: self.info['shift_y'] = float(text) self.updateAlign() def updateAlign(self): index = self.ui.cmbAlign.currentIndex() self.info['alignIndex'] = index if self.ui.cmbAlign.currentText() == 'Custom': self.info['align'] = (self.info['shift_x'], self.info['shift_y']) elif self.ui.cmbAlign.currentText() == 'None': self.info['align'] = (0, 0) else: self.info['align'] = self.ui.cmbAlign.currentText() def cmbIndexUpdate(self, index): self.updateAlign() asymptote-3.05/GUI/xasyTransform.py0000644000000000000000000000176715031566105016057 0ustar rootroot#!/usr/bin/env python3 import xasy2asy as xasy2asy import PyQt5.QtGui as QtGui import PyQt5.QtCore as QtCore import numpy as numpy import math class xasyTransform: @classmethod def makeRotTransform(cls, theta, origin): if isinstance(origin, QtCore.QPointF) or isinstance(origin, QtCore.QPoint): origin = (origin.x(), origin.y()) rotMat = (math.cos(theta), -math.sin(theta), math.sin(theta), math.cos(theta)) shift = xasy2asy.asyTransform((0, 0, 1 - rotMat[0], -rotMat[1], -rotMat[2], 1 - rotMat[3])) * origin return xasy2asy.asyTransform((shift[0], shift[1], rotMat[0], rotMat[1], rotMat[2], rotMat[3])) @classmethod def makeScaleTransform(cls, sx, sy, origin): if isinstance(origin, QtCore.QPointF) or isinstance(origin, QtCore.QPoint): origin = (origin.x(), origin.y()) shiftMat = xasy2asy.asyTransform((0, 0, 1 - sx, 0, 0, 1 - sy)) * origin return xasy2asy.asyTransform((shiftMat[0], shiftMat[1], sx, 0, 0, sy)) asymptote-3.05/GUI/xasyicons/0000755000000000000000000000000015031566355014641 5ustar rootrootasymptote-3.05/GUI/xasyicons/icons_rc.py0000644000000000000000000052666015031566355017031 0ustar rootroot# -*- coding: utf-8 -*- # Resource object code # # Created by: The Resource Compiler for PyQt5 (Qt v5.15.17) # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore qt_resource_data = b"\ \x00\x00\x07\x6b\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x3e\x0a\x09\x3c\x70\x61\x74\x68\x20\ \x64\x3d\x22\x4d\x31\x39\x33\x2e\x34\x36\x2c\x32\x34\x39\x2e\x30\ \x35\x36\x63\x33\x2e\x37\x32\x33\x2d\x30\x2e\x36\x37\x2c\x37\x2e\ \x35\x38\x39\x2d\x31\x2e\x30\x34\x31\x2c\x31\x31\x2e\x35\x38\x36\ \x2d\x31\x2e\x30\x34\x31\x4c\x32\x30\x31\x2e\x39\x32\x34\x2c\x32\ \x34\x38\x68\x31\x30\x33\x2e\x38\x32\x33\x63\x34\x2e\x35\x30\x33\ \x2c\x30\x2c\x38\x2e\x38\x30\x36\x2d\x30\x2e\x36\x31\x37\x2c\x31\ \x32\x2e\x39\x30\x38\x2d\x31\x2e\x37\x35\x34\x0a\x09\x09\x63\x31\ \x39\x2e\x33\x37\x2d\x35\x2e\x33\x36\x33\x2c\x33\x33\x2e\x33\x34\ \x35\x2d\x32\x32\x2e\x35\x33\x37\x2c\x33\x33\x2e\x33\x34\x35\x2d\ \x34\x33\x2e\x36\x36\x33\x76\x2d\x33\x30\x2e\x38\x32\x32\x76\x2d\ \x35\x36\x2e\x34\x30\x32\x63\x30\x2d\x32\x34\x2e\x38\x33\x32\x2d\ \x32\x31\x2e\x31\x35\x2d\x34\x33\x2e\x34\x38\x34\x2d\x34\x36\x2e\ \x32\x38\x39\x2d\x34\x37\x2e\x36\x30\x36\x0a\x09\x09\x63\x2d\x31\ \x35\x2e\x39\x33\x31\x2d\x32\x2e\x36\x32\x34\x2d\x33\x39\x2e\x32\ \x35\x38\x2d\x33\x2e\x38\x32\x37\x2d\x35\x35\x2e\x30\x38\x39\x2d\ \x33\x2e\x37\x34\x39\x63\x2d\x31\x35\x2e\x38\x32\x39\x2c\x30\x2e\ \x30\x38\x36\x2d\x33\x30\x2e\x39\x38\x31\x2c\x31\x2e\x34\x30\x34\ \x2d\x34\x34\x2e\x32\x37\x37\x2c\x33\x2e\x37\x34\x39\x43\x31\x36\ \x37\x2e\x31\x34\x33\x2c\x37\x34\x2e\x35\x37\x36\x2c\x31\x36\x30\ \x2c\x38\x38\x2e\x39\x32\x38\x2c\x31\x36\x30\x2c\x31\x31\x35\x2e\ \x33\x35\x39\x56\x31\x34\x34\x68\x39\x36\x0a\x09\x09\x76\x31\x36\ \x48\x31\x32\x38\x2e\x38\x32\x63\x2d\x33\x35\x2e\x36\x32\x38\x2c\ \x30\x2d\x36\x34\x2e\x35\x33\x38\x2c\x34\x32\x2e\x35\x37\x31\x2d\ \x36\x34\x2e\x38\x31\x33\x2c\x39\x35\x2e\x32\x34\x32\x43\x36\x34\ \x2e\x30\x30\x35\x2c\x32\x35\x35\x2e\x34\x39\x35\x2c\x36\x34\x2c\ \x32\x35\x35\x2e\x37\x34\x37\x2c\x36\x34\x2c\x32\x35\x36\x63\x30\ \x2c\x39\x2e\x35\x32\x33\x2c\x30\x2e\x39\x34\x2c\x31\x38\x2e\x37\ \x32\x2c\x32\x2e\x36\x38\x35\x2c\x32\x37\x2e\x34\x30\x34\x0a\x09\ \x09\x43\x37\x34\x2e\x36\x34\x38\x2c\x33\x32\x33\x2e\x30\x37\x2c\ \x39\x39\x2e\x34\x35\x31\x2c\x33\x35\x32\x2c\x31\x32\x38\x2e\x38\ \x32\x2c\x33\x35\x32\x48\x31\x34\x34\x76\x2d\x32\x2e\x36\x36\x32\ \x76\x2d\x34\x33\x2e\x32\x37\x33\x43\x31\x34\x34\x2c\x32\x37\x39\ \x2e\x32\x33\x38\x2c\x31\x36\x34\x2e\x31\x34\x36\x2c\x32\x35\x34\ \x2e\x33\x33\x32\x2c\x31\x39\x33\x2e\x34\x36\x2c\x32\x34\x39\x2e\ \x30\x35\x36\x7a\x20\x4d\x32\x30\x33\x2e\x36\x35\x36\x2c\x31\x32\ \x37\x2e\x30\x30\x32\x0a\x09\x09\x63\x2d\x39\x2e\x35\x39\x32\x2c\ \x30\x2d\x31\x37\x2e\x33\x38\x34\x2d\x37\x2e\x37\x38\x35\x2d\x31\ \x37\x2e\x33\x38\x34\x2d\x31\x37\x2e\x34\x30\x33\x63\x30\x2d\x39\ \x2e\x36\x36\x34\x2c\x37\x2e\x37\x37\x34\x2d\x31\x37\x2e\x35\x32\ \x2c\x31\x37\x2e\x33\x38\x34\x2d\x31\x37\x2e\x35\x32\x63\x39\x2e\ \x35\x37\x34\x2c\x30\x2c\x31\x37\x2e\x33\x39\x39\x2c\x37\x2e\x38\ \x35\x35\x2c\x31\x37\x2e\x33\x39\x39\x2c\x31\x37\x2e\x35\x32\x0a\ \x09\x09\x43\x32\x32\x31\x2e\x30\x35\x36\x2c\x31\x31\x39\x2e\x32\ \x31\x37\x2c\x32\x31\x33\x2e\x32\x34\x36\x2c\x31\x32\x37\x2e\x30\ \x30\x32\x2c\x32\x30\x33\x2e\x36\x35\x36\x2c\x31\x32\x37\x2e\x30\ \x30\x32\x7a\x22\x2f\x3e\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\ \x22\x4d\x34\x34\x33\x2e\x39\x35\x31\x2c\x32\x32\x32\x2e\x35\x34\ \x33\x43\x34\x33\x34\x2e\x37\x38\x2c\x31\x38\x36\x2e\x30\x32\x31\ \x2c\x34\x31\x31\x2e\x30\x33\x33\x2c\x31\x36\x30\x2c\x33\x38\x33\ \x2e\x31\x38\x2c\x31\x36\x30\x48\x33\x36\x38\x76\x32\x2e\x36\x32\ \x36\x76\x33\x38\x2e\x30\x34\x36\x63\x30\x2c\x33\x33\x2e\x39\x31\ \x35\x2d\x32\x32\x2e\x32\x38\x36\x2c\x35\x38\x2e\x34\x37\x34\x2d\ \x34\x39\x2e\x34\x38\x39\x2c\x36\x32\x2e\x36\x38\x31\x0a\x09\x09\ \x63\x2d\x32\x2e\x37\x33\x37\x2c\x30\x2e\x34\x32\x34\x2d\x35\x2e\ \x34\x38\x33\x2c\x30\x2e\x36\x34\x36\x2d\x38\x2e\x33\x30\x31\x2c\ \x30\x2e\x36\x34\x36\x48\x32\x30\x36\x2e\x33\x35\x31\x63\x2d\x34\ \x2e\x35\x31\x38\x2c\x30\x2d\x38\x2e\x39\x30\x34\x2c\x30\x2e\x35\ \x38\x34\x2d\x31\x33\x2e\x30\x34\x39\x2c\x31\x2e\x36\x37\x32\x43\ \x31\x37\x34\x2e\x31\x38\x2c\x32\x37\x30\x2e\x36\x38\x39\x2c\x31\ \x36\x30\x2c\x32\x38\x36\x2e\x36\x2c\x31\x36\x30\x2c\x33\x30\x37\ \x2e\x32\x33\x36\x76\x33\x32\x2e\x39\x32\x32\x0a\x09\x09\x76\x35\ \x34\x2e\x33\x30\x35\x63\x30\x2c\x32\x34\x2e\x38\x33\x32\x2c\x32\ \x34\x2e\x39\x37\x37\x2c\x33\x39\x2e\x34\x32\x36\x2c\x34\x39\x2e\ \x34\x38\x31\x2c\x34\x36\x2e\x35\x35\x31\x63\x32\x39\x2e\x33\x32\ \x37\x2c\x38\x2e\x35\x33\x31\x2c\x36\x31\x2e\x32\x36\x37\x2c\x31\ \x30\x2e\x30\x36\x38\x2c\x39\x36\x2e\x33\x36\x36\x2c\x30\x43\x33\ \x32\x39\x2e\x31\x35\x2c\x34\x33\x34\x2e\x33\x35\x34\x2c\x33\x35\ \x32\x2c\x34\x32\x30\x2e\x38\x39\x33\x2c\x33\x35\x32\x2c\x33\x39\ \x34\x2e\x34\x36\x33\x56\x33\x36\x38\x0a\x09\x09\x68\x2d\x39\x36\ \x76\x2d\x31\x36\x68\x31\x32\x37\x2e\x31\x38\x63\x32\x35\x2e\x32\ \x34\x2c\x30\x2c\x34\x37\x2e\x31\x30\x37\x2d\x32\x31\x2e\x33\x36\ \x35\x2c\x35\x37\x2e\x38\x31\x34\x2d\x35\x32\x2e\x35\x34\x39\x43\ \x34\x34\x35\x2e\x34\x37\x34\x2c\x32\x38\x36\x2e\x34\x30\x34\x2c\ \x34\x34\x38\x2c\x32\x37\x31\x2e\x36\x34\x31\x2c\x34\x34\x38\x2c\ \x32\x35\x36\x0a\x09\x09\x43\x34\x34\x38\x2c\x32\x34\x34\x2e\x32\ \x33\x32\x2c\x34\x34\x36\x2e\x35\x36\x37\x2c\x32\x33\x32\x2e\x39\ \x36\x32\x2c\x34\x34\x33\x2e\x39\x35\x31\x2c\x32\x32\x32\x2e\x35\ \x34\x33\x7a\x20\x4d\x33\x30\x37\x2e\x38\x36\x37\x2c\x33\x38\x32\ \x2e\x38\x32\x63\x39\x2e\x35\x39\x2c\x30\x2c\x31\x37\x2e\x33\x38\ \x31\x2c\x37\x2e\x37\x38\x35\x2c\x31\x37\x2e\x33\x38\x31\x2c\x31\ \x37\x2e\x34\x0a\x09\x09\x63\x30\x2c\x39\x2e\x36\x35\x2d\x37\x2e\ \x37\x39\x31\x2c\x31\x37\x2e\x35\x32\x31\x2d\x31\x37\x2e\x33\x38\ \x31\x2c\x31\x37\x2e\x35\x32\x31\x63\x2d\x39\x2e\x35\x37\x37\x2c\ \x30\x2d\x31\x37\x2e\x33\x39\x39\x2d\x37\x2e\x38\x37\x31\x2d\x31\ \x37\x2e\x33\x39\x39\x2d\x31\x37\x2e\x35\x32\x31\x43\x32\x39\x30\ \x2e\x34\x36\x38\x2c\x33\x39\x30\x2e\x35\x39\x2c\x32\x39\x38\x2e\ \x32\x37\x34\x2c\x33\x38\x32\x2e\x38\x32\x2c\x33\x30\x37\x2e\x38\ \x36\x37\x2c\x33\x38\x32\x2e\x38\x32\x7a\x22\x2f\x3e\x0a\x3c\x2f\ \x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x05\x9c\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\ \x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\ \x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\ \x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\ \x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\ \x31\x31\x2e\x31\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\ \x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x78\x6d\x6c\x6e\ \x73\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\ \x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\x20\x78\ \x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\x74\x70\ \x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ \x39\x39\x2f\x78\x6c\x69\x6e\x6b\x27\x20\x77\x69\x64\x74\x68\x3d\ \x27\x36\x33\x2e\x39\x39\x39\x36\x70\x74\x27\x20\x68\x65\x69\x67\ \x68\x74\x3d\x27\x36\x34\x70\x74\x27\x20\x76\x69\x65\x77\x42\x6f\ \x78\x3d\x27\x35\x36\x2e\x34\x30\x39\x34\x20\x31\x31\x37\x2e\x38\ \x35\x38\x20\x36\x33\x2e\x39\x39\x39\x36\x20\x36\x34\x27\x3e\x0a\ \x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\x3e\x0a\x3c\ \x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\ \x6e\x73\x6c\x61\x74\x65\x28\x35\x36\x2e\x34\x30\x39\x34\x20\x31\ \x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\ \x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\ \x27\x4d\x20\x35\x34\x2e\x38\x39\x32\x36\x20\x32\x34\x2e\x35\x32\ \x39\x31\x43\x20\x35\x34\x2e\x38\x39\x32\x36\x20\x32\x30\x2e\x33\ \x33\x36\x38\x20\x34\x34\x2e\x36\x39\x36\x39\x20\x31\x36\x2e\x39\ \x33\x38\x33\x20\x33\x32\x2e\x31\x32\x20\x31\x36\x2e\x39\x33\x38\ \x33\x43\x20\x31\x39\x2e\x35\x34\x33\x31\x20\x31\x36\x2e\x39\x33\ \x38\x33\x20\x39\x2e\x33\x34\x37\x34\x32\x20\x32\x30\x2e\x33\x33\ \x36\x38\x20\x39\x2e\x33\x34\x37\x34\x32\x20\x32\x34\x2e\x35\x32\ \x39\x31\x43\x20\x39\x2e\x33\x34\x37\x34\x32\x20\x32\x38\x2e\x37\ \x32\x31\x35\x20\x31\x39\x2e\x35\x34\x33\x31\x20\x33\x32\x2e\x31\ \x32\x20\x33\x32\x2e\x31\x32\x20\x33\x32\x2e\x31\x32\x43\x20\x34\ \x34\x2e\x36\x39\x36\x39\x20\x33\x32\x2e\x31\x32\x20\x35\x34\x2e\ \x38\x39\x32\x36\x20\x32\x38\x2e\x37\x32\x31\x35\x20\x35\x34\x2e\ \x38\x39\x32\x36\x20\x32\x34\x2e\x35\x32\x39\x31\x5a\x27\x20\x66\ \x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\ \x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\ \x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\ \x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\ \x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\ \x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\ \x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\ \x64\x74\x68\x3d\x27\x33\x2e\x35\x31\x33\x31\x32\x27\x2f\x3e\x0a\ \x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\ \x6d\x3d\x27\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x35\x36\x2e\ \x34\x30\x39\x34\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\ \x6c\x65\x28\x2e\x39\x39\x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x70\ \x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x39\x2e\x33\x34\x37\x34\x32\ \x20\x32\x34\x2e\x35\x32\x39\x31\x4c\x20\x39\x2e\x33\x34\x37\x34\ \x32\x20\x35\x34\x2e\x38\x39\x32\x36\x4c\x20\x39\x2e\x33\x34\x37\ \x34\x32\x20\x35\x34\x2e\x38\x39\x32\x36\x43\x20\x39\x2e\x33\x34\ \x37\x34\x32\x20\x35\x34\x2e\x38\x39\x32\x36\x20\x39\x2e\x33\x34\ \x37\x34\x32\x20\x35\x34\x2e\x38\x39\x32\x36\x20\x39\x2e\x33\x34\ \x37\x34\x32\x20\x35\x34\x2e\x38\x39\x32\x36\x43\x20\x39\x2e\x33\ \x34\x37\x34\x32\x20\x35\x39\x2e\x30\x38\x34\x39\x20\x31\x39\x2e\ \x35\x34\x33\x31\x20\x36\x32\x2e\x34\x38\x33\x34\x20\x33\x32\x2e\ \x31\x32\x20\x36\x32\x2e\x34\x38\x33\x34\x43\x20\x34\x34\x2e\x36\ \x39\x36\x39\x20\x36\x32\x2e\x34\x38\x33\x34\x20\x35\x34\x2e\x38\ \x39\x32\x36\x20\x35\x39\x2e\x30\x38\x34\x39\x20\x35\x34\x2e\x38\ \x39\x32\x36\x20\x35\x34\x2e\x38\x39\x32\x36\x4c\x20\x35\x34\x2e\ \x38\x39\x32\x36\x20\x35\x34\x2e\x38\x39\x32\x36\x4c\x20\x35\x34\ \x2e\x38\x39\x32\x36\x20\x32\x34\x2e\x35\x32\x39\x31\x27\x20\x66\ \x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\ \x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\ \x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\ \x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\ \x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\ \x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\ \x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\ \x64\x74\x68\x3d\x27\x33\x2e\x35\x31\x33\x31\x32\x27\x2f\x3e\x0a\ \x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\ \x6d\x3d\x27\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x35\x36\x2e\ \x34\x30\x39\x34\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\ \x6c\x65\x28\x2e\x39\x39\x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x70\ \x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x35\x34\x2e\x38\x39\x32\x36\ \x20\x32\x34\x2e\x35\x32\x39\x31\x43\x20\x35\x34\x2e\x38\x39\x32\ \x36\x20\x31\x31\x2e\x39\x35\x32\x32\x20\x34\x34\x2e\x36\x39\x36\ \x39\x20\x31\x2e\x37\x35\x36\x35\x36\x20\x33\x32\x2e\x31\x32\x20\ \x31\x2e\x37\x35\x36\x35\x36\x43\x20\x31\x39\x2e\x35\x34\x33\x31\ \x20\x31\x2e\x37\x35\x36\x35\x36\x20\x39\x2e\x33\x34\x37\x34\x32\ \x20\x31\x31\x2e\x39\x35\x32\x32\x20\x39\x2e\x33\x34\x37\x34\x32\ \x20\x32\x34\x2e\x35\x32\x39\x31\x27\x20\x66\x69\x6c\x6c\x3d\x27\ \x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\ \x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\ \x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\ \x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\ \x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\ \x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\ \x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\ \x33\x2e\x35\x31\x33\x31\x32\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\ \x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\ \x00\x00\x02\x72\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x22\x49\x63\x6f\x6e\ \x5f\x38\x5f\x22\x3e\x0a\x09\x3c\x67\x3e\x0a\x09\x09\x3c\x70\x61\ \x74\x68\x20\x64\x3d\x22\x4d\x34\x32\x37\x2c\x32\x33\x34\x2e\x36\ \x32\x35\x48\x31\x36\x37\x2e\x32\x39\x36\x6c\x31\x31\x39\x2e\x37\ \x30\x32\x2d\x31\x31\x39\x2e\x37\x30\x32\x4c\x32\x35\x36\x2c\x38\ \x35\x4c\x38\x35\x2c\x32\x35\x36\x6c\x31\x37\x31\x2c\x31\x37\x31\ \x6c\x32\x39\x2e\x39\x32\x32\x2d\x32\x39\x2e\x39\x32\x34\x4c\x31\ \x36\x37\x2e\x32\x39\x36\x2c\x32\x37\x37\x2e\x33\x37\x35\x48\x34\ \x32\x37\x56\x32\x33\x34\x2e\x36\x32\x35\x7a\x22\x2f\x3e\x0a\x09\ \x3c\x2f\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\ \x0a\ \x00\x00\x03\x1b\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x3e\x0a\x09\x3c\x70\x61\x74\x68\x20\ \x64\x3d\x22\x4d\x32\x35\x36\x2c\x33\x38\x38\x63\x2d\x37\x32\x2e\ \x35\x39\x37\x2c\x30\x2d\x31\x33\x32\x2d\x35\x39\x2e\x34\x30\x35\ \x2d\x31\x33\x32\x2d\x31\x33\x32\x63\x30\x2d\x37\x32\x2e\x36\x30\ \x31\x2c\x35\x39\x2e\x34\x30\x33\x2d\x31\x33\x32\x2c\x31\x33\x32\ \x2d\x31\x33\x32\x63\x33\x36\x2e\x33\x2c\x30\x2c\x36\x39\x2e\x32\ \x39\x39\x2c\x31\x35\x2e\x34\x2c\x39\x32\x2e\x34\x30\x36\x2c\x33\ \x39\x2e\x36\x30\x31\x4c\x32\x37\x38\x2c\x32\x33\x34\x68\x31\x35\ \x34\x56\x38\x30\x0a\x09\x09\x6c\x2d\x35\x31\x2e\x36\x39\x38\x2c\ \x35\x31\x2e\x37\x30\x32\x43\x33\x34\x38\x2e\x34\x30\x36\x2c\x39\ \x39\x2e\x37\x39\x38\x2c\x33\x30\x34\x2e\x34\x30\x36\x2c\x38\x30\ \x2c\x32\x35\x36\x2c\x38\x30\x63\x2d\x39\x36\x2e\x37\x39\x37\x2c\ \x30\x2d\x31\x37\x36\x2c\x37\x39\x2e\x32\x30\x33\x2d\x31\x37\x36\ \x2c\x31\x37\x36\x73\x37\x38\x2e\x30\x39\x34\x2c\x31\x37\x36\x2c\ \x31\x37\x36\x2c\x31\x37\x36\x0a\x09\x09\x63\x38\x31\x2e\x30\x34\ \x35\x2c\x30\x2c\x31\x34\x38\x2e\x32\x38\x37\x2d\x35\x34\x2e\x31\ \x33\x34\x2c\x31\x36\x39\x2e\x34\x30\x31\x2d\x31\x32\x38\x48\x33\ \x37\x38\x2e\x38\x35\x43\x33\x36\x30\x2e\x31\x30\x35\x2c\x33\x35\ \x33\x2e\x35\x36\x31\x2c\x33\x31\x31\x2e\x37\x31\x32\x2c\x33\x38\ \x38\x2c\x32\x35\x36\x2c\x33\x38\x38\x7a\x22\x2f\x3e\x0a\x3c\x2f\ \x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x03\xe8\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x43\ \x68\x65\x76\x72\x6f\x6e\x5f\x63\x69\x72\x63\x6c\x65\x64\x5f\x6c\ \x65\x66\x74\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\ \x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\ \x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\ \x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\ \x6b\x22\x0a\x09\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\x22\ \x30\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\ \x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x32\x34\x20\x30\x20\x30\ \x20\x32\x34\x20\x30\x20\x30\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\ \x20\x64\x3d\x22\x4d\x31\x31\x2e\x33\x30\x32\x2c\x36\x2e\x37\x37\ \x36\x63\x2d\x30\x2e\x31\x39\x36\x2d\x30\x2e\x31\x39\x37\x2d\x30\ \x2e\x35\x31\x35\x2d\x30\x2e\x31\x39\x37\x2d\x30\x2e\x37\x31\x2c\ \x30\x4c\x37\x2e\x37\x38\x35\x2c\x39\x2e\x36\x34\x31\x63\x2d\x30\ \x2e\x31\x39\x36\x2c\x30\x2e\x31\x39\x39\x2d\x30\x2e\x31\x39\x36\ \x2c\x30\x2e\x35\x32\x2c\x30\x2c\x30\x2e\x37\x31\x37\x6c\x32\x2e\ \x38\x30\x37\x2c\x32\x2e\x38\x36\x34\x0a\x09\x63\x30\x2e\x31\x39\ \x35\x2c\x30\x2e\x31\x39\x39\x2c\x30\x2e\x35\x31\x34\x2c\x30\x2e\ \x31\x39\x38\x2c\x30\x2e\x37\x31\x2c\x30\x63\x30\x2e\x31\x39\x36\ \x2d\x30\x2e\x31\x39\x37\x2c\x30\x2e\x31\x39\x36\x2d\x30\x2e\x35\ \x31\x38\x2c\x30\x2d\x30\x2e\x37\x31\x37\x4c\x39\x2c\x31\x30\x6c\ \x32\x2e\x33\x30\x32\x2d\x32\x2e\x35\x30\x36\x43\x31\x31\x2e\x34\ \x39\x38\x2c\x37\x2e\x32\x39\x36\x2c\x31\x31\x2e\x34\x39\x38\x2c\ \x36\x2e\x39\x37\x36\x2c\x31\x31\x2e\x33\x30\x32\x2c\x36\x2e\x37\ \x37\x36\x7a\x0a\x09\x20\x4d\x31\x30\x2c\x30\x2e\x34\x63\x2d\x35\ \x2e\x33\x30\x32\x2c\x30\x2d\x39\x2e\x36\x2c\x34\x2e\x32\x39\x38\ \x2d\x39\x2e\x36\x2c\x39\x2e\x36\x63\x30\x2c\x35\x2e\x33\x30\x33\ \x2c\x34\x2e\x32\x39\x38\x2c\x39\x2e\x36\x2c\x39\x2e\x36\x2c\x39\ \x2e\x36\x73\x39\x2e\x36\x2d\x34\x2e\x32\x39\x37\x2c\x39\x2e\x36\ \x2d\x39\x2e\x36\x43\x31\x39\x2e\x36\x2c\x34\x2e\x36\x39\x38\x2c\ \x31\x35\x2e\x33\x30\x32\x2c\x30\x2e\x34\x2c\x31\x30\x2c\x30\x2e\ \x34\x7a\x20\x4d\x31\x30\x2c\x31\x38\x2e\x33\x35\x34\x0a\x09\x63\ \x2d\x34\x2e\x36\x31\x35\x2c\x30\x2d\x38\x2e\x33\x35\x34\x2d\x33\ \x2e\x37\x34\x2d\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\ \x30\x2d\x34\x2e\x36\x31\x34\x2c\x33\x2e\x37\x33\x39\x2d\x38\x2e\ \x33\x35\x34\x2c\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\ \x34\x2e\x36\x31\x33\x2c\x30\x2c\x38\x2e\x33\x35\x34\x2c\x33\x2e\ \x37\x34\x2c\x38\x2e\x33\x35\x34\x2c\x38\x2e\x33\x35\x34\x0a\x09\ \x43\x31\x38\x2e\x33\x35\x34\x2c\x31\x34\x2e\x36\x31\x34\x2c\x31\ \x34\x2e\x36\x31\x33\x2c\x31\x38\x2e\x33\x35\x34\x2c\x31\x30\x2c\ \x31\x38\x2e\x33\x35\x34\x7a\x22\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\ \x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x02\x1f\ \x00\ \x00\x07\x5c\x78\x9c\xdd\x53\x3d\x6f\xdb\x30\x10\xdd\xfd\x2b\xae\ \xc8\xc0\x64\xf0\x89\x5f\xa2\xc4\xc0\x74\x80\x1a\xe8\x94\x6e\xc9\ \xd2\x4d\xb6\x68\x99\x8d\x2c\x19\x92\x2a\xb9\xff\xbe\x88\x2d\xd2\ \xae\xda\xa0\x4b\x86\x22\x1a\x08\xbd\x77\x7a\xa7\x7b\x77\xbc\xc5\ \xc3\x71\x5f\x42\x6f\x9b\xd6\xd5\x95\x21\x0c\x29\x01\x5b\x6d\xea\ \xdc\x55\x85\x21\xcf\x4f\x5f\xe6\x29\x79\x58\xce\x16\x9f\xe6\x73\ \x78\xda\xb9\x16\xb6\xae\xb4\x30\x64\x2d\x14\xb6\xb2\x4d\xd6\xd9\ \x1c\xd6\x3f\x21\xef\x5d\xdb\x17\x7b\xe0\xc8\x18\x32\x98\xcf\x97\ \xb3\x45\xdb\x17\xd7\x89\x19\x81\xe3\xbe\xac\x5a\x43\x76\x5d\x77\ \xb8\x8f\xa2\x61\x18\x70\x10\x58\x37\x45\xc4\x29\xa5\x51\xdb\x17\ \xe3\x27\xf7\xc7\xd2\x55\x2f\x7f\xfb\x90\x69\xad\xa3\x53\x94\xc0\ \xe0\xf2\x6e\x67\x88\x12\xa8\xb5\x56\x87\x8e\xc0\xce\xba\x62\xd7\ \x19\xa2\xe4\x2b\xea\x9d\x1d\x3e\xd7\x47\x43\x62\x85\x92\x6a\x09\ \x8c\x25\x98\xc6\x29\x8c\x0a\x50\x92\x2c\x67\x8b\x02\x5c\x6e\xc8\ \x21\x2b\x2c\x3b\xc3\xae\xc9\xaa\x76\x5b\x37\x7b\x43\x4e\xaf\x65\ \xd6\xd9\xdb\x49\x8e\xbb\x76\x93\x95\xf6\x16\xb5\x56\x5c\xc9\xbb\ \x57\xe1\x21\xeb\x76\x90\x1b\xf2\x15\x34\x0a\x99\x48\x0e\x92\x63\ \x22\x13\xfe\x18\x88\x58\x62\xaa\xb9\xfa\x83\x58\x4d\x89\x7f\xe1\ \x2b\x81\x46\x9a\x4a\x0d\x4c\x63\x2c\x05\x03\xc5\x51\xa6\x42\x82\ \xe0\xc8\xb8\x47\x2b\x90\x12\x95\x56\x3a\x84\x7d\x5e\x2f\x0f\xd8\ \x57\xf8\x26\x11\x4c\x79\x42\x50\x54\x94\xa5\xab\x40\xf0\x53\xab\ \xe2\xf0\x4f\x2e\x90\x32\x36\x56\x74\x06\xab\x50\xef\x18\xf4\x76\ \xbc\xd6\xe3\x31\xf9\xe3\xb4\xa7\xdf\xc8\xeb\x45\x2c\x0d\xb9\x59\ \x6f\xd7\xdb\xed\x96\x44\xcb\xd9\x22\x2a\xde\x67\x7e\xc1\x88\xc4\ \x98\x6b\x76\xe5\x8c\xa2\x10\x2a\x0d\xce\x98\x42\x2d\x52\x31\x5a\ \x1b\xd1\xc5\x9b\x0f\x07\x73\xa3\x3c\x60\x9f\x3f\x10\x29\x26\x9c\ \xc5\x21\xc1\x39\xef\xd5\x79\x19\xe4\x99\x0c\x85\x8d\xc2\x49\xe5\ \xa1\x4b\x55\x5d\x59\x02\x6d\xd7\xd4\x2f\xd6\x90\x1b\x7a\x7a\x3c\ \x31\x2f\x5d\x65\x37\xd9\xc1\x90\xa6\xfe\x51\xe5\xbf\xd1\xdf\x6b\ \x57\x4d\xf9\xbd\xeb\x6c\x53\xba\xbd\xeb\x0c\x61\x14\xa9\x48\xe2\ \x10\x1b\x77\x52\x60\xcc\x04\xe3\xef\x3a\x95\x49\xd7\x3e\xd6\x56\ \x8d\xa6\x3e\xd2\xbc\xde\xdc\x22\xc6\x50\xc7\x9c\x5f\xb6\x08\x93\ \x58\xc5\xca\x6f\xd1\x19\x5d\x6d\xd1\x18\xf6\xb3\xf1\xf2\xc9\x7d\ \xf8\x6f\x5a\x77\x3e\xda\xbe\x58\xfe\x02\xb3\x30\xdb\xa9\ \x00\x00\x03\x2a\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x3e\x0a\x09\x3c\x70\x6f\x6c\x79\x67\ \x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\x22\x33\x39\x36\x2e\x37\ \x39\x35\x2c\x33\x39\x36\x2e\x38\x20\x33\x32\x30\x2c\x33\x39\x36\ \x2e\x38\x20\x33\x32\x30\x2c\x34\x34\x38\x20\x34\x34\x38\x2c\x34\ \x34\x38\x20\x34\x34\x38\x2c\x33\x32\x30\x20\x33\x39\x36\x2e\x37\ \x39\x35\x2c\x33\x32\x30\x20\x09\x22\x2f\x3e\x0a\x09\x3c\x70\x6f\ \x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\x22\x33\x39\ \x36\x2e\x38\x2c\x31\x31\x35\x2e\x32\x30\x35\x20\x33\x39\x36\x2e\ \x38\x2c\x31\x39\x32\x20\x34\x34\x38\x2c\x31\x39\x32\x20\x34\x34\ \x38\x2c\x36\x34\x20\x33\x32\x30\x2c\x36\x34\x20\x33\x32\x30\x2c\ \x31\x31\x35\x2e\x32\x30\x35\x20\x09\x22\x2f\x3e\x0a\x09\x3c\x70\ \x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\x22\x31\ \x31\x35\x2e\x32\x30\x35\x2c\x31\x31\x35\x2e\x32\x20\x31\x39\x32\ \x2c\x31\x31\x35\x2e\x32\x20\x31\x39\x32\x2c\x36\x34\x20\x36\x34\ \x2c\x36\x34\x20\x36\x34\x2c\x31\x39\x32\x20\x31\x31\x35\x2e\x32\ \x30\x35\x2c\x31\x39\x32\x20\x09\x22\x2f\x3e\x0a\x09\x3c\x70\x6f\ \x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\x22\x31\x31\ \x35\x2e\x32\x2c\x33\x39\x36\x2e\x37\x39\x35\x20\x31\x31\x35\x2e\ \x32\x2c\x33\x32\x30\x20\x36\x34\x2c\x33\x32\x30\x20\x36\x34\x2c\ \x34\x34\x38\x20\x31\x39\x32\x2c\x34\x34\x38\x20\x31\x39\x32\x2c\ \x33\x39\x36\x2e\x37\x39\x35\x20\x09\x22\x2f\x3e\x0a\x3c\x2f\x67\ \x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x04\x17\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x69\x73\x6f\ \x2d\x38\x38\x35\x39\x2d\x31\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\ \x47\x65\x6e\x65\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\ \x20\x49\x6c\x6c\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x39\x2e\ \x30\x2e\x30\x2c\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\ \x50\x6c\x75\x67\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\ \x72\x73\x69\x6f\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\ \x64\x20\x30\x29\x20\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\ \x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\ \x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\ \x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\ \x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\ \x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\ \x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\ \x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\ \x79\x3d\x22\x30\x70\x78\x22\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\ \x78\x3d\x22\x30\x20\x30\x20\x34\x32\x33\x2e\x37\x35\x34\x20\x34\ \x32\x33\x2e\x37\x35\x34\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x65\ \x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\ \x3a\x6e\x65\x77\x20\x30\x20\x30\x20\x34\x32\x33\x2e\x37\x35\x34\ \x20\x34\x32\x33\x2e\x37\x35\x34\x3b\x22\x20\x78\x6d\x6c\x3a\x73\ \x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\ \x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x33\x35\x34\x2e\x32\ \x34\x2c\x34\x37\x2e\x34\x6c\x33\x39\x2e\x38\x37\x39\x2d\x33\x39\ \x2e\x38\x37\x39\x48\x32\x37\x32\x2e\x31\x39\x36\x76\x31\x32\x31\ \x2e\x39\x32\x34\x6c\x36\x30\x2e\x38\x30\x31\x2d\x36\x30\x2e\x38\ \x30\x31\x63\x35\x36\x2c\x35\x30\x2e\x30\x36\x36\x2c\x37\x37\x2e\ \x32\x35\x31\x2c\x31\x33\x32\x2e\x30\x30\x34\x2c\x34\x36\x2e\x39\ \x31\x38\x2c\x32\x30\x35\x2e\x32\x33\x35\x0a\x09\x63\x2d\x31\x38\ \x2e\x35\x38\x35\x2c\x34\x34\x2e\x38\x36\x39\x2d\x35\x33\x2e\x35\ \x33\x31\x2c\x37\x39\x2e\x38\x31\x35\x2d\x39\x38\x2e\x34\x2c\x39\ \x38\x2e\x34\x63\x2d\x34\x34\x2e\x38\x36\x36\x2c\x31\x38\x2e\x35\ \x38\x35\x2d\x39\x34\x2e\x32\x38\x38\x2c\x31\x38\x2e\x35\x38\x35\ \x2d\x31\x33\x39\x2e\x31\x35\x38\x2c\x30\x63\x2d\x34\x34\x2e\x38\ \x36\x39\x2d\x31\x38\x2e\x35\x38\x35\x2d\x37\x39\x2e\x38\x31\x35\ \x2d\x35\x33\x2e\x35\x33\x31\x2d\x39\x38\x2e\x34\x2d\x39\x38\x2e\ \x34\x0a\x09\x63\x2d\x31\x38\x2e\x35\x38\x35\x2d\x34\x34\x2e\x38\ \x36\x39\x2d\x31\x38\x2e\x35\x38\x35\x2d\x39\x34\x2e\x32\x39\x2c\ \x30\x2d\x31\x33\x39\x2e\x31\x35\x39\x6c\x2d\x32\x37\x2e\x37\x31\ \x37\x2d\x31\x31\x2e\x34\x38\x63\x2d\x32\x31\x2e\x36\x35\x31\x2c\ \x35\x32\x2e\x32\x37\x32\x2d\x32\x31\x2e\x36\x35\x31\x2c\x31\x30\ \x39\x2e\x38\x34\x38\x2c\x30\x2c\x31\x36\x32\x2e\x31\x32\x0a\x09\ \x63\x32\x31\x2e\x36\x35\x32\x2c\x35\x32\x2e\x32\x37\x32\x2c\x36\ \x32\x2e\x33\x36\x34\x2c\x39\x32\x2e\x39\x38\x34\x2c\x31\x31\x34\ \x2e\x36\x33\x37\x2c\x31\x31\x34\x2e\x36\x33\x36\x63\x32\x36\x2e\ \x31\x34\x2c\x31\x30\x2e\x38\x32\x37\x2c\x35\x33\x2e\x35\x39\x35\ \x2c\x31\x36\x2e\x32\x34\x2c\x38\x31\x2e\x30\x36\x2c\x31\x36\x2e\ \x32\x33\x39\x63\x32\x37\x2e\x34\x35\x39\x2d\x30\x2e\x30\x30\x31\ \x2c\x35\x34\x2e\x39\x32\x37\x2d\x35\x2e\x34\x31\x34\x2c\x38\x31\ \x2e\x30\x36\x31\x2d\x31\x36\x2e\x32\x33\x39\x0a\x09\x63\x35\x32\ \x2e\x32\x37\x31\x2d\x32\x31\x2e\x36\x35\x32\x2c\x39\x32\x2e\x39\ \x38\x33\x2d\x36\x32\x2e\x33\x36\x34\x2c\x31\x31\x34\x2e\x36\x33\ \x36\x2d\x31\x31\x34\x2e\x36\x33\x36\x43\x34\x34\x32\x2e\x37\x33\ \x39\x2c\x32\x30\x30\x2e\x36\x2c\x34\x31\x38\x2e\x35\x33\x32\x2c\ \x31\x30\x35\x2e\x38\x32\x36\x2c\x33\x35\x34\x2e\x32\x34\x2c\x34\ \x37\x2e\x34\x7a\x22\x2f\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\ \x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\ \x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\ \x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\ \x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\ \x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\ \x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\ \x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\ \x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\ \x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x04\xa3\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\ \x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\ \x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\ \x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\ \x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\ \x31\x31\x2e\x31\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\ \x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x78\x6d\x6c\x6e\ \x73\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\ \x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\x20\x78\ \x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\x74\x70\ \x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ \x39\x39\x2f\x78\x6c\x69\x6e\x6b\x27\x20\x77\x69\x64\x74\x68\x3d\ \x27\x36\x34\x2e\x30\x30\x30\x31\x70\x74\x27\x20\x68\x65\x69\x67\ \x68\x74\x3d\x27\x36\x34\x70\x74\x27\x20\x76\x69\x65\x77\x42\x6f\ \x78\x3d\x27\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\ \x35\x38\x20\x36\x34\x2e\x30\x30\x30\x31\x20\x36\x34\x27\x3e\x0a\ \x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\x3e\x0a\x3c\ \x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\ \x6e\x73\x6c\x61\x74\x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\ \x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\ \x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\ \x27\x4d\x20\x36\x2e\x30\x32\x32\x35\x20\x33\x32\x2e\x31\x32\x43\ \x20\x34\x2e\x33\x35\x34\x33\x38\x20\x32\x34\x2e\x39\x32\x38\x37\ \x20\x38\x2e\x34\x33\x32\x31\x37\x20\x31\x38\x2e\x30\x30\x31\x34\ \x20\x31\x33\x2e\x39\x36\x38\x37\x20\x31\x32\x2e\x39\x33\x36\x31\ \x43\x20\x33\x31\x2e\x37\x33\x33\x39\x20\x2d\x33\x2e\x33\x31\x36\ \x37\x35\x20\x35\x37\x2e\x32\x39\x34\x33\x20\x33\x2e\x35\x39\x37\ \x39\x37\x20\x35\x38\x2e\x32\x31\x37\x35\x20\x32\x31\x2e\x37\x33\ \x37\x38\x43\x20\x35\x38\x2e\x36\x37\x38\x38\x20\x33\x30\x2e\x38\ \x30\x31\x39\x20\x35\x31\x2e\x31\x37\x38\x33\x20\x33\x37\x2e\x36\ \x34\x34\x31\x20\x34\x32\x2e\x37\x34\x34\x35\x20\x34\x31\x2e\x37\ \x31\x31\x39\x43\x20\x32\x37\x2e\x34\x36\x34\x36\x20\x34\x39\x2e\ \x30\x38\x31\x38\x20\x39\x2e\x32\x36\x34\x35\x31\x20\x34\x36\x2e\ \x30\x39\x36\x34\x20\x36\x2e\x30\x32\x32\x35\x20\x33\x32\x2e\x31\ \x32\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\ \x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\ \x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\ \x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\ \x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\ \x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\ \x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\ \x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x32\x2e\x35\x30\x39\x33\ \x37\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\ \x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\x6e\x73\x6c\x61\x74\ \x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\ \x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\x36\x32\x36\x34\x29\ \x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x36\ \x2e\x30\x32\x32\x35\x27\x20\x63\x79\x3d\x27\x33\x32\x2e\x31\x32\ \x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x66\x66\x30\x30\x30\x30\x27\ \x20\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\ \x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\ \x27\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x35\x38\x2e\x34\x36\ \x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\ \x28\x2e\x39\x39\x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x63\x69\x72\ \x63\x6c\x65\x20\x63\x78\x3d\x27\x31\x33\x2e\x39\x36\x38\x37\x27\ \x20\x63\x79\x3d\x27\x31\x32\x2e\x39\x33\x36\x31\x27\x20\x66\x69\ \x6c\x6c\x3d\x27\x23\x66\x66\x30\x30\x30\x30\x27\x20\x72\x3d\x27\ \x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\ \x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\ \x6e\x73\x6c\x61\x74\x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\ \x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\ \x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\ \x63\x78\x3d\x27\x35\x38\x2e\x32\x31\x37\x35\x27\x20\x63\x79\x3d\ \x27\x32\x31\x2e\x37\x33\x37\x38\x27\x20\x66\x69\x6c\x6c\x3d\x27\ \x23\x66\x66\x30\x30\x30\x30\x27\x20\x72\x3d\x27\x36\x2e\x30\x32\ \x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\ \x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\x6e\x73\x6c\x61\ \x74\x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\ \x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\x36\x32\x36\x34\ \x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\ \x34\x32\x2e\x37\x34\x34\x35\x27\x20\x63\x79\x3d\x27\x34\x31\x2e\ \x37\x31\x31\x39\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x66\x66\x30\ \x30\x30\x30\x27\x20\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\ \x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\ \x67\x3e\ \x00\x00\x04\x73\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\ \x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\ \x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\ \x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\ \x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\ \x31\x31\x2e\x31\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\ \x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x78\x6d\x6c\x6e\ \x73\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\ \x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\x20\x78\ \x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\x74\x70\ \x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ \x39\x39\x2f\x78\x6c\x69\x6e\x6b\x27\x20\x77\x69\x64\x74\x68\x3d\ \x27\x36\x34\x2e\x30\x30\x30\x31\x70\x74\x27\x20\x68\x65\x69\x67\ \x68\x74\x3d\x27\x36\x34\x70\x74\x27\x20\x76\x69\x65\x77\x42\x6f\ \x78\x3d\x27\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\ \x35\x38\x20\x36\x34\x2e\x30\x30\x30\x31\x20\x36\x34\x27\x3e\x0a\ \x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\x3e\x0a\x3c\ \x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\ \x6e\x73\x6c\x61\x74\x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\ \x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\ \x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\ \x27\x4d\x20\x36\x2e\x30\x32\x32\x35\x20\x33\x32\x2e\x31\x32\x43\ \x20\x36\x2e\x32\x32\x30\x37\x32\x20\x32\x34\x2e\x39\x36\x35\x35\ \x20\x39\x2e\x30\x34\x39\x38\x39\x20\x31\x38\x2e\x31\x33\x35\x33\ \x20\x31\x33\x2e\x39\x36\x38\x37\x20\x31\x32\x2e\x39\x33\x36\x31\ \x43\x20\x32\x39\x2e\x35\x30\x36\x32\x20\x2d\x33\x2e\x34\x38\x36\ \x38\x36\x20\x35\x35\x2e\x33\x36\x37\x33\x20\x32\x2e\x36\x39\x39\ \x35\x20\x35\x38\x2e\x32\x31\x37\x35\x20\x32\x31\x2e\x37\x33\x37\ \x38\x43\x20\x35\x39\x2e\x36\x39\x32\x32\x20\x33\x31\x2e\x35\x38\ \x38\x31\x20\x35\x32\x2e\x36\x35\x30\x38\x20\x34\x30\x2e\x36\x37\ \x37\x39\x20\x34\x32\x2e\x37\x34\x34\x35\x20\x34\x31\x2e\x37\x31\ \x31\x39\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\ \x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\ \x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\ \x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\ \x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\ \x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\ \x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\ \x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x32\x2e\x35\x30\x39\x33\ \x37\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\ \x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\x6e\x73\x6c\x61\x74\ \x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\ \x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\x36\x32\x36\x34\x29\ \x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x36\ \x2e\x30\x32\x32\x35\x27\x20\x63\x79\x3d\x27\x33\x32\x2e\x31\x32\ \x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x66\x66\x30\x30\x30\x30\x27\ \x20\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\ \x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\ \x27\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x35\x38\x2e\x34\x36\ \x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\ \x28\x2e\x39\x39\x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x63\x69\x72\ \x63\x6c\x65\x20\x63\x78\x3d\x27\x31\x33\x2e\x39\x36\x38\x37\x27\ \x20\x63\x79\x3d\x27\x31\x32\x2e\x39\x33\x36\x31\x27\x20\x66\x69\ \x6c\x6c\x3d\x27\x23\x66\x66\x30\x30\x30\x30\x27\x20\x72\x3d\x27\ \x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\ \x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\ \x6e\x73\x6c\x61\x74\x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\ \x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\ \x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\ \x63\x78\x3d\x27\x35\x38\x2e\x32\x31\x37\x35\x27\x20\x63\x79\x3d\ \x27\x32\x31\x2e\x37\x33\x37\x38\x27\x20\x66\x69\x6c\x6c\x3d\x27\ \x23\x66\x66\x30\x30\x30\x30\x27\x20\x72\x3d\x27\x36\x2e\x30\x32\ \x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\ \x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\x6e\x73\x6c\x61\ \x74\x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\ \x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\x36\x32\x36\x34\ \x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\ \x34\x32\x2e\x37\x34\x34\x35\x27\x20\x63\x79\x3d\x27\x34\x31\x2e\ \x37\x31\x31\x39\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x66\x66\x30\ \x30\x30\x30\x27\x20\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\ \x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\ \x67\x3e\ \x00\x00\x04\x9c\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x43\ \x6f\x64\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\ \x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\ \x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\ \x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\ \x6b\x22\x20\x78\x3d\x22\x32\x34\x70\x78\x22\x20\x79\x3d\x22\x32\ \x34\x70\x78\x22\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\ \x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\ \x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\ \x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\ \x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\ \x65\x72\x76\x65\x22\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\ \x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x32\x34\x20\x30\ \x20\x30\x20\x32\x34\x20\x30\x20\x30\x29\x27\x3e\x3c\x70\x61\x74\ \x68\x20\x64\x3d\x22\x4d\x35\x2e\x37\x31\x39\x2c\x31\x34\x2e\x37\ \x35\x63\x2d\x30\x2e\x32\x33\x36\x2c\x30\x2d\x30\x2e\x34\x37\x34\ \x2d\x30\x2e\x30\x38\x33\x2d\x30\x2e\x36\x36\x34\x2d\x30\x2e\x32\ \x35\x32\x4c\x2d\x30\x2e\x30\x30\x35\x2c\x31\x30\x6c\x35\x2e\x33\ \x34\x31\x2d\x34\x2e\x37\x34\x38\x43\x35\x2e\x37\x34\x38\x2c\x34\ \x2e\x38\x38\x37\x2c\x36\x2e\x33\x38\x2c\x34\x2e\x39\x32\x32\x2c\ \x36\x2e\x37\x34\x37\x2c\x35\x2e\x33\x33\x35\x0a\x09\x63\x30\x2e\ \x33\x36\x37\x2c\x30\x2e\x34\x31\x33\x2c\x30\x2e\x33\x33\x2c\x31\ \x2e\x30\x34\x35\x2d\x30\x2e\x30\x38\x33\x2c\x31\x2e\x34\x31\x32\ \x4c\x33\x2e\x30\x30\x35\x2c\x31\x30\x6c\x33\x2e\x33\x37\x38\x2c\ \x33\x2e\x30\x30\x32\x63\x30\x2e\x34\x31\x33\x2c\x30\x2e\x33\x36\ \x37\x2c\x30\x2e\x34\x35\x2c\x30\x2e\x39\x39\x39\x2c\x30\x2e\x30\ \x38\x33\x2c\x31\x2e\x34\x31\x32\x0a\x09\x43\x36\x2e\x32\x36\x39\ \x2c\x31\x34\x2e\x36\x33\x37\x2c\x35\x2e\x39\x39\x34\x2c\x31\x34\ \x2e\x37\x35\x2c\x35\x2e\x37\x31\x39\x2c\x31\x34\x2e\x37\x35\x7a\ \x20\x4d\x31\x34\x2e\x36\x36\x34\x2c\x31\x34\x2e\x37\x34\x38\x4c\ \x32\x30\x2e\x30\x30\x35\x2c\x31\x30\x6c\x2d\x35\x2e\x30\x36\x2d\ \x34\x2e\x34\x39\x38\x63\x2d\x30\x2e\x34\x31\x33\x2d\x30\x2e\x33\ \x36\x37\x2d\x31\x2e\x30\x34\x35\x2d\x30\x2e\x33\x33\x2d\x31\x2e\ \x34\x31\x31\x2c\x30\x2e\x30\x38\x33\x0a\x09\x63\x2d\x30\x2e\x33\ \x36\x37\x2c\x30\x2e\x34\x31\x33\x2d\x30\x2e\x33\x33\x2c\x31\x2e\ \x30\x34\x35\x2c\x30\x2e\x30\x38\x33\x2c\x31\x2e\x34\x31\x32\x4c\ \x31\x36\x2e\x39\x39\x35\x2c\x31\x30\x6c\x2d\x33\x2e\x36\x35\x39\ \x2c\x33\x2e\x32\x35\x32\x63\x2d\x30\x2e\x34\x31\x33\x2c\x30\x2e\ \x33\x36\x37\x2d\x30\x2e\x34\x35\x2c\x30\x2e\x39\x39\x39\x2d\x30\ \x2e\x30\x38\x33\x2c\x31\x2e\x34\x31\x32\x43\x31\x33\x2e\x34\x35\ \x2c\x31\x34\x2e\x38\x38\x37\x2c\x31\x33\x2e\x37\x32\x35\x2c\x31\ \x35\x2c\x31\x34\x2c\x31\x35\x0a\x09\x43\x31\x34\x2e\x32\x33\x36\ \x2c\x31\x35\x2c\x31\x34\x2e\x34\x37\x34\x2c\x31\x34\x2e\x39\x31\ \x37\x2c\x31\x34\x2e\x36\x36\x34\x2c\x31\x34\x2e\x37\x34\x38\x7a\ \x20\x4d\x39\x2e\x39\x38\x36\x2c\x31\x36\x2e\x31\x36\x35\x6c\x32\ \x2d\x31\x32\x63\x30\x2e\x30\x39\x31\x2d\x30\x2e\x35\x34\x35\x2d\ \x30\x2e\x32\x37\x37\x2d\x31\x2e\x30\x36\x2d\x30\x2e\x38\x32\x32\ \x2d\x31\x2e\x31\x35\x31\x0a\x09\x63\x2d\x30\x2e\x35\x34\x37\x2d\ \x30\x2e\x30\x39\x32\x2d\x31\x2e\x30\x36\x31\x2c\x30\x2e\x32\x37\ \x37\x2d\x31\x2e\x31\x35\x2c\x30\x2e\x38\x32\x32\x6c\x2d\x32\x2c\ \x31\x32\x63\x2d\x30\x2e\x30\x39\x31\x2c\x30\x2e\x35\x34\x35\x2c\ \x30\x2e\x32\x37\x37\x2c\x31\x2e\x30\x36\x2c\x30\x2e\x38\x32\x32\ \x2c\x31\x2e\x31\x35\x31\x43\x38\x2e\x38\x39\x32\x2c\x31\x36\x2e\ \x39\x39\x36\x2c\x38\x2e\x39\x34\x36\x2c\x31\x37\x2c\x39\x2e\x30\ \x30\x31\x2c\x31\x37\x0a\x09\x43\x39\x2e\x34\x38\x31\x2c\x31\x37\ \x2c\x39\x2e\x39\x30\x35\x2c\x31\x36\x2e\x36\x35\x33\x2c\x39\x2e\ \x39\x38\x36\x2c\x31\x36\x2e\x31\x36\x35\x7a\x22\x2f\x3e\x0a\x3c\ \x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x02\xc1\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\x74\x79\x6c\x65\ \x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\ \x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\ \x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\ \x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0a\x3c\x70\x6f\x6c\ \x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\x22\x34\x38\x30\ \x2c\x32\x35\x36\x20\x33\x38\x34\x2c\x31\x36\x30\x20\x33\x38\x34\ \x2c\x32\x33\x36\x20\x32\x37\x36\x2c\x32\x33\x36\x20\x32\x37\x36\ \x2c\x31\x32\x38\x20\x33\x35\x32\x2c\x31\x32\x38\x20\x32\x35\x36\ \x2c\x33\x32\x20\x31\x36\x30\x2c\x31\x32\x38\x20\x32\x33\x36\x2c\ \x31\x32\x38\x20\x32\x33\x36\x2c\x32\x33\x36\x20\x31\x32\x38\x2c\ \x32\x33\x36\x20\x31\x32\x38\x2c\x31\x36\x30\x20\x33\x32\x2c\x32\ \x35\x36\x20\x31\x32\x38\x2c\x33\x35\x32\x20\x0a\x09\x31\x32\x38\ \x2c\x32\x37\x36\x20\x32\x33\x36\x2c\x32\x37\x36\x20\x32\x33\x36\ \x2c\x33\x38\x34\x20\x31\x36\x30\x2c\x33\x38\x34\x20\x32\x35\x36\ \x2c\x34\x38\x30\x20\x33\x35\x32\x2c\x33\x38\x34\x20\x32\x37\x35\ \x2e\x38\x2c\x33\x38\x34\x20\x32\x37\x35\x2e\x34\x2c\x32\x37\x35\ \x2e\x35\x20\x33\x38\x34\x2c\x32\x37\x35\x2e\x38\x20\x33\x38\x34\ \x2c\x33\x35\x32\x20\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \ \x00\x00\x04\xca\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x39\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x09\x20\x69\x64\x3d\ \x22\x73\x76\x67\x34\x36\x31\x39\x22\x20\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x39\x31\ \x2b\x64\x65\x76\x65\x6c\x2b\x6f\x73\x78\x6d\x65\x6e\x75\x20\x72\ \x31\x32\x39\x31\x31\x22\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\ \x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x74\x72\x69\x61\x6e\x67\x6c\ \x65\x2d\x73\x74\x72\x6f\x6b\x65\x64\x2d\x31\x35\x2e\x73\x76\x67\ \x22\x20\x78\x6d\x6c\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\ \x3a\x2f\x2f\x63\x72\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\ \x6e\x73\x2e\x6f\x72\x67\x2f\x6e\x73\x23\x22\x20\x78\x6d\x6c\x6e\ \x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\ \x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\ \x73\x2f\x31\x2e\x31\x2f\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x69\x6e\ \x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\ \x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\x6e\x6b\x73\x63\ \x61\x70\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\ \x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\ \x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\ \x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\x22\x20\x78\x6d\x6c\ \x6e\x73\x3a\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\x68\x74\x74\ \x70\x3a\x2f\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\x73\x6f\x75\ \x72\x63\x65\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\x44\x54\x44\ \x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\x74\x64\x22\ \x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\x68\x74\x74\x70\ \x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\ \x30\x30\x2f\x73\x76\x67\x22\x0a\x09\x20\x78\x6d\x6c\x6e\x73\x3d\ \x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\ \x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\ \x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\ \x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\ \x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\ \x79\x3d\x22\x30\x70\x78\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\ \x34\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x34\x70\ \x78\x22\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x31\x35\x20\x31\x35\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\ \x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\ \x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\x31\x35\x20\x31\x35\x3b\ \x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\ \x73\x65\x72\x76\x65\x22\x3e\x0a\x3c\x70\x61\x74\x68\x20\x69\x64\ \x3d\x22\x72\x65\x63\x74\x33\x33\x33\x38\x22\x20\x69\x6e\x6b\x73\ \x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\ \x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x20\x73\x6f\x64\ \x69\x70\x6f\x64\x69\x3a\x6e\x6f\x64\x65\x74\x79\x70\x65\x73\x3d\ \x22\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x22\x20\x64\ \x3d\x22\x4d\x37\x2e\x35\x32\x34\x33\x2c\x31\x2e\x35\x30\x30\x34\ \x0a\x09\x43\x37\x2e\x32\x34\x32\x39\x2c\x31\x2e\x34\x39\x31\x33\ \x2c\x36\x2e\x39\x37\x38\x37\x2c\x31\x2e\x36\x34\x32\x33\x2c\x36\ \x2e\x38\x33\x33\x36\x2c\x31\x2e\x38\x39\x35\x32\x6c\x2d\x35\x2e\ \x35\x2c\x39\x2e\x38\x36\x39\x32\x43\x31\x2e\x30\x32\x31\x38\x2c\ \x31\x32\x2e\x33\x30\x37\x38\x2c\x31\x2e\x33\x39\x35\x2c\x31\x32\ \x2e\x39\x39\x39\x39\x2c\x32\x2c\x31\x33\x68\x31\x31\x0a\x09\x63\ \x30\x2e\x36\x30\x35\x2d\x30\x2e\x30\x30\x30\x31\x2c\x30\x2e\x39\ \x37\x38\x32\x2d\x30\x2e\x36\x39\x32\x32\x2c\x30\x2e\x36\x36\x36\ \x34\x2d\x31\x2e\x32\x33\x35\x35\x6c\x2d\x35\x2e\x35\x2d\x39\x2e\ \x38\x36\x39\x32\x43\x38\x2e\x30\x33\x30\x32\x2c\x31\x2e\x36\x35\ \x37\x39\x2c\x37\x2e\x37\x38\x38\x34\x2c\x31\x2e\x35\x30\x39\x32\ \x2c\x37\x2e\x35\x32\x34\x33\x2c\x31\x2e\x35\x30\x30\x34\x7a\x20\ \x4d\x37\x2e\x35\x2c\x33\x2e\x38\x39\x39\x33\x6c\x34\x2e\x31\x32\ \x36\x37\x2c\x37\x2e\x34\x37\x30\x34\x0a\x09\x48\x33\x2e\x33\x37\ \x33\x33\x4c\x37\x2e\x35\x2c\x33\x2e\x38\x39\x39\x33\x7a\x22\x2f\ \x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x05\xbb\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\ \x35\x30\x2e\x36\x37\x39\x2c\x32\x37\x33\x2e\x35\x63\x2d\x31\x34\ \x2e\x35\x38\x35\x2d\x31\x34\x2e\x35\x37\x37\x2d\x33\x36\x2e\x30\ \x35\x34\x2d\x31\x35\x2e\x38\x39\x2d\x35\x30\x2e\x36\x33\x39\x2d\ \x31\x2e\x33\x31\x32\x6c\x2d\x34\x31\x2e\x36\x38\x37\x2c\x34\x31\ \x2e\x36\x36\x34\x63\x2d\x31\x30\x2e\x38\x35\x32\x2c\x31\x30\x2e\ \x38\x33\x36\x2d\x32\x33\x2e\x39\x33\x2c\x31\x30\x2e\x38\x35\x39\ \x2d\x33\x31\x2e\x35\x36\x34\x2c\x31\x2e\x38\x35\x32\x0a\x09\x63\ \x2d\x35\x2e\x30\x35\x37\x2d\x35\x2e\x39\x36\x38\x2d\x33\x2e\x30\ \x36\x31\x2d\x32\x34\x2e\x33\x37\x34\x2d\x31\x2e\x36\x34\x34\x2d\ \x33\x36\x2e\x30\x34\x39\x6c\x32\x30\x2e\x39\x30\x37\x2d\x31\x37\ \x31\x2e\x38\x34\x39\x63\x31\x2e\x38\x36\x37\x2d\x31\x35\x2e\x33\ \x35\x33\x2d\x39\x2e\x30\x37\x2d\x33\x30\x2e\x31\x38\x35\x2d\x32\ \x34\x2e\x34\x33\x2d\x33\x32\x2e\x30\x35\x31\x0a\x09\x63\x2d\x31\ \x35\x2e\x33\x35\x38\x2d\x31\x2e\x38\x36\x37\x2d\x32\x39\x2e\x33\ \x32\x32\x2c\x39\x2e\x39\x33\x39\x2d\x33\x31\x2e\x31\x39\x31\x2c\ \x32\x35\x2e\x32\x38\x39\x4c\x32\x36\x37\x2e\x33\x37\x2c\x32\x33\ \x36\x2e\x30\x32\x31\x63\x2d\x31\x2e\x32\x30\x35\x2c\x33\x2e\x33\ \x35\x38\x2d\x33\x2e\x37\x39\x2c\x33\x2e\x39\x33\x38\x2d\x34\x2e\ \x30\x38\x31\x2d\x30\x2e\x35\x38\x32\x4c\x32\x35\x35\x2e\x34\x34\ \x2c\x36\x30\x0a\x09\x63\x30\x2d\x31\x35\x2e\x34\x36\x35\x2d\x31\ \x32\x2e\x35\x34\x32\x2d\x32\x38\x2d\x32\x38\x2e\x30\x31\x34\x2d\ \x32\x38\x63\x2d\x31\x35\x2e\x34\x37\x33\x2c\x30\x2d\x32\x38\x2e\ \x30\x31\x35\x2c\x31\x32\x2e\x35\x33\x35\x2d\x32\x38\x2e\x30\x31\ \x35\x2c\x32\x38\x6c\x2d\x30\x2e\x35\x35\x32\x2c\x31\x37\x36\x2e\ \x37\x35\x32\x63\x30\x2e\x31\x34\x36\x2c\x32\x2e\x30\x34\x2d\x31\ \x2e\x36\x30\x34\x2c\x32\x2e\x36\x32\x34\x2d\x31\x2e\x39\x32\x2c\ \x30\x2e\x32\x39\x34\x4c\x31\x37\x32\x2e\x30\x31\x36\x2c\x39\x39\ \x2e\x30\x37\x37\x0a\x09\x63\x2d\x32\x2e\x37\x35\x2d\x31\x35\x2e\ \x32\x31\x39\x2d\x31\x37\x2e\x33\x32\x33\x2d\x32\x36\x2e\x32\x30\ \x33\x2d\x33\x32\x2e\x35\x34\x38\x2d\x32\x33\x2e\x34\x35\x33\x63\ \x2d\x31\x35\x2e\x32\x32\x37\x2c\x32\x2e\x37\x34\x38\x2d\x32\x35\ \x2e\x33\x33\x39\x2c\x31\x38\x2e\x31\x38\x37\x2d\x32\x32\x2e\x35\ \x39\x31\x2c\x33\x33\x2e\x34\x30\x33\x6c\x32\x32\x2e\x31\x39\x33\ \x2c\x31\x36\x31\x2e\x34\x35\x35\x0a\x09\x63\x30\x2e\x30\x32\x33\ \x2c\x32\x2e\x38\x37\x32\x2d\x30\x2e\x39\x34\x31\x2c\x34\x2e\x35\ \x31\x33\x2d\x32\x2e\x33\x30\x38\x2c\x30\x2e\x38\x33\x31\x6c\x2d\ \x33\x33\x2e\x31\x30\x39\x2d\x38\x38\x2e\x35\x31\x37\x63\x2d\x35\ \x2e\x31\x38\x2d\x31\x34\x2e\x35\x37\x32\x2d\x32\x31\x2e\x31\x39\ \x36\x2d\x32\x33\x2e\x30\x36\x35\x2d\x33\x35\x2e\x37\x37\x36\x2d\ \x31\x37\x2e\x38\x38\x39\x0a\x09\x63\x2d\x31\x34\x2e\x35\x37\x39\ \x2c\x35\x2e\x31\x37\x37\x2d\x32\x32\x2e\x32\x30\x31\x2c\x32\x32\ \x2e\x30\x36\x31\x2d\x31\x37\x2e\x30\x32\x33\x2c\x33\x36\x2e\x36\ \x33\x31\x6c\x35\x38\x2e\x30\x34\x32\x2c\x31\x38\x39\x2e\x36\x32\ \x35\x63\x30\x2e\x33\x30\x33\x2c\x31\x2e\x30\x34\x36\x2c\x30\x2e\ \x36\x32\x34\x2c\x32\x2e\x30\x38\x35\x2c\x30\x2e\x39\x35\x33\x2c\ \x33\x2e\x31\x31\x38\x6c\x30\x2e\x31\x32\x31\x2c\x30\x2e\x33\x39\ \x0a\x09\x63\x30\x2e\x30\x31\x31\x2c\x30\x2e\x30\x33\x31\x2c\x30\ \x2e\x30\x32\x35\x2c\x30\x2e\x30\x35\x38\x2c\x30\x2e\x30\x33\x35\ \x2c\x30\x2e\x30\x38\x38\x43\x31\x32\x36\x2e\x30\x37\x39\x2c\x34\ \x34\x34\x2e\x32\x33\x33\x2c\x31\x37\x32\x2e\x35\x37\x2c\x34\x38\ \x30\x2c\x32\x32\x37\x2e\x34\x32\x37\x2c\x34\x38\x30\x63\x33\x35\ \x2e\x31\x31\x36\x2c\x30\x2c\x37\x31\x2e\x35\x39\x31\x2d\x31\x32\ \x2e\x33\x37\x38\x2c\x39\x39\x2e\x33\x35\x37\x2d\x33\x33\x2e\x36\ \x37\x32\x0a\x09\x63\x30\x2e\x30\x30\x31\x2c\x30\x2c\x30\x2e\x30\ \x30\x33\x2d\x30\x2e\x30\x30\x32\x2c\x30\x2e\x30\x30\x33\x2d\x30\ \x2e\x30\x30\x32\x63\x32\x39\x2e\x39\x39\x2d\x31\x38\x2e\x30\x35\ \x31\x2c\x31\x32\x36\x2e\x30\x37\x31\x2d\x31\x32\x31\x2e\x33\x34\ \x37\x2c\x31\x32\x36\x2e\x30\x37\x31\x2d\x31\x32\x31\x2e\x33\x34\ \x37\x43\x34\x36\x37\x2e\x34\x34\x35\x2c\x33\x31\x30\x2e\x34\x30\ \x32\x2c\x34\x36\x35\x2e\x32\x36\x36\x2c\x32\x38\x38\x2e\x30\x38\ \x2c\x34\x35\x30\x2e\x36\x37\x39\x2c\x32\x37\x33\x2e\x35\x7a\x22\ \x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x03\xd9\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x43\ \x68\x65\x76\x72\x6f\x6e\x5f\x63\x69\x72\x63\x6c\x65\x64\x5f\x72\ \x69\x67\x68\x74\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\ \x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\ \x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x78\ \x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\ \x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\ \x6e\x6b\x22\x0a\x09\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\ \x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\ \x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\ \x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\ \x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\ \x72\x76\x65\x22\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\ \x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x32\x34\x20\x30\x20\ \x30\x20\x32\x34\x20\x30\x20\x30\x29\x27\x3e\x0a\x3c\x70\x61\x74\ \x68\x20\x64\x3d\x22\x4d\x31\x31\x2c\x31\x30\x4c\x38\x2e\x36\x39\ \x38\x2c\x37\x2e\x34\x39\x34\x63\x2d\x30\x2e\x31\x39\x36\x2d\x30\ \x2e\x31\x39\x38\x2d\x30\x2e\x31\x39\x36\x2d\x30\x2e\x35\x31\x39\ \x2c\x30\x2d\x30\x2e\x37\x31\x38\x63\x30\x2e\x31\x39\x36\x2d\x30\ \x2e\x31\x39\x37\x2c\x30\x2e\x35\x31\x35\x2d\x30\x2e\x31\x39\x37\ \x2c\x30\x2e\x37\x31\x2c\x30\x6c\x32\x2e\x38\x30\x37\x2c\x32\x2e\ \x38\x36\x34\x0a\x09\x63\x30\x2e\x31\x39\x36\x2c\x30\x2e\x31\x39\ \x39\x2c\x30\x2e\x31\x39\x36\x2c\x30\x2e\x35\x32\x2c\x30\x2c\x30\ \x2e\x37\x31\x37\x6c\x2d\x32\x2e\x38\x30\x37\x2c\x32\x2e\x38\x36\ \x34\x63\x2d\x30\x2e\x31\x39\x35\x2c\x30\x2e\x31\x39\x39\x2d\x30\ \x2e\x35\x31\x34\x2c\x30\x2e\x31\x39\x38\x2d\x30\x2e\x37\x31\x2c\ \x30\x63\x2d\x30\x2e\x31\x39\x36\x2d\x30\x2e\x31\x39\x37\x2d\x30\ \x2e\x31\x39\x36\x2d\x30\x2e\x35\x31\x38\x2c\x30\x2d\x30\x2e\x37\ \x31\x37\x4c\x31\x31\x2c\x31\x30\x7a\x20\x4d\x31\x30\x2c\x30\x2e\ \x34\x0a\x09\x63\x35\x2e\x33\x30\x32\x2c\x30\x2c\x39\x2e\x36\x2c\ \x34\x2e\x32\x39\x38\x2c\x39\x2e\x36\x2c\x39\x2e\x36\x63\x30\x2c\ \x35\x2e\x33\x30\x33\x2d\x34\x2e\x32\x39\x38\x2c\x39\x2e\x36\x2d\ \x39\x2e\x36\x2c\x39\x2e\x36\x53\x30\x2e\x34\x2c\x31\x35\x2e\x33\ \x30\x33\x2c\x30\x2e\x34\x2c\x31\x30\x43\x30\x2e\x34\x2c\x34\x2e\ \x36\x39\x38\x2c\x34\x2e\x36\x39\x38\x2c\x30\x2e\x34\x2c\x31\x30\ \x2c\x30\x2e\x34\x7a\x20\x4d\x31\x30\x2c\x31\x38\x2e\x33\x35\x34\ \x0a\x09\x63\x34\x2e\x36\x31\x33\x2c\x30\x2c\x38\x2e\x33\x35\x34\ \x2d\x33\x2e\x37\x34\x2c\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\ \x34\x63\x30\x2d\x34\x2e\x36\x31\x34\x2d\x33\x2e\x37\x34\x31\x2d\ \x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\ \x34\x63\x2d\x34\x2e\x36\x31\x35\x2c\x30\x2d\x38\x2e\x33\x35\x34\ \x2c\x33\x2e\x37\x34\x2d\x38\x2e\x33\x35\x34\x2c\x38\x2e\x33\x35\ \x34\x0a\x09\x43\x31\x2e\x36\x34\x35\x2c\x31\x34\x2e\x36\x31\x34\ \x2c\x35\x2e\x33\x38\x35\x2c\x31\x38\x2e\x33\x35\x34\x2c\x31\x30\ \x2c\x31\x38\x2e\x33\x35\x34\x7a\x22\x2f\x3e\x0a\x3c\x2f\x67\x3e\ \x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x04\x13\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\ \x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\ \x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\ \x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\ \x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\ \x31\x31\x2e\x31\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\ \x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x78\x6d\x6c\x6e\ \x73\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\ \x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\x20\x78\ \x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\x74\x70\ \x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ \x39\x39\x2f\x78\x6c\x69\x6e\x6b\x27\x20\x77\x69\x64\x74\x68\x3d\ \x27\x36\x34\x2e\x30\x30\x30\x31\x70\x74\x27\x20\x68\x65\x69\x67\ \x68\x74\x3d\x27\x36\x34\x70\x74\x27\x20\x76\x69\x65\x77\x42\x6f\ \x78\x3d\x27\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\ \x35\x38\x20\x36\x34\x2e\x30\x30\x30\x31\x20\x36\x34\x27\x3e\x0a\ \x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\x3e\x0a\x3c\ \x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\ \x6e\x73\x6c\x61\x74\x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\ \x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\ \x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\ \x27\x4d\x20\x36\x2e\x30\x32\x32\x35\x20\x33\x32\x2e\x31\x32\x4c\ \x20\x31\x33\x2e\x39\x36\x38\x37\x20\x31\x32\x2e\x39\x33\x36\x31\ \x4c\x20\x35\x38\x2e\x32\x31\x37\x35\x20\x32\x31\x2e\x37\x33\x37\ \x38\x4c\x20\x34\x32\x2e\x37\x34\x34\x35\x20\x34\x31\x2e\x37\x31\ \x31\x39\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\ \x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\ \x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\ \x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\ \x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\ \x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\ \x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\ \x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x32\x2e\x35\x30\x39\x33\ \x37\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\ \x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\x6e\x73\x6c\x61\x74\ \x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\ \x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\x36\x32\x36\x34\x29\ \x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x36\ \x2e\x30\x32\x32\x35\x27\x20\x63\x79\x3d\x27\x33\x32\x2e\x31\x32\ \x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x66\x66\x30\x30\x30\x30\x27\ \x20\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\ \x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\ \x27\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x35\x38\x2e\x34\x36\ \x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\ \x28\x2e\x39\x39\x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x63\x69\x72\ \x63\x6c\x65\x20\x63\x78\x3d\x27\x31\x33\x2e\x39\x36\x38\x37\x27\ \x20\x63\x79\x3d\x27\x31\x32\x2e\x39\x33\x36\x31\x27\x20\x66\x69\ \x6c\x6c\x3d\x27\x23\x66\x66\x30\x30\x30\x30\x27\x20\x72\x3d\x27\ \x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\ \x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\ \x6e\x73\x6c\x61\x74\x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\ \x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\ \x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\ \x63\x78\x3d\x27\x35\x38\x2e\x32\x31\x37\x35\x27\x20\x63\x79\x3d\ \x27\x32\x31\x2e\x37\x33\x37\x38\x27\x20\x66\x69\x6c\x6c\x3d\x27\ \x23\x66\x66\x30\x30\x30\x30\x27\x20\x72\x3d\x27\x36\x2e\x30\x32\ \x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\ \x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\x6e\x73\x6c\x61\ \x74\x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\ \x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\x36\x32\x36\x34\ \x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\ \x34\x32\x2e\x37\x34\x34\x35\x27\x20\x63\x79\x3d\x27\x34\x31\x2e\ \x37\x31\x31\x39\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x66\x66\x30\ \x30\x30\x30\x27\x20\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\ \x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\ \x67\x3e\ \x00\x00\x03\x48\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\ \x33\x37\x2e\x33\x33\x34\x2c\x31\x34\x34\x48\x32\x35\x36\x2e\x30\ \x30\x36\x6c\x2d\x34\x32\x2e\x36\x36\x38\x2d\x34\x38\x48\x37\x34\ \x2e\x36\x36\x36\x43\x35\x31\x2e\x31\x39\x37\x2c\x39\x36\x2c\x33\ \x32\x2c\x31\x31\x35\x2e\x31\x39\x38\x2c\x33\x32\x2c\x31\x33\x38\ \x2e\x36\x36\x37\x76\x32\x33\x34\x2e\x36\x36\x36\x43\x33\x32\x2c\ \x33\x39\x36\x2e\x38\x30\x32\x2c\x35\x31\x2e\x31\x39\x37\x2c\x34\ \x31\x36\x2c\x37\x34\x2e\x36\x36\x36\x2c\x34\x31\x36\x68\x33\x36\ \x32\x2e\x36\x36\x38\x0a\x09\x43\x34\x36\x30\x2e\x38\x30\x33\x2c\ \x34\x31\x36\x2c\x34\x38\x30\x2c\x33\x39\x36\x2e\x38\x30\x32\x2c\ \x34\x38\x30\x2c\x33\x37\x33\x2e\x33\x33\x33\x56\x31\x38\x36\x2e\ \x36\x36\x37\x43\x34\x38\x30\x2c\x31\x36\x33\x2e\x31\x39\x38\x2c\ \x34\x36\x30\x2e\x38\x30\x33\x2c\x31\x34\x34\x2c\x34\x33\x37\x2e\ \x33\x33\x34\x2c\x31\x34\x34\x7a\x20\x4d\x34\x34\x38\x2c\x33\x37\ \x33\x2e\x33\x33\x33\x0a\x09\x63\x30\x2c\x35\x2e\x37\x38\x32\x2d\ \x34\x2e\x38\x38\x35\x2c\x31\x30\x2e\x36\x36\x37\x2d\x31\x30\x2e\ \x36\x36\x36\x2c\x31\x30\x2e\x36\x36\x37\x48\x37\x34\x2e\x36\x36\ \x36\x43\x36\x38\x2e\x38\x38\x34\x2c\x33\x38\x34\x2c\x36\x34\x2c\ \x33\x37\x39\x2e\x31\x31\x35\x2c\x36\x34\x2c\x33\x37\x33\x2e\x33\ \x33\x33\x56\x31\x37\x36\x68\x33\x37\x33\x2e\x33\x33\x34\x63\x35\ \x2e\x37\x38\x31\x2c\x30\x2c\x31\x30\x2e\x36\x36\x36\x2c\x34\x2e\ \x38\x38\x35\x2c\x31\x30\x2e\x36\x36\x36\x2c\x31\x30\x2e\x36\x36\ \x37\x0a\x09\x56\x33\x37\x33\x2e\x33\x33\x33\x7a\x22\x2f\x3e\x0a\ \x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x02\x98\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x3e\x0a\x09\x3c\x70\x61\x74\x68\x20\ \x64\x3d\x22\x4d\x31\x32\x38\x2c\x34\x30\x35\x2e\x34\x32\x39\x43\ \x31\x32\x38\x2c\x34\x32\x38\x2e\x38\x34\x36\x2c\x31\x34\x37\x2e\ \x31\x39\x38\x2c\x34\x34\x38\x2c\x31\x37\x30\x2e\x36\x36\x37\x2c\ \x34\x34\x38\x68\x31\x37\x30\x2e\x36\x36\x37\x43\x33\x36\x34\x2e\ \x38\x30\x32\x2c\x34\x34\x38\x2c\x33\x38\x34\x2c\x34\x32\x38\x2e\ \x38\x34\x36\x2c\x33\x38\x34\x2c\x34\x30\x35\x2e\x34\x32\x39\x56\ \x31\x36\x30\x48\x31\x32\x38\x56\x34\x30\x35\x2e\x34\x32\x39\x7a\ \x20\x4d\x34\x31\x36\x2c\x39\x36\x0a\x09\x09\x68\x2d\x38\x30\x6c\ \x2d\x32\x36\x2e\x37\x38\x35\x2d\x33\x32\x48\x32\x30\x32\x2e\x37\ \x38\x36\x4c\x31\x37\x36\x2c\x39\x36\x48\x39\x36\x76\x33\x32\x68\ \x33\x32\x30\x56\x39\x36\x7a\x22\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\ \x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x03\x16\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x3e\x0a\x09\x3c\x63\x69\x72\x63\x6c\ \x65\x20\x63\x78\x3d\x22\x32\x35\x36\x22\x20\x63\x79\x3d\x22\x32\ \x38\x30\x22\x20\x72\x3d\x22\x36\x33\x22\x2f\x3e\x0a\x09\x3c\x70\ \x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x34\x30\x2c\x39\x36\x68\x2d\ \x38\x38\x6c\x2d\x33\x32\x2d\x33\x32\x48\x31\x39\x32\x6c\x2d\x33\ \x32\x2c\x33\x32\x48\x37\x32\x63\x2d\x32\x32\x2e\x30\x39\x32\x2c\ \x30\x2d\x34\x30\x2c\x31\x37\x2e\x39\x30\x38\x2d\x34\x30\x2c\x34\ \x30\x76\x32\x37\x32\x63\x30\x2c\x32\x32\x2e\x30\x39\x32\x2c\x31\ \x37\x2e\x39\x30\x38\x2c\x34\x30\x2c\x34\x30\x2c\x34\x30\x68\x33\ \x36\x38\x63\x32\x32\x2e\x30\x39\x32\x2c\x30\x2c\x34\x30\x2d\x31\ \x37\x2e\x39\x30\x38\x2c\x34\x30\x2d\x34\x30\x0a\x09\x09\x56\x31\ \x33\x36\x43\x34\x38\x30\x2c\x31\x31\x33\x2e\x39\x30\x38\x2c\x34\ \x36\x32\x2e\x30\x39\x32\x2c\x39\x36\x2c\x34\x34\x30\x2c\x39\x36\ \x7a\x20\x4d\x32\x35\x36\x2c\x33\x39\x32\x63\x2d\x36\x31\x2e\x38\ \x35\x35\x2c\x30\x2d\x31\x31\x32\x2d\x35\x30\x2e\x31\x34\x35\x2d\ \x31\x31\x32\x2d\x31\x31\x32\x73\x35\x30\x2e\x31\x34\x35\x2d\x31\ \x31\x32\x2c\x31\x31\x32\x2d\x31\x31\x32\x73\x31\x31\x32\x2c\x35\ \x30\x2e\x31\x34\x35\x2c\x31\x31\x32\x2c\x31\x31\x32\x0a\x09\x09\ \x53\x33\x31\x37\x2e\x38\x35\x35\x2c\x33\x39\x32\x2c\x32\x35\x36\ \x2c\x33\x39\x32\x7a\x22\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\ \x73\x76\x67\x3e\x0a\ \x00\x00\x03\xfe\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\ \x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\ \x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\ \x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\ \x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\ \x31\x31\x2e\x31\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\ \x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x78\x6d\x6c\x6e\ \x73\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\ \x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\x20\x78\ \x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\x74\x70\ \x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ \x39\x39\x2f\x78\x6c\x69\x6e\x6b\x27\x20\x77\x69\x64\x74\x68\x3d\ \x27\x36\x33\x2e\x39\x39\x39\x36\x70\x74\x27\x20\x68\x65\x69\x67\ \x68\x74\x3d\x27\x36\x34\x70\x74\x27\x20\x76\x69\x65\x77\x42\x6f\ \x78\x3d\x27\x35\x36\x2e\x34\x30\x39\x34\x20\x31\x31\x37\x2e\x38\ \x35\x38\x20\x36\x33\x2e\x39\x39\x39\x36\x20\x36\x34\x27\x3e\x0a\ \x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\x3e\x0a\x3c\ \x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\ \x6e\x73\x6c\x61\x74\x65\x28\x35\x36\x2e\x34\x30\x39\x34\x20\x31\ \x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\ \x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\ \x27\x4d\x20\x32\x2e\x30\x30\x37\x35\x20\x36\x32\x2e\x32\x33\x32\ \x35\x4c\x20\x36\x32\x2e\x32\x33\x32\x35\x20\x36\x32\x2e\x32\x33\ \x32\x35\x4c\x20\x36\x32\x2e\x32\x33\x32\x35\x20\x32\x2e\x30\x30\ \x37\x35\x4c\x20\x32\x2e\x30\x30\x37\x35\x20\x32\x2e\x30\x30\x37\ \x35\x4c\x20\x32\x2e\x30\x30\x37\x35\x20\x36\x32\x2e\x32\x33\x32\ \x35\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\ \x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\ \x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\ \x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\ \x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\ \x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\ \x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\ \x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x34\x2e\x30\x31\x35\x27\ \x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\ \x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\ \x35\x36\x2e\x34\x30\x39\x34\x20\x31\x31\x37\x2e\x38\x35\x38\x29\ \x73\x63\x61\x6c\x65\x28\x2e\x39\x39\x36\x32\x36\x34\x29\x27\x3e\ \x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x32\x2e\x30\x30\ \x37\x35\x20\x33\x32\x2e\x31\x32\x4c\x20\x36\x32\x2e\x32\x33\x32\ \x35\x20\x33\x32\x2e\x31\x32\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\ \x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\ \x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\ \x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\ \x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\ \x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\ \x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\ \x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x34\ \x2e\x30\x31\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\ \x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\x6e\x73\ \x6c\x61\x74\x65\x28\x35\x36\x2e\x34\x30\x39\x34\x20\x31\x31\x37\ \x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\x36\x32\ \x36\x34\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\ \x20\x33\x32\x2e\x31\x32\x20\x36\x32\x2e\x32\x33\x32\x35\x4c\x20\ \x33\x32\x2e\x31\x32\x20\x32\x2e\x30\x30\x37\x35\x27\x20\x66\x69\ \x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\ \x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\ \x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\ \x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\ \x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\ \x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\ \x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\ \x74\x68\x3d\x27\x34\x2e\x30\x31\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\ \x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\ \x00\x00\x02\xf0\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x22\x49\x63\x6f\x6e\ \x5f\x32\x30\x5f\x22\x3e\x0a\x09\x3c\x67\x3e\x0a\x09\x09\x3c\x70\ \x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x34\x38\x43\x31\ \x34\x31\x2e\x36\x30\x31\x2c\x34\x38\x2c\x34\x38\x2c\x31\x34\x31\ \x2e\x36\x30\x31\x2c\x34\x38\x2c\x32\x35\x36\x73\x39\x33\x2e\x36\ \x30\x31\x2c\x32\x30\x38\x2c\x32\x30\x38\x2c\x32\x30\x38\x73\x32\ \x30\x38\x2d\x39\x33\x2e\x36\x30\x31\x2c\x32\x30\x38\x2d\x32\x30\ \x38\x53\x33\x37\x30\x2e\x33\x39\x39\x2c\x34\x38\x2c\x32\x35\x36\ \x2c\x34\x38\x7a\x20\x4d\x32\x35\x36\x2c\x34\x32\x32\x2e\x33\x39\ \x39\x0a\x09\x09\x09\x63\x2d\x39\x31\x2e\x35\x31\x38\x2c\x30\x2d\ \x31\x36\x36\x2e\x33\x39\x39\x2d\x37\x34\x2e\x38\x38\x32\x2d\x31\ \x36\x36\x2e\x33\x39\x39\x2d\x31\x36\x36\x2e\x33\x39\x39\x53\x31\ \x36\x34\x2e\x34\x38\x32\x2c\x38\x39\x2e\x36\x2c\x32\x35\x36\x2c\ \x38\x39\x2e\x36\x53\x34\x32\x32\x2e\x34\x2c\x31\x36\x34\x2e\x34\ \x38\x32\x2c\x34\x32\x32\x2e\x34\x2c\x32\x35\x36\x53\x33\x34\x37\ \x2e\x35\x31\x38\x2c\x34\x32\x32\x2e\x33\x39\x39\x2c\x32\x35\x36\ \x2c\x34\x32\x32\x2e\x33\x39\x39\x7a\x22\x2f\x3e\x0a\x09\x3c\x2f\ \x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x02\x97\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x53\ \x61\x76\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\ \x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\ \x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\ \x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\ \x6b\x22\x20\x78\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x79\x3d\x22\ \x35\x31\x32\x70\x78\x22\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\ \x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\ \x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\ \x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\ \x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\ \x65\x73\x65\x72\x76\x65\x22\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\ \x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x32\x34\ \x20\x30\x20\x30\x20\x32\x34\x20\x30\x20\x30\x29\x27\x3e\x0a\x3c\ \x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x35\x2e\x31\x37\x33\x2c\ \x32\x48\x34\x43\x32\x2e\x38\x39\x39\x2c\x32\x2c\x32\x2c\x32\x2e\ \x39\x2c\x32\x2c\x34\x76\x31\x32\x63\x30\x2c\x31\x2e\x31\x2c\x30\ \x2e\x38\x39\x39\x2c\x32\x2c\x32\x2c\x32\x68\x31\x32\x63\x31\x2e\ \x31\x30\x31\x2c\x30\x2c\x32\x2d\x30\x2e\x39\x2c\x32\x2d\x32\x56\ \x35\x2e\x31\x32\x37\x4c\x31\x35\x2e\x31\x37\x33\x2c\x32\x7a\x20\ \x4d\x31\x34\x2c\x38\x63\x30\x2c\x30\x2e\x35\x34\x39\x2d\x30\x2e\ \x34\x35\x2c\x31\x2d\x31\x2c\x31\x48\x37\x0a\x09\x43\x36\x2e\x34\ \x35\x2c\x39\x2c\x36\x2c\x38\x2e\x35\x34\x39\x2c\x36\x2c\x38\x56\ \x33\x68\x38\x56\x38\x7a\x20\x4d\x31\x33\x2c\x34\x68\x2d\x32\x76\ \x34\x68\x32\x56\x34\x7a\x22\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\ \x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x02\x6c\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x22\x49\x63\x6f\x6e\ \x5f\x31\x5f\x22\x3e\x0a\x09\x3c\x67\x3e\x0a\x09\x09\x3c\x67\x3e\ \x0a\x09\x09\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\ \x6e\x74\x73\x3d\x22\x31\x38\x36\x2e\x33\x30\x31\x2c\x33\x33\x39\ \x2e\x38\x39\x33\x20\x39\x36\x2c\x32\x34\x39\x2e\x34\x36\x31\x20\ \x36\x34\x2c\x32\x37\x39\x2e\x39\x36\x38\x20\x31\x38\x36\x2e\x33\ \x30\x31\x2c\x34\x30\x32\x20\x34\x34\x38\x2c\x31\x34\x30\x2e\x35\ \x30\x36\x20\x34\x31\x36\x2c\x31\x31\x30\x20\x09\x09\x09\x22\x2f\ \x3e\x0a\x09\x09\x3c\x2f\x67\x3e\x0a\x09\x3c\x2f\x67\x3e\x0a\x3c\ \x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x01\xdd\ \x00\ \x00\x06\xc4\x78\x9c\xcd\x51\x4d\x8f\x9b\x30\x14\x3c\xc3\xaf\x78\ \xf5\xad\x12\xfe\x82\x85\x24\x14\xb2\x6a\x3e\x14\x45\xda\xb6\x91\ \x36\x4d\xd5\x53\x45\xc0\x05\xb4\x2c\x20\x70\x80\xf4\xd7\x57\x76\ \xd2\x6a\x2b\x6d\xae\x4b\x0f\xf6\x93\x67\xde\x9b\x37\xd6\x04\xf7\ \xc3\x73\x01\x9d\x68\xda\xbc\x2a\x43\xc4\x09\x43\x20\xca\xb8\x4a\ \xf2\x32\x0d\xd1\x49\xfe\xc4\x53\x74\x3f\x37\x83\x77\x18\xc3\x46\ \x94\xa2\x89\x64\xd5\xf8\xf0\x31\xa9\x8e\x02\xb6\x45\x71\x6a\xa5\ \x86\x80\x7b\xc4\x26\xdc\x82\xc7\xc3\x06\xd6\x43\x5d\x35\x12\x76\ \xc5\x29\xc5\xdb\x12\x88\x06\x0f\x97\x1d\x3e\x78\x84\x31\x58\x9c\ \xf2\x22\x01\xf6\x1e\x00\x63\x25\xbf\xfa\xb2\xdc\x7f\xdf\xad\xa1\ \xed\x52\xd8\x7d\x5d\x3c\x6c\x97\x80\x30\xa5\xdf\x9c\x25\xa5\xab\ \xfd\x4a\x2b\x70\xc2\x29\x5d\x7f\x46\x80\x32\x29\x6b\x9f\xd2\xbe\ \xef\x49\xef\x90\xaa\x49\xe9\xa6\x89\xea\x2c\x8f\x5b\xfa\x78\xd8\ \x50\xd5\xb8\xda\xaf\x68\xdb\xa5\x9c\x93\x44\x26\x68\x6e\x06\x4a\ \xf9\xc5\x3f\x39\x82\x3c\x09\xd1\x43\x74\x16\xcd\x0f\x8e\x60\x78\ \x2e\xca\x36\x7c\x45\xd9\x66\x8c\x29\xa5\x6b\x8b\x3f\x14\x79\xf9\ \xf4\x5a\x23\x9f\xcd\x66\x54\xb3\x08\x86\x10\xb1\x7a\x40\x70\xbe\ \x54\xd3\x80\x3e\x4f\x64\x16\x22\x97\xdb\x0a\xcf\x44\x9e\x66\xf2\ \xef\xb3\xcb\x45\xbf\xa8\xd4\x10\x30\x70\xb9\xad\x0e\x82\x56\x9e\ \x0b\x11\x22\x51\x46\xc7\x42\xe0\x63\x14\x3f\xa5\x4d\x75\x2a\x13\ \xbf\x14\x3d\xbc\xe8\xfc\xa0\xad\xf9\x6d\x1d\xc5\x22\x44\x75\x23\ \x5a\xd1\x74\x42\xfd\x39\x9d\x9b\x86\xbe\x8c\xa0\x8e\x64\x06\x49\ \x88\x3e\x71\x8f\x59\xdc\x75\x88\x13\x33\xcb\x21\x13\xec\x58\x1e\ \x99\x60\x8f\x4c\x54\xcd\xb0\xcb\x88\x1b\x63\x87\x4c\x2c\xa6\x40\ \xec\xe0\x2b\xdd\x5d\x28\xa6\x39\xe7\xcf\x80\xaa\x99\x26\xf4\x88\ \x82\x2c\xad\xa8\xce\x41\xef\xf9\x85\x4c\xc3\x30\xe8\xbf\x2e\xec\ \xe9\xf4\x3f\x70\x71\xc7\xbd\xb1\x5c\x04\xf4\x56\x38\xf6\x94\xbf\ \x89\x21\xbd\xe7\x66\x38\xe3\xbb\x50\xe1\x8c\xe4\xe2\x76\x38\x77\ \x6c\xf6\x26\x86\xf4\x9e\x9b\xe1\x8c\xef\x42\x85\x33\x92\x0b\x1d\ \xce\xf5\x6a\xbb\x74\x6e\xfe\x06\x44\x1a\x94\x79\ \x00\x00\x03\x3d\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\x74\x79\x6c\x65\ \x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\ \x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\ \x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\ \x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0a\x3c\x70\x61\x74\ \x68\x20\x64\x3d\x22\x4d\x34\x33\x37\x2e\x35\x2c\x33\x38\x36\x2e\ \x36\x4c\x33\x30\x36\x2e\x39\x2c\x32\x35\x36\x6c\x31\x33\x30\x2e\ \x36\x2d\x31\x33\x30\x2e\x36\x63\x31\x34\x2e\x31\x2d\x31\x34\x2e\ \x31\x2c\x31\x34\x2e\x31\x2d\x33\x36\x2e\x38\x2c\x30\x2d\x35\x30\ \x2e\x39\x63\x2d\x31\x34\x2e\x31\x2d\x31\x34\x2e\x31\x2d\x33\x36\ \x2e\x38\x2d\x31\x34\x2e\x31\x2d\x35\x30\x2e\x39\x2c\x30\x4c\x32\ \x35\x36\x2c\x32\x30\x35\x2e\x31\x4c\x31\x32\x35\x2e\x34\x2c\x37\ \x34\x2e\x35\x0a\x09\x63\x2d\x31\x34\x2e\x31\x2d\x31\x34\x2e\x31\ \x2d\x33\x36\x2e\x38\x2d\x31\x34\x2e\x31\x2d\x35\x30\x2e\x39\x2c\ \x30\x63\x2d\x31\x34\x2e\x31\x2c\x31\x34\x2e\x31\x2d\x31\x34\x2e\ \x31\x2c\x33\x36\x2e\x38\x2c\x30\x2c\x35\x30\x2e\x39\x4c\x32\x30\ \x35\x2e\x31\x2c\x32\x35\x36\x4c\x37\x34\x2e\x35\x2c\x33\x38\x36\ \x2e\x36\x63\x2d\x31\x34\x2e\x31\x2c\x31\x34\x2e\x31\x2d\x31\x34\ \x2e\x31\x2c\x33\x36\x2e\x38\x2c\x30\x2c\x35\x30\x2e\x39\x0a\x09\ \x63\x31\x34\x2e\x31\x2c\x31\x34\x2e\x31\x2c\x33\x36\x2e\x38\x2c\ \x31\x34\x2e\x31\x2c\x35\x30\x2e\x39\x2c\x30\x4c\x32\x35\x36\x2c\ \x33\x30\x36\x2e\x39\x6c\x31\x33\x30\x2e\x36\x2c\x31\x33\x30\x2e\ \x36\x63\x31\x34\x2e\x31\x2c\x31\x34\x2e\x31\x2c\x33\x36\x2e\x38\ \x2c\x31\x34\x2e\x31\x2c\x35\x30\x2e\x39\x2c\x30\x43\x34\x35\x31\ \x2e\x35\x2c\x34\x32\x33\x2e\x34\x2c\x34\x35\x31\x2e\x35\x2c\x34\ \x30\x30\x2e\x36\x2c\x34\x33\x37\x2e\x35\x2c\x33\x38\x36\x2e\x36\ \x7a\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x02\xe7\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x43\ \x69\x72\x63\x6c\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\ \x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\ \x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\x3a\ \x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ \x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\ \x69\x6e\x6b\x22\x20\x78\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x79\ \x3d\x22\x35\x31\x32\x70\x78\x22\x0a\x09\x20\x76\x69\x65\x77\x42\ \x6f\x78\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\ \x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\ \x6e\x64\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\ \x35\x31\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\ \x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0a\x3c\x67\x20\x74\x72\ \x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\ \x32\x34\x20\x30\x20\x30\x20\x32\x34\x20\x30\x20\x30\x29\x27\x3e\ \x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x30\x2c\x30\x2e\ \x34\x43\x34\x2e\x36\x39\x38\x2c\x30\x2e\x34\x2c\x30\x2e\x34\x2c\ \x34\x2e\x36\x39\x38\x2c\x30\x2e\x34\x2c\x31\x30\x43\x30\x2e\x34\ \x2c\x31\x35\x2e\x33\x30\x32\x2c\x34\x2e\x36\x39\x38\x2c\x31\x39\ \x2e\x36\x2c\x31\x30\x2c\x31\x39\x2e\x36\x63\x35\x2e\x33\x30\x31\ \x2c\x30\x2c\x39\x2e\x36\x2d\x34\x2e\x32\x39\x38\x2c\x39\x2e\x36\ \x2d\x39\x2e\x36\x30\x31\x0a\x09\x43\x31\x39\x2e\x36\x2c\x34\x2e\ \x36\x39\x38\x2c\x31\x35\x2e\x33\x30\x31\x2c\x30\x2e\x34\x2c\x31\ \x30\x2c\x30\x2e\x34\x7a\x20\x4d\x31\x30\x2c\x31\x37\x2e\x35\x39\ \x39\x63\x2d\x34\x2e\x31\x39\x37\x2c\x30\x2d\x37\x2e\x36\x2d\x33\ \x2e\x34\x30\x32\x2d\x37\x2e\x36\x2d\x37\x2e\x36\x53\x35\x2e\x38\ \x30\x32\x2c\x32\x2e\x34\x2c\x31\x30\x2c\x32\x2e\x34\x63\x34\x2e\ \x31\x39\x37\x2c\x30\x2c\x37\x2e\x36\x30\x31\x2c\x33\x2e\x34\x30\ \x32\x2c\x37\x2e\x36\x30\x31\x2c\x37\x2e\x36\x0a\x09\x53\x31\x34\ \x2e\x31\x39\x37\x2c\x31\x37\x2e\x35\x39\x39\x2c\x31\x30\x2c\x31\ \x37\x2e\x35\x39\x39\x7a\x22\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\ \x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x02\x72\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x22\x49\x63\x6f\x6e\ \x5f\x38\x5f\x22\x3e\x0a\x09\x3c\x67\x3e\x0a\x09\x09\x3c\x70\x61\ \x74\x68\x20\x64\x3d\x22\x4d\x38\x35\x2c\x32\x37\x37\x2e\x33\x37\ \x35\x68\x32\x35\x39\x2e\x37\x30\x34\x4c\x32\x32\x35\x2e\x30\x30\ \x32\x2c\x33\x39\x37\x2e\x30\x37\x37\x4c\x32\x35\x36\x2c\x34\x32\ \x37\x6c\x31\x37\x31\x2d\x31\x37\x31\x4c\x32\x35\x36\x2c\x38\x35\ \x6c\x2d\x32\x39\x2e\x39\x32\x32\x2c\x32\x39\x2e\x39\x32\x34\x6c\ \x31\x31\x38\x2e\x36\x32\x36\x2c\x31\x31\x39\x2e\x37\x30\x31\x48\ \x38\x35\x56\x32\x37\x37\x2e\x33\x37\x35\x7a\x22\x2f\x3e\x0a\x09\ \x3c\x2f\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\ \x0a\ \x00\x00\x03\x5a\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\ \x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\ \x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\ \x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\ \x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\ \x31\x31\x2e\x31\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\ \x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x78\x6d\x6c\x6e\ \x73\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\ \x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\x20\x78\ \x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\x74\x70\ \x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ \x39\x39\x2f\x78\x6c\x69\x6e\x6b\x27\x20\x77\x69\x64\x74\x68\x3d\ \x27\x36\x33\x2e\x39\x39\x39\x36\x70\x74\x27\x20\x68\x65\x69\x67\ \x68\x74\x3d\x27\x36\x34\x70\x74\x27\x20\x76\x69\x65\x77\x42\x6f\ \x78\x3d\x27\x35\x36\x2e\x34\x30\x39\x34\x20\x31\x31\x37\x2e\x38\ \x35\x38\x20\x36\x33\x2e\x39\x39\x39\x36\x20\x36\x34\x27\x3e\x0a\ \x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\x3e\x0a\x3c\ \x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\ \x6e\x73\x6c\x61\x74\x65\x28\x35\x36\x2e\x34\x30\x39\x34\x20\x31\ \x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\ \x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\ \x27\x4d\x20\x32\x2e\x30\x30\x37\x35\x20\x36\x32\x2e\x32\x33\x32\ \x35\x4c\x20\x36\x32\x2e\x32\x33\x32\x35\x20\x36\x32\x2e\x32\x33\ \x32\x35\x4c\x20\x36\x32\x2e\x32\x33\x32\x35\x20\x32\x2e\x30\x30\ \x37\x35\x4c\x20\x32\x2e\x30\x30\x37\x35\x20\x32\x2e\x30\x30\x37\ \x35\x4c\x20\x32\x2e\x30\x30\x37\x35\x20\x36\x32\x2e\x32\x33\x32\ \x35\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\ \x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\ \x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\ \x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\ \x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\ \x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\ \x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\ \x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x34\x2e\x30\x31\x35\x27\ \x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\ \x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\ \x35\x36\x2e\x34\x30\x39\x34\x20\x31\x31\x37\x2e\x38\x35\x38\x29\ \x73\x63\x61\x6c\x65\x28\x2e\x39\x39\x36\x32\x36\x34\x29\x27\x3e\ \x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x34\x37\x2e\x31\ \x37\x36\x32\x20\x33\x32\x2e\x31\x32\x43\x20\x34\x37\x2e\x31\x37\ \x36\x32\x20\x32\x33\x2e\x38\x30\x34\x37\x20\x34\x30\x2e\x34\x33\ \x35\x33\x20\x31\x37\x2e\x30\x36\x33\x37\x20\x33\x32\x2e\x31\x32\ \x20\x31\x37\x2e\x30\x36\x33\x37\x43\x20\x32\x33\x2e\x38\x30\x34\ \x37\x20\x31\x37\x2e\x30\x36\x33\x37\x20\x31\x37\x2e\x30\x36\x33\ \x37\x20\x32\x33\x2e\x38\x30\x34\x37\x20\x31\x37\x2e\x30\x36\x33\ \x37\x20\x33\x32\x2e\x31\x32\x43\x20\x31\x37\x2e\x30\x36\x33\x37\ \x20\x34\x30\x2e\x34\x33\x35\x33\x20\x32\x33\x2e\x38\x30\x34\x37\ \x20\x34\x37\x2e\x31\x37\x36\x32\x20\x33\x32\x2e\x31\x32\x20\x34\ \x37\x2e\x31\x37\x36\x32\x43\x20\x34\x30\x2e\x34\x33\x35\x33\x20\ \x34\x37\x2e\x31\x37\x36\x32\x20\x34\x37\x2e\x31\x37\x36\x32\x20\ \x34\x30\x2e\x34\x33\x35\x33\x20\x34\x37\x2e\x31\x37\x36\x32\x20\ \x33\x32\x2e\x31\x32\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\ \x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\ \x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\ \x00\x00\x03\x5f\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x3e\x0a\x09\x0a\x09\x09\x3c\x72\x65\ \x63\x74\x20\x78\x3d\x22\x31\x37\x38\x2e\x38\x34\x36\x22\x20\x79\ \x3d\x22\x39\x32\x2e\x30\x38\x37\x22\x20\x74\x72\x61\x6e\x73\x66\ \x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x2d\x30\x2e\x37\ \x30\x37\x31\x20\x2d\x30\x2e\x37\x30\x37\x31\x20\x30\x2e\x37\x30\ \x37\x31\x20\x2d\x30\x2e\x37\x30\x37\x31\x20\x32\x32\x34\x2e\x33\ \x34\x37\x36\x20\x36\x33\x31\x2e\x31\x34\x39\x38\x29\x22\x20\x77\ \x69\x64\x74\x68\x3d\x22\x31\x32\x38\x2e\x30\x38\x35\x22\x20\x68\ \x65\x69\x67\x68\x74\x3d\x22\x33\x35\x34\x2e\x30\x34\x39\x22\x2f\ \x3e\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x37\x31\ \x2e\x37\x32\x33\x2c\x38\x38\x2e\x33\x39\x33\x6c\x2d\x34\x38\x2e\ \x31\x31\x35\x2d\x34\x38\x2e\x31\x31\x34\x63\x2d\x31\x31\x2e\x37\ \x32\x33\x2d\x31\x31\x2e\x37\x32\x34\x2d\x33\x31\x2e\x35\x35\x38\ \x2d\x31\x30\x2e\x38\x39\x36\x2d\x34\x34\x2e\x33\x30\x34\x2c\x31\ \x2e\x38\x35\x6c\x2d\x34\x35\x2e\x32\x30\x32\x2c\x34\x35\x2e\x32\ \x30\x33\x6c\x39\x30\x2e\x35\x36\x39\x2c\x39\x30\x2e\x35\x36\x38\ \x6c\x34\x35\x2e\x32\x30\x32\x2d\x34\x35\x2e\x32\x30\x32\x0a\x09\ \x09\x43\x34\x38\x32\x2e\x36\x31\x36\x2c\x31\x31\x39\x2e\x39\x35\ \x32\x2c\x34\x38\x33\x2e\x34\x34\x35\x2c\x31\x30\x30\x2e\x31\x31\ \x36\x2c\x34\x37\x31\x2e\x37\x32\x33\x2c\x38\x38\x2e\x33\x39\x33\ \x7a\x22\x2f\x3e\x0a\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\ \x6f\x69\x6e\x74\x73\x3d\x22\x36\x34\x2e\x30\x32\x31\x2c\x33\x36\ \x33\x2e\x32\x35\x32\x20\x33\x32\x2c\x34\x38\x30\x20\x31\x34\x38\ \x2e\x37\x33\x37\x2c\x34\x34\x37\x2e\x39\x37\x39\x20\x09\x22\x2f\ \x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x03\x03\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x43\ \x68\x65\x63\x6b\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\ \x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\ \x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x78\ \x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\ \x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\ \x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\x22\x30\ \x70\x78\x22\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\ \x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\x61\x62\x6c\x65\ \x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\ \x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x78\x6d\x6c\x3a\ \x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\ \x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\x2e\x32\x39\ \x34\x2c\x31\x36\x2e\x39\x39\x38\x63\x2d\x30\x2e\x34\x33\x35\x2c\ \x30\x2d\x30\x2e\x38\x34\x37\x2d\x30\x2e\x32\x30\x33\x2d\x31\x2e\ \x31\x31\x31\x2d\x30\x2e\x35\x35\x33\x4c\x33\x2e\x36\x31\x2c\x31\ \x31\x2e\x37\x32\x34\x63\x2d\x30\x2e\x34\x36\x35\x2d\x30\x2e\x36\ \x31\x33\x2d\x30\x2e\x33\x34\x34\x2d\x31\x2e\x34\x38\x36\x2c\x30\ \x2e\x32\x37\x2d\x31\x2e\x39\x35\x31\x0a\x09\x63\x30\x2e\x36\x31\ \x35\x2d\x30\x2e\x34\x36\x37\x2c\x31\x2e\x34\x38\x38\x2d\x30\x2e\ \x33\x34\x34\x2c\x31\x2e\x39\x35\x33\x2c\x30\x2e\x32\x37\x6c\x32\ \x2e\x33\x35\x31\x2c\x33\x2e\x31\x30\x34\x6c\x35\x2e\x39\x31\x31\ \x2d\x39\x2e\x34\x39\x32\x63\x30\x2e\x34\x30\x37\x2d\x30\x2e\x36\ \x35\x32\x2c\x31\x2e\x32\x36\x37\x2d\x30\x2e\x38\x35\x32\x2c\x31\ \x2e\x39\x32\x31\x2d\x30\x2e\x34\x34\x35\x0a\x09\x63\x30\x2e\x36\ \x35\x33\x2c\x30\x2e\x34\x30\x36\x2c\x30\x2e\x38\x35\x34\x2c\x31\ \x2e\x32\x36\x36\x2c\x30\x2e\x34\x34\x36\x2c\x31\x2e\x39\x32\x4c\ \x39\x2e\x34\x37\x38\x2c\x31\x36\x2e\x33\x34\x63\x2d\x30\x2e\x32\ \x34\x32\x2c\x30\x2e\x33\x39\x31\x2d\x30\x2e\x36\x36\x31\x2c\x30\ \x2e\x36\x33\x35\x2d\x31\x2e\x31\x32\x2c\x30\x2e\x36\x35\x36\x43\ \x38\x2e\x33\x33\x36\x2c\x31\x36\x2e\x39\x39\x38\x2c\x38\x2e\x33\ \x31\x36\x2c\x31\x36\x2e\x39\x39\x38\x2c\x38\x2e\x32\x39\x34\x2c\ \x31\x36\x2e\x39\x39\x38\x7a\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\ \x3e\x0a\ \x00\x00\x04\x42\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x69\x73\x6f\ \x2d\x38\x38\x35\x39\x2d\x31\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\ \x47\x65\x6e\x65\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\ \x20\x49\x6c\x6c\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x39\x2e\ \x30\x2e\x30\x2c\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\ \x50\x6c\x75\x67\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\ \x72\x73\x69\x6f\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\ \x64\x20\x30\x29\x20\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\ \x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\ \x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\ \x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\ \x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\ \x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\ \x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\ \x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\ \x79\x3d\x22\x30\x70\x78\x22\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\ \x78\x3d\x22\x30\x20\x30\x20\x34\x32\x33\x2e\x37\x35\x34\x20\x34\ \x32\x33\x2e\x37\x35\x34\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x65\ \x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\ \x3a\x6e\x65\x77\x20\x30\x20\x30\x20\x34\x32\x33\x2e\x37\x35\x34\ \x20\x34\x32\x33\x2e\x37\x35\x34\x3b\x22\x20\x78\x6d\x6c\x3a\x73\ \x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\ \x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x30\x37\x2e\x35\ \x31\x36\x2c\x31\x32\x33\x2e\x32\x33\x39\x6c\x2d\x32\x37\x2e\x37\ \x31\x37\x2c\x31\x31\x2e\x34\x38\x63\x31\x38\x2e\x35\x38\x35\x2c\ \x34\x34\x2e\x38\x36\x39\x2c\x31\x38\x2e\x35\x38\x35\x2c\x39\x34\ \x2e\x32\x39\x31\x2c\x30\x2c\x31\x33\x39\x2e\x31\x35\x39\x63\x2d\ \x31\x38\x2e\x35\x38\x35\x2c\x34\x34\x2e\x38\x36\x39\x2d\x35\x33\ \x2e\x35\x33\x31\x2c\x37\x39\x2e\x38\x31\x35\x2d\x39\x38\x2e\x34\ \x2c\x39\x38\x2e\x34\x0a\x09\x63\x2d\x32\x32\x2e\x34\x33\x38\x2c\ \x39\x2e\x32\x39\x33\x2d\x34\x36\x2e\x30\x30\x34\x2c\x31\x33\x2e\ \x39\x34\x2d\x36\x39\x2e\x35\x37\x39\x2c\x31\x33\x2e\x39\x33\x39\ \x63\x2d\x32\x33\x2e\x35\x36\x39\x2d\x30\x2e\x30\x30\x31\x2d\x34\ \x37\x2e\x31\x34\x37\x2d\x34\x2e\x36\x34\x37\x2d\x36\x39\x2e\x35\ \x37\x39\x2d\x31\x33\x2e\x39\x33\x39\x63\x2d\x34\x34\x2e\x38\x36\ \x39\x2d\x31\x38\x2e\x35\x38\x35\x2d\x37\x39\x2e\x38\x31\x35\x2d\ \x35\x33\x2e\x35\x33\x31\x2d\x39\x38\x2e\x34\x2d\x39\x38\x2e\x34\ \x0a\x09\x43\x31\x33\x2e\x35\x30\x37\x2c\x32\x30\x30\x2e\x36\x34\ \x37\x2c\x33\x34\x2e\x37\x35\x38\x2c\x31\x31\x38\x2e\x37\x31\x2c\ \x39\x30\x2e\x37\x35\x38\x2c\x36\x38\x2e\x36\x34\x34\x6c\x36\x30\ \x2e\x38\x30\x31\x2c\x36\x30\x2e\x38\x30\x31\x56\x37\x2e\x35\x32\ \x31\x48\x32\x39\x2e\x36\x33\x35\x4c\x36\x39\x2e\x35\x31\x34\x2c\ \x34\x37\x2e\x34\x43\x35\x2e\x32\x32\x32\x2c\x31\x30\x35\x2e\x38\ \x32\x36\x2d\x31\x38\x2e\x39\x38\x35\x2c\x32\x30\x30\x2e\x36\x2c\ \x31\x36\x2e\x31\x32\x33\x2c\x32\x38\x35\x2e\x33\x35\x39\x0a\x09\ \x63\x32\x31\x2e\x36\x35\x32\x2c\x35\x32\x2e\x32\x37\x32\x2c\x36\ \x32\x2e\x33\x36\x34\x2c\x39\x32\x2e\x39\x38\x34\x2c\x31\x31\x34\ \x2e\x36\x33\x36\x2c\x31\x31\x34\x2e\x36\x33\x36\x63\x32\x36\x2e\ \x31\x33\x37\x2c\x31\x30\x2e\x38\x32\x36\x2c\x35\x33\x2e\x35\x39\ \x39\x2c\x31\x36\x2e\x32\x33\x39\x2c\x38\x31\x2e\x30\x36\x31\x2c\ \x31\x36\x2e\x32\x33\x39\x73\x35\x34\x2e\x39\x32\x34\x2d\x35\x2e\ \x34\x31\x33\x2c\x38\x31\x2e\x30\x36\x2d\x31\x36\x2e\x32\x33\x39\ \x0a\x09\x63\x35\x32\x2e\x32\x37\x32\x2d\x32\x31\x2e\x36\x35\x32\ \x2c\x39\x32\x2e\x39\x38\x34\x2d\x36\x32\x2e\x33\x36\x34\x2c\x31\ \x31\x34\x2e\x36\x33\x37\x2d\x31\x31\x34\x2e\x36\x33\x36\x43\x34\ \x32\x39\x2e\x31\x36\x37\x2c\x32\x33\x33\x2e\x30\x38\x37\x2c\x34\ \x32\x39\x2e\x31\x36\x37\x2c\x31\x37\x35\x2e\x35\x31\x31\x2c\x34\ \x30\x37\x2e\x35\x31\x36\x2c\x31\x32\x33\x2e\x32\x33\x39\x7a\x22\ \x2f\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\ \x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\ \x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\ \x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\ \x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\ \x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\ \x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\ \x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\ \x0a\x3c\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\ \x0a\ \x00\x00\x02\x77\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\x74\x79\x6c\x65\ \x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\ \x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\ \x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\ \x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0a\x3c\x70\x6f\x6c\ \x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\x22\x32\x38\x38\ \x2c\x39\x36\x20\x33\x33\x37\x2e\x39\x2c\x31\x34\x35\x2e\x39\x20\ \x32\x37\x34\x2c\x32\x30\x39\x2e\x37\x20\x32\x37\x34\x2c\x32\x30\ \x39\x2e\x37\x20\x31\x34\x35\x2e\x39\x2c\x33\x33\x37\x2e\x39\x20\ \x39\x36\x2c\x32\x38\x38\x20\x39\x36\x2c\x34\x31\x36\x20\x32\x32\ \x34\x2c\x34\x31\x36\x20\x31\x37\x34\x2e\x31\x2c\x33\x36\x36\x2e\ \x31\x20\x33\x35\x37\x2e\x34\x2c\x31\x38\x32\x2e\x39\x20\x33\x36\ \x36\x2e\x31\x2c\x31\x37\x34\x2e\x31\x20\x0a\x09\x34\x31\x36\x2c\ \x32\x32\x34\x20\x34\x31\x36\x2c\x39\x36\x20\x22\x2f\x3e\x0a\x3c\ \x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x04\x54\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x22\x49\x63\x6f\x6e\ \x22\x3e\x0a\x09\x3c\x67\x3e\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\ \x64\x3d\x22\x4d\x32\x35\x36\x2c\x31\x37\x36\x63\x2d\x34\x34\x2e\ \x30\x30\x34\x2c\x30\x2d\x38\x30\x2e\x30\x30\x31\x2c\x33\x36\x2d\ \x38\x30\x2e\x30\x30\x31\x2c\x38\x30\x63\x30\x2c\x34\x34\x2e\x30\ \x30\x34\x2c\x33\x35\x2e\x39\x39\x37\x2c\x38\x30\x2c\x38\x30\x2e\ \x30\x30\x31\x2c\x38\x30\x63\x34\x34\x2e\x30\x30\x35\x2c\x30\x2c\ \x37\x39\x2e\x39\x39\x39\x2d\x33\x35\x2e\x39\x39\x36\x2c\x37\x39\ \x2e\x39\x39\x39\x2d\x38\x30\x0a\x09\x09\x09\x43\x33\x33\x35\x2e\ \x39\x39\x39\x2c\x32\x31\x32\x2c\x33\x30\x30\x2e\x30\x30\x35\x2c\ \x31\x37\x36\x2c\x32\x35\x36\x2c\x31\x37\x36\x7a\x20\x4d\x34\x34\ \x36\x2e\x39\x33\x38\x2c\x32\x33\x34\x2e\x36\x36\x37\x63\x2d\x39\ \x2e\x36\x30\x35\x2d\x38\x38\x2e\x35\x33\x31\x2d\x38\x31\x2e\x30\ \x37\x34\x2d\x31\x36\x30\x2d\x31\x36\x39\x2e\x36\x30\x35\x2d\x31\ \x36\x39\x2e\x35\x39\x39\x56\x33\x32\x68\x2d\x34\x32\x2e\x36\x36\ \x36\x76\x33\x33\x2e\x30\x36\x37\x0a\x09\x09\x09\x63\x2d\x38\x38\ \x2e\x35\x33\x31\x2c\x39\x2e\x35\x39\x39\x2d\x31\x36\x30\x2c\x38\ \x31\x2e\x30\x36\x38\x2d\x31\x36\x39\x2e\x36\x30\x34\x2c\x31\x36\ \x39\x2e\x35\x39\x39\x48\x33\x32\x76\x34\x32\x2e\x36\x36\x37\x68\ \x33\x33\x2e\x30\x36\x32\x63\x39\x2e\x36\x30\x34\x2c\x38\x38\x2e\ \x35\x33\x31\x2c\x38\x31\x2e\x30\x37\x32\x2c\x31\x36\x30\x2c\x31\ \x36\x39\x2e\x36\x30\x34\x2c\x31\x36\x39\x2e\x36\x30\x34\x56\x34\ \x38\x30\x68\x34\x32\x2e\x36\x36\x36\x76\x2d\x33\x33\x2e\x30\x36\ \x32\x0a\x09\x09\x09\x63\x38\x38\x2e\x35\x33\x31\x2d\x39\x2e\x36\ \x30\x34\x2c\x31\x36\x30\x2d\x38\x31\x2e\x30\x37\x33\x2c\x31\x36\ \x39\x2e\x36\x30\x35\x2d\x31\x36\x39\x2e\x36\x30\x34\x48\x34\x38\ \x30\x76\x2d\x34\x32\x2e\x36\x36\x37\x48\x34\x34\x36\x2e\x39\x33\ \x38\x7a\x20\x4d\x32\x35\x36\x2c\x34\x30\x35\x2e\x33\x33\x33\x63\ \x2d\x38\x32\x2e\x31\x33\x37\x2c\x30\x2d\x31\x34\x39\x2e\x33\x33\ \x34\x2d\x36\x37\x2e\x31\x39\x38\x2d\x31\x34\x39\x2e\x33\x33\x34\ \x2d\x31\x34\x39\x2e\x33\x33\x33\x0a\x09\x09\x09\x63\x30\x2d\x38\ \x32\x2e\x31\x33\x36\x2c\x36\x37\x2e\x31\x39\x37\x2d\x31\x34\x39\ \x2e\x33\x33\x33\x2c\x31\x34\x39\x2e\x33\x33\x34\x2d\x31\x34\x39\ \x2e\x33\x33\x33\x63\x38\x32\x2e\x31\x33\x35\x2c\x30\x2c\x31\x34\ \x39\x2e\x33\x33\x32\x2c\x36\x37\x2e\x31\x39\x38\x2c\x31\x34\x39\ \x2e\x33\x33\x32\x2c\x31\x34\x39\x2e\x33\x33\x33\x43\x34\x30\x35\ \x2e\x33\x33\x32\x2c\x33\x33\x38\x2e\x31\x33\x35\x2c\x33\x33\x38\ \x2e\x31\x33\x35\x2c\x34\x30\x35\x2e\x33\x33\x33\x2c\x32\x35\x36\ \x2c\x34\x30\x35\x2e\x33\x33\x33\x7a\x0a\x09\x09\x09\x22\x2f\x3e\ \x0a\x09\x3c\x2f\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\ \x67\x3e\x0a\ \x00\x00\x03\xda\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x30\x2e\x30\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x3e\x0a\x09\x3c\x70\x61\x74\x68\x20\ \x64\x3d\x22\x4d\x34\x38\x2e\x34\x35\x31\x2c\x34\x36\x34\x2e\x38\ \x32\x38\x63\x34\x30\x2e\x30\x32\x33\x2d\x30\x2e\x33\x31\x35\x2c\ \x34\x35\x2e\x30\x31\x2d\x39\x2e\x39\x35\x35\x2c\x35\x38\x2e\x30\ \x35\x32\x2d\x35\x30\x2e\x31\x33\x32\x63\x32\x34\x2e\x30\x35\x37\ \x2d\x36\x33\x2e\x34\x30\x38\x2c\x31\x33\x32\x2e\x34\x31\x39\x2c\ \x31\x36\x2e\x35\x39\x31\x2c\x36\x35\x2e\x32\x36\x39\x2c\x34\x34\ \x2e\x33\x37\x34\x0a\x09\x09\x43\x31\x30\x34\x2e\x36\x32\x32\x2c\ \x34\x38\x36\x2e\x38\x35\x32\x2c\x38\x2e\x34\x32\x38\x2c\x34\x36\ \x35\x2e\x31\x34\x33\x2c\x34\x38\x2e\x34\x35\x31\x2c\x34\x36\x34\ \x2e\x38\x32\x38\x7a\x22\x2f\x3e\x0a\x09\x3c\x70\x61\x74\x68\x20\ \x64\x3d\x22\x4d\x34\x35\x38\x2e\x38\x35\x37\x2c\x34\x36\x2e\x39\ \x30\x32\x63\x2d\x31\x39\x2e\x34\x31\x37\x2d\x31\x35\x2e\x36\x34\ \x37\x2d\x35\x31\x2e\x35\x39\x32\x2d\x37\x2e\x39\x33\x38\x2d\x37\ \x31\x2e\x38\x36\x34\x2c\x31\x37\x2e\x32\x31\x39\x4c\x31\x38\x31\ \x2e\x36\x34\x35\x2c\x33\x35\x35\x2e\x38\x34\x39\x63\x2d\x32\x30\ \x2e\x32\x37\x32\x2c\x32\x35\x2e\x31\x35\x34\x2d\x32\x30\x2e\x31\ \x37\x31\x2c\x32\x30\x2e\x33\x34\x37\x2d\x30\x2e\x37\x35\x34\x2c\ \x33\x35\x2e\x39\x39\x32\x0a\x09\x09\x63\x31\x39\x2e\x34\x31\x37\ \x2c\x31\x35\x2e\x36\x34\x38\x2c\x31\x34\x2e\x37\x33\x38\x2c\x31\ \x36\x2e\x37\x37\x2c\x33\x35\x2e\x30\x31\x31\x2d\x38\x2e\x33\x38\ \x38\x6c\x32\x34\x31\x2e\x34\x30\x36\x2d\x32\x36\x32\x2e\x36\x36\ \x39\x43\x34\x37\x37\x2e\x35\x38\x31\x2c\x39\x35\x2e\x36\x32\x38\ \x2c\x34\x37\x38\x2e\x32\x37\x35\x2c\x36\x32\x2e\x35\x35\x2c\x34\ \x35\x38\x2e\x38\x35\x37\x2c\x34\x36\x2e\x39\x30\x32\x7a\x20\x4d\ \x34\x30\x36\x2e\x30\x36\x35\x2c\x38\x31\x2e\x38\x32\x35\x0a\x09\ \x09\x63\x30\x2c\x30\x2d\x33\x2d\x33\x2e\x35\x2d\x31\x33\x2d\x31\ \x31\x2e\x35\x63\x31\x35\x2d\x32\x34\x2e\x35\x2c\x34\x34\x2e\x35\ \x2d\x32\x30\x2c\x34\x34\x2e\x35\x2d\x32\x30\x43\x34\x30\x39\x2e\ \x35\x36\x35\x2c\x36\x36\x2e\x38\x32\x35\x2c\x34\x30\x36\x2e\x30\ \x36\x35\x2c\x38\x31\x2e\x38\x32\x35\x2c\x34\x30\x36\x2e\x30\x36\ \x35\x2c\x38\x31\x2e\x38\x32\x35\x7a\x22\x2f\x3e\x0a\x3c\x2f\x67\ \x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x04\x22\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\ \x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\ \x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\ \x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\ \x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\ \x31\x31\x2e\x31\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\ \x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x78\x6d\x6c\x6e\ \x73\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\ \x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\x20\x78\ \x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\x74\x70\ \x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ \x39\x39\x2f\x78\x6c\x69\x6e\x6b\x27\x20\x77\x69\x64\x74\x68\x3d\ \x27\x36\x34\x2e\x30\x30\x30\x31\x70\x74\x27\x20\x68\x65\x69\x67\ \x68\x74\x3d\x27\x36\x34\x70\x74\x27\x20\x76\x69\x65\x77\x42\x6f\ \x78\x3d\x27\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\ \x35\x38\x20\x36\x34\x2e\x30\x30\x30\x31\x20\x36\x34\x27\x3e\x0a\ \x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\x3e\x0a\x3c\ \x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\ \x6e\x73\x6c\x61\x74\x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\ \x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\ \x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\ \x27\x4d\x20\x36\x2e\x30\x32\x32\x35\x20\x33\x32\x2e\x31\x32\x4c\ \x20\x31\x33\x2e\x39\x36\x38\x37\x20\x31\x32\x2e\x39\x33\x36\x31\ \x4c\x20\x35\x38\x2e\x32\x31\x37\x35\x20\x32\x31\x2e\x37\x33\x37\ \x38\x4c\x20\x34\x32\x2e\x37\x34\x34\x35\x20\x34\x31\x2e\x37\x31\ \x31\x39\x4c\x20\x36\x2e\x30\x32\x32\x35\x20\x33\x32\x2e\x31\x32\ \x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\ \x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\ \x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\ \x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\ \x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\ \x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\ \x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\ \x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x32\x2e\x35\x30\x39\x33\x37\ \x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\ \x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\ \x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\ \x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\x36\x32\x36\x34\x29\x27\ \x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x36\x2e\ \x30\x32\x32\x35\x27\x20\x63\x79\x3d\x27\x33\x32\x2e\x31\x32\x27\ \x20\x66\x69\x6c\x6c\x3d\x27\x23\x66\x66\x30\x30\x30\x30\x27\x20\ \x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\ \x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\ \x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x35\x38\x2e\x34\x36\x36\ \x39\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\x28\ \x2e\x39\x39\x36\x32\x36\x34\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\ \x6c\x65\x20\x63\x78\x3d\x27\x31\x33\x2e\x39\x36\x38\x37\x27\x20\ \x63\x79\x3d\x27\x31\x32\x2e\x39\x33\x36\x31\x27\x20\x66\x69\x6c\ \x6c\x3d\x27\x23\x66\x66\x30\x30\x30\x30\x27\x20\x72\x3d\x27\x36\ \x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\ \x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\x6e\ \x73\x6c\x61\x74\x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\ \x37\x2e\x38\x35\x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\x36\ \x32\x36\x34\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\ \x78\x3d\x27\x35\x38\x2e\x32\x31\x37\x35\x27\x20\x63\x79\x3d\x27\ \x32\x31\x2e\x37\x33\x37\x38\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\ \x66\x66\x30\x30\x30\x30\x27\x20\x72\x3d\x27\x36\x2e\x30\x32\x32\ \x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\ \x6e\x73\x66\x6f\x72\x6d\x3d\x27\x74\x72\x61\x6e\x73\x6c\x61\x74\ \x65\x28\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\ \x38\x29\x73\x63\x61\x6c\x65\x28\x2e\x39\x39\x36\x32\x36\x34\x29\ \x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x34\ \x32\x2e\x37\x34\x34\x35\x27\x20\x63\x79\x3d\x27\x34\x31\x2e\x37\ \x31\x31\x39\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x66\x66\x30\x30\ \x30\x30\x27\x20\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\ \x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\ \x3e\ \x00\x00\x02\xab\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x22\x49\x63\x6f\x6e\ \x5f\x35\x5f\x22\x3e\x0a\x09\x3c\x67\x3e\x0a\x09\x09\x3c\x70\x6f\ \x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\x22\x34\x30\ \x35\x2c\x31\x33\x36\x2e\x37\x39\x38\x20\x33\x37\x35\x2e\x32\x30\ \x32\x2c\x31\x30\x37\x20\x32\x35\x36\x2c\x32\x32\x36\x2e\x32\x30\ \x32\x20\x31\x33\x36\x2e\x37\x39\x38\x2c\x31\x30\x37\x20\x31\x30\ \x37\x2c\x31\x33\x36\x2e\x37\x39\x38\x20\x32\x32\x36\x2e\x32\x30\ \x32\x2c\x32\x35\x36\x20\x31\x30\x37\x2c\x33\x37\x35\x2e\x32\x30\ \x32\x20\x31\x33\x36\x2e\x37\x39\x38\x2c\x34\x30\x35\x20\x32\x35\ \x36\x2c\x32\x38\x35\x2e\x37\x39\x38\x20\x0a\x09\x09\x09\x33\x37\ \x35\x2e\x32\x30\x32\x2c\x34\x30\x35\x20\x34\x30\x35\x2c\x33\x37\ \x35\x2e\x32\x30\x32\x20\x32\x38\x35\x2e\x37\x39\x38\x2c\x32\x35\ \x36\x20\x09\x09\x22\x2f\x3e\x0a\x09\x3c\x2f\x67\x3e\x0a\x3c\x2f\ \x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x01\x1c\ \x3c\ \x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\ \x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\ \x30\x2f\x73\x76\x67\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\x32\ \x70\x78\x22\x0a\x20\x20\x20\x20\x20\x76\x69\x65\x77\x42\x6f\x78\ \x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x3e\x0a\ \x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\ \x74\x72\x69\x78\x28\x34\x38\x20\x30\x20\x30\x20\x34\x38\x20\x34\ \x38\x20\x34\x38\x29\x27\x3e\x0a\x20\x20\x3c\x70\x61\x74\x68\x20\ \x64\x3d\x22\x4d\x30\x20\x30\x76\x32\x68\x2e\x35\x63\x30\x2d\x2e\ \x35\x35\x2e\x34\x35\x2d\x31\x20\x31\x2d\x31\x68\x31\x2e\x35\x76\ \x35\x2e\x35\x63\x30\x20\x2e\x32\x38\x2d\x2e\x32\x32\x2e\x35\x2d\ \x2e\x35\x2e\x35\x68\x2d\x2e\x35\x76\x31\x68\x34\x76\x2d\x31\x68\ \x2d\x2e\x35\x63\x2d\x2e\x32\x38\x20\x30\x2d\x2e\x35\x2d\x2e\x32\ \x32\x2d\x2e\x35\x2d\x2e\x35\x76\x2d\x35\x2e\x35\x68\x31\x2e\x35\ \x63\x2e\x35\x35\x20\x30\x20\x31\x20\x2e\x34\x35\x20\x31\x20\x31\ \x68\x2e\x35\x76\x2d\x32\x68\x2d\x38\x7a\x22\x20\x2f\x3e\x0a\x3c\ \x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x03\xdc\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\x74\x79\x6c\x65\ \x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\ \x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\ \x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\ \x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0a\x3c\x67\x3e\x0a\ \x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x31\ \x32\x38\x63\x2d\x38\x31\x2e\x39\x2c\x30\x2d\x31\x34\x35\x2e\x37\ \x2c\x34\x38\x2e\x38\x2d\x32\x32\x34\x2c\x31\x32\x38\x63\x36\x37\ \x2e\x34\x2c\x36\x37\x2e\x37\x2c\x31\x32\x34\x2c\x31\x32\x38\x2c\ \x32\x32\x34\x2c\x31\x32\x38\x63\x39\x39\x2e\x39\x2c\x30\x2c\x31\ \x37\x33\x2e\x34\x2d\x37\x36\x2e\x34\x2c\x32\x32\x34\x2d\x31\x32\ \x36\x2e\x36\x0a\x09\x09\x43\x34\x32\x38\x2e\x32\x2c\x31\x39\x38\ \x2e\x36\x2c\x33\x35\x34\x2e\x38\x2c\x31\x32\x38\x2c\x32\x35\x36\ \x2c\x31\x32\x38\x7a\x20\x4d\x32\x35\x36\x2c\x33\x34\x37\x2e\x33\ \x63\x2d\x34\x39\x2e\x34\x2c\x30\x2d\x38\x39\x2e\x36\x2d\x34\x31\ \x2d\x38\x39\x2e\x36\x2d\x39\x31\x2e\x33\x63\x30\x2d\x35\x30\x2e\ \x34\x2c\x34\x30\x2e\x32\x2d\x39\x31\x2e\x33\x2c\x38\x39\x2e\x36\ \x2d\x39\x31\x2e\x33\x73\x38\x39\x2e\x36\x2c\x34\x31\x2c\x38\x39\ \x2e\x36\x2c\x39\x31\x2e\x33\x0a\x09\x09\x43\x33\x34\x35\x2e\x36\ \x2c\x33\x30\x36\x2e\x34\x2c\x33\x30\x35\x2e\x34\x2c\x33\x34\x37\ \x2e\x33\x2c\x32\x35\x36\x2c\x33\x34\x37\x2e\x33\x7a\x22\x2f\x3e\ \x0a\x09\x3c\x67\x3e\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\ \x22\x4d\x32\x35\x36\x2c\x32\x32\x34\x63\x30\x2d\x37\x2e\x39\x2c\ \x32\x2e\x39\x2d\x31\x35\x2e\x31\x2c\x37\x2e\x36\x2d\x32\x30\x2e\ \x37\x63\x2d\x32\x2e\x35\x2d\x30\x2e\x34\x2d\x35\x2d\x30\x2e\x36\ \x2d\x37\x2e\x36\x2d\x30\x2e\x36\x63\x2d\x32\x38\x2e\x38\x2c\x30\ \x2d\x35\x32\x2e\x33\x2c\x32\x33\x2e\x39\x2d\x35\x32\x2e\x33\x2c\ \x35\x33\x2e\x33\x63\x30\x2c\x32\x39\x2e\x34\x2c\x32\x33\x2e\x35\ \x2c\x35\x33\x2e\x33\x2c\x35\x32\x2e\x33\x2c\x35\x33\x2e\x33\x0a\ \x09\x09\x09\x73\x35\x32\x2e\x33\x2d\x32\x33\x2e\x39\x2c\x35\x32\ \x2e\x33\x2d\x35\x33\x2e\x33\x63\x30\x2d\x32\x2e\x33\x2d\x30\x2e\ \x32\x2d\x34\x2e\x36\x2d\x30\x2e\x34\x2d\x36\x2e\x39\x63\x2d\x35\ \x2e\x35\x2c\x34\x2e\x33\x2d\x31\x32\x2e\x33\x2c\x36\x2e\x39\x2d\ \x31\x39\x2e\x38\x2c\x36\x2e\x39\x43\x32\x37\x30\x2e\x33\x2c\x32\ \x35\x36\x2c\x32\x35\x36\x2c\x32\x34\x31\x2e\x37\x2c\x32\x35\x36\ \x2c\x32\x32\x34\x7a\x22\x2f\x3e\x0a\x09\x3c\x2f\x67\x3e\x0a\x3c\ \x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x03\x3f\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x22\x49\x63\x6f\x6e\ \x5f\x32\x31\x5f\x22\x3e\x0a\x09\x3c\x67\x3e\x0a\x09\x09\x3c\x70\ \x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x31\x35\x32\x63\ \x2d\x35\x37\x2e\x32\x2c\x30\x2d\x31\x30\x34\x2c\x34\x36\x2e\x38\ \x2d\x31\x30\x34\x2c\x31\x30\x34\x73\x34\x36\x2e\x38\x2c\x31\x30\ \x34\x2c\x31\x30\x34\x2c\x31\x30\x34\x73\x31\x30\x34\x2d\x34\x36\ \x2e\x38\x2c\x31\x30\x34\x2d\x31\x30\x34\x53\x33\x31\x33\x2e\x32\ \x2c\x31\x35\x32\x2c\x32\x35\x36\x2c\x31\x35\x32\x7a\x20\x4d\x32\ \x35\x36\x2c\x34\x38\x0a\x09\x09\x09\x43\x31\x34\x31\x2e\x36\x30\ \x31\x2c\x34\x38\x2c\x34\x38\x2c\x31\x34\x31\x2e\x36\x30\x31\x2c\ \x34\x38\x2c\x32\x35\x36\x73\x39\x33\x2e\x36\x30\x31\x2c\x32\x30\ \x38\x2c\x32\x30\x38\x2c\x32\x30\x38\x73\x32\x30\x38\x2d\x39\x33\ \x2e\x36\x30\x31\x2c\x32\x30\x38\x2d\x32\x30\x38\x53\x33\x37\x30\ \x2e\x33\x39\x39\x2c\x34\x38\x2c\x32\x35\x36\x2c\x34\x38\x7a\x20\ \x4d\x32\x35\x36\x2c\x34\x32\x32\x2e\x34\x0a\x09\x09\x09\x63\x2d\ \x39\x31\x2e\x35\x31\x38\x2c\x30\x2d\x31\x36\x36\x2e\x34\x2d\x37\ \x34\x2e\x38\x38\x33\x2d\x31\x36\x36\x2e\x34\x2d\x31\x36\x36\x2e\ \x34\x53\x31\x36\x34\x2e\x34\x38\x32\x2c\x38\x39\x2e\x36\x2c\x32\ \x35\x36\x2c\x38\x39\x2e\x36\x53\x34\x32\x32\x2e\x34\x2c\x31\x36\ \x34\x2e\x34\x38\x32\x2c\x34\x32\x32\x2e\x34\x2c\x32\x35\x36\x53\ \x33\x34\x37\x2e\x35\x31\x38\x2c\x34\x32\x32\x2e\x34\x2c\x32\x35\ \x36\x2c\x34\x32\x32\x2e\x34\x7a\x22\x2f\x3e\x0a\x09\x3c\x2f\x67\ \x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x01\x69\ \x3c\ \x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\ \x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\ \x30\x2f\x73\x76\x67\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\x32\ \x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\ \x20\x35\x31\x32\x20\x35\x31\x32\x22\x3e\x3c\x67\x20\x74\x72\x61\ \x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x32\ \x34\x20\x30\x20\x30\x20\x32\x34\x20\x30\x20\x30\x29\x27\x3e\x3c\ \x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x2e\x33\x34\x20\x31\x35\ \x2e\x36\x36\x41\x37\x2e\x39\x37\x20\x37\x2e\x39\x37\x20\x30\x20\ \x30\x20\x30\x20\x39\x20\x31\x37\x2e\x39\x34\x56\x31\x30\x48\x35\ \x56\x38\x68\x34\x56\x35\x2e\x38\x33\x61\x33\x20\x33\x20\x30\x20\ \x31\x20\x31\x20\x32\x20\x30\x56\x38\x68\x34\x76\x32\x68\x2d\x34\ \x76\x37\x2e\x39\x34\x61\x37\x2e\x39\x37\x20\x37\x2e\x39\x37\x20\ \x30\x20\x30\x20\x30\x20\x34\x2e\x36\x36\x2d\x32\x2e\x32\x38\x6c\ \x2d\x31\x2e\x34\x32\x2d\x31\x2e\x34\x32\x68\x35\x2e\x36\x36\x6c\ \x2d\x32\x2e\x38\x33\x20\x32\x2e\x38\x33\x61\x31\x30\x20\x31\x30\ \x20\x30\x20\x30\x20\x31\x2d\x31\x34\x2e\x31\x34\x20\x30\x4c\x2e\ \x31\x20\x31\x34\x2e\x32\x34\x68\x35\x2e\x36\x36\x6c\x2d\x31\x2e\ \x34\x32\x20\x31\x2e\x34\x32\x7a\x4d\x31\x30\x20\x34\x61\x31\x20\ \x31\x20\x30\x20\x31\x20\x30\x20\x30\x2d\x32\x20\x31\x20\x31\x20\ \x30\x20\x30\x20\x30\x20\x30\x20\x32\x7a\x22\x2f\x3e\x3c\x2f\x67\ \x3e\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x03\xb7\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4d\ \x61\x67\x6e\x69\x66\x79\x69\x6e\x67\x5f\x67\x6c\x61\x73\x73\x22\ \x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\ \x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\ \x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\ \x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\ \x3d\x22\x30\x70\x78\x22\x0a\x09\x20\x79\x3d\x22\x30\x70\x78\x22\ \x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x35\x31\ \x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\ \x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\x6d\x6c\x3a\x73\ \x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\ \x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\ \x61\x74\x72\x69\x78\x28\x32\x34\x20\x30\x20\x30\x20\x32\x34\x20\ \x30\x20\x30\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\ \x4d\x31\x37\x2e\x35\x34\x35\x2c\x31\x35\x2e\x34\x36\x37\x6c\x2d\ \x33\x2e\x37\x37\x39\x2d\x33\x2e\x37\x37\x39\x63\x30\x2e\x35\x37\ \x2d\x30\x2e\x39\x33\x35\x2c\x30\x2e\x38\x39\x38\x2d\x32\x2e\x30\ \x33\x35\x2c\x30\x2e\x38\x39\x38\x2d\x33\x2e\x32\x31\x63\x30\x2d\ \x33\x2e\x34\x31\x37\x2d\x32\x2e\x39\x36\x31\x2d\x36\x2e\x33\x37\ \x37\x2d\x36\x2e\x33\x37\x38\x2d\x36\x2e\x33\x37\x37\x0a\x09\x43\ \x34\x2e\x38\x36\x39\x2c\x32\x2e\x31\x2c\x32\x2e\x31\x2c\x34\x2e\ \x38\x37\x2c\x32\x2e\x31\x2c\x38\x2e\x32\x38\x37\x63\x30\x2c\x33\ \x2e\x34\x31\x36\x2c\x32\x2e\x39\x36\x31\x2c\x36\x2e\x33\x37\x37\ \x2c\x36\x2e\x33\x37\x37\x2c\x36\x2e\x33\x37\x37\x63\x31\x2e\x31\ \x33\x37\x2c\x30\x2c\x32\x2e\x32\x2d\x30\x2e\x33\x30\x39\x2c\x33\ \x2e\x31\x31\x35\x2d\x30\x2e\x38\x34\x34\x6c\x33\x2e\x37\x39\x39\ \x2c\x33\x2e\x38\x30\x31\x0a\x09\x63\x30\x2e\x33\x37\x32\x2c\x30\ \x2e\x33\x37\x31\x2c\x30\x2e\x39\x37\x35\x2c\x30\x2e\x33\x37\x31\ \x2c\x31\x2e\x33\x34\x36\x2c\x30\x6c\x30\x2e\x39\x34\x33\x2d\x30\ \x2e\x39\x34\x33\x43\x31\x38\x2e\x30\x35\x31\x2c\x31\x36\x2e\x33\ \x30\x37\x2c\x31\x37\x2e\x39\x31\x36\x2c\x31\x35\x2e\x38\x33\x38\ \x2c\x31\x37\x2e\x35\x34\x35\x2c\x31\x35\x2e\x34\x36\x37\x7a\x20\ \x4d\x34\x2e\x30\x30\x34\x2c\x38\x2e\x32\x38\x37\x0a\x09\x63\x30\ \x2d\x32\x2e\x33\x36\x36\x2c\x31\x2e\x39\x31\x37\x2d\x34\x2e\x32\ \x38\x33\x2c\x34\x2e\x32\x38\x32\x2d\x34\x2e\x32\x38\x33\x63\x32\ \x2e\x33\x36\x36\x2c\x30\x2c\x34\x2e\x34\x37\x34\x2c\x32\x2e\x31\ \x30\x37\x2c\x34\x2e\x34\x37\x34\x2c\x34\x2e\x34\x37\x34\x63\x30\ \x2c\x32\x2e\x33\x36\x35\x2d\x31\x2e\x39\x31\x38\x2c\x34\x2e\x32\ \x38\x33\x2d\x34\x2e\x32\x38\x33\x2c\x34\x2e\x32\x38\x33\x0a\x09\ \x43\x36\x2e\x31\x31\x31\x2c\x31\x32\x2e\x37\x36\x2c\x34\x2e\x30\ \x30\x34\x2c\x31\x30\x2e\x36\x35\x32\x2c\x34\x2e\x30\x30\x34\x2c\ \x38\x2e\x32\x38\x37\x7a\x22\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\ \x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x00\x6c\ \x3c\ \x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\ \x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\ \x30\x2f\x73\x76\x67\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\ \x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x3e\x3c\x70\x61\x74\x68\ \x20\x64\x3d\x22\x4d\x31\x38\x20\x31\x32\x76\x31\x48\x38\x76\x35\ \x6c\x2d\x36\x2d\x36\x20\x36\x2d\x36\x76\x35\x68\x38\x56\x32\x68\ \x32\x7a\x22\x2f\x3e\x3c\x2f\x73\x76\x67\x3e\ \x00\x00\x02\xee\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\x74\x79\x6c\x65\ \x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\ \x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\ \x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\ \x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0a\x3c\x70\x61\x74\ \x68\x20\x64\x3d\x22\x4d\x34\x31\x37\x2e\x34\x2c\x32\x32\x34\x48\ \x32\x38\x38\x56\x39\x34\x2e\x36\x63\x30\x2d\x31\x36\x2e\x39\x2d\ \x31\x34\x2e\x33\x2d\x33\x30\x2e\x36\x2d\x33\x32\x2d\x33\x30\x2e\ \x36\x63\x2d\x31\x37\x2e\x37\x2c\x30\x2d\x33\x32\x2c\x31\x33\x2e\ \x37\x2d\x33\x32\x2c\x33\x30\x2e\x36\x56\x32\x32\x34\x48\x39\x34\ \x2e\x36\x43\x37\x37\x2e\x37\x2c\x32\x32\x34\x2c\x36\x34\x2c\x32\ \x33\x38\x2e\x33\x2c\x36\x34\x2c\x32\x35\x36\x0a\x09\x63\x30\x2c\ \x31\x37\x2e\x37\x2c\x31\x33\x2e\x37\x2c\x33\x32\x2c\x33\x30\x2e\ \x36\x2c\x33\x32\x48\x32\x32\x34\x76\x31\x32\x39\x2e\x34\x63\x30\ \x2c\x31\x36\x2e\x39\x2c\x31\x34\x2e\x33\x2c\x33\x30\x2e\x36\x2c\ \x33\x32\x2c\x33\x30\x2e\x36\x63\x31\x37\x2e\x37\x2c\x30\x2c\x33\ \x32\x2d\x31\x33\x2e\x37\x2c\x33\x32\x2d\x33\x30\x2e\x36\x56\x32\ \x38\x38\x68\x31\x32\x39\x2e\x34\x63\x31\x36\x2e\x39\x2c\x30\x2c\ \x33\x30\x2e\x36\x2d\x31\x34\x2e\x33\x2c\x33\x30\x2e\x36\x2d\x33\ \x32\x0a\x09\x43\x34\x34\x38\x2c\x32\x33\x38\x2e\x33\x2c\x34\x33\ \x34\x2e\x33\x2c\x32\x32\x34\x2c\x34\x31\x37\x2e\x34\x2c\x32\x32\ \x34\x7a\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ \x00\x00\x05\x16\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ \x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\ \x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\ \x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\x20\ \x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\ \x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\ \x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\ \x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\ \x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\ \x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\ \x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ \x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\ \x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\ \x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\ \x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\ \x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\ \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ \x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\ \x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ \x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ \x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\ \x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\x68\x3d\x22\x35\ \x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\ \x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ \x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\ \x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\ \x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\ \x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\ \x76\x65\x22\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x22\x49\x63\x6f\x6e\ \x5f\x31\x32\x5f\x22\x3e\x0a\x09\x3c\x67\x3e\x0a\x09\x09\x3c\x70\ \x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x36\x34\x43\x31\ \x35\x30\x2e\x34\x30\x31\x2c\x36\x34\x2c\x36\x34\x2c\x31\x35\x30\ \x2e\x34\x30\x31\x2c\x36\x34\x2c\x32\x35\x36\x63\x30\x2c\x31\x30\ \x35\x2e\x36\x30\x34\x2c\x38\x36\x2e\x34\x30\x31\x2c\x31\x39\x32\ \x2c\x31\x39\x32\x2c\x31\x39\x32\x63\x31\x38\x2e\x31\x33\x36\x2c\ \x30\x2c\x33\x32\x2d\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\x2d\x33\ \x32\x0a\x09\x09\x09\x63\x30\x2d\x38\x2e\x35\x33\x31\x2d\x33\x2e\ \x31\x39\x38\x2d\x31\x36\x2d\x38\x2e\x35\x33\x31\x2d\x32\x31\x2e\ \x33\x33\x33\x63\x2d\x35\x2e\x33\x33\x33\x2d\x35\x2e\x33\x33\x34\ \x2d\x38\x2e\x35\x33\x31\x2d\x31\x32\x2e\x38\x30\x33\x2d\x38\x2e\ \x35\x33\x31\x2d\x32\x31\x2e\x33\x33\x34\x63\x30\x2d\x31\x38\x2e\ \x31\x33\x35\x2c\x31\x33\x2e\x38\x36\x34\x2d\x33\x32\x2c\x33\x32\ \x2d\x33\x32\x68\x33\x38\x2e\x33\x39\x36\x0a\x09\x09\x09\x63\x35\ \x38\x2e\x36\x36\x37\x2c\x30\x2c\x31\x30\x36\x2e\x36\x36\x37\x2d\ \x34\x38\x2c\x31\x30\x36\x2e\x36\x36\x37\x2d\x31\x30\x36\x2e\x36\ \x36\x36\x43\x34\x34\x38\x2c\x31\x34\x30\x2e\x38\x30\x32\x2c\x33\ \x36\x31\x2e\x36\x30\x34\x2c\x36\x34\x2c\x32\x35\x36\x2c\x36\x34\ \x7a\x20\x4d\x31\x33\x38\x2e\x36\x36\x37\x2c\x32\x35\x36\x63\x2d\ \x31\x38\x2e\x31\x33\x36\x2c\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\ \x36\x34\x2d\x33\x32\x2d\x33\x32\x73\x31\x33\x2e\x38\x36\x34\x2d\ \x33\x32\x2c\x33\x32\x2d\x33\x32\x0a\x09\x09\x09\x63\x31\x38\x2e\ \x31\x33\x35\x2c\x30\x2c\x33\x32\x2c\x31\x33\x2e\x38\x36\x34\x2c\ \x33\x32\x2c\x33\x32\x53\x31\x35\x36\x2e\x38\x30\x32\x2c\x32\x35\ \x36\x2c\x31\x33\x38\x2e\x36\x36\x37\x2c\x32\x35\x36\x7a\x20\x4d\ \x32\x30\x32\x2e\x36\x36\x37\x2c\x31\x37\x30\x2e\x36\x36\x37\x63\ \x2d\x31\x38\x2e\x31\x33\x36\x2c\x30\x2d\x33\x32\x2d\x31\x33\x2e\ \x38\x36\x35\x2d\x33\x32\x2d\x33\x32\x63\x30\x2d\x31\x38\x2e\x31\ \x33\x36\x2c\x31\x33\x2e\x38\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\ \x33\x32\x0a\x09\x09\x09\x63\x31\x38\x2e\x31\x33\x35\x2c\x30\x2c\ \x33\x32\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x43\ \x32\x33\x34\x2e\x36\x36\x37\x2c\x31\x35\x36\x2e\x38\x30\x32\x2c\ \x32\x32\x30\x2e\x38\x30\x32\x2c\x31\x37\x30\x2e\x36\x36\x37\x2c\ \x32\x30\x32\x2e\x36\x36\x37\x2c\x31\x37\x30\x2e\x36\x36\x37\x7a\ \x20\x4d\x33\x30\x39\x2e\x33\x33\x33\x2c\x31\x37\x30\x2e\x36\x36\ \x37\x63\x2d\x31\x38\x2e\x31\x33\x35\x2c\x30\x2d\x33\x32\x2d\x31\ \x33\x2e\x38\x36\x35\x2d\x33\x32\x2d\x33\x32\x0a\x09\x09\x09\x63\ \x30\x2d\x31\x38\x2e\x31\x33\x36\x2c\x31\x33\x2e\x38\x36\x35\x2d\ \x33\x32\x2c\x33\x32\x2d\x33\x32\x63\x31\x38\x2e\x31\x33\x36\x2c\ \x30\x2c\x33\x32\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\ \x32\x43\x33\x34\x31\x2e\x33\x33\x33\x2c\x31\x35\x36\x2e\x38\x30\ \x32\x2c\x33\x32\x37\x2e\x34\x36\x39\x2c\x31\x37\x30\x2e\x36\x36\ \x37\x2c\x33\x30\x39\x2e\x33\x33\x33\x2c\x31\x37\x30\x2e\x36\x36\ \x37\x7a\x20\x4d\x33\x37\x33\x2e\x33\x33\x33\x2c\x32\x35\x36\x0a\ \x09\x09\x09\x63\x2d\x31\x38\x2e\x31\x33\x35\x2c\x30\x2d\x33\x32\ \x2d\x31\x33\x2e\x38\x36\x34\x2d\x33\x32\x2d\x33\x32\x73\x31\x33\ \x2e\x38\x36\x35\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x63\x31\x38\ \x2e\x31\x33\x36\x2c\x30\x2c\x33\x32\x2c\x31\x33\x2e\x38\x36\x34\ \x2c\x33\x32\x2c\x33\x32\x53\x33\x39\x31\x2e\x34\x36\x39\x2c\x32\ \x35\x36\x2c\x33\x37\x33\x2e\x33\x33\x33\x2c\x32\x35\x36\x7a\x22\ \x2f\x3e\x0a\x09\x3c\x2f\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\ \x73\x76\x67\x3e\x0a\ " qt_resource_name = b"\ \x00\x05\ \x00\x6f\xa6\x53\ \x00\x69\ \x00\x63\x00\x6f\x00\x6e\x00\x73\ \x00\x11\ \x01\x60\xbc\x47\ \x00\x73\ \x00\x6f\x00\x63\x00\x69\x00\x61\x00\x6c\x00\x2d\x00\x70\x00\x79\x00\x74\x00\x68\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\ \ \x00\x0a\ \x01\xca\x6d\x87\ \x00\x62\ \x00\x75\x00\x63\x00\x6b\x00\x65\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x16\ \x01\xfb\x76\x27\ \x00\x61\ \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x61\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x62\x00\x61\x00\x63\ \x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x13\ \x03\x24\x75\x47\ \x00\x61\ \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x65\x00\x66\x00\x72\x00\x65\x00\x73\x00\x68\x00\x2e\x00\x73\ \x00\x76\x00\x67\ \x00\x1c\ \x04\x66\xe1\x67\ \x00\x63\ \x00\x68\x00\x65\x00\x76\x00\x72\x00\x6f\x00\x6e\x00\x2d\x00\x77\x00\x69\x00\x74\x00\x68\x00\x2d\x00\x63\x00\x69\x00\x72\x00\x63\ \x00\x6c\x00\x65\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x10\ \x04\xa9\x22\xc7\ \x00\x66\ \x00\x69\x00\x6c\x00\x6c\x00\x65\x00\x64\x00\x62\x00\x75\x00\x63\x00\x6b\x00\x65\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x12\ \x04\xb2\x21\x47\ \x00\x61\ \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x65\x00\x78\x00\x70\x00\x61\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\ \x00\x67\ \x00\x08\ \x04\xb2\x55\x47\ \x00\x75\ \x00\x6e\x00\x64\x00\x6f\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x0f\ \x04\xf2\xa7\x87\ \x00\x63\ \x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x64\x00\x63\x00\x75\x00\x72\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x0d\ \x05\x20\xce\x87\ \x00\x6f\ \x00\x70\x00\x65\x00\x6e\x00\x63\x00\x75\x00\x72\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x08\ \x05\xa8\x57\x87\ \x00\x63\ \x00\x6f\x00\x64\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x0e\ \x05\xed\x38\x67\ \x00\x61\ \x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x6d\x00\x6f\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x17\ \x06\xc6\x02\xa7\ \x00\x74\ \x00\x72\x00\x69\x00\x61\x00\x6e\x00\x67\x00\x6c\x00\x65\x00\x2d\x00\x73\x00\x74\x00\x72\x00\x6f\x00\x6b\x00\x65\x00\x64\x00\x2d\ \x00\x31\x00\x35\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x10\ \x06\xe3\xaf\xe7\ \x00\x61\ \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x68\x00\x61\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x1d\ \x06\xec\xf4\xc7\ \x00\x63\ \x00\x68\x00\x65\x00\x76\x00\x72\x00\x6f\x00\x6e\x00\x2d\x00\x77\x00\x69\x00\x74\x00\x68\x00\x2d\x00\x63\x00\x69\x00\x72\x00\x63\ \x00\x6c\x00\x65\x00\x2d\x00\x72\x00\x69\x00\x67\x00\x68\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x0f\ \x07\x0e\xc4\x87\ \x00\x6f\ \x00\x70\x00\x65\x00\x6e\x00\x70\x00\x6f\x00\x6c\x00\x79\x00\x67\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x17\ \x07\x87\x48\x27\ \x00\x61\ \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x66\x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2d\x00\x6f\x00\x70\ \x00\x65\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x12\ \x08\x55\xef\xc7\ \x00\x61\ \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x64\x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\ \x00\x67\ \x00\x12\ \x08\x79\x97\xe7\ \x00\x61\ \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x63\x00\x61\x00\x6d\x00\x65\x00\x72\x00\x61\x00\x2e\x00\x73\x00\x76\ \x00\x67\ \x00\x10\ \x08\x89\xfa\x47\ \x00\x63\ \x00\x65\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x6f\x00\x72\x00\x69\x00\x67\x00\x69\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x1c\ \x08\x8a\x79\x07\ \x00\x61\ \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x61\x00\x64\x00\x69\x00\x6f\x00\x2d\x00\x62\x00\x75\x00\x74\ \x00\x74\x00\x6f\x00\x6e\x00\x2d\x00\x6f\x00\x66\x00\x66\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x08\ \x08\xc8\x55\xe7\ \x00\x73\ \x00\x61\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x10\ \x08\xe4\xaf\x47\ \x00\x61\ \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x64\x00\x6f\x00\x6e\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x08\ \x08\xf7\x57\x07\ \x00\x67\ \x00\x72\x00\x69\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x0f\ \x09\x76\x60\xc7\ \x00\x63\ \x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x2d\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x0a\ \x0a\x2d\x1b\xc7\ \x00\x63\ \x00\x69\x00\x72\x00\x63\x00\x6c\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x19\ \x0a\x43\x45\xc7\ \x00\x61\ \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x61\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x66\x00\x6f\x00\x72\ \x00\x77\x00\x61\x00\x72\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x0a\ \x0a\xc8\x62\x67\ \x00\x63\ \x00\x65\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x08\ \x0b\x07\x57\xa7\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x09\ \x0b\x9e\x89\x07\ \x00\x63\ \x00\x68\x00\x65\x00\x63\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x08\ \x0b\xb2\x55\xc7\ \x00\x72\ \x00\x65\x00\x64\x00\x6f\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x10\ \x0c\x57\x65\x47\ \x00\x61\ \x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x72\x00\x65\x00\x73\x00\x69\x00\x7a\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x12\ \x0c\x5e\xd4\xa7\ \x00\x61\ \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x6c\x00\x6f\x00\x63\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\ \x00\x67\ \x00\x09\ \x0c\x9b\x89\xe7\ \x00\x62\ \x00\x72\x00\x75\x00\x73\x00\x68\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x11\ \x0c\xa7\xc7\x47\ \x00\x63\ \x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x64\x00\x70\x00\x6f\x00\x6c\x00\x79\x00\x67\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\ \ \x00\x11\ \x0c\xdb\x38\xe7\ \x00\x61\ \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x63\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ \ \x00\x08\ \x0c\xf7\x55\x87\ \x00\x74\ \x00\x65\x00\x78\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x07\ \x0c\xf8\x5a\x07\ \x00\x65\ \x00\x79\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x1b\ \x0e\xb5\x68\xe7\ \x00\x61\ \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x61\x00\x64\x00\x69\x00\x6f\x00\x2d\x00\x62\x00\x75\x00\x74\ \x00\x74\x00\x6f\x00\x6e\x00\x2d\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x0a\ \x0f\x68\x53\xe7\ \x00\x61\ \x00\x6e\x00\x63\x00\x68\x00\x6f\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x14\ \x0f\xa5\xe0\xc7\ \x00\x6d\ \x00\x61\x00\x67\x00\x6e\x00\x69\x00\x66\x00\x79\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x67\x00\x6c\x00\x61\x00\x73\x00\x73\x00\x2e\ \x00\x73\x00\x76\x00\x67\ \x00\x15\ \x0f\xc4\x59\xe7\ \x00\x73\ \x00\x75\x00\x62\x00\x64\x00\x69\x00\x72\x00\x65\x00\x63\x00\x74\x00\x6f\x00\x72\x00\x79\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\ \x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x0e\ \x0f\xcb\xd5\xc7\ \x00\x70\ \x00\x6c\x00\x75\x00\x73\x00\x2d\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x19\ \x0f\xef\x7b\xe7\ \x00\x61\ \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x63\x00\x6f\x00\x6c\x00\x6f\x00\x72\x00\x2d\x00\x70\x00\x61\x00\x6c\ \x00\x65\x00\x74\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ " qt_resource_struct_v1 = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x2c\x00\x00\x00\x02\ \x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x00\x38\x00\x00\x00\x00\x00\x01\x00\x00\x07\x6f\ \x00\x00\x00\x52\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x0f\ \x00\x00\x00\x84\x00\x00\x00\x00\x00\x01\x00\x00\x0f\x85\ \x00\x00\x00\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x12\xa4\ \x00\x00\x00\xee\x00\x01\x00\x00\x00\x01\x00\x00\x16\x90\ \x00\x00\x01\x14\x00\x00\x00\x00\x00\x01\x00\x00\x18\xb3\ \x00\x00\x01\x3e\x00\x00\x00\x00\x00\x01\x00\x00\x1b\xe1\ \x00\x00\x01\x54\x00\x00\x00\x00\x00\x01\x00\x00\x1f\xfc\ \x00\x00\x01\x78\x00\x00\x00\x00\x00\x01\x00\x00\x24\xa3\ \x00\x00\x01\x98\x00\x00\x00\x00\x00\x01\x00\x00\x29\x1a\ \x00\x00\x01\xae\x00\x00\x00\x00\x00\x01\x00\x00\x2d\xba\ \x00\x00\x01\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x30\x7f\ \x00\x00\x02\x04\x00\x00\x00\x00\x00\x01\x00\x00\x35\x4d\ \x00\x00\x02\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x3b\x0c\ \x00\x00\x02\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x3e\xe9\ \x00\x00\x02\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x43\x00\ \x00\x00\x02\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x46\x4c\ \x00\x00\x02\xec\x00\x00\x00\x00\x00\x01\x00\x00\x48\xe8\ \x00\x00\x03\x16\x00\x00\x00\x00\x00\x01\x00\x00\x4c\x02\ \x00\x00\x03\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x50\x04\ \x00\x00\x03\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x52\xf8\ \x00\x00\x03\x90\x00\x00\x00\x00\x00\x01\x00\x00\x55\x93\ \x00\x00\x03\xb6\x00\x01\x00\x00\x00\x01\x00\x00\x58\x03\ \x00\x00\x03\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x59\xe4\ \x00\x00\x03\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x5d\x25\ \x00\x00\x04\x0a\x00\x00\x00\x00\x00\x01\x00\x00\x60\x10\ \x00\x00\x04\x42\x00\x00\x00\x00\x00\x01\x00\x00\x62\x86\ \x00\x00\x04\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x65\xe4\ \x00\x00\x04\x72\x00\x00\x00\x00\x00\x01\x00\x00\x69\x47\ \x00\x00\x04\x8a\x00\x00\x00\x00\x00\x01\x00\x00\x6c\x4e\ \x00\x00\x04\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x70\x94\ \x00\x00\x04\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x73\x0f\ \x00\x00\x04\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x77\x67\ \x00\x00\x05\x08\x00\x00\x00\x00\x00\x01\x00\x00\x7b\x45\ \x00\x00\x05\x30\x00\x00\x00\x00\x00\x01\x00\x00\x7f\x6b\ \x00\x00\x05\x58\x00\x00\x00\x00\x00\x01\x00\x00\x82\x1a\ \x00\x00\x05\x6e\x00\x00\x00\x00\x00\x01\x00\x00\x83\x3a\ \x00\x00\x05\x82\x00\x00\x00\x00\x00\x01\x00\x00\x87\x1a\ \x00\x00\x05\xbe\x00\x00\x00\x00\x00\x01\x00\x00\x8a\x5d\ \x00\x00\x05\xd8\x00\x00\x00\x00\x00\x01\x00\x00\x8b\xca\ \x00\x00\x06\x06\x00\x00\x00\x00\x00\x01\x00\x00\x8f\x85\ \x00\x00\x06\x36\x00\x00\x00\x00\x00\x01\x00\x00\x8f\xf5\ \x00\x00\x06\x58\x00\x00\x00\x00\x00\x01\x00\x00\x92\xe7\ " qt_resource_struct_v2 = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x2c\x00\x00\x00\x02\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x00\x38\x00\x00\x00\x00\x00\x01\x00\x00\x07\x6f\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x00\x52\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x0f\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x00\x84\x00\x00\x00\x00\x00\x01\x00\x00\x0f\x85\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x00\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x12\xa4\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x00\xee\x00\x01\x00\x00\x00\x01\x00\x00\x16\x90\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x01\x14\x00\x00\x00\x00\x00\x01\x00\x00\x18\xb3\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x01\x3e\x00\x00\x00\x00\x00\x01\x00\x00\x1b\xe1\ \x00\x00\x01\x97\xd2\x0a\xee\x34\ \x00\x00\x01\x54\x00\x00\x00\x00\x00\x01\x00\x00\x1f\xfc\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x01\x78\x00\x00\x00\x00\x00\x01\x00\x00\x24\xa3\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x01\x98\x00\x00\x00\x00\x00\x01\x00\x00\x29\x1a\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x01\xae\x00\x00\x00\x00\x00\x01\x00\x00\x2d\xba\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x01\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x30\x7f\ \x00\x00\x01\x97\xd2\x0a\xee\x34\ \x00\x00\x02\x04\x00\x00\x00\x00\x00\x01\x00\x00\x35\x4d\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x02\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x3b\x0c\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x02\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x3e\xe9\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x02\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x43\x00\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x02\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x46\x4c\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x02\xec\x00\x00\x00\x00\x00\x01\x00\x00\x48\xe8\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x03\x16\x00\x00\x00\x00\x00\x01\x00\x00\x4c\x02\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x03\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x50\x04\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x03\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x52\xf8\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x03\x90\x00\x00\x00\x00\x00\x01\x00\x00\x55\x93\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x03\xb6\x00\x01\x00\x00\x00\x01\x00\x00\x58\x03\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x03\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x59\xe4\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x03\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x5d\x25\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x04\x0a\x00\x00\x00\x00\x00\x01\x00\x00\x60\x10\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x04\x42\x00\x00\x00\x00\x00\x01\x00\x00\x62\x86\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x04\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x65\xe4\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x04\x72\x00\x00\x00\x00\x00\x01\x00\x00\x69\x47\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x04\x8a\x00\x00\x00\x00\x00\x01\x00\x00\x6c\x4e\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x04\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x70\x94\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x04\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x73\x0f\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x04\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x77\x67\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x05\x08\x00\x00\x00\x00\x00\x01\x00\x00\x7b\x45\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x05\x30\x00\x00\x00\x00\x00\x01\x00\x00\x7f\x6b\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x05\x58\x00\x00\x00\x00\x00\x01\x00\x00\x82\x1a\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x05\x6e\x00\x00\x00\x00\x00\x01\x00\x00\x83\x3a\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x05\x82\x00\x00\x00\x00\x00\x01\x00\x00\x87\x1a\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x05\xbe\x00\x00\x00\x00\x00\x01\x00\x00\x8a\x5d\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ \x00\x00\x05\xd8\x00\x00\x00\x00\x00\x01\x00\x00\x8b\xca\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x06\x06\x00\x00\x00\x00\x00\x01\x00\x00\x8f\x85\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x06\x36\x00\x00\x00\x00\x00\x01\x00\x00\x8f\xf5\ \x00\x00\x01\x97\xd2\x0a\xee\x33\ \x00\x00\x06\x58\x00\x00\x00\x00\x00\x01\x00\x00\x92\xe7\ \x00\x00\x01\x97\xd2\x0a\xee\x32\ " qt_version = [int(v) for v in QtCore.qVersion().split('.')] if qt_version < [5, 8, 0]: rcc_version = 1 qt_resource_struct = qt_resource_struct_v1 else: rcc_version = 2 qt_resource_struct = qt_resource_struct_v2 def qInitResources(): QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) def qCleanupResources(): QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) qInitResources() asymptote-3.05/GUI/xasyicons/__init__.py0000644000000000000000000000000015031566355016740 0ustar rootrootasymptote-3.05/GUI/ContextWindow.py0000644000000000000000000003223215031566105016002 0ustar rootroot#!/usr/bin/env python3 import PyQt5.QtWidgets as Qw import PyQt5.QtGui as Qg import PyQt5.QtCore as Qc import xasy2asy as x2a from xasyTransform import xasyTransform as xT class AnotherWindow(Qw.QWidget): def __init__(self, shape, parent): super().__init__() self.shape = shape self.parent = parent self.newShape = self.shape self.layout = Qw.QVBoxLayout(self) # Initialize tab screen self.tabs = Qw.QTabWidget() self.fillTab = Qw.QWidget() self.lineTab = Qw.QWidget() self.arrowTab = Qw.QWidget() self.othersTab = Qw.QWidget() self.tabs.resize(300,200) self.fillTab.layout = Qw.QVBoxLayout(self.fillTab) self.lineTab.layout = Qw.QVBoxLayout(self.lineTab) self.arrowTab.layout = Qw.QVBoxLayout(self.arrowTab) self.othersTab.layout = Qw.QVBoxLayout(self.othersTab) self.tabs.addTab(self.fillTab,"Fill Options") self.tabs.addTab(self.lineTab,"Line Options") self.tabs.addTab(self.arrowTab,"Arrow Options") self.tabs.addTab(self.othersTab,"Misc. Options") self.layout.addWidget(self.tabs) self.setLayout(self.layout) self.setWindowTitle("Shape Options Window") self.label = Qw.QLabel("Fill:") self.fillTab.layout.addWidget(self.label) self.fillButton = Qw.QComboBox() self.fillButton.addItem("Unfilled") self.fillButton.addItem("Filled") self.fillButton.currentIndexChanged.connect(self.fillChange) self.fillTab.layout.addWidget(self.fillButton) if isinstance(self.shape, x2a.asyArrow): self.colorButton = Qw.QPushButton("Set Line Colour") self.colorButton.clicked.connect(self.pickColor) self.fillTab.layout.addWidget(self.colorButton) self.colorButton = Qw.QPushButton("Set Fill Colour") self.colorButton.clicked.connect(self.pickFillColor) self.fillTab.layout.addWidget(self.colorButton) elif isinstance(self.shape, x2a.xasyShape): self.colorButton = Qw.QPushButton("Set Colour") self.colorButton.clicked.connect(self.pickColor) self.fillTab.layout.addWidget(self.colorButton) self.label = Qw.QLabel("Reflection:") self.othersTab.layout.addWidget(self.label) self.reflectionButton = Qw.QComboBox() self.reflectionButton.addItem("None") self.reflectionButton.addItem("Horizontal") self.reflectionButton.addItem("Vertical") self.reflectionButton.currentIndexChanged.connect(self.reflectionChange) self.othersTab.layout.addWidget(self.reflectionButton) self.label = Qw.QLabel("Opacity:") self.othersTab.layout.addWidget(self.label) self.opacityBox = Qw.QLineEdit() self.othersTab.layout.addWidget(self.opacityBox) self.opacityBox.setPlaceholderText(str(self.shape.pen.opacity)) self.label = Qw.QLabel("Arrowhead:") self.arrowTab.layout.addWidget(self.label) self.arrowheadButton = Qw.QComboBox() self.arrowList = ["None","Arrow","ArcArrow"] for arrowMode in self.arrowList: self.arrowheadButton.addItem(arrowMode) self.arrowheadButton.currentIndexChanged.connect(self.arrowheadChange) self.arrowTab.layout.addWidget(self.arrowheadButton) self.label = Qw.QLabel("Line Style:") self.lineTab.layout.addWidget(self.label) self.linestyleButton = Qw.QComboBox() self.lineList = ["solid","dashed","dotted","dashdotted"] for lineMode in self.lineList: self.linestyleButton.addItem(lineMode) self.linestyleButton.currentIndexChanged.connect(self.linestyleChange) self.lineTab.layout.addWidget(self.linestyleButton) self.linestyleButton.setCurrentIndex(self.lineList.index(self.shape.pen.style)) self.label = Qw.QLabel("Line Cap Style:") self.lineTab.layout.addWidget(self.label) self.lineCapStyleButton = Qw.QComboBox() self.lineCapListStrings = ["extendcap","flatcap","roundcap"] #Is there a way to pull these directly self.lineCapList = [Qc.Qt.PenCapStyle.SquareCap,Qc.Qt.PenCapStyle.FlatCap,Qc.Qt.PenCapStyle.RoundCap] for lineMode in self.lineCapListStrings: self.lineCapStyleButton.addItem(lineMode) self.lineCapStyleButton.currentIndexChanged.connect(self.lineCapStyleChange) self.lineTab.layout.addWidget(self.lineCapStyleButton) self.lineCapStyleButton.setCurrentIndex(self.lineCapList.index(self.shape.pen.capStyle)) #TODO: Make this a function. if not isinstance(self.shape, x2a.xasyShape): self.fillButton.setCurrentIndex(int(self.shape.arrowSettings["fill"])) if isinstance(self.shape, x2a.asyArrow): self.arrowheadButton.setCurrentIndex(int(self.shape.arrowSettings["active"])) else: self.arrowheadButton.setDisabled(True) else: self.fillButton.setCurrentIndex(int(self.shape.path.fill)) if isinstance(self.shape, x2a.asyArrow) and self.shape.arrowSettings["active"]: #Make these all a list or something. self.label = Qw.QLabel("Arrow Style:") self.arrowTab.layout.addWidget(self.label) self.arrowstyleButton = Qw.QComboBox() for arrowStyle in self.shape.arrowStyleList: self.arrowstyleButton.addItem(arrowStyle if arrowStyle else "(default)") self.arrowstyleButton.currentIndexChanged.connect(self.arrowstyleChange) self.arrowTab.layout.addWidget(self.arrowstyleButton) self.label = Qw.QLabel("Arrow Size:") self.arrowTab.layout.addWidget(self.label) self.arrowSizeBox = Qw.QLineEdit() self.arrowTab.layout.addWidget(self.arrowSizeBox) self.arrowSizeBox.setPlaceholderText(self.getInfo("DefaultHead.size(currentpen)")) self.label = Qw.QLabel("Arrow Angle:") self.arrowTab.layout.addWidget(self.label) self.arrowAngleBox = Qw.QLineEdit() self.arrowTab.layout.addWidget(self.arrowAngleBox) self.arrowAngleBox.setPlaceholderText(self.getInfo("arrowangle")) self.label = Qw.QLabel("Arrow Fill:") self.arrowTab.layout.addWidget(self.label) self.arrowFillButton = Qw.QComboBox() for arrowFillStyle in self.shape.arrowFillList: self.arrowFillButton.addItem(arrowFillStyle if arrowFillStyle else "(default)") self.arrowFillButton.currentIndexChanged.connect(self.arrowFillChange) self.arrowTab.layout.addWidget(self.arrowFillButton) self.arrowstyleButton.setCurrentIndex(int(self.shape.arrowSettings["style"])) self.arrowFillButton.setCurrentIndex(int(self.shape.arrowSettings["fill"])) self.fillTab.setLayout(self.fillTab.layout) self.lineTab.setLayout(self.lineTab.layout) self.arrowTab.setLayout(self.arrowTab.layout) self.othersTab.setLayout(self.othersTab.layout) self.confirmButton = Qw.QPushButton("Render") self.confirmButton.clicked.connect(self.renderChanges) self.layout.addWidget(self.confirmButton) def arrowheadChange(self, i): #None, {Arrow, ArcArrow} x {(),(SimpleHead),(HookHead),(TeXHead)} if isinstance(self.shape, x2a.xasyShape): if i != 0: if isinstance(self.newShape,x2a.asyArrow): self.newShape.arrowSettings["active"] = i else: self.newShape = self.shape.arrowify(arrowhead=i) else: self.newShape.arrowSettings["active"] = i #Simplify the logic def arrowstyleChange(self, i): self.newShape.arrowSettings["style"] = i def linestyleChange(self, i): #I think add an attribute to asyPen self.shape.pen.setStyle(self.lineList[i]) def lineCapStyleChange(self, i): #I think add an attribute to asyPen self.shape.pen.setCapStyle(self.lineCapList[i]) def fillChange(self, i): if isinstance(self.shape, x2a.asyArrow): self.shape.arrowSettings["fill"] = bool(i) elif (self.shape.path.fill != bool(i)) and not isinstance(self.newShape, x2a.asyArrow): if self.newShape: self.newShape = self.newShape.swapFill() if isinstance(self.newShape, x2a.asyArrow): self.newShape.arrowSettings["fill"] = bool(i) def reflectionChange(self, i): #TODO: Modernize this. reflectionList = [[1,1],[1,-1],[-1,1]] self.parent.newTransform = xT.makeScaleTransform(*reflectionList[i], self.parent.currentAnchor).toQTransform() self.parent.currentlySelectedObj['selectedIndex'] = self.parent.mostRecentObject self.parent.releaseTransform() self.parent.newTransform = Qg.QTransform() def sizeChange(self): try: newSize = self.arrowSizeBox.text() self.newShape.arrowSettings["size"] = float(newSize) except: return #TODO: Show error message. def angleChange(self): #Refactor this with the above. try: newAngle = self.arrowAngleBox.text() self.newShape.arrowSettings["angle"] = float(newAngle) except: return #TODO: Show error message. def arrowFillChange(self, i): #Can I lambda this? self.newShape.arrowSettings["fill"] = i def opacityChange(self): newOpacity = self.opacityBox.text() try: newOpacity = int(newOpacity) if newOpacity >= 0 and newOpacity <= 255: self.shape.pen.setOpacity(newOpacity) self.newShape.pen.setOpacity(newOpacity) except: pass def renderChanges(self): #Pull from text boxes here. self.opacityChange() if isinstance(self.shape, x2a.asyArrow) and self.shape.arrowSettings["active"]: self.sizeChange() self.angleChange() elif (not isinstance(self.shape, x2a.asyArrow)): self.renderLineStyle() if self.newShape: self.parent.replaceObject(self.parent.contextWindowObject,self.newShape) self.parent.terminateContextWindow() def getInfo(self,value): """ Find out the size of an arbitrary Asymptote pen """ self.asyEngine = self.parent.asyEngine assert isinstance(self.asyEngine, x2a.AsymptoteEngine) assert self.asyEngine.active fout = self.asyEngine.ostream fin = self.asyEngine.istream fout.write("write(_outpipe,{},endl);\n".format(value)) fout.write(self.asyEngine.xasy) fout.flush() return fin.readline() def getPattern(self,pattern,path): """ Find out the adjusted pattern of an Asymptote pen """ self.asyEngine = self.parent.asyEngine assert isinstance(self.asyEngine, x2a.AsymptoteEngine) assert self.asyEngine.active fout = self.asyEngine.ostream fin = self.asyEngine.istream #fout.write("pen p=adjust({pattern},arclength({path}),cyclic({path}));\n") #print(f"write(_outpipe,adjust({pattern},arclength({path}),cyclic({path})),endl);\n") fout.write(f"write(_outpipe,adjust({pattern},arclength({path}),cyclic({path})),endl);\n") fout.write(self.asyEngine.xasy) fout.flush() return fin.readline() def renderLineStyle(self): #Should only get called with asy shapes if not self.newShape: self.newShape=self.shape if not isinstance(self.newShape,x2a.asyArrow): rawPattern = self.getPattern(self.lineList[self.linestyleButton.currentIndex()],self.newShape.path.getCode()) else: #self.newShape.updateCode() #idk if this is necessary. rawPattern = self.getPattern(self.lineList[self.linestyleButton.currentIndex()],self.newShape.code) pattern = [] if len(rawPattern) == 5: pattern=[1,0] else: for value in rawPattern[2:-3].split(' '): pattern.append(float(value)+1) try: self.newShape.pen.setDashPattern(pattern) #pen is going to be a asyPen, add as an attribute except: print("Pen format error") def pickColor(self): self.colorDialog = Qw.QColorDialog(x2a.asyPen.convertToQColor(self.shape.pen.color), self) self.colorDialog.show() result = self.colorDialog.exec() if result == Qw.QDialog.Accepted: self.shape.pen.setColorFromQColor(self.colorDialog.selectedColor()) self.parent.updateFrameDispColor() def pickFillColor(self): #This is a copy of the above, how do you set the var as it is set? self.colorDialog = Qw.QColorDialog(x2a.asyPen.convertToQColor(self.shape.fillPen.color), self) self.colorDialog.show() result = self.colorDialog.exec() if result == Qw.QDialog.Accepted: self.shape.fillPen.setColorFromQColor(self.colorDialog.selectedColor()) self.parent.updateFrameDispColor() @Qc.pyqtSlot() def on_click(self): print("\n") for currentQTableWidgetItem in self.tableWidget.selectedItems(): print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text()) asymptote-3.05/GUI/res/0000755000000000000000000000000015031566105013403 5ustar rootrootasymptote-3.05/GUI/res/icons.qrc0000644000000000000000000000342015031566105015224 0ustar rootroot icons/android-arrow-back.svg icons/android-arrow-forward.svg icons/android-folder-open.svg icons/save.svg icons/code.svg icons/android-camera.svg icons/plus-round.svg icons/grid.svg icons/magnifying-glass.svg icons/center.svg icons/centerorigin.svg icons/edit.svg icons/android-delete.svg icons/android-hand.svg icons/arrow-move.svg icons/arrow-resize.svg icons/android-refresh.svg icons/anchor.svg icons/eye.svg icons/android-expand.svg icons/chevron-with-circle-left.svg icons/chevron-with-circle-right.svg icons/bucket.svg icons/filledbucket.svg icons/android-color-palette.svg icons/openpolygon.svg icons/closedpolygon.svg icons/opencurve.svg icons/closedcurve.svg icons/triangle-stroked-15.svg icons/circle.svg icons/text.svg icons/social-python.svg icons/subdirectory-left.svg icons/android-done.svg icons/android-close.svg icons/check.svg icons/android-radio-button-on.svg icons/android-radio-button-off.svg icons/android-locate.svg icons/close-round.svg icons/brush.svg icons/undo.svg icons/redo.svg asymptote-3.05/GUI/res/icons/0000755000000000000000000000000015031566105014516 5ustar rootrootasymptote-3.05/GUI/res/icons/centerorigin.svg0000644000000000000000000000177615031566105017742 0ustar rootroot asymptote-3.05/GUI/res/icons/bucket.asy0000644000000000000000000000112115031566105016504 0ustar rootroot// Empty bucket: asy bucket -f svg // Filled bucket: asy bucket -f svg -u fill=true -o filledbucket defaultpen(3.5); real h=4; real r=3; path left=(-r,h)--(-r,0); path right=(r,0)--(r,h); path bottom=xscale(r)*arc(0,1,180,360); real H=0.8h; path Left=(-r,H/2)--(-r,0); path Right=(r,0)--(r,H/2); bool fill=false; // Set to true for filled bucket. usersetting(); if(fill) fill(Left--bottom--Right--shift(0,H)*xscale(r)*arc(0,1,0,180)--cycle,paleblue); draw(shift(0,h)*xscale(r)*unitcircle); draw(left--bottom--right); draw(shift(0,h)*scale(r)*arc(0,1,0,180)); shipout(pad(64,64)); asymptote-3.05/GUI/res/icons/check.svg0000644000000000000000000000140315031566105016312 0ustar rootroot asymptote-3.05/GUI/res/icons/chevron-with-circle-right.svg0000644000000000000000000000173115031566105022230 0ustar rootroot asymptote-3.05/GUI/res/icons/closedpolygon.svg0000644000000000000000000000204215031566105020116 0ustar rootroot asymptote-3.05/GUI/res/icons/circle.svg0000644000000000000000000000134715031566105016505 0ustar rootroot asymptote-3.05/GUI/res/icons/closedpolygon.asy0000644000000000000000000000015515031566105020116 0ustar rootrootdefaultpen(2.5); path p=W--NW--ENE--0.5*SE--cycle; draw(p); dot(p,red+linewidth(12)); shipout(pad(64,64)); asymptote-3.05/GUI/res/icons/opencurve.asy0000644000000000000000000000014615031566105017243 0ustar rootrootdefaultpen(2.5); path p=W..NW..ENE..0.5*SE; draw(p); dot(p,red+linewidth(12)); shipout(pad(64,64)); asymptote-3.05/GUI/res/icons/subdirectory-left.svg0000644000000000000000000000015415031566105020705 0ustar rootrootasymptote-3.05/GUI/res/icons/plus-round.svg0000644000000000000000000000135615031566105017354 0ustar rootroot asymptote-3.05/GUI/res/icons/android-expand.svg0000644000000000000000000000145215031566105020136 0ustar rootroot asymptote-3.05/GUI/res/icons/android-done.svg0000644000000000000000000000115415031566105017603 0ustar rootroot asymptote-3.05/GUI/res/icons/filledbucket.svg0000644000000000000000000000353415031566105017701 0ustar rootroot asymptote-3.05/GUI/res/icons/social-python.svg0000644000000000000000000000355315031566105020036 0ustar rootroot asymptote-3.05/GUI/res/icons/android-arrow-forward.svg0000644000000000000000000000116215031566105021451 0ustar rootroot asymptote-3.05/GUI/res/icons/eye.svg0000644000000000000000000000173415031566105016026 0ustar rootroot asymptote-3.05/GUI/res/icons/save.svg0000644000000000000000000000122715031566105016177 0ustar rootroot asymptote-3.05/GUI/res/icons/text.svg0000644000000000000000000000043415031566105016224 0ustar rootroot asymptote-3.05/GUI/res/icons/bucket.svg0000644000000000000000000000263415031566105016521 0ustar rootroot asymptote-3.05/GUI/res/icons/brush.svg0000644000000000000000000000173215031566105016365 0ustar rootroot asymptote-3.05/GUI/res/icons/undo.svg0000644000000000000000000000202715031566105016205 0ustar rootroot asymptote-3.05/GUI/res/icons/openpolygon.svg0000644000000000000000000000202315031566105017605 0ustar rootroot asymptote-3.05/GUI/res/icons/closedcurve.asy0000644000000000000000000000015515031566105017553 0ustar rootrootdefaultpen(2.5); path p=W..NW..ENE..0.5*SE..cycle; draw(p); dot(p,red+linewidth(12)); shipout(pad(64,64)); asymptote-3.05/GUI/res/icons/close-round.svg0000644000000000000000000000147515031566105017500 0ustar rootroot asymptote-3.05/GUI/res/icons/android-hand.svg0000644000000000000000000000267315031566105017577 0ustar rootroot asymptote-3.05/GUI/res/icons/android-close.svg0000644000000000000000000000125315031566105017763 0ustar rootroot asymptote-3.05/GUI/res/icons/redo.svg0000644000000000000000000000210215031566105016163 0ustar rootroot asymptote-3.05/GUI/res/icons/android-radio-button-off.svg0000644000000000000000000000136015031566105022034 0ustar rootroot asymptote-3.05/GUI/res/icons/openpolygon.asy0000644000000000000000000000014615031566105017606 0ustar rootrootdefaultpen(2.5); path p=W--NW--ENE--0.5*SE; draw(p); dot(p,red+linewidth(12)); shipout(pad(64,64)); asymptote-3.05/GUI/res/icons/chevron-with-circle-left.svg0000644000000000000000000000175015031566105022046 0ustar rootroot asymptote-3.05/GUI/res/icons/triangle-stroked-15.svg0000644000000000000000000000231215031566105020736 0ustar rootroot asymptote-3.05/GUI/res/icons/android-folder-open.svg0000644000000000000000000000151015031566105021064 0ustar rootroot asymptote-3.05/GUI/res/icons/center.svg0000644000000000000000000000153215031566105016520 0ustar rootroot asymptote-3.05/GUI/res/icons/edit.svg0000644000000000000000000000153715031566105016172 0ustar rootroot asymptote-3.05/GUI/res/icons/centerorigin.asy0000644000000000000000000000017415031566105017726 0ustar rootrootdefaultpen(4); draw(scale(2)*shift(-0.5,-0.5)*unitsquare); draw((-1,0)--(1,0)); draw((0,-1)--(0,1)); shipout(pad(64,64)); asymptote-3.05/GUI/res/icons/android-delete.svg0000644000000000000000000000123015031566105020113 0ustar rootroot asymptote-3.05/GUI/res/icons/android-refresh.svg0000644000000000000000000000143315031566105020314 0ustar rootroot asymptote-3.05/GUI/res/icons/android-camera.svg0000644000000000000000000000142615031566105020110 0ustar rootroot asymptote-3.05/GUI/res/icons/opencurve.svg0000644000000000000000000000216315031566105017247 0ustar rootroot asymptote-3.05/GUI/res/icons/magnifying-glass.svg0000644000000000000000000000166715031566105020510 0ustar rootroot asymptote-3.05/GUI/res/icons/android-arrow-back.svg0000644000000000000000000000116215031566105020705 0ustar rootroot asymptote-3.05/GUI/res/icons/android-radio-button-on.svg0000644000000000000000000000147715031566105021707 0ustar rootroot asymptote-3.05/GUI/res/icons/arrow-resize.svg0000644000000000000000000000116715031566105017675 0ustar rootroot asymptote-3.05/GUI/res/icons/arrow-move.svg0000644000000000000000000000130115031566105017330 0ustar rootroot asymptote-3.05/GUI/res/icons/code.svg0000644000000000000000000000223415031566105016152 0ustar rootroot asymptote-3.05/GUI/res/icons/closedcurve.svg0000644000000000000000000000224315031566105017556 0ustar rootroot asymptote-3.05/GUI/res/icons/android-color-palette.svg0000644000000000000000000000242615031566105021433 0ustar rootroot asymptote-3.05/GUI/res/icons/center.asy0000644000000000000000000000015715031566105016517 0ustar rootrootdefaultpen(4); draw(scale(2)*shift(-0.5,-0.5)*unitsquare); fill(scale(0.5)*unitcircle); shipout(pad(64,64)); asymptote-3.05/GUI/res/icons/grid.svg0000644000000000000000000000330415031566105016164 0ustar rootroot asymptote-3.05/GUI/res/icons/anchor.svg0000644000000000000000000000055115031566105016512 0ustar rootroot asymptote-3.05/GUI/res/icons/android-locate.svg0000644000000000000000000000212415031566105020123 0ustar rootroot asymptote-3.05/GUI/configs/0000755000000000000000000000000015031566105014242 5ustar rootrootasymptote-3.05/GUI/configs/xasykeymap.cson0000644000000000000000000000073415031566105017325 0ustar rootroot# Default Keymaps for xasy commandPalette: "Ctrl+P" quit: "Ctrl+Q" deleteObject: "Del" finalizeCurve: "Space" finalizeCurveClosed: "c" anchorMode: "Ctrl+A" undo: 'Ctrl+Z' redo: 'Ctrl+Y' moveUp: 'Up' moveDown: 'Down' moveLeft: 'Left' moveRight: 'Right' scrollUp: 'Shift+Up' scrollDown: 'Shift+Down' scrollLeft: 'Shift+Left' scrollRight: 'Shift+Right' zoomIn: 'Ctrl+Up' zoomOut: 'Ctrl+Down' open: 'Ctrl+O' save: 'Ctrl+S' export: 'Ctrl+E' copy: 'Ctrl+C' paste: 'Ctrl+V' asymptote-3.05/GUI/configs/__init__.py0000644000000000000000000000002615031566105016351 0ustar rootroot#!/usr/bin/env python3asymptote-3.05/GUI/configs/xasyconfig.cson0000644000000000000000000000245115031566105017302 0ustar rootroot# Default Options for xasy # External editor. $asypath will be replaced by the current file. externalEditor: "vi" externalEditorArgs: ["$asypath"] # Path to Asymptote executable asyPath: "asy" # Overwrites the ASYMPTOTE_DIR Environment variable if set. Otherwise, leaves asymptote to decide. asyBaseLocation: null # Show Debugging Information showDebug: false # Default Pen Options defaultPenOptions: "" # Default Pen Color defaultPenColor: "#000000" # defaultPenWidth: 0.5 useLegacyDrawMode: false enableImmediatePreview: true useDegrees: false groupObjDefault: false # terminalFont: "Courier" terminalFontSize: 9 # defaultShowAxes: true defaultShowGrid: false defaultGridSnap: false # Draw Selected Objects on top of the frame drawSelectedOnTop: true # Grid Settings gridMajorAxesColor: "#858585" gridMinorAxesColor: "#dddddd" gridMajorAxesSpacing: 5 gridMinorAxesCount: 9 # Number of pixels per bp in 3D rendered bitmaps renderDensity: 2 # Magnification Settings minimumMagnification: 0.01 maximumMagnification: 100 # SVG options # If null, use "rsvg-convert". # otherwise use the converter in the path rsvgConverterPath: null # Debug Mode debugMode: true # Overrides Windows: externalEditor: "notepad.exe" Darwin: externalEditor: "open" externalEditorArgs: ["-a","TextEdit","$asypath"] asymptote-3.05/runsystem.cc0000644000000000000000000003102215031566132014544 0ustar rootroot/***** Autogenerated from runsystem.in; changes will be overwritten *****/ #line 1 "./runtimebase.in" /***** * runtimebase.in * Andy Hammerlindl 2009/07/28 * * Common declarations needed for all code-generating .in files. * *****/ #line 1 "./runsystem.in" /***** * runsystem.in * * Runtime functions for system operations. * *****/ #line 23 "./runtimebase.in" #include "stack.h" #include "types.h" #include "builtin.h" #include "entry.h" #include "errormsg.h" #include "array.h" #include "triple.h" #include "callable.h" #include "opsymbols.h" using vm::stack; using vm::error; using vm::array; using vm::read; using vm::callable; using types::formal; using types::function; using camp::triple; #define PRIMITIVE(name,Name,asyName) using types::prim##Name; #include #undef PRIMITIVE void unused(void *); namespace run { typedef double real; array *copyArray(array *a); array *copyArray2(array *a); array *copyArray3(array *a); double *copyTripleArray2Components(array *a, size_t &N, GCPlacement placement=NoGC); triple *copyTripleArray2C(array *a, size_t &N, GCPlacement placement=NoGC); } function *realRealFunction(); #define CURRENTPEN processData().currentpen #line 12 "runsystem.in" #include "asyprocess.h" #include "stack.h" #include "locate.h" using namespace camp; using namespace settings; using vm::bpinfo; using vm::bplist; using vm::getPos; using vm::Default; using vm::nullfunc; using vm::item; using absyntax::runnable; typedef callable callableBp; namespace run { extern string emptystring; } function *voidFunction() { return new function(primVoid()); } function *breakpointFunction() { return new function(primString(),primString(),primInt(),primInt(), primCode()); } void clear(string file, Int line, bool warn=false) { bpinfo bp(file,line); for(mem::list::iterator p=bplist.begin(); p != bplist.end(); ++p) { if(*p == bp) { cout << "cleared breakpoint at " << file << ": " << line << endl; bplist.remove(bp); return; } } if(warn) cout << "No such breakpoint at " << file << ": " << line << endl; } namespace run { void breakpoint(stack *Stack, runnable *r) { callable *atBreakpointFunction=processData().atBreakpointFunction; if(atBreakpointFunction && !nullfunc::instance()->compare(atBreakpointFunction)) { position curPos=getPos(); Stack->push(curPos.filename()); Stack->push((Int) curPos.Line()); Stack->push((Int) curPos.Column()); Stack->push(r ? r : vm::Default); atBreakpointFunction->call(Stack); // returns a string } else Stack->push(""); } } string convertname(string name, const string& format) { if(name.empty()) return buildname(outname(),format,""); name=outpath(name); return format.empty() ? name : format+":"+name; } namespace run { void purge(Int divisor=0) { #ifdef USEGC if(divisor > 0) GC_set_free_space_divisor((GC_word) divisor); GC_gcollect(); #endif } void updateFunction(stack *Stack) { callable *atUpdateFunction=processData().atUpdateFunction; if(atUpdateFunction && !nullfunc::instance()->compare(atUpdateFunction)) atUpdateFunction->call(Stack); } void exitFunction(stack *Stack) { callable *atExitFunction=processData().atExitFunction; if(atExitFunction && !nullfunc::instance()->compare(atExitFunction)) atExitFunction->call(Stack); } } // Autogenerated routines: #ifndef NOSYM #include "runsystem.symbols.h" #endif namespace run { #line 107 "./runsystem.in" // string outname(); void gen_runsystem0(stack *Stack) { #line 108 "./runsystem.in" {Stack->push(outname()); return;} } #line 112 "./runsystem.in" // void atupdate(callable *f); void gen_runsystem1(stack *Stack) { callable * f=vm::pop(Stack); #line 113 "./runsystem.in" processData().atUpdateFunction=f; } #line 117 "./runsystem.in" // callable* atupdate(); void gen_runsystem2(stack *Stack) { #line 118 "./runsystem.in" {Stack->push(processData().atUpdateFunction); return;} } #line 122 "./runsystem.in" // void atexit(callable *f); void gen_runsystem3(stack *Stack) { callable * f=vm::pop(Stack); #line 123 "./runsystem.in" processData().atExitFunction=f; } #line 127 "./runsystem.in" // callable* atexit(); void gen_runsystem4(stack *Stack) { #line 128 "./runsystem.in" {Stack->push(processData().atExitFunction); return;} } #line 132 "./runsystem.in" // void atbreakpoint(callableBp *f); void gen_runsystem5(stack *Stack) { callableBp * f=vm::pop(Stack); #line 133 "./runsystem.in" processData().atBreakpointFunction=f; } #line 137 "./runsystem.in" // void breakpoint(runnable *s=NULL); void gen_runsystem6(stack *Stack) { runnable * s=vm::pop(Stack,NULL); #line 138 "./runsystem.in" breakpoint(Stack,s); } #line 142 "./runsystem.in" // string locatefile(string file, bool full=true); void gen_runsystem7(stack *Stack) { bool full=vm::pop(Stack,true); string file=vm::pop(Stack); #line 143 "./runsystem.in" {Stack->push(locateFile(file,full)); return;} } #line 147 "./runsystem.in" // void stop(string file, Int line, runnable *s=NULL); void gen_runsystem8(stack *Stack) { runnable * s=vm::pop(Stack,NULL); Int line=vm::pop(Stack); string file=vm::pop(Stack); #line 148 "./runsystem.in" file=locateFile(file); clear(file,line); cout << "setting breakpoint at " << file << ": " << line << endl; bplist.push_back(bpinfo(file,line,s)); } #line 155 "./runsystem.in" // void breakpoints(); void gen_runsystem9(stack *) { #line 156 "./runsystem.in" for(mem::list::iterator p=bplist.begin(); p != bplist.end(); ++p) cout << p->f.name() << ": " << p->f.line() << endl; } #line 161 "./runsystem.in" // void clear(string file, Int line); void gen_runsystem10(stack *Stack) { Int line=vm::pop(Stack); string file=vm::pop(Stack); #line 162 "./runsystem.in" file=locateFile(file); clear(file,line,true); } #line 167 "./runsystem.in" // void clear(); void gen_runsystem11(stack *) { #line 168 "./runsystem.in" bplist.clear(); } #line 172 "./runsystem.in" // void warn(string s); void gen_runsystem12(stack *Stack) { string s=vm::pop(Stack); #line 173 "./runsystem.in" Warn(s); } #line 177 "./runsystem.in" // void nowarn(string s); void gen_runsystem13(stack *Stack) { string s=vm::pop(Stack); #line 178 "./runsystem.in" noWarn(s); } #line 182 "./runsystem.in" // void warning(string s, string t, bool position=false); void gen_runsystem14(stack *Stack) { bool position=vm::pop(Stack,false); string t=vm::pop(Stack); string s=vm::pop(Stack); #line 183 "./runsystem.in" if(settings::warn(s)) { em.warning(position ? getPos() : nullPos,s); em << t; em.sync(true); } } // Strip directory from string #line 192 "./runsystem.in" // string stripdirectory(string *s); void gen_runsystem15(stack *Stack) { string * s=vm::pop(Stack); #line 193 "./runsystem.in" {Stack->push(stripDir(*s)); return;} } // Strip directory from string #line 198 "./runsystem.in" // string stripfile(string *s); void gen_runsystem16(stack *Stack) { string * s=vm::pop(Stack); #line 199 "./runsystem.in" {Stack->push(stripFile(*s)); return;} } // Strip file extension from string #line 204 "./runsystem.in" // string stripextension(string *s); void gen_runsystem17(stack *Stack) { string * s=vm::pop(Stack); #line 205 "./runsystem.in" {Stack->push(stripExt(*s)); return;} } // Call ImageMagick convert. #line 210 "./runsystem.in" // Int convert(string args=emptystring, string file=emptystring, string format=emptystring); void gen_runsystem18(stack *Stack) { string format=vm::pop(Stack,emptystring); string file=vm::pop(Stack,emptystring); string args=vm::pop(Stack,emptystring); #line 212 "./runsystem.in" string name=convertname(file,format); mem::vector cmd; string s=getSetting("convert"); cmd.push_back(s); push_split(cmd,args); cmd.push_back(name); bool quiet=verbose <= 1; char *oldPath=NULL; string dir=stripFile(outname()); if(!dir.empty()) { oldPath=getPath(); setPath(dir.c_str()); } Int ret=System(cmd,quiet ? 1 : 0,true,"convert", "your ImageMagick convert utility"); if(oldPath != NULL) setPath(oldPath); if(ret == 0 && verbose > 0) cout << "Wrote " << (file.empty() ? name : file) << endl; {Stack->push(ret); return;} } // Call ImageMagick animate. #line 239 "./runsystem.in" // Int animate(string args=emptystring, string file=emptystring, string format=emptystring); void gen_runsystem19(stack *Stack) { string format=vm::pop(Stack,emptystring); string file=vm::pop(Stack,emptystring); string args=vm::pop(Stack,emptystring); #line 241 "./runsystem.in" string name=convertname(file,format); if(view()) { mem::vector cmd; string s=getSetting("animate"); cmd.push_back(s); if(s == "magick") cmd.push_back("animate"); push_split(cmd,args); cmd.push_back(name); {Stack->push(System(cmd,0,false,"animate","your animated GIF viewer")); return;} } {Stack->push(0); return;} } #line 256 "./runsystem.in" // void purge(Int divisor=0); void gen_runsystem20(stack *Stack) { Int divisor=vm::pop(Stack,0); #line 257 "./runsystem.in" purge(divisor); } } // namespace run namespace trans { void gen_runsystem_venv(venv &ve) { #line 107 "./runsystem.in" addFunc(ve, run::gen_runsystem0, primString(), SYM(outname)); #line 112 "./runsystem.in" addFunc(ve, run::gen_runsystem1, primVoid(), SYM(atupdate), formal(voidFunction(), SYM(f), false, false)); #line 117 "./runsystem.in" addFunc(ve, run::gen_runsystem2, voidFunction(), SYM(atupdate)); #line 122 "./runsystem.in" addFunc(ve, run::gen_runsystem3, primVoid(), SYM(atexit), formal(voidFunction(), SYM(f), false, false)); #line 127 "./runsystem.in" addFunc(ve, run::gen_runsystem4, voidFunction(), SYM(atexit)); #line 132 "./runsystem.in" addFunc(ve, run::gen_runsystem5, primVoid(), SYM(atbreakpoint), formal(breakpointFunction(), SYM(f), false, false)); #line 137 "./runsystem.in" addFunc(ve, run::gen_runsystem6, primVoid(), SYM(breakpoint), formal(primCode(), SYM(s), true, false)); #line 142 "./runsystem.in" addFunc(ve, run::gen_runsystem7, primString(), SYM(locatefile), formal(primString(), SYM(file), false, false), formal(primBoolean(), SYM(full), true, false)); #line 147 "./runsystem.in" addFunc(ve, run::gen_runsystem8, primVoid(), SYM(stop), formal(primString(), SYM(file), false, false), formal(primInt(), SYM(line), false, false), formal(primCode(), SYM(s), true, false)); #line 155 "./runsystem.in" addFunc(ve, run::gen_runsystem9, primVoid(), SYM(breakpoints)); #line 161 "./runsystem.in" addFunc(ve, run::gen_runsystem10, primVoid(), SYM(clear), formal(primString(), SYM(file), false, false), formal(primInt(), SYM(line), false, false)); #line 167 "./runsystem.in" addFunc(ve, run::gen_runsystem11, primVoid(), SYM(clear)); #line 172 "./runsystem.in" addFunc(ve, run::gen_runsystem12, primVoid(), SYM(warn), formal(primString(), SYM(s), false, false)); #line 177 "./runsystem.in" addFunc(ve, run::gen_runsystem13, primVoid(), SYM(nowarn), formal(primString(), SYM(s), false, false)); #line 182 "./runsystem.in" addFunc(ve, run::gen_runsystem14, primVoid(), SYM(warning), formal(primString(), SYM(s), false, false), formal(primString(), SYM(t), false, false), formal(primBoolean(), SYM(position), true, false)); #line 191 "./runsystem.in" addFunc(ve, run::gen_runsystem15, primString(), SYM(stripdirectory), formal(primString(), SYM(s), false, false)); #line 197 "./runsystem.in" addFunc(ve, run::gen_runsystem16, primString(), SYM(stripfile), formal(primString(), SYM(s), false, false)); #line 203 "./runsystem.in" addFunc(ve, run::gen_runsystem17, primString(), SYM(stripextension), formal(primString(), SYM(s), false, false)); #line 209 "./runsystem.in" addFunc(ve, run::gen_runsystem18, primInt(), SYM(convert), formal(primString(), SYM(args), true, false), formal(primString(), SYM(file), true, false), formal(primString(), SYM(format), true, false)); #line 238 "./runsystem.in" addFunc(ve, run::gen_runsystem19, primInt(), SYM(animate), formal(primString(), SYM(args), true, false), formal(primString(), SYM(file), true, false), formal(primString(), SYM(format), true, false)); #line 256 "./runsystem.in" addFunc(ve, run::gen_runsystem20, primVoid(), SYM(purge), formal(primInt(), SYM(divisor), true, false)); } } // namespace trans asymptote-3.05/flatguide.cc0000644000000000000000000000177415031566105014452 0ustar rootroot/***** * flatguide.cc * Andy Hammerlindl 2005/02/23 * * The data structure that builds up a knotlist. This is done by calling in * order the methods to set knots, specifiers, and tensions. * Used by the guide solving routines. *****/ #include "flatguide.h" namespace camp { void flatguide::addPre(path& p, Int j) { setSpec(new controlSpec(p.precontrol(j),p.straight(j-1)),IN); } void flatguide::addPoint(path& p, Int j) { add(p.point(j)); } void flatguide::addPost(path& p, Int j) { setSpec(new controlSpec(p.postcontrol(j),p.straight(j)),OUT); } void flatguide::uncheckedAdd(path p, bool allowsolve) { Int n=p.length(); if(n < 0) return; if(n == 0) { addPoint(p,0); return; } int nminus1=n-1; if(!allowsolve && p.cyclic()) addPre(p,0); for(Int i=0; i < nminus1;) { addPoint(p,i); addPost(p,i); ++i; addPre(p,i); } addPoint(p,nminus1); addPost(p,nminus1); if(allowsolve || !p.cyclic()) { addPre(p,n); addPoint(p,n); } } spec flatguide::open; } asymptote-3.05/psfile.h0000644000000000000000000002147515031566105013632 0ustar rootroot/***** * psfile.h * Andy Hammerlindl 2002/06/10 * * Encapsulates the writing of commands to a PostScript file. * Allows identification and removal of redundant commands. *****/ #ifndef PSFILE_H #define PSFILE_H #include #include #include #include "pair.h" #include "path.h" #include "bbox.h" #include "pen.h" #include "array.h" #include "callable.h" namespace camp { inline void BoundingBox(std::ostream& s, const bbox& box) { s << "%%BoundingBox: " << std::setprecision(0) << std::fixed << box.LowRes() << newl; s.unsetf(std::ios::fixed); s << "%%HiResBoundingBox: " << std::setprecision(9) << box << newl; } // An ASCII85Encode filter. class encode85 { ostream *out; int tuple; int pos; int count; static const int width=72; public: encode85(ostream *out) : out(out), tuple(0), pos(0), count(0) {} ~encode85() { if(count > 0) encode(tuple, count); if(pos+2 > width) *out << '\n'; *out << "~>\n"; } private: void encode(unsigned int tuple, int count) { unsigned char buf[5], *s=buf; int i=5; do { *s++=tuple % 85; tuple /= 85; } while(--i > 0); i=count; do { *out << (unsigned char) (*--s + '!'); if(pos++ >= width) { pos=0; *out << '\n'; } } while(i-- > 0); } public: void put(unsigned char c) { switch (count++) { case 0: tuple |= (c << 24); break; case 1: tuple |= (c << 16); break; case 2: tuple |= (c << 8); break; case 3: tuple |= c; if(tuple == 0) { *out << 'z'; if(pos++ >= width) { pos=0; *out << '\n'; } } else encode(tuple, count); tuple=0; count=0; break; } } }; class psfile { protected: mem::stack pens; public: string filename; bool pdfformat; // Is final output format PDF? bool pdf; // Output direct PDF? unsigned char *buffer; size_t count; void write(pen *p, size_t ncomponents); void writefromRGB(unsigned char r, unsigned char g, unsigned char b, ColorSpace colorspace, size_t ncomponents); void writeCompressed(const unsigned char *a, size_t size); void dealias(unsigned char *a, size_t width, size_t height, size_t n, bool convertrgb=false, ColorSpace colorspace=DEFCOLOR); void beginImage(size_t n) { buffer=new unsigned char[n]; count=0; } void outImage(bool antialias, size_t width, size_t height, size_t ncomponents); void endImage(bool antialias, size_t width, size_t height, size_t ncomponents) { outImage(antialias,width,height,ncomponents); delete[] buffer; } void writeByte(unsigned char n) { buffer[count++]=n; } protected: pen lastpen; std::ostream *out; public: bool pdftex() {return settings::pdf(settings::getSetting("tex"));} psfile(const string& filename, bool pdfformat); psfile() {pdf=pdftex();} bool transparentFormat(string outputformat); virtual ~psfile(); void BoundingBox(const bbox& box) { camp::BoundingBox(*out,box); } void prologue(const bbox& box); void epilogue(); void header(bool eps); void close(); void write(double x) { *out << " " << x; } void writenewl() { *out << newl; } void write(pair z) { *out << " " << z.getx() << " " << z.gety(); } void write(transform t) { if(!pdf) *out << "["; *out << " " << t.getxx() << " " << t.getyx() << " " << t.getxy() << " " << t.getyy() << " " << t.getx() << " " << t.gety(); if(!pdf) *out << "]"; } void resetpen() { lastpen=pen(initialpen); lastpen.convert(); } void setcolor(const pen& p, const string& begin, const string& end); void setopacity(const pen& p); virtual void setpen(pen p); void write(const pen& p); void write(path p, bool newPath=true); virtual void writeclip(path p, bool newPath=true) { write(p,newPath); } virtual void dot(path p, pen, bool newPath=true) { write(p,newPath); } virtual void newpath() { if(!pdf) *out << "newpath"; } virtual void moveto(pair z) { write(z); if(pdf) *out << " m" << newl; else *out << " moveto" << newl; } virtual void lineto(pair z) { write(z); if(pdf) *out << " l" << newl; else *out << " lineto" << newl; } virtual void curveto(pair zp, pair zm, pair z1) { write(zp); write(zm); write(z1); if(pdf) *out << " c" << newl; else *out << " curveto" << newl; } virtual void closepath() { if(pdf) *out << "h" << newl; else *out << "closepath" << newl; } virtual void stroke(const pen &p, bool dot=false) { if(pdf) *out << "S" << newl; else *out << "stroke" << newl; } virtual void strokepath() { if(pdf) reportError("PDF does not support strokepath"); else *out << "strokepath" << newl; } virtual void fill(const pen &p) { if(p.evenodd()) { if(pdf) *out << "f*" << newl; else *out << "eofill" << newl; } else { if(pdf) *out << "f" << newl; else *out << "fill" << newl; } } virtual void beginclip() { newpath(); } virtual void endclip(const pen &p) { if(p.evenodd()) { if(pdf) *out << "W* n" << newl; else *out << "eoclip" << newl; } else { if(pdf) *out << "W n" << newl; else *out << "clip" << newl; } } virtual void endpsclip(const pen &p) {endclip(p);} void checkLevel() { int n=settings::getSetting("level"); if(n < 3) reportError("PostScript shading requires -level 3"); } virtual void beginlatticeshade(const vm::array& a, const bbox& b) {} virtual void latticeshade(const vm::array& a, const transform& t); virtual void begingradientshade(bool axial, ColorSpace colorspace, const pen& pena, const pair& a, double ra, const pen& penb, const pair& b, double rb) {} virtual void gradientshade(bool axial, ColorSpace colorspace, const pen& pena, const pair& a, double ra, bool extenda, const pen& penb, const pair& b, double rb, bool extendb); virtual void begingouraudshade(const vm::array& pens, const vm::array& vertices, const vm::array& edges) {} virtual void gouraudshade(const pen& pentype, const vm::array& pens, const vm::array& vertices, const vm::array& edges); virtual void tensorshade(const pen& pentype, const vm::array& pens, const vm::array& boundaries, const vm::array& z); void vertexpen(vm::array *pi, int j, ColorSpace colorspace); void imageheader(size_t width, size_t height, ColorSpace colorspace); void image(const vm::array& a, const vm::array& p, bool antialias); void image(const vm::array& a, bool antialias); void image(vm::stack *Stack, vm::callable *f, Int width, Int height, bool antialias); void rawimage(unsigned char *a, size_t width, size_t height, bool antialias); virtual void gsave(bool tex=false) { if(pdf) *out << "q"; else *out << "gsave"; if(!tex) *out << newl; pens.push(lastpen); } virtual void grestore(bool tex=false) { if(pens.size() < 1) reportError("grestore without matching gsave"); lastpen=pens.top(); pens.pop(); if(pdf) *out << "Q"; else *out << "grestore"; if(!tex) *out << newl; } virtual void translate(pair z) { if(z == pair(0.0,0.0)) return; if(pdf) *out << " 1 0 0 1 " << newl; write(z); if(pdf) *out << " cm" << newl; *out << " translate" << newl; } // Multiply on a transform to the transformation matrix. virtual void concat(transform t) { if(t.isIdentity()) return; write(t); if(pdf) *out << " cm" << newl; else *out << " concat" << newl; } void verbatimline(const string& s) { *out << s << newl; } void verbatim(const string& s) { *out << s; } // Determine shading and image transparency based on first pen. void setfirstopacity(const vm::array& pens) { if(pens.size() > 0) { pen *p=vm::read(pens,0); setopacity(*p); } } ColorSpace maxcolorspace(const vm::array& pens) { ColorSpace colorspace=DEFCOLOR; size_t size=pens.size(); for(size_t i=0; i < size; i++) { pen *p=vm::read(pens,i); p->convert(); colorspace=max(colorspace,p->colorspace()); } return colorspace; } ColorSpace maxcolorspace2(const vm::array& penarray) { ColorSpace colorspace=DEFCOLOR; size_t size=penarray.size(); for(size_t i=0; i < size; i++) colorspace=max(colorspace, maxcolorspace(vm::read(penarray,i))); return colorspace; } }; } //namespace camp #endif asymptote-3.05/compile0000755000000000000000000001760115031566105013551 0ustar rootroot#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2025-02-03.05; # UTC # Copyright (C) 1999-2025 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file unneeded_conversions # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) UNNEEDED_CONVERSIONS, no # conversion will take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) if test -n "$MSYSTEM" && (cygpath --version) >/dev/null 2>&1; then # MSYS2 environment. file_conv=cygwin else # Original MinGW environment. file_conv=mingw fi ;; MSYS*) # Old MSYS environment, or MSYS2 with 32-bit MSYS2 shell. file_conv=cygwin ;; CYGWIN*) # Cygwin environment. file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) # This is the optimization mentioned above: # If UNNEEDED_CONVERSIONS contains $file_conv, don't convert. ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -w "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.lo | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . GNU Automake home page: . General help using GNU software: . EOF exit $? ;; -v | --v*) echo "compile (GNU Automake) $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ clang-cl | *[/\\]clang-cl | clang-cl.exe | *[/\\]clang-cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp nil t) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: asymptote-3.05/drawpath3.cc0000644000000000000000000001271515031566105014400 0ustar rootroot/***** * drawpath3.cc * * Stores a path3 that has been added to a picture. *****/ #include "drawpath3.h" #include "drawsurface.h" #include "material.h" #ifdef HAVE_LIBGLM #include #include #include #endif namespace camp { using vm::array; using namespace prc; bool drawPath3::write(prcfile *out, unsigned int *, double, groupsmap&) { if(invisible) return true; if(straight) { triple controls[]={g.point((Int) 0),g.point((Int) 1)}; out->addLine(2,controls,diffuse); } else { triple controls[]={g.point((Int) 0),g.postcontrol((Int) 0), g.precontrol((Int) 1),g.point((Int) 1)}; out->addBezierCurve(4,controls,diffuse); } return true; } bool drawPath3::write(abs3Doutfile *out) { #ifdef HAVE_LIBGLM if(invisible) return true; if(billboard) { meshinit(); drawElement::centerIndex=centerIndex; } else drawElement::centerIndex=0; setcolors(diffuse,emissive,specular,shininess,metallic,fresnel0,out); out->setKEY(KEY); if(straight) out->addCurve(g.point((Int) 0),g.point((Int) 1)); else out->addCurve(g.point((Int) 0),g.postcontrol((Int) 0), g.precontrol((Int) 1),g.point((Int) 1)); #endif return true; } void drawPath3::render(double size2, const triple& b, const triple& B, double perspective, bool remesh) { #ifdef HAVE_GL if(invisible) return; setcolors(diffuse,emissive,specular,shininess,metallic,fresnel0); setMaterial(material1Data,drawMaterial1); bool offscreen; if(billboard) { drawElement::centerIndex=centerIndex; BB.init(center); offscreen=bbox2(Min,Max,BB).offscreen(); } else offscreen=bbox2(Min,Max).offscreen(); if(offscreen) { // Fully offscreen R.Onscreen=false; R.data.clear(); R.notRendered(); return; } triple controls[]={g.point((Int) 0),g.postcontrol((Int) 0), g.precontrol((Int) 1),g.point((Int) 1)}; triple *Controls; triple Controls0[4]; if(billboard) { Controls=Controls0; for(size_t i=0; i < 4; i++) Controls[i]=BB.transform(controls[i]); } else { Controls=controls; if(!remesh && R.Onscreen) { // Fully onscreen; no need to re-render R.append(); return; } } double s=perspective ? Min.getz()*perspective : 1.0; // Move to glrender const pair size3(s*(B.getx()-b.getx()),s*(B.gety()-b.gety())); R.queue(controls,straight,size3.length()/size2); #endif } drawElement *drawPath3::transformed(const double* t) { return new drawPath3(t,this); } bool drawNurbsPath3::write(prcfile *out, unsigned int *, double, groupsmap&) { if(invisible) return true; out->addCurve(degree,n,controls,knots,color,weights); return true; } // Approximate bounds by bounding box of control polyhedron. void drawNurbsPath3::bounds(const double* t, bbox3& b) { double x,y,z; double X,Y,Z; triple* Controls; if(t == NULL) Controls=controls; else { Controls=new triple[n]; for(size_t i=0; i < n; i++) Controls[i]=t*controls[i]; } boundstriples(x,y,z,X,Y,Z,n,Controls); b.add(x,y,z); b.add(X,Y,Z); if(t == NULL) { Min=triple(x,y,z); Max=triple(X,Y,Z); } else delete[] Controls; } drawElement *drawNurbsPath3::transformed(const double* t) { return new drawNurbsPath3(t,this); } void drawNurbsPath3::ratio(const double* t, pair &b, double (*m)(double, double), double, bool &first) { triple* Controls; if(t == NULL) Controls=controls; else { Controls=new triple[n]; for(size_t i=0; i < n; i++) Controls[i]=t*controls[i]; } if(first) { first=false; triple v=Controls[0]; b=pair(xratio(v),yratio(v)); } double x=b.getx(); double y=b.gety(); for(size_t i=0; i < n; ++i) { triple v=Controls[i]; x=m(x,xratio(v)); y=m(y,yratio(v)); } b=pair(x,y); if(t != NULL) delete[] Controls; } void drawNurbsPath3::displacement() { #ifdef HAVE_GL size_t nknots=degree+n+1; if(Controls == NULL) { Controls=new(UseGC) GLfloat[(weights ? 4 : 3)*n]; Knots=new(UseGC) GLfloat[nknots]; } if(weights) for(size_t i=0; i < n; ++i) store(Controls+4*i,controls[i],weights[i]); else for(size_t i=0; i < n; ++i) store(Controls+3*i,controls[i]); for(size_t i=0; i < nknots; ++i) Knots[i]=knots[i]; #endif } void drawNurbsPath3::render(double, const triple&, const triple&, double, bool remesh) { #ifdef HAVE_GL if(invisible) return; // TODO: implement NURBS renderer #endif } bool drawPixel::write(prcfile *out, unsigned int *, double, groupsmap&) { if(invisible) return true; out->addPoint(v,color,width); return true; } bool drawPixel::write(abs3Doutfile *out) { #ifdef HAVE_LIBGLM if(invisible) return true; RGBAColour Black(0.0,0.0,0.0,color.A); setcolors(color,color,Black,1.0,0.0,0.04,out); out->setKEY(KEY); out->addPixel(v,width); #endif return true; } void drawPixel::render(double size2, const triple& b, const triple& B, double perspective, bool remesh) { #ifdef HAVE_GL if(invisible) return; RGBAColour Black(0.0,0.0,0.0,color.A); setcolors(color,color,Black,1.0,0.0,0.04); setMaterial(material0Data,drawMaterial0); if(bbox2(Min,Max).offscreen()) { // Fully offscreen R.data.clear(); return; } R.queue(v,width); #endif } drawElement *drawPixel::transformed(const double* t) { return new drawPixel(t*v,p,width,KEY); } } //namespace camp asymptote-3.05/newexp.cc0000644000000000000000000000630515031566105014007 0ustar rootroot/***** * newexp.cc * Andy Hammerlindl 2003/07/28 * * Handles the abstract syntax for expressions the create new objects, * such as record, array, and function constructors. *****/ #include "newexp.h" #include "stm.h" #include "runtime.h" #include "runarray.h" #include "coenv.h" #include "inst.h" using namespace types; using trans::coder; using trans::coenv; using vm::inst; namespace absyntax { void printFrame(frame *f) { if (f == 0) { cerr << '0'; } else { cerr << f << " of "; printFrame(f->getParent()); } } void newRecordExp::prettyprint(ostream &out, Int indent) { prettyname(out, "newRecordExp", indent, getPos()); } types::ty *newRecordExp::transFromTyEntry(position pos, coenv &e, trans::tyEntry *ent) { types::ty *t = ent->t; if (t->kind == ty_error) return t; else if (t->kind != ty_record) { em.error(pos); em << "type '" << *t << "' is not a structure"; return primError(); } // Put the enclosing frame on the stack. if (!e.c.encodeParent(pos, ent)) { em.error(pos); em << "allocation of struct '" << *t << "' is not in a valid scope"; return primError(); } record *r = dynamic_cast(t); assert(r); // Encode the allocation. e.c.encode(inst::makefunc,r->getInit()); e.c.encode(inst::popcall); return t; } types::ty *newRecordExp::trans(coenv &e) { return transFromTyEntry(getPos(), e, result->transAsTyEntry(e, 0)); } types::ty *newRecordExp::getType(coenv &e) { types::ty *t = result->trans(e, true); if (t->kind != ty_error && t->kind != ty_record) return primError(); else return t; } void newArrayExp::prettyprint(ostream &out, Int indent) { prettyname(out,"newArrayExp",indent, getPos()); celltype->prettyprint(out, indent+1); if (dimexps) dimexps->prettyprint(out, indent+1); if (dims) dims->prettyprint(out, indent+1); if (ai) ai->prettyprint(out, indent+1); } types::ty *newArrayExp::trans(coenv &e) { types::ty *c = celltype->trans(e); if (c->kind == ty_void) { em.error(getPos()); em << "cannot declare array of type void"; return primError(); } if (dims) c = dims->truetype(c); if (ai) { ai->transToType(e, c); return c; } else if (dimexps || dims) { if (dimexps) { for (size_t i = 0; i < dimexps->size(); ++i) { (*dimexps)[i]->transToType(e, types::primInt()); c = new types::array(c); } } if (dims) { for (size_t i = 0; i < dims->size(); ++i) { e.c.encode(inst::intpush,0); } } e.c.encode(inst::intpush, (Int) ((dimexps ? dimexps->size():0) + (dims ? dims->size():0))); e.c.encode(inst::builtin, run::newDeepArray); return c; } else { em.compiler(getPos()); em << "new array expression must have either dims or dimexps"; return primError(); } } types::ty *newArrayExp::getType(coenv &e) { types::ty *c = celltype->trans(e); if (c->kind == ty_void) { return primError(); } if (dims) c = dims->truetype(c); if (dimexps) { Int depth = (Int)dimexps->size(); while (depth > 0) { c = new types::array(c); depth--; } } return c; } } // namespace absyntax asymptote-3.05/entry.cc0000644000000000000000000004772515031566105013655 0ustar rootroot/***** * entry.cc * Andy Hammerlindl 2002/08/29 * * All variables, built-in functions and user-defined functions reside * within the same namespace. To keep track of all these, table of * "entries" is used. *****/ #include #include #include #include #include "entry.h" #include "coder.h" using std::memset; using types::ty; using types::signature; using types::overloaded; using types::ty_vector; using types::ty_iterator; namespace trans { bool entry::pr::check(action act, coder &c) { // We assume PUBLIC permissions and one's without an associated record are not // stored. assert(perm!=PUBLIC && r!=0); return c.inTranslation(r->getLevel()) || (perm == RESTRICTED && act != WRITE); } void entry::pr::report(action act, position pos, coder &c) { if (!c.inTranslation(r->getLevel())) { if (perm == PRIVATE) { em.error(pos); em << "accessing private field outside of structure"; } else if (perm == RESTRICTED && act == WRITE) { em.error(pos); em << "modifying non-public field outside of structure"; } } } entry::entry(entry &e1, entry &e2) : where(e2.where), pos(e2.pos) { perms.insert(perms.end(), e1.perms.begin(), e1.perms.end()); perms.insert(perms.end(), e2.perms.begin(), e2.perms.end()); } entry::entry(entry &base, permission perm, record *r) : where(base.where), pos(base.pos) { perms.insert(perms.end(), base.perms.begin(), base.perms.end()); addPerm(perm, r); } bool entry::checkPerm(action act, coder &c) { for (mem::list::iterator p=perms.begin(); p != perms.end(); ++p) if (!p->check(act, c)) return false; return true; } void entry::reportPerm(action act, position pos, coder &c) { for (mem::list::iterator p=perms.begin(); p != perms.end(); ++p) p->report(act, pos, c); } varEntry::varEntry(varEntry &qv, varEntry &v) : entry(qv,v), t(v.t), location(new qualifiedAccess(qv.location, qv.getLevel(), v.location)) {} frame *varEntry::getLevel() { record *r=dynamic_cast(t); assert(r); return r->getLevel(); } void varEntry::encode(action act, position pos, coder &c) { reportPerm(act, pos, c); getLocation()->encode(act, pos, c); } void varEntry::encode(action act, position pos, coder &c, frame *top) { reportPerm(act, pos, c); getLocation()->encode(act, pos, c, top); } varEntry *qualifyVarEntry(varEntry *qv, varEntry *v) { return qv ? (v ? new varEntry(*qv,*v) : qv) : v; } tyEntry *tenv::add(symbol dest, names_t::value_type &x, varEntry *qualifier, coder &c) { mem::list& ents=x.second; if (ents.empty()) { return nullptr; } tyEntry *ent=ents.front(); if (!ent->checkPerm(READ, c)) { return nullptr; } if (permission perm = c.getPermission(); perm != PUBLIC) { // Add an additional restriction to ent based on c.getPermission(). ent = new tyEntry(ent, perm, c.thisType()); } tyEntry *qEnt = qualifyTyEntry(qualifier, ent); enter(dest, qEnt); return qEnt; } void tenv::add(tenv& source, varEntry *qualifier, coder &c) { // Enter each distinct (unshadowed) name,type pair. for(names_t::iterator p = source.names.begin(); p != source.names.end(); ++p) add(p->first, *p, qualifier, c); } tyEntry *tenv::add(symbol src, symbol dest, tenv& source, varEntry *qualifier, coder &c) { names_t::iterator p = source.names.find(src); if (p != source.names.end()) return add(dest, *p, qualifier, c); else return nullptr; } // To avoid writing qualifiers everywhere. typedef core_venv::cell cell; void core_venv::initTable(size_t capacity) { // Assert that capacity is a power of two. assert((capacity & (capacity-1)) == 0); this->capacity = capacity; size = 0; mask = capacity - 1; table = new (UseGC) cell[capacity]; memset(table, 0, sizeof(cell) * capacity); } void core_venv::clear() { if (size != 0) { memset(table, 0, sizeof(cell) * capacity); size = 0; } } void core_venv::resize() { size_t oldCapacity = capacity; size_t oldSize = size; cell *oldTable = table; initTable(capacity * 4); for (size_t i = 0; i < oldCapacity; ++i) { cell& b = oldTable[i]; if (!b.empty() && !b.isATomb()) { varEntry *old = store(b.name, b.ent); // We should not be shadowing anything when reconstructing the table. DEBUG_CACHE_ASSERT(old == 0); } } assert(size == oldSize); #if DEBUG_CACHE confirm_size(); for (size_t i = 0; i < oldCapacity; ++i) { cell& b = oldTable[i]; if (!b.empty() && !b.isATomb()) { assert(lookup(b.name, b.ent->getType()) == b.ent); } } #endif //cout << "resized from " << oldCapacity << " to " << capacity << endl; } cell& core_venv::cellByIndex(size_t i) { return table[i & mask]; } const cell& core_venv::cellByIndex(size_t i) const { return table[i & mask]; } void core_venv::confirm_size() { size_t sum = 0; for (size_t i = 0; i < capacity; ++i) { cell& b = table[i]; if (!b.empty() && !b.isATomb()) ++sum; } assert(sum == size); } varEntry *core_venv::storeNew(cell& cell, symbol name, varEntry *ent) { // Store the value into the cell. cell.storeNew(name, ent); // We now have a new entry. Update the size. ++size; // Check if the hash table has grown too big and needs to be expanded. if (2*size > capacity) resize(); // Nothing is shadowed. return 0; } varEntry *core_venv::storeNonSpecialAfterTomb(size_t tombIndex, symbol name, varEntry *ent) { DEBUG_CACHE_ASSERT(name.notSpecial()); DEBUG_CACHE_ASSERT(ent); DEBUG_CACHE_ASSERT(ent->getType()); signature *sig = ent->getSignature(); for (size_t i = tombIndex+1; ; ++i) { cell& b = cellByIndex(i); if (b.empty()) return storeNew(cellByIndex(tombIndex), name, ent); if (b.matches(name, sig)) return b.replaceWith(name, ent); } } varEntry *core_venv::storeSpecialAfterTomb(size_t tombIndex, symbol name, varEntry *ent) { DEBUG_CACHE_ASSERT(name.special()); DEBUG_CACHE_ASSERT(ent); DEBUG_CACHE_ASSERT(ent->getType()); ty *t = ent->getType(); for (size_t i = tombIndex+1; ; ++i) { cell& b = cellByIndex(i); if (b.empty()) return storeNew(cellByIndex(tombIndex), name, ent); if (b.matches(name, t)) return b.replaceWith(name, ent); } } size_t hashSig(const signature *sig) { return sig ? sig->hash() : 0; } size_t nonSpecialHash(symbol name, const signature *sig) { return name.hash() * 107 + hashSig(sig); } size_t nonSpecialHash(symbol name, const ty *t) { DEBUG_CACHE_ASSERT(t); return nonSpecialHash(name, t->getSignature()); } size_t specialHash(symbol name, const ty *t) { DEBUG_CACHE_ASSERT(t); return name.hash() * 107 + t->hash(); } size_t hash(symbol name, const ty *t) { if (name.special()) { return specialHash(name, t); } else { return nonSpecialHash(name, t); } } varEntry *core_venv::storeNonSpecial(symbol name, varEntry *ent) { DEBUG_CACHE_ASSERT(name.notSpecial()); DEBUG_CACHE_ASSERT(ent); DEBUG_CACHE_ASSERT(ent->getType()); signature *sig = ent->getSignature(); for (size_t i = nonSpecialHash(name, sig); ; ++i) { cell& b = cellByIndex(i); if (b.empty()) return storeNew(b, name, ent); if (b.matches(name, sig)) return b.replaceWith(name, ent); if (b.isATomb()) return storeNonSpecialAfterTomb(i, name, ent); } } varEntry *core_venv::storeSpecial(symbol name, varEntry *ent) { DEBUG_CACHE_ASSERT(name.special()); DEBUG_CACHE_ASSERT(ent); DEBUG_CACHE_ASSERT(ent->getType()); ty *t = ent->getType(); for (size_t i = specialHash(name, t); ; ++i) { cell& b = cellByIndex(i); if (b.empty()) return storeNew(b, name, ent); if (b.matches(name, t)) return b.replaceWith(name, ent); if (b.isATomb()) return storeSpecialAfterTomb(i, name, ent); } } varEntry *core_venv::store(symbol name, varEntry *ent) { DEBUG_CACHE_ASSERT(ent); DEBUG_CACHE_ASSERT(ent->getType()); return name.special() ? storeSpecial(name, ent) : storeNonSpecial(name, ent); } varEntry *core_venv::lookupSpecial(symbol name, const ty *t) { DEBUG_CACHE_ASSERT(name.special()); DEBUG_CACHE_ASSERT(t); for (size_t i = specialHash(name, t); ; ++i) { cell& b = cellByIndex(i); if (b.matches(name, t)) return b.ent; if (b.empty()) return 0; } } varEntry *core_venv::lookupNonSpecial(symbol name, const signature *sig) { DEBUG_CACHE_ASSERT(name.notSpecial()); for (size_t i = nonSpecialHash(name, sig); ; ++i) { cell& b = cellByIndex(i); if (b.matches(name, sig)) return b.ent; if (b.empty()) return 0; } } varEntry *core_venv::lookup(symbol name, const ty *t) { DEBUG_CACHE_ASSERT(t); return name.special() ? lookupSpecial(name, t) : lookupNonSpecial(name, t->getSignature()); } void core_venv::removeNonSpecial(symbol name, const signature *sig) { DEBUG_CACHE_ASSERT(name.notSpecial()); for (size_t i = nonSpecialHash(name, sig); ; ++i) { cell& b = cellByIndex(i); if (b.matches(name, sig)) { b.remove(); --size; return; } DEBUG_CACHE_ASSERT(!b.empty()); } } void core_venv::removeSpecial(symbol name, const ty *t) { DEBUG_CACHE_ASSERT(name.special()); DEBUG_CACHE_ASSERT(t); for (size_t i = specialHash(name, t); ; ++i) { cell& b = cellByIndex(i); if (b.matches(name, t)) { b.remove(); --size; return; } DEBUG_CACHE_ASSERT(!b.empty()); } } void core_venv::remove(symbol name, const ty *t) { DEBUG_CACHE_ASSERT(t); if (name.special()) removeSpecial(name, t); else removeNonSpecial(name, t->getSignature()); } size_t numFormals(ty *t) { signature *sig = t->getSignature(); return sig ? sig->getNumFormals() : 0; } size_t SigHash::operator()(const mem::pair& p) const { return hash(p.first, p.second); } bool SigEquiv::operator()(const mem::pair& p1, const mem::pair& p2) const { symbol name1 = p1.first, name2 = p2.first; if (name1 != name2) return false; ty *t1 = p1.second, *t2 = p2.second; DEBUG_CACHE_ASSERT(t1); DEBUG_CACHE_ASSERT(t2); if (name1.special()) { return equivalent(t1, t2); } else { return equivalent(t1->getSignature(), t2->getSignature()); } } void venv::checkName(symbol name) { #if 0 // This size test is too slow, even for DEBUG_CACHE. core.confirm_size(); #endif // Get the type, and make it overloaded if it is not (for uniformity). overloaded o; ty *t = getType(name); if (!t) t = &o; if (!t->isOverloaded()) { o.add(t); t = &o; } assert(t->isOverloaded()); size_t maxFormals = names[name].maxFormals; size_t size = 0; for (ty_iterator i = t->begin(); i != t->end(); ++i) { assert(numFormals(*i) <= maxFormals); varEntry *v = lookByType(name, *i); assert(v); assert(equivalent(v->getType(), *i)); ++size; } size_t matches = 0; core_venv::const_iterator end = core.end(); for (core_venv::const_iterator p = core.begin(); p != end; ++p) { if (p->name == name) { ++matches; varEntry *v=p->ent; assert(v); assert(equivalent(t, v->getType())); } } assert(matches == size); } void rightKind(ty *t) { if (t && t->isOverloaded()) { ty_vector& set=((overloaded *)t)->sub; assert(set.size() > 1); } } #ifdef DEBUG_CACHE #define RIGHTKIND(t) (rightKind(t)) #define CHECKNAME(name) (checkName(name)) #else #define RIGHTKIND(t) (void)(t) #define CHECKNAME(name) (void)(name) #endif void venv::namevalue::addType(ty *s) { RIGHTKIND(t); #ifdef DEBUG_CACHE assert(!s->isOverloaded()); #endif if (t == 0) { maxFormals = numFormals(s); t = s; } else { if (!t->isOverloaded()) t = new overloaded(t); #ifdef DEBUG_CACHE assert(t->isOverloaded()); assert(!equivalent(t, s)); #endif ((overloaded *)t)->add(s); size_t n = numFormals(s); if (n > maxFormals) maxFormals = n; } RIGHTKIND(t); } void venv::namevalue::replaceType(ty *new_t, ty *old_t) { #ifdef DEBUG_CACHE assert(t != 0); RIGHTKIND(t); #endif // TODO: Test for equivalence. if (t->isOverloaded()) { for (ty_iterator i = t->begin(); i != t->end(); ++i) { if (equivalent(old_t, *i)) { *i = new_t; return; } } // An error, the type was not found. assert("unreachable code" == 0); } else { #ifdef DEBUG_CACHE assert(equivalent(old_t, t)); #endif t = new_t; } #ifdef DEBUG_CACHE assert(t != 0); RIGHTKIND(t); #endif } #ifdef DEBUG_CACHE void venv::namevalue::popType(astType *s) #else void venv::namevalue::popType() #endif { #ifdef DEBUG_CACHE assert(t); RIGHTKIND(t); assert(!s->isOverloaded()); #endif if (t->isOverloaded()) { ty_vector& set=((overloaded *)t)->sub; #ifdef DEBUG_CACHE assert(set.size() > 0); assert(equivalent(set.back(), s)); #endif // We are relying on the fact that this was the last type added to t, and // that type are added by pushing them on the end of the vector. set.pop_back(); if (set.size() == 1) t = set.front(); } else { #ifdef DEBUG_CACHE assert(equivalent(t, s)); #endif t = 0; } RIGHTKIND(t); // Don't try to reduce numFormals as I doubt it is worth the cost of // recalculating. } void venv::remove(const addition& a) { CHECKNAME(a.name); if (a.shadowed) { varEntry *popEnt = core.store(a.name, a.shadowed); DEBUG_CACHE_ASSERT(popEnt); // Unshadow the previously shadowed varEntry. names[a.name].replaceType(a.shadowed->getType(), popEnt->getType()); } else { // Remove the (name,sig) key completely. #if DEBUG_CACHE varEntry *popEnt = core.lookup(a.name, a.t); assert(popEnt); names[a.name].popType(popEnt->getType()); #else names[a.name].popType(); #endif core.remove(a.name, a.t); } CHECKNAME(a.name); } void venv::beginScope() { if (core.empty()) { assert(scopesizes.empty()); ++empty_scopes; } else { scopesizes.push(additions.size()); } } void venv::endScope() { if (scopesizes.empty()) { // The corresponding beginScope happened when the venv was empty, so // clear the hash tables to return to that state. core.clear(); names.clear(); assert(empty_scopes > 0); --empty_scopes; } else { size_t scopesize = scopesizes.top(); assert(additions.size() >= scopesize); while (additions.size() > scopesize) { remove(additions.top()); additions.pop(); } scopesizes.pop(); } } // Adds the definitions of the top-level scope to the level underneath, // and then removes the top scope. void venv::collapseScope() { if (scopesizes.empty()) { // Collapsing an empty scope. assert(empty_scopes > 0); --empty_scopes; } else { // As scopes are stored solely by the number of entries at the beginning // of the scope, popping the top size will put all of the entries into the // next scope down. scopesizes.pop(); } } void venv::enter(symbol name, varEntry *v) { CHECKNAME(name); // Store the new variable. If it shadows an older variable, that varEntry // will be returned. varEntry *shadowed = core.store(name, v); ty *t = v->getType(); // Record the addition, so it can be undone during endScope. if (!scopesizes.empty()) additions.push(addition(name, t, shadowed)); if (shadowed) // The new value shadows an old value. They have the same signature, but // possibly different return types. If necessary, update the type stored // by name. names[name].replaceType(t, shadowed->getType()); else // Add to the names hash table. names[name].addType(t); CHECKNAME(name); } varEntry *venv::lookBySignature(symbol name, signature *sig) { // Rest arguments are complicated and rare. Don't handle them here. if (sig->hasRest()) return 0; // Likewise with the special operators. if (name.special()) return 0; namevalue& nv = names[name]; // Avoid ambiguities with default parameters. if (nv.maxFormals != sig->getNumFormals()) return 0; // See if this exactly matches a function in the table. varEntry *ve = core.lookupNonSpecial(name, sig); if (!ve) return 0; // Keyword-only arguments may cause matching to fail. if (ve->getSignature()->numKeywordOnly > 0) return 0; // At this point, any function with an equivalent signature will be equal // to the result of the normal overloaded function resolution. We may // safely return it. return ve; } void venv::add(venv& source, varEntry *qualifier, coder &c) { const bool isAutoUnravel = c.isAutoUnravel(); for (const cell& p : source.core) { DEBUG_CACHE_ASSERT(p.filled()); varEntry *v=p.ent; if (v->checkPerm(READ, c)) { if (permission perm = c.getPermission(); perm != PUBLIC) { // Add an additional restriction to v based on c.getPermission(). v = new varEntry(*v, perm, c.thisType()); } varEntry *qve=qualifyVarEntry(qualifier, v); enter(p.name, qve); if (isAutoUnravel) { registerAutoUnravel(p.name, qve); } } } } bool venv::add( symbol src, symbol dest, venv& source, varEntry *qualifier, coder &c, mem::vector *addedVec ) { ty *t=source.getType(src); if (!t) return false; if (t->isOverloaded()) { bool added=false; for (ty_iterator i = t->begin(); i != t->end(); ++i) { varEntry *v=source.lookByType(src, *i); if (v->checkPerm(READ, c)) { if (permission perm = c.getPermission(); perm != PUBLIC) { // Add an additional restriction to v based on c.getPermission(). v = new varEntry(*v, perm, c.thisType()); } varEntry *qve=qualifyVarEntry(qualifier, v); enter(dest, qve); if (addedVec != nullptr) { addedVec->push_back(qve); } added=true; } } return added; } else { varEntry *v=source.lookByType(src, t); if (!v->checkPerm(READ, c)) { return false; } if (permission perm = c.getPermission(); perm != PUBLIC) { // Add an additional restriction to v based on c.getPermission(). v = new varEntry(*v, perm, c.thisType()); } varEntry *qve=qualifyVarEntry(qualifier, v); enter(dest, qve); if (addedVec != nullptr) { addedVec->push_back(qve); } return true; } } ty *venv::getType(symbol name) { return names[name].t; } void listValue(symbol name, varEntry *v, record *module) { if (!module || v->whereDefined() == module) { if (settings::getSetting("where")) cout << v->getPos(); v->getType()->printVar(cout, name); cout << ";\n"; } } void venv::listValues(symbol name, record *module) { ty *t=getType(name); if (t->isOverloaded()) for (ty_iterator i = t->begin(); i != t->end(); ++i) listValue(name, lookByType(name, *i), module); else listValue(name, lookByType(name, t), module); flush(cout); } void venv::list(record *module) { // List all functions and variables. for (namemap::iterator N = names.begin(); N != names.end(); ++N) listValues(N->first, module); } void venv::completions(mem::list& l, string start) { for(namemap::iterator N = names.begin(); N != names.end(); ++N) if (prefix(start, N->first) && N->second.t) l.push_back(N->first); } void venv::registerAutoUnravel(symbol name, varEntry *v, AutounravelPriority priority) { mem::pair p = {name, v->getType()}; if (nonShadowableAutoUnravels.find(p) != nonShadowableAutoUnravels.end()) { if (priority == AutounravelPriority::FORCE) { em.error(v->getPos()); em << "cannot shadow autounravel " << name; } return; } autoUnravels.emplace_front(name, v); if (priority == AutounravelPriority::FORCE) { // The value doesn't matter, we just need to know that the key exists. nonShadowableAutoUnravels[p] = nullptr; } } } // namespace trans asymptote-3.05/symbol.cc0000644000000000000000000002162015031566105014003 0ustar rootroot/***** * symbol.cc * Andy Hammerlindl 2002/06/18 * * Creates symbols from strings so that multiple calls for a symbol of * the same string will return an identical object. *****/ #include #include using std::strlen; #include "settings.h" #include "symbol.h" namespace sym { const char USED = 1; const char SKIP = 2; struct symbolRecord { // When a symbol is entered into the table, its hash is computed. If the // corresponding entry in the table is full, this value is incremented until // an empty slot is found. hashplus stores the end value. // Each symbol has a unique hashplus value, even if there is a collision in // the original hashing function. uint hashplus; // Whether the cell of the table is empty, in use, or a "skip" entry due to // a resizing of the table. unsigned char flag; // Pointer to a copy of the string (allocated on the heap). This string // will never be deallocated. Symbols, in essence, last forever. char *s; }; // The table size must be a power of two so that (h % tableSize) can be // replaced by (h & tableMask). 1 << 15 was chosen based on the number of // unique symbols (roughly 4000) which occured in all of the base modules. const size_t SYMBOL_TABLE_BASE_CAPACITY = 1 << 15; symbolRecord baseSymbolTable[SYMBOL_TABLE_BASE_CAPACITY]; symbolRecord *table = baseSymbolTable; size_t tableCapacity = SYMBOL_TABLE_BASE_CAPACITY; uint tableMask = 0; size_t tableSize = 0; symbolRecord &recordByHashplus(uint h) { return table[h & tableMask]; } GCInit symbol::initialize; symbol symbol::nullsym; symbol symbol::initsym; symbol symbol::castsym; symbol symbol::ecastsym; const char *nullsymstr = ""; void initTable() { tableMask = (uint)(tableCapacity - 1); tableSize = 0; // Set every entry to empty. (Is this faster than memsetting the whole // thing?) for (size_t i = 0; i < tableCapacity; ++i) table[i].flag = 0; // The zeroth entry is reserved for the "null" symbol. if (table == baseSymbolTable) { table[0].flag = USED; table[0].s = new char[strlen(nullsymstr) + 1]; strcpy(table[0].s, nullsymstr); ++tableSize; symbol::nullsym.hashplus = 0; symbol::initsym = symbol::opTrans("init"); symbol::castsym = symbol::opTrans("cast"); symbol::ecastsym = symbol::opTrans("ecast"); } } // Hashing constants found experimentally to reduce collision (a little). const uint A = 25191, B = 16342, C = 1746, D = 18326; // Hash the string into an integer. Experimental testing has shown that // hashing only the first few letters seems to be faster than hashing deeper // into the string, even though this approach causes more hash collisions. uint hash(const char *s, size_t len) { uint h = s[0]; if (len == 2) return h; h += A*s[1]; if (len == 3) return h; h += B*s[2]; if (len == 4) return h; h += C*s[3]; if (len == 5) return h; h += D*s[4]; return h+len; } /* Under normal circumstances, the initial table should be large enough for * all of the symbols used and will never be resized. Just in case the * program encounters a large number of distinct symbols, we implement * resizing of the table. */ void resizeTable() { symbolRecord *oldTable = table; size_t oldSize = tableSize; size_t oldCapacity = tableCapacity; tableCapacity *= 4; table = new symbolRecord[tableCapacity]; initTable(); // The null symbol is a special case. table[0] = oldTable[0]; ++tableSize; #if 0 printf("old:\n"); for (size_t i = 0; i < oldCapacity; ++i) { symbolRecord &r = oldTable[i]; if (r.flag != USED) continue; printf(" %u -> %s\n", r.hashplus, r.s); } #endif for (size_t i = 1; i < oldCapacity; ++i) { symbolRecord &r = oldTable[i]; if (r.flag != USED) continue; // Entries that were skipped over when this symbol was entered into the // old hash table may not appear in the same spot in the new hash table. // Put "SKIP" entries in their place, so that the symbol will still be // found. for (uint h = hash(r.s, strlen(r.s)+1); h < r.hashplus; ++h) { symbolRecord &skipr = recordByHashplus(h); if (skipr.flag == 0) skipr.flag = SKIP; } // Enter the symbol in its spot. symbolRecord &newr = recordByHashplus(r.hashplus); assert(newr.flag != USED); newr.flag = USED; newr.hashplus = r.hashplus; newr.s = r.s; ++tableSize; } #if 0 printf("new:\n"); for (size_t i = 0; i < tableCapacity; ++i) { symbolRecord &r = table[i]; if (r.flag != USED) continue; printf(" %u -> %s\n", r.hashplus, r.s); } #endif assert(tableSize == oldSize); // Debugging resize. for (size_t i = 1; i < oldCapacity; ++i) { symbolRecord &r = oldTable[i]; if (r.flag != USED) continue; symbolRecord &newr = recordByHashplus(r.hashplus); assert(newr.hashplus == r.hashplus); assert(newr.flag != 0); assert(newr.flag != SKIP); assert(newr.flag == USED); assert(newr.s = r.s); if (strncmp(r.s, "gensym", 6) != 0) assert(symbol::rawTrans(r.s, strlen(r.s)+1).hashplus == r.hashplus); } #if 0 // Diagnostics. uint empty=0, used=0, skip=0; for (size_t i = 0; i < tableCapacity; ++i) { symbolRecord &r = table[i]; if (r.flag == 0) ++empty; else if (r.flag == USED) ++used; else if (r.flag == SKIP) ++skip; else assert("Unknown flag" == 0); } cout << "Resized symbol table. " << "empty: " << empty << "used: " << used << "skip: " << skip << endl; #endif } symbol symbolize(uint h) { symbol s; s.hashplus = h; return s; } // Handles the insertion of a new symbol into a table the has been resized (or // needs resizing). symbol advancedInsert(const char *s, size_t len) { if (2*tableSize >= tableCapacity) resizeTable(); uint hashplus = hash(s, len); #if 1 assert(s != 0); assert(len > 0); assert(2*tableSize <= tableCapacity); #endif // We know the symbol is not in the table. Just search for the first unused // entry (either empty or a skip entry) and insert there. for (;;) { symbolRecord &r = recordByHashplus(hashplus); if (r.flag != USED) { r.flag = USED; r.s = new char[len]; memcpy(r.s, s, len); assert(r.s[len-1] == '\0'); r.hashplus = hashplus; ++tableSize; assert(2*tableSize <= tableCapacity); return symbolize(hashplus); } ++hashplus; } assert("Unreachable code" == 0); return symbol::nullsym; } symbol symbol::gensym(string s) { // Gensym can be inserted as if it were a normal string not already in the // table. advancedInsert handles this. s = "gensym " + s; return advancedInsert(s.c_str(), s.size() + 1); } symbol symbol::rawTrans(const char *s, size_t len) { uint hashplus = sym::hash(s, len); #if 1 assert(s != 0); assert(len > 0); assert(2*tableSize <= tableCapacity); #endif // Search through the table till we find the symbol already translated or // an empty field. for (;;) { symbolRecord &r = recordByHashplus(hashplus); // Translating pre-existing symbols is more common, so check for it first. if (r.hashplus == hashplus && r.flag == USED && strncmp(r.s, s, len) == 0) { return symbolize(hashplus); } // Then check for an empty entry, in which case the entry is added. if (r.flag == 0) { // Test if the table needs resizing before entering a new symbol, or if // the table has already been resized. In either case, the symbol will // be added to a resized table which may contain skip entries, and a // more involved insertion routine is needed. if (2*tableSize >= SYMBOL_TABLE_BASE_CAPACITY) return advancedInsert(s, len); r.flag = USED; r.s = new char[len]; memcpy(r.s, s, len); assert(r.s[len-1] == '\0'); r.hashplus = hashplus; ++tableSize; assert(2*tableSize <= tableCapacity); return symbolize(hashplus); } // A case where a different symbol is in the spot, continue along the // table. ++hashplus; } assert("Unreachable code" == 0); return symbol::nullsym; } symbol::operator string () const { symbolRecord &r = recordByHashplus(this->hashplus); return (string)r.s; } #ifdef USEGC symbol::operator std::string () const { symbolRecord &r = recordByHashplus(this->hashplus); return (std::string)r.s; } #endif ostream& operator<< (ostream& out, const symbol sym) { symbolRecord &r = recordByHashplus(sym.hashplus); return out << r.s; } } // end namespace sym /* Define all of operator symbols SYM_PLUS, etc. */ #define OPSYMBOL(str, name) \ sym::symbol name = sym::symbol::opTrans(str) #include "opsymbols.h" #undef OPSYMBOL /* Define all of the symbols of the type SYM(name) in selected files. */ #define ADDSYMBOL(name) \ sym::symbol PRETRANSLATED_SYMBOL_##name = sym::symbol::literalTrans(#name) #include "allsymbols.h" #undef ADDSYMBOL asymptote-3.05/runpath.h0000644000000000000000000000020615031566132014016 0ustar rootroot/***** Autogenerated from runpath.in; changes will be overwritten *****/ #pragma once namespace run { void nullPath(vm::stack *); } asymptote-3.05/mathop.h0000644000000000000000000001455315031566105013637 0ustar rootroot/***** * mathop.h * Tom Prince 2005/3/18 * * Defines some runtime functions used by the stack machine. * *****/ #ifndef MATHOP_H #define MATHOP_H #include #include "stack.h" #include "mod.h" #include "triple.h" namespace run { template struct less { bool operator() (T x, T y, size_t=0) {return x < y;} }; template struct lessequals { bool operator() (T x, T y, size_t=0) {return x <= y;} }; template struct equals { bool operator() (T x, T y, size_t=0) {return x == y;} }; template struct greaterequals { bool operator() (T x, T y, size_t=0) {return x >= y;} }; template struct greater { bool operator() (T x, T y, size_t=0) {return x > y;} }; template struct notequals { bool operator() (T x, T y, size_t=0) {return x != y;} }; template struct And { bool operator() (T x, T y, size_t=0) {return x && y;} }; template struct Or { bool operator() (T x, T y, size_t=0) {return x || y;} }; template struct Xor { bool operator() (T x, T y, size_t=0) {return x ^ y;} }; template struct plus { T operator() (T x, T y, size_t=0) {return x+y;} }; template struct minus { T operator() (T x, T y, size_t=0) {return x-y;} }; template struct times { T operator() (T x, T y, size_t=0) {return x*y;} }; template <> struct times { camp::triple operator() (double x, camp::triple y, size_t=0) {return x*y;} }; template struct timesR { T operator () (T y, double x, size_t=0) {return x*y;} }; extern void dividebyzero(size_t i=0); extern void integeroverflow(size_t i=0); template struct divide { T operator() (T x, T y, size_t i=0) { if(y == 0) dividebyzero(i); return x/y; } }; template <> struct divide { camp::triple operator() (camp::triple x, double y, size_t=0) {return x/y;} }; inline bool validInt(double x) { return x > (double) Int_MIN-0.5 && x < (double) Int_MAX+0.5; } inline void checkInt(double x, size_t i) { if(validInt(x)) return; integeroverflow(i); } inline Int Intcast(double x) { if(validInt(x)) return (Int) x; integeroverflow(0); return 0; } template<> struct plus { Int operator() (Int x, Int y, size_t i=0) { if((y > 0 && x > Int_MAX-y) || (y < 0 && x < Int_MIN-y)) integeroverflow(i); return x+y; } }; template<> struct minus { Int operator() (Int x, Int y, size_t i=0) { if((y < 0 && x > Int_MAX+y) || (y > 0 && x < Int_MIN+y)) integeroverflow(i); return x-y; } }; template<> struct times { Int operator() (Int x, Int y, size_t i=0) { if(y == 0) return 0; if(y < 0) {y=-y; x=-x;} if(y > Int_MAX || x > Int_MAX/y || x < Int_MIN/y) integeroverflow(i); return x*y; } }; template<> struct divide { double operator() (Int x, Int y, size_t i=0) { if(y == 0) dividebyzero(i); return ((double) x)/(double) y; } }; template void Negate(vm::stack *s) { T a=vm::pop(s); s->push(-a); } inline Int Negate(Int x, size_t i=0) { if(x < -Int_MAX) integeroverflow(i); return -x; } template<> inline void Negate(vm::stack *s) { s->push(Negate(vm::pop(s))); } inline double pow(double x, double y) { return ::pow(x,y); } template T pow(T x, Int y) { if(y == 0) return 1.0; if(x == 0.0 && y > 0) return 0.0; if(y < 0) {y=-y; x=1/x;} T r=1.0; for(;;) { if(y & 1) r *= x; if((y >>= 1) == 0) return r; x *= x; } } template struct power { T operator() (T x, T y, size_t=0) {return pow(x,y);} }; template <> struct power { Int operator() (Int x, Int p, size_t i=0) { if(p == 0) return 1; Int sign=1; if(x < 0) { if(p % 2) sign=-1; x=-x; } if(p > 0) { if(x == 0) return 0; Int r = 1; for(;;) { if(p & 1) { if(r > Int_MAX/x) integeroverflow(i); r *= x; } if((p >>= 1) == 0) return sign*r; if(x > Int_MAX/x) integeroverflow(i); x *= x; } } else { if(x == 1) return sign; ostringstream buf; if(i > 0) buf << "array element " << i << ": "; buf << "Only 1 and -1 can be raised to negative exponents as integers."; vm::error(buf); return 0; } } }; template struct mod { T operator() (T x, T y, size_t i=0) { if(y == 0) dividebyzero(i); return portableMod(x,y); } }; template <> struct mod { Int operator() (Int x, Int y, size_t i=0) { if(y == 0) dividebyzero(i); return imod(x,y); } }; template struct quotient { Int operator() (Int x, Int y, size_t i=0) { if(y == 0) dividebyzero(i); if(y == -1) return Negate(x); // Implementation-independent definition of integer division: round down Int q=x/y; if(!((x < 0)^(y < 0)) || y*q == x) return q; return q-1; } }; template struct min { T operator() (T x, T y, size_t=0) {return x < y ? x : y;} }; template struct max { T operator() (T x, T y, size_t=0) {return x > y ? x : y;} }; template inline T Min(T a, T b) { return (a < b) ? a : b; } template inline T Max(T a, T b) { return (a > b) ? a : b; } template struct minbound { camp::pair operator() (camp::pair z, camp::pair w) { return camp::pair(Min(z.getx(),w.getx()),Min(z.gety(),w.gety())); } camp::triple operator() (camp::triple u, camp::triple v) { return camp::triple(Min(u.getx(),v.getx()),Min(u.gety(),v.gety()), Min(u.getz(),v.getz())); } }; template struct maxbound { camp::pair operator() (camp::pair z, camp::pair w) { return camp::pair(Max(z.getx(),w.getx()),Max(z.gety(),w.gety())); } camp::triple operator() (camp::triple u, camp::triple v) { return camp::triple(Max(u.getx(),v.getx()),Max(u.gety(),v.gety()), Max(u.getz(),v.getz())); } }; template void realReal(vm::stack *s) { double x=vm::pop(s); s->push(func(x)); } template class op> void binaryOp(vm::stack *s) { T b=vm::pop(s); T a=vm::pop(s); s->push(op()(a,b)); } template void interp(vm::stack *s) { double t=vm::pop(s); T b=vm::pop(s); T a=vm::pop(s); s->push((1-t)*a+t*b); } } // namespace run #endif //MATHOP_H asymptote-3.05/jsfile.h0000644000000000000000000000522615031566105013620 0ustar rootroot#ifndef JSFILE_H #define JSFILE_H #include #include "common.h" #include "triple.h" #include "locate.h" #include "prcfile.h" #include "abs3doutfile.h" namespace camp { class jsfile : public abs3Doutfile { jsofstream out; public: jsfile(); jsfile(string name); ~jsfile(); void close() override; void addKey() { if(settings::keys) out << "// " << this->KEY << newl; } void addCurve(const triple& z0, const triple& c0, const triple& c1, const triple& z1) override; void addCurve(const triple& z0, const triple& z1) override; void addPixel(const triple& z0, double width) override; void addTriangles(size_t nP, const triple* P, size_t nN, const triple* N, size_t nC, const prc::RGBAColour* C, size_t nI, const uint32_t (*PI)[3], const uint32_t (*NI)[3], const uint32_t (*CI)[3]) override; void addCylinder(const triple& center, double radius, double height, const double& polar, const double& azimuth, bool core) override; void addDisk(const triple& center, double radius, const double& polar, const double& azimuth) override; void addTube(const triple *g, double width, bool core) override; #ifdef HAVE_LIBGLM void addMaterial(Material const& mat) override; #endif void addSphere(triple const& center, double radius) override; void addHemisphere(triple const& center, double radius, double const& polar, double const& azimuth) override; void addPatch(triple const* controls, prc::RGBAColour const* c) override; void addStraightPatch(triple const* controls, prc::RGBAColour const* c) override; void addBezierTriangle(triple const* controls, prc::RGBAColour const* c) override; void addStraightBezierTriangle(triple const* controls, prc::RGBAColour const* c) override; void svgtohtml(string name); void precision(int digits) override {out.precision(digits);} protected: void copy(string name, bool header=false); void header(string name); void meta(string name, bool scalable=true); void finish(string name); void footer(string name); void open(string name); void comment(string name); void addColor(const prc::RGBAColour& c); void addIndices(const uint32_t *I); void addRawPatch(const triple* controls, size_t n, const prc::RGBAColour *colors, size_t nc); void addSphere(const triple& center, double radius, bool half=false, const double& polar=0.0, const double& azimuth=0.0); private: bool finished; string fileName; }; } //namespace camp #endif asymptote-3.05/v3dheadertypes.h0000644000000000000000000000225315031566132015273 0ustar rootroot// Enum class for v3dheadertypes // AUTO-GENERATED from v3dheadertypes.csv namespace camp { enum v3dheadertypes : uint32_t { // UINT Canvas width canvasWidth=1, // UINT Canvas heighot canvasHeight=2, // BOOL true: absolute size; false: scale to canvas absolute=3, // TRIPLE Scene minimum bounding box corners minBound=4, // TRIPLE Scene maximum bounding box corners maxBound=5, // BOOL true: orthographic; false: perspective orthographic=6, // REAL Field of view angle (in radians) angleOfView=7, // REAL Initial zoom initialZoom=8, // PAIR Viewport shift (for perspective projection) viewportShift=9, // PAIR Margin around viewport viewportMargin=10, // RGB Direction and color of each point light source light=11, // RGBA Background color background=12, // REAL Zoom base factor zoomFactor=13, // REAL Zoom pinch factor zoomPinchFactor=14, // REAL Zoom pinch limit zoomPinchCap=15, // REAL Zoom power step zoomStep=16, // REAL Shift-mode maximum hold distance (pixels) shiftHoldDistance=17, // REAL Shift-mode hold time (milliseconds) shiftWaitTime=18, // REAL Shift-mode vibrate time (milliseconds) vibrateTime=19, }; } // namespace camp // End of File asymptote-3.05/beziercurve.h0000644000000000000000000000256615031566105014675 0ustar rootroot/***** * beziercurve.h * Author: John C. Bowman * * Render a Bezier curve. *****/ #ifndef BEZIERCURVE_H #define BEZIERCURVE_H #include "drawelement.h" namespace camp { #ifdef HAVE_GL extern const double Fuzz; extern const double Fuzz2; struct BezierCurve { vertexBuffer data; double res,res2; bool Onscreen; BezierCurve() : Onscreen(true) {} void init(double res); // Approximate bounds by bounding box of control polyhedron. bool offscreen(size_t n, const triple *v) { if(bbox2(n,v).offscreen()) { Onscreen=false; return true; } return false; } void render(const triple *p, bool straight); void render(const triple *p, GLuint I0, GLuint I1); void append() { material1Data.append(data); } void notRendered() { material1Data.rendered=false; } void queue(const triple *g, bool straight, double ratio) { data.clear(); notRendered(); Onscreen=true; init(pixelResolution*ratio); render(g,straight); } }; struct Pixel { vertexBuffer data; void append() { material0Data.append0(data); } void notRendered() { material0Data.rendered=false; } void queue(const triple& p, double width) { data.clear(); notRendered(); MaterialIndex=materialIndex; data.indices.push_back(data.vertex0(p,width)); append(); } void draw(); }; #endif } //namespace camp #endif asymptote-3.05/lspserv.cc0000644000000000000000000005213015031566105014174 0ustar rootroot// // Created by Supakorn on 5/13/2021. // #if HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LSP #include "lspserv.h" #include #include #include #include #include #include #include #include "common.h" #include "dec.h" #include "asyprocess.h" #include "locate.h" #define REGISTER_REQ_FN(typ, fn) remoteEndPoint->registerHandler(\ [this](typ::request const& req) { return this->fn(req); }); #define REGISTER_NOTIF_FN(typ, handler) remoteEndPoint->registerHandler(\ [this](typ::notify& notif) { this->handler(notif); }); namespace AsymptoteLsp { using std::unique_ptr; using std::shared_ptr; using absyntax::block; using Level=lsp::Log::Level; class SearchPathAddition { public: SearchPathAddition(mem::string const& dir) { settings::searchPath.push_back(dir); } SearchPathAddition(SearchPathAddition const&) = delete; SearchPathAddition& operator=(SearchPathAddition const&) = delete; SearchPathAddition(SearchPathAddition&&) = delete; SearchPathAddition& operator=(SearchPathAddition&&) = delete; ~SearchPathAddition() { settings::searchPath.pop_back(); } }; std::string wslDos2Unix(std::string const& dosPath) { #ifndef _WIN32 bool isDrivePath=false; char drive; if (dosPath.length() >= 3) { if (dosPath[0] == '/' and dosPath[2] == ':') { isDrivePath=true; drive=dosPath[1]; } } if (isDrivePath) { std::stringstream sstream; sstream << "/mnt/" << (char) tolower(drive) << dosPath.substr(3); return sstream.str(); } else #endif { return dosPath; } } std::string wslUnix2Dos(std::string const& unixPath) { #ifndef _WIN32 bool isMntPath=false; char drive; #ifdef __GNU__ #define PATH_MAX 4096 #endif char actPath[PATH_MAX]; if(!realpath(unixPath.c_str(), actPath)) return ""; std::string fullPath(actPath); if (fullPath.length() >= 7) // /mnt/ { if (fullPath.find("/mnt/") == 0) { isMntPath=true; drive=fullPath[5]; } } if (isMntPath) { std::stringstream sstream; sstream << "/" << (char) tolower(drive) << ":" << fullPath.substr(6); return sstream.str(); } else { return fullPath; } #else return unixPath; #endif } TextDocumentHover::Either fromString(std::string const& str) { auto strobj=std::make_pair(make_optional(str), optional()); std::vector vec{strobj}; return std::make_pair(vec, nullopt); } TextDocumentHover::Either fromMarkedStr(lsMarkedString const& markedString) { auto strobj=std::make_pair((optional) nullopt, make_optional(markedString)); std::vector vec{strobj}; return std::make_pair(vec, nullopt); } TextDocumentHover::Either fromMarkedStr(std::vector const& stringList, std::string const& language) { std::vector, optional>> vec; std::transform(stringList.begin(), stringList.end(), std::back_inserter(vec), [&language](std::string const& str) { lsMarkedString lms; lms.language=language; lms.value=str; return std::make_pair((optional) nullopt, make_optional(lms)); }); return std::make_pair(vec, nullopt); } TextDocumentHover::Either fromMarkedStr(std::string const& str, std::string const& language) { lsMarkedString lms; lms.language=language; lms.value=str; return fromMarkedStr(lms); } std::string getDocIdentifierRawPath(lsTextDocumentIdentifier const& textDocIdentifier) { lsDocumentUri fileUri(textDocIdentifier.uri); std::string rawPath=std::string(fileUri.GetRawPath()); if(settings::getSetting("wsl")) rawPath=wslDos2Unix(rawPath); return static_cast(rawPath); } void AsymptoteLspServer::generateMissingTrees(std::string const& inputFile) { using extRefMap=std::unordered_map; //using extRefMapLoc = std::pair; std::queue procList; std::unordered_set processing; processing.emplace(inputFile); SymbolContext* ctx=symmapContextsPtr->at(inputFile).get(); for (auto const& locPair : ctx->getEmptyRefs()) { procList.emplace(locPair); } // standard BFS algorithm while (not procList.empty()) { auto it=procList.front(); procList.pop(); std::string filename(it->first); processing.emplace(filename); auto mapIt=symmapContextsPtr->find(filename); if (mapIt != symmapContextsPtr->end()) { it->second=mapIt->second.get(); } else { block* blk=ifile(mem::string(filename.c_str())).getTree(); auto s=symmapContextsPtr->emplace( filename, make_unique(posInFile(1, 1), filename)); auto fit=std::get<0>(s); if(blk == nullptr) { // dead end. file cannot be parsed. no new paths. continue; } blk->createSymMap(fit->second.get()); // parse symbol from there. // set plain.asy to plain if (plainCtx != nullptr) { fit->second->extRefs.extFileRefs[plainFile]=plainCtx; } // also parse its neighbors for (auto const& sit : fit->second->getEmptyRefs()) { if (processing.find(sit->first) == processing.end()) { procList.emplace(sit); } else { // import cycles detected! logWarning("Import cycles detected!"); } } it->second=fit->second.get(); } } } void LspLog::log(Level level, std::string&& msg) { if ((uint32_t)Level::WARNING + settings::verbose >= (uint32_t)level || level == Level::ALL) { cerr << msg << std::endl; } } void LspLog::log(Level level, std::wstring&& msg) { if ((uint32_t)Level::WARNING + settings::verbose >= (uint32_t)level || level == Level::ALL) { std::wcerr << msg << std::endl; } } void LspLog::log(Level level, const std::string& msg) { if ((uint32_t)Level::WARNING + settings::verbose >= (uint32_t)level || level == Level::ALL) { cerr << msg << std::endl; } } void LspLog::log(Level level, const std::wstring& msg) { if ((uint32_t)Level::WARNING + settings::verbose >= (uint32_t)level || level == Level::ALL) { std::wcerr << msg << std::endl; } } AsymptoteLspServer::AsymptoteLspServer( shared_ptr const& jsonHandler, shared_ptr const& endpoint, LspLog& log) : internalREP(make_unique(jsonHandler, endpoint, log)), remoteEndPoint(internalREP.get()), pjh(jsonHandler), ep(endpoint), _log(log) { initializeRequestFn(); initializeNotifyFn(); } AsymptoteLspServer::AsymptoteLspServer( RemoteEndPoint* remoteEndPt, shared_ptr const& jsonHandler, shared_ptr const& endpoint, LspLog& log) : internalREP(nullptr), remoteEndPoint(remoteEndPt), pjh(jsonHandler), ep(endpoint), _log(log) { initializeRequestFn(); initializeNotifyFn(); } void AsymptoteLspServer::initializeRequestFn() { REGISTER_REQ_FN(td_initialize, handleInitailizeRequest); REGISTER_REQ_FN(td_hover, handleHoverRequest); REGISTER_REQ_FN(td_shutdown, handleShutdownRequest); REGISTER_REQ_FN(td_definition, handleDefnRequest); REGISTER_REQ_FN(td_documentColor, handleDocColorRequest); REGISTER_REQ_FN(td_colorPresentation, handleColorPresRequest); } void AsymptoteLspServer::initializeNotifyFn() { REGISTER_NOTIF_FN(Notify_InitializedNotification, onInitialized); REGISTER_NOTIF_FN(Notify_TextDocumentDidChange, onChange); REGISTER_NOTIF_FN(Notify_TextDocumentDidOpen, onOpen); REGISTER_NOTIF_FN(Notify_TextDocumentDidSave, onSave); REGISTER_NOTIF_FN(Notify_TextDocumentDidClose, onClose); REGISTER_NOTIF_FN(Notify_Exit, onExit); } //#pragma region notifications void AsymptoteLspServer::onInitialized(Notify_InitializedNotification::notify& notify) { logInfo("server initialized notification"); } void AsymptoteLspServer::onExit(Notify_Exit::notify& notify) { logInfo("server exit notification"); serverClosed.notify(make_unique(true)); } void AsymptoteLspServer::onChange(Notify_TextDocumentDidChange::notify& notify) { logInfo("text change notification"); auto& fileChange = notify.params.contentChanges; if (not fileChange.empty()) { bool updatable = true; block* codeBlk; try { codeBlk=istring(mem::string(fileChange[0].text.c_str())).getTree(); } catch (handled_error const&) { updatable = false; } if (updatable) { std::string rawPath=getDocIdentifierRawPath(notify.params.textDocument.AsTextDocumentIdentifier()); std::istringstream iss(fileChange[0].text); updateFileContentsTable(rawPath, iss); reloadFileRaw(codeBlk, rawPath); } } logInfo("changed text data"); } void AsymptoteLspServer::onOpen(Notify_TextDocumentDidOpen::notify& notify) { logInfo("onOpen notification"); lsDocumentUri fileUri(notify.params.textDocument.uri); reloadFile(fileUri.GetRawPath()); } void AsymptoteLspServer::onSave(Notify_TextDocumentDidSave::notify& notify) { logInfo("onSave notification"); // lsDocumentUri fileUri(notify.params.textDocument.uri); // reloadFile(fileUri.GetRawPath()); } void AsymptoteLspServer::onClose(Notify_TextDocumentDidClose::notify& notify) { logInfo("onClose notification"); } //#pragma endregion //#pragma region requests td_initialize::response AsymptoteLspServer::handleInitailizeRequest(td_initialize::request const& req) { clearVariables(); symmapContextsPtr=make_unique(); fileContentsPtr=make_unique< std::remove_reference::type>(); plainFile=settings::locateFile("plain", true).c_str(); plainCtx=reloadFileRaw(plainFile, false); generateMissingTrees(plainFile); td_initialize::response rsp; rsp.id=req.id; rsp.result.capabilities.hoverProvider=true; lsTextDocumentSyncOptions tdso; tdso.openClose=true; tdso.change=lsTextDocumentSyncKind::Full; lsSaveOptions so; so.includeText=true; tdso.save=so; rsp.result.capabilities.textDocumentSync=opt_right(tdso); rsp.result.capabilities.definitionProvider=std::make_pair(true, nullopt); rsp.result.capabilities.colorProvider=std::make_pair(true, nullopt); return rsp; } SymbolContext* AsymptoteLspServer::fromRawPath(lsTextDocumentIdentifier const& identifier) { std::string rawPath=getDocIdentifierRawPath(identifier); auto fileSymIt=symmapContextsPtr->find(rawPath); return fileSymIt != symmapContextsPtr->end() ? fileSymIt->second.get() : nullptr; } td_hover::response AsymptoteLspServer::handleHoverRequest(td_hover::request const& req) { td_hover::response rsp; SymbolContext* fileSymPtr=fromRawPath(req.params.textDocument); std::vector, optional>> nullVec; if (!fileSymPtr) { rsp.result.contents.first=nullVec; return rsp; } auto s=fileSymPtr->searchSymbol(fromLsPosition(req.params.position)); auto st=std::get<0>(s); auto ctx=std::get<1>(s); if (not st.has_value()) { rsp.result.contents.first=nullVec; return rsp; } auto v=st.value(); auto symText=std::get<0>(v); auto startPos=std::get<1>(v); auto endPos=std::get<2>(v); rsp.result.range=make_optional(lsRange(toLsPosition(startPos), toLsPosition(endPos))); auto typ=ctx->searchLitSignature(symText); std::list endResultList; if (typ.has_value()) { endResultList.push_back(typ.value()); } endResultList.splice(endResultList.end(), ctx->searchLitFuncSignature(symText)); std::vector endResult; std::copy(endResultList.begin(), endResultList.end(), std::back_inserter(endResult)); rsp.result.contents=endResult.empty() ? fromMarkedStr(" " + symText.name + ";") : fromMarkedStr(endResult); return rsp; } td_documentColor::response AsymptoteLspServer::handleDocColorRequest(td_documentColor::request const& req) { td_documentColor::response rsp; if (SymbolContext* fileSymPtr=fromRawPath(req.params.textDocument)) { logInfo("Got Document color request."); auto& colorsInfo = fileSymPtr->colorInformation; for (auto const& colorPtr : colorsInfo) { ColorInformation cif; cif.color = static_cast(*colorPtr); cif.range.start=toLsPosition(colorPtr->rangeBegin); auto s=colorPtr->lastArgPosition; auto& line=std::get<0>(s); auto& colm=std::get<1>(s); size_t offset = 0; size_t lineOffset = 0; auto& strLines = fileContentsPtr->at(getDocIdentifierRawPath(req.params.textDocument)); char ch=strLines[line + lineOffset - 1][colm - 1 + offset]; while ( ch != ')' and ch != ';' and line + lineOffset <= strLines.size() ) { ++offset; if (offset > strLines[line+lineOffset-1].size()) { ++lineOffset; offset = 0; } if (line+lineOffset <= strLines.size()) { ch=strLines[line + lineOffset - 1][colm - 1 + offset]; } } if (ch != ')' or line + lineOffset > strLines.size()) { continue; } cif.range.end=toLsPosition(make_pair(line+lineOffset, colm+offset+1)); rsp.result.emplace_back(cif); } } return rsp; } td_colorPresentation::response AsymptoteLspServer::handleColorPresRequest(td_colorPresentation::request const& req) { td_colorPresentation::response rsp; if (SymbolContext* fileSymPtr=fromRawPath(req.params.textDocument)) { logInfo("Got color presentation request."); ColorPresentation clp; for (auto& colPtr : fileSymPtr->colorInformation) { auto& incomingColor = req.params.color; std::ostringstream ssargs; std::ostringstream labelargs; bool opaque=std::fabs(incomingColor.alpha - 1) < std::numeric_limits::epsilon(); std::string fnName = opaque ? "rgb" : "rgba"; labelargs << std::setprecision(3) << incomingColor.red << "," << incomingColor.green << "," << incomingColor.blue; ssargs << incomingColor.red << "," << incomingColor.green << "," << incomingColor.blue; if (!opaque) { ssargs << "," << incomingColor.alpha; labelargs << "," << incomingColor.alpha; } std::ostringstream ss; ss << fnName << "(" << ssargs.str() << ")"; clp.textEdit.newText = ss.str(); std::ostringstream lss; lss << fnName << "(" << labelargs.str() << ")"; clp.label = lss.str(); if (colPtr->rangeBegin == fromLsPosition(req.params.range.start)) { clp.textEdit.range = req.params.range; rsp.result.emplace_back(std::move(clp)); break; } } } return rsp; } td_shutdown::response AsymptoteLspServer::handleShutdownRequest(td_shutdown::request const& req) { logInfo("got shut down request"); td_shutdown::response rsp; JsonNull nullrsp; lsp::Any anyrsp; anyrsp.Set(nullrsp); rsp.result = make_optional(std::move(anyrsp)); serverClosed.notify(make_unique(true)); return rsp; } td_definition::response AsymptoteLspServer::handleDefnRequest(td_definition::request const& req) { td_definition::response rsp; std::list posRanges; if (SymbolContext* fileSymPtr=fromRawPath(req.params.textDocument)) { posInFile pos = fromLsPosition(req.params.position); auto s=fileSymPtr->searchSymbol(pos); auto st=std::get<0>(s); auto ctx=std::get<1>(s); if (st.has_value()) { optional posRange=ctx->searchLitPosition(std::get<0>(st.value()), pos); if (posRange.has_value()) { posRanges.push_back(posRange.value()); } posRanges.splice(posRanges.begin(), ctx->searchLitFuncPositions(std::get<0>(st.value()), pos)); } } rsp.result.first=make_optional(std::vector()); std::transform( posRanges.begin(), posRanges.end(), std::back_inserter(rsp.result.first.value()), [](posRangeInFile const& posRange) { auto& fil=std::get<0>(posRange); auto& posBegin=std::get<1>(posRange); auto& posEnd=std::get<2>(posRange); lsRange rng(toLsPosition(posBegin), toLsPosition(posEnd)); std::string filReturn( settings::getSetting("wsl") ? static_cast(wslUnix2Dos(fil)) : fil); lsDocumentUri uri(filReturn); return lsLocation(uri, rng); }); return rsp; } //#pragma endregion void AsymptoteLspServer::reloadFile(std::string const& filename) { std::string rawPath(filename); if(settings::getSetting("wsl")) rawPath=wslDos2Unix(filename); reloadFileRaw(static_cast(rawPath)); } void AsymptoteLspServer::updateFileContentsTable(std::string const& filename) { std::ifstream fil(filename, std::ifstream::in); return updateFileContentsTable(filename, fil); } void AsymptoteLspServer::updateFileContentsTable(std::string const& filename, std::istream& in) { auto& fileContents = *fileContentsPtr; fileContents[filename].clear(); std::string line; while (std::getline(in, line)) { fileContents[filename].emplace_back(line); } } SymbolContext* AsymptoteLspServer::reloadFileRaw(block* blk, std::string const& rawPath, bool const& fillTree) { if (blk != nullptr) { SearchPathAddition sp(stripFile(string(rawPath.c_str()))); auto it=symmapContextsPtr->find(rawPath); if (it != symmapContextsPtr->end()) { *(it->second)=SymbolContext(posInFile(1, 1), rawPath); } else { auto s = symmapContextsPtr->emplace( rawPath, make_unique(posInFile(1, 1), rawPath)); it=std::get<0>(s); } SymbolContext* newPtr=it->second.get(); cerr << rawPath << endl; blk->createSymMap(newPtr); if (plainCtx != nullptr) { it->second->extRefs.extFileRefs[plainFile]=plainCtx; } else if (rawPath == plainFile) { it->second->extRefs.extFileRefs[plainFile]=newPtr; } if (fillTree) { generateMissingTrees(rawPath); } return it->second.get(); } else { return nullptr; } } SymbolContext* AsymptoteLspServer::reloadFileRaw(std::string const& rawPath, bool const& fillTree) { updateFileContentsTable(rawPath); block* blk=ifile(mem::string(rawPath.c_str())).getTree(); return reloadFileRaw(blk, rawPath, fillTree); } void AsymptoteLspServer::start() { return startIO(cin, cout); } AsymptoteLspServer::~AsymptoteLspServer() { } void AsymptoteLspServer::startIO(std::istream& in, std::ostream& out) { auto inPtr=make_shared(in); auto outPtr=make_shared(out); remoteEndPoint->startProcessingMessages(inPtr,outPtr); serverClosed.wait(); } void AsymptoteLspServer::log(lsp::Log::Level const& level, std::string const& message) { _log.log(level, message); } void AsymptoteLspServer::logError(std::string const& message) { log(lsp::Log::Level::SEVERE, message); } void AsymptoteLspServer::logWarning(std::string const& message) { log(lsp::Log::Level::WARNING, message); } void AsymptoteLspServer::logInfo(std::string const& message) { log(lsp::Log::Level::INFO, message); } void AsymptoteLspServer::clearVariables() { } // TCP Asymptote Server TCPAsymptoteLSPServer::TCPAsymptoteLSPServer( std::string const& addr, std::string const& port, shared_ptr const& jsonHandler, shared_ptr const& endpoint, LspLog& log) : lsp::TcpServer(addr, port, jsonHandler, endpoint, log), AsymptoteLspServer(&point, jsonHandler, endpoint, log) { } TCPAsymptoteLSPServer::~TCPAsymptoteLSPServer() { logInfo("Destroying server..."); this->stop(); } void TCPAsymptoteLSPServer::start() { std::thread([this]() {this->run();}).detach(); serverClosed.wait(); logInfo("Got server closed notification."); } } #endif asymptote-3.05/glew.c0000644000000000000000000000047315031566105013274 0ustar rootroot// this file is not used by cmake build. #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef GLEW_INCLUDE #include "GL/glew.h" #else #include GLEW_INCLUDE #endif #ifdef HAVE_LIBGL #ifdef HAVE_LIBOSMESA #define GLEW_OSMESA #define APIENTRY #endif #include "backports/glew/src/glew.c" #endif /* HAVE_LIBGL */ asymptote-3.05/tr.h0000644000000000000000000000740315031566105012770 0ustar rootroot/* This file is released under version 2 of the GNU Library General Public * License (see the files LICENSE.LIBRARY and LICENSE). */ /* $Id: tr.h,v 1.5 1997/07/21 17:34:07 brianp Exp $ */ /* * $Log: tr.h,v $ * Revision 1.5 1997/07/21 17:34:07 brianp * added tile borders, incremented version to 1.1 * * Revision 1.4 1997/07/21 15:47:35 brianp * renamed all "near" and "far" variables * * Revision 1.3 1997/04/26 21:23:25 brianp * added trRasterPos3f function * * Revision 1.2 1997/04/19 23:26:10 brianp * many API changes * * Revision 1.1 1997/04/18 21:53:05 brianp * Initial revision * */ /* * Tiled Rendering library * Version 1.1 * Copyright (C) Brian Paul * * * This library allows one to render arbitrarily large images with OpenGL. * The basic idea is to break the image into tiles which are rendered one * at a time. The tiles are assembled together to form the final, large * image. Tiles and images can be of any size. * * Basic usage: * * 1. Allocate a tile rendering context: * TRcontext t = trNew(); * * 2. Specify the final image buffer and tile size: * GLubyte image[W][H][4] * trImageSize(t, W, H); * trImageBuffer(t, GL_RGBA, GL_UNSIGNED_BYTE, (GLubyte *) image); * * 3. Setup your projection: * trFrustum(t, left, right, bottom top, near, far); * or * trOrtho(t, left, right, bottom top, near, far); * or * trPerspective(t, fovy, aspect, near, far); * * 4. Render the tiles: * do { * trBeginTile(t); * DrawMyScene(); * } while (trEndTile(t)); * * You provide the DrawMyScene() function which calls glClear() and * draws all your stuff. * * 5. The image array is now complete. Display it, write it to a file, etc. * * 6. Delete the tile rendering context when finished: * trDelete(t); * */ #ifndef TR_H #define TR_H #ifdef __APPLE__ #define GL_SILENCE_DEPRECATION #include #else #include #endif #ifdef __cplusplus extern "C" { #endif #define TR_VERSION "1.1" #define TR_MAJOR_VERSION 1 #define TR_MINOR_VERSION 1 typedef struct _TRctx TRcontext; typedef enum { TR_TILE_WIDTH = 100, TR_TILE_HEIGHT, TR_TILE_BORDER, TR_IMAGE_WIDTH, TR_IMAGE_HEIGHT, TR_ROWS, TR_COLUMNS, TR_CURRENT_ROW, TR_CURRENT_COLUMN, TR_CURRENT_TILE_WIDTH, TR_CURRENT_TILE_HEIGHT, TR_ROW_ORDER, TR_TOP_TO_BOTTOM, TR_BOTTOM_TO_TOP } TRenum; extern TRcontext *trNew(void); extern void trDelete(TRcontext *tr); extern void trTileSize(TRcontext *tr, GLint width, GLint height, GLint border); extern void trTileBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image); extern void trImageSize(TRcontext *tr, GLint width, GLint height); extern void trImageBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image); extern void trRowOrder(TRcontext *tr, TRenum order); extern GLint trGet(TRcontext *tr, TRenum param); extern void trOrtho(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); extern void trFrustum(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); extern void trPerspective(TRcontext *tr, GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar ); extern void trBeginTile(TRcontext *tr); extern int trEndTile(TRcontext *tr); extern void trRasterPos3f(TRcontext *tr, GLfloat x, GLfloat y, GLfloat z); #ifdef __cplusplus } #endif #endif asymptote-3.05/drawsurface.cc0000644000000000000000000006042415031566105015011 0ustar rootroot/***** * drawsurface.cc * * Stores a surface that has been added to a picture. *****/ #include "drawsurface.h" #include "drawpath3.h" #include "arrayop.h" #include #include #include #ifdef HAVE_LIBGLM #include #include #include #endif using namespace prc; #include "material.h" namespace camp { mem::vector drawElement::centers; size_t drawElement::centerIndex=0; centerMap drawElement::centermap; const triple drawElement::zero; using vm::array; using settings::getSetting; #ifdef HAVE_LIBGLM void storecolor(GLfloat *colors, int i, const vm::array &pens, int j) { pen p=vm::read(pens,j); p.torgb(); colors[i]=p.red(); colors[i+1]=p.green(); colors[i+2]=p.blue(); colors[i+3]=p.opacity(); } void storecolor(GLfloat *colors, int i, const RGBAColour& p) { colors[i]=p.R; colors[i+1]=p.G; colors[i+2]=p.B; colors[i+3]=p.A; } void setcolors(const RGBAColour& diffuse, const RGBAColour& emissive, const RGBAColour& specular, double shininess, double metallic, double fresnel0, abs3Doutfile *out) { Material m=Material(glm::vec4(diffuse.R,diffuse.G,diffuse.B,diffuse.A), glm::vec4(emissive.R,emissive.G,emissive.B,emissive.A), glm::vec4(specular.R,specular.G,specular.B,specular.A), shininess,metallic,fresnel0); auto p=materialMap.find(m); if(p != materialMap.end()) materialIndex=p->second; else { materialIndex=materials.size(); if(materialIndex >= nmaterials) nmaterials=min(Maxmaterials,2*nmaterials); materials.push_back(m); materialMap[m]=materialIndex; if(out) out->addMaterial(m); } } #endif void drawBezierPatch::bounds(const double* t, bbox3& b) { double x,y,z; double X,Y,Z; if(straight) { triple Vertices[4]; if(t == NULL) { Vertices[0]=controls[0]; Vertices[1]=controls[3]; Vertices[2]=controls[12]; Vertices[3]=controls[15]; } else { Vertices[0]=t*controls[0]; Vertices[1]=t*controls[3]; Vertices[2]=t*controls[12]; Vertices[3]=t*controls[15]; } boundstriples(x,y,z,X,Y,Z,4,Vertices); } else { double cx[16]; double cy[16]; double cz[16]; if(t == NULL) { for(unsigned int i=0; i < 16; ++i) { triple v=controls[i]; cx[i]=v.getx(); cy[i]=v.gety(); cz[i]=v.getz(); } } else { for(unsigned int i=0; i < 16; ++i) { triple v=t*controls[i]; cx[i]=v.getx(); cy[i]=v.gety(); cz[i]=v.getz(); } } double c0=cx[0]; double fuzz=Fuzz*run::norm(cx,16); x=bound(cx,min,c0,fuzz,maxdepth); X=bound(cx,max,c0,fuzz,maxdepth); c0=cy[0]; fuzz=Fuzz*run::norm(cy,16); y=bound(cy,min,c0,fuzz,maxdepth); Y=bound(cy,max,c0,fuzz,maxdepth); c0=cz[0]; fuzz=Fuzz*run::norm(cz,16); z=bound(cz,min,c0,fuzz,maxdepth); Z=bound(cz,max,c0,fuzz,maxdepth); } b.add(x,y,z); b.add(X,Y,Z); if(t == NULL) { Min=triple(x,y,z); Max=triple(X,Y,Z); } } void drawBezierPatch::ratio(const double* t, pair &b, double (*m)(double, double), double fuzz, bool &first) { triple buf[16]; triple* Controls; if(straight) { if(t == NULL) Controls=controls; else { Controls=buf; Controls[0]=t*controls[0]; Controls[3]=t*controls[3]; Controls[12]=t*controls[12]; Controls[15]=t*controls[15]; } triple v=Controls[0]; double x=xratio(v); double y=yratio(v); if(first) { first=false; b=pair(x,y); } else { x=m(b.getx(),x); y=m(b.gety(),y); } v=Controls[3]; x=m(x,xratio(v)); y=m(y,yratio(v)); v=Controls[12]; x=m(x,xratio(v)); y=m(y,yratio(v)); v=Controls[15]; x=m(x,xratio(v)); y=m(y,yratio(v)); b=pair(x,y); } else { if(t == NULL) Controls=controls; else { Controls=buf; for(unsigned int i=0; i < 16; ++i) Controls[i]=t*controls[i]; } if(first) { triple v=Controls[0]; b=pair(xratio(v),yratio(v)); first=false; } b=pair(bound(Controls,m,xratio,b.getx(),fuzz,maxdepth), bound(Controls,m,yratio,b.gety(),fuzz,maxdepth)); } } bool drawBezierPatch::write(prcfile *out, unsigned int *, double, groupsmap&) { if(invisible || primitive) return true; RGBAColour Black(0.0,0.0,0.0,diffuse.A); PRCmaterial m(Black,diffuse,emissive,specular,opacity,shininess); if(straight) { triple vertices[]={controls[0],controls[12],controls[3],controls[15]}; if(colors) { prc::RGBAColour Colors[]={colors[0],colors[1],colors[3],colors[2]}; out->addQuad(vertices,Colors); } else out->addRectangle(vertices,m); } else out->addPatch(controls,m); return true; } bool drawBezierPatch::write(abs3Doutfile *out) { #ifdef HAVE_LIBGLM if(invisible || primitive) return true; setcolors(diffuse,emissive,specular,shininess,metallic,fresnel0,out); out->setKEY(KEY); if(billboard) { meshinit(); drawElement::centerIndex=centerIndex; } else drawElement::centerIndex=0; out->precision(digits); if(straight) { triple Controls[]={controls[0],controls[12],controls[15],controls[3]}; out->addStraightPatch(Controls,colors); } else { double prerender=renderResolution(); if(prerender) { GLfloat c[16]; if(colors) for(size_t i=0; i < 4; ++i) storecolor(c,4*i,colors[i]); S.init(prerender,colors ? c : NULL); S.render(controls,straight,c); drawTriangles dt(S.data,center,colors,diffuse,emissive,specular,opacity, shininess,metallic,fresnel0,interaction,invisible, Min,Max); dt.write(out); } else out->addPatch(controls,colors); } out->precision(getSetting("digits")); #endif return true; } void drawBezierPatch::render(double size2, const triple& b, const triple& B, double perspective, bool remesh) { #ifdef HAVE_GL if(invisible) return; transparent=colors ? colors[0].A+colors[1].A+colors[2].A+colors[3].A < 4.0 : diffuse.A < 1.0; setcolors(diffuse,emissive,specular,shininess,metallic,fresnel0); if(transparent) setMaterial(transparentData,drawTransparent); else { if(colors) setMaterial(colorData,drawColor); else setMaterial(materialData,drawMaterial); } bool offscreen; if(billboard) { drawElement::centerIndex=centerIndex; BB.init(center); offscreen=bbox2(Min,Max,BB).offscreen(); } else offscreen=bbox2(Min,Max).offscreen(); if(offscreen) { // Fully offscreen S.Onscreen=false; S.data.clear(); S.transparent=transparent; S.color=colors; S.notRendered(); return; } triple *Controls; triple Controls0[16]; if(billboard) { Controls=Controls0; for(size_t i=0; i < 16; i++) { Controls[i]=BB.transform(controls[i]); } } else { Controls=controls; if(!remesh && S.Onscreen) { // Fully onscreen; no need to re-render S.append(); return; } } double s=perspective ? Min.getz()*perspective : 1.0; // Move to glrender const pair size3(s*(B.getx()-b.getx()),s*(B.gety()-b.gety())); if(gl::outlinemode) { setMaterial(material1Data,drawMaterial); triple edge0[]={Controls[0],Controls[4],Controls[8],Controls[12]}; C.queue(edge0,straight,size3.length()/size2); triple edge1[]={Controls[12],Controls[13],Controls[14],Controls[15]}; C.queue(edge1,straight,size3.length()/size2); triple edge2[]={Controls[15],Controls[11],Controls[7],Controls[3]}; C.queue(edge2,straight,size3.length()/size2); triple edge3[]={Controls[3],Controls[2],Controls[1],Controls[0]}; C.queue(edge3,straight,size3.length()/size2); } else { GLfloat c[16]; if(colors) for(size_t i=0; i < 4; ++i) storecolor(c,4*i,colors[i]); S.queue(Controls,straight,size3.length()/size2,transparent, colors ? c : NULL); } #endif } drawElement *drawBezierPatch::transformed(const double* t) { return new drawBezierPatch(t,this); } void drawBezierTriangle::bounds(const double* t, bbox3& b) { double x,y,z; double X,Y,Z; if(straight) { triple Vertices[3]; if(t == NULL) { Vertices[0]=controls[0]; Vertices[1]=controls[6]; Vertices[2]=controls[9]; } else { Vertices[0]=t*controls[0]; Vertices[1]=t*controls[6]; Vertices[2]=t*controls[9]; } boundstriples(x,y,z,X,Y,Z,3,Vertices); } else { double cx[10]; double cy[10]; double cz[10]; if(t == NULL) { for(unsigned int i=0; i < 10; ++i) { triple v=controls[i]; cx[i]=v.getx(); cy[i]=v.gety(); cz[i]=v.getz(); } } else { for(unsigned int i=0; i < 10; ++i) { triple v=t*controls[i]; cx[i]=v.getx(); cy[i]=v.gety(); cz[i]=v.getz(); } } double c0=cx[0]; double fuzz=Fuzz*run::norm(cx,10); x=boundtri(cx,min,c0,fuzz,maxdepth); X=boundtri(cx,max,c0,fuzz,maxdepth); c0=cy[0]; fuzz=Fuzz*run::norm(cy,10); y=boundtri(cy,min,c0,fuzz,maxdepth); Y=boundtri(cy,max,c0,fuzz,maxdepth); c0=cz[0]; fuzz=Fuzz*run::norm(cz,10); z=boundtri(cz,min,c0,fuzz,maxdepth); Z=boundtri(cz,max,c0,fuzz,maxdepth); } b.add(x,y,z); b.add(X,Y,Z); if(t == NULL) { Min=triple(x,y,z); Max=triple(X,Y,Z); } } void drawBezierTriangle::ratio(const double* t, pair &b, double (*m)(double, double), double fuzz, bool &first) { triple buf[10]; triple* Controls; if(straight) { if(t == NULL) Controls=controls; else { Controls=buf; Controls[0]=t*controls[0]; Controls[6]=t*controls[6]; Controls[9]=t*controls[9]; } triple v=Controls[0]; double x=xratio(v); double y=yratio(v); if(first) { first=false; b=pair(x,y); } else { x=m(b.getx(),x); y=m(b.gety(),y); } v=Controls[6]; x=m(x,xratio(v)); y=m(y,yratio(v)); v=Controls[9]; x=m(x,xratio(v)); y=m(y,yratio(v)); b=pair(x,y); } else { if(t == NULL) Controls=controls; else { Controls=buf; for(unsigned int i=0; i < 10; ++i) Controls[i]=t*controls[i]; } if(first) { triple v=Controls[0]; b=pair(xratio(v),yratio(v)); first=false; } b=pair(boundtri(Controls,m,xratio,b.getx(),fuzz,maxdepth), boundtri(Controls,m,yratio,b.gety(),fuzz,maxdepth)); } } bool drawBezierTriangle::write(prcfile *out, unsigned int *, double, groupsmap&) { if(invisible || primitive) return true; RGBAColour Black(0.0,0.0,0.0,diffuse.A); PRCmaterial m(Black,diffuse,emissive,specular,opacity,shininess); static const double third=1.0/3.0; static const double third2=2.0/3.0; triple Controls[]={controls[0],controls[0],controls[0],controls[0], controls[1],third2*controls[1]+third*controls[2], third*controls[1]+third2*controls[2], controls[2],controls[3], third*controls[3]+third2*controls[4], third2*controls[4]+third*controls[5], controls[5],controls[6],controls[7], controls[8],controls[9]}; out->addPatch(Controls,m); return true; } bool drawBezierTriangle::write(abs3Doutfile *out) { #ifdef HAVE_LIBGLM if(invisible || primitive) return true; setcolors(diffuse,emissive,specular,shininess,metallic,fresnel0,out); out->setKEY(KEY); if(billboard) { meshinit(); drawElement::centerIndex=centerIndex; } else drawElement::centerIndex=0; out->precision(digits); if(straight) { triple Controls[]={controls[0],controls[6],controls[9]}; out->addStraightBezierTriangle(Controls,colors); } else { double prerender=renderResolution(); if(prerender) { GLfloat c[12]; if(colors) for(size_t i=0; i < 3; ++i) storecolor(c,4*i,colors[i]); S.init(prerender,colors ? c : NULL); S.render(controls,straight,c); drawTriangles dt(S.data,center,colors,diffuse,emissive,specular,opacity, shininess,metallic,fresnel0,interaction,invisible, Min,Max); dt.write(out); } else out->addBezierTriangle(controls,colors); } out->precision(getSetting("digits")); #endif return true; } void drawBezierTriangle::render(double size2, const triple& b, const triple& B, double perspective, bool remesh) { #ifdef HAVE_GL if(invisible) return; transparent=colors ? colors[0].A+colors[1].A+colors[2].A < 3.0 : diffuse.A < 1.0; setcolors(diffuse,emissive,specular,shininess,metallic,fresnel0); if(transparent) setMaterial(transparentData,drawTransparent); else { if(colors) setMaterial(colorData,drawColor); else setMaterial(materialData,drawMaterial); } bool offscreen; if(billboard) { drawElement::centerIndex=centerIndex; BB.init(center); offscreen=bbox2(Min,Max,BB).offscreen(); } else offscreen=bbox2(Min,Max).offscreen(); if(offscreen) { // Fully offscreen S.Onscreen=false; S.data.clear(); S.transparent=transparent; S.color=colors; S.notRendered(); return; } triple *Controls; triple Controls0[10]; if(billboard) { Controls=Controls0; for(size_t i=0; i < 10; i++) Controls[i]=BB.transform(controls[i]); } else { if(!remesh && S.Onscreen) { // Fully onscreen; no need to re-render S.append(); return; } Controls=controls; } double s=perspective ? Min.getz()*perspective : 1.0; // Move to glrender const pair size3(s*(B.getx()-b.getx()),s*(B.gety()-b.gety())); if(gl::outlinemode) { setMaterial(material1Data,drawMaterial); triple edge0[]={Controls[0],Controls[1],Controls[3],Controls[6]}; C.queue(edge0,straight,size3.length()/size2); triple edge1[]={Controls[6],Controls[7],Controls[8],Controls[9]}; C.queue(edge1,straight,size3.length()/size2); triple edge2[]={Controls[9],Controls[5],Controls[2],Controls[0]}; C.queue(edge2,straight,size3.length()/size2); } else { GLfloat c[12]; if(colors) for(size_t i=0; i < 3; ++i) storecolor(c,4*i,colors[i]); S.queue(Controls,straight,size3.length()/size2,transparent, colors ? c : NULL); } #endif } drawElement *drawBezierTriangle::transformed(const double* t) { return new drawBezierTriangle(t,this); } bool drawNurbs::write(prcfile *out, unsigned int *, double, groupsmap&) { if(invisible) return true; RGBAColour Black(0.0,0.0,0.0,diffuse.A); PRCmaterial m(Black,diffuse,emissive,specular,opacity,shininess); out->addSurface(udegree,vdegree,nu,nv,controls,uknots,vknots,m,weights); return true; } // Approximate bounds by bounding box of control polyhedron. void drawNurbs::bounds(const double* t, bbox3& b) { double x,y,z; double X,Y,Z; const size_t n=nu*nv; triple* Controls; if(t == NULL) Controls=controls; else { Controls=new triple[n]; for(size_t i=0; i < n; i++) Controls[i]=t*controls[i]; } boundstriples(x,y,z,X,Y,Z,n,Controls); b.add(x,y,z); b.add(X,Y,Z); if(t == NULL) { Min=triple(x,y,z); Max=triple(X,Y,Z); } else delete[] Controls; } drawElement *drawNurbs::transformed(const double* t) { return new drawNurbs(t,this); } void drawNurbs::ratio(const double *t, pair &b, double (*m)(double, double), double, bool &first) { const size_t n=nu*nv; triple* Controls; if(t == NULL) Controls=controls; else { Controls=new triple[n]; for(unsigned int i=0; i < n; ++i) Controls[i]=t*controls[i]; } if(first) { first=false; triple v=Controls[0]; b=pair(xratio(v),yratio(v)); } double x=b.getx(); double y=b.gety(); for(size_t i=0; i < n; ++i) { triple v=Controls[i]; x=m(x,xratio(v)); y=m(y,yratio(v)); } b=pair(x,y); if(t != NULL) delete[] Controls; } void drawNurbs::displacement() { #ifdef HAVE_GL size_t n=nu*nv; size_t nuknots=udegree+nu+1; size_t nvknots=vdegree+nv+1; if(Controls == NULL) { Controls=new(UseGC) GLfloat[(weights ? 4 : 3)*n]; uKnots=new(UseGC) GLfloat[nuknots]; vKnots=new(UseGC) GLfloat[nvknots]; } if(weights) for(size_t i=0; i < n; ++i) store(Controls+4*i,controls[i],weights[i]); else for(size_t i=0; i < n; ++i) store(Controls+3*i,controls[i]); for(size_t i=0; i < nuknots; ++i) uKnots[i]=uknots[i]; for(size_t i=0; i < nvknots; ++i) vKnots[i]=vknots[i]; #endif } void drawNurbs::render(double size2, const triple& b, const triple& B, double perspective, bool remesh) { // TODO: implement NURBS renderer } void drawPRC::P(triple& t, double x, double y, double z) { if(T == NULL) { t=triple(x,y,z); return; } double f=T[12]*x+T[13]*y+T[14]*z+T[15]; if(f == 0.0) run::dividebyzero(); f=1.0/f; t=triple((T[0]*x+T[1]*y+T[2]*z+T[3])*f,(T[4]*x+T[5]*y+T[6]*z+T[7])*f, (T[8]*x+T[9]*y+T[10]*z+T[11])*f); } void drawSphere::P(triple& t, double x, double y, double z) { if(half) { double temp=z; z=x; x=-temp; } drawPRC::P(t,x,y,z); } bool drawSphere::write(prcfile *out, unsigned int *, double, groupsmap&) { if(invisible) return true; RGBAColour Black(0.0,0.0,0.0,diffuse.A); PRCmaterial m(Black,diffuse,emissive,specular,opacity,shininess); switch(type) { case 0: // PRCsphere { if(half) out->addHemisphere(1.0,m,NULL,NULL,NULL,1.0,T); else out->addSphere(1.0,m,NULL,NULL,NULL,1.0,T); break; } case 1: // NURBSsphere { static double uknot[]={0.0,0.0,1.0/3.0,0.5,1.0,1.0}; static double vknot[]={0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0}; static double Weights[12]={2.0/3.0,2.0/9.0,2.0/9.0,2.0/3.0, 1.0/3.0,1.0/9.0,1.0/9.0,1.0/3.0, 1.0,1.0/3.0,1.0/3.0,1.0}; // NURBS representation of a sphere using 10 distinct control points // K. Qin, J. Comp. Sci. and Tech. 12, 210-216 (1997). triple N,S,P1,P2,P3,P4,P5,P6,P7,P8; P(N,0.0,0.0,1.0); P(P1,-2.0,-2.0,1.0); P(P2,-2.0,-2.0,-1.0); P(S,0.0,0.0,-1.0); P(P3,2.0,-2.0,1.0); P(P4,2.0,-2.0,-1.0); P(P5,2.0,2.0,1.0); P(P6,2.0,2.0,-1.0); P(P7,-2.0,2.0,1.0); P(P8,-2.0,2.0,-1.0); triple p0[]={N,P1,P2,S, N,P3,P4,S, N,P5,P6,S, N,P7,P8,S, N,P1,P2,S, N,P3,P4,S}; out->addSurface(2,3,3,4,p0,uknot,vknot,m,Weights); out->addSurface(2,3,3,4,p0+4,uknot,vknot,m,Weights); if(!half) { out->addSurface(2,3,3,4,p0+8,uknot,vknot,m,Weights); out->addSurface(2,3,3,4,p0+12,uknot,vknot,m,Weights); } break; } default: reportError("Invalid sphere type"); } return true; } bool drawSphere::write(abs3Doutfile *out) { #ifdef HAVE_LIBGLM if(invisible) return true; drawElement::centerIndex=0; setcolors(diffuse,emissive,specular,shininess,metallic,fresnel0,out); out->setKEY(KEY); triple O,E; P(E,1.0,0.0,0.0); P(O,0.0,0.0,0.0); triple X=E-O; double r=length(X); if(half) out->addHemisphere(O,r,X.polar(false),X.azimuth(false)); else out->addSphere(O,r); #endif return true; } bool drawCylinder::write(prcfile *out, unsigned int *, double, groupsmap&) { if(invisible) return true; RGBAColour Black(0.0,0.0,0.0,diffuse.A); PRCmaterial m(Black,diffuse,emissive,specular,opacity,shininess); out->addCylinder(1.0,1.0,m,NULL,NULL,NULL,1.0,T); return true; } bool drawCylinder::write(abs3Doutfile *out) { #ifdef HAVE_LIBGLM if(invisible) return true; drawElement::centerIndex=0; setcolors(diffuse,emissive,specular,shininess,metallic,fresnel0,out); out->setKEY(KEY); triple E,H,O; P(E,1.0,0.0,0.0); P(H,0.0,0.0,1.0); P(O,0.0,0.0,0.0); triple X=E-O; triple Z=H-O; double r=length(X); double h=length(Z); out->addCylinder(O,r,h,Z.polar(false),Z.azimuth(false),core); #endif return true; } bool drawDisk::write(prcfile *out, unsigned int *, double, groupsmap&) { if(invisible) return true; RGBAColour Black(0.0,0.0,0.0,diffuse.A); PRCmaterial m(Black,diffuse,emissive,specular,opacity,shininess); out->addDisk(1.0,m,NULL,NULL,NULL,1.0,T); return true; } bool drawDisk::write(abs3Doutfile *out) { #ifdef HAVE_LIBGLM if(invisible) return true; drawElement::centerIndex=0; setcolors(diffuse,emissive,specular,shininess,metallic,fresnel0,out); out->setKEY(KEY); triple E,H,O; P(E,1.0,0.0,0.0); P(H,0.0,0.0,1.0); P(O,0.0,0.0,0.0); triple X=E-O; triple Z=H-O; double r=length(X); out->addDisk(O,r,Z.polar(false),Z.azimuth(false)); #endif return true; } bool drawTube::write(abs3Doutfile *out) { #ifdef HAVE_LIBGLM if(invisible) return true; drawElement::centerIndex=0; setcolors(diffuse,emissive,specular,shininess,metallic,fresnel0,out); out->setKEY(KEY); bbox3 b; b.add(T*m); b.add(T*triple(m.getx(),m.gety(),M.getz())); b.add(T*triple(m.getx(),M.gety(),m.getz())); b.add(T*triple(m.getx(),M.gety(),M.getz())); b.add(T*triple(M.getx(),m.gety(),m.getz())); b.add(T*triple(M.getx(),m.gety(),M.getz())); b.add(T*triple(M.getx(),M.gety(),m.getz())); b.add(T*M); out->addTube(g,width,core); #endif return true; } const string drawBaseTriangles::wrongsize= "triangle indices require 3 components"; const string drawBaseTriangles::outofrange="index out of range"; void drawBaseTriangles::bounds(const double* t, bbox3& b) { double x,y,z; double X,Y,Z; triple* tP; if(t == NULL) tP=P; else { tP=new triple[nP]; for(size_t i=0; i < nP; i++) tP[i]=t*P[i]; } boundstriples(x,y,z,X,Y,Z,nP,tP); b.add(x,y,z); b.add(X,Y,Z); if(t == NULL) { Min=triple(x,y,z); Max=triple(X,Y,Z); } else delete[] tP; } void drawBaseTriangles::ratio(const double* t, pair &b, double (*m)(double, double), double fuzz, bool &first) { triple* tP; if(t == NULL) tP=P; else { tP=new triple[nP]; for(size_t i=0; i < nP; i++) tP[i]=t*P[i]; } ratiotriples(b,m,first,nP,tP); if(t != NULL) delete[] tP; } bool drawTriangles::write(prcfile *out, unsigned int *, double, groupsmap&) { if(invisible) return true; if(nC) { const RGBAColour white(1,1,1,opacity); const RGBAColour black(0,0,0,opacity); const PRCmaterial m(black,white,black,specular,opacity,shininess); out->addTriangles(nP,P,nI,PI,m,nN,N,NI,0,NULL,NULL,nC,C,CI,0,NULL,NULL,30); } else { RGBAColour Black(0.0,0.0,0.0,diffuse.A); const PRCmaterial m(Black,diffuse,emissive,specular,opacity,shininess); out->addTriangles(nP,P,nI,PI,m,nN,N,NI,0,NULL,NULL,0,NULL,NULL,0,NULL,NULL,30); } return true; } bool drawTriangles::write(abs3Doutfile *out) { #ifdef HAVE_LIBGLM if(invisible) return true; if(billboard) { meshinit(); drawElement::centerIndex=centerIndex; } else drawElement::centerIndex=0; setcolors(diffuse,emissive,specular,shininess,metallic,fresnel0,out); out->setKEY(KEY); out->addTriangles(nP,P,nN,N,nC,C,nI,PI,NI,CI); #endif return true; } void drawTriangles::render(double size2, const triple& b, const triple& B, double perspective, bool remesh) { #ifdef HAVE_GL if(invisible) return; transparent=diffuse.A < 1.0; setcolors(diffuse,emissive,specular,shininess,metallic,fresnel0); if(transparent) setMaterial(transparentData,drawTransparent); else setMaterial(triangleData,drawTriangle); bool offscreen; if(billboard) { drawElement::centerIndex=centerIndex; BB.init(center); offscreen=bbox2(Min,Max,BB).offscreen(); } else offscreen=bbox2(Min,Max).offscreen(); if(offscreen) { // Fully offscreen R.Onscreen=false; R.data.clear(); R.transparent=transparent; R.notRendered(); return; } triple *P0; if(billboard) { P0=new triple [nP]; for(size_t i=0; i < nP; i++) P0[i]=BB.transform(P[i]); } else { if(!remesh && R.Onscreen) { // Fully onscreen; no need to re-render R.append(); return; } P0=P; } R.queue(nP,P0,nN,N,nC,C,nI,PI,NI,CI,transparent); if(billboard) delete [] P0; #endif } } //namespace camp asymptote-3.05/CMakeLists.txt0000644000000000000000000000517715031566105014740 0ustar rootrootcmake_minimum_required(VERSION 3.27) include(cmake-scripts/common.cmake) include(asy-pkg-version-suffix.cmake OPTIONAL RESULT_VARIABLE ASY_ADDR_VERSION_SUFFIX_FILE) include(cmake-scripts/options.cmake) include(pkg-info.cmake) include(cmake-scripts/vcpkg-features.cmake) project(${ASY_PACKAGE_NAME}) include(cmake-scripts/compiler-config.cmake) include(cmake-scripts/basic-parameters.cmake) include(cmake-scripts/buildfiles-to-src.cmake) include(cmake-scripts/asy-files.cmake) # setting build files if (WIN32) include(cmake-scripts/win32-specific.cmake) endif() build_files_to_src(CORE_BUILD_FILES CORE_SOURCE_FILES) include(cmake-scripts/subrepo-projects.cmake) include(cmake-scripts/external-libs.cmake) include(cmake-scripts/thirdparty-impl.cmake) include(cmake-scripts/backport-libs.cmake) # PRC add_subdirectory(prc/) list(APPEND ASY_STATIC_LIBARIES PRC) get_target_property(prc_incl_dir PRC INCLUDE_DIRECTORIES) list(APPEND ASYMPTOTE_INCLUDES $) list(APPEND ASYMPTOTE_INCLUDES "LspCpp/include") include(cmake-scripts/gnu-install-macros.cmake) include(cmake-scripts/asy-macro.cmake) include(cmake-scripts/generated-files.cmake) # asy-reflect if (ENABLE_CUDA_ASY_REFLECT) message(STATUS "asy reflect target enabled") add_subdirectory(cudareflect/) endif() # defining asy target add_library( asycore STATIC ${CORE_SOURCE_FILES} ${ASY_GENERATED_BUILD_SOURCES} ) target_include_directories(asycore PUBLIC ${ASYMPTOTE_INCLUDES}) add_dependencies(asycore asy_gen_headers) target_link_libraries(asycore PUBLIC ${ASY_STATIC_LIBARIES}) target_compile_definitions(asycore PUBLIC ${ASY_MACROS}) target_compile_options(asycore PUBLIC ${ASY_COMPILE_OPTS}) # asy executable add_executable( asy ${ASY_SRC_DIR}/main.cc ${ASY_WIN_RC_FILE} ) target_link_libraries(asy PUBLIC asycore) # base files include(cmake-scripts/asy-base-files.cmake) # asy + base files add_custom_target(asy-basefiles DEPENDS ${ASY_OUTPUT_BASE_FILES}) add_custom_target(asy-with-basefiles ALL DEPENDS asy asy-basefiles) # asy misc files if (ENABLE_MISCFILES_GEN) include(cmake-scripts/asy-misc-files.cmake) endif() # documentation generation if (ENABLE_DOCGEN) include(cmake-scripts/docgen.cmake) endif() # testing enable_testing() include(cmake-scripts/tests-asy.cmake) include(cmake-scripts/tests-wce.cmake) if (ENABLE_ASY_CXXTEST) add_subdirectory(cxxtests) endif() # installation if (WIN32) # on windows, pre-NSIS include(cmake-scripts/win32-pre-nsis-installer.cmake) else() # on unix systems if (NOT CTAN_BUILD) include(cmake-scripts/linux-install.cmake) endif() endif() asymptote-3.05/angle.h0000644000000000000000000000156615031566105013435 0ustar rootroot/***** * angle.h * Andy Hammerlindl 2004/04/29 * * For degree to radian conversion and visa versa. *****/ #ifndef ANGLE_H #define ANGLE_H #include #include "camperror.h" namespace camp { const double PI=acos(-1.0); const double Cpiby180=PI/180.0; const double C180bypi=180.0/PI; inline double radians(double theta) { return theta*Cpiby180; } inline double degrees(double theta) { return theta*C180bypi; } // Wrapper for atan2 with sensible (lexical) argument order and (0,0) check inline double angle(double x, double y, bool warn=true) { if(x == 0.0 && y == 0.0) { if(warn) reportError("taking angle of (0,0)"); else return 0; } return atan2(y,x); } // Return an angle in the interval [0,360). inline double principalBranch(double deg) { deg=fmod(deg,360.0); if(deg < 0) deg += 360.0; return deg; } } //namespace camp #endif asymptote-3.05/TODO0000644000000000000000000000241515031566105012660 0ustar rootrootAndy: add keyword-only arguments Andy: Arbitrary depth copying of arrays. Andy: Investigate bbox error in uofa-talk Shadowing slide Andy: change label in coder to a class not an Int Andy: look at label alignment in rotvenn Andy: possible optimizations: eliminate frame copying in picture.add(picture pic, ...) varpush+popcall --> varcall? fieldpush+popcall --> fieldcall? overloaded::simplify copies straight guide which references a subset of a pair vector. Is it cheaper to import a bltin module than to call base_venv again? varpush+pop --> no op varsave+pop --> one op closure+pushfunc+varsave+pop --> savefunc stack::popWithoutReturningValue look at position information saved in program, maybe save separately formal::addOps calls trans only hash first 3 or 4 args of signature rm transToType from varinitArg::trans change camp.y to flag arglists with named args Andy: testing in errortest.asy for packing versus casting, default argument ambiguities, and whatever else you can think of Andy: operator tuple, to let people define their own tuples Andy: Decide if we should change vm::error to em in application.cc John or Andy: Add unit test for AddOps. Jamie: Finish environment texture & other PBR refinements. asymptote-3.05/bbox3.h0000644000000000000000000000777515031566105013374 0ustar rootroot/***** * bbox3.h * Andy Hammerlindl 2002/06/06 * * Stores a rectangle that encloses a drawing object. *****/ #ifndef BBOX3_H #define BBOX3_H #include "triple.h" namespace camp { // The box that encloses a path struct bbox3 { bool empty; double leftBound; double bottomBound; double nearBound; double rightBound; double topBound; double farBound; // Start bbox3 about the origin bbox3() : empty(true), leftBound(0.0), bottomBound(0.0), nearBound(0.0), rightBound(0.0), topBound(0.0), farBound(0.0) { } bbox3(double left, double bottom, double near, double right, double top, double far) : empty(false), leftBound(left), bottomBound(bottom), nearBound(near), rightBound(right), topBound(top), farBound(far) { } // Start a bbox3 with a point bbox3(double x, double y, double z) : empty(false), leftBound(x), bottomBound(y), nearBound(z), rightBound(x), topBound(y), farBound(z) { } // Start a bbox3 with a point bbox3(const triple& v) : empty(false), leftBound(v.getx()), bottomBound(v.gety()), nearBound(v.getz()), rightBound(v.getx()), topBound(v.gety()), farBound(v.getz()) { } // Start a bbox3 with 2 points bbox3(const triple& m, const triple& M) : empty(false), leftBound(m.getx()), bottomBound(m.gety()), nearBound(m.getz()), rightBound(M.getx()), topBound(M.gety()), farBound(M.getz()) { } // Add a point to a bbox3 void add(const triple& v) { const double x = v.getx(), y = v.gety(), z = v.getz(); add(x,y,z); } void add(double x, double y, double z) { if (empty) { leftBound= rightBound= x; topBound= bottomBound= y; nearBound= farBound= z; empty = false; } else { if(x < leftBound) leftBound= x; else if(x > rightBound) rightBound= x; if(y < bottomBound) bottomBound= y; else if(y > topBound) topBound= y; if(z < nearBound) nearBound= z; else if(z > farBound) farBound= z; } } // Add a point to a nonempty bbox3 void addnonempty(double x, double y, double z) { if(x < leftBound) leftBound= x; else if(x > rightBound) rightBound= x; if(y < bottomBound) bottomBound= y; else if(y > topBound) topBound= y; if(z < nearBound) nearBound= z; else if(z > farBound) farBound= z; } // Add (x,y) pair to a nonempty bbox3 void addnonempty(pair v) { double x=v.getx(); if(x < leftBound) leftBound= x; else if(x > rightBound) rightBound= x; double y=v.gety(); if(y < bottomBound) bottomBound= y; else if(y > topBound) topBound= y; } // Add a point to a nonempty bbox3 void addnonempty(const triple& v) { addnonempty(v.getx(),v.gety(),v.getz()); } // Add a point to a nonempty bbox, updating bounding times void addnonempty(const triple& v, bbox3& times, double t) { double x = v.getx(), y = v.gety(), z = v.getz(); if(x < leftBound) { leftBound= x; times.leftBound= t; } else if(x > rightBound) { rightBound= x; times.rightBound= t; } if(y < bottomBound) { bottomBound= y; times.bottomBound= t; } else if(y > topBound) { topBound= y; times.topBound= t; } if(z < nearBound) { nearBound= z; times.nearBound=t; } else if(z > farBound) { farBound= z; times.farBound=t; } } bbox3 operator+= (const triple& v) { add(v); return *this; } triple Min() const { return triple(leftBound, bottomBound, nearBound); } triple Max() const { return triple(rightBound, topBound, farBound); } pair Min2() const { return pair(leftBound, bottomBound); } pair Max2() const { return pair(rightBound, topBound); } friend ostream& operator << (ostream& out, const bbox3& b) { out << "Min " << b.Min() << " Max " << b.Max(); return out; } }; } // namespace camp GC_DECLARE_PTRFREE(camp::bbox3); #endif asymptote-3.05/config.sub0000755000000000000000000011544115031566105014157 0ustar rootroot#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2024 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268,SC2162 # see below for rationale timestamp='2024-05-27' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Split fields of configuration type saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 basic_os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in cloudabi*-eabi* \ | kfreebsd*-gnu* \ | knetbsd*-gnu* \ | kopensolaris*-gnu* \ | linux-* \ | managarm-* \ | netbsd*-eabi* \ | netbsd*-gnu* \ | nto-qnx* \ | os2-emx* \ | rtmk-nova* \ | storm-chaos* \ | uclinux-gnu* \ | uclinux-uclibc* \ | windows-* ) basic_machine=$field1 basic_os=$maybe_os ;; android-linux) basic_machine=$field1-unknown basic_os=linux-android ;; *) basic_machine=$field1-$field2 basic_os=$field3 ;; esac ;; *-*) case $field1-$field2 in # Shorthands that happen to contain a single dash convex-c[12] | convex-c3[248]) basic_machine=$field2-convex basic_os= ;; decstation-3100) basic_machine=mips-dec basic_os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Do not treat sunos as a manufacturer sun*os*) basic_machine=$field1 basic_os=$field2 ;; # Manufacturers 3100* \ | 32* \ | 3300* \ | 3600* \ | 7300* \ | acorn \ | altos* \ | apollo \ | apple \ | atari \ | att* \ | axis \ | be \ | bull \ | cbm \ | ccur \ | cisco \ | commodore \ | convergent* \ | convex* \ | cray \ | crds \ | dec* \ | delta* \ | dg \ | digital \ | dolphin \ | encore* \ | gould \ | harris \ | highlevel \ | hitachi* \ | hp \ | ibm* \ | intergraph \ | isi* \ | knuth \ | masscomp \ | microblaze* \ | mips* \ | motorola* \ | ncr* \ | news \ | next \ | ns \ | oki \ | omron* \ | pc533* \ | rebel \ | rom68k \ | rombug \ | semi \ | sequent* \ | siemens \ | sgi* \ | siemens \ | sim \ | sni \ | sony* \ | stratus \ | sun \ | sun[234]* \ | tektronix \ | tti* \ | ultra \ | unicom* \ | wec \ | winbond \ | wrs) basic_machine=$field1-$field2 basic_os= ;; zephyr*) basic_machine=$field1-unknown basic_os=$field2 ;; *) basic_machine=$field1 basic_os=$field2 ;; esac ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc basic_os=bsd ;; a29khif) basic_machine=a29k-amd basic_os=udi ;; adobe68k) basic_machine=m68010-adobe basic_os=scout ;; alliant) basic_machine=fx80-alliant basic_os= ;; altos | altos3068) basic_machine=m68k-altos basic_os= ;; am29k) basic_machine=a29k-none basic_os=bsd ;; amdahl) basic_machine=580-amdahl basic_os=sysv ;; amiga) basic_machine=m68k-unknown basic_os= ;; amigaos | amigados) basic_machine=m68k-unknown basic_os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown basic_os=sysv4 ;; apollo68) basic_machine=m68k-apollo basic_os=sysv ;; apollo68bsd) basic_machine=m68k-apollo basic_os=bsd ;; aros) basic_machine=i386-pc basic_os=aros ;; aux) basic_machine=m68k-apple basic_os=aux ;; balance) basic_machine=ns32k-sequent basic_os=dynix ;; blackfin) basic_machine=bfin-unknown basic_os=linux ;; cegcc) basic_machine=arm-unknown basic_os=cegcc ;; cray) basic_machine=j90-cray basic_os=unicos ;; crds | unos) basic_machine=m68k-crds basic_os= ;; da30) basic_machine=m68k-da30 basic_os= ;; decstation | pmax | pmin | dec3100 | decstatn) basic_machine=mips-dec basic_os= ;; delta88) basic_machine=m88k-motorola basic_os=sysv3 ;; dicos) basic_machine=i686-pc basic_os=dicos ;; djgpp) basic_machine=i586-pc basic_os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd basic_os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson basic_os=ose ;; gmicro) basic_machine=tron-gmicro basic_os=sysv ;; go32) basic_machine=i386-pc basic_os=go32 ;; h8300hms) basic_machine=h8300-hitachi basic_os=hms ;; h8300xray) basic_machine=h8300-hitachi basic_os=xray ;; h8500hms) basic_machine=h8500-hitachi basic_os=hms ;; harris) basic_machine=m88k-harris basic_os=sysv3 ;; hp300 | hp300hpux) basic_machine=m68k-hp basic_os=hpux ;; hp300bsd) basic_machine=m68k-hp basic_os=bsd ;; hppaosf) basic_machine=hppa1.1-hp basic_os=osf ;; hppro) basic_machine=hppa1.1-hp basic_os=proelf ;; i386mach) basic_machine=i386-mach basic_os=mach ;; isi68 | isi) basic_machine=m68k-isi basic_os=sysv ;; m68knommu) basic_machine=m68k-unknown basic_os=linux ;; magnum | m3230) basic_machine=mips-mips basic_os=sysv ;; merlin) basic_machine=ns32k-utek basic_os=sysv ;; mingw64) basic_machine=x86_64-pc basic_os=mingw64 ;; mingw32) basic_machine=i686-pc basic_os=mingw32 ;; mingw32ce) basic_machine=arm-unknown basic_os=mingw32ce ;; monitor) basic_machine=m68k-rom68k basic_os=coff ;; morphos) basic_machine=powerpc-unknown basic_os=morphos ;; moxiebox) basic_machine=moxie-unknown basic_os=moxiebox ;; msdos) basic_machine=i386-pc basic_os=msdos ;; msys) basic_machine=i686-pc basic_os=msys ;; mvs) basic_machine=i370-ibm basic_os=mvs ;; nacl) basic_machine=le32-unknown basic_os=nacl ;; ncr3000) basic_machine=i486-ncr basic_os=sysv4 ;; netbsd386) basic_machine=i386-pc basic_os=netbsd ;; netwinder) basic_machine=armv4l-rebel basic_os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony basic_os=newsos ;; news1000) basic_machine=m68030-sony basic_os=newsos ;; necv70) basic_machine=v70-nec basic_os=sysv ;; nh3000) basic_machine=m68k-harris basic_os=cxux ;; nh[45]000) basic_machine=m88k-harris basic_os=cxux ;; nindy960) basic_machine=i960-intel basic_os=nindy ;; mon960) basic_machine=i960-intel basic_os=mon960 ;; nonstopux) basic_machine=mips-compaq basic_os=nonstopux ;; os400) basic_machine=powerpc-ibm basic_os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson basic_os=ose ;; os68k) basic_machine=m68k-none basic_os=os68k ;; paragon) basic_machine=i860-intel basic_os=osf ;; parisc) basic_machine=hppa-unknown basic_os=linux ;; psp) basic_machine=mipsallegrexel-sony basic_os=psp ;; pw32) basic_machine=i586-unknown basic_os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc basic_os=rdos ;; rdos32) basic_machine=i386-pc basic_os=rdos ;; rom68k) basic_machine=m68k-rom68k basic_os=coff ;; sa29200) basic_machine=a29k-amd basic_os=udi ;; sei) basic_machine=mips-sei basic_os=seiux ;; sequent) basic_machine=i386-sequent basic_os= ;; sps7) basic_machine=m68k-bull basic_os=sysv2 ;; st2000) basic_machine=m68k-tandem basic_os= ;; stratus) basic_machine=i860-stratus basic_os=sysv4 ;; sun2) basic_machine=m68000-sun basic_os= ;; sun2os3) basic_machine=m68000-sun basic_os=sunos3 ;; sun2os4) basic_machine=m68000-sun basic_os=sunos4 ;; sun3) basic_machine=m68k-sun basic_os= ;; sun3os3) basic_machine=m68k-sun basic_os=sunos3 ;; sun3os4) basic_machine=m68k-sun basic_os=sunos4 ;; sun4) basic_machine=sparc-sun basic_os= ;; sun4os3) basic_machine=sparc-sun basic_os=sunos3 ;; sun4os4) basic_machine=sparc-sun basic_os=sunos4 ;; sun4sol2) basic_machine=sparc-sun basic_os=solaris2 ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun basic_os= ;; sv1) basic_machine=sv1-cray basic_os=unicos ;; symmetry) basic_machine=i386-sequent basic_os=dynix ;; t3e) basic_machine=alphaev5-cray basic_os=unicos ;; t90) basic_machine=t90-cray basic_os=unicos ;; toad1) basic_machine=pdp10-xkl basic_os=tops20 ;; tpf) basic_machine=s390x-ibm basic_os=tpf ;; udi29k) basic_machine=a29k-amd basic_os=udi ;; ultra3) basic_machine=a29k-nyu basic_os=sym1 ;; v810 | necv810) basic_machine=v810-nec basic_os=none ;; vaxv) basic_machine=vax-dec basic_os=sysv ;; vms) basic_machine=vax-dec basic_os=vms ;; vsta) basic_machine=i386-pc basic_os=vsta ;; vxworks960) basic_machine=i960-wrs basic_os=vxworks ;; vxworks68) basic_machine=m68k-wrs basic_os=vxworks ;; vxworks29k) basic_machine=a29k-wrs basic_os=vxworks ;; xbox) basic_machine=i686-pc basic_os=mingw32 ;; ymp) basic_machine=ymp-cray basic_os=unicos ;; *) basic_machine=$1 basic_os= ;; esac ;; esac # Decode 1-component or ad-hoc basic machines case $basic_machine in # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) cpu=hppa1.1 vendor=winbond ;; op50n) cpu=hppa1.1 vendor=oki ;; op60c) cpu=hppa1.1 vendor=oki ;; ibm*) cpu=i370 vendor=ibm ;; orion105) cpu=clipper vendor=highlevel ;; mac | mpw | mac-mpw) cpu=m68k vendor=apple ;; pmac | pmac-mpw) cpu=powerpc vendor=apple ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) cpu=m68000 vendor=att ;; 3b*) cpu=we32k vendor=att ;; bluegene*) cpu=powerpc vendor=ibm basic_os=cnk ;; decsystem10* | dec10*) cpu=pdp10 vendor=dec basic_os=tops10 ;; decsystem20* | dec20*) cpu=pdp10 vendor=dec basic_os=tops20 ;; delta | 3300 | delta-motorola | 3300-motorola | motorola-delta | motorola-3300) cpu=m68k vendor=motorola ;; # This used to be dpx2*, but that gets the RS6000-based # DPX/20 and the x86-based DPX/2-100 wrong. See # https://oldskool.silicium.org/stations/bull_dpx20.htm # https://www.feb-patrimoine.com/english/bull_dpx2.htm # https://www.feb-patrimoine.com/english/unix_and_bull.htm dpx2 | dpx2[23]00 | dpx2[23]xx) cpu=m68k vendor=bull ;; dpx2100 | dpx21xx) cpu=i386 vendor=bull ;; dpx20) cpu=rs6000 vendor=bull ;; encore | umax | mmax) cpu=ns32k vendor=encore ;; elxsi) cpu=elxsi vendor=elxsi basic_os=${basic_os:-bsd} ;; fx2800) cpu=i860 vendor=alliant ;; genix) cpu=ns32k vendor=ns ;; h3050r* | hiux*) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) cpu=m68000 vendor=hp ;; hp9k3[2-9][0-9]) cpu=m68k vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) cpu=hppa1.1 vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; i*86v32) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv32 ;; i*86v4*) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv4 ;; i*86v) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv ;; i*86sol2) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=solaris2 ;; j90 | j90-cray) cpu=j90 vendor=cray basic_os=${basic_os:-unicos} ;; iris | iris4d) cpu=mips vendor=sgi case $basic_os in irix*) ;; *) basic_os=irix4 ;; esac ;; miniframe) cpu=m68000 vendor=convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) cpu=m68k vendor=atari basic_os=mint ;; news-3600 | risc-news) cpu=mips vendor=sony basic_os=newsos ;; next | m*-next) cpu=m68k vendor=next ;; np1) cpu=np1 vendor=gould ;; op50n-* | op60c-*) cpu=hppa1.1 vendor=oki basic_os=proelf ;; pa-hitachi) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; pbd) cpu=sparc vendor=tti ;; pbb) cpu=m68k vendor=tti ;; pc532) cpu=ns32k vendor=pc532 ;; pn) cpu=pn vendor=gould ;; power) cpu=power vendor=ibm ;; ps2) cpu=i386 vendor=ibm ;; rm[46]00) cpu=mips vendor=siemens ;; rtpc | rtpc-*) cpu=romp vendor=ibm ;; sde) cpu=mipsisa32 vendor=sde basic_os=${basic_os:-elf} ;; simso-wrs) cpu=sparclite vendor=wrs basic_os=vxworks ;; tower | tower-32) cpu=m68k vendor=ncr ;; vpp*|vx|vx-*) cpu=f301 vendor=fujitsu ;; w65) cpu=w65 vendor=wdc ;; w89k-*) cpu=hppa1.1 vendor=winbond basic_os=proelf ;; none) cpu=none vendor=none ;; leon|leon[3-9]) cpu=sparc vendor=$basic_machine ;; leon-*|leon[3-9]-*) cpu=sparc vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; *-*) saved_IFS=$IFS IFS="-" read cpu vendor <&2 exit 1 ;; esac ;; esac # Here we canonicalize certain aliases for manufacturers. case $vendor in digital*) vendor=dec ;; commodore*) vendor=cbm ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if test x"$basic_os" != x then # First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. obj= case $basic_os in gnu/linux*) kernel=linux os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` ;; os2-emx) kernel=os2 os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` ;; nto-qnx*) kernel=nto os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` ;; *-*) saved_IFS=$IFS IFS="-" read kernel os <&2 fi ;; *) echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 exit 1 ;; esac case $obj in aout* | coff* | elf* | pe*) ;; '') # empty is fine ;; *) echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 exit 1 ;; esac # Here we handle the constraint that a (synthetic) cpu and os are # valid only in combination with each other and nowhere else. case $cpu-$os in # The "javascript-unknown-ghcjs" triple is used by GHC; we # accept it here in order to tolerate that, but reject any # variations. javascript-ghcjs) ;; javascript-* | *-ghcjs) echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. case $kernel-$os-$obj in linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \ | linux-mlibc*- | linux-musl*- | linux-newlib*- \ | linux-relibc*- | linux-uclibc*- | linux-ohos*- ) ;; uclinux-uclibc*- | uclinux-gnu*- ) ;; managarm-mlibc*- | managarm-kernel*- ) ;; windows*-msvc*-) ;; -dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \ | -uclibc*- ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 exit 1 ;; -kernel*- ) echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 exit 1 ;; *-kernel*- ) echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 exit 1 ;; *-msvc*- ) echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 exit 1 ;; kfreebsd*-gnu*- | knetbsd*-gnu*- | netbsd*-gnu*- | kopensolaris*-gnu*-) ;; vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) ;; nto-qnx*-) ;; os2-emx-) ;; rtmk-nova-) ;; *-eabi*- | *-gnueabi*-) ;; none--*) # None (no kernel, i.e. freestanding / bare metal), # can be paired with an machine code file format ;; -*-) # Blank kernel with real OS is always fine. ;; --*) # Blank kernel and OS with real machine code file format is always fine. ;; *-*-*) echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 exit 1 ;; esac # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) case $cpu-$os in *-riscix*) vendor=acorn ;; *-sunos* | *-solaris*) vendor=sun ;; *-cnk* | *-aix*) vendor=ibm ;; *-beos*) vendor=be ;; *-hpux*) vendor=hp ;; *-mpeix*) vendor=hp ;; *-hiux*) vendor=hitachi ;; *-unos*) vendor=crds ;; *-dgux*) vendor=dg ;; *-luna*) vendor=omron ;; *-genix*) vendor=ns ;; *-clix*) vendor=intergraph ;; *-mvs* | *-opened*) vendor=ibm ;; *-os400*) vendor=ibm ;; s390-* | s390x-*) vendor=ibm ;; *-ptx*) vendor=sequent ;; *-tpf*) vendor=ibm ;; *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; *-aux*) vendor=apple ;; *-hms*) vendor=hitachi ;; *-mpw* | *-macos*) vendor=apple ;; *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; *-vos*) vendor=stratus ;; esac ;; esac echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: asymptote-3.05/fftw++.h0000644000000000000000000012607115031566105013442 0ustar rootroot/* Fast Fourier transform C++ header class for the FFTW3 Library Copyright (C) 2004-2024 John C. Bowman, University of Alberta Malcolm Roberts, University of Strasbourg This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __fftwpp_h__ #define __fftwpp_h__ 1 #define __FFTWPP_H_VERSION__ 3.03 #include #include #include #include #include #include #include #include #include "seconds.h" #include "parallel.h" #ifndef __Complex_h__ #include typedef std::complex Complex; #endif #include "statistics.h" #include "align.h" namespace fftwpp { // Return the memory alignment used by FFTW. // Use of this function requires applying patches/fftw-3.3.8-alignment.patch // to the FFTW source, recompiling, and reinstalling the FFW library. extern "C" size_t fftw_alignment(); class fftw; extern "C" fftw_plan Planner(fftw *F, Complex *in, Complex *out); void loadWisdom(); void saveWisdom(); extern std::string wisdomName; extern const char *inout; class ThreadBase { public: size_t threads; size_t innerthreads; ThreadBase(); ThreadBase(size_t threads) : threads(threads) {} void Threads(size_t nthreads) {threads=nthreads;} size_t Threads() {return threads;} size_t Innerthreads() {return innerthreads;} void multithread(size_t n) { if(n >= threads) { innerthreads=1; } else { innerthreads=threads; threads=1; } } }; inline size_t realsize(size_t n, bool inplace) { return inplace ? 2*(n/2+1) : n; } inline size_t Inplace(Complex *in, Complex *out=NULL) { return !out || in == out; } inline size_t Inplace(Complex *in, double *out) { return Inplace(in,(Complex *) out); } inline size_t Inplace(double *in, Complex *out) { return Inplace((Complex *) in,out); } class Doubles { public: size_t rsize,csize; Doubles(size_t nx, size_t M, size_t istride, size_t ostride, size_t idist, size_t odist, bool inplace) { rsize=(realsize(nx,inplace)-2)*istride+(M-1)*idist+2; csize=2*(nx/2*ostride+(M-1)*odist+1); if(inplace) rsize=csize=std::max(rsize,csize); } }; // Base clase for fft routines // class fftw : public ThreadBase { protected: size_t doubles; // number of double precision values in output int sign; size_t threads; double norm; fftw_plan plan; bool inplace; size_t Dist(size_t n, size_t stride, size_t dist) { return dist ? dist : ((stride == 1) ? n : 1); } static const double twopi; public: static size_t effort; static size_t maxthreads; static fftw_plan (*planner)(fftw *f, Complex *in, Complex *out); static bool wiser; virtual size_t Threads() {return threads;} static const char *oddshift; // In-place shift of Fourier origin to (nx/2,0) for even nx. static void Shift(Complex *data, size_t nx, size_t ny, size_t threads) { size_t nyp=ny/2+1; size_t stop=nx*nyp; if(nx % 2 == 0) { size_t inc=2*nyp; #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t i=nyp; i < stop; i += inc) { Complex *p=data+i; for(size_t j=0; j < nyp; j++) p[j]=-p[j]; } } else { std::cerr << oddshift << std::endl; exit(1); } } // Out-of-place shift of Fourier origin to (nx/2,0) for even nx. static void Shift(double *data, size_t nx, size_t ny, size_t threads) { if(nx % 2 == 0) { size_t stop=nx*ny; size_t inc=2*ny; #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t i=ny; i < stop; i += inc) { double *p=data+i; for(size_t j=0; j < ny; j++) p[j]=-p[j]; } } else { std::cerr << oddshift << std::endl; exit(1); } } // In-place shift of Fourier origin to (nx/2,ny/2,0) for even nx and ny. static void Shift(Complex *data, size_t nx, size_t ny, size_t nz, size_t threads) { size_t nzp=nz/2+1; size_t nyzp=ny*nzp; if(nx % 2 == 0 && ny % 2 == 0) { size_t pinc=2*nzp; #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t i=0; i < nx; i++) { Complex *pstart=data+i*nyzp; Complex *pstop=pstart+nyzp; for(Complex *p=pstart+(1-(i % 2))*nzp; p < pstop; p += pinc) { for(size_t k=0; k < nzp; k++) p[k]=-p[k]; } } } else { std::cerr << oddshift << " or odd ny" << std::endl; exit(1); } } // Out-of-place shift of Fourier origin to (nx/2,ny/2,0) for even nx and ny. static void Shift(double *data, size_t nx, size_t ny, size_t nz, size_t threads) { size_t nyz=ny*nz; if(nx % 2 == 0 && ny % 2 == 0) { size_t pinc=2*nz; #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t i=0; i < nx; i++) { double *pstart=data+i*nyz; double *pstop=pstart+nyz; for(double *p=pstart+(1-(i % 2))*nz; p < pstop; p += pinc) { for(size_t k=0; k < nz; k++) p[k]=-p[k]; } } } else { std::cerr << oddshift << " or odd ny" << std::endl; exit(1); } } fftw() : plan(NULL) {} fftw(size_t doubles, int sign, size_t threads, size_t n=0) : doubles(doubles), sign(sign), threads(threads), norm(1.0/(n ? n : doubles/2)), plan(NULL) { #ifndef FFTWPP_SINGLE_THREAD fftw_init_threads(); #endif } virtual ~fftw() { if(plan) fftw_destroy_plan(plan); } virtual fftw_plan Plan(Complex *in, Complex *out) {return NULL;}; inline void CheckAlign(Complex *p, const char *s) { if((size_t) p % sizeof(Complex) == 0) return; std::cerr << "WARNING: " << s << " array is not " << sizeof(Complex) << "-byte aligned: address " << p << std::endl; } void noplan() { std::cerr << "Unable to construct FFTW plan" << std::endl; exit(1); } static void planThreads(size_t threads) { #ifndef FFTWPP_SINGLE_THREAD omp_set_num_threads(fftw::maxthreads); fftw_plan_with_nthreads(threads); #endif } inline Complex *CheckAlign(Complex *in, Complex *out, bool constructor=true) { #ifndef NO_CHECK_ALIGN CheckAlign(in,constructor ? "constructor input" : "input"); if(out) CheckAlign(out,constructor ? "constructor output" : "output"); else out=in; #else if(!out) out=in; #endif return out; } void Setup(Complex *in, Complex *out=NULL) { bool alloc=!in; if(alloc) in=utils::ComplexAlign((doubles+1)/2); out=CheckAlign(in,out); inplace=(out==in); parallel::Threshold(threads); if(doubles < 2*threshold) threads=1; planThreads(threads); plan=(*planner)(this,in,out); if(!plan) noplan(); if(alloc) Array::deleteAlign(in,(doubles+1)/2); #ifdef FFTWPP_VERBOSE if(threads > 1) std::cout << "Using " << threads << " threads." << std::endl; #endif } void Setup(Complex *in, double *out) { parallel::Threshold(threads); if(doubles < 4*threshold) threads=1; Setup(in,(Complex *) out); } void Setup(double *in, Complex *out=NULL) { parallel::Threshold(threads); if(doubles < 4*threshold) threads=1; Setup((Complex *) in,out); } virtual void Execute(Complex *in, Complex *out, bool=false) { fftw_execute_dft(plan,(fftw_complex *) in,(fftw_complex *) out); } Complex *Setout(Complex *in, Complex *out) { out=CheckAlign(in,out,false); if(inplace ^ (out == in)) { std::cerr << "ERROR: fft " << inout << std::endl; exit(1); } return out; } void fft(Complex *in, Complex *out=NULL) { out=Setout(in,out); Execute(in,out); } void fft(double *in, Complex *out=NULL) { fft((Complex *) in,out); } void fft(Complex *in, double *out) { fft(in,(Complex *) out); } void fft0(Complex *in, Complex *out=NULL) { out=Setout(in,out); Execute(in,out,true); } void fft0(double *in, Complex *out=NULL) { fft0((Complex *) in,out); } void fft0(Complex *in, double *out) { fft0(in,(Complex *) out); } void Normalize(Complex *out) { size_t stop=doubles/2; #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t i=0; i < stop; i++) out[i] *= norm; } void Normalize(double *out) { #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t i=0; i < doubles; i++) out[i] *= norm; } void fftNormalized(Complex *in, Complex *out=NULL) { out=Setout(in,out); Execute(in,out); Normalize(out); } void fftNormalized(Complex *in, double *out) { out=(double *) Setout(in,(Complex *) out); Execute(in,(Complex *) out); Normalize(out); } void fftNormalized(double *in, Complex *out) { out=Setout((Complex *) in,out); Execute((Complex *) in,out); Normalize(out); } void fft0Normalized(Complex *in, Complex *out=NULL) { out=Setout(in,out); Execute(in,out,true); Normalize(out); } void fft0Normalized(Complex *in, double *out) { out=(double *) Setout(in,(Complex *) out); Execute(in,(Complex *) out,true); Normalize(out); } void fft0Normalized(double *in, Complex *out) { out=Setout((Complex *) in,out); Execute((Complex *) in,out,true); Normalize(out); } template void Normalize(size_t nx, size_t M, size_t ostride, size_t odist, O *out) { size_t stop=nx*ostride; O *outMdist=out+M*odist; #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t i=0; i < stop; i += ostride) { O *pstop=outMdist+i; for(O *p=out+i; p < pstop; p += odist) { *p *= norm; } } } template void fftNormalized(size_t nx, size_t M, size_t ostride, size_t odist, I *in, O *out) { out=(O *) Setout((Complex *) in,(Complex *) out); Execute((Complex *) in,(Complex *) out); Normalize(nx,M,ostride,odist,out); } }; // class fftw class Transpose { fftw_plan plan; bool inplace; public: template Transpose(size_t rows, size_t cols, size_t length, T *in, T *out=NULL, size_t threads=fftw::maxthreads) { size_t size=sizeof(T); if(size % sizeof(double) != 0) { std::cerr << "ERROR: Transpose is not implemented for type of size " << size; exit(1); } plan=NULL; if(!out) out=in; inplace=(out==in); if(rows == 0 || cols == 0) return; size /= sizeof(double); length *= size; parallel::Threshold(threads); if(length*rows*cols/2 < threshold) threads=1; fftw::planThreads(threads); fftw_iodim dims[3]; dims[0].n=rows; dims[0].is=cols*length; dims[0].os=length; dims[1].n=cols; dims[1].is=length; dims[1].os=rows*length; dims[2].n=length; dims[2].is=1; dims[2].os=1; // A plan with rank=0 is a transpose. plan=fftw_plan_guru_r2r(0,NULL,3,dims,(double *) in,(double *) out, NULL,fftw::effort); } ~Transpose() { if(plan) fftw_destroy_plan(plan); } template void transpose(T *in, T *out=NULL) { if(!plan) return; if(!out) out=in; if(inplace ^ (out == in)) { std::cerr << "ERROR: Transpose " << inout << std::endl; exit(1); } fftw_execute_r2r(plan,(double *) in,(double*) out); } }; template class Threadtable { public: typedef std::map Table; size_t Lookup(Table& table, T key) { typename Table::iterator p=table.find(key); return p == table.end() ? 0 : p->second; } void Store(Table& threadtable, T key, size_t t) { threadtable[key]=t; } }; struct keytype { size_t nx; size_t M; size_t threads; bool inplace; keytype(size_t nx, size_t M, size_t threads, bool inplace) : nx(nx), M(M), threads(threads), inplace(inplace) {} }; struct keyless { bool operator()(const keytype& a, const keytype& b) const { return a.nx < b.nx || (a.nx == b.nx && (a.M < b.M || (a.M == b.M && (a.threads < b.threads || (a.threads == b.threads && a.inplace < b.inplace))))); } }; // Compute the complex Fourier transform of n complex values. // Before calling fft(), the arrays in and out (which may coincide) must be // allocated as Complex[n]. // // Out-of-place usage: // // fft1d Forward(n,-1,in,out); // Forward.fft(in,out); // // fft1d Backward(n,1,in,out); // Backward.fft(in,out); // // fft1d Backward(n,1,in,out); // Backward.fftNormalized(in,out); // True inverse of Forward.fft(out,in); // // In-place usage: // // fft1d Forward(n,-1); // Forward.fft(in); // // fft1d Backward(n,1); // Backward.fft(in); // class fft1d : public fftw { size_t nx; public: fft1d(size_t nx, int sign, Complex *in=NULL, Complex *out=NULL, size_t threads=maxthreads) : fftw(2*nx,sign,threads), nx(nx) {Setup(in,out);} #ifdef __Array_h__ fft1d(int sign, const Array::array1& in, const Array::array1& out=Array::NULL1, size_t threads=maxthreads) : fftw(2*in.Nx(),sign,threads), nx(in.Nx()) {Setup(in,out);} #endif fftw_plan Plan(Complex *in, Complex *out) { return fftw_plan_dft_1d(nx,(fftw_complex *) in,(fftw_complex *) out, sign,effort); } }; template class fftwblock : public virtual fftw, public virtual Threadtable { public: int nx; size_t M; size_t istride,ostride; size_t idist,odist; fftw_plan plan1,plan2; size_t T,Q,R; fftwblock() : plan1(NULL), plan2(NULL) {} fftwblock(size_t nx, size_t M, size_t istride, size_t ostride, size_t idist, size_t odist) : fftw(), nx(nx), M(M), istride(istride), ostride(ostride), idist(Dist(nx,istride,idist)), odist(Dist(nx,ostride,odist)), plan1(NULL), plan2(NULL) {} void init(Complex *in, Complex *out, size_t Threads, Table& threadtable) { T=1; Q=M; R=0; if(Threads > M && M > 1) Threads=M; threads=Threads; Setup(in,out); Threads=threads; size_t T0=Threads; if(T0 > 1) { size_t nxp=nx/2+1; size_t olength=0; size_t ilength=0; if(typeid(I) == typeid(double)) { ilength=nx; olength=nxp; } if(typeid(O) == typeid(double)) { ilength=nxp; olength=nx; } if(!inplace || (ostride*olength*sizeof(O) <= idist*sizeof(I) && odist*sizeof(O) >= istride*ilength*sizeof(I))) { T=T0; Q=T > 0 ? M/T : 0; R=M-Q*T; size_t data=Lookup(threadtable,keytype(nx,M,Threads,inplace)); if(data == 1) T0=1; else { fftw_plan planFFTW=plan; threads=1; Setup(in,out); plan1=plan; if(data == T) { plan=NULL; return; } plan=planFFTW; } } else T0=1; } if(T0 == 1 || time(in,out)) { // Use FFTW's multithreading T=1; if(plan1) { fftw_destroy_plan(plan1); plan1=NULL; if(plan2) { fftw_destroy_plan(plan2); plan2=NULL; } threads=Threads; Store(threadtable,keytype(nx,M,Threads,inplace),T); } } else { // Do the multithreading ourselves T=T0; threads=T; Store(threadtable,keytype(nx,M,Threads,inplace),T); } } bool time0(Complex *in, Complex *out) { utils::statistics S(true),ST(true); utils::statistics medianS(true),medianST(true); double eps=0.02; size_t T0=T; do { T=1; // FFTW utils::cpuTimer C; inplace ? fftNormalized(in,out) : fft(in,out); S.add(C.nanoseconds()); T=T0; // BLOCK utils::cpuTimer CT; inplace ? fftNormalized(in,out) : fft(in,out); ST.add(CT.nanoseconds()); if(S.count() >= 4 && ST.min() >= S.max()) return true; if(S.count() >= 4 && S.min() >= ST.max()) return false; medianS.add(S.median()); medianST.add(ST.median()); } while(S.count() < 5 || medianS.stderror() > eps*medianS.mean() || medianST.stderror() > eps*medianST.mean()); return S.median() <= ST.median(); } bool time(Complex *in, Complex *out) { bool alloc=!in; if(alloc) in=utils::ComplexAlign((doubles+1)/2); bool result=time0(in,out); if(alloc) Array::deleteAlign(in,(doubles+1)/2); return result; } fftw_plan Plan(int Q, fftw_complex *in, fftw_complex *out) { return fftw_plan_many_dft(1,&nx,Q,in,NULL,istride,idist, out,NULL,ostride,odist,sign,effort); } fftw_plan Plan(int Q, double *in, fftw_complex *out) { return fftw_plan_many_dft_r2c(1,&nx,Q,in,NULL,istride,idist, out,NULL,ostride,odist,effort); } fftw_plan Plan(int Q, fftw_complex *in, double *out) { return fftw_plan_many_dft_c2r(1,&nx,Q,in,NULL,istride,idist, out,NULL,ostride,odist,effort); } fftw_plan Plan(Complex *in, Complex *out) { if(R > 0) { plan2=Plan(Q+1,(I *) in,(O *) out); if(!plan2) return NULL; } return Plan(Q,(I *) in,(O *) out); } void Execute(fftw_plan plan, fftw_complex *in, fftw_complex *out) { fftw_execute_dft(plan,in,out); } void Execute(fftw_plan plan, double *in, fftw_complex *out) { fftw_execute_dft_r2c(plan,in,out); } void Execute(fftw_plan plan, fftw_complex *in, double *out) { fftw_execute_dft_c2r(plan,in,out); } void Execute(Complex *in, Complex *out, bool=false) { if(T == 1) Execute(plan,(I *) in,(O *) out); else { size_t extra=T-R; #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(T) #endif for(size_t i=0; i < T; ++i) { size_t iQ=i*Q; if(i < extra) Execute(plan1,(I *) in+iQ*idist,(O *) out+iQ*odist); else { size_t offset=iQ+i-extra; Execute(plan2,(I *) in+offset*idist,(O *) out+offset*odist); } } } } size_t Threads() {return std::max(T,threads);} ~fftwblock() { if(plan1) fftw_destroy_plan(plan1); if(plan2) fftw_destroy_plan(plan2); } }; class Mfft1d : public fftwblock, public virtual Threadtable { static Table threadtable; public: Mfft1d(size_t nx, int sign, size_t M=1, Complex *in=NULL, Complex *out=NULL, size_t threads=maxthreads) : fftw(2*((nx-1)+(M-1)*nx+1),sign,threads,nx), fftwblock(nx,M,1,1,nx,nx) { init(in,out,threads,threadtable); } Mfft1d(size_t nx, int sign, size_t M, size_t stride=1, size_t dist=0, Complex *in=NULL, Complex *out=NULL, size_t threads=maxthreads) : fftw(2*((nx-1)*stride+(M-1)*Dist(nx,stride,dist)+1),sign,threads,nx), fftwblock (nx,M,stride,stride,dist,dist) { init(in,out,threads,threadtable); } Mfft1d(size_t nx, int sign, size_t M, size_t istride, size_t ostride, size_t idist, size_t odist, Complex *in, Complex *out, size_t threads=maxthreads): fftw(std::max(2*((nx-1)*istride+(M-1)*Dist(nx,istride,idist)+1), 2*((nx-1)*ostride+(M-1)*Dist(nx,ostride,odist)+1)),sign, threads,nx), fftwblock(nx,M,istride,ostride,idist,odist) { init(in,out,threads,threadtable); } }; // Compute the complex Fourier transform of M complex vectors, each of // length n. // Before calling fft(), the arrays in and out (which may coincide) must be // allocated as Complex[M*n]. // // Out-of-place usage: // // mfft1d Forward(n,-1,M,stride,dist,in,out); // Forward.fft(in,out); // // mfft1d Forward(n,-1,M,istride,ostride,idist,odist,in,out); // Forward.fft(in,out); // // In-place usage: // // mfft1d Forward(n,-1,M,stride,dist); // Forward.fft(in); // // // // Notes: // stride is the spacing between the elements of each Complex vector; // dist is the spacing between the first elements of the vectors. // // class mfft1d { bool single; fft1d *fft1; Mfft1d *fftm; public: mfft1d(size_t nx, int sign, size_t M=1, Complex *in=NULL, Complex *out=NULL, size_t threads=fftw::maxthreads) : single(M == 1) { if(single) fft1=new fft1d(nx,sign,in,out,threads); else fftm=new Mfft1d(nx,sign,M,in,out,threads); } mfft1d(size_t nx, int sign, size_t M, size_t stride=1, size_t dist=0, Complex *in=NULL, Complex *out=NULL, size_t threads=fftw::maxthreads) : single(M == 1 && stride == 1) { if(single) fft1=new fft1d(nx,sign,in,out,threads); else fftm=new Mfft1d(nx,sign,M,stride,dist,in,out,threads); } mfft1d(size_t nx, int sign, size_t M, size_t istride, size_t ostride, size_t idist, size_t odist, Complex *in, Complex *out, size_t threads=fftw::maxthreads) : single(M == 1 && istride == 1 && ostride == 1) { if(single) fft1=new fft1d(nx,sign,in,out,threads); else fftm=new Mfft1d(nx,sign,M,istride,ostride,idist,odist,in,out,threads); } size_t Threads() { return single ? fft1->Threads() : fftm->Threads(); } template void fft(I in) { single ? fft1->fft(in) : fftm->fft(in); } template void fft(I in, O out) { single ? fft1->fft(in,out) : fftm->fft(in,out); } template void fftNormalized(I in) { single ? fft1->fftNormalized(in) : fftm->fftNormalized(in); } template void fftNormalized(I in, O out) { single ? fft1->fftNormalized(in,out) : fftm->fftNormalized(in,out); } template void Normalize(O out) { single ? fft1->Normalize(out) : fftm->Normalize(out); } ~mfft1d() { if(single) delete fft1; else delete fftm; } }; // Compute the complex Fourier transform of n real values, using phase sign -1. // Before calling fft(), the array in must be allocated as double[n] and // the array out must be allocated as Complex[n/2+1]. The arrays in and out // may coincide, allocated as Complex[n/2+1]. // // Out-of-place usage: // // rcfft1d Forward(n,in,out); // Forward.fft(in,out); // // In-place usage: // // rcfft1d Forward(n); // Forward.fft(out); // // Notes: // in contains the n real values stored as a Complex array; // out contains the first n/2+1 Complex Fourier values. // class rcfft1d : public fftw { size_t nx; public: rcfft1d(size_t nx, Complex *out=NULL, size_t threads=maxthreads) : fftw(2*(nx/2+1),-1,threads,nx), nx(nx) {Setup(out,(double*) NULL);} rcfft1d(size_t nx, double *in, Complex *out=NULL, size_t threads=maxthreads) : fftw(2*(nx/2+1),-1,threads,nx), nx(nx) {Setup(in,out);} fftw_plan Plan(Complex *in, Complex *out) { return fftw_plan_dft_r2c_1d(nx,(double *) in,(fftw_complex *) out, effort); } void Execute(Complex *in, Complex *out, bool=false) { fftw_execute_dft_r2c(plan,(double *) in,(fftw_complex *) out); } }; // Compute the real inverse Fourier transform of the n/2+1 Complex values // corresponding to the non-negative part of the frequency spectrum, using // phase sign +1. // Before calling fft(), the array in must be allocated as Complex[n/2+1] // and the array out must be allocated as double[n]. The arrays in and out // may coincide, allocated as Complex[n/2+1]. // // Out-of-place usage (input destroyed): // // crfft1d Backward(n,in,out); // Backward.fft(in,out); // // In-place usage: // // crfft1d Backward(n); // Backward.fft(in); // // Notes: // in contains the first n/2+1 Complex Fourier values. // out contains the n real values stored as a Complex array; // class crfft1d : public fftw { size_t nx; public: crfft1d(size_t nx, double *out=NULL, size_t threads=maxthreads) : fftw(2*(nx/2+1),1,threads,nx), nx(nx) {Setup(out);} crfft1d(size_t nx, Complex *in, double *out=NULL, size_t threads=maxthreads) : fftw(realsize(nx,Inplace(in,out)),1,threads,nx), nx(nx) {Setup(in,out);} fftw_plan Plan(Complex *in, Complex *out) { return fftw_plan_dft_c2r_1d(nx,(fftw_complex *) in,(double *) out,effort); } void Execute(Complex *in, Complex *out, bool=false) { fftw_execute_dft_c2r(plan,(fftw_complex *) in,(double *) out); } }; class Mrcfft1d : public fftwblock, public virtual Threadtable { static Table threadtable; public: Mrcfft1d(size_t nx, size_t M, size_t istride, size_t ostride, size_t idist, size_t odist, double *in=NULL, Complex *out=NULL, size_t threads=maxthreads) : fftw(Doubles(nx,M,istride,ostride,idist,odist,Inplace(in,out)).csize, -1,threads,nx), fftwblock (nx,M,istride,ostride,idist,odist) { init((Complex *) in,out,threads,threadtable); } void Normalize(Complex *out) { fftw::Normalize(nx/2+1,M,ostride,odist,out); } void fftNormalized(double *in, Complex *out=NULL) { fftw::fftNormalized(nx/2+1,M,ostride,odist,in,out); } }; // Compute the real Fourier transform of M real vectors, each of length n, // using phase sign -1. Before calling fft(), the array in must be // allocated as double[M*n] and the array out must be allocated as // Complex[M*(n/2+1)]. The arrays in and out may coincide, // allocated as Complex[M*(n/2+1)]. // // Out-of-place usage: // // mrcfft1d Forward(n,M,istride,ostride,idist,odist,in,out); // Forward.fft(in,out); // // In-place usage: // // mrcfft1d Forward(n,M,istride,ostride,idist,odist); // Forward.fft(out); // // Notes: // istride is the spacing between the elements of each real vector; // ostride is the spacing between the elements of each Complex vector; // idist is the spacing between the first elements of the real vectors; // odist is the spacing between the first elements of the Complex vectors; // in contains the n real values; // out contains the first n/2+1 Complex Fourier values. // class mrcfft1d { bool single; rcfft1d *fft1; Mrcfft1d *fftm; public: mrcfft1d(size_t nx, size_t M, size_t istride, size_t ostride, size_t idist, size_t odist, double *in=NULL, Complex *out=NULL, size_t threads=fftw::maxthreads) : single(M == 1 && istride == 1 && ostride == 1) { if(single) fft1=new rcfft1d(nx,in,out,threads); else fftm=new Mrcfft1d(nx,M,istride,ostride,idist,odist,in,out,threads); } size_t Threads() { return single ? fft1->Threads() : fftm->Threads(); } template void fft(I in) { single ? fft1->fft(in) : fftm->fft(in); } template void fft(I in, O out) { single ? fft1->fft(in,out) : fftm->fft(in,out); } void Normalize(Complex *out) { single ? fft1->Normalize(out) : fftm->Normalize(out); } template void fftNormalized(I in) { single ? fft1->fftNormalized(in) : fftm->fftNormalized(in); } template void fftNormalized(I in, O out=NULL) { single ? fft1->fftNormalized(in,out) : fftm->fftNormalized(in,out); } ~mrcfft1d() { if(single) delete fft1; else delete fftm; } }; class Mcrfft1d : public fftwblock, public virtual Threadtable { static Table threadtable; public: Mcrfft1d(size_t nx, size_t M, size_t istride, size_t ostride, size_t idist, size_t odist, Complex *in=NULL, double *out=NULL, size_t threads=maxthreads) : fftw(Doubles(nx,M,ostride,istride,odist,idist,Inplace(in,out)).rsize, 1,threads,nx), fftwblock (nx,M,istride,ostride,idist,odist) { init(in,(Complex *) out,threads,threadtable); } void Normalize(double *out) { fftw::Normalize(nx,M,ostride,odist,out); } void fftNormalized(Complex *in, double *out=NULL) { fftw::fftNormalized(nx,M,ostride,odist,in,out); } }; // Compute the real inverse Fourier transform of M complex vectors, each of // length n/2+1, corresponding to the non-negative parts of the frequency // spectra, using phase sign +1. Before calling fft(), the array in must be // allocated as Complex[M*(n/2+1)] and the array out must be allocated as // double[M*n]. The arrays in and out may coincide, // allocated as Complex[M*(n/2+1)]. // // Out-of-place usage (input destroyed): // // mcrfft1d Backward(n,M,istride,ostride,idist,odist,in,out); // Backward.fft(in,out); // // In-place usage: // // mcrfft1d Backward(n,M,istride,ostride,idist,odist); // Backward.fft(out); // // Notes: // istride is the spacing between the elements of each Complex vector; // ostride is the spacing between the elements of each real vector; // idist is the spacing between the first elements of the Complex vectors; // odist is the spacing between the first elements of the real vectors; // in contains the first n/2+1 Complex Fourier values; // out contains the n real values. // class mcrfft1d { bool single; crfft1d *fft1; Mcrfft1d *fftm; public: mcrfft1d(size_t nx, size_t M, size_t istride, size_t ostride, size_t idist, size_t odist, Complex *in=NULL, double *out=NULL, size_t threads=fftw::maxthreads) : single(M == 1 && istride == 1 && ostride == 1) { if(single) fft1=new crfft1d(nx,in,out,threads); else fftm=new Mcrfft1d(nx,M,istride,ostride,idist,odist,in,out,threads); } size_t Threads() { return single ? fft1->Threads() : fftm->Threads(); } template void fft(I in) { single ? fft1->fft(in) : fftm->fft(in); } template void fft(I in, O out) { single ? fft1->fft(in,out) : fftm->fft(in,out); } void Normalize(double *out) { single ? fft1->Normalize(out) : fftm->Normalize(out); } template void fftNormalized(I in) { single ? fft1->fftNormalized(in) : fftm->fftNormalized(in); } template void fftNormalized(I in, O out=NULL) { single ? fft1->fftNormalized(in,out) : fftm->fftNormalized(in,out); } ~mcrfft1d() { if(single) delete fft1; else delete fftm; } }; // Compute the complex two-dimensional Fourier transform of nx times ny // complex values. Before calling fft(), the arrays in and out (which may // coincide) must be allocated as Complex[nx*ny]. // // Out-of-place usage: // // fft2d Forward(nx,ny,-1,in,out); // Forward.fft(in,out); // // fft2d Backward(nx,ny,1,in,out); // Backward.fft(in,out); // // fft2d Backward(nx,ny,1,in,out); // Backward.fftNormalized(in,out); // True inverse of Forward.fft(out,in); // // In-place usage: // // fft2d Forward(nx,ny,-1); // Forward.fft(in); // // fft2d Backward(nx,ny,1); // Backward.fft(in); // // Note: // in[ny*i+j] contains the ny Complex values for each i=0,...,nx-1. // class fft2d : public fftw { size_t nx; size_t ny; public: fft2d(size_t nx, size_t ny, int sign, Complex *in=NULL, Complex *out=NULL, size_t threads=maxthreads) : fftw(2*nx*ny,sign,threads), nx(nx), ny(ny) {Setup(in,out);} #ifdef __Array_h__ fft2d(int sign, const Array::array2& in, const Array::array2& out=Array::NULL2, size_t threads=maxthreads) : fftw(2*in.Size(),sign,threads), nx(in.Nx()), ny(in.Ny()) { Setup(in,out); } #endif fftw_plan Plan(Complex *in, Complex *out) { return fftw_plan_dft_2d(nx,ny,(fftw_complex *) in,(fftw_complex *) out, sign,effort); } void Execute(Complex *in, Complex *out, bool=false) { fftw_execute_dft(plan,(fftw_complex *) in,(fftw_complex *) out); } }; // Compute the complex two-dimensional Fourier transform of nx times ny real // values, using phase sign -1. // Before calling fft(), the array in must be allocated as double[nx*ny] and // the array out must be allocated as Complex[nx*(ny/2+1)]. The arrays in // and out may coincide, allocated as Complex[nx*(ny/2+1)]. // // Out-of-place usage: // // rcfft2d Forward(nx,ny,in,out); // Forward.fft(in,out); // Origin of Fourier domain at (0,0) // Forward.fft0(in,out); // Origin of Fourier domain at (nx/2,0); // input destroyed. // // In-place usage: // // rcfft2d Forward(nx,ny); // Forward.fft(in); // Origin of Fourier domain at (0,0) // Forward.fft0(in); // Origin of Fourier domain at (nx/2,0) // // Notes: // in contains the nx*ny real values stored as a Complex array; // out contains the upper-half portion (ky >= 0) of the Complex transform. // class rcfft2d : public fftw { size_t nx; size_t ny; public: rcfft2d(size_t nx, size_t ny, Complex *out=NULL, size_t threads=maxthreads) : fftw(2*nx*(ny/2+1),-1,threads,nx*ny), nx(nx), ny(ny) {Setup(out);} rcfft2d(size_t nx, size_t ny, double *in, Complex *out=NULL, size_t threads=maxthreads) : fftw(2*nx*(ny/2+1),-1,threads,nx*ny), nx(nx), ny(ny) { Setup(in,out); } fftw_plan Plan(Complex *in, Complex *out) { return fftw_plan_dft_r2c_2d(nx,ny,(double *) in,(fftw_complex *) out, effort); } void Execute(Complex *in, Complex *out, bool shift=false) { if(shift) { if(inplace) Shift(in,nx,ny,threads); else Shift((double *) in,nx,ny,threads); } fftw_execute_dft_r2c(plan,(double *) in,(fftw_complex *) out); } // Set Nyquist modes of even shifted transforms to zero. void deNyquist(Complex *f) { size_t nyp=ny/2+1; if(nx % 2 == 0) #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t j=0; j < nyp; ++j) f[j]=0.0; if(ny % 2 == 0) #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t i=0; i < nx; ++i) f[(i+1)*nyp-1]=0.0; } }; // Compute the real two-dimensional inverse Fourier transform of the // nx*(ny/2+1) Complex values corresponding to the spectral values in the // half-plane ky >= 0, using phase sign +1. // Before calling fft(), the array in must be allocated as // Complex[nx*(ny/2+1)] and the array out must be allocated as // double[nx*ny]. The arrays in and out may coincide, // allocated as Complex[nx*(ny/2+1)]. // // Out-of-place usage (input destroyed): // // crfft2d Backward(nx,ny,in,out); // Backward.fft(in,out); // Origin of Fourier domain at (0,0) // Backward.fft0(in,out); // Origin of Fourier domain at (nx/2,0) // // In-place usage: // // crfft2d Backward(nx,ny); // Backward.fft(in); // Origin of Fourier domain at (0,0) // Backward.fft0(in); // Origin of Fourier domain at (nx/2,0) // // Notes: // in contains the upper-half portion (ky >= 0) of the Complex transform; // out contains the nx*ny real values stored as a Complex array. // class crfft2d : public fftw { size_t nx; size_t ny; public: crfft2d(size_t nx, size_t ny, double *out=NULL, size_t threads=maxthreads) : fftw(2*nx*(ny/2+1),1,threads,nx*ny), nx(nx), ny(ny) {Setup(out);} crfft2d(size_t nx, size_t ny, Complex *in, double *out=NULL, size_t threads=maxthreads) : fftw(nx*realsize(ny,Inplace(in,out)),1,threads,nx*ny), nx(nx), ny(ny) { Setup(in,out); } fftw_plan Plan(Complex *in, Complex *out) { return fftw_plan_dft_c2r_2d(nx,ny,(fftw_complex *) in,(double *) out, effort); } void Execute(Complex *in, Complex *out, bool shift=false) { fftw_execute_dft_c2r(plan,(fftw_complex *) in,(double *) out); if(shift) { if(inplace) Shift(out,nx,ny,threads); else Shift((double *) out,nx,ny,threads); } } // Set Nyquist modes of even shifted transforms to zero. void deNyquist(Complex *f) { size_t nyp=ny/2+1; if(nx % 2 == 0) #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t j=0; j < nyp; ++j) f[j]=0.0; if(ny % 2 == 0) #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t i=0; i < nx; ++i) f[(i+1)*nyp-1]=0.0; } }; // Compute the complex three-dimensional Fourier transform of // nx times ny times nz complex values. Before calling fft(), the arrays in // and out (which may coincide) must be allocated as Complex[nx*ny*nz]. // // Out-of-place usage: // // fft3d Forward(nx,ny,nz,-1,in,out); // Forward.fft(in,out); // // fft3d Backward(nx,ny,nz,1,in,out); // Backward.fft(in,out); // // fft3d Backward(nx,ny,nz,1,in,out); // Backward.fftNormalized(in,out); // True inverse of Forward.fft(out,in); // // In-place usage: // // fft3d Forward(nx,ny,nz,-1); // Forward.fft(in); // // fft3d Backward(nx,ny,nz,1); // Backward.fft(in); // // Note: // in[nz*(ny*i+j)+k] contains the (i,j,k)th Complex value, // indexed by i=0,...,nx-1, j=0,...,ny-1, and k=0,...,nz-1. // class fft3d : public fftw { size_t nx; size_t ny; size_t nz; public: fft3d(size_t nx, size_t ny, size_t nz, int sign, Complex *in=NULL, Complex *out=NULL, size_t threads=maxthreads) : fftw(2*nx*ny*nz,sign,threads), nx(nx), ny(ny), nz(nz) {Setup(in,out);} #ifdef __Array_h__ fft3d(int sign, const Array::array3& in, const Array::array3& out=Array::NULL3, size_t threads=maxthreads) : fftw(2*in.Size(),sign,threads), nx(in.Nx()), ny(in.Ny()), nz(in.Nz()) {Setup(in,out);} #endif fftw_plan Plan(Complex *in, Complex *out) { return fftw_plan_dft_3d(nx,ny,nz,(fftw_complex *) in, (fftw_complex *) out, sign, effort); } }; // Compute the complex two-dimensional Fourier transform of // nx times ny times nz real values, using phase sign -1. // Before calling fft(), the array in must be allocated as double[nx*ny*nz] // and the array out must be allocated as Complex[nx*ny*(nz/2+1)]. The // arrays in and out may coincide, allocated as Complex[nx*ny*(nz/2+1)]. // // Out-of-place usage: // // rcfft3d Forward(nx,ny,nz,in,out); // Forward.fft(in,out); // Origin of Fourier domain at (0,0) // Forward.fft0(in,out); // Origin of Fourier domain at (nx/2,ny/2,0); // input destroyed // In-place usage: // // rcfft3d Forward(nx,ny,nz); // Forward.fft(in); // Origin of Fourier domain at (0,0) // Forward.fft0(in); // Origin of Fourier domain at (nx/2,ny/2,0) // // Notes: // in contains the nx*ny*nz real values stored as a Complex array; // out contains the upper-half portion (kz >= 0) of the Complex transform. // class rcfft3d : public fftw { size_t nx; size_t ny; size_t nz; public: rcfft3d(size_t nx, size_t ny, size_t nz, Complex *out=NULL, size_t threads=maxthreads) : fftw(2*nx*ny*(nz/2+1),-1,threads,nx*ny*nz), nx(nx), ny(ny), nz(nz) { Setup(out); } rcfft3d(size_t nx, size_t ny, size_t nz, double *in, Complex *out=NULL, size_t threads=maxthreads) : fftw(2*nx*ny*(nz/2+1),-1,threads,nx*ny*nz), nx(nx), ny(ny), nz(nz) {Setup(in,out);} fftw_plan Plan(Complex *in, Complex *out) { return fftw_plan_dft_r2c_3d(nx,ny,nz,(double *) in,(fftw_complex *) out, effort); } void Execute(Complex *in, Complex *out, bool shift=false) { if(shift) { if(inplace) Shift(in,nx,ny,nz,threads); else Shift((double *) in,nx,ny,nz,threads); } fftw_execute_dft_r2c(plan,(double *) in,(fftw_complex *) out); } // Set Nyquist modes of even shifted transforms to zero. void deNyquist(Complex *f) { size_t nzp=nz/2+1; size_t yz=ny*nzp; if(nx % 2 == 0) { #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t k=0; k < yz; ++k) f[k]=0.0; } if(ny % 2 == 0) { #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t i=0; i < nx; ++i) { size_t iyz=i*yz; for(size_t k=0; k < nzp; ++k) f[iyz+k]=0.0; } } if(nz % 2 == 0) #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t i=0; i < nx; ++i) for(size_t j=0; j < ny; ++j) f[i*yz+(j+1)*nzp-1]=0.0; } }; // Compute the real two-dimensional inverse Fourier transform of the // nx*ny*(nz/2+1) Complex values corresponding to the spectral values in the // half-plane kz >= 0, using phase sign +1. // Before calling fft(), the array in must be allocated as // Complex[nx*ny*(nz+1)/2] and the array out must be allocated as // double[nx*ny*nz]. The arrays in and out may coincide, // allocated as Complex[nx*ny*(nz/2+1)]. // // Out-of-place usage (input destroyed): // // crfft3d Backward(nx,ny,nz,in,out); // Backward.fft(in,out); // Origin of Fourier domain at (0,0) // Backward.fft0(in,out); // Origin of Fourier domain at (nx/2,ny/2,0) // // In-place usage: // // crfft3d Backward(nx,ny,nz); // Backward.fft(in); // Origin of Fourier domain at (0,0) // Backward.fft0(in); // Origin of Fourier domain at (nx/2,ny/2,0) // // Notes: // in contains the upper-half portion (kz >= 0) of the Complex transform; // out contains the nx*ny*nz real values stored as a Complex array. // class crfft3d : public fftw { size_t nx; size_t ny; size_t nz; public: crfft3d(size_t nx, size_t ny, size_t nz, double *out=NULL, size_t threads=maxthreads) : fftw(2*nx*ny*(nz/2+1),1,threads,nx*ny*nz), nx(nx), ny(ny), nz(nz) {Setup(out);} crfft3d(size_t nx, size_t ny, size_t nz, Complex *in, double *out=NULL, size_t threads=maxthreads) : fftw(nx*ny*(realsize(nz,Inplace(in,out))),1,threads,nx*ny*nz), nx(nx), ny(ny), nz(nz) {Setup(in,out);} fftw_plan Plan(Complex *in, Complex *out) { return fftw_plan_dft_c2r_3d(nx,ny,nz,(fftw_complex *) in,(double *) out, effort); } void Execute(Complex *in, Complex *out, bool shift=false) { fftw_execute_dft_c2r(plan,(fftw_complex *) in,(double *) out); if(shift) { if(inplace) Shift(out,nx,ny,nz,threads); else Shift((double *) out,nx,ny,nz,threads); } } // Set Nyquist modes of even shifted transforms to zero. void deNyquist(Complex *f) { size_t nzp=nz/2+1; size_t yz=ny*nzp; if(nx % 2 == 0) { #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t k=0; k < yz; ++k) f[k]=0.0; } if(ny % 2 == 0) { #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t i=0; i < nx; ++i) { size_t iyz=i*yz; for(size_t k=0; k < nzp; ++k) f[iyz+k]=0.0; } } if(nz % 2 == 0) #ifndef FFTWPP_SINGLE_THREAD #pragma omp parallel for num_threads(threads) #endif for(size_t i=0; i < nx; ++i) for(size_t j=0; j < ny; ++j) f[i*yz+(j+1)*nzp-1]=0.0; } }; } #endif asymptote-3.05/autogen.sh0000755000000000000000000000047415031566105014174 0ustar rootroot#!/bin/sh command -v libtoolize >/dev/null 2>&1 if [ $? -ne 0 ]; then command -v libtool >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "autogen.sh: error: could not find libtool. libtool is required to run autogen.sh." 1>&2 exit 1 fi fi autoheader && autoconf cd gc ./autogen.sh cd .. asymptote-3.05/common.h0000644000000000000000000000457215031566105013637 0ustar rootroot/**** * common.h * * Definitions common to all files. *****/ #ifndef COMMON_H #define COMMON_H #undef NDEBUG #if defined(_WIN32) #include #endif #include #include #include #include #if defined(_MSC_VER) // for and/or/not operators. not supported natively on MSVC #include #include typedef SSIZE_T ssize_t; #define STDOUT_FILENO 1 #define STDIN_FILENO 0 #define STDERR_FILENO 2 #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef DEBUG_CSTACKTRACE // To output a stacktrace when you are compiling with // CFLAGS="-g -O0 -DDEBUG_CSTACKTRACE", insert code like the following: // cerr << boost::stacktrace::stacktrace(); // at the appropriate place. // NOTE: This gives useful information on MacOS, but seems to give only // hex addresses (rather than function names) on Linux. Possible remedies // may be found at https://stackoverflow.com/q/52583544/2318074 and linked // pages. # ifndef _GNU_SOURCE # define _GNU_SOURCE # endif # include #endif #include using nonstd::optional; using nonstd::nullopt; using nonstd::make_optional; using std::make_pair; #if !defined(FOR_SHARED) && \ ((defined(HAVE_LIBGL) && defined(HAVE_LIBGLUT) && defined(HAVE_LIBGLM)) || \ defined(HAVE_LIBOSMESA)) #define HAVE_GL #endif #if defined(HAVE_LIBREADLINE) || defined(HAVE_LIBEDIT) #define HAVE_READLINE #endif #ifdef HAVE_PTHREAD #include #endif #include "memory.h" #define Int_MAX2 INT64_MAX #define Int_MIN INT64_MIN typedef int64_t Int; typedef uint64_t unsignedInt; #ifndef COMPACT #define COMPACT 1 #endif #if COMPACT // Reserve highest two values for DefaultValue and Undefined states. #define Int_MAX (Int_MAX2-2) #else #define Int_MAX Int_MAX2 #endif using std::cout; using std::cin; using std::cerr; using std::endl; using std::istream; using std::ostream; using mem::string; using mem::stringstream; using mem::istringstream; using mem::ostringstream; using mem::stringbuf; using std::shared_ptr; using std::unique_ptr; using std::make_shared; static const struct ws_t {} ws={}; // Portable way of skipping whitespace inline std::istream &operator >> (std::istream & s, const ws_t &ws) { if(!s.eof()) s >> std::ws; return s; } #if defined(_WIN32) #include "win32helpers.h" #define unlink _unlink #endif #endif asymptote-3.05/asyprocess.cc0000644000000000000000000005650315031566105014701 0ustar rootroot/***** * process.cc * Andy Hammerlindl 2006/08/19 * * Handles processing blocks of code (including files, strings, and the * interactive prompt, for listing and parse-only modes as well as actually * running it. *****/ #include "types.h" #include "errormsg.h" #include "genv.h" #include "coenv.h" #include "stm.h" #include "settings.h" #include "vm.h" #include "program.h" #include "interact.h" #include "envcompleter.h" #include "fileio.h" #include "stack.h" #include "runtime.h" #include "texfile.h" #include "asyprocess.h" namespace camp { pen& defaultpen() { return processData().defaultpen; } } unsigned int count=0; namespace run { void cleanup(); void exitFunction(vm::stack *Stack); void updateFunction(vm::stack *Stack); void purge(Int divisor=0); } namespace vm { bool indebugger; } using namespace settings; using absyntax::file; using trans::genv; using trans::coenv; using trans::env; using trans::coder; using types::record; using interact::interactive; using interact::uptodate; using absyntax::runnable; using absyntax::block; mem::stack processDataStack; // Exception-safe way to push and pop the process data. class withProcessData { // Do not let this object be dynamically allocated. void *operator new(size_t); processDataStruct *pd_ptr; public: withProcessData(processDataStruct *pd_ptr) : pd_ptr(pd_ptr) { processDataStack.push(pd_ptr); } ~withProcessData() { assert(processDataStack.top() == pd_ptr); processDataStack.pop(); } }; processDataStruct &processData() { assert(!processDataStack.empty()); return *processDataStack.top(); } // A process environment. Basically this just serves as short-hand to start a // new global environment (genv) and new process data at the same time. When // it goes out of scope, the process data is popped off the stack. This also // ensures that the data is popped even if an exception is thrown. class penv { genv *_ge; processDataStruct _pd; // Do not let this object be dynamically allocated. void *operator new(size_t); public: penv() : _ge(0), _pd() { // Push the processData first, as it needs to be on the stack before genv // is initialized. _pd.topPos = nullPos; processDataStack.push(&_pd); _ge = new genv; } virtual ~penv() { processDataStack.pop(); delete _ge; } genv &ge() { return *_ge; } processDataStruct *pd() { return &_pd; } }; void init(bool resetpath=true) { vm::indebugger=false; uptodate=false; if(resetpath) setPath(""); /* On second and subsequent calls, sets the path to what it was when the program started. */ } // This helper class does nothing but call the interactiveTrans method of the // base object in place of trans, so that the runnable can exhibit special // behaviour when run at the interactive prompt. class interactiveRunnable : public runnable { runnable *base; public: interactiveRunnable(runnable *base) : runnable(base->getPos()), base(base) {} void prettyprint(ostream &out, Int indent) { absyntax::prettyname(out, "interactiveRunnable", indent, base->getPos()); base->prettyprint(out, indent+1); } void trans(coenv &e) { base->interactiveTrans(e); } void transAsField(coenv &e, types::record *r) { // There is no interactiveTransAsField, as fields aren't declared at the top // level of the interactive prompt. base->transAsField(e, r); } }; // How to run a runnable in runnable-at-a-time mode. bool runRunnable(runnable *r, coenv &e, istack &s, transMode tm=TRANS_NORMAL) { e.e.beginScope(); lambda *codelet= tm==TRANS_INTERACTIVE ? interactiveRunnable(r).transAsCodelet(e) : r->transAsCodelet(e); em.sync(); if(!em.errors()) { if(getSetting("translate")) print(cout,codelet->code); s.run(codelet); // Commits the changes made to the environment. e.e.collapseScope(); } else { e.e.endScope(); // Remove any changes to the environment. // Should an interactive error hurt the status? em.statusError(); return false; } return true; } void runAutoplain(coenv &e, istack &s) { absyntax::runnable *r=absyntax::autoplainRunnable(); runRunnable(r,e,s); } // icore // preRun and postRun are the optional activities that take place before and // after running the code specified. They can be overridden by a derived // class that wishes different behaviour. void icore::preRun(coenv &e, istack &s) { if(getSetting("autoplain")) runAutoplain(e,s); } void icore::postRun(coenv &, istack &s) { run::exitFunction(&s); } void icore::doRun(bool purge, transMode tm) { em.sync(); if(em.errors()) return; try { if(purge) run::purge(); penv pe; env base_env(pe.ge()); coder base_coder(nullPos, "icore::doRun"); coenv e(base_coder,base_env); vm::interactiveStack s; s.setInitMap(pe.ge().getInitMap()); s.setEnvironment(&e); preRun(e,s); if(purge) run::purge(); // Now that everything is set up, run the core. run(e,s,tm); postRun(e,s); } catch(std::bad_alloc&) { outOfMemory(); } catch(quit const&) { // Exception to quit running the current code. Nothing more to do. } catch(handled_error const&) { em.statusError(); } run::cleanup(); em.clear(); } void icore::process(bool purge) { if (!interactive && getSetting("parseonly")) doParse(); else if (getSetting("listvariables")) doList(); else doRun(purge); } itree::itree(string name) : name(name), cachedTree(0) { } block *itree::getTree() { if (cachedTree==0) { try { cachedTree=buildTree(); } catch(handled_error const&) { em.statusError(); return 0; } } return cachedTree; } string itree::getName() { return name; } void itree::doParse() { block *tree=getTree(); em.sync(); if(tree && !em.errors()) tree->prettyprint(cout, 0); } void itree::doList() { block *tree=getTree(); if (tree) { penv pe; record *r=tree->transAsFile(pe.ge(), symbol::trans(getName())); if(r) r->e.list(r); } } void itree::run(coenv &e, istack &s, transMode tm) { block *tree=getTree(); if (tree) { for(mem::list::iterator r=tree->stms.begin(); r != tree->stms.end(); ++r) { processData().fileName=(*r)->getPos().filename(); if(!em.errors() || debug) runRunnable(*r,e,s,tm); } } } void itree::doExec(transMode tm) { // Don't prepare an environment to run the code if there isn't any code. if (getTree()) icore::doRun(false,tm); } void printGreeting(bool interactive) { if(!getSetting("quiet")) { cout << "Welcome to " << PACKAGE_NAME << " version " << REVISION; if(interactive) cout << " (to view the manual, type help)"; cout << endl; } } ifile::ifile(const string& filename) : itree(filename), filename(filename), outname(stripDir(stripExt(string(filename == "-" ? settings::outname() : filename), suffix))) {} block *ifile::buildTree() { return !filename.empty() ? parser::parseFile(filename,"Loading") : 0; } void ifile::preRun(coenv& e, istack& s) { outname_save=getSetting("outname"); if(stripDir(outname_save).empty()) Setting("outname")=outname_save+outname; itree::preRun(e, s); } void ifile::postRun(coenv &e, istack& s) { itree::postRun(e, s); Setting("outname")=outname_save; } void ifile::process(bool purge) { if(verbose > 1) printGreeting(false); try { init(); } catch(handled_error const&) { } if (verbose >= 1) cout << "Processing " << outname << endl; try { icore::process(purge); } catch(handled_error const&) { em.statusError(); } } // Add a semi-colon terminator, if one is not there. string terminateLine(const string line) { return (!line.empty() && *(line.rbegin())!=';') ? (line+";") : line; } // cleanLine changes a C++ style comment (//) into a C-style comment (/* */) so // that comments don't absorb subsequent lines of code when multiline input is // collapsed to a single line in the history. // // ex. if (x==1) // test x // x=2; // becomes // if (x==1) /* test x */ x=2 (all on one line) // // cleanLine is a mess because we have to check that the // is not in a string // or c-style comment, which entails re-inventing much of the lexer. The // routine handles most cases, but multiline strings lose their newlines when // recorded in the history. typedef string::size_type size_type; const size_type npos=string::npos; inline size_type min(size_type a, size_type b) { return a < b ? a : b; } // If start is an offset somewhere within a string, this returns the first // offset outside of the string. sym is the character used to start the string, // ' or ". size_type endOfString(const char sym, const string line, size_type start) { size_type endString=line.find(sym, start); if (endString == npos) return npos; size_type escapeInString=min(line.find(string("\\")+sym, start), line.find("\\\\", start)); if (endString < escapeInString) return endString+1; else return endOfString(sym, line, escapeInString+2); } // If start is an offset somewhere within a C-style comment, this returns the // first offset outside of the comment. size_type endOfComment(const string line, size_type start) { size_type endComment=line.find("*/", start); if (endComment == npos) return npos; else return endComment+2; } // Find the start of a string literal in the line. size_type stringPos(const string line, size_type start) { if (start == npos) return npos; size_type pos=line.find_first_of("\'\"", start); if (pos == npos) return npos; // Skip over comments /* */ and ignore anything after // size_type startComment=line.find("/*", start); size_type startLineComment=line.find("//", start); if (min(startComment,startLineComment) < pos) return stringPos(line, startComment < startLineComment ? endOfComment(line, startComment+2) : npos); else // Nothing to skip over - the symbol actually starts a string. return pos; } // A multiline string should retain its newlines when collapsed to a single // line. This converts // 'hello // there' // to // 'hello\nthere' // and // "hello // there" // to // "hello" '\n' "there" // If the line doesn't end mid-string, this adds a space to the end to preserve // whitespace, since it is the last function to touch the line. string endString(const string line, size_type start) { assert(start!=npos); size_type pos=stringPos(line, start); if (pos==npos) // String ends in normal code. return line+" "; else { char sym=line[pos]; size_type eos=endOfString(sym, line, pos+1); if (eos==npos) { // Line ends while in a string, attach a newline symbol. switch (line[pos]) { case '\'': return line+"\\n"; case '\"': return line+"\" \'\\n\' \""; default: assert(False); return line; } } else { return endString(line, eos+1); } } } // Find the first // that isn't in a C-style comment or a string. size_type slashPos(const string line, size_type start) { if (start == npos) return npos; size_type pos=line.find("//", start); if (pos == npos) return npos; // Skip over comments /* */ and strings both " " and ' ' size_type startComment=line.find("/*", start); size_type startString=line.find_first_of("\'\"", start); if (min(startComment,startString) < pos) return slashPos(line, startComment < startString ? endOfComment(line, startComment+2) : endOfString(line[startString], line, startString+1)); else // Nothing to skip over - the // actually starts a comment. return pos; } string endCommentOrString(const string line) { size_type pos=slashPos(line, 0); if (pos == npos) return endString(line, 0); else { string sub=line; // Replace the first // by /* sub[pos+1]='*'; // Replace any */ in the comment by *! while ((pos = line.find("*/", pos+2)) != npos) sub[pos+1]='!'; // Tack on a */ at the end. sub.append(" */ "); return sub; } } bool isSlashed(const string line) { // NOTE: This doesn't fully handle escaped slashed in a string literal. unsigned n=line.size(); return n > 0 ? line[line.size()-1] == '\\' : false; } string deslash(const string line) { return isSlashed(line) ? line.substr(0,line.size()-1) : line; } // This transforms a line in to the history, so that when more code is added // after it, the code behaves the same as if there was a newline between the // two lines. This involves changing // style comments to /* */ style comments, // and adding explicit newlines to multiline strings. string cleanLine(const string line) { // First remove a trailing slash, if there is one. return endCommentOrString(deslash(line)); } class iprompt : public icore { // Flag that is set to false to signal the prompt to exit. bool running; // Flag that is set to restart the main loop once it has exited. bool restart; // Code ran at start-up. string startline; void postRun(coenv &, istack &) { } // Commands are chopped into the starting word and the rest of the line. struct commandLine { string line; string word; string rest; commandLine(string line) : line(line) { string::iterator c=line.begin(); // Skip leading whitespace while (c != line.end() && isspace(*c)) ++c; // Only handle identifiers starting with a letter. if (c != line.end() && isalpha(*c)) { // Store the command name. while (c != line.end() && (isalnum(*c) || *c=='_')) { word.push_back(*c); ++c; } } // Copy the rest to rest. while (c != line.end()) { rest.push_back(*c); ++c; } #if 0 cerr << "line: " << line << endl; cerr << "word: " << word << endl; cerr << "rest: " << rest << endl; cerr << "simple: " << simple() << endl; #endif } // Simple commands have at most spaces or semicolons after the command word. bool simple() { for (string::iterator c=rest.begin(); c != rest.end(); ++c) if (!isspace(*c) && *c != ';') return false; return true; } }; // The interactive prompt has special functions that cannot be implemented as // normal functions. These special funtions take a commandLine as an argument // and return true if they can handle the command. If false is returned, the // line is treated as a normal line of code. // commands is a map of command names to methods which implement the commands. typedef bool (iprompt::*command)(coenv &, istack &, commandLine); typedef mem::map commandMap; commandMap commands; bool exit(coenv &, istack &, commandLine cl) { if (cl.simple()) { // Don't store exit commands in the history file. interact::deleteLastLine(); running=false; return true; } else return false; } bool q(coenv &e, istack &s, commandLine cl) { if(e.e.ve.getType(symbol::trans("q"))) return false; return exit(e,s,cl); } bool reset(coenv &, istack &, commandLine cl) { if (cl.simple()) { running=false; restart=true; startline=""; run::purge(); return true; } else return false; } bool help(coenv &, istack &, commandLine cl) { if (cl.simple()) { popupHelp(); return true; } else return false; } bool erase(coenv &e, istack &s, commandLine cl) { if (cl.simple()) { runLine(e,s,"erase();"); return true; } else return false; } bool input(coenv &, istack &, commandLine cl) { running=false; restart=true; startline="include "+cl.rest; return true; } void initCommands() { #define ADDCOMMAND(name, func) \ commands[#name]=&iprompt::func // keywords.py looks for ADDCOMMAND to identify special commands in the // auto-completion. ADDCOMMAND(quit,exit); ADDCOMMAND(q,q); ADDCOMMAND(exit,exit); ADDCOMMAND(reset,reset); ADDCOMMAND(erase,erase); ADDCOMMAND(help,help); ADDCOMMAND(input,input); #undef ADDCOMMAND } bool handleCommand(coenv &e, istack &s, string line) { commandLine cl(line); if (cl.word != "") { commandMap::iterator p=commands.find(cl.word); if (p != commands.end()) { // Execute the command. command &com=p->second; return (this->*com)(e,s,cl); } else return false; } else return false; } void addToHistory(string line) { interact::addToHistory(line); } void addToLastLine(string line) { // Here we clean a line at the last possible point, when we know that more // code is going to be appended to it. string last=interact::getLastHistoryLine(); interact::setLastHistoryLine(cleanLine(last)+line); } void terminateLastHistoryLine() { string last=interact::getLastHistoryLine(); interact::setLastHistoryLine(terminateLine(last)); } // Get input from the interactive prompt. Such input may be over several // user-typed lines if he/she ends a line a with backslash to continue input // on the next line. If continuation is true, the input started on a previous // line and is being continued (either because of a backslash or the parser // detecting it in multiline mode). string getline(bool continuation) { string prompt; if(!settings::xasy) prompt=getSetting(continuation ? "prompt2" : "prompt"); string line=interact::simpleline(prompt); if (continuation) addToLastLine(line); else addToHistory(line); // If the line ends in a slash, get more input. return isSlashed(line) ? line+"\n"+getline(true) : line; } // Continue taking input for a line until it properly parses, or a syntax // error occurs. Returns the parsed code on success, and throws a // handled_error exception on failure. block *parseExtendableLine(string line) { block *code=parser::parseString(line, "-", true); if (code) { return code; } else { string nextline=getline(true); return parseExtendableLine(line+"\n"+nextline); } } // Continue taking input until a termination command is received from xasy. block *parseXasyLine(string line) { const string EOT="\x04\n"; string s; while((s=getline(true)) != EOT) line += s; return parser::parseString(line, "-", true); } void runLine(coenv &e, istack &s, string line) { try { if(getSetting("multiline")) { block *code=parseExtendableLine(line); icode i(code); i.run(e,s,TRANS_INTERACTIVE); } else if(settings::xasy) { block *code=parseXasyLine(line); icode i(code); i.run(e,s,TRANS_INTERACTIVE); } else { // Add a semi-colon to the end of the line if one is not there. Do this // to the history as well, so the transcript can be run as regular asy // code. This also makes the history work correctly if the multiline // setting is changed within an interactive session. // It is added to the history at the last possible moment to avoid // tampering with other features, such as using a slash to extend a // line. terminateLastHistoryLine(); istring i(terminateLine(line), "-"); i.run(e,s,TRANS_INTERACTIVE); } run::updateFunction(&s); uptodate=false; } catch(handled_error const&) { vm::indebugger=false; } catch(interrupted&) { // Turn off the interrupted flag. em.Interrupt(false); uptodate=true; cout << endl; } catch(quit&) { } // Ignore errors from this line when trying to run subsequent lines. em.clear(); } void runStartCode(coenv &e, istack &s) { if (!startline.empty()) runLine(e, s, startline); } public: iprompt() : running(false), restart(false), startline("") { initCommands(); } void doParse() {} void doList() {} void run(coenv &e, istack &s, transMode=TRANS_NORMAL) { running=true; interact::setCompleter(new trans::envCompleter(e.e)); runStartCode(e, s); while (running) { // Read a line from the prompt. string line=getline(false); // Check if it is a special command. if (handleCommand(e,s,line)) continue; else runLine(e, s, line); } } void process(bool purge=false) { printGreeting(true); interact::init_interactive(); try { setPath("",true); } catch(handled_error const&) { } do { try { init(false); restart=false; icore::process(); } catch(interrupted&) { em.Interrupt(false); restart=true; } catch(EofException&) { restart=false; } } while(restart); interact::cleanup_interactive(); } }; void processCode(absyntax::block *code) { icode(code).process(); } void processFile(const string& filename, bool purge) { ifile(filename).process(purge); } void processPrompt() { iprompt().process(); } void runCode(absyntax::block *code) { icode(code).doExec(); } void runString(const string& s, bool interactiveWrite) { istring(s).doExec(interactiveWrite ? TRANS_INTERACTIVE : TRANS_NORMAL); } void runFile(const string& filename) { ifile(filename).doExec(); } void runPrompt() { iprompt().doRun(); } void runCodeEmbedded(absyntax::block *code, trans::coenv &e, istack &s) { icode(code).run(e,s); } void runStringEmbedded(const string& str, trans::coenv &e, istack &s) { istring(str).run(e,s); } void runPromptEmbedded(trans::coenv &e, istack &s) { iprompt().run(e,s); } void doUnrestrictedList() { penv pe; env base_env(pe.ge()); coder base_coder(nullPos, "doUnrestictedList"); coenv e(base_coder,base_env); if (getSetting("autoplain")) absyntax::autoplainRunnable()->trans(e); e.e.list(0); } // Environment class used by external programs linking to the shared library. class fullenv : public gc { penv pe; env base_env; coder base_coder; coenv e; vm::interactiveStack s; public: fullenv() : pe(), base_env(pe.ge()), base_coder(nullPos, "fullenv"), e(base_coder, base_env), s() { s.setInitMap(pe.ge().getInitMap()); s.setEnvironment(&e); // TODO: Add way to not run autoplain. runAutoplain(e, s); } coenv &getCoenv() { return e; } void runRunnable(runnable *r) { assert(!em.errors()); // TODO: Decide how to handle prior errors. try { { withProcessData token(pe.pd()); ::runRunnable(r, e, s, TRANS_INTERACTIVE); } } catch(std::bad_alloc&) { // TODO: give calling application useful message. cerr << "out of memory" << endl; } catch (quit const&) { // I'm not sure whether this counts as successfully running the code or // not. cerr << "quit exception" << endl; } catch (handled_error const&) { // Normally, this is the result of an error that changes the return code // of the free-standing asymptote program. // An error should probably be reported to the application calling the // asymptote library. cerr << "handled error" << endl; } em.clear(); } }; fullenv &getFullEnv() { static fullenv fe; return fe; } coenv &coenvInOngoingProcess() { return getFullEnv().getCoenv(); } void runInOngoingProcess(runnable *r) { getFullEnv().runRunnable(r); } asymptote-3.05/runmath.in0000644000000000000000000002131515031566105014176 0ustar rootroot/***** * runmath.in * * Runtime functions for math operations. * *****/ pair => primPair() realarray* => realArray() pairarray* => pairArray() #include #include #include #include #include #include "mathop.h" #include "path.h" using namespace camp; typedef array realarray; typedef array pairarray; using types::realArray; using types::pairArray; using run::integeroverflow; using vm::vmFrame; const char *invalidargument="invalid argument"; extern uint32_t CLZ(uint32_t a); inline unsigned intbits() { static unsigned count=0; if(count > 0) return count; while((1ULL << count) < Int_MAX) ++count; ++count; return count; } static const unsigned char BitReverseTable8[256]= { #define R2(n) n, n+2*64, n+1*64, n+3*64 #define R4(n) R2(n),R2(n+2*16),R2(n+1*16),R2(n+3*16) #define R6(n) R4(n),R4(n+2*4 ),R4(n+1*4 ),R4(n+3*4 ) R6(0),R6(2),R6(1),R6(3) }; #undef R2 #undef R4 #undef R6 unsigned long long bitreverse8(unsigned long long a) { return (unsigned long long) BitReverseTable8[a]; } unsigned long long bitreverse16(unsigned long long a) { return ((unsigned long long) BitReverseTable8[a & 0xff] << 8) | ((unsigned long long) BitReverseTable8[(a >> 8)]); } unsigned long long bitreverse24(unsigned long long a) { return ((unsigned long long) BitReverseTable8[a & 0xff] << 16) | ((unsigned long long) BitReverseTable8[(a >> 8) & 0xff] << 8) | ((unsigned long long) BitReverseTable8[(a >> 16)]); } unsigned long long bitreverse32(unsigned long long a) { return ((unsigned long long) BitReverseTable8[a & 0xff] << 24) | ((unsigned long long) BitReverseTable8[(a >> 8) & 0xff] << 16) | ((unsigned long long) BitReverseTable8[(a >> 16) & 0xff] << 8) | ((unsigned long long) BitReverseTable8[(a >> 24)]); } unsigned long long bitreverse40(unsigned long long a) { return ((unsigned long long) BitReverseTable8[a & 0xff] << 32) | ((unsigned long long) BitReverseTable8[(a >> 8) & 0xff] << 24) | ((unsigned long long) BitReverseTable8[(a >> 16) & 0xff] << 16) | ((unsigned long long) BitReverseTable8[(a >> 24) & 0xff] << 8) | ((unsigned long long) BitReverseTable8[(a >> 32)]); } unsigned long long bitreverse48(unsigned long long a) { return ((unsigned long long) BitReverseTable8[a & 0xff] << 40) | ((unsigned long long) BitReverseTable8[(a >> 8) & 0xff] << 32) | ((unsigned long long) BitReverseTable8[(a >> 16) & 0xff] << 24) | ((unsigned long long) BitReverseTable8[(a >> 24) & 0xff] << 16) | ((unsigned long long) BitReverseTable8[(a >> 32) & 0xff] << 8) | ((unsigned long long) BitReverseTable8[(a >> 40)]); } unsigned long long bitreverse56(unsigned long long a) { return ((unsigned long long) BitReverseTable8[a & 0xff] << 48) | ((unsigned long long) BitReverseTable8[(a >> 8) & 0xff] << 40) | ((unsigned long long) BitReverseTable8[(a >> 16) & 0xff] << 32) | ((unsigned long long) BitReverseTable8[(a >> 24) & 0xff] << 24) | ((unsigned long long) BitReverseTable8[(a >> 32) & 0xff] << 16) | ((unsigned long long) BitReverseTable8[(a >> 40) & 0xff] << 8) | ((unsigned long long) BitReverseTable8[(a >> 48)]); } unsigned long long bitreverse64(unsigned long long a) { return ((unsigned long long) BitReverseTable8[a & 0xff] << 56) | ((unsigned long long) BitReverseTable8[(a >> 8) & 0xff] << 48) | ((unsigned long long) BitReverseTable8[(a >> 16) & 0xff] << 40) | ((unsigned long long) BitReverseTable8[(a >> 24) & 0xff] << 32) | ((unsigned long long) BitReverseTable8[(a >> 32) & 0xff] << 24) | ((unsigned long long) BitReverseTable8[(a >> 40) & 0xff] << 16) | ((unsigned long long) BitReverseTable8[(a >> 48) & 0xff] << 8) | ((unsigned long long) BitReverseTable8[(a >> 56)]); } #ifndef HAVE_POPCOUNT // https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel #define T unsignedInt Int popcount(T a) { a=a-((a >> 1) & (T)~(T)0/3); a=(a & (T)~(T)0/15*3)+((a >> 2) & (T)~(T)0/15*3); a=(a+(a >> 4)) & (T)~(T)0/255*15; return (T)(a*((T)~(T)0/255)) >> (sizeof(T)-1)*CHAR_BIT; } #undef T #endif // Return the factorial of a non-negative integer using a lookup table. Int factorial(Int n) { static Int *table; static Int size=0; if(size == 0) { Int f=1; size=2; while(f <= Int_MAX/size) f *= (size++); table=new Int[size]; table[0]=f=1; for(Int i=1; i < size; ++i) { f *= i; table[i]=f; } } if(n >= size) integeroverflow(0); return table[n]; } static inline Int Round(double x) { return Int(x+((x >= 0) ? 0.5 : -0.5)); } inline Int sgn(double x) { return (x > 0.0 ? 1 : (x < 0.0 ? -1 : 0)); } namespace { Int makeRandomSeed() { std::random_device rd; std::uniform_int_distribution dist; return dist(rd); } std::mt19937_64 randEngine(makeRandomSeed()); } // Autogenerated routines: real ^(real x, Int y) { return pow(x,y); } pair ^(pair z, Int y) { return pow(z,y); } Int quotient(Int x, Int y) { return quotient()(x,y); } Int abs(Int x) { return Abs(x); } Int sgn(real x) { return sgn(x); } Int rand(Int a=0, Int b=Int_MAX) { std::uniform_int_distribution dist((unsigned long long) a, (unsigned long long) b); return dist(randEngine); } void srand(Int seed) { if(seed < 0) seed=makeRandomSeed(); randEngine=std::mt19937_64(seed); } // a random number uniformly distributed in the interval [0,1) real unitrand() { std::uniform_real_distribution dist(0.0, 1.0); return dist(randEngine); } Int ceil(real x) { return Intcast(ceil(x)); } Int floor(real x) { return Intcast(floor(x)); } Int round(real x) { if(validInt(x)) return Round(x); integeroverflow(0); } Int Ceil(real x) { return Ceil(x); } Int Floor(real x) { return Floor(x); } Int Round(real x) { return Round(Intcap(x)); } real fmod(real x, real y) { if (y == 0.0) dividebyzero(); return fmod(x,y); } real atan2(real y, real x) { return atan2(y,x); } real hypot(real x, real y) { return hypot(x,y); } real remainder(real x, real y) { return remainder(x,y); } real Jn(Int n, real x) { return jn(n,x); } real Yn(Int n, real x) { return yn(n,x); } real erf(real x) { return erf(x); } real erfc(real x) { return erfc(x); } Int factorial(Int n) { if(n < 0) error(invalidargument); return factorial(n); } Int choose(Int n, Int k) { if(n < 0 || k < 0 || k > n) error(invalidargument); Int f=1; Int r=n-k; for(Int i=n; i > r; --i) { if(f > Int_MAX/i) integeroverflow(0); f=(f*i)/(n-i+1); } return f; } real gamma(real x) { return std::tgamma(x); } realarray *quadraticroots(real a, real b, real c) { quadraticroots q(a,b,c); array *roots=new array(q.roots); if(q.roots >= 1) (*roots)[0]=q.t1; if(q.roots == 2) (*roots)[1]=q.t2; return roots; } pairarray *quadraticroots(explicit pair a, explicit pair b, explicit pair c) { Quadraticroots q(a,b,c); array *roots=new array(q.roots); if(q.roots >= 1) (*roots)[0]=q.z1; if(q.roots == 2) (*roots)[1]=q.z2; return roots; } realarray *cubicroots(real a, real b, real c, real d) { cubicroots q(a,b,c,d); array *roots=new array(q.roots); if(q.roots >= 1) (*roots)[0]=q.t1; if(q.roots >= 2) (*roots)[1]=q.t2; if(q.roots == 3) (*roots)[2]=q.t3; return roots; } // Logical operations bool !(bool b) { return !b; } bool :boolMemEq(vmFrame *a, vmFrame *b) { return a == b; } bool :boolMemNeq(vmFrame *a, vmFrame *b) { return a != b; } bool :boolFuncEq(callable *a, callable *b) { return a->compare(b); } bool :boolFuncNeq(callable *a, callable *b) { return !(a->compare(b)); } // Bit operations Int AND(Int a, Int b) { return a & b; } Int OR(Int a, Int b) { return a | b; } Int XOR(Int a, Int b) { return a ^ b; } Int NOT(Int a) { return ~a; } Int CLZ(Int a) { if((unsigned long long) a > 0xFFFFFFFF) return CLZ((uint32_t) ((unsigned long long) a >> 32)); else { int bits=intbits(); if(a != 0) return bits-32+CLZ((uint32_t) a); return bits; } } Int popcount(Int a) { return popcount(a); } Int CTZ(Int a) { return popcount((a&-a)-1); } // bitreverse a within a word of length bits. Int bitreverse(Int a, Int bits) { typedef unsigned long long Bitreverse(unsigned long long a); static Bitreverse *B[]={bitreverse8,bitreverse16,bitreverse24,bitreverse32, bitreverse40,bitreverse48,bitreverse56,bitreverse64}; int maxbits=intbits()-1; // Drop sign bit #if Int_MAX2 >= 0x7fffffffffffffffLL --maxbits; // Drop extra bit for reserved values #endif if(bits <= 0 || bits > maxbits || a < 0 || (unsigned long long) a >= (1ULL << bits)) return -1; unsigned int bytes=(bits+7)/8; return B[bytes-1]((unsigned long long) a) >> (8*bytes-bits); } asymptote-3.05/jsfile.cc0000644000000000000000000002722615031566105013762 0ustar rootroot#include "jsfile.h" #include "settings.h" #include "glrender.h" #include "drawelement.h" using namespace settings; namespace camp { const string s="document.asy."; #ifndef HAVE_LIBGLM size_t materialIndex=0; #endif jsfile::jsfile() : finished(false), fileName("") { } jsfile::jsfile(string name) : finished(false), fileName(name) { open(name); } jsfile::~jsfile() { if (!finished) { finish(fileName); } } void jsfile::close() { if (!finished) { finish(fileName); } } void jsfile::copy(string name, bool header) { std::ifstream fin(locateFile(name).c_str()); string s; if(header) getline(fin,s); while(getline(fin,s)) out << s << newl; } void jsfile::header(string name) { out.open(name); out << "" << newl << newl; } void jsfile::meta(string name, bool svg) { out << "" << newl << newl << "" << newl << "" << stripExt(name) << "" << newl << newl << "" << newl; if(svg) out << ""; else out << ""; out << newl << "" << newl; if(svg) out << "" << newl; out << newl; } void jsfile::footer(string name) { out << newl << "" << newl << newl << "" << newl; out.flush(); if(verbose > 0) cout << "Wrote " << name << endl; } void jsfile::svgtohtml(string prefix) { string name=buildname(prefix,"html"); header(name); meta(name); out << "" << newl << newl; copy(locateFile(auxname(prefix,"svg")),true); footer(name); finished=true; } void jsfile::comment(string name) { #ifdef HAVE_LIBGLM out << "" << newl << newl; #endif } void jsfile::open(string name) { header(name); comment(name); meta(name,false); #ifdef HAVE_LIBGLM out.precision(getSetting("digits")); bool ibl=getSetting("ibl"); bool webgl2=ibl || getSetting("webgl2"); if(ibl) out << "" << newl; if(getSetting("offline")) { out << "" << newl; } else out << "("asygl") << "\">" << newl << "" << newl; out << newl << "" << newl << "" << newl << newl << "" << newl << "" << newl << ""; footer(name); #endif } void jsfile::addColor(const prc::RGBAColour& c) { out << "[" << c.R << "," << c.G << "," << c.B << "," << c.A << "]"; } void jsfile::addIndices(const uint32_t *I) { out << "[" << I[0] << "," << I[1] << "," << I[2] << "]"; } void jsfile::addRawPatch(triple const* controls, size_t n, const prc::RGBAColour *c, size_t nc) { if(n) { addKey(); out << "patch([" << newl; size_t last=n-1; for(size_t i=0; i < last; ++i) out << controls[i] << "," << newl; out << controls[last] << newl << "]," << drawElement::centerIndex << "," << materialIndex; if(c) { out << ",[" << newl; for(size_t i=0; i < nc; ++i) { addColor(c[i]); out << "," << newl; } out << "]"; } out << ");" << newl << newl; } } void jsfile::addCurve(const triple& z0, const triple& c0, const triple& c1, const triple& z1) { addKey(); out << "curve([" << newl; out << z0 << "," << newl << c0 << "," << newl << c1 << "," << newl << z1 << newl << "]," << drawElement::centerIndex << "," << materialIndex << ");" << newl << newl; } void jsfile::addCurve(const triple& z0, const triple& z1) { addKey(); out << "curve([" << newl; out << z0 << "," << newl << z1 << newl << "]," << drawElement::centerIndex << "," << materialIndex << ");" << newl << newl; } void jsfile::addPixel(const triple& z0, double width) { addKey(); out << "pixel(" << newl; out << z0 << "," << width << "," << newl << materialIndex << ");" << newl << newl; } #ifdef HAVE_LIBGLM void jsfile::addMaterial(Material const& material) { out << "material(" << newl << material << ");" << newl << newl; } #endif void jsfile::addTriangles(size_t nP, const triple* P, size_t nN, const triple* N, size_t nC, const prc::RGBAColour* C, size_t nI, const uint32_t (*PI)[3], const uint32_t (*NI)[3], const uint32_t (*CI)[3]) { addKey(); if(nP) { out << "Positions=["; size_t last=nP-1; for(size_t i=0; i < last; ++i) out << newl << P[i] << ","; out << newl << P[last] << newl << "];" << newl; } if(nN) { size_t last=nN-1; out << "Normals=["; for(size_t i=0; i < last; ++i) out << newl << N[i] << ","; out << newl << N[last] << newl << "];" << newl; } if(nC) { size_t last=nC-1; out << "Colors=["; for(size_t i=0; i < last; ++i) { out << newl; addColor(C[i]); out << ","; } out << newl; addColor(C[last]); out << newl << "];" << newl; } if(nI) { out << "Indices=["; size_t last=nI-1; for(size_t i=0; i < nI; ++i) { const uint32_t *PIi=PI[i]; const uint32_t *NIi=NI[i]; bool keepNI=distinct(NIi,PIi); bool keepCI=nC && distinct(CI[i],PIi); out << newl << "["; addIndices(PIi); if(keepNI || keepCI) { out << ","; if(keepNI) addIndices(NIi); } if(keepCI) { out << ","; addIndices(CI[i]); } out << "]"; if(i < last) out << ","; } out << newl << "];" << newl; } out << "triangles(" << drawElement::centerIndex << "," << materialIndex << ");" << newl << newl; } void jsfile::addSphere(const triple& center, double radius) { addKey(); out << "sphere(" << center << "," << radius << "," << drawElement::centerIndex << "," << materialIndex << ");" << newl << newl; } void jsfile::addHemisphere(const triple& center, double radius, const double& polar, const double& azimuth) { addKey(); out << "sphere(" << center << "," << radius << "," << drawElement::centerIndex << "," << materialIndex << "," << newl << "[" << polar << "," << azimuth << "]"; out << ");" << newl << newl; } // core signifies whether to also draw a central line for better small-scale // rendering. void jsfile::addCylinder(const triple& center, double radius, double height, const double& polar, const double& azimuth, bool core) { addKey(); out << "cylinder(" << center << "," << radius << "," << height << "," << drawElement::centerIndex << "," << materialIndex << "," << newl << "[" << polar << "," << azimuth << "]," << core << ");" << newl << newl; } void jsfile::addDisk(const triple& center, double radius, const double& polar, const double& azimuth) { addKey(); out << "disk(" << center << "," << radius << "," << drawElement::centerIndex << "," << materialIndex << "," << newl << "[" << polar << "," << azimuth << "]" << ");" << newl << newl; } void jsfile::addTube(const triple *g, double width, bool core) { addKey(); out << "tube([" << g[0] << "," << newl << g[1] << "," << newl << g[2] << "," << newl << g[3] << newl << "]," << width << "," << drawElement::centerIndex << "," << materialIndex << "," << core << ");" << newl << newl; } void jsfile::addPatch(triple const* controls, prc::RGBAColour const* c) { addRawPatch(controls,16,c,4); } void jsfile::addStraightPatch(triple const* controls, prc::RGBAColour const* c) { addRawPatch(controls,4,c,4); } void jsfile::addBezierTriangle(triple const* controls, prc::RGBAColour const* c) { addRawPatch(controls,10,c,3); } void jsfile::addStraightBezierTriangle(triple const* controls, prc::RGBAColour const* c) { addRawPatch(controls,3,c,3); } } asymptote-3.05/template_rev.cc.in0000644000000000000000000000022615031566105015571 0ustar rootroot// This file is automatically generated; do not modify manually char const* REVISION="${ASY_VERSION}"; char const* AsyGLVersion="${ASY_GL_VERSION}"; asymptote-3.05/INSTALL-WIN.md0000644000000000000000000002414215031566105014254 0ustar rootroot# Building Asymptote with CMake (On Windows) ## Basic Requirements ### Required Dependencies Ensure the following is installed: - Visual Studio 2022+ or Visual Studio 2022+ build tools. - Both can be found at [here](https://visualstudio.microsoft.com/downloads/). - CMake - (Recommended way) Visual Studio/Visual Studio Build Tools provides bundled CMake as a selectable component - Otherwise, CMake can be found [here](https://cmake.org/) - Python 3+ - Available [here](https://www.python.org/downloads/windows/). - Perl on Windows - (Recommended way) Strawberry Perl is available at [Strawberry Perl](https://strawberryperl.com/). - (Not recommended due to license terms) ActiveState Perl is available [here](https://www.activestate.com/products/perl/). - Ninja - (Recommended) Visual Studio/Visual Studio Build Tools provides bundled Ninja as part of CMake build tools - Otherwise, Ninja can be installed using winget by running `winget install Ninja-build.Ninja`. - If winget is not available, Ninja can be found [here](https://ninja-build.org/). If installing this way, ensure `ninja` is accessible from `PATH`. - (Untested) `ninja.exe` is bundled within a Strawberry Perl installation. ### Optional, but highly recommended dependencies - A GCC-compatible C++ compiler (Optional, but highly recommended. See #installing-gcc-compatible-c++-compiler) - (Recommended way) [here](https://releases.llvm.org/). - (Untested) `g++.exe` is bundled within a Strawberry Perl installation. - (Untested) Visual Studio also provides clang tools as an installable component. If installing this way, ensure that `clang++.exe` is available. - Vcpkg (Optional, but highly recommended. See #notes-on-dependency-management) - Can be found [here](https://vcpkg.io/). ### Dependencies for documentation generation (Required only for building a setup file) Ensure [TeX Live](https://tug.org/texlive/windows.html) is available on the system. [MikTeX](https://miktex.org) is a possible substitute but is unsupported. Building `asymptote.pdf` requires a UNIX system. ### Dependencies for building the setup file The following is required for building the setup file: - NSIS installer. - NSIS installer can be found [here](https://nsis.sourceforge.io/Download). ## For a quick start If you are getting started and want a quick configuration, run `./quick-start-win32.ps1`. This script automatically checks that you have vcpkg, and if not, clones and bootstraps vcpkg on your system. Additionally, this script automatically locates your Visual Studio installation and establishes all required environment variables. ## Notes on Dependency management The recommended way is to use [vcpkg](https://vcpkg.io/). See `INSTALL.md` for more details. On windows, one may run ```powershell git clone https://github.com/microsoft/vcpkg.git ./vcpkg/bootstrap-vcpkg.bat ``` to initialize vcpkg. Make sure the environment `VCPKG_ROOT` points to where your vcpkg repository is at user or machine scope. ### For User scope This can be done either by Start -> "Edit environment variables for your account" and then adding VCPKG_ROOT entry, or by PowerShell, ```powershell [Environment]::SetEnvironmentVariable('VCPKG_ROOT', '', 'User') ``` ### For machine scope Otherwise, you can also set VCPKG_ROOT for everyone on your machine. ## Using CMake ### Installing GCC-compatible C++ compiler We (highly) suggest installing a GCC-compatible C++ compiler for preprocessing. Our recommendation is to use clang/LLVM tools, available [here](https://releases.llvm.org/). Once your compiler is installed, there are a few options. - (Recommended) Ensure `clang++.exe` is available in `PATH` and leave `GCCCOMPAT_CXX_COMPILER_FOR_MSVC` unset. The build script will automatically try to locate `clang++.exe` or `g++.exe` in places within `PATH`. Be warned that the build script may select a different compiler depending on if there are other compilers available in `PATH`. - (Only if you require a specific clang++ compiler) Set `GCCCOMPAT_CXX_COMPILER_FOR_MSVC` environment variable to your GCC-compatible C++ compiler. For example ```powershell $env:GCCCOMPAT_CXX_COMPILER_FOR_MSVC="/bin/clang++.exe ``` - If you want to make the environment variable permanent, run ```powershell [Environment]::SetEnvironmentVariable('GCCCOMPAT_CXX_COMPILER_FOR_MSVC', '/bin/clang++.exe', 'User ``` ### Building steps #### Environment set up Ensure you have `cl.exe` in your path. The easiest way is to use Visual Studio Developer PowerShell, though be careful that by default VS Developer PowerShell selects 32-bit cl.exe. To explicitly select 64-bit Visual Studio Developer PowerShell, one can use Visual Studio locator alongside its developer shell script as ```powershell $vsInfo = Get-CimInstance MSFT_VSInstance -Namespace root/cimv2/vs & "$($vsInfo.InstallLocation)\Common7\Tools\Launch-VsDevShell.ps1" -Arch amd64 -HostArch amd64 -SkipAutomaticLocation ``` This prompt should put you in to 64-bit Visual Studio Developer PowerShell. #### Configuring build files There are multiple CMake presets available for building, depending on what you intend to build - If you are building Asymptote for release with setup files, depending on how you would build `asymptote.pdf`, use either (see #documentation-generation section) - The `msvc/release` preset - The `msvc/msvc/release/with-existing-asymptote-pdf` - If you are building only asymptote executable for release, or do not care about `asymptote.pdf`, use `msvc/release` preset - If you are building Asymptote for development or debug mode, you are required to either create your own debug preset or configure cache variables manually. Ensure that you are in the Visual Studio 64-bit PowerShell (or have every tool available in `PATH`), and run ```powershell cmake --preset ``` #### Building Asymptote There are multiple key targets for building Asymptote. - For the `asy.exe` executable and `base/` files, the target to run is `asy-with-basefiles` - For documentation (depending on your configuration, including or excluding `asymptote.pdf`) - `docgen` - If you are generating an installer file, the target `asy-pre-nsis-targets` builds all required components, excluding the GUI. See #building-gui-files for instructions on how to build GUI files. The Asymptote binary is available at `cmake-build-msvc/release/asy.exe` if using `msvc/release` or `msvc/msvc/release/ci/with-external-asymptote-pdf` targets. Instructions for generating a setup file are in the next section ##### Extra considerations for `asymptote.pdf` On Windows, `asymptote.pdf` is built using MikTeX's `texify` program, hence why TeX Live cannot be used here. Additionally, ensure that a replacement for `texindex` is available in the system. As of the moment, I have only tested using WSL's `texindex`. - If you have a WSL distribution with `texindex` installed, that may be used as a substitute for `texindex` on windows. In this case, ensure the cache variable `WIN32_TEXINDEX` is set to `WSL`. This is the default option. - If you have a replacement `texindex` program, ensure `WIN32_TEXINDEX` points to that file. ## Building GUI files ### Dependencies for GUI files All required dependencies for building GUI are present in `GUI/requirements.txt` and `GUI/requirements.dev.txt`. We recommend using a virtual environment, for example ```powershell python.exe -m virtualenv asyguibuild ./asyguibuild/Scripts/activate.ps1 cd /GUI pip install -r requirements.txt pip install -r requirements.dev.txt ``` However, against our recommendations, the dependencies can be also installed into the system interpreter. ### Building the GUI files The python script `GUI/buildtool.py` is used for building required files. To do this, run ```powershell cd /GUI python.exe buildtool.py build ``` This should build all required GUI files. ## Installation file generation #### Prerequisites for installation file generation Ensure that - Requirements for building asymptote executable - Requirements for building documentation (excluding `asymptote.pdf`) - At least one of the following: - A pre-built `asymptote.pdf` file - Requirements for building `asymptote.pdf` file - PowerShell. This should come pre-installed on windows. - Ensure that the ability to execute unsigned scripts is enabled - Python 3 with relevant dependencies for building GUI files (This will be discussed in a separate section) are present in the system. #### If using a pre-built `asymptote.pdf` Place `asymptote.pdf` in the directory `/asydoc/`. That is, the file `/asydoc/asymptote.pdf` is present. After that, configure cmake with the preset `msvc/release/ci/with-external-asymptote-pdf` - that is, ```powershell cmake --preset msvc/release/ci/with-external-asymptote-pdf ``` #### If generating `asymptote.pdf` as part of build process Use the `msvc/release` build preset for cmake. ### Building Asymptote install files The cmake target `asy-pre-nsis-targets` should build everything on the `C++` side needed for asymptote installation. #### Generating the installer file After building `asy-pre-nsis-targets`, install using CMake. Note that this does not install into the program files directory, but rather, to a "local install root" at `/cmake-install-w32-nsis-release/`. Due to how google test build files are written (as of currently), installing every component may result in an error (in particular, with `gmock.lib`). This can be remedied by installing only the component needed for installer generation: `asy-pre-nsis` To do this, run ```powershell cmake --install cmake-build-msvc/release --component asy-pre-nsis ``` After building all the required dependencies, navigate to the directory `/cmake-install-w32-nsis-release/`. There, a script called `build-asy-installer.ps1` script is present. Run that script. It will prompt for the location of `makensis.exe` from the NSIS. Specify the path to `makensis.exe`. After this, the script should generate the installer file with the name `asymptote--setup.exe`. This is the setup file ready for distribution. asymptote-3.05/stack.cc0000644000000000000000000003541315031566105013610 0ustar rootroot/***** * stack.cc * Andy Hammerlindl 2002/06/27 * * The general stack machine used to run compiled camp code. *****/ #include #include #include "stack.h" #include "program.h" #include "callable.h" #include "errormsg.h" #include "util.h" #include "runtime.h" #include "asyprocess.h" #include "profiler.h" #ifdef DEBUG_STACK #include namespace vm { void draw(ostream& out, vmFrame *v); } #endif namespace run { void breakpoint(vm::stack *Stack, absyntax::runnable *r); } namespace vm { const char *dereferenceNullPointer="dereference of null pointer"; mem::list bplist; namespace { position curPos = nullPos; const program::label nulllabel; } inline stack::vars_t base_frame( size_t size, size_t parentIndex, stack::vars_t closure #ifdef DEBUG_FRAME , string name #endif ) { stack::vars_t vars; #ifdef SIMPLE_FRAME vars = new item[size]; vars[parentIndex] = closure; #else # ifdef DEBUG_FRAME assert(!name.empty()); vars = new vmFrame(name, parentIndex, size); # else vars = new vmFrame(size); # endif (*vars)[parentIndex] = closure; #endif // TODO: Re-factor closure. return vars; } #ifdef DEBUG_FRAME #define BASEFRAME(s,p,c,n) (base_frame((s), (p), (c), (n))) #else #define BASEFRAME(s,p,c,n) (base_frame((s), (p), (c))) #endif // Abstractions needed. //accessor(frame_handle) // operator[] for accessor inline stack::vars_t make_frame(lambda *l, stack::vars_t closure) { return BASEFRAME(l->framesize, l->parentIndex, closure, l->name); } inline stack::vars_t make_pushframe(size_t size, stack::vars_t closure) { assert(size >= 1); return BASEFRAME(size, 0, closure, ""); } stack::vars_t make_dummyframe(string name) { return BASEFRAME(1, 0, 0, ""); } inline stack::vars_t make_globalframe(size_t size) { assert(size > 0); #ifdef SIMPLE_FRAME // The global frame is an indirect frame. It holds one item, which is the // link to another frame. stack::vars_t direct = new item[1]; stack::vars_t indirect = new item[size]; direct[0] = indirect; return direct; #else return BASEFRAME(size, 0, 0, ""); #if 0 #ifdef DEBUG_FRAME stack::vars_t vars = new frame("", 0, size); #else stack::vars_t vars = new frame(size); #endif return vars; #endif #endif } inline void resize_frame(vmFrame *f, size_t oldsize, size_t newsize) { //assert("Need to fix this" == 0); assert(newsize > oldsize); #ifdef SIMPLE_FRAME vmFrame *old_indirect = get(f[0]); vmFrame *new_indirect = new item[newsize]; std::copy(old_indirect, old_indirect+oldsize, new_indirect); f[0] = new_indirect; #else f->extend(newsize); #endif } void run(lambda *l) { func f; f.body = l; stack s; s.run(&f); } // Move arguments from stack to frame. void stack::marshall(size_t args, stack::vars_t vars) { for (size_t i = args; i > 0; --i) { # ifdef SIMPLE_FRAME vars[i-1] = pop(); # else (*vars)[i-1] = pop(); # endif } } #ifdef PROFILE #ifndef DEBUG_FRAME #pragma message("WARNING: profiler needs DEBUG_FRAME for function names") #endif #ifndef DEBUG_BLTIN #pragma message("WARNING: profiler needs DEBUG_BLTIN for builtin function names") #endif profiler prof; void dumpProfile() { std::ofstream out("asyprof"); if (!out.fail()) prof.dump(out); } #endif void assessClosure(lambda *body) { // If we have already determined if it needs closure, just return. if (body->closureReq != lambda::MAYBE_NEEDS_CLOSURE) return; for (program::label l = body->code->begin(); l != body->code->end(); ++l) if (l->op == inst::pushclosure || l->op == inst::pushframe) { body->closureReq = lambda::NEEDS_CLOSURE; return; } body->closureReq = lambda::DOESNT_NEED_CLOSURE; } void stack::run(func *f) { lambda *body = f->body; #ifdef PROFILE prof.beginFunction(body); #endif #ifdef DEBUG_STACK #ifdef DEBUG_FRAME cout << "running lambda " + body->name + ": \n"; #else cout << "running lambda: \n"; #endif print(cout, body->code); cout << endl; #endif runWithOrWithoutClosure(body, 0, f->closure); #ifdef PROFILE prof.endFunction(body); #endif } void stack::breakpoint(absyntax::runnable *r) { lastPos=curPos; indebugger=true; ::run::breakpoint(this,r); string s=vm::pop(this); debugOp=(s.length() > 0) ? s[0] : (char) 0; indebugger=false; } void stack::debug() { if(!curPos) return; if(indebugger) {em.clear(); return;} switch(debugOp) { case 'i': // inst breakpoint(); break; case 's': // step if((!curPos.match(lastPos.filename()) || !curPos.match(lastPos.Line()))) breakpoint(); break; case 'n': // next if(curPos.match(lastPos.filename()) && !curPos.match(lastPos.Line())) breakpoint(); break; case 'f': // file if(!curPos.match(lastPos.filename())) breakpoint(); break; case 'r': // return if(curPos.match(breakPos.filename())) breakpoint(); break; case 'c': // continue default: for(auto p=bplist.begin(); p != bplist.end(); ++p) { if(curPos.match(p->f.name()) && curPos.match(p->f.line()) && (newline || !curPos.match(breakPos.filename()) || !curPos.match(breakPos.Line()))) { breakPos=curPos; breakpoint(p->r); newline=false; break; } if(!newline && (curPos.match(lastPos.filename()) && !curPos.match(lastPos.Line()))) newline=true; } break; } } void stack::runWithOrWithoutClosure(lambda *l, vars_t vars, vars_t parent) { // The size of the frame (when running without closure). size_t frameSize = l->parentIndex; #ifdef SIMPLE_FRAME // Link to the variables, be they in a closure or on the stack. vmFrame *varlink; # define SET_VARLINK assert(vars); varlink = vars; # define VAR(n) ( (varlink)[(n) + frameStart] ) # define FRAMEVAR(frame,n) (frame[(n)]) #else // Link to the variables, be they in a closure or on the stack. mem::vector *varlink=NULL; # define SET_VARLINK assert(vars); varlink = &vars->vars # define VAR(n) ( (*varlink)[(n) + frameStart] ) # define FRAMEVAR(frame,n) ((*frame)[(n)]) #endif size_t frameStart = 0; // Set up the closure, if necessary. if (vars == 0) { #ifndef SIMPLE_FRAME assessClosure(l); if (l->closureReq == lambda::NEEDS_CLOSURE) #endif { /* make new activation record */ vars = vm::make_frame(l, parent); assert(vars); } #ifndef SIMPLE_FRAME else { assert(l->closureReq == lambda::DOESNT_NEED_CLOSURE); // Use the stack to store variables. varlink = &theStack; // Record where the parameters start on the stack. frameStart = theStack.size() - frameSize; // Add the parent's closure to the frame. push(parent); ++frameSize; size_t newFrameSize = (size_t)l->framesize; if (newFrameSize > frameSize) { theStack.resize(frameStart + newFrameSize); frameSize = newFrameSize; } } #endif } if (vars) { marshall(l->parentIndex, vars); SET_VARLINK; } /* start the new function */ program::label ip = l->code->begin(); processDataStruct& P=processData(); position& topPos=P.topPos; string& fileName=P.fileName; unsigned int offset=P.xmapCount; bool traceless=!settings::debug; bool xasy=settings::xasy || offset || settings::keys; if(xasy && curPos.filename() == fileName) topPos=curPos.shift(offset); try { for (;;) { const inst &i = *ip; curPos = i.pos; #ifdef PROFILE prof.recordInstruction(); #endif #ifdef DEBUG_STACK printInst(cout, ip, l->code->begin()); cout << " ("; i.pos.printTerse(cout); cout << ")\n"; #endif if(settings::verbose > 4) em.trace(curPos); if(!bplist.empty()) debug(); if(errorstream::interrupt) throw interrupted(); switch (i.op) { case inst::varpush: push(VAR(get(i))); break; case inst::varsave: VAR(get(i)) = top(); break; #ifdef COMBO case inst::varpop: VAR(get(i)) = pop(); break; #endif case inst::ret: { if (vars == 0) // Delete the frame from the stack. // TODO: Optimize for common cases. theStack.erase(theStack.begin() + frameStart, theStack.begin() + frameStart + frameSize); return; } case inst::pushframe: { assert(vars); Int size = get(i); vars=make_pushframe(size, vars); SET_VARLINK; break; } case inst::popframe: { assert(vars); vars=get(VAR(0)); SET_VARLINK; break; } case inst::pushclosure: assert(vars); push(vars); break; case inst::nop: break; case inst::pop: pop(); break; case inst::intpush: case inst::constpush: push(i.ref); break; case inst::fieldpush: { vars_t frame = pop(); if (!frame) error(dereferenceNullPointer); push(FRAMEVAR(frame, get(i))); break; } case inst::fieldsave: { vars_t frame = pop(); if (!frame) error(dereferenceNullPointer); FRAMEVAR(frame, get(i)) = top(); break; } #if COMBO case inst::fieldpop: { #error NOT REIMPLEMENTED vars_t frame = pop(); if (!frame) error(dereferenceNullPointer); FRAMEVAR(get(i)) = pop(); break; } #endif case inst::builtin: { bltin func = get(i); #ifdef PROFILE prof.beginFunction(func); #endif func(this); #ifdef PROFILE prof.endFunction(func); #endif break; } case inst::jmp: ip = get(i); continue; case inst::cjmp: if (pop()) { ip = get(i); continue; } break; case inst::njmp: if (!pop()) { ip = get(i); continue; } break; case inst::jump_if_not_default: if (!isdefault(pop())) { ip = get(i); continue; } break; #ifdef COMBO case inst::gejmp: { Int y = pop(); Int x = pop(); if (x>=y) { ip = get(i); continue; } break; } #if 0 case inst::jump_if_func_eq: { callable * b=pop(); callable * a=pop(); if (a->compare(b)) { ip = get(i); continue; } break; } case inst::jump_if_func_neq: { callable * b=pop(); callable * a=pop(); if (!a->compare(b)) { ip = get(i); continue; } break; } #endif #endif case inst::push_default: push(Default); break; case inst::popcall: { /* get the function reference off of the stack */ if(xasy && curPos.filename() == fileName) topPos=curPos.shift(offset); callable* f = pop(); if(traceless) f->call(this); else { em.traceback.push_back(curPos); f->call(this); if(em.traceback.size()) em.traceback.pop_back(); } break; } case inst::makefunc: { func *f = new func; f->closure = pop(); f->body = get(i); push((callable*)f); break; } default: error("Internal VM error: Bad stack operand"); } #ifdef DEBUG_STACK draw(cerr); vm::draw(cerr,vars); cerr << "\n"; #endif ++ip; } } catch (bad_item_value&) { error("Trying to use uninitialized value."); } #undef SET_VARLINK #undef VAR #undef FRAMEVAR } void stack::loadModule(string index, Int numPushedParents) { vmFrame *inst=instMap[index]; if (inst) { for (Int i = 0; i < numPushedParents; ++i) { pop(); } push(inst); } else { func f; assert(initMap); f.body=(*initMap)[index]; assert(f.body); run(&f); instMap[index]=get(top()); } } #ifdef DEBUG_STACK const size_t MAX_ITEMS=20; void stack::draw(ostream& out) { // out.setf(out.hex); out << "operands:"; stack_t::const_iterator left = theStack.begin(); if (theStack.size() > MAX_ITEMS) { left = theStack.end()-MAX_ITEMS; out << " ..."; } else out << " "; while (left != theStack.end()) { if (left != theStack.begin()) out << " | " ; out << *left; left++; } out << "\n"; } void draw(ostream& out, vmFrame* v) { out << "vars:" << endl; while (!!v) { item link=(*v)[v->getParentIndex()]; out << " " << v->getName() << ": "; for (size_t i = 0; i < MAX_ITEMS && i < v->size(); i++) { if (i > 0) out << " | "; out << i << ": "; if (i == v->getParentIndex()) { try { vmFrame *parent = get(link); out << (parent ? "link" : "----"); } catch (bad_item_value&) { out << "non-link " << (*v)[0]; } } else { out << (*v)[i]; } } if (v->size() > MAX_ITEMS) out << "..."; out << "\n"; vmFrame *parent; try { parent = get(link); } catch (bad_item_value&) { parent = 0; } v = parent; } } #endif // DEBUG_STACK position getPos() { return curPos; } void errornothrow(const char* message) { em.error(curPos); em << message; em.sync(true); } void error(const char* message) { errornothrow(message); throw handled_error(); } void error(const ostringstream& message) { const string& s=message.str(); error(s.c_str()); } const size_t STARTING_GLOBALS_SIZE = 1; interactiveStack::interactiveStack() : globals(make_globalframe(STARTING_GLOBALS_SIZE)), globals_size(STARTING_GLOBALS_SIZE) {} void interactiveStack::run(lambda *codelet) { if (globals_size < codelet->framesize) { resize_frame(globals, globals_size, codelet->framesize); globals_size = codelet->framesize; } stack::runWithOrWithoutClosure(codelet, globals, 0); } } // namespace vm asymptote-3.05/asyparser.cc0000644000000000000000000001117315031566105014511 0ustar rootroot/***** * parser.cc * Tom Prince 2004/01/10 * *****/ #include #include #include #include #include #include "common.h" #ifdef HAVE_LIBCURL #include #endif #include "exithandlers.h" #ifdef HAVE_SYS_STAT_H #include #endif #include "interact.h" #include "locate.h" #include "errormsg.h" #include "asyparser.h" #include "util.h" // The lexical analysis and parsing functions used by parseFile. void setlexer(size_t (*input) (char* bif, size_t max_size), string filename); extern int yyparse(void); extern int yydebug; extern int yy_flex_debug; extern bool lexerEOF(); extern void reportEOF(); namespace parser { namespace yy { // Lexers std::streambuf *sbuf = NULL; size_t stream_input(char *buf, size_t max_size) { return sbuf ? sbuf->sgetn(buf,max_size) : 0; } } // namespace yy void debug(bool state) { // For debugging the machine-generated lexer and parser. yy_flex_debug = yydebug = state; } namespace { void error(const string& filename) { em.sync(); em << "error: could not load module '" << filename << "'\n"; em.sync(true); throw handled_error(); } } absyntax::file *doParse(size_t (*input) (char* bif, size_t max_size), const string& filename, bool extendable=false) { setlexer(input,filename); absyntax::file *root = yyparse() == 0 ? absyntax::root : 0; absyntax::root = 0; yy::sbuf = 0; if (!root) { if (lexerEOF()) { if (extendable) { return 0; } else { // Have the lexer report the error. reportEOF(); } } em.error(nullPos); if(!interact::interactive) error(filename); else throw handled_error(); } return root; } absyntax::file *parseStdin() { debug(false); yy::sbuf = cin.rdbuf(); return doParse(yy::stream_input,"-"); } bool isURL(const string& filename) { #ifdef HAVE_LIBCURL return filename.find("://") != string::npos; #else return false; #endif } absyntax::file *parseFile(const string& filename, const char *nameOfAction) { #ifdef HAVE_LIBCURL if(isURL(filename)) return parseURL(filename,nameOfAction); #endif if(filename == "-") return parseStdin(); string file = settings::locateFile(filename); if(file.empty()) error(filename); if(nameOfAction && settings::verbose > 1) cerr << nameOfAction << " " << filename << " from " << file << endl; debug(false); std::filebuf filebuf; if(!filebuf.open(file.c_str(),std::ios::in)) error(filename); #ifdef HAVE_SYS_STAT_H // Check that the file is not a directory. static struct stat buf; if(stat(file.c_str(),&buf) == 0) { if(S_ISDIR(buf.st_mode)) error(filename); } #endif // Check that the file can actually be read. try { filebuf.sgetc(); } catch (...) { error(filename); } yy::sbuf = &filebuf; return doParse(yy::stream_input,file); } absyntax::file *parseString(const string& code, const string& filename, bool extendable) { debug(false); stringbuf buf(code); yy::sbuf = &buf; return doParse(yy::stream_input,filename,extendable); } #ifdef HAVE_LIBCURL size_t curlCallback(char *data, size_t size, size_t n, stringstream& buf) { size_t Size=size*n; buf.write(data,Size); return Size; } int curlProgress(void *, curl_off_t, curl_off_t, curl_off_t, curl_off_t) { return errorstream::interrupt ? -1 : 0; } bool readURL(stringstream& buf, const string& filename) { CURL *curl=curl_easy_init(); if(settings::verbose > 3) curl_easy_setopt(curl,CURLOPT_VERBOSE,true); #ifdef __MSDOS__ string cert=settings::getSetting("sysdir")+settings::dirsep+ "ca-bundle.crt"; curl_easy_setopt(curl,CURLOPT_CAINFO,cert.c_str()); #endif curl_easy_setopt(curl,CURLOPT_URL,filename.c_str()); curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,curlCallback); curl_easy_setopt(curl,CURLOPT_WRITEDATA,&buf); curl_easy_setopt(curl,CURLOPT_NOPROGRESS,0); curl_easy_setopt(curl,CURLOPT_XFERINFOFUNCTION,curlProgress); CURLcode res=curl_easy_perform(curl); curl_easy_cleanup(curl); if(res != CURLE_OK) { cerr << curl_easy_strerror(res) << endl; return false; } string s=buf.str(); return !s.empty() && s != "404: Not Found"; } absyntax::file *parseURL(const string& filename, const char *nameOfAction) { stringstream code; if(!readURL(code,filename)) error(filename); if(nameOfAction && settings::verbose > 1) cerr << nameOfAction << " " << filename << endl; debug(false); yy::sbuf=code.rdbuf(); return doParse(yy::stream_input,filename); } #endif } // namespace parser asymptote-3.05/runtriple.cc0000644000000000000000000003344715031566132014534 0ustar rootroot/***** Autogenerated from runtriple.in; changes will be overwritten *****/ #line 1 "./runtimebase.in" /***** * runtimebase.in * Andy Hammerlindl 2009/07/28 * * Common declarations needed for all code-generating .in files. * *****/ #line 1 "./runtriple.in" /***** * runtriple.in * * Runtime functions for triple operations. * *****/ #line 23 "./runtimebase.in" #include "stack.h" #include "types.h" #include "builtin.h" #include "entry.h" #include "errormsg.h" #include "array.h" #include "triple.h" #include "callable.h" #include "opsymbols.h" using vm::stack; using vm::error; using vm::array; using vm::read; using vm::callable; using types::formal; using types::function; using camp::triple; #define PRIMITIVE(name,Name,asyName) using types::prim##Name; #include #undef PRIMITIVE void unused(void *); namespace run { typedef double real; array *copyArray(array *a); array *copyArray2(array *a); array *copyArray3(array *a); double *copyTripleArray2Components(array *a, size_t &N, GCPlacement placement=NoGC); triple *copyTripleArray2C(array *a, size_t &N, GCPlacement placement=NoGC); } function *realRealFunction(); #define CURRENTPEN processData().currentpen #line 10 "runtriple.in" #include "triple.h" #include "path3.h" #include "drawelement.h" using namespace camp; // Autogenerated routines: #ifndef NOSYM #include "runtriple.symbols.h" #endif namespace run { #line 19 "./runtriple.in" void tripleZero(stack *Stack) { #line 20 "./runtriple.in" static triple zero; {Stack->push(zero); return;} } #line 25 "./runtriple.in" void realRealRealToTriple(stack *Stack) { real z=vm::pop(Stack); real y=vm::pop(Stack); real x=vm::pop(Stack); #line 26 "./runtriple.in" {Stack->push(triple(x,y,z)); return;} } #line 30 "./runtriple.in" // real xpart(triple v); void tripleXPart(stack *Stack) { triple v=vm::pop(Stack); #line 31 "./runtriple.in" {Stack->push(v.getx()); return;} } #line 35 "./runtriple.in" // real ypart(triple v); void tripleYPart(stack *Stack) { triple v=vm::pop(Stack); #line 36 "./runtriple.in" {Stack->push(v.gety()); return;} } #line 40 "./runtriple.in" // real zpart(triple v); void tripleZPart(stack *Stack) { triple v=vm::pop(Stack); #line 41 "./runtriple.in" {Stack->push(v.getz()); return;} } #line 45 "./runtriple.in" // triple *(real x, triple v); void gen_runtriple5(stack *Stack) { triple v=vm::pop(Stack); real x=vm::pop(Stack); #line 46 "./runtriple.in" {Stack->push(x*v); return;} } #line 50 "./runtriple.in" // triple *(triple v, real x); void gen_runtriple6(stack *Stack) { real x=vm::pop(Stack); triple v=vm::pop(Stack); #line 51 "./runtriple.in" {Stack->push(v*x); return;} } #line 55 "./runtriple.in" // triple /(triple v, real x); void gen_runtriple7(stack *Stack) { real x=vm::pop(Stack); triple v=vm::pop(Stack); #line 56 "./runtriple.in" {Stack->push(v/x); return;} } #line 60 "./runtriple.in" // real length(triple v); void gen_runtriple8(stack *Stack) { triple v=vm::pop(Stack); #line 61 "./runtriple.in" {Stack->push(v.length()); return;} } #line 65 "./runtriple.in" // real abs(triple v); void gen_runtriple9(stack *Stack) { triple v=vm::pop(Stack); #line 66 "./runtriple.in" {Stack->push(v.length()); return;} } #line 70 "./runtriple.in" // real abs2(triple v); void gen_runtriple10(stack *Stack) { triple v=vm::pop(Stack); #line 71 "./runtriple.in" {Stack->push(abs2(v)); return;} } #line 75 "./runtriple.in" // real polar(triple v, bool warn=true); void gen_runtriple11(stack *Stack) { bool warn=vm::pop(Stack,true); triple v=vm::pop(Stack); #line 76 "./runtriple.in" {Stack->push(v.polar(warn)); return;} } #line 80 "./runtriple.in" // real azimuth(triple v, bool warn=true); void gen_runtriple12(stack *Stack) { bool warn=vm::pop(Stack,true); triple v=vm::pop(Stack); #line 81 "./runtriple.in" if(!warn && v.getx() == 0.0 && v.gety() == 0.0) {Stack->push(0.0); return;} {Stack->push(v.azimuth()); return;} } #line 86 "./runtriple.in" // real colatitude(triple v, bool warn=true); void gen_runtriple13(stack *Stack) { bool warn=vm::pop(Stack,true); triple v=vm::pop(Stack); #line 87 "./runtriple.in" if(!warn && v.getx() == 0.0 && v.gety() == 0.0 && v.getz() == 0.0) {Stack->push(0.0); return;} {Stack->push(degrees(v.polar())); return;} } #line 92 "./runtriple.in" // real latitude(triple v, bool warn=true); void gen_runtriple14(stack *Stack) { bool warn=vm::pop(Stack,true); triple v=vm::pop(Stack); #line 93 "./runtriple.in" if(!warn && v.getx() == 0.0 && v.gety() == 0.0 && v.getz() == 0.0) {Stack->push(0.0); return;} {Stack->push(90.0-degrees(v.polar())); return;} } // Return the longitude of v in [0,360). #line 99 "./runtriple.in" // real longitude(triple v, bool warn=true); void gen_runtriple15(stack *Stack) { bool warn=vm::pop(Stack,true); triple v=vm::pop(Stack); #line 100 "./runtriple.in" if(!warn && v.getx() == 0.0 && v.gety() == 0.0) {Stack->push(0.0); return;} {Stack->push(principalBranch(degrees(v.azimuth()))); return;} } #line 105 "./runtriple.in" // triple unit(triple v); void gen_runtriple16(stack *Stack) { triple v=vm::pop(Stack); #line 106 "./runtriple.in" {Stack->push(unit(v)); return;} } #line 110 "./runtriple.in" // real dot(triple u, triple v); void gen_runtriple17(stack *Stack) { triple v=vm::pop(Stack); triple u=vm::pop(Stack); #line 111 "./runtriple.in" {Stack->push(dot(u,v)); return;} } #line 115 "./runtriple.in" // triple cross(triple u, triple v); void gen_runtriple18(stack *Stack) { triple v=vm::pop(Stack); triple u=vm::pop(Stack); #line 116 "./runtriple.in" {Stack->push(cross(u,v)); return;} } #line 120 "./runtriple.in" // triple dir(explicit triple z); void gen_runtriple19(stack *Stack) { triple z=vm::pop(Stack); #line 121 "./runtriple.in" {Stack->push(unit(z)); return;} } #line 125 "./runtriple.in" // triple expi(real polar, real azimuth); void gen_runtriple20(stack *Stack) { real azimuth=vm::pop(Stack); real polar=vm::pop(Stack); #line 126 "./runtriple.in" {Stack->push(expi(polar,azimuth)); return;} } #line 130 "./runtriple.in" // triple dir(real colatitude, real longitude); void gen_runtriple21(stack *Stack) { real longitude=vm::pop(Stack); real colatitude=vm::pop(Stack); #line 131 "./runtriple.in" {Stack->push(expi(radians(colatitude),radians(longitude))); return;} } #line 135 "./runtriple.in" // triple realmult(triple u, triple v); void gen_runtriple22(stack *Stack) { triple v=vm::pop(Stack); triple u=vm::pop(Stack); #line 136 "./runtriple.in" {Stack->push(triple (u.getx()*v.getx(),u.gety()*v.gety(),u.getz()*v.getz())); return;} } // Return the component of vector v perpendicular to a unit vector u. #line 141 "./runtriple.in" // triple perp(triple v, triple u); void gen_runtriple23(stack *Stack) { triple u=vm::pop(Stack); triple v=vm::pop(Stack); #line 142 "./runtriple.in" {Stack->push(perp(v,u)); return;} } #line 146 "./runtriple.in" // triple bezier(triple a, triple b, triple c, triple d, real t); void gen_runtriple24(stack *Stack) { real t=vm::pop(Stack); triple d=vm::pop(Stack); triple c=vm::pop(Stack); triple b=vm::pop(Stack); triple a=vm::pop(Stack); #line 147 "./runtriple.in" real onemt=1-t; real onemt2=onemt*onemt; {Stack->push(onemt2*onemt*a+t*(3.0*(onemt2*b+t*onemt*c)+t*t*d)); return;} } #line 153 "./runtriple.in" // triple bezierP(triple a, triple b, triple c, triple d, real t); void gen_runtriple25(stack *Stack) { real t=vm::pop(Stack); triple d=vm::pop(Stack); triple c=vm::pop(Stack); triple b=vm::pop(Stack); triple a=vm::pop(Stack); #line 154 "./runtriple.in" {Stack->push(3.0*(t*t*(d-a+3.0*(b-c))+t*(2.0*(a+c)-4.0*b)+b-a)); return;} } #line 158 "./runtriple.in" // triple bezierPP(triple a, triple b, triple c, triple d, real t); void gen_runtriple26(stack *Stack) { real t=vm::pop(Stack); triple d=vm::pop(Stack); triple c=vm::pop(Stack); triple b=vm::pop(Stack); triple a=vm::pop(Stack); #line 159 "./runtriple.in" {Stack->push(6.0*(t*(d-a+3.0*(b-c))+a+c)-12.0*b); return;} } #line 163 "./runtriple.in" // triple bezierPPP(triple a, triple b, triple c, triple d); void gen_runtriple27(stack *Stack) { triple d=vm::pop(Stack); triple c=vm::pop(Stack); triple b=vm::pop(Stack); triple a=vm::pop(Stack); #line 164 "./runtriple.in" {Stack->push(6.0*(d-a)+18.0*(b-c)); return;} } } // namespace run namespace trans { void gen_runtriple_venv(venv &ve) { #line 19 "./runtriple.in" REGISTER_BLTIN(run::tripleZero,"tripleZero"); #line 25 "./runtriple.in" REGISTER_BLTIN(run::realRealRealToTriple,"realRealRealToTriple"); #line 30 "./runtriple.in" addFunc(ve, run::tripleXPart, primReal(), SYM(xpart), formal(primTriple(), SYM(v), false, false)); #line 35 "./runtriple.in" addFunc(ve, run::tripleYPart, primReal(), SYM(ypart), formal(primTriple(), SYM(v), false, false)); #line 40 "./runtriple.in" addFunc(ve, run::tripleZPart, primReal(), SYM(zpart), formal(primTriple(), SYM(v), false, false)); #line 45 "./runtriple.in" addFunc(ve, run::gen_runtriple5, primTriple(), SYM_TIMES, formal(primReal(), SYM(x), false, false), formal(primTriple(), SYM(v), false, false)); #line 50 "./runtriple.in" addFunc(ve, run::gen_runtriple6, primTriple(), SYM_TIMES, formal(primTriple(), SYM(v), false, false), formal(primReal(), SYM(x), false, false)); #line 55 "./runtriple.in" addFunc(ve, run::gen_runtriple7, primTriple(), SYM_DIVIDE, formal(primTriple(), SYM(v), false, false), formal(primReal(), SYM(x), false, false)); #line 60 "./runtriple.in" addFunc(ve, run::gen_runtriple8, primReal(), SYM(length), formal(primTriple(), SYM(v), false, false)); #line 65 "./runtriple.in" addFunc(ve, run::gen_runtriple9, primReal(), SYM(abs), formal(primTriple(), SYM(v), false, false)); #line 70 "./runtriple.in" addFunc(ve, run::gen_runtriple10, primReal(), SYM(abs2), formal(primTriple(), SYM(v), false, false)); #line 75 "./runtriple.in" addFunc(ve, run::gen_runtriple11, primReal(), SYM(polar), formal(primTriple(), SYM(v), false, false), formal(primBoolean(), SYM(warn), true, false)); #line 80 "./runtriple.in" addFunc(ve, run::gen_runtriple12, primReal(), SYM(azimuth), formal(primTriple(), SYM(v), false, false), formal(primBoolean(), SYM(warn), true, false)); #line 86 "./runtriple.in" addFunc(ve, run::gen_runtriple13, primReal(), SYM(colatitude), formal(primTriple(), SYM(v), false, false), formal(primBoolean(), SYM(warn), true, false)); #line 92 "./runtriple.in" addFunc(ve, run::gen_runtriple14, primReal(), SYM(latitude), formal(primTriple(), SYM(v), false, false), formal(primBoolean(), SYM(warn), true, false)); #line 98 "./runtriple.in" addFunc(ve, run::gen_runtriple15, primReal(), SYM(longitude), formal(primTriple(), SYM(v), false, false), formal(primBoolean(), SYM(warn), true, false)); #line 105 "./runtriple.in" addFunc(ve, run::gen_runtriple16, primTriple(), SYM(unit), formal(primTriple(), SYM(v), false, false)); #line 110 "./runtriple.in" addFunc(ve, run::gen_runtriple17, primReal(), SYM(dot), formal(primTriple(), SYM(u), false, false), formal(primTriple(), SYM(v), false, false)); #line 115 "./runtriple.in" addFunc(ve, run::gen_runtriple18, primTriple(), SYM(cross), formal(primTriple(), SYM(u), false, false), formal(primTriple(), SYM(v), false, false)); #line 120 "./runtriple.in" addFunc(ve, run::gen_runtriple19, primTriple(), SYM(dir), formal(primTriple(), SYM(z), false, true)); #line 125 "./runtriple.in" addFunc(ve, run::gen_runtriple20, primTriple(), SYM(expi), formal(primReal(), SYM(polar), false, false), formal(primReal(), SYM(azimuth), false, false)); #line 130 "./runtriple.in" addFunc(ve, run::gen_runtriple21, primTriple(), SYM(dir), formal(primReal(), SYM(colatitude), false, false), formal(primReal(), SYM(longitude), false, false)); #line 135 "./runtriple.in" addFunc(ve, run::gen_runtriple22, primTriple(), SYM(realmult), formal(primTriple(), SYM(u), false, false), formal(primTriple(), SYM(v), false, false)); #line 140 "./runtriple.in" addFunc(ve, run::gen_runtriple23, primTriple(), SYM(perp), formal(primTriple(), SYM(v), false, false), formal(primTriple(), SYM(u), false, false)); #line 146 "./runtriple.in" addFunc(ve, run::gen_runtriple24, primTriple(), SYM(bezier), formal(primTriple(), SYM(a), false, false), formal(primTriple(), SYM(b), false, false), formal(primTriple(), SYM(c), false, false), formal(primTriple(), SYM(d), false, false), formal(primReal(), SYM(t), false, false)); #line 153 "./runtriple.in" addFunc(ve, run::gen_runtriple25, primTriple(), SYM(bezierP), formal(primTriple(), SYM(a), false, false), formal(primTriple(), SYM(b), false, false), formal(primTriple(), SYM(c), false, false), formal(primTriple(), SYM(d), false, false), formal(primReal(), SYM(t), false, false)); #line 158 "./runtriple.in" addFunc(ve, run::gen_runtriple26, primTriple(), SYM(bezierPP), formal(primTriple(), SYM(a), false, false), formal(primTriple(), SYM(b), false, false), formal(primTriple(), SYM(c), false, false), formal(primTriple(), SYM(d), false, false), formal(primReal(), SYM(t), false, false)); #line 163 "./runtriple.in" addFunc(ve, run::gen_runtriple27, primTriple(), SYM(bezierPPP), formal(primTriple(), SYM(a), false, false), formal(primTriple(), SYM(b), false, false), formal(primTriple(), SYM(c), false, false), formal(primTriple(), SYM(d), false, false)); } } // namespace trans asymptote-3.05/runstring.h0000644000000000000000000000021315031566132014366 0ustar rootroot/***** Autogenerated from runstring.in; changes will be overwritten *****/ #pragma once namespace run { void emptyString(vm::stack *); } asymptote-3.05/pkg-info.cmake0000644000000000000000000000116115031566105014701 0ustar rootroot# ASY_VERSION is set by base version + suffix, if present execute_process( COMMAND ${PY3_INTERPRETER} ${CMAKE_CURRENT_LIST_DIR}/determine_pkg_info.py OUTPUT_VARIABLE ASY_VERSION_INFO_RAW_OUTPUT ) # name, version-base, issue-url, asygl macro(SET_ASY_VERSION_INFO INDEX OUTPUT_VAR_NAME) list(GET ASY_VERSION_INFO_RAW_OUTPUT ${INDEX} ${OUTPUT_VAR_NAME}) message(STATUS "package info: ${OUTPUT_VAR_NAME} = ${${OUTPUT_VAR_NAME}}") endmacro() SET_ASY_VERSION_INFO(0 ASY_PACKAGE_NAME) SET_ASY_VERSION_INFO(1 ASY_VERSION_BASE) SET_ASY_VERSION_INFO(2 ASY_BUGREPORT) SET_ASY_VERSION_INFO(3 ASY_GL_VERSION) asymptote-3.05/cudareflect/0000755000000000000000000000000015031566105014447 5ustar rootrootasymptote-3.05/cudareflect/CMakeLists.txt0000644000000000000000000000115115031566105017205 0ustar rootrootcmake_minimum_required(VERSION 3.27) project(asy-cudareflect CXX CUDA) add_executable( reflect main.cc EXRFiles.cc kernel.cu ReflectanceMapper.cu ) # C++17 standard is derived from CMakeLists.txt. set(CMAKE_CUDA_STANDARD 17) set(CMAKE_CUDA_STANDARD_REQUIRED ON) include(FindCUDAToolkit REQUIRED) target_include_directories(reflect PRIVATE ${CMAKE_CURRENT_LIST_DIR}) set(ASY_REFLECT_LIBRARIES tinyexr-impl glm::glm CUDA::cudart) if (WIN32) list(APPEND ASY_REFLECT_LIBRARIES unofficial::getopt-win32::getopt) endif() target_link_libraries( reflect PRIVATE ${ASY_REFLECT_LIBRARIES} ) asymptote-3.05/cudareflect/common.h0000644000000000000000000000035115031566105016107 0ustar rootroot#pragma once #include #include #include #include #include #include #include #include #include #define TINYEXR_USE_THREAD 1 #include asymptote-3.05/cudareflect/kernel.h0000644000000000000000000000067515031566105016110 0ustar rootroot/** * @file kernel.h * @author Supakorn "Jamie" Rassameemasmuang * CUDA Kernel Header for computing irradiance by solid angle integration */ #pragma once #ifndef __INTELLISENSE__ #ifndef KERNEL_ARGS #define KERNEL_ARGS(blk,thrdsz) <<>> #endif #else #define KERNEL_ARGS(blk,thrdsz) #define __CUDACC__ #endif #include void irradiate_ker(float4* in, float3* out, size_t width, size_t height); asymptote-3.05/cudareflect/simpson.cuh0000644000000000000000000000504615031566105016645 0ustar rootroot/* * John C. Bowman and Supakorn "Jamie" Rassameemasmuang * University of Alberta * CUDA Adaptive Simpson integration */ #include #include "utils.cuh" // Compute a numerical approximation to an integral via adaptive Simpson's Rule // This routine ignores underflow. __device__ constexpr float sixth=1.0/6.0; __device__ constexpr int depth=10; __device__ constexpr int acc = 1.0/256; template struct TABLE { bool left; // left interval? float dat; T psum, f1t, f2t, f3t, estr; }; template __device__ inline T simpson(Tf f, // Function to be integrated. float a, float b, // Lower, upper limits of integration. float acc) // Desired relative accuracy of integral. // Try to make |error| <= acc*abs(integral). { T integral,diff,area,estl,estr,est,fv0,fv1,fv2,fv3,fv4; float dx; TABLE table[depth],*p,*pstop; p=table; pstop=table+depth-1; p->left=true; p->psum=TUtil::init(); float alpha=a; float da=b-a; fv0=f(alpha); fv2=f(alpha+0.5f*da); fv4=f(alpha+da); float wt=sixth*da; est=wt*(fv0+4.0f*fv2+fv4); area=est; float acc2=acc*acc; // Have estimate est of integral on (alpha, alpha+da). // Bisect and compute estimates on left and right half intervals. // integral is the best value for the integral. for(;;) { dx=0.5f*da; float arg=alpha+0.5f*dx; fv1=f(arg); fv3=f(arg+dx); wt=sixth*dx; estl=wt*(fv0+4.0f*fv1+fv2); estr=wt*(fv2+4.0f*fv3+fv4); integral=estl+estr; diff=est-integral; area -= diff; if(p >= pstop || (TUtil::abs2(diff) <= acc2*TUtil::abs2(area))) { // Accept approximate integral. // If it was a right interval, add results to finish at this level. // If it was a left interval, process right interval. for(;;) { if(p->left == false) { // process right-half interval alpha += da; p->left=true; p->psum=integral; fv0=p->f1t; fv2=p->f2t; fv4=p->f3t; da=p->dat; est=p->estr; break; } integral += p->psum; if(--p <= table) return integral; } } else { // Raise level and store information for processing right-half interval. ++p; da=dx; est=estl; p->left=false; p->f1t=fv2; p->f2t=fv3; p->f3t=fv4; p->dat=dx; p->estr=estr; fv4=fv2; fv2=fv1; } } } asymptote-3.05/cudareflect/EXRFiles.cc0000644000000000000000000000472215031566105016404 0ustar rootroot#include "EXRFiles.h" EXRFile::EXRFile(std::string const& input) { char const* err = nullptr; if (LoadEXR(&flt, &width, &height, input.c_str(), &err) != TINYEXR_SUCCESS) { if (err) { std::cerr << "TinyEXR ERROR: " << err << std::endl; FreeEXRErrorMessage(err); exit(1); } } } OEXRFile::OEXRFile(std::vector const& dat, int width, int height, int compressionType) : width(std::move(width)), height(std::move(height)), compressionType(compressionType), infos(3) { for (float3 const& col : dat) { r.push_back(col.x); g.push_back(col.y); b.push_back(col.z); //a.push_back(col.w); } for (int i = 0; i < 3; ++i) { pixelType.push_back(TINYEXR_PIXELTYPE_FLOAT); reqPixelType.push_back(TINYEXR_PIXELTYPE_FLOAT); } initChannelInfo(); initHeader(); } OEXRFile::OEXRFile(std::vector const& dat, int width, int height, int compressionType) : width(std::move(width)), height(std::move(height)), compressionType(compressionType), infos(3) { for (float2 const& col : dat) { r.push_back(col.x); g.push_back(col.y); b.push_back(0); //a.push_back(col.w); } for (int i = 0; i < 3; ++i) { pixelType.push_back(TINYEXR_PIXELTYPE_FLOAT); reqPixelType.push_back(TINYEXR_PIXELTYPE_FLOAT); } initChannelInfo(); initHeader(); } void OEXRFile::initChannelInfo() { infos.resize(4); // strcpy(infos[0].name, "A"); strcpy(infos[0].name, "B"); strcpy(infos[1].name, "G"); strcpy(infos[2].name, "R"); for (auto& info : infos) { info.name[1] = '\0'; } } void OEXRFile::initHeader() { InitEXRHeader(&hd); hd.num_channels = 3; hd.channels = infos.data(); hd.pixel_types = pixelType.data(); hd.requested_pixel_types = reqPixelType.data(); hd.compression_type = compressionType; } void OEXRFile::write(std::string const& filename) { EXRImage im; InitEXRImage(&im); im.num_channels = 3; im.width = width; im.height = height; std::array arr{ b.data(), g.data(), r.data() }; im.images = reinterpret_cast(arr.data()); char const* err = nullptr; if (SaveEXRImageToFile(&im, &hd, filename.c_str(), &err) != TINYEXR_SUCCESS) { std::cerr << "TinyEXR ERROR: " << err << std::endl; FreeEXRErrorMessage(err); exit(1); } } asymptote-3.05/cudareflect/EXRFiles.h0000644000000000000000000000257615031566105016253 0ustar rootroot#pragma once #include "common.h" #include class EXRFile { public: EXRFile(std::string const& input); float const* getData() const { return flt; } ~EXRFile() { free(flt); } int getWidth() const { return width; } int getHeight() const { return height; } float4 getPixel4(size_t const& x, size_t const& y) { size_t base = 4 * (y * width + x); return make_float4(flt[base], flt[base + 1], flt[base + 2], flt[base + 3]); } float3 getPixel3(size_t const& x, size_t const& y) { size_t base = 4 * (y * width + x); return make_float3(flt[base], flt[base + 1], flt[base + 2]); } private: int width, height; float* flt; }; class OEXRFile { public: OEXRFile(std::vector const& dat, int width, int height, int compressionType=TINYEXR_COMPRESSIONTYPE_PIZ); OEXRFile(std::vector const& dat, int width, int height, int compressionType=TINYEXR_COMPRESSIONTYPE_PIZ); void write(std::string const& filename); ~OEXRFile() = default; protected: void initChannelInfo(); void initHeader(); private: int width, height; int compressionType; std::vector infos; EXRHeader hd; std::vector pixelType; std::vector reqPixelType; std::vector r, g, b, a; };asymptote-3.05/cudareflect/Makefile0000644000000000000000000000077615031566105016121 0ustar rootroot# Makefile. CFLAGS = -O3 -g -Wall CXX = g++ NVCC = nvcc INCL=-I/usr/local/cuda/include NVCCFLAGS = -O3 -Xcudafe --diag_suppress=esa_on_defaulted_function_ignored FILES = main EXRFiles CUDA_FILES = kernel ReflectanceMapper CUDA_LIBS = -lcudart -lz all: $(FILES:=.o) $(CUDA_FILES:=.o) $(NVCC) $(NVCCFLAGS) -o reflect $(FILES:=.o) $(CUDA_FILES:=.o) $(CUDA_LIBS) .SUFFIXES: .c .cc .cu .o .d .cc.o: $(CXX) $(CFLAGS) $(INCL) -o $@ -c $< .cu.o: $(NVCC) $(NVCCFLAGS) -o $@ -c $< clean: rm -f *.o *.d reflect asymptote-3.05/cudareflect/main.cc0000644000000000000000000001714415031566105015711 0ustar rootroot/** * @file main.cpp * @author Supakorn "Jamie" Rassameemasmuang * Program for loading image and writing the irradiated image. */ #include "common.h" #include #ifdef _WIN32 // use vcpkg getopt package for this #undef _UNICODE #include #include #else #include #include #include #endif #include "kernel.h" #include "ReflectanceMapper.cuh" #include "EXRFiles.h" size_t const MIN_WIDTH = 2; size_t const MIN_HEIGHT = 2; struct Args { char mode = 'a'; bool webgl = false; char const* file_in = nullptr; char const* directory = nullptr; size_t count; bool validate() { if (mode == 0) return false; if ((mode == 'a' || mode == 'b' || mode == 'i' || mode == 'r') && !file_in) { return false; } return true; } }; void usage() { std::cerr << "reflect [-a|-i|-r|-b] inputEXRFile [-d outputDirectory]" << std::endl; std::cerr << "Options: " << std::endl; std::cerr << "-h\t\t help" << std::endl; std::cerr << "-d\t\t output directory" << std::endl; std::cerr << "-a\t\t generate irradiance and reflectance images (default)" << std::endl; std::cerr << "-i\t\t generate irradiance image diffuse.exr" << std::endl; std::cerr << "-r\t\t generate reflectance images reflN.exr" << std::endl; std::cerr << "-b\t\t generate brdf image refl.exr (independent of image)" << std::endl; } Args parseArgs(int argc, char* argv[]) { Args arg; int c; while ((c = getopt(argc, argv, "abd:hir")) != -1) { switch (c) { case 'a': arg.mode = 'a'; break; case 'i': arg.mode = 'i'; break; case 'r': arg.mode = 'r'; break; case 'b': arg.mode = 'b'; break; /* case 'c': { std::stringstream ss; ss << optarg; ss >> arg.count; } break; */ case 'd': arg.directory = optarg; break; case 'h': usage(); exit(0); break; default: usage(); exit(1); } } arg.file_in = argv[optind]; if (!arg.validate()) { usage(); exit(1); } return arg; } struct image_t { float4* im; int width, height; int sz() const { return width * height; } image_t(float4* im, int width, int height) : im(im), width(std::move(width)), height(std::move(height)) {} }; void irradiate_im(image_t& im, std::string const& prefix) { std::vector out_proc(im.sz()); std::stringstream out_name; out_name << prefix; std::cout << "Irradiating image..." << std::endl; irradiate_ker(im.im, out_proc.data(), im.width, im.height); out_name << "diffuse.exr"; std::string out_name_str(std::move(out_name).str()); OEXRFile ox(out_proc, im.width, im.height); std::cout << "copying data back" << std::endl; std::cout << "writing to: " << out_name_str << std::endl; ox.write(out_name_str); } std::string generate_refl_file(std::string const& prefix, int const& i, std::string const suffix="") { std::stringstream out_name; out_name << prefix << "refl" << i << suffix << ".exr"; return out_name.str(); } void map_refl_im(image_t& im, std::string const& prefix, float const& step, int const& i, std::pair const& outSize, bool halve=false) { float roughness = step * i; auto [outWidth, outHeight] = outSize; std::vector out_proc(outWidth * outHeight); std::string out_name_str = generate_refl_file(prefix, i, halve ? "w" : ""); std::cout << "Mapping reflectance map..." << std::endl; map_reflectance_ker(im.im, out_proc.data(), im.width, im.height, roughness, outWidth, outHeight); OEXRFile ox(out_proc, outWidth, outHeight); std::cout << "copying data back" << std::endl; std::cout << "writing to: " << out_name_str << std::endl; ox.write(out_name_str); } std::string const INVALID_FILE_ATTRIB = "Intermediate directories do not exist"; void make_dir(std::string const& directory) { // different implementation for windows vs linux #ifdef _WIN32 DWORD ret = CreateDirectoryA(directory.c_str(), nullptr); if (ret == 0 && GetLastError() != ERROR_ALREADY_EXISTS) { std::cerr << INVALID_FILE_ATTRIB << std::endl; exit(1); } #else struct stat st; if (stat(directory.c_str(), &st) == -1) { mkdir(directory.c_str(), 0755); } #endif } void copy_file(std::string const& in, std::string const& out) { std::ifstream ifs(in, std::ios::binary); std::ofstream ofs(out, std::ios::binary); ofs << ifs.rdbuf(); } void generate_brdf_refl( int res, std::string const& outdir, std::string const& outname="refl.exr") { std::vector out_proc(res * res); std::string finalName = outdir + "/" + outname; std::cout << "generating Fresnel/Roughness/cos_v data" << std::endl; std::cout << "writing to " << finalName << std::endl; generate_brdf_integrate_lut_ker(res, res, out_proc.data()); OEXRFile ox(out_proc, res, res); ox.write(finalName); } inline float length(float3 v) { return sqrt(v.x*v.x+v.y*v.y+v.z*v.z); } int main(int argc, char* argv[]) { Args args = parseArgs(argc, argv); std::vector im_proc; int width = 0; int height = 0; std::cout << "Loading file " << args.file_in << std::endl; EXRFile im(args.file_in); width = im.getWidth(); height = im.getHeight(); std::vector out_proc; std::cout << "Image dimensions: " << width << "x" << height << std::endl; for (int i = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { // index is i*height+j <-> (i,j) float3 frag3=im.getPixel3(j, i); // Clamp oversaturated values. float norm=0.02*length(frag3); if(norm > 1.0) { frag3.x /= norm; frag3.y /= norm; frag3.z /= norm; } out_proc.emplace_back(frag3); im_proc.emplace_back(make_float4(frag3.x,frag3.y,frag3.z,1.0f)); } // std::cout << "pushed row " << i << " into array" << std::endl; } std::cout << "finished converting to float3" << std::endl; std::stringstream outss; if (args.directory) { make_dir(args.directory); } else { args.directory = "."; } outss << args.directory << "/"; if(args.mode != 'b') { std::ofstream readme(outss.str()+"README"); readme << "The image files in this directory were generated from " << args.file_in << std::endl; readme.close(); } std::string outprefix(outss.str()); image_t imt(im_proc.data(), width, height); if (args.mode == 'b') { generate_brdf_refl(200, "."); } if (args.mode == 'i' || args.mode == 'a') { irradiate_im(imt, outprefix); } if (args.mode == 'r' || args.mode == 'a') { OEXRFile ox(out_proc, width, height); std::string out_name_str = generate_refl_file(outprefix, 0); std::cout << "writing to: " << out_name_str << std::endl; ox.write(out_name_str); for(size_t halve=0; halve < 2; ++halve) { size_t count=halve ? 8 : 10; float step = 1.0f / count; unsigned int out_width = width; unsigned int out_height = height; for (size_t i = 1; i <= count; ++i) { if (halve && out_width >= MIN_WIDTH && out_height >= MIN_HEIGHT) { out_width = out_width >> 1; out_height = out_height >> 1; // halve } map_refl_im(imt, outprefix, step, i, std::pair(out_width, out_height), halve); } } } } asymptote-3.05/cudareflect/ReflectanceMapper.cuh0000644000000000000000000000067315031566105020536 0ustar rootroot#pragma once #ifndef __INTELLISENSE__ #ifndef KERNEL_ARGS #define KERNEL_ARGS(blk,thrdsz) <<>> #endif #else #define KERNEL_ARGS(blk,thrdsz) #define __CUDACC__ #include #endif #include void map_reflectance_ker(float4* in, float3* out, size_t width, size_t height, float roughness, size_t outWidth, size_t outHeight); void generate_brdf_integrate_lut_ker(int width, int height, float2* out); asymptote-3.05/cudareflect/ReflectanceMapper.cu0000644000000000000000000002050715031566105020364 0ustar rootroot#include "ReflectanceMapper.cuh" #include "helper.cuh" #include "utils.cuh" #include #include #define GLM_FORCE_CUDA #include __device__ inline float swap_bits(uint32_t const& x, uint32_t const& mask_1, unsigned int const& shft) { return ((x & mask_1) << shft) | ((x & (~mask_1)) >> shft); } __device__ constexpr float recvbit = 2.32830643654e-10; // 1/2^32. __device__ constexpr int REFL_NUM_SAMPLES = 1 << 15; __device__ float van_der_corput_bitshift(uint32_t bits) { bits = swap_bits(bits, 0x55555555, 1); bits = swap_bits(bits, 0x33333333, 2); bits = swap_bits(bits, 0x0F0F0F0F, 4); bits = swap_bits(bits, 0x00FF00FF, 8); bits = swap_bits(bits, 0x0000FFFF, 16); return static_cast(bits) * recvbit; } __device__ glm::vec2 hamersely(uint32_t i, uint32_t N) { return glm::vec2(static_cast(i) / N, van_der_corput_bitshift(i)); } __device__ glm::vec3 importance_sampl_GGX(glm::vec2 sample, glm::vec3 normal, float roughness) { float a = roughness * roughness; float phi = TAU * sample.x; float cosTheta = sqrtf((1.0f - sample.y) / (1.f + (a * a - 1.f) * sample.y)); // GGX Sample, inverse sampling? // TODO: Understand the derivation behind this cosTheta. It has something to do with GGX distribution, but how? float sinTheta = sqrtf(1.0f - cosTheta * cosTheta); glm::vec3 vec = from_sphcoord(phi, cosTheta, sinTheta); glm::vec3 N1(cosTheta * __cosf(phi), cosTheta * __sinf(phi), -1 * sinTheta); glm::vec3 N2(-1 * __sinf(phi), __cosf(phi), 0); glm::mat3 normalBasis(N1, N2, normal); return normalBasis * vec; } #pragma region mapReflectance __global__ void map_reflectance(cudaTextureObject_t tObj, int width, int height, float roughness, float3* out, int outWidth, int outHeight) { int idx = blockIdx.x * blockDim.x + threadIdx.x; int idx_y = blockIdx.y * blockDim.y + threadIdx.y; glm::vec3 result(0.0f); if (idx < outWidth && idx_y < outHeight) { int access_idx = to_idx(outWidth, idx, idx_y); float target_phi = TAU * ((idx + 0.5f) / outWidth); float target_theta = PI * ((idx_y + 0.5f) / outHeight); glm::vec3 N = from_sphcoord(target_phi, target_theta); float total_weight = 0.0f; for (int i = 0; i < REFL_NUM_SAMPLES; ++i) { glm::vec2 sample = hamersely(i, REFL_NUM_SAMPLES); glm::vec3 half_vec = importance_sampl_GGX(sample, N, roughness); // use the structure of rhombus to calculate lightvec glm::vec3 scaled_half = 2.0f * glm::dot(half_vec, N) * half_vec; glm::vec3 lightvec = glm::normalize(scaled_half - N); float ndotl = glm::dot(N, lightvec); glm::vec2 sphcoord = to_sphcoord(lightvec); float4 frag = tex2D(tObj, sphcoord.x * PI_RECR * width / 2, sphcoord.y * PI_RECR * height); glm::vec3 frag3(frag.x, frag.y, frag.z); if (ndotl > 0.0) { // epic games said it gives better results, otherwise weight can be set to 1. #ifndef SET_WEIGHT_ONE float weight = ndotl; #else float weight = 1.0f; #endif result += (frag3 * weight); // weighting by n@l, technically not required, total_weight += weight; } } if (total_weight > 0.0f) { result = result / total_weight; out[access_idx] = make_float3(result.x, result.y, result.z); } else out[access_idx] = make_float3(0, 0, 0); } } const size_t blkSz = 8; void map_reflectance_ker( float4* in, float3* out, size_t width, size_t height, float roughness, size_t outWidth, size_t outHeight) { float4* d_ptr; size_t pitch; cudaErrorCheck(cudaMallocPitch( &d_ptr, &pitch, width * sizeof(float4), height)); cudaErrorCheck(cudaMemcpy2D(d_ptr, pitch, in, width * sizeof(float4), width * sizeof(float4), height, cudaMemcpyHostToDevice)); cudaResourceDesc cRD; memset(&cRD, 0, sizeof(cudaResourceDesc)); cRD.resType = cudaResourceTypePitch2D; cRD.res.pitch2D.devPtr = d_ptr; cRD.res.pitch2D.width = width; cRD.res.pitch2D.height = height; cRD.res.pitch2D.desc = cudaCreateChannelDesc(); cRD.res.pitch2D.pitchInBytes = pitch; cudaTextureDesc texDesc; memset(&texDesc, 0, sizeof(texDesc)); texDesc.filterMode = cudaFilterModeLinear; texDesc.sRGB = 0; texDesc.readMode = cudaReadModeElementType; cudaTextureObject_t t_obj; cudaErrorCheck(cudaCreateTextureObject( &t_obj, &cRD, &texDesc, nullptr)); // out source float3* d_out = nullptr; cudaErrorCheck(cudaMalloc( (void**)&d_out, static_cast(sizeof(float3) * outWidth * outHeight))); dim3 blockSz((outWidth / blkSz) + 1, (outHeight / blkSz) + 1); dim3 kerSz(blkSz, blkSz); map_reflectance KERNEL_ARGS(blockSz, kerSz) (t_obj, width, height, roughness, d_out, outWidth, outHeight); cudaErrorCheck(cudaMemcpy( out, d_out, sizeof(float3) * outWidth * outHeight, cudaMemcpyDeviceToHost)); cudaErrorCheck(cudaDestroyTextureObject(t_obj)); cudaErrorCheck(cudaFree(d_ptr)); } #pragma endregion __device__ float norm_dist(float const& roughness, float3 const& half_vec) { float alpha = roughness * roughness; float ndoth = half_vec.z; // assume N=(0,0,1) float denom_base = (ndoth * ndoth) * (alpha * alpha - 1) + 1; return (alpha * alpha) / (denom_base * denom_base * PI); } __device__ float G_component(float const& k, float const& ndotv) { float denom = (ndotv * (1 - k)) + k; return 1 / denom; } __device__ float GFn(float const& roughness, float const& ndotl, float const& ndotv) { float a = roughness * roughness; float k = a * a * 0.5; return G_component(k, ndotl) * G_component(k, ndotv); } __device__ float clamp(float const& x) { return fminf(fmaxf(x, 0.0f), 1.0f); } // by symmetry, assume phi_v=0. // porting of python code to CUDA __device__ constexpr int LUT_INTEGRATE_SAMPLES = 8192; __device__ constexpr float INTEGRATE_LUT_SCALE = 1.0f / LUT_INTEGRATE_SAMPLES; __device__ float2 get_integrate_value(float const& roughness, float const& cos_theta) { glm::vec2 value(0.0f); glm::vec3 upZ(0, 0, 1.0f); float num_samples = 0.0f; float cos_theta_v = clamp(cos_theta); float sin_theta_v = sqrtf(1 - cos_theta_v * cos_theta_v); glm::vec3 view_vec(sin_theta_v, 0, cos_theta_v); for (int i=0; i< LUT_INTEGRATE_SAMPLES; ++i) { glm::vec2 sample_coord = hamersely(i, LUT_INTEGRATE_SAMPLES); glm::vec3 half_vec = importance_sampl_GGX(sample_coord, upZ, roughness); glm::vec3 scaled_half = 2.0f * glm::dot(half_vec, view_vec) * half_vec; glm::vec3 lightvec = glm::normalize(scaled_half - view_vec); float ldotn = clamp(lightvec.z); float vdoth = clamp(glm::dot(half_vec, view_vec)); float ndoth = clamp(half_vec.z); if (ldotn > 0.0f) { float base_val = (GFn(roughness, ldotn, cos_theta_v) * cos_theta_v * ldotn); float base_f = powf(1.0f - vdoth, 5.0f); value.x += base_val * (1 - base_f); value.y += base_val * base_f; num_samples += 1.0f; } } value = value * INTEGRATE_LUT_SCALE; return make_float2(value.x, value.y); } __global__ void generate_brdf_integrate(int width, int height, float2* out) { int idx = blockIdx.x * blockDim.x + threadIdx.x; int idx_y = blockIdx.y * blockDim.y + threadIdx.y; if (idx < width && idx_y < height) { int access_idx = to_idx(width, idx, idx_y); float cosv = (idx + 1.0f) / width; float roughness = (idx_y + 1.0f) / height; out[access_idx] = get_integrate_value(roughness, cosv); } } void generate_brdf_integrate_lut_ker(int width, int height, float2* out) { float2* d_out; cudaErrorCheck(cudaMalloc( (void**)&d_out, static_cast(width * height * sizeof(float2)))); dim3 blockSz((width / blkSz) + 1, (height / blkSz) + 1); dim3 kerSz(blkSz, blkSz); generate_brdf_integrate KERNEL_ARGS(blockSz, kerSz) (width, height, d_out); cudaErrorCheck(cudaMemcpy( out, d_out, width * height * sizeof(float2), cudaMemcpyDeviceToHost)); cudaErrorCheck(cudaFree(d_out)); } asymptote-3.05/cudareflect/utils.cuh0000644000000000000000000000363615031566105016320 0ustar rootroot#pragma once #ifndef __INTELLISENSE__ #ifndef KERNEL_ARGS #define KERNEL_ARGS(blk,thrdsz) <<>> #endif #else #define KERNEL_ARGS(blk,thrdsz) #define __CUDACC__ #include #endif #include #include #define GLM_FORCE_CUDA #include __device__ constexpr float PI = 3.141592654; __device__ constexpr float HALFPI = 0.5*PI; __device__ constexpr float TAU = 2.0*PI; __device__ constexpr float PI_RECR = 1.0/PI; __device__ inline glm::vec2 to_sphcoord(glm::vec3 const& vec) { return glm::vec2( atan2f(-vec.y, -vec.x) + PI, acosf(vec.z) ); } __device__ inline glm::vec3 from_sphcoord(float const& phi, float const& theta) { return glm::vec3( __sinf(theta) * __cosf(phi), __sinf(theta) * __sinf(phi), __cosf(theta)); } __device__ inline glm::vec3 from_sphcoord(float const& phi, float const& cosTheta, float const& sinTheta) { return glm::vec3( sinTheta * __cosf(phi), sinTheta * __sinf(phi), cosTheta); } __device__ inline glm::vec3 angleToBasis(glm::mat3 const& normalOrthBasis, float const& phi, float const& theta) { // angle relative to (N1, N2, N) basis is (sin(phi)cos(theta), sin(phi)sin(theta), cos(phi)). // perform a change of basis glm::vec3 base_vec = from_sphcoord(phi, theta); // representation of the matrix // return M*base_vec; // M is the matrix // \begin{pmatrix} // -\sin(\phi) & \cos(\theta)\cos(\phi) & \sin(\theta)\cos(\phi) \\ // \cos(\phi) & \cos(\theta)\sin(\phi) & \sin(\theta)\sin(\phi) \\ // 0 & -\sin(\theta) & \cos(\theta) // \end{pmatrix} // ( N1 N2 N) column return normalOrthBasis * base_vec; } struct Vec3Utility { __device__ static glm::vec3 init() { return glm::vec3(0.0f); } __device__ static float abs2(glm::vec3 v) { return v.x * v.x + v.y * v.y + v.z * v.z; } }; asymptote-3.05/cudareflect/helper.cuh0000644000000000000000000000156315031566105016434 0ustar rootroot#pragma once #include #include #include inline void check_error() { #ifdef DEBUG cudaError_t __err = cudaGetLastError(); if (__err != cudaSuccess) { std::cerr << "Fata CUDA Error. Msg: " << cudaGetErrorString(__err) << std::endl; } else { std::cerr << "CUDA Operation success" << std::endl; } #endif } inline void cudaErrorCheck(cudaError err) { if (err != cudaSuccess) { std::cerr << "ERROR: " << cudaGetErrorString(err) << std::endl; exit(1); } } template T* cudaDupe(T* in, size_t sz) { T* out = nullptr; cudaErrorCheck(cudaMalloc((void**)&out, sizeof(T) * sz)); cudaErrorCheck(cudaMemcpy(out, in, sizeof(T) * sz, cudaMemcpyHostToDevice)); return out; } __device__ inline int to_idx(int width, int x, int y) { return y * width + x; } asymptote-3.05/cudareflect/kernel.cu0000644000000000000000000001042315031566105016260 0ustar rootroot/** * @file kernel.cu * @author Supakorn "Jamie" Rassameemasmuang * CUDA Kernel for computing irradiance by solid angle integration * Partially based on: * https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf */ #include "kernel.h" #include "helper.cuh" #include "utils.cuh" #include "simpson.cuh" #include #include #include #define GLM_FORCE_CUDA #include #include class IntegrateSampler { public: __device__ IntegrateSampler( cudaTextureObject_t tObjin, glm::mat3 normalOrthBasis, size_t const& inWidth, size_t const& inHeight) : normalOrthBasis(normalOrthBasis), width(inWidth), height(inHeight), tObj(tObjin) { } __device__ ~IntegrateSampler() {} __device__ glm::vec3 integrand(float const& sampled_phi, float const& sampled_theta) { // vec3 is the world space coordinate glm::vec2 sphcoord = to_sphcoord(angleToBasis(normalOrthBasis, sampled_phi, sampled_theta)); float4 frag = tex2D(tObj, sphcoord.x * PI_RECR * 0.5*width, sphcoord.y * PI_RECR * height); return glm::vec3(frag.x, frag.y, frag.z); } __device__ glm::vec3 inner(float const& sampled_theta) { return simpson( [this, &sampled_theta](float const& phi) {return this->integrand(phi,sampled_theta); }, 0, TAU, acc)*0.5f*__sinf(2 * sampled_theta); } __device__ glm::vec3 integrate() { return PI_RECR * simpson( [this](float const& theta) {return this->inner(theta); }, 0, HALFPI, acc); } private: glm::mat3 normalOrthBasis; size_t width, height; cudaTextureObject_t tObj; }; __global__ void irradiate(cudaTextureObject_t tObjin, float3* out, size_t width, size_t height) { int idx = blockIdx.x * blockDim.x + threadIdx.x; int idx_y = blockIdx.y * blockDim.y + threadIdx.y; if (idx < width && idx_y < height) { int access_idx = to_idx(width, idx, idx_y); float target_phi = TAU * ((idx + 0.5f) / width); float target_theta = PI * ((idx_y + 0.5f) / height); const glm::vec3 N = from_sphcoord(target_phi, target_theta); const glm::vec3 N1( __cosf(target_theta) * __cosf(target_phi), __cosf(target_theta) * __sinf(target_phi), -1*__sinf(target_theta)); const glm::vec3 N2(-1 * __sinf(target_phi), __cosf(target_phi), 0); glm::mat3 normalBasisMat(N1,N2,N); IntegrateSampler integrator(tObjin, normalBasisMat, width, height); glm::vec3 out_val = integrator.integrate(); out[access_idx] = make_float3(out_val.x, out_val.y, out_val.z); } } const size_t blkSz = 8; void irradiate_ker(float4* in, float3* out, size_t width, size_t height) { float4* d_ptr; size_t pitch; cudaErrorCheck(cudaMallocPitch( &d_ptr, &pitch, width * sizeof(float4), height)); cudaErrorCheck(cudaMemcpy2D(d_ptr, pitch, in, width * sizeof(float4), width*sizeof(float4), height, cudaMemcpyHostToDevice)); cudaResourceDesc cRD; memset(&cRD, 0, sizeof(cudaResourceDesc)); cRD.resType = cudaResourceTypePitch2D; cRD.res.pitch2D.devPtr = d_ptr; cRD.res.pitch2D.width = width; cRD.res.pitch2D.height = height; cRD.res.pitch2D.desc = cudaCreateChannelDesc(); cRD.res.pitch2D.pitchInBytes = pitch; cudaTextureDesc texDesc; memset(&texDesc, 0, sizeof(texDesc)); texDesc.filterMode = cudaFilterModeLinear; texDesc.sRGB = 0; texDesc.readMode = cudaReadModeElementType; cudaTextureObject_t t_obj; cudaErrorCheck(cudaCreateTextureObject( &t_obj, &cRD, &texDesc, nullptr)); // out source float3* d_out; cudaErrorCheck(cudaMalloc( (void**)&d_out, static_cast(sizeof(float3) * width * height))); dim3 blockSz((width / blkSz) + 1, (height / blkSz) + 1); dim3 kerSz(blkSz, blkSz); irradiate KERNEL_ARGS(blockSz, kerSz) (t_obj, d_out, width, height); cudaErrorCheck(cudaMemcpy( out, d_out, sizeof(float3) * width * height, cudaMemcpyDeviceToHost)); cudaErrorCheck(cudaDestroyTextureObject(t_obj)); cudaFree(d_ptr); } asymptote-3.05/settings.h0000644000000000000000000000527215031566105014205 0ustar rootroot/***** * settings.h * Andy Hammerlindl 2004/05/10 * * Declares a list of global variables that act as settings in the system. *****/ #ifndef SETTINGS_H #define SETTINGS_H #include #include #include "common.h" #include "pair.h" #include "item.h" namespace types { class record; } namespace camp { void glrenderWrapper(); } namespace gl { extern bool glthread; extern bool initialize; #ifdef HAVE_PTHREAD extern pthread_t mainthread; extern pthread_cond_t initSignal; extern pthread_mutex_t initLock; extern pthread_cond_t readySignal; extern pthread_mutex_t readyLock; void wait(pthread_cond_t& signal, pthread_mutex_t& lock); void endwait(pthread_cond_t& signal, pthread_mutex_t& lock); #endif } namespace settings { extern char *argv0; void Warn(const string& s); void noWarn(const string& s); bool warn(const string& s); extern string systemDir; extern string docdir; extern const string dirsep; extern bool safe; bool globalread(); bool globalwrite(); extern const string suffix; extern const string guisuffix; extern const string standardprefix; extern string historyname; void SetPageDimensions(); types::record *getSettingsModule(); vm::item& Setting(string name); template inline T getSetting(string name) { return vm::get(Setting(name)); } // Global settings accessible as variables extern Int verbose; extern bool debug; extern bool xasy; extern bool keys; extern bool compact; extern bool gray; extern bool bw; extern bool rgb; extern bool cmyk; bool view(); bool trap(); string outname(); void setOptions(int argc, char *argv[]); // Access the arguments once options have been parsed. int numArgs(); char *getArg(int n); Int getScroll(); #if !defined(_MSC_VER) extern mode_t mask; #endif bool xe(const string& texengine); bool lua(const string& texengine); bool pdf(const string& texengine); bool latex(const string& texengine); bool context(const string& texengine); string nativeformat(); string defaultformat(); const char *newpage(const string& texengine); const char *beginlabel(const string& texengine); const char *endlabel(const string& texengine); const char *rawpostscript(const string& texengine); const char *beginpicture(const string& texengine); const char *endpicture(const string& texengine); const char *beginspecial(const string& texengine); const char *endspecial(); string texcommand(); string texprogram(); const double inches=72.0; const double cm=inches/2.54; const double tex2ps=72.0/72.27; const double ps2tex=1.0/tex2ps; const string AsyGL="webgl/asygl.js"; const string WebGLheader="webgl/WebGLheader.html"; const string WebGLfooter="webgl/WebGLfooter.html"; } extern const char *REVISION; extern const char *AsyGLVersion; #endif asymptote-3.05/camp.tab.cc0000644000000000000000000041135115031566132014167 0ustar rootroot/* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, especially those whose name start with YY_ or yy_. They are private implementation details that can be changed or removed. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output, and Bison version. */ #define YYBISON 30802 /* Bison version string. */ #define YYBISON_VERSION "3.8.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* First part of user prologue. */ #line 1 "camp.y" /***** * camp.y * Andy Hammerlindl 08/12/2002 * * The grammar of the camp language. *****/ #include "errormsg.h" #include "exp.h" #include "newexp.h" #include "dec.h" #include "fundec.h" #include "stm.h" #include "modifier.h" #include "opsymbols.h" // Avoid error messages with unpatched bison-1.875: #ifndef __attribute__ #define __attribute__(x) #endif // Used when a position needs to be determined and no token is // available. Defined in camp.l. position lexerPos(); bool lexerEOF(); int yylex(void); /* function prototype */ void yyerror(const char *s) { if (!lexerEOF()) { em.error(lexerPos()); em << s; em.cont(); } } // Check if the symbol given is "keyword". Returns true in this case and // returns false and reports an error otherwise. bool checkKeyword(position pos, symbol sym) { if (sym != symbol::trans("keyword")) { em.error(pos); em << "expected 'keyword' here"; return false; } return true; } namespace absyntax { file *root; } using namespace absyntax; using sym::symbol; using mem::string; #line 130 "camp.tab.cc" # ifndef YY_CAST # ifdef __cplusplus # define YY_CAST(Type, Val) static_cast (Val) # define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) # else # define YY_CAST(Type, Val) ((Type) (Val)) # define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) # endif # endif # ifndef YY_NULLPTR # if defined __cplusplus # if 201103L <= __cplusplus # define YY_NULLPTR nullptr # else # define YY_NULLPTR 0 # endif # else # define YY_NULLPTR ((void*)0) # endif # endif #include "camp.tab.h" /* Symbol kind. */ enum yysymbol_kind_t { YYSYMBOL_YYEMPTY = -2, YYSYMBOL_YYEOF = 0, /* "end of file" */ YYSYMBOL_YYerror = 1, /* error */ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ YYSYMBOL_ID = 3, /* ID */ YYSYMBOL_SELFOP = 4, /* SELFOP */ YYSYMBOL_DOTS = 5, /* DOTS */ YYSYMBOL_COLONS = 6, /* COLONS */ YYSYMBOL_DASHES = 7, /* DASHES */ YYSYMBOL_INCR = 8, /* INCR */ YYSYMBOL_LONGDASH = 9, /* LONGDASH */ YYSYMBOL_CONTROLS = 10, /* CONTROLS */ YYSYMBOL_TENSION = 11, /* TENSION */ YYSYMBOL_ATLEAST = 12, /* ATLEAST */ YYSYMBOL_CURL = 13, /* CURL */ YYSYMBOL_COR = 14, /* COR */ YYSYMBOL_CAND = 15, /* CAND */ YYSYMBOL_BAR = 16, /* BAR */ YYSYMBOL_AMPERSAND = 17, /* AMPERSAND */ YYSYMBOL_EQ = 18, /* EQ */ YYSYMBOL_NEQ = 19, /* NEQ */ YYSYMBOL_LT = 20, /* LT */ YYSYMBOL_LE = 21, /* LE */ YYSYMBOL_GT = 22, /* GT */ YYSYMBOL_GE = 23, /* GE */ YYSYMBOL_CARETS = 24, /* CARETS */ YYSYMBOL_25_ = 25, /* '+' */ YYSYMBOL_26_ = 26, /* '-' */ YYSYMBOL_27_ = 27, /* '*' */ YYSYMBOL_28_ = 28, /* '/' */ YYSYMBOL_29_ = 29, /* '%' */ YYSYMBOL_30_ = 30, /* '#' */ YYSYMBOL_31_ = 31, /* '^' */ YYSYMBOL_OPERATOR = 32, /* OPERATOR */ YYSYMBOL_LOOSE = 33, /* LOOSE */ YYSYMBOL_ASSIGN = 34, /* ASSIGN */ YYSYMBOL_35_ = 35, /* '?' */ YYSYMBOL_36_ = 36, /* ':' */ YYSYMBOL_DIRTAG = 37, /* DIRTAG */ YYSYMBOL_JOIN_PREC = 38, /* JOIN_PREC */ YYSYMBOL_AND = 39, /* AND */ YYSYMBOL_40_ = 40, /* '{' */ YYSYMBOL_41_ = 41, /* '}' */ YYSYMBOL_42_ = 42, /* '(' */ YYSYMBOL_43_ = 43, /* ')' */ YYSYMBOL_44_ = 44, /* '.' */ YYSYMBOL_45_ = 45, /* ',' */ YYSYMBOL_46_ = 46, /* '[' */ YYSYMBOL_47_ = 47, /* ']' */ YYSYMBOL_48_ = 48, /* ';' */ YYSYMBOL_ELLIPSIS = 49, /* ELLIPSIS */ YYSYMBOL_ACCESS = 50, /* ACCESS */ YYSYMBOL_UNRAVEL = 51, /* UNRAVEL */ YYSYMBOL_IMPORT = 52, /* IMPORT */ YYSYMBOL_INCLUDE = 53, /* INCLUDE */ YYSYMBOL_FROM = 54, /* FROM */ YYSYMBOL_QUOTE = 55, /* QUOTE */ YYSYMBOL_STRUCT = 56, /* STRUCT */ YYSYMBOL_TYPEDEF = 57, /* TYPEDEF */ YYSYMBOL_USING = 58, /* USING */ YYSYMBOL_NEW = 59, /* NEW */ YYSYMBOL_IF = 60, /* IF */ YYSYMBOL_ELSE = 61, /* ELSE */ YYSYMBOL_WHILE = 62, /* WHILE */ YYSYMBOL_DO = 63, /* DO */ YYSYMBOL_FOR = 64, /* FOR */ YYSYMBOL_BREAK = 65, /* BREAK */ YYSYMBOL_CONTINUE = 66, /* CONTINUE */ YYSYMBOL_RETURN_ = 67, /* RETURN_ */ YYSYMBOL_THIS_TOK = 68, /* THIS_TOK */ YYSYMBOL_EXPLICIT = 69, /* EXPLICIT */ YYSYMBOL_GARBAGE = 70, /* GARBAGE */ YYSYMBOL_LIT = 71, /* LIT */ YYSYMBOL_STRING = 72, /* STRING */ YYSYMBOL_PERM = 73, /* PERM */ YYSYMBOL_MODIFIER = 74, /* MODIFIER */ YYSYMBOL_UNARY = 75, /* UNARY */ YYSYMBOL_EXP_IN_PARENS_RULE = 76, /* EXP_IN_PARENS_RULE */ YYSYMBOL_YYACCEPT = 77, /* $accept */ YYSYMBOL_file = 78, /* file */ YYSYMBOL_fileblock = 79, /* fileblock */ YYSYMBOL_bareblock = 80, /* bareblock */ YYSYMBOL_name = 81, /* name */ YYSYMBOL_runnable = 82, /* runnable */ YYSYMBOL_modifiers = 83, /* modifiers */ YYSYMBOL_dec = 84, /* dec */ YYSYMBOL_decdec = 85, /* decdec */ YYSYMBOL_decdeclist = 86, /* decdeclist */ YYSYMBOL_typeparam = 87, /* typeparam */ YYSYMBOL_typeparamlist = 88, /* typeparamlist */ YYSYMBOL_idpair = 89, /* idpair */ YYSYMBOL_idpairlist = 90, /* idpairlist */ YYSYMBOL_strid = 91, /* strid */ YYSYMBOL_stridpair = 92, /* stridpair */ YYSYMBOL_stridpairlist = 93, /* stridpairlist */ YYSYMBOL_vardec = 94, /* vardec */ YYSYMBOL_barevardec = 95, /* barevardec */ YYSYMBOL_type = 96, /* type */ YYSYMBOL_celltype = 97, /* celltype */ YYSYMBOL_dims = 98, /* dims */ YYSYMBOL_dimexps = 99, /* dimexps */ YYSYMBOL_decidlist = 100, /* decidlist */ YYSYMBOL_decid = 101, /* decid */ YYSYMBOL_decidstart = 102, /* decidstart */ YYSYMBOL_varinit = 103, /* varinit */ YYSYMBOL_block = 104, /* block */ YYSYMBOL_arrayinit = 105, /* arrayinit */ YYSYMBOL_basearrayinit = 106, /* basearrayinit */ YYSYMBOL_varinits = 107, /* varinits */ YYSYMBOL_formals = 108, /* formals */ YYSYMBOL_explicitornot = 109, /* explicitornot */ YYSYMBOL_formal = 110, /* formal */ YYSYMBOL_fundec = 111, /* fundec */ YYSYMBOL_typedec = 112, /* typedec */ YYSYMBOL_slice = 113, /* slice */ YYSYMBOL_value = 114, /* value */ YYSYMBOL_argument = 115, /* argument */ YYSYMBOL_arglist = 116, /* arglist */ YYSYMBOL_tuple = 117, /* tuple */ YYSYMBOL_exp = 118, /* exp */ YYSYMBOL_join = 119, /* join */ YYSYMBOL_dir = 120, /* dir */ YYSYMBOL_basicjoin = 121, /* basicjoin */ YYSYMBOL_tension = 122, /* tension */ YYSYMBOL_controls = 123, /* controls */ YYSYMBOL_stm = 124, /* stm */ YYSYMBOL_stmexp = 125, /* stmexp */ YYSYMBOL_blockstm = 126, /* blockstm */ YYSYMBOL_forinit = 127, /* forinit */ YYSYMBOL_fortest = 128, /* fortest */ YYSYMBOL_forupdate = 129, /* forupdate */ YYSYMBOL_stmexplist = 130 /* stmexplist */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; #ifdef short # undef short #endif /* On compilers that do not define __PTRDIFF_MAX__ etc., make sure and (if available) are included so that the code can choose integer types of a good width. */ #ifndef __PTRDIFF_MAX__ # include /* INFRINGES ON USER NAME SPACE */ # if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YY_STDINT_H # endif #endif /* Narrow types that promote to a signed type and that can represent a signed or unsigned integer of at least N bits. In tables they can save space and decrease cache pressure. Promoting to a signed type helps avoid bugs in integer arithmetic. */ #ifdef __INT_LEAST8_MAX__ typedef __INT_LEAST8_TYPE__ yytype_int8; #elif defined YY_STDINT_H typedef int_least8_t yytype_int8; #else typedef signed char yytype_int8; #endif #ifdef __INT_LEAST16_MAX__ typedef __INT_LEAST16_TYPE__ yytype_int16; #elif defined YY_STDINT_H typedef int_least16_t yytype_int16; #else typedef short yytype_int16; #endif /* Work around bug in HP-UX 11.23, which defines these macros incorrectly for preprocessor constants. This workaround can likely be removed in 2023, as HPE has promised support for HP-UX 11.23 (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of . */ #ifdef __hpux # undef UINT_LEAST8_MAX # undef UINT_LEAST16_MAX # define UINT_LEAST8_MAX 255 # define UINT_LEAST16_MAX 65535 #endif #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ typedef __UINT_LEAST8_TYPE__ yytype_uint8; #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ && UINT_LEAST8_MAX <= INT_MAX) typedef uint_least8_t yytype_uint8; #elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX typedef unsigned char yytype_uint8; #else typedef short yytype_uint8; #endif #if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ typedef __UINT_LEAST16_TYPE__ yytype_uint16; #elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ && UINT_LEAST16_MAX <= INT_MAX) typedef uint_least16_t yytype_uint16; #elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX typedef unsigned short yytype_uint16; #else typedef int yytype_uint16; #endif #ifndef YYPTRDIFF_T # if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ # define YYPTRDIFF_T __PTRDIFF_TYPE__ # define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ # elif defined PTRDIFF_MAX # ifndef ptrdiff_t # include /* INFRINGES ON USER NAME SPACE */ # endif # define YYPTRDIFF_T ptrdiff_t # define YYPTRDIFF_MAXIMUM PTRDIFF_MAX # else # define YYPTRDIFF_T long # define YYPTRDIFF_MAXIMUM LONG_MAX # endif #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned # endif #endif #define YYSIZE_MAXIMUM \ YY_CAST (YYPTRDIFF_T, \ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ ? YYPTRDIFF_MAXIMUM \ : YY_CAST (YYSIZE_T, -1))) #define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) /* Stored state numbers (used for stacks). */ typedef yytype_int16 yy_state_t; /* State numbers in computations. */ typedef int yy_state_fast_t; #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ # define YY_(Msgid) Msgid # endif #endif #ifndef YY_ATTRIBUTE_PURE # if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) # define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) # else # define YY_ATTRIBUTE_PURE # endif #endif #ifndef YY_ATTRIBUTE_UNUSED # if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) # define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) # else # define YY_ATTRIBUTE_UNUSED # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YY_USE(E) ((void) (E)) #else # define YY_USE(E) /* empty */ #endif /* Suppress an incorrect diagnostic about yylval being uninitialized. */ #if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ # if __GNUC__ * 100 + __GNUC_MINOR__ < 407 # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") # else # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") # endif # define YY_IGNORE_MAYBE_UNINITIALIZED_END \ _Pragma ("GCC diagnostic pop") #else # define YY_INITIAL_VALUE(Value) Value #endif #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_END #endif #ifndef YY_INITIAL_VALUE # define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif #if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ # define YY_IGNORE_USELESS_CAST_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") # define YY_IGNORE_USELESS_CAST_END \ _Pragma ("GCC diagnostic pop") #endif #ifndef YY_IGNORE_USELESS_CAST_BEGIN # define YY_IGNORE_USELESS_CAST_BEGIN # define YY_IGNORE_USELESS_CAST_END #endif #define YY_ASSERT(E) ((void) (0 && (E))) #if !defined yyoverflow /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's 'empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* !defined yyoverflow */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yy_state_t yyss_alloc; YYSTYPE yyvs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYPTRDIFF_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / YYSIZEOF (*yyptr); \ } \ while (0) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from SRC to DST. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(Dst, Src, Count) \ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) # else # define YYCOPY(Dst, Src, Count) \ do \ { \ YYPTRDIFF_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ while (0) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 1984 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 77 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 54 /* YYNRULES -- Number of rules. */ #define YYNRULES 216 /* YYNSTATES -- Number of states. */ #define YYNSTATES 427 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 313 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM as returned by yylex, with out-of-bounds checking. */ #define YYTRANSLATE(YYX) \ (0 <= (YYX) && (YYX) <= YYMAXUTOK \ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ : YYSYMBOL_YYUNDEF) /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM as returned by yylex. */ static const yytype_int8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 30, 2, 29, 2, 2, 42, 43, 27, 25, 45, 26, 44, 28, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 48, 2, 2, 2, 35, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 46, 2, 47, 31, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 40, 2, 41, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 32, 33, 34, 37, 38, 39, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { 0, 195, 195, 199, 200, 205, 206, 211, 212, 213, 218, 219, 220, 222, 227, 228, 229, 231, 236, 237, 238, 239, 241, 243, 245, 246, 248, 250, 252, 253, 257, 259, 264, 268, 270, 276, 282, 286, 290, 292, 297, 301, 303, 308, 310, 314, 315, 320, 321, 326, 328, 332, 333, 338, 342, 346, 347, 351, 355, 356, 360, 361, 366, 367, 372, 373, 378, 379, 380, 382, 387, 388, 392, 397, 398, 400, 402, 407, 408, 409, 413, 415, 420, 421, 422, 424, 429, 430, 434, 436, 438, 441, 444, 450, 452, 457, 458, 463, 466, 470, 476, 477, 478, 479, 483, 484, 486, 487, 489, 490, 493, 497, 498, 500, 502, 504, 508, 509, 513, 514, 516, 518, 524, 525, 529, 530, 531, 532, 534, 535, 537, 539, 541, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 566, 568, 570, 572, 574, 576, 581, 583, 588, 590, 591, 592, 594, 600, 602, 605, 607, 608, 615, 616, 618, 621, 624, 630, 631, 632, 635, 641, 642, 644, 646, 647, 651, 653, 656, 659, 665, 666, 671, 672, 673, 674, 676, 678, 680, 682, 684, 686, 687, 688, 689, 693, 697, 701, 702, 703, 707, 708, 712, 713, 717, 718 }; #endif /** Accessing symbol of state STATE. */ #define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) #if YYDEBUG || 0 /* The user-facing name of the symbol whose (internal) number is YYSYMBOL. No bounds checking. */ static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "\"end of file\"", "error", "\"invalid token\"", "ID", "SELFOP", "DOTS", "COLONS", "DASHES", "INCR", "LONGDASH", "CONTROLS", "TENSION", "ATLEAST", "CURL", "COR", "CAND", "BAR", "AMPERSAND", "EQ", "NEQ", "LT", "LE", "GT", "GE", "CARETS", "'+'", "'-'", "'*'", "'/'", "'%'", "'#'", "'^'", "OPERATOR", "LOOSE", "ASSIGN", "'?'", "':'", "DIRTAG", "JOIN_PREC", "AND", "'{'", "'}'", "'('", "')'", "'.'", "','", "'['", "']'", "';'", "ELLIPSIS", "ACCESS", "UNRAVEL", "IMPORT", "INCLUDE", "FROM", "QUOTE", "STRUCT", "TYPEDEF", "USING", "NEW", "IF", "ELSE", "WHILE", "DO", "FOR", "BREAK", "CONTINUE", "RETURN_", "THIS_TOK", "EXPLICIT", "GARBAGE", "LIT", "STRING", "PERM", "MODIFIER", "UNARY", "EXP_IN_PARENS_RULE", "$accept", "file", "fileblock", "bareblock", "name", "runnable", "modifiers", "dec", "decdec", "decdeclist", "typeparam", "typeparamlist", "idpair", "idpairlist", "strid", "stridpair", "stridpairlist", "vardec", "barevardec", "type", "celltype", "dims", "dimexps", "decidlist", "decid", "decidstart", "varinit", "block", "arrayinit", "basearrayinit", "varinits", "formals", "explicitornot", "formal", "fundec", "typedec", "slice", "value", "argument", "arglist", "tuple", "exp", "join", "dir", "basicjoin", "tension", "controls", "stm", "stmexp", "blockstm", "forinit", "fortest", "forupdate", "stmexplist", YY_NULLPTR }; static const char * yysymbol_name (yysymbol_kind_t yysymbol) { return yytname[yysymbol]; } #endif #define YYPACT_NINF (-312) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) #define YYTABLE_NINF (-58) #define yytable_value_is_error(Yyn) \ 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int16 yypact[] = { -312, 65, 450, -312, -312, 903, 903, 903, 903, -312, 903, -312, 903, -312, 34, 32, 14, 38, 18, 134, 199, 15, 200, 32, 137, 171, 594, 172, 180, 181, 721, -312, 217, -312, -312, -312, 30, -312, 522, -312, -312, 196, 258, -312, -312, -312, -312, 150, 1558, -312, 246, -312, 224, 274, 274, 274, 274, 1944, 183, 314, 12, 1159, 94, -312, 21, -312, 139, 127, 266, 36, 261, 283, 287, -2, 1, 50, -312, 294, 301, 39, -312, 344, 316, 307, 153, 903, 903, 293, 903, -312, -312, -312, 974, 274, 596, 345, 666, 315, -312, -312, -312, -312, -312, 216, 317, -312, 330, 668, 362, 723, 903, 147, -312, -312, 217, -312, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 793, 903, -312, 326, -312, 723, -312, -312, 217, 184, -312, 903, -312, 903, 365, 35, 34, -312, -312, 366, 35, -312, -312, -312, 57, 35, 67, 378, -312, 366, 323, 250, 32, 19, 795, 136, 325, 1285, 1325, 331, -312, 371, -312, 329, 333, -312, 348, -312, 905, -312, 161, 1558, -312, 903, -312, 336, 1011, 337, 95, 315, 344, 848, -312, 162, -312, 340, 1048, 1558, 903, 850, 383, 386, 297, 1776, 1804, 1832, 1860, 1888, 1888, 1916, 1916, 1916, 1916, 803, 286, 286, 274, 274, 274, 274, 274, 1944, 1558, 1521, 903, 1201, 297, 326, -312, -312, 903, 1558, 1558, -312, 358, -312, 52, -312, 391, -312, -312, -312, 176, 276, 392, 349, -312, 232, 295, 350, 253, -312, 296, 104, 141, 294, 327, -312, 173, 32, -312, 1085, 304, 112, -312, 795, 315, 594, 594, 903, 7, 903, 903, 903, -312, -312, 905, 905, 1558, -312, 903, -312, -312, 294, 220, -312, -312, -312, 1558, -312, -312, -312, 1593, 903, 1630, -312, -312, 903, 1445, -312, 903, -312, -312, 32, 29, 35, 352, 366, 354, 402, -312, 403, -312, 359, -312, -312, 360, -312, 238, 119, -312, -312, -312, 294, 327, 327, 408, -312, -312, -312, 848, -312, 9, 367, 294, 241, 1122, 355, -312, 1365, 903, 1558, 369, -312, 1558, -312, -312, 1558, -312, 294, 903, 1667, 903, 1740, -312, 1243, -312, 410, -312, -312, -312, -312, -312, -312, -312, 403, -312, -312, 373, 248, -312, -312, -312, 33, 381, 382, -312, 848, 848, -312, 294, -312, 594, 374, 1405, 903, -312, 1704, 903, 1704, -312, 903, 376, 255, -312, 377, 393, 848, -312, 398, -312, -312, -312, -312, 594, 404, 333, 1704, 1483, -312, -312, -312, 848, -312, -312, -312, 594, -312, -312, -312 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. Performed when YYTABLE does not specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 3, 0, 2, 1, 7, 0, 0, 0, 0, 9, 0, 5, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 126, 127, 15, 14, 124, 4, 0, 10, 18, 0, 0, 55, 207, 19, 20, 125, 206, 11, 0, 194, 124, 169, 168, 131, 132, 133, 0, 124, 0, 0, 47, 48, 0, 51, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 3, 0, 0, 57, 96, 0, 0, 57, 154, 0, 0, 0, 208, 202, 203, 204, 0, 128, 0, 0, 0, 56, 17, 16, 12, 13, 53, 66, 54, 62, 64, 0, 0, 0, 0, 182, 185, 173, 170, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 174, 195, 0, 72, 6, 114, 0, 165, 0, 113, 0, 0, 0, 0, 21, 24, 0, 0, 27, 28, 29, 0, 0, 0, 0, 95, 0, 0, 66, 0, 87, 0, 157, 155, 0, 0, 0, 210, 0, 215, 0, 209, 205, 7, 109, 0, 118, 0, 116, 8, 100, 58, 0, 0, 0, 87, 67, 0, 0, 111, 0, 104, 0, 0, 171, 0, 0, 0, 0, 153, 148, 147, 151, 150, 145, 146, 141, 142, 143, 144, 149, 134, 135, 136, 137, 138, 139, 140, 152, 164, 0, 0, 0, 166, 175, 176, 129, 0, 123, 122, 50, 7, 38, 0, 37, 0, 52, 40, 41, 0, 0, 43, 0, 45, 0, 0, 0, 0, 172, 0, 87, 0, 0, 87, 86, 0, 0, 82, 0, 0, 87, 158, 0, 156, 0, 0, 0, 66, 211, 0, 0, 119, 110, 0, 0, 102, 107, 101, 105, 59, 68, 0, 63, 65, 71, 70, 112, 108, 106, 191, 0, 187, 183, 184, 0, 0, 179, 0, 177, 130, 0, 0, 0, 0, 0, 0, 0, 23, 0, 22, 0, 26, 25, 0, 68, 0, 87, 97, 159, 83, 0, 87, 87, 88, 60, 73, 77, 0, 80, 0, 78, 0, 0, 0, 196, 198, 0, 0, 212, 0, 216, 117, 120, 121, 103, 93, 69, 0, 189, 0, 163, 178, 0, 36, 0, 33, 39, 31, 42, 34, 44, 46, 0, 30, 69, 0, 0, 161, 84, 85, 66, 89, 0, 75, 0, 79, 160, 0, 61, 0, 0, 0, 213, 94, 192, 0, 188, 180, 0, 0, 0, 98, 0, 91, 0, 74, 0, 81, 162, 197, 199, 0, 0, 214, 190, 0, 32, 35, 99, 0, 90, 76, 201, 0, 181, 92, 200 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -312, -312, 372, -312, 8, 396, -312, 417, 144, -106, 145, 298, 142, -155, -4, -3, -312, 440, 375, -6, 439, -25, -312, -312, 268, -311, -250, 389, 299, -312, -312, -167, -312, -233, -312, -312, 361, -312, -176, 370, -312, -5, -312, -98, 328, -312, -312, -22, -82, -189, -312, -312, -312, 76 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { 0, 1, 2, 58, 52, 37, 38, 39, 242, 243, 248, 249, 253, 254, 64, 65, 66, 40, 41, 42, 43, 196, 173, 104, 105, 106, 293, 44, 294, 339, 340, 265, 266, 267, 45, 46, 192, 47, 186, 187, 60, 48, 138, 139, 140, 207, 208, 49, 50, 51, 180, 349, 412, 181 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule whose number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { 53, 54, 55, 56, 87, 57, 179, 61, 257, 281, 36, 97, 69, 70, 75, 81, 101, 62, 4, 338, 59, 73, 381, 67, 151, 92, 74, 93, 291, 79, 329, 83, 364, -57, 146, 4, 168, 62, 241, 151, -47, 71, 235, 347, 9, 95, 36, 9, -47, 260, 383, 250, 161, 167, 97, 147, 255, 148, 384, 172, 251, 9, 262, 152, 9, 3, 36, 78, 263, 403, 251, 68, 94, 328, 95, 260, 96, 365, 157, 167, 174, 175, 178, 95, 252, 167, 63, 382, 264, 188, 63, 193, 162, 325, 256, 311, 36, 312, 378, 379, 163, 355, 188, 342, 203, 204, 63, 352, 353, 209, 72, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 406, 407, 308, 193, 290, -49, 236, 377, -49, 238, 263, 239, 244, 324, 273, 245, 246, 244, 386, 263, 420, 341, 244, 205, 206, 376, 79, 263, 375, 261, 264, 79, 268, 393, 263, 425, 79, 95, 36, 264, 76, 155, 269, 79, 270, 85, 188, 264, 194, 326, 153, 285, 4, 154, 264, 327, 5, 6, 107, 295, 108, 170, 109, 350, 408, 171, 299, 301, 77, 82, 282, 296, 283, 283, 7, 8, 284, 284, 9, 86, 88, 10, 330, 400, 331, 313, 4, 314, 332, 11, 143, 12, 305, 237, 89, 90, 194, 13, 309, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 102, 25, 26, 27, 28, 29, 30, 31, 344, 345, 32, 33, 34, 35, 195, 12, 333, 103, 167, 356, 295, 331, 94, 343, 95, 332, 142, 346, 19, 348, 79, 351, 23, 318, 188, 188, 319, 374, 354, 331, 387, 31, 331, 332, 32, 33, 332, 402, 260, 331, 141, 358, 167, 332, 318, 360, 318, 322, 362, 417, 363, 133, 244, 4, 156, 158, 179, 5, 6, 129, 130, 131, 132, 133, 79, 315, 79, 312, 127, 128, 129, 130, 131, 132, 133, 7, 8, 159, 295, 9, 11, 160, 10, 137, 320, 323, 312, 314, 391, 166, 269, 335, 12, 168, 189, 336, 169, 95, 394, 337, 396, 176, 94, 145, 95, 19, 96, 194, 197, 23, 198, 201, 137, 409, 240, 247, 191, 272, 31, 276, 277, 32, 33, 278, 279, 295, 295, 4, 280, 286, 289, 5, 6, 297, 302, 422, 414, 303, 310, 415, 151, 316, 264, 317, 321, 295, 367, 426, 369, 7, 8, 370, 251, 9, 373, 372, 10, 380, 385, 399, 295, 404, 389, 392, 11, 258, 12, 401, 410, 405, 416, 418, 13, 419, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 421, 25, 26, 27, 28, 29, 30, 31, 423, 164, 32, 33, 34, 35, 4, 144, 100, 366, 5, 6, 368, 371, 80, 84, 177, 259, 292, 165, 234, 413, 0, 202, 271, 0, 0, 0, 7, 8, 200, 0, 9, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 0, 0, 0, 0, 13, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 0, 25, 26, 27, 28, 29, 30, 31, 0, 0, 32, 33, 34, 35, 4, 0, 0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 9, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 0, 0, 0, 0, 13, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 0, 25, 26, 27, 28, 29, 30, 31, 0, 0, 32, 33, 98, 99, 4, 0, 183, 0, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 9, 0, 9, 10, 0, 10, 0, 0, 0, 0, 0, 11, 0, 12, 0, 12, 184, 0, 0, 13, 0, 0, 185, 0, 0, 0, 19, 0, 19, 0, 23, 24, 23, 25, 26, 27, 28, 29, 30, 31, 0, 31, 32, 33, 32, 33, 4, 0, 183, 0, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 9, 0, 9, 10, 0, 10, 0, 190, 0, 0, 0, 0, 0, 12, 0, 12, 199, 0, 191, 0, 0, 0, 185, 0, 0, 0, 19, 0, 19, 4, 23, 4, 23, 5, 6, 5, 6, 0, 0, 31, 0, 31, 32, 33, 32, 33, 0, 0, 0, 0, 0, 7, 8, 7, 8, 9, 0, 9, 10, 0, 10, 0, 0, 0, 190, 0, 0, 0, 12, 0, 12, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 19, 0, 19, 0, 23, 0, 23, 0, 0, 0, 0, 0, 0, 31, 0, 31, 32, 33, 32, 33, 4, 0, 4, 0, 5, 6, 5, 6, 0, 0, 231, 0, 111, 112, 113, 114, 115, 0, 0, 0, 0, 0, 7, 8, 7, 8, 9, 0, 9, 10, 0, 10, 127, 128, 129, 130, 131, 132, 133, 12, 0, 12, 0, 0, 0, 0, 191, 137, 0, 0, 0, 0, 19, 0, 19, 4, 23, 4, 23, 5, 6, 5, 6, 0, 0, 31, 300, 31, 32, 33, 32, 33, 0, 0, 0, 0, 0, 7, 8, 7, 8, 9, 0, 9, 10, 0, 10, 0, 0, 0, 0, 0, 269, 0, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 4, 23, 183, 23, 5, 6, 5, 6, 0, 0, 31, 0, 31, 32, 33, 32, 33, 0, 0, 0, 0, 0, 7, 8, 7, 8, 9, 0, 9, 10, 0, 10, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 0, 23, 0, 23, 0, 0, 0, 0, 0, 0, 31, 0, 31, 32, 33, 32, 33, 110, 111, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 0, 137, 110, 111, 112, 113, 114, 115, 0, 182, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 287, 0, 0, 0, 137, 110, 111, 112, 113, 114, 115, 288, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 287, 0, 0, 0, 137, 110, 111, 112, 113, 114, 115, 298, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 0, 137, 110, 111, 112, 113, 114, 115, 334, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 0, 137, 110, 111, 112, 113, 114, 115, 388, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 0, 137, 0, 0, 149, 0, 150, 110, 111, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 0, 137, 306, 0, 0, 0, 307, 110, 111, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 0, 137, 397, 0, 0, 0, 398, 110, 111, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 0, 137, 0, 0, 274, 110, 111, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 0, 137, 0, 0, 275, 110, 111, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 0, 137, 0, 0, 390, 110, 111, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 0, 137, 0, 0, 411, 110, 111, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 0, 137, 361, 110, 111, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 0, 137, 424, 110, 111, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 304, 0, 0, 0, 137, 110, 111, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 110, 137, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 357, 137, 110, 0, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 359, 137, 110, 0, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 395, 137, 110, 0, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 135, 136, 0, 0, 0, 0, 137, 111, 112, 113, 114, 115, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 0, 0, 136, 0, 0, 0, 0, 137, 111, 112, 113, 114, 115, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 111, 112, 113, 114, 115, 0, 0, 137, 0, 0, 0, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 111, 112, 113, 114, 115, 0, 0, 137, 0, 0, 0, 0, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 111, 112, 113, 114, 115, 0, 0, 137, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 111, 112, 113, 114, 115, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 111, 112, 113, 114, 115, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 127, 128, 129, 130, 131, 132, 133, 134, 111, 112, 113, 114, 115, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 127, 128, 129, 130, 131, 132, 133, 0, 0, 0, 0, 0, 0, 0, 0, 137 }; static const yytype_int16 yycheck[] = { 5, 6, 7, 8, 26, 10, 88, 12, 163, 185, 2, 36, 16, 16, 18, 21, 38, 3, 3, 269, 12, 3, 333, 15, 3, 30, 18, 32, 195, 21, 263, 23, 3, 3, 59, 3, 3, 3, 3, 3, 42, 3, 140, 36, 29, 44, 38, 29, 50, 42, 41, 157, 51, 46, 79, 43, 162, 45, 49, 84, 3, 29, 43, 42, 29, 0, 58, 52, 49, 380, 3, 57, 42, 262, 44, 42, 46, 48, 42, 46, 85, 86, 88, 44, 27, 46, 72, 337, 69, 94, 72, 96, 42, 260, 27, 43, 88, 45, 331, 332, 50, 290, 107, 270, 109, 110, 72, 283, 284, 114, 72, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 384, 385, 234, 142, 43, 45, 145, 330, 48, 148, 49, 150, 152, 43, 173, 153, 153, 157, 341, 49, 404, 43, 162, 10, 11, 326, 152, 49, 43, 169, 69, 157, 171, 356, 49, 419, 162, 44, 164, 69, 40, 48, 40, 169, 42, 42, 185, 69, 46, 42, 45, 190, 3, 48, 69, 48, 7, 8, 42, 198, 44, 42, 46, 279, 387, 46, 205, 206, 3, 3, 43, 43, 45, 45, 25, 26, 49, 49, 29, 42, 42, 32, 43, 372, 45, 43, 3, 45, 49, 40, 41, 42, 231, 43, 48, 48, 46, 48, 237, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 48, 62, 63, 64, 65, 66, 67, 68, 274, 275, 71, 72, 73, 74, 42, 42, 266, 3, 46, 43, 269, 45, 42, 272, 44, 49, 46, 276, 55, 278, 266, 280, 59, 45, 283, 284, 48, 43, 287, 45, 43, 68, 45, 49, 71, 72, 49, 43, 42, 45, 48, 300, 46, 49, 45, 304, 45, 48, 307, 48, 310, 31, 312, 3, 42, 48, 392, 7, 8, 27, 28, 29, 30, 31, 310, 43, 312, 45, 25, 26, 27, 28, 29, 30, 31, 25, 26, 48, 337, 29, 40, 48, 32, 40, 43, 43, 45, 45, 347, 42, 40, 41, 42, 3, 3, 45, 34, 44, 357, 49, 359, 62, 42, 43, 44, 55, 46, 46, 45, 59, 34, 3, 40, 389, 3, 3, 47, 46, 68, 42, 3, 71, 72, 48, 45, 384, 385, 3, 34, 47, 47, 7, 8, 47, 5, 411, 395, 5, 34, 398, 3, 3, 69, 48, 48, 404, 48, 423, 48, 25, 26, 3, 3, 29, 48, 50, 32, 3, 45, 3, 419, 34, 61, 48, 40, 41, 42, 48, 48, 41, 48, 48, 48, 34, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 41, 62, 63, 64, 65, 66, 67, 68, 43, 76, 71, 72, 73, 74, 3, 58, 38, 312, 7, 8, 314, 318, 21, 23, 88, 166, 197, 77, 139, 392, -1, 109, 172, -1, -1, -1, 25, 26, 107, -1, 29, -1, -1, 32, -1, -1, -1, -1, -1, -1, -1, 40, -1, 42, -1, -1, -1, -1, -1, 48, -1, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, -1, 62, 63, 64, 65, 66, 67, 68, -1, -1, 71, 72, 73, 74, 3, -1, -1, -1, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, 26, -1, -1, 29, -1, -1, 32, -1, -1, -1, -1, -1, -1, -1, 40, -1, 42, -1, -1, -1, -1, -1, 48, -1, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, -1, 62, 63, 64, 65, 66, 67, 68, -1, -1, 71, 72, 73, 74, 3, -1, 3, -1, 7, 8, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, 26, 25, 26, 29, -1, 29, 32, -1, 32, -1, -1, -1, -1, -1, 40, -1, 42, -1, 42, 43, -1, -1, 48, -1, -1, 49, -1, -1, -1, 55, -1, 55, -1, 59, 60, 59, 62, 63, 64, 65, 66, 67, 68, -1, 68, 71, 72, 71, 72, 3, -1, 3, -1, 7, 8, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, 26, 25, 26, 29, -1, 29, 32, -1, 32, -1, 36, -1, -1, -1, -1, -1, 42, -1, 42, 43, -1, 47, -1, -1, -1, 49, -1, -1, -1, 55, -1, 55, 3, 59, 3, 59, 7, 8, 7, 8, -1, -1, 68, -1, 68, 71, 72, 71, 72, -1, -1, -1, -1, -1, 25, 26, 25, 26, 29, -1, 29, 32, -1, 32, -1, -1, -1, 36, -1, -1, -1, 42, -1, 42, -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, 55, -1, 55, -1, 59, -1, 59, -1, -1, -1, -1, -1, -1, 68, -1, 68, 71, 72, 71, 72, 3, -1, 3, -1, 7, 8, 7, 8, -1, -1, 13, -1, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, 25, 26, 25, 26, 29, -1, 29, 32, -1, 32, 25, 26, 27, 28, 29, 30, 31, 42, -1, 42, -1, -1, -1, -1, 47, 40, -1, -1, -1, -1, 55, -1, 55, 3, 59, 3, 59, 7, 8, 7, 8, -1, -1, 68, 12, 68, 71, 72, 71, 72, -1, -1, -1, -1, -1, 25, 26, 25, 26, 29, -1, 29, 32, -1, 32, -1, -1, -1, -1, -1, 40, -1, 42, -1, 42, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, -1, 55, 3, 59, 3, 59, 7, 8, 7, 8, -1, -1, 68, -1, 68, 71, 72, 71, 72, -1, -1, -1, -1, -1, 25, 26, 25, 26, 29, -1, 29, 32, -1, 32, -1, -1, -1, -1, -1, -1, -1, 42, -1, 42, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, -1, 55, -1, 59, -1, 59, -1, -1, -1, -1, -1, -1, 68, -1, 68, 71, 72, 71, 72, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, -1, 40, 4, 5, 6, 7, 8, 9, -1, 48, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, 36, -1, -1, -1, 40, 4, 5, 6, 7, 8, 9, 47, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, 36, -1, -1, -1, 40, 4, 5, 6, 7, 8, 9, 47, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, -1, 40, 4, 5, 6, 7, 8, 9, 47, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, -1, 40, 4, 5, 6, 7, 8, 9, 47, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, -1, 40, -1, -1, 43, -1, 45, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, -1, 40, 41, -1, -1, -1, 45, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, -1, 40, 41, -1, -1, -1, 45, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, -1, 40, -1, -1, 43, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, -1, 40, -1, -1, 43, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, -1, 40, -1, -1, 43, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, -1, 40, -1, -1, 43, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, -1, 40, 41, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, -1, 40, 41, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, 36, -1, -1, -1, 40, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, 4, 40, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, 39, 40, 4, -1, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, 39, 40, 4, -1, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, 39, 40, 4, -1, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, -1, -1, -1, -1, 40, 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, 35, -1, -1, -1, -1, 40, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 5, 6, 7, 8, 9, -1, -1, 40, -1, -1, -1, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 5, 6, 7, 8, 9, -1, -1, 40, -1, -1, -1, -1, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 5, 6, 7, 8, 9, -1, -1, 40, -1, -1, -1, -1, -1, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 5, 6, 7, 8, 9, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 5, 6, 7, 8, 9, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, 5, 6, 7, 8, 9, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, -1, -1, -1, -1, -1, -1, -1, -1, 40 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 78, 79, 0, 3, 7, 8, 25, 26, 29, 32, 40, 42, 48, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 74, 81, 82, 83, 84, 94, 95, 96, 97, 104, 111, 112, 114, 118, 124, 125, 126, 81, 118, 118, 118, 118, 118, 80, 81, 117, 118, 3, 72, 91, 92, 93, 81, 57, 91, 92, 3, 72, 3, 81, 91, 40, 3, 52, 81, 94, 96, 3, 81, 97, 42, 42, 124, 42, 48, 48, 48, 118, 118, 42, 44, 46, 98, 73, 74, 84, 124, 48, 3, 100, 101, 102, 42, 44, 46, 4, 5, 6, 7, 8, 9, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 40, 119, 120, 121, 48, 46, 41, 82, 43, 98, 43, 45, 43, 45, 3, 42, 45, 48, 48, 42, 42, 48, 48, 48, 51, 42, 50, 79, 104, 42, 46, 3, 34, 42, 46, 98, 99, 118, 118, 62, 95, 96, 125, 127, 130, 48, 3, 43, 49, 115, 116, 118, 3, 36, 47, 113, 118, 46, 42, 98, 45, 34, 43, 116, 3, 113, 118, 118, 10, 11, 122, 123, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 13, 118, 118, 121, 120, 118, 43, 118, 118, 3, 3, 85, 86, 96, 91, 92, 3, 87, 88, 86, 3, 27, 89, 90, 86, 27, 90, 41, 88, 42, 96, 43, 49, 69, 108, 109, 110, 118, 40, 42, 105, 46, 98, 43, 43, 42, 3, 48, 45, 34, 115, 43, 45, 49, 118, 47, 36, 47, 47, 43, 108, 101, 103, 105, 118, 43, 47, 47, 118, 12, 118, 5, 5, 36, 118, 41, 45, 120, 118, 34, 43, 45, 43, 45, 43, 3, 48, 45, 48, 43, 48, 48, 43, 43, 108, 42, 48, 126, 110, 43, 45, 49, 96, 47, 41, 45, 49, 103, 106, 107, 43, 108, 118, 124, 124, 118, 36, 118, 128, 125, 118, 115, 115, 118, 126, 43, 39, 118, 39, 118, 41, 118, 96, 3, 48, 85, 48, 87, 48, 3, 89, 50, 48, 43, 43, 108, 126, 110, 110, 3, 102, 103, 41, 49, 45, 126, 43, 47, 61, 43, 118, 48, 126, 118, 39, 118, 41, 45, 3, 90, 48, 43, 102, 34, 41, 103, 103, 126, 124, 48, 43, 129, 130, 118, 118, 48, 48, 48, 34, 103, 41, 124, 43, 41, 103, 124 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ static const yytype_uint8 yyr1[] = { 0, 77, 78, 79, 79, 80, 80, 81, 81, 81, 82, 82, 82, 82, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 86, 86, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 95, 96, 96, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 102, 102, 103, 103, 104, 105, 105, 105, 105, 106, 106, 106, 107, 107, 108, 108, 108, 108, 109, 109, 110, 110, 110, 110, 110, 111, 111, 112, 112, 112, 112, 112, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 116, 116, 116, 116, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 120, 120, 120, 120, 121, 121, 121, 121, 121, 122, 122, 122, 122, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 126, 127, 127, 127, 128, 128, 129, 129, 130, 130 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ static const yytype_int8 yyr2[] = { 0, 2, 1, 0, 2, 0, 2, 1, 3, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 3, 5, 5, 3, 5, 5, 3, 3, 3, 6, 6, 8, 6, 6, 8, 3, 1, 1, 3, 1, 1, 3, 1, 3, 1, 3, 1, 1, 1, 3, 1, 3, 2, 2, 1, 2, 1, 2, 3, 3, 4, 1, 3, 1, 3, 1, 2, 3, 4, 1, 1, 3, 2, 4, 3, 5, 1, 1, 2, 1, 3, 1, 2, 3, 3, 1, 0, 2, 3, 5, 4, 6, 5, 6, 3, 2, 5, 7, 8, 1, 2, 2, 3, 3, 4, 4, 4, 4, 3, 4, 3, 4, 3, 3, 1, 1, 3, 1, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 4, 5, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 4, 3, 4, 5, 6, 6, 7, 5, 3, 3, 3, 2, 2, 2, 2, 3, 4, 1, 1, 2, 2, 3, 4, 3, 5, 7, 1, 3, 3, 1, 1, 2, 4, 3, 5, 2, 4, 1, 1, 2, 5, 7, 5, 7, 9, 8, 2, 2, 2, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 3 }; enum { YYENOMEM = -2 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab #define YYNOMEM goto yyexhaustedlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (yylen); \ yystate = *yyssp; \ goto yybackup; \ } \ else \ { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (0) /* Backward compatibility with an undocumented macro. Use YYerror or YYUNDEF. */ #define YYERRCODE YYUNDEF /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Kind, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) /*-----------------------------------. | Print this symbol's value on YYO. | `-----------------------------------*/ static void yy_symbol_value_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) { FILE *yyoutput = yyo; YY_USE (yyoutput); if (!yyvaluep) return; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YY_USE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } /*---------------------------. | Print this symbol on YYO. | `---------------------------*/ static void yy_symbol_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) { YYFPRINTF (yyo, "%s %s (", yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); yy_symbol_value_print (yyo, yykind, yyvaluep); YYFPRINTF (yyo, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ static void yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ static void yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, int yyrule) { int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), &yyvsp[(yyi + 1) - (yynrhs)]); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyssp, yyvsp, Rule); \ } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) ((void) 0) # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ static void yydestruct (const char *yymsg, yysymbol_kind_t yykind, YYSTYPE *yyvaluep) { YY_USE (yyvaluep); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YY_USE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } /* Lookahead token kind. */ int yychar; /* The semantic value of the lookahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ int yyparse (void) { yy_state_fast_t yystate = 0; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus = 0; /* Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* Their size. */ YYPTRDIFF_T yystacksize = YYINITDEPTH; /* The state stack: array, bottom, top. */ yy_state_t yyssa[YYINITDEPTH]; yy_state_t *yyss = yyssa; yy_state_t *yyssp = yyss; /* The semantic value stack: array, bottom, top. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp = yyvs; int yyn; /* The return value of yyparse. */ int yyresult; /* Lookahead symbol kind. */ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; /*------------------------------------------------------------. | yynewstate -- push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; /*--------------------------------------------------------------------. | yysetstate -- set current state (the top of the stack) to yystate. | `--------------------------------------------------------------------*/ yysetstate: YYDPRINTF ((stderr, "Entering state %d\n", yystate)); YY_ASSERT (0 <= yystate && yystate < YYNSTATES); YY_IGNORE_USELESS_CAST_BEGIN *yyssp = YY_CAST (yy_state_t, yystate); YY_IGNORE_USELESS_CAST_END YY_STACK_PRINT (yyss, yyssp); if (yyss + yystacksize - 1 <= yyssp) #if !defined yyoverflow && !defined YYSTACK_RELOCATE YYNOMEM; #else { /* Get the current used size of the three stacks, in elements. */ YYPTRDIFF_T yysize = yyssp - yyss + 1; # if defined yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ yy_state_t *yyss1 = yyss; YYSTYPE *yyvs1 = yyvs; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * YYSIZEOF (*yyssp), &yyvs1, yysize * YYSIZEOF (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } # else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) YYNOMEM; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yy_state_t *yyss1 = yyss; union yyalloc *yyptr = YY_CAST (union yyalloc *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); if (! yyptr) YYNOMEM; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YY_IGNORE_USELESS_CAST_BEGIN YYDPRINTF ((stderr, "Stack size increased to %ld\n", YY_CAST (long, yystacksize))); YY_IGNORE_USELESS_CAST_END if (yyss + yystacksize - 1 <= yyssp) YYABORT; } #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token\n")); yychar = yylex (); } if (yychar <= YYEOF) { yychar = YYEOF; yytoken = YYSYMBOL_YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else if (yychar == YYerror) { /* The scanner already issued an error message, process directly to error recovery. But do not keep the error token as lookahead, it is too special and may lead us to an endless loop in error recovery. */ yychar = YYUNDEF; yytoken = YYSYMBOL_YYerror; goto yyerrlab1; } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); yystate = yyn; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Discard the shifted token. */ yychar = YYEMPTY; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: /* file: fileblock */ #line 195 "camp.y" { absyntax::root = (yyvsp[0].b); } #line 1851 "camp.tab.cc" break; case 3: /* fileblock: %empty */ #line 199 "camp.y" { (yyval.b) = new file(lexerPos(), false); } #line 1857 "camp.tab.cc" break; case 4: /* fileblock: fileblock runnable */ #line 201 "camp.y" { (yyval.b) = (yyvsp[-1].b); (yyval.b)->add((yyvsp[0].run)); } #line 1863 "camp.tab.cc" break; case 5: /* bareblock: %empty */ #line 205 "camp.y" { (yyval.b) = new block(lexerPos(), true); } #line 1869 "camp.tab.cc" break; case 6: /* bareblock: bareblock runnable */ #line 207 "camp.y" { (yyval.b) = (yyvsp[-1].b); (yyval.b)->add((yyvsp[0].run)); } #line 1875 "camp.tab.cc" break; case 7: /* name: ID */ #line 211 "camp.y" { (yyval.n) = new simpleName((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); } #line 1881 "camp.tab.cc" break; case 8: /* name: name '.' ID */ #line 212 "camp.y" { (yyval.n) = new qualifiedName((yyvsp[-1].pos), (yyvsp[-2].n), (yyvsp[0].ps).sym); } #line 1887 "camp.tab.cc" break; case 9: /* name: '%' */ #line 213 "camp.y" { (yyval.n) = new simpleName((yyvsp[0].ps).pos, symbol::trans("operator answer")); } #line 1894 "camp.tab.cc" break; case 10: /* runnable: dec */ #line 218 "camp.y" { (yyval.run) = (yyvsp[0].d); } #line 1900 "camp.tab.cc" break; case 11: /* runnable: stm */ #line 219 "camp.y" { (yyval.run) = (yyvsp[0].s); } #line 1906 "camp.tab.cc" break; case 12: /* runnable: modifiers dec */ #line 221 "camp.y" { (yyval.run) = new modifiedRunnable((yyvsp[-1].ml)->getPos(), (yyvsp[-1].ml), (yyvsp[0].d)); } #line 1912 "camp.tab.cc" break; case 13: /* runnable: modifiers stm */ #line 223 "camp.y" { (yyval.run) = new modifiedRunnable((yyvsp[-1].ml)->getPos(), (yyvsp[-1].ml), (yyvsp[0].s)); } #line 1918 "camp.tab.cc" break; case 14: /* modifiers: MODIFIER */ #line 227 "camp.y" { (yyval.ml) = new modifierList((yyvsp[0].mod).pos); (yyval.ml)->add((yyvsp[0].mod).val); } #line 1924 "camp.tab.cc" break; case 15: /* modifiers: PERM */ #line 228 "camp.y" { (yyval.ml) = new modifierList((yyvsp[0].perm).pos); (yyval.ml)->add((yyvsp[0].perm).val); } #line 1930 "camp.tab.cc" break; case 16: /* modifiers: modifiers MODIFIER */ #line 230 "camp.y" { (yyval.ml) = (yyvsp[-1].ml); (yyval.ml)->add((yyvsp[0].mod).val); } #line 1936 "camp.tab.cc" break; case 17: /* modifiers: modifiers PERM */ #line 232 "camp.y" { (yyval.ml) = (yyvsp[-1].ml); (yyval.ml)->add((yyvsp[0].perm).val); } #line 1942 "camp.tab.cc" break; case 18: /* dec: vardec */ #line 236 "camp.y" { (yyval.d) = (yyvsp[0].vd); } #line 1948 "camp.tab.cc" break; case 19: /* dec: fundec */ #line 237 "camp.y" { (yyval.d) = (yyvsp[0].d); } #line 1954 "camp.tab.cc" break; case 20: /* dec: typedec */ #line 238 "camp.y" { (yyval.d) = (yyvsp[0].d); } #line 1960 "camp.tab.cc" break; case 21: /* dec: ACCESS stridpairlist ';' */ #line 240 "camp.y" { (yyval.d) = new accessdec((yyvsp[-2].pos), (yyvsp[-1].ipl)); } #line 1966 "camp.tab.cc" break; case 22: /* dec: FROM name UNRAVEL idpairlist ';' */ #line 242 "camp.y" { (yyval.d) = new unraveldec((yyvsp[-4].pos), (yyvsp[-3].n), (yyvsp[-1].ipl)); } #line 1972 "camp.tab.cc" break; case 23: /* dec: FROM name UNRAVEL '*' ';' */ #line 244 "camp.y" { (yyval.d) = new unraveldec((yyvsp[-4].pos), (yyvsp[-3].n), WILDCARD); } #line 1978 "camp.tab.cc" break; case 24: /* dec: UNRAVEL name ';' */ #line 245 "camp.y" { (yyval.d) = new unraveldec((yyvsp[-2].pos), (yyvsp[-1].n), WILDCARD); } #line 1984 "camp.tab.cc" break; case 25: /* dec: FROM strid ACCESS idpairlist ';' */ #line 247 "camp.y" { (yyval.d) = new fromaccessdec((yyvsp[-4].pos), (yyvsp[-3].ps).sym, (yyvsp[-1].ipl)); } #line 1990 "camp.tab.cc" break; case 26: /* dec: FROM strid ACCESS '*' ';' */ #line 249 "camp.y" { (yyval.d) = new fromaccessdec((yyvsp[-4].pos), (yyvsp[-3].ps).sym, WILDCARD); } #line 1996 "camp.tab.cc" break; case 27: /* dec: IMPORT stridpair ';' */ #line 251 "camp.y" { (yyval.d) = new importdec((yyvsp[-2].pos), (yyvsp[-1].ip)); } #line 2002 "camp.tab.cc" break; case 28: /* dec: INCLUDE ID ';' */ #line 252 "camp.y" { (yyval.d) = new includedec((yyvsp[-2].pos), (yyvsp[-1].ps).sym); } #line 2008 "camp.tab.cc" break; case 29: /* dec: INCLUDE STRING ';' */ #line 254 "camp.y" { (yyval.d) = new includedec((yyvsp[-2].pos), (yyvsp[-1].stre)->getString()); } #line 2014 "camp.tab.cc" break; case 30: /* dec: TYPEDEF IMPORT '(' typeparamlist ')' ';' */ #line 258 "camp.y" { (yyval.d) = new receiveTypedefDec((yyvsp[-5].pos), (yyvsp[-2].tps)); } #line 2020 "camp.tab.cc" break; case 31: /* dec: IMPORT TYPEDEF '(' typeparamlist ')' ';' */ #line 260 "camp.y" { (yyval.d) = new badDec((yyvsp[-5].pos), (yyvsp[-5].pos), "Expected 'typedef import();'"); } #line 2028 "camp.tab.cc" break; case 32: /* dec: ACCESS strid '(' decdeclist ')' ID ID ';' */ #line 265 "camp.y" { (yyval.d) = new templateAccessDec( (yyvsp[-7].pos), (yyvsp[-6].ps).sym, (yyvsp[-4].fls), (yyvsp[-2].ps).sym, (yyvsp[-1].ps).sym, (yyvsp[-2].ps).pos ); } #line 2036 "camp.tab.cc" break; case 33: /* dec: ACCESS strid '(' decdeclist ')' ';' */ #line 269 "camp.y" { (yyval.d) = new badDec((yyvsp[-5].pos), (yyvsp[0].pos), "expected 'as'"); } #line 2042 "camp.tab.cc" break; case 34: /* dec: IMPORT strid '(' decdeclist ')' ';' */ #line 271 "camp.y" { (yyval.d) = new badDec((yyvsp[-5].pos), (yyvsp[-5].pos), "Parametrized imports disallowed to reduce naming " "conflicts. Try " "'access () as ;'." ); } #line 2052 "camp.tab.cc" break; case 35: /* dec: FROM strid '(' decdeclist ')' ACCESS idpairlist ';' */ #line 277 "camp.y" { (yyval.d) = new fromaccessdec((yyvsp[-7].pos), (yyvsp[-6].ps).sym, (yyvsp[-1].ipl), (yyvsp[-4].fls)); } #line 2058 "camp.tab.cc" break; case 36: /* decdec: ID ASSIGN type */ #line 283 "camp.y" { (yyval.fl) = new formal( (yyvsp[-2].ps).pos, (yyvsp[0].t), new decidstart((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym) ); } #line 2066 "camp.tab.cc" break; case 37: /* decdec: type */ #line 286 "camp.y" { (yyval.fl) = new formal((yyvsp[0].t)->getPos(), (yyvsp[0].t), nullptr); } #line 2072 "camp.tab.cc" break; case 38: /* decdeclist: decdec */ #line 291 "camp.y" { (yyval.fls) = new formals((yyvsp[0].fl)->getPos()); (yyval.fls)->add((yyvsp[0].fl)); } #line 2078 "camp.tab.cc" break; case 39: /* decdeclist: decdeclist ',' decdec */ #line 293 "camp.y" { (yyval.fls) = (yyvsp[-2].fls); (yyval.fls)->add((yyvsp[0].fl)); } #line 2084 "camp.tab.cc" break; case 40: /* typeparam: ID */ #line 297 "camp.y" { (yyval.tp) = new typeParam((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); } #line 2090 "camp.tab.cc" break; case 41: /* typeparamlist: typeparam */ #line 302 "camp.y" { (yyval.tps) = new typeParamList((yyvsp[0].tp)->getPos()); (yyval.tps)->add((yyvsp[0].tp)); } #line 2096 "camp.tab.cc" break; case 42: /* typeparamlist: typeparamlist ',' typeparam */ #line 304 "camp.y" { (yyval.tps) = (yyvsp[-2].tps); (yyval.tps)->add((yyvsp[0].tp)); } #line 2102 "camp.tab.cc" break; case 43: /* idpair: ID */ #line 308 "camp.y" { (yyval.ip) = new idpair((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); } #line 2108 "camp.tab.cc" break; case 44: /* idpair: ID ID ID */ #line 310 "camp.y" { (yyval.ip) = new idpair((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym, (yyvsp[-1].ps).sym , (yyvsp[0].ps).sym); } #line 2114 "camp.tab.cc" break; case 45: /* idpairlist: idpair */ #line 314 "camp.y" { (yyval.ipl) = new idpairlist(); (yyval.ipl)->add((yyvsp[0].ip)); } #line 2120 "camp.tab.cc" break; case 46: /* idpairlist: idpairlist ',' idpair */ #line 316 "camp.y" { (yyval.ipl) = (yyvsp[-2].ipl); (yyval.ipl)->add((yyvsp[0].ip)); } #line 2126 "camp.tab.cc" break; case 47: /* strid: ID */ #line 320 "camp.y" { (yyval.ps) = (yyvsp[0].ps); } #line 2132 "camp.tab.cc" break; case 48: /* strid: STRING */ #line 321 "camp.y" { (yyval.ps).pos = (yyvsp[0].stre)->getPos(); (yyval.ps).sym = symbol::literalTrans((yyvsp[0].stre)->getString()); } #line 2139 "camp.tab.cc" break; case 49: /* stridpair: ID */ #line 326 "camp.y" { (yyval.ip) = new idpair((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); } #line 2145 "camp.tab.cc" break; case 50: /* stridpair: strid ID ID */ #line 328 "camp.y" { (yyval.ip) = new idpair((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym, (yyvsp[-1].ps).sym , (yyvsp[0].ps).sym); } #line 2151 "camp.tab.cc" break; case 51: /* stridpairlist: stridpair */ #line 332 "camp.y" { (yyval.ipl) = new idpairlist(); (yyval.ipl)->add((yyvsp[0].ip)); } #line 2157 "camp.tab.cc" break; case 52: /* stridpairlist: stridpairlist ',' stridpair */ #line 334 "camp.y" { (yyval.ipl) = (yyvsp[-2].ipl); (yyval.ipl)->add((yyvsp[0].ip)); } #line 2163 "camp.tab.cc" break; case 53: /* vardec: barevardec ';' */ #line 338 "camp.y" { (yyval.vd) = (yyvsp[-1].vd); } #line 2169 "camp.tab.cc" break; case 54: /* barevardec: type decidlist */ #line 342 "camp.y" { (yyval.vd) = new vardec((yyvsp[-1].t)->getPos(), (yyvsp[-1].t), (yyvsp[0].dil)); } #line 2175 "camp.tab.cc" break; case 55: /* type: celltype */ #line 346 "camp.y" { (yyval.t) = (yyvsp[0].t); } #line 2181 "camp.tab.cc" break; case 56: /* type: name dims */ #line 347 "camp.y" { (yyval.t) = new arrayTy((yyvsp[-1].n), (yyvsp[0].dim)); } #line 2187 "camp.tab.cc" break; case 57: /* celltype: name */ #line 351 "camp.y" { (yyval.t) = new nameTy((yyvsp[0].n)); } #line 2193 "camp.tab.cc" break; case 58: /* dims: '[' ']' */ #line 355 "camp.y" { (yyval.dim) = new dimensions((yyvsp[-1].pos)); } #line 2199 "camp.tab.cc" break; case 59: /* dims: dims '[' ']' */ #line 356 "camp.y" { (yyval.dim) = (yyvsp[-2].dim); (yyval.dim)->increase(); } #line 2205 "camp.tab.cc" break; case 60: /* dimexps: '[' exp ']' */ #line 360 "camp.y" { (yyval.elist) = new explist((yyvsp[-2].pos)); (yyval.elist)->add((yyvsp[-1].e)); } #line 2211 "camp.tab.cc" break; case 61: /* dimexps: dimexps '[' exp ']' */ #line 362 "camp.y" { (yyval.elist) = (yyvsp[-3].elist); (yyval.elist)->add((yyvsp[-1].e)); } #line 2217 "camp.tab.cc" break; case 62: /* decidlist: decid */ #line 366 "camp.y" { (yyval.dil) = new decidlist((yyvsp[0].di)->getPos()); (yyval.dil)->add((yyvsp[0].di)); } #line 2223 "camp.tab.cc" break; case 63: /* decidlist: decidlist ',' decid */ #line 368 "camp.y" { (yyval.dil) = (yyvsp[-2].dil); (yyval.dil)->add((yyvsp[0].di)); } #line 2229 "camp.tab.cc" break; case 64: /* decid: decidstart */ #line 372 "camp.y" { (yyval.di) = new decid((yyvsp[0].dis)->getPos(), (yyvsp[0].dis)); } #line 2235 "camp.tab.cc" break; case 65: /* decid: decidstart ASSIGN varinit */ #line 374 "camp.y" { (yyval.di) = new decid((yyvsp[-2].dis)->getPos(), (yyvsp[-2].dis), (yyvsp[0].vi)); } #line 2241 "camp.tab.cc" break; case 66: /* decidstart: ID */ #line 378 "camp.y" { (yyval.dis) = new decidstart((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); } #line 2247 "camp.tab.cc" break; case 67: /* decidstart: ID dims */ #line 379 "camp.y" { (yyval.dis) = new decidstart((yyvsp[-1].ps).pos, (yyvsp[-1].ps).sym, (yyvsp[0].dim)); } #line 2253 "camp.tab.cc" break; case 68: /* decidstart: ID '(' ')' */ #line 380 "camp.y" { (yyval.dis) = new fundecidstart((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym, 0, new formals((yyvsp[-1].pos))); } #line 2260 "camp.tab.cc" break; case 69: /* decidstart: ID '(' formals ')' */ #line 383 "camp.y" { (yyval.dis) = new fundecidstart((yyvsp[-3].ps).pos, (yyvsp[-3].ps).sym, 0, (yyvsp[-1].fls)); } #line 2266 "camp.tab.cc" break; case 70: /* varinit: exp */ #line 387 "camp.y" { (yyval.vi) = (yyvsp[0].e); } #line 2272 "camp.tab.cc" break; case 71: /* varinit: arrayinit */ #line 388 "camp.y" { (yyval.vi) = (yyvsp[0].ai); } #line 2278 "camp.tab.cc" break; case 72: /* block: '{' bareblock '}' */ #line 393 "camp.y" { (yyval.b) = (yyvsp[-1].b); } #line 2284 "camp.tab.cc" break; case 73: /* arrayinit: '{' '}' */ #line 397 "camp.y" { (yyval.ai) = new arrayinit((yyvsp[-1].pos)); } #line 2290 "camp.tab.cc" break; case 74: /* arrayinit: '{' ELLIPSIS varinit '}' */ #line 399 "camp.y" { (yyval.ai) = new arrayinit((yyvsp[-3].pos)); (yyval.ai)->addRest((yyvsp[-1].vi)); } #line 2296 "camp.tab.cc" break; case 75: /* arrayinit: '{' basearrayinit '}' */ #line 401 "camp.y" { (yyval.ai) = (yyvsp[-1].ai); } #line 2302 "camp.tab.cc" break; case 76: /* arrayinit: '{' basearrayinit ELLIPSIS varinit '}' */ #line 403 "camp.y" { (yyval.ai) = (yyvsp[-3].ai); (yyval.ai)->addRest((yyvsp[-1].vi)); } #line 2308 "camp.tab.cc" break; case 77: /* basearrayinit: ',' */ #line 407 "camp.y" { (yyval.ai) = new arrayinit((yyvsp[0].pos)); } #line 2314 "camp.tab.cc" break; case 78: /* basearrayinit: varinits */ #line 408 "camp.y" { (yyval.ai) = (yyvsp[0].ai); } #line 2320 "camp.tab.cc" break; case 79: /* basearrayinit: varinits ',' */ #line 409 "camp.y" { (yyval.ai) = (yyvsp[-1].ai); } #line 2326 "camp.tab.cc" break; case 80: /* varinits: varinit */ #line 413 "camp.y" { (yyval.ai) = new arrayinit((yyvsp[0].vi)->getPos()); (yyval.ai)->add((yyvsp[0].vi));} #line 2333 "camp.tab.cc" break; case 81: /* varinits: varinits ',' varinit */ #line 416 "camp.y" { (yyval.ai) = (yyvsp[-2].ai); (yyval.ai)->add((yyvsp[0].vi)); } #line 2339 "camp.tab.cc" break; case 82: /* formals: formal */ #line 420 "camp.y" { (yyval.fls) = new formals((yyvsp[0].fl)->getPos()); (yyval.fls)->add((yyvsp[0].fl)); } #line 2345 "camp.tab.cc" break; case 83: /* formals: ELLIPSIS formal */ #line 421 "camp.y" { (yyval.fls) = new formals((yyvsp[-1].pos)); (yyval.fls)->addRest((yyvsp[0].fl)); } #line 2351 "camp.tab.cc" break; case 84: /* formals: formals ',' formal */ #line 423 "camp.y" { (yyval.fls) = (yyvsp[-2].fls); (yyval.fls)->add((yyvsp[0].fl)); } #line 2357 "camp.tab.cc" break; case 85: /* formals: formals ELLIPSIS formal */ #line 425 "camp.y" { (yyval.fls) = (yyvsp[-2].fls); (yyval.fls)->addRest((yyvsp[0].fl)); } #line 2363 "camp.tab.cc" break; case 86: /* explicitornot: EXPLICIT */ #line 429 "camp.y" { (yyval.boo) = true; } #line 2369 "camp.tab.cc" break; case 87: /* explicitornot: %empty */ #line 430 "camp.y" { (yyval.boo) = false; } #line 2375 "camp.tab.cc" break; case 88: /* formal: explicitornot type */ #line 435 "camp.y" { (yyval.fl) = new formal((yyvsp[0].t)->getPos(), (yyvsp[0].t), 0, 0, (yyvsp[-1].boo), 0); } #line 2381 "camp.tab.cc" break; case 89: /* formal: explicitornot type decidstart */ #line 437 "camp.y" { (yyval.fl) = new formal((yyvsp[-1].t)->getPos(), (yyvsp[-1].t), (yyvsp[0].dis), 0, (yyvsp[-2].boo), 0); } #line 2387 "camp.tab.cc" break; case 90: /* formal: explicitornot type decidstart ASSIGN varinit */ #line 439 "camp.y" { (yyval.fl) = new formal((yyvsp[-3].t)->getPos(), (yyvsp[-3].t), (yyvsp[-2].dis), (yyvsp[0].vi), (yyvsp[-4].boo), 0); } #line 2393 "camp.tab.cc" break; case 91: /* formal: explicitornot type ID decidstart */ #line 442 "camp.y" { bool k = checkKeyword((yyvsp[-1].ps).pos, (yyvsp[-1].ps).sym); (yyval.fl) = new formal((yyvsp[-2].t)->getPos(), (yyvsp[-2].t), (yyvsp[0].dis), 0, (yyvsp[-3].boo), k); } #line 2400 "camp.tab.cc" break; case 92: /* formal: explicitornot type ID decidstart ASSIGN varinit */ #line 445 "camp.y" { bool k = checkKeyword((yyvsp[-3].ps).pos, (yyvsp[-3].ps).sym); (yyval.fl) = new formal((yyvsp[-4].t)->getPos(), (yyvsp[-4].t), (yyvsp[-2].dis), (yyvsp[0].vi), (yyvsp[-5].boo), k); } #line 2407 "camp.tab.cc" break; case 93: /* fundec: type ID '(' ')' blockstm */ #line 451 "camp.y" { (yyval.d) = new fundec((yyvsp[-2].pos), (yyvsp[-4].t), (yyvsp[-3].ps).sym, new formals((yyvsp[-2].pos)), (yyvsp[0].s)); } #line 2413 "camp.tab.cc" break; case 94: /* fundec: type ID '(' formals ')' blockstm */ #line 453 "camp.y" { (yyval.d) = new fundec((yyvsp[-3].pos), (yyvsp[-5].t), (yyvsp[-4].ps).sym, (yyvsp[-2].fls), (yyvsp[0].s)); } #line 2419 "camp.tab.cc" break; case 95: /* typedec: STRUCT ID block */ #line 457 "camp.y" { (yyval.d) = new recorddec((yyvsp[-2].pos), (yyvsp[-1].ps).sym, (yyvsp[0].b)); } #line 2425 "camp.tab.cc" break; case 96: /* typedec: TYPEDEF vardec */ #line 458 "camp.y" { (yyval.d) = new typedec((yyvsp[-1].pos), (yyvsp[0].vd)); } #line 2431 "camp.tab.cc" break; case 97: /* typedec: USING ID ASSIGN type ';' */ #line 464 "camp.y" { decidstart *dis = new decidstart((yyvsp[-3].ps).pos, (yyvsp[-3].ps).sym); (yyval.d) = new typedec((yyvsp[-4].pos), dis, (yyvsp[-1].t)); } #line 2438 "camp.tab.cc" break; case 98: /* typedec: USING ID ASSIGN type '(' ')' ';' */ #line 467 "camp.y" { decidstart *dis = new fundecidstart((yyvsp[-5].ps).pos, (yyvsp[-5].ps).sym, 0, new formals((yyvsp[-2].pos))); (yyval.d) = new typedec((yyvsp[-6].pos), dis, (yyvsp[-3].t)); } #line 2446 "camp.tab.cc" break; case 99: /* typedec: USING ID ASSIGN type '(' formals ')' ';' */ #line 471 "camp.y" { decidstart *dis = new fundecidstart((yyvsp[-6].ps).pos, (yyvsp[-6].ps).sym, 0, (yyvsp[-2].fls)); (yyval.d) = new typedec((yyvsp[-7].pos), dis, (yyvsp[-4].t)); } #line 2453 "camp.tab.cc" break; case 100: /* slice: ':' */ #line 476 "camp.y" { (yyval.slice) = new slice((yyvsp[0].pos), 0, 0); } #line 2459 "camp.tab.cc" break; case 101: /* slice: exp ':' */ #line 477 "camp.y" { (yyval.slice) = new slice((yyvsp[0].pos), (yyvsp[-1].e), 0); } #line 2465 "camp.tab.cc" break; case 102: /* slice: ':' exp */ #line 478 "camp.y" { (yyval.slice) = new slice((yyvsp[-1].pos), 0, (yyvsp[0].e)); } #line 2471 "camp.tab.cc" break; case 103: /* slice: exp ':' exp */ #line 479 "camp.y" { (yyval.slice) = new slice((yyvsp[-1].pos), (yyvsp[-2].e), (yyvsp[0].e)); } #line 2477 "camp.tab.cc" break; case 104: /* value: value '.' ID */ #line 483 "camp.y" { (yyval.e) = new fieldExp((yyvsp[-1].pos), (yyvsp[-2].e), (yyvsp[0].ps).sym); } #line 2483 "camp.tab.cc" break; case 105: /* value: name '[' exp ']' */ #line 484 "camp.y" { (yyval.e) = new subscriptExp((yyvsp[-2].pos), new nameExp((yyvsp[-3].n)->getPos(), (yyvsp[-3].n)), (yyvsp[-1].e)); } #line 2490 "camp.tab.cc" break; case 106: /* value: value '[' exp ']' */ #line 486 "camp.y" { (yyval.e) = new subscriptExp((yyvsp[-2].pos), (yyvsp[-3].e), (yyvsp[-1].e)); } #line 2496 "camp.tab.cc" break; case 107: /* value: name '[' slice ']' */ #line 487 "camp.y" { (yyval.e) = new sliceExp((yyvsp[-2].pos), new nameExp((yyvsp[-3].n)->getPos(), (yyvsp[-3].n)), (yyvsp[-1].slice)); } #line 2503 "camp.tab.cc" break; case 108: /* value: value '[' slice ']' */ #line 489 "camp.y" { (yyval.e) = new sliceExp((yyvsp[-2].pos), (yyvsp[-3].e), (yyvsp[-1].slice)); } #line 2509 "camp.tab.cc" break; case 109: /* value: name '(' ')' */ #line 490 "camp.y" { (yyval.e) = new callExp((yyvsp[-1].pos), new nameExp((yyvsp[-2].n)->getPos(), (yyvsp[-2].n)), new arglist()); } #line 2517 "camp.tab.cc" break; case 110: /* value: name '(' arglist ')' */ #line 494 "camp.y" { (yyval.e) = new callExp((yyvsp[-2].pos), new nameExp((yyvsp[-3].n)->getPos(), (yyvsp[-3].n)), (yyvsp[-1].alist)); } #line 2525 "camp.tab.cc" break; case 111: /* value: value '(' ')' */ #line 497 "camp.y" { (yyval.e) = new callExp((yyvsp[-1].pos), (yyvsp[-2].e), new arglist()); } #line 2531 "camp.tab.cc" break; case 112: /* value: value '(' arglist ')' */ #line 499 "camp.y" { (yyval.e) = new callExp((yyvsp[-2].pos), (yyvsp[-3].e), (yyvsp[-1].alist)); } #line 2537 "camp.tab.cc" break; case 113: /* value: '(' exp ')' */ #line 501 "camp.y" { (yyval.e) = (yyvsp[-1].e); } #line 2543 "camp.tab.cc" break; case 114: /* value: '(' name ')' */ #line 503 "camp.y" { (yyval.e) = new nameExp((yyvsp[-1].n)->getPos(), (yyvsp[-1].n)); } #line 2549 "camp.tab.cc" break; case 115: /* value: THIS_TOK */ #line 504 "camp.y" { (yyval.e) = new thisExp((yyvsp[0].pos)); } #line 2555 "camp.tab.cc" break; case 116: /* argument: exp */ #line 508 "camp.y" { (yyval.arg).name = symbol::nullsym; (yyval.arg).val=(yyvsp[0].e); } #line 2561 "camp.tab.cc" break; case 117: /* argument: ID ASSIGN exp */ #line 509 "camp.y" { (yyval.arg).name = (yyvsp[-2].ps).sym; (yyval.arg).val=(yyvsp[0].e); } #line 2567 "camp.tab.cc" break; case 118: /* arglist: argument */ #line 513 "camp.y" { (yyval.alist) = new arglist(); (yyval.alist)->add((yyvsp[0].arg)); } #line 2573 "camp.tab.cc" break; case 119: /* arglist: ELLIPSIS argument */ #line 515 "camp.y" { (yyval.alist) = new arglist(); (yyval.alist)->addRest((yyvsp[0].arg)); } #line 2579 "camp.tab.cc" break; case 120: /* arglist: arglist ',' argument */ #line 517 "camp.y" { (yyval.alist) = (yyvsp[-2].alist); (yyval.alist)->add((yyvsp[0].arg)); } #line 2585 "camp.tab.cc" break; case 121: /* arglist: arglist ELLIPSIS argument */ #line 519 "camp.y" { (yyval.alist) = (yyvsp[-2].alist); (yyval.alist)->addRest((yyvsp[0].arg)); } #line 2591 "camp.tab.cc" break; case 122: /* tuple: exp ',' exp */ #line 524 "camp.y" { (yyval.alist) = new arglist(); (yyval.alist)->add((yyvsp[-2].e)); (yyval.alist)->add((yyvsp[0].e)); } #line 2597 "camp.tab.cc" break; case 123: /* tuple: tuple ',' exp */ #line 525 "camp.y" { (yyval.alist) = (yyvsp[-2].alist); (yyval.alist)->add((yyvsp[0].e)); } #line 2603 "camp.tab.cc" break; case 124: /* exp: name */ #line 529 "camp.y" { (yyval.e) = new nameExp((yyvsp[0].n)->getPos(), (yyvsp[0].n)); } #line 2609 "camp.tab.cc" break; case 125: /* exp: value */ #line 530 "camp.y" { (yyval.e) = (yyvsp[0].e); } #line 2615 "camp.tab.cc" break; case 126: /* exp: LIT */ #line 531 "camp.y" { (yyval.e) = (yyvsp[0].e); } #line 2621 "camp.tab.cc" break; case 127: /* exp: STRING */ #line 532 "camp.y" { (yyval.e) = (yyvsp[0].stre); } #line 2627 "camp.tab.cc" break; case 128: /* exp: LIT exp */ #line 534 "camp.y" { (yyval.e) = new scaleExp((yyvsp[-1].e)->getPos(), (yyvsp[-1].e), (yyvsp[0].e)); } #line 2633 "camp.tab.cc" break; case 129: /* exp: '(' name ')' exp */ #line 536 "camp.y" { (yyval.e) = new castExp((yyvsp[-2].n)->getPos(), new nameTy((yyvsp[-2].n)), (yyvsp[0].e)); } #line 2639 "camp.tab.cc" break; case 130: /* exp: '(' name dims ')' exp */ #line 538 "camp.y" { (yyval.e) = new castExp((yyvsp[-3].n)->getPos(), new arrayTy((yyvsp[-3].n), (yyvsp[-2].dim)), (yyvsp[0].e)); } #line 2645 "camp.tab.cc" break; case 131: /* exp: '+' exp */ #line 540 "camp.y" { (yyval.e) = new unaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym); } #line 2651 "camp.tab.cc" break; case 132: /* exp: '-' exp */ #line 542 "camp.y" { (yyval.e) = new unaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym); } #line 2657 "camp.tab.cc" break; case 133: /* exp: OPERATOR exp */ #line 543 "camp.y" { (yyval.e) = new unaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym); } #line 2663 "camp.tab.cc" break; case 134: /* exp: exp '+' exp */ #line 544 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2669 "camp.tab.cc" break; case 135: /* exp: exp '-' exp */ #line 545 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2675 "camp.tab.cc" break; case 136: /* exp: exp '*' exp */ #line 546 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2681 "camp.tab.cc" break; case 137: /* exp: exp '/' exp */ #line 547 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2687 "camp.tab.cc" break; case 138: /* exp: exp '%' exp */ #line 548 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2693 "camp.tab.cc" break; case 139: /* exp: exp '#' exp */ #line 549 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2699 "camp.tab.cc" break; case 140: /* exp: exp '^' exp */ #line 550 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2705 "camp.tab.cc" break; case 141: /* exp: exp LT exp */ #line 551 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2711 "camp.tab.cc" break; case 142: /* exp: exp LE exp */ #line 552 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2717 "camp.tab.cc" break; case 143: /* exp: exp GT exp */ #line 553 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2723 "camp.tab.cc" break; case 144: /* exp: exp GE exp */ #line 554 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2729 "camp.tab.cc" break; case 145: /* exp: exp EQ exp */ #line 555 "camp.y" { (yyval.e) = new equalityExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2735 "camp.tab.cc" break; case 146: /* exp: exp NEQ exp */ #line 556 "camp.y" { (yyval.e) = new equalityExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2741 "camp.tab.cc" break; case 147: /* exp: exp CAND exp */ #line 557 "camp.y" { (yyval.e) = new andExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2747 "camp.tab.cc" break; case 148: /* exp: exp COR exp */ #line 558 "camp.y" { (yyval.e) = new orExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2753 "camp.tab.cc" break; case 149: /* exp: exp CARETS exp */ #line 559 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2759 "camp.tab.cc" break; case 150: /* exp: exp AMPERSAND exp */ #line 560 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2765 "camp.tab.cc" break; case 151: /* exp: exp BAR exp */ #line 561 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2771 "camp.tab.cc" break; case 152: /* exp: exp OPERATOR exp */ #line 562 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2777 "camp.tab.cc" break; case 153: /* exp: exp INCR exp */ #line 563 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2783 "camp.tab.cc" break; case 154: /* exp: NEW celltype */ #line 565 "camp.y" { (yyval.e) = new newRecordExp((yyvsp[-1].pos), (yyvsp[0].t)); } #line 2789 "camp.tab.cc" break; case 155: /* exp: NEW celltype dimexps */ #line 567 "camp.y" { (yyval.e) = new newArrayExp((yyvsp[-2].pos), (yyvsp[-1].t), (yyvsp[0].elist), 0, 0); } #line 2795 "camp.tab.cc" break; case 156: /* exp: NEW celltype dimexps dims */ #line 569 "camp.y" { (yyval.e) = new newArrayExp((yyvsp[-3].pos), (yyvsp[-2].t), (yyvsp[-1].elist), (yyvsp[0].dim), 0); } #line 2801 "camp.tab.cc" break; case 157: /* exp: NEW celltype dims */ #line 571 "camp.y" { (yyval.e) = new newArrayExp((yyvsp[-2].pos), (yyvsp[-1].t), 0, (yyvsp[0].dim), 0); } #line 2807 "camp.tab.cc" break; case 158: /* exp: NEW celltype dims arrayinit */ #line 573 "camp.y" { (yyval.e) = new newArrayExp((yyvsp[-3].pos), (yyvsp[-2].t), 0, (yyvsp[-1].dim), (yyvsp[0].ai)); } #line 2813 "camp.tab.cc" break; case 159: /* exp: NEW celltype '(' ')' blockstm */ #line 575 "camp.y" { (yyval.e) = new newFunctionExp((yyvsp[-4].pos), (yyvsp[-3].t), new formals((yyvsp[-2].pos)), (yyvsp[0].s)); } #line 2819 "camp.tab.cc" break; case 160: /* exp: NEW celltype dims '(' ')' blockstm */ #line 577 "camp.y" { (yyval.e) = new newFunctionExp((yyvsp[-5].pos), new arrayTy((yyvsp[-4].t)->getPos(), (yyvsp[-4].t), (yyvsp[-3].dim)), new formals((yyvsp[-2].pos)), (yyvsp[0].s)); } #line 2828 "camp.tab.cc" break; case 161: /* exp: NEW celltype '(' formals ')' blockstm */ #line 582 "camp.y" { (yyval.e) = new newFunctionExp((yyvsp[-5].pos), (yyvsp[-4].t), (yyvsp[-2].fls), (yyvsp[0].s)); } #line 2834 "camp.tab.cc" break; case 162: /* exp: NEW celltype dims '(' formals ')' blockstm */ #line 584 "camp.y" { (yyval.e) = new newFunctionExp((yyvsp[-6].pos), new arrayTy((yyvsp[-5].t)->getPos(), (yyvsp[-5].t), (yyvsp[-4].dim)), (yyvsp[-2].fls), (yyvsp[0].s)); } #line 2843 "camp.tab.cc" break; case 163: /* exp: exp '?' exp ':' exp */ #line 589 "camp.y" { (yyval.e) = new conditionalExp((yyvsp[-3].pos), (yyvsp[-4].e), (yyvsp[-2].e), (yyvsp[0].e)); } #line 2849 "camp.tab.cc" break; case 164: /* exp: exp ASSIGN exp */ #line 590 "camp.y" { (yyval.e) = new assignExp((yyvsp[-1].pos), (yyvsp[-2].e), (yyvsp[0].e)); } #line 2855 "camp.tab.cc" break; case 165: /* exp: '(' tuple ')' */ #line 591 "camp.y" { (yyval.e) = new callExp((yyvsp[-2].pos), new nameExp((yyvsp[-2].pos), SYM_TUPLE), (yyvsp[-1].alist)); } #line 2861 "camp.tab.cc" break; case 166: /* exp: exp join exp */ #line 593 "camp.y" { (yyvsp[-1].j)->pushFront((yyvsp[-2].e)); (yyvsp[-1].j)->pushBack((yyvsp[0].e)); (yyval.e) = (yyvsp[-1].j); } #line 2867 "camp.tab.cc" break; case 167: /* exp: exp dir */ #line 595 "camp.y" { (yyvsp[0].se)->setSide(camp::OUT); joinExp *jexp = new joinExp((yyvsp[0].se)->getPos(), SYM_DOTS); (yyval.e)=jexp; jexp->pushBack((yyvsp[-1].e)); jexp->pushBack((yyvsp[0].se)); } #line 2877 "camp.tab.cc" break; case 168: /* exp: INCR exp */ #line 601 "camp.y" { (yyval.e) = new prefixExp((yyvsp[-1].ps).pos, (yyvsp[0].e), SYM_PLUS); } #line 2883 "camp.tab.cc" break; case 169: /* exp: DASHES exp */ #line 603 "camp.y" { (yyval.e) = new prefixExp((yyvsp[-1].ps).pos, (yyvsp[0].e), SYM_MINUS); } #line 2889 "camp.tab.cc" break; case 170: /* exp: exp INCR */ #line 606 "camp.y" { (yyval.e) = new postfixExp((yyvsp[0].ps).pos, (yyvsp[-1].e), SYM_PLUS); } #line 2895 "camp.tab.cc" break; case 171: /* exp: exp SELFOP exp */ #line 607 "camp.y" { (yyval.e) = new selfExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); } #line 2901 "camp.tab.cc" break; case 172: /* exp: QUOTE '{' fileblock '}' */ #line 609 "camp.y" { (yyval.e) = new quoteExp((yyvsp[-3].pos), (yyvsp[-1].b)); } #line 2907 "camp.tab.cc" break; case 173: /* join: DASHES */ #line 615 "camp.y" { (yyval.j) = new joinExp((yyvsp[0].ps).pos,(yyvsp[0].ps).sym); } #line 2913 "camp.tab.cc" break; case 174: /* join: basicjoin */ #line 617 "camp.y" { (yyval.j) = (yyvsp[0].j); } #line 2919 "camp.tab.cc" break; case 175: /* join: dir basicjoin */ #line 619 "camp.y" { (yyvsp[-1].se)->setSide(camp::OUT); (yyval.j) = (yyvsp[0].j); (yyval.j)->pushFront((yyvsp[-1].se)); } #line 2926 "camp.tab.cc" break; case 176: /* join: basicjoin dir */ #line 622 "camp.y" { (yyvsp[0].se)->setSide(camp::IN); (yyval.j) = (yyvsp[-1].j); (yyval.j)->pushBack((yyvsp[0].se)); } #line 2933 "camp.tab.cc" break; case 177: /* join: dir basicjoin dir */ #line 625 "camp.y" { (yyvsp[-2].se)->setSide(camp::OUT); (yyvsp[0].se)->setSide(camp::IN); (yyval.j) = (yyvsp[-1].j); (yyval.j)->pushFront((yyvsp[-2].se)); (yyval.j)->pushBack((yyvsp[0].se)); } #line 2940 "camp.tab.cc" break; case 178: /* dir: '{' CURL exp '}' */ #line 630 "camp.y" { (yyval.se) = new specExp((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym, (yyvsp[-1].e)); } #line 2946 "camp.tab.cc" break; case 179: /* dir: '{' exp '}' */ #line 631 "camp.y" { (yyval.se) = new specExp((yyvsp[-2].pos), symbol::opTrans("spec"), (yyvsp[-1].e)); } #line 2952 "camp.tab.cc" break; case 180: /* dir: '{' exp ',' exp '}' */ #line 633 "camp.y" { (yyval.se) = new specExp((yyvsp[-4].pos), symbol::opTrans("spec"), new pairExp((yyvsp[-2].pos), (yyvsp[-3].e), (yyvsp[-1].e))); } #line 2959 "camp.tab.cc" break; case 181: /* dir: '{' exp ',' exp ',' exp '}' */ #line 636 "camp.y" { (yyval.se) = new specExp((yyvsp[-6].pos), symbol::opTrans("spec"), new tripleExp((yyvsp[-4].pos), (yyvsp[-5].e), (yyvsp[-3].e), (yyvsp[-1].e))); } #line 2966 "camp.tab.cc" break; case 182: /* basicjoin: DOTS */ #line 641 "camp.y" { (yyval.j) = new joinExp((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); } #line 2972 "camp.tab.cc" break; case 183: /* basicjoin: DOTS tension DOTS */ #line 643 "camp.y" { (yyval.j) = new joinExp((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym); (yyval.j)->pushBack((yyvsp[-1].e)); } #line 2978 "camp.tab.cc" break; case 184: /* basicjoin: DOTS controls DOTS */ #line 645 "camp.y" { (yyval.j) = new joinExp((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym); (yyval.j)->pushBack((yyvsp[-1].e)); } #line 2984 "camp.tab.cc" break; case 185: /* basicjoin: COLONS */ #line 646 "camp.y" { (yyval.j) = new joinExp((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); } #line 2990 "camp.tab.cc" break; case 186: /* basicjoin: LONGDASH */ #line 647 "camp.y" { (yyval.j) = new joinExp((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); } #line 2996 "camp.tab.cc" break; case 187: /* tension: TENSION exp */ #line 651 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym, new booleanExp((yyvsp[-1].ps).pos, false)); } #line 3003 "camp.tab.cc" break; case 188: /* tension: TENSION exp AND exp */ #line 654 "camp.y" { (yyval.e) = new ternaryExp((yyvsp[-3].ps).pos, (yyvsp[-2].e), (yyvsp[-3].ps).sym, (yyvsp[0].e), new booleanExp((yyvsp[-3].ps).pos, false)); } #line 3010 "camp.tab.cc" break; case 189: /* tension: TENSION ATLEAST exp */ #line 657 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-2].ps).pos, (yyvsp[0].e), (yyvsp[-2].ps).sym, new booleanExp((yyvsp[-1].ps).pos, true)); } #line 3017 "camp.tab.cc" break; case 190: /* tension: TENSION ATLEAST exp AND exp */ #line 660 "camp.y" { (yyval.e) = new ternaryExp((yyvsp[-4].ps).pos, (yyvsp[-2].e), (yyvsp[-4].ps).sym, (yyvsp[0].e), new booleanExp((yyvsp[-3].ps).pos, true)); } #line 3024 "camp.tab.cc" break; case 191: /* controls: CONTROLS exp */ #line 665 "camp.y" { (yyval.e) = new unaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym); } #line 3030 "camp.tab.cc" break; case 192: /* controls: CONTROLS exp AND exp */ #line 667 "camp.y" { (yyval.e) = new binaryExp((yyvsp[-3].ps).pos, (yyvsp[-2].e), (yyvsp[-3].ps).sym, (yyvsp[0].e)); } #line 3036 "camp.tab.cc" break; case 193: /* stm: ';' */ #line 671 "camp.y" { (yyval.s) = new emptyStm((yyvsp[0].pos)); } #line 3042 "camp.tab.cc" break; case 194: /* stm: blockstm */ #line 672 "camp.y" { (yyval.s) = (yyvsp[0].s); } #line 3048 "camp.tab.cc" break; case 195: /* stm: stmexp ';' */ #line 673 "camp.y" { (yyval.s) = (yyvsp[-1].s); } #line 3054 "camp.tab.cc" break; case 196: /* stm: IF '(' exp ')' stm */ #line 675 "camp.y" { (yyval.s) = new ifStm((yyvsp[-4].pos), (yyvsp[-2].e), (yyvsp[0].s)); } #line 3060 "camp.tab.cc" break; case 197: /* stm: IF '(' exp ')' stm ELSE stm */ #line 677 "camp.y" { (yyval.s) = new ifStm((yyvsp[-6].pos), (yyvsp[-4].e), (yyvsp[-2].s), (yyvsp[0].s)); } #line 3066 "camp.tab.cc" break; case 198: /* stm: WHILE '(' exp ')' stm */ #line 679 "camp.y" { (yyval.s) = new whileStm((yyvsp[-4].pos), (yyvsp[-2].e), (yyvsp[0].s)); } #line 3072 "camp.tab.cc" break; case 199: /* stm: DO stm WHILE '(' exp ')' ';' */ #line 681 "camp.y" { (yyval.s) = new doStm((yyvsp[-6].pos), (yyvsp[-5].s), (yyvsp[-2].e)); } #line 3078 "camp.tab.cc" break; case 200: /* stm: FOR '(' forinit ';' fortest ';' forupdate ')' stm */ #line 683 "camp.y" { (yyval.s) = new forStm((yyvsp[-8].pos), (yyvsp[-6].run), (yyvsp[-4].e), (yyvsp[-2].sel), (yyvsp[0].s)); } #line 3084 "camp.tab.cc" break; case 201: /* stm: FOR '(' type ID ':' exp ')' stm */ #line 685 "camp.y" { (yyval.s) = new extendedForStm((yyvsp[-7].pos), (yyvsp[-5].t), (yyvsp[-4].ps).sym, (yyvsp[-2].e), (yyvsp[0].s)); } #line 3090 "camp.tab.cc" break; case 202: /* stm: BREAK ';' */ #line 686 "camp.y" { (yyval.s) = new breakStm((yyvsp[-1].pos)); } #line 3096 "camp.tab.cc" break; case 203: /* stm: CONTINUE ';' */ #line 687 "camp.y" { (yyval.s) = new continueStm((yyvsp[-1].pos)); } #line 3102 "camp.tab.cc" break; case 204: /* stm: RETURN_ ';' */ #line 688 "camp.y" { (yyval.s) = new returnStm((yyvsp[-1].pos)); } #line 3108 "camp.tab.cc" break; case 205: /* stm: RETURN_ exp ';' */ #line 689 "camp.y" { (yyval.s) = new returnStm((yyvsp[-2].pos), (yyvsp[-1].e)); } #line 3114 "camp.tab.cc" break; case 206: /* stmexp: exp */ #line 693 "camp.y" { (yyval.s) = new expStm((yyvsp[0].e)->getPos(), (yyvsp[0].e)); } #line 3120 "camp.tab.cc" break; case 207: /* blockstm: block */ #line 697 "camp.y" { (yyval.s) = new blockStm((yyvsp[0].b)->getPos(), (yyvsp[0].b)); } #line 3126 "camp.tab.cc" break; case 208: /* forinit: %empty */ #line 701 "camp.y" { (yyval.run) = 0; } #line 3132 "camp.tab.cc" break; case 209: /* forinit: stmexplist */ #line 702 "camp.y" { (yyval.run) = (yyvsp[0].sel); } #line 3138 "camp.tab.cc" break; case 210: /* forinit: barevardec */ #line 703 "camp.y" { (yyval.run) = (yyvsp[0].vd); } #line 3144 "camp.tab.cc" break; case 211: /* fortest: %empty */ #line 707 "camp.y" { (yyval.e) = 0; } #line 3150 "camp.tab.cc" break; case 212: /* fortest: exp */ #line 708 "camp.y" { (yyval.e) = (yyvsp[0].e); } #line 3156 "camp.tab.cc" break; case 213: /* forupdate: %empty */ #line 712 "camp.y" { (yyval.sel) = 0; } #line 3162 "camp.tab.cc" break; case 214: /* forupdate: stmexplist */ #line 713 "camp.y" { (yyval.sel) = (yyvsp[0].sel); } #line 3168 "camp.tab.cc" break; case 215: /* stmexplist: stmexp */ #line 717 "camp.y" { (yyval.sel) = new stmExpList((yyvsp[0].s)->getPos()); (yyval.sel)->add((yyvsp[0].s)); } #line 3174 "camp.tab.cc" break; case 216: /* stmexplist: stmexplist ',' stmexp */ #line 719 "camp.y" { (yyval.sel) = (yyvsp[-2].sel); (yyval.sel)->add((yyvsp[0].s)); } #line 3180 "camp.tab.cc" break; #line 3184 "camp.tab.cc" default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; *++yyvsp = yyval; /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ { const int yylhs = yyr1[yyn] - YYNTOKENS; const int yyi = yypgoto[yylhs] + *yyssp; yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp ? yytable[yyi] : yydefgoto[yylhs]); } goto yynewstate; /*--------------------------------------. | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; yyerror (YY_("syntax error")); } if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (0) YYERROR; ++yynerrs; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ /* Pop stack until we find a state that shifts the error token. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYSYMBOL_YYerror; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", YY_ACCESSING_SYMBOL (yystate), yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturnlab; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturnlab; /*-----------------------------------------------------------. | yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | `-----------------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; goto yyreturnlab; /*----------------------------------------------------------. | yyreturnlab -- parsing is finished, clean up and return. | `----------------------------------------------------------*/ yyreturnlab: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); } /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", YY_ACCESSING_SYMBOL (+*yyssp), yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif return yyresult; } asymptote-3.05/triple.h0000644000000000000000000002306615031566105013645 0ustar rootroot/***** * triple.h * John Bowman * * Stores a three-dimensional point. * *****/ #ifndef TRIPLE_H #define TRIPLE_H #include #include #include #include #include #include "common.h" #include "angle.h" #include "pair.h" #ifdef HAVE_LIBTIRPC #include "xstream.h" #endif namespace camp { typedef double Triple[3]; class triple; bool isIdTransform3(const double* t); void copyTransform3(double*& d, const double* s, GCPlacement placement=NoGC); void multiplyTransform3(double*& t, const double* s, const double* r); void boundstriples(double& x, double& y, double& z, double& X, double& Y, double& Z, size_t n, const triple* v); class triple : virtual public gc { double x; double y; double z; public: triple() : x(0.0), y(0.0), z(0.0) {} triple(double x, double y=0.0, double z=0.0) : x(x), y(y), z(z) {} triple(const Triple& v) : x(v[0]), y(v[1]), z(v[2]) {} virtual ~triple() {} void set(double X, double Y=0.0, double Z=0.0) { x=X; y=Y; z=Z; } double getx() const { return x; } double gety() const { return y; } double getz() const { return z; } // transform by row-major matrix friend triple operator* (const double* t, const triple& v) { if(t == NULL) return v; double f=t[12]*v.x+t[13]*v.y+t[14]*v.z+t[15]; if(f != 0.0) { f=1.0/f; return triple((t[0]*v.x+t[1]*v.y+t[2]*v.z+t[3])*f, (t[4]*v.x+t[5]*v.y+t[6]*v.z+t[7])*f, (t[8]*v.x+t[9]*v.y+t[10]*v.z+t[11])*f); } reportError("division by 0 in transform of a triple"); return 0.0; } friend triple operator* (const triple& v, const double* t) { if(t == NULL) return v; double f=t[3]*v.x+t[7]*v.y+t[11]*v.z+t[15]; if(f != 0.0) { f=1.0/f; return triple((v.x*t[0]+v.y*t[4]+v.z*t[8]+t[12])*f, (v.x*t[1]+v.y*t[5]+v.z*t[9]+t[13])*f, (v.x*t[2]+v.y*t[6]+v.z*t[10]+t[14])*f); } reportError("division by 0 in transform of a triple"); return 0.0; } friend triple Transform3(const triple& v, const double* t) { return triple((t[0]*v.x+t[1]*v.y+t[2]*v.z), (t[3]*v.x+t[4]*v.y+t[5]*v.z), (t[6]*v.x+t[7]*v.y+t[8]*v.z)); } friend triple Transform3(const double* t, const triple& v) { return triple(v.x*t[0]+v.y*t[3]+v.z*t[6], v.x*t[1]+v.y*t[4]+v.z*t[7], v.x*t[2]+v.y*t[5]+v.z*t[8]); } // return x and y components of v*t. friend pair Transform2T(const double* t, const triple& v) { double f=t[3]*v.x+t[7]*v.y+t[11]*v.z+t[15]; f=1.0/f; return pair((t[0]*v.x+t[4]*v.y+t[8]*v.z+t[12])*f, (t[1]*v.x+t[5]*v.y+t[9]*v.z+t[13])*f); } friend void transformtriples(const double* t, size_t n, triple* d, const triple* s) { if(n == 0 || d == NULL || s == NULL) return; for(size_t i=0; i < n; i++) d[i]=t*s[i]; } friend void copytriples(size_t n, triple* d, const triple* s) { if(d == NULL || s == NULL) return; for(size_t i=0; i < n; i++) d[i]=s[i]; } friend void boundstriples(triple& Min, triple& Max, size_t n, const triple* v) { if(n==0 || v==NULL) return; double x,y,z; double X,Y,Z; X=x=v[0].getx(); Y=y=v[0].gety(); Z=z=v[0].getz(); for(size_t i=1; i < n; ++i) { const double vx=v[i].getx(); x=fmin(x,vx); X=fmax(X,vx); const double vy=v[i].gety(); y=fmin(y,vy); Y=fmax(Y,vy); const double vz=v[i].getz(); z=fmin(z,vz); Z=fmax(Z,vz); } Min.set(x,y,z); Max.set(X,Y,Z); } friend void ratiotriples(pair &b, double (*m)(double, double), bool &first, size_t n, const triple* v) { if(n==0 || v==NULL) return; if(first) { first=false; const triple& v0=v[0]; b=pair(v0.x/v0.z,v0.y/v0.z); } double x=b.getx(); double y=b.gety(); for(size_t i=0; i < n; ++i) { const triple& vi = v[i]; x=m(x,vi.x/vi.z); y=m(y,vi.y/vi.z); } b=pair(x,y); } friend triple operator+ (const triple& z, const triple& w) { return triple(z.x + w.x, z.y + w.y, z.z + w.z); } friend triple operator- (const triple& z, const triple& w) { return triple(z.x - w.x, z.y - w.y, z.z - w.z); } friend triple operator- (const triple& z) { return triple(-z.x, -z.y, -z.z); } friend triple operator* (double s, const triple& z) { return triple(s*z.x, s*z.y, s*z.z); } friend triple operator* (const triple& z, double s) { return triple(z.x*s, z.y*s, z.z*s); } friend triple operator/ (const triple& z, double s) { if (s == 0.0) reportError("division by 0"); s=1.0/s; return triple(z.x*s, z.y*s, z.z*s); } const triple& operator+= (const triple& w) { x += w.x; y += w.y; z += w.z; return *this; } const triple& operator-= (const triple& w) { x -= w.x; y -= w.y; z -= w.z; return *this; } friend bool operator== (const triple& z, const triple& w) { return z.x == w.x && z.y == w.y && z.z == w.z; } friend bool operator!= (const triple& z, const triple& w) { return z.x != w.x || z.y != w.y || z.z != w.z; } double abs2() const { return x*x+y*y+z*z; } friend double abs2(const triple &v) { return v.abs2(); } double length() const /* r */ { return sqrt(abs2()); } friend double length(const triple& v) { return v.length(); } double polar(bool warn=true) const /* theta */ { double r=length(); if(r == 0.0) { if(warn) reportError("taking polar angle of (0,0,0)"); else return 0.0; } return acos(z/r); } double azimuth(bool warn=true) const /* phi */ { return angle(x,y,warn); } friend triple unit(const triple& v) { double scale=v.length(); if(scale == 0.0) return v; scale=1.0/scale; return triple(v.x*scale,v.y*scale,v.z*scale); } friend double dot(const triple& u, const triple& v) { return u.x*v.x+u.y*v.y+u.z*v.z; } friend triple cross(const triple& u, const triple& v) { return triple(u.y*v.z-u.z*v.y, u.z*v.x-u.x*v.z, u.x*v.y-u.y*v.x); } // Returns a unit triple in the direction (theta,phi), in radians. friend triple expi(double theta, double phi) { double sintheta=sin(theta); return triple(sintheta*cos(phi),sintheta*sin(phi),cos(theta)); } friend istream& operator >> (istream& s, triple& z) { char c; s >> ws; bool paren=s.peek() == '('; // parenthesis are optional if(paren) s >> c; s >> z.x >> ws; if(s.peek() == ',') s >> c >> z.y >> ws; else { if(paren) s >> z.y >> ws; else z.y=0.0; } if(s.peek() == ',') s >> c >> z.z; else { if(paren) s >> z.z; else z.z=0.0; } if(paren) { s >> ws; if(s.peek() == ')') s >> c; } return s; } friend ostream& operator << (ostream& out, const triple& v) { out << "(" << v.x << "," << v.y << "," << v.z << ")"; return out; } friend jsofstream& operator << (jsofstream& out, const triple& v) { out << "[" << v.x << "," << v.y << "," << v.z << "]"; return out; } #ifdef HAVE_LIBTIRPC friend xdr::oxstream& operator << (xdr::oxstream& out, triple const& v) { out << v.x << v.y << v.z; return out; } #endif }; triple expi(double theta, double phi); // Return the component of vector v perpendicular to a unit vector u. inline triple perp(triple v, triple u) { return v-dot(v,u)*u; } double xratio(const triple& v); double yratio(const triple& v); inline void bounds(double& x, double &X, double v) { if(v < x) x=v; else if(v > X) X=v; } inline void boundstriples(double& x, double& y, double& z, double& X, double& Y, double& Z, size_t n, const triple* v) { X=x=v[0].getx(); Y=y=v[0].gety(); Z=z=v[0].getz(); for(size_t i=1; i < n; ++i) { triple V=v[i]; bounds(x,X,V.getx()); bounds(y,Y,V.gety()); bounds(z,Z,V.getz()); } } extern const double third; // return the maximum distance squared of points c0 and c1 from // the respective internal control points of z0--z1. inline double Straightness(const triple& z0, const triple& c0, const triple& c1, const triple& z1) { triple v=third*(z1-z0); return std::max(abs2(c0-v-z0),abs2(z1-v-c1)); } // Return one ninth of the relative flatness squared of a--b and c--d. inline double Flatness(const triple& a, const triple& b, const triple& c, const triple& d) { static double ninth=1.0/9.0; triple u=b-a; triple v=d-c; return ninth*std::max(abs2(cross(u,unit(v))),abs2(cross(v,unit(u)))); } // Return one-half of the second derivative of the Bezier curve defined by // a,b,c,d at t=0. inline triple bezierPP(const triple& a, const triple& b, const triple& c) { return 3.0*(a+c)-6.0*b; } // Return one-sixth of the third derivative of the Bezier curve defined by // a,b,c,d at t=0. inline triple bezierPPP(const triple& a, const triple& b, const triple& c, const triple& d) { return d-a+3.0*(b-c); } // Return four-thirds of the first derivative of the Bezier curve defined by // a,b,c,d at t=1/2. inline triple bezierPh(triple a, triple b, triple c, triple d) { return c+d-a-b; } // Return two-thirds of the second derivative of the Bezier curve defined by // a,b,c,d at t=1/2. inline triple bezierPPh(triple a, triple b, triple c, triple d) { return 3.0*a-5.0*b+c+d; } } //namespace camp GC_DECLARE_PTRFREE(camp::triple); #endif asymptote-3.05/runtriple.in0000644000000000000000000000522315031566105014544 0ustar rootroot/***** * runtriple.in * * Runtime functions for triple operations. * *****/ triple => primTriple() #include "triple.h" #include "path3.h" #include "drawelement.h" using namespace camp; // Autogenerated routines: triple :tripleZero() { static triple zero; return zero; } triple :realRealRealToTriple(real x, real y, real z) { return triple(x,y,z); } real xpart:tripleXPart(triple v) { return v.getx(); } real ypart:tripleYPart(triple v) { return v.gety(); } real zpart:tripleZPart(triple v) { return v.getz(); } triple Operator *(real x, triple v) { return x*v; } triple Operator *(triple v, real x) { return v*x; } triple /(triple v, real x) { return v/x; } real length(triple v) { return v.length(); } real abs(triple v) { return v.length(); } real abs2(triple v) { return abs2(v); } real polar(triple v, bool warn=true) { return v.polar(warn); } real azimuth(triple v, bool warn=true) { if(!warn && v.getx() == 0.0 && v.gety() == 0.0) return 0.0; return v.azimuth(); } real colatitude(triple v, bool warn=true) { if(!warn && v.getx() == 0.0 && v.gety() == 0.0 && v.getz() == 0.0) return 0.0; return degrees(v.polar()); } real latitude(triple v, bool warn=true) { if(!warn && v.getx() == 0.0 && v.gety() == 0.0 && v.getz() == 0.0) return 0.0; return 90.0-degrees(v.polar()); } // Return the longitude of v in [0,360). real longitude(triple v, bool warn=true) { if(!warn && v.getx() == 0.0 && v.gety() == 0.0) return 0.0; return principalBranch(degrees(v.azimuth())); } triple unit(triple v) { return unit(v); } real dot(triple u, triple v) { return dot(u,v); } triple cross(triple u, triple v) { return cross(u,v); } triple dir(explicit triple z) { return unit(z); } triple expi(real polar, real azimuth) { return expi(polar,azimuth); } triple dir(real colatitude, real longitude) { return expi(radians(colatitude),radians(longitude)); } triple realmult(triple u, triple v) { return triple (u.getx()*v.getx(),u.gety()*v.gety(),u.getz()*v.getz()); } // Return the component of vector v perpendicular to a unit vector u. triple perp(triple v, triple u) { return perp(v,u); } triple bezier(triple a, triple b, triple c, triple d, real t) { real onemt=1-t; real onemt2=onemt*onemt; return onemt2*onemt*a+t*(3.0*(onemt2*b+t*onemt*c)+t*t*d); } triple bezierP(triple a, triple b, triple c, triple d, real t) { return 3.0*(t*t*(d-a+3.0*(b-c))+t*(2.0*(a+c)-4.0*b)+b-a); } triple bezierPP(triple a, triple b, triple c, triple d, real t) { return 6.0*(t*(d-a+3.0*(b-c))+a+c)-12.0*b; } triple bezierPPP(triple a, triple b, triple c, triple d) { return 6.0*(d-a)+18.0*(b-c); } asymptote-3.05/runpath3d.h0000644000000000000000000000021115031566132014241 0ustar rootroot/***** Autogenerated from runpath3d.in; changes will be overwritten *****/ #pragma once namespace run { void nullPath3(vm::stack *); } asymptote-3.05/requirements.lint.txt0000644000000000000000000000005215031566105016414 0ustar rootrootblack~=24.8.0 isort~=5.13.2 pylint~=3.3.1 asymptote-3.05/keywords.py0000644000000000000000000000400015031566105014401 0ustar rootroot#!/usr/bin/env python3 ##### # keywords.py # Translated from keywords.pl # # Extract keywords from camp.l and list them in a keywords file. These # keywords are used in autocompletion at the interactive prompt. ##### import argparse import re import textwrap from typing import List parser = argparse.ArgumentParser() parser.add_argument("--camplfile", required=True) parser.add_argument("--output", required=True) parser.add_argument("--process-file", required=True) args = parser.parse_args() camplfile = args.camplfile output_keywords_file = args.output process_file = args.process_file # Extra keywords to add that aren't automatically extracted, currently none. extrawords: List[str] = [] with open(output_keywords_file, "w", encoding="utf-8") as keywords: keywords.write( textwrap.dedent( """\ /***** * This file is automatically generated by keywords.py. * Changes will be overwritten. *****/ """ ) ) def add(word): # pylint: disable=redefined-outer-name keywords.write(f"ADD({word});\n") for word in extrawords: add(word) with open(camplfile, encoding="utf-8") as camp: # Search for the %% separator, after which the definitions start. for line in camp: if re.search(r"^%%\s*$", line): break # Grab simple keyword definitions from camp.l for line in camp: if re.search(r"^%%\s*$", line): break # A second %% indicates the end of definitions. match = re.search(r"^([A-Za-z_][A-Za-z0-9_]*)\s*\{", line) if match: add(match.group(1)) # Grab the special commands from the interactive prompt. with open(process_file, encoding="utf-8") as process: for line in process: match = re.search( r"^\s*ADDCOMMAND\(\s*([A-Za-z_][A-Za-z0-9_]*),", line, ) if match: add(match.group(1)) asymptote-3.05/gsl.cc0000644000000000000000000014244715031566105013276 0ustar rootroot/***** * gsl.cc * 2010/05/19 * * Initialize gsl builtins. *****/ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #ifdef HAVE_LIBGSL #include "vm.h" #include "types.h" #include "entry.h" #include "builtin.h" #include "record.h" #include "stack.h" #include "errormsg.h" #include "array.h" #include "triple.h" #include "callable.h" #include #include #include #include #include #include #include #include "opsymbols.h" #ifndef NOSYM #include "gsl.symbols.h" #endif namespace trans { using types::formal; using types::primVoid; using types::primInt; using types::primReal; using types::primPair; using types::primTriple; using types::primString; using types::IntArray; using types::realArray; using types::stringArray; using vm::stack; using vm::array; using vm::pop; using vm::error; using run::copyArrayC; using run::copyCArray; using camp::pair; using camp::triple; const char* GSLrngnull = "GSL random number generator not initialized"; const char* GSLinvalid = "invalid argument"; bool GSLerror=false; types::dummyRecord *GSLModule; types::record *getGSLModule() { return GSLModule; } inline void checkGSLerror() { if(GSLerror) { GSLerror=false; throw handled_error(); } } template void realRealGSL(stack *s) { double x=pop(s); s->push(func(x)); checkGSLerror(); } template void realRealDOUBLE(stack *s) { double x=pop(s); s->push(func(x,GSL_PREC_DOUBLE)); checkGSLerror(); } template void realRealRealDOUBLE(stack *s) { double y=pop(s); double x=pop(s); s->push(func(x,y,GSL_PREC_DOUBLE)); checkGSLerror(); } template void realIntGSL(stack *s) { s->push(func(unsignedcast(pop(s)))); checkGSLerror(); } template void realIntRealGSL(stack *s) { double x=pop(s); s->push(func(intcast(pop(s)),x)); checkGSLerror(); } template void realRealRealGSL(stack *s) { double x=pop(s); double n=pop(s); s->push(func(n,x)); checkGSLerror(); } template void intRealRealRealGSL(stack *s) { double x=pop(s); double n=pop(s); double a=pop(s); s->push(func(a,n,x)); checkGSLerror(); } template void realRealRealRealGSL(stack *s) { double x=pop(s); double n=pop(s); double a=pop(s); s->push(func(a,n,x)); checkGSLerror(); } template void realRealIntGSL(stack *s) { Int n=pop(s); double x=pop(s); s->push(func(x,unsignedcast(n))); checkGSLerror(); } // Add a GSL special function from the GNU GSL library template void addGSLRealFunc(symbol name, symbol arg1=SYM(x)) { addFunc(GSLModule->e.ve, realRealGSL, primReal(), name, formal(primReal(),arg1)); } // Add a GSL_PREC_DOUBLE GSL special function. template void addGSLDOUBLEFunc(symbol name, symbol arg1=SYM(x)) { addFunc(GSLModule->e.ve, realRealDOUBLE, primReal(), name, formal(primReal(),arg1)); } template void addGSLDOUBLE2Func(symbol name, symbol arg1=SYM(phi), symbol arg2=SYM(k)) { addFunc(GSLModule->e.ve, realRealRealDOUBLE, primReal(), name, formal(primReal(),arg1), formal(primReal(),arg2)); } template void realRealRealRealDOUBLE(stack *s) { double z=pop(s); double y=pop(s); double x=pop(s); s->push(func(x,y,z,GSL_PREC_DOUBLE)); checkGSLerror(); } template void addGSLDOUBLE3Func(symbol name, symbol arg1, symbol arg2, symbol arg3) { addFunc(GSLModule->e.ve, realRealRealRealDOUBLE, primReal(), name, formal(primReal(),arg1), formal(primReal(),arg2), formal(primReal(), arg3)); } template void realRealRealRealRealDOUBLE(stack *s) { double z=pop(s); double y=pop(s); double x=pop(s); double w=pop(s); s->push(func(w,x,y,z,GSL_PREC_DOUBLE)); checkGSLerror(); } template void addGSLDOUBLE4Func(symbol name, symbol arg1, symbol arg2, symbol arg3, symbol arg4) { addFunc(GSLModule->e.ve, realRealRealRealRealDOUBLE, primReal(), name, formal(primReal(),arg1), formal(primReal(),arg2), formal(primReal(), arg3), formal(primReal(), arg4)); } template void addGSLIntFunc(symbol name) { addFunc(GSLModule->e.ve, realIntGSL, primReal(), name, formal(primInt(),SYM(s))); } template void realSignedGSL(stack *s) { Int a = pop(s); s->push(func(intcast(a))); checkGSLerror(); } template void addGSLSignedFunc(symbol name, symbol arg1) { addFunc(GSLModule->e.ve, realSignedGSL, primReal(), name, formal(primInt(),arg1)); } template void addGSLIntRealFunc(symbol name, symbol arg1=SYM(n), symbol arg2=SYM(x)) { addFunc(GSLModule->e.ve, realIntRealGSL, primReal(), name, formal(primInt(),arg1), formal(primReal(),arg2)); } template void addGSLRealRealFunc(symbol name, symbol arg1=SYM(nu), symbol arg2=SYM(x)) { addFunc(GSLModule->e.ve, realRealRealGSL, primReal(), name, formal(primReal(),arg1), formal(primReal(),arg2)); } template void addGSLRealRealRealFunc(symbol name, symbol arg1, symbol arg2, symbol arg3) { addFunc(GSLModule->e.ve, realRealRealRealGSL, primReal(), name, formal(primReal(),arg1), formal(primReal(),arg2), formal(primReal(), arg3)); } template void addGSLRealRealRealFuncInt(symbol name, symbol arg1, symbol arg2, symbol arg3) { addFunc(GSLModule->e.ve, intRealRealRealGSL, primInt(), name, formal(primReal(),arg1), formal(primReal(),arg2), formal(primReal(), arg3)); } template void addGSLRealIntFunc(symbol name, symbol arg1=SYM(nu), symbol arg2=SYM(s)) { addFunc(GSLModule->e.ve, realRealIntGSL, primReal(), name, formal(primReal(),arg1), formal(primInt(),arg2)); } template void realRealSignedGSL(stack *s) { Int b = pop(s); double a = pop(s); s->push(func(a, intcast(b))); checkGSLerror(); } template void addGSLRealSignedFunc(symbol name, symbol arg1, symbol arg2) { addFunc(GSLModule->e.ve, realRealSignedGSL, primReal(), name, formal(primReal(),arg1), formal(primInt(),arg2)); } template void realUnsignedUnsignedGSL(stack *s) { Int b = pop(s); Int a = pop(s); s->push(func(unsignedcast(a), unsignedcast(b))); checkGSLerror(); } template void addGSLUnsignedUnsignedFunc(symbol name, symbol arg1, symbol arg2) { addFunc(GSLModule->e.ve, realUnsignedUnsignedGSL, primReal(), name, formal(primInt(), arg1), formal(primInt(), arg2)); } template void realIntRealRealGSL(stack *s) { double c = pop(s); double b = pop(s); Int a = pop(s); s->push(func(intcast(a), b, c)); checkGSLerror(); } template void addGSLIntRealRealFunc(symbol name, symbol arg1, symbol arg2, symbol arg3) { addFunc(GSLModule->e.ve, realIntRealRealGSL, primReal(), name, formal(primInt(), arg1), formal(primReal(), arg2), formal(primReal(), arg3)); } template void realIntIntRealGSL(stack *s) { double c = pop(s); Int b = pop(s); Int a = pop(s); s->push(func(intcast(a), intcast(b), c)); checkGSLerror(); } template void addGSLIntIntRealFunc(symbol name, symbol arg1, symbol arg2, symbol arg3) { addFunc(GSLModule->e.ve, realIntIntRealGSL, primReal(), name, formal(primInt(), arg1), formal(primInt(), arg2), formal(primReal(), arg3)); } template void realIntIntRealRealGSL(stack *s) { double d = pop(s); double c = pop(s); Int b = pop(s); Int a = pop(s); s->push(func(intcast(a), intcast(b), c, d)); checkGSLerror(); } template void addGSLIntIntRealRealFunc(symbol name, symbol arg1, symbol arg2, symbol arg3, symbol arg4) { addFunc(GSLModule->e.ve, realIntIntRealRealGSL, primReal(), name, formal(primInt(), arg1), formal(primInt(), arg2), formal(primReal(), arg3), formal(primReal(), arg4)); } template void realRealRealRealRealGSL(stack *s) { double d = pop(s); double c = pop(s); double b = pop(s); double a = pop(s); s->push(func(a, b, c, d)); checkGSLerror(); } template void addGSLRealRealRealRealFunc(symbol name, symbol arg1, symbol arg2, symbol arg3, symbol arg4) { addFunc(GSLModule->e.ve, realRealRealRealRealGSL, primReal(), name, formal(primReal(), arg1), formal(primReal(), arg2), formal(primReal(), arg3), formal(primReal(), arg4)); } template void realIntIntIntIntIntIntGSL(stack *s) { Int f = pop(s); Int e = pop(s); Int d = pop(s); Int c = pop(s); Int b = pop(s); Int a = pop(s); s->push(func(intcast(a), intcast(b), intcast(c), intcast(d), intcast(e), intcast(f))); checkGSLerror(); } template void addGSLIntIntIntIntIntIntFunc(symbol name, symbol arg1, symbol arg2, symbol arg3, symbol arg4, symbol arg5, symbol arg6) { addFunc(GSLModule->e.ve, realIntIntIntIntIntIntGSL, primReal(), name, formal(primInt(), arg1), formal(primInt(), arg2), formal(primInt(), arg3), formal(primInt(), arg4), formal(primInt(), arg5), formal(primInt(), arg6)); } template void realIntIntIntIntIntIntIntIntIntGSL(stack *s) { Int i = pop(s); Int h = pop(s); Int g = pop(s); Int f = pop(s); Int e = pop(s); Int d = pop(s); Int c = pop(s); Int b = pop(s); Int a = pop(s); s->push(func(intcast(a), intcast(b), intcast(c), intcast(d), intcast(e), intcast(f), intcast(g), intcast(h), intcast(i))); checkGSLerror(); } template void addGSLIntIntIntIntIntIntIntIntIntFunc(symbol name, symbol arg1, symbol arg2, symbol arg3, symbol arg4, symbol arg5, symbol arg6, symbol arg7, symbol arg8, symbol arg9) { addFunc(GSLModule->e.ve, realIntIntIntIntIntIntIntIntIntGSL, primReal(), name, formal(primInt(), arg1), formal(primInt(), arg2), formal(primInt(), arg3), formal(primInt(), arg4), formal(primInt(), arg5), formal(primInt(), arg6), formal(primInt(), arg7), formal(primInt(), arg8), formal(primInt(), arg9)); } template void realUIntRealGSL(stack *s) { double a = pop(s); unsigned int k = unsignedcast(pop(s)); s->push(func(k,a)); checkGSLerror(); } template void addGSLUIntRealFunc(symbol name, symbol arg1, symbol arg2) { addFunc(GSLModule->e.ve, realUIntRealGSL, primReal(), name, formal(primInt(), arg1), formal(primReal(), arg2)); } template void realUIntRealUIntGSL(stack *s) { unsigned int n = unsignedcast(pop(s)); double a = pop(s); unsigned int k = unsignedcast(pop(s)); s->push(func(k,a,n)); checkGSLerror(); } template void addGSLUIntRealUIntFunc(symbol name, symbol arg1, symbol arg2, symbol arg3) { addFunc(GSLModule->e.ve, realUIntRealUIntGSL, primReal(), name, formal(primInt(), arg1), formal(primReal(), arg2), formal(primInt(), arg3)); } template void realUIntRealRealGSL(stack *s) { double b = pop(s); double a = pop(s); unsigned int k = unsignedcast(pop(s)); s->push(func(k,a,b)); checkGSLerror(); } template void addGSLUIntRealRealFunc(symbol name, symbol arg1, symbol arg2, symbol arg3) { addFunc(GSLModule->e.ve, realUIntRealRealGSL, primReal(), name, formal(primInt(), arg1), formal(primReal(), arg2), formal(primReal(), arg3)); } template void realUIntUIntUIntUIntGSL(stack *s) { unsigned int t = unsignedcast(pop(s)); unsigned int n2 = unsignedcast(pop(s)); unsigned int n1 = unsignedcast(pop(s)); unsigned int k = unsignedcast(pop(s)); s->push(func(k,n1,n2,t)); checkGSLerror(); } template void addGSLUIntUIntUIntUIntFunc(symbol name, symbol arg1, symbol arg2, symbol arg3, symbol arg4) { addFunc(GSLModule->e.ve, realUIntUIntUIntUIntGSL, primReal(), name, formal(primInt(), arg1), formal(primInt(), arg2), formal(primInt(), arg3), formal(primInt(), arg4)); } // GSL random number generators gsl_rng *GSLrng=0; const gsl_rng_type **GSLrngFirstType=gsl_rng_types_setup(); inline void checkGSLrng() { if(GSLrng == 0) error(GSLrngnull); } void GSLrngFree() { if(GSLrng != 0) gsl_rng_free(GSLrng); GSLrng=0; } void GSLrngInit(stack *s) { string n = pop(s,string()); const gsl_rng_type **t; if(n.empty()) t = &gsl_rng_default; else { for(t=GSLrngFirstType; *t!=0; ++t) if(n == string((*t)->name)) break; if(*t == 0) error(GSLinvalid); } GSLrngFree(); GSLrng = gsl_rng_alloc(*t); if(GSLrng == 0) { GSLerror=false; error("insufficient memory for allocation of GSL random number generator"); } } void GSLrngList(stack *s) { array* a = new array(0); const gsl_rng_type **t; for(t=GSLrngFirstType; *t!=0; ++t) { a->push(string((*t)->name)); } s->push(a); checkGSLerror(); } void GSLrngSet(stack *s) { Int i=pop(s,-1); checkGSLrng(); if(i < 0) gsl_rng_set(GSLrng,gsl_rng_default_seed); else gsl_rng_set(GSLrng,unsignedcast(i)); checkGSLerror(); } template void intVoidGSLrng(stack *s) { s->push(func(GSLrng)); checkGSLrng(); checkGSLerror(); } template void addGSLrngVoidFuncInt(symbol name) { addFunc(GSLModule->e.ve, intVoidGSLrng, primInt(), name); } template void intULongGSLrng(stack *s) { unsigned long int i = unsignedcast(pop(s)); checkGSLrng(); s->push(func(GSLrng,i)); checkGSLerror(); } template void addGSLrngULongFuncInt(symbol name, symbol arg1) { addFunc(GSLModule->e.ve, intULongGSLrng, primInt(), name, formal(primInt(), arg1)); } template void intRealGSLrng(stack *s) { double x = pop(s); checkGSLrng(); s->push(func(GSLrng,x)); checkGSLerror(); } template void addGSLrngRealFuncInt(symbol name, symbol arg1) { addFunc(GSLModule->e.ve, intRealGSLrng, primInt(), name, formal(primReal(), arg1)); } template void intRealRealGSLrng(stack *s) { double y = pop(s); double x = pop(s); checkGSLrng(); s->push(func(GSLrng,x,y)); checkGSLerror(); } template void addGSLrngRealRealFuncInt(symbol name, symbol arg1, symbol arg2) { addFunc(GSLModule->e.ve, intRealRealGSLrng, primInt(), name, formal(primReal(), arg1), formal(primReal(), arg2)); } template void realVoidGSLrng(stack *s) { checkGSLrng(); s->push(func(GSLrng)); checkGSLerror(); } template void addGSLrngVoidFunc(symbol name) { addFunc(GSLModule->e.ve, realVoidGSLrng, primReal(), name); } template void realRealGSLrng(stack *s) { double x = pop(s); checkGSLrng(); s->push(func(GSLrng,x)); checkGSLerror(); } template void addGSLrngRealFunc(symbol name, symbol arg1) { addFunc(GSLModule->e.ve, realRealGSLrng, primReal(), name, formal(primReal(), arg1)); } template void realRealRealGSLrng(stack *s) { double b = pop(s); double a = pop(s); checkGSLrng(); s->push(func(GSLrng,a,b)); checkGSLerror(); } template void addGSLrngRealRealFunc(symbol name, symbol arg1, symbol arg2) { addFunc(GSLModule->e.ve, realRealRealGSLrng, primReal(), name, formal(primReal(), arg1), formal(primReal(), arg2)); } template void intRealUIntGSLrng(stack *s) { unsigned int n = unsignedcast(pop(s)); double a = pop(s); checkGSLrng(); s->push(func(GSLrng,a,n)); checkGSLerror(); } template void addGSLrngRealUIntFuncInt(symbol name, symbol arg1, symbol arg2) { addFunc(GSLModule->e.ve, intRealUIntGSLrng, primInt(), name, formal(primReal(), arg1), formal(primInt(), arg2)); } template void intUIntUIntUIntGSLrng(stack *s) { unsigned int t = unsignedcast(pop(s)); unsigned int n2 = unsignedcast(pop(s)); unsigned int n1 = unsignedcast(pop(s)); checkGSLrng(); s->push(func(GSLrng,n1,n2,t)); checkGSLerror(); } template void addGSLrngUIntUIntUIntFuncInt(symbol name, symbol arg1, symbol arg2, symbol arg3) { addFunc(GSLModule->e.ve, intUIntUIntUIntGSLrng, primInt(), name, formal(primInt(), arg1), formal(primInt(), arg2), formal(primInt(), arg3)); } template void stringVoidGSLrng(stack *s) { checkGSLrng(); s->push(func(GSLrng)); checkGSLerror(); } template void addGSLrngVoidFuncString(symbol name) { addFunc(GSLModule->e.ve, stringVoidGSLrng, primString(), name); } void GSLrng_gaussian(stack *s) { string method = pop(s,string("polar")); double sigma = pop(s,1.0); double mu = pop(s,0.0); checkGSLrng(); double x=mu; if(method == "polar") x += gsl_ran_gaussian(GSLrng,sigma); else if(method == "ziggurat") x += gsl_ran_gaussian_ziggurat(GSLrng,sigma); else if(method == "ratio") x += gsl_ran_gaussian_ratio_method(GSLrng,sigma); else error(GSLinvalid); s->push(x); checkGSLerror(); } template void realRealRealRealGSLgaussian(stack *s) { double sigma = pop(s,1.0); double mu = pop(s,0.0); double x = pop(s); s->push(func(x-mu,sigma)); checkGSLerror(); } template void addGSLgaussianrealRealRealRealFunc(symbol name, symbol arg1) { addFunc(GSLModule->e.ve, realRealRealRealGSLgaussian, primReal(), name, formal(primReal(), arg1), formal(primReal(), SYM(mu), true, false), formal(primReal(), SYM(sigma), true, false)); } template void realRealRealRealGSLinvgaussian(stack *s) { double sigma = pop(s,1.0); double mu = pop(s,0.0); double x = pop(s); s->push(func(x,sigma)+mu); checkGSLerror(); } template void addGSLinvgaussianrealRealRealRealFunc(symbol name, symbol arg1) { addFunc(GSLModule->e.ve, realRealRealRealGSLinvgaussian, primReal(), name, formal(primReal(), arg1), formal(primReal(), SYM(mu), true, false), formal(primReal(), SYM(sigma), true, false)); } void GSLrng_bivariate_gaussian(stack *s) { double rho = pop(s,0.0); pair sigma = pop(s,pair(1.0,1.0)); pair mu = pop(s,pair(0.0,0.0)); checkGSLrng(); double x,y; gsl_ran_bivariate_gaussian(GSLrng,sigma.getx(),sigma.gety(),rho,&x,&y); s->push(pair(x,y)+mu); checkGSLerror(); } void GSLpdf_bivariate_gaussian(stack *s) { double rho = pop(s,0.0); pair sigma = pop(s,pair(1.0,1.0)); pair mu = pop(s,pair(0.0,0.0)); pair z = pop(s); s->push(gsl_ran_bivariate_gaussian_pdf(z.getx()+mu.getx(),z.gety()+mu.gety(), sigma.getx(),sigma.gety(),rho)); checkGSLerror(); } void GSLrng_levy(stack *s) { double beta = pop(s,0.0); double alpha = pop(s); double c = pop(s); if((alpha<=0) || (alpha>2)) error(GSLinvalid); if((beta<-1) || (beta>1)) error(GSLinvalid); checkGSLrng(); double x; if(beta==0) x=gsl_ran_levy(GSLrng,c,alpha); else x=gsl_ran_levy_skew(GSLrng,c,alpha,beta); s->push(x); checkGSLerror(); } void GSLrng_gamma(stack *s) { string method = pop(s,string("mt")); double b = pop(s); double a = pop(s); checkGSLrng(); double x=0.0; if(method == "mt") x = gsl_ran_gamma(GSLrng,a,b); else if(method == "knuth") x = gsl_ran_gamma_knuth(GSLrng,a,b); else error(GSLinvalid); s->push(x); checkGSLerror(); } void GSLrng_dir2d(stack *s) { string method = pop(s,string("neumann")); checkGSLrng(); double x=0, y=0; if(method == "neumann") gsl_ran_dir_2d(GSLrng,&x,&y); else if(method == "trig") gsl_ran_dir_2d_trig_method(GSLrng,&x,&y); else error(GSLinvalid); s->push(pair(x,y)); checkGSLerror(); } void GSLrng_dir3d(stack *s) { checkGSLrng(); double x,y,z; gsl_ran_dir_3d(GSLrng,&x,&y,&z); s->push(triple(x,y,z)); checkGSLerror(); } void GSLrng_dir(stack *s) { size_t n = (size_t) unsignedcast(pop(s)); if(n==0) error(GSLinvalid); checkGSLrng(); double* p = new double[n]; gsl_ran_dir_nd(GSLrng,n,p); s->push(copyCArray(n,p)); delete[] p; checkGSLerror(); } void GSLrng_dirichlet(stack *s) { array* alpha = pop(s); size_t K = checkArray(alpha); checkGSLrng(); double* calpha; copyArrayC(calpha,alpha); double* ctheta = new double[K]; gsl_ran_dirichlet(GSLrng,K,calpha,ctheta); s->push(copyCArray(K,ctheta)); delete[] ctheta; delete[] calpha; checkGSLerror(); } void GSLpdf_dirichlet(stack *s) { array* theta = pop(s); array* alpha = pop(s); size_t K = checkArray(alpha); if(checkArray(theta) != K) error(GSLinvalid); double* calpha; copyArrayC(calpha,alpha); double* ctheta; copyArrayC(ctheta,theta); s->push(gsl_ran_dirichlet_pdf(K,calpha,ctheta)); delete[] ctheta; delete[] calpha; checkGSLerror(); } void GSLrng_multinomial(stack *s) { array* p = pop(s); unsigned int N = unsignedcast(pop(s)); size_t K = checkArray(p); checkGSLrng(); double* cp; copyArrayC(cp,p); unsigned int* cn = new unsigned int[K]; gsl_ran_multinomial(GSLrng,K,N,cp,cn); s->push(copyCArray(K,cn)); delete[] cn; delete[] cp; checkGSLerror(); } void GSLpdf_multinomial(stack *s) { array* n = pop(s); array* p = pop(s); size_t K = checkArray(p); if(K != checkArray(n)) error(GSLinvalid); double* cp; copyArrayC(cp,p); unsigned int* cn; copyArrayC(cn,n,unsignedcast); s->push(gsl_ran_multinomial_pdf(K,cp,cn)); delete[] cn; delete[] cp; checkGSLerror(); } void GSLsf_elljac_e(stack *s) { double m = pop(s); double u = pop(s); double sn,cn,dn; gsl_sf_elljac_e(u,m,&sn,&cn,&dn); array *result=new array(3); (*result)[0]=sn; (*result)[1]=cn; (*result)[2]=dn; s->push(result); } // Handle GSL errors gracefully. void GSLerrorhandler(const char *reason, const char *, int, int) { if(!GSLerror) { vm::errornothrow(reason); GSLerror=true; } } void gen_rungsl_venv(venv &ve) { GSLModule=new types::dummyRecord(SYM(gsl)); gsl_set_error_handler(GSLerrorhandler); // Common functions addGSLRealRealFunc(SYM(hypot),SYM(x),SYM(y)); // addGSLRealRealRealFunc(SYM(hypot),SYM(x),SYM(y),SYM(z)); addGSLRealRealRealFuncInt(SYM(fcmp),SYM(x),SYM(y),SYM(epsilon)); // Airy functions addGSLDOUBLEFunc(SYM(Ai)); addGSLDOUBLEFunc(SYM(Bi)); addGSLDOUBLEFunc(SYM(Ai_scaled)); addGSLDOUBLEFunc(SYM(Bi_scaled)); addGSLDOUBLEFunc(SYM(Ai_deriv)); addGSLDOUBLEFunc(SYM(Bi_deriv)); addGSLDOUBLEFunc(SYM(Ai_deriv_scaled)); addGSLDOUBLEFunc(SYM(Bi_deriv_scaled)); addGSLIntFunc(SYM(zero_Ai)); addGSLIntFunc(SYM(zero_Bi)); addGSLIntFunc(SYM(zero_Ai_deriv)); addGSLIntFunc(SYM(zero_Bi_deriv)); // Bessel functions addGSLRealFunc(SYM(J0)); addGSLRealFunc(SYM(J1)); addGSLIntRealFunc(SYM(Jn)); addGSLRealFunc(SYM(Y0)); addGSLRealFunc(SYM(Y1)); addGSLIntRealFunc(SYM(Yn)); addGSLRealFunc(SYM(I0)); addGSLRealFunc(SYM(I1)); addGSLIntRealFunc(SYM(I)); addGSLRealFunc(SYM(I0_scaled)); addGSLRealFunc(SYM(I1_scaled)); addGSLIntRealFunc(SYM(I_scaled)); addGSLRealFunc(SYM(K0)); addGSLRealFunc(SYM(K1)); addGSLIntRealFunc(SYM(K)); addGSLRealFunc(SYM(K0_scaled)); addGSLRealFunc(SYM(K1_scaled)); addGSLIntRealFunc(SYM(K_scaled)); addGSLRealFunc(SYM(j0)); addGSLRealFunc(SYM(j1)); addGSLRealFunc(SYM(j2)); addGSLIntRealFunc(SYM(j),SYM(l)); addGSLRealFunc(SYM(y0)); addGSLRealFunc(SYM(y1)); addGSLRealFunc(SYM(y2)); addGSLIntRealFunc(SYM(y),SYM(l)); addGSLRealFunc(SYM(i0_scaled)); addGSLRealFunc(SYM(i1_scaled)); addGSLRealFunc(SYM(i2_scaled)); addGSLIntRealFunc(SYM(i_scaled),SYM(l)); addGSLRealFunc(SYM(k0_scaled)); addGSLRealFunc(SYM(k1_scaled)); addGSLRealFunc(SYM(k2_scaled)); addGSLIntRealFunc(SYM(k_scaled),SYM(l)); addGSLRealRealFunc(SYM(J)); addGSLRealRealFunc(SYM(Y)); addGSLRealRealFunc(SYM(I)); addGSLRealRealFunc(SYM(I_scaled)); addGSLRealRealFunc(SYM(K)); addGSLRealRealFunc(SYM(lnK)); addGSLRealRealFunc(SYM(K_scaled)); addGSLIntFunc(SYM(zero_J0)); addGSLIntFunc(SYM(zero_J1)); addGSLRealIntFunc(SYM(zero_J)); // Clausen functions addGSLRealFunc(SYM(clausen)); // Coulomb functions addGSLRealRealFunc(SYM(hydrogenicR_1),SYM(Z),SYM(r)); addGSLIntIntRealRealFunc(SYM(hydrogenicR),SYM(n),SYM(l), SYM(Z),SYM(r)); // Missing: F_L(eta,x), G_L(eta,x), C_L(eta) // Coupling coefficients addGSLIntIntIntIntIntIntFunc(SYM(coupling_3j),SYM(two_ja), SYM(two_jb),SYM(two_jc), SYM(two_ma), SYM(two_mb),SYM(two_mc)); addGSLIntIntIntIntIntIntFunc(SYM(coupling_6j),SYM(two_ja), SYM(two_jb),SYM(two_jc), SYM(two_jd), SYM(two_je),SYM(two_jf)); addGSLIntIntIntIntIntIntIntIntIntFunc(SYM(coupling_9j), SYM(two_ja), SYM(two_jb), SYM(two_jc), SYM(two_jd), SYM(two_je), SYM(two_jf), SYM(two_jg), SYM(two_jh), SYM(two_ji)); // Dawson function addGSLRealFunc(SYM(dawson)); // Debye functions addGSLRealFunc(SYM(debye_1)); addGSLRealFunc(SYM(debye_2)); addGSLRealFunc(SYM(debye_3)); addGSLRealFunc(SYM(debye_4)); addGSLRealFunc(SYM(debye_5)); addGSLRealFunc(SYM(debye_6)); // Dilogarithm addGSLRealFunc(SYM(dilog)); // Missing: complex dilogarithm // Elementary operations // we don't support errors at the moment // Elliptic integrals addGSLDOUBLEFunc(SYM(K),SYM(k)); addGSLDOUBLEFunc(SYM(E),SYM(k)); addGSLDOUBLE2Func(SYM(P),SYM(k),SYM(n)); addGSLDOUBLE2Func(SYM(F)); addGSLDOUBLE2Func(SYM(E)); addGSLDOUBLE3Func(SYM(P),SYM(phi),SYM(k),SYM(n)); #if GSL_MAJOR_VERSION >= 2 addGSLDOUBLE2Func(SYM(D),SYM(phi),SYM(k)); #else addGSLDOUBLE3Func(SYM(D),SYM(phi),SYM(k),SYM(n)); #endif addGSLDOUBLE2Func(SYM(RC),SYM(x),SYM(y)); addGSLDOUBLE3Func(SYM(RD),SYM(x),SYM(y),SYM(z)); addGSLDOUBLE3Func(SYM(RF),SYM(x),SYM(y),SYM(z)); addGSLDOUBLE4Func(SYM(RJ),SYM(x),SYM(y),SYM(z),SYM(p)); // Error functions addGSLRealFunc(SYM(erf)); addGSLRealFunc(SYM(erfc)); addGSLRealFunc(SYM(log_erfc)); addGSLRealFunc(SYM(erf_Z)); addGSLRealFunc(SYM(erf_Q)); addGSLRealFunc(SYM(hazard)); // Exponential functions addGSLRealRealFunc(SYM(exp_mult),SYM(x),SYM(y)); // addGSLRealFunc(SYM(expm1)); addGSLRealFunc(SYM(exprel)); addGSLRealFunc(SYM(exprel_2)); addGSLIntRealFunc(SYM(exprel),SYM(n),SYM(x)); // Exponential integrals addGSLRealFunc(SYM(E1)); addGSLRealFunc(SYM(E2)); // addGSLIntRealFunc(SYM(En),SYM(n),SYM(x)); addGSLRealFunc(SYM(Ei)); addGSLRealFunc(SYM(Shi)); addGSLRealFunc(SYM(Chi)); addGSLRealFunc(SYM(Ei3)); addGSLRealFunc(SYM(Si)); addGSLRealFunc(SYM(Ci)); addGSLRealFunc(SYM(atanint)); // Fermi--Dirac function addGSLRealFunc(SYM(FermiDiracM1)); addGSLRealFunc(SYM(FermiDirac0)); addGSLRealFunc(SYM(FermiDirac1)); addGSLRealFunc(SYM(FermiDirac2)); addGSLIntRealFunc(SYM(FermiDirac),SYM(j),SYM(x)); addGSLRealFunc(SYM(FermiDiracMHalf)); addGSLRealFunc(SYM(FermiDiracHalf)); addGSLRealFunc(SYM(FermiDirac3Half)); addGSLRealRealFunc(SYM(FermiDiracInc0),SYM(x), SYM(b)); // Gamma and beta functions addGSLRealFunc(SYM(gamma)); addGSLRealFunc(SYM(lngamma)); addGSLRealFunc(SYM(gammastar)); addGSLRealFunc(SYM(gammainv)); addGSLIntFunc(SYM(fact)); addGSLIntFunc(SYM(doublefact)); addGSLIntFunc(SYM(lnfact)); addGSLIntFunc(SYM(lndoublefact)); addGSLUnsignedUnsignedFunc(SYM(choose),SYM(n),SYM(m)); addGSLUnsignedUnsignedFunc(SYM(lnchoose),SYM(n),SYM(m)); addGSLIntRealFunc(SYM(taylorcoeff),SYM(n),SYM(x)); addGSLRealRealFunc(SYM(poch),SYM(a),SYM(x)); addGSLRealRealFunc(SYM(lnpoch),SYM(a),SYM(x)); addGSLRealRealFunc(SYM(pochrel),SYM(a),SYM(x)); addGSLRealRealFunc(SYM(gamma),SYM(a),SYM(x)); addGSLRealRealFunc(SYM(gamma_Q),SYM(a),SYM(x)); addGSLRealRealFunc(SYM(gamma_P),SYM(a),SYM(x)); addGSLRealRealFunc(SYM(beta),SYM(a),SYM(b)); addGSLRealRealFunc(SYM(lnbeta),SYM(a),SYM(b)); addGSLRealRealRealFunc(SYM(beta),SYM(a),SYM(b),SYM(x)); // Gegenbauer functions addGSLRealRealFunc(SYM(gegenpoly_1),SYM(lambda),SYM(x)); addGSLRealRealFunc(SYM(gegenpoly_2),SYM(lambda),SYM(x)); addGSLRealRealFunc(SYM(gegenpoly_3),SYM(lambda),SYM(x)); addGSLIntRealRealFunc(SYM(gegenpoly),SYM(n),SYM(lambda), SYM(x)); // Hypergeometric functions addGSLRealRealFunc(SYM(hy0F1),SYM(c),SYM(x)); addGSLIntIntRealFunc(SYM(hy1F1),SYM(m),SYM(n),SYM(x)); addGSLRealRealRealFunc(SYM(hy1F1),SYM(a),SYM(b),SYM(x)); addGSLIntIntRealFunc(SYM(U),SYM(m),SYM(n),SYM(x)); addGSLRealRealRealFunc(SYM(U),SYM(a),SYM(b),SYM(x)); addGSLRealRealRealRealFunc(SYM(hy2F1),SYM(a),SYM(b),SYM(c), SYM(x)); addGSLRealRealRealRealFunc(SYM(hy2F1_conj),SYM(aR), SYM(aI),SYM(c),SYM(x)); addGSLRealRealRealRealFunc(SYM(hy2F1_renorm),SYM(a), SYM(b),SYM(c),SYM(x)); addGSLRealRealRealRealFunc (SYM(hy2F1_conj_renorm),SYM(aR),SYM(aI),SYM(c),SYM(x)); addGSLRealRealRealFunc(SYM(hy2F0),SYM(a),SYM(b),SYM(x)); // Laguerre functions addGSLRealRealFunc(SYM(L1),SYM(a),SYM(x)); addGSLRealRealFunc(SYM(L2),SYM(a),SYM(x)); addGSLRealRealFunc(SYM(L3),SYM(a),SYM(x)); addGSLIntRealRealFunc(SYM(L),SYM(n),SYM(a),SYM(x)); // Lambert W functions addGSLRealFunc(SYM(W0)); addGSLRealFunc(SYM(Wm1)); // Legendre functions and spherical harmonics addGSLRealFunc(SYM(P1)); addGSLRealFunc(SYM(P2)); addGSLRealFunc(SYM(P3)); addGSLIntRealFunc(SYM(Pl),SYM(l)); addGSLRealFunc(SYM(Q0)); addGSLRealFunc(SYM(Q1)); addGSLIntRealFunc(SYM(Ql),SYM(l)); addGSLIntIntRealFunc(SYM(Plm),SYM(l),SYM(m),SYM(x)); addGSLIntIntRealFunc(SYM(sphPlm),SYM(l),SYM(m), SYM(x)); addGSLRealRealFunc(SYM(conicalP_half),SYM(lambda), SYM(x)); addGSLRealRealFunc(SYM(conicalP_mhalf),SYM(lambda), SYM(x)); addGSLRealRealFunc(SYM(conicalP_0),SYM(lambda),SYM(x)); addGSLRealRealFunc(SYM(conicalP_1),SYM(lambda),SYM(x)); addGSLIntRealRealFunc(SYM(conicalP_sph_reg),SYM(l), SYM(lambda),SYM(x)); addGSLIntRealRealFunc(SYM(conicalP_cyl_reg),SYM(m), SYM(lambda),SYM(x)); addGSLRealRealFunc(SYM(H3d0),SYM(lambda),SYM(eta)); addGSLRealRealFunc(SYM(H3d1),SYM(lambda),SYM(eta)); addGSLIntRealRealFunc(SYM(H3d),SYM(l),SYM(lambda), SYM(eta)); // Logarithm and related functions addGSLRealFunc(SYM(logabs)); // addGSLRealFunc(SYM(log1p)); addGSLRealFunc(SYM(log1pm)); // Matthieu functions // to be implemented // Power function addGSLRealSignedFunc(SYM(pow),SYM(x),SYM(n)); // Psi (digamma) function addGSLSignedFunc(SYM(psi),SYM(n)); addGSLRealFunc(SYM(psi)); addGSLRealFunc(SYM(psi_1piy),SYM(y)); addGSLSignedFunc(SYM(psi1),SYM(n)); addGSLRealFunc(SYM(psi1),SYM(x)); addGSLIntRealFunc(SYM(psi),SYM(n),SYM(x)); // Synchrotron functions addGSLRealFunc(SYM(synchrotron_1)); addGSLRealFunc(SYM(synchrotron_2)); // Transport functions addGSLRealFunc(SYM(transport_2)); addGSLRealFunc(SYM(transport_3)); addGSLRealFunc(SYM(transport_4)); addGSLRealFunc(SYM(transport_5)); // Trigonometric functions addGSLRealFunc(SYM(sinc)); addGSLRealFunc(SYM(lnsinh)); addGSLRealFunc(SYM(lncosh)); // Zeta functions addGSLSignedFunc(SYM(zeta),SYM(n)); addGSLRealFunc(SYM(zeta),SYM(s)); addGSLSignedFunc(SYM(zetam1),SYM(n)); addGSLRealFunc(SYM(zetam1),SYM(s)); addGSLRealRealFunc(SYM(hzeta),SYM(s),SYM(q)); addGSLSignedFunc(SYM(eta),SYM(n)); addGSLRealFunc(SYM(eta),SYM(s)); // Random number generation gsl_rng_env_setup(); addFunc(GSLModule->e.ve,GSLrngInit,primVoid(),SYM(rng_init), formal(primString(),SYM(name),true,false)); addFunc(GSLModule->e.ve,GSLrngList,stringArray(),SYM(rng_list)); addFunc(GSLModule->e.ve,GSLrngSet,primVoid(),SYM(rng_set), formal(primInt(),SYM(seed),true,false)); addGSLrngVoidFuncString(SYM(rng_name)); addGSLrngVoidFuncInt(SYM(rng_min)); addGSLrngVoidFuncInt(SYM(rng_max)); addGSLrngVoidFuncInt(SYM(rng_get)); addGSLrngULongFuncInt(SYM(rng_uniform_int),SYM(n)); addGSLrngVoidFunc(SYM(rng_uniform)); addGSLrngVoidFunc(SYM(rng_uniform_pos)); // Gaussian distribution addFunc(GSLModule->e.ve,GSLrng_gaussian,primReal(),SYM(rng_gaussian), formal(primReal(),SYM(mu),true,false), formal(primReal(),SYM(sigma),true,false), formal(primString(),SYM(method),true,false)); addGSLgaussianrealRealRealRealFunc(SYM(pdf_gaussian), SYM(x)); addGSLgaussianrealRealRealRealFunc(SYM(cdf_gaussian_P), SYM(x)); addGSLgaussianrealRealRealRealFunc(SYM(cdf_gaussian_Q), SYM(x)); addGSLinvgaussianrealRealRealRealFunc (SYM(cdf_gaussian_Pinv),SYM(x)); addGSLinvgaussianrealRealRealRealFunc (SYM(cdf_gaussian_Qinv),SYM(x)); // Gaussian tail distribution addGSLrngRealRealFunc(SYM(rng_gaussian_tail),SYM(a), SYM(sigma)); addGSLRealRealRealFunc(SYM(pdf_gaussian_tail), SYM(x),SYM(a),SYM(sigma)); // Bivariate Gaussian distribution addFunc(GSLModule->e.ve,GSLrng_bivariate_gaussian,primPair(), SYM(rng_bivariate_gaussian), formal(primPair(),SYM(mu),true,true), formal(primPair(),SYM(sigma),true,true), formal(primReal(),SYM(rho),true,false)); addFunc(GSLModule->e.ve,GSLpdf_bivariate_gaussian,primReal(), SYM(pdf_bivariate_gaussian), formal(primPair(),SYM(z),false,true), formal(primPair(),SYM(mu),true,true), formal(primPair(),SYM(sigma),true,true), formal(primReal(),SYM(rho),true,false)); #define addGSLrealdist1param(NAME,ARG) \ addGSLrngRealFunc \ (SYM(rng_##NAME),SYM(ARG)); \ addGSLRealRealFunc \ (SYM(pdf_##NAME),SYM(x),SYM(ARG)); \ addGSLRealRealFunc \ (SYM(cdf_##NAME##_P),SYM(x),SYM(ARG)); \ addGSLRealRealFunc \ (SYM(cdf_##NAME##_Q),SYM(x),SYM(ARG)); \ addGSLRealRealFunc \ (SYM(cdf_##NAME##_Pinv),SYM(P),SYM(ARG)); \ addGSLRealRealFunc \ (SYM(cdf_##NAME##_Qinv),SYM(Q),SYM(ARG)) // Exponential, Laplace, Cauchy, Rayleigh, Chi-squared, t, // and Logistic distribution addGSLrealdist1param(exponential,mu); addGSLrealdist1param(laplace,a); addGSLrealdist1param(cauchy,a); addGSLrealdist1param(rayleigh,mu); addGSLrealdist1param(chisq,mu); addGSLrealdist1param(tdist,mu); addGSLrealdist1param(logistic,mu); #undef addGSLrealdist1param #define addGSLrealdist2param(NAME,ARG1,ARG2) \ addGSLrngRealRealFunc \ (SYM(rng_##NAME),SYM(ARG1),SYM(ARG2)); \ addGSLRealRealRealFunc \ (SYM(pdf_##NAME),SYM(x),SYM(ARG1),SYM(ARG2)); \ addGSLRealRealRealFunc \ (SYM(cdf_##NAME##_P),SYM(x),SYM(ARG1),SYM(ARG2)); \ addGSLRealRealRealFunc \ (SYM(cdf_##NAME##_Q),SYM(x),SYM(ARG1),SYM(ARG2)); \ addGSLRealRealRealFunc \ (SYM(cdf_##NAME##_Pinv),SYM(P),SYM(ARG1),SYM(ARG2)); \ addGSLRealRealRealFunc \ (SYM(cdf_##NAME##_Qinv),SYM(Q),SYM(ARG1),SYM(ARG2)) // Uniform, log-normal, F, Beta, Pareto, Weibull, Type-1 Gumbel, // and Type-2 Gumbel distribution addGSLrealdist2param(flat,a,b); addGSLrealdist2param(lognormal,zeta,sigma); addGSLrealdist2param(fdist,nu1,nu2); addGSLrealdist2param(beta,a,b); addGSLrealdist2param(pareto,a,b); addGSLrealdist2param(weibull,a,b); addGSLrealdist2param(gumbel1,a,b); addGSLrealdist2param(gumbel2,a,b); #undef addGSLrealdist2param // Exponential power distribution addGSLrngRealRealFunc (SYM(rng_exppow),SYM(a),SYM(b)); addGSLRealRealRealFunc (SYM(pdf_exppow),SYM(x),SYM(a),SYM(b)); addGSLRealRealRealFunc (SYM(cdf_exppow_P),SYM(x),SYM(a),SYM(b)); addGSLRealRealRealFunc (SYM(cdf_exppow_Q),SYM(x),SYM(a),SYM(b)); // Exponential power distribution addGSLrngRealRealFunc (SYM(rng_rayleigh_tail),SYM(a),SYM(sigma)); addGSLRealRealRealFunc (SYM(pdf_rayleigh_tail),SYM(x),SYM(a),SYM(sigma)); // Landau distribution addGSLrngVoidFunc(SYM(rng_landau)); addGSLRealFunc(SYM(pdf_landau),SYM(x)); // Levy skwew alpha-stable distribution addFunc(GSLModule->e.ve,GSLrng_levy,primReal(),SYM(rng_levy), formal(primReal(),SYM(c)), formal(primReal(),SYM(alpha)), formal(primReal(),SYM(beta),true,false)); // Gamma distribution addFunc(GSLModule->e.ve,GSLrng_gamma,primReal(),SYM(rng_gamma), formal(primReal(),SYM(a)), formal(primReal(),SYM(b)), formal(primString(),SYM(method),true,false)); addGSLRealRealRealFunc (SYM(pdf_gamma),SYM(x),SYM(a),SYM(b)); addGSLRealRealRealFunc (SYM(cdf_gamma_P),SYM(x),SYM(a),SYM(b)); addGSLRealRealRealFunc (SYM(cdf_gamma_Q),SYM(x),SYM(a),SYM(b)); addGSLRealRealRealFunc (SYM(cdf_gamma_Pinv),SYM(P),SYM(a),SYM(b)); addGSLRealRealRealFunc (SYM(cdf_gamma_Qinv),SYM(Q),SYM(a),SYM(b)); // Sperical distributions addFunc(GSLModule->e.ve,GSLrng_dir2d,primPair(),SYM(rng_dir2d), formal(primString(),SYM(method),true,false)); addFunc(GSLModule->e.ve,GSLrng_dir3d,primTriple(),SYM(rng_dir3d)); addFunc(GSLModule->e.ve,GSLrng_dir,realArray(),SYM(rng_dir), formal(primInt(),SYM(n))); // Elliptic functions (Jacobi) addFunc(GSLModule->e.ve,GSLsf_elljac_e,realArray(),SYM(sncndn), formal(primReal(),SYM(u)),formal(primReal(),SYM(m))); // Dirirchlet distribution addFunc(GSLModule->e.ve,GSLrng_dirichlet,realArray(),SYM(rng_dirichlet), formal(realArray(),SYM(alpha))); addFunc(GSLModule->e.ve,GSLpdf_dirichlet,primReal(),SYM(pdf_dirichlet), formal(realArray(),SYM(alpha)), formal(realArray(),SYM(theta))); // General discrete distributions // to be implemented #define addGSLdiscdist1param(NAME,ARG,TYPE) \ addGSLrng##TYPE##FuncInt \ (SYM(rng_##NAME),SYM(ARG)); \ addGSLUInt##TYPE##Func \ (SYM(pdf_##NAME),SYM(k),SYM(ARG)); \ addGSLUInt##TYPE##Func \ (SYM(cdf_##NAME##_P),SYM(k),SYM(ARG)); \ addGSLUInt##TYPE##Func \ (SYM(cdf_##NAME##_Q),SYM(k),SYM(ARG)) // Poisson, geometric distributions addGSLdiscdist1param(poisson,mu,Real); addGSLdiscdist1param(geometric,p,Real); #undef addGSLdiscdist1param #define addGSLdiscdist2param(NAME,ARG1,TYPE1,ARG2,TYPE2) \ addGSLrng##TYPE1##TYPE2##FuncInt \ (SYM(rng_##NAME),SYM(ARG1),SYM(ARG2)); \ addGSLUInt##TYPE1##TYPE2##Func \ (SYM(pdf_##NAME),SYM(k),SYM(ARG1),SYM(ARG2)); \ addGSLUInt##TYPE1##TYPE2##Func \ (SYM(cdf_##NAME##_P),SYM(k),SYM(ARG1),SYM(ARG2)); \ addGSLUInt##TYPE1##TYPE2##Func \ (SYM(cdf_##NAME##_Q),SYM(k),SYM(ARG1),SYM(ARG2)) // Binomial, negative binomial distributions addGSLdiscdist2param(binomial,p,Real,n,UInt); addGSLdiscdist2param(negative_binomial,p,Real,n,Real); #undef addGSLdiscdist2param // Logarithmic distribution addGSLrngRealFuncInt(SYM(rng_logarithmic),SYM(p)); addGSLUIntRealFunc(SYM(pdf_logarithmic),SYM(k), SYM(p)); // Bernoulli distribution addGSLrngRealFuncInt(SYM(rng_bernoulli),SYM(p)); addGSLUIntRealFunc(SYM(pdf_bernoulli),SYM(k),SYM(p)); // Multinomial distribution addFunc(GSLModule->e.ve,GSLrng_multinomial,IntArray(),SYM(rng_multinomial), formal(primInt(),SYM(n)), formal(realArray(),SYM(p))); addFunc(GSLModule->e.ve,GSLpdf_multinomial,primReal(),SYM(pdf_multinomial), formal(realArray(),SYM(p)), formal(IntArray(),SYM(n))); // Hypergeometric distribution addGSLrngUIntUIntUIntFuncInt (SYM(rng_hypergeometric),SYM(n1),SYM(n2),SYM(t)); addGSLUIntUIntUIntUIntFunc (SYM(pdf_hypergeometric),SYM(k),SYM(n1),SYM(n2),SYM(t)); addGSLUIntUIntUIntUIntFunc (SYM(cdf_hypergeometric_P),SYM(k),SYM(n1),SYM(n2),SYM(t)); addGSLUIntUIntUIntUIntFunc (SYM(cdf_hypergeometric_Q),SYM(k),SYM(n1),SYM(n2),SYM(t)); } } // namespace trans #endif asymptote-3.05/runtime.h0000644000000000000000000000214015031566132014017 0ustar rootroot/***** Autogenerated from runtime.in; changes will be overwritten *****/ #pragma once namespace run { void IntZero(vm::stack *); void realZero(vm::stack *); void boolFalse(vm::stack *); void pushNullArray(vm::stack *); void pushNullRecord(vm::stack *); void pushNullFunction(vm::stack *); void pushDefault(vm::stack *); void isDefault(vm::stack *); void pairToGuide(vm::stack *); void pathToGuide(vm::stack *); void guideToPath(vm::stack *); void newPen(vm::stack *); void loadModule(vm::stack *); void nullGuide(vm::stack *); void dotsGuide(vm::stack *); void dashesGuide(vm::stack *); void newCycleToken(vm::stack *); void curlSpecifierValuePart(vm::stack *); void curlSpecifierSidePart(vm::stack *); void tensionSpecifierOutPart(vm::stack *); void tensionSpecifierInPart(vm::stack *); void tensionSpecifierAtleastPart(vm::stack *); void transformXPart(vm::stack *); void transformYPart(vm::stack *); void transformXXPart(vm::stack *); void transformXYPart(vm::stack *); void transformYXPart(vm::stack *); void transformYYPart(vm::stack *); void real6ToTransform(vm::stack *); void transformIdentity(vm::stack *); } asymptote-3.05/predicates.h0000644000000000000000000000173215031566105014465 0ustar rootroot#ifndef PREDICATES_H #define PREDICATES_H double orient2d(const double* pa, const double* pb, const double* pc); double orient2d(double ax, double ay, double bx, double by, double cx, double cy); double orient2dadapt(const double *pa, const double *pb, const double *pc, double detsum); double orient3d(const double *pa, const double *pb, const double *pc, const double *pd); double incircle(const double *pa, const double *pb, const double *pc, const double *pd); double incircle(double ax, double ay, double bx, double by, double cx, double cy, double dx, double dy); double insphere(const double *pa, const double *pb, const double *pc, const double *pd, const double *pe); extern const double resulterrbound,ccwerrboundA,ccwerrboundB,ccwerrboundC, o3derrboundA,o3derrboundB,o3derrboundC,iccerrboundA,iccerrboundB, iccerrboundC,isperrboundA,isperrboundB,isperrboundC; #endif asymptote-3.05/runmath.h0000644000000000000000000000034215031566132014014 0ustar rootroot/***** Autogenerated from runmath.in; changes will be overwritten *****/ #pragma once namespace run { void boolMemEq(vm::stack *); void boolMemNeq(vm::stack *); void boolFuncEq(vm::stack *); void boolFuncNeq(vm::stack *); } asymptote-3.05/lspstm.cc0000644000000000000000000000617715031566105014032 0ustar rootroot/** * @file lspstm.cc * @brief For createSymMap and other functions specific to Lsp in *stm classes. * @author Supakorn 'Jamie' Rassameemasmuang (jamievlin at outlook.com) */ #include "common.h" #include "exp.h" #include "stm.h" #define DEC_CREATE_SYM_MAP_FUNCTION_STM(derived_class) \ void derived_class::createSymMap(AsymptoteLsp::SymbolContext* symContext) namespace absyntax { #ifdef HAVE_LSP DEC_CREATE_SYM_MAP_FUNCTION_STM(forStm) { AsymptoteLsp::SymbolContext* ctx(symContext); if (init) { auto* declCtx(symContext->newContext(getPos().LineColumn())); init->createSymMap(declCtx); ctx= declCtx; } if (test) { test->createSymMap(ctx); } if (update) { update->createSymMap(ctx); } body->createSymMap(ctx); } DEC_CREATE_SYM_MAP_FUNCTION_STM(extendedForStm) { auto* declCtx(symContext->newContext(getPos().LineColumn())); std::string varName(var); // FIXME: How do we get the position of the actual variable name? // Right now, we only get the starting position of the type declaration declCtx->symMap.varDec.emplace( std::piecewise_construct, std::forward_as_tuple(varName), std::forward_as_tuple( varName, static_cast(*start), start->getPos().LineColumn() ) ); set->createSymMap(symContext); body->createSymMap(declCtx); } DEC_CREATE_SYM_MAP_FUNCTION_STM(returnStm) { if (value) { value->createSymMap(symContext); } } DEC_CREATE_SYM_MAP_FUNCTION_STM(blockStm) { base->createSymMap(symContext->newContext(getPos().LineColumn())); } DEC_CREATE_SYM_MAP_FUNCTION_STM(expStm) { body->createSymMap(symContext); } DEC_CREATE_SYM_MAP_FUNCTION_STM(ifStm) { test->createSymMap(symContext); onTrue->createSymMap(symContext); if (onFalse) { onFalse->createSymMap(symContext); } } DEC_CREATE_SYM_MAP_FUNCTION_STM(whileStm) { // while () { } // the part belongs in the main context as the while statement, // as it cannot declare new variables and only knows the symbols from that // context. test->createSymMap(symContext); // for the body part, { } are encapsulated in // the blockStm, while are direct statements. // If the while block does not use { }, then the body // can be considered the same context as it cannot declare new variables and // again, can only uses the variable already known before this while // statement. body->createSymMap(symContext); } DEC_CREATE_SYM_MAP_FUNCTION_STM(doStm) { body->createSymMap(symContext); test->createSymMap(symContext); } #else # define DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(derived_class) \ DEC_CREATE_SYM_MAP_FUNCTION_STM(derived_class) {} DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(forStm) DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(extendedForStm) DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(returnStm) DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(blockStm) DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(expStm) DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(ifStm) DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(whileStm) DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(doStm) #endif }// namespace absyntax asymptote-3.05/patches/0000755000000000000000000000000015031566105013615 5ustar rootrootasymptote-3.05/patches/gc6.8_AIX.patch0000644000000000000000000000041715031566105016166 0ustar rootroot*** gc.h.orig Fri Jul 7 18:10:16 2006 --- gc.h Mon Feb 12 12:30:48 2007 *************** *** 981 **** ! # define GC_INIT() { GC_add_roots(GC_DATASTART, GC_DATAEND); } --- 981 ---- ! # define GC_INIT() { GC_add_roots((char *) GC_DATASTART, (char *) GC_DATAEND); } asymptote-3.05/patches/gc-7.0nomem.patch0000644000000000000000000000075115031566105016570 0ustar rootroot*** gc_hdrs.h.orig Tue Jun 5 14:01:25 2007 --- gc_hdrs.h Thu Oct 18 14:32:03 2007 *************** *** 112,119 **** hhdr = hce -> hce_hdr; \ } else { \ hhdr = HEADER_CACHE_MISS(p, hce, source); \ - if (0 == hhdr) goto exit_label; \ } \ } typedef struct bi { --- 112,119 ---- hhdr = hce -> hce_hdr; \ } else { \ hhdr = HEADER_CACHE_MISS(p, hce, source); \ } \ + if (0 == hhdr) goto exit_label; \ } typedef struct bi { asymptote-3.05/patches/fixmem.reg0000644000000000000000000000016115031566105015577 0ustar rootrootWindows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\Software\Cygwin] "heap_chunk_in_mb"=dword:ffffff00 asymptote-3.05/patches/flex.patch0000644000000000000000000000276415031566105015605 0ustar rootrootdiff -u flex-2.5.39/gen.c flex-2.5.39J/gen.c --- flex-2.5.39/gen.c 2014-03-26 06:46:44.000000000 -0600 +++ flex-2.5.39J/gen.c 2014-04-26 10:52:30.962073096 -0600 @@ -55,6 +55,14 @@ * 0 elements of its arrays, too.) */ +static const char *get_yy_char_decl (void) +{ + return (gentables) + ? "static yyconst YY_CHAR %s[%d] =\n { 0,\n" + : "static yyconst YY_CHAR * %s = 0;\n"; +} + + static const char *get_int16_decl (void) { return (gentables) @@ -465,7 +473,7 @@ register int i, j; int numrows; - out_str_dec (get_int32_decl (), "yy_ec", csize); + out_str_dec (get_yy_char_decl (), "yy_ec", csize); for (i = 1; i < csize; ++i) { ecgroup[i] = ABS (ecgroup[i]); @@ -1271,7 +1279,7 @@ fputs (_("\n\nMeta-Equivalence Classes:\n"), stderr); - out_str_dec (get_int32_decl (), "yy_meta", numecs + 1); + out_str_dec (get_yy_char_decl (), "yy_meta", numecs + 1); buf_prints (&yydmap_buf, "\t{YYTD_ID_META, (void**)&yy_meta, sizeof(%s)},\n", "flex_int32_t"); @@ -1516,11 +1524,11 @@ if (yymore_used && !yytext_is_array) { indent_puts ("YY_G(yytext_ptr) -= YY_G(yy_more_len); \\"); indent_puts - ("yyleng = (size_t) (yy_cp - YY_G(yytext_ptr)); \\"); + ("yyleng = (int) (yy_cp - YY_G(yytext_ptr)); \\"); } else - indent_puts ("yyleng = (size_t) (yy_cp - yy_bp); \\"); + indent_puts ("yyleng = (int) (yy_cp - yy_bp); \\"); /* Now also deal with copying yytext_ptr to yytext if needed. */ skelout (); /* %% [3.0] - break point in skel */ asymptote-3.05/patches/gl-matrix-2.4.0-pruned.patch0000644000000000000000000004600615031566105020502 0ustar rootrootOnly in gl-matrix-2.4.0-pruned: LICENSE.js diff -r -u gl-matrix-2.4.0/src/gl-matrix/mat3.js gl-matrix-2.4.0-pruned/src/gl-matrix/mat3.js --- gl-matrix-2.4.0/src/gl-matrix/mat3.js 2017-07-22 13:02:47.000000000 -0600 +++ gl-matrix-2.4.0-pruned/src/gl-matrix/mat3.js 2019-09-27 15:41:24.534735384 -0600 @@ -70,7 +70,7 @@ * @param {mat3} a matrix to clone * @returns {mat3} a new 3x3 matrix */ -export function clone(a) { +function clone(a) { let out = new glMatrix.ARRAY_TYPE(9); out[0] = a[0]; out[1] = a[1]; @@ -91,7 +91,7 @@ * @param {mat3} a the source matrix * @returns {mat3} out */ -export function copy(out, a) { +function copy(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; @@ -118,7 +118,7 @@ * @param {Number} m22 Component in column 2, row 2 position (index 8) * @returns {mat3} A new mat3 */ -export function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) { +function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) { let out = new glMatrix.ARRAY_TYPE(9); out[0] = m00; out[1] = m01; @@ -147,7 +147,7 @@ * @param {Number} m22 Component in column 2, row 2 position (index 8) * @returns {mat3} out */ -export function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) { +function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) { out[0] = m00; out[1] = m01; out[2] = m02; @@ -166,7 +166,7 @@ * @param {mat3} out the receiving matrix * @returns {mat3} out */ -export function identity(out) { +function identity(out) { out[0] = 1; out[1] = 0; out[2] = 0; @@ -186,7 +186,7 @@ * @param {mat3} a the source matrix * @returns {mat3} out */ -export function transpose(out, a) { +function transpose(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache some values if (out === a) { let a01 = a[1], a02 = a[2], a12 = a[5]; @@ -254,7 +254,7 @@ * @param {mat3} a the source matrix * @returns {mat3} out */ -export function adjoint(out, a) { +function adjoint(out, a) { let a00 = a[0], a01 = a[1], a02 = a[2]; let a10 = a[3], a11 = a[4], a12 = a[5]; let a20 = a[6], a21 = a[7], a22 = a[8]; @@ -277,7 +277,7 @@ * @param {mat3} a the source matrix * @returns {Number} determinant of a */ -export function determinant(a) { +function determinant(a) { let a00 = a[0], a01 = a[1], a02 = a[2]; let a10 = a[3], a11 = a[4], a12 = a[5]; let a20 = a[6], a21 = a[7], a22 = a[8]; @@ -293,7 +293,7 @@ * @param {mat3} b the second operand * @returns {mat3} out */ -export function multiply(out, a, b) { +function multiply(out, a, b) { let a00 = a[0], a01 = a[1], a02 = a[2]; let a10 = a[3], a11 = a[4], a12 = a[5]; let a20 = a[6], a21 = a[7], a22 = a[8]; @@ -324,7 +324,7 @@ * @param {vec2} v vector to translate by * @returns {mat3} out */ -export function translate(out, a, v) { +function translate(out, a, v) { let a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], @@ -352,7 +352,7 @@ * @param {Number} rad the angle to rotate the matrix by * @returns {mat3} out */ -export function rotate(out, a, rad) { +function rotate(out, a, rad) { let a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], @@ -382,7 +382,7 @@ * @param {vec2} v the vec2 to scale the matrix by * @returns {mat3} out **/ -export function scale(out, a, v) { +function scale(out, a, v) { let x = v[0], y = v[1]; out[0] = x * a[0]; @@ -410,7 +410,7 @@ * @param {vec2} v Translation vector * @returns {mat3} out */ -export function fromTranslation(out, v) { +function fromTranslation(out, v) { out[0] = 1; out[1] = 0; out[2] = 0; @@ -434,7 +434,7 @@ * @param {Number} rad the angle to rotate the matrix by * @returns {mat3} out */ -export function fromRotation(out, rad) { +function fromRotation(out, rad) { let s = Math.sin(rad), c = Math.cos(rad); out[0] = c; @@ -462,7 +462,7 @@ * @param {vec2} v Scaling vector * @returns {mat3} out */ -export function fromScaling(out, v) { +function fromScaling(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; @@ -484,7 +484,7 @@ * @param {mat2d} a the matrix to copy * @returns {mat3} out **/ -export function fromMat2d(out, a) { +function fromMat2d(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = 0; @@ -507,7 +507,7 @@ * * @returns {mat3} out */ -export function fromQuat(out, q) { +function fromQuat(out, q) { let x = q[0], y = q[1], z = q[2], w = q[3]; let x2 = x + x; let y2 = y + y; @@ -546,7 +546,7 @@ * * @returns {mat3} out */ -export function normalFromMat4(out, a) { +function normalFromMat4(out, a) { let a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; let a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; let a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; @@ -596,7 +596,7 @@ * @param {number} height Height of gl context * @returns {mat3} out */ -export function projection(out, width, height) { +function projection(out, width, height) { out[0] = 2 / width; out[1] = 0; out[2] = 0; @@ -615,7 +615,7 @@ * @param {mat3} a matrix to represent as a string * @returns {String} string representation of the matrix */ -export function str(a) { +function str(a) { return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + a[8] + ')'; @@ -627,7 +627,7 @@ * @param {mat3} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ -export function frob(a) { +function frob(a) { return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2))) } @@ -639,7 +639,7 @@ * @param {mat3} b the second operand * @returns {mat3} out */ -export function add(out, a, b) { +function add(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; @@ -660,7 +660,7 @@ * @param {mat3} b the second operand * @returns {mat3} out */ -export function subtract(out, a, b) { +function subtract(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; @@ -683,7 +683,7 @@ * @param {Number} b amount to scale the matrix's elements by * @returns {mat3} out */ -export function multiplyScalar(out, a, b) { +function multiplyScalar(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; @@ -705,7 +705,7 @@ * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat3} out */ -export function multiplyScalarAndAdd(out, a, b, scale) { +function multiplyScalarAndAdd(out, a, b, scale) { out[0] = a[0] + (b[0] * scale); out[1] = a[1] + (b[1] * scale); out[2] = a[2] + (b[2] * scale); @@ -725,7 +725,7 @@ * @param {mat3} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ -export function exactEquals(a, b) { +function exactEquals(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8]; @@ -738,7 +738,7 @@ * @param {mat3} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ -export function equals(a, b) { +function equals(a, b) { let a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], a8 = a[8]; let b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8]; return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) && @@ -756,10 +756,10 @@ * Alias for {@link mat3.multiply} * @function */ -export const mul = multiply; +const mul = multiply; /** * Alias for {@link mat3.subtract} * @function */ -export const sub = subtract; +const sub = subtract; diff -r -u gl-matrix-2.4.0/src/gl-matrix/mat4.js gl-matrix-2.4.0-pruned/src/gl-matrix/mat4.js --- gl-matrix-2.4.0/src/gl-matrix/mat4.js 2017-07-22 13:02:47.000000000 -0600 +++ gl-matrix-2.4.0-pruned/src/gl-matrix/mat4.js 2019-09-27 15:41:24.534735384 -0600 @@ -57,7 +57,7 @@ * @param {mat4} a matrix to clone * @returns {mat4} a new 4x4 matrix */ -export function clone(a) { +function clone(a) { let out = new glMatrix.ARRAY_TYPE(16); out[0] = a[0]; out[1] = a[1]; @@ -85,7 +85,7 @@ * @param {mat4} a the source matrix * @returns {mat4} out */ -export function copy(out, a) { +function copy(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; @@ -126,7 +126,7 @@ * @param {Number} m33 Component in column 3, row 3 position (index 15) * @returns {mat4} A new mat4 */ -export function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { +function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { let out = new glMatrix.ARRAY_TYPE(16); out[0] = m00; out[1] = m01; @@ -169,7 +169,7 @@ * @param {Number} m33 Component in column 3, row 3 position (index 15) * @returns {mat4} out */ -export function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { +function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { out[0] = m00; out[1] = m01; out[2] = m02; @@ -223,7 +223,7 @@ * @param {mat4} a the source matrix * @returns {mat4} out */ -export function transpose(out, a) { +function transpose(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache some values if (out === a) { let a01 = a[1], a02 = a[2], a03 = a[3]; @@ -325,7 +325,7 @@ * @param {mat4} a the source matrix * @returns {mat4} out */ -export function adjoint(out, a) { +function adjoint(out, a) { let a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; let a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; let a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; @@ -356,7 +356,7 @@ * @param {mat4} a the source matrix * @returns {Number} determinant of a */ -export function determinant(a) { +function determinant(a) { let a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; let a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; let a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; @@ -465,7 +465,7 @@ * @param {vec3} v the vec3 to scale the matrix by * @returns {mat4} out **/ -export function scale(out, a, v) { +function scale(out, a, v) { let x = v[0], y = v[1], z = v[2]; out[0] = a[0] * x; @@ -558,7 +558,7 @@ * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ -export function rotateX(out, a, rad) { +function rotateX(out, a, rad) { let s = Math.sin(rad); let c = Math.cos(rad); let a10 = a[4]; @@ -601,7 +601,7 @@ * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ -export function rotateY(out, a, rad) { +function rotateY(out, a, rad) { let s = Math.sin(rad); let c = Math.cos(rad); let a00 = a[0]; @@ -644,7 +644,7 @@ * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ -export function rotateZ(out, a, rad) { +function rotateZ(out, a, rad) { let s = Math.sin(rad); let c = Math.cos(rad); let a00 = a[0]; @@ -721,7 +721,7 @@ * @param {vec3} v Scaling vector * @returns {mat4} out */ -export function fromScaling(out, v) { +function fromScaling(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; @@ -800,7 +800,7 @@ * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ -export function fromXRotation(out, rad) { +function fromXRotation(out, rad) { let s = Math.sin(rad); let c = Math.cos(rad); @@ -835,7 +835,7 @@ * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ -export function fromYRotation(out, rad) { +function fromYRotation(out, rad) { let s = Math.sin(rad); let c = Math.cos(rad); @@ -870,7 +870,7 @@ * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ -export function fromZRotation(out, rad) { +function fromZRotation(out, rad) { let s = Math.sin(rad); let c = Math.cos(rad); @@ -909,7 +909,7 @@ * @param {vec3} v Translation vector * @returns {mat4} out */ -export function fromRotationTranslation(out, q, v) { +function fromRotationTranslation(out, q, v) { // Quaternion math let x = q[0], y = q[1], z = q[2], w = q[3]; let x2 = x + x; @@ -955,7 +955,7 @@ * @param {mat4} mat Matrix to be decomposed (input) * @return {vec3} out */ -export function getTranslation(out, mat) { +function getTranslation(out, mat) { out[0] = mat[12]; out[1] = mat[13]; out[2] = mat[14]; @@ -973,7 +973,7 @@ * @param {mat4} mat Matrix to be decomposed (input) * @return {vec3} out */ -export function getScaling(out, mat) { +function getScaling(out, mat) { let m11 = mat[0]; let m12 = mat[1]; let m13 = mat[2]; @@ -1000,7 +1000,7 @@ * @param {mat4} mat Matrix to be decomposed (input) * @return {quat} out */ -export function getRotation(out, mat) { +function getRotation(out, mat) { // Algorithm taken from http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm let trace = mat[0] + mat[5] + mat[10]; let S = 0; @@ -1051,7 +1051,7 @@ * @param {vec3} s Scaling vector * @returns {mat4} out */ -export function fromRotationTranslationScale(out, q, v, s) { +function fromRotationTranslationScale(out, q, v, s) { // Quaternion math let x = q[0], y = q[1], z = q[2], w = q[3]; let x2 = x + x; @@ -1111,7 +1111,7 @@ * @param {vec3} o The origin vector around which to scale and rotate * @returns {mat4} out */ -export function fromRotationTranslationScaleOrigin(out, q, v, s, o) { +function fromRotationTranslationScaleOrigin(out, q, v, s, o) { // Quaternion math let x = q[0], y = q[1], z = q[2], w = q[3]; let x2 = x + x; @@ -1164,7 +1164,7 @@ * * @returns {mat4} out */ -export function fromQuat(out, q) { +function fromQuat(out, q) { let x = q[0], y = q[1], z = q[2], w = q[3]; let x2 = x + x; let y2 = y + y; @@ -1248,7 +1248,7 @@ * @param {number} far Far bound of the frustum * @returns {mat4} out */ -export function perspective(out, fovy, aspect, near, far) { +function perspective(out, fovy, aspect, near, far) { let f = 1.0 / Math.tan(fovy / 2); let nf = 1 / (near - far); out[0] = f / aspect; @@ -1281,7 +1281,7 @@ * @param {number} far Far bound of the frustum * @returns {mat4} out */ -export function perspectiveFromFieldOfView(out, fov, near, far) { +function perspectiveFromFieldOfView(out, fov, near, far) { let upTan = Math.tan(fov.upDegrees * Math.PI/180.0); let downTan = Math.tan(fov.downDegrees * Math.PI/180.0); let leftTan = Math.tan(fov.leftDegrees * Math.PI/180.0); @@ -1352,7 +1352,7 @@ * @param {vec3} up vec3 pointing up * @returns {mat4} out */ -export function lookAt(out, eye, center, up) { +function lookAt(out, eye, center, up) { let x0, x1, x2, y0, y1, y2, z0, z1, z2, len; let eyex = eye[0]; let eyey = eye[1]; @@ -1439,7 +1439,7 @@ * @param {vec3} up vec3 pointing up * @returns {mat4} out */ -export function targetTo(out, eye, target, up) { +function targetTo(out, eye, target, up) { let eyex = eye[0], eyey = eye[1], eyez = eye[2], @@ -1488,7 +1488,7 @@ * @param {mat4} a matrix to represent as a string * @returns {String} string representation of the matrix */ -export function str(a) { +function str(a) { return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' + @@ -1501,7 +1501,7 @@ * @param {mat4} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ -export function frob(a) { +function frob(a) { return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2) + Math.pow(a[9], 2) + Math.pow(a[10], 2) + Math.pow(a[11], 2) + Math.pow(a[12], 2) + Math.pow(a[13], 2) + Math.pow(a[14], 2) + Math.pow(a[15], 2) )) } @@ -1513,7 +1513,7 @@ * @param {mat4} b the second operand * @returns {mat4} out */ -export function add(out, a, b) { +function add(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; @@ -1541,7 +1541,7 @@ * @param {mat4} b the second operand * @returns {mat4} out */ -export function subtract(out, a, b) { +function subtract(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; @@ -1569,7 +1569,7 @@ * @param {Number} b amount to scale the matrix's elements by * @returns {mat4} out */ -export function multiplyScalar(out, a, b) { +function multiplyScalar(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; @@ -1598,7 +1598,7 @@ * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat4} out */ -export function multiplyScalarAndAdd(out, a, b, scale) { +function multiplyScalarAndAdd(out, a, b, scale) { out[0] = a[0] + (b[0] * scale); out[1] = a[1] + (b[1] * scale); out[2] = a[2] + (b[2] * scale); @@ -1625,7 +1625,7 @@ * @param {mat4} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ -export function exactEquals(a, b) { +function exactEquals(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && @@ -1639,7 +1639,7 @@ * @param {mat4} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ -export function equals(a, b) { +function equals(a, b) { let a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; let a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7]; let a8 = a[8], a9 = a[9], a10 = a[10], a11 = a[11]; @@ -1672,10 +1672,10 @@ * Alias for {@link mat4.multiply} * @function */ -export const mul = multiply; +const mul = multiply; /** * Alias for {@link mat4.subtract} * @function */ -export const sub = subtract; +const sub = subtract; diff -r -u gl-matrix-2.4.0/src/gl-matrix.js gl-matrix-2.4.0-pruned/src/gl-matrix.js --- gl-matrix-2.4.0/src/gl-matrix.js 2017-07-22 13:02:47.000000000 -0600 +++ gl-matrix-2.4.0-pruned/src/gl-matrix.js 2019-09-27 17:04:06.477164503 -0600 @@ -26,19 +26,9 @@ THE SOFTWARE. */ // END HEADER -import * as glMatrix from "./gl-matrix/common"; -import * as mat2 from "./gl-matrix/mat2"; -import * as mat2d from "./gl-matrix/mat2d"; import * as mat3 from "./gl-matrix/mat3"; import * as mat4 from "./gl-matrix/mat4"; -import * as quat from "./gl-matrix/quat"; -import * as vec2 from "./gl-matrix/vec2"; -import * as vec3 from "./gl-matrix/vec3"; -import * as vec4 from "./gl-matrix/vec4"; export { - glMatrix, - mat2, mat2d, mat3, mat4, - quat, - vec2, vec3, vec4, -}; \ No newline at end of file + mat3,mat4 +}; asymptote-3.05/patches/bison.patch0000644000000000000000000001221615031566105015752 0ustar rootrootdiff -ru bison-2.0a/data/yacc.c bison-2.0aJ/data/yacc.c --- bison-2.0a/data/yacc.c 2005-05-21 11:12:32.000000000 -0600 +++ bison-2.0aJ/data/yacc.c 2005-06-30 18:14:16.509158136 -0600 @@ -237,7 +237,7 @@ # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# define YYSTACK_FREE(Ptr) { /* empty */; } # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely @@ -291,19 +291,20 @@ /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY -# if defined (__GNUC__) && 1 < __GNUC__ +# if defined (__GNUC__) +# if 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else +# endif +# endif +# endif +# ifndef YYCOPY # define YYCOPY(To, From, Count) \ - do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ - } \ - while (0) -# endif + } # endif /* Relocate STACK from its old location to the new one. The @@ -312,15 +313,13 @@ stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ - do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (0) + } #endif @@ -487,6 +486,7 @@ #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab +int yy_false=false; /* Used to suppress compiler warning about unused label */ /* Like YYERROR except do call yyerror. This remains here temporarily @@ -498,7 +498,7 @@ #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ -do \ +{ \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ @@ -512,7 +512,7 @@ yyerror (]b4_yyerror_args[_("syntax error: cannot back up")); \ YYERROR; \ } \ -while (0) +} #define YYTERROR 1 @@ -526,7 +526,7 @@ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ + { \ if (N) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ @@ -541,7 +541,7 @@ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ - while (0) + } #endif @@ -550,7 +550,7 @@ we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT -# if YYLTYPE_IS_TRIVIAL +# ifdef YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ @@ -578,13 +578,13 @@ # endif # define YYDPRINTF(Args) \ -do { \ +{ \ if (yydebug) \ YYFPRINTF Args; \ -} while (0) +} # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ +{ \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ @@ -592,7 +592,7 @@ Type, Value]b4_location_if([, Location])[); \ YYFPRINTF (stderr, "\n"); \ } \ -} while (0) +} /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | @@ -610,10 +610,10 @@ } # define YY_STACK_PRINT(Bottom, Top) \ -do { \ +{ \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ -} while (0) +} /*------------------------------------------------. @@ -634,10 +634,10 @@ } # define YY_REDUCE_PRINT(Rule) \ -do { \ +{ \ if (yydebug) \ yy_reduce_print (Rule); \ -} while (0) +} /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ @@ -826,7 +826,7 @@ /* When reducing, the number of symbols on the RHS of the reduced rule. */ - int yylen; + int yylen=0; YYDPRINTF ((stderr, "Starting parse\n")); @@ -874,7 +874,7 @@ yyssp++; yysetstate: - *yyssp = yystate; + *yyssp = (short int) yystate; if (yyss + yystacksize - 1 <= yyssp) { @@ -1222,12 +1222,6 @@ `---------------------------------------------------*/ yyerrorlab: - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (0) - goto yyerrorlab; - ]b4_location_if([[ yyerror_range[0] = yylsp[1-yylen]; yylsp -= yylen; ]])[yyvsp -= yylen; @@ -1297,6 +1291,13 @@ `-----------------------------------*/ yyabortlab: yyresult = 1; + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (yy_false) + goto yyerrorlab; + goto yyreturn; #ifndef yyoverflow asymptote-3.05/patches/README0000644000000000000000000000207215031566105014476 0ustar rootrootThe optional patches to flex-2.5.31 and bison-2.0a in this directory fix a number of problems with warning and/or error messages generated by strict compilers. A modified version of dvipdf that accepts common dvips options is included. The file gcc3.3.2curses.patch can be used to patch the broken curses.h header files (or a local copy thereof in the current directory) on some AIX and IRIX systems. The file gc6.8_AIX.patch fixes an incorrect Boehm garbage collector prototype in the file gc6.8/include/gc.h (version 6.8). The file gc-7.0nomem.patch avoids segmentation faults with gc-7.0 on out-of-memory errors. The file cygwin_freeglut-3.0.0.patch fixes undefined symbols when compiling the freeglut library statically under cygwin. The file fixmem.reg patches the Microsoft Windows registry so that the cygwin1.dll library can allocate more than 384MB. It is applied automatically by the Asymptote setup.exe file but may also be applied manually: regedit /s fixmem.reg The file gl-matrix-2.4.0-pruned.patch is used to build the required subset of the gl-matrix library.asymptote-3.05/patches/gcc3.3.2curses.patch0000644000000000000000000000047615031566105017212 0ustar rootroot*** curses.h.orig Sun Feb 11 21:43:36 2007 --- curses.h Sun Feb 11 21:43:21 2007 *************** *** 1302 **** ! #if defined(__USE_FIXED_PROTOTYPES__) || defined(__cplusplus) || defined (__STRICT_ANSI__) --- 1302 ---- ! #if 0 && (defined(__USE_FIXED_PROTOTYPES__) || defined(__cplusplus) || defined (__STRICT_ANSI__)) asymptote-3.05/patches/dvipdf0000755000000000000000000000242315031566105015020 0ustar rootroot#!/bin/sh # Convert DVI to PDF. # # Please contact Andrew Ford with any questions # about this file. # # Based on ps2pdf # This definition is changed on install to match the # executable name set in the makefile GS_EXECUTABLE=gs OPTIONS="" DVIPSOPTIONS="" while true do case "$1" in -R*) DVIPSOPTIONS="$DVIPSOPTIONS $1";; -z) DVIPSOPTIONS="$DVIPSOPTIONS -z" ;; -pp) shift; DVIPSOPTIONS="$DVIPSOPTIONS -pp $1" ;; -p) shift; DVIPSOPTIONS="$DVIPSOPTIONS -p $1" ;; -t) shift; DVIPSOPTIONS="$DVIPSOPTIONS -t $1" ;; -T) shift; DVIPSOPTIONS="$DVIPSOPTIONS -T $1" ;; -l) shift; DVIPSOPTIONS="$DVIPSOPTIONS -l $1" ;; -?*) OPTIONS="$OPTIONS $1" ;; *) break ;; esac shift done if [ $# -lt 1 -o $# -gt 2 ]; then echo "Usage: `basename \"$0\"` [options...] input.dvi [output.pdf]" 1>&2 exit 1 fi infile=$1; if [ $# -eq 1 ] then case "${infile}" in *.dvi) base=`basename "${infile}" .dvi` ;; *) base=`basename "${infile}"` ;; esac outfile="${base}".pdf else outfile=$2 fi # We have to include the options twice because -I only takes effect if it # appears before other options. exec dvips -Ppdf $DVIPSOPTIONS -q -f "$infile" | $GS_EXECUTABLE $OPTIONS -q -P- -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sstdout=%stderr -sOutputFile="$outfile" $OPTIONS - asymptote-3.05/v3dtypes.h0000644000000000000000000000102115031566132014112 0ustar rootroot// Enum class for v3dtypes // AUTO-GENERATED from v3dtypes.csv namespace camp { enum v3dtypes : uint32_t { material=1, transform=2, element=3, centers=4, header=5, line=64, triangle=65, quad=66, curve=128, bezierTriangle=129, bezierPatch=130, lineColor=192, triangleColor=193, quadColor=194, curveColor=256, bezierTriangleColor=257, bezierPatchColor=258, triangles=512, disk=1024, cylinder=1025, tube=1026, sphere=1027, halfSphere=1028, animation=2048, pixel=4096, }; } // namespace camp // End of File asymptote-3.05/memory.cc0000644000000000000000000000214315031566105014005 0ustar rootroot/** * @file memory.cc * @brief Implementation of certain gc-related functions */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include "memory.h" #include // asy_malloc functions + GC_throw_bad_alloc #if defined(USEGC) void* asy_malloc(size_t n) { #ifdef GC_DEBUG if(void *mem=GC_debug_malloc_ignore_off_page(n, GC_EXTRAS)) #else if(void *mem=GC_malloc_ignore_off_page(n)) #endif return mem; throw std::bad_alloc(); } void* asy_malloc_atomic(size_t n) { #ifdef GC_DEBUG if(void *mem=GC_debug_malloc_atomic_ignore_off_page(n, GC_EXTRAS)) #else if(void *mem=GC_malloc_atomic_ignore_off_page(n)) #endif return mem; throw std::bad_alloc(); } #if !defined(_WIN32) GC_API void GC_CALL GC_throw_bad_alloc() { throw std::bad_alloc(); } #endif #endif // defined(USEGC) // compact & stdString functions namespace mem { #if defined(USEGC) void compact(int x) { GC_set_dont_expand(x); } std::string stdString(string s) { return std::string(s.c_str()); } #else // defined(USEGC) std::string stdString(string s) { return s; } #endif // defined(USEGC) } // throw bad alloc asymptote-3.05/runtime.cc0000644000000000000000000017330615031566132014172 0ustar rootroot/***** Autogenerated from runtime.in; changes will be overwritten *****/ #line 1 "./runtimebase.in" /***** * runtimebase.in * Andy Hammerlindl 2009/07/28 * * Common declarations needed for all code-generating .in files. * *****/ #line 1 "./runtime.in" /***** * runtime.in * Tom Prince 2005/4/15 * * Generate the runtime functions used by the vm::stack machine. * *****/ /* Autogenerated routines are specified like this (separated by a formfeed): type asyname:cname(cparams) { C code } */ // Use Void f() instead of void f() to force an explicit Stack argument. #line 23 "./runtimebase.in" #include "stack.h" #include "types.h" #include "builtin.h" #include "entry.h" #include "errormsg.h" #include "array.h" #include "triple.h" #include "callable.h" #include "opsymbols.h" using vm::stack; using vm::error; using vm::array; using vm::read; using vm::callable; using types::formal; using types::function; using camp::triple; #define PRIMITIVE(name,Name,asyName) using types::prim##Name; #include #undef PRIMITIVE void unused(void *); namespace run { typedef double real; array *copyArray(array *a); array *copyArray2(array *a); array *copyArray3(array *a); double *copyTripleArray2Components(array *a, size_t &N, GCPlacement placement=NoGC); triple *copyTripleArray2C(array *a, size_t &N, GCPlacement placement=NoGC); } function *realRealFunction(); #define CURRENTPEN processData().currentpen #line 52 "runtime.in" #include #include #include #include #include #include #if !defined(_WIN32) #include #endif #include #include "angle.h" #include "pair.h" #include "triple.h" #include "transform.h" #include "path.h" #include "path3.h" #include "pen.h" #include "drawpath.h" #include "guide.h" #include "picture.h" #include "fileio.h" #include "genv.h" #include "builtin.h" #include "texfile.h" #include "pipestream.h" #include "asyparser.h" #include "stack.h" #include "util.h" #include "locate.h" #include "mathop.h" #include "callable.h" #include "stm.h" #include "lexical.h" #include "asyprocess.h" #include "arrayop.h" #include "seconds.h" #if defined(USEGC) && defined(GC_DEBUG) && defined(GC_BACKTRACE) extern "C" { void *GC_generate_random_valid_address(void); void GC_debug_print_heap_obj_proc(void *); } #endif using namespace vm; using namespace camp; using namespace settings; using namespace utils; #undef OUT #undef IN namespace run { using camp::pair; using vm::array; using vm::vmFrame; using vm::stack; using camp::transform; using absyntax::runnable; typedef array boolarray; typedef array Intarray; typedef array Intarray2; typedef array realarray; typedef array realarray2; typedef array pairarray; typedef array pairarray2; typedef array triplearray; typedef array triplearray2; typedef array patharray; typedef array patharray2; typedef array guidearray; typedef array transformarray; typedef array penarray; typedef array penarray2; typedef array stringarray; typedef array stringarray2; } using vm::array; using types::function; #define PRIMITIVE(name,Name,asyName) using types::prim##Name; #include #undef PRIMITIVE using types::booleanArray; using types::IntArray; using types::IntArray2; using types::realArray; using types::realArray2; using types::pairArray; using types::pairArray2; using types::tripleArray; using types::tripleArray2; using types::pathArray; using types::pathArray2; using types::guideArray; using types::transformArray; using types::penArray; using types::penArray2; using types::stringArray; using types::stringArray2; using types::formal; function *realRealFunction() { return new function(primReal(),primReal()); } function *realTripleFunction() { return new function(primReal(),primTriple()); } const size_t camp::ColorComponents[]={0,0,1,3,4,0}; namespace vm { #if COMPACT const Int DefaultValue=0x7fffffffffffffffLL; const Int Undefined=0x7ffffffffffffffeLL; const Int BoolTruthValue=0xABABABABABABABACLL; const Int BoolFalseValue=0xABABABABABABABABLL; const item Default=DefaultValue; #else const item Default=item(default_t()); #endif } namespace run { stopWatch wallClock; cpuTimer cpuTime; const char *arrayempty="cannot take min or max of empty array"; const char *noruntime="no runtime environment for embedded eval"; void writestring(stack *s) { callable *suffix=pop(s,NULL); string S=pop(s); vm::item it=pop(s); bool defaultfile=isdefault(it); camp::file *f=defaultfile ? &camp::Stdout : vm::get(it); if(!f->isOpen() || !f->enabled()) return; if(S != "" || f->isBinary() || f->isXDR()) f->write(S); if(f->text()) { if(suffix) { s->push(f); suffix->call(s); } else if(defaultfile) f->writeline(); } } string toplocation() { ostringstream buf; position& topPos=processData().topPos; buf << topPos.Line() << "." << topPos.Column(); return buf.str(); } string emptystring; pair zero; } static string defaulttransparency=string("Compatible"); void unused(void *) { } // Autogenerated routines: #ifndef NOSYM #include "runtime.symbols.h" #endif namespace run { // Initializers #line 235 "./runtime.in" void IntZero(stack *Stack) { #line 236 "./runtime.in" {Stack->push(0); return;} } #line 241 "./runtime.in" void realZero(stack *Stack) { #line 242 "./runtime.in" {Stack->push(0.0); return;} } #line 246 "./runtime.in" void boolFalse(stack *Stack) { #line 247 "./runtime.in" {Stack->push(false); return;} } #line 251 "./runtime.in" // bool isnan(real x); void gen_runtime3(stack *Stack) { real x=vm::pop(Stack); #line 252 "./runtime.in" {Stack->push(std::isnan(x)); return;} } #line 256 "./runtime.in" void pushNullArray(stack *Stack) { #line 257 "./runtime.in" {Stack->push(0); return;} } #line 261 "./runtime.in" void pushNullRecord(stack *Stack) { #line 262 "./runtime.in" {Stack->push(0); return;} } #line 266 "./runtime.in" void pushNullFunction(stack *Stack) { #line 267 "./runtime.in" {Stack->push(nullfunc::instance()); return;} } // Default operations // Put the default value token on the stack (in place of an argument when // making a function call). #line 276 "./runtime.in" void pushDefault(stack *Stack) { #line 277 "./runtime.in" {Stack->push(Default); return;} } // Test if the value on the stack is the default value token. #line 283 "./runtime.in" void isDefault(stack *Stack) { item i=vm::pop(Stack); #line 284 "./runtime.in" {Stack->push(isdefault(i)); return;} } // Casts #line 290 "./runtime.in" void pairToGuide(stack *Stack) { pair z=vm::pop(Stack); #line 291 "./runtime.in" {Stack->push(new pairguide(z)); return;} } #line 296 "./runtime.in" void pathToGuide(stack *Stack) { path p=vm::pop(Stack); #line 297 "./runtime.in" {Stack->push(new pathguide(p)); return;} } #line 301 "./runtime.in" void guideToPath(stack *Stack) { guide * g=vm::pop(Stack); #line 302 "./runtime.in" {Stack->push(g->solve()); return;} } // Pen operations #line 308 "./runtime.in" void newPen(stack *Stack) { #line 309 "./runtime.in" {Stack->push(pen()); return;} } #line 314 "./runtime.in" // bool ==(pen a, pen b); void gen_runtime13(stack *Stack) { pen b=vm::pop(Stack); pen a=vm::pop(Stack); #line 315 "./runtime.in" {Stack->push(a == b); return;} } #line 319 "./runtime.in" // bool !=(pen a, pen b); void gen_runtime14(stack *Stack) { pen b=vm::pop(Stack); pen a=vm::pop(Stack); #line 320 "./runtime.in" {Stack->push(a != b); return;} } #line 324 "./runtime.in" // pen +(pen a, pen b); void gen_runtime15(stack *Stack) { pen b=vm::pop(Stack); pen a=vm::pop(Stack); #line 325 "./runtime.in" {Stack->push(a+b); return;} } #line 329 "./runtime.in" // pen *(real a, pen b); void gen_runtime16(stack *Stack) { pen b=vm::pop(Stack); real a=vm::pop(Stack); #line 330 "./runtime.in" {Stack->push(a*b); return;} } #line 334 "./runtime.in" // pen *(pen a, real b); void gen_runtime17(stack *Stack) { real b=vm::pop(Stack); pen a=vm::pop(Stack); #line 335 "./runtime.in" {Stack->push(b*a); return;} } #line 339 "./runtime.in" // pair max(pen p); void gen_runtime18(stack *Stack) { pen p=vm::pop(Stack); #line 340 "./runtime.in" {Stack->push(p.bounds().Max()); return;} } #line 344 "./runtime.in" // pair min(pen p); void gen_runtime19(stack *Stack) { pen p=vm::pop(Stack); #line 345 "./runtime.in" {Stack->push(p.bounds().Min()); return;} } // Reset the meaning of pen default attributes. #line 350 "./runtime.in" // void resetdefaultpen(); void gen_runtime20(stack *) { #line 351 "./runtime.in" processData().defaultpen=camp::pen::initialpen(); } #line 355 "./runtime.in" // void defaultpen(pen p); void gen_runtime21(stack *Stack) { pen p=vm::pop(Stack); #line 356 "./runtime.in" processData().defaultpen=pen(resolvepen,p); } #line 360 "./runtime.in" // pen defaultpen(); void gen_runtime22(stack *Stack) { #line 361 "./runtime.in" {Stack->push(processData().defaultpen); return;} } #line 365 "./runtime.in" // bool invisible(pen p); void gen_runtime23(stack *Stack) { pen p=vm::pop(Stack); #line 366 "./runtime.in" {Stack->push(p.invisible()); return;} } #line 370 "./runtime.in" // pen invisible(); void gen_runtime24(stack *Stack) { #line 371 "./runtime.in" {Stack->push(pen(invisiblepen)); return;} } #line 375 "./runtime.in" // pen gray(pen p); void gen_runtime25(stack *Stack) { pen p=vm::pop(Stack); #line 376 "./runtime.in" p.togrey(); {Stack->push(p); return;} } #line 381 "./runtime.in" // pen rgb(pen p); void gen_runtime26(stack *Stack) { pen p=vm::pop(Stack); #line 382 "./runtime.in" p.torgb(); {Stack->push(p); return;} } #line 387 "./runtime.in" // pen cmyk(pen p); void gen_runtime27(stack *Stack) { pen p=vm::pop(Stack); #line 388 "./runtime.in" p.tocmyk(); {Stack->push(p); return;} } #line 393 "./runtime.in" // pen interp(pen a, pen b, real t); void gen_runtime28(stack *Stack) { real t=vm::pop(Stack); pen b=vm::pop(Stack); pen a=vm::pop(Stack); #line 394 "./runtime.in" {Stack->push(interpolate(a,b,t)); return;} } #line 398 "./runtime.in" // pen rgb(real r, real g, real b); void gen_runtime29(stack *Stack) { real b=vm::pop(Stack); real g=vm::pop(Stack); real r=vm::pop(Stack); #line 399 "./runtime.in" {Stack->push(pen(r,g,b)); return;} } #line 403 "./runtime.in" // pen cmyk(real c, real m, real y, real k); void gen_runtime30(stack *Stack) { real k=vm::pop(Stack); real y=vm::pop(Stack); real m=vm::pop(Stack); real c=vm::pop(Stack); #line 404 "./runtime.in" {Stack->push(pen(c,m,y,k)); return;} } #line 408 "./runtime.in" // pen gray(real gray); void gen_runtime31(stack *Stack) { real gray=vm::pop(Stack); #line 409 "./runtime.in" {Stack->push(pen(gray)); return;} } #line 413 "./runtime.in" // realarray* colors(pen p); void gen_runtime32(stack *Stack) { pen p=vm::pop(Stack); #line 414 "./runtime.in" size_t n=ColorComponents[p.colorspace()]; array *a=new array(n); switch(n) { case 0: break; case 1: (*a)[0]=p.gray(); break; case 3: (*a)[0]=p.red(); (*a)[1]=p.green(); (*a)[2]=p.blue(); break; case 4: (*a)[0]=p.cyan(); (*a)[1]=p.magenta(); (*a)[2]=p.yellow(); (*a)[3]=p.black(); break; default: break; } {Stack->push(a); return;} } #line 441 "./runtime.in" // string hex(pen p); void gen_runtime33(stack *Stack) { pen p=vm::pop(Stack); #line 442 "./runtime.in" {Stack->push(p.hex()); return;} } #line 446 "./runtime.in" // Int byte(real x); void gen_runtime34(stack *Stack) { real x=vm::pop(Stack); #line 447 "./runtime.in" {Stack->push(camp::byte(x)); return;} } #line 451 "./runtime.in" // real byteinv(Int x); void gen_runtime35(stack *Stack) { Int x=vm::pop(Stack); #line 452 "./runtime.in" {Stack->push(x >= 0 ? camp::byteinv(x) : 0.0); return;} } #line 456 "./runtime.in" // string colorspace(pen p); void gen_runtime36(stack *Stack) { pen p=vm::pop(Stack); #line 457 "./runtime.in" string s=ColorDeviceSuffix[p.colorspace()]; std::transform(s.begin(),s.end(),s.begin(),tolower); {Stack->push(s); return;} } #line 463 "./runtime.in" // pen pattern(string *s); void gen_runtime37(stack *Stack) { string * s=vm::pop(Stack); #line 464 "./runtime.in" {Stack->push(pen(setpattern,*s)); return;} } #line 468 "./runtime.in" // string pattern(pen p); void gen_runtime38(stack *Stack) { pen p=vm::pop(Stack); #line 469 "./runtime.in" {Stack->push(p.fillpattern()); return;} } #line 473 "./runtime.in" // pen fillrule(Int n); void gen_runtime39(stack *Stack) { Int n=vm::pop(Stack); #line 474 "./runtime.in" {Stack->push(pen(n >= 0 && n < nFill ? (FillRule) n : DEFFILL)); return;} } #line 478 "./runtime.in" // Int fillrule(pen p); void gen_runtime40(stack *Stack) { pen p=vm::pop(Stack); #line 479 "./runtime.in" {Stack->push(p.Fillrule()); return;} } #line 483 "./runtime.in" // pen opacity(real opacity=1.0, string blend=defaulttransparency); void gen_runtime41(stack *Stack) { string blend=vm::pop(Stack,defaulttransparency); real opacity=vm::pop(Stack,1.0); #line 484 "./runtime.in" for(Int i=0; i < nBlendMode; ++i) if(blend == BlendMode[i]) {Stack->push(pen(Transparency(blend,opacity))); return;} ostringstream buf; buf << "Unknown blend mode: " << "'" << blend << "'"; error(buf); } #line 493 "./runtime.in" // real opacity(pen p); void gen_runtime42(stack *Stack) { pen p=vm::pop(Stack); #line 494 "./runtime.in" {Stack->push(p.opacity()); return;} } #line 498 "./runtime.in" // string blend(pen p); void gen_runtime43(stack *Stack) { pen p=vm::pop(Stack); #line 499 "./runtime.in" {Stack->push(p.blend()); return;} } #line 503 "./runtime.in" // pen linetype(realarray *pattern, real offset=0, bool scale=true, bool adjust=true); void gen_runtime44(stack *Stack) { bool adjust=vm::pop(Stack,true); bool scale=vm::pop(Stack,true); real offset=vm::pop(Stack,0); realarray * pattern=vm::pop(Stack); #line 505 "./runtime.in" size_t size=checkArray(pattern); array *a=new array(size); for(size_t i=0; i < size; ++i) (*a)[i]=::max(vm::read(pattern,i),0.0); {Stack->push(pen(LineType(*a,offset,scale,adjust))); return;} } #line 514 "./runtime.in" // realarray* linetype(pen p=CURRENTPEN); void gen_runtime45(stack *Stack) { pen p=vm::pop(Stack,CURRENTPEN); #line 515 "./runtime.in" array a=p.linetype()->pattern; {Stack->push(copyArray(&a)); return;} } #line 520 "./runtime.in" // real offset(pen p); void gen_runtime46(stack *Stack) { pen p=vm::pop(Stack); #line 521 "./runtime.in" {Stack->push(p.linetype()->offset); return;} } #line 525 "./runtime.in" // bool scale(pen p); void gen_runtime47(stack *Stack) { pen p=vm::pop(Stack); #line 526 "./runtime.in" {Stack->push(p.linetype()->scale); return;} } #line 530 "./runtime.in" // bool adjust(pen p); void gen_runtime48(stack *Stack) { pen p=vm::pop(Stack); #line 531 "./runtime.in" {Stack->push(p.linetype()->adjust); return;} } #line 535 "./runtime.in" // pen adjust(pen p, real arclength, bool cyclic); void gen_runtime49(stack *Stack) { bool cyclic=vm::pop(Stack); real arclength=vm::pop(Stack); pen p=vm::pop(Stack); #line 536 "./runtime.in" {Stack->push(adjustdash(p,arclength,cyclic)); return;} } #line 540 "./runtime.in" // pen linecap(Int n); void gen_runtime50(stack *Stack) { Int n=vm::pop(Stack); #line 541 "./runtime.in" {Stack->push(pen(setlinecap,n >= 0 && n < nCap ? n : DEFCAP)); return;} } #line 545 "./runtime.in" // Int linecap(pen p=CURRENTPEN); void gen_runtime51(stack *Stack) { pen p=vm::pop(Stack,CURRENTPEN); #line 546 "./runtime.in" {Stack->push(p.cap()); return;} } #line 550 "./runtime.in" // pen linejoin(Int n); void gen_runtime52(stack *Stack) { Int n=vm::pop(Stack); #line 551 "./runtime.in" {Stack->push(pen(setlinejoin,n >= 0 && n < nJoin ? n : DEFJOIN)); return;} } #line 555 "./runtime.in" // Int linejoin(pen p=CURRENTPEN); void gen_runtime53(stack *Stack) { pen p=vm::pop(Stack,CURRENTPEN); #line 556 "./runtime.in" {Stack->push(p.join()); return;} } #line 560 "./runtime.in" // pen miterlimit(real x); void gen_runtime54(stack *Stack) { real x=vm::pop(Stack); #line 561 "./runtime.in" {Stack->push(pen(setmiterlimit,x >= 1.0 ? x : DEFJOIN)); return;} } #line 565 "./runtime.in" // real miterlimit(pen p=CURRENTPEN); void gen_runtime55(stack *Stack) { pen p=vm::pop(Stack,CURRENTPEN); #line 566 "./runtime.in" {Stack->push(p.miter()); return;} } #line 570 "./runtime.in" // pen linewidth(real x); void gen_runtime56(stack *Stack) { real x=vm::pop(Stack); #line 571 "./runtime.in" {Stack->push(pen(setlinewidth,x >= 0.0 ? x : DEFWIDTH)); return;} } #line 575 "./runtime.in" // real linewidth(pen p=CURRENTPEN); void gen_runtime57(stack *Stack) { pen p=vm::pop(Stack,CURRENTPEN); #line 576 "./runtime.in" {Stack->push(p.width()); return;} } #line 580 "./runtime.in" // pen fontcommand(string *s); void gen_runtime58(stack *Stack) { string * s=vm::pop(Stack); #line 581 "./runtime.in" {Stack->push(pen(setfont,*s)); return;} } #line 585 "./runtime.in" // string font(pen p=CURRENTPEN); void gen_runtime59(stack *Stack) { pen p=vm::pop(Stack,CURRENTPEN); #line 586 "./runtime.in" {Stack->push(p.Font()); return;} } #line 590 "./runtime.in" // pen fontsize(real size, real lineskip); void gen_runtime60(stack *Stack) { real lineskip=vm::pop(Stack); real size=vm::pop(Stack); #line 591 "./runtime.in" {Stack->push(pen(setfontsize,size > 0.0 ? size : 0.0, lineskip > 0.0 ? lineskip : 0.0)); return;} } #line 596 "./runtime.in" // real fontsize(pen p=CURRENTPEN); void gen_runtime61(stack *Stack) { pen p=vm::pop(Stack,CURRENTPEN); #line 597 "./runtime.in" {Stack->push(p.size()); return;} } #line 601 "./runtime.in" // real lineskip(pen p=CURRENTPEN); void gen_runtime62(stack *Stack) { pen p=vm::pop(Stack,CURRENTPEN); #line 602 "./runtime.in" {Stack->push(p.Lineskip()); return;} } #line 606 "./runtime.in" // pen overwrite(Int n); void gen_runtime63(stack *Stack) { Int n=vm::pop(Stack); #line 607 "./runtime.in" {Stack->push(pen(setoverwrite,n >= 0 && n < nOverwrite ? (overwrite_t) n : DEFWRITE)); return;} } #line 612 "./runtime.in" // Int overwrite(pen p=CURRENTPEN); void gen_runtime64(stack *Stack) { pen p=vm::pop(Stack,CURRENTPEN); #line 613 "./runtime.in" {Stack->push(p.Overwrite()); return;} } #line 617 "./runtime.in" // pen basealign(Int n); void gen_runtime65(stack *Stack) { Int n=vm::pop(Stack); #line 618 "./runtime.in" {Stack->push(pen(n >= 0 && n < nBaseLine ? (BaseLine) n : DEFBASE)); return;} } #line 622 "./runtime.in" // Int basealign(pen p=CURRENTPEN); void gen_runtime66(stack *Stack) { pen p=vm::pop(Stack,CURRENTPEN); #line 623 "./runtime.in" {Stack->push(p.Baseline()); return;} } #line 627 "./runtime.in" // transform transform(pen p); void gen_runtime67(stack *Stack) { pen p=vm::pop(Stack); #line 628 "./runtime.in" {Stack->push(p.getTransform()); return;} } #line 632 "./runtime.in" // path nib(pen p); void gen_runtime68(stack *Stack) { pen p=vm::pop(Stack); #line 633 "./runtime.in" {Stack->push(p.Path()); return;} } #line 637 "./runtime.in" // pen makepen(path p); void gen_runtime69(stack *Stack) { path p=vm::pop(Stack); #line 638 "./runtime.in" {Stack->push(pen(p)); return;} } #line 642 "./runtime.in" // pen colorless(pen p); void gen_runtime70(stack *Stack) { pen p=vm::pop(Stack); #line 643 "./runtime.in" p.colorless(); {Stack->push(p); return;} } // Interactive mode #line 649 "./runtime.in" // bool interactive(); void gen_runtime71(stack *Stack) { #line 650 "./runtime.in" {Stack->push(interact::interactive); return;} } #line 655 "./runtime.in" // bool uptodate(); void gen_runtime72(stack *Stack) { #line 656 "./runtime.in" {Stack->push(interact::uptodate); return;} } // System commands #line 662 "./runtime.in" // Int system(stringarray *s); void gen_runtime73(stack *Stack) { stringarray * s=vm::pop(Stack); #line 663 "./runtime.in" if(safe) error("system() call disabled; override with option -nosafe"); size_t size=checkArray(s); if(size == 0) {Stack->push(0); return;} mem::vector cmd; for(size_t i=0; i < size; ++i) cmd.push_back(read(s,i)); {Stack->push(System(cmd)); return;} } #line 674 "./runtime.in" // bool view(); void gen_runtime74(stack *Stack) { #line 675 "./runtime.in" {Stack->push(view()); return;} } #line 679 "./runtime.in" // string asydir(); void gen_runtime75(stack *Stack) { #line 680 "./runtime.in" {Stack->push(systemDir); return;} } #line 684 "./runtime.in" // string locale(string s=emptystring); void gen_runtime76(stack *Stack) { string s=vm::pop(Stack,emptystring); #line 685 "./runtime.in" char *L=setlocale(LC_ALL,s.empty() ? NULL : s.c_str()); {Stack->push(L != NULL ? string(L) : ""); return;} } #line 690 "./runtime.in" // void abort(string s=emptystring); void gen_runtime77(stack *Stack) { string s=vm::pop(Stack,emptystring); #line 691 "./runtime.in" if(s.empty()) throw handled_error(); error(s.c_str()); } #line 696 "./runtime.in" // void exit(); void gen_runtime78(stack *) { #line 697 "./runtime.in" throw quit(); } #line 701 "./runtime.in" // void assert(bool b, string s=emptystring); void gen_runtime79(stack *Stack) { string s=vm::pop(Stack,emptystring); bool b=vm::pop(Stack); #line 702 "./runtime.in" flush(cout); if(!b) { ostringstream buf; buf << "assert FAILED"; if(s != "") buf << ": " << s; error(buf); } } #line 712 "./runtime.in" // void sleep(Int seconds); void gen_runtime80(stack *Stack) { Int seconds=vm::pop(Stack); #line 713 "./runtime.in" if(seconds <= 0) return; std::this_thread::sleep_for(std::chrono::seconds(seconds)); } #line 718 "./runtime.in" // void usleep(Int microseconds); void gen_runtime81(stack *Stack) { Int microseconds=vm::pop(Stack); #line 719 "./runtime.in" if(microseconds <= 0) return; std::this_thread::sleep_for(std::chrono::microseconds(microseconds)); } #line 724 "./runtime.in" // void _eval(string *s, bool embedded, bool interactiveWrite=false); void gen_runtime82(stack *Stack) { bool interactiveWrite=vm::pop(Stack,false); bool embedded=vm::pop(Stack); string * s=vm::pop(Stack); #line 725 "./runtime.in" if(embedded) { trans::coenv *e=Stack->getEnvironment(); vm::interactiveStack *is=dynamic_cast(Stack); if(e && is) runStringEmbedded(*s, *e, *is); else error(noruntime); } else runString(*s,interactiveWrite); } #line 737 "./runtime.in" // void _eval(runnable *s, bool embedded); void gen_runtime83(stack *Stack) { bool embedded=vm::pop(Stack); runnable * s=vm::pop(Stack); #line 738 "./runtime.in" absyntax::block *ast=new absyntax::block(s->getPos(), false); ast->add(s); if(embedded) { trans::coenv *e=Stack->getEnvironment(); vm::interactiveStack *is=dynamic_cast(Stack); if(e && is) runCodeEmbedded(ast, *e, *is); else error(noruntime); } else runCode(ast); } #line 753 "./runtime.in" // string xasyKEY(); void gen_runtime84(stack *Stack) { #line 754 "./runtime.in" processDataStruct& P=processData(); xkey_t& xkey=P.xkey; xkey_t::iterator p=xkey.find(P.topPos.LineColumn()); if(settings::keys) {Stack->push(p != xkey.end() ? p->second : toplocation()); return;} else {Stack->push(p != xkey.end() ? p->second+" 1" : toplocation()+" 0"); return;} } #line 763 "./runtime.in" // void xasyKEY(string *s); void gen_runtime85(stack *Stack) { string * s=vm::pop(Stack); #line 764 "./runtime.in" processData().KEY=*s; } #line 767 "./runtime.in" // string location(); void gen_runtime86(stack *Stack) { #line 768 "./runtime.in" ostringstream buf; buf << getPos(); {Stack->push(buf.str()); return;} } // Wrapper for the stack::loadModule() method. #line 774 "./runtime.in" void loadModule(stack *Stack) { Int numPushedParents=vm::pop(Stack); string * index=vm::pop(Stack); #line 775 "./runtime.in" Stack->loadModule(*index, numPushedParents); } #line 779 "./runtime.in" // string cd(string s=emptystring); void gen_runtime88(stack *Stack) { string s=vm::pop(Stack,emptystring); #line 780 "./runtime.in" if(!globalread()) readDisabled(); if(!s.empty() && !globalwrite()) { string outname=settings::outname(); string dir=stripFile(outname); if(dir.empty()) Setting("outname")=getPath()+dirsep+outname; } {Stack->push(setPath(s.c_str())); return;} } #line 790 "./runtime.in" // void list(string *s, bool imports=false); void gen_runtime89(stack *Stack) { bool imports=vm::pop(Stack,false); string * s=vm::pop(Stack); #line 791 "./runtime.in" if(*s == "-") return; trans::genv ge; symbol name=symbol::trans(*s); record *r=ge.getModule(name,*s); r->e.list(imports ? 0 : r); } // Guide operations #line 801 "./runtime.in" void nullGuide(stack *Stack) { #line 802 "./runtime.in" {Stack->push(new pathguide(path())); return;} } #line 807 "./runtime.in" void dotsGuide(stack *Stack) { guidearray * a=vm::pop(Stack); #line 808 "./runtime.in" guidevector v; size_t size=checkArray(a); for (size_t i=0; i < size; ++i) v.push_back(a->read(i)); {Stack->push(new multiguide(v)); return;} } #line 817 "./runtime.in" void dashesGuide(stack *Stack) { guidearray * a=vm::pop(Stack); #line 818 "./runtime.in" static camp::curlSpec curly; static camp::specguide curlout(&curly, camp::OUT); static camp::specguide curlin(&curly, camp::IN); size_t n=checkArray(a); // a--b is equivalent to a{curl 1}..{curl 1}b guidevector v; if (n > 0) v.push_back(a->read(0)); if (n==1) { v.push_back(&curlout); v.push_back(&curlin); } else for (size_t i=1; iread(i)); } {Stack->push(new multiguide(v)); return;} } #line 844 "./runtime.in" void newCycleToken(stack *Stack) { #line 845 "./runtime.in" {Stack->push(cycleToken()); return;} } #line 849 "./runtime.in" // guide* operator cast(cycleToken tok); void gen_runtime94(stack *Stack) { cycleToken tok=vm::pop(Stack); #line 850 "./runtime.in" // Avoid unused variable warning messages. unused(&tok); {Stack->push(new cycletokguide()); return;} } #line 856 "./runtime.in" // guide* operator spec(pair z, Int p); void gen_runtime95(stack *Stack) { Int p=vm::pop(Stack); pair z=vm::pop(Stack); #line 857 "./runtime.in" camp::side d=(camp::side) p; camp::dirSpec *sp=new camp::dirSpec(z); {Stack->push(new specguide(sp,d)); return;} } #line 864 "./runtime.in" // curlSpecifier operator curl(real gamma, Int p); void gen_runtime96(stack *Stack) { Int p=vm::pop(Stack); real gamma=vm::pop(Stack); #line 865 "./runtime.in" camp::side s=(camp::side) p; {Stack->push(curlSpecifier(gamma,s)); return;} } #line 870 "./runtime.in" void curlSpecifierValuePart(stack *Stack) { curlSpecifier spec=vm::pop(Stack); #line 871 "./runtime.in" {Stack->push(spec.getValue()); return;} } #line 875 "./runtime.in" void curlSpecifierSidePart(stack *Stack) { curlSpecifier spec=vm::pop(Stack); #line 876 "./runtime.in" {Stack->push(spec.getSide()); return;} } #line 880 "./runtime.in" // guide* operator cast(curlSpecifier spec); void gen_runtime99(stack *Stack) { curlSpecifier spec=vm::pop(Stack); #line 881 "./runtime.in" {Stack->push(new specguide(spec)); return;} } #line 885 "./runtime.in" // tensionSpecifier operator tension(real tout, real tin, bool atleast); void gen_runtime100(stack *Stack) { bool atleast=vm::pop(Stack); real tin=vm::pop(Stack); real tout=vm::pop(Stack); #line 886 "./runtime.in" {Stack->push(tensionSpecifier(tout, tin, atleast)); return;} } #line 890 "./runtime.in" void tensionSpecifierOutPart(stack *Stack) { tensionSpecifier t=vm::pop(Stack); #line 891 "./runtime.in" {Stack->push(t.getOut()); return;} } #line 895 "./runtime.in" void tensionSpecifierInPart(stack *Stack) { tensionSpecifier t=vm::pop(Stack); #line 896 "./runtime.in" {Stack->push(t.getIn()); return;} } #line 900 "./runtime.in" void tensionSpecifierAtleastPart(stack *Stack) { tensionSpecifier t=vm::pop(Stack); #line 901 "./runtime.in" {Stack->push(t.getAtleast()); return;} } #line 905 "./runtime.in" // guide* operator cast(tensionSpecifier t); void gen_runtime104(stack *Stack) { tensionSpecifier t=vm::pop(Stack); #line 906 "./runtime.in" {Stack->push(new tensionguide(t)); return;} } #line 910 "./runtime.in" // guide* operator controls(pair zout, pair zin); void gen_runtime105(stack *Stack) { pair zin=vm::pop(Stack); pair zout=vm::pop(Stack); #line 911 "./runtime.in" {Stack->push(new controlguide(zout, zin)); return;} } #line 915 "./runtime.in" // Int size(guide *g); void gen_runtime106(stack *Stack) { guide * g=vm::pop(Stack); #line 916 "./runtime.in" flatguide f; g->flatten(f,false); {Stack->push(f.size()); return;} } #line 922 "./runtime.in" // Int length(guide *g); void gen_runtime107(stack *Stack) { guide * g=vm::pop(Stack); #line 923 "./runtime.in" flatguide f; g->flatten(f,false); {Stack->push(g->cyclic() ? f.size() : f.size()-1); return;} } #line 929 "./runtime.in" // bool cyclic(guide *g); void gen_runtime108(stack *Stack) { guide * g=vm::pop(Stack); #line 930 "./runtime.in" flatguide f; g->flatten(f,false); {Stack->push(g->cyclic()); return;} } #line 936 "./runtime.in" // pair point(guide *g, Int t); void gen_runtime109(stack *Stack) { Int t=vm::pop(Stack); guide * g=vm::pop(Stack); #line 937 "./runtime.in" flatguide f; g->flatten(f,false); {Stack->push(f.Nodes(adjustedIndex(t,f.size(),g->cyclic())).z); return;} } #line 943 "./runtime.in" // pairarray* dirSpecifier(guide *g, Int t); void gen_runtime110(stack *Stack) { Int t=vm::pop(Stack); guide * g=vm::pop(Stack); #line 944 "./runtime.in" flatguide f; g->flatten(f,false); Int n=f.size(); if(!g->cyclic() && (t < 0 || t >= n-1)) {Stack->push(new array(0)); return;} array *c=new array(2); (*c)[0]=f.Nodes(t).out->dir(); (*c)[1]=f.Nodes(t+1).in->dir(); {Stack->push(c); return;} } #line 955 "./runtime.in" // pairarray* controlSpecifier(guide *g, Int t); void gen_runtime111(stack *Stack) { Int t=vm::pop(Stack); guide * g=vm::pop(Stack); #line 956 "./runtime.in" flatguide f; g->flatten(f,false); Int n=f.size(); if(!g->cyclic() && (t < 0 || t >= n-1)) {Stack->push(new array(0)); return;} knot curr=f.Nodes(t); knot next=f.Nodes(t+1); if(curr.out->controlled()) { assert(next.in->controlled()); array *c=new array(2); (*c)[0]=curr.out->control(); (*c)[1]=next.in->control(); {Stack->push(c); return;} } else {Stack->push(new array(0)); return;} } #line 972 "./runtime.in" // tensionSpecifier tensionSpecifier(guide *g, Int t); void gen_runtime112(stack *Stack) { Int t=vm::pop(Stack); guide * g=vm::pop(Stack); #line 973 "./runtime.in" flatguide f; g->flatten(f,false); Int n=f.size(); if(!g->cyclic() && (t < 0 || t >= n-1)) {Stack->push(tensionSpecifier(1.0,1.0,false)); return;} knot curr=f.Nodes(t); {Stack->push(tensionSpecifier(curr.tout.val,f.Nodes(t+1).tin.val,curr.tout.atleast)); return;} } #line 982 "./runtime.in" // realarray* curlSpecifier(guide *g, Int t); void gen_runtime113(stack *Stack) { Int t=vm::pop(Stack); guide * g=vm::pop(Stack); #line 983 "./runtime.in" flatguide f; g->flatten(f,false); Int n=f.size(); if(!g->cyclic() && (t < 0 || t >= n-1)) {Stack->push(new array(0)); return;} array *c=new array(2); real c0=f.Nodes(t).out->curl(); real c1=f.Nodes(t+1).in->curl(); (*c)[0]=c0 >= 0.0 ? c0 : 1.0; (*c)[1]=c1 >= 0.0 ? c1 : 1.0; {Stack->push(c); return;} } #line 996 "./runtime.in" // guide* reverse(guide *g); void gen_runtime114(stack *Stack) { guide * g=vm::pop(Stack); #line 997 "./runtime.in" flatguide f; g->flatten(f,false); if(f.precyclic()) {Stack->push(new pathguide(g->solve().reverse())); return;} size_t n=f.size(); bool cyclic=g->cyclic(); guidevector v; size_t start=cyclic ? n : n-1; knot curr=f.Nodes(start); knot next=curr; for(size_t i=start; i > 0; --i) { next=f.Nodes(i-1); v.push_back(new pairguide(curr.z)); if(next.out->controlled()) { assert(curr.in->controlled()); v.push_back(new controlguide(curr.in->control(),next.out->control())); } else { pair d=curr.in->dir(); if(d != zero) v.push_back(new specguide(new dirSpec(-d),camp::OUT)); else { real C=curr.in->curl(); if(C >= 0.0) v.push_back(new specguide(new curlSpec(C),camp::OUT)); } real tout=curr.tin.val; real tin=next.tout.val; bool atleast=next.tout.atleast; if(tout != 1.0 || tin != 1.0 || next.tout.atleast) v.push_back(new tensionguide(tensionSpecifier(tout,tin,atleast))); d=next.out->dir(); if(d != zero) v.push_back(new specguide(new dirSpec(-d),camp::IN)); else { real C=next.out->curl(); if(C >= 0.0) v.push_back(new specguide(new curlSpec(C),camp::IN)); } } curr=next; } if(cyclic) v.push_back(new cycletokguide()); else v.push_back(new pairguide(next.z)); {Stack->push(new multiguide(v)); return;} } #line 1049 "./runtime.in" // realarray* _cputime(); void gen_runtime115(stack *Stack) { #line 1050 "./runtime.in" #if !defined(_WIN32) static const real ticktime=1.0/sysconf(_SC_CLK_TCK); struct tms buf; ::times(&buf); real realCutime=((real)buf.tms_cutime)*ticktime; real realCstime=((real)buf.tms_cstime)*ticktime; #else // FIXME: See if there's a way to get cutime/cstime on windows, // if it's possible. real realCutime=0.0; real realCstime=0.0; #endif array *t=new array(5); (*t)[0]=cpuTime.seconds(); // Includes system time (*t)[1]=0.0; (*t)[2]=realCutime; (*t)[3]=realCstime; (*t)[4]=wallClock.seconds(); {Stack->push(t); return;} } // Transforms #line 1076 "./runtime.in" // bool ==(transform a, transform b); void gen_runtime116(stack *Stack) { transform b=vm::pop(Stack); transform a=vm::pop(Stack); #line 1077 "./runtime.in" {Stack->push(a == b); return;} } #line 1082 "./runtime.in" // bool !=(transform a, transform b); void gen_runtime117(stack *Stack) { transform b=vm::pop(Stack); transform a=vm::pop(Stack); #line 1083 "./runtime.in" {Stack->push(a != b); return;} } #line 1087 "./runtime.in" // transform +(transform a, transform b); void gen_runtime118(stack *Stack) { transform b=vm::pop(Stack); transform a=vm::pop(Stack); #line 1088 "./runtime.in" {Stack->push(a+b); return;} } #line 1092 "./runtime.in" // transform *(transform a, transform b); void gen_runtime119(stack *Stack) { transform b=vm::pop(Stack); transform a=vm::pop(Stack); #line 1093 "./runtime.in" {Stack->push(a*b); return;} } #line 1097 "./runtime.in" // pair *(transform t, pair z); void gen_runtime120(stack *Stack) { pair z=vm::pop(Stack); transform t=vm::pop(Stack); #line 1098 "./runtime.in" {Stack->push(t*z); return;} } #line 1102 "./runtime.in" // path *(transform t, path g); void gen_runtime121(stack *Stack) { path g=vm::pop(Stack); transform t=vm::pop(Stack); #line 1103 "./runtime.in" {Stack->push(transformed(t,g)); return;} } #line 1107 "./runtime.in" // pen *(transform t, pen p); void gen_runtime122(stack *Stack) { pen p=vm::pop(Stack); transform t=vm::pop(Stack); #line 1108 "./runtime.in" {Stack->push(transformed(t,p)); return;} } #line 1112 "./runtime.in" // picture* *(transform t, picture *f); void gen_runtime123(stack *Stack) { picture * f=vm::pop(Stack); transform t=vm::pop(Stack); #line 1113 "./runtime.in" {Stack->push(transformed(t,f)); return;} } #line 1117 "./runtime.in" // picture* *(realarray2 *t, picture *f); void gen_runtime124(stack *Stack) { picture * f=vm::pop(Stack); realarray2 * t=vm::pop(Stack); #line 1118 "./runtime.in" {Stack->push(transformed(*t,f)); return;} } #line 1122 "./runtime.in" // transform ^(transform t, Int n); void gen_runtime125(stack *Stack) { Int n=vm::pop(Stack); transform t=vm::pop(Stack); #line 1123 "./runtime.in" transform T; if(n < 0) { n=-n; t=inverse(t); } for(Int i=0; i < n; i++) T=T*t; {Stack->push(T); return;} } #line 1133 "./runtime.in" void transformXPart(stack *Stack) { transform t=vm::pop(Stack); #line 1134 "./runtime.in" {Stack->push(t.getx()); return;} } #line 1138 "./runtime.in" void transformYPart(stack *Stack) { transform t=vm::pop(Stack); #line 1139 "./runtime.in" {Stack->push(t.gety()); return;} } #line 1143 "./runtime.in" void transformXXPart(stack *Stack) { transform t=vm::pop(Stack); #line 1144 "./runtime.in" {Stack->push(t.getxx()); return;} } #line 1148 "./runtime.in" void transformXYPart(stack *Stack) { transform t=vm::pop(Stack); #line 1149 "./runtime.in" {Stack->push(t.getxy()); return;} } #line 1153 "./runtime.in" void transformYXPart(stack *Stack) { transform t=vm::pop(Stack); #line 1154 "./runtime.in" {Stack->push(t.getyx()); return;} } #line 1158 "./runtime.in" void transformYYPart(stack *Stack) { transform t=vm::pop(Stack); #line 1159 "./runtime.in" {Stack->push(t.getyy()); return;} } #line 1163 "./runtime.in" void real6ToTransform(stack *Stack) { real yy=vm::pop(Stack); real yx=vm::pop(Stack); real xy=vm::pop(Stack); real xx=vm::pop(Stack); real y=vm::pop(Stack); real x=vm::pop(Stack); #line 1165 "./runtime.in" {Stack->push(transform(x,y,xx,xy,yx,yy)); return;} } #line 1169 "./runtime.in" // transform shift(transform t); void gen_runtime133(stack *Stack) { transform t=vm::pop(Stack); #line 1170 "./runtime.in" {Stack->push(transform(t.getx(),t.gety(),0,0,0,0)); return;} } #line 1174 "./runtime.in" // transform shiftless(transform t); void gen_runtime134(stack *Stack) { transform t=vm::pop(Stack); #line 1175 "./runtime.in" {Stack->push(transform(0,0,t.getxx(),t.getxy(),t.getyx(),t.getyy())); return;} } #line 1179 "./runtime.in" // transform identity(); void transformIdentity(stack *Stack) { #line 1180 "./runtime.in" {Stack->push(identity); return;} } #line 1184 "./runtime.in" // transform inverse(transform t); void gen_runtime136(stack *Stack) { transform t=vm::pop(Stack); #line 1185 "./runtime.in" {Stack->push(inverse(t)); return;} } #line 1189 "./runtime.in" // transform shift(pair z); void gen_runtime137(stack *Stack) { pair z=vm::pop(Stack); #line 1190 "./runtime.in" {Stack->push(shift(z)); return;} } #line 1194 "./runtime.in" // transform shift(real x, real y); void gen_runtime138(stack *Stack) { real y=vm::pop(Stack); real x=vm::pop(Stack); #line 1195 "./runtime.in" {Stack->push(shift(pair(x,y))); return;} } #line 1199 "./runtime.in" // transform xscale(real x); void gen_runtime139(stack *Stack) { real x=vm::pop(Stack); #line 1200 "./runtime.in" {Stack->push(xscale(x)); return;} } #line 1204 "./runtime.in" // transform yscale(real y); void gen_runtime140(stack *Stack) { real y=vm::pop(Stack); #line 1205 "./runtime.in" {Stack->push(yscale(y)); return;} } #line 1209 "./runtime.in" // transform scale(real x); void gen_runtime141(stack *Stack) { real x=vm::pop(Stack); #line 1210 "./runtime.in" {Stack->push(scale(x)); return;} } #line 1214 "./runtime.in" // transform scale(real x, real y); void gen_runtime142(stack *Stack) { real y=vm::pop(Stack); real x=vm::pop(Stack); #line 1215 "./runtime.in" {Stack->push(scale(x,y)); return;} } #line 1219 "./runtime.in" // transform slant(real s); void gen_runtime143(stack *Stack) { real s=vm::pop(Stack); #line 1220 "./runtime.in" {Stack->push(slant(s)); return;} } #line 1224 "./runtime.in" // transform rotate(real angle, pair z=0); void gen_runtime144(stack *Stack) { pair z=vm::pop(Stack,0); real angle=vm::pop(Stack); #line 1225 "./runtime.in" {Stack->push(rotatearound(z,radians(angle))); return;} } #line 1229 "./runtime.in" // transform reflect(pair a, pair b); void gen_runtime145(stack *Stack) { pair b=vm::pop(Stack); pair a=vm::pop(Stack); #line 1230 "./runtime.in" {Stack->push(reflectabout(a,b)); return;} } #line 1234 "./runtime.in" // bool isometry(transform t); void gen_runtime146(stack *Stack) { transform t=vm::pop(Stack); #line 1235 "./runtime.in" {Stack->push(t.isIsometry()); return;} } #line 1239 "./runtime.in" // real bezier(real a, real b, real c, real d, real t); void gen_runtime147(stack *Stack) { real t=vm::pop(Stack); real d=vm::pop(Stack); real c=vm::pop(Stack); real b=vm::pop(Stack); real a=vm::pop(Stack); #line 1240 "./runtime.in" real onemt=1-t; real onemt2=onemt*onemt; {Stack->push(onemt2*onemt*a+t*(3.0*(onemt2*b+t*onemt*c)+t*t*d)); return;} } } // namespace run namespace trans { void gen_runtime_venv(venv &ve) { #line 233 "./runtime.in" REGISTER_BLTIN(run::IntZero,"IntZero"); #line 241 "./runtime.in" REGISTER_BLTIN(run::realZero,"realZero"); #line 246 "./runtime.in" REGISTER_BLTIN(run::boolFalse,"boolFalse"); #line 251 "./runtime.in" addFunc(ve, run::gen_runtime3, primBoolean(), SYM(isnan), formal(primReal(), SYM(x), false, false)); #line 256 "./runtime.in" REGISTER_BLTIN(run::pushNullArray,"pushNullArray"); #line 261 "./runtime.in" REGISTER_BLTIN(run::pushNullRecord,"pushNullRecord"); #line 266 "./runtime.in" REGISTER_BLTIN(run::pushNullFunction,"pushNullFunction"); #line 271 "./runtime.in" REGISTER_BLTIN(run::pushDefault,"pushDefault"); #line 281 "./runtime.in" REGISTER_BLTIN(run::isDefault,"isDefault"); #line 288 "./runtime.in" REGISTER_BLTIN(run::pairToGuide,"pairToGuide"); #line 296 "./runtime.in" REGISTER_BLTIN(run::pathToGuide,"pathToGuide"); #line 301 "./runtime.in" REGISTER_BLTIN(run::guideToPath,"guideToPath"); #line 306 "./runtime.in" REGISTER_BLTIN(run::newPen,"newPen"); #line 314 "./runtime.in" addFunc(ve, run::gen_runtime13, primBoolean(), SYM_EQ, formal(primPen(), SYM(a), false, false), formal(primPen(), SYM(b), false, false)); #line 319 "./runtime.in" addFunc(ve, run::gen_runtime14, primBoolean(), SYM_NEQ, formal(primPen(), SYM(a), false, false), formal(primPen(), SYM(b), false, false)); #line 324 "./runtime.in" addFunc(ve, run::gen_runtime15, primPen(), SYM_PLUS, formal(primPen(), SYM(a), false, false), formal(primPen(), SYM(b), false, false)); #line 329 "./runtime.in" addFunc(ve, run::gen_runtime16, primPen(), SYM_TIMES, formal(primReal(), SYM(a), false, false), formal(primPen(), SYM(b), false, false)); #line 334 "./runtime.in" addFunc(ve, run::gen_runtime17, primPen(), SYM_TIMES, formal(primPen(), SYM(a), false, false), formal(primReal(), SYM(b), false, false)); #line 339 "./runtime.in" addFunc(ve, run::gen_runtime18, primPair(), SYM(max), formal(primPen(), SYM(p), false, false)); #line 344 "./runtime.in" addFunc(ve, run::gen_runtime19, primPair(), SYM(min), formal(primPen(), SYM(p), false, false)); #line 349 "./runtime.in" addFunc(ve, run::gen_runtime20, primVoid(), SYM(resetdefaultpen)); #line 355 "./runtime.in" addFunc(ve, run::gen_runtime21, primVoid(), SYM(defaultpen), formal(primPen(), SYM(p), false, false)); #line 360 "./runtime.in" addFunc(ve, run::gen_runtime22, primPen(), SYM(defaultpen)); #line 365 "./runtime.in" addFunc(ve, run::gen_runtime23, primBoolean(), SYM(invisible), formal(primPen(), SYM(p), false, false)); #line 370 "./runtime.in" addFunc(ve, run::gen_runtime24, primPen(), SYM(invisible)); #line 375 "./runtime.in" addFunc(ve, run::gen_runtime25, primPen(), SYM(gray), formal(primPen(), SYM(p), false, false)); #line 381 "./runtime.in" addFunc(ve, run::gen_runtime26, primPen(), SYM(rgb), formal(primPen(), SYM(p), false, false)); #line 387 "./runtime.in" addFunc(ve, run::gen_runtime27, primPen(), SYM(cmyk), formal(primPen(), SYM(p), false, false)); #line 393 "./runtime.in" addFunc(ve, run::gen_runtime28, primPen(), SYM(interp), formal(primPen(), SYM(a), false, false), formal(primPen(), SYM(b), false, false), formal(primReal(), SYM(t), false, false)); #line 398 "./runtime.in" addFunc(ve, run::gen_runtime29, primPen(), SYM(rgb), formal(primReal(), SYM(r), false, false), formal(primReal(), SYM(g), false, false), formal(primReal(), SYM(b), false, false)); #line 403 "./runtime.in" addFunc(ve, run::gen_runtime30, primPen(), SYM(cmyk), formal(primReal(), SYM(c), false, false), formal(primReal(), SYM(m), false, false), formal(primReal(), SYM(y), false, false), formal(primReal(), SYM(k), false, false)); #line 408 "./runtime.in" addFunc(ve, run::gen_runtime31, primPen(), SYM(gray), formal(primReal(), SYM(gray), false, false)); #line 413 "./runtime.in" addFunc(ve, run::gen_runtime32, realArray(), SYM(colors), formal(primPen(), SYM(p), false, false)); #line 441 "./runtime.in" addFunc(ve, run::gen_runtime33, primString(), SYM(hex), formal(primPen(), SYM(p), false, false)); #line 446 "./runtime.in" addFunc(ve, run::gen_runtime34, primInt(), SYM(byte), formal(primReal(), SYM(x), false, false)); #line 451 "./runtime.in" addFunc(ve, run::gen_runtime35, primReal(), SYM(byteinv), formal(primInt(), SYM(x), false, false)); #line 456 "./runtime.in" addFunc(ve, run::gen_runtime36, primString(), SYM(colorspace), formal(primPen(), SYM(p), false, false)); #line 463 "./runtime.in" addFunc(ve, run::gen_runtime37, primPen(), SYM(pattern), formal(primString(), SYM(s), false, false)); #line 468 "./runtime.in" addFunc(ve, run::gen_runtime38, primString(), SYM(pattern), formal(primPen(), SYM(p), false, false)); #line 473 "./runtime.in" addFunc(ve, run::gen_runtime39, primPen(), SYM(fillrule), formal(primInt(), SYM(n), false, false)); #line 478 "./runtime.in" addFunc(ve, run::gen_runtime40, primInt(), SYM(fillrule), formal(primPen(), SYM(p), false, false)); #line 483 "./runtime.in" addFunc(ve, run::gen_runtime41, primPen(), SYM(opacity), formal(primReal(), SYM(opacity), true, false), formal(primString(), SYM(blend), true, false)); #line 493 "./runtime.in" addFunc(ve, run::gen_runtime42, primReal(), SYM(opacity), formal(primPen(), SYM(p), false, false)); #line 498 "./runtime.in" addFunc(ve, run::gen_runtime43, primString(), SYM(blend), formal(primPen(), SYM(p), false, false)); #line 503 "./runtime.in" addFunc(ve, run::gen_runtime44, primPen(), SYM(linetype), formal(realArray(), SYM(pattern), false, false), formal(primReal(), SYM(offset), true, false), formal(primBoolean(), SYM(scale), true, false), formal(primBoolean(), SYM(adjust), true, false)); #line 514 "./runtime.in" addFunc(ve, run::gen_runtime45, realArray(), SYM(linetype), formal(primPen(), SYM(p), true, false)); #line 520 "./runtime.in" addFunc(ve, run::gen_runtime46, primReal(), SYM(offset), formal(primPen(), SYM(p), false, false)); #line 525 "./runtime.in" addFunc(ve, run::gen_runtime47, primBoolean(), SYM(scale), formal(primPen(), SYM(p), false, false)); #line 530 "./runtime.in" addFunc(ve, run::gen_runtime48, primBoolean(), SYM(adjust), formal(primPen(), SYM(p), false, false)); #line 535 "./runtime.in" addFunc(ve, run::gen_runtime49, primPen(), SYM(adjust), formal(primPen(), SYM(p), false, false), formal(primReal(), SYM(arclength), false, false), formal(primBoolean(), SYM(cyclic), false, false)); #line 540 "./runtime.in" addFunc(ve, run::gen_runtime50, primPen(), SYM(linecap), formal(primInt(), SYM(n), false, false)); #line 545 "./runtime.in" addFunc(ve, run::gen_runtime51, primInt(), SYM(linecap), formal(primPen(), SYM(p), true, false)); #line 550 "./runtime.in" addFunc(ve, run::gen_runtime52, primPen(), SYM(linejoin), formal(primInt(), SYM(n), false, false)); #line 555 "./runtime.in" addFunc(ve, run::gen_runtime53, primInt(), SYM(linejoin), formal(primPen(), SYM(p), true, false)); #line 560 "./runtime.in" addFunc(ve, run::gen_runtime54, primPen(), SYM(miterlimit), formal(primReal(), SYM(x), false, false)); #line 565 "./runtime.in" addFunc(ve, run::gen_runtime55, primReal(), SYM(miterlimit), formal(primPen(), SYM(p), true, false)); #line 570 "./runtime.in" addFunc(ve, run::gen_runtime56, primPen(), SYM(linewidth), formal(primReal(), SYM(x), false, false)); #line 575 "./runtime.in" addFunc(ve, run::gen_runtime57, primReal(), SYM(linewidth), formal(primPen(), SYM(p), true, false)); #line 580 "./runtime.in" addFunc(ve, run::gen_runtime58, primPen(), SYM(fontcommand), formal(primString(), SYM(s), false, false)); #line 585 "./runtime.in" addFunc(ve, run::gen_runtime59, primString(), SYM(font), formal(primPen(), SYM(p), true, false)); #line 590 "./runtime.in" addFunc(ve, run::gen_runtime60, primPen(), SYM(fontsize), formal(primReal(), SYM(size), false, false), formal(primReal(), SYM(lineskip), false, false)); #line 596 "./runtime.in" addFunc(ve, run::gen_runtime61, primReal(), SYM(fontsize), formal(primPen(), SYM(p), true, false)); #line 601 "./runtime.in" addFunc(ve, run::gen_runtime62, primReal(), SYM(lineskip), formal(primPen(), SYM(p), true, false)); #line 606 "./runtime.in" addFunc(ve, run::gen_runtime63, primPen(), SYM(overwrite), formal(primInt(), SYM(n), false, false)); #line 612 "./runtime.in" addFunc(ve, run::gen_runtime64, primInt(), SYM(overwrite), formal(primPen(), SYM(p), true, false)); #line 617 "./runtime.in" addFunc(ve, run::gen_runtime65, primPen(), SYM(basealign), formal(primInt(), SYM(n), false, false)); #line 622 "./runtime.in" addFunc(ve, run::gen_runtime66, primInt(), SYM(basealign), formal(primPen(), SYM(p), true, false)); #line 627 "./runtime.in" addFunc(ve, run::gen_runtime67, primTransform(), SYM(transform), formal(primPen(), SYM(p), false, false)); #line 632 "./runtime.in" addFunc(ve, run::gen_runtime68, primPath(), SYM(nib), formal(primPen(), SYM(p), false, false)); #line 637 "./runtime.in" addFunc(ve, run::gen_runtime69, primPen(), SYM(makepen), formal(primPath(), SYM(p), false, false)); #line 642 "./runtime.in" addFunc(ve, run::gen_runtime70, primPen(), SYM(colorless), formal(primPen(), SYM(p), false, false)); #line 648 "./runtime.in" addFunc(ve, run::gen_runtime71, primBoolean(), SYM(interactive)); #line 655 "./runtime.in" addFunc(ve, run::gen_runtime72, primBoolean(), SYM(uptodate)); #line 660 "./runtime.in" addFunc(ve, run::gen_runtime73, primInt(), SYM(system), formal(stringArray(), SYM(s), false, false)); #line 674 "./runtime.in" addFunc(ve, run::gen_runtime74, primBoolean(), SYM(view)); #line 679 "./runtime.in" addFunc(ve, run::gen_runtime75, primString(), SYM(asydir)); #line 684 "./runtime.in" addFunc(ve, run::gen_runtime76, primString(), SYM(locale), formal(primString(), SYM(s), true, false)); #line 690 "./runtime.in" addFunc(ve, run::gen_runtime77, primVoid(), SYM(abort), formal(primString(), SYM(s), true, false)); #line 696 "./runtime.in" addFunc(ve, run::gen_runtime78, primVoid(), SYM(exit)); #line 701 "./runtime.in" addFunc(ve, run::gen_runtime79, primVoid(), SYM(assert), formal(primBoolean(), SYM(b), false, false), formal(primString(), SYM(s), true, false)); #line 712 "./runtime.in" addFunc(ve, run::gen_runtime80, primVoid(), SYM(sleep), formal(primInt(), SYM(seconds), false, false)); #line 718 "./runtime.in" addFunc(ve, run::gen_runtime81, primVoid(), SYM(usleep), formal(primInt(), SYM(microseconds), false, false)); #line 724 "./runtime.in" addFunc(ve, run::gen_runtime82, primVoid(), SYM(_eval), formal(primString(), SYM(s), false, false), formal(primBoolean(), SYM(embedded), false, false), formal(primBoolean(), SYM(interactivewrite), true, false)); #line 737 "./runtime.in" addFunc(ve, run::gen_runtime83, primVoid(), SYM(_eval), formal(primCode(), SYM(s), false, false), formal(primBoolean(), SYM(embedded), false, false)); #line 753 "./runtime.in" addFunc(ve, run::gen_runtime84, primString(), SYM(xasyKEY)); #line 763 "./runtime.in" addFunc(ve, run::gen_runtime85, primVoid(), SYM(xasyKEY), formal(primString(), SYM(s), false, false)); #line 767 "./runtime.in" addFunc(ve, run::gen_runtime86, primString(), SYM(location)); #line 773 "./runtime.in" REGISTER_BLTIN(run::loadModule,"loadModule"); #line 779 "./runtime.in" addFunc(ve, run::gen_runtime88, primString(), SYM(cd), formal(primString(), SYM(s), true, false)); #line 790 "./runtime.in" addFunc(ve, run::gen_runtime89, primVoid(), SYM(list), formal(primString(), SYM(s), false, false), formal(primBoolean(), SYM(imports), true, false)); #line 799 "./runtime.in" REGISTER_BLTIN(run::nullGuide,"nullGuide"); #line 807 "./runtime.in" REGISTER_BLTIN(run::dotsGuide,"dotsGuide"); #line 817 "./runtime.in" REGISTER_BLTIN(run::dashesGuide,"dashesGuide"); #line 844 "./runtime.in" REGISTER_BLTIN(run::newCycleToken,"newCycleToken"); #line 849 "./runtime.in" addFunc(ve, run::gen_runtime94, primGuide(), symbol::trans("operator cast"), formal(primCycleToken(), SYM(tok), false, false)); #line 856 "./runtime.in" addFunc(ve, run::gen_runtime95, primGuide(), symbol::trans("operator spec"), formal(primPair(), SYM(z), false, false), formal(primInt(), SYM(p), false, false)); #line 864 "./runtime.in" addFunc(ve, run::gen_runtime96, primCurlSpecifier(), SYM_CURL, formal(primReal(), SYM(gamma), false, false), formal(primInt(), SYM(p), false, false)); #line 870 "./runtime.in" REGISTER_BLTIN(run::curlSpecifierValuePart,"curlSpecifierValuePart"); #line 875 "./runtime.in" REGISTER_BLTIN(run::curlSpecifierSidePart,"curlSpecifierSidePart"); #line 880 "./runtime.in" addFunc(ve, run::gen_runtime99, primGuide(), symbol::trans("operator cast"), formal(primCurlSpecifier(), SYM(spec), false, false)); #line 885 "./runtime.in" addFunc(ve, run::gen_runtime100, primTensionSpecifier(), SYM_TENSION, formal(primReal(), SYM(tout), false, false), formal(primReal(), SYM(tin), false, false), formal(primBoolean(), SYM(atleast), false, false)); #line 890 "./runtime.in" REGISTER_BLTIN(run::tensionSpecifierOutPart,"tensionSpecifierOutPart"); #line 895 "./runtime.in" REGISTER_BLTIN(run::tensionSpecifierInPart,"tensionSpecifierInPart"); #line 900 "./runtime.in" REGISTER_BLTIN(run::tensionSpecifierAtleastPart,"tensionSpecifierAtleastPart"); #line 905 "./runtime.in" addFunc(ve, run::gen_runtime104, primGuide(), symbol::trans("operator cast"), formal(primTensionSpecifier(), SYM(t), false, false)); #line 910 "./runtime.in" addFunc(ve, run::gen_runtime105, primGuide(), SYM_CONTROLS, formal(primPair(), SYM(zout), false, false), formal(primPair(), SYM(zin), false, false)); #line 915 "./runtime.in" addFunc(ve, run::gen_runtime106, primInt(), SYM(size), formal(primGuide(), SYM(g), false, false)); #line 922 "./runtime.in" addFunc(ve, run::gen_runtime107, primInt(), SYM(length), formal(primGuide(), SYM(g), false, false)); #line 929 "./runtime.in" addFunc(ve, run::gen_runtime108, primBoolean(), SYM(cyclic), formal(primGuide(), SYM(g), false, false)); #line 936 "./runtime.in" addFunc(ve, run::gen_runtime109, primPair(), SYM(point), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false)); #line 943 "./runtime.in" addFunc(ve, run::gen_runtime110, pairArray(), SYM(dirSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false)); #line 955 "./runtime.in" addFunc(ve, run::gen_runtime111, pairArray(), SYM(controlSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false)); #line 972 "./runtime.in" addFunc(ve, run::gen_runtime112, primTensionSpecifier(), SYM(tensionSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false)); #line 982 "./runtime.in" addFunc(ve, run::gen_runtime113, realArray(), SYM(curlSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false)); #line 996 "./runtime.in" addFunc(ve, run::gen_runtime114, primGuide(), SYM(reverse), formal(primGuide(), SYM(g), false, false)); #line 1049 "./runtime.in" addFunc(ve, run::gen_runtime115, realArray(), SYM(_cputime)); #line 1074 "./runtime.in" addFunc(ve, run::gen_runtime116, primBoolean(), SYM_EQ, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false)); #line 1082 "./runtime.in" addFunc(ve, run::gen_runtime117, primBoolean(), SYM_NEQ, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false)); #line 1087 "./runtime.in" addFunc(ve, run::gen_runtime118, primTransform(), SYM_PLUS, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false)); #line 1092 "./runtime.in" addFunc(ve, run::gen_runtime119, primTransform(), SYM_TIMES, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false)); #line 1097 "./runtime.in" addFunc(ve, run::gen_runtime120, primPair(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPair(), SYM(z), false, false)); #line 1102 "./runtime.in" addFunc(ve, run::gen_runtime121, primPath(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPath(), SYM(g), false, false)); #line 1107 "./runtime.in" addFunc(ve, run::gen_runtime122, primPen(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPen(), SYM(p), false, false)); #line 1112 "./runtime.in" addFunc(ve, run::gen_runtime123, primPicture(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPicture(), SYM(f), false, false)); #line 1117 "./runtime.in" addFunc(ve, run::gen_runtime124, primPicture(), SYM_TIMES, formal(realArray2(), SYM(t), false, false), formal(primPicture(), SYM(f), false, false)); #line 1122 "./runtime.in" addFunc(ve, run::gen_runtime125, primTransform(), SYM_CARET, formal(primTransform(), SYM(t), false, false), formal(primInt(), SYM(n), false, false)); #line 1133 "./runtime.in" REGISTER_BLTIN(run::transformXPart,"transformXPart"); #line 1138 "./runtime.in" REGISTER_BLTIN(run::transformYPart,"transformYPart"); #line 1143 "./runtime.in" REGISTER_BLTIN(run::transformXXPart,"transformXXPart"); #line 1148 "./runtime.in" REGISTER_BLTIN(run::transformXYPart,"transformXYPart"); #line 1153 "./runtime.in" REGISTER_BLTIN(run::transformYXPart,"transformYXPart"); #line 1158 "./runtime.in" REGISTER_BLTIN(run::transformYYPart,"transformYYPart"); #line 1163 "./runtime.in" REGISTER_BLTIN(run::real6ToTransform,"real6ToTransform"); #line 1169 "./runtime.in" addFunc(ve, run::gen_runtime133, primTransform(), SYM(shift), formal(primTransform(), SYM(t), false, false)); #line 1174 "./runtime.in" addFunc(ve, run::gen_runtime134, primTransform(), SYM(shiftless), formal(primTransform(), SYM(t), false, false)); #line 1179 "./runtime.in" addFunc(ve, run::transformIdentity, primTransform(), SYM(identity)); #line 1184 "./runtime.in" addFunc(ve, run::gen_runtime136, primTransform(), SYM(inverse), formal(primTransform(), SYM(t), false, false)); #line 1189 "./runtime.in" addFunc(ve, run::gen_runtime137, primTransform(), SYM(shift), formal(primPair(), SYM(z), false, false)); #line 1194 "./runtime.in" addFunc(ve, run::gen_runtime138, primTransform(), SYM(shift), formal(primReal(), SYM(x), false, false), formal(primReal(), SYM(y), false, false)); #line 1199 "./runtime.in" addFunc(ve, run::gen_runtime139, primTransform(), SYM(xscale), formal(primReal(), SYM(x), false, false)); #line 1204 "./runtime.in" addFunc(ve, run::gen_runtime140, primTransform(), SYM(yscale), formal(primReal(), SYM(y), false, false)); #line 1209 "./runtime.in" addFunc(ve, run::gen_runtime141, primTransform(), SYM(scale), formal(primReal(), SYM(x), false, false)); #line 1214 "./runtime.in" addFunc(ve, run::gen_runtime142, primTransform(), SYM(scale), formal(primReal(), SYM(x), false, false), formal(primReal(), SYM(y), false, false)); #line 1219 "./runtime.in" addFunc(ve, run::gen_runtime143, primTransform(), SYM(slant), formal(primReal(), SYM(s), false, false)); #line 1224 "./runtime.in" addFunc(ve, run::gen_runtime144, primTransform(), SYM(rotate), formal(primReal(), SYM(angle), false, false), formal(primPair(), SYM(z), true, false)); #line 1229 "./runtime.in" addFunc(ve, run::gen_runtime145, primTransform(), SYM(reflect), formal(primPair(), SYM(a), false, false), formal(primPair(), SYM(b), false, false)); #line 1234 "./runtime.in" addFunc(ve, run::gen_runtime146, primBoolean(), SYM(isometry), formal(primTransform(), SYM(t), false, false)); #line 1239 "./runtime.in" addFunc(ve, run::gen_runtime147, primReal(), SYM(bezier), formal(primReal(), SYM(a), false, false), formal(primReal(), SYM(b), false, false), formal(primReal(), SYM(c), false, false), formal(primReal(), SYM(d), false, false), formal(primReal(), SYM(t), false, false)); } } // namespace trans asymptote-3.05/lspexp.cc0000644000000000000000000001032415031566105014010 0ustar rootroot/** * @file lspexp.cc * @brief For createSymMap and other lsp-related functions * specific to Lsp in *exp classes. * @author Supakorn 'Jamie' Rassameemasmuang (jamievlin at outlook.com) */ #include "common.h" #include "exp.h" #define DEC_CREATE_SYM_MAP_EXP(derived_class) \ void derived_class::createSymMap(AsymptoteLsp::SymbolContext* symContext) namespace absyntax { #ifdef HAVE_LSP DEC_CREATE_SYM_MAP_EXP(nameExp) { AsymptoteLsp::SymbolLit accessedName(value->getLit()); position basePos= getPos(); AsymptoteLsp::filePos castedPos= dynamic_cast(value) ? std::make_pair( mem::stdString(basePos.filename()), std::make_pair(basePos.Line(), basePos.Column() + 1) ) : static_cast(basePos); auto varUsageIt= symContext->symMap.varUsage.find(accessedName); if (varUsageIt == symContext->symMap.varUsage.end()) { symContext->symMap.varUsage.emplace(accessedName, castedPos); } else { varUsageIt->second.add(castedPos); } symContext->symMap.usageByLines.emplace_back(castedPos.second, accessedName); } DEC_CREATE_SYM_MAP_EXP(argument) { val->createSymMap(symContext); } DEC_CREATE_SYM_MAP_EXP(arglist) { for (auto& p : args) { p.createSymMap(symContext); } } DEC_CREATE_SYM_MAP_EXP(callExp) { callee->createSymMap(symContext); args->createSymMap(symContext); if (auto col= getColorInformation()) { auto const& v= col.value(); auto const& colVal= std::get<0>(v); auto const& alpha= std::get<1>(v); auto const& beginArgPos= std::get<2>(v); auto const& lastArgPos= std::get<3>(v); if (alpha.has_value()) { auto const& red= std::get<0>(colVal); auto const& green= std::get<1>(colVal); auto const& blue= std::get<2>(colVal); std::tuple rgba( red, green, blue, alpha.value() ); symContext->addRGBAColor(rgba, beginArgPos, lastArgPos); } else { symContext->addRGBColor(colVal, beginArgPos, lastArgPos); } } } DEC_CREATE_SYM_MAP_EXP(castExp) { castee->createSymMap(symContext); } DEC_CREATE_SYM_MAP_EXP(assignExp) { dest->createSymMap(symContext); value->createSymMap(symContext); } optional, AsymptoteLsp::posInFile, AsymptoteLsp::posInFile>> callExp::getColorInformation() { auto* namedCallee= dynamic_cast(callee); if (namedCallee == nullptr) { return nullopt; } std::string calleeName= static_cast(namedCallee->getName()); std::vector colors; auto getLineColumn= [&argsval= args->args](int const& idx) { return argsval[idx].val->getPos().LineColumn(); }; if (calleeName == "rgb" || calleeName == "rgba") { for (auto const& expVec : args->args) { if (auto* valExp= dynamic_cast(expVec.val)) { colors.push_back(valExp->getValue()); } else if (auto* valExpI= dynamic_cast(expVec.val)) { colors.push_back(valExpI->getValue()); } } } if (calleeName == "rgb" && colors.size() == 3) { callExp::colorInfo col(colors[0], colors[1], colors[2]); return std::make_tuple( col, optional(), callee->getPos().LineColumn(), getLineColumn(2) ); } else if (calleeName == "rgba" && colors.size() == 4) { callExp::colorInfo col(colors[0], colors[1], colors[2]); return std::make_tuple( col, optional(colors[3]), callee->getPos().LineColumn(), getLineColumn(3) ); } return nullopt; } #else # define DEC_CREATE_SYM_MAP_EXP_EMPTY(derived_class) \ DEC_CREATE_SYM_MAP_EXP(derived_class) {} DEC_CREATE_SYM_MAP_EXP_EMPTY(nameExp) DEC_CREATE_SYM_MAP_EXP_EMPTY(argument) DEC_CREATE_SYM_MAP_EXP_EMPTY(arglist) DEC_CREATE_SYM_MAP_EXP_EMPTY(callExp) DEC_CREATE_SYM_MAP_EXP_EMPTY(castExp) DEC_CREATE_SYM_MAP_EXP_EMPTY(assignExp) optional, AsymptoteLsp::posInFile, AsymptoteLsp::posInFile>> callExp::getColorInformation() { return nullopt; } #endif }// namespace absyntax asymptote-3.05/dec.h0000644000000000000000000005103615031566105013077 0ustar rootroot/***** * dec.h * Andy Hammerlindl 2002/8/29 * * Represents the abstract syntax tree for declarations in the language. * Also included is abstract syntax for types as they are most often * used with declarations. *****/ #ifndef DEC_H #define DEC_H #include "symbol.h" #include "absyn.h" #include "name.h" #include "varinit.h" #include "modifier.h" namespace trans { class coenv; class genv; class protoenv; class varEntry; class access; } namespace types { class ty; struct formal; struct signature; struct function; } namespace vm { struct lambda; } namespace absyntax { using trans::genv; using trans::coenv; using trans::protoenv; using trans::varEntry; using trans::access; using sym::symbol; class vardec; enum class AutounravelOption { Apply, DoNotApply, }; class astType : public absyn { public: astType(position pos) : absyn(pos) {} virtual void prettyprint(ostream &out, Int indent) = 0; // If we introduced a new type, automatically add corresponding functions for // that type. virtual void addOps(coenv&, record*, AutounravelOption opt= AutounravelOption::Apply) {} // Returns the internal representation of the type. This method can // be called by exp::getType which does not report errors, so tacit is // needed to silence errors in this case. virtual types::ty *trans(coenv &e, bool tacit = false) = 0; virtual trans::tyEntry *transAsTyEntry(coenv &e, record *where); virtual operator string() const = 0; #ifdef USEGC operator std::string() const { return mem::stdString(this->operator string()); } #endif }; class nameTy : public astType { name *id; public: nameTy(position pos, name *id) : astType(pos), id(id) {} nameTy(name *id) : astType(id->getPos()), id(id) {} void prettyprint(ostream &out, Int indent) override; void addOps(coenv& e, record* r, AutounravelOption opt= AutounravelOption::Apply) override; types::ty *trans(coenv &e, bool tacit = false) override; trans::tyEntry *transAsTyEntry(coenv &e, record *where) override; virtual operator string() const override; }; class dimensions : public absyn { size_t depth; public: dimensions(position pos) : absyn(pos), depth(1) {} void prettyprint(ostream &out, Int indent); void increase() { depth++; } size_t size() { return depth; } types::array *truetype(types::ty *base, bool tacit=false); }; class arrayTy : public astType { astType *cell; dimensions *dims; public: arrayTy(position pos, astType *cell, dimensions *dims) : astType(pos), cell(cell), dims(dims) {} arrayTy(name *id, dimensions *dims) : astType(dims->getPos()), cell(new nameTy(id)), dims(dims) {} void prettyprint(ostream &out, Int indent) override; void addOps(coenv& e, record* r, AutounravelOption opt= AutounravelOption::Apply) override; types::ty *trans(coenv &e, bool tacit = false) override; operator string() const override; }; // Similar to varEntryExp, this helper class always translates to the same // fixed type. class tyEntryTy : public astType { trans::tyEntry *ent; public: tyEntryTy(position pos, trans::tyEntry *ent) : astType(pos), ent(ent) {} tyEntryTy(position pos, types::ty *t); void prettyprint(ostream &out, Int indent) override; types::ty *trans(coenv &e, bool tacit = false) override; trans::tyEntry *transAsTyEntry(coenv &, record *) override { return ent; } operator string() const override; }; // Runnable is anything that can be executed by the program, including // any declaration or statement. class runnable : public absyn { public: runnable(position pos) : absyn(pos) {} virtual void prettyprint(ostream &out, Int indent) = 0; void markTrans(coenv &e) { markPos(e); trans(e); } /* Translates the stm or dec as if it were in a function definition. */ virtual void trans(coenv &e) { transAsField(e, 0); } /* This can be overridden, to specify a special way of translating the code * when it is run at the top of the interactive prompt. */ virtual void interactiveTrans(coenv &e) { trans(e); } void markTransAsField(coenv &e, record *r) { markPos(e); transAsField(e,r); } /* Translate the runnable as in the lowest lexical scope of a record * definition. If it is simply a statement, it will be added to the * record's initializer. A declaration, however, will also have to * add a new type or field to the record. */ virtual void transAsField(coenv &e, record *) = 0; virtual vm::lambda *transAsCodelet(coenv &e); // For functions that return a value, we must guarantee that they end // with a return statement. This checks for that condition. virtual bool returns() { return false; } // Returns true if it is syntactically allowable to modify this // runnable by a PUBLIC or PRIVATE modifier. virtual bool allowPermissions() { return false; } }; // Forward declaration. class formals; class namedTy : public gc { public: symbol dest; types::ty *t; position pos; namedTy(position pos, symbol dest, types::ty *t) : dest(dest), t(t), pos(pos) {} }; class receiveTypedefDec; class block : public runnable { public: mem::list stms; // If the runnables should be interpreted in their own scope. bool scope; protected: void prettystms(ostream &out, Int indent); private: // If the first runnable exists and is a receiveTypedefDec*, return it; // otherwise return nullptr. receiveTypedefDec* getTypedefDec(); public: block(position pos, bool scope=true) : runnable(pos), scope(scope) {} // To ensure list deallocates properly. virtual ~block() {} void add(runnable *r) { stms.push_back(r); } void prettyprint(ostream &out, Int indent) override; void trans(coenv &e) override; void transAsField(coenv &e, record *r) override; bool transAsTemplatedField( coenv &e, record *r, mem::vector* args ); types::record *transAsFile(genv& ge, symbol id); types::record *transAsTemplatedFile( genv& ge, symbol id, mem::vector *args ); // If the block can be interpreted as a single vardec, return that vardec // (otherwise 0). vardec *asVardec(); // A block is guaranteed to return iff one of the runnables is guaranteed to // return. // This is conservative in that // // int f(int x) // { // if (x==1) return 0; // if (x!=1) return 1; // } // // is not guaranteed to return. bool returns() override; void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; class modifierList : public absyn { mem::list perms; mem::list mods; public: modifierList(position pos) : absyn(pos) {} virtual ~modifierList() {} void prettyprint(ostream &out, Int indent); void add(trans::permission p) { perms.push_back(p); } void add(trans::modifier m) { mods.push_back(m); } /* True if a static or dynamic modifier is present. */ bool staticSet(); /* Says if the modifiers indicate static or dynamic. Prints error if * there are duplicates. */ trans::modifier getModifier(); /* Says if it is declared public, private, or read-only (default). * Prints error if there are duplicates. */ trans::permission getPermission(); }; // Modifiers of static or dynamic can change the way declarations and // statements are encoded. class modifiedRunnable : public runnable { modifierList *mods; runnable *body; public: modifiedRunnable(position pos, modifierList *mods, runnable *body) : runnable(pos), mods(mods), body(body) {} modifiedRunnable(position pos, trans::permission perm, runnable *body) : runnable(pos), mods(new modifierList(pos)), body(body) { mods->add(perm); } void prettyprint(ostream &out, Int indent); void transAsField(coenv &e, record *r); bool returns() { return body->returns(); } }; class decidstart : public absyn { protected: symbol id; dimensions *dims; public: decidstart(position pos, symbol id, dimensions *dims = 0) : absyn(pos), id(id), dims(dims) {} virtual void prettyprint(ostream &out, Int indent) override; virtual types::ty *getType(types::ty *base, coenv &, bool = false); virtual trans::tyEntry *getTyEntry(trans::tyEntry *base, coenv &e, record *where); // If a new type is formed by adding dimensions (or a function signature) // after the id, this will add the standard functions for that new type. virtual void addOps(types::ty *base, coenv &e, record *r); virtual symbol getName() { return id; } void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; void createSymMapWType( AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base ); }; class fundecidstart : public decidstart { formals *params; public: fundecidstart(position pos, symbol id, dimensions *dims = 0, formals *params = 0) : decidstart(pos, id, dims), params(params) {} void prettyprint(ostream &out, Int indent); types::ty *getType(types::ty *base, coenv &e, bool tacit = false); trans::tyEntry *getTyEntry(trans::tyEntry *base, coenv &e, record *where); void addOps(types::ty *base, coenv &e, record *r); }; class decid : public absyn { decidstart *start; varinit *init; // Returns the default initializer for the type. access *defaultInit(coenv &e, types::ty *t); public: decid(position pos, decidstart *start, varinit *init = 0) : absyn(pos), start(start), init(init) {} virtual void prettyprint(ostream &out, Int indent) override; virtual void transAsField(coenv &e, record *r, types::ty *base); // Translate, but add the names in as types rather than variables. virtual void transAsTypedefField(coenv &e, trans::tyEntry *base, record *r); decidstart *getStart() { return start; } void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; void createSymMapWType( AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base ); }; class decidlist : public absyn { mem::list decs; public: decidlist(position pos) : absyn(pos) {} virtual ~decidlist() {} void add(decid *p) { decs.push_back(p); } virtual void prettyprint(ostream &out, Int indent) override; virtual void transAsField(coenv &e, record *r, types::ty *base); // Translate, but add the names in as types rather than variables. virtual void transAsTypedefField(coenv &e, trans::tyEntry *base, record *r); // If the list consists of a single entry, return it. decid *singleEntry() { if (decs.size() == 1) return decs.front(); else return 0; } void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; void createSymMapWType( AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base ); }; class dec : public runnable { public: dec(position pos) : runnable(pos) {} void prettyprint(ostream &out, Int indent) override; // Declarations can be public or private. bool allowPermissions() override { return true; } }; void createVar(position pos, coenv &e, record *r, symbol id, types::ty *t, varinit *init); class vardec : public dec { astType *base; decidlist *decs; public: vardec(position pos, astType *base, decidlist *decs) : dec(pos), base(base), decs(decs) {} vardec(position pos, astType *base, decid *di) : dec(pos), base(base), decs(new decidlist(pos)) { decs->add(di); } void prettyprint(ostream &out, Int indent) override; void transAsField(coenv &e, record *r) override { base->addOps(e, r, AutounravelOption::DoNotApply); decs->transAsField(e, r, base->trans(e)); } // Translate, but add the names in as types rather than variables. virtual void transAsTypedefField(coenv &e, record *r); // If the vardec encodes a single declaration, return the name of that // declaration (otherwise nullsym). symbol singleName(); // If the vardec encodes a single declaration, return the type of that // declaration (otherwise 0). types::ty *singleGetType(coenv& e); void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; struct idpair : public absyn { symbol src; // The name of the module to access. symbol dest; // What to call it in the local environment. bool valid; // If it parsed properly. idpair(position pos, symbol id) : absyn(pos), src(id), dest(id), valid(true) {} idpair(position pos, symbol src, symbol as, symbol dest) : absyn(pos), src(src), dest(dest), valid(as==symbol::trans("as")) {} idpair(position pos, string src, symbol as, symbol dest) : absyn(pos), src(symbol::trans(src)), dest(dest), valid(as==symbol::trans("as")) {} void checkValidity() { if (!valid) { em.error(getPos()); em << "expected 'as'"; } } void prettyprint(ostream &out, Int indent) override; // Translates as: access src as dest; void transAsAccess(coenv &e, record *r); // Translates as: from _ unravel src as dest; // where _ is the qualifier record with source as its fields and types. trans::tyEntry *transAsUnravel(coenv &e, record *r, protoenv &source, varEntry *qualifier); void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; struct idpairlist : public gc { mem::list base; void add(idpair *x) { base.push_back(x); } void prettyprint(ostream &out, Int indent); void transAsAccess(coenv &e, record *r); mem::vector transAsUnravel( coenv &e, record *r, protoenv &source, varEntry *qualifier ); void createSymMap(AsymptoteLsp::SymbolContext* symContext); template void processListFn(TFn const& fn) { for (auto* idp : base) { fn(idp->src, idp->dest); } } }; extern idpairlist * const WILDCARD; class accessdec : public dec { idpairlist *base; public: accessdec(position pos, idpairlist *base) : dec(pos), base(base) {} void prettyprint(ostream &out, Int indent) override; void transAsField(coenv &e, record *r) override { base->transAsAccess(e,r); } void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; class badDec : public dec { position errorPos; string errorMessage; public: badDec(position pos, position errorPos, string errorMessage) : dec(pos), errorPos(errorPos), errorMessage(errorMessage) {} void transAsField(coenv&, record*) override { em.error(errorPos); em << errorMessage; } }; // Accesses the file with specified types added to the type environment. class templateAccessDec : public dec { symbol src; // The name of the module to access. formals *args; symbol dest; // What to call it in the local environment. bool valid; position expectedAsPos; public: templateAccessDec(position pos, symbol src, formals* args, symbol as, symbol dest, position asPos) : dec(pos), src(src), args(args), dest(dest), valid(as == symbol::trans("as")), expectedAsPos(asPos) {} bool checkValidity() { if (!valid) { em.error(expectedAsPos); em << "expected 'as'"; return false; } return true; } void transAsField(coenv& e, record* r) override; }; class typeParam : public absyn { const symbol paramSym; public: typeParam(position pos, symbol paramSym) : absyn(pos), paramSym(paramSym) {} bool transAsParamMatcher(coenv &e, record *r, namedTy *arg); void prettyprint(ostream &out, Int indent); }; class typeParamList : public absyn { mem::vector params; public: typeParamList(position pos) : absyn(pos) {} void add(typeParam *tp); bool transAsParamMatcher(coenv &e, record *r, mem::vector *args); void prettyprint(ostream &out, Int indent); }; class receiveTypedefDec : public dec { typeParamList* params; public: receiveTypedefDec(position pos, typeParamList* params) : dec(pos), params(params) {} void transAsField(coenv& e, record *r) override; bool transAsParamMatcher( coenv& e, record *r, mem::vector *args ); }; // Abstract base class for // from _ access _; (fromaccessdec) // and // from _ unravel _; (unraveldec) class fromdec : public dec { protected: struct qualifier { // The varEntry holds the location and the type of the highest framed // structure that can be put on the stack. The record holds the actual // type of the qualifier. // For example: // struct A { // struct B { // static int x; // } // } // A a=new A; // from a.B unravel x; // // Here, v->getType() will yield A and v->getLocation() will yield the // location of the variable a, but the record type t will be B. record *t; varEntry *v; qualifier(record *t, varEntry *v) : t(t), v(v) {} }; // Return the qualifier from which the fields are taken. If t==0, it is // assumed that an error occurred and was reported. virtual qualifier getQualifier(coenv &e, record *r) = 0; idpairlist *fields; public: fromdec(position pos, idpairlist *fields) : dec(pos), fields(fields) {} void prettyprint(ostream &out, Int indent) override; void transAsField(coenv &e, record *r) override; }; // An unravel declaration dumps fields and types of a record into the local // scope. class unraveldec : public fromdec { name *id; qualifier getQualifier(coenv &e, record *) override; public: unraveldec(position pos, name *id, idpairlist *fields) : fromdec(pos, fields), id(id) {} void prettyprint(ostream &out, Int indent) override; void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; // A fromaccess declaration dumps fields and types of a module into the local // scope. It does not add the module as a variable in the local scope. class fromaccessdec : public fromdec { symbol id; formals *templateArgs; qualifier getQualifier(coenv &e, record *r) override; public: fromaccessdec( position pos, symbol id, idpairlist *fields, formals *templateArgs = 0 ) : fromdec(pos, fields), id(id), templateArgs(templateArgs) {} void prettyprint(ostream &out, Int indent) override; void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; // An import declaration dumps fields and types of a module into the local // scope. It also adds the module as a variable in the local scope. class importdec : public dec { block base; public: importdec(position pos, idpair *id) : dec(pos), base(pos, false) { idpairlist *i=new idpairlist; i->add(id); base.add(new accessdec(pos, i)); base.add(new unraveldec(pos, new simpleName(pos, id->dest), WILDCARD)); } void trans(coenv &e) override { base.trans(e); } void transAsField(coenv &e, record *r) override { base.transAsField(e, r); } void prettyprint(ostream &out, Int indent) override; void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; // Parses the file given, and translates the resulting runnables as if they // occurred at this place in the code. class includedec : public dec { string filename; public: includedec(position pos, string filename) : dec(pos), filename(filename) {} includedec(position pos, symbol id) : dec(pos), filename(id) {} void prettyprint(ostream &out, Int indent) override; void loadFailed(coenv &e); void transAsField(coenv &e, record *r) override; void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; // Types defined from others in `typedef` or `using` statement. class typedec : public dec { vardec *body; public: typedec(position pos, vardec *body) : dec(pos), body(body) {} typedec(position pos, decidstart *id_with_signature, astType *return_type) : dec(pos) { decid *di = new decid(id_with_signature->getPos(), id_with_signature); body = new vardec(return_type->getPos(), return_type, di); } void prettyprint(ostream &out, Int indent); void transAsField(coenv &e, record *r) { body->transAsTypedefField(e,r); } }; // A struct declaration. class recorddec : public dec { symbol id; block *body; void transRecordInitializer(coenv &e, record *parent); void addPostRecordEnvironment(coenv &e, record *r, record *parent); public: recorddec(position pos, symbol id, block *body) : dec(pos), id(id), body(body) {} virtual ~recorddec() {} void prettyprint(ostream &out, Int indent) override; void transAsField(coenv &e, record *parent) override; void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; // Returns a runnable that facilitates the autoplain feature. runnable *autoplainRunnable(); void addVar(coenv &e, record *r, varEntry *v, symbol id); } // namespace absyntax #endif asymptote-3.05/profiler.h0000644000000000000000000002300215031566105014156 0ustar rootroot/***** * profiler.h * Andy Hammerlindl 2010/07/24 * * Profiler for the execution of the virtual machine bytecode. *****/ #ifndef PROFILER_H #define PROFILER_H #if !defined(_WIN32) #include #endif #include #include "inst.h" #include "seconds.h" namespace vm { #ifdef DEBUG_BLTIN string lookupBltin(bltin b); #endif inline position positionFromLambda(lambda *func) { if (func == 0) return nullPos; program& code = *func->code; // Check for empty program. if (code.begin() == code.end()) return nullPos; return code.begin()->pos; } inline void printNameFromLambda(ostream& out, lambda *func) { if (!func) { out << ""; return; } #ifdef DEBUG_FRAME string name = func->name; #else string name = ""; #endif // If unnamed, use the pointer address. if (name.empty()) out << func; else out << name; out << " at "; positionFromLambda(func).printTerse(out); } inline void printNameFromBltin(ostream& out, bltin b) { #ifdef DEBUG_BLTIN string name = lookupBltin(b); #else string name = ""; #endif if (!name.empty()) out << name << " "; out << "(builtin at " << (void *)b << ")"; } class profiler : public gc { // To do call graph analysis, each call stack that occurs in practice is // represented by a node. For instance, if f and g are functions, then // f -> g -> g // is represented by a node and // g -> f -> g // is represented by a different one. struct node { // The top-level function of the call stack. It is either an asymptote // function with a given lambda, or a builtin function, with a given // bltin. lambda *func; bltin cfunc; // The number of times the top-level function has been called resulting in // this specific call stack. int calls; // The number of bytecode instructions executed with this exact call stack. // It does not include time spent in called function. int instructions; // Number of instructions spent in this function or its children. This is // computed by computeTotals. int instTotal; // The number of real-time nanoseconds spent in this node. WARNING: May // be wildly inaccurate. long long nsecs; // Total including children. long long nsecsTotal; // Call stacks resulting from calls during this call stack. mem::vector children; node() : func(0), cfunc(0), calls(0), instructions(0), instTotal(0), nsecs(0), nsecsTotal(0) {} node(lambda *func) : func(func), cfunc(0), calls(0), instructions(0), instTotal(0), nsecs(0), nsecsTotal(0) {} node(bltin b) : func(0), cfunc(b), calls(0), instructions(0), instTotal(0), nsecs(0), nsecsTotal(0) {} // Return the call stack resulting from a call to func when this call // stack is current. node *getChild(lambda *func) { size_t n = children.size(); for (size_t i = 0; i < n; ++i) if (children[i].func == func) return &children[i]; // Not found, create a new one. children.push_back(node(func)); return &children.back(); } node *getChild(bltin func) { size_t n = children.size(); for (size_t i = 0; i < n; ++i) if (children[i].cfunc == func) return &children[i]; // Not found, create a new one. children.push_back(node(func)); return &children.back(); } void computeTotals() { instTotal = instructions; nsecsTotal = nsecs; size_t n = children.size(); for (size_t i = 0; i < n; ++i) { children[i].computeTotals(); instTotal += children[i].instTotal; nsecsTotal += children[i].nsecsTotal; } } void pydump(ostream& out) { #ifdef DEBUG_FRAME string name = func ? func->name : ""; #else string name = ""; #endif out << "dict(\n" << " name = '" << name << " " << func << "',\n" << " pos = '" << positionFromLambda(func) << "',\n" << " calls = " << calls << ",\n" << " instructions = " << instructions << ",\n" << " nsecs = " << nsecs << ",\n" << " children = [\n"; size_t n = children.size(); for (size_t i = 0; i < n; ++i) { children[i].pydump(out); out << ",\n"; } out << " ])\n"; } }; // An empty call stack. node emptynode; // All of the callstacks. std::stack callstack; node &topnode() { return *callstack.top(); } // Arc representing one function calling another. Used only for building // the output for kcachegrind. struct arc : public gc { int calls; int instTotal; long long nsecsTotal; arc() : calls(0), instTotal(0), nsecsTotal(0) {} void add(node& n) { calls += n.calls; instTotal += n.instTotal; nsecsTotal += n.nsecsTotal; } }; // Representing one function and its calls to other functions. struct fun : public gc { int instructions; long long nsecs; mem::map arcs; mem::map carcs; fun() : instructions(0), nsecs(0) {} void addChildTime(node& n) { if (n.cfunc) carcs[n.cfunc].add(n); else arcs[n.func].add(n); } void analyse(node& n) { instructions += n.instructions; nsecs += n.nsecs; size_t numChildren = n.children.size(); for (size_t i = 0; i < numChildren; ++i) addChildTime(n.children[i]); } void dump(ostream& out) { // The unused line number needed by kcachegrind. static const string POS = "1"; out << POS << " " << instructions << " " << nsecs << "\n"; for (mem::map::iterator i = arcs.begin(); i != arcs.end(); ++i) { lambda *l = i->first; arc& a = i->second; out << "cfl=" << positionFromLambda(l) << "\n"; out << "cfn="; printNameFromLambda(out, l); out << "\n"; out << "calls=" << a.calls << " " << POS << "\n"; out << POS << " " << a.instTotal << " " << a.nsecsTotal << "\n"; } for (mem::map::iterator i = carcs.begin(); i != carcs.end(); ++i) { bltin b = i->first; arc& a = i->second; out << "cfl=C++ code" << endl; out << "cfn="; printNameFromBltin(out, b); out << "\n"; out << "calls=" << a.calls << " " << POS << "\n"; out << POS << " " << a.instTotal << " " << a.nsecsTotal << "\n"; } } }; // The data for each asymptote function. mem::map funs; // The data for each C++ function. mem::map cfuns; void analyseNode(node& n) { fun& f = n.cfunc ? cfuns[n.cfunc] : funs[n.func]; f.analyse(n); size_t numChildren = n.children.size(); for (size_t i = 0; i < numChildren; ++i) analyseNode(n.children[i]); } // Convert data in the tree of callstack nodes into data for each function. void analyseData() { emptynode.computeTotals(); analyseNode(emptynode); } // Timing data. utils::cpuTimer timestamp; void startLap() { timestamp.reset(); } // Called whenever the stack is about to change, in order to record the time // duration for the current node. void recordTime() { topnode().nsecs += (long long) timestamp.nanoseconds(true); } public: profiler(); void beginFunction(lambda *func); void endFunction(lambda *func); void beginFunction(bltin func); void endFunction(bltin func); void recordInstruction(); // TODO: Add position, type of instruction info to profiling. // Dump all of the data out in a format that can be read into Python. void pydump(ostream &out); // Dump all of the data in a format for kcachegrind. void dump(ostream& out); }; inline profiler::profiler() : emptynode() { callstack.push(&emptynode); startLap(); } inline void profiler::beginFunction(lambda *func) { assert(func); assert(!callstack.empty()); recordTime(); callstack.push(topnode().getChild(func)); ++topnode().calls; } inline void profiler::endFunction(lambda *func) { assert(func); assert(!callstack.empty()); assert(topnode().func == func); recordTime(); callstack.pop(); } inline void profiler::beginFunction(bltin cfunc) { assert(cfunc); assert(!callstack.empty()); recordTime(); callstack.push(topnode().getChild(cfunc)); ++topnode().calls; } inline void profiler::endFunction(bltin cfunc) { assert(cfunc); assert(!callstack.empty()); assert(topnode().cfunc == cfunc); recordTime(); callstack.pop(); } inline void profiler::recordInstruction() { assert(!callstack.empty()); ++topnode().instructions; } inline void profiler::pydump(ostream& out) { out << "profile = "; emptynode.pydump(out); } inline void profiler::dump(ostream& out) { analyseData(); out << "events: Instructions Nanoseconds\n"; for (mem::map::iterator i = funs.begin(); i != funs.end(); ++i) { lambda *l = i->first; fun& f = i->second; out << "fl=" << positionFromLambda(l) << "\n"; out << "fn="; printNameFromLambda(out, l); out << "\n"; f.dump(out); } for (mem::map::iterator i = cfuns.begin(); i != cfuns.end(); ++i) { bltin b = i->first; fun& f = i->second; out << "fl=C++ code\n"; out << "fn="; printNameFromBltin(out, b); out << "\n"; f.dump(out); } } } // namespace vm #endif // PROFILER_H asymptote-3.05/runlabel.h0000644000000000000000000000015315031566132014142 0ustar rootroot/***** Autogenerated from runlabel.in; changes will be overwritten *****/ #pragma once namespace run { } asymptote-3.05/locate.h0000644000000000000000000000116715031566105013613 0ustar rootroot/***** * locate.h * Tom Prince 2005/03/24 * * Locate files in search path. *****/ #ifndef LOCATE_H #define LOCATE_H #include "common.h" #include "settings.h" namespace settings { typedef mem::list file_list_t; extern file_list_t searchPath; // Find the appropriate file, first looking in the local directory, then the // directory given in settings, and finally the global system directory. string locateFile(string id, bool full=false, string suffix=settings::suffix); namespace fs { // Check to see if a file of given name exists. bool exists(string filename); } } // namespace settings #endif // LOCATE_H asymptote-3.05/name.cc0000644000000000000000000002013515031566105013416 0ustar rootroot/***** * name.cc * Andy Hammerlindl2002/07/14 * * Qualified names (such as x, f, builtin.sin, a.b.c.d, etc.) can be used * either as variables or a type names. This class stores qualified * names used in nameExp and nameTy in the abstract syntax, and * implements the exp and type functions. *****/ #include "name.h" #include "frame.h" #include "record.h" #include "coenv.h" #include "inst.h" namespace absyntax { using namespace types; using trans::access; using trans::qualifiedAccess; using trans::action; using trans::READ; using trans::WRITE; using trans::CALL; using vm::inst; types::ty *signatureless(types::ty *t) { if (overloaded *o=dynamic_cast(t)) return o->signatureless(); else return (t && !t->getSignature()) ? t : 0; } void name::forceEquivalency(action act, coenv &e, types::ty *target, types::ty *source) { if (act == READ) e.implicitCast(getPos(), target, source); else if (!equivalent(target, source)) { em.compiler(getPos()); em << "type mismatch in variable: " << *target << " vs " << *source; } } frame *name::frameTrans(coenv &e) { if (types::ty *t=signatureless(varGetType(e))) { if (t->kind == types::ty_record) { varTrans(READ, e, t); return ((record *)t)->getLevel(); } else return 0; } else return tyFrameTrans(e); } types::ty *name::getType(coenv &e, bool tacit) { types::ty *t=signatureless(varGetType(e)); if (!tacit && t && t->kind == ty_error) // Report errors associated with regarding the name as a variable. varTrans(trans::READ, e, t); return t ? t : typeTrans(e, tacit); } varEntry *simpleName::getVarEntry(coenv &e) { // If the name refers to a signatureless variable, // return its varEntry. types::ty *t=signatureless(varGetType(e)); if (t) return e.e.lookupVarByType(id, t); // Otherwise, the name refers to a type. // Return its varEntry. tyEntry *ent = e.e.lookupTyEntry(id); return ent ? ent->v : 0; } void simpleName::varTrans(action act, coenv &e, types::ty *target) { varEntry *v = e.e.lookupVarByType(id, target); if (v) { v->encode(act, getPos(), e.c); forceEquivalency(act, e, target, v->getType()); } else { em.error(getPos()); em << "no matching variable of name \'" << id << "\'"; } } types::ty *simpleName::varGetType(coenv &e) { return e.e.varGetType(id); } trans::varEntry *simpleName::getCallee(coenv &e, signature *sig) { varEntry *ve = e.e.lookupVarBySignature(id, sig); return ve; } types::ty *simpleName::typeTrans(coenv &e, bool tacit) { types::ty *t = e.e.lookupType(id); if (t) { return t; } else { if (!tacit) { em.error(getPos()); em << "no type of name \'" << id << "\'"; } return primError(); } } tyEntry *simpleName::tyEntryTrans(coenv &e) { tyEntry *ent = e.e.lookupTyEntry(id); if (!ent) { em.error(getPos()); em << "no type of name \'" << id << "\'"; return new tyEntry(primError(), nullptr, nullptr, nullPos); } return ent; } frame *simpleName::tyFrameTrans(coenv &e) { tyEntry *ent = e.e.lookupTyEntry(id); if (ent && ent->t->kind==types::ty_record && ent->v) { ent->v->encode(READ, getPos(), e.c); return ent->v->getLevel(); } else return 0; } void simpleName::prettyprint(ostream &out, Int indent) { prettyindent(out, indent); out << "simpleName '" << id << "'\n"; } AsymptoteLsp::SymbolLit simpleName::getLit() const { return AsymptoteLsp::SymbolLit(static_cast(id)); } record *qualifiedName::castToRecord(types::ty *t, bool tacit) { switch (t->kind) { case ty_overloaded: if (!tacit) { em.compiler(qualifier->getPos()); em << "name::getType returned overloaded"; } return 0; case ty_record: return (record *)t; case ty_error: return 0; default: if (!tacit) { em.error(qualifier->getPos()); em << "type \'" << *t << "\' is not a structure"; } return 0; } } bool qualifiedName::varTransVirtual(action act, coenv &e, types::ty *target, types::ty *qt) { varEntry *v = qt->virtualField(id, target->getSignature()); if (v) { // Push qualifier onto stack. qualifier->varTrans(READ, e, qt); v->encode(act, getPos(), e.c); // A virtual field was used. return true; } // No virtual field. return false; } void qualifiedName::varTransField(action act, coenv &e, types::ty *target, record *r) { varEntry *v = r->e.lookupVarByType(id, target); if (v) { frame *f = qualifier->frameTrans(e); if (f) v->encode(act, getPos(), e.c, f); else v->encode(act, getPos(), e.c); forceEquivalency(act, e, target, v->getType()); } else { em.error(getPos()); em << "no matching field of name \'" << id << "\' in \'" << *r << "\'"; } } void qualifiedName::varTrans(action act, coenv &e, types::ty *target) { types::ty *qt = qualifier->getType(e); // Use virtual fields if applicable. if (varTransVirtual(act, e, target, qt)) return; record *r = castToRecord(qt); if (r) varTransField(act, e, target, r); } types::ty *qualifiedName::varGetType(coenv &e) { types::ty *qt = qualifier->getType(e, true); // Look for virtual fields. types::ty *t = qt->virtualFieldGetType(id); if (t) return t; record *r = castToRecord(qt, true); return r ? r->e.varGetType(id) : 0; } trans::varEntry *qualifiedName::getCallee(coenv &e, signature *sig) { // getTypeAsCallee is an optimization attempt. We don't try optimizing the // rarer qualifiedName call case. // TODO: See if this is worth implementing. //cout << "FAIL BY QUALIFIED NAME" << endl; return 0; } trans::varEntry *qualifiedName::getVarEntry(coenv &e) { varEntry *qv = qualifier->getVarEntry(e); types::ty *qt = qualifier->getType(e, true); record *r = castToRecord(qt, true); if (r) { types::ty *t = signatureless(r->e.varGetType(id)); varEntry *v = t ? r->e.lookupVarByType(id, t) : 0; return trans::qualifyVarEntry(qv,v); } else return qv; } types::ty *qualifiedName::typeTrans(coenv &e, bool tacit) { types::ty *rt = qualifier->getType(e, tacit); record *r = castToRecord(rt, tacit); if (!r) return primError(); tyEntry *ent = r->e.lookupTyEntry(id); if (ent) { if (!tacit) ent->reportPerm(READ, getPos(), e.c); return ent->t; } else { if (!tacit) { em.error(getPos()); em << "no matching field or type of name \'" << id << "\' in \'" << *r << "\'"; } return primError(); } } tyEntry *qualifiedName::tyEntryTrans(coenv &e) { types::ty *rt = qualifier->getType(e, false); record *r = castToRecord(rt, false); if (!r) return new tyEntry(primError(), nullptr, nullptr, nullPos); tyEntry *ent = r->e.lookupTyEntry(id); if (!ent) { em.error(getPos()); em << "no matching type of name \'" << id << "\' in \'" << *r << "\'"; return new tyEntry(primError(), nullptr, nullptr, nullPos); } ent->reportPerm(READ, getPos(), e.c); return trans::qualifyTyEntry(qualifier->getVarEntry(e), ent); } frame *qualifiedName::tyFrameTrans(coenv &e) { frame *f=qualifier->frameTrans(e); tyEntry *ent = e.e.lookupTyEntry(id); if (ent && ent->t->kind==types::ty_record && ent->v) { if (f) ent->v->encode(READ, getPos(), e.c, f); else ent->v->encode(READ, getPos(), e.c); return ent->v->getLevel(); } else return f; } void qualifiedName::prettyprint(ostream &out, Int indent) { prettyindent(out, indent); out << "qualifiedName '" << id << "'\n"; qualifier->prettyprint(out, indent+1); } AsymptoteLsp::SymbolLit qualifiedName::getLit() const { std::vector accessors; name const* currentScope = this->qualifier; while (auto* qn = dynamic_cast(currentScope)) { accessors.push_back(static_cast(qn->getName())); currentScope = qn->qualifier; } accessors.push_back(static_cast(currentScope->getName())); return AsymptoteLsp::SymbolLit(static_cast(id), std::move(accessors)); } } // namespace absyntax asymptote-3.05/camp.tab.h0000644000000000000000000001424415031566132014031 0ustar rootroot/* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison interface for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, especially those whose name start with YY_ or yy_. They are private implementation details that can be changed or removed. */ #ifndef YY_YY_CAMP_TAB_H_INCLUDED # define YY_YY_CAMP_TAB_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 1 #endif #if YYDEBUG extern int yydebug; #endif /* Token kinds. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { YYEMPTY = -2, YYEOF = 0, /* "end of file" */ YYerror = 256, /* error */ YYUNDEF = 257, /* "invalid token" */ ID = 258, /* ID */ SELFOP = 259, /* SELFOP */ DOTS = 260, /* DOTS */ COLONS = 261, /* COLONS */ DASHES = 262, /* DASHES */ INCR = 263, /* INCR */ LONGDASH = 264, /* LONGDASH */ CONTROLS = 265, /* CONTROLS */ TENSION = 266, /* TENSION */ ATLEAST = 267, /* ATLEAST */ CURL = 268, /* CURL */ COR = 269, /* COR */ CAND = 270, /* CAND */ BAR = 271, /* BAR */ AMPERSAND = 272, /* AMPERSAND */ EQ = 273, /* EQ */ NEQ = 274, /* NEQ */ LT = 275, /* LT */ LE = 276, /* LE */ GT = 277, /* GT */ GE = 278, /* GE */ CARETS = 279, /* CARETS */ OPERATOR = 280, /* OPERATOR */ LOOSE = 281, /* LOOSE */ ASSIGN = 282, /* ASSIGN */ DIRTAG = 283, /* DIRTAG */ JOIN_PREC = 284, /* JOIN_PREC */ AND = 285, /* AND */ ELLIPSIS = 286, /* ELLIPSIS */ ACCESS = 287, /* ACCESS */ UNRAVEL = 288, /* UNRAVEL */ IMPORT = 289, /* IMPORT */ INCLUDE = 290, /* INCLUDE */ FROM = 291, /* FROM */ QUOTE = 292, /* QUOTE */ STRUCT = 293, /* STRUCT */ TYPEDEF = 294, /* TYPEDEF */ USING = 295, /* USING */ NEW = 296, /* NEW */ IF = 297, /* IF */ ELSE = 298, /* ELSE */ WHILE = 299, /* WHILE */ DO = 300, /* DO */ FOR = 301, /* FOR */ BREAK = 302, /* BREAK */ CONTINUE = 303, /* CONTINUE */ RETURN_ = 304, /* RETURN_ */ THIS_TOK = 305, /* THIS_TOK */ EXPLICIT = 306, /* EXPLICIT */ GARBAGE = 307, /* GARBAGE */ LIT = 308, /* LIT */ STRING = 309, /* STRING */ PERM = 310, /* PERM */ MODIFIER = 311, /* MODIFIER */ UNARY = 312, /* UNARY */ EXP_IN_PARENS_RULE = 313 /* EXP_IN_PARENS_RULE */ }; typedef enum yytokentype yytoken_kind_t; #endif /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { #line 60 "camp.y" position pos; bool boo; struct { position pos; sym::symbol sym; } ps; absyntax::name *n; absyntax::varinit *vi; absyntax::arrayinit *ai; absyntax::exp *e; absyntax::stringExp *stre; absyntax::specExp *se; absyntax::joinExp *j; absyntax::explist *elist; absyntax::argument arg; absyntax::arglist *alist; absyntax::slice *slice; absyntax::dimensions *dim; absyntax::astType *t; absyntax::decid *di; absyntax::decidlist *dil; absyntax::decidstart *dis; absyntax::runnable *run; struct { position pos; trans::permission val; } perm; struct { position pos; trans::modifier val; } mod; absyntax::modifierList *ml; //absyntax::program *prog; absyntax::vardec *vd; //absyntax::vardecs *vds; absyntax::dec *d; absyntax::idpair *ip; absyntax::idpairlist *ipl; absyntax::stm *s; absyntax::block *b; absyntax::stmExpList *sel; //absyntax::funheader *fh; absyntax::formal *fl; absyntax::formals *fls; absyntax::typeParam *tp; absyntax::typeParamList *tps; #line 171 "camp.tab.h" }; typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE yylval; int yyparse (void); #endif /* !YY_YY_CAMP_TAB_H_INCLUDED */ asymptote-3.05/path.h0000644000000000000000000002661715031566105013307 0ustar rootroot/***** * path.h * Andy Hammerlindl 2002/05/16 * * Stores a piecewise cubic spline with known control points. * * When changing the path algorithms, also update the corresponding * three-dimensional algorithms in path3.cc and three.asy. *****/ #ifndef PATH_H #define PATH_H #include #include "mod.h" #include "pair.h" #include "transform.h" #include "bbox.h" inline double Intcap(double t) { if(t <= (double) Int_MIN) return (double) Int_MIN; if(t >= (double) Int_MAX) return (double) Int_MAX; return t; } // The are like floor and ceil, except they return an integer; // if the argument cannot be converted to a valid integer, they return // Int_MAX (for positive arguments) or Int_MIN (for negative arguments). inline Int Floor(double t) {return (Int) floor(Intcap(t));} inline Int Ceil(double t) {return (Int) ceil(Intcap(t));} bool simpson(double& integral, double (*)(double), double a, double b, double acc, double dxmax); bool unsimpson(double integral, double (*)(double), double a, double& b, double acc, double& area, double dxmax, double dxmin=0); namespace camp { void checkEmpty(Int n); inline Int adjustedIndex(Int i, Int n, bool cycles) { checkEmpty(n); if(cycles) return imod(i,n); else if(i < 0) return 0; else if(i >= n) return n-1; else return i; } // Used in the storage of solved path knots. struct solvedKnot : public gc { pair pre; pair point; pair post; bool straight; solvedKnot() : straight(false) {} friend bool operator== (const solvedKnot& p, const solvedKnot& q) { return p.pre == q.pre && p.point == q.point && p.post == q.post; } }; extern const double Fuzz; extern const double Fuzz2; extern const double Fuzz4; extern const double sqrtFuzz; extern const double BigFuzz; extern const double fuzzFactor; class path : public gc { bool cycles; // If the path is closed in a loop Int n; // The number of knots mem::vector nodes; mutable double cached_length; // Cache length since path is immutable. mutable bbox box; mutable bbox times; // Times where minimum and maximum extents are attained. public: path() : cycles(false), n(0), nodes(), cached_length(-1) {} // Create a path of a single point path(pair z, bool = false) : cycles(false), n(1), nodes(1), cached_length(-1) { nodes[0].pre = nodes[0].point = nodes[0].post = z; nodes[0].straight = false; } // Creates path from a list of knots. This will be used by camp // methods such as the guide solver, but should probably not be used by a // user of the system unless he knows what he is doing. path(mem::vector& nodes, Int n, bool cycles = false) : cycles(cycles), n(n), nodes(nodes), cached_length(-1) { } friend bool operator== (const path& p, const path& q) { return p.cycles == q.cycles && p.nodes == q.nodes; } public: path(solvedKnot n1, solvedKnot n2) : cycles(false), n(2), nodes(2), cached_length(-1) { nodes[0] = n1; nodes[1] = n2; nodes[0].pre = nodes[0].point; nodes[1].post = nodes[1].point; } // Copy constructor path(const path& p) : cycles(p.cycles), n(p.n), nodes(p.nodes), cached_length(p.cached_length), box(p.box), times(p.times) {} path unstraighten() const { path P=path(*this); for(int i=0; i < n; ++i) P.nodes[i].straight=false; return P; } virtual ~path() { } // Getting control points Int size() const { return n; } bool empty() const { return n == 0; } Int length() const { return cycles ? n : n-1; } bool cyclic() const { return cycles; } mem::vector& Nodes() { return nodes; } bool straight(Int t) const { if (cycles) return nodes[imod(t,n)].straight; return (t >= 0 && t < n) ? nodes[t].straight : false; } bool piecewisestraight() const { Int L=length(); for(Int i=0; i < L; ++i) if(!straight(i)) return false; return true; } pair point(Int t) const { return nodes[adjustedIndex(t,n,cycles)].point; } pair point(double t) const; pair precontrol(Int t) const { return nodes[adjustedIndex(t,n,cycles)].pre; } pair precontrol(double t) const; pair postcontrol(Int t) const { return nodes[adjustedIndex(t,n,cycles)].post; } pair postcontrol(double t) const; inline double norm(const pair& z0, const pair& c0, const pair& c1, const pair& z1) const { return Fuzz2*camp::max((c0-z0).abs2(), camp::max((c1-z0).abs2(),(z1-z0).abs2())); } pair predir(Int t, bool normalize=true) const { if(!cycles && t <= 0) return pair(0,0); pair z1=point(t); pair c1=precontrol(t); pair dir=3.0*(z1-c1); if(!normalize) return dir; pair z0=point(t-1); pair c0=postcontrol(t-1); double epsilon=norm(z0,c0,c1,z1); if(dir.abs2() > epsilon) return unit(dir); dir=2.0*c1-c0-z1; if(dir.abs2() > epsilon) return unit(dir); return unit(z1-z0+3.0*(c0-c1)); } pair postdir(Int t, bool normalize=true) const { if(!cycles && t >= n-1) return pair(0,0); pair c0=postcontrol(t); pair z0=point(t); pair dir=3.0*(c0-z0); if(!normalize) return dir; pair z1=point(t+1); pair c1=precontrol(t+1); double epsilon=norm(z0,c0,c1,z1); if(dir.abs2() > epsilon) return unit(dir); dir=z0-2.0*c0+c1; if(dir.abs2() > epsilon) return unit(dir); return unit(z1-z0+3.0*(c0-c1)); } pair dir(Int t, Int sign, bool normalize=true) const { if(sign == 0) { pair v=predir(t,normalize)+postdir(t,normalize); return normalize ? unit(v) : 0.5*v; } if(sign > 0) return postdir(t,normalize); return predir(t,normalize); } pair dir(double t, bool normalize=true) const { if(!cycles) { if(t <= 0) return postdir((Int) 0,normalize); if(t >= n-1) return predir(n-1,normalize); } Int i=Floor(t); t -= i; if(t == 0) return dir(i,0,normalize); pair z0=point(i); pair c0=postcontrol(i); pair c1=precontrol(i+1); pair z1=point(i+1); pair a=3.0*(z1-z0)+9.0*(c0-c1); pair b=6.0*(z0+c1)-12.0*c0; pair c=3.0*(c0-z0); pair dir=a*t*t+b*t+c; if(!normalize) return dir; double epsilon=norm(z0,c0,c1,z1); if(dir.abs2() > epsilon) return unit(dir); dir=2.0*a*t+b; if(dir.abs2() > epsilon) return unit(dir); return unit(a); } pair postaccel(Int t) const { if(!cycles && t >= n-1) return pair(0,0); pair z0=point(t); pair c0=postcontrol(t); pair c1=precontrol(t+1); return 6.0*(z0+c1)-12.0*c0; } pair preaccel(Int t) const { if(!cycles && t <= 0) return pair(0,0); pair c0=postcontrol(t-1); pair c1=precontrol(t); pair z1=point(t); return 6.0*(z1+c0)-12.0*c1; } pair accel(Int t, Int sign) const { if(sign == 0) return 0.5*(preaccel(t)+postaccel(t)); if(sign > 0) return postaccel(t); return preaccel(t); } pair accel(double t) const { if(!cycles) { if(t <= 0) return postaccel((Int) 0); if(t >= n-1) return preaccel(n-1); } Int i=Floor(t); t -= i; if(t == 0) return 0.5*(postaccel(i)+preaccel(i)); pair z0=point(i); pair c0=postcontrol(i); pair c1=precontrol(i+1); pair z1=point(i+1); return 6.0*t*(z1-z0+3.0*(c0-c1))+6.0*(z0+c1)-12.0*c0; } // Returns the path traced out in reverse. path reverse() const; // Generates a path that is a section of the old path, using the time // interval given. path subpath(Int start, Int end) const; path subpath(double start, double end) const; // Special case of subpath used by intersect. void halve(path &first, path &second) const; // Used by picture to determine bounding box. bbox bounds() const; pair mintimes() const { checkEmpty(n); bounds(); return camp::pair(times.left,times.bottom); } pair maxtimes() const { checkEmpty(n); bounds(); return camp::pair(times.right,times.top); } template void addpoint(bbox& box, T i) const { box.addnonempty(point(i),times,(double) i); } template void addpoint(bbox& box, T i, double min, double max) const { static const pair I(0,1); pair v=I*dir(i); pair z=point(i); box.add(z+min*v); box.addnonempty(z+max*v); } // Return bounding box accounting for padding perpendicular to path. bbox bounds(double min, double max) const; // Return bounding box accounting for internal pen padding (but not pencap). bbox internalbounds(const bbox &padding) const; double cubiclength(Int i, double goal=-1) const; double arclength () const; double arctime (double l) const; double directiontime(const pair& z) const; pair max() const { checkEmpty(n); return bounds().Max(); } pair min() const { checkEmpty(n); return bounds().Min(); } // Debugging output friend std::ostream& operator<< (std::ostream& out, const path& p); // Increment count if the path has a vertical component at t. bool Count(Int& count, double t) const; // Count if t is in (begin,end] and z lies to the left of point(i+t). void countleft(Int& count, double x, Int i, double t, double begin, double end, double& mint, double& maxt) const; // Return the winding number of the region bounded by the (cyclic) path // relative to the point z. Int windingnumber(const pair& z) const; // Transformation path transformed(const transform& t) const; }; double arcLength(const pair& z0, const pair& c0, const pair& c1, const pair& z1); extern path nullpath; extern const unsigned maxdepth; extern const unsigned mindepth; extern const char *nopoints; bool intersect(double& S, double& T, path& p, path& q, double fuzz, unsigned depth=maxdepth); bool intersections(double& s, double& t, std::vector& S, std::vector& T, path& p, path& q, double fuzz, bool single, bool exact, unsigned depth=maxdepth); void intersections(std::vector& S, path& g, const pair& p, const pair& q, double fuzz); // Concatenates two paths into a new one. path concat(const path& p1, const path& p2); // Applies a transformation to the path path transformed(const transform& t, const path& p); inline double quadratic(double a, double b, double c, double x) { return a*x*x+b*x+c; } class quadraticroots { public: enum {NONE=0, ONE=1, TWO=2, MANY} distinct; // Number of distinct real roots. unsigned roots; // Total number of real roots. double t1,t2; // Real roots quadraticroots(double a, double b, double c); }; class Quadraticroots { public: unsigned roots; // Total number of roots. pair z1,z2; // Complex roots Quadraticroots(pair a, pair b, pair c); }; class cubicroots { public: unsigned roots; // Total number of real roots. double t1,t2,t3; cubicroots(double a, double b, double c, double d); }; path nurb(pair z0, pair z1, pair z2, pair z3, double w0, double w1, double w2, double w3, Int m); double orient2d(const pair& a, const pair& b, const pair& c); void roots(std::vector &roots, double a, double b, double c, double d); void roots(std::vector &r, double x0, double c0, double c1, double x1, double x); inline bool goodroot(double t) { return 0.0 <= t && t <= 1.0; } extern const double third; } #ifndef BROKEN_COMPILER // Delete the following line to work around problems with old broken compilers. GC_DECLARE_PTRFREE(camp::solvedKnot); #endif #endif asymptote-3.05/picture.h0000644000000000000000000000663515031566105014024 0ustar rootroot/***** * picture.h * Andy Hamerlindl 2002/06/06 * * Stores a picture as a list of drawElements and handles its output to * PostScript. *****/ #ifndef PICTURE_H #define PICTURE_H #include #include #include "drawelement.h" namespace camp { class picture : public gc { private: bool labels; size_t lastnumber; size_t lastnumber3; transform T; // Keep track of accumulative picture transform bbox b; bbox b_cached; // Cached bounding box boxvector labelbounds; bboxlist bboxstack; groupsmap groups; unsigned billboard; bool deconstruct; public: bbox3 b3; // 3D bounding box typedef mem::list nodelist; nodelist nodes; picture(bool deconstruct=false) : labels(false), lastnumber(0), lastnumber3(0), T(identity), billboard(0), deconstruct(deconstruct) {} // Destroy all of the owned picture objects. ~picture(); // Prepend an object to the picture. void prepend(drawElement *p); // Append an object to the picture. void append(drawElement *p); // Enclose each layer with begin and end. void enclose(drawElement *begin, drawElement *end); // Add the content of another picture. void add(picture &pic); void prepend(picture &pic); bool havelabels(); bool have3D(); bool havepng(); unsigned int pagecount(); bbox bounds(); bbox3 bounds3(); // Compute bounds on ratio (x,y)/z for 3d picture (not cached). pair ratio(double (*m)(double, double)); int epstosvg(const string& epsname, const string& outname, unsigned int pages); int epstopdf(const string& epsname, const string& pdfname); int pdftoeps(const string& pdfname, const string& epsname, bool eps=true); bool texprocess(const string& texname, const string& tempname, const string& prefix, const pair& bboxshift, bool svgformat); bool postprocess(const string& prename, const string& outname, const string& outputformat, bool wait, bool view, bool pdftex, bool epsformat, bool svg); bool display(const string& outname, const string& outputformat, bool wait, bool view, bool epsformat); // Ship the picture out to PostScript & TeX files. bool shipout(picture* preamble, const string& prefix, const string& format, bool wait=false, bool view=true); void render(double size2, const triple &Min, const triple& Max, double perspective, bool remesh) const; bool shipout3(const string& prefix, const string& format, double width, double height, double angle, double zoom, const triple& m, const triple& M, const pair& shift, const pair& margin, double *t, double *tup, double *background, size_t nlights, triple *lights, double *diffuse, double *specular, bool view); // 3D output bool shipout3(const string& prefix, const string format); bool reloadPDF(const string& Viewer, const string& outname) const; picture *transformed(const transform& t); picture *transformed(const vm::array& t); bool null() { return nodes.empty(); } }; inline picture *transformed(const transform& t, picture *p) { return p->transformed(t); } inline picture *transformed(const vm::array& t, picture *p) { return p->transformed(t); } void texinit(); int opentex(const string& texname, const string& prefix, bool dvi=false); const char *texpathmessage(); } //namespace camp #endif asymptote-3.05/drawelement.h0000644000000000000000000002631415031566105014654 0ustar rootroot/***** * drawelement.h * Andy Hammerlindl 2002/06/06 * * Abstract base class of any drawable item in camp. *****/ #ifndef DRAWELEMENT_H #define DRAWELEMENT_H #include #include "common.h" #include "bbox.h" #include "bbox3.h" #include "pen.h" #include "psfile.h" #include "texfile.h" #include "prcfile.h" #include "jsfile.h" #include "v3dfile.h" #include "glrender.h" #include "arrayop.h" #include "material.h" namespace camp { static const double pixelResolution=1.0; // Adaptive rendering constant. enum Interaction {EMBEDDED=0,BILLBOARD}; void copyArray4x4C(double*& dest, const vm::array *a); class box { pair p[4]; public: box() {} box(const pair& a, const pair& b, const pair& c, const pair& d) { p[0]=a; p[1]=b; p[2]=c; p[3]=d; } // Returns true if the line a--b intersects box b. bool intersect(const pair& a, const pair& b) const { for(Int i=0; i < 4; ++i) { pair A=p[i]; pair B=p[i < 3 ? i+1 : 0]; double de=(b.x-a.x)*(A.y-B.y)-(A.x-B.x)*(b.y-a.y); if(de != 0.0) { de=1.0/de; double t=((A.x-a.x)*(A.y-B.y)-(A.x-B.x)*(A.y-a.y))*de; double T=((b.x-a.x)*(A.y-a.y)-(A.x-a.x)*(b.y-a.y))*de; if(0 <= t && t <= 1 && 0 <= T && T <= 1) return true; } } return false; } pair operator [] (Int i) const {return p[i];} bool intersect(const box& b) const { for(Int i=0; i < 4; ++i) { pair A=b[i]; pair B=b[i < 3 ? i+1 : 0]; if(intersect(A,B)) return true; } return false; } double xmax() { return max(max(max(p[0].x,p[1].x),p[2].x),p[3].x); } double ymax() { return max(max(max(p[0].y,p[1].y),p[2].y),p[3].y); } double xmin() { return min(min(min(p[0].x,p[1].x),p[2].x),p[3].x); } double ymin() { return min(min(min(p[0].y,p[1].y),p[2].y),p[3].y); } }; class bbox2 { public: double x,y,X,Y; bbox2(size_t n, const triple *v) { Bounds(v[0]); for(size_t i=1; i < n; ++i) bounds(v[i]); } bbox2(const triple& m, const triple& M) { Bounds(m); bounds(triple(m.getx(),m.gety(),M.getz())); bounds(triple(m.getx(),M.gety(),m.getz())); bounds(triple(m.getx(),M.gety(),M.getz())); bounds(triple(M.getx(),m.gety(),m.getz())); bounds(triple(M.getx(),m.gety(),M.getz())); bounds(triple(M.getx(),M.gety(),m.getz())); bounds(M); } bbox2(const triple& m, const triple& M, const Billboard& BB) { Bounds(BB.transform(m)); bounds(BB.transform(triple(m.getx(),m.gety(),M.getz()))); bounds(BB.transform(triple(m.getx(),M.gety(),m.getz()))); bounds(BB.transform(triple(m.getx(),M.gety(),M.getz()))); bounds(BB.transform(triple(M.getx(),m.gety(),m.getz()))); bounds(BB.transform(triple(M.getx(),m.gety(),M.getz()))); bounds(BB.transform(triple(M.getx(),M.gety(),m.getz()))); bounds(BB.transform(M)); } // Is 2D bounding box formed by projecting 3d points in vector v offscreen? bool offscreen() { double eps=1.0e-2; double min=-1.0-eps; double max=1.0+eps; return X < min || x > max || Y < min || y > max; } void Bounds(const triple& v) { pair V=Transform2T(gl::dprojView,v); x=X=V.getx(); y=Y=V.gety(); } void bounds(const triple& v) { pair V=Transform2T(gl::dprojView,v); double a=V.getx(); double b=V.gety(); if(a < x) x=a; else if(a > X) X=a; if(b < y) y=b; else if(b > Y) Y=b; } }; typedef mem::vector boxvector; typedef mem::list bboxlist; typedef mem::map groupmap; typedef mem::vector groupsmap; typedef mem::map centerMap; inline bool operator < (const triple& a, const triple& b) { return a.getx() < b.getx() || (a.getx() == b.getx() && (a.gety() < b.gety() || (a.gety() == b.gety() && (a.getz() < b.getz())))); } class drawElement : public gc { public: string KEY; drawElement(const string& key="") : KEY(key == "" ? processData().KEY : key) {} virtual ~drawElement() {} static mem::vector centers; static centerMap centermap; static size_t centerIndex; static pen lastpen; static const triple zero; // Adjust the bbox of the picture based on the addition of this // element. The iopipestream is needed for determining label sizes. virtual void bounds(bbox&, iopipestream&, boxvector&, bboxlist&) {} virtual void bounds(const double*, bbox3&) {} virtual void bounds(bbox3& b) { bounds(NULL, b); } // Compute bounds on ratio (x,y)/z for 3d picture (not cached). virtual void ratio(const double *t, pair &b, double (*m)(double, double), double fuzz, bool &first) {} virtual void minratio(const double *t, pair &b, double fuzz, bool &first) { ratio(t,b,camp::min,fuzz,first); } virtual void maxratio(const double *t,pair &b, double fuzz, bool &first) { ratio(t,b,camp::max,fuzz,first); } virtual void ratio(pair &b, double (*m)(double, double), double fuzz, bool &first) { ratio(NULL,b,m,fuzz,first); } virtual void minratio(pair &b, double fuzz, bool &first) { minratio(NULL,b,fuzz,first); } virtual void maxratio(pair &b, double fuzz, bool &first) { maxratio(NULL,b,fuzz,first); } virtual bool islabel() {return false;} virtual bool isnewpage() {return false;} virtual bool islayer() {return false;} virtual bool is3D() {return false;} // Implement element as raw SVG code? virtual bool svg() {return false;} // Implement SVG element as png image? virtual bool svgpng() {return false;} virtual bool beginclip() {return false;} virtual bool endclip() {return false;} virtual bool begingroup() {return false;} virtual bool begingroup3() {return false;} virtual bool endgroup() {return false;} virtual bool endgroup3() {return false;} virtual const double* transf3() {return NULL;} virtual void save(bool b) {} // Output to a PostScript file virtual bool draw(psfile *) { return false; } // Output to a TeX file virtual bool write(texfile *, const bbox&) { return false; } // Output to a PRC file virtual bool write(prcfile *out, unsigned int *count, double compressionlimit, groupsmap& groups) { return false; } // Output to a WebGL or v3d file virtual bool write(abs3Doutfile *out) { return false; } // Used to compute deviation of a surface from a quadrilateral. virtual void displacement() {} // Render with OpenGL virtual void render(double size2, const triple& Min, const triple& Max, double perspective, bool remesh) {} virtual void meshinit() {} size_t centerindex(const triple& center) { centerMap::iterator p=centermap.find(center); if(p != centermap.end()) centerIndex=p->second; else { centers.push_back(center); centermap[center]=centerIndex=centers.size(); } return centerIndex; } // Transform as part of a picture. virtual drawElement *transformed(const transform&) { return this; } virtual drawElement *transformed(const double* t) { return this; } }; // Hold transform of an object. class drawElementLC : public virtual drawElement { public: double *T; // Keep track of accumulative picture transform drawElementLC() : T(NULL) {} drawElementLC(const double *t) : T(NULL) { copyTransform3(T,t); } drawElementLC(const vm::array& t) : T(NULL) { copyArray4x4C(T,&t); } drawElementLC(const double* t, const drawElementLC *s) : drawElement(s->KEY), T(NULL) { multiplyTransform3(T,t,s->T); } virtual ~drawElementLC() {} virtual bool is3D() {return true;} virtual const double* transf3() {return T;} virtual drawElement* transformed(const double* t) { return new drawElementLC(t,this); } }; // Base class for drawElements that involve paths. class drawPathBase : public virtual drawElement { protected: path p; path transpath(const transform& t) const { return p.transformed(t); } public: drawPathBase() {} drawPathBase(path p) : p(p) {} virtual ~drawPathBase() {} virtual void bounds(bbox& b, iopipestream&, boxvector&, bboxlist&) { b += p.bounds(); } virtual void writepath(psfile *out,bool) { out->write(p); } virtual void writeclippath(psfile *out, bool newpath=true) { out->writeclip(p,newpath); } virtual void writeshiftedpath(texfile *out) { out->writeshifted(p); } }; // Base class for drawElements that involve paths and pens. class drawPathPenBase : public drawPathBase { protected: pen pentype; pen transpen(const transform& t) const { return camp::transformed(shiftless(t),pentype); } public: drawPathPenBase(path p, pen pentype) : drawPathBase(p), pentype(pentype) {} drawPathPenBase(pen pentype) : pentype(pentype) {} virtual bool empty() { return p.empty(); } virtual bool cyclic() { return p.cyclic(); } void strokebounds(bbox& b, const path& p); virtual void penSave(psfile *out) { if (!pentype.getTransform().isIdentity()) out->gsave(); } virtual void penTranslate(psfile *out) { out->translate(shiftpair(pentype.getTransform())); } virtual void penConcat(psfile *out) { out->concat(shiftless(pentype.getTransform())); } virtual void penRestore(psfile *out) { if (!pentype.getTransform().isIdentity()) out->grestore(); } }; // Base class for drawElements that involve superpaths and pens. class drawSuperPathPenBase : public drawPathPenBase { protected: vm::array P; size_t size; bbox bpath; vm::array transpath(const transform& t) const { vm::array *Pt=new vm::array(size); for(size_t i=0; i < size; i++) (*Pt)[i]=vm::read(P,i).transformed(t); return *Pt; } public: drawSuperPathPenBase(const vm::array& P, pen pentype) : drawPathPenBase(pentype), P(P), size(P.size()) {} bool empty() { for(size_t i=0; i < size; i++) if(vm::read(P,i).size() != 0) return false; return true; } bool cyclic() { for(size_t i=0; i < size; i++) if(!vm::read(P,i).cyclic()) return false; return true; } void bounds(bbox& b, iopipestream&, boxvector&, bboxlist&) { for(size_t i=0; i < size; i++) bpath += vm::read(P,i).bounds(); b += bpath; } void strokepath(psfile *out) { out->strokepath(); } void strokebounds(bbox& b) { for(size_t i=0; i < size; i++) drawPathPenBase::strokebounds(bpath,vm::read(P,i)); b += bpath; } void writepath(psfile *out, bool newpath=true) { if(size > 0) out->write(vm::read(P,0),newpath); for(size_t i=1; i < size; i++) out->write(vm::read(P,i),false); } void writeclippath(psfile *out, bool newpath=true) { if(size > 0) out->writeclip(vm::read(P,0),newpath); for(size_t i=1; i < size; i++) out->writeclip(vm::read(P,i),false); } void writeshiftedpath(texfile *out) { for(size_t i=0; i < size; i++) out->writeshifted(vm::read(P,i),i == 0); } }; #ifdef HAVE_LIBGLM void setcolors(const prc::RGBAColour& diffuse, const prc::RGBAColour& emissive, const prc::RGBAColour& specular, double shininess, double metallic, double fresnel0, abs3Doutfile *out=NULL); #endif } GC_DECLARE_PTRFREE(camp::box); GC_DECLARE_PTRFREE(camp::drawElement); #endif asymptote-3.05/runarray.in0000644000000000000000000014332315031566105014367 0ustar rootroot/***** * runarray.in * * Runtime functions for array operations. * *****/ pair => primPair() triple => primTriple() boolarray* => booleanArray() Intarray* => IntArray() Intarray2* => IntArray2() realarray* => realArray() realarray2* => realArray2() realarray3* => realArray3() pairarray* => pairArray() pairarray2* => pairArray2() pairarray3* => pairArray3() triplearray2* => tripleArray2() callableReal* => realRealFunction() #include "array.h" #include "arrayop.h" #include "triple.h" #include "path3.h" #include "Delaunay.h" #include "glrender.h" #ifdef HAVE_LIBFFTW3 #include "fftw++.h" static const char *rectangular="matrix must be rectangular"; #else static const char *installFFTW= "Please install fftw3, then ./configure; make"; #endif #ifdef HAVE_EIGEN_DENSE #include typedef std::complex Complex; static const char *square="matrix must be square"; using Eigen::MatrixXd; using Eigen::MatrixXcd; using Eigen::RealSchur; using Eigen::ComplexSchur; #else static const char *installEIGEN= "Please install eigen3, then ./configure; make"; #endif using namespace camp; using namespace vm; namespace run { extern pair zero; } typedef array boolarray; typedef array Intarray; typedef array Intarray2; typedef array realarray; typedef array realarray2; typedef array realarray3; typedef array pairarray; typedef array pairarray2; typedef array pairarray3; typedef array triplearray2; using types::booleanArray; using types::IntArray; using types::IntArray2; using types::realArray; using types::realArray2; using types::realArray3; using types::pairArray; using types::pairArray2; using types::pairArray3; using types::tripleArray2; typedef callable callableReal; void outOfBounds(const char *op, size_t len, Int n) { ostringstream buf; buf << op << " array of length " << len << " with out-of-bounds index " << n; error(buf); } inline item& arrayRead(array *a, Int n) { size_t len=checkArray(a); bool cyclic=a->cyclic(); if(cyclic && len > 0) n=imod(n,len); else if(n < 0 || n >= (Int) len) outOfBounds("reading",len,n); return (*a)[(unsigned) n]; } // Helper function to create deep arrays. static array* deepArray(Int depth, Int *dims) { assert(depth > 0); if (depth == 1) { return new array(dims[0]); } else { Int length = dims[0]; depth--; dims++; array *a = new array(length); for (Int index = 0; index < length; index++) { (*a)[index] = deepArray(depth, dims); } return a; } } namespace run { array *Identity(Int n) { size_t N=(size_t) n; array *c=new array(N); for(size_t i=0; i < N; ++i) { array *ci=new array(N); (*c)[i]=ci; for(size_t j=0; j < N; ++j) (*ci)[j]=0.0; (*ci)[i]=1.0; } return c; } } static const char *incommensurate="Incommensurate matrices"; static const char *singular="Singular matrix"; static const char *invalidarraylength="Invalid array length: "; static size_t *pivot,*Row,*Col; bound_double *bounddouble(int N) { if(N == 16) return bound; if(N == 10) return boundtri; ostringstream buf; buf << invalidarraylength << " " << N; error(buf); return NULL; } bound_triple *boundtriple(int N) { if(N == 16) return bound; if(N == 10) return boundtri; ostringstream buf; buf << invalidarraylength << " " << N; error(buf); return NULL; } static inline void inverseAllocate(size_t n) { pivot=new size_t[n]; Row=new size_t[n]; Col=new size_t[n]; } static inline void inverseDeallocate() { delete[] pivot; delete[] Row; delete[] Col; } namespace run { array *copyArray(array *a) { size_t size=checkArray(a); array *c=new array(size); for(size_t i=0; i < size; i++) (*c)[i]=(*a)[i]; return c; } array *copyArray2(array *a) { size_t size=checkArray(a); array *c=new array(size); for(size_t i=0; i < size; i++) { array *ai=read(a,i); size_t aisize=checkArray(ai); array *ci=new array(aisize); (*c)[i]=ci; for(size_t j=0; j < aisize; j++) (*ci)[j]=(*ai)[j]; } return c; } double *copyTripleArray2Components(array *a, size_t &N, GCPlacement placement) { size_t n=checkArray(a); N=0; for(size_t i=0; i < n; i++) N += checkArray(read(a,i)); double *A=(placement == NoGC) ? new double [3*N] : new(placement) double[3*N]; double *p=A; for(size_t i=0; i < n; i++) { array *ai=read(a,i); size_t m=checkArray(ai); for(size_t j=0; j < m; j++) { triple v=read(ai,j); *p=v.getx(); *(p+N)=v.gety(); *(p+2*N)=v.getz(); ++p; } } return A; } triple *copyTripleArray2C(array *a, size_t &N, GCPlacement placement) { size_t n=checkArray(a); N=0; for(size_t i=0; i < n; i++) N += checkArray(read(a,i)); triple *A=(placement == NoGC) ? new triple [N] : new(placement) triple[N]; triple *p=A; for(size_t i=0; i < n; i++) { array *ai=read(a,i); size_t m=checkArray(ai); for(size_t j=0; j < m; j++) *(p++)=read(ai,j); } return A; } triple operator *(const array& t, const triple& v) { size_t n=checkArray(&t); if(n != 4) error(incommensurate); array *t0=read(t,0); array *t1=read(t,1); array *t2=read(t,2); array *t3=read(t,3); if(checkArray(t0) != 4 || checkArray(t1) != 4 || checkArray(t2) != 4 || checkArray(t3) != 4) error(incommensurate); double x=v.getx(); double y=v.gety(); double z=v.getz(); double f=read(t3,0)*x+read(t3,1)*y+read(t3,2)*z+ read(t3,3); if(f == 0.0) run::dividebyzero(); f=1.0/f; return triple((read(t0,0)*x+read(t0,1)*y+read(t0,2)*z+ read(t0,3))*f, (read(t1,0)*x+read(t1,1)*y+read(t1,2)*z+ read(t1,3))*f, (read(t2,0)*x+read(t2,1)*y+read(t2,2)*z+ read(t2,3))*f); } template array *mult(array *a, array *b) { size_t n=checkArray(a); size_t nb=checkArray(b); size_t na0=n == 0 ? 0 : checkArray(read(a,0)); if(na0 != nb) error(incommensurate); size_t nb0=nb == 0 ? 0 : checkArray(read(b,0)); array *c=new array(n); T *A,*B; copyArray2C(A,a,false); copyArray2C(B,b,false); for(size_t i=0; i < n; ++i) { T *Ai=A+i*nb; array *ci=new array(nb0); (*c)[i]=ci; for(size_t j=0; j < nb0; ++j) { T sum=T(); size_t kj=j; for(size_t k=0; k < nb; ++k, kj += nb0) sum += Ai[k]*B[kj]; (*ci)[j]=sum; } } delete[] B; delete[] A; return c; } // Compute transpose(A)*A where A is an n x m matrix. template array *AtA(array *a) { size_t n=checkArray(a); size_t m=n == 0 ? 0 : checkArray(read(a,0)); array *c=new array(m); T *A; copyArray2C(A,a,false); for(size_t i=0; i < m; ++i) { array *ci=new array(m); (*c)[i]=ci; for(size_t j=0; j < m; ++j) { T sum=T(); size_t kj=j; size_t ki=i; for(size_t k=0; k < n; ++k, kj += m, ki += m) sum += A[ki]*A[kj]; (*ci)[j]=sum; } } delete[] A; return c; } double norm(double *a, size_t n) { if(n == 0) return 0.0; double M=fabs(a[0]); for(size_t i=1; i < n; ++i) M=::max(M,fabs(a[i])); return M; } double norm(triple *a, size_t n) { if(n == 0) return 0.0; double M=a[0].abs2(); for(size_t i=1; i < n; ++i) M=::max(M,a[i].abs2()); return sqrt(M); } // Transpose an n x n matrix in place. void transpose(double *a, size_t n) { for(size_t i=1; i < n; i++) { for(size_t j=0; j < i; j++) { size_t ij=n*i+j; size_t ji=n*j+i; double temp=a[ij]; a[ij]=a[ji]; a[ji]=temp; } } } // Invert an n x n array in place. void inverse(double *M, size_t n) { if(n == 2) { real a=M[0]; real b=M[1]; real c=M[2]; real d=M[3]; real det=a*d-b*c; if(det == 0.0) error(singular); det=1.0/det; M[0]=d*det; M[1]=-b*det; M[2]=-c*det; M[3]=a*det; return; } if(n == 3) { real a=M[0], b=M[1], c=M[2]; real d=M[3], e=M[4], f=M[5]; real g=M[6], h=M[7], i=M[8]; real A=e*i-f*h; real B=f*g-d*i; real C=d*h-e*g; real det=a*A+b*B+c*C; if(det == 0.0) error(singular); det=1.0/det; M[0]=A*det; M[1]=(c*h-b*i)*det; M[2]=(b*f-c*e)*det; M[3]=B*det; M[4]=(a*i-c*g)*det; M[5]=(c*d-a*f)*det; M[6]=C*det; M[7]=(b*g-a*h)*det; M[8]=(a*e-b*d)*det; return; } inverseAllocate(n); for(size_t i=0; i < n; i++) pivot[i]=0; size_t col=0, row=0; // This is the main loop over the columns to be reduced. for(size_t i=0; i < n; i++) { real big=0.0; // This is the outer loop of the search for a pivot element. for(size_t j=0; j < n; j++) { double *aj=M+n*j; if(pivot[j] != 1) { for(size_t k=0; k < n; k++) { if(pivot[k] == 0) { real temp=fabs(aj[k]); if(temp >= big) { big=temp; row=j; col=k; } } else if(pivot[k] > 1) { inverseDeallocate(); error(singular); } } } } ++(pivot[col]); // Interchange rows, if needed, to put the pivot element on the diagonal. double *acol=M+n*col; if(row != col) { double *arow=M+n*row; for(size_t k=0; k < n; k++) { real temp=arow[k]; arow[k]=acol[k]; acol[k]=temp; } } Row[i]=row; Col[i]=col; // Divide the pivot row by the pivot element. real denom=acol[col]; if(denom == 0.0) { inverseDeallocate(); error(singular); } real pivinv=1.0/denom; acol[col]=1.0; for(size_t k=0; k < n; k++) acol[k]=acol[k]*pivinv; // Reduce all rows except for the pivoted one. for(size_t k=0; k < n; k++) { if(k != col) { double *ak=M+n*k; real akcol=ak[col]; ak[col]=0.0; for(size_t j=0; j < n; j++) ak[j] -= acol[j]*akcol; } } } // Unscramble the inverse matrix in view of the column interchanges. for(size_t k=n; k > 0;) { k--; size_t r=Row[k]; size_t c=Col[k]; if(r != c) { for(size_t j=0; j < n; j++) { double *aj=M+n*j; real temp=aj[r]; aj[r]=aj[c]; aj[c]=temp; } } } inverseDeallocate(); } } callable *Func; stack *FuncStack; double wrapFunction(double x) { FuncStack->push(x); Func->call(FuncStack); return pop(FuncStack); } callable *compareFunc; bool compareFunction(const vm::item& i, const vm::item& j) { FuncStack->push(i); FuncStack->push(j); compareFunc->call(FuncStack); return pop(FuncStack); } // Crout's algorithm for computing the LU decomposition of a square matrix. // cf. routine ludcmp (Press et al., Numerical Recipes, 1991). Int LUdecompose(double *a, size_t n, size_t* index, bool warn=true) { double *vv=new double[n]; Int swap=1; for(size_t i=0; i < n; ++i) { double big=0.0; double *ai=a+i*n; for(size_t j=0; j < n; ++j) { double temp=fabs(ai[j]); if(temp > big) big=temp; } if(big == 0.0) { delete[] vv; if(warn) error(singular); else return 0; } vv[i]=1.0/big; } for(size_t j=0; j < n; ++j) { for(size_t i=0; i < j; ++i) { double *ai=a+i*n; double sum=ai[j]; for(size_t k=0; k < i; ++k) { sum -= ai[k]*a[k*n+j]; } ai[j]=sum; } double big=0.0; size_t imax=j; for(size_t i=j; i < n; ++i) { double *ai=a+i*n; double sum=ai[j]; for(size_t k=0; k < j; ++k) sum -= ai[k]*a[k*n+j]; ai[j]=sum; double temp=vv[i]*fabs(sum); if(temp >= big) { big=temp; imax=i; } } double *aj=a+j*n; double *aimax=a+imax*n; if(j != imax) { for(size_t k=0; k < n; ++k) { double temp=aimax[k]; aimax[k]=aj[k]; aj[k]=temp; } swap *= -1; vv[imax]=vv[j]; } if(index) index[j]=imax; if(j != n) { double denom=aj[j]; if(denom == 0.0) { delete[] vv; if(warn) error(singular); else return 0; } for(size_t i=j+1; i < n; ++i) a[i*n+j] /= denom; } } delete[] vv; return swap; } namespace run { void dividebyzero(size_t i) { ostringstream buf; if(i > 0) buf << "array element " << i << ": "; buf << "Divide by zero"; error(buf); } void integeroverflow(size_t i) { ostringstream buf; if(i > 0) buf << "array element " << i << ": "; buf << "Integer overflow"; error(buf); } } // Autogenerated routines: // Create an empty array. array* :emptyArray() { return new array(0); } // Create a new array (technically a vector). // This array will be multidimensional. First the number of dimensions // is popped off the stack, followed by each dimension in reverse order. // The array itself is technically a one dimensional array of one // dimension arrays and so on. array* :newDeepArray(Int depth) { assert(depth > 0); Int *dims = new Int[depth]; for (Int index = depth-1; index >= 0; index--) { Int i=pop(Stack); if(i < 0) error("cannot create a negative length array"); dims[index]=i; } array *a=deepArray(depth, dims); delete[] dims; return a; } // Creates an array with elements already specified. First, the number // of elements is popped off the stack, followed by each element in // reverse order. array* :newInitializedArray(Int n) { assert(n >= 0); array *a = new array(n); for (Int index = n-1; index >= 0; index--) (*a)[index] = pop(Stack); return a; } // Similar to newInitializedArray, but after the n elements, append another // array to it. array* :newAppendedArray(array* tail, Int n) { assert(n >= 0); array *a = new array(n); for (Int index = n-1; index >= 0; index--) (*a)[index] = pop(Stack); copy(tail->begin(), tail->end(), back_inserter(*a)); return a; } // Produce an array of n deep copies of value. // typeDepth is the true depth of the array determined at compile-time when the // operations for the array type are added. This typeDepth argument is // automatically pushed on the stack and is not visible to the user. array* :copyArrayValue(Int n, item value, Int depth=Int_MAX, Int typeDepth) { if(n < 0) error("cannot create a negative length array"); if(depth < 0) error("cannot copy to a negative depth"); if(depth > typeDepth) depth=typeDepth; return new array((size_t) n, value, depth); } // Deep copy of array. // typeDepth is the true depth of the array determined at compile-time when the // operations for the array type are added. This typeDepth argument is // automatically pushed on the stack and is not visible to the user. array* :copyArray(array *a, Int depth=Int_MAX, Int typeDepth) { if(a == 0) vm::error(dereferenceNullArray); if(depth < 0) error("cannot copy to a negative depth"); if(depth > typeDepth) depth=typeDepth; return a->copyToDepth(depth); } // Read an element from an array. Checks for initialization & bounds. item :arrayRead(array *a, Int n) { item& i=arrayRead(a,n); if (i.empty()) { ostringstream buf; buf << "read uninitialized value from array at index " << n; error(buf); } return i; } // Slice a substring from an array. item :arraySliceRead(array *a, Int left, Int right) { checkArray(a); return a->slice(left, right); } // Slice a substring from an array. This implements the cases a[i:] and a[:] // where the endpoint is not given, and assumed to be the length of the array. item :arraySliceReadToEnd(array *a, Int left) { size_t len=checkArray(a); return a->slice(left, (Int)len); } // Read an element from an array of arrays. Check bounds and initialize // as necessary. item :arrayArrayRead(array *a, Int n) { item& i=arrayRead(a,n); if (i.empty()) i=new array(0); return i; } // Write an element to an array. Increase size if necessary. // TODO: Add arrayWriteAndPop item :arrayWrite(array *a, Int n, item value) { size_t len=checkArray(a); bool cyclic=a->cyclic(); if(cyclic && len > 0) n=imod(n,len); else { if(cyclic) outOfBounds("writing cyclic",len,n); if(n < 0) outOfBounds("writing",len,n); if(len <= (size_t) n) a->resize(n+1); } (*a)[n] = value; return value; } array * :arraySliceWrite(array *dest, Int left, Int right, array *src) { checkArray(src); checkArray(dest); dest->setSlice(left, right, src); return src; } array * :arraySliceWriteToEnd(array *dest, Int left, array *src) { checkArray(src); size_t len=checkArray(dest); dest->setSlice(left, (Int) len, src); return src; } // Returns the length of an array. Int :arrayLength(array *a) { return (Int) checkArray(a); } // Returns an array of integers representing the keys of the array. array * :arrayKeys(array *a) { size_t size=checkArray(a); array *keys=new array(); for (size_t i=0; ipush((Int)i); } return keys; } // Return the cyclic flag for an array. bool :arrayCyclicFlag(array *a) { checkArray(a); return a->cyclic(); } bool :arraySetCyclicFlag(bool b, array *a) { checkArray(a); a->cyclic(b); return b; } // Check to see if an array element is initialized. bool :arrayInitializedHelper(Int n, array *a) { size_t len=checkArray(a); bool cyclic=a->cyclic(); if(cyclic && len > 0) n=imod(n,len); else if(n < 0 || n >= (Int) len) return false; item&i=(*a)[(unsigned) n]; return !i.empty(); } // Returns the initialize method for an array. callable* :arrayInitialized(array *a) { return new thunk(new bfunc(arrayInitializedHelper),a); } // The helper function for the cyclic method that sets the cyclic flag. void :arrayCyclicHelper(bool b, array *a) { checkArray(a); a->cyclic(b); } // Set the cyclic flag for an array. callable* :arrayCyclic(array *a) { return new thunk(new bfunc(arrayCyclicHelper),a); } // The helper function for the push method that does the actual operation. item :arrayPushHelper(item x, array *a) { checkArray(a); a->push(x); return x; } // Returns the push method for an array. callable* :arrayPush(array *a) { return new thunk(new bfunc(arrayPushHelper),a); } // The helper function for the append method that appends b to a. void :arrayAppendHelper(array *b, array *a) { checkArray(a); size_t size=checkArray(b); for(size_t i=0; i < size; i++) a->push((*b)[i]); } // Returns the append method for an array. callable* :arrayAppend(array *a) { return new thunk(new bfunc(arrayAppendHelper),a); } // The helper function for the pop method. item :arrayPopHelper(array *a) { size_t asize=checkArray(a); if(asize == 0) error("cannot pop element from empty array"); return a->pop(); } // Returns the pop method for an array. callable* :arrayPop(array *a) { return new thunk(new bfunc(arrayPopHelper),a); } // The helper function for the insert method. item :arrayInsertHelper(Int i, array *x, array *a) { size_t asize=checkArray(a); checkArray(x); if(a->cyclic() && asize > 0) i=imod(i,asize); if(i < 0 || i > (Int) asize) outOfBounds("inserting",asize,i); (*a).insert((*a).begin()+i,(*x).begin(),(*x).end()); } // Returns the insert method for an array. callable* :arrayInsert(array *a) { return new thunk(new bfunc(arrayInsertHelper),a); } // Returns the delete method for an array. callable* :arrayDelete(array *a) { return new thunk(new bfunc(arrayDeleteHelper),a); } bool :arrayAlias(array *a, array *b) { return a==b; } // Return array formed by indexing array a with elements of integer array b array* :arrayIntArray(array *a, array *b) { size_t asize=checkArray(a); size_t bsize=checkArray(b); array *r=new array(bsize); bool cyclic=a->cyclic(); for(size_t i=0; i < bsize; i++) { Int index=read(b,i); if(cyclic && asize > 0) index=imod(index,asize); else if(index < 0 || index >= (Int) asize) outOfBounds("reading",asize,index); (*r)[i]=(*a)[index]; } return r; } // returns the complement of the integer array a in {0,2,...,n-1}, // so that b[complement(a,b.length)] yields the complement of b[a]. Intarray* complement(Intarray *a, Int n) { size_t asize=checkArray(a); array *r=new array(0); bool *keep=new bool[n]; for(Int i=0; i < n; ++i) keep[i]=true; for(size_t i=0; i < asize; ++i) { Int j=read(a,i); if(j >= 0 && j < n) keep[j]=false; } for(Int i=0; i < n; i++) if(keep[i]) r->push(i); delete[] keep; return r; } // Generate the sequence {f(i) : i=0,1,...n-1} given a function f and integer n Intarray* :arraySequence(callable *f, Int n) { if(n < 0) n=0; array *a=new array(n); for(Int i=0; i < n; ++i) { Stack->push(i); f->call(Stack); (*a)[i]=pop(Stack); } return a; } // Return the array {0,1,...n-1} Intarray *sequence(Int n) { if(n < 0) n=0; array *a=new array(n); for(Int i=0; i < n; ++i) { (*a)[i]=i; } return a; } // Apply a function to each element of an array array* :arrayFunction(callable *f, array *a) { size_t size=checkArray(a); array *b=new array(size); for(size_t i=0; i < size; ++i) { Stack->push((*a)[i]); f->call(Stack); (*b)[i]=pop(Stack); } return b; } array* :arraySort(array *a, callable *less, bool stable=true) { array *c=copyArray(a); compareFunc=less; FuncStack=Stack; if(stable) stable_sort(c->begin(),c->end(),compareFunction); else sort(c->begin(),c->end(),compareFunction); return c; } Int :arraySearch(array *a, item key, callable *less) { size_t size=a->size(); compareFunc=less; FuncStack=Stack; if(size == 0 || compareFunction(key,(*a)[0])) return -1; size_t u=size-1; if(!compareFunction(key,(*a)[u])) return Intcast(u); size_t l=0; while (l < u) { size_t i=(l+u)/2; if(compareFunction(key,(*a)[i])) u=i; else if(compareFunction(key,(*a)[i+1])) return Intcast(i); else l=i+1; } return 0; } bool all(boolarray *a) { size_t size=checkArray(a); bool c=true; for(size_t i=0; i < size; i++) if(!get((*a)[i])) {c=false; break;} return c; } boolarray* !(boolarray* a) { size_t size=checkArray(a); array *c=new array(size); for(size_t i=0; i < size; i++) (*c)[i]=!read(a,i); return c; } Int sum(boolarray *a) { size_t size=checkArray(a); Int sum=0; for(size_t i=0; i < size; i++) sum += read(a,i) ? 1 : 0; return sum; } array* :arrayConcat(array *a) { // a is an array of arrays to be concatenated together. // The signature is // T[] concat(... T[][] a); size_t numArgs=checkArray(a); size_t resultSize=0; for (size_t i=0; i < numArgs; ++i) { resultSize += checkArray(a->read(i)); } array *result=new array(resultSize); size_t ri=0; for (size_t i=0; i < numArgs; ++i) { array *arg=a->read(i); size_t size=checkArray(arg); for (size_t j=0; j < size; ++j) { (*result)[ri]=(*arg)[j]; ++ri; } } return result; } array* :array2Transpose(array *a) { size_t asize=checkArray(a); array *c=new array(0); size_t csize=0; for(size_t i=0; i < asize; i++) { size_t ip=i+1; array *ai=read(a,i); size_t aisize=checkArray(ai); if(c->size() < aisize) { c->resize(aisize); for(size_t j=csize; j < aisize; j++) (*c)[j]=new array(0); csize=aisize; } for(size_t j=0; j < aisize; j++) { if(!(*ai)[j].empty()) { array *cj=read(c,j); if(checkArray(cj) < ip) cj->resize(ip); (*cj)[i]=(*ai)[j]; } } } return c; } // a is a rectangular 3D array; perm is an Int array indicating the type of // permutation (021 or 120, etc; original is 012). // Transpose by sending respective members to the permutated locations: // return the array obtained by putting a[i][j][k] into position perm{ijk}. array* :array3Transpose(array *a, array *perm) { const size_t DIM=3; if(checkArray(perm) != DIM) { ostringstream buf; buf << "permutation array must have length " << DIM; error(buf); } size_t* size=new size_t[DIM]; for(size_t i=0; i < DIM; ++i) size[i]=DIM; for(size_t i=0; i < DIM; ++i) { Int p=read(perm,i); size_t P=(size_t) p; if(p < 0 || P >= DIM) { ostringstream buf; buf << "permutation index out of range: " << p; error(buf); } size[P]=P; } for(size_t i=0; i < DIM; ++i) if(size[i] == DIM) error("permutation indices must be distinct"); static const char *rectangular= "3D transpose implemented for rectangular matrices only"; size_t isize=size[0]=checkArray(a); array *a0=read(a,0); size[1]=checkArray(a0); array *a00=read(a0,0); size[2]=checkArray(a00); for(size_t i=0; i < isize; i++) { array *ai=read(a,i); size_t jsize=checkArray(ai); if(jsize != size[1]) error(rectangular); for(size_t j=0; j < jsize; j++) { array *aij=read(ai,j); if(checkArray(aij) != size[2]) error(rectangular); } } size_t perm0=(size_t) read(perm,0); size_t perm1=(size_t) read(perm,1); size_t perm2=(size_t) read(perm,2); size_t sizep0=size[perm0]; size_t sizep1=size[perm1]; size_t sizep2=size[perm2]; array *c=new array(sizep0); for(size_t i=0; i < sizep0; ++i) { array *ci=new array(sizep1); (*c)[i]=ci; for(size_t j=0; j < sizep1; ++j) { array *cij=new array(sizep2); (*ci)[j]=cij; } } size_t* i=new size_t[DIM]; for(i[0]=0; i[0] < size[0]; ++i[0]) { array *a0=read(a,i[0]); for(i[1]=0; i[1] < size[1]; ++i[1]) { array *a1=read(a0,i[1]); for(i[2]=0; i[2] < size[2]; ++i[2]) { array *c0=read(c,i[perm0]); array *c1=read(c0,i[perm1]); (*c1)[i[perm2]]=read(a1,i[2]); } } } delete[] i; delete[] size; return c; } // Find the index of the nth true value in a boolean array or -1 if not found. // If n is negative, search backwards. Int find(boolarray *a, Int n=1) { size_t size=checkArray(a); Int j=-1; if(n > 0) for(size_t i=0; i < size; i++) if(read(a,i)) { n--; if(n == 0) {j=(Int) i; break;} } if(n < 0) for(size_t i=size; i > 0;) if(read(a,--i)) { n++; if(n == 0) {j=(Int) i; break;} } return j; } // Find all indices of true values in a boolean array. Intarray *findall(boolarray *a) { size_t size=checkArray(a); array *b=new array(0); for(size_t i=0; i < size; i++) { if(read(a,i)) { b->push((Int) i); } } return b; } // construct vector obtained by replacing those elements of b for which the // corresponding elements of a are false by the corresponding element of c. array* :arrayConditional(array *a, array *b, array *c) { size_t size=checkArray(a); array *r=new array(size); if(b && c) { checkArrays(a,b); checkArrays(b,c); for(size_t i=0; i < size; i++) (*r)[i]=read(a,i) ? (*b)[i] : (*c)[i]; } else { r->clear(); if(b) { checkArrays(a,b); for(size_t i=0; i < size; i++) if(read(a,i)) r->push((*b)[i]); } else if(c) { checkArrays(a,c); for(size_t i=0; i < size; i++) if(!read(a,i)) r->push((*c)[i]); } } return r; } // Return an n x n identity matrix. realarray2 *identity(Int n) { return Identity(n); } // Return the inverse of an n x n matrix a using Gauss-Jordan elimination. realarray2 *inverse(realarray2 *a) { size_t n=checkArray(a); double *A; copyArray2C(A,a,true,0,NoGC); inverse(A,n); a=copyCArray2(n,n,A); delete[] A; return a; } // Solve the linear equation ax=b by LU decomposition, returning the // solution x, where a is an n x n matrix and b is an array of length n. // If no solution exists, return an empty array. realarray *solve(realarray2 *a, realarray *b, bool warn=true) { size_t n=checkArray(a); if(n == 0) return new array(0); size_t m=checkArray(b); if(m != n) error(incommensurate); real *A; copyArray2C(A,a); size_t *index=new size_t[n]; if(LUdecompose(A,n,index,warn) == 0) return new array(0); array *x=new array(n); real *B; copyArrayC(B,b); for(size_t i=0; i < n; ++i) { size_t ip=index[i]; real sum=B[ip]; B[ip]=B[i]; real *Ai=A+i*n; for(size_t j=0; j < i; ++j) sum -= Ai[j]*B[j]; B[i]=sum; } for(size_t i=n; i > 0;) { --i; real sum=B[i]; real *Ai=A+i*n; for(size_t j=i+1; j < n; ++j) sum -= Ai[j]*B[j]; B[i]=sum/Ai[i]; } for(size_t i=0; i < n; ++i) (*x)[i]=B[i]; delete[] index; delete[] B; delete[] A; return x; } // Solve the linear equation ax=b by LU decomposition, returning the // solution x, where a is an n x n matrix and b is an n x m matrix. // If no solution exists, return an empty array. realarray2 *solve(realarray2 *a, realarray2 *b, bool warn=true) { size_t n=checkArray(a); if(n == 0) return new array(0); if(checkArray(b) != n) error(incommensurate); size_t m=checkArray(read(b,0)); real *A,*B; copyArray2C(A,a); copyArray2C(B,b,false); size_t *index=new size_t[n]; if(LUdecompose(A,n,index,warn) == 0) return new array(0); array *x=new array(n); for(size_t i=0; i < n; ++i) { real *Ai=A+i*n; real *Bi=B+i*m; real *Bip=B+index[i]*m; for(size_t k=0; k < m; ++k) { real sum=Bip[k]; Bip[k]=Bi[k]; size_t jk=k; for(size_t j=0; j < i; ++j, jk += m) sum -= Ai[j]*B[jk]; Bi[k]=sum; } } for(size_t i=n; i > 0;) { --i; real *Ai=A+i*n; real *Bi=B+i*m; for(size_t k=0; k < m; ++k) { real sum=Bi[k]; size_t jk=(i+1)*m+k; for(size_t j=i+1; j < n; ++j, jk += m) sum -= Ai[j]*B[jk]; Bi[k]=sum/Ai[i]; } } for(size_t i=0; i < n; ++i) { real *Bi=B+i*m; array *xi=new array(m); (*x)[i]=xi; for(size_t j=0; j < m; ++j) (*xi)[j]=Bi[j]; } delete[] index; delete[] B; delete[] A; return x; } // Compute the determinant of an n x n matrix. real determinant(realarray2 *a) { real *A; copyArray2C(A,a); size_t n=checkArray(a); real det=LUdecompose(A,n,NULL,false); size_t n1=n+1; for(size_t i=0; i < n; ++i) det *= A[i*n1]; delete[] A; return det; } realarray *Operator *(realarray2 *a, realarray *b) { size_t n=checkArray(a); size_t m=checkArray(b); array *c=new array(n); real *B; copyArrayC(B,b); for(size_t i=0; i < n; ++i) { array *ai=read(a,i); if(checkArray(ai) != m) error(incommensurate); real sum=0.0; for(size_t j=0; j < m; ++j) sum += read(ai,j)*B[j]; (*c)[i]=sum; } delete[] B; return c; } realarray *Operator *(realarray *a, realarray2 *b) { size_t n=checkArray(a); if(n != checkArray(b)) error(incommensurate); real *A; copyArrayC(A,a); array **B=new array*[n]; array *bk=read(b,0); B[0]=bk; size_t m=bk->size(); for(size_t k=1; k < n; k++) { array *bk=read(b,k); if(bk->size() != m) error(incommensurate); B[k]=bk; } array *c=new array(m); for(size_t i=0; i < m; ++i) { real sum=0.0; for(size_t k=0; k < n; ++k) sum += A[k]*read(B[k],i); (*c)[i]=sum; } delete[] B; delete[] A; return c; } Intarray2 *Operator *(Intarray2 *a, Intarray2 *b) { return mult(a,b); } realarray2 *Operator *(realarray2 *a, realarray2 *b) { return mult(a,b); } pairarray2 *Operator *(pairarray2 *a, pairarray2 *b) { return mult(a,b); } triple Operator *(realarray2 *t, triple v) { return *t*v; } realarray2 *AtA(realarray2 *a) { return AtA(a); } pair project(triple v, realarray2 *t) { size_t n=checkArray(t); if(n != 4) error(incommensurate); array *t0=read(t,0); array *t1=read(t,1); array *t3=read(t,3); if(checkArray(t0) != 4 || checkArray(t1) != 4 || checkArray(t3) != 4) error(incommensurate); real x=v.getx(); real y=v.gety(); real z=v.getz(); real f=read(t3,0)*x+read(t3,1)*y+read(t3,2)*z+ read(t3,3); if(f == 0.0) dividebyzero(); f=1.0/f; return pair((read(t0,0)*x+read(t0,1)*y+read(t0,2)*z+ read(t0,3))*f, (read(t1,0)*x+read(t1,1)*y+read(t1,2)*z+ read(t1,3))*f); } // Compute the dot product of vectors a and b. real dot(realarray *a, realarray *b) { size_t n=checkArrays(a,b); real sum=0.0; for(size_t i=0; i < n; ++i) sum += read(a,i)*read(b,i); return sum; } // Compute the complex dot product of vectors a and b. pair dot(pairarray *a, pairarray *b) { size_t n=checkArrays(a,b); pair sum=zero; for(size_t i=0; i < n; ++i) sum += read(a,i)*conj(read(b,i)); return sum; } // Solve the problem L\inv f, where f is an n vector and L is the n x n matrix // // [ b[0] c[0] a[0] ] // [ a[1] b[1] c[1] ] // [ a[2] b[2] c[2] ] // [ ... ] // [ c[n-1] a[n-1] b[n-1] ] realarray *tridiagonal(realarray *a, realarray *b, realarray *c, realarray *f) { size_t n=checkArrays(a,b); checkEqual(n,checkArray(c)); checkEqual(n,checkArray(f)); array *up=new array(n); array& u=*up; if(n == 0) return up; // Special case: zero Dirichlet boundary conditions if(read(a,0) == 0.0 && read(c,n-1) == 0.0) { real temp=read(b,0); if(temp == 0.0) dividebyzero(); temp=1.0/temp; real *work=new real[n]; u[0]=read(f,0)*temp; work[0]=-read(c,0)*temp; for(size_t i=1; i < n; i++) { real temp=(read(b,i)+read(a,i)*work[i-1]); if(temp == 0.0) {delete[] work; dividebyzero();} temp=1.0/temp; u[i]=(read(f,i)-read(a,i)*read(u,i-1))*temp; work[i]=-read(c,i)*temp; } for(size_t i=n-1; i >= 1; i--) u[i-1]=read(u,i-1)+work[i-1]*read(u,i); delete[] work; return up; } real binv=read(b,0); if(binv == 0.0) dividebyzero(); binv=1.0/binv; if(n == 1) {u[0]=read(f,0)*binv; return up;} if(n == 2) { real factor=(read(b,0)*read(b,1)- read(a,0)*read(c,1)); if(factor== 0.0) dividebyzero(); factor=1.0/factor; real temp=(read(b,0)*read(f,1)- read(c,1)*read(f,0))*factor; u[0]=(read(b,1)*read(f,0)- read(a,0)*read(f,1))*factor; u[1]=temp; return up; } real *gamma=new real[n-2]; real *delta=new real[n-2]; gamma[0]=read(c,0)*binv; delta[0]=read(a,0)*binv; u[0]=read(f,0)*binv; real beta=read(c,n-1); real fn=read(f,n-1)-beta*read(u,0); real alpha=read(b,n-1)-beta*delta[0]; for(size_t i=1; i <= n-3; i++) { real alphainv=read(b,i)-read(a,i)*gamma[i-1]; if(alphainv == 0.0) {delete[] gamma; delete[] delta; dividebyzero();} alphainv=1.0/alphainv; beta *= -gamma[i-1]; gamma[i]=read(c,i)*alphainv; u[i]=(read(f,i)-read(a,i)*read(u,i-1))*alphainv; fn -= beta*read(u,i); delta[i]=-read(a,i)*delta[i-1]*alphainv; alpha -= beta*delta[i]; } real alphainv=read(b,n-2)-read(a,n-2)*gamma[n-3]; if(alphainv == 0.0) {delete[] gamma; delete[] delta; dividebyzero();} alphainv=1.0/alphainv; u[n-2]=(read(f,n-2)-read(a,n-2)*read(u,n-3)) *alphainv; beta=read(a,n-1)-beta*gamma[n-3]; real dnm1=(read(c,n-2)-read(a,n-2)*delta[n-3])*alphainv; real temp=alpha-beta*dnm1; if(temp == 0.0) {delete[] gamma; delete[] delta; dividebyzero();} u[n-1]=temp=(fn-beta*read(u,n-2))/temp; u[n-2]=read(u,n-2)-dnm1*temp; for(size_t i=n-2; i >= 1; i--) u[i-1]=read(u,i-1)-gamma[i-1]*read(u,i)-delta[i-1]*temp; delete[] delta; delete[] gamma; return up; } // Root solve by Newton-Raphson real newton(Int iterations=100, callableReal *f, callableReal *fprime, real x, bool verbose=false) { static const real fuzz=1000.0*DBL_EPSILON; Int i=0; size_t oldPrec=0; if(verbose) oldPrec=cout.precision(DBL_DIG); real diff=DBL_MAX; real lastdiff; do { real x0=x; Stack->push(x); fprime->call(Stack); real dfdx=pop(Stack); if(dfdx == 0.0) { x=DBL_MAX; break; } Stack->push(x); f->call(Stack); real fx=pop(Stack); x -= fx/dfdx; lastdiff=diff; if(verbose) cout << "Newton-Raphson: " << x << endl; diff=fabs(x-x0); if(++i == iterations) { x=DBL_MAX; break; } } while (diff != 0.0 && (diff < lastdiff || diff > fuzz*fabs(x))); if(verbose) cout.precision(oldPrec); return x; } // Root solve by Newton-Raphson bisection // cf. routine rtsafe (Press et al., Numerical Recipes, 1991). real newton(Int iterations=100, callableReal *f, callableReal *fprime, real x1, real x2, bool verbose=false) { static const real fuzz=1000.0*DBL_EPSILON; size_t oldPrec=0; if(verbose) oldPrec=cout.precision(DBL_DIG); Stack->push(x1); f->call(Stack); real f1=pop(Stack); if(f1 == 0.0) return x1; Stack->push(x2); f->call(Stack); real f2=pop(Stack); if(f2 == 0.0) return x2; if((f1 > 0.0 && f2 > 0.0) || (f1 < 0.0 && f2 < 0.0)) { ostringstream buf; buf << "root not bracketed, f(x1)=" << f1 << ", f(x2)=" << f2 << endl; error(buf); } real x=0.5*(x1+x2); real dxold=fabs(x2-x1); if(f1 > 0.0) { real temp=x1; x1=x2; x2=temp; } if(verbose) cout << "midpoint: " << x << endl; real dx=dxold; Stack->push(x); f->call(Stack); real y=pop(Stack); Stack->push(x); fprime->call(Stack); real dy=pop(Stack); Int j; for(j=0; j < iterations; j++) { if(((x-x2)*dy-y)*((x-x1)*dy-y) >= 0.0 || fabs(2.0*y) > fabs(dxold*dy)) { dxold=dx; dx=0.5*(x2-x1); x=x1+dx; if(verbose) cout << "bisection: " << x << endl; if(x1 == x) return x; } else { dxold=dx; dx=y/dy; real temp=x; x -= dx; if(verbose) cout << "Newton-Raphson: " << x << endl; if(temp == x) return x; } if(fabs(dx) < fuzz*fabs(x)) return x; Stack->push(x); f->call(Stack); y=pop(Stack); Stack->push(x); fprime->call(Stack); dy=pop(Stack); if(y < 0.0) x1=x; else x2=x; } if(verbose) cout.precision(oldPrec); return (j == iterations) ? DBL_MAX : x; } // Find a root for the specified continuous (but not necessarily // differentiable) function. Whatever value t is returned, it is guaranteed // that t is within [a, b] and within tolerance of a sign change. // An error is thrown if fa and fb are both positive or both negative. // // In this implementation, the binary search is interleaved // with a modified version of quadratic interpolation. // This is a C++ port of the Asymptote routine written by Charles Staats III. real _findroot(callableReal *f, real a, real b, real tolerance, real fa, real fb) { if(fa == 0.0) return a; if(fb == 0.0) return b; const char* oppsign="fa and fb must have opposite signs"; int sign; if(fa < 0.0) { if(fb < 0.0) error(oppsign); sign=1; } else { if(fb > 0.0) error(oppsign); fa=-fa; fb=-fb; sign=-1; } real t=a; real ft=fa; real twicetolerance=2.0*tolerance; while(b-a > tolerance) { t=(a+b)*0.5; Stack->push(t); f->call(Stack); ft=sign*pop(Stack); if(ft == 0.0) return t; // If halving the interval already puts us within tolerance, // don't bother with the interpolation step. if(b-a >= twicetolerance) { real factor=1.0/(b-a); real q_A=2.0*(fa-2.0*ft+fb)*factor*factor; real q_B=(fb-fa)*factor; quadraticroots Q=quadraticroots(q_A,q_B,ft); // If the interpolation somehow failed, continue on to the next binary // search step. This may or may not be possible, depending on what // theoretical guarantees are provided by the quadraticroots function. real root; bool found=Q.roots > 0; if(found) { root=t+Q.t1; if(root <= a || root >= b) { if(Q.roots == 1) found=false; else { root=t+Q.t2; if(root <= a || root >= b) found=false; } } } if(found) { if(ft > 0.0) { b=t; fb=ft; } else { a=t; fa=ft; } t=root; // If the interpolated value is close to one edge of // the interval, move it farther away from the edge in // an effort to catch the root in the middle. real margin=(b-a)*1.0e-3; if(t-a < margin) t=a+2.0*(t-a); else if(b-t < margin) t=b-2.0*(b-t); Stack->push(t); f->call(Stack); ft=sign*pop(Stack); if(ft == 0.0) return t; } } if(ft > 0.0) { b=t; fb=ft; } else if(ft < 0.0) { a=t; fa=ft; } } return a-(b-a)/(fb-fa)*fa; } real simpson(callableReal *f, real a, real b, real acc=DBL_EPSILON, real dxmax=0) { real integral; if(dxmax <= 0) dxmax=fabs(b-a); callable *oldFunc=Func; Func=f; FuncStack=Stack; if(!simpson(integral,wrapFunction,a,b,acc,dxmax)) error("nesting capacity exceeded in simpson"); Func=oldFunc; return integral; } // Compute the fast Fourier transform of a pair array pairarray* fft(pairarray *a, Int sign=1) { #ifdef HAVE_LIBFFTW3 unsigned n=(unsigned) checkArray(a); array *c=new array(n); if(n) { Complex *f=utils::ComplexAlign(n); fftwpp::fft1d Forward(n,intcast(sign),f); for(size_t i=0; i < n; i++) { pair z=read(a,i); f[i]=Complex(z.getx(),z.gety()); } Forward.fft(f); for(size_t i=0; i < n; i++) { Complex z=f[i]; (*c)[i]=pair(z.real(),z.imag()); } utils::deleteAlign(f); } #else unused(a); unused(&sign); array *c=new array(0); error(installFFTW); #endif // HAVE_LIBFFTW3 return c; } // Compute the fast Fourier transform of a 2D pair array pairarray2* fft(pairarray2 *a, Int sign=1) { #ifdef HAVE_LIBFFTW3 size_t n=checkArray(a); size_t m=n == 0 ? 0 : checkArray(read(a,0)); array *c=new array(n); Complex *f=utils::ComplexAlign(n*m); fftwpp::fft2d Forward(n,m,intcast(sign),f); if(n) { for(size_t i=0; i < n; ++i) { array *ai=read(a,i); size_t aisize=checkArray(ai); if(aisize != m) error(rectangular); Complex *fi=f+m*i; for(size_t j=0; j < m; ++j) { pair z=read(ai,j); fi[j]=Complex(z.getx(),z.gety()); } } Forward.fft(f); for(size_t i=0; i < n; ++i) { array *ci=new array(m); (*c)[i]=ci; Complex *fi=f+m*i; for(size_t j=0; j < m; ++j) { Complex z=fi[j]; (*ci)[j]=pair(z.real(),z.imag()); } } utils::deleteAlign(f); } #else unused(a); unused(&sign); array *c=new array(0); error(installFFTW); #endif // HAVE_LIBFFTW3 return c; } // Compute the fast Fourier transform of a 3D pair array pairarray3* fft(pairarray3 *a, Int sign=1) { #ifdef HAVE_LIBFFTW3 size_t n=checkArray(a); array *a0=read(a,0); size_t m=n == 0 ? 0 : checkArray(a0); size_t l=m == 0 ? 0 : checkArray(read(a0,0)); array *c=new array(n); Complex *f=utils::ComplexAlign(n*m*l); fftwpp::fft3d Forward(n,m,l,intcast(sign),f); if(n) { for(size_t i=0; i < n; ++i) { array *ai=read(a,i); size_t aisize=checkArray(ai); if(aisize != m) error(rectangular); Complex *fi=f+m*l*i; for(size_t j=0; j < m; ++j) { array *aij=read(ai,j); size_t aijsize=checkArray(aij); if(aijsize != l) error(rectangular); Complex *fij=fi+l*j; for(size_t k=0; k < l; ++k) { pair z=read(aij,k); fij[k]=Complex(z.getx(),z.gety()); } } } Forward.fft(f); for(size_t i=0; i < n; ++i) { array *ci=new array(m); (*c)[i]=ci; Complex *fi=f+m*l*i; for(size_t j=0; j < m; ++j) { array *cij=new array(l); (*ci)[j]=cij; Complex *fij=fi+l*j; for(size_t k=0; k < l; ++k) { Complex z=fij[k]; (*cij)[k]=pair(z.real(),z.imag()); } } } utils::deleteAlign(f); } #else unused(a); unused(&sign); array *c=new array(0); error(installFFTW); #endif // HAVE_LIBFFTW3 return c; } // Compute the real Schur decomposition of a 2D pair array realarray3* _schur(realarray2 *a) { #ifdef HAVE_EIGEN_DENSE size_t n=checkArray(a); MatrixXd A(n,n); RealSchur schur(n); array *S=new array(2); if(n) { for(size_t i=0; i < n; ++i) { array *ai=read(a,i); size_t aisize=checkArray(ai); if(aisize != n) error(square); for(size_t j=0; j < n; ++j) A(i,j)=read(ai,j); } schur.compute(A); MatrixXd U=schur.matrixU(); MatrixXd T=schur.matrixT(); array *u=new array(n); array *t=new array(n); (*S)[0]=u; (*S)[1]=t; for(size_t i=0; i < n; ++i) { array *ui=new array(n); array *ti=new array(n); (*u)[i]=ui; (*t)[i]=ti; for(size_t j=0; j < n; ++j) { (*ui)[j]=U(i,j); (*ti)[j]=T(i,j); } } } #else unused(a); array *S=new array(0); error(installEIGEN); #endif // HAVE_EIGEN_DENSE return S; } // Compute the Schur decomposition of a 2D pair array pairarray3* _schur(pairarray2 *a) { #ifdef HAVE_EIGEN_DENSE size_t n=checkArray(a); MatrixXcd A(n,n); ComplexSchur schur(n); array *S=new array(2); if(n) { for(size_t i=0; i < n; ++i) { array *ai=read(a,i); size_t aisize=checkArray(ai); if(aisize != n) error(square); for(size_t j=0; j < n; ++j) { pair z=read(ai,j); A(i,j)=Complex(z.getx(),z.gety()); } } schur.compute(A); MatrixXcd U=schur.matrixU(); MatrixXcd T=schur.matrixT(); array *u=new array(n); array *t=new array(n); (*S)[0]=u; (*S)[1]=t; for(size_t i=0; i < n; ++i) { array *ui=new array(n); array *ti=new array(n); (*u)[i]=ui; (*t)[i]=ti; for(size_t j=0; j < n; ++j) { Complex z=U(i,j); Complex w=T(i,j); (*ui)[j]=pair(z.real(),z.imag()); (*ti)[j]=pair(w.real(),w.imag()); } } } #else unused(a); array *S=new array(0); error(installEIGEN); #endif // HAVE_EIGEN_DENSE return S; } Intarray2 *triangulate(pairarray *z) { size_t nv=checkArray(z); // Call robust version of Gilles Dumoulin's port of Paul Bourke's // triangulation code. XYZ *pxyz=new XYZ[nv+3]; ITRIANGLE *V=new ITRIANGLE[4*nv]; for(size_t i=0; i < nv; ++i) { pair w=read(z,i); pxyz[i].p[0]=w.getx(); pxyz[i].p[1]=w.gety(); pxyz[i].i=(Int) i; } Int ntri; Triangulate((Int) nv,pxyz,V,ntri,true,false); size_t nt=(size_t) ntri; array *t=new array(nt); for(size_t i=0; i < nt; ++i) { array *ti=new array(3); (*t)[i]=ti; ITRIANGLE *Vi=V+i; (*ti)[0]=pxyz[Vi->p1].i; (*ti)[1]=pxyz[Vi->p2].i; (*ti)[2]=pxyz[Vi->p3].i; } delete[] V; delete[] pxyz; return t; } real norm(realarray *a) { size_t n=checkArray(a); real M=0.0; for(size_t i=0; i < n; ++i) { real x=fabs(vm::read(a,i)); if(x > M) M=x; } return M; } real norm(realarray2 *a) { size_t n=checkArray(a); real M=0.0; for(size_t i=0; i < n; ++i) { vm::array *ai=vm::read(a,i); size_t m=checkArray(ai); for(size_t j=0; j < m; ++j) { real a=fabs(vm::read(ai,j)); if(a > M) M=a; } } return M; } real norm(triplearray2 *a) { size_t n=checkArray(a); real M=0.0; for(size_t i=0; i < n; ++i) { vm::array *ai=vm::read(a,i); size_t m=checkArray(ai); for(size_t j=0; j < m; ++j) { real a=vm::read(ai,j).abs2(); if(a > M) M=a; } } return sqrt(M); } real change2(triplearray2 *a) { size_t n=checkArray(a); if(n == 0) return 0.0; vm::array *a0=vm::read(a,0); size_t m=checkArray(a0); if(m == 0) return 0.0; triple a00=vm::read(a0,0); real M=0.0; for(size_t i=0; i < n; ++i) { vm::array *ai=vm::read(a,i); size_t m=checkArray(ai); for(size_t j=0; j < m; ++j) { real a=(vm::read(ai,j)-a00).abs2(); if(a > M) M=a; } } return M; } triple minbezier(triplearray2 *P, triple b) { size_t N; real *A=copyTripleArray2Components(P,N); bound_double *B=bounddouble(N); b=triple(B(A,::min,b.getx(),Fuzz*norm(A,N),maxdepth), B(A+N,::min,b.gety(),Fuzz*norm(A+N,N),maxdepth), B(A+2*N,::min,b.getz(),Fuzz*norm(A+2*N,N),maxdepth)); delete[] A; return b; } triple maxbezier(triplearray2 *P, triple b) { size_t N; real *A=copyTripleArray2Components(P,N); bound_double *B=bounddouble(N); b=triple(B(A,::max,b.getx(),Fuzz*norm(A,N),maxdepth), B(A+N,::max,b.gety(),Fuzz*norm(A+N,N),maxdepth), B(A+2*N,::max,b.getz(),Fuzz*norm(A+2*N,N),maxdepth)); delete[] A; return b; } pair minratio(triplearray2 *P, pair b) { size_t N; triple *A=copyTripleArray2C(P,N); real fuzz=Fuzz*norm(A,N); bound_triple *B=boundtriple(N); b=pair(B(A,::min,xratio,b.getx(),fuzz,maxdepth), B(A,::min,yratio,b.gety(),fuzz,maxdepth)); delete[] A; return b; } pair maxratio(triplearray2 *P, pair b) { size_t N; triple *A=copyTripleArray2C(P,N); bound_triple *B=boundtriple(N); real fuzz=Fuzz*norm(A,N); b=pair(B(A,::max,xratio,b.getx(),fuzz,maxdepth), B(A,::max,yratio,b.gety(),fuzz,maxdepth)); delete[] A; return b; } realarray *_projection() { #ifdef HAVE_GL array *a=new array(14); gl::projection P=gl::camera(); size_t k=0; (*a)[k++]=P.orthographic ? 1.0 : 0.0; triple camera=P.camera; (*a)[k++]=camera.getx(); (*a)[k++]=camera.gety(); (*a)[k++]=camera.getz(); triple up=P.up; (*a)[k++]=up.getx(); (*a)[k++]=up.gety(); (*a)[k++]=up.getz(); triple target=P.target; (*a)[k++]=target.getx(); (*a)[k++]=target.gety(); (*a)[k++]=target.getz(); (*a)[k++]=P.zoom; (*a)[k++]=P.angle; (*a)[k++]=P.viewportshift.getx(); (*a)[k++]=P.viewportshift.gety(); #endif return new array(0); } asymptote-3.05/windows/0000755000000000000000000000000015031566105013660 5ustar rootrootasymptote-3.05/windows/asy.ico0000644000000000000000000001027615031566105015156 0ustar rootroot  ¨( @ ÿEÿoÿ3ÿ ÿÿfÿ;ÿEÿüÿÿÿÿÿóÿÂÿÿ>ÿÿ¬ÿÿÿüÿ5ÿfÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿ§ÿRÿ ÿÊÿÿÿÿÿtÿÿ¬ÿîÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéÿÿ)ÿÊÿÿÿÿÿwÿ$ÿiÿ¦ÿâÿþÿÿÿÿÿÿÿÿÿÿÿýÿ¤ÿ)ÿÊÿÿÿÿÿwÿ2ÿ…ÿÖÿÿÿÿÿÿÿÿÿÿÿúÿ”ÿÿÊÿÿÿÿÿwÿÿ5ÿ›ÿ÷ÿÿÿÿÿÿÿÿÿåÿQÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿÑÿÿÿÿÿwÿÿ™ÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwÿÿ¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwÿeÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwÿ8ÿìÿÿÿÿÿÿÿ‘ÿÿÿÿÐÿÿÿÿÿwÿ2ÿìÿÿÿÿÿøÿ>ÿÊÿÿÿÿÿwÿ8ÿúÿÿÿÿÿåÿ ÿÊÿÿÿÿÿwÿoÿÿÿÿÿÿÿ‹ÿÊÿÿÿÿÿwÿ¹ÿÿÿÿÿúÿ)ÿÊÿÿÿÿÿwÿ'ÿøÿÿÿÿÿ¤ÿÊÿÿÿÿÿwÿ™ÿÿÿÿÿýÿàÿÿÿÿÿwÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿwÿ¥ÿÿÿÿÿÿÿÿÿÿÿwÿ?ÿÿÿÿÿÿÿÿÿÿÿwÿÿÛÿÿÿÿÿÿÿÿÿwÿ…ÿÿÿÿÿÿÿÿÿwÿ=ÿÿÿÿÿÿÿÿÿwÿÿîÿÿÿÿÿÿÿwÿ¯ÿÿÿÿÿÿÿwÿsÿÿÿÿÿÿÿwÿ7ÿÿÿÿÿÿÿwÿÿøÿÿÿÿÿtÿ¬ÿÿÿüÿ,ÿ ÿFÿ,ÿÿÿÿÿÿÿÿçÿÿ÷Àÿóøÿóÿƒÿóÿàÿóÿü?óÿÿÿÿ€ÿÿàÿÿñóÿÿùóÿÿüóÿÿüsÿÿþsÿÿÿ3ÿÿÿ3ÿÿÿƒÿÿÿƒÿÿÿƒÿÿÿÃÿÿÿÃÿÿÿÃÿÿÿãÿÿÿãÿÿÿãÿÿÿãÿÿÿóÿÿÿ÷ÿÿÿÿÿÿÿÿasymptote-3.05/windows/EnvVarUpdate.nsh0000644000000000000000000002410115031566105016734 0ustar rootroot/** * EnvVarUpdate.nsh * : Environmental Variables: append, prepend, and remove entries * * WARNING: If you use StrFunc.nsh header then include it before this file * with all required definitions. This is to avoid conflicts * * Usage: * ${EnvVarUpdate} "ResultVar" "EnvVarName" "Action" "RegLoc" "PathString" * * Credits: * Version 1.0 * * Cal Turney (turnec2) * * Amir Szekely (KiCHiK) and e-circ for developing the forerunners of this * function: AddToPath, un.RemoveFromPath, AddToEnvVar, un.RemoveFromEnvVar, * WriteEnvStr, and un.DeleteEnvStr * * Diego Pedroso (deguix) for StrTok * * Kevin English (kenglish_hi) for StrContains * * Hendri Adriaens (Smile2Me), Diego Pedroso (deguix), and Dan Fuhry * (dandaman32) for StrReplace * * Version 1.1 (compatibility with StrFunc.nsh) * * techtonik * * http://nsis.sourceforge.net/Environmental_Variables:_append%2C_prepend%2C_and_remove_entries * */ !ifndef ENVVARUPDATE_FUNCTION !define ENVVARUPDATE_FUNCTION !verbose push !verbose 3 !include "LogicLib.nsh" !include "WinMessages.NSH" !include "StrFunc.nsh" ; ---- Fix for conflict if StrFunc.nsh is already includes in main file ----------------------- !macro _IncludeStrFunction StrFuncName !ifndef ${StrFuncName}_INCLUDED ${${StrFuncName}} !endif !ifndef Un${StrFuncName}_INCLUDED ${Un${StrFuncName}} !endif !define un.${StrFuncName} "${Un${StrFuncName}}" !macroend !insertmacro _IncludeStrFunction StrTok !insertmacro _IncludeStrFunction StrStr !insertmacro _IncludeStrFunction StrRep ; ---------------------------------- Macro Definitions ---------------------------------------- !macro _EnvVarUpdateConstructor ResultVar EnvVarName Action Regloc PathString Push "${EnvVarName}" Push "${Action}" Push "${RegLoc}" Push "${PathString}" Call EnvVarUpdate Pop "${ResultVar}" !macroend !define EnvVarUpdate '!insertmacro "_EnvVarUpdateConstructor"' !macro _unEnvVarUpdateConstructor ResultVar EnvVarName Action Regloc PathString Push "${EnvVarName}" Push "${Action}" Push "${RegLoc}" Push "${PathString}" Call un.EnvVarUpdate Pop "${ResultVar}" !macroend !define un.EnvVarUpdate '!insertmacro "_unEnvVarUpdateConstructor"' ; ---------------------------------- Macro Definitions end------------------------------------- ;----------------------------------- EnvVarUpdate start---------------------------------------- !define hklm_all_users 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' !define hkcu_current_user 'HKCU "Environment"' !macro EnvVarUpdate UN Function ${UN}EnvVarUpdate Push $0 Exch 4 Exch $1 Exch 3 Exch $2 Exch 2 Exch $3 Exch Exch $4 Push $5 Push $6 Push $7 Push $8 Push $9 Push $R0 /* After this point: ------------------------- $0 = ResultVar (returned) $1 = EnvVarName (input) $2 = Action (input) $3 = RegLoc (input) $4 = PathString (input) $5 = Orig EnvVar (read from registry) $6 = Len of $0 (temp) $7 = tempstr1 (temp) $8 = Entry counter (temp) $9 = tempstr2 (temp) $R0 = tempChar (temp) */ ; Step 1: Read contents of EnvVarName from RegLoc ; ; Check for empty EnvVarName ${If} $1 == "" SetErrors DetailPrint "ERROR: EnvVarName is blank" Goto EnvVarUpdate_Restore_Vars ${EndIf} ; Check for valid Action ${If} $2 != "A" ${AndIf} $2 != "P" ${AndIf} $2 != "R" SetErrors DetailPrint "ERROR: Invalid Action - must be A, P, or R" Goto EnvVarUpdate_Restore_Vars ${EndIf} ${If} $3 == HKLM ReadRegStr $5 ${hklm_all_users} $1 ; Get EnvVarName from all users into $5 ${ElseIf} $3 == HKCU ReadRegStr $5 ${hkcu_current_user} $1 ; Read EnvVarName from current user into $5 ${Else} SetErrors DetailPrint 'ERROR: Action is [$3] but must be "HKLM" or HKCU"' Goto EnvVarUpdate_Restore_Vars ${EndIf} ; Check for empty PathString ${If} $4 == "" SetErrors DetailPrint "ERROR: PathString is blank" Goto EnvVarUpdate_Restore_Vars ${EndIf} ; Make sure we've got some work to do ${If} $5 == "" ${AndIf} $2 == "R" SetErrors DetailPrint "$1 is empty - Nothing to remove" Goto EnvVarUpdate_Restore_Vars ${EndIf} ; Step 2: Scrub EnvVar ; StrCpy $0 $5 ; Copy the contents to $0 ; Remove spaces around semicolons (NOTE: spaces before the 1st entry or ; after the last one are not removed here but instead in Step 3) ${If} $0 != "" ; If EnvVar is not empty ... ${Do} ${${UN}StrStr} $7 $0 " ;" ${If} $7 == "" ${ExitDo} ${EndIf} ${${UN}StrRep} $0 $0 " ;" ";" ; Remove ';' ${Loop} ${Do} ${${UN}StrStr} $7 $0 "; " ${If} $7 == "" ${ExitDo} ${EndIf} ${${UN}StrRep} $0 $0 "; " ";" ; Remove ';' ${Loop} ${Do} ${${UN}StrStr} $7 $0 ";;" ${If} $7 == "" ${ExitDo} ${EndIf} ${${UN}StrRep} $0 $0 ";;" ";" ${Loop} ; Remove a leading or trailing semicolon from EnvVar StrCpy $7 $0 1 0 ${If} $7 == ";" StrCpy $0 $0 "" 1 ; Change ';' to '' ${EndIf} StrLen $6 $0 IntOp $6 $6 - 1 StrCpy $7 $0 1 $6 ${If} $7 == ";" StrCpy $0 $0 $6 ; Change ';' to '' ${EndIf} ; DetailPrint "Scrubbed $1: [$0]" ; Uncomment to debug ${EndIf} /* Step 3. Remove all instances of the target path/string (even if "A" or "P") $6 = bool flag (1 = found and removed PathString) $7 = a string (e.g. path) delimited by semicolon(s) $8 = entry counter starting at 0 $9 = copy of $0 $R0 = tempChar */ ${If} $5 != "" ; If EnvVar is not empty ... StrCpy $9 $0 StrCpy $0 "" StrCpy $8 0 StrCpy $6 0 ${Do} ${${UN}StrTok} $7 $9 ";" $8 "0" ; $7 = next entry, $8 = entry counter ${If} $7 == "" ; If we've run out of entries, ${ExitDo} ; were done ${EndIf} ; ; Remove leading and trailing spaces from this entry (critical step for Action=Remove) ${Do} StrCpy $R0 $7 1 ${If} $R0 != " " ${ExitDo} ${EndIf} StrCpy $7 $7 "" 1 ; Remove leading space ${Loop} ${Do} StrCpy $R0 $7 1 -1 ${If} $R0 != " " ${ExitDo} ${EndIf} StrCpy $7 $7 -1 ; Remove trailing space ${Loop} ${If} $7 == $4 ; If string matches, remove it by not appending it StrCpy $6 1 ; Set 'found' flag ${ElseIf} $7 != $4 ; If string does NOT match ${AndIf} $0 == "" ; and the 1st string being added to $0, StrCpy $0 $7 ; copy it to $0 without a prepended semicolon ${ElseIf} $7 != $4 ; If string does NOT match ${AndIf} $0 != "" ; and this is NOT the 1st string to be added to $0, StrCpy $0 $0;$7 ; append path to $0 with a prepended semicolon ${EndIf} ; IntOp $8 $8 + 1 ; Bump counter ${Loop} ; Check for duplicates until we run out of paths ${EndIf} ; Step 4: Perform the requested Action ; ${If} $2 != "R" ; If Append or Prepend ${If} $6 == 1 ; And if we found the target DetailPrint "Target is already present in $1. It will be removed and" ${EndIf} ${If} $0 == "" ; If EnvVar is (now) empty StrCpy $0 $4 ; just copy PathString to EnvVar ${If} $6 == 0 ; If found flag is either 0 ${OrIf} $6 == "" ; or blank (if EnvVarName is empty) DetailPrint "$1 was empty and has been updated with the target" ${EndIf} ${ElseIf} $2 == "A" ; If Append (and EnvVar is not empty), StrCpy $0 $0;$4 ; append PathString ${If} $6 == 1 DetailPrint "appended to $1" ${Else} DetailPrint "Target was appended to $1" ${EndIf} ${Else} ; If Prepend (and EnvVar is not empty), StrCpy $0 $4;$0 ; prepend PathString ${If} $6 == 1 DetailPrint "prepended to $1" ${Else} DetailPrint "Target was prepended to $1" ${EndIf} ${EndIf} ${Else} ; If Action = Remove ${If} $6 == 1 ; and we found the target DetailPrint "Target was found and removed from $1" ${Else} DetailPrint "Target was NOT found in $1 (nothing to remove)" ${EndIf} ${If} $0 == "" DetailPrint "$1 is now empty" ${EndIf} ${EndIf} ; Step 5: Update the registry at RegLoc with the updated EnvVar and announce the change ; ClearErrors ${If} $3 == HKLM WriteRegExpandStr ${hklm_all_users} $1 $0 ; Write it in all users section ${ElseIf} $3 == HKCU WriteRegExpandStr ${hkcu_current_user} $1 $0 ; Write it to current user section ${EndIf} IfErrors 0 +4 MessageBox MB_OK|MB_ICONEXCLAMATION "Could not write updated $1 to $3" DetailPrint "Could not write updated $1 to $3" Goto EnvVarUpdate_Restore_Vars ; "Export" our change SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 EnvVarUpdate_Restore_Vars: ; ; Restore the user's variables and return ResultVar Pop $R0 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Push $0 ; Push my $0 (ResultVar) Exch Pop $0 ; Restore his $0 FunctionEnd !macroend ; EnvVarUpdate UN !insertmacro EnvVarUpdate "" !insertmacro EnvVarUpdate "un." ;----------------------------------- EnvVarUpdate end---------------------------------------- !verbose pop !endif asymptote-3.05/windows/lnkX64IconFix.nsh0000644000000000000000000000520415031566105016741 0ustar rootroot/****************************************************************************** WORKAROUND - lnkX64IconFix This snippet was developed to address an issue with Windows x64 incorrectly redirecting the shortcuts icon from $PROGRAMFILES32 to $PROGRAMFILES64. See Forum post: http://forums.winamp.com/newreply.php?do=postreply&t=327806 Example: CreateShortcut "$SMPROGRAMS\My App\My App.lnk" "$INSTDIR\My App.exe" "" "$INSTDIR\My App.exe" ${lnkX64IconFix} "$SMPROGRAMS\My App\My App.lnk" Original Code by Anders [http://forums.winamp.com/member.php?u=70852] ******************************************************************************/ !ifndef ___lnkX64IconFix___ !verbose push !verbose 0 !include "LogicLib.nsh" !include "x64.nsh" !define ___lnkX64IconFix___ !define lnkX64IconFix `!insertmacro _lnkX64IconFix` !macro _lnkX64IconFix _lnkPath !verbose push !verbose 0 ${If} ${RunningX64} DetailPrint "WORKAROUND: 64bit OS Detected, Attempting to apply lnkX64IconFix" Push "${_lnkPath}" Call lnkX64IconFix ${EndIf} !verbose pop !macroend Function lnkX64IconFix ; _lnkPath Exch $5 Push $0 Push $1 Push $2 Push $3 Push $4 System::Call 'OLE32::CoCreateInstance(g "{00021401-0000-0000-c000-000000000046}",i 0,i 1,g "{000214ee-0000-0000-c000-000000000046}",*i.r1)i' ${If} $1 <> 0 System::Call '$1->0(g "{0000010b-0000-0000-C000-000000000046}",*i.r2)' ${If} $2 <> 0 System::Call '$2->5(w r5,i 2)i.r0' ${If} $0 = 0 System::Call '$1->0(g "{45e2b4ae-b1c3-11d0-b92f-00a0c90312e1}",*i.r3)i.r0' ${If} $3 <> 0 System::Call '$3->5(i 0xA0000007)i.r0' System::Call '$3->6(*i.r4)i.r0' ${If} $0 = 0 IntOp $4 $4 & 0xffffBFFF System::Call '$3->7(ir4)i.r0' ${If} $0 = 0 System::Call '$2->6(i0,i0)' DetailPrint "WORKAROUND: lnkX64IconFix Applied successfully" ${EndIf} ${EndIf} System::Call $3->2() ${EndIf} ${EndIf} System::Call $2->2() ${EndIf} System::Call $1->2() ${EndIf} Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 FunctionEnd !verbose pop !endif asymptote-3.05/windows/build-asy-installer.ps1.in0000644000000000000000000000044515031566105020601 0ustar rootroot#!/usr/bin/env pwsh param( [Parameter(Mandatory=$true)] [string]$MakeNsisExec ) & "${PY3_INTERPRETER}" "${BUILD_ASY_INSTALLER_SCRIPT}" ` --cmake-install-root="${CMAKE_INSTALL_PREFIX}" ` --asy-install-build-dir="${ASY_INSTALL_DIRECTORY}" ` --makensis-exec="$MakeNsisExec" asymptote-3.05/windows/texindex-wsl.cmd0000644000000000000000000000003215031566105016773 0ustar rootroot@echo off wsl texindex %* asymptote-3.05/windows/build-asymptote-installer.py0000644000000000000000000000604115031566105021350 0ustar rootroot#!/usr/bin/env python3 import argparse import pathlib import shutil import subprocess ASYMPTOTE_SOURCE_ROOT = pathlib.Path(__file__).parent.parent GUI_DIR = gui_dir = ASYMPTOTE_SOURCE_ROOT / "GUI" def parse_args(): parser = argparse.ArgumentParser() parser.add_argument( "--makensis-exec", type=str, required=True, help="Executable file to makensis.exe", ) parser.add_argument( "--cmake-install-root", type=str, required=True, help="CMake Pre-NSIS install root", ) parser.add_argument( "--asy-install-build-dir", type=str, required=True, help=( "Name of the install directory for asymptote build contained in the " + "cmake-install-root directory" ), ) return parser.parse_args() def check_gui_built(): dirs_to_check = {"xasyicons", "xasyqtui", "xasyversion"} message = ( "GUI is not fully built. " + "Please ensure GUI is built before running this build script." ) if not all((GUI_DIR / dir_to_check).exists() for dir_to_check in dirs_to_check): raise RuntimeError(message) def copy_gui_files(asy_install_root: pathlib.Path): gui_install_dir = asy_install_root / "GUI" if gui_install_dir.is_file(): gui_install_dir.unlink(missing_ok=True) elif gui_install_dir.is_dir(): shutil.rmtree(gui_install_dir) gui_install_dir.mkdir(exist_ok=True) exclude_prefixes = { ".vscode", ".fleet", ".idea", "__pycache__", ".python-version", ".gitignore", "buildtool.py", "requirements.", "setup.py", "xasy-launcher", } for file in GUI_DIR.iterdir(): if any( file.name.lower().startswith(exclude_prefix.lower()) for exclude_prefix in exclude_prefixes ): continue if file.is_dir(): shutil.copytree(file, gui_install_dir / file.name) else: shutil.copy2(file, gui_install_dir / file.name) def main(): # check GUI built args = parse_args() check_gui_built() makensis_exec = pathlib.Path(args.makensis_exec) if not makensis_exec.is_file(): raise RuntimeError("makensis executable cannot be found") # copy GUI to cmake_install_root = pathlib.Path(args.cmake_install_root) asy_install_root = cmake_install_root / args.asy_install_build_dir copy_gui_files(asy_install_root) # generate uninstall file with open( cmake_install_root / "AsymptoteUninstallList.nsi", "w", encoding="utf-8" ) as f: for file in asy_install_root.iterdir(): if file.is_dir(): f.write("RMDir /r $INSTDIR\\" + file.name) else: f.write("Delete $INSTDIR\\" + file.name) f.write("\n") # call nsis builder subprocess.run( [args.makensis_exec, str(cmake_install_root / "asymptote.nsi")], check=True ) print("Build succeeded") if __name__ == "__main__": main() asymptote-3.05/windows/asymptote.nsi0000644000000000000000000001434215031566105016424 0ustar rootroot!define PRODUCT_NAME "Asymptote" !include AsymptoteInstallInfo.nsi !define PRODUCT_WEB_SITE "https://asymptote.sourceforge.io/" !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Asymptote" !define PRODUCT_FILE_TYPE_REGKEY1 "Software\Classes\.asy" !define PRODUCT_FILE_TYPE_REGKEY2 "Software\Classes\ASYFile\shell\open\command" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" !define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir" SetCompressor lzma XPStyle On ; MUI 1.67 compatible ------ !include "MUI.nsh" !include "LogicLib.nsh" !include "lnkX64IconFix.nsh" ; MUI Settings !define MUI_ABORTWARNING !define MUI_ICON "asy.ico" !define MUI_UNICON "asy.ico" ; Welcome page !insertmacro MUI_PAGE_WELCOME ; License page !insertmacro MUI_PAGE_LICENSE "LICENSE" ;Components page ; don't bother with this until there are other components to install ; e.g.: possibility to automatically detect presence of, download, and install python, miktex, ImageMagick, etc ;!insertmacro MUI_PAGE_COMPONENTS ; Directory page !insertmacro MUI_PAGE_DIRECTORY ; Start menu page var ICONS_GROUP !define MUI_STARTMENUPAGE_NODISABLE !define MUI_STARTMENUPAGE_DEFAULTFOLDER "Asymptote" !define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}" !define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}" !insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP ; Instfiles page !insertmacro MUI_PAGE_INSTFILES ; Finish page ;!define MUI_FINISHPAGE_RUN "$INSTDIR\asy.bat" ;!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\asymptote.pdf" !define MUI_FINISHPAGE_LINK ${PRODUCT_WEB_SITE} !define MUI_FINISHPAGE_LINK_LOCATION ${PRODUCT_WEB_SITE} !insertmacro MUI_PAGE_FINISH ; Uninstaller pages !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_FINISH ; Language files !insertmacro MUI_LANGUAGE "English" ; Reserve files !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ; MUI end ------ Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" OutFile "asymptote-${PRODUCT_VERSION}-setup.exe" InstallDir "$PROGRAMFILES64\Asymptote" InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" ShowInstDetails show ShowUnInstDetails show Section "Asymptote" SEC01 SetOutPath "$INSTDIR" SetOverwrite try File /r build-${PRODUCT_VERSION}\* FileOpen $0 $INSTDIR\asy.bat w FileWrite $0 "@ECHO OFF" FileWriteByte $0 "13" FileWriteByte $0 "10" FileWrite $0 "set CYGWIN=nodosfilewarning" FileWriteByte $0 "13" FileWriteByte $0 "10" FileWrite $0 '"$INSTDIR\asy.exe" %*' FileWriteByte $0 "13" FileWriteByte $0 "10" FileWrite $0 "if %errorlevel% == 0 exit /b" FileWriteByte $0 "13" FileWriteByte $0 "10" FileWrite $0 "echo." FileWriteByte $0 "13" FileWriteByte $0 "10" FileWrite $0 "PAUSE" FileWriteByte $0 "13" FileWriteByte $0 "10" FileClose $0 ; Shortcuts !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateDirectory "$SMPROGRAMS\$ICONS_GROUP" SetOutPath "%USERPROFILE%" CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Asymptote.lnk" "$INSTDIR\asy.bat" "" "$INSTDIR\asy.ico" ${lnkX64IconFix} "$SMPROGRAMS\$ICONS_GROUP\Asymptote.lnk" CreateShortCut "$DESKTOP\Asymptote.lnk" "$INSTDIR\asy.bat" "" "$INSTDIR\asy.ico" ${lnkX64IconFix} "$DESKTOP\Asymptote.lnk" CreateShortCut "$DESKTOP\Xasy.lnk" "$INSTDIR\GUI\xasy.py" "--asypath $\"$INSTDIR\asy.exe$\"" CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Xasy.lnk" "$INSTDIR\GUI\xasy.py" "--asypath $\"$INSTDIR\asy.exe$\"" SetOutPath "$INSTDIR" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd Section "Tester" SectionEnd Section -AdditionalIcons !insertmacro MUI_STARTMENU_WRITE_BEGIN Application WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk" "$INSTDIR\uninst.exe" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd Section -Post WriteUninstaller "$INSTDIR\uninst.exe" ;create registry keys with information needed to run asymptote WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\asy.exe" WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "Path" "$INSTDIR" WriteRegStr HKLM "${PRODUCT_FILE_TYPE_REGKEY1}" "" "ASYFile" WriteRegStr HKLM "${PRODUCT_FILE_TYPE_REGKEY2}" "" '"$INSTDIR\asy.bat" "%1"' WriteRegDWORD HKLM "SOFTWARE\Cygwin" "heap_chunk_in_mb" 0xFFFFFF00 ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "CYGWIN" ${If} $0 == "" WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "CYGWIN" "nodosfilewarning" SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 ${Endif} WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\asy.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" SectionEnd Function un.onUninstSuccess HideWindow MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer." FunctionEnd Section Uninstall !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP Delete "$INSTDIR\${PRODUCT_NAME}.url" Delete "$INSTDIR\uninst.exe" !include AsymptoteUninstallList.nsi Delete "$INSTDIR\asy.bat" RMDir "$INSTDIR" Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk" Delete "$SMPROGRAMS\$ICONS_GROUP\Website.lnk" Delete "$DESKTOP\Asymptote.lnk" Delete "$DESKTOP\Xasy.lnk" Delete "$SMPROGRAMS\$ICONS_GROUP\Asymptote.lnk" Delete "$SMPROGRAMS\$ICONS_GROUP\Xasy.lnk" RMDir "$SMPROGRAMS\$ICONS_GROUP" DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" DeleteRegKey HKLM "${PRODUCT_FILE_TYPE_REGKEY1}" DeleteRegKey HKLM "${PRODUCT_FILE_TYPE_REGKEY2}" SetAutoClose true SectionEnd asymptote-3.05/windows/AsymptoteInstallInfo.nsi.in0000644000000000000000000000005115031566105021124 0ustar rootroot!define PRODUCT_VERSION "${ASY_VERSION}" asymptote-3.05/windows/asy.rc0000644000000000000000000000140215031566105014777 0ustar rootrootasy ICON PRELOAD "asy.ico" 1 VERSIONINFO FILEOS 0x40004 FILETYPE 0x1 FILESUBTYPE 0x0 BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "FileDescription", "Vector Graphics Language\0" VALUE "OriginalFilename", "asy.exe\0" VALUE "LegalCopyright", "Copyright \251 2005 Andy Hammerlindl, John Bowman, Tom Prince\0" VALUE "CompanyName", "Andy Hammerlindl, John Bowman, Tom Prince\0" VALUE "ProductName", "Asymptote\0" VALUE "ProductVersion", "ASYMPTOTE_VERSION\0" VALUE "GPL Copyleft", "Released under the GNU General Public License version 2\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 0x04b0 END END asymptote-3.05/newexp.h0000644000000000000000000000230615031566105013646 0ustar rootroot/***** * newexp.h * Andy Hammerlindl 2003/07/28 * * Handles the abstract syntax for expressions the create new objects, * such as record, array, and function constructors. *****/ #ifndef NEWEXP_H #define NEWEXP_H #include "exp.h" #include "dec.h" #include "fundec.h" #include "entry.h" namespace absyntax { typedef fundef newFunctionExp; class newRecordExp : public exp { astType *result; public: newRecordExp(position pos, astType *result) : exp(pos), result(result) {} void prettyprint(ostream &out, Int indent); static types::ty *transFromTyEntry(position pos, coenv &e, trans::tyEntry *ent); types::ty *trans(coenv &e); types::ty *getType(coenv &e); }; class newArrayExp : public exp { astType *celltype; explist *dimexps; dimensions *dims; arrayinit *ai; public: newArrayExp(position pos, astType *celltype, explist *dimexps, dimensions *dims, arrayinit *ai) : exp(pos), celltype(celltype), dimexps(dimexps), dims(dims), ai(ai) {} void prettyprint(ostream &out, Int indent); types::ty *trans(coenv &e); types::ty *getType(coenv &e); }; } // namespace absyntax #endif asymptote-3.05/runsystem.h0000644000000000000000000000015415031566132014410 0ustar rootroot/***** Autogenerated from runsystem.in; changes will be overwritten *****/ #pragma once namespace run { } asymptote-3.05/generate_asy_list_file.py0000644000000000000000000000364415031566105017247 0ustar rootroot#!/usr/bin/env python3 __doc__ = """ Script to generate asy.list file. Equivalent to Makefile's asy-list.el file's logic to generate asy.list. """ import argparse import pathlib import subprocess as sp from typing import Optional def parse_args(): parser = argparse.ArgumentParser() parser.add_argument("--asy-executable", required=True, help="Asymptote executable") parser.add_argument("--asy-base-dir", required=True, help="Asymptote base dir") parser.add_argument("--output-file", required=True, help="Output file") return parser.parse_args() def run_asy_list(asy_exec: str, base_dir: pathlib.Path, asy_file: Optional[str] = None): base_args = [asy_exec, "-dir", str(base_dir), "-config", '""', "-render", "0", "-l"] if asy_file is not None: base_args.append(asy_file) out_data = sp.run( base_args, stdout=sp.PIPE, stderr=sp.PIPE, universal_newlines=True, check=True, ) return out_data.stdout def base_file_to_be_included_in_list_file(base_file_name: str): if base_file_name.startswith("plain") or base_file_name.startswith("three_"): return False if "map" in base_file_name: return False return True def main(): args = parse_args() base_dir = pathlib.Path(args.asy_base_dir) base_asy_list = run_asy_list(args.asy_executable, base_dir) base_file: pathlib.Path base_files_to_generate_list = [ base_file for base_file in base_dir.glob("*.asy") if base_file_to_be_included_in_list_file(base_file.name) ] base_file_asy_lists = [ run_asy_list(args.asy_executable, base_dir, str(base_file)) for base_file in base_files_to_generate_list ] with open(args.output_file, "w", encoding="utf-8") as fil: fil.write(base_asy_list) for asy_list_info in base_file_asy_lists: fil.write(asy_list_info) if __name__ == "__main__": main() asymptote-3.05/program.h0000644000000000000000000000500115031566105014002 0ustar rootroot/***** * program.h * Tom Prince * * The list of instructions used by the virtual machine. *****/ #ifndef PROGRAM_H #define PROGRAM_H #include // for ptrdiff_t #include "common.h" #include "inst.h" using std::ptrdiff_t; namespace vm { struct inst; class program : public gc { public: class label; program(); void encode(inst i); label begin(); label end(); inst &back(); void pop_back(); private: friend class label; typedef mem::vector code_t; code_t code; inst& operator[](size_t); }; class program::label { public: // interface label() : where(0), code() {} public: //interface label& operator++(); label& operator--(); bool defined() const; bool operator==(const label& right) const; bool operator!=(const label& right) const; inst& operator*() const; inst* operator->() const; friend ptrdiff_t offset(const label& left, const label& right); private: label (size_t where, program* code) : where(where), code(code) {} size_t where; program* code; friend class program; }; // Prints one instruction (including arguments). void printInst(std::ostream& out, const program::label& code, const program::label& base); // Prints code until a ret opcode is printed. void print(std::ostream& out, program *base); // Inline forwarding functions for vm::program inline program::program() : code() {} inline program::label program::end() { return label(code.size(), this); } inline program::label program::begin() { return label(0, this); } inline inst& program::back() { return code.back(); } inline void program::pop_back() { return code.pop_back(); } inline void program::encode(inst i) { code.push_back(i); } inline inst& program::operator[](size_t n) { return code[n]; } inline program::label& program::label::operator++() { ++where; return *this; } inline program::label& program::label::operator--() { --where; return *this; } inline bool program::label::defined() const { return (code != 0); } inline bool program::label::operator==(const label& right) const { return (code == right.code) && (where == right.where); } inline bool program::label::operator!=(const label& right) const { return !(*this == right); } inline inst& program::label::operator*() const { return (*code)[where]; } inline inst* program::label::operator->() const { return &**this; } inline ptrdiff_t offset(const program::label& left, const program::label& right) { return right.where - left.where; } } // namespace vm #endif // PROGRAM_H asymptote-3.05/index.html0000644000000000000000000000017715031566105014170 0ustar rootroot Asymptote Source Code asymptote-3.05/runpath.cc0000644000000000000000000006500315031566132014162 0ustar rootroot/***** Autogenerated from runpath.in; changes will be overwritten *****/ #line 1 "./runtimebase.in" /***** * runtimebase.in * Andy Hammerlindl 2009/07/28 * * Common declarations needed for all code-generating .in files. * *****/ #line 1 "./runpath.in" /***** * runpath.in * * Runtime functions for path operations. * *****/ #line 23 "./runtimebase.in" #include "stack.h" #include "types.h" #include "builtin.h" #include "entry.h" #include "errormsg.h" #include "array.h" #include "triple.h" #include "callable.h" #include "opsymbols.h" using vm::stack; using vm::error; using vm::array; using vm::read; using vm::callable; using types::formal; using types::function; using camp::triple; #define PRIMITIVE(name,Name,asyName) using types::prim##Name; #include #undef PRIMITIVE void unused(void *); namespace run { typedef double real; array *copyArray(array *a); array *copyArray2(array *a); array *copyArray3(array *a); double *copyTripleArray2Components(array *a, size_t &N, GCPlacement placement=NoGC); triple *copyTripleArray2C(array *a, size_t &N, GCPlacement placement=NoGC); } function *realRealFunction(); #define CURRENTPEN processData().currentpen #line 17 "runpath.in" #include "path.h" #include "arrayop.h" #include "predicates.h" using namespace camp; using namespace vm; typedef array realarray; typedef array realarray2; typedef array patharray; using types::realArray; using types::realArray2; using types::pathArray; Int windingnumber(array *p, camp::pair z) { size_t size=checkArray(p); Int count=0; for(size_t i=0; i < size; i++) count += read(p,i)->windingnumber(z); return count; } // Autogenerated routines: #ifndef NOSYM #include "runpath.symbols.h" #endif namespace run { #line 44 "./runpath.in" void nullPath(stack *Stack) { #line 45 "./runpath.in" {Stack->push(nullpath); return;} } #line 49 "./runpath.in" // bool ==(path a, path b); void gen_runpath1(stack *Stack) { path b=vm::pop(Stack); path a=vm::pop(Stack); #line 50 "./runpath.in" {Stack->push(a == b); return;} } #line 54 "./runpath.in" // bool !=(path a, path b); void gen_runpath2(stack *Stack) { path b=vm::pop(Stack); path a=vm::pop(Stack); #line 55 "./runpath.in" {Stack->push(!(a == b)); return;} } #line 59 "./runpath.in" // pair point(path p, Int t); void gen_runpath3(stack *Stack) { Int t=vm::pop(Stack); path p=vm::pop(Stack); #line 60 "./runpath.in" {Stack->push(p.point((Int) t)); return;} } #line 64 "./runpath.in" // pair point(path p, real t); void gen_runpath4(stack *Stack) { real t=vm::pop(Stack); path p=vm::pop(Stack); #line 65 "./runpath.in" {Stack->push(p.point(t)); return;} } #line 69 "./runpath.in" // pair precontrol(path p, Int t); void gen_runpath5(stack *Stack) { Int t=vm::pop(Stack); path p=vm::pop(Stack); #line 70 "./runpath.in" {Stack->push(p.precontrol((Int) t)); return;} } #line 74 "./runpath.in" // pair precontrol(path p, real t); void gen_runpath6(stack *Stack) { real t=vm::pop(Stack); path p=vm::pop(Stack); #line 75 "./runpath.in" {Stack->push(p.precontrol(t)); return;} } #line 79 "./runpath.in" // pair postcontrol(path p, Int t); void gen_runpath7(stack *Stack) { Int t=vm::pop(Stack); path p=vm::pop(Stack); #line 80 "./runpath.in" {Stack->push(p.postcontrol((Int) t)); return;} } #line 84 "./runpath.in" // pair postcontrol(path p, real t); void gen_runpath8(stack *Stack) { real t=vm::pop(Stack); path p=vm::pop(Stack); #line 85 "./runpath.in" {Stack->push(p.postcontrol(t)); return;} } #line 89 "./runpath.in" // pair dir(path p, Int t, Int sign=0, bool normalize=true); void gen_runpath9(stack *Stack) { bool normalize=vm::pop(Stack,true); Int sign=vm::pop(Stack,0); Int t=vm::pop(Stack); path p=vm::pop(Stack); #line 90 "./runpath.in" {Stack->push(p.dir(t,sign,normalize)); return;} } #line 94 "./runpath.in" // pair dir(path p, real t, bool normalize=true); void gen_runpath10(stack *Stack) { bool normalize=vm::pop(Stack,true); real t=vm::pop(Stack); path p=vm::pop(Stack); #line 95 "./runpath.in" {Stack->push(p.dir(t,normalize)); return;} } #line 99 "./runpath.in" // pair accel(path p, Int t, Int sign=0); void gen_runpath11(stack *Stack) { Int sign=vm::pop(Stack,0); Int t=vm::pop(Stack); path p=vm::pop(Stack); #line 100 "./runpath.in" {Stack->push(p.accel(t,sign)); return;} } #line 104 "./runpath.in" // pair accel(path p, real t); void gen_runpath12(stack *Stack) { real t=vm::pop(Stack); path p=vm::pop(Stack); #line 105 "./runpath.in" {Stack->push(p.accel(t)); return;} } #line 109 "./runpath.in" // real radius(path p, real t); void gen_runpath13(stack *Stack) { real t=vm::pop(Stack); path p=vm::pop(Stack); #line 110 "./runpath.in" pair v=p.dir(t,false); pair a=p.accel(t); real d=dot(a,v); real v2=v.abs2(); real a2=a.abs2(); real denom=v2*a2-d*d; real r=v2*sqrt(v2); {Stack->push(denom > 0 ? r/sqrt(denom) : 0.0); return;} } #line 121 "./runpath.in" // path reverse(path p); void gen_runpath14(stack *Stack) { path p=vm::pop(Stack); #line 122 "./runpath.in" {Stack->push(p.reverse()); return;} } #line 126 "./runpath.in" // path subpath(path p, Int a, Int b); void gen_runpath15(stack *Stack) { Int b=vm::pop(Stack); Int a=vm::pop(Stack); path p=vm::pop(Stack); #line 127 "./runpath.in" {Stack->push(p.subpath((Int) a, (Int) b)); return;} } #line 131 "./runpath.in" // path subpath(path p, real a, real b); void gen_runpath16(stack *Stack) { real b=vm::pop(Stack); real a=vm::pop(Stack); path p=vm::pop(Stack); #line 132 "./runpath.in" {Stack->push(p.subpath(a,b)); return;} } #line 136 "./runpath.in" // path nurb(pair z0, pair z1, pair z2, pair z3, real w0, real w1, real w2, real w3, Int m); void gen_runpath17(stack *Stack) { Int m=vm::pop(Stack); real w3=vm::pop(Stack); real w2=vm::pop(Stack); real w1=vm::pop(Stack); real w0=vm::pop(Stack); pair z3=vm::pop(Stack); pair z2=vm::pop(Stack); pair z1=vm::pop(Stack); pair z0=vm::pop(Stack); #line 138 "./runpath.in" {Stack->push(nurb(z0,z1,z2,z3,w0,w1,w2,w3,m)); return;} } #line 142 "./runpath.in" // Int length(path p); void gen_runpath18(stack *Stack) { path p=vm::pop(Stack); #line 143 "./runpath.in" {Stack->push(p.length()); return;} } #line 147 "./runpath.in" // bool cyclic(path p); void gen_runpath19(stack *Stack) { path p=vm::pop(Stack); #line 148 "./runpath.in" {Stack->push(p.cyclic()); return;} } #line 152 "./runpath.in" // bool straight(path p, Int t); void gen_runpath20(stack *Stack) { Int t=vm::pop(Stack); path p=vm::pop(Stack); #line 153 "./runpath.in" {Stack->push(p.straight(t)); return;} } #line 157 "./runpath.in" // path unstraighten(path p); void gen_runpath21(stack *Stack) { path p=vm::pop(Stack); #line 158 "./runpath.in" {Stack->push(p.unstraighten()); return;} } #line 162 "./runpath.in" // bool piecewisestraight(path p); void gen_runpath22(stack *Stack) { path p=vm::pop(Stack); #line 163 "./runpath.in" {Stack->push(p.piecewisestraight()); return;} } #line 167 "./runpath.in" // real arclength(path p); void gen_runpath23(stack *Stack) { path p=vm::pop(Stack); #line 168 "./runpath.in" {Stack->push(p.arclength()); return;} } #line 172 "./runpath.in" // real arclength(pair z0, pair c0, pair c1, pair z1); void gen_runpath24(stack *Stack) { pair z1=vm::pop(Stack); pair c1=vm::pop(Stack); pair c0=vm::pop(Stack); pair z0=vm::pop(Stack); #line 173 "./runpath.in" {Stack->push(arcLength(z0,c0,c1,z1)); return;} } #line 177 "./runpath.in" // real arctime(path p, real L); void gen_runpath25(stack *Stack) { real L=vm::pop(Stack); path p=vm::pop(Stack); #line 178 "./runpath.in" {Stack->push(p.arctime(L)); return;} } #line 182 "./runpath.in" // real dirtime(path p, pair z); void gen_runpath26(stack *Stack) { pair z=vm::pop(Stack); path p=vm::pop(Stack); #line 183 "./runpath.in" {Stack->push(p.directiontime(z)); return;} } #line 187 "./runpath.in" // realarray* intersect(path p, path q, real fuzz=-1); void gen_runpath27(stack *Stack) { real fuzz=vm::pop(Stack,-1); path q=vm::pop(Stack); path p=vm::pop(Stack); #line 188 "./runpath.in" bool exact=fuzz <= 0.0; if(fuzz < 0) fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())), ::max(length(q.max()),length(q.min()))); std::vector S,T; real s,t; if(intersections(s,t,S,T,p,q,fuzz,true,exact)) { array *V=new array(2); (*V)[0]=s; (*V)[1]=t; {Stack->push(V); return;} } {Stack->push(new array(0)); return;} } #line 204 "./runpath.in" // realarray2* intersections(path p, path q, real fuzz=-1); void gen_runpath28(stack *Stack) { real fuzz=vm::pop(Stack,-1); path q=vm::pop(Stack); path p=vm::pop(Stack); #line 205 "./runpath.in" bool exact=fuzz <= 0.0; if(fuzz < 0.0) fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())), ::max(length(q.max()),length(q.min()))); real s,t; std::vector S,T; intersections(s,t,S,T,p,q,fuzz,false,true); size_t n=S.size(); if(n == 0 && !exact) { if(intersections(s,t,S,T,p,q,fuzz,true,false)) { array *V=new array(1); array *Vi=new array(2); (*V)[0]=Vi; (*Vi)[0]=s; (*Vi)[1]=t; {Stack->push(V); return;} } } array *V=new array(n); for(size_t i=0; i < n; ++i) { array *Vi=new array(2); (*V)[i]=Vi; (*Vi)[0]=S[i]; (*Vi)[1]=T[i]; } stable_sort(V->begin(),V->end(),run::compare2()); {Stack->push(V); return;} } #line 235 "./runpath.in" // realarray* intersections(path p, explicit pair a, explicit pair b, real fuzz=-1); void gen_runpath29(stack *Stack) { real fuzz=vm::pop(Stack,-1); pair b=vm::pop(Stack); pair a=vm::pop(Stack); path p=vm::pop(Stack); #line 236 "./runpath.in" if(fuzz < 0) fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())), ::max(length(a),length(b))); std::vector S; intersections(S,p,a,b,fuzz); sort(S.begin(),S.end()); size_t n=S.size(); array *V=new array(n); for(size_t i=0; i < n; ++i) (*V)[i]=S[i]; {Stack->push(V); return;} } // Return the intersection point of the extensions of the line segments // PQ and pq. #line 252 "./runpath.in" // pair extension(pair P, pair Q, pair p, pair q); void gen_runpath30(stack *Stack) { pair q=vm::pop(Stack); pair p=vm::pop(Stack); pair Q=vm::pop(Stack); pair P=vm::pop(Stack); #line 253 "./runpath.in" pair ac=P-Q; pair bd=q-p; real det=ac.getx()*bd.gety()-ac.gety()*bd.getx(); if(det == 0) {Stack->push(pair(infinity,infinity)); return;} {Stack->push(P+((p.getx()-P.getx())*bd.gety()-(p.gety()-P.gety())*bd.getx())*ac/det); return;} } #line 261 "./runpath.in" // Int size(path p); void gen_runpath31(stack *Stack) { path p=vm::pop(Stack); #line 262 "./runpath.in" {Stack->push(p.size()); return;} } #line 266 "./runpath.in" // path &(path p, path q); void gen_runpath32(stack *Stack) { path q=vm::pop(Stack); path p=vm::pop(Stack); #line 267 "./runpath.in" {Stack->push(camp::concat(p,q)); return;} } #line 271 "./runpath.in" // pair min(explicit path p); void gen_runpath33(stack *Stack) { path p=vm::pop(Stack); #line 272 "./runpath.in" {Stack->push(p.min()); return;} } #line 276 "./runpath.in" // pair max(explicit path p); void gen_runpath34(stack *Stack) { path p=vm::pop(Stack); #line 277 "./runpath.in" {Stack->push(p.max()); return;} } #line 281 "./runpath.in" // Int size(patharray *p); void gen_runpath35(stack *Stack) { patharray * p=vm::pop(Stack); #line 282 "./runpath.in" size_t size=checkArray(p); Int count=0; for (size_t i = 0; i < size; i++) count += read(p,i)->size(); {Stack->push(count); return;} } #line 290 "./runpath.in" // pair min(patharray *p); void gen_runpath36(stack *Stack) { patharray * p=vm::pop(Stack); #line 291 "./runpath.in" size_t size=checkArray(p); if(size == 0) error(nopoints); path *g = p->read(0); pair z = g->min(); double minx = z.getx(), miny = z.gety(); for (size_t i = 1; i < size; ++i) { path *g = p->read(i); pair z = g->min(); double x = z.getx(), y = z.gety(); if (x < minx) minx = x; if (y < miny) miny = y; } {Stack->push(pair(minx, miny)); return;} } #line 314 "./runpath.in" // pair max(patharray *p); void gen_runpath37(stack *Stack) { patharray * p=vm::pop(Stack); #line 315 "./runpath.in" size_t size=checkArray(p); if(size == 0) error(nopoints); path *g = p->read(0); pair z = g->max(); double maxx = z.getx(), maxy = z.gety(); for (size_t i = 1; i < size; ++i) { path *g = p->read(i); pair z = g->max(); double x = z.getx(), y = z.gety(); if (x > maxx) maxx = x; if (y > maxy) maxy = y; } {Stack->push(pair(maxx, maxy)); return;} } #line 338 "./runpath.in" // pair minAfterTransform(transform t, patharray *p); void gen_runpath38(stack *Stack) { patharray * p=vm::pop(Stack); transform t=vm::pop(Stack); #line 339 "./runpath.in" size_t size=checkArray(p); if(size == 0) error(nopoints); path g = p->read(0)->transformed(t); pair z = g.min(); double minx = z.getx(), miny = z.gety(); for (size_t i = 1; i < size; ++i) { path g = p->read(i)->transformed(t); pair z = g.min(); double x = z.getx(), y = z.gety(); if (x < minx) minx = x; if (y < miny) miny = y; } {Stack->push(pair(minx, miny)); return;} } #line 362 "./runpath.in" // pair maxAfterTransform(transform t, patharray *p); void gen_runpath39(stack *Stack) { patharray * p=vm::pop(Stack); transform t=vm::pop(Stack); #line 363 "./runpath.in" size_t size=checkArray(p); if(size == 0) error(nopoints); path g = p->read(0)->transformed(t); pair z = g.max(); double maxx = z.getx(), maxy = z.gety(); for (size_t i = 1; i < size; ++i) { path g = p->read(i)->transformed(t); pair z = g.max(); double x = z.getx(), y = z.gety(); if (x > maxx) maxx = x; if (y > maxy) maxy = y; } {Stack->push(pair(maxx, maxy)); return;} } #line 386 "./runpath.in" // realarray* mintimes(path p); void gen_runpath40(stack *Stack) { path p=vm::pop(Stack); #line 387 "./runpath.in" array *V=new array(2); pair z=p.mintimes(); (*V)[0]=z.getx(); (*V)[1]=z.gety(); {Stack->push(V); return;} } #line 395 "./runpath.in" // realarray* maxtimes(path p); void gen_runpath41(stack *Stack) { path p=vm::pop(Stack); #line 396 "./runpath.in" array *V=new array(2); pair z=p.maxtimes(); (*V)[0]=z.getx(); (*V)[1]=z.gety(); {Stack->push(V); return;} } #line 404 "./runpath.in" // real relativedistance(real theta, real phi, real t, bool atleast); void gen_runpath42(stack *Stack) { bool atleast=vm::pop(Stack); real t=vm::pop(Stack); real phi=vm::pop(Stack); real theta=vm::pop(Stack); #line 405 "./runpath.in" {Stack->push(camp::velocity(theta,phi,tension(t,atleast))); return;} } #line 409 "./runpath.in" // Int windingnumber(patharray *p, pair z); void gen_runpath43(stack *Stack) { pair z=vm::pop(Stack); patharray * p=vm::pop(Stack); #line 410 "./runpath.in" {Stack->push(windingnumber(p,z)); return;} } #line 414 "./runpath.in" // bool inside(explicit patharray *g, pair z, pen fillrule=CURRENTPEN); void gen_runpath44(stack *Stack) { pen fillrule=vm::pop(Stack,CURRENTPEN); pair z=vm::pop(Stack); patharray * g=vm::pop(Stack); #line 415 "./runpath.in" {Stack->push(fillrule.inside(windingnumber(g,z))); return;} } #line 419 "./runpath.in" // bool inside(path g, pair z, pen fillrule=CURRENTPEN); void gen_runpath45(stack *Stack) { pen fillrule=vm::pop(Stack,CURRENTPEN); pair z=vm::pop(Stack); path g=vm::pop(Stack); #line 420 "./runpath.in" {Stack->push(fillrule.inside(g.windingnumber(z))); return;} } // Return a positive (negative) value if a--b--c--cycle is oriented // counterclockwise (clockwise) or zero if all three points are colinear. // Equivalently, return a positive (negative) value if c lies to the // left (right) of the line through a and b or zero if c lies on this line. // The value returned is the determinant // |a.x a.y 1| // |b.x b.y 1| // |c.x c.y 1| // #line 433 "./runpath.in" // real orient(pair a, pair b, pair c); void gen_runpath46(stack *Stack) { pair c=vm::pop(Stack); pair b=vm::pop(Stack); pair a=vm::pop(Stack); #line 434 "./runpath.in" {Stack->push(orient2d(a,b,c)); return;} } // Return a positive (negative) value if d lies inside (outside) // the circle passing through the counterclockwise-oriented points a,b,c // or zero if d lies on this circle. // The value returned is the determinant // |a.x a.y a.x^2+a.y^2 1| // |b.x b.y b.x^2+b.y^2 1| // |c.x c.y c.x^2+c.y^2 1| // |d.x d.y d.x^2+d.y^2 1| #line 446 "./runpath.in" // real incircle(pair a, pair b, pair c, pair d); void gen_runpath47(stack *Stack) { pair d=vm::pop(Stack); pair c=vm::pop(Stack); pair b=vm::pop(Stack); pair a=vm::pop(Stack); #line 447 "./runpath.in" {Stack->push(incircle(a.getx(),a.gety(),b.getx(),b.gety(),c.getx(),c.gety(), d.getx(),d.gety())); return;} } } // namespace run namespace trans { void gen_runpath_venv(venv &ve) { #line 44 "./runpath.in" REGISTER_BLTIN(run::nullPath,"nullPath"); #line 49 "./runpath.in" addFunc(ve, run::gen_runpath1, primBoolean(), SYM_EQ, formal(primPath(), SYM(a), false, false), formal(primPath(), SYM(b), false, false)); #line 54 "./runpath.in" addFunc(ve, run::gen_runpath2, primBoolean(), SYM_NEQ, formal(primPath(), SYM(a), false, false), formal(primPath(), SYM(b), false, false)); #line 59 "./runpath.in" addFunc(ve, run::gen_runpath3, primPair(), SYM(point), formal(primPath(), SYM(p), false, false), formal(primInt(), SYM(t), false, false)); #line 64 "./runpath.in" addFunc(ve, run::gen_runpath4, primPair(), SYM(point), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(t), false, false)); #line 69 "./runpath.in" addFunc(ve, run::gen_runpath5, primPair(), SYM(precontrol), formal(primPath(), SYM(p), false, false), formal(primInt(), SYM(t), false, false)); #line 74 "./runpath.in" addFunc(ve, run::gen_runpath6, primPair(), SYM(precontrol), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(t), false, false)); #line 79 "./runpath.in" addFunc(ve, run::gen_runpath7, primPair(), SYM(postcontrol), formal(primPath(), SYM(p), false, false), formal(primInt(), SYM(t), false, false)); #line 84 "./runpath.in" addFunc(ve, run::gen_runpath8, primPair(), SYM(postcontrol), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(t), false, false)); #line 89 "./runpath.in" addFunc(ve, run::gen_runpath9, primPair(), SYM(dir), formal(primPath(), SYM(p), false, false), formal(primInt(), SYM(t), false, false), formal(primInt(), SYM(sign), true, false), formal(primBoolean(), SYM(normalize), true, false)); #line 94 "./runpath.in" addFunc(ve, run::gen_runpath10, primPair(), SYM(dir), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(t), false, false), formal(primBoolean(), SYM(normalize), true, false)); #line 99 "./runpath.in" addFunc(ve, run::gen_runpath11, primPair(), SYM(accel), formal(primPath(), SYM(p), false, false), formal(primInt(), SYM(t), false, false), formal(primInt(), SYM(sign), true, false)); #line 104 "./runpath.in" addFunc(ve, run::gen_runpath12, primPair(), SYM(accel), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(t), false, false)); #line 109 "./runpath.in" addFunc(ve, run::gen_runpath13, primReal(), SYM(radius), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(t), false, false)); #line 121 "./runpath.in" addFunc(ve, run::gen_runpath14, primPath(), SYM(reverse), formal(primPath(), SYM(p), false, false)); #line 126 "./runpath.in" addFunc(ve, run::gen_runpath15, primPath(), SYM(subpath), formal(primPath(), SYM(p), false, false), formal(primInt(), SYM(a), false, false), formal(primInt(), SYM(b), false, false)); #line 131 "./runpath.in" addFunc(ve, run::gen_runpath16, primPath(), SYM(subpath), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(a), false, false), formal(primReal(), SYM(b), false, false)); #line 136 "./runpath.in" addFunc(ve, run::gen_runpath17, primPath(), SYM(nurb), formal(primPair(), SYM(z0), false, false), formal(primPair(), SYM(z1), false, false), formal(primPair(), SYM(z2), false, false), formal(primPair(), SYM(z3), false, false), formal(primReal(), SYM(w0), false, false), formal(primReal(), SYM(w1), false, false), formal(primReal(), SYM(w2), false, false), formal(primReal(), SYM(w3), false, false), formal(primInt(), SYM(m), false, false)); #line 142 "./runpath.in" addFunc(ve, run::gen_runpath18, primInt(), SYM(length), formal(primPath(), SYM(p), false, false)); #line 147 "./runpath.in" addFunc(ve, run::gen_runpath19, primBoolean(), SYM(cyclic), formal(primPath(), SYM(p), false, false)); #line 152 "./runpath.in" addFunc(ve, run::gen_runpath20, primBoolean(), SYM(straight), formal(primPath(), SYM(p), false, false), formal(primInt(), SYM(t), false, false)); #line 157 "./runpath.in" addFunc(ve, run::gen_runpath21, primPath(), SYM(unstraighten), formal(primPath(), SYM(p), false, false)); #line 162 "./runpath.in" addFunc(ve, run::gen_runpath22, primBoolean(), SYM(piecewisestraight), formal(primPath(), SYM(p), false, false)); #line 167 "./runpath.in" addFunc(ve, run::gen_runpath23, primReal(), SYM(arclength), formal(primPath(), SYM(p), false, false)); #line 172 "./runpath.in" addFunc(ve, run::gen_runpath24, primReal(), SYM(arclength), formal(primPair(), SYM(z0), false, false), formal(primPair(), SYM(c0), false, false), formal(primPair(), SYM(c1), false, false), formal(primPair(), SYM(z1), false, false)); #line 177 "./runpath.in" addFunc(ve, run::gen_runpath25, primReal(), SYM(arctime), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(l), false, false)); #line 182 "./runpath.in" addFunc(ve, run::gen_runpath26, primReal(), SYM(dirtime), formal(primPath(), SYM(p), false, false), formal(primPair(), SYM(z), false, false)); #line 187 "./runpath.in" addFunc(ve, run::gen_runpath27, realArray(), SYM(intersect), formal(primPath(), SYM(p), false, false), formal(primPath(), SYM(q), false, false), formal(primReal(), SYM(fuzz), true, false)); #line 204 "./runpath.in" addFunc(ve, run::gen_runpath28, realArray2(), SYM(intersections), formal(primPath(), SYM(p), false, false), formal(primPath(), SYM(q), false, false), formal(primReal(), SYM(fuzz), true, false)); #line 235 "./runpath.in" addFunc(ve, run::gen_runpath29, realArray(), SYM(intersections), formal(primPath(), SYM(p), false, false), formal(primPair(), SYM(a), false, true), formal(primPair(), SYM(b), false, true), formal(primReal(), SYM(fuzz), true, false)); #line 250 "./runpath.in" addFunc(ve, run::gen_runpath30, primPair(), SYM(extension), formal(primPair(), SYM(p), false, false), formal(primPair(), SYM(q), false, false), formal(primPair(), SYM(p), false, false), formal(primPair(), SYM(q), false, false)); #line 261 "./runpath.in" addFunc(ve, run::gen_runpath31, primInt(), SYM(size), formal(primPath(), SYM(p), false, false)); #line 266 "./runpath.in" addFunc(ve, run::gen_runpath32, primPath(), SYM_AMPERSAND, formal(primPath(), SYM(p), false, false), formal(primPath(), SYM(q), false, false)); #line 271 "./runpath.in" addFunc(ve, run::gen_runpath33, primPair(), SYM(min), formal(primPath(), SYM(p), false, true)); #line 276 "./runpath.in" addFunc(ve, run::gen_runpath34, primPair(), SYM(max), formal(primPath(), SYM(p), false, true)); #line 281 "./runpath.in" addFunc(ve, run::gen_runpath35, primInt(), SYM(size), formal(pathArray(), SYM(p), false, false)); #line 290 "./runpath.in" addFunc(ve, run::gen_runpath36, primPair(), SYM(min), formal(pathArray(), SYM(p), false, false)); #line 314 "./runpath.in" addFunc(ve, run::gen_runpath37, primPair(), SYM(max), formal(pathArray(), SYM(p), false, false)); #line 338 "./runpath.in" addFunc(ve, run::gen_runpath38, primPair(), SYM(minAfterTransform), formal(primTransform(), SYM(t), false, false), formal(pathArray(), SYM(p), false, false)); #line 362 "./runpath.in" addFunc(ve, run::gen_runpath39, primPair(), SYM(maxAfterTransform), formal(primTransform(), SYM(t), false, false), formal(pathArray(), SYM(p), false, false)); #line 386 "./runpath.in" addFunc(ve, run::gen_runpath40, realArray(), SYM(mintimes), formal(primPath(), SYM(p), false, false)); #line 395 "./runpath.in" addFunc(ve, run::gen_runpath41, realArray(), SYM(maxtimes), formal(primPath(), SYM(p), false, false)); #line 404 "./runpath.in" addFunc(ve, run::gen_runpath42, primReal(), SYM(relativedistance), formal(primReal(), SYM(theta), false, false), formal(primReal(), SYM(phi), false, false), formal(primReal(), SYM(t), false, false), formal(primBoolean(), SYM(atleast), false, false)); #line 409 "./runpath.in" addFunc(ve, run::gen_runpath43, primInt(), SYM(windingnumber), formal(pathArray(), SYM(p), false, false), formal(primPair(), SYM(z), false, false)); #line 414 "./runpath.in" addFunc(ve, run::gen_runpath44, primBoolean(), SYM(inside), formal(pathArray(), SYM(g), false, true), formal(primPair(), SYM(z), false, false), formal(primPen(), SYM(fillrule), true, false)); #line 419 "./runpath.in" addFunc(ve, run::gen_runpath45, primBoolean(), SYM(inside), formal(primPath(), SYM(g), false, false), formal(primPair(), SYM(z), false, false), formal(primPen(), SYM(fillrule), true, false)); #line 424 "./runpath.in" addFunc(ve, run::gen_runpath46, primReal(), SYM(orient), formal(primPair(), SYM(a), false, false), formal(primPair(), SYM(b), false, false), formal(primPair(), SYM(c), false, false)); #line 438 "./runpath.in" addFunc(ve, run::gen_runpath47, primReal(), SYM(incircle), formal(primPair(), SYM(a), false, false), formal(primPair(), SYM(b), false, false), formal(primPair(), SYM(c), false, false), formal(primPair(), SYM(d), false, false)); } } // namespace trans asymptote-3.05/stm.h0000644000000000000000000001211115031566105013136 0ustar rootroot/***** * stm.h * Andy Hammerlindl 2002/8/30 * * Statements are objects in the language that do something on their * own. Statements are different from declarations in that statements * do not modify the environment. Translation of a statements puts the * stack code to run it into the instruction stream. *****/ #ifndef STM_H #define STM_H #include "types.h" #include "symbol.h" #include "dec.h" namespace trans { class coenv; } namespace absyntax { using trans::coenv; using sym::symbol; class stm : public runnable { public: stm(position pos) : runnable(pos) {} void prettyprint(ostream &out, Int indent); void transAsField(coenv &e, record *) { // Ignore the record. trans(e); } void trans(coenv &e) = 0; }; class emptyStm : public stm { public: emptyStm(position pos) : stm(pos) {} void prettyprint(ostream &out, Int indent); void trans(coenv &) {} }; // Wrapper around a block to use it as a statement. class blockStm : public stm { block *base; public: blockStm(position pos, block *base) : stm(pos), base(base) {} void prettyprint(ostream &out, Int indent) override; void trans(coenv &e) override { return base->trans(e); } // A block is guaranteed to return iff its last statement is // guaranteed to return. bool returns() override { return base->returns(); } void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; // A statement that consist of a single expression to evaluate. class expStm : public stm { exp *body; public: expStm(position pos, exp *body) : stm(pos), body(body) {} void prettyprint(ostream &out, Int indent) override; void trans(coenv &e) override; // Should be called when running an expStm at the interactive prompt. // The code will "write" the value of the expression at the prompt if // possible. void interactiveTrans(coenv &e) override; void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; class ifStm : public stm { exp *test; stm *onTrue; stm *onFalse; public: ifStm(position pos, exp *test, stm* onTrue, stm* onFalse = 0) : stm(pos), test(test), onTrue(onTrue), onFalse(onFalse) {} void prettyprint(ostream &out, Int indent) override; void trans(coenv &e) override; // An if statement is guaranteed to return iff both its pieces are // guaranteed to return. bool returns() override { if (onTrue == 0 || onFalse == 0) return false; return onTrue->returns() && onFalse->returns(); } void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; class whileStm : public stm { exp *test; stm *body; public: whileStm(position pos, exp *test, stm *body) : stm(pos), test(test), body(body) {} void prettyprint(ostream &out, Int indent) override; void trans(coenv &e) override; void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; class doStm : public stm { stm *body; exp *test; public: doStm(position pos, stm *body, exp *test) : stm(pos), body(body), test(test) {} void prettyprint(ostream &out, Int indent) override; void trans(coenv &e) override; void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; class forStm : public stm { runnable *init; exp *test; runnable *update; stm *body; public: forStm(position pos, runnable *init, exp *test, runnable *update, stm *body) : stm(pos), init(init), test(test), update(update), body(body) {} void prettyprint(ostream &out, Int indent) override; void trans(coenv &e) override; void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; class extendedForStm : public stm { astType *start; symbol var; exp *set; stm *body; public: extendedForStm(position pos, astType *start, symbol var, exp *set, stm *body) : stm(pos), start(start), var(var), set(set), body(body) {} void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; void prettyprint(ostream &out, Int indent) override; void trans(coenv &e) override; }; class breakStm : public stm { public: breakStm(position pos) : stm(pos) {} void prettyprint(ostream &out, Int indent) override; void trans(coenv &e) override; }; class continueStm : public stm { public: continueStm(position pos) : stm(pos) {} void prettyprint(ostream &out, Int indent) override; void trans(coenv &e) override; }; class returnStm : public stm { exp *value; public: returnStm(position pos, exp *value = 0) : stm(pos), value(value) {} void prettyprint(ostream &out, Int indent) override; void trans(coenv &e) override; // A return statement is, of course, guaranteed to return. bool returns() override { return true; } void createSymMap(AsymptoteLsp::SymbolContext* symContext) override; }; // Used at the start of for loops. class stmExpList : public stm { mem::list stms; public: stmExpList(position pos) : stm(pos) {} // To ensure list deallocates properly. virtual ~stmExpList() {} void add(stm *s) { stms.push_back(s); } void prettyprint(ostream &out, Int indent); void trans(coenv &e); }; } // namespace absyntax #endif asymptote-3.05/drawsurface.h0000644000000000000000000005607115031566105014656 0ustar rootroot/***** * drawsurface.h * * Stores a surface that has been added to a picture. *****/ #ifndef DRAWSURFACE_H #define DRAWSURFACE_H #include "drawelement.h" #include "arrayop.h" #include "path3.h" #include "beziercurve.h" #include "bezierpatch.h" namespace run { void inverse(double *a, size_t n); } const string need3pens="array of 3 pens required"; namespace camp { #ifdef HAVE_LIBGLM void storecolor(GLfloat *colors, int i, const vm::array &pens, int j); #endif class drawSurface : public drawElement { protected: triple *controls; size_t ncontrols; triple center; bool straight; // True iff Bezier patch is planar and has straight edges. prc::RGBAColour diffuse; prc::RGBAColour emissive; prc::RGBAColour specular; prc::RGBAColour *colors; double opacity; double shininess; double metallic; double fresnel0; bool invisible; size_t centerIndex; Interaction interaction; bool billboard; triple Min,Max; int digits; bool primitive; public: #ifdef HAVE_GL BezierCurve C; bool transparent; #endif string wrongsize() { return (ncontrols == 16 ? "4x4" : "triangular")+ string(" array of triples and array of 4 pens required"); } void init() { billboard=interaction == BILLBOARD; centerIndex=0; } drawSurface(const vm::array& g, size_t ncontrols, const triple& center, bool straight, const vm::array&p, double opacity, double shininess, double metallic, double fresnel0, const vm::array &pens, Interaction interaction, int digits, bool primitive=true, const string& key="") : drawElement(key), ncontrols(ncontrols), center(center), straight(straight), opacity(opacity), shininess(shininess), metallic(metallic), fresnel0(fresnel0), interaction(interaction), digits(digits), primitive(primitive) { init(); if(checkArray(&g) != 4 || checkArray(&p) != 3) reportError(wrongsize()); size_t k=0; controls=new(UseGC) triple[ncontrols]; for(unsigned int i=0; i < 4; ++i) { vm::array *gi=vm::read(g,i); size_t n=(ncontrols == 16 ? 4 : i+1); if(checkArray(gi) != n) reportError(wrongsize()); for(unsigned int j=0; j < n; ++j) controls[k++]=vm::read(gi,j); } pen surfacepen=vm::read(p,0); invisible=surfacepen.invisible(); diffuse=rgba(surfacepen); emissive=rgba(vm::read(p,1)); specular=rgba(vm::read(p,2)); size_t nodes=(ncontrols == 16 ? 4 : 3); size_t size=checkArray(&pens); if(size > 0) { if(size != nodes) reportError("one vertex pen required per node"); colors=new(UseGC) prc::RGBAColour[nodes]; for(size_t i=0; i < nodes; ++i) colors[i]=rgba(vm::read(pens,i)); } else colors=NULL; } drawSurface(const double* t, const drawSurface *s) : drawElement(s->KEY), ncontrols(s->ncontrols), straight(s->straight), diffuse(s->diffuse), emissive(s->emissive), specular(s->specular), colors(s->colors), opacity(s->opacity), shininess(s->shininess), metallic(s->metallic), fresnel0(s->fresnel0), invisible(s->invisible), interaction(s->interaction), digits(s->digits), primitive(s->primitive) { init(); if(s->controls) { controls=new(UseGC) triple[ncontrols]; for(unsigned int i=0; i < ncontrols; ++i) controls[i]=t*s->controls[i]; } else controls=NULL; center=t*s->center; } double renderResolution() { double prerender=settings::getSetting("prerender"); if(prerender <= 0.0) return 0.0; prerender=1.0/prerender; double perspective=gl::orthographic ? 0.0 : 1.0/gl::Zmax; double s=perspective ? Min.getz()*perspective : 1.0; // Move to glrender triple b(gl::Xmin,gl::Ymin,gl::Zmin); triple B(gl::Xmax,gl::Ymax,gl::Zmax); pair size3(s*(B.getx()-b.getx()),s*(B.gety()-b.gety())); pair size2(gl::fullWidth,gl::fullHeight); return prerender*size3.length()/size2.length(); } virtual ~drawSurface() {} bool is3D() {return true;} }; class drawBezierPatch : public drawSurface { public: #ifdef HAVE_LIBGLM BezierPatch S; #endif drawBezierPatch(const vm::array& g, const triple& center, bool straight, const vm::array&p, double opacity, double shininess, double metallic, double fresnel0, const vm::array &pens, Interaction interaction, int digits, bool primitive) : drawSurface(g,16,center,straight,p,opacity,shininess,metallic,fresnel0, pens,interaction,digits,primitive) {} drawBezierPatch(const double* t, const drawBezierPatch *s) : drawSurface(t,s) {} void bounds(const double* t, bbox3& b); void ratio(const double* t, pair &b, double (*m)(double, double), double fuzz, bool &first); void meshinit() { if(billboard) centerIndex=centerindex(center); } bool write(prcfile *out, unsigned int *, double, groupsmap&); bool write(abs3Doutfile *out); void render(double, const triple& b, const triple& B, double perspective, bool remesh); drawElement *transformed(const double* t); }; class drawBezierTriangle : public drawSurface { public: #ifdef HAVE_LIBGLM BezierTriangle S; #endif drawBezierTriangle(const vm::array& g, const triple& center, bool straight, const vm::array&p, double opacity, double shininess, double metallic, double fresnel0, const vm::array &pens, Interaction interaction, int digits, bool primitive) : drawSurface(g,10,center,straight,p,opacity,shininess,metallic,fresnel0, pens,interaction,digits,primitive) {} drawBezierTriangle(const double* t, const drawBezierTriangle *s) : drawSurface(t,s) {} void bounds(const double* t, bbox3& b); void ratio(const double* t, pair &b, double (*m)(double, double), double fuzz, bool &first); void meshinit() { if(billboard) centerIndex=centerindex(center); } bool write(prcfile *out, unsigned int *, double, groupsmap&); bool write(abs3Doutfile *out); void render(double, const triple& b, const triple& B, double perspective, bool remesh); drawElement *transformed(const double* t); }; class drawNurbs : public drawElement { protected: size_t udegree,vdegree; size_t nu,nv; triple *controls; double *weights; double *uknots, *vknots; prc::RGBAColour diffuse; prc::RGBAColour emissive; prc::RGBAColour specular; double opacity; double shininess; double metallic; double fresnel0; triple normal; bool invisible; triple Min,Max; #ifdef HAVE_LIBGLM GLfloat *colors; GLfloat *Controls; GLfloat *uKnots; GLfloat *vKnots; #endif public: drawNurbs(const vm::array& g, const vm::array* uknot, const vm::array* vknot, const vm::array* weight, const vm::array&p, double opacity, double shininess, double metallic, double fresnel0, const vm::array &pens, const string& key="") : drawElement(key), opacity(opacity), shininess(shininess), metallic(metallic), fresnel0(fresnel0) { size_t weightsize=checkArray(weight); const string wrongsize="Inconsistent NURBS data"; nu=checkArray(&g); if(nu == 0 || (weightsize != 0 && weightsize != nu) || checkArray(&p) != 3) reportError(wrongsize); vm::array *g0=vm::read(g,0); nv=checkArray(g0); size_t n=nu*nv; controls=new(UseGC) triple[n]; size_t k=0; for(size_t i=0; i < nu; ++i) { vm::array *gi=vm::read(g,i); if(checkArray(gi) != nv) reportError(wrongsize); for(size_t j=0; j < nv; ++j) controls[k++]=vm::read(gi,j); } if(weightsize > 0) { size_t k=0; weights=new(UseGC) double[n]; for(size_t i=0; i < nu; ++i) { vm::array *weighti=vm::read(weight,i); if(checkArray(weighti) != nv) reportError(wrongsize); for(size_t j=0; j < nv; ++j) weights[k++]=vm::read(weighti,j); } } else weights=NULL; size_t nuknots=checkArray(uknot); size_t nvknots=checkArray(vknot); if(nuknots <= nu+1 || nuknots > 2*nu || nvknots <= nv+1 || nvknots > 2*nv) reportError(wrongsize); udegree=nuknots-nu-1; vdegree=nvknots-nv-1; run::copyArrayC(uknots,uknot,0,UseGC); run::copyArrayC(vknots,vknot,0,UseGC); pen surfacepen=vm::read(p,0); invisible=surfacepen.invisible(); diffuse=rgba(surfacepen); emissive=rgba(vm::read(p,1)); specular=rgba(vm::read(p,2)); #ifdef HAVE_LIBGLM Controls=NULL; int size=checkArray(&pens); if(size > 0) { colors=new(UseGC) GLfloat[16]; if(size != 4) reportError(wrongsize); storecolor(colors,0,pens,0); storecolor(colors,8,pens,1); storecolor(colors,12,pens,2); storecolor(colors,4,pens,3); } else colors=NULL; #endif } drawNurbs(const double* t, const drawNurbs *s) : drawElement(s->KEY), udegree(s->udegree), vdegree(s->vdegree), nu(s->nu), nv(s->nv), weights(s->weights), uknots(s->uknots), vknots(s->vknots), diffuse(s->diffuse), emissive(s->emissive), specular(s->specular), opacity(s->opacity), shininess(s->shininess), invisible(s->invisible) { const size_t n=nu*nv; controls=new(UseGC) triple[n]; for(unsigned int i=0; i < n; ++i) controls[i]=t*s->controls[i]; #ifdef HAVE_LIBGLM Controls=NULL; colors=s->colors; #endif } bool is3D() {return true;} void bounds(const double* t, bbox3& b); virtual ~drawNurbs() {} bool write(prcfile *out, unsigned int *, double, groupsmap&); void displacement(); void ratio(const double* t, pair &b, double (*m)(double, double), double, bool &first); void render(double size2, const triple& b, const triple& B, double perspective, bool remesh); drawElement *transformed(const double* t); }; // Draw a transformed PRC object. class drawPRC : public drawElementLC { protected: prc::RGBAColour diffuse; prc::RGBAColour emissive; prc::RGBAColour specular; double opacity; double shininess; double metallic; double fresnel0; bool invisible; public: void init(const vm::array&p) { if(checkArray(&p) != 3) reportError(need3pens); pen surfacepen=vm::read(p,0); invisible=surfacepen.invisible(); diffuse=rgba(surfacepen); emissive=rgba(vm::read(p,1)); specular=rgba(vm::read(p,2)); } drawPRC(const vm::array& t, const vm::array&p, double opacity, double shininess, double metallic, double fresnel0) : drawElementLC(t), opacity(opacity), shininess(shininess), metallic(metallic), fresnel0(fresnel0) { init(p); } drawPRC(const vm::array&p, double opacity, double shininess, double metallic, double fresnel0) : drawElementLC(NULL), opacity(opacity), shininess(shininess), metallic(metallic), fresnel0(fresnel0) { init(p); } drawPRC(const double* t, const drawPRC *s) : drawElementLC(t,s), diffuse(s->diffuse), emissive(s->emissive), specular(s->specular), opacity(s->opacity), shininess(s->shininess), metallic(s->metallic), fresnel0(s->fresnel0), invisible(s->invisible) { } virtual void P(triple& t, double x, double y, double z); virtual bool write(prcfile *out, unsigned int *, double, groupsmap&) override { return true; } virtual bool write(abs3Doutfile *out) override {return true;} virtual void transformedbounds(const double*, bbox3&) {} virtual void transformedratio(const double*, pair&, double (*)(double, double), double, bool&) {} }; // Output a unit sphere primitive. class drawSphere : public drawPRC { bool half; int type; public: drawSphere(const vm::array& t, bool half, const vm::array&p, double opacity, double shininess, double metallic, double fresnel0, int type) : drawPRC(t,p,opacity,shininess,metallic,fresnel0), half(half), type(type) {} drawSphere(const double* t, const drawSphere *s) : drawElement(s->KEY), drawPRC(t,s), half(s->half), type(s->type) {} void P(triple& t, double x, double y, double z); bool write(prcfile *out, unsigned int *, double, groupsmap&); bool write(abs3Doutfile *out); drawElement *transformed(const double* t) { return new drawSphere(t,this); } }; // Output a unit cylinder primitive. class drawCylinder : public drawPRC { bool core; public: drawCylinder(const vm::array& t, const vm::array&p, double opacity, double shininess, double metallic, double fresnel0, bool core=false) : drawPRC(t,p,opacity,shininess,metallic,fresnel0), core(core) {} drawCylinder(const double* t, const drawCylinder *s) : drawElement(s->KEY), drawPRC(t,s), core(s->core) {} bool write(prcfile *out, unsigned int *, double, groupsmap&) override; bool write(abs3Doutfile *out) override; drawElement *transformed(const double* t) override { return new drawCylinder(t,this); } }; // Draw a unit disk. class drawDisk : public drawPRC { public: drawDisk(const vm::array& t, const vm::array&p, double opacity, double shininess, double metallic, double fresnel0) : drawPRC(t,p,opacity,shininess,metallic,fresnel0) {} drawDisk(const double* t, const drawDisk *s) : drawElement(s->KEY), drawPRC(t,s) {} bool write(prcfile *out, unsigned int *, double, groupsmap&) override; bool write(abs3Doutfile *out) override; drawElement *transformed(const double* t) override { return new drawDisk(t,this); } }; // Draw a tube. class drawTube : public drawPRC { protected: triple *g; double width; triple m,M; bool core; public: drawTube(const vm::array&G, double width, const vm::array&p, double opacity, double shininess, double metallic, double fresnel0, const triple& m, const triple& M, bool core) : drawPRC(p,opacity,shininess,metallic,fresnel0), width(width), m(m), M(M), core(core) { if(vm::checkArray(&G) != 4) reportError("array of 4 triples required"); g=new(UseGC) triple[4]; for(size_t i=0; i < 4; ++i) g[i]=vm::read(G,i); } drawTube(const double* t, const drawTube *s) : drawElement(s->KEY), drawPRC(t,s), width(s->width), m(s->m), M(s->M), core(s->core) { g=new(UseGC) triple[4]; for(size_t i=0; i < 4; ++i) g[i]=t*s->g[i]; } bool write(abs3Doutfile *out) override; drawElement *transformed(const double* t) override { return new drawTube(t,this); } }; class drawBaseTriangles : public drawElement { protected: #ifdef HAVE_LIBGLM Triangles R; bool transparent; #endif public: bool billboard; size_t nP; triple* P; triple center; size_t nN; triple* N; size_t nI; size_t Ni; uint32_t (*PI)[3]; uint32_t (*NI)[3]; size_t centerIndex; Interaction interaction; triple Min,Max; static const string wrongsize; static const string outofrange; public: void init() { billboard=interaction == BILLBOARD; centerIndex=0; } drawBaseTriangles(const vm::array& v, const vm::array& vi, const triple& center, const vm::array& n, const vm::array& ni, Interaction interaction) : center(center), interaction(interaction) { init(); nP=checkArray(&v); P=new(UseGC) triple[nP]; for(size_t i=0; i < nP; ++i) P[i]=vm::read(v,i); nI=checkArray(&vi); PI=new(UseGC) uint32_t[nI][3]; for(size_t i=0; i < nI; ++i) { vm::array *vii=vm::read(vi,i); if(checkArray(vii) != 3) reportError(wrongsize); uint32_t *PIi=PI[i]; for(size_t j=0; j < 3; ++j) { size_t index=unsignedcast(vm::read(vii,j)); if(index >= nP) reportError(outofrange); PIi[j]=index; } } nN=checkArray(&n); if(nN) { N=new(UseGC) triple[nN]; for(size_t i=0; i < nN; ++i) N[i]=vm::read(n,i); Ni=checkArray(&ni); if(Ni == 0 && nN == nP) NI=PI; else { if(Ni != nI) reportError("Index arrays have different lengths"); NI=new(UseGC) uint32_t[nI][3]; for(size_t i=0; i < nI; ++i) { vm::array *nii=vm::read(ni,i); if(checkArray(nii) != 3) reportError(wrongsize); uint32_t *NIi=NI[i]; for(size_t j=0; j < 3; ++j) { size_t index=unsignedcast(vm::read(nii,j)); if(index >= nN) reportError(outofrange); NIi[j]=index; } } } } else Ni=0; } #ifdef HAVE_LIBGLM drawBaseTriangles(const vertexBuffer& vb, const triple& center, Interaction interaction, bool isColor, const triple& Min, const triple& Max) : transparent(false), nP(isColor ? vb.Vertices.size() : vb.vertices.size()), center(center), nN(nP), nI(vb.indices.size()/3), Ni(0), interaction(interaction), Min(Min), Max(Max) { init(); assert(vb.indices.size() % 3 == 0); P=new(UseGC) triple[nP]; N=new(UseGC) triple[nN]; if(!isColor) { for (size_t i=0; i < vb.vertices.size(); ++i) { P[i]=triple(vb.vertices[i].position[0], vb.vertices[i].position[1], vb.vertices[i].position[2]); N[i]=triple(vb.vertices[i].normal[0], vb.vertices[i].normal[1], vb.vertices[i].normal[2]); } } else { for (size_t i=0; i < vb.Vertices.size(); ++i) { P[i]=triple(vb.Vertices[i].position[0], vb.Vertices[i].position[1], vb.Vertices[i].position[2]); N[i]=triple(vb.Vertices[i].normal[0], vb.Vertices[i].normal[1], vb.Vertices[i].normal[2]); } } PI=new(UseGC) uint32_t[nI][3]; for (size_t i=0; i < nI; ++i) { PI[i][0]=vb.indices[3 * i]; PI[i][1]=vb.indices[3 * i + 1]; PI[i][2]=vb.indices[3 * i + 2]; } NI=PI; } #endif drawBaseTriangles(const double* t, const drawBaseTriangles *s) : drawElement(s->KEY), nP(s->nP), nN(s->nN), nI(s->nI), Ni(s->Ni), interaction(s->interaction) { init(); P=new(UseGC) triple[nP]; for(size_t i=0; i < nP; i++) P[i]=t*s->P[i]; PI=new(UseGC) uint32_t[nI][3]; for(size_t i=0; i < nI; ++i) { uint32_t *PIi=PI[i]; uint32_t *sPIi=s->PI[i]; for(size_t j=0; j < 3; ++j) PIi[j]=sPIi[j]; } center=t*s->center; if(nN) { N=new(UseGC) triple[nN]; if(t == NULL) { for(size_t i=0; i < nN; i++) N[i]=s->N[i]; } else { double T[]={t[0],t[4],t[8], t[1],t[5],t[9], t[2],t[6],t[10]}; run::inverse(T,3); for(size_t i=0; i < nN; i++) N[i]=unit(Transform3(s->N[i],T)); } if(Ni == 0) { NI=PI; } else { NI=new(UseGC) uint32_t[nI][3]; for(size_t i=0; i < nI; ++i) { uint32_t *NIi=NI[i]; uint32_t *sNIi=s->NI[i]; for(size_t j=0; j < 3; ++j) NIi[j]=sNIi[j]; } } } } bool is3D() {return true;} void bounds(const double* t, bbox3& b); void ratio(const double* t, pair &b, double (*m)(double, double), double fuzz, bool &first); void meshinit() { if(billboard) centerIndex=centerindex(center); } virtual ~drawBaseTriangles() {} drawElement *transformed(const double* t) { return new drawBaseTriangles(t,this); } }; class drawTriangles : public drawBaseTriangles { size_t nC; prc::RGBAColour*C; uint32_t (*CI)[3]; size_t Ci; // Asymptote material data prc::RGBAColour diffuse; prc::RGBAColour emissive; prc::RGBAColour specular; double opacity; double shininess; double metallic; double fresnel0; bool invisible; public: drawTriangles(const vm::array& v, const vm::array& vi, const triple& center, const vm::array& n, const vm::array& ni, const vm::array&p, double opacity, double shininess, double metallic, double fresnel0, const vm::array& c, const vm::array& ci, Interaction interaction) : drawBaseTriangles(v,vi,center,n,ni,interaction), opacity(opacity), shininess(shininess), metallic(metallic), fresnel0(fresnel0) { if(checkArray(&p) != 3) reportError(need3pens); const pen surfacepen=vm::read(p,0); invisible=surfacepen.invisible(); diffuse=rgba(surfacepen); nC=checkArray(&c); if(nC) { C=new(UseGC) prc::RGBAColour[nC]; for(size_t i=0; i < nC; ++i) C[i]=rgba(vm::read(c,i)); size_t nI=checkArray(&vi); Ci=checkArray(&ci); if(Ci == 0 && nC == nP) CI=PI; else { if(Ci != nI) reportError("Index arrays have different lengths"); CI=new(UseGC) uint32_t[nI][3]; for(size_t i=0; i < nI; ++i) { vm::array *cii=vm::read(ci,i); if(checkArray(cii) != 3) reportError(wrongsize); uint32_t *CIi=CI[i]; for(size_t j=0; j < 3; ++j) { size_t index=unsignedcast(vm::read(cii,j)); if(index >= nC) reportError(outofrange); CIi[j]=index; } } } } else { emissive=rgba(vm::read(p,1)); } specular=rgba(vm::read(p,2)); } #ifdef HAVE_LIBGLM drawTriangles(vertexBuffer const& vb, const triple ¢er, bool isColor, prc::RGBAColour diffuse, prc::RGBAColour emissive, prc::RGBAColour specular, double opacity, double shininess, double metallic, double fresnel0, Interaction interaction, bool invisible, const triple& Min, const triple& Max) : drawBaseTriangles(vb,center,interaction,isColor,Min,Max), nC(isColor ? vb.Vertices.size() : 0), C(nullptr), CI(isColor ? PI : nullptr), Ci(isColor ? Ni : 0), diffuse(diffuse), emissive(emissive), specular(specular), opacity(opacity), shininess(shininess), metallic(metallic), fresnel0(fresnel0), invisible(invisible) { if(isColor) { C=new(UseGC) prc::RGBAColour[nC]; for(size_t i=0; i < nC; ++i) { C[i].Set(vb.Vertices[i].color[0], vb.Vertices[i].color[1], vb.Vertices[i].color[2], vb.Vertices[i].color[3]); } } } #endif drawTriangles(const double* t, const drawTriangles *s) : drawBaseTriangles(t,s), nC(s->nC), diffuse(s->diffuse), emissive(s->emissive), specular(s->specular), opacity(s->opacity), shininess(s->shininess), metallic(s->metallic), fresnel0(s->fresnel0), invisible(s->invisible) { if(nC) { C=new(UseGC) prc::RGBAColour[nC]; for(size_t i=0; i < nC; ++i) C[i]=s->C[i]; CI=new(UseGC) uint32_t[nI][3]; for(size_t i=0; i < nI; ++i) { uint32_t *CIi=CI[i]; uint32_t *sCIi=s->CI[i]; for(size_t j=0; j < 3; ++j) CIi[j]=sCIi[j]; } } } virtual ~drawTriangles() {} void render(double size2, const triple& b, const triple& B, double perspective, bool remesh); bool write(prcfile *out, unsigned int *, double, groupsmap&); bool write(abs3Doutfile *out); drawElement *transformed(const double* t) { return new drawTriangles(t,this); } }; } #endif asymptote-3.05/types.cc0000644000000000000000000003426115031566105013647 0ustar rootroot/***** * types.cc * Andy Hammerlindl 2002/06/24 * * Used by the compiler as a way to keep track of the type of a variable * or expression. *****/ #include #include #include "entry.h" #include "types.h" #include "runtime.h" #include "runarray.h" #include "runfile.h" #include "runpair.h" #include "runtriple.h" #include "access.h" #include "virtualfieldaccess.h" #include "asyprocess.h" namespace run { void arrayDeleteHelper(vm::stack *Stack); } // For pre-translated symbols. #ifndef NOSYM #include "types.symbols.h" #endif namespace types { const signature::OPEN_t signature::OPEN; /* Base types */ #define PRIMITIVE(name,Name,asyName) \ primitiveTy p##Name(ty_##name); \ ty *prim##Name() { return &p##Name; } \ array name##Array_(prim##Name()); \ ty *name##Array() { return &name##Array_; } \ array name##Array2_(name##Array()); \ ty *name##Array2() { return &name##Array2_; } \ array name##Array3_(name##Array2()); \ ty *name##Array3() { return &name##Array3_; } #define PRIMERROR #include "primitives.h" #undef PRIMERROR #undef PRIMITIVE nullTy pNull; ty *primNull() { return &pNull; } const char *names[] = { "null", "", "", "", #define PRIMITIVE(name,Name,asyName) #asyName, #define PRIMERROR #include "primitives.h" #undef PRIMERROR #undef PRIMITIVE "" }; ty::~ty() {} void ty::print(ostream& out) const { out << names[kind]; } // Used for primitive virtual fields and array virtual fields. #define FIELD(Type, name, func) \ if (sig == 0 && id == name) { \ static trans::virtualFieldAccess a(run::func); \ static trans::varEntry v(Type(), &a, 0, nullPos); \ return &v; \ } #define RWFIELD(Type, name, getter, setter) \ if (sig == 0 && id == name) { \ static trans::virtualFieldAccess a(run::getter, run::setter); \ static trans::varEntry v(Type(), &a, 0, nullPos); \ return &v; \ } #define SIGFIELD(Type, name, func) \ if (id == name && \ equivalent(sig, Type()->getSignature())) \ { \ static trans::virtualFieldAccess a(run::func, 0, run::func##Helper); \ static trans::varEntry v(Type(), &a, 0, nullPos); \ return &v; \ } #define DSIGFIELD(name, sym, func) \ if (id == sym && \ equivalent(sig, name##Type()->getSignature())) \ { \ static trans::virtualFieldAccess a(run::func, 0, run::func##Helper); \ /* for some fields, v needs to be dynamic */ \ /* e.g. when the function type depends on an array type. */ \ trans::varEntry *v = \ new trans::varEntry(name##Type(), &a, 0, nullPos); \ return v; \ } #define FILEFIELD(GetType, SetType, name, sym) \ FIELD(GetType,sym,name##Part); \ SIGFIELD(SetType,sym,name##Set); ty *dimensionType() { return new function(primFile(), formal(primInt(),SYM(nx),true), formal(primInt(),SYM(ny),true), formal(primInt(),SYM(nz),true)); } ty *modeType() { return new function(primFile(),formal(primBoolean(),SYM(b), true)); } ty *readType() { return new function(primFile(), formal(primInt(), SYM(i))); } trans::varEntry *primitiveTy::virtualField(symbol id, signature *sig) { switch (kind) { case ty_pair: FIELD(primReal,SYM(x),pairXPart); FIELD(primReal,SYM(y),pairYPart); break; case ty_triple: FIELD(primReal,SYM(x),tripleXPart); FIELD(primReal,SYM(y),tripleYPart); FIELD(primReal,SYM(z),tripleZPart); break; case ty_transform: FIELD(primReal,SYM(x),transformXPart); FIELD(primReal,SYM(y),transformYPart); FIELD(primReal,SYM(xx),transformXXPart); FIELD(primReal,SYM(xy),transformXYPart); FIELD(primReal,SYM(yx),transformYXPart); FIELD(primReal,SYM(yy),transformYYPart); break; case ty_tensionSpecifier: FIELD(primReal,SYM(out),tensionSpecifierOutPart); FIELD(primReal,SYM(in),tensionSpecifierInPart); FIELD(primBoolean,SYM(atLeast),tensionSpecifierAtleastPart); break; case ty_curlSpecifier: FIELD(primReal,SYM(value),curlSpecifierValuePart); FIELD(primInt,SYM(side),curlSpecifierSidePart); break; case ty_file: FIELD(primString,SYM(name),namePart); FIELD(primString,SYM(mode),modePart); FILEFIELD(IntArray,dimensionType,dimension,SYM(dimension)); FILEFIELD(primBoolean,modeType,line,SYM(line)); FILEFIELD(primBoolean,modeType,csv,SYM(csv)); FILEFIELD(primBoolean,modeType,word,SYM(word)); FILEFIELD(primBoolean,modeType,singlereal,SYM(singlereal)); FILEFIELD(primBoolean,modeType,singleint,SYM(singleint)); FILEFIELD(primBoolean,modeType,signedint,SYM(signedint)); SIGFIELD(readType,SYM(read),readSet); break; default: break; } return 0; } ty *overloadedDimensionType() { overloaded *o=new overloaded; o->add(dimensionType()); o->add(IntArray()); return o; } ty *overloadedModeType() { overloaded *o=new overloaded; o->add(modeType()); o->add(primBoolean()); return o; } ty *ty::virtualFieldGetType(symbol id) { trans::varEntry *v = virtualField(id, 0); return v ? v->getType() : 0; } ty *primitiveTy::virtualFieldGetType(symbol id) { if(kind == ty_file) { if (id == SYM(dimension)) return overloadedDimensionType(); if (id == SYM(line) || id == SYM(csv) || id == SYM(word) || id == SYM(singlereal) || id == SYM(singleint) || id == SYM(signedint)) return overloadedModeType(); if (id == SYM(read)) return readType(); } trans::varEntry *v = virtualField(id, 0); return v ? v->getType() : 0; } #define RETURN_STATIC_BLTIN(func) \ { \ static trans::bltinAccess a(run::func); \ return &a; \ } trans::access *nullTy::castTo(ty *target, caster &) { switch (target->kind) { case ty_array: { RETURN_STATIC_BLTIN(pushNullArray); } case ty_record: { RETURN_STATIC_BLTIN(pushNullRecord); } case ty_function: { RETURN_STATIC_BLTIN(pushNullFunction); } default: return 0; } } trans::access *array::initializer() { RETURN_STATIC_BLTIN(emptyArray) } ty *array::pushType() { if (pushtype == 0) pushtype = new function(celltype,formal(celltype,SYM(x))); return pushtype; } ty *array::popType() { if (poptype == 0) poptype = new function(celltype); return poptype; } ty *array::appendType() { if (appendtype == 0) appendtype = new function(primVoid(),formal(this,SYM(a))); return appendtype; } ty *array::insertType() { if (inserttype == 0) { function *f=new function(primVoid(),formal(primInt(),SYM(i))); f->addRest(this); inserttype = f; } return inserttype; } ty *array::deleteType() { if (deletetype == 0) deletetype = new function(primVoid(),formal(primInt(),SYM(i),true), formal(primInt(),SYM(j),true)); return deletetype; } ty *initializedType() { return new function(primBoolean(),formal(primInt(),SYM(i))); } #define SIGFIELDLIST \ ASIGFIELD(initialized, SYM(initialized), arrayInitialized); \ ASIGFIELD(push, SYM(push), arrayPush); \ ASIGFIELD(pop, SYM(pop), arrayPop); \ ASIGFIELD(append, SYM(append), arrayAppend); \ ASIGFIELD(insert, SYM(insert), arrayInsert); \ ASIGFIELD(delete, SYM(delete), arrayDelete); \ ty *array::virtualFieldGetType(symbol id) { #define ASIGFIELD(name, sym, func) \ if (id == sym) \ return name##Type(); SIGFIELDLIST #undef ASIGFIELD return ty::virtualFieldGetType(id); } trans::varEntry *array::virtualField(symbol id, signature *sig) { FIELD(primInt, SYM(length), arrayLength); FIELD(IntArray, SYM(keys), arrayKeys); RWFIELD(primBoolean, SYM(cyclic), arrayCyclicFlag, arraySetCyclicFlag); #define ASIGFIELD(name, sym, func) DSIGFIELD(name, sym, func) SIGFIELDLIST #undef ASIGFIELD // Fall back on base class to handle no match. return ty::virtualField(id, sig); } #undef SIGFIELDLIST void printFormal(ostream& out, const formal& f, bool keywordOnly) { if (f.Explicit) out << "explicit "; if (f.name) f.t->printVar(out, keywordOnly ? "keyword "+(string)(f.name) : f.name); else f.t->print(out); if (f.defval) out << "="; } ostream& operator<< (ostream& out, const formal& f) { #if 0 if (f.Explicit) out << "explicit "; if (f.name) f.t->printVar(out,f.name); else f.t->print(out); if (f.defval) out << "="; #endif printFormal(out, f, false); return out; } bool equivalent(const formal& f1, const formal& f2) { // Just test the types. // This cannot be used on rest formal with types equal to NULL. return equivalent(f1.t,f2.t); } bool argumentEquivalent(const formal &f1, const formal& f2) { if (f1.name == f2.name) { if (f1.t == 0) return f2.t == 0; else if (f2.t == 0) return false; return f1.t->kind != ty_overloaded && f2.t->kind != ty_overloaded && equivalent(f1.t, f2.t); } else return false; } string toString(const signature& s) { ostringstream out; for (size_t i = 0; i < s.formals.size(); ++i) { if (i > 0) out << ", "; printFormal(out, s.getFormal(i), s.formalIsKeywordOnly(i)); } if (s.rest.t) { if (!s.formals.empty()) out << " "; out << "... " << s.rest; } return out.str(); } ostream& operator<< (ostream& out, const signature& s) { if (s.isOpen) { out << "()"; return out; } out << "("; out << toString(s); out << ")"; return out; } // Equivalence by design does not look at the presence of default values. bool equivalent(const signature *s1, const signature *s2) { if (s1 == s2) return true; // Handle null signature if (s1 == 0 || s2 == 0) return false; // Two open signatures are always equivalent, as the formals are ignored. if (s1->isOpen) return s2->isOpen; else if (s2->isOpen) return false; if (s1->formals.size() != s2->formals.size()) { return false; } if (!std::equal(s1->formals.begin(),s1->formals.end(),s2->formals.begin(), (bool (*)(const formal&,const formal&)) equivalent)) return false; if (s1->rest.t) return s2->rest.t && equivalent(s1->rest, s2->rest); else return s2->rest.t == 0; } bool argumentEquivalent(const signature *s1, const signature *s2) { // Handle null signature if (s1 == 0) return s2 == 0; else if (s2 == 0) return false; if (s1->formals.size() != s2->formals.size()) return false; return std::equal(s1->formals.begin(),s1->formals.end(),s2->formals.begin(), (bool (*)(const formal&,const formal&)) argumentEquivalent) && argumentEquivalent(s1->rest, s2->rest); } size_t signature::hash() const { size_t x=2038; for (formal_vector::const_iterator i=formals.begin(); i!=formals.end(); ++i) x=x*0xFAEC+i->t->hash(); if (rest.t) x=x*0xACED +rest.t->hash(); return x; } size_t signature::handle() { processDataStruct *P=&processData(); size_t h=hash(); for(;;) { auto p=P->sigMap.find(h); if(p == P->sigMap.end()) { P->sigMap[h]=this; return h; } if(equivalent(p->second,this)) return h; ++h; } } trans::access *function::initializer() { RETURN_STATIC_BLTIN(pushNullFunction); } #if 0 ty *function::stripDefaults() { function *f = new function(result); Int n = sig.getNumFormals(); for (Int i = 0; i < n; ++i) f->add(sig.getFormal(i), 0); return f; } #endif // Only add a type with a signature distinct from the ones currently // in the overloaded type. void overloaded::addDistinct(ty *t, bool special) { if (t->kind == ty_overloaded) { overloaded *ot = (overloaded *)t; for (ty_vector::iterator st = ot->sub.begin(); st != ot->sub.end(); ++st) { this->addDistinct(*st, special); } } else { for (ty_vector::iterator st = this->sub.begin(); st != this->sub.end(); ++st) { if (equivalent(t, *st, special)) return; } // Nonequivalent in signature - add it. this->add(t); } } ty *overloaded::signatureless() { for(ty_vector::iterator t = sub.begin(); t != sub.end(); ++t) if ((*t)->getSignature()==0) return *t; return 0; } bool overloaded::castable(ty *target, caster &c) { for(ty_vector::iterator s = sub.begin(); s != sub.end(); ++s) if (c.castable(target,*s)) return true; return false; } bool equivalent(const ty *t1, const ty *t2) { // The same pointer must point to the same type. if (t1 == t2) return true; // Ensure if an overloaded type is compared to a non-overloaded one, that the // overloaded type's method is called. if (t2->kind == ty_overloaded) return t2->equiv(t1); if (t1->kind == ty_overloaded) return t1->equiv(t2); // Outside of overloaded types, different kinds mean different types. if (t1->kind != t2->kind) return false; return t1->equiv(t2); } bool equivalent(const ty *t1, const ty *t2, bool special) { return special ? equivalent(t1, t2) : equivalent(t1->getSignature(), t2->getSignature()); } #undef FIELD #undef RWFIELD #undef SIGFIELD #undef DSIGFIELD } // namespace types asymptote-3.05/path3.h0000644000000000000000000002452115031566105013362 0ustar rootroot/***** * path.h * John Bowman * * Stores a 3D piecewise cubic spline with known control points. * *****/ #ifndef PATH3_H #define PATH3_H #include #include "mod.h" #include "triple.h" #include "bbox3.h" #include "path.h" #include "arrayop.h" namespace camp { void checkEmpty3(Int n); // Used in the storage of solved path3 knots. struct solvedKnot3 : public gc { triple pre; triple point; triple post; bool straight; solvedKnot3() : straight(false) {} friend bool operator== (const solvedKnot3& p, const solvedKnot3& q) { return p.pre == q.pre && p.point == q.point && p.post == q.post; } }; class path3 : public gc { bool cycles; // If the path3 is closed in a loop Int n; // The number of knots mem::vector nodes; mutable double cached_length; // Cache length since path3 is immutable. mutable bbox3 box; mutable bbox3 times; // Times where minimum and maximum extents are attained. public: path3() : cycles(false), n(0), nodes(), cached_length(-1) {} // Create a path3 of a single point path3(triple z, bool = false) : cycles(false), n(1), nodes(1), cached_length(-1) { nodes[0].pre = nodes[0].point = nodes[0].post = z; nodes[0].straight = false; } // Creates path3 from a list of knots. This will be used by camp // methods such as the guide solver, but should probably not be used by a // user of the system unless he knows what he is doing. path3(mem::vector& nodes, Int n, bool cycles = false) : cycles(cycles), n(n), nodes(nodes), cached_length(-1) { } friend bool operator== (const path3& p, const path3& q) { return p.cycles == q.cycles && p.nodes == q.nodes; } public: path3(solvedKnot3 n1, solvedKnot3 n2) : cycles(false), n(2), nodes(2), cached_length(-1) { nodes[0] = n1; nodes[1] = n2; nodes[0].pre = nodes[0].point; nodes[1].post = nodes[1].point; } // Copy constructor path3(const path3& p) : cycles(p.cycles), n(p.n), nodes(p.nodes), cached_length(p.cached_length), box(p.box), times(p.times) {} path3 unstraighten() const { path3 P=path3(*this); for(int i=0; i < n; ++i) P.nodes[i].straight=false; return P; } virtual ~path3() { } // Getting control points Int size() const { return n; } bool empty() const { return n == 0; } Int length() const { return cycles ? n : n-1; } bool cyclic() const { return cycles; } mem::vector& Nodes() { return nodes; } bool straight(Int t) const { if (cycles) return nodes[imod(t,n)].straight; return (t >= 0 && t < n) ? nodes[t].straight : false; } bool piecewisestraight() const { Int L=length(); for(Int i=0; i < L; ++i) if(!straight(i)) return false; return true; } triple point(Int t) const { return nodes[adjustedIndex(t,n,cycles)].point; } triple point(double t) const; triple precontrol(Int t) const { return nodes[adjustedIndex(t,n,cycles)].pre; } triple precontrol(double t) const; triple postcontrol(Int t) const { return nodes[adjustedIndex(t,n,cycles)].post; } triple postcontrol(double t) const; inline double norm(const triple& z0, const triple& c0, const triple& c1, const triple& z1) const { return Fuzz2*camp::max((c0-z0).abs2(), camp::max((c1-z0).abs2(),(z1-z0).abs2())); } triple predir(Int t, bool normalize=true) const { if(!cycles && t <= 0) return triple(0,0,0); triple z1=point(t); triple c1=precontrol(t); triple dir=3.0*(z1-c1); if(!normalize) return dir; triple z0=point(t-1); triple c0=postcontrol(t-1); double epsilon=norm(z0,c0,c1,z1); if(dir.abs2() > epsilon) return unit(dir); dir=2.0*c1-c0-z1; if(dir.abs2() > epsilon) return unit(dir); return unit(z1-z0+3.0*(c0-c1)); } triple postdir(Int t, bool normalize=true) const { if(!cycles && t >= n-1) return triple(0,0,0); triple c0=postcontrol(t); triple z0=point(t); triple dir=3.0*(c0-z0); triple z1=point(t+1); triple c1=precontrol(t+1); double epsilon=norm(z0,c0,c1,z1); if(!normalize) return dir; if(dir.abs2() > epsilon) return unit(dir); dir=z0-2.0*c0+c1; if(dir.abs2() > epsilon) return unit(dir); return unit(z1-z0+3.0*(c0-c1)); } triple dir(Int t, Int sign, bool normalize=true) const { if(sign == 0) { triple v=predir(t,normalize)+postdir(t,normalize); return normalize ? unit(v) : 0.5*v; } if(sign > 0) return postdir(t,normalize); return predir(t,normalize); } triple dir(double t, bool normalize=true) const { if(!cycles) { if(t <= 0) return postdir((Int) 0,normalize); if(t >= n-1) return predir(n-1,normalize); } Int i=Floor(t); t -= i; if(t == 0) return dir(i,0,normalize); triple z0=point(i); triple c0=postcontrol(i); triple c1=precontrol(i+1); triple z1=point(i+1); triple a=3.0*(z1-z0)+9.0*(c0-c1); triple b=6.0*(z0+c1)-12.0*c0; triple c=3.0*(c0-z0); triple dir=a*t*t+b*t+c; if(!normalize) return dir; double epsilon=norm(z0,c0,c1,z1); if(dir.abs2() > epsilon) return unit(dir); dir=2.0*a*t+b; if(dir.abs2() > epsilon) return unit(dir); return unit(a); } triple postaccel(Int t) const { if(!cycles && t >= n-1) return triple(0,0,0); triple z0=point(t); triple c0=postcontrol(t); triple c1=precontrol(t+1); return 6.0*(z0+c1)-12.0*c0; } triple preaccel(Int t) const { if(!cycles && t <= 0) return triple(0,0,0); triple z0=point(t-1); triple c0=postcontrol(t-1); triple c1=precontrol(t); triple z1=point(t); return 6.0*(z1+c0)-12.0*c1; } triple accel(Int t, Int sign) const { if(sign == 0) return 0.5*(preaccel(t)+postaccel(t)); if(sign > 0) return postaccel(t); return preaccel(t); } triple accel(double t) const { if(!cycles) { if(t <= 0) return postaccel((Int) 0); if(t >= n-1) return preaccel(n-1); } Int i=Floor(t); t -= i; if(t == 0) return 0.5*(postaccel(i)+preaccel(i)); triple z0=point(i); triple c0=postcontrol(i); triple c1=precontrol(i+1); triple z1=point(i+1); return 6.0*t*(z1-z0+3.0*(c0-c1))+6.0*(z0+c1)-12.0*c0; } // Returns the path3 traced out in reverse. path3 reverse() const; // Generates a path3 that is a section of the old path3, using the time // interval given. path3 subpath(Int start, Int end) const; path3 subpath(double start, double end) const; // Special case of subpath used by intersect. void halve(path3 &first, path3 &second) const; // Used by picture to determine bounding box. bbox3 bounds() const; triple mintimes() const { checkEmpty3(n); bounds(); return camp::triple(times.leftBound,times.bottomBound,times.nearBound); } triple maxtimes() const { checkEmpty3(n); bounds(); return camp::triple(times.rightBound,times.topBound,times.farBound); } template void addpoint(bbox3& box, T i) const { box.addnonempty(point(i),times,(double) i); } double cubiclength(Int i, double goal=-1) const; double arclength () const; double arctime (double l) const; triple max() const { checkEmpty3(n); return bounds().Max(); } triple min() const { checkEmpty3(n); return bounds().Min(); } pair ratio(double (*m)(double, double)) const; // Increment count if the path3 has a vertical component at t. bool Count(Int& count, double t) const; // Count if t is in (begin,end] and z lies to the left of point(i+t). void countleft(Int& count, double x, Int i, double t, double begin, double end, double& mint, double& maxt) const; // Return the winding number of the region bounded by the (cyclic) path3 // relative to the point z. Int windingnumber(const triple& z) const; }; double arcLength(const triple& z0, const triple& c0, const triple& c1, const triple& z1); path3 transformed(const vm::array& t, const path3& p); path3 transformed(const double* t, const path3& p); extern path3 nullpath3; extern const unsigned maxdepth; bool intersect(double& S, double& T, path3& p, path3& q, double fuzz, unsigned depth=maxdepth); bool intersections(double& s, double& t, std::vector& S, std::vector& T, path3& p, path3& q, double fuzz, bool single, bool exact, unsigned depth=maxdepth); void intersections(std::vector& S, path3& g, const triple& p, const triple& q, double fuzz); bool intersections(std::vector& T, std::vector& U, std::vector& V, path3& p, triple *P, double fuzz, bool single, unsigned depth=maxdepth); bool intersections(double& U, double& V, const triple& v, triple *P, double fuzz, unsigned depth=maxdepth); // Concatenates two path3s into a new one. path3 concat(const path3& p1, const path3& p2); // return the perpendicular displacement of a point z from the line through // points p and q. inline triple displacement(const triple& z, const triple& p, const triple& q) { triple Z=z-p; triple Q=unit(q-p); return Z-dot(Z,Q)*Q; } typedef double bound_double(double *P, double (*m)(double, double), double b, double fuzz, int depth); typedef double bound_triple(triple *P, double (*m)(double, double), double (*f)(const triple&), double b, double fuzz, int depth); bound_double bound,boundtri; double bound(triple z0, triple c0, triple c1, triple z1, double (*m)(double, double), double (*f)(const triple&), double b, double fuzz, int depth=maxdepth); double bound(double *p, double (*m)(double, double), double b, double fuzz, int depth); double bound(triple *P, double (*m)(double, double), double (*f)(const triple&), double b, double fuzz, int depth); double boundtri(double *P, double (*m)(double, double), double b, double fuzz, int depth); double boundtri(triple *P, double (*m)(double, double), double (*f)(const triple&), double b, double fuzz, int depth); } #ifndef BROKEN_COMPILER // Delete the following line to work around problems with old broken compilers. GC_DECLARE_PTRFREE(camp::solvedKnot3); #endif #endif asymptote-3.05/vm.h0000644000000000000000000000137615031566105012770 0ustar rootroot/***** * vm.h * Tom Prince 2005/06/17 * * Interface to the virtual machine. *****/ #ifndef VM_H #define VM_H #include "errormsg.h" namespace vm { struct lambda; class stack; typedef void (*bltin)(stack *s); #ifdef DEBUG_BLTIN // This associates names to bltin functions, so that the output of 'asy -s' // can print the names of the bltin functions that appear in the bytecode. void registerBltin(bltin b, string s); string lookupBltin(bltin b); #define REGISTER_BLTIN(b, s) \ registerBltin((b), (s)) #else #define REGISTER_BLTIN(b, s) #endif void run(lambda *l); position getPos(); void errornothrow(const char* message); void error(const char* message); void error(const ostringstream& message); } // namespace vm #endif // VM_H asymptote-3.05/access.cc0000644000000000000000000000634115031566105013742 0ustar rootroot/***** * access.cc * Andy Hammerlindl 2003/12/03 * Describes an "access," a representation of where a variable will be * stored at runtime, so that read, write, and call instructions can be * made. *****/ #include "access.h" #include "frame.h" #include "coder.h" #include "callable.h" using vm::item; namespace trans { /* access */ access::~access() {} /* identAccess */ void identAccess::encode(action act, position pos, coder& e) { if (act != CALL) { access::encode(act, pos, e); } // else - do nothing } /* bltinAccess */ static void bltinError(position pos) { em.error(pos); em << "built-in functions cannot be modified"; } void bltinAccess::encode(action act, position pos, coder &e) { switch (act) { case READ: e.encode(inst::constpush,(item)(vm::callable*)new vm::bfunc(f)); break; case WRITE: bltinError(pos); break; case CALL: e.encode(inst::builtin, f); break; } } void bltinAccess::encode(action act, position pos, coder &e, frame *) { e.encode(inst::pop); encode(act, pos, e); } /* callableAccess */ void callableAccess::encode(action act, position pos, coder &e) { switch (act) { case READ: e.encode(inst::constpush, (item)f); break; case WRITE: bltinError(pos); break; case CALL: this->encode(READ, pos, e); e.encode(inst::popcall); break; } } void callableAccess::encode(action act, position pos, coder &e, frame *) { e.encode(inst::pop); encode(act, pos, e); } /* frameAccess */ void frameAccess::encode(action act, position pos, coder &e) { if (act == READ) { if (!e.encode(f)) { em.compiler(pos); em << "encoding frame out of context"; } } else access::encode(act, pos, e); } void frameAccess::encode(action act, position pos, coder &e, frame *top) { if (act == READ) { if (!e.encode(f, top)) { em.compiler(pos); em << "encoding frame out of context"; } } else access::encode(act, pos, e, top); } /* localAccess */ static void frameError(position pos) { // A local variable is being used when its frame is not active. em.error(pos); em << "static use of dynamic variable"; } void localAccess::encode(action act, position pos, coder &e) { // Get the active frame of the virtual machine. frame *active = e.getFrame(); if (level == active) { e.encode(act == WRITE ? inst::varsave : inst::varpush, offset); } else if (e.encode(level)) { e.encode(act == WRITE ? inst::fieldsave : inst::fieldpush, offset); } else { frameError(pos); } if (act == CALL) e.encode(inst::popcall); } void localAccess::encode(action act, position pos, coder &e, frame *top) { if (e.encode(level,top)) { e.encode(act == WRITE ? inst::fieldsave : inst::fieldpush, offset); if (act == CALL) e.encode(inst::popcall); } else { frameError(pos); } } void qualifiedAccess::encode(action act, position pos, coder &e) { qualifier->encode(READ, pos, e); field->encode(act, pos, e, qualifierLevel); } void qualifiedAccess::encode(action act, position pos, coder &e, frame *top) { qualifier->encode(READ, pos, e, top); field->encode(act, pos, e, qualifierLevel); } } // namespace trans asymptote-3.05/camp.l0000644000000000000000000003227715031566105013276 0ustar rootroot%{ /***** * camp.l * Andy Hammerlindl 2002/06/14 * * The lexical analyzer of the Asymptote language. *****/ #include #include #include #include #include "util.h" #include "modifier.h" #include "exp.h" #include "stm.h" #include "fundec.h" #include "errormsg.h" #include "interact.h" #include "lexical.h" using namespace absyntax; using mem::string; #include "camp.tab.h" #include "opsymbols.h" #define YY_NO_INPUT #define register static void yyunput(int, char *); void (*unused)(int,char *) = yyunput; fileinfo* fi; Int tokPos; Int charPos; //int commentDepth = 0; bool isEof; string eofMessage; extern errorstream em; extern "C" int yywrap(void) { charPos=1; return 1; } typedef size_t (*input_f) (char* bif, size_t max_size); input_f yy_input = NULL; void setlexer(input_f input, string filename) { YY_FLUSH_BUFFER; yywrap(); fi = new fileinfo(filename); yy_input = input; tokPos = charPos = 1; isEof=false; eofMessage=""; } #define YY_INPUT(buf,result,max_size) {result=yy_input(buf,max_size);} position lexerPos() { position p; p.init(fi, tokPos); return p; } namespace { position here() { return lexerPos(); } void adjust() { tokPos = charPos; charPos += yyleng; yylval.pos = here(); } void savesymbol(symbol name) { adjust(); yylval.ps.pos=yylval.pos; // avoid invoking here() twice yylval.ps.sym=name; } /* For optimization reasons, the operator names are translated into symbols * just once, and can be accessed throughout the code as SYM_PLUS, SYM_DASHES, * etc. Following the Don't Repeat Yourself principle, the mapping from * strings to names is defined only here in camp.l (because we can't produce * lex rules from a C style macro). * The script opsymbols.py reads this file scanning for rules using DEFSYMBOL * and creates opsymbols.h which defines the names for use in C++ code. */ #define DEFSYMBOL(name) \ savesymbol(name) /* Extra symbols can be added by EXTRASYMBOL */ #define EXTRASYMBOL(chars, codename) /* blank */ EXTRASYMBOL(tuple, SYM_TUPLE); void makesymbol() { assert(strlen(yytext) == (size_t)yyleng); savesymbol(symbol::rawTrans(yytext, yyleng+1)); } void makeopsymbol() { savesymbol(symbol::opTrans(yytext)); } void makemod(trans::modifier mod) { yylval.mod.pos=here(); yylval.mod.val=mod; } void makeperm(trans::permission perm) { yylval.perm.pos=here(); yylval.perm.val=perm; } void newline() { fi->newline(); charPos = tokPos = 1; } void error(void) { em.error(here()); } } // Used by the lexer rules to flag an unexpected end of input. The message is // the error message that should be reported, and may differ if, say the input // ends in the middle of a string or comment. void setEOF(string message) { isEof=true; eofMessage=message; } // Called by code outside of the lexer to see if a parse error was caused by // running out of input. bool lexerEOF() { return isEof; } // Called by code outside of the lexer when it wants to report the unexpected // eof as an error (instead of looking for more input). void reportEOF() { assert(isEof); error(); em << eofMessage; em.sync(true); } position stringpos; // The position of the start of the string. string stringbuild; // Stores the string literal as it is read. namespace { void startstring() { adjust(); stringpos = here(); } void append(char c) { stringbuild.push_back(c); yylval.pos = here(); } void getstring(void) { // NOTE: Replace here() with a position at the start of the string. yylval.stre = new stringExp(stringpos, stringbuild); string().swap(stringbuild); } } %} %x lexcomment %x texstring %x cstring %x lexformat %x opname LETTER [_A-Za-z] ESC \\ ENDL \\?(\r\n|\n|\r) EXTRAOPS <<|>>|$|$$|@|@@|~|<> %% { \/\* {adjust(); /*commentDepth++;*/} \*\/ {adjust(); /*commentDepth--;*/ /*if (commentDepth == 0)*/ BEGIN INITIAL; } \r\n|\n|\r {adjust(); newline(); continue; } <> {adjust(); setEOF("comment not terminated"); BEGIN INITIAL; return GARBAGE; } . {adjust(); continue; } } { \"/([ \t]|{ENDL})*[\"\'] {adjust(); BEGIN INITIAL;} \" {adjust(); BEGIN INITIAL; getstring(); return STRING; } <> {adjust(); setEOF("string not terminated"); BEGIN INITIAL; getstring(); return GARBAGE; } {ENDL} {adjust(); newline(); append('\n'); continue; } {ESC}{ESC} {adjust(); append('\\'); append('\\'); continue; } {ESC}\" {adjust(); append('\"'); continue; } . {adjust(); append(*yytext); } } { \'/([ \t]|{ENDL})*[\"\'] {adjust(); BEGIN INITIAL;} \' {adjust(); BEGIN INITIAL; getstring(); return STRING; } <> {adjust(); setEOF("string not terminated"); BEGIN INITIAL; getstring(); return GARBAGE; } {ENDL} {adjust(); newline(); append('\n'); continue; } {ESC}(\'|\"|\?|\\) {adjust(); append(yytext[1]); continue; } {ESC}a {adjust(); append('\a'); continue; } {ESC}b {adjust(); append('\b'); continue; } {ESC}f {adjust(); append('\f'); continue; } {ESC}n {adjust(); append('\n'); continue; } {ESC}r {adjust(); append('\r'); continue; } {ESC}t {adjust(); append('\t'); continue; } {ESC}v {adjust(); append('\v'); continue; } {ESC}[0-7] {adjust(); char x=(char)(yytext[1]-'0'); append(x); continue; } {ESC}[0-7][0-7] {adjust(); char x=(char)((yytext[1]-'0')*8+yytext[2]-'0'); append(x); continue; } {ESC}[0-3][0-7][0-7] {adjust(); char x=(char)((yytext[1]-'0')*64+(yytext[2]-'0')*8 +yytext[3]-'0'); append(x); continue; } {ESC}x[0-9,A-F] {adjust(); char x=(char) (yytext[2] <= '9' ? yytext[2]-'0' : 10+yytext[2]-'A'); append(x); continue; } {ESC}x[0-9,A-F][0-9,A-F] {adjust(); char x=(char) ((yytext[2] <= '9' ? yytext[2]-'0' : 10+yytext[2]-'A')*16 +(yytext[3] <= '9' ? yytext[3]-'0' : 10+yytext[3]-'A')); append(x); continue; } . {adjust(); append(*yytext); } } [ \t] {adjust(); continue;} {ENDL} {adjust(); newline(); continue;} \/\/[^\n]* {adjust(); continue;} "," {adjust(); return ','; } ":" {adjust(); return ':'; } ";" {adjust(); return ';'; } "(" {adjust(); return '('; } ")" {adjust(); return ')'; } "[" {adjust(); return '['; } "]" {adjust(); return ']'; } "{" {adjust(); return '{'; } "}" {adjust(); return '}'; } "." {adjust(); return '.'; } "..." {adjust(); return ELLIPSIS; } "+" {DEFSYMBOL(SYM_PLUS); return '+'; } "-" {DEFSYMBOL(SYM_MINUS); return '-'; } "*" {DEFSYMBOL(SYM_TIMES); return '*'; } "/" {DEFSYMBOL(SYM_DIVIDE); return '/'; } "#" {DEFSYMBOL(SYM_QUOTIENT); return '#'; } "%" {DEFSYMBOL(SYM_MOD); return '%'; } "^" {DEFSYMBOL(SYM_CARET); return '^'; } "**" {savesymbol(SYM_CARET); return '^'; } "?" {adjust(); return '?'; } "=" {adjust(); return ASSIGN; } "==" {DEFSYMBOL(SYM_EQ); return EQ; } "!=" {DEFSYMBOL(SYM_NEQ); return NEQ; } "<" {DEFSYMBOL(SYM_LT); return LT; } "<=" {DEFSYMBOL(SYM_LE); return LE; } ">" {DEFSYMBOL(SYM_GT); return GT; } ">=" {DEFSYMBOL(SYM_GE); return GE; } "&&" {DEFSYMBOL(SYM_CAND); return CAND; } "||" {DEFSYMBOL(SYM_COR); return COR; } "!" {DEFSYMBOL(SYM_LOGNOT); return OPERATOR; } "^^" {DEFSYMBOL(SYM_CARETS); return CARETS; } "::" {DEFSYMBOL(SYM_COLONS); return COLONS; } "++" {DEFSYMBOL(SYM_INCR); return INCR; } ".." {DEFSYMBOL(SYM_DOTS); return DOTS; } "--" {DEFSYMBOL(SYM_DASHES); return DASHES; } "---" {DEFSYMBOL(SYM_LONGDASH); return LONGDASH; } "&" {DEFSYMBOL(SYM_AMPERSAND); return AMPERSAND; } "|" {DEFSYMBOL(SYM_BAR); return BAR; } {EXTRAOPS} {makeopsymbol(); return OPERATOR; } "+=" {savesymbol(SYM_PLUS); return SELFOP; } "-=" {savesymbol(SYM_MINUS); return SELFOP; } "*=" {savesymbol(SYM_TIMES); return SELFOP; } "/=" {savesymbol(SYM_DIVIDE); return SELFOP; } "#=" {savesymbol(SYM_QUOTIENT); return SELFOP; } "%=" {savesymbol(SYM_MOD); return SELFOP; } "^=" {savesymbol(SYM_CARET); return SELFOP; } and {adjust(); return AND; } controls {DEFSYMBOL(SYM_CONTROLS); return CONTROLS; } tension {DEFSYMBOL(SYM_TENSION); return TENSION; } atleast {DEFSYMBOL(SYM_ATLEAST); return ATLEAST; } curl {DEFSYMBOL(SYM_CURL); return CURL; } if {adjust(); return IF; } else {adjust(); return ELSE; } while {adjust(); return WHILE; } for {adjust(); return FOR; } do {adjust(); return DO; } return {adjust(); return RETURN_; } break {adjust(); return BREAK; } continue {adjust(); return CONTINUE; } struct {adjust(); return STRUCT; } typedef {adjust(); return TYPEDEF; } using {adjust(); return USING; } new {adjust(); return NEW; } access {adjust(); return ACCESS; } import {adjust(); return IMPORT; } unravel {adjust(); return UNRAVEL; } from {adjust(); return FROM; } include {adjust(); return INCLUDE; } quote {adjust(); return QUOTE; } static {adjust(); makemod(trans::EXPLICIT_STATIC); return MODIFIER; } autounravel {adjust(); makemod(trans::AUTOUNRAVEL); return MODIFIER; } public {adjust(); makeperm(trans::PUBLIC); return PERM; } private {adjust(); makeperm(trans::PRIVATE); return PERM; } restricted {adjust(); makeperm(trans::RESTRICTED); return PERM; } this {adjust(); return THIS_TOK; } explicit {adjust(); return EXPLICIT; } [0-9]+ try { adjust(); yylval.e= new intExp(here(), lexical::cast(yytext)); } catch (lexical::bad_cast&) { error(); em << "invalid integer"; yylval.e= new intExp(here(), 0); } return LIT; ([0-9]*\.[0-9]+)|([0-9]+\.[0-9]*)|([0-9]*\.*[0-9]+e[-+]*[0-9]+)|([0-9]+\.[0-9]*e[-+]*[0-9]+) try { adjust(); yylval.e= new realExp(here(), lexical::cast(yytext)); } catch (lexical::bad_cast&) { error(); em << "invalid real"; yylval.e= new realExp(here(), 0); } return LIT; true { adjust(); yylval.e= new booleanExp(here(), true); return LIT; } false { adjust(); yylval.e= new booleanExp(here(), false); return LIT; } null { adjust(); yylval.e= new nullExp(here()); return LIT; } cycle { adjust(); yylval.e= new cycleExp(here()); return LIT; } newframe { adjust(); yylval.e= new newPictureExp(here()); return LIT; } operator {adjust(); BEGIN opname; } { [ \t\r] {adjust(); continue;} {ENDL} {adjust(); newline(); continue;} <> {adjust(); setEOF("missing operator name"); BEGIN INITIAL; return GARBAGE; } "**" { savesymbol(SYM_CARET); BEGIN INITIAL; return ID; } [-+*/#%^!<>]|==|!=|<=|>=|&|\||\^\^|\.\.|::|--|---|\+\+|{EXTRAOPS} { makeopsymbol(); BEGIN INITIAL; return ID;} {LETTER}({LETTER}|[0-9])* { makeopsymbol(); BEGIN INITIAL; return ID; } . {} } {LETTER}({LETTER}|[0-9])* { makesymbol(); return ID; } \/\* {adjust(); /*commentDepth = 1;*/ BEGIN lexcomment; } \" {startstring(); BEGIN texstring; } \' {startstring(); BEGIN cstring; } <> { setEOF("unexpected end of input"); yyterminate(); } . {adjust(); error(); em << "invalid token"; if (isgraph(yytext[0])) em << " '" << yytext[0] << "'"; } asymptote-3.05/runtriple.h0000644000000000000000000000041715031566132014365 0ustar rootroot/***** Autogenerated from runtriple.in; changes will be overwritten *****/ #pragma once namespace run { void tripleZero(vm::stack *); void realRealRealToTriple(vm::stack *); void tripleXPart(vm::stack *); void tripleYPart(vm::stack *); void tripleZPart(vm::stack *); } asymptote-3.05/makeUnique.h0000644000000000000000000000163015031566105014443 0ustar rootroot#pragma once #include #include #include #include #if __cplusplus < 201402L namespace utils { template struct _Unique_if { typedef std::unique_ptr _Single_object; }; template struct _Unique_if { typedef std::unique_ptr _Unknown_bound; }; template struct _Unique_if { typedef void _Known_bound; }; template typename _Unique_if::_Single_object make_unique(Args&&... args) { return std::unique_ptr(new T(std::forward(args)...)); } template typename _Unique_if::_Unknown_bound make_unique(size_t n) { typedef typename std::remove_extent::type U; return std::unique_ptr(new U[n]()); } template typename _Unique_if::_Known_bound make_unique(Args&&...) = delete; } using utils::make_unique; #else using std::make_unique; #endif asymptote-3.05/parallel.h0000644000000000000000000000250015031566105014130 0ustar rootroot#pragma once #ifndef _OPENMP #ifndef SINGLE_THREAD #define SINGLE_THREAD #endif #endif #ifndef SINGLE_THREAD #include #endif extern size_t threshold; namespace parallel { extern size_t lastThreads; inline size_t get_thread_num() { #ifdef SINGLE_THREAD return 0; #else return omp_get_thread_num(); #endif } inline size_t get_thread_num(size_t threads) { return threads > 1 ? get_thread_num() : 0; } inline size_t get_max_threads() { #ifdef SINGLE_THREAD return 1; #else return omp_get_max_threads(); #endif } } #ifndef SINGLE_THREAD #define PARALLEL(code) \ if(threads > 1) { \ _Pragma("omp parallel for num_threads(threads)") \ code \ } else {code} #else #define PARALLEL(code) {code} #endif #ifndef SINGLE_THREAD #define OMPIF(condition,directive,code) \ if(threads > 1 && condition) { \ _Pragma(directive) \ code \ } else {code} #else #define OMPIF(condition,directive,code) {code} #endif #define PARALLELIF(condition,code) \ OMPIF(condition,"omp parallel for num_threads(threads)",code) namespace parallel { void Threshold(size_t threads); } asymptote-3.05/varinit.cc0000644000000000000000000000372415031566105014157 0ustar rootroot/***** * varinit.cc * Andy Hammerlindl 2005/07/01 * * Variable initializer are syntax that finish code such as * int var = ... * As such, they are translated to yield a certain type, the type of the * variable. Expressions are a special case that can be translated without an * associated variable or its type. *****/ #include "varinit.h" #include "coenv.h" #include "runtime.h" #include "runarray.h" namespace absyntax { using namespace types; using namespace trans; void definit::prettyprint(ostream &out, Int indent) { prettyname(out, "definit",indent, getPos()); } void definit::transToType(coenv &e, types::ty *target) { if (target->kind != ty_error) { access *a=e.e.lookupInitializer(target); if (a) a->encode(action::CALL, getPos(), e.c); else { em.error(getPos()); em << "no default initializer for type '" << *target << "'"; } } } void arrayinit::prettyprint(ostream &out, Int indent) { prettyname(out, "arrayinit",indent, getPos()); for (mem::list::iterator p = inits.begin(); p != inits.end(); ++p) (*p)->prettyprint(out, indent+2); if (rest) rest->prettyprint(out, indent+1); } void arrayinit::transMaker(coenv &e, Int size, bool rest) { // Push the number of cells and call the array maker. e.c.encode(inst::intpush, size); e.c.encode(inst::builtin, rest ? run::newAppendedArray : run::newInitializedArray); } void arrayinit::transToType(coenv &e, types::ty *target) { types::ty *celltype; if (target->kind != types::ty_array) { em.error(getPos()); em << "array initializer used for non-array"; celltype = types::primError(); } else { celltype = ((types::array *)target)->celltype; } // Push the values on the stack. for (mem::list::iterator p = inits.begin(); p != inits.end(); ++p) (*p)->transToType(e, celltype); if (rest) rest->transToType(e, target); transMaker(e, (Int)inits.size(), (bool)rest); } } // namespace absyntax asymptote-3.05/coder.cc0000644000000000000000000002130215031566105013567 0ustar rootroot/***** * coder.cc * Andy Hammerlindl 2004/11/06 * * Handles encoding of syntax into programs. It's methods are called by * abstract syntax objects during translation to construct the virtual machine * code. *****/ #include #include "errormsg.h" #include "coder.h" #include "genv.h" #include "entry.h" #include "builtin.h" using namespace sym; using namespace types; namespace trans { namespace { function *inittype(); function *bootuptype(); } vm::lambda *newLambda(string name) { assert(!name.empty()); vm::lambda *l = new vm::lambda; #ifdef DEBUG_FRAME l->name = name; #endif return l; } // Used purely for global variables and static code blocks of file // level modules. coder::coder(position pos, string name, modifier sord) #ifdef SIMPLE_FRAME : level(frame::indirect_frame(name)), #else : level(new frame(name, 0, 0)), #endif recordLevel(0), recordType(0), isCodelet(false), l(newLambda(name)), funtype(bootuptype()), parent(0), sord(sord), perm(DEFAULT_PERM), program(new vm::program), curPos(pos) { sord_stack.push(sord); } // Defines a new function environment. coder::coder(position pos, string name, function *t, coder *parent, modifier sord, bool reframe) : level(reframe ? new frame(name, parent->getFrame(), t->sig.getNumFormals()) : parent->getFrame()), recordLevel(parent->recordLevel), recordType(parent->recordType), isCodelet(!reframe), l(newLambda(name)), funtype(t), parent(parent), sord(sord), perm(DEFAULT_PERM), program(new vm::program), curPos(pos) { sord_stack.push(sord); } // Start encoding the body of the record. The function being encoded // is the record's initializer. coder::coder(position pos, record *t, coder *parent, modifier sord) : level(t->getLevel()), recordLevel(t->getLevel()), recordType(t), isCodelet(false), l(t->getInit()), funtype(inittype()), parent(parent), sord(sord), perm(DEFAULT_PERM), program(new vm::program), curPos(pos) { sord_stack.push(sord); } coder coder::newFunction(position pos, string name, function *t, modifier sord) { return coder(pos, name, t, this, sord); } coder coder::newCodelet(position pos) { return coder(pos, "", new function(primVoid()), this, DEFAULT_DYNAMIC, false); } record *coder::newRecord(symbol id) { frame *underlevel = getFrame(); frame *level = new frame(id, underlevel, 0); record *r = new record(id, level); return r; } coder coder::newRecordInit(position pos, record *r, modifier sord) { return coder(pos, r, this, sord); } #ifdef DEBUG_BLTIN void assertBltinLookup(inst::opcode op, item it) { if (op == inst::builtin) { string name=lookupBltin(vm::get(it)); assert(!name.empty()); } } #endif void coder::encodePop() { if (isStatic() && !isTopLevel()) { assert(parent); parent->encodePop(); } else { #ifdef COMBO vm::program::label end = program->end(); --end; inst& lastInst = *end; if (lastInst.op == inst::varsave) { lastInst.op = inst::varpop; return; } if (lastInst.op == inst::fieldsave) { lastInst.op = inst::fieldpop; return; } // TODO: push+pop into no op. #endif // No combo applicable. Just encode a usual pop. encode(inst::pop); } } bool coder::encode(frame *f) { frame *toplevel = getFrame(); if (f == 0) { encode(inst::constpush,(item)0); return true; } else if (f == toplevel) { encode(inst::pushclosure); return true; } else { encode(inst::varpush,toplevel->parentIndex()); return encode(f, toplevel->getParent()); } } bool coder::encode(frame *dest, frame *top) { if (dest == 0) { // Change to encodePop? encode(inst::pop); encode(inst::constpush,(item)0); } else { frame *level = top; while (level != dest) { if (level == 0) { // Frame request was in an improper scope. return false; } encode(inst::fieldpush, level->parentIndex()); level = level->getParent(); } } //cerr << "succeeded\n"; return true; } vm::program::label coder::encodeEmptyJump(inst::opcode op) { // Get the end position before encoding the label. Once encoded, this will // point to the instruction. vm::program::label pos = program->end(); encode(op); return pos; } void replaceEmptyJump(vm::program::label from, vm::program::label to) { from->ref = to; } label coder::defNewLabel() { if (isStatic()) return parent->defNewLabel(); label l = new label_t(); assert(!l->location.defined()); assert(!l->firstUse.defined()); return defLabel(l); } label coder::defLabel(label label) { if (isStatic()) return parent->defLabel(label); //cout << "defining label " << label << endl; assert(!label->location.defined()); //vm::program::label here = program->end(); label->location = program->end(); assert(label->location.defined()); if (label->firstUse.defined()) { replaceEmptyJump(label->firstUse, program->end()); //vm::printInst(cout, label->firstUse, program->begin()); //cout << endl; if (label->moreUses) { typedef label_t::useVector useVector; useVector& v = *label->moreUses; for (useVector::iterator p = v.begin(); p != v.end(); ++p) { replaceEmptyJump(*p, program->end()); } } } return label; } void coder::useLabel(inst::opcode op, label label) { if (isStatic()) return parent->useLabel(op,label); if (label->location.defined()) { encode(op, label->location); } else { if (label->firstUse.defined()) { // Store additional uses in the moreUses array. if (!label->moreUses) label->moreUses = new label_t::useVector; label->moreUses->push_back(encodeEmptyJump(op)); } else { label->firstUse = encodeEmptyJump(op); assert(label->firstUse.defined()); assert(!label->location.defined()); } } } label coder::fwdLabel() { if (isStatic()) return parent->fwdLabel(); // Create a new label without specifying its position. label l = new label_t(); assert(!l->location.defined()); assert(!l->firstUse.defined()); //cout << "forward label " << l << endl; return l; } bool coder::usesClosureSinceLabel(label l) { assert(l->location.defined()); for (vm::program::label i = l->location; i != program->end(); ++i) if (i->op == inst::pushclosure) return true; return false; } void coder::encodePatch(label from, label to) { assert(from->location.defined()); assert(to->location.defined()); assert(from->location->op == inst::nop); from->location->op = inst::jmp; from->location->ref = to->location; } void coder::markPos(position pos) { curPos = pos; } // When translating the function is finished, this ties up loose ends // and returns the lambda. vm::lambda *coder::close() { // These steps must be done dynamically, not statically. sord = EXPLICIT_DYNAMIC; sord_stack.push(sord); // Add a return for void types; may be redundant. if (funtype->result->kind == types::ty_void) encode(inst::ret); l->code = program; l->parentIndex = level->parentIndex(); l->framesize = level->size(); sord_stack.pop(); sord = sord_stack.top(); return l; } void coder::closeRecord() { // Put record into finished state. encode(inst::pushclosure); close(); } bool coder::isRecord() { return (funtype==inittype()); } namespace { function *inittype() { static function t(types::primVoid()); return &t; } function *bootuptype() { static function t(types::primVoid()); return &t; } } // private bool coder::encodeParent(position pos, trans::tyEntry *ent) { record *r = dynamic_cast(ent->t); if (!r) { em.compiler(pos); em << "type '" << *ent->t << "' is not a structure"; return false; } assert(r); // The level needed on which to allocate the record. frame *level = r->getLevel()->getParent(); if (ent->v) { // Put the record on the stack. For instance, in code like // access imp; // new imp.t; // we are putting the instance of imp on the stack, so we can use it to // allocate an instance of imp.t. ent->v->encode(trans::READ, pos, *this); // Adjust to the right frame. For instance, in the last new in // struct A { // struct B { // static struct C {} // } // B b=new B; // } // A a=new A; // new a.b.C; // we push a.b onto the stack, but need a as the enclosing frame for // allocating an instance of C. record* q= dynamic_cast(ent->v->getType()); assert(q); return encode(level, q->getLevel()); } else return encode(level); } } // namespace trans asymptote-3.05/stm.cc0000644000000000000000000002757615031566105013321 0ustar rootroot/***** * stm.cc * Andy Hammerlindl 2002/8/30 * * Statements are everything in the language that do something on their * own. Statements are different from declarations in that statements * do not modify the environment. Translation of a statement puts the * stack code to run it into the instruction stream. *****/ #include #include "errormsg.h" #include "settings.h" #include "coenv.h" #include "exp.h" #include "stm.h" #include "symbol.h" #include "opsymbols.h" namespace absyntax { using namespace trans; using namespace types; void stm::prettyprint(ostream &out, Int indent) { prettyname(out,"stm",indent, getPos()); } void emptyStm::prettyprint(ostream &out, Int indent) { prettyname(out,"emptyStm",indent, getPos()); } void blockStm::prettyprint(ostream &out, Int indent) { prettyname(out,"blockStm",indent, getPos()); base->prettyprint(out, indent+1); } void expStm::prettyprint(ostream &out, Int indent) { prettyname(out,"expStm",indent, getPos()); body->prettyprint(out, indent+1); } void baseExpTrans(coenv &e, exp *expr) { types::ty_kind kind = expr->trans(e)->kind; if (kind != types::ty_void) // Remove any value it puts on the stack. e.c.encodePop(); } void expStm::trans(coenv &e) { baseExpTrans(e, body); } // For an object such as currentpicture, write 'picture currentpicture' to // give some information. Only do this when the object has a name. void tryToWriteTypeOfExp(types::ty *t, exp *body) { symbol name=body->getName(); if (!name) return; overloaded *set = dynamic_cast(t); if (set) for(ty_vector::iterator ot=set->sub.begin(); ot!=set->sub.end(); ++ot) tryToWriteTypeOfExp(*ot, body); else { cout << "<"; t->printVar(cout, name); cout << ">" << endl; } } // From dec.cc: varEntry *makeVarEntry(position pos, coenv &e, record *r, types::ty *t); void storeExp(coenv &e, types::ty *t, exp *expr) { assert(t->kind != ty_error); assert(t->kind != ty_void); assert(t->kind != ty_overloaded); expr->transAsType(e, t); // Store the value in a new variable of the proper type. varEntry *v = makeVarEntry(expr->getPos(), e, 0, t); e.e.addVar(symbol::trans("operator answer"), v); v->getLocation()->encode(WRITE, expr->getPos(), e.c); e.c.encodePop(); } void storeAndWriteExp(coenv &e, types::ty *t, exp *expr) { storeExp(e, t, expr); position pos=expr->getPos(); baseExpTrans(e, new callExp(pos, new nameExp(pos, "write"), new nameExp(pos, "operator answer"))); } void tryToWriteExp(coenv &e, exp *expr) { position pos=expr->getPos(); types::ty *t=expr->cgetType(e); if(!t) return; // If the original expression is bad, just print the errors. // If it is a function which returns void, just call the function. if (t->kind == ty_error || t->kind == ty_void) { baseExpTrans(e, expr); return; } exp *callee=new nameExp(pos, symbol::trans("write")); exp *call=new callExp(pos, callee, expr); types::ty *ct=call->getType(e); if (ct->kind == ty_error || ct->kind == ty_overloaded) { if (t->kind == ty_overloaded) { // Translate the expr in order to print the ambiguity error first. expr->trans(e); em.sync(true); assert(em.errors()); // Then, write out all of the types. tryToWriteTypeOfExp(t, expr); } else { // Write the type of the expression and, since it is unique, assign it to // 'operator answer' even though its value isn't printed. tryToWriteTypeOfExp(t, expr); storeExp(e, t, expr); } } else if (t->kind == ty_overloaded) { // If the exp is overloaded, but the act of writing makes it // unambiguous, add a suffix to the output to warn the user of this. exp *suffix=new nameExp(pos, symbol::trans("overloadedMessage")); exp *callWithSuffix=new callExp(pos, callee, expr, suffix); if (callWithSuffix->getType(e)->kind != ty_error) baseExpTrans(e, callWithSuffix); else baseExpTrans(e, call); } else { // Interactive writing can proceed normally. storeAndWriteExp(e, t, expr); } } void expStm::interactiveTrans(coenv &e) { // First check if it is the kind of expression that should be written. if (body->writtenToPrompt() && settings::getSetting("interactiveWrite")) tryToWriteExp(e, body); else baseExpTrans(e, body); } void ifStm::prettyprint(ostream &out, Int indent) { prettyname(out,"ifStm",indent, getPos()); test->prettyprint(out, indent+1); onTrue->prettyprint(out, indent+1); if (onFalse) onFalse->prettyprint(out, indent+1); } void ifStm::trans(coenv &e) { label elseLabel = e.c.fwdLabel(); label end = e.c.fwdLabel(); test->transConditionalJump(e, false, elseLabel); onTrue->markTrans(e); if (onFalse) { // Encode the jump around the 'else' clause at the end of the 'if' clause e.c.useLabel(inst::jmp,end); e.c.defLabel(elseLabel); onFalse->markTrans(e); } else { e.c.defLabel(elseLabel); } e.c.defLabel(end); } void transLoopBody(coenv &e, stm *body) { // The semantics of the language are defined so that any variable declared // inside a loop are new variables for each iteration of the loop. For // instance, the code // // int f(); // for (int i = 0; i < 10; ++i) { // int j=10*i; // if (i == 5) // f = new int() { return j; }; // } // write(f()); // // will write 50. This is implemented by allocating a new frame for each // iteration. However, this can have a big performance hit, so we first // translate the code without the frame, check if it needed the closure, and // rewrite the code if necessary. label start = e.c.defNewLabel(); // Encode a no-op, in case we need to jump over the default implementation // to a special case. e.c.encode(inst::nop); body->markTrans(e); // Don't re-translate if there were errors. if (em.errors()) return; if (e.c.usesClosureSinceLabel(start)){ // Jump over the old section. label end = e.c.defNewLabel(); e.c.encodePatch(start, end); // Let coder know that break and continue need to pop the frame. e.c.loopPushesFrame(); e.c.encodePushFrame(); body->markTrans(e); e.c.encodePopFrame(); } } void whileStm::prettyprint(ostream &out, Int indent) { prettyname(out,"whileStm",indent, getPos()); test->prettyprint(out, indent+1); body->prettyprint(out, indent+1); } void whileStm::trans(coenv &e) { label end = e.c.fwdLabel(); label start = e.c.defNewLabel(); e.c.pushLoop(start, end); test->transConditionalJump(e, false, end); transLoopBody(e,body); e.c.useLabel(inst::jmp,start); e.c.defLabel(end); e.c.popLoop(); } void doStm::prettyprint(ostream &out, Int indent) { prettyname(out,"doStm",indent, getPos()); body->prettyprint(out, indent+1); test->prettyprint(out, indent+1); } void doStm::trans(coenv &e) { label testLabel = e.c.fwdLabel(); label end = e.c.fwdLabel(); e.c.pushLoop(testLabel, end); label start = e.c.defNewLabel(); transLoopBody(e,body); e.c.defLabel(testLabel); test->transConditionalJump(e, true, start); e.c.defLabel(end); e.c.popLoop(); } void forStm::prettyprint(ostream &out, Int indent) { prettyname(out,"forStm",indent, getPos()); if (init) init->prettyprint(out, indent+1); if (test) test->prettyprint(out, indent+1); if (update) update->prettyprint(out, indent+1); body->prettyprint(out, indent+1); } void forStm::trans(coenv &e) { // Any vardec in the initializer needs its own scope. e.e.beginScope(); if (init) init->markTrans(e); label ctarget = e.c.fwdLabel(); label end = e.c.fwdLabel(); e.c.pushLoop(ctarget, end); label start = e.c.defNewLabel(); if(test) { test->transConditionalJump(e, false, end); } transLoopBody(e,body); e.c.defLabel(ctarget); if (update) update->markTrans(e); e.c.useLabel(inst::jmp,start); e.c.defLabel(end); e.c.popLoop(); e.e.endScope(); } void extendedForStm::prettyprint(ostream &out, Int indent) { prettyindent(out, indent); out << "extendedForStm: '" << var << "'\n"; start->prettyprint(out, indent+1); set->prettyprint(out, indent+1); body->prettyprint(out, indent+1); } void extendedForStm::trans(coenv &e) { // Translate into the syntax: // // start[] a = set; // for (int i=0; i < a.length; ++i) { // start var=a[i]; // body // } position pos=getPos(); // Use gensyms for the variable names so as not to pollute the namespace. symbol a=symbol::gensym("a"); symbol i=symbol::gensym("i"); // Get the start type. Handle type inference as a special case. types::ty *t = start->trans(e, true); if (t->kind == types::ty_inferred) { // First ensure the array expression is an unambiguous array. types::ty *at = set->cgetType(e); if (at->kind != ty_array) { em.error(set->getPos()); em << "expression is not an array of inferable type"; // On failure, don't bother trying to translate the loop. return; } // var a=set; tyEntryTy tet(pos, primInferred()); decid dec1(pos, new decidstart(pos, a), set); vardec(pos, &tet, &dec1).trans(e); } else { // start[] a=set; arrayTy at(pos, start, new dimensions(pos)); decid dec1(pos, new decidstart(pos, a), set); vardec(pos, &at, &dec1).trans(e); } // { start var=a[i]; body } block b(pos); decid dec2(pos, new decidstart(pos, var), new subscriptExp(pos, new nameExp(pos, a), new nameExp(pos, i))); b.add(new vardec(pos, start, &dec2)); b.add(body); // for (int i=0; i < a.length; ++i) // forStm(pos, new vardec(pos, new tyEntryTy(pos, primInt()), new decid(pos, new decidstart(pos, i), new intExp(pos, 0))), new binaryExp(pos, new nameExp(pos, i), SYM_LT, new nameExp(pos, new qualifiedName(pos, new simpleName(pos, a), symbol::trans("length")))), new expStm(pos, new prefixExp(pos, new nameExp(pos, i), SYM_PLUS)), new blockStm(pos, &b)).trans(e); } void breakStm::prettyprint(ostream &out, Int indent) { prettyname(out,"breakStm",indent, getPos()); } void breakStm::trans(coenv &e) { if (!e.c.encodeBreak()) { em.error(getPos()); em << "break statement outside of a loop"; } } void continueStm::prettyprint(ostream &out, Int indent) { prettyname(out,"continueStm",indent, getPos()); } void continueStm::trans(coenv &e) { if (!e.c.encodeContinue()) { em.error(getPos()); em << "continue statement outside of a loop"; } } void returnStm::prettyprint(ostream &out, Int indent) { prettyname(out, "returnStm",indent, getPos()); if (value) value->prettyprint(out, indent+1); } void returnStm::trans(coenv &e) { types::ty *t = e.c.getReturnType(); if (t->kind == ty_void) { if (value) { em.error(getPos()); em << "function cannot return a value"; } if (e.c.isRecord()) e.c.encode(inst::pushclosure); } else { if (value) { value->transToType(e, t); } else { em.error(getPos()); em << "function must return a value"; } } // NOTE: Currently, a return statement in a module definition will end // the initializer. Should this be allowed? e.c.encode(inst::ret); } void stmExpList::prettyprint(ostream &out, Int indent) { prettyname(out, "stmExpList",indent, getPos()); for (mem::list::iterator p = stms.begin(); p != stms.end(); ++p) (*p)->prettyprint(out, indent+1); } void stmExpList::trans(coenv &e) { for (mem::list::iterator p = stms.begin(); p != stms.end(); ++p) (*p)->markTrans(e); } } // namespace absyntax asymptote-3.05/runpicture.in0000644000000000000000000004741015031566105014724 0ustar rootroot/***** * runpicture.in * * Runtime functions for picture operations. * *****/ pen => primPen() pair => primPair() triple => primTriple() path => primPath() path3 => primPath3() picture* => primPicture() Intarray* => IntArray() Intarray2* => IntArray2() realarray* => realArray() realarray2* => realArray2() patharray* => pathArray() penarray* => penArray() penarray2* => penArray2() pairarray* => pairArray() pairarray2* => pairArray2() triplearray* => tripleArray() triplearray2* => tripleArray2() transform => primTransform() callablePen* => penFunction() #include "picture.h" #include "drawelement.h" #include "path.h" #include "array.h" #include "arrayop.h" #include "drawpath.h" #include "drawfill.h" #include "drawclipbegin.h" #include "drawclipend.h" #include "drawgsave.h" #include "drawgrestore.h" #include "drawgroup.h" #include "drawverbatim.h" #include "drawlabel.h" #include "drawlayer.h" #include "drawimage.h" #include "drawpath3.h" #include "drawsurface.h" using namespace camp; using namespace settings; using namespace vm; typedef array Intarray; typedef array Intarray2; typedef array realarray; typedef array realarray2; typedef array pairarray; typedef array pairarray2; typedef array triplearray; typedef array triplearray2; typedef array patharray; typedef array penarray; typedef array penarray2; typedef callable callablePen; using types::IntArray; using types::IntArray2; using types::realArray; using types::realArray2; using types::pairArray; using types::pairArray2; using types::tripleArray; using types::tripleArray2; using types::pathArray; using types::penArray; using types::penArray2; static transform ZeroTransform=transform(0.0,0.0,0.0,0.0,0.0,0.0); transform getTransform(xmap_t &xmap, picture::nodelist::iterator p) { string s=(*p)->KEY; transform t; // Don't apply xmap without an explicit corresponding key size_t n=s.length(); if(n == 0 || s.substr(n-1) != "1") return t; xmap_t::iterator q=xmap.find(s.substr(0,n-2)); if(q != xmap.end()) { xtransform_t& v=q->second; if(!v.empty()) { t=v.front(); v.pop_front(); } } return t; } function *transformFunction() { return new function(primTransform()); } function *penFunction() { return new function(primPen(),primInt(),primInt()); } // Ignore unclosed begingroups but not spurious endgroups. const char *nobegin="endgroup without matching begingroup"; array *emptyarray=new array(0); array *nop(array *a) { return a; } triple Zero; string defaultformat3="prc"; // Autogenerated routines: picture* :newPicture() { return new picture(); } bool empty(picture *f) { return f->null(); } void erase(picture *f) { f->nodes.clear(); } pair min(picture *f) { return f->bounds().Min(); } pair max(picture *f) { return f->bounds().Max(); } pair size(picture *f) { bbox b=f->bounds(); return b.Max()-b.Min(); } void _draw(picture *f, path g, pen p) { f->append(new drawPath(g,p)); } void fill(picture *f, patharray *g, pen p=CURRENTPEN, bool copy=true) { array *(*copyarray)(array *a)=copy ? copyArray : nop; f->append(new drawFill(*copyarray(g),false,p)); } void latticeshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray2 *p, transform t=identity, bool copy=true) { array *(*copyarray)(array *a)=copy ? copyArray : nop; f->append(new drawLatticeShade(*copyarray(g),stroke,fillrule,*copyarray(p), t)); } void axialshade(picture *f, patharray *g, bool stroke=false, pen pena, pair a, bool extenda=true, pen penb, pair b, bool extendb=true, bool copy=true) { array *(*copyarray)(array *a)=copy ? copyArray : nop; f->append(new drawAxialShade(*copyarray(g),stroke,pena,a,extenda,penb,b, extendb)); } void radialshade(picture *f, patharray *g, bool stroke=false, pen pena, pair a, real ra, bool extenda=true, pen penb, pair b, real rb, bool extendb=true, bool copy=true) { array *(*copyarray)(array *a)=copy ? copyArray : nop; f->append(new drawRadialShade(*copyarray(g),stroke,pena,a,ra,extenda, penb,b,rb,extendb)); } void gouraudshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray *p, pairarray *z, Intarray *edges, bool copy=true) { array *(*copyarray)(array *a)=copy ? copyArray : nop; checkArrays(p,z); checkArrays(z,edges); f->append(new drawGouraudShade(*copyarray(g),stroke,fillrule,*copyarray(p), *copyarray(z),*copyarray(edges))); } void gouraudshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray *p, Intarray *edges, bool copy=true) { array *(*copyarray)(array *a)=copy ? copyArray : nop; size_t n=checkArrays(p,edges); size_t m=checkArray(g); array *z=new array(n); Int k=0; Int in=(Int) n; for(size_t j=0; j < m; ++j) { path *P=read(g,j); assert(P); Int stop=Min(P->size(),in-k); mem::vector& nodes=P->Nodes(); for(Int i=0; i < stop; ++i) (*z)[k++]=nodes[i].point; } checkArrays(p,z); f->append(new drawGouraudShade(*copyarray(g),stroke,fillrule,*copyarray(p), *z,*copyarray(edges))); } void tensorshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray2 *p, patharray *b=NULL, pairarray2 *z=emptyarray, bool copy=true) { array *(*copyarray)(array *a)=copy ? copyArray : nop; array *(*copyarray2)(array *a)=copy ? copyArray2 : nop; size_t n=checkArrays(p,b ? b : g); array& G=*copyarray(g); array& B=b ? *copyarray(b) : G; size_t nz=checkArray(z); if(nz != 0) checkEqual(nz,n); f->append(new drawTensorShade(G,stroke,fillrule,*copyarray2(p),B, *copyarray2(z))); } void functionshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, string shader=emptystring, bool copy=true) { array *(*copyarray)(array *a)=copy ? copyArray : nop; f->append(new drawFunctionShade(*copyarray(g),stroke,fillrule,shader)); } // Clip a picture to a superpath using the given fill rule. // Subsequent additions to the picture will not be affected by the clipping. void clip(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, bool copy=true) { array *(*copyarray)(array *a)=copy ? copyArray : nop; drawClipBegin *begin=new drawClipBegin(*copyarray(g),stroke,fillrule,true); f->enclose(begin,new drawClipEnd(true,begin)); } void beginclip(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, bool copy=true) { array *(*copyarray)(array *a)=copy ? copyArray : nop; f->append(new drawClipBegin(*copyarray(g),stroke,fillrule,false)); } void endclip(picture *f) { f->append(new drawClipEnd(false)); } void gsave(picture *f) { f->append(new drawGsave()); } void grestore(picture *f) { f->append(new drawGrestore()); } void begingroup(picture *f) { f->append(new drawBegin()); } void endgroup(picture *f) { f->append(new drawEnd()); } void _begingroup3(picture *f, string name, real compression, real granularity, bool closed, bool tessellate, bool dobreak, bool nobreak, triple center, Int interaction) { f->append(new drawBegin3(name,compression,granularity, closed,tessellate,dobreak,nobreak, center,(Interaction) intcast(interaction))); } void endgroup3(picture *f) { f->append(new drawEnd3()); } void add(picture *dest, picture *src) { dest->add(*src); } void prepend(picture *dest, picture *src) { dest->prepend(*src); } void postscript(picture *f, string s) { f->append(new drawVerbatim(PostScript,s)); } void tex(picture *f, string s) { f->append(new drawVerbatim(TeX,s)); } void postscript(picture *f, string s, pair min, pair max) { f->append(new drawVerbatim(PostScript,s,min,max)); } void tex(picture *f, string s, pair min, pair max) { f->append(new drawVerbatim(TeX,s,min,max)); } void texpreamble(string s) { string t=s+"\n"; processDataStruct &pd=processData(); pd.TeXpipepreamble.push_back(t); pd.TeXpreamble.push_back(t); } void deletepreamble() { if(getSetting("inlinetex")) { unlink(buildname(outname(),"pre").c_str()); } } void _labelpath(picture *f, string s, string size, path g, string justify, pair offset, pen p) { f->append(new drawLabelPath(s,size,g,justify,offset,p)); } void texreset() { processDataStruct &pd=processData(); pd.TeXpipepreamble.clear(); pd.TeXpreamble.clear(); pd.tex.pipeclose(); } void layer(picture *f) { f->append(new drawLayer()); } void newpage(picture *f) { f->append(new drawNewPage()); } void _image(picture *f, realarray2 *data, pair initial, pair final, penarray *palette=NULL, transform t=identity, bool copy=true, bool antialias=false) { array *(*copyarray)(array *a)=copy ? copyArray : nop; array *(*copyarray2)(array *a)=copy ? copyArray2 : nop; f->append(new drawPaletteImage(*copyarray2(data),*copyarray(palette), t*matrix(initial,final),antialias)); } void _image(picture *f, penarray2 *data, pair initial, pair final, transform t=identity, bool copy=true, bool antialias=false) { array *(*copyarray2)(array *a)=copy ? copyArray2 : nop; f->append(new drawNoPaletteImage(*copyarray2(data),t*matrix(initial,final), antialias)); } void _image(picture *f, callablePen *F, Int width, Int height, pair initial, pair final, transform t=identity, bool antialias=false) { f->append(new drawFunctionImage(Stack,F,width,height, t*matrix(initial,final),antialias)); } string nativeformat() { return nativeformat(); } bool latex() { return latex(getSetting("tex")); } bool pdf() { return pdf(getSetting("tex")); } void _shipout(string prefix=emptystring, picture *f, picture *preamble=NULL, string format=emptystring, bool wait=false, bool view=true, transform T=identity) { if(prefix.empty()) prefix=outname(); picture *result=new picture; unsigned level=0; xmap_t xmap=processData().xmap; transform Tinv=inverse(T); for(picture::nodelist::iterator p=f->nodes.begin(); p != f->nodes.end(); ++p) { transform t=getTransform(xmap,p); bool Delete=(t == ZeroTransform); if(!Delete && !t.isIdentity()) t=T*t*Tinv; picture *group=new picture; assert(*p); if((*p)->endgroup()) error(nobegin); if((*p)->begingroup()) { ++level; while(p != f->nodes.end() && level) { if(!Delete) { drawElement *e=t.isIdentity() ? *p : (*p)->transformed(t); group->append(e); } ++p; if(p == f->nodes.end()) break; assert(*p); if((*p)->begingroup()) ++level; if((*p)->endgroup()) { if(level) --level; else error(nobegin); } } } if(p == f->nodes.end()) break; assert(*p); if(!Delete) { drawElement *e=t.isIdentity() ? *p : (*p)->transformed(t); group->append(e); result->add(*group); } delete group; } result->shipout(preamble,prefix,format,wait,view); delete result; } void shipout3(string prefix, picture *f, string format=emptystring, real width, real height, real angle, real zoom, triple m, triple M, pair shift, pair margin, realarray2 *t, realarray2 *tup, realarray *background, triplearray *lights, realarray2 *diffuse, realarray2 *specular, bool view=true) { size_t n=checkArrays(lights,diffuse); checkEqual(n,checkArray(specular)); real *T,*Tup,*Background,*Diffuse,*Specular; triple *Lights; copyArray2C(T,t,true,4); copyArray2C(Tup,tup,true,4); copyArrayC(Background,background); copyArrayC(Lights,lights); copyArray2C(Diffuse,diffuse,false,4,UseGC); copyArray2C(Specular,specular,false,4,UseGC); f->shipout3(prefix,format,width,height,angle,zoom,m,M,shift,margin,T,Tup, Background,n,Lights,Diffuse,Specular,view); delete[] Background; delete[] T; delete[] Tup; } void shipout3(string prefix, picture *f, string format=defaultformat3) { f->shipout3(prefix,format); } void xmap(string key, transform t=identity) { processDataStruct *P=&processData(); xmap_t &xmap=P->xmap; xmap_t::iterator p=xmap.find(key); if(p != xmap.end()) p->second.push_back(t); else { xtransform_t *v=new xtransform_t(); v->push_back(t); xmap[key]=*v; } P->xmapCount++; } void deconstruct(picture *f, picture *preamble=NULL, transform T=identity) { unsigned level=0; bool first=pdf(getSetting("tex")); string prefix=outname(); const string xformat="svg"; openpipeout(); const string Done="Done"; const string Error="Error"; xmap_t xmap=processData().xmap; transform Tinv=inverse(T); picture *F=new picture(true); for(picture::nodelist::iterator p=f->nodes.begin(); p != f->nodes.end();) { picture *group=new picture; transform t=getTransform(xmap,p); bool Delete=(t == ZeroTransform); if(!Delete && !t.isIdentity()) t=T*t*Tinv; assert(*p); if((*p)->endgroup()) { fprintf(pipeout,"%s\n",Error.c_str()); fflush(pipeout); error(nobegin); } bool clip=false; if((*p)->begingroup()) { string key=(*p)->KEY; ++level; while(p != f->nodes.end() && level) { if(!Delete) { drawElement *e=t.isIdentity() ? *p : (*p)->transformed(t); group->append(e); if((*p)->endclip()) clip=true; } ++p; if(p == f->nodes.end()) break; assert(*p); if((*p)->begingroup()) ++level; if((*p)->endgroup()) { if(level) --level; else { fprintf(pipeout,"%s\n",Error.c_str()); fflush(pipeout); error(nobegin); } if(level == 0) (*p)->KEY=key; } } } if(p != f->nodes.end()) { if(!Delete) { drawElement *e=t.isIdentity() ? *p : (*p)->transformed(t); group->append(e); bbox b=group->bounds(); if(!b.empty && b.right > b.left && b.top > b.bottom) { if((*p)->endclip()) clip=true; if(first) first=false; else F->append(new drawNewPage(b)); F->append(new drawBBox(b)); for(picture::nodelist::iterator g=group->nodes.begin(); !(g == group->nodes.end()); ++g) F->append(*g); fprintf(pipeout,"KEY=%s%d\n",e->KEY.c_str(),clip); const char *oldlocale=setlocale(LC_NUMERIC,NULL); bool override=oldlocale && strcmp(oldlocale,"C") != 0; if(override) { oldlocale=StrdupNoGC(oldlocale); setlocale(LC_NUMERIC,"C"); } fprintf(pipeout,"%g %g %g %g\n",b.left,b.bottom,b.right,b.top); if(override) { setlocale(LC_NUMERIC,oldlocale); delete[] oldlocale; } fflush(pipeout); } } else { drawElement *e=t.isIdentity() ? *p : (*p)->transformed(t); fprintf(pipeout,"KEY=%s2\n",e->KEY.c_str()); fprintf(pipeout,"0 0 0 0\n"); } ++p; } delete group; } string outname=buildname(prefix,xformat); F->shipout(preamble,stripExt(outname),xformat,false,false); fprintf(pipeout,"%s\n",Done.c_str()); fflush(pipeout); delete F; } // Three-dimensional picture and surface operations // Bezier curve void _draw(picture *f, path3 g, triple center=Zero, penarray *p, real opacity, real shininess, real metallic, real fresnel0, Int interaction=0) { size_t n=g.size(); for(unsigned int i=0; i < n; ++i) f->append(new drawPath3(g.subpath((Int) i,Int(i+1)),center,*p,opacity, shininess,metallic,fresnel0, (Interaction) intcast(interaction))); } // Bezier patch void draw(picture *f, triplearray2 *P, triple center, bool straight, penarray *p, real opacity, real shininess, real metallic, real fresnel0, penarray *colors, Int interaction, Int digits, bool primitive=false) { f->append(new drawBezierPatch(*P,center,straight,*p,opacity,shininess, metallic,fresnel0,*colors, (Interaction) intcast(interaction), digits,primitive)); } // Bezier triangle void drawbeziertriangle(picture *f, triplearray2 *P, triple center, bool straight, penarray *p, real opacity, real shininess, real metallic, real fresnel0, penarray *colors, Int interaction, Int digits, bool primitive=false) { f->append(new drawBezierTriangle(*P,center,straight,*p,opacity,shininess, metallic,fresnel0,*colors, (Interaction) intcast(interaction), digits,primitive)); } // General NURBS curve void draw(picture *f, triplearray *P, realarray *knot, realarray *weights=emptyarray, pen p) { f->append(new drawNurbsPath3(*P,knot,weights,p)); } // General NURBS surface void draw(picture *f, triplearray2 *P, realarray *uknot, realarray *vknot, realarray2 *weights=emptyarray, penarray *p, real opacity, real shininess,real metallic, real fresnel0, penarray *colors) { f->append(new drawNurbs(*P,uknot,vknot,weights,*p,opacity,shininess, metallic,fresnel0,*colors)); } // Sphere primitive void drawSphere(picture *f, realarray2 *t, bool half=false, penarray *p, real opacity, real shininess, real metallic, real fresnel0, Int type) { f->append(new drawSphere(*t,half,*p,opacity,shininess,metallic,fresnel0, intcast(type))); } // Cylinder primitive void drawCylinder(picture *f, realarray2 *t, penarray *p, real opacity, real shininess, real metallic, real fresnel0, bool core=false) { f->append(new drawCylinder(*t,*p,opacity,shininess,metallic,fresnel0,core)); } // Disk primitive void drawDisk(picture *f, realarray2 *t, penarray *p, real opacity, real shininess, real metallic, real fresnel0) { f->append(new drawDisk(*t,*p,opacity,shininess,metallic,fresnel0)); } // Tube primitive void drawTube(picture *f, triplearray *g, real width, penarray *p, real opacity, real shininess, real metallic, real fresnel0, triple min, triple max, bool core=false) { f->append(new drawTube(*g,width,*p,opacity,shininess,metallic,fresnel0, min,max,core)); } // Draw pixel void drawpixel(picture *f, triple v, pen p, real width=1.0) { f->append(new drawPixel(v,p,width)); } // Draw triangles void draw(picture *f, triplearray *v, Intarray2 *vi, triple center=Zero, triplearray *n, Intarray2 *ni, penarray *p, real opacity, real shininess, real metallic, real fresnel0, penarray *c=emptyarray, Intarray2 *ci=emptyarray, Int interaction) { f->append(new drawTriangles(*v,*vi,center,*n,*ni,*p,opacity,shininess, metallic,fresnel0,*c,*ci, (Interaction) intcast(interaction))); } triple min3(picture *f) { return f->bounds3().Min(); } triple max3(picture *f) { return f->bounds3().Max(); } triple size3(picture *f) { bbox3 b=f->bounds3(); return b.Max()-b.Min(); } pair minratio(picture *f) { return f->ratio(::min); } pair maxratio(picture *f) { return f->ratio(::max); } bool is3D(picture *f) { return f->have3D(); } asymptote-3.05/absyn.h0000644000000000000000000000217115031566105013454 0ustar rootroot/**** * absyn.h * Andy Hammerlindl 2002/07/14 * * Defines the basic types of abstract syntax objects using forward * class declarations. *****/ #ifndef ABSYN_H #define ABSYN_H #include "common.h" #include "symbolmaps.h" #include "errormsg.h" // For position // Forward declaration for markPos. namespace trans { class coenv; } namespace absyntax { class absyn : public gc { protected: const position pos; void markPos(trans::coenv& c); public: absyn(position pos) : pos(pos) {} virtual ~absyn(); position getPos() const { return pos; } virtual void prettyprint(ostream &out, Int indent) = 0; virtual void createSymMap(AsymptoteLsp::SymbolContext* symContext) {} private: // Non-copyable void operator=(const absyn&); absyn(const absyn&); }; void prettyindent(ostream &out, Int indent); void prettyname(ostream &out, string name, Int indent, position pos); class name; class astType; class varinit; class exp; class runnable; class stm; class dec; class block; typedef block file; // This is the abstract syntax tree of a file, assigned to when running // yyparse. extern file *root; } #endif asymptote-3.05/glrender.cc0000644000000000000000000020211415031566105014277 0ustar rootroot/***** * glrender.cc * John Bowman, Orest Shardt, and Supakorn "Jamie" Rassameemasmuang * Render 3D Bezier paths and surfaces. *****/ #include #include #include #include #include #include #if !defined(_WIN32) #include #include #endif #include "common.h" #include "locate.h" #include "seconds.h" #include "statistics.h" #include "bezierpatch.h" #include "beziercurve.h" #include "picture.h" #include "bbox3.h" #include "drawimage.h" #include "interact.h" #include "fpu.h" extern uint32_t CLZ(uint32_t a); bool GPUindexing; bool GPUcompress; namespace gl { #ifdef HAVE_PTHREAD pthread_t mainthread; #endif } #ifdef HAVE_GL #include "tr.h" #ifdef HAVE_LIBGLUT #ifdef __MSDOS__ #ifndef FGAPI #define FGAPI GLUTAPI #endif #ifndef FGAPIENTRY #define FGAPIENTRY APIENTRY #endif #endif #define GLUT_BUILDING_LIB #ifdef FREEGLUT #include #endif #endif // HAVE_LIBGLUT #include "shaders.h" #include "GLTextures.h" #include "EXRFiles.h" using settings::locateFile; using utils::stopWatch; #endif // HAVE_GL #ifdef HAVE_LIBGLM namespace camp { Billboard BB; GLint pixelShader; GLint materialShader[2]; GLint colorShader[2]; GLint generalShader[2]; GLint countShader; GLint transparentShader; GLint blendShader; GLint zeroShader; GLint compressShader; GLint sum1Shader; GLint sum2Shader; GLint sum2fastShader; GLint sum3Shader; GLuint fragments; GLuint offsetBuffer; GLuint indexBuffer; GLuint elementsBuffer; GLuint countBuffer; GLuint globalSumBuffer; GLuint fragmentBuffer; GLuint depthBuffer; GLuint opaqueBuffer; GLuint opaqueDepthBuffer; GLuint feedbackBuffer; bool ssbo; bool interlock; } #endif #ifdef HAVE_LIBGLM using camp::Material; using camp::Maxmaterials; using camp::Nmaterials; using camp::nmaterials; using camp::MaterialMap; namespace camp { bool initSSBO; GLuint maxFragments; vertexBuffer material0Data(GL_POINTS); vertexBuffer material1Data(GL_LINES); vertexBuffer materialData; vertexBuffer colorData; vertexBuffer transparentData; vertexBuffer triangleData; const size_t Nbuffer=10000; const size_t nbuffer=1000; std::vector materials; MaterialMap materialMap; size_t materialIndex; size_t Maxmaterials; size_t Nmaterials=1; size_t nmaterials=48; unsigned int Opaque=0; void clearCenters() { camp::drawElement::centers.clear(); camp::drawElement::centermap.clear(); } void clearMaterials() { materials.clear(); materials.reserve(nmaterials); materialMap.clear(); material0Data.partial=false; material1Data.partial=false; materialData.partial=false; colorData.partial=false; triangleData.partial=false; transparentData.partial=false; } } extern void exitHandler(int); namespace gl { GLint gs2; GLint gs; GLint g; GLuint processors; GLuint localSize; GLuint blockSize; GLuint groupSize; //GLint maxgroups; GLuint maxSize; bool outlinemode=false; bool ibl=false; bool glthread=false; bool glupdate=false; bool glexit=false; bool initialize=true; using camp::picture; using camp::drawRawImage; using camp::transform; using camp::pair; using camp::triple; using vm::array; using vm::read; using camp::bbox3; using settings::getSetting; using settings::Setting; bool Iconify=false; bool ignorezoom; int Fitscreen=1; bool firstFit; bool queueExport=false; bool readyAfterExport=false; bool remesh; bool copied; int Mode; double Aspect; bool View; bool ViewExport; int Oldpid; string Prefix; const picture* Picture; string Format; int fullWidth,fullHeight; int Width,Height; GLuint pixels; GLuint elements; GLuint lastpixels; double oWidth,oHeight; int screenWidth,screenHeight; int maxTileWidth; int maxTileHeight; double Angle; bool orthographic; double H; double xmin,xmax; double ymin,ymax; double Xmin,Xmax; double Ymin,Ymax; double Zmin,Zmax; bool haveScene; pair Shift; pair Margin; double X,Y; int x0,y0; double cx,cy; double Xfactor,Yfactor; double ArcballFactor; static const double pi=acos(-1.0); static const double degrees=180.0/pi; static const double radians=1.0/degrees; double Background[4]; size_t Nlights=1; // Maximum number of lights compiled in shader size_t nlights; // Actual number of lights size_t nlights0; triple *Lights; double *Diffuse; double *Specular; bool antialias; double Zoom; double Zoom0; double lastzoom; GLint lastshader=-1; bool format3dWait=false; using glm::dvec3; using glm::dmat3; using glm::mat3; using glm::mat4; using glm::dmat4; using glm::value_ptr; using glm::translate; using camp::interlock; using camp::ssbo; mat3 normMat; dmat3 dnormMat; mat4 projViewMat; mat4 viewMat; dmat4 dprojMat; dmat4 dprojViewMat; dmat4 dviewMat; dmat4 drotateMat; const double *dprojView; const double *dView; double BBT[9]; unsigned int framecount; template inline T min(T a, T b) { return (a < b) ? a : b; } template inline T max(T a, T b) { return (a > b) ? a : b; } glm::vec4 vec4(triple v) { return glm::vec4(v.getx(),v.gety(),v.getz(),0); } glm::vec4 vec4(double *v) { return glm::vec4(v[0],v[1],v[2],v[3]); } void setDimensions(int Width, int Height, double X, double Y) { double Aspect=((double) Width)/Height; double xshift=(X/Width+Shift.getx()*Xfactor)*Zoom; double yshift=(Y/Height+Shift.gety()*Yfactor)*Zoom; double Zoominv=1.0/Zoom; if(orthographic) { double xsize=Xmax-Xmin; double ysize=Ymax-Ymin; if(xsize < ysize*Aspect) { double r=0.5*ysize*Aspect*Zoominv; double X0=2.0*r*xshift; double Y0=(Ymax-Ymin)*Zoominv*yshift; xmin=-r-X0; xmax=r-X0; ymin=Ymin*Zoominv-Y0; ymax=Ymax*Zoominv-Y0; } else { double r=0.5*xsize*Zoominv/Aspect; double X0=(Xmax-Xmin)*Zoominv*xshift; double Y0=2.0*r*yshift; xmin=Xmin*Zoominv-X0; xmax=Xmax*Zoominv-X0; ymin=-r-Y0; ymax=r-Y0; } } else { double r=H*Zoominv; double rAspect=r*Aspect; double X0=2.0*rAspect*xshift; double Y0=2.0*r*yshift; xmin=-rAspect-X0; xmax=rAspect-X0; ymin=-r-Y0; ymax=r-Y0; } } void updateProjection() { dprojViewMat=dprojMat*dviewMat; projViewMat=mat4(dprojViewMat); dprojView=value_ptr(dprojViewMat); } void frustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal) { dprojMat=glm::frustum(left,right,bottom,top,nearVal,farVal); updateProjection(); } void ortho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal) { dprojMat=glm::ortho(left,right,bottom,top,nearVal,farVal); updateProjection(); } void setProjection() { setDimensions(Width,Height,X,Y); if(haveScene) { if(orthographic) ortho(xmin,xmax,ymin,ymax,-Zmax,-Zmin); else frustum(xmin,xmax,ymin,ymax,-Zmax,-Zmin); } } void updateModelViewData() { // Like Fortran, OpenGL uses transposed (column-major) format! dnormMat=dmat3(glm::inverse(dviewMat)); double *T=value_ptr(dnormMat); for(size_t i=0; i < 9; ++i) BBT[i]=T[i]; normMat=mat3(dnormMat); } bool Xspin,Yspin,Zspin; bool Animate; bool Step; #ifdef HAVE_GL stopWatch spinTimer; void idleFunc(void (*f)()) { spinTimer.reset(); glutIdleFunc(f); } void idle() { idleFunc(NULL); Xspin=Yspin=Zspin=Animate=Step=false; } #endif void home(bool webgl=false) { X=Y=cx=cy=0.0; #ifdef HAVE_GL #ifdef HAVE_LIBGLUT #ifndef HAVE_LIBOSMESA if(!webgl) idle(); #endif #endif #endif dviewMat=dmat4(1.0); if(!camp::ssbo) dView=value_ptr(dviewMat); viewMat=mat4(dviewMat); drotateMat=dmat4(1.0); updateModelViewData(); remesh=true; lastzoom=Zoom=Zoom0; setDimensions(Width,Height,0,0); framecount=0; } double T[16]; double Tup[16]; #ifdef HAVE_GL #ifdef HAVE_LIBGLUT int oldWidth,oldHeight; bool queueScreen=false; string Action; double lastangle; int window; #endif using utils::statistics; statistics S; GLTexture2 IBLbrdfTex; GLTexture2 irradiance; GLTexture3 reflTextures; GLTexture2 fromEXR(string const& EXRFile, GLTexturesFmt const& fmt, GLint const& textureNumber) { camp::IEXRFile fil(EXRFile); return GLTexture2 {fil.getData(),fil.size(),textureNumber,fmt}; } GLTexture3 fromEXR3( mem::vector const& EXRFiles, GLTexturesFmt const& fmt, GLint const& textureNumber) { // 3d reflectance textures std::vector data; size_t count=EXRFiles.size(); int wi=0, ht=0; for(string const& EXRFile : EXRFiles) { camp::IEXRFile fil3(EXRFile); std::tie(wi,ht)=fil3.size(); size_t imSize=4*wi*ht; std::copy(fil3.getData(),fil3.getData()+imSize,std::back_inserter(data)); } return GLTexture3 { data.data(), std::tuple(wi,ht,static_cast(count)),textureNumber, fmt }; } void initIBL() { GLTexturesFmt fmt; fmt.internalFmt=GL_RGB16F; string imageDir=locateFile(getSetting("imageDir"))+"/"; string imagePath=imageDir+getSetting("image")+"/"; irradiance=fromEXR(imagePath+"diffuse.exr",fmt,1); GLTexturesFmt fmtRefl; fmtRefl.internalFmt=GL_RG16F; IBLbrdfTex=fromEXR(imageDir+"refl.exr",fmtRefl,2); GLTexturesFmt fmt3; fmt3.internalFmt=GL_RGB16F; fmt3.wrapS=GL_REPEAT; fmt3.wrapR=GL_CLAMP_TO_EDGE; fmt3.wrapT=GL_CLAMP_TO_EDGE; mem::vector files; mem::string prefix=imagePath+"refl"; for(unsigned int i=0; i <= 10; ++i) { mem::stringstream mss; mss << prefix << i << ".exr"; files.emplace_back(mss.str()); } reflTextures=fromEXR3(files,fmt3,3); } void *glrenderWrapper(void *a); #ifdef HAVE_LIBOSMESA OSMesaContext ctx; unsigned char *osmesa_buffer; #endif #ifdef HAVE_PTHREAD pthread_cond_t initSignal=PTHREAD_COND_INITIALIZER; pthread_mutex_t initLock=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t readySignal=PTHREAD_COND_INITIALIZER; pthread_mutex_t readyLock=PTHREAD_MUTEX_INITIALIZER; void endwait(pthread_cond_t& signal, pthread_mutex_t& lock) { pthread_mutex_lock(&lock); pthread_cond_signal(&signal); pthread_mutex_unlock(&lock); } void wait(pthread_cond_t& signal, pthread_mutex_t& lock) { pthread_mutex_lock(&lock); pthread_cond_signal(&signal); pthread_cond_wait(&signal,&lock); pthread_mutex_unlock(&lock); } #endif void noShaders() { cerr << "GLSL shaders not found." << endl; exit(-1); } void initComputeShaders() { string sum1=locateFile("shaders/sum1.glsl"); string sum2=locateFile("shaders/sum2.glsl"); string sum2fast=locateFile("shaders/sum2fast.glsl"); string sum3=locateFile("shaders/sum3.glsl"); if(sum1.empty() || sum2.empty() || sum2fast.empty() || sum3.empty()) noShaders(); std::vector shaders(1); std::vector shaderParams; shaders[0]=ShaderfileModePair(sum1.c_str(),GL_COMPUTE_SHADER); ostringstream s,s2; s << "LOCALSIZE " << gl::localSize << "u" << endl; shaderParams.push_back(s.str().c_str()); s2 << "BLOCKSIZE " << gl::blockSize << "u" << endl; shaderParams.push_back(s2.str().c_str()); GLuint rc=compileAndLinkShader(shaders,shaderParams,true,false,true,true); if(rc == 0) { GPUindexing=false; // Compute shaders are unavailable. if(settings::verbose > 2) cout << "No compute shader support" << endl; } else { // glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT,0,&maxgroups); // maxgroups=min(1024,maxgroups/(GLint) (localSize*localSize)); camp::sum1Shader=rc; shaders[0]=ShaderfileModePair(sum2.c_str(),GL_COMPUTE_SHADER); camp::sum2Shader=compileAndLinkShader(shaders,shaderParams,true,false, true); shaders[0]=ShaderfileModePair(sum2fast.c_str(),GL_COMPUTE_SHADER); camp::sum2fastShader=compileAndLinkShader(shaders,shaderParams,true,false, true); shaders[0]=ShaderfileModePair(sum3.c_str(),GL_COMPUTE_SHADER); camp::sum3Shader=compileAndLinkShader(shaders,shaderParams,true,false, true); } } void initBlendShader() { string screen=locateFile("shaders/screen.glsl"); string blend=locateFile("shaders/blend.glsl"); if(screen.empty() || blend.empty()) noShaders(); std::vector shaders(2); std::vector shaderParams; ostringstream s; s << "ARRAYSIZE " << maxSize << "u" << endl; shaderParams.push_back(s.str().c_str()); if(GPUindexing) shaderParams.push_back("GPUINDEXING"); if(GPUcompress) shaderParams.push_back("GPUCOMPRESS"); shaders[0]=ShaderfileModePair(screen.c_str(),GL_VERTEX_SHADER); shaders[1]=ShaderfileModePair(blend.c_str(),GL_FRAGMENT_SHADER); camp::blendShader=compileAndLinkShader(shaders,shaderParams,ssbo); } // Return the smallest power of 2 greater than or equal to n. inline GLuint ceilpow2(GLuint n) { --n; n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; return ++n; } void initShaders() { Nlights=nlights == 0 ? 0 : max(Nlights,nlights); Nmaterials=max(Nmaterials,nmaterials); string zero=locateFile("shaders/zero.glsl"); string compress=locateFile("shaders/compress.glsl"); string vertex=locateFile("shaders/vertex.glsl"); string count=locateFile("shaders/count.glsl"); string fragment=locateFile("shaders/fragment.glsl"); string screen=locateFile("shaders/screen.glsl"); if(zero.empty() || compress.empty() || vertex.empty() || fragment.empty() || screen.empty() || count.empty()) noShaders(); if(GPUindexing) initComputeShaders(); std::vector shaders(2); std::vector shaderParams; if(ibl) { shaderParams.push_back("USE_IBL"); initIBL(); } shaders[0]=ShaderfileModePair(vertex.c_str(),GL_VERTEX_SHADER); #ifdef HAVE_SSBO if(GPUindexing) shaderParams.push_back("GPUINDEXING"); if(GPUcompress) shaderParams.push_back("GPUCOMPRESS"); shaders[1]=ShaderfileModePair(count.c_str(),GL_FRAGMENT_SHADER); camp::countShader=compileAndLinkShader(shaders,shaderParams, true,false,false,true); if(camp::countShader) shaderParams.push_back("HAVE_SSBO"); #else camp::countShader=0; #endif ssbo=camp::countShader; #ifdef HAVE_LIBOSMESA interlock=false; #else interlock=ssbo && getSetting("GPUinterlock"); #endif if(!ssbo && settings::verbose > 2) cout << "No SSBO support; order-independent transparency unavailable" << endl; shaders[1]=ShaderfileModePair(fragment.c_str(),GL_FRAGMENT_SHADER); shaderParams.push_back("MATERIAL"); if(orthographic) shaderParams.push_back("ORTHOGRAPHIC"); ostringstream lights,materials,opaque; lights << "Nlights " << Nlights; shaderParams.push_back(lights.str().c_str()); materials << "Nmaterials " << Nmaterials; shaderParams.push_back(materials.str().c_str()); shaderParams.push_back("WIDTH"); camp::pixelShader=compileAndLinkShader(shaders,shaderParams,ssbo); shaderParams.pop_back(); shaderParams.push_back("NORMAL"); if(interlock) shaderParams.push_back("HAVE_INTERLOCK"); camp::materialShader[0]=compileAndLinkShader(shaders,shaderParams, ssbo,interlock,false,true); if(interlock && !camp::materialShader[0]) { shaderParams.pop_back(); interlock=false; camp::materialShader[0]=compileAndLinkShader(shaders,shaderParams,ssbo); if(settings::verbose > 2) cout << "No fragment shader interlock support" << endl; } shaderParams.push_back("OPAQUE"); camp::materialShader[1]=compileAndLinkShader(shaders,shaderParams,ssbo); shaderParams.pop_back(); shaderParams.push_back("COLOR"); camp::colorShader[0]=compileAndLinkShader(shaders,shaderParams,ssbo, interlock); shaderParams.push_back("OPAQUE"); camp::colorShader[1]=compileAndLinkShader(shaders,shaderParams,ssbo); shaderParams.pop_back(); shaderParams.push_back("GENERAL"); if(Mode != 0) shaderParams.push_back("WIREFRAME"); camp::generalShader[0]=compileAndLinkShader(shaders,shaderParams,ssbo, interlock); shaderParams.push_back("OPAQUE"); camp::generalShader[1]=compileAndLinkShader(shaders,shaderParams,ssbo); shaderParams.pop_back(); shaderParams.push_back("TRANSPARENT"); camp::transparentShader=compileAndLinkShader(shaders,shaderParams,ssbo, interlock); shaderParams.clear(); if(ssbo) { if(GPUindexing) shaderParams.push_back("GPUINDEXING"); shaders[0]=ShaderfileModePair(screen.c_str(),GL_VERTEX_SHADER); shaders[1]=ShaderfileModePair(compress.c_str(),GL_FRAGMENT_SHADER); camp::compressShader=compileAndLinkShader(shaders,shaderParams,ssbo); if(GPUindexing) shaderParams.pop_back(); else { shaders[1]=ShaderfileModePair(zero.c_str(),GL_FRAGMENT_SHADER); camp::zeroShader=compileAndLinkShader(shaders,shaderParams,ssbo); } maxSize=1; initBlendShader(); } lastshader=-1; } void deleteComputeShaders() { glDeleteProgram(camp::sum1Shader); glDeleteProgram(camp::sum2Shader); glDeleteProgram(camp::sum2fastShader); glDeleteProgram(camp::sum3Shader); } void deleteBlendShader() { glDeleteProgram(camp::blendShader); } void deleteShaders() { if(camp::ssbo) { deleteBlendShader(); if(GPUindexing) deleteComputeShaders(); else glDeleteProgram(camp::zeroShader); glDeleteProgram(camp::countShader); glDeleteProgram(camp::compressShader); } glDeleteProgram(camp::transparentShader); for(unsigned int opaque=0; opaque < 2; ++opaque) { glDeleteProgram(camp::generalShader[opaque]); glDeleteProgram(camp::colorShader[opaque]); glDeleteProgram(camp::materialShader[opaque]); } glDeleteProgram(camp::pixelShader); } void resizeBlendShader(GLuint maxsize) { gl::maxSize=ceilpow2(maxsize); gl::deleteBlendShader(); gl::initBlendShader(); } void setBuffers() { GLuint vao; glGenVertexArrays(1,&vao); glBindVertexArray(vao); camp::material0Data.reserve0(); camp::materialData.reserve(); camp::colorData.Reserve(); camp::triangleData.Reserve(); camp::transparentData.Reserve(); #ifdef HAVE_SSBO glGenBuffers(1, &camp::offsetBuffer); if(GPUindexing) { glGenBuffers(1, &camp::globalSumBuffer); glGenBuffers(1, &camp::feedbackBuffer); } glGenBuffers(1, &camp::countBuffer); if(GPUcompress) { glGenBuffers(1, &camp::indexBuffer); glGenBuffers(1, &camp::elementsBuffer); } glGenBuffers(1, &camp::fragmentBuffer); glGenBuffers(1, &camp::depthBuffer); glGenBuffers(1, &camp::opaqueBuffer); glGenBuffers(1, &camp::opaqueDepthBuffer); #endif } void drawscene(int Width, int Height) { #ifdef HAVE_PTHREAD static bool first=true; if(glthread && first) { wait(initSignal,initLock); endwait(initSignal,initLock); first=false; } if(format3dWait) wait(initSignal,initLock); #endif if((nlights == 0 && Nlights > 0) || nlights > Nlights || nmaterials > Nmaterials) { deleteShaders(); initShaders(); } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if(xmin >= xmax || ymin >= ymax || Zmin >= Zmax) return; triple m(xmin,ymin,Zmin); triple M(xmax,ymax,Zmax); double perspective=orthographic ? 0.0 : 1.0/Zmax; double size2=hypot(Width,Height); if(remesh) camp::clearCenters(); Picture->render(size2,m,M,perspective,remesh); if(!outlinemode) remesh=false; } // Return x divided by y rounded up to the nearest integer. int ceilquotient(int x, int y) { return (x+y-1)/y; } bool exporting=false; void Export() { size_t ndata=3*fullWidth*fullHeight; if(ndata == 0) return; glReadBuffer(GL_BACK_LEFT); glPixelStorei(GL_PACK_ALIGNMENT,1); glFinish(); exporting=true; try { unsigned char *data=new unsigned char[ndata]; if(data) { TRcontext *tr=trNew(); int width=ceilquotient(fullWidth, ceilquotient(fullWidth,min(maxTileWidth,Width))); int height=ceilquotient(fullHeight, ceilquotient(fullHeight, min(maxTileHeight,Height))); if(settings::verbose > 1) cout << "Exporting " << Prefix << " as " << fullWidth << "x" << fullHeight << " image" << " using tiles of size " << width << "x" << height << endl; unsigned border=min(min(1,width/2),height/2); trTileSize(tr,width,height,border); trImageSize(tr,fullWidth,fullHeight); trImageBuffer(tr,GL_RGB,GL_UNSIGNED_BYTE,data); setDimensions(fullWidth,fullHeight,X/Width*fullWidth,Y/Width*fullWidth); size_t count=0; if(haveScene) { (orthographic ? trOrtho : trFrustum)(tr,xmin,xmax,ymin,ymax,-Zmax,-Zmin); do { trBeginTile(tr); remesh=true; drawscene(fullWidth,fullHeight); gl::lastshader=-1; ++count; } while (trEndTile(tr)); } else {// clear screen and return drawscene(fullWidth,fullHeight); } if(settings::verbose > 1) cout << count << " tile" << (count != 1 ? "s" : "") << " drawn" << endl; trDelete(tr); picture pic; drawRawImage *Image=NULL; if(haveScene) { double w=oWidth; double h=oHeight; double Aspect=((double) fullWidth)/fullHeight; if(w > h*Aspect) w=(int) (h*Aspect+0.5); else h=(int) (w/Aspect+0.5); // Render an antialiased image. Image=new drawRawImage(data,fullWidth,fullHeight, transform(0.0,0.0,w,0.0,0.0,h), antialias); pic.append(Image); } pic.shipout(NULL,Prefix,Format,false,ViewExport); if(Image) delete Image; delete[] data; } } catch(handled_error const&) { } catch(std::bad_alloc&) { outOfMemory(); } remesh=true; setProjection(); #ifndef HAVE_LIBOSMESA #ifdef HAVE_LIBGLUT glutPostRedisplay(); #endif #ifdef HAVE_PTHREAD if(glthread && readyAfterExport) { readyAfterExport=false; endwait(readySignal,readyLock); } #endif #endif exporting=false; camp::initSSBO=true; } void nodisplay() { } void destroywindow() { glutDestroyWindow(glutGetWindow()); } // Return the greatest power of 2 less than or equal to n. inline unsigned int floorpow2(unsigned int n) { n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; return n-(n >> 1); } void quit() { #ifdef HAVE_LIBOSMESA if(osmesa_buffer) delete[] osmesa_buffer; if(ctx) OSMesaDestroyContext(ctx); exit(0); #endif #ifdef HAVE_LIBGLUT if(glthread) { bool animating=getSetting("animating"); if(animating) Setting("interrupt")=true; home(); Animate=getSetting("autoplay"); #ifdef HAVE_PTHREAD if(!interact::interactive || animating) { idle(); glutDisplayFunc(nodisplay); endwait(readySignal,readyLock); } #endif if(interact::interactive) glutHideWindow(); } else { glutDestroyWindow(window); exit(0); } #endif } void mode() { remesh=true; if(camp::ssbo) camp::initSSBO=true; ++Mode; if(Mode > 2) Mode=0; switch(Mode) { case 0: // regular outlinemode=false; ibl=getSetting("ibl"); nlights=nlights0; lastshader=-1; glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); break; case 1: // outline outlinemode=true; ibl=false; nlights=0; // Force shader recompilation glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); break; case 2: // wireframe outlinemode=false; Nlights=1; // Force shader recompilation break; } #ifdef HAVE_LIBGLUT #ifndef HAVE_LIBOSMESA glutPostRedisplay(); #endif #endif } // GUI-related functions #ifdef HAVE_LIBGLUT bool capsize(int& width, int& height) { bool resize=false; if(width > screenWidth) { width=screenWidth; resize=true; } if(height > screenHeight) { height=screenHeight; resize=true; } return resize; } void reshape0(int width, int height) { X=(X/Width)*width; Y=(Y/Height)*height; Width=width; Height=height; static int lastWidth=1; static int lastHeight=1; if(View && Width*Height > 1 && (Width != lastWidth || Height != lastHeight) && settings::verbose > 1) { cout << "Rendering " << stripDir(Prefix) << " as " << Width << "x" << Height << " image" << endl; lastWidth=Width; lastHeight=Height; } setProjection(); glViewport(0,0,Width,Height); if(camp::ssbo) camp::initSSBO=true; } void windowposition(int& x, int& y, int width=Width, int height=Height) { pair z=getSetting("position"); x=(int) z.getx(); y=(int) z.gety(); if(x < 0) { x += screenWidth-width; if(x < 0) x=0; } if(y < 0) { y += screenHeight-height; if(y < 0) y=0; } } void setsize(int w, int h, bool reposition=true) { int x,y; capsize(w,h); if(reposition) { windowposition(x,y,w,h); glutPositionWindow(x,y); } else glutPositionWindow(max(glutGet(GLUT_WINDOW_X)-2,0), max(glutGet(GLUT_WINDOW_Y)-2,0)); glutReshapeWindow(w,h); reshape0(w,h); glutPostRedisplay(); } void capzoom() { static double maxzoom=sqrt(DBL_MAX); static double minzoom=1.0/maxzoom; if(Zoom <= minzoom) Zoom=minzoom; if(Zoom >= maxzoom) Zoom=maxzoom; if(Zoom != lastzoom) remesh=true; lastzoom=Zoom; } void fullscreen(bool reposition=true) { Width=screenWidth; Height=screenHeight; if(firstFit) { if(Width < Height*Aspect) Zoom *= Width/(Height*Aspect); capzoom(); setProjection(); firstFit=false; } Xfactor=((double) screenHeight)/Height; Yfactor=((double) screenWidth)/Width; reshape0(Width,Height); if(reposition) glutPositionWindow(0,0); glutReshapeWindow(Width,Height); glutPostRedisplay(); } void fitscreen(bool reposition=true) { if(Animate && Fitscreen == 2) Fitscreen=0; switch(Fitscreen) { case 0: // Original size { Xfactor=Yfactor=1.0; double pixelRatio=getSetting("devicepixelratio"); setsize(oldWidth*pixelRatio,oldHeight*pixelRatio,reposition); break; } case 1: // Fit to screen in one dimension { int w=screenWidth; int h=screenHeight; if(w > h*Aspect) w=min((int) ceil(h*Aspect),w); else h=min((int) ceil(w/Aspect),h); setsize(w,h,reposition); break; } case 2: // Full screen { fullscreen(reposition); break; } } } void togglefitscreen() { ++Fitscreen; if(Fitscreen > 2) Fitscreen=0; fitscreen(); } void screen() { if(glthread && !interact::interactive) fitscreen(false); } stopWatch frameTimer; void nextframe() { #ifdef HAVE_PTHREAD endwait(readySignal,readyLock); #endif double delay=getSetting("framerate"); if(delay != 0.0) delay=1.0/delay; double seconds=frameTimer.seconds(true); delay -= seconds; if(delay > 0) { std::this_thread::sleep_for(std::chrono::duration(delay)); } if(Step) Animate=false; } stopWatch Timer; void display() { if(queueScreen) { if(!Animate) screen(); queueScreen=false; } bool fps=settings::verbose > 2; drawscene(Width,Height); if(fps) { if(framecount < 20) // Measure steady-state framerate Timer.reset(); else { double s=Timer.seconds(true); if(s > 0.0) { double rate=1.0/s; S.add(rate); if(framecount % 20 == 0) cout << "FPS=" << rate << "\t" << S.mean() << " +/- " << S.stdev() << endl; } } ++framecount; } glutSwapBuffers(); #ifdef HAVE_PTHREAD if(glthread && Animate) { queueExport=false; nextframe(); } #endif if(queueExport) { Export(); queueExport=false; } if(!glthread) { #if !defined(_WIN32) if(Oldpid != 0 && waitpid(Oldpid,NULL,WNOHANG) != Oldpid) { kill(Oldpid,SIGHUP); Oldpid=0; } #endif } } void update() { glutDisplayFunc(display); glutShowWindow(); if(Zoom != lastzoom) remesh=true; lastzoom=Zoom; double cz=0.5*(Zmin+Zmax); dviewMat=translate(translate(dmat4(1.0),dvec3(cx,cy,cz))*drotateMat, dvec3(0,0,-cz)); if(!camp::ssbo) dView=value_ptr(dviewMat); viewMat=mat4(dviewMat); setProjection(); updateModelViewData(); glutPostRedisplay(); } void updateHandler(int) { queueScreen=true; remesh=true; update(); if(interact::interactive || !Animate) { glutShowWindow(); } } void poll(int) { if(glupdate) { updateHandler(0); glupdate=false; } if(glexit) { exitHandler(0); glexit=false; } glutTimerFunc(100.0,poll,0); } void animate() { Animate=!Animate; if(Animate) { if(Fitscreen == 2) { togglefitscreen(); togglefitscreen(); } update(); } else idle(); } void reshape(int width, int height) { if(glthread) { static bool initialize=true; if(initialize) { initialize=false; #if !defined(_WIN32) Signal(SIGUSR1,updateHandler); #endif } } if(capsize(width,height)) glutReshapeWindow(width,height); reshape0(width,height); remesh=true; } void shift(int x, int y) { double Zoominv=1.0/Zoom; X += (x-x0)*Zoominv; Y += (y0-y)*Zoominv; x0=x; y0=y; update(); } void pan(int x, int y) { if(orthographic) shift(x,y); else { cx += (x-x0)*(xmax-xmin)/Width; cy += (y0-y)*(ymax-ymin)/Height; x0=x; y0=y; update(); } } void zoom(int x, int y) { if(ignorezoom) {ignorezoom=false; y0=y; return;} double zoomFactor=getSetting("zoomfactor"); if(zoomFactor > 0.0) { double zoomStep=getSetting("zoomstep"); const double limit=log(0.1*DBL_MAX)/log(zoomFactor); double stepPower=zoomStep*(y0-y); if(fabs(stepPower) < limit) { Zoom *= pow(zoomFactor,stepPower); capzoom(); y0=y; setProjection(); glutPostRedisplay(); } } } void mousewheel(int wheel, int direction, int x, int y) { double zoomFactor=getSetting("zoomfactor"); if(zoomFactor > 0.0) { if(direction > 0) Zoom *= zoomFactor; else Zoom /= zoomFactor; capzoom(); setProjection(); glutPostRedisplay(); } } struct arcball { double angle; triple axis; arcball(double x0, double y0, double x, double y) { triple v0=norm(x0,y0); triple v1=norm(x,y); double Dot=dot(v0,v1); angle=Dot > 1.0 ? 0.0 : Dot < -1.0 ? pi : acos(Dot); axis=unit(cross(v0,v1)); } triple norm(double x, double y) { double norm=hypot(x,y); if(norm > 1.0) { double denom=1.0/norm; x *= denom; y *= denom; } return triple(x,y,sqrt(max(1.0-x*x-y*y,0.0))); } }; inline double glx(int x) { return 2.0*x/Width-1.0; } inline double gly(int y) { return 1.0-2.0*y/Height; } void rotate(int x, int y) { if(x != x0 || y != y0) { arcball A(glx(x0),gly(y0),glx(x),gly(y)); triple v=A.axis; drotateMat=glm::rotate(2*A.angle/Zoom*ArcballFactor, glm::dvec3(v.getx(),v.gety(),v.getz()))* drotateMat; x0=x; y0=y; update(); } } double Degrees(int x, int y) { return atan2(0.5*Height-y-Y,x-0.5*Width-X)*degrees; } void rotateX(double step) { dmat4 tmpRot(1.0); tmpRot=glm::rotate(tmpRot,glm::radians(step),dvec3(1,0,0)); drotateMat=tmpRot*drotateMat; update(); } void rotateY(double step) { dmat4 tmpRot(1.0); tmpRot=glm::rotate(tmpRot,glm::radians(step),dvec3(0,1,0)); drotateMat=tmpRot*drotateMat; update(); } void rotateZ(double step) { dmat4 tmpRot(1.0); tmpRot=glm::rotate(tmpRot,glm::radians(step),dvec3(0,0,1)); drotateMat=tmpRot*drotateMat; update(); } void rotateX(int x, int y) { double angle=Degrees(x,y); rotateX(angle-lastangle); lastangle=angle; } void rotateY(int x, int y) { double angle=Degrees(x,y); rotateY(angle-lastangle); lastangle=angle; } void rotateZ(int x, int y) { double angle=Degrees(x,y); rotateZ(angle-lastangle); lastangle=angle; } #ifndef GLUT_WHEEL_UP #define GLUT_WHEEL_UP 3 #endif #ifndef GLUT_WHEEL_DOWN #define GLUT_WHEEL_DOWN 4 #endif string action(int button, int mod) { size_t Button; size_t nButtons=5; switch(button) { case GLUT_LEFT_BUTTON: Button=0; break; case GLUT_MIDDLE_BUTTON: Button=1; break; case GLUT_RIGHT_BUTTON: Button=2; break; case GLUT_WHEEL_UP: Button=3; break; case GLUT_WHEEL_DOWN: Button=4; break; default: Button=nButtons; } size_t Mod; size_t nMods=4; switch(mod) { case 0: Mod=0; break; case GLUT_ACTIVE_SHIFT: Mod=1; break; case GLUT_ACTIVE_CTRL: Mod=2; break; case GLUT_ACTIVE_ALT: Mod=3; break; default: Mod=nMods; } if(Button < nButtons) { array *left=getSetting("leftbutton"); array *middle=getSetting("middlebutton"); array *right=getSetting("rightbutton"); array *wheelup=getSetting("wheelup"); array *wheeldown=getSetting("wheeldown"); array *Buttons[]={left,middle,right,wheelup,wheeldown}; array *a=Buttons[button]; size_t size=checkArray(a); if(Mod < size) return read(a,Mod); } return ""; } void timeout(int) { } void mouse(int button, int state, int x, int y) { int mod=glutGetModifiers(); string Action=action(button,mod); if(Action == "zoomin") { glutMotionFunc(NULL); mousewheel(0,1,x,y); return; } if(Action == "zoomout") { glutMotionFunc(NULL); mousewheel(0,-1,x,y); return; } if(state == GLUT_DOWN) { if(Action == "rotate") { x0=x; y0=y; glutMotionFunc(rotate); } else if(Action == "shift") { x0=x; y0=y; glutMotionFunc(shift); } else if(Action == "pan") { x0=x; y0=y; glutMotionFunc(pan); } else if(Action == "zoom" || Action == "zoom/menu") { y0=y; glutMotionFunc(zoom); } else if(Action == "rotateX") { lastangle=Degrees(x,y); glutMotionFunc(rotateX); } else if(Action == "rotateY") { lastangle=Degrees(x,y); glutMotionFunc(rotateY); } else if(Action == "rotateZ") { lastangle=Degrees(x,y); glutMotionFunc(rotateZ); } } else { glutMotionFunc(NULL); } } double spinstep() { return getSetting("spinstep")*spinTimer.seconds(true); } void xspin() { rotateX(spinstep()); } void yspin() { rotateY(spinstep()); } void zspin() { rotateZ(spinstep()); } void expand() { double resizeStep=getSetting("resizestep"); if(resizeStep > 0.0) setsize((int) (Width*resizeStep+0.5),(int) (Height*resizeStep+0.5)); } void shrink() { double resizeStep=getSetting("resizestep"); if(resizeStep > 0.0) setsize(max((int) (Width/resizeStep+0.5),1), max((int) (Height/resizeStep+0.5),1)); } void spinx() { if(Xspin) idle(); else { idleFunc(xspin); Xspin=true; Yspin=Zspin=false; } } void spiny() { if(Yspin) idle(); else { idleFunc(yspin); Yspin=true; Xspin=Zspin=false; } } void spinz() { if(Zspin) idle(); else { idleFunc(zspin); Zspin=true; Xspin=Yspin=false; } } void showCamera() { projection P=camera(); string projection=P.orthographic ? "orthographic(" : "perspective("; string indent(2+projection.length(),' '); cout << endl << "currentprojection=" << endl << " " << projection << "camera=" << P.camera << "," << endl << indent << "up=" << P.up << "," << endl << indent << "target=" << P.target << "," << endl << indent << "zoom=" << P.zoom; if(!orthographic) cout << "," << endl << indent << "angle=" << P.angle; if(P.viewportshift != pair(0.0,0.0)) cout << "," << endl << indent << "viewportshift=" << P.viewportshift*Zoom; if(orthographic) cout << ",center=false"; else cout << "," << endl << indent << "autoadjust=false"; cout << ");" << endl; } void keyboard(unsigned char key, int x, int y) { switch(key) { case 'h': home(); update(); break; case 'f': togglefitscreen(); break; case 'x': spinx(); break; case 'y': spiny(); break; case 'z': spinz(); break; case 's': idle(); break; case 'm': mode(); break; case 'e': Export(); break; case 'c': showCamera(); break; case '+': case '=': case '>': expand(); break; case '-': case '_': case '<': shrink(); break; case 'p': if(getSetting("reverse")) Animate=false; Setting("reverse")=Step=false; animate(); break; case 'r': if(!getSetting("reverse")) Animate=false; Setting("reverse")=true; Step=false; animate(); break; case ' ': Step=true; animate(); break; case 17: // Ctrl-q case 'q': if(!Format.empty()) Export(); quit(); break; } } void setosize() { oldWidth=(int) ceil(oWidth); oldHeight=(int) ceil(oHeight); } #endif // end of GUI-related functions void exportHandler(int=0) { #ifdef HAVE_LIBGLUT #ifndef HAVE_LIBOSMESA if(!Iconify) glutShowWindow(); #endif #endif readyAfterExport=true; Export(); #ifdef HAVE_LIBGLUT #ifndef HAVE_LIBOSMESA if(!Iconify) glutHideWindow(); glutDisplayFunc(nodisplay); #endif #endif } static bool glinitialize=true; projection camera(bool user) { if(glinitialize) return projection(); camp::Triple vCamera,vUp,vTarget; double cz=0.5*(Zmin+Zmax); double *Rotate=value_ptr(drotateMat); if(user) { for(int i=0; i < 3; ++i) { double sumCamera=0.0, sumTarget=0.0, sumUp=0.0; int i4=4*i; for(int j=0; j < 4; ++j) { int j4=4*j; double R0=Rotate[j4]; double R1=Rotate[j4+1]; double R2=Rotate[j4+2]; double R3=Rotate[j4+3]; double T4ij=T[i4+j]; sumCamera += T4ij*(R3-cx*R0-cy*R1-cz*R2); sumUp += Tup[i4+j]*R1; sumTarget += T4ij*(R3-cx*R0-cy*R1); } vCamera[i]=sumCamera; vUp[i]=sumUp; vTarget[i]=sumTarget; } } else { for(int i=0; i < 3; ++i) { int i4=4*i; double R0=Rotate[i4]; double R1=Rotate[i4+1]; double R2=Rotate[i4+2]; double R3=Rotate[i4+3]; vCamera[i]=R3-cx*R0-cy*R1-cz*R2; vUp[i]=R1; vTarget[i]=R3-cx*R0-cy*R1; } } return projection(orthographic,vCamera,vUp,vTarget,Zoom, 2.0*atan(tan(0.5*Angle)/Zoom)/radians, pair(X/Width+Shift.getx(), Y/Height+Shift.gety())); } void init() { #ifdef HAVE_LIBGLUT mem::vector cmd; cmd.push_back(settings::argv0); if(!interact::interactive && Iconify) cmd.push_back("-iconic"); push_split(cmd,getSetting("glOptions")); char **argv=args(cmd,true); int argc=cmd.size(); #ifndef __APPLE__ glutInitContextVersion(4,0); glutInitContextProfile(GLUT_CORE_PROFILE); #endif fpu_trap(false); // Work around FE_INVALID glutInit(&argc,argv); fpu_trap(settings::trap()); #ifdef FREEGLUT glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_GLUTMAINLOOP_RETURNS); #endif screenWidth=glutGet(GLUT_SCREEN_WIDTH); screenHeight=glutGet(GLUT_SCREEN_HEIGHT); #endif } void init_osmesa() { #ifdef HAVE_LIBOSMESA // create context and buffer if(settings::verbose > 1) cout << "Allocating osmesa_buffer of size " << screenWidth << "x" << screenHeight << "x4x" << sizeof(GLubyte) << endl; osmesa_buffer=new unsigned char[screenWidth*screenHeight*4*sizeof(GLubyte)]; if(!osmesa_buffer) { cerr << "Cannot allocate image buffer." << endl; exit(-1); } const int attribs[]={ OSMESA_FORMAT,OSMESA_RGBA, OSMESA_DEPTH_BITS,16, OSMESA_STENCIL_BITS,0, OSMESA_ACCUM_BITS,0, OSMESA_PROFILE,OSMESA_COMPAT_PROFILE, OSMESA_CONTEXT_MAJOR_VERSION,4, OSMESA_CONTEXT_MINOR_VERSION,3, 0,0 }; ctx=OSMesaCreateContextAttribs(attribs,NULL); if(!ctx) { ctx=OSMesaCreateContextExt(OSMESA_RGBA,16,0,0,NULL); if(!ctx) { cerr << "OSMesaCreateContextExt failed." << endl; exit(-1); } } if(!OSMesaMakeCurrent(ctx,osmesa_buffer,GL_UNSIGNED_BYTE, screenWidth,screenHeight )) { cerr << "OSMesaMakeCurrent failed." << endl; exit(-1); } int z=0, s=0, a=0; glGetIntegerv(GL_DEPTH_BITS,&z); glGetIntegerv(GL_STENCIL_BITS,&s); glGetIntegerv(GL_ACCUM_RED_BITS,&a); if(settings::verbose > 1) cout << "Offscreen context settings: Depth=" << z << " Stencil=" << s << " Accum=" << a << endl; if(z <= 0) { cerr << "Error initializing offscreen context: Depth=" << z << endl; exit(-1); } #endif // HAVE_LIBOSMESA } bool NVIDIA() { #ifdef GL_SHADING_LANGUAGE_VERSION const char *GLSL_VERSION=(const char *) glGetString(GL_SHADING_LANGUAGE_VERSION); #else const char *GLSL_VERSION=""; #endif return string(GLSL_VERSION).find("NVIDIA") != string::npos; } #endif /* HAVE_GL */ // angle=0 means orthographic. void glrender(GLRenderArgs const& args, int oldpid) { Iconify=getSetting("iconify"); auto zoomVal=std::fpclassify(args.zoom) == FP_NORMAL ? args.zoom : 1.0; Prefix=args.prefix; Picture=args.pic; Format=args.format; nlights0=nlights=args.nlights; Lights=args.lights; Diffuse=args.diffuse; Specular=args.specular; View=args.view; Angle=args.angle*radians; Zoom0=zoomVal; Oldpid=oldpid; Shift=args.shift/zoomVal; Margin=args.margin; for(size_t i=0; i < 4; ++i) Background[i]=args.background[i]; Xmin=args.m.getx(); Xmax=args.M.getx(); Ymin=args.m.gety(); Ymax=args.M.gety(); Zmin=args.m.getz(); Zmax=args.M.getz(); haveScene=Xmin < Xmax && Ymin < Ymax && Zmin < Zmax; orthographic=Angle == 0.0; H=orthographic ? 0.0 : -tan(0.5*Angle)*Zmax; ignorezoom=false; Xfactor=Yfactor=1.0; pair maxtile=getSetting("maxtile"); maxTileWidth=(int) maxtile.getx(); maxTileHeight=(int) maxtile.gety(); if(maxTileWidth <= 0) maxTileWidth=1024; if(maxTileHeight <= 0) maxTileHeight=768; bool v3d=args.format == "v3d"; bool webgl=args.format == "html"; bool format3d=webgl || v3d; #ifdef HAVE_GL #ifdef HAVE_PTHREAD #ifndef HAVE_LIBOSMESA static bool initializedView=false; #endif #endif #ifdef HAVE_LIBOSMESA if(!webgl) { screenWidth=maxTileWidth; screenHeight=maxTileHeight; static bool osmesa_initialized=false; if(!osmesa_initialized) { osmesa_initialized=true; fpu_trap(false); // Work around FE_INVALID. init_osmesa(); fpu_trap(settings::trap()); } } #else if(glinitialize) { if(!format3d) init(); Fitscreen=1; } #endif #endif for(int i=0; i < 16; ++i) T[i]=args.t[i]; for(int i=0; i < 16; ++i) Tup[i]=args.tup[i]; static bool initialized=false; if(!(initialized && (interact::interactive || getSetting("animating")))) { antialias=getSetting("antialias") > 1; double expand; if(format3d) expand=1.0; else { expand=getSetting("render"); if(expand < 0) expand *= (Format.empty() || Format == "eps" || Format == "pdf") ? -2.0 : -1.0; if(antialias) expand *= 2.0; } oWidth=args.width; oHeight=args.height; Aspect=args.width/args.height; // Force a hard viewport limit to work around direct rendering bugs. // Alternatively, one can use -glOptions=-indirect (with a performance // penalty). pair maxViewport=getSetting("maxviewport"); int maxWidth=maxViewport.getx() > 0 ? (int) ceil(maxViewport.getx()) : screenWidth; int maxHeight=maxViewport.gety() > 0 ? (int) ceil(maxViewport.gety()) : screenHeight; if(maxWidth <= 0) maxWidth=max(maxHeight,2); if(maxHeight <= 0) maxHeight=max(maxWidth,2); if(screenWidth <= 0) screenWidth=maxWidth; else screenWidth=min(screenWidth,maxWidth); if(screenHeight <= 0) screenHeight=maxHeight; else screenHeight=min(screenHeight,maxHeight); fullWidth=(int) ceil(expand*args.width); fullHeight=(int) ceil(expand*args.height); if(format3d) { Width=fullWidth; Height=fullHeight; } else { Width=min(fullWidth,screenWidth); Height=min(fullHeight,screenHeight); if(Width > Height*Aspect) Width=min((int) (ceil(Height*Aspect)),screenWidth); else Height=min((int) (ceil(Width/Aspect)),screenHeight); } home(format3d); setProjection(); if(format3d) { remesh=true; return; } camp::maxFragments=0; ArcballFactor=1+8.0*hypot(Margin.getx(),Margin.gety())/hypot(Width,Height); #ifdef HAVE_GL Aspect=((double) Width)/Height; if(maxTileWidth <= 0) maxTileWidth=screenWidth; if(maxTileHeight <= 0) maxTileHeight=screenHeight; #ifdef HAVE_LIBGLUT setosize(); #endif #endif } #ifdef HAVE_GL bool havewindow=initialized && glthread; #ifndef HAVE_LIBOSMESA #ifdef HAVE_LIBGLUT unsigned int displaymode=GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH; #endif #ifdef __APPLE__ displaymode |= GLUT_3_2_CORE_PROFILE; #endif #endif if(glthread && format3d) format3dWait=true; camp::clearMaterials(); #ifndef HAVE_LIBOSMESA #ifdef HAVE_PTHREAD if(glthread && initializedView) { if(View) { #ifdef __MSDOS__ // Signals are unreliable in MSWindows glupdate=true; #else pthread_kill(mainthread,SIGUSR1); #endif } else readyAfterExport=queueExport=true; return; } #endif #ifdef HAVE_LIBGLUT if(View) { int x,y; if(havewindow) glutDestroyWindow(window); windowposition(x,y); glutInitWindowPosition(x,y); glutInitWindowSize(1,1); Int multisample=getSetting("multisample"); if(multisample <= 1) multisample=0; if(multisample) displaymode |= GLUT_MULTISAMPLE; glutInitDisplayMode(displaymode); int samples; #ifdef FREEGLUT #ifdef GLUT_INIT_MAJOR_VERSION for(;;) { if(multisample > 0) glutSetOption(GLUT_MULTISAMPLE,multisample); #endif #endif string title=string(PACKAGE_NAME)+": "+args.prefix; fpu_trap(false); // Work around FE_INVALID window=glutCreateWindow(title.c_str()); fpu_trap(settings::trap()); GLint samplebuf[1]; glGetIntegerv(GL_SAMPLES,samplebuf); samples=samplebuf[0]; #ifdef FREEGLUT #ifdef GLUT_INIT_MAJOR_VERSION if(samples < multisample) { multisample=floorpow2(multisample-1); if(multisample > 1) { glutReshapeWindow(1,1); glutDisplayFunc(destroywindow); glutShowWindow(); glutMainLoopEvent(); continue; } } break; } #endif #endif if(settings::verbose > 1 && samples > 1) cout << "Multisampling enabled with sample width " << samples << endl; glutDisplayFunc(display); glutShowWindow(); } else if(!havewindow) { glutInitWindowSize(maxTileWidth,maxTileHeight); glutInitDisplayMode(displaymode); fpu_trap(false); // Work around FE_INVALID window=glutCreateWindow(Iconify ? "" : "Asymptote rendering window" ); fpu_trap(settings::trap()); glutHideWindow(); } #endif // HAVE_LIBGLUT #endif // HAVE_LIBOSMESA initialized=true; #if defined(HAVE_COMPUTE_SHADER) && !defined(HAVE_LIBOSMESA) GPUindexing=getSetting("GPUindexing"); GPUcompress=getSetting("GPUcompress"); #else GPUindexing=false; GPUcompress=false; #endif GLint val; glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE,&val); if(GPUindexing) { gl::localSize=getSetting("GPUlocalSize"); gl::blockSize=getSetting("GPUblockSize"); gl::groupSize=gl::localSize*gl::blockSize; } Maxmaterials=val/sizeof(Material); if(nmaterials > Maxmaterials) nmaterials=Maxmaterials; if(glinitialize) { glinitialize=false; const char *GLSL_VERSION=(const char *) glGetString(GL_SHADING_LANGUAGE_VERSION); GLSLversion=(int) (100*atof(GLSL_VERSION)+0.5); if(GLSLversion < 130) { cerr << "Unsupported GLSL version: " << GLSL_VERSION << "." << endl; exit(-1); } if(settings::verbose > 2) cout << "GLSL version " << GLSL_VERSION << endl; int result = glewInit(); if(result != GLEW_OK) { cerr << "GLEW initialization error." << endl; exit(-1); } ibl=getSetting("ibl"); initShaders(); setBuffers(); } glClearColor(args.background[0],args.background[1],args.background[2],args.background[3]); #ifdef HAVE_LIBGLUT #ifndef HAVE_LIBOSMESA Animate=getSetting("autoplay") && glthread; if(View) { if(!getSetting("fitscreen")) Fitscreen=0; firstFit=true; fitscreen(); setosize(); } #endif #endif glEnable(GL_DEPTH_TEST); glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); glEnable(GL_TEXTURE_3D); if(!camp::ssbo) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } Mode=2; mode(); ViewExport=View; #ifdef HAVE_LIBOSMESA View=false; #endif if(View) { #ifdef HAVE_LIBGLUT #ifdef HAVE_PTHREAD #ifndef HAVE_LIBOSMESA initializedView=true; #endif #endif glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMouseFunc(mouse); glutDisplayFunc(display); #ifdef __MSDOS__ if(glthread && interact::interactive) poll(0); #endif glutMainLoop(); cout << endl; exitHandler(0); #endif // HAVE_LIBGLUT } else { if(glthread) { if(havewindow) { readyAfterExport=true; #ifdef HAVE_PTHREAD #if !defined(_WIN32) pthread_kill(mainthread,SIGUSR1); #endif #endif } else { initialized=true; readyAfterExport=true; #if !defined(_WIN32) Signal(SIGUSR1,exportHandler); #endif exportHandler(); } } else { exportHandler(); quit(); } } #endif /* HAVE_GL */ } } // namespace gl #endif #ifdef HAVE_GL namespace camp { string getLightIndex(size_t const& index, string const& fieldName) { ostringstream buf; buf << "lights[" << index << "]." << fieldName; return Strdup(buf.str()); } string getCenterIndex(size_t const& index) { ostringstream buf; buf << "Centers[" << index << "]"; return Strdup(buf.str()); } template void registerBuffer(const std::vector& buffervector, GLuint& bufferIndex, bool copy, GLenum type=GL_ARRAY_BUFFER) { if(!buffervector.empty()) { if(bufferIndex == 0) { glGenBuffers(1,&bufferIndex); copy=true; } glBindBuffer(type,bufferIndex); if(copy) glBufferData(type,buffervector.size()*sizeof(T), buffervector.data(),GL_STATIC_DRAW); } } void clearCount() { glUseProgram(zeroShader); gl::lastshader=zeroShader; glUniform1ui(glGetUniformLocation(zeroShader,"width"),gl::Width); fpu_trap(false); // Work around FE_INVALID glDrawArrays(GL_TRIANGLES, 0, 3); fpu_trap(settings::trap()); glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); } void compressCount() { glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT); glUseProgram(compressShader); gl::lastshader=compressShader; glUniform1ui(glGetUniformLocation(compressShader,"width"),gl::Width); fpu_trap(false); // Work around FE_INVALID glDrawArrays(GL_TRIANGLES, 0, 3); fpu_trap(settings::trap()); glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); } void partialSums(bool readSize=false) { // Compute partial sums on the GPU glUseProgram(sum1Shader); glDispatchCompute(gl::g,1,1); if(gl::elements <= gl::groupSize*gl::groupSize) glUseProgram(sum2fastShader); else { glUseProgram(sum2Shader); glUniform1ui(glGetUniformLocation(sum2Shader,"blockSize"), gl::ceilquotient(gl::g,gl::localSize)); } glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); glDispatchCompute(1,1,1); glUseProgram(sum3Shader); glUniform1ui(glGetUniformLocation(sum3Shader,"final"),gl::elements-1); glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); glDispatchCompute(gl::g,1,1); } void resizeFragmentBuffer() { if(GPUindexing) { glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT); glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::feedbackBuffer); GLuint *feedback=(GLuint *) glMapBuffer(GL_SHADER_STORAGE_BUFFER,GL_READ_ONLY); GLuint maxDepth=feedback[0]; if(maxDepth > gl::maxSize) gl::resizeBlendShader(maxDepth); fragments=feedback[1]; glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); } if(fragments > maxFragments) { // Initialize the alpha buffer maxFragments=11*fragments/10; glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::fragmentBuffer); glBufferData(GL_SHADER_STORAGE_BUFFER,maxFragments*sizeof(glm::vec4), NULL,GL_DYNAMIC_DRAW); glBindBufferBase(GL_SHADER_STORAGE_BUFFER,4,camp::fragmentBuffer); glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::depthBuffer); glBufferData(GL_SHADER_STORAGE_BUFFER,maxFragments*sizeof(GLfloat), NULL,GL_DYNAMIC_DRAW); glBindBufferBase(GL_SHADER_STORAGE_BUFFER,5,camp::depthBuffer); glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::feedbackBuffer); } } void refreshBuffers() { GLuint zero=0; gl::pixels=(gl::Width+1)*(gl::Height+1); if(initSSBO) { gl::processors=1; GLuint Pixels; if(GPUindexing) { GLuint G=gl::ceilquotient(gl::pixels,gl::groupSize); Pixels=gl::groupSize*G; GLuint globalSize=gl::localSize*gl::ceilquotient(G,gl::localSize); glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::globalSumBuffer); glBufferData(GL_SHADER_STORAGE_BUFFER,globalSize*sizeof(GLuint),NULL, GL_DYNAMIC_READ); glClearBufferData(GL_SHADER_STORAGE_BUFFER,GL_R32UI,GL_RED_INTEGER, GL_UNSIGNED_INT,&zero); glBindBufferBase(GL_SHADER_STORAGE_BUFFER,3,camp::globalSumBuffer); } else Pixels=gl::pixels; glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::offsetBuffer); glBufferData(GL_SHADER_STORAGE_BUFFER,(Pixels+2)*sizeof(GLuint), NULL,GL_DYNAMIC_DRAW); glBindBufferBase(GL_SHADER_STORAGE_BUFFER,0,camp::offsetBuffer); glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::countBuffer); glBufferData(GL_SHADER_STORAGE_BUFFER,(Pixels+2)*sizeof(GLuint), NULL,GL_DYNAMIC_DRAW); glBindBufferBase(GL_SHADER_STORAGE_BUFFER,2,camp::countBuffer); if(GPUcompress) { GLuint one=1; glBindBuffer(GL_ATOMIC_COUNTER_BUFFER,camp::elementsBuffer); glBufferData(GL_ATOMIC_COUNTER_BUFFER,sizeof(GLuint),&one, GL_DYNAMIC_DRAW); glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER,0,camp::elementsBuffer); glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::indexBuffer); glBufferData(GL_SHADER_STORAGE_BUFFER,gl::pixels*sizeof(GLuint), NULL,GL_DYNAMIC_DRAW); glBindBufferBase(GL_SHADER_STORAGE_BUFFER,1,camp::indexBuffer); } glClearBufferData(GL_SHADER_STORAGE_BUFFER,GL_R32UI,GL_RED_INTEGER, GL_UNSIGNED_INT,&zero); // Clear count or index buffer glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::opaqueBuffer); glBufferData(GL_SHADER_STORAGE_BUFFER,gl::pixels*sizeof(glm::vec4),NULL, GL_DYNAMIC_DRAW); glBindBufferBase(GL_SHADER_STORAGE_BUFFER,6,camp::opaqueBuffer); glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::opaqueDepthBuffer); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GLuint)+gl::pixels*sizeof(GLfloat),NULL, GL_DYNAMIC_DRAW); glBindBufferBase(GL_SHADER_STORAGE_BUFFER,7,camp::opaqueDepthBuffer); const GLfloat zerof=0.0; glClearBufferData(GL_SHADER_STORAGE_BUFFER,GL_R32F,GL_RED,GL_FLOAT,&zerof); glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::feedbackBuffer); glBufferData(GL_SHADER_STORAGE_BUFFER,2*sizeof(GLuint),NULL, GL_DYNAMIC_DRAW); glBindBufferBase(GL_SHADER_STORAGE_BUFFER,8,camp::feedbackBuffer); glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::feedbackBuffer); initSSBO=false; } // Determine the fragment offsets if(gl::exporting && GPUindexing && !GPUcompress) { glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::countBuffer); glClearBufferData(GL_SHADER_STORAGE_BUFFER,GL_R32UI,GL_RED_INTEGER, GL_UNSIGNED_INT,&zero); glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::feedbackBuffer); } if(!interlock) { drawBuffer(material1Data,countShader); drawBuffer(materialData,countShader); drawBuffer(colorData,countShader,true); drawBuffer(triangleData,countShader,true); } glDepthMask(GL_FALSE); // Don't write to depth buffer glDisable(GL_MULTISAMPLE); drawBuffer(transparentData,countShader,true); glEnable(GL_MULTISAMPLE); glDepthMask(GL_TRUE); // Write to depth buffer if(GPUcompress) { compressCount(); GLuint *p=(GLuint *) glMapBuffer(GL_ATOMIC_COUNTER_BUFFER,GL_READ_WRITE); gl::elements=GPUindexing ? p[0] : p[0]-1; p[0]=1; glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER); if(gl::elements == 0) return; } else gl::elements=gl::pixels; if(GPUindexing) { gl::g=gl::ceilquotient(gl::elements,gl::groupSize); gl::elements=gl::groupSize*gl::g; if(settings::verbose > 3) { static bool first=true; if(first) { partialSums(); first=false; } unsigned int N=10000; stopWatch Timer; for(unsigned int i=0; i < N; ++i) partialSums(); glFinish(); double T=Timer.seconds()/N; cout << "elements=" << gl::elements << endl; cout << "Tmin (ms)=" << T*1e3 << endl; cout << "Megapixels/second=" << gl::elements/T/1e6 << endl; } partialSums(true); } else { size_t size=gl::elements*sizeof(GLuint); // Compute partial sums on the CPU glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::countBuffer); GLuint *p=(GLuint *) glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0,size+sizeof(GLuint), GL_MAP_READ_BIT); GLuint maxsize=p[0]; GLuint *count=p+1; glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::offsetBuffer); GLuint *offset=(GLuint *) glMapBufferRange(GL_SHADER_STORAGE_BUFFER, sizeof(GLuint),size, GL_MAP_WRITE_BIT); size_t Offset=offset[0]=count[0]; for(size_t i=1; i < gl::elements; ++i) offset[i]=Offset += count[i]; fragments=Offset; glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::offsetBuffer); glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::countBuffer); glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); if(gl::exporting) { glBindBuffer(GL_SHADER_STORAGE_BUFFER,camp::countBuffer); glClearBufferData(GL_SHADER_STORAGE_BUFFER,GL_R32UI,GL_RED_INTEGER, GL_UNSIGNED_INT,&zero); } else clearCount(); if(maxsize > gl::maxSize) gl::resizeBlendShader(maxsize); } gl::lastshader=-1; } void setUniforms(vertexBuffer& data, GLint shader) { bool normal=shader != pixelShader; if(shader != gl::lastshader) { glUseProgram(shader); if(normal) glUniform1ui(glGetUniformLocation(shader,"width"),gl::Width); } glUniformMatrix4fv(glGetUniformLocation(shader,"projViewMat"),1,GL_FALSE, value_ptr(gl::projViewMat)); glUniformMatrix4fv(glGetUniformLocation(shader,"viewMat"),1,GL_FALSE, value_ptr(gl::viewMat)); if(normal) glUniformMatrix3fv(glGetUniformLocation(shader,"normMat"),1,GL_FALSE, value_ptr(gl::normMat)); if(shader == countShader) { gl::lastshader=shader; return; } if(shader != gl::lastshader) { gl::lastshader=shader; glUniform1ui(glGetUniformLocation(shader,"nlights"),gl::nlights); for(size_t i=0; i < gl::nlights; ++i) { triple Lighti=gl::Lights[i]; size_t i4=4*i; glUniform3f(glGetUniformLocation(shader, getLightIndex(i,"direction").c_str()), (GLfloat) Lighti.getx(),(GLfloat) Lighti.gety(), (GLfloat) Lighti.getz()); glUniform3f(glGetUniformLocation(shader, getLightIndex(i,"color").c_str()), (GLfloat) gl::Diffuse[i4],(GLfloat) gl::Diffuse[i4+1], (GLfloat) gl::Diffuse[i4+2]); } if(settings::getSetting("ibl")) { gl::IBLbrdfTex.setUniform(glGetUniformLocation(shader, "reflBRDFSampler")); gl::irradiance.setUniform(glGetUniformLocation(shader, "diffuseSampler")); gl::reflTextures.setUniform(glGetUniformLocation(shader, "reflImgSampler")); } } GLuint binding=0; GLint blockindex=glGetUniformBlockIndex(shader,"MaterialBuffer"); glUniformBlockBinding(shader,blockindex,binding); bool copy=(gl::remesh || data.partial || !data.rendered) && !gl::copied; registerBuffer(data.materials,data.materialsBuffer,copy,GL_UNIFORM_BUFFER); glBindBufferBase(GL_UNIFORM_BUFFER,binding,data.materialsBuffer); } void drawBuffer(vertexBuffer& data, GLint shader, bool color) { if(data.indices.empty()) return; bool normal=shader != pixelShader; const size_t size=sizeof(GLfloat); const size_t intsize=sizeof(GLint); const size_t bytestride=color ? sizeof(VertexData) : (normal ? sizeof(vertexData) : sizeof(vertexData0)); bool copy=(gl::remesh || data.partial || !data.rendered) && !gl::copied; if(color) registerBuffer(data.Vertices,data.VerticesBuffer,copy); else if(normal) registerBuffer(data.vertices,data.verticesBuffer,copy); else registerBuffer(data.vertices0,data.vertices0Buffer,copy); registerBuffer(data.indices,data.indicesBuffer,copy,GL_ELEMENT_ARRAY_BUFFER); camp::setUniforms(data,shader); data.rendered=true; glVertexAttribPointer(positionAttrib,3,GL_FLOAT,GL_FALSE,bytestride, (void *) 0); glEnableVertexAttribArray(positionAttrib); if(normal && gl::Nlights > 0) { glVertexAttribPointer(normalAttrib,3,GL_FLOAT,GL_FALSE,bytestride, (void *) (3*size)); glEnableVertexAttribArray(normalAttrib); } else if(!normal) { glVertexAttribPointer(widthAttrib,1,GL_FLOAT,GL_FALSE,bytestride, (void *) (3*size)); glEnableVertexAttribArray(widthAttrib); } glVertexAttribIPointer(materialAttrib,1,GL_INT,bytestride, (void *) ((normal ? 6 : 4)*size)); glEnableVertexAttribArray(materialAttrib); if(color) { glVertexAttribPointer(colorAttrib,4,GL_FLOAT,GL_FALSE,bytestride, (void *) (6*size+intsize)); glEnableVertexAttribArray(colorAttrib); } fpu_trap(false); // Work around FE_INVALID glDrawElements(data.type,data.indices.size(),GL_UNSIGNED_INT,(void *) 0); fpu_trap(settings::trap()); glDisableVertexAttribArray(positionAttrib); if(normal && gl::Nlights > 0) glDisableVertexAttribArray(normalAttrib); if(!normal) glDisableVertexAttribArray(widthAttrib); glDisableVertexAttribArray(materialAttrib); if(color) glDisableVertexAttribArray(colorAttrib); glBindBuffer(GL_UNIFORM_BUFFER,0); glBindBuffer(GL_ARRAY_BUFFER,0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); } void drawMaterial0() { drawBuffer(material0Data,pixelShader); material0Data.clear(); } void drawMaterial1() { drawBuffer(material1Data,materialShader[Opaque]); material1Data.clear(); } void drawMaterial() { drawBuffer(materialData,materialShader[Opaque]); materialData.clear(); } void drawColor() { drawBuffer(colorData,colorShader[Opaque],true); colorData.clear(); } void drawTriangle() { drawBuffer(triangleData,generalShader[Opaque],true); triangleData.clear(); } void aBufferTransparency() { // Collect transparent fragments glDepthMask(GL_FALSE); // Disregard depth drawBuffer(transparentData,transparentShader,true); glDepthMask(GL_TRUE); // Respect depth // Blend transparent fragments glDisable(GL_DEPTH_TEST); glUseProgram(blendShader); gl::lastshader=blendShader; glUniform1ui(glGetUniformLocation(blendShader,"width"),gl::Width); glUniform4f(glGetUniformLocation(blendShader,"background"), gl::Background[0],gl::Background[1],gl::Background[2], gl::Background[3]); fpu_trap(false); // Work around FE_INVALID glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); glDrawArrays(GL_TRIANGLES,0,3); fpu_trap(settings::trap()); transparentData.clear(); glEnable(GL_DEPTH_TEST); } void drawTransparent() { if(camp::ssbo) { glDisable(GL_MULTISAMPLE); aBufferTransparency(); glEnable(GL_MULTISAMPLE); } else { sortTriangles(); transparentData.rendered=false; // Force copying of sorted triangles to GPU glDepthMask(GL_FALSE); // Don't write to depth buffer drawBuffer(transparentData,transparentShader,true); glDepthMask(GL_TRUE); // Write to depth buffer transparentData.clear(); } } void drawBuffers() { gl::copied=false; Opaque=transparentData.indices.empty(); bool transparent=!Opaque; if(camp::ssbo) { if(transparent) { refreshBuffers(); if(!interlock) { resizeFragmentBuffer(); gl::copied=true; } } } drawMaterial0(); drawMaterial1(); drawMaterial(); drawColor(); drawTriangle(); if(transparent) { if(camp::ssbo) gl::copied=true; if(interlock) resizeFragmentBuffer(); drawTransparent(); } Opaque=0; } void setMaterial(vertexBuffer& data, draw_t *draw) { if(materialIndex >= data.materialTable.size() || data.materialTable[materialIndex] == -1) { if(data.materials.size() >= Maxmaterials) { data.partial=true; (*draw)(); } size_t size0=data.materialTable.size(); data.materialTable.resize(materialIndex+1); for(size_t i=size0; i < materialIndex; ++i) data.materialTable[i]=-1; data.materialTable[materialIndex]=data.materials.size(); data.materials.push_back(materials[materialIndex]); } materialIndex=data.materialTable[materialIndex]; } } #endif /* HAVE_GL */ asymptote-3.05/runbacktrace.h0000644000000000000000000000015715031566132015006 0ustar rootroot/***** Autogenerated from runbacktrace.in; changes will be overwritten *****/ #pragma once namespace run { } asymptote-3.05/EXRFiles.cc0000644000000000000000000000227115031566105014120 0ustar rootroot// // Created by jamie on 8/23/21. // #include "EXRFiles.h" #include #include "locate.h" namespace camp { using std::cout; using std::cerr; using std::endl; IEXRFile::IEXRFile(const string& File) { char const* err; int ret; string file=settings::locateFile(File); string image=settings::getSetting("image"); if(file.empty()) { cerr << "EXR file not found: " << File << endl << "Precomputed image directories like ibl/" << image << " can be " << "downloaded into the Asymptote search path like this:" << endl << endl << "wget -q --show-progress -nH -np -r --cut-dirs=1 " << settings::getSetting("imageURL") << "/refl.exr" << endl << "wget -q --show-progress -nH -np -r --cut-dirs=1 " << settings::getSetting("imageURL") << "/" << image << endl; exit(-1); } const char *filename=file.c_str(); if((ret=LoadEXR(&data,&width,&height,filename,&err)) != TINYEXR_SUCCESS) { cerr << "TinyEXR Error: " << err << " " << filename << endl; FreeEXRErrorMessage(err); exit(-1); } } IEXRFile::~IEXRFile() { if(data) { free(data); data=nullptr; } } } asymptote-3.05/arrayop.h0000644000000000000000000003322415031566105014020 0ustar rootroot/***** * arrayop * John Bowman * * Array operations *****/ #ifndef ARRAYOP_H #define ARRAYOP_H #include "util.h" #include "stack.h" #include "array.h" #include "types.h" #include "fileio.h" #include "callable.h" #include "mathop.h" namespace run { using vm::pop; using vm::read; using vm::array; using camp::tab; vm::array *copyArray(vm::array *a); vm::array *copyArray2(vm::array *a); template class op> void arrayOp(vm::stack *s) { U b=pop(s); array *a=pop(s); size_t size=checkArray(a); array *c=new array(size); for(size_t i=0; i < size; i++) (*c)[i]=op()(read(a,i),b,i); s->push(c); } template class op> void opArray(vm::stack *s) { array *a=pop(s); T b=pop(s); size_t size=checkArray(a); array *c=new array(size); for(size_t i=0; i < size; i++) (*c)[i]=op()(b,read(a,i),i); s->push(c); } template class op> void arrayArrayOp(vm::stack *s) { array *b=pop(s); array *a=pop(s); size_t size=checkArrays(a,b); array *c=new array(size); for(size_t i=0; i < size; i++) (*c)[i]=op()(read(a,i),read(b,i),i); s->push(c); } template void sumArray(vm::stack *s) { array *a=pop(s); size_t size=checkArray(a); T sum=0; for(size_t i=0; i < size; i++) sum += read(a,i); s->push(sum); } extern const char *arrayempty; template class op> void binopArray(vm::stack *s) { array *a=pop(s); size_t size=checkArray(a); if(size == 0) vm::error(arrayempty); T m=read(a,0); for(size_t i=1; i < size; i++) m=op()(m,read(a,i)); s->push(m); } template class op> void binopArray2(vm::stack *s) { array *a=pop(s); size_t size=checkArray(a); bool empty=true; T m=0; for(size_t i=0; i < size; i++) { array *ai=read(a,i); size_t aisize=checkArray(ai); if(aisize) { if(empty) { m=read(ai,0); empty=false; } for(size_t j=0; j < aisize; j++) m=op()(m,read(ai,j)); } } if(empty) vm::error(arrayempty); s->push(m); } template class op> void binopArray3(vm::stack *s) { array *a=pop(s); size_t size=checkArray(a); bool empty=true; T m=0; for(size_t i=0; i < size; i++) { array *ai=read(a,i); size_t aisize=checkArray(ai); for(size_t j=0; j < aisize; j++) { array *aij=read(ai,j); size_t aijsize=checkArray(aij); if(aijsize) { if(empty) { m=read(aij,0); empty=false; } for(size_t k=0; k < aijsize; k++) { m=op()(m,read(aij,k)); } } } } if(empty) vm::error(arrayempty); s->push(m); } template class op> void array2Op(vm::stack *s) { U b=pop(s); array *a=pop(s); size_t size=checkArray(a); array *c=new array(size); for(size_t i=0; i < size; ++i) { array *ai=read(a,i); size_t aisize=checkArray(ai); array *ci=new array(aisize); (*c)[i]=ci; for(size_t j=0; j < aisize; j++) (*ci)[j]=op()(read(ai,j),b,0); } s->push(c); } template class op> void opArray2(vm::stack *s) { array *a=pop(s); T b=pop(s); size_t size=checkArray(a); array *c=new array(size); for(size_t i=0; i < size; ++i) { array *ai=read(a,i); size_t aisize=checkArray(ai); array *ci=new array(aisize); (*c)[i]=ci; for(size_t j=0; j < aisize; j++) (*ci)[j]=op()(read(ai,j),b,0); } s->push(c); } template class op> void array2Array2Op(vm::stack *s) { array *b=pop(s); array *a=pop(s); size_t size=checkArrays(a,b); array *c=new array(size); for(size_t i=0; i < size; ++i) { array *ai=read(a,i); array *bi=read(b,i); size_t aisize=checkArrays(ai,bi); array *ci=new array(aisize); (*c)[i]=ci; for(size_t j=0; j < aisize; j++) (*ci)[j]=op()(read(ai,j),read(bi,j),0); } s->push(c); } template bool Array2Equals(vm::stack *s) { array *b=pop(s); array *a=pop(s); size_t n=checkArray(a); if(n != checkArray(b)) return false; if(n == 0) return true; size_t n0=checkArray(read(a,0)); if(n0 != checkArray(read(b,0))) return false; for(size_t i=0; i < n; ++i) { array *ai=read(a,i); array *bi=read(b,i); for(size_t j=0; j < n0; ++j) { if(read(ai,j) != read(bi,j)) return false; } } return true; } template void array2Equals(vm::stack *s) { s->push(Array2Equals(s)); } template void array2NotEquals(vm::stack *s) { s->push(!Array2Equals(s)); } template void diagonal(vm::stack *s) { array *a=pop(s); size_t n=checkArray(a); array *c=new array(n); for(size_t i=0; i < n; ++i) { array *ci=new array(n); (*c)[i]=ci; for(size_t j=0; j < i; ++j) (*ci)[j]=T(); (*ci)[i]=read(a,i); for(size_t j=i+1; j < n; ++j) (*ci)[j]=T(); } s->push(c); } template struct compare { bool operator() (const vm::item& a, const vm::item& b) { return vm::get(a) < vm::get(b); } }; template void sortArray(vm::stack *s) { array *c=copyArray(pop(s)); sort(c->begin(),c->end(),compare()); s->push(c); } template struct compare2 { bool operator() (const vm::item& A, const vm::item& B) { array *a=vm::get(A); array *b=vm::get(B); size_t size=a->size(); if(size != b->size()) return false; for(size_t j=0; j < size; j++) { if(read(a,j) < read(b,j)) return true; if(read(a,j) > read(b,j)) return false; } return false; } }; // Sort the rows of a 2-dimensional array by the first column, breaking // ties with successively higher columns. template void sortArray2(vm::stack *s) { array *c=copyArray(pop(s)); stable_sort(c->begin(),c->end(),compare2()); s->push(c); } // Search a sorted ordered array a of n elements for key, returning the index i // if a[i] <= key < a[i+1], -1 if key is less than all elements of a, or // n-1 if key is greater than or equal to the last element of a. template void searchArray(vm::stack *s) { T key=pop(s); array *a=pop(s); size_t size= a->size(); if(size == 0 || key < read(a,0)) {s->push(-1); return;} size_t u=size-1; if(key >= read(a,u)) {s->push((Int) u); return;} size_t l=0; while (l < u) { size_t i=(l+u)/2; if(key < read(a,i)) u=i; else if(key < read(a,i+1)) {s->push((Int) i); return;} else l=i+1; } s->push(0); } extern string emptystring; void writestring(vm::stack *s); template void write(vm::stack *s) { array *a=pop(s); vm::callable *suffix=pop(s,NULL); T first=pop(s); string S=pop(s,emptystring); vm::item it=pop(s); bool defaultfile=isdefault(it); camp::file *f=defaultfile ? &camp::Stdout : vm::get(it); if(!f->isOpen() || !f->enabled()) return; size_t size=checkArray(a); if(S != "") f->write(S); f->write(first); for(size_t i=0; i < size; ++i) { f->write(tab); f->write(read(a,i)); } if(f->text()) { if(suffix) { s->push(f); suffix->call(s); } else if(defaultfile) { try { f->writeline(); } catch (quit&) { } } } } template void writeArray(vm::stack *s) { array *A=pop(s); array *a=pop(s); string S=pop(s,emptystring); vm::item it=pop(s); bool defaultfile=isdefault(it); camp::file *f=defaultfile ? &camp::Stdout : vm::get(it); if(!f->isOpen() || !f->enabled()) return; size_t asize=checkArray(a); size_t Asize=checkArray(A); if(f->Standard()) interact::lines=0; else if(!f->isOpen()) return; try { if(S != "") {f->write(S); f->writeline();} size_t i=0; bool cont=true; while(cont) { cont=false; bool first=true; if(i < asize) { vm::item& I=(*a)[i]; if(defaultfile) cout << i << ":\t"; if(!I.empty()) f->write(vm::get(I)); cont=true; first=false; } unsigned count=0; for(size_t j=0; j < Asize; ++j) { array *Aj=read(A,j); size_t Ajsize=checkArray(Aj); if(i < Ajsize) { if(f->text()) { if(first && defaultfile) cout << i << ":\t"; for(unsigned k=0; k <= count; ++k) f->write(tab); count=0; } vm::item& I=(*Aj)[i]; if(!I.empty()) f->write(vm::get(I)); cont=true; first=false; } else count++; } ++i; if(cont && f->text()) f->writeline(); } } catch (quit&) { } f->flush(); } template void writeArray2(vm::stack *s) { array *a=pop(s); vm::item it=pop(s); bool defaultfile=isdefault(it); camp::file *f=defaultfile ? &camp::Stdout : vm::get(it); if(!f->isOpen() || !f->enabled()) return; size_t size=checkArray(a); if(f->Standard()) interact::lines=0; try { for(size_t i=0; i < size; i++) { vm::item& I=(*a)[i]; if(!I.empty()) { array *ai=vm::get(I); size_t aisize=checkArray(ai); for(size_t j=0; j < aisize; j++) { if(j > 0 && f->text()) f->write(tab); vm::item& I=(*ai)[j]; if(!I.empty()) f->write(vm::get(I)); } } if(f->text()) f->writeline(); } } catch (quit&) { } f->flush(); } template void writeArray3(vm::stack *s) { array *a=pop(s); vm::item it=pop(s); bool defaultfile=isdefault(it); camp::file *f=defaultfile ? &camp::Stdout : vm::get(it); if(!f->isOpen() || !f->enabled()) return; size_t size=checkArray(a); if(f->Standard()) interact::lines=0; try { for(size_t i=0; i < size;) { vm::item& I=(*a)[i]; if(!I.empty()) { array *ai=vm::get(I); size_t aisize=checkArray(ai); for(size_t j=0; j < aisize; j++) { vm::item& I=(*ai)[j]; if(!I.empty()) { array *aij=vm::get(I); size_t aijsize=checkArray(aij); for(size_t k=0; k < aijsize; k++) { if(k > 0 && f->text()) f->write(tab); vm::item& I=(*aij)[k]; if(!I.empty()) f->write(vm::get(I)); } } if(f->text()) f->writeline(); } } ++i; if(i < size && f->text()) f->writeline(); } } catch (quit&) { } f->flush(); } template void arrayFunc(vm::stack *s) { array *a=pop(s); size_t size=checkArray(a); array *c=new array(size); for(size_t i=0; i < size; i++) (*c)[i]=func(read(a,i)); s->push(c); } template void arrayFunc2(vm::stack *s) { array *a=pop(s); size_t size=checkArray(a); array *c=new array(size); for(size_t i=0; i < size; ++i) { array *ai=read(a,i); size_t aisize=checkArray(ai); array *ci=new array(aisize); (*c)[i]=ci; for(size_t j=0; j < aisize; j++) (*ci)[j]=func(read(ai,j)); } s->push(c); } vm::array *Identity(Int n); camp::triple operator *(const vm::array& a, const camp::triple& v); double norm(double *a, size_t n); double norm(camp::triple *a, size_t n); inline size_t checkdimension(const vm::array *a, size_t dim) { size_t size=checkArray(a); if(dim && size != dim) { ostringstream buf; buf << "array of length " << dim << " expected"; vm::error(buf); } return size; } template inline void copyArrayC(T* &dest, const vm::array *a, size_t dim=0, GCPlacement placement=NoGC) { size_t size=checkdimension(a,dim); dest=(placement == NoGC) ? new T[size] : new(placement) T[size]; for(size_t i=0; i < size; i++) dest[i]=vm::read(a,i); } template inline void copyArrayC(T* &dest, const vm::array *a, T (*cast)(A), size_t dim=0, GCPlacement placement=NoGC) { size_t size=checkdimension(a,dim); dest=(placement == NoGC) ? new T[size] : new(placement) T[size]; for(size_t i=0; i < size; i++) dest[i]=cast(vm::read
    (a,i)); } template inline vm::array* copyCArray(const size_t n, const T* p) { vm::array* a = new vm::array(n); for(size_t i=0; i < n; ++i) (*a)[i] = p[i]; return a; } template inline void copyArray2C(T* &dest, const vm::array *a, bool square=true, size_t dim2=0, GCPlacement placement=NoGC) { size_t n=checkArray(a); size_t m=(square || n == 0) ? n : checkArray(vm::read(a,0)); if(n > 0 && dim2 && m != dim2) { ostringstream buf; buf << "second matrix dimension must be " << dim2; vm::error(buf); } dest=(placement == NoGC) ? new T[n*m] : new(placement) T[n*m]; for(size_t i=0; i < n; i++) { vm::array *ai=vm::read(a,i); size_t aisize=checkArray(ai); if(aisize == m) { T *desti=dest+i*m; for(size_t j=0; j < m; j++) desti[j]=vm::read(ai,j); } else vm::error(square ? "matrix must be square" : "matrix must be rectangular"); } } template inline vm::array* copyCArray2(const size_t n, const size_t m, const T* p) { vm::array* a=new vm::array(n); for(size_t i=0; i < n; ++i) { array *ai=new array(m); (*a)[i]=ai; for(size_t j=0; j < m; ++j) (*ai)[j]=p[m*i+j]; } return a; } } // namespace run #endif // ARRAYOP_H asymptote-3.05/util.cc0000644000000000000000000003610215031566105013454 0ustar rootroot/***** * util.cc * John Bowman * * A place for useful utility functions. *****/ #include #include #include #include #include #include #include #include #include #include #include #include #if !defined(_WIN32) #include #include #include #include #else #include #include #include #include #define getcwd _getcwd #define chdir _chdir #endif #include "util.h" #include "settings.h" #include "errormsg.h" #include "camperror.h" #include "interact.h" #include "locate.h" using namespace settings; using camp::reportError; bool False=false; namespace vm { void error(const char* message); } #if __GNUC__ #include string demangle(const char *s) { int status; char *demangled = abi::__cxa_demangle(s,NULL,NULL,&status); if (status == 0 && demangled) { string str(demangled); free(demangled); return str; } else if (status == -2) { free(demangled); return s; } else { free(demangled); return string("Unknown(") + s + ")"; } } #else string demangle(const char* s) { return s; } #endif void showCommand(const mem::vector& s) { if(settings::verbose > 1) { cerr << s[0]; size_t count=s.size(); for(size_t i=1; i < count; ++i) cerr << " " << s[i]; cerr << endl; } } // windows specific unnamed spaces #if defined(_WIN32) int setenv(const char *name, const char *value, bool overwrite) { assert(overwrite); return SetEnvironmentVariableA(name,value); } int unsetenv(const char *name) { return setenv(name,NULL,true); } namespace w32 = camp::w32; namespace { /** @brief System, but for Windows. * Any handle placed in outHandle must be properly closed */ int SystemWin32(const mem::vector& command, int quiet, bool wait, const char* hint, const char* application, int* ppid); } namespace { int SystemWin32(const mem::vector& command, int quiet, bool wait, const char* hint, const char* application, int* ppid) { cout.flush(); if (command.empty()) { camp::reportError("Command cannot be empty"); return -1; } if(!quiet) showCommand(command); string cmdlineStr=camp::w32::buildWindowsCmd(command); STARTUPINFOA startInfo={}; startInfo.cb=sizeof(startInfo); startInfo.dwFlags=STARTF_USESTDHANDLES; SECURITY_ATTRIBUTES sa; sa.nLength= sizeof(sa); sa.lpSecurityDescriptor=nullptr; sa.bInheritHandle=true; PROCESS_INFORMATION procInfo= {}; // windows' "/dev/null" file (a.k.a. "NUL") { w32::HandleRaiiWrapper const nulFileHandle=CreateFileA( "NUL", GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); // set quiet info startInfo.hStdInput= GetStdHandle(STD_INPUT_HANDLE); startInfo.hStdOutput= quiet >= 1 ? nulFileHandle.getHandle() : GetStdHandle(STD_OUTPUT_HANDLE); startInfo.hStdError= quiet >= 2 ? nulFileHandle.getHandle() : GetStdHandle(STD_ERROR_HANDLE); ostringstream errorMessage; errorMessage << "Cannot open " << application << "\n"; string const errorMessageOut=errorMessage.str(); w32::checkResult(CreateProcessA( nullptr, cmdlineStr.data(), nullptr, nullptr, true, 0, nullptr, nullptr, &startInfo, &procInfo), errorMessageOut.c_str()); } if (ppid) { *ppid=static_cast(procInfo.dwProcessId); } w32::HandleRaiiWrapper const procHandle(procInfo.hProcess); w32::HandleRaiiWrapper const threadHandle(procInfo.hThread); if (!wait) { return 0; } DWORD retcode=-1; // else, wait switch (WaitForSingleObject(procHandle.getHandle(), INFINITE)) { case WAIT_OBJECT_0: { w32::checkResult(GetExitCodeProcess( procHandle.getHandle(), &retcode ),"Cannot get exit code of process"); break; } case WAIT_ABANDONED:// also impossible, we are waiting for a process case WAIT_TIMEOUT: // impossible, since we set timeout to infinite case WAIT_FAILED: default: camp::reportError("Waiting for process failed"); break; } return static_cast(retcode); } } #endif char *Strdup(string s) { size_t size=s.size()+1; char *dest=new(UseGC) char[size]; std::memcpy(dest,s.c_str(),size*sizeof(char)); return dest; } char *StrdupNoGC(string s) { size_t size=s.size()+1; char *dest=new char[size]; std::memcpy(dest,s.c_str(),size*sizeof(char)); return dest; } char *StrdupMalloc(string s) { size_t size=s.size()+1; char *dest=(char *) std::malloc(size); std::memcpy(dest,s.c_str(),size*sizeof(char)); return dest; } string stripDir(string name) { #if defined(_WIN32) char constexpr separator= '\\'; std::replace(name.begin(), name.end(), '/', separator); #else char constexpr separator= '/'; #endif size_t p=name.rfind(separator); if(p < string::npos) name.erase(0,p+1); return name; } string stripFile(string name) { #if defined(_WIN32) char constexpr separator = '\\'; std::replace(name.begin(), name.end(), '/', separator); #else char constexpr separator= '/'; #endif bool dir=false; size_t p=name.rfind(separator); if(p < string::npos) { dir=true; while(p > 0 && name[p-1] == separator) --p; name.erase(p+1); } return dir ? name : ""; } string stripExt(string name, const string& ext) { string suffix="."+ext; size_t p=name.rfind(suffix); size_t n=suffix.length(); if(n == 1 || p == name.length()-n) return name.substr(0,p); else return name; } void backslashToSlash(string& s) { size_t p; while((p=s.find('\\')) < string::npos) s[p]='/'; } void spaceToUnderscore(string& s) { size_t p; while((p=s.find(' ')) < string::npos) s[p]='_'; } string escapeCharacters(string const& inText, std::unordered_set const& charactersToEscape) { mem::vector retBuffer; retBuffer.reserve(inText.length() + 1); for (const char textChar : inText) { if (charactersToEscape.find(textChar) != charactersToEscape.end()) { retBuffer.emplace_back('\\'); } retBuffer.emplace_back(textChar); } retBuffer.emplace_back(0); return retBuffer.data(); } string Getenv(const char *name, bool msdos) { #if defined(_WIN32) size_t envSize=0; getenv_s(&envSize,nullptr,0,name); if (envSize == 0) { return ""; } mem::vector resultingData(envSize); if (getenv_s(&envSize, resultingData.data(), resultingData.size(), name) != 0) { camp::reportError("Cannot retrieve environment variable"); } return resultingData.data(); #else char *s=getenv(name); if(!s) return ""; string S=string(s); if(msdos) backslashToSlash(S); return S; #endif } void readDisabled() { camp::reportError("Read from other directories disabled; override with option -globalread"); } void writeDisabled() { camp::reportError("Write to other directories disabled; override with option -globalwrite"); } string cleanpath(string name) { string dir=stripFile(name); name=stripDir(name); spaceToUnderscore(name); return dir+name; } string inpath(string name) { bool global=globalread(); string dir=stripFile(name); if(global && !dir.empty()) return name; string indir=stripFile(outname()); if(!(global || dir.empty() || dir == indir)) readDisabled(); return stripDir(name); } string outpath(string name) { bool global=globalwrite(); string dir=stripFile(name); if(global && !dir.empty()) return name; string outdir=stripFile(outname()); if(!(global || dir.empty() || dir == outdir)) writeDisabled(); return outdir+stripDir(name); } string buildname(string prefix, string suffix, string aux) { string name=outpath(prefix)+aux; if(!suffix.empty()) name += "."+suffix; return name; } string auxname(string filename, string suffix) { return buildname(filename,suffix,"_"); } sighandler_t Signal(int signum, sighandler_t handler) { #if !defined(_WIN32) struct sigaction action,oldaction; action.sa_handler=handler; sigemptyset(&action.sa_mask); action.sa_flags=0; return sigaction(signum,&action,&oldaction) == 0 ? oldaction.sa_handler : SIG_ERR; #else return signal(signum, handler); #endif } void push_split(mem::vector& a, const string& S) { const char *p=S.c_str(); string s; char c; while((c=*(p++))) { if(c == ' ') { if(s.size() > 0) { a.push_back(s); s.clear(); } } else s += c; } if(s.size() > 0) a.push_back(s); } char **args(const mem::vector& s, bool quiet) { size_t count=s.size(); if(!quiet) showCommand(s); char **argv=NULL; argv=new char*[count+1]; for(size_t i=0; i < count; ++i) argv[i]=StrdupNoGC(s[i]); argv[count]=NULL; return argv; } void execError(const char *command, const char *hint, const char *application) { cerr << "Cannot execute " << command << endl; if(*application == 0) application=hint; if(hint) { string s=string(hint); transform(s.begin(), s.end(), s.begin(), toupper); cerr << "Please put in a file " << getSetting("config") << ": " << endl << endl << "import settings;" << endl << hint << "=\"LOCATION\";" << endl << endl << "where LOCATION specifies the location of " << application << "." << endl << endl << "Alternatively, set the environment variable ASYMPTOTE_" << s << endl << "or use the command line option -" << hint << "=\"LOCATION\". For further details, see" << endl << "https://asymptote.sourceforge.io/doc/Configuring.html" << endl << "https://asymptote.sourceforge.io/doc/Search-paths.html" << endl; } } // quiet: 0=none; 1=suppress stdout; 2=suppress stdout+stderr. int System(const mem::vector &command, int quiet, bool wait, const char *hint, const char *application, int *ppid) { #if _WIN32 return SystemWin32(command, quiet, wait, hint, application, ppid); #else int status; cout.flush(); // Flush stdout to avoid duplicate output. char **argv=args(command); int pid=fork(); if(pid == -1) camp::reportError("Cannot fork process"); if(pid == 0) { if(interact::interactive) signal(SIGINT,SIG_IGN); if(quiet) { static int null=creat("/dev/null",O_WRONLY); close(STDOUT_FILENO); dup2(null,STDOUT_FILENO); if(quiet == 2) { close(STDERR_FILENO); dup2(null,STDERR_FILENO); } } if(argv) { execvp(argv[0],argv); execError(argv[0],hint,application); _exit(-1); } } if(ppid) *ppid=pid; for(;;) { if(waitpid(pid, &status, wait ? 0 : WNOHANG) == -1) { if(errno == ECHILD) return 0; if(errno != EINTR) { if(quiet < 2) { ostringstream msg; msg << "Command failed: "; for(size_t i=0; i < command.size(); ++i) msg << command[i] << " "; camp::reportError(msg); } } } else { if(!wait) return 0; if(WIFEXITED(status)) { if(argv) { char **p=argv; char *s; while((s=*(p++)) != NULL) delete [] s; delete [] argv; } return WEXITSTATUS(status); } else { if(quiet < 2) { ostringstream msg; msg << "Command exited abnormally: "; for(size_t i=0; i < command.size(); ++i) msg << command[i] << " "; camp::reportError(msg); } } } } #endif } string stripblanklines(const string& s) { string S=string(s); bool blank=true; const char *t=S.c_str(); size_t len=S.length(); for(size_t i=0; i < len; i++) { if(t[i] == '\n') { if(blank) S[i]=' '; else blank=true; } else if(t[i] != '\t' && t[i] != ' ') blank=false; } return S; } char *startpath=NULL; void noPath() { camp::reportError("Cannot get current path"); } char *getPath(char *p) { #ifdef MAXPATHLEN static size_t size = MAXPATHLEN; #else static size_t size = 1024; #endif if(!p) p=new(UseGC) char[size]; if(!p) noPath(); else while(getcwd(p,size) == NULL) { if(errno == ERANGE) { size *= 2; p=new(UseGC) char[size]; } else {noPath(); p=NULL;} } return p; } const char *setPath(const char *s, bool quiet) { if(startpath == NULL) startpath=getPath(startpath); if(s == NULL || *s == 0) s=startpath; int rc=chdir(s); if(rc != 0) { ostringstream buf; buf << "Cannot change to directory '" << s << "'"; camp::reportError(buf); } char *p=getPath(); if(p && (!interact::interactive || quiet) && verbose > 1) cout << "cd " << p << endl; return p; } void push_command(mem::vector& a, const string& s) { a.push_back(s); #ifdef __MSDOS__ if(s == "cmd") { a.push_back("/c"); a.push_back("start"); a.push_back("\"\""); } #endif } void popupHelp() { #if defined(_WIN32) auto const pdfviewer= getSetting("pdfviewer"); string const docPath= docdir + dirsep + "asymptote.pdf"; if (!pdfviewer.empty()) { mem::vector cmd; push_command(cmd, pdfviewer); if (auto const viewerOpts= getSetting("pdfviewerOptions"); !viewerOpts.empty()) { istringstream viewerOptStream(viewerOpts); string tmp; while (viewerOptStream >> tmp) { if (!tmp.empty()) { cmd.push_back(tmp); } } } cmd.push_back(docPath); System(cmd, 0, false, "pdfviewer", "your PDF viewer"); } else { // pdf viewer not given, let windows decide which program to use camp::w32::checkShellExecuteResult( reinterpret_cast(ShellExecuteA(nullptr, "open", docPath.c_str(), nullptr, nullptr, SW_SHOWNORMAL)), false ); } #else // If the popped-up help is already running, pid stores the pid of the viewer. static int pid=0; // Status is ignored. static int status=0; // If the help viewer isn't running (or its last run has termined), launch the // viewer again. if (pid==0 || (waitpid(pid, &status, WNOHANG) == pid)) { mem::vector cmd; push_command(cmd,getSetting("pdfviewer")); string viewerOptions=getSetting("pdfviewerOptions"); if(!viewerOptions.empty()) cmd.push_back(viewerOptions); cmd.push_back(docdir+dirsep+"asymptote.pdf"); status=System(cmd,0,false,"pdfviewer","your PDF viewer",&pid); } #endif } const char *intrange="integer argument is outside valid range"; const char *uintrange="integer argument is outside valid unsigned range"; unsigned unsignedcast(Int n) { if(n < 0 || n/2 > INT_MAX) vm::error(uintrange); return (unsigned) n; } unsignedInt unsignedIntcast(Int n) { if(n < 0) vm::error(uintrange); return (unsignedInt) n; } int intcast(Int n) { if(Abs(n) > INT_MAX) vm::error(intrange); return (int) n; } Int Intcast(unsignedInt n) { if(n > (unsignedInt) Int_MAX) vm::error(intrange); return (Int) n; } bool fileExists(string const& path) { #if defined(_WIN32) return PathFileExistsA(path.c_str()); #else return access(path.c_str(), R_OK) == 0; #endif } asymptote-3.05/runbacktrace.cc0000644000000000000000000000517015031566132015144 0ustar rootroot/***** Autogenerated from runbacktrace.in; changes will be overwritten *****/ #line 1 "./runtimebase.in" /***** * runtimebase.in * Andy Hammerlindl 2009/07/28 * * Common declarations needed for all code-generating .in files. * *****/ #line 1 "./runbacktrace.in" /***** * backtrace.in * Andy Hammerlindl 2009/07/28 * * Runtime functions for printing garbage collector backtraces. * *****/ #line 23 "./runtimebase.in" #include "stack.h" #include "types.h" #include "builtin.h" #include "entry.h" #include "errormsg.h" #include "array.h" #include "triple.h" #include "callable.h" #include "opsymbols.h" using vm::stack; using vm::error; using vm::array; using vm::read; using vm::callable; using types::formal; using types::function; using camp::triple; #define PRIMITIVE(name,Name,asyName) using types::prim##Name; #include #undef PRIMITIVE void unused(void *); namespace run { typedef double real; array *copyArray(array *a); array *copyArray2(array *a); array *copyArray3(array *a); double *copyTripleArray2Components(array *a, size_t &N, GCPlacement placement=NoGC); triple *copyTripleArray2C(array *a, size_t &N, GCPlacement placement=NoGC); } function *realRealFunction(); #define CURRENTPEN processData().currentpen #line 11 "runbacktrace.in" // No extra code for .cc file. // Autogenerated routines: #ifndef NOSYM #include "runbacktrace.symbols.h" #endif namespace run { #line 16 "./runbacktrace.in" // void generate_random_backtrace(); void gen_runbacktrace0(stack *) { #line 17 "./runbacktrace.in" #if defined(USEGC) && defined(GC_DEBUG) && defined(GC_BACKTRACE) GC_generate_random_backtrace(); #else error("generate_random_backtrace() requires ./configure --enable-gc-debug"); #endif } #line 25 "./runbacktrace.in" // void print_random_addresses(Int n=1); void gen_runbacktrace1(stack *Stack) { Int n=vm::pop(Stack,1); #line 26 "./runbacktrace.in" #if defined(USEGC) && defined(GC_DEBUG) && defined(GC_BACKTRACE) GC_gcollect(); for (Int i=0; i < n; ++i) GC_debug_print_heap_obj_proc(GC_base(GC_generate_random_valid_address())); #else error("print_random_addresses() requires ./configure --enable-gc-debug"); unused(&n); // Avoid unused variable warning message. #endif } } // namespace run namespace trans { void gen_runbacktrace_venv(venv &ve) { #line 16 "./runbacktrace.in" addFunc(ve, run::gen_runbacktrace0, primVoid(), SYM(generate_random_backtrace)); #line 25 "./runbacktrace.in" addFunc(ve, run::gen_runbacktrace1, primVoid(), SYM(print_random_addresses), formal(primInt(), SYM(n), true, false)); } } // namespace trans asymptote-3.05/EXRFiles.h0000644000000000000000000000063715031566105013766 0ustar rootroot// // Created by jamie on 8/23/21. // #pragma once #include "common.h" namespace camp { class IEXRFile { public: IEXRFile(string const& file); ~IEXRFile(); [[nodiscard]] float const* getData() const { return data; } [[nodiscard]] std::pair size() const { return std::make_pair(width, height); } private: float* data=nullptr; int width=0, height=0; }; } // namespace gl; asymptote-3.05/locate.cc0000644000000000000000000000342715031566105013752 0ustar rootroot/***** * locate.cc * Tom Prince 2005/03/24 * * Locate files in search path. *****/ #include "settings.h" #include "util.h" #include "locate.h" namespace settings { namespace fs { string extension(string name) { size_t n = name.rfind("."); if (n != string::npos) return name.substr(n); else return string(); } bool exists(string filename) { return fileExists(filename); } } // namespace fs file_list_t searchPath; // Returns list of possible filenames, accounting for extensions. file_list_t mungeFileName(string id, string suffix) { string ext = fs::extension(id); file_list_t files; if (ext == "."+suffix) { files.push_back(id); files.push_back(id+"."+suffix); } else { files.push_back(id+"."+suffix); files.push_back(id); } return files; } // Join a directory with the given filename, to give the path to the file, // avoiding unsightly joins such as 'dir//file.asy' in favour of 'dir/file.asy' string join(string dir, string file, bool full) { return dir == "." ? (full ? string(getPath())+"/"+file : file) : *dir.rbegin() == '/' ? dir + file : dir + "/" + file; } // Find the appropriate file, first looking in the local directory, then the // directory given in settings, and finally the global system directory. string locateFile(string id, bool full, string suffix) { if(id.empty()) return ""; file_list_t filenames = mungeFileName(id,suffix); for (auto const& leaf : filenames) { if (leaf[0] == '/') { // FIXME: Add windows path check string file = leaf; if (fs::exists(file)) return file; } else { for (auto const& dir : searchPath) { string file = join(dir,leaf,full); if (fs::exists(file)) return file; } } } return string(); } } // namespace settings asymptote-3.05/vcpkg.json0000644000000000000000000000315015031566105014172 0ustar rootroot{ "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json", "builtin-baseline": "5e5d0e1cd7785623065e77eff011afdeec1a3574", "name": "asymptote", "version": "0.0-snapshot", "dependencies": [ "zlib", "glm", { "name": "getopt-win32", "platform": "windows" } ], "features": { "threading": { "description": "Enable threading support", "dependencies": ["pthreads"] }, "readline": { "description": "Enable readline support", "dependencies": [ "readline", { "name": "ncurses", "platform": "!windows" }, { "name": "pdcurses", "platform": "windows" } ] }, "curl": { "description": "Enable curl support", "dependencies": ["curl"] }, "eigen3": { "description": "eigen3 support", "dependencies": ["eigen3"] }, "gsl": { "description": "GSL support", "dependencies": ["gsl"] }, "fftw3": { "description": "fftw3 support", "dependencies": ["fftw3"] }, "opengl": { "description": "OpenGL Support", "dependencies": [ "opengl", "freeglut" ] }, "lsp": { "description": "Language Server Protocol Support", "dependencies": [ "rapidjson", "boost-asio", "boost-beast", "boost-date-time", "boost-chrono", "boost-filesystem", "boost-system", "boost-uuid", "boost-thread", "boost-process", "boost-program-options" ] } } } asymptote-3.05/table.h0000644000000000000000000000521115031566105013425 0ustar rootroot/***** * table.h * Andy Hammerlindl 2002/06/18 * * Table used to bind symbols to vars and types in a namespace. *****/ #ifndef TABLE_H #define TABLE_H #include #include #include "symbol.h" #include "common.h" namespace sym { template class table; template std::ostream& operator<< (std::ostream& out, const table& t); template class table { protected: typedef mem::multimap scope_t; typedef typename scope_t::iterator scope_iterator; typedef mem::list scopes_t; typedef mem::list name_t; typedef typename name_t::iterator name_iterator; typedef mem::map names_t; typedef typename names_t::iterator names_iterator; scopes_t scopes; names_t names; void remove(symbol key); public : table(); void enter(symbol key, B value); B look(symbol key); // Allows scoping and overloading of symbols of the same name void beginScope(); void endScope(); // Copies all bindings in the top scope to the scope underneath it, and // removes the the top scope. void collapseScope(); // Adds to l, all names prefixed by start. void completions(mem::list& l, string start); friend std::ostream& operator<< (std::ostream& out, const table& t); }; template inline table::table() { beginScope(); } template inline void table::enter(symbol key, B value) { scopes.front().insert(std::make_pair(key,value)); names[key].push_front(value); } template inline B table::look(symbol key) { if (!names[key].empty()) return names[key].front(); return 0; } template inline void table::beginScope() { scopes.push_front(scope_t()); } template inline void table::remove(symbol key) { if (!names[key].empty()) names[key].pop_front(); } template inline void table::endScope() { scope_t &scope = scopes.front(); for (scope_iterator p = scope.begin(); p != scope.end(); ++p) remove(p->first); scopes.pop_front(); } template inline void table::collapseScope() { scope_t scope = scopes.front(); scopes.pop_front(); scopes.front().insert(scope.begin(), scope.end()); } // Returns true if start is a prefix for name; eg, mac is a prefix of machine. inline bool prefix(string start, string name) { return equal(start.begin(), start.end(), name.begin()); } template inline void table::completions(mem::list& l, string start) { for (names_iterator p = names.begin(); p != names.end(); ++p) if (prefix(start, p->first) && !p->second.empty()) l.push_back(p->first); } } // namespace sym #endif asymptote-3.05/types.h0000644000000000000000000003656015031566105013515 0ustar rootroot/***** * types.h * Andy Hammerlindl 2002/06/20 * * Used by the compiler as a way to keep track of the type of a variable * or expression. * *****/ #ifndef TYPES_H #define TYPES_H #include #include #include #include "errormsg.h" #include "symbol.h" #include "common.h" #include "util.h" using std::ostream; using sym::symbol; // Forward declaration. namespace trans { class access; class varEntry; } namespace absyntax { class varinit; extern varinit *Default; } namespace types { enum ty_kind { ty_null, ty_record, // "struct" in Asymptote language ty_function, ty_overloaded, #define PRIMITIVE(name,Name,asyName) ty_##name, #define PRIMERROR #include "primitives.h" #undef PRIMERROR #undef PRIMITIVE ty_array }; // Forward declarations. class ty; struct signature; typedef mem::vector ty_vector; typedef ty_vector::iterator ty_iterator; // Checks if two types are equal in the sense of the language. // That is primitive types are equal if they are the same kind. // Structures are equal if they come from the same struct definition. // Arrays are equal if their cell types are equal. bool equivalent(const ty *t1, const ty *t2); // If special is true, this is the same as above. If special is false, just // the signatures are compared. bool equivalent(const ty *t1, const ty *t2, bool special); class caster { public: virtual ~caster() {} virtual trans::access *operator() (ty *target, ty *source) = 0; virtual bool castable(ty *target, ty *source) = 0; }; class ty : public gc { public: const ty_kind kind; ty(ty_kind kind) : kind(kind) {} virtual ~ty(); virtual void print (ostream& out) const; virtual void printVar (ostream& out, string name) const { print(out); out << " " << name; } // Returns true if the type is a user-defined type or the null type. // While the pair, path, etc. are stored by reference, this is // transparent to the user. virtual bool isReference() { return true; } virtual signature *getSignature() { return 0; } virtual const signature *getSignature() const { return 0; } virtual bool primitive() { return false; } bool isError() const { return kind == ty_error; } bool isNotError() const { return !isError(); } // The following are only used by the overloaded type, but it is so common // to test for an overloaded type then iterate over its types, that this // allows the code: // if (t->isOverloaded()) { // for (ty_iterator i = t->begin(); i != t->end(); ++i) { // ... // } // } // For speed reasons, only begin has an assert to test if t is overloaded. bool isOverloaded() const { return kind == ty_overloaded; } bool isNotOverloaded() const { return !isOverloaded(); } ty_iterator begin(); ty_iterator end(); // If a default initializer is not stored in the environment, the abstract // syntax asks the type if it has a "default" default initializer, by calling // this method. virtual trans::access *initializer() { return 0; } // If a cast function is not stored in the environment, ask the type itself. // This handles null->record casting, and the like. The caster is used as a // callback to the environment for casts of subtypes. virtual trans::access *castTo(ty *, caster &) { return 0; } // Just checks if a cast is possible. virtual bool castable(ty *target, caster &c) { return castTo(target, c); } // For pair's x and y, and array's length, this is a special type of // "field". // In actually, it returns a function which takes the object as its // parameter and returns the necessary result. // These should not have public permission, as modifying them would // have strange results. virtual trans::varEntry *virtualField(symbol, signature *) { return 0; } // varGetType for virtual fields. // Unless you are using functions for virtual fields, the base implementation // should work fine. virtual ty *virtualFieldGetType(symbol id); #if 0 // Returns the type. In case of functions, return the equivalent type // but with no default values for parameters. virtual ty *stripDefaults() { return this; } #endif // Returns true if the other type is equivalent to this one. // The general function equivalent should be preferably used, as it properly // handles overloaded type comparisons. virtual bool equiv(const ty *other) const { return this==other; } // Returns a number for the type for use in a hash table. Equivalent types // must yield the same number. virtual size_t hash() const = 0; }; class primitiveTy : public ty { public: primitiveTy(ty_kind kind) : ty(kind) {} bool primitive() { return true; } bool isReference() { return false; } ty *virtualFieldGetType(symbol ); trans::varEntry *virtualField(symbol, signature *); bool equiv(const ty *other) const { return this->kind==other->kind; } size_t hash() const { return (size_t)kind + 47; } }; class nullTy : public primitiveTy { public: nullTy() : primitiveTy(ty_null) {} bool isReference() { return true; } trans::access *castTo(ty *target, caster &); size_t hash() const { return (size_t)kind + 47; } }; // Ostream output, just defer to print. inline ostream& operator<< (ostream& out, const ty& t) { t.print(out); return out; } struct array : public ty { ty *celltype; ty *pushtype; ty *poptype; ty *appendtype; ty *inserttype; ty *deletetype; array(ty *celltype) : ty(ty_array), celltype(celltype), pushtype(0), poptype(0), appendtype(0), inserttype(0), deletetype(0) {} virtual bool isReference() { return true; } bool equiv(const ty *other) const { return other->kind==ty_array && equivalent(this->celltype,((array *)other)->celltype); } size_t hash() const { return 1007 * celltype->hash(); } Int depth() { if (array *cell=dynamic_cast(celltype)) return cell->depth() + 1; else return 1; } void print(ostream& out) const { out << *celltype << "[]"; } ty *pushType(); ty *popType(); ty *appendType(); ty *insertType(); ty *deleteType(); // Initialize to an empty array by default. trans::access *initializer(); // NOTE: General vectorization of casts would be here. // Add length and push as virtual fields. ty *virtualFieldGetType(symbol id); trans::varEntry *virtualField(symbol id, signature *sig); }; /* Base types */ #define PRIMITIVE(name,Name,asyName) \ ty *prim##Name(); \ ty *name##Array(); \ ty *name##Array2(); \ ty *name##Array3(); #define PRIMERROR #include "primitives.h" #undef PRIMERROR #undef PRIMITIVE ty *primNull(); struct formal { ty *t; symbol name; bool defval; bool Explicit; formal(ty *t, symbol name=symbol::nullsym, bool optional=false, bool Explicit=false) : t(t), name(name), defval(optional), Explicit(Explicit) {} // string->symbol translation is costly if done too many times. This // constructor has been disabled to make this cost more visible to the // programmer. #if 0 formal(ty *t, const char *name, bool optional=false, bool Explicit=false) : t(t), name(symbol::trans(name)), defval(optional ? absyntax::Default : 0), Explicit(Explicit) {} #endif friend ostream& operator<< (ostream& out, const formal& f); }; bool equivalent(const formal& f1, const formal& f2); bool argumentEquivalent(const formal &f1, const formal& f2); typedef mem::vector formal_vector; // Holds the parameters of a function and if they have default values // (only applicable in some cases). struct signature : public gc { formal_vector formals; // The number of keyword-only formals. These formals always come after the // regular formals. size_t numKeywordOnly; // Formal for the rest parameter. If there is no rest parameter, then the // type is null. formal rest; bool isOpen; signature() : numKeywordOnly(0), rest(0), isOpen(false) {} struct OPEN_t {}; static const OPEN_t OPEN; explicit signature(OPEN_t) : numKeywordOnly(0), rest(0), isOpen(true) {} signature(signature &sig) : formals(sig.formals), numKeywordOnly(sig.numKeywordOnly), rest(sig.rest), isOpen(sig.isOpen) {} virtual ~signature() {} void add(formal f) { formals.push_back(f); } void addKeywordOnly(formal f) { add(f); ++numKeywordOnly; } void addRest(formal f) { rest=f; } bool hasRest() const { return rest.t; } size_t getNumFormals() const { return rest.t ? formals.size() + 1 : formals.size(); } formal& getFormal(size_t n) { assert(n < formals.size()); return formals[n]; } const formal& getFormal(size_t n) const { assert(n < formals.size()); return formals[n]; } formal& getRest() { return rest; } const formal& getRest() const { return rest; } bool formalIsKeywordOnly(size_t n) const { assert(n < formals.size()); return n >= formals.size() - numKeywordOnly; } friend string toString(const signature& s); friend ostream& operator<< (ostream& out, const signature& s); friend bool equivalent(const signature *s1, const signature *s2); // Check if a signature of argument types (as opposed to formal parameters) // are equivalent. Here, the arguments, if named, must have the same names, // and (for simplicity) no overloaded arguments are allowed. friend bool argumentEquivalent(const signature *s1, const signature *s2); #if 0 friend bool castable(signature *target, signature *source); friend Int numFormalsMatch(signature *s1, signature *s2); #endif size_t hash() const; // Return a unique handle for this signature size_t handle(); }; struct function : public ty { ty *result; signature sig; function(ty *result) : ty(ty_function), result(result) {} function(ty *result, signature::OPEN_t) : ty(ty_function), result(result), sig(signature::OPEN) {} function(ty *result, signature *sig) : ty(ty_function), result(result), sig(*sig) {} function(ty *result, formal f1) : ty(ty_function), result(result) { add(f1); } function(ty *result, formal f1, formal f2) : ty(ty_function), result(result) { add(f1); add(f2); } function(ty *result, formal f1, formal f2, formal f3) : ty(ty_function), result(result) { add(f1); add(f2); add(f3); } function(ty *result, formal f1, formal f2, formal f3, formal f4) : ty(ty_function), result(result) { add(f1); add(f2); add(f3); add(f4); } virtual ~function() {} void add(formal f) { sig.add(f); } void addRest(formal f) { sig.addRest(f); } virtual bool isReference() { return true; } bool equiv(const ty *other) const { if (other->kind==ty_function) { function *that=(function *)other; return equivalent(this->result,that->result) && equivalent(&this->sig,&that->sig); } else return false; } size_t hash() const { return sig.hash()*0x1231+result->hash(); } void print(ostream& out) const { out << *result << sig; } void printVar (ostream& out, string name) const { result->printVar(out,name); out << sig; } ty *getResult() { return result; } signature *getSignature() { return &sig; } const signature *getSignature() const { return &sig; } #if 0 ty *stripDefaults(); #endif // Initialized to null. trans::access *initializer(); }; // This is used in getType expressions when an overloaded variable is accessed. class overloaded : public ty { public: ty_vector sub; // Warning: The venv endScope routine relies heavily on the current // implementation of overloaded. public: overloaded() : ty(ty_overloaded) {} overloaded(ty *t) : ty(ty_overloaded) { add(t); } virtual ~overloaded() {} bool equiv(const ty *other) const { for(ty_vector::const_iterator i=sub.begin();i!=sub.end();++i) if (equivalent(*i,other)) return true; return false; } size_t hash() const { // Overloaded types should not be hashed. assert(False); return 0; } #ifdef __clang__ #elif __GNUC__ #pragma GCC push_options #pragma GCC optimize("O2") #endif void add(ty *t) { if (t->kind == ty_overloaded) { overloaded *ot = (overloaded *)t; copy(ot->sub.begin(), ot->sub.end(), inserter(this->sub, this->sub.end())); } else sub.push_back(t); } #ifdef __clang__ #elif __GNUC__ #pragma GCC pop_options #endif // Only add a type distinct from the ones currently in the overloaded type. // If special is false, just the distinct signatures are added. void addDistinct(ty *t, bool special=false); // If there are less than two overloaded types, the type isn't really // overloaded. This gives a more appropriate type in this case. ty *simplify() { switch (sub.size()) { case 0: return 0; case 1: { return sub.front(); } default: return new overloaded(*this); } } // Returns the signature-less type of the set. ty *signatureless(); // True if one of the subtypes is castable. bool castable(ty *target, caster &c); size_t size() const { return sub.size(); } // Use default printing for now. }; inline ty_iterator ty::begin() { assert(this->isOverloaded()); return ((overloaded *)this)->sub.begin(); } inline ty_iterator ty::end() { return ((overloaded *)this)->sub.end(); } // This is used to encapsulate iteration over the subtypes of an overloaded // type. The base method need only be implemented to handle non-overloaded // types. class collector { public: virtual ~collector() {} virtual ty *base(ty *target, ty *source) = 0; virtual ty *collect(ty *target, ty *source) { if (overloaded *o=dynamic_cast(target)) { ty_vector &sub=o->sub; overloaded *oo=new overloaded; for(ty_vector::iterator x = sub.begin(); x != sub.end(); ++x) { types::ty *t=collect(*x, source); if (t) oo->add(t); } return oo->simplify(); } else if (overloaded *o=dynamic_cast(source)) { ty_vector &sub=o->sub; overloaded *oo=new overloaded; for(ty_vector::iterator y = sub.begin(); y != sub.end(); ++y) { // NOTE: A possible speed optimization would be to replace this with a // call to base(), but this is only correct if we can guarantee that an // overloaded type has no overloaded sub-types. types::ty *t=collect(target, *y); if (t) oo->add(t); } return oo->simplify(); } else return base(target, source); } }; class tester { public: virtual ~tester() {} virtual bool base(ty *target, ty *source) = 0; virtual bool test(ty *target, ty *source) { if (overloaded *o=dynamic_cast(target)) { ty_vector &sub=o->sub; for(ty_vector::iterator x = sub.begin(); x != sub.end(); ++x) if (test(*x, source)) return true; return false; } else if (overloaded *o=dynamic_cast(source)) { ty_vector &sub=o->sub; for(ty_vector::iterator y = sub.begin(); y != sub.end(); ++y) if (base(target, *y)) return true; return false; } else return base(target, source); } }; } // namespace types GC_DECLARE_PTRFREE(types::primitiveTy); GC_DECLARE_PTRFREE(types::nullTy); #endif asymptote-3.05/ax_pthread.m40000644000000000000000000005403415031566105014555 0ustar rootroot# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_pthread.html # =========================================================================== # # SYNOPSIS # # AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) # # DESCRIPTION # # This macro figures out how to build C programs using POSIX threads. It # sets the PTHREAD_LIBS output variable to the threads library and linker # flags, and the PTHREAD_CFLAGS output variable to any special C compiler # flags that are needed. (The user can also force certain compiler # flags/libs to be tested by setting these environment variables.) # # Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is # needed for multi-threaded programs (defaults to the value of CC # respectively CXX otherwise). (This is necessary on e.g. AIX to use the # special cc_r/CC_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, # but also to link with them as well. For example, you might link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # # If you are only building threaded programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" # CC="$PTHREAD_CC" # CXX="$PTHREAD_CXX" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant # has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to # that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the # PTHREAD_PRIO_INHERIT symbol is defined when compiling with # PTHREAD_CFLAGS. # # ACTION-IF-FOUND is a list of shell commands to run if a threads library # is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it # is not found. If ACTION-IF-FOUND is not specified, the default action # will define HAVE_PTHREAD. # # Please let the authors know if this macro fails on any platform, or if # you have any other suggestions or comments. This macro was based on work # by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help # from M. Frigo), as well as ac_pthread and hb_pthread macros posted by # Alejandro Forero Cuervo to the autoconf macro repository. We are also # grateful for the helpful feedback of numerous users. # # Updated for Autoconf 2.68 by Daniel Richard G. # # LICENSE # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2011 Daniel Richard G. # Copyright (c) 2019 Marc Stevens # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation, either version 3 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General # Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 31 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_PROG_SED]) AC_LANG_PUSH([C]) ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on Tru64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then ax_pthread_save_CC="$CC" ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) AS_IF([test "x$PTHREAD_CXX" != "x"], [CXX="$PTHREAD_CXX"]) CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) AC_MSG_RESULT([$ax_pthread_ok]) if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi CC="$ax_pthread_save_CC" CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items with a "," contain both # C compiler flags (before ",") and linker flags (after ","). Other items # starting with a "-" are C compiler flags, and remaining items are # library names, except for "none" which indicates that we try without # any flags at all, and "pthread-config" which is a program returning # the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 # (Note: HP C rejects this with "bad form for `-t' option") # -pthreads: Solaris/gcc (Note: HP C also rejects) # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads and # -D_REENTRANT too), HP C (must be checked before -lpthread, which # is present but should not be used directly; and before -mthreads, # because the compiler interprets this as "-mt" + "-hreads") # -mthreads: Mingw32/gcc, Lynx/gcc # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case $host_os in freebsd*) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) ax_pthread_flags="-kthread lthread $ax_pthread_flags" ;; hpux*) # From the cc(1) man page: "[-mt] Sets various -D flags to enable # multi-threading and also sets -lpthread." ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" ;; openedition*) # IBM z/OS requires a feature-test macro to be defined in order to # enable POSIX threads at all, so give the user a hint if this is # not set. (We don't define these ourselves, as they can affect # other portions of the system API in unpredictable ways.) AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], [ # if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) AX_PTHREAD_ZOS_MISSING # endif ], [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) ;; solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (N.B.: The stubs are missing # pthread_cleanup_push, or rather a function called by this macro, # so we could check for that, but who knows whether they'll stub # that too in a future libc.) So we'll check first for the # standard Solaris way of linking pthreads (-mt -lpthread). ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" ;; esac # Are we compiling with Clang? AC_CACHE_CHECK([whether $CC is Clang], [ax_cv_PTHREAD_CLANG], [ax_cv_PTHREAD_CLANG=no # Note that Autoconf sets GCC=yes for Clang as well as GCC if test "x$GCC" = "xyes"; then AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ # if defined(__clang__) && defined(__llvm__) AX_PTHREAD_CC_IS_CLANG # endif ], [ax_cv_PTHREAD_CLANG=yes]) fi ]) ax_pthread_clang="$ax_cv_PTHREAD_CLANG" # GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) # Note that for GCC and Clang -pthread generally implies -lpthread, # except when -nostdlib is passed. # This is problematic using libtool to build C++ shared libraries with pthread: # [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 # [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 # [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 # To solve this, first try -pthread together with -lpthread for GCC AS_IF([test "x$GCC" = "xyes"], [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"]) # Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first AS_IF([test "x$ax_pthread_clang" = "xyes"], [ax_pthread_flags="-pthread,-lpthread -pthread"]) # The presence of a feature test macro requesting re-entrant function # definitions is, on some systems, a strong hint that pthreads support is # correctly enabled case $host_os in darwin* | hpux* | linux* | osf* | solaris*) ax_pthread_check_macro="_REENTRANT" ;; aix*) ax_pthread_check_macro="_THREAD_SAFE" ;; *) ax_pthread_check_macro="--" ;; esac AS_IF([test "x$ax_pthread_check_macro" = "x--"], [ax_pthread_check_cond=0], [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) if test "x$ax_pthread_ok" = "xno"; then for ax_pthread_try_flag in $ax_pthread_flags; do case $ax_pthread_try_flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; *,*) PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) PTHREAD_CFLAGS="$ax_pthread_try_flag" ;; pthread-config) AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_LINK_IFELSE([AC_LANG_PROGRAM([#include # if $ax_pthread_check_cond # error "$ax_pthread_check_macro must be defined" # endif static void *some_global = NULL; static void routine(void *a) { /* To avoid any unused-parameter or unused-but-set-parameter warning. */ some_global = a; } static void *start_routine(void *a) { return a; }], [pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */])], [ax_pthread_ok=yes], []) CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" AC_MSG_RESULT([$ax_pthread_ok]) AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Clang needs special handling, because older versions handle the -pthread # option in a rather... idiosyncratic way if test "x$ax_pthread_clang" = "xyes"; then # Clang takes -pthread; it has never supported any other flag # (Note 1: This will need to be revisited if a system that Clang # supports has POSIX threads in a separate library. This tends not # to be the way of modern systems, but it's conceivable.) # (Note 2: On some systems, notably Darwin, -pthread is not needed # to get POSIX threads support; the API is always present and # active. We could reasonably leave PTHREAD_CFLAGS empty. But # -pthread does define _REENTRANT, and while the Darwin headers # ignore this macro, third-party headers might not.) # However, older versions of Clang make a point of warning the user # that, in an invocation where only linking and no compilation is # taking place, the -pthread option has no effect ("argument unused # during compilation"). They expect -pthread to be passed in only # when source code is being compiled. # # Problem is, this is at odds with the way Automake and most other # C build frameworks function, which is that the same flags used in # compilation (CFLAGS) are also used in linking. Many systems # supported by AX_PTHREAD require exactly this for POSIX threads # support, and in fact it is often not straightforward to specify a # flag that is used only in the compilation phase and not in # linking. Such a scenario is extremely rare in practice. # # Even though use of the -pthread flag in linking would only print # a warning, this can be a nuisance for well-run software projects # that build with -Werror. So if the active version of Clang has # this misfeature, we search for an option to squash it. AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown # Create an alternate version of $ac_link that compiles and # links in two steps (.c -> .o, .o -> exe) instead of one # (.c -> exe), because the warning occurs only in the second # step ax_pthread_save_ac_link="$ac_link" ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' ax_pthread_link_step=`AS_ECHO(["$ac_link"]) | sed "$ax_pthread_sed"` ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" ax_pthread_save_CFLAGS="$CFLAGS" for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" ac_link="$ax_pthread_save_ac_link" AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], [ac_link="$ax_pthread_2step_ac_link" AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], [break]) ]) done ac_link="$ax_pthread_save_ac_link" CFLAGS="$ax_pthread_save_CFLAGS" AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" ]) case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in no | unknown) ;; *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; esac fi # $ax_pthread_clang = yes # Various other checks: if test "x$ax_pthread_ok" = "xyes"; then ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_CACHE_CHECK([for joinable pthread attribute], [ax_cv_PTHREAD_JOINABLE_ATTR], [ax_cv_PTHREAD_JOINABLE_ATTR=unknown for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [int attr = $ax_pthread_attr; return attr /* ; */])], [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], []) done ]) AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ test "x$ax_pthread_joinable_attr_defined" != "xyes"], [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$ax_cv_PTHREAD_JOINABLE_ATTR], [Define to necessary symbol if this constant uses a non-standard name on your system.]) ax_pthread_joinable_attr_defined=yes ]) AC_CACHE_CHECK([whether more special flags are required for pthreads], [ax_cv_PTHREAD_SPECIAL_FLAGS], [ax_cv_PTHREAD_SPECIAL_FLAGS=no case $host_os in solaris*) ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" ;; esac ]) AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ test "x$ax_pthread_special_flags_added" != "xyes"], [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" ax_pthread_special_flags_added=yes]) AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], [ax_cv_PTHREAD_PRIO_INHERIT], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int i = PTHREAD_PRIO_INHERIT; return i;]])], [ax_cv_PTHREAD_PRIO_INHERIT=yes], [ax_cv_PTHREAD_PRIO_INHERIT=no]) ]) AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ test "x$ax_pthread_prio_inherit_defined" != "xyes"], [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) ax_pthread_prio_inherit_defined=yes ]) CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" # More AIX lossage: compile with *_r variant if test "x$GCC" != "xyes"; then case $host_os in aix*) AS_CASE(["x/$CC"], [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], [#handle absolute path differently from PATH based program lookup AS_CASE(["x$CC"], [x/*], [ AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"]) AS_IF([test "x${CXX}" != "x"], [AS_IF([AS_EXECUTABLE_P([${CXX}_r])],[PTHREAD_CXX="${CXX}_r"])]) ], [ AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC]) AS_IF([test "x${CXX}" != "x"], [AC_CHECK_PROGS([PTHREAD_CXX],[${CXX}_r],[$CXX])]) ] ) ]) ;; esac fi fi test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" AC_SUBST([PTHREAD_LIBS]) AC_SUBST([PTHREAD_CFLAGS]) AC_SUBST([PTHREAD_CC]) AC_SUBST([PTHREAD_CXX]) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test "x$ax_pthread_ok" = "xyes"; then ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) : else ax_pthread_ok=no $2 fi AC_LANG_POP ])dnl AX_PTHREAD asymptote-3.05/runpicture.h0000644000000000000000000000021315031566132014533 0ustar rootroot/***** Autogenerated from runpicture.in; changes will be overwritten *****/ #pragma once namespace run { void newPicture(vm::stack *); } asymptote-3.05/runhistory.h0000644000000000000000000000015515031566132014566 0ustar rootroot/***** Autogenerated from runhistory.in; changes will be overwritten *****/ #pragma once namespace run { } asymptote-3.05/xstream.cc0000644000000000000000000001520015031566105014156 0ustar rootroot#include "xstream.h" #if defined(HAVE_CONFIG_H) #include "config.h" #else #define HAVE_LIBTIRPC 1 #endif #if defined(HAVE_LIBTIRPC) namespace xdr { // xbyte xbyte::xbyte() {} xbyte::xbyte(unsigned char c0): c(c0) {} xbyte::xbyte(int c0): c((unsigned char) c0) {} xbyte::xbyte(unsigned c0): c((unsigned char) c0) {} int xbyte::byte() const { return c; } xbyte::operator unsigned char() const { return c; } // xios int xios::good() const { return _state == 0; } int xios::eof() const { return _state & eofbit; } int xios::fail() const { return !good();} int xios::bad() const { return _state & badbit; } void xios::clear(int state) {_state=state;} void xios::set(int flag) {_state |= flag;} xios::operator void*() const { return fail() ? (void*)0 : (void*)(-1); } int xios::operator!() const { return fail(); } // xstream xstream::~xstream() {} xstream::xstream(): xios(), buf(nullptr) {} void xstream::precision(int) {} xstream& xstream::seek(OffsetType pos, seekdir dir) { if(buf) { clear(); if(fseeko(buf,pos,dir) != 0) set(failbit); } return *this; } OffsetType xstream::tell() { return ftello(buf); } // ixstream ixstream::ixstream(bool singleprecision) : singleprecision(singleprecision) { } void ixstream::open(const char* filename, open_mode) { clear(); buf=fopen(filename,"rb"); if(buf) xdrstdio_create(&xdri,buf,XDR_DECODE); else set(badbit); } void ixstream::close() { closeFile(); } void ixstream::closeFile() { if(buf) { #ifndef _CRAY xdr_destroy(&xdri); #endif fclose(buf); buf=nullptr; } } ixstream::ixstream(const char* filename, bool singleprecision) : singleprecision(singleprecision) { ixstream::open(filename); } ixstream::ixstream(const char* filename, open_mode mode, bool singleprecision) : singleprecision(singleprecision) { ixstream::open(filename,mode); } ixstream::~ixstream() { ixstream::close(); } ixstream& ixstream::operator>>(imanip func) { return (*func)(*this); } ixstream& ixstream::operator>>(double& x) { if(singleprecision) { float f; *this >> f; x=(double) f; } else if(!xdr_double(&xdri, &x)) set(eofbit); return *this; } ixstream& ixstream::operator>>(xbyte& x) { int c=fgetc(buf); if(c != EOF) x=c; else set(eofbit); return *this; } // oxstream oxstream::oxstream(bool singleprecision): singleprecision(singleprecision) { } void oxstream::open(const char* filename, open_mode mode) { clear(); buf=fopen(filename,(mode & app) ? "ab" : "wb"); if(buf) xdrstdio_create(&xdro,buf,XDR_ENCODE); else set(badbit); } void oxstream::close() { closefile(); } void oxstream::closefile() { if(buf) { #ifndef _CRAY xdr_destroy(&xdro); #endif fclose(buf); buf=NULL; } } oxstream::oxstream(const char* filename, bool singleprecision) : singleprecision(singleprecision) { oxstream::open(filename); } oxstream::oxstream(const char* filename, open_mode mode, bool singleprecision) : singleprecision(singleprecision) { oxstream::open(filename,mode); } oxstream::~oxstream() { closefile(); } oxstream& oxstream::flush() {if(buf) fflush(buf); return *this;} oxstream& oxstream::operator<<(omanip func) { return (*func)(*this); } oxstream& oxstream::operator<<(double x) { if(singleprecision) *this << (float) x; else if(!xdr_double(&xdro, &x)) set(badbit); return *this; } oxstream& oxstream::operator<<(xbyte x) { if(fputc(x.byte(),buf) == EOF) set(badbit); return *this; } memoxstream::memoxstream(bool singleprecision) : oxstream(singleprecision) #if defined(_WIN32) ,fmInstance() #endif { clear(); #if defined(_WIN32) fmem_init(&fmInstance); buf=fmem_open(&fmInstance, "w+"); #else buf=open_memstream(&buffer,&size); #endif if(buf) xdrstdio_create(&xdro,buf,XDR_ENCODE); else set(badbit); } memoxstream::~memoxstream() { closefile(); #if defined(_WIN32) fmem_term(&fmInstance); #else free(buffer); #endif } std::vector memoxstream::createCopyOfCurrentData() { auto flushResult = fflush(buf); if (flushResult != 0) { std::cerr << "cannot flush memory xstream"; exit(EXIT_FAILURE); } #if defined(_WIN32) size_t retSize=0; void* streamPtr=nullptr; // DANGER: There's a severe but rare issue with certain systems // involving a potential memory leak. // See https://github.com/Kreijstal/fmem/issues/6 // Right now, we have no reasonable way to determine if a tmpfile // implementation is being used, so we cannot have a way to // conditionally free the memory. // On most systems, we have the open_memstream and Windows tmpfile API, // where the allocation/mapping is handled by the system; hence // there is no need to free the pointer ourselves. // But the tmpfile implementation uses malloc that doesn't // get freed, so it is our job to manually free it. fmem_mem(&fmInstance, &streamPtr, &retSize); if (streamPtr == nullptr) { return {}; } auto* bytePtr = static_cast(streamPtr); std::vector ret(bytePtr, bytePtr + retSize); return ret; #else // for sanity check, always ensure that we have a vector of bytes static_assert(sizeof(char) == sizeof(uint8_t)); if (buffer == nullptr) { return {}; } auto* retPtr = reinterpret_cast(buffer); return {retPtr, retPtr + size}; #endif } // memixstream memixstream::memixstream(char* data, size_t length, bool singleprecision) : ixstream(singleprecision) { xdrmem_create(&xdri,data,length,XDR_DECODE); } memixstream::memixstream(std::vector& data, bool singleprecision) : memixstream(data.data(), data.size(), singleprecision) { } memixstream::~memixstream() { xdr_destroy(&xdri); } void memixstream::close() { xdr_destroy(&xdri); } void memixstream::open(const char* filename, open_mode openMode) { } // ioxstream void ioxstream::open(const char* filename, open_mode mode) { clear(); if(mode & app) buf=fopen(filename,"ab+"); else if(mode & trunc) buf=fopen(filename,"wb+"); else if(mode & out) { buf=fopen(filename,"rb+"); if(!buf) buf=fopen(filename,"wb+"); } else buf=fopen(filename,"rb"); if(buf) { xdrstdio_create(&xdri,buf,XDR_DECODE); xdrstdio_create(&xdro,buf,XDR_ENCODE); } else set(badbit); } void ioxstream::close() { if(buf) { #ifndef _CRAY xdr_destroy(&xdri); xdr_destroy(&xdro); #endif fclose(buf); buf=NULL; } } ioxstream::ioxstream() { } ioxstream::ioxstream(const char* filename) { ioxstream::open(filename); } ioxstream::ioxstream(const char* filename, open_mode mode) { ioxstream::open(filename,mode); } ioxstream::~ioxstream() { ioxstream::close(); } oxstream& endl(oxstream& s) { s.flush(); return s; } oxstream& flush(oxstream& s) {s.flush(); return s;} } #endif asymptote-3.05/config.h.in0000644000000000000000000001551015031566106014214 0ustar rootroot/* config.h.in. Generated from configure.ac by autoheader. */ #pragma once /* Directory for documentation */ #undef ASYMPTOTE_DOCDIR /* System directory for global .asy files */ #undef ASYMPTOTE_SYSDIR /* Freeglut is enabled */ #undef FREEGLUT /* GC backtrace is enabled */ #undef GC_BACKTRACE /* GC Debug is enabled */ #undef GC_DEBUG /* Define to 1 if you have `GLSL compute shaders`. */ #undef HAVE_COMPUTE_SHADER /* Define to 1 if you have the header file. */ #undef HAVE_CURSES_H /* Define to 1 if you have the 'dup2' function. */ #undef HAVE_DUP2 /* Define to 1 if you have the header file. */ #undef HAVE_EDITLINE_READLINE_H /* Define to 1 if you have the header file. */ #undef HAVE_EIGEN_DENSE /* Define to 1 if you have the 'feenableexcept' function. */ #undef HAVE_FEENABLEEXCEPT /* Define to 1 if you have the header file. */ #undef HAVE_FENV_H /* Define to 1 if you have the 'floor' function. */ #undef HAVE_FLOOR /* Define to 1 if you have the 'fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the header file. */ #undef HAVE_FPU_CONTROL_H /* Define to 1 if fseeko (and ftello) are declared in stdio.h. */ #undef HAVE_FSEEKO /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the 'lgamma' function. */ #undef HAVE_LGAMMA /* Define to 1 if you have the `curl` library (-lcurl). */ #undef HAVE_LIBCURL /* Define to 1 if you have the `ncurses` library (-lncurses). */ #undef HAVE_LIBCURSES /* Define to 1 if you have the 'edit' library (-ledit). */ #undef HAVE_LIBEDIT /* Define to 1 if you have the `fftw3` library (-lfftw3). */ #undef HAVE_LIBFFTW3 /* Define to 1 if you have the 'gccpp' library (-lgccpp). */ #undef HAVE_LIBGCCPP /* Define to 1 if you have the `GL` library (-lGL). */ #undef HAVE_LIBGL /* Define to 1 if you have `the header`. */ #undef HAVE_LIBGLM /* Define to 1 if you have the 'glut' library (-lglut). */ #undef HAVE_LIBGLUT /* Define to 1 if you have the `gsl` library (-lgsl). */ #undef HAVE_LIBGSL /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define to 1 if you have the 'OSMesa' library (-lOSMesa). */ #undef HAVE_LIBOSMESA /* Define to 1 if you have the `readline` library (-lreadline). */ #undef HAVE_LIBREADLINE /* Define to 1 if you have the 'rt' library (-lrt). */ #undef HAVE_LIBRT /* Define to 1 if you have the 'sigsegv' library (-lsigsegv). */ #undef HAVE_LIBSIGSEGV /* Define to 1 if you have the `tinfo` library (-ltinfo). */ #undef HAVE_LIBTINFO /* Define to 1 if you have the `tirpc` library (-ltirpc). */ #undef HAVE_LIBTIRPC /* Define to 1 if you have the 'z' library (-lz). */ #undef HAVE_LIBZ /* Define to 1 if the system has the type 'long'. */ #undef HAVE_LONG /* Define to 1 if the system has the type 'long long'. */ #undef HAVE_LONG_LONG /* Define to 1 if you have `Language server protocol`. */ #undef HAVE_LSP /* Define to 1 if you have the 'memrchr' function. */ #undef HAVE_MEMRCHR /* Define to 1 if you have the 'memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the header file. */ #undef HAVE_NCURSES_CURSES_H /* Define to 1 if you have the header file. */ #undef HAVE_NCURSES_H /* Define to 1 if you have the 'popcount' function. */ #undef HAVE_POPCOUNT /* Define if you have POSIX threads libraries and header files. */ #undef HAVE_PTHREAD /* Have PTHREAD_PRIO_INHERIT. */ #undef HAVE_PTHREAD_PRIO_INHERIT /* Define to 1 if the system has the type 'ptrdiff_t'. */ #undef HAVE_PTRDIFF_T /* Define to 1 if you have `GLSL shader storage buffer objects`. */ #undef HAVE_SSBO /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the 'strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the 'strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the 'strnlen' function. */ #undef HAVE_STRNLEN /* Define to 1 if you have the 'strptime' function. */ #undef HAVE_STRPTIME /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the 'tgamma' function. */ #undef HAVE_TGAMMA /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Unordered map is present */ #undef HAVE_UNORDERED_MAP /* Define to 1 if you have the 'vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if 'fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if 'vfork' works. */ #undef HAVE_WORKING_VFORK /* ZLib library present */ #undef HAVE_ZLIB /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to necessary symbol if this constant uses a non-standard name on your system. */ #undef PTHREAD_CREATE_JOINABLE /* Define to 1 if all of the C89 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Endianness is determined at compile time */ #undef UNIVERSAL_ENDIAN_BUILD /* GC Enabled */ #undef USEGC /* Build is big endian */ #undef WORDS_BIGENDIAN /* Define to 1 if 'lex' declares 'yytext' as a 'char *' by default, not a 'char[]'. */ #undef YYTEXT_POINTER /* Define to 1 if necessary to make fseeko visible. */ #undef _LARGEFILE_SOURCE /* Define to empty if 'const' does not conform to ANSI C. */ #undef const /* Define to '__inline__' or '__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define as a signed integer type capable of holding a process identifier. */ #undef pid_t /* Define as 'unsigned int' if doesn't define. */ #undef size_t /* Define as 'fork' if 'vfork' does not work. */ #undef vfork asymptote-3.05/main.cc0000644000000000000000000001616415031566105013431 0ustar rootroot/************ * * This file is part of the vector graphics language Asymptote * Copyright (C) 2004 Andy Hammerlindl, John C. Bowman, Tom Prince * https://asymptote.sourceforge.io * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include #include #include #include #if !defined(_WIN32) #include #endif #include "common.h" #ifdef HAVE_LIBSIGSEGV #include #endif #define GC_PTHREAD_SIGMASK_NEEDED #ifdef HAVE_LSP #include "lspserv.h" #endif #include "exithandlers.h" #include "errormsg.h" #include "fpu.h" #include "settings.h" #include "locate.h" #include "interact.h" #include "fileio.h" #include "stack.h" #ifdef HAVE_LIBFFTW3 #include "fftw++.h" #endif #if defined(_WIN32) #include #endif #include "stack.h" using namespace settings; using interact::interactive; namespace gl { extern bool glexit; } namespace run { void purge(); } #ifdef PROFILE namespace vm { extern void dumpProfile(); }; #endif #ifdef HAVE_LIBSIGSEGV void stackoverflow_handler (int, stackoverflow_context_t) { em.runtime(vm::getPos()); cerr << "Stack overflow" << endl; abort(); } int sigsegv_handler (void *, int emergency) { if(!emergency) return 0; // Really a stack overflow em.runtime(vm::getPos()); #ifdef HAVE_GL if(gl::glthread) cerr << "Stack overflow or segmentation fault: rerun with -nothreads" << endl; else #endif cerr << "Segmentation fault" << endl; abort(); } #endif void setsignal(void (*handler)(int)) { #ifdef HAVE_LIBSIGSEGV char mystack[16384]; stackoverflow_install_handler(&stackoverflow_handler, mystack,sizeof (mystack)); sigsegv_install_handler(&sigsegv_handler); #endif #if !defined(_WIN32) Signal(SIGBUS,handler); #endif Signal(SIGFPE,handler); } struct Args { int argc; char **argv; Args(int argc, char **argv) : argc(argc), argv(argv) {} }; void *asymain(void *A) { setsignal(signalHandler); Args *args=(Args *) A; fpu_trap(trap()); #ifdef HAVE_LIBFFTW3 fftwpp::wisdomName=".wisdom"; #endif #if defined(_WIN32) // see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecuteexa CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); #endif if(interactive) { Signal(SIGINT,interruptHandler); #ifdef HAVE_LSP if (getSetting("lsp")) { AsymptoteLsp::LspLog log; auto jsonHandler=std::make_shared(); auto endpoint=std::make_shared(log); unique_ptr asylsp; if(getSetting("lspport") != "") { asylsp=make_unique( (std::string)getSetting("lsphost").c_str(), (std::string)getSetting("lspport").c_str(), jsonHandler, endpoint, log); } else { asylsp=make_unique(jsonHandler, endpoint, log); } asylsp->start(); } else #endif processPrompt(); } else if (getSetting("listvariables") && numArgs()==0) { try { doUnrestrictedList(); } catch(handled_error const&) { em.statusError(); } } else { int n=numArgs(); if(n == 0) { int inpipe=intcast(settings::getSetting("inpipe")); bool hasInpipe=inpipe >= 0; if(hasInpipe) { #if !defined(_WIN32) Signal(SIGHUP,hangup_handler); #endif camp::openpipeout(); fprintf(camp::pipeout,"\n"); fflush(camp::pipeout); } for(;;) { processFile("-",true); try { setOptions(args->argc,args->argv); } catch(handled_error const&) { em.statusError(); } if(inpipe < 0) break; } } else { for(int ind=0; ind < n; ind++) { string name=(getArg(ind)); string prefix=stripExt(name); if(name == prefix+".v3d") { interact::uptodate=false; runString("import v3d; defaultfilename=\""+stripDir(prefix)+ "\"; importv3d(\""+name+"\");"); } else processFile(name,n > 1); try { if(ind < n-1) setOptions(args->argc,args->argv); } catch(handled_error const&) { em.statusError(); } } } } #ifdef PROFILE vm::dumpProfile(); #endif if(getSetting("wait")) { #if defined(_WIN32) #pragma message("TODO: wait option not implement yet") #else int status; while(wait(&status) > 0); #endif } #ifdef HAVE_GL #ifdef HAVE_PTHREAD if(gl::glthread) { #ifdef __MSDOS__ // Signals are unreliable in MSWindows gl::glexit=true; #else pthread_kill(gl::mainthread,SIGURG); pthread_join(gl::mainthread,NULL); #endif } #endif #endif exit(returnCode()); } int main(int argc, char *argv[]) { #ifdef HAVE_LIBGSL unsetenv("GSL_RNG_SEED"); unsetenv("GSL_RNG_TYPE"); #endif setsignal(signalHandler); try { setOptions(argc,argv); } catch(handled_error const&) { em.statusError(); } Args args(argc,argv); #ifdef HAVE_GL #if defined(__APPLE__) || defined(_WIN32) #if defined(_WIN32) #pragma message("TODO: Check if (1) we need detach-based gl renderer") #endif bool usethreads=true; #else bool usethreads=view(); #endif gl::glthread=usethreads ? getSetting("threads") : false; #if HAVE_PTHREAD #ifndef HAVE_LIBOSMESA if(gl::glthread) { pthread_t thread; try { #if defined(_WIN32) auto asymainPtr = [](void* args) -> void* { #if defined(USEGC) GC_stack_base gsb {}; GC_get_stack_base(&gsb); GC_register_my_thread(&gsb); #endif auto* ret = asymain(args); #if defined(USEGC) GC_unregister_my_thread(); #endif return reinterpret_cast(ret); }; #else auto* asymainPtr = asymain; #endif if(pthread_create(&thread,NULL,asymainPtr,&args) == 0) { gl::mainthread=pthread_self(); #if !defined(_WIN32) sigset_t set; sigemptyset(&set); sigaddset(&set, SIGCHLD); pthread_sigmask(SIG_BLOCK, &set, NULL); #endif for(;;) { #if !defined(_WIN32) Signal(SIGURG,exitHandler); #endif camp::glrenderWrapper(); gl::initialize=true; } } else gl::glthread=false; } catch(std::bad_alloc&) { outOfMemory(); } } #endif #endif gl::glthread=false; #endif asymain(&args); } asymptote-3.05/varinit.h0000644000000000000000000000373415031566105014022 0ustar rootroot/***** * varinit.h * Andy Hammerlindl 2005/07/01 * * Variable initializers are syntax that finish code such as * Int var = ... * As such, they are translated to yield a certain type, the type of the * variable. Expressions are a special case that can be translated without an * associated variable or its type. *****/ #ifndef VARINIT_H #define VARINIT_H #include "types.h" #include "symbol.h" #include "absyn.h" namespace absyntax { using trans::coenv; using trans::access; using sym::symbol; using types::array; class varinit : public absyn { public: varinit(position pos) : absyn(pos) {} // This determines what instruction are needed to put the associated // value onto the stack, then adds those instructions to the current // lambda in e. // In some expressions and initializers, the target type needs to be // known in order to translate properly. For most expressions, this is // kept to a minimum. // For expression, this also allows an implicit cast, hence the name. virtual void transToType(coenv &e, types::ty *target) = 0; }; // A default initializer. For example: // int a; // is in some sense equivalent to // int a=0; // where the definit for Int is a function that returns 0. class definit : public varinit { public: definit(position pos) : varinit(pos) {} void prettyprint(ostream &out, Int indent); void transToType(coenv &e, types::ty *target); }; class arrayinit : public varinit { mem::list inits; varinit *rest; public: arrayinit(position pos) : varinit(pos), rest(0) {} virtual ~arrayinit() {} void prettyprint(ostream &out, Int indent); // Encodes the instructions to make an array from size elements on the stack. static void transMaker(coenv &e, Int size, bool rest); void transToType(coenv &e, types::ty *target); void add(varinit *init) { inits.push_back(init); } void addRest(varinit *init) { rest=init; } friend class joinExp; }; } // namespace absyntax #endif asymptote-3.05/bezierpatch.h0000644000000000000000000001322715031566105014644 0ustar rootroot/***** * bezierpatch.h * Authors: John C. Bowman and Jesse Frohlich * * Render Bezier patches and triangles. *****/ #ifndef BEZIERPATCH_H #define BEZIERPATCH_H #include "drawelement.h" namespace camp { #ifdef HAVE_LIBGLM struct BezierPatch { vertexBuffer data; bool transparent; bool color; double epsilon; double Epsilon; double res2; double Res2; // Reduced resolution for Bezier triangles flatness test. typedef GLuint (vertexBuffer::*vertexFunction)(const triple &v, const triple& n); vertexFunction pvertex; bool Onscreen; BezierPatch() : transparent(false), color(false), Onscreen(true) {} void init(double res); void init(double res, GLfloat *colors) { transparent=false; color=colors; init(res); } triple normal(triple left3, triple left2, triple left1, triple middle, triple right1, triple right2, triple right3) { triple lp=3.0*(left1-middle); triple rp=3.0*(right1-middle); triple n=cross(rp,lp); if(abs2(n) > epsilon) return n; triple lpp=bezierPP(middle,left1,left2); triple rpp=bezierPP(middle,right1,right2); n=cross(rpp,lp)+cross(rp,lpp); if(abs2(n) > epsilon) return n; triple lppp=bezierPPP(middle,left1,left2,left3); triple rppp=bezierPPP(middle,right1,right2,right3); n=cross(rpp,lpp)+cross(rppp,lp)+cross(rp,lppp); if(abs2(n) > epsilon) return n; n=cross(rppp,lpp)+cross(rpp,lppp); if(abs2(n) > epsilon) return n; return cross(rppp,lppp); } // Return the differential of the Bezier curve p0,p1,p2,p3 at 0 triple differential(triple p0, triple p1, triple p2, triple p3) { triple p=p1-p0; if(abs2(p) > epsilon) return p; p=bezierPP(p0,p1,p2); if(abs2(p) > epsilon) return p; return bezierPPP(p0,p1,p2,p3); } // Determine the flatness of a Bezier patch. pair Distance(const triple *p) { triple p0=p[0]; triple p3=p[3]; triple p12=p[12]; triple p15=p[15]; // Check the horizontal flatness. double h=Flatness(p0,p12,p3,p15); // Check straightness of the horizontal edges and interior control curves. h=max(h,Straightness(p0,p[4],p[8],p12)); h=max(h,Straightness(p[1],p[5],p[9],p[13])); h=max(h,Straightness(p[2],p[6],p[10],p[14])); h=max(h,Straightness(p3,p[7],p[11],p15)); // Check the vertical flatness. double v=Flatness(p0,p3,p12,p15); // Check straightness of the vertical edges and interior control curves. v=max(v,Straightness(p0,p[1],p[2],p3)); v=max(v,Straightness(p[4],p[5],p[6],p[7])); v=max(v,Straightness(p[8],p[9],p[10],p[11])); v=max(v,Straightness(p12,p[13],p[14],p15)); return pair(h,v); } struct Split3 { triple m0,m2,m3,m4,m5; Split3() {} Split3(triple z0, triple c0, triple c1, triple z1) { m0=0.5*(z0+c0); triple m1=0.5*(c0+c1); m2=0.5*(c1+z1); m3=0.5*(m0+m1); m4=0.5*(m1+m2); m5=0.5*(m3+m4); } }; // Approximate bounds by bounding box of control polyhedron. bool offscreen(size_t n, const triple *v) { if(bbox2(n,v).offscreen()) { Onscreen=false; return true; } return false; } virtual void render(const triple *p, bool straight, GLfloat *c0=NULL); void render(const triple *p, GLuint I0, GLuint I1, GLuint I2, GLuint I3, triple P0, triple P1, triple P2, triple P3, bool flat0, bool flat1, bool flat2, bool flat3, GLfloat *C0=NULL, GLfloat *C1=NULL, GLfloat *C2=NULL, GLfloat *C3=NULL); void append() { if(transparent) transparentData.Append(data); else { if(color) colorData.Append(data); else materialData.append(data); } } virtual void notRendered() { if(transparent) transparentData.rendered=false; else { if(color) colorData.rendered=false; else materialData.rendered=false; } } void queue(const triple *g, bool straight, double ratio, bool Transparent, GLfloat *colors=NULL) { data.clear(); Onscreen=true; transparent=Transparent; color=colors; notRendered(); init(pixelResolution*ratio); render(g,straight,colors); } }; struct BezierTriangle : public BezierPatch { public: BezierTriangle() : BezierPatch() {} double Distance(const triple *p) { triple p0=p[0]; triple p6=p[6]; triple p9=p[9]; // Check how far the internal point is from the centroid of the vertices. double d=abs2((p0+p6+p9)*third-p[4]); // Determine how straight the edges are. d=max(d,Straightness(p0,p[1],p[3],p6)); d=max(d,Straightness(p0,p[2],p[5],p9)); return max(d,Straightness(p6,p[7],p[8],p9)); } void render(const triple *p, bool straight, GLfloat *c0=NULL); void render(const triple *p, GLuint I0, GLuint I1, GLuint I2, triple P0, triple P1, triple P2, bool flat0, bool flat1, bool flat2, GLfloat *C0=NULL, GLfloat *C1=NULL, GLfloat *C2=NULL); }; struct Triangles : public BezierPatch { public: Triangles() : BezierPatch() {} void queue(size_t nP, const triple* P, size_t nN, const triple* N, size_t nC, const prc::RGBAColour* C, size_t nI, const uint32_t (*PI)[3], const uint32_t (*NI)[3], const uint32_t (*CI)[3], bool transparent); void append() { if(transparent) transparentData.Append(data); else triangleData.Append(data); } void notRendered() { if(transparent) transparentData.rendered=false; else triangleData.rendered=false; } }; extern void sortTriangles(); #endif } //namespace camp #endif asymptote-3.05/gen_preprocessed_depfile.py0000644000000000000000000001741515031566105017567 0ustar rootroot#!/usr/bin/env python3 import io import json import shlex import subprocess as sp import sys import tempfile from argparse import ArgumentParser from typing import List, Optional def execute_and_report_err(args: List[str], error_heading="Error"): try: return sp.run( args, stdout=sp.PIPE, stderr=sp.PIPE, universal_newlines=True, check=True ) except sp.CalledProcessError as e: sys.stderr.write(f"{error_heading}\n") sys.stderr.write(e.stderr) sys.stderr.write(f"stdout:\n{e.stdout}") sys.stderr.write("\n") sys.stderr.flush() raise def parse_args(): args_parser = ArgumentParser() args_parser.add_argument( "--out-i-file", type=str, required=True, help="Output for preprocessed file" ) args_parser.add_argument( "--out-dep-file", type=str, required=False, help="Location of output depfile. Optional when used with gcc. " + "If not given, will not output dep file", ) args_parser.add_argument( "--in-src-file", type=str, required=True, help="Location of source file to process", ) args_parser.add_argument( "--cxx-compiler", type=str, required=True, help="C++ compiler to use" ) args_parser.add_argument("--msvc", action="store_true") args_parser.add_argument( "--include-dirs", type=str, help="Include directories separated by semicolon" ) args_parser.add_argument( "--additional-raw-arguments", type=str, help="Additional arguments to pass to the compiler. " + "Only for use on UNIX systems", ) args_parser.add_argument( "--macro-defs", type=str, help="Macro definitions in the form VALA=CONTENTA or VALB", ) args_parser.add_argument( "--cxx-standard", type=str, ) args_parser.add_argument( "--dep-file-only", action="store_true", help="If given, will only generate dependency file without preprocessed file." + "For gcc usage only.", ) return args_parser.parse_args() class CompileOptions: def __init__( self, compiler: str, include_dirs: Optional[List[str]] = None, macros: Optional[List[str]] = None, **kwargs, ): """ :param compiler: C++ compiler to use for preprocessing :param include_dirs: List of include directories to pass to C++ compiler for preprocessing :param macros: List of macros to pass to the C++ compiler for preprocessing. Must be in 'MACRO' or 'MACRO=VALUE' form. :param kwargs: Accepts two extra arguments: - "extra_flags": Extra flags to pass to compiler for preprocessing - "standard": C++ standard to use. This is passed to the compiler as "-std=c++". """ self._compiler = compiler self._include_dirs = include_dirs or [] self._macros = macros or [] self._extra_flags: List[str] = kwargs.get("extra_flags") or [] self._standard: str = kwargs.get("standard") or "17" @property def compiler(self): return self._compiler def build_args_for_gcc( self, src_file: str, out_file: Optional[str], addr_flags: Optional[List[str]] = None, ): base_args = ( [f"-I{include_dir}" for include_dir in self._include_dirs] + [f"-D{macro}" for macro in self._macros] + [f"-std=c++{self._standard}"] + self._extra_flags ) if addr_flags: base_args.extend(addr_flags) if out_file: base_args.extend(["-o", out_file]) base_args.append(src_file) return base_args def build_args_for_msvc( self, src_file: str, out_file: Optional[str], addr_flags: Optional[List[str]] = None, ): base_args = ( [f"/I{include_dir}" for include_dir in self._include_dirs] + [f"/D{macro}" for macro in self._macros] + [f"/std:c++{self._standard}", "/Zc:__cplusplus"] + self._extra_flags ) if addr_flags: base_args.extend(addr_flags) if out_file: base_args.extend(["/F", out_file]) base_args.append(src_file) return base_args def compile_for_depfile_gcc( compile_opt: CompileOptions, src_in: str, src_out: str, depfile_out: str ): args = [compile_opt.compiler] + compile_opt.build_args_for_gcc( src_in, None, ["-DDEPEND", "-DNOSYM", "-M", "-MG", "-O0", "-MT", src_out, "-MF", depfile_out], ) try: sp.run(args, check=True, stdout=sp.PIPE, stderr=sp.PIPE, text=True) except sp.CalledProcessError as e: sys.stderr.write("Process stderr:\n") sys.stderr.write(e.stderr) sys.stderr.write("Process output:\n") sys.stderr.write(e.stdout) sys.stderr.flush() raise def compile_for_preproc_gcc(compile_opt: CompileOptions, src_in: str, preproc_out: str): args = [compile_opt.compiler] + compile_opt.build_args_for_gcc( src_in, preproc_out, ["-E", "-DNOSYM"] ) try: sp.run(args, check=True, stdout=sp.PIPE, stderr=sp.PIPE, text=True) except sp.CalledProcessError as e: sys.stderr.write("Process stderr:\n") sys.stderr.write(e.stderr) sys.stderr.write("Process out:\n") sys.stderr.write(e.stdout) sys.stderr.flush() raise def escape_windows_path(raw_path: str) -> str: escape_chars = {" ", "$", "#"} with io.StringIO() as ret_str_io: for char in raw_path: if char in escape_chars: ret_str_io.write("\\") ret_str_io.write(char) return ret_str_io.getvalue() def compile_for_preproc_and_depfile_msvc( compile_opt: CompileOptions, src_in: str, preproc_out: str, depfile_out: str ): with tempfile.TemporaryDirectory() as td: args = [compile_opt.compiler] + compile_opt.build_args_for_msvc( src_in, None, [ "/DNOSYM", "/DDEPEND", "/P", f"/Fi{preproc_out}", "/sourceDependencies", f"{td}/srcdep.json", ], ) execute_and_report_err(args, "MSVC Error") with open(f"{td}/srcdep.json", "r", encoding="utf-8") as fread: dep_data = json.load(fread) include_fil_str = " ".join( escape_windows_path(include_fil) for include_fil in dep_data["Data"].get("Includes", []) ) with open(depfile_out, "w", encoding="utf-8") as depfile_writer: depfile_writer.write(escape_windows_path(preproc_out)) depfile_writer.write(": ") depfile_writer.write(include_fil_str) def main(): args = parse_args() opt = CompileOptions( args.cxx_compiler, args.include_dirs.split(";") if args.include_dirs else None, args.macro_defs.split(";") if args.macro_defs else None, extra_flags=( shlex.split(args.additional_raw_arguments) if args.additional_raw_arguments else None ), standard=args.cxx_standard, ) if args.msvc: compile_for_preproc_and_depfile_msvc( opt, args.in_src_file, args.out_i_file, args.out_dep_file ) else: if not args.out_dep_file and args.dep_file_only: raise RuntimeError("Dependency file output must be given") if args.out_dep_file: compile_for_depfile_gcc( opt, args.in_src_file, args.out_i_file, args.out_dep_file ) if not args.dep_file_only: compile_for_preproc_gcc(opt, args.in_src_file, args.out_i_file) if __name__ == "__main__": main() asymptote-3.05/runtime.in0000644000000000000000000005157215031566105014213 0ustar rootroot/***** * runtime.in * Tom Prince 2005/4/15 * * Generate the runtime functions used by the vm::stack machine. * *****/ /* Autogenerated routines are specified like this (separated by a formfeed): type asyname:cname(cparams) { C code } */ // Use Void f() instead of void f() to force an explicit Stack argument. pen => primPen() pair => primPair() triple => primTriple() path => primPath() path3 => primPath3() guide* => primGuide() cycleToken => primCycleToken() tensionSpecifier => primTensionSpecifier() curlSpecifier => primCurlSpecifier() file* => primFile() picture* => primPicture() transform => primTransform() callable* => voidFunction() runnable* => primCode() boolarray* => booleanArray() Intarray* => IntArray() Intarray2* => IntArray2() realarray* => realArray() realarray2* => realArray2() pairarray* => pairArray() pairarray2* => pairArray2() triplearray* => tripleArray() triplearray2* => tripleArray2() patharray* => pathArray() patharray2* => pathArray2() guidearray* => guideArray() transformarray* => transformArray() penarray* => penArray() penarray2* => penArray2() stringarray* => stringArray() stringarray2* => stringArray2() #include #include #include #include #include #include #if !defined(_WIN32) #include #endif #include #include "angle.h" #include "pair.h" #include "triple.h" #include "transform.h" #include "path.h" #include "path3.h" #include "pen.h" #include "drawpath.h" #include "guide.h" #include "picture.h" #include "fileio.h" #include "genv.h" #include "builtin.h" #include "texfile.h" #include "pipestream.h" #include "asyparser.h" #include "stack.h" #include "util.h" #include "locate.h" #include "mathop.h" #include "callable.h" #include "stm.h" #include "lexical.h" #include "asyprocess.h" #include "arrayop.h" #include "seconds.h" #if defined(USEGC) && defined(GC_DEBUG) && defined(GC_BACKTRACE) extern "C" { void *GC_generate_random_valid_address(void); void GC_debug_print_heap_obj_proc(void *); } #endif using namespace vm; using namespace camp; using namespace settings; using namespace utils; #undef OUT #undef IN namespace run { using camp::pair; using vm::array; using vm::vmFrame; using vm::stack; using camp::transform; using absyntax::runnable; typedef array boolarray; typedef array Intarray; typedef array Intarray2; typedef array realarray; typedef array realarray2; typedef array pairarray; typedef array pairarray2; typedef array triplearray; typedef array triplearray2; typedef array patharray; typedef array patharray2; typedef array guidearray; typedef array transformarray; typedef array penarray; typedef array penarray2; typedef array stringarray; typedef array stringarray2; } using vm::array; using types::function; #define PRIMITIVE(name,Name,asyName) using types::prim##Name; #include #undef PRIMITIVE using types::booleanArray; using types::IntArray; using types::IntArray2; using types::realArray; using types::realArray2; using types::pairArray; using types::pairArray2; using types::tripleArray; using types::tripleArray2; using types::pathArray; using types::pathArray2; using types::guideArray; using types::transformArray; using types::penArray; using types::penArray2; using types::stringArray; using types::stringArray2; using types::formal; function *realRealFunction() { return new function(primReal(),primReal()); } function *realTripleFunction() { return new function(primReal(),primTriple()); } const size_t camp::ColorComponents[]={0,0,1,3,4,0}; namespace vm { #if COMPACT const Int DefaultValue=0x7fffffffffffffffLL; const Int Undefined=0x7ffffffffffffffeLL; const Int BoolTruthValue=0xABABABABABABABACLL; const Int BoolFalseValue=0xABABABABABABABABLL; const item Default=DefaultValue; #else const item Default=item(default_t()); #endif } namespace run { stopWatch wallClock; cpuTimer cpuTime; const char *arrayempty="cannot take min or max of empty array"; const char *noruntime="no runtime environment for embedded eval"; void writestring(stack *s) { callable *suffix=pop(s,NULL); string S=pop(s); vm::item it=pop(s); bool defaultfile=isdefault(it); camp::file *f=defaultfile ? &camp::Stdout : vm::get(it); if(!f->isOpen() || !f->enabled()) return; if(S != "" || f->isBinary() || f->isXDR()) f->write(S); if(f->text()) { if(suffix) { s->push(f); suffix->call(s); } else if(defaultfile) f->writeline(); } } string toplocation() { ostringstream buf; position& topPos=processData().topPos; buf << topPos.Line() << "." << topPos.Column(); return buf.str(); } string emptystring; pair zero; } static string defaulttransparency=string("Compatible"); void unused(void *) { } // Autogenerated routines: // Initializers Int :IntZero() { return 0; } real :realZero() { return 0.0; } bool :boolFalse() { return false; } bool isnan(real x) { return std::isnan(x); } array* :pushNullArray() { return 0; } vmFrame* :pushNullRecord() { return 0; } item :pushNullFunction() { return nullfunc::instance(); } // Default operations // Put the default value token on the stack (in place of an argument when // making a function call). item :pushDefault() { return Default; } // Test if the value on the stack is the default value token. bool :isDefault(item i) { return isdefault(i); } // Casts guide* :pairToGuide(pair z) { return new pairguide(z); } guide* :pathToGuide(path p) { return new pathguide(p); } path :guideToPath(guide *g) { return g->solve(); } // Pen operations pen :newPen() { return pen(); } bool ==(pen a, pen b) { return a == b; } bool !=(pen a, pen b) { return a != b; } pen +(pen a, pen b) { return a+b; } pen Operator *(real a, pen b) { return a*b; } pen Operator *(pen a, real b) { return b*a; } pair max(pen p) { return p.bounds().Max(); } pair min(pen p) { return p.bounds().Min(); } // Reset the meaning of pen default attributes. void resetdefaultpen() { processData().defaultpen=camp::pen::initialpen(); } void defaultpen(pen p) { processData().defaultpen=pen(resolvepen,p); } pen defaultpen() { return processData().defaultpen; } bool invisible(pen p) { return p.invisible(); } pen invisible() { return pen(invisiblepen); } pen gray(pen p) { p.togrey(); return p; } pen rgb(pen p) { p.torgb(); return p; } pen cmyk(pen p) { p.tocmyk(); return p; } pen interp(pen a, pen b, real t) { return interpolate(a,b,t); } pen rgb(real r, real g, real b) { return pen(r,g,b); } pen cmyk(real c, real m, real y, real k) { return pen(c,m,y,k); } pen gray(real gray) { return pen(gray); } realarray *colors(pen p) { size_t n=ColorComponents[p.colorspace()]; array *a=new array(n); switch(n) { case 0: break; case 1: (*a)[0]=p.gray(); break; case 3: (*a)[0]=p.red(); (*a)[1]=p.green(); (*a)[2]=p.blue(); break; case 4: (*a)[0]=p.cyan(); (*a)[1]=p.magenta(); (*a)[2]=p.yellow(); (*a)[3]=p.black(); break; default: break; } return a; } string hex(pen p) { return p.hex(); } Int byte(real x) { return camp::byte(x); } real byteinv(Int x) { return x >= 0 ? camp::byteinv(x) : 0.0; } string colorspace(pen p) { string s=ColorDeviceSuffix[p.colorspace()]; std::transform(s.begin(),s.end(),s.begin(),tolower); return s; } pen pattern(string *s) { return pen(setpattern,*s); } string pattern(pen p) { return p.fillpattern(); } pen fillrule(Int n) { return pen(n >= 0 && n < nFill ? (FillRule) n : DEFFILL); } Int fillrule(pen p) { return p.Fillrule(); } pen opacity(real opacity=1.0, string blend=defaulttransparency) { for(Int i=0; i < nBlendMode; ++i) if(blend == BlendMode[i]) return pen(Transparency(blend,opacity)); ostringstream buf; buf << "Unknown blend mode: " << "'" << blend << "'"; error(buf); } real opacity(pen p) { return p.opacity(); } string blend(pen p) { return p.blend(); } pen linetype(realarray *pattern, real offset=0, bool scale=true, bool adjust=true) { size_t size=checkArray(pattern); array *a=new array(size); for(size_t i=0; i < size; ++i) (*a)[i]=::max(vm::read(pattern,i),0.0); return pen(LineType(*a,offset,scale,adjust)); } realarray *linetype(pen p=CURRENTPEN) { array a=p.linetype()->pattern; return copyArray(&a); } real offset(pen p) { return p.linetype()->offset; } bool scale(pen p) { return p.linetype()->scale; } bool adjust(pen p) { return p.linetype()->adjust; } pen adjust(pen p, real arclength, bool cyclic) { return adjustdash(p,arclength,cyclic); } pen linecap(Int n) { return pen(setlinecap,n >= 0 && n < nCap ? n : DEFCAP); } Int linecap(pen p=CURRENTPEN) { return p.cap(); } pen linejoin(Int n) { return pen(setlinejoin,n >= 0 && n < nJoin ? n : DEFJOIN); } Int linejoin(pen p=CURRENTPEN) { return p.join(); } pen miterlimit(real x) { return pen(setmiterlimit,x >= 1.0 ? x : DEFJOIN); } real miterlimit(pen p=CURRENTPEN) { return p.miter(); } pen linewidth(real x) { return pen(setlinewidth,x >= 0.0 ? x : DEFWIDTH); } real linewidth(pen p=CURRENTPEN) { return p.width(); } pen fontcommand(string *s) { return pen(setfont,*s); } string font(pen p=CURRENTPEN) { return p.Font(); } pen fontsize(real size, real lineskip) { return pen(setfontsize,size > 0.0 ? size : 0.0, lineskip > 0.0 ? lineskip : 0.0); } real fontsize(pen p=CURRENTPEN) { return p.size(); } real lineskip(pen p=CURRENTPEN) { return p.Lineskip(); } pen overwrite(Int n) { return pen(setoverwrite,n >= 0 && n < nOverwrite ? (overwrite_t) n : DEFWRITE); } Int overwrite(pen p=CURRENTPEN) { return p.Overwrite(); } pen basealign(Int n) { return pen(n >= 0 && n < nBaseLine ? (BaseLine) n : DEFBASE); } Int basealign(pen p=CURRENTPEN) { return p.Baseline(); } transform transform(pen p) { return p.getTransform(); } path nib(pen p) { return p.Path(); } pen makepen(path p) { return pen(p); } pen colorless(pen p) { p.colorless(); return p; } // Interactive mode bool interactive() { return interact::interactive; } bool uptodate() { return interact::uptodate; } // System commands Int system(stringarray *s) { if(safe) error("system() call disabled; override with option -nosafe"); size_t size=checkArray(s); if(size == 0) return 0; mem::vector cmd; for(size_t i=0; i < size; ++i) cmd.push_back(read(s,i)); return System(cmd); } bool view() { return view(); } string asydir() { return systemDir; } string locale(string s=emptystring) { char *L=setlocale(LC_ALL,s.empty() ? NULL : s.c_str()); return L != NULL ? string(L) : ""; } void abort(string s=emptystring) { if(s.empty()) throw handled_error(); error(s.c_str()); } void exit() { throw quit(); } void assert(bool b, string s=emptystring) { flush(cout); if(!b) { ostringstream buf; buf << "assert FAILED"; if(s != "") buf << ": " << s; error(buf); } } void sleep(Int seconds) { if(seconds <= 0) return; std::this_thread::sleep_for(std::chrono::seconds(seconds)); } void usleep(Int microseconds) { if(microseconds <= 0) return; std::this_thread::sleep_for(std::chrono::microseconds(microseconds)); } void _eval(string *s, bool embedded, bool interactiveWrite=false) { if(embedded) { trans::coenv *e=Stack->getEnvironment(); vm::interactiveStack *is=dynamic_cast(Stack); if(e && is) runStringEmbedded(*s, *e, *is); else error(noruntime); } else runString(*s,interactiveWrite); } void _eval(runnable *s, bool embedded) { absyntax::block *ast=new absyntax::block(s->getPos(), false); ast->add(s); if(embedded) { trans::coenv *e=Stack->getEnvironment(); vm::interactiveStack *is=dynamic_cast(Stack); if(e && is) runCodeEmbedded(ast, *e, *is); else error(noruntime); } else runCode(ast); } string xasyKEY() { processDataStruct& P=processData(); xkey_t& xkey=P.xkey; xkey_t::iterator p=xkey.find(P.topPos.LineColumn()); if(settings::keys) return p != xkey.end() ? p->second : toplocation(); else return p != xkey.end() ? p->second+" 1" : toplocation()+" 0"; } void xasyKEY(string *s) { processData().KEY=*s; } string location() { ostringstream buf; buf << getPos(); return buf.str(); } // Wrapper for the stack::loadModule() method. void :loadModule(string *index, Int numPushedParents) { Stack->loadModule(*index, numPushedParents); } string cd(string s=emptystring) { if(!globalread()) readDisabled(); if(!s.empty() && !globalwrite()) { string outname=settings::outname(); string dir=stripFile(outname); if(dir.empty()) Setting("outname")=getPath()+dirsep+outname; } return setPath(s.c_str()); } void list(string *s, bool imports=false) { if(*s == "-") return; trans::genv ge; symbol name=symbol::trans(*s); record *r=ge.getModule(name,*s); r->e.list(imports ? 0 : r); } // Guide operations guide* :nullGuide() { return new pathguide(path()); } guide* :dotsGuide(guidearray *a) { guidevector v; size_t size=checkArray(a); for (size_t i=0; i < size; ++i) v.push_back(a->read(i)); return new multiguide(v); } guide* :dashesGuide(guidearray *a) { static camp::curlSpec curly; static camp::specguide curlout(&curly, camp::OUT); static camp::specguide curlin(&curly, camp::IN); size_t n=checkArray(a); // a--b is equivalent to a{curl 1}..{curl 1}b guidevector v; if (n > 0) v.push_back(a->read(0)); if (n==1) { v.push_back(&curlout); v.push_back(&curlin); } else for (size_t i=1; iread(i)); } return new multiguide(v); } cycleToken :newCycleToken() { return cycleToken(); } guide *operator cast(cycleToken tok) { // Avoid unused variable warning messages. unused(&tok); return new cycletokguide(); } guide* operator spec(pair z, Int p) { camp::side d=(camp::side) p; camp::dirSpec *sp=new camp::dirSpec(z); return new specguide(sp,d); } curlSpecifier operator curl(real gamma, Int p) { camp::side s=(camp::side) p; return curlSpecifier(gamma,s); } real :curlSpecifierValuePart(curlSpecifier spec) { return spec.getValue(); } Int :curlSpecifierSidePart(curlSpecifier spec) { return spec.getSide(); } guide *operator cast(curlSpecifier spec) { return new specguide(spec); } tensionSpecifier operator tension(real tout, real tin, bool atleast) { return tensionSpecifier(tout, tin, atleast); } real :tensionSpecifierOutPart(tensionSpecifier t) { return t.getOut(); } real :tensionSpecifierInPart(tensionSpecifier t) { return t.getIn(); } bool :tensionSpecifierAtleastPart(tensionSpecifier t) { return t.getAtleast(); } guide *operator cast(tensionSpecifier t) { return new tensionguide(t); } guide* operator controls(pair zout, pair zin) { return new controlguide(zout, zin); } Int size(guide *g) { flatguide f; g->flatten(f,false); return f.size(); } Int length(guide *g) { flatguide f; g->flatten(f,false); return g->cyclic() ? f.size() : f.size()-1; } bool cyclic(guide *g) { flatguide f; g->flatten(f,false); return g->cyclic(); } pair point(guide *g, Int t) { flatguide f; g->flatten(f,false); return f.Nodes(adjustedIndex(t,f.size(),g->cyclic())).z; } pairarray *dirSpecifier(guide *g, Int t) { flatguide f; g->flatten(f,false); Int n=f.size(); if(!g->cyclic() && (t < 0 || t >= n-1)) return new array(0); array *c=new array(2); (*c)[0]=f.Nodes(t).out->dir(); (*c)[1]=f.Nodes(t+1).in->dir(); return c; } pairarray *controlSpecifier(guide *g, Int t) { flatguide f; g->flatten(f,false); Int n=f.size(); if(!g->cyclic() && (t < 0 || t >= n-1)) return new array(0); knot curr=f.Nodes(t); knot next=f.Nodes(t+1); if(curr.out->controlled()) { assert(next.in->controlled()); array *c=new array(2); (*c)[0]=curr.out->control(); (*c)[1]=next.in->control(); return c; } else return new array(0); } tensionSpecifier tensionSpecifier(guide *g, Int t) { flatguide f; g->flatten(f,false); Int n=f.size(); if(!g->cyclic() && (t < 0 || t >= n-1)) return tensionSpecifier(1.0,1.0,false); knot curr=f.Nodes(t); return tensionSpecifier(curr.tout.val,f.Nodes(t+1).tin.val,curr.tout.atleast); } realarray *curlSpecifier(guide *g, Int t) { flatguide f; g->flatten(f,false); Int n=f.size(); if(!g->cyclic() && (t < 0 || t >= n-1)) return new array(0); array *c=new array(2); real c0=f.Nodes(t).out->curl(); real c1=f.Nodes(t+1).in->curl(); (*c)[0]=c0 >= 0.0 ? c0 : 1.0; (*c)[1]=c1 >= 0.0 ? c1 : 1.0; return c; } guide *reverse(guide *g) { flatguide f; g->flatten(f,false); if(f.precyclic()) return new pathguide(g->solve().reverse()); size_t n=f.size(); bool cyclic=g->cyclic(); guidevector v; size_t start=cyclic ? n : n-1; knot curr=f.Nodes(start); knot next=curr; for(size_t i=start; i > 0; --i) { next=f.Nodes(i-1); v.push_back(new pairguide(curr.z)); if(next.out->controlled()) { assert(curr.in->controlled()); v.push_back(new controlguide(curr.in->control(),next.out->control())); } else { pair d=curr.in->dir(); if(d != zero) v.push_back(new specguide(new dirSpec(-d),camp::OUT)); else { real C=curr.in->curl(); if(C >= 0.0) v.push_back(new specguide(new curlSpec(C),camp::OUT)); } real tout=curr.tin.val; real tin=next.tout.val; bool atleast=next.tout.atleast; if(tout != 1.0 || tin != 1.0 || next.tout.atleast) v.push_back(new tensionguide(tensionSpecifier(tout,tin,atleast))); d=next.out->dir(); if(d != zero) v.push_back(new specguide(new dirSpec(-d),camp::IN)); else { real C=next.out->curl(); if(C >= 0.0) v.push_back(new specguide(new curlSpec(C),camp::IN)); } } curr=next; } if(cyclic) v.push_back(new cycletokguide()); else v.push_back(new pairguide(next.z)); return new multiguide(v); } realarray *_cputime() { #if !defined(_WIN32) static const real ticktime=1.0/sysconf(_SC_CLK_TCK); struct tms buf; ::times(&buf); real realCutime=((real)buf.tms_cutime)*ticktime; real realCstime=((real)buf.tms_cstime)*ticktime; #else // FIXME: See if there's a way to get cutime/cstime on windows, // if it's possible. real realCutime=0.0; real realCstime=0.0; #endif array *t=new array(5); (*t)[0]=cpuTime.seconds(); // Includes system time (*t)[1]=0.0; (*t)[2]=realCutime; (*t)[3]=realCstime; (*t)[4]=wallClock.seconds(); return t; } // Transforms bool ==(transform a, transform b) { return a == b; } bool !=(transform a, transform b) { return a != b; } transform +(transform a, transform b) { return a+b; } transform Operator *(transform a, transform b) { return a*b; } pair Operator *(transform t, pair z) { return t*z; } path Operator *(transform t, path g) { return transformed(t,g); } pen Operator *(transform t, pen p) { return transformed(t,p); } picture * Operator *(transform t, picture *f) { return transformed(t,f); } picture * Operator *(realarray2 *t, picture *f) { return transformed(*t,f); } transform ^(transform t, Int n) { transform T; if(n < 0) { n=-n; t=inverse(t); } for(Int i=0; i < n; i++) T=T*t; return T; } real :transformXPart(transform t) { return t.getx(); } real :transformYPart(transform t) { return t.gety(); } real :transformXXPart(transform t) { return t.getxx(); } real :transformXYPart(transform t) { return t.getxy(); } real :transformYXPart(transform t) { return t.getyx(); } real :transformYYPart(transform t) { return t.getyy(); } transform :real6ToTransform(real x, real y, real xx, real xy, real yx, real yy) { return transform(x,y,xx,xy,yx,yy); } transform shift(transform t) { return transform(t.getx(),t.gety(),0,0,0,0); } transform shiftless(transform t) { return transform(0,0,t.getxx(),t.getxy(),t.getyx(),t.getyy()); } transform identity:transformIdentity() { return identity; } transform inverse(transform t) { return inverse(t); } transform shift(pair z) { return shift(z); } transform shift(real x, real y) { return shift(pair(x,y)); } transform xscale(real x) { return xscale(x); } transform yscale(real y) { return yscale(y); } transform scale(real x) { return scale(x); } transform scale(real x, real y) { return scale(x,y); } transform slant(real s) { return slant(s); } transform rotate(real angle, pair z=0) { return rotatearound(z,radians(angle)); } transform reflect(pair a, pair b) { return reflectabout(a,b); } bool isometry(transform t) { return t.isIsometry(); } real bezier(real a, real b, real c, real d, real t) { real onemt=1-t; real onemt2=onemt*onemt; return onemt2*onemt*a+t*(3.0*(onemt2*b+t*onemt*c)+t*t*d); } asymptote-3.05/v3dtypes.csv0000644000000000000000000000064615031566105014472 0ustar rootrootmaterial,1 transform,2 element,3 centers,4 header,5 line,64 triangle,65 quad,66 curve,128 bezierTriangle,129 bezierPatch,130 lineColor,192 triangleColor,193 quadColor,194 curveColor,256 bezierTriangleColor,257 bezierPatchColor,258 triangles,512 disk,1024 cylinder,1025 tube,1026 sphere,1027 halfSphere,1028 animation,2048 #open2DPolygon,3136 #closed2DPolygon,3137 #open2DCurve,3200 #closed2DCurve,3201 pixel,4096 asymptote-3.05/camp.y0000644000000000000000000005433315031566105013310 0ustar rootroot%{ /***** * camp.y * Andy Hammerlindl 08/12/2002 * * The grammar of the camp language. *****/ #include "errormsg.h" #include "exp.h" #include "newexp.h" #include "dec.h" #include "fundec.h" #include "stm.h" #include "modifier.h" #include "opsymbols.h" // Avoid error messages with unpatched bison-1.875: #ifndef __attribute__ #define __attribute__(x) #endif // Used when a position needs to be determined and no token is // available. Defined in camp.l. position lexerPos(); bool lexerEOF(); int yylex(void); /* function prototype */ void yyerror(const char *s) { if (!lexerEOF()) { em.error(lexerPos()); em << s; em.cont(); } } // Check if the symbol given is "keyword". Returns true in this case and // returns false and reports an error otherwise. bool checkKeyword(position pos, symbol sym) { if (sym != symbol::trans("keyword")) { em.error(pos); em << "expected 'keyword' here"; return false; } return true; } namespace absyntax { file *root; } using namespace absyntax; using sym::symbol; using mem::string; %} %union { position pos; bool boo; struct { position pos; sym::symbol sym; } ps; absyntax::name *n; absyntax::varinit *vi; absyntax::arrayinit *ai; absyntax::exp *e; absyntax::stringExp *stre; absyntax::specExp *se; absyntax::joinExp *j; absyntax::explist *elist; absyntax::argument arg; absyntax::arglist *alist; absyntax::slice *slice; absyntax::dimensions *dim; absyntax::astType *t; absyntax::decid *di; absyntax::decidlist *dil; absyntax::decidstart *dis; absyntax::runnable *run; struct { position pos; trans::permission val; } perm; struct { position pos; trans::modifier val; } mod; absyntax::modifierList *ml; //absyntax::program *prog; absyntax::vardec *vd; //absyntax::vardecs *vds; absyntax::dec *d; absyntax::idpair *ip; absyntax::idpairlist *ipl; absyntax::stm *s; absyntax::block *b; absyntax::stmExpList *sel; //absyntax::funheader *fh; absyntax::formal *fl; absyntax::formals *fls; absyntax::typeParam *tp; absyntax::typeParamList *tps; } %token ID SELFOP DOTS COLONS DASHES INCR LONGDASH CONTROLS TENSION ATLEAST CURL COR CAND BAR AMPERSAND EQ NEQ LT LE GT GE CARETS '+' '-' '*' '/' '%' '#' '^' OPERATOR %token LOOSE ASSIGN '?' ':' DIRTAG JOIN_PREC AND '{' '}' '(' ')' '.' ',' '[' ']' ';' ELLIPSIS ACCESS UNRAVEL IMPORT INCLUDE FROM QUOTE STRUCT TYPEDEF USING NEW IF ELSE WHILE DO FOR BREAK CONTINUE RETURN_ THIS_TOK EXPLICIT GARBAGE %token LIT %token STRING %token PERM %token MODIFIER %right ASSIGN SELFOP %right '?' ':' %left COR %left CAND %left BAR %left AMPERSAND %left EQ NEQ %left LT LE GT GE %left OPERATOR %left CARETS %left JOIN_PREC DOTS COLONS DASHES INCR LONGDASH %left DIRTAG CONTROLS TENSION ATLEAST AND %left CURL '{' '}' %left '+' '-' %left '*' '/' '%' '#' LIT %left UNARY %right '^' %left EXP_IN_PARENS_RULE %left '(' ')' %type fileblock bareblock block %type name %type runnable %type modifiers %type dec fundec typedec %type strid %type idpair stridpair %type idpairlist stridpairlist %type vardec barevardec %type type celltype %type dims %type decidlist %type decid %type decidstart %type varinit %type arrayinit basearrayinit varinits %type formal decdec %type formals decdeclist %type value exp fortest %type argument %type slice %type join basicjoin %type tension controls %type dir %type dimexps %type arglist tuple %type stm stmexp blockstm %type forinit %type forupdate stmexplist %type explicitornot %type typeparam %type typeparamlist /* There are four shift/reduce conflicts: * the dangling ELSE in IF (exp) IF (exp) stm ELSE stm * new ID * the argument id=exp is taken as an argument instead of an assignExp * explicit cast */ %expect 4 /* Enable grammar debugging. */ /*%debug*/ %% file: fileblock { absyntax::root = $1; } ; fileblock: /* empty */ { $$ = new file(lexerPos(), false); } | fileblock runnable { $$ = $1; $$->add($2); } ; bareblock: /* empty */ { $$ = new block(lexerPos(), true); } | bareblock runnable { $$ = $1; $$->add($2); } ; name: ID { $$ = new simpleName($1.pos, $1.sym); } | name '.' ID { $$ = new qualifiedName($2, $1, $3.sym); } | '%' { $$ = new simpleName($1.pos, symbol::trans("operator answer")); } ; runnable: dec { $$ = $1; } | stm { $$ = $1; } | modifiers dec { $$ = new modifiedRunnable($1->getPos(), $1, $2); } | modifiers stm { $$ = new modifiedRunnable($1->getPos(), $1, $2); } ; modifiers: MODIFIER { $$ = new modifierList($1.pos); $$->add($1.val); } | PERM { $$ = new modifierList($1.pos); $$->add($1.val); } | modifiers MODIFIER { $$ = $1; $$->add($2.val); } | modifiers PERM { $$ = $1; $$->add($2.val); } ; dec: vardec { $$ = $1; } | fundec { $$ = $1; } | typedec { $$ = $1; } | ACCESS stridpairlist ';' { $$ = new accessdec($1, $2); } | FROM name UNRAVEL idpairlist ';' { $$ = new unraveldec($1, $2, $4); } | FROM name UNRAVEL '*' ';' { $$ = new unraveldec($1, $2, WILDCARD); } | UNRAVEL name ';' { $$ = new unraveldec($1, $2, WILDCARD); } | FROM strid ACCESS idpairlist ';' { $$ = new fromaccessdec($1, $2.sym, $4); } | FROM strid ACCESS '*' ';' { $$ = new fromaccessdec($1, $2.sym, WILDCARD); } | IMPORT stridpair ';' { $$ = new importdec($1, $2); } | INCLUDE ID ';' { $$ = new includedec($1, $2.sym); } | INCLUDE STRING ';' { $$ = new includedec($1, $2->getString()); } // Experimental - templated imports. | TYPEDEF IMPORT '(' typeparamlist ')' ';' { $$ = new receiveTypedefDec($1, $4); } | IMPORT TYPEDEF '(' typeparamlist ')' ';' { $$ = new badDec($1, $1, "Expected 'typedef import();'"); } /* ACCESS strid '(' decdeclist ')' 'as' ID */ | ACCESS strid '(' decdeclist ')' ID ID ';' { $$ = new templateAccessDec( $1, $2.sym, $4, $6.sym, $7.sym, $6.pos ); } | ACCESS strid '(' decdeclist ')' ';' { $$ = new badDec($1, $6, "expected 'as'"); } | IMPORT strid '(' decdeclist ')' ';' { $$ = new badDec($1, $1, "Parametrized imports disallowed to reduce naming " "conflicts. Try " "'access () as ;'." ); } | FROM strid '(' decdeclist ')' ACCESS idpairlist ';' { $$ = new fromaccessdec($1, $2.sym, $7, $4); } ; // List mapping dec to dec as in "Key=string, Value=int" decdec: ID ASSIGN type { $$ = new formal( $1.pos, $3, new decidstart($1.pos, $1.sym) ); } | type { $$ = new formal($1->getPos(), $1, nullptr); } // ultimately log error ; decdeclist: decdec { $$ = new formals($1->getPos()); $$->add($1); } | decdeclist ',' decdec { $$ = $1; $$->add($3); } ; typeparam: ID { $$ = new typeParam($1.pos, $1.sym); } ; typeparamlist: typeparam { $$ = new typeParamList($1->getPos()); $$->add($1); } | typeparamlist ',' typeparam { $$ = $1; $$->add($3); } ; idpair: ID { $$ = new idpair($1.pos, $1.sym); } /* ID 'as' ID */ | ID ID ID { $$ = new idpair($1.pos, $1.sym, $2.sym , $3.sym); } ; idpairlist: idpair { $$ = new idpairlist(); $$->add($1); } | idpairlist ',' idpair { $$ = $1; $$->add($3); } ; strid: ID { $$ = $1; } | STRING { $$.pos = $1->getPos(); $$.sym = symbol::literalTrans($1->getString()); } ; stridpair: ID { $$ = new idpair($1.pos, $1.sym); } /* strid 'as' ID */ | strid ID ID { $$ = new idpair($1.pos, $1.sym, $2.sym , $3.sym); } ; stridpairlist: stridpair { $$ = new idpairlist(); $$->add($1); } | stridpairlist ',' stridpair { $$ = $1; $$->add($3); } ; vardec: barevardec ';' { $$ = $1; } ; barevardec: type decidlist { $$ = new vardec($1->getPos(), $1, $2); } ; type: celltype { $$ = $1; } | name dims { $$ = new arrayTy($1, $2); } ; celltype: name { $$ = new nameTy($1); } ; dims: '[' ']' { $$ = new dimensions($1); } | dims '[' ']' { $$ = $1; $$->increase(); } ; dimexps: '[' exp ']' { $$ = new explist($1); $$->add($2); } | dimexps '[' exp ']' { $$ = $1; $$->add($3); } ; decidlist: decid { $$ = new decidlist($1->getPos()); $$->add($1); } | decidlist ',' decid { $$ = $1; $$->add($3); } ; decid: decidstart { $$ = new decid($1->getPos(), $1); } | decidstart ASSIGN varinit { $$ = new decid($1->getPos(), $1, $3); } ; decidstart: ID { $$ = new decidstart($1.pos, $1.sym); } | ID dims { $$ = new decidstart($1.pos, $1.sym, $2); } | ID '(' ')' { $$ = new fundecidstart($1.pos, $1.sym, 0, new formals($2)); } | ID '(' formals ')' { $$ = new fundecidstart($1.pos, $1.sym, 0, $3); } ; varinit: exp { $$ = $1; } | arrayinit { $$ = $1; } ; block: '{' bareblock '}' { $$ = $2; } ; arrayinit: '{' '}' { $$ = new arrayinit($1); } | '{' ELLIPSIS varinit '}' { $$ = new arrayinit($1); $$->addRest($3); } | '{' basearrayinit '}' { $$ = $2; } | '{' basearrayinit ELLIPSIS varinit '}' { $$ = $2; $$->addRest($4); } ; basearrayinit: ',' { $$ = new arrayinit($1); } | varinits { $$ = $1; } | varinits ',' { $$ = $1; } ; varinits: varinit { $$ = new arrayinit($1->getPos()); $$->add($1);} | varinits ',' varinit { $$ = $1; $$->add($3); } ; formals: formal { $$ = new formals($1->getPos()); $$->add($1); } | ELLIPSIS formal { $$ = new formals($1); $$->addRest($2); } | formals ',' formal { $$ = $1; $$->add($3); } | formals ELLIPSIS formal { $$ = $1; $$->addRest($3); } ; explicitornot: EXPLICIT { $$ = true; } | { $$ = false; } ; formal: explicitornot type { $$ = new formal($2->getPos(), $2, 0, 0, $1, 0); } | explicitornot type decidstart { $$ = new formal($2->getPos(), $2, $3, 0, $1, 0); } | explicitornot type decidstart ASSIGN varinit { $$ = new formal($2->getPos(), $2, $3, $5, $1, 0); } /* The uses of ID below are 'keyword' qualifiers before the parameter name. */ | explicitornot type ID decidstart { bool k = checkKeyword($3.pos, $3.sym); $$ = new formal($2->getPos(), $2, $4, 0, $1, k); } | explicitornot type ID decidstart ASSIGN varinit { bool k = checkKeyword($3.pos, $3.sym); $$ = new formal($2->getPos(), $2, $4, $6, $1, k); } ; fundec: type ID '(' ')' blockstm { $$ = new fundec($3, $1, $2.sym, new formals($3), $5); } | type ID '(' formals ')' blockstm { $$ = new fundec($3, $1, $2.sym, $4, $6); } ; typedec: STRUCT ID block { $$ = new recorddec($1, $2.sym, $3); } | TYPEDEF vardec { $$ = new typedec($1, $2); } // See definition for decidstart. Following C++, "The syntax of the type-id // that names type T is exactly the syntax of a declaration of a variable or // function of type T, with the identifier omitted." // http://en.cppreference.com/w/cpp/language/type#Type_naming | USING ID ASSIGN type ';' { decidstart *dis = new decidstart($2.pos, $2.sym); $$ = new typedec($1, dis, $4); } | USING ID ASSIGN type '(' ')' ';' { decidstart *dis = new fundecidstart($2.pos, $2.sym, 0, new formals($5)); $$ = new typedec($1, dis, $4); } | USING ID ASSIGN type '(' formals ')' ';' { decidstart *dis = new fundecidstart($2.pos, $2.sym, 0, $6); $$ = new typedec($1, dis, $4); } ; slice: ':' { $$ = new slice($1, 0, 0); } | exp ':' { $$ = new slice($2, $1, 0); } | ':' exp { $$ = new slice($1, 0, $2); } | exp ':' exp { $$ = new slice($2, $1, $3); } ; value: value '.' ID { $$ = new fieldExp($2, $1, $3.sym); } | name '[' exp ']' { $$ = new subscriptExp($2, new nameExp($1->getPos(), $1), $3); } | value '[' exp ']'{ $$ = new subscriptExp($2, $1, $3); } | name '[' slice ']' { $$ = new sliceExp($2, new nameExp($1->getPos(), $1), $3); } | value '[' slice ']'{ $$ = new sliceExp($2, $1, $3); } | name '(' ')' { $$ = new callExp($2, new nameExp($1->getPos(), $1), new arglist()); } | name '(' arglist ')' { $$ = new callExp($2, new nameExp($1->getPos(), $1), $3); } | value '(' ')' { $$ = new callExp($2, $1, new arglist()); } | value '(' arglist ')' { $$ = new callExp($2, $1, $3); } | '(' exp ')' %prec EXP_IN_PARENS_RULE { $$ = $2; } | '(' name ')' %prec EXP_IN_PARENS_RULE { $$ = new nameExp($2->getPos(), $2); } | THIS_TOK { $$ = new thisExp($1); } ; argument: exp { $$.name = symbol::nullsym; $$.val=$1; } | ID ASSIGN exp { $$.name = $1.sym; $$.val=$3; } ; arglist: argument { $$ = new arglist(); $$->add($1); } | ELLIPSIS argument { $$ = new arglist(); $$->addRest($2); } | arglist ',' argument { $$ = $1; $$->add($3); } | arglist ELLIPSIS argument { $$ = $1; $$->addRest($3); } ; /* A list of two or more expressions, separated by commas. */ tuple: exp ',' exp { $$ = new arglist(); $$->add($1); $$->add($3); } | tuple ',' exp { $$ = $1; $$->add($3); } ; exp: name { $$ = new nameExp($1->getPos(), $1); } | value { $$ = $1; } | LIT { $$ = $1; } | STRING { $$ = $1; } /* This is for scaling expressions such as 105cm */ | LIT exp { $$ = new scaleExp($1->getPos(), $1, $2); } | '(' name ')' exp { $$ = new castExp($2->getPos(), new nameTy($2), $4); } | '(' name dims ')' exp { $$ = new castExp($2->getPos(), new arrayTy($2, $3), $5); } | '+' exp %prec UNARY { $$ = new unaryExp($1.pos, $2, $1.sym); } | '-' exp %prec UNARY { $$ = new unaryExp($1.pos, $2, $1.sym); } | OPERATOR exp { $$ = new unaryExp($1.pos, $2, $1.sym); } | exp '+' exp { $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp '-' exp { $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp '*' exp { $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp '/' exp { $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp '%' exp { $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp '#' exp { $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp '^' exp { $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp LT exp { $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp LE exp { $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp GT exp { $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp GE exp { $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp EQ exp { $$ = new equalityExp($2.pos, $1, $2.sym, $3); } | exp NEQ exp { $$ = new equalityExp($2.pos, $1, $2.sym, $3); } | exp CAND exp { $$ = new andExp($2.pos, $1, $2.sym, $3); } | exp COR exp { $$ = new orExp($2.pos, $1, $2.sym, $3); } | exp CARETS exp { $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp AMPERSAND exp{ $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp BAR exp{ $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp OPERATOR exp { $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | exp INCR exp { $$ = new binaryExp($2.pos, $1, $2.sym, $3); } | NEW celltype { $$ = new newRecordExp($1, $2); } | NEW celltype dimexps { $$ = new newArrayExp($1, $2, $3, 0, 0); } | NEW celltype dimexps dims { $$ = new newArrayExp($1, $2, $3, $4, 0); } | NEW celltype dims { $$ = new newArrayExp($1, $2, 0, $3, 0); } | NEW celltype dims arrayinit { $$ = new newArrayExp($1, $2, 0, $3, $4); } | NEW celltype '(' ')' blockstm { $$ = new newFunctionExp($1, $2, new formals($3), $5); } | NEW celltype dims '(' ')' blockstm { $$ = new newFunctionExp($1, new arrayTy($2->getPos(), $2, $3), new formals($4), $6); } | NEW celltype '(' formals ')' blockstm { $$ = new newFunctionExp($1, $2, $4, $6); } | NEW celltype dims '(' formals ')' blockstm { $$ = new newFunctionExp($1, new arrayTy($2->getPos(), $2, $3), $5, $7); } | exp '?' exp ':' exp { $$ = new conditionalExp($2, $1, $3, $5); } | exp ASSIGN exp { $$ = new assignExp($2, $1, $3); } | '(' tuple ')' { $$ = new callExp($1, new nameExp($1, SYM_TUPLE), $2); } | exp join exp %prec JOIN_PREC { $2->pushFront($1); $2->pushBack($3); $$ = $2; } | exp dir %prec DIRTAG { $2->setSide(camp::OUT); joinExp *jexp = new joinExp($2->getPos(), SYM_DOTS); $$=jexp; jexp->pushBack($1); jexp->pushBack($2); } | INCR exp %prec UNARY { $$ = new prefixExp($1.pos, $2, SYM_PLUS); } | DASHES exp %prec UNARY { $$ = new prefixExp($1.pos, $2, SYM_MINUS); } /* Illegal - will be caught during translation. */ | exp INCR %prec UNARY { $$ = new postfixExp($2.pos, $1, SYM_PLUS); } | exp SELFOP exp { $$ = new selfExp($2.pos, $1, $2.sym, $3); } | QUOTE '{' fileblock '}' { $$ = new quoteExp($1, $3); } ; // This verbose definition is because leaving empty as an expansion for dir // made a whack of reduce/reduce errors. join: DASHES { $$ = new joinExp($1.pos,$1.sym); } | basicjoin %prec JOIN_PREC { $$ = $1; } | dir basicjoin %prec JOIN_PREC { $1->setSide(camp::OUT); $$ = $2; $$->pushFront($1); } | basicjoin dir %prec JOIN_PREC { $2->setSide(camp::IN); $$ = $1; $$->pushBack($2); } | dir basicjoin dir %prec JOIN_PREC { $1->setSide(camp::OUT); $3->setSide(camp::IN); $$ = $2; $$->pushFront($1); $$->pushBack($3); } ; dir: '{' CURL exp '}' { $$ = new specExp($2.pos, $2.sym, $3); } | '{' exp '}' { $$ = new specExp($1, symbol::opTrans("spec"), $2); } | '{' exp ',' exp '}' { $$ = new specExp($1, symbol::opTrans("spec"), new pairExp($3, $2, $4)); } | '{' exp ',' exp ',' exp '}' { $$ = new specExp($1, symbol::opTrans("spec"), new tripleExp($3, $2, $4, $6)); } ; basicjoin: DOTS { $$ = new joinExp($1.pos, $1.sym); } | DOTS tension DOTS { $$ = new joinExp($1.pos, $1.sym); $$->pushBack($2); } | DOTS controls DOTS { $$ = new joinExp($1.pos, $1.sym); $$->pushBack($2); } | COLONS { $$ = new joinExp($1.pos, $1.sym); } | LONGDASH { $$ = new joinExp($1.pos, $1.sym); } ; tension: TENSION exp { $$ = new binaryExp($1.pos, $2, $1.sym, new booleanExp($1.pos, false)); } | TENSION exp AND exp { $$ = new ternaryExp($1.pos, $2, $1.sym, $4, new booleanExp($1.pos, false)); } | TENSION ATLEAST exp { $$ = new binaryExp($1.pos, $3, $1.sym, new booleanExp($2.pos, true)); } | TENSION ATLEAST exp AND exp { $$ = new ternaryExp($1.pos, $3, $1.sym, $5, new booleanExp($2.pos, true)); } ; controls: CONTROLS exp { $$ = new unaryExp($1.pos, $2, $1.sym); } | CONTROLS exp AND exp { $$ = new binaryExp($1.pos, $2, $1.sym, $4); } ; stm: ';' { $$ = new emptyStm($1); } | blockstm { $$ = $1; } | stmexp ';' { $$ = $1; } | IF '(' exp ')' stm { $$ = new ifStm($1, $3, $5); } | IF '(' exp ')' stm ELSE stm { $$ = new ifStm($1, $3, $5, $7); } | WHILE '(' exp ')' stm { $$ = new whileStm($1, $3, $5); } | DO stm WHILE '(' exp ')' ';' { $$ = new doStm($1, $2, $5); } | FOR '(' forinit ';' fortest ';' forupdate ')' stm { $$ = new forStm($1, $3, $5, $7, $9); } | FOR '(' type ID ':' exp ')' stm { $$ = new extendedForStm($1, $3, $4.sym, $6, $8); } | BREAK ';' { $$ = new breakStm($1); } | CONTINUE ';' { $$ = new continueStm($1); } | RETURN_ ';' { $$ = new returnStm($1); } | RETURN_ exp ';' { $$ = new returnStm($1, $2); } ; stmexp: exp { $$ = new expStm($1->getPos(), $1); } ; blockstm: block { $$ = new blockStm($1->getPos(), $1); } ; forinit: /* empty */ { $$ = 0; } | stmexplist { $$ = $1; } | barevardec { $$ = $1; } ; fortest: /* empty */ { $$ = 0; } | exp { $$ = $1; } ; forupdate: /* empty */ { $$ = 0; } | stmexplist { $$ = $1; } ; stmexplist: stmexp { $$ = new stmExpList($1->getPos()); $$->add($1); } | stmexplist ',' stmexp { $$ = $1; $$->add($3); } ; asymptote-3.05/material.h0000644000000000000000000000562015031566105014140 0ustar rootroot#ifndef MATERIAL_H #define MATERIAL_H #ifdef HAVE_LIBGLM #include #include #include "common.h" #include "triple.h" #include namespace glm { inline ostream& operator << (ostream& out, const glm::vec4& v) { out << "[" << v[0] << "," << v[1] << "," << v[2] << "," << v[3] << "]"; return out; } } namespace camp { inline bool operator < (const glm::vec4& m1, const glm::vec4& m2) { return m1[0] < m2[0] || (m1[0] == m2[0] && (m1[1] < m2[1] || (m1[1] == m2[1] && (m1[2] < m2[2] || (m1[2] == m2[2] && (m1[3] < m2[3])))))); } inline glm::vec4 GLparameters(float shininess, float metallic, float fresnel0) { return glm::vec4(shininess,metallic,fresnel0,0.0); } struct Material { public: glm::vec4 diffuse,emissive,specular; glm::vec4 parameters; Material() {} Material(const glm::vec4& diffuse, const glm::vec4& emissive, const glm::vec4& specular, double shininess, double metallic, double fresnel0) : diffuse(diffuse), emissive(emissive), specular(specular), parameters(GLparameters(shininess,metallic,fresnel0)) {} Material(Material const& m): diffuse(m.diffuse), emissive(m.emissive), specular(m.specular), parameters(m.parameters) {} ~Material() {} Material& operator=(Material const& m) { diffuse=m.diffuse; emissive=m.emissive; specular=m.specular; parameters=m.parameters; return *this; } friend bool operator < (const Material& m1, const Material& m2) { return m1.diffuse < m2.diffuse || (m1.diffuse == m2.diffuse && (m1.emissive < m2.emissive || (m1.emissive == m2.emissive && (m1.specular < m2.specular || (m1.specular == m2.specular && (m1.parameters < m2.parameters)))))); } friend ostream& operator << (ostream& out, const Material& m) { out << "diffuse=" << m.diffuse << "," << newl << "emissive=" << m.emissive << "," << newl << "specular=" << m.specular << "," << newl << "shininess=" << m.parameters[0] << "," << newl << "metallic=" << m.parameters[1] << "," << newl << "fresnel0=" << m.parameters[2] << newl; return out; } friend jsofstream& operator << (jsofstream& out, const Material& m) { out << m.diffuse << "," << newl << m.emissive << "," << newl << m.specular << "," << newl << m.parameters[0] << "," << newl << m.parameters[1] << "," << newl << m.parameters[2]; return out; } }; extern size_t Nmaterials; // Number of materials compiled in shader extern size_t nmaterials; // Current size of materials buffer extern size_t Maxmaterials; // Maxinum size of materials buffer } #endif #endif asymptote-3.05/v3dfile.cc0000644000000000000000000002277015031566105014041 0ustar rootroot/* * v3dfile.cc * V3D Export class * * Supakorn "Jamie" Rassameemasmuang and * John C. Bowman */ #include "v3dfile.h" #ifdef HAVE_LIBTIRPC #ifdef HAVE_LIBGLM #include "drawelement.h" #include "makeUnique.h" namespace camp { using settings::getSetting; void v3dfile::writeInit() { uint32_t doubleprecision = !singleprecision; getXDRFile() << v3dVersion << doubleprecision; addHeaders(); camp::clearCenters(); camp::clearMaterials(); } void v3dfile::addHeaders() { getXDRFile() << v3dtypes::header; std::vector> headers; headers.emplace_back(make_unique(v3dheadertypes::canvasWidth, gl::fullWidth)); headers.emplace_back(make_unique(v3dheadertypes::canvasHeight, gl::fullHeight)); headers.emplace_back(make_unique(v3dheadertypes::absolute, getSetting("absolute"))); headers.emplace_back(make_unique(v3dheadertypes::minBound, triple(gl::Xmin, gl::Ymin, gl::Zmin))); headers.emplace_back(make_unique(v3dheadertypes::maxBound, triple(gl::Xmax, gl:: Ymax, gl::Zmax))); headers.emplace_back(make_unique(v3dheadertypes::orthographic, gl::orthographic)); headers.emplace_back(make_unique(v3dheadertypes::angleOfView, gl::Angle)); headers.emplace_back(make_unique(v3dheadertypes::initialZoom, gl::Zoom0)); if(gl::Shift != pair(0.0,0.0)) headers.emplace_back(make_unique(v3dheadertypes::viewportShift, gl::Shift*gl::Zoom0)); headers.emplace_back(make_unique(v3dheadertypes::viewportMargin, gl::Margin)); for(size_t i=0; i < gl::nlights; ++i) { size_t i4=4*i; headers.emplace_back(make_unique( gl::Lights[i], prc::RGBAColour(gl::Diffuse[i4], gl::Diffuse[i4+1], gl::Diffuse[i4+2], 1.0) )); } headers.emplace_back(make_unique( v3dheadertypes::background, prc::RGBAColour(gl::Background[0],gl::Background[1],gl::Background[2],gl::Background[3]))); headers.emplace_back(make_unique(v3dheadertypes::zoomFactor, getSetting("zoomfactor"))); headers.emplace_back(make_unique( v3dheadertypes::zoomPinchFactor, getSetting("zoomPinchFactor"))); headers.emplace_back(make_unique( v3dheadertypes::zoomPinchCap, getSetting("zoomPinchCap"))); headers.emplace_back(make_unique(v3dheadertypes::zoomStep, getSetting("zoomstep"))); headers.emplace_back(make_unique( v3dheadertypes::shiftHoldDistance, getSetting("shiftHoldDistance"))); headers.emplace_back(make_unique( v3dheadertypes::shiftWaitTime, getSetting("shiftWaitTime"))); headers.emplace_back(make_unique( v3dheadertypes::vibrateTime, getSetting("vibrateTime"))); getXDRFile() << (uint32_t) headers.size(); for(const auto& header : headers) { getXDRFile() << header->ty << header->getWordSize(singleprecision); header->writeContent(getXDRFile()); } } void v3dfile::addCenters() { getXDRFile() << v3dtypes::centers; size_t nelem=drawElement::centers.size(); getXDRFile() << (uint32_t) nelem; if(nelem > 0) addTriples(drawElement::centers.data(), nelem); } void v3dfile::addTriples(triple const* triples, size_t n) { for(size_t i=0; i < n; ++i) getXDRFile() << triples[i]; } void v3dfile::addColors(prc::RGBAColour const* col, size_t nc) { for(size_t i=0; i < nc; ++i) getXDRFile() << col[i]; } void v3dfile::addPatch(triple const* controls, prc::RGBAColour const* c) { getXDRFile() << (c ? v3dtypes::bezierPatchColor : v3dtypes::bezierPatch); addTriples(controls,16); addCenterIndexMat(); if(c) addColors(c,4); } void v3dfile::addStraightPatch(triple const* controls, prc::RGBAColour const* c) { getXDRFile() << (c ? v3dtypes::quadColor : v3dtypes::quad); addTriples(controls,4); addCenterIndexMat(); if(c) addColors(c,4); } void v3dfile::addBezierTriangle(triple const* controls, prc::RGBAColour const* c) { getXDRFile() << (c ? v3dtypes::bezierTriangleColor : v3dtypes::bezierTriangle); addTriples(controls,10); addCenterIndexMat(); if(c) addColors(c,3); } void v3dfile::addStraightBezierTriangle(triple const* controls, prc::RGBAColour const* c) { getXDRFile() << (c ? v3dtypes::triangleColor : v3dtypes::triangle); addTriples(controls,3); addCenterIndexMat(); if(c) addColors(c,3); } void v3dfile::addMaterial(Material const& mat) { getXDRFile() << v3dtypes::material; addvec4(mat.diffuse); addvec4(mat.emissive); addvec4(mat.specular); glm::vec4 vec=mat.parameters; getXDRFile() << static_cast(vec.x) << static_cast(vec.y) << static_cast(vec.z); } void v3dfile::addCenterIndexMat() { getXDRFile() << (uint32_t) drawElement::centerIndex << (uint32_t) materialIndex; } void v3dfile::addvec4(glm::vec4 const& vec) { getXDRFile() << static_cast(vec.x) << static_cast(vec.y) << static_cast(vec.z) << static_cast(vec.w); } void v3dfile::addHemisphere(triple const& center, double radius, double const& polar, double const& azimuth) { getXDRFile() << v3dtypes::halfSphere << center << radius; addCenterIndexMat(); getXDRFile() << polar << azimuth; } void v3dfile::addSphere(triple const& center, double radius) { getXDRFile() << v3dtypes::sphere << center << radius; addCenterIndexMat(); } void v3dfile::addCylinder(triple const& center, double radius, double height, double const& polar, double const& azimuth, bool core) { getXDRFile() << v3dtypes::cylinder << center << radius << height; addCenterIndexMat(); getXDRFile() << polar << azimuth << core; } void v3dfile::addDisk(triple const& center, double radius, double const& polar, double const& azimuth) { getXDRFile() << v3dtypes::disk << center << radius; addCenterIndexMat(); getXDRFile() << polar << azimuth; } void v3dfile::addTube(triple const* g, double width, bool core) { getXDRFile() << v3dtypes::tube; for(int i=0; i < 4; ++i) getXDRFile() << g[i]; getXDRFile() << width; addCenterIndexMat(); getXDRFile() << core; } void v3dfile::addTriangles(size_t nP, triple const* P, size_t nN, triple const* N, size_t nC, prc::RGBAColour const* C, size_t nI, uint32_t const (* PI)[3], uint32_t const (* NI)[3], uint32_t const (* CI)[3]) { getXDRFile() << v3dtypes::triangles; getXDRFile() << (uint32_t) nI; getXDRFile() << (uint32_t) nP; addTriples(P,nP); getXDRFile() << (uint32_t) nN; addTriples(N,nN); bool explicitNI=false; for(size_t i=0; i < nI; ++i) { const uint32_t *PIi=PI[i]; const uint32_t *NIi=NI[i]; if(distinct(NIi,PIi)) { explicitNI=true; break; } } getXDRFile() << (uint32_t) explicitNI; getXDRFile() << (uint32_t) nC; bool explicitCI=false; if(nC) { addColors(C,nC); for(size_t i=0; i < nI; ++i) { const uint32_t *PIi=PI[i]; const uint32_t *CIi=CI[i]; if(distinct(CIi,PIi)) { explicitNI=true; break; } } getXDRFile() << (uint32_t) explicitCI; } for(size_t i=0; i < nI; ++i) { const uint32_t *PIi=PI[i]; const uint32_t *NIi=NI[i]; addIndices(PIi); if(explicitNI) addIndices(NIi); if(nC) { const uint32_t *CIi=CI[i]; if(explicitCI) addIndices(CIi); } } addCenterIndexMat(); } void v3dfile::addIndices(uint32_t const* v) { getXDRFile() << v[0] << v[1] << v[2]; } void v3dfile::addCurve(triple const& z0, triple const& c0, triple const& c1, triple const& z1) { getXDRFile() << v3dtypes::curve << z0 << c0 << c1 << z1; addCenterIndexMat(); } void v3dfile::addCurve(triple const& z0, triple const& z1) { getXDRFile() << v3dtypes::line << z0 << z1; addCenterIndexMat(); } void v3dfile::addPixel(triple const& z0, double width) { getXDRFile() << v3dtypes::pixel << z0 << width; getXDRFile() << (uint32_t) materialIndex; } void v3dfile::finalize() { if(!finalized) { addCenters(); finalized=true; } } // gzv3dfile xdr::oxstream& gzv3dfile::getXDRFile() { return memxdrfile; } gzv3dfile::gzv3dfile(string const& name, bool singleprecision): v3dfile(singleprecision), memxdrfile(singleprecision), name(name), destroyed(false) { writeInit(); } gzv3dfile::~gzv3dfile() { close(); } void gzv3dfile::close() { if(!destroyed) { finalize(); std::vector const resultingData = memxdrfile.createCopyOfCurrentData(); memxdrfile.close(); gzFile file=gzopen(name.c_str(), "wb9"); gzwrite(file, resultingData.data(), resultingData.size()); gzclose(file); if(settings::verbose > 0) cout << "Wrote " << name << endl; destroyed=true; } } uint32_t LightHeader::getWordSize(bool singleprecision) const { return (singleprecision ? 1 : 2)*3+3; } void LightHeader::writeContent(xdr::oxstream& ox) const { ox << direction << (float) color.R << (float) color.G << (float) color.B; } LightHeader::LightHeader(triple const& direction, prc::RGBAColour const& color) : AHeader(v3dheadertypes::light), direction(direction), color(color) { } } //namespace camp #endif #endif asymptote-3.05/statistics.h0000644000000000000000000000547215031566105014541 0ustar rootroot#ifndef __statistics_h__ #define __statistics_h__ 1 #include #include namespace utils { template void clearpq(std::priority_queue& q) { struct HackedQueue : private std::priority_queue { static S& Container(std::priority_queue& q) { return q.*&HackedQueue::c; } }; HackedQueue::Container(q).clear(); } class statistics { size_t N; double A; double varL; double varH; double m,M; double Median; bool computeMedian; // These heap stores are only used when computeMedian=true. // Max heap stores the smaller half elements: std::priority_queue s; // Min heap stores the greater half elements: std::priority_queue,std::greater > g; public: statistics(bool computeMedian=false) : computeMedian(computeMedian) { clear(); } void clear() {N=0; A=varL=varH=0.0; m=DBL_MAX; M=-m; clearpq(s); clearpq(g);} double count() {return N;} double mean() {return A;} double max() {return M;} double min() {return m;} double sum() {return N*A;} void add(double t) { ++N; double diff=t-A; A += diff/N; double v=diff*(t-A); if(diff < 0.0) varL += v; else varH += v; if(t < m) m=t; if(t > M) M=t; if(computeMedian) { if(N == 1) s.push(Median=t); else { if(s.size() > g.size()) { // left side heap has more elements if(t < Median) { g.push(s.top()); s.pop(); s.push(t); } else g.push(t); Median=0.5*(s.top()+g.top()); } else if(s.size() == g.size()) { // both heaps are balanced if(t < Median) { s.push(t); Median=(double) s.top(); } else { g.push(t); Median=(double) g.top(); } } else { // right side heap has more elements if(t > Median) { s.push(g.top()); g.pop(); g.push(t); } else s.push(t); Median=0.5*(s.top()+g.top()); } } } } double stdev(double var, double f) { if(N <= f) return DBL_MAX; return sqrt(var*f/(N-f)); } double stdev() { return stdev(varL+varH,1.0); } double stdevL() { return stdev(varL,2.0); } double stdevH() { return stdev(varH,2.0); } double stderror() { return stdev()/sqrt((double) N); } double median() { if(!computeMedian) { std::cerr << "Constructor requires median=true" << std::endl; exit(-1); } return Median; } void output(const char *text, size_t m) { std::cout << text << ": \n" << m << "\t" << A << "\t" << stdevL() << "\t" << stdevH() << std::endl; } }; } #endif asymptote-3.05/glrender.h0000644000000000000000000002214315031566105014143 0ustar rootroot/***** * glrender.h * Render 3D Bezier paths and surfaces. *****/ #ifndef GLRENDER_H #define GLRENDER_H #include "common.h" #include "triple.h" #include "pen.h" #ifdef HAVE_LIBGLM #define GLM_ENABLE_EXPERIMENTAL #include #include #include #include #endif #ifdef HAVE_GL #include #ifdef __APPLE__ #define GL_SILENCE_DEPRECATION #endif #include #ifdef __APPLE__ #include #ifdef HAVE_LIBGLUT #include #ifndef GLUT_3_2_CORE_PROFILE #undef HAVE_GL #endif #endif #ifdef HAVE_LIBOSMESA #ifndef APIENTRY #define APIENTRY #endif #ifndef GLAPI #define GLAPI #endif #define GLEW_OSMESA #include #endif #else #ifdef HAVE_LIBGLUT #include #endif #ifdef HAVE_LIBOSMESA #ifndef APIENTRY #define APIENTRY #endif #ifndef GLAPI #define GLAPI #endif #include #endif #endif #else typedef unsigned int GLuint; typedef int GLint; typedef float GLfloat; typedef double GLdouble; typedef unsigned char GLubyte; typedef unsigned int GLenum; #define GL_POINTS 0x0000 #define GL_LINES 0x0001 #define GL_TRIANGLES 0x0004 #endif #ifdef HAVE_LIBGLM #include "material.h" #endif namespace camp { class picture; inline void store(GLfloat *f, double *C) { f[0]=C[0]; f[1]=C[1]; f[2]=C[2]; } inline void store(GLfloat *control, const camp::triple& v) { control[0]=v.getx(); control[1]=v.gety(); control[2]=v.getz(); } inline void store(GLfloat *control, const triple& v, double weight) { control[0]=v.getx()*weight; control[1]=v.gety()*weight; control[2]=v.getz()*weight; control[3]=weight; } } namespace gl { extern bool outlinemode; extern bool wireframeMode; extern bool orthographic; // 2D bounds extern double xmin,xmax; extern double ymin,ymax; // 3D bounds extern double Xmin,Xmax; extern double Ymin,Ymax; extern double Zmin,Zmax; extern int fullWidth,fullHeight; extern double Zoom0; extern double Angle; extern camp::pair Shift; extern camp::pair Margin; extern camp::triple *Lights; extern size_t nlights; extern double *Diffuse; extern double Background[4]; struct projection { public: bool orthographic; camp::triple camera; camp::triple up; camp::triple target; double zoom; double angle; camp::pair viewportshift; projection(bool orthographic=false, camp::triple camera=0.0, camp::triple up=0.0, camp::triple target=0.0, double zoom=0.0, double angle=0.0, camp::pair viewportshift=0.0) : orthographic(orthographic), camera(camera), up(up), target(target), zoom(zoom), angle(angle), viewportshift(viewportshift) {} }; #ifdef HAVE_GL extern GLuint ubo; GLuint initHDR(); #endif projection camera(bool user=true); struct GLRenderArgs { string prefix; camp::picture* pic; string format; double width; double height; double angle; double zoom; camp::triple m; camp::triple M; camp::pair shift; camp::pair margin; double *t; double *tup; double *background; size_t nlights; camp::triple *lights; double *diffuse; double *specular; bool view; }; void glrender(GLRenderArgs const& args, int oldpid=0); extern const double *dprojView; extern const double *dView; extern double BBT[9]; extern double T[16]; extern bool format3dWait; } namespace camp { struct Billboard { double cx,cy,cz; void init(const triple& center) { cx=center.getx(); cy=center.gety(); cz=center.getz(); } triple transform(const triple& v) const { double x=v.getx()-cx; double y=v.gety()-cy; double z=v.getz()-cz; return triple(x*gl::BBT[0]+y*gl::BBT[3]+z*gl::BBT[6]+cx, x*gl::BBT[1]+y*gl::BBT[4]+z*gl::BBT[7]+cy, x*gl::BBT[2]+y*gl::BBT[5]+z*gl::BBT[8]+cz); } }; extern Billboard BB; #ifdef HAVE_LIBGLM typedef mem::map MaterialMap; extern std::vector materials; extern MaterialMap materialMap; extern size_t materialIndex; extern int MaterialIndex; extern const size_t Nbuffer; // Initial size of 2D dynamic buffers extern const size_t nbuffer; // Initial size of 0D & 1D dynamic buffers class vertexData { public: GLfloat position[3]; GLfloat normal[3]; GLint material; vertexData() {}; vertexData(const triple& v, const triple& n) { position[0]=v.getx(); position[1]=v.gety(); position[2]=v.getz(); normal[0]=n.getx(); normal[1]=n.gety(); normal[2]=n.getz(); material=MaterialIndex; } }; class VertexData { public: GLfloat position[3]; GLfloat normal[3]; GLint material; GLfloat color[4]; VertexData() {}; VertexData(const triple& v, const triple& n) { position[0]=v.getx(); position[1]=v.gety(); position[2]=v.getz(); normal[0]=n.getx(); normal[1]=n.gety(); normal[2]=n.getz(); material=MaterialIndex; } VertexData(const triple& v, const triple& n, GLfloat *c) { position[0]=v.getx(); position[1]=v.gety(); position[2]=v.getz(); normal[0]=n.getx(); normal[1]=n.gety(); normal[2]=n.getz(); material=MaterialIndex; color[0]=c[0]; color[1]=c[1]; color[2]=c[2]; color[3]=c[3]; } }; class vertexData0 { public: GLfloat position[3]; GLfloat width; GLint material; vertexData0() {}; vertexData0(const triple& v, double width) : width(width) { position[0]=v.getx(); position[1]=v.gety(); position[2]=v.getz(); material=MaterialIndex; } }; class vertexBuffer { public: GLenum type; GLuint verticesBuffer; GLuint VerticesBuffer; GLuint vertices0Buffer; GLuint indicesBuffer; GLuint materialsBuffer; std::vector vertices; std::vector Vertices; std::vector vertices0; std::vector indices; std::vector materials; std::vector materialTable; bool rendered; // Are all patches in this buffer fully rendered? bool partial; // Does buffer contain incomplete data? vertexBuffer(GLint type=GL_TRIANGLES) : type(type), verticesBuffer(0), VerticesBuffer(0), vertices0Buffer(0), indicesBuffer(0), materialsBuffer(0), rendered(false), partial(false) {} void clear() { vertices.clear(); Vertices.clear(); vertices0.clear(); indices.clear(); materials.clear(); materialTable.clear(); } void reserve0() { vertices0.reserve(nbuffer); } void reserve() { vertices.reserve(Nbuffer); indices.reserve(Nbuffer); } void Reserve() { Vertices.reserve(Nbuffer); indices.reserve(Nbuffer); } // Store the vertex v and its normal vector n. GLuint vertex(const triple &v, const triple& n) { size_t nvertices=vertices.size(); vertices.push_back(vertexData(v,n)); return nvertices; } // Store the vertex v and its normal vector n, without an explicit color. GLuint tvertex(const triple &v, const triple& n) { size_t nvertices=Vertices.size(); Vertices.push_back(VertexData(v,n)); return nvertices; } // Store the vertex v, its normal vector n, and colors c. GLuint Vertex(const triple &v, const triple& n, GLfloat *c) { size_t nvertices=Vertices.size(); Vertices.push_back(VertexData(v,n,c)); return nvertices; } // Store the pixel v and its width. GLuint vertex0(const triple &v, double width) { size_t nvertices=vertices0.size(); vertices0.push_back(vertexData0(v,width)); return nvertices; } // append array b onto array a with offset void appendOffset(std::vector& a, const std::vector& b, size_t offset) { size_t n=a.size(); size_t m=b.size(); a.resize(n+m); for(size_t i=0; i < m; ++i) a[n+i]=b[i]+offset; } void append(const vertexBuffer& b) { appendOffset(indices,b.indices,vertices.size()); vertices.insert(vertices.end(),b.vertices.begin(),b.vertices.end()); } void Append(const vertexBuffer& b) { appendOffset(indices,b.indices,Vertices.size()); Vertices.insert(Vertices.end(),b.Vertices.begin(),b.Vertices.end()); } void append0(const vertexBuffer& b) { appendOffset(indices,b.indices,vertices0.size()); vertices0.insert(vertices0.end(),b.vertices0.begin(),b.vertices0.end()); } }; extern vertexBuffer material0Data; // pixels extern vertexBuffer material1Data; // material Bezier curves extern vertexBuffer materialData; // material Bezier patches & triangles extern vertexBuffer colorData; // colored Bezier patches & triangles extern vertexBuffer triangleData; // opaque indexed triangles extern vertexBuffer transparentData; // transparent patches & triangles void drawBuffer(vertexBuffer& data, GLint shader, bool color=false); void drawBuffers(); void clearMaterials(); void clearCenters(); typedef void draw_t(); void setMaterial(vertexBuffer& data, draw_t *draw); void drawMaterial0(); void drawMaterial1(); void drawMaterial(); void drawColor(); void drawTriangle(); void drawTransparent(); #endif } #endif asymptote-3.05/envcompleter.h0000644000000000000000000000151515031566105015044 0ustar rootroot/***** * envcompleter.h * Andy Hammerlindl 2006/07/31 * * Implements a text completion function for readline based on symbols in the * environment. *****/ #ifndef ENVCOMPLETER_H #define ENVCOMPLETER_H #include "env.h" #include "interact.h" namespace trans { class envCompleter : public interact::completer { public: typedef protoenv::symbol_list symbol_list; private: protoenv &e; symbol_list l; symbol_list::iterator index; // These are completions that don't come from the environment, such as // keywords. They are read from the keywords file. static void basicCompletions(symbol_list &l, string start); void makeList(const char *text); public: envCompleter(protoenv &e) : e(e), l(), index(l.end()) {} char *operator () (const char *text, int state); }; } // namespace trans #endif // ENVCOMPLETER_H asymptote-3.05/drawgroup.h0000644000000000000000000000550015031566105014351 0ustar rootroot/***** * drawgroup.h * John Bowman * * Group elements in a picture to be deconstructed as a single object. *****/ #ifndef DRAWGROUP_H #define DRAWGROUP_H #include "drawelement.h" namespace camp { class drawBegin : public drawElement { public: drawBegin() {} virtual ~drawBegin() {} bool begingroup() {return true;} }; class drawEnd : public drawElement { public: drawEnd() {} virtual ~drawEnd() {} bool endgroup() {return true;} }; class drawBegin3 : public drawElementLC { string name; double compression; double granularity; bool closed; // render the surface as one-sided; may yield faster rendering bool tessellate; // use tessellated mesh to store straight patches bool dobreak; // force breaking bool nobreak; // force grouping for transparent patches triple center; int interaction; public: drawBegin3(string name, double compression, double granularity, bool closed, bool tessellate, bool dobreak, bool nobreak, triple center, int interaction) : name(name), compression(compression), granularity(granularity), closed(closed), tessellate(tessellate), dobreak(dobreak), nobreak(nobreak), center(center), interaction(interaction) {} virtual ~drawBegin3() {} bool begingroup() {return true;} bool begingroup3() {return true;} bool write(prcfile *out, unsigned int *count, double compressionlimit, groupsmap& groups) { groupmap& group=groups.back(); if(name.empty()) name="group"; groupmap::const_iterator p=group.find(name); unsigned c=(p != group.end()) ? p->second+1 : 0; group[name]=c; ostringstream buf; buf << name; if(c > 0) buf << "-" << (c+1); if(interaction == BILLBOARD) buf << "-" << (*count)++ << "\001"; prc::PRCoptions options(compression > 0.0 ? max(compression,compressionlimit) : 0.0, granularity,closed,tessellate,dobreak,nobreak); groups.push_back(groupmap()); const string& s=buf.str(); out->begingroup(s.c_str(),&options,T); return true; } drawBegin3(const double* t, const drawBegin3 *s) : drawElementLC(t, s), name(s->name), compression(s->compression), granularity(s->granularity), closed(s->closed), tessellate(s->tessellate), dobreak(s->dobreak), nobreak(s->nobreak), interaction(s->interaction) { center=t*s->center; } drawElement *transformed(const double* t) { return new drawBegin3(t,this); } }; class drawEnd3 : public drawElement { public: drawEnd3() {} virtual ~drawEnd3() {} bool endgroup() {return true;} bool endgroup3() {return true;} bool write(prcfile *out, unsigned int *, double, groupsmap& groups) { groups.pop_back(); out->endgroup(); return true; } }; } GC_DECLARE_PTRFREE(camp::drawBegin); GC_DECLARE_PTRFREE(camp::drawEnd); #endif asymptote-3.05/lspdec.cc0000644000000000000000000001427415031566105013757 0ustar rootroot/** * @file lspdec.cc * @brief For createSymMap and other functions specific to Lsp in *dec classes. * @author Supakorn 'Jamie' Rassameemasmuang (jamievlin at outlook.com) */ #include "common.h" #include "dec.h" #ifdef HAVE_LSP # include "locate.h" #endif #define DEC_CREATE_SYM_MAP_FUNCTION_DEF(derived_class) \ void derived_class::createSymMap(AsymptoteLsp::SymbolContext* symContext) namespace absyntax { #ifdef HAVE_LSP DEC_CREATE_SYM_MAP_FUNCTION_DEF(unraveldec) { std::string fileName= static_cast(id->getName()); if (not AsymptoteLsp::isVirtualFile(fileName)) { symContext->extRefs.addUnravelVal(fileName); } } DEC_CREATE_SYM_MAP_FUNCTION_DEF(fromaccessdec) { // filename is id; std::string idStr(id); symContext->extRefs.addEmptyExtRef(idStr); auto* f= this->fields; if (f) { // add [dest] -> [src, filename] to fromAccessDecls; f->processListFn([&symContext, &idStr](symbol const& src, symbol const& dest) { std::string srcId(src); std::string destId(dest); symContext->extRefs.addFromAccessVal(idStr, srcId, destId); }); } } DEC_CREATE_SYM_MAP_FUNCTION_DEF(importdec) { base.createSymMap(symContext); } DEC_CREATE_SYM_MAP_FUNCTION_DEF(includedec) { std::string fullname( (std::string) settings::locateFile(filename, true).c_str() ); if (not AsymptoteLsp::isVirtualFile(fullname)) { symContext->addEmptyExtRef(fullname); symContext->extRefs.includeVals.emplace(fullname); } } DEC_CREATE_SYM_MAP_FUNCTION_DEF(recorddec) { auto* newCtx= symContext->newContext(getPos().LineColumn()); auto* structTyInfo= symContext->newTypeDec( static_cast(id), getPos().LineColumn() ); if (structTyInfo != nullptr) { structTyInfo->ctx= newCtx; body->createSymMap(newCtx); } else { cerr << "Cannot create new struct context" << endl; } } DEC_CREATE_SYM_MAP_FUNCTION_DEF(block) { for (auto const& p : stms) { p->createSymMap(symContext); } } DEC_CREATE_SYM_MAP_FUNCTION_DEF(decidstart) { std::string name(static_cast(getName())); AsymptoteLsp::posInFile pos(getPos().LineColumn()); if (auto decCtx= dynamic_cast(symContext)) { decCtx->additionalDecs.emplace( std::piecewise_construct, std::forward_as_tuple(name), std::forward_as_tuple(name, pos) ); } else { symContext->symMap.varDec[name]= AsymptoteLsp::SymbolInfo(name, pos); } } void decidstart::createSymMapWType( AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base ) { std::string name(static_cast(getName())); AsymptoteLsp::posInFile pos(getPos().LineColumn()); if (auto decCtx= dynamic_cast(symContext)) { if (base == nullptr) { decCtx->additionalDecs.emplace( std::piecewise_construct, std::forward_as_tuple(name), std::forward_as_tuple(name, pos) ); } else { decCtx->additionalDecs.emplace( std::piecewise_construct, std::forward_as_tuple(name), std::forward_as_tuple(name, static_cast(*base), pos) ); } } else { symContext->symMap.varDec[name]= base == nullptr ? AsymptoteLsp::SymbolInfo(name, pos) : AsymptoteLsp::SymbolInfo( name, static_cast(*base), pos ); } } DEC_CREATE_SYM_MAP_FUNCTION_DEF(decid) { start->createSymMap(symContext); if (init) { init->createSymMap(symContext); } } void decid::createSymMapWType( AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base ) { start->createSymMapWType(symContext, base); if (init) { init->createSymMap(symContext); } } DEC_CREATE_SYM_MAP_FUNCTION_DEF(decidlist) { for (auto const& p : decs) { p->createSymMap(symContext); } } void decidlist::createSymMapWType( AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base ) { for (auto const& p : decs) { p->createSymMapWType(symContext, base); } } DEC_CREATE_SYM_MAP_FUNCTION_DEF(vardec) { decs->createSymMapWType(symContext, base); } DEC_CREATE_SYM_MAP_FUNCTION_DEF(idpair) { if (valid) { string fullSrc(settings::locateFile(src, true)); if (not AsymptoteLsp::isVirtualFile((std::string) (fullSrc.c_str()))) { if (not fullSrc.empty()) { symContext->addEmptyExtRef((std::string) (fullSrc.c_str())); } // add (dest, source) to reference map. auto s= symContext->extRefs.fileIdPair.emplace( dest, (std::string) fullSrc.c_str() ); auto it= std::get<0>(s); auto success= std::get<1>(s); if (not success) { it->second= (std::string) (fullSrc.c_str()); } symContext->extRefs.addAccessVal(static_cast(dest)); } } } DEC_CREATE_SYM_MAP_FUNCTION_DEF(accessdec) { base->createSymMap(symContext); } DEC_CREATE_SYM_MAP_FUNCTION_DEF(idpairlist) { for (auto& idp : base) { idp->createSymMap(symContext); } } #else # define DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(derived_class) \ DEC_CREATE_SYM_MAP_FUNCTION_DEF(derived_class) {} void decidstart::createSymMapWType( AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base ) {} void decid::createSymMapWType( AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base ) {} void decidlist::createSymMapWType( AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base ) {} DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(unraveldec) DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(fromaccessdec) DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(importdec) DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(includedec) DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(recorddec) DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(block) DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(decidstart) DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(decid) DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(decidlist) DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(vardec) DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(idpair) DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(accessdec) DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(idpairlist) #endif }// namespace absyntax asymptote-3.05/drawlabel.cc0000644000000000000000000001543115031566105014436 0ustar rootroot/***** * drawlabel.cc * John Bowman 2003/04/07 * * Add a label to a picture. *****/ #include #include #include #include "drawlabel.h" #include "settings.h" #include "util.h" #include "lexical.h" using namespace settings; namespace camp { string texready=string("(Please type a command or say `\\end')\n*"); void drawLabel::labelwarning(const char *action) { cerr << "warning: label \"" << label << "\" " << action << " to avoid overwriting" << endl; } // Reads one of the dimensions from the pipe. void texdim(iopipestream& tex, double& dest, const string command, const string name) { string start(">dim("); string stop(")dim"); string expect("pt"+stop+"\n\n*"); // ask the tex engine for dimension tex << "\\immediate\\write16{" << start << "\\the\\" << command << "\\ASYbox" << stop << "}\n"; // keep reading output until ')dim\n\n*' is read tex.wait(expect.c_str()); string buffer = tex.getbuffer(); size_t dim1=buffer.find(start); size_t dim2=buffer.find("pt" + stop); string cannotread="Cannot read label "+name; if (dim1 != string::npos && dim2 != string::npos) { string n=buffer.substr(dim1+start.size(),dim2-dim1-start.size()); try { dest=lexical::cast(n,true)*tex2ps; } catch(lexical::bad_cast&) { camp::reportError(cannotread); } } else { camp::reportError(cannotread); } } void texbounds(double& width, double& height, double& depth, iopipestream& tex, string& s) { tex << "\\setbox\\ASYbox=\\hbox{" << stripblanklines(s) << "}\n\n"; tex.wait(texready.c_str()); texdim(tex,width,"wd","width"); texdim(tex,height,"ht","height"); texdim(tex,depth,"dp","depth"); } inline double urand() { auto seed = std::chrono::system_clock::now().time_since_epoch().count(); std::minstd_rand engine(seed); std::uniform_real_distribution dist(-1.0, 1.0); return dist(engine); } void setpen(iopipestream& tex, const string& texengine, const pen& pentype) { bool Latex=latex(texengine); if(Latex && setlatexfont(tex,pentype,drawElement::lastpen)) { tex << "\n"; tex.wait(texready.c_str()); } if(settexfont(tex,pentype,drawElement::lastpen,Latex)) { tex << "\n"; tex.wait(texready.c_str()); } drawElement::lastpen=pentype; } void drawLabel::getbounds(iopipestream& tex, const string& texengine) { if(havebounds) return; havebounds=true; setpen(tex,texengine,pentype); texbounds(width,height,depth,tex,label); if(width == 0.0 && height == 0.0 && depth == 0.0 && !size.empty()) texbounds(width,height,depth,tex,size); enabled=true; Align=inverse(T)*align; double scale0=max(fabs(Align.getx()),fabs(Align.gety())); if(scale0) Align *= 0.5/scale0; Align -= pair(0.5,0.5); double Depth=(pentype.Baseline() == NOBASEALIGN) ? depth : -depth*Align.gety(); texAlign=Align; const double vertical=height+depth; if(Depth > 0) texAlign += pair(0.0,Depth/vertical); Align.scale(width,vertical); Align += pair(0.0,Depth-depth); Align=T*Align; } void drawLabel::bounds(bbox& b, iopipestream& tex, boxvector& labelbounds, bboxlist&) { string texengine=getSetting("tex"); if(texengine == "none") {b += position; return;} getbounds(tex,texengine); // alignment point pair p=position+Align; const double vertical=height+depth; const double fuzz=pentype.size()*0.1+0.3; pair A=p+T*pair(-fuzz,-fuzz); pair B=p+T*pair(-fuzz,vertical+fuzz); pair C=p+T*pair(width+fuzz,vertical+fuzz); pair D=p+T*pair(width+fuzz,-fuzz); if(pentype.Overwrite() != ALLOW && label != "") { size_t n=labelbounds.size(); box Box=box(A,B,C,D); for(size_t i=0; i < n; i++) { if(labelbounds[i].intersect(Box)) { switch(pentype.Overwrite()) { case SUPPRESS: labelwarning("suppressed"); case SUPPRESSQUIET: suppress=true; return; case MOVE: labelwarning("moved"); default: break; } pair Align=(align == pair(0,0)) ? unit(pair(urand(),urand())) : unit(align); double s=0.1*pentype.size(); double dx=0, dy=0; if(Align.getx() > 0.1) dx=labelbounds[i].xmax()-Box.xmin()+s; if(Align.getx() < -0.1) dx=labelbounds[i].xmin()-Box.xmax()-s; if(Align.gety() > 0.1) dy=labelbounds[i].ymax()-Box.ymin()+s; if(Align.gety() < -0.1) dy=labelbounds[i].ymin()-Box.ymax()-s; pair offset=pair(dx,dy); position += offset; A += offset; B += offset; C += offset; D += offset; Box=box(A,B,C,D); i=0; } } labelbounds.resize(n+1); labelbounds[n]=Box; } Box=bbox(); Box += A; Box += B; Box += C; Box += D; b += Box; } void drawLabel::checkbounds() { if(!havebounds) reportError("drawLabel::write called before bounds"); } bool drawLabel::write(texfile *out, const bbox&) { checkbounds(); if(suppress || pentype.invisible() || !enabled) return true; out->setpen(pentype); out->put(label,T,position,texAlign); return true; } drawElement *drawLabel::transformed(const transform& t) { return new drawLabel(label,size,t*T,t*position, length(align)*unit(shiftless(t)*align),pentype,KEY); } void drawLabelPath::bounds(bbox& b, iopipestream& tex, boxvector&, bboxlist&) { string texengine=getSetting("tex"); if(texengine == "none") {b += position; return;} getbounds(tex,texengine); double L=p.arclength(); double s1,s2; if(justify == "l") { s1=0.0; s2=width; } else if(justify == "r") { s1=L-width; s2=L; } else { double s=0.5*L; double h=0.5*width; s1=s-h; s2=s+h; } double Sx=shift.getx(); double Sy=shift.gety(); s1 += Sx; s2 += Sx; if(width > L || (!p.cyclic() && (s1 < 0 || s2 > L))) { ostringstream buf; buf << "Cannot fit label \"" << label << "\" to path"; reportError(buf); } path q=p.subpath(p.arctime(s1),p.arctime(s2)); b += q.bounds(Sy,Sy+height); Box=b; } bool drawLabelPath::write(texfile *out, const bbox&) { double Hoffset=getSetting("inlinetex") ? Box.right : Box.left; Box=Box.shift(pair(-Hoffset,-Box.bottom)); checkbounds(); if(drawLabel::pentype.invisible()) return true; out->setpen(drawLabel::pentype); out->verbatimline("\\psset{unit=1pt}%"); out->verbatim("\\pstextpath["); out->verbatim(justify); out->verbatim("]"); out->writepair(shift); out->verbatim("{\\pstVerb{"); out->beginraw(); writeshiftedpath(out); out->endraw(); out->verbatim("}}{"); out->verbatim(label); out->verbatimline("}"); return true; } drawElement *drawLabelPath::transformed(const transform& t) { return new drawLabelPath(label,size,transpath(t),justify,shift, transpen(t),KEY); } } //namespace camp asymptote-3.05/absyn.cc0000644000000000000000000000077015031566105013615 0ustar rootroot/**** * absyn.cc * Tom Prince 2004/05/12 * * Utility functions for syntax trees. *****/ #include "absyn.h" #include "coenv.h" namespace absyntax { void absyn::markPos(trans::coenv& e) { e.c.markPos(getPos()); } absyn::~absyn() {} void prettyindent(ostream &out, Int indent) { for (Int i = 0; i < indent; i++) out << " "; } void prettyname(ostream &out, string name, Int indent, position pos) { pos.print(out); prettyindent(out,indent); out << name << "\n"; } } // namespace absyntax asymptote-3.05/testsExtra/0000755000000000000000000000000015031566105014334 5ustar rootrootasymptote-3.05/testsExtra/gc/0000755000000000000000000000000015031566105014725 5ustar rootrootasymptote-3.05/testsExtra/gc/funcall.asy0000644000000000000000000000006615031566105017071 0ustar rootrootvoid g() {} for (int i = 0; i < 1e9; ++i) { g(); } asymptote-3.05/testsExtra/gc/shipout.asy0000644000000000000000000000030115031566105017130 0ustar rootrootguide a; for (int i = 0; i < 1e7; ++i) { picture pic; size(pic,10cm,20cm); path p=(1.0,2.0); path q=(3.0,4.0); path a=p..q..(3,5); draw(pic,a,blue+dashed); shipout("out/",pic); } asymptote-3.05/testsExtra/gc/transform.asy0000644000000000000000000000010615031566105017453 0ustar rootrootpath p=unitsquare; for (int i = 0; i < 1e7; ++i) { scale(2.0)*p; } asymptote-3.05/testsExtra/gc/path.asy0000644000000000000000000000017415031566105016401 0ustar rootrootguide a; for (int i = 0; i < 1e7; ++i) { // guide a=a--(1.0,2.0); path p=(1.0,2.0); path q=(3.0,4.0); path a=p--q; } asymptote-3.05/testsExtra/gc/guide.asy0000644000000000000000000000010115031566105016530 0ustar rootrootguide a=(0,0); for (int i = 0; i < 1e9; ++i) { guide b=a--a; } asymptote-3.05/testsExtra/gc/label.asy0000644000000000000000000000021715031566105016522 0ustar rootrootguide a; for (int i = 0; i < 1e7; ++i) { picture pic; size(pic,10cm,20cm); draw(pic,"a",scale(2)*(0,0)--(1,1)); shipout("out/",pic); } asymptote-3.05/testsExtra/gc/pen.asy0000644000000000000000000000011015031566105016215 0ustar rootrootfor (int i = 0; i < 1e7; ++i) { pen p = linetype(new real[] {1,2}); } asymptote-3.05/testsExtra/gc/struct.asy0000644000000000000000000000020115031566105016760 0ustar rootrootfor (int i = 0; i < 1e7; ++i) { picture pic; unitsize(pic, 0.02mm, 0.04mm); draw(pic,unitcircle); shipout("out/",pic); } asymptote-3.05/testsExtra/gc/string.asy0000644000000000000000000000011515031566105016746 0ustar rootrootstring a="abc"; for (int i = 0; i < 1e7; ++i) { "a"+"b"; a=reverse(a); } asymptote-3.05/testsExtra/gc/array.asy0000644000000000000000000000007615031566105016564 0ustar rootrootreal[] a; for (int i = 0; i < 1e9; ++i) { a=new real[10]; } asymptote-3.05/testsExtra/gc/file.asy0000644000000000000000000000014615031566105016363 0ustar rootrootfor (int i = 0; i < 1e7; ++i) { file a=output("out/"+(string) i); write(a,i,endl); close(a); } asymptote-3.05/testsExtra/output/0000755000000000000000000000000015031566105015674 5ustar rootrootasymptote-3.05/testsExtra/output/line.asy0000644000000000000000000000002615031566105017337 0ustar rootrootdraw((0,0)--(100,0)); asymptote-3.05/testsExtra/output/Makefile0000644000000000000000000000240415031566105017334 0ustar rootroot# Automated testing to see if the output of Asymptote scripts changes when the # program is modified. # How to call asy from the tests/output/name.out directory ASY=../../../asy TESTS=$(basename $(wildcard *.asy)) # This command performs the testing on all scripts. diff: $(TESTS:=.diff) # This builds the reference copies of the output using a trusted version of asy ref: $(TESTS:=.ref) $(TESTS:=.ref) $(TESTS:=.out): %: @echo Generating $@ @rm -rf $@ @mkdir $@ @cd $@; \ $(ASY) -keep ../$(basename $@) \ >$(basename $@).stdout 2>$(basename $@).stderr; \ ls >$(basename $@).ls; \ rm -f *.dvi *.pdf *.gif *.jpg *.jpeg *.png # Ignore lines with timestamps of the form hh:mm, since the time changes between # runs. This regex is fairly broad and it may need to be narrowed. $(TESTS:=.diff): %.diff: %.out diff -I "[0-9][0-9]:[0-9][0-9]" -u $(@:.diff=.ref) $(@:.diff=.out) clean: rm -rf *.out # The reference copies should only be built at the start, or when the behaviour # of Asymptote is intentionally changed, so they are not usually removed by make # clean. veryclean: clean rm -rf *.ref # This tells make to build every dependency from scratch, ignoring the dates on # files. .PHONY: $(TESTS:=.ref) $(TESTS:=.out) $(TESTS:=.diff) diff ref clean veryclean asymptote-3.05/testsExtra/output/circle.asy0000644000000000000000000000002215031566105017645 0ustar rootrootdraw(unitcircle); asymptote-3.05/testsExtra/gsl/0000755000000000000000000000000015031566105015121 5ustar rootrootasymptote-3.05/testsExtra/gsl/random.asy0000644000000000000000000002720315031566105017123 0ustar rootrootimport TestLib; import gsl; StartTest("random number generators"); rng_init(); assert(rng_min() == 0); assert(rng_max() == 4294967295); assert(rng_get() == 4293858116); rng_init("taus2"); assert(rng_min() == 0); assert(rng_max() == 4294967295); assert(rng_get() == 802792108); rng_init("gfsr4"); assert(rng_min() == 0); assert(rng_max() == 4294967295); assert(rng_get() == 2901276280); string[] list = rng_list(); for(string name: list) { rng_init(name); rng_min(); rng_max(); rng_get(); } assert(list.length >= 62); rng_init(); rng_set(1); assert(rng_get() == 1791095845); rng_set(1); assert(rng_get() == 1791095845); EndTest(); StartTest("Bernoulli distribution"); assert(close(pdf_bernoulli(0,0.3), 0.7)); assert(close(pdf_bernoulli(1,0.3), 0.3)); //rng_init(); //assert(rng_bernoulli(0.3) == 0); EndTest(); StartTest("beta distribution"); assert(close(cdf_beta_P(0.3,5,5), 0.09880866)); assert(close(cdf_beta_Q(0.3,5,5) + cdf_beta_P(0.3,5,5), 1)); assert(close(cdf_beta_Pinv(cdf_beta_P(0.3,5,5),5,5), 0.3)); assert(close(cdf_beta_Qinv(cdf_beta_Q(0.3,5,5),5,5), 0.3)); assert(close(pdf_beta(0.3,5,5), 1.2252303)); //rng_init(); //assert(close(rng_beta(5,5), 0.533021338130471)); EndTest(); StartTest("binomial distribution"); assert(close(cdf_binomial_P(5,0.3,10), 0.9526510126)); assert(close(cdf_binomial_P(5,0.3,10) + cdf_binomial_Q(5,0.3,10), 1)); assert(close(pdf_binomial(5,0.3,10), 0.1029193452)); //rng_init(); //assert(rng_binomial(0.3,10) == 8); EndTest(); StartTest("bivariate Gaussian distribution"); assert(close(pdf_bivariate_gaussian((1,1),(0,2),(4,6),0.5), 0.00675758392382108)); //rng_init(); //pair z = (-0.260388644979556,2.50057001628669); //pair r = rng_bivariate_gaussian((0,2),(4,6),0.5); //assert(close(length(r - z), 0)); EndTest(); StartTest("cauchy distribution"); assert(close(cdf_cauchy_P(1,3), 0.602416382349567)); assert(close(cdf_cauchy_P(1,3) + cdf_cauchy_Q(1,3), 1)); assert(close(cdf_cauchy_Pinv(cdf_cauchy_P(1,3),3), 1)); assert(close(cdf_cauchy_Qinv(cdf_cauchy_Q(1,3),3), 1)); assert(close(pdf_cauchy(1,3), 0.0954929658551372)); //rng_init(); //assert(close(rng_cauchy(3), -0.0024339597467863)); EndTest(); StartTest("chi-squared distribution"); assert(close(cdf_chisq_P(4,6), 0.323323583816936)); assert(close(cdf_chisq_P(4,6) + cdf_chisq_Q(4, 6), 1)); assert(close(cdf_chisq_Pinv(cdf_chisq_P(4,6),6), 4)); assert(close(cdf_chisq_Qinv(cdf_chisq_Q(4,6),6), 4)); assert(close(pdf_chisq(4,6), 0.135335283236613)); //rng_init(); //assert(close(rng_chisq(6), 8.24171826270279)); EndTest(); StartTest("Dirichlet distribution"); real[] alpha = {1,2,3,4}; real[] theta = {0.1,0.2,0.3,0.4}; assert(close(pdf_dirichlet(alpha,theta), 34.83648)); //rng_init(); //real[] z = {0.124480735441317, // 0.191823537067349, // 0.460543885448264, // 0.22315184204307}; //real[] r = rng_dirichlet(alpha); //assert(close(norm(r - z), 0)); EndTest(); StartTest("exponential distribution"); assert(close(cdf_exponential_P(2,3), 0.486582880967408)); assert(close(cdf_exponential_P(2,3) + cdf_exponential_Q(2,3), 1)); assert(close(cdf_exponential_Pinv(cdf_exponential_P(2,3),3), 2)); assert(close(cdf_exponential_Qinv(cdf_exponential_Q(2,3),3), 2)); assert(close(pdf_exponential(2,3), 0.171139039677531)); //rng_init(); //assert(close(rng_exponential(3), 24.7847346491112)); EndTest(); StartTest("exponential power distribution"); assert(close(cdf_exppow_P(2,3,2), 0.82711070692442)); assert(close(cdf_exppow_P(2,3,2) + cdf_exppow_Q(2,3,2), 1)); assert(close(pdf_exppow(2,3,2), 0.120582432109095)); //rng_init(); //assert(close(rng_exppow(3,2), 0.284084267783339)); EndTest(); StartTest("F-distribution"); assert(close(cdf_fdist_P(1,5,4), 0.485657196759213)); assert(close(cdf_fdist_P(1,5,4) + cdf_fdist_Q(1,5,4), 1)); //rng_init(); //assert(close(rng_fdist(5,4), 1.20570928490019)); EndTest(); StartTest("flat (uniform) distribution"); assert(close(cdf_flat_P(2,0,5), 0.4)); assert(close(cdf_flat_P(2,0,5) + cdf_flat_Q(2,0,5), 1)); assert(close(cdf_flat_Pinv(cdf_flat_P(2,0,5),0,5), 2)); assert(close(cdf_flat_Qinv(cdf_flat_Q(2,0,5),0,5), 2)); assert(close(pdf_flat(2,0,5), 0.2)); //rng_init(); //assert(close(rng_flat(0,5), 4.99870874453336)); EndTest(); StartTest("Gamma-distribution"); assert(close(cdf_gamma_P(6,5,1), 0.71494349968337)); assert(close(cdf_gamma_P(6,5,1) + cdf_gamma_Q(6,5,1), 1)); assert(close(cdf_gamma_Pinv(cdf_gamma_P(6,5,1),5,1), 6)); assert(close(cdf_gamma_Qinv(cdf_gamma_Q(6,5,1),5,1), 6)); assert(close(pdf_gamma(6,5,1), 0.133852617539983)); //rng_init(); //assert(close(rng_gamma(5,1), 6.52166444209317)); //assert(close(rng_gamma(5,1,"mt"), 5.71361391461836)); //assert(close(rng_gamma(5,1,"knuth"), 1.53054227085541)); EndTest(); StartTest("Gaussian distribution"); assert(close(cdf_gaussian_P(1,0,1), 0.841344746068543)); assert(close(cdf_gaussian_P(1,0,1) + cdf_gaussian_Q(1,0,1), 1)); assert(close(cdf_gaussian_Pinv(cdf_gaussian_P(1,0,1),0,1), 1)); assert(close(cdf_gaussian_Qinv(cdf_gaussian_Q(1,0,1),0,1), 1)); assert(close(pdf_gaussian(1,0,1), 0.241970724519143)); //rng_init(); //assert(close(rng_gaussian(0,1), 0.133918608118676)); //assert(close(rng_gaussian(1,2,"ziggurat"), 1.90467233084303)); //assert(close(rng_gaussian(1,2,"ratio"), 4.04779517509342)); //assert(close(rng_gaussian(1,2,"polar"), 1.54245166575101)); EndTest(); StartTest("Gaussian tail distribution"); assert(close(pdf_gaussian_tail(2,1,1), 0.34030367841782)); //rng_init(); //assert(close(rng_gaussian_tail(1,1), 1.0528474462339)); EndTest(); StartTest("geometric distribution"); assert(close(cdf_geometric_P(6,0.1), 0.468559)); assert(close(cdf_geometric_P(6,0.1) + cdf_geometric_Q(6,0.1), 1)); assert(close(pdf_geometric(6,0.1), 0.059049)); //rng_init(); //assert(rng_geometric(0.1) == 1); EndTest(); StartTest("Gumbel1 distribution"); assert(close(cdf_gumbel1_P(1,3,8), 0.671462877871127)); assert(close(cdf_gumbel1_P(1,3,8) + cdf_gumbel1_Q(1,3,8), 1)); assert(close(cdf_gumbel1_Pinv(cdf_gumbel1_P(1,3,8),3,8), 1)); assert(close(cdf_gumbel1_Qinv(cdf_gumbel1_Q(1,3,8),3,8), 1)); assert(close(pdf_gumbel1(1,3,8), 0.80232403696926)); //rng_init(); //assert(close(rng_gumbel1(3,8), 3.44696353953564)); EndTest(); StartTest("Gumbel2 distribution"); assert(close(cdf_gumbel2_P(2,2,3), 0.472366552741015)); assert(close(cdf_gumbel2_P(2,2,3) + cdf_gumbel2_Q(2,2,3), 1)); assert(close(cdf_gumbel2_Pinv(cdf_gumbel2_P(2,2,3),2,3), 2)); assert(close(cdf_gumbel2_Qinv(cdf_gumbel2_Q(2,2,3),2,3), 2)); assert(close(pdf_gumbel2(2,2,3), 0.354274914555761)); //rng_init(); //assert(close(rng_gumbel2(2,3), 107.773379309453)); EndTest(); StartTest("hypergeometric distribution"); assert(close(cdf_hypergeometric_P(4,10,10,8), 0.675041676589664)); assert(close(cdf_hypergeometric_P(4,10,10,8) + cdf_hypergeometric_Q(4,10,10,8), 1)); assert(close(pdf_hypergeometric(4,10,10,8), 0.350083353179329)); //rng_init(); //assert(rng_hypergeometric(10,10,8) == 3); EndTest(); StartTest("Laplace distribution"); assert(close(cdf_laplace_P(1,2), 0.696734670143683)); assert(close(cdf_laplace_P(1,2) + cdf_laplace_Q(1,2), 1)); assert(close(cdf_laplace_Pinv(cdf_laplace_P(1,2),2), 1)); assert(close(cdf_laplace_Qinv(cdf_laplace_Q(1,2),2), 1)); assert(close(pdf_laplace(1,2), 0.151632664928158)); //rng_init(); //assert(close(rng_laplace(2), 0.00103327123971616)); EndTest(); StartTest("Landau distribution"); assert(close(pdf_landau(1), 0.145206637130862)); //rng_init(); //assert(close(rng_landau(), 3880.0374262546)); EndTest(); //StartTest("Levy stable distribution"); //rng_init(); //assert(close(rng_levy(1,1,0), 1232.55941432972)); //assert(close(rng_levy(1,1,1), -0.13781830409645)); //EndTest(); StartTest("logistic distribution"); assert(close(cdf_logistic_P(1,2), 0.622459331201855)); assert(close(cdf_logistic_P(1,2) + cdf_logistic_Q(1,2), 1)); assert(close(cdf_logistic_Pinv(cdf_logistic_P(1,2),2), 1)); assert(close(cdf_logistic_Qinv(cdf_logistic_Q(1,2),2), 1)); assert(close(pdf_logistic(1,2), 0.117501856100797)); //rng_init(); //assert(close(rng_logistic(2), 16.522639863849)); EndTest(); StartTest("lognormal distribution"); assert(close(cdf_lognormal_P(6,2,1), 0.417520581602749)); assert(close(cdf_lognormal_P(6,2,1) + cdf_lognormal_Q(6,2,1), 1)); assert(close(cdf_lognormal_Pinv(cdf_lognormal_P(6,2,1),2,1), 6)); assert(close(cdf_lognormal_Qinv(cdf_lognormal_Q(6,2,1),2,1), 6)); assert(close(pdf_lognormal(6,2,1), 0.0650642483079156)); //rng_init(); //assert(close(rng_lognormal(2,1), 6.92337133931968)); EndTest(); StartTest("multinomial distribution"); real[] p = {0.1,0.2,0.3,0.4}; int[] n = {1,2,3,4}; assert(close(pdf_multinomial(p,n), 0.03483648)); //rng_init(); //int[] r = {5, 0, 1, 4}; //assert(all(rng_multinomial(10,p) == r)); EndTest(); StartTest("negative binomial distribution"); assert(close(cdf_negative_binomial_P(6,0.5,10), 0.227249145507813)); assert(close(cdf_negative_binomial_P(6,0.5,10) + cdf_negative_binomial_Q(6,0.5,10), 1)); assert(close(pdf_negative_binomial(6,0.5,10), 0.076370239257812)); //rng_init(); //assert(rng_negative_binomial(0.5,10) == 15); EndTest(); StartTest("Pareto distribution"); assert(close(cdf_pareto_P(4,2,2), 0.75)); assert(close(cdf_pareto_P(4,2,2) + cdf_pareto_Q(4,2,2), 1)); assert(close(cdf_pareto_Pinv(cdf_pareto_P(4,2,2),2,2), 4)); assert(close(cdf_pareto_Qinv(cdf_pareto_Q(4,2,2),2,2), 4)); assert(close(pdf_pareto(4,2,2), 0.125)); //rng_init(); //assert(close(rng_pareto(2,2), 2.00025830112432)); EndTest(); StartTest("Poisson distribution"); assert(close(cdf_poisson_P(5,6), 0.445679641364611)); assert(close(cdf_poisson_P(5,6) + cdf_poisson_Q(5,6), 1)); assert(close(pdf_poisson(5,6), 0.16062314104798)); //rng_init(); //assert(rng_poisson(6) == 8); EndTest(); StartTest("Rayleigh distribution"); assert(close(cdf_rayleigh_P(3,2), 0.67534753264165)); assert(close(cdf_rayleigh_P(3,2) + cdf_rayleigh_Q(3,2), 1)); assert(close(cdf_rayleigh_Pinv(cdf_rayleigh_P(3,2),2), 3)); assert(close(cdf_rayleigh_Qinv(cdf_rayleigh_Q(3,2),2), 3)); assert(close(pdf_rayleigh(3,2), 0.243489350518762)); //rng_init(); //assert(close(rng_rayleigh(2), 0.0454563039310455)); EndTest(); StartTest("Rayleigh tail distribution"); assert(close(pdf_rayleigh_tail(5,4,1), 0.0555449826912115)); //rng_init(); //assert(close(rng_rayleigh_tail(4,1), 4.0000645705903)); EndTest(); //StartTest("spherical distributions"); //rng_init(); //pair z = (-0.617745613497854,-0.786377998804748); //pair r = rng_dir2d(); //assert(close(length(r - z), 0)); //pair z = (0.993748310886084,0.111643605329884); //pair r = rng_dir2d("neumann"); //assert(close(length(r - z), 0)); //pair z = (0.964519203132591,-0.264012701945327); //pair r = rng_dir2d("trig"); //assert(close(length(r - z), 0)); //triple z = (0.849028025629996,0.139162687752509,-0.509691237939527); //triple r = rng_dir3d(); //assert(close(length(r - z), 0)); //real[] z = {0.420990368676528, // -0.626782975357296, // 0.0441585572224004, // -0.0458388920727644, // -0.652578753164271}; //real[] r = rng_dir(5); //assert(close(norm(r - z), 0)); //EndTest(); StartTest("t-distribution"); assert(close(cdf_tdist_P(0.6,2), 0.695283366471236)); assert(close(cdf_tdist_P(0.6,2) + cdf_tdist_Q(0.6,2), 1)); assert(close(cdf_tdist_Pinv(cdf_tdist_P(0.6,2),2), 0.6)); assert(close(cdf_tdist_Qinv(cdf_tdist_Q(0.6,2),2), 0.6)); assert(close(pdf_tdist(0.6,2), 0.275823963942424)); //rng_init(); //assert(close(rng_tdist(2), 0.127201714006725)); EndTest(); StartTest("Weibull distribution"); assert(close(cdf_weibull_P(1,2,2), 0.221199216928595)); assert(close(cdf_weibull_P(1,2,2) + cdf_weibull_Q(1,2,2), 1)); assert(close(cdf_weibull_Pinv(cdf_weibull_P(1,2,2),2,2), 1)); assert(close(cdf_weibull_Qinv(cdf_weibull_Q(1,2,2),2,2), 1)); assert(close(pdf_weibull(1,2,2), 0.389400391535702)); //rng_init(); //assert(close(rng_weibull(2,2), 0.032142460757319)); EndTest(); asymptote-3.05/keywords.h0000644000000000000000000000117715031566132014214 0ustar rootroot/***** * This file is automatically generated by keywords.py. * Changes will be overwritten. *****/ ADD(and); ADD(controls); ADD(tension); ADD(atleast); ADD(curl); ADD(if); ADD(else); ADD(while); ADD(for); ADD(do); ADD(return); ADD(break); ADD(continue); ADD(struct); ADD(typedef); ADD(using); ADD(new); ADD(access); ADD(import); ADD(unravel); ADD(from); ADD(include); ADD(quote); ADD(static); ADD(autounravel); ADD(public); ADD(private); ADD(restricted); ADD(this); ADD(explicit); ADD(true); ADD(false); ADD(null); ADD(cycle); ADD(newframe); ADD(operator); ADD(quit); ADD(q); ADD(exit); ADD(reset); ADD(erase); ADD(help); ADD(input); asymptote-3.05/_config.yml0000644000000000000000000000003215031566105014310 0ustar rootroottheme: jekyll-theme-caymanasymptote-3.05/v3dheadertypes.csv0000644000000000000000000000206315031566105015636 0ustar rootrootcanvasWidth,1,UINT # Canvas width canvasHeight,2,UINT # Canvas heighot absolute,3,BOOL # true: absolute size; false: scale to canvas minBound,4,TRIPLE # Scene minimum bounding box corners maxBound,5,TRIPLE # Scene maximum bounding box corners orthographic,6,BOOL # true: orthographic; false: perspective angleOfView,7,REAL # Field of view angle (in radians) initialZoom,8,REAL # Initial zoom viewportShift,9,PAIR # Viewport shift (for perspective projection) viewportMargin,10,PAIR # Margin around viewport light,11,TRIPLE,RGB # Direction and color of each point light source background,12,RGBA # Background color zoomFactor,13,REAL # Zoom base factor zoomPinchFactor,14,REAL # Zoom pinch factor zoomPinchCap,15,REAL # Zoom pinch limit zoomStep,16,REAL # Zoom power step shiftHoldDistance,17,REAL # Shift-mode maximum hold distance (pixels) shiftWaitTime,18,REAL # Shift-mode hold time (milliseconds) vibrateTime,19,REAL # Shift-mode vibrate time (milliseconds) asymptote-3.05/win32pipestream.h0000644000000000000000000000340215031566105015372 0ustar rootroot/** * @file win32pipestream.h * @brief A reimplementation of pipestream for win32 * @author Supakorn "Jamie" Rassameemasmuang (jamievlin [at] outlook.com) */ #pragma once #if defined(_WIN32) #include "common.h" #include #include #include namespace w32 { class Win32IoPipeStream { public: static const size_t BUFFER_LEN = SHRT_MAX; void open( const mem::vector &command, const char *hint=NULL, const char *application="", int out_fileno=STDOUT_FILENO); virtual ~Win32IoPipeStream(); [[nodiscard]] bool isopen() const; Win32IoPipeStream() = default; Win32IoPipeStream( const mem::vector &command, const char *hint=NULL, const char *application="", int out_fileno=STDOUT_FILENO); void eof(); virtual void pipeclose(); void block(bool write, bool read); int wait(); void Write(const string &s); void wait(const char *prompt); string readline(); bool tailequals( const char *buf, size_t len, const char *prompt, size_t plen); ssize_t readbuffer(); Win32IoPipeStream& operator>>(string& s); Win32IoPipeStream& operator<<(const string& s); typedef Win32IoPipeStream& (*imanip)(Win32IoPipeStream&); Win32IoPipeStream& operator<< (imanip func); string getbuffer(); bool running(); template Win32IoPipeStream& operator<<(T x) { ostringstream os; os << x; Write(os.str()); return *this; } private: void closeProcessHandles(); protected: PROCESS_INFORMATION procInfo = {}; bool pipeopen = false; HANDLE processStdinWr; HANDLE processOutRd; bool Running; bool pipein; char buffer[BUFFER_LEN]; string sbuffer; }; } #endif asymptote-3.05/win32helpers.cc0000644000000000000000000001103215031566105015017 0ustar rootroot/** * @brief Windows-specific utility functions * @author Supakorn "Jamie" Rassameemasmuang (jamievlin [at] outlook.com) */ #if defined(_WIN32) #include "win32helpers.h" #include "errormsg.h" #include using camp::reportError; namespace camp::w32 { bool checkShellExecuteResult(INT_PTR const shellExecResult, bool const reportWarning) { switch (shellExecResult) { // see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutea // ERROR_FILE_NOT_FOUND and ERROR_PATH_NOT_FOUND shares the same error code as // SE_ERR_FNF and SE_ERR_PNF, respectively case 0: case ERROR_BAD_FORMAT: case SE_ERR_ACCESSDENIED: case SE_ERR_ASSOCINCOMPLETE: case SE_ERR_DDEBUSY: case SE_ERR_DDEFAIL: case SE_ERR_DDETIMEOUT: case SE_ERR_DLLNOTFOUND: case SE_ERR_FNF: case SE_ERR_NOASSOC: case SE_ERR_OOM: case SE_ERR_PNF: case SE_ERR_SHARE: { if (reportWarning) { DWORD const errorCode= GetLastError(); ostringstream msg; msg << "Error code: 0x" << std::hex << errorCode << std::dec << "; message: " << getErrorMessage(errorCode); camp::reportWarning(msg.str()); } } return false; default: return true; } } void reportAndFailWithLastError(string const& message) { DWORD errorCode= GetLastError(); ostringstream msg; msg << message << "; error code = 0x" << std::hex << errorCode << std::dec << "; Windows Message: " << getErrorMessage(errorCode); reportError(msg); } void checkResult(BOOL result, string const& message) { if (!result) { reportAndFailWithLastError(message); } } void checkLStatus(LSTATUS result, string const& message) { checkResult(result == ERROR_SUCCESS, message); } bool isProcessRunning(DWORD const& pid) { if (pid == 0) { return true; // system idle is always running } HandleRaiiWrapper const processHandle(OpenProcess(PROCESS_QUERY_INFORMATION, false, pid)); if (processHandle.getHandle() == nullptr) { // handle not in system, returns false return false; } DWORD exitCode=999; if (GetExitCodeProcess(processHandle.getHandle(), &exitCode)) { if (exitCode == STILL_ACTIVE) { return true; } else { return false; } } return false; } #pragma region RegKeyWrapper RegKeyWrapper::RegKeyWrapper(HKEY const& regKey) : key(regKey) { } RegKeyWrapper::RegKeyWrapper() : key(nullptr) { } RegKeyWrapper::~RegKeyWrapper() { closeExistingKey(); } RegKeyWrapper::RegKeyWrapper(RegKeyWrapper&& other) noexcept : key(std::exchange(other.key, nullptr)) { } RegKeyWrapper& RegKeyWrapper::operator=(RegKeyWrapper&& other) noexcept { if (this != &other) { closeExistingKey(); this->key = std::exchange(other.key, nullptr); } return *this; } HKEY RegKeyWrapper::getKey() const { return key; } void RegKeyWrapper::closeExistingKey() { if (this->key != nullptr) { RegCloseKey(this->key); this->key = nullptr; } } PHKEY RegKeyWrapper::put() { closeExistingKey(); return &(this->key); } void RegKeyWrapper::release() { this->key = nullptr; } #pragma endregion #pragma region HandleRaiiWrapper HandleRaiiWrapper::HandleRaiiWrapper(HANDLE const& handle) : hd(handle) { } HandleRaiiWrapper::~HandleRaiiWrapper() { if (hd) { if (!CloseHandle(hd)) { cerr << "Warning: Cannot close handle" << endl; } } } HandleRaiiWrapper::HandleRaiiWrapper(HandleRaiiWrapper&& other) noexcept : hd(std::exchange(other.hd, nullptr)) { } HANDLE HandleRaiiWrapper::getHandle() const { return hd; } LPHANDLE HandleRaiiWrapper::put() { if (hd) { w32::checkResult(CloseHandle(hd)); hd = nullptr; } return &hd; } #pragma endregion string buildWindowsCmd(const mem::vector& command) { ostringstream out; for (auto it= command.begin(); it != command.end(); ++it) { out << '"' << *it << '"'; if (std::next(it) != command.end()) { out << ' '; } } return out.str(); } string getErrorMessage(DWORD const& errorCode) { LPSTR messageOut= nullptr; auto ret = FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast(&messageOut), 0, nullptr ); if (ret == 0) { return "Cannot determine error message"; } string retString(messageOut); LocalFree(messageOut); return retString; } }// namespace camp::w32 #endif asymptote-3.05/v3dfile.h0000644000000000000000000001041415031566105013673 0ustar rootroot/* * v3dfile.h * Header file for v3d export and types * * Supakorn "Jamie" Rassameemasmuang and * John C. Bowman */ #ifndef V3DFILE_H #define V3DFILE_H #include #include #include "common.h" #ifdef HAVE_LIBTIRPC #include "abs3doutfile.h" #include "xstream.h" #include "triple.h" #include "material.h" #define transform transform_ #include "v3dtypes.h" #undef transform #include "v3dheadertypes.h" namespace camp { class AHeader { public: v3dheadertypes ty; AHeader(v3dheadertypes const& ty) : ty(ty) {} virtual ~AHeader() = default; virtual uint32_t getWordSize(bool singleprecision) const = 0; virtual void writeContent(xdr::oxstream& ox) const = 0; }; template class SingleObjectHeader : public AHeader { public: SingleObjectHeader(v3dheadertypes const& ty, T const& ob) : AHeader(ty), obj(ob) { } ~SingleObjectHeader() override = default; protected: uint32_t getWordSize(bool singleprecision) const override { return (singleprecision ? 1 : 2)*realWords+floatWords; } void writeContent(xdr::oxstream &ox) const override { ox << obj; } private: T obj; }; using open_mode=xdr::xios::open_mode; using TripleHeader=SingleObjectHeader; using PairHeader=SingleObjectHeader; using DoubleHeader=SingleObjectHeader; using Uint32Header=SingleObjectHeader; using RGBAHeader=SingleObjectHeader; const unsigned int v3dVersion=1; class LightHeader : public AHeader { public: LightHeader(triple const& direction, prc::RGBAColour const& color); ~LightHeader() override=default; protected: [[nodiscard]] uint32_t getWordSize(bool singleprecision) const override; void writeContent(xdr::oxstream &ox) const override; private: triple direction; prc::RGBAColour color; }; class v3dfile : public abs3Doutfile { private: bool finalized; public: v3dfile(bool singleprecision=false) : abs3Doutfile(singleprecision), finalized(false) {} void writeInit(); void finalize(); void addPatch(triple const* controls, prc::RGBAColour const* c) override; void addStraightPatch( triple const* controls, prc::RGBAColour const* c) override; void addBezierTriangle( triple const* control, prc::RGBAColour const* c) override; void addStraightBezierTriangle( triple const* controls, prc::RGBAColour const* c) override; #ifdef HAVE_LIBGLM void addMaterial(Material const& mat) override; #endif void addSphere(triple const& center, double radius) override; void addHemisphere(triple const& center, double radius, double const& polar, double const& azimuth) override; void addCylinder(triple const& center, double radius, double height, double const& polar, const double& azimuth, bool core) override; void addDisk(triple const& center, double radius, double const& polar, const double& azimuth) override; void addTube(const triple *g, double width, bool core) override; void addTriangles(size_t nP, const triple* P, size_t nN, const triple* N, size_t nC, const prc::RGBAColour* C, size_t nI, const uint32_t (*PI)[3], const uint32_t (*NI)[3], const uint32_t (*CI)[3]) override; void addCurve(triple const& z0, triple const& c0, triple const& c1, triple const& z1) override; void addCurve(triple const& z0, triple const& z1) override; void addPixel(triple const& z0, double width) override; void precision(int digits) override {} protected: #ifdef HAVE_LIBGLM void addvec4(glm::vec4 const& vec); #endif void addCenterIndexMat(); void addIndices(uint32_t const* trip); void addTriples(triple const* triples, size_t n); void addColors(prc::RGBAColour const* col, size_t nc); void addHeaders(); void addCenters(); virtual xdr::oxstream& getXDRFile() = 0; }; class gzv3dfile : public v3dfile { public: gzv3dfile(string const& name, bool singleprecision=false); ~gzv3dfile() override; protected: xdr::oxstream& getXDRFile() override; private: xdr::memoxstream memxdrfile; string name; bool destroyed; void close() override; }; } //namespace camp #endif #endif asymptote-3.05/quick-start-win32.ps10000644000000000000000000000300415031566105016017 0ustar rootroot#!/usr/bin/env pwsh # Windows check if ($PSVersionTable.PSVersion.Major -gt 5) { if (-Not $IsWindows) { Write-Output "This script is only for windows." Break } } # check for vcpkg $vcpkgDefaultLoc = "$env:USERPROFILE/.vcpkg" if (-Not $env:VCPKG_ROOT) { Write-Host "VCPKG_ROOT Not found, checking for $vcpkgDefaultLoc" if (-Not (Test-Path $vcpkgDefaultLoc/vcpkg.exe)) { Write-Host "vcpkg not found; will clone vcpkg" Remove-Item -Force -Recurse $vcpkgDefaultLoc git clone https://github.com/microsoft/vcpkg.git "$vcpkgDefaultLoc" Push-Location "$vcpkgDefaultLoc" & ./bootstrap-vcpkg.bat Pop-Location } else { Write-Host "vcpkg.exe found, will pull to latest" Push-Location "$vcpkgDefaultLoc" git pull --autostash Pop-Location } $env:VCPKG_ROOT = $vcpkgDefaultLoc } else { Write-Host "Using VCPKG_ROOT at $($env:VCPKG_ROOT)" } # check for visual studio $vsInfo = Get-CimInstance MSFT_VSInstance -Namespace root/cimv2/vs if ($vsInfo -eq $null) { Write-Output "Visual Studio not found. Please install visual studio." Break } Write-Output "Using $($vsInfo.Name) at $($vsInfo.InstallLocation)" & "$($vsInfo.InstallLocation)\Common7\Tools\Launch-VsDevShell.ps1" -Arch amd64 -HostArch amd64 -SkipAutomaticLocation cmake --preset msvc/release Write-Output "Configuration done. Please run cmake --build --preset msvc/release --target asy-with-basefiles to build Asymptote." Exit-PSSession asymptote-3.05/array.h0000644000000000000000000000366715031566105013471 0ustar rootroot/***** * array.h * Tom Prince 2005/06/18 * * Array type used by virtual machine. *****/ #ifndef ARRAY_H #define ARRAY_H #include "vm.h" #include "common.h" #include "item.h" namespace vm { extern const char *dereferenceNullArray; // Arrays are vectors with push and pop functions. class array : public mem::vector { bool cycle; void setNonBridgingSlice(size_t l, size_t r, mem::vector *a); void setBridgingSlice(size_t l, size_t r, mem::vector *a); public: array() : cycle(false) {} array(size_t n) : mem::vector(n), cycle(false) {} array(size_t n, item i, size_t depth); void push(item i) { push_back(i); } item pop() { item i=back(); pop_back(); return i; } template T read(size_t i) const { return get((*this)[i]); } array *slice(Int left, Int right); void setSlice(Int left, Int right, array *a); void cyclic(bool b) { cycle=b; } bool cyclic() const { return cycle; } array *copyToDepth(size_t depth); }; template inline T read(const array *a, size_t i) { return a->array::read(i); } template inline T read(const array &a, size_t i) { return a.array::read(i); } inline size_t checkArray(const vm::array *a) { if(a == 0) vm::error(dereferenceNullArray); return a->size(); } inline void checkEqual(size_t i, size_t j) { if(i == j) return; ostringstream buf; buf << "operation attempted on arrays of different lengths: " << i << " != " << j; vm::error(buf); } inline size_t checkArrays(const vm::array *a, const vm::array *b) { size_t asize=checkArray(a); size_t bsize=checkArray(b); checkEqual(asize,bsize); return asize; } // Copies an item to a depth d. If d == 0 then the item is just returned // without copying, otherwise, the array and its subarrays are copied to // depth d. item copyItemToDepth(item i, size_t depth); } // namespace vm #endif // ARRAY_H asymptote-3.05/genv.cc0000644000000000000000000001303615031566105013437 0ustar rootroot/***** * genv.cc * Andy Hammerlindl 2002/08/29 * * This is the global environment for the translation of programs. In * actuality, it is basically a module manager. When a module is * requested, it looks for the corresponding filename, and if found, * parses and translates the file, returning the resultant module. * * genv sets up the basic type bindings and function bindings for * builtin functions, casts and operators, and imports plain (if set), * but all other initialization is done by the local environment defined * in env.h. *****/ /* Implementation of templated modules: * * Translating an access declaration: * * access Map(Key=A, Value=B) as MapAB; * * run encodeLevel for both A and B * this should give the parent records for each struct * encode pushing the *number* of parents on the stack (i.e., push a * single int) * encode pushing the string "Map/1234567" on the stack * encode call to builtin loadTemplatedModule * also save into MapAB (varinit) * * build list of types (or tyEntry?) * * also ensure names match * * ***** * * At runtime, loadTemplatedModule pops the string * * if the module is already loaded, it pops the levels * and returns the already loaded module. * * if the module is not loaded, it leaves the levels on the stack * and calls the initializer for the templated module * * it might be easiest to give the number of pushed params as an argument * to loadTemplatedModule (ints and strings have no push/pop) * * ***** * * Translating a templated module * * we start translating a file with a list of (name, type) pairs * * for each record type, * build variables for each parent level * and encode bytecode to pop the parents off the stack into these vars * * build tyEntry for each templated type * if its a record, then use the above variables as ent->v * * from here, * translate the file as a module as usual * * */ #include #include #include "genv.h" #include "env.h" #include "dec.h" #include "stm.h" #include "types.h" #include "settings.h" #include "runtime.h" #include "asyparser.h" #include "locate.h" #include "interact.h" #include "builtin.h" #if !defined(_WIN32) #include #endif using namespace types; using settings::getSetting; using settings::Setting; namespace trans { genv::genv() : imap() { // Add settings as a module. This is so that the init file ~/.asy/config.asy // can set settings. imap[symbol::literalTrans("settings")]=settings::getSettingsModule(); // Translate plain in advance, if we're using autoplain. if(getSetting("autoplain")) { Setting("autoplain")=false; // Translate plain without autoplain. getModule(symbol::trans("plain"), "plain"); Setting("autoplain")=true; } #ifdef HAVE_LIBGSL imap[symbol::literalTrans("gsl")]=trans::getGSLModule(); #endif } bool endswith(string suffix, string str) { return std::equal(suffix.rbegin(), suffix.rend(), str.rbegin()); } record *genv::loadModule(symbol id, string filename) { // Get the abstract syntax tree. absyntax::file *ast = parser::parseFile(filename,"Loading"); inTranslation.push_front(filename); em.sync(); record *r=ast->transAsFile(*this, id); inTranslation.remove(filename); return r; } record *genv::loadTemplatedModule( symbol id, string filename, mem::vector *args ) { // Get the abstract syntax tree. absyntax::file *ast = parser::parseFile(filename,"Loading"); inTranslation.push_front(filename); em.sync(); record *r=ast->transAsTemplatedFile(*this, id, args); inTranslation.remove(filename); return r; } void genv::checkRecursion(string filename) { if (find(inTranslation.begin(), inTranslation.end(), filename) != inTranslation.end()) { em.sync(); em << "error: recursive loading of module '" << filename << "'\n"; em.sync(true); throw handled_error(); } } record *genv::getModule(symbol id, string filename) { checkRecursion(filename); symbol index=symbol::literalTrans(filename); record *r=imap[index]; if (r) return r; else { r=loadModule(id, filename); // Don't add an erroneous module to the dictionary in interactive mode, as // the user may try to load it again. if (!interact::interactive || !em.errors()) { imap[index]=r; } return r; } } record *genv::getTemplatedModule( string filename, mem::vector* args ) { checkRecursion(filename); types::signature* sig = new types::signature(); stringstream buf; buf << filename << "/"; for (auto arg : *args) { sig->add(formal(arg->t, arg->dest)); buf << arg->dest << "/"; } buf << sig->handle() << "/"; symbol index=symbol::literalTrans(buf.str()); record *r=imap[index]; if (r) return r; else { r=loadTemplatedModule(index, filename, args); // Don't add an erroneous module to the dictionary in interactive mode, as // the user may try to load it again. if (!interact::interactive || !em.errors()) { imap[index]=r; } return r; } } record *genv::getLoadedModule(symbol id) { return imap[id]; } typedef vm::stack::importInitMap importInitMap; importInitMap *genv::getInitMap() { struct initMap : public importInitMap, public gc { genv ≥ initMap(genv &ge) : ge(ge) {} lambda *operator[](string s) { record *r=ge.imap[symbol::literalTrans(s)]; return r ? r->getInit() : 0; } }; return new initMap(*this); } } // namespace trans asymptote-3.05/application.h0000644000000000000000000002160015031566105014641 0ustar rootroot/***** * application.h * Andy Hammerlindl 2005/05/20 * * An application is a matching of arguments in a call expression to formal * parameters of a function. Since the language allows default arguments, * keyword arguments, rest arguments, and anything else we think of, this * is not a simple mapping. *****/ #ifndef APPLICATION_H #define APPLICATION_H #include "common.h" #include "types.h" #include "coenv.h" #include "exp.h" // Defined in runtime.in: namespace run { void pushDefault(vm::stack *Stack); } using absyntax::arglist; using absyntax::varinit; using absyntax::arrayinit; using absyntax::tempExp; // This is mid-way between trans and absyntax. namespace trans { typedef Int score; typedef mem::vector score_vector; // This is used during the translation of arguments to store temporary // expressions for arguments that need to be translated for side-effects at a // certain point but used later on. The invariant maintained is that if the // vector has n elements, then the side-effects for the first n arguments have // been translated. Null is pushed onto the vector to indicate that the // expression was evaluated directly onto the stack, without the use of a // temporary. typedef mem::vector temp_vector; struct arg : public gc { types::ty *t; arg(types::ty *t) : t(t) {} virtual ~arg() {} virtual void trans(coenv &e, temp_vector &) = 0; }; struct varinitArg : public arg { varinit *v; varinitArg(varinit *v, types::ty *t) : arg(t), v(v) {} virtual void trans(coenv &e, temp_vector &) { // Open signatures can match overloaded variables, but there is no way to // translate the result, so report an error. if (t->kind == types::ty_overloaded) { em.error(v->getPos()); em << "overloaded argument in function call"; } else v->transToType(e, t); } }; // Pushes a default argument token on the stack as a placeholder for the // argument. struct defaultArg : public arg { defaultArg(types::ty *t) : arg(t) {} virtual void trans(coenv &e, temp_vector &) { //e.c.encode(inst::builtin, run::pushDefault); e.c.encode(inst::push_default); } }; // Handles translation of all the arguments matched to the rest formal. // NOTE: This code duplicates a lot of arrayinit. struct restArg : public gc { mem::list inits; arg *rest; public: restArg() : rest(0) {} virtual ~restArg() {} // Encodes the instructions to make an array from size elements on the stack. static void transMaker(coenv &e, Int size, bool rest); void trans(coenv &e, temp_vector &temps); void add(arg *init) { inits.push_back(init); } void addRest(arg *init) { rest=init; } }; // This class generates sequenced args, args whose side-effects occur in order // according to their index, regardless of the order they are called. This is // used to ensure left-to-right order of evaluation of keyword arguments, even // if they are given out of the order specified in the declaration. class sequencer { struct sequencedArg : public varinitArg { sequencer &parent; size_t i; sequencedArg(varinit *v, types::ty *t, sequencer &parent, size_t i) : varinitArg(v, t), parent(parent), i(i) {} void trans(coenv &e, temp_vector &temps) { parent.trans(e, i, temps); } }; typedef mem::vector sa_vector; sa_vector args; // Makes a temporary for the next argument in the sequence. void alias(coenv &e, temp_vector &temps) { size_t n=temps.size(); assert(n < args.size()); sequencedArg *sa=args[n]; assert(sa); temps.push_back(new tempExp(e, sa->v, sa->t)); } // Get in a state to translate the i-th argument, aliasing any arguments that // occur before it in the sequence. void advance(coenv &e, size_t i, temp_vector &temps) { while (temps.size() < i) alias(e,temps); } void trans(coenv &e, size_t i, temp_vector &temps) { if (i < temps.size()) { // Already translated, use the alias. assert(temps[i]); temps[i]->trans(e); } else { // Alias earlier args if necessary. advance(e, i, temps); // Translate using the base method. args[i]->varinitArg::trans(e,temps); // Push null to indicate the argument has been translated. temps.push_back(0); } } public: arg *addArg(varinit *v, types::ty *t, size_t i) { if (args.size() <= i) args.resize(i+1); return args[i]=new sequencedArg(v, t, *this, i); } }; class application : public gc { types::signature *sig; types::function *t; // Sequencer to ensure given arguments are evaluated in the proper order. // Use of this sequencer means that transArgs can only be called once. sequencer seq; typedef mem::vector arg_vector; arg_vector args; restArg *rest; // Target formal to match with arguments to be packed into the rest array. types::formal rf; // During the matching of arguments to an application, this stores the index // of the first unmatched formal. size_t index; // To resolve which is the best application in case of multiple matches of // overloaded functions, a score is kept for every source argument matched, // and an application with higher-scoring matches is chosen. score_vector scores; void initRest(); application(types::signature *sig) : sig(sig), t(0), args(sig->formals.size()), rest(0), rf(0), index(0) { assert(sig); initRest(); } application(types::function *t) : sig(t->getSignature()), t(t), args(sig->formals.size()), rest(0), rf(0), index(0) { assert(sig); initRest(); } types::formal &getTarget() { return sig->getFormal(index); } // Move the index forward one, then keep going until we're at an unmatched // argument. void advanceIndex() { do { ++index; } while (index < args.size() && args[index]!=0); } // Finds the first unmatched formal of the given name, returning the index. // The rest formal is not tested. This function returns FAIL if no formals // match. Int find(symbol name); // Match the formal at index to its default argument (if it has one). bool matchDefault(); // Match the argument to the formal indexed by spot. bool matchAtSpot(size_t spot, env &e, types::formal &source, varinit *a, size_t evalIndex); // Match the argument to be packed into the rest array, if possible. bool matchArgumentToRest(env &e, types::formal& source, varinit *a, size_t evalIndex); // Matches the argument to a formal in the target signature (possibly causing // other formals in the target to be matched to default values), and updates // the matchpoint accordingly. bool matchArgument(env &e, types::formal& source, varinit *a, size_t evalIndex); // Match an argument bound to a name, as in f(index=7). bool matchNamedArgument(env &e, types::formal& source, varinit *a, size_t evalIndex); // After all source formals have been matched, checks if the match is // complete (filling in final default values if necessary). bool complete(); // Match a rest argument in the calling expression. bool matchRest(env &e, types::formal& f, varinit *a, size_t evalIndex); // Match the argument represented in signature to the target signature. On // success, all of the arguments in args will be properly set up. bool matchSignature(env &e, types::signature *source, arglist &al); // Match a signature which is open, meaning that any sequence of arguments is // matched. bool matchOpen(env &e, signature *source, arglist &al); friend class maximizer; public: // Attempt to build an application given the target signature and the source // signature (representing the given arguments). Return 0 if they cannot be // matched. static application *match(env &e, types::function *t, types::signature *source, arglist &al); // Translate the arguments so they appear in order on the stack in // preparation for a call. void transArgs(coenv &e); types::function *getType() { return t; } // This returns true in the special case that the arguments matched without // casting or packing into the rest formal. bool exact(); // The next best thing (score-wise) to an exact match. This returns true if // there are two arguments, one of which is cast and one is matched exactly // and neither are packed into the rest argument. bool halfExact(); }; typedef mem::list app_list; // Given an overloaded list of types, determines which type to call. If none // are applicable, returns an empty vector, if there is ambiguity, several will // be returned. app_list multimatch(env &e, types::overloaded *o, types::signature *source, arglist &al); } // namespace trans #endif asymptote-3.05/bbox.h0000644000000000000000000001064215031566105013274 0ustar rootroot/***** * bbox.h * Andy Hammerlindl 2002/06/06 * * Stores a rectangle that encloses a drawing object. *****/ #ifndef BBOX_H #define BBOX_H #include "pair.h" #include "settings.h" namespace camp { template inline T min(T a, T b) { return (a < b) ? a : b; } template inline T max(T a, T b) { return (a > b) ? a : b; } // The box that encloses a path struct bbox { bool empty; double left; double bottom; double right; double top; // Start bbox about the origin bbox() : empty(true), left(0.0), bottom(0.0), right(0.0), top(0.0) { } bbox(double left, double bottom, double right, double top) : empty(false), left(left), bottom(bottom), right(right), top(top) { } // Start a bbox with a point bbox(const pair& z) : empty(false), left(z.getx()), bottom(z.gety()), right(z.getx()), top(z.gety()) { } bool nonempty() const { return !empty; } // Add a point to a bbox bbox add(const pair& z) { double x = z.getx(), y = z.gety(); if (empty) { left = right = x; top = bottom = y; empty = false; } else { if (x < left) left = x; else if (x > right) right = x; if (y < bottom) bottom = y; else if (y > top) top = y; } return *this; } // Add a point to a nonempty bbox void addnonempty(const pair& z) { double x = z.getx(), y = z.gety(); if (x < left) left = x; else if (x > right) right = x; if (y < bottom) bottom = y; else if (y > top) top = y; } // Add a point to a nonempty bbox, updating bounding times void addnonempty(const pair& z, bbox& times, double t) { double x = z.getx(), y = z.gety(); if (x < left) { left = x; times.left = t; } else if (x > right) { right = x; times.right = t; } if (y < bottom) { bottom = y; times.bottom = t; } else if (y > top) { top = y; times.top = t; } } bbox operator+= (const pair& z) { add(z); return *this; } bbox operator*= (double x) { left *= x; right *= x; top *= x; bottom *=x; return *this; } // Add two bounding boxes friend bbox operator+ (const bbox& b1, const bbox& b2) { if (b1.empty) return b2; else if (b2.empty) return b1; else return bbox(min(b1.left, b2.left), max(b1.right, b2.right), min(b1.bottom, b2.bottom), max(b1.top, b2.top)); } // Add one bounding box to another void add(const bbox& b) { if (this->empty) *this = b; else if (!b.empty) { left = min(left, b.left); right = max(right, b.right); bottom = min(bottom, b.bottom); top = max(top, b.top); } } bbox operator+= (const bbox& b) { add(b); return *this; } void clip(const bbox& b) { if(this->empty) return; left = max(left, b.left); right = min(right, b.right); bottom = max(bottom, b.bottom); top = min(top, b.top); if(left > right || bottom > top) *this=bbox(); } bbox shift(const pair& p) const { bbox b=*this; b.left += p.getx(); b.right += p.getx(); b.bottom += p.gety(); b.top += p.gety(); return b; } pair Min() const { return pair(left,bottom); } pair Max() const { return pair(right,top); } double diameter() { return (Max()-Min()).length(); } bbox LowRes() const { return bbox(floor(left),floor(bottom),ceil(right),ceil(top)); } friend ostream& operator<< (ostream& out, const bbox& b) { out << b.left << " " << b.bottom << " " << b.right << " " << b.top; return out; } }; // Add results of both bounding boxes, say for a path and a pen. inline bbox pad(bbox b1, bbox b2) { if (b1.empty) return b2; else if (b2.empty) return b1; else { bbox b; b.empty = false; b.left = b1.left + b2.left; b.right = b1.right + b2.right; b.top = b1.top + b2.top; b.bottom = b1.bottom + b2.bottom; return b; } } inline bbox svgbbox(const bbox& B, pair shift=pair(0,0)) { bbox b=B; double height=b.top-b.bottom; double threshold=12.0*settings::tex2ps; if(height < threshold) { double offset=threshold-height; b.top += offset; b.bottom += offset; } return b.shift(pair(1.99*settings::cm,1.9*settings::cm)+shift); } } // namespace camp GC_DECLARE_PTRFREE(camp::bbox); #endif asymptote-3.05/runfile.in0000644000000000000000000001464715031566105014176 0ustar rootroot/***** * runfile.in * * Runtime functions for file operations. * *****/ file* => primFile() #include "fileio.h" #include "callable.h" #include "triple.h" #include "array.h" #include "seconds.h" #if defined(_WIN32) #include #else #include #endif using namespace camp; using namespace settings; using namespace vm; string commentchar="#"; // Autogenerated routines: bool ==(file *a, file *b) { return a == b; } bool !=(file *a, file *b) { return a != b; } file* :nullFile() { return &camp::nullfile; } file* input(string name=emptystring, bool check=true, string comment=commentchar, string mode=emptystring) { file *f=NULL; if(mode == "binary") f=new ibfile(name,check); else if(mode == "xdr" || mode == "xdrgz") { #ifdef HAVE_LIBTIRPC if(mode == "xdr") f=new ixfile(name,check); else if(mode == "xdrgz") f=new igzxfile(name,check); #else ostringstream buf; buf << name << ": XDR read support not enabled"; error(buf); #endif } else if(mode == "") { char c=comment.empty() ? (char) 0 : comment[0]; f=new camp::ifile(name,c,check); } else { f=NULL; ostringstream buf; buf << name << ": invalid file mode '" << mode << "'"; error(buf); } f->open(); return f; } file* output(string name=emptystring, bool update=false, string comment=commentchar, string mode=emptystring) { file *f=NULL; if(mode == "pipe") { f=new opipe(name); } else if(mode == "binary") { if(update) f=new iobfile(name); else f=new obfile(name); } else if(mode == "xdr") { #ifdef HAVE_LIBTIRPC if(update) f=new ioxfile(name); else f=new oxfile(name); #else ostringstream buf; buf << name << ": XDR write support not enabled"; error(buf); #endif } else if(mode == "") { if(update) { char c=comment.empty() ? (char) 0 : comment[0]; f=new iofile(name,c); } else f=new ofile(name); } else { f=NULL; ostringstream buf; buf << name << ": invalid file mode '" << mode << "'"; error(buf); } f->open(); if(update) f->seek(0,false); return f; } bool eof(file *f) { return f->eof(); } bool eol(file *f) { return f->eol(); } bool error(file *f) { return f->error(); } void clear(file *f) { f->clear(); } void close(file *f) { f->close(); } Int precision(file *f=NULL, Int digits=0) { if(f == 0) f=&camp::Stdout; return f->precision(digits); } void flush(file *f) { f->flush(); } string getc(file *f) { char c=0; if(f->isOpen()) f->read(c); return string(1,c); } Int tell(file *f) { return f->tell(); } void seek(file *f, Int pos) { f->seek(pos,pos >= 0); } void seekeof(file *f) { f->seek(0,false); } string :namePart(file f) { return f.filename(); } string :modePart(file f) { return f.FileMode(); } // Set file dimensions file* :dimensionSetHelper(Int nx=-1, Int ny=-1, Int nz=-1, file *f) { f->dimension(nx,ny,nz); return f; } callable* :dimensionSet(file *f) { return new thunk(new bfunc(dimensionSetHelper),f); } array * :dimensionPart(file f) { array *a=new array(3); (*a)[0]=f.Nx(); (*a)[1]=f.Ny(); (*a)[2]=f.Nz(); return a; } // Set file f to read arrays in line-at-a-time mode file* :lineSetHelper(bool b=true, file *f) { f->LineMode(b); return f; } callable* :lineSet(file *f) { return new thunk(new bfunc(lineSetHelper),f); } bool :linePart(file f) { return f.LineMode(); } // Set file to read comma-separated values file* :csvSetHelper(bool b=true, file *f) { f->CSVMode(b); return f; } callable* :csvSet(file *f) { return new thunk(new bfunc(csvSetHelper),f); } bool :csvPart(file f) { return f.CSVMode(); } // Set file to read whitespace-separated values file* :wordSetHelper(bool b=true, file *f) { f->WordMode(b); return f; } callable* :wordSet(file *f) { return new thunk(new bfunc(wordSetHelper),f); } bool :wordPart(file f) { return f.WordMode(); } // Set file to read/write single precision real XDR values. file* :singlerealSetHelper(bool b=true, file *f) { f->SingleReal(b); return f; } callable* :singlerealSet(file *f) { return new thunk(new bfunc(singlerealSetHelper),f); } bool :singlerealPart(file f) { return f.SingleReal(); } // Set file to read/write single precision int XDR values. file* :singleintSetHelper(bool b=true, file *f) { f->SingleInt(b); return f; } callable* :singleintSet(file *f) { return new thunk(new bfunc(singleintSetHelper),f); } bool :singleintPart(file f) { return f.SingleInt(); } // Set file to read/write signed int XDR values. file* :signedintSetHelper(bool b=true, file *f) { f->SignedInt(b); return f; } callable* :signedintSet(file *f) { return new thunk(new bfunc(signedintSetHelper),f); } bool :signedintPart(file f) { return f.SignedInt(); } // Set file to read an arrayi (i int sizes followed by an i-dimensional array) file* :readSetHelper(Int i, file *f) { switch(i) { case 1: f->dimension(-2); break; case 2: f->dimension(-2,-2); break; case 3: f->dimension(-2,-2,-2); break; default: f->dimension(); } return f; } callable* :readSet(file *f) { return new thunk(new bfunc(readSetHelper),f); } // Delete file named s. Int delete(string s) { s=outpath(s); Int rc=unlink(s.c_str()); if(rc == 0 && verbose > 0) cout << "Deleted " << s << endl; return rc; } // Rename file "from" to file "to". Int rename(string from, string to) { from=outpath(from); to=outpath(to); Int rc=renameOverwrite(from.c_str(),to.c_str()); if(rc == 0 && verbose > 0) cout << "Renamed " << from << " to " << to << endl; return rc; } // Create a uniquely named temporary file. string mktemp(string s) { string baseTemplate=s+"XXXXXX"; char *S=StrdupMalloc(baseTemplate); bool success=true; #if defined(_WIN32) if (_mktemp_s(S,baseTemplate.length()+1) != 0) { success = false; } FILE* fp; if (success && (fopen_s(&fp,S,"w") != 0)) { success = false; } #else int fd=mkstemp(S); if (fd < 0) { success = false; } #endif if(!success) { ostringstream buf; buf << "Could not create unique temporary filename based on " << s; error(buf); } string T(S); free(S); #if defined(_WIN32) bool closeSuccess = fclose(fp) == 0; #else bool closeSuccess = close(fd) == 0; #endif if (!closeSuccess) { ostringstream buf; buf << "Could not finalize temporary file based on " << s; error(buf); } return T; } asymptote-3.05/xstream.h0000644000000000000000000001321515031566105014024 0ustar rootroot/* C++ interface to the XDR External Data Representation I/O routines Version 1.47 Copyright (C) 1999-2025 John C. Bowman and Supakorn "Jamie" Rassameemasmuang This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #pragma once #include #include #include #include #if defined(_WIN32) #include #include "win32xdr.h" typedef __int64 OffsetType; #define fseeko _fseeki64 #define ftello _ftelli64 #else #ifndef _ALL_SOURCE #define _ALL_SOURCE 1 #endif #include #include #include #include #include typedef off_t OffsetType; #ifdef __APPLE__ #include inline bool_t xdr_long(XDR* __xdrs, long* __lp) { return xdr_longlong_t(__xdrs, (long long*)__lp); } inline bool_t xdr_u_long(XDR* __xdrs, unsigned long* __lp) { return xdr_u_longlong_t(__xdrs, (unsigned long long*) __lp); } #endif #if defined(__FreeBSD__) #include extern "C" int fseeko(FILE*, OffsetType, int); extern "C" OffsetType ftello(FILE*); extern "C" FILE * open_memstream(char**, size_t*); #endif #ifdef _POSIX_SOURCE #undef _POSIX_SOURCE #include #define _POSIX_SOURCE #else #include #endif #endif namespace xdr { class xbyte { unsigned char c; public: xbyte(); xbyte(unsigned char c0); xbyte(int c0); xbyte(unsigned int c0); int byte() const; operator unsigned char () const; }; class xios { public: enum io_state {goodbit=0, eofbit=1, failbit=2, badbit=4}; enum open_mode {in=1, out=2, app=8, trunc=16}; enum seekdir {beg=SEEK_SET, cur=SEEK_CUR, end=SEEK_END}; private: int _state; public: int good() const; int eof() const; int fail() const; int bad() const; void clear(int state = 0); void set(int flag); operator void*() const; int operator!() const; }; class xstream : public xios { protected: FILE *buf; public: virtual ~xstream(); xstream(); void precision(int); xstream& seek(OffsetType pos, seekdir dir=beg); OffsetType tell(); }; #define IXSTREAM(T,N) ixstream& operator >> (T& x) \ {if(!xdr_##N(&xdri, &x)) set(eofbit); return *this;} #define OXSTREAM(T,N) oxstream& operator << (T x) \ {if(!xdr_##N(&xdro, &x)) set(badbit); return *this;} class ixstream : virtual public xstream { private: bool singleprecision; protected: XDR xdri; public: ixstream(bool singleprecision=false); virtual void open(const char *filename, open_mode=in); virtual void close(); void closeFile(); ixstream(const char *filename, bool singleprecision=false); ixstream(const char *filename, open_mode mode, bool singleprecision=false); virtual ~ixstream(); typedef ixstream& (*imanip)(ixstream&); ixstream& operator >> (imanip func); IXSTREAM(int16_t,int16_t); IXSTREAM(uint16_t,u_int16_t); IXSTREAM(int32_t,int32_t); IXSTREAM(uint32_t,u_int32_t); IXSTREAM(int64_t,int64_t); IXSTREAM(uint64_t,u_int64_t); #ifdef __APPLE__ IXSTREAM(long,long); IXSTREAM(unsigned long,u_long); #endif IXSTREAM(char,char); #ifndef _CRAY IXSTREAM(unsigned char,u_char); #endif IXSTREAM(float,float); ixstream& operator >> (double& x); ixstream& operator >> (xbyte& x); }; class oxstream : virtual public xstream { private: bool singleprecision; protected: XDR xdro; public: oxstream(bool singleprecision=false); virtual void open(const char *filename, open_mode mode=trunc); virtual void close(); void closefile(); oxstream(const char *filename, bool singleprecision=false); oxstream(const char *filename, open_mode mode, bool singleprecision=false); virtual ~oxstream(); oxstream& flush(); typedef oxstream& (*omanip)(oxstream&); oxstream& operator << (omanip func); OXSTREAM(int16_t,int16_t); OXSTREAM(uint16_t,u_int16_t); OXSTREAM(int32_t,int32_t); OXSTREAM(uint32_t,u_int32_t); OXSTREAM(int64_t,int64_t); OXSTREAM(uint64_t,u_int64_t); #ifdef __APPLE__ OXSTREAM(long,long); OXSTREAM(unsigned long,u_long); #endif OXSTREAM(char,char); #ifndef _CRAY OXSTREAM(unsigned char,u_char); #endif OXSTREAM(float,float); oxstream& operator << (double x); oxstream& operator << (xbyte x); }; class memoxstream : public oxstream { private: #if defined(_WIN32) fmem fmInstance; #else char* buffer=nullptr; size_t size=0; #endif public: memoxstream(bool singleprecision=false); ~memoxstream() override; std::vector createCopyOfCurrentData(); }; class memixstream: public ixstream { public: memixstream(char* data, size_t length, bool singleprecision=false); explicit memixstream(std::vector& data, bool singleprecision=false); ~memixstream() override; void close() override; void open(const char *filename, open_mode = in) override; }; class ioxstream : public ixstream, public oxstream { public: void open(const char *filename, open_mode mode=out) override; void close() override; ioxstream(); ioxstream(const char *filename); ioxstream(const char *filename, open_mode mode); ~ioxstream() override; }; oxstream& endl(oxstream& s); oxstream& flush(oxstream& s); } asymptote-3.05/simpson.cc0000644000000000000000000001475215031566105014176 0ustar rootroot#include #include #include // Compute a numerical approximation to an integral via adaptive Simpson's Rule // This routine ignores underflow. const int nest=DBL_MANT_DIG; typedef struct { bool left; // left interval? double psum, f1t, f2t, f3t, dat, estr; } TABLE; bool // Returns true iff successful. simpson(double& integral, // Approximate value of the integral. double (*f)(double), // Pointer to function to be integrated. double a, double b, // Lower, upper limits of integration. double acc, // Desired relative accuracy of integral. // Try to make |error| <= acc*abs(integral). double dxmax) // Maximum limit on the width of a subinterval // For periodic functions, dxmax should be // set to the period or smaller to prevent // premature convergence of Simpson's rule. { double diff,area,estl,estr,alpha,da,dx,wt,est,fv[5]; TABLE table[nest],*p,*pstop; static const double sixth=1.0/6.0; bool success=true; p=table; pstop=table+nest-1; p->left=true; p->psum=0.0; alpha=a; da=b-a; fv[0]=(*f)(alpha); fv[2]=(*f)(alpha+0.5*da); fv[4]=(*f)(alpha+da); wt=sixth*da; est=wt*(fv[0]+4.0*fv[2]+fv[4]); area=est; // Have estimate est of integral on (alpha, alpha+da). // Bisect and compute estimates on left and right half intervals. // integral is the best value for the integral. for(;;) { dx=0.5*da; double arg=alpha+0.5*dx; fv[1]=(*f)(arg); fv[3]=(*f)(arg+dx); wt=sixth*dx; estl=wt*(fv[0]+4.0*fv[1]+fv[2]); estr=wt*(fv[2]+4.0*fv[3]+fv[4]); integral=estl+estr; diff=est-integral; area -= diff; if(p >= pstop) success=false; if(!success || (fabs(diff) <= acc*fabs(area) && da <= dxmax)) { // Accept approximate integral. // If it was a right interval, add results to finish at this level. // If it was a left interval, process right interval. for(;;) { if(p->left == false) { // process right-half interval alpha += da; p->left=true; p->psum=integral; fv[0]=p->f1t; fv[2]=p->f2t; fv[4]=p->f3t; da=p->dat; est=p->estr; break; } integral += p->psum; if(--p <= table) return success; } } else { // Raise level and store information for processing right-half interval. ++p; da=dx; est=estl; p->left=false; p->f1t=fv[2]; p->f2t=fv[3]; p->f3t=fv[4]; p->dat=dx; p->estr=estr; fv[4]=fv[2]; fv[2]=fv[1]; } } } // Use adaptive Simpson integration to determine the upper limit of // integration required to make the definite integral of a continuous // non-negative function close to a user specified sum. // This routine ignores underflow. bool // Returns true iff successful. unsimpson(double integral, // Given value for the integral. double (*f)(double), // Pointer to function to be integrated. double a, double& b, // Lower, upper limits of integration (a <= b). // The value of b provided on entry is used // as an initial guess; somewhat faster if the // given value is an underestimation. double acc, // Desired relative accuracy of b. // Try to make |integral-area| <= acc*integral. double& area, // Computed integral of f(x) on [a,b]. double dxmax, // Maximum limit on the width of a subinterval // For periodic functions, dxmax should be // set to the period or smaller to prevent // premature convergence of Simpson's rule. double dxmin=0) // Lower limit on sampling width. { double diff,estl,estr,alpha,da,dx,wt,est,fv[5]; double sum,parea,pdiff,b2; TABLE table[nest],*p,*pstop; static const double sixth=1.0/6.0; p=table; pstop=table+nest-1; p->psum=0.0; alpha=a; parea=0.0; pdiff=0.0; for(;;) { p->left=true; da=b-alpha; fv[0]=(*f)(alpha); fv[2]=(*f)(alpha+0.5*da); fv[4]=(*f)(alpha+da); wt=sixth*da; est=wt*(fv[0]+4.0*fv[2]+fv[4]); area=est; // Have estimate est of integral on (alpha, alpha+da). // Bisect and compute estimates on left and right half intervals. // Sum is better value for integral. bool cont=true; while(cont) { dx=0.5*da; double arg=alpha+0.5*dx; fv[1]=(*f)(arg); fv[3]=(*f)(arg+dx); wt=sixth*dx; estl=wt*(fv[0]+4.0*fv[1]+fv[2]); estr=wt*(fv[2]+4.0*fv[3]+fv[4]); sum=estl+estr; diff=est-sum; assert(sum >= 0.0); area=parea+sum; b2=alpha+da; if(fabs(fabs(integral-area)-fabs(pdiff))+fabs(diff) <= fv[4]*acc*(b2-a)){ b=b2; return true; } if(fabs(integral-area) > fabs(pdiff+diff)) { if(integral <= area) { p=table; p->left=true; p->psum=parea; } else { if((fabs(diff) <= fv[4]*acc*da || dx <= dxmin) && da <= dxmax) { // Accept approximate integral sum. // If it was a right interval, add results to finish at this level. // If it was a left interval, process right interval. pdiff += diff; for(;;) { if(p->left == false) { // process right-half interval parea += sum; alpha += da; p->left=true; p->psum=sum; fv[0]=p->f1t; fv[2]=p->f2t; fv[4]=p->f3t; da=p->dat; est=p->estr; break; } sum += p->psum; parea -= p->psum; if(--p <= table) { p=table; p->psum=parea=sum; alpha += da; b += b-a; cont=false; break; } } continue; } } } if(p >= pstop) return false; // Raise level and store information for processing right-half interval. ++p; da=dx; est=estl; p->psum=0.0; p->left=false; p->f1t=fv[2]; p->f2t=fv[3]; p->f3t=fv[4]; p->dat=dx; p->estr=estr; fv[4]=fv[2]; fv[2]=fv[1]; } } } asymptote-3.05/modifier.h0000644000000000000000000000163415031566105014141 0ustar rootroot/***** * modifier.h * Andy Hammerlindl 2002/08/29 * * Permissions for variables. * PUBLIC means the variable can be read or written anywhere. * RESTRICTED means it can be read anywhere, but written only in the record. * PRIVATE means it can only be accessed in the record. * * The modifiers static declares that variable to be allocated, are allocated in * the parent's frame, and code is translated into the parent's frame. *****/ #ifndef MODIFIER_H #define MODIFIER_H namespace trans { // Permission tokens defined in camp.y for accessing a variable outside of // its lexically enclosing record. enum permission { RESTRICTED, PUBLIC, PRIVATE }; const permission DEFAULT_PERM=PUBLIC; enum modifier { DEFAULT_STATIC, DEFAULT_DYNAMIC, EXPLICIT_STATIC, EXPLICIT_DYNAMIC, AUTOUNRAVEL, }; } // namespace trans GC_DECLARE_PTRFREE(trans::permission); GC_DECLARE_PTRFREE(trans::modifier); #endif asymptote-3.05/exp.cc0000644000000000000000000010306515031566105013276 0ustar rootroot/***** * exp.cc * andy hammerlindl 2002/8/19 * * represents the abstract syntax tree for the expressions in the * language. this is translated into virtual machine code using trans() * and with the aid of the environment class. *****/ #include "exp.h" #include "errormsg.h" #include "runtime.h" #include "runmath.h" #include "runpicture.h" #include "runarray.h" #include "runpair.h" #include "runtriple.h" #include "runpath.h" #include "coenv.h" #include "application.h" #include "dec.h" #include "stm.h" #include "inst.h" #include "opsymbols.h" #include "asyprocess.h" //void runCode(absyntax::block *code); namespace absyntax { using namespace types; using namespace trans; using vm::inst; using mem::vector; using mem::stdString; using vm::getPos; #if 0 void exp::prettyprint(ostream &out, Int indent) { prettyname(out, "exp",indent, getPos()); } #endif void exp::transAsType(coenv &e, types::ty *target) { trans(e); // types::ty *t=trans(e); // assert(t->kind==ty_error || equivalent(t,target)); } void exp::transToType(coenv &e, types::ty *target) { types::ty *ct=cgetType(e); if (equivalent(target, ct)) { transAsType(e, target); return; } // See if the cast can be handled by the fastLookupCast method, which does // less memory allocation. if (ct->kind != ty_overloaded && ct->kind != ty_error && target->kind != ty_error) { access *a = e.e.fastLookupCast(target, ct); if (a) { transAsType(e, ct); a->encode(trans::CALL, getPos(), e.c); return; } } types::ty *source = e.e.castSource(target, ct, symbol::castsym); if (source==0) { if (target->kind != ty_error) { types::ty *sources=cgetType(e); em.error(getPos()); em << "cannot cast "; if (sources->kind==ty_overloaded) em << "expression"; else em << "'" << *sources << "'"; em << " to '" << *target << "'"; } } else if (source->kind==ty_overloaded) { if (target->kind != ty_error) { em.error(getPos()); em << "expression is ambiguous in cast to '" << *target << "'"; } } else { transAsType(e, source); e.implicitCast(getPos(), target, source); } } void exp::testCachedType(coenv &e) { if (ct != 0) { types::ty *t = getType(e); if (!equivalent(t, ct)) { em.compiler(getPos()); em << "cached type '" << *ct << "' doesn't match actual type '" << *t << "'"; em.sync(true); } } } void exp::transCall(coenv &e, types::ty *target) { transAsType(e, target); e.c.encode(inst::popcall); } void exp::transConditionalJump(coenv &e, bool cond, label dest) { transToType(e, primBoolean()); e.c.useLabel(cond ? inst::cjmp : inst::njmp, dest); } exp *exp::evaluate(coenv &e, types::ty *target) { return new tempExp(e, this, target); } tempExp::tempExp(coenv &e, varinit *v, types::ty *t) : exp(v->getPos()), a(e.c.allocLocal()), t(t) { v->transToType(e, t); a->encode(WRITE, getPos(), e.c); e.c.encodePop(); } void tempExp::prettyprint(ostream &out, Int indent) { prettyname(out, "tempExp", indent, getPos()); } types::ty *tempExp::trans(coenv &e) { a->encode(READ, getPos(), e.c); return t; } varEntryExp::varEntryExp(position pos, types::ty *t, access *a) : exp(pos), v(new trans::varEntry(t, a, 0, nullPos)) {} varEntryExp::varEntryExp(position pos, types::ty *t, vm::bltin f) : exp(pos), v(new trans::varEntry(t, new bltinAccess(f), 0, nullPos)) {} void varEntryExp::prettyprint(ostream &out, Int indent) { prettyname(out, "varEntryExp", indent, getPos()); } types::ty *varEntryExp::getType(coenv &) { return v->getType(); } types::ty *varEntryExp::trans(coenv &e) { v->encode(READ, getPos(), e.c); return getType(e); } trans::varEntry *varEntryExp::getCallee(coenv &e, types::signature *sig) { return equivalent(sig, v->getType()->getSignature()) ? v : 0; } void varEntryExp::transAct(action act, coenv &e, types::ty *target) { assert(equivalent(getType(e),target)); v->encode(act, getPos(), e.c); } void varEntryExp::transAsType(coenv &e, types::ty *target) { transAct(READ, e, target); } void varEntryExp::transWrite(coenv &e, types::ty *target, exp *value) { value->transToType(e, target); transAct(WRITE, e, target); } void varEntryExp::transCall(coenv &e, types::ty *target) { transAct(trans::CALL, e, target); } void nameExp::prettyprint(ostream &out, Int indent) { prettyname(out, "nameExp",indent, getPos()); value->prettyprint(out, indent+1); } void fieldExp::pseudoName::prettyprint(ostream &out, Int indent) { // This should never be called. prettyindent(out, indent); out << "pseudoName" << "\n"; object->prettyprint(out, indent+1); } void fieldExp::prettyprint(ostream &out, Int indent) { prettyindent(out, indent); out << "fieldExp '" << field << "'\n"; object->prettyprint(out, indent+1); } types::ty *fieldExp::getObject(coenv& e) { types::ty *t = object->cgetType(e); if (t->kind == ty_overloaded) { t=((overloaded *)t)->signatureless(); if(!t) return primError(); } return t; } array *arrayExp::getArrayType(coenv &e) { types::ty *a = set->cgetType(e); if (a->kind == ty_overloaded) { a = ((overloaded *)a)->signatureless(); if (!a) return 0; } switch (a->kind) { case ty_array: return (array *)a; case ty_error: return 0; default: return 0; } } array *arrayExp::transArray(coenv &e) { types::ty *a = set->cgetType(e); if (a->kind == ty_overloaded) { a = ((overloaded *)a)->signatureless(); if (!a) { em.error(set->getPos()); em << "expression is not an array"; return 0; } } set->transAsType(e, a); switch (a->kind) { case ty_array: return (array *)a; case ty_error: return 0; default: em.error(set->getPos()); em << "expression is not an array"; return 0; } } // Checks if the expression can be translated as an array. bool isAnArray(coenv &e, exp *x) { types::ty *t=x->cgetType(e); if (t->kind == ty_overloaded) t=dynamic_cast(t)->signatureless(); return t && t->kind==ty_array; } void subscriptExp::prettyprint(ostream &out, Int indent) { prettyindent(out, indent); out << "subscriptExp\n"; set->prettyprint(out, indent+1); index->prettyprint(out, indent+1); } types::ty *subscriptExp::trans(coenv &e) { array *a = transArray(e); if (!a) return primError(); if (isAnArray(e, index)) { index->transToType(e, types::IntArray()); e.c.encode(inst::builtin, run::arrayIntArray); return getArrayType(e); } else { index->transToType(e, types::primInt()); e.c.encode(inst::builtin, a->celltype->kind==ty_array ? run::arrayArrayRead : run::arrayRead); return a->celltype; } } types::ty *subscriptExp::getType(coenv &e) { array *a = getArrayType(e); return a ? (isAnArray(e, index) ? a : a->celltype) : primError(); } void subscriptExp::transWrite(coenv &e, types::ty *t, exp *value) { // Put array, index, and value on the stack in that order, then call // arrayWrite. array *a = transArray(e); if (!a) return; if (!equivalent(a->celltype, t)) { em.error(getPos()); em << "array expression cannot be used as an address"; // Translate the value for errors. value->transToType(e, t); return; } index->transToType(e, types::primInt()); value->transToType(e, t); e.c.encode(inst::builtin, run::arrayWrite); } void slice::prettyprint(ostream &out, Int indent) { prettyname(out, "slice", indent, getPos()); if (left) left->prettyprint(out, indent+1); else prettyname(out, "left omitted", indent+1, getPos()); if (right) right->prettyprint(out, indent+1); else prettyname(out, "right omitted", indent+1, getPos()); } void slice::trans(coenv &e) { if (left) left->transToType(e, types::primInt()); else // If the left index is omitted it can be assumed to be zero. e.c.encode(inst::intpush, (Int)0); if (right) right->transToType(e, types::primInt()); } void sliceExp::prettyprint(ostream &out, Int indent) { prettyname(out, "sliceExp", indent, getPos()); set->prettyprint(out, indent+1); index->prettyprint(out, indent+1); } types::ty *sliceExp::trans(coenv &e) { array *a = transArray(e); if (!a) return primError(); index->trans(e); e.c.encode(inst::builtin, index->getRight() ? run::arraySliceRead : run::arraySliceReadToEnd); return a; } types::ty *sliceExp::getType(coenv &e) { array *a = getArrayType(e); return a ? a : primError(); } void sliceExp::transWrite(coenv &e, types::ty *t, exp *value) { array *a = transArray(e); if (!a) return; assert(equivalent(a, t)); index->trans(e); value->transToType(e, t); e.c.encode(inst::builtin, index->getRight() ? run::arraySliceWrite : run::arraySliceWriteToEnd); } void thisExp::prettyprint(ostream &out, Int indent) { prettyname(out, "thisExp", indent, getPos()); } types::ty *thisExp::trans(coenv &e) { if (!e.c.encodeThis()) { em.error(getPos()); em << "static use of 'this' expression"; } return cgetType(e); } types::ty *thisExp::getType(coenv &e) { return e.c.thisType(); } void equalityExp::prettyprint(ostream &out, Int indent) { prettyname(out, "equalityExp", indent, getPos()); callExp::prettyprint(out, indent+1); } types::ty *equalityExp::getType(coenv &e) { // Try to the resolve the expression as a function call first. types::ty *t = callExp::getType(e); assert(t); if (t->kind != ty_error) return t; else // Either an error or handled by the function equality methods. In the // first case, we may return whatever we like, and the second case always // returns bool. In either case, it is safe to return bool. return primBoolean(); } // From a possibly overloaded type, if there is a unique function type, return // it, otherwise 0. types::ty *uniqueFunction(types::ty *t) { if (t->kind == types::ty_function) return t; if (t->isOverloaded()) { types::ty *ft = 0; for (ty_iterator i = t->begin(); i != t->end(); ++i) { if ((*i)->kind != types::ty_function) continue; if (ft) { // Multiple function types. return 0; } ft = *i; } return ft; } // Not a function. return 0; } // From two possibly overloaded types, if there is a unique function type // common to both, return it, otherwise 0. types::ty *uniqueFunction(types::ty *t1, types::ty *t2) { if (t1->kind == types::ty_function) return equivalent(t1, t2) ? t1 : 0; if (t1->isOverloaded()) { types::ty *ft = 0; for (ty_iterator i = t1->begin(); i != t1->end(); ++i) { if ((*i)->kind != types::ty_function) continue; if (!equivalent(*i, t2)) continue; if (ft) { // Multiple function types. return 0; } ft = *i; } return ft; } // Not a function. return 0; } bltin bltinFromName(symbol name) { if (name == SYM_EQ) return run::boolFuncEq; assert(name == SYM_NEQ); return run::boolFuncNeq; } types::ty *equalityExp::trans(coenv &e) { // First, try to handle by normal function resolution. types::ty *t = callExp::getType(e); assert(t); if (t->kind != ty_error) return callExp::trans(e); // Then, check for the function equality case. exp *left = (*this->args)[0].val; exp *right = (*this->args)[1].val; types::ty *lt = left->getType(e); types::ty *rt = right->getType(e); // TODO: decide what null == null should do. // Check for function == null and null == function types::ty *ft = 0; if (rt->kind == types::ty_null) ft = uniqueFunction(lt); else if (lt->kind == types::ty_null) ft = uniqueFunction(rt); else ft = uniqueFunction(lt, rt); if (ft) { assert(ft->kind == ty_function); left->transToType(e, ft); right->transToType(e, ft); e.c.encode(inst::builtin, bltinFromName(callee->getName())); return primBoolean(); } else { // Let callExp report a "no such function" error. types::ty *t = callExp::trans(e); assert(t->kind == ty_error); return t; } } void scaleExp::prettyprint(ostream &out, Int indent) { exp *left=getLeft(); exp *right=getRight(); prettyname(out, "scaleExp",indent, getPos()); left->prettyprint(out, indent+1); right->prettyprint(out, indent+1); } types::ty *scaleExp::trans(coenv &e) { exp *left=getLeft(); exp *right=getRight(); types::ty *lt = left->cgetType(e); if (lt->kind != types::ty_Int && lt->kind != types::ty_real) { if (lt->kind != types::ty_error) { em.error(left->getPos()); em << "only numeric constants can do implicit scaling"; } right->trans(e); return types::primError(); } if (!right->scalable()) { em.warning(right->getPos()); em << "implicit scaling may be unintentional"; } // Defer to the binaryExp for multiplication. return binaryExp::trans(e); } void intExp::prettyprint(ostream &out, Int indent) { prettyindent(out,indent); out << "intExp: " << value << "\n"; } types::ty *intExp::trans(coenv &e) { e.c.encode(inst::intpush,value); return types::primInt(); } void realExp::prettyprint(ostream &out, Int indent) { prettyindent(out, indent); out << "realExp: " << value << "\n"; } types::ty *realExp::trans(coenv &e) { e.c.encode(inst::constpush,(item)value); return types::primReal(); } void stringExp::prettyprint(ostream &out, Int indent) { prettyindent(out, indent); out << "stringExp '" << str << "'\n"; } types::ty *stringExp::trans(coenv &e) { e.c.encode(inst::constpush,(item) string(str)); return types::primString(); } void booleanExp::prettyprint(ostream &out, Int indent) { prettyindent(out, indent); out << "booleanExp: " << value << "\n"; } types::ty *booleanExp::trans(coenv &e) { e.c.encode(inst::constpush,(item)value); return types::primBoolean(); } void newPictureExp::prettyprint(ostream &out, Int indent) { prettyname(out, "newPictureExp",indent, getPos()); } types::ty *newPictureExp::trans(coenv &e) { e.c.encode(inst::builtin, run::newPicture); return types::primPicture(); } void cycleExp::prettyprint(ostream &out, Int indent) { prettyname(out, "cycleExp",indent, getPos()); } types::ty *cycleExp::trans(coenv &e) { e.c.encode(inst::builtin, run::newCycleToken); return types::primCycleToken(); } void nullPathExp::prettyprint(ostream &out, Int indent) { prettyname(out, "nullPathExp",indent, getPos()); } types::ty *nullPathExp::trans(coenv &e) { e.c.encode(inst::builtin, run::nullPath); return types::primPath(); } void nullExp::prettyprint(ostream &out, Int indent) { prettyname(out, "nullExp",indent, getPos()); } types::ty *nullExp::trans(coenv &) { // Things get put on the stack when ty_null // is cast to an appropriate type return types::primNull(); } void quoteExp::prettyprint(ostream &out, Int indent) { prettyname(out, "quoteExp", indent, getPos()); value->prettyprint(out, indent+1); } types::ty *quoteExp::trans(coenv &e) { e.c.encode(inst::constpush,(item)value); return types::primCode(); } void explist::prettyprint(ostream &out, Int indent) { prettyname(out, "explist",indent, getPos()); for (expvector::iterator p = exps.begin(); p != exps.end(); ++p) (*p)->prettyprint(out, indent+1); } void argument::prettyprint(ostream &out, Int indent) { prettyindent(out, indent); out << "explist"; if (name) out << " '" << name << "'"; out << '\n'; val->prettyprint(out, indent+1); } void arglist::prettyprint(ostream &out, Int indent) { prettyname(out, "arglist",indent, getPos()); for (argvector::iterator p = args.begin(); p != args.end(); ++p) p->prettyprint(out, indent+1); } void callExp::prettyprint(ostream &out, Int indent) { prettyname(out, "callExp",indent, getPos()); callee->prettyprint(out, indent+1); args->prettyprint(out, indent+1); } signature *callExp::argTypes(coenv &e, bool *searchable) { signature *source=new signature; // The signature is searchable unless one of the arguments is overloaded or // named. *searchable = true; size_t n = args->size(); for (size_t i = 0; i < n; i++) { if(string(args->args[i].name) == "KEY") { stringExp *s=dynamic_cast(args->args[i].val); if(s) { if(getPos().filename() == processData().fileName) { processDataStruct *P=&processData(); P->xkey[getPos().shift(P->xmapCount).LineColumn()]= Strdup(s->getString()); } args->args.erase(args->args.begin()+i); --n; if(i == n) break; } } argument a=(*args)[i]; types::ty *t = a.val->cgetType(e); if (t->kind == types::ty_error) return 0; if (t->kind == types::ty_overloaded || a.name) *searchable = false; source->add(types::formal(t,a.name)); } if (args->rest.val) { argument a=args->rest; types::ty *t = a.val->cgetType(e); if (t->kind == types::ty_error) return 0; if (t->kind == types::ty_overloaded || a.name) *searchable = false; source->addRest(types::formal(t,a.name)); } return source; } application *callExp::resolve(coenv &e, overloaded *o, signature *source, bool tacit) { app_list l=multimatch(e.e, o, source, *args); if (l.empty()) { //cerr << "l is empty\n"; if (!tacit) { em.error(getPos()); symbol s = callee->getName(); if (s) em << "no matching function \'" << s; else em << "no matching function for signature \'"; em << *source << "\'"; } return 0; } else if (l.size() > 1) { // This may take O(n) time. //cerr << "l is full\n"; if (!tacit) { em.error(getPos()); symbol s = callee->getName(); if(s) em << "call of function \'" << s; else em << "call with signature \'"; em << *source << "\' is ambiguous:\n\n"; for(app_list::iterator p=l.begin(); p != l.end(); ++p) em << *(*p)->getType() << "\n"; } return 0; } else { //cerr << "l is singleton\n"; return l.front(); } } bool hasNamedParameters(signature *sig) { for (size_t i=0; i < sig->getNumFormals(); ++i) if (sig->getFormal(i).name) return true; return false; } void callExp::reportMismatch(function *ft, signature *source) { symbol s = callee->getName(); const char *separator=ft->getSignature()->getNumFormals() > 1 ? "\n" : " "; em.error(getPos()); em << "cannot call" << separator << "'" << *ft->getResult() << " "; if(s) em << s; em << *ft->getSignature() << "'" << separator; if (ft->getSignature()->isOpen && hasNamedParameters(source)) em << "with named parameters"; else switch(source->getNumFormals()) { case 0: em << "without parameters"; break; case 1: em << "with parameter '" << toString(*source) << "'"; break; default: em << "with parameters\n'" << toString(*source) << "'"; } } void callExp::reportArgErrors(coenv &e) { // Cycle through the parameters to report all errors. // NOTE: This may report inappropriate ambiguity errors. for (size_t i = 0; i < args->size(); i++) { (*args)[i].val->trans(e); } if (args->rest.val) args->rest.val->trans(e); } void callExp::reportNonFunction() { em.error(getPos()); symbol s = callee->getName(); if (s) em << "\'" << s << "\' is not a function"; else em << "called expression is not a function"; } types::ty *callExp::cacheAppOrVarEntry(coenv &e, bool tacit) { assert(cachedVarEntry == 0 && cachedApp == 0); // First figure out the signature of what we want to call. bool searchable; signature *source=argTypes(e, &searchable); #ifdef DEBUG_GETAPP /* {{{ */ cout << "getApp for "; if (callee->getName()) cout << *callee->getName(); else cout << "unnamed"; cout << " at " << getPos() << endl; cout << "searchable: " << searchable << endl; #endif /* }}} */ if (!source) { return primError(); } // An attempt at speeding up compilation: See if the source arguments match // the (possibly overloaded) function exactly. if (searchable) { varEntry *ve = callee->getCallee(e, source); #ifdef DEBUG_GETAPP cout << "guessed: " << (ve!=0) << endl; #endif if (ve) { cachedVarEntry = ve; #ifndef DEBUG_CACHE // Normally DEBUG_CACHE is not defined and we return here for efficiency // reasons. If DEBUG_CACHE is defined, we instead proceed to resolve // the function by the normal techniques and make sure we get the same // result. return ((function *)ve->getType())->getResult(); #endif } } // Figure out what function types we can call. types::ty *ft = callee->cgetType(e); #ifdef DEBUG_GETAPP string name = callee->getName() ? string(*callee->getName()) : string("unnamed"); if (!callee->getName()) cout << getPos() << endl; #endif switch (ft->kind) { case ty_error: if (!tacit) // Report callee errors. callee->trans(e); break; case ty_function: //cout << "name " << name << endl; cachedApp = application::match(e.e, (function *)ft, source, *args); if (!cachedApp && !tacit) reportMismatch((function *)ft, source); break; case ty_overloaded: { #ifdef DEBUG_GETAPP int size = ((overloaded *)ft)->sub.size(); for (int i = 0; i < size; ++i) cout << "name " << name << endl; #endif cachedApp = resolve(e, (overloaded *)ft, source, tacit); break; } default: if (!tacit) reportNonFunction(); break; } #ifdef DEBUG_GETAPP cout << name << " " << *source << " --> " << *cachedApp->getType()->getSignature() << endl; #endif #if DEBUG_CACHE // Make sure cachedVarEntry is giving us the right function. if (cachedVarEntry) assert(equivalent(cachedVarEntry->getType(), cachedApp->getType())); #endif // getType relies on this method for the type. return cachedApp ? cachedApp->getType()->getResult() : primError(); } types::ty *callExp::transPerfectMatch(coenv &e) { // The varEntry of the callee. (No longer needed after translation.) varEntry *ve = cachedVarEntry; cachedVarEntry = 0; assert(ve); // Translate the arguments in turn. for (size_t i = 0; i < args->size(); ++i) (*args)[i].val->trans(e); if (args->rest.val) args->rest.val->trans(e); // Call the function. ve->encode(trans::CALL, getPos(), e.c); // That's it. Return the return type of the function. return ct ? ct : dynamic_cast(ve->getType())->getResult(); } types::ty *callExp::trans(coenv &e) { if (cachedVarEntry == 0 && cachedApp == 0) cacheAppOrVarEntry(e, false); if (cachedVarEntry) return transPerfectMatch(e); // The cached data is no longer needed after translation, so let it be // garbage collected. application *a = cachedApp; cachedApp=0; if (!a) { reportArgErrors(e); return primError(); } // To simulate left-to-right order of evaluation, produce the // side-effects for the callee. assert(a); function *t=a->getType(); assert(t); exp *temp=callee->evaluate(e, t); // Let the application handle the argument translation. a->transArgs(e); // Translate the call. temp->transCall(e, t); return t->result; } types::ty *callExp::getType(coenv &e) { if (cachedApp) return cachedApp->getType()->getResult(); if (cachedVarEntry) { function *ft = dynamic_cast(cachedVarEntry->getType()); assert(ft); return ft->getResult(); } return cacheAppOrVarEntry(e, true); } bool callExp::resolved(coenv &e) { if (cachedApp == 0 && cachedVarEntry == 0) cacheAppOrVarEntry(e, true); return cachedApp || cachedVarEntry; } void pairExp::prettyprint(ostream &out, Int indent) { prettyname(out, "pairExp",indent, getPos()); x->prettyprint(out, indent+1); y->prettyprint(out, indent+1); } types::ty *pairExp::trans(coenv &e) { x->transToType(e, types::primReal()); y->transToType(e, types::primReal()); e.c.encode(inst::builtin, run::realRealToPair); return types::primPair(); } void tripleExp::prettyprint(ostream &out, Int indent) { prettyname(out, "tripleExp",indent, getPos()); x->prettyprint(out, indent+1); y->prettyprint(out, indent+1); z->prettyprint(out, indent+1); } types::ty *tripleExp::trans(coenv &e) { x->transToType(e, types::primReal()); y->transToType(e, types::primReal()); z->transToType(e, types::primReal()); e.c.encode(inst::builtin, run::realRealRealToTriple); return types::primTriple(); } void transformExp::prettyprint(ostream &out, Int indent) { prettyname(out, "transformExp",indent, getPos()); x->prettyprint(out, indent+1); y->prettyprint(out, indent+1); xx->prettyprint(out, indent+1); xy->prettyprint(out, indent+1); yx->prettyprint(out, indent+1); yy->prettyprint(out, indent+1); } types::ty *transformExp::trans(coenv &e) { x->transToType(e, types::primReal()); y->transToType(e, types::primReal()); xx->transToType(e, types::primReal()); xy->transToType(e, types::primReal()); yx->transToType(e, types::primReal()); yy->transToType(e, types::primReal()); e.c.encode(inst::builtin, run::real6ToTransform); return types::primTransform(); } void castExp::prettyprint(ostream &out, Int indent) { prettyname(out, "castExp",indent, getPos()); target->prettyprint(out, indent+1); castee->prettyprint(out, indent+1); } types::ty *castExp::tryCast(coenv &e, types::ty *t, types::ty *s, symbol csym) { types::ty *ss=e.e.castSource(t, s, csym); if (ss == 0) { return 0; } if (ss->kind == ty_overloaded) { em.error(getPos()); em << "cast is ambiguous"; return primError(); } else { castee->transAsType(e, ss); access *a=e.e.lookupCast(t, ss, csym); assert(a); a->encode(trans::CALL, getPos(), e.c); return ss; } } types::ty *castExp::trans(coenv &e) { target->addOps(e, (record *)0); types::ty *t=target->trans(e); types::ty *s=castee->cgetType(e); if (!tryCast(e, t, s, symbol::ecastsym)) if (!tryCast(e, t, s, symbol::castsym)) { em.error(getPos()); em << "cannot cast '" << *s << "' to '" << *t << "'"; } return t; } types::ty *castExp::getType(coenv &e) { return target->trans(e, true); } void conditionalExp::prettyprint(ostream &out, Int indent) { prettyname(out, "conditionalExp",indent, getPos()); test->prettyprint(out, indent+1); onTrue->prettyprint(out, indent+1); onFalse->prettyprint(out, indent+1); } void conditionalExp::baseTransToType(coenv &e, types::ty *target) { test->transToType(e, types::primBoolean()); label tlabel = e.c.fwdLabel(); e.c.useLabel(inst::cjmp,tlabel); onFalse->transToType(e, target); label end = e.c.fwdLabel(); e.c.useLabel(inst::jmp,end); e.c.defLabel(tlabel); onTrue->transToType(e, target); e.c.defLabel(end); } void conditionalExp::transToType(coenv &e, types::ty *target) { if (isAnArray(e, test)) { if (target->kind != ty_array) { em.error(getPos()); em << "cannot cast vectorized conditional to '" << *target << "'"; } test->transToType(e, types::booleanArray()); onTrue->transToType(e, target); onFalse->transToType(e, target); e.c.encode(inst::builtin, run::arrayConditional); } else { baseTransToType(e, target); } } types::ty *promote(coenv &e, types::ty *x, types::ty *y) { struct promoter : public collector { env &e; promoter(env &e) : e(e) {} types::ty *both (types::ty *x, types::ty *y) { overloaded *o=new overloaded; o->add(x); o->add(y); return o; } types::ty *base (types::ty *x, types::ty *y) { if (equivalent(x,y)) return x; else { bool castToFirst=e.castable(x, y, symbol::castsym); bool castToSecond=e.castable(y, x, symbol::castsym); return (castToFirst && castToSecond) ? both(x,y) : castToFirst ? x : castToSecond ? y : 0; } } }; promoter p(e.e); return p.collect(x,y); } types::ty *conditionalExp::trans(coenv &e) { types::ty *tt=onTrue->cgetType(e); types::ty *ft=onFalse->cgetType(e); if (tt->kind==ty_error) return onTrue->trans(e); if (ft->kind==ty_error) return onFalse->trans(e); types::ty *t=promote(e, tt, ft); if (!t) { em.error(getPos()); em << "types in conditional expression do not match"; return primError(); } else if (t->kind == ty_overloaded) { em.error(getPos()); em << "type of conditional expression is ambiguous"; return primError(); } transToType(e,t); return t; } types::ty *conditionalExp::getType(coenv &e) { types::ty *tt=onTrue->cgetType(e); types::ty *ft=onFalse->cgetType(e); if (tt->kind==ty_error || ft->kind==ty_error) return primError(); types::ty *t = promote(e, tt, ft); return t ? t : primError(); } void orExp::prettyprint(ostream &out, Int indent) { prettyname(out, "orExp", indent, getPos()); left->prettyprint(out, indent+1); right->prettyprint(out, indent+1); } types::ty *orExp::trans(coenv &e) { // a || b // translates into // a ? true : b booleanExp be(pos, true); conditionalExp ce(pos, left, &be, right); ce.baseTransToType(e, primBoolean()); return getType(e); } void orExp::transConditionalJump(coenv &e, bool cond, label dest) { if (cond == true) { left->transConditionalJump(e, true, dest); right->transConditionalJump(e, true, dest); } else { /* cond == false */ label end = e.c.fwdLabel(); left->transConditionalJump(e, true, end); right->transConditionalJump(e, false, dest); e.c.defLabel(end); } } void andExp::prettyprint(ostream &out, Int indent) { prettyname(out, "andExp", indent, getPos()); left->prettyprint(out, indent+1); right->prettyprint(out, indent+1); } types::ty *andExp::trans(coenv &e) { // a && b // translates into // a ? b : false booleanExp be(pos, false); conditionalExp ce(pos, left, right, &be); ce.baseTransToType(e, primBoolean()); return getType(e); } void andExp::transConditionalJump(coenv &e, bool cond, label dest) { if (cond == true) { label end = e.c.fwdLabel(); left->transConditionalJump(e, false, end); right->transConditionalJump(e, true, dest); e.c.defLabel(end); } else { /* cond == false */ left->transConditionalJump(e, false, dest); right->transConditionalJump(e, false, dest); } } void joinExp::prettyprint(ostream &out, Int indent) { prettyname(out, "joinExp",indent, getPos()); callee->prettyprint(out, indent+1); args->prettyprint(out, indent+1); } void specExp::prettyprint(ostream &out, Int indent) { prettyindent(out,indent); out << "specExp '" << op << "' " << (s==camp::OUT ? "out" : s==camp::IN ? "in" : "invalid side") << '\n'; arg->prettyprint(out, indent+1); } types::ty *specExp::trans(coenv &e) { intExp ie(getPos(), (Int)s); binaryExp be(getPos(), arg, op, &ie); return be.trans(e); } types::ty *specExp::getType(coenv &e) { intExp ie(getPos(), (Int)s); binaryExp be(getPos(), arg, op, &ie); return be.cgetType(e); } void assignExp::prettyprint(ostream &out, Int indent) { prettyname(out, "assignExp",indent, getPos()); dest->prettyprint(out, indent+1); value->prettyprint(out, indent+1); } void assignExp::transAsType(coenv &e, types::ty *target) { #if 0 // For left-to-right order, we have to evaluate the side-effects of the // destination first. exp *temp=dest->evaluate(e, target); ultimateValue(temp)->transToType(e, target); temp->transWrite(e, target); #endif // All of the heavy work is handled by transWrite. dest->transWrite(e, target, value); } types::ty *assignExp::trans(coenv &e) { exp *uvalue=ultimateValue(dest); types::ty *lt = dest->cgetType(e), *rt = uvalue->cgetType(e); if (lt->kind == ty_error) return dest->trans(e); if (rt->kind == ty_error) return uvalue->trans(e); types::ty *t = e.e.castTarget(lt, rt, symbol::castsym); if (!t) { em.error(getPos()); em << "cannot convert '" << *rt << "' to '" << *lt << "' in assignment"; return primError(); } else if (t->kind == ty_overloaded) { em.error(getPos()); em << "assignment is ambiguous"; return primError(); } else { transAsType(e, t); return t; } } types::ty *assignExp::getType(coenv &e) { types::ty *lt = dest->cgetType(e), *rt = ultimateValue(dest)->cgetType(e); if (lt->kind==ty_error || rt->kind==ty_error) return primError(); types::ty *t = e.e.castTarget(lt, rt, symbol::castsym); return t ? t : primError(); } void selfExp::prettyprint(ostream &out, Int indent) { prettyindent(out, indent); out << "selfExp '" << op << "'\n"; dest->prettyprint(out, indent+1); value->prettyprint(out, indent+1); } void selfExp::transAsType(coenv &e, types::ty *target) { // Create a temp expression for the destination, so it is not evaluated // twice. exp *temp=dest->evaluate(e, target); temp->transWrite(e, target, ultimateValue(temp)); } void prefixExp::prettyprint(ostream &out, Int indent) { prettyindent(out, indent); out << "prefixExp '" << op << "'\n"; dest->prettyprint(out, indent+1); } types::ty *prefixExp::trans(coenv &e) { // Convert into the operation and the assign. // NOTE: This can cause multiple evaluations. intExp ie(getPos(), 1); selfExp se(getPos(), dest, op, &ie); return se.trans(e); } types::ty *prefixExp::getType(coenv &e) { // Convert into the operation and the assign. intExp ie(getPos(), 1); selfExp se(getPos(), dest, op, &ie); return se.getType(e); } void postfixExp::prettyprint(ostream &out, Int indent) { prettyindent(out, indent); out << "postfixExp '" << op << "'\n"; dest->prettyprint(out, indent+1); } types::ty *postfixExp::trans(coenv &) { em.error(getPos()); em << "postfix expressions are not allowed"; return primError(); } } // namespace absyntax asymptote-3.05/README0000644000000000000000000000545015031566105013052 0ustar rootroot ASYMPTOTE Copyright 2004-25 Andy Hammerlindl, John Bowman, and Tom Prince Asymptote is a powerful descriptive vector graphics language for technical drawing, inspired by MetaPost but with an improved C++-like syntax. Asymptote provides for figures the same high-quality level of typesetting that LaTeX does for scientific text. Installation instructions, documentation, binaries, and source code are available at: https://asymptote.sourceforge.io Bugs/Patches/Feature Requests can be submitted to https://github.com/vectorgraphics/asymptote/issues Questions and comments should be sent to the Asymptote Forum: https://sourceforge.net/p/asymptote/discussion/409349 All source files in the Asymptote project, unless explicitly noted otherwise, are released under version 3 (or later) of the GNU Lesser General Public License (see the files LICENSE.LESSER and LICENSE in the top-level source directory). ======================================================================== This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . ======================================================================== Note that the MSWindows executable version of Asymptote can only be released under the GNU General Public License (GPL) as it is linked against the GNU Scientific Library, GNU Readline library, and other GPL libraries. Source code for the various dll libraries that ship with this version of Asymptote ships is available as follows. fftw3: https://www.fftw.org/fftw-3.3.10.tar.gz getopt: https://github.com/xiaozhuai/getopt-win32 freeglut: https://github.com/freeglut/freeglut gsl: gslcblas: https://ftp.gnu.org/gnu/gsl/gsl-2.8.tar.gz libcurl: https://github.com/curl/curl pthreadVC3: https://sourceforge.net/projects/pthreads4w/files/pthreads4w-code-v3.0.0.zip readline: https://github.com/xiaozhuai/readline-win32 zlib1: https://github.com/madler/zlib/releases/tag/v1.3.1 ======================================================================== Source for various icons is available under the MIT license from https://github.com/driftyco/ionicons/archive/v2.0.1.zip https://github.com/iconic/open-iconic/archive/master.zip under the CC-BY-SA 4.0 license: http://www.entypo.com/ and under a CC license: http://www.zondicons.com/zondicons.zip asymptote-3.05/pipestream.cc0000644000000000000000000001226215031566105014651 0ustar rootroot/* Pipestream: A simple C++ interface to UNIX pipes Copyright (C) 2005-2014 John C. Bowman, with contributions from Mojca Miklavec This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #if !defined(_WIN32) #include #include #include #include #include #include #include "pipestream.h" #include "common.h" #include "errormsg.h" #include "settings.h" #include "util.h" #include "interact.h" #include "lexical.h" #include "camperror.h" #include "pen.h" iopipestream *instance; void pipeHandler(int) { Signal(SIGPIPE,SIG_DFL); instance->pipeclose(); } void iopipestream::open(const mem::vector &command, const char *hint, const char *application, int out_fileno) { if(pipe(in) == -1) { ostringstream buf; buf << "in pipe failed: "; for(size_t i=0; i < command.size(); ++i) buf << command[i]; camp::reportError(buf); } if(pipe(out) == -1) { ostringstream buf; buf << "out pipe failed: "; for(size_t i=0; i < command.size(); ++i) buf << command[i]; camp::reportError(buf); } cout.flush(); // Flush stdout to avoid duplicate output. if((pid=fork()) < 0) { ostringstream buf; buf << "fork failed: "; for(size_t i=0; i < command.size(); ++i) buf << command[i]; camp::reportError(buf); } if(pid == 0) { if(interact::interactive) signal(SIGINT,SIG_IGN); close(in[1]); close(out[0]); close(STDIN_FILENO); close(out_fileno); dup2(in[0],STDIN_FILENO); dup2(out[1],out_fileno); close(in[0]); close(out[1]); char **argv=args(command); if(argv) execvp(argv[0],argv); execError(argv[0],hint,application); kill(0,SIGPIPE); _exit(-1); } instance=this; Signal(SIGPIPE,pipeHandler); close(out[1]); close(in[0]); *buffer=0; Running=true; pipeopen=true; pipein=true; block(false,true); } void iopipestream::eof() { if(pipeopen && pipein) { close(in[1]); pipein=false; } } void iopipestream::pipeclose() { if(pipeopen) { kill(pid,SIGHUP); eof(); close(out[0]); Running=false; pipeopen=false; waitpid(pid,NULL,0); // Avoid zombies. } } void iopipestream::block(bool write, bool read) { if(pipeopen) { int w=fcntl(in[1],F_GETFL); int r=fcntl(out[0],F_GETFL); fcntl(in[1],F_SETFL,write ? w & ~O_NONBLOCK : w | O_NONBLOCK); fcntl(out[0],F_SETFL,read ? r & ~O_NONBLOCK : r | O_NONBLOCK); } } ssize_t iopipestream::readbuffer() { ssize_t nc; char *p=buffer; ssize_t size=BUFSIZE-1; errno=0; for(;;) { if((nc=read(out[0],p,size)) < 0) { if(errno == EAGAIN || errno == EINTR) {p[0]=0; break;} else { ostringstream buf; buf << "read from pipe failed: errno=" << errno; camp::reportError(buf); } nc=0; } p[nc]=0; if(nc == 0) { if(waitpid(pid,NULL,WNOHANG) == pid) Running=false; break; } if(nc > 0) { if(settings::verbose > 2) cerr << p; break; } } return nc; } bool iopipestream::tailequals(const char *buf, size_t len, const char *prompt, size_t plen) { const char *a=buf+len; const char *b=prompt+plen; while(b >= prompt) { if(a < buf) return false; if(*a != *b) return false; // Handle MSDOS incompatibility: if(a > buf && *a == '\n' && *(a-1) == '\r') --a; --a; --b; } return true; } string iopipestream::readline() { sbuffer.clear(); int nc; do { nc=readbuffer(); sbuffer.append(buffer); } while(buffer[nc-1] != '\n' && Running); return sbuffer; } void iopipestream::wait(const char *prompt) { sbuffer.clear(); size_t plen=strlen(prompt); do { readbuffer(); if(*buffer == 0) camp::reportError(sbuffer); sbuffer.append(buffer); if(tailequals(sbuffer.c_str(),sbuffer.size(),prompt,plen)) break; } while(true); } int iopipestream::wait() { for(;;) { int status; if (waitpid(pid,&status,0) == -1) { if (errno == ECHILD) return 0; if (errno != EINTR) { ostringstream buf; buf << "Process " << pid << " failed"; camp::reportError(buf); } } else { if(WIFEXITED(status)) return WEXITSTATUS(status); else { ostringstream buf; buf << "Process " << pid << " exited abnormally"; camp::reportError(buf); } } } } void iopipestream::Write(const string &s) { ssize_t size=s.length(); if(settings::verbose > 2) cerr << s; if(write(in[1],s.c_str(),size) != size) { camp::reportFatal("write to pipe failed"); } } #endif asymptote-3.05/depcomp0000755000000000000000000005622515031566105013555 0ustar rootroot#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2024-12-03.03; # UTC # Copyright (C) 1999-2025 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . GNU Automake home page: . General help using GNU software: . EOF exit $? ;; -v | --v*) echo "depcomp (GNU Automake) $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interference from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. ## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp nil t) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: asymptote-3.05/prcfile.h0000644000000000000000000000121215031566105013757 0ustar rootroot#ifndef PRCFILE_H #define PRCFILE_H #include "memory.h" #include "pen.h" inline double X(const camp::triple &v) {return v.getx();} inline double Y(const camp::triple &v) {return v.gety();} inline double Z(const camp::triple &v) {return v.getz();} #include "prc/oPRCFile.h" namespace camp { inline prc::RGBAColour rgba(pen p) { p.convert(); p.torgb(); return prc::RGBAColour(p.red(),p.green(),p.blue(),p.opacity()); } static const double inches=72; static const double cm=inches/2.54; class prcfile : public prc::oPRCFile { public: prcfile(string name) : prc::oPRCFile(name.c_str(),10.0/cm) {} // Use bp. }; } //namespace camp #endif asymptote-3.05/GLTextures.cc0000644000000000000000000000131615031566105014544 0ustar rootroot// // Created by jamie on 8/23/21. // #include "GLTextures.h" #ifdef HAVE_GL namespace gl { AGLTexture::~AGLTexture() { if (textureId != 0) { glDeleteTextures(1, &textureId); } } AGLTexture& AGLTexture::operator=(AGLTexture&& glTex) noexcept { textureId = glTex.textureId; textureNumber = glTex.textureNumber; glTex.textureId = 0; glTex.textureNumber = -1; return *this; } AGLTexture::AGLTexture(AGLTexture&& glTex) noexcept: textureId(glTex.textureId), textureNumber(glTex.textureNumber) { } AGLTexture::AGLTexture(int textureNumber) : textureNumber(textureNumber) {} void AGLTexture::setActive() const { glActiveTexture(GL_TEXTURE0+textureNumber); } } // namespace gl #endif asymptote-3.05/runsystem.in0000644000000000000000000001211015031566105014562 0ustar rootroot/***** * runsystem.in * * Runtime functions for system operations. * *****/ callable* => voidFunction() callableBp* => breakpointFunction() runnable* => primCode() #include "asyprocess.h" #include "stack.h" #include "locate.h" using namespace camp; using namespace settings; using vm::bpinfo; using vm::bplist; using vm::getPos; using vm::Default; using vm::nullfunc; using vm::item; using absyntax::runnable; typedef callable callableBp; namespace run { extern string emptystring; } function *voidFunction() { return new function(primVoid()); } function *breakpointFunction() { return new function(primString(),primString(),primInt(),primInt(), primCode()); } void clear(string file, Int line, bool warn=false) { bpinfo bp(file,line); for(mem::list::iterator p=bplist.begin(); p != bplist.end(); ++p) { if(*p == bp) { cout << "cleared breakpoint at " << file << ": " << line << endl; bplist.remove(bp); return; } } if(warn) cout << "No such breakpoint at " << file << ": " << line << endl; } namespace run { void breakpoint(stack *Stack, runnable *r) { callable *atBreakpointFunction=processData().atBreakpointFunction; if(atBreakpointFunction && !nullfunc::instance()->compare(atBreakpointFunction)) { position curPos=getPos(); Stack->push(curPos.filename()); Stack->push((Int) curPos.Line()); Stack->push((Int) curPos.Column()); Stack->push(r ? r : vm::Default); atBreakpointFunction->call(Stack); // returns a string } else Stack->push(""); } } string convertname(string name, const string& format) { if(name.empty()) return buildname(outname(),format,""); name=outpath(name); return format.empty() ? name : format+":"+name; } namespace run { void purge(Int divisor=0) { #ifdef USEGC if(divisor > 0) GC_set_free_space_divisor((GC_word) divisor); GC_gcollect(); #endif } void updateFunction(stack *Stack) { callable *atUpdateFunction=processData().atUpdateFunction; if(atUpdateFunction && !nullfunc::instance()->compare(atUpdateFunction)) atUpdateFunction->call(Stack); } void exitFunction(stack *Stack) { callable *atExitFunction=processData().atExitFunction; if(atExitFunction && !nullfunc::instance()->compare(atExitFunction)) atExitFunction->call(Stack); } } // Autogenerated routines: string outname() { return outname(); } void atupdate(callable *f) { processData().atUpdateFunction=f; } callable *atupdate() { return processData().atUpdateFunction; } void atexit(callable *f) { processData().atExitFunction=f; } callable *atexit() { return processData().atExitFunction; } void atbreakpoint(callableBp *f) { processData().atBreakpointFunction=f; } void breakpoint(runnable *s=NULL) { breakpoint(Stack,s); } string locatefile(string file, bool full=true) { return locateFile(file,full); } void stop(string file, Int line, runnable *s=NULL) { file=locateFile(file); clear(file,line); cout << "setting breakpoint at " << file << ": " << line << endl; bplist.push_back(bpinfo(file,line,s)); } void breakpoints() { for(mem::list::iterator p=bplist.begin(); p != bplist.end(); ++p) cout << p->f.name() << ": " << p->f.line() << endl; } void clear(string file, Int line) { file=locateFile(file); clear(file,line,true); } void clear() { bplist.clear(); } void warn(string s) { Warn(s); } void nowarn(string s) { noWarn(s); } void warning(string s, string t, bool position=false) { if(settings::warn(s)) { em.warning(position ? getPos() : nullPos,s); em << t; em.sync(true); } } // Strip directory from string string stripdirectory(string *s) { return stripDir(*s); } // Strip directory from string string stripfile(string *s) { return stripFile(*s); } // Strip file extension from string string stripextension(string *s) { return stripExt(*s); } // Call ImageMagick convert. Int convert(string args=emptystring, string file=emptystring, string format=emptystring) { string name=convertname(file,format); mem::vector cmd; string s=getSetting("convert"); cmd.push_back(s); push_split(cmd,args); cmd.push_back(name); bool quiet=verbose <= 1; char *oldPath=NULL; string dir=stripFile(outname()); if(!dir.empty()) { oldPath=getPath(); setPath(dir.c_str()); } Int ret=System(cmd,quiet ? 1 : 0,true,"convert", "your ImageMagick convert utility"); if(oldPath != NULL) setPath(oldPath); if(ret == 0 && verbose > 0) cout << "Wrote " << (file.empty() ? name : file) << endl; return ret; } // Call ImageMagick animate. Int animate(string args=emptystring, string file=emptystring, string format=emptystring) { string name=convertname(file,format); if(view()) { mem::vector cmd; string s=getSetting("animate"); cmd.push_back(s); if(s == "magick") cmd.push_back("animate"); push_split(cmd,args); cmd.push_back(name); return System(cmd,0,false,"animate","your animated GIF viewer"); } return 0; } void purge(Int divisor=0) { purge(divisor); } asymptote-3.05/name.h0000644000000000000000000001307315031566105013263 0ustar rootroot/***** * name.h * Andy Hammerlindl 2002/07/14 * * Qualified names (such as x, f, builtin.sin, a.b.c.d, etc.) can be used * either as variables or a type names. This class stores qualified * names used in nameExp and nameTy in the abstract syntax, and * implements the exp and type functions. *****/ #ifndef NAME_H #define NAME_H #include "absyn.h" #include "types.h" #include "frame.h" #include "access.h" namespace trans { class coenv; class varEntry; class tyEntry; } namespace types { class record; } namespace absyntax { using trans::coenv; using trans::action; using types::record; using std::ostream; class name : public absyn { public: name(position pos) : absyn(pos) {} // Helper function - ensures target and source match up, using casting in the // case of a read. Issues errors on failure. void forceEquivalency(action act, coenv &e, types::ty *target, types::ty *source); // Used for determining the type when the context does not establish // the name as a variable or a type. First, the function looks for a // non-function variable fitting the description. If one fits, the // type of the variable is returned. Failing that, the function looks // for a fitting type and returns that. If nothing is found, an // appropriate error is reported and ty_error is returned. // Because this is used only on qualifiers (ie. names to the left of a // dot), it does not look at function variables. // Tacit means that no error messages will be reported to the user. virtual types::ty *getType(coenv &e, bool tacit = false); // Pushes the highest level frame possible onto the stack. Returning // the frame pushed. If no frame can be pushed, returns 0. // NOTE: This duplicates some functionality with getVarEntry. virtual trans::frame *frameTrans(coenv &e); // Helper function for the case where the name is known to be a type. virtual trans::frame *tyFrameTrans(coenv &e) = 0; // Constructs the varEntry part of the tyEntry for the name. Like // getType, this is called on the qualifier, instead of the full name. // This reports no errors, and returns 0 if there is no varEntry to // use. virtual trans::varEntry *getVarEntry(coenv &e) = 0; // As a variable: // Translates the name (much like an expression). virtual void varTrans(action act, coenv &e, types::ty *target) = 0; // Returns the possible variable types. Unlike exp, returns 0 if none // match. virtual types::ty *varGetType(coenv &e) = 0; virtual trans::varEntry *getCallee(coenv &e, types::signature *sig) = 0; // As a type: // Determines the type, as used in a variable declaration. virtual types::ty *typeTrans(coenv &e, bool tacit = false) = 0; // Constructs the tyEntry of the name, needed so that we know the // parent frame for allocating new objects of that type. Reports // errors as typeTrans() does with tacit=false. virtual trans::tyEntry *tyEntryTrans(coenv &e) = 0; virtual void prettyprint(ostream &out, Int indent) = 0; virtual void print(ostream& out) const { out << ""; } [[nodiscard]] virtual symbol getName() const = 0; [[nodiscard]] virtual AsymptoteLsp::SymbolLit getLit() const = 0; }; inline ostream& operator<< (ostream& out, const name& n) { n.print(out); return out; } class simpleName : public name { symbol id; public: simpleName(position pos, symbol id) : name(pos), id(id) {} trans::varEntry *getVarEntry(coenv &e) override; // As a variable: void varTrans(action act, coenv &e, types::ty *target) override; types::ty *varGetType(coenv &) override; trans::varEntry *getCallee(coenv &e, types::signature *sig) override; // As a type: types::ty *typeTrans(coenv &e, bool tacit = false) override; virtual trans::tyEntry *tyEntryTrans(coenv &e) override; trans::frame *tyFrameTrans(coenv &e) override; void prettyprint(ostream &out, Int indent) override; void print(ostream& out) const override { out << id; } [[nodiscard]] symbol getName() const override { return id; } [[nodiscard]] AsymptoteLsp::SymbolLit getLit() const override; }; class qualifiedName : public name { name *qualifier; symbol id; // Gets the record type associated with the qualifier. Reports an // error and returns null if the type is not a record. record *castToRecord(types::ty *t, bool tacit = false); // Translates as a virtual field, if possible. qt is the type of the // qualifier. Return true if there was a matching virtual field. bool varTransVirtual(action act, coenv &e, types::ty *target, types::ty *qt); // Translates as an ordinary (non-virtual) field of a record, r. void varTransField(action act, coenv &e, types::ty *target, record *r); public: qualifiedName(position pos, name *qualifier, symbol id) : name(pos), qualifier(qualifier), id(id) {} trans::varEntry *getVarEntry(coenv &e) override; // As a variable: void varTrans(action act, coenv &, types::ty *target) override; types::ty *varGetType(coenv &) override; trans::varEntry *getCallee(coenv &e, types::signature *sig) override; // As a type: types::ty *typeTrans(coenv &e, bool tacit = false) override; trans::tyEntry *tyEntryTrans(coenv &e) override; trans::frame *tyFrameTrans(coenv &e) override; void prettyprint(ostream &out, Int indent) override; void print(ostream& out) const override { out << *qualifier << "." << id; } [[nodiscard]] symbol getName() const override { return id; } [[nodiscard]] AsymptoteLsp::SymbolLit getLit() const override; }; } // namespace absyntax #endif asymptote-3.05/cxxtests/0000755000000000000000000000000015031566105014053 5ustar rootrootasymptote-3.05/cxxtests/include/0000755000000000000000000000000015031566105015476 5ustar rootrootasymptote-3.05/cxxtests/include/asycxxtests/0000755000000000000000000000000015031566105020100 5ustar rootrootasymptote-3.05/cxxtests/include/asycxxtests/common.h0000644000000000000000000000025015031566105021536 0ustar rootroot/** * @param asycxxtests/common.h * @brief Common header file for all asymptote C++-side testing */ #pragma once #include #include asymptote-3.05/cxxtests/CMakeLists.txt0000644000000000000000000000116515031566105016616 0ustar rootrootif (NOT ENABLE_ASY_CXXTEST) message(FATAL_ERROR "cxxtests require asy-cxxtest enabled") endif() set(TEST_CXX_SRC_ROOT ${CMAKE_CURRENT_LIST_DIR}) include(${TEST_CXX_SRC_ROOT}/cmake-scripts/external-libs.cmake) include(${TEST_CXX_SRC_ROOT}/cmake-scripts/tests.cmake) # test target add_executable(asyCxxTests ${ASY_TEST_SOURCES} ${TEST_CXX_SRC_ROOT}/src/testMain.cc) target_include_directories( asyCxxTests PRIVATE ${TEST_CXX_SRC_ROOT}/include ) target_link_libraries(asyCxxTests PRIVATE asycore GTest::gtest GTest::gmock) include(GoogleTest) gtest_discover_tests(asyCxxTests TEST_PREFIX cxxtests.) asymptote-3.05/cxxtests/src/0000755000000000000000000000000015031566105014642 5ustar rootrootasymptote-3.05/cxxtests/src/testMain.cc0000644000000000000000000000040015031566105016727 0ustar rootroot#include #include #include "common.h" int main(int argc, char* argv[]) { #if defined(USEGC) GC_init(); #endif ::testing::InitGoogleTest(&argc,argv); ::testing::InitGoogleMock(&argc,argv); return RUN_ALL_TESTS(); } asymptote-3.05/cxxtests/cmake-scripts/0000755000000000000000000000000015031566105016620 5ustar rootrootasymptote-3.05/cxxtests/cmake-scripts/tests.cmake0000644000000000000000000000037115031566105020765 0ustar rootroot# add tests here set(ASY_CXX_TESTS placeholder ) # ----- transform tests -------- list(TRANSFORM ASY_CXX_TESTS APPEND .cc) list(TRANSFORM ASY_CXX_TESTS PREPEND ${TEST_CXX_SRC_ROOT}/tests/ OUTPUT_VARIABLE ASY_TEST_SOURCES ) asymptote-3.05/cxxtests/cmake-scripts/external-libs.cmake0000644000000000000000000000077515031566105022404 0ustar rootroot# Use directly downloaded library because vcpkg's version has some # linking issues with windows + clang64-msys2 if (DOWNLOAD_GTEST_FROM_SRC) include(FetchContent) FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest GIT_TAG v1.14.0 ) if (WIN32) set(gtest_force_shared_crt ON CACHE INTERNAL "Force shared CRT") endif() FetchContent_MakeAvailable(googletest) else() find_package(GTest REQUIRED) endif() asymptote-3.05/cxxtests/tests/0000755000000000000000000000000015031566105015215 5ustar rootrootasymptote-3.05/cxxtests/tests/placeholder.cc0000644000000000000000000000020515031566105020003 0ustar rootroot#include "asycxxtests/common.h" #define TESTING_FILE_NAME placeholder TEST(TESTING_FILE_NAME, alwaysTrue) { ASSERT_TRUE(1==1); } asymptote-3.05/backports/0000755000000000000000000000000015031566105014156 5ustar rootrootasymptote-3.05/backports/getopt/0000755000000000000000000000000015031566105015460 5ustar rootrootasymptote-3.05/backports/getopt/include/0000755000000000000000000000000015031566105017103 5ustar rootrootasymptote-3.05/backports/getopt/include/getopt.h0000644000000000000000000001477215031566105020571 0ustar rootroot/* Declarations for getopt. Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _GETOPT_H #ifndef __need_getopt # define _GETOPT_H 1 #endif /* If __GNU_LIBRARY__ is not already defined, either we are being used standalone, or this is the first header included in the source file. If we are being used with glibc, we need to include , but that does not exist if we are standalone. So: if __GNU_LIBRARY__ is not defined, include , which will pull in for us if it's from glibc. (Why ctype.h? It's guaranteed to exist and it doesn't flood the namespace with stuff the way some other headers do.) */ #if !defined __GNU_LIBRARY__ # include #endif #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; #ifndef __need_getopt /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { # if (defined __STDC__ && __STDC__) || defined __cplusplus const char *name; # else char *name; # endif /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ # define no_argument 0 # define required_argument 1 # define optional_argument 2 #endif /* need getopt */ /* Get definitions and prototypes for functions to process the arguments in ARGV (ARGC of them, minus the program name) for options given in OPTS. Return the option character from OPTS just read. Return -1 when there are no more options. For unrecognized options, or options missing arguments, `optopt' is set to the option letter, and '?' is returned. The OPTS string is a list of characters which are recognized option letters, optionally followed by colons, specifying that that letter takes an argument, to be placed in `optarg'. If a letter in OPTS is followed by two colons, its argument is optional. This behavior is specific to the GNU `getopt'. The argument `--' causes premature termination of argument scanning, explicitly telling `getopt' that there are no more options. If OPTS begins with `--', then non-option arguments are treated as arguments to the option '\0'. This behavior is specific to the GNU `getopt'. */ #if (defined __STDC__ && __STDC__) || defined __cplusplus # ifdef __GNU_LIBRARY__ /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int __argc, char *const *__argv, const char *__shortopts); # else /* not __GNU_LIBRARY__ */ /* extern int getopt (); */ # endif /* __GNU_LIBRARY__ */ # ifndef __need_getopt extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind); extern int getopt_long_only (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only); # endif #else /* not __STDC__ */ extern int getopt (); # ifndef __need_getopt extern int getopt_long (); extern int getopt_long_only (); extern int _getopt_internal (); # endif #endif /* __STDC__ */ #ifdef __cplusplus } #endif /* Make sure we later can get all the definitions and declarations. */ #undef __need_getopt #endif /* getopt.h */ asymptote-3.05/backports/getopt/CMakeLists.txt0000644000000000000000000000101215031566105020212 0ustar rootrootcmake_minimum_required(VERSION 3.27) project(getopt) add_library( getopt ${CMAKE_CURRENT_LIST_DIR}/src/getopt.c ${CMAKE_CURRENT_LIST_DIR}/src/getopt1.c ) target_include_directories( getopt PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) # we are requring string.h here include(CheckIncludeFile) check_include_file("string.h" HAVE_STRING_HEADER_FILE) if (HAVE_STRING_HEADER_FILE) target_compile_definitions( getopt PRIVATE HAVE_STRING_H=1 ) endif() asymptote-3.05/backports/getopt/src/0000755000000000000000000000000015031566105016247 5ustar rootrootasymptote-3.05/backports/getopt/src/getopt1.c0000644000000000000000000001043215031566105017776 0ustar rootroot/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "getopt.h" #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 #include #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION #define ELIDE_CODE #endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #endif #ifndef NULL #define NULL 0 #endif int getopt_long (int argc, char* const* argv, const char* options, const struct option* long_options, int* opt_index) { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (int argc, char* const* argv, const char* options, const struct option* long_options, int* opt_index) { return _getopt_internal (argc, argv, options, long_options, opt_index, 1); } #endif /* Not ELIDE_CODE. */ #ifdef TEST #include int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case 'd': printf ("option d with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ asymptote-3.05/backports/getopt/src/getopt.c0000644000000000000000000007270315031566105017726 0ustar rootroot/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to drepper@gnu.org before changing it! Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO # define _NO_PROTO #endif #ifdef HAVE_CONFIG_H # include #endif #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ # ifndef const # define const # endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 # include # if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION # define ELIDE_CODE # endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ # include # include #endif /* GNU C library. */ #ifdef VMS # include # if HAVE_STRING_H - 0 # include # endif #endif #ifndef _ /* This is for other GNU distributions with internationalized messages. */ # if defined HAVE_LIBINTL_H || defined _LIBC # include # ifndef _ # define _(msgid) gettext (msgid) # endif # else # define _(msgid) (msgid) # endif #endif /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Formerly, initialization of getopt depended on optind==0, which causes problems with re-calling getopt as programs generally don't know that. */ int __getopt_initialized; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return -1 with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ # include # define my_index strchr #else # if HAVE_STRING_H # include # else # include # endif /* Avoid depending on library functions or files whose names are inconsistent. */ #ifndef getenv extern char *getenv (); #endif static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. */ #ifdef __GNUC__ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. That was relevant to code that was here before. */ # if (!defined __STDC__ || !__STDC__) && !defined strlen /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ extern int strlen (const char *); # endif /* not __STDC__ */ #endif /* __GNUC__ */ #endif /* not __GNU_LIBRARY__ */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; #ifdef _LIBC /* Stored original parameters. XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ extern int __libc_argc; extern char **__libc_argv; /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ # ifdef USE_NONOPTION_FLAGS /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; static int nonoption_flags_max_len; static int nonoption_flags_len; # endif # ifdef USE_NONOPTION_FLAGS # define SWAP_FLAGS(ch1, ch2) \ if (nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } # else # define SWAP_FLAGS(ch1, ch2) # endif #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ #if defined __STDC__ && __STDC__ static void exchange (char **); #endif static void exchange (argv) char **argv; { int bottom = first_nonopt; int middle = last_nonopt; int top = optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS /* First make sure the handling of the `__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) { /* We must extend the array. The user plays games with us and presents new arguments. */ char *new_str = malloc (top + 1); if (new_str == NULL) nonoption_flags_len = nonoption_flags_max_len = 0; else { memset (__mempcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len), '\0', top + 1 - nonoption_flags_max_len); nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } #endif while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; SWAP_FLAGS (bottom + i, middle + i); } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Initialize the internal data when the first call is made. */ #if defined __STDC__ && __STDC__ static const char *_getopt_initialize (int, char *const *, const char *); #endif static const char * _getopt_initialize (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ first_nonopt = last_nonopt = optind; nextchar = NULL; posixly_correct = getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (posixly_correct != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; #if defined _LIBC && defined USE_NONOPTION_FLAGS if (posixly_correct == NULL && argc == __libc_argc && argv == __libc_argv) { if (nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') nonoption_flags_max_len = -1; else { const char *orig_str = __getopt_nonoption_flags; int len = nonoption_flags_max_len = strlen (orig_str); if (nonoption_flags_max_len < argc) nonoption_flags_max_len = argc; __getopt_nonoption_flags = (char *) malloc (nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) nonoption_flags_max_len = -1; else memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), '\0', nonoption_flags_max_len - len); } } nonoption_flags_len = nonoption_flags_max_len; } else nonoption_flags_len = 0; #endif return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns -1. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int argc; char *const *argv; const char *optstring; const struct option *longopts; int *longind; int long_only; { int print_errors = opterr; if (optstring[0] == ':') print_errors = 0; if (argc < 1) return -1; optarg = NULL; if (optind == 0 || !__getopt_initialized) { if (optind == 0) optind = 1; /* Don't scan ARGV[0], the program name. */ optstring = _getopt_initialize (argc, argv, optstring); __getopt_initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ || (optind < nonoption_flags_len \ && __getopt_nonoption_flags[optind] == '1')) #else # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') #endif if (nextchar == NULL || *nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (last_nonopt > optind) last_nonopt = optind; if (first_nonopt > optind) first_nonopt = optind; if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && NONOPTION_P) optind++; last_nonopt = optind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (ordering == REQUIRE_ORDER) return -1; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[optind][1] == '-' || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = -1; int option_index; for (nameend = nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (print_errors) fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (print_errors) { if (argv[optind - 1][1] == '-') /* --option */ fprintf (stderr, _("%s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); else /* +option or -option */ fprintf (stderr, _("%s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[optind - 1][0], pfound->name); } nextchar += strlen (nextchar); optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (print_errors) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' || my_index (optstring, *nextchar) == NULL) { if (print_errors) { if (argv[optind][1] == '-') /* --option */ fprintf (stderr, _("%s: unrecognized option `--%s'\n"), argv[0], nextchar); else /* +option or -option */ fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[optind][0], nextchar); } nextchar = (char *) ""; optind++; optopt = 0; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (print_errors) { if (posixly_correct) /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); else fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); } optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (print_errors) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (print_errors) fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (print_errors) fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); nextchar += strlen (nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (print_errors) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = NULL; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (print_errors) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } #endif /* Not ELIDE_CODE. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ asymptote-3.05/backports/optional/0000755000000000000000000000000015031566105016003 5ustar rootrootasymptote-3.05/backports/optional/include/0000755000000000000000000000000015031566105017426 5ustar rootrootasymptote-3.05/backports/optional/include/optional.hpp0000644000000000000000000015153515031566105021776 0ustar rootroot// // Copyright (c) 2014-2021 Martin Moene // // https://github.com/martinmoene/optional-lite // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #pragma once #ifndef NONSTD_OPTIONAL_LITE_HPP #define NONSTD_OPTIONAL_LITE_HPP #define optional_lite_MAJOR 3 #define optional_lite_MINOR 5 #define optional_lite_PATCH 0 #define optional_lite_VERSION optional_STRINGIFY(optional_lite_MAJOR) "." optional_STRINGIFY(optional_lite_MINOR) "." optional_STRINGIFY(optional_lite_PATCH) #define optional_STRINGIFY( x ) optional_STRINGIFY_( x ) #define optional_STRINGIFY_( x ) #x // optional-lite configuration: #define optional_OPTIONAL_DEFAULT 0 #define optional_OPTIONAL_NONSTD 1 #define optional_OPTIONAL_STD 2 // tweak header support: #ifdef __has_include # if __has_include() # include # endif #define optional_HAVE_TWEAK_HEADER 1 #else #define optional_HAVE_TWEAK_HEADER 0 //# pragma message("optional.hpp: Note: Tweak header not supported.") #endif // optional selection and configuration: #if !defined( optional_CONFIG_SELECT_OPTIONAL ) # define optional_CONFIG_SELECT_OPTIONAL ( optional_HAVE_STD_OPTIONAL ? optional_OPTIONAL_STD : optional_OPTIONAL_NONSTD ) #endif // Control presence of extensions: #ifndef optional_CONFIG_NO_EXTENSIONS #define optional_CONFIG_NO_EXTENSIONS 0 #endif // Control presence of exception handling (try and auto discover): #ifndef optional_CONFIG_NO_EXCEPTIONS # if defined(_MSC_VER) # include // for _HAS_EXCEPTIONS # endif # if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || (_HAS_EXCEPTIONS) # define optional_CONFIG_NO_EXCEPTIONS 0 # else # define optional_CONFIG_NO_EXCEPTIONS 1 # endif #endif // C++ language version detection (C++20 is speculative): // Note: VC14.0/1900 (VS2015) lacks too much from C++14. #ifndef optional_CPLUSPLUS # if defined(_MSVC_LANG ) && !defined(__clang__) # define optional_CPLUSPLUS (_MSC_VER == 1900 ? 201103L : _MSVC_LANG ) # else # define optional_CPLUSPLUS __cplusplus # endif #endif #define optional_CPP98_OR_GREATER ( optional_CPLUSPLUS >= 199711L ) #define optional_CPP11_OR_GREATER ( optional_CPLUSPLUS >= 201103L ) #define optional_CPP11_OR_GREATER_ ( optional_CPLUSPLUS >= 201103L ) #define optional_CPP14_OR_GREATER ( optional_CPLUSPLUS >= 201402L ) #define optional_CPP17_OR_GREATER ( optional_CPLUSPLUS >= 201703L ) #define optional_CPP20_OR_GREATER ( optional_CPLUSPLUS >= 202000L ) // C++ language version (represent 98 as 3): #define optional_CPLUSPLUS_V ( optional_CPLUSPLUS / 100 - (optional_CPLUSPLUS > 200000 ? 2000 : 1994) ) // Use C++17 std::optional if available and requested: #if optional_CPP17_OR_GREATER && defined(__has_include ) # if __has_include( ) # define optional_HAVE_STD_OPTIONAL 1 # else # define optional_HAVE_STD_OPTIONAL 0 # endif #else # define optional_HAVE_STD_OPTIONAL 0 #endif #define optional_USES_STD_OPTIONAL ( (optional_CONFIG_SELECT_OPTIONAL == optional_OPTIONAL_STD) || ((optional_CONFIG_SELECT_OPTIONAL == optional_OPTIONAL_DEFAULT) && optional_HAVE_STD_OPTIONAL) ) // // in_place: code duplicated in any-lite, expected-lite, optional-lite, value-ptr-lite, variant-lite: // #ifndef nonstd_lite_HAVE_IN_PLACE_TYPES #define nonstd_lite_HAVE_IN_PLACE_TYPES 1 // C++17 std::in_place in : #if optional_CPP17_OR_GREATER #include namespace nonstd { using std::in_place; using std::in_place_type; using std::in_place_index; using std::in_place_t; using std::in_place_type_t; using std::in_place_index_t; #define nonstd_lite_in_place_t( T) std::in_place_t #define nonstd_lite_in_place_type_t( T) std::in_place_type_t #define nonstd_lite_in_place_index_t(K) std::in_place_index_t #define nonstd_lite_in_place( T) std::in_place_t{} #define nonstd_lite_in_place_type( T) std::in_place_type_t{} #define nonstd_lite_in_place_index(K) std::in_place_index_t{} } // namespace nonstd #else // optional_CPP17_OR_GREATER #include namespace nonstd { namespace detail { template< class T > struct in_place_type_tag {}; template< std::size_t K > struct in_place_index_tag {}; } // namespace detail struct in_place_t {}; template< class T > inline in_place_t in_place( detail::in_place_type_tag /*unused*/ = detail::in_place_type_tag() ) { return in_place_t(); } template< std::size_t K > inline in_place_t in_place( detail::in_place_index_tag /*unused*/ = detail::in_place_index_tag() ) { return in_place_t(); } template< class T > inline in_place_t in_place_type( detail::in_place_type_tag /*unused*/ = detail::in_place_type_tag() ) { return in_place_t(); } template< std::size_t K > inline in_place_t in_place_index( detail::in_place_index_tag /*unused*/ = detail::in_place_index_tag() ) { return in_place_t(); } // mimic templated typedef: #define nonstd_lite_in_place_t( T) nonstd::in_place_t(&)( nonstd::detail::in_place_type_tag ) #define nonstd_lite_in_place_type_t( T) nonstd::in_place_t(&)( nonstd::detail::in_place_type_tag ) #define nonstd_lite_in_place_index_t(K) nonstd::in_place_t(&)( nonstd::detail::in_place_index_tag ) #define nonstd_lite_in_place( T) nonstd::in_place_type #define nonstd_lite_in_place_type( T) nonstd::in_place_type #define nonstd_lite_in_place_index(K) nonstd::in_place_index } // namespace nonstd #endif // optional_CPP17_OR_GREATER #endif // nonstd_lite_HAVE_IN_PLACE_TYPES // // Using std::optional: // #if optional_USES_STD_OPTIONAL #include namespace nonstd { using std::optional; using std::bad_optional_access; using std::hash; using std::nullopt; using std::nullopt_t; using std::operator==; using std::operator!=; using std::operator<; using std::operator<=; using std::operator>; using std::operator>=; using std::make_optional; using std::swap; } #else // optional_USES_STD_OPTIONAL #include #include // optional-lite alignment configuration: #ifndef optional_CONFIG_MAX_ALIGN_HACK # define optional_CONFIG_MAX_ALIGN_HACK 0 #endif #ifndef optional_CONFIG_ALIGN_AS // no default, used in #if defined() #endif #ifndef optional_CONFIG_ALIGN_AS_FALLBACK # define optional_CONFIG_ALIGN_AS_FALLBACK double #endif // Compiler warning suppression: #if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wundef" #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wundef" #elif defined(_MSC_VER ) # pragma warning( push ) #endif // half-open range [lo..hi): #define optional_BETWEEN( v, lo, hi ) ( (lo) <= (v) && (v) < (hi) ) // Compiler versions: // // MSVC++ 6.0 _MSC_VER == 1200 optional_COMPILER_MSVC_VERSION == 60 (Visual Studio 6.0) // MSVC++ 7.0 _MSC_VER == 1300 optional_COMPILER_MSVC_VERSION == 70 (Visual Studio .NET 2002) // MSVC++ 7.1 _MSC_VER == 1310 optional_COMPILER_MSVC_VERSION == 71 (Visual Studio .NET 2003) // MSVC++ 8.0 _MSC_VER == 1400 optional_COMPILER_MSVC_VERSION == 80 (Visual Studio 2005) // MSVC++ 9.0 _MSC_VER == 1500 optional_COMPILER_MSVC_VERSION == 90 (Visual Studio 2008) // MSVC++ 10.0 _MSC_VER == 1600 optional_COMPILER_MSVC_VERSION == 100 (Visual Studio 2010) // MSVC++ 11.0 _MSC_VER == 1700 optional_COMPILER_MSVC_VERSION == 110 (Visual Studio 2012) // MSVC++ 12.0 _MSC_VER == 1800 optional_COMPILER_MSVC_VERSION == 120 (Visual Studio 2013) // MSVC++ 14.0 _MSC_VER == 1900 optional_COMPILER_MSVC_VERSION == 140 (Visual Studio 2015) // MSVC++ 14.1 _MSC_VER >= 1910 optional_COMPILER_MSVC_VERSION == 141 (Visual Studio 2017) // MSVC++ 14.2 _MSC_VER >= 1920 optional_COMPILER_MSVC_VERSION == 142 (Visual Studio 2019) #if defined(_MSC_VER ) && !defined(__clang__) # define optional_COMPILER_MSVC_VER (_MSC_VER ) # define optional_COMPILER_MSVC_VERSION (_MSC_VER / 10 - 10 * ( 5 + (_MSC_VER < 1900 ) ) ) #else # define optional_COMPILER_MSVC_VER 0 # define optional_COMPILER_MSVC_VERSION 0 #endif #define optional_COMPILER_VERSION( major, minor, patch ) ( 10 * (10 * (major) + (minor) ) + (patch) ) #if defined(__GNUC__) && !defined(__clang__) # define optional_COMPILER_GNUC_VERSION optional_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) #else # define optional_COMPILER_GNUC_VERSION 0 #endif #if defined(__clang__) # define optional_COMPILER_CLANG_VERSION optional_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__) #else # define optional_COMPILER_CLANG_VERSION 0 #endif #if optional_BETWEEN(optional_COMPILER_MSVC_VERSION, 70, 140 ) # pragma warning( disable: 4345 ) // initialization behavior changed #endif #if optional_BETWEEN(optional_COMPILER_MSVC_VERSION, 70, 150 ) # pragma warning( disable: 4814 ) // in C++14 'constexpr' will not imply 'const' #endif // Presence of language and library features: #define optional_HAVE(FEATURE) ( optional_HAVE_##FEATURE ) #ifdef _HAS_CPP0X # define optional_HAS_CPP0X _HAS_CPP0X #else # define optional_HAS_CPP0X 0 #endif // Unless defined otherwise below, consider VC14 as C++11 for optional-lite: #if optional_COMPILER_MSVC_VER >= 1900 # undef optional_CPP11_OR_GREATER # define optional_CPP11_OR_GREATER 1 #endif #define optional_CPP11_90 (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1500) #define optional_CPP11_100 (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1600) #define optional_CPP11_110 (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1700) #define optional_CPP11_120 (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1800) #define optional_CPP11_140 (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1900) #define optional_CPP11_141 (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1910) #define optional_CPP14_000 (optional_CPP14_OR_GREATER) #define optional_CPP17_000 (optional_CPP17_OR_GREATER) // clang >= 2.9, gcc >= 4.9, msvc >= vc14.0/1900 (vs15): #define optional_CPP11_140_C290_G490 ((optional_CPP11_OR_GREATER_ && (optional_COMPILER_CLANG_VERSION >= 290 || optional_COMPILER_GNUC_VERSION >= 490)) || (optional_COMPILER_MSVC_VER >= 1900)) // clang >= 3.5, msvc >= vc11 (vs12): #define optional_CPP11_110_C350 ( optional_CPP11_110 && !optional_BETWEEN( optional_COMPILER_CLANG_VERSION, 1, 350 ) ) // clang >= 3.5, gcc >= 5.0, msvc >= vc11 (vs12): #define optional_CPP11_110_C350_G500 \ ( optional_CPP11_110 && \ !( optional_BETWEEN( optional_COMPILER_CLANG_VERSION, 1, 350 ) \ || optional_BETWEEN( optional_COMPILER_GNUC_VERSION , 1, 500 ) ) ) // Presence of C++11 language features: #define optional_HAVE_CONSTEXPR_11 optional_CPP11_140 #define optional_HAVE_IS_DEFAULT optional_CPP11_140 #define optional_HAVE_NOEXCEPT optional_CPP11_140 #define optional_HAVE_NULLPTR optional_CPP11_100 #define optional_HAVE_REF_QUALIFIER optional_CPP11_140_C290_G490 #define optional_HAVE_STATIC_ASSERT optional_CPP11_110 #define optional_HAVE_INITIALIZER_LIST optional_CPP11_140 // Presence of C++14 language features: #define optional_HAVE_CONSTEXPR_14 optional_CPP14_000 // Presence of C++17 language features: #define optional_HAVE_NODISCARD optional_CPP17_000 // Presence of C++ library features: #define optional_HAVE_CONDITIONAL optional_CPP11_120 #define optional_HAVE_REMOVE_CV optional_CPP11_120 #define optional_HAVE_TYPE_TRAITS optional_CPP11_90 #define optional_HAVE_TR1_TYPE_TRAITS (!! optional_COMPILER_GNUC_VERSION ) #define optional_HAVE_TR1_ADD_POINTER (!! optional_COMPILER_GNUC_VERSION ) #define optional_HAVE_IS_ASSIGNABLE optional_CPP11_110_C350 #define optional_HAVE_IS_MOVE_CONSTRUCTIBLE optional_CPP11_110_C350 #define optional_HAVE_IS_NOTHROW_MOVE_ASSIGNABLE optional_CPP11_110_C350 #define optional_HAVE_IS_NOTHROW_MOVE_CONSTRUCTIBLE optional_CPP11_110_C350 #define optional_HAVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE optional_CPP11_110_C350_G500 #define optional_HAVE_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE optional_CPP11_110_C350_G500 // C++ feature usage: #if optional_HAVE( CONSTEXPR_11 ) # define optional_constexpr constexpr #else # define optional_constexpr /*constexpr*/ #endif #if optional_HAVE( IS_DEFAULT ) # define optional_is_default = default; #else # define optional_is_default {} #endif #if optional_HAVE( CONSTEXPR_14 ) # define optional_constexpr14 constexpr #else # define optional_constexpr14 /*constexpr*/ #endif #if optional_HAVE( NODISCARD ) # define optional_nodiscard [[nodiscard]] #else # define optional_nodiscard /*[[nodiscard]]*/ #endif #if optional_HAVE( NOEXCEPT ) # define optional_noexcept noexcept #else # define optional_noexcept /*noexcept*/ #endif #if optional_HAVE( NULLPTR ) # define optional_nullptr nullptr #else # define optional_nullptr NULL #endif #if optional_HAVE( REF_QUALIFIER ) // NOLINTNEXTLINE( bugprone-macro-parentheses ) # define optional_ref_qual & # define optional_refref_qual && #else # define optional_ref_qual /*&*/ # define optional_refref_qual /*&&*/ #endif #if optional_HAVE( STATIC_ASSERT ) # define optional_static_assert(expr, text) static_assert(expr, text); #else # define optional_static_assert(expr, text) /*static_assert(expr, text);*/ #endif // additional includes: #if optional_CONFIG_NO_EXCEPTIONS // already included: #else # include #endif #if optional_CPP11_OR_GREATER # include #endif #if optional_HAVE( INITIALIZER_LIST ) # include #endif #if optional_HAVE( TYPE_TRAITS ) # include #elif optional_HAVE( TR1_TYPE_TRAITS ) # include #endif // Method enabling #if optional_CPP11_OR_GREATER #define optional_REQUIRES_0(...) \ template< bool B = (__VA_ARGS__), typename std::enable_if::type = 0 > #define optional_REQUIRES_T(...) \ , typename std::enable_if< (__VA_ARGS__), int >::type = 0 #define optional_REQUIRES_R(R, ...) \ typename std::enable_if< (__VA_ARGS__), R>::type #define optional_REQUIRES_A(...) \ , typename std::enable_if< (__VA_ARGS__), void*>::type = nullptr #endif // // optional: // namespace nonstd { namespace optional_lite { namespace std11 { template< class T, T v > struct integral_constant { enum { value = v }; }; template< bool B > struct bool_constant : integral_constant{}; typedef bool_constant< true > true_type; typedef bool_constant< false > false_type; #if optional_CPP11_OR_GREATER using std::move; #else template< typename T > T & move( T & t ) { return t; } #endif #if optional_HAVE( CONDITIONAL ) using std::conditional; #else template< bool B, typename T, typename F > struct conditional { typedef T type; }; template< typename T, typename F > struct conditional { typedef F type; }; #endif // optional_HAVE_CONDITIONAL #if optional_HAVE( IS_ASSIGNABLE ) using std::is_assignable; #else template< class T, class U > struct is_assignable : std11::true_type{}; #endif #if optional_HAVE( IS_MOVE_CONSTRUCTIBLE ) using std::is_move_constructible; #else template< class T > struct is_move_constructible : std11::true_type{}; #endif #if optional_HAVE( IS_NOTHROW_MOVE_ASSIGNABLE ) using std::is_nothrow_move_assignable; #else template< class T > struct is_nothrow_move_assignable : std11::true_type{}; #endif #if optional_HAVE( IS_NOTHROW_MOVE_CONSTRUCTIBLE ) using std::is_nothrow_move_constructible; #else template< class T > struct is_nothrow_move_constructible : std11::true_type{}; #endif #if optional_HAVE( IS_TRIVIALLY_COPY_CONSTRUCTIBLE ) using std::is_trivially_copy_constructible; #else template< class T > struct is_trivially_copy_constructible : std11::true_type{}; #endif #if optional_HAVE( IS_TRIVIALLY_MOVE_CONSTRUCTIBLE ) using std::is_trivially_move_constructible; #else template< class T > struct is_trivially_move_constructible : std11::true_type{}; #endif } // namespace std11 #if optional_CPP11_OR_GREATER /// type traits C++17: namespace std17 { #if optional_CPP17_OR_GREATER using std::is_swappable; using std::is_nothrow_swappable; #elif optional_CPP11_OR_GREATER namespace detail { using std::swap; struct is_swappable { template< typename T, typename = decltype( swap( std::declval(), std::declval() ) ) > static std11::true_type test( int /*unused*/ ); template< typename > static std11::false_type test(...); }; struct is_nothrow_swappable { // wrap noexcept(expr) in separate function as work-around for VC140 (VS2015): template< typename T > static constexpr bool satisfies() { return noexcept( swap( std::declval(), std::declval() ) ); } template< typename T > static auto test( int /*unused*/ ) -> std11::integral_constant()>{} template< typename > static auto test(...) -> std11::false_type; }; } // namespace detail // is [nothow] swappable: template< typename T > struct is_swappable : decltype( detail::is_swappable::test(0) ){}; template< typename T > struct is_nothrow_swappable : decltype( detail::is_nothrow_swappable::test(0) ){}; #endif // optional_CPP17_OR_GREATER } // namespace std17 /// type traits C++20: namespace std20 { template< typename T > struct remove_cvref { typedef typename std::remove_cv< typename std::remove_reference::type >::type type; }; } // namespace std20 #endif // optional_CPP11_OR_GREATER /// class optional template< typename T > class optional; namespace detail { // C++11 emulation: struct nulltype{}; template< typename Head, typename Tail > struct typelist { typedef Head head; typedef Tail tail; }; #if optional_CONFIG_MAX_ALIGN_HACK // Max align, use most restricted type for alignment: #define optional_UNIQUE( name ) optional_UNIQUE2( name, __LINE__ ) #define optional_UNIQUE2( name, line ) optional_UNIQUE3( name, line ) #define optional_UNIQUE3( name, line ) name ## line #define optional_ALIGN_TYPE( type ) \ type optional_UNIQUE( _t ); struct_t< type > optional_UNIQUE( _st ) template< typename T > struct struct_t { T _; }; union max_align_t { optional_ALIGN_TYPE( char ); optional_ALIGN_TYPE( short int ); optional_ALIGN_TYPE( int ); optional_ALIGN_TYPE( long int ); optional_ALIGN_TYPE( float ); optional_ALIGN_TYPE( double ); optional_ALIGN_TYPE( long double ); optional_ALIGN_TYPE( char * ); optional_ALIGN_TYPE( short int * ); optional_ALIGN_TYPE( int * ); optional_ALIGN_TYPE( long int * ); optional_ALIGN_TYPE( float * ); optional_ALIGN_TYPE( double * ); optional_ALIGN_TYPE( long double * ); optional_ALIGN_TYPE( void * ); #ifdef HAVE_LONG_LONG optional_ALIGN_TYPE( long long ); #endif struct Unknown; Unknown ( * optional_UNIQUE(_) )( Unknown ); Unknown * Unknown::* optional_UNIQUE(_); Unknown ( Unknown::* optional_UNIQUE(_) )( Unknown ); struct_t< Unknown ( * )( Unknown) > optional_UNIQUE(_); struct_t< Unknown * Unknown::* > optional_UNIQUE(_); struct_t< Unknown ( Unknown::* )(Unknown) > optional_UNIQUE(_); }; #undef optional_UNIQUE #undef optional_UNIQUE2 #undef optional_UNIQUE3 #undef optional_ALIGN_TYPE #elif defined( optional_CONFIG_ALIGN_AS ) // optional_CONFIG_MAX_ALIGN_HACK // Use user-specified type for alignment: #define optional_ALIGN_AS( unused ) \ optional_CONFIG_ALIGN_AS #else // optional_CONFIG_MAX_ALIGN_HACK // Determine POD type to use for alignment: #define optional_ALIGN_AS( to_align ) \ typename type_of_size< alignment_types, alignment_of< to_align >::value >::type template< typename T > struct alignment_of; template< typename T > struct alignment_of_hack { char c; T t; alignment_of_hack(); }; template< size_t A, size_t S > struct alignment_logic { enum { value = A < S ? A : S }; }; template< typename T > struct alignment_of { enum { value = alignment_logic< sizeof( alignment_of_hack ) - sizeof(T), sizeof(T) >::value }; }; template< typename List, size_t N > struct type_of_size { typedef typename std11::conditional< N == sizeof( typename List::head ), typename List::head, typename type_of_size::type >::type type; }; template< size_t N > struct type_of_size< nulltype, N > { typedef optional_CONFIG_ALIGN_AS_FALLBACK type; }; template< typename T> struct struct_t { T _; }; #define optional_ALIGN_TYPE( type ) \ typelist< type , typelist< struct_t< type > struct Unknown; typedef optional_ALIGN_TYPE( char ), optional_ALIGN_TYPE( short ), optional_ALIGN_TYPE( int ), optional_ALIGN_TYPE( long ), optional_ALIGN_TYPE( float ), optional_ALIGN_TYPE( double ), optional_ALIGN_TYPE( long double ), optional_ALIGN_TYPE( char *), optional_ALIGN_TYPE( short * ), optional_ALIGN_TYPE( int * ), optional_ALIGN_TYPE( long * ), optional_ALIGN_TYPE( float * ), optional_ALIGN_TYPE( double * ), optional_ALIGN_TYPE( long double * ), optional_ALIGN_TYPE( Unknown ( * )( Unknown ) ), optional_ALIGN_TYPE( Unknown * Unknown::* ), optional_ALIGN_TYPE( Unknown ( Unknown::* )( Unknown ) ), nulltype > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > alignment_types; #undef optional_ALIGN_TYPE #endif // optional_CONFIG_MAX_ALIGN_HACK /// C++03 constructed union to hold value. template< typename T > union storage_t { //private: // template< typename > friend class optional; typedef T value_type; storage_t() optional_is_default explicit storage_t( value_type const & v ) { construct_value( v ); } void construct_value( value_type const & v ) { ::new( value_ptr() ) value_type( v ); } #if optional_CPP11_OR_GREATER explicit storage_t( value_type && v ) { construct_value( std::move( v ) ); } void construct_value( value_type && v ) { ::new( value_ptr() ) value_type( std::move( v ) ); } template< class... Args > storage_t( nonstd_lite_in_place_t(T), Args&&... args ) { emplace( std::forward(args)... ); } template< class... Args > void emplace( Args&&... args ) { ::new( value_ptr() ) value_type( std::forward(args)... ); } template< class U, class... Args > void emplace( std::initializer_list il, Args&&... args ) { ::new( value_ptr() ) value_type( il, std::forward(args)... ); } #endif void destruct_value() { value_ptr()->~T(); } optional_nodiscard value_type const * value_ptr() const { return as(); } value_type * value_ptr() { return as(); } optional_nodiscard value_type const & value() const optional_ref_qual { return * value_ptr(); } value_type & value() optional_ref_qual { return * value_ptr(); } #if optional_HAVE( REF_QUALIFIER ) optional_nodiscard value_type const && value() const optional_refref_qual { return std::move( value() ); } value_type && value() optional_refref_qual { return std::move( value() ); } #endif #if optional_CPP11_OR_GREATER using aligned_storage_t = typename std::aligned_storage< sizeof(value_type), alignof(value_type) >::type; aligned_storage_t data; #elif optional_CONFIG_MAX_ALIGN_HACK typedef struct { unsigned char data[ sizeof(value_type) ]; } aligned_storage_t; max_align_t hack; aligned_storage_t data; #else typedef optional_ALIGN_AS(value_type) align_as_type; typedef struct { align_as_type data[ 1 + ( sizeof(value_type) - 1 ) / sizeof(align_as_type) ]; } aligned_storage_t; aligned_storage_t data; # undef optional_ALIGN_AS #endif // optional_CONFIG_MAX_ALIGN_HACK optional_nodiscard void * ptr() optional_noexcept { return &data; } optional_nodiscard void const * ptr() const optional_noexcept { return &data; } template optional_nodiscard U * as() { return reinterpret_cast( ptr() ); } template optional_nodiscard U const * as() const { return reinterpret_cast( ptr() ); } }; } // namespace detail /// disengaged state tag struct nullopt_t { struct init{}; explicit optional_constexpr nullopt_t( init /*unused*/ ) optional_noexcept {} }; #if optional_HAVE( CONSTEXPR_11 ) constexpr nullopt_t nullopt{ nullopt_t::init{} }; #else // extra parenthesis to prevent the most vexing parse: const nullopt_t nullopt(( nullopt_t::init() )); #endif /// optional access error #if ! optional_CONFIG_NO_EXCEPTIONS class bad_optional_access : public std::logic_error { public: explicit bad_optional_access() : logic_error( "bad optional access" ) {} }; #endif //optional_CONFIG_NO_EXCEPTIONS /// optional template< typename T> class optional { optional_static_assert(( !std::is_same::type, nullopt_t>::value ), "T in optional must not be of type 'nullopt_t'.") optional_static_assert(( !std::is_same::type, in_place_t>::value ), "T in optional must not be of type 'in_place_t'.") optional_static_assert(( std::is_object::value && std::is_destructible::value && !std::is_array::value ), "T in optional must meet the Cpp17Destructible requirements.") private: template< typename > friend class optional; typedef void (optional::*safe_bool)() const; public: typedef T value_type; // x.x.3.1, constructors // 1a - default construct optional_constexpr optional() optional_noexcept : has_value_( false ) , contained() {} // 1b - construct explicitly empty // NOLINTNEXTLINE( google-explicit-constructor, hicpp-explicit-conversions ) optional_constexpr optional( nullopt_t /*unused*/ ) optional_noexcept : has_value_( false ) , contained() {} // 2 - copy-construct #if optional_CPP11_OR_GREATER // template< typename U = T // optional_REQUIRES_T( // std::is_copy_constructible::value // || std11::is_trivially_copy_constructible::value // ) // > #endif optional_constexpr14 optional( optional const & other ) : has_value_( other.has_value() ) { if ( other.has_value() ) { contained.construct_value( other.contained.value() ); } } #if optional_CPP11_OR_GREATER // 3 (C++11) - move-construct from optional template< typename U = T optional_REQUIRES_T( std11::is_move_constructible::value || std11::is_trivially_move_constructible::value ) > optional_constexpr14 optional( optional && other ) // NOLINTNEXTLINE( performance-noexcept-move-constructor ) noexcept( std11::is_nothrow_move_constructible::value ) : has_value_( other.has_value() ) { if ( other.has_value() ) { contained.construct_value( std::move( other.contained.value() ) ); } } // 4a (C++11) - explicit converting copy-construct from optional template< typename U optional_REQUIRES_T( std::is_constructible::value && !std::is_constructible & >::value && !std::is_constructible && >::value && !std::is_constructible const & >::value && !std::is_constructible const && >::value && !std::is_convertible< optional & , T>::value && !std::is_convertible< optional && , T>::value && !std::is_convertible< optional const & , T>::value && !std::is_convertible< optional const &&, T>::value && !std::is_convertible< U const & , T>::value /*=> explicit */ ) > explicit optional( optional const & other ) : has_value_( other.has_value() ) { if ( other.has_value() ) { contained.construct_value( T{ other.contained.value() } ); } } #endif // optional_CPP11_OR_GREATER // 4b (C++98 and later) - non-explicit converting copy-construct from optional template< typename U #if optional_CPP11_OR_GREATER optional_REQUIRES_T( std::is_constructible::value && !std::is_constructible & >::value && !std::is_constructible && >::value && !std::is_constructible const & >::value && !std::is_constructible const && >::value && !std::is_convertible< optional & , T>::value && !std::is_convertible< optional && , T>::value && !std::is_convertible< optional const & , T>::value && !std::is_convertible< optional const &&, T>::value && std::is_convertible< U const & , T>::value /*=> non-explicit */ ) #endif // optional_CPP11_OR_GREATER > // NOLINTNEXTLINE( google-explicit-constructor, hicpp-explicit-conversions ) /*non-explicit*/ optional( optional const & other ) : has_value_( other.has_value() ) { if ( other.has_value() ) { contained.construct_value( other.contained.value() ); } } #if optional_CPP11_OR_GREATER // 5a (C++11) - explicit converting move-construct from optional template< typename U optional_REQUIRES_T( std::is_constructible::value && !std::is_constructible & >::value && !std::is_constructible && >::value && !std::is_constructible const & >::value && !std::is_constructible const && >::value && !std::is_convertible< optional & , T>::value && !std::is_convertible< optional && , T>::value && !std::is_convertible< optional const & , T>::value && !std::is_convertible< optional const &&, T>::value && !std::is_convertible< U &&, T>::value /*=> explicit */ ) > explicit optional( optional && other ) : has_value_( other.has_value() ) { if ( other.has_value() ) { contained.construct_value( T{ std::move( other.contained.value() ) } ); } } // 5a (C++11) - non-explicit converting move-construct from optional template< typename U optional_REQUIRES_T( std::is_constructible::value && !std::is_constructible & >::value && !std::is_constructible && >::value && !std::is_constructible const & >::value && !std::is_constructible const && >::value && !std::is_convertible< optional & , T>::value && !std::is_convertible< optional && , T>::value && !std::is_convertible< optional const & , T>::value && !std::is_convertible< optional const &&, T>::value && std::is_convertible< U &&, T>::value /*=> non-explicit */ ) > // NOLINTNEXTLINE( google-explicit-constructor, hicpp-explicit-conversions ) /*non-explicit*/ optional( optional && other ) : has_value_( other.has_value() ) { if ( other.has_value() ) { contained.construct_value( std::move( other.contained.value() ) ); } } // 6 (C++11) - in-place construct template< typename... Args optional_REQUIRES_T( std::is_constructible::value ) > optional_constexpr explicit optional( nonstd_lite_in_place_t(T), Args&&... args ) : has_value_( true ) , contained( in_place, std::forward(args)... ) {} // 7 (C++11) - in-place construct, initializer-list template< typename U, typename... Args optional_REQUIRES_T( std::is_constructible&, Args&&...>::value ) > optional_constexpr explicit optional( nonstd_lite_in_place_t(T), std::initializer_list il, Args&&... args ) : has_value_( true ) , contained( T( il, std::forward(args)...) ) {} // 8a (C++11) - explicit move construct from value template< typename U = T optional_REQUIRES_T( std::is_constructible::value && !std::is_same::type, nonstd_lite_in_place_t(U)>::value && !std::is_same::type, optional>::value && !std::is_convertible::value /*=> explicit */ ) > optional_constexpr explicit optional( U && value ) : has_value_( true ) , contained( nonstd_lite_in_place(T), std::forward( value ) ) {} // 8b (C++11) - non-explicit move construct from value template< typename U = T optional_REQUIRES_T( std::is_constructible::value && !std::is_same::type, nonstd_lite_in_place_t(U)>::value && !std::is_same::type, optional>::value && std::is_convertible::value /*=> non-explicit */ ) > // NOLINTNEXTLINE( google-explicit-constructor, hicpp-explicit-conversions ) optional_constexpr /*non-explicit*/ optional( U && value ) : has_value_( true ) , contained( nonstd_lite_in_place(T), std::forward( value ) ) {} #else // optional_CPP11_OR_GREATER // 8 (C++98) optional( value_type const & value ) : has_value_( true ) , contained( value ) {} #endif // optional_CPP11_OR_GREATER // x.x.3.2, destructor ~optional() { if ( has_value() ) { contained.destruct_value(); } } // x.x.3.3, assignment // 1 (C++98and later) - assign explicitly empty optional & operator=( nullopt_t /*unused*/) optional_noexcept { reset(); return *this; } // 2 (C++98and later) - copy-assign from optional #if optional_CPP11_OR_GREATER // NOLINTNEXTLINE( cppcoreguidelines-c-copy-assignment-signature, misc-unconventional-assign-operator ) optional_REQUIRES_R( optional &, true // std::is_copy_constructible::value // && std::is_copy_assignable::value ) operator=( optional const & other ) noexcept( std11::is_nothrow_move_assignable::value && std11::is_nothrow_move_constructible::value ) #else optional & operator=( optional const & other ) #endif { if ( (has_value() == true ) && (other.has_value() == false) ) { reset(); } else if ( (has_value() == false) && (other.has_value() == true ) ) { initialize( *other ); } else if ( (has_value() == true ) && (other.has_value() == true ) ) { contained.value() = *other; } return *this; } #if optional_CPP11_OR_GREATER // 3 (C++11) - move-assign from optional // NOLINTNEXTLINE( cppcoreguidelines-c-copy-assignment-signature, misc-unconventional-assign-operator ) optional_REQUIRES_R( optional &, true // std11::is_move_constructible::value // && std::is_move_assignable::value ) operator=( optional && other ) noexcept { if ( (has_value() == true ) && (other.has_value() == false) ) { reset(); } else if ( (has_value() == false) && (other.has_value() == true ) ) { initialize( std::move( *other ) ); } else if ( (has_value() == true ) && (other.has_value() == true ) ) { contained.value() = std::move( *other ); } return *this; } // 4 (C++11) - move-assign from value template< typename U = T > // NOLINTNEXTLINE( cppcoreguidelines-c-copy-assignment-signature, misc-unconventional-assign-operator ) optional_REQUIRES_R( optional &, std::is_constructible::value && std11::is_assignable::value && !std::is_same::type, nonstd_lite_in_place_t(U)>::value && !std::is_same::type, optional>::value && !(std::is_scalar::value && std::is_same::type>::value) ) operator=( U && value ) { if ( has_value() ) { contained.value() = std::forward( value ); } else { initialize( T( std::forward( value ) ) ); } return *this; } #else // optional_CPP11_OR_GREATER // 4 (C++98) - copy-assign from value template< typename U /*= T*/ > optional & operator=( U const & value ) { if ( has_value() ) contained.value() = value; else initialize( T( value ) ); return *this; } #endif // optional_CPP11_OR_GREATER // 5 (C++98 and later) - converting copy-assign from optional template< typename U > #if optional_CPP11_OR_GREATER // NOLINTNEXTLINE( cppcoreguidelines-c-copy-assignment-signature, misc-unconventional-assign-operator ) optional_REQUIRES_R( optional&, std::is_constructible< T , U const &>::value && std11::is_assignable< T&, U const &>::value && !std::is_constructible & >::value && !std::is_constructible && >::value && !std::is_constructible const & >::value && !std::is_constructible const && >::value && !std::is_convertible< optional & , T>::value && !std::is_convertible< optional && , T>::value && !std::is_convertible< optional const & , T>::value && !std::is_convertible< optional const &&, T>::value && !std11::is_assignable< T&, optional & >::value && !std11::is_assignable< T&, optional && >::value && !std11::is_assignable< T&, optional const & >::value && !std11::is_assignable< T&, optional const && >::value ) #else optional& #endif // optional_CPP11_OR_GREATER operator=( optional const & other ) { return *this = optional( other ); } #if optional_CPP11_OR_GREATER // 6 (C++11) - converting move-assign from optional template< typename U > // NOLINTNEXTLINE( cppcoreguidelines-c-copy-assignment-signature, misc-unconventional-assign-operator ) optional_REQUIRES_R( optional&, std::is_constructible< T , U>::value && std11::is_assignable< T&, U>::value && !std::is_constructible & >::value && !std::is_constructible && >::value && !std::is_constructible const & >::value && !std::is_constructible const && >::value && !std::is_convertible< optional & , T>::value && !std::is_convertible< optional && , T>::value && !std::is_convertible< optional const & , T>::value && !std::is_convertible< optional const &&, T>::value && !std11::is_assignable< T&, optional & >::value && !std11::is_assignable< T&, optional && >::value && !std11::is_assignable< T&, optional const & >::value && !std11::is_assignable< T&, optional const && >::value ) operator=( optional && other ) { return *this = optional( std::move( other ) ); } // 7 (C++11) - emplace template< typename... Args optional_REQUIRES_T( std::is_constructible::value ) > T& emplace( Args&&... args ) { *this = nullopt; contained.emplace( std::forward(args)... ); has_value_ = true; return contained.value(); } // 8 (C++11) - emplace, initializer-list template< typename U, typename... Args optional_REQUIRES_T( std::is_constructible&, Args&&...>::value ) > T& emplace( std::initializer_list il, Args&&... args ) { *this = nullopt; contained.emplace( il, std::forward(args)... ); has_value_ = true; return contained.value(); } #endif // optional_CPP11_OR_GREATER // x.x.3.4, swap void swap( optional & other ) #if optional_CPP11_OR_GREATER noexcept( std11::is_nothrow_move_constructible::value && std17::is_nothrow_swappable::value ) #endif { using std::swap; if ( (has_value() == true ) && (other.has_value() == true ) ) { swap( **this, *other ); } else if ( (has_value() == false) && (other.has_value() == true ) ) { initialize( std11::move(*other) ); other.reset(); } else if ( (has_value() == true ) && (other.has_value() == false) ) { other.initialize( std11::move(**this) ); reset(); } } // x.x.3.5, observers optional_constexpr value_type const * operator ->() const { return assert( has_value() ), contained.value_ptr(); } optional_constexpr14 value_type * operator ->() { return assert( has_value() ), contained.value_ptr(); } optional_constexpr value_type const & operator *() const optional_ref_qual { return assert( has_value() ), contained.value(); } optional_constexpr14 value_type & operator *() optional_ref_qual { return assert( has_value() ), contained.value(); } #if optional_HAVE( REF_QUALIFIER ) optional_constexpr value_type const && operator *() const optional_refref_qual { return std::move( **this ); } optional_constexpr14 value_type && operator *() optional_refref_qual { return std::move( **this ); } #endif #if optional_CPP11_OR_GREATER optional_constexpr explicit operator bool() const optional_noexcept { return has_value(); } #else optional_constexpr operator safe_bool() const optional_noexcept { return has_value() ? &optional::this_type_does_not_support_comparisons : 0; } #endif // NOLINTNEXTLINE( modernize-use-nodiscard ) /*optional_nodiscard*/ optional_constexpr bool has_value() const optional_noexcept { return has_value_; } // NOLINTNEXTLINE( modernize-use-nodiscard ) /*optional_nodiscard*/ optional_constexpr14 value_type const & value() const optional_ref_qual { #if optional_CONFIG_NO_EXCEPTIONS assert( has_value() ); #else if ( ! has_value() ) { throw bad_optional_access(); } #endif return contained.value(); } optional_constexpr14 value_type & value() optional_ref_qual { #if optional_CONFIG_NO_EXCEPTIONS assert( has_value() ); #else if ( ! has_value() ) { throw bad_optional_access(); } #endif return contained.value(); } #if optional_HAVE( REF_QUALIFIER ) && ( !optional_COMPILER_GNUC_VERSION || optional_COMPILER_GNUC_VERSION >= 490 ) // NOLINTNEXTLINE( modernize-use-nodiscard ) /*optional_nodiscard*/ optional_constexpr value_type const && value() const optional_refref_qual { return std::move( value() ); } optional_constexpr14 value_type && value() optional_refref_qual { return std::move( value() ); } #endif #if optional_HAVE( REF_QUALIFIER ) template< typename U > optional_constexpr value_type value_or( U && v ) const optional_ref_qual { return has_value() ? contained.value() : static_cast(std::forward( v ) ); } template< typename U > optional_constexpr14 value_type value_or( U && v ) optional_refref_qual { #if optional_COMPILER_CLANG_VERSION return has_value() ? /*std::move*/( contained.value() ) : static_cast(std::forward( v ) ); #else return has_value() ? std::move( contained.value() ) : static_cast(std::forward( v ) ); #endif } #else template< typename U > optional_constexpr value_type value_or( U const & v ) const { return has_value() ? contained.value() : static_cast( v ); } #endif // optional_HAVE( REF_QUALIFIER ) #if !optional_CONFIG_NO_EXTENSIONS #if optional_HAVE( REF_QUALIFIER ) template< typename F > optional_constexpr value_type value_or_eval( F f ) const & { return has_value() ? contained.value() : f(); } template< typename F > optional_constexpr14 value_type value_or_eval( F f ) && { if ( has_value() ) { return std::move( contained.value() ); } else { return f(); } } #else template< typename F > optional_constexpr value_type value_or_eval( F f ) const { return has_value() ? contained.value() : f(); } #endif // optional_HAVE( REF_QUALIFIER ) #endif // !optional_CONFIG_NO_EXTENSIONS // x.x.3.6, modifiers void reset() optional_noexcept { if ( has_value() ) { contained.destruct_value(); } has_value_ = false; } private: void this_type_does_not_support_comparisons() const {} template< typename V > void initialize( V const & value ) { assert( ! has_value() ); contained.construct_value( value ); has_value_ = true; } #if optional_CPP11_OR_GREATER template< typename V > void initialize( V && value ) { assert( ! has_value() ); contained.construct_value( std::move( value ) ); has_value_ = true; } #endif private: bool has_value_; detail::storage_t< value_type > contained; }; // Relational operators template< typename T, typename U > optional_nodiscard optional_constexpr bool operator==( optional const & x, optional const & y ) { return bool(x) != bool(y) ? false : !bool( x ) ? true : *x == *y; } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator!=( optional const & x, optional const & y ) { return !(x == y); } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator<( optional const & x, optional const & y ) { return (!y) ? false : (!x) ? true : *x < *y; } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator>( optional const & x, optional const & y ) { return (y < x); } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator<=( optional const & x, optional const & y ) { return !(y < x); } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator>=( optional const & x, optional const & y ) { return !(x < y); } // Comparison with nullopt template< typename T > optional_nodiscard optional_constexpr bool operator==( optional const & x, nullopt_t /*unused*/ ) optional_noexcept { return (!x); } template< typename T > optional_nodiscard optional_constexpr bool operator==( nullopt_t /*unused*/, optional const & x ) optional_noexcept { return (!x); } template< typename T > optional_nodiscard optional_constexpr bool operator!=( optional const & x, nullopt_t /*unused*/ ) optional_noexcept { return bool(x); } template< typename T > optional_nodiscard optional_constexpr bool operator!=( nullopt_t /*unused*/, optional const & x ) optional_noexcept { return bool(x); } template< typename T > optional_nodiscard optional_constexpr bool operator<( optional const & /*unused*/, nullopt_t /*unused*/ ) optional_noexcept { return false; } template< typename T > optional_nodiscard optional_constexpr bool operator<( nullopt_t /*unused*/, optional const & x ) optional_noexcept { return bool(x); } template< typename T > optional_nodiscard optional_constexpr bool operator<=( optional const & x, nullopt_t /*unused*/ ) optional_noexcept { return (!x); } template< typename T > optional_nodiscard optional_constexpr bool operator<=( nullopt_t /*unused*/, optional const & /*unused*/ ) optional_noexcept { return true; } template< typename T > optional_nodiscard optional_constexpr bool operator>( optional const & x, nullopt_t /*unused*/ ) optional_noexcept { return bool(x); } template< typename T > optional_nodiscard optional_constexpr bool operator>( nullopt_t /*unused*/, optional const & /*unused*/ ) optional_noexcept { return false; } template< typename T > optional_nodiscard optional_constexpr bool operator>=( optional const & /*unused*/, nullopt_t /*unused*/ ) optional_noexcept { return true; } template< typename T > optional_nodiscard optional_constexpr bool operator>=( nullopt_t /*unused*/, optional const & x ) optional_noexcept { return (!x); } // Comparison with T template< typename T, typename U > optional_nodiscard optional_constexpr bool operator==( optional const & x, U const & v ) { return bool(x) ? *x == v : false; } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator==( U const & v, optional const & x ) { return bool(x) ? v == *x : false; } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator!=( optional const & x, U const & v ) { return bool(x) ? *x != v : true; } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator!=( U const & v, optional const & x ) { return bool(x) ? v != *x : true; } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator<( optional const & x, U const & v ) { return bool(x) ? *x < v : true; } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator<( U const & v, optional const & x ) { return bool(x) ? v < *x : false; } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator<=( optional const & x, U const & v ) { return bool(x) ? *x <= v : true; } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator<=( U const & v, optional const & x ) { return bool(x) ? v <= *x : false; } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator>( optional const & x, U const & v ) { return bool(x) ? *x > v : false; } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator>( U const & v, optional const & x ) { return bool(x) ? v > *x : true; } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator>=( optional const & x, U const & v ) { return bool(x) ? *x >= v : false; } template< typename T, typename U > optional_nodiscard optional_constexpr bool operator>=( U const & v, optional const & x ) { return bool(x) ? v >= *x : true; } // Specialized algorithms template< typename T #if optional_CPP11_OR_GREATER optional_REQUIRES_T( std11::is_move_constructible::value && std17::is_swappable::value ) #endif > void swap( optional & x, optional & y ) #if optional_CPP11_OR_GREATER noexcept( noexcept( x.swap(y) ) ) #endif { x.swap( y ); } #if optional_CPP11_OR_GREATER template< typename T > optional_constexpr optional< typename std::decay::type > make_optional( T && value ) { return optional< typename std::decay::type >( std::forward( value ) ); } template< typename T, typename...Args > optional_constexpr optional make_optional( Args&&... args ) { return optional( nonstd_lite_in_place(T), std::forward(args)...); } template< typename T, typename U, typename... Args > optional_constexpr optional make_optional( std::initializer_list il, Args&&... args ) { return optional( nonstd_lite_in_place(T), il, std::forward(args)...); } #else template< typename T > optional make_optional( T const & value ) { return optional( value ); } #endif // optional_CPP11_OR_GREATER } // namespace optional_lite using optional_lite::optional; using optional_lite::nullopt_t; using optional_lite::nullopt; #if ! optional_CONFIG_NO_EXCEPTIONS using optional_lite::bad_optional_access; #endif using optional_lite::make_optional; } // namespace nonstd #if optional_CPP11_OR_GREATER // specialize the std::hash algorithm: namespace std { template< class T > struct hash< nonstd::optional > { public: std::size_t operator()( nonstd::optional const & v ) const optional_noexcept { return bool( v ) ? std::hash{}( *v ) : 0; } }; } //namespace std #endif // optional_CPP11_OR_GREATER #if defined(__clang__) # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #elif defined(_MSC_VER ) # pragma warning( pop ) #endif #endif // optional_USES_STD_OPTIONAL #endif // NONSTD_OPTIONAL_LITE_HPP asymptote-3.05/backports/optional/CMakeLists.txt0000644000000000000000000000030315031566105020537 0ustar rootrootcmake_minimum_required(VERSION 3.27) project(OptionalBackport) add_library(OptionalBackport INTERFACE) target_include_directories(OptionalBackport INTERFACE ${CMAKE_CURRENT_LIST_DIR}/include/) asymptote-3.05/backports/glew/0000755000000000000000000000000015031566105015114 5ustar rootrootasymptote-3.05/backports/glew/include/0000755000000000000000000000000015031566105016537 5ustar rootrootasymptote-3.05/backports/glew/include/GL/0000755000000000000000000000000015031566105017041 5ustar rootrootasymptote-3.05/backports/glew/include/GL/wglew.h0000644000000000000000000017352215031566105020351 0ustar rootroot/* ** The OpenGL Extension Wrangler Library ** Copyright (C) 2008-2017, Nigel Stewart ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** ** * Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** * The name of the author may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ** THE POSSIBILITY OF SUCH DAMAGE. */ /* ** Copyright (c) 2007 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be included ** in all copies or substantial portions of the Materials. ** ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ #ifndef __wglew_h__ #define __wglew_h__ #define __WGLEW_H__ #ifdef __wglext_h_ #error wglext.h included before wglew.h #endif #define __wglext_h_ #if !defined(WINAPI) # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN 1 # endif #include # undef WIN32_LEAN_AND_MEAN #endif /* * GLEW_STATIC needs to be set when using the static version. * GLEW_BUILD is set when building the DLL version. */ #ifdef GLEW_STATIC # define GLEWAPI extern #else # ifdef GLEW_BUILD # define GLEWAPI extern __declspec(dllexport) # else # define GLEWAPI extern __declspec(dllimport) # endif #endif #ifdef __cplusplus extern "C" { #endif /* -------------------------- WGL_3DFX_multisample ------------------------- */ #ifndef WGL_3DFX_multisample #define WGL_3DFX_multisample 1 #define WGL_SAMPLE_BUFFERS_3DFX 0x2060 #define WGL_SAMPLES_3DFX 0x2061 #define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample) #endif /* WGL_3DFX_multisample */ /* ------------------------- WGL_3DL_stereo_control ------------------------ */ #ifndef WGL_3DL_stereo_control #define WGL_3DL_stereo_control 1 #define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 #define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 #define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 #define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); #define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL) #define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control) #endif /* WGL_3DL_stereo_control */ /* ------------------------ WGL_AMD_gpu_association ------------------------ */ #ifndef WGL_AMD_gpu_association #define WGL_AMD_gpu_association 1 #define WGL_GPU_VENDOR_AMD 0x1F00 #define WGL_GPU_RENDERER_STRING_AMD 0x1F01 #define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 #define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 #define WGL_GPU_RAM_AMD 0x21A3 #define WGL_GPU_CLOCK_AMD 0x21A4 #define WGL_GPU_NUM_PIPES_AMD 0x21A5 #define WGL_GPU_NUM_SIMD_AMD 0x21A6 #define WGL_GPU_NUM_RB_AMD 0x21A7 #define WGL_GPU_NUM_SPI_AMD 0x21A8 typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id); typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList); typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc); typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc); typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids); typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data); typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc); #define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD) #define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD) #define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD) #define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD) #define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD) #define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD) #define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD) #define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD) #define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD) #define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association) #endif /* WGL_AMD_gpu_association */ /* ------------------------- WGL_ARB_buffer_region ------------------------- */ #ifndef WGL_ARB_buffer_region #define WGL_ARB_buffer_region 1 #define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 #define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 #define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 #define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); #define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB) #define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB) #define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB) #define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB) #define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region) #endif /* WGL_ARB_buffer_region */ /* --------------------- WGL_ARB_context_flush_control --------------------- */ #ifndef WGL_ARB_context_flush_control #define WGL_ARB_context_flush_control 1 #define WGLEW_ARB_context_flush_control WGLEW_GET_VAR(__WGLEW_ARB_context_flush_control) #endif /* WGL_ARB_context_flush_control */ /* ------------------------- WGL_ARB_create_context ------------------------ */ #ifndef WGL_ARB_create_context #define WGL_ARB_create_context 1 #define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 #define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 #define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 #define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 #define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 #define WGL_CONTEXT_FLAGS_ARB 0x2094 #define ERROR_INVALID_VERSION_ARB 0x2095 #define ERROR_INVALID_PROFILE_ARB 0x2096 typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList); #define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB) #define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context) #endif /* WGL_ARB_create_context */ /* -------------------- WGL_ARB_create_context_no_error -------------------- */ #ifndef WGL_ARB_create_context_no_error #define WGL_ARB_create_context_no_error 1 #define WGLEW_ARB_create_context_no_error WGLEW_GET_VAR(__WGLEW_ARB_create_context_no_error) #endif /* WGL_ARB_create_context_no_error */ /* --------------------- WGL_ARB_create_context_profile -------------------- */ #ifndef WGL_ARB_create_context_profile #define WGL_ARB_create_context_profile 1 #define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 #define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 #define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 #define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile) #endif /* WGL_ARB_create_context_profile */ /* ------------------- WGL_ARB_create_context_robustness ------------------- */ #ifndef WGL_ARB_create_context_robustness #define WGL_ARB_create_context_robustness 1 #define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 #define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 #define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 #define WGL_NO_RESET_NOTIFICATION_ARB 0x8261 #define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness) #endif /* WGL_ARB_create_context_robustness */ /* ----------------------- WGL_ARB_extensions_string ----------------------- */ #ifndef WGL_ARB_extensions_string #define WGL_ARB_extensions_string 1 typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); #define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB) #define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string) #endif /* WGL_ARB_extensions_string */ /* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */ #ifndef WGL_ARB_framebuffer_sRGB #define WGL_ARB_framebuffer_sRGB 1 #define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 #define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB) #endif /* WGL_ARB_framebuffer_sRGB */ /* ----------------------- WGL_ARB_make_current_read ----------------------- */ #ifndef WGL_ARB_make_current_read #define WGL_ARB_make_current_read 1 #define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 #define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID); typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); #define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB) #define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB) #define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read) #endif /* WGL_ARB_make_current_read */ /* -------------------------- WGL_ARB_multisample -------------------------- */ #ifndef WGL_ARB_multisample #define WGL_ARB_multisample 1 #define WGL_SAMPLE_BUFFERS_ARB 0x2041 #define WGL_SAMPLES_ARB 0x2042 #define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample) #endif /* WGL_ARB_multisample */ /* ---------------------------- WGL_ARB_pbuffer ---------------------------- */ #ifndef WGL_ARB_pbuffer #define WGL_ARB_pbuffer 1 #define WGL_DRAW_TO_PBUFFER_ARB 0x202D #define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E #define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F #define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 #define WGL_PBUFFER_LARGEST_ARB 0x2033 #define WGL_PBUFFER_WIDTH_ARB 0x2034 #define WGL_PBUFFER_HEIGHT_ARB 0x2035 #define WGL_PBUFFER_LOST_ARB 0x2036 DECLARE_HANDLE(HPBUFFERARB); typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue); typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); #define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB) #define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB) #define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB) #define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB) #define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB) #define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer) #endif /* WGL_ARB_pbuffer */ /* -------------------------- WGL_ARB_pixel_format ------------------------- */ #ifndef WGL_ARB_pixel_format #define WGL_ARB_pixel_format 1 #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 #define WGL_DRAW_TO_WINDOW_ARB 0x2001 #define WGL_DRAW_TO_BITMAP_ARB 0x2002 #define WGL_ACCELERATION_ARB 0x2003 #define WGL_NEED_PALETTE_ARB 0x2004 #define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 #define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 #define WGL_SWAP_METHOD_ARB 0x2007 #define WGL_NUMBER_OVERLAYS_ARB 0x2008 #define WGL_NUMBER_UNDERLAYS_ARB 0x2009 #define WGL_TRANSPARENT_ARB 0x200A #define WGL_SHARE_DEPTH_ARB 0x200C #define WGL_SHARE_STENCIL_ARB 0x200D #define WGL_SHARE_ACCUM_ARB 0x200E #define WGL_SUPPORT_GDI_ARB 0x200F #define WGL_SUPPORT_OPENGL_ARB 0x2010 #define WGL_DOUBLE_BUFFER_ARB 0x2011 #define WGL_STEREO_ARB 0x2012 #define WGL_PIXEL_TYPE_ARB 0x2013 #define WGL_COLOR_BITS_ARB 0x2014 #define WGL_RED_BITS_ARB 0x2015 #define WGL_RED_SHIFT_ARB 0x2016 #define WGL_GREEN_BITS_ARB 0x2017 #define WGL_GREEN_SHIFT_ARB 0x2018 #define WGL_BLUE_BITS_ARB 0x2019 #define WGL_BLUE_SHIFT_ARB 0x201A #define WGL_ALPHA_BITS_ARB 0x201B #define WGL_ALPHA_SHIFT_ARB 0x201C #define WGL_ACCUM_BITS_ARB 0x201D #define WGL_ACCUM_RED_BITS_ARB 0x201E #define WGL_ACCUM_GREEN_BITS_ARB 0x201F #define WGL_ACCUM_BLUE_BITS_ARB 0x2020 #define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 #define WGL_DEPTH_BITS_ARB 0x2022 #define WGL_STENCIL_BITS_ARB 0x2023 #define WGL_AUX_BUFFERS_ARB 0x2024 #define WGL_NO_ACCELERATION_ARB 0x2025 #define WGL_GENERIC_ACCELERATION_ARB 0x2026 #define WGL_FULL_ACCELERATION_ARB 0x2027 #define WGL_SWAP_EXCHANGE_ARB 0x2028 #define WGL_SWAP_COPY_ARB 0x2029 #define WGL_SWAP_UNDEFINED_ARB 0x202A #define WGL_TYPE_RGBA_ARB 0x202B #define WGL_TYPE_COLORINDEX_ARB 0x202C #define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 #define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 #define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 #define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A #define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues); #define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB) #define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB) #define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB) #define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format) #endif /* WGL_ARB_pixel_format */ /* ----------------------- WGL_ARB_pixel_format_float ---------------------- */ #ifndef WGL_ARB_pixel_format_float #define WGL_ARB_pixel_format_float 1 #define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 #define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float) #endif /* WGL_ARB_pixel_format_float */ /* ------------------------- WGL_ARB_render_texture ------------------------ */ #ifndef WGL_ARB_render_texture #define WGL_ARB_render_texture 1 #define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 #define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 #define WGL_TEXTURE_FORMAT_ARB 0x2072 #define WGL_TEXTURE_TARGET_ARB 0x2073 #define WGL_MIPMAP_TEXTURE_ARB 0x2074 #define WGL_TEXTURE_RGB_ARB 0x2075 #define WGL_TEXTURE_RGBA_ARB 0x2076 #define WGL_NO_TEXTURE_ARB 0x2077 #define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 #define WGL_TEXTURE_1D_ARB 0x2079 #define WGL_TEXTURE_2D_ARB 0x207A #define WGL_MIPMAP_LEVEL_ARB 0x207B #define WGL_CUBE_MAP_FACE_ARB 0x207C #define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 #define WGL_FRONT_LEFT_ARB 0x2083 #define WGL_FRONT_RIGHT_ARB 0x2084 #define WGL_BACK_LEFT_ARB 0x2085 #define WGL_BACK_RIGHT_ARB 0x2086 #define WGL_AUX0_ARB 0x2087 #define WGL_AUX1_ARB 0x2088 #define WGL_AUX2_ARB 0x2089 #define WGL_AUX3_ARB 0x208A #define WGL_AUX4_ARB 0x208B #define WGL_AUX5_ARB 0x208C #define WGL_AUX6_ARB 0x208D #define WGL_AUX7_ARB 0x208E #define WGL_AUX8_ARB 0x208F #define WGL_AUX9_ARB 0x2090 typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList); #define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB) #define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB) #define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB) #define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture) #endif /* WGL_ARB_render_texture */ /* ---------------- WGL_ARB_robustness_application_isolation --------------- */ #ifndef WGL_ARB_robustness_application_isolation #define WGL_ARB_robustness_application_isolation 1 #define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 #define WGLEW_ARB_robustness_application_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_application_isolation) #endif /* WGL_ARB_robustness_application_isolation */ /* ---------------- WGL_ARB_robustness_share_group_isolation --------------- */ #ifndef WGL_ARB_robustness_share_group_isolation #define WGL_ARB_robustness_share_group_isolation 1 #define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 #define WGLEW_ARB_robustness_share_group_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_share_group_isolation) #endif /* WGL_ARB_robustness_share_group_isolation */ /* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ #ifndef WGL_ATI_pixel_format_float #define WGL_ATI_pixel_format_float 1 #define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 #define GL_RGBA_FLOAT_MODE_ATI 0x8820 #define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 #define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float) #endif /* WGL_ATI_pixel_format_float */ /* -------------------- WGL_ATI_render_texture_rectangle ------------------- */ #ifndef WGL_ATI_render_texture_rectangle #define WGL_ATI_render_texture_rectangle 1 #define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 #define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle) #endif /* WGL_ATI_render_texture_rectangle */ /* --------------------------- WGL_EXT_colorspace -------------------------- */ #ifndef WGL_EXT_colorspace #define WGL_EXT_colorspace 1 #define WGL_COLORSPACE_SRGB_EXT 0x3089 #define WGL_COLORSPACE_LINEAR_EXT 0x308A #define WGL_COLORSPACE_EXT 0x309D #define WGLEW_EXT_colorspace WGLEW_GET_VAR(__WGLEW_EXT_colorspace) #endif /* WGL_EXT_colorspace */ /* ------------------- WGL_EXT_create_context_es2_profile ------------------ */ #ifndef WGL_EXT_create_context_es2_profile #define WGL_EXT_create_context_es2_profile 1 #define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 #define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile) #endif /* WGL_EXT_create_context_es2_profile */ /* ------------------- WGL_EXT_create_context_es_profile ------------------- */ #ifndef WGL_EXT_create_context_es_profile #define WGL_EXT_create_context_es_profile 1 #define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 #define WGLEW_EXT_create_context_es_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es_profile) #endif /* WGL_EXT_create_context_es_profile */ /* -------------------------- WGL_EXT_depth_float -------------------------- */ #ifndef WGL_EXT_depth_float #define WGL_EXT_depth_float 1 #define WGL_DEPTH_FLOAT_EXT 0x2040 #define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float) #endif /* WGL_EXT_depth_float */ /* ---------------------- WGL_EXT_display_color_table ---------------------- */ #ifndef WGL_EXT_display_color_table #define WGL_EXT_display_color_table 1 typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length); #define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT) #define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT) #define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT) #define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT) #define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table) #endif /* WGL_EXT_display_color_table */ /* ----------------------- WGL_EXT_extensions_string ----------------------- */ #ifndef WGL_EXT_extensions_string #define WGL_EXT_extensions_string 1 typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); #define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT) #define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string) #endif /* WGL_EXT_extensions_string */ /* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */ #ifndef WGL_EXT_framebuffer_sRGB #define WGL_EXT_framebuffer_sRGB 1 #define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 #define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB) #endif /* WGL_EXT_framebuffer_sRGB */ /* ----------------------- WGL_EXT_make_current_read ----------------------- */ #ifndef WGL_EXT_make_current_read #define WGL_EXT_make_current_read 1 #define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID); typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); #define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT) #define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT) #define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read) #endif /* WGL_EXT_make_current_read */ /* -------------------------- WGL_EXT_multisample -------------------------- */ #ifndef WGL_EXT_multisample #define WGL_EXT_multisample 1 #define WGL_SAMPLE_BUFFERS_EXT 0x2041 #define WGL_SAMPLES_EXT 0x2042 #define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample) #endif /* WGL_EXT_multisample */ /* ---------------------------- WGL_EXT_pbuffer ---------------------------- */ #ifndef WGL_EXT_pbuffer #define WGL_EXT_pbuffer 1 #define WGL_DRAW_TO_PBUFFER_EXT 0x202D #define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E #define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F #define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 #define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 #define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 #define WGL_PBUFFER_LARGEST_EXT 0x2033 #define WGL_PBUFFER_WIDTH_EXT 0x2034 #define WGL_PBUFFER_HEIGHT_EXT 0x2035 DECLARE_HANDLE(HPBUFFEREXT); typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue); typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); #define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT) #define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT) #define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT) #define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT) #define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT) #define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer) #endif /* WGL_EXT_pbuffer */ /* -------------------------- WGL_EXT_pixel_format ------------------------- */ #ifndef WGL_EXT_pixel_format #define WGL_EXT_pixel_format 1 #define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 #define WGL_DRAW_TO_WINDOW_EXT 0x2001 #define WGL_DRAW_TO_BITMAP_EXT 0x2002 #define WGL_ACCELERATION_EXT 0x2003 #define WGL_NEED_PALETTE_EXT 0x2004 #define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 #define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 #define WGL_SWAP_METHOD_EXT 0x2007 #define WGL_NUMBER_OVERLAYS_EXT 0x2008 #define WGL_NUMBER_UNDERLAYS_EXT 0x2009 #define WGL_TRANSPARENT_EXT 0x200A #define WGL_TRANSPARENT_VALUE_EXT 0x200B #define WGL_SHARE_DEPTH_EXT 0x200C #define WGL_SHARE_STENCIL_EXT 0x200D #define WGL_SHARE_ACCUM_EXT 0x200E #define WGL_SUPPORT_GDI_EXT 0x200F #define WGL_SUPPORT_OPENGL_EXT 0x2010 #define WGL_DOUBLE_BUFFER_EXT 0x2011 #define WGL_STEREO_EXT 0x2012 #define WGL_PIXEL_TYPE_EXT 0x2013 #define WGL_COLOR_BITS_EXT 0x2014 #define WGL_RED_BITS_EXT 0x2015 #define WGL_RED_SHIFT_EXT 0x2016 #define WGL_GREEN_BITS_EXT 0x2017 #define WGL_GREEN_SHIFT_EXT 0x2018 #define WGL_BLUE_BITS_EXT 0x2019 #define WGL_BLUE_SHIFT_EXT 0x201A #define WGL_ALPHA_BITS_EXT 0x201B #define WGL_ALPHA_SHIFT_EXT 0x201C #define WGL_ACCUM_BITS_EXT 0x201D #define WGL_ACCUM_RED_BITS_EXT 0x201E #define WGL_ACCUM_GREEN_BITS_EXT 0x201F #define WGL_ACCUM_BLUE_BITS_EXT 0x2020 #define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 #define WGL_DEPTH_BITS_EXT 0x2022 #define WGL_STENCIL_BITS_EXT 0x2023 #define WGL_AUX_BUFFERS_EXT 0x2024 #define WGL_NO_ACCELERATION_EXT 0x2025 #define WGL_GENERIC_ACCELERATION_EXT 0x2026 #define WGL_FULL_ACCELERATION_EXT 0x2027 #define WGL_SWAP_EXCHANGE_EXT 0x2028 #define WGL_SWAP_COPY_EXT 0x2029 #define WGL_SWAP_UNDEFINED_EXT 0x202A #define WGL_TYPE_RGBA_EXT 0x202B #define WGL_TYPE_COLORINDEX_EXT 0x202C typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues); #define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT) #define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT) #define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT) #define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format) #endif /* WGL_EXT_pixel_format */ /* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */ #ifndef WGL_EXT_pixel_format_packed_float #define WGL_EXT_pixel_format_packed_float 1 #define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 #define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float) #endif /* WGL_EXT_pixel_format_packed_float */ /* -------------------------- WGL_EXT_swap_control ------------------------- */ #ifndef WGL_EXT_swap_control #define WGL_EXT_swap_control 1 typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); #define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT) #define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT) #define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control) #endif /* WGL_EXT_swap_control */ /* ----------------------- WGL_EXT_swap_control_tear ----------------------- */ #ifndef WGL_EXT_swap_control_tear #define WGL_EXT_swap_control_tear 1 #define WGLEW_EXT_swap_control_tear WGLEW_GET_VAR(__WGLEW_EXT_swap_control_tear) #endif /* WGL_EXT_swap_control_tear */ /* --------------------- WGL_I3D_digital_video_control --------------------- */ #ifndef WGL_I3D_digital_video_control #define WGL_I3D_digital_video_control 1 #define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 #define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 #define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 #define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); #define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D) #define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D) #define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control) #endif /* WGL_I3D_digital_video_control */ /* ----------------------------- WGL_I3D_gamma ----------------------------- */ #ifndef WGL_I3D_gamma #define WGL_I3D_gamma 1 #define WGL_GAMMA_TABLE_SIZE_I3D 0x204E #define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue); typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue); typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); #define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D) #define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D) #define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D) #define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D) #define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma) #endif /* WGL_I3D_gamma */ /* ---------------------------- WGL_I3D_genlock ---------------------------- */ #ifndef WGL_I3D_genlock #define WGL_I3D_genlock 1 #define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 #define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 #define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 #define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 #define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 #define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 #define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A #define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B #define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource); typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag); typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay); #define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D) #define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D) #define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D) #define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D) #define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D) #define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D) #define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D) #define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D) #define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D) #define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D) #define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D) #define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D) #define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock) #endif /* WGL_I3D_genlock */ /* -------------------------- WGL_I3D_image_buffer ------------------------- */ #ifndef WGL_I3D_image_buffer #define WGL_I3D_image_buffer 1 #define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 #define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count); typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count); #define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D) #define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D) #define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D) #define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D) #define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer) #endif /* WGL_I3D_image_buffer */ /* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */ #ifndef WGL_I3D_swap_frame_lock #define WGL_I3D_swap_frame_lock 1 typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID); typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID); typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag); typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag); #define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D) #define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D) #define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D) #define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D) #define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock) #endif /* WGL_I3D_swap_frame_lock */ /* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */ #ifndef WGL_I3D_swap_frame_usage #define WGL_I3D_swap_frame_usage 1 typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage); typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); #define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D) #define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D) #define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D) #define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D) #define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage) #endif /* WGL_I3D_swap_frame_usage */ /* --------------------------- WGL_NV_DX_interop --------------------------- */ #ifndef WGL_NV_DX_interop #define WGL_NV_DX_interop 1 #define WGL_ACCESS_READ_ONLY_NV 0x0000 #define WGL_ACCESS_READ_WRITE_NV 0x0001 #define WGL_ACCESS_WRITE_DISCARD_NV 0x0002 typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice); typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); typedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access); typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice); typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access); typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle); typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject); #define wglDXCloseDeviceNV WGLEW_GET_FUN(__wglewDXCloseDeviceNV) #define wglDXLockObjectsNV WGLEW_GET_FUN(__wglewDXLockObjectsNV) #define wglDXObjectAccessNV WGLEW_GET_FUN(__wglewDXObjectAccessNV) #define wglDXOpenDeviceNV WGLEW_GET_FUN(__wglewDXOpenDeviceNV) #define wglDXRegisterObjectNV WGLEW_GET_FUN(__wglewDXRegisterObjectNV) #define wglDXSetResourceShareHandleNV WGLEW_GET_FUN(__wglewDXSetResourceShareHandleNV) #define wglDXUnlockObjectsNV WGLEW_GET_FUN(__wglewDXUnlockObjectsNV) #define wglDXUnregisterObjectNV WGLEW_GET_FUN(__wglewDXUnregisterObjectNV) #define WGLEW_NV_DX_interop WGLEW_GET_VAR(__WGLEW_NV_DX_interop) #endif /* WGL_NV_DX_interop */ /* --------------------------- WGL_NV_DX_interop2 -------------------------- */ #ifndef WGL_NV_DX_interop2 #define WGL_NV_DX_interop2 1 #define WGLEW_NV_DX_interop2 WGLEW_GET_VAR(__WGLEW_NV_DX_interop2) #endif /* WGL_NV_DX_interop2 */ /* --------------------------- WGL_NV_copy_image --------------------------- */ #ifndef WGL_NV_copy_image #define WGL_NV_copy_image 1 typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); #define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV) #define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image) #endif /* WGL_NV_copy_image */ /* ------------------------ WGL_NV_delay_before_swap ----------------------- */ #ifndef WGL_NV_delay_before_swap #define WGL_NV_delay_before_swap 1 typedef BOOL (WINAPI * PFNWGLDELAYBEFORESWAPNVPROC) (HDC hDC, GLfloat seconds); #define wglDelayBeforeSwapNV WGLEW_GET_FUN(__wglewDelayBeforeSwapNV) #define WGLEW_NV_delay_before_swap WGLEW_GET_VAR(__WGLEW_NV_delay_before_swap) #endif /* WGL_NV_delay_before_swap */ /* -------------------------- WGL_NV_float_buffer -------------------------- */ #ifndef WGL_NV_float_buffer #define WGL_NV_float_buffer 1 #define WGL_FLOAT_COMPONENTS_NV 0x20B0 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 #define WGL_TEXTURE_FLOAT_R_NV 0x20B5 #define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 #define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 #define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 #define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer) #endif /* WGL_NV_float_buffer */ /* -------------------------- WGL_NV_gpu_affinity -------------------------- */ #ifndef WGL_NV_gpu_affinity #define WGL_NV_gpu_affinity 1 #define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 #define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 DECLARE_HANDLE(HGPUNV); typedef struct _GPU_DEVICE { DWORD cb; CHAR DeviceName[32]; CHAR DeviceString[128]; DWORD Flags; RECT rcVirtualScreen; } GPU_DEVICE, *PGPU_DEVICE; typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList); typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc); typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu); #define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV) #define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV) #define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV) #define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV) #define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV) #define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity) #endif /* WGL_NV_gpu_affinity */ /* ---------------------- WGL_NV_multisample_coverage ---------------------- */ #ifndef WGL_NV_multisample_coverage #define WGL_NV_multisample_coverage 1 #define WGL_COVERAGE_SAMPLES_NV 0x2042 #define WGL_COLOR_SAMPLES_NV 0x20B9 #define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage) #endif /* WGL_NV_multisample_coverage */ /* -------------------------- WGL_NV_present_video ------------------------- */ #ifndef WGL_NV_present_video #define WGL_NV_present_video 1 #define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList); typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList); typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue); #define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV) #define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV) #define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV) #define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video) #endif /* WGL_NV_present_video */ /* ---------------------- WGL_NV_render_depth_texture ---------------------- */ #ifndef WGL_NV_render_depth_texture #define WGL_NV_render_depth_texture 1 #define WGL_NO_TEXTURE_ARB 0x2077 #define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 #define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 #define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 #define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 #define WGL_DEPTH_COMPONENT_NV 0x20A7 #define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture) #endif /* WGL_NV_render_depth_texture */ /* -------------------- WGL_NV_render_texture_rectangle -------------------- */ #ifndef WGL_NV_render_texture_rectangle #define WGL_NV_render_texture_rectangle 1 #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 #define WGL_TEXTURE_RECTANGLE_NV 0x20A2 #define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle) #endif /* WGL_NV_render_texture_rectangle */ /* --------------------------- WGL_NV_swap_group --------------------------- */ #ifndef WGL_NV_swap_group #define WGL_NV_swap_group 1 typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count); typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers); typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier); typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); #define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV) #define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV) #define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV) #define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV) #define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV) #define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV) #define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group) #endif /* WGL_NV_swap_group */ /* ----------------------- WGL_NV_vertex_array_range ----------------------- */ #ifndef WGL_NV_vertex_array_range #define WGL_NV_vertex_array_range 1 typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); #define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV) #define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV) #define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range) #endif /* WGL_NV_vertex_array_range */ /* -------------------------- WGL_NV_video_capture ------------------------- */ #ifndef WGL_NV_video_capture #define WGL_NV_video_capture 1 #define WGL_UNIQUE_ID_NV 0x20CE #define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF DECLARE_HANDLE(HVIDEOINPUTDEVICENV); typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList); typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int* piValue); typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); #define wglBindVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewBindVideoCaptureDeviceNV) #define wglEnumerateVideoCaptureDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoCaptureDevicesNV) #define wglLockVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewLockVideoCaptureDeviceNV) #define wglQueryVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewQueryVideoCaptureDeviceNV) #define wglReleaseVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoCaptureDeviceNV) #define WGLEW_NV_video_capture WGLEW_GET_VAR(__WGLEW_NV_video_capture) #endif /* WGL_NV_video_capture */ /* -------------------------- WGL_NV_video_output -------------------------- */ #ifndef WGL_NV_video_output #define WGL_NV_video_output 1 #define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 #define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 #define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 #define WGL_VIDEO_OUT_COLOR_NV 0x20C3 #define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 #define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 #define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 #define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 #define WGL_VIDEO_OUT_FRAME 0x20C8 #define WGL_VIDEO_OUT_FIELD_1 0x20C9 #define WGL_VIDEO_OUT_FIELD_2 0x20CA #define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB #define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC DECLARE_HANDLE(HPVIDEODEV); typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice); typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock); #define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV) #define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV) #define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV) #define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV) #define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV) #define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV) #define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output) #endif /* WGL_NV_video_output */ /* -------------------------- WGL_OML_sync_control ------------------------- */ #ifndef WGL_OML_sync_control #define WGL_OML_sync_control 1 typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator); typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc); typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc); typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc); #define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML) #define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML) #define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML) #define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML) #define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML) #define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML) #define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control) #endif /* WGL_OML_sync_control */ /* ------------------------------------------------------------------------- */ #define WGLEW_FUN_EXPORT GLEW_FUN_EXPORT #define WGLEW_VAR_EXPORT GLEW_VAR_EXPORT WGLEW_FUN_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; WGLEW_FUN_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD; WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD; WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD; WGLEW_FUN_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD; WGLEW_FUN_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD; WGLEW_FUN_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD; WGLEW_FUN_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD; WGLEW_FUN_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD; WGLEW_FUN_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD; WGLEW_FUN_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; WGLEW_FUN_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; WGLEW_FUN_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; WGLEW_FUN_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; WGLEW_FUN_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB; WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; WGLEW_FUN_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; WGLEW_FUN_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; WGLEW_FUN_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; WGLEW_FUN_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; WGLEW_FUN_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; WGLEW_FUN_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; WGLEW_FUN_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; WGLEW_FUN_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; WGLEW_FUN_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; WGLEW_FUN_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; WGLEW_FUN_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; WGLEW_FUN_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; WGLEW_FUN_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; WGLEW_FUN_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; WGLEW_FUN_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; WGLEW_FUN_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; WGLEW_FUN_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; WGLEW_FUN_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; WGLEW_FUN_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; WGLEW_FUN_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; WGLEW_FUN_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; WGLEW_FUN_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; WGLEW_FUN_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; WGLEW_FUN_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; WGLEW_FUN_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; WGLEW_FUN_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; WGLEW_FUN_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; WGLEW_FUN_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; WGLEW_FUN_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV; WGLEW_FUN_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV; WGLEW_FUN_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV; WGLEW_FUN_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV; WGLEW_FUN_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV; WGLEW_FUN_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV; WGLEW_FUN_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV; WGLEW_FUN_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV; WGLEW_FUN_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV; WGLEW_FUN_EXPORT PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV; WGLEW_FUN_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV; WGLEW_FUN_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV; WGLEW_FUN_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV; WGLEW_FUN_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV; WGLEW_FUN_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV; WGLEW_FUN_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV; WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV; WGLEW_FUN_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV; WGLEW_FUN_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV; WGLEW_FUN_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV; WGLEW_FUN_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV; WGLEW_FUN_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV; WGLEW_FUN_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV; WGLEW_FUN_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV; WGLEW_FUN_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; WGLEW_FUN_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; WGLEW_FUN_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV; WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV; WGLEW_FUN_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV; WGLEW_FUN_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV; WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV; WGLEW_FUN_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV; WGLEW_FUN_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV; WGLEW_FUN_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV; WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV; WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV; WGLEW_FUN_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV; WGLEW_FUN_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; WGLEW_FUN_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; WGLEW_FUN_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; WGLEW_FUN_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; WGLEW_FUN_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; WGLEW_FUN_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; WGLEW_VAR_EXPORT GLboolean __WGLEW_3DFX_multisample; WGLEW_VAR_EXPORT GLboolean __WGLEW_3DL_stereo_control; WGLEW_VAR_EXPORT GLboolean __WGLEW_AMD_gpu_association; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_buffer_region; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_context_flush_control; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_no_error; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_profile; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_robustness; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_extensions_string; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_make_current_read; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_multisample; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pbuffer; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_render_texture; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_application_isolation; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_share_group_isolation; WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_colorspace; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es_profile; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_depth_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_display_color_table; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_extensions_string; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_make_current_read; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_multisample; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pbuffer; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control_tear; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_digital_video_control; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_gamma; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_genlock; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_image_buffer; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop2; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_copy_image; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_delay_before_swap; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_float_buffer; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_gpu_affinity; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_multisample_coverage; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_present_video; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_depth_texture; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_swap_group; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_vertex_array_range; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_capture; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_output; WGLEW_VAR_EXPORT GLboolean __WGLEW_OML_sync_control; /* ------------------------------------------------------------------------- */ GLEWAPI GLenum GLEWAPIENTRY wglewInit (); GLEWAPI GLboolean GLEWAPIENTRY wglewIsSupported (const char *name); #ifndef WGLEW_GET_VAR #define WGLEW_GET_VAR(x) (*(const GLboolean*)&x) #endif #ifndef WGLEW_GET_FUN #define WGLEW_GET_FUN(x) x #endif GLEWAPI GLboolean GLEWAPIENTRY wglewGetExtension (const char *name); #ifdef __cplusplus } #endif #undef GLEWAPI #endif /* __wglew_h__ */ asymptote-3.05/backports/glew/include/GL/glxew.h0000644000000000000000000021733315031566105020351 0ustar rootroot/* ** The OpenGL Extension Wrangler Library ** Copyright (C) 2008-2017, Nigel Stewart ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** ** * Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** * The name of the author may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ** THE POSSIBILITY OF SUCH DAMAGE. */ /* * Mesa 3-D graphics library * Version: 7.0 * * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* ** Copyright (c) 2007 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be included ** in all copies or substantial portions of the Materials. ** ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ #ifndef __glxew_h__ #define __glxew_h__ #define __GLXEW_H__ #ifdef __glxext_h_ #error glxext.h included before glxew.h #endif #if defined(GLX_H) || defined(__GLX_glx_h__) || defined(__glx_h__) #error glx.h included before glxew.h #endif #define __glxext_h_ #define GLX_H #define __GLX_glx_h__ #define __glx_h__ #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* ---------------------------- GLX_VERSION_1_0 --------------------------- */ #ifndef GLX_VERSION_1_0 #define GLX_VERSION_1_0 1 #define GLX_USE_GL 1 #define GLX_BUFFER_SIZE 2 #define GLX_LEVEL 3 #define GLX_RGBA 4 #define GLX_DOUBLEBUFFER 5 #define GLX_STEREO 6 #define GLX_AUX_BUFFERS 7 #define GLX_RED_SIZE 8 #define GLX_GREEN_SIZE 9 #define GLX_BLUE_SIZE 10 #define GLX_ALPHA_SIZE 11 #define GLX_DEPTH_SIZE 12 #define GLX_STENCIL_SIZE 13 #define GLX_ACCUM_RED_SIZE 14 #define GLX_ACCUM_GREEN_SIZE 15 #define GLX_ACCUM_BLUE_SIZE 16 #define GLX_ACCUM_ALPHA_SIZE 17 #define GLX_BAD_SCREEN 1 #define GLX_BAD_ATTRIBUTE 2 #define GLX_NO_EXTENSION 3 #define GLX_BAD_VISUAL 4 #define GLX_BAD_CONTEXT 5 #define GLX_BAD_VALUE 6 #define GLX_BAD_ENUM 7 typedef XID GLXDrawable; typedef XID GLXPixmap; #ifdef __sun typedef struct __glXContextRec *GLXContext; #else typedef struct __GLXcontextRec *GLXContext; #endif typedef unsigned int GLXVideoDeviceNV; extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase); extern Bool glXQueryVersion (Display *dpy, int *major, int *minor); extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value); extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList); extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap); extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix); extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); extern void glXDestroyContext (Display *dpy, GLXContext ctx); extern Bool glXIsDirect (Display *dpy, GLXContext ctx); extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask); extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx); extern GLXContext glXGetCurrentContext (void); extern GLXDrawable glXGetCurrentDrawable (void); extern void glXWaitGL (void); extern void glXWaitX (void); extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable); extern void glXUseXFont (Font font, int first, int count, int listBase); #define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0) #endif /* GLX_VERSION_1_0 */ /* ---------------------------- GLX_VERSION_1_1 --------------------------- */ #ifndef GLX_VERSION_1_1 #define GLX_VERSION_1_1 #define GLX_VENDOR 0x1 #define GLX_VERSION 0x2 #define GLX_EXTENSIONS 0x3 extern const char* glXQueryExtensionsString (Display *dpy, int screen); extern const char* glXGetClientString (Display *dpy, int name); extern const char* glXQueryServerString (Display *dpy, int screen, int name); #define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1) #endif /* GLX_VERSION_1_1 */ /* ---------------------------- GLX_VERSION_1_2 ---------------------------- */ #ifndef GLX_VERSION_1_2 #define GLX_VERSION_1_2 1 typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); #define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay) #define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2) #endif /* GLX_VERSION_1_2 */ /* ---------------------------- GLX_VERSION_1_3 ---------------------------- */ #ifndef GLX_VERSION_1_3 #define GLX_VERSION_1_3 1 #define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 #define GLX_RGBA_BIT 0x00000001 #define GLX_WINDOW_BIT 0x00000001 #define GLX_COLOR_INDEX_BIT 0x00000002 #define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 #define GLX_PIXMAP_BIT 0x00000002 #define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 #define GLX_PBUFFER_BIT 0x00000004 #define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 #define GLX_AUX_BUFFERS_BIT 0x00000010 #define GLX_CONFIG_CAVEAT 0x20 #define GLX_DEPTH_BUFFER_BIT 0x00000020 #define GLX_X_VISUAL_TYPE 0x22 #define GLX_TRANSPARENT_TYPE 0x23 #define GLX_TRANSPARENT_INDEX_VALUE 0x24 #define GLX_TRANSPARENT_RED_VALUE 0x25 #define GLX_TRANSPARENT_GREEN_VALUE 0x26 #define GLX_TRANSPARENT_BLUE_VALUE 0x27 #define GLX_TRANSPARENT_ALPHA_VALUE 0x28 #define GLX_STENCIL_BUFFER_BIT 0x00000040 #define GLX_ACCUM_BUFFER_BIT 0x00000080 #define GLX_NONE 0x8000 #define GLX_SLOW_CONFIG 0x8001 #define GLX_TRUE_COLOR 0x8002 #define GLX_DIRECT_COLOR 0x8003 #define GLX_PSEUDO_COLOR 0x8004 #define GLX_STATIC_COLOR 0x8005 #define GLX_GRAY_SCALE 0x8006 #define GLX_STATIC_GRAY 0x8007 #define GLX_TRANSPARENT_RGB 0x8008 #define GLX_TRANSPARENT_INDEX 0x8009 #define GLX_VISUAL_ID 0x800B #define GLX_SCREEN 0x800C #define GLX_NON_CONFORMANT_CONFIG 0x800D #define GLX_DRAWABLE_TYPE 0x8010 #define GLX_RENDER_TYPE 0x8011 #define GLX_X_RENDERABLE 0x8012 #define GLX_FBCONFIG_ID 0x8013 #define GLX_RGBA_TYPE 0x8014 #define GLX_COLOR_INDEX_TYPE 0x8015 #define GLX_MAX_PBUFFER_WIDTH 0x8016 #define GLX_MAX_PBUFFER_HEIGHT 0x8017 #define GLX_MAX_PBUFFER_PIXELS 0x8018 #define GLX_PRESERVED_CONTENTS 0x801B #define GLX_LARGEST_PBUFFER 0x801C #define GLX_WIDTH 0x801D #define GLX_HEIGHT 0x801E #define GLX_EVENT_MASK 0x801F #define GLX_DAMAGED 0x8020 #define GLX_SAVED 0x8021 #define GLX_WINDOW 0x8022 #define GLX_PBUFFER 0x8023 #define GLX_PBUFFER_HEIGHT 0x8040 #define GLX_PBUFFER_WIDTH 0x8041 #define GLX_PBUFFER_CLOBBER_MASK 0x08000000 #define GLX_DONT_CARE 0xFFFFFFFF typedef XID GLXFBConfigID; typedef XID GLXPbuffer; typedef XID GLXWindow; typedef struct __GLXFBConfigRec *GLXFBConfig; typedef struct { int event_type; int draw_type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; unsigned int buffer_mask; unsigned int aux_buffer; int x, y; int width, height; int count; } GLXPbufferClobberEvent; typedef union __GLXEvent { GLXPbufferClobberEvent glxpbufferclobber; long pad[24]; } GLXEvent; typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); #define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig) #define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext) #define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer) #define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap) #define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow) #define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer) #define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap) #define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow) #define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable) #define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib) #define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs) #define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent) #define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig) #define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent) #define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext) #define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable) #define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent) #define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3) #endif /* GLX_VERSION_1_3 */ /* ---------------------------- GLX_VERSION_1_4 ---------------------------- */ #ifndef GLX_VERSION_1_4 #define GLX_VERSION_1_4 1 #define GLX_SAMPLE_BUFFERS 100000 #define GLX_SAMPLES 100001 extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); #define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4) #endif /* GLX_VERSION_1_4 */ /* -------------------------- GLX_3DFX_multisample ------------------------- */ #ifndef GLX_3DFX_multisample #define GLX_3DFX_multisample 1 #define GLX_SAMPLE_BUFFERS_3DFX 0x8050 #define GLX_SAMPLES_3DFX 0x8051 #define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample) #endif /* GLX_3DFX_multisample */ /* ------------------------ GLX_AMD_gpu_association ------------------------ */ #ifndef GLX_AMD_gpu_association #define GLX_AMD_gpu_association 1 #define GLX_GPU_VENDOR_AMD 0x1F00 #define GLX_GPU_RENDERER_STRING_AMD 0x1F01 #define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 #define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 #define GLX_GPU_RAM_AMD 0x21A3 #define GLX_GPU_CLOCK_AMD 0x21A4 #define GLX_GPU_NUM_PIPES_AMD 0x21A5 #define GLX_GPU_NUM_SIMD_AMD 0x21A6 #define GLX_GPU_NUM_RB_AMD 0x21A7 #define GLX_GPU_NUM_SPI_AMD 0x21A8 typedef void ( * PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC) (GLXContext dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC) (unsigned int id, GLXContext share_list); typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (unsigned int id, GLXContext share_context, const int* attribList); typedef Bool ( * PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC) (GLXContext ctx); typedef unsigned int ( * PFNGLXGETCONTEXTGPUIDAMDPROC) (GLXContext ctx); typedef GLXContext ( * PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); typedef unsigned int ( * PFNGLXGETGPUIDSAMDPROC) (unsigned int maxCount, unsigned int* ids); typedef int ( * PFNGLXGETGPUINFOAMDPROC) (unsigned int id, int property, GLenum dataType, unsigned int size, void* data); typedef Bool ( * PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (GLXContext ctx); #define glXBlitContextFramebufferAMD GLXEW_GET_FUN(__glewXBlitContextFramebufferAMD) #define glXCreateAssociatedContextAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAMD) #define glXCreateAssociatedContextAttribsAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAttribsAMD) #define glXDeleteAssociatedContextAMD GLXEW_GET_FUN(__glewXDeleteAssociatedContextAMD) #define glXGetContextGPUIDAMD GLXEW_GET_FUN(__glewXGetContextGPUIDAMD) #define glXGetCurrentAssociatedContextAMD GLXEW_GET_FUN(__glewXGetCurrentAssociatedContextAMD) #define glXGetGPUIDsAMD GLXEW_GET_FUN(__glewXGetGPUIDsAMD) #define glXGetGPUInfoAMD GLXEW_GET_FUN(__glewXGetGPUInfoAMD) #define glXMakeAssociatedContextCurrentAMD GLXEW_GET_FUN(__glewXMakeAssociatedContextCurrentAMD) #define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association) #endif /* GLX_AMD_gpu_association */ /* --------------------- GLX_ARB_context_flush_control --------------------- */ #ifndef GLX_ARB_context_flush_control #define GLX_ARB_context_flush_control 1 #define GLXEW_ARB_context_flush_control GLXEW_GET_VAR(__GLXEW_ARB_context_flush_control) #endif /* GLX_ARB_context_flush_control */ /* ------------------------- GLX_ARB_create_context ------------------------ */ #ifndef GLX_ARB_create_context #define GLX_ARB_create_context 1 #define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001 #define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 #define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 #define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 #define GLX_CONTEXT_FLAGS_ARB 0x2094 typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list); #define glXCreateContextAttribsARB GLXEW_GET_FUN(__glewXCreateContextAttribsARB) #define GLXEW_ARB_create_context GLXEW_GET_VAR(__GLXEW_ARB_create_context) #endif /* GLX_ARB_create_context */ /* -------------------- GLX_ARB_create_context_no_error -------------------- */ #ifndef GLX_ARB_create_context_no_error #define GLX_ARB_create_context_no_error 1 #define GLXEW_ARB_create_context_no_error GLXEW_GET_VAR(__GLXEW_ARB_create_context_no_error) #endif /* GLX_ARB_create_context_no_error */ /* --------------------- GLX_ARB_create_context_profile -------------------- */ #ifndef GLX_ARB_create_context_profile #define GLX_ARB_create_context_profile 1 #define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 #define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 #define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 #define GLXEW_ARB_create_context_profile GLXEW_GET_VAR(__GLXEW_ARB_create_context_profile) #endif /* GLX_ARB_create_context_profile */ /* ------------------- GLX_ARB_create_context_robustness ------------------- */ #ifndef GLX_ARB_create_context_robustness #define GLX_ARB_create_context_robustness 1 #define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 #define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252 #define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 #define GLX_NO_RESET_NOTIFICATION_ARB 0x8261 #define GLXEW_ARB_create_context_robustness GLXEW_GET_VAR(__GLXEW_ARB_create_context_robustness) #endif /* GLX_ARB_create_context_robustness */ /* ------------------------- GLX_ARB_fbconfig_float ------------------------ */ #ifndef GLX_ARB_fbconfig_float #define GLX_ARB_fbconfig_float 1 #define GLX_RGBA_FLOAT_BIT_ARB 0x00000004 #define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9 #define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float) #endif /* GLX_ARB_fbconfig_float */ /* ------------------------ GLX_ARB_framebuffer_sRGB ----------------------- */ #ifndef GLX_ARB_framebuffer_sRGB #define GLX_ARB_framebuffer_sRGB 1 #define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2 #define GLXEW_ARB_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_ARB_framebuffer_sRGB) #endif /* GLX_ARB_framebuffer_sRGB */ /* ------------------------ GLX_ARB_get_proc_address ----------------------- */ #ifndef GLX_ARB_get_proc_address #define GLX_ARB_get_proc_address 1 extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void); #define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address) #endif /* GLX_ARB_get_proc_address */ /* -------------------------- GLX_ARB_multisample -------------------------- */ #ifndef GLX_ARB_multisample #define GLX_ARB_multisample 1 #define GLX_SAMPLE_BUFFERS_ARB 100000 #define GLX_SAMPLES_ARB 100001 #define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample) #endif /* GLX_ARB_multisample */ /* ---------------- GLX_ARB_robustness_application_isolation --------------- */ #ifndef GLX_ARB_robustness_application_isolation #define GLX_ARB_robustness_application_isolation 1 #define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 #define GLXEW_ARB_robustness_application_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_application_isolation) #endif /* GLX_ARB_robustness_application_isolation */ /* ---------------- GLX_ARB_robustness_share_group_isolation --------------- */ #ifndef GLX_ARB_robustness_share_group_isolation #define GLX_ARB_robustness_share_group_isolation 1 #define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 #define GLXEW_ARB_robustness_share_group_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_share_group_isolation) #endif /* GLX_ARB_robustness_share_group_isolation */ /* ---------------------- GLX_ARB_vertex_buffer_object --------------------- */ #ifndef GLX_ARB_vertex_buffer_object #define GLX_ARB_vertex_buffer_object 1 #define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095 #define GLXEW_ARB_vertex_buffer_object GLXEW_GET_VAR(__GLXEW_ARB_vertex_buffer_object) #endif /* GLX_ARB_vertex_buffer_object */ /* ----------------------- GLX_ATI_pixel_format_float ---------------------- */ #ifndef GLX_ATI_pixel_format_float #define GLX_ATI_pixel_format_float 1 #define GLX_RGBA_FLOAT_ATI_BIT 0x00000100 #define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float) #endif /* GLX_ATI_pixel_format_float */ /* ------------------------- GLX_ATI_render_texture ------------------------ */ #ifndef GLX_ATI_render_texture #define GLX_ATI_render_texture 1 #define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800 #define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801 #define GLX_TEXTURE_FORMAT_ATI 0x9802 #define GLX_TEXTURE_TARGET_ATI 0x9803 #define GLX_MIPMAP_TEXTURE_ATI 0x9804 #define GLX_TEXTURE_RGB_ATI 0x9805 #define GLX_TEXTURE_RGBA_ATI 0x9806 #define GLX_NO_TEXTURE_ATI 0x9807 #define GLX_TEXTURE_CUBE_MAP_ATI 0x9808 #define GLX_TEXTURE_1D_ATI 0x9809 #define GLX_TEXTURE_2D_ATI 0x980A #define GLX_MIPMAP_LEVEL_ATI 0x980B #define GLX_CUBE_MAP_FACE_ATI 0x980C #define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D #define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E #define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F #define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810 #define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811 #define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812 #define GLX_FRONT_LEFT_ATI 0x9813 #define GLX_FRONT_RIGHT_ATI 0x9814 #define GLX_BACK_LEFT_ATI 0x9815 #define GLX_BACK_RIGHT_ATI 0x9816 #define GLX_AUX0_ATI 0x9817 #define GLX_AUX1_ATI 0x9818 #define GLX_AUX2_ATI 0x9819 #define GLX_AUX3_ATI 0x981A #define GLX_AUX4_ATI 0x981B #define GLX_AUX5_ATI 0x981C #define GLX_AUX6_ATI 0x981D #define GLX_AUX7_ATI 0x981E #define GLX_AUX8_ATI 0x981F #define GLX_AUX9_ATI 0x9820 #define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821 #define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822 typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list); typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); #define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI) #define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI) #define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI) #define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture) #endif /* GLX_ATI_render_texture */ /* --------------------------- GLX_EXT_buffer_age -------------------------- */ #ifndef GLX_EXT_buffer_age #define GLX_EXT_buffer_age 1 #define GLX_BACK_BUFFER_AGE_EXT 0x20F4 #define GLXEW_EXT_buffer_age GLXEW_GET_VAR(__GLXEW_EXT_buffer_age) #endif /* GLX_EXT_buffer_age */ /* ------------------- GLX_EXT_create_context_es2_profile ------------------ */ #ifndef GLX_EXT_create_context_es2_profile #define GLX_EXT_create_context_es2_profile 1 #define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 #define GLXEW_EXT_create_context_es2_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es2_profile) #endif /* GLX_EXT_create_context_es2_profile */ /* ------------------- GLX_EXT_create_context_es_profile ------------------- */ #ifndef GLX_EXT_create_context_es_profile #define GLX_EXT_create_context_es_profile 1 #define GLX_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 #define GLXEW_EXT_create_context_es_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es_profile) #endif /* GLX_EXT_create_context_es_profile */ /* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */ #ifndef GLX_EXT_fbconfig_packed_float #define GLX_EXT_fbconfig_packed_float 1 #define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 #define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 #define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float) #endif /* GLX_EXT_fbconfig_packed_float */ /* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */ #ifndef GLX_EXT_framebuffer_sRGB #define GLX_EXT_framebuffer_sRGB 1 #define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 #define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB) #endif /* GLX_EXT_framebuffer_sRGB */ /* ------------------------- GLX_EXT_import_context ------------------------ */ #ifndef GLX_EXT_import_context #define GLX_EXT_import_context 1 #define GLX_SHARE_CONTEXT_EXT 0x800A #define GLX_VISUAL_ID_EXT 0x800B #define GLX_SCREEN_EXT 0x800C typedef XID GLXContextID; typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context); typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID); typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value); #define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT) #define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT) #define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT) #define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT) #define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context) #endif /* GLX_EXT_import_context */ /* ---------------------------- GLX_EXT_libglvnd --------------------------- */ #ifndef GLX_EXT_libglvnd #define GLX_EXT_libglvnd 1 #define GLX_VENDOR_NAMES_EXT 0x20F6 #define GLXEW_EXT_libglvnd GLXEW_GET_VAR(__GLXEW_EXT_libglvnd) #endif /* GLX_EXT_libglvnd */ /* -------------------------- GLX_EXT_scene_marker ------------------------- */ #ifndef GLX_EXT_scene_marker #define GLX_EXT_scene_marker 1 #define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker) #endif /* GLX_EXT_scene_marker */ /* -------------------------- GLX_EXT_stereo_tree -------------------------- */ #ifndef GLX_EXT_stereo_tree #define GLX_EXT_stereo_tree 1 #define GLX_STEREO_NOTIFY_EXT 0x00000000 #define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001 #define GLX_STEREO_TREE_EXT 0x20F5 #define GLXEW_EXT_stereo_tree GLXEW_GET_VAR(__GLXEW_EXT_stereo_tree) #endif /* GLX_EXT_stereo_tree */ /* -------------------------- GLX_EXT_swap_control ------------------------- */ #ifndef GLX_EXT_swap_control #define GLX_EXT_swap_control 1 #define GLX_SWAP_INTERVAL_EXT 0x20F1 #define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2 typedef void ( * PFNGLXSWAPINTERVALEXTPROC) (Display* dpy, GLXDrawable drawable, int interval); #define glXSwapIntervalEXT GLXEW_GET_FUN(__glewXSwapIntervalEXT) #define GLXEW_EXT_swap_control GLXEW_GET_VAR(__GLXEW_EXT_swap_control) #endif /* GLX_EXT_swap_control */ /* ----------------------- GLX_EXT_swap_control_tear ----------------------- */ #ifndef GLX_EXT_swap_control_tear #define GLX_EXT_swap_control_tear 1 #define GLX_LATE_SWAPS_TEAR_EXT 0x20F3 #define GLXEW_EXT_swap_control_tear GLXEW_GET_VAR(__GLXEW_EXT_swap_control_tear) #endif /* GLX_EXT_swap_control_tear */ /* ---------------------- GLX_EXT_texture_from_pixmap ---------------------- */ #ifndef GLX_EXT_texture_from_pixmap #define GLX_EXT_texture_from_pixmap 1 #define GLX_TEXTURE_1D_BIT_EXT 0x00000001 #define GLX_TEXTURE_2D_BIT_EXT 0x00000002 #define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 #define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 #define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 #define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 #define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 #define GLX_Y_INVERTED_EXT 0x20D4 #define GLX_TEXTURE_FORMAT_EXT 0x20D5 #define GLX_TEXTURE_TARGET_EXT 0x20D6 #define GLX_MIPMAP_TEXTURE_EXT 0x20D7 #define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 #define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 #define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA #define GLX_TEXTURE_1D_EXT 0x20DB #define GLX_TEXTURE_2D_EXT 0x20DC #define GLX_TEXTURE_RECTANGLE_EXT 0x20DD #define GLX_FRONT_LEFT_EXT 0x20DE #define GLX_FRONT_RIGHT_EXT 0x20DF #define GLX_BACK_LEFT_EXT 0x20E0 #define GLX_BACK_RIGHT_EXT 0x20E1 #define GLX_AUX0_EXT 0x20E2 #define GLX_AUX1_EXT 0x20E3 #define GLX_AUX2_EXT 0x20E4 #define GLX_AUX3_EXT 0x20E5 #define GLX_AUX4_EXT 0x20E6 #define GLX_AUX5_EXT 0x20E7 #define GLX_AUX6_EXT 0x20E8 #define GLX_AUX7_EXT 0x20E9 #define GLX_AUX8_EXT 0x20EA #define GLX_AUX9_EXT 0x20EB typedef void ( * PFNGLXBINDTEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer, const int *attrib_list); typedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer); #define glXBindTexImageEXT GLXEW_GET_FUN(__glewXBindTexImageEXT) #define glXReleaseTexImageEXT GLXEW_GET_FUN(__glewXReleaseTexImageEXT) #define GLXEW_EXT_texture_from_pixmap GLXEW_GET_VAR(__GLXEW_EXT_texture_from_pixmap) #endif /* GLX_EXT_texture_from_pixmap */ /* -------------------------- GLX_EXT_visual_info -------------------------- */ #ifndef GLX_EXT_visual_info #define GLX_EXT_visual_info 1 #define GLX_X_VISUAL_TYPE_EXT 0x22 #define GLX_TRANSPARENT_TYPE_EXT 0x23 #define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 #define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 #define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 #define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 #define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 #define GLX_NONE_EXT 0x8000 #define GLX_TRUE_COLOR_EXT 0x8002 #define GLX_DIRECT_COLOR_EXT 0x8003 #define GLX_PSEUDO_COLOR_EXT 0x8004 #define GLX_STATIC_COLOR_EXT 0x8005 #define GLX_GRAY_SCALE_EXT 0x8006 #define GLX_STATIC_GRAY_EXT 0x8007 #define GLX_TRANSPARENT_RGB_EXT 0x8008 #define GLX_TRANSPARENT_INDEX_EXT 0x8009 #define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info) #endif /* GLX_EXT_visual_info */ /* ------------------------- GLX_EXT_visual_rating ------------------------- */ #ifndef GLX_EXT_visual_rating #define GLX_EXT_visual_rating 1 #define GLX_VISUAL_CAVEAT_EXT 0x20 #define GLX_SLOW_VISUAL_EXT 0x8001 #define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D #define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating) #endif /* GLX_EXT_visual_rating */ /* -------------------------- GLX_INTEL_swap_event ------------------------- */ #ifndef GLX_INTEL_swap_event #define GLX_INTEL_swap_event 1 #define GLX_EXCHANGE_COMPLETE_INTEL 0x8180 #define GLX_COPY_COMPLETE_INTEL 0x8181 #define GLX_FLIP_COMPLETE_INTEL 0x8182 #define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000 #define GLXEW_INTEL_swap_event GLXEW_GET_VAR(__GLXEW_INTEL_swap_event) #endif /* GLX_INTEL_swap_event */ /* -------------------------- GLX_MESA_agp_offset -------------------------- */ #ifndef GLX_MESA_agp_offset #define GLX_MESA_agp_offset 1 typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer); #define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA) #define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset) #endif /* GLX_MESA_agp_offset */ /* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */ #ifndef GLX_MESA_copy_sub_buffer #define GLX_MESA_copy_sub_buffer 1 typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height); #define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA) #define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer) #endif /* GLX_MESA_copy_sub_buffer */ /* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */ #ifndef GLX_MESA_pixmap_colormap #define GLX_MESA_pixmap_colormap 1 typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); #define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA) #define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap) #endif /* GLX_MESA_pixmap_colormap */ /* ------------------------ GLX_MESA_query_renderer ------------------------ */ #ifndef GLX_MESA_query_renderer #define GLX_MESA_query_renderer 1 #define GLX_RENDERER_VENDOR_ID_MESA 0x8183 #define GLX_RENDERER_DEVICE_ID_MESA 0x8184 #define GLX_RENDERER_VERSION_MESA 0x8185 #define GLX_RENDERER_ACCELERATED_MESA 0x8186 #define GLX_RENDERER_VIDEO_MEMORY_MESA 0x8187 #define GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA 0x8188 #define GLX_RENDERER_PREFERRED_PROFILE_MESA 0x8189 #define GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA 0x818A #define GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA 0x818B #define GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA 0x818C #define GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA 0x818D #define GLX_RENDERER_ID_MESA 0x818E typedef Bool ( * PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC) (int attribute, unsigned int* value); typedef const char* ( * PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC) (int attribute); typedef Bool ( * PFNGLXQUERYRENDERERINTEGERMESAPROC) (Display* dpy, int screen, int renderer, int attribute, unsigned int *value); typedef const char* ( * PFNGLXQUERYRENDERERSTRINGMESAPROC) (Display *dpy, int screen, int renderer, int attribute); #define glXQueryCurrentRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererIntegerMESA) #define glXQueryCurrentRendererStringMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererStringMESA) #define glXQueryRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryRendererIntegerMESA) #define glXQueryRendererStringMESA GLXEW_GET_FUN(__glewXQueryRendererStringMESA) #define GLXEW_MESA_query_renderer GLXEW_GET_VAR(__GLXEW_MESA_query_renderer) #endif /* GLX_MESA_query_renderer */ /* ------------------------ GLX_MESA_release_buffers ----------------------- */ #ifndef GLX_MESA_release_buffers #define GLX_MESA_release_buffers 1 typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d); #define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA) #define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers) #endif /* GLX_MESA_release_buffers */ /* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */ #ifndef GLX_MESA_set_3dfx_mode #define GLX_MESA_set_3dfx_mode 1 #define GLX_3DFX_WINDOW_MODE_MESA 0x1 #define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode); #define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA) #define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode) #endif /* GLX_MESA_set_3dfx_mode */ /* ------------------------- GLX_MESA_swap_control ------------------------- */ #ifndef GLX_MESA_swap_control #define GLX_MESA_swap_control 1 typedef int ( * PFNGLXGETSWAPINTERVALMESAPROC) (void); typedef int ( * PFNGLXSWAPINTERVALMESAPROC) (unsigned int interval); #define glXGetSwapIntervalMESA GLXEW_GET_FUN(__glewXGetSwapIntervalMESA) #define glXSwapIntervalMESA GLXEW_GET_FUN(__glewXSwapIntervalMESA) #define GLXEW_MESA_swap_control GLXEW_GET_VAR(__GLXEW_MESA_swap_control) #endif /* GLX_MESA_swap_control */ /* --------------------------- GLX_NV_copy_buffer -------------------------- */ #ifndef GLX_NV_copy_buffer #define GLX_NV_copy_buffer 1 typedef void ( * PFNGLXCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void ( * PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); #define glXCopyBufferSubDataNV GLXEW_GET_FUN(__glewXCopyBufferSubDataNV) #define glXNamedCopyBufferSubDataNV GLXEW_GET_FUN(__glewXNamedCopyBufferSubDataNV) #define GLXEW_NV_copy_buffer GLXEW_GET_VAR(__GLXEW_NV_copy_buffer) #endif /* GLX_NV_copy_buffer */ /* --------------------------- GLX_NV_copy_image --------------------------- */ #ifndef GLX_NV_copy_image #define GLX_NV_copy_image 1 typedef void ( * PFNGLXCOPYIMAGESUBDATANVPROC) (Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); #define glXCopyImageSubDataNV GLXEW_GET_FUN(__glewXCopyImageSubDataNV) #define GLXEW_NV_copy_image GLXEW_GET_VAR(__GLXEW_NV_copy_image) #endif /* GLX_NV_copy_image */ /* ------------------------ GLX_NV_delay_before_swap ----------------------- */ #ifndef GLX_NV_delay_before_swap #define GLX_NV_delay_before_swap 1 typedef Bool ( * PFNGLXDELAYBEFORESWAPNVPROC) (Display* dpy, GLXDrawable drawable, GLfloat seconds); #define glXDelayBeforeSwapNV GLXEW_GET_FUN(__glewXDelayBeforeSwapNV) #define GLXEW_NV_delay_before_swap GLXEW_GET_VAR(__GLXEW_NV_delay_before_swap) #endif /* GLX_NV_delay_before_swap */ /* -------------------------- GLX_NV_float_buffer -------------------------- */ #ifndef GLX_NV_float_buffer #define GLX_NV_float_buffer 1 #define GLX_FLOAT_COMPONENTS_NV 0x20B0 #define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer) #endif /* GLX_NV_float_buffer */ /* ---------------------- GLX_NV_multisample_coverage ---------------------- */ #ifndef GLX_NV_multisample_coverage #define GLX_NV_multisample_coverage 1 #define GLX_COLOR_SAMPLES_NV 0x20B3 #define GLX_COVERAGE_SAMPLES_NV 100001 #define GLXEW_NV_multisample_coverage GLXEW_GET_VAR(__GLXEW_NV_multisample_coverage) #endif /* GLX_NV_multisample_coverage */ /* -------------------------- GLX_NV_present_video ------------------------- */ #ifndef GLX_NV_present_video #define GLX_NV_present_video 1 #define GLX_NUM_VIDEO_SLOTS_NV 0x20F0 typedef int ( * PFNGLXBINDVIDEODEVICENVPROC) (Display* dpy, unsigned int video_slot, unsigned int video_device, const int *attrib_list); typedef unsigned int* ( * PFNGLXENUMERATEVIDEODEVICESNVPROC) (Display *dpy, int screen, int *nelements); #define glXBindVideoDeviceNV GLXEW_GET_FUN(__glewXBindVideoDeviceNV) #define glXEnumerateVideoDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoDevicesNV) #define GLXEW_NV_present_video GLXEW_GET_VAR(__GLXEW_NV_present_video) #endif /* GLX_NV_present_video */ /* ------------------ GLX_NV_robustness_video_memory_purge ----------------- */ #ifndef GLX_NV_robustness_video_memory_purge #define GLX_NV_robustness_video_memory_purge 1 #define GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x20F7 #define GLXEW_NV_robustness_video_memory_purge GLXEW_GET_VAR(__GLXEW_NV_robustness_video_memory_purge) #endif /* GLX_NV_robustness_video_memory_purge */ /* --------------------------- GLX_NV_swap_group --------------------------- */ #ifndef GLX_NV_swap_group #define GLX_NV_swap_group 1 typedef Bool ( * PFNGLXBINDSWAPBARRIERNVPROC) (Display* dpy, GLuint group, GLuint barrier); typedef Bool ( * PFNGLXJOINSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint group); typedef Bool ( * PFNGLXQUERYFRAMECOUNTNVPROC) (Display* dpy, int screen, GLuint *count); typedef Bool ( * PFNGLXQUERYMAXSWAPGROUPSNVPROC) (Display* dpy, int screen, GLuint *maxGroups, GLuint *maxBarriers); typedef Bool ( * PFNGLXQUERYSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint *group, GLuint *barrier); typedef Bool ( * PFNGLXRESETFRAMECOUNTNVPROC) (Display* dpy, int screen); #define glXBindSwapBarrierNV GLXEW_GET_FUN(__glewXBindSwapBarrierNV) #define glXJoinSwapGroupNV GLXEW_GET_FUN(__glewXJoinSwapGroupNV) #define glXQueryFrameCountNV GLXEW_GET_FUN(__glewXQueryFrameCountNV) #define glXQueryMaxSwapGroupsNV GLXEW_GET_FUN(__glewXQueryMaxSwapGroupsNV) #define glXQuerySwapGroupNV GLXEW_GET_FUN(__glewXQuerySwapGroupNV) #define glXResetFrameCountNV GLXEW_GET_FUN(__glewXResetFrameCountNV) #define GLXEW_NV_swap_group GLXEW_GET_VAR(__GLXEW_NV_swap_group) #endif /* GLX_NV_swap_group */ /* ----------------------- GLX_NV_vertex_array_range ----------------------- */ #ifndef GLX_NV_vertex_array_range #define GLX_NV_vertex_array_range 1 typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer); #define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV) #define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV) #define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range) #endif /* GLX_NV_vertex_array_range */ /* -------------------------- GLX_NV_video_capture ------------------------- */ #ifndef GLX_NV_video_capture #define GLX_NV_video_capture 1 #define GLX_DEVICE_ID_NV 0x20CD #define GLX_UNIQUE_ID_NV 0x20CE #define GLX_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF typedef XID GLXVideoCaptureDeviceNV; typedef int ( * PFNGLXBINDVIDEOCAPTUREDEVICENVPROC) (Display* dpy, unsigned int video_capture_slot, GLXVideoCaptureDeviceNV device); typedef GLXVideoCaptureDeviceNV * ( * PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC) (Display* dpy, int screen, int *nelements); typedef void ( * PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); typedef int ( * PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device, int attribute, int *value); typedef void ( * PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); #define glXBindVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXBindVideoCaptureDeviceNV) #define glXEnumerateVideoCaptureDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoCaptureDevicesNV) #define glXLockVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXLockVideoCaptureDeviceNV) #define glXQueryVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXQueryVideoCaptureDeviceNV) #define glXReleaseVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoCaptureDeviceNV) #define GLXEW_NV_video_capture GLXEW_GET_VAR(__GLXEW_NV_video_capture) #endif /* GLX_NV_video_capture */ /* ---------------------------- GLX_NV_video_out --------------------------- */ #ifndef GLX_NV_video_out #define GLX_NV_video_out 1 #define GLX_VIDEO_OUT_COLOR_NV 0x20C3 #define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 #define GLX_VIDEO_OUT_DEPTH_NV 0x20C5 #define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 #define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 #define GLX_VIDEO_OUT_FRAME_NV 0x20C8 #define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9 #define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA #define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB #define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC typedef int ( * PFNGLXBINDVIDEOIMAGENVPROC) (Display* dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer); typedef int ( * PFNGLXGETVIDEODEVICENVPROC) (Display* dpy, int screen, int numVideoDevices, GLXVideoDeviceNV *pVideoDevice); typedef int ( * PFNGLXGETVIDEOINFONVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); typedef int ( * PFNGLXRELEASEVIDEODEVICENVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice); typedef int ( * PFNGLXRELEASEVIDEOIMAGENVPROC) (Display* dpy, GLXPbuffer pbuf); typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, int iBufferType, unsigned long *pulCounterPbuffer, GLboolean bBlock); #define glXBindVideoImageNV GLXEW_GET_FUN(__glewXBindVideoImageNV) #define glXGetVideoDeviceNV GLXEW_GET_FUN(__glewXGetVideoDeviceNV) #define glXGetVideoInfoNV GLXEW_GET_FUN(__glewXGetVideoInfoNV) #define glXReleaseVideoDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoDeviceNV) #define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV) #define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV) #define GLXEW_NV_video_out GLXEW_GET_VAR(__GLXEW_NV_video_out) #endif /* GLX_NV_video_out */ /* -------------------------- GLX_OML_swap_method -------------------------- */ #ifndef GLX_OML_swap_method #define GLX_OML_swap_method 1 #define GLX_SWAP_METHOD_OML 0x8060 #define GLX_SWAP_EXCHANGE_OML 0x8061 #define GLX_SWAP_COPY_OML 0x8062 #define GLX_SWAP_UNDEFINED_OML 0x8063 #define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method) #endif /* GLX_OML_swap_method */ /* -------------------------- GLX_OML_sync_control ------------------------- */ #ifndef GLX_OML_sync_control #define GLX_OML_sync_control 1 typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator); typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc); typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc); typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc); #define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML) #define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML) #define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML) #define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML) #define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML) #define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control) #endif /* GLX_OML_sync_control */ /* ------------------------ GLX_SGIS_blended_overlay ----------------------- */ #ifndef GLX_SGIS_blended_overlay #define GLX_SGIS_blended_overlay 1 #define GLX_BLENDED_RGBA_SGIS 0x8025 #define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay) #endif /* GLX_SGIS_blended_overlay */ /* -------------------------- GLX_SGIS_color_range ------------------------- */ #ifndef GLX_SGIS_color_range #define GLX_SGIS_color_range 1 #define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range) #endif /* GLX_SGIS_color_range */ /* -------------------------- GLX_SGIS_multisample ------------------------- */ #ifndef GLX_SGIS_multisample #define GLX_SGIS_multisample 1 #define GLX_SAMPLE_BUFFERS_SGIS 100000 #define GLX_SAMPLES_SGIS 100001 #define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample) #endif /* GLX_SGIS_multisample */ /* ---------------------- GLX_SGIS_shared_multisample ---------------------- */ #ifndef GLX_SGIS_shared_multisample #define GLX_SGIS_shared_multisample 1 #define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 #define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 #define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample) #endif /* GLX_SGIS_shared_multisample */ /* --------------------------- GLX_SGIX_fbconfig --------------------------- */ #ifndef GLX_SGIX_fbconfig #define GLX_SGIX_fbconfig 1 #define GLX_RGBA_BIT_SGIX 0x00000001 #define GLX_WINDOW_BIT_SGIX 0x00000001 #define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 #define GLX_PIXMAP_BIT_SGIX 0x00000002 #define GLX_SCREEN_EXT 0x800C #define GLX_DRAWABLE_TYPE_SGIX 0x8010 #define GLX_RENDER_TYPE_SGIX 0x8011 #define GLX_X_RENDERABLE_SGIX 0x8012 #define GLX_FBCONFIG_ID_SGIX 0x8013 #define GLX_RGBA_TYPE_SGIX 0x8014 #define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 typedef XID GLXFBConfigIDSGIX; typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap); typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value); typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis); typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config); #define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX) #define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX) #define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX) #define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX) #define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX) #define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX) #define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig) #endif /* GLX_SGIX_fbconfig */ /* --------------------------- GLX_SGIX_hyperpipe -------------------------- */ #ifndef GLX_SGIX_hyperpipe #define GLX_SGIX_hyperpipe 1 #define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 #define GLX_PIPE_RECT_SGIX 0x00000001 #define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 #define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 #define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 #define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 #define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 #define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91 #define GLX_BAD_HYPERPIPE_SGIX 92 #define GLX_HYPERPIPE_ID_SGIX 0x8030 typedef struct { char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; int networkId; } GLXHyperpipeNetworkSGIX; typedef struct { char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; int XOrigin; int YOrigin; int maxHeight; int maxWidth; } GLXPipeRectLimits; typedef struct { char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; int channel; unsigned int participationType; int timeSlice; } GLXHyperpipeConfigSGIX; typedef struct { char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; int srcXOrigin; int srcYOrigin; int srcWidth; int srcHeight; int destXOrigin; int destYOrigin; int destWidth; int destHeight; } GLXPipeRect; typedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId); typedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId); typedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList); typedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId); typedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList); typedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList); typedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes); typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes); #define glXBindHyperpipeSGIX GLXEW_GET_FUN(__glewXBindHyperpipeSGIX) #define glXDestroyHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXDestroyHyperpipeConfigSGIX) #define glXHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXHyperpipeAttribSGIX) #define glXHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXHyperpipeConfigSGIX) #define glXQueryHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeAttribSGIX) #define glXQueryHyperpipeBestAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeBestAttribSGIX) #define glXQueryHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeConfigSGIX) #define glXQueryHyperpipeNetworkSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeNetworkSGIX) #define GLXEW_SGIX_hyperpipe GLXEW_GET_VAR(__GLXEW_SGIX_hyperpipe) #endif /* GLX_SGIX_hyperpipe */ /* ---------------------------- GLX_SGIX_pbuffer --------------------------- */ #ifndef GLX_SGIX_pbuffer #define GLX_SGIX_pbuffer 1 #define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 #define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 #define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 #define GLX_PBUFFER_BIT_SGIX 0x00000004 #define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 #define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 #define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 #define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 #define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 #define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 #define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 #define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 #define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 #define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 #define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A #define GLX_PRESERVED_CONTENTS_SGIX 0x801B #define GLX_LARGEST_PBUFFER_SGIX 0x801C #define GLX_WIDTH_SGIX 0x801D #define GLX_HEIGHT_SGIX 0x801E #define GLX_EVENT_MASK_SGIX 0x801F #define GLX_DAMAGED_SGIX 0x8020 #define GLX_SAVED_SGIX 0x8021 #define GLX_WINDOW_SGIX 0x8022 #define GLX_PBUFFER_SGIX 0x8023 #define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 typedef XID GLXPbufferSGIX; typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX; typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list); typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf); typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask); typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value); typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask); #define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX) #define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX) #define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX) #define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX) #define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX) #define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer) #endif /* GLX_SGIX_pbuffer */ /* ------------------------- GLX_SGIX_swap_barrier ------------------------- */ #ifndef GLX_SGIX_swap_barrier #define GLX_SGIX_swap_barrier 1 typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); #define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX) #define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX) #define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier) #endif /* GLX_SGIX_swap_barrier */ /* -------------------------- GLX_SGIX_swap_group -------------------------- */ #ifndef GLX_SGIX_swap_group #define GLX_SGIX_swap_group 1 typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); #define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX) #define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group) #endif /* GLX_SGIX_swap_group */ /* ------------------------- GLX_SGIX_video_resize ------------------------- */ #ifndef GLX_SGIX_video_resize #define GLX_SGIX_video_resize 1 #define GLX_SYNC_FRAME_SGIX 0x00000000 #define GLX_SYNC_SWAP_SGIX 0x00000001 typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window); typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h); typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype); typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h); typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); #define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX) #define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX) #define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX) #define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX) #define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX) #define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize) #endif /* GLX_SGIX_video_resize */ /* ---------------------- GLX_SGIX_visual_select_group --------------------- */ #ifndef GLX_SGIX_visual_select_group #define GLX_SGIX_visual_select_group 1 #define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 #define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group) #endif /* GLX_SGIX_visual_select_group */ /* ---------------------------- GLX_SGI_cushion ---------------------------- */ #ifndef GLX_SGI_cushion #define GLX_SGI_cushion 1 typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion); #define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI) #define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion) #endif /* GLX_SGI_cushion */ /* ----------------------- GLX_SGI_make_current_read ----------------------- */ #ifndef GLX_SGI_make_current_read #define GLX_SGI_make_current_read 1 typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); #define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI) #define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI) #define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read) #endif /* GLX_SGI_make_current_read */ /* -------------------------- GLX_SGI_swap_control ------------------------- */ #ifndef GLX_SGI_swap_control #define GLX_SGI_swap_control 1 typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); #define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI) #define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control) #endif /* GLX_SGI_swap_control */ /* --------------------------- GLX_SGI_video_sync -------------------------- */ #ifndef GLX_SGI_video_sync #define GLX_SGI_video_sync 1 typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int* count); typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count); #define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI) #define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI) #define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync) #endif /* GLX_SGI_video_sync */ /* --------------------- GLX_SUN_get_transparent_index --------------------- */ #ifndef GLX_SUN_get_transparent_index #define GLX_SUN_get_transparent_index 1 typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex); #define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN) #define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index) #endif /* GLX_SUN_get_transparent_index */ /* -------------------------- GLX_SUN_video_resize ------------------------- */ #ifndef GLX_SUN_video_resize #define GLX_SUN_video_resize 1 #define GLX_VIDEO_RESIZE_SUN 0x8171 #define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor); typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor); #define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN) #define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN) #define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize) #endif /* GLX_SUN_video_resize */ /* ------------------------------------------------------------------------- */ #define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT #define GLXEW_VAR_EXPORT GLEW_VAR_EXPORT GLXEW_FUN_EXPORT PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; GLXEW_FUN_EXPORT PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext; GLXEW_FUN_EXPORT PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer; GLXEW_FUN_EXPORT PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap; GLXEW_FUN_EXPORT PFNGLXCREATEWINDOWPROC __glewXCreateWindow; GLXEW_FUN_EXPORT PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer; GLXEW_FUN_EXPORT PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap; GLXEW_FUN_EXPORT PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow; GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable; GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib; GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs; GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent; GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig; GLXEW_FUN_EXPORT PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent; GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTPROC __glewXQueryContext; GLXEW_FUN_EXPORT PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; GLXEW_FUN_EXPORT PFNGLXSELECTEVENTPROC __glewXSelectEvent; GLXEW_FUN_EXPORT PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD; GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD; GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD; GLXEW_FUN_EXPORT PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD; GLXEW_FUN_EXPORT PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD; GLXEW_FUN_EXPORT PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD; GLXEW_FUN_EXPORT PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD; GLXEW_FUN_EXPORT PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD; GLXEW_FUN_EXPORT PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD; GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB; GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; GLXEW_FUN_EXPORT PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; GLXEW_FUN_EXPORT PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT; GLXEW_FUN_EXPORT PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT; GLXEW_FUN_EXPORT PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT; GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT; GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT; GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT; GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT; GLXEW_FUN_EXPORT PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA; GLXEW_FUN_EXPORT PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA; GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA; GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA; GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA; GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA; GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA; GLXEW_FUN_EXPORT PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA; GLXEW_FUN_EXPORT PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA; GLXEW_FUN_EXPORT PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA; GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA; GLXEW_FUN_EXPORT PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV; GLXEW_FUN_EXPORT PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV; GLXEW_FUN_EXPORT PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV; GLXEW_FUN_EXPORT PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV; GLXEW_FUN_EXPORT PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV; GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV; GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV; GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV; GLXEW_FUN_EXPORT PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV; GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV; GLXEW_FUN_EXPORT PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV; GLXEW_FUN_EXPORT PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV; GLXEW_FUN_EXPORT PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV; GLXEW_FUN_EXPORT PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV; GLXEW_FUN_EXPORT PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV; GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV; GLXEW_FUN_EXPORT PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV; GLXEW_FUN_EXPORT PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV; GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV; GLXEW_FUN_EXPORT PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV; GLXEW_FUN_EXPORT PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV; GLXEW_FUN_EXPORT PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV; GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV; GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV; GLXEW_FUN_EXPORT PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV; GLXEW_FUN_EXPORT PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML; GLXEW_FUN_EXPORT PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML; GLXEW_FUN_EXPORT PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML; GLXEW_FUN_EXPORT PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML; GLXEW_FUN_EXPORT PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML; GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX; GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX; GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX; GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX; GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX; GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX; GLXEW_FUN_EXPORT PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX; GLXEW_FUN_EXPORT PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX; GLXEW_FUN_EXPORT PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX; GLXEW_FUN_EXPORT PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX; GLXEW_FUN_EXPORT PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX; GLXEW_FUN_EXPORT PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX; GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX; GLXEW_FUN_EXPORT PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX; GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX; GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX; GLXEW_FUN_EXPORT PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX; GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX; GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX; GLXEW_FUN_EXPORT PFNGLXCUSHIONSGIPROC __glewXCushionSGI; GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI; GLXEW_FUN_EXPORT PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI; GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; GLXEW_FUN_EXPORT PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI; GLXEW_FUN_EXPORT PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI; GLXEW_FUN_EXPORT PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN; GLXEW_FUN_EXPORT PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN; GLXEW_FUN_EXPORT PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN; GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_0; GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_1; GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_2; GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_3; GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_4; GLXEW_VAR_EXPORT GLboolean __GLXEW_3DFX_multisample; GLXEW_VAR_EXPORT GLboolean __GLXEW_AMD_gpu_association; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_context_flush_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_no_error; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_profile; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_robustness; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_fbconfig_float; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_framebuffer_sRGB; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_get_proc_address; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_multisample; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_application_isolation; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_share_group_isolation; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object; GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_render_texture; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_buffer_age; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es_profile; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_import_context; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_libglvnd; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_scene_marker; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_stereo_tree; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control_tear; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_info; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_rating; GLXEW_VAR_EXPORT GLboolean __GLXEW_INTEL_swap_event; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_agp_offset; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_query_renderer; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_release_buffers; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_swap_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_buffer; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_image; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_delay_before_swap; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_float_buffer; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_multisample_coverage; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_present_video; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_robustness_video_memory_purge; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_swap_group; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_vertex_array_range; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_capture; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_out; GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_swap_method; GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_sync_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_color_range; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_multisample; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_shared_multisample; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_fbconfig; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_hyperpipe; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_pbuffer; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_barrier; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_group; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_video_resize; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_visual_select_group; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_cushion; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_make_current_read; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_swap_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_video_sync; GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_get_transparent_index; GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_video_resize; /* ------------------------------------------------------------------------ */ GLEWAPI GLenum GLEWAPIENTRY glxewInit (); GLEWAPI GLboolean GLEWAPIENTRY glxewIsSupported (const char *name); #ifndef GLXEW_GET_VAR #define GLXEW_GET_VAR(x) (*(const GLboolean*)&x) #endif #ifndef GLXEW_GET_FUN #define GLXEW_GET_FUN(x) x #endif GLEWAPI GLboolean GLEWAPIENTRY glxewGetExtension (const char *name); #ifdef __cplusplus } #endif #endif /* __glxew_h__ */ asymptote-3.05/backports/glew/include/GL/glew.h0000644000000000000000000441545115031566105020166 0ustar rootroot/* ** The OpenGL Extension Wrangler Library ** Copyright (C) 2008-2017, Nigel Stewart ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** ** * Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** * The name of the author may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ** THE POSSIBILITY OF SUCH DAMAGE. */ /* * Mesa 3-D graphics library * Version: 7.0 * * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* ** Copyright (c) 2007 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be included ** in all copies or substantial portions of the Materials. ** ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ #ifndef __glew_h__ #define __glew_h__ #define __GLEW_H__ #if defined(__gl_h_) || defined(__GL_H__) || defined(_GL_H) || defined(__X_GL_H) #error gl.h included before glew.h #endif #if defined(__gl2_h_) #error gl2.h included before glew.h #endif #if defined(__gltypes_h_) #error gltypes.h included before glew.h #endif #if defined(__REGAL_H__) #error Regal.h included before glew.h #endif #if defined(__glext_h_) || defined(__GLEXT_H_) #error glext.h included before glew.h #endif #if defined(__gl_ATI_h_) #error glATI.h included before glew.h #endif #define __gl_h_ #define __gl2_h_ #define __GL_H__ #define _GL_H #define __gltypes_h_ #define __REGAL_H__ #define __X_GL_H #define __glext_h_ #define __GLEXT_H_ #define __gl_ATI_h_ #if defined(_WIN32) /* * GLEW does not include to avoid name space pollution. * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t * defined properly. */ /* and */ #ifdef APIENTRY # ifndef GLAPIENTRY # define GLAPIENTRY APIENTRY # endif # ifndef GLEWAPIENTRY # define GLEWAPIENTRY APIENTRY # endif #else #define GLEW_APIENTRY_DEFINED # if defined(__MINGW32__) || defined(__CYGWIN__) || (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) # define APIENTRY __stdcall # ifndef GLAPIENTRY # define GLAPIENTRY __stdcall # endif # ifndef GLEWAPIENTRY # define GLEWAPIENTRY __stdcall # endif # else # define APIENTRY # endif #endif #ifndef GLAPI # if defined(__MINGW32__) || defined(__CYGWIN__) # define GLAPI extern # endif #endif /* */ #ifndef CALLBACK #define GLEW_CALLBACK_DEFINED # if defined(__MINGW32__) || defined(__CYGWIN__) # define CALLBACK __attribute__ ((__stdcall__)) # elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) # define CALLBACK __stdcall # else # define CALLBACK # endif #endif /* and */ #ifndef WINGDIAPI #define GLEW_WINGDIAPI_DEFINED #define WINGDIAPI __declspec(dllimport) #endif /* */ #if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) typedef unsigned short wchar_t; # define _WCHAR_T_DEFINED #endif /* */ #if !defined(_W64) # if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && defined(_MSC_VER) && _MSC_VER >= 1300 # define _W64 __w64 # else # define _W64 # endif #endif #if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) && !defined(__MINGW64__) # ifdef _WIN64 typedef __int64 ptrdiff_t; # else typedef _W64 int ptrdiff_t; # endif # define _PTRDIFF_T_DEFINED # define _PTRDIFF_T_ #endif #ifndef GLAPI # if defined(__MINGW32__) || defined(__CYGWIN__) # define GLAPI extern # else # define GLAPI WINGDIAPI # endif #endif /* * GLEW_STATIC is defined for static library. * GLEW_BUILD is defined for building the DLL library. */ #ifdef GLEW_STATIC # define GLEWAPI extern #else # ifdef GLEW_BUILD # define GLEWAPI extern __declspec(dllexport) # else # define GLEWAPI extern __declspec(dllimport) # endif #endif #else /* _UNIX */ /* * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO * C. On my system, this amounts to _3 lines_ of included code, all of * them pretty much harmless. If you know of a way of detecting 32 vs * 64 _targets_ at compile time you are free to replace this with * something that's portable. For now, _this_ is the portable solution. * (mem, 2004-01-04) */ #include /* SGI MIPSPro doesn't like stdint.h in C++ mode */ /* ID: 3376260 Solaris 9 has inttypes.h, but not stdint.h */ #if (defined(__sgi) || defined(__sun)) && !defined(__GNUC__) #include #else #include #endif #define GLEW_APIENTRY_DEFINED #define APIENTRY /* * GLEW_STATIC is defined for static library. */ #ifdef GLEW_STATIC # define GLEWAPI extern #else # if defined(__GNUC__) && __GNUC__>=4 # define GLEWAPI extern __attribute__ ((visibility("default"))) # elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) # define GLEWAPI extern __global # else # define GLEWAPI extern # endif #endif /* */ #ifndef GLAPI #define GLAPI extern #endif #endif /* _WIN32 */ #ifndef GLAPIENTRY #define GLAPIENTRY #endif #ifndef GLEWAPIENTRY #define GLEWAPIENTRY #endif #define GLEW_VAR_EXPORT GLEWAPI #define GLEW_FUN_EXPORT GLEWAPI #ifdef __cplusplus extern "C" { #endif /* ----------------------------- GL_VERSION_1_1 ---------------------------- */ #ifndef GL_VERSION_1_1 #define GL_VERSION_1_1 1 typedef unsigned int GLenum; typedef unsigned int GLbitfield; typedef unsigned int GLuint; typedef int GLint; typedef int GLsizei; typedef unsigned char GLboolean; typedef signed char GLbyte; typedef short GLshort; typedef unsigned char GLubyte; typedef unsigned short GLushort; typedef unsigned long GLulong; typedef float GLfloat; typedef float GLclampf; typedef double GLdouble; typedef double GLclampd; typedef void GLvoid; #if defined(_MSC_VER) && _MSC_VER < 1400 typedef __int64 GLint64EXT; typedef unsigned __int64 GLuint64EXT; #elif defined(_MSC_VER) || defined(__BORLANDC__) typedef signed long long GLint64EXT; typedef unsigned long long GLuint64EXT; #else # if defined(__MINGW32__) || defined(__CYGWIN__) #include # endif typedef int64_t GLint64EXT; typedef uint64_t GLuint64EXT; #endif typedef GLint64EXT GLint64; typedef GLuint64EXT GLuint64; typedef struct __GLsync *GLsync; typedef char GLchar; #define GL_ZERO 0 #define GL_FALSE 0 #define GL_LOGIC_OP 0x0BF1 #define GL_NONE 0 #define GL_TEXTURE_COMPONENTS 0x1003 #define GL_NO_ERROR 0 #define GL_POINTS 0x0000 #define GL_CURRENT_BIT 0x00000001 #define GL_TRUE 1 #define GL_ONE 1 #define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 #define GL_LINES 0x0001 #define GL_LINE_LOOP 0x0002 #define GL_POINT_BIT 0x00000002 #define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 #define GL_LINE_STRIP 0x0003 #define GL_LINE_BIT 0x00000004 #define GL_TRIANGLES 0x0004 #define GL_TRIANGLE_STRIP 0x0005 #define GL_TRIANGLE_FAN 0x0006 #define GL_QUADS 0x0007 #define GL_QUAD_STRIP 0x0008 #define GL_POLYGON_BIT 0x00000008 #define GL_POLYGON 0x0009 #define GL_POLYGON_STIPPLE_BIT 0x00000010 #define GL_PIXEL_MODE_BIT 0x00000020 #define GL_LIGHTING_BIT 0x00000040 #define GL_FOG_BIT 0x00000080 #define GL_DEPTH_BUFFER_BIT 0x00000100 #define GL_ACCUM 0x0100 #define GL_LOAD 0x0101 #define GL_RETURN 0x0102 #define GL_MULT 0x0103 #define GL_ADD 0x0104 #define GL_NEVER 0x0200 #define GL_ACCUM_BUFFER_BIT 0x00000200 #define GL_LESS 0x0201 #define GL_EQUAL 0x0202 #define GL_LEQUAL 0x0203 #define GL_GREATER 0x0204 #define GL_NOTEQUAL 0x0205 #define GL_GEQUAL 0x0206 #define GL_ALWAYS 0x0207 #define GL_SRC_COLOR 0x0300 #define GL_ONE_MINUS_SRC_COLOR 0x0301 #define GL_SRC_ALPHA 0x0302 #define GL_ONE_MINUS_SRC_ALPHA 0x0303 #define GL_DST_ALPHA 0x0304 #define GL_ONE_MINUS_DST_ALPHA 0x0305 #define GL_DST_COLOR 0x0306 #define GL_ONE_MINUS_DST_COLOR 0x0307 #define GL_SRC_ALPHA_SATURATE 0x0308 #define GL_STENCIL_BUFFER_BIT 0x00000400 #define GL_FRONT_LEFT 0x0400 #define GL_FRONT_RIGHT 0x0401 #define GL_BACK_LEFT 0x0402 #define GL_BACK_RIGHT 0x0403 #define GL_FRONT 0x0404 #define GL_BACK 0x0405 #define GL_LEFT 0x0406 #define GL_RIGHT 0x0407 #define GL_FRONT_AND_BACK 0x0408 #define GL_AUX0 0x0409 #define GL_AUX1 0x040A #define GL_AUX2 0x040B #define GL_AUX3 0x040C #define GL_INVALID_ENUM 0x0500 #define GL_INVALID_VALUE 0x0501 #define GL_INVALID_OPERATION 0x0502 #define GL_STACK_OVERFLOW 0x0503 #define GL_STACK_UNDERFLOW 0x0504 #define GL_OUT_OF_MEMORY 0x0505 #define GL_2D 0x0600 #define GL_3D 0x0601 #define GL_3D_COLOR 0x0602 #define GL_3D_COLOR_TEXTURE 0x0603 #define GL_4D_COLOR_TEXTURE 0x0604 #define GL_PASS_THROUGH_TOKEN 0x0700 #define GL_POINT_TOKEN 0x0701 #define GL_LINE_TOKEN 0x0702 #define GL_POLYGON_TOKEN 0x0703 #define GL_BITMAP_TOKEN 0x0704 #define GL_DRAW_PIXEL_TOKEN 0x0705 #define GL_COPY_PIXEL_TOKEN 0x0706 #define GL_LINE_RESET_TOKEN 0x0707 #define GL_EXP 0x0800 #define GL_VIEWPORT_BIT 0x00000800 #define GL_EXP2 0x0801 #define GL_CW 0x0900 #define GL_CCW 0x0901 #define GL_COEFF 0x0A00 #define GL_ORDER 0x0A01 #define GL_DOMAIN 0x0A02 #define GL_CURRENT_COLOR 0x0B00 #define GL_CURRENT_INDEX 0x0B01 #define GL_CURRENT_NORMAL 0x0B02 #define GL_CURRENT_TEXTURE_COORDS 0x0B03 #define GL_CURRENT_RASTER_COLOR 0x0B04 #define GL_CURRENT_RASTER_INDEX 0x0B05 #define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 #define GL_CURRENT_RASTER_POSITION 0x0B07 #define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 #define GL_CURRENT_RASTER_DISTANCE 0x0B09 #define GL_POINT_SMOOTH 0x0B10 #define GL_POINT_SIZE 0x0B11 #define GL_POINT_SIZE_RANGE 0x0B12 #define GL_POINT_SIZE_GRANULARITY 0x0B13 #define GL_LINE_SMOOTH 0x0B20 #define GL_LINE_WIDTH 0x0B21 #define GL_LINE_WIDTH_RANGE 0x0B22 #define GL_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_LINE_STIPPLE 0x0B24 #define GL_LINE_STIPPLE_PATTERN 0x0B25 #define GL_LINE_STIPPLE_REPEAT 0x0B26 #define GL_LIST_MODE 0x0B30 #define GL_MAX_LIST_NESTING 0x0B31 #define GL_LIST_BASE 0x0B32 #define GL_LIST_INDEX 0x0B33 #define GL_POLYGON_MODE 0x0B40 #define GL_POLYGON_SMOOTH 0x0B41 #define GL_POLYGON_STIPPLE 0x0B42 #define GL_EDGE_FLAG 0x0B43 #define GL_CULL_FACE 0x0B44 #define GL_CULL_FACE_MODE 0x0B45 #define GL_FRONT_FACE 0x0B46 #define GL_LIGHTING 0x0B50 #define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 #define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 #define GL_LIGHT_MODEL_AMBIENT 0x0B53 #define GL_SHADE_MODEL 0x0B54 #define GL_COLOR_MATERIAL_FACE 0x0B55 #define GL_COLOR_MATERIAL_PARAMETER 0x0B56 #define GL_COLOR_MATERIAL 0x0B57 #define GL_FOG 0x0B60 #define GL_FOG_INDEX 0x0B61 #define GL_FOG_DENSITY 0x0B62 #define GL_FOG_START 0x0B63 #define GL_FOG_END 0x0B64 #define GL_FOG_MODE 0x0B65 #define GL_FOG_COLOR 0x0B66 #define GL_DEPTH_RANGE 0x0B70 #define GL_DEPTH_TEST 0x0B71 #define GL_DEPTH_WRITEMASK 0x0B72 #define GL_DEPTH_CLEAR_VALUE 0x0B73 #define GL_DEPTH_FUNC 0x0B74 #define GL_ACCUM_CLEAR_VALUE 0x0B80 #define GL_STENCIL_TEST 0x0B90 #define GL_STENCIL_CLEAR_VALUE 0x0B91 #define GL_STENCIL_FUNC 0x0B92 #define GL_STENCIL_VALUE_MASK 0x0B93 #define GL_STENCIL_FAIL 0x0B94 #define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 #define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 #define GL_STENCIL_REF 0x0B97 #define GL_STENCIL_WRITEMASK 0x0B98 #define GL_MATRIX_MODE 0x0BA0 #define GL_NORMALIZE 0x0BA1 #define GL_VIEWPORT 0x0BA2 #define GL_MODELVIEW_STACK_DEPTH 0x0BA3 #define GL_PROJECTION_STACK_DEPTH 0x0BA4 #define GL_TEXTURE_STACK_DEPTH 0x0BA5 #define GL_MODELVIEW_MATRIX 0x0BA6 #define GL_PROJECTION_MATRIX 0x0BA7 #define GL_TEXTURE_MATRIX 0x0BA8 #define GL_ATTRIB_STACK_DEPTH 0x0BB0 #define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 #define GL_ALPHA_TEST 0x0BC0 #define GL_ALPHA_TEST_FUNC 0x0BC1 #define GL_ALPHA_TEST_REF 0x0BC2 #define GL_DITHER 0x0BD0 #define GL_BLEND_DST 0x0BE0 #define GL_BLEND_SRC 0x0BE1 #define GL_BLEND 0x0BE2 #define GL_LOGIC_OP_MODE 0x0BF0 #define GL_INDEX_LOGIC_OP 0x0BF1 #define GL_COLOR_LOGIC_OP 0x0BF2 #define GL_AUX_BUFFERS 0x0C00 #define GL_DRAW_BUFFER 0x0C01 #define GL_READ_BUFFER 0x0C02 #define GL_SCISSOR_BOX 0x0C10 #define GL_SCISSOR_TEST 0x0C11 #define GL_INDEX_CLEAR_VALUE 0x0C20 #define GL_INDEX_WRITEMASK 0x0C21 #define GL_COLOR_CLEAR_VALUE 0x0C22 #define GL_COLOR_WRITEMASK 0x0C23 #define GL_INDEX_MODE 0x0C30 #define GL_RGBA_MODE 0x0C31 #define GL_DOUBLEBUFFER 0x0C32 #define GL_STEREO 0x0C33 #define GL_RENDER_MODE 0x0C40 #define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 #define GL_POINT_SMOOTH_HINT 0x0C51 #define GL_LINE_SMOOTH_HINT 0x0C52 #define GL_POLYGON_SMOOTH_HINT 0x0C53 #define GL_FOG_HINT 0x0C54 #define GL_TEXTURE_GEN_S 0x0C60 #define GL_TEXTURE_GEN_T 0x0C61 #define GL_TEXTURE_GEN_R 0x0C62 #define GL_TEXTURE_GEN_Q 0x0C63 #define GL_PIXEL_MAP_I_TO_I 0x0C70 #define GL_PIXEL_MAP_S_TO_S 0x0C71 #define GL_PIXEL_MAP_I_TO_R 0x0C72 #define GL_PIXEL_MAP_I_TO_G 0x0C73 #define GL_PIXEL_MAP_I_TO_B 0x0C74 #define GL_PIXEL_MAP_I_TO_A 0x0C75 #define GL_PIXEL_MAP_R_TO_R 0x0C76 #define GL_PIXEL_MAP_G_TO_G 0x0C77 #define GL_PIXEL_MAP_B_TO_B 0x0C78 #define GL_PIXEL_MAP_A_TO_A 0x0C79 #define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 #define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 #define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 #define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 #define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 #define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 #define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 #define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 #define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 #define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 #define GL_UNPACK_SWAP_BYTES 0x0CF0 #define GL_UNPACK_LSB_FIRST 0x0CF1 #define GL_UNPACK_ROW_LENGTH 0x0CF2 #define GL_UNPACK_SKIP_ROWS 0x0CF3 #define GL_UNPACK_SKIP_PIXELS 0x0CF4 #define GL_UNPACK_ALIGNMENT 0x0CF5 #define GL_PACK_SWAP_BYTES 0x0D00 #define GL_PACK_LSB_FIRST 0x0D01 #define GL_PACK_ROW_LENGTH 0x0D02 #define GL_PACK_SKIP_ROWS 0x0D03 #define GL_PACK_SKIP_PIXELS 0x0D04 #define GL_PACK_ALIGNMENT 0x0D05 #define GL_MAP_COLOR 0x0D10 #define GL_MAP_STENCIL 0x0D11 #define GL_INDEX_SHIFT 0x0D12 #define GL_INDEX_OFFSET 0x0D13 #define GL_RED_SCALE 0x0D14 #define GL_RED_BIAS 0x0D15 #define GL_ZOOM_X 0x0D16 #define GL_ZOOM_Y 0x0D17 #define GL_GREEN_SCALE 0x0D18 #define GL_GREEN_BIAS 0x0D19 #define GL_BLUE_SCALE 0x0D1A #define GL_BLUE_BIAS 0x0D1B #define GL_ALPHA_SCALE 0x0D1C #define GL_ALPHA_BIAS 0x0D1D #define GL_DEPTH_SCALE 0x0D1E #define GL_DEPTH_BIAS 0x0D1F #define GL_MAX_EVAL_ORDER 0x0D30 #define GL_MAX_LIGHTS 0x0D31 #define GL_MAX_CLIP_PLANES 0x0D32 #define GL_MAX_TEXTURE_SIZE 0x0D33 #define GL_MAX_PIXEL_MAP_TABLE 0x0D34 #define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 #define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 #define GL_MAX_NAME_STACK_DEPTH 0x0D37 #define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 #define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 #define GL_MAX_VIEWPORT_DIMS 0x0D3A #define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B #define GL_SUBPIXEL_BITS 0x0D50 #define GL_INDEX_BITS 0x0D51 #define GL_RED_BITS 0x0D52 #define GL_GREEN_BITS 0x0D53 #define GL_BLUE_BITS 0x0D54 #define GL_ALPHA_BITS 0x0D55 #define GL_DEPTH_BITS 0x0D56 #define GL_STENCIL_BITS 0x0D57 #define GL_ACCUM_RED_BITS 0x0D58 #define GL_ACCUM_GREEN_BITS 0x0D59 #define GL_ACCUM_BLUE_BITS 0x0D5A #define GL_ACCUM_ALPHA_BITS 0x0D5B #define GL_NAME_STACK_DEPTH 0x0D70 #define GL_AUTO_NORMAL 0x0D80 #define GL_MAP1_COLOR_4 0x0D90 #define GL_MAP1_INDEX 0x0D91 #define GL_MAP1_NORMAL 0x0D92 #define GL_MAP1_TEXTURE_COORD_1 0x0D93 #define GL_MAP1_TEXTURE_COORD_2 0x0D94 #define GL_MAP1_TEXTURE_COORD_3 0x0D95 #define GL_MAP1_TEXTURE_COORD_4 0x0D96 #define GL_MAP1_VERTEX_3 0x0D97 #define GL_MAP1_VERTEX_4 0x0D98 #define GL_MAP2_COLOR_4 0x0DB0 #define GL_MAP2_INDEX 0x0DB1 #define GL_MAP2_NORMAL 0x0DB2 #define GL_MAP2_TEXTURE_COORD_1 0x0DB3 #define GL_MAP2_TEXTURE_COORD_2 0x0DB4 #define GL_MAP2_TEXTURE_COORD_3 0x0DB5 #define GL_MAP2_TEXTURE_COORD_4 0x0DB6 #define GL_MAP2_VERTEX_3 0x0DB7 #define GL_MAP2_VERTEX_4 0x0DB8 #define GL_MAP1_GRID_DOMAIN 0x0DD0 #define GL_MAP1_GRID_SEGMENTS 0x0DD1 #define GL_MAP2_GRID_DOMAIN 0x0DD2 #define GL_MAP2_GRID_SEGMENTS 0x0DD3 #define GL_TEXTURE_1D 0x0DE0 #define GL_TEXTURE_2D 0x0DE1 #define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 #define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 #define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 #define GL_SELECTION_BUFFER_POINTER 0x0DF3 #define GL_SELECTION_BUFFER_SIZE 0x0DF4 #define GL_TEXTURE_WIDTH 0x1000 #define GL_TRANSFORM_BIT 0x00001000 #define GL_TEXTURE_HEIGHT 0x1001 #define GL_TEXTURE_INTERNAL_FORMAT 0x1003 #define GL_TEXTURE_BORDER_COLOR 0x1004 #define GL_TEXTURE_BORDER 0x1005 #define GL_DONT_CARE 0x1100 #define GL_FASTEST 0x1101 #define GL_NICEST 0x1102 #define GL_AMBIENT 0x1200 #define GL_DIFFUSE 0x1201 #define GL_SPECULAR 0x1202 #define GL_POSITION 0x1203 #define GL_SPOT_DIRECTION 0x1204 #define GL_SPOT_EXPONENT 0x1205 #define GL_SPOT_CUTOFF 0x1206 #define GL_CONSTANT_ATTENUATION 0x1207 #define GL_LINEAR_ATTENUATION 0x1208 #define GL_QUADRATIC_ATTENUATION 0x1209 #define GL_COMPILE 0x1300 #define GL_COMPILE_AND_EXECUTE 0x1301 #define GL_BYTE 0x1400 #define GL_UNSIGNED_BYTE 0x1401 #define GL_SHORT 0x1402 #define GL_UNSIGNED_SHORT 0x1403 #define GL_INT 0x1404 #define GL_UNSIGNED_INT 0x1405 #define GL_FLOAT 0x1406 #define GL_2_BYTES 0x1407 #define GL_3_BYTES 0x1408 #define GL_4_BYTES 0x1409 #define GL_DOUBLE 0x140A #define GL_CLEAR 0x1500 #define GL_AND 0x1501 #define GL_AND_REVERSE 0x1502 #define GL_COPY 0x1503 #define GL_AND_INVERTED 0x1504 #define GL_NOOP 0x1505 #define GL_XOR 0x1506 #define GL_OR 0x1507 #define GL_NOR 0x1508 #define GL_EQUIV 0x1509 #define GL_INVERT 0x150A #define GL_OR_REVERSE 0x150B #define GL_COPY_INVERTED 0x150C #define GL_OR_INVERTED 0x150D #define GL_NAND 0x150E #define GL_SET 0x150F #define GL_EMISSION 0x1600 #define GL_SHININESS 0x1601 #define GL_AMBIENT_AND_DIFFUSE 0x1602 #define GL_COLOR_INDEXES 0x1603 #define GL_MODELVIEW 0x1700 #define GL_PROJECTION 0x1701 #define GL_TEXTURE 0x1702 #define GL_COLOR 0x1800 #define GL_DEPTH 0x1801 #define GL_STENCIL 0x1802 #define GL_COLOR_INDEX 0x1900 #define GL_STENCIL_INDEX 0x1901 #define GL_DEPTH_COMPONENT 0x1902 #define GL_RED 0x1903 #define GL_GREEN 0x1904 #define GL_BLUE 0x1905 #define GL_ALPHA 0x1906 #define GL_RGB 0x1907 #define GL_RGBA 0x1908 #define GL_LUMINANCE 0x1909 #define GL_LUMINANCE_ALPHA 0x190A #define GL_BITMAP 0x1A00 #define GL_POINT 0x1B00 #define GL_LINE 0x1B01 #define GL_FILL 0x1B02 #define GL_RENDER 0x1C00 #define GL_FEEDBACK 0x1C01 #define GL_SELECT 0x1C02 #define GL_FLAT 0x1D00 #define GL_SMOOTH 0x1D01 #define GL_KEEP 0x1E00 #define GL_REPLACE 0x1E01 #define GL_INCR 0x1E02 #define GL_DECR 0x1E03 #define GL_VENDOR 0x1F00 #define GL_RENDERER 0x1F01 #define GL_VERSION 0x1F02 #define GL_EXTENSIONS 0x1F03 #define GL_S 0x2000 #define GL_ENABLE_BIT 0x00002000 #define GL_T 0x2001 #define GL_R 0x2002 #define GL_Q 0x2003 #define GL_MODULATE 0x2100 #define GL_DECAL 0x2101 #define GL_TEXTURE_ENV_MODE 0x2200 #define GL_TEXTURE_ENV_COLOR 0x2201 #define GL_TEXTURE_ENV 0x2300 #define GL_EYE_LINEAR 0x2400 #define GL_OBJECT_LINEAR 0x2401 #define GL_SPHERE_MAP 0x2402 #define GL_TEXTURE_GEN_MODE 0x2500 #define GL_OBJECT_PLANE 0x2501 #define GL_EYE_PLANE 0x2502 #define GL_NEAREST 0x2600 #define GL_LINEAR 0x2601 #define GL_NEAREST_MIPMAP_NEAREST 0x2700 #define GL_LINEAR_MIPMAP_NEAREST 0x2701 #define GL_NEAREST_MIPMAP_LINEAR 0x2702 #define GL_LINEAR_MIPMAP_LINEAR 0x2703 #define GL_TEXTURE_MAG_FILTER 0x2800 #define GL_TEXTURE_MIN_FILTER 0x2801 #define GL_TEXTURE_WRAP_S 0x2802 #define GL_TEXTURE_WRAP_T 0x2803 #define GL_CLAMP 0x2900 #define GL_REPEAT 0x2901 #define GL_POLYGON_OFFSET_UNITS 0x2A00 #define GL_POLYGON_OFFSET_POINT 0x2A01 #define GL_POLYGON_OFFSET_LINE 0x2A02 #define GL_R3_G3_B2 0x2A10 #define GL_V2F 0x2A20 #define GL_V3F 0x2A21 #define GL_C4UB_V2F 0x2A22 #define GL_C4UB_V3F 0x2A23 #define GL_C3F_V3F 0x2A24 #define GL_N3F_V3F 0x2A25 #define GL_C4F_N3F_V3F 0x2A26 #define GL_T2F_V3F 0x2A27 #define GL_T4F_V4F 0x2A28 #define GL_T2F_C4UB_V3F 0x2A29 #define GL_T2F_C3F_V3F 0x2A2A #define GL_T2F_N3F_V3F 0x2A2B #define GL_T2F_C4F_N3F_V3F 0x2A2C #define GL_T4F_C4F_N3F_V4F 0x2A2D #define GL_CLIP_PLANE0 0x3000 #define GL_CLIP_PLANE1 0x3001 #define GL_CLIP_PLANE2 0x3002 #define GL_CLIP_PLANE3 0x3003 #define GL_CLIP_PLANE4 0x3004 #define GL_CLIP_PLANE5 0x3005 #define GL_LIGHT0 0x4000 #define GL_COLOR_BUFFER_BIT 0x00004000 #define GL_LIGHT1 0x4001 #define GL_LIGHT2 0x4002 #define GL_LIGHT3 0x4003 #define GL_LIGHT4 0x4004 #define GL_LIGHT5 0x4005 #define GL_LIGHT6 0x4006 #define GL_LIGHT7 0x4007 #define GL_HINT_BIT 0x00008000 #define GL_POLYGON_OFFSET_FILL 0x8037 #define GL_POLYGON_OFFSET_FACTOR 0x8038 #define GL_ALPHA4 0x803B #define GL_ALPHA8 0x803C #define GL_ALPHA12 0x803D #define GL_ALPHA16 0x803E #define GL_LUMINANCE4 0x803F #define GL_LUMINANCE8 0x8040 #define GL_LUMINANCE12 0x8041 #define GL_LUMINANCE16 0x8042 #define GL_LUMINANCE4_ALPHA4 0x8043 #define GL_LUMINANCE6_ALPHA2 0x8044 #define GL_LUMINANCE8_ALPHA8 0x8045 #define GL_LUMINANCE12_ALPHA4 0x8046 #define GL_LUMINANCE12_ALPHA12 0x8047 #define GL_LUMINANCE16_ALPHA16 0x8048 #define GL_INTENSITY 0x8049 #define GL_INTENSITY4 0x804A #define GL_INTENSITY8 0x804B #define GL_INTENSITY12 0x804C #define GL_INTENSITY16 0x804D #define GL_RGB4 0x804F #define GL_RGB5 0x8050 #define GL_RGB8 0x8051 #define GL_RGB10 0x8052 #define GL_RGB12 0x8053 #define GL_RGB16 0x8054 #define GL_RGBA2 0x8055 #define GL_RGBA4 0x8056 #define GL_RGB5_A1 0x8057 #define GL_RGBA8 0x8058 #define GL_RGB10_A2 0x8059 #define GL_RGBA12 0x805A #define GL_RGBA16 0x805B #define GL_TEXTURE_RED_SIZE 0x805C #define GL_TEXTURE_GREEN_SIZE 0x805D #define GL_TEXTURE_BLUE_SIZE 0x805E #define GL_TEXTURE_ALPHA_SIZE 0x805F #define GL_TEXTURE_LUMINANCE_SIZE 0x8060 #define GL_TEXTURE_INTENSITY_SIZE 0x8061 #define GL_PROXY_TEXTURE_1D 0x8063 #define GL_PROXY_TEXTURE_2D 0x8064 #define GL_TEXTURE_PRIORITY 0x8066 #define GL_TEXTURE_RESIDENT 0x8067 #define GL_TEXTURE_BINDING_1D 0x8068 #define GL_TEXTURE_BINDING_2D 0x8069 #define GL_VERTEX_ARRAY 0x8074 #define GL_NORMAL_ARRAY 0x8075 #define GL_COLOR_ARRAY 0x8076 #define GL_INDEX_ARRAY 0x8077 #define GL_TEXTURE_COORD_ARRAY 0x8078 #define GL_EDGE_FLAG_ARRAY 0x8079 #define GL_VERTEX_ARRAY_SIZE 0x807A #define GL_VERTEX_ARRAY_TYPE 0x807B #define GL_VERTEX_ARRAY_STRIDE 0x807C #define GL_NORMAL_ARRAY_TYPE 0x807E #define GL_NORMAL_ARRAY_STRIDE 0x807F #define GL_COLOR_ARRAY_SIZE 0x8081 #define GL_COLOR_ARRAY_TYPE 0x8082 #define GL_COLOR_ARRAY_STRIDE 0x8083 #define GL_INDEX_ARRAY_TYPE 0x8085 #define GL_INDEX_ARRAY_STRIDE 0x8086 #define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 #define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 #define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A #define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C #define GL_VERTEX_ARRAY_POINTER 0x808E #define GL_NORMAL_ARRAY_POINTER 0x808F #define GL_COLOR_ARRAY_POINTER 0x8090 #define GL_INDEX_ARRAY_POINTER 0x8091 #define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 #define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 #define GL_COLOR_INDEX1_EXT 0x80E2 #define GL_COLOR_INDEX2_EXT 0x80E3 #define GL_COLOR_INDEX4_EXT 0x80E4 #define GL_COLOR_INDEX8_EXT 0x80E5 #define GL_COLOR_INDEX12_EXT 0x80E6 #define GL_COLOR_INDEX16_EXT 0x80E7 #define GL_EVAL_BIT 0x00010000 #define GL_LIST_BIT 0x00020000 #define GL_TEXTURE_BIT 0x00040000 #define GL_SCISSOR_BIT 0x00080000 #define GL_ALL_ATTRIB_BITS 0x000fffff #define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value); GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref); GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); GLAPI void GLAPIENTRY glArrayElement (GLint i); GLAPI void GLAPIENTRY glBegin (GLenum mode); GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture); GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); GLAPI void GLAPIENTRY glCallList (GLuint list); GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const void *lists); GLAPI void GLAPIENTRY glClear (GLbitfield mask); GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); GLAPI void GLAPIENTRY glClearDepth (GLclampd depth); GLAPI void GLAPIENTRY glClearIndex (GLfloat c); GLAPI void GLAPIENTRY glClearStencil (GLint s); GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation); GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v); GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v); GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v); GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue); GLAPI void GLAPIENTRY glColor3iv (const GLint *v); GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); GLAPI void GLAPIENTRY glColor3sv (const GLshort *v); GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v); GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v); GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); GLAPI void GLAPIENTRY glColor3usv (const GLushort *v); GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v); GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v); GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v); GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); GLAPI void GLAPIENTRY glColor4iv (const GLint *v); GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); GLAPI void GLAPIENTRY glColor4sv (const GLshort *v); GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v); GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v); GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); GLAPI void GLAPIENTRY glColor4usv (const GLushort *v); GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode); GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void GLAPIENTRY glCullFace (GLenum mode); GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range); GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); GLAPI void GLAPIENTRY glDepthFunc (GLenum func); GLAPI void GLAPIENTRY glDepthMask (GLboolean flag); GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); GLAPI void GLAPIENTRY glDisable (GLenum cap); GLAPI void GLAPIENTRY glDisableClientState (GLenum array); GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode); GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const void *pointer); GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag); GLAPI void GLAPIENTRY glEnable (GLenum cap); GLAPI void GLAPIENTRY glEnableClientState (GLenum array); GLAPI void GLAPIENTRY glEnd (void); GLAPI void GLAPIENTRY glEndList (void); GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u); GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u); GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u); GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u); GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v); GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u); GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v); GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u); GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); GLAPI void GLAPIENTRY glEvalPoint1 (GLint i); GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j); GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); GLAPI void GLAPIENTRY glFinish (void); GLAPI void GLAPIENTRY glFlush (void); GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param); GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glFrontFace (GLenum mode); GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range); GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures); GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params); GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params); GLAPI GLenum GLAPIENTRY glGetError (void); GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values); GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, void* *params); GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask); GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name); GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels); GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode); GLAPI void GLAPIENTRY glIndexMask (GLuint mask); GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const void *pointer); GLAPI void GLAPIENTRY glIndexd (GLdouble c); GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c); GLAPI void GLAPIENTRY glIndexf (GLfloat c); GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c); GLAPI void GLAPIENTRY glIndexi (GLint c); GLAPI void GLAPIENTRY glIndexiv (const GLint *c); GLAPI void GLAPIENTRY glIndexs (GLshort c); GLAPI void GLAPIENTRY glIndexsv (const GLshort *c); GLAPI void GLAPIENTRY glIndexub (GLubyte c); GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c); GLAPI void GLAPIENTRY glInitNames (void); GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const void *pointer); GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap); GLAPI GLboolean GLAPIENTRY glIsList (GLuint list); GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture); GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param); GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param); GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern); GLAPI void GLAPIENTRY glLineWidth (GLfloat width); GLAPI void GLAPIENTRY glListBase (GLuint base); GLAPI void GLAPIENTRY glLoadIdentity (void); GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m); GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m); GLAPI void GLAPIENTRY glLoadName (GLuint name); GLAPI void GLAPIENTRY glLogicOp (GLenum opcode); GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param); GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glMatrixMode (GLenum mode); GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m); GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m); GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode); GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v); GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v); GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v); GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); GLAPI void GLAPIENTRY glNormal3iv (const GLint *v); GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v); GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const void *pointer); GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); GLAPI void GLAPIENTRY glPassThrough (GLfloat token); GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param); GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param); GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); GLAPI void GLAPIENTRY glPointSize (GLfloat size); GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode); GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units); GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask); GLAPI void GLAPIENTRY glPopAttrib (void); GLAPI void GLAPIENTRY glPopClientAttrib (void); GLAPI void GLAPIENTRY glPopMatrix (void); GLAPI void GLAPIENTRY glPopName (void); GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask); GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask); GLAPI void GLAPIENTRY glPushMatrix (void); GLAPI void GLAPIENTRY glPushName (GLuint name); GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y); GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v); GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y); GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v); GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y); GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v); GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y); GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v); GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v); GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v); GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z); GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v); GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v); GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v); GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v); GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v); GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v); GLAPI void GLAPIENTRY glReadBuffer (GLenum mode); GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2); GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2); GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode); GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); GLAPI void GLAPIENTRY glShadeModel (GLenum mode); GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); GLAPI void GLAPIENTRY glStencilMask (GLuint mask); GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s); GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v); GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s); GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v); GLAPI void GLAPIENTRY glTexCoord1i (GLint s); GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v); GLAPI void GLAPIENTRY glTexCoord1s (GLshort s); GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v); GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t); GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v); GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t); GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v); GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t); GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v); GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t); GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v); GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v); GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v); GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r); GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v); GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v); GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v); GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v); GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v); GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v); GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y); GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v); GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y); GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v); GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y); GLAPI void GLAPIENTRY glVertex2iv (const GLint *v); GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y); GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v); GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v); GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v); GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z); GLAPI void GLAPIENTRY glVertex3iv (const GLint *v); GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v); GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v); GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v); GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); GLAPI void GLAPIENTRY glVertex4iv (const GLint *v); GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v); GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); #define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) #endif /* GL_VERSION_1_1 */ /* ---------------------------------- GLU ---------------------------------- */ #ifndef GLEW_NO_GLU # ifdef __APPLE__ # include # if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) # define GLEW_NO_GLU # endif # endif #endif #ifndef GLEW_NO_GLU /* this is where we can safely include GLU */ # if defined(__APPLE__) && defined(__MACH__) # include # else # include # endif #endif /* ----------------------------- GL_VERSION_1_2 ---------------------------- */ #ifndef GL_VERSION_1_2 #define GL_VERSION_1_2 1 #define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 #define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 #define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 #define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_UNSIGNED_BYTE_3_3_2 0x8032 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 #define GL_UNSIGNED_INT_8_8_8_8 0x8035 #define GL_UNSIGNED_INT_10_10_10_2 0x8036 #define GL_RESCALE_NORMAL 0x803A #define GL_TEXTURE_BINDING_3D 0x806A #define GL_PACK_SKIP_IMAGES 0x806B #define GL_PACK_IMAGE_HEIGHT 0x806C #define GL_UNPACK_SKIP_IMAGES 0x806D #define GL_UNPACK_IMAGE_HEIGHT 0x806E #define GL_TEXTURE_3D 0x806F #define GL_PROXY_TEXTURE_3D 0x8070 #define GL_TEXTURE_DEPTH 0x8071 #define GL_TEXTURE_WRAP_R 0x8072 #define GL_MAX_3D_TEXTURE_SIZE 0x8073 #define GL_BGR 0x80E0 #define GL_BGRA 0x80E1 #define GL_MAX_ELEMENTS_VERTICES 0x80E8 #define GL_MAX_ELEMENTS_INDICES 0x80E9 #define GL_CLAMP_TO_EDGE 0x812F #define GL_TEXTURE_MIN_LOD 0x813A #define GL_TEXTURE_MAX_LOD 0x813B #define GL_TEXTURE_BASE_LEVEL 0x813C #define GL_TEXTURE_MAX_LEVEL 0x813D #define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 #define GL_SINGLE_COLOR 0x81F9 #define GL_SEPARATE_SPECULAR_COLOR 0x81FA #define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 #define GL_UNSIGNED_SHORT_5_6_5 0x8363 #define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 #define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 #define GL_ALIASED_POINT_SIZE_RANGE 0x846D #define GL_ALIASED_LINE_WIDTH_RANGE 0x846E typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); #define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D) #define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements) #define glTexImage3D GLEW_GET_FUN(__glewTexImage3D) #define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D) #define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2) #endif /* GL_VERSION_1_2 */ /* ---------------------------- GL_VERSION_1_2_1 --------------------------- */ #ifndef GL_VERSION_1_2_1 #define GL_VERSION_1_2_1 1 #define GLEW_VERSION_1_2_1 GLEW_GET_VAR(__GLEW_VERSION_1_2_1) #endif /* GL_VERSION_1_2_1 */ /* ----------------------------- GL_VERSION_1_3 ---------------------------- */ #ifndef GL_VERSION_1_3 #define GL_VERSION_1_3 1 #define GL_MULTISAMPLE 0x809D #define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E #define GL_SAMPLE_ALPHA_TO_ONE 0x809F #define GL_SAMPLE_COVERAGE 0x80A0 #define GL_SAMPLE_BUFFERS 0x80A8 #define GL_SAMPLES 0x80A9 #define GL_SAMPLE_COVERAGE_VALUE 0x80AA #define GL_SAMPLE_COVERAGE_INVERT 0x80AB #define GL_CLAMP_TO_BORDER 0x812D #define GL_TEXTURE0 0x84C0 #define GL_TEXTURE1 0x84C1 #define GL_TEXTURE2 0x84C2 #define GL_TEXTURE3 0x84C3 #define GL_TEXTURE4 0x84C4 #define GL_TEXTURE5 0x84C5 #define GL_TEXTURE6 0x84C6 #define GL_TEXTURE7 0x84C7 #define GL_TEXTURE8 0x84C8 #define GL_TEXTURE9 0x84C9 #define GL_TEXTURE10 0x84CA #define GL_TEXTURE11 0x84CB #define GL_TEXTURE12 0x84CC #define GL_TEXTURE13 0x84CD #define GL_TEXTURE14 0x84CE #define GL_TEXTURE15 0x84CF #define GL_TEXTURE16 0x84D0 #define GL_TEXTURE17 0x84D1 #define GL_TEXTURE18 0x84D2 #define GL_TEXTURE19 0x84D3 #define GL_TEXTURE20 0x84D4 #define GL_TEXTURE21 0x84D5 #define GL_TEXTURE22 0x84D6 #define GL_TEXTURE23 0x84D7 #define GL_TEXTURE24 0x84D8 #define GL_TEXTURE25 0x84D9 #define GL_TEXTURE26 0x84DA #define GL_TEXTURE27 0x84DB #define GL_TEXTURE28 0x84DC #define GL_TEXTURE29 0x84DD #define GL_TEXTURE30 0x84DE #define GL_TEXTURE31 0x84DF #define GL_ACTIVE_TEXTURE 0x84E0 #define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 #define GL_MAX_TEXTURE_UNITS 0x84E2 #define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 #define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 #define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 #define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 #define GL_SUBTRACT 0x84E7 #define GL_COMPRESSED_ALPHA 0x84E9 #define GL_COMPRESSED_LUMINANCE 0x84EA #define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB #define GL_COMPRESSED_INTENSITY 0x84EC #define GL_COMPRESSED_RGB 0x84ED #define GL_COMPRESSED_RGBA 0x84EE #define GL_TEXTURE_COMPRESSION_HINT 0x84EF #define GL_NORMAL_MAP 0x8511 #define GL_REFLECTION_MAP 0x8512 #define GL_TEXTURE_CUBE_MAP 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C #define GL_COMBINE 0x8570 #define GL_COMBINE_RGB 0x8571 #define GL_COMBINE_ALPHA 0x8572 #define GL_RGB_SCALE 0x8573 #define GL_ADD_SIGNED 0x8574 #define GL_INTERPOLATE 0x8575 #define GL_CONSTANT 0x8576 #define GL_PRIMARY_COLOR 0x8577 #define GL_PREVIOUS 0x8578 #define GL_SOURCE0_RGB 0x8580 #define GL_SOURCE1_RGB 0x8581 #define GL_SOURCE2_RGB 0x8582 #define GL_SOURCE0_ALPHA 0x8588 #define GL_SOURCE1_ALPHA 0x8589 #define GL_SOURCE2_ALPHA 0x858A #define GL_OPERAND0_RGB 0x8590 #define GL_OPERAND1_RGB 0x8591 #define GL_OPERAND2_RGB 0x8592 #define GL_OPERAND0_ALPHA 0x8598 #define GL_OPERAND1_ALPHA 0x8599 #define GL_OPERAND2_ALPHA 0x859A #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 #define GL_TEXTURE_COMPRESSED 0x86A1 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 #define GL_DOT3_RGB 0x86AE #define GL_DOT3_RGBA 0x86AF #define GL_MULTISAMPLE_BIT 0x20000000 typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, void *img); typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); #define glActiveTexture GLEW_GET_FUN(__glewActiveTexture) #define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture) #define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D) #define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D) #define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D) #define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D) #define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D) #define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D) #define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage) #define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd) #define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf) #define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd) #define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf) #define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d) #define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv) #define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f) #define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv) #define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i) #define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv) #define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s) #define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv) #define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d) #define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv) #define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f) #define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv) #define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i) #define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv) #define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s) #define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv) #define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d) #define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv) #define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f) #define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv) #define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i) #define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv) #define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s) #define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv) #define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d) #define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv) #define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f) #define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv) #define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i) #define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv) #define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s) #define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv) #define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage) #define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3) #endif /* GL_VERSION_1_3 */ /* ----------------------------- GL_VERSION_1_4 ---------------------------- */ #ifndef GL_VERSION_1_4 #define GL_VERSION_1_4 1 #define GL_BLEND_DST_RGB 0x80C8 #define GL_BLEND_SRC_RGB 0x80C9 #define GL_BLEND_DST_ALPHA 0x80CA #define GL_BLEND_SRC_ALPHA 0x80CB #define GL_POINT_SIZE_MIN 0x8126 #define GL_POINT_SIZE_MAX 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 #define GL_POINT_DISTANCE_ATTENUATION 0x8129 #define GL_GENERATE_MIPMAP 0x8191 #define GL_GENERATE_MIPMAP_HINT 0x8192 #define GL_DEPTH_COMPONENT16 0x81A5 #define GL_DEPTH_COMPONENT24 0x81A6 #define GL_DEPTH_COMPONENT32 0x81A7 #define GL_MIRRORED_REPEAT 0x8370 #define GL_FOG_COORDINATE_SOURCE 0x8450 #define GL_FOG_COORDINATE 0x8451 #define GL_FRAGMENT_DEPTH 0x8452 #define GL_CURRENT_FOG_COORDINATE 0x8453 #define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 #define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 #define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 #define GL_FOG_COORDINATE_ARRAY 0x8457 #define GL_COLOR_SUM 0x8458 #define GL_CURRENT_SECONDARY_COLOR 0x8459 #define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A #define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B #define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C #define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D #define GL_SECONDARY_COLOR_ARRAY 0x845E #define GL_MAX_TEXTURE_LOD_BIAS 0x84FD #define GL_TEXTURE_FILTER_CONTROL 0x8500 #define GL_TEXTURE_LOD_BIAS 0x8501 #define GL_INCR_WRAP 0x8507 #define GL_DECR_WRAP 0x8508 #define GL_TEXTURE_DEPTH_SIZE 0x884A #define GL_DEPTH_TEXTURE_MODE 0x884B #define GL_TEXTURE_COMPARE_MODE 0x884C #define GL_TEXTURE_COMPARE_FUNC 0x884D #define GL_COMPARE_R_TO_TEXTURE 0x884E typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord); typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const* indices, GLsizei drawcount); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); #define glBlendColor GLEW_GET_FUN(__glewBlendColor) #define glBlendEquation GLEW_GET_FUN(__glewBlendEquation) #define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate) #define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer) #define glFogCoordd GLEW_GET_FUN(__glewFogCoordd) #define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv) #define glFogCoordf GLEW_GET_FUN(__glewFogCoordf) #define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv) #define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays) #define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements) #define glPointParameterf GLEW_GET_FUN(__glewPointParameterf) #define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv) #define glPointParameteri GLEW_GET_FUN(__glewPointParameteri) #define glPointParameteriv GLEW_GET_FUN(__glewPointParameteriv) #define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b) #define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv) #define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d) #define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv) #define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f) #define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv) #define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i) #define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv) #define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s) #define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv) #define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub) #define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv) #define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui) #define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv) #define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us) #define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv) #define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer) #define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d) #define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv) #define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f) #define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv) #define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i) #define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv) #define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s) #define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv) #define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d) #define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv) #define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f) #define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv) #define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i) #define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv) #define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s) #define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv) #define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4) #endif /* GL_VERSION_1_4 */ /* ----------------------------- GL_VERSION_1_5 ---------------------------- */ #ifndef GL_VERSION_1_5 #define GL_VERSION_1_5 1 #define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE #define GL_FOG_COORD GL_FOG_COORDINATE #define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY #define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING #define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER #define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE #define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE #define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE #define GL_SRC0_ALPHA GL_SOURCE0_ALPHA #define GL_SRC0_RGB GL_SOURCE0_RGB #define GL_SRC1_ALPHA GL_SOURCE1_ALPHA #define GL_SRC1_RGB GL_SOURCE1_RGB #define GL_SRC2_ALPHA GL_SOURCE2_ALPHA #define GL_SRC2_RGB GL_SOURCE2_RGB #define GL_BUFFER_SIZE 0x8764 #define GL_BUFFER_USAGE 0x8765 #define GL_QUERY_COUNTER_BITS 0x8864 #define GL_CURRENT_QUERY 0x8865 #define GL_QUERY_RESULT 0x8866 #define GL_QUERY_RESULT_AVAILABLE 0x8867 #define GL_ARRAY_BUFFER 0x8892 #define GL_ELEMENT_ARRAY_BUFFER 0x8893 #define GL_ARRAY_BUFFER_BINDING 0x8894 #define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 #define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 #define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 #define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 #define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D #define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F #define GL_READ_ONLY 0x88B8 #define GL_WRITE_ONLY 0x88B9 #define GL_READ_WRITE 0x88BA #define GL_BUFFER_ACCESS 0x88BB #define GL_BUFFER_MAPPED 0x88BC #define GL_BUFFER_MAP_POINTER 0x88BD #define GL_STREAM_DRAW 0x88E0 #define GL_STREAM_READ 0x88E1 #define GL_STREAM_COPY 0x88E2 #define GL_STATIC_DRAW 0x88E4 #define GL_STATIC_READ 0x88E5 #define GL_STATIC_COPY 0x88E6 #define GL_DYNAMIC_DRAW 0x88E8 #define GL_DYNAMIC_READ 0x88E9 #define GL_DYNAMIC_COPY 0x88EA #define GL_SAMPLES_PASSED 0x8914 typedef ptrdiff_t GLintptr; typedef ptrdiff_t GLsizeiptr; typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void* data, GLenum usage); typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void* data); typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers); typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers); typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void** params); typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void* data); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer); typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id); typedef void* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target); #define glBeginQuery GLEW_GET_FUN(__glewBeginQuery) #define glBindBuffer GLEW_GET_FUN(__glewBindBuffer) #define glBufferData GLEW_GET_FUN(__glewBufferData) #define glBufferSubData GLEW_GET_FUN(__glewBufferSubData) #define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers) #define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries) #define glEndQuery GLEW_GET_FUN(__glewEndQuery) #define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) #define glGenQueries GLEW_GET_FUN(__glewGenQueries) #define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv) #define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv) #define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData) #define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv) #define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv) #define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv) #define glIsBuffer GLEW_GET_FUN(__glewIsBuffer) #define glIsQuery GLEW_GET_FUN(__glewIsQuery) #define glMapBuffer GLEW_GET_FUN(__glewMapBuffer) #define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer) #define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5) #endif /* GL_VERSION_1_5 */ /* ----------------------------- GL_VERSION_2_0 ---------------------------- */ #ifndef GL_VERSION_2_0 #define GL_VERSION_2_0 1 #define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION #define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 #define GL_CURRENT_VERTEX_ATTRIB 0x8626 #define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 #define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 #define GL_STENCIL_BACK_FUNC 0x8800 #define GL_STENCIL_BACK_FAIL 0x8801 #define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 #define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 #define GL_MAX_DRAW_BUFFERS 0x8824 #define GL_DRAW_BUFFER0 0x8825 #define GL_DRAW_BUFFER1 0x8826 #define GL_DRAW_BUFFER2 0x8827 #define GL_DRAW_BUFFER3 0x8828 #define GL_DRAW_BUFFER4 0x8829 #define GL_DRAW_BUFFER5 0x882A #define GL_DRAW_BUFFER6 0x882B #define GL_DRAW_BUFFER7 0x882C #define GL_DRAW_BUFFER8 0x882D #define GL_DRAW_BUFFER9 0x882E #define GL_DRAW_BUFFER10 0x882F #define GL_DRAW_BUFFER11 0x8830 #define GL_DRAW_BUFFER12 0x8831 #define GL_DRAW_BUFFER13 0x8832 #define GL_DRAW_BUFFER14 0x8833 #define GL_DRAW_BUFFER15 0x8834 #define GL_BLEND_EQUATION_ALPHA 0x883D #define GL_POINT_SPRITE 0x8861 #define GL_COORD_REPLACE 0x8862 #define GL_MAX_VERTEX_ATTRIBS 0x8869 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A #define GL_MAX_TEXTURE_COORDS 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 #define GL_FRAGMENT_SHADER 0x8B30 #define GL_VERTEX_SHADER 0x8B31 #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 #define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A #define GL_MAX_VARYING_FLOATS 0x8B4B #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D #define GL_SHADER_TYPE 0x8B4F #define GL_FLOAT_VEC2 0x8B50 #define GL_FLOAT_VEC3 0x8B51 #define GL_FLOAT_VEC4 0x8B52 #define GL_INT_VEC2 0x8B53 #define GL_INT_VEC3 0x8B54 #define GL_INT_VEC4 0x8B55 #define GL_BOOL 0x8B56 #define GL_BOOL_VEC2 0x8B57 #define GL_BOOL_VEC3 0x8B58 #define GL_BOOL_VEC4 0x8B59 #define GL_FLOAT_MAT2 0x8B5A #define GL_FLOAT_MAT3 0x8B5B #define GL_FLOAT_MAT4 0x8B5C #define GL_SAMPLER_1D 0x8B5D #define GL_SAMPLER_2D 0x8B5E #define GL_SAMPLER_3D 0x8B5F #define GL_SAMPLER_CUBE 0x8B60 #define GL_SAMPLER_1D_SHADOW 0x8B61 #define GL_SAMPLER_2D_SHADOW 0x8B62 #define GL_DELETE_STATUS 0x8B80 #define GL_COMPILE_STATUS 0x8B81 #define GL_LINK_STATUS 0x8B82 #define GL_VALIDATE_STATUS 0x8B83 #define GL_INFO_LOG_LENGTH 0x8B84 #define GL_ATTACHED_SHADERS 0x8B85 #define GL_ACTIVE_UNIFORMS 0x8B86 #define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 #define GL_SHADER_SOURCE_LENGTH 0x8B88 #define GL_ACTIVE_ATTRIBUTES 0x8B89 #define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B #define GL_SHADING_LANGUAGE_VERSION 0x8B8C #define GL_CURRENT_PROGRAM 0x8B8D #define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 #define GL_LOWER_LEFT 0x8CA1 #define GL_UPPER_LEFT 0x8CA2 #define GL_STENCIL_BACK_REF 0x8CA3 #define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 #define GL_STENCIL_BACK_WRITEMASK 0x8CA5 typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader); typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void); typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type); typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader); typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLuint obj, GLsizei maxLength, GLsizei* length, GLchar* source); typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param); typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void** pointer); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program); typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader); typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const* string, const GLint* length); typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); #define glAttachShader GLEW_GET_FUN(__glewAttachShader) #define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation) #define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate) #define glCompileShader GLEW_GET_FUN(__glewCompileShader) #define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) #define glCreateShader GLEW_GET_FUN(__glewCreateShader) #define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram) #define glDeleteShader GLEW_GET_FUN(__glewDeleteShader) #define glDetachShader GLEW_GET_FUN(__glewDetachShader) #define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray) #define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers) #define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray) #define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib) #define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform) #define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders) #define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation) #define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog) #define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv) #define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog) #define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource) #define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv) #define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation) #define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv) #define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv) #define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv) #define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv) #define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv) #define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv) #define glIsProgram GLEW_GET_FUN(__glewIsProgram) #define glIsShader GLEW_GET_FUN(__glewIsShader) #define glLinkProgram GLEW_GET_FUN(__glewLinkProgram) #define glShaderSource GLEW_GET_FUN(__glewShaderSource) #define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate) #define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate) #define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate) #define glUniform1f GLEW_GET_FUN(__glewUniform1f) #define glUniform1fv GLEW_GET_FUN(__glewUniform1fv) #define glUniform1i GLEW_GET_FUN(__glewUniform1i) #define glUniform1iv GLEW_GET_FUN(__glewUniform1iv) #define glUniform2f GLEW_GET_FUN(__glewUniform2f) #define glUniform2fv GLEW_GET_FUN(__glewUniform2fv) #define glUniform2i GLEW_GET_FUN(__glewUniform2i) #define glUniform2iv GLEW_GET_FUN(__glewUniform2iv) #define glUniform3f GLEW_GET_FUN(__glewUniform3f) #define glUniform3fv GLEW_GET_FUN(__glewUniform3fv) #define glUniform3i GLEW_GET_FUN(__glewUniform3i) #define glUniform3iv GLEW_GET_FUN(__glewUniform3iv) #define glUniform4f GLEW_GET_FUN(__glewUniform4f) #define glUniform4fv GLEW_GET_FUN(__glewUniform4fv) #define glUniform4i GLEW_GET_FUN(__glewUniform4i) #define glUniform4iv GLEW_GET_FUN(__glewUniform4iv) #define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv) #define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv) #define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv) #define glUseProgram GLEW_GET_FUN(__glewUseProgram) #define glValidateProgram GLEW_GET_FUN(__glewValidateProgram) #define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d) #define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv) #define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f) #define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv) #define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s) #define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv) #define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d) #define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv) #define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f) #define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv) #define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s) #define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv) #define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d) #define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv) #define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f) #define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv) #define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s) #define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv) #define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv) #define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv) #define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv) #define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub) #define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv) #define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv) #define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv) #define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv) #define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d) #define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv) #define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f) #define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv) #define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv) #define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s) #define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv) #define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv) #define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv) #define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv) #define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer) #define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0) #endif /* GL_VERSION_2_0 */ /* ----------------------------- GL_VERSION_2_1 ---------------------------- */ #ifndef GL_VERSION_2_1 #define GL_VERSION_2_1 1 #define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F #define GL_PIXEL_PACK_BUFFER 0x88EB #define GL_PIXEL_UNPACK_BUFFER 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF #define GL_FLOAT_MAT2x3 0x8B65 #define GL_FLOAT_MAT2x4 0x8B66 #define GL_FLOAT_MAT3x2 0x8B67 #define GL_FLOAT_MAT3x4 0x8B68 #define GL_FLOAT_MAT4x2 0x8B69 #define GL_FLOAT_MAT4x3 0x8B6A #define GL_SRGB 0x8C40 #define GL_SRGB8 0x8C41 #define GL_SRGB_ALPHA 0x8C42 #define GL_SRGB8_ALPHA8 0x8C43 #define GL_SLUMINANCE_ALPHA 0x8C44 #define GL_SLUMINANCE8_ALPHA8 0x8C45 #define GL_SLUMINANCE 0x8C46 #define GL_SLUMINANCE8 0x8C47 #define GL_COMPRESSED_SRGB 0x8C48 #define GL_COMPRESSED_SRGB_ALPHA 0x8C49 #define GL_COMPRESSED_SLUMINANCE 0x8C4A #define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); #define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv) #define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv) #define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv) #define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv) #define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv) #define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv) #define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1) #endif /* GL_VERSION_2_1 */ /* ----------------------------- GL_VERSION_3_0 ---------------------------- */ #ifndef GL_VERSION_3_0 #define GL_VERSION_3_0 1 #define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 #define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 #define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 #define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 #define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 #define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 #define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB #define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES #define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 #define GL_MAJOR_VERSION 0x821B #define GL_MINOR_VERSION 0x821C #define GL_NUM_EXTENSIONS 0x821D #define GL_CONTEXT_FLAGS 0x821E #define GL_DEPTH_BUFFER 0x8223 #define GL_STENCIL_BUFFER 0x8224 #define GL_RGBA32F 0x8814 #define GL_RGB32F 0x8815 #define GL_RGBA16F 0x881A #define GL_RGB16F 0x881B #define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD #define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF #define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 #define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 #define GL_CLAMP_VERTEX_COLOR 0x891A #define GL_CLAMP_FRAGMENT_COLOR 0x891B #define GL_CLAMP_READ_COLOR 0x891C #define GL_FIXED_ONLY 0x891D #define GL_TEXTURE_RED_TYPE 0x8C10 #define GL_TEXTURE_GREEN_TYPE 0x8C11 #define GL_TEXTURE_BLUE_TYPE 0x8C12 #define GL_TEXTURE_ALPHA_TYPE 0x8C13 #define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 #define GL_TEXTURE_INTENSITY_TYPE 0x8C15 #define GL_TEXTURE_DEPTH_TYPE 0x8C16 #define GL_TEXTURE_1D_ARRAY 0x8C18 #define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 #define GL_TEXTURE_2D_ARRAY 0x8C1A #define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B #define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C #define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D #define GL_R11F_G11F_B10F 0x8C3A #define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B #define GL_RGB9_E5 0x8C3D #define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E #define GL_TEXTURE_SHARED_SIZE 0x8C3F #define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 #define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 #define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 #define GL_PRIMITIVES_GENERATED 0x8C87 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 #define GL_RASTERIZER_DISCARD 0x8C89 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B #define GL_INTERLEAVED_ATTRIBS 0x8C8C #define GL_SEPARATE_ATTRIBS 0x8C8D #define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F #define GL_RGBA32UI 0x8D70 #define GL_RGB32UI 0x8D71 #define GL_RGBA16UI 0x8D76 #define GL_RGB16UI 0x8D77 #define GL_RGBA8UI 0x8D7C #define GL_RGB8UI 0x8D7D #define GL_RGBA32I 0x8D82 #define GL_RGB32I 0x8D83 #define GL_RGBA16I 0x8D88 #define GL_RGB16I 0x8D89 #define GL_RGBA8I 0x8D8E #define GL_RGB8I 0x8D8F #define GL_RED_INTEGER 0x8D94 #define GL_GREEN_INTEGER 0x8D95 #define GL_BLUE_INTEGER 0x8D96 #define GL_ALPHA_INTEGER 0x8D97 #define GL_RGB_INTEGER 0x8D98 #define GL_RGBA_INTEGER 0x8D99 #define GL_BGR_INTEGER 0x8D9A #define GL_BGRA_INTEGER 0x8D9B #define GL_SAMPLER_1D_ARRAY 0x8DC0 #define GL_SAMPLER_2D_ARRAY 0x8DC1 #define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 #define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 #define GL_SAMPLER_CUBE_SHADOW 0x8DC5 #define GL_UNSIGNED_INT_VEC2 0x8DC6 #define GL_UNSIGNED_INT_VEC3 0x8DC7 #define GL_UNSIGNED_INT_VEC4 0x8DC8 #define GL_INT_SAMPLER_1D 0x8DC9 #define GL_INT_SAMPLER_2D 0x8DCA #define GL_INT_SAMPLER_3D 0x8DCB #define GL_INT_SAMPLER_CUBE 0x8DCC #define GL_INT_SAMPLER_1D_ARRAY 0x8DCE #define GL_INT_SAMPLER_2D_ARRAY 0x8DCF #define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 #define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 #define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 #define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 #define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 #define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 #define GL_QUERY_WAIT 0x8E13 #define GL_QUERY_NO_WAIT 0x8E14 #define GL_QUERY_BY_REGION_WAIT 0x8E15 #define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint colorNumber, const GLchar* name); typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawBuffer, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawBuffer, const GLint* value); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawBuffer, const GLuint* value); typedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); typedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum cap, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum cap, GLuint index); typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void); typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void); typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum pname, GLuint index, GLboolean* data); typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar* name); typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint* params); typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum cap, GLuint index); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint v0, GLint v1); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint v0, GLuint v1); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint v0, GLint v1, GLint v2); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void*pointer); #define glBeginConditionalRender GLEW_GET_FUN(__glewBeginConditionalRender) #define glBeginTransformFeedback GLEW_GET_FUN(__glewBeginTransformFeedback) #define glBindFragDataLocation GLEW_GET_FUN(__glewBindFragDataLocation) #define glClampColor GLEW_GET_FUN(__glewClampColor) #define glClearBufferfi GLEW_GET_FUN(__glewClearBufferfi) #define glClearBufferfv GLEW_GET_FUN(__glewClearBufferfv) #define glClearBufferiv GLEW_GET_FUN(__glewClearBufferiv) #define glClearBufferuiv GLEW_GET_FUN(__glewClearBufferuiv) #define glColorMaski GLEW_GET_FUN(__glewColorMaski) #define glDisablei GLEW_GET_FUN(__glewDisablei) #define glEnablei GLEW_GET_FUN(__glewEnablei) #define glEndConditionalRender GLEW_GET_FUN(__glewEndConditionalRender) #define glEndTransformFeedback GLEW_GET_FUN(__glewEndTransformFeedback) #define glGetBooleani_v GLEW_GET_FUN(__glewGetBooleani_v) #define glGetFragDataLocation GLEW_GET_FUN(__glewGetFragDataLocation) #define glGetStringi GLEW_GET_FUN(__glewGetStringi) #define glGetTexParameterIiv GLEW_GET_FUN(__glewGetTexParameterIiv) #define glGetTexParameterIuiv GLEW_GET_FUN(__glewGetTexParameterIuiv) #define glGetTransformFeedbackVarying GLEW_GET_FUN(__glewGetTransformFeedbackVarying) #define glGetUniformuiv GLEW_GET_FUN(__glewGetUniformuiv) #define glGetVertexAttribIiv GLEW_GET_FUN(__glewGetVertexAttribIiv) #define glGetVertexAttribIuiv GLEW_GET_FUN(__glewGetVertexAttribIuiv) #define glIsEnabledi GLEW_GET_FUN(__glewIsEnabledi) #define glTexParameterIiv GLEW_GET_FUN(__glewTexParameterIiv) #define glTexParameterIuiv GLEW_GET_FUN(__glewTexParameterIuiv) #define glTransformFeedbackVaryings GLEW_GET_FUN(__glewTransformFeedbackVaryings) #define glUniform1ui GLEW_GET_FUN(__glewUniform1ui) #define glUniform1uiv GLEW_GET_FUN(__glewUniform1uiv) #define glUniform2ui GLEW_GET_FUN(__glewUniform2ui) #define glUniform2uiv GLEW_GET_FUN(__glewUniform2uiv) #define glUniform3ui GLEW_GET_FUN(__glewUniform3ui) #define glUniform3uiv GLEW_GET_FUN(__glewUniform3uiv) #define glUniform4ui GLEW_GET_FUN(__glewUniform4ui) #define glUniform4uiv GLEW_GET_FUN(__glewUniform4uiv) #define glVertexAttribI1i GLEW_GET_FUN(__glewVertexAttribI1i) #define glVertexAttribI1iv GLEW_GET_FUN(__glewVertexAttribI1iv) #define glVertexAttribI1ui GLEW_GET_FUN(__glewVertexAttribI1ui) #define glVertexAttribI1uiv GLEW_GET_FUN(__glewVertexAttribI1uiv) #define glVertexAttribI2i GLEW_GET_FUN(__glewVertexAttribI2i) #define glVertexAttribI2iv GLEW_GET_FUN(__glewVertexAttribI2iv) #define glVertexAttribI2ui GLEW_GET_FUN(__glewVertexAttribI2ui) #define glVertexAttribI2uiv GLEW_GET_FUN(__glewVertexAttribI2uiv) #define glVertexAttribI3i GLEW_GET_FUN(__glewVertexAttribI3i) #define glVertexAttribI3iv GLEW_GET_FUN(__glewVertexAttribI3iv) #define glVertexAttribI3ui GLEW_GET_FUN(__glewVertexAttribI3ui) #define glVertexAttribI3uiv GLEW_GET_FUN(__glewVertexAttribI3uiv) #define glVertexAttribI4bv GLEW_GET_FUN(__glewVertexAttribI4bv) #define glVertexAttribI4i GLEW_GET_FUN(__glewVertexAttribI4i) #define glVertexAttribI4iv GLEW_GET_FUN(__glewVertexAttribI4iv) #define glVertexAttribI4sv GLEW_GET_FUN(__glewVertexAttribI4sv) #define glVertexAttribI4ubv GLEW_GET_FUN(__glewVertexAttribI4ubv) #define glVertexAttribI4ui GLEW_GET_FUN(__glewVertexAttribI4ui) #define glVertexAttribI4uiv GLEW_GET_FUN(__glewVertexAttribI4uiv) #define glVertexAttribI4usv GLEW_GET_FUN(__glewVertexAttribI4usv) #define glVertexAttribIPointer GLEW_GET_FUN(__glewVertexAttribIPointer) #define GLEW_VERSION_3_0 GLEW_GET_VAR(__GLEW_VERSION_3_0) #endif /* GL_VERSION_3_0 */ /* ----------------------------- GL_VERSION_3_1 ---------------------------- */ #ifndef GL_VERSION_3_1 #define GL_VERSION_3_1 1 #define GL_TEXTURE_RECTANGLE 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 #define GL_SAMPLER_2D_RECT 0x8B63 #define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 #define GL_TEXTURE_BUFFER 0x8C2A #define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B #define GL_TEXTURE_BINDING_BUFFER 0x8C2C #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D #define GL_TEXTURE_BUFFER_FORMAT 0x8C2E #define GL_SAMPLER_BUFFER 0x8DC2 #define GL_INT_SAMPLER_2D_RECT 0x8DCD #define GL_INT_SAMPLER_BUFFER 0x8DD0 #define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 #define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 #define GL_RED_SNORM 0x8F90 #define GL_RG_SNORM 0x8F91 #define GL_RGB_SNORM 0x8F92 #define GL_RGBA_SNORM 0x8F93 #define GL_R8_SNORM 0x8F94 #define GL_RG8_SNORM 0x8F95 #define GL_RGB8_SNORM 0x8F96 #define GL_RGBA8_SNORM 0x8F97 #define GL_R16_SNORM 0x8F98 #define GL_RG16_SNORM 0x8F99 #define GL_RGB16_SNORM 0x8F9A #define GL_RGBA16_SNORM 0x8F9B #define GL_SIGNED_NORMALIZED 0x8F9C #define GL_PRIMITIVE_RESTART 0x8F9D #define GL_PRIMITIVE_RESTART_INDEX 0x8F9E #define GL_BUFFER_ACCESS_FLAGS 0x911F #define GL_BUFFER_MAP_LENGTH 0x9120 #define GL_BUFFER_MAP_OFFSET 0x9121 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalFormat, GLuint buffer); #define glDrawArraysInstanced GLEW_GET_FUN(__glewDrawArraysInstanced) #define glDrawElementsInstanced GLEW_GET_FUN(__glewDrawElementsInstanced) #define glPrimitiveRestartIndex GLEW_GET_FUN(__glewPrimitiveRestartIndex) #define glTexBuffer GLEW_GET_FUN(__glewTexBuffer) #define GLEW_VERSION_3_1 GLEW_GET_VAR(__GLEW_VERSION_3_1) #endif /* GL_VERSION_3_1 */ /* ----------------------------- GL_VERSION_3_2 ---------------------------- */ #ifndef GL_VERSION_3_2 #define GL_VERSION_3_2 1 #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 #define GL_LINES_ADJACENCY 0x000A #define GL_LINE_STRIP_ADJACENCY 0x000B #define GL_TRIANGLES_ADJACENCY 0x000C #define GL_TRIANGLE_STRIP_ADJACENCY 0x000D #define GL_PROGRAM_POINT_SIZE 0x8642 #define GL_GEOMETRY_VERTICES_OUT 0x8916 #define GL_GEOMETRY_INPUT_TYPE 0x8917 #define GL_GEOMETRY_OUTPUT_TYPE 0x8918 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 #define GL_GEOMETRY_SHADER 0x8DD9 #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 #define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 #define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 #define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 #define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 #define GL_CONTEXT_PROFILE_MASK 0x9126 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum value, GLint64 * data); typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum pname, GLuint index, GLint64 * data); #define glFramebufferTexture GLEW_GET_FUN(__glewFramebufferTexture) #define glGetBufferParameteri64v GLEW_GET_FUN(__glewGetBufferParameteri64v) #define glGetInteger64i_v GLEW_GET_FUN(__glewGetInteger64i_v) #define GLEW_VERSION_3_2 GLEW_GET_VAR(__GLEW_VERSION_3_2) #endif /* GL_VERSION_3_2 */ /* ----------------------------- GL_VERSION_3_3 ---------------------------- */ #ifndef GL_VERSION_3_3 #define GL_VERSION_3_3 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE #define GL_RGB10_A2UI 0x906F typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); #define glVertexAttribDivisor GLEW_GET_FUN(__glewVertexAttribDivisor) #define GLEW_VERSION_3_3 GLEW_GET_VAR(__GLEW_VERSION_3_3) #endif /* GL_VERSION_3_3 */ /* ----------------------------- GL_VERSION_4_0 ---------------------------- */ #ifndef GL_VERSION_4_0 #define GL_VERSION_4_0 1 #define GL_SAMPLE_SHADING 0x8C36 #define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F #define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F #define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A #define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B #define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D #define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); typedef void (GLAPIENTRY * PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value); #define glBlendEquationSeparatei GLEW_GET_FUN(__glewBlendEquationSeparatei) #define glBlendEquationi GLEW_GET_FUN(__glewBlendEquationi) #define glBlendFuncSeparatei GLEW_GET_FUN(__glewBlendFuncSeparatei) #define glBlendFunci GLEW_GET_FUN(__glewBlendFunci) #define glMinSampleShading GLEW_GET_FUN(__glewMinSampleShading) #define GLEW_VERSION_4_0 GLEW_GET_VAR(__GLEW_VERSION_4_0) #endif /* GL_VERSION_4_0 */ /* ----------------------------- GL_VERSION_4_1 ---------------------------- */ #ifndef GL_VERSION_4_1 #define GL_VERSION_4_1 1 #define GLEW_VERSION_4_1 GLEW_GET_VAR(__GLEW_VERSION_4_1) #endif /* GL_VERSION_4_1 */ /* ----------------------------- GL_VERSION_4_2 ---------------------------- */ #ifndef GL_VERSION_4_2 #define GL_VERSION_4_2 1 #define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 #define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 #define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F #define GL_COPY_READ_BUFFER_BINDING 0x8F36 #define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 #define GLEW_VERSION_4_2 GLEW_GET_VAR(__GLEW_VERSION_4_2) #endif /* GL_VERSION_4_2 */ /* ----------------------------- GL_VERSION_4_3 ---------------------------- */ #ifndef GL_VERSION_4_3 #define GL_VERSION_4_3 1 #define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 #define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E #define GLEW_VERSION_4_3 GLEW_GET_VAR(__GLEW_VERSION_4_3) #endif /* GL_VERSION_4_3 */ /* ----------------------------- GL_VERSION_4_4 ---------------------------- */ #ifndef GL_VERSION_4_4 #define GL_VERSION_4_4 1 #define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 #define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 #define GL_TEXTURE_BUFFER_BINDING 0x8C2A #define GLEW_VERSION_4_4 GLEW_GET_VAR(__GLEW_VERSION_4_4) #endif /* GL_VERSION_4_4 */ /* ----------------------------- GL_VERSION_4_5 ---------------------------- */ #ifndef GL_VERSION_4_5 #define GL_VERSION_4_5 1 #define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSPROC) (void); typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *pixels); typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEPROC) (GLenum tex, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *pixels); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); #define glGetGraphicsResetStatus GLEW_GET_FUN(__glewGetGraphicsResetStatus) #define glGetnCompressedTexImage GLEW_GET_FUN(__glewGetnCompressedTexImage) #define glGetnTexImage GLEW_GET_FUN(__glewGetnTexImage) #define glGetnUniformdv GLEW_GET_FUN(__glewGetnUniformdv) #define GLEW_VERSION_4_5 GLEW_GET_VAR(__GLEW_VERSION_4_5) #endif /* GL_VERSION_4_5 */ /* ----------------------------- GL_VERSION_4_6 ---------------------------- */ #ifndef GL_VERSION_4_6 #define GL_VERSION_4_6 1 #define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 #define GL_PARAMETER_BUFFER 0x80EE #define GL_PARAMETER_BUFFER_BINDING 0x80EF #define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC #define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED #define GL_VERTICES_SUBMITTED 0x82EE #define GL_PRIMITIVES_SUBMITTED 0x82EF #define GL_VERTEX_SHADER_INVOCATIONS 0x82F0 #define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1 #define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2 #define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3 #define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4 #define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5 #define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6 #define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7 #define GL_TEXTURE_MAX_ANISOTROPY 0x84FE #define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF #define GL_POLYGON_OFFSET_CLAMP 0x8E1B #define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551 #define GL_SPIR_V_BINARY 0x9552 #define GL_SPIR_V_EXTENSIONS 0x9553 #define GL_NUM_SPIR_V_EXTENSIONS 0x9554 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) (GLenum mode, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); typedef void (GLAPIENTRY * PFNGLSPECIALIZESHADERPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); #define glMultiDrawArraysIndirectCount GLEW_GET_FUN(__glewMultiDrawArraysIndirectCount) #define glMultiDrawElementsIndirectCount GLEW_GET_FUN(__glewMultiDrawElementsIndirectCount) #define glSpecializeShader GLEW_GET_FUN(__glewSpecializeShader) #define GLEW_VERSION_4_6 GLEW_GET_VAR(__GLEW_VERSION_4_6) #endif /* GL_VERSION_4_6 */ /* -------------------------- GL_3DFX_multisample -------------------------- */ #ifndef GL_3DFX_multisample #define GL_3DFX_multisample 1 #define GL_MULTISAMPLE_3DFX 0x86B2 #define GL_SAMPLE_BUFFERS_3DFX 0x86B3 #define GL_SAMPLES_3DFX 0x86B4 #define GL_MULTISAMPLE_BIT_3DFX 0x20000000 #define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample) #endif /* GL_3DFX_multisample */ /* ---------------------------- GL_3DFX_tbuffer ---------------------------- */ #ifndef GL_3DFX_tbuffer #define GL_3DFX_tbuffer 1 typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); #define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX) #define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer) #endif /* GL_3DFX_tbuffer */ /* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */ #ifndef GL_3DFX_texture_compression_FXT1 #define GL_3DFX_texture_compression_FXT1 1 #define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 #define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 #define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1) #endif /* GL_3DFX_texture_compression_FXT1 */ /* ----------------------- GL_AMD_blend_minmax_factor ---------------------- */ #ifndef GL_AMD_blend_minmax_factor #define GL_AMD_blend_minmax_factor 1 #define GL_FACTOR_MIN_AMD 0x901C #define GL_FACTOR_MAX_AMD 0x901D #define GLEW_AMD_blend_minmax_factor GLEW_GET_VAR(__GLEW_AMD_blend_minmax_factor) #endif /* GL_AMD_blend_minmax_factor */ /* --------------------- GL_AMD_compressed_3DC_texture --------------------- */ #ifndef GL_AMD_compressed_3DC_texture #define GL_AMD_compressed_3DC_texture 1 #define GL_3DC_X_AMD 0x87F9 #define GL_3DC_XY_AMD 0x87FA #define GLEW_AMD_compressed_3DC_texture GLEW_GET_VAR(__GLEW_AMD_compressed_3DC_texture) #endif /* GL_AMD_compressed_3DC_texture */ /* --------------------- GL_AMD_compressed_ATC_texture --------------------- */ #ifndef GL_AMD_compressed_ATC_texture #define GL_AMD_compressed_ATC_texture 1 #define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE #define GL_ATC_RGB_AMD 0x8C92 #define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 #define GLEW_AMD_compressed_ATC_texture GLEW_GET_VAR(__GLEW_AMD_compressed_ATC_texture) #endif /* GL_AMD_compressed_ATC_texture */ /* ----------------------- GL_AMD_conservative_depth ----------------------- */ #ifndef GL_AMD_conservative_depth #define GL_AMD_conservative_depth 1 #define GLEW_AMD_conservative_depth GLEW_GET_VAR(__GLEW_AMD_conservative_depth) #endif /* GL_AMD_conservative_depth */ /* -------------------------- GL_AMD_debug_output -------------------------- */ #ifndef GL_AMD_debug_output #define GL_AMD_debug_output 1 #define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 #define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 #define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 #define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 #define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 #define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 #define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 #define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A #define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B #define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C #define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D #define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E #define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F #define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 typedef void (GLAPIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, void* userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message); #define glDebugMessageCallbackAMD GLEW_GET_FUN(__glewDebugMessageCallbackAMD) #define glDebugMessageEnableAMD GLEW_GET_FUN(__glewDebugMessageEnableAMD) #define glDebugMessageInsertAMD GLEW_GET_FUN(__glewDebugMessageInsertAMD) #define glGetDebugMessageLogAMD GLEW_GET_FUN(__glewGetDebugMessageLogAMD) #define GLEW_AMD_debug_output GLEW_GET_VAR(__GLEW_AMD_debug_output) #endif /* GL_AMD_debug_output */ /* ---------------------- GL_AMD_depth_clamp_separate ---------------------- */ #ifndef GL_AMD_depth_clamp_separate #define GL_AMD_depth_clamp_separate 1 #define GL_DEPTH_CLAMP_NEAR_AMD 0x901E #define GL_DEPTH_CLAMP_FAR_AMD 0x901F #define GLEW_AMD_depth_clamp_separate GLEW_GET_VAR(__GLEW_AMD_depth_clamp_separate) #endif /* GL_AMD_depth_clamp_separate */ /* ----------------------- GL_AMD_draw_buffers_blend ----------------------- */ #ifndef GL_AMD_draw_buffers_blend #define GL_AMD_draw_buffers_blend 1 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (GLAPIENTRY * PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); #define glBlendEquationIndexedAMD GLEW_GET_FUN(__glewBlendEquationIndexedAMD) #define glBlendEquationSeparateIndexedAMD GLEW_GET_FUN(__glewBlendEquationSeparateIndexedAMD) #define glBlendFuncIndexedAMD GLEW_GET_FUN(__glewBlendFuncIndexedAMD) #define glBlendFuncSeparateIndexedAMD GLEW_GET_FUN(__glewBlendFuncSeparateIndexedAMD) #define GLEW_AMD_draw_buffers_blend GLEW_GET_VAR(__GLEW_AMD_draw_buffers_blend) #endif /* GL_AMD_draw_buffers_blend */ /* ------------------ GL_AMD_framebuffer_sample_positions ------------------ */ #ifndef GL_AMD_framebuffer_sample_positions #define GL_AMD_framebuffer_sample_positions 1 #define GL_SUBSAMPLE_DISTANCE_AMD 0x883F #define GL_PIXELS_PER_SAMPLE_PATTERN_X_AMD 0x91AE #define GL_PIXELS_PER_SAMPLE_PATTERN_Y_AMD 0x91AF #define GL_ALL_PIXELS_AMD 0xFFFFFFFF typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLenum target, GLuint numsamples, GLuint pixelindex, const GLfloat* values); typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC) (GLenum target, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat* values); typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC) (GLuint framebuffer, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat* values); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLuint framebuffer, GLuint numsamples, GLuint pixelindex, const GLfloat* values); #define glFramebufferSamplePositionsfvAMD GLEW_GET_FUN(__glewFramebufferSamplePositionsfvAMD) #define glGetFramebufferParameterfvAMD GLEW_GET_FUN(__glewGetFramebufferParameterfvAMD) #define glGetNamedFramebufferParameterfvAMD GLEW_GET_FUN(__glewGetNamedFramebufferParameterfvAMD) #define glNamedFramebufferSamplePositionsfvAMD GLEW_GET_FUN(__glewNamedFramebufferSamplePositionsfvAMD) #define GLEW_AMD_framebuffer_sample_positions GLEW_GET_VAR(__GLEW_AMD_framebuffer_sample_positions) #endif /* GL_AMD_framebuffer_sample_positions */ /* --------------------------- GL_AMD_gcn_shader --------------------------- */ #ifndef GL_AMD_gcn_shader #define GL_AMD_gcn_shader 1 #define GLEW_AMD_gcn_shader GLEW_GET_VAR(__GLEW_AMD_gcn_shader) #endif /* GL_AMD_gcn_shader */ /* ---------------------- GL_AMD_gpu_shader_half_float --------------------- */ #ifndef GL_AMD_gpu_shader_half_float #define GL_AMD_gpu_shader_half_float 1 #define GL_FLOAT16_NV 0x8FF8 #define GL_FLOAT16_VEC2_NV 0x8FF9 #define GL_FLOAT16_VEC3_NV 0x8FFA #define GL_FLOAT16_VEC4_NV 0x8FFB #define GL_FLOAT16_MAT2_AMD 0x91C5 #define GL_FLOAT16_MAT3_AMD 0x91C6 #define GL_FLOAT16_MAT4_AMD 0x91C7 #define GL_FLOAT16_MAT2x3_AMD 0x91C8 #define GL_FLOAT16_MAT2x4_AMD 0x91C9 #define GL_FLOAT16_MAT3x2_AMD 0x91CA #define GL_FLOAT16_MAT3x4_AMD 0x91CB #define GL_FLOAT16_MAT4x2_AMD 0x91CC #define GL_FLOAT16_MAT4x3_AMD 0x91CD #define GLEW_AMD_gpu_shader_half_float GLEW_GET_VAR(__GLEW_AMD_gpu_shader_half_float) #endif /* GL_AMD_gpu_shader_half_float */ /* ------------------------ GL_AMD_gpu_shader_int16 ------------------------ */ #ifndef GL_AMD_gpu_shader_int16 #define GL_AMD_gpu_shader_int16 1 #define GLEW_AMD_gpu_shader_int16 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int16) #endif /* GL_AMD_gpu_shader_int16 */ /* ------------------------ GL_AMD_gpu_shader_int64 ------------------------ */ #ifndef GL_AMD_gpu_shader_int64 #define GL_AMD_gpu_shader_int64 1 #define GLEW_AMD_gpu_shader_int64 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int64) #endif /* GL_AMD_gpu_shader_int64 */ /* ---------------------- GL_AMD_interleaved_elements ---------------------- */ #ifndef GL_AMD_interleaved_elements #define GL_AMD_interleaved_elements 1 #define GL_RED 0x1903 #define GL_GREEN 0x1904 #define GL_BLUE 0x1905 #define GL_ALPHA 0x1906 #define GL_RG8UI 0x8238 #define GL_RG16UI 0x823A #define GL_RGBA8UI 0x8D7C #define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 #define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); #define glVertexAttribParameteriAMD GLEW_GET_FUN(__glewVertexAttribParameteriAMD) #define GLEW_AMD_interleaved_elements GLEW_GET_VAR(__GLEW_AMD_interleaved_elements) #endif /* GL_AMD_interleaved_elements */ /* ----------------------- GL_AMD_multi_draw_indirect ---------------------- */ #ifndef GL_AMD_multi_draw_indirect #define GL_AMD_multi_draw_indirect 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); #define glMultiDrawArraysIndirectAMD GLEW_GET_FUN(__glewMultiDrawArraysIndirectAMD) #define glMultiDrawElementsIndirectAMD GLEW_GET_FUN(__glewMultiDrawElementsIndirectAMD) #define GLEW_AMD_multi_draw_indirect GLEW_GET_VAR(__GLEW_AMD_multi_draw_indirect) #endif /* GL_AMD_multi_draw_indirect */ /* ------------------------- GL_AMD_name_gen_delete ------------------------ */ #ifndef GL_AMD_name_gen_delete #define GL_AMD_name_gen_delete 1 #define GL_DATA_BUFFER_AMD 0x9151 #define GL_PERFORMANCE_MONITOR_AMD 0x9152 #define GL_QUERY_OBJECT_AMD 0x9153 #define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 #define GL_SAMPLER_OBJECT_AMD 0x9155 typedef void (GLAPIENTRY * PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint* names); typedef void (GLAPIENTRY * PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint* names); typedef GLboolean (GLAPIENTRY * PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); #define glDeleteNamesAMD GLEW_GET_FUN(__glewDeleteNamesAMD) #define glGenNamesAMD GLEW_GET_FUN(__glewGenNamesAMD) #define glIsNameAMD GLEW_GET_FUN(__glewIsNameAMD) #define GLEW_AMD_name_gen_delete GLEW_GET_VAR(__GLEW_AMD_name_gen_delete) #endif /* GL_AMD_name_gen_delete */ /* ---------------------- GL_AMD_occlusion_query_event --------------------- */ #ifndef GL_AMD_occlusion_query_event #define GL_AMD_occlusion_query_event 1 #define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 #define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 #define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 #define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 #define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F #define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF typedef void (GLAPIENTRY * PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); #define glQueryObjectParameteruiAMD GLEW_GET_FUN(__glewQueryObjectParameteruiAMD) #define GLEW_AMD_occlusion_query_event GLEW_GET_VAR(__GLEW_AMD_occlusion_query_event) #endif /* GL_AMD_occlusion_query_event */ /* ----------------------- GL_AMD_performance_monitor ---------------------- */ #ifndef GL_AMD_performance_monitor #define GL_AMD_performance_monitor 1 #define GL_COUNTER_TYPE_AMD 0x8BC0 #define GL_COUNTER_RANGE_AMD 0x8BC1 #define GL_UNSIGNED_INT64_AMD 0x8BC2 #define GL_PERCENTAGE_AMD 0x8BC3 #define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 #define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 #define GL_PERFMON_RESULT_AMD 0x8BC6 typedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar *counterString); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, GLchar *groupString); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups); typedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList); #define glBeginPerfMonitorAMD GLEW_GET_FUN(__glewBeginPerfMonitorAMD) #define glDeletePerfMonitorsAMD GLEW_GET_FUN(__glewDeletePerfMonitorsAMD) #define glEndPerfMonitorAMD GLEW_GET_FUN(__glewEndPerfMonitorAMD) #define glGenPerfMonitorsAMD GLEW_GET_FUN(__glewGenPerfMonitorsAMD) #define glGetPerfMonitorCounterDataAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterDataAMD) #define glGetPerfMonitorCounterInfoAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterInfoAMD) #define glGetPerfMonitorCounterStringAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterStringAMD) #define glGetPerfMonitorCountersAMD GLEW_GET_FUN(__glewGetPerfMonitorCountersAMD) #define glGetPerfMonitorGroupStringAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupStringAMD) #define glGetPerfMonitorGroupsAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupsAMD) #define glSelectPerfMonitorCountersAMD GLEW_GET_FUN(__glewSelectPerfMonitorCountersAMD) #define GLEW_AMD_performance_monitor GLEW_GET_VAR(__GLEW_AMD_performance_monitor) #endif /* GL_AMD_performance_monitor */ /* -------------------------- GL_AMD_pinned_memory ------------------------- */ #ifndef GL_AMD_pinned_memory #define GL_AMD_pinned_memory 1 #define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 #define GLEW_AMD_pinned_memory GLEW_GET_VAR(__GLEW_AMD_pinned_memory) #endif /* GL_AMD_pinned_memory */ /* ----------------------- GL_AMD_program_binary_Z400 ---------------------- */ #ifndef GL_AMD_program_binary_Z400 #define GL_AMD_program_binary_Z400 1 #define GL_Z400_BINARY_AMD 0x8740 #define GLEW_AMD_program_binary_Z400 GLEW_GET_VAR(__GLEW_AMD_program_binary_Z400) #endif /* GL_AMD_program_binary_Z400 */ /* ----------------------- GL_AMD_query_buffer_object ---------------------- */ #ifndef GL_AMD_query_buffer_object #define GL_AMD_query_buffer_object 1 #define GL_QUERY_BUFFER_AMD 0x9192 #define GL_QUERY_BUFFER_BINDING_AMD 0x9193 #define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 #define GLEW_AMD_query_buffer_object GLEW_GET_VAR(__GLEW_AMD_query_buffer_object) #endif /* GL_AMD_query_buffer_object */ /* ------------------------ GL_AMD_sample_positions ------------------------ */ #ifndef GL_AMD_sample_positions #define GL_AMD_sample_positions 1 #define GL_SUBSAMPLE_DISTANCE_AMD 0x883F typedef void (GLAPIENTRY * PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat* val); #define glSetMultisamplefvAMD GLEW_GET_FUN(__glewSetMultisamplefvAMD) #define GLEW_AMD_sample_positions GLEW_GET_VAR(__GLEW_AMD_sample_positions) #endif /* GL_AMD_sample_positions */ /* ------------------ GL_AMD_seamless_cubemap_per_texture ------------------ */ #ifndef GL_AMD_seamless_cubemap_per_texture #define GL_AMD_seamless_cubemap_per_texture 1 #define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F #define GLEW_AMD_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_AMD_seamless_cubemap_per_texture) #endif /* GL_AMD_seamless_cubemap_per_texture */ /* -------------------- GL_AMD_shader_atomic_counter_ops ------------------- */ #ifndef GL_AMD_shader_atomic_counter_ops #define GL_AMD_shader_atomic_counter_ops 1 #define GLEW_AMD_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_AMD_shader_atomic_counter_ops) #endif /* GL_AMD_shader_atomic_counter_ops */ /* -------------------------- GL_AMD_shader_ballot ------------------------- */ #ifndef GL_AMD_shader_ballot #define GL_AMD_shader_ballot 1 #define GLEW_AMD_shader_ballot GLEW_GET_VAR(__GLEW_AMD_shader_ballot) #endif /* GL_AMD_shader_ballot */ /* ---------------- GL_AMD_shader_explicit_vertex_parameter ---------------- */ #ifndef GL_AMD_shader_explicit_vertex_parameter #define GL_AMD_shader_explicit_vertex_parameter 1 #define GLEW_AMD_shader_explicit_vertex_parameter GLEW_GET_VAR(__GLEW_AMD_shader_explicit_vertex_parameter) #endif /* GL_AMD_shader_explicit_vertex_parameter */ /* ---------------------- GL_AMD_shader_stencil_export --------------------- */ #ifndef GL_AMD_shader_stencil_export #define GL_AMD_shader_stencil_export 1 #define GLEW_AMD_shader_stencil_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_export) #endif /* GL_AMD_shader_stencil_export */ /* ------------------- GL_AMD_shader_stencil_value_export ------------------ */ #ifndef GL_AMD_shader_stencil_value_export #define GL_AMD_shader_stencil_value_export 1 #define GLEW_AMD_shader_stencil_value_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_value_export) #endif /* GL_AMD_shader_stencil_value_export */ /* ---------------------- GL_AMD_shader_trinary_minmax --------------------- */ #ifndef GL_AMD_shader_trinary_minmax #define GL_AMD_shader_trinary_minmax 1 #define GLEW_AMD_shader_trinary_minmax GLEW_GET_VAR(__GLEW_AMD_shader_trinary_minmax) #endif /* GL_AMD_shader_trinary_minmax */ /* ------------------------- GL_AMD_sparse_texture ------------------------- */ #ifndef GL_AMD_sparse_texture #define GL_AMD_sparse_texture 1 #define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 #define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 #define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 #define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 #define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 #define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 #define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A #define GL_MIN_SPARSE_LEVEL_AMD 0x919B #define GL_MIN_LOD_WARNING_AMD 0x919C typedef void (GLAPIENTRY * PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); #define glTexStorageSparseAMD GLEW_GET_FUN(__glewTexStorageSparseAMD) #define glTextureStorageSparseAMD GLEW_GET_FUN(__glewTextureStorageSparseAMD) #define GLEW_AMD_sparse_texture GLEW_GET_VAR(__GLEW_AMD_sparse_texture) #endif /* GL_AMD_sparse_texture */ /* ------------------- GL_AMD_stencil_operation_extended ------------------- */ #ifndef GL_AMD_stencil_operation_extended #define GL_AMD_stencil_operation_extended 1 #define GL_SET_AMD 0x874A #define GL_REPLACE_VALUE_AMD 0x874B #define GL_STENCIL_OP_VALUE_AMD 0x874C #define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D typedef void (GLAPIENTRY * PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); #define glStencilOpValueAMD GLEW_GET_FUN(__glewStencilOpValueAMD) #define GLEW_AMD_stencil_operation_extended GLEW_GET_VAR(__GLEW_AMD_stencil_operation_extended) #endif /* GL_AMD_stencil_operation_extended */ /* --------------------- GL_AMD_texture_gather_bias_lod -------------------- */ #ifndef GL_AMD_texture_gather_bias_lod #define GL_AMD_texture_gather_bias_lod 1 #define GLEW_AMD_texture_gather_bias_lod GLEW_GET_VAR(__GLEW_AMD_texture_gather_bias_lod) #endif /* GL_AMD_texture_gather_bias_lod */ /* ------------------------ GL_AMD_texture_texture4 ------------------------ */ #ifndef GL_AMD_texture_texture4 #define GL_AMD_texture_texture4 1 #define GLEW_AMD_texture_texture4 GLEW_GET_VAR(__GLEW_AMD_texture_texture4) #endif /* GL_AMD_texture_texture4 */ /* --------------- GL_AMD_transform_feedback3_lines_triangles -------------- */ #ifndef GL_AMD_transform_feedback3_lines_triangles #define GL_AMD_transform_feedback3_lines_triangles 1 #define GLEW_AMD_transform_feedback3_lines_triangles GLEW_GET_VAR(__GLEW_AMD_transform_feedback3_lines_triangles) #endif /* GL_AMD_transform_feedback3_lines_triangles */ /* ----------------------- GL_AMD_transform_feedback4 ---------------------- */ #ifndef GL_AMD_transform_feedback4 #define GL_AMD_transform_feedback4 1 #define GL_STREAM_RASTERIZATION_AMD 0x91A0 #define GLEW_AMD_transform_feedback4 GLEW_GET_VAR(__GLEW_AMD_transform_feedback4) #endif /* GL_AMD_transform_feedback4 */ /* ----------------------- GL_AMD_vertex_shader_layer ---------------------- */ #ifndef GL_AMD_vertex_shader_layer #define GL_AMD_vertex_shader_layer 1 #define GLEW_AMD_vertex_shader_layer GLEW_GET_VAR(__GLEW_AMD_vertex_shader_layer) #endif /* GL_AMD_vertex_shader_layer */ /* -------------------- GL_AMD_vertex_shader_tessellator ------------------- */ #ifndef GL_AMD_vertex_shader_tessellator #define GL_AMD_vertex_shader_tessellator 1 #define GL_SAMPLER_BUFFER_AMD 0x9001 #define GL_INT_SAMPLER_BUFFER_AMD 0x9002 #define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 #define GL_TESSELLATION_MODE_AMD 0x9004 #define GL_TESSELLATION_FACTOR_AMD 0x9005 #define GL_DISCRETE_AMD 0x9006 #define GL_CONTINUOUS_AMD 0x9007 typedef void (GLAPIENTRY * PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); #define glTessellationFactorAMD GLEW_GET_FUN(__glewTessellationFactorAMD) #define glTessellationModeAMD GLEW_GET_FUN(__glewTessellationModeAMD) #define GLEW_AMD_vertex_shader_tessellator GLEW_GET_VAR(__GLEW_AMD_vertex_shader_tessellator) #endif /* GL_AMD_vertex_shader_tessellator */ /* ------------------ GL_AMD_vertex_shader_viewport_index ------------------ */ #ifndef GL_AMD_vertex_shader_viewport_index #define GL_AMD_vertex_shader_viewport_index 1 #define GLEW_AMD_vertex_shader_viewport_index GLEW_GET_VAR(__GLEW_AMD_vertex_shader_viewport_index) #endif /* GL_AMD_vertex_shader_viewport_index */ /* -------------------- GL_ANDROID_extension_pack_es31a -------------------- */ #ifndef GL_ANDROID_extension_pack_es31a #define GL_ANDROID_extension_pack_es31a 1 #define GLEW_ANDROID_extension_pack_es31a GLEW_GET_VAR(__GLEW_ANDROID_extension_pack_es31a) #endif /* GL_ANDROID_extension_pack_es31a */ /* ------------------------- GL_ANGLE_depth_texture ------------------------ */ #ifndef GL_ANGLE_depth_texture #define GL_ANGLE_depth_texture 1 #define GLEW_ANGLE_depth_texture GLEW_GET_VAR(__GLEW_ANGLE_depth_texture) #endif /* GL_ANGLE_depth_texture */ /* ----------------------- GL_ANGLE_framebuffer_blit ----------------------- */ #ifndef GL_ANGLE_framebuffer_blit #define GL_ANGLE_framebuffer_blit 1 #define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 #define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 #define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 #define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); #define glBlitFramebufferANGLE GLEW_GET_FUN(__glewBlitFramebufferANGLE) #define GLEW_ANGLE_framebuffer_blit GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_blit) #endif /* GL_ANGLE_framebuffer_blit */ /* -------------------- GL_ANGLE_framebuffer_multisample ------------------- */ #ifndef GL_ANGLE_framebuffer_multisample #define GL_ANGLE_framebuffer_multisample 1 #define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 #define GL_MAX_SAMPLES_ANGLE 0x8D57 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); #define glRenderbufferStorageMultisampleANGLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleANGLE) #define GLEW_ANGLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_multisample) #endif /* GL_ANGLE_framebuffer_multisample */ /* ----------------------- GL_ANGLE_instanced_arrays ----------------------- */ #ifndef GL_ANGLE_instanced_arrays #define GL_ANGLE_instanced_arrays 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); #define glDrawArraysInstancedANGLE GLEW_GET_FUN(__glewDrawArraysInstancedANGLE) #define glDrawElementsInstancedANGLE GLEW_GET_FUN(__glewDrawElementsInstancedANGLE) #define glVertexAttribDivisorANGLE GLEW_GET_FUN(__glewVertexAttribDivisorANGLE) #define GLEW_ANGLE_instanced_arrays GLEW_GET_VAR(__GLEW_ANGLE_instanced_arrays) #endif /* GL_ANGLE_instanced_arrays */ /* -------------------- GL_ANGLE_pack_reverse_row_order -------------------- */ #ifndef GL_ANGLE_pack_reverse_row_order #define GL_ANGLE_pack_reverse_row_order 1 #define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 #define GLEW_ANGLE_pack_reverse_row_order GLEW_GET_VAR(__GLEW_ANGLE_pack_reverse_row_order) #endif /* GL_ANGLE_pack_reverse_row_order */ /* ------------------------ GL_ANGLE_program_binary ------------------------ */ #ifndef GL_ANGLE_program_binary #define GL_ANGLE_program_binary 1 #define GL_PROGRAM_BINARY_ANGLE 0x93A6 #define GLEW_ANGLE_program_binary GLEW_GET_VAR(__GLEW_ANGLE_program_binary) #endif /* GL_ANGLE_program_binary */ /* ------------------- GL_ANGLE_texture_compression_dxt1 ------------------- */ #ifndef GL_ANGLE_texture_compression_dxt1 #define GL_ANGLE_texture_compression_dxt1 1 #define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 #define GLEW_ANGLE_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt1) #endif /* GL_ANGLE_texture_compression_dxt1 */ /* ------------------- GL_ANGLE_texture_compression_dxt3 ------------------- */ #ifndef GL_ANGLE_texture_compression_dxt3 #define GL_ANGLE_texture_compression_dxt3 1 #define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 #define GLEW_ANGLE_texture_compression_dxt3 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt3) #endif /* GL_ANGLE_texture_compression_dxt3 */ /* ------------------- GL_ANGLE_texture_compression_dxt5 ------------------- */ #ifndef GL_ANGLE_texture_compression_dxt5 #define GL_ANGLE_texture_compression_dxt5 1 #define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 #define GLEW_ANGLE_texture_compression_dxt5 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt5) #endif /* GL_ANGLE_texture_compression_dxt5 */ /* ------------------------- GL_ANGLE_texture_usage ------------------------ */ #ifndef GL_ANGLE_texture_usage #define GL_ANGLE_texture_usage 1 #define GL_TEXTURE_USAGE_ANGLE 0x93A2 #define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 #define GLEW_ANGLE_texture_usage GLEW_GET_VAR(__GLEW_ANGLE_texture_usage) #endif /* GL_ANGLE_texture_usage */ /* -------------------------- GL_ANGLE_timer_query ------------------------- */ #ifndef GL_ANGLE_timer_query #define GL_ANGLE_timer_query 1 #define GL_QUERY_COUNTER_BITS_ANGLE 0x8864 #define GL_CURRENT_QUERY_ANGLE 0x8865 #define GL_QUERY_RESULT_ANGLE 0x8866 #define GL_QUERY_RESULT_AVAILABLE_ANGLE 0x8867 #define GL_TIME_ELAPSED_ANGLE 0x88BF #define GL_TIMESTAMP_ANGLE 0x8E28 typedef void (GLAPIENTRY * PFNGLBEGINQUERYANGLEPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLDELETEQUERIESANGLEPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLENDQUERYANGLEPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLGENQUERIESANGLEPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VANGLEPROC) (GLuint id, GLenum pname, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVANGLEPROC) (GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VANGLEPROC) (GLuint id, GLenum pname, GLuint64* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVANGLEPROC) (GLuint id, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYIVANGLEPROC) (GLenum target, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISQUERYANGLEPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERANGLEPROC) (GLuint id, GLenum target); #define glBeginQueryANGLE GLEW_GET_FUN(__glewBeginQueryANGLE) #define glDeleteQueriesANGLE GLEW_GET_FUN(__glewDeleteQueriesANGLE) #define glEndQueryANGLE GLEW_GET_FUN(__glewEndQueryANGLE) #define glGenQueriesANGLE GLEW_GET_FUN(__glewGenQueriesANGLE) #define glGetQueryObjecti64vANGLE GLEW_GET_FUN(__glewGetQueryObjecti64vANGLE) #define glGetQueryObjectivANGLE GLEW_GET_FUN(__glewGetQueryObjectivANGLE) #define glGetQueryObjectui64vANGLE GLEW_GET_FUN(__glewGetQueryObjectui64vANGLE) #define glGetQueryObjectuivANGLE GLEW_GET_FUN(__glewGetQueryObjectuivANGLE) #define glGetQueryivANGLE GLEW_GET_FUN(__glewGetQueryivANGLE) #define glIsQueryANGLE GLEW_GET_FUN(__glewIsQueryANGLE) #define glQueryCounterANGLE GLEW_GET_FUN(__glewQueryCounterANGLE) #define GLEW_ANGLE_timer_query GLEW_GET_VAR(__GLEW_ANGLE_timer_query) #endif /* GL_ANGLE_timer_query */ /* ------------------- GL_ANGLE_translated_shader_source ------------------- */ #ifndef GL_ANGLE_translated_shader_source #define GL_ANGLE_translated_shader_source 1 #define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 typedef void (GLAPIENTRY * PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); #define glGetTranslatedShaderSourceANGLE GLEW_GET_FUN(__glewGetTranslatedShaderSourceANGLE) #define GLEW_ANGLE_translated_shader_source GLEW_GET_VAR(__GLEW_ANGLE_translated_shader_source) #endif /* GL_ANGLE_translated_shader_source */ /* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */ #ifndef GL_APPLE_aux_depth_stencil #define GL_APPLE_aux_depth_stencil 1 #define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 #define GLEW_APPLE_aux_depth_stencil GLEW_GET_VAR(__GLEW_APPLE_aux_depth_stencil) #endif /* GL_APPLE_aux_depth_stencil */ /* ------------------------ GL_APPLE_client_storage ------------------------ */ #ifndef GL_APPLE_client_storage #define GL_APPLE_client_storage 1 #define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 #define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage) #endif /* GL_APPLE_client_storage */ /* ------------------------- GL_APPLE_clip_distance ------------------------ */ #ifndef GL_APPLE_clip_distance #define GL_APPLE_clip_distance 1 #define GL_MAX_CLIP_DISTANCES_APPLE 0x0D32 #define GL_CLIP_DISTANCE0_APPLE 0x3000 #define GL_CLIP_DISTANCE1_APPLE 0x3001 #define GL_CLIP_DISTANCE2_APPLE 0x3002 #define GL_CLIP_DISTANCE3_APPLE 0x3003 #define GL_CLIP_DISTANCE4_APPLE 0x3004 #define GL_CLIP_DISTANCE5_APPLE 0x3005 #define GL_CLIP_DISTANCE6_APPLE 0x3006 #define GL_CLIP_DISTANCE7_APPLE 0x3007 #define GLEW_APPLE_clip_distance GLEW_GET_VAR(__GLEW_APPLE_clip_distance) #endif /* GL_APPLE_clip_distance */ /* ------------------- GL_APPLE_color_buffer_packed_float ------------------ */ #ifndef GL_APPLE_color_buffer_packed_float #define GL_APPLE_color_buffer_packed_float 1 #define GLEW_APPLE_color_buffer_packed_float GLEW_GET_VAR(__GLEW_APPLE_color_buffer_packed_float) #endif /* GL_APPLE_color_buffer_packed_float */ /* ---------------------- GL_APPLE_copy_texture_levels --------------------- */ #ifndef GL_APPLE_copy_texture_levels #define GL_APPLE_copy_texture_levels 1 typedef void (GLAPIENTRY * PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); #define glCopyTextureLevelsAPPLE GLEW_GET_FUN(__glewCopyTextureLevelsAPPLE) #define GLEW_APPLE_copy_texture_levels GLEW_GET_VAR(__GLEW_APPLE_copy_texture_levels) #endif /* GL_APPLE_copy_texture_levels */ /* ------------------------- GL_APPLE_element_array ------------------------ */ #ifndef GL_APPLE_element_array #define GL_APPLE_element_array 1 #define GL_ELEMENT_ARRAY_APPLE 0x8A0C #define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D #define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); #define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE) #define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE) #define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE) #define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE) #define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE) #define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array) #endif /* GL_APPLE_element_array */ /* ----------------------------- GL_APPLE_fence ---------------------------- */ #ifndef GL_APPLE_fence #define GL_APPLE_fence 1 #define GL_DRAW_PIXELS_APPLE 0x8A0A #define GL_FENCE_APPLE 0x8A0B typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences); typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences); typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence); typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence); typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence); typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); #define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE) #define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE) #define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE) #define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE) #define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE) #define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE) #define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE) #define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE) #define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence) #endif /* GL_APPLE_fence */ /* ------------------------- GL_APPLE_float_pixels ------------------------- */ #ifndef GL_APPLE_float_pixels #define GL_APPLE_float_pixels 1 #define GL_HALF_APPLE 0x140B #define GL_RGBA_FLOAT32_APPLE 0x8814 #define GL_RGB_FLOAT32_APPLE 0x8815 #define GL_ALPHA_FLOAT32_APPLE 0x8816 #define GL_INTENSITY_FLOAT32_APPLE 0x8817 #define GL_LUMINANCE_FLOAT32_APPLE 0x8818 #define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 #define GL_RGBA_FLOAT16_APPLE 0x881A #define GL_RGB_FLOAT16_APPLE 0x881B #define GL_ALPHA_FLOAT16_APPLE 0x881C #define GL_INTENSITY_FLOAT16_APPLE 0x881D #define GL_LUMINANCE_FLOAT16_APPLE 0x881E #define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F #define GL_COLOR_FLOAT_APPLE 0x8A0F #define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels) #endif /* GL_APPLE_float_pixels */ /* ---------------------- GL_APPLE_flush_buffer_range ---------------------- */ #ifndef GL_APPLE_flush_buffer_range #define GL_APPLE_flush_buffer_range 1 #define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 #define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 typedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); #define glBufferParameteriAPPLE GLEW_GET_FUN(__glewBufferParameteriAPPLE) #define glFlushMappedBufferRangeAPPLE GLEW_GET_FUN(__glewFlushMappedBufferRangeAPPLE) #define GLEW_APPLE_flush_buffer_range GLEW_GET_VAR(__GLEW_APPLE_flush_buffer_range) #endif /* GL_APPLE_flush_buffer_range */ /* -------------------- GL_APPLE_framebuffer_multisample ------------------- */ #ifndef GL_APPLE_framebuffer_multisample #define GL_APPLE_framebuffer_multisample 1 #define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 #define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 #define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 #define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA #define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 #define GL_MAX_SAMPLES_APPLE 0x8D57 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); #define glRenderbufferStorageMultisampleAPPLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleAPPLE) #define glResolveMultisampleFramebufferAPPLE GLEW_GET_FUN(__glewResolveMultisampleFramebufferAPPLE) #define GLEW_APPLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_APPLE_framebuffer_multisample) #endif /* GL_APPLE_framebuffer_multisample */ /* ----------------------- GL_APPLE_object_purgeable ----------------------- */ #ifndef GL_APPLE_object_purgeable #define GL_APPLE_object_purgeable 1 #define GL_BUFFER_OBJECT_APPLE 0x85B3 #define GL_RELEASED_APPLE 0x8A19 #define GL_VOLATILE_APPLE 0x8A1A #define GL_RETAINED_APPLE 0x8A1B #define GL_UNDEFINED_APPLE 0x8A1C #define GL_PURGEABLE_APPLE 0x8A1D typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params); typedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); typedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); #define glGetObjectParameterivAPPLE GLEW_GET_FUN(__glewGetObjectParameterivAPPLE) #define glObjectPurgeableAPPLE GLEW_GET_FUN(__glewObjectPurgeableAPPLE) #define glObjectUnpurgeableAPPLE GLEW_GET_FUN(__glewObjectUnpurgeableAPPLE) #define GLEW_APPLE_object_purgeable GLEW_GET_VAR(__GLEW_APPLE_object_purgeable) #endif /* GL_APPLE_object_purgeable */ /* ------------------------- GL_APPLE_pixel_buffer ------------------------- */ #ifndef GL_APPLE_pixel_buffer #define GL_APPLE_pixel_buffer 1 #define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10 #define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer) #endif /* GL_APPLE_pixel_buffer */ /* ---------------------------- GL_APPLE_rgb_422 --------------------------- */ #ifndef GL_APPLE_rgb_422 #define GL_APPLE_rgb_422 1 #define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA #define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB #define GL_RGB_422_APPLE 0x8A1F #define GL_RGB_RAW_422_APPLE 0x8A51 #define GLEW_APPLE_rgb_422 GLEW_GET_VAR(__GLEW_APPLE_rgb_422) #endif /* GL_APPLE_rgb_422 */ /* --------------------------- GL_APPLE_row_bytes -------------------------- */ #ifndef GL_APPLE_row_bytes #define GL_APPLE_row_bytes 1 #define GL_PACK_ROW_BYTES_APPLE 0x8A15 #define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 #define GLEW_APPLE_row_bytes GLEW_GET_VAR(__GLEW_APPLE_row_bytes) #endif /* GL_APPLE_row_bytes */ /* ------------------------ GL_APPLE_specular_vector ----------------------- */ #ifndef GL_APPLE_specular_vector #define GL_APPLE_specular_vector 1 #define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 #define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector) #endif /* GL_APPLE_specular_vector */ /* ----------------------------- GL_APPLE_sync ----------------------------- */ #ifndef GL_APPLE_sync #define GL_APPLE_sync 1 #define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 #define GL_SYNC_OBJECT_APPLE 0x8A53 #define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 #define GL_OBJECT_TYPE_APPLE 0x9112 #define GL_SYNC_CONDITION_APPLE 0x9113 #define GL_SYNC_STATUS_APPLE 0x9114 #define GL_SYNC_FLAGS_APPLE 0x9115 #define GL_SYNC_FENCE_APPLE 0x9116 #define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 #define GL_UNSIGNALED_APPLE 0x9118 #define GL_SIGNALED_APPLE 0x9119 #define GL_ALREADY_SIGNALED_APPLE 0x911A #define GL_TIMEOUT_EXPIRED_APPLE 0x911B #define GL_CONDITION_SATISFIED_APPLE 0x911C #define GL_WAIT_FAILED_APPLE 0x911D #define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync GLsync, GLbitfield flags, GLuint64 timeout); typedef void (GLAPIENTRY * PFNGLDELETESYNCAPPLEPROC) (GLsync GLsync); typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); typedef void (GLAPIENTRY * PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETSYNCIVAPPLEPROC) (GLsync GLsync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); typedef GLboolean (GLAPIENTRY * PFNGLISSYNCAPPLEPROC) (GLsync GLsync); typedef void (GLAPIENTRY * PFNGLWAITSYNCAPPLEPROC) (GLsync GLsync, GLbitfield flags, GLuint64 timeout); #define glClientWaitSyncAPPLE GLEW_GET_FUN(__glewClientWaitSyncAPPLE) #define glDeleteSyncAPPLE GLEW_GET_FUN(__glewDeleteSyncAPPLE) #define glFenceSyncAPPLE GLEW_GET_FUN(__glewFenceSyncAPPLE) #define glGetInteger64vAPPLE GLEW_GET_FUN(__glewGetInteger64vAPPLE) #define glGetSyncivAPPLE GLEW_GET_FUN(__glewGetSyncivAPPLE) #define glIsSyncAPPLE GLEW_GET_FUN(__glewIsSyncAPPLE) #define glWaitSyncAPPLE GLEW_GET_FUN(__glewWaitSyncAPPLE) #define GLEW_APPLE_sync GLEW_GET_VAR(__GLEW_APPLE_sync) #endif /* GL_APPLE_sync */ /* -------------------- GL_APPLE_texture_2D_limited_npot ------------------- */ #ifndef GL_APPLE_texture_2D_limited_npot #define GL_APPLE_texture_2D_limited_npot 1 #define GLEW_APPLE_texture_2D_limited_npot GLEW_GET_VAR(__GLEW_APPLE_texture_2D_limited_npot) #endif /* GL_APPLE_texture_2D_limited_npot */ /* -------------------- GL_APPLE_texture_format_BGRA8888 ------------------- */ #ifndef GL_APPLE_texture_format_BGRA8888 #define GL_APPLE_texture_format_BGRA8888 1 #define GL_BGRA_EXT 0x80E1 #define GL_BGRA8_EXT 0x93A1 #define GLEW_APPLE_texture_format_BGRA8888 GLEW_GET_VAR(__GLEW_APPLE_texture_format_BGRA8888) #endif /* GL_APPLE_texture_format_BGRA8888 */ /* ----------------------- GL_APPLE_texture_max_level ---------------------- */ #ifndef GL_APPLE_texture_max_level #define GL_APPLE_texture_max_level 1 #define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D #define GLEW_APPLE_texture_max_level GLEW_GET_VAR(__GLEW_APPLE_texture_max_level) #endif /* GL_APPLE_texture_max_level */ /* --------------------- GL_APPLE_texture_packed_float --------------------- */ #ifndef GL_APPLE_texture_packed_float #define GL_APPLE_texture_packed_float 1 #define GL_R11F_G11F_B10F_APPLE 0x8C3A #define GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE 0x8C3B #define GL_RGB9_E5_APPLE 0x8C3D #define GL_UNSIGNED_INT_5_9_9_9_REV_APPLE 0x8C3E #define GLEW_APPLE_texture_packed_float GLEW_GET_VAR(__GLEW_APPLE_texture_packed_float) #endif /* GL_APPLE_texture_packed_float */ /* ------------------------- GL_APPLE_texture_range ------------------------ */ #ifndef GL_APPLE_texture_range #define GL_APPLE_texture_range 1 #define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 #define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 #define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC #define GL_STORAGE_PRIVATE_APPLE 0x85BD #define GL_STORAGE_CACHED_APPLE 0x85BE #define GL_STORAGE_SHARED_APPLE 0x85BF typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, void *pointer); #define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE) #define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE) #define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range) #endif /* GL_APPLE_texture_range */ /* ------------------------ GL_APPLE_transform_hint ------------------------ */ #ifndef GL_APPLE_transform_hint #define GL_APPLE_transform_hint 1 #define GL_TRANSFORM_HINT_APPLE 0x85B1 #define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint) #endif /* GL_APPLE_transform_hint */ /* ---------------------- GL_APPLE_vertex_array_object --------------------- */ #ifndef GL_APPLE_vertex_array_object #define GL_APPLE_vertex_array_object 1 #define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); #define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE) #define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE) #define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE) #define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE) #define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object) #endif /* GL_APPLE_vertex_array_object */ /* ---------------------- GL_APPLE_vertex_array_range ---------------------- */ #ifndef GL_APPLE_vertex_array_range #define GL_APPLE_vertex_array_range 1 #define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D #define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E #define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F #define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520 #define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 #define GL_STORAGE_CLIENT_APPLE 0x85B4 #define GL_STORAGE_CACHED_APPLE 0x85BE #define GL_STORAGE_SHARED_APPLE 0x85BF typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); #define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) #define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) #define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE) #define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range) #endif /* GL_APPLE_vertex_array_range */ /* ------------------- GL_APPLE_vertex_program_evaluators ------------------ */ #ifndef GL_APPLE_vertex_program_evaluators #define GL_APPLE_vertex_program_evaluators 1 #define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 #define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 #define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 #define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 #define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 #define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 #define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 #define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 #define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 #define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points); typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points); typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points); typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points); #define glDisableVertexAttribAPPLE GLEW_GET_FUN(__glewDisableVertexAttribAPPLE) #define glEnableVertexAttribAPPLE GLEW_GET_FUN(__glewEnableVertexAttribAPPLE) #define glIsVertexAttribEnabledAPPLE GLEW_GET_FUN(__glewIsVertexAttribEnabledAPPLE) #define glMapVertexAttrib1dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1dAPPLE) #define glMapVertexAttrib1fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1fAPPLE) #define glMapVertexAttrib2dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2dAPPLE) #define glMapVertexAttrib2fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2fAPPLE) #define GLEW_APPLE_vertex_program_evaluators GLEW_GET_VAR(__GLEW_APPLE_vertex_program_evaluators) #endif /* GL_APPLE_vertex_program_evaluators */ /* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */ #ifndef GL_APPLE_ycbcr_422 #define GL_APPLE_ycbcr_422 1 #define GL_YCBCR_422_APPLE 0x85B9 #define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422) #endif /* GL_APPLE_ycbcr_422 */ /* ------------------------ GL_ARB_ES2_compatibility ----------------------- */ #ifndef GL_ARB_ES2_compatibility #define GL_ARB_ES2_compatibility 1 #define GL_FIXED 0x140C #define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A #define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B #define GL_RGB565 0x8D62 #define GL_LOW_FLOAT 0x8DF0 #define GL_MEDIUM_FLOAT 0x8DF1 #define GL_HIGH_FLOAT 0x8DF2 #define GL_LOW_INT 0x8DF3 #define GL_MEDIUM_INT 0x8DF4 #define GL_HIGH_INT 0x8DF5 #define GL_SHADER_BINARY_FORMATS 0x8DF8 #define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 #define GL_SHADER_COMPILER 0x8DFA #define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB #define GL_MAX_VARYING_VECTORS 0x8DFC #define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD typedef int GLfixed; typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision); typedef void (GLAPIENTRY * PFNGLRELEASESHADERCOMPILERPROC) (void); typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* shaders, GLenum binaryformat, const void*binary, GLsizei length); #define glClearDepthf GLEW_GET_FUN(__glewClearDepthf) #define glDepthRangef GLEW_GET_FUN(__glewDepthRangef) #define glGetShaderPrecisionFormat GLEW_GET_FUN(__glewGetShaderPrecisionFormat) #define glReleaseShaderCompiler GLEW_GET_FUN(__glewReleaseShaderCompiler) #define glShaderBinary GLEW_GET_FUN(__glewShaderBinary) #define GLEW_ARB_ES2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES2_compatibility) #endif /* GL_ARB_ES2_compatibility */ /* ----------------------- GL_ARB_ES3_1_compatibility ---------------------- */ #ifndef GL_ARB_ES3_1_compatibility #define GL_ARB_ES3_1_compatibility 1 typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); #define glMemoryBarrierByRegion GLEW_GET_FUN(__glewMemoryBarrierByRegion) #define GLEW_ARB_ES3_1_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_1_compatibility) #endif /* GL_ARB_ES3_1_compatibility */ /* ----------------------- GL_ARB_ES3_2_compatibility ---------------------- */ #ifndef GL_ARB_ES3_2_compatibility #define GL_ARB_ES3_2_compatibility 1 #define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE #define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381 #define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382 typedef void (GLAPIENTRY * PFNGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); #define glPrimitiveBoundingBoxARB GLEW_GET_FUN(__glewPrimitiveBoundingBoxARB) #define GLEW_ARB_ES3_2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_2_compatibility) #endif /* GL_ARB_ES3_2_compatibility */ /* ------------------------ GL_ARB_ES3_compatibility ----------------------- */ #ifndef GL_ARB_ES3_compatibility #define GL_ARB_ES3_compatibility 1 #define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF #define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 #define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A #define GL_MAX_ELEMENT_INDEX 0x8D6B #define GL_COMPRESSED_R11_EAC 0x9270 #define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 #define GL_COMPRESSED_RG11_EAC 0x9272 #define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 #define GL_COMPRESSED_RGB8_ETC2 0x9274 #define GL_COMPRESSED_SRGB8_ETC2 0x9275 #define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 #define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 #define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 #define GLEW_ARB_ES3_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_compatibility) #endif /* GL_ARB_ES3_compatibility */ /* ------------------------ GL_ARB_arrays_of_arrays ------------------------ */ #ifndef GL_ARB_arrays_of_arrays #define GL_ARB_arrays_of_arrays 1 #define GLEW_ARB_arrays_of_arrays GLEW_GET_VAR(__GLEW_ARB_arrays_of_arrays) #endif /* GL_ARB_arrays_of_arrays */ /* -------------------------- GL_ARB_base_instance ------------------------- */ #ifndef GL_ARB_base_instance #define GL_ARB_base_instance 1 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount, GLuint baseinstance); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLuint baseinstance); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex, GLuint baseinstance); #define glDrawArraysInstancedBaseInstance GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstance) #define glDrawElementsInstancedBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstance) #define glDrawElementsInstancedBaseVertexBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstance) #define GLEW_ARB_base_instance GLEW_GET_VAR(__GLEW_ARB_base_instance) #endif /* GL_ARB_base_instance */ /* ------------------------ GL_ARB_bindless_texture ------------------------ */ #ifndef GL_ARB_bindless_texture #define GL_ARB_bindless_texture 1 #define GL_UNSIGNED_INT64_ARB 0x140F typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT* params); typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT* v); #define glGetImageHandleARB GLEW_GET_FUN(__glewGetImageHandleARB) #define glGetTextureHandleARB GLEW_GET_FUN(__glewGetTextureHandleARB) #define glGetTextureSamplerHandleARB GLEW_GET_FUN(__glewGetTextureSamplerHandleARB) #define glGetVertexAttribLui64vARB GLEW_GET_FUN(__glewGetVertexAttribLui64vARB) #define glIsImageHandleResidentARB GLEW_GET_FUN(__glewIsImageHandleResidentARB) #define glIsTextureHandleResidentARB GLEW_GET_FUN(__glewIsTextureHandleResidentARB) #define glMakeImageHandleNonResidentARB GLEW_GET_FUN(__glewMakeImageHandleNonResidentARB) #define glMakeImageHandleResidentARB GLEW_GET_FUN(__glewMakeImageHandleResidentARB) #define glMakeTextureHandleNonResidentARB GLEW_GET_FUN(__glewMakeTextureHandleNonResidentARB) #define glMakeTextureHandleResidentARB GLEW_GET_FUN(__glewMakeTextureHandleResidentARB) #define glProgramUniformHandleui64ARB GLEW_GET_FUN(__glewProgramUniformHandleui64ARB) #define glProgramUniformHandleui64vARB GLEW_GET_FUN(__glewProgramUniformHandleui64vARB) #define glUniformHandleui64ARB GLEW_GET_FUN(__glewUniformHandleui64ARB) #define glUniformHandleui64vARB GLEW_GET_FUN(__glewUniformHandleui64vARB) #define glVertexAttribL1ui64ARB GLEW_GET_FUN(__glewVertexAttribL1ui64ARB) #define glVertexAttribL1ui64vARB GLEW_GET_FUN(__glewVertexAttribL1ui64vARB) #define GLEW_ARB_bindless_texture GLEW_GET_VAR(__GLEW_ARB_bindless_texture) #endif /* GL_ARB_bindless_texture */ /* ----------------------- GL_ARB_blend_func_extended ---------------------- */ #ifndef GL_ARB_blend_func_extended #define GL_ARB_blend_func_extended 1 #define GL_SRC1_COLOR 0x88F9 #define GL_ONE_MINUS_SRC1_COLOR 0x88FA #define GL_ONE_MINUS_SRC1_ALPHA 0x88FB #define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar * name); #define glBindFragDataLocationIndexed GLEW_GET_FUN(__glewBindFragDataLocationIndexed) #define glGetFragDataIndex GLEW_GET_FUN(__glewGetFragDataIndex) #define GLEW_ARB_blend_func_extended GLEW_GET_VAR(__GLEW_ARB_blend_func_extended) #endif /* GL_ARB_blend_func_extended */ /* ------------------------- GL_ARB_buffer_storage ------------------------- */ #ifndef GL_ARB_buffer_storage #define GL_ARB_buffer_storage 1 #define GL_MAP_READ_BIT 0x0001 #define GL_MAP_WRITE_BIT 0x0002 #define GL_MAP_PERSISTENT_BIT 0x00000040 #define GL_MAP_COHERENT_BIT 0x00000080 #define GL_DYNAMIC_STORAGE_BIT 0x0100 #define GL_CLIENT_STORAGE_BIT 0x0200 #define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 #define GL_BUFFER_IMMUTABLE_STORAGE 0x821F #define GL_BUFFER_STORAGE_FLAGS 0x8220 typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); #define glBufferStorage GLEW_GET_FUN(__glewBufferStorage) #define GLEW_ARB_buffer_storage GLEW_GET_VAR(__GLEW_ARB_buffer_storage) #endif /* GL_ARB_buffer_storage */ /* ---------------------------- GL_ARB_cl_event ---------------------------- */ #ifndef GL_ARB_cl_event #define GL_ARB_cl_event 1 #define GL_SYNC_CL_EVENT_ARB 0x8240 #define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 typedef struct _cl_context *cl_context; typedef struct _cl_event *cl_event; typedef GLsync (GLAPIENTRY * PFNGLCREATESYNCFROMCLEVENTARBPROC) (cl_context context, cl_event event, GLbitfield flags); #define glCreateSyncFromCLeventARB GLEW_GET_FUN(__glewCreateSyncFromCLeventARB) #define GLEW_ARB_cl_event GLEW_GET_VAR(__GLEW_ARB_cl_event) #endif /* GL_ARB_cl_event */ /* ----------------------- GL_ARB_clear_buffer_object ---------------------- */ #ifndef GL_ARB_clear_buffer_object #define GL_ARB_clear_buffer_object 1 typedef void (GLAPIENTRY * PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); #define glClearBufferData GLEW_GET_FUN(__glewClearBufferData) #define glClearBufferSubData GLEW_GET_FUN(__glewClearBufferSubData) #define glClearNamedBufferDataEXT GLEW_GET_FUN(__glewClearNamedBufferDataEXT) #define glClearNamedBufferSubDataEXT GLEW_GET_FUN(__glewClearNamedBufferSubDataEXT) #define GLEW_ARB_clear_buffer_object GLEW_GET_VAR(__GLEW_ARB_clear_buffer_object) #endif /* GL_ARB_clear_buffer_object */ /* -------------------------- GL_ARB_clear_texture ------------------------- */ #ifndef GL_ARB_clear_texture #define GL_ARB_clear_texture 1 #define GL_CLEAR_TEXTURE 0x9365 typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); #define glClearTexImage GLEW_GET_FUN(__glewClearTexImage) #define glClearTexSubImage GLEW_GET_FUN(__glewClearTexSubImage) #define GLEW_ARB_clear_texture GLEW_GET_VAR(__GLEW_ARB_clear_texture) #endif /* GL_ARB_clear_texture */ /* -------------------------- GL_ARB_clip_control -------------------------- */ #ifndef GL_ARB_clip_control #define GL_ARB_clip_control 1 #define GL_LOWER_LEFT 0x8CA1 #define GL_UPPER_LEFT 0x8CA2 #define GL_CLIP_ORIGIN 0x935C #define GL_CLIP_DEPTH_MODE 0x935D #define GL_NEGATIVE_ONE_TO_ONE 0x935E #define GL_ZERO_TO_ONE 0x935F typedef void (GLAPIENTRY * PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); #define glClipControl GLEW_GET_FUN(__glewClipControl) #define GLEW_ARB_clip_control GLEW_GET_VAR(__GLEW_ARB_clip_control) #endif /* GL_ARB_clip_control */ /* ----------------------- GL_ARB_color_buffer_float ----------------------- */ #ifndef GL_ARB_color_buffer_float #define GL_ARB_color_buffer_float 1 #define GL_RGBA_FLOAT_MODE_ARB 0x8820 #define GL_CLAMP_VERTEX_COLOR_ARB 0x891A #define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B #define GL_CLAMP_READ_COLOR_ARB 0x891C #define GL_FIXED_ONLY_ARB 0x891D typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); #define glClampColorARB GLEW_GET_FUN(__glewClampColorARB) #define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float) #endif /* GL_ARB_color_buffer_float */ /* -------------------------- GL_ARB_compatibility ------------------------- */ #ifndef GL_ARB_compatibility #define GL_ARB_compatibility 1 #define GLEW_ARB_compatibility GLEW_GET_VAR(__GLEW_ARB_compatibility) #endif /* GL_ARB_compatibility */ /* ---------------- GL_ARB_compressed_texture_pixel_storage ---------------- */ #ifndef GL_ARB_compressed_texture_pixel_storage #define GL_ARB_compressed_texture_pixel_storage 1 #define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 #define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 #define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 #define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A #define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B #define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C #define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D #define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E #define GLEW_ARB_compressed_texture_pixel_storage GLEW_GET_VAR(__GLEW_ARB_compressed_texture_pixel_storage) #endif /* GL_ARB_compressed_texture_pixel_storage */ /* ------------------------- GL_ARB_compute_shader ------------------------- */ #ifndef GL_ARB_compute_shader #define GL_ARB_compute_shader 1 #define GL_COMPUTE_SHADER_BIT 0x00000020 #define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 #define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 #define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 #define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 #define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 #define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 #define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB #define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED #define GL_DISPATCH_INDIRECT_BUFFER 0x90EE #define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF #define GL_COMPUTE_SHADER 0x91B9 #define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB #define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC #define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD #define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE #define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); #define glDispatchCompute GLEW_GET_FUN(__glewDispatchCompute) #define glDispatchComputeIndirect GLEW_GET_FUN(__glewDispatchComputeIndirect) #define GLEW_ARB_compute_shader GLEW_GET_VAR(__GLEW_ARB_compute_shader) #endif /* GL_ARB_compute_shader */ /* ------------------- GL_ARB_compute_variable_group_size ------------------ */ #ifndef GL_ARB_compute_variable_group_size #define GL_ARB_compute_variable_group_size 1 #define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB #define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF #define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 #define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); #define glDispatchComputeGroupSizeARB GLEW_GET_FUN(__glewDispatchComputeGroupSizeARB) #define GLEW_ARB_compute_variable_group_size GLEW_GET_VAR(__GLEW_ARB_compute_variable_group_size) #endif /* GL_ARB_compute_variable_group_size */ /* ------------------- GL_ARB_conditional_render_inverted ------------------ */ #ifndef GL_ARB_conditional_render_inverted #define GL_ARB_conditional_render_inverted 1 #define GL_QUERY_WAIT_INVERTED 0x8E17 #define GL_QUERY_NO_WAIT_INVERTED 0x8E18 #define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 #define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A #define GLEW_ARB_conditional_render_inverted GLEW_GET_VAR(__GLEW_ARB_conditional_render_inverted) #endif /* GL_ARB_conditional_render_inverted */ /* ----------------------- GL_ARB_conservative_depth ----------------------- */ #ifndef GL_ARB_conservative_depth #define GL_ARB_conservative_depth 1 #define GLEW_ARB_conservative_depth GLEW_GET_VAR(__GLEW_ARB_conservative_depth) #endif /* GL_ARB_conservative_depth */ /* --------------------------- GL_ARB_copy_buffer -------------------------- */ #ifndef GL_ARB_copy_buffer #define GL_ARB_copy_buffer 1 #define GL_COPY_READ_BUFFER 0x8F36 #define GL_COPY_WRITE_BUFFER 0x8F37 typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); #define glCopyBufferSubData GLEW_GET_FUN(__glewCopyBufferSubData) #define GLEW_ARB_copy_buffer GLEW_GET_VAR(__GLEW_ARB_copy_buffer) #endif /* GL_ARB_copy_buffer */ /* --------------------------- GL_ARB_copy_image --------------------------- */ #ifndef GL_ARB_copy_image #define GL_ARB_copy_image 1 typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); #define glCopyImageSubData GLEW_GET_FUN(__glewCopyImageSubData) #define GLEW_ARB_copy_image GLEW_GET_VAR(__GLEW_ARB_copy_image) #endif /* GL_ARB_copy_image */ /* -------------------------- GL_ARB_cull_distance ------------------------- */ #ifndef GL_ARB_cull_distance #define GL_ARB_cull_distance 1 #define GL_MAX_CULL_DISTANCES 0x82F9 #define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA #define GLEW_ARB_cull_distance GLEW_GET_VAR(__GLEW_ARB_cull_distance) #endif /* GL_ARB_cull_distance */ /* -------------------------- GL_ARB_debug_output -------------------------- */ #ifndef GL_ARB_debug_output #define GL_ARB_debug_output 1 #define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 #define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 #define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 #define GL_DEBUG_SOURCE_API_ARB 0x8246 #define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 #define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 #define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 #define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A #define GL_DEBUG_SOURCE_OTHER_ARB 0x824B #define GL_DEBUG_TYPE_ERROR_ARB 0x824C #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E #define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F #define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 #define GL_DEBUG_TYPE_OTHER_ARB 0x8251 #define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 #define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 #define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 #define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 #define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 #define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 typedef void (GLAPIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); #define glDebugMessageCallbackARB GLEW_GET_FUN(__glewDebugMessageCallbackARB) #define glDebugMessageControlARB GLEW_GET_FUN(__glewDebugMessageControlARB) #define glDebugMessageInsertARB GLEW_GET_FUN(__glewDebugMessageInsertARB) #define glGetDebugMessageLogARB GLEW_GET_FUN(__glewGetDebugMessageLogARB) #define GLEW_ARB_debug_output GLEW_GET_VAR(__GLEW_ARB_debug_output) #endif /* GL_ARB_debug_output */ /* ----------------------- GL_ARB_depth_buffer_float ----------------------- */ #ifndef GL_ARB_depth_buffer_float #define GL_ARB_depth_buffer_float 1 #define GL_DEPTH_COMPONENT32F 0x8CAC #define GL_DEPTH32F_STENCIL8 0x8CAD #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD #define GLEW_ARB_depth_buffer_float GLEW_GET_VAR(__GLEW_ARB_depth_buffer_float) #endif /* GL_ARB_depth_buffer_float */ /* --------------------------- GL_ARB_depth_clamp -------------------------- */ #ifndef GL_ARB_depth_clamp #define GL_ARB_depth_clamp 1 #define GL_DEPTH_CLAMP 0x864F #define GLEW_ARB_depth_clamp GLEW_GET_VAR(__GLEW_ARB_depth_clamp) #endif /* GL_ARB_depth_clamp */ /* -------------------------- GL_ARB_depth_texture ------------------------- */ #ifndef GL_ARB_depth_texture #define GL_ARB_depth_texture 1 #define GL_DEPTH_COMPONENT16_ARB 0x81A5 #define GL_DEPTH_COMPONENT24_ARB 0x81A6 #define GL_DEPTH_COMPONENT32_ARB 0x81A7 #define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A #define GL_DEPTH_TEXTURE_MODE_ARB 0x884B #define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture) #endif /* GL_ARB_depth_texture */ /* ----------------------- GL_ARB_derivative_control ----------------------- */ #ifndef GL_ARB_derivative_control #define GL_ARB_derivative_control 1 #define GLEW_ARB_derivative_control GLEW_GET_VAR(__GLEW_ARB_derivative_control) #endif /* GL_ARB_derivative_control */ /* ----------------------- GL_ARB_direct_state_access ---------------------- */ #ifndef GL_ARB_direct_state_access #define GL_ARB_direct_state_access 1 #define GL_TEXTURE_TARGET 0x1006 #define GL_QUERY_TARGET 0x82EA typedef void (GLAPIENTRY * PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); typedef void (GLAPIENTRY * PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat* value); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint* buffers); typedef void (GLAPIENTRY * PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); typedef void (GLAPIENTRY * PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint* samplers); typedef void (GLAPIENTRY * PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint* textures); typedef void (GLAPIENTRY * PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void** params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64* param); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint* param); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64* param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments); typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum mode); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum mode); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat* param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint* param); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); #define glBindTextureUnit GLEW_GET_FUN(__glewBindTextureUnit) #define glBlitNamedFramebuffer GLEW_GET_FUN(__glewBlitNamedFramebuffer) #define glCheckNamedFramebufferStatus GLEW_GET_FUN(__glewCheckNamedFramebufferStatus) #define glClearNamedBufferData GLEW_GET_FUN(__glewClearNamedBufferData) #define glClearNamedBufferSubData GLEW_GET_FUN(__glewClearNamedBufferSubData) #define glClearNamedFramebufferfi GLEW_GET_FUN(__glewClearNamedFramebufferfi) #define glClearNamedFramebufferfv GLEW_GET_FUN(__glewClearNamedFramebufferfv) #define glClearNamedFramebufferiv GLEW_GET_FUN(__glewClearNamedFramebufferiv) #define glClearNamedFramebufferuiv GLEW_GET_FUN(__glewClearNamedFramebufferuiv) #define glCompressedTextureSubImage1D GLEW_GET_FUN(__glewCompressedTextureSubImage1D) #define glCompressedTextureSubImage2D GLEW_GET_FUN(__glewCompressedTextureSubImage2D) #define glCompressedTextureSubImage3D GLEW_GET_FUN(__glewCompressedTextureSubImage3D) #define glCopyNamedBufferSubData GLEW_GET_FUN(__glewCopyNamedBufferSubData) #define glCopyTextureSubImage1D GLEW_GET_FUN(__glewCopyTextureSubImage1D) #define glCopyTextureSubImage2D GLEW_GET_FUN(__glewCopyTextureSubImage2D) #define glCopyTextureSubImage3D GLEW_GET_FUN(__glewCopyTextureSubImage3D) #define glCreateBuffers GLEW_GET_FUN(__glewCreateBuffers) #define glCreateFramebuffers GLEW_GET_FUN(__glewCreateFramebuffers) #define glCreateProgramPipelines GLEW_GET_FUN(__glewCreateProgramPipelines) #define glCreateQueries GLEW_GET_FUN(__glewCreateQueries) #define glCreateRenderbuffers GLEW_GET_FUN(__glewCreateRenderbuffers) #define glCreateSamplers GLEW_GET_FUN(__glewCreateSamplers) #define glCreateTextures GLEW_GET_FUN(__glewCreateTextures) #define glCreateTransformFeedbacks GLEW_GET_FUN(__glewCreateTransformFeedbacks) #define glCreateVertexArrays GLEW_GET_FUN(__glewCreateVertexArrays) #define glDisableVertexArrayAttrib GLEW_GET_FUN(__glewDisableVertexArrayAttrib) #define glEnableVertexArrayAttrib GLEW_GET_FUN(__glewEnableVertexArrayAttrib) #define glFlushMappedNamedBufferRange GLEW_GET_FUN(__glewFlushMappedNamedBufferRange) #define glGenerateTextureMipmap GLEW_GET_FUN(__glewGenerateTextureMipmap) #define glGetCompressedTextureImage GLEW_GET_FUN(__glewGetCompressedTextureImage) #define glGetNamedBufferParameteri64v GLEW_GET_FUN(__glewGetNamedBufferParameteri64v) #define glGetNamedBufferParameteriv GLEW_GET_FUN(__glewGetNamedBufferParameteriv) #define glGetNamedBufferPointerv GLEW_GET_FUN(__glewGetNamedBufferPointerv) #define glGetNamedBufferSubData GLEW_GET_FUN(__glewGetNamedBufferSubData) #define glGetNamedFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameteriv) #define glGetNamedFramebufferParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferParameteriv) #define glGetNamedRenderbufferParameteriv GLEW_GET_FUN(__glewGetNamedRenderbufferParameteriv) #define glGetQueryBufferObjecti64v GLEW_GET_FUN(__glewGetQueryBufferObjecti64v) #define glGetQueryBufferObjectiv GLEW_GET_FUN(__glewGetQueryBufferObjectiv) #define glGetQueryBufferObjectui64v GLEW_GET_FUN(__glewGetQueryBufferObjectui64v) #define glGetQueryBufferObjectuiv GLEW_GET_FUN(__glewGetQueryBufferObjectuiv) #define glGetTextureImage GLEW_GET_FUN(__glewGetTextureImage) #define glGetTextureLevelParameterfv GLEW_GET_FUN(__glewGetTextureLevelParameterfv) #define glGetTextureLevelParameteriv GLEW_GET_FUN(__glewGetTextureLevelParameteriv) #define glGetTextureParameterIiv GLEW_GET_FUN(__glewGetTextureParameterIiv) #define glGetTextureParameterIuiv GLEW_GET_FUN(__glewGetTextureParameterIuiv) #define glGetTextureParameterfv GLEW_GET_FUN(__glewGetTextureParameterfv) #define glGetTextureParameteriv GLEW_GET_FUN(__glewGetTextureParameteriv) #define glGetTransformFeedbacki64_v GLEW_GET_FUN(__glewGetTransformFeedbacki64_v) #define glGetTransformFeedbacki_v GLEW_GET_FUN(__glewGetTransformFeedbacki_v) #define glGetTransformFeedbackiv GLEW_GET_FUN(__glewGetTransformFeedbackiv) #define glGetVertexArrayIndexed64iv GLEW_GET_FUN(__glewGetVertexArrayIndexed64iv) #define glGetVertexArrayIndexediv GLEW_GET_FUN(__glewGetVertexArrayIndexediv) #define glGetVertexArrayiv GLEW_GET_FUN(__glewGetVertexArrayiv) #define glInvalidateNamedFramebufferData GLEW_GET_FUN(__glewInvalidateNamedFramebufferData) #define glInvalidateNamedFramebufferSubData GLEW_GET_FUN(__glewInvalidateNamedFramebufferSubData) #define glMapNamedBuffer GLEW_GET_FUN(__glewMapNamedBuffer) #define glMapNamedBufferRange GLEW_GET_FUN(__glewMapNamedBufferRange) #define glNamedBufferData GLEW_GET_FUN(__glewNamedBufferData) #define glNamedBufferStorage GLEW_GET_FUN(__glewNamedBufferStorage) #define glNamedBufferSubData GLEW_GET_FUN(__glewNamedBufferSubData) #define glNamedFramebufferDrawBuffer GLEW_GET_FUN(__glewNamedFramebufferDrawBuffer) #define glNamedFramebufferDrawBuffers GLEW_GET_FUN(__glewNamedFramebufferDrawBuffers) #define glNamedFramebufferParameteri GLEW_GET_FUN(__glewNamedFramebufferParameteri) #define glNamedFramebufferReadBuffer GLEW_GET_FUN(__glewNamedFramebufferReadBuffer) #define glNamedFramebufferRenderbuffer GLEW_GET_FUN(__glewNamedFramebufferRenderbuffer) #define glNamedFramebufferTexture GLEW_GET_FUN(__glewNamedFramebufferTexture) #define glNamedFramebufferTextureLayer GLEW_GET_FUN(__glewNamedFramebufferTextureLayer) #define glNamedRenderbufferStorage GLEW_GET_FUN(__glewNamedRenderbufferStorage) #define glNamedRenderbufferStorageMultisample GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisample) #define glTextureBuffer GLEW_GET_FUN(__glewTextureBuffer) #define glTextureBufferRange GLEW_GET_FUN(__glewTextureBufferRange) #define glTextureParameterIiv GLEW_GET_FUN(__glewTextureParameterIiv) #define glTextureParameterIuiv GLEW_GET_FUN(__glewTextureParameterIuiv) #define glTextureParameterf GLEW_GET_FUN(__glewTextureParameterf) #define glTextureParameterfv GLEW_GET_FUN(__glewTextureParameterfv) #define glTextureParameteri GLEW_GET_FUN(__glewTextureParameteri) #define glTextureParameteriv GLEW_GET_FUN(__glewTextureParameteriv) #define glTextureStorage1D GLEW_GET_FUN(__glewTextureStorage1D) #define glTextureStorage2D GLEW_GET_FUN(__glewTextureStorage2D) #define glTextureStorage2DMultisample GLEW_GET_FUN(__glewTextureStorage2DMultisample) #define glTextureStorage3D GLEW_GET_FUN(__glewTextureStorage3D) #define glTextureStorage3DMultisample GLEW_GET_FUN(__glewTextureStorage3DMultisample) #define glTextureSubImage1D GLEW_GET_FUN(__glewTextureSubImage1D) #define glTextureSubImage2D GLEW_GET_FUN(__glewTextureSubImage2D) #define glTextureSubImage3D GLEW_GET_FUN(__glewTextureSubImage3D) #define glTransformFeedbackBufferBase GLEW_GET_FUN(__glewTransformFeedbackBufferBase) #define glTransformFeedbackBufferRange GLEW_GET_FUN(__glewTransformFeedbackBufferRange) #define glUnmapNamedBuffer GLEW_GET_FUN(__glewUnmapNamedBuffer) #define glVertexArrayAttribBinding GLEW_GET_FUN(__glewVertexArrayAttribBinding) #define glVertexArrayAttribFormat GLEW_GET_FUN(__glewVertexArrayAttribFormat) #define glVertexArrayAttribIFormat GLEW_GET_FUN(__glewVertexArrayAttribIFormat) #define glVertexArrayAttribLFormat GLEW_GET_FUN(__glewVertexArrayAttribLFormat) #define glVertexArrayBindingDivisor GLEW_GET_FUN(__glewVertexArrayBindingDivisor) #define glVertexArrayElementBuffer GLEW_GET_FUN(__glewVertexArrayElementBuffer) #define glVertexArrayVertexBuffer GLEW_GET_FUN(__glewVertexArrayVertexBuffer) #define glVertexArrayVertexBuffers GLEW_GET_FUN(__glewVertexArrayVertexBuffers) #define GLEW_ARB_direct_state_access GLEW_GET_VAR(__GLEW_ARB_direct_state_access) #endif /* GL_ARB_direct_state_access */ /* -------------------------- GL_ARB_draw_buffers -------------------------- */ #ifndef GL_ARB_draw_buffers #define GL_ARB_draw_buffers 1 #define GL_MAX_DRAW_BUFFERS_ARB 0x8824 #define GL_DRAW_BUFFER0_ARB 0x8825 #define GL_DRAW_BUFFER1_ARB 0x8826 #define GL_DRAW_BUFFER2_ARB 0x8827 #define GL_DRAW_BUFFER3_ARB 0x8828 #define GL_DRAW_BUFFER4_ARB 0x8829 #define GL_DRAW_BUFFER5_ARB 0x882A #define GL_DRAW_BUFFER6_ARB 0x882B #define GL_DRAW_BUFFER7_ARB 0x882C #define GL_DRAW_BUFFER8_ARB 0x882D #define GL_DRAW_BUFFER9_ARB 0x882E #define GL_DRAW_BUFFER10_ARB 0x882F #define GL_DRAW_BUFFER11_ARB 0x8830 #define GL_DRAW_BUFFER12_ARB 0x8831 #define GL_DRAW_BUFFER13_ARB 0x8832 #define GL_DRAW_BUFFER14_ARB 0x8833 #define GL_DRAW_BUFFER15_ARB 0x8834 typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs); #define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB) #define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers) #endif /* GL_ARB_draw_buffers */ /* ----------------------- GL_ARB_draw_buffers_blend ----------------------- */ #ifndef GL_ARB_draw_buffers_blend #define GL_ARB_draw_buffers_blend 1 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); #define glBlendEquationSeparateiARB GLEW_GET_FUN(__glewBlendEquationSeparateiARB) #define glBlendEquationiARB GLEW_GET_FUN(__glewBlendEquationiARB) #define glBlendFuncSeparateiARB GLEW_GET_FUN(__glewBlendFuncSeparateiARB) #define glBlendFunciARB GLEW_GET_FUN(__glewBlendFunciARB) #define GLEW_ARB_draw_buffers_blend GLEW_GET_VAR(__GLEW_ARB_draw_buffers_blend) #endif /* GL_ARB_draw_buffers_blend */ /* -------------------- GL_ARB_draw_elements_base_vertex ------------------- */ #ifndef GL_ARB_draw_elements_base_vertex #define GL_ARB_draw_elements_base_vertex 1 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, void *indices, GLint basevertex); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, void *indices, GLint basevertex); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei* count, GLenum type, void**indices, GLsizei primcount, GLint *basevertex); #define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex) #define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex) #define glDrawRangeElementsBaseVertex GLEW_GET_FUN(__glewDrawRangeElementsBaseVertex) #define glMultiDrawElementsBaseVertex GLEW_GET_FUN(__glewMultiDrawElementsBaseVertex) #define GLEW_ARB_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_ARB_draw_elements_base_vertex) #endif /* GL_ARB_draw_elements_base_vertex */ /* -------------------------- GL_ARB_draw_indirect ------------------------- */ #ifndef GL_ARB_draw_indirect #define GL_ARB_draw_indirect 1 #define GL_DRAW_INDIRECT_BUFFER 0x8F3F #define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); #define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect) #define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect) #define GLEW_ARB_draw_indirect GLEW_GET_VAR(__GLEW_ARB_draw_indirect) #endif /* GL_ARB_draw_indirect */ /* ------------------------- GL_ARB_draw_instanced ------------------------- */ #ifndef GL_ARB_draw_instanced #define GL_ARB_draw_instanced 1 #define GLEW_ARB_draw_instanced GLEW_GET_VAR(__GLEW_ARB_draw_instanced) #endif /* GL_ARB_draw_instanced */ /* ------------------------ GL_ARB_enhanced_layouts ------------------------ */ #ifndef GL_ARB_enhanced_layouts #define GL_ARB_enhanced_layouts 1 #define GL_LOCATION_COMPONENT 0x934A #define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B #define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C #define GLEW_ARB_enhanced_layouts GLEW_GET_VAR(__GLEW_ARB_enhanced_layouts) #endif /* GL_ARB_enhanced_layouts */ /* -------------------- GL_ARB_explicit_attrib_location -------------------- */ #ifndef GL_ARB_explicit_attrib_location #define GL_ARB_explicit_attrib_location 1 #define GLEW_ARB_explicit_attrib_location GLEW_GET_VAR(__GLEW_ARB_explicit_attrib_location) #endif /* GL_ARB_explicit_attrib_location */ /* -------------------- GL_ARB_explicit_uniform_location ------------------- */ #ifndef GL_ARB_explicit_uniform_location #define GL_ARB_explicit_uniform_location 1 #define GL_MAX_UNIFORM_LOCATIONS 0x826E #define GLEW_ARB_explicit_uniform_location GLEW_GET_VAR(__GLEW_ARB_explicit_uniform_location) #endif /* GL_ARB_explicit_uniform_location */ /* ------------------- GL_ARB_fragment_coord_conventions ------------------- */ #ifndef GL_ARB_fragment_coord_conventions #define GL_ARB_fragment_coord_conventions 1 #define GLEW_ARB_fragment_coord_conventions GLEW_GET_VAR(__GLEW_ARB_fragment_coord_conventions) #endif /* GL_ARB_fragment_coord_conventions */ /* --------------------- GL_ARB_fragment_layer_viewport -------------------- */ #ifndef GL_ARB_fragment_layer_viewport #define GL_ARB_fragment_layer_viewport 1 #define GLEW_ARB_fragment_layer_viewport GLEW_GET_VAR(__GLEW_ARB_fragment_layer_viewport) #endif /* GL_ARB_fragment_layer_viewport */ /* ------------------------ GL_ARB_fragment_program ------------------------ */ #ifndef GL_ARB_fragment_program #define GL_ARB_fragment_program 1 #define GL_FRAGMENT_PROGRAM_ARB 0x8804 #define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 #define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 #define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 #define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 #define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 #define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A #define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B #define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C #define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D #define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E #define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F #define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 #define GL_MAX_TEXTURE_COORDS_ARB 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 #define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program) #endif /* GL_ARB_fragment_program */ /* --------------------- GL_ARB_fragment_program_shadow -------------------- */ #ifndef GL_ARB_fragment_program_shadow #define GL_ARB_fragment_program_shadow 1 #define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow) #endif /* GL_ARB_fragment_program_shadow */ /* ------------------------- GL_ARB_fragment_shader ------------------------ */ #ifndef GL_ARB_fragment_shader #define GL_ARB_fragment_shader 1 #define GL_FRAGMENT_SHADER_ARB 0x8B30 #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B #define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader) #endif /* GL_ARB_fragment_shader */ /* -------------------- GL_ARB_fragment_shader_interlock ------------------- */ #ifndef GL_ARB_fragment_shader_interlock #define GL_ARB_fragment_shader_interlock 1 #define GLEW_ARB_fragment_shader_interlock GLEW_GET_VAR(__GLEW_ARB_fragment_shader_interlock) #endif /* GL_ARB_fragment_shader_interlock */ /* ------------------- GL_ARB_framebuffer_no_attachments ------------------- */ #ifndef GL_ARB_framebuffer_no_attachments #define GL_ARB_framebuffer_no_attachments 1 #define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 #define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 #define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 #define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 #define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 #define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 #define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 #define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 #define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); #define glFramebufferParameteri GLEW_GET_FUN(__glewFramebufferParameteri) #define glGetFramebufferParameteriv GLEW_GET_FUN(__glewGetFramebufferParameteriv) #define glGetNamedFramebufferParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferParameterivEXT) #define glNamedFramebufferParameteriEXT GLEW_GET_FUN(__glewNamedFramebufferParameteriEXT) #define GLEW_ARB_framebuffer_no_attachments GLEW_GET_VAR(__GLEW_ARB_framebuffer_no_attachments) #endif /* GL_ARB_framebuffer_no_attachments */ /* ----------------------- GL_ARB_framebuffer_object ----------------------- */ #ifndef GL_ARB_framebuffer_object #define GL_ARB_framebuffer_object 1 #define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 #define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 #define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 #define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 #define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 #define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 #define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 #define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 #define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 #define GL_FRAMEBUFFER_DEFAULT 0x8218 #define GL_FRAMEBUFFER_UNDEFINED 0x8219 #define GL_DEPTH_STENCIL_ATTACHMENT 0x821A #define GL_INDEX 0x8222 #define GL_MAX_RENDERBUFFER_SIZE 0x84E8 #define GL_DEPTH_STENCIL 0x84F9 #define GL_UNSIGNED_INT_24_8 0x84FA #define GL_DEPTH24_STENCIL8 0x88F0 #define GL_TEXTURE_STENCIL_SIZE 0x88F1 #define GL_UNSIGNED_NORMALIZED 0x8C17 #define GL_SRGB 0x8C40 #define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 #define GL_FRAMEBUFFER_BINDING 0x8CA6 #define GL_RENDERBUFFER_BINDING 0x8CA7 #define GL_READ_FRAMEBUFFER 0x8CA8 #define GL_DRAW_FRAMEBUFFER 0x8CA9 #define GL_READ_FRAMEBUFFER_BINDING 0x8CAA #define GL_RENDERBUFFER_SAMPLES 0x8CAB #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 #define GL_FRAMEBUFFER_COMPLETE 0x8CD5 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC #define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD #define GL_MAX_COLOR_ATTACHMENTS 0x8CDF #define GL_COLOR_ATTACHMENT0 0x8CE0 #define GL_COLOR_ATTACHMENT1 0x8CE1 #define GL_COLOR_ATTACHMENT2 0x8CE2 #define GL_COLOR_ATTACHMENT3 0x8CE3 #define GL_COLOR_ATTACHMENT4 0x8CE4 #define GL_COLOR_ATTACHMENT5 0x8CE5 #define GL_COLOR_ATTACHMENT6 0x8CE6 #define GL_COLOR_ATTACHMENT7 0x8CE7 #define GL_COLOR_ATTACHMENT8 0x8CE8 #define GL_COLOR_ATTACHMENT9 0x8CE9 #define GL_COLOR_ATTACHMENT10 0x8CEA #define GL_COLOR_ATTACHMENT11 0x8CEB #define GL_COLOR_ATTACHMENT12 0x8CEC #define GL_COLOR_ATTACHMENT13 0x8CED #define GL_COLOR_ATTACHMENT14 0x8CEE #define GL_COLOR_ATTACHMENT15 0x8CEF #define GL_DEPTH_ATTACHMENT 0x8D00 #define GL_STENCIL_ATTACHMENT 0x8D20 #define GL_FRAMEBUFFER 0x8D40 #define GL_RENDERBUFFER 0x8D41 #define GL_RENDERBUFFER_WIDTH 0x8D42 #define GL_RENDERBUFFER_HEIGHT 0x8D43 #define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 #define GL_STENCIL_INDEX1 0x8D46 #define GL_STENCIL_INDEX4 0x8D47 #define GL_STENCIL_INDEX8 0x8D48 #define GL_STENCIL_INDEX16 0x8D49 #define GL_RENDERBUFFER_RED_SIZE 0x8D50 #define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 #define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 #define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 #define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 #define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 #define GL_MAX_SAMPLES 0x8D57 typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer); typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); #define glBindFramebuffer GLEW_GET_FUN(__glewBindFramebuffer) #define glBindRenderbuffer GLEW_GET_FUN(__glewBindRenderbuffer) #define glBlitFramebuffer GLEW_GET_FUN(__glewBlitFramebuffer) #define glCheckFramebufferStatus GLEW_GET_FUN(__glewCheckFramebufferStatus) #define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers) #define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers) #define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer) #define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D) #define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D) #define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D) #define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer) #define glGenFramebuffers GLEW_GET_FUN(__glewGenFramebuffers) #define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers) #define glGenerateMipmap GLEW_GET_FUN(__glewGenerateMipmap) #define glGetFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetFramebufferAttachmentParameteriv) #define glGetRenderbufferParameteriv GLEW_GET_FUN(__glewGetRenderbufferParameteriv) #define glIsFramebuffer GLEW_GET_FUN(__glewIsFramebuffer) #define glIsRenderbuffer GLEW_GET_FUN(__glewIsRenderbuffer) #define glRenderbufferStorage GLEW_GET_FUN(__glewRenderbufferStorage) #define glRenderbufferStorageMultisample GLEW_GET_FUN(__glewRenderbufferStorageMultisample) #define GLEW_ARB_framebuffer_object GLEW_GET_VAR(__GLEW_ARB_framebuffer_object) #endif /* GL_ARB_framebuffer_object */ /* ------------------------ GL_ARB_framebuffer_sRGB ------------------------ */ #ifndef GL_ARB_framebuffer_sRGB #define GL_ARB_framebuffer_sRGB 1 #define GL_FRAMEBUFFER_SRGB 0x8DB9 #define GLEW_ARB_framebuffer_sRGB GLEW_GET_VAR(__GLEW_ARB_framebuffer_sRGB) #endif /* GL_ARB_framebuffer_sRGB */ /* ------------------------ GL_ARB_geometry_shader4 ------------------------ */ #ifndef GL_ARB_geometry_shader4 #define GL_ARB_geometry_shader4 1 #define GL_LINES_ADJACENCY_ARB 0xA #define GL_LINE_STRIP_ADJACENCY_ARB 0xB #define GL_TRIANGLES_ADJACENCY_ARB 0xC #define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0xD #define GL_PROGRAM_POINT_SIZE_ARB 0x8642 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 #define GL_GEOMETRY_SHADER_ARB 0x8DD9 #define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA #define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB #define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC #define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD #define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); #define glFramebufferTextureARB GLEW_GET_FUN(__glewFramebufferTextureARB) #define glFramebufferTextureFaceARB GLEW_GET_FUN(__glewFramebufferTextureFaceARB) #define glFramebufferTextureLayerARB GLEW_GET_FUN(__glewFramebufferTextureLayerARB) #define glProgramParameteriARB GLEW_GET_FUN(__glewProgramParameteriARB) #define GLEW_ARB_geometry_shader4 GLEW_GET_VAR(__GLEW_ARB_geometry_shader4) #endif /* GL_ARB_geometry_shader4 */ /* ----------------------- GL_ARB_get_program_binary ----------------------- */ #ifndef GL_ARB_get_program_binary #define GL_ARB_get_program_binary 1 #define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 #define GL_PROGRAM_BINARY_LENGTH 0x8741 #define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE #define GL_PROGRAM_BINARY_FORMATS 0x87FF typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, void*binary); typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); #define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary) #define glProgramBinary GLEW_GET_FUN(__glewProgramBinary) #define glProgramParameteri GLEW_GET_FUN(__glewProgramParameteri) #define GLEW_ARB_get_program_binary GLEW_GET_VAR(__GLEW_ARB_get_program_binary) #endif /* GL_ARB_get_program_binary */ /* ---------------------- GL_ARB_get_texture_sub_image --------------------- */ #ifndef GL_ARB_get_texture_sub_image #define GL_ARB_get_texture_sub_image 1 typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); typedef void (GLAPIENTRY * PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); #define glGetCompressedTextureSubImage GLEW_GET_FUN(__glewGetCompressedTextureSubImage) #define glGetTextureSubImage GLEW_GET_FUN(__glewGetTextureSubImage) #define GLEW_ARB_get_texture_sub_image GLEW_GET_VAR(__GLEW_ARB_get_texture_sub_image) #endif /* GL_ARB_get_texture_sub_image */ /* ---------------------------- GL_ARB_gl_spirv ---------------------------- */ #ifndef GL_ARB_gl_spirv #define GL_ARB_gl_spirv 1 #define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB 0x9551 #define GL_SPIR_V_BINARY_ARB 0x9552 typedef void (GLAPIENTRY * PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const GLchar* pEntryPoint, GLuint numSpecializationConstants, const GLuint* pConstantIndex, const GLuint* pConstantValue); #define glSpecializeShaderARB GLEW_GET_FUN(__glewSpecializeShaderARB) #define GLEW_ARB_gl_spirv GLEW_GET_VAR(__GLEW_ARB_gl_spirv) #endif /* GL_ARB_gl_spirv */ /* --------------------------- GL_ARB_gpu_shader5 -------------------------- */ #ifndef GL_ARB_gpu_shader5 #define GL_ARB_gpu_shader5 1 #define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F #define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C #define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D #define GL_MAX_VERTEX_STREAMS 0x8E71 #define GLEW_ARB_gpu_shader5 GLEW_GET_VAR(__GLEW_ARB_gpu_shader5) #endif /* GL_ARB_gpu_shader5 */ /* ------------------------- GL_ARB_gpu_shader_fp64 ------------------------ */ #ifndef GL_ARB_gpu_shader_fp64 #define GL_ARB_gpu_shader_fp64 1 #define GL_DOUBLE_MAT2 0x8F46 #define GL_DOUBLE_MAT3 0x8F47 #define GL_DOUBLE_MAT4 0x8F48 #define GL_DOUBLE_MAT2x3 0x8F49 #define GL_DOUBLE_MAT2x4 0x8F4A #define GL_DOUBLE_MAT3x2 0x8F4B #define GL_DOUBLE_MAT3x4 0x8F4C #define GL_DOUBLE_MAT4x2 0x8F4D #define GL_DOUBLE_MAT4x3 0x8F4E #define GL_DOUBLE_VEC2 0x8FFC #define GL_DOUBLE_VEC3 0x8FFD #define GL_DOUBLE_VEC4 0x8FFE typedef void (GLAPIENTRY * PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble* params); typedef void (GLAPIENTRY * PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); typedef void (GLAPIENTRY * PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); #define glGetUniformdv GLEW_GET_FUN(__glewGetUniformdv) #define glUniform1d GLEW_GET_FUN(__glewUniform1d) #define glUniform1dv GLEW_GET_FUN(__glewUniform1dv) #define glUniform2d GLEW_GET_FUN(__glewUniform2d) #define glUniform2dv GLEW_GET_FUN(__glewUniform2dv) #define glUniform3d GLEW_GET_FUN(__glewUniform3d) #define glUniform3dv GLEW_GET_FUN(__glewUniform3dv) #define glUniform4d GLEW_GET_FUN(__glewUniform4d) #define glUniform4dv GLEW_GET_FUN(__glewUniform4dv) #define glUniformMatrix2dv GLEW_GET_FUN(__glewUniformMatrix2dv) #define glUniformMatrix2x3dv GLEW_GET_FUN(__glewUniformMatrix2x3dv) #define glUniformMatrix2x4dv GLEW_GET_FUN(__glewUniformMatrix2x4dv) #define glUniformMatrix3dv GLEW_GET_FUN(__glewUniformMatrix3dv) #define glUniformMatrix3x2dv GLEW_GET_FUN(__glewUniformMatrix3x2dv) #define glUniformMatrix3x4dv GLEW_GET_FUN(__glewUniformMatrix3x4dv) #define glUniformMatrix4dv GLEW_GET_FUN(__glewUniformMatrix4dv) #define glUniformMatrix4x2dv GLEW_GET_FUN(__glewUniformMatrix4x2dv) #define glUniformMatrix4x3dv GLEW_GET_FUN(__glewUniformMatrix4x3dv) #define GLEW_ARB_gpu_shader_fp64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_fp64) #endif /* GL_ARB_gpu_shader_fp64 */ /* ------------------------ GL_ARB_gpu_shader_int64 ------------------------ */ #ifndef GL_ARB_gpu_shader_int64 #define GL_ARB_gpu_shader_int64 1 #define GL_INT64_ARB 0x140E #define GL_UNSIGNED_INT64_ARB 0x140F #define GL_INT64_VEC2_ARB 0x8FE9 #define GL_INT64_VEC3_ARB 0x8FEA #define GL_INT64_VEC4_ARB 0x8FEB #define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5 #define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6 #define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7 typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64* params); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x); typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x); typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y); typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y); typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z); typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); #define glGetUniformi64vARB GLEW_GET_FUN(__glewGetUniformi64vARB) #define glGetUniformui64vARB GLEW_GET_FUN(__glewGetUniformui64vARB) #define glGetnUniformi64vARB GLEW_GET_FUN(__glewGetnUniformi64vARB) #define glGetnUniformui64vARB GLEW_GET_FUN(__glewGetnUniformui64vARB) #define glProgramUniform1i64ARB GLEW_GET_FUN(__glewProgramUniform1i64ARB) #define glProgramUniform1i64vARB GLEW_GET_FUN(__glewProgramUniform1i64vARB) #define glProgramUniform1ui64ARB GLEW_GET_FUN(__glewProgramUniform1ui64ARB) #define glProgramUniform1ui64vARB GLEW_GET_FUN(__glewProgramUniform1ui64vARB) #define glProgramUniform2i64ARB GLEW_GET_FUN(__glewProgramUniform2i64ARB) #define glProgramUniform2i64vARB GLEW_GET_FUN(__glewProgramUniform2i64vARB) #define glProgramUniform2ui64ARB GLEW_GET_FUN(__glewProgramUniform2ui64ARB) #define glProgramUniform2ui64vARB GLEW_GET_FUN(__glewProgramUniform2ui64vARB) #define glProgramUniform3i64ARB GLEW_GET_FUN(__glewProgramUniform3i64ARB) #define glProgramUniform3i64vARB GLEW_GET_FUN(__glewProgramUniform3i64vARB) #define glProgramUniform3ui64ARB GLEW_GET_FUN(__glewProgramUniform3ui64ARB) #define glProgramUniform3ui64vARB GLEW_GET_FUN(__glewProgramUniform3ui64vARB) #define glProgramUniform4i64ARB GLEW_GET_FUN(__glewProgramUniform4i64ARB) #define glProgramUniform4i64vARB GLEW_GET_FUN(__glewProgramUniform4i64vARB) #define glProgramUniform4ui64ARB GLEW_GET_FUN(__glewProgramUniform4ui64ARB) #define glProgramUniform4ui64vARB GLEW_GET_FUN(__glewProgramUniform4ui64vARB) #define glUniform1i64ARB GLEW_GET_FUN(__glewUniform1i64ARB) #define glUniform1i64vARB GLEW_GET_FUN(__glewUniform1i64vARB) #define glUniform1ui64ARB GLEW_GET_FUN(__glewUniform1ui64ARB) #define glUniform1ui64vARB GLEW_GET_FUN(__glewUniform1ui64vARB) #define glUniform2i64ARB GLEW_GET_FUN(__glewUniform2i64ARB) #define glUniform2i64vARB GLEW_GET_FUN(__glewUniform2i64vARB) #define glUniform2ui64ARB GLEW_GET_FUN(__glewUniform2ui64ARB) #define glUniform2ui64vARB GLEW_GET_FUN(__glewUniform2ui64vARB) #define glUniform3i64ARB GLEW_GET_FUN(__glewUniform3i64ARB) #define glUniform3i64vARB GLEW_GET_FUN(__glewUniform3i64vARB) #define glUniform3ui64ARB GLEW_GET_FUN(__glewUniform3ui64ARB) #define glUniform3ui64vARB GLEW_GET_FUN(__glewUniform3ui64vARB) #define glUniform4i64ARB GLEW_GET_FUN(__glewUniform4i64ARB) #define glUniform4i64vARB GLEW_GET_FUN(__glewUniform4i64vARB) #define glUniform4ui64ARB GLEW_GET_FUN(__glewUniform4ui64ARB) #define glUniform4ui64vARB GLEW_GET_FUN(__glewUniform4ui64vARB) #define GLEW_ARB_gpu_shader_int64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_int64) #endif /* GL_ARB_gpu_shader_int64 */ /* ------------------------ GL_ARB_half_float_pixel ------------------------ */ #ifndef GL_ARB_half_float_pixel #define GL_ARB_half_float_pixel 1 #define GL_HALF_FLOAT_ARB 0x140B #define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel) #endif /* GL_ARB_half_float_pixel */ /* ------------------------ GL_ARB_half_float_vertex ----------------------- */ #ifndef GL_ARB_half_float_vertex #define GL_ARB_half_float_vertex 1 #define GL_HALF_FLOAT 0x140B #define GLEW_ARB_half_float_vertex GLEW_GET_VAR(__GLEW_ARB_half_float_vertex) #endif /* GL_ARB_half_float_vertex */ /* ----------------------------- GL_ARB_imaging ---------------------------- */ #ifndef GL_ARB_imaging #define GL_ARB_imaging 1 #define GL_CONSTANT_COLOR 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 #define GL_CONSTANT_ALPHA 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 #define GL_BLEND_COLOR 0x8005 #define GL_FUNC_ADD 0x8006 #define GL_MIN 0x8007 #define GL_MAX 0x8008 #define GL_BLEND_EQUATION 0x8009 #define GL_FUNC_SUBTRACT 0x800A #define GL_FUNC_REVERSE_SUBTRACT 0x800B #define GL_CONVOLUTION_1D 0x8010 #define GL_CONVOLUTION_2D 0x8011 #define GL_SEPARABLE_2D 0x8012 #define GL_CONVOLUTION_BORDER_MODE 0x8013 #define GL_CONVOLUTION_FILTER_SCALE 0x8014 #define GL_CONVOLUTION_FILTER_BIAS 0x8015 #define GL_REDUCE 0x8016 #define GL_CONVOLUTION_FORMAT 0x8017 #define GL_CONVOLUTION_WIDTH 0x8018 #define GL_CONVOLUTION_HEIGHT 0x8019 #define GL_MAX_CONVOLUTION_WIDTH 0x801A #define GL_MAX_CONVOLUTION_HEIGHT 0x801B #define GL_POST_CONVOLUTION_RED_SCALE 0x801C #define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D #define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E #define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F #define GL_POST_CONVOLUTION_RED_BIAS 0x8020 #define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 #define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 #define GL_HISTOGRAM 0x8024 #define GL_PROXY_HISTOGRAM 0x8025 #define GL_HISTOGRAM_WIDTH 0x8026 #define GL_HISTOGRAM_FORMAT 0x8027 #define GL_HISTOGRAM_RED_SIZE 0x8028 #define GL_HISTOGRAM_GREEN_SIZE 0x8029 #define GL_HISTOGRAM_BLUE_SIZE 0x802A #define GL_HISTOGRAM_ALPHA_SIZE 0x802B #define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C #define GL_HISTOGRAM_SINK 0x802D #define GL_MINMAX 0x802E #define GL_MINMAX_FORMAT 0x802F #define GL_MINMAX_SINK 0x8030 #define GL_TABLE_TOO_LARGE 0x8031 #define GL_COLOR_MATRIX 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 #define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 #define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 #define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 #define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 #define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 #define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 #define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA #define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB #define GL_COLOR_TABLE 0x80D0 #define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 #define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 #define GL_PROXY_COLOR_TABLE 0x80D3 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 #define GL_COLOR_TABLE_SCALE 0x80D6 #define GL_COLOR_TABLE_BIAS 0x80D7 #define GL_COLOR_TABLE_FORMAT 0x80D8 #define GL_COLOR_TABLE_WIDTH 0x80D9 #define GL_COLOR_TABLE_RED_SIZE 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF #define GL_IGNORE_BORDER 0x8150 #define GL_CONSTANT_BORDER 0x8151 #define GL_WRAP_BORDER 0x8152 #define GL_REPLICATE_BORDER 0x8153 #define GL_CONVOLUTION_BORDER_COLOR 0x8154 typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, void *values); typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); #define glColorSubTable GLEW_GET_FUN(__glewColorSubTable) #define glColorTable GLEW_GET_FUN(__glewColorTable) #define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv) #define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv) #define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D) #define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D) #define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf) #define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv) #define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri) #define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv) #define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable) #define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable) #define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D) #define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D) #define glGetColorTable GLEW_GET_FUN(__glewGetColorTable) #define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv) #define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv) #define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter) #define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv) #define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv) #define glGetHistogram GLEW_GET_FUN(__glewGetHistogram) #define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv) #define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv) #define glGetMinmax GLEW_GET_FUN(__glewGetMinmax) #define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv) #define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv) #define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter) #define glHistogram GLEW_GET_FUN(__glewHistogram) #define glMinmax GLEW_GET_FUN(__glewMinmax) #define glResetHistogram GLEW_GET_FUN(__glewResetHistogram) #define glResetMinmax GLEW_GET_FUN(__glewResetMinmax) #define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D) #define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging) #endif /* GL_ARB_imaging */ /* ----------------------- GL_ARB_indirect_parameters ---------------------- */ #ifndef GL_ARB_indirect_parameters #define GL_ARB_indirect_parameters 1 #define GL_PARAMETER_BUFFER_ARB 0x80EE #define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); #define glMultiDrawArraysIndirectCountARB GLEW_GET_FUN(__glewMultiDrawArraysIndirectCountARB) #define glMultiDrawElementsIndirectCountARB GLEW_GET_FUN(__glewMultiDrawElementsIndirectCountARB) #define GLEW_ARB_indirect_parameters GLEW_GET_VAR(__GLEW_ARB_indirect_parameters) #endif /* GL_ARB_indirect_parameters */ /* ------------------------ GL_ARB_instanced_arrays ------------------------ */ #ifndef GL_ARB_instanced_arrays #define GL_ARB_instanced_arrays 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); #define glDrawArraysInstancedARB GLEW_GET_FUN(__glewDrawArraysInstancedARB) #define glDrawElementsInstancedARB GLEW_GET_FUN(__glewDrawElementsInstancedARB) #define glVertexAttribDivisorARB GLEW_GET_FUN(__glewVertexAttribDivisorARB) #define GLEW_ARB_instanced_arrays GLEW_GET_VAR(__GLEW_ARB_instanced_arrays) #endif /* GL_ARB_instanced_arrays */ /* ---------------------- GL_ARB_internalformat_query ---------------------- */ #ifndef GL_ARB_internalformat_query #define GL_ARB_internalformat_query 1 #define GL_NUM_SAMPLE_COUNTS 0x9380 typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params); #define glGetInternalformativ GLEW_GET_FUN(__glewGetInternalformativ) #define GLEW_ARB_internalformat_query GLEW_GET_VAR(__GLEW_ARB_internalformat_query) #endif /* GL_ARB_internalformat_query */ /* ---------------------- GL_ARB_internalformat_query2 --------------------- */ #ifndef GL_ARB_internalformat_query2 #define GL_ARB_internalformat_query2 1 #define GL_INTERNALFORMAT_SUPPORTED 0x826F #define GL_INTERNALFORMAT_PREFERRED 0x8270 #define GL_INTERNALFORMAT_RED_SIZE 0x8271 #define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 #define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 #define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 #define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 #define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 #define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 #define GL_INTERNALFORMAT_RED_TYPE 0x8278 #define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 #define GL_INTERNALFORMAT_BLUE_TYPE 0x827A #define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B #define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C #define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D #define GL_MAX_WIDTH 0x827E #define GL_MAX_HEIGHT 0x827F #define GL_MAX_DEPTH 0x8280 #define GL_MAX_LAYERS 0x8281 #define GL_MAX_COMBINED_DIMENSIONS 0x8282 #define GL_COLOR_COMPONENTS 0x8283 #define GL_DEPTH_COMPONENTS 0x8284 #define GL_STENCIL_COMPONENTS 0x8285 #define GL_COLOR_RENDERABLE 0x8286 #define GL_DEPTH_RENDERABLE 0x8287 #define GL_STENCIL_RENDERABLE 0x8288 #define GL_FRAMEBUFFER_RENDERABLE 0x8289 #define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A #define GL_FRAMEBUFFER_BLEND 0x828B #define GL_READ_PIXELS 0x828C #define GL_READ_PIXELS_FORMAT 0x828D #define GL_READ_PIXELS_TYPE 0x828E #define GL_TEXTURE_IMAGE_FORMAT 0x828F #define GL_TEXTURE_IMAGE_TYPE 0x8290 #define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 #define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 #define GL_MIPMAP 0x8293 #define GL_MANUAL_GENERATE_MIPMAP 0x8294 #define GL_AUTO_GENERATE_MIPMAP 0x8295 #define GL_COLOR_ENCODING 0x8296 #define GL_SRGB_READ 0x8297 #define GL_SRGB_WRITE 0x8298 #define GL_SRGB_DECODE_ARB 0x8299 #define GL_FILTER 0x829A #define GL_VERTEX_TEXTURE 0x829B #define GL_TESS_CONTROL_TEXTURE 0x829C #define GL_TESS_EVALUATION_TEXTURE 0x829D #define GL_GEOMETRY_TEXTURE 0x829E #define GL_FRAGMENT_TEXTURE 0x829F #define GL_COMPUTE_TEXTURE 0x82A0 #define GL_TEXTURE_SHADOW 0x82A1 #define GL_TEXTURE_GATHER 0x82A2 #define GL_TEXTURE_GATHER_SHADOW 0x82A3 #define GL_SHADER_IMAGE_LOAD 0x82A4 #define GL_SHADER_IMAGE_STORE 0x82A5 #define GL_SHADER_IMAGE_ATOMIC 0x82A6 #define GL_IMAGE_TEXEL_SIZE 0x82A7 #define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 #define GL_IMAGE_PIXEL_FORMAT 0x82A9 #define GL_IMAGE_PIXEL_TYPE 0x82AA #define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC #define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD #define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE #define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF #define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 #define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 #define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 #define GL_CLEAR_BUFFER 0x82B4 #define GL_TEXTURE_VIEW 0x82B5 #define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 #define GL_FULL_SUPPORT 0x82B7 #define GL_CAVEAT_SUPPORT 0x82B8 #define GL_IMAGE_CLASS_4_X_32 0x82B9 #define GL_IMAGE_CLASS_2_X_32 0x82BA #define GL_IMAGE_CLASS_1_X_32 0x82BB #define GL_IMAGE_CLASS_4_X_16 0x82BC #define GL_IMAGE_CLASS_2_X_16 0x82BD #define GL_IMAGE_CLASS_1_X_16 0x82BE #define GL_IMAGE_CLASS_4_X_8 0x82BF #define GL_IMAGE_CLASS_2_X_8 0x82C0 #define GL_IMAGE_CLASS_1_X_8 0x82C1 #define GL_IMAGE_CLASS_11_11_10 0x82C2 #define GL_IMAGE_CLASS_10_10_10_2 0x82C3 #define GL_VIEW_CLASS_128_BITS 0x82C4 #define GL_VIEW_CLASS_96_BITS 0x82C5 #define GL_VIEW_CLASS_64_BITS 0x82C6 #define GL_VIEW_CLASS_48_BITS 0x82C7 #define GL_VIEW_CLASS_32_BITS 0x82C8 #define GL_VIEW_CLASS_24_BITS 0x82C9 #define GL_VIEW_CLASS_16_BITS 0x82CA #define GL_VIEW_CLASS_8_BITS 0x82CB #define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC #define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD #define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE #define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF #define GL_VIEW_CLASS_RGTC1_RED 0x82D0 #define GL_VIEW_CLASS_RGTC2_RG 0x82D1 #define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 #define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params); #define glGetInternalformati64v GLEW_GET_FUN(__glewGetInternalformati64v) #define GLEW_ARB_internalformat_query2 GLEW_GET_VAR(__GLEW_ARB_internalformat_query2) #endif /* GL_ARB_internalformat_query2 */ /* ----------------------- GL_ARB_invalidate_subdata ----------------------- */ #ifndef GL_ARB_invalidate_subdata #define GL_ARB_invalidate_subdata 1 typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); typedef void (GLAPIENTRY * PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); typedef void (GLAPIENTRY * PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); #define glInvalidateBufferData GLEW_GET_FUN(__glewInvalidateBufferData) #define glInvalidateBufferSubData GLEW_GET_FUN(__glewInvalidateBufferSubData) #define glInvalidateFramebuffer GLEW_GET_FUN(__glewInvalidateFramebuffer) #define glInvalidateSubFramebuffer GLEW_GET_FUN(__glewInvalidateSubFramebuffer) #define glInvalidateTexImage GLEW_GET_FUN(__glewInvalidateTexImage) #define glInvalidateTexSubImage GLEW_GET_FUN(__glewInvalidateTexSubImage) #define GLEW_ARB_invalidate_subdata GLEW_GET_VAR(__GLEW_ARB_invalidate_subdata) #endif /* GL_ARB_invalidate_subdata */ /* ---------------------- GL_ARB_map_buffer_alignment ---------------------- */ #ifndef GL_ARB_map_buffer_alignment #define GL_ARB_map_buffer_alignment 1 #define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC #define GLEW_ARB_map_buffer_alignment GLEW_GET_VAR(__GLEW_ARB_map_buffer_alignment) #endif /* GL_ARB_map_buffer_alignment */ /* ------------------------ GL_ARB_map_buffer_range ------------------------ */ #ifndef GL_ARB_map_buffer_range #define GL_ARB_map_buffer_range 1 #define GL_MAP_READ_BIT 0x0001 #define GL_MAP_WRITE_BIT 0x0002 #define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 #define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 #define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 #define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); #define glFlushMappedBufferRange GLEW_GET_FUN(__glewFlushMappedBufferRange) #define glMapBufferRange GLEW_GET_FUN(__glewMapBufferRange) #define GLEW_ARB_map_buffer_range GLEW_GET_VAR(__GLEW_ARB_map_buffer_range) #endif /* GL_ARB_map_buffer_range */ /* ------------------------- GL_ARB_matrix_palette ------------------------- */ #ifndef GL_ARB_matrix_palette #define GL_ARB_matrix_palette 1 #define GL_MATRIX_PALETTE_ARB 0x8840 #define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 #define GL_MAX_PALETTE_MATRICES_ARB 0x8842 #define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 #define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 #define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 #define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 #define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 #define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 #define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices); typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices); typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices); #define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB) #define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB) #define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB) #define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB) #define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB) #define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette) #endif /* GL_ARB_matrix_palette */ /* --------------------------- GL_ARB_multi_bind --------------------------- */ #ifndef GL_ARB_multi_bind #define GL_ARB_multi_bind 1 typedef void (GLAPIENTRY * PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers); typedef void (GLAPIENTRY * PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizeiptr *sizes); typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); typedef void (GLAPIENTRY * PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint* samplers); typedef void (GLAPIENTRY * PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); #define glBindBuffersBase GLEW_GET_FUN(__glewBindBuffersBase) #define glBindBuffersRange GLEW_GET_FUN(__glewBindBuffersRange) #define glBindImageTextures GLEW_GET_FUN(__glewBindImageTextures) #define glBindSamplers GLEW_GET_FUN(__glewBindSamplers) #define glBindTextures GLEW_GET_FUN(__glewBindTextures) #define glBindVertexBuffers GLEW_GET_FUN(__glewBindVertexBuffers) #define GLEW_ARB_multi_bind GLEW_GET_VAR(__GLEW_ARB_multi_bind) #endif /* GL_ARB_multi_bind */ /* ----------------------- GL_ARB_multi_draw_indirect ---------------------- */ #ifndef GL_ARB_multi_draw_indirect #define GL_ARB_multi_draw_indirect 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); #define glMultiDrawArraysIndirect GLEW_GET_FUN(__glewMultiDrawArraysIndirect) #define glMultiDrawElementsIndirect GLEW_GET_FUN(__glewMultiDrawElementsIndirect) #define GLEW_ARB_multi_draw_indirect GLEW_GET_VAR(__GLEW_ARB_multi_draw_indirect) #endif /* GL_ARB_multi_draw_indirect */ /* --------------------------- GL_ARB_multisample -------------------------- */ #ifndef GL_ARB_multisample #define GL_ARB_multisample 1 #define GL_MULTISAMPLE_ARB 0x809D #define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F #define GL_SAMPLE_COVERAGE_ARB 0x80A0 #define GL_SAMPLE_BUFFERS_ARB 0x80A8 #define GL_SAMPLES_ARB 0x80A9 #define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA #define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB #define GL_MULTISAMPLE_BIT_ARB 0x20000000 typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); #define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB) #define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample) #endif /* GL_ARB_multisample */ /* -------------------------- GL_ARB_multitexture -------------------------- */ #ifndef GL_ARB_multitexture #define GL_ARB_multitexture 1 #define GL_TEXTURE0_ARB 0x84C0 #define GL_TEXTURE1_ARB 0x84C1 #define GL_TEXTURE2_ARB 0x84C2 #define GL_TEXTURE3_ARB 0x84C3 #define GL_TEXTURE4_ARB 0x84C4 #define GL_TEXTURE5_ARB 0x84C5 #define GL_TEXTURE6_ARB 0x84C6 #define GL_TEXTURE7_ARB 0x84C7 #define GL_TEXTURE8_ARB 0x84C8 #define GL_TEXTURE9_ARB 0x84C9 #define GL_TEXTURE10_ARB 0x84CA #define GL_TEXTURE11_ARB 0x84CB #define GL_TEXTURE12_ARB 0x84CC #define GL_TEXTURE13_ARB 0x84CD #define GL_TEXTURE14_ARB 0x84CE #define GL_TEXTURE15_ARB 0x84CF #define GL_TEXTURE16_ARB 0x84D0 #define GL_TEXTURE17_ARB 0x84D1 #define GL_TEXTURE18_ARB 0x84D2 #define GL_TEXTURE19_ARB 0x84D3 #define GL_TEXTURE20_ARB 0x84D4 #define GL_TEXTURE21_ARB 0x84D5 #define GL_TEXTURE22_ARB 0x84D6 #define GL_TEXTURE23_ARB 0x84D7 #define GL_TEXTURE24_ARB 0x84D8 #define GL_TEXTURE25_ARB 0x84D9 #define GL_TEXTURE26_ARB 0x84DA #define GL_TEXTURE27_ARB 0x84DB #define GL_TEXTURE28_ARB 0x84DC #define GL_TEXTURE29_ARB 0x84DD #define GL_TEXTURE30_ARB 0x84DE #define GL_TEXTURE31_ARB 0x84DF #define GL_ACTIVE_TEXTURE_ARB 0x84E0 #define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 #define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); #define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB) #define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB) #define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB) #define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB) #define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB) #define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB) #define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB) #define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB) #define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB) #define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB) #define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB) #define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB) #define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB) #define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB) #define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB) #define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB) #define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB) #define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB) #define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB) #define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB) #define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB) #define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB) #define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB) #define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB) #define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB) #define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB) #define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB) #define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB) #define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB) #define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB) #define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB) #define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB) #define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB) #define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB) #define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture) #endif /* GL_ARB_multitexture */ /* ------------------------- GL_ARB_occlusion_query ------------------------ */ #ifndef GL_ARB_occlusion_query #define GL_ARB_occlusion_query 1 #define GL_QUERY_COUNTER_BITS_ARB 0x8864 #define GL_CURRENT_QUERY_ARB 0x8865 #define GL_QUERY_RESULT_ARB 0x8866 #define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 #define GL_SAMPLES_PASSED_ARB 0x8914 typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id); #define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB) #define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB) #define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB) #define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB) #define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB) #define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB) #define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB) #define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB) #define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query) #endif /* GL_ARB_occlusion_query */ /* ------------------------ GL_ARB_occlusion_query2 ------------------------ */ #ifndef GL_ARB_occlusion_query2 #define GL_ARB_occlusion_query2 1 #define GL_ANY_SAMPLES_PASSED 0x8C2F #define GLEW_ARB_occlusion_query2 GLEW_GET_VAR(__GLEW_ARB_occlusion_query2) #endif /* GL_ARB_occlusion_query2 */ /* --------------------- GL_ARB_parallel_shader_compile -------------------- */ #ifndef GL_ARB_parallel_shader_compile #define GL_ARB_parallel_shader_compile 1 #define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0 #define GL_COMPLETION_STATUS_ARB 0x91B1 typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count); #define glMaxShaderCompilerThreadsARB GLEW_GET_FUN(__glewMaxShaderCompilerThreadsARB) #define GLEW_ARB_parallel_shader_compile GLEW_GET_VAR(__GLEW_ARB_parallel_shader_compile) #endif /* GL_ARB_parallel_shader_compile */ /* -------------------- GL_ARB_pipeline_statistics_query ------------------- */ #ifndef GL_ARB_pipeline_statistics_query #define GL_ARB_pipeline_statistics_query 1 #define GL_VERTICES_SUBMITTED_ARB 0x82EE #define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF #define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 #define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 #define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 #define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 #define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 #define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 #define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 #define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 #define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F #define GLEW_ARB_pipeline_statistics_query GLEW_GET_VAR(__GLEW_ARB_pipeline_statistics_query) #endif /* GL_ARB_pipeline_statistics_query */ /* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */ #ifndef GL_ARB_pixel_buffer_object #define GL_ARB_pixel_buffer_object 1 #define GL_PIXEL_PACK_BUFFER_ARB 0x88EB #define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF #define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object) #endif /* GL_ARB_pixel_buffer_object */ /* ------------------------ GL_ARB_point_parameters ------------------------ */ #ifndef GL_ARB_point_parameters #define GL_ARB_point_parameters 1 #define GL_POINT_SIZE_MIN_ARB 0x8126 #define GL_POINT_SIZE_MAX_ARB 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 #define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat* params); #define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB) #define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB) #define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters) #endif /* GL_ARB_point_parameters */ /* -------------------------- GL_ARB_point_sprite -------------------------- */ #ifndef GL_ARB_point_sprite #define GL_ARB_point_sprite 1 #define GL_POINT_SPRITE_ARB 0x8861 #define GL_COORD_REPLACE_ARB 0x8862 #define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite) #endif /* GL_ARB_point_sprite */ /* ---------------------- GL_ARB_polygon_offset_clamp ---------------------- */ #ifndef GL_ARB_polygon_offset_clamp #define GL_ARB_polygon_offset_clamp 1 #define GL_POLYGON_OFFSET_CLAMP 0x8E1B typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPPROC) (GLfloat factor, GLfloat units, GLfloat clamp); #define glPolygonOffsetClamp GLEW_GET_FUN(__glewPolygonOffsetClamp) #define GLEW_ARB_polygon_offset_clamp GLEW_GET_VAR(__GLEW_ARB_polygon_offset_clamp) #endif /* GL_ARB_polygon_offset_clamp */ /* ----------------------- GL_ARB_post_depth_coverage ---------------------- */ #ifndef GL_ARB_post_depth_coverage #define GL_ARB_post_depth_coverage 1 #define GLEW_ARB_post_depth_coverage GLEW_GET_VAR(__GLEW_ARB_post_depth_coverage) #endif /* GL_ARB_post_depth_coverage */ /* --------------------- GL_ARB_program_interface_query -------------------- */ #ifndef GL_ARB_program_interface_query #define GL_ARB_program_interface_query 1 #define GL_UNIFORM 0x92E1 #define GL_UNIFORM_BLOCK 0x92E2 #define GL_PROGRAM_INPUT 0x92E3 #define GL_PROGRAM_OUTPUT 0x92E4 #define GL_BUFFER_VARIABLE 0x92E5 #define GL_SHADER_STORAGE_BLOCK 0x92E6 #define GL_IS_PER_PATCH 0x92E7 #define GL_VERTEX_SUBROUTINE 0x92E8 #define GL_TESS_CONTROL_SUBROUTINE 0x92E9 #define GL_TESS_EVALUATION_SUBROUTINE 0x92EA #define GL_GEOMETRY_SUBROUTINE 0x92EB #define GL_FRAGMENT_SUBROUTINE 0x92EC #define GL_COMPUTE_SUBROUTINE 0x92ED #define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE #define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF #define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 #define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 #define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 #define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 #define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 #define GL_ACTIVE_RESOURCES 0x92F5 #define GL_MAX_NAME_LENGTH 0x92F6 #define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 #define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 #define GL_NAME_LENGTH 0x92F9 #define GL_TYPE 0x92FA #define GL_ARRAY_SIZE 0x92FB #define GL_OFFSET 0x92FC #define GL_BLOCK_INDEX 0x92FD #define GL_ARRAY_STRIDE 0x92FE #define GL_MATRIX_STRIDE 0x92FF #define GL_IS_ROW_MAJOR 0x9300 #define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 #define GL_BUFFER_BINDING 0x9302 #define GL_BUFFER_DATA_SIZE 0x9303 #define GL_NUM_ACTIVE_VARIABLES 0x9304 #define GL_ACTIVE_VARIABLES 0x9305 #define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 #define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 #define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 #define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 #define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A #define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B #define GL_TOP_LEVEL_ARRAY_SIZE 0x930C #define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D #define GL_LOCATION 0x930E #define GL_LOCATION_INDEX 0x930F typedef void (GLAPIENTRY * PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint* params); typedef GLuint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar* name); typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar *name); typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLint *params); #define glGetProgramInterfaceiv GLEW_GET_FUN(__glewGetProgramInterfaceiv) #define glGetProgramResourceIndex GLEW_GET_FUN(__glewGetProgramResourceIndex) #define glGetProgramResourceLocation GLEW_GET_FUN(__glewGetProgramResourceLocation) #define glGetProgramResourceLocationIndex GLEW_GET_FUN(__glewGetProgramResourceLocationIndex) #define glGetProgramResourceName GLEW_GET_FUN(__glewGetProgramResourceName) #define glGetProgramResourceiv GLEW_GET_FUN(__glewGetProgramResourceiv) #define GLEW_ARB_program_interface_query GLEW_GET_VAR(__GLEW_ARB_program_interface_query) #endif /* GL_ARB_program_interface_query */ /* ------------------------ GL_ARB_provoking_vertex ------------------------ */ #ifndef GL_ARB_provoking_vertex #define GL_ARB_provoking_vertex 1 #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C #define GL_FIRST_VERTEX_CONVENTION 0x8E4D #define GL_LAST_VERTEX_CONVENTION 0x8E4E #define GL_PROVOKING_VERTEX 0x8E4F typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode); #define glProvokingVertex GLEW_GET_FUN(__glewProvokingVertex) #define GLEW_ARB_provoking_vertex GLEW_GET_VAR(__GLEW_ARB_provoking_vertex) #endif /* GL_ARB_provoking_vertex */ /* ----------------------- GL_ARB_query_buffer_object ---------------------- */ #ifndef GL_ARB_query_buffer_object #define GL_ARB_query_buffer_object 1 #define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 #define GL_QUERY_BUFFER 0x9192 #define GL_QUERY_BUFFER_BINDING 0x9193 #define GL_QUERY_RESULT_NO_WAIT 0x9194 #define GLEW_ARB_query_buffer_object GLEW_GET_VAR(__GLEW_ARB_query_buffer_object) #endif /* GL_ARB_query_buffer_object */ /* ------------------ GL_ARB_robust_buffer_access_behavior ----------------- */ #ifndef GL_ARB_robust_buffer_access_behavior #define GL_ARB_robust_buffer_access_behavior 1 #define GLEW_ARB_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_ARB_robust_buffer_access_behavior) #endif /* GL_ARB_robust_buffer_access_behavior */ /* --------------------------- GL_ARB_robustness --------------------------- */ #ifndef GL_ARB_robustness #define GL_ARB_robustness 1 #define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 #define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 #define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 #define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 #define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 #define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 #define GL_NO_RESET_NOTIFICATION_ARB 0x8261 typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); typedef void (GLAPIENTRY * PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table); typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void* img); typedef void (GLAPIENTRY * PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image); typedef void (GLAPIENTRY * PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); typedef void (GLAPIENTRY * PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble* v); typedef void (GLAPIENTRY * PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat* v); typedef void (GLAPIENTRY * PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint* v); typedef void (GLAPIENTRY * PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat* values); typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint* values); typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort* values); typedef void (GLAPIENTRY * PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte* pattern); typedef void (GLAPIENTRY * PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, void*column, void*span); typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); typedef void (GLAPIENTRY * PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data); #define glGetGraphicsResetStatusARB GLEW_GET_FUN(__glewGetGraphicsResetStatusARB) #define glGetnColorTableARB GLEW_GET_FUN(__glewGetnColorTableARB) #define glGetnCompressedTexImageARB GLEW_GET_FUN(__glewGetnCompressedTexImageARB) #define glGetnConvolutionFilterARB GLEW_GET_FUN(__glewGetnConvolutionFilterARB) #define glGetnHistogramARB GLEW_GET_FUN(__glewGetnHistogramARB) #define glGetnMapdvARB GLEW_GET_FUN(__glewGetnMapdvARB) #define glGetnMapfvARB GLEW_GET_FUN(__glewGetnMapfvARB) #define glGetnMapivARB GLEW_GET_FUN(__glewGetnMapivARB) #define glGetnMinmaxARB GLEW_GET_FUN(__glewGetnMinmaxARB) #define glGetnPixelMapfvARB GLEW_GET_FUN(__glewGetnPixelMapfvARB) #define glGetnPixelMapuivARB GLEW_GET_FUN(__glewGetnPixelMapuivARB) #define glGetnPixelMapusvARB GLEW_GET_FUN(__glewGetnPixelMapusvARB) #define glGetnPolygonStippleARB GLEW_GET_FUN(__glewGetnPolygonStippleARB) #define glGetnSeparableFilterARB GLEW_GET_FUN(__glewGetnSeparableFilterARB) #define glGetnTexImageARB GLEW_GET_FUN(__glewGetnTexImageARB) #define glGetnUniformdvARB GLEW_GET_FUN(__glewGetnUniformdvARB) #define glGetnUniformfvARB GLEW_GET_FUN(__glewGetnUniformfvARB) #define glGetnUniformivARB GLEW_GET_FUN(__glewGetnUniformivARB) #define glGetnUniformuivARB GLEW_GET_FUN(__glewGetnUniformuivARB) #define glReadnPixelsARB GLEW_GET_FUN(__glewReadnPixelsARB) #define GLEW_ARB_robustness GLEW_GET_VAR(__GLEW_ARB_robustness) #endif /* GL_ARB_robustness */ /* ---------------- GL_ARB_robustness_application_isolation ---------------- */ #ifndef GL_ARB_robustness_application_isolation #define GL_ARB_robustness_application_isolation 1 #define GLEW_ARB_robustness_application_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_application_isolation) #endif /* GL_ARB_robustness_application_isolation */ /* ---------------- GL_ARB_robustness_share_group_isolation ---------------- */ #ifndef GL_ARB_robustness_share_group_isolation #define GL_ARB_robustness_share_group_isolation 1 #define GLEW_ARB_robustness_share_group_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_share_group_isolation) #endif /* GL_ARB_robustness_share_group_isolation */ /* ------------------------ GL_ARB_sample_locations ------------------------ */ #ifndef GL_ARB_sample_locations #define GL_ARB_sample_locations 1 #define GL_SAMPLE_LOCATION_ARB 0x8E50 #define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D #define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E #define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F #define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340 #define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 #define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342 #define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); #define glFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewFramebufferSampleLocationsfvARB) #define glNamedFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvARB) #define GLEW_ARB_sample_locations GLEW_GET_VAR(__GLEW_ARB_sample_locations) #endif /* GL_ARB_sample_locations */ /* ------------------------- GL_ARB_sample_shading ------------------------- */ #ifndef GL_ARB_sample_shading #define GL_ARB_sample_shading 1 #define GL_SAMPLE_SHADING_ARB 0x8C36 #define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value); #define glMinSampleShadingARB GLEW_GET_FUN(__glewMinSampleShadingARB) #define GLEW_ARB_sample_shading GLEW_GET_VAR(__GLEW_ARB_sample_shading) #endif /* GL_ARB_sample_shading */ /* ------------------------- GL_ARB_sampler_objects ------------------------ */ #ifndef GL_ARB_sampler_objects #define GL_ARB_sampler_objects 1 #define GL_SAMPLER_BINDING 0x8919 typedef void (GLAPIENTRY * PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); typedef void (GLAPIENTRY * PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint * samplers); typedef void (GLAPIENTRY * PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint* samplers); typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISSAMPLERPROC) (GLuint sampler); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint* params); #define glBindSampler GLEW_GET_FUN(__glewBindSampler) #define glDeleteSamplers GLEW_GET_FUN(__glewDeleteSamplers) #define glGenSamplers GLEW_GET_FUN(__glewGenSamplers) #define glGetSamplerParameterIiv GLEW_GET_FUN(__glewGetSamplerParameterIiv) #define glGetSamplerParameterIuiv GLEW_GET_FUN(__glewGetSamplerParameterIuiv) #define glGetSamplerParameterfv GLEW_GET_FUN(__glewGetSamplerParameterfv) #define glGetSamplerParameteriv GLEW_GET_FUN(__glewGetSamplerParameteriv) #define glIsSampler GLEW_GET_FUN(__glewIsSampler) #define glSamplerParameterIiv GLEW_GET_FUN(__glewSamplerParameterIiv) #define glSamplerParameterIuiv GLEW_GET_FUN(__glewSamplerParameterIuiv) #define glSamplerParameterf GLEW_GET_FUN(__glewSamplerParameterf) #define glSamplerParameterfv GLEW_GET_FUN(__glewSamplerParameterfv) #define glSamplerParameteri GLEW_GET_FUN(__glewSamplerParameteri) #define glSamplerParameteriv GLEW_GET_FUN(__glewSamplerParameteriv) #define GLEW_ARB_sampler_objects GLEW_GET_VAR(__GLEW_ARB_sampler_objects) #endif /* GL_ARB_sampler_objects */ /* ------------------------ GL_ARB_seamless_cube_map ----------------------- */ #ifndef GL_ARB_seamless_cube_map #define GL_ARB_seamless_cube_map 1 #define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F #define GLEW_ARB_seamless_cube_map GLEW_GET_VAR(__GLEW_ARB_seamless_cube_map) #endif /* GL_ARB_seamless_cube_map */ /* ------------------ GL_ARB_seamless_cubemap_per_texture ------------------ */ #ifndef GL_ARB_seamless_cubemap_per_texture #define GL_ARB_seamless_cubemap_per_texture 1 #define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F #define GLEW_ARB_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_ARB_seamless_cubemap_per_texture) #endif /* GL_ARB_seamless_cubemap_per_texture */ /* --------------------- GL_ARB_separate_shader_objects -------------------- */ #ifndef GL_ARB_separate_shader_objects #define GL_ARB_separate_shader_objects 1 #define GL_VERTEX_SHADER_BIT 0x00000001 #define GL_FRAGMENT_SHADER_BIT 0x00000002 #define GL_GEOMETRY_SHADER_BIT 0x00000004 #define GL_TESS_CONTROL_SHADER_BIT 0x00000008 #define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 #define GL_PROGRAM_SEPARABLE 0x8258 #define GL_ACTIVE_PROGRAM 0x8259 #define GL_PROGRAM_PIPELINE_BINDING 0x825A #define GL_ALL_SHADER_BITS 0xFFFFFFFF typedef void (GLAPIENTRY * PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); typedef void (GLAPIENTRY * PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar * const * strings); typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint* pipelines); typedef void (GLAPIENTRY * PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar *infoLog); typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint x, GLuint y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); #define glActiveShaderProgram GLEW_GET_FUN(__glewActiveShaderProgram) #define glBindProgramPipeline GLEW_GET_FUN(__glewBindProgramPipeline) #define glCreateShaderProgramv GLEW_GET_FUN(__glewCreateShaderProgramv) #define glDeleteProgramPipelines GLEW_GET_FUN(__glewDeleteProgramPipelines) #define glGenProgramPipelines GLEW_GET_FUN(__glewGenProgramPipelines) #define glGetProgramPipelineInfoLog GLEW_GET_FUN(__glewGetProgramPipelineInfoLog) #define glGetProgramPipelineiv GLEW_GET_FUN(__glewGetProgramPipelineiv) #define glIsProgramPipeline GLEW_GET_FUN(__glewIsProgramPipeline) #define glProgramUniform1d GLEW_GET_FUN(__glewProgramUniform1d) #define glProgramUniform1dv GLEW_GET_FUN(__glewProgramUniform1dv) #define glProgramUniform1f GLEW_GET_FUN(__glewProgramUniform1f) #define glProgramUniform1fv GLEW_GET_FUN(__glewProgramUniform1fv) #define glProgramUniform1i GLEW_GET_FUN(__glewProgramUniform1i) #define glProgramUniform1iv GLEW_GET_FUN(__glewProgramUniform1iv) #define glProgramUniform1ui GLEW_GET_FUN(__glewProgramUniform1ui) #define glProgramUniform1uiv GLEW_GET_FUN(__glewProgramUniform1uiv) #define glProgramUniform2d GLEW_GET_FUN(__glewProgramUniform2d) #define glProgramUniform2dv GLEW_GET_FUN(__glewProgramUniform2dv) #define glProgramUniform2f GLEW_GET_FUN(__glewProgramUniform2f) #define glProgramUniform2fv GLEW_GET_FUN(__glewProgramUniform2fv) #define glProgramUniform2i GLEW_GET_FUN(__glewProgramUniform2i) #define glProgramUniform2iv GLEW_GET_FUN(__glewProgramUniform2iv) #define glProgramUniform2ui GLEW_GET_FUN(__glewProgramUniform2ui) #define glProgramUniform2uiv GLEW_GET_FUN(__glewProgramUniform2uiv) #define glProgramUniform3d GLEW_GET_FUN(__glewProgramUniform3d) #define glProgramUniform3dv GLEW_GET_FUN(__glewProgramUniform3dv) #define glProgramUniform3f GLEW_GET_FUN(__glewProgramUniform3f) #define glProgramUniform3fv GLEW_GET_FUN(__glewProgramUniform3fv) #define glProgramUniform3i GLEW_GET_FUN(__glewProgramUniform3i) #define glProgramUniform3iv GLEW_GET_FUN(__glewProgramUniform3iv) #define glProgramUniform3ui GLEW_GET_FUN(__glewProgramUniform3ui) #define glProgramUniform3uiv GLEW_GET_FUN(__glewProgramUniform3uiv) #define glProgramUniform4d GLEW_GET_FUN(__glewProgramUniform4d) #define glProgramUniform4dv GLEW_GET_FUN(__glewProgramUniform4dv) #define glProgramUniform4f GLEW_GET_FUN(__glewProgramUniform4f) #define glProgramUniform4fv GLEW_GET_FUN(__glewProgramUniform4fv) #define glProgramUniform4i GLEW_GET_FUN(__glewProgramUniform4i) #define glProgramUniform4iv GLEW_GET_FUN(__glewProgramUniform4iv) #define glProgramUniform4ui GLEW_GET_FUN(__glewProgramUniform4ui) #define glProgramUniform4uiv GLEW_GET_FUN(__glewProgramUniform4uiv) #define glProgramUniformMatrix2dv GLEW_GET_FUN(__glewProgramUniformMatrix2dv) #define glProgramUniformMatrix2fv GLEW_GET_FUN(__glewProgramUniformMatrix2fv) #define glProgramUniformMatrix2x3dv GLEW_GET_FUN(__glewProgramUniformMatrix2x3dv) #define glProgramUniformMatrix2x3fv GLEW_GET_FUN(__glewProgramUniformMatrix2x3fv) #define glProgramUniformMatrix2x4dv GLEW_GET_FUN(__glewProgramUniformMatrix2x4dv) #define glProgramUniformMatrix2x4fv GLEW_GET_FUN(__glewProgramUniformMatrix2x4fv) #define glProgramUniformMatrix3dv GLEW_GET_FUN(__glewProgramUniformMatrix3dv) #define glProgramUniformMatrix3fv GLEW_GET_FUN(__glewProgramUniformMatrix3fv) #define glProgramUniformMatrix3x2dv GLEW_GET_FUN(__glewProgramUniformMatrix3x2dv) #define glProgramUniformMatrix3x2fv GLEW_GET_FUN(__glewProgramUniformMatrix3x2fv) #define glProgramUniformMatrix3x4dv GLEW_GET_FUN(__glewProgramUniformMatrix3x4dv) #define glProgramUniformMatrix3x4fv GLEW_GET_FUN(__glewProgramUniformMatrix3x4fv) #define glProgramUniformMatrix4dv GLEW_GET_FUN(__glewProgramUniformMatrix4dv) #define glProgramUniformMatrix4fv GLEW_GET_FUN(__glewProgramUniformMatrix4fv) #define glProgramUniformMatrix4x2dv GLEW_GET_FUN(__glewProgramUniformMatrix4x2dv) #define glProgramUniformMatrix4x2fv GLEW_GET_FUN(__glewProgramUniformMatrix4x2fv) #define glProgramUniformMatrix4x3dv GLEW_GET_FUN(__glewProgramUniformMatrix4x3dv) #define glProgramUniformMatrix4x3fv GLEW_GET_FUN(__glewProgramUniformMatrix4x3fv) #define glUseProgramStages GLEW_GET_FUN(__glewUseProgramStages) #define glValidateProgramPipeline GLEW_GET_FUN(__glewValidateProgramPipeline) #define GLEW_ARB_separate_shader_objects GLEW_GET_VAR(__GLEW_ARB_separate_shader_objects) #endif /* GL_ARB_separate_shader_objects */ /* -------------------- GL_ARB_shader_atomic_counter_ops ------------------- */ #ifndef GL_ARB_shader_atomic_counter_ops #define GL_ARB_shader_atomic_counter_ops 1 #define GLEW_ARB_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counter_ops) #endif /* GL_ARB_shader_atomic_counter_ops */ /* --------------------- GL_ARB_shader_atomic_counters --------------------- */ #ifndef GL_ARB_shader_atomic_counters #define GL_ARB_shader_atomic_counters 1 #define GL_ATOMIC_COUNTER_BUFFER 0x92C0 #define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 #define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 #define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 #define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 #define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 #define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB #define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC #define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD #define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE #define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF #define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 #define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 #define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 #define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 #define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 #define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 #define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 #define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 #define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 #define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 #define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA #define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB #define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC typedef void (GLAPIENTRY * PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint* params); #define glGetActiveAtomicCounterBufferiv GLEW_GET_FUN(__glewGetActiveAtomicCounterBufferiv) #define GLEW_ARB_shader_atomic_counters GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counters) #endif /* GL_ARB_shader_atomic_counters */ /* -------------------------- GL_ARB_shader_ballot ------------------------- */ #ifndef GL_ARB_shader_ballot #define GL_ARB_shader_ballot 1 #define GLEW_ARB_shader_ballot GLEW_GET_VAR(__GLEW_ARB_shader_ballot) #endif /* GL_ARB_shader_ballot */ /* ----------------------- GL_ARB_shader_bit_encoding ---------------------- */ #ifndef GL_ARB_shader_bit_encoding #define GL_ARB_shader_bit_encoding 1 #define GLEW_ARB_shader_bit_encoding GLEW_GET_VAR(__GLEW_ARB_shader_bit_encoding) #endif /* GL_ARB_shader_bit_encoding */ /* -------------------------- GL_ARB_shader_clock -------------------------- */ #ifndef GL_ARB_shader_clock #define GL_ARB_shader_clock 1 #define GLEW_ARB_shader_clock GLEW_GET_VAR(__GLEW_ARB_shader_clock) #endif /* GL_ARB_shader_clock */ /* --------------------- GL_ARB_shader_draw_parameters --------------------- */ #ifndef GL_ARB_shader_draw_parameters #define GL_ARB_shader_draw_parameters 1 #define GLEW_ARB_shader_draw_parameters GLEW_GET_VAR(__GLEW_ARB_shader_draw_parameters) #endif /* GL_ARB_shader_draw_parameters */ /* ------------------------ GL_ARB_shader_group_vote ----------------------- */ #ifndef GL_ARB_shader_group_vote #define GL_ARB_shader_group_vote 1 #define GLEW_ARB_shader_group_vote GLEW_GET_VAR(__GLEW_ARB_shader_group_vote) #endif /* GL_ARB_shader_group_vote */ /* --------------------- GL_ARB_shader_image_load_store -------------------- */ #ifndef GL_ARB_shader_image_load_store #define GL_ARB_shader_image_load_store 1 #define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 #define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 #define GL_UNIFORM_BARRIER_BIT 0x00000004 #define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 #define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 #define GL_COMMAND_BARRIER_BIT 0x00000040 #define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 #define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 #define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 #define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 #define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 #define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 #define GL_MAX_IMAGE_UNITS 0x8F38 #define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 #define GL_IMAGE_BINDING_NAME 0x8F3A #define GL_IMAGE_BINDING_LEVEL 0x8F3B #define GL_IMAGE_BINDING_LAYERED 0x8F3C #define GL_IMAGE_BINDING_LAYER 0x8F3D #define GL_IMAGE_BINDING_ACCESS 0x8F3E #define GL_IMAGE_1D 0x904C #define GL_IMAGE_2D 0x904D #define GL_IMAGE_3D 0x904E #define GL_IMAGE_2D_RECT 0x904F #define GL_IMAGE_CUBE 0x9050 #define GL_IMAGE_BUFFER 0x9051 #define GL_IMAGE_1D_ARRAY 0x9052 #define GL_IMAGE_2D_ARRAY 0x9053 #define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 #define GL_IMAGE_2D_MULTISAMPLE 0x9055 #define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 #define GL_INT_IMAGE_1D 0x9057 #define GL_INT_IMAGE_2D 0x9058 #define GL_INT_IMAGE_3D 0x9059 #define GL_INT_IMAGE_2D_RECT 0x905A #define GL_INT_IMAGE_CUBE 0x905B #define GL_INT_IMAGE_BUFFER 0x905C #define GL_INT_IMAGE_1D_ARRAY 0x905D #define GL_INT_IMAGE_2D_ARRAY 0x905E #define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F #define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 #define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 #define GL_UNSIGNED_INT_IMAGE_1D 0x9062 #define GL_UNSIGNED_INT_IMAGE_2D 0x9063 #define GL_UNSIGNED_INT_IMAGE_3D 0x9064 #define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 #define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 #define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 #define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 #define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 #define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C #define GL_MAX_IMAGE_SAMPLES 0x906D #define GL_IMAGE_BINDING_FORMAT 0x906E #define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 #define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 #define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 #define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA #define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB #define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC #define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD #define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE #define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF #define GL_ALL_BARRIER_BITS 0xFFFFFFFF typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); #define glBindImageTexture GLEW_GET_FUN(__glewBindImageTexture) #define glMemoryBarrier GLEW_GET_FUN(__glewMemoryBarrier) #define GLEW_ARB_shader_image_load_store GLEW_GET_VAR(__GLEW_ARB_shader_image_load_store) #endif /* GL_ARB_shader_image_load_store */ /* ------------------------ GL_ARB_shader_image_size ----------------------- */ #ifndef GL_ARB_shader_image_size #define GL_ARB_shader_image_size 1 #define GLEW_ARB_shader_image_size GLEW_GET_VAR(__GLEW_ARB_shader_image_size) #endif /* GL_ARB_shader_image_size */ /* ------------------------- GL_ARB_shader_objects ------------------------- */ #ifndef GL_ARB_shader_objects #define GL_ARB_shader_objects 1 #define GL_PROGRAM_OBJECT_ARB 0x8B40 #define GL_SHADER_OBJECT_ARB 0x8B48 #define GL_OBJECT_TYPE_ARB 0x8B4E #define GL_OBJECT_SUBTYPE_ARB 0x8B4F #define GL_FLOAT_VEC2_ARB 0x8B50 #define GL_FLOAT_VEC3_ARB 0x8B51 #define GL_FLOAT_VEC4_ARB 0x8B52 #define GL_INT_VEC2_ARB 0x8B53 #define GL_INT_VEC3_ARB 0x8B54 #define GL_INT_VEC4_ARB 0x8B55 #define GL_BOOL_ARB 0x8B56 #define GL_BOOL_VEC2_ARB 0x8B57 #define GL_BOOL_VEC3_ARB 0x8B58 #define GL_BOOL_VEC4_ARB 0x8B59 #define GL_FLOAT_MAT2_ARB 0x8B5A #define GL_FLOAT_MAT3_ARB 0x8B5B #define GL_FLOAT_MAT4_ARB 0x8B5C #define GL_SAMPLER_1D_ARB 0x8B5D #define GL_SAMPLER_2D_ARB 0x8B5E #define GL_SAMPLER_3D_ARB 0x8B5F #define GL_SAMPLER_CUBE_ARB 0x8B60 #define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 #define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 #define GL_SAMPLER_2D_RECT_ARB 0x8B63 #define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 #define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 #define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 #define GL_OBJECT_LINK_STATUS_ARB 0x8B82 #define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 #define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 #define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 #define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 #define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 #define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 typedef char GLcharARB; typedef unsigned int GLhandleARB; typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void); typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj); typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname); typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog); typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source); typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params); typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length); typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); #define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB) #define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB) #define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB) #define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB) #define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB) #define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB) #define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB) #define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB) #define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB) #define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB) #define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB) #define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB) #define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB) #define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB) #define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB) #define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB) #define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB) #define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB) #define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB) #define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB) #define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB) #define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB) #define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB) #define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB) #define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB) #define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB) #define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB) #define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB) #define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB) #define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB) #define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB) #define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB) #define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB) #define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB) #define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB) #define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB) #define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB) #define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB) #define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB) #define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects) #endif /* GL_ARB_shader_objects */ /* ------------------------ GL_ARB_shader_precision ------------------------ */ #ifndef GL_ARB_shader_precision #define GL_ARB_shader_precision 1 #define GLEW_ARB_shader_precision GLEW_GET_VAR(__GLEW_ARB_shader_precision) #endif /* GL_ARB_shader_precision */ /* ---------------------- GL_ARB_shader_stencil_export --------------------- */ #ifndef GL_ARB_shader_stencil_export #define GL_ARB_shader_stencil_export 1 #define GLEW_ARB_shader_stencil_export GLEW_GET_VAR(__GLEW_ARB_shader_stencil_export) #endif /* GL_ARB_shader_stencil_export */ /* ------------------ GL_ARB_shader_storage_buffer_object ------------------ */ #ifndef GL_ARB_shader_storage_buffer_object #define GL_ARB_shader_storage_buffer_object 1 #define GL_SHADER_STORAGE_BARRIER_BIT 0x2000 #define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 #define GL_SHADER_STORAGE_BUFFER 0x90D2 #define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 #define GL_SHADER_STORAGE_BUFFER_START 0x90D4 #define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 #define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 #define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 #define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 #define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 #define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA #define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB #define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC #define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD #define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE #define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF typedef void (GLAPIENTRY * PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); #define glShaderStorageBlockBinding GLEW_GET_FUN(__glewShaderStorageBlockBinding) #define GLEW_ARB_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_ARB_shader_storage_buffer_object) #endif /* GL_ARB_shader_storage_buffer_object */ /* ------------------------ GL_ARB_shader_subroutine ----------------------- */ #ifndef GL_ARB_shader_subroutine #define GL_ARB_shader_subroutine 1 #define GL_ACTIVE_SUBROUTINES 0x8DE5 #define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 #define GL_MAX_SUBROUTINES 0x8DE7 #define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 #define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 #define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 #define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 #define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A #define GL_COMPATIBLE_SUBROUTINES 0x8E4B typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values); typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint* values); typedef GLuint (GLAPIENTRY * PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar* name); typedef GLint (GLAPIENTRY * PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint* params); typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint* indices); #define glGetActiveSubroutineName GLEW_GET_FUN(__glewGetActiveSubroutineName) #define glGetActiveSubroutineUniformName GLEW_GET_FUN(__glewGetActiveSubroutineUniformName) #define glGetActiveSubroutineUniformiv GLEW_GET_FUN(__glewGetActiveSubroutineUniformiv) #define glGetProgramStageiv GLEW_GET_FUN(__glewGetProgramStageiv) #define glGetSubroutineIndex GLEW_GET_FUN(__glewGetSubroutineIndex) #define glGetSubroutineUniformLocation GLEW_GET_FUN(__glewGetSubroutineUniformLocation) #define glGetUniformSubroutineuiv GLEW_GET_FUN(__glewGetUniformSubroutineuiv) #define glUniformSubroutinesuiv GLEW_GET_FUN(__glewUniformSubroutinesuiv) #define GLEW_ARB_shader_subroutine GLEW_GET_VAR(__GLEW_ARB_shader_subroutine) #endif /* GL_ARB_shader_subroutine */ /* ------------------ GL_ARB_shader_texture_image_samples ------------------ */ #ifndef GL_ARB_shader_texture_image_samples #define GL_ARB_shader_texture_image_samples 1 #define GLEW_ARB_shader_texture_image_samples GLEW_GET_VAR(__GLEW_ARB_shader_texture_image_samples) #endif /* GL_ARB_shader_texture_image_samples */ /* ----------------------- GL_ARB_shader_texture_lod ----------------------- */ #ifndef GL_ARB_shader_texture_lod #define GL_ARB_shader_texture_lod 1 #define GLEW_ARB_shader_texture_lod GLEW_GET_VAR(__GLEW_ARB_shader_texture_lod) #endif /* GL_ARB_shader_texture_lod */ /* ------------------- GL_ARB_shader_viewport_layer_array ------------------ */ #ifndef GL_ARB_shader_viewport_layer_array #define GL_ARB_shader_viewport_layer_array 1 #define GLEW_ARB_shader_viewport_layer_array GLEW_GET_VAR(__GLEW_ARB_shader_viewport_layer_array) #endif /* GL_ARB_shader_viewport_layer_array */ /* ---------------------- GL_ARB_shading_language_100 ---------------------- */ #ifndef GL_ARB_shading_language_100 #define GL_ARB_shading_language_100 1 #define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C #define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100) #endif /* GL_ARB_shading_language_100 */ /* -------------------- GL_ARB_shading_language_420pack -------------------- */ #ifndef GL_ARB_shading_language_420pack #define GL_ARB_shading_language_420pack 1 #define GLEW_ARB_shading_language_420pack GLEW_GET_VAR(__GLEW_ARB_shading_language_420pack) #endif /* GL_ARB_shading_language_420pack */ /* -------------------- GL_ARB_shading_language_include -------------------- */ #ifndef GL_ARB_shading_language_include #define GL_ARB_shading_language_include 1 #define GL_SHADER_INCLUDE_ARB 0x8DAE #define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 #define GL_NAMED_STRING_TYPE_ARB 0x8DEA typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* const *path, const GLint *length); typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name, GLsizei bufSize, GLint *stringlen, GLchar *string); typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar* name, GLenum pname, GLint *params); typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar *string); #define glCompileShaderIncludeARB GLEW_GET_FUN(__glewCompileShaderIncludeARB) #define glDeleteNamedStringARB GLEW_GET_FUN(__glewDeleteNamedStringARB) #define glGetNamedStringARB GLEW_GET_FUN(__glewGetNamedStringARB) #define glGetNamedStringivARB GLEW_GET_FUN(__glewGetNamedStringivARB) #define glIsNamedStringARB GLEW_GET_FUN(__glewIsNamedStringARB) #define glNamedStringARB GLEW_GET_FUN(__glewNamedStringARB) #define GLEW_ARB_shading_language_include GLEW_GET_VAR(__GLEW_ARB_shading_language_include) #endif /* GL_ARB_shading_language_include */ /* -------------------- GL_ARB_shading_language_packing -------------------- */ #ifndef GL_ARB_shading_language_packing #define GL_ARB_shading_language_packing 1 #define GLEW_ARB_shading_language_packing GLEW_GET_VAR(__GLEW_ARB_shading_language_packing) #endif /* GL_ARB_shading_language_packing */ /* ----------------------------- GL_ARB_shadow ----------------------------- */ #ifndef GL_ARB_shadow #define GL_ARB_shadow 1 #define GL_TEXTURE_COMPARE_MODE_ARB 0x884C #define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D #define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E #define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow) #endif /* GL_ARB_shadow */ /* ------------------------- GL_ARB_shadow_ambient ------------------------- */ #ifndef GL_ARB_shadow_ambient #define GL_ARB_shadow_ambient 1 #define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF #define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient) #endif /* GL_ARB_shadow_ambient */ /* -------------------------- GL_ARB_sparse_buffer ------------------------- */ #ifndef GL_ARB_sparse_buffer #define GL_ARB_sparse_buffer 1 #define GL_SPARSE_STORAGE_BIT_ARB 0x0400 #define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 typedef void (GLAPIENTRY * PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); #define glBufferPageCommitmentARB GLEW_GET_FUN(__glewBufferPageCommitmentARB) #define GLEW_ARB_sparse_buffer GLEW_GET_VAR(__GLEW_ARB_sparse_buffer) #endif /* GL_ARB_sparse_buffer */ /* ------------------------- GL_ARB_sparse_texture ------------------------- */ #ifndef GL_ARB_sparse_texture #define GL_ARB_sparse_texture 1 #define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 #define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 #define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 #define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 #define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 #define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A #define GL_TEXTURE_SPARSE_ARB 0x91A6 #define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 #define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 #define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 #define GL_NUM_SPARSE_LEVELS_ARB 0x91AA typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); #define glTexPageCommitmentARB GLEW_GET_FUN(__glewTexPageCommitmentARB) #define GLEW_ARB_sparse_texture GLEW_GET_VAR(__GLEW_ARB_sparse_texture) #endif /* GL_ARB_sparse_texture */ /* ------------------------- GL_ARB_sparse_texture2 ------------------------ */ #ifndef GL_ARB_sparse_texture2 #define GL_ARB_sparse_texture2 1 #define GLEW_ARB_sparse_texture2 GLEW_GET_VAR(__GLEW_ARB_sparse_texture2) #endif /* GL_ARB_sparse_texture2 */ /* ---------------------- GL_ARB_sparse_texture_clamp ---------------------- */ #ifndef GL_ARB_sparse_texture_clamp #define GL_ARB_sparse_texture_clamp 1 #define GLEW_ARB_sparse_texture_clamp GLEW_GET_VAR(__GLEW_ARB_sparse_texture_clamp) #endif /* GL_ARB_sparse_texture_clamp */ /* ------------------------ GL_ARB_spirv_extensions ------------------------ */ #ifndef GL_ARB_spirv_extensions #define GL_ARB_spirv_extensions 1 #define GL_SPIR_V_EXTENSIONS 0x9553 #define GL_NUM_SPIR_V_EXTENSIONS 0x9554 #define GLEW_ARB_spirv_extensions GLEW_GET_VAR(__GLEW_ARB_spirv_extensions) #endif /* GL_ARB_spirv_extensions */ /* ------------------------ GL_ARB_stencil_texturing ----------------------- */ #ifndef GL_ARB_stencil_texturing #define GL_ARB_stencil_texturing 1 #define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA #define GLEW_ARB_stencil_texturing GLEW_GET_VAR(__GLEW_ARB_stencil_texturing) #endif /* GL_ARB_stencil_texturing */ /* ------------------------------ GL_ARB_sync ------------------------------ */ #ifndef GL_ARB_sync #define GL_ARB_sync 1 #define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 #define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 #define GL_OBJECT_TYPE 0x9112 #define GL_SYNC_CONDITION 0x9113 #define GL_SYNC_STATUS 0x9114 #define GL_SYNC_FLAGS 0x9115 #define GL_SYNC_FENCE 0x9116 #define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 #define GL_UNSIGNALED 0x9118 #define GL_SIGNALED 0x9119 #define GL_ALREADY_SIGNALED 0x911A #define GL_TIMEOUT_EXPIRED 0x911B #define GL_CONDITION_SATISFIED 0x911C #define GL_WAIT_FAILED 0x911D #define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); typedef void (GLAPIENTRY * PFNGLDELETESYNCPROC) (GLsync GLsync); typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCPROC) (GLenum condition,GLbitfield flags); typedef void (GLAPIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETSYNCIVPROC) (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values); typedef GLboolean (GLAPIENTRY * PFNGLISSYNCPROC) (GLsync GLsync); typedef void (GLAPIENTRY * PFNGLWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); #define glClientWaitSync GLEW_GET_FUN(__glewClientWaitSync) #define glDeleteSync GLEW_GET_FUN(__glewDeleteSync) #define glFenceSync GLEW_GET_FUN(__glewFenceSync) #define glGetInteger64v GLEW_GET_FUN(__glewGetInteger64v) #define glGetSynciv GLEW_GET_FUN(__glewGetSynciv) #define glIsSync GLEW_GET_FUN(__glewIsSync) #define glWaitSync GLEW_GET_FUN(__glewWaitSync) #define GLEW_ARB_sync GLEW_GET_VAR(__GLEW_ARB_sync) #endif /* GL_ARB_sync */ /* ----------------------- GL_ARB_tessellation_shader ---------------------- */ #ifndef GL_ARB_tessellation_shader #define GL_ARB_tessellation_shader 1 #define GL_PATCHES 0xE #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 #define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C #define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D #define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E #define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F #define GL_PATCH_VERTICES 0x8E72 #define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 #define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 #define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 #define GL_TESS_GEN_MODE 0x8E76 #define GL_TESS_GEN_SPACING 0x8E77 #define GL_TESS_GEN_VERTEX_ORDER 0x8E78 #define GL_TESS_GEN_POINT_MODE 0x8E79 #define GL_ISOLINES 0x8E7A #define GL_FRACTIONAL_ODD 0x8E7B #define GL_FRACTIONAL_EVEN 0x8E7C #define GL_MAX_PATCH_VERTICES 0x8E7D #define GL_MAX_TESS_GEN_LEVEL 0x8E7E #define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F #define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 #define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 #define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 #define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 #define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 #define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 #define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 #define GL_TESS_EVALUATION_SHADER 0x8E87 #define GL_TESS_CONTROL_SHADER 0x8E88 #define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 #define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat* values); typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); #define glPatchParameterfv GLEW_GET_FUN(__glewPatchParameterfv) #define glPatchParameteri GLEW_GET_FUN(__glewPatchParameteri) #define GLEW_ARB_tessellation_shader GLEW_GET_VAR(__GLEW_ARB_tessellation_shader) #endif /* GL_ARB_tessellation_shader */ /* ------------------------- GL_ARB_texture_barrier ------------------------ */ #ifndef GL_ARB_texture_barrier #define GL_ARB_texture_barrier 1 typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERPROC) (void); #define glTextureBarrier GLEW_GET_FUN(__glewTextureBarrier) #define GLEW_ARB_texture_barrier GLEW_GET_VAR(__GLEW_ARB_texture_barrier) #endif /* GL_ARB_texture_barrier */ /* ---------------------- GL_ARB_texture_border_clamp ---------------------- */ #ifndef GL_ARB_texture_border_clamp #define GL_ARB_texture_border_clamp 1 #define GL_CLAMP_TO_BORDER_ARB 0x812D #define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp) #endif /* GL_ARB_texture_border_clamp */ /* ---------------------- GL_ARB_texture_buffer_object --------------------- */ #ifndef GL_ARB_texture_buffer_object #define GL_ARB_texture_buffer_object 1 #define GL_TEXTURE_BUFFER_ARB 0x8C2A #define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B #define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D #define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E typedef void (GLAPIENTRY * PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); #define glTexBufferARB GLEW_GET_FUN(__glewTexBufferARB) #define GLEW_ARB_texture_buffer_object GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object) #endif /* GL_ARB_texture_buffer_object */ /* ------------------- GL_ARB_texture_buffer_object_rgb32 ------------------ */ #ifndef GL_ARB_texture_buffer_object_rgb32 #define GL_ARB_texture_buffer_object_rgb32 1 #define GLEW_ARB_texture_buffer_object_rgb32 GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object_rgb32) #endif /* GL_ARB_texture_buffer_object_rgb32 */ /* ---------------------- GL_ARB_texture_buffer_range ---------------------- */ #ifndef GL_ARB_texture_buffer_range #define GL_ARB_texture_buffer_range 1 #define GL_TEXTURE_BUFFER_OFFSET 0x919D #define GL_TEXTURE_BUFFER_SIZE 0x919E #define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F typedef void (GLAPIENTRY * PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); #define glTexBufferRange GLEW_GET_FUN(__glewTexBufferRange) #define glTextureBufferRangeEXT GLEW_GET_FUN(__glewTextureBufferRangeEXT) #define GLEW_ARB_texture_buffer_range GLEW_GET_VAR(__GLEW_ARB_texture_buffer_range) #endif /* GL_ARB_texture_buffer_range */ /* ----------------------- GL_ARB_texture_compression ---------------------- */ #ifndef GL_ARB_texture_compression #define GL_ARB_texture_compression 1 #define GL_COMPRESSED_ALPHA_ARB 0x84E9 #define GL_COMPRESSED_LUMINANCE_ARB 0x84EA #define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB #define GL_COMPRESSED_INTENSITY_ARB 0x84EC #define GL_COMPRESSED_RGB_ARB 0x84ED #define GL_COMPRESSED_RGBA_ARB 0x84EE #define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 #define GL_TEXTURE_COMPRESSED_ARB 0x86A1 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void *img); #define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) #define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) #define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB) #define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB) #define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB) #define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB) #define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB) #define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression) #endif /* GL_ARB_texture_compression */ /* -------------------- GL_ARB_texture_compression_bptc -------------------- */ #ifndef GL_ARB_texture_compression_bptc #define GL_ARB_texture_compression_bptc 1 #define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F #define GLEW_ARB_texture_compression_bptc GLEW_GET_VAR(__GLEW_ARB_texture_compression_bptc) #endif /* GL_ARB_texture_compression_bptc */ /* -------------------- GL_ARB_texture_compression_rgtc -------------------- */ #ifndef GL_ARB_texture_compression_rgtc #define GL_ARB_texture_compression_rgtc 1 #define GL_COMPRESSED_RED_RGTC1 0x8DBB #define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC #define GL_COMPRESSED_RG_RGTC2 0x8DBD #define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE #define GLEW_ARB_texture_compression_rgtc GLEW_GET_VAR(__GLEW_ARB_texture_compression_rgtc) #endif /* GL_ARB_texture_compression_rgtc */ /* ------------------------ GL_ARB_texture_cube_map ------------------------ */ #ifndef GL_ARB_texture_cube_map #define GL_ARB_texture_cube_map 1 #define GL_NORMAL_MAP_ARB 0x8511 #define GL_REFLECTION_MAP_ARB 0x8512 #define GL_TEXTURE_CUBE_MAP_ARB 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C #define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map) #endif /* GL_ARB_texture_cube_map */ /* --------------------- GL_ARB_texture_cube_map_array --------------------- */ #ifndef GL_ARB_texture_cube_map_array #define GL_ARB_texture_cube_map_array 1 #define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A #define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B #define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D #define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F #define GLEW_ARB_texture_cube_map_array GLEW_GET_VAR(__GLEW_ARB_texture_cube_map_array) #endif /* GL_ARB_texture_cube_map_array */ /* ------------------------- GL_ARB_texture_env_add ------------------------ */ #ifndef GL_ARB_texture_env_add #define GL_ARB_texture_env_add 1 #define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add) #endif /* GL_ARB_texture_env_add */ /* ----------------------- GL_ARB_texture_env_combine ---------------------- */ #ifndef GL_ARB_texture_env_combine #define GL_ARB_texture_env_combine 1 #define GL_SUBTRACT_ARB 0x84E7 #define GL_COMBINE_ARB 0x8570 #define GL_COMBINE_RGB_ARB 0x8571 #define GL_COMBINE_ALPHA_ARB 0x8572 #define GL_RGB_SCALE_ARB 0x8573 #define GL_ADD_SIGNED_ARB 0x8574 #define GL_INTERPOLATE_ARB 0x8575 #define GL_CONSTANT_ARB 0x8576 #define GL_PRIMARY_COLOR_ARB 0x8577 #define GL_PREVIOUS_ARB 0x8578 #define GL_SOURCE0_RGB_ARB 0x8580 #define GL_SOURCE1_RGB_ARB 0x8581 #define GL_SOURCE2_RGB_ARB 0x8582 #define GL_SOURCE0_ALPHA_ARB 0x8588 #define GL_SOURCE1_ALPHA_ARB 0x8589 #define GL_SOURCE2_ALPHA_ARB 0x858A #define GL_OPERAND0_RGB_ARB 0x8590 #define GL_OPERAND1_RGB_ARB 0x8591 #define GL_OPERAND2_RGB_ARB 0x8592 #define GL_OPERAND0_ALPHA_ARB 0x8598 #define GL_OPERAND1_ALPHA_ARB 0x8599 #define GL_OPERAND2_ALPHA_ARB 0x859A #define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine) #endif /* GL_ARB_texture_env_combine */ /* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */ #ifndef GL_ARB_texture_env_crossbar #define GL_ARB_texture_env_crossbar 1 #define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar) #endif /* GL_ARB_texture_env_crossbar */ /* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */ #ifndef GL_ARB_texture_env_dot3 #define GL_ARB_texture_env_dot3 1 #define GL_DOT3_RGB_ARB 0x86AE #define GL_DOT3_RGBA_ARB 0x86AF #define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3) #endif /* GL_ARB_texture_env_dot3 */ /* ------------------- GL_ARB_texture_filter_anisotropic ------------------- */ #ifndef GL_ARB_texture_filter_anisotropic #define GL_ARB_texture_filter_anisotropic 1 #define GL_TEXTURE_MAX_ANISOTROPY 0x84FE #define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF #define GLEW_ARB_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_ARB_texture_filter_anisotropic) #endif /* GL_ARB_texture_filter_anisotropic */ /* ---------------------- GL_ARB_texture_filter_minmax --------------------- */ #ifndef GL_ARB_texture_filter_minmax #define GL_ARB_texture_filter_minmax 1 #define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366 #define GL_WEIGHTED_AVERAGE_ARB 0x9367 #define GLEW_ARB_texture_filter_minmax GLEW_GET_VAR(__GLEW_ARB_texture_filter_minmax) #endif /* GL_ARB_texture_filter_minmax */ /* -------------------------- GL_ARB_texture_float ------------------------- */ #ifndef GL_ARB_texture_float #define GL_ARB_texture_float 1 #define GL_RGBA32F_ARB 0x8814 #define GL_RGB32F_ARB 0x8815 #define GL_ALPHA32F_ARB 0x8816 #define GL_INTENSITY32F_ARB 0x8817 #define GL_LUMINANCE32F_ARB 0x8818 #define GL_LUMINANCE_ALPHA32F_ARB 0x8819 #define GL_RGBA16F_ARB 0x881A #define GL_RGB16F_ARB 0x881B #define GL_ALPHA16F_ARB 0x881C #define GL_INTENSITY16F_ARB 0x881D #define GL_LUMINANCE16F_ARB 0x881E #define GL_LUMINANCE_ALPHA16F_ARB 0x881F #define GL_TEXTURE_RED_TYPE_ARB 0x8C10 #define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 #define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 #define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 #define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 #define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 #define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 #define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 #define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float) #endif /* GL_ARB_texture_float */ /* ------------------------- GL_ARB_texture_gather ------------------------- */ #ifndef GL_ARB_texture_gather #define GL_ARB_texture_gather 1 #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F #define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F #define GLEW_ARB_texture_gather GLEW_GET_VAR(__GLEW_ARB_texture_gather) #endif /* GL_ARB_texture_gather */ /* ------------------ GL_ARB_texture_mirror_clamp_to_edge ------------------ */ #ifndef GL_ARB_texture_mirror_clamp_to_edge #define GL_ARB_texture_mirror_clamp_to_edge 1 #define GL_MIRROR_CLAMP_TO_EDGE 0x8743 #define GLEW_ARB_texture_mirror_clamp_to_edge GLEW_GET_VAR(__GLEW_ARB_texture_mirror_clamp_to_edge) #endif /* GL_ARB_texture_mirror_clamp_to_edge */ /* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ #ifndef GL_ARB_texture_mirrored_repeat #define GL_ARB_texture_mirrored_repeat 1 #define GL_MIRRORED_REPEAT_ARB 0x8370 #define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat) #endif /* GL_ARB_texture_mirrored_repeat */ /* ----------------------- GL_ARB_texture_multisample ---------------------- */ #ifndef GL_ARB_texture_multisample #define GL_ARB_texture_multisample 1 #define GL_SAMPLE_POSITION 0x8E50 #define GL_SAMPLE_MASK 0x8E51 #define GL_SAMPLE_MASK_VALUE 0x8E52 #define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 #define GL_TEXTURE_2D_MULTISAMPLE 0x9100 #define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 #define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 #define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 #define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 #define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 #define GL_TEXTURE_SAMPLES 0x9106 #define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 #define GL_SAMPLER_2D_MULTISAMPLE 0x9108 #define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A #define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B #define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D #define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E #define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F #define GL_MAX_INTEGER_SAMPLES 0x9110 typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val); typedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); #define glGetMultisamplefv GLEW_GET_FUN(__glewGetMultisamplefv) #define glSampleMaski GLEW_GET_FUN(__glewSampleMaski) #define glTexImage2DMultisample GLEW_GET_FUN(__glewTexImage2DMultisample) #define glTexImage3DMultisample GLEW_GET_FUN(__glewTexImage3DMultisample) #define GLEW_ARB_texture_multisample GLEW_GET_VAR(__GLEW_ARB_texture_multisample) #endif /* GL_ARB_texture_multisample */ /* -------------------- GL_ARB_texture_non_power_of_two -------------------- */ #ifndef GL_ARB_texture_non_power_of_two #define GL_ARB_texture_non_power_of_two 1 #define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two) #endif /* GL_ARB_texture_non_power_of_two */ /* ---------------------- GL_ARB_texture_query_levels ---------------------- */ #ifndef GL_ARB_texture_query_levels #define GL_ARB_texture_query_levels 1 #define GLEW_ARB_texture_query_levels GLEW_GET_VAR(__GLEW_ARB_texture_query_levels) #endif /* GL_ARB_texture_query_levels */ /* ------------------------ GL_ARB_texture_query_lod ----------------------- */ #ifndef GL_ARB_texture_query_lod #define GL_ARB_texture_query_lod 1 #define GLEW_ARB_texture_query_lod GLEW_GET_VAR(__GLEW_ARB_texture_query_lod) #endif /* GL_ARB_texture_query_lod */ /* ------------------------ GL_ARB_texture_rectangle ----------------------- */ #ifndef GL_ARB_texture_rectangle #define GL_ARB_texture_rectangle 1 #define GL_TEXTURE_RECTANGLE_ARB 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 #define GL_SAMPLER_2D_RECT_ARB 0x8B63 #define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 #define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle) #endif /* GL_ARB_texture_rectangle */ /* --------------------------- GL_ARB_texture_rg --------------------------- */ #ifndef GL_ARB_texture_rg #define GL_ARB_texture_rg 1 #define GL_COMPRESSED_RED 0x8225 #define GL_COMPRESSED_RG 0x8226 #define GL_RG 0x8227 #define GL_RG_INTEGER 0x8228 #define GL_R8 0x8229 #define GL_R16 0x822A #define GL_RG8 0x822B #define GL_RG16 0x822C #define GL_R16F 0x822D #define GL_R32F 0x822E #define GL_RG16F 0x822F #define GL_RG32F 0x8230 #define GL_R8I 0x8231 #define GL_R8UI 0x8232 #define GL_R16I 0x8233 #define GL_R16UI 0x8234 #define GL_R32I 0x8235 #define GL_R32UI 0x8236 #define GL_RG8I 0x8237 #define GL_RG8UI 0x8238 #define GL_RG16I 0x8239 #define GL_RG16UI 0x823A #define GL_RG32I 0x823B #define GL_RG32UI 0x823C #define GLEW_ARB_texture_rg GLEW_GET_VAR(__GLEW_ARB_texture_rg) #endif /* GL_ARB_texture_rg */ /* ----------------------- GL_ARB_texture_rgb10_a2ui ----------------------- */ #ifndef GL_ARB_texture_rgb10_a2ui #define GL_ARB_texture_rgb10_a2ui 1 #define GL_RGB10_A2UI 0x906F #define GLEW_ARB_texture_rgb10_a2ui GLEW_GET_VAR(__GLEW_ARB_texture_rgb10_a2ui) #endif /* GL_ARB_texture_rgb10_a2ui */ /* ------------------------ GL_ARB_texture_stencil8 ------------------------ */ #ifndef GL_ARB_texture_stencil8 #define GL_ARB_texture_stencil8 1 #define GL_STENCIL_INDEX 0x1901 #define GL_STENCIL_INDEX8 0x8D48 #define GLEW_ARB_texture_stencil8 GLEW_GET_VAR(__GLEW_ARB_texture_stencil8) #endif /* GL_ARB_texture_stencil8 */ /* ------------------------- GL_ARB_texture_storage ------------------------ */ #ifndef GL_ARB_texture_storage #define GL_ARB_texture_storage 1 #define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); #define glTexStorage1D GLEW_GET_FUN(__glewTexStorage1D) #define glTexStorage2D GLEW_GET_FUN(__glewTexStorage2D) #define glTexStorage3D GLEW_GET_FUN(__glewTexStorage3D) #define GLEW_ARB_texture_storage GLEW_GET_VAR(__GLEW_ARB_texture_storage) #endif /* GL_ARB_texture_storage */ /* ------------------- GL_ARB_texture_storage_multisample ------------------ */ #ifndef GL_ARB_texture_storage_multisample #define GL_ARB_texture_storage_multisample 1 typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); #define glTexStorage2DMultisample GLEW_GET_FUN(__glewTexStorage2DMultisample) #define glTexStorage3DMultisample GLEW_GET_FUN(__glewTexStorage3DMultisample) #define glTextureStorage2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage2DMultisampleEXT) #define glTextureStorage3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage3DMultisampleEXT) #define GLEW_ARB_texture_storage_multisample GLEW_GET_VAR(__GLEW_ARB_texture_storage_multisample) #endif /* GL_ARB_texture_storage_multisample */ /* ------------------------- GL_ARB_texture_swizzle ------------------------ */ #ifndef GL_ARB_texture_swizzle #define GL_ARB_texture_swizzle 1 #define GL_TEXTURE_SWIZZLE_R 0x8E42 #define GL_TEXTURE_SWIZZLE_G 0x8E43 #define GL_TEXTURE_SWIZZLE_B 0x8E44 #define GL_TEXTURE_SWIZZLE_A 0x8E45 #define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 #define GLEW_ARB_texture_swizzle GLEW_GET_VAR(__GLEW_ARB_texture_swizzle) #endif /* GL_ARB_texture_swizzle */ /* -------------------------- GL_ARB_texture_view -------------------------- */ #ifndef GL_ARB_texture_view #define GL_ARB_texture_view 1 #define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB #define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC #define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD #define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE #define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); #define glTextureView GLEW_GET_FUN(__glewTextureView) #define GLEW_ARB_texture_view GLEW_GET_VAR(__GLEW_ARB_texture_view) #endif /* GL_ARB_texture_view */ /* --------------------------- GL_ARB_timer_query -------------------------- */ #ifndef GL_ARB_timer_query #define GL_ARB_timer_query 1 #define GL_TIME_ELAPSED 0x88BF #define GL_TIMESTAMP 0x8E28 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params); typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); #define glGetQueryObjecti64v GLEW_GET_FUN(__glewGetQueryObjecti64v) #define glGetQueryObjectui64v GLEW_GET_FUN(__glewGetQueryObjectui64v) #define glQueryCounter GLEW_GET_FUN(__glewQueryCounter) #define GLEW_ARB_timer_query GLEW_GET_VAR(__GLEW_ARB_timer_query) #endif /* GL_ARB_timer_query */ /* ----------------------- GL_ARB_transform_feedback2 ---------------------- */ #ifndef GL_ARB_transform_feedback2 #define GL_ARB_transform_feedback2 1 #define GL_TRANSFORM_FEEDBACK 0x8E22 #define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 #define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 #define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); #define glBindTransformFeedback GLEW_GET_FUN(__glewBindTransformFeedback) #define glDeleteTransformFeedbacks GLEW_GET_FUN(__glewDeleteTransformFeedbacks) #define glDrawTransformFeedback GLEW_GET_FUN(__glewDrawTransformFeedback) #define glGenTransformFeedbacks GLEW_GET_FUN(__glewGenTransformFeedbacks) #define glIsTransformFeedback GLEW_GET_FUN(__glewIsTransformFeedback) #define glPauseTransformFeedback GLEW_GET_FUN(__glewPauseTransformFeedback) #define glResumeTransformFeedback GLEW_GET_FUN(__glewResumeTransformFeedback) #define GLEW_ARB_transform_feedback2 GLEW_GET_VAR(__GLEW_ARB_transform_feedback2) #endif /* GL_ARB_transform_feedback2 */ /* ----------------------- GL_ARB_transform_feedback3 ---------------------- */ #ifndef GL_ARB_transform_feedback3 #define GL_ARB_transform_feedback3 1 #define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 #define GL_MAX_VERTEX_STREAMS 0x8E71 typedef void (GLAPIENTRY * PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); typedef void (GLAPIENTRY * PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); typedef void (GLAPIENTRY * PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); #define glBeginQueryIndexed GLEW_GET_FUN(__glewBeginQueryIndexed) #define glDrawTransformFeedbackStream GLEW_GET_FUN(__glewDrawTransformFeedbackStream) #define glEndQueryIndexed GLEW_GET_FUN(__glewEndQueryIndexed) #define glGetQueryIndexediv GLEW_GET_FUN(__glewGetQueryIndexediv) #define GLEW_ARB_transform_feedback3 GLEW_GET_VAR(__GLEW_ARB_transform_feedback3) #endif /* GL_ARB_transform_feedback3 */ /* ------------------ GL_ARB_transform_feedback_instanced ------------------ */ #ifndef GL_ARB_transform_feedback_instanced #define GL_ARB_transform_feedback_instanced 1 typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei primcount); #define glDrawTransformFeedbackInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackInstanced) #define glDrawTransformFeedbackStreamInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackStreamInstanced) #define GLEW_ARB_transform_feedback_instanced GLEW_GET_VAR(__GLEW_ARB_transform_feedback_instanced) #endif /* GL_ARB_transform_feedback_instanced */ /* ---------------- GL_ARB_transform_feedback_overflow_query --------------- */ #ifndef GL_ARB_transform_feedback_overflow_query #define GL_ARB_transform_feedback_overflow_query 1 #define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC #define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED #define GLEW_ARB_transform_feedback_overflow_query GLEW_GET_VAR(__GLEW_ARB_transform_feedback_overflow_query) #endif /* GL_ARB_transform_feedback_overflow_query */ /* ------------------------ GL_ARB_transpose_matrix ------------------------ */ #ifndef GL_ARB_transpose_matrix #define GL_ARB_transpose_matrix 1 #define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 #define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 #define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 #define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); #define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB) #define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB) #define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB) #define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB) #define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix) #endif /* GL_ARB_transpose_matrix */ /* ---------------------- GL_ARB_uniform_buffer_object --------------------- */ #ifndef GL_ARB_uniform_buffer_object #define GL_ARB_uniform_buffer_object 1 #define GL_UNIFORM_BUFFER 0x8A11 #define GL_UNIFORM_BUFFER_BINDING 0x8A28 #define GL_UNIFORM_BUFFER_START 0x8A29 #define GL_UNIFORM_BUFFER_SIZE 0x8A2A #define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B #define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C #define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D #define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E #define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F #define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 #define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 #define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 #define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 #define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 #define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 #define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 #define GL_UNIFORM_TYPE 0x8A37 #define GL_UNIFORM_SIZE 0x8A38 #define GL_UNIFORM_NAME_LENGTH 0x8A39 #define GL_UNIFORM_BLOCK_INDEX 0x8A3A #define GL_UNIFORM_OFFSET 0x8A3B #define GL_UNIFORM_ARRAY_STRIDE 0x8A3C #define GL_UNIFORM_MATRIX_STRIDE 0x8A3D #define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E #define GL_UNIFORM_BLOCK_BINDING 0x8A3F #define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 #define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 #define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 #define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 #define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 #define GL_INVALID_INDEX 0xFFFFFFFFu typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data); typedef GLuint (GLAPIENTRY * PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar* uniformBlockName); typedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* const * uniformNames, GLuint* uniformIndices); typedef void (GLAPIENTRY * PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); #define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase) #define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange) #define glGetActiveUniformBlockName GLEW_GET_FUN(__glewGetActiveUniformBlockName) #define glGetActiveUniformBlockiv GLEW_GET_FUN(__glewGetActiveUniformBlockiv) #define glGetActiveUniformName GLEW_GET_FUN(__glewGetActiveUniformName) #define glGetActiveUniformsiv GLEW_GET_FUN(__glewGetActiveUniformsiv) #define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v) #define glGetUniformBlockIndex GLEW_GET_FUN(__glewGetUniformBlockIndex) #define glGetUniformIndices GLEW_GET_FUN(__glewGetUniformIndices) #define glUniformBlockBinding GLEW_GET_FUN(__glewUniformBlockBinding) #define GLEW_ARB_uniform_buffer_object GLEW_GET_VAR(__GLEW_ARB_uniform_buffer_object) #endif /* GL_ARB_uniform_buffer_object */ /* ------------------------ GL_ARB_vertex_array_bgra ----------------------- */ #ifndef GL_ARB_vertex_array_bgra #define GL_ARB_vertex_array_bgra 1 #define GL_BGRA 0x80E1 #define GLEW_ARB_vertex_array_bgra GLEW_GET_VAR(__GLEW_ARB_vertex_array_bgra) #endif /* GL_ARB_vertex_array_bgra */ /* ----------------------- GL_ARB_vertex_array_object ---------------------- */ #ifndef GL_ARB_vertex_array_object #define GL_ARB_vertex_array_object 1 #define GL_VERTEX_ARRAY_BINDING 0x85B5 typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array); typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays); typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array); #define glBindVertexArray GLEW_GET_FUN(__glewBindVertexArray) #define glDeleteVertexArrays GLEW_GET_FUN(__glewDeleteVertexArrays) #define glGenVertexArrays GLEW_GET_FUN(__glewGenVertexArrays) #define glIsVertexArray GLEW_GET_FUN(__glewIsVertexArray) #define GLEW_ARB_vertex_array_object GLEW_GET_VAR(__GLEW_ARB_vertex_array_object) #endif /* GL_ARB_vertex_array_object */ /* ----------------------- GL_ARB_vertex_attrib_64bit ---------------------- */ #ifndef GL_ARB_vertex_attrib_64bit #define GL_ARB_vertex_attrib_64bit 1 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); #define glGetVertexAttribLdv GLEW_GET_FUN(__glewGetVertexAttribLdv) #define glVertexAttribL1d GLEW_GET_FUN(__glewVertexAttribL1d) #define glVertexAttribL1dv GLEW_GET_FUN(__glewVertexAttribL1dv) #define glVertexAttribL2d GLEW_GET_FUN(__glewVertexAttribL2d) #define glVertexAttribL2dv GLEW_GET_FUN(__glewVertexAttribL2dv) #define glVertexAttribL3d GLEW_GET_FUN(__glewVertexAttribL3d) #define glVertexAttribL3dv GLEW_GET_FUN(__glewVertexAttribL3dv) #define glVertexAttribL4d GLEW_GET_FUN(__glewVertexAttribL4d) #define glVertexAttribL4dv GLEW_GET_FUN(__glewVertexAttribL4dv) #define glVertexAttribLPointer GLEW_GET_FUN(__glewVertexAttribLPointer) #define GLEW_ARB_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_64bit) #endif /* GL_ARB_vertex_attrib_64bit */ /* ---------------------- GL_ARB_vertex_attrib_binding --------------------- */ #ifndef GL_ARB_vertex_attrib_binding #define GL_ARB_vertex_attrib_binding 1 #define GL_VERTEX_ATTRIB_BINDING 0x82D4 #define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 #define GL_VERTEX_BINDING_DIVISOR 0x82D6 #define GL_VERTEX_BINDING_OFFSET 0x82D7 #define GL_VERTEX_BINDING_STRIDE 0x82D8 #define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 #define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA #define GL_VERTEX_BINDING_BUFFER 0x8F4F typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); #define glBindVertexBuffer GLEW_GET_FUN(__glewBindVertexBuffer) #define glVertexArrayBindVertexBufferEXT GLEW_GET_FUN(__glewVertexArrayBindVertexBufferEXT) #define glVertexArrayVertexAttribBindingEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribBindingEXT) #define glVertexArrayVertexAttribFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribFormatEXT) #define glVertexArrayVertexAttribIFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIFormatEXT) #define glVertexArrayVertexAttribLFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLFormatEXT) #define glVertexArrayVertexBindingDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexBindingDivisorEXT) #define glVertexAttribBinding GLEW_GET_FUN(__glewVertexAttribBinding) #define glVertexAttribFormat GLEW_GET_FUN(__glewVertexAttribFormat) #define glVertexAttribIFormat GLEW_GET_FUN(__glewVertexAttribIFormat) #define glVertexAttribLFormat GLEW_GET_FUN(__glewVertexAttribLFormat) #define glVertexBindingDivisor GLEW_GET_FUN(__glewVertexBindingDivisor) #define GLEW_ARB_vertex_attrib_binding GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_binding) #endif /* GL_ARB_vertex_attrib_binding */ /* -------------------------- GL_ARB_vertex_blend -------------------------- */ #ifndef GL_ARB_vertex_blend #define GL_ARB_vertex_blend 1 #define GL_MODELVIEW0_ARB 0x1700 #define GL_MODELVIEW1_ARB 0x850A #define GL_MAX_VERTEX_UNITS_ARB 0x86A4 #define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 #define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 #define GL_VERTEX_BLEND_ARB 0x86A7 #define GL_CURRENT_WEIGHT_ARB 0x86A8 #define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 #define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA #define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB #define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC #define GL_WEIGHT_ARRAY_ARB 0x86AD #define GL_MODELVIEW2_ARB 0x8722 #define GL_MODELVIEW3_ARB 0x8723 #define GL_MODELVIEW4_ARB 0x8724 #define GL_MODELVIEW5_ARB 0x8725 #define GL_MODELVIEW6_ARB 0x8726 #define GL_MODELVIEW7_ARB 0x8727 #define GL_MODELVIEW8_ARB 0x8728 #define GL_MODELVIEW9_ARB 0x8729 #define GL_MODELVIEW10_ARB 0x872A #define GL_MODELVIEW11_ARB 0x872B #define GL_MODELVIEW12_ARB 0x872C #define GL_MODELVIEW13_ARB 0x872D #define GL_MODELVIEW14_ARB 0x872E #define GL_MODELVIEW15_ARB 0x872F #define GL_MODELVIEW16_ARB 0x8730 #define GL_MODELVIEW17_ARB 0x8731 #define GL_MODELVIEW18_ARB 0x8732 #define GL_MODELVIEW19_ARB 0x8733 #define GL_MODELVIEW20_ARB 0x8734 #define GL_MODELVIEW21_ARB 0x8735 #define GL_MODELVIEW22_ARB 0x8736 #define GL_MODELVIEW23_ARB 0x8737 #define GL_MODELVIEW24_ARB 0x8738 #define GL_MODELVIEW25_ARB 0x8739 #define GL_MODELVIEW26_ARB 0x873A #define GL_MODELVIEW27_ARB 0x873B #define GL_MODELVIEW28_ARB 0x873C #define GL_MODELVIEW29_ARB 0x873D #define GL_MODELVIEW30_ARB 0x873E #define GL_MODELVIEW31_ARB 0x873F typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count); typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights); #define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB) #define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB) #define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB) #define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB) #define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB) #define glWeightivARB GLEW_GET_FUN(__glewWeightivARB) #define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB) #define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB) #define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB) #define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB) #define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend) #endif /* GL_ARB_vertex_blend */ /* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */ #ifndef GL_ARB_vertex_buffer_object #define GL_ARB_vertex_buffer_object 1 #define GL_BUFFER_SIZE_ARB 0x8764 #define GL_BUFFER_USAGE_ARB 0x8765 #define GL_ARRAY_BUFFER_ARB 0x8892 #define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 #define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 #define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 #define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 #define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 #define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 #define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D #define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F #define GL_READ_ONLY_ARB 0x88B8 #define GL_WRITE_ONLY_ARB 0x88B9 #define GL_READ_WRITE_ARB 0x88BA #define GL_BUFFER_ACCESS_ARB 0x88BB #define GL_BUFFER_MAPPED_ARB 0x88BC #define GL_BUFFER_MAP_POINTER_ARB 0x88BD #define GL_STREAM_DRAW_ARB 0x88E0 #define GL_STREAM_READ_ARB 0x88E1 #define GL_STREAM_COPY_ARB 0x88E2 #define GL_STATIC_DRAW_ARB 0x88E4 #define GL_STATIC_READ_ARB 0x88E5 #define GL_STATIC_COPY_ARB 0x88E6 #define GL_DYNAMIC_DRAW_ARB 0x88E8 #define GL_DYNAMIC_READ_ARB 0x88E9 #define GL_DYNAMIC_COPY_ARB 0x88EA typedef ptrdiff_t GLintptrARB; typedef ptrdiff_t GLsizeiptrARB; typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void** params); typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); typedef void * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); #define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB) #define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB) #define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB) #define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB) #define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB) #define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB) #define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB) #define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB) #define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB) #define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB) #define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB) #define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object) #endif /* GL_ARB_vertex_buffer_object */ /* ------------------------- GL_ARB_vertex_program ------------------------- */ #ifndef GL_ARB_vertex_program #define GL_ARB_vertex_program 1 #define GL_COLOR_SUM_ARB 0x8458 #define GL_VERTEX_PROGRAM_ARB 0x8620 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 #define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 #define GL_PROGRAM_LENGTH_ARB 0x8627 #define GL_PROGRAM_STRING_ARB 0x8628 #define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E #define GL_MAX_PROGRAM_MATRICES_ARB 0x862F #define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 #define GL_CURRENT_MATRIX_ARB 0x8641 #define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 #define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 #define GL_PROGRAM_ERROR_POSITION_ARB 0x864B #define GL_PROGRAM_BINDING_ARB 0x8677 #define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A #define GL_PROGRAM_ERROR_STRING_ARB 0x8874 #define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 #define GL_PROGRAM_FORMAT_ARB 0x8876 #define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 #define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 #define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 #define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 #define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 #define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 #define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 #define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 #define GL_PROGRAM_PARAMETERS_ARB 0x88A8 #define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 #define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA #define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB #define GL_PROGRAM_ATTRIBS_ARB 0x88AC #define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD #define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE #define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF #define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 #define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 #define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 #define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 #define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 #define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 #define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 #define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 #define GL_MATRIX0_ARB 0x88C0 #define GL_MATRIX1_ARB 0x88C1 #define GL_MATRIX2_ARB 0x88C2 #define GL_MATRIX3_ARB 0x88C3 #define GL_MATRIX4_ARB 0x88C4 #define GL_MATRIX5_ARB 0x88C5 #define GL_MATRIX6_ARB 0x88C6 #define GL_MATRIX7_ARB 0x88C7 #define GL_MATRIX8_ARB 0x88C8 #define GL_MATRIX9_ARB 0x88C9 #define GL_MATRIX10_ARB 0x88CA #define GL_MATRIX11_ARB 0x88CB #define GL_MATRIX12_ARB 0x88CC #define GL_MATRIX13_ARB 0x88CD #define GL_MATRIX14_ARB 0x88CE #define GL_MATRIX15_ARB 0x88CF #define GL_MATRIX16_ARB 0x88D0 #define GL_MATRIX17_ARB 0x88D1 #define GL_MATRIX18_ARB 0x88D2 #define GL_MATRIX19_ARB 0x88D3 #define GL_MATRIX20_ARB 0x88D4 #define GL_MATRIX21_ARB 0x88D5 #define GL_MATRIX22_ARB 0x88D6 #define GL_MATRIX23_ARB 0x88D7 #define GL_MATRIX24_ARB 0x88D8 #define GL_MATRIX25_ARB 0x88D9 #define GL_MATRIX26_ARB 0x88DA #define GL_MATRIX27_ARB 0x88DB #define GL_MATRIX28_ARB 0x88DC #define GL_MATRIX29_ARB 0x88DD #define GL_MATRIX30_ARB 0x88DE #define GL_MATRIX31_ARB 0x88DF typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs); typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs); typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void** pointer); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); #define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) #define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) #define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB) #define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB) #define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB) #define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB) #define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB) #define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB) #define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB) #define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB) #define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB) #define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB) #define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB) #define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB) #define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB) #define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB) #define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB) #define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB) #define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB) #define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB) #define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB) #define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB) #define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB) #define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB) #define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB) #define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB) #define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB) #define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB) #define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB) #define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB) #define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB) #define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB) #define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB) #define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB) #define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB) #define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB) #define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB) #define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB) #define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB) #define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB) #define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB) #define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB) #define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB) #define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB) #define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB) #define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB) #define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB) #define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB) #define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB) #define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB) #define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB) #define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB) #define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB) #define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB) #define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB) #define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB) #define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB) #define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB) #define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB) #define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB) #define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB) #define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB) #define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program) #endif /* GL_ARB_vertex_program */ /* -------------------------- GL_ARB_vertex_shader ------------------------- */ #ifndef GL_ARB_vertex_shader #define GL_ARB_vertex_shader 1 #define GL_VERTEX_SHADER_ARB 0x8B31 #define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A #define GL_MAX_VARYING_FLOATS_ARB 0x8B4B #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D #define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 #define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name); typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); #define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB) #define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB) #define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB) #define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader) #endif /* GL_ARB_vertex_shader */ /* ------------------- GL_ARB_vertex_type_10f_11f_11f_rev ------------------ */ #ifndef GL_ARB_vertex_type_10f_11f_11f_rev #define GL_ARB_vertex_type_10f_11f_11f_rev 1 #define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B #define GLEW_ARB_vertex_type_10f_11f_11f_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_10f_11f_11f_rev) #endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ /* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */ #ifndef GL_ARB_vertex_type_2_10_10_10_rev #define GL_ARB_vertex_type_2_10_10_10_rev 1 #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #define GL_INT_2_10_10_10_REV 0x8D9F typedef void (GLAPIENTRY * PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); typedef void (GLAPIENTRY * PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint* color); typedef void (GLAPIENTRY * PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); typedef void (GLAPIENTRY * PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint* color); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint* color); typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint* value); #define glColorP3ui GLEW_GET_FUN(__glewColorP3ui) #define glColorP3uiv GLEW_GET_FUN(__glewColorP3uiv) #define glColorP4ui GLEW_GET_FUN(__glewColorP4ui) #define glColorP4uiv GLEW_GET_FUN(__glewColorP4uiv) #define glMultiTexCoordP1ui GLEW_GET_FUN(__glewMultiTexCoordP1ui) #define glMultiTexCoordP1uiv GLEW_GET_FUN(__glewMultiTexCoordP1uiv) #define glMultiTexCoordP2ui GLEW_GET_FUN(__glewMultiTexCoordP2ui) #define glMultiTexCoordP2uiv GLEW_GET_FUN(__glewMultiTexCoordP2uiv) #define glMultiTexCoordP3ui GLEW_GET_FUN(__glewMultiTexCoordP3ui) #define glMultiTexCoordP3uiv GLEW_GET_FUN(__glewMultiTexCoordP3uiv) #define glMultiTexCoordP4ui GLEW_GET_FUN(__glewMultiTexCoordP4ui) #define glMultiTexCoordP4uiv GLEW_GET_FUN(__glewMultiTexCoordP4uiv) #define glNormalP3ui GLEW_GET_FUN(__glewNormalP3ui) #define glNormalP3uiv GLEW_GET_FUN(__glewNormalP3uiv) #define glSecondaryColorP3ui GLEW_GET_FUN(__glewSecondaryColorP3ui) #define glSecondaryColorP3uiv GLEW_GET_FUN(__glewSecondaryColorP3uiv) #define glTexCoordP1ui GLEW_GET_FUN(__glewTexCoordP1ui) #define glTexCoordP1uiv GLEW_GET_FUN(__glewTexCoordP1uiv) #define glTexCoordP2ui GLEW_GET_FUN(__glewTexCoordP2ui) #define glTexCoordP2uiv GLEW_GET_FUN(__glewTexCoordP2uiv) #define glTexCoordP3ui GLEW_GET_FUN(__glewTexCoordP3ui) #define glTexCoordP3uiv GLEW_GET_FUN(__glewTexCoordP3uiv) #define glTexCoordP4ui GLEW_GET_FUN(__glewTexCoordP4ui) #define glTexCoordP4uiv GLEW_GET_FUN(__glewTexCoordP4uiv) #define glVertexAttribP1ui GLEW_GET_FUN(__glewVertexAttribP1ui) #define glVertexAttribP1uiv GLEW_GET_FUN(__glewVertexAttribP1uiv) #define glVertexAttribP2ui GLEW_GET_FUN(__glewVertexAttribP2ui) #define glVertexAttribP2uiv GLEW_GET_FUN(__glewVertexAttribP2uiv) #define glVertexAttribP3ui GLEW_GET_FUN(__glewVertexAttribP3ui) #define glVertexAttribP3uiv GLEW_GET_FUN(__glewVertexAttribP3uiv) #define glVertexAttribP4ui GLEW_GET_FUN(__glewVertexAttribP4ui) #define glVertexAttribP4uiv GLEW_GET_FUN(__glewVertexAttribP4uiv) #define glVertexP2ui GLEW_GET_FUN(__glewVertexP2ui) #define glVertexP2uiv GLEW_GET_FUN(__glewVertexP2uiv) #define glVertexP3ui GLEW_GET_FUN(__glewVertexP3ui) #define glVertexP3uiv GLEW_GET_FUN(__glewVertexP3uiv) #define glVertexP4ui GLEW_GET_FUN(__glewVertexP4ui) #define glVertexP4uiv GLEW_GET_FUN(__glewVertexP4uiv) #define GLEW_ARB_vertex_type_2_10_10_10_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_2_10_10_10_rev) #endif /* GL_ARB_vertex_type_2_10_10_10_rev */ /* ------------------------- GL_ARB_viewport_array ------------------------- */ #ifndef GL_ARB_viewport_array #define GL_ARB_viewport_array 1 #define GL_DEPTH_RANGE 0x0B70 #define GL_VIEWPORT 0x0BA2 #define GL_SCISSOR_BOX 0x0C10 #define GL_SCISSOR_TEST 0x0C11 #define GL_MAX_VIEWPORTS 0x825B #define GL_VIEWPORT_SUBPIXEL_BITS 0x825C #define GL_VIEWPORT_BOUNDS_RANGE 0x825D #define GL_LAYER_PROVOKING_VERTEX 0x825E #define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F #define GL_UNDEFINED_VERTEX 0x8260 #define GL_FIRST_VERTEX_CONVENTION 0x8E4D #define GL_LAST_VERTEX_CONVENTION 0x8E4E #define GL_PROVOKING_VERTEX 0x8E4F typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd * v); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f); typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble* data); typedef void (GLAPIENTRY * PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat* data); typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint * v); typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint * v); typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat * v); typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat * v); #define glDepthRangeArrayv GLEW_GET_FUN(__glewDepthRangeArrayv) #define glDepthRangeIndexed GLEW_GET_FUN(__glewDepthRangeIndexed) #define glGetDoublei_v GLEW_GET_FUN(__glewGetDoublei_v) #define glGetFloati_v GLEW_GET_FUN(__glewGetFloati_v) #define glScissorArrayv GLEW_GET_FUN(__glewScissorArrayv) #define glScissorIndexed GLEW_GET_FUN(__glewScissorIndexed) #define glScissorIndexedv GLEW_GET_FUN(__glewScissorIndexedv) #define glViewportArrayv GLEW_GET_FUN(__glewViewportArrayv) #define glViewportIndexedf GLEW_GET_FUN(__glewViewportIndexedf) #define glViewportIndexedfv GLEW_GET_FUN(__glewViewportIndexedfv) #define GLEW_ARB_viewport_array GLEW_GET_VAR(__GLEW_ARB_viewport_array) #endif /* GL_ARB_viewport_array */ /* --------------------------- GL_ARB_window_pos --------------------------- */ #ifndef GL_ARB_window_pos #define GL_ARB_window_pos 1 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p); #define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB) #define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB) #define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB) #define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB) #define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB) #define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB) #define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB) #define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB) #define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB) #define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB) #define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB) #define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB) #define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB) #define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB) #define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB) #define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB) #define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos) #endif /* GL_ARB_window_pos */ /* ----------------------- GL_ARM_mali_program_binary ---------------------- */ #ifndef GL_ARM_mali_program_binary #define GL_ARM_mali_program_binary 1 #define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 #define GLEW_ARM_mali_program_binary GLEW_GET_VAR(__GLEW_ARM_mali_program_binary) #endif /* GL_ARM_mali_program_binary */ /* ----------------------- GL_ARM_mali_shader_binary ----------------------- */ #ifndef GL_ARM_mali_shader_binary #define GL_ARM_mali_shader_binary 1 #define GL_MALI_SHADER_BINARY_ARM 0x8F60 #define GLEW_ARM_mali_shader_binary GLEW_GET_VAR(__GLEW_ARM_mali_shader_binary) #endif /* GL_ARM_mali_shader_binary */ /* ------------------------------ GL_ARM_rgba8 ----------------------------- */ #ifndef GL_ARM_rgba8 #define GL_ARM_rgba8 1 #define GL_RGBA8_OES 0x8058 #define GLEW_ARM_rgba8 GLEW_GET_VAR(__GLEW_ARM_rgba8) #endif /* GL_ARM_rgba8 */ /* -------------------- GL_ARM_shader_framebuffer_fetch -------------------- */ #ifndef GL_ARM_shader_framebuffer_fetch #define GL_ARM_shader_framebuffer_fetch 1 #define GL_FETCH_PER_SAMPLE_ARM 0x8F65 #define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66 #define GLEW_ARM_shader_framebuffer_fetch GLEW_GET_VAR(__GLEW_ARM_shader_framebuffer_fetch) #endif /* GL_ARM_shader_framebuffer_fetch */ /* ------------- GL_ARM_shader_framebuffer_fetch_depth_stencil ------------- */ #ifndef GL_ARM_shader_framebuffer_fetch_depth_stencil #define GL_ARM_shader_framebuffer_fetch_depth_stencil 1 #define GLEW_ARM_shader_framebuffer_fetch_depth_stencil GLEW_GET_VAR(__GLEW_ARM_shader_framebuffer_fetch_depth_stencil) #endif /* GL_ARM_shader_framebuffer_fetch_depth_stencil */ /* ------------------------- GL_ATIX_point_sprites ------------------------- */ #ifndef GL_ATIX_point_sprites #define GL_ATIX_point_sprites 1 #define GL_TEXTURE_POINT_MODE_ATIX 0x60B0 #define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1 #define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2 #define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3 #define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4 #define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5 #define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites) #endif /* GL_ATIX_point_sprites */ /* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */ #ifndef GL_ATIX_texture_env_combine3 #define GL_ATIX_texture_env_combine3 1 #define GL_MODULATE_ADD_ATIX 0x8744 #define GL_MODULATE_SIGNED_ADD_ATIX 0x8745 #define GL_MODULATE_SUBTRACT_ATIX 0x8746 #define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3) #endif /* GL_ATIX_texture_env_combine3 */ /* ----------------------- GL_ATIX_texture_env_route ----------------------- */ #ifndef GL_ATIX_texture_env_route #define GL_ATIX_texture_env_route 1 #define GL_SECONDARY_COLOR_ATIX 0x8747 #define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 #define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 #define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route) #endif /* GL_ATIX_texture_env_route */ /* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */ #ifndef GL_ATIX_vertex_shader_output_point_size #define GL_ATIX_vertex_shader_output_point_size 1 #define GL_OUTPUT_POINT_SIZE_ATIX 0x610E #define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size) #endif /* GL_ATIX_vertex_shader_output_point_size */ /* -------------------------- GL_ATI_draw_buffers -------------------------- */ #ifndef GL_ATI_draw_buffers #define GL_ATI_draw_buffers 1 #define GL_MAX_DRAW_BUFFERS_ATI 0x8824 #define GL_DRAW_BUFFER0_ATI 0x8825 #define GL_DRAW_BUFFER1_ATI 0x8826 #define GL_DRAW_BUFFER2_ATI 0x8827 #define GL_DRAW_BUFFER3_ATI 0x8828 #define GL_DRAW_BUFFER4_ATI 0x8829 #define GL_DRAW_BUFFER5_ATI 0x882A #define GL_DRAW_BUFFER6_ATI 0x882B #define GL_DRAW_BUFFER7_ATI 0x882C #define GL_DRAW_BUFFER8_ATI 0x882D #define GL_DRAW_BUFFER9_ATI 0x882E #define GL_DRAW_BUFFER10_ATI 0x882F #define GL_DRAW_BUFFER11_ATI 0x8830 #define GL_DRAW_BUFFER12_ATI 0x8831 #define GL_DRAW_BUFFER13_ATI 0x8832 #define GL_DRAW_BUFFER14_ATI 0x8833 #define GL_DRAW_BUFFER15_ATI 0x8834 typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs); #define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI) #define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers) #endif /* GL_ATI_draw_buffers */ /* -------------------------- GL_ATI_element_array ------------------------- */ #ifndef GL_ATI_element_array #define GL_ATI_element_array 1 #define GL_ELEMENT_ARRAY_ATI 0x8768 #define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 #define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); #define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) #define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) #define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI) #define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array) #endif /* GL_ATI_element_array */ /* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */ #ifndef GL_ATI_envmap_bumpmap #define GL_ATI_envmap_bumpmap 1 #define GL_BUMP_ROT_MATRIX_ATI 0x8775 #define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 #define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 #define GL_BUMP_TEX_UNITS_ATI 0x8778 #define GL_DUDV_ATI 0x8779 #define GL_DU8DV8_ATI 0x877A #define GL_BUMP_ENVMAP_ATI 0x877B #define GL_BUMP_TARGET_ATI 0x877C typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); #define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI) #define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI) #define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI) #define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI) #define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap) #endif /* GL_ATI_envmap_bumpmap */ /* ------------------------- GL_ATI_fragment_shader ------------------------ */ #ifndef GL_ATI_fragment_shader #define GL_ATI_fragment_shader 1 #define GL_2X_BIT_ATI 0x00000001 #define GL_RED_BIT_ATI 0x00000001 #define GL_4X_BIT_ATI 0x00000002 #define GL_COMP_BIT_ATI 0x00000002 #define GL_GREEN_BIT_ATI 0x00000002 #define GL_8X_BIT_ATI 0x00000004 #define GL_BLUE_BIT_ATI 0x00000004 #define GL_NEGATE_BIT_ATI 0x00000004 #define GL_BIAS_BIT_ATI 0x00000008 #define GL_HALF_BIT_ATI 0x00000008 #define GL_QUARTER_BIT_ATI 0x00000010 #define GL_EIGHTH_BIT_ATI 0x00000020 #define GL_SATURATE_BIT_ATI 0x00000040 #define GL_FRAGMENT_SHADER_ATI 0x8920 #define GL_REG_0_ATI 0x8921 #define GL_REG_1_ATI 0x8922 #define GL_REG_2_ATI 0x8923 #define GL_REG_3_ATI 0x8924 #define GL_REG_4_ATI 0x8925 #define GL_REG_5_ATI 0x8926 #define GL_CON_0_ATI 0x8941 #define GL_CON_1_ATI 0x8942 #define GL_CON_2_ATI 0x8943 #define GL_CON_3_ATI 0x8944 #define GL_CON_4_ATI 0x8945 #define GL_CON_5_ATI 0x8946 #define GL_CON_6_ATI 0x8947 #define GL_CON_7_ATI 0x8948 #define GL_MOV_ATI 0x8961 #define GL_ADD_ATI 0x8963 #define GL_MUL_ATI 0x8964 #define GL_SUB_ATI 0x8965 #define GL_DOT3_ATI 0x8966 #define GL_DOT4_ATI 0x8967 #define GL_MAD_ATI 0x8968 #define GL_LERP_ATI 0x8969 #define GL_CND_ATI 0x896A #define GL_CND0_ATI 0x896B #define GL_DOT2_ADD_ATI 0x896C #define GL_SECONDARY_INTERPOLATOR_ATI 0x896D #define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E #define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F #define GL_NUM_PASSES_ATI 0x8970 #define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 #define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 #define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 #define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 #define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 #define GL_SWIZZLE_STR_ATI 0x8976 #define GL_SWIZZLE_STQ_ATI 0x8977 #define GL_SWIZZLE_STR_DR_ATI 0x8978 #define GL_SWIZZLE_STQ_DQ_ATI 0x8979 #define GL_SWIZZLE_STRQ_ATI 0x897A #define GL_SWIZZLE_STRQ_DQ_ATI 0x897B typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value); #define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI) #define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI) #define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI) #define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI) #define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI) #define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI) #define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI) #define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI) #define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI) #define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI) #define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI) #define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI) #define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI) #define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI) #define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader) #endif /* GL_ATI_fragment_shader */ /* ------------------------ GL_ATI_map_object_buffer ----------------------- */ #ifndef GL_ATI_map_object_buffer #define GL_ATI_map_object_buffer 1 typedef void * (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); #define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI) #define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI) #define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer) #endif /* GL_ATI_map_object_buffer */ /* ----------------------------- GL_ATI_meminfo ---------------------------- */ #ifndef GL_ATI_meminfo #define GL_ATI_meminfo 1 #define GL_VBO_FREE_MEMORY_ATI 0x87FB #define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC #define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD #define GLEW_ATI_meminfo GLEW_GET_VAR(__GLEW_ATI_meminfo) #endif /* GL_ATI_meminfo */ /* -------------------------- GL_ATI_pn_triangles -------------------------- */ #ifndef GL_ATI_pn_triangles #define GL_ATI_pn_triangles 1 #define GL_PN_TRIANGLES_ATI 0x87F0 #define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 #define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 #define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 #define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 #define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 #define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 #define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 #define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); #define glPNTrianglesfATI GLEW_GET_FUN(__glewPNTrianglesfATI) #define glPNTrianglesiATI GLEW_GET_FUN(__glewPNTrianglesiATI) #define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles) #endif /* GL_ATI_pn_triangles */ /* ------------------------ GL_ATI_separate_stencil ------------------------ */ #ifndef GL_ATI_separate_stencil #define GL_ATI_separate_stencil 1 #define GL_STENCIL_BACK_FUNC_ATI 0x8800 #define GL_STENCIL_BACK_FAIL_ATI 0x8801 #define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 #define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); #define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI) #define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI) #define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil) #endif /* GL_ATI_separate_stencil */ /* ----------------------- GL_ATI_shader_texture_lod ----------------------- */ #ifndef GL_ATI_shader_texture_lod #define GL_ATI_shader_texture_lod 1 #define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod) #endif /* GL_ATI_shader_texture_lod */ /* ---------------------- GL_ATI_text_fragment_shader ---------------------- */ #ifndef GL_ATI_text_fragment_shader #define GL_ATI_text_fragment_shader 1 #define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 #define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader) #endif /* GL_ATI_text_fragment_shader */ /* --------------------- GL_ATI_texture_compression_3dc -------------------- */ #ifndef GL_ATI_texture_compression_3dc #define GL_ATI_texture_compression_3dc 1 #define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 #define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc) #endif /* GL_ATI_texture_compression_3dc */ /* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */ #ifndef GL_ATI_texture_env_combine3 #define GL_ATI_texture_env_combine3 1 #define GL_MODULATE_ADD_ATI 0x8744 #define GL_MODULATE_SIGNED_ADD_ATI 0x8745 #define GL_MODULATE_SUBTRACT_ATI 0x8746 #define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3) #endif /* GL_ATI_texture_env_combine3 */ /* -------------------------- GL_ATI_texture_float ------------------------- */ #ifndef GL_ATI_texture_float #define GL_ATI_texture_float 1 #define GL_RGBA_FLOAT32_ATI 0x8814 #define GL_RGB_FLOAT32_ATI 0x8815 #define GL_ALPHA_FLOAT32_ATI 0x8816 #define GL_INTENSITY_FLOAT32_ATI 0x8817 #define GL_LUMINANCE_FLOAT32_ATI 0x8818 #define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 #define GL_RGBA_FLOAT16_ATI 0x881A #define GL_RGB_FLOAT16_ATI 0x881B #define GL_ALPHA_FLOAT16_ATI 0x881C #define GL_INTENSITY_FLOAT16_ATI 0x881D #define GL_LUMINANCE_FLOAT16_ATI 0x881E #define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F #define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float) #endif /* GL_ATI_texture_float */ /* ----------------------- GL_ATI_texture_mirror_once ---------------------- */ #ifndef GL_ATI_texture_mirror_once #define GL_ATI_texture_mirror_once 1 #define GL_MIRROR_CLAMP_ATI 0x8742 #define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 #define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once) #endif /* GL_ATI_texture_mirror_once */ /* ----------------------- GL_ATI_vertex_array_object ---------------------- */ #ifndef GL_ATI_vertex_array_object #define GL_ATI_vertex_array_object 1 #define GL_STATIC_ATI 0x8760 #define GL_DYNAMIC_ATI 0x8761 #define GL_PRESERVE_ATI 0x8762 #define GL_DISCARD_ATI 0x8763 #define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 #define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 #define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 #define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); #define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) #define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI) #define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI) #define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI) #define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI) #define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI) #define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI) #define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI) #define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI) #define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI) #define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI) #define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI) #define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object) #endif /* GL_ATI_vertex_array_object */ /* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */ #ifndef GL_ATI_vertex_attrib_array_object #define GL_ATI_vertex_attrib_array_object 1 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); #define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI) #define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI) #define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI) #define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object) #endif /* GL_ATI_vertex_attrib_array_object */ /* ------------------------- GL_ATI_vertex_streams ------------------------- */ #ifndef GL_ATI_vertex_streams #define GL_ATI_vertex_streams 1 #define GL_MAX_VERTEX_STREAMS_ATI 0x876B #define GL_VERTEX_SOURCE_ATI 0x876C #define GL_VERTEX_STREAM0_ATI 0x876D #define GL_VERTEX_STREAM1_ATI 0x876E #define GL_VERTEX_STREAM2_ATI 0x876F #define GL_VERTEX_STREAM3_ATI 0x8770 #define GL_VERTEX_STREAM4_ATI 0x8771 #define GL_VERTEX_STREAM5_ATI 0x8772 #define GL_VERTEX_STREAM6_ATI 0x8773 #define GL_VERTEX_STREAM7_ATI 0x8774 typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); #define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI) #define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI) #define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI) #define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI) #define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI) #define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI) #define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI) #define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI) #define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI) #define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI) #define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI) #define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI) #define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI) #define glVertexStream1dATI GLEW_GET_FUN(__glewVertexStream1dATI) #define glVertexStream1dvATI GLEW_GET_FUN(__glewVertexStream1dvATI) #define glVertexStream1fATI GLEW_GET_FUN(__glewVertexStream1fATI) #define glVertexStream1fvATI GLEW_GET_FUN(__glewVertexStream1fvATI) #define glVertexStream1iATI GLEW_GET_FUN(__glewVertexStream1iATI) #define glVertexStream1ivATI GLEW_GET_FUN(__glewVertexStream1ivATI) #define glVertexStream1sATI GLEW_GET_FUN(__glewVertexStream1sATI) #define glVertexStream1svATI GLEW_GET_FUN(__glewVertexStream1svATI) #define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI) #define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI) #define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI) #define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI) #define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI) #define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI) #define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI) #define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI) #define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI) #define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI) #define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI) #define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI) #define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI) #define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI) #define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI) #define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI) #define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI) #define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI) #define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI) #define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI) #define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI) #define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI) #define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI) #define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI) #define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams) #endif /* GL_ATI_vertex_streams */ /* -------------------- GL_EGL_KHR_context_flush_control ------------------- */ #ifndef GL_EGL_KHR_context_flush_control #define GL_EGL_KHR_context_flush_control 1 #define GLEW_EGL_KHR_context_flush_control GLEW_GET_VAR(__GLEW_EGL_KHR_context_flush_control) #endif /* GL_EGL_KHR_context_flush_control */ /* ---------------- GL_EGL_NV_robustness_video_memory_purge ---------------- */ #ifndef GL_EGL_NV_robustness_video_memory_purge #define GL_EGL_NV_robustness_video_memory_purge 1 #define GL_EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C #define GL_PURGED_CONTEXT_RESET_NV 0x92BB #define GLEW_EGL_NV_robustness_video_memory_purge GLEW_GET_VAR(__GLEW_EGL_NV_robustness_video_memory_purge) #endif /* GL_EGL_NV_robustness_video_memory_purge */ /* --------------------------- GL_EXT_422_pixels --------------------------- */ #ifndef GL_EXT_422_pixels #define GL_EXT_422_pixels 1 #define GL_422_EXT 0x80CC #define GL_422_REV_EXT 0x80CD #define GL_422_AVERAGE_EXT 0x80CE #define GL_422_REV_AVERAGE_EXT 0x80CF #define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels) #endif /* GL_EXT_422_pixels */ /* ---------------------------- GL_EXT_Cg_shader --------------------------- */ #ifndef GL_EXT_Cg_shader #define GL_EXT_Cg_shader 1 #define GL_CG_VERTEX_SHADER_EXT 0x890E #define GL_CG_FRAGMENT_SHADER_EXT 0x890F #define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader) #endif /* GL_EXT_Cg_shader */ /* ------------------------- GL_EXT_EGL_image_array ------------------------ */ #ifndef GL_EXT_EGL_image_array #define GL_EXT_EGL_image_array 1 #define GLEW_EXT_EGL_image_array GLEW_GET_VAR(__GLEW_EXT_EGL_image_array) #endif /* GL_EXT_EGL_image_array */ /* --------------------------- GL_EXT_YUV_target --------------------------- */ #ifndef GL_EXT_YUV_target #define GL_EXT_YUV_target 1 #define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT 0x8BE7 #define GLEW_EXT_YUV_target GLEW_GET_VAR(__GLEW_EXT_YUV_target) #endif /* GL_EXT_YUV_target */ /* ------------------------------ GL_EXT_abgr ------------------------------ */ #ifndef GL_EXT_abgr #define GL_EXT_abgr 1 #define GL_ABGR_EXT 0x8000 #define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr) #endif /* GL_EXT_abgr */ /* -------------------------- GL_EXT_base_instance ------------------------- */ #ifndef GL_EXT_base_instance #define GL_EXT_base_instance 1 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); #define glDrawArraysInstancedBaseInstanceEXT GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstanceEXT) #define glDrawElementsInstancedBaseInstanceEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstanceEXT) #define glDrawElementsInstancedBaseVertexBaseInstanceEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstanceEXT) #define GLEW_EXT_base_instance GLEW_GET_VAR(__GLEW_EXT_base_instance) #endif /* GL_EXT_base_instance */ /* ------------------------------ GL_EXT_bgra ------------------------------ */ #ifndef GL_EXT_bgra #define GL_EXT_bgra 1 #define GL_BGR_EXT 0x80E0 #define GL_BGRA_EXT 0x80E1 #define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra) #endif /* GL_EXT_bgra */ /* ------------------------ GL_EXT_bindable_uniform ------------------------ */ #ifndef GL_EXT_bindable_uniform #define GL_EXT_bindable_uniform 1 #define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 #define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 #define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 #define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED #define GL_UNIFORM_BUFFER_EXT 0x8DEE #define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); #define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT) #define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT) #define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT) #define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform) #endif /* GL_EXT_bindable_uniform */ /* --------------------------- GL_EXT_blend_color -------------------------- */ #ifndef GL_EXT_blend_color #define GL_EXT_blend_color 1 #define GL_CONSTANT_COLOR_EXT 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 #define GL_CONSTANT_ALPHA_EXT 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 #define GL_BLEND_COLOR_EXT 0x8005 typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); #define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT) #define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color) #endif /* GL_EXT_blend_color */ /* --------------------- GL_EXT_blend_equation_separate -------------------- */ #ifndef GL_EXT_blend_equation_separate #define GL_EXT_blend_equation_separate 1 #define GL_BLEND_EQUATION_RGB_EXT 0x8009 #define GL_BLEND_EQUATION_ALPHA_EXT 0x883D typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); #define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT) #define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate) #endif /* GL_EXT_blend_equation_separate */ /* ----------------------- GL_EXT_blend_func_extended ---------------------- */ #ifndef GL_EXT_blend_func_extended #define GL_EXT_blend_func_extended 1 #define GL_SRC_ALPHA_SATURATE_EXT 0x0308 #define GL_SRC1_ALPHA_EXT 0x8589 #define GL_SRC1_COLOR_EXT 0x88F9 #define GL_ONE_MINUS_SRC1_COLOR_EXT 0x88FA #define GL_ONE_MINUS_SRC1_ALPHA_EXT 0x88FB #define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC #define GL_LOCATION_INDEX_EXT 0x930F typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXEXTPROC) (GLuint program, const GLchar * name); typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) (GLuint program, GLenum programInterface, const GLchar* name); #define glBindFragDataLocationIndexedEXT GLEW_GET_FUN(__glewBindFragDataLocationIndexedEXT) #define glGetFragDataIndexEXT GLEW_GET_FUN(__glewGetFragDataIndexEXT) #define glGetProgramResourceLocationIndexEXT GLEW_GET_FUN(__glewGetProgramResourceLocationIndexEXT) #define GLEW_EXT_blend_func_extended GLEW_GET_VAR(__GLEW_EXT_blend_func_extended) #endif /* GL_EXT_blend_func_extended */ /* ----------------------- GL_EXT_blend_func_separate ---------------------- */ #ifndef GL_EXT_blend_func_separate #define GL_EXT_blend_func_separate 1 #define GL_BLEND_DST_RGB_EXT 0x80C8 #define GL_BLEND_SRC_RGB_EXT 0x80C9 #define GL_BLEND_DST_ALPHA_EXT 0x80CA #define GL_BLEND_SRC_ALPHA_EXT 0x80CB typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT) #define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate) #endif /* GL_EXT_blend_func_separate */ /* ------------------------- GL_EXT_blend_logic_op ------------------------- */ #ifndef GL_EXT_blend_logic_op #define GL_EXT_blend_logic_op 1 #define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op) #endif /* GL_EXT_blend_logic_op */ /* -------------------------- GL_EXT_blend_minmax -------------------------- */ #ifndef GL_EXT_blend_minmax #define GL_EXT_blend_minmax 1 #define GL_FUNC_ADD_EXT 0x8006 #define GL_MIN_EXT 0x8007 #define GL_MAX_EXT 0x8008 #define GL_BLEND_EQUATION_EXT 0x8009 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); #define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT) #define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax) #endif /* GL_EXT_blend_minmax */ /* ------------------------- GL_EXT_blend_subtract ------------------------- */ #ifndef GL_EXT_blend_subtract #define GL_EXT_blend_subtract 1 #define GL_FUNC_SUBTRACT_EXT 0x800A #define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B #define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract) #endif /* GL_EXT_blend_subtract */ /* ------------------------- GL_EXT_buffer_storage ------------------------- */ #ifndef GL_EXT_buffer_storage #define GL_EXT_buffer_storage 1 #define GL_MAP_READ_BIT 0x0001 #define GL_MAP_WRITE_BIT 0x0002 #define GL_MAP_PERSISTENT_BIT_EXT 0x0040 #define GL_MAP_COHERENT_BIT_EXT 0x0080 #define GL_DYNAMIC_STORAGE_BIT_EXT 0x0100 #define GL_CLIENT_STORAGE_BIT_EXT 0x0200 #define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT 0x00004000 #define GL_BUFFER_IMMUTABLE_STORAGE_EXT 0x821F #define GL_BUFFER_STORAGE_FLAGS_EXT 0x8220 typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEEXTPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); #define glBufferStorageEXT GLEW_GET_FUN(__glewBufferStorageEXT) #define glNamedBufferStorageEXT GLEW_GET_FUN(__glewNamedBufferStorageEXT) #define GLEW_EXT_buffer_storage GLEW_GET_VAR(__GLEW_EXT_buffer_storage) #endif /* GL_EXT_buffer_storage */ /* -------------------------- GL_EXT_clear_texture ------------------------- */ #ifndef GL_EXT_clear_texture #define GL_EXT_clear_texture 1 typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEEXTPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); #define glClearTexImageEXT GLEW_GET_FUN(__glewClearTexImageEXT) #define glClearTexSubImageEXT GLEW_GET_FUN(__glewClearTexSubImageEXT) #define GLEW_EXT_clear_texture GLEW_GET_VAR(__GLEW_EXT_clear_texture) #endif /* GL_EXT_clear_texture */ /* ----------------------- GL_EXT_clip_cull_distance ----------------------- */ #ifndef GL_EXT_clip_cull_distance #define GL_EXT_clip_cull_distance 1 #define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 #define GL_CLIP_DISTANCE0_EXT 0x3000 #define GL_CLIP_DISTANCE1_EXT 0x3001 #define GL_CLIP_DISTANCE2_EXT 0x3002 #define GL_CLIP_DISTANCE3_EXT 0x3003 #define GL_CLIP_DISTANCE4_EXT 0x3004 #define GL_CLIP_DISTANCE5_EXT 0x3005 #define GL_CLIP_DISTANCE6_EXT 0x3006 #define GL_CLIP_DISTANCE7_EXT 0x3007 #define GL_MAX_CULL_DISTANCES_EXT 0x82F9 #define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT 0x82FA #define GLEW_EXT_clip_cull_distance GLEW_GET_VAR(__GLEW_EXT_clip_cull_distance) #endif /* GL_EXT_clip_cull_distance */ /* ------------------------ GL_EXT_clip_volume_hint ------------------------ */ #ifndef GL_EXT_clip_volume_hint #define GL_EXT_clip_volume_hint 1 #define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 #define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint) #endif /* GL_EXT_clip_volume_hint */ /* ------------------------------ GL_EXT_cmyka ----------------------------- */ #ifndef GL_EXT_cmyka #define GL_EXT_cmyka 1 #define GL_CMYK_EXT 0x800C #define GL_CMYKA_EXT 0x800D #define GL_PACK_CMYK_HINT_EXT 0x800E #define GL_UNPACK_CMYK_HINT_EXT 0x800F #define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka) #endif /* GL_EXT_cmyka */ /* ----------------------- GL_EXT_color_buffer_float ----------------------- */ #ifndef GL_EXT_color_buffer_float #define GL_EXT_color_buffer_float 1 #define GLEW_EXT_color_buffer_float GLEW_GET_VAR(__GLEW_EXT_color_buffer_float) #endif /* GL_EXT_color_buffer_float */ /* --------------------- GL_EXT_color_buffer_half_float -------------------- */ #ifndef GL_EXT_color_buffer_half_float #define GL_EXT_color_buffer_half_float 1 #define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 #define GL_R16F_EXT 0x822D #define GL_RG16F_EXT 0x822F #define GL_RGBA16F_EXT 0x881A #define GL_RGB16F_EXT 0x881B #define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 #define GLEW_EXT_color_buffer_half_float GLEW_GET_VAR(__GLEW_EXT_color_buffer_half_float) #endif /* GL_EXT_color_buffer_half_float */ /* ------------------------- GL_EXT_color_subtable ------------------------- */ #ifndef GL_EXT_color_subtable #define GL_EXT_color_subtable 1 typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); #define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) #define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT) #define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable) #endif /* GL_EXT_color_subtable */ /* ---------------------- GL_EXT_compiled_vertex_array --------------------- */ #ifndef GL_EXT_compiled_vertex_array #define GL_EXT_compiled_vertex_array 1 #define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 #define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); #define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT) #define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT) #define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array) #endif /* GL_EXT_compiled_vertex_array */ /* ---------------- GL_EXT_compressed_ETC1_RGB8_sub_texture ---------------- */ #ifndef GL_EXT_compressed_ETC1_RGB8_sub_texture #define GL_EXT_compressed_ETC1_RGB8_sub_texture 1 #define GLEW_EXT_compressed_ETC1_RGB8_sub_texture GLEW_GET_VAR(__GLEW_EXT_compressed_ETC1_RGB8_sub_texture) #endif /* GL_EXT_compressed_ETC1_RGB8_sub_texture */ /* ----------------------- GL_EXT_conservative_depth ----------------------- */ #ifndef GL_EXT_conservative_depth #define GL_EXT_conservative_depth 1 #define GLEW_EXT_conservative_depth GLEW_GET_VAR(__GLEW_EXT_conservative_depth) #endif /* GL_EXT_conservative_depth */ /* --------------------------- GL_EXT_convolution -------------------------- */ #ifndef GL_EXT_convolution #define GL_EXT_convolution 1 #define GL_CONVOLUTION_1D_EXT 0x8010 #define GL_CONVOLUTION_2D_EXT 0x8011 #define GL_SEPARABLE_2D_EXT 0x8012 #define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 #define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 #define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 #define GL_REDUCE_EXT 0x8016 #define GL_CONVOLUTION_FORMAT_EXT 0x8017 #define GL_CONVOLUTION_WIDTH_EXT 0x8018 #define GL_CONVOLUTION_HEIGHT_EXT 0x8019 #define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A #define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B #define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C #define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D #define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E #define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F #define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 #define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 #define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); #define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) #define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) #define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT) #define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT) #define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT) #define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT) #define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT) #define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT) #define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT) #define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT) #define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT) #define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT) #define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT) #define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution) #endif /* GL_EXT_convolution */ /* ------------------------ GL_EXT_coordinate_frame ------------------------ */ #ifndef GL_EXT_coordinate_frame #define GL_EXT_coordinate_frame 1 #define GL_TANGENT_ARRAY_EXT 0x8439 #define GL_BINORMAL_ARRAY_EXT 0x843A #define GL_CURRENT_TANGENT_EXT 0x843B #define GL_CURRENT_BINORMAL_EXT 0x843C #define GL_TANGENT_ARRAY_TYPE_EXT 0x843E #define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F #define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 #define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 #define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 #define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 #define GL_MAP1_TANGENT_EXT 0x8444 #define GL_MAP2_TANGENT_EXT 0x8445 #define GL_MAP1_BINORMAL_EXT 0x8446 #define GL_MAP2_BINORMAL_EXT 0x8447 typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); #define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) #define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) #define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame) #endif /* GL_EXT_coordinate_frame */ /* --------------------------- GL_EXT_copy_image --------------------------- */ #ifndef GL_EXT_copy_image #define GL_EXT_copy_image 1 typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAEXTPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); #define glCopyImageSubDataEXT GLEW_GET_FUN(__glewCopyImageSubDataEXT) #define GLEW_EXT_copy_image GLEW_GET_VAR(__GLEW_EXT_copy_image) #endif /* GL_EXT_copy_image */ /* -------------------------- GL_EXT_copy_texture -------------------------- */ #ifndef GL_EXT_copy_texture #define GL_EXT_copy_texture 1 typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT) #define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT) #define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT) #define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT) #define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT) #define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture) #endif /* GL_EXT_copy_texture */ /* --------------------------- GL_EXT_cull_vertex -------------------------- */ #ifndef GL_EXT_cull_vertex #define GL_EXT_cull_vertex 1 #define GL_CULL_VERTEX_EXT 0x81AA #define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB #define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); #define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT) #define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT) #define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex) #endif /* GL_EXT_cull_vertex */ /* --------------------------- GL_EXT_debug_label -------------------------- */ #ifndef GL_EXT_debug_label #define GL_EXT_debug_label 1 #define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F #define GL_PROGRAM_OBJECT_EXT 0x8B40 #define GL_SHADER_OBJECT_EXT 0x8B48 #define GL_BUFFER_OBJECT_EXT 0x9151 #define GL_QUERY_OBJECT_EXT 0x9153 #define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar *label); typedef void (GLAPIENTRY * PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar* label); #define glGetObjectLabelEXT GLEW_GET_FUN(__glewGetObjectLabelEXT) #define glLabelObjectEXT GLEW_GET_FUN(__glewLabelObjectEXT) #define GLEW_EXT_debug_label GLEW_GET_VAR(__GLEW_EXT_debug_label) #endif /* GL_EXT_debug_label */ /* -------------------------- GL_EXT_debug_marker -------------------------- */ #ifndef GL_EXT_debug_marker #define GL_EXT_debug_marker 1 typedef void (GLAPIENTRY * PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar* marker); typedef void (GLAPIENTRY * PFNGLPOPGROUPMARKEREXTPROC) (void); typedef void (GLAPIENTRY * PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar* marker); #define glInsertEventMarkerEXT GLEW_GET_FUN(__glewInsertEventMarkerEXT) #define glPopGroupMarkerEXT GLEW_GET_FUN(__glewPopGroupMarkerEXT) #define glPushGroupMarkerEXT GLEW_GET_FUN(__glewPushGroupMarkerEXT) #define GLEW_EXT_debug_marker GLEW_GET_VAR(__GLEW_EXT_debug_marker) #endif /* GL_EXT_debug_marker */ /* ------------------------ GL_EXT_depth_bounds_test ----------------------- */ #ifndef GL_EXT_depth_bounds_test #define GL_EXT_depth_bounds_test 1 #define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 #define GL_DEPTH_BOUNDS_EXT 0x8891 typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); #define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT) #define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test) #endif /* GL_EXT_depth_bounds_test */ /* ----------------------- GL_EXT_direct_state_access ---------------------- */ #ifndef GL_EXT_direct_state_access #define GL_EXT_direct_state_access 1 #define GL_PROGRAM_MATRIX_EXT 0x8E2D #define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E #define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F typedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); typedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void *img); typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void *img); typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void** params); typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void** params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void** param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void** param); typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef void (GLAPIENTRY * PFNGLMATRIXFRUSTUMEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); typedef void (GLAPIENTRY * PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum matrixMode); typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXLOADDEXTPROC) (GLenum matrixMode, const GLdouble* m); typedef void (GLAPIENTRY * PFNGLMATRIXLOADFEXTPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULTDEXTPROC) (GLenum matrixMode, const GLdouble* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULTFEXTPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXORTHOEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); typedef void (GLAPIENTRY * PFNGLMATRIXPOPEXTPROC) (GLenum matrixMode); typedef void (GLAPIENTRY * PFNGLMATRIXPUSHEXTPROC) (GLenum matrixMode); typedef void (GLAPIENTRY * PFNGLMATRIXROTATEDEXTPROC) (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLMATRIXROTATEFEXTPROC) (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLMATRIXSCALEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); typedef void (GLAPIENTRY * PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* param); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param); typedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat* param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param); typedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); #define glBindMultiTextureEXT GLEW_GET_FUN(__glewBindMultiTextureEXT) #define glCheckNamedFramebufferStatusEXT GLEW_GET_FUN(__glewCheckNamedFramebufferStatusEXT) #define glClientAttribDefaultEXT GLEW_GET_FUN(__glewClientAttribDefaultEXT) #define glCompressedMultiTexImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage1DEXT) #define glCompressedMultiTexImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage2DEXT) #define glCompressedMultiTexImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage3DEXT) #define glCompressedMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage1DEXT) #define glCompressedMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage2DEXT) #define glCompressedMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage3DEXT) #define glCompressedTextureImage1DEXT GLEW_GET_FUN(__glewCompressedTextureImage1DEXT) #define glCompressedTextureImage2DEXT GLEW_GET_FUN(__glewCompressedTextureImage2DEXT) #define glCompressedTextureImage3DEXT GLEW_GET_FUN(__glewCompressedTextureImage3DEXT) #define glCompressedTextureSubImage1DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage1DEXT) #define glCompressedTextureSubImage2DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage2DEXT) #define glCompressedTextureSubImage3DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage3DEXT) #define glCopyMultiTexImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexImage1DEXT) #define glCopyMultiTexImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexImage2DEXT) #define glCopyMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage1DEXT) #define glCopyMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage2DEXT) #define glCopyMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage3DEXT) #define glCopyTextureImage1DEXT GLEW_GET_FUN(__glewCopyTextureImage1DEXT) #define glCopyTextureImage2DEXT GLEW_GET_FUN(__glewCopyTextureImage2DEXT) #define glCopyTextureSubImage1DEXT GLEW_GET_FUN(__glewCopyTextureSubImage1DEXT) #define glCopyTextureSubImage2DEXT GLEW_GET_FUN(__glewCopyTextureSubImage2DEXT) #define glCopyTextureSubImage3DEXT GLEW_GET_FUN(__glewCopyTextureSubImage3DEXT) #define glDisableClientStateIndexedEXT GLEW_GET_FUN(__glewDisableClientStateIndexedEXT) #define glDisableClientStateiEXT GLEW_GET_FUN(__glewDisableClientStateiEXT) #define glDisableVertexArrayAttribEXT GLEW_GET_FUN(__glewDisableVertexArrayAttribEXT) #define glDisableVertexArrayEXT GLEW_GET_FUN(__glewDisableVertexArrayEXT) #define glEnableClientStateIndexedEXT GLEW_GET_FUN(__glewEnableClientStateIndexedEXT) #define glEnableClientStateiEXT GLEW_GET_FUN(__glewEnableClientStateiEXT) #define glEnableVertexArrayAttribEXT GLEW_GET_FUN(__glewEnableVertexArrayAttribEXT) #define glEnableVertexArrayEXT GLEW_GET_FUN(__glewEnableVertexArrayEXT) #define glFlushMappedNamedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedNamedBufferRangeEXT) #define glFramebufferDrawBufferEXT GLEW_GET_FUN(__glewFramebufferDrawBufferEXT) #define glFramebufferDrawBuffersEXT GLEW_GET_FUN(__glewFramebufferDrawBuffersEXT) #define glFramebufferReadBufferEXT GLEW_GET_FUN(__glewFramebufferReadBufferEXT) #define glGenerateMultiTexMipmapEXT GLEW_GET_FUN(__glewGenerateMultiTexMipmapEXT) #define glGenerateTextureMipmapEXT GLEW_GET_FUN(__glewGenerateTextureMipmapEXT) #define glGetCompressedMultiTexImageEXT GLEW_GET_FUN(__glewGetCompressedMultiTexImageEXT) #define glGetCompressedTextureImageEXT GLEW_GET_FUN(__glewGetCompressedTextureImageEXT) #define glGetDoubleIndexedvEXT GLEW_GET_FUN(__glewGetDoubleIndexedvEXT) #define glGetDoublei_vEXT GLEW_GET_FUN(__glewGetDoublei_vEXT) #define glGetFloatIndexedvEXT GLEW_GET_FUN(__glewGetFloatIndexedvEXT) #define glGetFloati_vEXT GLEW_GET_FUN(__glewGetFloati_vEXT) #define glGetFramebufferParameterivEXT GLEW_GET_FUN(__glewGetFramebufferParameterivEXT) #define glGetMultiTexEnvfvEXT GLEW_GET_FUN(__glewGetMultiTexEnvfvEXT) #define glGetMultiTexEnvivEXT GLEW_GET_FUN(__glewGetMultiTexEnvivEXT) #define glGetMultiTexGendvEXT GLEW_GET_FUN(__glewGetMultiTexGendvEXT) #define glGetMultiTexGenfvEXT GLEW_GET_FUN(__glewGetMultiTexGenfvEXT) #define glGetMultiTexGenivEXT GLEW_GET_FUN(__glewGetMultiTexGenivEXT) #define glGetMultiTexImageEXT GLEW_GET_FUN(__glewGetMultiTexImageEXT) #define glGetMultiTexLevelParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterfvEXT) #define glGetMultiTexLevelParameterivEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterivEXT) #define glGetMultiTexParameterIivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIivEXT) #define glGetMultiTexParameterIuivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIuivEXT) #define glGetMultiTexParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexParameterfvEXT) #define glGetMultiTexParameterivEXT GLEW_GET_FUN(__glewGetMultiTexParameterivEXT) #define glGetNamedBufferParameterivEXT GLEW_GET_FUN(__glewGetNamedBufferParameterivEXT) #define glGetNamedBufferPointervEXT GLEW_GET_FUN(__glewGetNamedBufferPointervEXT) #define glGetNamedBufferSubDataEXT GLEW_GET_FUN(__glewGetNamedBufferSubDataEXT) #define glGetNamedFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameterivEXT) #define glGetNamedProgramLocalParameterIivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIivEXT) #define glGetNamedProgramLocalParameterIuivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIuivEXT) #define glGetNamedProgramLocalParameterdvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterdvEXT) #define glGetNamedProgramLocalParameterfvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterfvEXT) #define glGetNamedProgramStringEXT GLEW_GET_FUN(__glewGetNamedProgramStringEXT) #define glGetNamedProgramivEXT GLEW_GET_FUN(__glewGetNamedProgramivEXT) #define glGetNamedRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetNamedRenderbufferParameterivEXT) #define glGetPointerIndexedvEXT GLEW_GET_FUN(__glewGetPointerIndexedvEXT) #define glGetPointeri_vEXT GLEW_GET_FUN(__glewGetPointeri_vEXT) #define glGetTextureImageEXT GLEW_GET_FUN(__glewGetTextureImageEXT) #define glGetTextureLevelParameterfvEXT GLEW_GET_FUN(__glewGetTextureLevelParameterfvEXT) #define glGetTextureLevelParameterivEXT GLEW_GET_FUN(__glewGetTextureLevelParameterivEXT) #define glGetTextureParameterIivEXT GLEW_GET_FUN(__glewGetTextureParameterIivEXT) #define glGetTextureParameterIuivEXT GLEW_GET_FUN(__glewGetTextureParameterIuivEXT) #define glGetTextureParameterfvEXT GLEW_GET_FUN(__glewGetTextureParameterfvEXT) #define glGetTextureParameterivEXT GLEW_GET_FUN(__glewGetTextureParameterivEXT) #define glGetVertexArrayIntegeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayIntegeri_vEXT) #define glGetVertexArrayIntegervEXT GLEW_GET_FUN(__glewGetVertexArrayIntegervEXT) #define glGetVertexArrayPointeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayPointeri_vEXT) #define glGetVertexArrayPointervEXT GLEW_GET_FUN(__glewGetVertexArrayPointervEXT) #define glMapNamedBufferEXT GLEW_GET_FUN(__glewMapNamedBufferEXT) #define glMapNamedBufferRangeEXT GLEW_GET_FUN(__glewMapNamedBufferRangeEXT) #define glMatrixFrustumEXT GLEW_GET_FUN(__glewMatrixFrustumEXT) #define glMatrixLoadIdentityEXT GLEW_GET_FUN(__glewMatrixLoadIdentityEXT) #define glMatrixLoadTransposedEXT GLEW_GET_FUN(__glewMatrixLoadTransposedEXT) #define glMatrixLoadTransposefEXT GLEW_GET_FUN(__glewMatrixLoadTransposefEXT) #define glMatrixLoaddEXT GLEW_GET_FUN(__glewMatrixLoaddEXT) #define glMatrixLoadfEXT GLEW_GET_FUN(__glewMatrixLoadfEXT) #define glMatrixMultTransposedEXT GLEW_GET_FUN(__glewMatrixMultTransposedEXT) #define glMatrixMultTransposefEXT GLEW_GET_FUN(__glewMatrixMultTransposefEXT) #define glMatrixMultdEXT GLEW_GET_FUN(__glewMatrixMultdEXT) #define glMatrixMultfEXT GLEW_GET_FUN(__glewMatrixMultfEXT) #define glMatrixOrthoEXT GLEW_GET_FUN(__glewMatrixOrthoEXT) #define glMatrixPopEXT GLEW_GET_FUN(__glewMatrixPopEXT) #define glMatrixPushEXT GLEW_GET_FUN(__glewMatrixPushEXT) #define glMatrixRotatedEXT GLEW_GET_FUN(__glewMatrixRotatedEXT) #define glMatrixRotatefEXT GLEW_GET_FUN(__glewMatrixRotatefEXT) #define glMatrixScaledEXT GLEW_GET_FUN(__glewMatrixScaledEXT) #define glMatrixScalefEXT GLEW_GET_FUN(__glewMatrixScalefEXT) #define glMatrixTranslatedEXT GLEW_GET_FUN(__glewMatrixTranslatedEXT) #define glMatrixTranslatefEXT GLEW_GET_FUN(__glewMatrixTranslatefEXT) #define glMultiTexBufferEXT GLEW_GET_FUN(__glewMultiTexBufferEXT) #define glMultiTexCoordPointerEXT GLEW_GET_FUN(__glewMultiTexCoordPointerEXT) #define glMultiTexEnvfEXT GLEW_GET_FUN(__glewMultiTexEnvfEXT) #define glMultiTexEnvfvEXT GLEW_GET_FUN(__glewMultiTexEnvfvEXT) #define glMultiTexEnviEXT GLEW_GET_FUN(__glewMultiTexEnviEXT) #define glMultiTexEnvivEXT GLEW_GET_FUN(__glewMultiTexEnvivEXT) #define glMultiTexGendEXT GLEW_GET_FUN(__glewMultiTexGendEXT) #define glMultiTexGendvEXT GLEW_GET_FUN(__glewMultiTexGendvEXT) #define glMultiTexGenfEXT GLEW_GET_FUN(__glewMultiTexGenfEXT) #define glMultiTexGenfvEXT GLEW_GET_FUN(__glewMultiTexGenfvEXT) #define glMultiTexGeniEXT GLEW_GET_FUN(__glewMultiTexGeniEXT) #define glMultiTexGenivEXT GLEW_GET_FUN(__glewMultiTexGenivEXT) #define glMultiTexImage1DEXT GLEW_GET_FUN(__glewMultiTexImage1DEXT) #define glMultiTexImage2DEXT GLEW_GET_FUN(__glewMultiTexImage2DEXT) #define glMultiTexImage3DEXT GLEW_GET_FUN(__glewMultiTexImage3DEXT) #define glMultiTexParameterIivEXT GLEW_GET_FUN(__glewMultiTexParameterIivEXT) #define glMultiTexParameterIuivEXT GLEW_GET_FUN(__glewMultiTexParameterIuivEXT) #define glMultiTexParameterfEXT GLEW_GET_FUN(__glewMultiTexParameterfEXT) #define glMultiTexParameterfvEXT GLEW_GET_FUN(__glewMultiTexParameterfvEXT) #define glMultiTexParameteriEXT GLEW_GET_FUN(__glewMultiTexParameteriEXT) #define glMultiTexParameterivEXT GLEW_GET_FUN(__glewMultiTexParameterivEXT) #define glMultiTexRenderbufferEXT GLEW_GET_FUN(__glewMultiTexRenderbufferEXT) #define glMultiTexSubImage1DEXT GLEW_GET_FUN(__glewMultiTexSubImage1DEXT) #define glMultiTexSubImage2DEXT GLEW_GET_FUN(__glewMultiTexSubImage2DEXT) #define glMultiTexSubImage3DEXT GLEW_GET_FUN(__glewMultiTexSubImage3DEXT) #define glNamedBufferDataEXT GLEW_GET_FUN(__glewNamedBufferDataEXT) #define glNamedBufferSubDataEXT GLEW_GET_FUN(__glewNamedBufferSubDataEXT) #define glNamedCopyBufferSubDataEXT GLEW_GET_FUN(__glewNamedCopyBufferSubDataEXT) #define glNamedFramebufferRenderbufferEXT GLEW_GET_FUN(__glewNamedFramebufferRenderbufferEXT) #define glNamedFramebufferTexture1DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture1DEXT) #define glNamedFramebufferTexture2DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture2DEXT) #define glNamedFramebufferTexture3DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture3DEXT) #define glNamedFramebufferTextureEXT GLEW_GET_FUN(__glewNamedFramebufferTextureEXT) #define glNamedFramebufferTextureFaceEXT GLEW_GET_FUN(__glewNamedFramebufferTextureFaceEXT) #define glNamedFramebufferTextureLayerEXT GLEW_GET_FUN(__glewNamedFramebufferTextureLayerEXT) #define glNamedProgramLocalParameter4dEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dEXT) #define glNamedProgramLocalParameter4dvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dvEXT) #define glNamedProgramLocalParameter4fEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fEXT) #define glNamedProgramLocalParameter4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fvEXT) #define glNamedProgramLocalParameterI4iEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4iEXT) #define glNamedProgramLocalParameterI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4ivEXT) #define glNamedProgramLocalParameterI4uiEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uiEXT) #define glNamedProgramLocalParameterI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uivEXT) #define glNamedProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameters4fvEXT) #define glNamedProgramLocalParametersI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4ivEXT) #define glNamedProgramLocalParametersI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4uivEXT) #define glNamedProgramStringEXT GLEW_GET_FUN(__glewNamedProgramStringEXT) #define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT) #define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT) #define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT) #define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT) #define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT) #define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT) #define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT) #define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT) #define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT) #define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT) #define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT) #define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT) #define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT) #define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT) #define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT) #define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT) #define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT) #define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT) #define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT) #define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT) #define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT) #define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT) #define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT) #define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT) #define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT) #define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT) #define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT) #define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT) #define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT) #define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT) #define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT) #define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT) #define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT) #define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT) #define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT) #define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT) #define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT) #define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT) #define glTextureImage1DEXT GLEW_GET_FUN(__glewTextureImage1DEXT) #define glTextureImage2DEXT GLEW_GET_FUN(__glewTextureImage2DEXT) #define glTextureImage3DEXT GLEW_GET_FUN(__glewTextureImage3DEXT) #define glTextureParameterIivEXT GLEW_GET_FUN(__glewTextureParameterIivEXT) #define glTextureParameterIuivEXT GLEW_GET_FUN(__glewTextureParameterIuivEXT) #define glTextureParameterfEXT GLEW_GET_FUN(__glewTextureParameterfEXT) #define glTextureParameterfvEXT GLEW_GET_FUN(__glewTextureParameterfvEXT) #define glTextureParameteriEXT GLEW_GET_FUN(__glewTextureParameteriEXT) #define glTextureParameterivEXT GLEW_GET_FUN(__glewTextureParameterivEXT) #define glTextureRenderbufferEXT GLEW_GET_FUN(__glewTextureRenderbufferEXT) #define glTextureSubImage1DEXT GLEW_GET_FUN(__glewTextureSubImage1DEXT) #define glTextureSubImage2DEXT GLEW_GET_FUN(__glewTextureSubImage2DEXT) #define glTextureSubImage3DEXT GLEW_GET_FUN(__glewTextureSubImage3DEXT) #define glUnmapNamedBufferEXT GLEW_GET_FUN(__glewUnmapNamedBufferEXT) #define glVertexArrayColorOffsetEXT GLEW_GET_FUN(__glewVertexArrayColorOffsetEXT) #define glVertexArrayEdgeFlagOffsetEXT GLEW_GET_FUN(__glewVertexArrayEdgeFlagOffsetEXT) #define glVertexArrayFogCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayFogCoordOffsetEXT) #define glVertexArrayIndexOffsetEXT GLEW_GET_FUN(__glewVertexArrayIndexOffsetEXT) #define glVertexArrayMultiTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayMultiTexCoordOffsetEXT) #define glVertexArrayNormalOffsetEXT GLEW_GET_FUN(__glewVertexArrayNormalOffsetEXT) #define glVertexArraySecondaryColorOffsetEXT GLEW_GET_FUN(__glewVertexArraySecondaryColorOffsetEXT) #define glVertexArrayTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayTexCoordOffsetEXT) #define glVertexArrayVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribDivisorEXT) #define glVertexArrayVertexAttribIOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIOffsetEXT) #define glVertexArrayVertexAttribOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribOffsetEXT) #define glVertexArrayVertexOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexOffsetEXT) #define GLEW_EXT_direct_state_access GLEW_GET_VAR(__GLEW_EXT_direct_state_access) #endif /* GL_EXT_direct_state_access */ /* ----------------------- GL_EXT_discard_framebuffer ---------------------- */ #ifndef GL_EXT_discard_framebuffer #define GL_EXT_discard_framebuffer 1 #define GL_COLOR_EXT 0x1800 #define GL_DEPTH_EXT 0x1801 #define GL_STENCIL_EXT 0x1802 typedef void (GLAPIENTRY * PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); #define glDiscardFramebufferEXT GLEW_GET_FUN(__glewDiscardFramebufferEXT) #define GLEW_EXT_discard_framebuffer GLEW_GET_VAR(__GLEW_EXT_discard_framebuffer) #endif /* GL_EXT_discard_framebuffer */ /* -------------------------- GL_EXT_draw_buffers -------------------------- */ #ifndef GL_EXT_draw_buffers #define GL_EXT_draw_buffers 1 #define GL_MAX_DRAW_BUFFERS_EXT 0x8824 #define GL_DRAW_BUFFER0_EXT 0x8825 #define GL_DRAW_BUFFER1_EXT 0x8826 #define GL_DRAW_BUFFER2_EXT 0x8827 #define GL_DRAW_BUFFER3_EXT 0x8828 #define GL_DRAW_BUFFER4_EXT 0x8829 #define GL_DRAW_BUFFER5_EXT 0x882A #define GL_DRAW_BUFFER6_EXT 0x882B #define GL_DRAW_BUFFER7_EXT 0x882C #define GL_DRAW_BUFFER8_EXT 0x882D #define GL_DRAW_BUFFER9_EXT 0x882E #define GL_DRAW_BUFFER10_EXT 0x882F #define GL_DRAW_BUFFER11_EXT 0x8830 #define GL_DRAW_BUFFER12_EXT 0x8831 #define GL_DRAW_BUFFER13_EXT 0x8832 #define GL_DRAW_BUFFER14_EXT 0x8833 #define GL_DRAW_BUFFER15_EXT 0x8834 #define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF #define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 #define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 #define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 #define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 #define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 #define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 #define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 #define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 #define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 #define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 #define GL_COLOR_ATTACHMENT10_EXT 0x8CEA #define GL_COLOR_ATTACHMENT11_EXT 0x8CEB #define GL_COLOR_ATTACHMENT12_EXT 0x8CEC #define GL_COLOR_ATTACHMENT13_EXT 0x8CED #define GL_COLOR_ATTACHMENT14_EXT 0x8CEE #define GL_COLOR_ATTACHMENT15_EXT 0x8CEF typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum* bufs); #define glDrawBuffersEXT GLEW_GET_FUN(__glewDrawBuffersEXT) #define GLEW_EXT_draw_buffers GLEW_GET_VAR(__GLEW_EXT_draw_buffers) #endif /* GL_EXT_draw_buffers */ /* -------------------------- GL_EXT_draw_buffers2 ------------------------- */ #ifndef GL_EXT_draw_buffers2 #define GL_EXT_draw_buffers2 1 typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum value, GLuint index, GLboolean* data); typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum value, GLuint index, GLint* data); typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); #define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT) #define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT) #define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT) #define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT) #define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT) #define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT) #define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2) #endif /* GL_EXT_draw_buffers2 */ /* ---------------------- GL_EXT_draw_buffers_indexed ---------------------- */ #ifndef GL_EXT_draw_buffers_indexed #define GL_EXT_draw_buffers_indexed 1 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIEXTPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIEXTPROC) (GLuint buf, GLenum mode); typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIEXTPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); typedef void (GLAPIENTRY * PFNGLBLENDFUNCIEXTPROC) (GLuint buf, GLenum src, GLenum dst); typedef void (GLAPIENTRY * PFNGLCOLORMASKIEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); typedef void (GLAPIENTRY * PFNGLDISABLEIEXTPROC) (GLenum target, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEIEXTPROC) (GLenum target, GLuint index); typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIEXTPROC) (GLenum target, GLuint index); #define glBlendEquationSeparateiEXT GLEW_GET_FUN(__glewBlendEquationSeparateiEXT) #define glBlendEquationiEXT GLEW_GET_FUN(__glewBlendEquationiEXT) #define glBlendFuncSeparateiEXT GLEW_GET_FUN(__glewBlendFuncSeparateiEXT) #define glBlendFunciEXT GLEW_GET_FUN(__glewBlendFunciEXT) #define glColorMaskiEXT GLEW_GET_FUN(__glewColorMaskiEXT) #define glDisableiEXT GLEW_GET_FUN(__glewDisableiEXT) #define glEnableiEXT GLEW_GET_FUN(__glewEnableiEXT) #define glIsEnablediEXT GLEW_GET_FUN(__glewIsEnablediEXT) #define GLEW_EXT_draw_buffers_indexed GLEW_GET_VAR(__GLEW_EXT_draw_buffers_indexed) #endif /* GL_EXT_draw_buffers_indexed */ /* -------------------- GL_EXT_draw_elements_base_vertex ------------------- */ #ifndef GL_EXT_draw_elements_base_vertex #define GL_EXT_draw_elements_base_vertex 1 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); #define glDrawElementsBaseVertexEXT GLEW_GET_FUN(__glewDrawElementsBaseVertexEXT) #define glDrawElementsInstancedBaseVertexEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexEXT) #define glDrawRangeElementsBaseVertexEXT GLEW_GET_FUN(__glewDrawRangeElementsBaseVertexEXT) #define glMultiDrawElementsBaseVertexEXT GLEW_GET_FUN(__glewMultiDrawElementsBaseVertexEXT) #define GLEW_EXT_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_EXT_draw_elements_base_vertex) #endif /* GL_EXT_draw_elements_base_vertex */ /* ------------------------- GL_EXT_draw_instanced ------------------------- */ #ifndef GL_EXT_draw_instanced #define GL_EXT_draw_instanced 1 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); #define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT) #define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT) #define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced) #endif /* GL_EXT_draw_instanced */ /* ----------------------- GL_EXT_draw_range_elements ---------------------- */ #ifndef GL_EXT_draw_range_elements #define GL_EXT_draw_range_elements 1 #define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 #define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); #define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT) #define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements) #endif /* GL_EXT_draw_range_elements */ /* ------------------------- GL_EXT_external_buffer ------------------------ */ #ifndef GL_EXT_external_buffer #define GL_EXT_external_buffer 1 typedef void* GLeglClientBufferEXT; typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEEXTERNALEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); #define glBufferStorageExternalEXT GLEW_GET_FUN(__glewBufferStorageExternalEXT) #define glNamedBufferStorageExternalEXT GLEW_GET_FUN(__glewNamedBufferStorageExternalEXT) #define GLEW_EXT_external_buffer GLEW_GET_VAR(__GLEW_EXT_external_buffer) #endif /* GL_EXT_external_buffer */ /* --------------------------- GL_EXT_float_blend -------------------------- */ #ifndef GL_EXT_float_blend #define GL_EXT_float_blend 1 #define GLEW_EXT_float_blend GLEW_GET_VAR(__GLEW_EXT_float_blend) #endif /* GL_EXT_float_blend */ /* ---------------------------- GL_EXT_fog_coord --------------------------- */ #ifndef GL_EXT_fog_coord #define GL_EXT_fog_coord 1 #define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 #define GL_FOG_COORDINATE_EXT 0x8451 #define GL_FRAGMENT_DEPTH_EXT 0x8452 #define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 #define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 #define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 #define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 #define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); #define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT) #define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT) #define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT) #define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT) #define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT) #define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord) #endif /* GL_EXT_fog_coord */ /* --------------------------- GL_EXT_frag_depth --------------------------- */ #ifndef GL_EXT_frag_depth #define GL_EXT_frag_depth 1 #define GLEW_EXT_frag_depth GLEW_GET_VAR(__GLEW_EXT_frag_depth) #endif /* GL_EXT_frag_depth */ /* ------------------------ GL_EXT_fragment_lighting ----------------------- */ #ifndef GL_EXT_fragment_lighting #define GL_EXT_fragment_lighting 1 #define GL_FRAGMENT_LIGHTING_EXT 0x8400 #define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 #define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 #define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 #define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 #define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 #define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 #define GL_LIGHT_ENV_MODE_EXT 0x8407 #define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 #define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 #define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A #define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B #define GL_FRAGMENT_LIGHT0_EXT 0x840C #define GL_FRAGMENT_LIGHT7_EXT 0x8413 typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); #define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT) #define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT) #define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT) #define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT) #define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT) #define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT) #define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT) #define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT) #define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT) #define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT) #define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT) #define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT) #define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT) #define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT) #define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT) #define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT) #define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT) #define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT) #define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting) #endif /* GL_EXT_fragment_lighting */ /* ------------------------ GL_EXT_framebuffer_blit ------------------------ */ #ifndef GL_EXT_framebuffer_blit #define GL_EXT_framebuffer_blit 1 #define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 #define GL_READ_FRAMEBUFFER_EXT 0x8CA8 #define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 #define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); #define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT) #define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit) #endif /* GL_EXT_framebuffer_blit */ /* --------------------- GL_EXT_framebuffer_multisample -------------------- */ #ifndef GL_EXT_framebuffer_multisample #define GL_EXT_framebuffer_multisample 1 #define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 #define GL_MAX_SAMPLES_EXT 0x8D57 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); #define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT) #define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample) #endif /* GL_EXT_framebuffer_multisample */ /* --------------- GL_EXT_framebuffer_multisample_blit_scaled -------------- */ #ifndef GL_EXT_framebuffer_multisample_blit_scaled #define GL_EXT_framebuffer_multisample_blit_scaled 1 #define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA #define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB #define GLEW_EXT_framebuffer_multisample_blit_scaled GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample_blit_scaled) #endif /* GL_EXT_framebuffer_multisample_blit_scaled */ /* ----------------------- GL_EXT_framebuffer_object ----------------------- */ #ifndef GL_EXT_framebuffer_object #define GL_EXT_framebuffer_object 1 #define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 #define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 #define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 #define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 #define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 #define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 #define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC #define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD #define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF #define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 #define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 #define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 #define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 #define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 #define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 #define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 #define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 #define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 #define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 #define GL_COLOR_ATTACHMENT10_EXT 0x8CEA #define GL_COLOR_ATTACHMENT11_EXT 0x8CEB #define GL_COLOR_ATTACHMENT12_EXT 0x8CEC #define GL_COLOR_ATTACHMENT13_EXT 0x8CED #define GL_COLOR_ATTACHMENT14_EXT 0x8CEE #define GL_COLOR_ATTACHMENT15_EXT 0x8CEF #define GL_DEPTH_ATTACHMENT_EXT 0x8D00 #define GL_STENCIL_ATTACHMENT_EXT 0x8D20 #define GL_FRAMEBUFFER_EXT 0x8D40 #define GL_RENDERBUFFER_EXT 0x8D41 #define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 #define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 #define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 #define GL_STENCIL_INDEX1_EXT 0x8D46 #define GL_STENCIL_INDEX4_EXT 0x8D47 #define GL_STENCIL_INDEX8_EXT 0x8D48 #define GL_STENCIL_INDEX16_EXT 0x8D49 #define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 #define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 #define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 #define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 #define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 #define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); #define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT) #define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT) #define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT) #define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT) #define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT) #define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT) #define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT) #define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT) #define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT) #define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT) #define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT) #define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT) #define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT) #define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT) #define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT) #define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT) #define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT) #define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object) #endif /* GL_EXT_framebuffer_object */ /* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */ #ifndef GL_EXT_framebuffer_sRGB #define GL_EXT_framebuffer_sRGB 1 #define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 #define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA #define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB) #endif /* GL_EXT_framebuffer_sRGB */ /* ----------------------- GL_EXT_geometry_point_size ---------------------- */ #ifndef GL_EXT_geometry_point_size #define GL_EXT_geometry_point_size 1 #define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 #define GL_LINES_ADJACENCY_EXT 0xA #define GL_LINE_STRIP_ADJACENCY_EXT 0xB #define GL_TRIANGLES_ADJACENCY_EXT 0xC #define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD #define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E #define GL_UNDEFINED_VERTEX_EXT 0x8260 #define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F #define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 #define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 #define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 #define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C #define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 #define GL_PRIMITIVES_GENERATED_EXT 0x8C87 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 #define GL_GEOMETRY_SHADER_EXT 0x8DD9 #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 #define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D #define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E #define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A #define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD #define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 #define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 #define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 #define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF #define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 #define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 #define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 #define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 #define GLEW_EXT_geometry_point_size GLEW_GET_VAR(__GLEW_EXT_geometry_point_size) #endif /* GL_EXT_geometry_point_size */ /* ------------------------- GL_EXT_geometry_shader ------------------------ */ #ifndef GL_EXT_geometry_shader #define GL_EXT_geometry_shader 1 #define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 #define GL_LINES_ADJACENCY_EXT 0xA #define GL_LINE_STRIP_ADJACENCY_EXT 0xB #define GL_TRIANGLES_ADJACENCY_EXT 0xC #define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD #define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E #define GL_UNDEFINED_VERTEX_EXT 0x8260 #define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F #define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 #define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 #define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 #define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C #define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 #define GL_PRIMITIVES_GENERATED_EXT 0x8C87 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 #define GL_GEOMETRY_SHADER_EXT 0x8DD9 #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 #define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D #define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E #define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A #define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD #define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 #define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 #define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 #define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF #define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 #define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 #define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 #define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 #define GLEW_EXT_geometry_shader GLEW_GET_VAR(__GLEW_EXT_geometry_shader) #endif /* GL_EXT_geometry_shader */ /* ------------------------ GL_EXT_geometry_shader4 ------------------------ */ #ifndef GL_EXT_geometry_shader4 #define GL_EXT_geometry_shader4 1 #define GL_LINES_ADJACENCY_EXT 0xA #define GL_LINE_STRIP_ADJACENCY_EXT 0xB #define GL_TRIANGLES_ADJACENCY_EXT 0xC #define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD #define GL_PROGRAM_POINT_SIZE_EXT 0x8642 #define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 #define GL_GEOMETRY_SHADER_EXT 0x8DD9 #define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA #define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB #define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC #define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD #define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); #define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT) #define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT) #define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT) #define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4) #endif /* GL_EXT_geometry_shader4 */ /* --------------------- GL_EXT_gpu_program_parameters --------------------- */ #ifndef GL_EXT_gpu_program_parameters #define GL_EXT_gpu_program_parameters 1 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); #define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT) #define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT) #define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters) #endif /* GL_EXT_gpu_program_parameters */ /* --------------------------- GL_EXT_gpu_shader4 -------------------------- */ #ifndef GL_EXT_gpu_shader4 #define GL_EXT_gpu_shader4 1 #define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD #define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 #define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 #define GL_SAMPLER_BUFFER_EXT 0x8DC2 #define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 #define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 #define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 #define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 #define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 #define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 #define GL_INT_SAMPLER_1D_EXT 0x8DC9 #define GL_INT_SAMPLER_2D_EXT 0x8DCA #define GL_INT_SAMPLER_3D_EXT 0x8DCB #define GL_INT_SAMPLER_CUBE_EXT 0x8DCC #define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD #define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE #define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF #define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 #define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 #define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 #define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 #define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 #define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 #define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 #define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 #define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); #define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT) #define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT) #define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT) #define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT) #define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT) #define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT) #define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT) #define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT) #define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT) #define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT) #define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT) #define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT) #define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT) #define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT) #define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT) #define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT) #define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT) #define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT) #define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT) #define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT) #define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT) #define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT) #define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT) #define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT) #define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT) #define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT) #define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT) #define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT) #define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT) #define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT) #define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT) #define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT) #define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT) #define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT) #define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4) #endif /* GL_EXT_gpu_shader4 */ /* --------------------------- GL_EXT_gpu_shader5 -------------------------- */ #ifndef GL_EXT_gpu_shader5 #define GL_EXT_gpu_shader5 1 #define GLEW_EXT_gpu_shader5 GLEW_GET_VAR(__GLEW_EXT_gpu_shader5) #endif /* GL_EXT_gpu_shader5 */ /* ---------------------------- GL_EXT_histogram --------------------------- */ #ifndef GL_EXT_histogram #define GL_EXT_histogram 1 #define GL_HISTOGRAM_EXT 0x8024 #define GL_PROXY_HISTOGRAM_EXT 0x8025 #define GL_HISTOGRAM_WIDTH_EXT 0x8026 #define GL_HISTOGRAM_FORMAT_EXT 0x8027 #define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 #define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 #define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A #define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B #define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C #define GL_HISTOGRAM_SINK_EXT 0x802D #define GL_MINMAX_EXT 0x802E #define GL_MINMAX_FORMAT_EXT 0x802F #define GL_MINMAX_SINK_EXT 0x8030 typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); #define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT) #define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT) #define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT) #define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT) #define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT) #define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT) #define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT) #define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT) #define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT) #define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT) #define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram) #endif /* GL_EXT_histogram */ /* ----------------------- GL_EXT_index_array_formats ---------------------- */ #ifndef GL_EXT_index_array_formats #define GL_EXT_index_array_formats 1 #define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats) #endif /* GL_EXT_index_array_formats */ /* --------------------------- GL_EXT_index_func --------------------------- */ #ifndef GL_EXT_index_func #define GL_EXT_index_func 1 typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref); #define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT) #define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func) #endif /* GL_EXT_index_func */ /* ------------------------- GL_EXT_index_material ------------------------- */ #ifndef GL_EXT_index_material #define GL_EXT_index_material 1 typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); #define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT) #define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material) #endif /* GL_EXT_index_material */ /* -------------------------- GL_EXT_index_texture ------------------------- */ #ifndef GL_EXT_index_texture #define GL_EXT_index_texture 1 #define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture) #endif /* GL_EXT_index_texture */ /* ------------------------ GL_EXT_instanced_arrays ------------------------ */ #ifndef GL_EXT_instanced_arrays #define GL_EXT_instanced_arrays 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); #define glVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexAttribDivisorEXT) #define GLEW_EXT_instanced_arrays GLEW_GET_VAR(__GLEW_EXT_instanced_arrays) #endif /* GL_EXT_instanced_arrays */ /* -------------------------- GL_EXT_light_texture ------------------------- */ #ifndef GL_EXT_light_texture #define GL_EXT_light_texture 1 #define GL_FRAGMENT_MATERIAL_EXT 0x8349 #define GL_FRAGMENT_NORMAL_EXT 0x834A #define GL_FRAGMENT_COLOR_EXT 0x834C #define GL_ATTENUATION_EXT 0x834D #define GL_SHADOW_ATTENUATION_EXT 0x834E #define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F #define GL_TEXTURE_LIGHT_EXT 0x8350 #define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 #define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); #define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT) #define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT) #define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT) #define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture) #endif /* GL_EXT_light_texture */ /* ------------------------ GL_EXT_map_buffer_range ------------------------ */ #ifndef GL_EXT_map_buffer_range #define GL_EXT_map_buffer_range 1 #define GL_MAP_READ_BIT_EXT 0x0001 #define GL_MAP_WRITE_BIT_EXT 0x0002 #define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 #define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 #define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 #define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); #define glFlushMappedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedBufferRangeEXT) #define glMapBufferRangeEXT GLEW_GET_FUN(__glewMapBufferRangeEXT) #define GLEW_EXT_map_buffer_range GLEW_GET_VAR(__GLEW_EXT_map_buffer_range) #endif /* GL_EXT_map_buffer_range */ /* -------------------------- GL_EXT_memory_object ------------------------- */ #ifndef GL_EXT_memory_object #define GL_EXT_memory_object 1 #define GL_UUID_SIZE_EXT 16 #define GL_TEXTURE_TILING_EXT 0x9580 #define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581 #define GL_NUM_TILING_TYPES_EXT 0x9582 #define GL_TILING_TYPES_EXT 0x9583 #define GL_OPTIMAL_TILING_EXT 0x9584 #define GL_LINEAR_TILING_EXT 0x9585 #define GL_LAYOUT_GENERAL_EXT 0x958D #define GL_LAYOUT_COLOR_ATTACHMENT_EXT 0x958E #define GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT 0x958F #define GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT 0x9590 #define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 #define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 #define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 #define GL_NUM_DEVICE_UUIDS_EXT 0x9596 #define GL_DEVICE_UUID_EXT 0x9597 #define GL_DRIVER_UUID_EXT 0x9598 #define GL_PROTECTED_MEMORY_OBJECT_EXT 0x959B typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEMEMEXTPROC) (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); typedef void (GLAPIENTRY * PFNGLCREATEMEMORYOBJECTSEXTPROC) (GLsizei n, GLuint* memoryObjects); typedef void (GLAPIENTRY * PFNGLDELETEMEMORYOBJECTSEXTPROC) (GLsizei n, const GLuint* memoryObjects); typedef void (GLAPIENTRY * PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETUNSIGNEDBYTEI_VEXTPROC) (GLenum target, GLuint index, GLubyte* data); typedef void (GLAPIENTRY * PFNGLGETUNSIGNEDBYTEVEXTPROC) (GLenum pname, GLubyte* data); typedef GLboolean (GLAPIENTRY * PFNGLISMEMORYOBJECTEXTPROC) (GLuint memoryObject); typedef void (GLAPIENTRY * PFNGLMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC) (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM1DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM2DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM3DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); #define glBufferStorageMemEXT GLEW_GET_FUN(__glewBufferStorageMemEXT) #define glCreateMemoryObjectsEXT GLEW_GET_FUN(__glewCreateMemoryObjectsEXT) #define glDeleteMemoryObjectsEXT GLEW_GET_FUN(__glewDeleteMemoryObjectsEXT) #define glGetMemoryObjectParameterivEXT GLEW_GET_FUN(__glewGetMemoryObjectParameterivEXT) #define glGetUnsignedBytei_vEXT GLEW_GET_FUN(__glewGetUnsignedBytei_vEXT) #define glGetUnsignedBytevEXT GLEW_GET_FUN(__glewGetUnsignedBytevEXT) #define glIsMemoryObjectEXT GLEW_GET_FUN(__glewIsMemoryObjectEXT) #define glMemoryObjectParameterivEXT GLEW_GET_FUN(__glewMemoryObjectParameterivEXT) #define glNamedBufferStorageMemEXT GLEW_GET_FUN(__glewNamedBufferStorageMemEXT) #define glTexStorageMem1DEXT GLEW_GET_FUN(__glewTexStorageMem1DEXT) #define glTexStorageMem2DEXT GLEW_GET_FUN(__glewTexStorageMem2DEXT) #define glTexStorageMem2DMultisampleEXT GLEW_GET_FUN(__glewTexStorageMem2DMultisampleEXT) #define glTexStorageMem3DEXT GLEW_GET_FUN(__glewTexStorageMem3DEXT) #define glTexStorageMem3DMultisampleEXT GLEW_GET_FUN(__glewTexStorageMem3DMultisampleEXT) #define glTextureStorageMem1DEXT GLEW_GET_FUN(__glewTextureStorageMem1DEXT) #define glTextureStorageMem2DEXT GLEW_GET_FUN(__glewTextureStorageMem2DEXT) #define glTextureStorageMem2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorageMem2DMultisampleEXT) #define glTextureStorageMem3DEXT GLEW_GET_FUN(__glewTextureStorageMem3DEXT) #define glTextureStorageMem3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorageMem3DMultisampleEXT) #define GLEW_EXT_memory_object GLEW_GET_VAR(__GLEW_EXT_memory_object) #endif /* GL_EXT_memory_object */ /* ------------------------ GL_EXT_memory_object_fd ------------------------ */ #ifndef GL_EXT_memory_object_fd #define GL_EXT_memory_object_fd 1 #define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYFDEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); #define glImportMemoryFdEXT GLEW_GET_FUN(__glewImportMemoryFdEXT) #define GLEW_EXT_memory_object_fd GLEW_GET_VAR(__GLEW_EXT_memory_object_fd) #endif /* GL_EXT_memory_object_fd */ /* ----------------------- GL_EXT_memory_object_win32 ---------------------- */ #ifndef GL_EXT_memory_object_win32 #define GL_EXT_memory_object_win32 1 #define GL_LUID_SIZE_EXT 8 #define GL_HANDLE_TYPE_OPAQUE_WIN32_EXT 0x9587 #define GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT 0x9588 #define GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT 0x9589 #define GL_HANDLE_TYPE_D3D12_RESOURCE_EXT 0x958A #define GL_HANDLE_TYPE_D3D11_IMAGE_EXT 0x958B #define GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT 0x958C #define GL_HANDLE_TYPE_D3D12_FENCE_EXT 0x9594 #define GL_D3D12_FENCE_VALUE_EXT 0x9595 #define GL_DEVICE_LUID_EXT 0x9599 #define GL_DEVICE_NODE_MASK_EXT 0x959A typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, void *handle); typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYWIN32NAMEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, const void *name); #define glImportMemoryWin32HandleEXT GLEW_GET_FUN(__glewImportMemoryWin32HandleEXT) #define glImportMemoryWin32NameEXT GLEW_GET_FUN(__glewImportMemoryWin32NameEXT) #define GLEW_EXT_memory_object_win32 GLEW_GET_VAR(__GLEW_EXT_memory_object_win32) #endif /* GL_EXT_memory_object_win32 */ /* ------------------------- GL_EXT_misc_attribute ------------------------- */ #ifndef GL_EXT_misc_attribute #define GL_EXT_misc_attribute 1 #define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute) #endif /* GL_EXT_misc_attribute */ /* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */ #ifndef GL_EXT_multi_draw_arrays #define GL_EXT_multi_draw_arrays 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount); #define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) #define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) #define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays) #endif /* GL_EXT_multi_draw_arrays */ /* ----------------------- GL_EXT_multi_draw_indirect ---------------------- */ #ifndef GL_EXT_multi_draw_indirect #define GL_EXT_multi_draw_indirect 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); #define glMultiDrawArraysIndirectEXT GLEW_GET_FUN(__glewMultiDrawArraysIndirectEXT) #define glMultiDrawElementsIndirectEXT GLEW_GET_FUN(__glewMultiDrawElementsIndirectEXT) #define GLEW_EXT_multi_draw_indirect GLEW_GET_VAR(__GLEW_EXT_multi_draw_indirect) #endif /* GL_EXT_multi_draw_indirect */ /* ------------------------ GL_EXT_multiple_textures ----------------------- */ #ifndef GL_EXT_multiple_textures #define GL_EXT_multiple_textures 1 #define GLEW_EXT_multiple_textures GLEW_GET_VAR(__GLEW_EXT_multiple_textures) #endif /* GL_EXT_multiple_textures */ /* --------------------------- GL_EXT_multisample -------------------------- */ #ifndef GL_EXT_multisample #define GL_EXT_multisample 1 #define GL_MULTISAMPLE_EXT 0x809D #define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F #define GL_SAMPLE_MASK_EXT 0x80A0 #define GL_1PASS_EXT 0x80A1 #define GL_2PASS_0_EXT 0x80A2 #define GL_2PASS_1_EXT 0x80A3 #define GL_4PASS_0_EXT 0x80A4 #define GL_4PASS_1_EXT 0x80A5 #define GL_4PASS_2_EXT 0x80A6 #define GL_4PASS_3_EXT 0x80A7 #define GL_SAMPLE_BUFFERS_EXT 0x80A8 #define GL_SAMPLES_EXT 0x80A9 #define GL_SAMPLE_MASK_VALUE_EXT 0x80AA #define GL_SAMPLE_MASK_INVERT_EXT 0x80AB #define GL_SAMPLE_PATTERN_EXT 0x80AC #define GL_MULTISAMPLE_BIT_EXT 0x20000000 typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); #define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT) #define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT) #define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample) #endif /* GL_EXT_multisample */ /* -------------------- GL_EXT_multisample_compatibility ------------------- */ #ifndef GL_EXT_multisample_compatibility #define GL_EXT_multisample_compatibility 1 #define GL_MULTISAMPLE_EXT 0x809D #define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F #define GLEW_EXT_multisample_compatibility GLEW_GET_VAR(__GLEW_EXT_multisample_compatibility) #endif /* GL_EXT_multisample_compatibility */ /* ----------------- GL_EXT_multisampled_render_to_texture ----------------- */ #ifndef GL_EXT_multisampled_render_to_texture #define GL_EXT_multisampled_render_to_texture 1 #define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 #define GL_MAX_SAMPLES_EXT 0x8D57 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); #define glFramebufferTexture2DMultisampleEXT GLEW_GET_FUN(__glewFramebufferTexture2DMultisampleEXT) #define GLEW_EXT_multisampled_render_to_texture GLEW_GET_VAR(__GLEW_EXT_multisampled_render_to_texture) #endif /* GL_EXT_multisampled_render_to_texture */ /* ----------------- GL_EXT_multisampled_render_to_texture2 ---------------- */ #ifndef GL_EXT_multisampled_render_to_texture2 #define GL_EXT_multisampled_render_to_texture2 1 #define GLEW_EXT_multisampled_render_to_texture2 GLEW_GET_VAR(__GLEW_EXT_multisampled_render_to_texture2) #endif /* GL_EXT_multisampled_render_to_texture2 */ /* --------------------- GL_EXT_multiview_draw_buffers --------------------- */ #ifndef GL_EXT_multiview_draw_buffers #define GL_EXT_multiview_draw_buffers 1 #define GL_DRAW_BUFFER_EXT 0x0C01 #define GL_READ_BUFFER_EXT 0x0C02 #define GL_COLOR_ATTACHMENT_EXT 0x90F0 #define GL_MULTIVIEW_EXT 0x90F1 #define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum* location, const GLint *indices); typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint* data); typedef void (GLAPIENTRY * PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); #define glDrawBuffersIndexedEXT GLEW_GET_FUN(__glewDrawBuffersIndexedEXT) #define glGetIntegeri_vEXT GLEW_GET_FUN(__glewGetIntegeri_vEXT) #define glReadBufferIndexedEXT GLEW_GET_FUN(__glewReadBufferIndexedEXT) #define GLEW_EXT_multiview_draw_buffers GLEW_GET_VAR(__GLEW_EXT_multiview_draw_buffers) #endif /* GL_EXT_multiview_draw_buffers */ /* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */ #ifndef GL_EXT_packed_depth_stencil #define GL_EXT_packed_depth_stencil 1 #define GL_DEPTH_STENCIL_EXT 0x84F9 #define GL_UNSIGNED_INT_24_8_EXT 0x84FA #define GL_DEPTH24_STENCIL8_EXT 0x88F0 #define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 #define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil) #endif /* GL_EXT_packed_depth_stencil */ /* -------------------------- GL_EXT_packed_float -------------------------- */ #ifndef GL_EXT_packed_float #define GL_EXT_packed_float 1 #define GL_R11F_G11F_B10F_EXT 0x8C3A #define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B #define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C #define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float) #endif /* GL_EXT_packed_float */ /* -------------------------- GL_EXT_packed_pixels ------------------------- */ #ifndef GL_EXT_packed_pixels #define GL_EXT_packed_pixels 1 #define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 #define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 #define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 #define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 #define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 #define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels) #endif /* GL_EXT_packed_pixels */ /* ------------------------ GL_EXT_paletted_texture ------------------------ */ #ifndef GL_EXT_paletted_texture #define GL_EXT_paletted_texture 1 #define GL_TEXTURE_1D 0x0DE0 #define GL_TEXTURE_2D 0x0DE1 #define GL_PROXY_TEXTURE_1D 0x8063 #define GL_PROXY_TEXTURE_2D 0x8064 #define GL_COLOR_TABLE_FORMAT_EXT 0x80D8 #define GL_COLOR_TABLE_WIDTH_EXT 0x80D9 #define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF #define GL_COLOR_INDEX1_EXT 0x80E2 #define GL_COLOR_INDEX2_EXT 0x80E3 #define GL_COLOR_INDEX4_EXT 0x80E4 #define GL_COLOR_INDEX8_EXT 0x80E5 #define GL_COLOR_INDEX12_EXT 0x80E6 #define GL_COLOR_INDEX16_EXT 0x80E7 #define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED #define GL_TEXTURE_CUBE_MAP_ARB 0x8513 #define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); #define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT) #define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT) #define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT) #define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT) #define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture) #endif /* GL_EXT_paletted_texture */ /* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */ #ifndef GL_EXT_pixel_buffer_object #define GL_EXT_pixel_buffer_object 1 #define GL_PIXEL_PACK_BUFFER_EXT 0x88EB #define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF #define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object) #endif /* GL_EXT_pixel_buffer_object */ /* ------------------------- GL_EXT_pixel_transform ------------------------ */ #ifndef GL_EXT_pixel_transform #define GL_EXT_pixel_transform 1 #define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 #define GL_PIXEL_MAG_FILTER_EXT 0x8331 #define GL_PIXEL_MIN_FILTER_EXT 0x8332 #define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 #define GL_CUBIC_EXT 0x8334 #define GL_AVERAGE_EXT 0x8335 #define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 #define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 #define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); #define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT) #define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT) #define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT) #define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT) #define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT) #define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT) #define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform) #endif /* GL_EXT_pixel_transform */ /* ------------------- GL_EXT_pixel_transform_color_table ------------------ */ #ifndef GL_EXT_pixel_transform_color_table #define GL_EXT_pixel_transform_color_table 1 #define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table) #endif /* GL_EXT_pixel_transform_color_table */ /* ------------------------ GL_EXT_point_parameters ------------------------ */ #ifndef GL_EXT_point_parameters #define GL_EXT_point_parameters 1 #define GL_POINT_SIZE_MIN_EXT 0x8126 #define GL_POINT_SIZE_MAX_EXT 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 #define GL_DISTANCE_ATTENUATION_EXT 0x8129 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat* params); #define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT) #define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT) #define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters) #endif /* GL_EXT_point_parameters */ /* ------------------------- GL_EXT_polygon_offset ------------------------- */ #ifndef GL_EXT_polygon_offset #define GL_EXT_polygon_offset 1 #define GL_POLYGON_OFFSET_EXT 0x8037 #define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 #define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); #define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT) #define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset) #endif /* GL_EXT_polygon_offset */ /* ---------------------- GL_EXT_polygon_offset_clamp ---------------------- */ #ifndef GL_EXT_polygon_offset_clamp #define GL_EXT_polygon_offset_clamp 1 #define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); #define glPolygonOffsetClampEXT GLEW_GET_FUN(__glewPolygonOffsetClampEXT) #define GLEW_EXT_polygon_offset_clamp GLEW_GET_VAR(__GLEW_EXT_polygon_offset_clamp) #endif /* GL_EXT_polygon_offset_clamp */ /* ----------------------- GL_EXT_post_depth_coverage ---------------------- */ #ifndef GL_EXT_post_depth_coverage #define GL_EXT_post_depth_coverage 1 #define GLEW_EXT_post_depth_coverage GLEW_GET_VAR(__GLEW_EXT_post_depth_coverage) #endif /* GL_EXT_post_depth_coverage */ /* ------------------------ GL_EXT_provoking_vertex ------------------------ */ #ifndef GL_EXT_provoking_vertex #define GL_EXT_provoking_vertex 1 #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C #define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D #define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E #define GL_PROVOKING_VERTEX_EXT 0x8E4F typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); #define glProvokingVertexEXT GLEW_GET_FUN(__glewProvokingVertexEXT) #define GLEW_EXT_provoking_vertex GLEW_GET_VAR(__GLEW_EXT_provoking_vertex) #endif /* GL_EXT_provoking_vertex */ /* --------------------------- GL_EXT_pvrtc_sRGB --------------------------- */ #ifndef GL_EXT_pvrtc_sRGB #define GL_EXT_pvrtc_sRGB 1 #define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 #define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 #define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 #define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 #define GLEW_EXT_pvrtc_sRGB GLEW_GET_VAR(__GLEW_EXT_pvrtc_sRGB) #endif /* GL_EXT_pvrtc_sRGB */ /* ----------------------- GL_EXT_raster_multisample ----------------------- */ #ifndef GL_EXT_raster_multisample #define GL_EXT_raster_multisample 1 #define GL_COLOR_SAMPLES_NV 0x8E20 #define GL_RASTER_MULTISAMPLE_EXT 0x9327 #define GL_RASTER_SAMPLES_EXT 0x9328 #define GL_MAX_RASTER_SAMPLES_EXT 0x9329 #define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A #define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B #define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C #define GL_DEPTH_SAMPLES_NV 0x932D #define GL_STENCIL_SAMPLES_NV 0x932E #define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F #define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 #define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 #define GL_COVERAGE_MODULATION_NV 0x9332 #define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat* v); typedef void (GLAPIENTRY * PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); #define glCoverageModulationNV GLEW_GET_FUN(__glewCoverageModulationNV) #define glCoverageModulationTableNV GLEW_GET_FUN(__glewCoverageModulationTableNV) #define glGetCoverageModulationTableNV GLEW_GET_FUN(__glewGetCoverageModulationTableNV) #define glRasterSamplesEXT GLEW_GET_FUN(__glewRasterSamplesEXT) #define GLEW_EXT_raster_multisample GLEW_GET_VAR(__GLEW_EXT_raster_multisample) #endif /* GL_EXT_raster_multisample */ /* ------------------------ GL_EXT_read_format_bgra ------------------------ */ #ifndef GL_EXT_read_format_bgra #define GL_EXT_read_format_bgra 1 #define GL_BGRA_EXT 0x80E1 #define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 #define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 #define GLEW_EXT_read_format_bgra GLEW_GET_VAR(__GLEW_EXT_read_format_bgra) #endif /* GL_EXT_read_format_bgra */ /* -------------------------- GL_EXT_render_snorm -------------------------- */ #ifndef GL_EXT_render_snorm #define GL_EXT_render_snorm 1 #define GL_BYTE 0x1400 #define GL_SHORT 0x1402 #define GL_R8_SNORM 0x8F94 #define GL_RG8_SNORM 0x8F95 #define GL_RGBA8_SNORM 0x8F97 #define GL_R16_SNORM_EXT 0x8F98 #define GL_RG16_SNORM_EXT 0x8F99 #define GL_RGBA16_SNORM_EXT 0x8F9B #define GLEW_EXT_render_snorm GLEW_GET_VAR(__GLEW_EXT_render_snorm) #endif /* GL_EXT_render_snorm */ /* ------------------------- GL_EXT_rescale_normal ------------------------- */ #ifndef GL_EXT_rescale_normal #define GL_EXT_rescale_normal 1 #define GL_RESCALE_NORMAL_EXT 0x803A #define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal) #endif /* GL_EXT_rescale_normal */ /* ------------------------------ GL_EXT_sRGB ------------------------------ */ #ifndef GL_EXT_sRGB #define GL_EXT_sRGB 1 #define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 #define GL_SRGB_EXT 0x8C40 #define GL_SRGB_ALPHA_EXT 0x8C42 #define GL_SRGB8_ALPHA8_EXT 0x8C43 #define GLEW_EXT_sRGB GLEW_GET_VAR(__GLEW_EXT_sRGB) #endif /* GL_EXT_sRGB */ /* ----------------------- GL_EXT_sRGB_write_control ----------------------- */ #ifndef GL_EXT_sRGB_write_control #define GL_EXT_sRGB_write_control 1 #define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 #define GLEW_EXT_sRGB_write_control GLEW_GET_VAR(__GLEW_EXT_sRGB_write_control) #endif /* GL_EXT_sRGB_write_control */ /* -------------------------- GL_EXT_scene_marker -------------------------- */ #ifndef GL_EXT_scene_marker #define GL_EXT_scene_marker 1 typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void); typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void); #define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT) #define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT) #define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker) #endif /* GL_EXT_scene_marker */ /* ------------------------- GL_EXT_secondary_color ------------------------ */ #ifndef GL_EXT_secondary_color #define GL_EXT_secondary_color 1 #define GL_COLOR_SUM_EXT 0x8458 #define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 #define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A #define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B #define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C #define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D #define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); #define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT) #define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT) #define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT) #define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT) #define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT) #define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT) #define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT) #define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT) #define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT) #define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT) #define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT) #define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT) #define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT) #define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT) #define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT) #define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT) #define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT) #define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color) #endif /* GL_EXT_secondary_color */ /* ---------------------------- GL_EXT_semaphore --------------------------- */ #ifndef GL_EXT_semaphore #define GL_EXT_semaphore 1 typedef void (GLAPIENTRY * PFNGLDELETESEMAPHORESEXTPROC) (GLsizei n, const GLuint* semaphores); typedef void (GLAPIENTRY * PFNGLGENSEMAPHORESEXTPROC) (GLsizei n, GLuint* semaphores); typedef void (GLAPIENTRY * PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, GLuint64* params); typedef GLboolean (GLAPIENTRY * PFNGLISSEMAPHOREEXTPROC) (GLuint semaphore); typedef void (GLAPIENTRY * PFNGLSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, const GLuint64* params); typedef void (GLAPIENTRY * PFNGLSIGNALSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint* buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); typedef void (GLAPIENTRY * PFNGLWAITSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint* buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); #define glDeleteSemaphoresEXT GLEW_GET_FUN(__glewDeleteSemaphoresEXT) #define glGenSemaphoresEXT GLEW_GET_FUN(__glewGenSemaphoresEXT) #define glGetSemaphoreParameterui64vEXT GLEW_GET_FUN(__glewGetSemaphoreParameterui64vEXT) #define glIsSemaphoreEXT GLEW_GET_FUN(__glewIsSemaphoreEXT) #define glSemaphoreParameterui64vEXT GLEW_GET_FUN(__glewSemaphoreParameterui64vEXT) #define glSignalSemaphoreEXT GLEW_GET_FUN(__glewSignalSemaphoreEXT) #define glWaitSemaphoreEXT GLEW_GET_FUN(__glewWaitSemaphoreEXT) #define GLEW_EXT_semaphore GLEW_GET_VAR(__GLEW_EXT_semaphore) #endif /* GL_EXT_semaphore */ /* -------------------------- GL_EXT_semaphore_fd -------------------------- */ #ifndef GL_EXT_semaphore_fd #define GL_EXT_semaphore_fd 1 typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREFDEXTPROC) (GLuint semaphore, GLenum handleType, GLint fd); #define glImportSemaphoreFdEXT GLEW_GET_FUN(__glewImportSemaphoreFdEXT) #define GLEW_EXT_semaphore_fd GLEW_GET_VAR(__GLEW_EXT_semaphore_fd) #endif /* GL_EXT_semaphore_fd */ /* ------------------------- GL_EXT_semaphore_win32 ------------------------ */ #ifndef GL_EXT_semaphore_win32 #define GL_EXT_semaphore_win32 1 typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC) (GLuint semaphore, GLenum handleType, void *handle); typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC) (GLuint semaphore, GLenum handleType, const void *name); #define glImportSemaphoreWin32HandleEXT GLEW_GET_FUN(__glewImportSemaphoreWin32HandleEXT) #define glImportSemaphoreWin32NameEXT GLEW_GET_FUN(__glewImportSemaphoreWin32NameEXT) #define GLEW_EXT_semaphore_win32 GLEW_GET_VAR(__GLEW_EXT_semaphore_win32) #endif /* GL_EXT_semaphore_win32 */ /* --------------------- GL_EXT_separate_shader_objects -------------------- */ #ifndef GL_EXT_separate_shader_objects #define GL_EXT_separate_shader_objects 1 #define GL_ACTIVE_PROGRAM_EXT 0x8B8D typedef void (GLAPIENTRY * PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar* string); typedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); #define glActiveProgramEXT GLEW_GET_FUN(__glewActiveProgramEXT) #define glCreateShaderProgramEXT GLEW_GET_FUN(__glewCreateShaderProgramEXT) #define glUseShaderProgramEXT GLEW_GET_FUN(__glewUseShaderProgramEXT) #define GLEW_EXT_separate_shader_objects GLEW_GET_VAR(__GLEW_EXT_separate_shader_objects) #endif /* GL_EXT_separate_shader_objects */ /* --------------------- GL_EXT_separate_specular_color -------------------- */ #ifndef GL_EXT_separate_specular_color #define GL_EXT_separate_specular_color 1 #define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 #define GL_SINGLE_COLOR_EXT 0x81F9 #define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA #define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color) #endif /* GL_EXT_separate_specular_color */ /* -------------------- GL_EXT_shader_framebuffer_fetch -------------------- */ #ifndef GL_EXT_shader_framebuffer_fetch #define GL_EXT_shader_framebuffer_fetch 1 #define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 #define GLEW_EXT_shader_framebuffer_fetch GLEW_GET_VAR(__GLEW_EXT_shader_framebuffer_fetch) #endif /* GL_EXT_shader_framebuffer_fetch */ /* ------------------------ GL_EXT_shader_group_vote ----------------------- */ #ifndef GL_EXT_shader_group_vote #define GL_EXT_shader_group_vote 1 #define GLEW_EXT_shader_group_vote GLEW_GET_VAR(__GLEW_EXT_shader_group_vote) #endif /* GL_EXT_shader_group_vote */ /* ------------------- GL_EXT_shader_image_load_formatted ------------------ */ #ifndef GL_EXT_shader_image_load_formatted #define GL_EXT_shader_image_load_formatted 1 #define GLEW_EXT_shader_image_load_formatted GLEW_GET_VAR(__GLEW_EXT_shader_image_load_formatted) #endif /* GL_EXT_shader_image_load_formatted */ /* --------------------- GL_EXT_shader_image_load_store -------------------- */ #ifndef GL_EXT_shader_image_load_store #define GL_EXT_shader_image_load_store 1 #define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 #define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 #define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 #define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 #define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 #define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 #define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 #define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 #define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 #define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 #define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 #define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 #define GL_MAX_IMAGE_UNITS_EXT 0x8F38 #define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 #define GL_IMAGE_BINDING_NAME_EXT 0x8F3A #define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B #define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C #define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D #define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E #define GL_IMAGE_1D_EXT 0x904C #define GL_IMAGE_2D_EXT 0x904D #define GL_IMAGE_3D_EXT 0x904E #define GL_IMAGE_2D_RECT_EXT 0x904F #define GL_IMAGE_CUBE_EXT 0x9050 #define GL_IMAGE_BUFFER_EXT 0x9051 #define GL_IMAGE_1D_ARRAY_EXT 0x9052 #define GL_IMAGE_2D_ARRAY_EXT 0x9053 #define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 #define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 #define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 #define GL_INT_IMAGE_1D_EXT 0x9057 #define GL_INT_IMAGE_2D_EXT 0x9058 #define GL_INT_IMAGE_3D_EXT 0x9059 #define GL_INT_IMAGE_2D_RECT_EXT 0x905A #define GL_INT_IMAGE_CUBE_EXT 0x905B #define GL_INT_IMAGE_BUFFER_EXT 0x905C #define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D #define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E #define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F #define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 #define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 #define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 #define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 #define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 #define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 #define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 #define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 #define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 #define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 #define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C #define GL_MAX_IMAGE_SAMPLES_EXT 0x906D #define GL_IMAGE_BINDING_FORMAT_EXT 0x906E #define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); typedef void (GLAPIENTRY * PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); #define glBindImageTextureEXT GLEW_GET_FUN(__glewBindImageTextureEXT) #define glMemoryBarrierEXT GLEW_GET_FUN(__glewMemoryBarrierEXT) #define GLEW_EXT_shader_image_load_store GLEW_GET_VAR(__GLEW_EXT_shader_image_load_store) #endif /* GL_EXT_shader_image_load_store */ /* ------------------- GL_EXT_shader_implicit_conversions ------------------ */ #ifndef GL_EXT_shader_implicit_conversions #define GL_EXT_shader_implicit_conversions 1 #define GLEW_EXT_shader_implicit_conversions GLEW_GET_VAR(__GLEW_EXT_shader_implicit_conversions) #endif /* GL_EXT_shader_implicit_conversions */ /* ----------------------- GL_EXT_shader_integer_mix ----------------------- */ #ifndef GL_EXT_shader_integer_mix #define GL_EXT_shader_integer_mix 1 #define GLEW_EXT_shader_integer_mix GLEW_GET_VAR(__GLEW_EXT_shader_integer_mix) #endif /* GL_EXT_shader_integer_mix */ /* ------------------------ GL_EXT_shader_io_blocks ------------------------ */ #ifndef GL_EXT_shader_io_blocks #define GL_EXT_shader_io_blocks 1 #define GLEW_EXT_shader_io_blocks GLEW_GET_VAR(__GLEW_EXT_shader_io_blocks) #endif /* GL_EXT_shader_io_blocks */ /* ------------- GL_EXT_shader_non_constant_global_initializers ------------ */ #ifndef GL_EXT_shader_non_constant_global_initializers #define GL_EXT_shader_non_constant_global_initializers 1 #define GLEW_EXT_shader_non_constant_global_initializers GLEW_GET_VAR(__GLEW_EXT_shader_non_constant_global_initializers) #endif /* GL_EXT_shader_non_constant_global_initializers */ /* ------------------- GL_EXT_shader_pixel_local_storage ------------------- */ #ifndef GL_EXT_shader_pixel_local_storage #define GL_EXT_shader_pixel_local_storage 1 #define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63 #define GL_SHADER_PIXEL_LOCAL_STORAGE_EXT 0x8F64 #define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT 0x8F67 #define GLEW_EXT_shader_pixel_local_storage GLEW_GET_VAR(__GLEW_EXT_shader_pixel_local_storage) #endif /* GL_EXT_shader_pixel_local_storage */ /* ------------------- GL_EXT_shader_pixel_local_storage2 ------------------ */ #ifndef GL_EXT_shader_pixel_local_storage2 #define GL_EXT_shader_pixel_local_storage2 1 #define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_FAST_SIZE_EXT 0x9650 #define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_SIZE_EXT 0x9651 #define GL_FRAMEBUFFER_INCOMPLETE_INSUFFICIENT_SHADER_COMBINED_LOCAL_STORAGE_EXT 0x9652 typedef void (GLAPIENTRY * PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC) (GLsizei offset, GLsizei n, const GLuint* values); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target, GLsizei size); typedef GLsizei (GLAPIENTRY * PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target); #define glClearPixelLocalStorageuiEXT GLEW_GET_FUN(__glewClearPixelLocalStorageuiEXT) #define glFramebufferPixelLocalStorageSizeEXT GLEW_GET_FUN(__glewFramebufferPixelLocalStorageSizeEXT) #define glGetFramebufferPixelLocalStorageSizeEXT GLEW_GET_FUN(__glewGetFramebufferPixelLocalStorageSizeEXT) #define GLEW_EXT_shader_pixel_local_storage2 GLEW_GET_VAR(__GLEW_EXT_shader_pixel_local_storage2) #endif /* GL_EXT_shader_pixel_local_storage2 */ /* ----------------------- GL_EXT_shader_texture_lod ----------------------- */ #ifndef GL_EXT_shader_texture_lod #define GL_EXT_shader_texture_lod 1 #define GLEW_EXT_shader_texture_lod GLEW_GET_VAR(__GLEW_EXT_shader_texture_lod) #endif /* GL_EXT_shader_texture_lod */ /* -------------------------- GL_EXT_shadow_funcs -------------------------- */ #ifndef GL_EXT_shadow_funcs #define GL_EXT_shadow_funcs 1 #define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs) #endif /* GL_EXT_shadow_funcs */ /* ------------------------- GL_EXT_shadow_samplers ------------------------ */ #ifndef GL_EXT_shadow_samplers #define GL_EXT_shadow_samplers 1 #define GL_TEXTURE_COMPARE_MODE_EXT 0x884C #define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D #define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E #define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 #define GLEW_EXT_shadow_samplers GLEW_GET_VAR(__GLEW_EXT_shadow_samplers) #endif /* GL_EXT_shadow_samplers */ /* --------------------- GL_EXT_shared_texture_palette --------------------- */ #ifndef GL_EXT_shared_texture_palette #define GL_EXT_shared_texture_palette 1 #define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB #define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette) #endif /* GL_EXT_shared_texture_palette */ /* ------------------------- GL_EXT_sparse_texture ------------------------- */ #ifndef GL_EXT_sparse_texture #define GL_EXT_sparse_texture 1 #define GL_TEXTURE_2D 0x0DE1 #define GL_TEXTURE_3D 0x806F #define GL_TEXTURE_CUBE_MAP 0x8513 #define GL_TEXTURE_2D_ARRAY 0x8C1A #define GL_TEXTURE_CUBE_MAP_ARRAY_OES 0x9009 #define GL_VIRTUAL_PAGE_SIZE_X_EXT 0x9195 #define GL_VIRTUAL_PAGE_SIZE_Y_EXT 0x9196 #define GL_VIRTUAL_PAGE_SIZE_Z_EXT 0x9197 #define GL_MAX_SPARSE_TEXTURE_SIZE_EXT 0x9198 #define GL_MAX_SPARSE_3D_TEXTURE_SIZE_EXT 0x9199 #define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT 0x919A #define GL_TEXTURE_SPARSE_EXT 0x91A6 #define GL_VIRTUAL_PAGE_SIZE_INDEX_EXT 0x91A7 #define GL_NUM_VIRTUAL_PAGE_SIZES_EXT 0x91A8 #define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT 0x91A9 #define GL_NUM_SPARSE_LEVELS_EXT 0x91AA typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); typedef void (GLAPIENTRY * PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); #define glTexPageCommitmentEXT GLEW_GET_FUN(__glewTexPageCommitmentEXT) #define glTexturePageCommitmentEXT GLEW_GET_FUN(__glewTexturePageCommitmentEXT) #define GLEW_EXT_sparse_texture GLEW_GET_VAR(__GLEW_EXT_sparse_texture) #endif /* GL_EXT_sparse_texture */ /* ------------------------- GL_EXT_sparse_texture2 ------------------------ */ #ifndef GL_EXT_sparse_texture2 #define GL_EXT_sparse_texture2 1 #define GLEW_EXT_sparse_texture2 GLEW_GET_VAR(__GLEW_EXT_sparse_texture2) #endif /* GL_EXT_sparse_texture2 */ /* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */ #ifndef GL_EXT_stencil_clear_tag #define GL_EXT_stencil_clear_tag 1 #define GL_STENCIL_TAG_BITS_EXT 0x88F2 #define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 #define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag) #endif /* GL_EXT_stencil_clear_tag */ /* ------------------------ GL_EXT_stencil_two_side ------------------------ */ #ifndef GL_EXT_stencil_two_side #define GL_EXT_stencil_two_side 1 #define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 #define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); #define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT) #define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side) #endif /* GL_EXT_stencil_two_side */ /* -------------------------- GL_EXT_stencil_wrap -------------------------- */ #ifndef GL_EXT_stencil_wrap #define GL_EXT_stencil_wrap 1 #define GL_INCR_WRAP_EXT 0x8507 #define GL_DECR_WRAP_EXT 0x8508 #define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap) #endif /* GL_EXT_stencil_wrap */ /* --------------------------- GL_EXT_subtexture --------------------------- */ #ifndef GL_EXT_subtexture #define GL_EXT_subtexture 1 typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); #define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) #define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) #define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT) #define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture) #endif /* GL_EXT_subtexture */ /* ----------------------------- GL_EXT_texture ---------------------------- */ #ifndef GL_EXT_texture #define GL_EXT_texture 1 #define GL_ALPHA4_EXT 0x803B #define GL_ALPHA8_EXT 0x803C #define GL_ALPHA12_EXT 0x803D #define GL_ALPHA16_EXT 0x803E #define GL_LUMINANCE4_EXT 0x803F #define GL_LUMINANCE8_EXT 0x8040 #define GL_LUMINANCE12_EXT 0x8041 #define GL_LUMINANCE16_EXT 0x8042 #define GL_LUMINANCE4_ALPHA4_EXT 0x8043 #define GL_LUMINANCE6_ALPHA2_EXT 0x8044 #define GL_LUMINANCE8_ALPHA8_EXT 0x8045 #define GL_LUMINANCE12_ALPHA4_EXT 0x8046 #define GL_LUMINANCE12_ALPHA12_EXT 0x8047 #define GL_LUMINANCE16_ALPHA16_EXT 0x8048 #define GL_INTENSITY_EXT 0x8049 #define GL_INTENSITY4_EXT 0x804A #define GL_INTENSITY8_EXT 0x804B #define GL_INTENSITY12_EXT 0x804C #define GL_INTENSITY16_EXT 0x804D #define GL_RGB2_EXT 0x804E #define GL_RGB4_EXT 0x804F #define GL_RGB5_EXT 0x8050 #define GL_RGB8_EXT 0x8051 #define GL_RGB10_EXT 0x8052 #define GL_RGB12_EXT 0x8053 #define GL_RGB16_EXT 0x8054 #define GL_RGBA2_EXT 0x8055 #define GL_RGBA4_EXT 0x8056 #define GL_RGB5_A1_EXT 0x8057 #define GL_RGBA8_EXT 0x8058 #define GL_RGB10_A2_EXT 0x8059 #define GL_RGBA12_EXT 0x805A #define GL_RGBA16_EXT 0x805B #define GL_TEXTURE_RED_SIZE_EXT 0x805C #define GL_TEXTURE_GREEN_SIZE_EXT 0x805D #define GL_TEXTURE_BLUE_SIZE_EXT 0x805E #define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F #define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 #define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 #define GL_REPLACE_EXT 0x8062 #define GL_PROXY_TEXTURE_1D_EXT 0x8063 #define GL_PROXY_TEXTURE_2D_EXT 0x8064 #define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture) #endif /* GL_EXT_texture */ /* ---------------------------- GL_EXT_texture3D --------------------------- */ #ifndef GL_EXT_texture3D #define GL_EXT_texture3D 1 #define GL_PACK_SKIP_IMAGES_EXT 0x806B #define GL_PACK_IMAGE_HEIGHT_EXT 0x806C #define GL_UNPACK_SKIP_IMAGES_EXT 0x806D #define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E #define GL_TEXTURE_3D_EXT 0x806F #define GL_PROXY_TEXTURE_3D_EXT 0x8070 #define GL_TEXTURE_DEPTH_EXT 0x8071 #define GL_TEXTURE_WRAP_R_EXT 0x8072 #define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); #define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) #define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D) #endif /* GL_EXT_texture3D */ /* -------------------------- GL_EXT_texture_array ------------------------- */ #ifndef GL_EXT_texture_array #define GL_EXT_texture_array 1 #define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E #define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF #define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 #define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 #define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A #define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B #define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C #define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); #define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT) #define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array) #endif /* GL_EXT_texture_array */ /* ---------------------- GL_EXT_texture_buffer_object --------------------- */ #ifndef GL_EXT_texture_buffer_object #define GL_EXT_texture_buffer_object 1 #define GL_TEXTURE_BUFFER_EXT 0x8C2A #define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B #define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D #define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); #define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT) #define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object) #endif /* GL_EXT_texture_buffer_object */ /* -------------- GL_EXT_texture_compression_astc_decode_mode -------------- */ #ifndef GL_EXT_texture_compression_astc_decode_mode #define GL_EXT_texture_compression_astc_decode_mode 1 #define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 #define GLEW_EXT_texture_compression_astc_decode_mode GLEW_GET_VAR(__GLEW_EXT_texture_compression_astc_decode_mode) #endif /* GL_EXT_texture_compression_astc_decode_mode */ /* ----------- GL_EXT_texture_compression_astc_decode_mode_rgb9e5 ---------- */ #ifndef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 #define GL_EXT_texture_compression_astc_decode_mode_rgb9e5 1 #define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 #define GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5 GLEW_GET_VAR(__GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5) #endif /* GL_EXT_texture_compression_astc_decode_mode_rgb9e5 */ /* -------------------- GL_EXT_texture_compression_bptc -------------------- */ #ifndef GL_EXT_texture_compression_bptc #define GL_EXT_texture_compression_bptc 1 #define GL_COMPRESSED_RGBA_BPTC_UNORM_EXT 0x8E8C #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT 0x8E8D #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F #define GLEW_EXT_texture_compression_bptc GLEW_GET_VAR(__GLEW_EXT_texture_compression_bptc) #endif /* GL_EXT_texture_compression_bptc */ /* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ #ifndef GL_EXT_texture_compression_dxt1 #define GL_EXT_texture_compression_dxt1 1 #define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1) #endif /* GL_EXT_texture_compression_dxt1 */ /* -------------------- GL_EXT_texture_compression_latc -------------------- */ #ifndef GL_EXT_texture_compression_latc #define GL_EXT_texture_compression_latc 1 #define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 #define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 #define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 #define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 #define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc) #endif /* GL_EXT_texture_compression_latc */ /* -------------------- GL_EXT_texture_compression_rgtc -------------------- */ #ifndef GL_EXT_texture_compression_rgtc #define GL_EXT_texture_compression_rgtc 1 #define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB #define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC #define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD #define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE #define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc) #endif /* GL_EXT_texture_compression_rgtc */ /* -------------------- GL_EXT_texture_compression_s3tc -------------------- */ #ifndef GL_EXT_texture_compression_s3tc #define GL_EXT_texture_compression_s3tc 1 #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 #define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc) #endif /* GL_EXT_texture_compression_s3tc */ /* ------------------------ GL_EXT_texture_cube_map ------------------------ */ #ifndef GL_EXT_texture_cube_map #define GL_EXT_texture_cube_map 1 #define GL_NORMAL_MAP_EXT 0x8511 #define GL_REFLECTION_MAP_EXT 0x8512 #define GL_TEXTURE_CUBE_MAP_EXT 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C #define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map) #endif /* GL_EXT_texture_cube_map */ /* --------------------- GL_EXT_texture_cube_map_array --------------------- */ #ifndef GL_EXT_texture_cube_map_array #define GL_EXT_texture_cube_map_array 1 #define GL_TEXTURE_CUBE_MAP_ARRAY_EXT 0x9009 #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT 0x900A #define GL_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900C #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT 0x900D #define GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900E #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900F #define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 #define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F #define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A #define GLEW_EXT_texture_cube_map_array GLEW_GET_VAR(__GLEW_EXT_texture_cube_map_array) #endif /* GL_EXT_texture_cube_map_array */ /* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */ #ifndef GL_EXT_texture_edge_clamp #define GL_EXT_texture_edge_clamp 1 #define GL_CLAMP_TO_EDGE_EXT 0x812F #define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp) #endif /* GL_EXT_texture_edge_clamp */ /* --------------------------- GL_EXT_texture_env -------------------------- */ #ifndef GL_EXT_texture_env #define GL_EXT_texture_env 1 #define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) #endif /* GL_EXT_texture_env */ /* ------------------------- GL_EXT_texture_env_add ------------------------ */ #ifndef GL_EXT_texture_env_add #define GL_EXT_texture_env_add 1 #define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add) #endif /* GL_EXT_texture_env_add */ /* ----------------------- GL_EXT_texture_env_combine ---------------------- */ #ifndef GL_EXT_texture_env_combine #define GL_EXT_texture_env_combine 1 #define GL_COMBINE_EXT 0x8570 #define GL_COMBINE_RGB_EXT 0x8571 #define GL_COMBINE_ALPHA_EXT 0x8572 #define GL_RGB_SCALE_EXT 0x8573 #define GL_ADD_SIGNED_EXT 0x8574 #define GL_INTERPOLATE_EXT 0x8575 #define GL_CONSTANT_EXT 0x8576 #define GL_PRIMARY_COLOR_EXT 0x8577 #define GL_PREVIOUS_EXT 0x8578 #define GL_SOURCE0_RGB_EXT 0x8580 #define GL_SOURCE1_RGB_EXT 0x8581 #define GL_SOURCE2_RGB_EXT 0x8582 #define GL_SOURCE0_ALPHA_EXT 0x8588 #define GL_SOURCE1_ALPHA_EXT 0x8589 #define GL_SOURCE2_ALPHA_EXT 0x858A #define GL_OPERAND0_RGB_EXT 0x8590 #define GL_OPERAND1_RGB_EXT 0x8591 #define GL_OPERAND2_RGB_EXT 0x8592 #define GL_OPERAND0_ALPHA_EXT 0x8598 #define GL_OPERAND1_ALPHA_EXT 0x8599 #define GL_OPERAND2_ALPHA_EXT 0x859A #define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine) #endif /* GL_EXT_texture_env_combine */ /* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */ #ifndef GL_EXT_texture_env_dot3 #define GL_EXT_texture_env_dot3 1 #define GL_DOT3_RGB_EXT 0x8740 #define GL_DOT3_RGBA_EXT 0x8741 #define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3) #endif /* GL_EXT_texture_env_dot3 */ /* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */ #ifndef GL_EXT_texture_filter_anisotropic #define GL_EXT_texture_filter_anisotropic 1 #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF #define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic) #endif /* GL_EXT_texture_filter_anisotropic */ /* ---------------------- GL_EXT_texture_filter_minmax --------------------- */ #ifndef GL_EXT_texture_filter_minmax #define GL_EXT_texture_filter_minmax 1 #define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 #define GL_WEIGHTED_AVERAGE_EXT 0x9367 #define GLEW_EXT_texture_filter_minmax GLEW_GET_VAR(__GLEW_EXT_texture_filter_minmax) #endif /* GL_EXT_texture_filter_minmax */ /* --------------------- GL_EXT_texture_format_BGRA8888 -------------------- */ #ifndef GL_EXT_texture_format_BGRA8888 #define GL_EXT_texture_format_BGRA8888 1 #define GL_BGRA_EXT 0x80E1 #define GLEW_EXT_texture_format_BGRA8888 GLEW_GET_VAR(__GLEW_EXT_texture_format_BGRA8888) #endif /* GL_EXT_texture_format_BGRA8888 */ /* ------------------------- GL_EXT_texture_integer ------------------------ */ #ifndef GL_EXT_texture_integer #define GL_EXT_texture_integer 1 #define GL_RGBA32UI_EXT 0x8D70 #define GL_RGB32UI_EXT 0x8D71 #define GL_ALPHA32UI_EXT 0x8D72 #define GL_INTENSITY32UI_EXT 0x8D73 #define GL_LUMINANCE32UI_EXT 0x8D74 #define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 #define GL_RGBA16UI_EXT 0x8D76 #define GL_RGB16UI_EXT 0x8D77 #define GL_ALPHA16UI_EXT 0x8D78 #define GL_INTENSITY16UI_EXT 0x8D79 #define GL_LUMINANCE16UI_EXT 0x8D7A #define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B #define GL_RGBA8UI_EXT 0x8D7C #define GL_RGB8UI_EXT 0x8D7D #define GL_ALPHA8UI_EXT 0x8D7E #define GL_INTENSITY8UI_EXT 0x8D7F #define GL_LUMINANCE8UI_EXT 0x8D80 #define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 #define GL_RGBA32I_EXT 0x8D82 #define GL_RGB32I_EXT 0x8D83 #define GL_ALPHA32I_EXT 0x8D84 #define GL_INTENSITY32I_EXT 0x8D85 #define GL_LUMINANCE32I_EXT 0x8D86 #define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 #define GL_RGBA16I_EXT 0x8D88 #define GL_RGB16I_EXT 0x8D89 #define GL_ALPHA16I_EXT 0x8D8A #define GL_INTENSITY16I_EXT 0x8D8B #define GL_LUMINANCE16I_EXT 0x8D8C #define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D #define GL_RGBA8I_EXT 0x8D8E #define GL_RGB8I_EXT 0x8D8F #define GL_ALPHA8I_EXT 0x8D90 #define GL_INTENSITY8I_EXT 0x8D91 #define GL_LUMINANCE8I_EXT 0x8D92 #define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 #define GL_RED_INTEGER_EXT 0x8D94 #define GL_GREEN_INTEGER_EXT 0x8D95 #define GL_BLUE_INTEGER_EXT 0x8D96 #define GL_ALPHA_INTEGER_EXT 0x8D97 #define GL_RGB_INTEGER_EXT 0x8D98 #define GL_RGBA_INTEGER_EXT 0x8D99 #define GL_BGR_INTEGER_EXT 0x8D9A #define GL_BGRA_INTEGER_EXT 0x8D9B #define GL_LUMINANCE_INTEGER_EXT 0x8D9C #define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D #define GL_RGBA_INTEGER_MODE_EXT 0x8D9E typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); #define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT) #define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT) #define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT) #define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT) #define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT) #define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT) #define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer) #endif /* GL_EXT_texture_integer */ /* ------------------------ GL_EXT_texture_lod_bias ------------------------ */ #ifndef GL_EXT_texture_lod_bias #define GL_EXT_texture_lod_bias 1 #define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD #define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 #define GL_TEXTURE_LOD_BIAS_EXT 0x8501 #define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias) #endif /* GL_EXT_texture_lod_bias */ /* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */ #ifndef GL_EXT_texture_mirror_clamp #define GL_EXT_texture_mirror_clamp 1 #define GL_MIRROR_CLAMP_EXT 0x8742 #define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 #define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 #define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp) #endif /* GL_EXT_texture_mirror_clamp */ /* ------------------------- GL_EXT_texture_norm16 ------------------------- */ #ifndef GL_EXT_texture_norm16 #define GL_EXT_texture_norm16 1 #define GL_RGB16_EXT 0x8054 #define GL_RGBA16_EXT 0x805B #define GL_R16_EXT 0x822A #define GL_RG16_EXT 0x822C #define GL_R16_SNORM_EXT 0x8F98 #define GL_RG16_SNORM_EXT 0x8F99 #define GL_RGB16_SNORM_EXT 0x8F9A #define GL_RGBA16_SNORM_EXT 0x8F9B #define GLEW_EXT_texture_norm16 GLEW_GET_VAR(__GLEW_EXT_texture_norm16) #endif /* GL_EXT_texture_norm16 */ /* ------------------------- GL_EXT_texture_object ------------------------- */ #ifndef GL_EXT_texture_object #define GL_EXT_texture_object 1 #define GL_TEXTURE_PRIORITY_EXT 0x8066 #define GL_TEXTURE_RESIDENT_EXT 0x8067 #define GL_TEXTURE_1D_BINDING_EXT 0x8068 #define GL_TEXTURE_2D_BINDING_EXT 0x8069 #define GL_TEXTURE_3D_BINDING_EXT 0x806A typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences); typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures); typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures); typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities); #define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT) #define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT) #define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT) #define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT) #define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT) #define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT) #define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object) #endif /* GL_EXT_texture_object */ /* --------------------- GL_EXT_texture_perturb_normal --------------------- */ #ifndef GL_EXT_texture_perturb_normal #define GL_EXT_texture_perturb_normal 1 #define GL_PERTURB_EXT 0x85AE #define GL_TEXTURE_NORMAL_EXT 0x85AF typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); #define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT) #define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal) #endif /* GL_EXT_texture_perturb_normal */ /* ------------------------ GL_EXT_texture_rectangle ----------------------- */ #ifndef GL_EXT_texture_rectangle #define GL_EXT_texture_rectangle 1 #define GL_TEXTURE_RECTANGLE_EXT 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8 #define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle) #endif /* GL_EXT_texture_rectangle */ /* --------------------------- GL_EXT_texture_rg --------------------------- */ #ifndef GL_EXT_texture_rg #define GL_EXT_texture_rg 1 #define GL_RED_EXT 0x1903 #define GL_RG_EXT 0x8227 #define GL_R8_EXT 0x8229 #define GL_RG8_EXT 0x822B #define GLEW_EXT_texture_rg GLEW_GET_VAR(__GLEW_EXT_texture_rg) #endif /* GL_EXT_texture_rg */ /* -------------------------- GL_EXT_texture_sRGB -------------------------- */ #ifndef GL_EXT_texture_sRGB #define GL_EXT_texture_sRGB 1 #define GL_SRGB_EXT 0x8C40 #define GL_SRGB8_EXT 0x8C41 #define GL_SRGB_ALPHA_EXT 0x8C42 #define GL_SRGB8_ALPHA8_EXT 0x8C43 #define GL_SLUMINANCE_ALPHA_EXT 0x8C44 #define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 #define GL_SLUMINANCE_EXT 0x8C46 #define GL_SLUMINANCE8_EXT 0x8C47 #define GL_COMPRESSED_SRGB_EXT 0x8C48 #define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 #define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A #define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B #define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F #define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB) #endif /* GL_EXT_texture_sRGB */ /* ------------------------- GL_EXT_texture_sRGB_R8 ------------------------ */ #ifndef GL_EXT_texture_sRGB_R8 #define GL_EXT_texture_sRGB_R8 1 #define GL_SR8_EXT 0x8FBD #define GLEW_EXT_texture_sRGB_R8 GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_R8) #endif /* GL_EXT_texture_sRGB_R8 */ /* ------------------------ GL_EXT_texture_sRGB_RG8 ------------------------ */ #ifndef GL_EXT_texture_sRGB_RG8 #define GL_EXT_texture_sRGB_RG8 1 #define GL_SRG8_EXT 0x8FBE #define GLEW_EXT_texture_sRGB_RG8 GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_RG8) #endif /* GL_EXT_texture_sRGB_RG8 */ /* ----------------------- GL_EXT_texture_sRGB_decode ---------------------- */ #ifndef GL_EXT_texture_sRGB_decode #define GL_EXT_texture_sRGB_decode 1 #define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 #define GL_DECODE_EXT 0x8A49 #define GL_SKIP_DECODE_EXT 0x8A4A #define GLEW_EXT_texture_sRGB_decode GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_decode) #endif /* GL_EXT_texture_sRGB_decode */ /* --------------------- GL_EXT_texture_shared_exponent -------------------- */ #ifndef GL_EXT_texture_shared_exponent #define GL_EXT_texture_shared_exponent 1 #define GL_RGB9_E5_EXT 0x8C3D #define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E #define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F #define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent) #endif /* GL_EXT_texture_shared_exponent */ /* -------------------------- GL_EXT_texture_snorm ------------------------- */ #ifndef GL_EXT_texture_snorm #define GL_EXT_texture_snorm 1 #define GL_RED_SNORM 0x8F90 #define GL_RG_SNORM 0x8F91 #define GL_RGB_SNORM 0x8F92 #define GL_RGBA_SNORM 0x8F93 #define GL_R8_SNORM 0x8F94 #define GL_RG8_SNORM 0x8F95 #define GL_RGB8_SNORM 0x8F96 #define GL_RGBA8_SNORM 0x8F97 #define GL_R16_SNORM 0x8F98 #define GL_RG16_SNORM 0x8F99 #define GL_RGB16_SNORM 0x8F9A #define GL_RGBA16_SNORM 0x8F9B #define GL_SIGNED_NORMALIZED 0x8F9C #define GL_ALPHA_SNORM 0x9010 #define GL_LUMINANCE_SNORM 0x9011 #define GL_LUMINANCE_ALPHA_SNORM 0x9012 #define GL_INTENSITY_SNORM 0x9013 #define GL_ALPHA8_SNORM 0x9014 #define GL_LUMINANCE8_SNORM 0x9015 #define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 #define GL_INTENSITY8_SNORM 0x9017 #define GL_ALPHA16_SNORM 0x9018 #define GL_LUMINANCE16_SNORM 0x9019 #define GL_LUMINANCE16_ALPHA16_SNORM 0x901A #define GL_INTENSITY16_SNORM 0x901B #define GLEW_EXT_texture_snorm GLEW_GET_VAR(__GLEW_EXT_texture_snorm) #endif /* GL_EXT_texture_snorm */ /* ------------------------- GL_EXT_texture_storage ------------------------ */ #ifndef GL_EXT_texture_storage #define GL_EXT_texture_storage 1 #define GL_ALPHA8_EXT 0x803C #define GL_LUMINANCE8_EXT 0x8040 #define GL_LUMINANCE8_ALPHA8_EXT 0x8045 #define GL_RGB10_EXT 0x8052 #define GL_RGB10_A2_EXT 0x8059 #define GL_R8_EXT 0x8229 #define GL_RG8_EXT 0x822B #define GL_R16F_EXT 0x822D #define GL_R32F_EXT 0x822E #define GL_RG16F_EXT 0x822F #define GL_RG32F_EXT 0x8230 #define GL_RGBA32F_EXT 0x8814 #define GL_RGB32F_EXT 0x8815 #define GL_ALPHA32F_EXT 0x8816 #define GL_LUMINANCE32F_EXT 0x8818 #define GL_LUMINANCE_ALPHA32F_EXT 0x8819 #define GL_RGBA16F_EXT 0x881A #define GL_RGB16F_EXT 0x881B #define GL_ALPHA16F_EXT 0x881C #define GL_LUMINANCE16F_EXT 0x881E #define GL_LUMINANCE_ALPHA16F_EXT 0x881F #define GL_RGB_RAW_422_APPLE 0x8A51 #define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F #define GL_BGRA8_EXT 0x93A1 typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); #define glTexStorage1DEXT GLEW_GET_FUN(__glewTexStorage1DEXT) #define glTexStorage2DEXT GLEW_GET_FUN(__glewTexStorage2DEXT) #define glTexStorage3DEXT GLEW_GET_FUN(__glewTexStorage3DEXT) #define glTextureStorage1DEXT GLEW_GET_FUN(__glewTextureStorage1DEXT) #define glTextureStorage2DEXT GLEW_GET_FUN(__glewTextureStorage2DEXT) #define glTextureStorage3DEXT GLEW_GET_FUN(__glewTextureStorage3DEXT) #define GLEW_EXT_texture_storage GLEW_GET_VAR(__GLEW_EXT_texture_storage) #endif /* GL_EXT_texture_storage */ /* ------------------------- GL_EXT_texture_swizzle ------------------------ */ #ifndef GL_EXT_texture_swizzle #define GL_EXT_texture_swizzle 1 #define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 #define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 #define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 #define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 #define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 #define GLEW_EXT_texture_swizzle GLEW_GET_VAR(__GLEW_EXT_texture_swizzle) #endif /* GL_EXT_texture_swizzle */ /* ------------------- GL_EXT_texture_type_2_10_10_10_REV ------------------ */ #ifndef GL_EXT_texture_type_2_10_10_10_REV #define GL_EXT_texture_type_2_10_10_10_REV 1 #define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 #define GLEW_EXT_texture_type_2_10_10_10_REV GLEW_GET_VAR(__GLEW_EXT_texture_type_2_10_10_10_REV) #endif /* GL_EXT_texture_type_2_10_10_10_REV */ /* -------------------------- GL_EXT_texture_view -------------------------- */ #ifndef GL_EXT_texture_view #define GL_EXT_texture_view 1 #define GL_TEXTURE_VIEW_MIN_LEVEL_EXT 0x82DB #define GL_TEXTURE_VIEW_NUM_LEVELS_EXT 0x82DC #define GL_TEXTURE_VIEW_MIN_LAYER_EXT 0x82DD #define GL_TEXTURE_VIEW_NUM_LAYERS_EXT 0x82DE #define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWEXTPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); #define glTextureViewEXT GLEW_GET_FUN(__glewTextureViewEXT) #define GLEW_EXT_texture_view GLEW_GET_VAR(__GLEW_EXT_texture_view) #endif /* GL_EXT_texture_view */ /* --------------------------- GL_EXT_timer_query -------------------------- */ #ifndef GL_EXT_timer_query #define GL_EXT_timer_query 1 #define GL_TIME_ELAPSED_EXT 0x88BF typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); #define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT) #define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT) #define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query) #endif /* GL_EXT_timer_query */ /* ----------------------- GL_EXT_transform_feedback ----------------------- */ #ifndef GL_EXT_transform_feedback #define GL_EXT_transform_feedback 1 #define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 #define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 #define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 #define GL_PRIMITIVES_GENERATED_EXT 0x8C87 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 #define GL_RASTERIZER_DISCARD_EXT 0x8C89 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B #define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C #define GL_SEPARATE_ATTRIBS_EXT 0x8C8D #define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, GLchar *name); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar * const* varyings, GLenum bufferMode); #define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT) #define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT) #define glBindBufferOffsetEXT GLEW_GET_FUN(__glewBindBufferOffsetEXT) #define glBindBufferRangeEXT GLEW_GET_FUN(__glewBindBufferRangeEXT) #define glEndTransformFeedbackEXT GLEW_GET_FUN(__glewEndTransformFeedbackEXT) #define glGetTransformFeedbackVaryingEXT GLEW_GET_FUN(__glewGetTransformFeedbackVaryingEXT) #define glTransformFeedbackVaryingsEXT GLEW_GET_FUN(__glewTransformFeedbackVaryingsEXT) #define GLEW_EXT_transform_feedback GLEW_GET_VAR(__GLEW_EXT_transform_feedback) #endif /* GL_EXT_transform_feedback */ /* ------------------------- GL_EXT_unpack_subimage ------------------------ */ #ifndef GL_EXT_unpack_subimage #define GL_EXT_unpack_subimage 1 #define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 #define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 #define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 #define GLEW_EXT_unpack_subimage GLEW_GET_VAR(__GLEW_EXT_unpack_subimage) #endif /* GL_EXT_unpack_subimage */ /* -------------------------- GL_EXT_vertex_array -------------------------- */ #ifndef GL_EXT_vertex_array #define GL_EXT_vertex_array 1 #define GL_DOUBLE_EXT 0x140A #define GL_VERTEX_ARRAY_EXT 0x8074 #define GL_NORMAL_ARRAY_EXT 0x8075 #define GL_COLOR_ARRAY_EXT 0x8076 #define GL_INDEX_ARRAY_EXT 0x8077 #define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 #define GL_EDGE_FLAG_ARRAY_EXT 0x8079 #define GL_VERTEX_ARRAY_SIZE_EXT 0x807A #define GL_VERTEX_ARRAY_TYPE_EXT 0x807B #define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C #define GL_VERTEX_ARRAY_COUNT_EXT 0x807D #define GL_NORMAL_ARRAY_TYPE_EXT 0x807E #define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F #define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 #define GL_COLOR_ARRAY_SIZE_EXT 0x8081 #define GL_COLOR_ARRAY_TYPE_EXT 0x8082 #define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 #define GL_COLOR_ARRAY_COUNT_EXT 0x8084 #define GL_INDEX_ARRAY_TYPE_EXT 0x8085 #define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 #define GL_INDEX_ARRAY_COUNT_EXT 0x8087 #define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 #define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 #define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A #define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B #define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C #define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D #define GL_VERTEX_ARRAY_POINTER_EXT 0x808E #define GL_NORMAL_ARRAY_POINTER_EXT 0x808F #define GL_COLOR_ARRAY_POINTER_EXT 0x8090 #define GL_INDEX_ARRAY_POINTER_EXT 0x8091 #define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 #define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); #define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) #define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) #define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT) #define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT) #define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT) #define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT) #define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT) #define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT) #define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array) #endif /* GL_EXT_vertex_array */ /* ------------------------ GL_EXT_vertex_array_bgra ----------------------- */ #ifndef GL_EXT_vertex_array_bgra #define GL_EXT_vertex_array_bgra 1 #define GL_BGRA 0x80E1 #define GLEW_EXT_vertex_array_bgra GLEW_GET_VAR(__GLEW_EXT_vertex_array_bgra) #endif /* GL_EXT_vertex_array_bgra */ /* ----------------------- GL_EXT_vertex_array_setXXX ---------------------- */ #ifndef GL_EXT_vertex_array_setXXX #define GL_EXT_vertex_array_setXXX 1 typedef void (GLAPIENTRY * PFNGLBINDARRAYSETEXTPROC) (const void *arrayset); typedef const void * (GLAPIENTRY * PFNGLCREATEARRAYSETEXTPROC) (void); typedef void (GLAPIENTRY * PFNGLDELETEARRAYSETSEXTPROC) (GLsizei n, const void *arrayset[]); #define glBindArraySetEXT GLEW_GET_FUN(__glewBindArraySetEXT) #define glCreateArraySetExt GLEW_GET_FUN(__glewCreateArraySetExt) #define glDeleteArraySetsEXT GLEW_GET_FUN(__glewDeleteArraySetsEXT) #define GLEW_EXT_vertex_array_setXXX GLEW_GET_VAR(__GLEW_EXT_vertex_array_setXXX) #endif /* GL_EXT_vertex_array_setXXX */ /* ----------------------- GL_EXT_vertex_attrib_64bit ---------------------- */ #ifndef GL_EXT_vertex_attrib_64bit #define GL_EXT_vertex_attrib_64bit 1 #define GL_DOUBLE_MAT2_EXT 0x8F46 #define GL_DOUBLE_MAT3_EXT 0x8F47 #define GL_DOUBLE_MAT4_EXT 0x8F48 #define GL_DOUBLE_MAT2x3_EXT 0x8F49 #define GL_DOUBLE_MAT2x4_EXT 0x8F4A #define GL_DOUBLE_MAT3x2_EXT 0x8F4B #define GL_DOUBLE_MAT3x4_EXT 0x8F4C #define GL_DOUBLE_MAT4x2_EXT 0x8F4D #define GL_DOUBLE_MAT4x3_EXT 0x8F4E #define GL_DOUBLE_VEC2_EXT 0x8FFC #define GL_DOUBLE_VEC3_EXT 0x8FFD #define GL_DOUBLE_VEC4_EXT 0x8FFE typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); #define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT) #define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT) #define glVertexAttribL1dEXT GLEW_GET_FUN(__glewVertexAttribL1dEXT) #define glVertexAttribL1dvEXT GLEW_GET_FUN(__glewVertexAttribL1dvEXT) #define glVertexAttribL2dEXT GLEW_GET_FUN(__glewVertexAttribL2dEXT) #define glVertexAttribL2dvEXT GLEW_GET_FUN(__glewVertexAttribL2dvEXT) #define glVertexAttribL3dEXT GLEW_GET_FUN(__glewVertexAttribL3dEXT) #define glVertexAttribL3dvEXT GLEW_GET_FUN(__glewVertexAttribL3dvEXT) #define glVertexAttribL4dEXT GLEW_GET_FUN(__glewVertexAttribL4dEXT) #define glVertexAttribL4dvEXT GLEW_GET_FUN(__glewVertexAttribL4dvEXT) #define glVertexAttribLPointerEXT GLEW_GET_FUN(__glewVertexAttribLPointerEXT) #define GLEW_EXT_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_EXT_vertex_attrib_64bit) #endif /* GL_EXT_vertex_attrib_64bit */ /* -------------------------- GL_EXT_vertex_shader ------------------------- */ #ifndef GL_EXT_vertex_shader #define GL_EXT_vertex_shader 1 #define GL_VERTEX_SHADER_EXT 0x8780 #define GL_VERTEX_SHADER_BINDING_EXT 0x8781 #define GL_OP_INDEX_EXT 0x8782 #define GL_OP_NEGATE_EXT 0x8783 #define GL_OP_DOT3_EXT 0x8784 #define GL_OP_DOT4_EXT 0x8785 #define GL_OP_MUL_EXT 0x8786 #define GL_OP_ADD_EXT 0x8787 #define GL_OP_MADD_EXT 0x8788 #define GL_OP_FRAC_EXT 0x8789 #define GL_OP_MAX_EXT 0x878A #define GL_OP_MIN_EXT 0x878B #define GL_OP_SET_GE_EXT 0x878C #define GL_OP_SET_LT_EXT 0x878D #define GL_OP_CLAMP_EXT 0x878E #define GL_OP_FLOOR_EXT 0x878F #define GL_OP_ROUND_EXT 0x8790 #define GL_OP_EXP_BASE_2_EXT 0x8791 #define GL_OP_LOG_BASE_2_EXT 0x8792 #define GL_OP_POWER_EXT 0x8793 #define GL_OP_RECIP_EXT 0x8794 #define GL_OP_RECIP_SQRT_EXT 0x8795 #define GL_OP_SUB_EXT 0x8796 #define GL_OP_CROSS_PRODUCT_EXT 0x8797 #define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 #define GL_OP_MOV_EXT 0x8799 #define GL_OUTPUT_VERTEX_EXT 0x879A #define GL_OUTPUT_COLOR0_EXT 0x879B #define GL_OUTPUT_COLOR1_EXT 0x879C #define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D #define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E #define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F #define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 #define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 #define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 #define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 #define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 #define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 #define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 #define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 #define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 #define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 #define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA #define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB #define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC #define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD #define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE #define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF #define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 #define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 #define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 #define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 #define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 #define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 #define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 #define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 #define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 #define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 #define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA #define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB #define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC #define GL_OUTPUT_FOG_EXT 0x87BD #define GL_SCALAR_EXT 0x87BE #define GL_VECTOR_EXT 0x87BF #define GL_MATRIX_EXT 0x87C0 #define GL_VARIANT_EXT 0x87C1 #define GL_INVARIANT_EXT 0x87C2 #define GL_LOCAL_CONSTANT_EXT 0x87C3 #define GL_LOCAL_EXT 0x87C4 #define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 #define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 #define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 #define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 #define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 #define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA #define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB #define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC #define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD #define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE #define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF #define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 #define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 #define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 #define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 #define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 #define GL_X_EXT 0x87D5 #define GL_Y_EXT 0x87D6 #define GL_Z_EXT 0x87D7 #define GL_W_EXT 0x87D8 #define GL_NEGATIVE_X_EXT 0x87D9 #define GL_NEGATIVE_Y_EXT 0x87DA #define GL_NEGATIVE_Z_EXT 0x87DB #define GL_NEGATIVE_W_EXT 0x87DC #define GL_ZERO_EXT 0x87DD #define GL_ONE_EXT 0x87DE #define GL_NEGATIVE_ONE_EXT 0x87DF #define GL_NORMALIZED_RANGE_EXT 0x87E0 #define GL_FULL_RANGE_EXT 0x87E1 #define GL_CURRENT_VERTEX_EXT 0x87E2 #define GL_MVP_MATRIX_EXT 0x87E3 #define GL_VARIANT_VALUE_EXT 0x87E4 #define GL_VARIANT_DATATYPE_EXT 0x87E5 #define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 #define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 #define GL_VARIANT_ARRAY_EXT 0x87E8 #define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 #define GL_INVARIANT_VALUE_EXT 0x87EA #define GL_INVARIANT_DATATYPE_EXT 0x87EB #define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC #define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, void *addr); typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, void *addr); typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, void *addr); typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr); typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr); typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr); typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr); typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr); typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr); typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr); typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr); typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); #define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT) #define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT) #define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT) #define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT) #define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT) #define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT) #define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT) #define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT) #define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT) #define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT) #define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT) #define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT) #define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT) #define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT) #define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT) #define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT) #define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT) #define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT) #define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT) #define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT) #define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT) #define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT) #define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT) #define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT) #define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT) #define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT) #define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT) #define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT) #define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT) #define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT) #define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT) #define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT) #define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT) #define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT) #define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT) #define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT) #define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT) #define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT) #define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT) #define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT) #define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT) #define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT) #define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader) #endif /* GL_EXT_vertex_shader */ /* ------------------------ GL_EXT_vertex_weighting ------------------------ */ #ifndef GL_EXT_vertex_weighting #define GL_EXT_vertex_weighting 1 #define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 #define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 #define GL_MODELVIEW0_EXT 0x1700 #define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 #define GL_MODELVIEW1_MATRIX_EXT 0x8506 #define GL_VERTEX_WEIGHTING_EXT 0x8509 #define GL_MODELVIEW1_EXT 0x850A #define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B #define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C #define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D #define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E #define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F #define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); #define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT) #define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT) #define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT) #define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting) #endif /* GL_EXT_vertex_weighting */ /* ------------------------ GL_EXT_win32_keyed_mutex ----------------------- */ #ifndef GL_EXT_win32_keyed_mutex #define GL_EXT_win32_keyed_mutex 1 typedef GLboolean (GLAPIENTRY * PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key, GLuint timeout); typedef GLboolean (GLAPIENTRY * PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key); #define glAcquireKeyedMutexWin32EXT GLEW_GET_FUN(__glewAcquireKeyedMutexWin32EXT) #define glReleaseKeyedMutexWin32EXT GLEW_GET_FUN(__glewReleaseKeyedMutexWin32EXT) #define GLEW_EXT_win32_keyed_mutex GLEW_GET_VAR(__GLEW_EXT_win32_keyed_mutex) #endif /* GL_EXT_win32_keyed_mutex */ /* ------------------------ GL_EXT_window_rectangles ----------------------- */ #ifndef GL_EXT_window_rectangles #define GL_EXT_window_rectangles 1 #define GL_INCLUSIVE_EXT 0x8F10 #define GL_EXCLUSIVE_EXT 0x8F11 #define GL_WINDOW_RECTANGLE_EXT 0x8F12 #define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13 #define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14 #define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15 typedef void (GLAPIENTRY * PFNGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint box[]); #define glWindowRectanglesEXT GLEW_GET_FUN(__glewWindowRectanglesEXT) #define GLEW_EXT_window_rectangles GLEW_GET_VAR(__GLEW_EXT_window_rectangles) #endif /* GL_EXT_window_rectangles */ /* ------------------------- GL_EXT_x11_sync_object ------------------------ */ #ifndef GL_EXT_x11_sync_object #define GL_EXT_x11_sync_object 1 #define GL_SYNC_X11_FENCE_EXT 0x90E1 typedef GLsync (GLAPIENTRY * PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); #define glImportSyncEXT GLEW_GET_FUN(__glewImportSyncEXT) #define GLEW_EXT_x11_sync_object GLEW_GET_VAR(__GLEW_EXT_x11_sync_object) #endif /* GL_EXT_x11_sync_object */ /* ---------------------- GL_GREMEDY_frame_terminator ---------------------- */ #ifndef GL_GREMEDY_frame_terminator #define GL_GREMEDY_frame_terminator 1 typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void); #define glFrameTerminatorGREMEDY GLEW_GET_FUN(__glewFrameTerminatorGREMEDY) #define GLEW_GREMEDY_frame_terminator GLEW_GET_VAR(__GLEW_GREMEDY_frame_terminator) #endif /* GL_GREMEDY_frame_terminator */ /* ------------------------ GL_GREMEDY_string_marker ----------------------- */ #ifndef GL_GREMEDY_string_marker #define GL_GREMEDY_string_marker 1 typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); #define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) #define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker) #endif /* GL_GREMEDY_string_marker */ /* --------------------- GL_HP_convolution_border_modes -------------------- */ #ifndef GL_HP_convolution_border_modes #define GL_HP_convolution_border_modes 1 #define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes) #endif /* GL_HP_convolution_border_modes */ /* ------------------------- GL_HP_image_transform ------------------------- */ #ifndef GL_HP_image_transform #define GL_HP_image_transform 1 typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param); typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param); typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); #define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP) #define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP) #define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP) #define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP) #define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP) #define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP) #define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform) #endif /* GL_HP_image_transform */ /* -------------------------- GL_HP_occlusion_test ------------------------- */ #ifndef GL_HP_occlusion_test #define GL_HP_occlusion_test 1 #define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) #endif /* GL_HP_occlusion_test */ /* ------------------------- GL_HP_texture_lighting ------------------------ */ #ifndef GL_HP_texture_lighting #define GL_HP_texture_lighting 1 #define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting) #endif /* GL_HP_texture_lighting */ /* --------------------------- GL_IBM_cull_vertex -------------------------- */ #ifndef GL_IBM_cull_vertex #define GL_IBM_cull_vertex 1 #define GL_CULL_VERTEX_IBM 103050 #define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex) #endif /* GL_IBM_cull_vertex */ /* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */ #ifndef GL_IBM_multimode_draw_arrays #define GL_IBM_multimode_draw_arrays 1 typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount, GLint modestride); #define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM) #define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM) #define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays) #endif /* GL_IBM_multimode_draw_arrays */ /* ------------------------- GL_IBM_rasterpos_clip ------------------------- */ #ifndef GL_IBM_rasterpos_clip #define GL_IBM_rasterpos_clip 1 #define GL_RASTER_POSITION_UNCLIPPED_IBM 103010 #define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip) #endif /* GL_IBM_rasterpos_clip */ /* --------------------------- GL_IBM_static_data -------------------------- */ #ifndef GL_IBM_static_data #define GL_IBM_static_data 1 #define GL_ALL_STATIC_DATA_IBM 103060 #define GL_STATIC_VERTEX_ARRAY_IBM 103061 #define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data) #endif /* GL_IBM_static_data */ /* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */ #ifndef GL_IBM_texture_mirrored_repeat #define GL_IBM_texture_mirrored_repeat 1 #define GL_MIRRORED_REPEAT_IBM 0x8370 #define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat) #endif /* GL_IBM_texture_mirrored_repeat */ /* ----------------------- GL_IBM_vertex_array_lists ----------------------- */ #ifndef GL_IBM_vertex_array_lists #define GL_IBM_vertex_array_lists 1 #define GL_VERTEX_ARRAY_LIST_IBM 103070 #define GL_NORMAL_ARRAY_LIST_IBM 103071 #define GL_COLOR_ARRAY_LIST_IBM 103072 #define GL_INDEX_ARRAY_LIST_IBM 103073 #define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 #define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 #define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 #define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 #define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 #define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 #define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 #define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 #define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 #define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 #define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 #define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); #define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM) #define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM) #define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM) #define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM) #define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM) #define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM) #define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM) #define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM) #define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists) #endif /* GL_IBM_vertex_array_lists */ /* -------------------------- GL_INGR_color_clamp -------------------------- */ #ifndef GL_INGR_color_clamp #define GL_INGR_color_clamp 1 #define GL_RED_MIN_CLAMP_INGR 0x8560 #define GL_GREEN_MIN_CLAMP_INGR 0x8561 #define GL_BLUE_MIN_CLAMP_INGR 0x8562 #define GL_ALPHA_MIN_CLAMP_INGR 0x8563 #define GL_RED_MAX_CLAMP_INGR 0x8564 #define GL_GREEN_MAX_CLAMP_INGR 0x8565 #define GL_BLUE_MAX_CLAMP_INGR 0x8566 #define GL_ALPHA_MAX_CLAMP_INGR 0x8567 #define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp) #endif /* GL_INGR_color_clamp */ /* ------------------------- GL_INGR_interlace_read ------------------------ */ #ifndef GL_INGR_interlace_read #define GL_INGR_interlace_read 1 #define GL_INTERLACE_READ_INGR 0x8568 #define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read) #endif /* GL_INGR_interlace_read */ /* ------------------ GL_INTEL_conservative_rasterization ------------------ */ #ifndef GL_INTEL_conservative_rasterization #define GL_INTEL_conservative_rasterization 1 #define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE #define GLEW_INTEL_conservative_rasterization GLEW_GET_VAR(__GLEW_INTEL_conservative_rasterization) #endif /* GL_INTEL_conservative_rasterization */ /* ------------------- GL_INTEL_fragment_shader_ordering ------------------- */ #ifndef GL_INTEL_fragment_shader_ordering #define GL_INTEL_fragment_shader_ordering 1 #define GLEW_INTEL_fragment_shader_ordering GLEW_GET_VAR(__GLEW_INTEL_fragment_shader_ordering) #endif /* GL_INTEL_fragment_shader_ordering */ /* ----------------------- GL_INTEL_framebuffer_CMAA ----------------------- */ #ifndef GL_INTEL_framebuffer_CMAA #define GL_INTEL_framebuffer_CMAA 1 #define GLEW_INTEL_framebuffer_CMAA GLEW_GET_VAR(__GLEW_INTEL_framebuffer_CMAA) #endif /* GL_INTEL_framebuffer_CMAA */ /* -------------------------- GL_INTEL_map_texture ------------------------- */ #ifndef GL_INTEL_map_texture #define GL_INTEL_map_texture 1 #define GL_LAYOUT_DEFAULT_INTEL 0 #define GL_LAYOUT_LINEAR_INTEL 1 #define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 #define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF typedef void * (GLAPIENTRY * PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum *layout); typedef void (GLAPIENTRY * PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); typedef void (GLAPIENTRY * PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); #define glMapTexture2DINTEL GLEW_GET_FUN(__glewMapTexture2DINTEL) #define glSyncTextureINTEL GLEW_GET_FUN(__glewSyncTextureINTEL) #define glUnmapTexture2DINTEL GLEW_GET_FUN(__glewUnmapTexture2DINTEL) #define GLEW_INTEL_map_texture GLEW_GET_VAR(__GLEW_INTEL_map_texture) #endif /* GL_INTEL_map_texture */ /* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ #ifndef GL_INTEL_parallel_arrays #define GL_INTEL_parallel_arrays 1 #define GL_PARALLEL_ARRAYS_INTEL 0x83F4 #define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 #define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 #define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 #define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer); typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); #define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL) #define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL) #define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL) #define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL) #define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays) #endif /* GL_INTEL_parallel_arrays */ /* ----------------------- GL_INTEL_performance_query ---------------------- */ #ifndef GL_INTEL_performance_query #define GL_INTEL_performance_query 1 #define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x0000 #define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x0001 #define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 #define GL_PERFQUERY_FLUSH_INTEL 0x83FA #define GL_PERFQUERY_WAIT_INTEL 0x83FB #define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 #define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 #define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 #define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 #define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 #define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 #define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 #define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 #define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA #define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB #define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC #define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD #define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE #define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF #define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 typedef void (GLAPIENTRY * PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); typedef void (GLAPIENTRY * PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint* queryHandle); typedef void (GLAPIENTRY * PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); typedef void (GLAPIENTRY * PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); typedef void (GLAPIENTRY * PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint* queryId); typedef void (GLAPIENTRY * PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint* nextQueryId); typedef void (GLAPIENTRY * PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar* counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); typedef void (GLAPIENTRY * PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); typedef void (GLAPIENTRY * PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar* queryName, GLuint *queryId); typedef void (GLAPIENTRY * PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar* queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); #define glBeginPerfQueryINTEL GLEW_GET_FUN(__glewBeginPerfQueryINTEL) #define glCreatePerfQueryINTEL GLEW_GET_FUN(__glewCreatePerfQueryINTEL) #define glDeletePerfQueryINTEL GLEW_GET_FUN(__glewDeletePerfQueryINTEL) #define glEndPerfQueryINTEL GLEW_GET_FUN(__glewEndPerfQueryINTEL) #define glGetFirstPerfQueryIdINTEL GLEW_GET_FUN(__glewGetFirstPerfQueryIdINTEL) #define glGetNextPerfQueryIdINTEL GLEW_GET_FUN(__glewGetNextPerfQueryIdINTEL) #define glGetPerfCounterInfoINTEL GLEW_GET_FUN(__glewGetPerfCounterInfoINTEL) #define glGetPerfQueryDataINTEL GLEW_GET_FUN(__glewGetPerfQueryDataINTEL) #define glGetPerfQueryIdByNameINTEL GLEW_GET_FUN(__glewGetPerfQueryIdByNameINTEL) #define glGetPerfQueryInfoINTEL GLEW_GET_FUN(__glewGetPerfQueryInfoINTEL) #define GLEW_INTEL_performance_query GLEW_GET_VAR(__GLEW_INTEL_performance_query) #endif /* GL_INTEL_performance_query */ /* ------------------------ GL_INTEL_texture_scissor ----------------------- */ #ifndef GL_INTEL_texture_scissor #define GL_INTEL_texture_scissor 1 typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc); typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh); #define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL) #define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL) #define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor) #endif /* GL_INTEL_texture_scissor */ /* --------------------- GL_KHR_blend_equation_advanced -------------------- */ #ifndef GL_KHR_blend_equation_advanced #define GL_KHR_blend_equation_advanced 1 #define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 #define GL_MULTIPLY_KHR 0x9294 #define GL_SCREEN_KHR 0x9295 #define GL_OVERLAY_KHR 0x9296 #define GL_DARKEN_KHR 0x9297 #define GL_LIGHTEN_KHR 0x9298 #define GL_COLORDODGE_KHR 0x9299 #define GL_COLORBURN_KHR 0x929A #define GL_HARDLIGHT_KHR 0x929B #define GL_SOFTLIGHT_KHR 0x929C #define GL_DIFFERENCE_KHR 0x929E #define GL_EXCLUSION_KHR 0x92A0 #define GL_HSL_HUE_KHR 0x92AD #define GL_HSL_SATURATION_KHR 0x92AE #define GL_HSL_COLOR_KHR 0x92AF #define GL_HSL_LUMINOSITY_KHR 0x92B0 typedef void (GLAPIENTRY * PFNGLBLENDBARRIERKHRPROC) (void); #define glBlendBarrierKHR GLEW_GET_FUN(__glewBlendBarrierKHR) #define GLEW_KHR_blend_equation_advanced GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced) #endif /* GL_KHR_blend_equation_advanced */ /* ---------------- GL_KHR_blend_equation_advanced_coherent ---------------- */ #ifndef GL_KHR_blend_equation_advanced_coherent #define GL_KHR_blend_equation_advanced_coherent 1 #define GLEW_KHR_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced_coherent) #endif /* GL_KHR_blend_equation_advanced_coherent */ /* ---------------------- GL_KHR_context_flush_control --------------------- */ #ifndef GL_KHR_context_flush_control #define GL_KHR_context_flush_control 1 #define GLEW_KHR_context_flush_control GLEW_GET_VAR(__GLEW_KHR_context_flush_control) #endif /* GL_KHR_context_flush_control */ /* ------------------------------ GL_KHR_debug ----------------------------- */ #ifndef GL_KHR_debug #define GL_KHR_debug 1 #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 #define GL_STACK_OVERFLOW 0x0503 #define GL_STACK_UNDERFLOW 0x0504 #define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 #define GL_DEBUG_CALLBACK_FUNCTION 0x8244 #define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 #define GL_DEBUG_SOURCE_API 0x8246 #define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 #define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 #define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 #define GL_DEBUG_SOURCE_APPLICATION 0x824A #define GL_DEBUG_SOURCE_OTHER 0x824B #define GL_DEBUG_TYPE_ERROR 0x824C #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E #define GL_DEBUG_TYPE_PORTABILITY 0x824F #define GL_DEBUG_TYPE_PERFORMANCE 0x8250 #define GL_DEBUG_TYPE_OTHER 0x8251 #define GL_DEBUG_TYPE_MARKER 0x8268 #define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 #define GL_DEBUG_TYPE_POP_GROUP 0x826A #define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B #define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C #define GL_DEBUG_GROUP_STACK_DEPTH 0x826D #define GL_BUFFER 0x82E0 #define GL_SHADER 0x82E1 #define GL_PROGRAM 0x82E2 #define GL_QUERY 0x82E3 #define GL_PROGRAM_PIPELINE 0x82E4 #define GL_SAMPLER 0x82E6 #define GL_DISPLAY_LIST 0x82E7 #define GL_MAX_LABEL_LENGTH 0x82E8 #define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 #define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 #define GL_DEBUG_LOGGED_MESSAGES 0x9145 #define GL_DEBUG_SEVERITY_HIGH 0x9146 #define GL_DEBUG_SEVERITY_MEDIUM 0x9147 #define GL_DEBUG_SEVERITY_LOW 0x9148 #define GL_DEBUG_OUTPUT 0x92E0 typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar *label); typedef void (GLAPIENTRY * PFNGLGETOBJECTPTRLABELPROC) (void* ptr, GLsizei bufSize, GLsizei* length, GLchar *label); typedef void (GLAPIENTRY * PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label); typedef void (GLAPIENTRY * PFNGLOBJECTPTRLABELPROC) (void* ptr, GLsizei length, const GLchar* label); typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) (void); typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message); #define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback) #define glDebugMessageControl GLEW_GET_FUN(__glewDebugMessageControl) #define glDebugMessageInsert GLEW_GET_FUN(__glewDebugMessageInsert) #define glGetDebugMessageLog GLEW_GET_FUN(__glewGetDebugMessageLog) #define glGetObjectLabel GLEW_GET_FUN(__glewGetObjectLabel) #define glGetObjectPtrLabel GLEW_GET_FUN(__glewGetObjectPtrLabel) #define glObjectLabel GLEW_GET_FUN(__glewObjectLabel) #define glObjectPtrLabel GLEW_GET_FUN(__glewObjectPtrLabel) #define glPopDebugGroup GLEW_GET_FUN(__glewPopDebugGroup) #define glPushDebugGroup GLEW_GET_FUN(__glewPushDebugGroup) #define GLEW_KHR_debug GLEW_GET_VAR(__GLEW_KHR_debug) #endif /* GL_KHR_debug */ /* ---------------------------- GL_KHR_no_error ---------------------------- */ #ifndef GL_KHR_no_error #define GL_KHR_no_error 1 #define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 #define GLEW_KHR_no_error GLEW_GET_VAR(__GLEW_KHR_no_error) #endif /* GL_KHR_no_error */ /* --------------------- GL_KHR_parallel_shader_compile -------------------- */ #ifndef GL_KHR_parallel_shader_compile #define GL_KHR_parallel_shader_compile 1 #define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 #define GL_COMPLETION_STATUS_KHR 0x91B1 typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); #define glMaxShaderCompilerThreadsKHR GLEW_GET_FUN(__glewMaxShaderCompilerThreadsKHR) #define GLEW_KHR_parallel_shader_compile GLEW_GET_VAR(__GLEW_KHR_parallel_shader_compile) #endif /* GL_KHR_parallel_shader_compile */ /* ------------------ GL_KHR_robust_buffer_access_behavior ----------------- */ #ifndef GL_KHR_robust_buffer_access_behavior #define GL_KHR_robust_buffer_access_behavior 1 #define GLEW_KHR_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_KHR_robust_buffer_access_behavior) #endif /* GL_KHR_robust_buffer_access_behavior */ /* --------------------------- GL_KHR_robustness --------------------------- */ #ifndef GL_KHR_robustness #define GL_KHR_robustness 1 #define GL_CONTEXT_LOST 0x0507 #define GL_LOSE_CONTEXT_ON_RESET 0x8252 #define GL_GUILTY_CONTEXT_RESET 0x8253 #define GL_INNOCENT_CONTEXT_RESET 0x8254 #define GL_UNKNOWN_CONTEXT_RESET 0x8255 #define GL_RESET_NOTIFICATION_STRATEGY 0x8256 #define GL_NO_RESET_NOTIFICATION 0x8261 #define GL_CONTEXT_ROBUST_ACCESS 0x90F3 typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); typedef void (GLAPIENTRY * PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); #define glGetnUniformfv GLEW_GET_FUN(__glewGetnUniformfv) #define glGetnUniformiv GLEW_GET_FUN(__glewGetnUniformiv) #define glGetnUniformuiv GLEW_GET_FUN(__glewGetnUniformuiv) #define glReadnPixels GLEW_GET_FUN(__glewReadnPixels) #define GLEW_KHR_robustness GLEW_GET_VAR(__GLEW_KHR_robustness) #endif /* GL_KHR_robustness */ /* ------------------ GL_KHR_texture_compression_astc_hdr ------------------ */ #ifndef GL_KHR_texture_compression_astc_hdr #define GL_KHR_texture_compression_astc_hdr 1 #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 #define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 #define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 #define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 #define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 #define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 #define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 #define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 #define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 #define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA #define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB #define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC #define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD #define GLEW_KHR_texture_compression_astc_hdr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_hdr) #endif /* GL_KHR_texture_compression_astc_hdr */ /* ------------------ GL_KHR_texture_compression_astc_ldr ------------------ */ #ifndef GL_KHR_texture_compression_astc_ldr #define GL_KHR_texture_compression_astc_ldr 1 #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 #define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 #define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 #define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 #define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 #define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 #define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 #define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 #define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 #define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA #define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB #define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC #define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD #define GLEW_KHR_texture_compression_astc_ldr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_ldr) #endif /* GL_KHR_texture_compression_astc_ldr */ /* --------------- GL_KHR_texture_compression_astc_sliced_3d --------------- */ #ifndef GL_KHR_texture_compression_astc_sliced_3d #define GL_KHR_texture_compression_astc_sliced_3d 1 #define GLEW_KHR_texture_compression_astc_sliced_3d GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_sliced_3d) #endif /* GL_KHR_texture_compression_astc_sliced_3d */ /* -------------------------- GL_KTX_buffer_region ------------------------- */ #ifndef GL_KTX_buffer_region #define GL_KTX_buffer_region 1 #define GL_KTX_FRONT_REGION 0x0 #define GL_KTX_BACK_REGION 0x1 #define GL_KTX_Z_REGION 0x2 #define GL_KTX_STENCIL_REGION 0x3 typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDPROC) (void); typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONPROC) (GLenum region); typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest); typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONPROC) (GLenum region); typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height); #define glBufferRegionEnabled GLEW_GET_FUN(__glewBufferRegionEnabled) #define glDeleteBufferRegion GLEW_GET_FUN(__glewDeleteBufferRegion) #define glDrawBufferRegion GLEW_GET_FUN(__glewDrawBufferRegion) #define glNewBufferRegion GLEW_GET_FUN(__glewNewBufferRegion) #define glReadBufferRegion GLEW_GET_FUN(__glewReadBufferRegion) #define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region) #endif /* GL_KTX_buffer_region */ /* ------------------------- GL_MESAX_texture_stack ------------------------ */ #ifndef GL_MESAX_texture_stack #define GL_MESAX_texture_stack 1 #define GL_TEXTURE_1D_STACK_MESAX 0x8759 #define GL_TEXTURE_2D_STACK_MESAX 0x875A #define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B #define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C #define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D #define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E #define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack) #endif /* GL_MESAX_texture_stack */ /* -------------------------- GL_MESA_pack_invert -------------------------- */ #ifndef GL_MESA_pack_invert #define GL_MESA_pack_invert 1 #define GL_PACK_INVERT_MESA 0x8758 #define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert) #endif /* GL_MESA_pack_invert */ /* ------------------------- GL_MESA_resize_buffers ------------------------ */ #ifndef GL_MESA_resize_buffers #define GL_MESA_resize_buffers 1 typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); #define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA) #define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers) #endif /* GL_MESA_resize_buffers */ /* -------------------- GL_MESA_shader_integer_functions ------------------- */ #ifndef GL_MESA_shader_integer_functions #define GL_MESA_shader_integer_functions 1 #define GLEW_MESA_shader_integer_functions GLEW_GET_VAR(__GLEW_MESA_shader_integer_functions) #endif /* GL_MESA_shader_integer_functions */ /* --------------------------- GL_MESA_window_pos -------------------------- */ #ifndef GL_MESA_window_pos #define GL_MESA_window_pos 1 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); #define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA) #define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA) #define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA) #define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA) #define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA) #define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA) #define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA) #define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA) #define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA) #define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA) #define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA) #define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA) #define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA) #define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA) #define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA) #define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA) #define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA) #define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA) #define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA) #define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA) #define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA) #define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA) #define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA) #define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA) #define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos) #endif /* GL_MESA_window_pos */ /* ------------------------- GL_MESA_ycbcr_texture ------------------------- */ #ifndef GL_MESA_ycbcr_texture #define GL_MESA_ycbcr_texture 1 #define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA #define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB #define GL_YCBCR_MESA 0x8757 #define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture) #endif /* GL_MESA_ycbcr_texture */ /* ----------- GL_NVX_blend_equation_advanced_multi_draw_buffers ----------- */ #ifndef GL_NVX_blend_equation_advanced_multi_draw_buffers #define GL_NVX_blend_equation_advanced_multi_draw_buffers 1 #define GLEW_NVX_blend_equation_advanced_multi_draw_buffers GLEW_GET_VAR(__GLEW_NVX_blend_equation_advanced_multi_draw_buffers) #endif /* GL_NVX_blend_equation_advanced_multi_draw_buffers */ /* ----------------------- GL_NVX_conditional_render ----------------------- */ #ifndef GL_NVX_conditional_render #define GL_NVX_conditional_render 1 typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVXPROC) (void); #define glBeginConditionalRenderNVX GLEW_GET_FUN(__glewBeginConditionalRenderNVX) #define glEndConditionalRenderNVX GLEW_GET_FUN(__glewEndConditionalRenderNVX) #define GLEW_NVX_conditional_render GLEW_GET_VAR(__GLEW_NVX_conditional_render) #endif /* GL_NVX_conditional_render */ /* ------------------------- GL_NVX_gpu_memory_info ------------------------ */ #ifndef GL_NVX_gpu_memory_info #define GL_NVX_gpu_memory_info 1 #define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 #define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 #define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 #define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A #define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B #define GLEW_NVX_gpu_memory_info GLEW_GET_VAR(__GLEW_NVX_gpu_memory_info) #endif /* GL_NVX_gpu_memory_info */ /* ---------------------- GL_NVX_linked_gpu_multicast ---------------------- */ #ifndef GL_NVX_linked_gpu_multicast #define GL_NVX_linked_gpu_multicast 1 #define GL_LGPU_SEPARATE_STORAGE_BIT_NVX 0x0800 #define GL_MAX_LGPU_GPUS_NVX 0x92BA typedef void (GLAPIENTRY * PFNGLLGPUCOPYIMAGESUBDATANVXPROC) (GLuint sourceGpu, GLbitfield destinationGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srxY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); typedef void (GLAPIENTRY * PFNGLLGPUINTERLOCKNVXPROC) (void); typedef void (GLAPIENTRY * PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); #define glLGPUCopyImageSubDataNVX GLEW_GET_FUN(__glewLGPUCopyImageSubDataNVX) #define glLGPUInterlockNVX GLEW_GET_FUN(__glewLGPUInterlockNVX) #define glLGPUNamedBufferSubDataNVX GLEW_GET_FUN(__glewLGPUNamedBufferSubDataNVX) #define GLEW_NVX_linked_gpu_multicast GLEW_GET_VAR(__GLEW_NVX_linked_gpu_multicast) #endif /* GL_NVX_linked_gpu_multicast */ /* ------------------------ GL_NV_3dvision_settings ------------------------ */ #ifndef GL_NV_3dvision_settings #define GL_NV_3dvision_settings 1 #define GL_3DVISION_STEREO_NV 0x90F4 #define GL_STEREO_SEPARATION_NV 0x90F5 #define GL_STEREO_CONVERGENCE_NV 0x90F6 #define GL_STEREO_CUTOFF_NV 0x90F7 #define GL_STEREO_PROJECTION_NV 0x90F8 #define GL_STEREO_PROJECTION_PERSPECTIVE_NV 0x90F9 #define GL_STEREO_PROJECTION_ORTHO_NV 0x90FA typedef void (GLAPIENTRY * PFNGLSTEREOPARAMETERFNVPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLSTEREOPARAMETERINVPROC) (GLenum pname, GLint param); #define glStereoParameterfNV GLEW_GET_FUN(__glewStereoParameterfNV) #define glStereoParameteriNV GLEW_GET_FUN(__glewStereoParameteriNV) #define GLEW_NV_3dvision_settings GLEW_GET_VAR(__GLEW_NV_3dvision_settings) #endif /* GL_NV_3dvision_settings */ /* ------------------- GL_NV_EGL_stream_consumer_external ------------------ */ #ifndef GL_NV_EGL_stream_consumer_external #define GL_NV_EGL_stream_consumer_external 1 #define GL_TEXTURE_EXTERNAL_OES 0x8D65 #define GL_SAMPLER_EXTERNAL_OES 0x8D66 #define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 #define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 #define GLEW_NV_EGL_stream_consumer_external GLEW_GET_VAR(__GLEW_NV_EGL_stream_consumer_external) #endif /* GL_NV_EGL_stream_consumer_external */ /* ----------------- GL_NV_alpha_to_coverage_dither_control ---------------- */ #ifndef GL_NV_alpha_to_coverage_dither_control #define GL_NV_alpha_to_coverage_dither_control 1 #define GL_ALPHA_TO_COVERAGE_DITHER_MODE_NV 0x92BF #define GL_ALPHA_TO_COVERAGE_DITHER_DEFAULT_NV 0x934D #define GL_ALPHA_TO_COVERAGE_DITHER_ENABLE_NV 0x934E #define GL_ALPHA_TO_COVERAGE_DITHER_DISABLE_NV 0x934F #define GLEW_NV_alpha_to_coverage_dither_control GLEW_GET_VAR(__GLEW_NV_alpha_to_coverage_dither_control) #endif /* GL_NV_alpha_to_coverage_dither_control */ /* ------------------------------- GL_NV_bgr ------------------------------- */ #ifndef GL_NV_bgr #define GL_NV_bgr 1 #define GL_BGR_NV 0x80E0 #define GLEW_NV_bgr GLEW_GET_VAR(__GLEW_NV_bgr) #endif /* GL_NV_bgr */ /* ------------------- GL_NV_bindless_multi_draw_indirect ------------------ */ #ifndef GL_NV_bindless_multi_draw_indirect #define GL_NV_bindless_multi_draw_indirect 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); #define glMultiDrawArraysIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessNV) #define glMultiDrawElementsIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessNV) #define GLEW_NV_bindless_multi_draw_indirect GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect) #endif /* GL_NV_bindless_multi_draw_indirect */ /* ---------------- GL_NV_bindless_multi_draw_indirect_count --------------- */ #ifndef GL_NV_bindless_multi_draw_indirect_count #define GL_NV_bindless_multi_draw_indirect_count 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); #define glMultiDrawArraysIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessCountNV) #define glMultiDrawElementsIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessCountNV) #define GLEW_NV_bindless_multi_draw_indirect_count GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect_count) #endif /* GL_NV_bindless_multi_draw_indirect_count */ /* ------------------------- GL_NV_bindless_texture ------------------------ */ #ifndef GL_NV_bindless_texture #define GL_NV_bindless_texture 1 typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64* value); #define glGetImageHandleNV GLEW_GET_FUN(__glewGetImageHandleNV) #define glGetTextureHandleNV GLEW_GET_FUN(__glewGetTextureHandleNV) #define glGetTextureSamplerHandleNV GLEW_GET_FUN(__glewGetTextureSamplerHandleNV) #define glIsImageHandleResidentNV GLEW_GET_FUN(__glewIsImageHandleResidentNV) #define glIsTextureHandleResidentNV GLEW_GET_FUN(__glewIsTextureHandleResidentNV) #define glMakeImageHandleNonResidentNV GLEW_GET_FUN(__glewMakeImageHandleNonResidentNV) #define glMakeImageHandleResidentNV GLEW_GET_FUN(__glewMakeImageHandleResidentNV) #define glMakeTextureHandleNonResidentNV GLEW_GET_FUN(__glewMakeTextureHandleNonResidentNV) #define glMakeTextureHandleResidentNV GLEW_GET_FUN(__glewMakeTextureHandleResidentNV) #define glProgramUniformHandleui64NV GLEW_GET_FUN(__glewProgramUniformHandleui64NV) #define glProgramUniformHandleui64vNV GLEW_GET_FUN(__glewProgramUniformHandleui64vNV) #define glUniformHandleui64NV GLEW_GET_FUN(__glewUniformHandleui64NV) #define glUniformHandleui64vNV GLEW_GET_FUN(__glewUniformHandleui64vNV) #define GLEW_NV_bindless_texture GLEW_GET_VAR(__GLEW_NV_bindless_texture) #endif /* GL_NV_bindless_texture */ /* --------------------- GL_NV_blend_equation_advanced --------------------- */ #ifndef GL_NV_blend_equation_advanced #define GL_NV_blend_equation_advanced 1 #define GL_XOR_NV 0x1506 #define GL_RED_NV 0x1903 #define GL_GREEN_NV 0x1904 #define GL_BLUE_NV 0x1905 #define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 #define GL_BLEND_OVERLAP_NV 0x9281 #define GL_UNCORRELATED_NV 0x9282 #define GL_DISJOINT_NV 0x9283 #define GL_CONJOINT_NV 0x9284 #define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 #define GL_SRC_NV 0x9286 #define GL_DST_NV 0x9287 #define GL_SRC_OVER_NV 0x9288 #define GL_DST_OVER_NV 0x9289 #define GL_SRC_IN_NV 0x928A #define GL_DST_IN_NV 0x928B #define GL_SRC_OUT_NV 0x928C #define GL_DST_OUT_NV 0x928D #define GL_SRC_ATOP_NV 0x928E #define GL_DST_ATOP_NV 0x928F #define GL_PLUS_NV 0x9291 #define GL_PLUS_DARKER_NV 0x9292 #define GL_MULTIPLY_NV 0x9294 #define GL_SCREEN_NV 0x9295 #define GL_OVERLAY_NV 0x9296 #define GL_DARKEN_NV 0x9297 #define GL_LIGHTEN_NV 0x9298 #define GL_COLORDODGE_NV 0x9299 #define GL_COLORBURN_NV 0x929A #define GL_HARDLIGHT_NV 0x929B #define GL_SOFTLIGHT_NV 0x929C #define GL_DIFFERENCE_NV 0x929E #define GL_MINUS_NV 0x929F #define GL_EXCLUSION_NV 0x92A0 #define GL_CONTRAST_NV 0x92A1 #define GL_INVERT_RGB_NV 0x92A3 #define GL_LINEARDODGE_NV 0x92A4 #define GL_LINEARBURN_NV 0x92A5 #define GL_VIVIDLIGHT_NV 0x92A6 #define GL_LINEARLIGHT_NV 0x92A7 #define GL_PINLIGHT_NV 0x92A8 #define GL_HARDMIX_NV 0x92A9 #define GL_HSL_HUE_NV 0x92AD #define GL_HSL_SATURATION_NV 0x92AE #define GL_HSL_COLOR_NV 0x92AF #define GL_HSL_LUMINOSITY_NV 0x92B0 #define GL_PLUS_CLAMPED_NV 0x92B1 #define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 #define GL_MINUS_CLAMPED_NV 0x92B3 #define GL_INVERT_OVG_NV 0x92B4 typedef void (GLAPIENTRY * PFNGLBLENDBARRIERNVPROC) (void); typedef void (GLAPIENTRY * PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); #define glBlendBarrierNV GLEW_GET_FUN(__glewBlendBarrierNV) #define glBlendParameteriNV GLEW_GET_FUN(__glewBlendParameteriNV) #define GLEW_NV_blend_equation_advanced GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced) #endif /* GL_NV_blend_equation_advanced */ /* ----------------- GL_NV_blend_equation_advanced_coherent ---------------- */ #ifndef GL_NV_blend_equation_advanced_coherent #define GL_NV_blend_equation_advanced_coherent 1 #define GLEW_NV_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced_coherent) #endif /* GL_NV_blend_equation_advanced_coherent */ /* ----------------------- GL_NV_blend_minmax_factor ----------------------- */ #ifndef GL_NV_blend_minmax_factor #define GL_NV_blend_minmax_factor 1 #define GL_FACTOR_MIN_AMD 0x901C #define GL_FACTOR_MAX_AMD 0x901D #define GLEW_NV_blend_minmax_factor GLEW_GET_VAR(__GLEW_NV_blend_minmax_factor) #endif /* GL_NV_blend_minmax_factor */ /* --------------------------- GL_NV_blend_square -------------------------- */ #ifndef GL_NV_blend_square #define GL_NV_blend_square 1 #define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square) #endif /* GL_NV_blend_square */ /* ----------------------- GL_NV_clip_space_w_scaling ---------------------- */ #ifndef GL_NV_clip_space_w_scaling #define GL_NV_clip_space_w_scaling 1 #define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C #define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D #define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E typedef void (GLAPIENTRY * PFNGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); #define glViewportPositionWScaleNV GLEW_GET_FUN(__glewViewportPositionWScaleNV) #define GLEW_NV_clip_space_w_scaling GLEW_GET_VAR(__GLEW_NV_clip_space_w_scaling) #endif /* GL_NV_clip_space_w_scaling */ /* --------------------------- GL_NV_command_list -------------------------- */ #ifndef GL_NV_command_list #define GL_NV_command_list 1 #define GL_TERMINATE_SEQUENCE_COMMAND_NV 0x0000 #define GL_NOP_COMMAND_NV 0x0001 #define GL_DRAW_ELEMENTS_COMMAND_NV 0x0002 #define GL_DRAW_ARRAYS_COMMAND_NV 0x0003 #define GL_DRAW_ELEMENTS_STRIP_COMMAND_NV 0x0004 #define GL_DRAW_ARRAYS_STRIP_COMMAND_NV 0x0005 #define GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV 0x0006 #define GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV 0x0007 #define GL_ELEMENT_ADDRESS_COMMAND_NV 0x0008 #define GL_ATTRIBUTE_ADDRESS_COMMAND_NV 0x0009 #define GL_UNIFORM_ADDRESS_COMMAND_NV 0x000a #define GL_BLEND_COLOR_COMMAND_NV 0x000b #define GL_STENCIL_REF_COMMAND_NV 0x000c #define GL_LINE_WIDTH_COMMAND_NV 0x000d #define GL_POLYGON_OFFSET_COMMAND_NV 0x000e #define GL_ALPHA_REF_COMMAND_NV 0x000f #define GL_VIEWPORT_COMMAND_NV 0x0010 #define GL_SCISSOR_COMMAND_NV 0x0011 #define GL_FRONT_FACE_COMMAND_NV 0x0012 typedef void (GLAPIENTRY * PFNGLCALLCOMMANDLISTNVPROC) (GLuint list); typedef void (GLAPIENTRY * PFNGLCOMMANDLISTSEGMENTSNVPROC) (GLuint list, GLuint segments); typedef void (GLAPIENTRY * PFNGLCOMPILECOMMANDLISTNVPROC) (GLuint list); typedef void (GLAPIENTRY * PFNGLCREATECOMMANDLISTSNVPROC) (GLsizei n, GLuint* lists); typedef void (GLAPIENTRY * PFNGLCREATESTATESNVPROC) (GLsizei n, GLuint* states); typedef void (GLAPIENTRY * PFNGLDELETECOMMANDLISTSNVPROC) (GLsizei n, const GLuint* lists); typedef void (GLAPIENTRY * PFNGLDELETESTATESNVPROC) (GLsizei n, const GLuint* states); typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSADDRESSNVPROC) (GLenum primitiveMode, const GLuint64* indirects, const GLsizei* sizes, GLuint count); typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSNVPROC) (GLenum primitiveMode, GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, GLuint count); typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC) (const GLuint64* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSSTATESNVPROC) (GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); typedef GLuint (GLAPIENTRY * PFNGLGETCOMMANDHEADERNVPROC) (GLenum tokenID, GLuint size); typedef GLushort (GLAPIENTRY * PFNGLGETSTAGEINDEXNVPROC) (GLenum shadertype); typedef GLboolean (GLAPIENTRY * PFNGLISCOMMANDLISTNVPROC) (GLuint list); typedef GLboolean (GLAPIENTRY * PFNGLISSTATENVPROC) (GLuint state); typedef void (GLAPIENTRY * PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC) (GLuint list, GLuint segment, const void** indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); typedef void (GLAPIENTRY * PFNGLSTATECAPTURENVPROC) (GLuint state, GLenum mode); #define glCallCommandListNV GLEW_GET_FUN(__glewCallCommandListNV) #define glCommandListSegmentsNV GLEW_GET_FUN(__glewCommandListSegmentsNV) #define glCompileCommandListNV GLEW_GET_FUN(__glewCompileCommandListNV) #define glCreateCommandListsNV GLEW_GET_FUN(__glewCreateCommandListsNV) #define glCreateStatesNV GLEW_GET_FUN(__glewCreateStatesNV) #define glDeleteCommandListsNV GLEW_GET_FUN(__glewDeleteCommandListsNV) #define glDeleteStatesNV GLEW_GET_FUN(__glewDeleteStatesNV) #define glDrawCommandsAddressNV GLEW_GET_FUN(__glewDrawCommandsAddressNV) #define glDrawCommandsNV GLEW_GET_FUN(__glewDrawCommandsNV) #define glDrawCommandsStatesAddressNV GLEW_GET_FUN(__glewDrawCommandsStatesAddressNV) #define glDrawCommandsStatesNV GLEW_GET_FUN(__glewDrawCommandsStatesNV) #define glGetCommandHeaderNV GLEW_GET_FUN(__glewGetCommandHeaderNV) #define glGetStageIndexNV GLEW_GET_FUN(__glewGetStageIndexNV) #define glIsCommandListNV GLEW_GET_FUN(__glewIsCommandListNV) #define glIsStateNV GLEW_GET_FUN(__glewIsStateNV) #define glListDrawCommandsStatesClientNV GLEW_GET_FUN(__glewListDrawCommandsStatesClientNV) #define glStateCaptureNV GLEW_GET_FUN(__glewStateCaptureNV) #define GLEW_NV_command_list GLEW_GET_VAR(__GLEW_NV_command_list) #endif /* GL_NV_command_list */ /* ------------------------- GL_NV_compute_program5 ------------------------ */ #ifndef GL_NV_compute_program5 #define GL_NV_compute_program5 1 #define GL_COMPUTE_PROGRAM_NV 0x90FB #define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC #define GLEW_NV_compute_program5 GLEW_GET_VAR(__GLEW_NV_compute_program5) #endif /* GL_NV_compute_program5 */ /* ------------------------ GL_NV_conditional_render ----------------------- */ #ifndef GL_NV_conditional_render #define GL_NV_conditional_render 1 #define GL_QUERY_WAIT_NV 0x8E13 #define GL_QUERY_NO_WAIT_NV 0x8E14 #define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 #define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVPROC) (void); #define glBeginConditionalRenderNV GLEW_GET_FUN(__glewBeginConditionalRenderNV) #define glEndConditionalRenderNV GLEW_GET_FUN(__glewEndConditionalRenderNV) #define GLEW_NV_conditional_render GLEW_GET_VAR(__GLEW_NV_conditional_render) #endif /* GL_NV_conditional_render */ /* ----------------------- GL_NV_conservative_raster ----------------------- */ #ifndef GL_NV_conservative_raster #define GL_NV_conservative_raster 1 #define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 #define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 #define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 #define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 typedef void (GLAPIENTRY * PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); #define glSubpixelPrecisionBiasNV GLEW_GET_FUN(__glewSubpixelPrecisionBiasNV) #define GLEW_NV_conservative_raster GLEW_GET_VAR(__GLEW_NV_conservative_raster) #endif /* GL_NV_conservative_raster */ /* -------------------- GL_NV_conservative_raster_dilate ------------------- */ #ifndef GL_NV_conservative_raster_dilate #define GL_NV_conservative_raster_dilate 1 #define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379 #define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A #define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value); #define glConservativeRasterParameterfNV GLEW_GET_FUN(__glewConservativeRasterParameterfNV) #define GLEW_NV_conservative_raster_dilate GLEW_GET_VAR(__GLEW_NV_conservative_raster_dilate) #endif /* GL_NV_conservative_raster_dilate */ /* -------------- GL_NV_conservative_raster_pre_snap_triangles ------------- */ #ifndef GL_NV_conservative_raster_pre_snap_triangles #define GL_NV_conservative_raster_pre_snap_triangles 1 #define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D #define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E #define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERINVPROC) (GLenum pname, GLint param); #define glConservativeRasterParameteriNV GLEW_GET_FUN(__glewConservativeRasterParameteriNV) #define GLEW_NV_conservative_raster_pre_snap_triangles GLEW_GET_VAR(__GLEW_NV_conservative_raster_pre_snap_triangles) #endif /* GL_NV_conservative_raster_pre_snap_triangles */ /* --------------------------- GL_NV_copy_buffer --------------------------- */ #ifndef GL_NV_copy_buffer #define GL_NV_copy_buffer 1 #define GL_COPY_READ_BUFFER_NV 0x8F36 #define GL_COPY_WRITE_BUFFER_NV 0x8F37 typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATANVPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); #define glCopyBufferSubDataNV GLEW_GET_FUN(__glewCopyBufferSubDataNV) #define GLEW_NV_copy_buffer GLEW_GET_VAR(__GLEW_NV_copy_buffer) #endif /* GL_NV_copy_buffer */ /* ----------------------- GL_NV_copy_depth_to_color ----------------------- */ #ifndef GL_NV_copy_depth_to_color #define GL_NV_copy_depth_to_color 1 #define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E #define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F #define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color) #endif /* GL_NV_copy_depth_to_color */ /* ---------------------------- GL_NV_copy_image --------------------------- */ #ifndef GL_NV_copy_image #define GL_NV_copy_image 1 typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); #define glCopyImageSubDataNV GLEW_GET_FUN(__glewCopyImageSubDataNV) #define GLEW_NV_copy_image GLEW_GET_VAR(__GLEW_NV_copy_image) #endif /* GL_NV_copy_image */ /* -------------------------- GL_NV_deep_texture3D ------------------------- */ #ifndef GL_NV_deep_texture3D #define GL_NV_deep_texture3D 1 #define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 #define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 #define GLEW_NV_deep_texture3D GLEW_GET_VAR(__GLEW_NV_deep_texture3D) #endif /* GL_NV_deep_texture3D */ /* ------------------------ GL_NV_depth_buffer_float ----------------------- */ #ifndef GL_NV_depth_buffer_float #define GL_NV_depth_buffer_float 1 #define GL_DEPTH_COMPONENT32F_NV 0x8DAB #define GL_DEPTH32F_STENCIL8_NV 0x8DAC #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD #define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); #define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV) #define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV) #define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV) #define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float) #endif /* GL_NV_depth_buffer_float */ /* --------------------------- GL_NV_depth_clamp --------------------------- */ #ifndef GL_NV_depth_clamp #define GL_NV_depth_clamp 1 #define GL_DEPTH_CLAMP_NV 0x864F #define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp) #endif /* GL_NV_depth_clamp */ /* ---------------------- GL_NV_depth_range_unclamped ---------------------- */ #ifndef GL_NV_depth_range_unclamped #define GL_NV_depth_range_unclamped 1 #define GL_SAMPLE_COUNT_BITS_NV 0x8864 #define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865 #define GL_QUERY_RESULT_NV 0x8866 #define GL_QUERY_RESULT_AVAILABLE_NV 0x8867 #define GL_SAMPLE_COUNT_NV 0x8914 #define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped) #endif /* GL_NV_depth_range_unclamped */ /* --------------------------- GL_NV_draw_buffers -------------------------- */ #ifndef GL_NV_draw_buffers #define GL_NV_draw_buffers 1 #define GL_MAX_DRAW_BUFFERS_NV 0x8824 #define GL_DRAW_BUFFER0_NV 0x8825 #define GL_DRAW_BUFFER1_NV 0x8826 #define GL_DRAW_BUFFER2_NV 0x8827 #define GL_DRAW_BUFFER3_NV 0x8828 #define GL_DRAW_BUFFER4_NV 0x8829 #define GL_DRAW_BUFFER5_NV 0x882A #define GL_DRAW_BUFFER6_NV 0x882B #define GL_DRAW_BUFFER7_NV 0x882C #define GL_DRAW_BUFFER8_NV 0x882D #define GL_DRAW_BUFFER9_NV 0x882E #define GL_DRAW_BUFFER10_NV 0x882F #define GL_DRAW_BUFFER11_NV 0x8830 #define GL_DRAW_BUFFER12_NV 0x8831 #define GL_DRAW_BUFFER13_NV 0x8832 #define GL_DRAW_BUFFER14_NV 0x8833 #define GL_DRAW_BUFFER15_NV 0x8834 #define GL_COLOR_ATTACHMENT0_NV 0x8CE0 #define GL_COLOR_ATTACHMENT1_NV 0x8CE1 #define GL_COLOR_ATTACHMENT2_NV 0x8CE2 #define GL_COLOR_ATTACHMENT3_NV 0x8CE3 #define GL_COLOR_ATTACHMENT4_NV 0x8CE4 #define GL_COLOR_ATTACHMENT5_NV 0x8CE5 #define GL_COLOR_ATTACHMENT6_NV 0x8CE6 #define GL_COLOR_ATTACHMENT7_NV 0x8CE7 #define GL_COLOR_ATTACHMENT8_NV 0x8CE8 #define GL_COLOR_ATTACHMENT9_NV 0x8CE9 #define GL_COLOR_ATTACHMENT10_NV 0x8CEA #define GL_COLOR_ATTACHMENT11_NV 0x8CEB #define GL_COLOR_ATTACHMENT12_NV 0x8CEC #define GL_COLOR_ATTACHMENT13_NV 0x8CED #define GL_COLOR_ATTACHMENT14_NV 0x8CEE #define GL_COLOR_ATTACHMENT15_NV 0x8CEF typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum* bufs); #define glDrawBuffersNV GLEW_GET_FUN(__glewDrawBuffersNV) #define GLEW_NV_draw_buffers GLEW_GET_VAR(__GLEW_NV_draw_buffers) #endif /* GL_NV_draw_buffers */ /* -------------------------- GL_NV_draw_instanced ------------------------- */ #ifndef GL_NV_draw_instanced #define GL_NV_draw_instanced 1 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); #define glDrawArraysInstancedNV GLEW_GET_FUN(__glewDrawArraysInstancedNV) #define glDrawElementsInstancedNV GLEW_GET_FUN(__glewDrawElementsInstancedNV) #define GLEW_NV_draw_instanced GLEW_GET_VAR(__GLEW_NV_draw_instanced) #endif /* GL_NV_draw_instanced */ /* --------------------------- GL_NV_draw_texture -------------------------- */ #ifndef GL_NV_draw_texture #define GL_NV_draw_texture 1 typedef void (GLAPIENTRY * PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); #define glDrawTextureNV GLEW_GET_FUN(__glewDrawTextureNV) #define GLEW_NV_draw_texture GLEW_GET_VAR(__GLEW_NV_draw_texture) #endif /* GL_NV_draw_texture */ /* ------------------------ GL_NV_draw_vulkan_image ------------------------ */ #ifndef GL_NV_draw_vulkan_image #define GL_NV_draw_vulkan_image 1 typedef void (APIENTRY *GLVULKANPROCNV)(void); typedef void (GLAPIENTRY * PFNGLDRAWVKIMAGENVPROC) (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); typedef GLVULKANPROCNV (GLAPIENTRY * PFNGLGETVKPROCADDRNVPROC) (const GLchar* name); typedef void (GLAPIENTRY * PFNGLSIGNALVKFENCENVPROC) (GLuint64 vkFence); typedef void (GLAPIENTRY * PFNGLSIGNALVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); typedef void (GLAPIENTRY * PFNGLWAITVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); #define glDrawVkImageNV GLEW_GET_FUN(__glewDrawVkImageNV) #define glGetVkProcAddrNV GLEW_GET_FUN(__glewGetVkProcAddrNV) #define glSignalVkFenceNV GLEW_GET_FUN(__glewSignalVkFenceNV) #define glSignalVkSemaphoreNV GLEW_GET_FUN(__glewSignalVkSemaphoreNV) #define glWaitVkSemaphoreNV GLEW_GET_FUN(__glewWaitVkSemaphoreNV) #define GLEW_NV_draw_vulkan_image GLEW_GET_VAR(__GLEW_NV_draw_vulkan_image) #endif /* GL_NV_draw_vulkan_image */ /* ---------------------------- GL_NV_evaluators --------------------------- */ #ifndef GL_NV_evaluators #define GL_NV_evaluators 1 #define GL_EVAL_2D_NV 0x86C0 #define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 #define GL_MAP_TESSELLATION_NV 0x86C2 #define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 #define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 #define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 #define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 #define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 #define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 #define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 #define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA #define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB #define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC #define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD #define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE #define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF #define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 #define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 #define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 #define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 #define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 #define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 #define GL_MAX_MAP_TESSELLATION_NV 0x86D6 #define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); #define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV) #define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV) #define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV) #define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV) #define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV) #define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV) #define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV) #define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV) #define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV) #define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators) #endif /* GL_NV_evaluators */ /* --------------------- GL_NV_explicit_attrib_location -------------------- */ #ifndef GL_NV_explicit_attrib_location #define GL_NV_explicit_attrib_location 1 #define GLEW_NV_explicit_attrib_location GLEW_GET_VAR(__GLEW_NV_explicit_attrib_location) #endif /* GL_NV_explicit_attrib_location */ /* ----------------------- GL_NV_explicit_multisample ---------------------- */ #ifndef GL_NV_explicit_multisample #define GL_NV_explicit_multisample 1 #define GL_SAMPLE_POSITION_NV 0x8E50 #define GL_SAMPLE_MASK_NV 0x8E51 #define GL_SAMPLE_MASK_VALUE_NV 0x8E52 #define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 #define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 #define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 #define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 #define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 #define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 #define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat* val); typedef void (GLAPIENTRY * PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); typedef void (GLAPIENTRY * PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); #define glGetMultisamplefvNV GLEW_GET_FUN(__glewGetMultisamplefvNV) #define glSampleMaskIndexedNV GLEW_GET_FUN(__glewSampleMaskIndexedNV) #define glTexRenderbufferNV GLEW_GET_FUN(__glewTexRenderbufferNV) #define GLEW_NV_explicit_multisample GLEW_GET_VAR(__GLEW_NV_explicit_multisample) #endif /* GL_NV_explicit_multisample */ /* ---------------------- GL_NV_fbo_color_attachments ---------------------- */ #ifndef GL_NV_fbo_color_attachments #define GL_NV_fbo_color_attachments 1 #define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF #define GL_COLOR_ATTACHMENT0_NV 0x8CE0 #define GL_COLOR_ATTACHMENT1_NV 0x8CE1 #define GL_COLOR_ATTACHMENT2_NV 0x8CE2 #define GL_COLOR_ATTACHMENT3_NV 0x8CE3 #define GL_COLOR_ATTACHMENT4_NV 0x8CE4 #define GL_COLOR_ATTACHMENT5_NV 0x8CE5 #define GL_COLOR_ATTACHMENT6_NV 0x8CE6 #define GL_COLOR_ATTACHMENT7_NV 0x8CE7 #define GL_COLOR_ATTACHMENT8_NV 0x8CE8 #define GL_COLOR_ATTACHMENT9_NV 0x8CE9 #define GL_COLOR_ATTACHMENT10_NV 0x8CEA #define GL_COLOR_ATTACHMENT11_NV 0x8CEB #define GL_COLOR_ATTACHMENT12_NV 0x8CEC #define GL_COLOR_ATTACHMENT13_NV 0x8CED #define GL_COLOR_ATTACHMENT14_NV 0x8CEE #define GL_COLOR_ATTACHMENT15_NV 0x8CEF #define GLEW_NV_fbo_color_attachments GLEW_GET_VAR(__GLEW_NV_fbo_color_attachments) #endif /* GL_NV_fbo_color_attachments */ /* ------------------------------ GL_NV_fence ------------------------------ */ #ifndef GL_NV_fence #define GL_NV_fence 1 #define GL_ALL_COMPLETED_NV 0x84F2 #define GL_FENCE_STATUS_NV 0x84F3 #define GL_FENCE_CONDITION_NV 0x84F4 typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences); typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences); typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence); typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); #define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV) #define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV) #define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV) #define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV) #define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV) #define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV) #define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV) #define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence) #endif /* GL_NV_fence */ /* -------------------------- GL_NV_fill_rectangle ------------------------- */ #ifndef GL_NV_fill_rectangle #define GL_NV_fill_rectangle 1 #define GL_FILL_RECTANGLE_NV 0x933C #define GLEW_NV_fill_rectangle GLEW_GET_VAR(__GLEW_NV_fill_rectangle) #endif /* GL_NV_fill_rectangle */ /* --------------------------- GL_NV_float_buffer -------------------------- */ #ifndef GL_NV_float_buffer #define GL_NV_float_buffer 1 #define GL_FLOAT_R_NV 0x8880 #define GL_FLOAT_RG_NV 0x8881 #define GL_FLOAT_RGB_NV 0x8882 #define GL_FLOAT_RGBA_NV 0x8883 #define GL_FLOAT_R16_NV 0x8884 #define GL_FLOAT_R32_NV 0x8885 #define GL_FLOAT_RG16_NV 0x8886 #define GL_FLOAT_RG32_NV 0x8887 #define GL_FLOAT_RGB16_NV 0x8888 #define GL_FLOAT_RGB32_NV 0x8889 #define GL_FLOAT_RGBA16_NV 0x888A #define GL_FLOAT_RGBA32_NV 0x888B #define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C #define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D #define GL_FLOAT_RGBA_MODE_NV 0x888E #define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer) #endif /* GL_NV_float_buffer */ /* --------------------------- GL_NV_fog_distance -------------------------- */ #ifndef GL_NV_fog_distance #define GL_NV_fog_distance 1 #define GL_FOG_DISTANCE_MODE_NV 0x855A #define GL_EYE_RADIAL_NV 0x855B #define GL_EYE_PLANE_ABSOLUTE_NV 0x855C #define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance) #endif /* GL_NV_fog_distance */ /* -------------------- GL_NV_fragment_coverage_to_color ------------------- */ #ifndef GL_NV_fragment_coverage_to_color #define GL_NV_fragment_coverage_to_color 1 #define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD #define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE typedef void (GLAPIENTRY * PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); #define glFragmentCoverageColorNV GLEW_GET_FUN(__glewFragmentCoverageColorNV) #define GLEW_NV_fragment_coverage_to_color GLEW_GET_VAR(__GLEW_NV_fragment_coverage_to_color) #endif /* GL_NV_fragment_coverage_to_color */ /* ------------------------- GL_NV_fragment_program ------------------------ */ #ifndef GL_NV_fragment_program #define GL_NV_fragment_program 1 #define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 #define GL_FRAGMENT_PROGRAM_NV 0x8870 #define GL_MAX_TEXTURE_COORDS_NV 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 #define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 #define GL_PROGRAM_ERROR_STRING_NV 0x8874 typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params); typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]); typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]); #define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV) #define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV) #define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV) #define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV) #define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV) #define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV) #define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program) #endif /* GL_NV_fragment_program */ /* ------------------------ GL_NV_fragment_program2 ------------------------ */ #ifndef GL_NV_fragment_program2 #define GL_NV_fragment_program2 1 #define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 #define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 #define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 #define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 #define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 #define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2) #endif /* GL_NV_fragment_program2 */ /* ------------------------ GL_NV_fragment_program4 ------------------------ */ #ifndef GL_NV_fragment_program4 #define GL_NV_fragment_program4 1 #define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4) #endif /* GL_NV_fragment_program4 */ /* --------------------- GL_NV_fragment_program_option --------------------- */ #ifndef GL_NV_fragment_program_option #define GL_NV_fragment_program_option 1 #define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option) #endif /* GL_NV_fragment_program_option */ /* -------------------- GL_NV_fragment_shader_interlock -------------------- */ #ifndef GL_NV_fragment_shader_interlock #define GL_NV_fragment_shader_interlock 1 #define GLEW_NV_fragment_shader_interlock GLEW_GET_VAR(__GLEW_NV_fragment_shader_interlock) #endif /* GL_NV_fragment_shader_interlock */ /* ------------------------- GL_NV_framebuffer_blit ------------------------ */ #ifndef GL_NV_framebuffer_blit #define GL_NV_framebuffer_blit 1 #define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 #define GL_READ_FRAMEBUFFER_NV 0x8CA8 #define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 #define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); #define glBlitFramebufferNV GLEW_GET_FUN(__glewBlitFramebufferNV) #define GLEW_NV_framebuffer_blit GLEW_GET_VAR(__GLEW_NV_framebuffer_blit) #endif /* GL_NV_framebuffer_blit */ /* -------------------- GL_NV_framebuffer_mixed_samples -------------------- */ #ifndef GL_NV_framebuffer_mixed_samples #define GL_NV_framebuffer_mixed_samples 1 #define GL_COLOR_SAMPLES_NV 0x8E20 #define GL_RASTER_MULTISAMPLE_EXT 0x9327 #define GL_RASTER_SAMPLES_EXT 0x9328 #define GL_MAX_RASTER_SAMPLES_EXT 0x9329 #define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A #define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B #define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C #define GL_DEPTH_SAMPLES_NV 0x932D #define GL_STENCIL_SAMPLES_NV 0x932E #define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F #define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 #define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 #define GL_COVERAGE_MODULATION_NV 0x9332 #define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 #define GLEW_NV_framebuffer_mixed_samples GLEW_GET_VAR(__GLEW_NV_framebuffer_mixed_samples) #endif /* GL_NV_framebuffer_mixed_samples */ /* --------------------- GL_NV_framebuffer_multisample --------------------- */ #ifndef GL_NV_framebuffer_multisample #define GL_NV_framebuffer_multisample 1 #define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 #define GL_MAX_SAMPLES_NV 0x8D57 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); #define glRenderbufferStorageMultisampleNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleNV) #define GLEW_NV_framebuffer_multisample GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample) #endif /* GL_NV_framebuffer_multisample */ /* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */ #ifndef GL_NV_framebuffer_multisample_coverage #define GL_NV_framebuffer_multisample_coverage 1 #define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB #define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 #define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 #define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); #define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV) #define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage) #endif /* GL_NV_framebuffer_multisample_coverage */ /* ----------------------- GL_NV_generate_mipmap_sRGB ---------------------- */ #ifndef GL_NV_generate_mipmap_sRGB #define GL_NV_generate_mipmap_sRGB 1 #define GLEW_NV_generate_mipmap_sRGB GLEW_GET_VAR(__GLEW_NV_generate_mipmap_sRGB) #endif /* GL_NV_generate_mipmap_sRGB */ /* ------------------------ GL_NV_geometry_program4 ------------------------ */ #ifndef GL_NV_geometry_program4 #define GL_NV_geometry_program4 1 #define GL_GEOMETRY_PROGRAM_NV 0x8C26 #define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 #define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); #define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV) #define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4) #endif /* GL_NV_geometry_program4 */ /* ------------------------- GL_NV_geometry_shader4 ------------------------ */ #ifndef GL_NV_geometry_shader4 #define GL_NV_geometry_shader4 1 #define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4) #endif /* GL_NV_geometry_shader4 */ /* ------------------- GL_NV_geometry_shader_passthrough ------------------- */ #ifndef GL_NV_geometry_shader_passthrough #define GL_NV_geometry_shader_passthrough 1 #define GLEW_NV_geometry_shader_passthrough GLEW_GET_VAR(__GLEW_NV_geometry_shader_passthrough) #endif /* GL_NV_geometry_shader_passthrough */ /* -------------------------- GL_NV_gpu_multicast -------------------------- */ #ifndef GL_NV_gpu_multicast #define GL_NV_gpu_multicast 1 #define GL_PER_GPU_STORAGE_BIT_NV 0x0800 #define GL_MULTICAST_GPUS_NV 0x92BA #define GL_PER_GPU_STORAGE_NV 0x9548 #define GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9549 #define GL_RENDER_GPU_MASK_NV 0x9558 typedef void (GLAPIENTRY * PFNGLMULTICASTBARRIERNVPROC) (void); typedef void (GLAPIENTRY * PFNGLMULTICASTBLITFRAMEBUFFERNVPROC) (GLuint srcGpu, GLuint dstGpu, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef void (GLAPIENTRY * PFNGLMULTICASTBUFFERSUBDATANVPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); typedef void (GLAPIENTRY * PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC) (GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLMULTICASTCOPYIMAGESUBDATANVPROC) (GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); typedef void (GLAPIENTRY * PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint gpu, GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint64* params); typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint64* params); typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLMULTICASTWAITSYNCNVPROC) (GLuint signalGpu, GLbitfield waitGpuMask); typedef void (GLAPIENTRY * PFNGLRENDERGPUMASKNVPROC) (GLbitfield mask); #define glMulticastBarrierNV GLEW_GET_FUN(__glewMulticastBarrierNV) #define glMulticastBlitFramebufferNV GLEW_GET_FUN(__glewMulticastBlitFramebufferNV) #define glMulticastBufferSubDataNV GLEW_GET_FUN(__glewMulticastBufferSubDataNV) #define glMulticastCopyBufferSubDataNV GLEW_GET_FUN(__glewMulticastCopyBufferSubDataNV) #define glMulticastCopyImageSubDataNV GLEW_GET_FUN(__glewMulticastCopyImageSubDataNV) #define glMulticastFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewMulticastFramebufferSampleLocationsfvNV) #define glMulticastGetQueryObjecti64vNV GLEW_GET_FUN(__glewMulticastGetQueryObjecti64vNV) #define glMulticastGetQueryObjectivNV GLEW_GET_FUN(__glewMulticastGetQueryObjectivNV) #define glMulticastGetQueryObjectui64vNV GLEW_GET_FUN(__glewMulticastGetQueryObjectui64vNV) #define glMulticastGetQueryObjectuivNV GLEW_GET_FUN(__glewMulticastGetQueryObjectuivNV) #define glMulticastWaitSyncNV GLEW_GET_FUN(__glewMulticastWaitSyncNV) #define glRenderGpuMaskNV GLEW_GET_FUN(__glewRenderGpuMaskNV) #define GLEW_NV_gpu_multicast GLEW_GET_VAR(__GLEW_NV_gpu_multicast) #endif /* GL_NV_gpu_multicast */ /* --------------------------- GL_NV_gpu_program4 -------------------------- */ #ifndef GL_NV_gpu_program4 #define GL_NV_gpu_program4 1 #define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 #define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 #define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 #define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 #define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 #define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 #define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 #define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); #define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV) #define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV) #define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV) #define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV) #define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV) #define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV) #define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV) #define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV) #define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV) #define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV) #define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV) #define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV) #define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4) #endif /* GL_NV_gpu_program4 */ /* --------------------------- GL_NV_gpu_program5 -------------------------- */ #ifndef GL_NV_gpu_program5 #define GL_NV_gpu_program5 1 #define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C #define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F #define GLEW_NV_gpu_program5 GLEW_GET_VAR(__GLEW_NV_gpu_program5) #endif /* GL_NV_gpu_program5 */ /* -------------------- GL_NV_gpu_program5_mem_extended -------------------- */ #ifndef GL_NV_gpu_program5_mem_extended #define GL_NV_gpu_program5_mem_extended 1 #define GLEW_NV_gpu_program5_mem_extended GLEW_GET_VAR(__GLEW_NV_gpu_program5_mem_extended) #endif /* GL_NV_gpu_program5_mem_extended */ /* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */ #ifndef GL_NV_gpu_program_fp64 #define GL_NV_gpu_program_fp64 1 #define GLEW_NV_gpu_program_fp64 GLEW_GET_VAR(__GLEW_NV_gpu_program_fp64) #endif /* GL_NV_gpu_program_fp64 */ /* --------------------------- GL_NV_gpu_shader5 --------------------------- */ #ifndef GL_NV_gpu_shader5 #define GL_NV_gpu_shader5 1 #define GL_INT64_NV 0x140E #define GL_UNSIGNED_INT64_NV 0x140F #define GL_INT8_NV 0x8FE0 #define GL_INT8_VEC2_NV 0x8FE1 #define GL_INT8_VEC3_NV 0x8FE2 #define GL_INT8_VEC4_NV 0x8FE3 #define GL_INT16_NV 0x8FE4 #define GL_INT16_VEC2_NV 0x8FE5 #define GL_INT16_VEC3_NV 0x8FE6 #define GL_INT16_VEC4_NV 0x8FE7 #define GL_INT64_VEC2_NV 0x8FE9 #define GL_INT64_VEC3_NV 0x8FEA #define GL_INT64_VEC4_NV 0x8FEB #define GL_UNSIGNED_INT8_NV 0x8FEC #define GL_UNSIGNED_INT8_VEC2_NV 0x8FED #define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE #define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF #define GL_UNSIGNED_INT16_NV 0x8FF0 #define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 #define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 #define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 #define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 #define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 #define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 #define GL_FLOAT16_NV 0x8FF8 #define GL_FLOAT16_VEC2_NV 0x8FF9 #define GL_FLOAT16_VEC3_NV 0x8FFA #define GL_FLOAT16_VEC4_NV 0x8FFB typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT* params); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); #define glGetUniformi64vNV GLEW_GET_FUN(__glewGetUniformi64vNV) #define glGetUniformui64vNV GLEW_GET_FUN(__glewGetUniformui64vNV) #define glProgramUniform1i64NV GLEW_GET_FUN(__glewProgramUniform1i64NV) #define glProgramUniform1i64vNV GLEW_GET_FUN(__glewProgramUniform1i64vNV) #define glProgramUniform1ui64NV GLEW_GET_FUN(__glewProgramUniform1ui64NV) #define glProgramUniform1ui64vNV GLEW_GET_FUN(__glewProgramUniform1ui64vNV) #define glProgramUniform2i64NV GLEW_GET_FUN(__glewProgramUniform2i64NV) #define glProgramUniform2i64vNV GLEW_GET_FUN(__glewProgramUniform2i64vNV) #define glProgramUniform2ui64NV GLEW_GET_FUN(__glewProgramUniform2ui64NV) #define glProgramUniform2ui64vNV GLEW_GET_FUN(__glewProgramUniform2ui64vNV) #define glProgramUniform3i64NV GLEW_GET_FUN(__glewProgramUniform3i64NV) #define glProgramUniform3i64vNV GLEW_GET_FUN(__glewProgramUniform3i64vNV) #define glProgramUniform3ui64NV GLEW_GET_FUN(__glewProgramUniform3ui64NV) #define glProgramUniform3ui64vNV GLEW_GET_FUN(__glewProgramUniform3ui64vNV) #define glProgramUniform4i64NV GLEW_GET_FUN(__glewProgramUniform4i64NV) #define glProgramUniform4i64vNV GLEW_GET_FUN(__glewProgramUniform4i64vNV) #define glProgramUniform4ui64NV GLEW_GET_FUN(__glewProgramUniform4ui64NV) #define glProgramUniform4ui64vNV GLEW_GET_FUN(__glewProgramUniform4ui64vNV) #define glUniform1i64NV GLEW_GET_FUN(__glewUniform1i64NV) #define glUniform1i64vNV GLEW_GET_FUN(__glewUniform1i64vNV) #define glUniform1ui64NV GLEW_GET_FUN(__glewUniform1ui64NV) #define glUniform1ui64vNV GLEW_GET_FUN(__glewUniform1ui64vNV) #define glUniform2i64NV GLEW_GET_FUN(__glewUniform2i64NV) #define glUniform2i64vNV GLEW_GET_FUN(__glewUniform2i64vNV) #define glUniform2ui64NV GLEW_GET_FUN(__glewUniform2ui64NV) #define glUniform2ui64vNV GLEW_GET_FUN(__glewUniform2ui64vNV) #define glUniform3i64NV GLEW_GET_FUN(__glewUniform3i64NV) #define glUniform3i64vNV GLEW_GET_FUN(__glewUniform3i64vNV) #define glUniform3ui64NV GLEW_GET_FUN(__glewUniform3ui64NV) #define glUniform3ui64vNV GLEW_GET_FUN(__glewUniform3ui64vNV) #define glUniform4i64NV GLEW_GET_FUN(__glewUniform4i64NV) #define glUniform4i64vNV GLEW_GET_FUN(__glewUniform4i64vNV) #define glUniform4ui64NV GLEW_GET_FUN(__glewUniform4ui64NV) #define glUniform4ui64vNV GLEW_GET_FUN(__glewUniform4ui64vNV) #define GLEW_NV_gpu_shader5 GLEW_GET_VAR(__GLEW_NV_gpu_shader5) #endif /* GL_NV_gpu_shader5 */ /* ---------------------------- GL_NV_half_float --------------------------- */ #ifndef GL_NV_half_float #define GL_NV_half_float 1 #define GL_HALF_FLOAT_NV 0x140B typedef unsigned short GLhalf; typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog); typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s); typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t); typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r); typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y); typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z); typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); #define glColor3hNV GLEW_GET_FUN(__glewColor3hNV) #define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV) #define glColor4hNV GLEW_GET_FUN(__glewColor4hNV) #define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV) #define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV) #define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV) #define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV) #define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV) #define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV) #define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV) #define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV) #define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV) #define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV) #define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV) #define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV) #define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV) #define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV) #define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV) #define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV) #define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV) #define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV) #define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV) #define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV) #define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV) #define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV) #define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV) #define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV) #define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV) #define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV) #define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV) #define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV) #define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV) #define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV) #define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV) #define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV) #define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV) #define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV) #define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV) #define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV) #define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV) #define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV) #define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV) #define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV) #define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV) #define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV) #define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV) #define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float) #endif /* GL_NV_half_float */ /* -------------------------- GL_NV_image_formats -------------------------- */ #ifndef GL_NV_image_formats #define GL_NV_image_formats 1 #define GLEW_NV_image_formats GLEW_GET_VAR(__GLEW_NV_image_formats) #endif /* GL_NV_image_formats */ /* ------------------------- GL_NV_instanced_arrays ------------------------ */ #ifndef GL_NV_instanced_arrays #define GL_NV_instanced_arrays 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor); #define glVertexAttribDivisorNV GLEW_GET_FUN(__glewVertexAttribDivisorNV) #define GLEW_NV_instanced_arrays GLEW_GET_VAR(__GLEW_NV_instanced_arrays) #endif /* GL_NV_instanced_arrays */ /* ------------------- GL_NV_internalformat_sample_query ------------------- */ #ifndef GL_NV_internalformat_sample_query #define GL_NV_internalformat_sample_query 1 #define GL_MULTISAMPLES_NV 0x9371 #define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 #define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 #define GL_CONFORMANT_NV 0x9374 typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint* params); #define glGetInternalformatSampleivNV GLEW_GET_FUN(__glewGetInternalformatSampleivNV) #define GLEW_NV_internalformat_sample_query GLEW_GET_VAR(__GLEW_NV_internalformat_sample_query) #endif /* GL_NV_internalformat_sample_query */ /* ------------------------ GL_NV_light_max_exponent ----------------------- */ #ifndef GL_NV_light_max_exponent #define GL_NV_light_max_exponent 1 #define GL_MAX_SHININESS_NV 0x8504 #define GL_MAX_SPOT_EXPONENT_NV 0x8505 #define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent) #endif /* GL_NV_light_max_exponent */ /* ----------------------- GL_NV_multisample_coverage ---------------------- */ #ifndef GL_NV_multisample_coverage #define GL_NV_multisample_coverage 1 #define GL_COLOR_SAMPLES_NV 0x8E20 #define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage) #endif /* GL_NV_multisample_coverage */ /* --------------------- GL_NV_multisample_filter_hint --------------------- */ #ifndef GL_NV_multisample_filter_hint #define GL_NV_multisample_filter_hint 1 #define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 #define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint) #endif /* GL_NV_multisample_filter_hint */ /* ----------------------- GL_NV_non_square_matrices ----------------------- */ #ifndef GL_NV_non_square_matrices #define GL_NV_non_square_matrices 1 #define GL_FLOAT_MAT2x3_NV 0x8B65 #define GL_FLOAT_MAT2x4_NV 0x8B66 #define GL_FLOAT_MAT3x2_NV 0x8B67 #define GL_FLOAT_MAT3x4_NV 0x8B68 #define GL_FLOAT_MAT4x2_NV 0x8B69 #define GL_FLOAT_MAT4x3_NV 0x8B6A typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); #define glUniformMatrix2x3fvNV GLEW_GET_FUN(__glewUniformMatrix2x3fvNV) #define glUniformMatrix2x4fvNV GLEW_GET_FUN(__glewUniformMatrix2x4fvNV) #define glUniformMatrix3x2fvNV GLEW_GET_FUN(__glewUniformMatrix3x2fvNV) #define glUniformMatrix3x4fvNV GLEW_GET_FUN(__glewUniformMatrix3x4fvNV) #define glUniformMatrix4x2fvNV GLEW_GET_FUN(__glewUniformMatrix4x2fvNV) #define glUniformMatrix4x3fvNV GLEW_GET_FUN(__glewUniformMatrix4x3fvNV) #define GLEW_NV_non_square_matrices GLEW_GET_VAR(__GLEW_NV_non_square_matrices) #endif /* GL_NV_non_square_matrices */ /* ------------------------- GL_NV_occlusion_query ------------------------- */ #ifndef GL_NV_occlusion_query #define GL_NV_occlusion_query 1 #define GL_PIXEL_COUNTER_BITS_NV 0x8864 #define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 #define GL_PIXEL_COUNT_NV 0x8866 #define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params); typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); #define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV) #define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV) #define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV) #define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV) #define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV) #define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV) #define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV) #define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query) #endif /* GL_NV_occlusion_query */ /* -------------------------- GL_NV_pack_subimage -------------------------- */ #ifndef GL_NV_pack_subimage #define GL_NV_pack_subimage 1 #define GL_PACK_ROW_LENGTH_NV 0x0D02 #define GL_PACK_SKIP_ROWS_NV 0x0D03 #define GL_PACK_SKIP_PIXELS_NV 0x0D04 #define GLEW_NV_pack_subimage GLEW_GET_VAR(__GLEW_NV_pack_subimage) #endif /* GL_NV_pack_subimage */ /* ----------------------- GL_NV_packed_depth_stencil ---------------------- */ #ifndef GL_NV_packed_depth_stencil #define GL_NV_packed_depth_stencil 1 #define GL_DEPTH_STENCIL_NV 0x84F9 #define GL_UNSIGNED_INT_24_8_NV 0x84FA #define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil) #endif /* GL_NV_packed_depth_stencil */ /* --------------------------- GL_NV_packed_float -------------------------- */ #ifndef GL_NV_packed_float #define GL_NV_packed_float 1 #define GL_R11F_G11F_B10F_NV 0x8C3A #define GL_UNSIGNED_INT_10F_11F_11F_REV_NV 0x8C3B #define GLEW_NV_packed_float GLEW_GET_VAR(__GLEW_NV_packed_float) #endif /* GL_NV_packed_float */ /* ----------------------- GL_NV_packed_float_linear ----------------------- */ #ifndef GL_NV_packed_float_linear #define GL_NV_packed_float_linear 1 #define GL_R11F_G11F_B10F_NV 0x8C3A #define GL_UNSIGNED_INT_10F_11F_11F_REV_NV 0x8C3B #define GLEW_NV_packed_float_linear GLEW_GET_VAR(__GLEW_NV_packed_float_linear) #endif /* GL_NV_packed_float_linear */ /* --------------------- GL_NV_parameter_buffer_object --------------------- */ #ifndef GL_NV_parameter_buffer_object #define GL_NV_parameter_buffer_object 1 #define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 #define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 #define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 #define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 #define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); #define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV) #define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV) #define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV) #define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object) #endif /* GL_NV_parameter_buffer_object */ /* --------------------- GL_NV_parameter_buffer_object2 -------------------- */ #ifndef GL_NV_parameter_buffer_object2 #define GL_NV_parameter_buffer_object2 1 #define GLEW_NV_parameter_buffer_object2 GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object2) #endif /* GL_NV_parameter_buffer_object2 */ /* -------------------------- GL_NV_path_rendering ------------------------- */ #ifndef GL_NV_path_rendering #define GL_NV_path_rendering 1 #define GL_CLOSE_PATH_NV 0x00 #define GL_BOLD_BIT_NV 0x01 #define GL_GLYPH_WIDTH_BIT_NV 0x01 #define GL_GLYPH_HEIGHT_BIT_NV 0x02 #define GL_ITALIC_BIT_NV 0x02 #define GL_MOVE_TO_NV 0x02 #define GL_RELATIVE_MOVE_TO_NV 0x03 #define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 #define GL_LINE_TO_NV 0x04 #define GL_RELATIVE_LINE_TO_NV 0x05 #define GL_HORIZONTAL_LINE_TO_NV 0x06 #define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 #define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 #define GL_VERTICAL_LINE_TO_NV 0x08 #define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 #define GL_QUADRATIC_CURVE_TO_NV 0x0A #define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B #define GL_CUBIC_CURVE_TO_NV 0x0C #define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D #define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E #define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F #define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 #define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 #define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 #define GL_SMALL_CCW_ARC_TO_NV 0x12 #define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 #define GL_SMALL_CW_ARC_TO_NV 0x14 #define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 #define GL_LARGE_CCW_ARC_TO_NV 0x16 #define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 #define GL_LARGE_CW_ARC_TO_NV 0x18 #define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 #define GL_CONIC_CURVE_TO_NV 0x1A #define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B #define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 #define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 #define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 #define GL_ROUNDED_RECT_NV 0xE8 #define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 #define GL_ROUNDED_RECT2_NV 0xEA #define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB #define GL_ROUNDED_RECT4_NV 0xEC #define GL_RELATIVE_ROUNDED_RECT4_NV 0xED #define GL_ROUNDED_RECT8_NV 0xEE #define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF #define GL_RESTART_PATH_NV 0xF0 #define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 #define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 #define GL_RECT_NV 0xF6 #define GL_RELATIVE_RECT_NV 0xF7 #define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 #define GL_CIRCULAR_CW_ARC_TO_NV 0xFA #define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC #define GL_ARC_TO_NV 0xFE #define GL_RELATIVE_ARC_TO_NV 0xFF #define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 #define GL_PRIMARY_COLOR_NV 0x852C #define GL_SECONDARY_COLOR_NV 0x852D #define GL_PRIMARY_COLOR 0x8577 #define GL_PATH_FORMAT_SVG_NV 0x9070 #define GL_PATH_FORMAT_PS_NV 0x9071 #define GL_STANDARD_FONT_NAME_NV 0x9072 #define GL_SYSTEM_FONT_NAME_NV 0x9073 #define GL_FILE_NAME_NV 0x9074 #define GL_PATH_STROKE_WIDTH_NV 0x9075 #define GL_PATH_END_CAPS_NV 0x9076 #define GL_PATH_INITIAL_END_CAP_NV 0x9077 #define GL_PATH_TERMINAL_END_CAP_NV 0x9078 #define GL_PATH_JOIN_STYLE_NV 0x9079 #define GL_PATH_MITER_LIMIT_NV 0x907A #define GL_PATH_DASH_CAPS_NV 0x907B #define GL_PATH_INITIAL_DASH_CAP_NV 0x907C #define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D #define GL_PATH_DASH_OFFSET_NV 0x907E #define GL_PATH_CLIENT_LENGTH_NV 0x907F #define GL_PATH_FILL_MODE_NV 0x9080 #define GL_PATH_FILL_MASK_NV 0x9081 #define GL_PATH_FILL_COVER_MODE_NV 0x9082 #define GL_PATH_STROKE_COVER_MODE_NV 0x9083 #define GL_PATH_STROKE_MASK_NV 0x9084 #define GL_PATH_STROKE_BOUND_NV 0x9086 #define GL_COUNT_UP_NV 0x9088 #define GL_COUNT_DOWN_NV 0x9089 #define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A #define GL_CONVEX_HULL_NV 0x908B #define GL_BOUNDING_BOX_NV 0x908D #define GL_TRANSLATE_X_NV 0x908E #define GL_TRANSLATE_Y_NV 0x908F #define GL_TRANSLATE_2D_NV 0x9090 #define GL_TRANSLATE_3D_NV 0x9091 #define GL_AFFINE_2D_NV 0x9092 #define GL_AFFINE_3D_NV 0x9094 #define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 #define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 #define GL_UTF8_NV 0x909A #define GL_UTF16_NV 0x909B #define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C #define GL_PATH_COMMAND_COUNT_NV 0x909D #define GL_PATH_COORD_COUNT_NV 0x909E #define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F #define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 #define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 #define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 #define GL_SQUARE_NV 0x90A3 #define GL_ROUND_NV 0x90A4 #define GL_TRIANGULAR_NV 0x90A5 #define GL_BEVEL_NV 0x90A6 #define GL_MITER_REVERT_NV 0x90A7 #define GL_MITER_TRUNCATE_NV 0x90A8 #define GL_SKIP_MISSING_GLYPH_NV 0x90A9 #define GL_USE_MISSING_GLYPH_NV 0x90AA #define GL_PATH_ERROR_POSITION_NV 0x90AB #define GL_PATH_FOG_GEN_MODE_NV 0x90AC #define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD #define GL_ADJACENT_PAIRS_NV 0x90AE #define GL_FIRST_TO_REST_NV 0x90AF #define GL_PATH_GEN_MODE_NV 0x90B0 #define GL_PATH_GEN_COEFF_NV 0x90B1 #define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 #define GL_PATH_GEN_COMPONENTS_NV 0x90B3 #define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 #define GL_MOVE_TO_RESETS_NV 0x90B5 #define GL_MOVE_TO_CONTINUES_NV 0x90B6 #define GL_PATH_STENCIL_FUNC_NV 0x90B7 #define GL_PATH_STENCIL_REF_NV 0x90B8 #define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 #define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD #define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE #define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF #define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 #define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 #define GL_FONT_UNAVAILABLE_NV 0x936A #define GL_FONT_UNINTELLIGIBLE_NV 0x936B #define GL_STANDARD_FONT_FORMAT_NV 0x936C #define GL_FRAGMENT_INPUT_NV 0x936D #define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 #define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 #define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 #define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 #define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 #define GL_FONT_ASCENDER_BIT_NV 0x00200000 #define GL_FONT_DESCENDER_BIT_NV 0x00400000 #define GL_FONT_HEIGHT_BIT_NV 0x00800000 #define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 #define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 #define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 #define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 #define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 #define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 typedef void (GLAPIENTRY * PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); typedef void (GLAPIENTRY * PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); typedef GLuint (GLAPIENTRY * PFNGLGENPATHSNVPROC) (GLsizei range); typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat* value); typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint* value); typedef void (GLAPIENTRY * PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte* commands); typedef void (GLAPIENTRY * PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat* coords); typedef void (GLAPIENTRY * PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat* dashArray); typedef GLfloat (GLAPIENTRY * PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); typedef void (GLAPIENTRY * PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics); typedef void (GLAPIENTRY * PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat* value); typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint* value); typedef void (GLAPIENTRY * PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat* value); typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint* value); typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLfloat *params); typedef void (GLAPIENTRY * PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); typedef GLboolean (GLAPIENTRY * PFNGLISPATHNVPROC) (GLuint path); typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs); typedef void (GLAPIENTRY * PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); typedef void (GLAPIENTRY * PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); typedef void (GLAPIENTRY * PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum zfunc); typedef void (GLAPIENTRY * PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat* dashArray); typedef void (GLAPIENTRY * PFNGLPATHFOGGENNVPROC) (GLenum genMode); typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); typedef void (GLAPIENTRY * PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef void (GLAPIENTRY * PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void*charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef GLenum (GLAPIENTRY * PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); typedef void (GLAPIENTRY * PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint* value); typedef void (GLAPIENTRY * PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); typedef void (GLAPIENTRY * PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); typedef void (GLAPIENTRY * PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); typedef void (GLAPIENTRY * PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); typedef void (GLAPIENTRY * PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); typedef void (GLAPIENTRY * PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs); typedef GLboolean (GLAPIENTRY * PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); typedef void (GLAPIENTRY * PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat* coeffs); typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); typedef void (GLAPIENTRY * PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues); typedef void (GLAPIENTRY * PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint paths[], const GLfloat weights[]); #define glCopyPathNV GLEW_GET_FUN(__glewCopyPathNV) #define glCoverFillPathInstancedNV GLEW_GET_FUN(__glewCoverFillPathInstancedNV) #define glCoverFillPathNV GLEW_GET_FUN(__glewCoverFillPathNV) #define glCoverStrokePathInstancedNV GLEW_GET_FUN(__glewCoverStrokePathInstancedNV) #define glCoverStrokePathNV GLEW_GET_FUN(__glewCoverStrokePathNV) #define glDeletePathsNV GLEW_GET_FUN(__glewDeletePathsNV) #define glGenPathsNV GLEW_GET_FUN(__glewGenPathsNV) #define glGetPathColorGenfvNV GLEW_GET_FUN(__glewGetPathColorGenfvNV) #define glGetPathColorGenivNV GLEW_GET_FUN(__glewGetPathColorGenivNV) #define glGetPathCommandsNV GLEW_GET_FUN(__glewGetPathCommandsNV) #define glGetPathCoordsNV GLEW_GET_FUN(__glewGetPathCoordsNV) #define glGetPathDashArrayNV GLEW_GET_FUN(__glewGetPathDashArrayNV) #define glGetPathLengthNV GLEW_GET_FUN(__glewGetPathLengthNV) #define glGetPathMetricRangeNV GLEW_GET_FUN(__glewGetPathMetricRangeNV) #define glGetPathMetricsNV GLEW_GET_FUN(__glewGetPathMetricsNV) #define glGetPathParameterfvNV GLEW_GET_FUN(__glewGetPathParameterfvNV) #define glGetPathParameterivNV GLEW_GET_FUN(__glewGetPathParameterivNV) #define glGetPathSpacingNV GLEW_GET_FUN(__glewGetPathSpacingNV) #define glGetPathTexGenfvNV GLEW_GET_FUN(__glewGetPathTexGenfvNV) #define glGetPathTexGenivNV GLEW_GET_FUN(__glewGetPathTexGenivNV) #define glGetProgramResourcefvNV GLEW_GET_FUN(__glewGetProgramResourcefvNV) #define glInterpolatePathsNV GLEW_GET_FUN(__glewInterpolatePathsNV) #define glIsPathNV GLEW_GET_FUN(__glewIsPathNV) #define glIsPointInFillPathNV GLEW_GET_FUN(__glewIsPointInFillPathNV) #define glIsPointInStrokePathNV GLEW_GET_FUN(__glewIsPointInStrokePathNV) #define glMatrixLoad3x2fNV GLEW_GET_FUN(__glewMatrixLoad3x2fNV) #define glMatrixLoad3x3fNV GLEW_GET_FUN(__glewMatrixLoad3x3fNV) #define glMatrixLoadTranspose3x3fNV GLEW_GET_FUN(__glewMatrixLoadTranspose3x3fNV) #define glMatrixMult3x2fNV GLEW_GET_FUN(__glewMatrixMult3x2fNV) #define glMatrixMult3x3fNV GLEW_GET_FUN(__glewMatrixMult3x3fNV) #define glMatrixMultTranspose3x3fNV GLEW_GET_FUN(__glewMatrixMultTranspose3x3fNV) #define glPathColorGenNV GLEW_GET_FUN(__glewPathColorGenNV) #define glPathCommandsNV GLEW_GET_FUN(__glewPathCommandsNV) #define glPathCoordsNV GLEW_GET_FUN(__glewPathCoordsNV) #define glPathCoverDepthFuncNV GLEW_GET_FUN(__glewPathCoverDepthFuncNV) #define glPathDashArrayNV GLEW_GET_FUN(__glewPathDashArrayNV) #define glPathFogGenNV GLEW_GET_FUN(__glewPathFogGenNV) #define glPathGlyphIndexArrayNV GLEW_GET_FUN(__glewPathGlyphIndexArrayNV) #define glPathGlyphIndexRangeNV GLEW_GET_FUN(__glewPathGlyphIndexRangeNV) #define glPathGlyphRangeNV GLEW_GET_FUN(__glewPathGlyphRangeNV) #define glPathGlyphsNV GLEW_GET_FUN(__glewPathGlyphsNV) #define glPathMemoryGlyphIndexArrayNV GLEW_GET_FUN(__glewPathMemoryGlyphIndexArrayNV) #define glPathParameterfNV GLEW_GET_FUN(__glewPathParameterfNV) #define glPathParameterfvNV GLEW_GET_FUN(__glewPathParameterfvNV) #define glPathParameteriNV GLEW_GET_FUN(__glewPathParameteriNV) #define glPathParameterivNV GLEW_GET_FUN(__glewPathParameterivNV) #define glPathStencilDepthOffsetNV GLEW_GET_FUN(__glewPathStencilDepthOffsetNV) #define glPathStencilFuncNV GLEW_GET_FUN(__glewPathStencilFuncNV) #define glPathStringNV GLEW_GET_FUN(__glewPathStringNV) #define glPathSubCommandsNV GLEW_GET_FUN(__glewPathSubCommandsNV) #define glPathSubCoordsNV GLEW_GET_FUN(__glewPathSubCoordsNV) #define glPathTexGenNV GLEW_GET_FUN(__glewPathTexGenNV) #define glPointAlongPathNV GLEW_GET_FUN(__glewPointAlongPathNV) #define glProgramPathFragmentInputGenNV GLEW_GET_FUN(__glewProgramPathFragmentInputGenNV) #define glStencilFillPathInstancedNV GLEW_GET_FUN(__glewStencilFillPathInstancedNV) #define glStencilFillPathNV GLEW_GET_FUN(__glewStencilFillPathNV) #define glStencilStrokePathInstancedNV GLEW_GET_FUN(__glewStencilStrokePathInstancedNV) #define glStencilStrokePathNV GLEW_GET_FUN(__glewStencilStrokePathNV) #define glStencilThenCoverFillPathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverFillPathInstancedNV) #define glStencilThenCoverFillPathNV GLEW_GET_FUN(__glewStencilThenCoverFillPathNV) #define glStencilThenCoverStrokePathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathInstancedNV) #define glStencilThenCoverStrokePathNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathNV) #define glTransformPathNV GLEW_GET_FUN(__glewTransformPathNV) #define glWeightPathsNV GLEW_GET_FUN(__glewWeightPathsNV) #define GLEW_NV_path_rendering GLEW_GET_VAR(__GLEW_NV_path_rendering) #endif /* GL_NV_path_rendering */ /* -------------------- GL_NV_path_rendering_shared_edge ------------------- */ #ifndef GL_NV_path_rendering_shared_edge #define GL_NV_path_rendering_shared_edge 1 #define GL_SHARED_EDGE_NV 0xC0 #define GLEW_NV_path_rendering_shared_edge GLEW_GET_VAR(__GLEW_NV_path_rendering_shared_edge) #endif /* GL_NV_path_rendering_shared_edge */ /* ----------------------- GL_NV_pixel_buffer_object ----------------------- */ #ifndef GL_NV_pixel_buffer_object #define GL_NV_pixel_buffer_object 1 #define GL_PIXEL_PACK_BUFFER_NV 0x88EB #define GL_PIXEL_UNPACK_BUFFER_NV 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING_NV 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING_NV 0x88EF #define GLEW_NV_pixel_buffer_object GLEW_GET_VAR(__GLEW_NV_pixel_buffer_object) #endif /* GL_NV_pixel_buffer_object */ /* ------------------------- GL_NV_pixel_data_range ------------------------ */ #ifndef GL_NV_pixel_data_range #define GL_NV_pixel_data_range 1 #define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 #define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 #define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A #define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B #define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C #define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void *pointer); #define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) #define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) #define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range) #endif /* GL_NV_pixel_data_range */ /* ------------------------- GL_NV_platform_binary ------------------------- */ #ifndef GL_NV_platform_binary #define GL_NV_platform_binary 1 #define GL_NVIDIA_PLATFORM_BINARY_NV 0x890B #define GLEW_NV_platform_binary GLEW_GET_VAR(__GLEW_NV_platform_binary) #endif /* GL_NV_platform_binary */ /* --------------------------- GL_NV_point_sprite -------------------------- */ #ifndef GL_NV_point_sprite #define GL_NV_point_sprite 1 #define GL_POINT_SPRITE_NV 0x8861 #define GL_COORD_REPLACE_NV 0x8862 #define GL_POINT_SPRITE_R_MODE_NV 0x8863 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params); #define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV) #define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV) #define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite) #endif /* GL_NV_point_sprite */ /* --------------------------- GL_NV_polygon_mode -------------------------- */ #ifndef GL_NV_polygon_mode #define GL_NV_polygon_mode 1 #define GL_POLYGON_MODE_NV 0x0B40 #define GL_POINT_NV 0x1B00 #define GL_LINE_NV 0x1B01 #define GL_FILL_NV 0x1B02 #define GL_POLYGON_OFFSET_POINT_NV 0x2A01 #define GL_POLYGON_OFFSET_LINE_NV 0x2A02 typedef void (GLAPIENTRY * PFNGLPOLYGONMODENVPROC) (GLenum face, GLenum mode); #define glPolygonModeNV GLEW_GET_FUN(__glewPolygonModeNV) #define GLEW_NV_polygon_mode GLEW_GET_VAR(__GLEW_NV_polygon_mode) #endif /* GL_NV_polygon_mode */ /* -------------------------- GL_NV_present_video -------------------------- */ #ifndef GL_NV_present_video #define GL_NV_present_video 1 #define GL_FRAME_NV 0x8E26 #define GL_FIELDS_NV 0x8E27 #define GL_CURRENT_TIME_NV 0x8E28 #define GL_NUM_FILL_STREAMS_NV 0x8E29 #define GL_PRESENT_TIME_NV 0x8E2A #define GL_PRESENT_DURATION_NV 0x8E2B typedef void (GLAPIENTRY * PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); #define glGetVideoi64vNV GLEW_GET_FUN(__glewGetVideoi64vNV) #define glGetVideoivNV GLEW_GET_FUN(__glewGetVideoivNV) #define glGetVideoui64vNV GLEW_GET_FUN(__glewGetVideoui64vNV) #define glGetVideouivNV GLEW_GET_FUN(__glewGetVideouivNV) #define glPresentFrameDualFillNV GLEW_GET_FUN(__glewPresentFrameDualFillNV) #define glPresentFrameKeyedNV GLEW_GET_FUN(__glewPresentFrameKeyedNV) #define GLEW_NV_present_video GLEW_GET_VAR(__GLEW_NV_present_video) #endif /* GL_NV_present_video */ /* ------------------------ GL_NV_primitive_restart ------------------------ */ #ifndef GL_NV_primitive_restart #define GL_NV_primitive_restart 1 #define GL_PRIMITIVE_RESTART_NV 0x8558 #define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void); #define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV) #define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV) #define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart) #endif /* GL_NV_primitive_restart */ /* ---------------------------- GL_NV_read_depth --------------------------- */ #ifndef GL_NV_read_depth #define GL_NV_read_depth 1 #define GLEW_NV_read_depth GLEW_GET_VAR(__GLEW_NV_read_depth) #endif /* GL_NV_read_depth */ /* ------------------------ GL_NV_read_depth_stencil ----------------------- */ #ifndef GL_NV_read_depth_stencil #define GL_NV_read_depth_stencil 1 #define GLEW_NV_read_depth_stencil GLEW_GET_VAR(__GLEW_NV_read_depth_stencil) #endif /* GL_NV_read_depth_stencil */ /* --------------------------- GL_NV_read_stencil -------------------------- */ #ifndef GL_NV_read_stencil #define GL_NV_read_stencil 1 #define GLEW_NV_read_stencil GLEW_GET_VAR(__GLEW_NV_read_stencil) #endif /* GL_NV_read_stencil */ /* ------------------------ GL_NV_register_combiners ----------------------- */ #ifndef GL_NV_register_combiners #define GL_NV_register_combiners 1 #define GL_REGISTER_COMBINERS_NV 0x8522 #define GL_VARIABLE_A_NV 0x8523 #define GL_VARIABLE_B_NV 0x8524 #define GL_VARIABLE_C_NV 0x8525 #define GL_VARIABLE_D_NV 0x8526 #define GL_VARIABLE_E_NV 0x8527 #define GL_VARIABLE_F_NV 0x8528 #define GL_VARIABLE_G_NV 0x8529 #define GL_CONSTANT_COLOR0_NV 0x852A #define GL_CONSTANT_COLOR1_NV 0x852B #define GL_PRIMARY_COLOR_NV 0x852C #define GL_SECONDARY_COLOR_NV 0x852D #define GL_SPARE0_NV 0x852E #define GL_SPARE1_NV 0x852F #define GL_DISCARD_NV 0x8530 #define GL_E_TIMES_F_NV 0x8531 #define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 #define GL_UNSIGNED_IDENTITY_NV 0x8536 #define GL_UNSIGNED_INVERT_NV 0x8537 #define GL_EXPAND_NORMAL_NV 0x8538 #define GL_EXPAND_NEGATE_NV 0x8539 #define GL_HALF_BIAS_NORMAL_NV 0x853A #define GL_HALF_BIAS_NEGATE_NV 0x853B #define GL_SIGNED_IDENTITY_NV 0x853C #define GL_SIGNED_NEGATE_NV 0x853D #define GL_SCALE_BY_TWO_NV 0x853E #define GL_SCALE_BY_FOUR_NV 0x853F #define GL_SCALE_BY_ONE_HALF_NV 0x8540 #define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 #define GL_COMBINER_INPUT_NV 0x8542 #define GL_COMBINER_MAPPING_NV 0x8543 #define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 #define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 #define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 #define GL_COMBINER_MUX_SUM_NV 0x8547 #define GL_COMBINER_SCALE_NV 0x8548 #define GL_COMBINER_BIAS_NV 0x8549 #define GL_COMBINER_AB_OUTPUT_NV 0x854A #define GL_COMBINER_CD_OUTPUT_NV 0x854B #define GL_COMBINER_SUM_OUTPUT_NV 0x854C #define GL_MAX_GENERAL_COMBINERS_NV 0x854D #define GL_NUM_GENERAL_COMBINERS_NV 0x854E #define GL_COLOR_SUM_CLAMP_NV 0x854F #define GL_COMBINER0_NV 0x8550 #define GL_COMBINER1_NV 0x8551 #define GL_COMBINER2_NV 0x8552 #define GL_COMBINER3_NV 0x8553 #define GL_COMBINER4_NV 0x8554 #define GL_COMBINER5_NV 0x8555 #define GL_COMBINER6_NV 0x8556 #define GL_COMBINER7_NV 0x8557 typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params); #define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV) #define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV) #define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV) #define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV) #define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV) #define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV) #define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV) #define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV) #define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV) #define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV) #define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV) #define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV) #define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV) #define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners) #endif /* GL_NV_register_combiners */ /* ----------------------- GL_NV_register_combiners2 ----------------------- */ #ifndef GL_NV_register_combiners2 #define GL_NV_register_combiners2 1 #define GL_PER_STAGE_CONSTANTS_NV 0x8535 typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params); #define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV) #define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV) #define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2) #endif /* GL_NV_register_combiners2 */ /* ------------------ GL_NV_robustness_video_memory_purge ------------------ */ #ifndef GL_NV_robustness_video_memory_purge #define GL_NV_robustness_video_memory_purge 1 #define GL_EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C #define GL_PURGED_CONTEXT_RESET_NV 0x92BB #define GLEW_NV_robustness_video_memory_purge GLEW_GET_VAR(__GLEW_NV_robustness_video_memory_purge) #endif /* GL_NV_robustness_video_memory_purge */ /* --------------------------- GL_NV_sRGB_formats -------------------------- */ #ifndef GL_NV_sRGB_formats #define GL_NV_sRGB_formats 1 #define GL_ETC1_SRGB8_NV 0x88EE #define GL_SRGB8_NV 0x8C41 #define GL_SLUMINANCE_ALPHA_NV 0x8C44 #define GL_SLUMINANCE8_ALPHA8_NV 0x8C45 #define GL_SLUMINANCE_NV 0x8C46 #define GL_SLUMINANCE8_NV 0x8C47 #define GL_COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F #define GLEW_NV_sRGB_formats GLEW_GET_VAR(__GLEW_NV_sRGB_formats) #endif /* GL_NV_sRGB_formats */ /* ------------------------- GL_NV_sample_locations ------------------------ */ #ifndef GL_NV_sample_locations #define GL_NV_sample_locations 1 #define GL_SAMPLE_LOCATION_NV 0x8E50 #define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D #define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E #define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F #define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 #define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 #define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 #define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); #define glFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewFramebufferSampleLocationsfvNV) #define glNamedFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvNV) #define GLEW_NV_sample_locations GLEW_GET_VAR(__GLEW_NV_sample_locations) #endif /* GL_NV_sample_locations */ /* ------------------ GL_NV_sample_mask_override_coverage ------------------ */ #ifndef GL_NV_sample_mask_override_coverage #define GL_NV_sample_mask_override_coverage 1 #define GLEW_NV_sample_mask_override_coverage GLEW_GET_VAR(__GLEW_NV_sample_mask_override_coverage) #endif /* GL_NV_sample_mask_override_coverage */ /* ---------------------- GL_NV_shader_atomic_counters --------------------- */ #ifndef GL_NV_shader_atomic_counters #define GL_NV_shader_atomic_counters 1 #define GLEW_NV_shader_atomic_counters GLEW_GET_VAR(__GLEW_NV_shader_atomic_counters) #endif /* GL_NV_shader_atomic_counters */ /* ----------------------- GL_NV_shader_atomic_float ----------------------- */ #ifndef GL_NV_shader_atomic_float #define GL_NV_shader_atomic_float 1 #define GLEW_NV_shader_atomic_float GLEW_GET_VAR(__GLEW_NV_shader_atomic_float) #endif /* GL_NV_shader_atomic_float */ /* ---------------------- GL_NV_shader_atomic_float64 ---------------------- */ #ifndef GL_NV_shader_atomic_float64 #define GL_NV_shader_atomic_float64 1 #define GLEW_NV_shader_atomic_float64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_float64) #endif /* GL_NV_shader_atomic_float64 */ /* -------------------- GL_NV_shader_atomic_fp16_vector -------------------- */ #ifndef GL_NV_shader_atomic_fp16_vector #define GL_NV_shader_atomic_fp16_vector 1 #define GLEW_NV_shader_atomic_fp16_vector GLEW_GET_VAR(__GLEW_NV_shader_atomic_fp16_vector) #endif /* GL_NV_shader_atomic_fp16_vector */ /* ----------------------- GL_NV_shader_atomic_int64 ----------------------- */ #ifndef GL_NV_shader_atomic_int64 #define GL_NV_shader_atomic_int64 1 #define GLEW_NV_shader_atomic_int64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_int64) #endif /* GL_NV_shader_atomic_int64 */ /* ------------------------ GL_NV_shader_buffer_load ----------------------- */ #ifndef GL_NV_shader_buffer_load #define GL_NV_shader_buffer_load 1 #define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D #define GL_GPU_ADDRESS_NV 0x8F34 #define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT* result); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT* params); typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); #define glGetBufferParameterui64vNV GLEW_GET_FUN(__glewGetBufferParameterui64vNV) #define glGetIntegerui64vNV GLEW_GET_FUN(__glewGetIntegerui64vNV) #define glGetNamedBufferParameterui64vNV GLEW_GET_FUN(__glewGetNamedBufferParameterui64vNV) #define glIsBufferResidentNV GLEW_GET_FUN(__glewIsBufferResidentNV) #define glIsNamedBufferResidentNV GLEW_GET_FUN(__glewIsNamedBufferResidentNV) #define glMakeBufferNonResidentNV GLEW_GET_FUN(__glewMakeBufferNonResidentNV) #define glMakeBufferResidentNV GLEW_GET_FUN(__glewMakeBufferResidentNV) #define glMakeNamedBufferNonResidentNV GLEW_GET_FUN(__glewMakeNamedBufferNonResidentNV) #define glMakeNamedBufferResidentNV GLEW_GET_FUN(__glewMakeNamedBufferResidentNV) #define glProgramUniformui64NV GLEW_GET_FUN(__glewProgramUniformui64NV) #define glProgramUniformui64vNV GLEW_GET_FUN(__glewProgramUniformui64vNV) #define glUniformui64NV GLEW_GET_FUN(__glewUniformui64NV) #define glUniformui64vNV GLEW_GET_FUN(__glewUniformui64vNV) #define GLEW_NV_shader_buffer_load GLEW_GET_VAR(__GLEW_NV_shader_buffer_load) #endif /* GL_NV_shader_buffer_load */ /* ---------------- GL_NV_shader_noperspective_interpolation --------------- */ #ifndef GL_NV_shader_noperspective_interpolation #define GL_NV_shader_noperspective_interpolation 1 #define GLEW_NV_shader_noperspective_interpolation GLEW_GET_VAR(__GLEW_NV_shader_noperspective_interpolation) #endif /* GL_NV_shader_noperspective_interpolation */ /* ------------------- GL_NV_shader_storage_buffer_object ------------------ */ #ifndef GL_NV_shader_storage_buffer_object #define GL_NV_shader_storage_buffer_object 1 #define GLEW_NV_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_NV_shader_storage_buffer_object) #endif /* GL_NV_shader_storage_buffer_object */ /* ----------------------- GL_NV_shader_thread_group ----------------------- */ #ifndef GL_NV_shader_thread_group #define GL_NV_shader_thread_group 1 #define GL_WARP_SIZE_NV 0x9339 #define GL_WARPS_PER_SM_NV 0x933A #define GL_SM_COUNT_NV 0x933B #define GLEW_NV_shader_thread_group GLEW_GET_VAR(__GLEW_NV_shader_thread_group) #endif /* GL_NV_shader_thread_group */ /* ---------------------- GL_NV_shader_thread_shuffle ---------------------- */ #ifndef GL_NV_shader_thread_shuffle #define GL_NV_shader_thread_shuffle 1 #define GLEW_NV_shader_thread_shuffle GLEW_GET_VAR(__GLEW_NV_shader_thread_shuffle) #endif /* GL_NV_shader_thread_shuffle */ /* ---------------------- GL_NV_shadow_samplers_array ---------------------- */ #ifndef GL_NV_shadow_samplers_array #define GL_NV_shadow_samplers_array 1 #define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 #define GLEW_NV_shadow_samplers_array GLEW_GET_VAR(__GLEW_NV_shadow_samplers_array) #endif /* GL_NV_shadow_samplers_array */ /* ----------------------- GL_NV_shadow_samplers_cube ---------------------- */ #ifndef GL_NV_shadow_samplers_cube #define GL_NV_shadow_samplers_cube 1 #define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 #define GLEW_NV_shadow_samplers_cube GLEW_GET_VAR(__GLEW_NV_shadow_samplers_cube) #endif /* GL_NV_shadow_samplers_cube */ /* ---------------------- GL_NV_stereo_view_rendering ---------------------- */ #ifndef GL_NV_stereo_view_rendering #define GL_NV_stereo_view_rendering 1 #define GLEW_NV_stereo_view_rendering GLEW_GET_VAR(__GLEW_NV_stereo_view_rendering) #endif /* GL_NV_stereo_view_rendering */ /* ---------------------- GL_NV_tessellation_program5 ---------------------- */ #ifndef GL_NV_tessellation_program5 #define GL_NV_tessellation_program5 1 #define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 #define GL_TESS_CONTROL_PROGRAM_NV 0x891E #define GL_TESS_EVALUATION_PROGRAM_NV 0x891F #define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 #define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 #define GLEW_NV_tessellation_program5 GLEW_GET_VAR(__GLEW_NV_tessellation_program5) #endif /* GL_NV_tessellation_program5 */ /* -------------------------- GL_NV_texgen_emboss -------------------------- */ #ifndef GL_NV_texgen_emboss #define GL_NV_texgen_emboss 1 #define GL_EMBOSS_LIGHT_NV 0x855D #define GL_EMBOSS_CONSTANT_NV 0x855E #define GL_EMBOSS_MAP_NV 0x855F #define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss) #endif /* GL_NV_texgen_emboss */ /* ------------------------ GL_NV_texgen_reflection ------------------------ */ #ifndef GL_NV_texgen_reflection #define GL_NV_texgen_reflection 1 #define GL_NORMAL_MAP_NV 0x8511 #define GL_REFLECTION_MAP_NV 0x8512 #define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection) #endif /* GL_NV_texgen_reflection */ /* -------------------------- GL_NV_texture_array -------------------------- */ #ifndef GL_NV_texture_array #define GL_NV_texture_array 1 #define GL_UNPACK_SKIP_IMAGES_NV 0x806D #define GL_UNPACK_IMAGE_HEIGHT_NV 0x806E #define GL_MAX_ARRAY_TEXTURE_LAYERS_NV 0x88FF #define GL_TEXTURE_2D_ARRAY_NV 0x8C1A #define GL_TEXTURE_BINDING_2D_ARRAY_NV 0x8C1D #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_NV 0x8CD4 #define GL_SAMPLER_2D_ARRAY_NV 0x8DC1 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DNVPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERNVPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DNVPROC) (GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); #define glCompressedTexImage3DNV GLEW_GET_FUN(__glewCompressedTexImage3DNV) #define glCompressedTexSubImage3DNV GLEW_GET_FUN(__glewCompressedTexSubImage3DNV) #define glCopyTexSubImage3DNV GLEW_GET_FUN(__glewCopyTexSubImage3DNV) #define glFramebufferTextureLayerNV GLEW_GET_FUN(__glewFramebufferTextureLayerNV) #define glTexImage3DNV GLEW_GET_FUN(__glewTexImage3DNV) #define glTexSubImage3DNV GLEW_GET_FUN(__glewTexSubImage3DNV) #define GLEW_NV_texture_array GLEW_GET_VAR(__GLEW_NV_texture_array) #endif /* GL_NV_texture_array */ /* ------------------------- GL_NV_texture_barrier ------------------------- */ #ifndef GL_NV_texture_barrier #define GL_NV_texture_barrier 1 typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERNVPROC) (void); #define glTextureBarrierNV GLEW_GET_FUN(__glewTextureBarrierNV) #define GLEW_NV_texture_barrier GLEW_GET_VAR(__GLEW_NV_texture_barrier) #endif /* GL_NV_texture_barrier */ /* ----------------------- GL_NV_texture_border_clamp ---------------------- */ #ifndef GL_NV_texture_border_clamp #define GL_NV_texture_border_clamp 1 #define GL_TEXTURE_BORDER_COLOR_NV 0x1004 #define GL_CLAMP_TO_BORDER_NV 0x812D #define GLEW_NV_texture_border_clamp GLEW_GET_VAR(__GLEW_NV_texture_border_clamp) #endif /* GL_NV_texture_border_clamp */ /* --------------------- GL_NV_texture_compression_latc -------------------- */ #ifndef GL_NV_texture_compression_latc #define GL_NV_texture_compression_latc 1 #define GL_COMPRESSED_LUMINANCE_LATC1_NV 0x8C70 #define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_NV 0x8C71 #define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_NV 0x8C72 #define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_NV 0x8C73 #define GLEW_NV_texture_compression_latc GLEW_GET_VAR(__GLEW_NV_texture_compression_latc) #endif /* GL_NV_texture_compression_latc */ /* --------------------- GL_NV_texture_compression_s3tc -------------------- */ #ifndef GL_NV_texture_compression_s3tc #define GL_NV_texture_compression_s3tc 1 #define GL_COMPRESSED_RGB_S3TC_DXT1_NV 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_NV 0x83F1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_NV 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_NV 0x83F3 #define GLEW_NV_texture_compression_s3tc GLEW_GET_VAR(__GLEW_NV_texture_compression_s3tc) #endif /* GL_NV_texture_compression_s3tc */ /* ----------------- GL_NV_texture_compression_s3tc_update ----------------- */ #ifndef GL_NV_texture_compression_s3tc_update #define GL_NV_texture_compression_s3tc_update 1 #define GLEW_NV_texture_compression_s3tc_update GLEW_GET_VAR(__GLEW_NV_texture_compression_s3tc_update) #endif /* GL_NV_texture_compression_s3tc_update */ /* --------------------- GL_NV_texture_compression_vtc --------------------- */ #ifndef GL_NV_texture_compression_vtc #define GL_NV_texture_compression_vtc 1 #define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc) #endif /* GL_NV_texture_compression_vtc */ /* ----------------------- GL_NV_texture_env_combine4 ---------------------- */ #ifndef GL_NV_texture_env_combine4 #define GL_NV_texture_env_combine4 1 #define GL_COMBINE4_NV 0x8503 #define GL_SOURCE3_RGB_NV 0x8583 #define GL_SOURCE3_ALPHA_NV 0x858B #define GL_OPERAND3_RGB_NV 0x8593 #define GL_OPERAND3_ALPHA_NV 0x859B #define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4) #endif /* GL_NV_texture_env_combine4 */ /* ---------------------- GL_NV_texture_expand_normal ---------------------- */ #ifndef GL_NV_texture_expand_normal #define GL_NV_texture_expand_normal 1 #define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F #define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal) #endif /* GL_NV_texture_expand_normal */ /* ----------------------- GL_NV_texture_multisample ----------------------- */ #ifndef GL_NV_texture_multisample #define GL_NV_texture_multisample 1 #define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 #define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); #define glTexImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage2DMultisampleCoverageNV) #define glTexImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage3DMultisampleCoverageNV) #define glTextureImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage2DMultisampleCoverageNV) #define glTextureImage2DMultisampleNV GLEW_GET_FUN(__glewTextureImage2DMultisampleNV) #define glTextureImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage3DMultisampleCoverageNV) #define glTextureImage3DMultisampleNV GLEW_GET_FUN(__glewTextureImage3DMultisampleNV) #define GLEW_NV_texture_multisample GLEW_GET_VAR(__GLEW_NV_texture_multisample) #endif /* GL_NV_texture_multisample */ /* ---------------------- GL_NV_texture_npot_2D_mipmap --------------------- */ #ifndef GL_NV_texture_npot_2D_mipmap #define GL_NV_texture_npot_2D_mipmap 1 #define GLEW_NV_texture_npot_2D_mipmap GLEW_GET_VAR(__GLEW_NV_texture_npot_2D_mipmap) #endif /* GL_NV_texture_npot_2D_mipmap */ /* ------------------------ GL_NV_texture_rectangle ------------------------ */ #ifndef GL_NV_texture_rectangle #define GL_NV_texture_rectangle 1 #define GL_TEXTURE_RECTANGLE_NV 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 #define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle) #endif /* GL_NV_texture_rectangle */ /* ------------------- GL_NV_texture_rectangle_compressed ------------------ */ #ifndef GL_NV_texture_rectangle_compressed #define GL_NV_texture_rectangle_compressed 1 #define GLEW_NV_texture_rectangle_compressed GLEW_GET_VAR(__GLEW_NV_texture_rectangle_compressed) #endif /* GL_NV_texture_rectangle_compressed */ /* -------------------------- GL_NV_texture_shader ------------------------- */ #ifndef GL_NV_texture_shader #define GL_NV_texture_shader 1 #define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C #define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D #define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E #define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 #define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA #define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB #define GL_DSDT_MAG_INTENSITY_NV 0x86DC #define GL_SHADER_CONSISTENT_NV 0x86DD #define GL_TEXTURE_SHADER_NV 0x86DE #define GL_SHADER_OPERATION_NV 0x86DF #define GL_CULL_MODES_NV 0x86E0 #define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 #define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 #define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 #define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 #define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 #define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 #define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 #define GL_CONST_EYE_NV 0x86E5 #define GL_PASS_THROUGH_NV 0x86E6 #define GL_CULL_FRAGMENT_NV 0x86E7 #define GL_OFFSET_TEXTURE_2D_NV 0x86E8 #define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 #define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA #define GL_DOT_PRODUCT_NV 0x86EC #define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED #define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE #define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 #define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 #define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 #define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 #define GL_HILO_NV 0x86F4 #define GL_DSDT_NV 0x86F5 #define GL_DSDT_MAG_NV 0x86F6 #define GL_DSDT_MAG_VIB_NV 0x86F7 #define GL_HILO16_NV 0x86F8 #define GL_SIGNED_HILO_NV 0x86F9 #define GL_SIGNED_HILO16_NV 0x86FA #define GL_SIGNED_RGBA_NV 0x86FB #define GL_SIGNED_RGBA8_NV 0x86FC #define GL_SIGNED_RGB_NV 0x86FE #define GL_SIGNED_RGB8_NV 0x86FF #define GL_SIGNED_LUMINANCE_NV 0x8701 #define GL_SIGNED_LUMINANCE8_NV 0x8702 #define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 #define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 #define GL_SIGNED_ALPHA_NV 0x8705 #define GL_SIGNED_ALPHA8_NV 0x8706 #define GL_SIGNED_INTENSITY_NV 0x8707 #define GL_SIGNED_INTENSITY8_NV 0x8708 #define GL_DSDT8_NV 0x8709 #define GL_DSDT8_MAG8_NV 0x870A #define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B #define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C #define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D #define GL_HI_SCALE_NV 0x870E #define GL_LO_SCALE_NV 0x870F #define GL_DS_SCALE_NV 0x8710 #define GL_DT_SCALE_NV 0x8711 #define GL_MAGNITUDE_SCALE_NV 0x8712 #define GL_VIBRANCE_SCALE_NV 0x8713 #define GL_HI_BIAS_NV 0x8714 #define GL_LO_BIAS_NV 0x8715 #define GL_DS_BIAS_NV 0x8716 #define GL_DT_BIAS_NV 0x8717 #define GL_MAGNITUDE_BIAS_NV 0x8718 #define GL_VIBRANCE_BIAS_NV 0x8719 #define GL_TEXTURE_BORDER_VALUES_NV 0x871A #define GL_TEXTURE_HI_SIZE_NV 0x871B #define GL_TEXTURE_LO_SIZE_NV 0x871C #define GL_TEXTURE_DS_SIZE_NV 0x871D #define GL_TEXTURE_DT_SIZE_NV 0x871E #define GL_TEXTURE_MAG_SIZE_NV 0x871F #define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader) #endif /* GL_NV_texture_shader */ /* ------------------------- GL_NV_texture_shader2 ------------------------- */ #ifndef GL_NV_texture_shader2 #define GL_NV_texture_shader2 1 #define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA #define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB #define GL_DSDT_MAG_INTENSITY_NV 0x86DC #define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF #define GL_HILO_NV 0x86F4 #define GL_DSDT_NV 0x86F5 #define GL_DSDT_MAG_NV 0x86F6 #define GL_DSDT_MAG_VIB_NV 0x86F7 #define GL_HILO16_NV 0x86F8 #define GL_SIGNED_HILO_NV 0x86F9 #define GL_SIGNED_HILO16_NV 0x86FA #define GL_SIGNED_RGBA_NV 0x86FB #define GL_SIGNED_RGBA8_NV 0x86FC #define GL_SIGNED_RGB_NV 0x86FE #define GL_SIGNED_RGB8_NV 0x86FF #define GL_SIGNED_LUMINANCE_NV 0x8701 #define GL_SIGNED_LUMINANCE8_NV 0x8702 #define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 #define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 #define GL_SIGNED_ALPHA_NV 0x8705 #define GL_SIGNED_ALPHA8_NV 0x8706 #define GL_SIGNED_INTENSITY_NV 0x8707 #define GL_SIGNED_INTENSITY8_NV 0x8708 #define GL_DSDT8_NV 0x8709 #define GL_DSDT8_MAG8_NV 0x870A #define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B #define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C #define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D #define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2) #endif /* GL_NV_texture_shader2 */ /* ------------------------- GL_NV_texture_shader3 ------------------------- */ #ifndef GL_NV_texture_shader3 #define GL_NV_texture_shader3 1 #define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 #define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 #define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 #define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 #define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 #define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 #define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 #define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 #define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 #define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 #define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A #define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B #define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C #define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D #define GL_HILO8_NV 0x885E #define GL_SIGNED_HILO8_NV 0x885F #define GL_FORCE_BLUE_TO_ONE_NV 0x8860 #define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3) #endif /* GL_NV_texture_shader3 */ /* ------------------------ GL_NV_transform_feedback ----------------------- */ #ifndef GL_NV_transform_feedback #define GL_NV_transform_feedback 1 #define GL_BACK_PRIMARY_COLOR_NV 0x8C77 #define GL_BACK_SECONDARY_COLOR_NV 0x8C78 #define GL_TEXTURE_COORD_NV 0x8C79 #define GL_CLIP_DISTANCE_NV 0x8C7A #define GL_VERTEX_ID_NV 0x8C7B #define GL_PRIMITIVE_ID_NV 0x8C7C #define GL_GENERIC_ATTRIB_NV 0x8C7D #define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 #define GL_ACTIVE_VARYINGS_NV 0x8C81 #define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 #define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 #define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 #define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 #define GL_PRIMITIVES_GENERATED_NV 0x8C87 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 #define GL_RASTERIZER_DISCARD_NV 0x8C89 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B #define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C #define GL_SEPARATE_ATTRIBS_NV 0x8C8D #define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); #define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV) #define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV) #define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV) #define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV) #define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV) #define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV) #define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV) #define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV) #define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV) #define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV) #define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV) #define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback) #endif /* GL_NV_transform_feedback */ /* ----------------------- GL_NV_transform_feedback2 ----------------------- */ #ifndef GL_NV_transform_feedback2 #define GL_NV_transform_feedback2 1 #define GL_TRANSFORM_FEEDBACK_NV 0x8E22 #define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 #define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 #define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint* ids); typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); #define glBindTransformFeedbackNV GLEW_GET_FUN(__glewBindTransformFeedbackNV) #define glDeleteTransformFeedbacksNV GLEW_GET_FUN(__glewDeleteTransformFeedbacksNV) #define glDrawTransformFeedbackNV GLEW_GET_FUN(__glewDrawTransformFeedbackNV) #define glGenTransformFeedbacksNV GLEW_GET_FUN(__glewGenTransformFeedbacksNV) #define glIsTransformFeedbackNV GLEW_GET_FUN(__glewIsTransformFeedbackNV) #define glPauseTransformFeedbackNV GLEW_GET_FUN(__glewPauseTransformFeedbackNV) #define glResumeTransformFeedbackNV GLEW_GET_FUN(__glewResumeTransformFeedbackNV) #define GLEW_NV_transform_feedback2 GLEW_GET_VAR(__GLEW_NV_transform_feedback2) #endif /* GL_NV_transform_feedback2 */ /* ------------------ GL_NV_uniform_buffer_unified_memory ------------------ */ #ifndef GL_NV_uniform_buffer_unified_memory #define GL_NV_uniform_buffer_unified_memory 1 #define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E #define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F #define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 #define GLEW_NV_uniform_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_uniform_buffer_unified_memory) #endif /* GL_NV_uniform_buffer_unified_memory */ /* -------------------------- GL_NV_vdpau_interop -------------------------- */ #ifndef GL_NV_vdpau_interop #define GL_NV_vdpau_interop 1 #define GL_SURFACE_STATE_NV 0x86EB #define GL_SURFACE_REGISTERED_NV 0x86FD #define GL_SURFACE_MAPPED_NV 0x8700 #define GL_WRITE_DISCARD_NV 0x88BE typedef GLintptr GLvdpauSurfaceNV; typedef void (GLAPIENTRY * PFNGLVDPAUFININVPROC) (void); typedef void (GLAPIENTRY * PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); typedef void (GLAPIENTRY * PFNGLVDPAUINITNVPROC) (const void* vdpDevice, const void*getProcAddress); typedef void (GLAPIENTRY * PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); typedef void (GLAPIENTRY * PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces); typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); typedef void (GLAPIENTRY * PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); typedef void (GLAPIENTRY * PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV* surfaces); typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); #define glVDPAUFiniNV GLEW_GET_FUN(__glewVDPAUFiniNV) #define glVDPAUGetSurfaceivNV GLEW_GET_FUN(__glewVDPAUGetSurfaceivNV) #define glVDPAUInitNV GLEW_GET_FUN(__glewVDPAUInitNV) #define glVDPAUIsSurfaceNV GLEW_GET_FUN(__glewVDPAUIsSurfaceNV) #define glVDPAUMapSurfacesNV GLEW_GET_FUN(__glewVDPAUMapSurfacesNV) #define glVDPAURegisterOutputSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterOutputSurfaceNV) #define glVDPAURegisterVideoSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterVideoSurfaceNV) #define glVDPAUSurfaceAccessNV GLEW_GET_FUN(__glewVDPAUSurfaceAccessNV) #define glVDPAUUnmapSurfacesNV GLEW_GET_FUN(__glewVDPAUUnmapSurfacesNV) #define glVDPAUUnregisterSurfaceNV GLEW_GET_FUN(__glewVDPAUUnregisterSurfaceNV) #define GLEW_NV_vdpau_interop GLEW_GET_VAR(__GLEW_NV_vdpau_interop) #endif /* GL_NV_vdpau_interop */ /* ------------------------ GL_NV_vertex_array_range ----------------------- */ #ifndef GL_NV_vertex_array_range #define GL_NV_vertex_array_range 1 #define GL_VERTEX_ARRAY_RANGE_NV 0x851D #define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E #define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F #define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 #define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void *pointer); #define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) #define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) #define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range) #endif /* GL_NV_vertex_array_range */ /* ----------------------- GL_NV_vertex_array_range2 ----------------------- */ #ifndef GL_NV_vertex_array_range2 #define GL_NV_vertex_array_range2 1 #define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 #define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2) #endif /* GL_NV_vertex_array_range2 */ /* ------------------- GL_NV_vertex_attrib_integer_64bit ------------------- */ #ifndef GL_NV_vertex_attrib_integer_64bit #define GL_NV_vertex_attrib_integer_64bit 1 #define GL_INT64_NV 0x140E #define GL_UNSIGNED_INT64_NV 0x140F typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT* params); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); #define glGetVertexAttribLi64vNV GLEW_GET_FUN(__glewGetVertexAttribLi64vNV) #define glGetVertexAttribLui64vNV GLEW_GET_FUN(__glewGetVertexAttribLui64vNV) #define glVertexAttribL1i64NV GLEW_GET_FUN(__glewVertexAttribL1i64NV) #define glVertexAttribL1i64vNV GLEW_GET_FUN(__glewVertexAttribL1i64vNV) #define glVertexAttribL1ui64NV GLEW_GET_FUN(__glewVertexAttribL1ui64NV) #define glVertexAttribL1ui64vNV GLEW_GET_FUN(__glewVertexAttribL1ui64vNV) #define glVertexAttribL2i64NV GLEW_GET_FUN(__glewVertexAttribL2i64NV) #define glVertexAttribL2i64vNV GLEW_GET_FUN(__glewVertexAttribL2i64vNV) #define glVertexAttribL2ui64NV GLEW_GET_FUN(__glewVertexAttribL2ui64NV) #define glVertexAttribL2ui64vNV GLEW_GET_FUN(__glewVertexAttribL2ui64vNV) #define glVertexAttribL3i64NV GLEW_GET_FUN(__glewVertexAttribL3i64NV) #define glVertexAttribL3i64vNV GLEW_GET_FUN(__glewVertexAttribL3i64vNV) #define glVertexAttribL3ui64NV GLEW_GET_FUN(__glewVertexAttribL3ui64NV) #define glVertexAttribL3ui64vNV GLEW_GET_FUN(__glewVertexAttribL3ui64vNV) #define glVertexAttribL4i64NV GLEW_GET_FUN(__glewVertexAttribL4i64NV) #define glVertexAttribL4i64vNV GLEW_GET_FUN(__glewVertexAttribL4i64vNV) #define glVertexAttribL4ui64NV GLEW_GET_FUN(__glewVertexAttribL4ui64NV) #define glVertexAttribL4ui64vNV GLEW_GET_FUN(__glewVertexAttribL4ui64vNV) #define glVertexAttribLFormatNV GLEW_GET_FUN(__glewVertexAttribLFormatNV) #define GLEW_NV_vertex_attrib_integer_64bit GLEW_GET_VAR(__GLEW_NV_vertex_attrib_integer_64bit) #endif /* GL_NV_vertex_attrib_integer_64bit */ /* ------------------- GL_NV_vertex_buffer_unified_memory ------------------ */ #ifndef GL_NV_vertex_buffer_unified_memory #define GL_NV_vertex_buffer_unified_memory 1 #define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E #define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F #define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 #define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 #define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 #define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 #define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 #define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 #define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 #define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 #define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 #define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 #define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A #define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B #define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C #define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D #define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E #define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F #define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 #define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 #define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 #define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 #define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 #define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 #define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 typedef void (GLAPIENTRY * PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); typedef void (GLAPIENTRY * PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); typedef void (GLAPIENTRY * PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT result[]); typedef void (GLAPIENTRY * PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); #define glBufferAddressRangeNV GLEW_GET_FUN(__glewBufferAddressRangeNV) #define glColorFormatNV GLEW_GET_FUN(__glewColorFormatNV) #define glEdgeFlagFormatNV GLEW_GET_FUN(__glewEdgeFlagFormatNV) #define glFogCoordFormatNV GLEW_GET_FUN(__glewFogCoordFormatNV) #define glGetIntegerui64i_vNV GLEW_GET_FUN(__glewGetIntegerui64i_vNV) #define glIndexFormatNV GLEW_GET_FUN(__glewIndexFormatNV) #define glNormalFormatNV GLEW_GET_FUN(__glewNormalFormatNV) #define glSecondaryColorFormatNV GLEW_GET_FUN(__glewSecondaryColorFormatNV) #define glTexCoordFormatNV GLEW_GET_FUN(__glewTexCoordFormatNV) #define glVertexAttribFormatNV GLEW_GET_FUN(__glewVertexAttribFormatNV) #define glVertexAttribIFormatNV GLEW_GET_FUN(__glewVertexAttribIFormatNV) #define glVertexFormatNV GLEW_GET_FUN(__glewVertexFormatNV) #define GLEW_NV_vertex_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_vertex_buffer_unified_memory) #endif /* GL_NV_vertex_buffer_unified_memory */ /* -------------------------- GL_NV_vertex_program ------------------------- */ #ifndef GL_NV_vertex_program #define GL_NV_vertex_program 1 #define GL_VERTEX_PROGRAM_NV 0x8620 #define GL_VERTEX_STATE_PROGRAM_NV 0x8621 #define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 #define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 #define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 #define GL_CURRENT_ATTRIB_NV 0x8626 #define GL_PROGRAM_LENGTH_NV 0x8627 #define GL_PROGRAM_STRING_NV 0x8628 #define GL_MODELVIEW_PROJECTION_NV 0x8629 #define GL_IDENTITY_NV 0x862A #define GL_INVERSE_NV 0x862B #define GL_TRANSPOSE_NV 0x862C #define GL_INVERSE_TRANSPOSE_NV 0x862D #define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E #define GL_MAX_TRACK_MATRICES_NV 0x862F #define GL_MATRIX0_NV 0x8630 #define GL_MATRIX1_NV 0x8631 #define GL_MATRIX2_NV 0x8632 #define GL_MATRIX3_NV 0x8633 #define GL_MATRIX4_NV 0x8634 #define GL_MATRIX5_NV 0x8635 #define GL_MATRIX6_NV 0x8636 #define GL_MATRIX7_NV 0x8637 #define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 #define GL_CURRENT_MATRIX_NV 0x8641 #define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 #define GL_PROGRAM_PARAMETER_NV 0x8644 #define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 #define GL_PROGRAM_TARGET_NV 0x8646 #define GL_PROGRAM_RESIDENT_NV 0x8647 #define GL_TRACK_MATRIX_NV 0x8648 #define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 #define GL_VERTEX_PROGRAM_BINDING_NV 0x864A #define GL_PROGRAM_ERROR_POSITION_NV 0x864B #define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 #define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 #define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 #define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 #define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 #define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 #define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 #define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 #define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 #define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 #define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A #define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B #define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C #define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D #define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E #define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F #define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 #define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 #define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 #define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 #define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 #define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 #define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 #define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 #define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 #define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 #define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A #define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B #define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C #define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D #define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E #define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F #define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 #define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 #define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 #define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 #define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 #define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 #define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 #define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 #define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 #define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 #define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A #define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B #define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C #define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D #define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E #define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences); typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program); typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void** pointer); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v); #define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV) #define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV) #define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV) #define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV) #define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV) #define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV) #define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV) #define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV) #define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV) #define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV) #define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV) #define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV) #define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV) #define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV) #define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV) #define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV) #define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV) #define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV) #define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV) #define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV) #define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV) #define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV) #define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV) #define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV) #define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV) #define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV) #define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV) #define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV) #define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV) #define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV) #define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV) #define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV) #define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV) #define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV) #define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV) #define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV) #define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV) #define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV) #define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV) #define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV) #define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV) #define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV) #define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV) #define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV) #define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV) #define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV) #define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV) #define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV) #define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV) #define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV) #define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV) #define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV) #define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV) #define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV) #define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV) #define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV) #define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV) #define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV) #define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV) #define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV) #define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV) #define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV) #define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV) #define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV) #define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program) #endif /* GL_NV_vertex_program */ /* ------------------------ GL_NV_vertex_program1_1 ------------------------ */ #ifndef GL_NV_vertex_program1_1 #define GL_NV_vertex_program1_1 1 #define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1) #endif /* GL_NV_vertex_program1_1 */ /* ------------------------- GL_NV_vertex_program2 ------------------------- */ #ifndef GL_NV_vertex_program2 #define GL_NV_vertex_program2 1 #define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2) #endif /* GL_NV_vertex_program2 */ /* ---------------------- GL_NV_vertex_program2_option --------------------- */ #ifndef GL_NV_vertex_program2_option #define GL_NV_vertex_program2_option 1 #define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 #define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 #define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option) #endif /* GL_NV_vertex_program2_option */ /* ------------------------- GL_NV_vertex_program3 ------------------------- */ #ifndef GL_NV_vertex_program3 #define GL_NV_vertex_program3 1 #define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C #define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3) #endif /* GL_NV_vertex_program3 */ /* ------------------------- GL_NV_vertex_program4 ------------------------- */ #ifndef GL_NV_vertex_program4 #define GL_NV_vertex_program4 1 #define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD #define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4) #endif /* GL_NV_vertex_program4 */ /* -------------------------- GL_NV_video_capture -------------------------- */ #ifndef GL_NV_video_capture #define GL_NV_video_capture 1 #define GL_VIDEO_BUFFER_NV 0x9020 #define GL_VIDEO_BUFFER_BINDING_NV 0x9021 #define GL_FIELD_UPPER_NV 0x9022 #define GL_FIELD_LOWER_NV 0x9023 #define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 #define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 #define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 #define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 #define GL_VIDEO_BUFFER_PITCH_NV 0x9028 #define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 #define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A #define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B #define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C #define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D #define GL_PARTIAL_SUCCESS_NV 0x902E #define GL_SUCCESS_NV 0x902F #define GL_FAILURE_NV 0x9030 #define GL_YCBYCR8_422_NV 0x9031 #define GL_YCBAYCR8A_4224_NV 0x9032 #define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 #define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 #define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 #define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 #define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 #define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 #define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 #define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A #define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B #define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C typedef void (GLAPIENTRY * PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); typedef void (GLAPIENTRY * PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint* params); typedef GLenum (GLAPIENTRY * PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint* sequence_num, GLuint64EXT *capture_time); typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint* params); #define glBeginVideoCaptureNV GLEW_GET_FUN(__glewBeginVideoCaptureNV) #define glBindVideoCaptureStreamBufferNV GLEW_GET_FUN(__glewBindVideoCaptureStreamBufferNV) #define glBindVideoCaptureStreamTextureNV GLEW_GET_FUN(__glewBindVideoCaptureStreamTextureNV) #define glEndVideoCaptureNV GLEW_GET_FUN(__glewEndVideoCaptureNV) #define glGetVideoCaptureStreamdvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamdvNV) #define glGetVideoCaptureStreamfvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamfvNV) #define glGetVideoCaptureStreamivNV GLEW_GET_FUN(__glewGetVideoCaptureStreamivNV) #define glGetVideoCaptureivNV GLEW_GET_FUN(__glewGetVideoCaptureivNV) #define glVideoCaptureNV GLEW_GET_FUN(__glewVideoCaptureNV) #define glVideoCaptureStreamParameterdvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterdvNV) #define glVideoCaptureStreamParameterfvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterfvNV) #define glVideoCaptureStreamParameterivNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterivNV) #define GLEW_NV_video_capture GLEW_GET_VAR(__GLEW_NV_video_capture) #endif /* GL_NV_video_capture */ /* -------------------------- GL_NV_viewport_array ------------------------- */ #ifndef GL_NV_viewport_array #define GL_NV_viewport_array 1 #define GL_DEPTH_RANGE 0x0B70 #define GL_VIEWPORT 0x0BA2 #define GL_SCISSOR_BOX 0x0C10 #define GL_SCISSOR_TEST 0x0C11 #define GL_MAX_VIEWPORTS_NV 0x825B #define GL_VIEWPORT_SUBPIXEL_BITS_NV 0x825C #define GL_VIEWPORT_BOUNDS_RANGE_NV 0x825D #define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV 0x825F typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYFVNVPROC) (GLuint first, GLsizei count, const GLfloat * v); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDFNVPROC) (GLuint index, GLfloat n, GLfloat f); typedef void (GLAPIENTRY * PFNGLDISABLEINVPROC) (GLenum target, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEINVPROC) (GLenum target, GLuint index); typedef void (GLAPIENTRY * PFNGLGETFLOATI_VNVPROC) (GLenum target, GLuint index, GLfloat* data); typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINVPROC) (GLenum target, GLuint index); typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVNVPROC) (GLuint first, GLsizei count, const GLint * v); typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDNVPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVNVPROC) (GLuint index, const GLint * v); typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVNVPROC) (GLuint first, GLsizei count, const GLfloat * v); typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVNVPROC) (GLuint index, const GLfloat * v); #define glDepthRangeArrayfvNV GLEW_GET_FUN(__glewDepthRangeArrayfvNV) #define glDepthRangeIndexedfNV GLEW_GET_FUN(__glewDepthRangeIndexedfNV) #define glDisableiNV GLEW_GET_FUN(__glewDisableiNV) #define glEnableiNV GLEW_GET_FUN(__glewEnableiNV) #define glGetFloati_vNV GLEW_GET_FUN(__glewGetFloati_vNV) #define glIsEnablediNV GLEW_GET_FUN(__glewIsEnablediNV) #define glScissorArrayvNV GLEW_GET_FUN(__glewScissorArrayvNV) #define glScissorIndexedNV GLEW_GET_FUN(__glewScissorIndexedNV) #define glScissorIndexedvNV GLEW_GET_FUN(__glewScissorIndexedvNV) #define glViewportArrayvNV GLEW_GET_FUN(__glewViewportArrayvNV) #define glViewportIndexedfNV GLEW_GET_FUN(__glewViewportIndexedfNV) #define glViewportIndexedfvNV GLEW_GET_FUN(__glewViewportIndexedfvNV) #define GLEW_NV_viewport_array GLEW_GET_VAR(__GLEW_NV_viewport_array) #endif /* GL_NV_viewport_array */ /* ------------------------- GL_NV_viewport_array2 ------------------------- */ #ifndef GL_NV_viewport_array2 #define GL_NV_viewport_array2 1 #define GLEW_NV_viewport_array2 GLEW_GET_VAR(__GLEW_NV_viewport_array2) #endif /* GL_NV_viewport_array2 */ /* ------------------------- GL_NV_viewport_swizzle ------------------------ */ #ifndef GL_NV_viewport_swizzle #define GL_NV_viewport_swizzle 1 #define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350 #define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351 #define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352 #define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353 #define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354 #define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355 #define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356 #define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357 #define GL_VIEWPORT_SWIZZLE_X_NV 0x9358 #define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359 #define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A #define GL_VIEWPORT_SWIZZLE_W_NV 0x935B typedef void (GLAPIENTRY * PFNGLVIEWPORTSWIZZLENVPROC) (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); #define glViewportSwizzleNV GLEW_GET_FUN(__glewViewportSwizzleNV) #define GLEW_NV_viewport_swizzle GLEW_GET_VAR(__GLEW_NV_viewport_swizzle) #endif /* GL_NV_viewport_swizzle */ /* ------------------------ GL_OES_byte_coordinates ------------------------ */ #ifndef GL_OES_byte_coordinates #define GL_OES_byte_coordinates 1 #define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) #endif /* GL_OES_byte_coordinates */ /* ---------------------------- GL_OML_interlace --------------------------- */ #ifndef GL_OML_interlace #define GL_OML_interlace 1 #define GL_INTERLACE_OML 0x8980 #define GL_INTERLACE_READ_OML 0x8981 #define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace) #endif /* GL_OML_interlace */ /* ---------------------------- GL_OML_resample ---------------------------- */ #ifndef GL_OML_resample #define GL_OML_resample 1 #define GL_PACK_RESAMPLE_OML 0x8984 #define GL_UNPACK_RESAMPLE_OML 0x8985 #define GL_RESAMPLE_REPLICATE_OML 0x8986 #define GL_RESAMPLE_ZERO_FILL_OML 0x8987 #define GL_RESAMPLE_AVERAGE_OML 0x8988 #define GL_RESAMPLE_DECIMATE_OML 0x8989 #define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample) #endif /* GL_OML_resample */ /* ---------------------------- GL_OML_subsample --------------------------- */ #ifndef GL_OML_subsample #define GL_OML_subsample 1 #define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 #define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 #define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample) #endif /* GL_OML_subsample */ /* ---------------------------- GL_OVR_multiview --------------------------- */ #ifndef GL_OVR_multiview #define GL_OVR_multiview 1 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 #define GL_MAX_VIEWS_OVR 0x9631 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 #define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); #define glFramebufferTextureMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultiviewOVR) #define GLEW_OVR_multiview GLEW_GET_VAR(__GLEW_OVR_multiview) #endif /* GL_OVR_multiview */ /* --------------------------- GL_OVR_multiview2 --------------------------- */ #ifndef GL_OVR_multiview2 #define GL_OVR_multiview2 1 #define GLEW_OVR_multiview2 GLEW_GET_VAR(__GLEW_OVR_multiview2) #endif /* GL_OVR_multiview2 */ /* ------------ GL_OVR_multiview_multisampled_render_to_texture ------------ */ #ifndef GL_OVR_multiview_multisampled_render_to_texture #define GL_OVR_multiview_multisampled_render_to_texture 1 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); #define glFramebufferTextureMultisampleMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultisampleMultiviewOVR) #define GLEW_OVR_multiview_multisampled_render_to_texture GLEW_GET_VAR(__GLEW_OVR_multiview_multisampled_render_to_texture) #endif /* GL_OVR_multiview_multisampled_render_to_texture */ /* --------------------------- GL_PGI_misc_hints --------------------------- */ #ifndef GL_PGI_misc_hints #define GL_PGI_misc_hints 1 #define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000 #define GL_CONSERVE_MEMORY_HINT_PGI 107005 #define GL_RECLAIM_MEMORY_HINT_PGI 107006 #define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010 #define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011 #define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012 #define GL_ALWAYS_FAST_HINT_PGI 107020 #define GL_ALWAYS_SOFT_HINT_PGI 107021 #define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022 #define GL_ALLOW_DRAW_WIN_HINT_PGI 107023 #define GL_ALLOW_DRAW_FRG_HINT_PGI 107024 #define GL_ALLOW_DRAW_MEM_HINT_PGI 107025 #define GL_STRICT_DEPTHFUNC_HINT_PGI 107030 #define GL_STRICT_LIGHTING_HINT_PGI 107031 #define GL_STRICT_SCISSOR_HINT_PGI 107032 #define GL_FULL_STIPPLE_HINT_PGI 107033 #define GL_CLIP_NEAR_HINT_PGI 107040 #define GL_CLIP_FAR_HINT_PGI 107041 #define GL_WIDE_LINE_HINT_PGI 107042 #define GL_BACK_NORMALS_HINT_PGI 107043 #define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints) #endif /* GL_PGI_misc_hints */ /* -------------------------- GL_PGI_vertex_hints -------------------------- */ #ifndef GL_PGI_vertex_hints #define GL_PGI_vertex_hints 1 #define GL_VERTEX23_BIT_PGI 0x00000004 #define GL_VERTEX4_BIT_PGI 0x00000008 #define GL_COLOR3_BIT_PGI 0x00010000 #define GL_COLOR4_BIT_PGI 0x00020000 #define GL_EDGEFLAG_BIT_PGI 0x00040000 #define GL_INDEX_BIT_PGI 0x00080000 #define GL_MAT_AMBIENT_BIT_PGI 0x00100000 #define GL_VERTEX_DATA_HINT_PGI 107050 #define GL_VERTEX_CONSISTENT_HINT_PGI 107051 #define GL_MATERIAL_SIDE_HINT_PGI 107052 #define GL_MAX_VERTEX_HINT_PGI 107053 #define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 #define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 #define GL_MAT_EMISSION_BIT_PGI 0x00800000 #define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 #define GL_MAT_SHININESS_BIT_PGI 0x02000000 #define GL_MAT_SPECULAR_BIT_PGI 0x04000000 #define GL_NORMAL_BIT_PGI 0x08000000 #define GL_TEXCOORD1_BIT_PGI 0x10000000 #define GL_TEXCOORD2_BIT_PGI 0x20000000 #define GL_TEXCOORD3_BIT_PGI 0x40000000 #define GL_TEXCOORD4_BIT_PGI 0x80000000 #define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints) #endif /* GL_PGI_vertex_hints */ /* --------------------------- GL_QCOM_alpha_test -------------------------- */ #ifndef GL_QCOM_alpha_test #define GL_QCOM_alpha_test 1 #define GL_ALPHA_TEST_QCOM 0x0BC0 #define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 #define GL_ALPHA_TEST_REF_QCOM 0x0BC2 typedef void (GLAPIENTRY * PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref); #define glAlphaFuncQCOM GLEW_GET_FUN(__glewAlphaFuncQCOM) #define GLEW_QCOM_alpha_test GLEW_GET_VAR(__GLEW_QCOM_alpha_test) #endif /* GL_QCOM_alpha_test */ /* ------------------------ GL_QCOM_binning_control ------------------------ */ #ifndef GL_QCOM_binning_control #define GL_QCOM_binning_control 1 #define GL_DONT_CARE 0x1100 #define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 #define GL_CPU_OPTIMIZED_QCOM 0x8FB1 #define GL_GPU_OPTIMIZED_QCOM 0x8FB2 #define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 #define GLEW_QCOM_binning_control GLEW_GET_VAR(__GLEW_QCOM_binning_control) #endif /* GL_QCOM_binning_control */ /* ------------------------- GL_QCOM_driver_control ------------------------ */ #ifndef GL_QCOM_driver_control #define GL_QCOM_driver_control 1 typedef void (GLAPIENTRY * PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); typedef void (GLAPIENTRY * PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); typedef void (GLAPIENTRY * PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei* length, GLchar *driverControlString); typedef void (GLAPIENTRY * PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint* num, GLsizei size, GLuint *driverControls); #define glDisableDriverControlQCOM GLEW_GET_FUN(__glewDisableDriverControlQCOM) #define glEnableDriverControlQCOM GLEW_GET_FUN(__glewEnableDriverControlQCOM) #define glGetDriverControlStringQCOM GLEW_GET_FUN(__glewGetDriverControlStringQCOM) #define glGetDriverControlsQCOM GLEW_GET_FUN(__glewGetDriverControlsQCOM) #define GLEW_QCOM_driver_control GLEW_GET_VAR(__GLEW_QCOM_driver_control) #endif /* GL_QCOM_driver_control */ /* -------------------------- GL_QCOM_extended_get ------------------------- */ #ifndef GL_QCOM_extended_get #define GL_QCOM_extended_get 1 #define GL_TEXTURE_WIDTH_QCOM 0x8BD2 #define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 #define GL_TEXTURE_DEPTH_QCOM 0x8BD4 #define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 #define GL_TEXTURE_FORMAT_QCOM 0x8BD6 #define GL_TEXTURE_TYPE_QCOM 0x8BD7 #define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 #define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 #define GL_TEXTURE_TARGET_QCOM 0x8BDA #define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB #define GL_STATE_RESTORE 0x8BDC typedef void (GLAPIENTRY * PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void** params); typedef void (GLAPIENTRY * PFNGLEXTGETBUFFERSQCOMPROC) (GLuint* buffers, GLint maxBuffers, GLint* numBuffers); typedef void (GLAPIENTRY * PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers); typedef void (GLAPIENTRY * PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers); typedef void (GLAPIENTRY * PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); typedef void (GLAPIENTRY * PFNGLEXTGETTEXTURESQCOMPROC) (GLuint* textures, GLint maxTextures, GLint* numTextures); typedef void (GLAPIENTRY * PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); #define glExtGetBufferPointervQCOM GLEW_GET_FUN(__glewExtGetBufferPointervQCOM) #define glExtGetBuffersQCOM GLEW_GET_FUN(__glewExtGetBuffersQCOM) #define glExtGetFramebuffersQCOM GLEW_GET_FUN(__glewExtGetFramebuffersQCOM) #define glExtGetRenderbuffersQCOM GLEW_GET_FUN(__glewExtGetRenderbuffersQCOM) #define glExtGetTexLevelParameterivQCOM GLEW_GET_FUN(__glewExtGetTexLevelParameterivQCOM) #define glExtGetTexSubImageQCOM GLEW_GET_FUN(__glewExtGetTexSubImageQCOM) #define glExtGetTexturesQCOM GLEW_GET_FUN(__glewExtGetTexturesQCOM) #define glExtTexObjectStateOverrideiQCOM GLEW_GET_FUN(__glewExtTexObjectStateOverrideiQCOM) #define GLEW_QCOM_extended_get GLEW_GET_VAR(__GLEW_QCOM_extended_get) #endif /* GL_QCOM_extended_get */ /* ------------------------- GL_QCOM_extended_get2 ------------------------- */ #ifndef GL_QCOM_extended_get2 #define GL_QCOM_extended_get2 1 typedef void (GLAPIENTRY * PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar* source, GLint* length); typedef void (GLAPIENTRY * PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint* programs, GLint maxPrograms, GLint* numPrograms); typedef void (GLAPIENTRY * PFNGLEXTGETSHADERSQCOMPROC) (GLuint* shaders, GLint maxShaders, GLint* numShaders); typedef GLboolean (GLAPIENTRY * PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); #define glExtGetProgramBinarySourceQCOM GLEW_GET_FUN(__glewExtGetProgramBinarySourceQCOM) #define glExtGetProgramsQCOM GLEW_GET_FUN(__glewExtGetProgramsQCOM) #define glExtGetShadersQCOM GLEW_GET_FUN(__glewExtGetShadersQCOM) #define glExtIsProgramBinaryQCOM GLEW_GET_FUN(__glewExtIsProgramBinaryQCOM) #define GLEW_QCOM_extended_get2 GLEW_GET_VAR(__GLEW_QCOM_extended_get2) #endif /* GL_QCOM_extended_get2 */ /* ---------------------- GL_QCOM_framebuffer_foveated --------------------- */ #ifndef GL_QCOM_framebuffer_foveated #define GL_QCOM_framebuffer_foveated 1 #define GL_FOVEATION_ENABLE_BIT_QCOM 0x1 #define GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM 0x2 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC) (GLuint fbo, GLuint numLayers, GLuint focalPointsPerLayer, GLuint requestedFeatures, GLuint* providedFeatures); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC) (GLuint fbo, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); #define glFramebufferFoveationConfigQCOM GLEW_GET_FUN(__glewFramebufferFoveationConfigQCOM) #define glFramebufferFoveationParametersQCOM GLEW_GET_FUN(__glewFramebufferFoveationParametersQCOM) #define GLEW_QCOM_framebuffer_foveated GLEW_GET_VAR(__GLEW_QCOM_framebuffer_foveated) #endif /* GL_QCOM_framebuffer_foveated */ /* ---------------------- GL_QCOM_perfmon_global_mode ---------------------- */ #ifndef GL_QCOM_perfmon_global_mode #define GL_QCOM_perfmon_global_mode 1 #define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 #define GLEW_QCOM_perfmon_global_mode GLEW_GET_VAR(__GLEW_QCOM_perfmon_global_mode) #endif /* GL_QCOM_perfmon_global_mode */ /* -------------- GL_QCOM_shader_framebuffer_fetch_noncoherent ------------- */ #ifndef GL_QCOM_shader_framebuffer_fetch_noncoherent #define GL_QCOM_shader_framebuffer_fetch_noncoherent 1 #define GL_FRAMEBUFFER_FETCH_NONCOHERENT_QCOM 0x96A2 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC) (void); #define glFramebufferFetchBarrierQCOM GLEW_GET_FUN(__glewFramebufferFetchBarrierQCOM) #define GLEW_QCOM_shader_framebuffer_fetch_noncoherent GLEW_GET_VAR(__GLEW_QCOM_shader_framebuffer_fetch_noncoherent) #endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ /* ------------------------ GL_QCOM_tiled_rendering ------------------------ */ #ifndef GL_QCOM_tiled_rendering #define GL_QCOM_tiled_rendering 1 #define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 #define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 #define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 #define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 #define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 #define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 #define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 #define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 #define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 #define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 #define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 #define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 #define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 #define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 #define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 #define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 #define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 #define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 #define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 #define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 #define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 #define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 #define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 #define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 #define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 #define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 #define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 #define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 #define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 #define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 #define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 #define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 typedef void (GLAPIENTRY * PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); typedef void (GLAPIENTRY * PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); #define glEndTilingQCOM GLEW_GET_FUN(__glewEndTilingQCOM) #define glStartTilingQCOM GLEW_GET_FUN(__glewStartTilingQCOM) #define GLEW_QCOM_tiled_rendering GLEW_GET_VAR(__GLEW_QCOM_tiled_rendering) #endif /* GL_QCOM_tiled_rendering */ /* ---------------------- GL_QCOM_writeonly_rendering ---------------------- */ #ifndef GL_QCOM_writeonly_rendering #define GL_QCOM_writeonly_rendering 1 #define GL_WRITEONLY_RENDERING_QCOM 0x8823 #define GLEW_QCOM_writeonly_rendering GLEW_GET_VAR(__GLEW_QCOM_writeonly_rendering) #endif /* GL_QCOM_writeonly_rendering */ /* ---------------------- GL_REGAL_ES1_0_compatibility --------------------- */ #ifndef GL_REGAL_ES1_0_compatibility #define GL_REGAL_ES1_0_compatibility 1 typedef int GLclampx; typedef void (GLAPIENTRY * PFNGLALPHAFUNCXPROC) (GLenum func, GLclampx ref); typedef void (GLAPIENTRY * PFNGLCLEARCOLORXPROC) (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); typedef void (GLAPIENTRY * PFNGLCLEARDEPTHXPROC) (GLclampx depth); typedef void (GLAPIENTRY * PFNGLCOLOR4XPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEXPROC) (GLclampx zNear, GLclampx zFar); typedef void (GLAPIENTRY * PFNGLFOGXPROC) (GLenum pname, GLfixed param); typedef void (GLAPIENTRY * PFNGLFOGXVPROC) (GLenum pname, const GLfixed* params); typedef void (GLAPIENTRY * PFNGLFRUSTUMFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); typedef void (GLAPIENTRY * PFNGLFRUSTUMXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); typedef void (GLAPIENTRY * PFNGLLIGHTMODELXPROC) (GLenum pname, GLfixed param); typedef void (GLAPIENTRY * PFNGLLIGHTMODELXVPROC) (GLenum pname, const GLfixed* params); typedef void (GLAPIENTRY * PFNGLLIGHTXPROC) (GLenum light, GLenum pname, GLfixed param); typedef void (GLAPIENTRY * PFNGLLIGHTXVPROC) (GLenum light, GLenum pname, const GLfixed* params); typedef void (GLAPIENTRY * PFNGLLINEWIDTHXPROC) (GLfixed width); typedef void (GLAPIENTRY * PFNGLLOADMATRIXXPROC) (const GLfixed* m); typedef void (GLAPIENTRY * PFNGLMATERIALXPROC) (GLenum face, GLenum pname, GLfixed param); typedef void (GLAPIENTRY * PFNGLMATERIALXVPROC) (GLenum face, GLenum pname, const GLfixed* params); typedef void (GLAPIENTRY * PFNGLMULTMATRIXXPROC) (const GLfixed* m); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4XPROC) (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); typedef void (GLAPIENTRY * PFNGLNORMAL3XPROC) (GLfixed nx, GLfixed ny, GLfixed nz); typedef void (GLAPIENTRY * PFNGLORTHOFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); typedef void (GLAPIENTRY * PFNGLORTHOXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); typedef void (GLAPIENTRY * PFNGLPOINTSIZEXPROC) (GLfixed size); typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETXPROC) (GLfixed factor, GLfixed units); typedef void (GLAPIENTRY * PFNGLROTATEXPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEXPROC) (GLclampx value, GLboolean invert); typedef void (GLAPIENTRY * PFNGLSCALEXPROC) (GLfixed x, GLfixed y, GLfixed z); typedef void (GLAPIENTRY * PFNGLTEXENVXPROC) (GLenum target, GLenum pname, GLfixed param); typedef void (GLAPIENTRY * PFNGLTEXENVXVPROC) (GLenum target, GLenum pname, const GLfixed* params); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXPROC) (GLenum target, GLenum pname, GLfixed param); typedef void (GLAPIENTRY * PFNGLTRANSLATEXPROC) (GLfixed x, GLfixed y, GLfixed z); #define glAlphaFuncx GLEW_GET_FUN(__glewAlphaFuncx) #define glClearColorx GLEW_GET_FUN(__glewClearColorx) #define glClearDepthx GLEW_GET_FUN(__glewClearDepthx) #define glColor4x GLEW_GET_FUN(__glewColor4x) #define glDepthRangex GLEW_GET_FUN(__glewDepthRangex) #define glFogx GLEW_GET_FUN(__glewFogx) #define glFogxv GLEW_GET_FUN(__glewFogxv) #define glFrustumf GLEW_GET_FUN(__glewFrustumf) #define glFrustumx GLEW_GET_FUN(__glewFrustumx) #define glLightModelx GLEW_GET_FUN(__glewLightModelx) #define glLightModelxv GLEW_GET_FUN(__glewLightModelxv) #define glLightx GLEW_GET_FUN(__glewLightx) #define glLightxv GLEW_GET_FUN(__glewLightxv) #define glLineWidthx GLEW_GET_FUN(__glewLineWidthx) #define glLoadMatrixx GLEW_GET_FUN(__glewLoadMatrixx) #define glMaterialx GLEW_GET_FUN(__glewMaterialx) #define glMaterialxv GLEW_GET_FUN(__glewMaterialxv) #define glMultMatrixx GLEW_GET_FUN(__glewMultMatrixx) #define glMultiTexCoord4x GLEW_GET_FUN(__glewMultiTexCoord4x) #define glNormal3x GLEW_GET_FUN(__glewNormal3x) #define glOrthof GLEW_GET_FUN(__glewOrthof) #define glOrthox GLEW_GET_FUN(__glewOrthox) #define glPointSizex GLEW_GET_FUN(__glewPointSizex) #define glPolygonOffsetx GLEW_GET_FUN(__glewPolygonOffsetx) #define glRotatex GLEW_GET_FUN(__glewRotatex) #define glSampleCoveragex GLEW_GET_FUN(__glewSampleCoveragex) #define glScalex GLEW_GET_FUN(__glewScalex) #define glTexEnvx GLEW_GET_FUN(__glewTexEnvx) #define glTexEnvxv GLEW_GET_FUN(__glewTexEnvxv) #define glTexParameterx GLEW_GET_FUN(__glewTexParameterx) #define glTranslatex GLEW_GET_FUN(__glewTranslatex) #define GLEW_REGAL_ES1_0_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_0_compatibility) #endif /* GL_REGAL_ES1_0_compatibility */ /* ---------------------- GL_REGAL_ES1_1_compatibility --------------------- */ #ifndef GL_REGAL_ES1_1_compatibility #define GL_REGAL_ES1_1_compatibility 1 typedef void (GLAPIENTRY * PFNGLCLIPPLANEFPROC) (GLenum plane, const GLfloat* equation); typedef void (GLAPIENTRY * PFNGLCLIPPLANEXPROC) (GLenum plane, const GLfixed* equation); typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFPROC) (GLenum pname, GLfloat eqn[4]); typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEXPROC) (GLenum pname, GLfixed eqn[4]); typedef void (GLAPIENTRY * PFNGLGETFIXEDVPROC) (GLenum pname, GLfixed* params); typedef void (GLAPIENTRY * PFNGLGETLIGHTXVPROC) (GLenum light, GLenum pname, GLfixed* params); typedef void (GLAPIENTRY * PFNGLGETMATERIALXVPROC) (GLenum face, GLenum pname, GLfixed* params); typedef void (GLAPIENTRY * PFNGLGETTEXENVXVPROC) (GLenum env, GLenum pname, GLfixed* params); typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERXVPROC) (GLenum target, GLenum pname, GLfixed* params); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXPROC) (GLenum pname, GLfixed param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXVPROC) (GLenum pname, const GLfixed* params); typedef void (GLAPIENTRY * PFNGLPOINTSIZEPOINTEROESPROC) (GLenum type, GLsizei stride, const void *pointer); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXVPROC) (GLenum target, GLenum pname, const GLfixed* params); #define glClipPlanef GLEW_GET_FUN(__glewClipPlanef) #define glClipPlanex GLEW_GET_FUN(__glewClipPlanex) #define glGetClipPlanef GLEW_GET_FUN(__glewGetClipPlanef) #define glGetClipPlanex GLEW_GET_FUN(__glewGetClipPlanex) #define glGetFixedv GLEW_GET_FUN(__glewGetFixedv) #define glGetLightxv GLEW_GET_FUN(__glewGetLightxv) #define glGetMaterialxv GLEW_GET_FUN(__glewGetMaterialxv) #define glGetTexEnvxv GLEW_GET_FUN(__glewGetTexEnvxv) #define glGetTexParameterxv GLEW_GET_FUN(__glewGetTexParameterxv) #define glPointParameterx GLEW_GET_FUN(__glewPointParameterx) #define glPointParameterxv GLEW_GET_FUN(__glewPointParameterxv) #define glPointSizePointerOES GLEW_GET_FUN(__glewPointSizePointerOES) #define glTexParameterxv GLEW_GET_FUN(__glewTexParameterxv) #define GLEW_REGAL_ES1_1_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_1_compatibility) #endif /* GL_REGAL_ES1_1_compatibility */ /* ---------------------------- GL_REGAL_enable ---------------------------- */ #ifndef GL_REGAL_enable #define GL_REGAL_enable 1 #define GL_ERROR_REGAL 0x9322 #define GL_DEBUG_REGAL 0x9323 #define GL_LOG_REGAL 0x9324 #define GL_EMULATION_REGAL 0x9325 #define GL_DRIVER_REGAL 0x9326 #define GL_MISSING_REGAL 0x9360 #define GL_TRACE_REGAL 0x9361 #define GL_CACHE_REGAL 0x9362 #define GL_CODE_REGAL 0x9363 #define GL_STATISTICS_REGAL 0x9364 #define GLEW_REGAL_enable GLEW_GET_VAR(__GLEW_REGAL_enable) #endif /* GL_REGAL_enable */ /* ------------------------- GL_REGAL_error_string ------------------------- */ #ifndef GL_REGAL_error_string #define GL_REGAL_error_string 1 typedef const GLchar* (GLAPIENTRY * PFNGLERRORSTRINGREGALPROC) (GLenum error); #define glErrorStringREGAL GLEW_GET_FUN(__glewErrorStringREGAL) #define GLEW_REGAL_error_string GLEW_GET_VAR(__GLEW_REGAL_error_string) #endif /* GL_REGAL_error_string */ /* ------------------------ GL_REGAL_extension_query ----------------------- */ #ifndef GL_REGAL_extension_query #define GL_REGAL_extension_query 1 typedef GLboolean (GLAPIENTRY * PFNGLGETEXTENSIONREGALPROC) (const GLchar* ext); typedef GLboolean (GLAPIENTRY * PFNGLISSUPPORTEDREGALPROC) (const GLchar* ext); #define glGetExtensionREGAL GLEW_GET_FUN(__glewGetExtensionREGAL) #define glIsSupportedREGAL GLEW_GET_FUN(__glewIsSupportedREGAL) #define GLEW_REGAL_extension_query GLEW_GET_VAR(__GLEW_REGAL_extension_query) #endif /* GL_REGAL_extension_query */ /* ------------------------------ GL_REGAL_log ----------------------------- */ #ifndef GL_REGAL_log #define GL_REGAL_log 1 #define GL_LOG_ERROR_REGAL 0x9319 #define GL_LOG_WARNING_REGAL 0x931A #define GL_LOG_INFO_REGAL 0x931B #define GL_LOG_APP_REGAL 0x931C #define GL_LOG_DRIVER_REGAL 0x931D #define GL_LOG_INTERNAL_REGAL 0x931E #define GL_LOG_DEBUG_REGAL 0x931F #define GL_LOG_STATUS_REGAL 0x9320 #define GL_LOG_HTTP_REGAL 0x9321 typedef void (APIENTRY *GLLOGPROCREGAL)(GLenum stream, GLsizei length, const GLchar *message, void *context); typedef void (GLAPIENTRY * PFNGLLOGMESSAGECALLBACKREGALPROC) (GLLOGPROCREGAL callback); #define glLogMessageCallbackREGAL GLEW_GET_FUN(__glewLogMessageCallbackREGAL) #define GLEW_REGAL_log GLEW_GET_VAR(__GLEW_REGAL_log) #endif /* GL_REGAL_log */ /* ------------------------- GL_REGAL_proc_address ------------------------- */ #ifndef GL_REGAL_proc_address #define GL_REGAL_proc_address 1 typedef void * (GLAPIENTRY * PFNGLGETPROCADDRESSREGALPROC) (const GLchar *name); #define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) #define GLEW_REGAL_proc_address GLEW_GET_VAR(__GLEW_REGAL_proc_address) #endif /* GL_REGAL_proc_address */ /* ----------------------- GL_REND_screen_coordinates ---------------------- */ #ifndef GL_REND_screen_coordinates #define GL_REND_screen_coordinates 1 #define GL_SCREEN_COORDINATES_REND 0x8490 #define GL_INVERTED_SCREEN_W_REND 0x8491 #define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates) #endif /* GL_REND_screen_coordinates */ /* ------------------------------- GL_S3_s3tc ------------------------------ */ #ifndef GL_S3_s3tc #define GL_S3_s3tc 1 #define GL_RGB_S3TC 0x83A0 #define GL_RGB4_S3TC 0x83A1 #define GL_RGBA_S3TC 0x83A2 #define GL_RGBA4_S3TC 0x83A3 #define GL_RGBA_DXT5_S3TC 0x83A4 #define GL_RGBA4_DXT5_S3TC 0x83A5 #define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc) #endif /* GL_S3_s3tc */ /* ------------------------- GL_SGIS_clip_band_hint ------------------------ */ #ifndef GL_SGIS_clip_band_hint #define GL_SGIS_clip_band_hint 1 #define GLEW_SGIS_clip_band_hint GLEW_GET_VAR(__GLEW_SGIS_clip_band_hint) #endif /* GL_SGIS_clip_band_hint */ /* -------------------------- GL_SGIS_color_range -------------------------- */ #ifndef GL_SGIS_color_range #define GL_SGIS_color_range 1 #define GL_EXTENDED_RANGE_SGIS 0x85A5 #define GL_MIN_RED_SGIS 0x85A6 #define GL_MAX_RED_SGIS 0x85A7 #define GL_MIN_GREEN_SGIS 0x85A8 #define GL_MAX_GREEN_SGIS 0x85A9 #define GL_MIN_BLUE_SGIS 0x85AA #define GL_MAX_BLUE_SGIS 0x85AB #define GL_MIN_ALPHA_SGIS 0x85AC #define GL_MAX_ALPHA_SGIS 0x85AD #define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range) #endif /* GL_SGIS_color_range */ /* ------------------------- GL_SGIS_detail_texture ------------------------ */ #ifndef GL_SGIS_detail_texture #define GL_SGIS_detail_texture 1 typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points); #define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS) #define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS) #define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture) #endif /* GL_SGIS_detail_texture */ /* -------------------------- GL_SGIS_fog_function ------------------------- */ #ifndef GL_SGIS_fog_function #define GL_SGIS_fog_function 1 typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points); typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points); #define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS) #define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS) #define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function) #endif /* GL_SGIS_fog_function */ /* ------------------------ GL_SGIS_generate_mipmap ------------------------ */ #ifndef GL_SGIS_generate_mipmap #define GL_SGIS_generate_mipmap 1 #define GL_GENERATE_MIPMAP_SGIS 0x8191 #define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 #define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap) #endif /* GL_SGIS_generate_mipmap */ /* -------------------------- GL_SGIS_line_texgen -------------------------- */ #ifndef GL_SGIS_line_texgen #define GL_SGIS_line_texgen 1 #define GLEW_SGIS_line_texgen GLEW_GET_VAR(__GLEW_SGIS_line_texgen) #endif /* GL_SGIS_line_texgen */ /* -------------------------- GL_SGIS_multisample -------------------------- */ #ifndef GL_SGIS_multisample #define GL_SGIS_multisample 1 #define GL_MULTISAMPLE_SGIS 0x809D #define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F #define GL_SAMPLE_MASK_SGIS 0x80A0 #define GL_1PASS_SGIS 0x80A1 #define GL_2PASS_0_SGIS 0x80A2 #define GL_2PASS_1_SGIS 0x80A3 #define GL_4PASS_0_SGIS 0x80A4 #define GL_4PASS_1_SGIS 0x80A5 #define GL_4PASS_2_SGIS 0x80A6 #define GL_4PASS_3_SGIS 0x80A7 #define GL_SAMPLE_BUFFERS_SGIS 0x80A8 #define GL_SAMPLES_SGIS 0x80A9 #define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA #define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB #define GL_SAMPLE_PATTERN_SGIS 0x80AC typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); #define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS) #define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS) #define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample) #endif /* GL_SGIS_multisample */ /* -------------------------- GL_SGIS_multitexture ------------------------- */ #ifndef GL_SGIS_multitexture #define GL_SGIS_multitexture 1 #define GL_SELECTED_TEXTURE_SGIS 0x83C0 #define GL_SELECTED_TEXTURE_COORD_SET_SGIS 0x83C1 #define GL_SELECTED_TEXTURE_TRANSFORM_SGIS 0x83C2 #define GL_MAX_TEXTURES_SGIS 0x83C3 #define GL_MAX_TEXTURE_COORD_SETS_SGIS 0x83C4 #define GL_TEXTURE_COORD_SET_INTERLEAVE_FACTOR_SGIS 0x83C5 #define GL_TEXTURE_ENV_COORD_SET_SGIS 0x83C6 #define GL_TEXTURE0_SGIS 0x83C7 #define GL_TEXTURE1_SGIS 0x83C8 #define GL_TEXTURE2_SGIS 0x83C9 #define GL_TEXTURE3_SGIS 0x83CA typedef void (GLAPIENTRY * PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC) (GLint factor); typedef void (GLAPIENTRY * PFNGLSELECTTEXTURECOORDSETSGISPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLSELECTTEXTURESGISPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLSELECTTEXTURETRANSFORMSGISPROC) (GLenum target); #define glInterleavedTextureCoordSetsSGIS GLEW_GET_FUN(__glewInterleavedTextureCoordSetsSGIS) #define glSelectTextureCoordSetSGIS GLEW_GET_FUN(__glewSelectTextureCoordSetSGIS) #define glSelectTextureSGIS GLEW_GET_FUN(__glewSelectTextureSGIS) #define glSelectTextureTransformSGIS GLEW_GET_FUN(__glewSelectTextureTransformSGIS) #define GLEW_SGIS_multitexture GLEW_GET_VAR(__GLEW_SGIS_multitexture) #endif /* GL_SGIS_multitexture */ /* ------------------------- GL_SGIS_pixel_texture ------------------------- */ #ifndef GL_SGIS_pixel_texture #define GL_SGIS_pixel_texture 1 #define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture) #endif /* GL_SGIS_pixel_texture */ /* ----------------------- GL_SGIS_point_line_texgen ----------------------- */ #ifndef GL_SGIS_point_line_texgen #define GL_SGIS_point_line_texgen 1 #define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 #define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 #define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 #define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 #define GL_EYE_POINT_SGIS 0x81F4 #define GL_OBJECT_POINT_SGIS 0x81F5 #define GL_EYE_LINE_SGIS 0x81F6 #define GL_OBJECT_LINE_SGIS 0x81F7 #define GLEW_SGIS_point_line_texgen GLEW_GET_VAR(__GLEW_SGIS_point_line_texgen) #endif /* GL_SGIS_point_line_texgen */ /* ----------------------- GL_SGIS_shared_multisample ---------------------- */ #ifndef GL_SGIS_shared_multisample #define GL_SGIS_shared_multisample 1 typedef void (GLAPIENTRY * PFNGLMULTISAMPLESUBRECTPOSSGISPROC) (GLint x, GLint y); #define glMultisampleSubRectPosSGIS GLEW_GET_FUN(__glewMultisampleSubRectPosSGIS) #define GLEW_SGIS_shared_multisample GLEW_GET_VAR(__GLEW_SGIS_shared_multisample) #endif /* GL_SGIS_shared_multisample */ /* ------------------------ GL_SGIS_sharpen_texture ------------------------ */ #ifndef GL_SGIS_sharpen_texture #define GL_SGIS_sharpen_texture 1 typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points); typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); #define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS) #define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS) #define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture) #endif /* GL_SGIS_sharpen_texture */ /* --------------------------- GL_SGIS_texture4D --------------------------- */ #ifndef GL_SGIS_texture4D #define GL_SGIS_texture4D 1 typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void *pixels); #define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) #define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) #define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D) #endif /* GL_SGIS_texture4D */ /* ---------------------- GL_SGIS_texture_border_clamp --------------------- */ #ifndef GL_SGIS_texture_border_clamp #define GL_SGIS_texture_border_clamp 1 #define GL_CLAMP_TO_BORDER_SGIS 0x812D #define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp) #endif /* GL_SGIS_texture_border_clamp */ /* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */ #ifndef GL_SGIS_texture_edge_clamp #define GL_SGIS_texture_edge_clamp 1 #define GL_CLAMP_TO_EDGE_SGIS 0x812F #define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp) #endif /* GL_SGIS_texture_edge_clamp */ /* ------------------------ GL_SGIS_texture_filter4 ------------------------ */ #ifndef GL_SGIS_texture_filter4 #define GL_SGIS_texture_filter4 1 typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights); typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights); #define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS) #define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS) #define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4) #endif /* GL_SGIS_texture_filter4 */ /* -------------------------- GL_SGIS_texture_lod -------------------------- */ #ifndef GL_SGIS_texture_lod #define GL_SGIS_texture_lod 1 #define GL_TEXTURE_MIN_LOD_SGIS 0x813A #define GL_TEXTURE_MAX_LOD_SGIS 0x813B #define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C #define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D #define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod) #endif /* GL_SGIS_texture_lod */ /* ------------------------- GL_SGIS_texture_select ------------------------ */ #ifndef GL_SGIS_texture_select #define GL_SGIS_texture_select 1 #define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select) #endif /* GL_SGIS_texture_select */ /* ----------------------------- GL_SGIX_async ----------------------------- */ #ifndef GL_SGIX_async #define GL_SGIX_async 1 #define GL_ASYNC_MARKER_SGIX 0x8329 typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp); typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp); #define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX) #define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX) #define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX) #define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX) #define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX) #define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX) #define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async) #endif /* GL_SGIX_async */ /* ------------------------ GL_SGIX_async_histogram ------------------------ */ #ifndef GL_SGIX_async_histogram #define GL_SGIX_async_histogram 1 #define GL_ASYNC_HISTOGRAM_SGIX 0x832C #define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D #define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram) #endif /* GL_SGIX_async_histogram */ /* -------------------------- GL_SGIX_async_pixel -------------------------- */ #ifndef GL_SGIX_async_pixel #define GL_SGIX_async_pixel 1 #define GL_ASYNC_TEX_IMAGE_SGIX 0x835C #define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D #define GL_ASYNC_READ_PIXELS_SGIX 0x835E #define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F #define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 #define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 #define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel) #endif /* GL_SGIX_async_pixel */ /* ----------------------- GL_SGIX_bali_g_instruments ---------------------- */ #ifndef GL_SGIX_bali_g_instruments #define GL_SGIX_bali_g_instruments 1 #define GL_BALI_NUM_TRIS_CULLED_INSTRUMENT 0x6080 #define GL_BALI_NUM_PRIMS_CLIPPED_INSTRUMENT 0x6081 #define GL_BALI_NUM_PRIMS_REJECT_INSTRUMENT 0x6082 #define GL_BALI_NUM_PRIMS_CLIP_RESULT_INSTRUMENT 0x6083 #define GLEW_SGIX_bali_g_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_g_instruments) #endif /* GL_SGIX_bali_g_instruments */ /* ----------------------- GL_SGIX_bali_r_instruments ---------------------- */ #ifndef GL_SGIX_bali_r_instruments #define GL_SGIX_bali_r_instruments 1 #define GL_BALI_FRAGMENTS_GENERATED_INSTRUMENT 0x6090 #define GL_BALI_DEPTH_PASS_INSTRUMENT 0x6091 #define GL_BALI_R_CHIP_COUNT 0x6092 #define GLEW_SGIX_bali_r_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_r_instruments) #endif /* GL_SGIX_bali_r_instruments */ /* --------------------- GL_SGIX_bali_timer_instruments -------------------- */ #ifndef GL_SGIX_bali_timer_instruments #define GL_SGIX_bali_timer_instruments 1 #define GLEW_SGIX_bali_timer_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_timer_instruments) #endif /* GL_SGIX_bali_timer_instruments */ /* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */ #ifndef GL_SGIX_blend_alpha_minmax #define GL_SGIX_blend_alpha_minmax 1 #define GL_ALPHA_MIN_SGIX 0x8320 #define GL_ALPHA_MAX_SGIX 0x8321 #define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax) #endif /* GL_SGIX_blend_alpha_minmax */ /* --------------------------- GL_SGIX_blend_cadd -------------------------- */ #ifndef GL_SGIX_blend_cadd #define GL_SGIX_blend_cadd 1 #define GL_FUNC_COMPLEX_ADD_EXT 0x601C #define GLEW_SGIX_blend_cadd GLEW_GET_VAR(__GLEW_SGIX_blend_cadd) #endif /* GL_SGIX_blend_cadd */ /* ------------------------ GL_SGIX_blend_cmultiply ------------------------ */ #ifndef GL_SGIX_blend_cmultiply #define GL_SGIX_blend_cmultiply 1 #define GL_FUNC_COMPLEX_MULTIPLY_EXT 0x601B #define GLEW_SGIX_blend_cmultiply GLEW_GET_VAR(__GLEW_SGIX_blend_cmultiply) #endif /* GL_SGIX_blend_cmultiply */ /* --------------------- GL_SGIX_calligraphic_fragment --------------------- */ #ifndef GL_SGIX_calligraphic_fragment #define GL_SGIX_calligraphic_fragment 1 #define GLEW_SGIX_calligraphic_fragment GLEW_GET_VAR(__GLEW_SGIX_calligraphic_fragment) #endif /* GL_SGIX_calligraphic_fragment */ /* ---------------------------- GL_SGIX_clipmap ---------------------------- */ #ifndef GL_SGIX_clipmap #define GL_SGIX_clipmap 1 #define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap) #endif /* GL_SGIX_clipmap */ /* --------------------- GL_SGIX_color_matrix_accuracy --------------------- */ #ifndef GL_SGIX_color_matrix_accuracy #define GL_SGIX_color_matrix_accuracy 1 #define GL_COLOR_MATRIX_HINT 0x8317 #define GLEW_SGIX_color_matrix_accuracy GLEW_GET_VAR(__GLEW_SGIX_color_matrix_accuracy) #endif /* GL_SGIX_color_matrix_accuracy */ /* --------------------- GL_SGIX_color_table_index_mode -------------------- */ #ifndef GL_SGIX_color_table_index_mode #define GL_SGIX_color_table_index_mode 1 #define GLEW_SGIX_color_table_index_mode GLEW_GET_VAR(__GLEW_SGIX_color_table_index_mode) #endif /* GL_SGIX_color_table_index_mode */ /* ------------------------- GL_SGIX_complex_polar ------------------------- */ #ifndef GL_SGIX_complex_polar #define GL_SGIX_complex_polar 1 #define GLEW_SGIX_complex_polar GLEW_GET_VAR(__GLEW_SGIX_complex_polar) #endif /* GL_SGIX_complex_polar */ /* ---------------------- GL_SGIX_convolution_accuracy --------------------- */ #ifndef GL_SGIX_convolution_accuracy #define GL_SGIX_convolution_accuracy 1 #define GL_CONVOLUTION_HINT_SGIX 0x8316 #define GLEW_SGIX_convolution_accuracy GLEW_GET_VAR(__GLEW_SGIX_convolution_accuracy) #endif /* GL_SGIX_convolution_accuracy */ /* ---------------------------- GL_SGIX_cube_map --------------------------- */ #ifndef GL_SGIX_cube_map #define GL_SGIX_cube_map 1 #define GL_ENV_MAP_SGIX 0x8340 #define GL_CUBE_MAP_SGIX 0x8341 #define GL_CUBE_MAP_ZP_SGIX 0x8342 #define GL_CUBE_MAP_ZN_SGIX 0x8343 #define GL_CUBE_MAP_XN_SGIX 0x8344 #define GL_CUBE_MAP_XP_SGIX 0x8345 #define GL_CUBE_MAP_YN_SGIX 0x8346 #define GL_CUBE_MAP_YP_SGIX 0x8347 #define GL_CUBE_MAP_BINDING_SGIX 0x8348 #define GLEW_SGIX_cube_map GLEW_GET_VAR(__GLEW_SGIX_cube_map) #endif /* GL_SGIX_cube_map */ /* ------------------------ GL_SGIX_cylinder_texgen ------------------------ */ #ifndef GL_SGIX_cylinder_texgen #define GL_SGIX_cylinder_texgen 1 #define GLEW_SGIX_cylinder_texgen GLEW_GET_VAR(__GLEW_SGIX_cylinder_texgen) #endif /* GL_SGIX_cylinder_texgen */ /* ---------------------------- GL_SGIX_datapipe --------------------------- */ #ifndef GL_SGIX_datapipe #define GL_SGIX_datapipe 1 #define GL_GEOMETRY_BIT 0x1 #define GL_IMAGE_BIT 0x2 typedef void (GLAPIENTRY * PFNGLADDRESSSPACEPROC) (GLenum space, GLbitfield mask); typedef GLint (GLAPIENTRY * PFNGLDATAPIPEPROC) (GLenum space); #define glAddressSpace GLEW_GET_FUN(__glewAddressSpace) #define glDataPipe GLEW_GET_FUN(__glewDataPipe) #define GLEW_SGIX_datapipe GLEW_GET_VAR(__GLEW_SGIX_datapipe) #endif /* GL_SGIX_datapipe */ /* --------------------------- GL_SGIX_decimation -------------------------- */ #ifndef GL_SGIX_decimation #define GL_SGIX_decimation 1 #define GLEW_SGIX_decimation GLEW_GET_VAR(__GLEW_SGIX_decimation) #endif /* GL_SGIX_decimation */ /* --------------------- GL_SGIX_depth_pass_instrument --------------------- */ #ifndef GL_SGIX_depth_pass_instrument #define GL_SGIX_depth_pass_instrument 1 #define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 #define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 #define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 #define GLEW_SGIX_depth_pass_instrument GLEW_GET_VAR(__GLEW_SGIX_depth_pass_instrument) #endif /* GL_SGIX_depth_pass_instrument */ /* ------------------------- GL_SGIX_depth_texture ------------------------- */ #ifndef GL_SGIX_depth_texture #define GL_SGIX_depth_texture 1 #define GL_DEPTH_COMPONENT16_SGIX 0x81A5 #define GL_DEPTH_COMPONENT24_SGIX 0x81A6 #define GL_DEPTH_COMPONENT32_SGIX 0x81A7 #define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture) #endif /* GL_SGIX_depth_texture */ /* ------------------------------ GL_SGIX_dvc ------------------------------ */ #ifndef GL_SGIX_dvc #define GL_SGIX_dvc 1 #define GLEW_SGIX_dvc GLEW_GET_VAR(__GLEW_SGIX_dvc) #endif /* GL_SGIX_dvc */ /* -------------------------- GL_SGIX_flush_raster ------------------------- */ #ifndef GL_SGIX_flush_raster #define GL_SGIX_flush_raster 1 typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); #define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX) #define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster) #endif /* GL_SGIX_flush_raster */ /* --------------------------- GL_SGIX_fog_blend --------------------------- */ #ifndef GL_SGIX_fog_blend #define GL_SGIX_fog_blend 1 #define GL_FOG_BLEND_ALPHA_SGIX 0x81FE #define GL_FOG_BLEND_COLOR_SGIX 0x81FF #define GLEW_SGIX_fog_blend GLEW_GET_VAR(__GLEW_SGIX_fog_blend) #endif /* GL_SGIX_fog_blend */ /* ---------------------- GL_SGIX_fog_factor_to_alpha ---------------------- */ #ifndef GL_SGIX_fog_factor_to_alpha #define GL_SGIX_fog_factor_to_alpha 1 #define GLEW_SGIX_fog_factor_to_alpha GLEW_GET_VAR(__GLEW_SGIX_fog_factor_to_alpha) #endif /* GL_SGIX_fog_factor_to_alpha */ /* --------------------------- GL_SGIX_fog_layers -------------------------- */ #ifndef GL_SGIX_fog_layers #define GL_SGIX_fog_layers 1 #define GL_FOG_TYPE_SGIX 0x8323 #define GL_UNIFORM_SGIX 0x8324 #define GL_LAYERED_SGIX 0x8325 #define GL_FOG_GROUND_PLANE_SGIX 0x8326 #define GL_FOG_LAYERS_POINTS_SGIX 0x8327 #define GL_MAX_FOG_LAYERS_POINTS_SGIX 0x8328 typedef void (GLAPIENTRY * PFNGLFOGLAYERSSGIXPROC) (GLsizei n, const GLfloat* points); typedef void (GLAPIENTRY * PFNGLGETFOGLAYERSSGIXPROC) (GLfloat* points); #define glFogLayersSGIX GLEW_GET_FUN(__glewFogLayersSGIX) #define glGetFogLayersSGIX GLEW_GET_FUN(__glewGetFogLayersSGIX) #define GLEW_SGIX_fog_layers GLEW_GET_VAR(__GLEW_SGIX_fog_layers) #endif /* GL_SGIX_fog_layers */ /* --------------------------- GL_SGIX_fog_offset -------------------------- */ #ifndef GL_SGIX_fog_offset #define GL_SGIX_fog_offset 1 #define GL_FOG_OFFSET_SGIX 0x8198 #define GL_FOG_OFFSET_VALUE_SGIX 0x8199 #define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset) #endif /* GL_SGIX_fog_offset */ /* --------------------------- GL_SGIX_fog_patchy -------------------------- */ #ifndef GL_SGIX_fog_patchy #define GL_SGIX_fog_patchy 1 #define GLEW_SGIX_fog_patchy GLEW_GET_VAR(__GLEW_SGIX_fog_patchy) #endif /* GL_SGIX_fog_patchy */ /* --------------------------- GL_SGIX_fog_scale --------------------------- */ #ifndef GL_SGIX_fog_scale #define GL_SGIX_fog_scale 1 #define GL_FOG_SCALE_SGIX 0x81FC #define GL_FOG_SCALE_VALUE_SGIX 0x81FD #define GLEW_SGIX_fog_scale GLEW_GET_VAR(__GLEW_SGIX_fog_scale) #endif /* GL_SGIX_fog_scale */ /* -------------------------- GL_SGIX_fog_texture -------------------------- */ #ifndef GL_SGIX_fog_texture #define GL_SGIX_fog_texture 1 typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); #define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX) #define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture) #endif /* GL_SGIX_fog_texture */ /* -------------------- GL_SGIX_fragment_lighting_space -------------------- */ #ifndef GL_SGIX_fragment_lighting_space #define GL_SGIX_fragment_lighting_space 1 #define GL_EYE_SPACE_SGIX 0x8436 #define GL_TANGENT_SPACE_SGIX 0x8437 #define GL_OBJECT_SPACE_SGIX 0x8438 #define GL_FRAGMENT_LIGHT_SPACE_SGIX 0x843D #define GLEW_SGIX_fragment_lighting_space GLEW_GET_VAR(__GLEW_SGIX_fragment_lighting_space) #endif /* GL_SGIX_fragment_lighting_space */ /* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */ #ifndef GL_SGIX_fragment_specular_lighting #define GL_SGIX_fragment_specular_lighting 1 typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data); #define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX) #define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX) #define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX) #define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX) #define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX) #define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX) #define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX) #define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX) #define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX) #define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX) #define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX) #define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX) #define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX) #define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX) #define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX) #define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX) #define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX) #define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting) #endif /* GL_SGIX_fragment_specular_lighting */ /* ---------------------- GL_SGIX_fragments_instrument --------------------- */ #ifndef GL_SGIX_fragments_instrument #define GL_SGIX_fragments_instrument 1 #define GL_FRAGMENTS_INSTRUMENT_SGIX 0x8313 #define GL_FRAGMENTS_INSTRUMENT_COUNTERS_SGIX 0x8314 #define GL_FRAGMENTS_INSTRUMENT_MAX_SGIX 0x8315 #define GLEW_SGIX_fragments_instrument GLEW_GET_VAR(__GLEW_SGIX_fragments_instrument) #endif /* GL_SGIX_fragments_instrument */ /* --------------------------- GL_SGIX_framezoom --------------------------- */ #ifndef GL_SGIX_framezoom #define GL_SGIX_framezoom 1 typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); #define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX) #define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom) #endif /* GL_SGIX_framezoom */ /* -------------------------- GL_SGIX_icc_texture -------------------------- */ #ifndef GL_SGIX_icc_texture #define GL_SGIX_icc_texture 1 #define GL_RGB_ICC_SGIX 0x8460 #define GL_RGBA_ICC_SGIX 0x8461 #define GL_ALPHA_ICC_SGIX 0x8462 #define GL_LUMINANCE_ICC_SGIX 0x8463 #define GL_INTENSITY_ICC_SGIX 0x8464 #define GL_LUMINANCE_ALPHA_ICC_SGIX 0x8465 #define GL_R5_G6_B5_ICC_SGIX 0x8466 #define GL_R5_G6_B5_A8_ICC_SGIX 0x8467 #define GL_ALPHA16_ICC_SGIX 0x8468 #define GL_LUMINANCE16_ICC_SGIX 0x8469 #define GL_INTENSITY16_ICC_SGIX 0x846A #define GL_LUMINANCE16_ALPHA8_ICC_SGIX 0x846B #define GLEW_SGIX_icc_texture GLEW_GET_VAR(__GLEW_SGIX_icc_texture) #endif /* GL_SGIX_icc_texture */ /* ------------------------ GL_SGIX_igloo_interface ------------------------ */ #ifndef GL_SGIX_igloo_interface #define GL_SGIX_igloo_interface 1 #define GL_IGLOO_FULLSCREEN_SGIX 0x819E #define GL_IGLOO_VIEWPORT_OFFSET_SGIX 0x819F #define GL_IGLOO_SWAPTMESH_SGIX 0x81A0 #define GL_IGLOO_COLORNORMAL_SGIX 0x81A1 #define GL_IGLOO_IRISGL_MODE_SGIX 0x81A2 #define GL_IGLOO_LMC_COLOR_SGIX 0x81A3 #define GL_IGLOO_TMESHMODE_SGIX 0x81A4 #define GL_LIGHT31 0xBEAD typedef void (GLAPIENTRY * PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, void *param); #define glIglooInterfaceSGIX GLEW_GET_FUN(__glewIglooInterfaceSGIX) #define GLEW_SGIX_igloo_interface GLEW_GET_VAR(__GLEW_SGIX_igloo_interface) #endif /* GL_SGIX_igloo_interface */ /* ----------------------- GL_SGIX_image_compression ----------------------- */ #ifndef GL_SGIX_image_compression #define GL_SGIX_image_compression 1 #define GLEW_SGIX_image_compression GLEW_GET_VAR(__GLEW_SGIX_image_compression) #endif /* GL_SGIX_image_compression */ /* ---------------------- GL_SGIX_impact_pixel_texture --------------------- */ #ifndef GL_SGIX_impact_pixel_texture #define GL_SGIX_impact_pixel_texture 1 #define GLEW_SGIX_impact_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_impact_pixel_texture) #endif /* GL_SGIX_impact_pixel_texture */ /* ------------------------ GL_SGIX_instrument_error ----------------------- */ #ifndef GL_SGIX_instrument_error #define GL_SGIX_instrument_error 1 #define GLEW_SGIX_instrument_error GLEW_GET_VAR(__GLEW_SGIX_instrument_error) #endif /* GL_SGIX_instrument_error */ /* --------------------------- GL_SGIX_interlace --------------------------- */ #ifndef GL_SGIX_interlace #define GL_SGIX_interlace 1 #define GL_INTERLACE_SGIX 0x8094 #define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace) #endif /* GL_SGIX_interlace */ /* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */ #ifndef GL_SGIX_ir_instrument1 #define GL_SGIX_ir_instrument1 1 #define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1) #endif /* GL_SGIX_ir_instrument1 */ /* ----------------------- GL_SGIX_line_quality_hint ----------------------- */ #ifndef GL_SGIX_line_quality_hint #define GL_SGIX_line_quality_hint 1 #define GL_LINE_QUALITY_HINT_SGIX 0x835B #define GLEW_SGIX_line_quality_hint GLEW_GET_VAR(__GLEW_SGIX_line_quality_hint) #endif /* GL_SGIX_line_quality_hint */ /* ------------------------- GL_SGIX_list_priority ------------------------- */ #ifndef GL_SGIX_list_priority #define GL_SGIX_list_priority 1 #define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority) #endif /* GL_SGIX_list_priority */ /* ----------------------------- GL_SGIX_mpeg1 ----------------------------- */ #ifndef GL_SGIX_mpeg1 #define GL_SGIX_mpeg1 1 typedef void (GLAPIENTRY * PFNGLALLOCMPEGPREDICTORSSGIXPROC) (GLsizei width, GLsizei height, GLsizei n, GLuint* predictors); typedef void (GLAPIENTRY * PFNGLDELETEMPEGPREDICTORSSGIXPROC) (GLsizei n, GLuint* predictors); typedef void (GLAPIENTRY * PFNGLGENMPEGPREDICTORSSGIXPROC) (GLsizei n, GLuint* predictors); typedef void (GLAPIENTRY * PFNGLGETMPEGPARAMETERFVSGIXPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMPEGPARAMETERIVSGIXPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMPEGPREDICTORSGIXPROC) (GLenum target, GLenum format, GLenum type, void *pixels); typedef void (GLAPIENTRY * PFNGLGETMPEGQUANTTABLEUBVPROC) (GLenum target, GLubyte* values); typedef GLboolean (GLAPIENTRY * PFNGLISMPEGPREDICTORSGIXPROC) (GLuint predictor); typedef void (GLAPIENTRY * PFNGLMPEGPREDICTORSGIXPROC) (GLenum target, GLenum format, GLenum type, void *pixels); typedef void (GLAPIENTRY * PFNGLMPEGQUANTTABLEUBVPROC) (GLenum target, GLubyte* values); typedef void (GLAPIENTRY * PFNGLSWAPMPEGPREDICTORSSGIXPROC) (GLenum target0, GLenum target1); #define glAllocMPEGPredictorsSGIX GLEW_GET_FUN(__glewAllocMPEGPredictorsSGIX) #define glDeleteMPEGPredictorsSGIX GLEW_GET_FUN(__glewDeleteMPEGPredictorsSGIX) #define glGenMPEGPredictorsSGIX GLEW_GET_FUN(__glewGenMPEGPredictorsSGIX) #define glGetMPEGParameterfvSGIX GLEW_GET_FUN(__glewGetMPEGParameterfvSGIX) #define glGetMPEGParameterivSGIX GLEW_GET_FUN(__glewGetMPEGParameterivSGIX) #define glGetMPEGPredictorSGIX GLEW_GET_FUN(__glewGetMPEGPredictorSGIX) #define glGetMPEGQuantTableubv GLEW_GET_FUN(__glewGetMPEGQuantTableubv) #define glIsMPEGPredictorSGIX GLEW_GET_FUN(__glewIsMPEGPredictorSGIX) #define glMPEGPredictorSGIX GLEW_GET_FUN(__glewMPEGPredictorSGIX) #define glMPEGQuantTableubv GLEW_GET_FUN(__glewMPEGQuantTableubv) #define glSwapMPEGPredictorsSGIX GLEW_GET_FUN(__glewSwapMPEGPredictorsSGIX) #define GLEW_SGIX_mpeg1 GLEW_GET_VAR(__GLEW_SGIX_mpeg1) #endif /* GL_SGIX_mpeg1 */ /* ----------------------------- GL_SGIX_mpeg2 ----------------------------- */ #ifndef GL_SGIX_mpeg2 #define GL_SGIX_mpeg2 1 #define GLEW_SGIX_mpeg2 GLEW_GET_VAR(__GLEW_SGIX_mpeg2) #endif /* GL_SGIX_mpeg2 */ /* ------------------ GL_SGIX_nonlinear_lighting_pervertex ----------------- */ #ifndef GL_SGIX_nonlinear_lighting_pervertex #define GL_SGIX_nonlinear_lighting_pervertex 1 typedef void (GLAPIENTRY * PFNGLGETNONLINLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLint* terms, GLfloat *data); typedef void (GLAPIENTRY * PFNGLGETNONLINMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLint* terms, const GLfloat *data); typedef void (GLAPIENTRY * PFNGLNONLINLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLint terms, GLfloat* params); typedef void (GLAPIENTRY * PFNGLNONLINMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLint terms, const GLfloat* params); #define glGetNonlinLightfvSGIX GLEW_GET_FUN(__glewGetNonlinLightfvSGIX) #define glGetNonlinMaterialfvSGIX GLEW_GET_FUN(__glewGetNonlinMaterialfvSGIX) #define glNonlinLightfvSGIX GLEW_GET_FUN(__glewNonlinLightfvSGIX) #define glNonlinMaterialfvSGIX GLEW_GET_FUN(__glewNonlinMaterialfvSGIX) #define GLEW_SGIX_nonlinear_lighting_pervertex GLEW_GET_VAR(__GLEW_SGIX_nonlinear_lighting_pervertex) #endif /* GL_SGIX_nonlinear_lighting_pervertex */ /* --------------------------- GL_SGIX_nurbs_eval -------------------------- */ #ifndef GL_SGIX_nurbs_eval #define GL_SGIX_nurbs_eval 1 #define GL_MAP1_VERTEX_3_NURBS_SGIX 0x81CB #define GL_MAP1_VERTEX_4_NURBS_SGIX 0x81CC #define GL_MAP1_INDEX_NURBS_SGIX 0x81CD #define GL_MAP1_COLOR_4_NURBS_SGIX 0x81CE #define GL_MAP1_NORMAL_NURBS_SGIX 0x81CF #define GL_MAP1_TEXTURE_COORD_1_NURBS_SGIX 0x81E0 #define GL_MAP1_TEXTURE_COORD_2_NURBS_SGIX 0x81E1 #define GL_MAP1_TEXTURE_COORD_3_NURBS_SGIX 0x81E2 #define GL_MAP1_TEXTURE_COORD_4_NURBS_SGIX 0x81E3 #define GL_MAP2_VERTEX_3_NURBS_SGIX 0x81E4 #define GL_MAP2_VERTEX_4_NURBS_SGIX 0x81E5 #define GL_MAP2_INDEX_NURBS_SGIX 0x81E6 #define GL_MAP2_COLOR_4_NURBS_SGIX 0x81E7 #define GL_MAP2_NORMAL_NURBS_SGIX 0x81E8 #define GL_MAP2_TEXTURE_COORD_1_NURBS_SGIX 0x81E9 #define GL_MAP2_TEXTURE_COORD_2_NURBS_SGIX 0x81EA #define GL_MAP2_TEXTURE_COORD_3_NURBS_SGIX 0x81EB #define GL_MAP2_TEXTURE_COORD_4_NURBS_SGIX 0x81EC #define GL_NURBS_KNOT_COUNT_SGIX 0x81ED #define GL_NURBS_KNOT_VECTOR_SGIX 0x81EE #define GLEW_SGIX_nurbs_eval GLEW_GET_VAR(__GLEW_SGIX_nurbs_eval) #endif /* GL_SGIX_nurbs_eval */ /* ---------------------- GL_SGIX_occlusion_instrument --------------------- */ #ifndef GL_SGIX_occlusion_instrument #define GL_SGIX_occlusion_instrument 1 #define GL_OCCLUSION_INSTRUMENT_SGIX 0x6060 #define GLEW_SGIX_occlusion_instrument GLEW_GET_VAR(__GLEW_SGIX_occlusion_instrument) #endif /* GL_SGIX_occlusion_instrument */ /* ------------------------- GL_SGIX_packed_6bytes ------------------------- */ #ifndef GL_SGIX_packed_6bytes #define GL_SGIX_packed_6bytes 1 #define GLEW_SGIX_packed_6bytes GLEW_GET_VAR(__GLEW_SGIX_packed_6bytes) #endif /* GL_SGIX_packed_6bytes */ /* ------------------------- GL_SGIX_pixel_texture ------------------------- */ #ifndef GL_SGIX_pixel_texture #define GL_SGIX_pixel_texture 1 typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); #define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX) #define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture) #endif /* GL_SGIX_pixel_texture */ /* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */ #ifndef GL_SGIX_pixel_texture_bits #define GL_SGIX_pixel_texture_bits 1 #define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits) #endif /* GL_SGIX_pixel_texture_bits */ /* ----------------------- GL_SGIX_pixel_texture_lod ----------------------- */ #ifndef GL_SGIX_pixel_texture_lod #define GL_SGIX_pixel_texture_lod 1 #define GLEW_SGIX_pixel_texture_lod GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_lod) #endif /* GL_SGIX_pixel_texture_lod */ /* -------------------------- GL_SGIX_pixel_tiles -------------------------- */ #ifndef GL_SGIX_pixel_tiles #define GL_SGIX_pixel_tiles 1 #define GLEW_SGIX_pixel_tiles GLEW_GET_VAR(__GLEW_SGIX_pixel_tiles) #endif /* GL_SGIX_pixel_tiles */ /* ------------------------- GL_SGIX_polynomial_ffd ------------------------ */ #ifndef GL_SGIX_polynomial_ffd #define GL_SGIX_polynomial_ffd 1 #define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x1 #define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x2 typedef void (GLAPIENTRY * PFNGLDEFORMSGIXPROC) (GLbitfield mask); typedef void (GLAPIENTRY * PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); #define glDeformSGIX GLEW_GET_FUN(__glewDeformSGIX) #define glLoadIdentityDeformationMapSGIX GLEW_GET_FUN(__glewLoadIdentityDeformationMapSGIX) #define GLEW_SGIX_polynomial_ffd GLEW_GET_VAR(__GLEW_SGIX_polynomial_ffd) #endif /* GL_SGIX_polynomial_ffd */ /* --------------------------- GL_SGIX_quad_mesh --------------------------- */ #ifndef GL_SGIX_quad_mesh #define GL_SGIX_quad_mesh 1 typedef void (GLAPIENTRY * PFNGLMESHBREADTHSGIXPROC) (GLint breadth); typedef void (GLAPIENTRY * PFNGLMESHSTRIDESGIXPROC) (GLint stride); #define glMeshBreadthSGIX GLEW_GET_FUN(__glewMeshBreadthSGIX) #define glMeshStrideSGIX GLEW_GET_FUN(__glewMeshStrideSGIX) #define GLEW_SGIX_quad_mesh GLEW_GET_VAR(__GLEW_SGIX_quad_mesh) #endif /* GL_SGIX_quad_mesh */ /* ------------------------ GL_SGIX_reference_plane ------------------------ */ #ifndef GL_SGIX_reference_plane #define GL_SGIX_reference_plane 1 typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation); #define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX) #define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane) #endif /* GL_SGIX_reference_plane */ /* ---------------------------- GL_SGIX_resample --------------------------- */ #ifndef GL_SGIX_resample #define GL_SGIX_resample 1 #define GL_PACK_RESAMPLE_SGIX 0x842E #define GL_UNPACK_RESAMPLE_SGIX 0x842F #define GL_RESAMPLE_DECIMATE_SGIX 0x8430 #define GL_RESAMPLE_REPLICATE_SGIX 0x8433 #define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 #define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample) #endif /* GL_SGIX_resample */ /* ------------------------- GL_SGIX_scalebias_hint ------------------------ */ #ifndef GL_SGIX_scalebias_hint #define GL_SGIX_scalebias_hint 1 #define GL_SCALEBIAS_HINT_SGIX 0x8322 #define GLEW_SGIX_scalebias_hint GLEW_GET_VAR(__GLEW_SGIX_scalebias_hint) #endif /* GL_SGIX_scalebias_hint */ /* ----------------------------- GL_SGIX_shadow ---------------------------- */ #ifndef GL_SGIX_shadow #define GL_SGIX_shadow 1 #define GL_TEXTURE_COMPARE_SGIX 0x819A #define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B #define GL_TEXTURE_LEQUAL_R_SGIX 0x819C #define GL_TEXTURE_GEQUAL_R_SGIX 0x819D #define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow) #endif /* GL_SGIX_shadow */ /* ------------------------- GL_SGIX_shadow_ambient ------------------------ */ #ifndef GL_SGIX_shadow_ambient #define GL_SGIX_shadow_ambient 1 #define GL_SHADOW_AMBIENT_SGIX 0x80BF #define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient) #endif /* GL_SGIX_shadow_ambient */ /* ------------------------------ GL_SGIX_slim ----------------------------- */ #ifndef GL_SGIX_slim #define GL_SGIX_slim 1 #define GL_PACK_MAX_COMPRESSED_SIZE_SGIX 0x831B #define GL_SLIM8U_SGIX 0x831D #define GL_SLIM10U_SGIX 0x831E #define GL_SLIM12S_SGIX 0x831F #define GLEW_SGIX_slim GLEW_GET_VAR(__GLEW_SGIX_slim) #endif /* GL_SGIX_slim */ /* ------------------------ GL_SGIX_spotlight_cutoff ----------------------- */ #ifndef GL_SGIX_spotlight_cutoff #define GL_SGIX_spotlight_cutoff 1 #define GL_SPOT_CUTOFF_DELTA_SGIX 0x8193 #define GLEW_SGIX_spotlight_cutoff GLEW_GET_VAR(__GLEW_SGIX_spotlight_cutoff) #endif /* GL_SGIX_spotlight_cutoff */ /* ----------------------------- GL_SGIX_sprite ---------------------------- */ #ifndef GL_SGIX_sprite #define GL_SGIX_sprite 1 typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params); #define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX) #define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX) #define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX) #define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX) #define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite) #endif /* GL_SGIX_sprite */ /* -------------------------- GL_SGIX_subdiv_patch ------------------------- */ #ifndef GL_SGIX_subdiv_patch #define GL_SGIX_subdiv_patch 1 #define GLEW_SGIX_subdiv_patch GLEW_GET_VAR(__GLEW_SGIX_subdiv_patch) #endif /* GL_SGIX_subdiv_patch */ /* --------------------------- GL_SGIX_subsample --------------------------- */ #ifndef GL_SGIX_subsample #define GL_SGIX_subsample 1 #define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 #define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 #define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 #define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 #define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 #define GLEW_SGIX_subsample GLEW_GET_VAR(__GLEW_SGIX_subsample) #endif /* GL_SGIX_subsample */ /* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */ #ifndef GL_SGIX_tag_sample_buffer #define GL_SGIX_tag_sample_buffer 1 typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); #define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX) #define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer) #endif /* GL_SGIX_tag_sample_buffer */ /* ------------------------ GL_SGIX_texture_add_env ------------------------ */ #ifndef GL_SGIX_texture_add_env #define GL_SGIX_texture_add_env 1 #define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env) #endif /* GL_SGIX_texture_add_env */ /* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */ #ifndef GL_SGIX_texture_coordinate_clamp #define GL_SGIX_texture_coordinate_clamp 1 #define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 #define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A #define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B #define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp) #endif /* GL_SGIX_texture_coordinate_clamp */ /* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */ #ifndef GL_SGIX_texture_lod_bias #define GL_SGIX_texture_lod_bias 1 #define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias) #endif /* GL_SGIX_texture_lod_bias */ /* ------------------- GL_SGIX_texture_mipmap_anisotropic ------------------ */ #ifndef GL_SGIX_texture_mipmap_anisotropic #define GL_SGIX_texture_mipmap_anisotropic 1 #define GL_TEXTURE_MIPMAP_ANISOTROPY_SGIX 0x832E #define GL_MAX_MIPMAP_ANISOTROPY_SGIX 0x832F #define GLEW_SGIX_texture_mipmap_anisotropic GLEW_GET_VAR(__GLEW_SGIX_texture_mipmap_anisotropic) #endif /* GL_SGIX_texture_mipmap_anisotropic */ /* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */ #ifndef GL_SGIX_texture_multi_buffer #define GL_SGIX_texture_multi_buffer 1 #define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E #define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer) #endif /* GL_SGIX_texture_multi_buffer */ /* ------------------------- GL_SGIX_texture_phase ------------------------- */ #ifndef GL_SGIX_texture_phase #define GL_SGIX_texture_phase 1 #define GL_PHASE_SGIX 0x832A #define GLEW_SGIX_texture_phase GLEW_GET_VAR(__GLEW_SGIX_texture_phase) #endif /* GL_SGIX_texture_phase */ /* ------------------------- GL_SGIX_texture_range ------------------------- */ #ifndef GL_SGIX_texture_range #define GL_SGIX_texture_range 1 #define GL_RGB_SIGNED_SGIX 0x85E0 #define GL_RGBA_SIGNED_SGIX 0x85E1 #define GL_ALPHA_SIGNED_SGIX 0x85E2 #define GL_LUMINANCE_SIGNED_SGIX 0x85E3 #define GL_INTENSITY_SIGNED_SGIX 0x85E4 #define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 #define GL_RGB16_SIGNED_SGIX 0x85E6 #define GL_RGBA16_SIGNED_SGIX 0x85E7 #define GL_ALPHA16_SIGNED_SGIX 0x85E8 #define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 #define GL_INTENSITY16_SIGNED_SGIX 0x85EA #define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB #define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC #define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED #define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE #define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF #define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 #define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 #define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 #define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 #define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 #define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 #define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 #define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 #define GL_MIN_LUMINANCE_SGIS 0x85F8 #define GL_MAX_LUMINANCE_SGIS 0x85F9 #define GL_MIN_INTENSITY_SGIS 0x85FA #define GL_MAX_INTENSITY_SGIS 0x85FB #define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range) #endif /* GL_SGIX_texture_range */ /* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */ #ifndef GL_SGIX_texture_scale_bias #define GL_SGIX_texture_scale_bias 1 #define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 #define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A #define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B #define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C #define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias) #endif /* GL_SGIX_texture_scale_bias */ /* ---------------------- GL_SGIX_texture_supersample ---------------------- */ #ifndef GL_SGIX_texture_supersample #define GL_SGIX_texture_supersample 1 #define GLEW_SGIX_texture_supersample GLEW_GET_VAR(__GLEW_SGIX_texture_supersample) #endif /* GL_SGIX_texture_supersample */ /* --------------------------- GL_SGIX_vector_ops -------------------------- */ #ifndef GL_SGIX_vector_ops #define GL_SGIX_vector_ops 1 typedef void (GLAPIENTRY * PFNGLGETVECTOROPERATIONSGIXPROC) (GLenum operation); typedef void (GLAPIENTRY * PFNGLVECTOROPERATIONSGIXPROC) (GLenum operation); #define glGetVectorOperationSGIX GLEW_GET_FUN(__glewGetVectorOperationSGIX) #define glVectorOperationSGIX GLEW_GET_FUN(__glewVectorOperationSGIX) #define GLEW_SGIX_vector_ops GLEW_GET_VAR(__GLEW_SGIX_vector_ops) #endif /* GL_SGIX_vector_ops */ /* ---------------------- GL_SGIX_vertex_array_object ---------------------- */ #ifndef GL_SGIX_vertex_array_object #define GL_SGIX_vertex_array_object 1 typedef GLboolean (GLAPIENTRY * PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC) (GLsizei n, const GLuint* arrays, GLboolean* residences); typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYSGIXPROC) (GLuint array); typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSSGIXPROC) (GLsizei n, const GLuint* arrays); typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSSGIXPROC) (GLsizei n, GLuint* arrays); typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYSGIXPROC) (GLuint array); typedef void (GLAPIENTRY * PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC) (GLsizei n, const GLuint* arrays, const GLclampf* priorities); #define glAreVertexArraysResidentSGIX GLEW_GET_FUN(__glewAreVertexArraysResidentSGIX) #define glBindVertexArraySGIX GLEW_GET_FUN(__glewBindVertexArraySGIX) #define glDeleteVertexArraysSGIX GLEW_GET_FUN(__glewDeleteVertexArraysSGIX) #define glGenVertexArraysSGIX GLEW_GET_FUN(__glewGenVertexArraysSGIX) #define glIsVertexArraySGIX GLEW_GET_FUN(__glewIsVertexArraySGIX) #define glPrioritizeVertexArraysSGIX GLEW_GET_FUN(__glewPrioritizeVertexArraysSGIX) #define GLEW_SGIX_vertex_array_object GLEW_GET_VAR(__GLEW_SGIX_vertex_array_object) #endif /* GL_SGIX_vertex_array_object */ /* ------------------------- GL_SGIX_vertex_preclip ------------------------ */ #ifndef GL_SGIX_vertex_preclip #define GL_SGIX_vertex_preclip 1 #define GL_VERTEX_PRECLIP_SGIX 0x83EE #define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF #define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip) #endif /* GL_SGIX_vertex_preclip */ /* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */ #ifndef GL_SGIX_vertex_preclip_hint #define GL_SGIX_vertex_preclip_hint 1 #define GL_VERTEX_PRECLIP_SGIX 0x83EE #define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF #define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint) #endif /* GL_SGIX_vertex_preclip_hint */ /* ----------------------------- GL_SGIX_ycrcb ----------------------------- */ #ifndef GL_SGIX_ycrcb #define GL_SGIX_ycrcb 1 #define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb) #endif /* GL_SGIX_ycrcb */ /* ------------------------ GL_SGIX_ycrcb_subsample ------------------------ */ #ifndef GL_SGIX_ycrcb_subsample #define GL_SGIX_ycrcb_subsample 1 #define GLEW_SGIX_ycrcb_subsample GLEW_GET_VAR(__GLEW_SGIX_ycrcb_subsample) #endif /* GL_SGIX_ycrcb_subsample */ /* ----------------------------- GL_SGIX_ycrcba ---------------------------- */ #ifndef GL_SGIX_ycrcba #define GL_SGIX_ycrcba 1 #define GL_YCRCB_SGIX 0x8318 #define GL_YCRCBA_SGIX 0x8319 #define GLEW_SGIX_ycrcba GLEW_GET_VAR(__GLEW_SGIX_ycrcba) #endif /* GL_SGIX_ycrcba */ /* -------------------------- GL_SGI_color_matrix -------------------------- */ #ifndef GL_SGI_color_matrix #define GL_SGI_color_matrix 1 #define GL_COLOR_MATRIX_SGI 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 #define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 #define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 #define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 #define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 #define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 #define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 #define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA #define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB #define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix) #endif /* GL_SGI_color_matrix */ /* --------------------------- GL_SGI_color_table -------------------------- */ #ifndef GL_SGI_color_table #define GL_SGI_color_table 1 #define GL_COLOR_TABLE_SGI 0x80D0 #define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 #define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 #define GL_PROXY_COLOR_TABLE_SGI 0x80D3 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 #define GL_COLOR_TABLE_SCALE_SGI 0x80D6 #define GL_COLOR_TABLE_BIAS_SGI 0x80D7 #define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 #define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 #define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); #define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) #define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) #define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI) #define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI) #define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI) #define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI) #define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI) #define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table) #endif /* GL_SGI_color_table */ /* ----------------------------- GL_SGI_complex ---------------------------- */ #ifndef GL_SGI_complex #define GL_SGI_complex 1 #define GLEW_SGI_complex GLEW_GET_VAR(__GLEW_SGI_complex) #endif /* GL_SGI_complex */ /* -------------------------- GL_SGI_complex_type -------------------------- */ #ifndef GL_SGI_complex_type #define GL_SGI_complex_type 1 #define GL_COMPLEX_UNSIGNED_BYTE_SGI 0x81BD #define GL_COMPLEX_BYTE_SGI 0x81BE #define GL_COMPLEX_UNSIGNED_SHORT_SGI 0x81BF #define GL_COMPLEX_SHORT_SGI 0x81C0 #define GL_COMPLEX_UNSIGNED_INT_SGI 0x81C1 #define GL_COMPLEX_INT_SGI 0x81C2 #define GL_COMPLEX_FLOAT_SGI 0x81C3 #define GLEW_SGI_complex_type GLEW_GET_VAR(__GLEW_SGI_complex_type) #endif /* GL_SGI_complex_type */ /* ------------------------------- GL_SGI_fft ------------------------------ */ #ifndef GL_SGI_fft #define GL_SGI_fft 1 #define GL_PIXEL_TRANSFORM_OPERATOR_SGI 0x81C4 #define GL_CONVOLUTION_SGI 0x81C5 #define GL_FFT_1D_SGI 0x81C6 #define GL_PIXEL_TRANSFORM_SGI 0x81C7 #define GL_MAX_FFT_WIDTH_SGI 0x81C8 typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFSGIPROC) (GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERISGIPROC) (GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMSGIPROC) (GLenum target); #define glGetPixelTransformParameterfvSGI GLEW_GET_FUN(__glewGetPixelTransformParameterfvSGI) #define glGetPixelTransformParameterivSGI GLEW_GET_FUN(__glewGetPixelTransformParameterivSGI) #define glPixelTransformParameterfSGI GLEW_GET_FUN(__glewPixelTransformParameterfSGI) #define glPixelTransformParameterfvSGI GLEW_GET_FUN(__glewPixelTransformParameterfvSGI) #define glPixelTransformParameteriSGI GLEW_GET_FUN(__glewPixelTransformParameteriSGI) #define glPixelTransformParameterivSGI GLEW_GET_FUN(__glewPixelTransformParameterivSGI) #define glPixelTransformSGI GLEW_GET_FUN(__glewPixelTransformSGI) #define GLEW_SGI_fft GLEW_GET_VAR(__GLEW_SGI_fft) #endif /* GL_SGI_fft */ /* ----------------------- GL_SGI_texture_color_table ---------------------- */ #ifndef GL_SGI_texture_color_table #define GL_SGI_texture_color_table 1 #define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC #define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD #define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table) #endif /* GL_SGI_texture_color_table */ /* ------------------------- GL_SUNX_constant_data ------------------------- */ #ifndef GL_SUNX_constant_data #define GL_SUNX_constant_data 1 #define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 #define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); #define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX) #define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data) #endif /* GL_SUNX_constant_data */ /* -------------------- GL_SUN_convolution_border_modes -------------------- */ #ifndef GL_SUN_convolution_border_modes #define GL_SUN_convolution_border_modes 1 #define GL_WRAP_BORDER_SUN 0x81D4 #define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes) #endif /* GL_SUN_convolution_border_modes */ /* -------------------------- GL_SUN_global_alpha -------------------------- */ #ifndef GL_SUN_global_alpha #define GL_SUN_global_alpha 1 #define GL_GLOBAL_ALPHA_SUN 0x81D9 #define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); #define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN) #define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN) #define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN) #define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN) #define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN) #define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN) #define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN) #define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN) #define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha) #endif /* GL_SUN_global_alpha */ /* --------------------------- GL_SUN_mesh_array --------------------------- */ #ifndef GL_SUN_mesh_array #define GL_SUN_mesh_array 1 #define GL_QUAD_MESH_SUN 0x8614 #define GL_TRIANGLE_MESH_SUN 0x8615 #define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array) #endif /* GL_SUN_mesh_array */ /* ------------------------ GL_SUN_read_video_pixels ----------------------- */ #ifndef GL_SUN_read_video_pixels #define GL_SUN_read_video_pixels 1 typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels); #define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN) #define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels) #endif /* GL_SUN_read_video_pixels */ /* --------------------------- GL_SUN_slice_accum -------------------------- */ #ifndef GL_SUN_slice_accum #define GL_SUN_slice_accum 1 #define GL_SLICE_ACCUM_SUN 0x85CC #define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum) #endif /* GL_SUN_slice_accum */ /* -------------------------- GL_SUN_triangle_list ------------------------- */ #ifndef GL_SUN_triangle_list #define GL_SUN_triangle_list 1 #define GL_RESTART_SUN 0x01 #define GL_REPLACE_MIDDLE_SUN 0x02 #define GL_REPLACE_OLDEST_SUN 0x03 #define GL_TRIANGLE_LIST_SUN 0x81D7 #define GL_REPLACEMENT_CODE_SUN 0x81D8 #define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 #define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 #define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 #define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 #define GL_R1UI_V3F_SUN 0x85C4 #define GL_R1UI_C4UB_V3F_SUN 0x85C5 #define GL_R1UI_C3F_V3F_SUN 0x85C6 #define GL_R1UI_N3F_V3F_SUN 0x85C7 #define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 #define GL_R1UI_T2F_V3F_SUN 0x85C9 #define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA #define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void *pointer); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code); #define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN) #define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN) #define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN) #define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN) #define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN) #define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN) #define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN) #define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list) #endif /* GL_SUN_triangle_list */ /* ----------------------------- GL_SUN_vertex ----------------------------- */ #ifndef GL_SUN_vertex #define GL_SUN_vertex 1 typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v); #define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN) #define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN) #define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN) #define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN) #define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN) #define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN) #define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN) #define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN) #define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN) #define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN) #define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN) #define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN) #define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN) #define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN) #define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN) #define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN) #define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN) #define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN) #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) #define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) #define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) #define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN) #define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN) #define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN) #define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN) #define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN) #define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN) #define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN) #define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN) #define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN) #define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN) #define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN) #define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN) #define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN) #define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN) #define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN) #define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN) #define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN) #define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN) #define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex) #endif /* GL_SUN_vertex */ /* -------------------------- GL_WIN_phong_shading ------------------------- */ #ifndef GL_WIN_phong_shading #define GL_WIN_phong_shading 1 #define GL_PHONG_WIN 0x80EA #define GL_PHONG_HINT_WIN 0x80EB #define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading) #endif /* GL_WIN_phong_shading */ /* ------------------------- GL_WIN_scene_markerXXX ------------------------ */ #ifndef GL_WIN_scene_markerXXX #define GL_WIN_scene_markerXXX 1 #define GLEW_WIN_scene_markerXXX GLEW_GET_VAR(__GLEW_WIN_scene_markerXXX) #endif /* GL_WIN_scene_markerXXX */ /* -------------------------- GL_WIN_specular_fog -------------------------- */ #ifndef GL_WIN_specular_fog #define GL_WIN_specular_fog 1 #define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC #define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog) #endif /* GL_WIN_specular_fog */ /* ---------------------------- GL_WIN_swap_hint --------------------------- */ #ifndef GL_WIN_swap_hint #define GL_WIN_swap_hint 1 typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); #define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN) #define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint) #endif /* GL_WIN_swap_hint */ /* ------------------------------------------------------------------------- */ GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D; GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture; GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage; GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd; GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf; GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd; GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv; GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage; GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate; GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer; GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd; GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv; GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf; GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIPROC __glewPointParameteri; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv; GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery; GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer; GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData; GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData; GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers; GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries; GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery; GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries; GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv; GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv; GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv; GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv; GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer; GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery; GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer; GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer; GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader; GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate; GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader; GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader; GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram; GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader; GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray; GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers; GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray; GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform; GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders; GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation; GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog; GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv; GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog; GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource; GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv; GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation; GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv; GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv; GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram; GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader; GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram; GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource; GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate; GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate; GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate; GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f; GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv; GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i; GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv; GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f; GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv; GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i; GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv; GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f; GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv; GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i; GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv; GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f; GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv; GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i; GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv; GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram; GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv; GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender; GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback; GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation; GLEW_FUN_EXPORT PFNGLCLAMPCOLORPROC __glewClampColor; GLEW_FUN_EXPORT PFNGLCLEARBUFFERFIPROC __glewClearBufferfi; GLEW_FUN_EXPORT PFNGLCLEARBUFFERFVPROC __glewClearBufferfv; GLEW_FUN_EXPORT PFNGLCLEARBUFFERIVPROC __glewClearBufferiv; GLEW_FUN_EXPORT PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv; GLEW_FUN_EXPORT PFNGLCOLORMASKIPROC __glewColorMaski; GLEW_FUN_EXPORT PFNGLDISABLEIPROC __glewDisablei; GLEW_FUN_EXPORT PFNGLENABLEIPROC __glewEnablei; GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender; GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback; GLEW_FUN_EXPORT PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v; GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation; GLEW_FUN_EXPORT PFNGLGETSTRINGIPROC __glewGetStringi; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying; GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv; GLEW_FUN_EXPORT PFNGLISENABLEDIPROC __glewIsEnabledi; GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv; GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings; GLEW_FUN_EXPORT PFNGLUNIFORM1UIPROC __glewUniform1ui; GLEW_FUN_EXPORT PFNGLUNIFORM1UIVPROC __glewUniform1uiv; GLEW_FUN_EXPORT PFNGLUNIFORM2UIPROC __glewUniform2ui; GLEW_FUN_EXPORT PFNGLUNIFORM2UIVPROC __glewUniform2uiv; GLEW_FUN_EXPORT PFNGLUNIFORM3UIPROC __glewUniform3ui; GLEW_FUN_EXPORT PFNGLUNIFORM3UIVPROC __glewUniform3uiv; GLEW_FUN_EXPORT PFNGLUNIFORM4UIPROC __glewUniform4ui; GLEW_FUN_EXPORT PFNGLUNIFORM4UIVPROC __glewUniform4uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced; GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex; GLEW_FUN_EXPORT PFNGLTEXBUFFERPROC __glewTexBuffer; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture; GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v; GLEW_FUN_EXPORT PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIPROC __glewBlendEquationi; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei; GLEW_FUN_EXPORT PFNGLBLENDFUNCIPROC __glewBlendFunci; GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading; GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus; GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage; GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEPROC __glewGetnTexImage; GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC __glewMultiDrawArraysIndirectCount; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC __glewMultiDrawElementsIndirectCount; GLEW_FUN_EXPORT PFNGLSPECIALIZESHADERPROC __glewSpecializeShader; GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD; GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD; GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewFramebufferSamplePositionsfvAMD; GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC __glewGetFramebufferParameterfvAMD; GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC __glewGetNamedFramebufferParameterfvAMD; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewNamedFramebufferSamplePositionsfvAMD; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD; GLEW_FUN_EXPORT PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD; GLEW_FUN_EXPORT PFNGLGENNAMESAMDPROC __glewGenNamesAMD; GLEW_FUN_EXPORT PFNGLISNAMEAMDPROC __glewIsNameAMD; GLEW_FUN_EXPORT PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD; GLEW_FUN_EXPORT PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD; GLEW_FUN_EXPORT PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD; GLEW_FUN_EXPORT PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD; GLEW_FUN_EXPORT PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD; GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD; GLEW_FUN_EXPORT PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD; GLEW_FUN_EXPORT PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD; GLEW_FUN_EXPORT PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD; GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD; GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD; GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE; GLEW_FUN_EXPORT PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE; GLEW_FUN_EXPORT PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE; GLEW_FUN_EXPORT PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE; GLEW_FUN_EXPORT PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE; GLEW_FUN_EXPORT PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE; GLEW_FUN_EXPORT PFNGLISQUERYANGLEPROC __glewIsQueryANGLE; GLEW_FUN_EXPORT PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE; GLEW_FUN_EXPORT PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE; GLEW_FUN_EXPORT PFNGLCOPYTEXTURELEVELSAPPLEPROC __glewCopyTextureLevelsAPPLE; GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE; GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE; GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE; GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE; GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE; GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE; GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE; GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE; GLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE; GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC __glewRenderbufferStorageMultisampleAPPLE; GLEW_FUN_EXPORT PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC __glewResolveMultisampleFramebufferAPPLE; GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE; GLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE; GLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE; GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCAPPLEPROC __glewClientWaitSyncAPPLE; GLEW_FUN_EXPORT PFNGLDELETESYNCAPPLEPROC __glewDeleteSyncAPPLE; GLEW_FUN_EXPORT PFNGLFENCESYNCAPPLEPROC __glewFenceSyncAPPLE; GLEW_FUN_EXPORT PFNGLGETINTEGER64VAPPLEPROC __glewGetInteger64vAPPLE; GLEW_FUN_EXPORT PFNGLGETSYNCIVAPPLEPROC __glewGetSyncivAPPLE; GLEW_FUN_EXPORT PFNGLISSYNCAPPLEPROC __glewIsSyncAPPLE; GLEW_FUN_EXPORT PFNGLWAITSYNCAPPLEPROC __glewWaitSyncAPPLE; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE; GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE; GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE; GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE; GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE; GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE; GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE; GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE; GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE; GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE; GLEW_FUN_EXPORT PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE; GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE; GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE; GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE; GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE; GLEW_FUN_EXPORT PFNGLCLEARDEPTHFPROC __glewClearDepthf; GLEW_FUN_EXPORT PFNGLDEPTHRANGEFPROC __glewDepthRangef; GLEW_FUN_EXPORT PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat; GLEW_FUN_EXPORT PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler; GLEW_FUN_EXPORT PFNGLSHADERBINARYPROC __glewShaderBinary; GLEW_FUN_EXPORT PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion; GLEW_FUN_EXPORT PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance; GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB; GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB; GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB; GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB; GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB; GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB; GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB; GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB; GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB; GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB; GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB; GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed; GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex; GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEPROC __glewBufferStorage; GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB; GLEW_FUN_EXPORT PFNGLCLEARBUFFERDATAPROC __glewClearBufferData; GLEW_FUN_EXPORT PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData; GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT; GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT; GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEPROC __glewClearTexImage; GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage; GLEW_FUN_EXPORT PFNGLCLIPCONTROLPROC __glewClipControl; GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute; GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect; GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB; GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData; GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB; GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB; GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit; GLEW_FUN_EXPORT PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer; GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus; GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData; GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData; GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi; GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv; GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv; GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D; GLEW_FUN_EXPORT PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D; GLEW_FUN_EXPORT PFNGLCREATEBUFFERSPROC __glewCreateBuffers; GLEW_FUN_EXPORT PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers; GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines; GLEW_FUN_EXPORT PFNGLCREATEQUERIESPROC __glewCreateQueries; GLEW_FUN_EXPORT PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers; GLEW_FUN_EXPORT PFNGLCREATESAMPLERSPROC __glewCreateSamplers; GLEW_FUN_EXPORT PFNGLCREATETEXTURESPROC __glewCreateTextures; GLEW_FUN_EXPORT PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks; GLEW_FUN_EXPORT PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib; GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib; GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange; GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData; GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv; GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv; GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv; GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v; GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv; GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v; GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv; GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage; GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv; GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv; GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData; GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData; GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer; GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample; GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERPROC __glewTextureBuffer; GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange; GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer; GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding; GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat; GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat; GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat; GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor; GLEW_FUN_EXPORT PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers; GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB; GLEW_FUN_EXPORT PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri; GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv; GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT; GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer; GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer; GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer; GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus; GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers; GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer; GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers; GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers; GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap; GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv; GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv; GLEW_FUN_EXPORT PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer; GLEW_FUN_EXPORT PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary; GLEW_FUN_EXPORT PFNGLPROGRAMBINARYPROC __glewProgramBinary; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage; GLEW_FUN_EXPORT PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage; GLEW_FUN_EXPORT PFNGLSPECIALIZESHADERARBPROC __glewSpecializeShaderARB; GLEW_FUN_EXPORT PFNGLGETUNIFORMDVPROC __glewGetUniformdv; GLEW_FUN_EXPORT PFNGLUNIFORM1DPROC __glewUniform1d; GLEW_FUN_EXPORT PFNGLUNIFORM1DVPROC __glewUniform1dv; GLEW_FUN_EXPORT PFNGLUNIFORM2DPROC __glewUniform2d; GLEW_FUN_EXPORT PFNGLUNIFORM2DVPROC __glewUniform2dv; GLEW_FUN_EXPORT PFNGLUNIFORM3DPROC __glewUniform3d; GLEW_FUN_EXPORT PFNGLUNIFORM3DVPROC __glewUniform3dv; GLEW_FUN_EXPORT PFNGLUNIFORM4DPROC __glewUniform4d; GLEW_FUN_EXPORT PFNGLUNIFORM4DVPROC __glewUniform4dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv; GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB; GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB; GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable; GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable; GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv; GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv; GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D; GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv; GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable; GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable; GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D; GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv; GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax; GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv; GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv; GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter; GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram; GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax; GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB; GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ; GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v; GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData; GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData; GLEW_FUN_EXPORT PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer; GLEW_FUN_EXPORT PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer; GLEW_FUN_EXPORT PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage; GLEW_FUN_EXPORT PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage; GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange; GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange; GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; GLEW_FUN_EXPORT PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase; GLEW_FUN_EXPORT PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange; GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures; GLEW_FUN_EXPORT PFNGLBINDSAMPLERSPROC __glewBindSamplers; GLEW_FUN_EXPORT PFNGLBINDTEXTURESPROC __glewBindTextures; GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect; GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB; GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB; GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB; GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB; GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB; GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB; GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB; GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB; GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB; GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPPROC __glewPolygonOffsetClamp; GLEW_FUN_EXPORT PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv; GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex; GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB; GLEW_FUN_EXPORT PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB; GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB; GLEW_FUN_EXPORT PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB; GLEW_FUN_EXPORT PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB; GLEW_FUN_EXPORT PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB; GLEW_FUN_EXPORT PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB; GLEW_FUN_EXPORT PFNGLGETNMAPIVARBPROC __glewGetnMapivARB; GLEW_FUN_EXPORT PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB; GLEW_FUN_EXPORT PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB; GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB; GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB; GLEW_FUN_EXPORT PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB; GLEW_FUN_EXPORT PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB; GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB; GLEW_FUN_EXPORT PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB; GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB; GLEW_FUN_EXPORT PFNGLBINDSAMPLERPROC __glewBindSampler; GLEW_FUN_EXPORT PFNGLDELETESAMPLERSPROC __glewDeleteSamplers; GLEW_FUN_EXPORT PFNGLGENSAMPLERSPROC __glewGenSamplers; GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv; GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv; GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv; GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv; GLEW_FUN_EXPORT PFNGLISSAMPLERPROC __glewIsSampler; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv; GLEW_FUN_EXPORT PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram; GLEW_FUN_EXPORT PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline; GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv; GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines; GLEW_FUN_EXPORT PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines; GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog; GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv; GLEW_FUN_EXPORT PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv; GLEW_FUN_EXPORT PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages; GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline; GLEW_FUN_EXPORT PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv; GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture; GLEW_FUN_EXPORT PFNGLMEMORYBARRIERPROC __glewMemoryBarrier; GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB; GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB; GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB; GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB; GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB; GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB; GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB; GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB; GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB; GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB; GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB; GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB; GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB; GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB; GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB; GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB; GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB; GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB; GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB; GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB; GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB; GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB; GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB; GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB; GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB; GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB; GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB; GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB; GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB; GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB; GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB; GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB; GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB; GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB; GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB; GLEW_FUN_EXPORT PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding; GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName; GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName; GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv; GLEW_FUN_EXPORT PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv; GLEW_FUN_EXPORT PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex; GLEW_FUN_EXPORT PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation; GLEW_FUN_EXPORT PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv; GLEW_FUN_EXPORT PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv; GLEW_FUN_EXPORT PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB; GLEW_FUN_EXPORT PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB; GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB; GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB; GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB; GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB; GLEW_FUN_EXPORT PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB; GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB; GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync; GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync; GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync; GLEW_FUN_EXPORT PFNGLGETINTEGER64VPROC __glewGetInteger64v; GLEW_FUN_EXPORT PFNGLGETSYNCIVPROC __glewGetSynciv; GLEW_FUN_EXPORT PFNGLISSYNCPROC __glewIsSync; GLEW_FUN_EXPORT PFNGLWAITSYNCPROC __glewWaitSync; GLEW_FUN_EXPORT PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv; GLEW_FUN_EXPORT PFNGLPATCHPARAMETERIPROC __glewPatchParameteri; GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERPROC __glewTextureBarrier; GLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB; GLEW_FUN_EXPORT PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange; GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB; GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv; GLEW_FUN_EXPORT PFNGLSAMPLEMASKIPROC __glewSampleMaski; GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample; GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample; GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DPROC __glewTexStorage1D; GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DPROC __glewTexStorage2D; GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DPROC __glewTexStorage3D; GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample; GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT; GLEW_FUN_EXPORT PFNGLTEXTUREVIEWPROC __glewTextureView; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v; GLEW_FUN_EXPORT PFNGLQUERYCOUNTERPROC __glewQueryCounter; GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback; GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback; GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks; GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback; GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback; GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback; GLEW_FUN_EXPORT PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream; GLEW_FUN_EXPORT PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed; GLEW_FUN_EXPORT PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced; GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB; GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB; GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB; GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB; GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase; GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv; GLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v; GLEW_FUN_EXPORT PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex; GLEW_FUN_EXPORT PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices; GLEW_FUN_EXPORT PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding; GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray; GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays; GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays; GLEW_FUN_EXPORT PFNGLISVERTEXARRAYPROC __glewIsVertexArray; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer; GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer; GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat; GLEW_FUN_EXPORT PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor; GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB; GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB; GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB; GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB; GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB; GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB; GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB; GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB; GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB; GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB; GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB; GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB; GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB; GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB; GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB; GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB; GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB; GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB; GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB; GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB; GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB; GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB; GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB; GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB; GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB; GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB; GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB; GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB; GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB; GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB; GLEW_FUN_EXPORT PFNGLCOLORP3UIPROC __glewColorP3ui; GLEW_FUN_EXPORT PFNGLCOLORP3UIVPROC __glewColorP3uiv; GLEW_FUN_EXPORT PFNGLCOLORP4UIPROC __glewColorP4ui; GLEW_FUN_EXPORT PFNGLCOLORP4UIVPROC __glewColorP4uiv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv; GLEW_FUN_EXPORT PFNGLNORMALP3UIPROC __glewNormalP3ui; GLEW_FUN_EXPORT PFNGLNORMALP3UIVPROC __glewNormalP3uiv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv; GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui; GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv; GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui; GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv; GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui; GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv; GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui; GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv; GLEW_FUN_EXPORT PFNGLVERTEXP2UIPROC __glewVertexP2ui; GLEW_FUN_EXPORT PFNGLVERTEXP2UIVPROC __glewVertexP2uiv; GLEW_FUN_EXPORT PFNGLVERTEXP3UIPROC __glewVertexP3ui; GLEW_FUN_EXPORT PFNGLVERTEXP3UIVPROC __glewVertexP3uiv; GLEW_FUN_EXPORT PFNGLVERTEXP4UIPROC __glewVertexP4ui; GLEW_FUN_EXPORT PFNGLVERTEXP4UIVPROC __glewVertexP4uiv; GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv; GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed; GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v; GLEW_FUN_EXPORT PFNGLGETFLOATI_VPROC __glewGetFloati_v; GLEW_FUN_EXPORT PFNGLSCISSORARRAYVPROC __glewScissorArrayv; GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDPROC __glewScissorIndexed; GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv; GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv; GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf; GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB; GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI; GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI; GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI; GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI; GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI; GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI; GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI; GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI; GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI; GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI; GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI; GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI; GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI; GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI; GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI; GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI; GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI; GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI; GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI; GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI; GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI; GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI; GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI; GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI; GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI; GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI; GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI; GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI; GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI; GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI; GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI; GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI; GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI; GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI; GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI; GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI; GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI; GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI; GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI; GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI; GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI; GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __glewDrawArraysInstancedBaseInstanceEXT; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseInstanceEXT; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseVertexBaseInstanceEXT; GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT; GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT; GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT; GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT; GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __glewBindFragDataLocationIndexedEXT; GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXEXTPROC __glewGetFragDataIndexEXT; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __glewGetProgramResourceLocationIndexEXT; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEEXTPROC __glewBufferStorageEXT; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT; GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEEXTPROC __glewClearTexImageEXT; GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEEXTPROC __glewClearTexSubImageEXT; GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT; GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT; GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT; GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT; GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT; GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT; GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT; GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT; GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT; GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT; GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAEXTPROC __glewCopyImageSubDataEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT; GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT; GLEW_FUN_EXPORT PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT; GLEW_FUN_EXPORT PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT; GLEW_FUN_EXPORT PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT; GLEW_FUN_EXPORT PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT; GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT; GLEW_FUN_EXPORT PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT; GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT; GLEW_FUN_EXPORT PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT; GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT; GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT; GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT; GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT; GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT; GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT; GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT; GLEW_FUN_EXPORT PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT; GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT; GLEW_FUN_EXPORT PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT; GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT; GLEW_FUN_EXPORT PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT; GLEW_FUN_EXPORT PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT; GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT; GLEW_FUN_EXPORT PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT; GLEW_FUN_EXPORT PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT; GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT; GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT; GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT; GLEW_FUN_EXPORT PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT; GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT; GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT; GLEW_FUN_EXPORT PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT; GLEW_FUN_EXPORT PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT; GLEW_FUN_EXPORT PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT; GLEW_FUN_EXPORT PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT; GLEW_FUN_EXPORT PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT; GLEW_FUN_EXPORT PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT; GLEW_FUN_EXPORT PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT; GLEW_FUN_EXPORT PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT; GLEW_FUN_EXPORT PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT; GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT; GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT; GLEW_FUN_EXPORT PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT; GLEW_FUN_EXPORT PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT; GLEW_FUN_EXPORT PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT; GLEW_FUN_EXPORT PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT; GLEW_FUN_EXPORT PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT; GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT; GLEW_FUN_EXPORT PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT; GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT; GLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT; GLEW_FUN_EXPORT PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT; GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT; GLEW_FUN_EXPORT PFNGLDISCARDFRAMEBUFFEREXTPROC __glewDiscardFramebufferEXT; GLEW_FUN_EXPORT PFNGLDRAWBUFFERSEXTPROC __glewDrawBuffersEXT; GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT; GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT; GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT; GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT; GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT; GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIEXTPROC __glewBlendEquationSeparateiEXT; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIEXTPROC __glewBlendEquationiEXT; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIEXTPROC __glewBlendFuncSeparateiEXT; GLEW_FUN_EXPORT PFNGLBLENDFUNCIEXTPROC __glewBlendFunciEXT; GLEW_FUN_EXPORT PFNGLCOLORMASKIEXTPROC __glewColorMaskiEXT; GLEW_FUN_EXPORT PFNGLDISABLEIEXTPROC __glewDisableiEXT; GLEW_FUN_EXPORT PFNGLENABLEIEXTPROC __glewEnableiEXT; GLEW_FUN_EXPORT PFNGLISENABLEDIEXTPROC __glewIsEnablediEXT; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXEXTPROC __glewDrawElementsBaseVertexEXT; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __glewDrawElementsInstancedBaseVertexEXT; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __glewDrawRangeElementsBaseVertexEXT; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __glewMultiDrawElementsBaseVertexEXT; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEEXTERNALEXTPROC __glewBufferStorageExternalEXT; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC __glewNamedBufferStorageExternalEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT; GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT; GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT; GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT; GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT; GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT; GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT; GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT; GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT; GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT; GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT; GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT; GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT; GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT; GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT; GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT; GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT; GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT; GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT; GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT; GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT; GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT; GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT; GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT; GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT; GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT; GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT; GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT; GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT; GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT; GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT; GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT; GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT; GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT; GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT; GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT; GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT; GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISOREXTPROC __glewVertexAttribDivisorEXT; GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC __glewFlushMappedBufferRangeEXT; GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEEXTPROC __glewMapBufferRangeEXT; GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEMEMEXTPROC __glewBufferStorageMemEXT; GLEW_FUN_EXPORT PFNGLCREATEMEMORYOBJECTSEXTPROC __glewCreateMemoryObjectsEXT; GLEW_FUN_EXPORT PFNGLDELETEMEMORYOBJECTSEXTPROC __glewDeleteMemoryObjectsEXT; GLEW_FUN_EXPORT PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC __glewGetMemoryObjectParameterivEXT; GLEW_FUN_EXPORT PFNGLGETUNSIGNEDBYTEI_VEXTPROC __glewGetUnsignedBytei_vEXT; GLEW_FUN_EXPORT PFNGLGETUNSIGNEDBYTEVEXTPROC __glewGetUnsignedBytevEXT; GLEW_FUN_EXPORT PFNGLISMEMORYOBJECTEXTPROC __glewIsMemoryObjectEXT; GLEW_FUN_EXPORT PFNGLMEMORYOBJECTPARAMETERIVEXTPROC __glewMemoryObjectParameterivEXT; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC __glewNamedBufferStorageMemEXT; GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM1DEXTPROC __glewTexStorageMem1DEXT; GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM2DEXTPROC __glewTexStorageMem2DEXT; GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC __glewTexStorageMem2DMultisampleEXT; GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM3DEXTPROC __glewTexStorageMem3DEXT; GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC __glewTexStorageMem3DMultisampleEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM1DEXTPROC __glewTextureStorageMem1DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM2DEXTPROC __glewTextureStorageMem2DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC __glewTextureStorageMem2DMultisampleEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM3DEXTPROC __glewTextureStorageMem3DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC __glewTextureStorageMem3DMultisampleEXT; GLEW_FUN_EXPORT PFNGLIMPORTMEMORYFDEXTPROC __glewImportMemoryFdEXT; GLEW_FUN_EXPORT PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC __glewImportMemoryWin32HandleEXT; GLEW_FUN_EXPORT PFNGLIMPORTMEMORYWIN32NAMEEXTPROC __glewImportMemoryWin32NameEXT; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC __glewMultiDrawArraysIndirectEXT; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC __glewMultiDrawElementsIndirectEXT; GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __glewFramebufferTexture2DMultisampleEXT; GLEW_FUN_EXPORT PFNGLDRAWBUFFERSINDEXEDEXTPROC __glewDrawBuffersIndexedEXT; GLEW_FUN_EXPORT PFNGLGETINTEGERI_VEXTPROC __glewGetIntegeri_vEXT; GLEW_FUN_EXPORT PFNGLREADBUFFERINDEXEDEXTPROC __glewReadBufferIndexedEXT; GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT; GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT; GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT; GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT; GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT; GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV; GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV; GLEW_FUN_EXPORT PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV; GLEW_FUN_EXPORT PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT; GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT; GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT; GLEW_FUN_EXPORT PFNGLDELETESEMAPHORESEXTPROC __glewDeleteSemaphoresEXT; GLEW_FUN_EXPORT PFNGLGENSEMAPHORESEXTPROC __glewGenSemaphoresEXT; GLEW_FUN_EXPORT PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC __glewGetSemaphoreParameterui64vEXT; GLEW_FUN_EXPORT PFNGLISSEMAPHOREEXTPROC __glewIsSemaphoreEXT; GLEW_FUN_EXPORT PFNGLSEMAPHOREPARAMETERUI64VEXTPROC __glewSemaphoreParameterui64vEXT; GLEW_FUN_EXPORT PFNGLSIGNALSEMAPHOREEXTPROC __glewSignalSemaphoreEXT; GLEW_FUN_EXPORT PFNGLWAITSEMAPHOREEXTPROC __glewWaitSemaphoreEXT; GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREFDEXTPROC __glewImportSemaphoreFdEXT; GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC __glewImportSemaphoreWin32HandleEXT; GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC __glewImportSemaphoreWin32NameEXT; GLEW_FUN_EXPORT PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT; GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT; GLEW_FUN_EXPORT PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT; GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT; GLEW_FUN_EXPORT PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT; GLEW_FUN_EXPORT PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC __glewClearPixelLocalStorageuiEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewFramebufferPixelLocalStorageSizeEXT; GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewGetFramebufferPixelLocalStorageSizeEXT; GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTEXTPROC __glewTexPageCommitmentEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT; GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT; GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT; GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT; GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT; GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT; GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT; GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT; GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT; GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT; GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT; GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT; GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT; GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT; GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DEXTPROC __glewTexStorage1DEXT; GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DEXTPROC __glewTexStorage2DEXT; GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DEXTPROC __glewTexStorage3DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT; GLEW_FUN_EXPORT PFNGLTEXTUREVIEWEXTPROC __glewTextureViewEXT; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT; GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT; GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT; GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT; GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT; GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT; GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT; GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT; GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT; GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT; GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT; GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT; GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT; GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT; GLEW_FUN_EXPORT PFNGLBINDARRAYSETEXTPROC __glewBindArraySetEXT; GLEW_FUN_EXPORT PFNGLCREATEARRAYSETEXTPROC __glewCreateArraySetExt; GLEW_FUN_EXPORT PFNGLDELETEARRAYSETSEXTPROC __glewDeleteArraySetsEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT; GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT; GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT; GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT; GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT; GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT; GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT; GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT; GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT; GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT; GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT; GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT; GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT; GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT; GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT; GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT; GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT; GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT; GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT; GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT; GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT; GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT; GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT; GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT; GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT; GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT; GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT; GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT; GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT; GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT; GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT; GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT; GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT; GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT; GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT; GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT; GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT; GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT; GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT; GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT; GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT; GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT; GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT; GLEW_FUN_EXPORT PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC __glewAcquireKeyedMutexWin32EXT; GLEW_FUN_EXPORT PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC __glewReleaseKeyedMutexWin32EXT; GLEW_FUN_EXPORT PFNGLWINDOWRECTANGLESEXTPROC __glewWindowRectanglesEXT; GLEW_FUN_EXPORT PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT; GLEW_FUN_EXPORT PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY; GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY; GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP; GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP; GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP; GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP; GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP; GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP; GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM; GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM; GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM; GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM; GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM; GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM; GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM; GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; GLEW_FUN_EXPORT PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL; GLEW_FUN_EXPORT PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL; GLEW_FUN_EXPORT PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL; GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; GLEW_FUN_EXPORT PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL; GLEW_FUN_EXPORT PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL; GLEW_FUN_EXPORT PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL; GLEW_FUN_EXPORT PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL; GLEW_FUN_EXPORT PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL; GLEW_FUN_EXPORT PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL; GLEW_FUN_EXPORT PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL; GLEW_FUN_EXPORT PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL; GLEW_FUN_EXPORT PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL; GLEW_FUN_EXPORT PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL; GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; GLEW_FUN_EXPORT PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert; GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog; GLEW_FUN_EXPORT PFNGLGETOBJECTLABELPROC __glewGetObjectLabel; GLEW_FUN_EXPORT PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel; GLEW_FUN_EXPORT PFNGLOBJECTLABELPROC __glewObjectLabel; GLEW_FUN_EXPORT PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel; GLEW_FUN_EXPORT PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup; GLEW_FUN_EXPORT PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup; GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSKHRPROC __glewMaxShaderCompilerThreadsKHR; GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv; GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv; GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv; GLEW_FUN_EXPORT PFNGLREADNPIXELSPROC __glewReadnPixels; GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled; GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion; GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion; GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion; GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion; GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX; GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX; GLEW_FUN_EXPORT PFNGLLGPUCOPYIMAGESUBDATANVXPROC __glewLGPUCopyImageSubDataNVX; GLEW_FUN_EXPORT PFNGLLGPUINTERLOCKNVXPROC __glewLGPUInterlockNVX; GLEW_FUN_EXPORT PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC __glewLGPUNamedBufferSubDataNVX; GLEW_FUN_EXPORT PFNGLSTEREOPARAMETERFNVPROC __glewStereoParameterfNV; GLEW_FUN_EXPORT PFNGLSTEREOPARAMETERINVPROC __glewStereoParameteriNV; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV; GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV; GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV; GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV; GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV; GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV; GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV; GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV; GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV; GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV; GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV; GLEW_FUN_EXPORT PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV; GLEW_FUN_EXPORT PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV; GLEW_FUN_EXPORT PFNGLVIEWPORTPOSITIONWSCALENVPROC __glewViewportPositionWScaleNV; GLEW_FUN_EXPORT PFNGLCALLCOMMANDLISTNVPROC __glewCallCommandListNV; GLEW_FUN_EXPORT PFNGLCOMMANDLISTSEGMENTSNVPROC __glewCommandListSegmentsNV; GLEW_FUN_EXPORT PFNGLCOMPILECOMMANDLISTNVPROC __glewCompileCommandListNV; GLEW_FUN_EXPORT PFNGLCREATECOMMANDLISTSNVPROC __glewCreateCommandListsNV; GLEW_FUN_EXPORT PFNGLCREATESTATESNVPROC __glewCreateStatesNV; GLEW_FUN_EXPORT PFNGLDELETECOMMANDLISTSNVPROC __glewDeleteCommandListsNV; GLEW_FUN_EXPORT PFNGLDELETESTATESNVPROC __glewDeleteStatesNV; GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSADDRESSNVPROC __glewDrawCommandsAddressNV; GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSNVPROC __glewDrawCommandsNV; GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC __glewDrawCommandsStatesAddressNV; GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSSTATESNVPROC __glewDrawCommandsStatesNV; GLEW_FUN_EXPORT PFNGLGETCOMMANDHEADERNVPROC __glewGetCommandHeaderNV; GLEW_FUN_EXPORT PFNGLGETSTAGEINDEXNVPROC __glewGetStageIndexNV; GLEW_FUN_EXPORT PFNGLISCOMMANDLISTNVPROC __glewIsCommandListNV; GLEW_FUN_EXPORT PFNGLISSTATENVPROC __glewIsStateNV; GLEW_FUN_EXPORT PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC __glewListDrawCommandsStatesClientNV; GLEW_FUN_EXPORT PFNGLSTATECAPTURENVPROC __glewStateCaptureNV; GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV; GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV; GLEW_FUN_EXPORT PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV; GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV; GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERINVPROC __glewConservativeRasterParameteriNV; GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATANVPROC __glewCopyBufferSubDataNV; GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV; GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; GLEW_FUN_EXPORT PFNGLDRAWBUFFERSNVPROC __glewDrawBuffersNV; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDNVPROC __glewDrawArraysInstancedNV; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDNVPROC __glewDrawElementsInstancedNV; GLEW_FUN_EXPORT PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV; GLEW_FUN_EXPORT PFNGLDRAWVKIMAGENVPROC __glewDrawVkImageNV; GLEW_FUN_EXPORT PFNGLGETVKPROCADDRNVPROC __glewGetVkProcAddrNV; GLEW_FUN_EXPORT PFNGLSIGNALVKFENCENVPROC __glewSignalVkFenceNV; GLEW_FUN_EXPORT PFNGLSIGNALVKSEMAPHORENVPROC __glewSignalVkSemaphoreNV; GLEW_FUN_EXPORT PFNGLWAITVKSEMAPHORENVPROC __glewWaitVkSemaphoreNV; GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV; GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV; GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV; GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV; GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV; GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV; GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV; GLEW_FUN_EXPORT PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV; GLEW_FUN_EXPORT PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV; GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV; GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV; GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV; GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV; GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV; GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV; GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV; GLEW_FUN_EXPORT PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV; GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV; GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV; GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV; GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV; GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERNVPROC __glewBlitFramebufferNV; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC __glewRenderbufferStorageMultisampleNV; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; GLEW_FUN_EXPORT PFNGLMULTICASTBARRIERNVPROC __glewMulticastBarrierNV; GLEW_FUN_EXPORT PFNGLMULTICASTBLITFRAMEBUFFERNVPROC __glewMulticastBlitFramebufferNV; GLEW_FUN_EXPORT PFNGLMULTICASTBUFFERSUBDATANVPROC __glewMulticastBufferSubDataNV; GLEW_FUN_EXPORT PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC __glewMulticastCopyBufferSubDataNV; GLEW_FUN_EXPORT PFNGLMULTICASTCOPYIMAGESUBDATANVPROC __glewMulticastCopyImageSubDataNV; GLEW_FUN_EXPORT PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewMulticastFramebufferSampleLocationsfvNV; GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC __glewMulticastGetQueryObjecti64vNV; GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTIVNVPROC __glewMulticastGetQueryObjectivNV; GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC __glewMulticastGetQueryObjectui64vNV; GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC __glewMulticastGetQueryObjectuivNV; GLEW_FUN_EXPORT PFNGLMULTICASTWAITSYNCNVPROC __glewMulticastWaitSyncNV; GLEW_FUN_EXPORT PFNGLRENDERGPUMASKNVPROC __glewRenderGpuMaskNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV; GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV; GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV; GLEW_FUN_EXPORT PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV; GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV; GLEW_FUN_EXPORT PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV; GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV; GLEW_FUN_EXPORT PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV; GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV; GLEW_FUN_EXPORT PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV; GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV; GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV; GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV; GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV; GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV; GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV; GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV; GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV; GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV; GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV; GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV; GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV; GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV; GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV; GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV; GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV; GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV; GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV; GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV; GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV; GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV; GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV; GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORNVPROC __glewVertexAttribDivisorNV; GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVNVPROC __glewUniformMatrix2x3fvNV; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVNVPROC __glewUniformMatrix2x4fvNV; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVNVPROC __glewUniformMatrix3x2fvNV; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVNVPROC __glewUniformMatrix3x4fvNV; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVNVPROC __glewUniformMatrix4x2fvNV; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVNVPROC __glewUniformMatrix4x3fvNV; GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV; GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV; GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV; GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV; GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV; GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV; GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV; GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV; GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV; GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV; GLEW_FUN_EXPORT PFNGLCOPYPATHNVPROC __glewCopyPathNV; GLEW_FUN_EXPORT PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV; GLEW_FUN_EXPORT PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV; GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV; GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV; GLEW_FUN_EXPORT PFNGLDELETEPATHSNVPROC __glewDeletePathsNV; GLEW_FUN_EXPORT PFNGLGENPATHSNVPROC __glewGenPathsNV; GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV; GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV; GLEW_FUN_EXPORT PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV; GLEW_FUN_EXPORT PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV; GLEW_FUN_EXPORT PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV; GLEW_FUN_EXPORT PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV; GLEW_FUN_EXPORT PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV; GLEW_FUN_EXPORT PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV; GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV; GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV; GLEW_FUN_EXPORT PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV; GLEW_FUN_EXPORT PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV; GLEW_FUN_EXPORT PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV; GLEW_FUN_EXPORT PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV; GLEW_FUN_EXPORT PFNGLISPATHNVPROC __glewIsPathNV; GLEW_FUN_EXPORT PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV; GLEW_FUN_EXPORT PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV; GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV; GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV; GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV; GLEW_FUN_EXPORT PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV; GLEW_FUN_EXPORT PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV; GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV; GLEW_FUN_EXPORT PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV; GLEW_FUN_EXPORT PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV; GLEW_FUN_EXPORT PFNGLPATHCOORDSNVPROC __glewPathCoordsNV; GLEW_FUN_EXPORT PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV; GLEW_FUN_EXPORT PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV; GLEW_FUN_EXPORT PFNGLPATHFOGGENNVPROC __glewPathFogGenNV; GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV; GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV; GLEW_FUN_EXPORT PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV; GLEW_FUN_EXPORT PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV; GLEW_FUN_EXPORT PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV; GLEW_FUN_EXPORT PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV; GLEW_FUN_EXPORT PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV; GLEW_FUN_EXPORT PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV; GLEW_FUN_EXPORT PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV; GLEW_FUN_EXPORT PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV; GLEW_FUN_EXPORT PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV; GLEW_FUN_EXPORT PFNGLPATHSTRINGNVPROC __glewPathStringNV; GLEW_FUN_EXPORT PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV; GLEW_FUN_EXPORT PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV; GLEW_FUN_EXPORT PFNGLPATHTEXGENNVPROC __glewPathTexGenNV; GLEW_FUN_EXPORT PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV; GLEW_FUN_EXPORT PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV; GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV; GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV; GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV; GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV; GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV; GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV; GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV; GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV; GLEW_FUN_EXPORT PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV; GLEW_FUN_EXPORT PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV; GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV; GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV; GLEW_FUN_EXPORT PFNGLPOLYGONMODENVPROC __glewPolygonModeNV; GLEW_FUN_EXPORT PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV; GLEW_FUN_EXPORT PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV; GLEW_FUN_EXPORT PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV; GLEW_FUN_EXPORT PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV; GLEW_FUN_EXPORT PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV; GLEW_FUN_EXPORT PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV; GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV; GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV; GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV; GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV; GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV; GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV; GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV; GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV; GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV; GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV; GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV; GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV; GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV; GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV; GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV; GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV; GLEW_FUN_EXPORT PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV; GLEW_FUN_EXPORT PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV; GLEW_FUN_EXPORT PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV; GLEW_FUN_EXPORT PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV; GLEW_FUN_EXPORT PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV; GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV; GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORMUI64NVPROC __glewUniformui64NV; GLEW_FUN_EXPORT PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DNVPROC __glewCompressedTexImage3DNV; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC __glewCompressedTexSubImage3DNV; GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DNVPROC __glewCopyTexSubImage3DNV; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERNVPROC __glewFramebufferTextureLayerNV; GLEW_FUN_EXPORT PFNGLTEXIMAGE3DNVPROC __glewTexImage3DNV; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DNVPROC __glewTexSubImage3DNV; GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV; GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV; GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV; GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV; GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV; GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV; GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV; GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV; GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV; GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLVDPAUFININVPROC __glewVDPAUFiniNV; GLEW_FUN_EXPORT PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV; GLEW_FUN_EXPORT PFNGLVDPAUINITNVPROC __glewVDPAUInitNV; GLEW_FUN_EXPORT PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV; GLEW_FUN_EXPORT PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV; GLEW_FUN_EXPORT PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV; GLEW_FUN_EXPORT PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV; GLEW_FUN_EXPORT PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV; GLEW_FUN_EXPORT PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV; GLEW_FUN_EXPORT PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV; GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV; GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV; GLEW_FUN_EXPORT PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV; GLEW_FUN_EXPORT PFNGLCOLORFORMATNVPROC __glewColorFormatNV; GLEW_FUN_EXPORT PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV; GLEW_FUN_EXPORT PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV; GLEW_FUN_EXPORT PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV; GLEW_FUN_EXPORT PFNGLINDEXFORMATNVPROC __glewIndexFormatNV; GLEW_FUN_EXPORT PFNGLNORMALFORMATNVPROC __glewNormalFormatNV; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV; GLEW_FUN_EXPORT PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV; GLEW_FUN_EXPORT PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV; GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV; GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV; GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV; GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV; GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV; GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV; GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV; GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV; GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV; GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV; GLEW_FUN_EXPORT PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV; GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV; GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV; GLEW_FUN_EXPORT PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV; GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV; GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV; GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV; GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV; GLEW_FUN_EXPORT PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV; GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV; GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV; GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV; GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYFVNVPROC __glewDepthRangeArrayfvNV; GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDFNVPROC __glewDepthRangeIndexedfNV; GLEW_FUN_EXPORT PFNGLDISABLEINVPROC __glewDisableiNV; GLEW_FUN_EXPORT PFNGLENABLEINVPROC __glewEnableiNV; GLEW_FUN_EXPORT PFNGLGETFLOATI_VNVPROC __glewGetFloati_vNV; GLEW_FUN_EXPORT PFNGLISENABLEDINVPROC __glewIsEnablediNV; GLEW_FUN_EXPORT PFNGLSCISSORARRAYVNVPROC __glewScissorArrayvNV; GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDNVPROC __glewScissorIndexedNV; GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVNVPROC __glewScissorIndexedvNV; GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVNVPROC __glewViewportArrayvNV; GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFNVPROC __glewViewportIndexedfNV; GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVNVPROC __glewViewportIndexedfvNV; GLEW_FUN_EXPORT PFNGLVIEWPORTSWIZZLENVPROC __glewViewportSwizzleNV; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __glewFramebufferTextureMultisampleMultiviewOVR; GLEW_FUN_EXPORT PFNGLALPHAFUNCQCOMPROC __glewAlphaFuncQCOM; GLEW_FUN_EXPORT PFNGLDISABLEDRIVERCONTROLQCOMPROC __glewDisableDriverControlQCOM; GLEW_FUN_EXPORT PFNGLENABLEDRIVERCONTROLQCOMPROC __glewEnableDriverControlQCOM; GLEW_FUN_EXPORT PFNGLGETDRIVERCONTROLSTRINGQCOMPROC __glewGetDriverControlStringQCOM; GLEW_FUN_EXPORT PFNGLGETDRIVERCONTROLSQCOMPROC __glewGetDriverControlsQCOM; GLEW_FUN_EXPORT PFNGLEXTGETBUFFERPOINTERVQCOMPROC __glewExtGetBufferPointervQCOM; GLEW_FUN_EXPORT PFNGLEXTGETBUFFERSQCOMPROC __glewExtGetBuffersQCOM; GLEW_FUN_EXPORT PFNGLEXTGETFRAMEBUFFERSQCOMPROC __glewExtGetFramebuffersQCOM; GLEW_FUN_EXPORT PFNGLEXTGETRENDERBUFFERSQCOMPROC __glewExtGetRenderbuffersQCOM; GLEW_FUN_EXPORT PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC __glewExtGetTexLevelParameterivQCOM; GLEW_FUN_EXPORT PFNGLEXTGETTEXSUBIMAGEQCOMPROC __glewExtGetTexSubImageQCOM; GLEW_FUN_EXPORT PFNGLEXTGETTEXTURESQCOMPROC __glewExtGetTexturesQCOM; GLEW_FUN_EXPORT PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC __glewExtTexObjectStateOverrideiQCOM; GLEW_FUN_EXPORT PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC __glewExtGetProgramBinarySourceQCOM; GLEW_FUN_EXPORT PFNGLEXTGETPROGRAMSQCOMPROC __glewExtGetProgramsQCOM; GLEW_FUN_EXPORT PFNGLEXTGETSHADERSQCOMPROC __glewExtGetShadersQCOM; GLEW_FUN_EXPORT PFNGLEXTISPROGRAMBINARYQCOMPROC __glewExtIsProgramBinaryQCOM; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC __glewFramebufferFoveationConfigQCOM; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC __glewFramebufferFoveationParametersQCOM; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC __glewFramebufferFetchBarrierQCOM; GLEW_FUN_EXPORT PFNGLENDTILINGQCOMPROC __glewEndTilingQCOM; GLEW_FUN_EXPORT PFNGLSTARTTILINGQCOMPROC __glewStartTilingQCOM; GLEW_FUN_EXPORT PFNGLALPHAFUNCXPROC __glewAlphaFuncx; GLEW_FUN_EXPORT PFNGLCLEARCOLORXPROC __glewClearColorx; GLEW_FUN_EXPORT PFNGLCLEARDEPTHXPROC __glewClearDepthx; GLEW_FUN_EXPORT PFNGLCOLOR4XPROC __glewColor4x; GLEW_FUN_EXPORT PFNGLDEPTHRANGEXPROC __glewDepthRangex; GLEW_FUN_EXPORT PFNGLFOGXPROC __glewFogx; GLEW_FUN_EXPORT PFNGLFOGXVPROC __glewFogxv; GLEW_FUN_EXPORT PFNGLFRUSTUMFPROC __glewFrustumf; GLEW_FUN_EXPORT PFNGLFRUSTUMXPROC __glewFrustumx; GLEW_FUN_EXPORT PFNGLLIGHTMODELXPROC __glewLightModelx; GLEW_FUN_EXPORT PFNGLLIGHTMODELXVPROC __glewLightModelxv; GLEW_FUN_EXPORT PFNGLLIGHTXPROC __glewLightx; GLEW_FUN_EXPORT PFNGLLIGHTXVPROC __glewLightxv; GLEW_FUN_EXPORT PFNGLLINEWIDTHXPROC __glewLineWidthx; GLEW_FUN_EXPORT PFNGLLOADMATRIXXPROC __glewLoadMatrixx; GLEW_FUN_EXPORT PFNGLMATERIALXPROC __glewMaterialx; GLEW_FUN_EXPORT PFNGLMATERIALXVPROC __glewMaterialxv; GLEW_FUN_EXPORT PFNGLMULTMATRIXXPROC __glewMultMatrixx; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x; GLEW_FUN_EXPORT PFNGLNORMAL3XPROC __glewNormal3x; GLEW_FUN_EXPORT PFNGLORTHOFPROC __glewOrthof; GLEW_FUN_EXPORT PFNGLORTHOXPROC __glewOrthox; GLEW_FUN_EXPORT PFNGLPOINTSIZEXPROC __glewPointSizex; GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx; GLEW_FUN_EXPORT PFNGLROTATEXPROC __glewRotatex; GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex; GLEW_FUN_EXPORT PFNGLSCALEXPROC __glewScalex; GLEW_FUN_EXPORT PFNGLTEXENVXPROC __glewTexEnvx; GLEW_FUN_EXPORT PFNGLTEXENVXVPROC __glewTexEnvxv; GLEW_FUN_EXPORT PFNGLTEXPARAMETERXPROC __glewTexParameterx; GLEW_FUN_EXPORT PFNGLTRANSLATEXPROC __glewTranslatex; GLEW_FUN_EXPORT PFNGLCLIPPLANEFPROC __glewClipPlanef; GLEW_FUN_EXPORT PFNGLCLIPPLANEXPROC __glewClipPlanex; GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef; GLEW_FUN_EXPORT PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex; GLEW_FUN_EXPORT PFNGLGETFIXEDVPROC __glewGetFixedv; GLEW_FUN_EXPORT PFNGLGETLIGHTXVPROC __glewGetLightxv; GLEW_FUN_EXPORT PFNGLGETMATERIALXVPROC __glewGetMaterialxv; GLEW_FUN_EXPORT PFNGLGETTEXENVXVPROC __glewGetTexEnvxv; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXPROC __glewPointParameterx; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv; GLEW_FUN_EXPORT PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES; GLEW_FUN_EXPORT PFNGLTEXPARAMETERXVPROC __glewTexParameterxv; GLEW_FUN_EXPORT PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL; GLEW_FUN_EXPORT PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL; GLEW_FUN_EXPORT PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL; GLEW_FUN_EXPORT PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL; GLEW_FUN_EXPORT PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL; GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS; GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS; GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS; GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS; GLEW_FUN_EXPORT PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC __glewInterleavedTextureCoordSetsSGIS; GLEW_FUN_EXPORT PFNGLSELECTTEXTURECOORDSETSGISPROC __glewSelectTextureCoordSetSGIS; GLEW_FUN_EXPORT PFNGLSELECTTEXTURESGISPROC __glewSelectTextureSGIS; GLEW_FUN_EXPORT PFNGLSELECTTEXTURETRANSFORMSGISPROC __glewSelectTextureTransformSGIS; GLEW_FUN_EXPORT PFNGLMULTISAMPLESUBRECTPOSSGISPROC __glewMultisampleSubRectPosSGIS; GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS; GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS; GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS; GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS; GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS; GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX; GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX; GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX; GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX; GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX; GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX; GLEW_FUN_EXPORT PFNGLADDRESSSPACEPROC __glewAddressSpace; GLEW_FUN_EXPORT PFNGLDATAPIPEPROC __glewDataPipe; GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; GLEW_FUN_EXPORT PFNGLFOGLAYERSSGIXPROC __glewFogLayersSGIX; GLEW_FUN_EXPORT PFNGLGETFOGLAYERSSGIXPROC __glewGetFogLayersSGIX; GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX; GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX; GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX; GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX; GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX; GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX; GLEW_FUN_EXPORT PFNGLIGLOOINTERFACESGIXPROC __glewIglooInterfaceSGIX; GLEW_FUN_EXPORT PFNGLALLOCMPEGPREDICTORSSGIXPROC __glewAllocMPEGPredictorsSGIX; GLEW_FUN_EXPORT PFNGLDELETEMPEGPREDICTORSSGIXPROC __glewDeleteMPEGPredictorsSGIX; GLEW_FUN_EXPORT PFNGLGENMPEGPREDICTORSSGIXPROC __glewGenMPEGPredictorsSGIX; GLEW_FUN_EXPORT PFNGLGETMPEGPARAMETERFVSGIXPROC __glewGetMPEGParameterfvSGIX; GLEW_FUN_EXPORT PFNGLGETMPEGPARAMETERIVSGIXPROC __glewGetMPEGParameterivSGIX; GLEW_FUN_EXPORT PFNGLGETMPEGPREDICTORSGIXPROC __glewGetMPEGPredictorSGIX; GLEW_FUN_EXPORT PFNGLGETMPEGQUANTTABLEUBVPROC __glewGetMPEGQuantTableubv; GLEW_FUN_EXPORT PFNGLISMPEGPREDICTORSGIXPROC __glewIsMPEGPredictorSGIX; GLEW_FUN_EXPORT PFNGLMPEGPREDICTORSGIXPROC __glewMPEGPredictorSGIX; GLEW_FUN_EXPORT PFNGLMPEGQUANTTABLEUBVPROC __glewMPEGQuantTableubv; GLEW_FUN_EXPORT PFNGLSWAPMPEGPREDICTORSSGIXPROC __glewSwapMPEGPredictorsSGIX; GLEW_FUN_EXPORT PFNGLGETNONLINLIGHTFVSGIXPROC __glewGetNonlinLightfvSGIX; GLEW_FUN_EXPORT PFNGLGETNONLINMATERIALFVSGIXPROC __glewGetNonlinMaterialfvSGIX; GLEW_FUN_EXPORT PFNGLNONLINLIGHTFVSGIXPROC __glewNonlinLightfvSGIX; GLEW_FUN_EXPORT PFNGLNONLINMATERIALFVSGIXPROC __glewNonlinMaterialfvSGIX; GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; GLEW_FUN_EXPORT PFNGLDEFORMSGIXPROC __glewDeformSGIX; GLEW_FUN_EXPORT PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC __glewLoadIdentityDeformationMapSGIX; GLEW_FUN_EXPORT PFNGLMESHBREADTHSGIXPROC __glewMeshBreadthSGIX; GLEW_FUN_EXPORT PFNGLMESHSTRIDESGIXPROC __glewMeshStrideSGIX; GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX; GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX; GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX; GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX; GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX; GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX; GLEW_FUN_EXPORT PFNGLGETVECTOROPERATIONSGIXPROC __glewGetVectorOperationSGIX; GLEW_FUN_EXPORT PFNGLVECTOROPERATIONSGIXPROC __glewVectorOperationSGIX; GLEW_FUN_EXPORT PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC __glewAreVertexArraysResidentSGIX; GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYSGIXPROC __glewBindVertexArraySGIX; GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSSGIXPROC __glewDeleteVertexArraysSGIX; GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSSGIXPROC __glewGenVertexArraysSGIX; GLEW_FUN_EXPORT PFNGLISVERTEXARRAYSGIXPROC __glewIsVertexArraySGIX; GLEW_FUN_EXPORT PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC __glewPrioritizeVertexArraysSGIX; GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI; GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI; GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI; GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI; GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI; GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC __glewGetPixelTransformParameterfvSGI; GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC __glewGetPixelTransformParameterivSGI; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFSGIPROC __glewPixelTransformParameterfSGI; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC __glewPixelTransformParameterfvSGI; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERISGIPROC __glewPixelTransformParameteriSGI; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC __glewPixelTransformParameterivSGI; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMSGIPROC __glewPixelTransformSGI; GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN; GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN; GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN; GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN; GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN; GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN; GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN; GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_0; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_2; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_3; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_2; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_3; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_4; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_5; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_6; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_blend_minmax_factor; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_compressed_3DC_texture; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_compressed_ATC_texture; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_framebuffer_sample_positions; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gcn_shader; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_half_float; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int16; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int64; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_interleaved_elements; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_occlusion_query_event; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_pinned_memory; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_program_binary_Z400; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_query_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sample_positions; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_atomic_counter_ops; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_ballot; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_explicit_vertex_parameter; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_value_export; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_trinary_minmax; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sparse_texture; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_stencil_operation_extended; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_gather_bias_lod; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback4; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_layer; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_viewport_index; GLEW_VAR_EXPORT GLboolean __GLEW_ANDROID_extension_pack_es31a; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_depth_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_blit; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_instanced_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_pack_reverse_row_order; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_program_binary; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt1; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt3; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt5; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_usage; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_timer_query; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_translated_shader_source; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_clip_distance; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_color_buffer_packed_float; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_copy_texture_levels; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_framebuffer_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_object_purgeable; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_rgb_422; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_row_bytes; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_sync; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_2D_limited_npot; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_format_BGRA8888; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_max_level; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_packed_float; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_program_evaluators; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_1_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_2_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_arrays_of_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_base_instance; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_bindless_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_buffer_storage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clip_control; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compressed_texture_pixel_storage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_variable_group_size; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conditional_render_inverted; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conservative_depth; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_image; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cull_distance; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_debug_output; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_buffer_float; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_derivative_control; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_direct_state_access; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_enhanced_layouts; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_uniform_location; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_layer_viewport; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader_interlock; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_no_attachments; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_sRGB; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_geometry_shader4; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_program_binary; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_texture_sub_image; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gl_spirv; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader5; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_int64; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_indirect_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query2; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_invalidate_subdata; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_alignment; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_bind; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query2; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_parallel_shader_compile; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pipeline_statistics_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_polygon_offset_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_post_depth_coverage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_program_interface_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_query_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robust_buffer_access_behavior; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_application_isolation; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_share_group_isolation; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_locations; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cubemap_per_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counter_ops; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_ballot; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_clock; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_draw_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_group_vote; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_load_store; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_size; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_precision; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_stencil_export; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_storage_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_subroutine; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_image_samples; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_viewport_layer_array; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_420pack; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_packing; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture2; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_spirv_extensions; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_stencil_texturing; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_barrier; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object_rgb32; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_range; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_bptc; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_rgtc; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map_array; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_anisotropic; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_minmax; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_levels; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_stencil8; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_view; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_timer_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback2; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback3; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_instanced; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_overflow_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_uniform_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_bgra; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_64bit; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_binding; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; GLEW_VAR_EXPORT GLboolean __GLEW_ARM_mali_program_binary; GLEW_VAR_EXPORT GLboolean __GLEW_ARM_mali_shader_binary; GLEW_VAR_EXPORT GLboolean __GLEW_ARM_rgba8; GLEW_VAR_EXPORT GLboolean __GLEW_ARM_shader_framebuffer_fetch; GLEW_VAR_EXPORT GLboolean __GLEW_ARM_shader_framebuffer_fetch_depth_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites; GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3; GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route; GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_meminfo; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams; GLEW_VAR_EXPORT GLboolean __GLEW_EGL_KHR_context_flush_control; GLEW_VAR_EXPORT GLboolean __GLEW_EGL_NV_robustness_video_memory_purge; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_EGL_image_array; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_YUV_target; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_base_instance; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_extended; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_buffer_storage; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clear_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_cull_distance; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_buffer_float; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_buffer_half_float; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compressed_ETC1_RGB8_sub_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_conservative_depth; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_image; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_label; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_marker; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_direct_state_access; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_discard_framebuffer; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers_indexed; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_elements_base_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_external_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_float_blend; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_frag_depth; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_point_size; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader5; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_instanced_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_map_buffer_range; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object_fd; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object_win32; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiple_textures; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisampled_render_to_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisampled_render_to_texture2; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiview_draw_buffers; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_post_depth_coverage; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pvrtc_sRGB; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_raster_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_read_format_bgra; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_render_snorm; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sRGB; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sRGB_write_control; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore_fd; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore_win32; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_framebuffer_fetch; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_group_vote; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_formatted; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_implicit_conversions; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_integer_mix; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_io_blocks; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_non_constant_global_initializers; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_pixel_local_storage; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_pixel_local_storage2; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_texture_lod; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_samplers; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture2; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_astc_decode_mode; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_bptc; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map_array; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_minmax; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_format_BGRA8888; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_norm16; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rg; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_R8; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_RG8; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_decode; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_snorm; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_storage; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_type_2_10_10_10_REV; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_view; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_unpack_subimage; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_setXXX; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_attrib_64bit; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_win32_keyed_mutex; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_window_rectangles; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_x11_sync_object; GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator; GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker; GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes; GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform; GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test; GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_conservative_rasterization; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_fragment_shader_ordering; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_framebuffer_CMAA; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_map_texture; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_performance_query; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced_coherent; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_context_flush_control; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_debug; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_no_error; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_parallel_shader_compile; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robust_buffer_access_behavior; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robustness; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_hdr; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_ldr; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_sliced_3d; GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region; GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_shader_integer_functions; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; GLEW_VAR_EXPORT GLboolean __GLEW_NVX_blend_equation_advanced_multi_draw_buffers; GLEW_VAR_EXPORT GLboolean __GLEW_NVX_conditional_render; GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info; GLEW_VAR_EXPORT GLboolean __GLEW_NVX_linked_gpu_multicast; GLEW_VAR_EXPORT GLboolean __GLEW_NV_3dvision_settings; GLEW_VAR_EXPORT GLboolean __GLEW_NV_EGL_stream_consumer_external; GLEW_VAR_EXPORT GLboolean __GLEW_NV_alpha_to_coverage_dither_control; GLEW_VAR_EXPORT GLboolean __GLEW_NV_bgr; GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect_count; GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_texture; GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced; GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced_coherent; GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_minmax_factor; GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; GLEW_VAR_EXPORT GLboolean __GLEW_NV_clip_space_w_scaling; GLEW_VAR_EXPORT GLboolean __GLEW_NV_command_list; GLEW_VAR_EXPORT GLboolean __GLEW_NV_compute_program5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render; GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster; GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_dilate; GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_pre_snap_triangles; GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image; GLEW_VAR_EXPORT GLboolean __GLEW_NV_deep_texture3D; GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_buffers; GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_instanced; GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_texture; GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_vulkan_image; GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_attrib_location; GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fbo_color_attachments; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fill_rectangle; GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_coverage_to_color; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_shader_interlock; GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_blit; GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_mixed_samples; GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; GLEW_VAR_EXPORT GLboolean __GLEW_NV_generate_mipmap_sRGB; GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader_passthrough; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_multicast; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5_mem_extended; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; GLEW_VAR_EXPORT GLboolean __GLEW_NV_image_formats; GLEW_VAR_EXPORT GLboolean __GLEW_NV_instanced_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_NV_internalformat_sample_query; GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent; GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_coverage; GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint; GLEW_VAR_EXPORT GLboolean __GLEW_NV_non_square_matrices; GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; GLEW_VAR_EXPORT GLboolean __GLEW_NV_pack_subimage; GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_float; GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_float_linear; GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering; GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering_shared_edge; GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; GLEW_VAR_EXPORT GLboolean __GLEW_NV_platform_binary; GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; GLEW_VAR_EXPORT GLboolean __GLEW_NV_polygon_mode; GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video; GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_depth; GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_depth_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_robustness_video_memory_purge; GLEW_VAR_EXPORT GLboolean __GLEW_NV_sRGB_formats; GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_locations; GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_mask_override_coverage; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_counters; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float64; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_fp16_vector; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_int64; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_noperspective_interpolation; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_storage_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_group; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_shuffle; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shadow_samplers_array; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shadow_samplers_cube; GLEW_VAR_EXPORT GLboolean __GLEW_NV_stereo_view_rendering; GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_array; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_border_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_latc; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_s3tc; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_s3tc_update; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_npot_2D_mipmap; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle_compressed; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3; GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback; GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_uniform_buffer_unified_memory; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vdpau_interop; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_attrib_integer_64bit; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_buffer_unified_memory; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_video_capture; GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array; GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_swizzle; GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace; GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview; GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview2; GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview_multisampled_render_to_texture; GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_alpha_test; GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_binning_control; GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_driver_control; GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_extended_get; GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_extended_get2; GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_framebuffer_foveated; GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_perfmon_global_mode; GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_shader_framebuffer_fetch_noncoherent; GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_tiled_rendering; GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_writeonly_rendering; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_0_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_1_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_enable; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_error_string; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_extension_query; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_log; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_proc_address; GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_clip_band_hint; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_line_texgen; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multitexture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_point_line_texgen; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_shared_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_g_instruments; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_r_instruments; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_timer_instruments; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_cadd; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_cmultiply; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_calligraphic_fragment; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_color_matrix_accuracy; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_color_table_index_mode; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_complex_polar; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_convolution_accuracy; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_cube_map; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_cylinder_texgen; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_datapipe; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_decimation; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_pass_instrument; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_dvc; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_blend; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_factor_to_alpha; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_layers; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_patchy; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_scale; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_lighting_space; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragments_instrument; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_icc_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_igloo_interface; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_image_compression; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_impact_pixel_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_instrument_error; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_line_quality_hint; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_mpeg1; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_mpeg2; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_nonlinear_lighting_pervertex; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_nurbs_eval; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_occlusion_instrument; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_packed_6bytes; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_lod; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_tiles; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_polynomial_ffd; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_quad_mesh; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_scalebias_hint; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_slim; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_spotlight_cutoff; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_subdiv_patch; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_subsample; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_mipmap_anisotropic; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_phase; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_supersample; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vector_ops; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_array_object; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb_subsample; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcba; GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; GLEW_VAR_EXPORT GLboolean __GLEW_SGI_complex; GLEW_VAR_EXPORT GLboolean __GLEW_SGI_complex_type; GLEW_VAR_EXPORT GLboolean __GLEW_SGI_fft; GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table; GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading; GLEW_VAR_EXPORT GLboolean __GLEW_WIN_scene_markerXXX; GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; /* ------------------------------------------------------------------------- */ /* error codes */ #define GLEW_OK 0 #define GLEW_NO_ERROR 0 #define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */ #define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* Need at least OpenGL 1.1 */ #define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* Need at least GLX 1.2 */ #define GLEW_ERROR_NO_GLX_DISPLAY 4 /* Need GLX display for GLX support */ /* string codes */ #define GLEW_VERSION 1 #define GLEW_VERSION_MAJOR 2 #define GLEW_VERSION_MINOR 3 #define GLEW_VERSION_MICRO 4 /* ------------------------------------------------------------------------- */ /* GLEW version info */ /* VERSION 2.1.0 VERSION_MAJOR 2 VERSION_MINOR 1 VERSION_MICRO 0 */ /* API */ GLEWAPI GLenum GLEWAPIENTRY glewInit (void); GLEWAPI GLboolean GLEWAPIENTRY glewIsSupported (const char *name); #define glewIsExtensionSupported(x) glewIsSupported(x) #ifndef GLEW_GET_VAR #define GLEW_GET_VAR(x) (*(const GLboolean*)&x) #endif #ifndef GLEW_GET_FUN #define GLEW_GET_FUN(x) x #endif GLEWAPI GLboolean glewExperimental; GLEWAPI GLboolean GLEWAPIENTRY glewGetExtension (const char *name); GLEWAPI const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error); GLEWAPI const GLubyte * GLEWAPIENTRY glewGetString (GLenum name); #ifdef __cplusplus } #endif #ifdef GLEW_APIENTRY_DEFINED #undef GLEW_APIENTRY_DEFINED #undef APIENTRY #endif #ifdef GLEW_CALLBACK_DEFINED #undef GLEW_CALLBACK_DEFINED #undef CALLBACK #endif #ifdef GLEW_WINGDIAPI_DEFINED #undef GLEW_WINGDIAPI_DEFINED #undef WINGDIAPI #endif #undef GLAPI /* #undef GLEWAPI */ #endif /* __glew_h__ */ asymptote-3.05/backports/glew/CMakeLists.txt0000644000000000000000000000041115031566105017650 0ustar rootrootcmake_minimum_required(VERSION 3.27) project(GLEW) add_library(GLEW STATIC ${CMAKE_CURRENT_LIST_DIR}/src/glew.c) target_include_directories(GLEW PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) if (WIN32) target_compile_definitions(GLEW PUBLIC GLEW_STATIC) endif() asymptote-3.05/backports/glew/src/0000755000000000000000000000000015031566105015703 5ustar rootrootasymptote-3.05/backports/glew/src/glew.c0000644000000000000000000455533615031566105017032 0ustar rootroot/* ** The OpenGL Extension Wrangler Library ** Copyright (C) 2008-2017, Nigel Stewart ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** ** * Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** * The name of the author may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ** THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef GLEW_INCLUDE #include #else #include GLEW_INCLUDE #endif #if defined(GLEW_OSMESA) # define GLAPI extern # include #elif defined(GLEW_EGL) # include #elif defined(_WIN32) /* * If NOGDI is defined, wingdi.h won't be included by windows.h, and thus * wglGetProcAddress won't be declared. It will instead be implicitly declared, * potentially incorrectly, which we don't want. */ # if defined(NOGDI) # undef NOGDI # endif # include #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) # include #endif #include /* For size_t */ #if defined(GLEW_EGL) #elif defined(GLEW_REGAL) /* In GLEW_REGAL mode we call direcly into the linked libRegal.so glGetProcAddressREGAL for looking up the GL function pointers. */ # undef glGetProcAddressREGAL # ifdef WIN32 extern void * __stdcall glGetProcAddressREGAL(const GLchar *name); static void * (__stdcall * regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL; # else extern void * glGetProcAddressREGAL(const GLchar *name); static void * (*regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL; # endif # define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) #elif defined(__sgi) || defined (__sun) || defined(__HAIKU__) || defined(GLEW_APPLE_GLX) #include #include #include void* dlGetProcAddress (const GLubyte* name) { static void* h = NULL; static void* gpa; if (h == NULL) { if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL; gpa = dlsym(h, "glXGetProcAddress"); } if (gpa != NULL) return ((void*(*)(const GLubyte*))gpa)(name); else return dlsym(h, (const char*)name); } #endif /* __sgi || __sun || GLEW_APPLE_GLX */ #if defined(__APPLE__) #include #include #include #ifdef MAC_OS_X_VERSION_10_3 #include void* NSGLGetProcAddress (const GLubyte *name) { static void* image = NULL; void* addr; if (NULL == image) { image = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_LAZY); } if( !image ) return NULL; addr = dlsym(image, (const char*)name); if( addr ) return addr; #ifdef GLEW_APPLE_GLX return dlGetProcAddress( name ); // try next for glx symbols #else return NULL; #endif } #else #include void* NSGLGetProcAddress (const GLubyte *name) { static const struct mach_header* image = NULL; NSSymbol symbol; char* symbolName; if (NULL == image) { image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR); } /* prepend a '_' for the Unix C symbol mangling convention */ symbolName = malloc(strlen((const char*)name) + 2); strcpy(symbolName+1, (const char*)name); symbolName[0] = '_'; symbol = NULL; /* if (NSIsSymbolNameDefined(symbolName)) symbol = NSLookupAndBindSymbol(symbolName); */ symbol = image ? NSLookupSymbolInImage(image, symbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : NULL; free(symbolName); if( symbol ) return NSAddressOfSymbol(symbol); #ifdef GLEW_APPLE_GLX return dlGetProcAddress( name ); // try next for glx symbols #else return NULL; #endif } #endif /* MAC_OS_X_VERSION_10_3 */ #endif /* __APPLE__ */ /* * Define glewGetProcAddress. */ #if defined(GLEW_REGAL) # define glewGetProcAddress(name) regalGetProcAddress((const GLchar *)name) #elif defined(GLEW_OSMESA) # define glewGetProcAddress(name) OSMesaGetProcAddress((const char *)name) #elif defined(GLEW_EGL) # define glewGetProcAddress(name) eglGetProcAddress((const char *)name) #elif defined(_WIN32) # define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name) #elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) # define glewGetProcAddress(name) NSGLGetProcAddress(name) #elif defined(__sgi) || defined(__sun) || defined(__HAIKU__) # define glewGetProcAddress(name) dlGetProcAddress(name) #elif defined(__ANDROID__) # define glewGetProcAddress(name) NULL /* TODO */ #elif defined(__native_client__) # define glewGetProcAddress(name) NULL /* TODO */ #else /* __linux */ # define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) #endif /* * Redefine GLEW_GET_VAR etc without const cast */ #undef GLEW_GET_VAR # define GLEW_GET_VAR(x) (x) #ifdef WGLEW_GET_VAR # undef WGLEW_GET_VAR # define WGLEW_GET_VAR(x) (x) #endif /* WGLEW_GET_VAR */ #ifdef GLXEW_GET_VAR # undef GLXEW_GET_VAR # define GLXEW_GET_VAR(x) (x) #endif /* GLXEW_GET_VAR */ #ifdef EGLEW_GET_VAR # undef EGLEW_GET_VAR # define EGLEW_GET_VAR(x) (x) #endif /* EGLEW_GET_VAR */ /* * GLEW, just like OpenGL or GLU, does not rely on the standard C library. * These functions implement the functionality required in this file. */ static GLuint _glewStrLen (const GLubyte* s) { GLuint i=0; if (s == NULL) return 0; while (s[i] != '\0') i++; return i; } static GLuint _glewStrCLen (const GLubyte* s, GLubyte c) { GLuint i=0; if (s == NULL) return 0; while (s[i] != '\0' && s[i] != c) i++; return i; } static GLuint _glewStrCopy(char *d, const char *s, char c) { GLuint i=0; if (s == NULL) return 0; while (s[i] != '\0' && s[i] != c) { d[i] = s[i]; i++; } d[i] = '\0'; return i; } #if !defined(GLEW_OSMESA) #if !defined(__APPLE__) || defined(GLEW_APPLE_GLX) static GLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n) { GLuint i=0; if(a == NULL || b == NULL) return (a == NULL && b == NULL && n == 0) ? GL_TRUE : GL_FALSE; while (i < n && a[i] != '\0' && b[i] != '\0' && a[i] == b[i]) i++; return i == n ? GL_TRUE : GL_FALSE; } #endif #endif static GLboolean _glewStrSame1 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) { while (*na > 0 && (**a == ' ' || **a == '\n' || **a == '\r' || **a == '\t')) { (*a)++; (*na)--; } if(*na >= nb) { GLuint i=0; while (i < nb && (*a)[i] == b[i]) i++; if(i == nb) { *a = *a + nb; *na = *na - nb; return GL_TRUE; } } return GL_FALSE; } static GLboolean _glewStrSame2 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) { if(*na >= nb) { GLuint i=0; while (i < nb && (*a)[i] == b[i]) i++; if(i == nb) { *a = *a + nb; *na = *na - nb; return GL_TRUE; } } return GL_FALSE; } static GLboolean _glewStrSame3 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) { if(*na >= nb) { GLuint i=0; while (i < nb && (*a)[i] == b[i]) i++; if (i == nb && (*na == nb || (*a)[i] == ' ' || (*a)[i] == '\n' || (*a)[i] == '\r' || (*a)[i] == '\t')) { *a = *a + nb; *na = *na - nb; return GL_TRUE; } } return GL_FALSE; } /* * Search for name in the extensions string. Use of strstr() * is not sufficient because extension names can be prefixes of * other extension names. Could use strtok() but the constant * string returned by glGetString might be in read-only memory. */ #if !defined(GLEW_OSMESA) #if !defined(__APPLE__) || defined(GLEW_APPLE_GLX) static GLboolean _glewSearchExtension (const char* name, const GLubyte *start, const GLubyte *end) { const GLubyte* p; GLuint len = _glewStrLen((const GLubyte*)name); p = start; while (p < end) { GLuint n = _glewStrCLen(p, ' '); if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; p += n+1; } return GL_FALSE; } #endif #endif PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D = NULL; PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL; PFNGLTEXIMAGE3DPROC __glewTexImage3D = NULL; PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D = NULL; PFNGLACTIVETEXTUREPROC __glewActiveTexture = NULL; PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture = NULL; PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D = NULL; PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D = NULL; PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D = NULL; PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage = NULL; PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd = NULL; PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf = NULL; PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd = NULL; PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf = NULL; PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d = NULL; PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv = NULL; PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f = NULL; PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv = NULL; PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i = NULL; PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv = NULL; PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s = NULL; PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv = NULL; PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d = NULL; PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv = NULL; PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f = NULL; PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv = NULL; PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i = NULL; PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv = NULL; PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s = NULL; PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv = NULL; PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d = NULL; PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv = NULL; PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f = NULL; PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv = NULL; PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i = NULL; PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv = NULL; PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s = NULL; PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv = NULL; PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d = NULL; PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv = NULL; PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f = NULL; PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv = NULL; PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i = NULL; PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv = NULL; PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s = NULL; PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv = NULL; PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage = NULL; PFNGLBLENDCOLORPROC __glewBlendColor = NULL; PFNGLBLENDEQUATIONPROC __glewBlendEquation = NULL; PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate = NULL; PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer = NULL; PFNGLFOGCOORDDPROC __glewFogCoordd = NULL; PFNGLFOGCOORDDVPROC __glewFogCoorddv = NULL; PFNGLFOGCOORDFPROC __glewFogCoordf = NULL; PFNGLFOGCOORDFVPROC __glewFogCoordfv = NULL; PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays = NULL; PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements = NULL; PFNGLPOINTPARAMETERFPROC __glewPointParameterf = NULL; PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv = NULL; PFNGLPOINTPARAMETERIPROC __glewPointParameteri = NULL; PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv = NULL; PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b = NULL; PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv = NULL; PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d = NULL; PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv = NULL; PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f = NULL; PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv = NULL; PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i = NULL; PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv = NULL; PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s = NULL; PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv = NULL; PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub = NULL; PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv = NULL; PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui = NULL; PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv = NULL; PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us = NULL; PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv = NULL; PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer = NULL; PFNGLWINDOWPOS2DPROC __glewWindowPos2d = NULL; PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv = NULL; PFNGLWINDOWPOS2FPROC __glewWindowPos2f = NULL; PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv = NULL; PFNGLWINDOWPOS2IPROC __glewWindowPos2i = NULL; PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv = NULL; PFNGLWINDOWPOS2SPROC __glewWindowPos2s = NULL; PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv = NULL; PFNGLWINDOWPOS3DPROC __glewWindowPos3d = NULL; PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv = NULL; PFNGLWINDOWPOS3FPROC __glewWindowPos3f = NULL; PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv = NULL; PFNGLWINDOWPOS3IPROC __glewWindowPos3i = NULL; PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv = NULL; PFNGLWINDOWPOS3SPROC __glewWindowPos3s = NULL; PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv = NULL; PFNGLBEGINQUERYPROC __glewBeginQuery = NULL; PFNGLBINDBUFFERPROC __glewBindBuffer = NULL; PFNGLBUFFERDATAPROC __glewBufferData = NULL; PFNGLBUFFERSUBDATAPROC __glewBufferSubData = NULL; PFNGLDELETEBUFFERSPROC __glewDeleteBuffers = NULL; PFNGLDELETEQUERIESPROC __glewDeleteQueries = NULL; PFNGLENDQUERYPROC __glewEndQuery = NULL; PFNGLGENBUFFERSPROC __glewGenBuffers = NULL; PFNGLGENQUERIESPROC __glewGenQueries = NULL; PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv = NULL; PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv = NULL; PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData = NULL; PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv = NULL; PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv = NULL; PFNGLGETQUERYIVPROC __glewGetQueryiv = NULL; PFNGLISBUFFERPROC __glewIsBuffer = NULL; PFNGLISQUERYPROC __glewIsQuery = NULL; PFNGLMAPBUFFERPROC __glewMapBuffer = NULL; PFNGLUNMAPBUFFERPROC __glewUnmapBuffer = NULL; PFNGLATTACHSHADERPROC __glewAttachShader = NULL; PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation = NULL; PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate = NULL; PFNGLCOMPILESHADERPROC __glewCompileShader = NULL; PFNGLCREATEPROGRAMPROC __glewCreateProgram = NULL; PFNGLCREATESHADERPROC __glewCreateShader = NULL; PFNGLDELETEPROGRAMPROC __glewDeleteProgram = NULL; PFNGLDELETESHADERPROC __glewDeleteShader = NULL; PFNGLDETACHSHADERPROC __glewDetachShader = NULL; PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray = NULL; PFNGLDRAWBUFFERSPROC __glewDrawBuffers = NULL; PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray = NULL; PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib = NULL; PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform = NULL; PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders = NULL; PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation = NULL; PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog = NULL; PFNGLGETPROGRAMIVPROC __glewGetProgramiv = NULL; PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog = NULL; PFNGLGETSHADERSOURCEPROC __glewGetShaderSource = NULL; PFNGLGETSHADERIVPROC __glewGetShaderiv = NULL; PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation = NULL; PFNGLGETUNIFORMFVPROC __glewGetUniformfv = NULL; PFNGLGETUNIFORMIVPROC __glewGetUniformiv = NULL; PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv = NULL; PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv = NULL; PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv = NULL; PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv = NULL; PFNGLISPROGRAMPROC __glewIsProgram = NULL; PFNGLISSHADERPROC __glewIsShader = NULL; PFNGLLINKPROGRAMPROC __glewLinkProgram = NULL; PFNGLSHADERSOURCEPROC __glewShaderSource = NULL; PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate = NULL; PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate = NULL; PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate = NULL; PFNGLUNIFORM1FPROC __glewUniform1f = NULL; PFNGLUNIFORM1FVPROC __glewUniform1fv = NULL; PFNGLUNIFORM1IPROC __glewUniform1i = NULL; PFNGLUNIFORM1IVPROC __glewUniform1iv = NULL; PFNGLUNIFORM2FPROC __glewUniform2f = NULL; PFNGLUNIFORM2FVPROC __glewUniform2fv = NULL; PFNGLUNIFORM2IPROC __glewUniform2i = NULL; PFNGLUNIFORM2IVPROC __glewUniform2iv = NULL; PFNGLUNIFORM3FPROC __glewUniform3f = NULL; PFNGLUNIFORM3FVPROC __glewUniform3fv = NULL; PFNGLUNIFORM3IPROC __glewUniform3i = NULL; PFNGLUNIFORM3IVPROC __glewUniform3iv = NULL; PFNGLUNIFORM4FPROC __glewUniform4f = NULL; PFNGLUNIFORM4FVPROC __glewUniform4fv = NULL; PFNGLUNIFORM4IPROC __glewUniform4i = NULL; PFNGLUNIFORM4IVPROC __glewUniform4iv = NULL; PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv = NULL; PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv = NULL; PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv = NULL; PFNGLUSEPROGRAMPROC __glewUseProgram = NULL; PFNGLVALIDATEPROGRAMPROC __glewValidateProgram = NULL; PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d = NULL; PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv = NULL; PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f = NULL; PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv = NULL; PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s = NULL; PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv = NULL; PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d = NULL; PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv = NULL; PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f = NULL; PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv = NULL; PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s = NULL; PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv = NULL; PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d = NULL; PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv = NULL; PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f = NULL; PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv = NULL; PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s = NULL; PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv = NULL; PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv = NULL; PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv = NULL; PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv = NULL; PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub = NULL; PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv = NULL; PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv = NULL; PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv = NULL; PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv = NULL; PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d = NULL; PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv = NULL; PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f = NULL; PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv = NULL; PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv = NULL; PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s = NULL; PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv = NULL; PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv = NULL; PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv = NULL; PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv = NULL; PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer = NULL; PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv = NULL; PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv = NULL; PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv = NULL; PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv = NULL; PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv = NULL; PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv = NULL; PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender = NULL; PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback = NULL; PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation = NULL; PFNGLCLAMPCOLORPROC __glewClampColor = NULL; PFNGLCLEARBUFFERFIPROC __glewClearBufferfi = NULL; PFNGLCLEARBUFFERFVPROC __glewClearBufferfv = NULL; PFNGLCLEARBUFFERIVPROC __glewClearBufferiv = NULL; PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv = NULL; PFNGLCOLORMASKIPROC __glewColorMaski = NULL; PFNGLDISABLEIPROC __glewDisablei = NULL; PFNGLENABLEIPROC __glewEnablei = NULL; PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender = NULL; PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback = NULL; PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v = NULL; PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation = NULL; PFNGLGETSTRINGIPROC __glewGetStringi = NULL; PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv = NULL; PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv = NULL; PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying = NULL; PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv = NULL; PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv = NULL; PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv = NULL; PFNGLISENABLEDIPROC __glewIsEnabledi = NULL; PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv = NULL; PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv = NULL; PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings = NULL; PFNGLUNIFORM1UIPROC __glewUniform1ui = NULL; PFNGLUNIFORM1UIVPROC __glewUniform1uiv = NULL; PFNGLUNIFORM2UIPROC __glewUniform2ui = NULL; PFNGLUNIFORM2UIVPROC __glewUniform2uiv = NULL; PFNGLUNIFORM3UIPROC __glewUniform3ui = NULL; PFNGLUNIFORM3UIVPROC __glewUniform3uiv = NULL; PFNGLUNIFORM4UIPROC __glewUniform4ui = NULL; PFNGLUNIFORM4UIVPROC __glewUniform4uiv = NULL; PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i = NULL; PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv = NULL; PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui = NULL; PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv = NULL; PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i = NULL; PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv = NULL; PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui = NULL; PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv = NULL; PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i = NULL; PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv = NULL; PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui = NULL; PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv = NULL; PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv = NULL; PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i = NULL; PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv = NULL; PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv = NULL; PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv = NULL; PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui = NULL; PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv = NULL; PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv = NULL; PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer = NULL; PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced = NULL; PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced = NULL; PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex = NULL; PFNGLTEXBUFFERPROC __glewTexBuffer = NULL; PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture = NULL; PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v = NULL; PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v = NULL; PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor = NULL; PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei = NULL; PFNGLBLENDEQUATIONIPROC __glewBlendEquationi = NULL; PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei = NULL; PFNGLBLENDFUNCIPROC __glewBlendFunci = NULL; PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading = NULL; PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus = NULL; PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage = NULL; PFNGLGETNTEXIMAGEPROC __glewGetnTexImage = NULL; PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv = NULL; PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC __glewMultiDrawArraysIndirectCount = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC __glewMultiDrawElementsIndirectCount = NULL; PFNGLSPECIALIZESHADERPROC __glewSpecializeShader = NULL; PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX = NULL; PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD = NULL; PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD = NULL; PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD = NULL; PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD = NULL; PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD = NULL; PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD = NULL; PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD = NULL; PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD = NULL; PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewFramebufferSamplePositionsfvAMD = NULL; PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC __glewGetFramebufferParameterfvAMD = NULL; PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC __glewGetNamedFramebufferParameterfvAMD = NULL; PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewNamedFramebufferSamplePositionsfvAMD = NULL; PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD = NULL; PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD = NULL; PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD = NULL; PFNGLGENNAMESAMDPROC __glewGenNamesAMD = NULL; PFNGLISNAMEAMDPROC __glewIsNameAMD = NULL; PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD = NULL; PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD = NULL; PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD = NULL; PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD = NULL; PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD = NULL; PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD = NULL; PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD = NULL; PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD = NULL; PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD = NULL; PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD = NULL; PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD = NULL; PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD = NULL; PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD = NULL; PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD = NULL; PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD = NULL; PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD = NULL; PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD = NULL; PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD = NULL; PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE = NULL; PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE = NULL; PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE = NULL; PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE = NULL; PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE = NULL; PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE = NULL; PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE = NULL; PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE = NULL; PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE = NULL; PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE = NULL; PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE = NULL; PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE = NULL; PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE = NULL; PFNGLISQUERYANGLEPROC __glewIsQueryANGLE = NULL; PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE = NULL; PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE = NULL; PFNGLCOPYTEXTURELEVELSAPPLEPROC __glewCopyTextureLevelsAPPLE = NULL; PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL; PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL; PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL; PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE = NULL; PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE = NULL; PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE = NULL; PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE = NULL; PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE = NULL; PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE = NULL; PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE = NULL; PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE = NULL; PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE = NULL; PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE = NULL; PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE = NULL; PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC __glewRenderbufferStorageMultisampleAPPLE = NULL; PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC __glewResolveMultisampleFramebufferAPPLE = NULL; PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE = NULL; PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE = NULL; PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE = NULL; PFNGLCLIENTWAITSYNCAPPLEPROC __glewClientWaitSyncAPPLE = NULL; PFNGLDELETESYNCAPPLEPROC __glewDeleteSyncAPPLE = NULL; PFNGLFENCESYNCAPPLEPROC __glewFenceSyncAPPLE = NULL; PFNGLGETINTEGER64VAPPLEPROC __glewGetInteger64vAPPLE = NULL; PFNGLGETSYNCIVAPPLEPROC __glewGetSyncivAPPLE = NULL; PFNGLISSYNCAPPLEPROC __glewIsSyncAPPLE = NULL; PFNGLWAITSYNCAPPLEPROC __glewWaitSyncAPPLE = NULL; PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE = NULL; PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE = NULL; PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE = NULL; PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE = NULL; PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE = NULL; PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE = NULL; PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE = NULL; PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE = NULL; PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE = NULL; PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE = NULL; PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE = NULL; PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE = NULL; PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE = NULL; PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE = NULL; PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE = NULL; PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE = NULL; PFNGLCLEARDEPTHFPROC __glewClearDepthf = NULL; PFNGLDEPTHRANGEFPROC __glewDepthRangef = NULL; PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat = NULL; PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler = NULL; PFNGLSHADERBINARYPROC __glewShaderBinary = NULL; PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion = NULL; PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB = NULL; PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance = NULL; PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB = NULL; PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB = NULL; PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB = NULL; PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB = NULL; PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB = NULL; PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB = NULL; PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB = NULL; PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB = NULL; PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB = NULL; PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB = NULL; PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB = NULL; PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB = NULL; PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB = NULL; PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB = NULL; PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB = NULL; PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB = NULL; PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed = NULL; PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex = NULL; PFNGLBUFFERSTORAGEPROC __glewBufferStorage = NULL; PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB = NULL; PFNGLCLEARBUFFERDATAPROC __glewClearBufferData = NULL; PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData = NULL; PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT = NULL; PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT = NULL; PFNGLCLEARTEXIMAGEPROC __glewClearTexImage = NULL; PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage = NULL; PFNGLCLIPCONTROLPROC __glewClipControl = NULL; PFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL; PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute = NULL; PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect = NULL; PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB = NULL; PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData = NULL; PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData = NULL; PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB = NULL; PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB = NULL; PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB = NULL; PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB = NULL; PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit = NULL; PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer = NULL; PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus = NULL; PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData = NULL; PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData = NULL; PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi = NULL; PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv = NULL; PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv = NULL; PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D = NULL; PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData = NULL; PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D = NULL; PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D = NULL; PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D = NULL; PFNGLCREATEBUFFERSPROC __glewCreateBuffers = NULL; PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers = NULL; PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines = NULL; PFNGLCREATEQUERIESPROC __glewCreateQueries = NULL; PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers = NULL; PFNGLCREATESAMPLERSPROC __glewCreateSamplers = NULL; PFNGLCREATETEXTURESPROC __glewCreateTextures = NULL; PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks = NULL; PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays = NULL; PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib = NULL; PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib = NULL; PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange = NULL; PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap = NULL; PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage = NULL; PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v = NULL; PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv = NULL; PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv = NULL; PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData = NULL; PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv = NULL; PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv = NULL; PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv = NULL; PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v = NULL; PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv = NULL; PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v = NULL; PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv = NULL; PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage = NULL; PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv = NULL; PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv = NULL; PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv = NULL; PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv = NULL; PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv = NULL; PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv = NULL; PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v = NULL; PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v = NULL; PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv = NULL; PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv = NULL; PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv = NULL; PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv = NULL; PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData = NULL; PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData = NULL; PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer = NULL; PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange = NULL; PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData = NULL; PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage = NULL; PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData = NULL; PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer = NULL; PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers = NULL; PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri = NULL; PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer = NULL; PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer = NULL; PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture = NULL; PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample = NULL; PFNGLTEXTUREBUFFERPROC __glewTextureBuffer = NULL; PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange = NULL; PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv = NULL; PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv = NULL; PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf = NULL; PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv = NULL; PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri = NULL; PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv = NULL; PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D = NULL; PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D = NULL; PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample = NULL; PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D = NULL; PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample = NULL; PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D = NULL; PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D = NULL; PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D = NULL; PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase = NULL; PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange = NULL; PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer = NULL; PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding = NULL; PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat = NULL; PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat = NULL; PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat = NULL; PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor = NULL; PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer = NULL; PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer = NULL; PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers = NULL; PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB = NULL; PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB = NULL; PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB = NULL; PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB = NULL; PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB = NULL; PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex = NULL; PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex = NULL; PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex = NULL; PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect = NULL; PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect = NULL; PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri = NULL; PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv = NULL; PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT = NULL; PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT = NULL; PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer = NULL; PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer = NULL; PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer = NULL; PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus = NULL; PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers = NULL; PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers = NULL; PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer = NULL; PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D = NULL; PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D = NULL; PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D = NULL; PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer = NULL; PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers = NULL; PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers = NULL; PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap = NULL; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv = NULL; PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv = NULL; PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer = NULL; PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer = NULL; PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample = NULL; PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB = NULL; PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB = NULL; PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB = NULL; PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB = NULL; PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary = NULL; PFNGLPROGRAMBINARYPROC __glewProgramBinary = NULL; PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri = NULL; PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage = NULL; PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage = NULL; PFNGLSPECIALIZESHADERARBPROC __glewSpecializeShaderARB = NULL; PFNGLGETUNIFORMDVPROC __glewGetUniformdv = NULL; PFNGLUNIFORM1DPROC __glewUniform1d = NULL; PFNGLUNIFORM1DVPROC __glewUniform1dv = NULL; PFNGLUNIFORM2DPROC __glewUniform2d = NULL; PFNGLUNIFORM2DVPROC __glewUniform2dv = NULL; PFNGLUNIFORM3DPROC __glewUniform3d = NULL; PFNGLUNIFORM3DVPROC __glewUniform3dv = NULL; PFNGLUNIFORM4DPROC __glewUniform4d = NULL; PFNGLUNIFORM4DVPROC __glewUniform4dv = NULL; PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv = NULL; PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv = NULL; PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv = NULL; PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv = NULL; PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv = NULL; PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv = NULL; PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv = NULL; PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv = NULL; PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv = NULL; PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB = NULL; PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB = NULL; PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB = NULL; PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB = NULL; PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB = NULL; PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB = NULL; PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB = NULL; PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB = NULL; PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB = NULL; PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB = NULL; PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB = NULL; PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB = NULL; PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB = NULL; PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB = NULL; PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB = NULL; PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB = NULL; PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB = NULL; PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB = NULL; PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB = NULL; PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB = NULL; PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB = NULL; PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB = NULL; PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB = NULL; PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB = NULL; PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB = NULL; PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB = NULL; PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB = NULL; PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB = NULL; PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB = NULL; PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB = NULL; PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB = NULL; PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB = NULL; PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB = NULL; PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB = NULL; PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB = NULL; PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB = NULL; PFNGLCOLORSUBTABLEPROC __glewColorSubTable = NULL; PFNGLCOLORTABLEPROC __glewColorTable = NULL; PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv = NULL; PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv = NULL; PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D = NULL; PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D = NULL; PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf = NULL; PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv = NULL; PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri = NULL; PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv = NULL; PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable = NULL; PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable = NULL; PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D = NULL; PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D = NULL; PFNGLGETCOLORTABLEPROC __glewGetColorTable = NULL; PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv = NULL; PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv = NULL; PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter = NULL; PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv = NULL; PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv = NULL; PFNGLGETHISTOGRAMPROC __glewGetHistogram = NULL; PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv = NULL; PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv = NULL; PFNGLGETMINMAXPROC __glewGetMinmax = NULL; PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv = NULL; PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv = NULL; PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter = NULL; PFNGLHISTOGRAMPROC __glewHistogram = NULL; PFNGLMINMAXPROC __glewMinmax = NULL; PFNGLRESETHISTOGRAMPROC __glewResetHistogram = NULL; PFNGLRESETMINMAXPROC __glewResetMinmax = NULL; PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D = NULL; PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB = NULL; PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB = NULL; PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB = NULL; PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB = NULL; PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ = NULL; PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v = NULL; PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData = NULL; PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData = NULL; PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer = NULL; PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer = NULL; PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage = NULL; PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage = NULL; PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange = NULL; PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange = NULL; PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB = NULL; PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB = NULL; PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB = NULL; PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB = NULL; PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB = NULL; PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase = NULL; PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange = NULL; PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures = NULL; PFNGLBINDSAMPLERSPROC __glewBindSamplers = NULL; PFNGLBINDTEXTURESPROC __glewBindTextures = NULL; PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers = NULL; PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect = NULL; PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB = NULL; PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB = NULL; PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB = NULL; PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB = NULL; PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB = NULL; PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB = NULL; PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB = NULL; PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB = NULL; PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB = NULL; PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB = NULL; PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB = NULL; PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB = NULL; PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB = NULL; PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB = NULL; PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB = NULL; PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB = NULL; PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB = NULL; PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB = NULL; PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB = NULL; PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB = NULL; PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB = NULL; PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB = NULL; PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB = NULL; PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB = NULL; PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB = NULL; PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB = NULL; PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB = NULL; PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB = NULL; PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB = NULL; PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB = NULL; PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB = NULL; PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB = NULL; PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB = NULL; PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB = NULL; PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB = NULL; PFNGLBEGINQUERYARBPROC __glewBeginQueryARB = NULL; PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB = NULL; PFNGLENDQUERYARBPROC __glewEndQueryARB = NULL; PFNGLGENQUERIESARBPROC __glewGenQueriesARB = NULL; PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB = NULL; PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB = NULL; PFNGLGETQUERYIVARBPROC __glewGetQueryivARB = NULL; PFNGLISQUERYARBPROC __glewIsQueryARB = NULL; PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB = NULL; PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB = NULL; PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB = NULL; PFNGLPOLYGONOFFSETCLAMPPROC __glewPolygonOffsetClamp = NULL; PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv = NULL; PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex = NULL; PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation = NULL; PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex = NULL; PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName = NULL; PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv = NULL; PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex = NULL; PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB = NULL; PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB = NULL; PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB = NULL; PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB = NULL; PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB = NULL; PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB = NULL; PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB = NULL; PFNGLGETNMAPIVARBPROC __glewGetnMapivARB = NULL; PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB = NULL; PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB = NULL; PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB = NULL; PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB = NULL; PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB = NULL; PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB = NULL; PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB = NULL; PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB = NULL; PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB = NULL; PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB = NULL; PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB = NULL; PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB = NULL; PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB = NULL; PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB = NULL; PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB = NULL; PFNGLBINDSAMPLERPROC __glewBindSampler = NULL; PFNGLDELETESAMPLERSPROC __glewDeleteSamplers = NULL; PFNGLGENSAMPLERSPROC __glewGenSamplers = NULL; PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv = NULL; PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv = NULL; PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv = NULL; PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv = NULL; PFNGLISSAMPLERPROC __glewIsSampler = NULL; PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv = NULL; PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv = NULL; PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf = NULL; PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv = NULL; PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri = NULL; PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv = NULL; PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram = NULL; PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline = NULL; PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv = NULL; PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines = NULL; PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines = NULL; PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog = NULL; PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv = NULL; PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline = NULL; PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d = NULL; PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv = NULL; PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f = NULL; PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv = NULL; PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i = NULL; PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv = NULL; PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui = NULL; PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv = NULL; PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d = NULL; PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv = NULL; PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f = NULL; PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv = NULL; PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i = NULL; PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv = NULL; PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui = NULL; PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv = NULL; PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d = NULL; PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv = NULL; PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f = NULL; PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv = NULL; PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i = NULL; PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv = NULL; PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui = NULL; PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv = NULL; PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d = NULL; PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv = NULL; PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f = NULL; PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv = NULL; PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i = NULL; PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv = NULL; PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui = NULL; PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv = NULL; PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv = NULL; PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv = NULL; PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv = NULL; PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv = NULL; PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv = NULL; PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv = NULL; PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv = NULL; PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv = NULL; PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv = NULL; PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv = NULL; PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv = NULL; PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv = NULL; PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv = NULL; PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv = NULL; PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv = NULL; PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv = NULL; PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv = NULL; PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv = NULL; PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages = NULL; PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline = NULL; PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv = NULL; PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture = NULL; PFNGLMEMORYBARRIERPROC __glewMemoryBarrier = NULL; PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB = NULL; PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB = NULL; PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB = NULL; PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB = NULL; PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB = NULL; PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB = NULL; PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB = NULL; PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB = NULL; PFNGLGETHANDLEARBPROC __glewGetHandleARB = NULL; PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB = NULL; PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB = NULL; PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB = NULL; PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB = NULL; PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB = NULL; PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB = NULL; PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB = NULL; PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB = NULL; PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB = NULL; PFNGLUNIFORM1FARBPROC __glewUniform1fARB = NULL; PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB = NULL; PFNGLUNIFORM1IARBPROC __glewUniform1iARB = NULL; PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB = NULL; PFNGLUNIFORM2FARBPROC __glewUniform2fARB = NULL; PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB = NULL; PFNGLUNIFORM2IARBPROC __glewUniform2iARB = NULL; PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB = NULL; PFNGLUNIFORM3FARBPROC __glewUniform3fARB = NULL; PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB = NULL; PFNGLUNIFORM3IARBPROC __glewUniform3iARB = NULL; PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB = NULL; PFNGLUNIFORM4FARBPROC __glewUniform4fARB = NULL; PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB = NULL; PFNGLUNIFORM4IARBPROC __glewUniform4iARB = NULL; PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB = NULL; PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB = NULL; PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB = NULL; PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB = NULL; PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB = NULL; PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB = NULL; PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding = NULL; PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName = NULL; PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName = NULL; PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv = NULL; PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv = NULL; PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex = NULL; PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation = NULL; PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv = NULL; PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv = NULL; PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB = NULL; PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB = NULL; PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB = NULL; PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB = NULL; PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB = NULL; PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB = NULL; PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB = NULL; PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB = NULL; PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync = NULL; PFNGLDELETESYNCPROC __glewDeleteSync = NULL; PFNGLFENCESYNCPROC __glewFenceSync = NULL; PFNGLGETINTEGER64VPROC __glewGetInteger64v = NULL; PFNGLGETSYNCIVPROC __glewGetSynciv = NULL; PFNGLISSYNCPROC __glewIsSync = NULL; PFNGLWAITSYNCPROC __glewWaitSync = NULL; PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv = NULL; PFNGLPATCHPARAMETERIPROC __glewPatchParameteri = NULL; PFNGLTEXTUREBARRIERPROC __glewTextureBarrier = NULL; PFNGLTEXBUFFERARBPROC __glewTexBufferARB = NULL; PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange = NULL; PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT = NULL; PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB = NULL; PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB = NULL; PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB = NULL; PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB = NULL; PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv = NULL; PFNGLSAMPLEMASKIPROC __glewSampleMaski = NULL; PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample = NULL; PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample = NULL; PFNGLTEXSTORAGE1DPROC __glewTexStorage1D = NULL; PFNGLTEXSTORAGE2DPROC __glewTexStorage2D = NULL; PFNGLTEXSTORAGE3DPROC __glewTexStorage3D = NULL; PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample = NULL; PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample = NULL; PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT = NULL; PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT = NULL; PFNGLTEXTUREVIEWPROC __glewTextureView = NULL; PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v = NULL; PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v = NULL; PFNGLQUERYCOUNTERPROC __glewQueryCounter = NULL; PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback = NULL; PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks = NULL; PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback = NULL; PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks = NULL; PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback = NULL; PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback = NULL; PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback = NULL; PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed = NULL; PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream = NULL; PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed = NULL; PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv = NULL; PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced = NULL; PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced = NULL; PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB = NULL; PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB = NULL; PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB = NULL; PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB = NULL; PFNGLBINDBUFFERBASEPROC __glewBindBufferBase = NULL; PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange = NULL; PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName = NULL; PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv = NULL; PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName = NULL; PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv = NULL; PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v = NULL; PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex = NULL; PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices = NULL; PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding = NULL; PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray = NULL; PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays = NULL; PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays = NULL; PFNGLISVERTEXARRAYPROC __glewIsVertexArray = NULL; PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv = NULL; PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d = NULL; PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv = NULL; PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d = NULL; PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv = NULL; PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d = NULL; PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv = NULL; PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d = NULL; PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv = NULL; PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer = NULL; PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer = NULL; PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT = NULL; PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT = NULL; PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding = NULL; PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat = NULL; PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat = NULL; PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat = NULL; PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor = NULL; PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB = NULL; PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB = NULL; PFNGLWEIGHTBVARBPROC __glewWeightbvARB = NULL; PFNGLWEIGHTDVARBPROC __glewWeightdvARB = NULL; PFNGLWEIGHTFVARBPROC __glewWeightfvARB = NULL; PFNGLWEIGHTIVARBPROC __glewWeightivARB = NULL; PFNGLWEIGHTSVARBPROC __glewWeightsvARB = NULL; PFNGLWEIGHTUBVARBPROC __glewWeightubvARB = NULL; PFNGLWEIGHTUIVARBPROC __glewWeightuivARB = NULL; PFNGLWEIGHTUSVARBPROC __glewWeightusvARB = NULL; PFNGLBINDBUFFERARBPROC __glewBindBufferARB = NULL; PFNGLBUFFERDATAARBPROC __glewBufferDataARB = NULL; PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB = NULL; PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB = NULL; PFNGLGENBUFFERSARBPROC __glewGenBuffersARB = NULL; PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB = NULL; PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB = NULL; PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB = NULL; PFNGLISBUFFERARBPROC __glewIsBufferARB = NULL; PFNGLMAPBUFFERARBPROC __glewMapBufferARB = NULL; PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB = NULL; PFNGLBINDPROGRAMARBPROC __glewBindProgramARB = NULL; PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB = NULL; PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB = NULL; PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB = NULL; PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB = NULL; PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB = NULL; PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB = NULL; PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB = NULL; PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB = NULL; PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB = NULL; PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB = NULL; PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB = NULL; PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB = NULL; PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB = NULL; PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB = NULL; PFNGLISPROGRAMARBPROC __glewIsProgramARB = NULL; PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB = NULL; PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB = NULL; PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB = NULL; PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB = NULL; PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB = NULL; PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB = NULL; PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB = NULL; PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB = NULL; PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB = NULL; PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB = NULL; PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB = NULL; PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB = NULL; PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB = NULL; PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB = NULL; PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB = NULL; PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB = NULL; PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB = NULL; PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB = NULL; PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB = NULL; PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB = NULL; PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB = NULL; PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB = NULL; PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB = NULL; PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB = NULL; PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB = NULL; PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB = NULL; PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB = NULL; PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB = NULL; PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB = NULL; PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB = NULL; PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB = NULL; PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB = NULL; PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB = NULL; PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB = NULL; PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB = NULL; PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB = NULL; PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB = NULL; PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB = NULL; PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB = NULL; PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB = NULL; PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB = NULL; PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB = NULL; PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB = NULL; PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB = NULL; PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB = NULL; PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB = NULL; PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB = NULL; PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB = NULL; PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB = NULL; PFNGLCOLORP3UIPROC __glewColorP3ui = NULL; PFNGLCOLORP3UIVPROC __glewColorP3uiv = NULL; PFNGLCOLORP4UIPROC __glewColorP4ui = NULL; PFNGLCOLORP4UIVPROC __glewColorP4uiv = NULL; PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui = NULL; PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv = NULL; PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui = NULL; PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv = NULL; PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui = NULL; PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv = NULL; PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui = NULL; PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv = NULL; PFNGLNORMALP3UIPROC __glewNormalP3ui = NULL; PFNGLNORMALP3UIVPROC __glewNormalP3uiv = NULL; PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui = NULL; PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv = NULL; PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui = NULL; PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv = NULL; PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui = NULL; PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv = NULL; PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui = NULL; PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv = NULL; PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui = NULL; PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv = NULL; PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui = NULL; PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv = NULL; PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui = NULL; PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv = NULL; PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui = NULL; PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv = NULL; PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui = NULL; PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv = NULL; PFNGLVERTEXP2UIPROC __glewVertexP2ui = NULL; PFNGLVERTEXP2UIVPROC __glewVertexP2uiv = NULL; PFNGLVERTEXP3UIPROC __glewVertexP3ui = NULL; PFNGLVERTEXP3UIVPROC __glewVertexP3uiv = NULL; PFNGLVERTEXP4UIPROC __glewVertexP4ui = NULL; PFNGLVERTEXP4UIVPROC __glewVertexP4uiv = NULL; PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv = NULL; PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed = NULL; PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v = NULL; PFNGLGETFLOATI_VPROC __glewGetFloati_v = NULL; PFNGLSCISSORARRAYVPROC __glewScissorArrayv = NULL; PFNGLSCISSORINDEXEDPROC __glewScissorIndexed = NULL; PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv = NULL; PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv = NULL; PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf = NULL; PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv = NULL; PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB = NULL; PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB = NULL; PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB = NULL; PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB = NULL; PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB = NULL; PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB = NULL; PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB = NULL; PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB = NULL; PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB = NULL; PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB = NULL; PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB = NULL; PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB = NULL; PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB = NULL; PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB = NULL; PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB = NULL; PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB = NULL; PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI = NULL; PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI = NULL; PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI = NULL; PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI = NULL; PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI = NULL; PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI = NULL; PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI = NULL; PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI = NULL; PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI = NULL; PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI = NULL; PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI = NULL; PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI = NULL; PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI = NULL; PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI = NULL; PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI = NULL; PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI = NULL; PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI = NULL; PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI = NULL; PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI = NULL; PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI = NULL; PFNGLSAMPLEMAPATIPROC __glewSampleMapATI = NULL; PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI = NULL; PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI = NULL; PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI = NULL; PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI = NULL; PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI = NULL; PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI = NULL; PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI = NULL; PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI = NULL; PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI = NULL; PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI = NULL; PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI = NULL; PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI = NULL; PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI = NULL; PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI = NULL; PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI = NULL; PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI = NULL; PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI = NULL; PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI = NULL; PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI = NULL; PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI = NULL; PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI = NULL; PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI = NULL; PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI = NULL; PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI = NULL; PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI = NULL; PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI = NULL; PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI = NULL; PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI = NULL; PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI = NULL; PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI = NULL; PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI = NULL; PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI = NULL; PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI = NULL; PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI = NULL; PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI = NULL; PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI = NULL; PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI = NULL; PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI = NULL; PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI = NULL; PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI = NULL; PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI = NULL; PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI = NULL; PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI = NULL; PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI = NULL; PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI = NULL; PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI = NULL; PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI = NULL; PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI = NULL; PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI = NULL; PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI = NULL; PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI = NULL; PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI = NULL; PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI = NULL; PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI = NULL; PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI = NULL; PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI = NULL; PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI = NULL; PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI = NULL; PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI = NULL; PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI = NULL; PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI = NULL; PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI = NULL; PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI = NULL; PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI = NULL; PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI = NULL; PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI = NULL; PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI = NULL; PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __glewDrawArraysInstancedBaseInstanceEXT = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseInstanceEXT = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseVertexBaseInstanceEXT = NULL; PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT = NULL; PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT = NULL; PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT = NULL; PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT = NULL; PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT = NULL; PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __glewBindFragDataLocationIndexedEXT = NULL; PFNGLGETFRAGDATAINDEXEXTPROC __glewGetFragDataIndexEXT = NULL; PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __glewGetProgramResourceLocationIndexEXT = NULL; PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT = NULL; PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT = NULL; PFNGLBUFFERSTORAGEEXTPROC __glewBufferStorageEXT = NULL; PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT = NULL; PFNGLCLEARTEXIMAGEEXTPROC __glewClearTexImageEXT = NULL; PFNGLCLEARTEXSUBIMAGEEXTPROC __glewClearTexSubImageEXT = NULL; PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT = NULL; PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT = NULL; PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT = NULL; PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT = NULL; PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT = NULL; PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT = NULL; PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT = NULL; PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT = NULL; PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT = NULL; PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT = NULL; PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT = NULL; PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT = NULL; PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT = NULL; PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT = NULL; PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT = NULL; PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT = NULL; PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT = NULL; PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT = NULL; PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT = NULL; PFNGLCOPYIMAGESUBDATAEXTPROC __glewCopyImageSubDataEXT = NULL; PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT = NULL; PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT = NULL; PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT = NULL; PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT = NULL; PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT = NULL; PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT = NULL; PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT = NULL; PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT = NULL; PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT = NULL; PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT = NULL; PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT = NULL; PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT = NULL; PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT = NULL; PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT = NULL; PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT = NULL; PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT = NULL; PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT = NULL; PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT = NULL; PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT = NULL; PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT = NULL; PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT = NULL; PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT = NULL; PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT = NULL; PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT = NULL; PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT = NULL; PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT = NULL; PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT = NULL; PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT = NULL; PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT = NULL; PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT = NULL; PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT = NULL; PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT = NULL; PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT = NULL; PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT = NULL; PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT = NULL; PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT = NULL; PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT = NULL; PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT = NULL; PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT = NULL; PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT = NULL; PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT = NULL; PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT = NULL; PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT = NULL; PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT = NULL; PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT = NULL; PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT = NULL; PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT = NULL; PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT = NULL; PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT = NULL; PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT = NULL; PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT = NULL; PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT = NULL; PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT = NULL; PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT = NULL; PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT = NULL; PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT = NULL; PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT = NULL; PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT = NULL; PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT = NULL; PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT = NULL; PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT = NULL; PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT = NULL; PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT = NULL; PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT = NULL; PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT = NULL; PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT = NULL; PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT = NULL; PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT = NULL; PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT = NULL; PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT = NULL; PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT = NULL; PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT = NULL; PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT = NULL; PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT = NULL; PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT = NULL; PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT = NULL; PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT = NULL; PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT = NULL; PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT = NULL; PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT = NULL; PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT = NULL; PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT = NULL; PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT = NULL; PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT = NULL; PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT = NULL; PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT = NULL; PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT = NULL; PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT = NULL; PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT = NULL; PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT = NULL; PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT = NULL; PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT = NULL; PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT = NULL; PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT = NULL; PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT = NULL; PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT = NULL; PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT = NULL; PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT = NULL; PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT = NULL; PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT = NULL; PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT = NULL; PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT = NULL; PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT = NULL; PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT = NULL; PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT = NULL; PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT = NULL; PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT = NULL; PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT = NULL; PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT = NULL; PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT = NULL; PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT = NULL; PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT = NULL; PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT = NULL; PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT = NULL; PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT = NULL; PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT = NULL; PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT = NULL; PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT = NULL; PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT = NULL; PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT = NULL; PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT = NULL; PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT = NULL; PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT = NULL; PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT = NULL; PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT = NULL; PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT = NULL; PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT = NULL; PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT = NULL; PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT = NULL; PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT = NULL; PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT = NULL; PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT = NULL; PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT = NULL; PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT = NULL; PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT = NULL; PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT = NULL; PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT = NULL; PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT = NULL; PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT = NULL; PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT = NULL; PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT = NULL; PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT = NULL; PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT = NULL; PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT = NULL; PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT = NULL; PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT = NULL; PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT = NULL; PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT = NULL; PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT = NULL; PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT = NULL; PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT = NULL; PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT = NULL; PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT = NULL; PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT = NULL; PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT = NULL; PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT = NULL; PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT = NULL; PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT = NULL; PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT = NULL; PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT = NULL; PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT = NULL; PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT = NULL; PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT = NULL; PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT = NULL; PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT = NULL; PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT = NULL; PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT = NULL; PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT = NULL; PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT = NULL; PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT = NULL; PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT = NULL; PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT = NULL; PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT = NULL; PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT = NULL; PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT = NULL; PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT = NULL; PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT = NULL; PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT = NULL; PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT = NULL; PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT = NULL; PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT = NULL; PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT = NULL; PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT = NULL; PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT = NULL; PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT = NULL; PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT = NULL; PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT = NULL; PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT = NULL; PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT = NULL; PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT = NULL; PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT = NULL; PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT = NULL; PFNGLDISCARDFRAMEBUFFEREXTPROC __glewDiscardFramebufferEXT = NULL; PFNGLDRAWBUFFERSEXTPROC __glewDrawBuffersEXT = NULL; PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT = NULL; PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT = NULL; PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT = NULL; PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT = NULL; PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT = NULL; PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT = NULL; PFNGLBLENDEQUATIONSEPARATEIEXTPROC __glewBlendEquationSeparateiEXT = NULL; PFNGLBLENDEQUATIONIEXTPROC __glewBlendEquationiEXT = NULL; PFNGLBLENDFUNCSEPARATEIEXTPROC __glewBlendFuncSeparateiEXT = NULL; PFNGLBLENDFUNCIEXTPROC __glewBlendFunciEXT = NULL; PFNGLCOLORMASKIEXTPROC __glewColorMaskiEXT = NULL; PFNGLDISABLEIEXTPROC __glewDisableiEXT = NULL; PFNGLENABLEIEXTPROC __glewEnableiEXT = NULL; PFNGLISENABLEDIEXTPROC __glewIsEnablediEXT = NULL; PFNGLDRAWELEMENTSBASEVERTEXEXTPROC __glewDrawElementsBaseVertexEXT = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __glewDrawElementsInstancedBaseVertexEXT = NULL; PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __glewDrawRangeElementsBaseVertexEXT = NULL; PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __glewMultiDrawElementsBaseVertexEXT = NULL; PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT = NULL; PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT = NULL; PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT = NULL; PFNGLBUFFERSTORAGEEXTERNALEXTPROC __glewBufferStorageExternalEXT = NULL; PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC __glewNamedBufferStorageExternalEXT = NULL; PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT = NULL; PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT = NULL; PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT = NULL; PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT = NULL; PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT = NULL; PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT = NULL; PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT = NULL; PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT = NULL; PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT = NULL; PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT = NULL; PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT = NULL; PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT = NULL; PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT = NULL; PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT = NULL; PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT = NULL; PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT = NULL; PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT = NULL; PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT = NULL; PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT = NULL; PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT = NULL; PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT = NULL; PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT = NULL; PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT = NULL; PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT = NULL; PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT = NULL; PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT = NULL; PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT = NULL; PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT = NULL; PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT = NULL; PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT = NULL; PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT = NULL; PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT = NULL; PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT = NULL; PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT = NULL; PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT = NULL; PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT = NULL; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT = NULL; PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT = NULL; PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT = NULL; PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT = NULL; PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT = NULL; PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT = NULL; PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT = NULL; PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT = NULL; PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT = NULL; PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT = NULL; PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT = NULL; PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT = NULL; PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT = NULL; PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT = NULL; PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT = NULL; PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT = NULL; PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT = NULL; PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT = NULL; PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT = NULL; PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT = NULL; PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT = NULL; PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT = NULL; PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT = NULL; PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT = NULL; PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT = NULL; PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT = NULL; PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT = NULL; PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT = NULL; PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT = NULL; PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT = NULL; PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT = NULL; PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT = NULL; PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT = NULL; PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT = NULL; PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT = NULL; PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT = NULL; PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT = NULL; PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT = NULL; PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT = NULL; PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT = NULL; PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT = NULL; PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT = NULL; PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT = NULL; PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT = NULL; PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT = NULL; PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT = NULL; PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT = NULL; PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT = NULL; PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT = NULL; PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT = NULL; PFNGLHISTOGRAMEXTPROC __glewHistogramEXT = NULL; PFNGLMINMAXEXTPROC __glewMinmaxEXT = NULL; PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT = NULL; PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT = NULL; PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT = NULL; PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT = NULL; PFNGLVERTEXATTRIBDIVISOREXTPROC __glewVertexAttribDivisorEXT = NULL; PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT = NULL; PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT = NULL; PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT = NULL; PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC __glewFlushMappedBufferRangeEXT = NULL; PFNGLMAPBUFFERRANGEEXTPROC __glewMapBufferRangeEXT = NULL; PFNGLBUFFERSTORAGEMEMEXTPROC __glewBufferStorageMemEXT = NULL; PFNGLCREATEMEMORYOBJECTSEXTPROC __glewCreateMemoryObjectsEXT = NULL; PFNGLDELETEMEMORYOBJECTSEXTPROC __glewDeleteMemoryObjectsEXT = NULL; PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC __glewGetMemoryObjectParameterivEXT = NULL; PFNGLGETUNSIGNEDBYTEI_VEXTPROC __glewGetUnsignedBytei_vEXT = NULL; PFNGLGETUNSIGNEDBYTEVEXTPROC __glewGetUnsignedBytevEXT = NULL; PFNGLISMEMORYOBJECTEXTPROC __glewIsMemoryObjectEXT = NULL; PFNGLMEMORYOBJECTPARAMETERIVEXTPROC __glewMemoryObjectParameterivEXT = NULL; PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC __glewNamedBufferStorageMemEXT = NULL; PFNGLTEXSTORAGEMEM1DEXTPROC __glewTexStorageMem1DEXT = NULL; PFNGLTEXSTORAGEMEM2DEXTPROC __glewTexStorageMem2DEXT = NULL; PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC __glewTexStorageMem2DMultisampleEXT = NULL; PFNGLTEXSTORAGEMEM3DEXTPROC __glewTexStorageMem3DEXT = NULL; PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC __glewTexStorageMem3DMultisampleEXT = NULL; PFNGLTEXTURESTORAGEMEM1DEXTPROC __glewTextureStorageMem1DEXT = NULL; PFNGLTEXTURESTORAGEMEM2DEXTPROC __glewTextureStorageMem2DEXT = NULL; PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC __glewTextureStorageMem2DMultisampleEXT = NULL; PFNGLTEXTURESTORAGEMEM3DEXTPROC __glewTextureStorageMem3DEXT = NULL; PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC __glewTextureStorageMem3DMultisampleEXT = NULL; PFNGLIMPORTMEMORYFDEXTPROC __glewImportMemoryFdEXT = NULL; PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC __glewImportMemoryWin32HandleEXT = NULL; PFNGLIMPORTMEMORYWIN32NAMEEXTPROC __glewImportMemoryWin32NameEXT = NULL; PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT = NULL; PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT = NULL; PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC __glewMultiDrawArraysIndirectEXT = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC __glewMultiDrawElementsIndirectEXT = NULL; PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT = NULL; PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT = NULL; PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __glewFramebufferTexture2DMultisampleEXT = NULL; PFNGLDRAWBUFFERSINDEXEDEXTPROC __glewDrawBuffersIndexedEXT = NULL; PFNGLGETINTEGERI_VEXTPROC __glewGetIntegeri_vEXT = NULL; PFNGLREADBUFFERINDEXEDEXTPROC __glewReadBufferIndexedEXT = NULL; PFNGLCOLORTABLEEXTPROC __glewColorTableEXT = NULL; PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT = NULL; PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT = NULL; PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT = NULL; PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT = NULL; PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT = NULL; PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT = NULL; PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT = NULL; PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT = NULL; PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT = NULL; PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT = NULL; PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT = NULL; PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT = NULL; PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT = NULL; PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT = NULL; PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV = NULL; PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV = NULL; PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV = NULL; PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT = NULL; PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT = NULL; PFNGLENDSCENEEXTPROC __glewEndSceneEXT = NULL; PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT = NULL; PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT = NULL; PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT = NULL; PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT = NULL; PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT = NULL; PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT = NULL; PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT = NULL; PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT = NULL; PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT = NULL; PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT = NULL; PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT = NULL; PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT = NULL; PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT = NULL; PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT = NULL; PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT = NULL; PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT = NULL; PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT = NULL; PFNGLDELETESEMAPHORESEXTPROC __glewDeleteSemaphoresEXT = NULL; PFNGLGENSEMAPHORESEXTPROC __glewGenSemaphoresEXT = NULL; PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC __glewGetSemaphoreParameterui64vEXT = NULL; PFNGLISSEMAPHOREEXTPROC __glewIsSemaphoreEXT = NULL; PFNGLSEMAPHOREPARAMETERUI64VEXTPROC __glewSemaphoreParameterui64vEXT = NULL; PFNGLSIGNALSEMAPHOREEXTPROC __glewSignalSemaphoreEXT = NULL; PFNGLWAITSEMAPHOREEXTPROC __glewWaitSemaphoreEXT = NULL; PFNGLIMPORTSEMAPHOREFDEXTPROC __glewImportSemaphoreFdEXT = NULL; PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC __glewImportSemaphoreWin32HandleEXT = NULL; PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC __glewImportSemaphoreWin32NameEXT = NULL; PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT = NULL; PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT = NULL; PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT = NULL; PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT = NULL; PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT = NULL; PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC __glewClearPixelLocalStorageuiEXT = NULL; PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewFramebufferPixelLocalStorageSizeEXT = NULL; PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewGetFramebufferPixelLocalStorageSizeEXT = NULL; PFNGLTEXPAGECOMMITMENTEXTPROC __glewTexPageCommitmentEXT = NULL; PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT = NULL; PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT = NULL; PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT = NULL; PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT = NULL; PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT = NULL; PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT = NULL; PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT = NULL; PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT = NULL; PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT = NULL; PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT = NULL; PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT = NULL; PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT = NULL; PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT = NULL; PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT = NULL; PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT = NULL; PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT = NULL; PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT = NULL; PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT = NULL; PFNGLISTEXTUREEXTPROC __glewIsTextureEXT = NULL; PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT = NULL; PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT = NULL; PFNGLTEXSTORAGE1DEXTPROC __glewTexStorage1DEXT = NULL; PFNGLTEXSTORAGE2DEXTPROC __glewTexStorage2DEXT = NULL; PFNGLTEXSTORAGE3DEXTPROC __glewTexStorage3DEXT = NULL; PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT = NULL; PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT = NULL; PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT = NULL; PFNGLTEXTUREVIEWEXTPROC __glewTextureViewEXT = NULL; PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT = NULL; PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT = NULL; PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT = NULL; PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT = NULL; PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT = NULL; PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT = NULL; PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT = NULL; PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT = NULL; PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT = NULL; PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT = NULL; PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT = NULL; PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT = NULL; PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT = NULL; PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT = NULL; PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT = NULL; PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT = NULL; PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT = NULL; PFNGLBINDARRAYSETEXTPROC __glewBindArraySetEXT = NULL; PFNGLCREATEARRAYSETEXTPROC __glewCreateArraySetExt = NULL; PFNGLDELETEARRAYSETSEXTPROC __glewDeleteArraySetsEXT = NULL; PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT = NULL; PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT = NULL; PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT = NULL; PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT = NULL; PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT = NULL; PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT = NULL; PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT = NULL; PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT = NULL; PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT = NULL; PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT = NULL; PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT = NULL; PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT = NULL; PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT = NULL; PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT = NULL; PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT = NULL; PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT = NULL; PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT = NULL; PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT = NULL; PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT = NULL; PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT = NULL; PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT = NULL; PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT = NULL; PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT = NULL; PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT = NULL; PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT = NULL; PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT = NULL; PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT = NULL; PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT = NULL; PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT = NULL; PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT = NULL; PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT = NULL; PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT = NULL; PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT = NULL; PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT = NULL; PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT = NULL; PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT = NULL; PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT = NULL; PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT = NULL; PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT = NULL; PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT = NULL; PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT = NULL; PFNGLSWIZZLEEXTPROC __glewSwizzleEXT = NULL; PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT = NULL; PFNGLVARIANTBVEXTPROC __glewVariantbvEXT = NULL; PFNGLVARIANTDVEXTPROC __glewVariantdvEXT = NULL; PFNGLVARIANTFVEXTPROC __glewVariantfvEXT = NULL; PFNGLVARIANTIVEXTPROC __glewVariantivEXT = NULL; PFNGLVARIANTSVEXTPROC __glewVariantsvEXT = NULL; PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT = NULL; PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT = NULL; PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT = NULL; PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT = NULL; PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT = NULL; PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT = NULL; PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT = NULL; PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC __glewAcquireKeyedMutexWin32EXT = NULL; PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC __glewReleaseKeyedMutexWin32EXT = NULL; PFNGLWINDOWRECTANGLESEXTPROC __glewWindowRectanglesEXT = NULL; PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT = NULL; PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY = NULL; PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY = NULL; PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP = NULL; PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP = NULL; PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP = NULL; PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP = NULL; PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP = NULL; PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP = NULL; PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM = NULL; PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM = NULL; PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM = NULL; PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM = NULL; PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM = NULL; PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM = NULL; PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM = NULL; PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM = NULL; PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM = NULL; PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM = NULL; PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL = NULL; PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL = NULL; PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL = NULL; PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL = NULL; PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL = NULL; PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL = NULL; PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL = NULL; PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL = NULL; PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL = NULL; PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL = NULL; PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL = NULL; PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL = NULL; PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL = NULL; PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL = NULL; PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL = NULL; PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL = NULL; PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL = NULL; PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL = NULL; PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL = NULL; PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR = NULL; PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback = NULL; PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl = NULL; PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert = NULL; PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog = NULL; PFNGLGETOBJECTLABELPROC __glewGetObjectLabel = NULL; PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel = NULL; PFNGLOBJECTLABELPROC __glewObjectLabel = NULL; PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel = NULL; PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup = NULL; PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup = NULL; PFNGLMAXSHADERCOMPILERTHREADSKHRPROC __glewMaxShaderCompilerThreadsKHR = NULL; PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv = NULL; PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv = NULL; PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv = NULL; PFNGLREADNPIXELSPROC __glewReadnPixels = NULL; PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled = NULL; PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion = NULL; PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion = NULL; PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion = NULL; PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion = NULL; PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA = NULL; PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA = NULL; PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA = NULL; PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA = NULL; PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA = NULL; PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA = NULL; PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA = NULL; PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA = NULL; PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA = NULL; PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA = NULL; PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA = NULL; PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA = NULL; PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA = NULL; PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA = NULL; PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA = NULL; PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA = NULL; PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA = NULL; PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA = NULL; PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA = NULL; PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA = NULL; PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA = NULL; PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA = NULL; PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA = NULL; PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA = NULL; PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL; PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX = NULL; PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX = NULL; PFNGLLGPUCOPYIMAGESUBDATANVXPROC __glewLGPUCopyImageSubDataNVX = NULL; PFNGLLGPUINTERLOCKNVXPROC __glewLGPUInterlockNVX = NULL; PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC __glewLGPUNamedBufferSubDataNVX = NULL; PFNGLSTEREOPARAMETERFNVPROC __glewStereoParameterfNV = NULL; PFNGLSTEREOPARAMETERINVPROC __glewStereoParameteriNV = NULL; PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV = NULL; PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV = NULL; PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV = NULL; PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV = NULL; PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV = NULL; PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV = NULL; PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV = NULL; PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV = NULL; PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV = NULL; PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV = NULL; PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV = NULL; PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV = NULL; PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV = NULL; PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV = NULL; PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV = NULL; PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV = NULL; PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV = NULL; PFNGLVIEWPORTPOSITIONWSCALENVPROC __glewViewportPositionWScaleNV = NULL; PFNGLCALLCOMMANDLISTNVPROC __glewCallCommandListNV = NULL; PFNGLCOMMANDLISTSEGMENTSNVPROC __glewCommandListSegmentsNV = NULL; PFNGLCOMPILECOMMANDLISTNVPROC __glewCompileCommandListNV = NULL; PFNGLCREATECOMMANDLISTSNVPROC __glewCreateCommandListsNV = NULL; PFNGLCREATESTATESNVPROC __glewCreateStatesNV = NULL; PFNGLDELETECOMMANDLISTSNVPROC __glewDeleteCommandListsNV = NULL; PFNGLDELETESTATESNVPROC __glewDeleteStatesNV = NULL; PFNGLDRAWCOMMANDSADDRESSNVPROC __glewDrawCommandsAddressNV = NULL; PFNGLDRAWCOMMANDSNVPROC __glewDrawCommandsNV = NULL; PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC __glewDrawCommandsStatesAddressNV = NULL; PFNGLDRAWCOMMANDSSTATESNVPROC __glewDrawCommandsStatesNV = NULL; PFNGLGETCOMMANDHEADERNVPROC __glewGetCommandHeaderNV = NULL; PFNGLGETSTAGEINDEXNVPROC __glewGetStageIndexNV = NULL; PFNGLISCOMMANDLISTNVPROC __glewIsCommandListNV = NULL; PFNGLISSTATENVPROC __glewIsStateNV = NULL; PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC __glewListDrawCommandsStatesClientNV = NULL; PFNGLSTATECAPTURENVPROC __glewStateCaptureNV = NULL; PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV = NULL; PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV = NULL; PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV = NULL; PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV = NULL; PFNGLCONSERVATIVERASTERPARAMETERINVPROC __glewConservativeRasterParameteriNV = NULL; PFNGLCOPYBUFFERSUBDATANVPROC __glewCopyBufferSubDataNV = NULL; PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV = NULL; PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV = NULL; PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV = NULL; PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV = NULL; PFNGLDRAWBUFFERSNVPROC __glewDrawBuffersNV = NULL; PFNGLDRAWARRAYSINSTANCEDNVPROC __glewDrawArraysInstancedNV = NULL; PFNGLDRAWELEMENTSINSTANCEDNVPROC __glewDrawElementsInstancedNV = NULL; PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV = NULL; PFNGLDRAWVKIMAGENVPROC __glewDrawVkImageNV = NULL; PFNGLGETVKPROCADDRNVPROC __glewGetVkProcAddrNV = NULL; PFNGLSIGNALVKFENCENVPROC __glewSignalVkFenceNV = NULL; PFNGLSIGNALVKSEMAPHORENVPROC __glewSignalVkSemaphoreNV = NULL; PFNGLWAITVKSEMAPHORENVPROC __glewWaitVkSemaphoreNV = NULL; PFNGLEVALMAPSNVPROC __glewEvalMapsNV = NULL; PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV = NULL; PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV = NULL; PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV = NULL; PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV = NULL; PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV = NULL; PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV = NULL; PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV = NULL; PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV = NULL; PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV = NULL; PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV = NULL; PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV = NULL; PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV = NULL; PFNGLFINISHFENCENVPROC __glewFinishFenceNV = NULL; PFNGLGENFENCESNVPROC __glewGenFencesNV = NULL; PFNGLGETFENCEIVNVPROC __glewGetFenceivNV = NULL; PFNGLISFENCENVPROC __glewIsFenceNV = NULL; PFNGLSETFENCENVPROC __glewSetFenceNV = NULL; PFNGLTESTFENCENVPROC __glewTestFenceNV = NULL; PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV = NULL; PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV = NULL; PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV = NULL; PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV = NULL; PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV = NULL; PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV = NULL; PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV = NULL; PFNGLBLITFRAMEBUFFERNVPROC __glewBlitFramebufferNV = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC __glewRenderbufferStorageMultisampleNV = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV = NULL; PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV = NULL; PFNGLMULTICASTBARRIERNVPROC __glewMulticastBarrierNV = NULL; PFNGLMULTICASTBLITFRAMEBUFFERNVPROC __glewMulticastBlitFramebufferNV = NULL; PFNGLMULTICASTBUFFERSUBDATANVPROC __glewMulticastBufferSubDataNV = NULL; PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC __glewMulticastCopyBufferSubDataNV = NULL; PFNGLMULTICASTCOPYIMAGESUBDATANVPROC __glewMulticastCopyImageSubDataNV = NULL; PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewMulticastFramebufferSampleLocationsfvNV = NULL; PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC __glewMulticastGetQueryObjecti64vNV = NULL; PFNGLMULTICASTGETQUERYOBJECTIVNVPROC __glewMulticastGetQueryObjectivNV = NULL; PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC __glewMulticastGetQueryObjectui64vNV = NULL; PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC __glewMulticastGetQueryObjectuivNV = NULL; PFNGLMULTICASTWAITSYNCNVPROC __glewMulticastWaitSyncNV = NULL; PFNGLRENDERGPUMASKNVPROC __glewRenderGpuMaskNV = NULL; PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV = NULL; PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV = NULL; PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV = NULL; PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV = NULL; PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV = NULL; PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV = NULL; PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV = NULL; PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV = NULL; PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV = NULL; PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV = NULL; PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV = NULL; PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV = NULL; PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV = NULL; PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV = NULL; PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV = NULL; PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV = NULL; PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV = NULL; PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV = NULL; PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV = NULL; PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV = NULL; PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV = NULL; PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV = NULL; PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV = NULL; PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV = NULL; PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV = NULL; PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV = NULL; PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV = NULL; PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV = NULL; PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV = NULL; PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV = NULL; PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV = NULL; PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV = NULL; PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV = NULL; PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV = NULL; PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV = NULL; PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV = NULL; PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV = NULL; PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV = NULL; PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV = NULL; PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV = NULL; PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV = NULL; PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV = NULL; PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV = NULL; PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV = NULL; PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV = NULL; PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV = NULL; PFNGLCOLOR3HNVPROC __glewColor3hNV = NULL; PFNGLCOLOR3HVNVPROC __glewColor3hvNV = NULL; PFNGLCOLOR4HNVPROC __glewColor4hNV = NULL; PFNGLCOLOR4HVNVPROC __glewColor4hvNV = NULL; PFNGLFOGCOORDHNVPROC __glewFogCoordhNV = NULL; PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV = NULL; PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV = NULL; PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV = NULL; PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV = NULL; PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV = NULL; PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV = NULL; PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV = NULL; PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV = NULL; PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV = NULL; PFNGLNORMAL3HNVPROC __glewNormal3hNV = NULL; PFNGLNORMAL3HVNVPROC __glewNormal3hvNV = NULL; PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV = NULL; PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV = NULL; PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV = NULL; PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV = NULL; PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV = NULL; PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV = NULL; PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV = NULL; PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV = NULL; PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV = NULL; PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV = NULL; PFNGLVERTEX2HNVPROC __glewVertex2hNV = NULL; PFNGLVERTEX2HVNVPROC __glewVertex2hvNV = NULL; PFNGLVERTEX3HNVPROC __glewVertex3hNV = NULL; PFNGLVERTEX3HVNVPROC __glewVertex3hvNV = NULL; PFNGLVERTEX4HNVPROC __glewVertex4hNV = NULL; PFNGLVERTEX4HVNVPROC __glewVertex4hvNV = NULL; PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV = NULL; PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV = NULL; PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV = NULL; PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV = NULL; PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV = NULL; PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV = NULL; PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV = NULL; PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV = NULL; PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV = NULL; PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV = NULL; PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV = NULL; PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV = NULL; PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV = NULL; PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV = NULL; PFNGLVERTEXATTRIBDIVISORNVPROC __glewVertexAttribDivisorNV = NULL; PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV = NULL; PFNGLUNIFORMMATRIX2X3FVNVPROC __glewUniformMatrix2x3fvNV = NULL; PFNGLUNIFORMMATRIX2X4FVNVPROC __glewUniformMatrix2x4fvNV = NULL; PFNGLUNIFORMMATRIX3X2FVNVPROC __glewUniformMatrix3x2fvNV = NULL; PFNGLUNIFORMMATRIX3X4FVNVPROC __glewUniformMatrix3x4fvNV = NULL; PFNGLUNIFORMMATRIX4X2FVNVPROC __glewUniformMatrix4x2fvNV = NULL; PFNGLUNIFORMMATRIX4X3FVNVPROC __glewUniformMatrix4x3fvNV = NULL; PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV = NULL; PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV = NULL; PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV = NULL; PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV = NULL; PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV = NULL; PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV = NULL; PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV = NULL; PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV = NULL; PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV = NULL; PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV = NULL; PFNGLCOPYPATHNVPROC __glewCopyPathNV = NULL; PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV = NULL; PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV = NULL; PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV = NULL; PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV = NULL; PFNGLDELETEPATHSNVPROC __glewDeletePathsNV = NULL; PFNGLGENPATHSNVPROC __glewGenPathsNV = NULL; PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV = NULL; PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV = NULL; PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV = NULL; PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV = NULL; PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV = NULL; PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV = NULL; PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV = NULL; PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV = NULL; PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV = NULL; PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV = NULL; PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV = NULL; PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV = NULL; PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV = NULL; PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV = NULL; PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV = NULL; PFNGLISPATHNVPROC __glewIsPathNV = NULL; PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV = NULL; PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV = NULL; PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV = NULL; PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV = NULL; PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV = NULL; PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV = NULL; PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV = NULL; PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV = NULL; PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV = NULL; PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV = NULL; PFNGLPATHCOORDSNVPROC __glewPathCoordsNV = NULL; PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV = NULL; PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV = NULL; PFNGLPATHFOGGENNVPROC __glewPathFogGenNV = NULL; PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV = NULL; PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV = NULL; PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV = NULL; PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV = NULL; PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV = NULL; PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV = NULL; PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV = NULL; PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV = NULL; PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV = NULL; PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV = NULL; PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV = NULL; PFNGLPATHSTRINGNVPROC __glewPathStringNV = NULL; PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV = NULL; PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV = NULL; PFNGLPATHTEXGENNVPROC __glewPathTexGenNV = NULL; PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV = NULL; PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV = NULL; PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV = NULL; PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV = NULL; PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV = NULL; PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV = NULL; PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV = NULL; PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV = NULL; PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV = NULL; PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV = NULL; PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV = NULL; PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV = NULL; PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV = NULL; PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV = NULL; PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV = NULL; PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV = NULL; PFNGLPOLYGONMODENVPROC __glewPolygonModeNV = NULL; PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV = NULL; PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV = NULL; PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV = NULL; PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV = NULL; PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV = NULL; PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV = NULL; PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV = NULL; PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV = NULL; PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV = NULL; PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV = NULL; PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV = NULL; PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV = NULL; PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV = NULL; PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV = NULL; PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV = NULL; PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV = NULL; PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV = NULL; PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV = NULL; PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV = NULL; PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV = NULL; PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV = NULL; PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV = NULL; PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV = NULL; PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV = NULL; PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV = NULL; PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV = NULL; PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV = NULL; PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV = NULL; PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV = NULL; PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV = NULL; PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV = NULL; PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV = NULL; PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV = NULL; PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV = NULL; PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV = NULL; PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV = NULL; PFNGLUNIFORMUI64NVPROC __glewUniformui64NV = NULL; PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV = NULL; PFNGLCOMPRESSEDTEXIMAGE3DNVPROC __glewCompressedTexImage3DNV = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC __glewCompressedTexSubImage3DNV = NULL; PFNGLCOPYTEXSUBIMAGE3DNVPROC __glewCopyTexSubImage3DNV = NULL; PFNGLFRAMEBUFFERTEXTURELAYERNVPROC __glewFramebufferTextureLayerNV = NULL; PFNGLTEXIMAGE3DNVPROC __glewTexImage3DNV = NULL; PFNGLTEXSUBIMAGE3DNVPROC __glewTexSubImage3DNV = NULL; PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV = NULL; PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV = NULL; PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV = NULL; PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV = NULL; PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV = NULL; PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV = NULL; PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV = NULL; PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV = NULL; PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV = NULL; PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV = NULL; PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV = NULL; PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV = NULL; PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV = NULL; PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV = NULL; PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV = NULL; PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV = NULL; PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV = NULL; PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV = NULL; PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV = NULL; PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV = NULL; PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV = NULL; PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV = NULL; PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV = NULL; PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV = NULL; PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV = NULL; PFNGLVDPAUFININVPROC __glewVDPAUFiniNV = NULL; PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV = NULL; PFNGLVDPAUINITNVPROC __glewVDPAUInitNV = NULL; PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV = NULL; PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV = NULL; PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV = NULL; PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV = NULL; PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV = NULL; PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV = NULL; PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV = NULL; PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV = NULL; PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV = NULL; PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV = NULL; PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV = NULL; PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV = NULL; PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV = NULL; PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV = NULL; PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV = NULL; PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV = NULL; PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV = NULL; PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV = NULL; PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV = NULL; PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV = NULL; PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV = NULL; PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV = NULL; PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV = NULL; PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV = NULL; PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV = NULL; PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV = NULL; PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV = NULL; PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV = NULL; PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV = NULL; PFNGLCOLORFORMATNVPROC __glewColorFormatNV = NULL; PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV = NULL; PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV = NULL; PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV = NULL; PFNGLINDEXFORMATNVPROC __glewIndexFormatNV = NULL; PFNGLNORMALFORMATNVPROC __glewNormalFormatNV = NULL; PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV = NULL; PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV = NULL; PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV = NULL; PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV = NULL; PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV = NULL; PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV = NULL; PFNGLBINDPROGRAMNVPROC __glewBindProgramNV = NULL; PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV = NULL; PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV = NULL; PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV = NULL; PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV = NULL; PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV = NULL; PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV = NULL; PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV = NULL; PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV = NULL; PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV = NULL; PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV = NULL; PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV = NULL; PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV = NULL; PFNGLISPROGRAMNVPROC __glewIsProgramNV = NULL; PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV = NULL; PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV = NULL; PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV = NULL; PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV = NULL; PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV = NULL; PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV = NULL; PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV = NULL; PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV = NULL; PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV = NULL; PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV = NULL; PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV = NULL; PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV = NULL; PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV = NULL; PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV = NULL; PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV = NULL; PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV = NULL; PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV = NULL; PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV = NULL; PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV = NULL; PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV = NULL; PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV = NULL; PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV = NULL; PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV = NULL; PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV = NULL; PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV = NULL; PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV = NULL; PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV = NULL; PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV = NULL; PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV = NULL; PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV = NULL; PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV = NULL; PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV = NULL; PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV = NULL; PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV = NULL; PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV = NULL; PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV = NULL; PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV = NULL; PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV = NULL; PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV = NULL; PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV = NULL; PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV = NULL; PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV = NULL; PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV = NULL; PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV = NULL; PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV = NULL; PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV = NULL; PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV = NULL; PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV = NULL; PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV = NULL; PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV = NULL; PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV = NULL; PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV = NULL; PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV = NULL; PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV = NULL; PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV = NULL; PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV = NULL; PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV = NULL; PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV = NULL; PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV = NULL; PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV = NULL; PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV = NULL; PFNGLDEPTHRANGEARRAYFVNVPROC __glewDepthRangeArrayfvNV = NULL; PFNGLDEPTHRANGEINDEXEDFNVPROC __glewDepthRangeIndexedfNV = NULL; PFNGLDISABLEINVPROC __glewDisableiNV = NULL; PFNGLENABLEINVPROC __glewEnableiNV = NULL; PFNGLGETFLOATI_VNVPROC __glewGetFloati_vNV = NULL; PFNGLISENABLEDINVPROC __glewIsEnablediNV = NULL; PFNGLSCISSORARRAYVNVPROC __glewScissorArrayvNV = NULL; PFNGLSCISSORINDEXEDNVPROC __glewScissorIndexedNV = NULL; PFNGLSCISSORINDEXEDVNVPROC __glewScissorIndexedvNV = NULL; PFNGLVIEWPORTARRAYVNVPROC __glewViewportArrayvNV = NULL; PFNGLVIEWPORTINDEXEDFNVPROC __glewViewportIndexedfNV = NULL; PFNGLVIEWPORTINDEXEDFVNVPROC __glewViewportIndexedfvNV = NULL; PFNGLVIEWPORTSWIZZLENVPROC __glewViewportSwizzleNV = NULL; PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR = NULL; PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __glewFramebufferTextureMultisampleMultiviewOVR = NULL; PFNGLALPHAFUNCQCOMPROC __glewAlphaFuncQCOM = NULL; PFNGLDISABLEDRIVERCONTROLQCOMPROC __glewDisableDriverControlQCOM = NULL; PFNGLENABLEDRIVERCONTROLQCOMPROC __glewEnableDriverControlQCOM = NULL; PFNGLGETDRIVERCONTROLSTRINGQCOMPROC __glewGetDriverControlStringQCOM = NULL; PFNGLGETDRIVERCONTROLSQCOMPROC __glewGetDriverControlsQCOM = NULL; PFNGLEXTGETBUFFERPOINTERVQCOMPROC __glewExtGetBufferPointervQCOM = NULL; PFNGLEXTGETBUFFERSQCOMPROC __glewExtGetBuffersQCOM = NULL; PFNGLEXTGETFRAMEBUFFERSQCOMPROC __glewExtGetFramebuffersQCOM = NULL; PFNGLEXTGETRENDERBUFFERSQCOMPROC __glewExtGetRenderbuffersQCOM = NULL; PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC __glewExtGetTexLevelParameterivQCOM = NULL; PFNGLEXTGETTEXSUBIMAGEQCOMPROC __glewExtGetTexSubImageQCOM = NULL; PFNGLEXTGETTEXTURESQCOMPROC __glewExtGetTexturesQCOM = NULL; PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC __glewExtTexObjectStateOverrideiQCOM = NULL; PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC __glewExtGetProgramBinarySourceQCOM = NULL; PFNGLEXTGETPROGRAMSQCOMPROC __glewExtGetProgramsQCOM = NULL; PFNGLEXTGETSHADERSQCOMPROC __glewExtGetShadersQCOM = NULL; PFNGLEXTISPROGRAMBINARYQCOMPROC __glewExtIsProgramBinaryQCOM = NULL; PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC __glewFramebufferFoveationConfigQCOM = NULL; PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC __glewFramebufferFoveationParametersQCOM = NULL; PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC __glewFramebufferFetchBarrierQCOM = NULL; PFNGLENDTILINGQCOMPROC __glewEndTilingQCOM = NULL; PFNGLSTARTTILINGQCOMPROC __glewStartTilingQCOM = NULL; PFNGLALPHAFUNCXPROC __glewAlphaFuncx = NULL; PFNGLCLEARCOLORXPROC __glewClearColorx = NULL; PFNGLCLEARDEPTHXPROC __glewClearDepthx = NULL; PFNGLCOLOR4XPROC __glewColor4x = NULL; PFNGLDEPTHRANGEXPROC __glewDepthRangex = NULL; PFNGLFOGXPROC __glewFogx = NULL; PFNGLFOGXVPROC __glewFogxv = NULL; PFNGLFRUSTUMFPROC __glewFrustumf = NULL; PFNGLFRUSTUMXPROC __glewFrustumx = NULL; PFNGLLIGHTMODELXPROC __glewLightModelx = NULL; PFNGLLIGHTMODELXVPROC __glewLightModelxv = NULL; PFNGLLIGHTXPROC __glewLightx = NULL; PFNGLLIGHTXVPROC __glewLightxv = NULL; PFNGLLINEWIDTHXPROC __glewLineWidthx = NULL; PFNGLLOADMATRIXXPROC __glewLoadMatrixx = NULL; PFNGLMATERIALXPROC __glewMaterialx = NULL; PFNGLMATERIALXVPROC __glewMaterialxv = NULL; PFNGLMULTMATRIXXPROC __glewMultMatrixx = NULL; PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x = NULL; PFNGLNORMAL3XPROC __glewNormal3x = NULL; PFNGLORTHOFPROC __glewOrthof = NULL; PFNGLORTHOXPROC __glewOrthox = NULL; PFNGLPOINTSIZEXPROC __glewPointSizex = NULL; PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx = NULL; PFNGLROTATEXPROC __glewRotatex = NULL; PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex = NULL; PFNGLSCALEXPROC __glewScalex = NULL; PFNGLTEXENVXPROC __glewTexEnvx = NULL; PFNGLTEXENVXVPROC __glewTexEnvxv = NULL; PFNGLTEXPARAMETERXPROC __glewTexParameterx = NULL; PFNGLTRANSLATEXPROC __glewTranslatex = NULL; PFNGLCLIPPLANEFPROC __glewClipPlanef = NULL; PFNGLCLIPPLANEXPROC __glewClipPlanex = NULL; PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef = NULL; PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex = NULL; PFNGLGETFIXEDVPROC __glewGetFixedv = NULL; PFNGLGETLIGHTXVPROC __glewGetLightxv = NULL; PFNGLGETMATERIALXVPROC __glewGetMaterialxv = NULL; PFNGLGETTEXENVXVPROC __glewGetTexEnvxv = NULL; PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv = NULL; PFNGLPOINTPARAMETERXPROC __glewPointParameterx = NULL; PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv = NULL; PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES = NULL; PFNGLTEXPARAMETERXVPROC __glewTexParameterxv = NULL; PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL = NULL; PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL = NULL; PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL = NULL; PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL = NULL; PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL = NULL; PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS = NULL; PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS = NULL; PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS = NULL; PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS = NULL; PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS = NULL; PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS = NULL; PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC __glewInterleavedTextureCoordSetsSGIS = NULL; PFNGLSELECTTEXTURECOORDSETSGISPROC __glewSelectTextureCoordSetSGIS = NULL; PFNGLSELECTTEXTURESGISPROC __glewSelectTextureSGIS = NULL; PFNGLSELECTTEXTURETRANSFORMSGISPROC __glewSelectTextureTransformSGIS = NULL; PFNGLMULTISAMPLESUBRECTPOSSGISPROC __glewMultisampleSubRectPosSGIS = NULL; PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS = NULL; PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS = NULL; PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS = NULL; PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS = NULL; PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS = NULL; PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS = NULL; PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX = NULL; PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX = NULL; PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX = NULL; PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX = NULL; PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX = NULL; PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX = NULL; PFNGLADDRESSSPACEPROC __glewAddressSpace = NULL; PFNGLDATAPIPEPROC __glewDataPipe = NULL; PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX = NULL; PFNGLFOGLAYERSSGIXPROC __glewFogLayersSGIX = NULL; PFNGLGETFOGLAYERSSGIXPROC __glewGetFogLayersSGIX = NULL; PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX = NULL; PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX = NULL; PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX = NULL; PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX = NULL; PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX = NULL; PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX = NULL; PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX = NULL; PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX = NULL; PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX = NULL; PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX = NULL; PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX = NULL; PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX = NULL; PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX = NULL; PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX = NULL; PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX = NULL; PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX = NULL; PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX = NULL; PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX = NULL; PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX = NULL; PFNGLIGLOOINTERFACESGIXPROC __glewIglooInterfaceSGIX = NULL; PFNGLALLOCMPEGPREDICTORSSGIXPROC __glewAllocMPEGPredictorsSGIX = NULL; PFNGLDELETEMPEGPREDICTORSSGIXPROC __glewDeleteMPEGPredictorsSGIX = NULL; PFNGLGENMPEGPREDICTORSSGIXPROC __glewGenMPEGPredictorsSGIX = NULL; PFNGLGETMPEGPARAMETERFVSGIXPROC __glewGetMPEGParameterfvSGIX = NULL; PFNGLGETMPEGPARAMETERIVSGIXPROC __glewGetMPEGParameterivSGIX = NULL; PFNGLGETMPEGPREDICTORSGIXPROC __glewGetMPEGPredictorSGIX = NULL; PFNGLGETMPEGQUANTTABLEUBVPROC __glewGetMPEGQuantTableubv = NULL; PFNGLISMPEGPREDICTORSGIXPROC __glewIsMPEGPredictorSGIX = NULL; PFNGLMPEGPREDICTORSGIXPROC __glewMPEGPredictorSGIX = NULL; PFNGLMPEGQUANTTABLEUBVPROC __glewMPEGQuantTableubv = NULL; PFNGLSWAPMPEGPREDICTORSSGIXPROC __glewSwapMPEGPredictorsSGIX = NULL; PFNGLGETNONLINLIGHTFVSGIXPROC __glewGetNonlinLightfvSGIX = NULL; PFNGLGETNONLINMATERIALFVSGIXPROC __glewGetNonlinMaterialfvSGIX = NULL; PFNGLNONLINLIGHTFVSGIXPROC __glewNonlinLightfvSGIX = NULL; PFNGLNONLINMATERIALFVSGIXPROC __glewNonlinMaterialfvSGIX = NULL; PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX = NULL; PFNGLDEFORMSGIXPROC __glewDeformSGIX = NULL; PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC __glewLoadIdentityDeformationMapSGIX = NULL; PFNGLMESHBREADTHSGIXPROC __glewMeshBreadthSGIX = NULL; PFNGLMESHSTRIDESGIXPROC __glewMeshStrideSGIX = NULL; PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX = NULL; PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX = NULL; PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX = NULL; PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX = NULL; PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX = NULL; PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX = NULL; PFNGLGETVECTOROPERATIONSGIXPROC __glewGetVectorOperationSGIX = NULL; PFNGLVECTOROPERATIONSGIXPROC __glewVectorOperationSGIX = NULL; PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC __glewAreVertexArraysResidentSGIX = NULL; PFNGLBINDVERTEXARRAYSGIXPROC __glewBindVertexArraySGIX = NULL; PFNGLDELETEVERTEXARRAYSSGIXPROC __glewDeleteVertexArraysSGIX = NULL; PFNGLGENVERTEXARRAYSSGIXPROC __glewGenVertexArraysSGIX = NULL; PFNGLISVERTEXARRAYSGIXPROC __glewIsVertexArraySGIX = NULL; PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC __glewPrioritizeVertexArraysSGIX = NULL; PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI = NULL; PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI = NULL; PFNGLCOLORTABLESGIPROC __glewColorTableSGI = NULL; PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI = NULL; PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI = NULL; PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI = NULL; PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI = NULL; PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC __glewGetPixelTransformParameterfvSGI = NULL; PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC __glewGetPixelTransformParameterivSGI = NULL; PFNGLPIXELTRANSFORMPARAMETERFSGIPROC __glewPixelTransformParameterfSGI = NULL; PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC __glewPixelTransformParameterfvSGI = NULL; PFNGLPIXELTRANSFORMPARAMETERISGIPROC __glewPixelTransformParameteriSGI = NULL; PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC __glewPixelTransformParameterivSGI = NULL; PFNGLPIXELTRANSFORMSGIPROC __glewPixelTransformSGI = NULL; PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX = NULL; PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN = NULL; PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN = NULL; PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN = NULL; PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN = NULL; PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN = NULL; PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN = NULL; PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN = NULL; PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN = NULL; PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN = NULL; PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN = NULL; PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN = NULL; PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN = NULL; PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN = NULL; PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN = NULL; PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN = NULL; PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN = NULL; PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN = NULL; PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN = NULL; PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN = NULL; PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN = NULL; PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN = NULL; PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN = NULL; PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN = NULL; PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN = NULL; PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN = NULL; PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN = NULL; PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN = NULL; PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN = NULL; PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN = NULL; PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN = NULL; PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN = NULL; PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN = NULL; PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN = NULL; PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN = NULL; PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN = NULL; PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN = NULL; PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN = NULL; PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN = NULL; PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN = NULL; PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN = NULL; GLboolean __GLEW_VERSION_1_1 = GL_FALSE; GLboolean __GLEW_VERSION_1_2 = GL_FALSE; GLboolean __GLEW_VERSION_1_2_1 = GL_FALSE; GLboolean __GLEW_VERSION_1_3 = GL_FALSE; GLboolean __GLEW_VERSION_1_4 = GL_FALSE; GLboolean __GLEW_VERSION_1_5 = GL_FALSE; GLboolean __GLEW_VERSION_2_0 = GL_FALSE; GLboolean __GLEW_VERSION_2_1 = GL_FALSE; GLboolean __GLEW_VERSION_3_0 = GL_FALSE; GLboolean __GLEW_VERSION_3_1 = GL_FALSE; GLboolean __GLEW_VERSION_3_2 = GL_FALSE; GLboolean __GLEW_VERSION_3_3 = GL_FALSE; GLboolean __GLEW_VERSION_4_0 = GL_FALSE; GLboolean __GLEW_VERSION_4_1 = GL_FALSE; GLboolean __GLEW_VERSION_4_2 = GL_FALSE; GLboolean __GLEW_VERSION_4_3 = GL_FALSE; GLboolean __GLEW_VERSION_4_4 = GL_FALSE; GLboolean __GLEW_VERSION_4_5 = GL_FALSE; GLboolean __GLEW_VERSION_4_6 = GL_FALSE; GLboolean __GLEW_3DFX_multisample = GL_FALSE; GLboolean __GLEW_3DFX_tbuffer = GL_FALSE; GLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE; GLboolean __GLEW_AMD_blend_minmax_factor = GL_FALSE; GLboolean __GLEW_AMD_compressed_3DC_texture = GL_FALSE; GLboolean __GLEW_AMD_compressed_ATC_texture = GL_FALSE; GLboolean __GLEW_AMD_conservative_depth = GL_FALSE; GLboolean __GLEW_AMD_debug_output = GL_FALSE; GLboolean __GLEW_AMD_depth_clamp_separate = GL_FALSE; GLboolean __GLEW_AMD_draw_buffers_blend = GL_FALSE; GLboolean __GLEW_AMD_framebuffer_sample_positions = GL_FALSE; GLboolean __GLEW_AMD_gcn_shader = GL_FALSE; GLboolean __GLEW_AMD_gpu_shader_half_float = GL_FALSE; GLboolean __GLEW_AMD_gpu_shader_int16 = GL_FALSE; GLboolean __GLEW_AMD_gpu_shader_int64 = GL_FALSE; GLboolean __GLEW_AMD_interleaved_elements = GL_FALSE; GLboolean __GLEW_AMD_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_AMD_name_gen_delete = GL_FALSE; GLboolean __GLEW_AMD_occlusion_query_event = GL_FALSE; GLboolean __GLEW_AMD_performance_monitor = GL_FALSE; GLboolean __GLEW_AMD_pinned_memory = GL_FALSE; GLboolean __GLEW_AMD_program_binary_Z400 = GL_FALSE; GLboolean __GLEW_AMD_query_buffer_object = GL_FALSE; GLboolean __GLEW_AMD_sample_positions = GL_FALSE; GLboolean __GLEW_AMD_seamless_cubemap_per_texture = GL_FALSE; GLboolean __GLEW_AMD_shader_atomic_counter_ops = GL_FALSE; GLboolean __GLEW_AMD_shader_ballot = GL_FALSE; GLboolean __GLEW_AMD_shader_explicit_vertex_parameter = GL_FALSE; GLboolean __GLEW_AMD_shader_stencil_export = GL_FALSE; GLboolean __GLEW_AMD_shader_stencil_value_export = GL_FALSE; GLboolean __GLEW_AMD_shader_trinary_minmax = GL_FALSE; GLboolean __GLEW_AMD_sparse_texture = GL_FALSE; GLboolean __GLEW_AMD_stencil_operation_extended = GL_FALSE; GLboolean __GLEW_AMD_texture_gather_bias_lod = GL_FALSE; GLboolean __GLEW_AMD_texture_texture4 = GL_FALSE; GLboolean __GLEW_AMD_transform_feedback3_lines_triangles = GL_FALSE; GLboolean __GLEW_AMD_transform_feedback4 = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_layer = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_tessellator = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_viewport_index = GL_FALSE; GLboolean __GLEW_ANDROID_extension_pack_es31a = GL_FALSE; GLboolean __GLEW_ANGLE_depth_texture = GL_FALSE; GLboolean __GLEW_ANGLE_framebuffer_blit = GL_FALSE; GLboolean __GLEW_ANGLE_framebuffer_multisample = GL_FALSE; GLboolean __GLEW_ANGLE_instanced_arrays = GL_FALSE; GLboolean __GLEW_ANGLE_pack_reverse_row_order = GL_FALSE; GLboolean __GLEW_ANGLE_program_binary = GL_FALSE; GLboolean __GLEW_ANGLE_texture_compression_dxt1 = GL_FALSE; GLboolean __GLEW_ANGLE_texture_compression_dxt3 = GL_FALSE; GLboolean __GLEW_ANGLE_texture_compression_dxt5 = GL_FALSE; GLboolean __GLEW_ANGLE_texture_usage = GL_FALSE; GLboolean __GLEW_ANGLE_timer_query = GL_FALSE; GLboolean __GLEW_ANGLE_translated_shader_source = GL_FALSE; GLboolean __GLEW_APPLE_aux_depth_stencil = GL_FALSE; GLboolean __GLEW_APPLE_client_storage = GL_FALSE; GLboolean __GLEW_APPLE_clip_distance = GL_FALSE; GLboolean __GLEW_APPLE_color_buffer_packed_float = GL_FALSE; GLboolean __GLEW_APPLE_copy_texture_levels = GL_FALSE; GLboolean __GLEW_APPLE_element_array = GL_FALSE; GLboolean __GLEW_APPLE_fence = GL_FALSE; GLboolean __GLEW_APPLE_float_pixels = GL_FALSE; GLboolean __GLEW_APPLE_flush_buffer_range = GL_FALSE; GLboolean __GLEW_APPLE_framebuffer_multisample = GL_FALSE; GLboolean __GLEW_APPLE_object_purgeable = GL_FALSE; GLboolean __GLEW_APPLE_pixel_buffer = GL_FALSE; GLboolean __GLEW_APPLE_rgb_422 = GL_FALSE; GLboolean __GLEW_APPLE_row_bytes = GL_FALSE; GLboolean __GLEW_APPLE_specular_vector = GL_FALSE; GLboolean __GLEW_APPLE_sync = GL_FALSE; GLboolean __GLEW_APPLE_texture_2D_limited_npot = GL_FALSE; GLboolean __GLEW_APPLE_texture_format_BGRA8888 = GL_FALSE; GLboolean __GLEW_APPLE_texture_max_level = GL_FALSE; GLboolean __GLEW_APPLE_texture_packed_float = GL_FALSE; GLboolean __GLEW_APPLE_texture_range = GL_FALSE; GLboolean __GLEW_APPLE_transform_hint = GL_FALSE; GLboolean __GLEW_APPLE_vertex_array_object = GL_FALSE; GLboolean __GLEW_APPLE_vertex_array_range = GL_FALSE; GLboolean __GLEW_APPLE_vertex_program_evaluators = GL_FALSE; GLboolean __GLEW_APPLE_ycbcr_422 = GL_FALSE; GLboolean __GLEW_ARB_ES2_compatibility = GL_FALSE; GLboolean __GLEW_ARB_ES3_1_compatibility = GL_FALSE; GLboolean __GLEW_ARB_ES3_2_compatibility = GL_FALSE; GLboolean __GLEW_ARB_ES3_compatibility = GL_FALSE; GLboolean __GLEW_ARB_arrays_of_arrays = GL_FALSE; GLboolean __GLEW_ARB_base_instance = GL_FALSE; GLboolean __GLEW_ARB_bindless_texture = GL_FALSE; GLboolean __GLEW_ARB_blend_func_extended = GL_FALSE; GLboolean __GLEW_ARB_buffer_storage = GL_FALSE; GLboolean __GLEW_ARB_cl_event = GL_FALSE; GLboolean __GLEW_ARB_clear_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_clear_texture = GL_FALSE; GLboolean __GLEW_ARB_clip_control = GL_FALSE; GLboolean __GLEW_ARB_color_buffer_float = GL_FALSE; GLboolean __GLEW_ARB_compatibility = GL_FALSE; GLboolean __GLEW_ARB_compressed_texture_pixel_storage = GL_FALSE; GLboolean __GLEW_ARB_compute_shader = GL_FALSE; GLboolean __GLEW_ARB_compute_variable_group_size = GL_FALSE; GLboolean __GLEW_ARB_conditional_render_inverted = GL_FALSE; GLboolean __GLEW_ARB_conservative_depth = GL_FALSE; GLboolean __GLEW_ARB_copy_buffer = GL_FALSE; GLboolean __GLEW_ARB_copy_image = GL_FALSE; GLboolean __GLEW_ARB_cull_distance = GL_FALSE; GLboolean __GLEW_ARB_debug_output = GL_FALSE; GLboolean __GLEW_ARB_depth_buffer_float = GL_FALSE; GLboolean __GLEW_ARB_depth_clamp = GL_FALSE; GLboolean __GLEW_ARB_depth_texture = GL_FALSE; GLboolean __GLEW_ARB_derivative_control = GL_FALSE; GLboolean __GLEW_ARB_direct_state_access = GL_FALSE; GLboolean __GLEW_ARB_draw_buffers = GL_FALSE; GLboolean __GLEW_ARB_draw_buffers_blend = GL_FALSE; GLboolean __GLEW_ARB_draw_elements_base_vertex = GL_FALSE; GLboolean __GLEW_ARB_draw_indirect = GL_FALSE; GLboolean __GLEW_ARB_draw_instanced = GL_FALSE; GLboolean __GLEW_ARB_enhanced_layouts = GL_FALSE; GLboolean __GLEW_ARB_explicit_attrib_location = GL_FALSE; GLboolean __GLEW_ARB_explicit_uniform_location = GL_FALSE; GLboolean __GLEW_ARB_fragment_coord_conventions = GL_FALSE; GLboolean __GLEW_ARB_fragment_layer_viewport = GL_FALSE; GLboolean __GLEW_ARB_fragment_program = GL_FALSE; GLboolean __GLEW_ARB_fragment_program_shadow = GL_FALSE; GLboolean __GLEW_ARB_fragment_shader = GL_FALSE; GLboolean __GLEW_ARB_fragment_shader_interlock = GL_FALSE; GLboolean __GLEW_ARB_framebuffer_no_attachments = GL_FALSE; GLboolean __GLEW_ARB_framebuffer_object = GL_FALSE; GLboolean __GLEW_ARB_framebuffer_sRGB = GL_FALSE; GLboolean __GLEW_ARB_geometry_shader4 = GL_FALSE; GLboolean __GLEW_ARB_get_program_binary = GL_FALSE; GLboolean __GLEW_ARB_get_texture_sub_image = GL_FALSE; GLboolean __GLEW_ARB_gl_spirv = GL_FALSE; GLboolean __GLEW_ARB_gpu_shader5 = GL_FALSE; GLboolean __GLEW_ARB_gpu_shader_fp64 = GL_FALSE; GLboolean __GLEW_ARB_gpu_shader_int64 = GL_FALSE; GLboolean __GLEW_ARB_half_float_pixel = GL_FALSE; GLboolean __GLEW_ARB_half_float_vertex = GL_FALSE; GLboolean __GLEW_ARB_imaging = GL_FALSE; GLboolean __GLEW_ARB_indirect_parameters = GL_FALSE; GLboolean __GLEW_ARB_instanced_arrays = GL_FALSE; GLboolean __GLEW_ARB_internalformat_query = GL_FALSE; GLboolean __GLEW_ARB_internalformat_query2 = GL_FALSE; GLboolean __GLEW_ARB_invalidate_subdata = GL_FALSE; GLboolean __GLEW_ARB_map_buffer_alignment = GL_FALSE; GLboolean __GLEW_ARB_map_buffer_range = GL_FALSE; GLboolean __GLEW_ARB_matrix_palette = GL_FALSE; GLboolean __GLEW_ARB_multi_bind = GL_FALSE; GLboolean __GLEW_ARB_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_ARB_multisample = GL_FALSE; GLboolean __GLEW_ARB_multitexture = GL_FALSE; GLboolean __GLEW_ARB_occlusion_query = GL_FALSE; GLboolean __GLEW_ARB_occlusion_query2 = GL_FALSE; GLboolean __GLEW_ARB_parallel_shader_compile = GL_FALSE; GLboolean __GLEW_ARB_pipeline_statistics_query = GL_FALSE; GLboolean __GLEW_ARB_pixel_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_point_parameters = GL_FALSE; GLboolean __GLEW_ARB_point_sprite = GL_FALSE; GLboolean __GLEW_ARB_polygon_offset_clamp = GL_FALSE; GLboolean __GLEW_ARB_post_depth_coverage = GL_FALSE; GLboolean __GLEW_ARB_program_interface_query = GL_FALSE; GLboolean __GLEW_ARB_provoking_vertex = GL_FALSE; GLboolean __GLEW_ARB_query_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_robust_buffer_access_behavior = GL_FALSE; GLboolean __GLEW_ARB_robustness = GL_FALSE; GLboolean __GLEW_ARB_robustness_application_isolation = GL_FALSE; GLboolean __GLEW_ARB_robustness_share_group_isolation = GL_FALSE; GLboolean __GLEW_ARB_sample_locations = GL_FALSE; GLboolean __GLEW_ARB_sample_shading = GL_FALSE; GLboolean __GLEW_ARB_sampler_objects = GL_FALSE; GLboolean __GLEW_ARB_seamless_cube_map = GL_FALSE; GLboolean __GLEW_ARB_seamless_cubemap_per_texture = GL_FALSE; GLboolean __GLEW_ARB_separate_shader_objects = GL_FALSE; GLboolean __GLEW_ARB_shader_atomic_counter_ops = GL_FALSE; GLboolean __GLEW_ARB_shader_atomic_counters = GL_FALSE; GLboolean __GLEW_ARB_shader_ballot = GL_FALSE; GLboolean __GLEW_ARB_shader_bit_encoding = GL_FALSE; GLboolean __GLEW_ARB_shader_clock = GL_FALSE; GLboolean __GLEW_ARB_shader_draw_parameters = GL_FALSE; GLboolean __GLEW_ARB_shader_group_vote = GL_FALSE; GLboolean __GLEW_ARB_shader_image_load_store = GL_FALSE; GLboolean __GLEW_ARB_shader_image_size = GL_FALSE; GLboolean __GLEW_ARB_shader_objects = GL_FALSE; GLboolean __GLEW_ARB_shader_precision = GL_FALSE; GLboolean __GLEW_ARB_shader_stencil_export = GL_FALSE; GLboolean __GLEW_ARB_shader_storage_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_shader_subroutine = GL_FALSE; GLboolean __GLEW_ARB_shader_texture_image_samples = GL_FALSE; GLboolean __GLEW_ARB_shader_texture_lod = GL_FALSE; GLboolean __GLEW_ARB_shader_viewport_layer_array = GL_FALSE; GLboolean __GLEW_ARB_shading_language_100 = GL_FALSE; GLboolean __GLEW_ARB_shading_language_420pack = GL_FALSE; GLboolean __GLEW_ARB_shading_language_include = GL_FALSE; GLboolean __GLEW_ARB_shading_language_packing = GL_FALSE; GLboolean __GLEW_ARB_shadow = GL_FALSE; GLboolean __GLEW_ARB_shadow_ambient = GL_FALSE; GLboolean __GLEW_ARB_sparse_buffer = GL_FALSE; GLboolean __GLEW_ARB_sparse_texture = GL_FALSE; GLboolean __GLEW_ARB_sparse_texture2 = GL_FALSE; GLboolean __GLEW_ARB_sparse_texture_clamp = GL_FALSE; GLboolean __GLEW_ARB_spirv_extensions = GL_FALSE; GLboolean __GLEW_ARB_stencil_texturing = GL_FALSE; GLboolean __GLEW_ARB_sync = GL_FALSE; GLboolean __GLEW_ARB_tessellation_shader = GL_FALSE; GLboolean __GLEW_ARB_texture_barrier = GL_FALSE; GLboolean __GLEW_ARB_texture_border_clamp = GL_FALSE; GLboolean __GLEW_ARB_texture_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_texture_buffer_object_rgb32 = GL_FALSE; GLboolean __GLEW_ARB_texture_buffer_range = GL_FALSE; GLboolean __GLEW_ARB_texture_compression = GL_FALSE; GLboolean __GLEW_ARB_texture_compression_bptc = GL_FALSE; GLboolean __GLEW_ARB_texture_compression_rgtc = GL_FALSE; GLboolean __GLEW_ARB_texture_cube_map = GL_FALSE; GLboolean __GLEW_ARB_texture_cube_map_array = GL_FALSE; GLboolean __GLEW_ARB_texture_env_add = GL_FALSE; GLboolean __GLEW_ARB_texture_env_combine = GL_FALSE; GLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE; GLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE; GLboolean __GLEW_ARB_texture_filter_anisotropic = GL_FALSE; GLboolean __GLEW_ARB_texture_filter_minmax = GL_FALSE; GLboolean __GLEW_ARB_texture_float = GL_FALSE; GLboolean __GLEW_ARB_texture_gather = GL_FALSE; GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge = GL_FALSE; GLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE; GLboolean __GLEW_ARB_texture_multisample = GL_FALSE; GLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE; GLboolean __GLEW_ARB_texture_query_levels = GL_FALSE; GLboolean __GLEW_ARB_texture_query_lod = GL_FALSE; GLboolean __GLEW_ARB_texture_rectangle = GL_FALSE; GLboolean __GLEW_ARB_texture_rg = GL_FALSE; GLboolean __GLEW_ARB_texture_rgb10_a2ui = GL_FALSE; GLboolean __GLEW_ARB_texture_stencil8 = GL_FALSE; GLboolean __GLEW_ARB_texture_storage = GL_FALSE; GLboolean __GLEW_ARB_texture_storage_multisample = GL_FALSE; GLboolean __GLEW_ARB_texture_swizzle = GL_FALSE; GLboolean __GLEW_ARB_texture_view = GL_FALSE; GLboolean __GLEW_ARB_timer_query = GL_FALSE; GLboolean __GLEW_ARB_transform_feedback2 = GL_FALSE; GLboolean __GLEW_ARB_transform_feedback3 = GL_FALSE; GLboolean __GLEW_ARB_transform_feedback_instanced = GL_FALSE; GLboolean __GLEW_ARB_transform_feedback_overflow_query = GL_FALSE; GLboolean __GLEW_ARB_transpose_matrix = GL_FALSE; GLboolean __GLEW_ARB_uniform_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_vertex_array_bgra = GL_FALSE; GLboolean __GLEW_ARB_vertex_array_object = GL_FALSE; GLboolean __GLEW_ARB_vertex_attrib_64bit = GL_FALSE; GLboolean __GLEW_ARB_vertex_attrib_binding = GL_FALSE; GLboolean __GLEW_ARB_vertex_blend = GL_FALSE; GLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_vertex_program = GL_FALSE; GLboolean __GLEW_ARB_vertex_shader = GL_FALSE; GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev = GL_FALSE; GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev = GL_FALSE; GLboolean __GLEW_ARB_viewport_array = GL_FALSE; GLboolean __GLEW_ARB_window_pos = GL_FALSE; GLboolean __GLEW_ARM_mali_program_binary = GL_FALSE; GLboolean __GLEW_ARM_mali_shader_binary = GL_FALSE; GLboolean __GLEW_ARM_rgba8 = GL_FALSE; GLboolean __GLEW_ARM_shader_framebuffer_fetch = GL_FALSE; GLboolean __GLEW_ARM_shader_framebuffer_fetch_depth_stencil = GL_FALSE; GLboolean __GLEW_ATIX_point_sprites = GL_FALSE; GLboolean __GLEW_ATIX_texture_env_combine3 = GL_FALSE; GLboolean __GLEW_ATIX_texture_env_route = GL_FALSE; GLboolean __GLEW_ATIX_vertex_shader_output_point_size = GL_FALSE; GLboolean __GLEW_ATI_draw_buffers = GL_FALSE; GLboolean __GLEW_ATI_element_array = GL_FALSE; GLboolean __GLEW_ATI_envmap_bumpmap = GL_FALSE; GLboolean __GLEW_ATI_fragment_shader = GL_FALSE; GLboolean __GLEW_ATI_map_object_buffer = GL_FALSE; GLboolean __GLEW_ATI_meminfo = GL_FALSE; GLboolean __GLEW_ATI_pn_triangles = GL_FALSE; GLboolean __GLEW_ATI_separate_stencil = GL_FALSE; GLboolean __GLEW_ATI_shader_texture_lod = GL_FALSE; GLboolean __GLEW_ATI_text_fragment_shader = GL_FALSE; GLboolean __GLEW_ATI_texture_compression_3dc = GL_FALSE; GLboolean __GLEW_ATI_texture_env_combine3 = GL_FALSE; GLboolean __GLEW_ATI_texture_float = GL_FALSE; GLboolean __GLEW_ATI_texture_mirror_once = GL_FALSE; GLboolean __GLEW_ATI_vertex_array_object = GL_FALSE; GLboolean __GLEW_ATI_vertex_attrib_array_object = GL_FALSE; GLboolean __GLEW_ATI_vertex_streams = GL_FALSE; GLboolean __GLEW_EGL_KHR_context_flush_control = GL_FALSE; GLboolean __GLEW_EGL_NV_robustness_video_memory_purge = GL_FALSE; GLboolean __GLEW_EXT_422_pixels = GL_FALSE; GLboolean __GLEW_EXT_Cg_shader = GL_FALSE; GLboolean __GLEW_EXT_EGL_image_array = GL_FALSE; GLboolean __GLEW_EXT_YUV_target = GL_FALSE; GLboolean __GLEW_EXT_abgr = GL_FALSE; GLboolean __GLEW_EXT_base_instance = GL_FALSE; GLboolean __GLEW_EXT_bgra = GL_FALSE; GLboolean __GLEW_EXT_bindable_uniform = GL_FALSE; GLboolean __GLEW_EXT_blend_color = GL_FALSE; GLboolean __GLEW_EXT_blend_equation_separate = GL_FALSE; GLboolean __GLEW_EXT_blend_func_extended = GL_FALSE; GLboolean __GLEW_EXT_blend_func_separate = GL_FALSE; GLboolean __GLEW_EXT_blend_logic_op = GL_FALSE; GLboolean __GLEW_EXT_blend_minmax = GL_FALSE; GLboolean __GLEW_EXT_blend_subtract = GL_FALSE; GLboolean __GLEW_EXT_buffer_storage = GL_FALSE; GLboolean __GLEW_EXT_clear_texture = GL_FALSE; GLboolean __GLEW_EXT_clip_cull_distance = GL_FALSE; GLboolean __GLEW_EXT_clip_volume_hint = GL_FALSE; GLboolean __GLEW_EXT_cmyka = GL_FALSE; GLboolean __GLEW_EXT_color_buffer_float = GL_FALSE; GLboolean __GLEW_EXT_color_buffer_half_float = GL_FALSE; GLboolean __GLEW_EXT_color_subtable = GL_FALSE; GLboolean __GLEW_EXT_compiled_vertex_array = GL_FALSE; GLboolean __GLEW_EXT_compressed_ETC1_RGB8_sub_texture = GL_FALSE; GLboolean __GLEW_EXT_conservative_depth = GL_FALSE; GLboolean __GLEW_EXT_convolution = GL_FALSE; GLboolean __GLEW_EXT_coordinate_frame = GL_FALSE; GLboolean __GLEW_EXT_copy_image = GL_FALSE; GLboolean __GLEW_EXT_copy_texture = GL_FALSE; GLboolean __GLEW_EXT_cull_vertex = GL_FALSE; GLboolean __GLEW_EXT_debug_label = GL_FALSE; GLboolean __GLEW_EXT_debug_marker = GL_FALSE; GLboolean __GLEW_EXT_depth_bounds_test = GL_FALSE; GLboolean __GLEW_EXT_direct_state_access = GL_FALSE; GLboolean __GLEW_EXT_discard_framebuffer = GL_FALSE; GLboolean __GLEW_EXT_draw_buffers = GL_FALSE; GLboolean __GLEW_EXT_draw_buffers2 = GL_FALSE; GLboolean __GLEW_EXT_draw_buffers_indexed = GL_FALSE; GLboolean __GLEW_EXT_draw_elements_base_vertex = GL_FALSE; GLboolean __GLEW_EXT_draw_instanced = GL_FALSE; GLboolean __GLEW_EXT_draw_range_elements = GL_FALSE; GLboolean __GLEW_EXT_external_buffer = GL_FALSE; GLboolean __GLEW_EXT_float_blend = GL_FALSE; GLboolean __GLEW_EXT_fog_coord = GL_FALSE; GLboolean __GLEW_EXT_frag_depth = GL_FALSE; GLboolean __GLEW_EXT_fragment_lighting = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_blit = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_multisample = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_object = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_sRGB = GL_FALSE; GLboolean __GLEW_EXT_geometry_point_size = GL_FALSE; GLboolean __GLEW_EXT_geometry_shader = GL_FALSE; GLboolean __GLEW_EXT_geometry_shader4 = GL_FALSE; GLboolean __GLEW_EXT_gpu_program_parameters = GL_FALSE; GLboolean __GLEW_EXT_gpu_shader4 = GL_FALSE; GLboolean __GLEW_EXT_gpu_shader5 = GL_FALSE; GLboolean __GLEW_EXT_histogram = GL_FALSE; GLboolean __GLEW_EXT_index_array_formats = GL_FALSE; GLboolean __GLEW_EXT_index_func = GL_FALSE; GLboolean __GLEW_EXT_index_material = GL_FALSE; GLboolean __GLEW_EXT_index_texture = GL_FALSE; GLboolean __GLEW_EXT_instanced_arrays = GL_FALSE; GLboolean __GLEW_EXT_light_texture = GL_FALSE; GLboolean __GLEW_EXT_map_buffer_range = GL_FALSE; GLboolean __GLEW_EXT_memory_object = GL_FALSE; GLboolean __GLEW_EXT_memory_object_fd = GL_FALSE; GLboolean __GLEW_EXT_memory_object_win32 = GL_FALSE; GLboolean __GLEW_EXT_misc_attribute = GL_FALSE; GLboolean __GLEW_EXT_multi_draw_arrays = GL_FALSE; GLboolean __GLEW_EXT_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_EXT_multiple_textures = GL_FALSE; GLboolean __GLEW_EXT_multisample = GL_FALSE; GLboolean __GLEW_EXT_multisample_compatibility = GL_FALSE; GLboolean __GLEW_EXT_multisampled_render_to_texture = GL_FALSE; GLboolean __GLEW_EXT_multisampled_render_to_texture2 = GL_FALSE; GLboolean __GLEW_EXT_multiview_draw_buffers = GL_FALSE; GLboolean __GLEW_EXT_packed_depth_stencil = GL_FALSE; GLboolean __GLEW_EXT_packed_float = GL_FALSE; GLboolean __GLEW_EXT_packed_pixels = GL_FALSE; GLboolean __GLEW_EXT_paletted_texture = GL_FALSE; GLboolean __GLEW_EXT_pixel_buffer_object = GL_FALSE; GLboolean __GLEW_EXT_pixel_transform = GL_FALSE; GLboolean __GLEW_EXT_pixel_transform_color_table = GL_FALSE; GLboolean __GLEW_EXT_point_parameters = GL_FALSE; GLboolean __GLEW_EXT_polygon_offset = GL_FALSE; GLboolean __GLEW_EXT_polygon_offset_clamp = GL_FALSE; GLboolean __GLEW_EXT_post_depth_coverage = GL_FALSE; GLboolean __GLEW_EXT_provoking_vertex = GL_FALSE; GLboolean __GLEW_EXT_pvrtc_sRGB = GL_FALSE; GLboolean __GLEW_EXT_raster_multisample = GL_FALSE; GLboolean __GLEW_EXT_read_format_bgra = GL_FALSE; GLboolean __GLEW_EXT_render_snorm = GL_FALSE; GLboolean __GLEW_EXT_rescale_normal = GL_FALSE; GLboolean __GLEW_EXT_sRGB = GL_FALSE; GLboolean __GLEW_EXT_sRGB_write_control = GL_FALSE; GLboolean __GLEW_EXT_scene_marker = GL_FALSE; GLboolean __GLEW_EXT_secondary_color = GL_FALSE; GLboolean __GLEW_EXT_semaphore = GL_FALSE; GLboolean __GLEW_EXT_semaphore_fd = GL_FALSE; GLboolean __GLEW_EXT_semaphore_win32 = GL_FALSE; GLboolean __GLEW_EXT_separate_shader_objects = GL_FALSE; GLboolean __GLEW_EXT_separate_specular_color = GL_FALSE; GLboolean __GLEW_EXT_shader_framebuffer_fetch = GL_FALSE; GLboolean __GLEW_EXT_shader_group_vote = GL_FALSE; GLboolean __GLEW_EXT_shader_image_load_formatted = GL_FALSE; GLboolean __GLEW_EXT_shader_image_load_store = GL_FALSE; GLboolean __GLEW_EXT_shader_implicit_conversions = GL_FALSE; GLboolean __GLEW_EXT_shader_integer_mix = GL_FALSE; GLboolean __GLEW_EXT_shader_io_blocks = GL_FALSE; GLboolean __GLEW_EXT_shader_non_constant_global_initializers = GL_FALSE; GLboolean __GLEW_EXT_shader_pixel_local_storage = GL_FALSE; GLboolean __GLEW_EXT_shader_pixel_local_storage2 = GL_FALSE; GLboolean __GLEW_EXT_shader_texture_lod = GL_FALSE; GLboolean __GLEW_EXT_shadow_funcs = GL_FALSE; GLboolean __GLEW_EXT_shadow_samplers = GL_FALSE; GLboolean __GLEW_EXT_shared_texture_palette = GL_FALSE; GLboolean __GLEW_EXT_sparse_texture = GL_FALSE; GLboolean __GLEW_EXT_sparse_texture2 = GL_FALSE; GLboolean __GLEW_EXT_stencil_clear_tag = GL_FALSE; GLboolean __GLEW_EXT_stencil_two_side = GL_FALSE; GLboolean __GLEW_EXT_stencil_wrap = GL_FALSE; GLboolean __GLEW_EXT_subtexture = GL_FALSE; GLboolean __GLEW_EXT_texture = GL_FALSE; GLboolean __GLEW_EXT_texture3D = GL_FALSE; GLboolean __GLEW_EXT_texture_array = GL_FALSE; GLboolean __GLEW_EXT_texture_buffer_object = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_astc_decode_mode = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5 = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_bptc = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_dxt1 = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_latc = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_rgtc = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_s3tc = GL_FALSE; GLboolean __GLEW_EXT_texture_cube_map = GL_FALSE; GLboolean __GLEW_EXT_texture_cube_map_array = GL_FALSE; GLboolean __GLEW_EXT_texture_edge_clamp = GL_FALSE; GLboolean __GLEW_EXT_texture_env = GL_FALSE; GLboolean __GLEW_EXT_texture_env_add = GL_FALSE; GLboolean __GLEW_EXT_texture_env_combine = GL_FALSE; GLboolean __GLEW_EXT_texture_env_dot3 = GL_FALSE; GLboolean __GLEW_EXT_texture_filter_anisotropic = GL_FALSE; GLboolean __GLEW_EXT_texture_filter_minmax = GL_FALSE; GLboolean __GLEW_EXT_texture_format_BGRA8888 = GL_FALSE; GLboolean __GLEW_EXT_texture_integer = GL_FALSE; GLboolean __GLEW_EXT_texture_lod_bias = GL_FALSE; GLboolean __GLEW_EXT_texture_mirror_clamp = GL_FALSE; GLboolean __GLEW_EXT_texture_norm16 = GL_FALSE; GLboolean __GLEW_EXT_texture_object = GL_FALSE; GLboolean __GLEW_EXT_texture_perturb_normal = GL_FALSE; GLboolean __GLEW_EXT_texture_rectangle = GL_FALSE; GLboolean __GLEW_EXT_texture_rg = GL_FALSE; GLboolean __GLEW_EXT_texture_sRGB = GL_FALSE; GLboolean __GLEW_EXT_texture_sRGB_R8 = GL_FALSE; GLboolean __GLEW_EXT_texture_sRGB_RG8 = GL_FALSE; GLboolean __GLEW_EXT_texture_sRGB_decode = GL_FALSE; GLboolean __GLEW_EXT_texture_shared_exponent = GL_FALSE; GLboolean __GLEW_EXT_texture_snorm = GL_FALSE; GLboolean __GLEW_EXT_texture_storage = GL_FALSE; GLboolean __GLEW_EXT_texture_swizzle = GL_FALSE; GLboolean __GLEW_EXT_texture_type_2_10_10_10_REV = GL_FALSE; GLboolean __GLEW_EXT_texture_view = GL_FALSE; GLboolean __GLEW_EXT_timer_query = GL_FALSE; GLboolean __GLEW_EXT_transform_feedback = GL_FALSE; GLboolean __GLEW_EXT_unpack_subimage = GL_FALSE; GLboolean __GLEW_EXT_vertex_array = GL_FALSE; GLboolean __GLEW_EXT_vertex_array_bgra = GL_FALSE; GLboolean __GLEW_EXT_vertex_array_setXXX = GL_FALSE; GLboolean __GLEW_EXT_vertex_attrib_64bit = GL_FALSE; GLboolean __GLEW_EXT_vertex_shader = GL_FALSE; GLboolean __GLEW_EXT_vertex_weighting = GL_FALSE; GLboolean __GLEW_EXT_win32_keyed_mutex = GL_FALSE; GLboolean __GLEW_EXT_window_rectangles = GL_FALSE; GLboolean __GLEW_EXT_x11_sync_object = GL_FALSE; GLboolean __GLEW_GREMEDY_frame_terminator = GL_FALSE; GLboolean __GLEW_GREMEDY_string_marker = GL_FALSE; GLboolean __GLEW_HP_convolution_border_modes = GL_FALSE; GLboolean __GLEW_HP_image_transform = GL_FALSE; GLboolean __GLEW_HP_occlusion_test = GL_FALSE; GLboolean __GLEW_HP_texture_lighting = GL_FALSE; GLboolean __GLEW_IBM_cull_vertex = GL_FALSE; GLboolean __GLEW_IBM_multimode_draw_arrays = GL_FALSE; GLboolean __GLEW_IBM_rasterpos_clip = GL_FALSE; GLboolean __GLEW_IBM_static_data = GL_FALSE; GLboolean __GLEW_IBM_texture_mirrored_repeat = GL_FALSE; GLboolean __GLEW_IBM_vertex_array_lists = GL_FALSE; GLboolean __GLEW_INGR_color_clamp = GL_FALSE; GLboolean __GLEW_INGR_interlace_read = GL_FALSE; GLboolean __GLEW_INTEL_conservative_rasterization = GL_FALSE; GLboolean __GLEW_INTEL_fragment_shader_ordering = GL_FALSE; GLboolean __GLEW_INTEL_framebuffer_CMAA = GL_FALSE; GLboolean __GLEW_INTEL_map_texture = GL_FALSE; GLboolean __GLEW_INTEL_parallel_arrays = GL_FALSE; GLboolean __GLEW_INTEL_performance_query = GL_FALSE; GLboolean __GLEW_INTEL_texture_scissor = GL_FALSE; GLboolean __GLEW_KHR_blend_equation_advanced = GL_FALSE; GLboolean __GLEW_KHR_blend_equation_advanced_coherent = GL_FALSE; GLboolean __GLEW_KHR_context_flush_control = GL_FALSE; GLboolean __GLEW_KHR_debug = GL_FALSE; GLboolean __GLEW_KHR_no_error = GL_FALSE; GLboolean __GLEW_KHR_parallel_shader_compile = GL_FALSE; GLboolean __GLEW_KHR_robust_buffer_access_behavior = GL_FALSE; GLboolean __GLEW_KHR_robustness = GL_FALSE; GLboolean __GLEW_KHR_texture_compression_astc_hdr = GL_FALSE; GLboolean __GLEW_KHR_texture_compression_astc_ldr = GL_FALSE; GLboolean __GLEW_KHR_texture_compression_astc_sliced_3d = GL_FALSE; GLboolean __GLEW_KTX_buffer_region = GL_FALSE; GLboolean __GLEW_MESAX_texture_stack = GL_FALSE; GLboolean __GLEW_MESA_pack_invert = GL_FALSE; GLboolean __GLEW_MESA_resize_buffers = GL_FALSE; GLboolean __GLEW_MESA_shader_integer_functions = GL_FALSE; GLboolean __GLEW_MESA_window_pos = GL_FALSE; GLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE; GLboolean __GLEW_NVX_blend_equation_advanced_multi_draw_buffers = GL_FALSE; GLboolean __GLEW_NVX_conditional_render = GL_FALSE; GLboolean __GLEW_NVX_gpu_memory_info = GL_FALSE; GLboolean __GLEW_NVX_linked_gpu_multicast = GL_FALSE; GLboolean __GLEW_NV_3dvision_settings = GL_FALSE; GLboolean __GLEW_NV_EGL_stream_consumer_external = GL_FALSE; GLboolean __GLEW_NV_alpha_to_coverage_dither_control = GL_FALSE; GLboolean __GLEW_NV_bgr = GL_FALSE; GLboolean __GLEW_NV_bindless_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_NV_bindless_multi_draw_indirect_count = GL_FALSE; GLboolean __GLEW_NV_bindless_texture = GL_FALSE; GLboolean __GLEW_NV_blend_equation_advanced = GL_FALSE; GLboolean __GLEW_NV_blend_equation_advanced_coherent = GL_FALSE; GLboolean __GLEW_NV_blend_minmax_factor = GL_FALSE; GLboolean __GLEW_NV_blend_square = GL_FALSE; GLboolean __GLEW_NV_clip_space_w_scaling = GL_FALSE; GLboolean __GLEW_NV_command_list = GL_FALSE; GLboolean __GLEW_NV_compute_program5 = GL_FALSE; GLboolean __GLEW_NV_conditional_render = GL_FALSE; GLboolean __GLEW_NV_conservative_raster = GL_FALSE; GLboolean __GLEW_NV_conservative_raster_dilate = GL_FALSE; GLboolean __GLEW_NV_conservative_raster_pre_snap_triangles = GL_FALSE; GLboolean __GLEW_NV_copy_buffer = GL_FALSE; GLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE; GLboolean __GLEW_NV_copy_image = GL_FALSE; GLboolean __GLEW_NV_deep_texture3D = GL_FALSE; GLboolean __GLEW_NV_depth_buffer_float = GL_FALSE; GLboolean __GLEW_NV_depth_clamp = GL_FALSE; GLboolean __GLEW_NV_depth_range_unclamped = GL_FALSE; GLboolean __GLEW_NV_draw_buffers = GL_FALSE; GLboolean __GLEW_NV_draw_instanced = GL_FALSE; GLboolean __GLEW_NV_draw_texture = GL_FALSE; GLboolean __GLEW_NV_draw_vulkan_image = GL_FALSE; GLboolean __GLEW_NV_evaluators = GL_FALSE; GLboolean __GLEW_NV_explicit_attrib_location = GL_FALSE; GLboolean __GLEW_NV_explicit_multisample = GL_FALSE; GLboolean __GLEW_NV_fbo_color_attachments = GL_FALSE; GLboolean __GLEW_NV_fence = GL_FALSE; GLboolean __GLEW_NV_fill_rectangle = GL_FALSE; GLboolean __GLEW_NV_float_buffer = GL_FALSE; GLboolean __GLEW_NV_fog_distance = GL_FALSE; GLboolean __GLEW_NV_fragment_coverage_to_color = GL_FALSE; GLboolean __GLEW_NV_fragment_program = GL_FALSE; GLboolean __GLEW_NV_fragment_program2 = GL_FALSE; GLboolean __GLEW_NV_fragment_program4 = GL_FALSE; GLboolean __GLEW_NV_fragment_program_option = GL_FALSE; GLboolean __GLEW_NV_fragment_shader_interlock = GL_FALSE; GLboolean __GLEW_NV_framebuffer_blit = GL_FALSE; GLboolean __GLEW_NV_framebuffer_mixed_samples = GL_FALSE; GLboolean __GLEW_NV_framebuffer_multisample = GL_FALSE; GLboolean __GLEW_NV_framebuffer_multisample_coverage = GL_FALSE; GLboolean __GLEW_NV_generate_mipmap_sRGB = GL_FALSE; GLboolean __GLEW_NV_geometry_program4 = GL_FALSE; GLboolean __GLEW_NV_geometry_shader4 = GL_FALSE; GLboolean __GLEW_NV_geometry_shader_passthrough = GL_FALSE; GLboolean __GLEW_NV_gpu_multicast = GL_FALSE; GLboolean __GLEW_NV_gpu_program4 = GL_FALSE; GLboolean __GLEW_NV_gpu_program5 = GL_FALSE; GLboolean __GLEW_NV_gpu_program5_mem_extended = GL_FALSE; GLboolean __GLEW_NV_gpu_program_fp64 = GL_FALSE; GLboolean __GLEW_NV_gpu_shader5 = GL_FALSE; GLboolean __GLEW_NV_half_float = GL_FALSE; GLboolean __GLEW_NV_image_formats = GL_FALSE; GLboolean __GLEW_NV_instanced_arrays = GL_FALSE; GLboolean __GLEW_NV_internalformat_sample_query = GL_FALSE; GLboolean __GLEW_NV_light_max_exponent = GL_FALSE; GLboolean __GLEW_NV_multisample_coverage = GL_FALSE; GLboolean __GLEW_NV_multisample_filter_hint = GL_FALSE; GLboolean __GLEW_NV_non_square_matrices = GL_FALSE; GLboolean __GLEW_NV_occlusion_query = GL_FALSE; GLboolean __GLEW_NV_pack_subimage = GL_FALSE; GLboolean __GLEW_NV_packed_depth_stencil = GL_FALSE; GLboolean __GLEW_NV_packed_float = GL_FALSE; GLboolean __GLEW_NV_packed_float_linear = GL_FALSE; GLboolean __GLEW_NV_parameter_buffer_object = GL_FALSE; GLboolean __GLEW_NV_parameter_buffer_object2 = GL_FALSE; GLboolean __GLEW_NV_path_rendering = GL_FALSE; GLboolean __GLEW_NV_path_rendering_shared_edge = GL_FALSE; GLboolean __GLEW_NV_pixel_buffer_object = GL_FALSE; GLboolean __GLEW_NV_pixel_data_range = GL_FALSE; GLboolean __GLEW_NV_platform_binary = GL_FALSE; GLboolean __GLEW_NV_point_sprite = GL_FALSE; GLboolean __GLEW_NV_polygon_mode = GL_FALSE; GLboolean __GLEW_NV_present_video = GL_FALSE; GLboolean __GLEW_NV_primitive_restart = GL_FALSE; GLboolean __GLEW_NV_read_depth = GL_FALSE; GLboolean __GLEW_NV_read_depth_stencil = GL_FALSE; GLboolean __GLEW_NV_read_stencil = GL_FALSE; GLboolean __GLEW_NV_register_combiners = GL_FALSE; GLboolean __GLEW_NV_register_combiners2 = GL_FALSE; GLboolean __GLEW_NV_robustness_video_memory_purge = GL_FALSE; GLboolean __GLEW_NV_sRGB_formats = GL_FALSE; GLboolean __GLEW_NV_sample_locations = GL_FALSE; GLboolean __GLEW_NV_sample_mask_override_coverage = GL_FALSE; GLboolean __GLEW_NV_shader_atomic_counters = GL_FALSE; GLboolean __GLEW_NV_shader_atomic_float = GL_FALSE; GLboolean __GLEW_NV_shader_atomic_float64 = GL_FALSE; GLboolean __GLEW_NV_shader_atomic_fp16_vector = GL_FALSE; GLboolean __GLEW_NV_shader_atomic_int64 = GL_FALSE; GLboolean __GLEW_NV_shader_buffer_load = GL_FALSE; GLboolean __GLEW_NV_shader_noperspective_interpolation = GL_FALSE; GLboolean __GLEW_NV_shader_storage_buffer_object = GL_FALSE; GLboolean __GLEW_NV_shader_thread_group = GL_FALSE; GLboolean __GLEW_NV_shader_thread_shuffle = GL_FALSE; GLboolean __GLEW_NV_shadow_samplers_array = GL_FALSE; GLboolean __GLEW_NV_shadow_samplers_cube = GL_FALSE; GLboolean __GLEW_NV_stereo_view_rendering = GL_FALSE; GLboolean __GLEW_NV_tessellation_program5 = GL_FALSE; GLboolean __GLEW_NV_texgen_emboss = GL_FALSE; GLboolean __GLEW_NV_texgen_reflection = GL_FALSE; GLboolean __GLEW_NV_texture_array = GL_FALSE; GLboolean __GLEW_NV_texture_barrier = GL_FALSE; GLboolean __GLEW_NV_texture_border_clamp = GL_FALSE; GLboolean __GLEW_NV_texture_compression_latc = GL_FALSE; GLboolean __GLEW_NV_texture_compression_s3tc = GL_FALSE; GLboolean __GLEW_NV_texture_compression_s3tc_update = GL_FALSE; GLboolean __GLEW_NV_texture_compression_vtc = GL_FALSE; GLboolean __GLEW_NV_texture_env_combine4 = GL_FALSE; GLboolean __GLEW_NV_texture_expand_normal = GL_FALSE; GLboolean __GLEW_NV_texture_multisample = GL_FALSE; GLboolean __GLEW_NV_texture_npot_2D_mipmap = GL_FALSE; GLboolean __GLEW_NV_texture_rectangle = GL_FALSE; GLboolean __GLEW_NV_texture_rectangle_compressed = GL_FALSE; GLboolean __GLEW_NV_texture_shader = GL_FALSE; GLboolean __GLEW_NV_texture_shader2 = GL_FALSE; GLboolean __GLEW_NV_texture_shader3 = GL_FALSE; GLboolean __GLEW_NV_transform_feedback = GL_FALSE; GLboolean __GLEW_NV_transform_feedback2 = GL_FALSE; GLboolean __GLEW_NV_uniform_buffer_unified_memory = GL_FALSE; GLboolean __GLEW_NV_vdpau_interop = GL_FALSE; GLboolean __GLEW_NV_vertex_array_range = GL_FALSE; GLboolean __GLEW_NV_vertex_array_range2 = GL_FALSE; GLboolean __GLEW_NV_vertex_attrib_integer_64bit = GL_FALSE; GLboolean __GLEW_NV_vertex_buffer_unified_memory = GL_FALSE; GLboolean __GLEW_NV_vertex_program = GL_FALSE; GLboolean __GLEW_NV_vertex_program1_1 = GL_FALSE; GLboolean __GLEW_NV_vertex_program2 = GL_FALSE; GLboolean __GLEW_NV_vertex_program2_option = GL_FALSE; GLboolean __GLEW_NV_vertex_program3 = GL_FALSE; GLboolean __GLEW_NV_vertex_program4 = GL_FALSE; GLboolean __GLEW_NV_video_capture = GL_FALSE; GLboolean __GLEW_NV_viewport_array = GL_FALSE; GLboolean __GLEW_NV_viewport_array2 = GL_FALSE; GLboolean __GLEW_NV_viewport_swizzle = GL_FALSE; GLboolean __GLEW_OES_byte_coordinates = GL_FALSE; GLboolean __GLEW_OML_interlace = GL_FALSE; GLboolean __GLEW_OML_resample = GL_FALSE; GLboolean __GLEW_OML_subsample = GL_FALSE; GLboolean __GLEW_OVR_multiview = GL_FALSE; GLboolean __GLEW_OVR_multiview2 = GL_FALSE; GLboolean __GLEW_OVR_multiview_multisampled_render_to_texture = GL_FALSE; GLboolean __GLEW_PGI_misc_hints = GL_FALSE; GLboolean __GLEW_PGI_vertex_hints = GL_FALSE; GLboolean __GLEW_QCOM_alpha_test = GL_FALSE; GLboolean __GLEW_QCOM_binning_control = GL_FALSE; GLboolean __GLEW_QCOM_driver_control = GL_FALSE; GLboolean __GLEW_QCOM_extended_get = GL_FALSE; GLboolean __GLEW_QCOM_extended_get2 = GL_FALSE; GLboolean __GLEW_QCOM_framebuffer_foveated = GL_FALSE; GLboolean __GLEW_QCOM_perfmon_global_mode = GL_FALSE; GLboolean __GLEW_QCOM_shader_framebuffer_fetch_noncoherent = GL_FALSE; GLboolean __GLEW_QCOM_tiled_rendering = GL_FALSE; GLboolean __GLEW_QCOM_writeonly_rendering = GL_FALSE; GLboolean __GLEW_REGAL_ES1_0_compatibility = GL_FALSE; GLboolean __GLEW_REGAL_ES1_1_compatibility = GL_FALSE; GLboolean __GLEW_REGAL_enable = GL_FALSE; GLboolean __GLEW_REGAL_error_string = GL_FALSE; GLboolean __GLEW_REGAL_extension_query = GL_FALSE; GLboolean __GLEW_REGAL_log = GL_FALSE; GLboolean __GLEW_REGAL_proc_address = GL_FALSE; GLboolean __GLEW_REND_screen_coordinates = GL_FALSE; GLboolean __GLEW_S3_s3tc = GL_FALSE; GLboolean __GLEW_SGIS_clip_band_hint = GL_FALSE; GLboolean __GLEW_SGIS_color_range = GL_FALSE; GLboolean __GLEW_SGIS_detail_texture = GL_FALSE; GLboolean __GLEW_SGIS_fog_function = GL_FALSE; GLboolean __GLEW_SGIS_generate_mipmap = GL_FALSE; GLboolean __GLEW_SGIS_line_texgen = GL_FALSE; GLboolean __GLEW_SGIS_multisample = GL_FALSE; GLboolean __GLEW_SGIS_multitexture = GL_FALSE; GLboolean __GLEW_SGIS_pixel_texture = GL_FALSE; GLboolean __GLEW_SGIS_point_line_texgen = GL_FALSE; GLboolean __GLEW_SGIS_shared_multisample = GL_FALSE; GLboolean __GLEW_SGIS_sharpen_texture = GL_FALSE; GLboolean __GLEW_SGIS_texture4D = GL_FALSE; GLboolean __GLEW_SGIS_texture_border_clamp = GL_FALSE; GLboolean __GLEW_SGIS_texture_edge_clamp = GL_FALSE; GLboolean __GLEW_SGIS_texture_filter4 = GL_FALSE; GLboolean __GLEW_SGIS_texture_lod = GL_FALSE; GLboolean __GLEW_SGIS_texture_select = GL_FALSE; GLboolean __GLEW_SGIX_async = GL_FALSE; GLboolean __GLEW_SGIX_async_histogram = GL_FALSE; GLboolean __GLEW_SGIX_async_pixel = GL_FALSE; GLboolean __GLEW_SGIX_bali_g_instruments = GL_FALSE; GLboolean __GLEW_SGIX_bali_r_instruments = GL_FALSE; GLboolean __GLEW_SGIX_bali_timer_instruments = GL_FALSE; GLboolean __GLEW_SGIX_blend_alpha_minmax = GL_FALSE; GLboolean __GLEW_SGIX_blend_cadd = GL_FALSE; GLboolean __GLEW_SGIX_blend_cmultiply = GL_FALSE; GLboolean __GLEW_SGIX_calligraphic_fragment = GL_FALSE; GLboolean __GLEW_SGIX_clipmap = GL_FALSE; GLboolean __GLEW_SGIX_color_matrix_accuracy = GL_FALSE; GLboolean __GLEW_SGIX_color_table_index_mode = GL_FALSE; GLboolean __GLEW_SGIX_complex_polar = GL_FALSE; GLboolean __GLEW_SGIX_convolution_accuracy = GL_FALSE; GLboolean __GLEW_SGIX_cube_map = GL_FALSE; GLboolean __GLEW_SGIX_cylinder_texgen = GL_FALSE; GLboolean __GLEW_SGIX_datapipe = GL_FALSE; GLboolean __GLEW_SGIX_decimation = GL_FALSE; GLboolean __GLEW_SGIX_depth_pass_instrument = GL_FALSE; GLboolean __GLEW_SGIX_depth_texture = GL_FALSE; GLboolean __GLEW_SGIX_dvc = GL_FALSE; GLboolean __GLEW_SGIX_flush_raster = GL_FALSE; GLboolean __GLEW_SGIX_fog_blend = GL_FALSE; GLboolean __GLEW_SGIX_fog_factor_to_alpha = GL_FALSE; GLboolean __GLEW_SGIX_fog_layers = GL_FALSE; GLboolean __GLEW_SGIX_fog_offset = GL_FALSE; GLboolean __GLEW_SGIX_fog_patchy = GL_FALSE; GLboolean __GLEW_SGIX_fog_scale = GL_FALSE; GLboolean __GLEW_SGIX_fog_texture = GL_FALSE; GLboolean __GLEW_SGIX_fragment_lighting_space = GL_FALSE; GLboolean __GLEW_SGIX_fragment_specular_lighting = GL_FALSE; GLboolean __GLEW_SGIX_fragments_instrument = GL_FALSE; GLboolean __GLEW_SGIX_framezoom = GL_FALSE; GLboolean __GLEW_SGIX_icc_texture = GL_FALSE; GLboolean __GLEW_SGIX_igloo_interface = GL_FALSE; GLboolean __GLEW_SGIX_image_compression = GL_FALSE; GLboolean __GLEW_SGIX_impact_pixel_texture = GL_FALSE; GLboolean __GLEW_SGIX_instrument_error = GL_FALSE; GLboolean __GLEW_SGIX_interlace = GL_FALSE; GLboolean __GLEW_SGIX_ir_instrument1 = GL_FALSE; GLboolean __GLEW_SGIX_line_quality_hint = GL_FALSE; GLboolean __GLEW_SGIX_list_priority = GL_FALSE; GLboolean __GLEW_SGIX_mpeg1 = GL_FALSE; GLboolean __GLEW_SGIX_mpeg2 = GL_FALSE; GLboolean __GLEW_SGIX_nonlinear_lighting_pervertex = GL_FALSE; GLboolean __GLEW_SGIX_nurbs_eval = GL_FALSE; GLboolean __GLEW_SGIX_occlusion_instrument = GL_FALSE; GLboolean __GLEW_SGIX_packed_6bytes = GL_FALSE; GLboolean __GLEW_SGIX_pixel_texture = GL_FALSE; GLboolean __GLEW_SGIX_pixel_texture_bits = GL_FALSE; GLboolean __GLEW_SGIX_pixel_texture_lod = GL_FALSE; GLboolean __GLEW_SGIX_pixel_tiles = GL_FALSE; GLboolean __GLEW_SGIX_polynomial_ffd = GL_FALSE; GLboolean __GLEW_SGIX_quad_mesh = GL_FALSE; GLboolean __GLEW_SGIX_reference_plane = GL_FALSE; GLboolean __GLEW_SGIX_resample = GL_FALSE; GLboolean __GLEW_SGIX_scalebias_hint = GL_FALSE; GLboolean __GLEW_SGIX_shadow = GL_FALSE; GLboolean __GLEW_SGIX_shadow_ambient = GL_FALSE; GLboolean __GLEW_SGIX_slim = GL_FALSE; GLboolean __GLEW_SGIX_spotlight_cutoff = GL_FALSE; GLboolean __GLEW_SGIX_sprite = GL_FALSE; GLboolean __GLEW_SGIX_subdiv_patch = GL_FALSE; GLboolean __GLEW_SGIX_subsample = GL_FALSE; GLboolean __GLEW_SGIX_tag_sample_buffer = GL_FALSE; GLboolean __GLEW_SGIX_texture_add_env = GL_FALSE; GLboolean __GLEW_SGIX_texture_coordinate_clamp = GL_FALSE; GLboolean __GLEW_SGIX_texture_lod_bias = GL_FALSE; GLboolean __GLEW_SGIX_texture_mipmap_anisotropic = GL_FALSE; GLboolean __GLEW_SGIX_texture_multi_buffer = GL_FALSE; GLboolean __GLEW_SGIX_texture_phase = GL_FALSE; GLboolean __GLEW_SGIX_texture_range = GL_FALSE; GLboolean __GLEW_SGIX_texture_scale_bias = GL_FALSE; GLboolean __GLEW_SGIX_texture_supersample = GL_FALSE; GLboolean __GLEW_SGIX_vector_ops = GL_FALSE; GLboolean __GLEW_SGIX_vertex_array_object = GL_FALSE; GLboolean __GLEW_SGIX_vertex_preclip = GL_FALSE; GLboolean __GLEW_SGIX_vertex_preclip_hint = GL_FALSE; GLboolean __GLEW_SGIX_ycrcb = GL_FALSE; GLboolean __GLEW_SGIX_ycrcb_subsample = GL_FALSE; GLboolean __GLEW_SGIX_ycrcba = GL_FALSE; GLboolean __GLEW_SGI_color_matrix = GL_FALSE; GLboolean __GLEW_SGI_color_table = GL_FALSE; GLboolean __GLEW_SGI_complex = GL_FALSE; GLboolean __GLEW_SGI_complex_type = GL_FALSE; GLboolean __GLEW_SGI_fft = GL_FALSE; GLboolean __GLEW_SGI_texture_color_table = GL_FALSE; GLboolean __GLEW_SUNX_constant_data = GL_FALSE; GLboolean __GLEW_SUN_convolution_border_modes = GL_FALSE; GLboolean __GLEW_SUN_global_alpha = GL_FALSE; GLboolean __GLEW_SUN_mesh_array = GL_FALSE; GLboolean __GLEW_SUN_read_video_pixels = GL_FALSE; GLboolean __GLEW_SUN_slice_accum = GL_FALSE; GLboolean __GLEW_SUN_triangle_list = GL_FALSE; GLboolean __GLEW_SUN_vertex = GL_FALSE; GLboolean __GLEW_WIN_phong_shading = GL_FALSE; GLboolean __GLEW_WIN_scene_markerXXX = GL_FALSE; GLboolean __GLEW_WIN_specular_fog = GL_FALSE; GLboolean __GLEW_WIN_swap_hint = GL_FALSE; static const char * _glewExtensionLookup[] = { #ifdef GL_VERSION_1_2 "GL_VERSION_1_2", #endif #ifdef GL_VERSION_1_2_1 "GL_VERSION_1_2_1", #endif #ifdef GL_VERSION_1_3 "GL_VERSION_1_3", #endif #ifdef GL_VERSION_1_4 "GL_VERSION_1_4", #endif #ifdef GL_VERSION_1_5 "GL_VERSION_1_5", #endif #ifdef GL_VERSION_2_0 "GL_VERSION_2_0", #endif #ifdef GL_VERSION_2_1 "GL_VERSION_2_1", #endif #ifdef GL_VERSION_3_0 "GL_VERSION_3_0", #endif #ifdef GL_VERSION_3_1 "GL_VERSION_3_1", #endif #ifdef GL_VERSION_3_2 "GL_VERSION_3_2", #endif #ifdef GL_VERSION_3_3 "GL_VERSION_3_3", #endif #ifdef GL_VERSION_4_0 "GL_VERSION_4_0", #endif #ifdef GL_VERSION_4_1 "GL_VERSION_4_1", #endif #ifdef GL_VERSION_4_2 "GL_VERSION_4_2", #endif #ifdef GL_VERSION_4_3 "GL_VERSION_4_3", #endif #ifdef GL_VERSION_4_4 "GL_VERSION_4_4", #endif #ifdef GL_VERSION_4_5 "GL_VERSION_4_5", #endif #ifdef GL_VERSION_4_6 "GL_VERSION_4_6", #endif #ifdef GL_3DFX_multisample "GL_3DFX_multisample", #endif #ifdef GL_3DFX_tbuffer "GL_3DFX_tbuffer", #endif #ifdef GL_3DFX_texture_compression_FXT1 "GL_3DFX_texture_compression_FXT1", #endif #ifdef GL_AMD_blend_minmax_factor "GL_AMD_blend_minmax_factor", #endif #ifdef GL_AMD_compressed_3DC_texture "GL_AMD_compressed_3DC_texture", #endif #ifdef GL_AMD_compressed_ATC_texture "GL_AMD_compressed_ATC_texture", #endif #ifdef GL_AMD_conservative_depth "GL_AMD_conservative_depth", #endif #ifdef GL_AMD_debug_output "GL_AMD_debug_output", #endif #ifdef GL_AMD_depth_clamp_separate "GL_AMD_depth_clamp_separate", #endif #ifdef GL_AMD_draw_buffers_blend "GL_AMD_draw_buffers_blend", #endif #ifdef GL_AMD_framebuffer_sample_positions "GL_AMD_framebuffer_sample_positions", #endif #ifdef GL_AMD_gcn_shader "GL_AMD_gcn_shader", #endif #ifdef GL_AMD_gpu_shader_half_float "GL_AMD_gpu_shader_half_float", #endif #ifdef GL_AMD_gpu_shader_int16 "GL_AMD_gpu_shader_int16", #endif #ifdef GL_AMD_gpu_shader_int64 "GL_AMD_gpu_shader_int64", #endif #ifdef GL_AMD_interleaved_elements "GL_AMD_interleaved_elements", #endif #ifdef GL_AMD_multi_draw_indirect "GL_AMD_multi_draw_indirect", #endif #ifdef GL_AMD_name_gen_delete "GL_AMD_name_gen_delete", #endif #ifdef GL_AMD_occlusion_query_event "GL_AMD_occlusion_query_event", #endif #ifdef GL_AMD_performance_monitor "GL_AMD_performance_monitor", #endif #ifdef GL_AMD_pinned_memory "GL_AMD_pinned_memory", #endif #ifdef GL_AMD_program_binary_Z400 "GL_AMD_program_binary_Z400", #endif #ifdef GL_AMD_query_buffer_object "GL_AMD_query_buffer_object", #endif #ifdef GL_AMD_sample_positions "GL_AMD_sample_positions", #endif #ifdef GL_AMD_seamless_cubemap_per_texture "GL_AMD_seamless_cubemap_per_texture", #endif #ifdef GL_AMD_shader_atomic_counter_ops "GL_AMD_shader_atomic_counter_ops", #endif #ifdef GL_AMD_shader_ballot "GL_AMD_shader_ballot", #endif #ifdef GL_AMD_shader_explicit_vertex_parameter "GL_AMD_shader_explicit_vertex_parameter", #endif #ifdef GL_AMD_shader_stencil_export "GL_AMD_shader_stencil_export", #endif #ifdef GL_AMD_shader_stencil_value_export "GL_AMD_shader_stencil_value_export", #endif #ifdef GL_AMD_shader_trinary_minmax "GL_AMD_shader_trinary_minmax", #endif #ifdef GL_AMD_sparse_texture "GL_AMD_sparse_texture", #endif #ifdef GL_AMD_stencil_operation_extended "GL_AMD_stencil_operation_extended", #endif #ifdef GL_AMD_texture_gather_bias_lod "GL_AMD_texture_gather_bias_lod", #endif #ifdef GL_AMD_texture_texture4 "GL_AMD_texture_texture4", #endif #ifdef GL_AMD_transform_feedback3_lines_triangles "GL_AMD_transform_feedback3_lines_triangles", #endif #ifdef GL_AMD_transform_feedback4 "GL_AMD_transform_feedback4", #endif #ifdef GL_AMD_vertex_shader_layer "GL_AMD_vertex_shader_layer", #endif #ifdef GL_AMD_vertex_shader_tessellator "GL_AMD_vertex_shader_tessellator", #endif #ifdef GL_AMD_vertex_shader_viewport_index "GL_AMD_vertex_shader_viewport_index", #endif #ifdef GL_ANDROID_extension_pack_es31a "GL_ANDROID_extension_pack_es31a", #endif #ifdef GL_ANGLE_depth_texture "GL_ANGLE_depth_texture", #endif #ifdef GL_ANGLE_framebuffer_blit "GL_ANGLE_framebuffer_blit", #endif #ifdef GL_ANGLE_framebuffer_multisample "GL_ANGLE_framebuffer_multisample", #endif #ifdef GL_ANGLE_instanced_arrays "GL_ANGLE_instanced_arrays", #endif #ifdef GL_ANGLE_pack_reverse_row_order "GL_ANGLE_pack_reverse_row_order", #endif #ifdef GL_ANGLE_program_binary "GL_ANGLE_program_binary", #endif #ifdef GL_ANGLE_texture_compression_dxt1 "GL_ANGLE_texture_compression_dxt1", #endif #ifdef GL_ANGLE_texture_compression_dxt3 "GL_ANGLE_texture_compression_dxt3", #endif #ifdef GL_ANGLE_texture_compression_dxt5 "GL_ANGLE_texture_compression_dxt5", #endif #ifdef GL_ANGLE_texture_usage "GL_ANGLE_texture_usage", #endif #ifdef GL_ANGLE_timer_query "GL_ANGLE_timer_query", #endif #ifdef GL_ANGLE_translated_shader_source "GL_ANGLE_translated_shader_source", #endif #ifdef GL_APPLE_aux_depth_stencil "GL_APPLE_aux_depth_stencil", #endif #ifdef GL_APPLE_client_storage "GL_APPLE_client_storage", #endif #ifdef GL_APPLE_clip_distance "GL_APPLE_clip_distance", #endif #ifdef GL_APPLE_color_buffer_packed_float "GL_APPLE_color_buffer_packed_float", #endif #ifdef GL_APPLE_copy_texture_levels "GL_APPLE_copy_texture_levels", #endif #ifdef GL_APPLE_element_array "GL_APPLE_element_array", #endif #ifdef GL_APPLE_fence "GL_APPLE_fence", #endif #ifdef GL_APPLE_float_pixels "GL_APPLE_float_pixels", #endif #ifdef GL_APPLE_flush_buffer_range "GL_APPLE_flush_buffer_range", #endif #ifdef GL_APPLE_framebuffer_multisample "GL_APPLE_framebuffer_multisample", #endif #ifdef GL_APPLE_object_purgeable "GL_APPLE_object_purgeable", #endif #ifdef GL_APPLE_pixel_buffer "GL_APPLE_pixel_buffer", #endif #ifdef GL_APPLE_rgb_422 "GL_APPLE_rgb_422", #endif #ifdef GL_APPLE_row_bytes "GL_APPLE_row_bytes", #endif #ifdef GL_APPLE_specular_vector "GL_APPLE_specular_vector", #endif #ifdef GL_APPLE_sync "GL_APPLE_sync", #endif #ifdef GL_APPLE_texture_2D_limited_npot "GL_APPLE_texture_2D_limited_npot", #endif #ifdef GL_APPLE_texture_format_BGRA8888 "GL_APPLE_texture_format_BGRA8888", #endif #ifdef GL_APPLE_texture_max_level "GL_APPLE_texture_max_level", #endif #ifdef GL_APPLE_texture_packed_float "GL_APPLE_texture_packed_float", #endif #ifdef GL_APPLE_texture_range "GL_APPLE_texture_range", #endif #ifdef GL_APPLE_transform_hint "GL_APPLE_transform_hint", #endif #ifdef GL_APPLE_vertex_array_object "GL_APPLE_vertex_array_object", #endif #ifdef GL_APPLE_vertex_array_range "GL_APPLE_vertex_array_range", #endif #ifdef GL_APPLE_vertex_program_evaluators "GL_APPLE_vertex_program_evaluators", #endif #ifdef GL_APPLE_ycbcr_422 "GL_APPLE_ycbcr_422", #endif #ifdef GL_ARB_ES2_compatibility "GL_ARB_ES2_compatibility", #endif #ifdef GL_ARB_ES3_1_compatibility "GL_ARB_ES3_1_compatibility", #endif #ifdef GL_ARB_ES3_2_compatibility "GL_ARB_ES3_2_compatibility", #endif #ifdef GL_ARB_ES3_compatibility "GL_ARB_ES3_compatibility", #endif #ifdef GL_ARB_arrays_of_arrays "GL_ARB_arrays_of_arrays", #endif #ifdef GL_ARB_base_instance "GL_ARB_base_instance", #endif #ifdef GL_ARB_bindless_texture "GL_ARB_bindless_texture", #endif #ifdef GL_ARB_blend_func_extended "GL_ARB_blend_func_extended", #endif #ifdef GL_ARB_buffer_storage "GL_ARB_buffer_storage", #endif #ifdef GL_ARB_cl_event "GL_ARB_cl_event", #endif #ifdef GL_ARB_clear_buffer_object "GL_ARB_clear_buffer_object", #endif #ifdef GL_ARB_clear_texture "GL_ARB_clear_texture", #endif #ifdef GL_ARB_clip_control "GL_ARB_clip_control", #endif #ifdef GL_ARB_color_buffer_float "GL_ARB_color_buffer_float", #endif #ifdef GL_ARB_compatibility "GL_ARB_compatibility", #endif #ifdef GL_ARB_compressed_texture_pixel_storage "GL_ARB_compressed_texture_pixel_storage", #endif #ifdef GL_ARB_compute_shader "GL_ARB_compute_shader", #endif #ifdef GL_ARB_compute_variable_group_size "GL_ARB_compute_variable_group_size", #endif #ifdef GL_ARB_conditional_render_inverted "GL_ARB_conditional_render_inverted", #endif #ifdef GL_ARB_conservative_depth "GL_ARB_conservative_depth", #endif #ifdef GL_ARB_copy_buffer "GL_ARB_copy_buffer", #endif #ifdef GL_ARB_copy_image "GL_ARB_copy_image", #endif #ifdef GL_ARB_cull_distance "GL_ARB_cull_distance", #endif #ifdef GL_ARB_debug_output "GL_ARB_debug_output", #endif #ifdef GL_ARB_depth_buffer_float "GL_ARB_depth_buffer_float", #endif #ifdef GL_ARB_depth_clamp "GL_ARB_depth_clamp", #endif #ifdef GL_ARB_depth_texture "GL_ARB_depth_texture", #endif #ifdef GL_ARB_derivative_control "GL_ARB_derivative_control", #endif #ifdef GL_ARB_direct_state_access "GL_ARB_direct_state_access", #endif #ifdef GL_ARB_draw_buffers "GL_ARB_draw_buffers", #endif #ifdef GL_ARB_draw_buffers_blend "GL_ARB_draw_buffers_blend", #endif #ifdef GL_ARB_draw_elements_base_vertex "GL_ARB_draw_elements_base_vertex", #endif #ifdef GL_ARB_draw_indirect "GL_ARB_draw_indirect", #endif #ifdef GL_ARB_draw_instanced "GL_ARB_draw_instanced", #endif #ifdef GL_ARB_enhanced_layouts "GL_ARB_enhanced_layouts", #endif #ifdef GL_ARB_explicit_attrib_location "GL_ARB_explicit_attrib_location", #endif #ifdef GL_ARB_explicit_uniform_location "GL_ARB_explicit_uniform_location", #endif #ifdef GL_ARB_fragment_coord_conventions "GL_ARB_fragment_coord_conventions", #endif #ifdef GL_ARB_fragment_layer_viewport "GL_ARB_fragment_layer_viewport", #endif #ifdef GL_ARB_fragment_program "GL_ARB_fragment_program", #endif #ifdef GL_ARB_fragment_program_shadow "GL_ARB_fragment_program_shadow", #endif #ifdef GL_ARB_fragment_shader "GL_ARB_fragment_shader", #endif #ifdef GL_ARB_fragment_shader_interlock "GL_ARB_fragment_shader_interlock", #endif #ifdef GL_ARB_framebuffer_no_attachments "GL_ARB_framebuffer_no_attachments", #endif #ifdef GL_ARB_framebuffer_object "GL_ARB_framebuffer_object", #endif #ifdef GL_ARB_framebuffer_sRGB "GL_ARB_framebuffer_sRGB", #endif #ifdef GL_ARB_geometry_shader4 "GL_ARB_geometry_shader4", #endif #ifdef GL_ARB_get_program_binary "GL_ARB_get_program_binary", #endif #ifdef GL_ARB_get_texture_sub_image "GL_ARB_get_texture_sub_image", #endif #ifdef GL_ARB_gl_spirv "GL_ARB_gl_spirv", #endif #ifdef GL_ARB_gpu_shader5 "GL_ARB_gpu_shader5", #endif #ifdef GL_ARB_gpu_shader_fp64 "GL_ARB_gpu_shader_fp64", #endif #ifdef GL_ARB_gpu_shader_int64 "GL_ARB_gpu_shader_int64", #endif #ifdef GL_ARB_half_float_pixel "GL_ARB_half_float_pixel", #endif #ifdef GL_ARB_half_float_vertex "GL_ARB_half_float_vertex", #endif #ifdef GL_ARB_imaging "GL_ARB_imaging", #endif #ifdef GL_ARB_indirect_parameters "GL_ARB_indirect_parameters", #endif #ifdef GL_ARB_instanced_arrays "GL_ARB_instanced_arrays", #endif #ifdef GL_ARB_internalformat_query "GL_ARB_internalformat_query", #endif #ifdef GL_ARB_internalformat_query2 "GL_ARB_internalformat_query2", #endif #ifdef GL_ARB_invalidate_subdata "GL_ARB_invalidate_subdata", #endif #ifdef GL_ARB_map_buffer_alignment "GL_ARB_map_buffer_alignment", #endif #ifdef GL_ARB_map_buffer_range "GL_ARB_map_buffer_range", #endif #ifdef GL_ARB_matrix_palette "GL_ARB_matrix_palette", #endif #ifdef GL_ARB_multi_bind "GL_ARB_multi_bind", #endif #ifdef GL_ARB_multi_draw_indirect "GL_ARB_multi_draw_indirect", #endif #ifdef GL_ARB_multisample "GL_ARB_multisample", #endif #ifdef GL_ARB_multitexture "GL_ARB_multitexture", #endif #ifdef GL_ARB_occlusion_query "GL_ARB_occlusion_query", #endif #ifdef GL_ARB_occlusion_query2 "GL_ARB_occlusion_query2", #endif #ifdef GL_ARB_parallel_shader_compile "GL_ARB_parallel_shader_compile", #endif #ifdef GL_ARB_pipeline_statistics_query "GL_ARB_pipeline_statistics_query", #endif #ifdef GL_ARB_pixel_buffer_object "GL_ARB_pixel_buffer_object", #endif #ifdef GL_ARB_point_parameters "GL_ARB_point_parameters", #endif #ifdef GL_ARB_point_sprite "GL_ARB_point_sprite", #endif #ifdef GL_ARB_polygon_offset_clamp "GL_ARB_polygon_offset_clamp", #endif #ifdef GL_ARB_post_depth_coverage "GL_ARB_post_depth_coverage", #endif #ifdef GL_ARB_program_interface_query "GL_ARB_program_interface_query", #endif #ifdef GL_ARB_provoking_vertex "GL_ARB_provoking_vertex", #endif #ifdef GL_ARB_query_buffer_object "GL_ARB_query_buffer_object", #endif #ifdef GL_ARB_robust_buffer_access_behavior "GL_ARB_robust_buffer_access_behavior", #endif #ifdef GL_ARB_robustness "GL_ARB_robustness", #endif #ifdef GL_ARB_robustness_application_isolation "GL_ARB_robustness_application_isolation", #endif #ifdef GL_ARB_robustness_share_group_isolation "GL_ARB_robustness_share_group_isolation", #endif #ifdef GL_ARB_sample_locations "GL_ARB_sample_locations", #endif #ifdef GL_ARB_sample_shading "GL_ARB_sample_shading", #endif #ifdef GL_ARB_sampler_objects "GL_ARB_sampler_objects", #endif #ifdef GL_ARB_seamless_cube_map "GL_ARB_seamless_cube_map", #endif #ifdef GL_ARB_seamless_cubemap_per_texture "GL_ARB_seamless_cubemap_per_texture", #endif #ifdef GL_ARB_separate_shader_objects "GL_ARB_separate_shader_objects", #endif #ifdef GL_ARB_shader_atomic_counter_ops "GL_ARB_shader_atomic_counter_ops", #endif #ifdef GL_ARB_shader_atomic_counters "GL_ARB_shader_atomic_counters", #endif #ifdef GL_ARB_shader_ballot "GL_ARB_shader_ballot", #endif #ifdef GL_ARB_shader_bit_encoding "GL_ARB_shader_bit_encoding", #endif #ifdef GL_ARB_shader_clock "GL_ARB_shader_clock", #endif #ifdef GL_ARB_shader_draw_parameters "GL_ARB_shader_draw_parameters", #endif #ifdef GL_ARB_shader_group_vote "GL_ARB_shader_group_vote", #endif #ifdef GL_ARB_shader_image_load_store "GL_ARB_shader_image_load_store", #endif #ifdef GL_ARB_shader_image_size "GL_ARB_shader_image_size", #endif #ifdef GL_ARB_shader_objects "GL_ARB_shader_objects", #endif #ifdef GL_ARB_shader_precision "GL_ARB_shader_precision", #endif #ifdef GL_ARB_shader_stencil_export "GL_ARB_shader_stencil_export", #endif #ifdef GL_ARB_shader_storage_buffer_object "GL_ARB_shader_storage_buffer_object", #endif #ifdef GL_ARB_shader_subroutine "GL_ARB_shader_subroutine", #endif #ifdef GL_ARB_shader_texture_image_samples "GL_ARB_shader_texture_image_samples", #endif #ifdef GL_ARB_shader_texture_lod "GL_ARB_shader_texture_lod", #endif #ifdef GL_ARB_shader_viewport_layer_array "GL_ARB_shader_viewport_layer_array", #endif #ifdef GL_ARB_shading_language_100 "GL_ARB_shading_language_100", #endif #ifdef GL_ARB_shading_language_420pack "GL_ARB_shading_language_420pack", #endif #ifdef GL_ARB_shading_language_include "GL_ARB_shading_language_include", #endif #ifdef GL_ARB_shading_language_packing "GL_ARB_shading_language_packing", #endif #ifdef GL_ARB_shadow "GL_ARB_shadow", #endif #ifdef GL_ARB_shadow_ambient "GL_ARB_shadow_ambient", #endif #ifdef GL_ARB_sparse_buffer "GL_ARB_sparse_buffer", #endif #ifdef GL_ARB_sparse_texture "GL_ARB_sparse_texture", #endif #ifdef GL_ARB_sparse_texture2 "GL_ARB_sparse_texture2", #endif #ifdef GL_ARB_sparse_texture_clamp "GL_ARB_sparse_texture_clamp", #endif #ifdef GL_ARB_spirv_extensions "GL_ARB_spirv_extensions", #endif #ifdef GL_ARB_stencil_texturing "GL_ARB_stencil_texturing", #endif #ifdef GL_ARB_sync "GL_ARB_sync", #endif #ifdef GL_ARB_tessellation_shader "GL_ARB_tessellation_shader", #endif #ifdef GL_ARB_texture_barrier "GL_ARB_texture_barrier", #endif #ifdef GL_ARB_texture_border_clamp "GL_ARB_texture_border_clamp", #endif #ifdef GL_ARB_texture_buffer_object "GL_ARB_texture_buffer_object", #endif #ifdef GL_ARB_texture_buffer_object_rgb32 "GL_ARB_texture_buffer_object_rgb32", #endif #ifdef GL_ARB_texture_buffer_range "GL_ARB_texture_buffer_range", #endif #ifdef GL_ARB_texture_compression "GL_ARB_texture_compression", #endif #ifdef GL_ARB_texture_compression_bptc "GL_ARB_texture_compression_bptc", #endif #ifdef GL_ARB_texture_compression_rgtc "GL_ARB_texture_compression_rgtc", #endif #ifdef GL_ARB_texture_cube_map "GL_ARB_texture_cube_map", #endif #ifdef GL_ARB_texture_cube_map_array "GL_ARB_texture_cube_map_array", #endif #ifdef GL_ARB_texture_env_add "GL_ARB_texture_env_add", #endif #ifdef GL_ARB_texture_env_combine "GL_ARB_texture_env_combine", #endif #ifdef GL_ARB_texture_env_crossbar "GL_ARB_texture_env_crossbar", #endif #ifdef GL_ARB_texture_env_dot3 "GL_ARB_texture_env_dot3", #endif #ifdef GL_ARB_texture_filter_anisotropic "GL_ARB_texture_filter_anisotropic", #endif #ifdef GL_ARB_texture_filter_minmax "GL_ARB_texture_filter_minmax", #endif #ifdef GL_ARB_texture_float "GL_ARB_texture_float", #endif #ifdef GL_ARB_texture_gather "GL_ARB_texture_gather", #endif #ifdef GL_ARB_texture_mirror_clamp_to_edge "GL_ARB_texture_mirror_clamp_to_edge", #endif #ifdef GL_ARB_texture_mirrored_repeat "GL_ARB_texture_mirrored_repeat", #endif #ifdef GL_ARB_texture_multisample "GL_ARB_texture_multisample", #endif #ifdef GL_ARB_texture_non_power_of_two "GL_ARB_texture_non_power_of_two", #endif #ifdef GL_ARB_texture_query_levels "GL_ARB_texture_query_levels", #endif #ifdef GL_ARB_texture_query_lod "GL_ARB_texture_query_lod", #endif #ifdef GL_ARB_texture_rectangle "GL_ARB_texture_rectangle", #endif #ifdef GL_ARB_texture_rg "GL_ARB_texture_rg", #endif #ifdef GL_ARB_texture_rgb10_a2ui "GL_ARB_texture_rgb10_a2ui", #endif #ifdef GL_ARB_texture_stencil8 "GL_ARB_texture_stencil8", #endif #ifdef GL_ARB_texture_storage "GL_ARB_texture_storage", #endif #ifdef GL_ARB_texture_storage_multisample "GL_ARB_texture_storage_multisample", #endif #ifdef GL_ARB_texture_swizzle "GL_ARB_texture_swizzle", #endif #ifdef GL_ARB_texture_view "GL_ARB_texture_view", #endif #ifdef GL_ARB_timer_query "GL_ARB_timer_query", #endif #ifdef GL_ARB_transform_feedback2 "GL_ARB_transform_feedback2", #endif #ifdef GL_ARB_transform_feedback3 "GL_ARB_transform_feedback3", #endif #ifdef GL_ARB_transform_feedback_instanced "GL_ARB_transform_feedback_instanced", #endif #ifdef GL_ARB_transform_feedback_overflow_query "GL_ARB_transform_feedback_overflow_query", #endif #ifdef GL_ARB_transpose_matrix "GL_ARB_transpose_matrix", #endif #ifdef GL_ARB_uniform_buffer_object "GL_ARB_uniform_buffer_object", #endif #ifdef GL_ARB_vertex_array_bgra "GL_ARB_vertex_array_bgra", #endif #ifdef GL_ARB_vertex_array_object "GL_ARB_vertex_array_object", #endif #ifdef GL_ARB_vertex_attrib_64bit "GL_ARB_vertex_attrib_64bit", #endif #ifdef GL_ARB_vertex_attrib_binding "GL_ARB_vertex_attrib_binding", #endif #ifdef GL_ARB_vertex_blend "GL_ARB_vertex_blend", #endif #ifdef GL_ARB_vertex_buffer_object "GL_ARB_vertex_buffer_object", #endif #ifdef GL_ARB_vertex_program "GL_ARB_vertex_program", #endif #ifdef GL_ARB_vertex_shader "GL_ARB_vertex_shader", #endif #ifdef GL_ARB_vertex_type_10f_11f_11f_rev "GL_ARB_vertex_type_10f_11f_11f_rev", #endif #ifdef GL_ARB_vertex_type_2_10_10_10_rev "GL_ARB_vertex_type_2_10_10_10_rev", #endif #ifdef GL_ARB_viewport_array "GL_ARB_viewport_array", #endif #ifdef GL_ARB_window_pos "GL_ARB_window_pos", #endif #ifdef GL_ARM_mali_program_binary "GL_ARM_mali_program_binary", #endif #ifdef GL_ARM_mali_shader_binary "GL_ARM_mali_shader_binary", #endif #ifdef GL_ARM_rgba8 "GL_ARM_rgba8", #endif #ifdef GL_ARM_shader_framebuffer_fetch "GL_ARM_shader_framebuffer_fetch", #endif #ifdef GL_ARM_shader_framebuffer_fetch_depth_stencil "GL_ARM_shader_framebuffer_fetch_depth_stencil", #endif #ifdef GL_ATIX_point_sprites "GL_ATIX_point_sprites", #endif #ifdef GL_ATIX_texture_env_combine3 "GL_ATIX_texture_env_combine3", #endif #ifdef GL_ATIX_texture_env_route "GL_ATIX_texture_env_route", #endif #ifdef GL_ATIX_vertex_shader_output_point_size "GL_ATIX_vertex_shader_output_point_size", #endif #ifdef GL_ATI_draw_buffers "GL_ATI_draw_buffers", #endif #ifdef GL_ATI_element_array "GL_ATI_element_array", #endif #ifdef GL_ATI_envmap_bumpmap "GL_ATI_envmap_bumpmap", #endif #ifdef GL_ATI_fragment_shader "GL_ATI_fragment_shader", #endif #ifdef GL_ATI_map_object_buffer "GL_ATI_map_object_buffer", #endif #ifdef GL_ATI_meminfo "GL_ATI_meminfo", #endif #ifdef GL_ATI_pn_triangles "GL_ATI_pn_triangles", #endif #ifdef GL_ATI_separate_stencil "GL_ATI_separate_stencil", #endif #ifdef GL_ATI_shader_texture_lod "GL_ATI_shader_texture_lod", #endif #ifdef GL_ATI_text_fragment_shader "GL_ATI_text_fragment_shader", #endif #ifdef GL_ATI_texture_compression_3dc "GL_ATI_texture_compression_3dc", #endif #ifdef GL_ATI_texture_env_combine3 "GL_ATI_texture_env_combine3", #endif #ifdef GL_ATI_texture_float "GL_ATI_texture_float", #endif #ifdef GL_ATI_texture_mirror_once "GL_ATI_texture_mirror_once", #endif #ifdef GL_ATI_vertex_array_object "GL_ATI_vertex_array_object", #endif #ifdef GL_ATI_vertex_attrib_array_object "GL_ATI_vertex_attrib_array_object", #endif #ifdef GL_ATI_vertex_streams "GL_ATI_vertex_streams", #endif #ifdef GL_EGL_KHR_context_flush_control "GL_EGL_KHR_context_flush_control", #endif #ifdef GL_EGL_NV_robustness_video_memory_purge "GL_EGL_NV_robustness_video_memory_purge", #endif #ifdef GL_EXT_422_pixels "GL_EXT_422_pixels", #endif #ifdef GL_EXT_Cg_shader "GL_EXT_Cg_shader", #endif #ifdef GL_EXT_EGL_image_array "GL_EXT_EGL_image_array", #endif #ifdef GL_EXT_YUV_target "GL_EXT_YUV_target", #endif #ifdef GL_EXT_abgr "GL_EXT_abgr", #endif #ifdef GL_EXT_base_instance "GL_EXT_base_instance", #endif #ifdef GL_EXT_bgra "GL_EXT_bgra", #endif #ifdef GL_EXT_bindable_uniform "GL_EXT_bindable_uniform", #endif #ifdef GL_EXT_blend_color "GL_EXT_blend_color", #endif #ifdef GL_EXT_blend_equation_separate "GL_EXT_blend_equation_separate", #endif #ifdef GL_EXT_blend_func_extended "GL_EXT_blend_func_extended", #endif #ifdef GL_EXT_blend_func_separate "GL_EXT_blend_func_separate", #endif #ifdef GL_EXT_blend_logic_op "GL_EXT_blend_logic_op", #endif #ifdef GL_EXT_blend_minmax "GL_EXT_blend_minmax", #endif #ifdef GL_EXT_blend_subtract "GL_EXT_blend_subtract", #endif #ifdef GL_EXT_buffer_storage "GL_EXT_buffer_storage", #endif #ifdef GL_EXT_clear_texture "GL_EXT_clear_texture", #endif #ifdef GL_EXT_clip_cull_distance "GL_EXT_clip_cull_distance", #endif #ifdef GL_EXT_clip_volume_hint "GL_EXT_clip_volume_hint", #endif #ifdef GL_EXT_cmyka "GL_EXT_cmyka", #endif #ifdef GL_EXT_color_buffer_float "GL_EXT_color_buffer_float", #endif #ifdef GL_EXT_color_buffer_half_float "GL_EXT_color_buffer_half_float", #endif #ifdef GL_EXT_color_subtable "GL_EXT_color_subtable", #endif #ifdef GL_EXT_compiled_vertex_array "GL_EXT_compiled_vertex_array", #endif #ifdef GL_EXT_compressed_ETC1_RGB8_sub_texture "GL_EXT_compressed_ETC1_RGB8_sub_texture", #endif #ifdef GL_EXT_conservative_depth "GL_EXT_conservative_depth", #endif #ifdef GL_EXT_convolution "GL_EXT_convolution", #endif #ifdef GL_EXT_coordinate_frame "GL_EXT_coordinate_frame", #endif #ifdef GL_EXT_copy_image "GL_EXT_copy_image", #endif #ifdef GL_EXT_copy_texture "GL_EXT_copy_texture", #endif #ifdef GL_EXT_cull_vertex "GL_EXT_cull_vertex", #endif #ifdef GL_EXT_debug_label "GL_EXT_debug_label", #endif #ifdef GL_EXT_debug_marker "GL_EXT_debug_marker", #endif #ifdef GL_EXT_depth_bounds_test "GL_EXT_depth_bounds_test", #endif #ifdef GL_EXT_direct_state_access "GL_EXT_direct_state_access", #endif #ifdef GL_EXT_discard_framebuffer "GL_EXT_discard_framebuffer", #endif #ifdef GL_EXT_draw_buffers "GL_EXT_draw_buffers", #endif #ifdef GL_EXT_draw_buffers2 "GL_EXT_draw_buffers2", #endif #ifdef GL_EXT_draw_buffers_indexed "GL_EXT_draw_buffers_indexed", #endif #ifdef GL_EXT_draw_elements_base_vertex "GL_EXT_draw_elements_base_vertex", #endif #ifdef GL_EXT_draw_instanced "GL_EXT_draw_instanced", #endif #ifdef GL_EXT_draw_range_elements "GL_EXT_draw_range_elements", #endif #ifdef GL_EXT_external_buffer "GL_EXT_external_buffer", #endif #ifdef GL_EXT_float_blend "GL_EXT_float_blend", #endif #ifdef GL_EXT_fog_coord "GL_EXT_fog_coord", #endif #ifdef GL_EXT_frag_depth "GL_EXT_frag_depth", #endif #ifdef GL_EXT_fragment_lighting "GL_EXT_fragment_lighting", #endif #ifdef GL_EXT_framebuffer_blit "GL_EXT_framebuffer_blit", #endif #ifdef GL_EXT_framebuffer_multisample "GL_EXT_framebuffer_multisample", #endif #ifdef GL_EXT_framebuffer_multisample_blit_scaled "GL_EXT_framebuffer_multisample_blit_scaled", #endif #ifdef GL_EXT_framebuffer_object "GL_EXT_framebuffer_object", #endif #ifdef GL_EXT_framebuffer_sRGB "GL_EXT_framebuffer_sRGB", #endif #ifdef GL_EXT_geometry_point_size "GL_EXT_geometry_point_size", #endif #ifdef GL_EXT_geometry_shader "GL_EXT_geometry_shader", #endif #ifdef GL_EXT_geometry_shader4 "GL_EXT_geometry_shader4", #endif #ifdef GL_EXT_gpu_program_parameters "GL_EXT_gpu_program_parameters", #endif #ifdef GL_EXT_gpu_shader4 "GL_EXT_gpu_shader4", #endif #ifdef GL_EXT_gpu_shader5 "GL_EXT_gpu_shader5", #endif #ifdef GL_EXT_histogram "GL_EXT_histogram", #endif #ifdef GL_EXT_index_array_formats "GL_EXT_index_array_formats", #endif #ifdef GL_EXT_index_func "GL_EXT_index_func", #endif #ifdef GL_EXT_index_material "GL_EXT_index_material", #endif #ifdef GL_EXT_index_texture "GL_EXT_index_texture", #endif #ifdef GL_EXT_instanced_arrays "GL_EXT_instanced_arrays", #endif #ifdef GL_EXT_light_texture "GL_EXT_light_texture", #endif #ifdef GL_EXT_map_buffer_range "GL_EXT_map_buffer_range", #endif #ifdef GL_EXT_memory_object "GL_EXT_memory_object", #endif #ifdef GL_EXT_memory_object_fd "GL_EXT_memory_object_fd", #endif #ifdef GL_EXT_memory_object_win32 "GL_EXT_memory_object_win32", #endif #ifdef GL_EXT_misc_attribute "GL_EXT_misc_attribute", #endif #ifdef GL_EXT_multi_draw_arrays "GL_EXT_multi_draw_arrays", #endif #ifdef GL_EXT_multi_draw_indirect "GL_EXT_multi_draw_indirect", #endif #ifdef GL_EXT_multiple_textures "GL_EXT_multiple_textures", #endif #ifdef GL_EXT_multisample "GL_EXT_multisample", #endif #ifdef GL_EXT_multisample_compatibility "GL_EXT_multisample_compatibility", #endif #ifdef GL_EXT_multisampled_render_to_texture "GL_EXT_multisampled_render_to_texture", #endif #ifdef GL_EXT_multisampled_render_to_texture2 "GL_EXT_multisampled_render_to_texture2", #endif #ifdef GL_EXT_multiview_draw_buffers "GL_EXT_multiview_draw_buffers", #endif #ifdef GL_EXT_packed_depth_stencil "GL_EXT_packed_depth_stencil", #endif #ifdef GL_EXT_packed_float "GL_EXT_packed_float", #endif #ifdef GL_EXT_packed_pixels "GL_EXT_packed_pixels", #endif #ifdef GL_EXT_paletted_texture "GL_EXT_paletted_texture", #endif #ifdef GL_EXT_pixel_buffer_object "GL_EXT_pixel_buffer_object", #endif #ifdef GL_EXT_pixel_transform "GL_EXT_pixel_transform", #endif #ifdef GL_EXT_pixel_transform_color_table "GL_EXT_pixel_transform_color_table", #endif #ifdef GL_EXT_point_parameters "GL_EXT_point_parameters", #endif #ifdef GL_EXT_polygon_offset "GL_EXT_polygon_offset", #endif #ifdef GL_EXT_polygon_offset_clamp "GL_EXT_polygon_offset_clamp", #endif #ifdef GL_EXT_post_depth_coverage "GL_EXT_post_depth_coverage", #endif #ifdef GL_EXT_provoking_vertex "GL_EXT_provoking_vertex", #endif #ifdef GL_EXT_pvrtc_sRGB "GL_EXT_pvrtc_sRGB", #endif #ifdef GL_EXT_raster_multisample "GL_EXT_raster_multisample", #endif #ifdef GL_EXT_read_format_bgra "GL_EXT_read_format_bgra", #endif #ifdef GL_EXT_render_snorm "GL_EXT_render_snorm", #endif #ifdef GL_EXT_rescale_normal "GL_EXT_rescale_normal", #endif #ifdef GL_EXT_sRGB "GL_EXT_sRGB", #endif #ifdef GL_EXT_sRGB_write_control "GL_EXT_sRGB_write_control", #endif #ifdef GL_EXT_scene_marker "GL_EXT_scene_marker", #endif #ifdef GL_EXT_secondary_color "GL_EXT_secondary_color", #endif #ifdef GL_EXT_semaphore "GL_EXT_semaphore", #endif #ifdef GL_EXT_semaphore_fd "GL_EXT_semaphore_fd", #endif #ifdef GL_EXT_semaphore_win32 "GL_EXT_semaphore_win32", #endif #ifdef GL_EXT_separate_shader_objects "GL_EXT_separate_shader_objects", #endif #ifdef GL_EXT_separate_specular_color "GL_EXT_separate_specular_color", #endif #ifdef GL_EXT_shader_framebuffer_fetch "GL_EXT_shader_framebuffer_fetch", #endif #ifdef GL_EXT_shader_group_vote "GL_EXT_shader_group_vote", #endif #ifdef GL_EXT_shader_image_load_formatted "GL_EXT_shader_image_load_formatted", #endif #ifdef GL_EXT_shader_image_load_store "GL_EXT_shader_image_load_store", #endif #ifdef GL_EXT_shader_implicit_conversions "GL_EXT_shader_implicit_conversions", #endif #ifdef GL_EXT_shader_integer_mix "GL_EXT_shader_integer_mix", #endif #ifdef GL_EXT_shader_io_blocks "GL_EXT_shader_io_blocks", #endif #ifdef GL_EXT_shader_non_constant_global_initializers "GL_EXT_shader_non_constant_global_initializers", #endif #ifdef GL_EXT_shader_pixel_local_storage "GL_EXT_shader_pixel_local_storage", #endif #ifdef GL_EXT_shader_pixel_local_storage2 "GL_EXT_shader_pixel_local_storage2", #endif #ifdef GL_EXT_shader_texture_lod "GL_EXT_shader_texture_lod", #endif #ifdef GL_EXT_shadow_funcs "GL_EXT_shadow_funcs", #endif #ifdef GL_EXT_shadow_samplers "GL_EXT_shadow_samplers", #endif #ifdef GL_EXT_shared_texture_palette "GL_EXT_shared_texture_palette", #endif #ifdef GL_EXT_sparse_texture "GL_EXT_sparse_texture", #endif #ifdef GL_EXT_sparse_texture2 "GL_EXT_sparse_texture2", #endif #ifdef GL_EXT_stencil_clear_tag "GL_EXT_stencil_clear_tag", #endif #ifdef GL_EXT_stencil_two_side "GL_EXT_stencil_two_side", #endif #ifdef GL_EXT_stencil_wrap "GL_EXT_stencil_wrap", #endif #ifdef GL_EXT_subtexture "GL_EXT_subtexture", #endif #ifdef GL_EXT_texture "GL_EXT_texture", #endif #ifdef GL_EXT_texture3D "GL_EXT_texture3D", #endif #ifdef GL_EXT_texture_array "GL_EXT_texture_array", #endif #ifdef GL_EXT_texture_buffer_object "GL_EXT_texture_buffer_object", #endif #ifdef GL_EXT_texture_compression_astc_decode_mode "GL_EXT_texture_compression_astc_decode_mode", #endif #ifdef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 "GL_EXT_texture_compression_astc_decode_mode_rgb9e5", #endif #ifdef GL_EXT_texture_compression_bptc "GL_EXT_texture_compression_bptc", #endif #ifdef GL_EXT_texture_compression_dxt1 "GL_EXT_texture_compression_dxt1", #endif #ifdef GL_EXT_texture_compression_latc "GL_EXT_texture_compression_latc", #endif #ifdef GL_EXT_texture_compression_rgtc "GL_EXT_texture_compression_rgtc", #endif #ifdef GL_EXT_texture_compression_s3tc "GL_EXT_texture_compression_s3tc", #endif #ifdef GL_EXT_texture_cube_map "GL_EXT_texture_cube_map", #endif #ifdef GL_EXT_texture_cube_map_array "GL_EXT_texture_cube_map_array", #endif #ifdef GL_EXT_texture_edge_clamp "GL_EXT_texture_edge_clamp", #endif #ifdef GL_EXT_texture_env "GL_EXT_texture_env", #endif #ifdef GL_EXT_texture_env_add "GL_EXT_texture_env_add", #endif #ifdef GL_EXT_texture_env_combine "GL_EXT_texture_env_combine", #endif #ifdef GL_EXT_texture_env_dot3 "GL_EXT_texture_env_dot3", #endif #ifdef GL_EXT_texture_filter_anisotropic "GL_EXT_texture_filter_anisotropic", #endif #ifdef GL_EXT_texture_filter_minmax "GL_EXT_texture_filter_minmax", #endif #ifdef GL_EXT_texture_format_BGRA8888 "GL_EXT_texture_format_BGRA8888", #endif #ifdef GL_EXT_texture_integer "GL_EXT_texture_integer", #endif #ifdef GL_EXT_texture_lod_bias "GL_EXT_texture_lod_bias", #endif #ifdef GL_EXT_texture_mirror_clamp "GL_EXT_texture_mirror_clamp", #endif #ifdef GL_EXT_texture_norm16 "GL_EXT_texture_norm16", #endif #ifdef GL_EXT_texture_object "GL_EXT_texture_object", #endif #ifdef GL_EXT_texture_perturb_normal "GL_EXT_texture_perturb_normal", #endif #ifdef GL_EXT_texture_rectangle "GL_EXT_texture_rectangle", #endif #ifdef GL_EXT_texture_rg "GL_EXT_texture_rg", #endif #ifdef GL_EXT_texture_sRGB "GL_EXT_texture_sRGB", #endif #ifdef GL_EXT_texture_sRGB_R8 "GL_EXT_texture_sRGB_R8", #endif #ifdef GL_EXT_texture_sRGB_RG8 "GL_EXT_texture_sRGB_RG8", #endif #ifdef GL_EXT_texture_sRGB_decode "GL_EXT_texture_sRGB_decode", #endif #ifdef GL_EXT_texture_shared_exponent "GL_EXT_texture_shared_exponent", #endif #ifdef GL_EXT_texture_snorm "GL_EXT_texture_snorm", #endif #ifdef GL_EXT_texture_storage "GL_EXT_texture_storage", #endif #ifdef GL_EXT_texture_swizzle "GL_EXT_texture_swizzle", #endif #ifdef GL_EXT_texture_type_2_10_10_10_REV "GL_EXT_texture_type_2_10_10_10_REV", #endif #ifdef GL_EXT_texture_view "GL_EXT_texture_view", #endif #ifdef GL_EXT_timer_query "GL_EXT_timer_query", #endif #ifdef GL_EXT_transform_feedback "GL_EXT_transform_feedback", #endif #ifdef GL_EXT_unpack_subimage "GL_EXT_unpack_subimage", #endif #ifdef GL_EXT_vertex_array "GL_EXT_vertex_array", #endif #ifdef GL_EXT_vertex_array_bgra "GL_EXT_vertex_array_bgra", #endif #ifdef GL_EXT_vertex_array_setXXX "GL_EXT_vertex_array_setXXX", #endif #ifdef GL_EXT_vertex_attrib_64bit "GL_EXT_vertex_attrib_64bit", #endif #ifdef GL_EXT_vertex_shader "GL_EXT_vertex_shader", #endif #ifdef GL_EXT_vertex_weighting "GL_EXT_vertex_weighting", #endif #ifdef GL_EXT_win32_keyed_mutex "GL_EXT_win32_keyed_mutex", #endif #ifdef GL_EXT_window_rectangles "GL_EXT_window_rectangles", #endif #ifdef GL_EXT_x11_sync_object "GL_EXT_x11_sync_object", #endif #ifdef GL_GREMEDY_frame_terminator "GL_GREMEDY_frame_terminator", #endif #ifdef GL_GREMEDY_string_marker "GL_GREMEDY_string_marker", #endif #ifdef GL_HP_convolution_border_modes "GL_HP_convolution_border_modes", #endif #ifdef GL_HP_image_transform "GL_HP_image_transform", #endif #ifdef GL_HP_occlusion_test "GL_HP_occlusion_test", #endif #ifdef GL_HP_texture_lighting "GL_HP_texture_lighting", #endif #ifdef GL_IBM_cull_vertex "GL_IBM_cull_vertex", #endif #ifdef GL_IBM_multimode_draw_arrays "GL_IBM_multimode_draw_arrays", #endif #ifdef GL_IBM_rasterpos_clip "GL_IBM_rasterpos_clip", #endif #ifdef GL_IBM_static_data "GL_IBM_static_data", #endif #ifdef GL_IBM_texture_mirrored_repeat "GL_IBM_texture_mirrored_repeat", #endif #ifdef GL_IBM_vertex_array_lists "GL_IBM_vertex_array_lists", #endif #ifdef GL_INGR_color_clamp "GL_INGR_color_clamp", #endif #ifdef GL_INGR_interlace_read "GL_INGR_interlace_read", #endif #ifdef GL_INTEL_conservative_rasterization "GL_INTEL_conservative_rasterization", #endif #ifdef GL_INTEL_fragment_shader_ordering "GL_INTEL_fragment_shader_ordering", #endif #ifdef GL_INTEL_framebuffer_CMAA "GL_INTEL_framebuffer_CMAA", #endif #ifdef GL_INTEL_map_texture "GL_INTEL_map_texture", #endif #ifdef GL_INTEL_parallel_arrays "GL_INTEL_parallel_arrays", #endif #ifdef GL_INTEL_performance_query "GL_INTEL_performance_query", #endif #ifdef GL_INTEL_texture_scissor "GL_INTEL_texture_scissor", #endif #ifdef GL_KHR_blend_equation_advanced "GL_KHR_blend_equation_advanced", #endif #ifdef GL_KHR_blend_equation_advanced_coherent "GL_KHR_blend_equation_advanced_coherent", #endif #ifdef GL_KHR_context_flush_control "GL_KHR_context_flush_control", #endif #ifdef GL_KHR_debug "GL_KHR_debug", #endif #ifdef GL_KHR_no_error "GL_KHR_no_error", #endif #ifdef GL_KHR_parallel_shader_compile "GL_KHR_parallel_shader_compile", #endif #ifdef GL_KHR_robust_buffer_access_behavior "GL_KHR_robust_buffer_access_behavior", #endif #ifdef GL_KHR_robustness "GL_KHR_robustness", #endif #ifdef GL_KHR_texture_compression_astc_hdr "GL_KHR_texture_compression_astc_hdr", #endif #ifdef GL_KHR_texture_compression_astc_ldr "GL_KHR_texture_compression_astc_ldr", #endif #ifdef GL_KHR_texture_compression_astc_sliced_3d "GL_KHR_texture_compression_astc_sliced_3d", #endif #ifdef GL_KTX_buffer_region "GL_KTX_buffer_region", #endif #ifdef GL_MESAX_texture_stack "GL_MESAX_texture_stack", #endif #ifdef GL_MESA_pack_invert "GL_MESA_pack_invert", #endif #ifdef GL_MESA_resize_buffers "GL_MESA_resize_buffers", #endif #ifdef GL_MESA_shader_integer_functions "GL_MESA_shader_integer_functions", #endif #ifdef GL_MESA_window_pos "GL_MESA_window_pos", #endif #ifdef GL_MESA_ycbcr_texture "GL_MESA_ycbcr_texture", #endif #ifdef GL_NVX_blend_equation_advanced_multi_draw_buffers "GL_NVX_blend_equation_advanced_multi_draw_buffers", #endif #ifdef GL_NVX_conditional_render "GL_NVX_conditional_render", #endif #ifdef GL_NVX_gpu_memory_info "GL_NVX_gpu_memory_info", #endif #ifdef GL_NVX_linked_gpu_multicast "GL_NVX_linked_gpu_multicast", #endif #ifdef GL_NV_3dvision_settings "GL_NV_3dvision_settings", #endif #ifdef GL_NV_EGL_stream_consumer_external "GL_NV_EGL_stream_consumer_external", #endif #ifdef GL_NV_alpha_to_coverage_dither_control "GL_NV_alpha_to_coverage_dither_control", #endif #ifdef GL_NV_bgr "GL_NV_bgr", #endif #ifdef GL_NV_bindless_multi_draw_indirect "GL_NV_bindless_multi_draw_indirect", #endif #ifdef GL_NV_bindless_multi_draw_indirect_count "GL_NV_bindless_multi_draw_indirect_count", #endif #ifdef GL_NV_bindless_texture "GL_NV_bindless_texture", #endif #ifdef GL_NV_blend_equation_advanced "GL_NV_blend_equation_advanced", #endif #ifdef GL_NV_blend_equation_advanced_coherent "GL_NV_blend_equation_advanced_coherent", #endif #ifdef GL_NV_blend_minmax_factor "GL_NV_blend_minmax_factor", #endif #ifdef GL_NV_blend_square "GL_NV_blend_square", #endif #ifdef GL_NV_clip_space_w_scaling "GL_NV_clip_space_w_scaling", #endif #ifdef GL_NV_command_list "GL_NV_command_list", #endif #ifdef GL_NV_compute_program5 "GL_NV_compute_program5", #endif #ifdef GL_NV_conditional_render "GL_NV_conditional_render", #endif #ifdef GL_NV_conservative_raster "GL_NV_conservative_raster", #endif #ifdef GL_NV_conservative_raster_dilate "GL_NV_conservative_raster_dilate", #endif #ifdef GL_NV_conservative_raster_pre_snap_triangles "GL_NV_conservative_raster_pre_snap_triangles", #endif #ifdef GL_NV_copy_buffer "GL_NV_copy_buffer", #endif #ifdef GL_NV_copy_depth_to_color "GL_NV_copy_depth_to_color", #endif #ifdef GL_NV_copy_image "GL_NV_copy_image", #endif #ifdef GL_NV_deep_texture3D "GL_NV_deep_texture3D", #endif #ifdef GL_NV_depth_buffer_float "GL_NV_depth_buffer_float", #endif #ifdef GL_NV_depth_clamp "GL_NV_depth_clamp", #endif #ifdef GL_NV_depth_range_unclamped "GL_NV_depth_range_unclamped", #endif #ifdef GL_NV_draw_buffers "GL_NV_draw_buffers", #endif #ifdef GL_NV_draw_instanced "GL_NV_draw_instanced", #endif #ifdef GL_NV_draw_texture "GL_NV_draw_texture", #endif #ifdef GL_NV_draw_vulkan_image "GL_NV_draw_vulkan_image", #endif #ifdef GL_NV_evaluators "GL_NV_evaluators", #endif #ifdef GL_NV_explicit_attrib_location "GL_NV_explicit_attrib_location", #endif #ifdef GL_NV_explicit_multisample "GL_NV_explicit_multisample", #endif #ifdef GL_NV_fbo_color_attachments "GL_NV_fbo_color_attachments", #endif #ifdef GL_NV_fence "GL_NV_fence", #endif #ifdef GL_NV_fill_rectangle "GL_NV_fill_rectangle", #endif #ifdef GL_NV_float_buffer "GL_NV_float_buffer", #endif #ifdef GL_NV_fog_distance "GL_NV_fog_distance", #endif #ifdef GL_NV_fragment_coverage_to_color "GL_NV_fragment_coverage_to_color", #endif #ifdef GL_NV_fragment_program "GL_NV_fragment_program", #endif #ifdef GL_NV_fragment_program2 "GL_NV_fragment_program2", #endif #ifdef GL_NV_fragment_program4 "GL_NV_fragment_program4", #endif #ifdef GL_NV_fragment_program_option "GL_NV_fragment_program_option", #endif #ifdef GL_NV_fragment_shader_interlock "GL_NV_fragment_shader_interlock", #endif #ifdef GL_NV_framebuffer_blit "GL_NV_framebuffer_blit", #endif #ifdef GL_NV_framebuffer_mixed_samples "GL_NV_framebuffer_mixed_samples", #endif #ifdef GL_NV_framebuffer_multisample "GL_NV_framebuffer_multisample", #endif #ifdef GL_NV_framebuffer_multisample_coverage "GL_NV_framebuffer_multisample_coverage", #endif #ifdef GL_NV_generate_mipmap_sRGB "GL_NV_generate_mipmap_sRGB", #endif #ifdef GL_NV_geometry_program4 "GL_NV_geometry_program4", #endif #ifdef GL_NV_geometry_shader4 "GL_NV_geometry_shader4", #endif #ifdef GL_NV_geometry_shader_passthrough "GL_NV_geometry_shader_passthrough", #endif #ifdef GL_NV_gpu_multicast "GL_NV_gpu_multicast", #endif #ifdef GL_NV_gpu_program4 "GL_NV_gpu_program4", #endif #ifdef GL_NV_gpu_program5 "GL_NV_gpu_program5", #endif #ifdef GL_NV_gpu_program5_mem_extended "GL_NV_gpu_program5_mem_extended", #endif #ifdef GL_NV_gpu_program_fp64 "GL_NV_gpu_program_fp64", #endif #ifdef GL_NV_gpu_shader5 "GL_NV_gpu_shader5", #endif #ifdef GL_NV_half_float "GL_NV_half_float", #endif #ifdef GL_NV_image_formats "GL_NV_image_formats", #endif #ifdef GL_NV_instanced_arrays "GL_NV_instanced_arrays", #endif #ifdef GL_NV_internalformat_sample_query "GL_NV_internalformat_sample_query", #endif #ifdef GL_NV_light_max_exponent "GL_NV_light_max_exponent", #endif #ifdef GL_NV_multisample_coverage "GL_NV_multisample_coverage", #endif #ifdef GL_NV_multisample_filter_hint "GL_NV_multisample_filter_hint", #endif #ifdef GL_NV_non_square_matrices "GL_NV_non_square_matrices", #endif #ifdef GL_NV_occlusion_query "GL_NV_occlusion_query", #endif #ifdef GL_NV_pack_subimage "GL_NV_pack_subimage", #endif #ifdef GL_NV_packed_depth_stencil "GL_NV_packed_depth_stencil", #endif #ifdef GL_NV_packed_float "GL_NV_packed_float", #endif #ifdef GL_NV_packed_float_linear "GL_NV_packed_float_linear", #endif #ifdef GL_NV_parameter_buffer_object "GL_NV_parameter_buffer_object", #endif #ifdef GL_NV_parameter_buffer_object2 "GL_NV_parameter_buffer_object2", #endif #ifdef GL_NV_path_rendering "GL_NV_path_rendering", #endif #ifdef GL_NV_path_rendering_shared_edge "GL_NV_path_rendering_shared_edge", #endif #ifdef GL_NV_pixel_buffer_object "GL_NV_pixel_buffer_object", #endif #ifdef GL_NV_pixel_data_range "GL_NV_pixel_data_range", #endif #ifdef GL_NV_platform_binary "GL_NV_platform_binary", #endif #ifdef GL_NV_point_sprite "GL_NV_point_sprite", #endif #ifdef GL_NV_polygon_mode "GL_NV_polygon_mode", #endif #ifdef GL_NV_present_video "GL_NV_present_video", #endif #ifdef GL_NV_primitive_restart "GL_NV_primitive_restart", #endif #ifdef GL_NV_read_depth "GL_NV_read_depth", #endif #ifdef GL_NV_read_depth_stencil "GL_NV_read_depth_stencil", #endif #ifdef GL_NV_read_stencil "GL_NV_read_stencil", #endif #ifdef GL_NV_register_combiners "GL_NV_register_combiners", #endif #ifdef GL_NV_register_combiners2 "GL_NV_register_combiners2", #endif #ifdef GL_NV_robustness_video_memory_purge "GL_NV_robustness_video_memory_purge", #endif #ifdef GL_NV_sRGB_formats "GL_NV_sRGB_formats", #endif #ifdef GL_NV_sample_locations "GL_NV_sample_locations", #endif #ifdef GL_NV_sample_mask_override_coverage "GL_NV_sample_mask_override_coverage", #endif #ifdef GL_NV_shader_atomic_counters "GL_NV_shader_atomic_counters", #endif #ifdef GL_NV_shader_atomic_float "GL_NV_shader_atomic_float", #endif #ifdef GL_NV_shader_atomic_float64 "GL_NV_shader_atomic_float64", #endif #ifdef GL_NV_shader_atomic_fp16_vector "GL_NV_shader_atomic_fp16_vector", #endif #ifdef GL_NV_shader_atomic_int64 "GL_NV_shader_atomic_int64", #endif #ifdef GL_NV_shader_buffer_load "GL_NV_shader_buffer_load", #endif #ifdef GL_NV_shader_noperspective_interpolation "GL_NV_shader_noperspective_interpolation", #endif #ifdef GL_NV_shader_storage_buffer_object "GL_NV_shader_storage_buffer_object", #endif #ifdef GL_NV_shader_thread_group "GL_NV_shader_thread_group", #endif #ifdef GL_NV_shader_thread_shuffle "GL_NV_shader_thread_shuffle", #endif #ifdef GL_NV_shadow_samplers_array "GL_NV_shadow_samplers_array", #endif #ifdef GL_NV_shadow_samplers_cube "GL_NV_shadow_samplers_cube", #endif #ifdef GL_NV_stereo_view_rendering "GL_NV_stereo_view_rendering", #endif #ifdef GL_NV_tessellation_program5 "GL_NV_tessellation_program5", #endif #ifdef GL_NV_texgen_emboss "GL_NV_texgen_emboss", #endif #ifdef GL_NV_texgen_reflection "GL_NV_texgen_reflection", #endif #ifdef GL_NV_texture_array "GL_NV_texture_array", #endif #ifdef GL_NV_texture_barrier "GL_NV_texture_barrier", #endif #ifdef GL_NV_texture_border_clamp "GL_NV_texture_border_clamp", #endif #ifdef GL_NV_texture_compression_latc "GL_NV_texture_compression_latc", #endif #ifdef GL_NV_texture_compression_s3tc "GL_NV_texture_compression_s3tc", #endif #ifdef GL_NV_texture_compression_s3tc_update "GL_NV_texture_compression_s3tc_update", #endif #ifdef GL_NV_texture_compression_vtc "GL_NV_texture_compression_vtc", #endif #ifdef GL_NV_texture_env_combine4 "GL_NV_texture_env_combine4", #endif #ifdef GL_NV_texture_expand_normal "GL_NV_texture_expand_normal", #endif #ifdef GL_NV_texture_multisample "GL_NV_texture_multisample", #endif #ifdef GL_NV_texture_npot_2D_mipmap "GL_NV_texture_npot_2D_mipmap", #endif #ifdef GL_NV_texture_rectangle "GL_NV_texture_rectangle", #endif #ifdef GL_NV_texture_rectangle_compressed "GL_NV_texture_rectangle_compressed", #endif #ifdef GL_NV_texture_shader "GL_NV_texture_shader", #endif #ifdef GL_NV_texture_shader2 "GL_NV_texture_shader2", #endif #ifdef GL_NV_texture_shader3 "GL_NV_texture_shader3", #endif #ifdef GL_NV_transform_feedback "GL_NV_transform_feedback", #endif #ifdef GL_NV_transform_feedback2 "GL_NV_transform_feedback2", #endif #ifdef GL_NV_uniform_buffer_unified_memory "GL_NV_uniform_buffer_unified_memory", #endif #ifdef GL_NV_vdpau_interop "GL_NV_vdpau_interop", #endif #ifdef GL_NV_vertex_array_range "GL_NV_vertex_array_range", #endif #ifdef GL_NV_vertex_array_range2 "GL_NV_vertex_array_range2", #endif #ifdef GL_NV_vertex_attrib_integer_64bit "GL_NV_vertex_attrib_integer_64bit", #endif #ifdef GL_NV_vertex_buffer_unified_memory "GL_NV_vertex_buffer_unified_memory", #endif #ifdef GL_NV_vertex_program "GL_NV_vertex_program", #endif #ifdef GL_NV_vertex_program1_1 "GL_NV_vertex_program1_1", #endif #ifdef GL_NV_vertex_program2 "GL_NV_vertex_program2", #endif #ifdef GL_NV_vertex_program2_option "GL_NV_vertex_program2_option", #endif #ifdef GL_NV_vertex_program3 "GL_NV_vertex_program3", #endif #ifdef GL_NV_vertex_program4 "GL_NV_vertex_program4", #endif #ifdef GL_NV_video_capture "GL_NV_video_capture", #endif #ifdef GL_NV_viewport_array "GL_NV_viewport_array", #endif #ifdef GL_NV_viewport_array2 "GL_NV_viewport_array2", #endif #ifdef GL_NV_viewport_swizzle "GL_NV_viewport_swizzle", #endif #ifdef GL_OES_byte_coordinates "GL_OES_byte_coordinates", #endif #ifdef GL_OML_interlace "GL_OML_interlace", #endif #ifdef GL_OML_resample "GL_OML_resample", #endif #ifdef GL_OML_subsample "GL_OML_subsample", #endif #ifdef GL_OVR_multiview "GL_OVR_multiview", #endif #ifdef GL_OVR_multiview2 "GL_OVR_multiview2", #endif #ifdef GL_OVR_multiview_multisampled_render_to_texture "GL_OVR_multiview_multisampled_render_to_texture", #endif #ifdef GL_PGI_misc_hints "GL_PGI_misc_hints", #endif #ifdef GL_PGI_vertex_hints "GL_PGI_vertex_hints", #endif #ifdef GL_QCOM_alpha_test "GL_QCOM_alpha_test", #endif #ifdef GL_QCOM_binning_control "GL_QCOM_binning_control", #endif #ifdef GL_QCOM_driver_control "GL_QCOM_driver_control", #endif #ifdef GL_QCOM_extended_get "GL_QCOM_extended_get", #endif #ifdef GL_QCOM_extended_get2 "GL_QCOM_extended_get2", #endif #ifdef GL_QCOM_framebuffer_foveated "GL_QCOM_framebuffer_foveated", #endif #ifdef GL_QCOM_perfmon_global_mode "GL_QCOM_perfmon_global_mode", #endif #ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent "GL_QCOM_shader_framebuffer_fetch_noncoherent", #endif #ifdef GL_QCOM_tiled_rendering "GL_QCOM_tiled_rendering", #endif #ifdef GL_QCOM_writeonly_rendering "GL_QCOM_writeonly_rendering", #endif #ifdef GL_REGAL_ES1_0_compatibility "GL_REGAL_ES1_0_compatibility", #endif #ifdef GL_REGAL_ES1_1_compatibility "GL_REGAL_ES1_1_compatibility", #endif #ifdef GL_REGAL_enable "GL_REGAL_enable", #endif #ifdef GL_REGAL_error_string "GL_REGAL_error_string", #endif #ifdef GL_REGAL_extension_query "GL_REGAL_extension_query", #endif #ifdef GL_REGAL_log "GL_REGAL_log", #endif #ifdef GL_REGAL_proc_address "GL_REGAL_proc_address", #endif #ifdef GL_REND_screen_coordinates "GL_REND_screen_coordinates", #endif #ifdef GL_S3_s3tc "GL_S3_s3tc", #endif #ifdef GL_SGIS_clip_band_hint "GL_SGIS_clip_band_hint", #endif #ifdef GL_SGIS_color_range "GL_SGIS_color_range", #endif #ifdef GL_SGIS_detail_texture "GL_SGIS_detail_texture", #endif #ifdef GL_SGIS_fog_function "GL_SGIS_fog_function", #endif #ifdef GL_SGIS_generate_mipmap "GL_SGIS_generate_mipmap", #endif #ifdef GL_SGIS_line_texgen "GL_SGIS_line_texgen", #endif #ifdef GL_SGIS_multisample "GL_SGIS_multisample", #endif #ifdef GL_SGIS_multitexture "GL_SGIS_multitexture", #endif #ifdef GL_SGIS_pixel_texture "GL_SGIS_pixel_texture", #endif #ifdef GL_SGIS_point_line_texgen "GL_SGIS_point_line_texgen", #endif #ifdef GL_SGIS_shared_multisample "GL_SGIS_shared_multisample", #endif #ifdef GL_SGIS_sharpen_texture "GL_SGIS_sharpen_texture", #endif #ifdef GL_SGIS_texture4D "GL_SGIS_texture4D", #endif #ifdef GL_SGIS_texture_border_clamp "GL_SGIS_texture_border_clamp", #endif #ifdef GL_SGIS_texture_edge_clamp "GL_SGIS_texture_edge_clamp", #endif #ifdef GL_SGIS_texture_filter4 "GL_SGIS_texture_filter4", #endif #ifdef GL_SGIS_texture_lod "GL_SGIS_texture_lod", #endif #ifdef GL_SGIS_texture_select "GL_SGIS_texture_select", #endif #ifdef GL_SGIX_async "GL_SGIX_async", #endif #ifdef GL_SGIX_async_histogram "GL_SGIX_async_histogram", #endif #ifdef GL_SGIX_async_pixel "GL_SGIX_async_pixel", #endif #ifdef GL_SGIX_bali_g_instruments "GL_SGIX_bali_g_instruments", #endif #ifdef GL_SGIX_bali_r_instruments "GL_SGIX_bali_r_instruments", #endif #ifdef GL_SGIX_bali_timer_instruments "GL_SGIX_bali_timer_instruments", #endif #ifdef GL_SGIX_blend_alpha_minmax "GL_SGIX_blend_alpha_minmax", #endif #ifdef GL_SGIX_blend_cadd "GL_SGIX_blend_cadd", #endif #ifdef GL_SGIX_blend_cmultiply "GL_SGIX_blend_cmultiply", #endif #ifdef GL_SGIX_calligraphic_fragment "GL_SGIX_calligraphic_fragment", #endif #ifdef GL_SGIX_clipmap "GL_SGIX_clipmap", #endif #ifdef GL_SGIX_color_matrix_accuracy "GL_SGIX_color_matrix_accuracy", #endif #ifdef GL_SGIX_color_table_index_mode "GL_SGIX_color_table_index_mode", #endif #ifdef GL_SGIX_complex_polar "GL_SGIX_complex_polar", #endif #ifdef GL_SGIX_convolution_accuracy "GL_SGIX_convolution_accuracy", #endif #ifdef GL_SGIX_cube_map "GL_SGIX_cube_map", #endif #ifdef GL_SGIX_cylinder_texgen "GL_SGIX_cylinder_texgen", #endif #ifdef GL_SGIX_datapipe "GL_SGIX_datapipe", #endif #ifdef GL_SGIX_decimation "GL_SGIX_decimation", #endif #ifdef GL_SGIX_depth_pass_instrument "GL_SGIX_depth_pass_instrument", #endif #ifdef GL_SGIX_depth_texture "GL_SGIX_depth_texture", #endif #ifdef GL_SGIX_dvc "GL_SGIX_dvc", #endif #ifdef GL_SGIX_flush_raster "GL_SGIX_flush_raster", #endif #ifdef GL_SGIX_fog_blend "GL_SGIX_fog_blend", #endif #ifdef GL_SGIX_fog_factor_to_alpha "GL_SGIX_fog_factor_to_alpha", #endif #ifdef GL_SGIX_fog_layers "GL_SGIX_fog_layers", #endif #ifdef GL_SGIX_fog_offset "GL_SGIX_fog_offset", #endif #ifdef GL_SGIX_fog_patchy "GL_SGIX_fog_patchy", #endif #ifdef GL_SGIX_fog_scale "GL_SGIX_fog_scale", #endif #ifdef GL_SGIX_fog_texture "GL_SGIX_fog_texture", #endif #ifdef GL_SGIX_fragment_lighting_space "GL_SGIX_fragment_lighting_space", #endif #ifdef GL_SGIX_fragment_specular_lighting "GL_SGIX_fragment_specular_lighting", #endif #ifdef GL_SGIX_fragments_instrument "GL_SGIX_fragments_instrument", #endif #ifdef GL_SGIX_framezoom "GL_SGIX_framezoom", #endif #ifdef GL_SGIX_icc_texture "GL_SGIX_icc_texture", #endif #ifdef GL_SGIX_igloo_interface "GL_SGIX_igloo_interface", #endif #ifdef GL_SGIX_image_compression "GL_SGIX_image_compression", #endif #ifdef GL_SGIX_impact_pixel_texture "GL_SGIX_impact_pixel_texture", #endif #ifdef GL_SGIX_instrument_error "GL_SGIX_instrument_error", #endif #ifdef GL_SGIX_interlace "GL_SGIX_interlace", #endif #ifdef GL_SGIX_ir_instrument1 "GL_SGIX_ir_instrument1", #endif #ifdef GL_SGIX_line_quality_hint "GL_SGIX_line_quality_hint", #endif #ifdef GL_SGIX_list_priority "GL_SGIX_list_priority", #endif #ifdef GL_SGIX_mpeg1 "GL_SGIX_mpeg1", #endif #ifdef GL_SGIX_mpeg2 "GL_SGIX_mpeg2", #endif #ifdef GL_SGIX_nonlinear_lighting_pervertex "GL_SGIX_nonlinear_lighting_pervertex", #endif #ifdef GL_SGIX_nurbs_eval "GL_SGIX_nurbs_eval", #endif #ifdef GL_SGIX_occlusion_instrument "GL_SGIX_occlusion_instrument", #endif #ifdef GL_SGIX_packed_6bytes "GL_SGIX_packed_6bytes", #endif #ifdef GL_SGIX_pixel_texture "GL_SGIX_pixel_texture", #endif #ifdef GL_SGIX_pixel_texture_bits "GL_SGIX_pixel_texture_bits", #endif #ifdef GL_SGIX_pixel_texture_lod "GL_SGIX_pixel_texture_lod", #endif #ifdef GL_SGIX_pixel_tiles "GL_SGIX_pixel_tiles", #endif #ifdef GL_SGIX_polynomial_ffd "GL_SGIX_polynomial_ffd", #endif #ifdef GL_SGIX_quad_mesh "GL_SGIX_quad_mesh", #endif #ifdef GL_SGIX_reference_plane "GL_SGIX_reference_plane", #endif #ifdef GL_SGIX_resample "GL_SGIX_resample", #endif #ifdef GL_SGIX_scalebias_hint "GL_SGIX_scalebias_hint", #endif #ifdef GL_SGIX_shadow "GL_SGIX_shadow", #endif #ifdef GL_SGIX_shadow_ambient "GL_SGIX_shadow_ambient", #endif #ifdef GL_SGIX_slim "GL_SGIX_slim", #endif #ifdef GL_SGIX_spotlight_cutoff "GL_SGIX_spotlight_cutoff", #endif #ifdef GL_SGIX_sprite "GL_SGIX_sprite", #endif #ifdef GL_SGIX_subdiv_patch "GL_SGIX_subdiv_patch", #endif #ifdef GL_SGIX_subsample "GL_SGIX_subsample", #endif #ifdef GL_SGIX_tag_sample_buffer "GL_SGIX_tag_sample_buffer", #endif #ifdef GL_SGIX_texture_add_env "GL_SGIX_texture_add_env", #endif #ifdef GL_SGIX_texture_coordinate_clamp "GL_SGIX_texture_coordinate_clamp", #endif #ifdef GL_SGIX_texture_lod_bias "GL_SGIX_texture_lod_bias", #endif #ifdef GL_SGIX_texture_mipmap_anisotropic "GL_SGIX_texture_mipmap_anisotropic", #endif #ifdef GL_SGIX_texture_multi_buffer "GL_SGIX_texture_multi_buffer", #endif #ifdef GL_SGIX_texture_phase "GL_SGIX_texture_phase", #endif #ifdef GL_SGIX_texture_range "GL_SGIX_texture_range", #endif #ifdef GL_SGIX_texture_scale_bias "GL_SGIX_texture_scale_bias", #endif #ifdef GL_SGIX_texture_supersample "GL_SGIX_texture_supersample", #endif #ifdef GL_SGIX_vector_ops "GL_SGIX_vector_ops", #endif #ifdef GL_SGIX_vertex_array_object "GL_SGIX_vertex_array_object", #endif #ifdef GL_SGIX_vertex_preclip "GL_SGIX_vertex_preclip", #endif #ifdef GL_SGIX_vertex_preclip_hint "GL_SGIX_vertex_preclip_hint", #endif #ifdef GL_SGIX_ycrcb "GL_SGIX_ycrcb", #endif #ifdef GL_SGIX_ycrcb_subsample "GL_SGIX_ycrcb_subsample", #endif #ifdef GL_SGIX_ycrcba "GL_SGIX_ycrcba", #endif #ifdef GL_SGI_color_matrix "GL_SGI_color_matrix", #endif #ifdef GL_SGI_color_table "GL_SGI_color_table", #endif #ifdef GL_SGI_complex "GL_SGI_complex", #endif #ifdef GL_SGI_complex_type "GL_SGI_complex_type", #endif #ifdef GL_SGI_fft "GL_SGI_fft", #endif #ifdef GL_SGI_texture_color_table "GL_SGI_texture_color_table", #endif #ifdef GL_SUNX_constant_data "GL_SUNX_constant_data", #endif #ifdef GL_SUN_convolution_border_modes "GL_SUN_convolution_border_modes", #endif #ifdef GL_SUN_global_alpha "GL_SUN_global_alpha", #endif #ifdef GL_SUN_mesh_array "GL_SUN_mesh_array", #endif #ifdef GL_SUN_read_video_pixels "GL_SUN_read_video_pixels", #endif #ifdef GL_SUN_slice_accum "GL_SUN_slice_accum", #endif #ifdef GL_SUN_triangle_list "GL_SUN_triangle_list", #endif #ifdef GL_SUN_vertex "GL_SUN_vertex", #endif #ifdef GL_WIN_phong_shading "GL_WIN_phong_shading", #endif #ifdef GL_WIN_scene_markerXXX "GL_WIN_scene_markerXXX", #endif #ifdef GL_WIN_specular_fog "GL_WIN_specular_fog", #endif #ifdef GL_WIN_swap_hint "GL_WIN_swap_hint", #endif NULL }; /* Detected in the extension string or strings */ static GLboolean _glewExtensionString[801]; /* Detected via extension string or experimental mode */ static GLboolean* _glewExtensionEnabled[] = { #ifdef GL_VERSION_1_2 &__GLEW_VERSION_1_2, #endif #ifdef GL_VERSION_1_2_1 &__GLEW_VERSION_1_2_1, #endif #ifdef GL_VERSION_1_3 &__GLEW_VERSION_1_3, #endif #ifdef GL_VERSION_1_4 &__GLEW_VERSION_1_4, #endif #ifdef GL_VERSION_1_5 &__GLEW_VERSION_1_5, #endif #ifdef GL_VERSION_2_0 &__GLEW_VERSION_2_0, #endif #ifdef GL_VERSION_2_1 &__GLEW_VERSION_2_1, #endif #ifdef GL_VERSION_3_0 &__GLEW_VERSION_3_0, #endif #ifdef GL_VERSION_3_1 &__GLEW_VERSION_3_1, #endif #ifdef GL_VERSION_3_2 &__GLEW_VERSION_3_2, #endif #ifdef GL_VERSION_3_3 &__GLEW_VERSION_3_3, #endif #ifdef GL_VERSION_4_0 &__GLEW_VERSION_4_0, #endif #ifdef GL_VERSION_4_1 &__GLEW_VERSION_4_1, #endif #ifdef GL_VERSION_4_2 &__GLEW_VERSION_4_2, #endif #ifdef GL_VERSION_4_3 &__GLEW_VERSION_4_3, #endif #ifdef GL_VERSION_4_4 &__GLEW_VERSION_4_4, #endif #ifdef GL_VERSION_4_5 &__GLEW_VERSION_4_5, #endif #ifdef GL_VERSION_4_6 &__GLEW_VERSION_4_6, #endif #ifdef GL_3DFX_multisample &__GLEW_3DFX_multisample, #endif #ifdef GL_3DFX_tbuffer &__GLEW_3DFX_tbuffer, #endif #ifdef GL_3DFX_texture_compression_FXT1 &__GLEW_3DFX_texture_compression_FXT1, #endif #ifdef GL_AMD_blend_minmax_factor &__GLEW_AMD_blend_minmax_factor, #endif #ifdef GL_AMD_compressed_3DC_texture &__GLEW_AMD_compressed_3DC_texture, #endif #ifdef GL_AMD_compressed_ATC_texture &__GLEW_AMD_compressed_ATC_texture, #endif #ifdef GL_AMD_conservative_depth &__GLEW_AMD_conservative_depth, #endif #ifdef GL_AMD_debug_output &__GLEW_AMD_debug_output, #endif #ifdef GL_AMD_depth_clamp_separate &__GLEW_AMD_depth_clamp_separate, #endif #ifdef GL_AMD_draw_buffers_blend &__GLEW_AMD_draw_buffers_blend, #endif #ifdef GL_AMD_framebuffer_sample_positions &__GLEW_AMD_framebuffer_sample_positions, #endif #ifdef GL_AMD_gcn_shader &__GLEW_AMD_gcn_shader, #endif #ifdef GL_AMD_gpu_shader_half_float &__GLEW_AMD_gpu_shader_half_float, #endif #ifdef GL_AMD_gpu_shader_int16 &__GLEW_AMD_gpu_shader_int16, #endif #ifdef GL_AMD_gpu_shader_int64 &__GLEW_AMD_gpu_shader_int64, #endif #ifdef GL_AMD_interleaved_elements &__GLEW_AMD_interleaved_elements, #endif #ifdef GL_AMD_multi_draw_indirect &__GLEW_AMD_multi_draw_indirect, #endif #ifdef GL_AMD_name_gen_delete &__GLEW_AMD_name_gen_delete, #endif #ifdef GL_AMD_occlusion_query_event &__GLEW_AMD_occlusion_query_event, #endif #ifdef GL_AMD_performance_monitor &__GLEW_AMD_performance_monitor, #endif #ifdef GL_AMD_pinned_memory &__GLEW_AMD_pinned_memory, #endif #ifdef GL_AMD_program_binary_Z400 &__GLEW_AMD_program_binary_Z400, #endif #ifdef GL_AMD_query_buffer_object &__GLEW_AMD_query_buffer_object, #endif #ifdef GL_AMD_sample_positions &__GLEW_AMD_sample_positions, #endif #ifdef GL_AMD_seamless_cubemap_per_texture &__GLEW_AMD_seamless_cubemap_per_texture, #endif #ifdef GL_AMD_shader_atomic_counter_ops &__GLEW_AMD_shader_atomic_counter_ops, #endif #ifdef GL_AMD_shader_ballot &__GLEW_AMD_shader_ballot, #endif #ifdef GL_AMD_shader_explicit_vertex_parameter &__GLEW_AMD_shader_explicit_vertex_parameter, #endif #ifdef GL_AMD_shader_stencil_export &__GLEW_AMD_shader_stencil_export, #endif #ifdef GL_AMD_shader_stencil_value_export &__GLEW_AMD_shader_stencil_value_export, #endif #ifdef GL_AMD_shader_trinary_minmax &__GLEW_AMD_shader_trinary_minmax, #endif #ifdef GL_AMD_sparse_texture &__GLEW_AMD_sparse_texture, #endif #ifdef GL_AMD_stencil_operation_extended &__GLEW_AMD_stencil_operation_extended, #endif #ifdef GL_AMD_texture_gather_bias_lod &__GLEW_AMD_texture_gather_bias_lod, #endif #ifdef GL_AMD_texture_texture4 &__GLEW_AMD_texture_texture4, #endif #ifdef GL_AMD_transform_feedback3_lines_triangles &__GLEW_AMD_transform_feedback3_lines_triangles, #endif #ifdef GL_AMD_transform_feedback4 &__GLEW_AMD_transform_feedback4, #endif #ifdef GL_AMD_vertex_shader_layer &__GLEW_AMD_vertex_shader_layer, #endif #ifdef GL_AMD_vertex_shader_tessellator &__GLEW_AMD_vertex_shader_tessellator, #endif #ifdef GL_AMD_vertex_shader_viewport_index &__GLEW_AMD_vertex_shader_viewport_index, #endif #ifdef GL_ANDROID_extension_pack_es31a &__GLEW_ANDROID_extension_pack_es31a, #endif #ifdef GL_ANGLE_depth_texture &__GLEW_ANGLE_depth_texture, #endif #ifdef GL_ANGLE_framebuffer_blit &__GLEW_ANGLE_framebuffer_blit, #endif #ifdef GL_ANGLE_framebuffer_multisample &__GLEW_ANGLE_framebuffer_multisample, #endif #ifdef GL_ANGLE_instanced_arrays &__GLEW_ANGLE_instanced_arrays, #endif #ifdef GL_ANGLE_pack_reverse_row_order &__GLEW_ANGLE_pack_reverse_row_order, #endif #ifdef GL_ANGLE_program_binary &__GLEW_ANGLE_program_binary, #endif #ifdef GL_ANGLE_texture_compression_dxt1 &__GLEW_ANGLE_texture_compression_dxt1, #endif #ifdef GL_ANGLE_texture_compression_dxt3 &__GLEW_ANGLE_texture_compression_dxt3, #endif #ifdef GL_ANGLE_texture_compression_dxt5 &__GLEW_ANGLE_texture_compression_dxt5, #endif #ifdef GL_ANGLE_texture_usage &__GLEW_ANGLE_texture_usage, #endif #ifdef GL_ANGLE_timer_query &__GLEW_ANGLE_timer_query, #endif #ifdef GL_ANGLE_translated_shader_source &__GLEW_ANGLE_translated_shader_source, #endif #ifdef GL_APPLE_aux_depth_stencil &__GLEW_APPLE_aux_depth_stencil, #endif #ifdef GL_APPLE_client_storage &__GLEW_APPLE_client_storage, #endif #ifdef GL_APPLE_clip_distance &__GLEW_APPLE_clip_distance, #endif #ifdef GL_APPLE_color_buffer_packed_float &__GLEW_APPLE_color_buffer_packed_float, #endif #ifdef GL_APPLE_copy_texture_levels &__GLEW_APPLE_copy_texture_levels, #endif #ifdef GL_APPLE_element_array &__GLEW_APPLE_element_array, #endif #ifdef GL_APPLE_fence &__GLEW_APPLE_fence, #endif #ifdef GL_APPLE_float_pixels &__GLEW_APPLE_float_pixels, #endif #ifdef GL_APPLE_flush_buffer_range &__GLEW_APPLE_flush_buffer_range, #endif #ifdef GL_APPLE_framebuffer_multisample &__GLEW_APPLE_framebuffer_multisample, #endif #ifdef GL_APPLE_object_purgeable &__GLEW_APPLE_object_purgeable, #endif #ifdef GL_APPLE_pixel_buffer &__GLEW_APPLE_pixel_buffer, #endif #ifdef GL_APPLE_rgb_422 &__GLEW_APPLE_rgb_422, #endif #ifdef GL_APPLE_row_bytes &__GLEW_APPLE_row_bytes, #endif #ifdef GL_APPLE_specular_vector &__GLEW_APPLE_specular_vector, #endif #ifdef GL_APPLE_sync &__GLEW_APPLE_sync, #endif #ifdef GL_APPLE_texture_2D_limited_npot &__GLEW_APPLE_texture_2D_limited_npot, #endif #ifdef GL_APPLE_texture_format_BGRA8888 &__GLEW_APPLE_texture_format_BGRA8888, #endif #ifdef GL_APPLE_texture_max_level &__GLEW_APPLE_texture_max_level, #endif #ifdef GL_APPLE_texture_packed_float &__GLEW_APPLE_texture_packed_float, #endif #ifdef GL_APPLE_texture_range &__GLEW_APPLE_texture_range, #endif #ifdef GL_APPLE_transform_hint &__GLEW_APPLE_transform_hint, #endif #ifdef GL_APPLE_vertex_array_object &__GLEW_APPLE_vertex_array_object, #endif #ifdef GL_APPLE_vertex_array_range &__GLEW_APPLE_vertex_array_range, #endif #ifdef GL_APPLE_vertex_program_evaluators &__GLEW_APPLE_vertex_program_evaluators, #endif #ifdef GL_APPLE_ycbcr_422 &__GLEW_APPLE_ycbcr_422, #endif #ifdef GL_ARB_ES2_compatibility &__GLEW_ARB_ES2_compatibility, #endif #ifdef GL_ARB_ES3_1_compatibility &__GLEW_ARB_ES3_1_compatibility, #endif #ifdef GL_ARB_ES3_2_compatibility &__GLEW_ARB_ES3_2_compatibility, #endif #ifdef GL_ARB_ES3_compatibility &__GLEW_ARB_ES3_compatibility, #endif #ifdef GL_ARB_arrays_of_arrays &__GLEW_ARB_arrays_of_arrays, #endif #ifdef GL_ARB_base_instance &__GLEW_ARB_base_instance, #endif #ifdef GL_ARB_bindless_texture &__GLEW_ARB_bindless_texture, #endif #ifdef GL_ARB_blend_func_extended &__GLEW_ARB_blend_func_extended, #endif #ifdef GL_ARB_buffer_storage &__GLEW_ARB_buffer_storage, #endif #ifdef GL_ARB_cl_event &__GLEW_ARB_cl_event, #endif #ifdef GL_ARB_clear_buffer_object &__GLEW_ARB_clear_buffer_object, #endif #ifdef GL_ARB_clear_texture &__GLEW_ARB_clear_texture, #endif #ifdef GL_ARB_clip_control &__GLEW_ARB_clip_control, #endif #ifdef GL_ARB_color_buffer_float &__GLEW_ARB_color_buffer_float, #endif #ifdef GL_ARB_compatibility &__GLEW_ARB_compatibility, #endif #ifdef GL_ARB_compressed_texture_pixel_storage &__GLEW_ARB_compressed_texture_pixel_storage, #endif #ifdef GL_ARB_compute_shader &__GLEW_ARB_compute_shader, #endif #ifdef GL_ARB_compute_variable_group_size &__GLEW_ARB_compute_variable_group_size, #endif #ifdef GL_ARB_conditional_render_inverted &__GLEW_ARB_conditional_render_inverted, #endif #ifdef GL_ARB_conservative_depth &__GLEW_ARB_conservative_depth, #endif #ifdef GL_ARB_copy_buffer &__GLEW_ARB_copy_buffer, #endif #ifdef GL_ARB_copy_image &__GLEW_ARB_copy_image, #endif #ifdef GL_ARB_cull_distance &__GLEW_ARB_cull_distance, #endif #ifdef GL_ARB_debug_output &__GLEW_ARB_debug_output, #endif #ifdef GL_ARB_depth_buffer_float &__GLEW_ARB_depth_buffer_float, #endif #ifdef GL_ARB_depth_clamp &__GLEW_ARB_depth_clamp, #endif #ifdef GL_ARB_depth_texture &__GLEW_ARB_depth_texture, #endif #ifdef GL_ARB_derivative_control &__GLEW_ARB_derivative_control, #endif #ifdef GL_ARB_direct_state_access &__GLEW_ARB_direct_state_access, #endif #ifdef GL_ARB_draw_buffers &__GLEW_ARB_draw_buffers, #endif #ifdef GL_ARB_draw_buffers_blend &__GLEW_ARB_draw_buffers_blend, #endif #ifdef GL_ARB_draw_elements_base_vertex &__GLEW_ARB_draw_elements_base_vertex, #endif #ifdef GL_ARB_draw_indirect &__GLEW_ARB_draw_indirect, #endif #ifdef GL_ARB_draw_instanced &__GLEW_ARB_draw_instanced, #endif #ifdef GL_ARB_enhanced_layouts &__GLEW_ARB_enhanced_layouts, #endif #ifdef GL_ARB_explicit_attrib_location &__GLEW_ARB_explicit_attrib_location, #endif #ifdef GL_ARB_explicit_uniform_location &__GLEW_ARB_explicit_uniform_location, #endif #ifdef GL_ARB_fragment_coord_conventions &__GLEW_ARB_fragment_coord_conventions, #endif #ifdef GL_ARB_fragment_layer_viewport &__GLEW_ARB_fragment_layer_viewport, #endif #ifdef GL_ARB_fragment_program &__GLEW_ARB_fragment_program, #endif #ifdef GL_ARB_fragment_program_shadow &__GLEW_ARB_fragment_program_shadow, #endif #ifdef GL_ARB_fragment_shader &__GLEW_ARB_fragment_shader, #endif #ifdef GL_ARB_fragment_shader_interlock &__GLEW_ARB_fragment_shader_interlock, #endif #ifdef GL_ARB_framebuffer_no_attachments &__GLEW_ARB_framebuffer_no_attachments, #endif #ifdef GL_ARB_framebuffer_object &__GLEW_ARB_framebuffer_object, #endif #ifdef GL_ARB_framebuffer_sRGB &__GLEW_ARB_framebuffer_sRGB, #endif #ifdef GL_ARB_geometry_shader4 &__GLEW_ARB_geometry_shader4, #endif #ifdef GL_ARB_get_program_binary &__GLEW_ARB_get_program_binary, #endif #ifdef GL_ARB_get_texture_sub_image &__GLEW_ARB_get_texture_sub_image, #endif #ifdef GL_ARB_gl_spirv &__GLEW_ARB_gl_spirv, #endif #ifdef GL_ARB_gpu_shader5 &__GLEW_ARB_gpu_shader5, #endif #ifdef GL_ARB_gpu_shader_fp64 &__GLEW_ARB_gpu_shader_fp64, #endif #ifdef GL_ARB_gpu_shader_int64 &__GLEW_ARB_gpu_shader_int64, #endif #ifdef GL_ARB_half_float_pixel &__GLEW_ARB_half_float_pixel, #endif #ifdef GL_ARB_half_float_vertex &__GLEW_ARB_half_float_vertex, #endif #ifdef GL_ARB_imaging &__GLEW_ARB_imaging, #endif #ifdef GL_ARB_indirect_parameters &__GLEW_ARB_indirect_parameters, #endif #ifdef GL_ARB_instanced_arrays &__GLEW_ARB_instanced_arrays, #endif #ifdef GL_ARB_internalformat_query &__GLEW_ARB_internalformat_query, #endif #ifdef GL_ARB_internalformat_query2 &__GLEW_ARB_internalformat_query2, #endif #ifdef GL_ARB_invalidate_subdata &__GLEW_ARB_invalidate_subdata, #endif #ifdef GL_ARB_map_buffer_alignment &__GLEW_ARB_map_buffer_alignment, #endif #ifdef GL_ARB_map_buffer_range &__GLEW_ARB_map_buffer_range, #endif #ifdef GL_ARB_matrix_palette &__GLEW_ARB_matrix_palette, #endif #ifdef GL_ARB_multi_bind &__GLEW_ARB_multi_bind, #endif #ifdef GL_ARB_multi_draw_indirect &__GLEW_ARB_multi_draw_indirect, #endif #ifdef GL_ARB_multisample &__GLEW_ARB_multisample, #endif #ifdef GL_ARB_multitexture &__GLEW_ARB_multitexture, #endif #ifdef GL_ARB_occlusion_query &__GLEW_ARB_occlusion_query, #endif #ifdef GL_ARB_occlusion_query2 &__GLEW_ARB_occlusion_query2, #endif #ifdef GL_ARB_parallel_shader_compile &__GLEW_ARB_parallel_shader_compile, #endif #ifdef GL_ARB_pipeline_statistics_query &__GLEW_ARB_pipeline_statistics_query, #endif #ifdef GL_ARB_pixel_buffer_object &__GLEW_ARB_pixel_buffer_object, #endif #ifdef GL_ARB_point_parameters &__GLEW_ARB_point_parameters, #endif #ifdef GL_ARB_point_sprite &__GLEW_ARB_point_sprite, #endif #ifdef GL_ARB_polygon_offset_clamp &__GLEW_ARB_polygon_offset_clamp, #endif #ifdef GL_ARB_post_depth_coverage &__GLEW_ARB_post_depth_coverage, #endif #ifdef GL_ARB_program_interface_query &__GLEW_ARB_program_interface_query, #endif #ifdef GL_ARB_provoking_vertex &__GLEW_ARB_provoking_vertex, #endif #ifdef GL_ARB_query_buffer_object &__GLEW_ARB_query_buffer_object, #endif #ifdef GL_ARB_robust_buffer_access_behavior &__GLEW_ARB_robust_buffer_access_behavior, #endif #ifdef GL_ARB_robustness &__GLEW_ARB_robustness, #endif #ifdef GL_ARB_robustness_application_isolation &__GLEW_ARB_robustness_application_isolation, #endif #ifdef GL_ARB_robustness_share_group_isolation &__GLEW_ARB_robustness_share_group_isolation, #endif #ifdef GL_ARB_sample_locations &__GLEW_ARB_sample_locations, #endif #ifdef GL_ARB_sample_shading &__GLEW_ARB_sample_shading, #endif #ifdef GL_ARB_sampler_objects &__GLEW_ARB_sampler_objects, #endif #ifdef GL_ARB_seamless_cube_map &__GLEW_ARB_seamless_cube_map, #endif #ifdef GL_ARB_seamless_cubemap_per_texture &__GLEW_ARB_seamless_cubemap_per_texture, #endif #ifdef GL_ARB_separate_shader_objects &__GLEW_ARB_separate_shader_objects, #endif #ifdef GL_ARB_shader_atomic_counter_ops &__GLEW_ARB_shader_atomic_counter_ops, #endif #ifdef GL_ARB_shader_atomic_counters &__GLEW_ARB_shader_atomic_counters, #endif #ifdef GL_ARB_shader_ballot &__GLEW_ARB_shader_ballot, #endif #ifdef GL_ARB_shader_bit_encoding &__GLEW_ARB_shader_bit_encoding, #endif #ifdef GL_ARB_shader_clock &__GLEW_ARB_shader_clock, #endif #ifdef GL_ARB_shader_draw_parameters &__GLEW_ARB_shader_draw_parameters, #endif #ifdef GL_ARB_shader_group_vote &__GLEW_ARB_shader_group_vote, #endif #ifdef GL_ARB_shader_image_load_store &__GLEW_ARB_shader_image_load_store, #endif #ifdef GL_ARB_shader_image_size &__GLEW_ARB_shader_image_size, #endif #ifdef GL_ARB_shader_objects &__GLEW_ARB_shader_objects, #endif #ifdef GL_ARB_shader_precision &__GLEW_ARB_shader_precision, #endif #ifdef GL_ARB_shader_stencil_export &__GLEW_ARB_shader_stencil_export, #endif #ifdef GL_ARB_shader_storage_buffer_object &__GLEW_ARB_shader_storage_buffer_object, #endif #ifdef GL_ARB_shader_subroutine &__GLEW_ARB_shader_subroutine, #endif #ifdef GL_ARB_shader_texture_image_samples &__GLEW_ARB_shader_texture_image_samples, #endif #ifdef GL_ARB_shader_texture_lod &__GLEW_ARB_shader_texture_lod, #endif #ifdef GL_ARB_shader_viewport_layer_array &__GLEW_ARB_shader_viewport_layer_array, #endif #ifdef GL_ARB_shading_language_100 &__GLEW_ARB_shading_language_100, #endif #ifdef GL_ARB_shading_language_420pack &__GLEW_ARB_shading_language_420pack, #endif #ifdef GL_ARB_shading_language_include &__GLEW_ARB_shading_language_include, #endif #ifdef GL_ARB_shading_language_packing &__GLEW_ARB_shading_language_packing, #endif #ifdef GL_ARB_shadow &__GLEW_ARB_shadow, #endif #ifdef GL_ARB_shadow_ambient &__GLEW_ARB_shadow_ambient, #endif #ifdef GL_ARB_sparse_buffer &__GLEW_ARB_sparse_buffer, #endif #ifdef GL_ARB_sparse_texture &__GLEW_ARB_sparse_texture, #endif #ifdef GL_ARB_sparse_texture2 &__GLEW_ARB_sparse_texture2, #endif #ifdef GL_ARB_sparse_texture_clamp &__GLEW_ARB_sparse_texture_clamp, #endif #ifdef GL_ARB_spirv_extensions &__GLEW_ARB_spirv_extensions, #endif #ifdef GL_ARB_stencil_texturing &__GLEW_ARB_stencil_texturing, #endif #ifdef GL_ARB_sync &__GLEW_ARB_sync, #endif #ifdef GL_ARB_tessellation_shader &__GLEW_ARB_tessellation_shader, #endif #ifdef GL_ARB_texture_barrier &__GLEW_ARB_texture_barrier, #endif #ifdef GL_ARB_texture_border_clamp &__GLEW_ARB_texture_border_clamp, #endif #ifdef GL_ARB_texture_buffer_object &__GLEW_ARB_texture_buffer_object, #endif #ifdef GL_ARB_texture_buffer_object_rgb32 &__GLEW_ARB_texture_buffer_object_rgb32, #endif #ifdef GL_ARB_texture_buffer_range &__GLEW_ARB_texture_buffer_range, #endif #ifdef GL_ARB_texture_compression &__GLEW_ARB_texture_compression, #endif #ifdef GL_ARB_texture_compression_bptc &__GLEW_ARB_texture_compression_bptc, #endif #ifdef GL_ARB_texture_compression_rgtc &__GLEW_ARB_texture_compression_rgtc, #endif #ifdef GL_ARB_texture_cube_map &__GLEW_ARB_texture_cube_map, #endif #ifdef GL_ARB_texture_cube_map_array &__GLEW_ARB_texture_cube_map_array, #endif #ifdef GL_ARB_texture_env_add &__GLEW_ARB_texture_env_add, #endif #ifdef GL_ARB_texture_env_combine &__GLEW_ARB_texture_env_combine, #endif #ifdef GL_ARB_texture_env_crossbar &__GLEW_ARB_texture_env_crossbar, #endif #ifdef GL_ARB_texture_env_dot3 &__GLEW_ARB_texture_env_dot3, #endif #ifdef GL_ARB_texture_filter_anisotropic &__GLEW_ARB_texture_filter_anisotropic, #endif #ifdef GL_ARB_texture_filter_minmax &__GLEW_ARB_texture_filter_minmax, #endif #ifdef GL_ARB_texture_float &__GLEW_ARB_texture_float, #endif #ifdef GL_ARB_texture_gather &__GLEW_ARB_texture_gather, #endif #ifdef GL_ARB_texture_mirror_clamp_to_edge &__GLEW_ARB_texture_mirror_clamp_to_edge, #endif #ifdef GL_ARB_texture_mirrored_repeat &__GLEW_ARB_texture_mirrored_repeat, #endif #ifdef GL_ARB_texture_multisample &__GLEW_ARB_texture_multisample, #endif #ifdef GL_ARB_texture_non_power_of_two &__GLEW_ARB_texture_non_power_of_two, #endif #ifdef GL_ARB_texture_query_levels &__GLEW_ARB_texture_query_levels, #endif #ifdef GL_ARB_texture_query_lod &__GLEW_ARB_texture_query_lod, #endif #ifdef GL_ARB_texture_rectangle &__GLEW_ARB_texture_rectangle, #endif #ifdef GL_ARB_texture_rg &__GLEW_ARB_texture_rg, #endif #ifdef GL_ARB_texture_rgb10_a2ui &__GLEW_ARB_texture_rgb10_a2ui, #endif #ifdef GL_ARB_texture_stencil8 &__GLEW_ARB_texture_stencil8, #endif #ifdef GL_ARB_texture_storage &__GLEW_ARB_texture_storage, #endif #ifdef GL_ARB_texture_storage_multisample &__GLEW_ARB_texture_storage_multisample, #endif #ifdef GL_ARB_texture_swizzle &__GLEW_ARB_texture_swizzle, #endif #ifdef GL_ARB_texture_view &__GLEW_ARB_texture_view, #endif #ifdef GL_ARB_timer_query &__GLEW_ARB_timer_query, #endif #ifdef GL_ARB_transform_feedback2 &__GLEW_ARB_transform_feedback2, #endif #ifdef GL_ARB_transform_feedback3 &__GLEW_ARB_transform_feedback3, #endif #ifdef GL_ARB_transform_feedback_instanced &__GLEW_ARB_transform_feedback_instanced, #endif #ifdef GL_ARB_transform_feedback_overflow_query &__GLEW_ARB_transform_feedback_overflow_query, #endif #ifdef GL_ARB_transpose_matrix &__GLEW_ARB_transpose_matrix, #endif #ifdef GL_ARB_uniform_buffer_object &__GLEW_ARB_uniform_buffer_object, #endif #ifdef GL_ARB_vertex_array_bgra &__GLEW_ARB_vertex_array_bgra, #endif #ifdef GL_ARB_vertex_array_object &__GLEW_ARB_vertex_array_object, #endif #ifdef GL_ARB_vertex_attrib_64bit &__GLEW_ARB_vertex_attrib_64bit, #endif #ifdef GL_ARB_vertex_attrib_binding &__GLEW_ARB_vertex_attrib_binding, #endif #ifdef GL_ARB_vertex_blend &__GLEW_ARB_vertex_blend, #endif #ifdef GL_ARB_vertex_buffer_object &__GLEW_ARB_vertex_buffer_object, #endif #ifdef GL_ARB_vertex_program &__GLEW_ARB_vertex_program, #endif #ifdef GL_ARB_vertex_shader &__GLEW_ARB_vertex_shader, #endif #ifdef GL_ARB_vertex_type_10f_11f_11f_rev &__GLEW_ARB_vertex_type_10f_11f_11f_rev, #endif #ifdef GL_ARB_vertex_type_2_10_10_10_rev &__GLEW_ARB_vertex_type_2_10_10_10_rev, #endif #ifdef GL_ARB_viewport_array &__GLEW_ARB_viewport_array, #endif #ifdef GL_ARB_window_pos &__GLEW_ARB_window_pos, #endif #ifdef GL_ARM_mali_program_binary &__GLEW_ARM_mali_program_binary, #endif #ifdef GL_ARM_mali_shader_binary &__GLEW_ARM_mali_shader_binary, #endif #ifdef GL_ARM_rgba8 &__GLEW_ARM_rgba8, #endif #ifdef GL_ARM_shader_framebuffer_fetch &__GLEW_ARM_shader_framebuffer_fetch, #endif #ifdef GL_ARM_shader_framebuffer_fetch_depth_stencil &__GLEW_ARM_shader_framebuffer_fetch_depth_stencil, #endif #ifdef GL_ATIX_point_sprites &__GLEW_ATIX_point_sprites, #endif #ifdef GL_ATIX_texture_env_combine3 &__GLEW_ATIX_texture_env_combine3, #endif #ifdef GL_ATIX_texture_env_route &__GLEW_ATIX_texture_env_route, #endif #ifdef GL_ATIX_vertex_shader_output_point_size &__GLEW_ATIX_vertex_shader_output_point_size, #endif #ifdef GL_ATI_draw_buffers &__GLEW_ATI_draw_buffers, #endif #ifdef GL_ATI_element_array &__GLEW_ATI_element_array, #endif #ifdef GL_ATI_envmap_bumpmap &__GLEW_ATI_envmap_bumpmap, #endif #ifdef GL_ATI_fragment_shader &__GLEW_ATI_fragment_shader, #endif #ifdef GL_ATI_map_object_buffer &__GLEW_ATI_map_object_buffer, #endif #ifdef GL_ATI_meminfo &__GLEW_ATI_meminfo, #endif #ifdef GL_ATI_pn_triangles &__GLEW_ATI_pn_triangles, #endif #ifdef GL_ATI_separate_stencil &__GLEW_ATI_separate_stencil, #endif #ifdef GL_ATI_shader_texture_lod &__GLEW_ATI_shader_texture_lod, #endif #ifdef GL_ATI_text_fragment_shader &__GLEW_ATI_text_fragment_shader, #endif #ifdef GL_ATI_texture_compression_3dc &__GLEW_ATI_texture_compression_3dc, #endif #ifdef GL_ATI_texture_env_combine3 &__GLEW_ATI_texture_env_combine3, #endif #ifdef GL_ATI_texture_float &__GLEW_ATI_texture_float, #endif #ifdef GL_ATI_texture_mirror_once &__GLEW_ATI_texture_mirror_once, #endif #ifdef GL_ATI_vertex_array_object &__GLEW_ATI_vertex_array_object, #endif #ifdef GL_ATI_vertex_attrib_array_object &__GLEW_ATI_vertex_attrib_array_object, #endif #ifdef GL_ATI_vertex_streams &__GLEW_ATI_vertex_streams, #endif #ifdef GL_EGL_KHR_context_flush_control &__GLEW_EGL_KHR_context_flush_control, #endif #ifdef GL_EGL_NV_robustness_video_memory_purge &__GLEW_EGL_NV_robustness_video_memory_purge, #endif #ifdef GL_EXT_422_pixels &__GLEW_EXT_422_pixels, #endif #ifdef GL_EXT_Cg_shader &__GLEW_EXT_Cg_shader, #endif #ifdef GL_EXT_EGL_image_array &__GLEW_EXT_EGL_image_array, #endif #ifdef GL_EXT_YUV_target &__GLEW_EXT_YUV_target, #endif #ifdef GL_EXT_abgr &__GLEW_EXT_abgr, #endif #ifdef GL_EXT_base_instance &__GLEW_EXT_base_instance, #endif #ifdef GL_EXT_bgra &__GLEW_EXT_bgra, #endif #ifdef GL_EXT_bindable_uniform &__GLEW_EXT_bindable_uniform, #endif #ifdef GL_EXT_blend_color &__GLEW_EXT_blend_color, #endif #ifdef GL_EXT_blend_equation_separate &__GLEW_EXT_blend_equation_separate, #endif #ifdef GL_EXT_blend_func_extended &__GLEW_EXT_blend_func_extended, #endif #ifdef GL_EXT_blend_func_separate &__GLEW_EXT_blend_func_separate, #endif #ifdef GL_EXT_blend_logic_op &__GLEW_EXT_blend_logic_op, #endif #ifdef GL_EXT_blend_minmax &__GLEW_EXT_blend_minmax, #endif #ifdef GL_EXT_blend_subtract &__GLEW_EXT_blend_subtract, #endif #ifdef GL_EXT_buffer_storage &__GLEW_EXT_buffer_storage, #endif #ifdef GL_EXT_clear_texture &__GLEW_EXT_clear_texture, #endif #ifdef GL_EXT_clip_cull_distance &__GLEW_EXT_clip_cull_distance, #endif #ifdef GL_EXT_clip_volume_hint &__GLEW_EXT_clip_volume_hint, #endif #ifdef GL_EXT_cmyka &__GLEW_EXT_cmyka, #endif #ifdef GL_EXT_color_buffer_float &__GLEW_EXT_color_buffer_float, #endif #ifdef GL_EXT_color_buffer_half_float &__GLEW_EXT_color_buffer_half_float, #endif #ifdef GL_EXT_color_subtable &__GLEW_EXT_color_subtable, #endif #ifdef GL_EXT_compiled_vertex_array &__GLEW_EXT_compiled_vertex_array, #endif #ifdef GL_EXT_compressed_ETC1_RGB8_sub_texture &__GLEW_EXT_compressed_ETC1_RGB8_sub_texture, #endif #ifdef GL_EXT_conservative_depth &__GLEW_EXT_conservative_depth, #endif #ifdef GL_EXT_convolution &__GLEW_EXT_convolution, #endif #ifdef GL_EXT_coordinate_frame &__GLEW_EXT_coordinate_frame, #endif #ifdef GL_EXT_copy_image &__GLEW_EXT_copy_image, #endif #ifdef GL_EXT_copy_texture &__GLEW_EXT_copy_texture, #endif #ifdef GL_EXT_cull_vertex &__GLEW_EXT_cull_vertex, #endif #ifdef GL_EXT_debug_label &__GLEW_EXT_debug_label, #endif #ifdef GL_EXT_debug_marker &__GLEW_EXT_debug_marker, #endif #ifdef GL_EXT_depth_bounds_test &__GLEW_EXT_depth_bounds_test, #endif #ifdef GL_EXT_direct_state_access &__GLEW_EXT_direct_state_access, #endif #ifdef GL_EXT_discard_framebuffer &__GLEW_EXT_discard_framebuffer, #endif #ifdef GL_EXT_draw_buffers &__GLEW_EXT_draw_buffers, #endif #ifdef GL_EXT_draw_buffers2 &__GLEW_EXT_draw_buffers2, #endif #ifdef GL_EXT_draw_buffers_indexed &__GLEW_EXT_draw_buffers_indexed, #endif #ifdef GL_EXT_draw_elements_base_vertex &__GLEW_EXT_draw_elements_base_vertex, #endif #ifdef GL_EXT_draw_instanced &__GLEW_EXT_draw_instanced, #endif #ifdef GL_EXT_draw_range_elements &__GLEW_EXT_draw_range_elements, #endif #ifdef GL_EXT_external_buffer &__GLEW_EXT_external_buffer, #endif #ifdef GL_EXT_float_blend &__GLEW_EXT_float_blend, #endif #ifdef GL_EXT_fog_coord &__GLEW_EXT_fog_coord, #endif #ifdef GL_EXT_frag_depth &__GLEW_EXT_frag_depth, #endif #ifdef GL_EXT_fragment_lighting &__GLEW_EXT_fragment_lighting, #endif #ifdef GL_EXT_framebuffer_blit &__GLEW_EXT_framebuffer_blit, #endif #ifdef GL_EXT_framebuffer_multisample &__GLEW_EXT_framebuffer_multisample, #endif #ifdef GL_EXT_framebuffer_multisample_blit_scaled &__GLEW_EXT_framebuffer_multisample_blit_scaled, #endif #ifdef GL_EXT_framebuffer_object &__GLEW_EXT_framebuffer_object, #endif #ifdef GL_EXT_framebuffer_sRGB &__GLEW_EXT_framebuffer_sRGB, #endif #ifdef GL_EXT_geometry_point_size &__GLEW_EXT_geometry_point_size, #endif #ifdef GL_EXT_geometry_shader &__GLEW_EXT_geometry_shader, #endif #ifdef GL_EXT_geometry_shader4 &__GLEW_EXT_geometry_shader4, #endif #ifdef GL_EXT_gpu_program_parameters &__GLEW_EXT_gpu_program_parameters, #endif #ifdef GL_EXT_gpu_shader4 &__GLEW_EXT_gpu_shader4, #endif #ifdef GL_EXT_gpu_shader5 &__GLEW_EXT_gpu_shader5, #endif #ifdef GL_EXT_histogram &__GLEW_EXT_histogram, #endif #ifdef GL_EXT_index_array_formats &__GLEW_EXT_index_array_formats, #endif #ifdef GL_EXT_index_func &__GLEW_EXT_index_func, #endif #ifdef GL_EXT_index_material &__GLEW_EXT_index_material, #endif #ifdef GL_EXT_index_texture &__GLEW_EXT_index_texture, #endif #ifdef GL_EXT_instanced_arrays &__GLEW_EXT_instanced_arrays, #endif #ifdef GL_EXT_light_texture &__GLEW_EXT_light_texture, #endif #ifdef GL_EXT_map_buffer_range &__GLEW_EXT_map_buffer_range, #endif #ifdef GL_EXT_memory_object &__GLEW_EXT_memory_object, #endif #ifdef GL_EXT_memory_object_fd &__GLEW_EXT_memory_object_fd, #endif #ifdef GL_EXT_memory_object_win32 &__GLEW_EXT_memory_object_win32, #endif #ifdef GL_EXT_misc_attribute &__GLEW_EXT_misc_attribute, #endif #ifdef GL_EXT_multi_draw_arrays &__GLEW_EXT_multi_draw_arrays, #endif #ifdef GL_EXT_multi_draw_indirect &__GLEW_EXT_multi_draw_indirect, #endif #ifdef GL_EXT_multiple_textures &__GLEW_EXT_multiple_textures, #endif #ifdef GL_EXT_multisample &__GLEW_EXT_multisample, #endif #ifdef GL_EXT_multisample_compatibility &__GLEW_EXT_multisample_compatibility, #endif #ifdef GL_EXT_multisampled_render_to_texture &__GLEW_EXT_multisampled_render_to_texture, #endif #ifdef GL_EXT_multisampled_render_to_texture2 &__GLEW_EXT_multisampled_render_to_texture2, #endif #ifdef GL_EXT_multiview_draw_buffers &__GLEW_EXT_multiview_draw_buffers, #endif #ifdef GL_EXT_packed_depth_stencil &__GLEW_EXT_packed_depth_stencil, #endif #ifdef GL_EXT_packed_float &__GLEW_EXT_packed_float, #endif #ifdef GL_EXT_packed_pixels &__GLEW_EXT_packed_pixels, #endif #ifdef GL_EXT_paletted_texture &__GLEW_EXT_paletted_texture, #endif #ifdef GL_EXT_pixel_buffer_object &__GLEW_EXT_pixel_buffer_object, #endif #ifdef GL_EXT_pixel_transform &__GLEW_EXT_pixel_transform, #endif #ifdef GL_EXT_pixel_transform_color_table &__GLEW_EXT_pixel_transform_color_table, #endif #ifdef GL_EXT_point_parameters &__GLEW_EXT_point_parameters, #endif #ifdef GL_EXT_polygon_offset &__GLEW_EXT_polygon_offset, #endif #ifdef GL_EXT_polygon_offset_clamp &__GLEW_EXT_polygon_offset_clamp, #endif #ifdef GL_EXT_post_depth_coverage &__GLEW_EXT_post_depth_coverage, #endif #ifdef GL_EXT_provoking_vertex &__GLEW_EXT_provoking_vertex, #endif #ifdef GL_EXT_pvrtc_sRGB &__GLEW_EXT_pvrtc_sRGB, #endif #ifdef GL_EXT_raster_multisample &__GLEW_EXT_raster_multisample, #endif #ifdef GL_EXT_read_format_bgra &__GLEW_EXT_read_format_bgra, #endif #ifdef GL_EXT_render_snorm &__GLEW_EXT_render_snorm, #endif #ifdef GL_EXT_rescale_normal &__GLEW_EXT_rescale_normal, #endif #ifdef GL_EXT_sRGB &__GLEW_EXT_sRGB, #endif #ifdef GL_EXT_sRGB_write_control &__GLEW_EXT_sRGB_write_control, #endif #ifdef GL_EXT_scene_marker &__GLEW_EXT_scene_marker, #endif #ifdef GL_EXT_secondary_color &__GLEW_EXT_secondary_color, #endif #ifdef GL_EXT_semaphore &__GLEW_EXT_semaphore, #endif #ifdef GL_EXT_semaphore_fd &__GLEW_EXT_semaphore_fd, #endif #ifdef GL_EXT_semaphore_win32 &__GLEW_EXT_semaphore_win32, #endif #ifdef GL_EXT_separate_shader_objects &__GLEW_EXT_separate_shader_objects, #endif #ifdef GL_EXT_separate_specular_color &__GLEW_EXT_separate_specular_color, #endif #ifdef GL_EXT_shader_framebuffer_fetch &__GLEW_EXT_shader_framebuffer_fetch, #endif #ifdef GL_EXT_shader_group_vote &__GLEW_EXT_shader_group_vote, #endif #ifdef GL_EXT_shader_image_load_formatted &__GLEW_EXT_shader_image_load_formatted, #endif #ifdef GL_EXT_shader_image_load_store &__GLEW_EXT_shader_image_load_store, #endif #ifdef GL_EXT_shader_implicit_conversions &__GLEW_EXT_shader_implicit_conversions, #endif #ifdef GL_EXT_shader_integer_mix &__GLEW_EXT_shader_integer_mix, #endif #ifdef GL_EXT_shader_io_blocks &__GLEW_EXT_shader_io_blocks, #endif #ifdef GL_EXT_shader_non_constant_global_initializers &__GLEW_EXT_shader_non_constant_global_initializers, #endif #ifdef GL_EXT_shader_pixel_local_storage &__GLEW_EXT_shader_pixel_local_storage, #endif #ifdef GL_EXT_shader_pixel_local_storage2 &__GLEW_EXT_shader_pixel_local_storage2, #endif #ifdef GL_EXT_shader_texture_lod &__GLEW_EXT_shader_texture_lod, #endif #ifdef GL_EXT_shadow_funcs &__GLEW_EXT_shadow_funcs, #endif #ifdef GL_EXT_shadow_samplers &__GLEW_EXT_shadow_samplers, #endif #ifdef GL_EXT_shared_texture_palette &__GLEW_EXT_shared_texture_palette, #endif #ifdef GL_EXT_sparse_texture &__GLEW_EXT_sparse_texture, #endif #ifdef GL_EXT_sparse_texture2 &__GLEW_EXT_sparse_texture2, #endif #ifdef GL_EXT_stencil_clear_tag &__GLEW_EXT_stencil_clear_tag, #endif #ifdef GL_EXT_stencil_two_side &__GLEW_EXT_stencil_two_side, #endif #ifdef GL_EXT_stencil_wrap &__GLEW_EXT_stencil_wrap, #endif #ifdef GL_EXT_subtexture &__GLEW_EXT_subtexture, #endif #ifdef GL_EXT_texture &__GLEW_EXT_texture, #endif #ifdef GL_EXT_texture3D &__GLEW_EXT_texture3D, #endif #ifdef GL_EXT_texture_array &__GLEW_EXT_texture_array, #endif #ifdef GL_EXT_texture_buffer_object &__GLEW_EXT_texture_buffer_object, #endif #ifdef GL_EXT_texture_compression_astc_decode_mode &__GLEW_EXT_texture_compression_astc_decode_mode, #endif #ifdef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 &__GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5, #endif #ifdef GL_EXT_texture_compression_bptc &__GLEW_EXT_texture_compression_bptc, #endif #ifdef GL_EXT_texture_compression_dxt1 &__GLEW_EXT_texture_compression_dxt1, #endif #ifdef GL_EXT_texture_compression_latc &__GLEW_EXT_texture_compression_latc, #endif #ifdef GL_EXT_texture_compression_rgtc &__GLEW_EXT_texture_compression_rgtc, #endif #ifdef GL_EXT_texture_compression_s3tc &__GLEW_EXT_texture_compression_s3tc, #endif #ifdef GL_EXT_texture_cube_map &__GLEW_EXT_texture_cube_map, #endif #ifdef GL_EXT_texture_cube_map_array &__GLEW_EXT_texture_cube_map_array, #endif #ifdef GL_EXT_texture_edge_clamp &__GLEW_EXT_texture_edge_clamp, #endif #ifdef GL_EXT_texture_env &__GLEW_EXT_texture_env, #endif #ifdef GL_EXT_texture_env_add &__GLEW_EXT_texture_env_add, #endif #ifdef GL_EXT_texture_env_combine &__GLEW_EXT_texture_env_combine, #endif #ifdef GL_EXT_texture_env_dot3 &__GLEW_EXT_texture_env_dot3, #endif #ifdef GL_EXT_texture_filter_anisotropic &__GLEW_EXT_texture_filter_anisotropic, #endif #ifdef GL_EXT_texture_filter_minmax &__GLEW_EXT_texture_filter_minmax, #endif #ifdef GL_EXT_texture_format_BGRA8888 &__GLEW_EXT_texture_format_BGRA8888, #endif #ifdef GL_EXT_texture_integer &__GLEW_EXT_texture_integer, #endif #ifdef GL_EXT_texture_lod_bias &__GLEW_EXT_texture_lod_bias, #endif #ifdef GL_EXT_texture_mirror_clamp &__GLEW_EXT_texture_mirror_clamp, #endif #ifdef GL_EXT_texture_norm16 &__GLEW_EXT_texture_norm16, #endif #ifdef GL_EXT_texture_object &__GLEW_EXT_texture_object, #endif #ifdef GL_EXT_texture_perturb_normal &__GLEW_EXT_texture_perturb_normal, #endif #ifdef GL_EXT_texture_rectangle &__GLEW_EXT_texture_rectangle, #endif #ifdef GL_EXT_texture_rg &__GLEW_EXT_texture_rg, #endif #ifdef GL_EXT_texture_sRGB &__GLEW_EXT_texture_sRGB, #endif #ifdef GL_EXT_texture_sRGB_R8 &__GLEW_EXT_texture_sRGB_R8, #endif #ifdef GL_EXT_texture_sRGB_RG8 &__GLEW_EXT_texture_sRGB_RG8, #endif #ifdef GL_EXT_texture_sRGB_decode &__GLEW_EXT_texture_sRGB_decode, #endif #ifdef GL_EXT_texture_shared_exponent &__GLEW_EXT_texture_shared_exponent, #endif #ifdef GL_EXT_texture_snorm &__GLEW_EXT_texture_snorm, #endif #ifdef GL_EXT_texture_storage &__GLEW_EXT_texture_storage, #endif #ifdef GL_EXT_texture_swizzle &__GLEW_EXT_texture_swizzle, #endif #ifdef GL_EXT_texture_type_2_10_10_10_REV &__GLEW_EXT_texture_type_2_10_10_10_REV, #endif #ifdef GL_EXT_texture_view &__GLEW_EXT_texture_view, #endif #ifdef GL_EXT_timer_query &__GLEW_EXT_timer_query, #endif #ifdef GL_EXT_transform_feedback &__GLEW_EXT_transform_feedback, #endif #ifdef GL_EXT_unpack_subimage &__GLEW_EXT_unpack_subimage, #endif #ifdef GL_EXT_vertex_array &__GLEW_EXT_vertex_array, #endif #ifdef GL_EXT_vertex_array_bgra &__GLEW_EXT_vertex_array_bgra, #endif #ifdef GL_EXT_vertex_array_setXXX &__GLEW_EXT_vertex_array_setXXX, #endif #ifdef GL_EXT_vertex_attrib_64bit &__GLEW_EXT_vertex_attrib_64bit, #endif #ifdef GL_EXT_vertex_shader &__GLEW_EXT_vertex_shader, #endif #ifdef GL_EXT_vertex_weighting &__GLEW_EXT_vertex_weighting, #endif #ifdef GL_EXT_win32_keyed_mutex &__GLEW_EXT_win32_keyed_mutex, #endif #ifdef GL_EXT_window_rectangles &__GLEW_EXT_window_rectangles, #endif #ifdef GL_EXT_x11_sync_object &__GLEW_EXT_x11_sync_object, #endif #ifdef GL_GREMEDY_frame_terminator &__GLEW_GREMEDY_frame_terminator, #endif #ifdef GL_GREMEDY_string_marker &__GLEW_GREMEDY_string_marker, #endif #ifdef GL_HP_convolution_border_modes &__GLEW_HP_convolution_border_modes, #endif #ifdef GL_HP_image_transform &__GLEW_HP_image_transform, #endif #ifdef GL_HP_occlusion_test &__GLEW_HP_occlusion_test, #endif #ifdef GL_HP_texture_lighting &__GLEW_HP_texture_lighting, #endif #ifdef GL_IBM_cull_vertex &__GLEW_IBM_cull_vertex, #endif #ifdef GL_IBM_multimode_draw_arrays &__GLEW_IBM_multimode_draw_arrays, #endif #ifdef GL_IBM_rasterpos_clip &__GLEW_IBM_rasterpos_clip, #endif #ifdef GL_IBM_static_data &__GLEW_IBM_static_data, #endif #ifdef GL_IBM_texture_mirrored_repeat &__GLEW_IBM_texture_mirrored_repeat, #endif #ifdef GL_IBM_vertex_array_lists &__GLEW_IBM_vertex_array_lists, #endif #ifdef GL_INGR_color_clamp &__GLEW_INGR_color_clamp, #endif #ifdef GL_INGR_interlace_read &__GLEW_INGR_interlace_read, #endif #ifdef GL_INTEL_conservative_rasterization &__GLEW_INTEL_conservative_rasterization, #endif #ifdef GL_INTEL_fragment_shader_ordering &__GLEW_INTEL_fragment_shader_ordering, #endif #ifdef GL_INTEL_framebuffer_CMAA &__GLEW_INTEL_framebuffer_CMAA, #endif #ifdef GL_INTEL_map_texture &__GLEW_INTEL_map_texture, #endif #ifdef GL_INTEL_parallel_arrays &__GLEW_INTEL_parallel_arrays, #endif #ifdef GL_INTEL_performance_query &__GLEW_INTEL_performance_query, #endif #ifdef GL_INTEL_texture_scissor &__GLEW_INTEL_texture_scissor, #endif #ifdef GL_KHR_blend_equation_advanced &__GLEW_KHR_blend_equation_advanced, #endif #ifdef GL_KHR_blend_equation_advanced_coherent &__GLEW_KHR_blend_equation_advanced_coherent, #endif #ifdef GL_KHR_context_flush_control &__GLEW_KHR_context_flush_control, #endif #ifdef GL_KHR_debug &__GLEW_KHR_debug, #endif #ifdef GL_KHR_no_error &__GLEW_KHR_no_error, #endif #ifdef GL_KHR_parallel_shader_compile &__GLEW_KHR_parallel_shader_compile, #endif #ifdef GL_KHR_robust_buffer_access_behavior &__GLEW_KHR_robust_buffer_access_behavior, #endif #ifdef GL_KHR_robustness &__GLEW_KHR_robustness, #endif #ifdef GL_KHR_texture_compression_astc_hdr &__GLEW_KHR_texture_compression_astc_hdr, #endif #ifdef GL_KHR_texture_compression_astc_ldr &__GLEW_KHR_texture_compression_astc_ldr, #endif #ifdef GL_KHR_texture_compression_astc_sliced_3d &__GLEW_KHR_texture_compression_astc_sliced_3d, #endif #ifdef GL_KTX_buffer_region &__GLEW_KTX_buffer_region, #endif #ifdef GL_MESAX_texture_stack &__GLEW_MESAX_texture_stack, #endif #ifdef GL_MESA_pack_invert &__GLEW_MESA_pack_invert, #endif #ifdef GL_MESA_resize_buffers &__GLEW_MESA_resize_buffers, #endif #ifdef GL_MESA_shader_integer_functions &__GLEW_MESA_shader_integer_functions, #endif #ifdef GL_MESA_window_pos &__GLEW_MESA_window_pos, #endif #ifdef GL_MESA_ycbcr_texture &__GLEW_MESA_ycbcr_texture, #endif #ifdef GL_NVX_blend_equation_advanced_multi_draw_buffers &__GLEW_NVX_blend_equation_advanced_multi_draw_buffers, #endif #ifdef GL_NVX_conditional_render &__GLEW_NVX_conditional_render, #endif #ifdef GL_NVX_gpu_memory_info &__GLEW_NVX_gpu_memory_info, #endif #ifdef GL_NVX_linked_gpu_multicast &__GLEW_NVX_linked_gpu_multicast, #endif #ifdef GL_NV_3dvision_settings &__GLEW_NV_3dvision_settings, #endif #ifdef GL_NV_EGL_stream_consumer_external &__GLEW_NV_EGL_stream_consumer_external, #endif #ifdef GL_NV_alpha_to_coverage_dither_control &__GLEW_NV_alpha_to_coverage_dither_control, #endif #ifdef GL_NV_bgr &__GLEW_NV_bgr, #endif #ifdef GL_NV_bindless_multi_draw_indirect &__GLEW_NV_bindless_multi_draw_indirect, #endif #ifdef GL_NV_bindless_multi_draw_indirect_count &__GLEW_NV_bindless_multi_draw_indirect_count, #endif #ifdef GL_NV_bindless_texture &__GLEW_NV_bindless_texture, #endif #ifdef GL_NV_blend_equation_advanced &__GLEW_NV_blend_equation_advanced, #endif #ifdef GL_NV_blend_equation_advanced_coherent &__GLEW_NV_blend_equation_advanced_coherent, #endif #ifdef GL_NV_blend_minmax_factor &__GLEW_NV_blend_minmax_factor, #endif #ifdef GL_NV_blend_square &__GLEW_NV_blend_square, #endif #ifdef GL_NV_clip_space_w_scaling &__GLEW_NV_clip_space_w_scaling, #endif #ifdef GL_NV_command_list &__GLEW_NV_command_list, #endif #ifdef GL_NV_compute_program5 &__GLEW_NV_compute_program5, #endif #ifdef GL_NV_conditional_render &__GLEW_NV_conditional_render, #endif #ifdef GL_NV_conservative_raster &__GLEW_NV_conservative_raster, #endif #ifdef GL_NV_conservative_raster_dilate &__GLEW_NV_conservative_raster_dilate, #endif #ifdef GL_NV_conservative_raster_pre_snap_triangles &__GLEW_NV_conservative_raster_pre_snap_triangles, #endif #ifdef GL_NV_copy_buffer &__GLEW_NV_copy_buffer, #endif #ifdef GL_NV_copy_depth_to_color &__GLEW_NV_copy_depth_to_color, #endif #ifdef GL_NV_copy_image &__GLEW_NV_copy_image, #endif #ifdef GL_NV_deep_texture3D &__GLEW_NV_deep_texture3D, #endif #ifdef GL_NV_depth_buffer_float &__GLEW_NV_depth_buffer_float, #endif #ifdef GL_NV_depth_clamp &__GLEW_NV_depth_clamp, #endif #ifdef GL_NV_depth_range_unclamped &__GLEW_NV_depth_range_unclamped, #endif #ifdef GL_NV_draw_buffers &__GLEW_NV_draw_buffers, #endif #ifdef GL_NV_draw_instanced &__GLEW_NV_draw_instanced, #endif #ifdef GL_NV_draw_texture &__GLEW_NV_draw_texture, #endif #ifdef GL_NV_draw_vulkan_image &__GLEW_NV_draw_vulkan_image, #endif #ifdef GL_NV_evaluators &__GLEW_NV_evaluators, #endif #ifdef GL_NV_explicit_attrib_location &__GLEW_NV_explicit_attrib_location, #endif #ifdef GL_NV_explicit_multisample &__GLEW_NV_explicit_multisample, #endif #ifdef GL_NV_fbo_color_attachments &__GLEW_NV_fbo_color_attachments, #endif #ifdef GL_NV_fence &__GLEW_NV_fence, #endif #ifdef GL_NV_fill_rectangle &__GLEW_NV_fill_rectangle, #endif #ifdef GL_NV_float_buffer &__GLEW_NV_float_buffer, #endif #ifdef GL_NV_fog_distance &__GLEW_NV_fog_distance, #endif #ifdef GL_NV_fragment_coverage_to_color &__GLEW_NV_fragment_coverage_to_color, #endif #ifdef GL_NV_fragment_program &__GLEW_NV_fragment_program, #endif #ifdef GL_NV_fragment_program2 &__GLEW_NV_fragment_program2, #endif #ifdef GL_NV_fragment_program4 &__GLEW_NV_fragment_program4, #endif #ifdef GL_NV_fragment_program_option &__GLEW_NV_fragment_program_option, #endif #ifdef GL_NV_fragment_shader_interlock &__GLEW_NV_fragment_shader_interlock, #endif #ifdef GL_NV_framebuffer_blit &__GLEW_NV_framebuffer_blit, #endif #ifdef GL_NV_framebuffer_mixed_samples &__GLEW_NV_framebuffer_mixed_samples, #endif #ifdef GL_NV_framebuffer_multisample &__GLEW_NV_framebuffer_multisample, #endif #ifdef GL_NV_framebuffer_multisample_coverage &__GLEW_NV_framebuffer_multisample_coverage, #endif #ifdef GL_NV_generate_mipmap_sRGB &__GLEW_NV_generate_mipmap_sRGB, #endif #ifdef GL_NV_geometry_program4 &__GLEW_NV_geometry_program4, #endif #ifdef GL_NV_geometry_shader4 &__GLEW_NV_geometry_shader4, #endif #ifdef GL_NV_geometry_shader_passthrough &__GLEW_NV_geometry_shader_passthrough, #endif #ifdef GL_NV_gpu_multicast &__GLEW_NV_gpu_multicast, #endif #ifdef GL_NV_gpu_program4 &__GLEW_NV_gpu_program4, #endif #ifdef GL_NV_gpu_program5 &__GLEW_NV_gpu_program5, #endif #ifdef GL_NV_gpu_program5_mem_extended &__GLEW_NV_gpu_program5_mem_extended, #endif #ifdef GL_NV_gpu_program_fp64 &__GLEW_NV_gpu_program_fp64, #endif #ifdef GL_NV_gpu_shader5 &__GLEW_NV_gpu_shader5, #endif #ifdef GL_NV_half_float &__GLEW_NV_half_float, #endif #ifdef GL_NV_image_formats &__GLEW_NV_image_formats, #endif #ifdef GL_NV_instanced_arrays &__GLEW_NV_instanced_arrays, #endif #ifdef GL_NV_internalformat_sample_query &__GLEW_NV_internalformat_sample_query, #endif #ifdef GL_NV_light_max_exponent &__GLEW_NV_light_max_exponent, #endif #ifdef GL_NV_multisample_coverage &__GLEW_NV_multisample_coverage, #endif #ifdef GL_NV_multisample_filter_hint &__GLEW_NV_multisample_filter_hint, #endif #ifdef GL_NV_non_square_matrices &__GLEW_NV_non_square_matrices, #endif #ifdef GL_NV_occlusion_query &__GLEW_NV_occlusion_query, #endif #ifdef GL_NV_pack_subimage &__GLEW_NV_pack_subimage, #endif #ifdef GL_NV_packed_depth_stencil &__GLEW_NV_packed_depth_stencil, #endif #ifdef GL_NV_packed_float &__GLEW_NV_packed_float, #endif #ifdef GL_NV_packed_float_linear &__GLEW_NV_packed_float_linear, #endif #ifdef GL_NV_parameter_buffer_object &__GLEW_NV_parameter_buffer_object, #endif #ifdef GL_NV_parameter_buffer_object2 &__GLEW_NV_parameter_buffer_object2, #endif #ifdef GL_NV_path_rendering &__GLEW_NV_path_rendering, #endif #ifdef GL_NV_path_rendering_shared_edge &__GLEW_NV_path_rendering_shared_edge, #endif #ifdef GL_NV_pixel_buffer_object &__GLEW_NV_pixel_buffer_object, #endif #ifdef GL_NV_pixel_data_range &__GLEW_NV_pixel_data_range, #endif #ifdef GL_NV_platform_binary &__GLEW_NV_platform_binary, #endif #ifdef GL_NV_point_sprite &__GLEW_NV_point_sprite, #endif #ifdef GL_NV_polygon_mode &__GLEW_NV_polygon_mode, #endif #ifdef GL_NV_present_video &__GLEW_NV_present_video, #endif #ifdef GL_NV_primitive_restart &__GLEW_NV_primitive_restart, #endif #ifdef GL_NV_read_depth &__GLEW_NV_read_depth, #endif #ifdef GL_NV_read_depth_stencil &__GLEW_NV_read_depth_stencil, #endif #ifdef GL_NV_read_stencil &__GLEW_NV_read_stencil, #endif #ifdef GL_NV_register_combiners &__GLEW_NV_register_combiners, #endif #ifdef GL_NV_register_combiners2 &__GLEW_NV_register_combiners2, #endif #ifdef GL_NV_robustness_video_memory_purge &__GLEW_NV_robustness_video_memory_purge, #endif #ifdef GL_NV_sRGB_formats &__GLEW_NV_sRGB_formats, #endif #ifdef GL_NV_sample_locations &__GLEW_NV_sample_locations, #endif #ifdef GL_NV_sample_mask_override_coverage &__GLEW_NV_sample_mask_override_coverage, #endif #ifdef GL_NV_shader_atomic_counters &__GLEW_NV_shader_atomic_counters, #endif #ifdef GL_NV_shader_atomic_float &__GLEW_NV_shader_atomic_float, #endif #ifdef GL_NV_shader_atomic_float64 &__GLEW_NV_shader_atomic_float64, #endif #ifdef GL_NV_shader_atomic_fp16_vector &__GLEW_NV_shader_atomic_fp16_vector, #endif #ifdef GL_NV_shader_atomic_int64 &__GLEW_NV_shader_atomic_int64, #endif #ifdef GL_NV_shader_buffer_load &__GLEW_NV_shader_buffer_load, #endif #ifdef GL_NV_shader_noperspective_interpolation &__GLEW_NV_shader_noperspective_interpolation, #endif #ifdef GL_NV_shader_storage_buffer_object &__GLEW_NV_shader_storage_buffer_object, #endif #ifdef GL_NV_shader_thread_group &__GLEW_NV_shader_thread_group, #endif #ifdef GL_NV_shader_thread_shuffle &__GLEW_NV_shader_thread_shuffle, #endif #ifdef GL_NV_shadow_samplers_array &__GLEW_NV_shadow_samplers_array, #endif #ifdef GL_NV_shadow_samplers_cube &__GLEW_NV_shadow_samplers_cube, #endif #ifdef GL_NV_stereo_view_rendering &__GLEW_NV_stereo_view_rendering, #endif #ifdef GL_NV_tessellation_program5 &__GLEW_NV_tessellation_program5, #endif #ifdef GL_NV_texgen_emboss &__GLEW_NV_texgen_emboss, #endif #ifdef GL_NV_texgen_reflection &__GLEW_NV_texgen_reflection, #endif #ifdef GL_NV_texture_array &__GLEW_NV_texture_array, #endif #ifdef GL_NV_texture_barrier &__GLEW_NV_texture_barrier, #endif #ifdef GL_NV_texture_border_clamp &__GLEW_NV_texture_border_clamp, #endif #ifdef GL_NV_texture_compression_latc &__GLEW_NV_texture_compression_latc, #endif #ifdef GL_NV_texture_compression_s3tc &__GLEW_NV_texture_compression_s3tc, #endif #ifdef GL_NV_texture_compression_s3tc_update &__GLEW_NV_texture_compression_s3tc_update, #endif #ifdef GL_NV_texture_compression_vtc &__GLEW_NV_texture_compression_vtc, #endif #ifdef GL_NV_texture_env_combine4 &__GLEW_NV_texture_env_combine4, #endif #ifdef GL_NV_texture_expand_normal &__GLEW_NV_texture_expand_normal, #endif #ifdef GL_NV_texture_multisample &__GLEW_NV_texture_multisample, #endif #ifdef GL_NV_texture_npot_2D_mipmap &__GLEW_NV_texture_npot_2D_mipmap, #endif #ifdef GL_NV_texture_rectangle &__GLEW_NV_texture_rectangle, #endif #ifdef GL_NV_texture_rectangle_compressed &__GLEW_NV_texture_rectangle_compressed, #endif #ifdef GL_NV_texture_shader &__GLEW_NV_texture_shader, #endif #ifdef GL_NV_texture_shader2 &__GLEW_NV_texture_shader2, #endif #ifdef GL_NV_texture_shader3 &__GLEW_NV_texture_shader3, #endif #ifdef GL_NV_transform_feedback &__GLEW_NV_transform_feedback, #endif #ifdef GL_NV_transform_feedback2 &__GLEW_NV_transform_feedback2, #endif #ifdef GL_NV_uniform_buffer_unified_memory &__GLEW_NV_uniform_buffer_unified_memory, #endif #ifdef GL_NV_vdpau_interop &__GLEW_NV_vdpau_interop, #endif #ifdef GL_NV_vertex_array_range &__GLEW_NV_vertex_array_range, #endif #ifdef GL_NV_vertex_array_range2 &__GLEW_NV_vertex_array_range2, #endif #ifdef GL_NV_vertex_attrib_integer_64bit &__GLEW_NV_vertex_attrib_integer_64bit, #endif #ifdef GL_NV_vertex_buffer_unified_memory &__GLEW_NV_vertex_buffer_unified_memory, #endif #ifdef GL_NV_vertex_program &__GLEW_NV_vertex_program, #endif #ifdef GL_NV_vertex_program1_1 &__GLEW_NV_vertex_program1_1, #endif #ifdef GL_NV_vertex_program2 &__GLEW_NV_vertex_program2, #endif #ifdef GL_NV_vertex_program2_option &__GLEW_NV_vertex_program2_option, #endif #ifdef GL_NV_vertex_program3 &__GLEW_NV_vertex_program3, #endif #ifdef GL_NV_vertex_program4 &__GLEW_NV_vertex_program4, #endif #ifdef GL_NV_video_capture &__GLEW_NV_video_capture, #endif #ifdef GL_NV_viewport_array &__GLEW_NV_viewport_array, #endif #ifdef GL_NV_viewport_array2 &__GLEW_NV_viewport_array2, #endif #ifdef GL_NV_viewport_swizzle &__GLEW_NV_viewport_swizzle, #endif #ifdef GL_OES_byte_coordinates &__GLEW_OES_byte_coordinates, #endif #ifdef GL_OML_interlace &__GLEW_OML_interlace, #endif #ifdef GL_OML_resample &__GLEW_OML_resample, #endif #ifdef GL_OML_subsample &__GLEW_OML_subsample, #endif #ifdef GL_OVR_multiview &__GLEW_OVR_multiview, #endif #ifdef GL_OVR_multiview2 &__GLEW_OVR_multiview2, #endif #ifdef GL_OVR_multiview_multisampled_render_to_texture &__GLEW_OVR_multiview_multisampled_render_to_texture, #endif #ifdef GL_PGI_misc_hints &__GLEW_PGI_misc_hints, #endif #ifdef GL_PGI_vertex_hints &__GLEW_PGI_vertex_hints, #endif #ifdef GL_QCOM_alpha_test &__GLEW_QCOM_alpha_test, #endif #ifdef GL_QCOM_binning_control &__GLEW_QCOM_binning_control, #endif #ifdef GL_QCOM_driver_control &__GLEW_QCOM_driver_control, #endif #ifdef GL_QCOM_extended_get &__GLEW_QCOM_extended_get, #endif #ifdef GL_QCOM_extended_get2 &__GLEW_QCOM_extended_get2, #endif #ifdef GL_QCOM_framebuffer_foveated &__GLEW_QCOM_framebuffer_foveated, #endif #ifdef GL_QCOM_perfmon_global_mode &__GLEW_QCOM_perfmon_global_mode, #endif #ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent &__GLEW_QCOM_shader_framebuffer_fetch_noncoherent, #endif #ifdef GL_QCOM_tiled_rendering &__GLEW_QCOM_tiled_rendering, #endif #ifdef GL_QCOM_writeonly_rendering &__GLEW_QCOM_writeonly_rendering, #endif #ifdef GL_REGAL_ES1_0_compatibility &__GLEW_REGAL_ES1_0_compatibility, #endif #ifdef GL_REGAL_ES1_1_compatibility &__GLEW_REGAL_ES1_1_compatibility, #endif #ifdef GL_REGAL_enable &__GLEW_REGAL_enable, #endif #ifdef GL_REGAL_error_string &__GLEW_REGAL_error_string, #endif #ifdef GL_REGAL_extension_query &__GLEW_REGAL_extension_query, #endif #ifdef GL_REGAL_log &__GLEW_REGAL_log, #endif #ifdef GL_REGAL_proc_address &__GLEW_REGAL_proc_address, #endif #ifdef GL_REND_screen_coordinates &__GLEW_REND_screen_coordinates, #endif #ifdef GL_S3_s3tc &__GLEW_S3_s3tc, #endif #ifdef GL_SGIS_clip_band_hint &__GLEW_SGIS_clip_band_hint, #endif #ifdef GL_SGIS_color_range &__GLEW_SGIS_color_range, #endif #ifdef GL_SGIS_detail_texture &__GLEW_SGIS_detail_texture, #endif #ifdef GL_SGIS_fog_function &__GLEW_SGIS_fog_function, #endif #ifdef GL_SGIS_generate_mipmap &__GLEW_SGIS_generate_mipmap, #endif #ifdef GL_SGIS_line_texgen &__GLEW_SGIS_line_texgen, #endif #ifdef GL_SGIS_multisample &__GLEW_SGIS_multisample, #endif #ifdef GL_SGIS_multitexture &__GLEW_SGIS_multitexture, #endif #ifdef GL_SGIS_pixel_texture &__GLEW_SGIS_pixel_texture, #endif #ifdef GL_SGIS_point_line_texgen &__GLEW_SGIS_point_line_texgen, #endif #ifdef GL_SGIS_shared_multisample &__GLEW_SGIS_shared_multisample, #endif #ifdef GL_SGIS_sharpen_texture &__GLEW_SGIS_sharpen_texture, #endif #ifdef GL_SGIS_texture4D &__GLEW_SGIS_texture4D, #endif #ifdef GL_SGIS_texture_border_clamp &__GLEW_SGIS_texture_border_clamp, #endif #ifdef GL_SGIS_texture_edge_clamp &__GLEW_SGIS_texture_edge_clamp, #endif #ifdef GL_SGIS_texture_filter4 &__GLEW_SGIS_texture_filter4, #endif #ifdef GL_SGIS_texture_lod &__GLEW_SGIS_texture_lod, #endif #ifdef GL_SGIS_texture_select &__GLEW_SGIS_texture_select, #endif #ifdef GL_SGIX_async &__GLEW_SGIX_async, #endif #ifdef GL_SGIX_async_histogram &__GLEW_SGIX_async_histogram, #endif #ifdef GL_SGIX_async_pixel &__GLEW_SGIX_async_pixel, #endif #ifdef GL_SGIX_bali_g_instruments &__GLEW_SGIX_bali_g_instruments, #endif #ifdef GL_SGIX_bali_r_instruments &__GLEW_SGIX_bali_r_instruments, #endif #ifdef GL_SGIX_bali_timer_instruments &__GLEW_SGIX_bali_timer_instruments, #endif #ifdef GL_SGIX_blend_alpha_minmax &__GLEW_SGIX_blend_alpha_minmax, #endif #ifdef GL_SGIX_blend_cadd &__GLEW_SGIX_blend_cadd, #endif #ifdef GL_SGIX_blend_cmultiply &__GLEW_SGIX_blend_cmultiply, #endif #ifdef GL_SGIX_calligraphic_fragment &__GLEW_SGIX_calligraphic_fragment, #endif #ifdef GL_SGIX_clipmap &__GLEW_SGIX_clipmap, #endif #ifdef GL_SGIX_color_matrix_accuracy &__GLEW_SGIX_color_matrix_accuracy, #endif #ifdef GL_SGIX_color_table_index_mode &__GLEW_SGIX_color_table_index_mode, #endif #ifdef GL_SGIX_complex_polar &__GLEW_SGIX_complex_polar, #endif #ifdef GL_SGIX_convolution_accuracy &__GLEW_SGIX_convolution_accuracy, #endif #ifdef GL_SGIX_cube_map &__GLEW_SGIX_cube_map, #endif #ifdef GL_SGIX_cylinder_texgen &__GLEW_SGIX_cylinder_texgen, #endif #ifdef GL_SGIX_datapipe &__GLEW_SGIX_datapipe, #endif #ifdef GL_SGIX_decimation &__GLEW_SGIX_decimation, #endif #ifdef GL_SGIX_depth_pass_instrument &__GLEW_SGIX_depth_pass_instrument, #endif #ifdef GL_SGIX_depth_texture &__GLEW_SGIX_depth_texture, #endif #ifdef GL_SGIX_dvc &__GLEW_SGIX_dvc, #endif #ifdef GL_SGIX_flush_raster &__GLEW_SGIX_flush_raster, #endif #ifdef GL_SGIX_fog_blend &__GLEW_SGIX_fog_blend, #endif #ifdef GL_SGIX_fog_factor_to_alpha &__GLEW_SGIX_fog_factor_to_alpha, #endif #ifdef GL_SGIX_fog_layers &__GLEW_SGIX_fog_layers, #endif #ifdef GL_SGIX_fog_offset &__GLEW_SGIX_fog_offset, #endif #ifdef GL_SGIX_fog_patchy &__GLEW_SGIX_fog_patchy, #endif #ifdef GL_SGIX_fog_scale &__GLEW_SGIX_fog_scale, #endif #ifdef GL_SGIX_fog_texture &__GLEW_SGIX_fog_texture, #endif #ifdef GL_SGIX_fragment_lighting_space &__GLEW_SGIX_fragment_lighting_space, #endif #ifdef GL_SGIX_fragment_specular_lighting &__GLEW_SGIX_fragment_specular_lighting, #endif #ifdef GL_SGIX_fragments_instrument &__GLEW_SGIX_fragments_instrument, #endif #ifdef GL_SGIX_framezoom &__GLEW_SGIX_framezoom, #endif #ifdef GL_SGIX_icc_texture &__GLEW_SGIX_icc_texture, #endif #ifdef GL_SGIX_igloo_interface &__GLEW_SGIX_igloo_interface, #endif #ifdef GL_SGIX_image_compression &__GLEW_SGIX_image_compression, #endif #ifdef GL_SGIX_impact_pixel_texture &__GLEW_SGIX_impact_pixel_texture, #endif #ifdef GL_SGIX_instrument_error &__GLEW_SGIX_instrument_error, #endif #ifdef GL_SGIX_interlace &__GLEW_SGIX_interlace, #endif #ifdef GL_SGIX_ir_instrument1 &__GLEW_SGIX_ir_instrument1, #endif #ifdef GL_SGIX_line_quality_hint &__GLEW_SGIX_line_quality_hint, #endif #ifdef GL_SGIX_list_priority &__GLEW_SGIX_list_priority, #endif #ifdef GL_SGIX_mpeg1 &__GLEW_SGIX_mpeg1, #endif #ifdef GL_SGIX_mpeg2 &__GLEW_SGIX_mpeg2, #endif #ifdef GL_SGIX_nonlinear_lighting_pervertex &__GLEW_SGIX_nonlinear_lighting_pervertex, #endif #ifdef GL_SGIX_nurbs_eval &__GLEW_SGIX_nurbs_eval, #endif #ifdef GL_SGIX_occlusion_instrument &__GLEW_SGIX_occlusion_instrument, #endif #ifdef GL_SGIX_packed_6bytes &__GLEW_SGIX_packed_6bytes, #endif #ifdef GL_SGIX_pixel_texture &__GLEW_SGIX_pixel_texture, #endif #ifdef GL_SGIX_pixel_texture_bits &__GLEW_SGIX_pixel_texture_bits, #endif #ifdef GL_SGIX_pixel_texture_lod &__GLEW_SGIX_pixel_texture_lod, #endif #ifdef GL_SGIX_pixel_tiles &__GLEW_SGIX_pixel_tiles, #endif #ifdef GL_SGIX_polynomial_ffd &__GLEW_SGIX_polynomial_ffd, #endif #ifdef GL_SGIX_quad_mesh &__GLEW_SGIX_quad_mesh, #endif #ifdef GL_SGIX_reference_plane &__GLEW_SGIX_reference_plane, #endif #ifdef GL_SGIX_resample &__GLEW_SGIX_resample, #endif #ifdef GL_SGIX_scalebias_hint &__GLEW_SGIX_scalebias_hint, #endif #ifdef GL_SGIX_shadow &__GLEW_SGIX_shadow, #endif #ifdef GL_SGIX_shadow_ambient &__GLEW_SGIX_shadow_ambient, #endif #ifdef GL_SGIX_slim &__GLEW_SGIX_slim, #endif #ifdef GL_SGIX_spotlight_cutoff &__GLEW_SGIX_spotlight_cutoff, #endif #ifdef GL_SGIX_sprite &__GLEW_SGIX_sprite, #endif #ifdef GL_SGIX_subdiv_patch &__GLEW_SGIX_subdiv_patch, #endif #ifdef GL_SGIX_subsample &__GLEW_SGIX_subsample, #endif #ifdef GL_SGIX_tag_sample_buffer &__GLEW_SGIX_tag_sample_buffer, #endif #ifdef GL_SGIX_texture_add_env &__GLEW_SGIX_texture_add_env, #endif #ifdef GL_SGIX_texture_coordinate_clamp &__GLEW_SGIX_texture_coordinate_clamp, #endif #ifdef GL_SGIX_texture_lod_bias &__GLEW_SGIX_texture_lod_bias, #endif #ifdef GL_SGIX_texture_mipmap_anisotropic &__GLEW_SGIX_texture_mipmap_anisotropic, #endif #ifdef GL_SGIX_texture_multi_buffer &__GLEW_SGIX_texture_multi_buffer, #endif #ifdef GL_SGIX_texture_phase &__GLEW_SGIX_texture_phase, #endif #ifdef GL_SGIX_texture_range &__GLEW_SGIX_texture_range, #endif #ifdef GL_SGIX_texture_scale_bias &__GLEW_SGIX_texture_scale_bias, #endif #ifdef GL_SGIX_texture_supersample &__GLEW_SGIX_texture_supersample, #endif #ifdef GL_SGIX_vector_ops &__GLEW_SGIX_vector_ops, #endif #ifdef GL_SGIX_vertex_array_object &__GLEW_SGIX_vertex_array_object, #endif #ifdef GL_SGIX_vertex_preclip &__GLEW_SGIX_vertex_preclip, #endif #ifdef GL_SGIX_vertex_preclip_hint &__GLEW_SGIX_vertex_preclip_hint, #endif #ifdef GL_SGIX_ycrcb &__GLEW_SGIX_ycrcb, #endif #ifdef GL_SGIX_ycrcb_subsample &__GLEW_SGIX_ycrcb_subsample, #endif #ifdef GL_SGIX_ycrcba &__GLEW_SGIX_ycrcba, #endif #ifdef GL_SGI_color_matrix &__GLEW_SGI_color_matrix, #endif #ifdef GL_SGI_color_table &__GLEW_SGI_color_table, #endif #ifdef GL_SGI_complex &__GLEW_SGI_complex, #endif #ifdef GL_SGI_complex_type &__GLEW_SGI_complex_type, #endif #ifdef GL_SGI_fft &__GLEW_SGI_fft, #endif #ifdef GL_SGI_texture_color_table &__GLEW_SGI_texture_color_table, #endif #ifdef GL_SUNX_constant_data &__GLEW_SUNX_constant_data, #endif #ifdef GL_SUN_convolution_border_modes &__GLEW_SUN_convolution_border_modes, #endif #ifdef GL_SUN_global_alpha &__GLEW_SUN_global_alpha, #endif #ifdef GL_SUN_mesh_array &__GLEW_SUN_mesh_array, #endif #ifdef GL_SUN_read_video_pixels &__GLEW_SUN_read_video_pixels, #endif #ifdef GL_SUN_slice_accum &__GLEW_SUN_slice_accum, #endif #ifdef GL_SUN_triangle_list &__GLEW_SUN_triangle_list, #endif #ifdef GL_SUN_vertex &__GLEW_SUN_vertex, #endif #ifdef GL_WIN_phong_shading &__GLEW_WIN_phong_shading, #endif #ifdef GL_WIN_scene_markerXXX &__GLEW_WIN_scene_markerXXX, #endif #ifdef GL_WIN_specular_fog &__GLEW_WIN_specular_fog, #endif #ifdef GL_WIN_swap_hint &__GLEW_WIN_swap_hint, #endif NULL }; static GLboolean _glewInit_GL_VERSION_1_2 (); static GLboolean _glewInit_GL_VERSION_1_3 (); static GLboolean _glewInit_GL_VERSION_1_4 (); static GLboolean _glewInit_GL_VERSION_1_5 (); static GLboolean _glewInit_GL_VERSION_2_0 (); static GLboolean _glewInit_GL_VERSION_2_1 (); static GLboolean _glewInit_GL_VERSION_3_0 (); static GLboolean _glewInit_GL_VERSION_3_1 (); static GLboolean _glewInit_GL_VERSION_3_2 (); static GLboolean _glewInit_GL_VERSION_3_3 (); static GLboolean _glewInit_GL_VERSION_4_0 (); static GLboolean _glewInit_GL_VERSION_4_5 (); static GLboolean _glewInit_GL_VERSION_4_6 (); static GLboolean _glewInit_GL_3DFX_tbuffer (); static GLboolean _glewInit_GL_AMD_debug_output (); static GLboolean _glewInit_GL_AMD_draw_buffers_blend (); static GLboolean _glewInit_GL_AMD_framebuffer_sample_positions (); static GLboolean _glewInit_GL_AMD_interleaved_elements (); static GLboolean _glewInit_GL_AMD_multi_draw_indirect (); static GLboolean _glewInit_GL_AMD_name_gen_delete (); static GLboolean _glewInit_GL_AMD_occlusion_query_event (); static GLboolean _glewInit_GL_AMD_performance_monitor (); static GLboolean _glewInit_GL_AMD_sample_positions (); static GLboolean _glewInit_GL_AMD_sparse_texture (); static GLboolean _glewInit_GL_AMD_stencil_operation_extended (); static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator (); static GLboolean _glewInit_GL_ANGLE_framebuffer_blit (); static GLboolean _glewInit_GL_ANGLE_framebuffer_multisample (); static GLboolean _glewInit_GL_ANGLE_instanced_arrays (); static GLboolean _glewInit_GL_ANGLE_timer_query (); static GLboolean _glewInit_GL_ANGLE_translated_shader_source (); static GLboolean _glewInit_GL_APPLE_copy_texture_levels (); static GLboolean _glewInit_GL_APPLE_element_array (); static GLboolean _glewInit_GL_APPLE_fence (); static GLboolean _glewInit_GL_APPLE_flush_buffer_range (); static GLboolean _glewInit_GL_APPLE_framebuffer_multisample (); static GLboolean _glewInit_GL_APPLE_object_purgeable (); static GLboolean _glewInit_GL_APPLE_sync (); static GLboolean _glewInit_GL_APPLE_texture_range (); static GLboolean _glewInit_GL_APPLE_vertex_array_object (); static GLboolean _glewInit_GL_APPLE_vertex_array_range (); static GLboolean _glewInit_GL_APPLE_vertex_program_evaluators (); static GLboolean _glewInit_GL_ARB_ES2_compatibility (); static GLboolean _glewInit_GL_ARB_ES3_1_compatibility (); static GLboolean _glewInit_GL_ARB_ES3_2_compatibility (); static GLboolean _glewInit_GL_ARB_base_instance (); static GLboolean _glewInit_GL_ARB_bindless_texture (); static GLboolean _glewInit_GL_ARB_blend_func_extended (); static GLboolean _glewInit_GL_ARB_buffer_storage (); static GLboolean _glewInit_GL_ARB_cl_event (); static GLboolean _glewInit_GL_ARB_clear_buffer_object (); static GLboolean _glewInit_GL_ARB_clear_texture (); static GLboolean _glewInit_GL_ARB_clip_control (); static GLboolean _glewInit_GL_ARB_color_buffer_float (); static GLboolean _glewInit_GL_ARB_compute_shader (); static GLboolean _glewInit_GL_ARB_compute_variable_group_size (); static GLboolean _glewInit_GL_ARB_copy_buffer (); static GLboolean _glewInit_GL_ARB_copy_image (); static GLboolean _glewInit_GL_ARB_debug_output (); static GLboolean _glewInit_GL_ARB_direct_state_access (); static GLboolean _glewInit_GL_ARB_draw_buffers (); static GLboolean _glewInit_GL_ARB_draw_buffers_blend (); static GLboolean _glewInit_GL_ARB_draw_elements_base_vertex (); static GLboolean _glewInit_GL_ARB_draw_indirect (); static GLboolean _glewInit_GL_ARB_framebuffer_no_attachments (); static GLboolean _glewInit_GL_ARB_framebuffer_object (); static GLboolean _glewInit_GL_ARB_geometry_shader4 (); static GLboolean _glewInit_GL_ARB_get_program_binary (); static GLboolean _glewInit_GL_ARB_get_texture_sub_image (); static GLboolean _glewInit_GL_ARB_gl_spirv (); static GLboolean _glewInit_GL_ARB_gpu_shader_fp64 (); static GLboolean _glewInit_GL_ARB_gpu_shader_int64 (); static GLboolean _glewInit_GL_ARB_imaging (); static GLboolean _glewInit_GL_ARB_indirect_parameters (); static GLboolean _glewInit_GL_ARB_instanced_arrays (); static GLboolean _glewInit_GL_ARB_internalformat_query (); static GLboolean _glewInit_GL_ARB_internalformat_query2 (); static GLboolean _glewInit_GL_ARB_invalidate_subdata (); static GLboolean _glewInit_GL_ARB_map_buffer_range (); static GLboolean _glewInit_GL_ARB_matrix_palette (); static GLboolean _glewInit_GL_ARB_multi_bind (); static GLboolean _glewInit_GL_ARB_multi_draw_indirect (); static GLboolean _glewInit_GL_ARB_multisample (); static GLboolean _glewInit_GL_ARB_multitexture (); static GLboolean _glewInit_GL_ARB_occlusion_query (); static GLboolean _glewInit_GL_ARB_parallel_shader_compile (); static GLboolean _glewInit_GL_ARB_point_parameters (); static GLboolean _glewInit_GL_ARB_polygon_offset_clamp (); static GLboolean _glewInit_GL_ARB_program_interface_query (); static GLboolean _glewInit_GL_ARB_provoking_vertex (); static GLboolean _glewInit_GL_ARB_robustness (); static GLboolean _glewInit_GL_ARB_sample_locations (); static GLboolean _glewInit_GL_ARB_sample_shading (); static GLboolean _glewInit_GL_ARB_sampler_objects (); static GLboolean _glewInit_GL_ARB_separate_shader_objects (); static GLboolean _glewInit_GL_ARB_shader_atomic_counters (); static GLboolean _glewInit_GL_ARB_shader_image_load_store (); static GLboolean _glewInit_GL_ARB_shader_objects (); static GLboolean _glewInit_GL_ARB_shader_storage_buffer_object (); static GLboolean _glewInit_GL_ARB_shader_subroutine (); static GLboolean _glewInit_GL_ARB_shading_language_include (); static GLboolean _glewInit_GL_ARB_sparse_buffer (); static GLboolean _glewInit_GL_ARB_sparse_texture (); static GLboolean _glewInit_GL_ARB_sync (); static GLboolean _glewInit_GL_ARB_tessellation_shader (); static GLboolean _glewInit_GL_ARB_texture_barrier (); static GLboolean _glewInit_GL_ARB_texture_buffer_object (); static GLboolean _glewInit_GL_ARB_texture_buffer_range (); static GLboolean _glewInit_GL_ARB_texture_compression (); static GLboolean _glewInit_GL_ARB_texture_multisample (); static GLboolean _glewInit_GL_ARB_texture_storage (); static GLboolean _glewInit_GL_ARB_texture_storage_multisample (); static GLboolean _glewInit_GL_ARB_texture_view (); static GLboolean _glewInit_GL_ARB_timer_query (); static GLboolean _glewInit_GL_ARB_transform_feedback2 (); static GLboolean _glewInit_GL_ARB_transform_feedback3 (); static GLboolean _glewInit_GL_ARB_transform_feedback_instanced (); static GLboolean _glewInit_GL_ARB_transpose_matrix (); static GLboolean _glewInit_GL_ARB_uniform_buffer_object (); static GLboolean _glewInit_GL_ARB_vertex_array_object (); static GLboolean _glewInit_GL_ARB_vertex_attrib_64bit (); static GLboolean _glewInit_GL_ARB_vertex_attrib_binding (); static GLboolean _glewInit_GL_ARB_vertex_blend (); static GLboolean _glewInit_GL_ARB_vertex_buffer_object (); static GLboolean _glewInit_GL_ARB_vertex_program (); static GLboolean _glewInit_GL_ARB_vertex_shader (); static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev (); static GLboolean _glewInit_GL_ARB_viewport_array (); static GLboolean _glewInit_GL_ARB_window_pos (); static GLboolean _glewInit_GL_ATI_draw_buffers (); static GLboolean _glewInit_GL_ATI_element_array (); static GLboolean _glewInit_GL_ATI_envmap_bumpmap (); static GLboolean _glewInit_GL_ATI_fragment_shader (); static GLboolean _glewInit_GL_ATI_map_object_buffer (); static GLboolean _glewInit_GL_ATI_pn_triangles (); static GLboolean _glewInit_GL_ATI_separate_stencil (); static GLboolean _glewInit_GL_ATI_vertex_array_object (); static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object (); static GLboolean _glewInit_GL_ATI_vertex_streams (); static GLboolean _glewInit_GL_EXT_base_instance (); static GLboolean _glewInit_GL_EXT_bindable_uniform (); static GLboolean _glewInit_GL_EXT_blend_color (); static GLboolean _glewInit_GL_EXT_blend_equation_separate (); static GLboolean _glewInit_GL_EXT_blend_func_extended (); static GLboolean _glewInit_GL_EXT_blend_func_separate (); static GLboolean _glewInit_GL_EXT_blend_minmax (); static GLboolean _glewInit_GL_EXT_buffer_storage (); static GLboolean _glewInit_GL_EXT_clear_texture (); static GLboolean _glewInit_GL_EXT_color_subtable (); static GLboolean _glewInit_GL_EXT_compiled_vertex_array (); static GLboolean _glewInit_GL_EXT_convolution (); static GLboolean _glewInit_GL_EXT_coordinate_frame (); static GLboolean _glewInit_GL_EXT_copy_image (); static GLboolean _glewInit_GL_EXT_copy_texture (); static GLboolean _glewInit_GL_EXT_cull_vertex (); static GLboolean _glewInit_GL_EXT_debug_label (); static GLboolean _glewInit_GL_EXT_debug_marker (); static GLboolean _glewInit_GL_EXT_depth_bounds_test (); static GLboolean _glewInit_GL_EXT_direct_state_access (); static GLboolean _glewInit_GL_EXT_discard_framebuffer (); static GLboolean _glewInit_GL_EXT_draw_buffers (); static GLboolean _glewInit_GL_EXT_draw_buffers2 (); static GLboolean _glewInit_GL_EXT_draw_buffers_indexed (); static GLboolean _glewInit_GL_EXT_draw_elements_base_vertex (); static GLboolean _glewInit_GL_EXT_draw_instanced (); static GLboolean _glewInit_GL_EXT_draw_range_elements (); static GLboolean _glewInit_GL_EXT_external_buffer (); static GLboolean _glewInit_GL_EXT_fog_coord (); static GLboolean _glewInit_GL_EXT_fragment_lighting (); static GLboolean _glewInit_GL_EXT_framebuffer_blit (); static GLboolean _glewInit_GL_EXT_framebuffer_multisample (); static GLboolean _glewInit_GL_EXT_framebuffer_object (); static GLboolean _glewInit_GL_EXT_geometry_shader4 (); static GLboolean _glewInit_GL_EXT_gpu_program_parameters (); static GLboolean _glewInit_GL_EXT_gpu_shader4 (); static GLboolean _glewInit_GL_EXT_histogram (); static GLboolean _glewInit_GL_EXT_index_func (); static GLboolean _glewInit_GL_EXT_index_material (); static GLboolean _glewInit_GL_EXT_instanced_arrays (); static GLboolean _glewInit_GL_EXT_light_texture (); static GLboolean _glewInit_GL_EXT_map_buffer_range (); static GLboolean _glewInit_GL_EXT_memory_object (); static GLboolean _glewInit_GL_EXT_memory_object_fd (); static GLboolean _glewInit_GL_EXT_memory_object_win32 (); static GLboolean _glewInit_GL_EXT_multi_draw_arrays (); static GLboolean _glewInit_GL_EXT_multi_draw_indirect (); static GLboolean _glewInit_GL_EXT_multisample (); static GLboolean _glewInit_GL_EXT_multisampled_render_to_texture (); static GLboolean _glewInit_GL_EXT_multiview_draw_buffers (); static GLboolean _glewInit_GL_EXT_paletted_texture (); static GLboolean _glewInit_GL_EXT_pixel_transform (); static GLboolean _glewInit_GL_EXT_point_parameters (); static GLboolean _glewInit_GL_EXT_polygon_offset (); static GLboolean _glewInit_GL_EXT_polygon_offset_clamp (); static GLboolean _glewInit_GL_EXT_provoking_vertex (); static GLboolean _glewInit_GL_EXT_raster_multisample (); static GLboolean _glewInit_GL_EXT_scene_marker (); static GLboolean _glewInit_GL_EXT_secondary_color (); static GLboolean _glewInit_GL_EXT_semaphore (); static GLboolean _glewInit_GL_EXT_semaphore_fd (); static GLboolean _glewInit_GL_EXT_semaphore_win32 (); static GLboolean _glewInit_GL_EXT_separate_shader_objects (); static GLboolean _glewInit_GL_EXT_shader_image_load_store (); static GLboolean _glewInit_GL_EXT_shader_pixel_local_storage2 (); static GLboolean _glewInit_GL_EXT_sparse_texture (); static GLboolean _glewInit_GL_EXT_stencil_two_side (); static GLboolean _glewInit_GL_EXT_subtexture (); static GLboolean _glewInit_GL_EXT_texture3D (); static GLboolean _glewInit_GL_EXT_texture_array (); static GLboolean _glewInit_GL_EXT_texture_buffer_object (); static GLboolean _glewInit_GL_EXT_texture_integer (); static GLboolean _glewInit_GL_EXT_texture_object (); static GLboolean _glewInit_GL_EXT_texture_perturb_normal (); static GLboolean _glewInit_GL_EXT_texture_storage (); static GLboolean _glewInit_GL_EXT_texture_view (); static GLboolean _glewInit_GL_EXT_timer_query (); static GLboolean _glewInit_GL_EXT_transform_feedback (); static GLboolean _glewInit_GL_EXT_vertex_array (); static GLboolean _glewInit_GL_EXT_vertex_array_setXXX (); static GLboolean _glewInit_GL_EXT_vertex_attrib_64bit (); static GLboolean _glewInit_GL_EXT_vertex_shader (); static GLboolean _glewInit_GL_EXT_vertex_weighting (); static GLboolean _glewInit_GL_EXT_win32_keyed_mutex (); static GLboolean _glewInit_GL_EXT_window_rectangles (); static GLboolean _glewInit_GL_EXT_x11_sync_object (); static GLboolean _glewInit_GL_GREMEDY_frame_terminator (); static GLboolean _glewInit_GL_GREMEDY_string_marker (); static GLboolean _glewInit_GL_HP_image_transform (); static GLboolean _glewInit_GL_IBM_multimode_draw_arrays (); static GLboolean _glewInit_GL_IBM_vertex_array_lists (); static GLboolean _glewInit_GL_INTEL_map_texture (); static GLboolean _glewInit_GL_INTEL_parallel_arrays (); static GLboolean _glewInit_GL_INTEL_performance_query (); static GLboolean _glewInit_GL_INTEL_texture_scissor (); static GLboolean _glewInit_GL_KHR_blend_equation_advanced (); static GLboolean _glewInit_GL_KHR_debug (); static GLboolean _glewInit_GL_KHR_parallel_shader_compile (); static GLboolean _glewInit_GL_KHR_robustness (); static GLboolean _glewInit_GL_KTX_buffer_region (); static GLboolean _glewInit_GL_MESA_resize_buffers (); static GLboolean _glewInit_GL_MESA_window_pos (); static GLboolean _glewInit_GL_NVX_conditional_render (); static GLboolean _glewInit_GL_NVX_linked_gpu_multicast (); static GLboolean _glewInit_GL_NV_3dvision_settings (); static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect (); static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect_count (); static GLboolean _glewInit_GL_NV_bindless_texture (); static GLboolean _glewInit_GL_NV_blend_equation_advanced (); static GLboolean _glewInit_GL_NV_clip_space_w_scaling (); static GLboolean _glewInit_GL_NV_command_list (); static GLboolean _glewInit_GL_NV_conditional_render (); static GLboolean _glewInit_GL_NV_conservative_raster (); static GLboolean _glewInit_GL_NV_conservative_raster_dilate (); static GLboolean _glewInit_GL_NV_conservative_raster_pre_snap_triangles (); static GLboolean _glewInit_GL_NV_copy_buffer (); static GLboolean _glewInit_GL_NV_copy_image (); static GLboolean _glewInit_GL_NV_depth_buffer_float (); static GLboolean _glewInit_GL_NV_draw_buffers (); static GLboolean _glewInit_GL_NV_draw_instanced (); static GLboolean _glewInit_GL_NV_draw_texture (); static GLboolean _glewInit_GL_NV_draw_vulkan_image (); static GLboolean _glewInit_GL_NV_evaluators (); static GLboolean _glewInit_GL_NV_explicit_multisample (); static GLboolean _glewInit_GL_NV_fence (); static GLboolean _glewInit_GL_NV_fragment_coverage_to_color (); static GLboolean _glewInit_GL_NV_fragment_program (); static GLboolean _glewInit_GL_NV_framebuffer_blit (); static GLboolean _glewInit_GL_NV_framebuffer_multisample (); static GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage (); static GLboolean _glewInit_GL_NV_geometry_program4 (); static GLboolean _glewInit_GL_NV_gpu_multicast (); static GLboolean _glewInit_GL_NV_gpu_program4 (); static GLboolean _glewInit_GL_NV_gpu_shader5 (); static GLboolean _glewInit_GL_NV_half_float (); static GLboolean _glewInit_GL_NV_instanced_arrays (); static GLboolean _glewInit_GL_NV_internalformat_sample_query (); static GLboolean _glewInit_GL_NV_non_square_matrices (); static GLboolean _glewInit_GL_NV_occlusion_query (); static GLboolean _glewInit_GL_NV_parameter_buffer_object (); static GLboolean _glewInit_GL_NV_path_rendering (); static GLboolean _glewInit_GL_NV_pixel_data_range (); static GLboolean _glewInit_GL_NV_point_sprite (); static GLboolean _glewInit_GL_NV_polygon_mode (); static GLboolean _glewInit_GL_NV_present_video (); static GLboolean _glewInit_GL_NV_primitive_restart (); static GLboolean _glewInit_GL_NV_register_combiners (); static GLboolean _glewInit_GL_NV_register_combiners2 (); static GLboolean _glewInit_GL_NV_sample_locations (); static GLboolean _glewInit_GL_NV_shader_buffer_load (); static GLboolean _glewInit_GL_NV_texture_array (); static GLboolean _glewInit_GL_NV_texture_barrier (); static GLboolean _glewInit_GL_NV_texture_multisample (); static GLboolean _glewInit_GL_NV_transform_feedback (); static GLboolean _glewInit_GL_NV_transform_feedback2 (); static GLboolean _glewInit_GL_NV_vdpau_interop (); static GLboolean _glewInit_GL_NV_vertex_array_range (); static GLboolean _glewInit_GL_NV_vertex_attrib_integer_64bit (); static GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory (); static GLboolean _glewInit_GL_NV_vertex_program (); static GLboolean _glewInit_GL_NV_video_capture (); static GLboolean _glewInit_GL_NV_viewport_array (); static GLboolean _glewInit_GL_NV_viewport_swizzle (); static GLboolean _glewInit_GL_OVR_multiview (); static GLboolean _glewInit_GL_OVR_multiview_multisampled_render_to_texture (); static GLboolean _glewInit_GL_QCOM_alpha_test (); static GLboolean _glewInit_GL_QCOM_driver_control (); static GLboolean _glewInit_GL_QCOM_extended_get (); static GLboolean _glewInit_GL_QCOM_extended_get2 (); static GLboolean _glewInit_GL_QCOM_framebuffer_foveated (); static GLboolean _glewInit_GL_QCOM_shader_framebuffer_fetch_noncoherent (); static GLboolean _glewInit_GL_QCOM_tiled_rendering (); static GLboolean _glewInit_GL_REGAL_ES1_0_compatibility (); static GLboolean _glewInit_GL_REGAL_ES1_1_compatibility (); static GLboolean _glewInit_GL_REGAL_error_string (); static GLboolean _glewInit_GL_REGAL_extension_query (); static GLboolean _glewInit_GL_REGAL_log (); static GLboolean _glewInit_GL_REGAL_proc_address (); static GLboolean _glewInit_GL_SGIS_detail_texture (); static GLboolean _glewInit_GL_SGIS_fog_function (); static GLboolean _glewInit_GL_SGIS_multisample (); static GLboolean _glewInit_GL_SGIS_multitexture (); static GLboolean _glewInit_GL_SGIS_shared_multisample (); static GLboolean _glewInit_GL_SGIS_sharpen_texture (); static GLboolean _glewInit_GL_SGIS_texture4D (); static GLboolean _glewInit_GL_SGIS_texture_filter4 (); static GLboolean _glewInit_GL_SGIX_async (); static GLboolean _glewInit_GL_SGIX_datapipe (); static GLboolean _glewInit_GL_SGIX_flush_raster (); static GLboolean _glewInit_GL_SGIX_fog_layers (); static GLboolean _glewInit_GL_SGIX_fog_texture (); static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting (); static GLboolean _glewInit_GL_SGIX_framezoom (); static GLboolean _glewInit_GL_SGIX_igloo_interface (); static GLboolean _glewInit_GL_SGIX_mpeg1 (); static GLboolean _glewInit_GL_SGIX_nonlinear_lighting_pervertex (); static GLboolean _glewInit_GL_SGIX_pixel_texture (); static GLboolean _glewInit_GL_SGIX_polynomial_ffd (); static GLboolean _glewInit_GL_SGIX_quad_mesh (); static GLboolean _glewInit_GL_SGIX_reference_plane (); static GLboolean _glewInit_GL_SGIX_sprite (); static GLboolean _glewInit_GL_SGIX_tag_sample_buffer (); static GLboolean _glewInit_GL_SGIX_vector_ops (); static GLboolean _glewInit_GL_SGIX_vertex_array_object (); static GLboolean _glewInit_GL_SGI_color_table (); static GLboolean _glewInit_GL_SGI_fft (); static GLboolean _glewInit_GL_SUNX_constant_data (); static GLboolean _glewInit_GL_SUN_global_alpha (); static GLboolean _glewInit_GL_SUN_read_video_pixels (); static GLboolean _glewInit_GL_SUN_triangle_list (); static GLboolean _glewInit_GL_SUN_vertex (); static GLboolean _glewInit_GL_WIN_swap_hint (); #ifdef GL_VERSION_1_2 static GLboolean _glewInit_GL_VERSION_1_2 () { GLboolean r = GL_FALSE; r = ((glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3D")) == NULL) || r; r = ((glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElements")) == NULL) || r; r = ((glTexImage3D = (PFNGLTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexImage3D")) == NULL) || r; r = ((glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3D")) == NULL) || r; return r; } #endif /* GL_VERSION_1_2 */ #ifdef GL_VERSION_1_3 static GLboolean _glewInit_GL_VERSION_1_3 () { GLboolean r = GL_FALSE; r = ((glActiveTexture = (PFNGLACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glActiveTexture")) == NULL) || r; r = ((glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTexture")) == NULL) || r; r = ((glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1D")) == NULL) || r; r = ((glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2D")) == NULL) || r; r = ((glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3D")) == NULL) || r; r = ((glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1D")) == NULL) || r; r = ((glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2D")) == NULL) || r; r = ((glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3D")) == NULL) || r; r = ((glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImage")) == NULL) || r; r = ((glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixd")) == NULL) || r; r = ((glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixf")) == NULL) || r; r = ((glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixd")) == NULL) || r; r = ((glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixf")) == NULL) || r; r = ((glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1d")) == NULL) || r; r = ((glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dv")) == NULL) || r; r = ((glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1f")) == NULL) || r; r = ((glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fv")) == NULL) || r; r = ((glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1i")) == NULL) || r; r = ((glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iv")) == NULL) || r; r = ((glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1s")) == NULL) || r; r = ((glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sv")) == NULL) || r; r = ((glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2d")) == NULL) || r; r = ((glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dv")) == NULL) || r; r = ((glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2f")) == NULL) || r; r = ((glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fv")) == NULL) || r; r = ((glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2i")) == NULL) || r; r = ((glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iv")) == NULL) || r; r = ((glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2s")) == NULL) || r; r = ((glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sv")) == NULL) || r; r = ((glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3d")) == NULL) || r; r = ((glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dv")) == NULL) || r; r = ((glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3f")) == NULL) || r; r = ((glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fv")) == NULL) || r; r = ((glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3i")) == NULL) || r; r = ((glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iv")) == NULL) || r; r = ((glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3s")) == NULL) || r; r = ((glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sv")) == NULL) || r; r = ((glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4d")) == NULL) || r; r = ((glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dv")) == NULL) || r; r = ((glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4f")) == NULL) || r; r = ((glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fv")) == NULL) || r; r = ((glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4i")) == NULL) || r; r = ((glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iv")) == NULL) || r; r = ((glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4s")) == NULL) || r; r = ((glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sv")) == NULL) || r; r = ((glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverage")) == NULL) || r; return r; } #endif /* GL_VERSION_1_3 */ #ifdef GL_VERSION_1_4 static GLboolean _glewInit_GL_VERSION_1_4 () { GLboolean r = GL_FALSE; r = ((glBlendColor = (PFNGLBLENDCOLORPROC)glewGetProcAddress((const GLubyte*)"glBlendColor")) == NULL) || r; r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; r = ((glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparate")) == NULL) || r; r = ((glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointer")) == NULL) || r; r = ((glFogCoordd = (PFNGLFOGCOORDDPROC)glewGetProcAddress((const GLubyte*)"glFogCoordd")) == NULL) || r; r = ((glFogCoorddv = (PFNGLFOGCOORDDVPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddv")) == NULL) || r; r = ((glFogCoordf = (PFNGLFOGCOORDFPROC)glewGetProcAddress((const GLubyte*)"glFogCoordf")) == NULL) || r; r = ((glFogCoordfv = (PFNGLFOGCOORDFVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfv")) == NULL) || r; r = ((glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArrays")) == NULL) || r; r = ((glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElements")) == NULL) || r; r = ((glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glPointParameterf")) == NULL) || r; r = ((glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfv")) == NULL) || r; r = ((glPointParameteri = (PFNGLPOINTPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPointParameteri")) == NULL) || r; r = ((glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriv")) == NULL) || r; r = ((glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3b")) == NULL) || r; r = ((glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bv")) == NULL) || r; r = ((glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3d")) == NULL) || r; r = ((glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dv")) == NULL) || r; r = ((glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3f")) == NULL) || r; r = ((glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fv")) == NULL) || r; r = ((glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3i")) == NULL) || r; r = ((glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iv")) == NULL) || r; r = ((glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3s")) == NULL) || r; r = ((glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sv")) == NULL) || r; r = ((glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ub")) == NULL) || r; r = ((glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubv")) == NULL) || r; r = ((glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ui")) == NULL) || r; r = ((glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiv")) == NULL) || r; r = ((glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3us")) == NULL) || r; r = ((glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usv")) == NULL) || r; r = ((glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointer")) == NULL) || r; r = ((glWindowPos2d = (PFNGLWINDOWPOS2DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2d")) == NULL) || r; r = ((glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dv")) == NULL) || r; r = ((glWindowPos2f = (PFNGLWINDOWPOS2FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2f")) == NULL) || r; r = ((glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fv")) == NULL) || r; r = ((glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2i")) == NULL) || r; r = ((glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iv")) == NULL) || r; r = ((glWindowPos2s = (PFNGLWINDOWPOS2SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2s")) == NULL) || r; r = ((glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sv")) == NULL) || r; r = ((glWindowPos3d = (PFNGLWINDOWPOS3DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3d")) == NULL) || r; r = ((glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dv")) == NULL) || r; r = ((glWindowPos3f = (PFNGLWINDOWPOS3FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3f")) == NULL) || r; r = ((glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fv")) == NULL) || r; r = ((glWindowPos3i = (PFNGLWINDOWPOS3IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3i")) == NULL) || r; r = ((glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iv")) == NULL) || r; r = ((glWindowPos3s = (PFNGLWINDOWPOS3SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3s")) == NULL) || r; r = ((glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sv")) == NULL) || r; return r; } #endif /* GL_VERSION_1_4 */ #ifdef GL_VERSION_1_5 static GLboolean _glewInit_GL_VERSION_1_5 () { GLboolean r = GL_FALSE; r = ((glBeginQuery = (PFNGLBEGINQUERYPROC)glewGetProcAddress((const GLubyte*)"glBeginQuery")) == NULL) || r; r = ((glBindBuffer = (PFNGLBINDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindBuffer")) == NULL) || r; r = ((glBufferData = (PFNGLBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferData")) == NULL) || r; r = ((glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferSubData")) == NULL) || r; r = ((glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffers")) == NULL) || r; r = ((glDeleteQueries = (PFNGLDELETEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueries")) == NULL) || r; r = ((glEndQuery = (PFNGLENDQUERYPROC)glewGetProcAddress((const GLubyte*)"glEndQuery")) == NULL) || r; r = ((glGenBuffers = (PFNGLGENBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenBuffers")) == NULL) || r; r = ((glGenQueries = (PFNGLGENQUERIESPROC)glewGetProcAddress((const GLubyte*)"glGenQueries")) == NULL) || r; r = ((glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteriv")) == NULL) || r; r = ((glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointerv")) == NULL) || r; r = ((glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubData")) == NULL) || r; r = ((glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectiv")) == NULL) || r; r = ((glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuiv")) == NULL) || r; r = ((glGetQueryiv = (PFNGLGETQUERYIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryiv")) == NULL) || r; r = ((glIsBuffer = (PFNGLISBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsBuffer")) == NULL) || r; r = ((glIsQuery = (PFNGLISQUERYPROC)glewGetProcAddress((const GLubyte*)"glIsQuery")) == NULL) || r; r = ((glMapBuffer = (PFNGLMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapBuffer")) == NULL) || r; r = ((glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapBuffer")) == NULL) || r; return r; } #endif /* GL_VERSION_1_5 */ #ifdef GL_VERSION_2_0 static GLboolean _glewInit_GL_VERSION_2_0 () { GLboolean r = GL_FALSE; r = ((glAttachShader = (PFNGLATTACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glAttachShader")) == NULL) || r; r = ((glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocation")) == NULL) || r; r = ((glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparate")) == NULL) || r; r = ((glCompileShader = (PFNGLCOMPILESHADERPROC)glewGetProcAddress((const GLubyte*)"glCompileShader")) == NULL) || r; r = ((glCreateProgram = (PFNGLCREATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glCreateProgram")) == NULL) || r; r = ((glCreateShader = (PFNGLCREATESHADERPROC)glewGetProcAddress((const GLubyte*)"glCreateShader")) == NULL) || r; r = ((glDeleteProgram = (PFNGLDELETEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgram")) == NULL) || r; r = ((glDeleteShader = (PFNGLDELETESHADERPROC)glewGetProcAddress((const GLubyte*)"glDeleteShader")) == NULL) || r; r = ((glDetachShader = (PFNGLDETACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glDetachShader")) == NULL) || r; r = ((glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArray")) == NULL) || r; r = ((glDrawBuffers = (PFNGLDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffers")) == NULL) || r; r = ((glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArray")) == NULL) || r; r = ((glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttrib")) == NULL) || r; r = ((glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniform")) == NULL) || r; r = ((glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedShaders")) == NULL) || r; r = ((glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocation")) == NULL) || r; r = ((glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInfoLog")) == NULL) || r; r = ((glGetProgramiv = (PFNGLGETPROGRAMIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramiv")) == NULL) || r; r = ((glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetShaderInfoLog")) == NULL) || r; r = ((glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSource")) == NULL) || r; r = ((glGetShaderiv = (PFNGLGETSHADERIVPROC)glewGetProcAddress((const GLubyte*)"glGetShaderiv")) == NULL) || r; r = ((glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocation")) == NULL) || r; r = ((glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfv")) == NULL) || r; r = ((glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformiv")) == NULL) || r; r = ((glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointerv")) == NULL) || r; r = ((glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdv")) == NULL) || r; r = ((glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfv")) == NULL) || r; r = ((glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribiv")) == NULL) || r; r = ((glIsProgram = (PFNGLISPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glIsProgram")) == NULL) || r; r = ((glIsShader = (PFNGLISSHADERPROC)glewGetProcAddress((const GLubyte*)"glIsShader")) == NULL) || r; r = ((glLinkProgram = (PFNGLLINKPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glLinkProgram")) == NULL) || r; r = ((glShaderSource = (PFNGLSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glShaderSource")) == NULL) || r; r = ((glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparate")) == NULL) || r; r = ((glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilMaskSeparate")) == NULL) || r; r = ((glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparate")) == NULL) || r; r = ((glUniform1f = (PFNGLUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glUniform1f")) == NULL) || r; r = ((glUniform1fv = (PFNGLUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glUniform1fv")) == NULL) || r; r = ((glUniform1i = (PFNGLUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glUniform1i")) == NULL) || r; r = ((glUniform1iv = (PFNGLUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glUniform1iv")) == NULL) || r; r = ((glUniform2f = (PFNGLUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glUniform2f")) == NULL) || r; r = ((glUniform2fv = (PFNGLUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glUniform2fv")) == NULL) || r; r = ((glUniform2i = (PFNGLUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glUniform2i")) == NULL) || r; r = ((glUniform2iv = (PFNGLUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glUniform2iv")) == NULL) || r; r = ((glUniform3f = (PFNGLUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glUniform3f")) == NULL) || r; r = ((glUniform3fv = (PFNGLUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glUniform3fv")) == NULL) || r; r = ((glUniform3i = (PFNGLUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glUniform3i")) == NULL) || r; r = ((glUniform3iv = (PFNGLUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glUniform3iv")) == NULL) || r; r = ((glUniform4f = (PFNGLUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glUniform4f")) == NULL) || r; r = ((glUniform4fv = (PFNGLUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glUniform4fv")) == NULL) || r; r = ((glUniform4i = (PFNGLUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glUniform4i")) == NULL) || r; r = ((glUniform4iv = (PFNGLUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glUniform4iv")) == NULL) || r; r = ((glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fv")) == NULL) || r; r = ((glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fv")) == NULL) || r; r = ((glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fv")) == NULL) || r; r = ((glUseProgram = (PFNGLUSEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glUseProgram")) == NULL) || r; r = ((glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glValidateProgram")) == NULL) || r; r = ((glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1d")) == NULL) || r; r = ((glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dv")) == NULL) || r; r = ((glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1f")) == NULL) || r; r = ((glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fv")) == NULL) || r; r = ((glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1s")) == NULL) || r; r = ((glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sv")) == NULL) || r; r = ((glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2d")) == NULL) || r; r = ((glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dv")) == NULL) || r; r = ((glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2f")) == NULL) || r; r = ((glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fv")) == NULL) || r; r = ((glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2s")) == NULL) || r; r = ((glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sv")) == NULL) || r; r = ((glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3d")) == NULL) || r; r = ((glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dv")) == NULL) || r; r = ((glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3f")) == NULL) || r; r = ((glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fv")) == NULL) || r; r = ((glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3s")) == NULL) || r; r = ((glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sv")) == NULL) || r; r = ((glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nbv")) == NULL) || r; r = ((glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Niv")) == NULL) || r; r = ((glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nsv")) == NULL) || r; r = ((glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nub")) == NULL) || r; r = ((glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nubv")) == NULL) || r; r = ((glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nuiv")) == NULL) || r; r = ((glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nusv")) == NULL) || r; r = ((glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bv")) == NULL) || r; r = ((glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4d")) == NULL) || r; r = ((glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dv")) == NULL) || r; r = ((glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4f")) == NULL) || r; r = ((glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fv")) == NULL) || r; r = ((glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4iv")) == NULL) || r; r = ((glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4s")) == NULL) || r; r = ((glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sv")) == NULL) || r; r = ((glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubv")) == NULL) || r; r = ((glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uiv")) == NULL) || r; r = ((glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usv")) == NULL) || r; r = ((glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointer")) == NULL) || r; return r; } #endif /* GL_VERSION_2_0 */ #ifdef GL_VERSION_2_1 static GLboolean _glewInit_GL_VERSION_2_1 () { GLboolean r = GL_FALSE; r = ((glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3fv")) == NULL) || r; r = ((glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4fv")) == NULL) || r; r = ((glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2fv")) == NULL) || r; r = ((glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4fv")) == NULL) || r; r = ((glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2fv")) == NULL) || r; r = ((glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3fv")) == NULL) || r; return r; } #endif /* GL_VERSION_2_1 */ #ifdef GL_VERSION_3_0 static GLboolean _glewInit_GL_VERSION_3_0 () { GLboolean r = GL_FALSE; r = _glewInit_GL_ARB_framebuffer_object() || r; r = _glewInit_GL_ARB_map_buffer_range() || r; r = _glewInit_GL_ARB_uniform_buffer_object() || r; r = _glewInit_GL_ARB_vertex_array_object() || r; r = ((glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRender")) == NULL) || r; r = ((glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedback")) == NULL) || r; r = ((glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocation")) == NULL) || r; r = ((glClampColor = (PFNGLCLAMPCOLORPROC)glewGetProcAddress((const GLubyte*)"glClampColor")) == NULL) || r; r = ((glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfi")) == NULL) || r; r = ((glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfv")) == NULL) || r; r = ((glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferiv")) == NULL) || r; r = ((glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferuiv")) == NULL) || r; r = ((glColorMaski = (PFNGLCOLORMASKIPROC)glewGetProcAddress((const GLubyte*)"glColorMaski")) == NULL) || r; r = ((glDisablei = (PFNGLDISABLEIPROC)glewGetProcAddress((const GLubyte*)"glDisablei")) == NULL) || r; r = ((glEnablei = (PFNGLENABLEIPROC)glewGetProcAddress((const GLubyte*)"glEnablei")) == NULL) || r; r = ((glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRender")) == NULL) || r; r = ((glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedback")) == NULL) || r; r = ((glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)glewGetProcAddress((const GLubyte*)"glGetBooleani_v")) == NULL) || r; r = ((glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocation")) == NULL) || r; r = ((glGetStringi = (PFNGLGETSTRINGIPROC)glewGetProcAddress((const GLubyte*)"glGetStringi")) == NULL) || r; r = ((glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIiv")) == NULL) || r; r = ((glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuiv")) == NULL) || r; r = ((glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVarying")) == NULL) || r; r = ((glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuiv")) == NULL) || r; r = ((glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIiv")) == NULL) || r; r = ((glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuiv")) == NULL) || r; r = ((glIsEnabledi = (PFNGLISENABLEDIPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledi")) == NULL) || r; r = ((glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIiv")) == NULL) || r; r = ((glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuiv")) == NULL) || r; r = ((glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryings")) == NULL) || r; r = ((glUniform1ui = (PFNGLUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui")) == NULL) || r; r = ((glUniform1uiv = (PFNGLUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiv")) == NULL) || r; r = ((glUniform2ui = (PFNGLUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui")) == NULL) || r; r = ((glUniform2uiv = (PFNGLUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiv")) == NULL) || r; r = ((glUniform3ui = (PFNGLUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui")) == NULL) || r; r = ((glUniform3uiv = (PFNGLUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiv")) == NULL) || r; r = ((glUniform4ui = (PFNGLUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui")) == NULL) || r; r = ((glUniform4uiv = (PFNGLUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiv")) == NULL) || r; r = ((glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1i")) == NULL) || r; r = ((glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iv")) == NULL) || r; r = ((glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ui")) == NULL) || r; r = ((glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiv")) == NULL) || r; r = ((glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2i")) == NULL) || r; r = ((glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iv")) == NULL) || r; r = ((glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ui")) == NULL) || r; r = ((glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiv")) == NULL) || r; r = ((glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3i")) == NULL) || r; r = ((glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iv")) == NULL) || r; r = ((glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ui")) == NULL) || r; r = ((glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiv")) == NULL) || r; r = ((glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bv")) == NULL) || r; r = ((glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4i")) == NULL) || r; r = ((glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iv")) == NULL) || r; r = ((glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4sv")) == NULL) || r; r = ((glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubv")) == NULL) || r; r = ((glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ui")) == NULL) || r; r = ((glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiv")) == NULL) || r; r = ((glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usv")) == NULL) || r; r = ((glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointer")) == NULL) || r; return r; } #endif /* GL_VERSION_3_0 */ #ifdef GL_VERSION_3_1 static GLboolean _glewInit_GL_VERSION_3_1 () { GLboolean r = GL_FALSE; r = _glewInit_GL_ARB_copy_buffer() || r; r = ((glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstanced")) == NULL) || r; r = ((glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstanced")) == NULL) || r; r = ((glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndex")) == NULL) || r; r = ((glTexBuffer = (PFNGLTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTexBuffer")) == NULL) || r; return r; } #endif /* GL_VERSION_3_1 */ #ifdef GL_VERSION_3_2 static GLboolean _glewInit_GL_VERSION_3_2 () { GLboolean r = GL_FALSE; r = _glewInit_GL_ARB_draw_elements_base_vertex() || r; r = _glewInit_GL_ARB_provoking_vertex() || r; r = _glewInit_GL_ARB_sync() || r; r = _glewInit_GL_ARB_texture_multisample() || r; r = ((glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture")) == NULL) || r; r = ((glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteri64v")) == NULL) || r; r = ((glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64i_v")) == NULL) || r; return r; } #endif /* GL_VERSION_3_2 */ #ifdef GL_VERSION_3_3 static GLboolean _glewInit_GL_VERSION_3_3 () { GLboolean r = GL_FALSE; r = ((glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisor")) == NULL) || r; return r; } #endif /* GL_VERSION_3_3 */ #ifdef GL_VERSION_4_0 static GLboolean _glewInit_GL_VERSION_4_0 () { GLboolean r = GL_FALSE; r = ((glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparatei")) == NULL) || r; r = ((glBlendEquationi = (PFNGLBLENDEQUATIONIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationi")) == NULL) || r; r = ((glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparatei")) == NULL) || r; r = ((glBlendFunci = (PFNGLBLENDFUNCIPROC)glewGetProcAddress((const GLubyte*)"glBlendFunci")) == NULL) || r; r = ((glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShading")) == NULL) || r; return r; } #endif /* GL_VERSION_4_0 */ #ifdef GL_VERSION_4_5 static GLboolean _glewInit_GL_VERSION_4_5 () { GLboolean r = GL_FALSE; r = ((glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatus")) == NULL) || r; r = ((glGetnCompressedTexImage = (PFNGLGETNCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImage")) == NULL) || r; r = ((glGetnTexImage = (PFNGLGETNTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImage")) == NULL) || r; r = ((glGetnUniformdv = (PFNGLGETNUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdv")) == NULL) || r; return r; } #endif /* GL_VERSION_4_5 */ #ifdef GL_VERSION_4_6 static GLboolean _glewInit_GL_VERSION_4_6 () { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysIndirectCount = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectCount")) == NULL) || r; r = ((glMultiDrawElementsIndirectCount = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectCount")) == NULL) || r; r = ((glSpecializeShader = (PFNGLSPECIALIZESHADERPROC)glewGetProcAddress((const GLubyte*)"glSpecializeShader")) == NULL) || r; return r; } #endif /* GL_VERSION_4_6 */ #ifdef GL_3DFX_tbuffer static GLboolean _glewInit_GL_3DFX_tbuffer () { GLboolean r = GL_FALSE; r = ((glTbufferMask3DFX = (PFNGLTBUFFERMASK3DFXPROC)glewGetProcAddress((const GLubyte*)"glTbufferMask3DFX")) == NULL) || r; return r; } #endif /* GL_3DFX_tbuffer */ #ifdef GL_AMD_debug_output static GLboolean _glewInit_GL_AMD_debug_output () { GLboolean r = GL_FALSE; r = ((glDebugMessageCallbackAMD = (PFNGLDEBUGMESSAGECALLBACKAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackAMD")) == NULL) || r; r = ((glDebugMessageEnableAMD = (PFNGLDEBUGMESSAGEENABLEAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageEnableAMD")) == NULL) || r; r = ((glDebugMessageInsertAMD = (PFNGLDEBUGMESSAGEINSERTAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertAMD")) == NULL) || r; r = ((glGetDebugMessageLogAMD = (PFNGLGETDEBUGMESSAGELOGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogAMD")) == NULL) || r; return r; } #endif /* GL_AMD_debug_output */ #ifdef GL_AMD_draw_buffers_blend static GLboolean _glewInit_GL_AMD_draw_buffers_blend () { GLboolean r = GL_FALSE; r = ((glBlendEquationIndexedAMD = (PFNGLBLENDEQUATIONINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationIndexedAMD")) == NULL) || r; r = ((glBlendEquationSeparateIndexedAMD = (PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateIndexedAMD")) == NULL) || r; r = ((glBlendFuncIndexedAMD = (PFNGLBLENDFUNCINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncIndexedAMD")) == NULL) || r; r = ((glBlendFuncSeparateIndexedAMD = (PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateIndexedAMD")) == NULL) || r; return r; } #endif /* GL_AMD_draw_buffers_blend */ #ifdef GL_AMD_framebuffer_sample_positions static GLboolean _glewInit_GL_AMD_framebuffer_sample_positions () { GLboolean r = GL_FALSE; r = ((glFramebufferSamplePositionsfvAMD = (PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSamplePositionsfvAMD")) == NULL) || r; r = ((glGetFramebufferParameterfvAMD = (PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterfvAMD")) == NULL) || r; r = ((glGetNamedFramebufferParameterfvAMD = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameterfvAMD")) == NULL) || r; r = ((glNamedFramebufferSamplePositionsfvAMD = (PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSamplePositionsfvAMD")) == NULL) || r; return r; } #endif /* GL_AMD_framebuffer_sample_positions */ #ifdef GL_AMD_interleaved_elements static GLboolean _glewInit_GL_AMD_interleaved_elements () { GLboolean r = GL_FALSE; r = ((glVertexAttribParameteriAMD = (PFNGLVERTEXATTRIBPARAMETERIAMDPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribParameteriAMD")) == NULL) || r; return r; } #endif /* GL_AMD_interleaved_elements */ #ifdef GL_AMD_multi_draw_indirect static GLboolean _glewInit_GL_AMD_multi_draw_indirect () { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysIndirectAMD = (PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectAMD")) == NULL) || r; r = ((glMultiDrawElementsIndirectAMD = (PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectAMD")) == NULL) || r; return r; } #endif /* GL_AMD_multi_draw_indirect */ #ifdef GL_AMD_name_gen_delete static GLboolean _glewInit_GL_AMD_name_gen_delete () { GLboolean r = GL_FALSE; r = ((glDeleteNamesAMD = (PFNGLDELETENAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamesAMD")) == NULL) || r; r = ((glGenNamesAMD = (PFNGLGENNAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glGenNamesAMD")) == NULL) || r; r = ((glIsNameAMD = (PFNGLISNAMEAMDPROC)glewGetProcAddress((const GLubyte*)"glIsNameAMD")) == NULL) || r; return r; } #endif /* GL_AMD_name_gen_delete */ #ifdef GL_AMD_occlusion_query_event static GLboolean _glewInit_GL_AMD_occlusion_query_event () { GLboolean r = GL_FALSE; r = ((glQueryObjectParameteruiAMD = (PFNGLQUERYOBJECTPARAMETERUIAMDPROC)glewGetProcAddress((const GLubyte*)"glQueryObjectParameteruiAMD")) == NULL) || r; return r; } #endif /* GL_AMD_occlusion_query_event */ #ifdef GL_AMD_performance_monitor static GLboolean _glewInit_GL_AMD_performance_monitor () { GLboolean r = GL_FALSE; r = ((glBeginPerfMonitorAMD = (PFNGLBEGINPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfMonitorAMD")) == NULL) || r; r = ((glDeletePerfMonitorsAMD = (PFNGLDELETEPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfMonitorsAMD")) == NULL) || r; r = ((glEndPerfMonitorAMD = (PFNGLENDPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glEndPerfMonitorAMD")) == NULL) || r; r = ((glGenPerfMonitorsAMD = (PFNGLGENPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glGenPerfMonitorsAMD")) == NULL) || r; r = ((glGetPerfMonitorCounterDataAMD = (PFNGLGETPERFMONITORCOUNTERDATAAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterDataAMD")) == NULL) || r; r = ((glGetPerfMonitorCounterInfoAMD = (PFNGLGETPERFMONITORCOUNTERINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterInfoAMD")) == NULL) || r; r = ((glGetPerfMonitorCounterStringAMD = (PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterStringAMD")) == NULL) || r; r = ((glGetPerfMonitorCountersAMD = (PFNGLGETPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCountersAMD")) == NULL) || r; r = ((glGetPerfMonitorGroupStringAMD = (PFNGLGETPERFMONITORGROUPSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupStringAMD")) == NULL) || r; r = ((glGetPerfMonitorGroupsAMD = (PFNGLGETPERFMONITORGROUPSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupsAMD")) == NULL) || r; r = ((glSelectPerfMonitorCountersAMD = (PFNGLSELECTPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glSelectPerfMonitorCountersAMD")) == NULL) || r; return r; } #endif /* GL_AMD_performance_monitor */ #ifdef GL_AMD_sample_positions static GLboolean _glewInit_GL_AMD_sample_positions () { GLboolean r = GL_FALSE; r = ((glSetMultisamplefvAMD = (PFNGLSETMULTISAMPLEFVAMDPROC)glewGetProcAddress((const GLubyte*)"glSetMultisamplefvAMD")) == NULL) || r; return r; } #endif /* GL_AMD_sample_positions */ #ifdef GL_AMD_sparse_texture static GLboolean _glewInit_GL_AMD_sparse_texture () { GLboolean r = GL_FALSE; r = ((glTexStorageSparseAMD = (PFNGLTEXSTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTexStorageSparseAMD")) == NULL) || r; r = ((glTextureStorageSparseAMD = (PFNGLTEXTURESTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageSparseAMD")) == NULL) || r; return r; } #endif /* GL_AMD_sparse_texture */ #ifdef GL_AMD_stencil_operation_extended static GLboolean _glewInit_GL_AMD_stencil_operation_extended () { GLboolean r = GL_FALSE; r = ((glStencilOpValueAMD = (PFNGLSTENCILOPVALUEAMDPROC)glewGetProcAddress((const GLubyte*)"glStencilOpValueAMD")) == NULL) || r; return r; } #endif /* GL_AMD_stencil_operation_extended */ #ifdef GL_AMD_vertex_shader_tessellator static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator () { GLboolean r = GL_FALSE; r = ((glTessellationFactorAMD = (PFNGLTESSELLATIONFACTORAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationFactorAMD")) == NULL) || r; r = ((glTessellationModeAMD = (PFNGLTESSELLATIONMODEAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationModeAMD")) == NULL) || r; return r; } #endif /* GL_AMD_vertex_shader_tessellator */ #ifdef GL_ANGLE_framebuffer_blit static GLboolean _glewInit_GL_ANGLE_framebuffer_blit () { GLboolean r = GL_FALSE; r = ((glBlitFramebufferANGLE = (PFNGLBLITFRAMEBUFFERANGLEPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferANGLE")) == NULL) || r; return r; } #endif /* GL_ANGLE_framebuffer_blit */ #ifdef GL_ANGLE_framebuffer_multisample static GLboolean _glewInit_GL_ANGLE_framebuffer_multisample () { GLboolean r = GL_FALSE; r = ((glRenderbufferStorageMultisampleANGLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleANGLE")) == NULL) || r; return r; } #endif /* GL_ANGLE_framebuffer_multisample */ #ifdef GL_ANGLE_instanced_arrays static GLboolean _glewInit_GL_ANGLE_instanced_arrays () { GLboolean r = GL_FALSE; r = ((glDrawArraysInstancedANGLE = (PFNGLDRAWARRAYSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedANGLE")) == NULL) || r; r = ((glDrawElementsInstancedANGLE = (PFNGLDRAWELEMENTSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedANGLE")) == NULL) || r; r = ((glVertexAttribDivisorANGLE = (PFNGLVERTEXATTRIBDIVISORANGLEPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorANGLE")) == NULL) || r; return r; } #endif /* GL_ANGLE_instanced_arrays */ #ifdef GL_ANGLE_timer_query static GLboolean _glewInit_GL_ANGLE_timer_query () { GLboolean r = GL_FALSE; r = ((glBeginQueryANGLE = (PFNGLBEGINQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryANGLE")) == NULL) || r; r = ((glDeleteQueriesANGLE = (PFNGLDELETEQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesANGLE")) == NULL) || r; r = ((glEndQueryANGLE = (PFNGLENDQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glEndQueryANGLE")) == NULL) || r; r = ((glGenQueriesANGLE = (PFNGLGENQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesANGLE")) == NULL) || r; r = ((glGetQueryObjecti64vANGLE = (PFNGLGETQUERYOBJECTI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vANGLE")) == NULL) || r; r = ((glGetQueryObjectivANGLE = (PFNGLGETQUERYOBJECTIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivANGLE")) == NULL) || r; r = ((glGetQueryObjectui64vANGLE = (PFNGLGETQUERYOBJECTUI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vANGLE")) == NULL) || r; r = ((glGetQueryObjectuivANGLE = (PFNGLGETQUERYOBJECTUIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivANGLE")) == NULL) || r; r = ((glGetQueryivANGLE = (PFNGLGETQUERYIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivANGLE")) == NULL) || r; r = ((glIsQueryANGLE = (PFNGLISQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glIsQueryANGLE")) == NULL) || r; r = ((glQueryCounterANGLE = (PFNGLQUERYCOUNTERANGLEPROC)glewGetProcAddress((const GLubyte*)"glQueryCounterANGLE")) == NULL) || r; return r; } #endif /* GL_ANGLE_timer_query */ #ifdef GL_ANGLE_translated_shader_source static GLboolean _glewInit_GL_ANGLE_translated_shader_source () { GLboolean r = GL_FALSE; r = ((glGetTranslatedShaderSourceANGLE = (PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetTranslatedShaderSourceANGLE")) == NULL) || r; return r; } #endif /* GL_ANGLE_translated_shader_source */ #ifdef GL_APPLE_copy_texture_levels static GLboolean _glewInit_GL_APPLE_copy_texture_levels () { GLboolean r = GL_FALSE; r = ((glCopyTextureLevelsAPPLE = (PFNGLCOPYTEXTURELEVELSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureLevelsAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_copy_texture_levels */ #ifdef GL_APPLE_element_array static GLboolean _glewInit_GL_APPLE_element_array () { GLboolean r = GL_FALSE; r = ((glDrawElementArrayAPPLE = (PFNGLDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayAPPLE")) == NULL) || r; r = ((glDrawRangeElementArrayAPPLE = (PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayAPPLE")) == NULL) || r; r = ((glElementPointerAPPLE = (PFNGLELEMENTPOINTERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glElementPointerAPPLE")) == NULL) || r; r = ((glMultiDrawElementArrayAPPLE = (PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementArrayAPPLE")) == NULL) || r; r = ((glMultiDrawRangeElementArrayAPPLE = (PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawRangeElementArrayAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_element_array */ #ifdef GL_APPLE_fence static GLboolean _glewInit_GL_APPLE_fence () { GLboolean r = GL_FALSE; r = ((glDeleteFencesAPPLE = (PFNGLDELETEFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesAPPLE")) == NULL) || r; r = ((glFinishFenceAPPLE = (PFNGLFINISHFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceAPPLE")) == NULL) || r; r = ((glFinishObjectAPPLE = (PFNGLFINISHOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishObjectAPPLE")) == NULL) || r; r = ((glGenFencesAPPLE = (PFNGLGENFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenFencesAPPLE")) == NULL) || r; r = ((glIsFenceAPPLE = (PFNGLISFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsFenceAPPLE")) == NULL) || r; r = ((glSetFenceAPPLE = (PFNGLSETFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glSetFenceAPPLE")) == NULL) || r; r = ((glTestFenceAPPLE = (PFNGLTESTFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestFenceAPPLE")) == NULL) || r; r = ((glTestObjectAPPLE = (PFNGLTESTOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestObjectAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_fence */ #ifdef GL_APPLE_flush_buffer_range static GLboolean _glewInit_GL_APPLE_flush_buffer_range () { GLboolean r = GL_FALSE; r = ((glBufferParameteriAPPLE = (PFNGLBUFFERPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBufferParameteriAPPLE")) == NULL) || r; r = ((glFlushMappedBufferRangeAPPLE = (PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRangeAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_flush_buffer_range */ #ifdef GL_APPLE_framebuffer_multisample static GLboolean _glewInit_GL_APPLE_framebuffer_multisample () { GLboolean r = GL_FALSE; r = ((glRenderbufferStorageMultisampleAPPLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleAPPLE")) == NULL) || r; r = ((glResolveMultisampleFramebufferAPPLE = (PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glResolveMultisampleFramebufferAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_framebuffer_multisample */ #ifdef GL_APPLE_object_purgeable static GLboolean _glewInit_GL_APPLE_object_purgeable () { GLboolean r = GL_FALSE; r = ((glGetObjectParameterivAPPLE = (PFNGLGETOBJECTPARAMETERIVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivAPPLE")) == NULL) || r; r = ((glObjectPurgeableAPPLE = (PFNGLOBJECTPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectPurgeableAPPLE")) == NULL) || r; r = ((glObjectUnpurgeableAPPLE = (PFNGLOBJECTUNPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectUnpurgeableAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_object_purgeable */ #ifdef GL_APPLE_sync static GLboolean _glewInit_GL_APPLE_sync () { GLboolean r = GL_FALSE; r = ((glClientWaitSyncAPPLE = (PFNGLCLIENTWAITSYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSyncAPPLE")) == NULL) || r; r = ((glDeleteSyncAPPLE = (PFNGLDELETESYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteSyncAPPLE")) == NULL) || r; r = ((glFenceSyncAPPLE = (PFNGLFENCESYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFenceSyncAPPLE")) == NULL) || r; r = ((glGetInteger64vAPPLE = (PFNGLGETINTEGER64VAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64vAPPLE")) == NULL) || r; r = ((glGetSyncivAPPLE = (PFNGLGETSYNCIVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetSyncivAPPLE")) == NULL) || r; r = ((glIsSyncAPPLE = (PFNGLISSYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsSyncAPPLE")) == NULL) || r; r = ((glWaitSyncAPPLE = (PFNGLWAITSYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glWaitSyncAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_sync */ #ifdef GL_APPLE_texture_range static GLboolean _glewInit_GL_APPLE_texture_range () { GLboolean r = GL_FALSE; r = ((glGetTexParameterPointervAPPLE = (PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterPointervAPPLE")) == NULL) || r; r = ((glTextureRangeAPPLE = (PFNGLTEXTURERANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureRangeAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_texture_range */ #ifdef GL_APPLE_vertex_array_object static GLboolean _glewInit_GL_APPLE_vertex_array_object () { GLboolean r = GL_FALSE; r = ((glBindVertexArrayAPPLE = (PFNGLBINDVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArrayAPPLE")) == NULL) || r; r = ((glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysAPPLE")) == NULL) || r; r = ((glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysAPPLE")) == NULL) || r; r = ((glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArrayAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_vertex_array_object */ #ifdef GL_APPLE_vertex_array_range static GLboolean _glewInit_GL_APPLE_vertex_array_range () { GLboolean r = GL_FALSE; r = ((glFlushVertexArrayRangeAPPLE = (PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeAPPLE")) == NULL) || r; r = ((glVertexArrayParameteriAPPLE = (PFNGLVERTEXARRAYPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayParameteriAPPLE")) == NULL) || r; r = ((glVertexArrayRangeAPPLE = (PFNGLVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_vertex_array_range */ #ifdef GL_APPLE_vertex_program_evaluators static GLboolean _glewInit_GL_APPLE_vertex_program_evaluators () { GLboolean r = GL_FALSE; r = ((glDisableVertexAttribAPPLE = (PFNGLDISABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribAPPLE")) == NULL) || r; r = ((glEnableVertexAttribAPPLE = (PFNGLENABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribAPPLE")) == NULL) || r; r = ((glIsVertexAttribEnabledAPPLE = (PFNGLISVERTEXATTRIBENABLEDAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexAttribEnabledAPPLE")) == NULL) || r; r = ((glMapVertexAttrib1dAPPLE = (PFNGLMAPVERTEXATTRIB1DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1dAPPLE")) == NULL) || r; r = ((glMapVertexAttrib1fAPPLE = (PFNGLMAPVERTEXATTRIB1FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1fAPPLE")) == NULL) || r; r = ((glMapVertexAttrib2dAPPLE = (PFNGLMAPVERTEXATTRIB2DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2dAPPLE")) == NULL) || r; r = ((glMapVertexAttrib2fAPPLE = (PFNGLMAPVERTEXATTRIB2FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2fAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_vertex_program_evaluators */ #ifdef GL_ARB_ES2_compatibility static GLboolean _glewInit_GL_ARB_ES2_compatibility () { GLboolean r = GL_FALSE; r = ((glClearDepthf = (PFNGLCLEARDEPTHFPROC)glewGetProcAddress((const GLubyte*)"glClearDepthf")) == NULL) || r; r = ((glDepthRangef = (PFNGLDEPTHRANGEFPROC)glewGetProcAddress((const GLubyte*)"glDepthRangef")) == NULL) || r; r = ((glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC)glewGetProcAddress((const GLubyte*)"glGetShaderPrecisionFormat")) == NULL) || r; r = ((glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC)glewGetProcAddress((const GLubyte*)"glReleaseShaderCompiler")) == NULL) || r; r = ((glShaderBinary = (PFNGLSHADERBINARYPROC)glewGetProcAddress((const GLubyte*)"glShaderBinary")) == NULL) || r; return r; } #endif /* GL_ARB_ES2_compatibility */ #ifdef GL_ARB_ES3_1_compatibility static GLboolean _glewInit_GL_ARB_ES3_1_compatibility () { GLboolean r = GL_FALSE; r = ((glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierByRegion")) == NULL) || r; return r; } #endif /* GL_ARB_ES3_1_compatibility */ #ifdef GL_ARB_ES3_2_compatibility static GLboolean _glewInit_GL_ARB_ES3_2_compatibility () { GLboolean r = GL_FALSE; r = ((glPrimitiveBoundingBoxARB = (PFNGLPRIMITIVEBOUNDINGBOXARBPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveBoundingBoxARB")) == NULL) || r; return r; } #endif /* GL_ARB_ES3_2_compatibility */ #ifdef GL_ARB_base_instance static GLboolean _glewInit_GL_ARB_base_instance () { GLboolean r = GL_FALSE; r = ((glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedBaseInstance")) == NULL) || r; r = ((glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseInstance")) == NULL) || r; r = ((glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexBaseInstance")) == NULL) || r; return r; } #endif /* GL_ARB_base_instance */ #ifdef GL_ARB_bindless_texture static GLboolean _glewInit_GL_ARB_bindless_texture () { GLboolean r = GL_FALSE; r = ((glGetImageHandleARB = (PFNGLGETIMAGEHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleARB")) == NULL) || r; r = ((glGetTextureHandleARB = (PFNGLGETTEXTUREHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleARB")) == NULL) || r; r = ((glGetTextureSamplerHandleARB = (PFNGLGETTEXTURESAMPLERHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleARB")) == NULL) || r; r = ((glGetVertexAttribLui64vARB = (PFNGLGETVERTEXATTRIBLUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vARB")) == NULL) || r; r = ((glIsImageHandleResidentARB = (PFNGLISIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentARB")) == NULL) || r; r = ((glIsTextureHandleResidentARB = (PFNGLISTEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentARB")) == NULL) || r; r = ((glMakeImageHandleNonResidentARB = (PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentARB")) == NULL) || r; r = ((glMakeImageHandleResidentARB = (PFNGLMAKEIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentARB")) == NULL) || r; r = ((glMakeTextureHandleNonResidentARB = (PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentARB")) == NULL) || r; r = ((glMakeTextureHandleResidentARB = (PFNGLMAKETEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentARB")) == NULL) || r; r = ((glProgramUniformHandleui64ARB = (PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64ARB")) == NULL) || r; r = ((glProgramUniformHandleui64vARB = (PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vARB")) == NULL) || r; r = ((glUniformHandleui64ARB = (PFNGLUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64ARB")) == NULL) || r; r = ((glUniformHandleui64vARB = (PFNGLUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vARB")) == NULL) || r; r = ((glVertexAttribL1ui64ARB = (PFNGLVERTEXATTRIBL1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64ARB")) == NULL) || r; r = ((glVertexAttribL1ui64vARB = (PFNGLVERTEXATTRIBL1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vARB")) == NULL) || r; return r; } #endif /* GL_ARB_bindless_texture */ #ifdef GL_ARB_blend_func_extended static GLboolean _glewInit_GL_ARB_blend_func_extended () { GLboolean r = GL_FALSE; r = ((glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationIndexed")) == NULL) || r; r = ((glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataIndex")) == NULL) || r; return r; } #endif /* GL_ARB_blend_func_extended */ #ifdef GL_ARB_buffer_storage static GLboolean _glewInit_GL_ARB_buffer_storage () { GLboolean r = GL_FALSE; r = ((glBufferStorage = (PFNGLBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glBufferStorage")) == NULL) || r; return r; } #endif /* GL_ARB_buffer_storage */ #ifdef GL_ARB_cl_event static GLboolean _glewInit_GL_ARB_cl_event () { GLboolean r = GL_FALSE; r = ((glCreateSyncFromCLeventARB = (PFNGLCREATESYNCFROMCLEVENTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateSyncFromCLeventARB")) == NULL) || r; return r; } #endif /* GL_ARB_cl_event */ #ifdef GL_ARB_clear_buffer_object static GLboolean _glewInit_GL_ARB_clear_buffer_object () { GLboolean r = GL_FALSE; r = ((glClearBufferData = (PFNGLCLEARBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferData")) == NULL) || r; r = ((glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferSubData")) == NULL) || r; r = ((glClearNamedBufferDataEXT = (PFNGLCLEARNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferDataEXT")) == NULL) || r; r = ((glClearNamedBufferSubDataEXT = (PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubDataEXT")) == NULL) || r; return r; } #endif /* GL_ARB_clear_buffer_object */ #ifdef GL_ARB_clear_texture static GLboolean _glewInit_GL_ARB_clear_texture () { GLboolean r = GL_FALSE; r = ((glClearTexImage = (PFNGLCLEARTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexImage")) == NULL) || r; r = ((glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexSubImage")) == NULL) || r; return r; } #endif /* GL_ARB_clear_texture */ #ifdef GL_ARB_clip_control static GLboolean _glewInit_GL_ARB_clip_control () { GLboolean r = GL_FALSE; r = ((glClipControl = (PFNGLCLIPCONTROLPROC)glewGetProcAddress((const GLubyte*)"glClipControl")) == NULL) || r; return r; } #endif /* GL_ARB_clip_control */ #ifdef GL_ARB_color_buffer_float static GLboolean _glewInit_GL_ARB_color_buffer_float () { GLboolean r = GL_FALSE; r = ((glClampColorARB = (PFNGLCLAMPCOLORARBPROC)glewGetProcAddress((const GLubyte*)"glClampColorARB")) == NULL) || r; return r; } #endif /* GL_ARB_color_buffer_float */ #ifdef GL_ARB_compute_shader static GLboolean _glewInit_GL_ARB_compute_shader () { GLboolean r = GL_FALSE; r = ((glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)glewGetProcAddress((const GLubyte*)"glDispatchCompute")) == NULL) || r; r = ((glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeIndirect")) == NULL) || r; return r; } #endif /* GL_ARB_compute_shader */ #ifdef GL_ARB_compute_variable_group_size static GLboolean _glewInit_GL_ARB_compute_variable_group_size () { GLboolean r = GL_FALSE; r = ((glDispatchComputeGroupSizeARB = (PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeGroupSizeARB")) == NULL) || r; return r; } #endif /* GL_ARB_compute_variable_group_size */ #ifdef GL_ARB_copy_buffer static GLboolean _glewInit_GL_ARB_copy_buffer () { GLboolean r = GL_FALSE; r = ((glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyBufferSubData")) == NULL) || r; return r; } #endif /* GL_ARB_copy_buffer */ #ifdef GL_ARB_copy_image static GLboolean _glewInit_GL_ARB_copy_image () { GLboolean r = GL_FALSE; r = ((glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubData")) == NULL) || r; return r; } #endif /* GL_ARB_copy_image */ #ifdef GL_ARB_debug_output static GLboolean _glewInit_GL_ARB_debug_output () { GLboolean r = GL_FALSE; r = ((glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackARB")) == NULL) || r; r = ((glDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControlARB")) == NULL) || r; r = ((glDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertARB")) == NULL) || r; r = ((glGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogARB")) == NULL) || r; return r; } #endif /* GL_ARB_debug_output */ #ifdef GL_ARB_direct_state_access static GLboolean _glewInit_GL_ARB_direct_state_access () { GLboolean r = GL_FALSE; r = ((glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnit")) == NULL) || r; r = ((glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitNamedFramebuffer")) == NULL) || r; r = ((glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatus")) == NULL) || r; r = ((glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferData")) == NULL) || r; r = ((glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubData")) == NULL) || r; r = ((glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfi")) == NULL) || r; r = ((glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfv")) == NULL) || r; r = ((glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferiv")) == NULL) || r; r = ((glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferuiv")) == NULL) || r; r = ((glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1D")) == NULL) || r; r = ((glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2D")) == NULL) || r; r = ((glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3D")) == NULL) || r; r = ((glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyNamedBufferSubData")) == NULL) || r; r = ((glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1D")) == NULL) || r; r = ((glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2D")) == NULL) || r; r = ((glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3D")) == NULL) || r; r = ((glCreateBuffers = (PFNGLCREATEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateBuffers")) == NULL) || r; r = ((glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateFramebuffers")) == NULL) || r; r = ((glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramPipelines")) == NULL) || r; r = ((glCreateQueries = (PFNGLCREATEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glCreateQueries")) == NULL) || r; r = ((glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateRenderbuffers")) == NULL) || r; r = ((glCreateSamplers = (PFNGLCREATESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glCreateSamplers")) == NULL) || r; r = ((glCreateTextures = (PFNGLCREATETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glCreateTextures")) == NULL) || r; r = ((glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glCreateTransformFeedbacks")) == NULL) || r; r = ((glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glCreateVertexArrays")) == NULL) || r; r = ((glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttrib")) == NULL) || r; r = ((glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttrib")) == NULL) || r; r = ((glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRange")) == NULL) || r; r = ((glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmap")) == NULL) || r; r = ((glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImage")) == NULL) || r; r = ((glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteri64v")) == NULL) || r; r = ((glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteriv")) == NULL) || r; r = ((glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointerv")) == NULL) || r; r = ((glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubData")) == NULL) || r; r = ((glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameteriv")) == NULL) || r; r = ((glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameteriv")) == NULL) || r; r = ((glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameteriv")) == NULL) || r; r = ((glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjecti64v")) == NULL) || r; r = ((glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectiv")) == NULL) || r; r = ((glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectui64v")) == NULL) || r; r = ((glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectuiv")) == NULL) || r; r = ((glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImage")) == NULL) || r; r = ((glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfv")) == NULL) || r; r = ((glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameteriv")) == NULL) || r; r = ((glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIiv")) == NULL) || r; r = ((glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuiv")) == NULL) || r; r = ((glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfv")) == NULL) || r; r = ((glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameteriv")) == NULL) || r; r = ((glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki64_v")) == NULL) || r; r = ((glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki_v")) == NULL) || r; r = ((glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackiv")) == NULL) || r; r = ((glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexed64iv")) == NULL) || r; r = ((glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexediv")) == NULL) || r; r = ((glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayiv")) == NULL) || r; r = ((glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferData")) == NULL) || r; r = ((glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferSubData")) == NULL) || r; r = ((glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBuffer")) == NULL) || r; r = ((glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRange")) == NULL) || r; r = ((glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferData")) == NULL) || r; r = ((glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorage")) == NULL) || r; r = ((glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubData")) == NULL) || r; r = ((glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffer")) == NULL) || r; r = ((glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffers")) == NULL) || r; r = ((glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteri")) == NULL) || r; r = ((glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferReadBuffer")) == NULL) || r; r = ((glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbuffer")) == NULL) || r; r = ((glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture")) == NULL) || r; r = ((glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayer")) == NULL) || r; r = ((glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorage")) == NULL) || r; r = ((glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisample")) == NULL) || r; r = ((glTextureBuffer = (PFNGLTEXTUREBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTextureBuffer")) == NULL) || r; r = ((glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRange")) == NULL) || r; r = ((glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIiv")) == NULL) || r; r = ((glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuiv")) == NULL) || r; r = ((glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterf")) == NULL) || r; r = ((glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfv")) == NULL) || r; r = ((glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteri")) == NULL) || r; r = ((glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriv")) == NULL) || r; r = ((glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1D")) == NULL) || r; r = ((glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2D")) == NULL) || r; r = ((glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisample")) == NULL) || r; r = ((glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3D")) == NULL) || r; r = ((glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisample")) == NULL) || r; r = ((glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1D")) == NULL) || r; r = ((glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2D")) == NULL) || r; r = ((glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3D")) == NULL) || r; r = ((glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferBase")) == NULL) || r; r = ((glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferRange")) == NULL) || r; r = ((glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBuffer")) == NULL) || r; r = ((glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribBinding")) == NULL) || r; r = ((glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribFormat")) == NULL) || r; r = ((glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribIFormat")) == NULL) || r; r = ((glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribLFormat")) == NULL) || r; r = ((glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindingDivisor")) == NULL) || r; r = ((glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayElementBuffer")) == NULL) || r; r = ((glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffer")) == NULL) || r; r = ((glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffers")) == NULL) || r; return r; } #endif /* GL_ARB_direct_state_access */ #ifdef GL_ARB_draw_buffers static GLboolean _glewInit_GL_ARB_draw_buffers () { GLboolean r = GL_FALSE; r = ((glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersARB")) == NULL) || r; return r; } #endif /* GL_ARB_draw_buffers */ #ifdef GL_ARB_draw_buffers_blend static GLboolean _glewInit_GL_ARB_draw_buffers_blend () { GLboolean r = GL_FALSE; r = ((glBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiARB")) == NULL) || r; r = ((glBlendEquationiARB = (PFNGLBLENDEQUATIONIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiARB")) == NULL) || r; r = ((glBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiARB")) == NULL) || r; r = ((glBlendFunciARB = (PFNGLBLENDFUNCIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciARB")) == NULL) || r; return r; } #endif /* GL_ARB_draw_buffers_blend */ #ifdef GL_ARB_draw_elements_base_vertex static GLboolean _glewInit_GL_ARB_draw_elements_base_vertex () { GLboolean r = GL_FALSE; r = ((glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsBaseVertex")) == NULL) || r; r = ((glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertex")) == NULL) || r; r = ((glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsBaseVertex")) == NULL) || r; r = ((glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsBaseVertex")) == NULL) || r; return r; } #endif /* GL_ARB_draw_elements_base_vertex */ #ifdef GL_ARB_draw_indirect static GLboolean _glewInit_GL_ARB_draw_indirect () { GLboolean r = GL_FALSE; r = ((glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysIndirect")) == NULL) || r; r = ((glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsIndirect")) == NULL) || r; return r; } #endif /* GL_ARB_draw_indirect */ #ifdef GL_ARB_framebuffer_no_attachments static GLboolean _glewInit_GL_ARB_framebuffer_no_attachments () { GLboolean r = GL_FALSE; r = ((glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glFramebufferParameteri")) == NULL) || r; r = ((glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameteriv")) == NULL) || r; r = ((glGetNamedFramebufferParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameterivEXT")) == NULL) || r; r = ((glNamedFramebufferParameteriEXT = (PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteriEXT")) == NULL) || r; return r; } #endif /* GL_ARB_framebuffer_no_attachments */ #ifdef GL_ARB_framebuffer_object static GLboolean _glewInit_GL_ARB_framebuffer_object () { GLboolean r = GL_FALSE; r = ((glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindFramebuffer")) == NULL) || r; r = ((glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbuffer")) == NULL) || r; r = ((glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebuffer")) == NULL) || r; r = ((glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatus")) == NULL) || r; r = ((glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffers")) == NULL) || r; r = ((glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffers")) == NULL) || r; r = ((glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbuffer")) == NULL) || r; r = ((glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1D")) == NULL) || r; r = ((glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2D")) == NULL) || r; r = ((glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3D")) == NULL) || r; r = ((glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayer")) == NULL) || r; r = ((glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffers")) == NULL) || r; r = ((glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffers")) == NULL) || r; r = ((glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmap")) == NULL) || r; r = ((glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameteriv")) == NULL) || r; r = ((glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameteriv")) == NULL) || r; r = ((glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsFramebuffer")) == NULL) || r; r = ((glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbuffer")) == NULL) || r; r = ((glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorage")) == NULL) || r; r = ((glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisample")) == NULL) || r; return r; } #endif /* GL_ARB_framebuffer_object */ #ifdef GL_ARB_geometry_shader4 static GLboolean _glewInit_GL_ARB_geometry_shader4 () { GLboolean r = GL_FALSE; r = ((glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureARB")) == NULL) || r; r = ((glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceARB")) == NULL) || r; r = ((glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerARB")) == NULL) || r; r = ((glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriARB")) == NULL) || r; return r; } #endif /* GL_ARB_geometry_shader4 */ #ifdef GL_ARB_get_program_binary static GLboolean _glewInit_GL_ARB_get_program_binary () { GLboolean r = GL_FALSE; r = ((glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glGetProgramBinary")) == NULL) || r; r = ((glProgramBinary = (PFNGLPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glProgramBinary")) == NULL) || r; r = ((glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteri")) == NULL) || r; return r; } #endif /* GL_ARB_get_program_binary */ #ifdef GL_ARB_get_texture_sub_image static GLboolean _glewInit_GL_ARB_get_texture_sub_image () { GLboolean r = GL_FALSE; r = ((glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureSubImage")) == NULL) || r; r = ((glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSubImage")) == NULL) || r; return r; } #endif /* GL_ARB_get_texture_sub_image */ #ifdef GL_ARB_gl_spirv static GLboolean _glewInit_GL_ARB_gl_spirv () { GLboolean r = GL_FALSE; r = ((glSpecializeShaderARB = (PFNGLSPECIALIZESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glSpecializeShaderARB")) == NULL) || r; return r; } #endif /* GL_ARB_gl_spirv */ #ifdef GL_ARB_gpu_shader_fp64 static GLboolean _glewInit_GL_ARB_gpu_shader_fp64 () { GLboolean r = GL_FALSE; r = ((glGetUniformdv = (PFNGLGETUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformdv")) == NULL) || r; r = ((glUniform1d = (PFNGLUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glUniform1d")) == NULL) || r; r = ((glUniform1dv = (PFNGLUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glUniform1dv")) == NULL) || r; r = ((glUniform2d = (PFNGLUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glUniform2d")) == NULL) || r; r = ((glUniform2dv = (PFNGLUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glUniform2dv")) == NULL) || r; r = ((glUniform3d = (PFNGLUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glUniform3d")) == NULL) || r; r = ((glUniform3dv = (PFNGLUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glUniform3dv")) == NULL) || r; r = ((glUniform4d = (PFNGLUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glUniform4d")) == NULL) || r; r = ((glUniform4dv = (PFNGLUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glUniform4dv")) == NULL) || r; r = ((glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2dv")) == NULL) || r; r = ((glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3dv")) == NULL) || r; r = ((glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4dv")) == NULL) || r; r = ((glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3dv")) == NULL) || r; r = ((glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2dv")) == NULL) || r; r = ((glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4dv")) == NULL) || r; r = ((glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4dv")) == NULL) || r; r = ((glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2dv")) == NULL) || r; r = ((glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3dv")) == NULL) || r; return r; } #endif /* GL_ARB_gpu_shader_fp64 */ #ifdef GL_ARB_gpu_shader_int64 static GLboolean _glewInit_GL_ARB_gpu_shader_int64 () { GLboolean r = GL_FALSE; r = ((glGetUniformi64vARB = (PFNGLGETUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vARB")) == NULL) || r; r = ((glGetUniformui64vARB = (PFNGLGETUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vARB")) == NULL) || r; r = ((glGetnUniformi64vARB = (PFNGLGETNUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformi64vARB")) == NULL) || r; r = ((glGetnUniformui64vARB = (PFNGLGETNUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformui64vARB")) == NULL) || r; r = ((glProgramUniform1i64ARB = (PFNGLPROGRAMUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64ARB")) == NULL) || r; r = ((glProgramUniform1i64vARB = (PFNGLPROGRAMUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vARB")) == NULL) || r; r = ((glProgramUniform1ui64ARB = (PFNGLPROGRAMUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64ARB")) == NULL) || r; r = ((glProgramUniform1ui64vARB = (PFNGLPROGRAMUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vARB")) == NULL) || r; r = ((glProgramUniform2i64ARB = (PFNGLPROGRAMUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64ARB")) == NULL) || r; r = ((glProgramUniform2i64vARB = (PFNGLPROGRAMUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vARB")) == NULL) || r; r = ((glProgramUniform2ui64ARB = (PFNGLPROGRAMUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64ARB")) == NULL) || r; r = ((glProgramUniform2ui64vARB = (PFNGLPROGRAMUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vARB")) == NULL) || r; r = ((glProgramUniform3i64ARB = (PFNGLPROGRAMUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64ARB")) == NULL) || r; r = ((glProgramUniform3i64vARB = (PFNGLPROGRAMUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vARB")) == NULL) || r; r = ((glProgramUniform3ui64ARB = (PFNGLPROGRAMUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64ARB")) == NULL) || r; r = ((glProgramUniform3ui64vARB = (PFNGLPROGRAMUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vARB")) == NULL) || r; r = ((glProgramUniform4i64ARB = (PFNGLPROGRAMUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64ARB")) == NULL) || r; r = ((glProgramUniform4i64vARB = (PFNGLPROGRAMUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vARB")) == NULL) || r; r = ((glProgramUniform4ui64ARB = (PFNGLPROGRAMUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64ARB")) == NULL) || r; r = ((glProgramUniform4ui64vARB = (PFNGLPROGRAMUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vARB")) == NULL) || r; r = ((glUniform1i64ARB = (PFNGLUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64ARB")) == NULL) || r; r = ((glUniform1i64vARB = (PFNGLUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vARB")) == NULL) || r; r = ((glUniform1ui64ARB = (PFNGLUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64ARB")) == NULL) || r; r = ((glUniform1ui64vARB = (PFNGLUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vARB")) == NULL) || r; r = ((glUniform2i64ARB = (PFNGLUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64ARB")) == NULL) || r; r = ((glUniform2i64vARB = (PFNGLUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vARB")) == NULL) || r; r = ((glUniform2ui64ARB = (PFNGLUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64ARB")) == NULL) || r; r = ((glUniform2ui64vARB = (PFNGLUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vARB")) == NULL) || r; r = ((glUniform3i64ARB = (PFNGLUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64ARB")) == NULL) || r; r = ((glUniform3i64vARB = (PFNGLUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vARB")) == NULL) || r; r = ((glUniform3ui64ARB = (PFNGLUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64ARB")) == NULL) || r; r = ((glUniform3ui64vARB = (PFNGLUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vARB")) == NULL) || r; r = ((glUniform4i64ARB = (PFNGLUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64ARB")) == NULL) || r; r = ((glUniform4i64vARB = (PFNGLUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vARB")) == NULL) || r; r = ((glUniform4ui64ARB = (PFNGLUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64ARB")) == NULL) || r; r = ((glUniform4ui64vARB = (PFNGLUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vARB")) == NULL) || r; return r; } #endif /* GL_ARB_gpu_shader_int64 */ #ifdef GL_ARB_imaging static GLboolean _glewInit_GL_ARB_imaging () { GLboolean r = GL_FALSE; r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; r = ((glColorSubTable = (PFNGLCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorSubTable")) == NULL) || r; r = ((glColorTable = (PFNGLCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorTable")) == NULL) || r; r = ((glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfv")) == NULL) || r; r = ((glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameteriv")) == NULL) || r; r = ((glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1D")) == NULL) || r; r = ((glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2D")) == NULL) || r; r = ((glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterf")) == NULL) || r; r = ((glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfv")) == NULL) || r; r = ((glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteri")) == NULL) || r; r = ((glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriv")) == NULL) || r; r = ((glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTable")) == NULL) || r; r = ((glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTable")) == NULL) || r; r = ((glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1D")) == NULL) || r; r = ((glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2D")) == NULL) || r; r = ((glGetColorTable = (PFNGLGETCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glGetColorTable")) == NULL) || r; r = ((glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfv")) == NULL) || r; r = ((glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameteriv")) == NULL) || r; r = ((glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilter")) == NULL) || r; r = ((glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfv")) == NULL) || r; r = ((glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameteriv")) == NULL) || r; r = ((glGetHistogram = (PFNGLGETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glGetHistogram")) == NULL) || r; r = ((glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfv")) == NULL) || r; r = ((glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameteriv")) == NULL) || r; r = ((glGetMinmax = (PFNGLGETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glGetMinmax")) == NULL) || r; r = ((glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfv")) == NULL) || r; r = ((glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameteriv")) == NULL) || r; r = ((glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilter")) == NULL) || r; r = ((glHistogram = (PFNGLHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glHistogram")) == NULL) || r; r = ((glMinmax = (PFNGLMINMAXPROC)glewGetProcAddress((const GLubyte*)"glMinmax")) == NULL) || r; r = ((glResetHistogram = (PFNGLRESETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glResetHistogram")) == NULL) || r; r = ((glResetMinmax = (PFNGLRESETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glResetMinmax")) == NULL) || r; r = ((glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2D")) == NULL) || r; return r; } #endif /* GL_ARB_imaging */ #ifdef GL_ARB_indirect_parameters static GLboolean _glewInit_GL_ARB_indirect_parameters () { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysIndirectCountARB = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectCountARB")) == NULL) || r; r = ((glMultiDrawElementsIndirectCountARB = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectCountARB")) == NULL) || r; return r; } #endif /* GL_ARB_indirect_parameters */ #ifdef GL_ARB_instanced_arrays static GLboolean _glewInit_GL_ARB_instanced_arrays () { GLboolean r = GL_FALSE; r = ((glDrawArraysInstancedARB = (PFNGLDRAWARRAYSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedARB")) == NULL) || r; r = ((glDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedARB")) == NULL) || r; r = ((glVertexAttribDivisorARB = (PFNGLVERTEXATTRIBDIVISORARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorARB")) == NULL) || r; return r; } #endif /* GL_ARB_instanced_arrays */ #ifdef GL_ARB_internalformat_query static GLboolean _glewInit_GL_ARB_internalformat_query () { GLboolean r = GL_FALSE; r = ((glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformativ")) == NULL) || r; return r; } #endif /* GL_ARB_internalformat_query */ #ifdef GL_ARB_internalformat_query2 static GLboolean _glewInit_GL_ARB_internalformat_query2 () { GLboolean r = GL_FALSE; r = ((glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformati64v")) == NULL) || r; return r; } #endif /* GL_ARB_internalformat_query2 */ #ifdef GL_ARB_invalidate_subdata static GLboolean _glewInit_GL_ARB_invalidate_subdata () { GLboolean r = GL_FALSE; r = ((glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferData")) == NULL) || r; r = ((glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferSubData")) == NULL) || r; r = ((glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateFramebuffer")) == NULL) || r; r = ((glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateSubFramebuffer")) == NULL) || r; r = ((glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexImage")) == NULL) || r; r = ((glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexSubImage")) == NULL) || r; return r; } #endif /* GL_ARB_invalidate_subdata */ #ifdef GL_ARB_map_buffer_range static GLboolean _glewInit_GL_ARB_map_buffer_range () { GLboolean r = GL_FALSE; r = ((glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRange")) == NULL) || r; r = ((glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapBufferRange")) == NULL) || r; return r; } #endif /* GL_ARB_map_buffer_range */ #ifdef GL_ARB_matrix_palette static GLboolean _glewInit_GL_ARB_matrix_palette () { GLboolean r = GL_FALSE; r = ((glCurrentPaletteMatrixARB = (PFNGLCURRENTPALETTEMATRIXARBPROC)glewGetProcAddress((const GLubyte*)"glCurrentPaletteMatrixARB")) == NULL) || r; r = ((glMatrixIndexPointerARB = (PFNGLMATRIXINDEXPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexPointerARB")) == NULL) || r; r = ((glMatrixIndexubvARB = (PFNGLMATRIXINDEXUBVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexubvARB")) == NULL) || r; r = ((glMatrixIndexuivARB = (PFNGLMATRIXINDEXUIVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexuivARB")) == NULL) || r; r = ((glMatrixIndexusvARB = (PFNGLMATRIXINDEXUSVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexusvARB")) == NULL) || r; return r; } #endif /* GL_ARB_matrix_palette */ #ifdef GL_ARB_multi_bind static GLboolean _glewInit_GL_ARB_multi_bind () { GLboolean r = GL_FALSE; r = ((glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersBase")) == NULL) || r; r = ((glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersRange")) == NULL) || r; r = ((glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextures")) == NULL) || r; r = ((glBindSamplers = (PFNGLBINDSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glBindSamplers")) == NULL) || r; r = ((glBindTextures = (PFNGLBINDTEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindTextures")) == NULL) || r; r = ((glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffers")) == NULL) || r; return r; } #endif /* GL_ARB_multi_bind */ #ifdef GL_ARB_multi_draw_indirect static GLboolean _glewInit_GL_ARB_multi_draw_indirect () { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirect")) == NULL) || r; r = ((glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirect")) == NULL) || r; return r; } #endif /* GL_ARB_multi_draw_indirect */ #ifdef GL_ARB_multisample static GLboolean _glewInit_GL_ARB_multisample () { GLboolean r = GL_FALSE; r = ((glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverageARB")) == NULL) || r; return r; } #endif /* GL_ARB_multisample */ #ifdef GL_ARB_multitexture static GLboolean _glewInit_GL_ARB_multitexture () { GLboolean r = GL_FALSE; r = ((glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glActiveTextureARB")) == NULL) || r; r = ((glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTextureARB")) == NULL) || r; r = ((glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dARB")) == NULL) || r; r = ((glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dvARB")) == NULL) || r; r = ((glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fARB")) == NULL) || r; r = ((glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fvARB")) == NULL) || r; r = ((glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iARB")) == NULL) || r; r = ((glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1ivARB")) == NULL) || r; r = ((glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sARB")) == NULL) || r; r = ((glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1svARB")) == NULL) || r; r = ((glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dARB")) == NULL) || r; r = ((glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dvARB")) == NULL) || r; r = ((glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fARB")) == NULL) || r; r = ((glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fvARB")) == NULL) || r; r = ((glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iARB")) == NULL) || r; r = ((glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2ivARB")) == NULL) || r; r = ((glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sARB")) == NULL) || r; r = ((glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2svARB")) == NULL) || r; r = ((glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dARB")) == NULL) || r; r = ((glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dvARB")) == NULL) || r; r = ((glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fARB")) == NULL) || r; r = ((glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fvARB")) == NULL) || r; r = ((glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iARB")) == NULL) || r; r = ((glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3ivARB")) == NULL) || r; r = ((glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sARB")) == NULL) || r; r = ((glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3svARB")) == NULL) || r; r = ((glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dARB")) == NULL) || r; r = ((glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dvARB")) == NULL) || r; r = ((glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fARB")) == NULL) || r; r = ((glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fvARB")) == NULL) || r; r = ((glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iARB")) == NULL) || r; r = ((glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4ivARB")) == NULL) || r; r = ((glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sARB")) == NULL) || r; r = ((glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4svARB")) == NULL) || r; return r; } #endif /* GL_ARB_multitexture */ #ifdef GL_ARB_occlusion_query static GLboolean _glewInit_GL_ARB_occlusion_query () { GLboolean r = GL_FALSE; r = ((glBeginQueryARB = (PFNGLBEGINQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryARB")) == NULL) || r; r = ((glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesARB")) == NULL) || r; r = ((glEndQueryARB = (PFNGLENDQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glEndQueryARB")) == NULL) || r; r = ((glGenQueriesARB = (PFNGLGENQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesARB")) == NULL) || r; r = ((glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivARB")) == NULL) || r; r = ((glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivARB")) == NULL) || r; r = ((glGetQueryivARB = (PFNGLGETQUERYIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivARB")) == NULL) || r; r = ((glIsQueryARB = (PFNGLISQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glIsQueryARB")) == NULL) || r; return r; } #endif /* GL_ARB_occlusion_query */ #ifdef GL_ARB_parallel_shader_compile static GLboolean _glewInit_GL_ARB_parallel_shader_compile () { GLboolean r = GL_FALSE; r = ((glMaxShaderCompilerThreadsARB = (PFNGLMAXSHADERCOMPILERTHREADSARBPROC)glewGetProcAddress((const GLubyte*)"glMaxShaderCompilerThreadsARB")) == NULL) || r; return r; } #endif /* GL_ARB_parallel_shader_compile */ #ifdef GL_ARB_point_parameters static GLboolean _glewInit_GL_ARB_point_parameters () { GLboolean r = GL_FALSE; r = ((glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfARB")) == NULL) || r; r = ((glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvARB")) == NULL) || r; return r; } #endif /* GL_ARB_point_parameters */ #ifdef GL_ARB_polygon_offset_clamp static GLboolean _glewInit_GL_ARB_polygon_offset_clamp () { GLboolean r = GL_FALSE; r = ((glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetClamp")) == NULL) || r; return r; } #endif /* GL_ARB_polygon_offset_clamp */ #ifdef GL_ARB_program_interface_query static GLboolean _glewInit_GL_ARB_program_interface_query () { GLboolean r = GL_FALSE; r = ((glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInterfaceiv")) == NULL) || r; r = ((glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceIndex")) == NULL) || r; r = ((glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocation")) == NULL) || r; r = ((glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocationIndex")) == NULL) || r; r = ((glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceName")) == NULL) || r; r = ((glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceiv")) == NULL) || r; return r; } #endif /* GL_ARB_program_interface_query */ #ifdef GL_ARB_provoking_vertex static GLboolean _glewInit_GL_ARB_provoking_vertex () { GLboolean r = GL_FALSE; r = ((glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertex")) == NULL) || r; return r; } #endif /* GL_ARB_provoking_vertex */ #ifdef GL_ARB_robustness static GLboolean _glewInit_GL_ARB_robustness () { GLboolean r = GL_FALSE; r = ((glGetGraphicsResetStatusARB = (PFNGLGETGRAPHICSRESETSTATUSARBPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatusARB")) == NULL) || r; r = ((glGetnColorTableARB = (PFNGLGETNCOLORTABLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnColorTableARB")) == NULL) || r; r = ((glGetnCompressedTexImageARB = (PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImageARB")) == NULL) || r; r = ((glGetnConvolutionFilterARB = (PFNGLGETNCONVOLUTIONFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnConvolutionFilterARB")) == NULL) || r; r = ((glGetnHistogramARB = (PFNGLGETNHISTOGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glGetnHistogramARB")) == NULL) || r; r = ((glGetnMapdvARB = (PFNGLGETNMAPDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapdvARB")) == NULL) || r; r = ((glGetnMapfvARB = (PFNGLGETNMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapfvARB")) == NULL) || r; r = ((glGetnMapivARB = (PFNGLGETNMAPIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapivARB")) == NULL) || r; r = ((glGetnMinmaxARB = (PFNGLGETNMINMAXARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMinmaxARB")) == NULL) || r; r = ((glGetnPixelMapfvARB = (PFNGLGETNPIXELMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapfvARB")) == NULL) || r; r = ((glGetnPixelMapuivARB = (PFNGLGETNPIXELMAPUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapuivARB")) == NULL) || r; r = ((glGetnPixelMapusvARB = (PFNGLGETNPIXELMAPUSVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapusvARB")) == NULL) || r; r = ((glGetnPolygonStippleARB = (PFNGLGETNPOLYGONSTIPPLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPolygonStippleARB")) == NULL) || r; r = ((glGetnSeparableFilterARB = (PFNGLGETNSEPARABLEFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnSeparableFilterARB")) == NULL) || r; r = ((glGetnTexImageARB = (PFNGLGETNTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImageARB")) == NULL) || r; r = ((glGetnUniformdvARB = (PFNGLGETNUNIFORMDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdvARB")) == NULL) || r; r = ((glGetnUniformfvARB = (PFNGLGETNUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfvARB")) == NULL) || r; r = ((glGetnUniformivARB = (PFNGLGETNUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformivARB")) == NULL) || r; r = ((glGetnUniformuivARB = (PFNGLGETNUNIFORMUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuivARB")) == NULL) || r; r = ((glReadnPixelsARB = (PFNGLREADNPIXELSARBPROC)glewGetProcAddress((const GLubyte*)"glReadnPixelsARB")) == NULL) || r; return r; } #endif /* GL_ARB_robustness */ #ifdef GL_ARB_sample_locations static GLboolean _glewInit_GL_ARB_sample_locations () { GLboolean r = GL_FALSE; r = ((glFramebufferSampleLocationsfvARB = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvARB")) == NULL) || r; r = ((glNamedFramebufferSampleLocationsfvARB = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvARB")) == NULL) || r; return r; } #endif /* GL_ARB_sample_locations */ #ifdef GL_ARB_sample_shading static GLboolean _glewInit_GL_ARB_sample_shading () { GLboolean r = GL_FALSE; r = ((glMinSampleShadingARB = (PFNGLMINSAMPLESHADINGARBPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShadingARB")) == NULL) || r; return r; } #endif /* GL_ARB_sample_shading */ #ifdef GL_ARB_sampler_objects static GLboolean _glewInit_GL_ARB_sampler_objects () { GLboolean r = GL_FALSE; r = ((glBindSampler = (PFNGLBINDSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glBindSampler")) == NULL) || r; r = ((glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteSamplers")) == NULL) || r; r = ((glGenSamplers = (PFNGLGENSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glGenSamplers")) == NULL) || r; r = ((glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIiv")) == NULL) || r; r = ((glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIuiv")) == NULL) || r; r = ((glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterfv")) == NULL) || r; r = ((glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameteriv")) == NULL) || r; r = ((glIsSampler = (PFNGLISSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glIsSampler")) == NULL) || r; r = ((glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIiv")) == NULL) || r; r = ((glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIuiv")) == NULL) || r; r = ((glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterf")) == NULL) || r; r = ((glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterfv")) == NULL) || r; r = ((glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteri")) == NULL) || r; r = ((glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteriv")) == NULL) || r; return r; } #endif /* GL_ARB_sampler_objects */ #ifdef GL_ARB_separate_shader_objects static GLboolean _glewInit_GL_ARB_separate_shader_objects () { GLboolean r = GL_FALSE; r = ((glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glActiveShaderProgram")) == NULL) || r; r = ((glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glBindProgramPipeline")) == NULL) || r; r = ((glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramv")) == NULL) || r; r = ((glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramPipelines")) == NULL) || r; r = ((glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glGenProgramPipelines")) == NULL) || r; r = ((glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineInfoLog")) == NULL) || r; r = ((glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineiv")) == NULL) || r; r = ((glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glIsProgramPipeline")) == NULL) || r; r = ((glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1d")) == NULL) || r; r = ((glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dv")) == NULL) || r; r = ((glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1f")) == NULL) || r; r = ((glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fv")) == NULL) || r; r = ((glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i")) == NULL) || r; r = ((glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iv")) == NULL) || r; r = ((glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui")) == NULL) || r; r = ((glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiv")) == NULL) || r; r = ((glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2d")) == NULL) || r; r = ((glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dv")) == NULL) || r; r = ((glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2f")) == NULL) || r; r = ((glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fv")) == NULL) || r; r = ((glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i")) == NULL) || r; r = ((glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iv")) == NULL) || r; r = ((glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui")) == NULL) || r; r = ((glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiv")) == NULL) || r; r = ((glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3d")) == NULL) || r; r = ((glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dv")) == NULL) || r; r = ((glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3f")) == NULL) || r; r = ((glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fv")) == NULL) || r; r = ((glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i")) == NULL) || r; r = ((glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iv")) == NULL) || r; r = ((glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui")) == NULL) || r; r = ((glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiv")) == NULL) || r; r = ((glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4d")) == NULL) || r; r = ((glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dv")) == NULL) || r; r = ((glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4f")) == NULL) || r; r = ((glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fv")) == NULL) || r; r = ((glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i")) == NULL) || r; r = ((glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iv")) == NULL) || r; r = ((glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui")) == NULL) || r; r = ((glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiv")) == NULL) || r; r = ((glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2dv")) == NULL) || r; r = ((glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fv")) == NULL) || r; r = ((glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3dv")) == NULL) || r; r = ((glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fv")) == NULL) || r; r = ((glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4dv")) == NULL) || r; r = ((glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fv")) == NULL) || r; r = ((glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3dv")) == NULL) || r; r = ((glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fv")) == NULL) || r; r = ((glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2dv")) == NULL) || r; r = ((glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fv")) == NULL) || r; r = ((glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4dv")) == NULL) || r; r = ((glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fv")) == NULL) || r; r = ((glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4dv")) == NULL) || r; r = ((glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fv")) == NULL) || r; r = ((glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2dv")) == NULL) || r; r = ((glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fv")) == NULL) || r; r = ((glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3dv")) == NULL) || r; r = ((glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fv")) == NULL) || r; r = ((glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC)glewGetProcAddress((const GLubyte*)"glUseProgramStages")) == NULL) || r; r = ((glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramPipeline")) == NULL) || r; return r; } #endif /* GL_ARB_separate_shader_objects */ #ifdef GL_ARB_shader_atomic_counters static GLboolean _glewInit_GL_ARB_shader_atomic_counters () { GLboolean r = GL_FALSE; r = ((glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAtomicCounterBufferiv")) == NULL) || r; return r; } #endif /* GL_ARB_shader_atomic_counters */ #ifdef GL_ARB_shader_image_load_store static GLboolean _glewInit_GL_ARB_shader_image_load_store () { GLboolean r = GL_FALSE; r = ((glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glBindImageTexture")) == NULL) || r; r = ((glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrier")) == NULL) || r; return r; } #endif /* GL_ARB_shader_image_load_store */ #ifdef GL_ARB_shader_objects static GLboolean _glewInit_GL_ARB_shader_objects () { GLboolean r = GL_FALSE; r = ((glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glAttachObjectARB")) == NULL) || r; r = ((glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderARB")) == NULL) || r; r = ((glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramObjectARB")) == NULL) || r; r = ((glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderObjectARB")) == NULL) || r; r = ((glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteObjectARB")) == NULL) || r; r = ((glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDetachObjectARB")) == NULL) || r; r = ((glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformARB")) == NULL) || r; r = ((glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedObjectsARB")) == NULL) || r; r = ((glGetHandleARB = (PFNGLGETHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetHandleARB")) == NULL) || r; r = ((glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetInfoLogARB")) == NULL) || r; r = ((glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterfvARB")) == NULL) || r; r = ((glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivARB")) == NULL) || r; r = ((glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSourceARB")) == NULL) || r; r = ((glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocationARB")) == NULL) || r; r = ((glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfvARB")) == NULL) || r; r = ((glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformivARB")) == NULL) || r; r = ((glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glLinkProgramARB")) == NULL) || r; r = ((glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glShaderSourceARB")) == NULL) || r; r = ((glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fARB")) == NULL) || r; r = ((glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fvARB")) == NULL) || r; r = ((glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1iARB")) == NULL) || r; r = ((glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ivARB")) == NULL) || r; r = ((glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fARB")) == NULL) || r; r = ((glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fvARB")) == NULL) || r; r = ((glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2iARB")) == NULL) || r; r = ((glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ivARB")) == NULL) || r; r = ((glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fARB")) == NULL) || r; r = ((glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fvARB")) == NULL) || r; r = ((glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3iARB")) == NULL) || r; r = ((glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ivARB")) == NULL) || r; r = ((glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fARB")) == NULL) || r; r = ((glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fvARB")) == NULL) || r; r = ((glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4iARB")) == NULL) || r; r = ((glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ivARB")) == NULL) || r; r = ((glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fvARB")) == NULL) || r; r = ((glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fvARB")) == NULL) || r; r = ((glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fvARB")) == NULL) || r; r = ((glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glUseProgramObjectARB")) == NULL) || r; r = ((glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramARB")) == NULL) || r; return r; } #endif /* GL_ARB_shader_objects */ #ifdef GL_ARB_shader_storage_buffer_object static GLboolean _glewInit_GL_ARB_shader_storage_buffer_object () { GLboolean r = GL_FALSE; r = ((glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glShaderStorageBlockBinding")) == NULL) || r; return r; } #endif /* GL_ARB_shader_storage_buffer_object */ #ifdef GL_ARB_shader_subroutine static GLboolean _glewInit_GL_ARB_shader_subroutine () { GLboolean r = GL_FALSE; r = ((glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineName")) == NULL) || r; r = ((glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformName")) == NULL) || r; r = ((glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformiv")) == NULL) || r; r = ((glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStageiv")) == NULL) || r; r = ((glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineIndex")) == NULL) || r; r = ((glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineUniformLocation")) == NULL) || r; r = ((glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformSubroutineuiv")) == NULL) || r; r = ((glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC)glewGetProcAddress((const GLubyte*)"glUniformSubroutinesuiv")) == NULL) || r; return r; } #endif /* GL_ARB_shader_subroutine */ #ifdef GL_ARB_shading_language_include static GLboolean _glewInit_GL_ARB_shading_language_include () { GLboolean r = GL_FALSE; r = ((glCompileShaderIncludeARB = (PFNGLCOMPILESHADERINCLUDEARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderIncludeARB")) == NULL) || r; r = ((glDeleteNamedStringARB = (PFNGLDELETENAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamedStringARB")) == NULL) || r; r = ((glGetNamedStringARB = (PFNGLGETNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringARB")) == NULL) || r; r = ((glGetNamedStringivARB = (PFNGLGETNAMEDSTRINGIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringivARB")) == NULL) || r; r = ((glIsNamedStringARB = (PFNGLISNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glIsNamedStringARB")) == NULL) || r; r = ((glNamedStringARB = (PFNGLNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glNamedStringARB")) == NULL) || r; return r; } #endif /* GL_ARB_shading_language_include */ #ifdef GL_ARB_sparse_buffer static GLboolean _glewInit_GL_ARB_sparse_buffer () { GLboolean r = GL_FALSE; r = ((glBufferPageCommitmentARB = (PFNGLBUFFERPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glBufferPageCommitmentARB")) == NULL) || r; return r; } #endif /* GL_ARB_sparse_buffer */ #ifdef GL_ARB_sparse_texture static GLboolean _glewInit_GL_ARB_sparse_texture () { GLboolean r = GL_FALSE; r = ((glTexPageCommitmentARB = (PFNGLTEXPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glTexPageCommitmentARB")) == NULL) || r; return r; } #endif /* GL_ARB_sparse_texture */ #ifdef GL_ARB_sync static GLboolean _glewInit_GL_ARB_sync () { GLboolean r = GL_FALSE; r = ((glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSync")) == NULL) || r; r = ((glDeleteSync = (PFNGLDELETESYNCPROC)glewGetProcAddress((const GLubyte*)"glDeleteSync")) == NULL) || r; r = ((glFenceSync = (PFNGLFENCESYNCPROC)glewGetProcAddress((const GLubyte*)"glFenceSync")) == NULL) || r; r = ((glGetInteger64v = (PFNGLGETINTEGER64VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64v")) == NULL) || r; r = ((glGetSynciv = (PFNGLGETSYNCIVPROC)glewGetProcAddress((const GLubyte*)"glGetSynciv")) == NULL) || r; r = ((glIsSync = (PFNGLISSYNCPROC)glewGetProcAddress((const GLubyte*)"glIsSync")) == NULL) || r; r = ((glWaitSync = (PFNGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glWaitSync")) == NULL) || r; return r; } #endif /* GL_ARB_sync */ #ifdef GL_ARB_tessellation_shader static GLboolean _glewInit_GL_ARB_tessellation_shader () { GLboolean r = GL_FALSE; r = ((glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPatchParameterfv")) == NULL) || r; r = ((glPatchParameteri = (PFNGLPATCHPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPatchParameteri")) == NULL) || r; return r; } #endif /* GL_ARB_tessellation_shader */ #ifdef GL_ARB_texture_barrier static GLboolean _glewInit_GL_ARB_texture_barrier () { GLboolean r = GL_FALSE; r = ((glTextureBarrier = (PFNGLTEXTUREBARRIERPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrier")) == NULL) || r; return r; } #endif /* GL_ARB_texture_barrier */ #ifdef GL_ARB_texture_buffer_object static GLboolean _glewInit_GL_ARB_texture_buffer_object () { GLboolean r = GL_FALSE; r = ((glTexBufferARB = (PFNGLTEXBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glTexBufferARB")) == NULL) || r; return r; } #endif /* GL_ARB_texture_buffer_object */ #ifdef GL_ARB_texture_buffer_range static GLboolean _glewInit_GL_ARB_texture_buffer_range () { GLboolean r = GL_FALSE; r = ((glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTexBufferRange")) == NULL) || r; r = ((glTextureBufferRangeEXT = (PFNGLTEXTUREBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRangeEXT")) == NULL) || r; return r; } #endif /* GL_ARB_texture_buffer_range */ #ifdef GL_ARB_texture_compression static GLboolean _glewInit_GL_ARB_texture_compression () { GLboolean r = GL_FALSE; r = ((glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1DARB")) == NULL) || r; r = ((glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2DARB")) == NULL) || r; r = ((glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DARB")) == NULL) || r; r = ((glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1DARB")) == NULL) || r; r = ((glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2DARB")) == NULL) || r; r = ((glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DARB")) == NULL) || r; r = ((glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImageARB")) == NULL) || r; return r; } #endif /* GL_ARB_texture_compression */ #ifdef GL_ARB_texture_multisample static GLboolean _glewInit_GL_ARB_texture_multisample () { GLboolean r = GL_FALSE; r = ((glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefv")) == NULL) || r; r = ((glSampleMaski = (PFNGLSAMPLEMASKIPROC)glewGetProcAddress((const GLubyte*)"glSampleMaski")) == NULL) || r; r = ((glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisample")) == NULL) || r; r = ((glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisample")) == NULL) || r; return r; } #endif /* GL_ARB_texture_multisample */ #ifdef GL_ARB_texture_storage static GLboolean _glewInit_GL_ARB_texture_storage () { GLboolean r = GL_FALSE; r = ((glTexStorage1D = (PFNGLTEXSTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage1D")) == NULL) || r; r = ((glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2D")) == NULL) || r; r = ((glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3D")) == NULL) || r; return r; } #endif /* GL_ARB_texture_storage */ #ifdef GL_ARB_texture_storage_multisample static GLboolean _glewInit_GL_ARB_texture_storage_multisample () { GLboolean r = GL_FALSE; r = ((glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2DMultisample")) == NULL) || r; r = ((glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3DMultisample")) == NULL) || r; r = ((glTextureStorage2DMultisampleEXT = (PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisampleEXT")) == NULL) || r; r = ((glTextureStorage3DMultisampleEXT = (PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisampleEXT")) == NULL) || r; return r; } #endif /* GL_ARB_texture_storage_multisample */ #ifdef GL_ARB_texture_view static GLboolean _glewInit_GL_ARB_texture_view () { GLboolean r = GL_FALSE; r = ((glTextureView = (PFNGLTEXTUREVIEWPROC)glewGetProcAddress((const GLubyte*)"glTextureView")) == NULL) || r; return r; } #endif /* GL_ARB_texture_view */ #ifdef GL_ARB_timer_query static GLboolean _glewInit_GL_ARB_timer_query () { GLboolean r = GL_FALSE; r = ((glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64v")) == NULL) || r; r = ((glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64v")) == NULL) || r; r = ((glQueryCounter = (PFNGLQUERYCOUNTERPROC)glewGetProcAddress((const GLubyte*)"glQueryCounter")) == NULL) || r; return r; } #endif /* GL_ARB_timer_query */ #ifdef GL_ARB_transform_feedback2 static GLboolean _glewInit_GL_ARB_transform_feedback2 () { GLboolean r = GL_FALSE; r = ((glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedback")) == NULL) || r; r = ((glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacks")) == NULL) || r; r = ((glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedback")) == NULL) || r; r = ((glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacks")) == NULL) || r; r = ((glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedback")) == NULL) || r; r = ((glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedback")) == NULL) || r; r = ((glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedback")) == NULL) || r; return r; } #endif /* GL_ARB_transform_feedback2 */ #ifdef GL_ARB_transform_feedback3 static GLboolean _glewInit_GL_ARB_transform_feedback3 () { GLboolean r = GL_FALSE; r = ((glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryIndexed")) == NULL) || r; r = ((glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStream")) == NULL) || r; r = ((glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glEndQueryIndexed")) == NULL) || r; r = ((glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryIndexediv")) == NULL) || r; return r; } #endif /* GL_ARB_transform_feedback3 */ #ifdef GL_ARB_transform_feedback_instanced static GLboolean _glewInit_GL_ARB_transform_feedback_instanced () { GLboolean r = GL_FALSE; r = ((glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackInstanced")) == NULL) || r; r = ((glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStreamInstanced")) == NULL) || r; return r; } #endif /* GL_ARB_transform_feedback_instanced */ #ifdef GL_ARB_transpose_matrix static GLboolean _glewInit_GL_ARB_transpose_matrix () { GLboolean r = GL_FALSE; r = ((glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixdARB")) == NULL) || r; r = ((glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixfARB")) == NULL) || r; r = ((glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixdARB")) == NULL) || r; r = ((glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixfARB")) == NULL) || r; return r; } #endif /* GL_ARB_transpose_matrix */ #ifdef GL_ARB_uniform_buffer_object static GLboolean _glewInit_GL_ARB_uniform_buffer_object () { GLboolean r = GL_FALSE; r = ((glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBase")) == NULL) || r; r = ((glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRange")) == NULL) || r; r = ((glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockName")) == NULL) || r; r = ((glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockiv")) == NULL) || r; r = ((glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformName")) == NULL) || r; r = ((glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformsiv")) == NULL) || r; r = ((glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_v")) == NULL) || r; r = ((glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBlockIndex")) == NULL) || r; r = ((glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)glewGetProcAddress((const GLubyte*)"glGetUniformIndices")) == NULL) || r; r = ((glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glUniformBlockBinding")) == NULL) || r; return r; } #endif /* GL_ARB_uniform_buffer_object */ #ifdef GL_ARB_vertex_array_object static GLboolean _glewInit_GL_ARB_vertex_array_object () { GLboolean r = GL_FALSE; r = ((glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArray")) == NULL) || r; r = ((glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArrays")) == NULL) || r; r = ((glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArrays")) == NULL) || r; r = ((glIsVertexArray = (PFNGLISVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArray")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_array_object */ #ifdef GL_ARB_vertex_attrib_64bit static GLboolean _glewInit_GL_ARB_vertex_attrib_64bit () { GLboolean r = GL_FALSE; r = ((glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdv")) == NULL) || r; r = ((glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1d")) == NULL) || r; r = ((glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dv")) == NULL) || r; r = ((glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2d")) == NULL) || r; r = ((glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dv")) == NULL) || r; r = ((glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3d")) == NULL) || r; r = ((glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dv")) == NULL) || r; r = ((glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4d")) == NULL) || r; r = ((glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dv")) == NULL) || r; r = ((glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointer")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_attrib_64bit */ #ifdef GL_ARB_vertex_attrib_binding static GLboolean _glewInit_GL_ARB_vertex_attrib_binding () { GLboolean r = GL_FALSE; r = ((glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffer")) == NULL) || r; r = ((glVertexArrayBindVertexBufferEXT = (PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindVertexBufferEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribBindingEXT = (PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribBindingEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribFormatEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribIFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIFormatEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribLFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLFormatEXT")) == NULL) || r; r = ((glVertexArrayVertexBindingDivisorEXT = (PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBindingDivisorEXT")) == NULL) || r; r = ((glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribBinding")) == NULL) || r; r = ((glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormat")) == NULL) || r; r = ((glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormat")) == NULL) || r; r = ((glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormat")) == NULL) || r; r = ((glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexBindingDivisor")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_attrib_binding */ #ifdef GL_ARB_vertex_blend static GLboolean _glewInit_GL_ARB_vertex_blend () { GLboolean r = GL_FALSE; r = ((glVertexBlendARB = (PFNGLVERTEXBLENDARBPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendARB")) == NULL) || r; r = ((glWeightPointerARB = (PFNGLWEIGHTPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glWeightPointerARB")) == NULL) || r; r = ((glWeightbvARB = (PFNGLWEIGHTBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightbvARB")) == NULL) || r; r = ((glWeightdvARB = (PFNGLWEIGHTDVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightdvARB")) == NULL) || r; r = ((glWeightfvARB = (PFNGLWEIGHTFVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightfvARB")) == NULL) || r; r = ((glWeightivARB = (PFNGLWEIGHTIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightivARB")) == NULL) || r; r = ((glWeightsvARB = (PFNGLWEIGHTSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightsvARB")) == NULL) || r; r = ((glWeightubvARB = (PFNGLWEIGHTUBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightubvARB")) == NULL) || r; r = ((glWeightuivARB = (PFNGLWEIGHTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightuivARB")) == NULL) || r; r = ((glWeightusvARB = (PFNGLWEIGHTUSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightusvARB")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_blend */ #ifdef GL_ARB_vertex_buffer_object static GLboolean _glewInit_GL_ARB_vertex_buffer_object () { GLboolean r = GL_FALSE; r = ((glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glBindBufferARB")) == NULL) || r; r = ((glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferDataARB")) == NULL) || r; r = ((glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferSubDataARB")) == NULL) || r; r = ((glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffersARB")) == NULL) || r; r = ((glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glGenBuffersARB")) == NULL) || r; r = ((glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterivARB")) == NULL) || r; r = ((glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointervARB")) == NULL) || r; r = ((glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubDataARB")) == NULL) || r; r = ((glIsBufferARB = (PFNGLISBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glIsBufferARB")) == NULL) || r; r = ((glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glMapBufferARB")) == NULL) || r; r = ((glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glUnmapBufferARB")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_buffer_object */ #ifdef GL_ARB_vertex_program static GLboolean _glewInit_GL_ARB_vertex_program () { GLboolean r = GL_FALSE; r = ((glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glBindProgramARB")) == NULL) || r; r = ((glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsARB")) == NULL) || r; r = ((glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArrayARB")) == NULL) || r; r = ((glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArrayARB")) == NULL) || r; r = ((glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsARB")) == NULL) || r; r = ((glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterdvARB")) == NULL) || r; r = ((glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterfvARB")) == NULL) || r; r = ((glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterdvARB")) == NULL) || r; r = ((glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterfvARB")) == NULL) || r; r = ((glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringARB")) == NULL) || r; r = ((glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivARB")) == NULL) || r; r = ((glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervARB")) == NULL) || r; r = ((glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvARB")) == NULL) || r; r = ((glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvARB")) == NULL) || r; r = ((glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivARB")) == NULL) || r; r = ((glIsProgramARB = (PFNGLISPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glIsProgramARB")) == NULL) || r; r = ((glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dARB")) == NULL) || r; r = ((glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dvARB")) == NULL) || r; r = ((glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fARB")) == NULL) || r; r = ((glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fvARB")) == NULL) || r; r = ((glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dARB")) == NULL) || r; r = ((glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dvARB")) == NULL) || r; r = ((glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fARB")) == NULL) || r; r = ((glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fvARB")) == NULL) || r; r = ((glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glProgramStringARB")) == NULL) || r; r = ((glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dARB")) == NULL) || r; r = ((glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvARB")) == NULL) || r; r = ((glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fARB")) == NULL) || r; r = ((glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvARB")) == NULL) || r; r = ((glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sARB")) == NULL) || r; r = ((glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svARB")) == NULL) || r; r = ((glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dARB")) == NULL) || r; r = ((glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvARB")) == NULL) || r; r = ((glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fARB")) == NULL) || r; r = ((glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvARB")) == NULL) || r; r = ((glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sARB")) == NULL) || r; r = ((glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svARB")) == NULL) || r; r = ((glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dARB")) == NULL) || r; r = ((glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvARB")) == NULL) || r; r = ((glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fARB")) == NULL) || r; r = ((glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvARB")) == NULL) || r; r = ((glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sARB")) == NULL) || r; r = ((glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svARB")) == NULL) || r; r = ((glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NbvARB")) == NULL) || r; r = ((glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NivARB")) == NULL) || r; r = ((glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NsvARB")) == NULL) || r; r = ((glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubARB")) == NULL) || r; r = ((glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubvARB")) == NULL) || r; r = ((glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NuivARB")) == NULL) || r; r = ((glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NusvARB")) == NULL) || r; r = ((glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bvARB")) == NULL) || r; r = ((glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dARB")) == NULL) || r; r = ((glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvARB")) == NULL) || r; r = ((glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fARB")) == NULL) || r; r = ((glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvARB")) == NULL) || r; r = ((glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ivARB")) == NULL) || r; r = ((glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sARB")) == NULL) || r; r = ((glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svARB")) == NULL) || r; r = ((glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvARB")) == NULL) || r; r = ((glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uivARB")) == NULL) || r; r = ((glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usvARB")) == NULL) || r; r = ((glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerARB")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_program */ #ifdef GL_ARB_vertex_shader static GLboolean _glewInit_GL_ARB_vertex_shader () { GLboolean r = GL_FALSE; r = ((glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocationARB")) == NULL) || r; r = ((glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttribARB")) == NULL) || r; r = ((glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocationARB")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_shader */ #ifdef GL_ARB_vertex_type_2_10_10_10_rev static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev () { GLboolean r = GL_FALSE; r = ((glColorP3ui = (PFNGLCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glColorP3ui")) == NULL) || r; r = ((glColorP3uiv = (PFNGLCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP3uiv")) == NULL) || r; r = ((glColorP4ui = (PFNGLCOLORP4UIPROC)glewGetProcAddress((const GLubyte*)"glColorP4ui")) == NULL) || r; r = ((glColorP4uiv = (PFNGLCOLORP4UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP4uiv")) == NULL) || r; r = ((glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1ui")) == NULL) || r; r = ((glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1uiv")) == NULL) || r; r = ((glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2ui")) == NULL) || r; r = ((glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2uiv")) == NULL) || r; r = ((glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3ui")) == NULL) || r; r = ((glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3uiv")) == NULL) || r; r = ((glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4ui")) == NULL) || r; r = ((glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4uiv")) == NULL) || r; r = ((glNormalP3ui = (PFNGLNORMALP3UIPROC)glewGetProcAddress((const GLubyte*)"glNormalP3ui")) == NULL) || r; r = ((glNormalP3uiv = (PFNGLNORMALP3UIVPROC)glewGetProcAddress((const GLubyte*)"glNormalP3uiv")) == NULL) || r; r = ((glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3ui")) == NULL) || r; r = ((glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3uiv")) == NULL) || r; r = ((glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1ui")) == NULL) || r; r = ((glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1uiv")) == NULL) || r; r = ((glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2ui")) == NULL) || r; r = ((glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2uiv")) == NULL) || r; r = ((glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3ui")) == NULL) || r; r = ((glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3uiv")) == NULL) || r; r = ((glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4ui")) == NULL) || r; r = ((glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4uiv")) == NULL) || r; r = ((glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1ui")) == NULL) || r; r = ((glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1uiv")) == NULL) || r; r = ((glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2ui")) == NULL) || r; r = ((glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2uiv")) == NULL) || r; r = ((glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3ui")) == NULL) || r; r = ((glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3uiv")) == NULL) || r; r = ((glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4ui")) == NULL) || r; r = ((glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4uiv")) == NULL) || r; r = ((glVertexP2ui = (PFNGLVERTEXP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP2ui")) == NULL) || r; r = ((glVertexP2uiv = (PFNGLVERTEXP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP2uiv")) == NULL) || r; r = ((glVertexP3ui = (PFNGLVERTEXP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP3ui")) == NULL) || r; r = ((glVertexP3uiv = (PFNGLVERTEXP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP3uiv")) == NULL) || r; r = ((glVertexP4ui = (PFNGLVERTEXP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP4ui")) == NULL) || r; r = ((glVertexP4uiv = (PFNGLVERTEXP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP4uiv")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_type_2_10_10_10_rev */ #ifdef GL_ARB_viewport_array static GLboolean _glewInit_GL_ARB_viewport_array () { GLboolean r = GL_FALSE; r = ((glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeArrayv")) == NULL) || r; r = ((glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeIndexed")) == NULL) || r; r = ((glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_v")) == NULL) || r; r = ((glGetFloati_v = (PFNGLGETFLOATI_VPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_v")) == NULL) || r; r = ((glScissorArrayv = (PFNGLSCISSORARRAYVPROC)glewGetProcAddress((const GLubyte*)"glScissorArrayv")) == NULL) || r; r = ((glScissorIndexed = (PFNGLSCISSORINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexed")) == NULL) || r; r = ((glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedv")) == NULL) || r; r = ((glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC)glewGetProcAddress((const GLubyte*)"glViewportArrayv")) == NULL) || r; r = ((glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedf")) == NULL) || r; r = ((glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfv")) == NULL) || r; return r; } #endif /* GL_ARB_viewport_array */ #ifdef GL_ARB_window_pos static GLboolean _glewInit_GL_ARB_window_pos () { GLboolean r = GL_FALSE; r = ((glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dARB")) == NULL) || r; r = ((glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvARB")) == NULL) || r; r = ((glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fARB")) == NULL) || r; r = ((glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvARB")) == NULL) || r; r = ((glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iARB")) == NULL) || r; r = ((glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivARB")) == NULL) || r; r = ((glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sARB")) == NULL) || r; r = ((glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svARB")) == NULL) || r; r = ((glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dARB")) == NULL) || r; r = ((glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvARB")) == NULL) || r; r = ((glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fARB")) == NULL) || r; r = ((glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvARB")) == NULL) || r; r = ((glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iARB")) == NULL) || r; r = ((glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivARB")) == NULL) || r; r = ((glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sARB")) == NULL) || r; r = ((glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svARB")) == NULL) || r; return r; } #endif /* GL_ARB_window_pos */ #ifdef GL_ATI_draw_buffers static GLboolean _glewInit_GL_ATI_draw_buffers () { GLboolean r = GL_FALSE; r = ((glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersATI")) == NULL) || r; return r; } #endif /* GL_ATI_draw_buffers */ #ifdef GL_ATI_element_array static GLboolean _glewInit_GL_ATI_element_array () { GLboolean r = GL_FALSE; r = ((glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayATI")) == NULL) || r; r = ((glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayATI")) == NULL) || r; r = ((glElementPointerATI = (PFNGLELEMENTPOINTERATIPROC)glewGetProcAddress((const GLubyte*)"glElementPointerATI")) == NULL) || r; return r; } #endif /* GL_ATI_element_array */ #ifdef GL_ATI_envmap_bumpmap static GLboolean _glewInit_GL_ATI_envmap_bumpmap () { GLboolean r = GL_FALSE; r = ((glGetTexBumpParameterfvATI = (PFNGLGETTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterfvATI")) == NULL) || r; r = ((glGetTexBumpParameterivATI = (PFNGLGETTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterivATI")) == NULL) || r; r = ((glTexBumpParameterfvATI = (PFNGLTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterfvATI")) == NULL) || r; r = ((glTexBumpParameterivATI = (PFNGLTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterivATI")) == NULL) || r; return r; } #endif /* GL_ATI_envmap_bumpmap */ #ifdef GL_ATI_fragment_shader static GLboolean _glewInit_GL_ATI_fragment_shader () { GLboolean r = GL_FALSE; r = ((glAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp1ATI")) == NULL) || r; r = ((glAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp2ATI")) == NULL) || r; r = ((glAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp3ATI")) == NULL) || r; r = ((glBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBeginFragmentShaderATI")) == NULL) || r; r = ((glBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBindFragmentShaderATI")) == NULL) || r; r = ((glColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp1ATI")) == NULL) || r; r = ((glColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp2ATI")) == NULL) || r; r = ((glColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp3ATI")) == NULL) || r; r = ((glDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glDeleteFragmentShaderATI")) == NULL) || r; r = ((glEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glEndFragmentShaderATI")) == NULL) || r; r = ((glGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC)glewGetProcAddress((const GLubyte*)"glGenFragmentShadersATI")) == NULL) || r; r = ((glPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC)glewGetProcAddress((const GLubyte*)"glPassTexCoordATI")) == NULL) || r; r = ((glSampleMapATI = (PFNGLSAMPLEMAPATIPROC)glewGetProcAddress((const GLubyte*)"glSampleMapATI")) == NULL) || r; r = ((glSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)glewGetProcAddress((const GLubyte*)"glSetFragmentShaderConstantATI")) == NULL) || r; return r; } #endif /* GL_ATI_fragment_shader */ #ifdef GL_ATI_map_object_buffer static GLboolean _glewInit_GL_ATI_map_object_buffer () { GLboolean r = GL_FALSE; r = ((glMapObjectBufferATI = (PFNGLMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glMapObjectBufferATI")) == NULL) || r; r = ((glUnmapObjectBufferATI = (PFNGLUNMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUnmapObjectBufferATI")) == NULL) || r; return r; } #endif /* GL_ATI_map_object_buffer */ #ifdef GL_ATI_pn_triangles static GLboolean _glewInit_GL_ATI_pn_triangles () { GLboolean r = GL_FALSE; r = ((glPNTrianglesfATI = (PFNGLPNTRIANGLESFATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesfATI")) == NULL) || r; r = ((glPNTrianglesiATI = (PFNGLPNTRIANGLESIATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesiATI")) == NULL) || r; return r; } #endif /* GL_ATI_pn_triangles */ #ifdef GL_ATI_separate_stencil static GLboolean _glewInit_GL_ATI_separate_stencil () { GLboolean r = GL_FALSE; r = ((glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparateATI")) == NULL) || r; r = ((glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparateATI")) == NULL) || r; return r; } #endif /* GL_ATI_separate_stencil */ #ifdef GL_ATI_vertex_array_object static GLboolean _glewInit_GL_ATI_vertex_array_object () { GLboolean r = GL_FALSE; r = ((glArrayObjectATI = (PFNGLARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glArrayObjectATI")) == NULL) || r; r = ((glFreeObjectBufferATI = (PFNGLFREEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glFreeObjectBufferATI")) == NULL) || r; r = ((glGetArrayObjectfvATI = (PFNGLGETARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectfvATI")) == NULL) || r; r = ((glGetArrayObjectivATI = (PFNGLGETARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectivATI")) == NULL) || r; r = ((glGetObjectBufferfvATI = (PFNGLGETOBJECTBUFFERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferfvATI")) == NULL) || r; r = ((glGetObjectBufferivATI = (PFNGLGETOBJECTBUFFERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferivATI")) == NULL) || r; r = ((glGetVariantArrayObjectfvATI = (PFNGLGETVARIANTARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectfvATI")) == NULL) || r; r = ((glGetVariantArrayObjectivATI = (PFNGLGETVARIANTARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectivATI")) == NULL) || r; r = ((glIsObjectBufferATI = (PFNGLISOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glIsObjectBufferATI")) == NULL) || r; r = ((glNewObjectBufferATI = (PFNGLNEWOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glNewObjectBufferATI")) == NULL) || r; r = ((glUpdateObjectBufferATI = (PFNGLUPDATEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUpdateObjectBufferATI")) == NULL) || r; r = ((glVariantArrayObjectATI = (PFNGLVARIANTARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVariantArrayObjectATI")) == NULL) || r; return r; } #endif /* GL_ATI_vertex_array_object */ #ifdef GL_ATI_vertex_attrib_array_object static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object () { GLboolean r = GL_FALSE; r = ((glGetVertexAttribArrayObjectfvATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectfvATI")) == NULL) || r; r = ((glGetVertexAttribArrayObjectivATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectivATI")) == NULL) || r; r = ((glVertexAttribArrayObjectATI = (PFNGLVERTEXATTRIBARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribArrayObjectATI")) == NULL) || r; return r; } #endif /* GL_ATI_vertex_attrib_array_object */ #ifdef GL_ATI_vertex_streams static GLboolean _glewInit_GL_ATI_vertex_streams () { GLboolean r = GL_FALSE; r = ((glClientActiveVertexStreamATI = (PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC)glewGetProcAddress((const GLubyte*)"glClientActiveVertexStreamATI")) == NULL) || r; r = ((glNormalStream3bATI = (PFNGLNORMALSTREAM3BATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bATI")) == NULL) || r; r = ((glNormalStream3bvATI = (PFNGLNORMALSTREAM3BVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bvATI")) == NULL) || r; r = ((glNormalStream3dATI = (PFNGLNORMALSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dATI")) == NULL) || r; r = ((glNormalStream3dvATI = (PFNGLNORMALSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dvATI")) == NULL) || r; r = ((glNormalStream3fATI = (PFNGLNORMALSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fATI")) == NULL) || r; r = ((glNormalStream3fvATI = (PFNGLNORMALSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fvATI")) == NULL) || r; r = ((glNormalStream3iATI = (PFNGLNORMALSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3iATI")) == NULL) || r; r = ((glNormalStream3ivATI = (PFNGLNORMALSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3ivATI")) == NULL) || r; r = ((glNormalStream3sATI = (PFNGLNORMALSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3sATI")) == NULL) || r; r = ((glNormalStream3svATI = (PFNGLNORMALSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3svATI")) == NULL) || r; r = ((glVertexBlendEnvfATI = (PFNGLVERTEXBLENDENVFATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnvfATI")) == NULL) || r; r = ((glVertexBlendEnviATI = (PFNGLVERTEXBLENDENVIATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnviATI")) == NULL) || r; r = ((glVertexStream1dATI = (PFNGLVERTEXSTREAM1DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dATI")) == NULL) || r; r = ((glVertexStream1dvATI = (PFNGLVERTEXSTREAM1DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dvATI")) == NULL) || r; r = ((glVertexStream1fATI = (PFNGLVERTEXSTREAM1FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fATI")) == NULL) || r; r = ((glVertexStream1fvATI = (PFNGLVERTEXSTREAM1FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fvATI")) == NULL) || r; r = ((glVertexStream1iATI = (PFNGLVERTEXSTREAM1IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1iATI")) == NULL) || r; r = ((glVertexStream1ivATI = (PFNGLVERTEXSTREAM1IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1ivATI")) == NULL) || r; r = ((glVertexStream1sATI = (PFNGLVERTEXSTREAM1SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1sATI")) == NULL) || r; r = ((glVertexStream1svATI = (PFNGLVERTEXSTREAM1SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1svATI")) == NULL) || r; r = ((glVertexStream2dATI = (PFNGLVERTEXSTREAM2DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dATI")) == NULL) || r; r = ((glVertexStream2dvATI = (PFNGLVERTEXSTREAM2DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dvATI")) == NULL) || r; r = ((glVertexStream2fATI = (PFNGLVERTEXSTREAM2FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fATI")) == NULL) || r; r = ((glVertexStream2fvATI = (PFNGLVERTEXSTREAM2FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fvATI")) == NULL) || r; r = ((glVertexStream2iATI = (PFNGLVERTEXSTREAM2IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2iATI")) == NULL) || r; r = ((glVertexStream2ivATI = (PFNGLVERTEXSTREAM2IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2ivATI")) == NULL) || r; r = ((glVertexStream2sATI = (PFNGLVERTEXSTREAM2SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2sATI")) == NULL) || r; r = ((glVertexStream2svATI = (PFNGLVERTEXSTREAM2SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2svATI")) == NULL) || r; r = ((glVertexStream3dATI = (PFNGLVERTEXSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dATI")) == NULL) || r; r = ((glVertexStream3dvATI = (PFNGLVERTEXSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dvATI")) == NULL) || r; r = ((glVertexStream3fATI = (PFNGLVERTEXSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fATI")) == NULL) || r; r = ((glVertexStream3fvATI = (PFNGLVERTEXSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fvATI")) == NULL) || r; r = ((glVertexStream3iATI = (PFNGLVERTEXSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3iATI")) == NULL) || r; r = ((glVertexStream3ivATI = (PFNGLVERTEXSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3ivATI")) == NULL) || r; r = ((glVertexStream3sATI = (PFNGLVERTEXSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3sATI")) == NULL) || r; r = ((glVertexStream3svATI = (PFNGLVERTEXSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3svATI")) == NULL) || r; r = ((glVertexStream4dATI = (PFNGLVERTEXSTREAM4DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dATI")) == NULL) || r; r = ((glVertexStream4dvATI = (PFNGLVERTEXSTREAM4DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dvATI")) == NULL) || r; r = ((glVertexStream4fATI = (PFNGLVERTEXSTREAM4FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fATI")) == NULL) || r; r = ((glVertexStream4fvATI = (PFNGLVERTEXSTREAM4FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fvATI")) == NULL) || r; r = ((glVertexStream4iATI = (PFNGLVERTEXSTREAM4IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4iATI")) == NULL) || r; r = ((glVertexStream4ivATI = (PFNGLVERTEXSTREAM4IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4ivATI")) == NULL) || r; r = ((glVertexStream4sATI = (PFNGLVERTEXSTREAM4SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4sATI")) == NULL) || r; r = ((glVertexStream4svATI = (PFNGLVERTEXSTREAM4SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4svATI")) == NULL) || r; return r; } #endif /* GL_ATI_vertex_streams */ #ifdef GL_EXT_base_instance static GLboolean _glewInit_GL_EXT_base_instance () { GLboolean r = GL_FALSE; r = ((glDrawArraysInstancedBaseInstanceEXT = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedBaseInstanceEXT")) == NULL) || r; r = ((glDrawElementsInstancedBaseInstanceEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseInstanceEXT")) == NULL) || r; r = ((glDrawElementsInstancedBaseVertexBaseInstanceEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexBaseInstanceEXT")) == NULL) || r; return r; } #endif /* GL_EXT_base_instance */ #ifdef GL_EXT_bindable_uniform static GLboolean _glewInit_GL_EXT_bindable_uniform () { GLboolean r = GL_FALSE; r = ((glGetUniformBufferSizeEXT = (PFNGLGETUNIFORMBUFFERSIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBufferSizeEXT")) == NULL) || r; r = ((glGetUniformOffsetEXT = (PFNGLGETUNIFORMOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformOffsetEXT")) == NULL) || r; r = ((glUniformBufferEXT = (PFNGLUNIFORMBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUniformBufferEXT")) == NULL) || r; return r; } #endif /* GL_EXT_bindable_uniform */ #ifdef GL_EXT_blend_color static GLboolean _glewInit_GL_EXT_blend_color () { GLboolean r = GL_FALSE; r = ((glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC)glewGetProcAddress((const GLubyte*)"glBlendColorEXT")) == NULL) || r; return r; } #endif /* GL_EXT_blend_color */ #ifdef GL_EXT_blend_equation_separate static GLboolean _glewInit_GL_EXT_blend_equation_separate () { GLboolean r = GL_FALSE; r = ((glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateEXT")) == NULL) || r; return r; } #endif /* GL_EXT_blend_equation_separate */ #ifdef GL_EXT_blend_func_extended static GLboolean _glewInit_GL_EXT_blend_func_extended () { GLboolean r = GL_FALSE; r = ((glBindFragDataLocationIndexedEXT = (PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationIndexedEXT")) == NULL) || r; r = ((glGetFragDataIndexEXT = (PFNGLGETFRAGDATAINDEXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataIndexEXT")) == NULL) || r; r = ((glGetProgramResourceLocationIndexEXT = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocationIndexEXT")) == NULL) || r; return r; } #endif /* GL_EXT_blend_func_extended */ #ifdef GL_EXT_blend_func_separate static GLboolean _glewInit_GL_EXT_blend_func_separate () { GLboolean r = GL_FALSE; r = ((glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateEXT")) == NULL) || r; return r; } #endif /* GL_EXT_blend_func_separate */ #ifdef GL_EXT_blend_minmax static GLboolean _glewInit_GL_EXT_blend_minmax () { GLboolean r = GL_FALSE; r = ((glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationEXT")) == NULL) || r; return r; } #endif /* GL_EXT_blend_minmax */ #ifdef GL_EXT_buffer_storage static GLboolean _glewInit_GL_EXT_buffer_storage () { GLboolean r = GL_FALSE; r = ((glBufferStorageEXT = (PFNGLBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glBufferStorageEXT")) == NULL) || r; r = ((glNamedBufferStorageEXT = (PFNGLNAMEDBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageEXT")) == NULL) || r; return r; } #endif /* GL_EXT_buffer_storage */ #ifdef GL_EXT_clear_texture static GLboolean _glewInit_GL_EXT_clear_texture () { GLboolean r = GL_FALSE; r = ((glClearTexImageEXT = (PFNGLCLEARTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glClearTexImageEXT")) == NULL) || r; r = ((glClearTexSubImageEXT = (PFNGLCLEARTEXSUBIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glClearTexSubImageEXT")) == NULL) || r; return r; } #endif /* GL_EXT_clear_texture */ #ifdef GL_EXT_color_subtable static GLboolean _glewInit_GL_EXT_color_subtable () { GLboolean r = GL_FALSE; r = ((glColorSubTableEXT = (PFNGLCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorSubTableEXT")) == NULL) || r; r = ((glCopyColorSubTableEXT = (PFNGLCOPYCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTableEXT")) == NULL) || r; return r; } #endif /* GL_EXT_color_subtable */ #ifdef GL_EXT_compiled_vertex_array static GLboolean _glewInit_GL_EXT_compiled_vertex_array () { GLboolean r = GL_FALSE; r = ((glLockArraysEXT = (PFNGLLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glLockArraysEXT")) == NULL) || r; r = ((glUnlockArraysEXT = (PFNGLUNLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glUnlockArraysEXT")) == NULL) || r; return r; } #endif /* GL_EXT_compiled_vertex_array */ #ifdef GL_EXT_convolution static GLboolean _glewInit_GL_EXT_convolution () { GLboolean r = GL_FALSE; r = ((glConvolutionFilter1DEXT = (PFNGLCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1DEXT")) == NULL) || r; r = ((glConvolutionFilter2DEXT = (PFNGLCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2DEXT")) == NULL) || r; r = ((glConvolutionParameterfEXT = (PFNGLCONVOLUTIONPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfEXT")) == NULL) || r; r = ((glConvolutionParameterfvEXT = (PFNGLCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfvEXT")) == NULL) || r; r = ((glConvolutionParameteriEXT = (PFNGLCONVOLUTIONPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriEXT")) == NULL) || r; r = ((glConvolutionParameterivEXT = (PFNGLCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterivEXT")) == NULL) || r; r = ((glCopyConvolutionFilter1DEXT = (PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1DEXT")) == NULL) || r; r = ((glCopyConvolutionFilter2DEXT = (PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2DEXT")) == NULL) || r; r = ((glGetConvolutionFilterEXT = (PFNGLGETCONVOLUTIONFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilterEXT")) == NULL) || r; r = ((glGetConvolutionParameterfvEXT = (PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfvEXT")) == NULL) || r; r = ((glGetConvolutionParameterivEXT = (PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterivEXT")) == NULL) || r; r = ((glGetSeparableFilterEXT = (PFNGLGETSEPARABLEFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilterEXT")) == NULL) || r; r = ((glSeparableFilter2DEXT = (PFNGLSEPARABLEFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2DEXT")) == NULL) || r; return r; } #endif /* GL_EXT_convolution */ #ifdef GL_EXT_coordinate_frame static GLboolean _glewInit_GL_EXT_coordinate_frame () { GLboolean r = GL_FALSE; r = ((glBinormalPointerEXT = (PFNGLBINORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glBinormalPointerEXT")) == NULL) || r; r = ((glTangentPointerEXT = (PFNGLTANGENTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTangentPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_coordinate_frame */ #ifdef GL_EXT_copy_image static GLboolean _glewInit_GL_EXT_copy_image () { GLboolean r = GL_FALSE; r = ((glCopyImageSubDataEXT = (PFNGLCOPYIMAGESUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataEXT")) == NULL) || r; return r; } #endif /* GL_EXT_copy_image */ #ifdef GL_EXT_copy_texture static GLboolean _glewInit_GL_EXT_copy_texture () { GLboolean r = GL_FALSE; r = ((glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage1DEXT")) == NULL) || r; r = ((glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage2DEXT")) == NULL) || r; r = ((glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage1DEXT")) == NULL) || r; r = ((glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage2DEXT")) == NULL) || r; r = ((glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DEXT")) == NULL) || r; return r; } #endif /* GL_EXT_copy_texture */ #ifdef GL_EXT_cull_vertex static GLboolean _glewInit_GL_EXT_cull_vertex () { GLboolean r = GL_FALSE; r = ((glCullParameterdvEXT = (PFNGLCULLPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterdvEXT")) == NULL) || r; r = ((glCullParameterfvEXT = (PFNGLCULLPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterfvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_cull_vertex */ #ifdef GL_EXT_debug_label static GLboolean _glewInit_GL_EXT_debug_label () { GLboolean r = GL_FALSE; r = ((glGetObjectLabelEXT = (PFNGLGETOBJECTLABELEXTPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabelEXT")) == NULL) || r; r = ((glLabelObjectEXT = (PFNGLLABELOBJECTEXTPROC)glewGetProcAddress((const GLubyte*)"glLabelObjectEXT")) == NULL) || r; return r; } #endif /* GL_EXT_debug_label */ #ifdef GL_EXT_debug_marker static GLboolean _glewInit_GL_EXT_debug_marker () { GLboolean r = GL_FALSE; r = ((glInsertEventMarkerEXT = (PFNGLINSERTEVENTMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glInsertEventMarkerEXT")) == NULL) || r; r = ((glPopGroupMarkerEXT = (PFNGLPOPGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPopGroupMarkerEXT")) == NULL) || r; r = ((glPushGroupMarkerEXT = (PFNGLPUSHGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPushGroupMarkerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_debug_marker */ #ifdef GL_EXT_depth_bounds_test static GLboolean _glewInit_GL_EXT_depth_bounds_test () { GLboolean r = GL_FALSE; r = ((glDepthBoundsEXT = (PFNGLDEPTHBOUNDSEXTPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsEXT")) == NULL) || r; return r; } #endif /* GL_EXT_depth_bounds_test */ #ifdef GL_EXT_direct_state_access static GLboolean _glewInit_GL_EXT_direct_state_access () { GLboolean r = GL_FALSE; r = ((glBindMultiTextureEXT = (PFNGLBINDMULTITEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindMultiTextureEXT")) == NULL) || r; r = ((glCheckNamedFramebufferStatusEXT = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatusEXT")) == NULL) || r; r = ((glClientAttribDefaultEXT = (PFNGLCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glClientAttribDefaultEXT")) == NULL) || r; r = ((glCompressedMultiTexImage1DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage1DEXT")) == NULL) || r; r = ((glCompressedMultiTexImage2DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage2DEXT")) == NULL) || r; r = ((glCompressedMultiTexImage3DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage3DEXT")) == NULL) || r; r = ((glCompressedMultiTexSubImage1DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage1DEXT")) == NULL) || r; r = ((glCompressedMultiTexSubImage2DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage2DEXT")) == NULL) || r; r = ((glCompressedMultiTexSubImage3DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage3DEXT")) == NULL) || r; r = ((glCompressedTextureImage1DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage1DEXT")) == NULL) || r; r = ((glCompressedTextureImage2DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage2DEXT")) == NULL) || r; r = ((glCompressedTextureImage3DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage3DEXT")) == NULL) || r; r = ((glCompressedTextureSubImage1DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1DEXT")) == NULL) || r; r = ((glCompressedTextureSubImage2DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2DEXT")) == NULL) || r; r = ((glCompressedTextureSubImage3DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3DEXT")) == NULL) || r; r = ((glCopyMultiTexImage1DEXT = (PFNGLCOPYMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage1DEXT")) == NULL) || r; r = ((glCopyMultiTexImage2DEXT = (PFNGLCOPYMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage2DEXT")) == NULL) || r; r = ((glCopyMultiTexSubImage1DEXT = (PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage1DEXT")) == NULL) || r; r = ((glCopyMultiTexSubImage2DEXT = (PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage2DEXT")) == NULL) || r; r = ((glCopyMultiTexSubImage3DEXT = (PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage3DEXT")) == NULL) || r; r = ((glCopyTextureImage1DEXT = (PFNGLCOPYTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage1DEXT")) == NULL) || r; r = ((glCopyTextureImage2DEXT = (PFNGLCOPYTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage2DEXT")) == NULL) || r; r = ((glCopyTextureSubImage1DEXT = (PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1DEXT")) == NULL) || r; r = ((glCopyTextureSubImage2DEXT = (PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2DEXT")) == NULL) || r; r = ((glCopyTextureSubImage3DEXT = (PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3DEXT")) == NULL) || r; r = ((glDisableClientStateIndexedEXT = (PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateIndexedEXT")) == NULL) || r; r = ((glDisableClientStateiEXT = (PFNGLDISABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateiEXT")) == NULL) || r; r = ((glDisableVertexArrayAttribEXT = (PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttribEXT")) == NULL) || r; r = ((glDisableVertexArrayEXT = (PFNGLDISABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayEXT")) == NULL) || r; r = ((glEnableClientStateIndexedEXT = (PFNGLENABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateIndexedEXT")) == NULL) || r; r = ((glEnableClientStateiEXT = (PFNGLENABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateiEXT")) == NULL) || r; r = ((glEnableVertexArrayAttribEXT = (PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttribEXT")) == NULL) || r; r = ((glEnableVertexArrayEXT = (PFNGLENABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayEXT")) == NULL) || r; r = ((glFlushMappedNamedBufferRangeEXT = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRangeEXT")) == NULL) || r; r = ((glFramebufferDrawBufferEXT = (PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBufferEXT")) == NULL) || r; r = ((glFramebufferDrawBuffersEXT = (PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBuffersEXT")) == NULL) || r; r = ((glFramebufferReadBufferEXT = (PFNGLFRAMEBUFFERREADBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferReadBufferEXT")) == NULL) || r; r = ((glGenerateMultiTexMipmapEXT = (PFNGLGENERATEMULTITEXMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMultiTexMipmapEXT")) == NULL) || r; r = ((glGenerateTextureMipmapEXT = (PFNGLGENERATETEXTUREMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmapEXT")) == NULL) || r; r = ((glGetCompressedMultiTexImageEXT = (PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedMultiTexImageEXT")) == NULL) || r; r = ((glGetCompressedTextureImageEXT = (PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImageEXT")) == NULL) || r; r = ((glGetDoubleIndexedvEXT = (PFNGLGETDOUBLEINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoubleIndexedvEXT")) == NULL) || r; r = ((glGetDoublei_vEXT = (PFNGLGETDOUBLEI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_vEXT")) == NULL) || r; r = ((glGetFloatIndexedvEXT = (PFNGLGETFLOATINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloatIndexedvEXT")) == NULL) || r; r = ((glGetFloati_vEXT = (PFNGLGETFLOATI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_vEXT")) == NULL) || r; r = ((glGetFramebufferParameterivEXT = (PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterivEXT")) == NULL) || r; r = ((glGetMultiTexEnvfvEXT = (PFNGLGETMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvfvEXT")) == NULL) || r; r = ((glGetMultiTexEnvivEXT = (PFNGLGETMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvivEXT")) == NULL) || r; r = ((glGetMultiTexGendvEXT = (PFNGLGETMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGendvEXT")) == NULL) || r; r = ((glGetMultiTexGenfvEXT = (PFNGLGETMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenfvEXT")) == NULL) || r; r = ((glGetMultiTexGenivEXT = (PFNGLGETMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenivEXT")) == NULL) || r; r = ((glGetMultiTexImageEXT = (PFNGLGETMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexImageEXT")) == NULL) || r; r = ((glGetMultiTexLevelParameterfvEXT = (PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterfvEXT")) == NULL) || r; r = ((glGetMultiTexLevelParameterivEXT = (PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterivEXT")) == NULL) || r; r = ((glGetMultiTexParameterIivEXT = (PFNGLGETMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIivEXT")) == NULL) || r; r = ((glGetMultiTexParameterIuivEXT = (PFNGLGETMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIuivEXT")) == NULL) || r; r = ((glGetMultiTexParameterfvEXT = (PFNGLGETMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterfvEXT")) == NULL) || r; r = ((glGetMultiTexParameterivEXT = (PFNGLGETMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterivEXT")) == NULL) || r; r = ((glGetNamedBufferParameterivEXT = (PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterivEXT")) == NULL) || r; r = ((glGetNamedBufferPointervEXT = (PFNGLGETNAMEDBUFFERPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointervEXT")) == NULL) || r; r = ((glGetNamedBufferSubDataEXT = (PFNGLGETNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubDataEXT")) == NULL) || r; r = ((glGetNamedFramebufferAttachmentParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameterivEXT")) == NULL) || r; r = ((glGetNamedProgramLocalParameterIivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIivEXT")) == NULL) || r; r = ((glGetNamedProgramLocalParameterIuivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIuivEXT")) == NULL) || r; r = ((glGetNamedProgramLocalParameterdvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterdvEXT")) == NULL) || r; r = ((glGetNamedProgramLocalParameterfvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterfvEXT")) == NULL) || r; r = ((glGetNamedProgramStringEXT = (PFNGLGETNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramStringEXT")) == NULL) || r; r = ((glGetNamedProgramivEXT = (PFNGLGETNAMEDPROGRAMIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramivEXT")) == NULL) || r; r = ((glGetNamedRenderbufferParameterivEXT = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameterivEXT")) == NULL) || r; r = ((glGetPointerIndexedvEXT = (PFNGLGETPOINTERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointerIndexedvEXT")) == NULL) || r; r = ((glGetPointeri_vEXT = (PFNGLGETPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointeri_vEXT")) == NULL) || r; r = ((glGetTextureImageEXT = (PFNGLGETTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImageEXT")) == NULL) || r; r = ((glGetTextureLevelParameterfvEXT = (PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfvEXT")) == NULL) || r; r = ((glGetTextureLevelParameterivEXT = (PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterivEXT")) == NULL) || r; r = ((glGetTextureParameterIivEXT = (PFNGLGETTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIivEXT")) == NULL) || r; r = ((glGetTextureParameterIuivEXT = (PFNGLGETTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuivEXT")) == NULL) || r; r = ((glGetTextureParameterfvEXT = (PFNGLGETTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfvEXT")) == NULL) || r; r = ((glGetTextureParameterivEXT = (PFNGLGETTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterivEXT")) == NULL) || r; r = ((glGetVertexArrayIntegeri_vEXT = (PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegeri_vEXT")) == NULL) || r; r = ((glGetVertexArrayIntegervEXT = (PFNGLGETVERTEXARRAYINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegervEXT")) == NULL) || r; r = ((glGetVertexArrayPointeri_vEXT = (PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointeri_vEXT")) == NULL) || r; r = ((glGetVertexArrayPointervEXT = (PFNGLGETVERTEXARRAYPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointervEXT")) == NULL) || r; r = ((glMapNamedBufferEXT = (PFNGLMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferEXT")) == NULL) || r; r = ((glMapNamedBufferRangeEXT = (PFNGLMAPNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRangeEXT")) == NULL) || r; r = ((glMatrixFrustumEXT = (PFNGLMATRIXFRUSTUMEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixFrustumEXT")) == NULL) || r; r = ((glMatrixLoadIdentityEXT = (PFNGLMATRIXLOADIDENTITYEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadIdentityEXT")) == NULL) || r; r = ((glMatrixLoadTransposedEXT = (PFNGLMATRIXLOADTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposedEXT")) == NULL) || r; r = ((glMatrixLoadTransposefEXT = (PFNGLMATRIXLOADTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposefEXT")) == NULL) || r; r = ((glMatrixLoaddEXT = (PFNGLMATRIXLOADDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoaddEXT")) == NULL) || r; r = ((glMatrixLoadfEXT = (PFNGLMATRIXLOADFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadfEXT")) == NULL) || r; r = ((glMatrixMultTransposedEXT = (PFNGLMATRIXMULTTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposedEXT")) == NULL) || r; r = ((glMatrixMultTransposefEXT = (PFNGLMATRIXMULTTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposefEXT")) == NULL) || r; r = ((glMatrixMultdEXT = (PFNGLMATRIXMULTDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultdEXT")) == NULL) || r; r = ((glMatrixMultfEXT = (PFNGLMATRIXMULTFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultfEXT")) == NULL) || r; r = ((glMatrixOrthoEXT = (PFNGLMATRIXORTHOEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixOrthoEXT")) == NULL) || r; r = ((glMatrixPopEXT = (PFNGLMATRIXPOPEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPopEXT")) == NULL) || r; r = ((glMatrixPushEXT = (PFNGLMATRIXPUSHEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPushEXT")) == NULL) || r; r = ((glMatrixRotatedEXT = (PFNGLMATRIXROTATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatedEXT")) == NULL) || r; r = ((glMatrixRotatefEXT = (PFNGLMATRIXROTATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatefEXT")) == NULL) || r; r = ((glMatrixScaledEXT = (PFNGLMATRIXSCALEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScaledEXT")) == NULL) || r; r = ((glMatrixScalefEXT = (PFNGLMATRIXSCALEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScalefEXT")) == NULL) || r; r = ((glMatrixTranslatedEXT = (PFNGLMATRIXTRANSLATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatedEXT")) == NULL) || r; r = ((glMatrixTranslatefEXT = (PFNGLMATRIXTRANSLATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatefEXT")) == NULL) || r; r = ((glMultiTexBufferEXT = (PFNGLMULTITEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexBufferEXT")) == NULL) || r; r = ((glMultiTexCoordPointerEXT = (PFNGLMULTITEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordPointerEXT")) == NULL) || r; r = ((glMultiTexEnvfEXT = (PFNGLMULTITEXENVFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfEXT")) == NULL) || r; r = ((glMultiTexEnvfvEXT = (PFNGLMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfvEXT")) == NULL) || r; r = ((glMultiTexEnviEXT = (PFNGLMULTITEXENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnviEXT")) == NULL) || r; r = ((glMultiTexEnvivEXT = (PFNGLMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvivEXT")) == NULL) || r; r = ((glMultiTexGendEXT = (PFNGLMULTITEXGENDEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendEXT")) == NULL) || r; r = ((glMultiTexGendvEXT = (PFNGLMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendvEXT")) == NULL) || r; r = ((glMultiTexGenfEXT = (PFNGLMULTITEXGENFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfEXT")) == NULL) || r; r = ((glMultiTexGenfvEXT = (PFNGLMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfvEXT")) == NULL) || r; r = ((glMultiTexGeniEXT = (PFNGLMULTITEXGENIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGeniEXT")) == NULL) || r; r = ((glMultiTexGenivEXT = (PFNGLMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenivEXT")) == NULL) || r; r = ((glMultiTexImage1DEXT = (PFNGLMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage1DEXT")) == NULL) || r; r = ((glMultiTexImage2DEXT = (PFNGLMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage2DEXT")) == NULL) || r; r = ((glMultiTexImage3DEXT = (PFNGLMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage3DEXT")) == NULL) || r; r = ((glMultiTexParameterIivEXT = (PFNGLMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIivEXT")) == NULL) || r; r = ((glMultiTexParameterIuivEXT = (PFNGLMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIuivEXT")) == NULL) || r; r = ((glMultiTexParameterfEXT = (PFNGLMULTITEXPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfEXT")) == NULL) || r; r = ((glMultiTexParameterfvEXT = (PFNGLMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfvEXT")) == NULL) || r; r = ((glMultiTexParameteriEXT = (PFNGLMULTITEXPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameteriEXT")) == NULL) || r; r = ((glMultiTexParameterivEXT = (PFNGLMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterivEXT")) == NULL) || r; r = ((glMultiTexRenderbufferEXT = (PFNGLMULTITEXRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexRenderbufferEXT")) == NULL) || r; r = ((glMultiTexSubImage1DEXT = (PFNGLMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage1DEXT")) == NULL) || r; r = ((glMultiTexSubImage2DEXT = (PFNGLMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage2DEXT")) == NULL) || r; r = ((glMultiTexSubImage3DEXT = (PFNGLMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage3DEXT")) == NULL) || r; r = ((glNamedBufferDataEXT = (PFNGLNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferDataEXT")) == NULL) || r; r = ((glNamedBufferSubDataEXT = (PFNGLNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubDataEXT")) == NULL) || r; r = ((glNamedCopyBufferSubDataEXT = (PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedCopyBufferSubDataEXT")) == NULL) || r; r = ((glNamedFramebufferRenderbufferEXT = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbufferEXT")) == NULL) || r; r = ((glNamedFramebufferTexture1DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture1DEXT")) == NULL) || r; r = ((glNamedFramebufferTexture2DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture2DEXT")) == NULL) || r; r = ((glNamedFramebufferTexture3DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture3DEXT")) == NULL) || r; r = ((glNamedFramebufferTextureEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureEXT")) == NULL) || r; r = ((glNamedFramebufferTextureFaceEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureFaceEXT")) == NULL) || r; r = ((glNamedFramebufferTextureLayerEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayerEXT")) == NULL) || r; r = ((glNamedProgramLocalParameter4dEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dEXT")) == NULL) || r; r = ((glNamedProgramLocalParameter4dvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dvEXT")) == NULL) || r; r = ((glNamedProgramLocalParameter4fEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fEXT")) == NULL) || r; r = ((glNamedProgramLocalParameter4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fvEXT")) == NULL) || r; r = ((glNamedProgramLocalParameterI4iEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4iEXT")) == NULL) || r; r = ((glNamedProgramLocalParameterI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4ivEXT")) == NULL) || r; r = ((glNamedProgramLocalParameterI4uiEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uiEXT")) == NULL) || r; r = ((glNamedProgramLocalParameterI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uivEXT")) == NULL) || r; r = ((glNamedProgramLocalParameters4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameters4fvEXT")) == NULL) || r; r = ((glNamedProgramLocalParametersI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4ivEXT")) == NULL) || r; r = ((glNamedProgramLocalParametersI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4uivEXT")) == NULL) || r; r = ((glNamedProgramStringEXT = (PFNGLNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramStringEXT")) == NULL) || r; r = ((glNamedRenderbufferStorageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageEXT")) == NULL) || r; r = ((glNamedRenderbufferStorageMultisampleCoverageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleCoverageEXT")) == NULL) || r; r = ((glNamedRenderbufferStorageMultisampleEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleEXT")) == NULL) || r; r = ((glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fEXT")) == NULL) || r; r = ((glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fvEXT")) == NULL) || r; r = ((glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iEXT")) == NULL) || r; r = ((glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ivEXT")) == NULL) || r; r = ((glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiEXT")) == NULL) || r; r = ((glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uivEXT")) == NULL) || r; r = ((glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fEXT")) == NULL) || r; r = ((glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fvEXT")) == NULL) || r; r = ((glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iEXT")) == NULL) || r; r = ((glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ivEXT")) == NULL) || r; r = ((glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiEXT")) == NULL) || r; r = ((glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uivEXT")) == NULL) || r; r = ((glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fEXT")) == NULL) || r; r = ((glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fvEXT")) == NULL) || r; r = ((glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iEXT")) == NULL) || r; r = ((glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ivEXT")) == NULL) || r; r = ((glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiEXT")) == NULL) || r; r = ((glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uivEXT")) == NULL) || r; r = ((glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fEXT")) == NULL) || r; r = ((glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fvEXT")) == NULL) || r; r = ((glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iEXT")) == NULL) || r; r = ((glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ivEXT")) == NULL) || r; r = ((glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiEXT")) == NULL) || r; r = ((glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uivEXT")) == NULL) || r; r = ((glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fvEXT")) == NULL) || r; r = ((glPushClientAttribDefaultEXT = (PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glPushClientAttribDefaultEXT")) == NULL) || r; r = ((glTextureBufferEXT = (PFNGLTEXTUREBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferEXT")) == NULL) || r; r = ((glTextureImage1DEXT = (PFNGLTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage1DEXT")) == NULL) || r; r = ((glTextureImage2DEXT = (PFNGLTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DEXT")) == NULL) || r; r = ((glTextureImage3DEXT = (PFNGLTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DEXT")) == NULL) || r; r = ((glTextureParameterIivEXT = (PFNGLTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIivEXT")) == NULL) || r; r = ((glTextureParameterIuivEXT = (PFNGLTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuivEXT")) == NULL) || r; r = ((glTextureParameterfEXT = (PFNGLTEXTUREPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfEXT")) == NULL) || r; r = ((glTextureParameterfvEXT = (PFNGLTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfvEXT")) == NULL) || r; r = ((glTextureParameteriEXT = (PFNGLTEXTUREPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriEXT")) == NULL) || r; r = ((glTextureParameterivEXT = (PFNGLTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterivEXT")) == NULL) || r; r = ((glTextureRenderbufferEXT = (PFNGLTEXTURERENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureRenderbufferEXT")) == NULL) || r; r = ((glTextureSubImage1DEXT = (PFNGLTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1DEXT")) == NULL) || r; r = ((glTextureSubImage2DEXT = (PFNGLTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2DEXT")) == NULL) || r; r = ((glTextureSubImage3DEXT = (PFNGLTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3DEXT")) == NULL) || r; r = ((glUnmapNamedBufferEXT = (PFNGLUNMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBufferEXT")) == NULL) || r; r = ((glVertexArrayColorOffsetEXT = (PFNGLVERTEXARRAYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayColorOffsetEXT")) == NULL) || r; r = ((glVertexArrayEdgeFlagOffsetEXT = (PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayEdgeFlagOffsetEXT")) == NULL) || r; r = ((glVertexArrayFogCoordOffsetEXT = (PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayFogCoordOffsetEXT")) == NULL) || r; r = ((glVertexArrayIndexOffsetEXT = (PFNGLVERTEXARRAYINDEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayIndexOffsetEXT")) == NULL) || r; r = ((glVertexArrayMultiTexCoordOffsetEXT = (PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayMultiTexCoordOffsetEXT")) == NULL) || r; r = ((glVertexArrayNormalOffsetEXT = (PFNGLVERTEXARRAYNORMALOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayNormalOffsetEXT")) == NULL) || r; r = ((glVertexArraySecondaryColorOffsetEXT = (PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArraySecondaryColorOffsetEXT")) == NULL) || r; r = ((glVertexArrayTexCoordOffsetEXT = (PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayTexCoordOffsetEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribDivisorEXT = (PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribDivisorEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribIOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIOffsetEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribOffsetEXT")) == NULL) || r; r = ((glVertexArrayVertexOffsetEXT = (PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexOffsetEXT")) == NULL) || r; return r; } #endif /* GL_EXT_direct_state_access */ #ifdef GL_EXT_discard_framebuffer static GLboolean _glewInit_GL_EXT_discard_framebuffer () { GLboolean r = GL_FALSE; r = ((glDiscardFramebufferEXT = (PFNGLDISCARDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glDiscardFramebufferEXT")) == NULL) || r; return r; } #endif /* GL_EXT_discard_framebuffer */ #ifdef GL_EXT_draw_buffers static GLboolean _glewInit_GL_EXT_draw_buffers () { GLboolean r = GL_FALSE; r = ((glDrawBuffersEXT = (PFNGLDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersEXT")) == NULL) || r; return r; } #endif /* GL_EXT_draw_buffers */ #ifdef GL_EXT_draw_buffers2 static GLboolean _glewInit_GL_EXT_draw_buffers2 () { GLboolean r = GL_FALSE; r = ((glColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glColorMaskIndexedEXT")) == NULL) || r; r = ((glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableIndexedEXT")) == NULL) || r; r = ((glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableIndexedEXT")) == NULL) || r; r = ((glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetBooleanIndexedvEXT")) == NULL) || r; r = ((glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerIndexedvEXT")) == NULL) || r; r = ((glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledIndexedEXT")) == NULL) || r; return r; } #endif /* GL_EXT_draw_buffers2 */ #ifdef GL_EXT_draw_buffers_indexed static GLboolean _glewInit_GL_EXT_draw_buffers_indexed () { GLboolean r = GL_FALSE; r = ((glBlendEquationSeparateiEXT = (PFNGLBLENDEQUATIONSEPARATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiEXT")) == NULL) || r; r = ((glBlendEquationiEXT = (PFNGLBLENDEQUATIONIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiEXT")) == NULL) || r; r = ((glBlendFuncSeparateiEXT = (PFNGLBLENDFUNCSEPARATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiEXT")) == NULL) || r; r = ((glBlendFunciEXT = (PFNGLBLENDFUNCIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciEXT")) == NULL) || r; r = ((glColorMaskiEXT = (PFNGLCOLORMASKIEXTPROC)glewGetProcAddress((const GLubyte*)"glColorMaskiEXT")) == NULL) || r; r = ((glDisableiEXT = (PFNGLDISABLEIEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableiEXT")) == NULL) || r; r = ((glEnableiEXT = (PFNGLENABLEIEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableiEXT")) == NULL) || r; r = ((glIsEnablediEXT = (PFNGLISENABLEDIEXTPROC)glewGetProcAddress((const GLubyte*)"glIsEnablediEXT")) == NULL) || r; return r; } #endif /* GL_EXT_draw_buffers_indexed */ #ifdef GL_EXT_draw_elements_base_vertex static GLboolean _glewInit_GL_EXT_draw_elements_base_vertex () { GLboolean r = GL_FALSE; r = ((glDrawElementsBaseVertexEXT = (PFNGLDRAWELEMENTSBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsBaseVertexEXT")) == NULL) || r; r = ((glDrawElementsInstancedBaseVertexEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexEXT")) == NULL) || r; r = ((glDrawRangeElementsBaseVertexEXT = (PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsBaseVertexEXT")) == NULL) || r; r = ((glMultiDrawElementsBaseVertexEXT = (PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsBaseVertexEXT")) == NULL) || r; return r; } #endif /* GL_EXT_draw_elements_base_vertex */ #ifdef GL_EXT_draw_instanced static GLboolean _glewInit_GL_EXT_draw_instanced () { GLboolean r = GL_FALSE; r = ((glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedEXT")) == NULL) || r; r = ((glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedEXT")) == NULL) || r; return r; } #endif /* GL_EXT_draw_instanced */ #ifdef GL_EXT_draw_range_elements static GLboolean _glewInit_GL_EXT_draw_range_elements () { GLboolean r = GL_FALSE; r = ((glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsEXT")) == NULL) || r; return r; } #endif /* GL_EXT_draw_range_elements */ #ifdef GL_EXT_external_buffer static GLboolean _glewInit_GL_EXT_external_buffer () { GLboolean r = GL_FALSE; r = ((glBufferStorageExternalEXT = (PFNGLBUFFERSTORAGEEXTERNALEXTPROC)glewGetProcAddress((const GLubyte*)"glBufferStorageExternalEXT")) == NULL) || r; r = ((glNamedBufferStorageExternalEXT = (PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageExternalEXT")) == NULL) || r; return r; } #endif /* GL_EXT_external_buffer */ #ifdef GL_EXT_fog_coord static GLboolean _glewInit_GL_EXT_fog_coord () { GLboolean r = GL_FALSE; r = ((glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerEXT")) == NULL) || r; r = ((glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddEXT")) == NULL) || r; r = ((glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddvEXT")) == NULL) || r; r = ((glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfEXT")) == NULL) || r; r = ((glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_fog_coord */ #ifdef GL_EXT_fragment_lighting static GLboolean _glewInit_GL_EXT_fragment_lighting () { GLboolean r = GL_FALSE; r = ((glFragmentColorMaterialEXT = (PFNGLFRAGMENTCOLORMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialEXT")) == NULL) || r; r = ((glFragmentLightModelfEXT = (PFNGLFRAGMENTLIGHTMODELFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfEXT")) == NULL) || r; r = ((glFragmentLightModelfvEXT = (PFNGLFRAGMENTLIGHTMODELFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvEXT")) == NULL) || r; r = ((glFragmentLightModeliEXT = (PFNGLFRAGMENTLIGHTMODELIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliEXT")) == NULL) || r; r = ((glFragmentLightModelivEXT = (PFNGLFRAGMENTLIGHTMODELIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivEXT")) == NULL) || r; r = ((glFragmentLightfEXT = (PFNGLFRAGMENTLIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfEXT")) == NULL) || r; r = ((glFragmentLightfvEXT = (PFNGLFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvEXT")) == NULL) || r; r = ((glFragmentLightiEXT = (PFNGLFRAGMENTLIGHTIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiEXT")) == NULL) || r; r = ((glFragmentLightivEXT = (PFNGLFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivEXT")) == NULL) || r; r = ((glFragmentMaterialfEXT = (PFNGLFRAGMENTMATERIALFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfEXT")) == NULL) || r; r = ((glFragmentMaterialfvEXT = (PFNGLFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvEXT")) == NULL) || r; r = ((glFragmentMaterialiEXT = (PFNGLFRAGMENTMATERIALIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiEXT")) == NULL) || r; r = ((glFragmentMaterialivEXT = (PFNGLFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivEXT")) == NULL) || r; r = ((glGetFragmentLightfvEXT = (PFNGLGETFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvEXT")) == NULL) || r; r = ((glGetFragmentLightivEXT = (PFNGLGETFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivEXT")) == NULL) || r; r = ((glGetFragmentMaterialfvEXT = (PFNGLGETFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvEXT")) == NULL) || r; r = ((glGetFragmentMaterialivEXT = (PFNGLGETFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivEXT")) == NULL) || r; r = ((glLightEnviEXT = (PFNGLLIGHTENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glLightEnviEXT")) == NULL) || r; return r; } #endif /* GL_EXT_fragment_lighting */ #ifdef GL_EXT_framebuffer_blit static GLboolean _glewInit_GL_EXT_framebuffer_blit () { GLboolean r = GL_FALSE; r = ((glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferEXT")) == NULL) || r; return r; } #endif /* GL_EXT_framebuffer_blit */ #ifdef GL_EXT_framebuffer_multisample static GLboolean _glewInit_GL_EXT_framebuffer_multisample () { GLboolean r = GL_FALSE; r = ((glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleEXT")) == NULL) || r; return r; } #endif /* GL_EXT_framebuffer_multisample */ #ifdef GL_EXT_framebuffer_object static GLboolean _glewInit_GL_EXT_framebuffer_object () { GLboolean r = GL_FALSE; r = ((glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindFramebufferEXT")) == NULL) || r; r = ((glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbufferEXT")) == NULL) || r; r = ((glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatusEXT")) == NULL) || r; r = ((glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffersEXT")) == NULL) || r; r = ((glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffersEXT")) == NULL) || r; r = ((glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbufferEXT")) == NULL) || r; r = ((glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1DEXT")) == NULL) || r; r = ((glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DEXT")) == NULL) || r; r = ((glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3DEXT")) == NULL) || r; r = ((glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffersEXT")) == NULL) || r; r = ((glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffersEXT")) == NULL) || r; r = ((glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmapEXT")) == NULL) || r; r = ((glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameterivEXT")) == NULL) || r; r = ((glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameterivEXT")) == NULL) || r; r = ((glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsFramebufferEXT")) == NULL) || r; r = ((glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbufferEXT")) == NULL) || r; r = ((glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageEXT")) == NULL) || r; return r; } #endif /* GL_EXT_framebuffer_object */ #ifdef GL_EXT_geometry_shader4 static GLboolean _glewInit_GL_EXT_geometry_shader4 () { GLboolean r = GL_FALSE; r = ((glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureEXT")) == NULL) || r; r = ((glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceEXT")) == NULL) || r; r = ((glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriEXT")) == NULL) || r; return r; } #endif /* GL_EXT_geometry_shader4 */ #ifdef GL_EXT_gpu_program_parameters static GLboolean _glewInit_GL_EXT_gpu_program_parameters () { GLboolean r = GL_FALSE; r = ((glProgramEnvParameters4fvEXT = (PFNGLPROGRAMENVPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameters4fvEXT")) == NULL) || r; r = ((glProgramLocalParameters4fvEXT = (PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameters4fvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_gpu_program_parameters */ #ifdef GL_EXT_gpu_shader4 static GLboolean _glewInit_GL_EXT_gpu_shader4 () { GLboolean r = GL_FALSE; r = ((glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationEXT")) == NULL) || r; r = ((glGetFragDataLocationEXT = (PFNGLGETFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocationEXT")) == NULL) || r; r = ((glGetUniformuivEXT = (PFNGLGETUNIFORMUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuivEXT")) == NULL) || r; r = ((glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIivEXT")) == NULL) || r; r = ((glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuivEXT")) == NULL) || r; r = ((glUniform1uiEXT = (PFNGLUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiEXT")) == NULL) || r; r = ((glUniform1uivEXT = (PFNGLUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uivEXT")) == NULL) || r; r = ((glUniform2uiEXT = (PFNGLUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiEXT")) == NULL) || r; r = ((glUniform2uivEXT = (PFNGLUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uivEXT")) == NULL) || r; r = ((glUniform3uiEXT = (PFNGLUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiEXT")) == NULL) || r; r = ((glUniform3uivEXT = (PFNGLUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uivEXT")) == NULL) || r; r = ((glUniform4uiEXT = (PFNGLUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiEXT")) == NULL) || r; r = ((glUniform4uivEXT = (PFNGLUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uivEXT")) == NULL) || r; r = ((glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iEXT")) == NULL) || r; r = ((glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ivEXT")) == NULL) || r; r = ((glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiEXT")) == NULL) || r; r = ((glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uivEXT")) == NULL) || r; r = ((glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iEXT")) == NULL) || r; r = ((glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ivEXT")) == NULL) || r; r = ((glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiEXT")) == NULL) || r; r = ((glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uivEXT")) == NULL) || r; r = ((glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iEXT")) == NULL) || r; r = ((glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ivEXT")) == NULL) || r; r = ((glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiEXT")) == NULL) || r; r = ((glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uivEXT")) == NULL) || r; r = ((glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bvEXT")) == NULL) || r; r = ((glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iEXT")) == NULL) || r; r = ((glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ivEXT")) == NULL) || r; r = ((glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4svEXT")) == NULL) || r; r = ((glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubvEXT")) == NULL) || r; r = ((glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiEXT")) == NULL) || r; r = ((glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uivEXT")) == NULL) || r; r = ((glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usvEXT")) == NULL) || r; r = ((glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_gpu_shader4 */ #ifdef GL_EXT_histogram static GLboolean _glewInit_GL_EXT_histogram () { GLboolean r = GL_FALSE; r = ((glGetHistogramEXT = (PFNGLGETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramEXT")) == NULL) || r; r = ((glGetHistogramParameterfvEXT = (PFNGLGETHISTOGRAMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfvEXT")) == NULL) || r; r = ((glGetHistogramParameterivEXT = (PFNGLGETHISTOGRAMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterivEXT")) == NULL) || r; r = ((glGetMinmaxEXT = (PFNGLGETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxEXT")) == NULL) || r; r = ((glGetMinmaxParameterfvEXT = (PFNGLGETMINMAXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfvEXT")) == NULL) || r; r = ((glGetMinmaxParameterivEXT = (PFNGLGETMINMAXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterivEXT")) == NULL) || r; r = ((glHistogramEXT = (PFNGLHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glHistogramEXT")) == NULL) || r; r = ((glMinmaxEXT = (PFNGLMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glMinmaxEXT")) == NULL) || r; r = ((glResetHistogramEXT = (PFNGLRESETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glResetHistogramEXT")) == NULL) || r; r = ((glResetMinmaxEXT = (PFNGLRESETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glResetMinmaxEXT")) == NULL) || r; return r; } #endif /* GL_EXT_histogram */ #ifdef GL_EXT_index_func static GLboolean _glewInit_GL_EXT_index_func () { GLboolean r = GL_FALSE; r = ((glIndexFuncEXT = (PFNGLINDEXFUNCEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexFuncEXT")) == NULL) || r; return r; } #endif /* GL_EXT_index_func */ #ifdef GL_EXT_index_material static GLboolean _glewInit_GL_EXT_index_material () { GLboolean r = GL_FALSE; r = ((glIndexMaterialEXT = (PFNGLINDEXMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexMaterialEXT")) == NULL) || r; return r; } #endif /* GL_EXT_index_material */ #ifdef GL_EXT_instanced_arrays static GLboolean _glewInit_GL_EXT_instanced_arrays () { GLboolean r = GL_FALSE; r = ((glVertexAttribDivisorEXT = (PFNGLVERTEXATTRIBDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorEXT")) == NULL) || r; return r; } #endif /* GL_EXT_instanced_arrays */ #ifdef GL_EXT_light_texture static GLboolean _glewInit_GL_EXT_light_texture () { GLboolean r = GL_FALSE; r = ((glApplyTextureEXT = (PFNGLAPPLYTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glApplyTextureEXT")) == NULL) || r; r = ((glTextureLightEXT = (PFNGLTEXTURELIGHTEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureLightEXT")) == NULL) || r; r = ((glTextureMaterialEXT = (PFNGLTEXTUREMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureMaterialEXT")) == NULL) || r; return r; } #endif /* GL_EXT_light_texture */ #ifdef GL_EXT_map_buffer_range static GLboolean _glewInit_GL_EXT_map_buffer_range () { GLboolean r = GL_FALSE; r = ((glFlushMappedBufferRangeEXT = (PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRangeEXT")) == NULL) || r; r = ((glMapBufferRangeEXT = (PFNGLMAPBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glMapBufferRangeEXT")) == NULL) || r; return r; } #endif /* GL_EXT_map_buffer_range */ #ifdef GL_EXT_memory_object static GLboolean _glewInit_GL_EXT_memory_object () { GLboolean r = GL_FALSE; r = ((glBufferStorageMemEXT = (PFNGLBUFFERSTORAGEMEMEXTPROC)glewGetProcAddress((const GLubyte*)"glBufferStorageMemEXT")) == NULL) || r; r = ((glCreateMemoryObjectsEXT = (PFNGLCREATEMEMORYOBJECTSEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateMemoryObjectsEXT")) == NULL) || r; r = ((glDeleteMemoryObjectsEXT = (PFNGLDELETEMEMORYOBJECTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteMemoryObjectsEXT")) == NULL) || r; r = ((glGetMemoryObjectParameterivEXT = (PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMemoryObjectParameterivEXT")) == NULL) || r; r = ((glGetUnsignedBytei_vEXT = (PFNGLGETUNSIGNEDBYTEI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUnsignedBytei_vEXT")) == NULL) || r; r = ((glGetUnsignedBytevEXT = (PFNGLGETUNSIGNEDBYTEVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUnsignedBytevEXT")) == NULL) || r; r = ((glIsMemoryObjectEXT = (PFNGLISMEMORYOBJECTEXTPROC)glewGetProcAddress((const GLubyte*)"glIsMemoryObjectEXT")) == NULL) || r; r = ((glMemoryObjectParameterivEXT = (PFNGLMEMORYOBJECTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMemoryObjectParameterivEXT")) == NULL) || r; r = ((glNamedBufferStorageMemEXT = (PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageMemEXT")) == NULL) || r; r = ((glTexStorageMem1DEXT = (PFNGLTEXSTORAGEMEM1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem1DEXT")) == NULL) || r; r = ((glTexStorageMem2DEXT = (PFNGLTEXSTORAGEMEM2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem2DEXT")) == NULL) || r; r = ((glTexStorageMem2DMultisampleEXT = (PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem2DMultisampleEXT")) == NULL) || r; r = ((glTexStorageMem3DEXT = (PFNGLTEXSTORAGEMEM3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem3DEXT")) == NULL) || r; r = ((glTexStorageMem3DMultisampleEXT = (PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem3DMultisampleEXT")) == NULL) || r; r = ((glTextureStorageMem1DEXT = (PFNGLTEXTURESTORAGEMEM1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem1DEXT")) == NULL) || r; r = ((glTextureStorageMem2DEXT = (PFNGLTEXTURESTORAGEMEM2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem2DEXT")) == NULL) || r; r = ((glTextureStorageMem2DMultisampleEXT = (PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem2DMultisampleEXT")) == NULL) || r; r = ((glTextureStorageMem3DEXT = (PFNGLTEXTURESTORAGEMEM3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem3DEXT")) == NULL) || r; r = ((glTextureStorageMem3DMultisampleEXT = (PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem3DMultisampleEXT")) == NULL) || r; return r; } #endif /* GL_EXT_memory_object */ #ifdef GL_EXT_memory_object_fd static GLboolean _glewInit_GL_EXT_memory_object_fd () { GLboolean r = GL_FALSE; r = ((glImportMemoryFdEXT = (PFNGLIMPORTMEMORYFDEXTPROC)glewGetProcAddress((const GLubyte*)"glImportMemoryFdEXT")) == NULL) || r; return r; } #endif /* GL_EXT_memory_object_fd */ #ifdef GL_EXT_memory_object_win32 static GLboolean _glewInit_GL_EXT_memory_object_win32 () { GLboolean r = GL_FALSE; r = ((glImportMemoryWin32HandleEXT = (PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportMemoryWin32HandleEXT")) == NULL) || r; r = ((glImportMemoryWin32NameEXT = (PFNGLIMPORTMEMORYWIN32NAMEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportMemoryWin32NameEXT")) == NULL) || r; return r; } #endif /* GL_EXT_memory_object_win32 */ #ifdef GL_EXT_multi_draw_arrays static GLboolean _glewInit_GL_EXT_multi_draw_arrays () { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysEXT")) == NULL) || r; r = ((glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsEXT")) == NULL) || r; return r; } #endif /* GL_EXT_multi_draw_arrays */ #ifdef GL_EXT_multi_draw_indirect static GLboolean _glewInit_GL_EXT_multi_draw_indirect () { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysIndirectEXT = (PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectEXT")) == NULL) || r; r = ((glMultiDrawElementsIndirectEXT = (PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectEXT")) == NULL) || r; return r; } #endif /* GL_EXT_multi_draw_indirect */ #ifdef GL_EXT_multisample static GLboolean _glewInit_GL_EXT_multisample () { GLboolean r = GL_FALSE; r = ((glSampleMaskEXT = (PFNGLSAMPLEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskEXT")) == NULL) || r; r = ((glSamplePatternEXT = (PFNGLSAMPLEPATTERNEXTPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternEXT")) == NULL) || r; return r; } #endif /* GL_EXT_multisample */ #ifdef GL_EXT_multisampled_render_to_texture static GLboolean _glewInit_GL_EXT_multisampled_render_to_texture () { GLboolean r = GL_FALSE; r = ((glFramebufferTexture2DMultisampleEXT = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DMultisampleEXT")) == NULL) || r; return r; } #endif /* GL_EXT_multisampled_render_to_texture */ #ifdef GL_EXT_multiview_draw_buffers static GLboolean _glewInit_GL_EXT_multiview_draw_buffers () { GLboolean r = GL_FALSE; r = ((glDrawBuffersIndexedEXT = (PFNGLDRAWBUFFERSINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersIndexedEXT")) == NULL) || r; r = ((glGetIntegeri_vEXT = (PFNGLGETINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_vEXT")) == NULL) || r; r = ((glReadBufferIndexedEXT = (PFNGLREADBUFFERINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glReadBufferIndexedEXT")) == NULL) || r; return r; } #endif /* GL_EXT_multiview_draw_buffers */ #ifdef GL_EXT_paletted_texture static GLboolean _glewInit_GL_EXT_paletted_texture () { GLboolean r = GL_FALSE; r = ((glColorTableEXT = (PFNGLCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorTableEXT")) == NULL) || r; r = ((glGetColorTableEXT = (PFNGLGETCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableEXT")) == NULL) || r; r = ((glGetColorTableParameterfvEXT = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvEXT")) == NULL) || r; r = ((glGetColorTableParameterivEXT = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivEXT")) == NULL) || r; return r; } #endif /* GL_EXT_paletted_texture */ #ifdef GL_EXT_pixel_transform static GLboolean _glewInit_GL_EXT_pixel_transform () { GLboolean r = GL_FALSE; r = ((glGetPixelTransformParameterfvEXT = (PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvEXT")) == NULL) || r; r = ((glGetPixelTransformParameterivEXT = (PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivEXT")) == NULL) || r; r = ((glPixelTransformParameterfEXT = (PFNGLPIXELTRANSFORMPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfEXT")) == NULL) || r; r = ((glPixelTransformParameterfvEXT = (PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvEXT")) == NULL) || r; r = ((glPixelTransformParameteriEXT = (PFNGLPIXELTRANSFORMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriEXT")) == NULL) || r; r = ((glPixelTransformParameterivEXT = (PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivEXT")) == NULL) || r; return r; } #endif /* GL_EXT_pixel_transform */ #ifdef GL_EXT_point_parameters static GLboolean _glewInit_GL_EXT_point_parameters () { GLboolean r = GL_FALSE; r = ((glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfEXT")) == NULL) || r; r = ((glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_point_parameters */ #ifdef GL_EXT_polygon_offset static GLboolean _glewInit_GL_EXT_polygon_offset () { GLboolean r = GL_FALSE; r = ((glPolygonOffsetEXT = (PFNGLPOLYGONOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetEXT")) == NULL) || r; return r; } #endif /* GL_EXT_polygon_offset */ #ifdef GL_EXT_polygon_offset_clamp static GLboolean _glewInit_GL_EXT_polygon_offset_clamp () { GLboolean r = GL_FALSE; r = ((glPolygonOffsetClampEXT = (PFNGLPOLYGONOFFSETCLAMPEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetClampEXT")) == NULL) || r; return r; } #endif /* GL_EXT_polygon_offset_clamp */ #ifdef GL_EXT_provoking_vertex static GLboolean _glewInit_GL_EXT_provoking_vertex () { GLboolean r = GL_FALSE; r = ((glProvokingVertexEXT = (PFNGLPROVOKINGVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertexEXT")) == NULL) || r; return r; } #endif /* GL_EXT_provoking_vertex */ #ifdef GL_EXT_raster_multisample static GLboolean _glewInit_GL_EXT_raster_multisample () { GLboolean r = GL_FALSE; r = ((glCoverageModulationNV = (PFNGLCOVERAGEMODULATIONNVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationNV")) == NULL) || r; r = ((glCoverageModulationTableNV = (PFNGLCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationTableNV")) == NULL) || r; r = ((glGetCoverageModulationTableNV = (PFNGLGETCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glGetCoverageModulationTableNV")) == NULL) || r; r = ((glRasterSamplesEXT = (PFNGLRASTERSAMPLESEXTPROC)glewGetProcAddress((const GLubyte*)"glRasterSamplesEXT")) == NULL) || r; return r; } #endif /* GL_EXT_raster_multisample */ #ifdef GL_EXT_scene_marker static GLboolean _glewInit_GL_EXT_scene_marker () { GLboolean r = GL_FALSE; r = ((glBeginSceneEXT = (PFNGLBEGINSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginSceneEXT")) == NULL) || r; r = ((glEndSceneEXT = (PFNGLENDSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glEndSceneEXT")) == NULL) || r; return r; } #endif /* GL_EXT_scene_marker */ #ifdef GL_EXT_secondary_color static GLboolean _glewInit_GL_EXT_secondary_color () { GLboolean r = GL_FALSE; r = ((glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bEXT")) == NULL) || r; r = ((glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bvEXT")) == NULL) || r; r = ((glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dEXT")) == NULL) || r; r = ((glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dvEXT")) == NULL) || r; r = ((glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fEXT")) == NULL) || r; r = ((glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fvEXT")) == NULL) || r; r = ((glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iEXT")) == NULL) || r; r = ((glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ivEXT")) == NULL) || r; r = ((glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sEXT")) == NULL) || r; r = ((glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3svEXT")) == NULL) || r; r = ((glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubEXT")) == NULL) || r; r = ((glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubvEXT")) == NULL) || r; r = ((glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiEXT")) == NULL) || r; r = ((glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uivEXT")) == NULL) || r; r = ((glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usEXT")) == NULL) || r; r = ((glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usvEXT")) == NULL) || r; r = ((glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_secondary_color */ #ifdef GL_EXT_semaphore static GLboolean _glewInit_GL_EXT_semaphore () { GLboolean r = GL_FALSE; r = ((glDeleteSemaphoresEXT = (PFNGLDELETESEMAPHORESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteSemaphoresEXT")) == NULL) || r; r = ((glGenSemaphoresEXT = (PFNGLGENSEMAPHORESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSemaphoresEXT")) == NULL) || r; r = ((glGetSemaphoreParameterui64vEXT = (PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetSemaphoreParameterui64vEXT")) == NULL) || r; r = ((glIsSemaphoreEXT = (PFNGLISSEMAPHOREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsSemaphoreEXT")) == NULL) || r; r = ((glSemaphoreParameterui64vEXT = (PFNGLSEMAPHOREPARAMETERUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glSemaphoreParameterui64vEXT")) == NULL) || r; r = ((glSignalSemaphoreEXT = (PFNGLSIGNALSEMAPHOREEXTPROC)glewGetProcAddress((const GLubyte*)"glSignalSemaphoreEXT")) == NULL) || r; r = ((glWaitSemaphoreEXT = (PFNGLWAITSEMAPHOREEXTPROC)glewGetProcAddress((const GLubyte*)"glWaitSemaphoreEXT")) == NULL) || r; return r; } #endif /* GL_EXT_semaphore */ #ifdef GL_EXT_semaphore_fd static GLboolean _glewInit_GL_EXT_semaphore_fd () { GLboolean r = GL_FALSE; r = ((glImportSemaphoreFdEXT = (PFNGLIMPORTSEMAPHOREFDEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSemaphoreFdEXT")) == NULL) || r; return r; } #endif /* GL_EXT_semaphore_fd */ #ifdef GL_EXT_semaphore_win32 static GLboolean _glewInit_GL_EXT_semaphore_win32 () { GLboolean r = GL_FALSE; r = ((glImportSemaphoreWin32HandleEXT = (PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSemaphoreWin32HandleEXT")) == NULL) || r; r = ((glImportSemaphoreWin32NameEXT = (PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSemaphoreWin32NameEXT")) == NULL) || r; return r; } #endif /* GL_EXT_semaphore_win32 */ #ifdef GL_EXT_separate_shader_objects static GLboolean _glewInit_GL_EXT_separate_shader_objects () { GLboolean r = GL_FALSE; r = ((glActiveProgramEXT = (PFNGLACTIVEPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveProgramEXT")) == NULL) || r; r = ((glCreateShaderProgramEXT = (PFNGLCREATESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramEXT")) == NULL) || r; r = ((glUseShaderProgramEXT = (PFNGLUSESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glUseShaderProgramEXT")) == NULL) || r; return r; } #endif /* GL_EXT_separate_shader_objects */ #ifdef GL_EXT_shader_image_load_store static GLboolean _glewInit_GL_EXT_shader_image_load_store () { GLboolean r = GL_FALSE; r = ((glBindImageTextureEXT = (PFNGLBINDIMAGETEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextureEXT")) == NULL) || r; r = ((glMemoryBarrierEXT = (PFNGLMEMORYBARRIEREXTPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierEXT")) == NULL) || r; return r; } #endif /* GL_EXT_shader_image_load_store */ #ifdef GL_EXT_shader_pixel_local_storage2 static GLboolean _glewInit_GL_EXT_shader_pixel_local_storage2 () { GLboolean r = GL_FALSE; r = ((glClearPixelLocalStorageuiEXT = (PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearPixelLocalStorageuiEXT")) == NULL) || r; r = ((glFramebufferPixelLocalStorageSizeEXT = (PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferPixelLocalStorageSizeEXT")) == NULL) || r; r = ((glGetFramebufferPixelLocalStorageSizeEXT = (PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferPixelLocalStorageSizeEXT")) == NULL) || r; return r; } #endif /* GL_EXT_shader_pixel_local_storage2 */ #ifdef GL_EXT_sparse_texture static GLboolean _glewInit_GL_EXT_sparse_texture () { GLboolean r = GL_FALSE; r = ((glTexPageCommitmentEXT = (PFNGLTEXPAGECOMMITMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glTexPageCommitmentEXT")) == NULL) || r; r = ((glTexturePageCommitmentEXT = (PFNGLTEXTUREPAGECOMMITMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glTexturePageCommitmentEXT")) == NULL) || r; return r; } #endif /* GL_EXT_sparse_texture */ #ifdef GL_EXT_stencil_two_side static GLboolean _glewInit_GL_EXT_stencil_two_side () { GLboolean r = GL_FALSE; r = ((glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveStencilFaceEXT")) == NULL) || r; return r; } #endif /* GL_EXT_stencil_two_side */ #ifdef GL_EXT_subtexture static GLboolean _glewInit_GL_EXT_subtexture () { GLboolean r = GL_FALSE; r = ((glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage1DEXT")) == NULL) || r; r = ((glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage2DEXT")) == NULL) || r; r = ((glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DEXT")) == NULL) || r; return r; } #endif /* GL_EXT_subtexture */ #ifdef GL_EXT_texture3D static GLboolean _glewInit_GL_EXT_texture3D () { GLboolean r = GL_FALSE; r = ((glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture3D */ #ifdef GL_EXT_texture_array static GLboolean _glewInit_GL_EXT_texture_array () { GLboolean r = GL_FALSE; r = ((glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_array */ #ifdef GL_EXT_texture_buffer_object static GLboolean _glewInit_GL_EXT_texture_buffer_object () { GLboolean r = GL_FALSE; r = ((glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexBufferEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_buffer_object */ #ifdef GL_EXT_texture_integer static GLboolean _glewInit_GL_EXT_texture_integer () { GLboolean r = GL_FALSE; r = ((glClearColorIiEXT = (PFNGLCLEARCOLORIIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIiEXT")) == NULL) || r; r = ((glClearColorIuiEXT = (PFNGLCLEARCOLORIUIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIuiEXT")) == NULL) || r; r = ((glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIivEXT")) == NULL) || r; r = ((glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuivEXT")) == NULL) || r; r = ((glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIivEXT")) == NULL) || r; r = ((glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuivEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_integer */ #ifdef GL_EXT_texture_object static GLboolean _glewInit_GL_EXT_texture_object () { GLboolean r = GL_FALSE; r = ((glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC)glewGetProcAddress((const GLubyte*)"glAreTexturesResidentEXT")) == NULL) || r; r = ((glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureEXT")) == NULL) || r; r = ((glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteTexturesEXT")) == NULL) || r; r = ((glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenTexturesEXT")) == NULL) || r; r = ((glIsTextureEXT = (PFNGLISTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsTextureEXT")) == NULL) || r; r = ((glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeTexturesEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_object */ #ifdef GL_EXT_texture_perturb_normal static GLboolean _glewInit_GL_EXT_texture_perturb_normal () { GLboolean r = GL_FALSE; r = ((glTextureNormalEXT = (PFNGLTEXTURENORMALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureNormalEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_perturb_normal */ #ifdef GL_EXT_texture_storage static GLboolean _glewInit_GL_EXT_texture_storage () { GLboolean r = GL_FALSE; r = ((glTexStorage1DEXT = (PFNGLTEXSTORAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorage1DEXT")) == NULL) || r; r = ((glTexStorage2DEXT = (PFNGLTEXSTORAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2DEXT")) == NULL) || r; r = ((glTexStorage3DEXT = (PFNGLTEXSTORAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3DEXT")) == NULL) || r; r = ((glTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1DEXT")) == NULL) || r; r = ((glTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DEXT")) == NULL) || r; r = ((glTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_storage */ #ifdef GL_EXT_texture_view static GLboolean _glewInit_GL_EXT_texture_view () { GLboolean r = GL_FALSE; r = ((glTextureViewEXT = (PFNGLTEXTUREVIEWEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureViewEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_view */ #ifdef GL_EXT_timer_query static GLboolean _glewInit_GL_EXT_timer_query () { GLboolean r = GL_FALSE; r = ((glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vEXT")) == NULL) || r; r = ((glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vEXT")) == NULL) || r; return r; } #endif /* GL_EXT_timer_query */ #ifdef GL_EXT_transform_feedback static GLboolean _glewInit_GL_EXT_transform_feedback () { GLboolean r = GL_FALSE; r = ((glBeginTransformFeedbackEXT = (PFNGLBEGINTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackEXT")) == NULL) || r; r = ((glBindBufferBaseEXT = (PFNGLBINDBUFFERBASEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseEXT")) == NULL) || r; r = ((glBindBufferOffsetEXT = (PFNGLBINDBUFFEROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetEXT")) == NULL) || r; r = ((glBindBufferRangeEXT = (PFNGLBINDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeEXT")) == NULL) || r; r = ((glEndTransformFeedbackEXT = (PFNGLENDTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackEXT")) == NULL) || r; r = ((glGetTransformFeedbackVaryingEXT = (PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingEXT")) == NULL) || r; r = ((glTransformFeedbackVaryingsEXT = (PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsEXT")) == NULL) || r; return r; } #endif /* GL_EXT_transform_feedback */ #ifdef GL_EXT_vertex_array static GLboolean _glewInit_GL_EXT_vertex_array () { GLboolean r = GL_FALSE; r = ((glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glArrayElementEXT")) == NULL) || r; r = ((glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glColorPointerEXT")) == NULL) || r; r = ((glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysEXT")) == NULL) || r; r = ((glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerEXT")) == NULL) || r; r = ((glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerEXT")) == NULL) || r; r = ((glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerEXT")) == NULL) || r; r = ((glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerEXT")) == NULL) || r; r = ((glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_vertex_array */ #ifdef GL_EXT_vertex_array_setXXX static GLboolean _glewInit_GL_EXT_vertex_array_setXXX () { GLboolean r = GL_FALSE; r = ((glBindArraySetEXT = (PFNGLBINDARRAYSETEXTPROC)glewGetProcAddress((const GLubyte*)"glBindArraySetEXT")) == NULL) || r; r = ((glCreateArraySetExt = (PFNGLCREATEARRAYSETEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateArraySetExt")) == NULL) || r; r = ((glDeleteArraySetsEXT = (PFNGLDELETEARRAYSETSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteArraySetsEXT")) == NULL) || r; return r; } #endif /* GL_EXT_vertex_array_setXXX */ #ifdef GL_EXT_vertex_attrib_64bit static GLboolean _glewInit_GL_EXT_vertex_attrib_64bit () { GLboolean r = GL_FALSE; r = ((glGetVertexAttribLdvEXT = (PFNGLGETVERTEXATTRIBLDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdvEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribLOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLOffsetEXT")) == NULL) || r; r = ((glVertexAttribL1dEXT = (PFNGLVERTEXATTRIBL1DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dEXT")) == NULL) || r; r = ((glVertexAttribL1dvEXT = (PFNGLVERTEXATTRIBL1DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dvEXT")) == NULL) || r; r = ((glVertexAttribL2dEXT = (PFNGLVERTEXATTRIBL2DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dEXT")) == NULL) || r; r = ((glVertexAttribL2dvEXT = (PFNGLVERTEXATTRIBL2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dvEXT")) == NULL) || r; r = ((glVertexAttribL3dEXT = (PFNGLVERTEXATTRIBL3DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dEXT")) == NULL) || r; r = ((glVertexAttribL3dvEXT = (PFNGLVERTEXATTRIBL3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dvEXT")) == NULL) || r; r = ((glVertexAttribL4dEXT = (PFNGLVERTEXATTRIBL4DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dEXT")) == NULL) || r; r = ((glVertexAttribL4dvEXT = (PFNGLVERTEXATTRIBL4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dvEXT")) == NULL) || r; r = ((glVertexAttribLPointerEXT = (PFNGLVERTEXATTRIBLPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_vertex_attrib_64bit */ #ifdef GL_EXT_vertex_shader static GLboolean _glewInit_GL_EXT_vertex_shader () { GLboolean r = GL_FALSE; r = ((glBeginVertexShaderEXT = (PFNGLBEGINVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBeginVertexShaderEXT")) == NULL) || r; r = ((glBindLightParameterEXT = (PFNGLBINDLIGHTPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindLightParameterEXT")) == NULL) || r; r = ((glBindMaterialParameterEXT = (PFNGLBINDMATERIALPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindMaterialParameterEXT")) == NULL) || r; r = ((glBindParameterEXT = (PFNGLBINDPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindParameterEXT")) == NULL) || r; r = ((glBindTexGenParameterEXT = (PFNGLBINDTEXGENPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTexGenParameterEXT")) == NULL) || r; r = ((glBindTextureUnitParameterEXT = (PFNGLBINDTEXTUREUNITPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnitParameterEXT")) == NULL) || r; r = ((glBindVertexShaderEXT = (PFNGLBINDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindVertexShaderEXT")) == NULL) || r; r = ((glDeleteVertexShaderEXT = (PFNGLDELETEVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexShaderEXT")) == NULL) || r; r = ((glDisableVariantClientStateEXT = (PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVariantClientStateEXT")) == NULL) || r; r = ((glEnableVariantClientStateEXT = (PFNGLENABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVariantClientStateEXT")) == NULL) || r; r = ((glEndVertexShaderEXT = (PFNGLENDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glEndVertexShaderEXT")) == NULL) || r; r = ((glExtractComponentEXT = (PFNGLEXTRACTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glExtractComponentEXT")) == NULL) || r; r = ((glGenSymbolsEXT = (PFNGLGENSYMBOLSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSymbolsEXT")) == NULL) || r; r = ((glGenVertexShadersEXT = (PFNGLGENVERTEXSHADERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenVertexShadersEXT")) == NULL) || r; r = ((glGetInvariantBooleanvEXT = (PFNGLGETINVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantBooleanvEXT")) == NULL) || r; r = ((glGetInvariantFloatvEXT = (PFNGLGETINVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantFloatvEXT")) == NULL) || r; r = ((glGetInvariantIntegervEXT = (PFNGLGETINVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantIntegervEXT")) == NULL) || r; r = ((glGetLocalConstantBooleanvEXT = (PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantBooleanvEXT")) == NULL) || r; r = ((glGetLocalConstantFloatvEXT = (PFNGLGETLOCALCONSTANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantFloatvEXT")) == NULL) || r; r = ((glGetLocalConstantIntegervEXT = (PFNGLGETLOCALCONSTANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantIntegervEXT")) == NULL) || r; r = ((glGetVariantBooleanvEXT = (PFNGLGETVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantBooleanvEXT")) == NULL) || r; r = ((glGetVariantFloatvEXT = (PFNGLGETVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantFloatvEXT")) == NULL) || r; r = ((glGetVariantIntegervEXT = (PFNGLGETVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantIntegervEXT")) == NULL) || r; r = ((glGetVariantPointervEXT = (PFNGLGETVARIANTPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantPointervEXT")) == NULL) || r; r = ((glInsertComponentEXT = (PFNGLINSERTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glInsertComponentEXT")) == NULL) || r; r = ((glIsVariantEnabledEXT = (PFNGLISVARIANTENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsVariantEnabledEXT")) == NULL) || r; r = ((glSetInvariantEXT = (PFNGLSETINVARIANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetInvariantEXT")) == NULL) || r; r = ((glSetLocalConstantEXT = (PFNGLSETLOCALCONSTANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetLocalConstantEXT")) == NULL) || r; r = ((glShaderOp1EXT = (PFNGLSHADEROP1EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp1EXT")) == NULL) || r; r = ((glShaderOp2EXT = (PFNGLSHADEROP2EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp2EXT")) == NULL) || r; r = ((glShaderOp3EXT = (PFNGLSHADEROP3EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp3EXT")) == NULL) || r; r = ((glSwizzleEXT = (PFNGLSWIZZLEEXTPROC)glewGetProcAddress((const GLubyte*)"glSwizzleEXT")) == NULL) || r; r = ((glVariantPointerEXT = (PFNGLVARIANTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVariantPointerEXT")) == NULL) || r; r = ((glVariantbvEXT = (PFNGLVARIANTBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantbvEXT")) == NULL) || r; r = ((glVariantdvEXT = (PFNGLVARIANTDVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantdvEXT")) == NULL) || r; r = ((glVariantfvEXT = (PFNGLVARIANTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantfvEXT")) == NULL) || r; r = ((glVariantivEXT = (PFNGLVARIANTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantivEXT")) == NULL) || r; r = ((glVariantsvEXT = (PFNGLVARIANTSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantsvEXT")) == NULL) || r; r = ((glVariantubvEXT = (PFNGLVARIANTUBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantubvEXT")) == NULL) || r; r = ((glVariantuivEXT = (PFNGLVARIANTUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantuivEXT")) == NULL) || r; r = ((glVariantusvEXT = (PFNGLVARIANTUSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantusvEXT")) == NULL) || r; r = ((glWriteMaskEXT = (PFNGLWRITEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glWriteMaskEXT")) == NULL) || r; return r; } #endif /* GL_EXT_vertex_shader */ #ifdef GL_EXT_vertex_weighting static GLboolean _glewInit_GL_EXT_vertex_weighting () { GLboolean r = GL_FALSE; r = ((glVertexWeightPointerEXT = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightPointerEXT")) == NULL) || r; r = ((glVertexWeightfEXT = (PFNGLVERTEXWEIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfEXT")) == NULL) || r; r = ((glVertexWeightfvEXT = (PFNGLVERTEXWEIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_vertex_weighting */ #ifdef GL_EXT_win32_keyed_mutex static GLboolean _glewInit_GL_EXT_win32_keyed_mutex () { GLboolean r = GL_FALSE; r = ((glAcquireKeyedMutexWin32EXT = (PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC)glewGetProcAddress((const GLubyte*)"glAcquireKeyedMutexWin32EXT")) == NULL) || r; r = ((glReleaseKeyedMutexWin32EXT = (PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC)glewGetProcAddress((const GLubyte*)"glReleaseKeyedMutexWin32EXT")) == NULL) || r; return r; } #endif /* GL_EXT_win32_keyed_mutex */ #ifdef GL_EXT_window_rectangles static GLboolean _glewInit_GL_EXT_window_rectangles () { GLboolean r = GL_FALSE; r = ((glWindowRectanglesEXT = (PFNGLWINDOWRECTANGLESEXTPROC)glewGetProcAddress((const GLubyte*)"glWindowRectanglesEXT")) == NULL) || r; return r; } #endif /* GL_EXT_window_rectangles */ #ifdef GL_EXT_x11_sync_object static GLboolean _glewInit_GL_EXT_x11_sync_object () { GLboolean r = GL_FALSE; r = ((glImportSyncEXT = (PFNGLIMPORTSYNCEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSyncEXT")) == NULL) || r; return r; } #endif /* GL_EXT_x11_sync_object */ #ifdef GL_GREMEDY_frame_terminator static GLboolean _glewInit_GL_GREMEDY_frame_terminator () { GLboolean r = GL_FALSE; r = ((glFrameTerminatorGREMEDY = (PFNGLFRAMETERMINATORGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glFrameTerminatorGREMEDY")) == NULL) || r; return r; } #endif /* GL_GREMEDY_frame_terminator */ #ifdef GL_GREMEDY_string_marker static GLboolean _glewInit_GL_GREMEDY_string_marker () { GLboolean r = GL_FALSE; r = ((glStringMarkerGREMEDY = (PFNGLSTRINGMARKERGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glStringMarkerGREMEDY")) == NULL) || r; return r; } #endif /* GL_GREMEDY_string_marker */ #ifdef GL_HP_image_transform static GLboolean _glewInit_GL_HP_image_transform () { GLboolean r = GL_FALSE; r = ((glGetImageTransformParameterfvHP = (PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterfvHP")) == NULL) || r; r = ((glGetImageTransformParameterivHP = (PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterivHP")) == NULL) || r; r = ((glImageTransformParameterfHP = (PFNGLIMAGETRANSFORMPARAMETERFHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfHP")) == NULL) || r; r = ((glImageTransformParameterfvHP = (PFNGLIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfvHP")) == NULL) || r; r = ((glImageTransformParameteriHP = (PFNGLIMAGETRANSFORMPARAMETERIHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameteriHP")) == NULL) || r; r = ((glImageTransformParameterivHP = (PFNGLIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterivHP")) == NULL) || r; return r; } #endif /* GL_HP_image_transform */ #ifdef GL_IBM_multimode_draw_arrays static GLboolean _glewInit_GL_IBM_multimode_draw_arrays () { GLboolean r = GL_FALSE; r = ((glMultiModeDrawArraysIBM = (PFNGLMULTIMODEDRAWARRAYSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawArraysIBM")) == NULL) || r; r = ((glMultiModeDrawElementsIBM = (PFNGLMULTIMODEDRAWELEMENTSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawElementsIBM")) == NULL) || r; return r; } #endif /* GL_IBM_multimode_draw_arrays */ #ifdef GL_IBM_vertex_array_lists static GLboolean _glewInit_GL_IBM_vertex_array_lists () { GLboolean r = GL_FALSE; r = ((glColorPointerListIBM = (PFNGLCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glColorPointerListIBM")) == NULL) || r; r = ((glEdgeFlagPointerListIBM = (PFNGLEDGEFLAGPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerListIBM")) == NULL) || r; r = ((glFogCoordPointerListIBM = (PFNGLFOGCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerListIBM")) == NULL) || r; r = ((glIndexPointerListIBM = (PFNGLINDEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerListIBM")) == NULL) || r; r = ((glNormalPointerListIBM = (PFNGLNORMALPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerListIBM")) == NULL) || r; r = ((glSecondaryColorPointerListIBM = (PFNGLSECONDARYCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerListIBM")) == NULL) || r; r = ((glTexCoordPointerListIBM = (PFNGLTEXCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerListIBM")) == NULL) || r; r = ((glVertexPointerListIBM = (PFNGLVERTEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerListIBM")) == NULL) || r; return r; } #endif /* GL_IBM_vertex_array_lists */ #ifdef GL_INTEL_map_texture static GLboolean _glewInit_GL_INTEL_map_texture () { GLboolean r = GL_FALSE; r = ((glMapTexture2DINTEL = (PFNGLMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glMapTexture2DINTEL")) == NULL) || r; r = ((glSyncTextureINTEL = (PFNGLSYNCTEXTUREINTELPROC)glewGetProcAddress((const GLubyte*)"glSyncTextureINTEL")) == NULL) || r; r = ((glUnmapTexture2DINTEL = (PFNGLUNMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glUnmapTexture2DINTEL")) == NULL) || r; return r; } #endif /* GL_INTEL_map_texture */ #ifdef GL_INTEL_parallel_arrays static GLboolean _glewInit_GL_INTEL_parallel_arrays () { GLboolean r = GL_FALSE; r = ((glColorPointervINTEL = (PFNGLCOLORPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glColorPointervINTEL")) == NULL) || r; r = ((glNormalPointervINTEL = (PFNGLNORMALPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glNormalPointervINTEL")) == NULL) || r; r = ((glTexCoordPointervINTEL = (PFNGLTEXCOORDPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointervINTEL")) == NULL) || r; r = ((glVertexPointervINTEL = (PFNGLVERTEXPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glVertexPointervINTEL")) == NULL) || r; return r; } #endif /* GL_INTEL_parallel_arrays */ #ifdef GL_INTEL_performance_query static GLboolean _glewInit_GL_INTEL_performance_query () { GLboolean r = GL_FALSE; r = ((glBeginPerfQueryINTEL = (PFNGLBEGINPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfQueryINTEL")) == NULL) || r; r = ((glCreatePerfQueryINTEL = (PFNGLCREATEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glCreatePerfQueryINTEL")) == NULL) || r; r = ((glDeletePerfQueryINTEL = (PFNGLDELETEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfQueryINTEL")) == NULL) || r; r = ((glEndPerfQueryINTEL = (PFNGLENDPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glEndPerfQueryINTEL")) == NULL) || r; r = ((glGetFirstPerfQueryIdINTEL = (PFNGLGETFIRSTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetFirstPerfQueryIdINTEL")) == NULL) || r; r = ((glGetNextPerfQueryIdINTEL = (PFNGLGETNEXTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetNextPerfQueryIdINTEL")) == NULL) || r; r = ((glGetPerfCounterInfoINTEL = (PFNGLGETPERFCOUNTERINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfCounterInfoINTEL")) == NULL) || r; r = ((glGetPerfQueryDataINTEL = (PFNGLGETPERFQUERYDATAINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryDataINTEL")) == NULL) || r; r = ((glGetPerfQueryIdByNameINTEL = (PFNGLGETPERFQUERYIDBYNAMEINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryIdByNameINTEL")) == NULL) || r; r = ((glGetPerfQueryInfoINTEL = (PFNGLGETPERFQUERYINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryInfoINTEL")) == NULL) || r; return r; } #endif /* GL_INTEL_performance_query */ #ifdef GL_INTEL_texture_scissor static GLboolean _glewInit_GL_INTEL_texture_scissor () { GLboolean r = GL_FALSE; r = ((glTexScissorFuncINTEL = (PFNGLTEXSCISSORFUNCINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorFuncINTEL")) == NULL) || r; r = ((glTexScissorINTEL = (PFNGLTEXSCISSORINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorINTEL")) == NULL) || r; return r; } #endif /* GL_INTEL_texture_scissor */ #ifdef GL_KHR_blend_equation_advanced static GLboolean _glewInit_GL_KHR_blend_equation_advanced () { GLboolean r = GL_FALSE; r = ((glBlendBarrierKHR = (PFNGLBLENDBARRIERKHRPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierKHR")) == NULL) || r; return r; } #endif /* GL_KHR_blend_equation_advanced */ #ifdef GL_KHR_debug static GLboolean _glewInit_GL_KHR_debug () { GLboolean r = GL_FALSE; r = ((glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallback")) == NULL) || r; r = ((glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControl")) == NULL) || r; r = ((glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsert")) == NULL) || r; r = ((glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLog")) == NULL) || r; r = ((glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabel")) == NULL) || r; r = ((glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectPtrLabel")) == NULL) || r; r = ((glObjectLabel = (PFNGLOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectLabel")) == NULL) || r; r = ((glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectPtrLabel")) == NULL) || r; r = ((glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPopDebugGroup")) == NULL) || r; r = ((glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPushDebugGroup")) == NULL) || r; return r; } #endif /* GL_KHR_debug */ #ifdef GL_KHR_parallel_shader_compile static GLboolean _glewInit_GL_KHR_parallel_shader_compile () { GLboolean r = GL_FALSE; r = ((glMaxShaderCompilerThreadsKHR = (PFNGLMAXSHADERCOMPILERTHREADSKHRPROC)glewGetProcAddress((const GLubyte*)"glMaxShaderCompilerThreadsKHR")) == NULL) || r; return r; } #endif /* GL_KHR_parallel_shader_compile */ #ifdef GL_KHR_robustness static GLboolean _glewInit_GL_KHR_robustness () { GLboolean r = GL_FALSE; r = ((glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfv")) == NULL) || r; r = ((glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformiv")) == NULL) || r; r = ((glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuiv")) == NULL) || r; r = ((glReadnPixels = (PFNGLREADNPIXELSPROC)glewGetProcAddress((const GLubyte*)"glReadnPixels")) == NULL) || r; return r; } #endif /* GL_KHR_robustness */ #ifdef GL_KTX_buffer_region static GLboolean _glewInit_GL_KTX_buffer_region () { GLboolean r = GL_FALSE; r = ((glBufferRegionEnabled = (PFNGLBUFFERREGIONENABLEDPROC)glewGetProcAddress((const GLubyte*)"glBufferRegionEnabled")) == NULL) || r; r = ((glDeleteBufferRegion = (PFNGLDELETEBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDeleteBufferRegion")) == NULL) || r; r = ((glDrawBufferRegion = (PFNGLDRAWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDrawBufferRegion")) == NULL) || r; r = ((glNewBufferRegion = (PFNGLNEWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glNewBufferRegion")) == NULL) || r; r = ((glReadBufferRegion = (PFNGLREADBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glReadBufferRegion")) == NULL) || r; return r; } #endif /* GL_KTX_buffer_region */ #ifdef GL_MESA_resize_buffers static GLboolean _glewInit_GL_MESA_resize_buffers () { GLboolean r = GL_FALSE; r = ((glResizeBuffersMESA = (PFNGLRESIZEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glResizeBuffersMESA")) == NULL) || r; return r; } #endif /* GL_MESA_resize_buffers */ #ifdef GL_MESA_window_pos static GLboolean _glewInit_GL_MESA_window_pos () { GLboolean r = GL_FALSE; r = ((glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dMESA")) == NULL) || r; r = ((glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvMESA")) == NULL) || r; r = ((glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fMESA")) == NULL) || r; r = ((glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvMESA")) == NULL) || r; r = ((glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iMESA")) == NULL) || r; r = ((glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivMESA")) == NULL) || r; r = ((glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sMESA")) == NULL) || r; r = ((glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svMESA")) == NULL) || r; r = ((glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dMESA")) == NULL) || r; r = ((glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvMESA")) == NULL) || r; r = ((glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fMESA")) == NULL) || r; r = ((glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvMESA")) == NULL) || r; r = ((glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iMESA")) == NULL) || r; r = ((glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivMESA")) == NULL) || r; r = ((glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sMESA")) == NULL) || r; r = ((glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svMESA")) == NULL) || r; r = ((glWindowPos4dMESA = (PFNGLWINDOWPOS4DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dMESA")) == NULL) || r; r = ((glWindowPos4dvMESA = (PFNGLWINDOWPOS4DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dvMESA")) == NULL) || r; r = ((glWindowPos4fMESA = (PFNGLWINDOWPOS4FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fMESA")) == NULL) || r; r = ((glWindowPos4fvMESA = (PFNGLWINDOWPOS4FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fvMESA")) == NULL) || r; r = ((glWindowPos4iMESA = (PFNGLWINDOWPOS4IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4iMESA")) == NULL) || r; r = ((glWindowPos4ivMESA = (PFNGLWINDOWPOS4IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4ivMESA")) == NULL) || r; r = ((glWindowPos4sMESA = (PFNGLWINDOWPOS4SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4sMESA")) == NULL) || r; r = ((glWindowPos4svMESA = (PFNGLWINDOWPOS4SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4svMESA")) == NULL) || r; return r; } #endif /* GL_MESA_window_pos */ #ifdef GL_NVX_conditional_render static GLboolean _glewInit_GL_NVX_conditional_render () { GLboolean r = GL_FALSE; r = ((glBeginConditionalRenderNVX = (PFNGLBEGINCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNVX")) == NULL) || r; r = ((glEndConditionalRenderNVX = (PFNGLENDCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNVX")) == NULL) || r; return r; } #endif /* GL_NVX_conditional_render */ #ifdef GL_NVX_linked_gpu_multicast static GLboolean _glewInit_GL_NVX_linked_gpu_multicast () { GLboolean r = GL_FALSE; r = ((glLGPUCopyImageSubDataNVX = (PFNGLLGPUCOPYIMAGESUBDATANVXPROC)glewGetProcAddress((const GLubyte*)"glLGPUCopyImageSubDataNVX")) == NULL) || r; r = ((glLGPUInterlockNVX = (PFNGLLGPUINTERLOCKNVXPROC)glewGetProcAddress((const GLubyte*)"glLGPUInterlockNVX")) == NULL) || r; r = ((glLGPUNamedBufferSubDataNVX = (PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC)glewGetProcAddress((const GLubyte*)"glLGPUNamedBufferSubDataNVX")) == NULL) || r; return r; } #endif /* GL_NVX_linked_gpu_multicast */ #ifdef GL_NV_3dvision_settings static GLboolean _glewInit_GL_NV_3dvision_settings () { GLboolean r = GL_FALSE; r = ((glStereoParameterfNV = (PFNGLSTEREOPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glStereoParameterfNV")) == NULL) || r; r = ((glStereoParameteriNV = (PFNGLSTEREOPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glStereoParameteriNV")) == NULL) || r; return r; } #endif /* GL_NV_3dvision_settings */ #ifdef GL_NV_bindless_multi_draw_indirect static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect () { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysIndirectBindlessNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessNV")) == NULL) || r; r = ((glMultiDrawElementsIndirectBindlessNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessNV")) == NULL) || r; return r; } #endif /* GL_NV_bindless_multi_draw_indirect */ #ifdef GL_NV_bindless_multi_draw_indirect_count static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect_count () { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysIndirectBindlessCountNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessCountNV")) == NULL) || r; r = ((glMultiDrawElementsIndirectBindlessCountNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessCountNV")) == NULL) || r; return r; } #endif /* GL_NV_bindless_multi_draw_indirect_count */ #ifdef GL_NV_bindless_texture static GLboolean _glewInit_GL_NV_bindless_texture () { GLboolean r = GL_FALSE; r = ((glGetImageHandleNV = (PFNGLGETIMAGEHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleNV")) == NULL) || r; r = ((glGetTextureHandleNV = (PFNGLGETTEXTUREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleNV")) == NULL) || r; r = ((glGetTextureSamplerHandleNV = (PFNGLGETTEXTURESAMPLERHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleNV")) == NULL) || r; r = ((glIsImageHandleResidentNV = (PFNGLISIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentNV")) == NULL) || r; r = ((glIsTextureHandleResidentNV = (PFNGLISTEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentNV")) == NULL) || r; r = ((glMakeImageHandleNonResidentNV = (PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentNV")) == NULL) || r; r = ((glMakeImageHandleResidentNV = (PFNGLMAKEIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentNV")) == NULL) || r; r = ((glMakeTextureHandleNonResidentNV = (PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentNV")) == NULL) || r; r = ((glMakeTextureHandleResidentNV = (PFNGLMAKETEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentNV")) == NULL) || r; r = ((glProgramUniformHandleui64NV = (PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64NV")) == NULL) || r; r = ((glProgramUniformHandleui64vNV = (PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vNV")) == NULL) || r; r = ((glUniformHandleui64NV = (PFNGLUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64NV")) == NULL) || r; r = ((glUniformHandleui64vNV = (PFNGLUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vNV")) == NULL) || r; return r; } #endif /* GL_NV_bindless_texture */ #ifdef GL_NV_blend_equation_advanced static GLboolean _glewInit_GL_NV_blend_equation_advanced () { GLboolean r = GL_FALSE; r = ((glBlendBarrierNV = (PFNGLBLENDBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierNV")) == NULL) || r; r = ((glBlendParameteriNV = (PFNGLBLENDPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glBlendParameteriNV")) == NULL) || r; return r; } #endif /* GL_NV_blend_equation_advanced */ #ifdef GL_NV_clip_space_w_scaling static GLboolean _glewInit_GL_NV_clip_space_w_scaling () { GLboolean r = GL_FALSE; r = ((glViewportPositionWScaleNV = (PFNGLVIEWPORTPOSITIONWSCALENVPROC)glewGetProcAddress((const GLubyte*)"glViewportPositionWScaleNV")) == NULL) || r; return r; } #endif /* GL_NV_clip_space_w_scaling */ #ifdef GL_NV_command_list static GLboolean _glewInit_GL_NV_command_list () { GLboolean r = GL_FALSE; r = ((glCallCommandListNV = (PFNGLCALLCOMMANDLISTNVPROC)glewGetProcAddress((const GLubyte*)"glCallCommandListNV")) == NULL) || r; r = ((glCommandListSegmentsNV = (PFNGLCOMMANDLISTSEGMENTSNVPROC)glewGetProcAddress((const GLubyte*)"glCommandListSegmentsNV")) == NULL) || r; r = ((glCompileCommandListNV = (PFNGLCOMPILECOMMANDLISTNVPROC)glewGetProcAddress((const GLubyte*)"glCompileCommandListNV")) == NULL) || r; r = ((glCreateCommandListsNV = (PFNGLCREATECOMMANDLISTSNVPROC)glewGetProcAddress((const GLubyte*)"glCreateCommandListsNV")) == NULL) || r; r = ((glCreateStatesNV = (PFNGLCREATESTATESNVPROC)glewGetProcAddress((const GLubyte*)"glCreateStatesNV")) == NULL) || r; r = ((glDeleteCommandListsNV = (PFNGLDELETECOMMANDLISTSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteCommandListsNV")) == NULL) || r; r = ((glDeleteStatesNV = (PFNGLDELETESTATESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteStatesNV")) == NULL) || r; r = ((glDrawCommandsAddressNV = (PFNGLDRAWCOMMANDSADDRESSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsAddressNV")) == NULL) || r; r = ((glDrawCommandsNV = (PFNGLDRAWCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsNV")) == NULL) || r; r = ((glDrawCommandsStatesAddressNV = (PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsStatesAddressNV")) == NULL) || r; r = ((glDrawCommandsStatesNV = (PFNGLDRAWCOMMANDSSTATESNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsStatesNV")) == NULL) || r; r = ((glGetCommandHeaderNV = (PFNGLGETCOMMANDHEADERNVPROC)glewGetProcAddress((const GLubyte*)"glGetCommandHeaderNV")) == NULL) || r; r = ((glGetStageIndexNV = (PFNGLGETSTAGEINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glGetStageIndexNV")) == NULL) || r; r = ((glIsCommandListNV = (PFNGLISCOMMANDLISTNVPROC)glewGetProcAddress((const GLubyte*)"glIsCommandListNV")) == NULL) || r; r = ((glIsStateNV = (PFNGLISSTATENVPROC)glewGetProcAddress((const GLubyte*)"glIsStateNV")) == NULL) || r; r = ((glListDrawCommandsStatesClientNV = (PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC)glewGetProcAddress((const GLubyte*)"glListDrawCommandsStatesClientNV")) == NULL) || r; r = ((glStateCaptureNV = (PFNGLSTATECAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glStateCaptureNV")) == NULL) || r; return r; } #endif /* GL_NV_command_list */ #ifdef GL_NV_conditional_render static GLboolean _glewInit_GL_NV_conditional_render () { GLboolean r = GL_FALSE; r = ((glBeginConditionalRenderNV = (PFNGLBEGINCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNV")) == NULL) || r; r = ((glEndConditionalRenderNV = (PFNGLENDCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNV")) == NULL) || r; return r; } #endif /* GL_NV_conditional_render */ #ifdef GL_NV_conservative_raster static GLboolean _glewInit_GL_NV_conservative_raster () { GLboolean r = GL_FALSE; r = ((glSubpixelPrecisionBiasNV = (PFNGLSUBPIXELPRECISIONBIASNVPROC)glewGetProcAddress((const GLubyte*)"glSubpixelPrecisionBiasNV")) == NULL) || r; return r; } #endif /* GL_NV_conservative_raster */ #ifdef GL_NV_conservative_raster_dilate static GLboolean _glewInit_GL_NV_conservative_raster_dilate () { GLboolean r = GL_FALSE; r = ((glConservativeRasterParameterfNV = (PFNGLCONSERVATIVERASTERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glConservativeRasterParameterfNV")) == NULL) || r; return r; } #endif /* GL_NV_conservative_raster_dilate */ #ifdef GL_NV_conservative_raster_pre_snap_triangles static GLboolean _glewInit_GL_NV_conservative_raster_pre_snap_triangles () { GLboolean r = GL_FALSE; r = ((glConservativeRasterParameteriNV = (PFNGLCONSERVATIVERASTERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glConservativeRasterParameteriNV")) == NULL) || r; return r; } #endif /* GL_NV_conservative_raster_pre_snap_triangles */ #ifdef GL_NV_copy_buffer static GLboolean _glewInit_GL_NV_copy_buffer () { GLboolean r = GL_FALSE; r = ((glCopyBufferSubDataNV = (PFNGLCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glCopyBufferSubDataNV")) == NULL) || r; return r; } #endif /* GL_NV_copy_buffer */ #ifdef GL_NV_copy_image static GLboolean _glewInit_GL_NV_copy_image () { GLboolean r = GL_FALSE; r = ((glCopyImageSubDataNV = (PFNGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataNV")) == NULL) || r; return r; } #endif /* GL_NV_copy_image */ #ifdef GL_NV_depth_buffer_float static GLboolean _glewInit_GL_NV_depth_buffer_float () { GLboolean r = GL_FALSE; r = ((glClearDepthdNV = (PFNGLCLEARDEPTHDNVPROC)glewGetProcAddress((const GLubyte*)"glClearDepthdNV")) == NULL) || r; r = ((glDepthBoundsdNV = (PFNGLDEPTHBOUNDSDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsdNV")) == NULL) || r; r = ((glDepthRangedNV = (PFNGLDEPTHRANGEDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangedNV")) == NULL) || r; return r; } #endif /* GL_NV_depth_buffer_float */ #ifdef GL_NV_draw_buffers static GLboolean _glewInit_GL_NV_draw_buffers () { GLboolean r = GL_FALSE; r = ((glDrawBuffersNV = (PFNGLDRAWBUFFERSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersNV")) == NULL) || r; return r; } #endif /* GL_NV_draw_buffers */ #ifdef GL_NV_draw_instanced static GLboolean _glewInit_GL_NV_draw_instanced () { GLboolean r = GL_FALSE; r = ((glDrawArraysInstancedNV = (PFNGLDRAWARRAYSINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedNV")) == NULL) || r; r = ((glDrawElementsInstancedNV = (PFNGLDRAWELEMENTSINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedNV")) == NULL) || r; return r; } #endif /* GL_NV_draw_instanced */ #ifdef GL_NV_draw_texture static GLboolean _glewInit_GL_NV_draw_texture () { GLboolean r = GL_FALSE; r = ((glDrawTextureNV = (PFNGLDRAWTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glDrawTextureNV")) == NULL) || r; return r; } #endif /* GL_NV_draw_texture */ #ifdef GL_NV_draw_vulkan_image static GLboolean _glewInit_GL_NV_draw_vulkan_image () { GLboolean r = GL_FALSE; r = ((glDrawVkImageNV = (PFNGLDRAWVKIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glDrawVkImageNV")) == NULL) || r; r = ((glGetVkProcAddrNV = (PFNGLGETVKPROCADDRNVPROC)glewGetProcAddress((const GLubyte*)"glGetVkProcAddrNV")) == NULL) || r; r = ((glSignalVkFenceNV = (PFNGLSIGNALVKFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSignalVkFenceNV")) == NULL) || r; r = ((glSignalVkSemaphoreNV = (PFNGLSIGNALVKSEMAPHORENVPROC)glewGetProcAddress((const GLubyte*)"glSignalVkSemaphoreNV")) == NULL) || r; r = ((glWaitVkSemaphoreNV = (PFNGLWAITVKSEMAPHORENVPROC)glewGetProcAddress((const GLubyte*)"glWaitVkSemaphoreNV")) == NULL) || r; return r; } #endif /* GL_NV_draw_vulkan_image */ #ifdef GL_NV_evaluators static GLboolean _glewInit_GL_NV_evaluators () { GLboolean r = GL_FALSE; r = ((glEvalMapsNV = (PFNGLEVALMAPSNVPROC)glewGetProcAddress((const GLubyte*)"glEvalMapsNV")) == NULL) || r; r = ((glGetMapAttribParameterfvNV = (PFNGLGETMAPATTRIBPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterfvNV")) == NULL) || r; r = ((glGetMapAttribParameterivNV = (PFNGLGETMAPATTRIBPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterivNV")) == NULL) || r; r = ((glGetMapControlPointsNV = (PFNGLGETMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapControlPointsNV")) == NULL) || r; r = ((glGetMapParameterfvNV = (PFNGLGETMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterfvNV")) == NULL) || r; r = ((glGetMapParameterivNV = (PFNGLGETMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterivNV")) == NULL) || r; r = ((glMapControlPointsNV = (PFNGLMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glMapControlPointsNV")) == NULL) || r; r = ((glMapParameterfvNV = (PFNGLMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterfvNV")) == NULL) || r; r = ((glMapParameterivNV = (PFNGLMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterivNV")) == NULL) || r; return r; } #endif /* GL_NV_evaluators */ #ifdef GL_NV_explicit_multisample static GLboolean _glewInit_GL_NV_explicit_multisample () { GLboolean r = GL_FALSE; r = ((glGetMultisamplefvNV = (PFNGLGETMULTISAMPLEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefvNV")) == NULL) || r; r = ((glSampleMaskIndexedNV = (PFNGLSAMPLEMASKINDEXEDNVPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskIndexedNV")) == NULL) || r; r = ((glTexRenderbufferNV = (PFNGLTEXRENDERBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glTexRenderbufferNV")) == NULL) || r; return r; } #endif /* GL_NV_explicit_multisample */ #ifdef GL_NV_fence static GLboolean _glewInit_GL_NV_fence () { GLboolean r = GL_FALSE; r = ((glDeleteFencesNV = (PFNGLDELETEFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesNV")) == NULL) || r; r = ((glFinishFenceNV = (PFNGLFINISHFENCENVPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceNV")) == NULL) || r; r = ((glGenFencesNV = (PFNGLGENFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glGenFencesNV")) == NULL) || r; r = ((glGetFenceivNV = (PFNGLGETFENCEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFenceivNV")) == NULL) || r; r = ((glIsFenceNV = (PFNGLISFENCENVPROC)glewGetProcAddress((const GLubyte*)"glIsFenceNV")) == NULL) || r; r = ((glSetFenceNV = (PFNGLSETFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSetFenceNV")) == NULL) || r; r = ((glTestFenceNV = (PFNGLTESTFENCENVPROC)glewGetProcAddress((const GLubyte*)"glTestFenceNV")) == NULL) || r; return r; } #endif /* GL_NV_fence */ #ifdef GL_NV_fragment_coverage_to_color static GLboolean _glewInit_GL_NV_fragment_coverage_to_color () { GLboolean r = GL_FALSE; r = ((glFragmentCoverageColorNV = (PFNGLFRAGMENTCOVERAGECOLORNVPROC)glewGetProcAddress((const GLubyte*)"glFragmentCoverageColorNV")) == NULL) || r; return r; } #endif /* GL_NV_fragment_coverage_to_color */ #ifdef GL_NV_fragment_program static GLboolean _glewInit_GL_NV_fragment_program () { GLboolean r = GL_FALSE; r = ((glGetProgramNamedParameterdvNV = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterdvNV")) == NULL) || r; r = ((glGetProgramNamedParameterfvNV = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterfvNV")) == NULL) || r; r = ((glProgramNamedParameter4dNV = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dNV")) == NULL) || r; r = ((glProgramNamedParameter4dvNV = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dvNV")) == NULL) || r; r = ((glProgramNamedParameter4fNV = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fNV")) == NULL) || r; r = ((glProgramNamedParameter4fvNV = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fvNV")) == NULL) || r; return r; } #endif /* GL_NV_fragment_program */ #ifdef GL_NV_framebuffer_blit static GLboolean _glewInit_GL_NV_framebuffer_blit () { GLboolean r = GL_FALSE; r = ((glBlitFramebufferNV = (PFNGLBLITFRAMEBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferNV")) == NULL) || r; return r; } #endif /* GL_NV_framebuffer_blit */ #ifdef GL_NV_framebuffer_multisample static GLboolean _glewInit_GL_NV_framebuffer_multisample () { GLboolean r = GL_FALSE; r = ((glRenderbufferStorageMultisampleNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleNV")) == NULL) || r; return r; } #endif /* GL_NV_framebuffer_multisample */ #ifdef GL_NV_framebuffer_multisample_coverage static GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage () { GLboolean r = GL_FALSE; r = ((glRenderbufferStorageMultisampleCoverageNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleCoverageNV")) == NULL) || r; return r; } #endif /* GL_NV_framebuffer_multisample_coverage */ #ifdef GL_NV_geometry_program4 static GLboolean _glewInit_GL_NV_geometry_program4 () { GLboolean r = GL_FALSE; r = ((glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC)glewGetProcAddress((const GLubyte*)"glProgramVertexLimitNV")) == NULL) || r; return r; } #endif /* GL_NV_geometry_program4 */ #ifdef GL_NV_gpu_multicast static GLboolean _glewInit_GL_NV_gpu_multicast () { GLboolean r = GL_FALSE; r = ((glMulticastBarrierNV = (PFNGLMULTICASTBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastBarrierNV")) == NULL) || r; r = ((glMulticastBlitFramebufferNV = (PFNGLMULTICASTBLITFRAMEBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastBlitFramebufferNV")) == NULL) || r; r = ((glMulticastBufferSubDataNV = (PFNGLMULTICASTBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glMulticastBufferSubDataNV")) == NULL) || r; r = ((glMulticastCopyBufferSubDataNV = (PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glMulticastCopyBufferSubDataNV")) == NULL) || r; r = ((glMulticastCopyImageSubDataNV = (PFNGLMULTICASTCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glMulticastCopyImageSubDataNV")) == NULL) || r; r = ((glMulticastFramebufferSampleLocationsfvNV = (PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastFramebufferSampleLocationsfvNV")) == NULL) || r; r = ((glMulticastGetQueryObjecti64vNV = (PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjecti64vNV")) == NULL) || r; r = ((glMulticastGetQueryObjectivNV = (PFNGLMULTICASTGETQUERYOBJECTIVNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjectivNV")) == NULL) || r; r = ((glMulticastGetQueryObjectui64vNV = (PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjectui64vNV")) == NULL) || r; r = ((glMulticastGetQueryObjectuivNV = (PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjectuivNV")) == NULL) || r; r = ((glMulticastWaitSyncNV = (PFNGLMULTICASTWAITSYNCNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastWaitSyncNV")) == NULL) || r; r = ((glRenderGpuMaskNV = (PFNGLRENDERGPUMASKNVPROC)glewGetProcAddress((const GLubyte*)"glRenderGpuMaskNV")) == NULL) || r; return r; } #endif /* GL_NV_gpu_multicast */ #ifdef GL_NV_gpu_program4 static GLboolean _glewInit_GL_NV_gpu_program4 () { GLboolean r = GL_FALSE; r = ((glProgramEnvParameterI4iNV = (PFNGLPROGRAMENVPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4iNV")) == NULL) || r; r = ((glProgramEnvParameterI4ivNV = (PFNGLPROGRAMENVPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4ivNV")) == NULL) || r; r = ((glProgramEnvParameterI4uiNV = (PFNGLPROGRAMENVPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uiNV")) == NULL) || r; r = ((glProgramEnvParameterI4uivNV = (PFNGLPROGRAMENVPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uivNV")) == NULL) || r; r = ((glProgramEnvParametersI4ivNV = (PFNGLPROGRAMENVPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4ivNV")) == NULL) || r; r = ((glProgramEnvParametersI4uivNV = (PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4uivNV")) == NULL) || r; r = ((glProgramLocalParameterI4iNV = (PFNGLPROGRAMLOCALPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4iNV")) == NULL) || r; r = ((glProgramLocalParameterI4ivNV = (PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4ivNV")) == NULL) || r; r = ((glProgramLocalParameterI4uiNV = (PFNGLPROGRAMLOCALPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uiNV")) == NULL) || r; r = ((glProgramLocalParameterI4uivNV = (PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uivNV")) == NULL) || r; r = ((glProgramLocalParametersI4ivNV = (PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4ivNV")) == NULL) || r; r = ((glProgramLocalParametersI4uivNV = (PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4uivNV")) == NULL) || r; return r; } #endif /* GL_NV_gpu_program4 */ #ifdef GL_NV_gpu_shader5 static GLboolean _glewInit_GL_NV_gpu_shader5 () { GLboolean r = GL_FALSE; r = ((glGetUniformi64vNV = (PFNGLGETUNIFORMI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vNV")) == NULL) || r; r = ((glGetUniformui64vNV = (PFNGLGETUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vNV")) == NULL) || r; r = ((glProgramUniform1i64NV = (PFNGLPROGRAMUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64NV")) == NULL) || r; r = ((glProgramUniform1i64vNV = (PFNGLPROGRAMUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vNV")) == NULL) || r; r = ((glProgramUniform1ui64NV = (PFNGLPROGRAMUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64NV")) == NULL) || r; r = ((glProgramUniform1ui64vNV = (PFNGLPROGRAMUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vNV")) == NULL) || r; r = ((glProgramUniform2i64NV = (PFNGLPROGRAMUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64NV")) == NULL) || r; r = ((glProgramUniform2i64vNV = (PFNGLPROGRAMUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vNV")) == NULL) || r; r = ((glProgramUniform2ui64NV = (PFNGLPROGRAMUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64NV")) == NULL) || r; r = ((glProgramUniform2ui64vNV = (PFNGLPROGRAMUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vNV")) == NULL) || r; r = ((glProgramUniform3i64NV = (PFNGLPROGRAMUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64NV")) == NULL) || r; r = ((glProgramUniform3i64vNV = (PFNGLPROGRAMUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vNV")) == NULL) || r; r = ((glProgramUniform3ui64NV = (PFNGLPROGRAMUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64NV")) == NULL) || r; r = ((glProgramUniform3ui64vNV = (PFNGLPROGRAMUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vNV")) == NULL) || r; r = ((glProgramUniform4i64NV = (PFNGLPROGRAMUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64NV")) == NULL) || r; r = ((glProgramUniform4i64vNV = (PFNGLPROGRAMUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vNV")) == NULL) || r; r = ((glProgramUniform4ui64NV = (PFNGLPROGRAMUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64NV")) == NULL) || r; r = ((glProgramUniform4ui64vNV = (PFNGLPROGRAMUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vNV")) == NULL) || r; r = ((glUniform1i64NV = (PFNGLUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64NV")) == NULL) || r; r = ((glUniform1i64vNV = (PFNGLUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vNV")) == NULL) || r; r = ((glUniform1ui64NV = (PFNGLUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64NV")) == NULL) || r; r = ((glUniform1ui64vNV = (PFNGLUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vNV")) == NULL) || r; r = ((glUniform2i64NV = (PFNGLUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64NV")) == NULL) || r; r = ((glUniform2i64vNV = (PFNGLUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vNV")) == NULL) || r; r = ((glUniform2ui64NV = (PFNGLUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64NV")) == NULL) || r; r = ((glUniform2ui64vNV = (PFNGLUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vNV")) == NULL) || r; r = ((glUniform3i64NV = (PFNGLUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64NV")) == NULL) || r; r = ((glUniform3i64vNV = (PFNGLUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vNV")) == NULL) || r; r = ((glUniform3ui64NV = (PFNGLUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64NV")) == NULL) || r; r = ((glUniform3ui64vNV = (PFNGLUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vNV")) == NULL) || r; r = ((glUniform4i64NV = (PFNGLUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64NV")) == NULL) || r; r = ((glUniform4i64vNV = (PFNGLUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vNV")) == NULL) || r; r = ((glUniform4ui64NV = (PFNGLUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64NV")) == NULL) || r; r = ((glUniform4ui64vNV = (PFNGLUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vNV")) == NULL) || r; return r; } #endif /* GL_NV_gpu_shader5 */ #ifdef GL_NV_half_float static GLboolean _glewInit_GL_NV_half_float () { GLboolean r = GL_FALSE; r = ((glColor3hNV = (PFNGLCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hNV")) == NULL) || r; r = ((glColor3hvNV = (PFNGLCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hvNV")) == NULL) || r; r = ((glColor4hNV = (PFNGLCOLOR4HNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hNV")) == NULL) || r; r = ((glColor4hvNV = (PFNGLCOLOR4HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hvNV")) == NULL) || r; r = ((glFogCoordhNV = (PFNGLFOGCOORDHNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhNV")) == NULL) || r; r = ((glFogCoordhvNV = (PFNGLFOGCOORDHVNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhvNV")) == NULL) || r; r = ((glMultiTexCoord1hNV = (PFNGLMULTITEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hNV")) == NULL) || r; r = ((glMultiTexCoord1hvNV = (PFNGLMULTITEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hvNV")) == NULL) || r; r = ((glMultiTexCoord2hNV = (PFNGLMULTITEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hNV")) == NULL) || r; r = ((glMultiTexCoord2hvNV = (PFNGLMULTITEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hvNV")) == NULL) || r; r = ((glMultiTexCoord3hNV = (PFNGLMULTITEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hNV")) == NULL) || r; r = ((glMultiTexCoord3hvNV = (PFNGLMULTITEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hvNV")) == NULL) || r; r = ((glMultiTexCoord4hNV = (PFNGLMULTITEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hNV")) == NULL) || r; r = ((glMultiTexCoord4hvNV = (PFNGLMULTITEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hvNV")) == NULL) || r; r = ((glNormal3hNV = (PFNGLNORMAL3HNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hNV")) == NULL) || r; r = ((glNormal3hvNV = (PFNGLNORMAL3HVNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hvNV")) == NULL) || r; r = ((glSecondaryColor3hNV = (PFNGLSECONDARYCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hNV")) == NULL) || r; r = ((glSecondaryColor3hvNV = (PFNGLSECONDARYCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hvNV")) == NULL) || r; r = ((glTexCoord1hNV = (PFNGLTEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hNV")) == NULL) || r; r = ((glTexCoord1hvNV = (PFNGLTEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hvNV")) == NULL) || r; r = ((glTexCoord2hNV = (PFNGLTEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hNV")) == NULL) || r; r = ((glTexCoord2hvNV = (PFNGLTEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hvNV")) == NULL) || r; r = ((glTexCoord3hNV = (PFNGLTEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hNV")) == NULL) || r; r = ((glTexCoord3hvNV = (PFNGLTEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hvNV")) == NULL) || r; r = ((glTexCoord4hNV = (PFNGLTEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hNV")) == NULL) || r; r = ((glTexCoord4hvNV = (PFNGLTEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hvNV")) == NULL) || r; r = ((glVertex2hNV = (PFNGLVERTEX2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hNV")) == NULL) || r; r = ((glVertex2hvNV = (PFNGLVERTEX2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hvNV")) == NULL) || r; r = ((glVertex3hNV = (PFNGLVERTEX3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hNV")) == NULL) || r; r = ((glVertex3hvNV = (PFNGLVERTEX3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hvNV")) == NULL) || r; r = ((glVertex4hNV = (PFNGLVERTEX4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hNV")) == NULL) || r; r = ((glVertex4hvNV = (PFNGLVERTEX4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hvNV")) == NULL) || r; r = ((glVertexAttrib1hNV = (PFNGLVERTEXATTRIB1HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hNV")) == NULL) || r; r = ((glVertexAttrib1hvNV = (PFNGLVERTEXATTRIB1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hvNV")) == NULL) || r; r = ((glVertexAttrib2hNV = (PFNGLVERTEXATTRIB2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hNV")) == NULL) || r; r = ((glVertexAttrib2hvNV = (PFNGLVERTEXATTRIB2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hvNV")) == NULL) || r; r = ((glVertexAttrib3hNV = (PFNGLVERTEXATTRIB3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hNV")) == NULL) || r; r = ((glVertexAttrib3hvNV = (PFNGLVERTEXATTRIB3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hvNV")) == NULL) || r; r = ((glVertexAttrib4hNV = (PFNGLVERTEXATTRIB4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hNV")) == NULL) || r; r = ((glVertexAttrib4hvNV = (PFNGLVERTEXATTRIB4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hvNV")) == NULL) || r; r = ((glVertexAttribs1hvNV = (PFNGLVERTEXATTRIBS1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1hvNV")) == NULL) || r; r = ((glVertexAttribs2hvNV = (PFNGLVERTEXATTRIBS2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2hvNV")) == NULL) || r; r = ((glVertexAttribs3hvNV = (PFNGLVERTEXATTRIBS3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3hvNV")) == NULL) || r; r = ((glVertexAttribs4hvNV = (PFNGLVERTEXATTRIBS4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4hvNV")) == NULL) || r; r = ((glVertexWeighthNV = (PFNGLVERTEXWEIGHTHNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthNV")) == NULL) || r; r = ((glVertexWeighthvNV = (PFNGLVERTEXWEIGHTHVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthvNV")) == NULL) || r; return r; } #endif /* GL_NV_half_float */ #ifdef GL_NV_instanced_arrays static GLboolean _glewInit_GL_NV_instanced_arrays () { GLboolean r = GL_FALSE; r = ((glVertexAttribDivisorNV = (PFNGLVERTEXATTRIBDIVISORNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorNV")) == NULL) || r; return r; } #endif /* GL_NV_instanced_arrays */ #ifdef GL_NV_internalformat_sample_query static GLboolean _glewInit_GL_NV_internalformat_sample_query () { GLboolean r = GL_FALSE; r = ((glGetInternalformatSampleivNV = (PFNGLGETINTERNALFORMATSAMPLEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformatSampleivNV")) == NULL) || r; return r; } #endif /* GL_NV_internalformat_sample_query */ #ifdef GL_NV_non_square_matrices static GLboolean _glewInit_GL_NV_non_square_matrices () { GLboolean r = GL_FALSE; r = ((glUniformMatrix2x3fvNV = (PFNGLUNIFORMMATRIX2X3FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3fvNV")) == NULL) || r; r = ((glUniformMatrix2x4fvNV = (PFNGLUNIFORMMATRIX2X4FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4fvNV")) == NULL) || r; r = ((glUniformMatrix3x2fvNV = (PFNGLUNIFORMMATRIX3X2FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2fvNV")) == NULL) || r; r = ((glUniformMatrix3x4fvNV = (PFNGLUNIFORMMATRIX3X4FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4fvNV")) == NULL) || r; r = ((glUniformMatrix4x2fvNV = (PFNGLUNIFORMMATRIX4X2FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2fvNV")) == NULL) || r; r = ((glUniformMatrix4x3fvNV = (PFNGLUNIFORMMATRIX4X3FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3fvNV")) == NULL) || r; return r; } #endif /* GL_NV_non_square_matrices */ #ifdef GL_NV_occlusion_query static GLboolean _glewInit_GL_NV_occlusion_query () { GLboolean r = GL_FALSE; r = ((glBeginOcclusionQueryNV = (PFNGLBEGINOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glBeginOcclusionQueryNV")) == NULL) || r; r = ((glDeleteOcclusionQueriesNV = (PFNGLDELETEOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteOcclusionQueriesNV")) == NULL) || r; r = ((glEndOcclusionQueryNV = (PFNGLENDOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glEndOcclusionQueryNV")) == NULL) || r; r = ((glGenOcclusionQueriesNV = (PFNGLGENOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glGenOcclusionQueriesNV")) == NULL) || r; r = ((glGetOcclusionQueryivNV = (PFNGLGETOCCLUSIONQUERYIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryivNV")) == NULL) || r; r = ((glGetOcclusionQueryuivNV = (PFNGLGETOCCLUSIONQUERYUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryuivNV")) == NULL) || r; r = ((glIsOcclusionQueryNV = (PFNGLISOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glIsOcclusionQueryNV")) == NULL) || r; return r; } #endif /* GL_NV_occlusion_query */ #ifdef GL_NV_parameter_buffer_object static GLboolean _glewInit_GL_NV_parameter_buffer_object () { GLboolean r = GL_FALSE; r = ((glProgramBufferParametersIivNV = (PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIivNV")) == NULL) || r; r = ((glProgramBufferParametersIuivNV = (PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIuivNV")) == NULL) || r; r = ((glProgramBufferParametersfvNV = (PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersfvNV")) == NULL) || r; return r; } #endif /* GL_NV_parameter_buffer_object */ #ifdef GL_NV_path_rendering static GLboolean _glewInit_GL_NV_path_rendering () { GLboolean r = GL_FALSE; r = ((glCopyPathNV = (PFNGLCOPYPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCopyPathNV")) == NULL) || r; r = ((glCoverFillPathInstancedNV = (PFNGLCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathInstancedNV")) == NULL) || r; r = ((glCoverFillPathNV = (PFNGLCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathNV")) == NULL) || r; r = ((glCoverStrokePathInstancedNV = (PFNGLCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathInstancedNV")) == NULL) || r; r = ((glCoverStrokePathNV = (PFNGLCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathNV")) == NULL) || r; r = ((glDeletePathsNV = (PFNGLDELETEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glDeletePathsNV")) == NULL) || r; r = ((glGenPathsNV = (PFNGLGENPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glGenPathsNV")) == NULL) || r; r = ((glGetPathColorGenfvNV = (PFNGLGETPATHCOLORGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenfvNV")) == NULL) || r; r = ((glGetPathColorGenivNV = (PFNGLGETPATHCOLORGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenivNV")) == NULL) || r; r = ((glGetPathCommandsNV = (PFNGLGETPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCommandsNV")) == NULL) || r; r = ((glGetPathCoordsNV = (PFNGLGETPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCoordsNV")) == NULL) || r; r = ((glGetPathDashArrayNV = (PFNGLGETPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathDashArrayNV")) == NULL) || r; r = ((glGetPathLengthNV = (PFNGLGETPATHLENGTHNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathLengthNV")) == NULL) || r; r = ((glGetPathMetricRangeNV = (PFNGLGETPATHMETRICRANGENVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricRangeNV")) == NULL) || r; r = ((glGetPathMetricsNV = (PFNGLGETPATHMETRICSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricsNV")) == NULL) || r; r = ((glGetPathParameterfvNV = (PFNGLGETPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterfvNV")) == NULL) || r; r = ((glGetPathParameterivNV = (PFNGLGETPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterivNV")) == NULL) || r; r = ((glGetPathSpacingNV = (PFNGLGETPATHSPACINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathSpacingNV")) == NULL) || r; r = ((glGetPathTexGenfvNV = (PFNGLGETPATHTEXGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenfvNV")) == NULL) || r; r = ((glGetPathTexGenivNV = (PFNGLGETPATHTEXGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenivNV")) == NULL) || r; r = ((glGetProgramResourcefvNV = (PFNGLGETPROGRAMRESOURCEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourcefvNV")) == NULL) || r; r = ((glInterpolatePathsNV = (PFNGLINTERPOLATEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glInterpolatePathsNV")) == NULL) || r; r = ((glIsPathNV = (PFNGLISPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPathNV")) == NULL) || r; r = ((glIsPointInFillPathNV = (PFNGLISPOINTINFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInFillPathNV")) == NULL) || r; r = ((glIsPointInStrokePathNV = (PFNGLISPOINTINSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInStrokePathNV")) == NULL) || r; r = ((glMatrixLoad3x2fNV = (PFNGLMATRIXLOAD3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x2fNV")) == NULL) || r; r = ((glMatrixLoad3x3fNV = (PFNGLMATRIXLOAD3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x3fNV")) == NULL) || r; r = ((glMatrixLoadTranspose3x3fNV = (PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTranspose3x3fNV")) == NULL) || r; r = ((glMatrixMult3x2fNV = (PFNGLMATRIXMULT3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x2fNV")) == NULL) || r; r = ((glMatrixMult3x3fNV = (PFNGLMATRIXMULT3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x3fNV")) == NULL) || r; r = ((glMatrixMultTranspose3x3fNV = (PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTranspose3x3fNV")) == NULL) || r; r = ((glPathColorGenNV = (PFNGLPATHCOLORGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathColorGenNV")) == NULL) || r; r = ((glPathCommandsNV = (PFNGLPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCommandsNV")) == NULL) || r; r = ((glPathCoordsNV = (PFNGLPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoordsNV")) == NULL) || r; r = ((glPathCoverDepthFuncNV = (PFNGLPATHCOVERDEPTHFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoverDepthFuncNV")) == NULL) || r; r = ((glPathDashArrayNV = (PFNGLPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathDashArrayNV")) == NULL) || r; r = ((glPathFogGenNV = (PFNGLPATHFOGGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathFogGenNV")) == NULL) || r; r = ((glPathGlyphIndexArrayNV = (PFNGLPATHGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexArrayNV")) == NULL) || r; r = ((glPathGlyphIndexRangeNV = (PFNGLPATHGLYPHINDEXRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexRangeNV")) == NULL) || r; r = ((glPathGlyphRangeNV = (PFNGLPATHGLYPHRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphRangeNV")) == NULL) || r; r = ((glPathGlyphsNV = (PFNGLPATHGLYPHSNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphsNV")) == NULL) || r; r = ((glPathMemoryGlyphIndexArrayNV = (PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathMemoryGlyphIndexArrayNV")) == NULL) || r; r = ((glPathParameterfNV = (PFNGLPATHPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfNV")) == NULL) || r; r = ((glPathParameterfvNV = (PFNGLPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfvNV")) == NULL) || r; r = ((glPathParameteriNV = (PFNGLPATHPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPathParameteriNV")) == NULL) || r; r = ((glPathParameterivNV = (PFNGLPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterivNV")) == NULL) || r; r = ((glPathStencilDepthOffsetNV = (PFNGLPATHSTENCILDEPTHOFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilDepthOffsetNV")) == NULL) || r; r = ((glPathStencilFuncNV = (PFNGLPATHSTENCILFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilFuncNV")) == NULL) || r; r = ((glPathStringNV = (PFNGLPATHSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glPathStringNV")) == NULL) || r; r = ((glPathSubCommandsNV = (PFNGLPATHSUBCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCommandsNV")) == NULL) || r; r = ((glPathSubCoordsNV = (PFNGLPATHSUBCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCoordsNV")) == NULL) || r; r = ((glPathTexGenNV = (PFNGLPATHTEXGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathTexGenNV")) == NULL) || r; r = ((glPointAlongPathNV = (PFNGLPOINTALONGPATHNVPROC)glewGetProcAddress((const GLubyte*)"glPointAlongPathNV")) == NULL) || r; r = ((glProgramPathFragmentInputGenNV = (PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC)glewGetProcAddress((const GLubyte*)"glProgramPathFragmentInputGenNV")) == NULL) || r; r = ((glStencilFillPathInstancedNV = (PFNGLSTENCILFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathInstancedNV")) == NULL) || r; r = ((glStencilFillPathNV = (PFNGLSTENCILFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathNV")) == NULL) || r; r = ((glStencilStrokePathInstancedNV = (PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathInstancedNV")) == NULL) || r; r = ((glStencilStrokePathNV = (PFNGLSTENCILSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathNV")) == NULL) || r; r = ((glStencilThenCoverFillPathInstancedNV = (PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathInstancedNV")) == NULL) || r; r = ((glStencilThenCoverFillPathNV = (PFNGLSTENCILTHENCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathNV")) == NULL) || r; r = ((glStencilThenCoverStrokePathInstancedNV = (PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathInstancedNV")) == NULL) || r; r = ((glStencilThenCoverStrokePathNV = (PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathNV")) == NULL) || r; r = ((glTransformPathNV = (PFNGLTRANSFORMPATHNVPROC)glewGetProcAddress((const GLubyte*)"glTransformPathNV")) == NULL) || r; r = ((glWeightPathsNV = (PFNGLWEIGHTPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glWeightPathsNV")) == NULL) || r; return r; } #endif /* GL_NV_path_rendering */ #ifdef GL_NV_pixel_data_range static GLboolean _glewInit_GL_NV_pixel_data_range () { GLboolean r = GL_FALSE; r = ((glFlushPixelDataRangeNV = (PFNGLFLUSHPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushPixelDataRangeNV")) == NULL) || r; r = ((glPixelDataRangeNV = (PFNGLPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glPixelDataRangeNV")) == NULL) || r; return r; } #endif /* GL_NV_pixel_data_range */ #ifdef GL_NV_point_sprite static GLboolean _glewInit_GL_NV_point_sprite () { GLboolean r = GL_FALSE; r = ((glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriNV")) == NULL) || r; r = ((glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterivNV")) == NULL) || r; return r; } #endif /* GL_NV_point_sprite */ #ifdef GL_NV_polygon_mode static GLboolean _glewInit_GL_NV_polygon_mode () { GLboolean r = GL_FALSE; r = ((glPolygonModeNV = (PFNGLPOLYGONMODENVPROC)glewGetProcAddress((const GLubyte*)"glPolygonModeNV")) == NULL) || r; return r; } #endif /* GL_NV_polygon_mode */ #ifdef GL_NV_present_video static GLboolean _glewInit_GL_NV_present_video () { GLboolean r = GL_FALSE; r = ((glGetVideoi64vNV = (PFNGLGETVIDEOI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoi64vNV")) == NULL) || r; r = ((glGetVideoivNV = (PFNGLGETVIDEOIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoivNV")) == NULL) || r; r = ((glGetVideoui64vNV = (PFNGLGETVIDEOUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoui64vNV")) == NULL) || r; r = ((glGetVideouivNV = (PFNGLGETVIDEOUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideouivNV")) == NULL) || r; r = ((glPresentFrameDualFillNV = (PFNGLPRESENTFRAMEDUALFILLNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameDualFillNV")) == NULL) || r; r = ((glPresentFrameKeyedNV = (PFNGLPRESENTFRAMEKEYEDNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameKeyedNV")) == NULL) || r; return r; } #endif /* GL_NV_present_video */ #ifdef GL_NV_primitive_restart static GLboolean _glewInit_GL_NV_primitive_restart () { GLboolean r = GL_FALSE; r = ((glPrimitiveRestartIndexNV = (PFNGLPRIMITIVERESTARTINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndexNV")) == NULL) || r; r = ((glPrimitiveRestartNV = (PFNGLPRIMITIVERESTARTNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartNV")) == NULL) || r; return r; } #endif /* GL_NV_primitive_restart */ #ifdef GL_NV_register_combiners static GLboolean _glewInit_GL_NV_register_combiners () { GLboolean r = GL_FALSE; r = ((glCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerInputNV")) == NULL) || r; r = ((glCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerOutputNV")) == NULL) || r; r = ((glCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfNV")) == NULL) || r; r = ((glCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfvNV")) == NULL) || r; r = ((glCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameteriNV")) == NULL) || r; r = ((glCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterivNV")) == NULL) || r; r = ((glFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glFinalCombinerInputNV")) == NULL) || r; r = ((glGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterfvNV")) == NULL) || r; r = ((glGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterivNV")) == NULL) || r; r = ((glGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterfvNV")) == NULL) || r; r = ((glGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterivNV")) == NULL) || r; r = ((glGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterfvNV")) == NULL) || r; r = ((glGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterivNV")) == NULL) || r; return r; } #endif /* GL_NV_register_combiners */ #ifdef GL_NV_register_combiners2 static GLboolean _glewInit_GL_NV_register_combiners2 () { GLboolean r = GL_FALSE; r = ((glCombinerStageParameterfvNV = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerStageParameterfvNV")) == NULL) || r; r = ((glGetCombinerStageParameterfvNV = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerStageParameterfvNV")) == NULL) || r; return r; } #endif /* GL_NV_register_combiners2 */ #ifdef GL_NV_sample_locations static GLboolean _glewInit_GL_NV_sample_locations () { GLboolean r = GL_FALSE; r = ((glFramebufferSampleLocationsfvNV = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvNV")) == NULL) || r; r = ((glNamedFramebufferSampleLocationsfvNV = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvNV")) == NULL) || r; return r; } #endif /* GL_NV_sample_locations */ #ifdef GL_NV_shader_buffer_load static GLboolean _glewInit_GL_NV_shader_buffer_load () { GLboolean r = GL_FALSE; r = ((glGetBufferParameterui64vNV = (PFNGLGETBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterui64vNV")) == NULL) || r; r = ((glGetIntegerui64vNV = (PFNGLGETINTEGERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64vNV")) == NULL) || r; r = ((glGetNamedBufferParameterui64vNV = (PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterui64vNV")) == NULL) || r; r = ((glIsBufferResidentNV = (PFNGLISBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsBufferResidentNV")) == NULL) || r; r = ((glIsNamedBufferResidentNV = (PFNGLISNAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsNamedBufferResidentNV")) == NULL) || r; r = ((glMakeBufferNonResidentNV = (PFNGLMAKEBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferNonResidentNV")) == NULL) || r; r = ((glMakeBufferResidentNV = (PFNGLMAKEBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferResidentNV")) == NULL) || r; r = ((glMakeNamedBufferNonResidentNV = (PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferNonResidentNV")) == NULL) || r; r = ((glMakeNamedBufferResidentNV = (PFNGLMAKENAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferResidentNV")) == NULL) || r; r = ((glProgramUniformui64NV = (PFNGLPROGRAMUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64NV")) == NULL) || r; r = ((glProgramUniformui64vNV = (PFNGLPROGRAMUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64vNV")) == NULL) || r; r = ((glUniformui64NV = (PFNGLUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64NV")) == NULL) || r; r = ((glUniformui64vNV = (PFNGLUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64vNV")) == NULL) || r; return r; } #endif /* GL_NV_shader_buffer_load */ #ifdef GL_NV_texture_array static GLboolean _glewInit_GL_NV_texture_array () { GLboolean r = GL_FALSE; r = ((glCompressedTexImage3DNV = (PFNGLCOMPRESSEDTEXIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DNV")) == NULL) || r; r = ((glCompressedTexSubImage3DNV = (PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DNV")) == NULL) || r; r = ((glCopyTexSubImage3DNV = (PFNGLCOPYTEXSUBIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DNV")) == NULL) || r; r = ((glFramebufferTextureLayerNV = (PFNGLFRAMEBUFFERTEXTURELAYERNVPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerNV")) == NULL) || r; r = ((glTexImage3DNV = (PFNGLTEXIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DNV")) == NULL) || r; r = ((glTexSubImage3DNV = (PFNGLTEXSUBIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DNV")) == NULL) || r; return r; } #endif /* GL_NV_texture_array */ #ifdef GL_NV_texture_barrier static GLboolean _glewInit_GL_NV_texture_barrier () { GLboolean r = GL_FALSE; r = ((glTextureBarrierNV = (PFNGLTEXTUREBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrierNV")) == NULL) || r; return r; } #endif /* GL_NV_texture_barrier */ #ifdef GL_NV_texture_multisample static GLboolean _glewInit_GL_NV_texture_multisample () { GLboolean r = GL_FALSE; r = ((glTexImage2DMultisampleCoverageNV = (PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisampleCoverageNV")) == NULL) || r; r = ((glTexImage3DMultisampleCoverageNV = (PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisampleCoverageNV")) == NULL) || r; r = ((glTextureImage2DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleCoverageNV")) == NULL) || r; r = ((glTextureImage2DMultisampleNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleNV")) == NULL) || r; r = ((glTextureImage3DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleCoverageNV")) == NULL) || r; r = ((glTextureImage3DMultisampleNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleNV")) == NULL) || r; return r; } #endif /* GL_NV_texture_multisample */ #ifdef GL_NV_transform_feedback static GLboolean _glewInit_GL_NV_transform_feedback () { GLboolean r = GL_FALSE; r = ((glActiveVaryingNV = (PFNGLACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glActiveVaryingNV")) == NULL) || r; r = ((glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackNV")) == NULL) || r; r = ((glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseNV")) == NULL) || r; r = ((glBindBufferOffsetNV = (PFNGLBINDBUFFEROFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetNV")) == NULL) || r; r = ((glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeNV")) == NULL) || r; r = ((glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackNV")) == NULL) || r; r = ((glGetActiveVaryingNV = (PFNGLGETACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveVaryingNV")) == NULL) || r; r = ((glGetTransformFeedbackVaryingNV = (PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingNV")) == NULL) || r; r = ((glGetVaryingLocationNV = (PFNGLGETVARYINGLOCATIONNVPROC)glewGetProcAddress((const GLubyte*)"glGetVaryingLocationNV")) == NULL) || r; r = ((glTransformFeedbackAttribsNV = (PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackAttribsNV")) == NULL) || r; r = ((glTransformFeedbackVaryingsNV = (PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsNV")) == NULL) || r; return r; } #endif /* GL_NV_transform_feedback */ #ifdef GL_NV_transform_feedback2 static GLboolean _glewInit_GL_NV_transform_feedback2 () { GLboolean r = GL_FALSE; r = ((glBindTransformFeedbackNV = (PFNGLBINDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedbackNV")) == NULL) || r; r = ((glDeleteTransformFeedbacksNV = (PFNGLDELETETRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacksNV")) == NULL) || r; r = ((glDrawTransformFeedbackNV = (PFNGLDRAWTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackNV")) == NULL) || r; r = ((glGenTransformFeedbacksNV = (PFNGLGENTRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacksNV")) == NULL) || r; r = ((glIsTransformFeedbackNV = (PFNGLISTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedbackNV")) == NULL) || r; r = ((glPauseTransformFeedbackNV = (PFNGLPAUSETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedbackNV")) == NULL) || r; r = ((glResumeTransformFeedbackNV = (PFNGLRESUMETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedbackNV")) == NULL) || r; return r; } #endif /* GL_NV_transform_feedback2 */ #ifdef GL_NV_vdpau_interop static GLboolean _glewInit_GL_NV_vdpau_interop () { GLboolean r = GL_FALSE; r = ((glVDPAUFiniNV = (PFNGLVDPAUFININVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUFiniNV")) == NULL) || r; r = ((glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUGetSurfaceivNV")) == NULL) || r; r = ((glVDPAUInitNV = (PFNGLVDPAUINITNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUInitNV")) == NULL) || r; r = ((glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUIsSurfaceNV")) == NULL) || r; r = ((glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUMapSurfacesNV")) == NULL) || r; r = ((glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterOutputSurfaceNV")) == NULL) || r; r = ((glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterVideoSurfaceNV")) == NULL) || r; r = ((glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUSurfaceAccessNV")) == NULL) || r; r = ((glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnmapSurfacesNV")) == NULL) || r; r = ((glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnregisterSurfaceNV")) == NULL) || r; return r; } #endif /* GL_NV_vdpau_interop */ #ifdef GL_NV_vertex_array_range static GLboolean _glewInit_GL_NV_vertex_array_range () { GLboolean r = GL_FALSE; r = ((glFlushVertexArrayRangeNV = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeNV")) == NULL) || r; r = ((glVertexArrayRangeNV = (PFNGLVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeNV")) == NULL) || r; return r; } #endif /* GL_NV_vertex_array_range */ #ifdef GL_NV_vertex_attrib_integer_64bit static GLboolean _glewInit_GL_NV_vertex_attrib_integer_64bit () { GLboolean r = GL_FALSE; r = ((glGetVertexAttribLi64vNV = (PFNGLGETVERTEXATTRIBLI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLi64vNV")) == NULL) || r; r = ((glGetVertexAttribLui64vNV = (PFNGLGETVERTEXATTRIBLUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vNV")) == NULL) || r; r = ((glVertexAttribL1i64NV = (PFNGLVERTEXATTRIBL1I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64NV")) == NULL) || r; r = ((glVertexAttribL1i64vNV = (PFNGLVERTEXATTRIBL1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64vNV")) == NULL) || r; r = ((glVertexAttribL1ui64NV = (PFNGLVERTEXATTRIBL1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64NV")) == NULL) || r; r = ((glVertexAttribL1ui64vNV = (PFNGLVERTEXATTRIBL1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vNV")) == NULL) || r; r = ((glVertexAttribL2i64NV = (PFNGLVERTEXATTRIBL2I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64NV")) == NULL) || r; r = ((glVertexAttribL2i64vNV = (PFNGLVERTEXATTRIBL2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64vNV")) == NULL) || r; r = ((glVertexAttribL2ui64NV = (PFNGLVERTEXATTRIBL2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64NV")) == NULL) || r; r = ((glVertexAttribL2ui64vNV = (PFNGLVERTEXATTRIBL2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64vNV")) == NULL) || r; r = ((glVertexAttribL3i64NV = (PFNGLVERTEXATTRIBL3I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64NV")) == NULL) || r; r = ((glVertexAttribL3i64vNV = (PFNGLVERTEXATTRIBL3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64vNV")) == NULL) || r; r = ((glVertexAttribL3ui64NV = (PFNGLVERTEXATTRIBL3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64NV")) == NULL) || r; r = ((glVertexAttribL3ui64vNV = (PFNGLVERTEXATTRIBL3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64vNV")) == NULL) || r; r = ((glVertexAttribL4i64NV = (PFNGLVERTEXATTRIBL4I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64NV")) == NULL) || r; r = ((glVertexAttribL4i64vNV = (PFNGLVERTEXATTRIBL4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64vNV")) == NULL) || r; r = ((glVertexAttribL4ui64NV = (PFNGLVERTEXATTRIBL4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64NV")) == NULL) || r; r = ((glVertexAttribL4ui64vNV = (PFNGLVERTEXATTRIBL4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64vNV")) == NULL) || r; r = ((glVertexAttribLFormatNV = (PFNGLVERTEXATTRIBLFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormatNV")) == NULL) || r; return r; } #endif /* GL_NV_vertex_attrib_integer_64bit */ #ifdef GL_NV_vertex_buffer_unified_memory static GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory () { GLboolean r = GL_FALSE; r = ((glBufferAddressRangeNV = (PFNGLBUFFERADDRESSRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBufferAddressRangeNV")) == NULL) || r; r = ((glColorFormatNV = (PFNGLCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glColorFormatNV")) == NULL) || r; r = ((glEdgeFlagFormatNV = (PFNGLEDGEFLAGFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagFormatNV")) == NULL) || r; r = ((glFogCoordFormatNV = (PFNGLFOGCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordFormatNV")) == NULL) || r; r = ((glGetIntegerui64i_vNV = (PFNGLGETINTEGERUI64I_VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64i_vNV")) == NULL) || r; r = ((glIndexFormatNV = (PFNGLINDEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glIndexFormatNV")) == NULL) || r; r = ((glNormalFormatNV = (PFNGLNORMALFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glNormalFormatNV")) == NULL) || r; r = ((glSecondaryColorFormatNV = (PFNGLSECONDARYCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorFormatNV")) == NULL) || r; r = ((glTexCoordFormatNV = (PFNGLTEXCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordFormatNV")) == NULL) || r; r = ((glVertexAttribFormatNV = (PFNGLVERTEXATTRIBFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormatNV")) == NULL) || r; r = ((glVertexAttribIFormatNV = (PFNGLVERTEXATTRIBIFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormatNV")) == NULL) || r; r = ((glVertexFormatNV = (PFNGLVERTEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexFormatNV")) == NULL) || r; return r; } #endif /* GL_NV_vertex_buffer_unified_memory */ #ifdef GL_NV_vertex_program static GLboolean _glewInit_GL_NV_vertex_program () { GLboolean r = GL_FALSE; r = ((glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glAreProgramsResidentNV")) == NULL) || r; r = ((glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glBindProgramNV")) == NULL) || r; r = ((glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsNV")) == NULL) || r; r = ((glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glExecuteProgramNV")) == NULL) || r; r = ((glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsNV")) == NULL) || r; r = ((glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterdvNV")) == NULL) || r; r = ((glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterfvNV")) == NULL) || r; r = ((glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringNV")) == NULL) || r; r = ((glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivNV")) == NULL) || r; r = ((glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetTrackMatrixivNV")) == NULL) || r; r = ((glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervNV")) == NULL) || r; r = ((glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvNV")) == NULL) || r; r = ((glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvNV")) == NULL) || r; r = ((glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivNV")) == NULL) || r; r = ((glIsProgramNV = (PFNGLISPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glIsProgramNV")) == NULL) || r; r = ((glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glLoadProgramNV")) == NULL) || r; r = ((glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dNV")) == NULL) || r; r = ((glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dvNV")) == NULL) || r; r = ((glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fNV")) == NULL) || r; r = ((glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fvNV")) == NULL) || r; r = ((glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4dvNV")) == NULL) || r; r = ((glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4fvNV")) == NULL) || r; r = ((glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glRequestResidentProgramsNV")) == NULL) || r; r = ((glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC)glewGetProcAddress((const GLubyte*)"glTrackMatrixNV")) == NULL) || r; r = ((glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dNV")) == NULL) || r; r = ((glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvNV")) == NULL) || r; r = ((glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fNV")) == NULL) || r; r = ((glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvNV")) == NULL) || r; r = ((glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sNV")) == NULL) || r; r = ((glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svNV")) == NULL) || r; r = ((glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dNV")) == NULL) || r; r = ((glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvNV")) == NULL) || r; r = ((glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fNV")) == NULL) || r; r = ((glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvNV")) == NULL) || r; r = ((glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sNV")) == NULL) || r; r = ((glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svNV")) == NULL) || r; r = ((glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dNV")) == NULL) || r; r = ((glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvNV")) == NULL) || r; r = ((glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fNV")) == NULL) || r; r = ((glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvNV")) == NULL) || r; r = ((glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sNV")) == NULL) || r; r = ((glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svNV")) == NULL) || r; r = ((glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dNV")) == NULL) || r; r = ((glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvNV")) == NULL) || r; r = ((glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fNV")) == NULL) || r; r = ((glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvNV")) == NULL) || r; r = ((glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sNV")) == NULL) || r; r = ((glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svNV")) == NULL) || r; r = ((glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubNV")) == NULL) || r; r = ((glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvNV")) == NULL) || r; r = ((glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerNV")) == NULL) || r; r = ((glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1dvNV")) == NULL) || r; r = ((glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1fvNV")) == NULL) || r; r = ((glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1svNV")) == NULL) || r; r = ((glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2dvNV")) == NULL) || r; r = ((glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2fvNV")) == NULL) || r; r = ((glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2svNV")) == NULL) || r; r = ((glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3dvNV")) == NULL) || r; r = ((glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3fvNV")) == NULL) || r; r = ((glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3svNV")) == NULL) || r; r = ((glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4dvNV")) == NULL) || r; r = ((glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4fvNV")) == NULL) || r; r = ((glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4svNV")) == NULL) || r; r = ((glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4ubvNV")) == NULL) || r; return r; } #endif /* GL_NV_vertex_program */ #ifdef GL_NV_video_capture static GLboolean _glewInit_GL_NV_video_capture () { GLboolean r = GL_FALSE; r = ((glBeginVideoCaptureNV = (PFNGLBEGINVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glBeginVideoCaptureNV")) == NULL) || r; r = ((glBindVideoCaptureStreamBufferNV = (PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamBufferNV")) == NULL) || r; r = ((glBindVideoCaptureStreamTextureNV = (PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamTextureNV")) == NULL) || r; r = ((glEndVideoCaptureNV = (PFNGLENDVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glEndVideoCaptureNV")) == NULL) || r; r = ((glGetVideoCaptureStreamdvNV = (PFNGLGETVIDEOCAPTURESTREAMDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamdvNV")) == NULL) || r; r = ((glGetVideoCaptureStreamfvNV = (PFNGLGETVIDEOCAPTURESTREAMFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamfvNV")) == NULL) || r; r = ((glGetVideoCaptureStreamivNV = (PFNGLGETVIDEOCAPTURESTREAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamivNV")) == NULL) || r; r = ((glGetVideoCaptureivNV = (PFNGLGETVIDEOCAPTUREIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureivNV")) == NULL) || r; r = ((glVideoCaptureNV = (PFNGLVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureNV")) == NULL) || r; r = ((glVideoCaptureStreamParameterdvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterdvNV")) == NULL) || r; r = ((glVideoCaptureStreamParameterfvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterfvNV")) == NULL) || r; r = ((glVideoCaptureStreamParameterivNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterivNV")) == NULL) || r; return r; } #endif /* GL_NV_video_capture */ #ifdef GL_NV_viewport_array static GLboolean _glewInit_GL_NV_viewport_array () { GLboolean r = GL_FALSE; r = ((glDepthRangeArrayfvNV = (PFNGLDEPTHRANGEARRAYFVNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeArrayfvNV")) == NULL) || r; r = ((glDepthRangeIndexedfNV = (PFNGLDEPTHRANGEINDEXEDFNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeIndexedfNV")) == NULL) || r; r = ((glDisableiNV = (PFNGLDISABLEINVPROC)glewGetProcAddress((const GLubyte*)"glDisableiNV")) == NULL) || r; r = ((glEnableiNV = (PFNGLENABLEINVPROC)glewGetProcAddress((const GLubyte*)"glEnableiNV")) == NULL) || r; r = ((glGetFloati_vNV = (PFNGLGETFLOATI_VNVPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_vNV")) == NULL) || r; r = ((glIsEnablediNV = (PFNGLISENABLEDINVPROC)glewGetProcAddress((const GLubyte*)"glIsEnablediNV")) == NULL) || r; r = ((glScissorArrayvNV = (PFNGLSCISSORARRAYVNVPROC)glewGetProcAddress((const GLubyte*)"glScissorArrayvNV")) == NULL) || r; r = ((glScissorIndexedNV = (PFNGLSCISSORINDEXEDNVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedNV")) == NULL) || r; r = ((glScissorIndexedvNV = (PFNGLSCISSORINDEXEDVNVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedvNV")) == NULL) || r; r = ((glViewportArrayvNV = (PFNGLVIEWPORTARRAYVNVPROC)glewGetProcAddress((const GLubyte*)"glViewportArrayvNV")) == NULL) || r; r = ((glViewportIndexedfNV = (PFNGLVIEWPORTINDEXEDFNVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfNV")) == NULL) || r; r = ((glViewportIndexedfvNV = (PFNGLVIEWPORTINDEXEDFVNVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfvNV")) == NULL) || r; return r; } #endif /* GL_NV_viewport_array */ #ifdef GL_NV_viewport_swizzle static GLboolean _glewInit_GL_NV_viewport_swizzle () { GLboolean r = GL_FALSE; r = ((glViewportSwizzleNV = (PFNGLVIEWPORTSWIZZLENVPROC)glewGetProcAddress((const GLubyte*)"glViewportSwizzleNV")) == NULL) || r; return r; } #endif /* GL_NV_viewport_swizzle */ #ifdef GL_OVR_multiview static GLboolean _glewInit_GL_OVR_multiview () { GLboolean r = GL_FALSE; r = ((glFramebufferTextureMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureMultiviewOVR")) == NULL) || r; return r; } #endif /* GL_OVR_multiview */ #ifdef GL_OVR_multiview_multisampled_render_to_texture static GLboolean _glewInit_GL_OVR_multiview_multisampled_render_to_texture () { GLboolean r = GL_FALSE; r = ((glFramebufferTextureMultisampleMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureMultisampleMultiviewOVR")) == NULL) || r; return r; } #endif /* GL_OVR_multiview_multisampled_render_to_texture */ #ifdef GL_QCOM_alpha_test static GLboolean _glewInit_GL_QCOM_alpha_test () { GLboolean r = GL_FALSE; r = ((glAlphaFuncQCOM = (PFNGLALPHAFUNCQCOMPROC)glewGetProcAddress((const GLubyte*)"glAlphaFuncQCOM")) == NULL) || r; return r; } #endif /* GL_QCOM_alpha_test */ #ifdef GL_QCOM_driver_control static GLboolean _glewInit_GL_QCOM_driver_control () { GLboolean r = GL_FALSE; r = ((glDisableDriverControlQCOM = (PFNGLDISABLEDRIVERCONTROLQCOMPROC)glewGetProcAddress((const GLubyte*)"glDisableDriverControlQCOM")) == NULL) || r; r = ((glEnableDriverControlQCOM = (PFNGLENABLEDRIVERCONTROLQCOMPROC)glewGetProcAddress((const GLubyte*)"glEnableDriverControlQCOM")) == NULL) || r; r = ((glGetDriverControlStringQCOM = (PFNGLGETDRIVERCONTROLSTRINGQCOMPROC)glewGetProcAddress((const GLubyte*)"glGetDriverControlStringQCOM")) == NULL) || r; r = ((glGetDriverControlsQCOM = (PFNGLGETDRIVERCONTROLSQCOMPROC)glewGetProcAddress((const GLubyte*)"glGetDriverControlsQCOM")) == NULL) || r; return r; } #endif /* GL_QCOM_driver_control */ #ifdef GL_QCOM_extended_get static GLboolean _glewInit_GL_QCOM_extended_get () { GLboolean r = GL_FALSE; r = ((glExtGetBufferPointervQCOM = (PFNGLEXTGETBUFFERPOINTERVQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetBufferPointervQCOM")) == NULL) || r; r = ((glExtGetBuffersQCOM = (PFNGLEXTGETBUFFERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetBuffersQCOM")) == NULL) || r; r = ((glExtGetFramebuffersQCOM = (PFNGLEXTGETFRAMEBUFFERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetFramebuffersQCOM")) == NULL) || r; r = ((glExtGetRenderbuffersQCOM = (PFNGLEXTGETRENDERBUFFERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetRenderbuffersQCOM")) == NULL) || r; r = ((glExtGetTexLevelParameterivQCOM = (PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetTexLevelParameterivQCOM")) == NULL) || r; r = ((glExtGetTexSubImageQCOM = (PFNGLEXTGETTEXSUBIMAGEQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetTexSubImageQCOM")) == NULL) || r; r = ((glExtGetTexturesQCOM = (PFNGLEXTGETTEXTURESQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetTexturesQCOM")) == NULL) || r; r = ((glExtTexObjectStateOverrideiQCOM = (PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtTexObjectStateOverrideiQCOM")) == NULL) || r; return r; } #endif /* GL_QCOM_extended_get */ #ifdef GL_QCOM_extended_get2 static GLboolean _glewInit_GL_QCOM_extended_get2 () { GLboolean r = GL_FALSE; r = ((glExtGetProgramBinarySourceQCOM = (PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetProgramBinarySourceQCOM")) == NULL) || r; r = ((glExtGetProgramsQCOM = (PFNGLEXTGETPROGRAMSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetProgramsQCOM")) == NULL) || r; r = ((glExtGetShadersQCOM = (PFNGLEXTGETSHADERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetShadersQCOM")) == NULL) || r; r = ((glExtIsProgramBinaryQCOM = (PFNGLEXTISPROGRAMBINARYQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtIsProgramBinaryQCOM")) == NULL) || r; return r; } #endif /* GL_QCOM_extended_get2 */ #ifdef GL_QCOM_framebuffer_foveated static GLboolean _glewInit_GL_QCOM_framebuffer_foveated () { GLboolean r = GL_FALSE; r = ((glFramebufferFoveationConfigQCOM = (PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC)glewGetProcAddress((const GLubyte*)"glFramebufferFoveationConfigQCOM")) == NULL) || r; r = ((glFramebufferFoveationParametersQCOM = (PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glFramebufferFoveationParametersQCOM")) == NULL) || r; return r; } #endif /* GL_QCOM_framebuffer_foveated */ #ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent static GLboolean _glewInit_GL_QCOM_shader_framebuffer_fetch_noncoherent () { GLboolean r = GL_FALSE; r = ((glFramebufferFetchBarrierQCOM = (PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC)glewGetProcAddress((const GLubyte*)"glFramebufferFetchBarrierQCOM")) == NULL) || r; return r; } #endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ #ifdef GL_QCOM_tiled_rendering static GLboolean _glewInit_GL_QCOM_tiled_rendering () { GLboolean r = GL_FALSE; r = ((glEndTilingQCOM = (PFNGLENDTILINGQCOMPROC)glewGetProcAddress((const GLubyte*)"glEndTilingQCOM")) == NULL) || r; r = ((glStartTilingQCOM = (PFNGLSTARTTILINGQCOMPROC)glewGetProcAddress((const GLubyte*)"glStartTilingQCOM")) == NULL) || r; return r; } #endif /* GL_QCOM_tiled_rendering */ #ifdef GL_REGAL_ES1_0_compatibility static GLboolean _glewInit_GL_REGAL_ES1_0_compatibility () { GLboolean r = GL_FALSE; r = ((glAlphaFuncx = (PFNGLALPHAFUNCXPROC)glewGetProcAddress((const GLubyte*)"glAlphaFuncx")) == NULL) || r; r = ((glClearColorx = (PFNGLCLEARCOLORXPROC)glewGetProcAddress((const GLubyte*)"glClearColorx")) == NULL) || r; r = ((glClearDepthx = (PFNGLCLEARDEPTHXPROC)glewGetProcAddress((const GLubyte*)"glClearDepthx")) == NULL) || r; r = ((glColor4x = (PFNGLCOLOR4XPROC)glewGetProcAddress((const GLubyte*)"glColor4x")) == NULL) || r; r = ((glDepthRangex = (PFNGLDEPTHRANGEXPROC)glewGetProcAddress((const GLubyte*)"glDepthRangex")) == NULL) || r; r = ((glFogx = (PFNGLFOGXPROC)glewGetProcAddress((const GLubyte*)"glFogx")) == NULL) || r; r = ((glFogxv = (PFNGLFOGXVPROC)glewGetProcAddress((const GLubyte*)"glFogxv")) == NULL) || r; r = ((glFrustumf = (PFNGLFRUSTUMFPROC)glewGetProcAddress((const GLubyte*)"glFrustumf")) == NULL) || r; r = ((glFrustumx = (PFNGLFRUSTUMXPROC)glewGetProcAddress((const GLubyte*)"glFrustumx")) == NULL) || r; r = ((glLightModelx = (PFNGLLIGHTMODELXPROC)glewGetProcAddress((const GLubyte*)"glLightModelx")) == NULL) || r; r = ((glLightModelxv = (PFNGLLIGHTMODELXVPROC)glewGetProcAddress((const GLubyte*)"glLightModelxv")) == NULL) || r; r = ((glLightx = (PFNGLLIGHTXPROC)glewGetProcAddress((const GLubyte*)"glLightx")) == NULL) || r; r = ((glLightxv = (PFNGLLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glLightxv")) == NULL) || r; r = ((glLineWidthx = (PFNGLLINEWIDTHXPROC)glewGetProcAddress((const GLubyte*)"glLineWidthx")) == NULL) || r; r = ((glLoadMatrixx = (PFNGLLOADMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glLoadMatrixx")) == NULL) || r; r = ((glMaterialx = (PFNGLMATERIALXPROC)glewGetProcAddress((const GLubyte*)"glMaterialx")) == NULL) || r; r = ((glMaterialxv = (PFNGLMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glMaterialxv")) == NULL) || r; r = ((glMultMatrixx = (PFNGLMULTMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glMultMatrixx")) == NULL) || r; r = ((glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4x")) == NULL) || r; r = ((glNormal3x = (PFNGLNORMAL3XPROC)glewGetProcAddress((const GLubyte*)"glNormal3x")) == NULL) || r; r = ((glOrthof = (PFNGLORTHOFPROC)glewGetProcAddress((const GLubyte*)"glOrthof")) == NULL) || r; r = ((glOrthox = (PFNGLORTHOXPROC)glewGetProcAddress((const GLubyte*)"glOrthox")) == NULL) || r; r = ((glPointSizex = (PFNGLPOINTSIZEXPROC)glewGetProcAddress((const GLubyte*)"glPointSizex")) == NULL) || r; r = ((glPolygonOffsetx = (PFNGLPOLYGONOFFSETXPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetx")) == NULL) || r; r = ((glRotatex = (PFNGLROTATEXPROC)glewGetProcAddress((const GLubyte*)"glRotatex")) == NULL) || r; r = ((glSampleCoveragex = (PFNGLSAMPLECOVERAGEXPROC)glewGetProcAddress((const GLubyte*)"glSampleCoveragex")) == NULL) || r; r = ((glScalex = (PFNGLSCALEXPROC)glewGetProcAddress((const GLubyte*)"glScalex")) == NULL) || r; r = ((glTexEnvx = (PFNGLTEXENVXPROC)glewGetProcAddress((const GLubyte*)"glTexEnvx")) == NULL) || r; r = ((glTexEnvxv = (PFNGLTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glTexEnvxv")) == NULL) || r; r = ((glTexParameterx = (PFNGLTEXPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glTexParameterx")) == NULL) || r; r = ((glTranslatex = (PFNGLTRANSLATEXPROC)glewGetProcAddress((const GLubyte*)"glTranslatex")) == NULL) || r; return r; } #endif /* GL_REGAL_ES1_0_compatibility */ #ifdef GL_REGAL_ES1_1_compatibility static GLboolean _glewInit_GL_REGAL_ES1_1_compatibility () { GLboolean r = GL_FALSE; r = ((glClipPlanef = (PFNGLCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glClipPlanef")) == NULL) || r; r = ((glClipPlanex = (PFNGLCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glClipPlanex")) == NULL) || r; r = ((glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanef")) == NULL) || r; r = ((glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanex")) == NULL) || r; r = ((glGetFixedv = (PFNGLGETFIXEDVPROC)glewGetProcAddress((const GLubyte*)"glGetFixedv")) == NULL) || r; r = ((glGetLightxv = (PFNGLGETLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glGetLightxv")) == NULL) || r; r = ((glGetMaterialxv = (PFNGLGETMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glGetMaterialxv")) == NULL) || r; r = ((glGetTexEnvxv = (PFNGLGETTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexEnvxv")) == NULL) || r; r = ((glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterxv")) == NULL) || r; r = ((glPointParameterx = (PFNGLPOINTPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glPointParameterx")) == NULL) || r; r = ((glPointParameterxv = (PFNGLPOINTPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterxv")) == NULL) || r; r = ((glPointSizePointerOES = (PFNGLPOINTSIZEPOINTEROESPROC)glewGetProcAddress((const GLubyte*)"glPointSizePointerOES")) == NULL) || r; r = ((glTexParameterxv = (PFNGLTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterxv")) == NULL) || r; return r; } #endif /* GL_REGAL_ES1_1_compatibility */ #ifdef GL_REGAL_error_string static GLboolean _glewInit_GL_REGAL_error_string () { GLboolean r = GL_FALSE; r = ((glErrorStringREGAL = (PFNGLERRORSTRINGREGALPROC)glewGetProcAddress((const GLubyte*)"glErrorStringREGAL")) == NULL) || r; return r; } #endif /* GL_REGAL_error_string */ #ifdef GL_REGAL_extension_query static GLboolean _glewInit_GL_REGAL_extension_query () { GLboolean r = GL_FALSE; r = ((glGetExtensionREGAL = (PFNGLGETEXTENSIONREGALPROC)glewGetProcAddress((const GLubyte*)"glGetExtensionREGAL")) == NULL) || r; r = ((glIsSupportedREGAL = (PFNGLISSUPPORTEDREGALPROC)glewGetProcAddress((const GLubyte*)"glIsSupportedREGAL")) == NULL) || r; return r; } #endif /* GL_REGAL_extension_query */ #ifdef GL_REGAL_log static GLboolean _glewInit_GL_REGAL_log () { GLboolean r = GL_FALSE; r = ((glLogMessageCallbackREGAL = (PFNGLLOGMESSAGECALLBACKREGALPROC)glewGetProcAddress((const GLubyte*)"glLogMessageCallbackREGAL")) == NULL) || r; return r; } #endif /* GL_REGAL_log */ #ifdef GL_REGAL_proc_address static GLboolean _glewInit_GL_REGAL_proc_address () { GLboolean r = GL_FALSE; r = ((glGetProcAddressREGAL = (PFNGLGETPROCADDRESSREGALPROC)glewGetProcAddress((const GLubyte*)"glGetProcAddressREGAL")) == NULL) || r; return r; } #endif /* GL_REGAL_proc_address */ #ifdef GL_SGIS_detail_texture static GLboolean _glewInit_GL_SGIS_detail_texture () { GLboolean r = GL_FALSE; r = ((glDetailTexFuncSGIS = (PFNGLDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glDetailTexFuncSGIS")) == NULL) || r; r = ((glGetDetailTexFuncSGIS = (PFNGLGETDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetDetailTexFuncSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_detail_texture */ #ifdef GL_SGIS_fog_function static GLboolean _glewInit_GL_SGIS_fog_function () { GLboolean r = GL_FALSE; r = ((glFogFuncSGIS = (PFNGLFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glFogFuncSGIS")) == NULL) || r; r = ((glGetFogFuncSGIS = (PFNGLGETFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetFogFuncSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_fog_function */ #ifdef GL_SGIS_multisample static GLboolean _glewInit_GL_SGIS_multisample () { GLboolean r = GL_FALSE; r = ((glSampleMaskSGIS = (PFNGLSAMPLEMASKSGISPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskSGIS")) == NULL) || r; r = ((glSamplePatternSGIS = (PFNGLSAMPLEPATTERNSGISPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_multisample */ #ifdef GL_SGIS_multitexture static GLboolean _glewInit_GL_SGIS_multitexture () { GLboolean r = GL_FALSE; r = ((glInterleavedTextureCoordSetsSGIS = (PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC)glewGetProcAddress((const GLubyte*)"glInterleavedTextureCoordSetsSGIS")) == NULL) || r; r = ((glSelectTextureCoordSetSGIS = (PFNGLSELECTTEXTURECOORDSETSGISPROC)glewGetProcAddress((const GLubyte*)"glSelectTextureCoordSetSGIS")) == NULL) || r; r = ((glSelectTextureSGIS = (PFNGLSELECTTEXTURESGISPROC)glewGetProcAddress((const GLubyte*)"glSelectTextureSGIS")) == NULL) || r; r = ((glSelectTextureTransformSGIS = (PFNGLSELECTTEXTURETRANSFORMSGISPROC)glewGetProcAddress((const GLubyte*)"glSelectTextureTransformSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_multitexture */ #ifdef GL_SGIS_shared_multisample static GLboolean _glewInit_GL_SGIS_shared_multisample () { GLboolean r = GL_FALSE; r = ((glMultisampleSubRectPosSGIS = (PFNGLMULTISAMPLESUBRECTPOSSGISPROC)glewGetProcAddress((const GLubyte*)"glMultisampleSubRectPosSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_shared_multisample */ #ifdef GL_SGIS_sharpen_texture static GLboolean _glewInit_GL_SGIS_sharpen_texture () { GLboolean r = GL_FALSE; r = ((glGetSharpenTexFuncSGIS = (PFNGLGETSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetSharpenTexFuncSGIS")) == NULL) || r; r = ((glSharpenTexFuncSGIS = (PFNGLSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glSharpenTexFuncSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_sharpen_texture */ #ifdef GL_SGIS_texture4D static GLboolean _glewInit_GL_SGIS_texture4D () { GLboolean r = GL_FALSE; r = ((glTexImage4DSGIS = (PFNGLTEXIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexImage4DSGIS")) == NULL) || r; r = ((glTexSubImage4DSGIS = (PFNGLTEXSUBIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage4DSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_texture4D */ #ifdef GL_SGIS_texture_filter4 static GLboolean _glewInit_GL_SGIS_texture_filter4 () { GLboolean r = GL_FALSE; r = ((glGetTexFilterFuncSGIS = (PFNGLGETTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetTexFilterFuncSGIS")) == NULL) || r; r = ((glTexFilterFuncSGIS = (PFNGLTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glTexFilterFuncSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_texture_filter4 */ #ifdef GL_SGIX_async static GLboolean _glewInit_GL_SGIX_async () { GLboolean r = GL_FALSE; r = ((glAsyncMarkerSGIX = (PFNGLASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glAsyncMarkerSGIX")) == NULL) || r; r = ((glDeleteAsyncMarkersSGIX = (PFNGLDELETEASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteAsyncMarkersSGIX")) == NULL) || r; r = ((glFinishAsyncSGIX = (PFNGLFINISHASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glFinishAsyncSGIX")) == NULL) || r; r = ((glGenAsyncMarkersSGIX = (PFNGLGENASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenAsyncMarkersSGIX")) == NULL) || r; r = ((glIsAsyncMarkerSGIX = (PFNGLISASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsAsyncMarkerSGIX")) == NULL) || r; r = ((glPollAsyncSGIX = (PFNGLPOLLASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glPollAsyncSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_async */ #ifdef GL_SGIX_datapipe static GLboolean _glewInit_GL_SGIX_datapipe () { GLboolean r = GL_FALSE; r = ((glAddressSpace = (PFNGLADDRESSSPACEPROC)glewGetProcAddress((const GLubyte*)"glAddressSpace")) == NULL) || r; r = ((glDataPipe = (PFNGLDATAPIPEPROC)glewGetProcAddress((const GLubyte*)"glDataPipe")) == NULL) || r; return r; } #endif /* GL_SGIX_datapipe */ #ifdef GL_SGIX_flush_raster static GLboolean _glewInit_GL_SGIX_flush_raster () { GLboolean r = GL_FALSE; r = ((glFlushRasterSGIX = (PFNGLFLUSHRASTERSGIXPROC)glewGetProcAddress((const GLubyte*)"glFlushRasterSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_flush_raster */ #ifdef GL_SGIX_fog_layers static GLboolean _glewInit_GL_SGIX_fog_layers () { GLboolean r = GL_FALSE; r = ((glFogLayersSGIX = (PFNGLFOGLAYERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glFogLayersSGIX")) == NULL) || r; r = ((glGetFogLayersSGIX = (PFNGLGETFOGLAYERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFogLayersSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_fog_layers */ #ifdef GL_SGIX_fog_texture static GLboolean _glewInit_GL_SGIX_fog_texture () { GLboolean r = GL_FALSE; r = ((glTextureFogSGIX = (PFNGLTEXTUREFOGSGIXPROC)glewGetProcAddress((const GLubyte*)"glTextureFogSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_fog_texture */ #ifdef GL_SGIX_fragment_specular_lighting static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting () { GLboolean r = GL_FALSE; r = ((glFragmentColorMaterialSGIX = (PFNGLFRAGMENTCOLORMATERIALSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialSGIX")) == NULL) || r; r = ((glFragmentLightModelfSGIX = (PFNGLFRAGMENTLIGHTMODELFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfSGIX")) == NULL) || r; r = ((glFragmentLightModelfvSGIX = (PFNGLFRAGMENTLIGHTMODELFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvSGIX")) == NULL) || r; r = ((glFragmentLightModeliSGIX = (PFNGLFRAGMENTLIGHTMODELISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliSGIX")) == NULL) || r; r = ((glFragmentLightModelivSGIX = (PFNGLFRAGMENTLIGHTMODELIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivSGIX")) == NULL) || r; r = ((glFragmentLightfSGIX = (PFNGLFRAGMENTLIGHTFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfSGIX")) == NULL) || r; r = ((glFragmentLightfvSGIX = (PFNGLFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvSGIX")) == NULL) || r; r = ((glFragmentLightiSGIX = (PFNGLFRAGMENTLIGHTISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiSGIX")) == NULL) || r; r = ((glFragmentLightivSGIX = (PFNGLFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivSGIX")) == NULL) || r; r = ((glFragmentMaterialfSGIX = (PFNGLFRAGMENTMATERIALFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfSGIX")) == NULL) || r; r = ((glFragmentMaterialfvSGIX = (PFNGLFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvSGIX")) == NULL) || r; r = ((glFragmentMaterialiSGIX = (PFNGLFRAGMENTMATERIALISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiSGIX")) == NULL) || r; r = ((glFragmentMaterialivSGIX = (PFNGLFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivSGIX")) == NULL) || r; r = ((glGetFragmentLightfvSGIX = (PFNGLGETFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvSGIX")) == NULL) || r; r = ((glGetFragmentLightivSGIX = (PFNGLGETFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivSGIX")) == NULL) || r; r = ((glGetFragmentMaterialfvSGIX = (PFNGLGETFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvSGIX")) == NULL) || r; r = ((glGetFragmentMaterialivSGIX = (PFNGLGETFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_fragment_specular_lighting */ #ifdef GL_SGIX_framezoom static GLboolean _glewInit_GL_SGIX_framezoom () { GLboolean r = GL_FALSE; r = ((glFrameZoomSGIX = (PFNGLFRAMEZOOMSGIXPROC)glewGetProcAddress((const GLubyte*)"glFrameZoomSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_framezoom */ #ifdef GL_SGIX_igloo_interface static GLboolean _glewInit_GL_SGIX_igloo_interface () { GLboolean r = GL_FALSE; r = ((glIglooInterfaceSGIX = (PFNGLIGLOOINTERFACESGIXPROC)glewGetProcAddress((const GLubyte*)"glIglooInterfaceSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_igloo_interface */ #ifdef GL_SGIX_mpeg1 static GLboolean _glewInit_GL_SGIX_mpeg1 () { GLboolean r = GL_FALSE; r = ((glAllocMPEGPredictorsSGIX = (PFNGLALLOCMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glAllocMPEGPredictorsSGIX")) == NULL) || r; r = ((glDeleteMPEGPredictorsSGIX = (PFNGLDELETEMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteMPEGPredictorsSGIX")) == NULL) || r; r = ((glGenMPEGPredictorsSGIX = (PFNGLGENMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenMPEGPredictorsSGIX")) == NULL) || r; r = ((glGetMPEGParameterfvSGIX = (PFNGLGETMPEGPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGParameterfvSGIX")) == NULL) || r; r = ((glGetMPEGParameterivSGIX = (PFNGLGETMPEGPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGParameterivSGIX")) == NULL) || r; r = ((glGetMPEGPredictorSGIX = (PFNGLGETMPEGPREDICTORSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGPredictorSGIX")) == NULL) || r; r = ((glGetMPEGQuantTableubv = (PFNGLGETMPEGQUANTTABLEUBVPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGQuantTableubv")) == NULL) || r; r = ((glIsMPEGPredictorSGIX = (PFNGLISMPEGPREDICTORSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsMPEGPredictorSGIX")) == NULL) || r; r = ((glMPEGPredictorSGIX = (PFNGLMPEGPREDICTORSGIXPROC)glewGetProcAddress((const GLubyte*)"glMPEGPredictorSGIX")) == NULL) || r; r = ((glMPEGQuantTableubv = (PFNGLMPEGQUANTTABLEUBVPROC)glewGetProcAddress((const GLubyte*)"glMPEGQuantTableubv")) == NULL) || r; r = ((glSwapMPEGPredictorsSGIX = (PFNGLSWAPMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glSwapMPEGPredictorsSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_mpeg1 */ #ifdef GL_SGIX_nonlinear_lighting_pervertex static GLboolean _glewInit_GL_SGIX_nonlinear_lighting_pervertex () { GLboolean r = GL_FALSE; r = ((glGetNonlinLightfvSGIX = (PFNGLGETNONLINLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetNonlinLightfvSGIX")) == NULL) || r; r = ((glGetNonlinMaterialfvSGIX = (PFNGLGETNONLINMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetNonlinMaterialfvSGIX")) == NULL) || r; r = ((glNonlinLightfvSGIX = (PFNGLNONLINLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glNonlinLightfvSGIX")) == NULL) || r; r = ((glNonlinMaterialfvSGIX = (PFNGLNONLINMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glNonlinMaterialfvSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_nonlinear_lighting_pervertex */ #ifdef GL_SGIX_pixel_texture static GLboolean _glewInit_GL_SGIX_pixel_texture () { GLboolean r = GL_FALSE; r = ((glPixelTexGenSGIX = (PFNGLPIXELTEXGENSGIXPROC)glewGetProcAddress((const GLubyte*)"glPixelTexGenSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_pixel_texture */ #ifdef GL_SGIX_polynomial_ffd static GLboolean _glewInit_GL_SGIX_polynomial_ffd () { GLboolean r = GL_FALSE; r = ((glDeformSGIX = (PFNGLDEFORMSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeformSGIX")) == NULL) || r; r = ((glLoadIdentityDeformationMapSGIX = (PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC)glewGetProcAddress((const GLubyte*)"glLoadIdentityDeformationMapSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_polynomial_ffd */ #ifdef GL_SGIX_quad_mesh static GLboolean _glewInit_GL_SGIX_quad_mesh () { GLboolean r = GL_FALSE; r = ((glMeshBreadthSGIX = (PFNGLMESHBREADTHSGIXPROC)glewGetProcAddress((const GLubyte*)"glMeshBreadthSGIX")) == NULL) || r; r = ((glMeshStrideSGIX = (PFNGLMESHSTRIDESGIXPROC)glewGetProcAddress((const GLubyte*)"glMeshStrideSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_quad_mesh */ #ifdef GL_SGIX_reference_plane static GLboolean _glewInit_GL_SGIX_reference_plane () { GLboolean r = GL_FALSE; r = ((glReferencePlaneSGIX = (PFNGLREFERENCEPLANESGIXPROC)glewGetProcAddress((const GLubyte*)"glReferencePlaneSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_reference_plane */ #ifdef GL_SGIX_sprite static GLboolean _glewInit_GL_SGIX_sprite () { GLboolean r = GL_FALSE; r = ((glSpriteParameterfSGIX = (PFNGLSPRITEPARAMETERFSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfSGIX")) == NULL) || r; r = ((glSpriteParameterfvSGIX = (PFNGLSPRITEPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfvSGIX")) == NULL) || r; r = ((glSpriteParameteriSGIX = (PFNGLSPRITEPARAMETERISGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameteriSGIX")) == NULL) || r; r = ((glSpriteParameterivSGIX = (PFNGLSPRITEPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterivSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_sprite */ #ifdef GL_SGIX_tag_sample_buffer static GLboolean _glewInit_GL_SGIX_tag_sample_buffer () { GLboolean r = GL_FALSE; r = ((glTagSampleBufferSGIX = (PFNGLTAGSAMPLEBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glTagSampleBufferSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_tag_sample_buffer */ #ifdef GL_SGIX_vector_ops static GLboolean _glewInit_GL_SGIX_vector_ops () { GLboolean r = GL_FALSE; r = ((glGetVectorOperationSGIX = (PFNGLGETVECTOROPERATIONSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetVectorOperationSGIX")) == NULL) || r; r = ((glVectorOperationSGIX = (PFNGLVECTOROPERATIONSGIXPROC)glewGetProcAddress((const GLubyte*)"glVectorOperationSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_vector_ops */ #ifdef GL_SGIX_vertex_array_object static GLboolean _glewInit_GL_SGIX_vertex_array_object () { GLboolean r = GL_FALSE; r = ((glAreVertexArraysResidentSGIX = (PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glAreVertexArraysResidentSGIX")) == NULL) || r; r = ((glBindVertexArraySGIX = (PFNGLBINDVERTEXARRAYSGIXPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArraySGIX")) == NULL) || r; r = ((glDeleteVertexArraysSGIX = (PFNGLDELETEVERTEXARRAYSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysSGIX")) == NULL) || r; r = ((glGenVertexArraysSGIX = (PFNGLGENVERTEXARRAYSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysSGIX")) == NULL) || r; r = ((glIsVertexArraySGIX = (PFNGLISVERTEXARRAYSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArraySGIX")) == NULL) || r; r = ((glPrioritizeVertexArraysSGIX = (PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeVertexArraysSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_vertex_array_object */ #ifdef GL_SGI_color_table static GLboolean _glewInit_GL_SGI_color_table () { GLboolean r = GL_FALSE; r = ((glColorTableParameterfvSGI = (PFNGLCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfvSGI")) == NULL) || r; r = ((glColorTableParameterivSGI = (PFNGLCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterivSGI")) == NULL) || r; r = ((glColorTableSGI = (PFNGLCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableSGI")) == NULL) || r; r = ((glCopyColorTableSGI = (PFNGLCOPYCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTableSGI")) == NULL) || r; r = ((glGetColorTableParameterfvSGI = (PFNGLGETCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvSGI")) == NULL) || r; r = ((glGetColorTableParameterivSGI = (PFNGLGETCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivSGI")) == NULL) || r; r = ((glGetColorTableSGI = (PFNGLGETCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableSGI")) == NULL) || r; return r; } #endif /* GL_SGI_color_table */ #ifdef GL_SGI_fft static GLboolean _glewInit_GL_SGI_fft () { GLboolean r = GL_FALSE; r = ((glGetPixelTransformParameterfvSGI = (PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvSGI")) == NULL) || r; r = ((glGetPixelTransformParameterivSGI = (PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivSGI")) == NULL) || r; r = ((glPixelTransformParameterfSGI = (PFNGLPIXELTRANSFORMPARAMETERFSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfSGI")) == NULL) || r; r = ((glPixelTransformParameterfvSGI = (PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvSGI")) == NULL) || r; r = ((glPixelTransformParameteriSGI = (PFNGLPIXELTRANSFORMPARAMETERISGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriSGI")) == NULL) || r; r = ((glPixelTransformParameterivSGI = (PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivSGI")) == NULL) || r; r = ((glPixelTransformSGI = (PFNGLPIXELTRANSFORMSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformSGI")) == NULL) || r; return r; } #endif /* GL_SGI_fft */ #ifdef GL_SUNX_constant_data static GLboolean _glewInit_GL_SUNX_constant_data () { GLboolean r = GL_FALSE; r = ((glFinishTextureSUNX = (PFNGLFINISHTEXTURESUNXPROC)glewGetProcAddress((const GLubyte*)"glFinishTextureSUNX")) == NULL) || r; return r; } #endif /* GL_SUNX_constant_data */ #ifdef GL_SUN_global_alpha static GLboolean _glewInit_GL_SUN_global_alpha () { GLboolean r = GL_FALSE; r = ((glGlobalAlphaFactorbSUN = (PFNGLGLOBALALPHAFACTORBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorbSUN")) == NULL) || r; r = ((glGlobalAlphaFactordSUN = (PFNGLGLOBALALPHAFACTORDSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactordSUN")) == NULL) || r; r = ((glGlobalAlphaFactorfSUN = (PFNGLGLOBALALPHAFACTORFSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorfSUN")) == NULL) || r; r = ((glGlobalAlphaFactoriSUN = (PFNGLGLOBALALPHAFACTORISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoriSUN")) == NULL) || r; r = ((glGlobalAlphaFactorsSUN = (PFNGLGLOBALALPHAFACTORSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorsSUN")) == NULL) || r; r = ((glGlobalAlphaFactorubSUN = (PFNGLGLOBALALPHAFACTORUBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorubSUN")) == NULL) || r; r = ((glGlobalAlphaFactoruiSUN = (PFNGLGLOBALALPHAFACTORUISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoruiSUN")) == NULL) || r; r = ((glGlobalAlphaFactorusSUN = (PFNGLGLOBALALPHAFACTORUSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorusSUN")) == NULL) || r; return r; } #endif /* GL_SUN_global_alpha */ #ifdef GL_SUN_read_video_pixels static GLboolean _glewInit_GL_SUN_read_video_pixels () { GLboolean r = GL_FALSE; r = ((glReadVideoPixelsSUN = (PFNGLREADVIDEOPIXELSSUNPROC)glewGetProcAddress((const GLubyte*)"glReadVideoPixelsSUN")) == NULL) || r; return r; } #endif /* GL_SUN_read_video_pixels */ #ifdef GL_SUN_triangle_list static GLboolean _glewInit_GL_SUN_triangle_list () { GLboolean r = GL_FALSE; r = ((glReplacementCodePointerSUN = (PFNGLREPLACEMENTCODEPOINTERSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodePointerSUN")) == NULL) || r; r = ((glReplacementCodeubSUN = (PFNGLREPLACEMENTCODEUBSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubSUN")) == NULL) || r; r = ((glReplacementCodeubvSUN = (PFNGLREPLACEMENTCODEUBVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubvSUN")) == NULL) || r; r = ((glReplacementCodeuiSUN = (PFNGLREPLACEMENTCODEUISUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiSUN")) == NULL) || r; r = ((glReplacementCodeuivSUN = (PFNGLREPLACEMENTCODEUIVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuivSUN")) == NULL) || r; r = ((glReplacementCodeusSUN = (PFNGLREPLACEMENTCODEUSSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusSUN")) == NULL) || r; r = ((glReplacementCodeusvSUN = (PFNGLREPLACEMENTCODEUSVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusvSUN")) == NULL) || r; return r; } #endif /* GL_SUN_triangle_list */ #ifdef GL_SUN_vertex static GLboolean _glewInit_GL_SUN_vertex () { GLboolean r = GL_FALSE; r = ((glColor3fVertex3fSUN = (PFNGLCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fSUN")) == NULL) || r; r = ((glColor3fVertex3fvSUN = (PFNGLCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fvSUN")) == NULL) || r; r = ((glColor4fNormal3fVertex3fSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fSUN")) == NULL) || r; r = ((glColor4fNormal3fVertex3fvSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glColor4ubVertex2fSUN = (PFNGLCOLOR4UBVERTEX2FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fSUN")) == NULL) || r; r = ((glColor4ubVertex2fvSUN = (PFNGLCOLOR4UBVERTEX2FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fvSUN")) == NULL) || r; r = ((glColor4ubVertex3fSUN = (PFNGLCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fSUN")) == NULL) || r; r = ((glColor4ubVertex3fvSUN = (PFNGLCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fvSUN")) == NULL) || r; r = ((glNormal3fVertex3fSUN = (PFNGLNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fSUN")) == NULL) || r; r = ((glNormal3fVertex3fvSUN = (PFNGLNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiColor3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiColor3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiColor4ubVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiColor4ubVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiVertex3fSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiVertex3fvSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fColor3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fColor3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fColor4ubVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fColor4ubVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fVertex3fSUN = (PFNGLTEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fVertex3fvSUN = (PFNGLTEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fvSUN")) == NULL) || r; r = ((glTexCoord4fColor4fNormal3fVertex4fSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fSUN")) == NULL) || r; r = ((glTexCoord4fColor4fNormal3fVertex4fvSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fvSUN")) == NULL) || r; r = ((glTexCoord4fVertex4fSUN = (PFNGLTEXCOORD4FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fSUN")) == NULL) || r; r = ((glTexCoord4fVertex4fvSUN = (PFNGLTEXCOORD4FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fvSUN")) == NULL) || r; return r; } #endif /* GL_SUN_vertex */ #ifdef GL_WIN_swap_hint static GLboolean _glewInit_GL_WIN_swap_hint () { GLboolean r = GL_FALSE; r = ((glAddSwapHintRectWIN = (PFNGLADDSWAPHINTRECTWINPROC)glewGetProcAddress((const GLubyte*)"glAddSwapHintRectWIN")) == NULL) || r; return r; } #endif /* GL_WIN_swap_hint */ /* ------------------------------------------------------------------------- */ static int _glewExtensionCompare(const char *s1, const char *s2) { /* http://www.chanduthedev.com/2012/07/strcmp-implementation-in-c.html */ while (*s1 || *s2) { if (*s1 > *s2) return 1; if (*s1 < *s2) return -1; s1++; s2++; } return 0; } static ptrdiff_t _glewBsearchExtension(const char* name) { ptrdiff_t lo = 0, hi = sizeof(_glewExtensionLookup) / sizeof(char*) - 2; while (lo <= hi) { ptrdiff_t mid = (lo + hi) / 2; const int cmp = _glewExtensionCompare(name, _glewExtensionLookup[mid]); if (cmp < 0) hi = mid - 1; else if (cmp > 0) lo = mid + 1; else return mid; } return -1; } static GLboolean *_glewGetExtensionString(const char *name) { ptrdiff_t n = _glewBsearchExtension(name); if (n >= 0) return &_glewExtensionString[n]; return NULL; } static GLboolean *_glewGetExtensionEnable(const char *name) { ptrdiff_t n = _glewBsearchExtension(name); if (n >= 0) return _glewExtensionEnabled[n]; return NULL; } static const char *_glewNextSpace(const char *i) { const char *j = i; if (j) while (*j!=' ' && *j) ++j; return j; } static const char *_glewNextNonSpace(const char *i) { const char *j = i; if (j) while (*j==' ') ++j; return j; } GLboolean GLEWAPIENTRY glewGetExtension (const char* name) { GLboolean *enable = _glewGetExtensionString(name); if (enable) return *enable; return GL_FALSE; } /* ------------------------------------------------------------------------- */ typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGPROC) (GLenum name); typedef void (GLAPIENTRY * PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params); static GLenum GLEWAPIENTRY glewContextInit () { PFNGLGETSTRINGPROC getString; const GLubyte* s; GLuint dot; GLint major, minor; size_t n; #ifdef _WIN32 getString = glGetString; #else getString = (PFNGLGETSTRINGPROC) glewGetProcAddress((const GLubyte*)"glGetString"); if (!getString) return GLEW_ERROR_NO_GL_VERSION; #endif /* query opengl version */ s = getString(GL_VERSION); dot = _glewStrCLen(s, '.'); if (dot == 0) return GLEW_ERROR_NO_GL_VERSION; major = s[dot-1]-'0'; minor = s[dot+1]-'0'; if (minor < 0 || minor > 9) minor = 0; if (major<0 || major>9) return GLEW_ERROR_NO_GL_VERSION; if (major == 1 && minor == 0) { return GLEW_ERROR_GL_VERSION_10_ONLY; } else { GLEW_VERSION_4_6 = ( major > 4 ) || ( major == 4 && minor >= 6 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_4_5 = GLEW_VERSION_4_4 == GL_TRUE || ( major == 4 && minor >= 5 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_4_4 = GLEW_VERSION_4_5 == GL_TRUE || ( major == 4 && minor >= 4 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_4_3 = GLEW_VERSION_4_4 == GL_TRUE || ( major == 4 && minor >= 3 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_4_2 = GLEW_VERSION_4_3 == GL_TRUE || ( major == 4 && minor >= 2 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_4_1 = GLEW_VERSION_4_2 == GL_TRUE || ( major == 4 && minor >= 1 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_4_0 = GLEW_VERSION_4_1 == GL_TRUE || ( major == 4 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_3_3 = GLEW_VERSION_4_0 == GL_TRUE || ( major == 3 && minor >= 3 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_3_2 = GLEW_VERSION_3_3 == GL_TRUE || ( major == 3 && minor >= 2 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_3_1 = GLEW_VERSION_3_2 == GL_TRUE || ( major == 3 && minor >= 1 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_3_0 = GLEW_VERSION_3_1 == GL_TRUE || ( major == 3 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_2_1 = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_2_0 = GLEW_VERSION_2_1 == GL_TRUE || ( major == 2 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_1_5 = GLEW_VERSION_2_0 == GL_TRUE || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_1_4 = GLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_1_3 = GLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_1_2_1 = GLEW_VERSION_1_3 == GL_TRUE ? GL_TRUE : GL_FALSE; GLEW_VERSION_1_2 = GLEW_VERSION_1_2_1 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_1_1 = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; } for (n = 0; n < sizeof(_glewExtensionString) / sizeof(_glewExtensionString[0]); ++n) _glewExtensionString[n] = GL_FALSE; if (GLEW_VERSION_3_0) { GLint n = 0; GLint i; PFNGLGETINTEGERVPROC getIntegerv; PFNGLGETSTRINGIPROC getStringi; const char *ext; GLboolean *enable; #ifdef _WIN32 getIntegerv = glGetIntegerv; #else getIntegerv = (PFNGLGETINTEGERVPROC) glewGetProcAddress((const GLubyte*)"glGetIntegerv"); #endif if (getIntegerv) getIntegerv(GL_NUM_EXTENSIONS, &n); /* glGetStringi is OpenGL 3.0 */ getStringi = (PFNGLGETSTRINGIPROC) glewGetProcAddress((const GLubyte*)"glGetStringi"); if (getStringi) for (i = 0; i= (ptrdiff_t) sizeof(ext)) continue; _glewStrCopy(ext, i, ' '); /* Based on extension string(s), glewGetExtension purposes */ enable = _glewGetExtensionString(ext); if (enable) *enable = GL_TRUE; /* Based on extension string(s), experimental mode, glewIsSupported purposes */ enable = _glewGetExtensionEnable(ext); if (enable) *enable = GL_TRUE; } } } #ifdef GL_VERSION_1_2 if (glewExperimental || GLEW_VERSION_1_2) GLEW_VERSION_1_2 = !_glewInit_GL_VERSION_1_2(); #endif /* GL_VERSION_1_2 */ #ifdef GL_VERSION_1_3 if (glewExperimental || GLEW_VERSION_1_3) GLEW_VERSION_1_3 = !_glewInit_GL_VERSION_1_3(); #endif /* GL_VERSION_1_3 */ #ifdef GL_VERSION_1_4 if (glewExperimental || GLEW_VERSION_1_4) GLEW_VERSION_1_4 = !_glewInit_GL_VERSION_1_4(); #endif /* GL_VERSION_1_4 */ #ifdef GL_VERSION_1_5 if (glewExperimental || GLEW_VERSION_1_5) GLEW_VERSION_1_5 = !_glewInit_GL_VERSION_1_5(); #endif /* GL_VERSION_1_5 */ #ifdef GL_VERSION_2_0 if (glewExperimental || GLEW_VERSION_2_0) GLEW_VERSION_2_0 = !_glewInit_GL_VERSION_2_0(); #endif /* GL_VERSION_2_0 */ #ifdef GL_VERSION_2_1 if (glewExperimental || GLEW_VERSION_2_1) GLEW_VERSION_2_1 = !_glewInit_GL_VERSION_2_1(); #endif /* GL_VERSION_2_1 */ #ifdef GL_VERSION_3_0 if (glewExperimental || GLEW_VERSION_3_0) GLEW_VERSION_3_0 = !_glewInit_GL_VERSION_3_0(); #endif /* GL_VERSION_3_0 */ #ifdef GL_VERSION_3_1 if (glewExperimental || GLEW_VERSION_3_1) GLEW_VERSION_3_1 = !_glewInit_GL_VERSION_3_1(); #endif /* GL_VERSION_3_1 */ #ifdef GL_VERSION_3_2 if (glewExperimental || GLEW_VERSION_3_2) GLEW_VERSION_3_2 = !_glewInit_GL_VERSION_3_2(); #endif /* GL_VERSION_3_2 */ #ifdef GL_VERSION_3_3 if (glewExperimental || GLEW_VERSION_3_3) GLEW_VERSION_3_3 = !_glewInit_GL_VERSION_3_3(); #endif /* GL_VERSION_3_3 */ #ifdef GL_VERSION_4_0 if (glewExperimental || GLEW_VERSION_4_0) GLEW_VERSION_4_0 = !_glewInit_GL_VERSION_4_0(); #endif /* GL_VERSION_4_0 */ #ifdef GL_VERSION_4_5 if (glewExperimental || GLEW_VERSION_4_5) GLEW_VERSION_4_5 = !_glewInit_GL_VERSION_4_5(); #endif /* GL_VERSION_4_5 */ #ifdef GL_VERSION_4_6 if (glewExperimental || GLEW_VERSION_4_6) GLEW_VERSION_4_6 = !_glewInit_GL_VERSION_4_6(); #endif /* GL_VERSION_4_6 */ #ifdef GL_3DFX_tbuffer if (glewExperimental || GLEW_3DFX_tbuffer) GLEW_3DFX_tbuffer = !_glewInit_GL_3DFX_tbuffer(); #endif /* GL_3DFX_tbuffer */ #ifdef GL_AMD_debug_output if (glewExperimental || GLEW_AMD_debug_output) GLEW_AMD_debug_output = !_glewInit_GL_AMD_debug_output(); #endif /* GL_AMD_debug_output */ #ifdef GL_AMD_draw_buffers_blend if (glewExperimental || GLEW_AMD_draw_buffers_blend) GLEW_AMD_draw_buffers_blend = !_glewInit_GL_AMD_draw_buffers_blend(); #endif /* GL_AMD_draw_buffers_blend */ #ifdef GL_AMD_framebuffer_sample_positions if (glewExperimental || GLEW_AMD_framebuffer_sample_positions) GLEW_AMD_framebuffer_sample_positions = !_glewInit_GL_AMD_framebuffer_sample_positions(); #endif /* GL_AMD_framebuffer_sample_positions */ #ifdef GL_AMD_interleaved_elements if (glewExperimental || GLEW_AMD_interleaved_elements) GLEW_AMD_interleaved_elements = !_glewInit_GL_AMD_interleaved_elements(); #endif /* GL_AMD_interleaved_elements */ #ifdef GL_AMD_multi_draw_indirect if (glewExperimental || GLEW_AMD_multi_draw_indirect) GLEW_AMD_multi_draw_indirect = !_glewInit_GL_AMD_multi_draw_indirect(); #endif /* GL_AMD_multi_draw_indirect */ #ifdef GL_AMD_name_gen_delete if (glewExperimental || GLEW_AMD_name_gen_delete) GLEW_AMD_name_gen_delete = !_glewInit_GL_AMD_name_gen_delete(); #endif /* GL_AMD_name_gen_delete */ #ifdef GL_AMD_occlusion_query_event if (glewExperimental || GLEW_AMD_occlusion_query_event) GLEW_AMD_occlusion_query_event = !_glewInit_GL_AMD_occlusion_query_event(); #endif /* GL_AMD_occlusion_query_event */ #ifdef GL_AMD_performance_monitor if (glewExperimental || GLEW_AMD_performance_monitor) GLEW_AMD_performance_monitor = !_glewInit_GL_AMD_performance_monitor(); #endif /* GL_AMD_performance_monitor */ #ifdef GL_AMD_sample_positions if (glewExperimental || GLEW_AMD_sample_positions) GLEW_AMD_sample_positions = !_glewInit_GL_AMD_sample_positions(); #endif /* GL_AMD_sample_positions */ #ifdef GL_AMD_sparse_texture if (glewExperimental || GLEW_AMD_sparse_texture) GLEW_AMD_sparse_texture = !_glewInit_GL_AMD_sparse_texture(); #endif /* GL_AMD_sparse_texture */ #ifdef GL_AMD_stencil_operation_extended if (glewExperimental || GLEW_AMD_stencil_operation_extended) GLEW_AMD_stencil_operation_extended = !_glewInit_GL_AMD_stencil_operation_extended(); #endif /* GL_AMD_stencil_operation_extended */ #ifdef GL_AMD_vertex_shader_tessellator if (glewExperimental || GLEW_AMD_vertex_shader_tessellator) GLEW_AMD_vertex_shader_tessellator = !_glewInit_GL_AMD_vertex_shader_tessellator(); #endif /* GL_AMD_vertex_shader_tessellator */ #ifdef GL_ANGLE_framebuffer_blit if (glewExperimental || GLEW_ANGLE_framebuffer_blit) GLEW_ANGLE_framebuffer_blit = !_glewInit_GL_ANGLE_framebuffer_blit(); #endif /* GL_ANGLE_framebuffer_blit */ #ifdef GL_ANGLE_framebuffer_multisample if (glewExperimental || GLEW_ANGLE_framebuffer_multisample) GLEW_ANGLE_framebuffer_multisample = !_glewInit_GL_ANGLE_framebuffer_multisample(); #endif /* GL_ANGLE_framebuffer_multisample */ #ifdef GL_ANGLE_instanced_arrays if (glewExperimental || GLEW_ANGLE_instanced_arrays) GLEW_ANGLE_instanced_arrays = !_glewInit_GL_ANGLE_instanced_arrays(); #endif /* GL_ANGLE_instanced_arrays */ #ifdef GL_ANGLE_timer_query if (glewExperimental || GLEW_ANGLE_timer_query) GLEW_ANGLE_timer_query = !_glewInit_GL_ANGLE_timer_query(); #endif /* GL_ANGLE_timer_query */ #ifdef GL_ANGLE_translated_shader_source if (glewExperimental || GLEW_ANGLE_translated_shader_source) GLEW_ANGLE_translated_shader_source = !_glewInit_GL_ANGLE_translated_shader_source(); #endif /* GL_ANGLE_translated_shader_source */ #ifdef GL_APPLE_copy_texture_levels if (glewExperimental || GLEW_APPLE_copy_texture_levels) GLEW_APPLE_copy_texture_levels = !_glewInit_GL_APPLE_copy_texture_levels(); #endif /* GL_APPLE_copy_texture_levels */ #ifdef GL_APPLE_element_array if (glewExperimental || GLEW_APPLE_element_array) GLEW_APPLE_element_array = !_glewInit_GL_APPLE_element_array(); #endif /* GL_APPLE_element_array */ #ifdef GL_APPLE_fence if (glewExperimental || GLEW_APPLE_fence) GLEW_APPLE_fence = !_glewInit_GL_APPLE_fence(); #endif /* GL_APPLE_fence */ #ifdef GL_APPLE_flush_buffer_range if (glewExperimental || GLEW_APPLE_flush_buffer_range) GLEW_APPLE_flush_buffer_range = !_glewInit_GL_APPLE_flush_buffer_range(); #endif /* GL_APPLE_flush_buffer_range */ #ifdef GL_APPLE_framebuffer_multisample if (glewExperimental || GLEW_APPLE_framebuffer_multisample) GLEW_APPLE_framebuffer_multisample = !_glewInit_GL_APPLE_framebuffer_multisample(); #endif /* GL_APPLE_framebuffer_multisample */ #ifdef GL_APPLE_object_purgeable if (glewExperimental || GLEW_APPLE_object_purgeable) GLEW_APPLE_object_purgeable = !_glewInit_GL_APPLE_object_purgeable(); #endif /* GL_APPLE_object_purgeable */ #ifdef GL_APPLE_sync if (glewExperimental || GLEW_APPLE_sync) GLEW_APPLE_sync = !_glewInit_GL_APPLE_sync(); #endif /* GL_APPLE_sync */ #ifdef GL_APPLE_texture_range if (glewExperimental || GLEW_APPLE_texture_range) GLEW_APPLE_texture_range = !_glewInit_GL_APPLE_texture_range(); #endif /* GL_APPLE_texture_range */ #ifdef GL_APPLE_vertex_array_object if (glewExperimental || GLEW_APPLE_vertex_array_object) GLEW_APPLE_vertex_array_object = !_glewInit_GL_APPLE_vertex_array_object(); #endif /* GL_APPLE_vertex_array_object */ #ifdef GL_APPLE_vertex_array_range if (glewExperimental || GLEW_APPLE_vertex_array_range) GLEW_APPLE_vertex_array_range = !_glewInit_GL_APPLE_vertex_array_range(); #endif /* GL_APPLE_vertex_array_range */ #ifdef GL_APPLE_vertex_program_evaluators if (glewExperimental || GLEW_APPLE_vertex_program_evaluators) GLEW_APPLE_vertex_program_evaluators = !_glewInit_GL_APPLE_vertex_program_evaluators(); #endif /* GL_APPLE_vertex_program_evaluators */ #ifdef GL_ARB_ES2_compatibility if (glewExperimental || GLEW_ARB_ES2_compatibility) GLEW_ARB_ES2_compatibility = !_glewInit_GL_ARB_ES2_compatibility(); #endif /* GL_ARB_ES2_compatibility */ #ifdef GL_ARB_ES3_1_compatibility if (glewExperimental || GLEW_ARB_ES3_1_compatibility) GLEW_ARB_ES3_1_compatibility = !_glewInit_GL_ARB_ES3_1_compatibility(); #endif /* GL_ARB_ES3_1_compatibility */ #ifdef GL_ARB_ES3_2_compatibility if (glewExperimental || GLEW_ARB_ES3_2_compatibility) GLEW_ARB_ES3_2_compatibility = !_glewInit_GL_ARB_ES3_2_compatibility(); #endif /* GL_ARB_ES3_2_compatibility */ #ifdef GL_ARB_base_instance if (glewExperimental || GLEW_ARB_base_instance) GLEW_ARB_base_instance = !_glewInit_GL_ARB_base_instance(); #endif /* GL_ARB_base_instance */ #ifdef GL_ARB_bindless_texture if (glewExperimental || GLEW_ARB_bindless_texture) GLEW_ARB_bindless_texture = !_glewInit_GL_ARB_bindless_texture(); #endif /* GL_ARB_bindless_texture */ #ifdef GL_ARB_blend_func_extended if (glewExperimental || GLEW_ARB_blend_func_extended) GLEW_ARB_blend_func_extended = !_glewInit_GL_ARB_blend_func_extended(); #endif /* GL_ARB_blend_func_extended */ #ifdef GL_ARB_buffer_storage if (glewExperimental || GLEW_ARB_buffer_storage) GLEW_ARB_buffer_storage = !_glewInit_GL_ARB_buffer_storage(); #endif /* GL_ARB_buffer_storage */ #ifdef GL_ARB_cl_event if (glewExperimental || GLEW_ARB_cl_event) GLEW_ARB_cl_event = !_glewInit_GL_ARB_cl_event(); #endif /* GL_ARB_cl_event */ #ifdef GL_ARB_clear_buffer_object if (glewExperimental || GLEW_ARB_clear_buffer_object) GLEW_ARB_clear_buffer_object = !_glewInit_GL_ARB_clear_buffer_object(); #endif /* GL_ARB_clear_buffer_object */ #ifdef GL_ARB_clear_texture if (glewExperimental || GLEW_ARB_clear_texture) GLEW_ARB_clear_texture = !_glewInit_GL_ARB_clear_texture(); #endif /* GL_ARB_clear_texture */ #ifdef GL_ARB_clip_control if (glewExperimental || GLEW_ARB_clip_control) GLEW_ARB_clip_control = !_glewInit_GL_ARB_clip_control(); #endif /* GL_ARB_clip_control */ #ifdef GL_ARB_color_buffer_float if (glewExperimental || GLEW_ARB_color_buffer_float) GLEW_ARB_color_buffer_float = !_glewInit_GL_ARB_color_buffer_float(); #endif /* GL_ARB_color_buffer_float */ #ifdef GL_ARB_compute_shader if (glewExperimental || GLEW_ARB_compute_shader) GLEW_ARB_compute_shader = !_glewInit_GL_ARB_compute_shader(); #endif /* GL_ARB_compute_shader */ #ifdef GL_ARB_compute_variable_group_size if (glewExperimental || GLEW_ARB_compute_variable_group_size) GLEW_ARB_compute_variable_group_size = !_glewInit_GL_ARB_compute_variable_group_size(); #endif /* GL_ARB_compute_variable_group_size */ #ifdef GL_ARB_copy_buffer if (glewExperimental || GLEW_ARB_copy_buffer) GLEW_ARB_copy_buffer = !_glewInit_GL_ARB_copy_buffer(); #endif /* GL_ARB_copy_buffer */ #ifdef GL_ARB_copy_image if (glewExperimental || GLEW_ARB_copy_image) GLEW_ARB_copy_image = !_glewInit_GL_ARB_copy_image(); #endif /* GL_ARB_copy_image */ #ifdef GL_ARB_debug_output if (glewExperimental || GLEW_ARB_debug_output) GLEW_ARB_debug_output = !_glewInit_GL_ARB_debug_output(); #endif /* GL_ARB_debug_output */ #ifdef GL_ARB_direct_state_access if (glewExperimental || GLEW_ARB_direct_state_access) GLEW_ARB_direct_state_access = !_glewInit_GL_ARB_direct_state_access(); #endif /* GL_ARB_direct_state_access */ #ifdef GL_ARB_draw_buffers if (glewExperimental || GLEW_ARB_draw_buffers) GLEW_ARB_draw_buffers = !_glewInit_GL_ARB_draw_buffers(); #endif /* GL_ARB_draw_buffers */ #ifdef GL_ARB_draw_buffers_blend if (glewExperimental || GLEW_ARB_draw_buffers_blend) GLEW_ARB_draw_buffers_blend = !_glewInit_GL_ARB_draw_buffers_blend(); #endif /* GL_ARB_draw_buffers_blend */ #ifdef GL_ARB_draw_elements_base_vertex if (glewExperimental || GLEW_ARB_draw_elements_base_vertex) GLEW_ARB_draw_elements_base_vertex = !_glewInit_GL_ARB_draw_elements_base_vertex(); #endif /* GL_ARB_draw_elements_base_vertex */ #ifdef GL_ARB_draw_indirect if (glewExperimental || GLEW_ARB_draw_indirect) GLEW_ARB_draw_indirect = !_glewInit_GL_ARB_draw_indirect(); #endif /* GL_ARB_draw_indirect */ #ifdef GL_ARB_framebuffer_no_attachments if (glewExperimental || GLEW_ARB_framebuffer_no_attachments) GLEW_ARB_framebuffer_no_attachments = !_glewInit_GL_ARB_framebuffer_no_attachments(); #endif /* GL_ARB_framebuffer_no_attachments */ #ifdef GL_ARB_framebuffer_object if (glewExperimental || GLEW_ARB_framebuffer_object) GLEW_ARB_framebuffer_object = !_glewInit_GL_ARB_framebuffer_object(); #endif /* GL_ARB_framebuffer_object */ #ifdef GL_ARB_geometry_shader4 if (glewExperimental || GLEW_ARB_geometry_shader4) GLEW_ARB_geometry_shader4 = !_glewInit_GL_ARB_geometry_shader4(); #endif /* GL_ARB_geometry_shader4 */ #ifdef GL_ARB_get_program_binary if (glewExperimental || GLEW_ARB_get_program_binary) GLEW_ARB_get_program_binary = !_glewInit_GL_ARB_get_program_binary(); #endif /* GL_ARB_get_program_binary */ #ifdef GL_ARB_get_texture_sub_image if (glewExperimental || GLEW_ARB_get_texture_sub_image) GLEW_ARB_get_texture_sub_image = !_glewInit_GL_ARB_get_texture_sub_image(); #endif /* GL_ARB_get_texture_sub_image */ #ifdef GL_ARB_gl_spirv if (glewExperimental || GLEW_ARB_gl_spirv) GLEW_ARB_gl_spirv = !_glewInit_GL_ARB_gl_spirv(); #endif /* GL_ARB_gl_spirv */ #ifdef GL_ARB_gpu_shader_fp64 if (glewExperimental || GLEW_ARB_gpu_shader_fp64) GLEW_ARB_gpu_shader_fp64 = !_glewInit_GL_ARB_gpu_shader_fp64(); #endif /* GL_ARB_gpu_shader_fp64 */ #ifdef GL_ARB_gpu_shader_int64 if (glewExperimental || GLEW_ARB_gpu_shader_int64) GLEW_ARB_gpu_shader_int64 = !_glewInit_GL_ARB_gpu_shader_int64(); #endif /* GL_ARB_gpu_shader_int64 */ #ifdef GL_ARB_imaging if (glewExperimental || GLEW_ARB_imaging) GLEW_ARB_imaging = !_glewInit_GL_ARB_imaging(); #endif /* GL_ARB_imaging */ #ifdef GL_ARB_indirect_parameters if (glewExperimental || GLEW_ARB_indirect_parameters) GLEW_ARB_indirect_parameters = !_glewInit_GL_ARB_indirect_parameters(); #endif /* GL_ARB_indirect_parameters */ #ifdef GL_ARB_instanced_arrays if (glewExperimental || GLEW_ARB_instanced_arrays) GLEW_ARB_instanced_arrays = !_glewInit_GL_ARB_instanced_arrays(); #endif /* GL_ARB_instanced_arrays */ #ifdef GL_ARB_internalformat_query if (glewExperimental || GLEW_ARB_internalformat_query) GLEW_ARB_internalformat_query = !_glewInit_GL_ARB_internalformat_query(); #endif /* GL_ARB_internalformat_query */ #ifdef GL_ARB_internalformat_query2 if (glewExperimental || GLEW_ARB_internalformat_query2) GLEW_ARB_internalformat_query2 = !_glewInit_GL_ARB_internalformat_query2(); #endif /* GL_ARB_internalformat_query2 */ #ifdef GL_ARB_invalidate_subdata if (glewExperimental || GLEW_ARB_invalidate_subdata) GLEW_ARB_invalidate_subdata = !_glewInit_GL_ARB_invalidate_subdata(); #endif /* GL_ARB_invalidate_subdata */ #ifdef GL_ARB_map_buffer_range if (glewExperimental || GLEW_ARB_map_buffer_range) GLEW_ARB_map_buffer_range = !_glewInit_GL_ARB_map_buffer_range(); #endif /* GL_ARB_map_buffer_range */ #ifdef GL_ARB_matrix_palette if (glewExperimental || GLEW_ARB_matrix_palette) GLEW_ARB_matrix_palette = !_glewInit_GL_ARB_matrix_palette(); #endif /* GL_ARB_matrix_palette */ #ifdef GL_ARB_multi_bind if (glewExperimental || GLEW_ARB_multi_bind) GLEW_ARB_multi_bind = !_glewInit_GL_ARB_multi_bind(); #endif /* GL_ARB_multi_bind */ #ifdef GL_ARB_multi_draw_indirect if (glewExperimental || GLEW_ARB_multi_draw_indirect) GLEW_ARB_multi_draw_indirect = !_glewInit_GL_ARB_multi_draw_indirect(); #endif /* GL_ARB_multi_draw_indirect */ #ifdef GL_ARB_multisample if (glewExperimental || GLEW_ARB_multisample) GLEW_ARB_multisample = !_glewInit_GL_ARB_multisample(); #endif /* GL_ARB_multisample */ #ifdef GL_ARB_multitexture if (glewExperimental || GLEW_ARB_multitexture) GLEW_ARB_multitexture = !_glewInit_GL_ARB_multitexture(); #endif /* GL_ARB_multitexture */ #ifdef GL_ARB_occlusion_query if (glewExperimental || GLEW_ARB_occlusion_query) GLEW_ARB_occlusion_query = !_glewInit_GL_ARB_occlusion_query(); #endif /* GL_ARB_occlusion_query */ #ifdef GL_ARB_parallel_shader_compile if (glewExperimental || GLEW_ARB_parallel_shader_compile) GLEW_ARB_parallel_shader_compile = !_glewInit_GL_ARB_parallel_shader_compile(); #endif /* GL_ARB_parallel_shader_compile */ #ifdef GL_ARB_point_parameters if (glewExperimental || GLEW_ARB_point_parameters) GLEW_ARB_point_parameters = !_glewInit_GL_ARB_point_parameters(); #endif /* GL_ARB_point_parameters */ #ifdef GL_ARB_polygon_offset_clamp if (glewExperimental || GLEW_ARB_polygon_offset_clamp) GLEW_ARB_polygon_offset_clamp = !_glewInit_GL_ARB_polygon_offset_clamp(); #endif /* GL_ARB_polygon_offset_clamp */ #ifdef GL_ARB_program_interface_query if (glewExperimental || GLEW_ARB_program_interface_query) GLEW_ARB_program_interface_query = !_glewInit_GL_ARB_program_interface_query(); #endif /* GL_ARB_program_interface_query */ #ifdef GL_ARB_provoking_vertex if (glewExperimental || GLEW_ARB_provoking_vertex) GLEW_ARB_provoking_vertex = !_glewInit_GL_ARB_provoking_vertex(); #endif /* GL_ARB_provoking_vertex */ #ifdef GL_ARB_robustness if (glewExperimental || GLEW_ARB_robustness) GLEW_ARB_robustness = !_glewInit_GL_ARB_robustness(); #endif /* GL_ARB_robustness */ #ifdef GL_ARB_sample_locations if (glewExperimental || GLEW_ARB_sample_locations) GLEW_ARB_sample_locations = !_glewInit_GL_ARB_sample_locations(); #endif /* GL_ARB_sample_locations */ #ifdef GL_ARB_sample_shading if (glewExperimental || GLEW_ARB_sample_shading) GLEW_ARB_sample_shading = !_glewInit_GL_ARB_sample_shading(); #endif /* GL_ARB_sample_shading */ #ifdef GL_ARB_sampler_objects if (glewExperimental || GLEW_ARB_sampler_objects) GLEW_ARB_sampler_objects = !_glewInit_GL_ARB_sampler_objects(); #endif /* GL_ARB_sampler_objects */ #ifdef GL_ARB_separate_shader_objects if (glewExperimental || GLEW_ARB_separate_shader_objects) GLEW_ARB_separate_shader_objects = !_glewInit_GL_ARB_separate_shader_objects(); #endif /* GL_ARB_separate_shader_objects */ #ifdef GL_ARB_shader_atomic_counters if (glewExperimental || GLEW_ARB_shader_atomic_counters) GLEW_ARB_shader_atomic_counters = !_glewInit_GL_ARB_shader_atomic_counters(); #endif /* GL_ARB_shader_atomic_counters */ #ifdef GL_ARB_shader_image_load_store if (glewExperimental || GLEW_ARB_shader_image_load_store) GLEW_ARB_shader_image_load_store = !_glewInit_GL_ARB_shader_image_load_store(); #endif /* GL_ARB_shader_image_load_store */ #ifdef GL_ARB_shader_objects if (glewExperimental || GLEW_ARB_shader_objects) GLEW_ARB_shader_objects = !_glewInit_GL_ARB_shader_objects(); #endif /* GL_ARB_shader_objects */ #ifdef GL_ARB_shader_storage_buffer_object if (glewExperimental || GLEW_ARB_shader_storage_buffer_object) GLEW_ARB_shader_storage_buffer_object = !_glewInit_GL_ARB_shader_storage_buffer_object(); #endif /* GL_ARB_shader_storage_buffer_object */ #ifdef GL_ARB_shader_subroutine if (glewExperimental || GLEW_ARB_shader_subroutine) GLEW_ARB_shader_subroutine = !_glewInit_GL_ARB_shader_subroutine(); #endif /* GL_ARB_shader_subroutine */ #ifdef GL_ARB_shading_language_include if (glewExperimental || GLEW_ARB_shading_language_include) GLEW_ARB_shading_language_include = !_glewInit_GL_ARB_shading_language_include(); #endif /* GL_ARB_shading_language_include */ #ifdef GL_ARB_sparse_buffer if (glewExperimental || GLEW_ARB_sparse_buffer) GLEW_ARB_sparse_buffer = !_glewInit_GL_ARB_sparse_buffer(); #endif /* GL_ARB_sparse_buffer */ #ifdef GL_ARB_sparse_texture if (glewExperimental || GLEW_ARB_sparse_texture) GLEW_ARB_sparse_texture = !_glewInit_GL_ARB_sparse_texture(); #endif /* GL_ARB_sparse_texture */ #ifdef GL_ARB_sync if (glewExperimental || GLEW_ARB_sync) GLEW_ARB_sync = !_glewInit_GL_ARB_sync(); #endif /* GL_ARB_sync */ #ifdef GL_ARB_tessellation_shader if (glewExperimental || GLEW_ARB_tessellation_shader) GLEW_ARB_tessellation_shader = !_glewInit_GL_ARB_tessellation_shader(); #endif /* GL_ARB_tessellation_shader */ #ifdef GL_ARB_texture_barrier if (glewExperimental || GLEW_ARB_texture_barrier) GLEW_ARB_texture_barrier = !_glewInit_GL_ARB_texture_barrier(); #endif /* GL_ARB_texture_barrier */ #ifdef GL_ARB_texture_buffer_object if (glewExperimental || GLEW_ARB_texture_buffer_object) GLEW_ARB_texture_buffer_object = !_glewInit_GL_ARB_texture_buffer_object(); #endif /* GL_ARB_texture_buffer_object */ #ifdef GL_ARB_texture_buffer_range if (glewExperimental || GLEW_ARB_texture_buffer_range) GLEW_ARB_texture_buffer_range = !_glewInit_GL_ARB_texture_buffer_range(); #endif /* GL_ARB_texture_buffer_range */ #ifdef GL_ARB_texture_compression if (glewExperimental || GLEW_ARB_texture_compression) GLEW_ARB_texture_compression = !_glewInit_GL_ARB_texture_compression(); #endif /* GL_ARB_texture_compression */ #ifdef GL_ARB_texture_multisample if (glewExperimental || GLEW_ARB_texture_multisample) GLEW_ARB_texture_multisample = !_glewInit_GL_ARB_texture_multisample(); #endif /* GL_ARB_texture_multisample */ #ifdef GL_ARB_texture_storage if (glewExperimental || GLEW_ARB_texture_storage) GLEW_ARB_texture_storage = !_glewInit_GL_ARB_texture_storage(); #endif /* GL_ARB_texture_storage */ #ifdef GL_ARB_texture_storage_multisample if (glewExperimental || GLEW_ARB_texture_storage_multisample) GLEW_ARB_texture_storage_multisample = !_glewInit_GL_ARB_texture_storage_multisample(); #endif /* GL_ARB_texture_storage_multisample */ #ifdef GL_ARB_texture_view if (glewExperimental || GLEW_ARB_texture_view) GLEW_ARB_texture_view = !_glewInit_GL_ARB_texture_view(); #endif /* GL_ARB_texture_view */ #ifdef GL_ARB_timer_query if (glewExperimental || GLEW_ARB_timer_query) GLEW_ARB_timer_query = !_glewInit_GL_ARB_timer_query(); #endif /* GL_ARB_timer_query */ #ifdef GL_ARB_transform_feedback2 if (glewExperimental || GLEW_ARB_transform_feedback2) GLEW_ARB_transform_feedback2 = !_glewInit_GL_ARB_transform_feedback2(); #endif /* GL_ARB_transform_feedback2 */ #ifdef GL_ARB_transform_feedback3 if (glewExperimental || GLEW_ARB_transform_feedback3) GLEW_ARB_transform_feedback3 = !_glewInit_GL_ARB_transform_feedback3(); #endif /* GL_ARB_transform_feedback3 */ #ifdef GL_ARB_transform_feedback_instanced if (glewExperimental || GLEW_ARB_transform_feedback_instanced) GLEW_ARB_transform_feedback_instanced = !_glewInit_GL_ARB_transform_feedback_instanced(); #endif /* GL_ARB_transform_feedback_instanced */ #ifdef GL_ARB_transpose_matrix if (glewExperimental || GLEW_ARB_transpose_matrix) GLEW_ARB_transpose_matrix = !_glewInit_GL_ARB_transpose_matrix(); #endif /* GL_ARB_transpose_matrix */ #ifdef GL_ARB_uniform_buffer_object if (glewExperimental || GLEW_ARB_uniform_buffer_object) GLEW_ARB_uniform_buffer_object = !_glewInit_GL_ARB_uniform_buffer_object(); #endif /* GL_ARB_uniform_buffer_object */ #ifdef GL_ARB_vertex_array_object if (glewExperimental || GLEW_ARB_vertex_array_object) GLEW_ARB_vertex_array_object = !_glewInit_GL_ARB_vertex_array_object(); #endif /* GL_ARB_vertex_array_object */ #ifdef GL_ARB_vertex_attrib_64bit if (glewExperimental || GLEW_ARB_vertex_attrib_64bit) GLEW_ARB_vertex_attrib_64bit = !_glewInit_GL_ARB_vertex_attrib_64bit(); #endif /* GL_ARB_vertex_attrib_64bit */ #ifdef GL_ARB_vertex_attrib_binding if (glewExperimental || GLEW_ARB_vertex_attrib_binding) GLEW_ARB_vertex_attrib_binding = !_glewInit_GL_ARB_vertex_attrib_binding(); #endif /* GL_ARB_vertex_attrib_binding */ #ifdef GL_ARB_vertex_blend if (glewExperimental || GLEW_ARB_vertex_blend) GLEW_ARB_vertex_blend = !_glewInit_GL_ARB_vertex_blend(); #endif /* GL_ARB_vertex_blend */ #ifdef GL_ARB_vertex_buffer_object if (glewExperimental || GLEW_ARB_vertex_buffer_object) GLEW_ARB_vertex_buffer_object = !_glewInit_GL_ARB_vertex_buffer_object(); #endif /* GL_ARB_vertex_buffer_object */ #ifdef GL_ARB_vertex_program if (glewExperimental || GLEW_ARB_vertex_program) GLEW_ARB_vertex_program = !_glewInit_GL_ARB_vertex_program(); #endif /* GL_ARB_vertex_program */ #ifdef GL_ARB_vertex_shader if (glewExperimental || GLEW_ARB_vertex_shader) { GLEW_ARB_vertex_shader = !_glewInit_GL_ARB_vertex_shader(); _glewInit_GL_ARB_vertex_program(); } #endif /* GL_ARB_vertex_shader */ #ifdef GL_ARB_vertex_type_2_10_10_10_rev if (glewExperimental || GLEW_ARB_vertex_type_2_10_10_10_rev) GLEW_ARB_vertex_type_2_10_10_10_rev = !_glewInit_GL_ARB_vertex_type_2_10_10_10_rev(); #endif /* GL_ARB_vertex_type_2_10_10_10_rev */ #ifdef GL_ARB_viewport_array if (glewExperimental || GLEW_ARB_viewport_array) GLEW_ARB_viewport_array = !_glewInit_GL_ARB_viewport_array(); #endif /* GL_ARB_viewport_array */ #ifdef GL_ARB_window_pos if (glewExperimental || GLEW_ARB_window_pos) GLEW_ARB_window_pos = !_glewInit_GL_ARB_window_pos(); #endif /* GL_ARB_window_pos */ #ifdef GL_ATI_draw_buffers if (glewExperimental || GLEW_ATI_draw_buffers) GLEW_ATI_draw_buffers = !_glewInit_GL_ATI_draw_buffers(); #endif /* GL_ATI_draw_buffers */ #ifdef GL_ATI_element_array if (glewExperimental || GLEW_ATI_element_array) GLEW_ATI_element_array = !_glewInit_GL_ATI_element_array(); #endif /* GL_ATI_element_array */ #ifdef GL_ATI_envmap_bumpmap if (glewExperimental || GLEW_ATI_envmap_bumpmap) GLEW_ATI_envmap_bumpmap = !_glewInit_GL_ATI_envmap_bumpmap(); #endif /* GL_ATI_envmap_bumpmap */ #ifdef GL_ATI_fragment_shader if (glewExperimental || GLEW_ATI_fragment_shader) GLEW_ATI_fragment_shader = !_glewInit_GL_ATI_fragment_shader(); #endif /* GL_ATI_fragment_shader */ #ifdef GL_ATI_map_object_buffer if (glewExperimental || GLEW_ATI_map_object_buffer) GLEW_ATI_map_object_buffer = !_glewInit_GL_ATI_map_object_buffer(); #endif /* GL_ATI_map_object_buffer */ #ifdef GL_ATI_pn_triangles if (glewExperimental || GLEW_ATI_pn_triangles) GLEW_ATI_pn_triangles = !_glewInit_GL_ATI_pn_triangles(); #endif /* GL_ATI_pn_triangles */ #ifdef GL_ATI_separate_stencil if (glewExperimental || GLEW_ATI_separate_stencil) GLEW_ATI_separate_stencil = !_glewInit_GL_ATI_separate_stencil(); #endif /* GL_ATI_separate_stencil */ #ifdef GL_ATI_vertex_array_object if (glewExperimental || GLEW_ATI_vertex_array_object) GLEW_ATI_vertex_array_object = !_glewInit_GL_ATI_vertex_array_object(); #endif /* GL_ATI_vertex_array_object */ #ifdef GL_ATI_vertex_attrib_array_object if (glewExperimental || GLEW_ATI_vertex_attrib_array_object) GLEW_ATI_vertex_attrib_array_object = !_glewInit_GL_ATI_vertex_attrib_array_object(); #endif /* GL_ATI_vertex_attrib_array_object */ #ifdef GL_ATI_vertex_streams if (glewExperimental || GLEW_ATI_vertex_streams) GLEW_ATI_vertex_streams = !_glewInit_GL_ATI_vertex_streams(); #endif /* GL_ATI_vertex_streams */ #ifdef GL_EXT_base_instance if (glewExperimental || GLEW_EXT_base_instance) GLEW_EXT_base_instance = !_glewInit_GL_EXT_base_instance(); #endif /* GL_EXT_base_instance */ #ifdef GL_EXT_bindable_uniform if (glewExperimental || GLEW_EXT_bindable_uniform) GLEW_EXT_bindable_uniform = !_glewInit_GL_EXT_bindable_uniform(); #endif /* GL_EXT_bindable_uniform */ #ifdef GL_EXT_blend_color if (glewExperimental || GLEW_EXT_blend_color) GLEW_EXT_blend_color = !_glewInit_GL_EXT_blend_color(); #endif /* GL_EXT_blend_color */ #ifdef GL_EXT_blend_equation_separate if (glewExperimental || GLEW_EXT_blend_equation_separate) GLEW_EXT_blend_equation_separate = !_glewInit_GL_EXT_blend_equation_separate(); #endif /* GL_EXT_blend_equation_separate */ #ifdef GL_EXT_blend_func_extended if (glewExperimental || GLEW_EXT_blend_func_extended) GLEW_EXT_blend_func_extended = !_glewInit_GL_EXT_blend_func_extended(); #endif /* GL_EXT_blend_func_extended */ #ifdef GL_EXT_blend_func_separate if (glewExperimental || GLEW_EXT_blend_func_separate) GLEW_EXT_blend_func_separate = !_glewInit_GL_EXT_blend_func_separate(); #endif /* GL_EXT_blend_func_separate */ #ifdef GL_EXT_blend_minmax if (glewExperimental || GLEW_EXT_blend_minmax) GLEW_EXT_blend_minmax = !_glewInit_GL_EXT_blend_minmax(); #endif /* GL_EXT_blend_minmax */ #ifdef GL_EXT_buffer_storage if (glewExperimental || GLEW_EXT_buffer_storage) GLEW_EXT_buffer_storage = !_glewInit_GL_EXT_buffer_storage(); #endif /* GL_EXT_buffer_storage */ #ifdef GL_EXT_clear_texture if (glewExperimental || GLEW_EXT_clear_texture) GLEW_EXT_clear_texture = !_glewInit_GL_EXT_clear_texture(); #endif /* GL_EXT_clear_texture */ #ifdef GL_EXT_color_subtable if (glewExperimental || GLEW_EXT_color_subtable) GLEW_EXT_color_subtable = !_glewInit_GL_EXT_color_subtable(); #endif /* GL_EXT_color_subtable */ #ifdef GL_EXT_compiled_vertex_array if (glewExperimental || GLEW_EXT_compiled_vertex_array) GLEW_EXT_compiled_vertex_array = !_glewInit_GL_EXT_compiled_vertex_array(); #endif /* GL_EXT_compiled_vertex_array */ #ifdef GL_EXT_convolution if (glewExperimental || GLEW_EXT_convolution) GLEW_EXT_convolution = !_glewInit_GL_EXT_convolution(); #endif /* GL_EXT_convolution */ #ifdef GL_EXT_coordinate_frame if (glewExperimental || GLEW_EXT_coordinate_frame) GLEW_EXT_coordinate_frame = !_glewInit_GL_EXT_coordinate_frame(); #endif /* GL_EXT_coordinate_frame */ #ifdef GL_EXT_copy_image if (glewExperimental || GLEW_EXT_copy_image) GLEW_EXT_copy_image = !_glewInit_GL_EXT_copy_image(); #endif /* GL_EXT_copy_image */ #ifdef GL_EXT_copy_texture if (glewExperimental || GLEW_EXT_copy_texture) GLEW_EXT_copy_texture = !_glewInit_GL_EXT_copy_texture(); #endif /* GL_EXT_copy_texture */ #ifdef GL_EXT_cull_vertex if (glewExperimental || GLEW_EXT_cull_vertex) GLEW_EXT_cull_vertex = !_glewInit_GL_EXT_cull_vertex(); #endif /* GL_EXT_cull_vertex */ #ifdef GL_EXT_debug_label if (glewExperimental || GLEW_EXT_debug_label) GLEW_EXT_debug_label = !_glewInit_GL_EXT_debug_label(); #endif /* GL_EXT_debug_label */ #ifdef GL_EXT_debug_marker if (glewExperimental || GLEW_EXT_debug_marker) GLEW_EXT_debug_marker = !_glewInit_GL_EXT_debug_marker(); #endif /* GL_EXT_debug_marker */ #ifdef GL_EXT_depth_bounds_test if (glewExperimental || GLEW_EXT_depth_bounds_test) GLEW_EXT_depth_bounds_test = !_glewInit_GL_EXT_depth_bounds_test(); #endif /* GL_EXT_depth_bounds_test */ #ifdef GL_EXT_direct_state_access if (glewExperimental || GLEW_EXT_direct_state_access) GLEW_EXT_direct_state_access = !_glewInit_GL_EXT_direct_state_access(); #endif /* GL_EXT_direct_state_access */ #ifdef GL_EXT_discard_framebuffer if (glewExperimental || GLEW_EXT_discard_framebuffer) GLEW_EXT_discard_framebuffer = !_glewInit_GL_EXT_discard_framebuffer(); #endif /* GL_EXT_discard_framebuffer */ #ifdef GL_EXT_draw_buffers if (glewExperimental || GLEW_EXT_draw_buffers) GLEW_EXT_draw_buffers = !_glewInit_GL_EXT_draw_buffers(); #endif /* GL_EXT_draw_buffers */ #ifdef GL_EXT_draw_buffers2 if (glewExperimental || GLEW_EXT_draw_buffers2) GLEW_EXT_draw_buffers2 = !_glewInit_GL_EXT_draw_buffers2(); #endif /* GL_EXT_draw_buffers2 */ #ifdef GL_EXT_draw_buffers_indexed if (glewExperimental || GLEW_EXT_draw_buffers_indexed) GLEW_EXT_draw_buffers_indexed = !_glewInit_GL_EXT_draw_buffers_indexed(); #endif /* GL_EXT_draw_buffers_indexed */ #ifdef GL_EXT_draw_elements_base_vertex if (glewExperimental || GLEW_EXT_draw_elements_base_vertex) GLEW_EXT_draw_elements_base_vertex = !_glewInit_GL_EXT_draw_elements_base_vertex(); #endif /* GL_EXT_draw_elements_base_vertex */ #ifdef GL_EXT_draw_instanced if (glewExperimental || GLEW_EXT_draw_instanced) GLEW_EXT_draw_instanced = !_glewInit_GL_EXT_draw_instanced(); #endif /* GL_EXT_draw_instanced */ #ifdef GL_EXT_draw_range_elements if (glewExperimental || GLEW_EXT_draw_range_elements) GLEW_EXT_draw_range_elements = !_glewInit_GL_EXT_draw_range_elements(); #endif /* GL_EXT_draw_range_elements */ #ifdef GL_EXT_external_buffer if (glewExperimental || GLEW_EXT_external_buffer) GLEW_EXT_external_buffer = !_glewInit_GL_EXT_external_buffer(); #endif /* GL_EXT_external_buffer */ #ifdef GL_EXT_fog_coord if (glewExperimental || GLEW_EXT_fog_coord) GLEW_EXT_fog_coord = !_glewInit_GL_EXT_fog_coord(); #endif /* GL_EXT_fog_coord */ #ifdef GL_EXT_fragment_lighting if (glewExperimental || GLEW_EXT_fragment_lighting) GLEW_EXT_fragment_lighting = !_glewInit_GL_EXT_fragment_lighting(); #endif /* GL_EXT_fragment_lighting */ #ifdef GL_EXT_framebuffer_blit if (glewExperimental || GLEW_EXT_framebuffer_blit) GLEW_EXT_framebuffer_blit = !_glewInit_GL_EXT_framebuffer_blit(); #endif /* GL_EXT_framebuffer_blit */ #ifdef GL_EXT_framebuffer_multisample if (glewExperimental || GLEW_EXT_framebuffer_multisample) GLEW_EXT_framebuffer_multisample = !_glewInit_GL_EXT_framebuffer_multisample(); #endif /* GL_EXT_framebuffer_multisample */ #ifdef GL_EXT_framebuffer_object if (glewExperimental || GLEW_EXT_framebuffer_object) GLEW_EXT_framebuffer_object = !_glewInit_GL_EXT_framebuffer_object(); #endif /* GL_EXT_framebuffer_object */ #ifdef GL_EXT_geometry_shader4 if (glewExperimental || GLEW_EXT_geometry_shader4) GLEW_EXT_geometry_shader4 = !_glewInit_GL_EXT_geometry_shader4(); #endif /* GL_EXT_geometry_shader4 */ #ifdef GL_EXT_gpu_program_parameters if (glewExperimental || GLEW_EXT_gpu_program_parameters) GLEW_EXT_gpu_program_parameters = !_glewInit_GL_EXT_gpu_program_parameters(); #endif /* GL_EXT_gpu_program_parameters */ #ifdef GL_EXT_gpu_shader4 if (glewExperimental || GLEW_EXT_gpu_shader4) GLEW_EXT_gpu_shader4 = !_glewInit_GL_EXT_gpu_shader4(); #endif /* GL_EXT_gpu_shader4 */ #ifdef GL_EXT_histogram if (glewExperimental || GLEW_EXT_histogram) GLEW_EXT_histogram = !_glewInit_GL_EXT_histogram(); #endif /* GL_EXT_histogram */ #ifdef GL_EXT_index_func if (glewExperimental || GLEW_EXT_index_func) GLEW_EXT_index_func = !_glewInit_GL_EXT_index_func(); #endif /* GL_EXT_index_func */ #ifdef GL_EXT_index_material if (glewExperimental || GLEW_EXT_index_material) GLEW_EXT_index_material = !_glewInit_GL_EXT_index_material(); #endif /* GL_EXT_index_material */ #ifdef GL_EXT_instanced_arrays if (glewExperimental || GLEW_EXT_instanced_arrays) GLEW_EXT_instanced_arrays = !_glewInit_GL_EXT_instanced_arrays(); #endif /* GL_EXT_instanced_arrays */ #ifdef GL_EXT_light_texture if (glewExperimental || GLEW_EXT_light_texture) GLEW_EXT_light_texture = !_glewInit_GL_EXT_light_texture(); #endif /* GL_EXT_light_texture */ #ifdef GL_EXT_map_buffer_range if (glewExperimental || GLEW_EXT_map_buffer_range) GLEW_EXT_map_buffer_range = !_glewInit_GL_EXT_map_buffer_range(); #endif /* GL_EXT_map_buffer_range */ #ifdef GL_EXT_memory_object if (glewExperimental || GLEW_EXT_memory_object) GLEW_EXT_memory_object = !_glewInit_GL_EXT_memory_object(); #endif /* GL_EXT_memory_object */ #ifdef GL_EXT_memory_object_fd if (glewExperimental || GLEW_EXT_memory_object_fd) GLEW_EXT_memory_object_fd = !_glewInit_GL_EXT_memory_object_fd(); #endif /* GL_EXT_memory_object_fd */ #ifdef GL_EXT_memory_object_win32 if (glewExperimental || GLEW_EXT_memory_object_win32) GLEW_EXT_memory_object_win32 = !_glewInit_GL_EXT_memory_object_win32(); #endif /* GL_EXT_memory_object_win32 */ #ifdef GL_EXT_multi_draw_arrays if (glewExperimental || GLEW_EXT_multi_draw_arrays) GLEW_EXT_multi_draw_arrays = !_glewInit_GL_EXT_multi_draw_arrays(); #endif /* GL_EXT_multi_draw_arrays */ #ifdef GL_EXT_multi_draw_indirect if (glewExperimental || GLEW_EXT_multi_draw_indirect) GLEW_EXT_multi_draw_indirect = !_glewInit_GL_EXT_multi_draw_indirect(); #endif /* GL_EXT_multi_draw_indirect */ #ifdef GL_EXT_multisample if (glewExperimental || GLEW_EXT_multisample) GLEW_EXT_multisample = !_glewInit_GL_EXT_multisample(); #endif /* GL_EXT_multisample */ #ifdef GL_EXT_multisampled_render_to_texture if (glewExperimental || GLEW_EXT_multisampled_render_to_texture) GLEW_EXT_multisampled_render_to_texture = !_glewInit_GL_EXT_multisampled_render_to_texture(); #endif /* GL_EXT_multisampled_render_to_texture */ #ifdef GL_EXT_multiview_draw_buffers if (glewExperimental || GLEW_EXT_multiview_draw_buffers) GLEW_EXT_multiview_draw_buffers = !_glewInit_GL_EXT_multiview_draw_buffers(); #endif /* GL_EXT_multiview_draw_buffers */ #ifdef GL_EXT_paletted_texture if (glewExperimental || GLEW_EXT_paletted_texture) GLEW_EXT_paletted_texture = !_glewInit_GL_EXT_paletted_texture(); #endif /* GL_EXT_paletted_texture */ #ifdef GL_EXT_pixel_transform if (glewExperimental || GLEW_EXT_pixel_transform) GLEW_EXT_pixel_transform = !_glewInit_GL_EXT_pixel_transform(); #endif /* GL_EXT_pixel_transform */ #ifdef GL_EXT_point_parameters if (glewExperimental || GLEW_EXT_point_parameters) GLEW_EXT_point_parameters = !_glewInit_GL_EXT_point_parameters(); #endif /* GL_EXT_point_parameters */ #ifdef GL_EXT_polygon_offset if (glewExperimental || GLEW_EXT_polygon_offset) GLEW_EXT_polygon_offset = !_glewInit_GL_EXT_polygon_offset(); #endif /* GL_EXT_polygon_offset */ #ifdef GL_EXT_polygon_offset_clamp if (glewExperimental || GLEW_EXT_polygon_offset_clamp) GLEW_EXT_polygon_offset_clamp = !_glewInit_GL_EXT_polygon_offset_clamp(); #endif /* GL_EXT_polygon_offset_clamp */ #ifdef GL_EXT_provoking_vertex if (glewExperimental || GLEW_EXT_provoking_vertex) GLEW_EXT_provoking_vertex = !_glewInit_GL_EXT_provoking_vertex(); #endif /* GL_EXT_provoking_vertex */ #ifdef GL_EXT_raster_multisample if (glewExperimental || GLEW_EXT_raster_multisample) GLEW_EXT_raster_multisample = !_glewInit_GL_EXT_raster_multisample(); #endif /* GL_EXT_raster_multisample */ #ifdef GL_EXT_scene_marker if (glewExperimental || GLEW_EXT_scene_marker) GLEW_EXT_scene_marker = !_glewInit_GL_EXT_scene_marker(); #endif /* GL_EXT_scene_marker */ #ifdef GL_EXT_secondary_color if (glewExperimental || GLEW_EXT_secondary_color) GLEW_EXT_secondary_color = !_glewInit_GL_EXT_secondary_color(); #endif /* GL_EXT_secondary_color */ #ifdef GL_EXT_semaphore if (glewExperimental || GLEW_EXT_semaphore) GLEW_EXT_semaphore = !_glewInit_GL_EXT_semaphore(); #endif /* GL_EXT_semaphore */ #ifdef GL_EXT_semaphore_fd if (glewExperimental || GLEW_EXT_semaphore_fd) GLEW_EXT_semaphore_fd = !_glewInit_GL_EXT_semaphore_fd(); #endif /* GL_EXT_semaphore_fd */ #ifdef GL_EXT_semaphore_win32 if (glewExperimental || GLEW_EXT_semaphore_win32) GLEW_EXT_semaphore_win32 = !_glewInit_GL_EXT_semaphore_win32(); #endif /* GL_EXT_semaphore_win32 */ #ifdef GL_EXT_separate_shader_objects if (glewExperimental || GLEW_EXT_separate_shader_objects) GLEW_EXT_separate_shader_objects = !_glewInit_GL_EXT_separate_shader_objects(); #endif /* GL_EXT_separate_shader_objects */ #ifdef GL_EXT_shader_image_load_store if (glewExperimental || GLEW_EXT_shader_image_load_store) GLEW_EXT_shader_image_load_store = !_glewInit_GL_EXT_shader_image_load_store(); #endif /* GL_EXT_shader_image_load_store */ #ifdef GL_EXT_shader_pixel_local_storage2 if (glewExperimental || GLEW_EXT_shader_pixel_local_storage2) GLEW_EXT_shader_pixel_local_storage2 = !_glewInit_GL_EXT_shader_pixel_local_storage2(); #endif /* GL_EXT_shader_pixel_local_storage2 */ #ifdef GL_EXT_sparse_texture if (glewExperimental || GLEW_EXT_sparse_texture) GLEW_EXT_sparse_texture = !_glewInit_GL_EXT_sparse_texture(); #endif /* GL_EXT_sparse_texture */ #ifdef GL_EXT_stencil_two_side if (glewExperimental || GLEW_EXT_stencil_two_side) GLEW_EXT_stencil_two_side = !_glewInit_GL_EXT_stencil_two_side(); #endif /* GL_EXT_stencil_two_side */ #ifdef GL_EXT_subtexture if (glewExperimental || GLEW_EXT_subtexture) GLEW_EXT_subtexture = !_glewInit_GL_EXT_subtexture(); #endif /* GL_EXT_subtexture */ #ifdef GL_EXT_texture3D if (glewExperimental || GLEW_EXT_texture3D) GLEW_EXT_texture3D = !_glewInit_GL_EXT_texture3D(); #endif /* GL_EXT_texture3D */ #ifdef GL_EXT_texture_array if (glewExperimental || GLEW_EXT_texture_array) GLEW_EXT_texture_array = !_glewInit_GL_EXT_texture_array(); #endif /* GL_EXT_texture_array */ #ifdef GL_EXT_texture_buffer_object if (glewExperimental || GLEW_EXT_texture_buffer_object) GLEW_EXT_texture_buffer_object = !_glewInit_GL_EXT_texture_buffer_object(); #endif /* GL_EXT_texture_buffer_object */ #ifdef GL_EXT_texture_integer if (glewExperimental || GLEW_EXT_texture_integer) GLEW_EXT_texture_integer = !_glewInit_GL_EXT_texture_integer(); #endif /* GL_EXT_texture_integer */ #ifdef GL_EXT_texture_object if (glewExperimental || GLEW_EXT_texture_object) GLEW_EXT_texture_object = !_glewInit_GL_EXT_texture_object(); #endif /* GL_EXT_texture_object */ #ifdef GL_EXT_texture_perturb_normal if (glewExperimental || GLEW_EXT_texture_perturb_normal) GLEW_EXT_texture_perturb_normal = !_glewInit_GL_EXT_texture_perturb_normal(); #endif /* GL_EXT_texture_perturb_normal */ #ifdef GL_EXT_texture_storage if (glewExperimental || GLEW_EXT_texture_storage) GLEW_EXT_texture_storage = !_glewInit_GL_EXT_texture_storage(); #endif /* GL_EXT_texture_storage */ #ifdef GL_EXT_texture_view if (glewExperimental || GLEW_EXT_texture_view) GLEW_EXT_texture_view = !_glewInit_GL_EXT_texture_view(); #endif /* GL_EXT_texture_view */ #ifdef GL_EXT_timer_query if (glewExperimental || GLEW_EXT_timer_query) GLEW_EXT_timer_query = !_glewInit_GL_EXT_timer_query(); #endif /* GL_EXT_timer_query */ #ifdef GL_EXT_transform_feedback if (glewExperimental || GLEW_EXT_transform_feedback) GLEW_EXT_transform_feedback = !_glewInit_GL_EXT_transform_feedback(); #endif /* GL_EXT_transform_feedback */ #ifdef GL_EXT_vertex_array if (glewExperimental || GLEW_EXT_vertex_array) GLEW_EXT_vertex_array = !_glewInit_GL_EXT_vertex_array(); #endif /* GL_EXT_vertex_array */ #ifdef GL_EXT_vertex_array_setXXX if (glewExperimental || GLEW_EXT_vertex_array_setXXX) GLEW_EXT_vertex_array_setXXX = !_glewInit_GL_EXT_vertex_array_setXXX(); #endif /* GL_EXT_vertex_array_setXXX */ #ifdef GL_EXT_vertex_attrib_64bit if (glewExperimental || GLEW_EXT_vertex_attrib_64bit) GLEW_EXT_vertex_attrib_64bit = !_glewInit_GL_EXT_vertex_attrib_64bit(); #endif /* GL_EXT_vertex_attrib_64bit */ #ifdef GL_EXT_vertex_shader if (glewExperimental || GLEW_EXT_vertex_shader) GLEW_EXT_vertex_shader = !_glewInit_GL_EXT_vertex_shader(); #endif /* GL_EXT_vertex_shader */ #ifdef GL_EXT_vertex_weighting if (glewExperimental || GLEW_EXT_vertex_weighting) GLEW_EXT_vertex_weighting = !_glewInit_GL_EXT_vertex_weighting(); #endif /* GL_EXT_vertex_weighting */ #ifdef GL_EXT_win32_keyed_mutex if (glewExperimental || GLEW_EXT_win32_keyed_mutex) GLEW_EXT_win32_keyed_mutex = !_glewInit_GL_EXT_win32_keyed_mutex(); #endif /* GL_EXT_win32_keyed_mutex */ #ifdef GL_EXT_window_rectangles if (glewExperimental || GLEW_EXT_window_rectangles) GLEW_EXT_window_rectangles = !_glewInit_GL_EXT_window_rectangles(); #endif /* GL_EXT_window_rectangles */ #ifdef GL_EXT_x11_sync_object if (glewExperimental || GLEW_EXT_x11_sync_object) GLEW_EXT_x11_sync_object = !_glewInit_GL_EXT_x11_sync_object(); #endif /* GL_EXT_x11_sync_object */ #ifdef GL_GREMEDY_frame_terminator if (glewExperimental || GLEW_GREMEDY_frame_terminator) GLEW_GREMEDY_frame_terminator = !_glewInit_GL_GREMEDY_frame_terminator(); #endif /* GL_GREMEDY_frame_terminator */ #ifdef GL_GREMEDY_string_marker if (glewExperimental || GLEW_GREMEDY_string_marker) GLEW_GREMEDY_string_marker = !_glewInit_GL_GREMEDY_string_marker(); #endif /* GL_GREMEDY_string_marker */ #ifdef GL_HP_image_transform if (glewExperimental || GLEW_HP_image_transform) GLEW_HP_image_transform = !_glewInit_GL_HP_image_transform(); #endif /* GL_HP_image_transform */ #ifdef GL_IBM_multimode_draw_arrays if (glewExperimental || GLEW_IBM_multimode_draw_arrays) GLEW_IBM_multimode_draw_arrays = !_glewInit_GL_IBM_multimode_draw_arrays(); #endif /* GL_IBM_multimode_draw_arrays */ #ifdef GL_IBM_vertex_array_lists if (glewExperimental || GLEW_IBM_vertex_array_lists) GLEW_IBM_vertex_array_lists = !_glewInit_GL_IBM_vertex_array_lists(); #endif /* GL_IBM_vertex_array_lists */ #ifdef GL_INTEL_map_texture if (glewExperimental || GLEW_INTEL_map_texture) GLEW_INTEL_map_texture = !_glewInit_GL_INTEL_map_texture(); #endif /* GL_INTEL_map_texture */ #ifdef GL_INTEL_parallel_arrays if (glewExperimental || GLEW_INTEL_parallel_arrays) GLEW_INTEL_parallel_arrays = !_glewInit_GL_INTEL_parallel_arrays(); #endif /* GL_INTEL_parallel_arrays */ #ifdef GL_INTEL_performance_query if (glewExperimental || GLEW_INTEL_performance_query) GLEW_INTEL_performance_query = !_glewInit_GL_INTEL_performance_query(); #endif /* GL_INTEL_performance_query */ #ifdef GL_INTEL_texture_scissor if (glewExperimental || GLEW_INTEL_texture_scissor) GLEW_INTEL_texture_scissor = !_glewInit_GL_INTEL_texture_scissor(); #endif /* GL_INTEL_texture_scissor */ #ifdef GL_KHR_blend_equation_advanced if (glewExperimental || GLEW_KHR_blend_equation_advanced) GLEW_KHR_blend_equation_advanced = !_glewInit_GL_KHR_blend_equation_advanced(); #endif /* GL_KHR_blend_equation_advanced */ #ifdef GL_KHR_debug if (glewExperimental || GLEW_KHR_debug) GLEW_KHR_debug = !_glewInit_GL_KHR_debug(); #endif /* GL_KHR_debug */ #ifdef GL_KHR_parallel_shader_compile if (glewExperimental || GLEW_KHR_parallel_shader_compile) GLEW_KHR_parallel_shader_compile = !_glewInit_GL_KHR_parallel_shader_compile(); #endif /* GL_KHR_parallel_shader_compile */ #ifdef GL_KHR_robustness if (glewExperimental || GLEW_KHR_robustness) GLEW_KHR_robustness = !_glewInit_GL_KHR_robustness(); #endif /* GL_KHR_robustness */ #ifdef GL_KTX_buffer_region if (glewExperimental || GLEW_KTX_buffer_region) GLEW_KTX_buffer_region = !_glewInit_GL_KTX_buffer_region(); #endif /* GL_KTX_buffer_region */ #ifdef GL_MESA_resize_buffers if (glewExperimental || GLEW_MESA_resize_buffers) GLEW_MESA_resize_buffers = !_glewInit_GL_MESA_resize_buffers(); #endif /* GL_MESA_resize_buffers */ #ifdef GL_MESA_window_pos if (glewExperimental || GLEW_MESA_window_pos) GLEW_MESA_window_pos = !_glewInit_GL_MESA_window_pos(); #endif /* GL_MESA_window_pos */ #ifdef GL_NVX_conditional_render if (glewExperimental || GLEW_NVX_conditional_render) GLEW_NVX_conditional_render = !_glewInit_GL_NVX_conditional_render(); #endif /* GL_NVX_conditional_render */ #ifdef GL_NVX_linked_gpu_multicast if (glewExperimental || GLEW_NVX_linked_gpu_multicast) GLEW_NVX_linked_gpu_multicast = !_glewInit_GL_NVX_linked_gpu_multicast(); #endif /* GL_NVX_linked_gpu_multicast */ #ifdef GL_NV_3dvision_settings if (glewExperimental || GLEW_NV_3dvision_settings) GLEW_NV_3dvision_settings = !_glewInit_GL_NV_3dvision_settings(); #endif /* GL_NV_3dvision_settings */ #ifdef GL_NV_bindless_multi_draw_indirect if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect) GLEW_NV_bindless_multi_draw_indirect = !_glewInit_GL_NV_bindless_multi_draw_indirect(); #endif /* GL_NV_bindless_multi_draw_indirect */ #ifdef GL_NV_bindless_multi_draw_indirect_count if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect_count) GLEW_NV_bindless_multi_draw_indirect_count = !_glewInit_GL_NV_bindless_multi_draw_indirect_count(); #endif /* GL_NV_bindless_multi_draw_indirect_count */ #ifdef GL_NV_bindless_texture if (glewExperimental || GLEW_NV_bindless_texture) GLEW_NV_bindless_texture = !_glewInit_GL_NV_bindless_texture(); #endif /* GL_NV_bindless_texture */ #ifdef GL_NV_blend_equation_advanced if (glewExperimental || GLEW_NV_blend_equation_advanced) GLEW_NV_blend_equation_advanced = !_glewInit_GL_NV_blend_equation_advanced(); #endif /* GL_NV_blend_equation_advanced */ #ifdef GL_NV_clip_space_w_scaling if (glewExperimental || GLEW_NV_clip_space_w_scaling) GLEW_NV_clip_space_w_scaling = !_glewInit_GL_NV_clip_space_w_scaling(); #endif /* GL_NV_clip_space_w_scaling */ #ifdef GL_NV_command_list if (glewExperimental || GLEW_NV_command_list) GLEW_NV_command_list = !_glewInit_GL_NV_command_list(); #endif /* GL_NV_command_list */ #ifdef GL_NV_conditional_render if (glewExperimental || GLEW_NV_conditional_render) GLEW_NV_conditional_render = !_glewInit_GL_NV_conditional_render(); #endif /* GL_NV_conditional_render */ #ifdef GL_NV_conservative_raster if (glewExperimental || GLEW_NV_conservative_raster) GLEW_NV_conservative_raster = !_glewInit_GL_NV_conservative_raster(); #endif /* GL_NV_conservative_raster */ #ifdef GL_NV_conservative_raster_dilate if (glewExperimental || GLEW_NV_conservative_raster_dilate) GLEW_NV_conservative_raster_dilate = !_glewInit_GL_NV_conservative_raster_dilate(); #endif /* GL_NV_conservative_raster_dilate */ #ifdef GL_NV_conservative_raster_pre_snap_triangles if (glewExperimental || GLEW_NV_conservative_raster_pre_snap_triangles) GLEW_NV_conservative_raster_pre_snap_triangles = !_glewInit_GL_NV_conservative_raster_pre_snap_triangles(); #endif /* GL_NV_conservative_raster_pre_snap_triangles */ #ifdef GL_NV_copy_buffer if (glewExperimental || GLEW_NV_copy_buffer) GLEW_NV_copy_buffer = !_glewInit_GL_NV_copy_buffer(); #endif /* GL_NV_copy_buffer */ #ifdef GL_NV_copy_image if (glewExperimental || GLEW_NV_copy_image) GLEW_NV_copy_image = !_glewInit_GL_NV_copy_image(); #endif /* GL_NV_copy_image */ #ifdef GL_NV_depth_buffer_float if (glewExperimental || GLEW_NV_depth_buffer_float) GLEW_NV_depth_buffer_float = !_glewInit_GL_NV_depth_buffer_float(); #endif /* GL_NV_depth_buffer_float */ #ifdef GL_NV_draw_buffers if (glewExperimental || GLEW_NV_draw_buffers) GLEW_NV_draw_buffers = !_glewInit_GL_NV_draw_buffers(); #endif /* GL_NV_draw_buffers */ #ifdef GL_NV_draw_instanced if (glewExperimental || GLEW_NV_draw_instanced) GLEW_NV_draw_instanced = !_glewInit_GL_NV_draw_instanced(); #endif /* GL_NV_draw_instanced */ #ifdef GL_NV_draw_texture if (glewExperimental || GLEW_NV_draw_texture) GLEW_NV_draw_texture = !_glewInit_GL_NV_draw_texture(); #endif /* GL_NV_draw_texture */ #ifdef GL_NV_draw_vulkan_image if (glewExperimental || GLEW_NV_draw_vulkan_image) GLEW_NV_draw_vulkan_image = !_glewInit_GL_NV_draw_vulkan_image(); #endif /* GL_NV_draw_vulkan_image */ #ifdef GL_NV_evaluators if (glewExperimental || GLEW_NV_evaluators) GLEW_NV_evaluators = !_glewInit_GL_NV_evaluators(); #endif /* GL_NV_evaluators */ #ifdef GL_NV_explicit_multisample if (glewExperimental || GLEW_NV_explicit_multisample) GLEW_NV_explicit_multisample = !_glewInit_GL_NV_explicit_multisample(); #endif /* GL_NV_explicit_multisample */ #ifdef GL_NV_fence if (glewExperimental || GLEW_NV_fence) GLEW_NV_fence = !_glewInit_GL_NV_fence(); #endif /* GL_NV_fence */ #ifdef GL_NV_fragment_coverage_to_color if (glewExperimental || GLEW_NV_fragment_coverage_to_color) GLEW_NV_fragment_coverage_to_color = !_glewInit_GL_NV_fragment_coverage_to_color(); #endif /* GL_NV_fragment_coverage_to_color */ #ifdef GL_NV_fragment_program if (glewExperimental || GLEW_NV_fragment_program) GLEW_NV_fragment_program = !_glewInit_GL_NV_fragment_program(); #endif /* GL_NV_fragment_program */ #ifdef GL_NV_framebuffer_blit if (glewExperimental || GLEW_NV_framebuffer_blit) GLEW_NV_framebuffer_blit = !_glewInit_GL_NV_framebuffer_blit(); #endif /* GL_NV_framebuffer_blit */ #ifdef GL_NV_framebuffer_multisample if (glewExperimental || GLEW_NV_framebuffer_multisample) GLEW_NV_framebuffer_multisample = !_glewInit_GL_NV_framebuffer_multisample(); #endif /* GL_NV_framebuffer_multisample */ #ifdef GL_NV_framebuffer_multisample_coverage if (glewExperimental || GLEW_NV_framebuffer_multisample_coverage) GLEW_NV_framebuffer_multisample_coverage = !_glewInit_GL_NV_framebuffer_multisample_coverage(); #endif /* GL_NV_framebuffer_multisample_coverage */ #ifdef GL_NV_geometry_program4 if (glewExperimental || GLEW_NV_geometry_program4) GLEW_NV_geometry_program4 = !_glewInit_GL_NV_geometry_program4(); #endif /* GL_NV_geometry_program4 */ #ifdef GL_NV_gpu_multicast if (glewExperimental || GLEW_NV_gpu_multicast) GLEW_NV_gpu_multicast = !_glewInit_GL_NV_gpu_multicast(); #endif /* GL_NV_gpu_multicast */ #ifdef GL_NV_gpu_program4 if (glewExperimental || GLEW_NV_gpu_program4) GLEW_NV_gpu_program4 = !_glewInit_GL_NV_gpu_program4(); #endif /* GL_NV_gpu_program4 */ #ifdef GL_NV_gpu_shader5 if (glewExperimental || GLEW_NV_gpu_shader5) GLEW_NV_gpu_shader5 = !_glewInit_GL_NV_gpu_shader5(); #endif /* GL_NV_gpu_shader5 */ #ifdef GL_NV_half_float if (glewExperimental || GLEW_NV_half_float) GLEW_NV_half_float = !_glewInit_GL_NV_half_float(); #endif /* GL_NV_half_float */ #ifdef GL_NV_instanced_arrays if (glewExperimental || GLEW_NV_instanced_arrays) GLEW_NV_instanced_arrays = !_glewInit_GL_NV_instanced_arrays(); #endif /* GL_NV_instanced_arrays */ #ifdef GL_NV_internalformat_sample_query if (glewExperimental || GLEW_NV_internalformat_sample_query) GLEW_NV_internalformat_sample_query = !_glewInit_GL_NV_internalformat_sample_query(); #endif /* GL_NV_internalformat_sample_query */ #ifdef GL_NV_non_square_matrices if (glewExperimental || GLEW_NV_non_square_matrices) GLEW_NV_non_square_matrices = !_glewInit_GL_NV_non_square_matrices(); #endif /* GL_NV_non_square_matrices */ #ifdef GL_NV_occlusion_query if (glewExperimental || GLEW_NV_occlusion_query) GLEW_NV_occlusion_query = !_glewInit_GL_NV_occlusion_query(); #endif /* GL_NV_occlusion_query */ #ifdef GL_NV_parameter_buffer_object if (glewExperimental || GLEW_NV_parameter_buffer_object) GLEW_NV_parameter_buffer_object = !_glewInit_GL_NV_parameter_buffer_object(); #endif /* GL_NV_parameter_buffer_object */ #ifdef GL_NV_path_rendering if (glewExperimental || GLEW_NV_path_rendering) GLEW_NV_path_rendering = !_glewInit_GL_NV_path_rendering(); #endif /* GL_NV_path_rendering */ #ifdef GL_NV_pixel_data_range if (glewExperimental || GLEW_NV_pixel_data_range) GLEW_NV_pixel_data_range = !_glewInit_GL_NV_pixel_data_range(); #endif /* GL_NV_pixel_data_range */ #ifdef GL_NV_point_sprite if (glewExperimental || GLEW_NV_point_sprite) GLEW_NV_point_sprite = !_glewInit_GL_NV_point_sprite(); #endif /* GL_NV_point_sprite */ #ifdef GL_NV_polygon_mode if (glewExperimental || GLEW_NV_polygon_mode) GLEW_NV_polygon_mode = !_glewInit_GL_NV_polygon_mode(); #endif /* GL_NV_polygon_mode */ #ifdef GL_NV_present_video if (glewExperimental || GLEW_NV_present_video) GLEW_NV_present_video = !_glewInit_GL_NV_present_video(); #endif /* GL_NV_present_video */ #ifdef GL_NV_primitive_restart if (glewExperimental || GLEW_NV_primitive_restart) GLEW_NV_primitive_restart = !_glewInit_GL_NV_primitive_restart(); #endif /* GL_NV_primitive_restart */ #ifdef GL_NV_register_combiners if (glewExperimental || GLEW_NV_register_combiners) GLEW_NV_register_combiners = !_glewInit_GL_NV_register_combiners(); #endif /* GL_NV_register_combiners */ #ifdef GL_NV_register_combiners2 if (glewExperimental || GLEW_NV_register_combiners2) GLEW_NV_register_combiners2 = !_glewInit_GL_NV_register_combiners2(); #endif /* GL_NV_register_combiners2 */ #ifdef GL_NV_sample_locations if (glewExperimental || GLEW_NV_sample_locations) GLEW_NV_sample_locations = !_glewInit_GL_NV_sample_locations(); #endif /* GL_NV_sample_locations */ #ifdef GL_NV_shader_buffer_load if (glewExperimental || GLEW_NV_shader_buffer_load) GLEW_NV_shader_buffer_load = !_glewInit_GL_NV_shader_buffer_load(); #endif /* GL_NV_shader_buffer_load */ #ifdef GL_NV_texture_array if (glewExperimental || GLEW_NV_texture_array) GLEW_NV_texture_array = !_glewInit_GL_NV_texture_array(); #endif /* GL_NV_texture_array */ #ifdef GL_NV_texture_barrier if (glewExperimental || GLEW_NV_texture_barrier) GLEW_NV_texture_barrier = !_glewInit_GL_NV_texture_barrier(); #endif /* GL_NV_texture_barrier */ #ifdef GL_NV_texture_multisample if (glewExperimental || GLEW_NV_texture_multisample) GLEW_NV_texture_multisample = !_glewInit_GL_NV_texture_multisample(); #endif /* GL_NV_texture_multisample */ #ifdef GL_NV_transform_feedback if (glewExperimental || GLEW_NV_transform_feedback) GLEW_NV_transform_feedback = !_glewInit_GL_NV_transform_feedback(); #endif /* GL_NV_transform_feedback */ #ifdef GL_NV_transform_feedback2 if (glewExperimental || GLEW_NV_transform_feedback2) GLEW_NV_transform_feedback2 = !_glewInit_GL_NV_transform_feedback2(); #endif /* GL_NV_transform_feedback2 */ #ifdef GL_NV_vdpau_interop if (glewExperimental || GLEW_NV_vdpau_interop) GLEW_NV_vdpau_interop = !_glewInit_GL_NV_vdpau_interop(); #endif /* GL_NV_vdpau_interop */ #ifdef GL_NV_vertex_array_range if (glewExperimental || GLEW_NV_vertex_array_range) GLEW_NV_vertex_array_range = !_glewInit_GL_NV_vertex_array_range(); #endif /* GL_NV_vertex_array_range */ #ifdef GL_NV_vertex_attrib_integer_64bit if (glewExperimental || GLEW_NV_vertex_attrib_integer_64bit) GLEW_NV_vertex_attrib_integer_64bit = !_glewInit_GL_NV_vertex_attrib_integer_64bit(); #endif /* GL_NV_vertex_attrib_integer_64bit */ #ifdef GL_NV_vertex_buffer_unified_memory if (glewExperimental || GLEW_NV_vertex_buffer_unified_memory) GLEW_NV_vertex_buffer_unified_memory = !_glewInit_GL_NV_vertex_buffer_unified_memory(); #endif /* GL_NV_vertex_buffer_unified_memory */ #ifdef GL_NV_vertex_program if (glewExperimental || GLEW_NV_vertex_program) GLEW_NV_vertex_program = !_glewInit_GL_NV_vertex_program(); #endif /* GL_NV_vertex_program */ #ifdef GL_NV_video_capture if (glewExperimental || GLEW_NV_video_capture) GLEW_NV_video_capture = !_glewInit_GL_NV_video_capture(); #endif /* GL_NV_video_capture */ #ifdef GL_NV_viewport_array if (glewExperimental || GLEW_NV_viewport_array) GLEW_NV_viewport_array = !_glewInit_GL_NV_viewport_array(); #endif /* GL_NV_viewport_array */ #ifdef GL_NV_viewport_swizzle if (glewExperimental || GLEW_NV_viewport_swizzle) GLEW_NV_viewport_swizzle = !_glewInit_GL_NV_viewport_swizzle(); #endif /* GL_NV_viewport_swizzle */ #ifdef GL_OVR_multiview if (glewExperimental || GLEW_OVR_multiview) GLEW_OVR_multiview = !_glewInit_GL_OVR_multiview(); #endif /* GL_OVR_multiview */ #ifdef GL_OVR_multiview_multisampled_render_to_texture if (glewExperimental || GLEW_OVR_multiview_multisampled_render_to_texture) GLEW_OVR_multiview_multisampled_render_to_texture = !_glewInit_GL_OVR_multiview_multisampled_render_to_texture(); #endif /* GL_OVR_multiview_multisampled_render_to_texture */ #ifdef GL_QCOM_alpha_test if (glewExperimental || GLEW_QCOM_alpha_test) GLEW_QCOM_alpha_test = !_glewInit_GL_QCOM_alpha_test(); #endif /* GL_QCOM_alpha_test */ #ifdef GL_QCOM_driver_control if (glewExperimental || GLEW_QCOM_driver_control) GLEW_QCOM_driver_control = !_glewInit_GL_QCOM_driver_control(); #endif /* GL_QCOM_driver_control */ #ifdef GL_QCOM_extended_get if (glewExperimental || GLEW_QCOM_extended_get) GLEW_QCOM_extended_get = !_glewInit_GL_QCOM_extended_get(); #endif /* GL_QCOM_extended_get */ #ifdef GL_QCOM_extended_get2 if (glewExperimental || GLEW_QCOM_extended_get2) GLEW_QCOM_extended_get2 = !_glewInit_GL_QCOM_extended_get2(); #endif /* GL_QCOM_extended_get2 */ #ifdef GL_QCOM_framebuffer_foveated if (glewExperimental || GLEW_QCOM_framebuffer_foveated) GLEW_QCOM_framebuffer_foveated = !_glewInit_GL_QCOM_framebuffer_foveated(); #endif /* GL_QCOM_framebuffer_foveated */ #ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent if (glewExperimental || GLEW_QCOM_shader_framebuffer_fetch_noncoherent) GLEW_QCOM_shader_framebuffer_fetch_noncoherent = !_glewInit_GL_QCOM_shader_framebuffer_fetch_noncoherent(); #endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ #ifdef GL_QCOM_tiled_rendering if (glewExperimental || GLEW_QCOM_tiled_rendering) GLEW_QCOM_tiled_rendering = !_glewInit_GL_QCOM_tiled_rendering(); #endif /* GL_QCOM_tiled_rendering */ #ifdef GL_REGAL_ES1_0_compatibility if (glewExperimental || GLEW_REGAL_ES1_0_compatibility) GLEW_REGAL_ES1_0_compatibility = !_glewInit_GL_REGAL_ES1_0_compatibility(); #endif /* GL_REGAL_ES1_0_compatibility */ #ifdef GL_REGAL_ES1_1_compatibility if (glewExperimental || GLEW_REGAL_ES1_1_compatibility) GLEW_REGAL_ES1_1_compatibility = !_glewInit_GL_REGAL_ES1_1_compatibility(); #endif /* GL_REGAL_ES1_1_compatibility */ #ifdef GL_REGAL_error_string if (glewExperimental || GLEW_REGAL_error_string) GLEW_REGAL_error_string = !_glewInit_GL_REGAL_error_string(); #endif /* GL_REGAL_error_string */ #ifdef GL_REGAL_extension_query if (glewExperimental || GLEW_REGAL_extension_query) GLEW_REGAL_extension_query = !_glewInit_GL_REGAL_extension_query(); #endif /* GL_REGAL_extension_query */ #ifdef GL_REGAL_log if (glewExperimental || GLEW_REGAL_log) GLEW_REGAL_log = !_glewInit_GL_REGAL_log(); #endif /* GL_REGAL_log */ #ifdef GL_REGAL_proc_address if (glewExperimental || GLEW_REGAL_proc_address) GLEW_REGAL_proc_address = !_glewInit_GL_REGAL_proc_address(); #endif /* GL_REGAL_proc_address */ #ifdef GL_SGIS_detail_texture if (glewExperimental || GLEW_SGIS_detail_texture) GLEW_SGIS_detail_texture = !_glewInit_GL_SGIS_detail_texture(); #endif /* GL_SGIS_detail_texture */ #ifdef GL_SGIS_fog_function if (glewExperimental || GLEW_SGIS_fog_function) GLEW_SGIS_fog_function = !_glewInit_GL_SGIS_fog_function(); #endif /* GL_SGIS_fog_function */ #ifdef GL_SGIS_multisample if (glewExperimental || GLEW_SGIS_multisample) GLEW_SGIS_multisample = !_glewInit_GL_SGIS_multisample(); #endif /* GL_SGIS_multisample */ #ifdef GL_SGIS_multitexture if (glewExperimental || GLEW_SGIS_multitexture) GLEW_SGIS_multitexture = !_glewInit_GL_SGIS_multitexture(); #endif /* GL_SGIS_multitexture */ #ifdef GL_SGIS_shared_multisample if (glewExperimental || GLEW_SGIS_shared_multisample) GLEW_SGIS_shared_multisample = !_glewInit_GL_SGIS_shared_multisample(); #endif /* GL_SGIS_shared_multisample */ #ifdef GL_SGIS_sharpen_texture if (glewExperimental || GLEW_SGIS_sharpen_texture) GLEW_SGIS_sharpen_texture = !_glewInit_GL_SGIS_sharpen_texture(); #endif /* GL_SGIS_sharpen_texture */ #ifdef GL_SGIS_texture4D if (glewExperimental || GLEW_SGIS_texture4D) GLEW_SGIS_texture4D = !_glewInit_GL_SGIS_texture4D(); #endif /* GL_SGIS_texture4D */ #ifdef GL_SGIS_texture_filter4 if (glewExperimental || GLEW_SGIS_texture_filter4) GLEW_SGIS_texture_filter4 = !_glewInit_GL_SGIS_texture_filter4(); #endif /* GL_SGIS_texture_filter4 */ #ifdef GL_SGIX_async if (glewExperimental || GLEW_SGIX_async) GLEW_SGIX_async = !_glewInit_GL_SGIX_async(); #endif /* GL_SGIX_async */ #ifdef GL_SGIX_datapipe if (glewExperimental || GLEW_SGIX_datapipe) GLEW_SGIX_datapipe = !_glewInit_GL_SGIX_datapipe(); #endif /* GL_SGIX_datapipe */ #ifdef GL_SGIX_flush_raster if (glewExperimental || GLEW_SGIX_flush_raster) GLEW_SGIX_flush_raster = !_glewInit_GL_SGIX_flush_raster(); #endif /* GL_SGIX_flush_raster */ #ifdef GL_SGIX_fog_layers if (glewExperimental || GLEW_SGIX_fog_layers) GLEW_SGIX_fog_layers = !_glewInit_GL_SGIX_fog_layers(); #endif /* GL_SGIX_fog_layers */ #ifdef GL_SGIX_fog_texture if (glewExperimental || GLEW_SGIX_fog_texture) GLEW_SGIX_fog_texture = !_glewInit_GL_SGIX_fog_texture(); #endif /* GL_SGIX_fog_texture */ #ifdef GL_SGIX_fragment_specular_lighting if (glewExperimental || GLEW_SGIX_fragment_specular_lighting) GLEW_SGIX_fragment_specular_lighting = !_glewInit_GL_SGIX_fragment_specular_lighting(); #endif /* GL_SGIX_fragment_specular_lighting */ #ifdef GL_SGIX_framezoom if (glewExperimental || GLEW_SGIX_framezoom) GLEW_SGIX_framezoom = !_glewInit_GL_SGIX_framezoom(); #endif /* GL_SGIX_framezoom */ #ifdef GL_SGIX_igloo_interface if (glewExperimental || GLEW_SGIX_igloo_interface) GLEW_SGIX_igloo_interface = !_glewInit_GL_SGIX_igloo_interface(); #endif /* GL_SGIX_igloo_interface */ #ifdef GL_SGIX_mpeg1 if (glewExperimental || GLEW_SGIX_mpeg1) GLEW_SGIX_mpeg1 = !_glewInit_GL_SGIX_mpeg1(); #endif /* GL_SGIX_mpeg1 */ #ifdef GL_SGIX_nonlinear_lighting_pervertex if (glewExperimental || GLEW_SGIX_nonlinear_lighting_pervertex) GLEW_SGIX_nonlinear_lighting_pervertex = !_glewInit_GL_SGIX_nonlinear_lighting_pervertex(); #endif /* GL_SGIX_nonlinear_lighting_pervertex */ #ifdef GL_SGIX_pixel_texture if (glewExperimental || GLEW_SGIX_pixel_texture) GLEW_SGIX_pixel_texture = !_glewInit_GL_SGIX_pixel_texture(); #endif /* GL_SGIX_pixel_texture */ #ifdef GL_SGIX_polynomial_ffd if (glewExperimental || GLEW_SGIX_polynomial_ffd) GLEW_SGIX_polynomial_ffd = !_glewInit_GL_SGIX_polynomial_ffd(); #endif /* GL_SGIX_polynomial_ffd */ #ifdef GL_SGIX_quad_mesh if (glewExperimental || GLEW_SGIX_quad_mesh) GLEW_SGIX_quad_mesh = !_glewInit_GL_SGIX_quad_mesh(); #endif /* GL_SGIX_quad_mesh */ #ifdef GL_SGIX_reference_plane if (glewExperimental || GLEW_SGIX_reference_plane) GLEW_SGIX_reference_plane = !_glewInit_GL_SGIX_reference_plane(); #endif /* GL_SGIX_reference_plane */ #ifdef GL_SGIX_sprite if (glewExperimental || GLEW_SGIX_sprite) GLEW_SGIX_sprite = !_glewInit_GL_SGIX_sprite(); #endif /* GL_SGIX_sprite */ #ifdef GL_SGIX_tag_sample_buffer if (glewExperimental || GLEW_SGIX_tag_sample_buffer) GLEW_SGIX_tag_sample_buffer = !_glewInit_GL_SGIX_tag_sample_buffer(); #endif /* GL_SGIX_tag_sample_buffer */ #ifdef GL_SGIX_vector_ops if (glewExperimental || GLEW_SGIX_vector_ops) GLEW_SGIX_vector_ops = !_glewInit_GL_SGIX_vector_ops(); #endif /* GL_SGIX_vector_ops */ #ifdef GL_SGIX_vertex_array_object if (glewExperimental || GLEW_SGIX_vertex_array_object) GLEW_SGIX_vertex_array_object = !_glewInit_GL_SGIX_vertex_array_object(); #endif /* GL_SGIX_vertex_array_object */ #ifdef GL_SGI_color_table if (glewExperimental || GLEW_SGI_color_table) GLEW_SGI_color_table = !_glewInit_GL_SGI_color_table(); #endif /* GL_SGI_color_table */ #ifdef GL_SGI_fft if (glewExperimental || GLEW_SGI_fft) GLEW_SGI_fft = !_glewInit_GL_SGI_fft(); #endif /* GL_SGI_fft */ #ifdef GL_SUNX_constant_data if (glewExperimental || GLEW_SUNX_constant_data) GLEW_SUNX_constant_data = !_glewInit_GL_SUNX_constant_data(); #endif /* GL_SUNX_constant_data */ #ifdef GL_SUN_global_alpha if (glewExperimental || GLEW_SUN_global_alpha) GLEW_SUN_global_alpha = !_glewInit_GL_SUN_global_alpha(); #endif /* GL_SUN_global_alpha */ #ifdef GL_SUN_read_video_pixels if (glewExperimental || GLEW_SUN_read_video_pixels) GLEW_SUN_read_video_pixels = !_glewInit_GL_SUN_read_video_pixels(); #endif /* GL_SUN_read_video_pixels */ #ifdef GL_SUN_triangle_list if (glewExperimental || GLEW_SUN_triangle_list) GLEW_SUN_triangle_list = !_glewInit_GL_SUN_triangle_list(); #endif /* GL_SUN_triangle_list */ #ifdef GL_SUN_vertex if (glewExperimental || GLEW_SUN_vertex) GLEW_SUN_vertex = !_glewInit_GL_SUN_vertex(); #endif /* GL_SUN_vertex */ #ifdef GL_WIN_swap_hint if (glewExperimental || GLEW_WIN_swap_hint) GLEW_WIN_swap_hint = !_glewInit_GL_WIN_swap_hint(); #endif /* GL_WIN_swap_hint */ #ifdef GL_NV_fragment_program4 GLEW_NV_fragment_program4 = GLEW_NV_gpu_program4; #endif /* GL_NV_fragment_program4 */ #ifdef GL_NV_geometry_program4 GLEW_NV_geometry_program4 = GLEW_NV_gpu_program4; #endif /* GL_NV_geometry_program4 */ #ifdef GL_NV_tessellation_program5 GLEW_NV_tessellation_program5 = GLEW_NV_gpu_program5; #endif /* GL_NV_tessellation_program5 */ #ifdef GL_NV_vertex_program4 GLEW_NV_vertex_program4 = GLEW_NV_gpu_program4; #endif /* GL_NV_vertex_program4 */ return GLEW_OK; } #if defined(GLEW_OSMESA) #elif defined(GLEW_EGL) PFNEGLCHOOSECONFIGPROC __eglewChooseConfig = NULL; PFNEGLCOPYBUFFERSPROC __eglewCopyBuffers = NULL; PFNEGLCREATECONTEXTPROC __eglewCreateContext = NULL; PFNEGLCREATEPBUFFERSURFACEPROC __eglewCreatePbufferSurface = NULL; PFNEGLCREATEPIXMAPSURFACEPROC __eglewCreatePixmapSurface = NULL; PFNEGLCREATEWINDOWSURFACEPROC __eglewCreateWindowSurface = NULL; PFNEGLDESTROYCONTEXTPROC __eglewDestroyContext = NULL; PFNEGLDESTROYSURFACEPROC __eglewDestroySurface = NULL; PFNEGLGETCONFIGATTRIBPROC __eglewGetConfigAttrib = NULL; PFNEGLGETCONFIGSPROC __eglewGetConfigs = NULL; PFNEGLGETCURRENTDISPLAYPROC __eglewGetCurrentDisplay = NULL; PFNEGLGETCURRENTSURFACEPROC __eglewGetCurrentSurface = NULL; PFNEGLGETDISPLAYPROC __eglewGetDisplay = NULL; PFNEGLGETERRORPROC __eglewGetError = NULL; PFNEGLINITIALIZEPROC __eglewInitialize = NULL; PFNEGLMAKECURRENTPROC __eglewMakeCurrent = NULL; PFNEGLQUERYCONTEXTPROC __eglewQueryContext = NULL; PFNEGLQUERYSTRINGPROC __eglewQueryString = NULL; PFNEGLQUERYSURFACEPROC __eglewQuerySurface = NULL; PFNEGLSWAPBUFFERSPROC __eglewSwapBuffers = NULL; PFNEGLTERMINATEPROC __eglewTerminate = NULL; PFNEGLWAITGLPROC __eglewWaitGL = NULL; PFNEGLWAITNATIVEPROC __eglewWaitNative = NULL; PFNEGLBINDTEXIMAGEPROC __eglewBindTexImage = NULL; PFNEGLRELEASETEXIMAGEPROC __eglewReleaseTexImage = NULL; PFNEGLSURFACEATTRIBPROC __eglewSurfaceAttrib = NULL; PFNEGLSWAPINTERVALPROC __eglewSwapInterval = NULL; PFNEGLBINDAPIPROC __eglewBindAPI = NULL; PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC __eglewCreatePbufferFromClientBuffer = NULL; PFNEGLQUERYAPIPROC __eglewQueryAPI = NULL; PFNEGLRELEASETHREADPROC __eglewReleaseThread = NULL; PFNEGLWAITCLIENTPROC __eglewWaitClient = NULL; PFNEGLGETCURRENTCONTEXTPROC __eglewGetCurrentContext = NULL; PFNEGLCLIENTWAITSYNCPROC __eglewClientWaitSync = NULL; PFNEGLCREATEIMAGEPROC __eglewCreateImage = NULL; PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC __eglewCreatePlatformPixmapSurface = NULL; PFNEGLCREATEPLATFORMWINDOWSURFACEPROC __eglewCreatePlatformWindowSurface = NULL; PFNEGLCREATESYNCPROC __eglewCreateSync = NULL; PFNEGLDESTROYIMAGEPROC __eglewDestroyImage = NULL; PFNEGLDESTROYSYNCPROC __eglewDestroySync = NULL; PFNEGLGETPLATFORMDISPLAYPROC __eglewGetPlatformDisplay = NULL; PFNEGLGETSYNCATTRIBPROC __eglewGetSyncAttrib = NULL; PFNEGLWAITSYNCPROC __eglewWaitSync = NULL; PFNEGLSETBLOBCACHEFUNCSANDROIDPROC __eglewSetBlobCacheFuncsANDROID = NULL; PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC __eglewCreateNativeClientBufferANDROID = NULL; PFNEGLDUPNATIVEFENCEFDANDROIDPROC __eglewDupNativeFenceFDANDROID = NULL; PFNEGLPRESENTATIONTIMEANDROIDPROC __eglewPresentationTimeANDROID = NULL; PFNEGLQUERYSURFACEPOINTERANGLEPROC __eglewQuerySurfacePointerANGLE = NULL; PFNEGLQUERYDEVICESEXTPROC __eglewQueryDevicesEXT = NULL; PFNEGLQUERYDEVICEATTRIBEXTPROC __eglewQueryDeviceAttribEXT = NULL; PFNEGLQUERYDEVICESTRINGEXTPROC __eglewQueryDeviceStringEXT = NULL; PFNEGLQUERYDISPLAYATTRIBEXTPROC __eglewQueryDisplayAttribEXT = NULL; PFNEGLQUERYDMABUFFORMATSEXTPROC __eglewQueryDmaBufFormatsEXT = NULL; PFNEGLQUERYDMABUFMODIFIERSEXTPROC __eglewQueryDmaBufModifiersEXT = NULL; PFNEGLGETOUTPUTLAYERSEXTPROC __eglewGetOutputLayersEXT = NULL; PFNEGLGETOUTPUTPORTSEXTPROC __eglewGetOutputPortsEXT = NULL; PFNEGLOUTPUTLAYERATTRIBEXTPROC __eglewOutputLayerAttribEXT = NULL; PFNEGLOUTPUTPORTATTRIBEXTPROC __eglewOutputPortAttribEXT = NULL; PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC __eglewQueryOutputLayerAttribEXT = NULL; PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC __eglewQueryOutputLayerStringEXT = NULL; PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC __eglewQueryOutputPortAttribEXT = NULL; PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC __eglewQueryOutputPortStringEXT = NULL; PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC __eglewCreatePlatformPixmapSurfaceEXT = NULL; PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC __eglewCreatePlatformWindowSurfaceEXT = NULL; PFNEGLGETPLATFORMDISPLAYEXTPROC __eglewGetPlatformDisplayEXT = NULL; PFNEGLSTREAMCONSUMEROUTPUTEXTPROC __eglewStreamConsumerOutputEXT = NULL; PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC __eglewSwapBuffersWithDamageEXT = NULL; PFNEGLCREATEPIXMAPSURFACEHIPROC __eglewCreatePixmapSurfaceHI = NULL; PFNEGLCREATESYNC64KHRPROC __eglewCreateSync64KHR = NULL; PFNEGLDEBUGMESSAGECONTROLKHRPROC __eglewDebugMessageControlKHR = NULL; PFNEGLLABELOBJECTKHRPROC __eglewLabelObjectKHR = NULL; PFNEGLQUERYDEBUGKHRPROC __eglewQueryDebugKHR = NULL; PFNEGLCREATEIMAGEKHRPROC __eglewCreateImageKHR = NULL; PFNEGLDESTROYIMAGEKHRPROC __eglewDestroyImageKHR = NULL; PFNEGLLOCKSURFACEKHRPROC __eglewLockSurfaceKHR = NULL; PFNEGLUNLOCKSURFACEKHRPROC __eglewUnlockSurfaceKHR = NULL; PFNEGLQUERYSURFACE64KHRPROC __eglewQuerySurface64KHR = NULL; PFNEGLSETDAMAGEREGIONKHRPROC __eglewSetDamageRegionKHR = NULL; PFNEGLCLIENTWAITSYNCKHRPROC __eglewClientWaitSyncKHR = NULL; PFNEGLCREATESYNCKHRPROC __eglewCreateSyncKHR = NULL; PFNEGLDESTROYSYNCKHRPROC __eglewDestroySyncKHR = NULL; PFNEGLGETSYNCATTRIBKHRPROC __eglewGetSyncAttribKHR = NULL; PFNEGLSIGNALSYNCKHRPROC __eglewSignalSyncKHR = NULL; PFNEGLCREATESTREAMKHRPROC __eglewCreateStreamKHR = NULL; PFNEGLDESTROYSTREAMKHRPROC __eglewDestroyStreamKHR = NULL; PFNEGLQUERYSTREAMKHRPROC __eglewQueryStreamKHR = NULL; PFNEGLQUERYSTREAMU64KHRPROC __eglewQueryStreamu64KHR = NULL; PFNEGLSTREAMATTRIBKHRPROC __eglewStreamAttribKHR = NULL; PFNEGLCREATESTREAMATTRIBKHRPROC __eglewCreateStreamAttribKHR = NULL; PFNEGLQUERYSTREAMATTRIBKHRPROC __eglewQueryStreamAttribKHR = NULL; PFNEGLSETSTREAMATTRIBKHRPROC __eglewSetStreamAttribKHR = NULL; PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC __eglewStreamConsumerAcquireAttribKHR = NULL; PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC __eglewStreamConsumerReleaseAttribKHR = NULL; PFNEGLSTREAMCONSUMERACQUIREKHRPROC __eglewStreamConsumerAcquireKHR = NULL; PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC __eglewStreamConsumerGLTextureExternalKHR = NULL; PFNEGLSTREAMCONSUMERRELEASEKHRPROC __eglewStreamConsumerReleaseKHR = NULL; PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC __eglewCreateStreamFromFileDescriptorKHR = NULL; PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC __eglewGetStreamFileDescriptorKHR = NULL; PFNEGLQUERYSTREAMTIMEKHRPROC __eglewQueryStreamTimeKHR = NULL; PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC __eglewCreateStreamProducerSurfaceKHR = NULL; PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC __eglewSwapBuffersWithDamageKHR = NULL; PFNEGLWAITSYNCKHRPROC __eglewWaitSyncKHR = NULL; PFNEGLCREATEDRMIMAGEMESAPROC __eglewCreateDRMImageMESA = NULL; PFNEGLEXPORTDRMIMAGEMESAPROC __eglewExportDRMImageMESA = NULL; PFNEGLEXPORTDMABUFIMAGEMESAPROC __eglewExportDMABUFImageMESA = NULL; PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC __eglewExportDMABUFImageQueryMESA = NULL; PFNEGLSWAPBUFFERSREGIONNOKPROC __eglewSwapBuffersRegionNOK = NULL; PFNEGLSWAPBUFFERSREGION2NOKPROC __eglewSwapBuffersRegion2NOK = NULL; PFNEGLQUERYNATIVEDISPLAYNVPROC __eglewQueryNativeDisplayNV = NULL; PFNEGLQUERYNATIVEPIXMAPNVPROC __eglewQueryNativePixmapNV = NULL; PFNEGLQUERYNATIVEWINDOWNVPROC __eglewQueryNativeWindowNV = NULL; PFNEGLPOSTSUBBUFFERNVPROC __eglewPostSubBufferNV = NULL; PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC __eglewStreamConsumerGLTextureExternalAttribsNV = NULL; PFNEGLQUERYDISPLAYATTRIBNVPROC __eglewQueryDisplayAttribNV = NULL; PFNEGLQUERYSTREAMMETADATANVPROC __eglewQueryStreamMetadataNV = NULL; PFNEGLSETSTREAMMETADATANVPROC __eglewSetStreamMetadataNV = NULL; PFNEGLRESETSTREAMNVPROC __eglewResetStreamNV = NULL; PFNEGLCREATESTREAMSYNCNVPROC __eglewCreateStreamSyncNV = NULL; PFNEGLCLIENTWAITSYNCNVPROC __eglewClientWaitSyncNV = NULL; PFNEGLCREATEFENCESYNCNVPROC __eglewCreateFenceSyncNV = NULL; PFNEGLDESTROYSYNCNVPROC __eglewDestroySyncNV = NULL; PFNEGLFENCENVPROC __eglewFenceNV = NULL; PFNEGLGETSYNCATTRIBNVPROC __eglewGetSyncAttribNV = NULL; PFNEGLSIGNALSYNCNVPROC __eglewSignalSyncNV = NULL; PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC __eglewGetSystemTimeFrequencyNV = NULL; PFNEGLGETSYSTEMTIMENVPROC __eglewGetSystemTimeNV = NULL; GLboolean __EGLEW_VERSION_1_0 = GL_FALSE; GLboolean __EGLEW_VERSION_1_1 = GL_FALSE; GLboolean __EGLEW_VERSION_1_2 = GL_FALSE; GLboolean __EGLEW_VERSION_1_3 = GL_FALSE; GLboolean __EGLEW_VERSION_1_4 = GL_FALSE; GLboolean __EGLEW_VERSION_1_5 = GL_FALSE; GLboolean __EGLEW_ANDROID_blob_cache = GL_FALSE; GLboolean __EGLEW_ANDROID_create_native_client_buffer = GL_FALSE; GLboolean __EGLEW_ANDROID_framebuffer_target = GL_FALSE; GLboolean __EGLEW_ANDROID_front_buffer_auto_refresh = GL_FALSE; GLboolean __EGLEW_ANDROID_image_native_buffer = GL_FALSE; GLboolean __EGLEW_ANDROID_native_fence_sync = GL_FALSE; GLboolean __EGLEW_ANDROID_presentation_time = GL_FALSE; GLboolean __EGLEW_ANDROID_recordable = GL_FALSE; GLboolean __EGLEW_ANGLE_d3d_share_handle_client_buffer = GL_FALSE; GLboolean __EGLEW_ANGLE_device_d3d = GL_FALSE; GLboolean __EGLEW_ANGLE_query_surface_pointer = GL_FALSE; GLboolean __EGLEW_ANGLE_surface_d3d_texture_2d_share_handle = GL_FALSE; GLboolean __EGLEW_ANGLE_window_fixed_size = GL_FALSE; GLboolean __EGLEW_ARM_implicit_external_sync = GL_FALSE; GLboolean __EGLEW_ARM_pixmap_multisample_discard = GL_FALSE; GLboolean __EGLEW_EXT_buffer_age = GL_FALSE; GLboolean __EGLEW_EXT_client_extensions = GL_FALSE; GLboolean __EGLEW_EXT_create_context_robustness = GL_FALSE; GLboolean __EGLEW_EXT_device_base = GL_FALSE; GLboolean __EGLEW_EXT_device_drm = GL_FALSE; GLboolean __EGLEW_EXT_device_enumeration = GL_FALSE; GLboolean __EGLEW_EXT_device_openwf = GL_FALSE; GLboolean __EGLEW_EXT_device_query = GL_FALSE; GLboolean __EGLEW_EXT_gl_colorspace_bt2020_linear = GL_FALSE; GLboolean __EGLEW_EXT_gl_colorspace_bt2020_pq = GL_FALSE; GLboolean __EGLEW_EXT_gl_colorspace_scrgb_linear = GL_FALSE; GLboolean __EGLEW_EXT_image_dma_buf_import = GL_FALSE; GLboolean __EGLEW_EXT_image_dma_buf_import_modifiers = GL_FALSE; GLboolean __EGLEW_EXT_multiview_window = GL_FALSE; GLboolean __EGLEW_EXT_output_base = GL_FALSE; GLboolean __EGLEW_EXT_output_drm = GL_FALSE; GLboolean __EGLEW_EXT_output_openwf = GL_FALSE; GLboolean __EGLEW_EXT_pixel_format_float = GL_FALSE; GLboolean __EGLEW_EXT_platform_base = GL_FALSE; GLboolean __EGLEW_EXT_platform_device = GL_FALSE; GLboolean __EGLEW_EXT_platform_wayland = GL_FALSE; GLboolean __EGLEW_EXT_platform_x11 = GL_FALSE; GLboolean __EGLEW_EXT_protected_content = GL_FALSE; GLboolean __EGLEW_EXT_protected_surface = GL_FALSE; GLboolean __EGLEW_EXT_stream_consumer_egloutput = GL_FALSE; GLboolean __EGLEW_EXT_surface_SMPTE2086_metadata = GL_FALSE; GLboolean __EGLEW_EXT_swap_buffers_with_damage = GL_FALSE; GLboolean __EGLEW_EXT_yuv_surface = GL_FALSE; GLboolean __EGLEW_HI_clientpixmap = GL_FALSE; GLboolean __EGLEW_HI_colorformats = GL_FALSE; GLboolean __EGLEW_IMG_context_priority = GL_FALSE; GLboolean __EGLEW_IMG_image_plane_attribs = GL_FALSE; GLboolean __EGLEW_KHR_cl_event = GL_FALSE; GLboolean __EGLEW_KHR_cl_event2 = GL_FALSE; GLboolean __EGLEW_KHR_client_get_all_proc_addresses = GL_FALSE; GLboolean __EGLEW_KHR_config_attribs = GL_FALSE; GLboolean __EGLEW_KHR_context_flush_control = GL_FALSE; GLboolean __EGLEW_KHR_create_context = GL_FALSE; GLboolean __EGLEW_KHR_create_context_no_error = GL_FALSE; GLboolean __EGLEW_KHR_debug = GL_FALSE; GLboolean __EGLEW_KHR_fence_sync = GL_FALSE; GLboolean __EGLEW_KHR_get_all_proc_addresses = GL_FALSE; GLboolean __EGLEW_KHR_gl_colorspace = GL_FALSE; GLboolean __EGLEW_KHR_gl_renderbuffer_image = GL_FALSE; GLboolean __EGLEW_KHR_gl_texture_2D_image = GL_FALSE; GLboolean __EGLEW_KHR_gl_texture_3D_image = GL_FALSE; GLboolean __EGLEW_KHR_gl_texture_cubemap_image = GL_FALSE; GLboolean __EGLEW_KHR_image = GL_FALSE; GLboolean __EGLEW_KHR_image_base = GL_FALSE; GLboolean __EGLEW_KHR_image_pixmap = GL_FALSE; GLboolean __EGLEW_KHR_lock_surface = GL_FALSE; GLboolean __EGLEW_KHR_lock_surface2 = GL_FALSE; GLboolean __EGLEW_KHR_lock_surface3 = GL_FALSE; GLboolean __EGLEW_KHR_mutable_render_buffer = GL_FALSE; GLboolean __EGLEW_KHR_no_config_context = GL_FALSE; GLboolean __EGLEW_KHR_partial_update = GL_FALSE; GLboolean __EGLEW_KHR_platform_android = GL_FALSE; GLboolean __EGLEW_KHR_platform_gbm = GL_FALSE; GLboolean __EGLEW_KHR_platform_wayland = GL_FALSE; GLboolean __EGLEW_KHR_platform_x11 = GL_FALSE; GLboolean __EGLEW_KHR_reusable_sync = GL_FALSE; GLboolean __EGLEW_KHR_stream = GL_FALSE; GLboolean __EGLEW_KHR_stream_attrib = GL_FALSE; GLboolean __EGLEW_KHR_stream_consumer_gltexture = GL_FALSE; GLboolean __EGLEW_KHR_stream_cross_process_fd = GL_FALSE; GLboolean __EGLEW_KHR_stream_fifo = GL_FALSE; GLboolean __EGLEW_KHR_stream_producer_aldatalocator = GL_FALSE; GLboolean __EGLEW_KHR_stream_producer_eglsurface = GL_FALSE; GLboolean __EGLEW_KHR_surfaceless_context = GL_FALSE; GLboolean __EGLEW_KHR_swap_buffers_with_damage = GL_FALSE; GLboolean __EGLEW_KHR_vg_parent_image = GL_FALSE; GLboolean __EGLEW_KHR_wait_sync = GL_FALSE; GLboolean __EGLEW_MESA_drm_image = GL_FALSE; GLboolean __EGLEW_MESA_image_dma_buf_export = GL_FALSE; GLboolean __EGLEW_MESA_platform_gbm = GL_FALSE; GLboolean __EGLEW_MESA_platform_surfaceless = GL_FALSE; GLboolean __EGLEW_NOK_swap_region = GL_FALSE; GLboolean __EGLEW_NOK_swap_region2 = GL_FALSE; GLboolean __EGLEW_NOK_texture_from_pixmap = GL_FALSE; GLboolean __EGLEW_NV_3dvision_surface = GL_FALSE; GLboolean __EGLEW_NV_coverage_sample = GL_FALSE; GLboolean __EGLEW_NV_coverage_sample_resolve = GL_FALSE; GLboolean __EGLEW_NV_cuda_event = GL_FALSE; GLboolean __EGLEW_NV_depth_nonlinear = GL_FALSE; GLboolean __EGLEW_NV_device_cuda = GL_FALSE; GLboolean __EGLEW_NV_native_query = GL_FALSE; GLboolean __EGLEW_NV_post_convert_rounding = GL_FALSE; GLboolean __EGLEW_NV_post_sub_buffer = GL_FALSE; GLboolean __EGLEW_NV_robustness_video_memory_purge = GL_FALSE; GLboolean __EGLEW_NV_stream_consumer_gltexture_yuv = GL_FALSE; GLboolean __EGLEW_NV_stream_cross_display = GL_FALSE; GLboolean __EGLEW_NV_stream_cross_object = GL_FALSE; GLboolean __EGLEW_NV_stream_cross_partition = GL_FALSE; GLboolean __EGLEW_NV_stream_cross_process = GL_FALSE; GLboolean __EGLEW_NV_stream_cross_system = GL_FALSE; GLboolean __EGLEW_NV_stream_fifo_next = GL_FALSE; GLboolean __EGLEW_NV_stream_fifo_synchronous = GL_FALSE; GLboolean __EGLEW_NV_stream_frame_limits = GL_FALSE; GLboolean __EGLEW_NV_stream_metadata = GL_FALSE; GLboolean __EGLEW_NV_stream_remote = GL_FALSE; GLboolean __EGLEW_NV_stream_reset = GL_FALSE; GLboolean __EGLEW_NV_stream_socket = GL_FALSE; GLboolean __EGLEW_NV_stream_socket_inet = GL_FALSE; GLboolean __EGLEW_NV_stream_socket_unix = GL_FALSE; GLboolean __EGLEW_NV_stream_sync = GL_FALSE; GLboolean __EGLEW_NV_sync = GL_FALSE; GLboolean __EGLEW_NV_system_time = GL_FALSE; GLboolean __EGLEW_TIZEN_image_native_buffer = GL_FALSE; GLboolean __EGLEW_TIZEN_image_native_surface = GL_FALSE; #ifdef EGL_VERSION_1_0 static GLboolean _glewInit_EGL_VERSION_1_0 () { GLboolean r = GL_FALSE; r = ((eglChooseConfig = (PFNEGLCHOOSECONFIGPROC)glewGetProcAddress((const GLubyte*)"eglChooseConfig")) == NULL) || r; r = ((eglCopyBuffers = (PFNEGLCOPYBUFFERSPROC)glewGetProcAddress((const GLubyte*)"eglCopyBuffers")) == NULL) || r; r = ((eglCreateContext = (PFNEGLCREATECONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglCreateContext")) == NULL) || r; r = ((eglCreatePbufferSurface = (PFNEGLCREATEPBUFFERSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePbufferSurface")) == NULL) || r; r = ((eglCreatePixmapSurface = (PFNEGLCREATEPIXMAPSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePixmapSurface")) == NULL) || r; r = ((eglCreateWindowSurface = (PFNEGLCREATEWINDOWSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreateWindowSurface")) == NULL) || r; r = ((eglDestroyContext = (PFNEGLDESTROYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglDestroyContext")) == NULL) || r; r = ((eglDestroySurface = (PFNEGLDESTROYSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglDestroySurface")) == NULL) || r; r = ((eglGetConfigAttrib = (PFNEGLGETCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"eglGetConfigAttrib")) == NULL) || r; r = ((eglGetConfigs = (PFNEGLGETCONFIGSPROC)glewGetProcAddress((const GLubyte*)"eglGetConfigs")) == NULL) || r; r = ((eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"eglGetCurrentDisplay")) == NULL) || r; r = ((eglGetCurrentSurface = (PFNEGLGETCURRENTSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglGetCurrentSurface")) == NULL) || r; r = ((eglGetDisplay = (PFNEGLGETDISPLAYPROC)glewGetProcAddress((const GLubyte*)"eglGetDisplay")) == NULL) || r; r = ((eglGetError = (PFNEGLGETERRORPROC)glewGetProcAddress((const GLubyte*)"eglGetError")) == NULL) || r; r = ((eglInitialize = (PFNEGLINITIALIZEPROC)glewGetProcAddress((const GLubyte*)"eglInitialize")) == NULL) || r; r = ((eglMakeCurrent = (PFNEGLMAKECURRENTPROC)glewGetProcAddress((const GLubyte*)"eglMakeCurrent")) == NULL) || r; r = ((eglQueryContext = (PFNEGLQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryContext")) == NULL) || r; r = ((eglQueryString = (PFNEGLQUERYSTRINGPROC)glewGetProcAddress((const GLubyte*)"eglQueryString")) == NULL) || r; r = ((eglQuerySurface = (PFNEGLQUERYSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglQuerySurface")) == NULL) || r; r = ((eglSwapBuffers = (PFNEGLSWAPBUFFERSPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffers")) == NULL) || r; r = ((eglTerminate = (PFNEGLTERMINATEPROC)glewGetProcAddress((const GLubyte*)"eglTerminate")) == NULL) || r; r = ((eglWaitGL = (PFNEGLWAITGLPROC)glewGetProcAddress((const GLubyte*)"eglWaitGL")) == NULL) || r; r = ((eglWaitNative = (PFNEGLWAITNATIVEPROC)glewGetProcAddress((const GLubyte*)"eglWaitNative")) == NULL) || r; return r; } #endif /* EGL_VERSION_1_0 */ #ifdef EGL_VERSION_1_1 static GLboolean _glewInit_EGL_VERSION_1_1 () { GLboolean r = GL_FALSE; r = ((eglBindTexImage = (PFNEGLBINDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglBindTexImage")) == NULL) || r; r = ((eglReleaseTexImage = (PFNEGLRELEASETEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglReleaseTexImage")) == NULL) || r; r = ((eglSurfaceAttrib = (PFNEGLSURFACEATTRIBPROC)glewGetProcAddress((const GLubyte*)"eglSurfaceAttrib")) == NULL) || r; r = ((eglSwapInterval = (PFNEGLSWAPINTERVALPROC)glewGetProcAddress((const GLubyte*)"eglSwapInterval")) == NULL) || r; return r; } #endif /* EGL_VERSION_1_1 */ #ifdef EGL_VERSION_1_2 static GLboolean _glewInit_EGL_VERSION_1_2 () { GLboolean r = GL_FALSE; r = ((eglBindAPI = (PFNEGLBINDAPIPROC)glewGetProcAddress((const GLubyte*)"eglBindAPI")) == NULL) || r; r = ((eglCreatePbufferFromClientBuffer = (PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC)glewGetProcAddress((const GLubyte*)"eglCreatePbufferFromClientBuffer")) == NULL) || r; r = ((eglQueryAPI = (PFNEGLQUERYAPIPROC)glewGetProcAddress((const GLubyte*)"eglQueryAPI")) == NULL) || r; r = ((eglReleaseThread = (PFNEGLRELEASETHREADPROC)glewGetProcAddress((const GLubyte*)"eglReleaseThread")) == NULL) || r; r = ((eglWaitClient = (PFNEGLWAITCLIENTPROC)glewGetProcAddress((const GLubyte*)"eglWaitClient")) == NULL) || r; return r; } #endif /* EGL_VERSION_1_2 */ #ifdef EGL_VERSION_1_4 static GLboolean _glewInit_EGL_VERSION_1_4 () { GLboolean r = GL_FALSE; r = ((eglGetCurrentContext = (PFNEGLGETCURRENTCONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetCurrentContext")) == NULL) || r; return r; } #endif /* EGL_VERSION_1_4 */ #ifdef EGL_VERSION_1_5 static GLboolean _glewInit_EGL_VERSION_1_5 () { GLboolean r = GL_FALSE; r = ((eglClientWaitSync = (PFNEGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"eglClientWaitSync")) == NULL) || r; r = ((eglCreateImage = (PFNEGLCREATEIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglCreateImage")) == NULL) || r; r = ((eglCreatePlatformPixmapSurface = (PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformPixmapSurface")) == NULL) || r; r = ((eglCreatePlatformWindowSurface = (PFNEGLCREATEPLATFORMWINDOWSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformWindowSurface")) == NULL) || r; r = ((eglCreateSync = (PFNEGLCREATESYNCPROC)glewGetProcAddress((const GLubyte*)"eglCreateSync")) == NULL) || r; r = ((eglDestroyImage = (PFNEGLDESTROYIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglDestroyImage")) == NULL) || r; r = ((eglDestroySync = (PFNEGLDESTROYSYNCPROC)glewGetProcAddress((const GLubyte*)"eglDestroySync")) == NULL) || r; r = ((eglGetPlatformDisplay = (PFNEGLGETPLATFORMDISPLAYPROC)glewGetProcAddress((const GLubyte*)"eglGetPlatformDisplay")) == NULL) || r; r = ((eglGetSyncAttrib = (PFNEGLGETSYNCATTRIBPROC)glewGetProcAddress((const GLubyte*)"eglGetSyncAttrib")) == NULL) || r; r = ((eglWaitSync = (PFNEGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"eglWaitSync")) == NULL) || r; return r; } #endif /* EGL_VERSION_1_5 */ #ifdef EGL_ANDROID_blob_cache static GLboolean _glewInit_EGL_ANDROID_blob_cache () { GLboolean r = GL_FALSE; r = ((eglSetBlobCacheFuncsANDROID = (PFNEGLSETBLOBCACHEFUNCSANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglSetBlobCacheFuncsANDROID")) == NULL) || r; return r; } #endif /* EGL_ANDROID_blob_cache */ #ifdef EGL_ANDROID_create_native_client_buffer static GLboolean _glewInit_EGL_ANDROID_create_native_client_buffer () { GLboolean r = GL_FALSE; r = ((eglCreateNativeClientBufferANDROID = (PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglCreateNativeClientBufferANDROID")) == NULL) || r; return r; } #endif /* EGL_ANDROID_create_native_client_buffer */ #ifdef EGL_ANDROID_native_fence_sync static GLboolean _glewInit_EGL_ANDROID_native_fence_sync () { GLboolean r = GL_FALSE; r = ((eglDupNativeFenceFDANDROID = (PFNEGLDUPNATIVEFENCEFDANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglDupNativeFenceFDANDROID")) == NULL) || r; return r; } #endif /* EGL_ANDROID_native_fence_sync */ #ifdef EGL_ANDROID_presentation_time static GLboolean _glewInit_EGL_ANDROID_presentation_time () { GLboolean r = GL_FALSE; r = ((eglPresentationTimeANDROID = (PFNEGLPRESENTATIONTIMEANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglPresentationTimeANDROID")) == NULL) || r; return r; } #endif /* EGL_ANDROID_presentation_time */ #ifdef EGL_ANGLE_query_surface_pointer static GLboolean _glewInit_EGL_ANGLE_query_surface_pointer () { GLboolean r = GL_FALSE; r = ((eglQuerySurfacePointerANGLE = (PFNEGLQUERYSURFACEPOINTERANGLEPROC)glewGetProcAddress((const GLubyte*)"eglQuerySurfacePointerANGLE")) == NULL) || r; return r; } #endif /* EGL_ANGLE_query_surface_pointer */ #ifdef EGL_EXT_device_enumeration static GLboolean _glewInit_EGL_EXT_device_enumeration () { GLboolean r = GL_FALSE; r = ((eglQueryDevicesEXT = (PFNEGLQUERYDEVICESEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDevicesEXT")) == NULL) || r; return r; } #endif /* EGL_EXT_device_enumeration */ #ifdef EGL_EXT_device_query static GLboolean _glewInit_EGL_EXT_device_query () { GLboolean r = GL_FALSE; r = ((eglQueryDeviceAttribEXT = (PFNEGLQUERYDEVICEATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDeviceAttribEXT")) == NULL) || r; r = ((eglQueryDeviceStringEXT = (PFNEGLQUERYDEVICESTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDeviceStringEXT")) == NULL) || r; r = ((eglQueryDisplayAttribEXT = (PFNEGLQUERYDISPLAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDisplayAttribEXT")) == NULL) || r; return r; } #endif /* EGL_EXT_device_query */ #ifdef EGL_EXT_image_dma_buf_import_modifiers static GLboolean _glewInit_EGL_EXT_image_dma_buf_import_modifiers () { GLboolean r = GL_FALSE; r = ((eglQueryDmaBufFormatsEXT = (PFNEGLQUERYDMABUFFORMATSEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDmaBufFormatsEXT")) == NULL) || r; r = ((eglQueryDmaBufModifiersEXT = (PFNEGLQUERYDMABUFMODIFIERSEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDmaBufModifiersEXT")) == NULL) || r; return r; } #endif /* EGL_EXT_image_dma_buf_import_modifiers */ #ifdef EGL_EXT_output_base static GLboolean _glewInit_EGL_EXT_output_base () { GLboolean r = GL_FALSE; r = ((eglGetOutputLayersEXT = (PFNEGLGETOUTPUTLAYERSEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetOutputLayersEXT")) == NULL) || r; r = ((eglGetOutputPortsEXT = (PFNEGLGETOUTPUTPORTSEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetOutputPortsEXT")) == NULL) || r; r = ((eglOutputLayerAttribEXT = (PFNEGLOUTPUTLAYERATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglOutputLayerAttribEXT")) == NULL) || r; r = ((eglOutputPortAttribEXT = (PFNEGLOUTPUTPORTATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglOutputPortAttribEXT")) == NULL) || r; r = ((eglQueryOutputLayerAttribEXT = (PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputLayerAttribEXT")) == NULL) || r; r = ((eglQueryOutputLayerStringEXT = (PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputLayerStringEXT")) == NULL) || r; r = ((eglQueryOutputPortAttribEXT = (PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputPortAttribEXT")) == NULL) || r; r = ((eglQueryOutputPortStringEXT = (PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputPortStringEXT")) == NULL) || r; return r; } #endif /* EGL_EXT_output_base */ #ifdef EGL_EXT_platform_base static GLboolean _glewInit_EGL_EXT_platform_base () { GLboolean r = GL_FALSE; r = ((eglCreatePlatformPixmapSurfaceEXT = (PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformPixmapSurfaceEXT")) == NULL) || r; r = ((eglCreatePlatformWindowSurfaceEXT = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformWindowSurfaceEXT")) == NULL) || r; r = ((eglGetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetPlatformDisplayEXT")) == NULL) || r; return r; } #endif /* EGL_EXT_platform_base */ #ifdef EGL_EXT_stream_consumer_egloutput static GLboolean _glewInit_EGL_EXT_stream_consumer_egloutput () { GLboolean r = GL_FALSE; r = ((eglStreamConsumerOutputEXT = (PFNEGLSTREAMCONSUMEROUTPUTEXTPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerOutputEXT")) == NULL) || r; return r; } #endif /* EGL_EXT_stream_consumer_egloutput */ #ifdef EGL_EXT_swap_buffers_with_damage static GLboolean _glewInit_EGL_EXT_swap_buffers_with_damage () { GLboolean r = GL_FALSE; r = ((eglSwapBuffersWithDamageEXT = (PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersWithDamageEXT")) == NULL) || r; return r; } #endif /* EGL_EXT_swap_buffers_with_damage */ #ifdef EGL_HI_clientpixmap static GLboolean _glewInit_EGL_HI_clientpixmap () { GLboolean r = GL_FALSE; r = ((eglCreatePixmapSurfaceHI = (PFNEGLCREATEPIXMAPSURFACEHIPROC)glewGetProcAddress((const GLubyte*)"eglCreatePixmapSurfaceHI")) == NULL) || r; return r; } #endif /* EGL_HI_clientpixmap */ #ifdef EGL_KHR_cl_event2 static GLboolean _glewInit_EGL_KHR_cl_event2 () { GLboolean r = GL_FALSE; r = ((eglCreateSync64KHR = (PFNEGLCREATESYNC64KHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateSync64KHR")) == NULL) || r; return r; } #endif /* EGL_KHR_cl_event2 */ #ifdef EGL_KHR_debug static GLboolean _glewInit_EGL_KHR_debug () { GLboolean r = GL_FALSE; r = ((eglDebugMessageControlKHR = (PFNEGLDEBUGMESSAGECONTROLKHRPROC)glewGetProcAddress((const GLubyte*)"eglDebugMessageControlKHR")) == NULL) || r; r = ((eglLabelObjectKHR = (PFNEGLLABELOBJECTKHRPROC)glewGetProcAddress((const GLubyte*)"eglLabelObjectKHR")) == NULL) || r; r = ((eglQueryDebugKHR = (PFNEGLQUERYDEBUGKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryDebugKHR")) == NULL) || r; return r; } #endif /* EGL_KHR_debug */ #ifdef EGL_KHR_image static GLboolean _glewInit_EGL_KHR_image () { GLboolean r = GL_FALSE; r = ((eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateImageKHR")) == NULL) || r; r = ((eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC)glewGetProcAddress((const GLubyte*)"eglDestroyImageKHR")) == NULL) || r; return r; } #endif /* EGL_KHR_image */ #ifdef EGL_KHR_lock_surface static GLboolean _glewInit_EGL_KHR_lock_surface () { GLboolean r = GL_FALSE; r = ((eglLockSurfaceKHR = (PFNEGLLOCKSURFACEKHRPROC)glewGetProcAddress((const GLubyte*)"eglLockSurfaceKHR")) == NULL) || r; r = ((eglUnlockSurfaceKHR = (PFNEGLUNLOCKSURFACEKHRPROC)glewGetProcAddress((const GLubyte*)"eglUnlockSurfaceKHR")) == NULL) || r; return r; } #endif /* EGL_KHR_lock_surface */ #ifdef EGL_KHR_lock_surface3 static GLboolean _glewInit_EGL_KHR_lock_surface3 () { GLboolean r = GL_FALSE; r = ((eglQuerySurface64KHR = (PFNEGLQUERYSURFACE64KHRPROC)glewGetProcAddress((const GLubyte*)"eglQuerySurface64KHR")) == NULL) || r; return r; } #endif /* EGL_KHR_lock_surface3 */ #ifdef EGL_KHR_partial_update static GLboolean _glewInit_EGL_KHR_partial_update () { GLboolean r = GL_FALSE; r = ((eglSetDamageRegionKHR = (PFNEGLSETDAMAGEREGIONKHRPROC)glewGetProcAddress((const GLubyte*)"eglSetDamageRegionKHR")) == NULL) || r; return r; } #endif /* EGL_KHR_partial_update */ #ifdef EGL_KHR_reusable_sync static GLboolean _glewInit_EGL_KHR_reusable_sync () { GLboolean r = GL_FALSE; r = ((eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglClientWaitSyncKHR")) == NULL) || r; r = ((eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateSyncKHR")) == NULL) || r; r = ((eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglDestroySyncKHR")) == NULL) || r; r = ((eglGetSyncAttribKHR = (PFNEGLGETSYNCATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglGetSyncAttribKHR")) == NULL) || r; r = ((eglSignalSyncKHR = (PFNEGLSIGNALSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglSignalSyncKHR")) == NULL) || r; return r; } #endif /* EGL_KHR_reusable_sync */ #ifdef EGL_KHR_stream static GLboolean _glewInit_EGL_KHR_stream () { GLboolean r = GL_FALSE; r = ((eglCreateStreamKHR = (PFNEGLCREATESTREAMKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamKHR")) == NULL) || r; r = ((eglDestroyStreamKHR = (PFNEGLDESTROYSTREAMKHRPROC)glewGetProcAddress((const GLubyte*)"eglDestroyStreamKHR")) == NULL) || r; r = ((eglQueryStreamKHR = (PFNEGLQUERYSTREAMKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamKHR")) == NULL) || r; r = ((eglQueryStreamu64KHR = (PFNEGLQUERYSTREAMU64KHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamu64KHR")) == NULL) || r; r = ((eglStreamAttribKHR = (PFNEGLSTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamAttribKHR")) == NULL) || r; return r; } #endif /* EGL_KHR_stream */ #ifdef EGL_KHR_stream_attrib static GLboolean _glewInit_EGL_KHR_stream_attrib () { GLboolean r = GL_FALSE; r = ((eglCreateStreamAttribKHR = (PFNEGLCREATESTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamAttribKHR")) == NULL) || r; r = ((eglQueryStreamAttribKHR = (PFNEGLQUERYSTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamAttribKHR")) == NULL) || r; r = ((eglSetStreamAttribKHR = (PFNEGLSETSTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglSetStreamAttribKHR")) == NULL) || r; r = ((eglStreamConsumerAcquireAttribKHR = (PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerAcquireAttribKHR")) == NULL) || r; r = ((eglStreamConsumerReleaseAttribKHR = (PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerReleaseAttribKHR")) == NULL) || r; return r; } #endif /* EGL_KHR_stream_attrib */ #ifdef EGL_KHR_stream_consumer_gltexture static GLboolean _glewInit_EGL_KHR_stream_consumer_gltexture () { GLboolean r = GL_FALSE; r = ((eglStreamConsumerAcquireKHR = (PFNEGLSTREAMCONSUMERACQUIREKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerAcquireKHR")) == NULL) || r; r = ((eglStreamConsumerGLTextureExternalKHR = (PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerGLTextureExternalKHR")) == NULL) || r; r = ((eglStreamConsumerReleaseKHR = (PFNEGLSTREAMCONSUMERRELEASEKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerReleaseKHR")) == NULL) || r; return r; } #endif /* EGL_KHR_stream_consumer_gltexture */ #ifdef EGL_KHR_stream_cross_process_fd static GLboolean _glewInit_EGL_KHR_stream_cross_process_fd () { GLboolean r = GL_FALSE; r = ((eglCreateStreamFromFileDescriptorKHR = (PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamFromFileDescriptorKHR")) == NULL) || r; r = ((eglGetStreamFileDescriptorKHR = (PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC)glewGetProcAddress((const GLubyte*)"eglGetStreamFileDescriptorKHR")) == NULL) || r; return r; } #endif /* EGL_KHR_stream_cross_process_fd */ #ifdef EGL_KHR_stream_fifo static GLboolean _glewInit_EGL_KHR_stream_fifo () { GLboolean r = GL_FALSE; r = ((eglQueryStreamTimeKHR = (PFNEGLQUERYSTREAMTIMEKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamTimeKHR")) == NULL) || r; return r; } #endif /* EGL_KHR_stream_fifo */ #ifdef EGL_KHR_stream_producer_eglsurface static GLboolean _glewInit_EGL_KHR_stream_producer_eglsurface () { GLboolean r = GL_FALSE; r = ((eglCreateStreamProducerSurfaceKHR = (PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamProducerSurfaceKHR")) == NULL) || r; return r; } #endif /* EGL_KHR_stream_producer_eglsurface */ #ifdef EGL_KHR_swap_buffers_with_damage static GLboolean _glewInit_EGL_KHR_swap_buffers_with_damage () { GLboolean r = GL_FALSE; r = ((eglSwapBuffersWithDamageKHR = (PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersWithDamageKHR")) == NULL) || r; return r; } #endif /* EGL_KHR_swap_buffers_with_damage */ #ifdef EGL_KHR_wait_sync static GLboolean _glewInit_EGL_KHR_wait_sync () { GLboolean r = GL_FALSE; r = ((eglWaitSyncKHR = (PFNEGLWAITSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglWaitSyncKHR")) == NULL) || r; return r; } #endif /* EGL_KHR_wait_sync */ #ifdef EGL_MESA_drm_image static GLboolean _glewInit_EGL_MESA_drm_image () { GLboolean r = GL_FALSE; r = ((eglCreateDRMImageMESA = (PFNEGLCREATEDRMIMAGEMESAPROC)glewGetProcAddress((const GLubyte*)"eglCreateDRMImageMESA")) == NULL) || r; r = ((eglExportDRMImageMESA = (PFNEGLEXPORTDRMIMAGEMESAPROC)glewGetProcAddress((const GLubyte*)"eglExportDRMImageMESA")) == NULL) || r; return r; } #endif /* EGL_MESA_drm_image */ #ifdef EGL_MESA_image_dma_buf_export static GLboolean _glewInit_EGL_MESA_image_dma_buf_export () { GLboolean r = GL_FALSE; r = ((eglExportDMABUFImageMESA = (PFNEGLEXPORTDMABUFIMAGEMESAPROC)glewGetProcAddress((const GLubyte*)"eglExportDMABUFImageMESA")) == NULL) || r; r = ((eglExportDMABUFImageQueryMESA = (PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC)glewGetProcAddress((const GLubyte*)"eglExportDMABUFImageQueryMESA")) == NULL) || r; return r; } #endif /* EGL_MESA_image_dma_buf_export */ #ifdef EGL_NOK_swap_region static GLboolean _glewInit_EGL_NOK_swap_region () { GLboolean r = GL_FALSE; r = ((eglSwapBuffersRegionNOK = (PFNEGLSWAPBUFFERSREGIONNOKPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersRegionNOK")) == NULL) || r; return r; } #endif /* EGL_NOK_swap_region */ #ifdef EGL_NOK_swap_region2 static GLboolean _glewInit_EGL_NOK_swap_region2 () { GLboolean r = GL_FALSE; r = ((eglSwapBuffersRegion2NOK = (PFNEGLSWAPBUFFERSREGION2NOKPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersRegion2NOK")) == NULL) || r; return r; } #endif /* EGL_NOK_swap_region2 */ #ifdef EGL_NV_native_query static GLboolean _glewInit_EGL_NV_native_query () { GLboolean r = GL_FALSE; r = ((eglQueryNativeDisplayNV = (PFNEGLQUERYNATIVEDISPLAYNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryNativeDisplayNV")) == NULL) || r; r = ((eglQueryNativePixmapNV = (PFNEGLQUERYNATIVEPIXMAPNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryNativePixmapNV")) == NULL) || r; r = ((eglQueryNativeWindowNV = (PFNEGLQUERYNATIVEWINDOWNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryNativeWindowNV")) == NULL) || r; return r; } #endif /* EGL_NV_native_query */ #ifdef EGL_NV_post_sub_buffer static GLboolean _glewInit_EGL_NV_post_sub_buffer () { GLboolean r = GL_FALSE; r = ((eglPostSubBufferNV = (PFNEGLPOSTSUBBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"eglPostSubBufferNV")) == NULL) || r; return r; } #endif /* EGL_NV_post_sub_buffer */ #ifdef EGL_NV_stream_consumer_gltexture_yuv static GLboolean _glewInit_EGL_NV_stream_consumer_gltexture_yuv () { GLboolean r = GL_FALSE; r = ((eglStreamConsumerGLTextureExternalAttribsNV = (PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerGLTextureExternalAttribsNV")) == NULL) || r; return r; } #endif /* EGL_NV_stream_consumer_gltexture_yuv */ #ifdef EGL_NV_stream_metadata static GLboolean _glewInit_EGL_NV_stream_metadata () { GLboolean r = GL_FALSE; r = ((eglQueryDisplayAttribNV = (PFNEGLQUERYDISPLAYATTRIBNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryDisplayAttribNV")) == NULL) || r; r = ((eglQueryStreamMetadataNV = (PFNEGLQUERYSTREAMMETADATANVPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamMetadataNV")) == NULL) || r; r = ((eglSetStreamMetadataNV = (PFNEGLSETSTREAMMETADATANVPROC)glewGetProcAddress((const GLubyte*)"eglSetStreamMetadataNV")) == NULL) || r; return r; } #endif /* EGL_NV_stream_metadata */ #ifdef EGL_NV_stream_reset static GLboolean _glewInit_EGL_NV_stream_reset () { GLboolean r = GL_FALSE; r = ((eglResetStreamNV = (PFNEGLRESETSTREAMNVPROC)glewGetProcAddress((const GLubyte*)"eglResetStreamNV")) == NULL) || r; return r; } #endif /* EGL_NV_stream_reset */ #ifdef EGL_NV_stream_sync static GLboolean _glewInit_EGL_NV_stream_sync () { GLboolean r = GL_FALSE; r = ((eglCreateStreamSyncNV = (PFNEGLCREATESTREAMSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamSyncNV")) == NULL) || r; return r; } #endif /* EGL_NV_stream_sync */ #ifdef EGL_NV_sync static GLboolean _glewInit_EGL_NV_sync () { GLboolean r = GL_FALSE; r = ((eglClientWaitSyncNV = (PFNEGLCLIENTWAITSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglClientWaitSyncNV")) == NULL) || r; r = ((eglCreateFenceSyncNV = (PFNEGLCREATEFENCESYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglCreateFenceSyncNV")) == NULL) || r; r = ((eglDestroySyncNV = (PFNEGLDESTROYSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglDestroySyncNV")) == NULL) || r; r = ((eglFenceNV = (PFNEGLFENCENVPROC)glewGetProcAddress((const GLubyte*)"eglFenceNV")) == NULL) || r; r = ((eglGetSyncAttribNV = (PFNEGLGETSYNCATTRIBNVPROC)glewGetProcAddress((const GLubyte*)"eglGetSyncAttribNV")) == NULL) || r; r = ((eglSignalSyncNV = (PFNEGLSIGNALSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglSignalSyncNV")) == NULL) || r; return r; } #endif /* EGL_NV_sync */ #ifdef EGL_NV_system_time static GLboolean _glewInit_EGL_NV_system_time () { GLboolean r = GL_FALSE; r = ((eglGetSystemTimeFrequencyNV = (PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC)glewGetProcAddress((const GLubyte*)"eglGetSystemTimeFrequencyNV")) == NULL) || r; r = ((eglGetSystemTimeNV = (PFNEGLGETSYSTEMTIMENVPROC)glewGetProcAddress((const GLubyte*)"eglGetSystemTimeNV")) == NULL) || r; return r; } #endif /* EGL_NV_system_time */ /* ------------------------------------------------------------------------ */ GLboolean eglewGetExtension (const char* name) { const GLubyte* start; const GLubyte* end; start = (const GLubyte*) eglQueryString(eglGetCurrentDisplay(), EGL_EXTENSIONS); if (0 == start) return GL_FALSE; end = start + _glewStrLen(start); return _glewSearchExtension(name, start, end); } GLenum eglewInit (EGLDisplay display) { EGLint major, minor; const GLubyte* extStart; const GLubyte* extEnd; PFNEGLINITIALIZEPROC initialize = NULL; PFNEGLQUERYSTRINGPROC queryString = NULL; /* Load necessary entry points */ initialize = (PFNEGLINITIALIZEPROC) glewGetProcAddress("eglInitialize"); queryString = (PFNEGLQUERYSTRINGPROC) glewGetProcAddress("eglQueryString"); if (!initialize || !queryString) return 1; /* query EGK version */ if (initialize(display, &major, &minor) != EGL_TRUE) return 1; EGLEW_VERSION_1_5 = ( major > 1 ) || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; EGLEW_VERSION_1_4 = EGLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; EGLEW_VERSION_1_3 = EGLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; EGLEW_VERSION_1_2 = EGLEW_VERSION_1_3 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; EGLEW_VERSION_1_1 = EGLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; EGLEW_VERSION_1_0 = EGLEW_VERSION_1_1 == GL_TRUE || ( major == 1 && minor >= 0 ) ? GL_TRUE : GL_FALSE; /* query EGL extension string */ extStart = (const GLubyte*) queryString(display, EGL_EXTENSIONS); if (extStart == 0) extStart = (const GLubyte *)""; extEnd = extStart + _glewStrLen(extStart); /* initialize extensions */ #ifdef EGL_VERSION_1_0 if (glewExperimental || EGLEW_VERSION_1_0) EGLEW_VERSION_1_0 = !_glewInit_EGL_VERSION_1_0(); #endif /* EGL_VERSION_1_0 */ #ifdef EGL_VERSION_1_1 if (glewExperimental || EGLEW_VERSION_1_1) EGLEW_VERSION_1_1 = !_glewInit_EGL_VERSION_1_1(); #endif /* EGL_VERSION_1_1 */ #ifdef EGL_VERSION_1_2 if (glewExperimental || EGLEW_VERSION_1_2) EGLEW_VERSION_1_2 = !_glewInit_EGL_VERSION_1_2(); #endif /* EGL_VERSION_1_2 */ #ifdef EGL_VERSION_1_4 if (glewExperimental || EGLEW_VERSION_1_4) EGLEW_VERSION_1_4 = !_glewInit_EGL_VERSION_1_4(); #endif /* EGL_VERSION_1_4 */ #ifdef EGL_VERSION_1_5 if (glewExperimental || EGLEW_VERSION_1_5) EGLEW_VERSION_1_5 = !_glewInit_EGL_VERSION_1_5(); #endif /* EGL_VERSION_1_5 */ #ifdef EGL_ANDROID_blob_cache EGLEW_ANDROID_blob_cache = _glewSearchExtension("EGL_ANDROID_blob_cache", extStart, extEnd); if (glewExperimental || EGLEW_ANDROID_blob_cache) EGLEW_ANDROID_blob_cache = !_glewInit_EGL_ANDROID_blob_cache(); #endif /* EGL_ANDROID_blob_cache */ #ifdef EGL_ANDROID_create_native_client_buffer EGLEW_ANDROID_create_native_client_buffer = _glewSearchExtension("EGL_ANDROID_create_native_client_buffer", extStart, extEnd); if (glewExperimental || EGLEW_ANDROID_create_native_client_buffer) EGLEW_ANDROID_create_native_client_buffer = !_glewInit_EGL_ANDROID_create_native_client_buffer(); #endif /* EGL_ANDROID_create_native_client_buffer */ #ifdef EGL_ANDROID_framebuffer_target EGLEW_ANDROID_framebuffer_target = _glewSearchExtension("EGL_ANDROID_framebuffer_target", extStart, extEnd); #endif /* EGL_ANDROID_framebuffer_target */ #ifdef EGL_ANDROID_front_buffer_auto_refresh EGLEW_ANDROID_front_buffer_auto_refresh = _glewSearchExtension("EGL_ANDROID_front_buffer_auto_refresh", extStart, extEnd); #endif /* EGL_ANDROID_front_buffer_auto_refresh */ #ifdef EGL_ANDROID_image_native_buffer EGLEW_ANDROID_image_native_buffer = _glewSearchExtension("EGL_ANDROID_image_native_buffer", extStart, extEnd); #endif /* EGL_ANDROID_image_native_buffer */ #ifdef EGL_ANDROID_native_fence_sync EGLEW_ANDROID_native_fence_sync = _glewSearchExtension("EGL_ANDROID_native_fence_sync", extStart, extEnd); if (glewExperimental || EGLEW_ANDROID_native_fence_sync) EGLEW_ANDROID_native_fence_sync = !_glewInit_EGL_ANDROID_native_fence_sync(); #endif /* EGL_ANDROID_native_fence_sync */ #ifdef EGL_ANDROID_presentation_time EGLEW_ANDROID_presentation_time = _glewSearchExtension("EGL_ANDROID_presentation_time", extStart, extEnd); if (glewExperimental || EGLEW_ANDROID_presentation_time) EGLEW_ANDROID_presentation_time = !_glewInit_EGL_ANDROID_presentation_time(); #endif /* EGL_ANDROID_presentation_time */ #ifdef EGL_ANDROID_recordable EGLEW_ANDROID_recordable = _glewSearchExtension("EGL_ANDROID_recordable", extStart, extEnd); #endif /* EGL_ANDROID_recordable */ #ifdef EGL_ANGLE_d3d_share_handle_client_buffer EGLEW_ANGLE_d3d_share_handle_client_buffer = _glewSearchExtension("EGL_ANGLE_d3d_share_handle_client_buffer", extStart, extEnd); #endif /* EGL_ANGLE_d3d_share_handle_client_buffer */ #ifdef EGL_ANGLE_device_d3d EGLEW_ANGLE_device_d3d = _glewSearchExtension("EGL_ANGLE_device_d3d", extStart, extEnd); #endif /* EGL_ANGLE_device_d3d */ #ifdef EGL_ANGLE_query_surface_pointer EGLEW_ANGLE_query_surface_pointer = _glewSearchExtension("EGL_ANGLE_query_surface_pointer", extStart, extEnd); if (glewExperimental || EGLEW_ANGLE_query_surface_pointer) EGLEW_ANGLE_query_surface_pointer = !_glewInit_EGL_ANGLE_query_surface_pointer(); #endif /* EGL_ANGLE_query_surface_pointer */ #ifdef EGL_ANGLE_surface_d3d_texture_2d_share_handle EGLEW_ANGLE_surface_d3d_texture_2d_share_handle = _glewSearchExtension("EGL_ANGLE_surface_d3d_texture_2d_share_handle", extStart, extEnd); #endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */ #ifdef EGL_ANGLE_window_fixed_size EGLEW_ANGLE_window_fixed_size = _glewSearchExtension("EGL_ANGLE_window_fixed_size", extStart, extEnd); #endif /* EGL_ANGLE_window_fixed_size */ #ifdef EGL_ARM_implicit_external_sync EGLEW_ARM_implicit_external_sync = _glewSearchExtension("EGL_ARM_implicit_external_sync", extStart, extEnd); #endif /* EGL_ARM_implicit_external_sync */ #ifdef EGL_ARM_pixmap_multisample_discard EGLEW_ARM_pixmap_multisample_discard = _glewSearchExtension("EGL_ARM_pixmap_multisample_discard", extStart, extEnd); #endif /* EGL_ARM_pixmap_multisample_discard */ #ifdef EGL_EXT_buffer_age EGLEW_EXT_buffer_age = _glewSearchExtension("EGL_EXT_buffer_age", extStart, extEnd); #endif /* EGL_EXT_buffer_age */ #ifdef EGL_EXT_client_extensions EGLEW_EXT_client_extensions = _glewSearchExtension("EGL_EXT_client_extensions", extStart, extEnd); #endif /* EGL_EXT_client_extensions */ #ifdef EGL_EXT_create_context_robustness EGLEW_EXT_create_context_robustness = _glewSearchExtension("EGL_EXT_create_context_robustness", extStart, extEnd); #endif /* EGL_EXT_create_context_robustness */ #ifdef EGL_EXT_device_base EGLEW_EXT_device_base = _glewSearchExtension("EGL_EXT_device_base", extStart, extEnd); #endif /* EGL_EXT_device_base */ #ifdef EGL_EXT_device_drm EGLEW_EXT_device_drm = _glewSearchExtension("EGL_EXT_device_drm", extStart, extEnd); #endif /* EGL_EXT_device_drm */ #ifdef EGL_EXT_device_enumeration EGLEW_EXT_device_enumeration = _glewSearchExtension("EGL_EXT_device_enumeration", extStart, extEnd); if (glewExperimental || EGLEW_EXT_device_enumeration) EGLEW_EXT_device_enumeration = !_glewInit_EGL_EXT_device_enumeration(); #endif /* EGL_EXT_device_enumeration */ #ifdef EGL_EXT_device_openwf EGLEW_EXT_device_openwf = _glewSearchExtension("EGL_EXT_device_openwf", extStart, extEnd); #endif /* EGL_EXT_device_openwf */ #ifdef EGL_EXT_device_query EGLEW_EXT_device_query = _glewSearchExtension("EGL_EXT_device_query", extStart, extEnd); if (glewExperimental || EGLEW_EXT_device_query) EGLEW_EXT_device_query = !_glewInit_EGL_EXT_device_query(); #endif /* EGL_EXT_device_query */ #ifdef EGL_EXT_gl_colorspace_bt2020_linear EGLEW_EXT_gl_colorspace_bt2020_linear = _glewSearchExtension("EGL_EXT_gl_colorspace_bt2020_linear", extStart, extEnd); #endif /* EGL_EXT_gl_colorspace_bt2020_linear */ #ifdef EGL_EXT_gl_colorspace_bt2020_pq EGLEW_EXT_gl_colorspace_bt2020_pq = _glewSearchExtension("EGL_EXT_gl_colorspace_bt2020_pq", extStart, extEnd); #endif /* EGL_EXT_gl_colorspace_bt2020_pq */ #ifdef EGL_EXT_gl_colorspace_scrgb_linear EGLEW_EXT_gl_colorspace_scrgb_linear = _glewSearchExtension("EGL_EXT_gl_colorspace_scrgb_linear", extStart, extEnd); #endif /* EGL_EXT_gl_colorspace_scrgb_linear */ #ifdef EGL_EXT_image_dma_buf_import EGLEW_EXT_image_dma_buf_import = _glewSearchExtension("EGL_EXT_image_dma_buf_import", extStart, extEnd); #endif /* EGL_EXT_image_dma_buf_import */ #ifdef EGL_EXT_image_dma_buf_import_modifiers EGLEW_EXT_image_dma_buf_import_modifiers = _glewSearchExtension("EGL_EXT_image_dma_buf_import_modifiers", extStart, extEnd); if (glewExperimental || EGLEW_EXT_image_dma_buf_import_modifiers) EGLEW_EXT_image_dma_buf_import_modifiers = !_glewInit_EGL_EXT_image_dma_buf_import_modifiers(); #endif /* EGL_EXT_image_dma_buf_import_modifiers */ #ifdef EGL_EXT_multiview_window EGLEW_EXT_multiview_window = _glewSearchExtension("EGL_EXT_multiview_window", extStart, extEnd); #endif /* EGL_EXT_multiview_window */ #ifdef EGL_EXT_output_base EGLEW_EXT_output_base = _glewSearchExtension("EGL_EXT_output_base", extStart, extEnd); if (glewExperimental || EGLEW_EXT_output_base) EGLEW_EXT_output_base = !_glewInit_EGL_EXT_output_base(); #endif /* EGL_EXT_output_base */ #ifdef EGL_EXT_output_drm EGLEW_EXT_output_drm = _glewSearchExtension("EGL_EXT_output_drm", extStart, extEnd); #endif /* EGL_EXT_output_drm */ #ifdef EGL_EXT_output_openwf EGLEW_EXT_output_openwf = _glewSearchExtension("EGL_EXT_output_openwf", extStart, extEnd); #endif /* EGL_EXT_output_openwf */ #ifdef EGL_EXT_pixel_format_float EGLEW_EXT_pixel_format_float = _glewSearchExtension("EGL_EXT_pixel_format_float", extStart, extEnd); #endif /* EGL_EXT_pixel_format_float */ #ifdef EGL_EXT_platform_base EGLEW_EXT_platform_base = _glewSearchExtension("EGL_EXT_platform_base", extStart, extEnd); if (glewExperimental || EGLEW_EXT_platform_base) EGLEW_EXT_platform_base = !_glewInit_EGL_EXT_platform_base(); #endif /* EGL_EXT_platform_base */ #ifdef EGL_EXT_platform_device EGLEW_EXT_platform_device = _glewSearchExtension("EGL_EXT_platform_device", extStart, extEnd); #endif /* EGL_EXT_platform_device */ #ifdef EGL_EXT_platform_wayland EGLEW_EXT_platform_wayland = _glewSearchExtension("EGL_EXT_platform_wayland", extStart, extEnd); #endif /* EGL_EXT_platform_wayland */ #ifdef EGL_EXT_platform_x11 EGLEW_EXT_platform_x11 = _glewSearchExtension("EGL_EXT_platform_x11", extStart, extEnd); #endif /* EGL_EXT_platform_x11 */ #ifdef EGL_EXT_protected_content EGLEW_EXT_protected_content = _glewSearchExtension("EGL_EXT_protected_content", extStart, extEnd); #endif /* EGL_EXT_protected_content */ #ifdef EGL_EXT_protected_surface EGLEW_EXT_protected_surface = _glewSearchExtension("EGL_EXT_protected_surface", extStart, extEnd); #endif /* EGL_EXT_protected_surface */ #ifdef EGL_EXT_stream_consumer_egloutput EGLEW_EXT_stream_consumer_egloutput = _glewSearchExtension("EGL_EXT_stream_consumer_egloutput", extStart, extEnd); if (glewExperimental || EGLEW_EXT_stream_consumer_egloutput) EGLEW_EXT_stream_consumer_egloutput = !_glewInit_EGL_EXT_stream_consumer_egloutput(); #endif /* EGL_EXT_stream_consumer_egloutput */ #ifdef EGL_EXT_surface_SMPTE2086_metadata EGLEW_EXT_surface_SMPTE2086_metadata = _glewSearchExtension("EGL_EXT_surface_SMPTE2086_metadata", extStart, extEnd); #endif /* EGL_EXT_surface_SMPTE2086_metadata */ #ifdef EGL_EXT_swap_buffers_with_damage EGLEW_EXT_swap_buffers_with_damage = _glewSearchExtension("EGL_EXT_swap_buffers_with_damage", extStart, extEnd); if (glewExperimental || EGLEW_EXT_swap_buffers_with_damage) EGLEW_EXT_swap_buffers_with_damage = !_glewInit_EGL_EXT_swap_buffers_with_damage(); #endif /* EGL_EXT_swap_buffers_with_damage */ #ifdef EGL_EXT_yuv_surface EGLEW_EXT_yuv_surface = _glewSearchExtension("EGL_EXT_yuv_surface", extStart, extEnd); #endif /* EGL_EXT_yuv_surface */ #ifdef EGL_HI_clientpixmap EGLEW_HI_clientpixmap = _glewSearchExtension("EGL_HI_clientpixmap", extStart, extEnd); if (glewExperimental || EGLEW_HI_clientpixmap) EGLEW_HI_clientpixmap = !_glewInit_EGL_HI_clientpixmap(); #endif /* EGL_HI_clientpixmap */ #ifdef EGL_HI_colorformats EGLEW_HI_colorformats = _glewSearchExtension("EGL_HI_colorformats", extStart, extEnd); #endif /* EGL_HI_colorformats */ #ifdef EGL_IMG_context_priority EGLEW_IMG_context_priority = _glewSearchExtension("EGL_IMG_context_priority", extStart, extEnd); #endif /* EGL_IMG_context_priority */ #ifdef EGL_IMG_image_plane_attribs EGLEW_IMG_image_plane_attribs = _glewSearchExtension("EGL_IMG_image_plane_attribs", extStart, extEnd); #endif /* EGL_IMG_image_plane_attribs */ #ifdef EGL_KHR_cl_event EGLEW_KHR_cl_event = _glewSearchExtension("EGL_KHR_cl_event", extStart, extEnd); #endif /* EGL_KHR_cl_event */ #ifdef EGL_KHR_cl_event2 EGLEW_KHR_cl_event2 = _glewSearchExtension("EGL_KHR_cl_event2", extStart, extEnd); if (glewExperimental || EGLEW_KHR_cl_event2) EGLEW_KHR_cl_event2 = !_glewInit_EGL_KHR_cl_event2(); #endif /* EGL_KHR_cl_event2 */ #ifdef EGL_KHR_client_get_all_proc_addresses EGLEW_KHR_client_get_all_proc_addresses = _glewSearchExtension("EGL_KHR_client_get_all_proc_addresses", extStart, extEnd); #endif /* EGL_KHR_client_get_all_proc_addresses */ #ifdef EGL_KHR_config_attribs EGLEW_KHR_config_attribs = _glewSearchExtension("EGL_KHR_config_attribs", extStart, extEnd); #endif /* EGL_KHR_config_attribs */ #ifdef EGL_KHR_context_flush_control EGLEW_KHR_context_flush_control = _glewSearchExtension("EGL_KHR_context_flush_control", extStart, extEnd); #endif /* EGL_KHR_context_flush_control */ #ifdef EGL_KHR_create_context EGLEW_KHR_create_context = _glewSearchExtension("EGL_KHR_create_context", extStart, extEnd); #endif /* EGL_KHR_create_context */ #ifdef EGL_KHR_create_context_no_error EGLEW_KHR_create_context_no_error = _glewSearchExtension("EGL_KHR_create_context_no_error", extStart, extEnd); #endif /* EGL_KHR_create_context_no_error */ #ifdef EGL_KHR_debug EGLEW_KHR_debug = _glewSearchExtension("EGL_KHR_debug", extStart, extEnd); if (glewExperimental || EGLEW_KHR_debug) EGLEW_KHR_debug = !_glewInit_EGL_KHR_debug(); #endif /* EGL_KHR_debug */ #ifdef EGL_KHR_fence_sync EGLEW_KHR_fence_sync = _glewSearchExtension("EGL_KHR_fence_sync", extStart, extEnd); #endif /* EGL_KHR_fence_sync */ #ifdef EGL_KHR_get_all_proc_addresses EGLEW_KHR_get_all_proc_addresses = _glewSearchExtension("EGL_KHR_get_all_proc_addresses", extStart, extEnd); #endif /* EGL_KHR_get_all_proc_addresses */ #ifdef EGL_KHR_gl_colorspace EGLEW_KHR_gl_colorspace = _glewSearchExtension("EGL_KHR_gl_colorspace", extStart, extEnd); #endif /* EGL_KHR_gl_colorspace */ #ifdef EGL_KHR_gl_renderbuffer_image EGLEW_KHR_gl_renderbuffer_image = _glewSearchExtension("EGL_KHR_gl_renderbuffer_image", extStart, extEnd); #endif /* EGL_KHR_gl_renderbuffer_image */ #ifdef EGL_KHR_gl_texture_2D_image EGLEW_KHR_gl_texture_2D_image = _glewSearchExtension("EGL_KHR_gl_texture_2D_image", extStart, extEnd); #endif /* EGL_KHR_gl_texture_2D_image */ #ifdef EGL_KHR_gl_texture_3D_image EGLEW_KHR_gl_texture_3D_image = _glewSearchExtension("EGL_KHR_gl_texture_3D_image", extStart, extEnd); #endif /* EGL_KHR_gl_texture_3D_image */ #ifdef EGL_KHR_gl_texture_cubemap_image EGLEW_KHR_gl_texture_cubemap_image = _glewSearchExtension("EGL_KHR_gl_texture_cubemap_image", extStart, extEnd); #endif /* EGL_KHR_gl_texture_cubemap_image */ #ifdef EGL_KHR_image EGLEW_KHR_image = _glewSearchExtension("EGL_KHR_image", extStart, extEnd); if (glewExperimental || EGLEW_KHR_image) EGLEW_KHR_image = !_glewInit_EGL_KHR_image(); #endif /* EGL_KHR_image */ #ifdef EGL_KHR_image_base EGLEW_KHR_image_base = _glewSearchExtension("EGL_KHR_image_base", extStart, extEnd); #endif /* EGL_KHR_image_base */ #ifdef EGL_KHR_image_pixmap EGLEW_KHR_image_pixmap = _glewSearchExtension("EGL_KHR_image_pixmap", extStart, extEnd); #endif /* EGL_KHR_image_pixmap */ #ifdef EGL_KHR_lock_surface EGLEW_KHR_lock_surface = _glewSearchExtension("EGL_KHR_lock_surface", extStart, extEnd); if (glewExperimental || EGLEW_KHR_lock_surface) EGLEW_KHR_lock_surface = !_glewInit_EGL_KHR_lock_surface(); #endif /* EGL_KHR_lock_surface */ #ifdef EGL_KHR_lock_surface2 EGLEW_KHR_lock_surface2 = _glewSearchExtension("EGL_KHR_lock_surface2", extStart, extEnd); #endif /* EGL_KHR_lock_surface2 */ #ifdef EGL_KHR_lock_surface3 EGLEW_KHR_lock_surface3 = _glewSearchExtension("EGL_KHR_lock_surface3", extStart, extEnd); if (glewExperimental || EGLEW_KHR_lock_surface3) EGLEW_KHR_lock_surface3 = !_glewInit_EGL_KHR_lock_surface3(); #endif /* EGL_KHR_lock_surface3 */ #ifdef EGL_KHR_mutable_render_buffer EGLEW_KHR_mutable_render_buffer = _glewSearchExtension("EGL_KHR_mutable_render_buffer", extStart, extEnd); #endif /* EGL_KHR_mutable_render_buffer */ #ifdef EGL_KHR_no_config_context EGLEW_KHR_no_config_context = _glewSearchExtension("EGL_KHR_no_config_context", extStart, extEnd); #endif /* EGL_KHR_no_config_context */ #ifdef EGL_KHR_partial_update EGLEW_KHR_partial_update = _glewSearchExtension("EGL_KHR_partial_update", extStart, extEnd); if (glewExperimental || EGLEW_KHR_partial_update) EGLEW_KHR_partial_update = !_glewInit_EGL_KHR_partial_update(); #endif /* EGL_KHR_partial_update */ #ifdef EGL_KHR_platform_android EGLEW_KHR_platform_android = _glewSearchExtension("EGL_KHR_platform_android", extStart, extEnd); #endif /* EGL_KHR_platform_android */ #ifdef EGL_KHR_platform_gbm EGLEW_KHR_platform_gbm = _glewSearchExtension("EGL_KHR_platform_gbm", extStart, extEnd); #endif /* EGL_KHR_platform_gbm */ #ifdef EGL_KHR_platform_wayland EGLEW_KHR_platform_wayland = _glewSearchExtension("EGL_KHR_platform_wayland", extStart, extEnd); #endif /* EGL_KHR_platform_wayland */ #ifdef EGL_KHR_platform_x11 EGLEW_KHR_platform_x11 = _glewSearchExtension("EGL_KHR_platform_x11", extStart, extEnd); #endif /* EGL_KHR_platform_x11 */ #ifdef EGL_KHR_reusable_sync EGLEW_KHR_reusable_sync = _glewSearchExtension("EGL_KHR_reusable_sync", extStart, extEnd); if (glewExperimental || EGLEW_KHR_reusable_sync) EGLEW_KHR_reusable_sync = !_glewInit_EGL_KHR_reusable_sync(); #endif /* EGL_KHR_reusable_sync */ #ifdef EGL_KHR_stream EGLEW_KHR_stream = _glewSearchExtension("EGL_KHR_stream", extStart, extEnd); if (glewExperimental || EGLEW_KHR_stream) EGLEW_KHR_stream = !_glewInit_EGL_KHR_stream(); #endif /* EGL_KHR_stream */ #ifdef EGL_KHR_stream_attrib EGLEW_KHR_stream_attrib = _glewSearchExtension("EGL_KHR_stream_attrib", extStart, extEnd); if (glewExperimental || EGLEW_KHR_stream_attrib) EGLEW_KHR_stream_attrib = !_glewInit_EGL_KHR_stream_attrib(); #endif /* EGL_KHR_stream_attrib */ #ifdef EGL_KHR_stream_consumer_gltexture EGLEW_KHR_stream_consumer_gltexture = _glewSearchExtension("EGL_KHR_stream_consumer_gltexture", extStart, extEnd); if (glewExperimental || EGLEW_KHR_stream_consumer_gltexture) EGLEW_KHR_stream_consumer_gltexture = !_glewInit_EGL_KHR_stream_consumer_gltexture(); #endif /* EGL_KHR_stream_consumer_gltexture */ #ifdef EGL_KHR_stream_cross_process_fd EGLEW_KHR_stream_cross_process_fd = _glewSearchExtension("EGL_KHR_stream_cross_process_fd", extStart, extEnd); if (glewExperimental || EGLEW_KHR_stream_cross_process_fd) EGLEW_KHR_stream_cross_process_fd = !_glewInit_EGL_KHR_stream_cross_process_fd(); #endif /* EGL_KHR_stream_cross_process_fd */ #ifdef EGL_KHR_stream_fifo EGLEW_KHR_stream_fifo = _glewSearchExtension("EGL_KHR_stream_fifo", extStart, extEnd); if (glewExperimental || EGLEW_KHR_stream_fifo) EGLEW_KHR_stream_fifo = !_glewInit_EGL_KHR_stream_fifo(); #endif /* EGL_KHR_stream_fifo */ #ifdef EGL_KHR_stream_producer_aldatalocator EGLEW_KHR_stream_producer_aldatalocator = _glewSearchExtension("EGL_KHR_stream_producer_aldatalocator", extStart, extEnd); #endif /* EGL_KHR_stream_producer_aldatalocator */ #ifdef EGL_KHR_stream_producer_eglsurface EGLEW_KHR_stream_producer_eglsurface = _glewSearchExtension("EGL_KHR_stream_producer_eglsurface", extStart, extEnd); if (glewExperimental || EGLEW_KHR_stream_producer_eglsurface) EGLEW_KHR_stream_producer_eglsurface = !_glewInit_EGL_KHR_stream_producer_eglsurface(); #endif /* EGL_KHR_stream_producer_eglsurface */ #ifdef EGL_KHR_surfaceless_context EGLEW_KHR_surfaceless_context = _glewSearchExtension("EGL_KHR_surfaceless_context", extStart, extEnd); #endif /* EGL_KHR_surfaceless_context */ #ifdef EGL_KHR_swap_buffers_with_damage EGLEW_KHR_swap_buffers_with_damage = _glewSearchExtension("EGL_KHR_swap_buffers_with_damage", extStart, extEnd); if (glewExperimental || EGLEW_KHR_swap_buffers_with_damage) EGLEW_KHR_swap_buffers_with_damage = !_glewInit_EGL_KHR_swap_buffers_with_damage(); #endif /* EGL_KHR_swap_buffers_with_damage */ #ifdef EGL_KHR_vg_parent_image EGLEW_KHR_vg_parent_image = _glewSearchExtension("EGL_KHR_vg_parent_image", extStart, extEnd); #endif /* EGL_KHR_vg_parent_image */ #ifdef EGL_KHR_wait_sync EGLEW_KHR_wait_sync = _glewSearchExtension("EGL_KHR_wait_sync", extStart, extEnd); if (glewExperimental || EGLEW_KHR_wait_sync) EGLEW_KHR_wait_sync = !_glewInit_EGL_KHR_wait_sync(); #endif /* EGL_KHR_wait_sync */ #ifdef EGL_MESA_drm_image EGLEW_MESA_drm_image = _glewSearchExtension("EGL_MESA_drm_image", extStart, extEnd); if (glewExperimental || EGLEW_MESA_drm_image) EGLEW_MESA_drm_image = !_glewInit_EGL_MESA_drm_image(); #endif /* EGL_MESA_drm_image */ #ifdef EGL_MESA_image_dma_buf_export EGLEW_MESA_image_dma_buf_export = _glewSearchExtension("EGL_MESA_image_dma_buf_export", extStart, extEnd); if (glewExperimental || EGLEW_MESA_image_dma_buf_export) EGLEW_MESA_image_dma_buf_export = !_glewInit_EGL_MESA_image_dma_buf_export(); #endif /* EGL_MESA_image_dma_buf_export */ #ifdef EGL_MESA_platform_gbm EGLEW_MESA_platform_gbm = _glewSearchExtension("EGL_MESA_platform_gbm", extStart, extEnd); #endif /* EGL_MESA_platform_gbm */ #ifdef EGL_MESA_platform_surfaceless EGLEW_MESA_platform_surfaceless = _glewSearchExtension("EGL_MESA_platform_surfaceless", extStart, extEnd); #endif /* EGL_MESA_platform_surfaceless */ #ifdef EGL_NOK_swap_region EGLEW_NOK_swap_region = _glewSearchExtension("EGL_NOK_swap_region", extStart, extEnd); if (glewExperimental || EGLEW_NOK_swap_region) EGLEW_NOK_swap_region = !_glewInit_EGL_NOK_swap_region(); #endif /* EGL_NOK_swap_region */ #ifdef EGL_NOK_swap_region2 EGLEW_NOK_swap_region2 = _glewSearchExtension("EGL_NOK_swap_region2", extStart, extEnd); if (glewExperimental || EGLEW_NOK_swap_region2) EGLEW_NOK_swap_region2 = !_glewInit_EGL_NOK_swap_region2(); #endif /* EGL_NOK_swap_region2 */ #ifdef EGL_NOK_texture_from_pixmap EGLEW_NOK_texture_from_pixmap = _glewSearchExtension("EGL_NOK_texture_from_pixmap", extStart, extEnd); #endif /* EGL_NOK_texture_from_pixmap */ #ifdef EGL_NV_3dvision_surface EGLEW_NV_3dvision_surface = _glewSearchExtension("EGL_NV_3dvision_surface", extStart, extEnd); #endif /* EGL_NV_3dvision_surface */ #ifdef EGL_NV_coverage_sample EGLEW_NV_coverage_sample = _glewSearchExtension("EGL_NV_coverage_sample", extStart, extEnd); #endif /* EGL_NV_coverage_sample */ #ifdef EGL_NV_coverage_sample_resolve EGLEW_NV_coverage_sample_resolve = _glewSearchExtension("EGL_NV_coverage_sample_resolve", extStart, extEnd); #endif /* EGL_NV_coverage_sample_resolve */ #ifdef EGL_NV_cuda_event EGLEW_NV_cuda_event = _glewSearchExtension("EGL_NV_cuda_event", extStart, extEnd); #endif /* EGL_NV_cuda_event */ #ifdef EGL_NV_depth_nonlinear EGLEW_NV_depth_nonlinear = _glewSearchExtension("EGL_NV_depth_nonlinear", extStart, extEnd); #endif /* EGL_NV_depth_nonlinear */ #ifdef EGL_NV_device_cuda EGLEW_NV_device_cuda = _glewSearchExtension("EGL_NV_device_cuda", extStart, extEnd); #endif /* EGL_NV_device_cuda */ #ifdef EGL_NV_native_query EGLEW_NV_native_query = _glewSearchExtension("EGL_NV_native_query", extStart, extEnd); if (glewExperimental || EGLEW_NV_native_query) EGLEW_NV_native_query = !_glewInit_EGL_NV_native_query(); #endif /* EGL_NV_native_query */ #ifdef EGL_NV_post_convert_rounding EGLEW_NV_post_convert_rounding = _glewSearchExtension("EGL_NV_post_convert_rounding", extStart, extEnd); #endif /* EGL_NV_post_convert_rounding */ #ifdef EGL_NV_post_sub_buffer EGLEW_NV_post_sub_buffer = _glewSearchExtension("EGL_NV_post_sub_buffer", extStart, extEnd); if (glewExperimental || EGLEW_NV_post_sub_buffer) EGLEW_NV_post_sub_buffer = !_glewInit_EGL_NV_post_sub_buffer(); #endif /* EGL_NV_post_sub_buffer */ #ifdef EGL_NV_robustness_video_memory_purge EGLEW_NV_robustness_video_memory_purge = _glewSearchExtension("EGL_NV_robustness_video_memory_purge", extStart, extEnd); #endif /* EGL_NV_robustness_video_memory_purge */ #ifdef EGL_NV_stream_consumer_gltexture_yuv EGLEW_NV_stream_consumer_gltexture_yuv = _glewSearchExtension("EGL_NV_stream_consumer_gltexture_yuv", extStart, extEnd); if (glewExperimental || EGLEW_NV_stream_consumer_gltexture_yuv) EGLEW_NV_stream_consumer_gltexture_yuv = !_glewInit_EGL_NV_stream_consumer_gltexture_yuv(); #endif /* EGL_NV_stream_consumer_gltexture_yuv */ #ifdef EGL_NV_stream_cross_display EGLEW_NV_stream_cross_display = _glewSearchExtension("EGL_NV_stream_cross_display", extStart, extEnd); #endif /* EGL_NV_stream_cross_display */ #ifdef EGL_NV_stream_cross_object EGLEW_NV_stream_cross_object = _glewSearchExtension("EGL_NV_stream_cross_object", extStart, extEnd); #endif /* EGL_NV_stream_cross_object */ #ifdef EGL_NV_stream_cross_partition EGLEW_NV_stream_cross_partition = _glewSearchExtension("EGL_NV_stream_cross_partition", extStart, extEnd); #endif /* EGL_NV_stream_cross_partition */ #ifdef EGL_NV_stream_cross_process EGLEW_NV_stream_cross_process = _glewSearchExtension("EGL_NV_stream_cross_process", extStart, extEnd); #endif /* EGL_NV_stream_cross_process */ #ifdef EGL_NV_stream_cross_system EGLEW_NV_stream_cross_system = _glewSearchExtension("EGL_NV_stream_cross_system", extStart, extEnd); #endif /* EGL_NV_stream_cross_system */ #ifdef EGL_NV_stream_fifo_next EGLEW_NV_stream_fifo_next = _glewSearchExtension("EGL_NV_stream_fifo_next", extStart, extEnd); #endif /* EGL_NV_stream_fifo_next */ #ifdef EGL_NV_stream_fifo_synchronous EGLEW_NV_stream_fifo_synchronous = _glewSearchExtension("EGL_NV_stream_fifo_synchronous", extStart, extEnd); #endif /* EGL_NV_stream_fifo_synchronous */ #ifdef EGL_NV_stream_frame_limits EGLEW_NV_stream_frame_limits = _glewSearchExtension("EGL_NV_stream_frame_limits", extStart, extEnd); #endif /* EGL_NV_stream_frame_limits */ #ifdef EGL_NV_stream_metadata EGLEW_NV_stream_metadata = _glewSearchExtension("EGL_NV_stream_metadata", extStart, extEnd); if (glewExperimental || EGLEW_NV_stream_metadata) EGLEW_NV_stream_metadata = !_glewInit_EGL_NV_stream_metadata(); #endif /* EGL_NV_stream_metadata */ #ifdef EGL_NV_stream_remote EGLEW_NV_stream_remote = _glewSearchExtension("EGL_NV_stream_remote", extStart, extEnd); #endif /* EGL_NV_stream_remote */ #ifdef EGL_NV_stream_reset EGLEW_NV_stream_reset = _glewSearchExtension("EGL_NV_stream_reset", extStart, extEnd); if (glewExperimental || EGLEW_NV_stream_reset) EGLEW_NV_stream_reset = !_glewInit_EGL_NV_stream_reset(); #endif /* EGL_NV_stream_reset */ #ifdef EGL_NV_stream_socket EGLEW_NV_stream_socket = _glewSearchExtension("EGL_NV_stream_socket", extStart, extEnd); #endif /* EGL_NV_stream_socket */ #ifdef EGL_NV_stream_socket_inet EGLEW_NV_stream_socket_inet = _glewSearchExtension("EGL_NV_stream_socket_inet", extStart, extEnd); #endif /* EGL_NV_stream_socket_inet */ #ifdef EGL_NV_stream_socket_unix EGLEW_NV_stream_socket_unix = _glewSearchExtension("EGL_NV_stream_socket_unix", extStart, extEnd); #endif /* EGL_NV_stream_socket_unix */ #ifdef EGL_NV_stream_sync EGLEW_NV_stream_sync = _glewSearchExtension("EGL_NV_stream_sync", extStart, extEnd); if (glewExperimental || EGLEW_NV_stream_sync) EGLEW_NV_stream_sync = !_glewInit_EGL_NV_stream_sync(); #endif /* EGL_NV_stream_sync */ #ifdef EGL_NV_sync EGLEW_NV_sync = _glewSearchExtension("EGL_NV_sync", extStart, extEnd); if (glewExperimental || EGLEW_NV_sync) EGLEW_NV_sync = !_glewInit_EGL_NV_sync(); #endif /* EGL_NV_sync */ #ifdef EGL_NV_system_time EGLEW_NV_system_time = _glewSearchExtension("EGL_NV_system_time", extStart, extEnd); if (glewExperimental || EGLEW_NV_system_time) EGLEW_NV_system_time = !_glewInit_EGL_NV_system_time(); #endif /* EGL_NV_system_time */ #ifdef EGL_TIZEN_image_native_buffer EGLEW_TIZEN_image_native_buffer = _glewSearchExtension("EGL_TIZEN_image_native_buffer", extStart, extEnd); #endif /* EGL_TIZEN_image_native_buffer */ #ifdef EGL_TIZEN_image_native_surface EGLEW_TIZEN_image_native_surface = _glewSearchExtension("EGL_TIZEN_image_native_surface", extStart, extEnd); #endif /* EGL_TIZEN_image_native_surface */ return GLEW_OK; } #elif defined(_WIN32) PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL = NULL; PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD = NULL; PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD = NULL; PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD = NULL; PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD = NULL; PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD = NULL; PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD = NULL; PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD = NULL; PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD = NULL; PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD = NULL; PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB = NULL; PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB = NULL; PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB = NULL; PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB = NULL; PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB = NULL; PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB = NULL; PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB = NULL; PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB = NULL; PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB = NULL; PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB = NULL; PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB = NULL; PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB = NULL; PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB = NULL; PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB = NULL; PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB = NULL; PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB = NULL; PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB = NULL; PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB = NULL; PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB = NULL; PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT = NULL; PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT = NULL; PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT = NULL; PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT = NULL; PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT = NULL; PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT = NULL; PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT = NULL; PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT = NULL; PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT = NULL; PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT = NULL; PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT = NULL; PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT = NULL; PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT = NULL; PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT = NULL; PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT = NULL; PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT = NULL; PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT = NULL; PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D = NULL; PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D = NULL; PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D = NULL; PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D = NULL; PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D = NULL; PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D = NULL; PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D = NULL; PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D = NULL; PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D = NULL; PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D = NULL; PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D = NULL; PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D = NULL; PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D = NULL; PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D = NULL; PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D = NULL; PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D = NULL; PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D = NULL; PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D = NULL; PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D = NULL; PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D = NULL; PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D = NULL; PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D = NULL; PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D = NULL; PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D = NULL; PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D = NULL; PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D = NULL; PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D = NULL; PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D = NULL; PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D = NULL; PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D = NULL; PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV = NULL; PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV = NULL; PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV = NULL; PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV = NULL; PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV = NULL; PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV = NULL; PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV = NULL; PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV = NULL; PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV = NULL; PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV = NULL; PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV = NULL; PFNWGLDELETEDCNVPROC __wglewDeleteDCNV = NULL; PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV = NULL; PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV = NULL; PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV = NULL; PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV = NULL; PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV = NULL; PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV = NULL; PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV = NULL; PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV = NULL; PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV = NULL; PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV = NULL; PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV = NULL; PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV = NULL; PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV = NULL; PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV = NULL; PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV = NULL; PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV = NULL; PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV = NULL; PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV = NULL; PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV = NULL; PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV = NULL; PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV = NULL; PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV = NULL; PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV = NULL; PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV = NULL; PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV = NULL; PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML = NULL; PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML = NULL; PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML = NULL; PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML = NULL; PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML = NULL; PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML = NULL; GLboolean __WGLEW_3DFX_multisample = GL_FALSE; GLboolean __WGLEW_3DL_stereo_control = GL_FALSE; GLboolean __WGLEW_AMD_gpu_association = GL_FALSE; GLboolean __WGLEW_ARB_buffer_region = GL_FALSE; GLboolean __WGLEW_ARB_context_flush_control = GL_FALSE; GLboolean __WGLEW_ARB_create_context = GL_FALSE; GLboolean __WGLEW_ARB_create_context_no_error = GL_FALSE; GLboolean __WGLEW_ARB_create_context_profile = GL_FALSE; GLboolean __WGLEW_ARB_create_context_robustness = GL_FALSE; GLboolean __WGLEW_ARB_extensions_string = GL_FALSE; GLboolean __WGLEW_ARB_framebuffer_sRGB = GL_FALSE; GLboolean __WGLEW_ARB_make_current_read = GL_FALSE; GLboolean __WGLEW_ARB_multisample = GL_FALSE; GLboolean __WGLEW_ARB_pbuffer = GL_FALSE; GLboolean __WGLEW_ARB_pixel_format = GL_FALSE; GLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE; GLboolean __WGLEW_ARB_render_texture = GL_FALSE; GLboolean __WGLEW_ARB_robustness_application_isolation = GL_FALSE; GLboolean __WGLEW_ARB_robustness_share_group_isolation = GL_FALSE; GLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE; GLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE; GLboolean __WGLEW_EXT_colorspace = GL_FALSE; GLboolean __WGLEW_EXT_create_context_es2_profile = GL_FALSE; GLboolean __WGLEW_EXT_create_context_es_profile = GL_FALSE; GLboolean __WGLEW_EXT_depth_float = GL_FALSE; GLboolean __WGLEW_EXT_display_color_table = GL_FALSE; GLboolean __WGLEW_EXT_extensions_string = GL_FALSE; GLboolean __WGLEW_EXT_framebuffer_sRGB = GL_FALSE; GLboolean __WGLEW_EXT_make_current_read = GL_FALSE; GLboolean __WGLEW_EXT_multisample = GL_FALSE; GLboolean __WGLEW_EXT_pbuffer = GL_FALSE; GLboolean __WGLEW_EXT_pixel_format = GL_FALSE; GLboolean __WGLEW_EXT_pixel_format_packed_float = GL_FALSE; GLboolean __WGLEW_EXT_swap_control = GL_FALSE; GLboolean __WGLEW_EXT_swap_control_tear = GL_FALSE; GLboolean __WGLEW_I3D_digital_video_control = GL_FALSE; GLboolean __WGLEW_I3D_gamma = GL_FALSE; GLboolean __WGLEW_I3D_genlock = GL_FALSE; GLboolean __WGLEW_I3D_image_buffer = GL_FALSE; GLboolean __WGLEW_I3D_swap_frame_lock = GL_FALSE; GLboolean __WGLEW_I3D_swap_frame_usage = GL_FALSE; GLboolean __WGLEW_NV_DX_interop = GL_FALSE; GLboolean __WGLEW_NV_DX_interop2 = GL_FALSE; GLboolean __WGLEW_NV_copy_image = GL_FALSE; GLboolean __WGLEW_NV_delay_before_swap = GL_FALSE; GLboolean __WGLEW_NV_float_buffer = GL_FALSE; GLboolean __WGLEW_NV_gpu_affinity = GL_FALSE; GLboolean __WGLEW_NV_multisample_coverage = GL_FALSE; GLboolean __WGLEW_NV_present_video = GL_FALSE; GLboolean __WGLEW_NV_render_depth_texture = GL_FALSE; GLboolean __WGLEW_NV_render_texture_rectangle = GL_FALSE; GLboolean __WGLEW_NV_swap_group = GL_FALSE; GLboolean __WGLEW_NV_vertex_array_range = GL_FALSE; GLboolean __WGLEW_NV_video_capture = GL_FALSE; GLboolean __WGLEW_NV_video_output = GL_FALSE; GLboolean __WGLEW_OML_sync_control = GL_FALSE; #ifdef WGL_3DL_stereo_control static GLboolean _glewInit_WGL_3DL_stereo_control () { GLboolean r = GL_FALSE; r = ((wglSetStereoEmitterState3DL = (PFNWGLSETSTEREOEMITTERSTATE3DLPROC)glewGetProcAddress((const GLubyte*)"wglSetStereoEmitterState3DL")) == NULL) || r; return r; } #endif /* WGL_3DL_stereo_control */ #ifdef WGL_AMD_gpu_association static GLboolean _glewInit_WGL_AMD_gpu_association () { GLboolean r = GL_FALSE; r = ((wglBlitContextFramebufferAMD = (PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"wglBlitContextFramebufferAMD")) == NULL) || r; r = ((wglCreateAssociatedContextAMD = (PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAMD")) == NULL) || r; r = ((wglCreateAssociatedContextAttribsAMD = (PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAttribsAMD")) == NULL) || r; r = ((wglDeleteAssociatedContextAMD = (PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglDeleteAssociatedContextAMD")) == NULL) || r; r = ((wglGetContextGPUIDAMD = (PFNWGLGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetContextGPUIDAMD")) == NULL) || r; r = ((wglGetCurrentAssociatedContextAMD = (PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentAssociatedContextAMD")) == NULL) || r; r = ((wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUIDsAMD")) == NULL) || r; r = ((wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUInfoAMD")) == NULL) || r; r = ((wglMakeAssociatedContextCurrentAMD = (PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"wglMakeAssociatedContextCurrentAMD")) == NULL) || r; return r; } #endif /* WGL_AMD_gpu_association */ #ifdef WGL_ARB_buffer_region static GLboolean _glewInit_WGL_ARB_buffer_region () { GLboolean r = GL_FALSE; r = ((wglCreateBufferRegionARB = (PFNWGLCREATEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateBufferRegionARB")) == NULL) || r; r = ((wglDeleteBufferRegionARB = (PFNWGLDELETEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglDeleteBufferRegionARB")) == NULL) || r; r = ((wglRestoreBufferRegionARB = (PFNWGLRESTOREBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglRestoreBufferRegionARB")) == NULL) || r; r = ((wglSaveBufferRegionARB = (PFNWGLSAVEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglSaveBufferRegionARB")) == NULL) || r; return r; } #endif /* WGL_ARB_buffer_region */ #ifdef WGL_ARB_create_context static GLboolean _glewInit_WGL_ARB_create_context () { GLboolean r = GL_FALSE; r = ((wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateContextAttribsARB")) == NULL) || r; return r; } #endif /* WGL_ARB_create_context */ #ifdef WGL_ARB_extensions_string static GLboolean _glewInit_WGL_ARB_extensions_string () { GLboolean r = GL_FALSE; r = ((wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB")) == NULL) || r; return r; } #endif /* WGL_ARB_extensions_string */ #ifdef WGL_ARB_make_current_read static GLboolean _glewInit_WGL_ARB_make_current_read () { GLboolean r = GL_FALSE; r = ((wglGetCurrentReadDCARB = (PFNWGLGETCURRENTREADDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCARB")) == NULL) || r; r = ((wglMakeContextCurrentARB = (PFNWGLMAKECONTEXTCURRENTARBPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentARB")) == NULL) || r; return r; } #endif /* WGL_ARB_make_current_read */ #ifdef WGL_ARB_pbuffer static GLboolean _glewInit_WGL_ARB_pbuffer () { GLboolean r = GL_FALSE; r = ((wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferARB")) == NULL) || r; r = ((wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferARB")) == NULL) || r; r = ((wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCARB")) == NULL) || r; r = ((wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferARB")) == NULL) || r; r = ((wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCARB")) == NULL) || r; return r; } #endif /* WGL_ARB_pbuffer */ #ifdef WGL_ARB_pixel_format static GLboolean _glewInit_WGL_ARB_pixel_format () { GLboolean r = GL_FALSE; r = ((wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatARB")) == NULL) || r; r = ((wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvARB")) == NULL) || r; r = ((wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivARB")) == NULL) || r; return r; } #endif /* WGL_ARB_pixel_format */ #ifdef WGL_ARB_render_texture static GLboolean _glewInit_WGL_ARB_render_texture () { GLboolean r = GL_FALSE; r = ((wglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglBindTexImageARB")) == NULL) || r; r = ((wglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglReleaseTexImageARB")) == NULL) || r; r = ((wglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"wglSetPbufferAttribARB")) == NULL) || r; return r; } #endif /* WGL_ARB_render_texture */ #ifdef WGL_EXT_display_color_table static GLboolean _glewInit_WGL_EXT_display_color_table () { GLboolean r = GL_FALSE; r = ((wglBindDisplayColorTableEXT = (PFNWGLBINDDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglBindDisplayColorTableEXT")) == NULL) || r; r = ((wglCreateDisplayColorTableEXT = (PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglCreateDisplayColorTableEXT")) == NULL) || r; r = ((wglDestroyDisplayColorTableEXT = (PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyDisplayColorTableEXT")) == NULL) || r; r = ((wglLoadDisplayColorTableEXT = (PFNWGLLOADDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglLoadDisplayColorTableEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_display_color_table */ #ifdef WGL_EXT_extensions_string static GLboolean _glewInit_WGL_EXT_extensions_string () { GLboolean r = GL_FALSE; r = ((wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_extensions_string */ #ifdef WGL_EXT_make_current_read static GLboolean _glewInit_WGL_EXT_make_current_read () { GLboolean r = GL_FALSE; r = ((wglGetCurrentReadDCEXT = (PFNWGLGETCURRENTREADDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCEXT")) == NULL) || r; r = ((wglMakeContextCurrentEXT = (PFNWGLMAKECONTEXTCURRENTEXTPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_make_current_read */ #ifdef WGL_EXT_pbuffer static GLboolean _glewInit_WGL_EXT_pbuffer () { GLboolean r = GL_FALSE; r = ((wglCreatePbufferEXT = (PFNWGLCREATEPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferEXT")) == NULL) || r; r = ((wglDestroyPbufferEXT = (PFNWGLDESTROYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferEXT")) == NULL) || r; r = ((wglGetPbufferDCEXT = (PFNWGLGETPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCEXT")) == NULL) || r; r = ((wglQueryPbufferEXT = (PFNWGLQUERYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferEXT")) == NULL) || r; r = ((wglReleasePbufferDCEXT = (PFNWGLRELEASEPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_pbuffer */ #ifdef WGL_EXT_pixel_format static GLboolean _glewInit_WGL_EXT_pixel_format () { GLboolean r = GL_FALSE; r = ((wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatEXT")) == NULL) || r; r = ((wglGetPixelFormatAttribfvEXT = (PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvEXT")) == NULL) || r; r = ((wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_pixel_format */ #ifdef WGL_EXT_swap_control static GLboolean _glewInit_WGL_EXT_swap_control () { GLboolean r = GL_FALSE; r = ((wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetSwapIntervalEXT")) == NULL) || r; r = ((wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglSwapIntervalEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_swap_control */ #ifdef WGL_I3D_digital_video_control static GLboolean _glewInit_WGL_I3D_digital_video_control () { GLboolean r = GL_FALSE; r = ((wglGetDigitalVideoParametersI3D = (PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetDigitalVideoParametersI3D")) == NULL) || r; r = ((wglSetDigitalVideoParametersI3D = (PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetDigitalVideoParametersI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_digital_video_control */ #ifdef WGL_I3D_gamma static GLboolean _glewInit_WGL_I3D_gamma () { GLboolean r = GL_FALSE; r = ((wglGetGammaTableI3D = (PFNWGLGETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableI3D")) == NULL) || r; r = ((wglGetGammaTableParametersI3D = (PFNWGLGETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableParametersI3D")) == NULL) || r; r = ((wglSetGammaTableI3D = (PFNWGLSETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableI3D")) == NULL) || r; r = ((wglSetGammaTableParametersI3D = (PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableParametersI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_gamma */ #ifdef WGL_I3D_genlock static GLboolean _glewInit_WGL_I3D_genlock () { GLboolean r = GL_FALSE; r = ((wglDisableGenlockI3D = (PFNWGLDISABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableGenlockI3D")) == NULL) || r; r = ((wglEnableGenlockI3D = (PFNWGLENABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableGenlockI3D")) == NULL) || r; r = ((wglGenlockSampleRateI3D = (PFNWGLGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSampleRateI3D")) == NULL) || r; r = ((wglGenlockSourceDelayI3D = (PFNWGLGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceDelayI3D")) == NULL) || r; r = ((wglGenlockSourceEdgeI3D = (PFNWGLGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceEdgeI3D")) == NULL) || r; r = ((wglGenlockSourceI3D = (PFNWGLGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceI3D")) == NULL) || r; r = ((wglGetGenlockSampleRateI3D = (PFNWGLGETGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSampleRateI3D")) == NULL) || r; r = ((wglGetGenlockSourceDelayI3D = (PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceDelayI3D")) == NULL) || r; r = ((wglGetGenlockSourceEdgeI3D = (PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceEdgeI3D")) == NULL) || r; r = ((wglGetGenlockSourceI3D = (PFNWGLGETGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceI3D")) == NULL) || r; r = ((wglIsEnabledGenlockI3D = (PFNWGLISENABLEDGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledGenlockI3D")) == NULL) || r; r = ((wglQueryGenlockMaxSourceDelayI3D = (PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryGenlockMaxSourceDelayI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_genlock */ #ifdef WGL_I3D_image_buffer static GLboolean _glewInit_WGL_I3D_image_buffer () { GLboolean r = GL_FALSE; r = ((wglAssociateImageBufferEventsI3D = (PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglAssociateImageBufferEventsI3D")) == NULL) || r; r = ((wglCreateImageBufferI3D = (PFNWGLCREATEIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglCreateImageBufferI3D")) == NULL) || r; r = ((wglDestroyImageBufferI3D = (PFNWGLDESTROYIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglDestroyImageBufferI3D")) == NULL) || r; r = ((wglReleaseImageBufferEventsI3D = (PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglReleaseImageBufferEventsI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_image_buffer */ #ifdef WGL_I3D_swap_frame_lock static GLboolean _glewInit_WGL_I3D_swap_frame_lock () { GLboolean r = GL_FALSE; r = ((wglDisableFrameLockI3D = (PFNWGLDISABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableFrameLockI3D")) == NULL) || r; r = ((wglEnableFrameLockI3D = (PFNWGLENABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableFrameLockI3D")) == NULL) || r; r = ((wglIsEnabledFrameLockI3D = (PFNWGLISENABLEDFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledFrameLockI3D")) == NULL) || r; r = ((wglQueryFrameLockMasterI3D = (PFNWGLQUERYFRAMELOCKMASTERI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameLockMasterI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_swap_frame_lock */ #ifdef WGL_I3D_swap_frame_usage static GLboolean _glewInit_WGL_I3D_swap_frame_usage () { GLboolean r = GL_FALSE; r = ((wglBeginFrameTrackingI3D = (PFNWGLBEGINFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglBeginFrameTrackingI3D")) == NULL) || r; r = ((wglEndFrameTrackingI3D = (PFNWGLENDFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglEndFrameTrackingI3D")) == NULL) || r; r = ((wglGetFrameUsageI3D = (PFNWGLGETFRAMEUSAGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetFrameUsageI3D")) == NULL) || r; r = ((wglQueryFrameTrackingI3D = (PFNWGLQUERYFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameTrackingI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_swap_frame_usage */ #ifdef WGL_NV_DX_interop static GLboolean _glewInit_WGL_NV_DX_interop () { GLboolean r = GL_FALSE; r = ((wglDXCloseDeviceNV = (PFNWGLDXCLOSEDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXCloseDeviceNV")) == NULL) || r; r = ((wglDXLockObjectsNV = (PFNWGLDXLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXLockObjectsNV")) == NULL) || r; r = ((wglDXObjectAccessNV = (PFNWGLDXOBJECTACCESSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXObjectAccessNV")) == NULL) || r; r = ((wglDXOpenDeviceNV = (PFNWGLDXOPENDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXOpenDeviceNV")) == NULL) || r; r = ((wglDXRegisterObjectNV = (PFNWGLDXREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXRegisterObjectNV")) == NULL) || r; r = ((wglDXSetResourceShareHandleNV = (PFNWGLDXSETRESOURCESHAREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"wglDXSetResourceShareHandleNV")) == NULL) || r; r = ((wglDXUnlockObjectsNV = (PFNWGLDXUNLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnlockObjectsNV")) == NULL) || r; r = ((wglDXUnregisterObjectNV = (PFNWGLDXUNREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnregisterObjectNV")) == NULL) || r; return r; } #endif /* WGL_NV_DX_interop */ #ifdef WGL_NV_copy_image static GLboolean _glewInit_WGL_NV_copy_image () { GLboolean r = GL_FALSE; r = ((wglCopyImageSubDataNV = (PFNWGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"wglCopyImageSubDataNV")) == NULL) || r; return r; } #endif /* WGL_NV_copy_image */ #ifdef WGL_NV_delay_before_swap static GLboolean _glewInit_WGL_NV_delay_before_swap () { GLboolean r = GL_FALSE; r = ((wglDelayBeforeSwapNV = (PFNWGLDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"wglDelayBeforeSwapNV")) == NULL) || r; return r; } #endif /* WGL_NV_delay_before_swap */ #ifdef WGL_NV_gpu_affinity static GLboolean _glewInit_WGL_NV_gpu_affinity () { GLboolean r = GL_FALSE; r = ((wglCreateAffinityDCNV = (PFNWGLCREATEAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglCreateAffinityDCNV")) == NULL) || r; r = ((wglDeleteDCNV = (PFNWGLDELETEDCNVPROC)glewGetProcAddress((const GLubyte*)"wglDeleteDCNV")) == NULL) || r; r = ((wglEnumGpuDevicesNV = (PFNWGLENUMGPUDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpuDevicesNV")) == NULL) || r; r = ((wglEnumGpusFromAffinityDCNV = (PFNWGLENUMGPUSFROMAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusFromAffinityDCNV")) == NULL) || r; r = ((wglEnumGpusNV = (PFNWGLENUMGPUSNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusNV")) == NULL) || r; return r; } #endif /* WGL_NV_gpu_affinity */ #ifdef WGL_NV_present_video static GLboolean _glewInit_WGL_NV_present_video () { GLboolean r = GL_FALSE; r = ((wglBindVideoDeviceNV = (PFNWGLBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoDeviceNV")) == NULL) || r; r = ((wglEnumerateVideoDevicesNV = (PFNWGLENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoDevicesNV")) == NULL) || r; r = ((wglQueryCurrentContextNV = (PFNWGLQUERYCURRENTCONTEXTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryCurrentContextNV")) == NULL) || r; return r; } #endif /* WGL_NV_present_video */ #ifdef WGL_NV_swap_group static GLboolean _glewInit_WGL_NV_swap_group () { GLboolean r = GL_FALSE; r = ((wglBindSwapBarrierNV = (PFNWGLBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"wglBindSwapBarrierNV")) == NULL) || r; r = ((wglJoinSwapGroupNV = (PFNWGLJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglJoinSwapGroupNV")) == NULL) || r; r = ((wglQueryFrameCountNV = (PFNWGLQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameCountNV")) == NULL) || r; r = ((wglQueryMaxSwapGroupsNV = (PFNWGLQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryMaxSwapGroupsNV")) == NULL) || r; r = ((wglQuerySwapGroupNV = (PFNWGLQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglQuerySwapGroupNV")) == NULL) || r; r = ((wglResetFrameCountNV = (PFNWGLRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglResetFrameCountNV")) == NULL) || r; return r; } #endif /* WGL_NV_swap_group */ #ifdef WGL_NV_vertex_array_range static GLboolean _glewInit_WGL_NV_vertex_array_range () { GLboolean r = GL_FALSE; r = ((wglAllocateMemoryNV = (PFNWGLALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglAllocateMemoryNV")) == NULL) || r; r = ((wglFreeMemoryNV = (PFNWGLFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglFreeMemoryNV")) == NULL) || r; return r; } #endif /* WGL_NV_vertex_array_range */ #ifdef WGL_NV_video_capture static GLboolean _glewInit_WGL_NV_video_capture () { GLboolean r = GL_FALSE; r = ((wglBindVideoCaptureDeviceNV = (PFNWGLBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoCaptureDeviceNV")) == NULL) || r; r = ((wglEnumerateVideoCaptureDevicesNV = (PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoCaptureDevicesNV")) == NULL) || r; r = ((wglLockVideoCaptureDeviceNV = (PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglLockVideoCaptureDeviceNV")) == NULL) || r; r = ((wglQueryVideoCaptureDeviceNV = (PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglQueryVideoCaptureDeviceNV")) == NULL) || r; r = ((wglReleaseVideoCaptureDeviceNV = (PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoCaptureDeviceNV")) == NULL) || r; return r; } #endif /* WGL_NV_video_capture */ #ifdef WGL_NV_video_output static GLboolean _glewInit_WGL_NV_video_output () { GLboolean r = GL_FALSE; r = ((wglBindVideoImageNV = (PFNWGLBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoImageNV")) == NULL) || r; r = ((wglGetVideoDeviceNV = (PFNWGLGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoDeviceNV")) == NULL) || r; r = ((wglGetVideoInfoNV = (PFNWGLGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoInfoNV")) == NULL) || r; r = ((wglReleaseVideoDeviceNV = (PFNWGLRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoDeviceNV")) == NULL) || r; r = ((wglReleaseVideoImageNV = (PFNWGLRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoImageNV")) == NULL) || r; r = ((wglSendPbufferToVideoNV = (PFNWGLSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"wglSendPbufferToVideoNV")) == NULL) || r; return r; } #endif /* WGL_NV_video_output */ #ifdef WGL_OML_sync_control static GLboolean _glewInit_WGL_OML_sync_control () { GLboolean r = GL_FALSE; r = ((wglGetMscRateOML = (PFNWGLGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetMscRateOML")) == NULL) || r; r = ((wglGetSyncValuesOML = (PFNWGLGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetSyncValuesOML")) == NULL) || r; r = ((wglSwapBuffersMscOML = (PFNWGLSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapBuffersMscOML")) == NULL) || r; r = ((wglSwapLayerBuffersMscOML = (PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapLayerBuffersMscOML")) == NULL) || r; r = ((wglWaitForMscOML = (PFNWGLWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForMscOML")) == NULL) || r; r = ((wglWaitForSbcOML = (PFNWGLWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForSbcOML")) == NULL) || r; return r; } #endif /* WGL_OML_sync_control */ /* ------------------------------------------------------------------------- */ static PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL; static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL; GLboolean GLEWAPIENTRY wglewGetExtension (const char* name) { const GLubyte* start; const GLubyte* end; if (_wglewGetExtensionsStringARB == NULL) if (_wglewGetExtensionsStringEXT == NULL) return GL_FALSE; else start = (const GLubyte*)_wglewGetExtensionsStringEXT(); else start = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); if (start == 0) return GL_FALSE; end = start + _glewStrLen(start); return _glewSearchExtension(name, start, end); } GLenum GLEWAPIENTRY wglewInit () { GLboolean crippled; const GLubyte* extStart; const GLubyte* extEnd; /* find wgl extension string query functions */ _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB"); _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT"); /* query wgl extension string */ if (_wglewGetExtensionsStringARB == NULL) if (_wglewGetExtensionsStringEXT == NULL) extStart = (const GLubyte*)""; else extStart = (const GLubyte*)_wglewGetExtensionsStringEXT(); else extStart = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); extEnd = extStart + _glewStrLen(extStart); /* initialize extensions */ crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL; #ifdef WGL_3DFX_multisample WGLEW_3DFX_multisample = _glewSearchExtension("WGL_3DFX_multisample", extStart, extEnd); #endif /* WGL_3DFX_multisample */ #ifdef WGL_3DL_stereo_control WGLEW_3DL_stereo_control = _glewSearchExtension("WGL_3DL_stereo_control", extStart, extEnd); if (glewExperimental || WGLEW_3DL_stereo_control|| crippled) WGLEW_3DL_stereo_control= !_glewInit_WGL_3DL_stereo_control(); #endif /* WGL_3DL_stereo_control */ #ifdef WGL_AMD_gpu_association WGLEW_AMD_gpu_association = _glewSearchExtension("WGL_AMD_gpu_association", extStart, extEnd); if (glewExperimental || WGLEW_AMD_gpu_association|| crippled) WGLEW_AMD_gpu_association= !_glewInit_WGL_AMD_gpu_association(); #endif /* WGL_AMD_gpu_association */ #ifdef WGL_ARB_buffer_region WGLEW_ARB_buffer_region = _glewSearchExtension("WGL_ARB_buffer_region", extStart, extEnd); if (glewExperimental || WGLEW_ARB_buffer_region|| crippled) WGLEW_ARB_buffer_region= !_glewInit_WGL_ARB_buffer_region(); #endif /* WGL_ARB_buffer_region */ #ifdef WGL_ARB_context_flush_control WGLEW_ARB_context_flush_control = _glewSearchExtension("WGL_ARB_context_flush_control", extStart, extEnd); #endif /* WGL_ARB_context_flush_control */ #ifdef WGL_ARB_create_context WGLEW_ARB_create_context = _glewSearchExtension("WGL_ARB_create_context", extStart, extEnd); if (glewExperimental || WGLEW_ARB_create_context|| crippled) WGLEW_ARB_create_context= !_glewInit_WGL_ARB_create_context(); #endif /* WGL_ARB_create_context */ #ifdef WGL_ARB_create_context_no_error WGLEW_ARB_create_context_no_error = _glewSearchExtension("WGL_ARB_create_context_no_error", extStart, extEnd); #endif /* WGL_ARB_create_context_no_error */ #ifdef WGL_ARB_create_context_profile WGLEW_ARB_create_context_profile = _glewSearchExtension("WGL_ARB_create_context_profile", extStart, extEnd); #endif /* WGL_ARB_create_context_profile */ #ifdef WGL_ARB_create_context_robustness WGLEW_ARB_create_context_robustness = _glewSearchExtension("WGL_ARB_create_context_robustness", extStart, extEnd); #endif /* WGL_ARB_create_context_robustness */ #ifdef WGL_ARB_extensions_string WGLEW_ARB_extensions_string = _glewSearchExtension("WGL_ARB_extensions_string", extStart, extEnd); if (glewExperimental || WGLEW_ARB_extensions_string|| crippled) WGLEW_ARB_extensions_string= !_glewInit_WGL_ARB_extensions_string(); #endif /* WGL_ARB_extensions_string */ #ifdef WGL_ARB_framebuffer_sRGB WGLEW_ARB_framebuffer_sRGB = _glewSearchExtension("WGL_ARB_framebuffer_sRGB", extStart, extEnd); #endif /* WGL_ARB_framebuffer_sRGB */ #ifdef WGL_ARB_make_current_read WGLEW_ARB_make_current_read = _glewSearchExtension("WGL_ARB_make_current_read", extStart, extEnd); if (glewExperimental || WGLEW_ARB_make_current_read|| crippled) WGLEW_ARB_make_current_read= !_glewInit_WGL_ARB_make_current_read(); #endif /* WGL_ARB_make_current_read */ #ifdef WGL_ARB_multisample WGLEW_ARB_multisample = _glewSearchExtension("WGL_ARB_multisample", extStart, extEnd); #endif /* WGL_ARB_multisample */ #ifdef WGL_ARB_pbuffer WGLEW_ARB_pbuffer = _glewSearchExtension("WGL_ARB_pbuffer", extStart, extEnd); if (glewExperimental || WGLEW_ARB_pbuffer|| crippled) WGLEW_ARB_pbuffer= !_glewInit_WGL_ARB_pbuffer(); #endif /* WGL_ARB_pbuffer */ #ifdef WGL_ARB_pixel_format WGLEW_ARB_pixel_format = _glewSearchExtension("WGL_ARB_pixel_format", extStart, extEnd); if (glewExperimental || WGLEW_ARB_pixel_format|| crippled) WGLEW_ARB_pixel_format= !_glewInit_WGL_ARB_pixel_format(); #endif /* WGL_ARB_pixel_format */ #ifdef WGL_ARB_pixel_format_float WGLEW_ARB_pixel_format_float = _glewSearchExtension("WGL_ARB_pixel_format_float", extStart, extEnd); #endif /* WGL_ARB_pixel_format_float */ #ifdef WGL_ARB_render_texture WGLEW_ARB_render_texture = _glewSearchExtension("WGL_ARB_render_texture", extStart, extEnd); if (glewExperimental || WGLEW_ARB_render_texture|| crippled) WGLEW_ARB_render_texture= !_glewInit_WGL_ARB_render_texture(); #endif /* WGL_ARB_render_texture */ #ifdef WGL_ARB_robustness_application_isolation WGLEW_ARB_robustness_application_isolation = _glewSearchExtension("WGL_ARB_robustness_application_isolation", extStart, extEnd); #endif /* WGL_ARB_robustness_application_isolation */ #ifdef WGL_ARB_robustness_share_group_isolation WGLEW_ARB_robustness_share_group_isolation = _glewSearchExtension("WGL_ARB_robustness_share_group_isolation", extStart, extEnd); #endif /* WGL_ARB_robustness_share_group_isolation */ #ifdef WGL_ATI_pixel_format_float WGLEW_ATI_pixel_format_float = _glewSearchExtension("WGL_ATI_pixel_format_float", extStart, extEnd); #endif /* WGL_ATI_pixel_format_float */ #ifdef WGL_ATI_render_texture_rectangle WGLEW_ATI_render_texture_rectangle = _glewSearchExtension("WGL_ATI_render_texture_rectangle", extStart, extEnd); #endif /* WGL_ATI_render_texture_rectangle */ #ifdef WGL_EXT_colorspace WGLEW_EXT_colorspace = _glewSearchExtension("WGL_EXT_colorspace", extStart, extEnd); #endif /* WGL_EXT_colorspace */ #ifdef WGL_EXT_create_context_es2_profile WGLEW_EXT_create_context_es2_profile = _glewSearchExtension("WGL_EXT_create_context_es2_profile", extStart, extEnd); #endif /* WGL_EXT_create_context_es2_profile */ #ifdef WGL_EXT_create_context_es_profile WGLEW_EXT_create_context_es_profile = _glewSearchExtension("WGL_EXT_create_context_es_profile", extStart, extEnd); #endif /* WGL_EXT_create_context_es_profile */ #ifdef WGL_EXT_depth_float WGLEW_EXT_depth_float = _glewSearchExtension("WGL_EXT_depth_float", extStart, extEnd); #endif /* WGL_EXT_depth_float */ #ifdef WGL_EXT_display_color_table WGLEW_EXT_display_color_table = _glewSearchExtension("WGL_EXT_display_color_table", extStart, extEnd); if (glewExperimental || WGLEW_EXT_display_color_table|| crippled) WGLEW_EXT_display_color_table= !_glewInit_WGL_EXT_display_color_table(); #endif /* WGL_EXT_display_color_table */ #ifdef WGL_EXT_extensions_string WGLEW_EXT_extensions_string = _glewSearchExtension("WGL_EXT_extensions_string", extStart, extEnd); if (glewExperimental || WGLEW_EXT_extensions_string|| crippled) WGLEW_EXT_extensions_string= !_glewInit_WGL_EXT_extensions_string(); #endif /* WGL_EXT_extensions_string */ #ifdef WGL_EXT_framebuffer_sRGB WGLEW_EXT_framebuffer_sRGB = _glewSearchExtension("WGL_EXT_framebuffer_sRGB", extStart, extEnd); #endif /* WGL_EXT_framebuffer_sRGB */ #ifdef WGL_EXT_make_current_read WGLEW_EXT_make_current_read = _glewSearchExtension("WGL_EXT_make_current_read", extStart, extEnd); if (glewExperimental || WGLEW_EXT_make_current_read|| crippled) WGLEW_EXT_make_current_read= !_glewInit_WGL_EXT_make_current_read(); #endif /* WGL_EXT_make_current_read */ #ifdef WGL_EXT_multisample WGLEW_EXT_multisample = _glewSearchExtension("WGL_EXT_multisample", extStart, extEnd); #endif /* WGL_EXT_multisample */ #ifdef WGL_EXT_pbuffer WGLEW_EXT_pbuffer = _glewSearchExtension("WGL_EXT_pbuffer", extStart, extEnd); if (glewExperimental || WGLEW_EXT_pbuffer|| crippled) WGLEW_EXT_pbuffer= !_glewInit_WGL_EXT_pbuffer(); #endif /* WGL_EXT_pbuffer */ #ifdef WGL_EXT_pixel_format WGLEW_EXT_pixel_format = _glewSearchExtension("WGL_EXT_pixel_format", extStart, extEnd); if (glewExperimental || WGLEW_EXT_pixel_format|| crippled) WGLEW_EXT_pixel_format= !_glewInit_WGL_EXT_pixel_format(); #endif /* WGL_EXT_pixel_format */ #ifdef WGL_EXT_pixel_format_packed_float WGLEW_EXT_pixel_format_packed_float = _glewSearchExtension("WGL_EXT_pixel_format_packed_float", extStart, extEnd); #endif /* WGL_EXT_pixel_format_packed_float */ #ifdef WGL_EXT_swap_control WGLEW_EXT_swap_control = _glewSearchExtension("WGL_EXT_swap_control", extStart, extEnd); if (glewExperimental || WGLEW_EXT_swap_control|| crippled) WGLEW_EXT_swap_control= !_glewInit_WGL_EXT_swap_control(); #endif /* WGL_EXT_swap_control */ #ifdef WGL_EXT_swap_control_tear WGLEW_EXT_swap_control_tear = _glewSearchExtension("WGL_EXT_swap_control_tear", extStart, extEnd); #endif /* WGL_EXT_swap_control_tear */ #ifdef WGL_I3D_digital_video_control WGLEW_I3D_digital_video_control = _glewSearchExtension("WGL_I3D_digital_video_control", extStart, extEnd); if (glewExperimental || WGLEW_I3D_digital_video_control|| crippled) WGLEW_I3D_digital_video_control= !_glewInit_WGL_I3D_digital_video_control(); #endif /* WGL_I3D_digital_video_control */ #ifdef WGL_I3D_gamma WGLEW_I3D_gamma = _glewSearchExtension("WGL_I3D_gamma", extStart, extEnd); if (glewExperimental || WGLEW_I3D_gamma|| crippled) WGLEW_I3D_gamma= !_glewInit_WGL_I3D_gamma(); #endif /* WGL_I3D_gamma */ #ifdef WGL_I3D_genlock WGLEW_I3D_genlock = _glewSearchExtension("WGL_I3D_genlock", extStart, extEnd); if (glewExperimental || WGLEW_I3D_genlock|| crippled) WGLEW_I3D_genlock= !_glewInit_WGL_I3D_genlock(); #endif /* WGL_I3D_genlock */ #ifdef WGL_I3D_image_buffer WGLEW_I3D_image_buffer = _glewSearchExtension("WGL_I3D_image_buffer", extStart, extEnd); if (glewExperimental || WGLEW_I3D_image_buffer|| crippled) WGLEW_I3D_image_buffer= !_glewInit_WGL_I3D_image_buffer(); #endif /* WGL_I3D_image_buffer */ #ifdef WGL_I3D_swap_frame_lock WGLEW_I3D_swap_frame_lock = _glewSearchExtension("WGL_I3D_swap_frame_lock", extStart, extEnd); if (glewExperimental || WGLEW_I3D_swap_frame_lock|| crippled) WGLEW_I3D_swap_frame_lock= !_glewInit_WGL_I3D_swap_frame_lock(); #endif /* WGL_I3D_swap_frame_lock */ #ifdef WGL_I3D_swap_frame_usage WGLEW_I3D_swap_frame_usage = _glewSearchExtension("WGL_I3D_swap_frame_usage", extStart, extEnd); if (glewExperimental || WGLEW_I3D_swap_frame_usage|| crippled) WGLEW_I3D_swap_frame_usage= !_glewInit_WGL_I3D_swap_frame_usage(); #endif /* WGL_I3D_swap_frame_usage */ #ifdef WGL_NV_DX_interop WGLEW_NV_DX_interop = _glewSearchExtension("WGL_NV_DX_interop", extStart, extEnd); if (glewExperimental || WGLEW_NV_DX_interop|| crippled) WGLEW_NV_DX_interop= !_glewInit_WGL_NV_DX_interop(); #endif /* WGL_NV_DX_interop */ #ifdef WGL_NV_DX_interop2 WGLEW_NV_DX_interop2 = _glewSearchExtension("WGL_NV_DX_interop2", extStart, extEnd); #endif /* WGL_NV_DX_interop2 */ #ifdef WGL_NV_copy_image WGLEW_NV_copy_image = _glewSearchExtension("WGL_NV_copy_image", extStart, extEnd); if (glewExperimental || WGLEW_NV_copy_image|| crippled) WGLEW_NV_copy_image= !_glewInit_WGL_NV_copy_image(); #endif /* WGL_NV_copy_image */ #ifdef WGL_NV_delay_before_swap WGLEW_NV_delay_before_swap = _glewSearchExtension("WGL_NV_delay_before_swap", extStart, extEnd); if (glewExperimental || WGLEW_NV_delay_before_swap|| crippled) WGLEW_NV_delay_before_swap= !_glewInit_WGL_NV_delay_before_swap(); #endif /* WGL_NV_delay_before_swap */ #ifdef WGL_NV_float_buffer WGLEW_NV_float_buffer = _glewSearchExtension("WGL_NV_float_buffer", extStart, extEnd); #endif /* WGL_NV_float_buffer */ #ifdef WGL_NV_gpu_affinity WGLEW_NV_gpu_affinity = _glewSearchExtension("WGL_NV_gpu_affinity", extStart, extEnd); if (glewExperimental || WGLEW_NV_gpu_affinity|| crippled) WGLEW_NV_gpu_affinity= !_glewInit_WGL_NV_gpu_affinity(); #endif /* WGL_NV_gpu_affinity */ #ifdef WGL_NV_multisample_coverage WGLEW_NV_multisample_coverage = _glewSearchExtension("WGL_NV_multisample_coverage", extStart, extEnd); #endif /* WGL_NV_multisample_coverage */ #ifdef WGL_NV_present_video WGLEW_NV_present_video = _glewSearchExtension("WGL_NV_present_video", extStart, extEnd); if (glewExperimental || WGLEW_NV_present_video|| crippled) WGLEW_NV_present_video= !_glewInit_WGL_NV_present_video(); #endif /* WGL_NV_present_video */ #ifdef WGL_NV_render_depth_texture WGLEW_NV_render_depth_texture = _glewSearchExtension("WGL_NV_render_depth_texture", extStart, extEnd); #endif /* WGL_NV_render_depth_texture */ #ifdef WGL_NV_render_texture_rectangle WGLEW_NV_render_texture_rectangle = _glewSearchExtension("WGL_NV_render_texture_rectangle", extStart, extEnd); #endif /* WGL_NV_render_texture_rectangle */ #ifdef WGL_NV_swap_group WGLEW_NV_swap_group = _glewSearchExtension("WGL_NV_swap_group", extStart, extEnd); if (glewExperimental || WGLEW_NV_swap_group|| crippled) WGLEW_NV_swap_group= !_glewInit_WGL_NV_swap_group(); #endif /* WGL_NV_swap_group */ #ifdef WGL_NV_vertex_array_range WGLEW_NV_vertex_array_range = _glewSearchExtension("WGL_NV_vertex_array_range", extStart, extEnd); if (glewExperimental || WGLEW_NV_vertex_array_range|| crippled) WGLEW_NV_vertex_array_range= !_glewInit_WGL_NV_vertex_array_range(); #endif /* WGL_NV_vertex_array_range */ #ifdef WGL_NV_video_capture WGLEW_NV_video_capture = _glewSearchExtension("WGL_NV_video_capture", extStart, extEnd); if (glewExperimental || WGLEW_NV_video_capture|| crippled) WGLEW_NV_video_capture= !_glewInit_WGL_NV_video_capture(); #endif /* WGL_NV_video_capture */ #ifdef WGL_NV_video_output WGLEW_NV_video_output = _glewSearchExtension("WGL_NV_video_output", extStart, extEnd); if (glewExperimental || WGLEW_NV_video_output|| crippled) WGLEW_NV_video_output= !_glewInit_WGL_NV_video_output(); #endif /* WGL_NV_video_output */ #ifdef WGL_OML_sync_control WGLEW_OML_sync_control = _glewSearchExtension("WGL_OML_sync_control", extStart, extEnd); if (glewExperimental || WGLEW_OML_sync_control|| crippled) WGLEW_OML_sync_control= !_glewInit_WGL_OML_sync_control(); #endif /* WGL_OML_sync_control */ return GLEW_OK; } #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL; PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig = NULL; PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext = NULL; PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer = NULL; PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap = NULL; PFNGLXCREATEWINDOWPROC __glewXCreateWindow = NULL; PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer = NULL; PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap = NULL; PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow = NULL; PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable = NULL; PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib = NULL; PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs = NULL; PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent = NULL; PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig = NULL; PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent = NULL; PFNGLXQUERYCONTEXTPROC __glewXQueryContext = NULL; PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable = NULL; PFNGLXSELECTEVENTPROC __glewXSelectEvent = NULL; PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD = NULL; PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD = NULL; PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD = NULL; PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD = NULL; PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD = NULL; PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD = NULL; PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD = NULL; PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD = NULL; PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD = NULL; PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB = NULL; PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI = NULL; PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI = NULL; PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI = NULL; PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT = NULL; PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT = NULL; PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT = NULL; PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT = NULL; PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT = NULL; PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT = NULL; PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT = NULL; PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA = NULL; PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA = NULL; PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA = NULL; PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA = NULL; PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA = NULL; PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA = NULL; PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA = NULL; PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA = NULL; PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA = NULL; PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA = NULL; PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA = NULL; PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV = NULL; PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV = NULL; PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV = NULL; PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV = NULL; PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV = NULL; PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV = NULL; PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV = NULL; PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV = NULL; PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV = NULL; PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV = NULL; PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV = NULL; PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV = NULL; PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV = NULL; PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV = NULL; PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV = NULL; PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV = NULL; PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV = NULL; PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV = NULL; PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV = NULL; PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV = NULL; PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV = NULL; PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV = NULL; PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV = NULL; PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV = NULL; PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV = NULL; PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML = NULL; PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML = NULL; PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML = NULL; PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML = NULL; PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML = NULL; PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX = NULL; PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX = NULL; PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX = NULL; PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX = NULL; PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX = NULL; PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX = NULL; PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX = NULL; PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX = NULL; PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX = NULL; PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX = NULL; PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX = NULL; PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX = NULL; PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX = NULL; PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX = NULL; PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX = NULL; PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX = NULL; PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX = NULL; PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX = NULL; PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX = NULL; PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX = NULL; PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX = NULL; PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX = NULL; PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX = NULL; PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX = NULL; PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX = NULL; PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX = NULL; PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX = NULL; PFNGLXCUSHIONSGIPROC __glewXCushionSGI = NULL; PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI = NULL; PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI = NULL; PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI = NULL; PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI = NULL; PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI = NULL; PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN = NULL; PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN = NULL; PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN = NULL; GLboolean __GLXEW_VERSION_1_0 = GL_FALSE; GLboolean __GLXEW_VERSION_1_1 = GL_FALSE; GLboolean __GLXEW_VERSION_1_2 = GL_FALSE; GLboolean __GLXEW_VERSION_1_3 = GL_FALSE; GLboolean __GLXEW_VERSION_1_4 = GL_FALSE; GLboolean __GLXEW_3DFX_multisample = GL_FALSE; GLboolean __GLXEW_AMD_gpu_association = GL_FALSE; GLboolean __GLXEW_ARB_context_flush_control = GL_FALSE; GLboolean __GLXEW_ARB_create_context = GL_FALSE; GLboolean __GLXEW_ARB_create_context_no_error = GL_FALSE; GLboolean __GLXEW_ARB_create_context_profile = GL_FALSE; GLboolean __GLXEW_ARB_create_context_robustness = GL_FALSE; GLboolean __GLXEW_ARB_fbconfig_float = GL_FALSE; GLboolean __GLXEW_ARB_framebuffer_sRGB = GL_FALSE; GLboolean __GLXEW_ARB_get_proc_address = GL_FALSE; GLboolean __GLXEW_ARB_multisample = GL_FALSE; GLboolean __GLXEW_ARB_robustness_application_isolation = GL_FALSE; GLboolean __GLXEW_ARB_robustness_share_group_isolation = GL_FALSE; GLboolean __GLXEW_ARB_vertex_buffer_object = GL_FALSE; GLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE; GLboolean __GLXEW_ATI_render_texture = GL_FALSE; GLboolean __GLXEW_EXT_buffer_age = GL_FALSE; GLboolean __GLXEW_EXT_create_context_es2_profile = GL_FALSE; GLboolean __GLXEW_EXT_create_context_es_profile = GL_FALSE; GLboolean __GLXEW_EXT_fbconfig_packed_float = GL_FALSE; GLboolean __GLXEW_EXT_framebuffer_sRGB = GL_FALSE; GLboolean __GLXEW_EXT_import_context = GL_FALSE; GLboolean __GLXEW_EXT_libglvnd = GL_FALSE; GLboolean __GLXEW_EXT_scene_marker = GL_FALSE; GLboolean __GLXEW_EXT_stereo_tree = GL_FALSE; GLboolean __GLXEW_EXT_swap_control = GL_FALSE; GLboolean __GLXEW_EXT_swap_control_tear = GL_FALSE; GLboolean __GLXEW_EXT_texture_from_pixmap = GL_FALSE; GLboolean __GLXEW_EXT_visual_info = GL_FALSE; GLboolean __GLXEW_EXT_visual_rating = GL_FALSE; GLboolean __GLXEW_INTEL_swap_event = GL_FALSE; GLboolean __GLXEW_MESA_agp_offset = GL_FALSE; GLboolean __GLXEW_MESA_copy_sub_buffer = GL_FALSE; GLboolean __GLXEW_MESA_pixmap_colormap = GL_FALSE; GLboolean __GLXEW_MESA_query_renderer = GL_FALSE; GLboolean __GLXEW_MESA_release_buffers = GL_FALSE; GLboolean __GLXEW_MESA_set_3dfx_mode = GL_FALSE; GLboolean __GLXEW_MESA_swap_control = GL_FALSE; GLboolean __GLXEW_NV_copy_buffer = GL_FALSE; GLboolean __GLXEW_NV_copy_image = GL_FALSE; GLboolean __GLXEW_NV_delay_before_swap = GL_FALSE; GLboolean __GLXEW_NV_float_buffer = GL_FALSE; GLboolean __GLXEW_NV_multisample_coverage = GL_FALSE; GLboolean __GLXEW_NV_present_video = GL_FALSE; GLboolean __GLXEW_NV_robustness_video_memory_purge = GL_FALSE; GLboolean __GLXEW_NV_swap_group = GL_FALSE; GLboolean __GLXEW_NV_vertex_array_range = GL_FALSE; GLboolean __GLXEW_NV_video_capture = GL_FALSE; GLboolean __GLXEW_NV_video_out = GL_FALSE; GLboolean __GLXEW_OML_swap_method = GL_FALSE; GLboolean __GLXEW_OML_sync_control = GL_FALSE; GLboolean __GLXEW_SGIS_blended_overlay = GL_FALSE; GLboolean __GLXEW_SGIS_color_range = GL_FALSE; GLboolean __GLXEW_SGIS_multisample = GL_FALSE; GLboolean __GLXEW_SGIS_shared_multisample = GL_FALSE; GLboolean __GLXEW_SGIX_fbconfig = GL_FALSE; GLboolean __GLXEW_SGIX_hyperpipe = GL_FALSE; GLboolean __GLXEW_SGIX_pbuffer = GL_FALSE; GLboolean __GLXEW_SGIX_swap_barrier = GL_FALSE; GLboolean __GLXEW_SGIX_swap_group = GL_FALSE; GLboolean __GLXEW_SGIX_video_resize = GL_FALSE; GLboolean __GLXEW_SGIX_visual_select_group = GL_FALSE; GLboolean __GLXEW_SGI_cushion = GL_FALSE; GLboolean __GLXEW_SGI_make_current_read = GL_FALSE; GLboolean __GLXEW_SGI_swap_control = GL_FALSE; GLboolean __GLXEW_SGI_video_sync = GL_FALSE; GLboolean __GLXEW_SUN_get_transparent_index = GL_FALSE; GLboolean __GLXEW_SUN_video_resize = GL_FALSE; #ifdef GLX_VERSION_1_2 static GLboolean _glewInit_GLX_VERSION_1_2 () { GLboolean r = GL_FALSE; r = ((glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentDisplay")) == NULL) || r; return r; } #endif /* GLX_VERSION_1_2 */ #ifdef GLX_VERSION_1_3 static GLboolean _glewInit_GLX_VERSION_1_3 () { GLboolean r = GL_FALSE; r = ((glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfig")) == NULL) || r; r = ((glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXCreateNewContext")) == NULL) || r; r = ((glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXCreatePbuffer")) == NULL) || r; r = ((glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXCreatePixmap")) == NULL) || r; r = ((glXCreateWindow = (PFNGLXCREATEWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXCreateWindow")) == NULL) || r; r = ((glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPbuffer")) == NULL) || r; r = ((glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPixmap")) == NULL) || r; r = ((glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXDestroyWindow")) == NULL) || r; r = ((glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawable")) == NULL) || r; r = ((glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttrib")) == NULL) || r; r = ((glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigs")) == NULL) || r; r = ((glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEvent")) == NULL) || r; r = ((glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfig")) == NULL) || r; r = ((glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC)glewGetProcAddress((const GLubyte*)"glXMakeContextCurrent")) == NULL) || r; r = ((glXQueryContext = (PFNGLXQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContext")) == NULL) || r; r = ((glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXQueryDrawable")) == NULL) || r; r = ((glXSelectEvent = (PFNGLXSELECTEVENTPROC)glewGetProcAddress((const GLubyte*)"glXSelectEvent")) == NULL) || r; return r; } #endif /* GLX_VERSION_1_3 */ #ifdef GLX_AMD_gpu_association static GLboolean _glewInit_GLX_AMD_gpu_association () { GLboolean r = GL_FALSE; r = ((glXBlitContextFramebufferAMD = (PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"glXBlitContextFramebufferAMD")) == NULL) || r; r = ((glXCreateAssociatedContextAMD = (PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAMD")) == NULL) || r; r = ((glXCreateAssociatedContextAttribsAMD = (PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAttribsAMD")) == NULL) || r; r = ((glXDeleteAssociatedContextAMD = (PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXDeleteAssociatedContextAMD")) == NULL) || r; r = ((glXGetContextGPUIDAMD = (PFNGLXGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetContextGPUIDAMD")) == NULL) || r; r = ((glXGetCurrentAssociatedContextAMD = (PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentAssociatedContextAMD")) == NULL) || r; r = ((glXGetGPUIDsAMD = (PFNGLXGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUIDsAMD")) == NULL) || r; r = ((glXGetGPUInfoAMD = (PFNGLXGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUInfoAMD")) == NULL) || r; r = ((glXMakeAssociatedContextCurrentAMD = (PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"glXMakeAssociatedContextCurrentAMD")) == NULL) || r; return r; } #endif /* GLX_AMD_gpu_association */ #ifdef GLX_ARB_create_context static GLboolean _glewInit_GLX_ARB_create_context () { GLboolean r = GL_FALSE; r = ((glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB")) == NULL) || r; return r; } #endif /* GLX_ARB_create_context */ #ifdef GLX_ATI_render_texture static GLboolean _glewInit_GLX_ATI_render_texture () { GLboolean r = GL_FALSE; r = ((glXBindTexImageATI = (PFNGLXBINDTEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageATI")) == NULL) || r; r = ((glXDrawableAttribATI = (PFNGLXDRAWABLEATTRIBATIPROC)glewGetProcAddress((const GLubyte*)"glXDrawableAttribATI")) == NULL) || r; r = ((glXReleaseTexImageATI = (PFNGLXRELEASETEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageATI")) == NULL) || r; return r; } #endif /* GLX_ATI_render_texture */ #ifdef GLX_EXT_import_context static GLboolean _glewInit_GLX_EXT_import_context () { GLboolean r = GL_FALSE; r = ((glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXFreeContextEXT")) == NULL) || r; r = ((glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC)glewGetProcAddress((const GLubyte*)"glXGetContextIDEXT")) == NULL) || r; r = ((glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXImportContextEXT")) == NULL) || r; r = ((glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContextInfoEXT")) == NULL) || r; return r; } #endif /* GLX_EXT_import_context */ #ifdef GLX_EXT_swap_control static GLboolean _glewInit_GLX_EXT_swap_control () { GLboolean r = GL_FALSE; r = ((glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalEXT")) == NULL) || r; return r; } #endif /* GLX_EXT_swap_control */ #ifdef GLX_EXT_texture_from_pixmap static GLboolean _glewInit_GLX_EXT_texture_from_pixmap () { GLboolean r = GL_FALSE; r = ((glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageEXT")) == NULL) || r; r = ((glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageEXT")) == NULL) || r; return r; } #endif /* GLX_EXT_texture_from_pixmap */ #ifdef GLX_MESA_agp_offset static GLboolean _glewInit_GLX_MESA_agp_offset () { GLboolean r = GL_FALSE; r = ((glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetAGPOffsetMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_agp_offset */ #ifdef GLX_MESA_copy_sub_buffer static GLboolean _glewInit_GLX_MESA_copy_sub_buffer () { GLboolean r = GL_FALSE; r = ((glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC)glewGetProcAddress((const GLubyte*)"glXCopySubBufferMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_copy_sub_buffer */ #ifdef GLX_MESA_pixmap_colormap static GLboolean _glewInit_GLX_MESA_pixmap_colormap () { GLboolean r = GL_FALSE; r = ((glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_pixmap_colormap */ #ifdef GLX_MESA_query_renderer static GLboolean _glewInit_GLX_MESA_query_renderer () { GLboolean r = GL_FALSE; r = ((glXQueryCurrentRendererIntegerMESA = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererIntegerMESA")) == NULL) || r; r = ((glXQueryCurrentRendererStringMESA = (PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererStringMESA")) == NULL) || r; r = ((glXQueryRendererIntegerMESA = (PFNGLXQUERYRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererIntegerMESA")) == NULL) || r; r = ((glXQueryRendererStringMESA = (PFNGLXQUERYRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererStringMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_query_renderer */ #ifdef GLX_MESA_release_buffers static GLboolean _glewInit_GLX_MESA_release_buffers () { GLboolean r = GL_FALSE; r = ((glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glXReleaseBuffersMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_release_buffers */ #ifdef GLX_MESA_set_3dfx_mode static GLboolean _glewInit_GLX_MESA_set_3dfx_mode () { GLboolean r = GL_FALSE; r = ((glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC)glewGetProcAddress((const GLubyte*)"glXSet3DfxModeMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_set_3dfx_mode */ #ifdef GLX_MESA_swap_control static GLboolean _glewInit_GLX_MESA_swap_control () { GLboolean r = GL_FALSE; r = ((glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetSwapIntervalMESA")) == NULL) || r; r = ((glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_swap_control */ #ifdef GLX_NV_copy_buffer static GLboolean _glewInit_GLX_NV_copy_buffer () { GLboolean r = GL_FALSE; r = ((glXCopyBufferSubDataNV = (PFNGLXCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyBufferSubDataNV")) == NULL) || r; r = ((glXNamedCopyBufferSubDataNV = (PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXNamedCopyBufferSubDataNV")) == NULL) || r; return r; } #endif /* GLX_NV_copy_buffer */ #ifdef GLX_NV_copy_image static GLboolean _glewInit_GLX_NV_copy_image () { GLboolean r = GL_FALSE; r = ((glXCopyImageSubDataNV = (PFNGLXCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyImageSubDataNV")) == NULL) || r; return r; } #endif /* GLX_NV_copy_image */ #ifdef GLX_NV_delay_before_swap static GLboolean _glewInit_GLX_NV_delay_before_swap () { GLboolean r = GL_FALSE; r = ((glXDelayBeforeSwapNV = (PFNGLXDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"glXDelayBeforeSwapNV")) == NULL) || r; return r; } #endif /* GLX_NV_delay_before_swap */ #ifdef GLX_NV_present_video static GLboolean _glewInit_GLX_NV_present_video () { GLboolean r = GL_FALSE; r = ((glXBindVideoDeviceNV = (PFNGLXBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoDeviceNV")) == NULL) || r; r = ((glXEnumerateVideoDevicesNV = (PFNGLXENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoDevicesNV")) == NULL) || r; return r; } #endif /* GLX_NV_present_video */ #ifdef GLX_NV_swap_group static GLboolean _glewInit_GLX_NV_swap_group () { GLboolean r = GL_FALSE; r = ((glXBindSwapBarrierNV = (PFNGLXBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierNV")) == NULL) || r; r = ((glXJoinSwapGroupNV = (PFNGLXJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupNV")) == NULL) || r; r = ((glXQueryFrameCountNV = (PFNGLXQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryFrameCountNV")) == NULL) || r; r = ((glXQueryMaxSwapGroupsNV = (PFNGLXQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapGroupsNV")) == NULL) || r; r = ((glXQuerySwapGroupNV = (PFNGLXQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXQuerySwapGroupNV")) == NULL) || r; r = ((glXResetFrameCountNV = (PFNGLXRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXResetFrameCountNV")) == NULL) || r; return r; } #endif /* GLX_NV_swap_group */ #ifdef GLX_NV_vertex_array_range static GLboolean _glewInit_GLX_NV_vertex_array_range () { GLboolean r = GL_FALSE; r = ((glXAllocateMemoryNV = (PFNGLXALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXAllocateMemoryNV")) == NULL) || r; r = ((glXFreeMemoryNV = (PFNGLXFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXFreeMemoryNV")) == NULL) || r; return r; } #endif /* GLX_NV_vertex_array_range */ #ifdef GLX_NV_video_capture static GLboolean _glewInit_GLX_NV_video_capture () { GLboolean r = GL_FALSE; r = ((glXBindVideoCaptureDeviceNV = (PFNGLXBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoCaptureDeviceNV")) == NULL) || r; r = ((glXEnumerateVideoCaptureDevicesNV = (PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoCaptureDevicesNV")) == NULL) || r; r = ((glXLockVideoCaptureDeviceNV = (PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXLockVideoCaptureDeviceNV")) == NULL) || r; r = ((glXQueryVideoCaptureDeviceNV = (PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXQueryVideoCaptureDeviceNV")) == NULL) || r; r = ((glXReleaseVideoCaptureDeviceNV = (PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoCaptureDeviceNV")) == NULL) || r; return r; } #endif /* GLX_NV_video_capture */ #ifdef GLX_NV_video_out static GLboolean _glewInit_GLX_NV_video_out () { GLboolean r = GL_FALSE; r = ((glXBindVideoImageNV = (PFNGLXBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoImageNV")) == NULL) || r; r = ((glXGetVideoDeviceNV = (PFNGLXGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoDeviceNV")) == NULL) || r; r = ((glXGetVideoInfoNV = (PFNGLXGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoInfoNV")) == NULL) || r; r = ((glXReleaseVideoDeviceNV = (PFNGLXRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoDeviceNV")) == NULL) || r; r = ((glXReleaseVideoImageNV = (PFNGLXRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoImageNV")) == NULL) || r; r = ((glXSendPbufferToVideoNV = (PFNGLXSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"glXSendPbufferToVideoNV")) == NULL) || r; return r; } #endif /* GLX_NV_video_out */ #ifdef GLX_OML_sync_control static GLboolean _glewInit_GLX_OML_sync_control () { GLboolean r = GL_FALSE; r = ((glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetMscRateOML")) == NULL) || r; r = ((glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetSyncValuesOML")) == NULL) || r; r = ((glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXSwapBuffersMscOML")) == NULL) || r; r = ((glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForMscOML")) == NULL) || r; r = ((glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForSbcOML")) == NULL) || r; return r; } #endif /* GLX_OML_sync_control */ #ifdef GLX_SGIX_fbconfig static GLboolean _glewInit_GLX_SGIX_fbconfig () { GLboolean r = GL_FALSE; r = ((glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfigSGIX")) == NULL) || r; r = ((glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextWithConfigSGIX")) == NULL) || r; r = ((glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapWithConfigSGIX")) == NULL) || r; r = ((glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttribSGIX")) == NULL) || r; r = ((glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigFromVisualSGIX")) == NULL) || r; r = ((glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfigSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_fbconfig */ #ifdef GLX_SGIX_hyperpipe static GLboolean _glewInit_GLX_SGIX_hyperpipe () { GLboolean r = GL_FALSE; r = ((glXBindHyperpipeSGIX = (PFNGLXBINDHYPERPIPESGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindHyperpipeSGIX")) == NULL) || r; r = ((glXDestroyHyperpipeConfigSGIX = (PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyHyperpipeConfigSGIX")) == NULL) || r; r = ((glXHyperpipeAttribSGIX = (PFNGLXHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeAttribSGIX")) == NULL) || r; r = ((glXHyperpipeConfigSGIX = (PFNGLXHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeConfigSGIX")) == NULL) || r; r = ((glXQueryHyperpipeAttribSGIX = (PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeAttribSGIX")) == NULL) || r; r = ((glXQueryHyperpipeBestAttribSGIX = (PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeBestAttribSGIX")) == NULL) || r; r = ((glXQueryHyperpipeConfigSGIX = (PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeConfigSGIX")) == NULL) || r; r = ((glXQueryHyperpipeNetworkSGIX = (PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeNetworkSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_hyperpipe */ #ifdef GLX_SGIX_pbuffer static GLboolean _glewInit_GLX_SGIX_pbuffer () { GLboolean r = GL_FALSE; r = ((glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPbufferSGIX")) == NULL) || r; r = ((glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyGLXPbufferSGIX")) == NULL) || r; r = ((glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEventSGIX")) == NULL) || r; r = ((glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryGLXPbufferSGIX")) == NULL) || r; r = ((glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXSelectEventSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_pbuffer */ #ifdef GLX_SGIX_swap_barrier static GLboolean _glewInit_GLX_SGIX_swap_barrier () { GLboolean r = GL_FALSE; r = ((glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierSGIX")) == NULL) || r; r = ((glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapBarriersSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_swap_barrier */ #ifdef GLX_SGIX_swap_group static GLboolean _glewInit_GLX_SGIX_swap_group () { GLboolean r = GL_FALSE; r = ((glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_swap_group */ #ifdef GLX_SGIX_video_resize static GLboolean _glewInit_GLX_SGIX_video_resize () { GLboolean r = GL_FALSE; r = ((glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindChannelToWindowSGIX")) == NULL) || r; r = ((glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSGIX")) == NULL) || r; r = ((glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSyncSGIX")) == NULL) || r; r = ((glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelDeltasSGIX")) == NULL) || r; r = ((glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelRectSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_video_resize */ #ifdef GLX_SGI_cushion static GLboolean _glewInit_GLX_SGI_cushion () { GLboolean r = GL_FALSE; r = ((glXCushionSGI = (PFNGLXCUSHIONSGIPROC)glewGetProcAddress((const GLubyte*)"glXCushionSGI")) == NULL) || r; return r; } #endif /* GLX_SGI_cushion */ #ifdef GLX_SGI_make_current_read static GLboolean _glewInit_GLX_SGI_make_current_read () { GLboolean r = GL_FALSE; r = ((glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawableSGI")) == NULL) || r; r = ((glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC)glewGetProcAddress((const GLubyte*)"glXMakeCurrentReadSGI")) == NULL) || r; return r; } #endif /* GLX_SGI_make_current_read */ #ifdef GLX_SGI_swap_control static GLboolean _glewInit_GLX_SGI_swap_control () { GLboolean r = GL_FALSE; r = ((glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalSGI")) == NULL) || r; return r; } #endif /* GLX_SGI_swap_control */ #ifdef GLX_SGI_video_sync static GLboolean _glewInit_GLX_SGI_video_sync () { GLboolean r = GL_FALSE; r = ((glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI")) == NULL) || r; r = ((glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXWaitVideoSyncSGI")) == NULL) || r; return r; } #endif /* GLX_SGI_video_sync */ #ifdef GLX_SUN_get_transparent_index static GLboolean _glewInit_GLX_SUN_get_transparent_index () { GLboolean r = GL_FALSE; r = ((glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC)glewGetProcAddress((const GLubyte*)"glXGetTransparentIndexSUN")) == NULL) || r; return r; } #endif /* GLX_SUN_get_transparent_index */ #ifdef GLX_SUN_video_resize static GLboolean _glewInit_GLX_SUN_video_resize () { GLboolean r = GL_FALSE; r = ((glXGetVideoResizeSUN = (PFNGLXGETVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoResizeSUN")) == NULL) || r; r = ((glXVideoResizeSUN = (PFNGLXVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXVideoResizeSUN")) == NULL) || r; return r; } #endif /* GLX_SUN_video_resize */ /* ------------------------------------------------------------------------ */ GLboolean glxewGetExtension (const char* name) { const GLubyte* start; const GLubyte* end; if (glXGetCurrentDisplay == NULL) return GL_FALSE; start = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); if (0 == start) return GL_FALSE; end = start + _glewStrLen(start); return _glewSearchExtension(name, start, end); } GLenum glxewInit () { Display* display; int major, minor; const GLubyte* extStart; const GLubyte* extEnd; /* initialize core GLX 1.2 */ if (_glewInit_GLX_VERSION_1_2()) return GLEW_ERROR_GLX_VERSION_11_ONLY; /* check for a display */ display = glXGetCurrentDisplay(); if (display == NULL) return GLEW_ERROR_NO_GLX_DISPLAY; /* initialize flags */ GLXEW_VERSION_1_0 = GL_TRUE; GLXEW_VERSION_1_1 = GL_TRUE; GLXEW_VERSION_1_2 = GL_TRUE; GLXEW_VERSION_1_3 = GL_TRUE; GLXEW_VERSION_1_4 = GL_TRUE; /* query GLX version */ glXQueryVersion(display, &major, &minor); if (major == 1 && minor <= 3) { switch (minor) { case 3: GLXEW_VERSION_1_4 = GL_FALSE; break; case 2: GLXEW_VERSION_1_4 = GL_FALSE; GLXEW_VERSION_1_3 = GL_FALSE; break; default: return GLEW_ERROR_GLX_VERSION_11_ONLY; break; } } /* query GLX extension string */ extStart = 0; if (glXGetCurrentDisplay != NULL) extStart = (const GLubyte*)glXGetClientString(display, GLX_EXTENSIONS); if (extStart == 0) extStart = (const GLubyte *)""; extEnd = extStart + _glewStrLen(extStart); /* initialize extensions */ #ifdef GLX_VERSION_1_3 if (glewExperimental || GLXEW_VERSION_1_3) GLXEW_VERSION_1_3 = !_glewInit_GLX_VERSION_1_3(); #endif /* GLX_VERSION_1_3 */ #ifdef GLX_3DFX_multisample GLXEW_3DFX_multisample = _glewSearchExtension("GLX_3DFX_multisample", extStart, extEnd); #endif /* GLX_3DFX_multisample */ #ifdef GLX_AMD_gpu_association GLXEW_AMD_gpu_association = _glewSearchExtension("GLX_AMD_gpu_association", extStart, extEnd); if (glewExperimental || GLXEW_AMD_gpu_association) GLXEW_AMD_gpu_association = !_glewInit_GLX_AMD_gpu_association(); #endif /* GLX_AMD_gpu_association */ #ifdef GLX_ARB_context_flush_control GLXEW_ARB_context_flush_control = _glewSearchExtension("GLX_ARB_context_flush_control", extStart, extEnd); #endif /* GLX_ARB_context_flush_control */ #ifdef GLX_ARB_create_context GLXEW_ARB_create_context = _glewSearchExtension("GLX_ARB_create_context", extStart, extEnd); if (glewExperimental || GLXEW_ARB_create_context) GLXEW_ARB_create_context = !_glewInit_GLX_ARB_create_context(); #endif /* GLX_ARB_create_context */ #ifdef GLX_ARB_create_context_no_error GLXEW_ARB_create_context_no_error = _glewSearchExtension("GLX_ARB_create_context_no_error", extStart, extEnd); #endif /* GLX_ARB_create_context_no_error */ #ifdef GLX_ARB_create_context_profile GLXEW_ARB_create_context_profile = _glewSearchExtension("GLX_ARB_create_context_profile", extStart, extEnd); #endif /* GLX_ARB_create_context_profile */ #ifdef GLX_ARB_create_context_robustness GLXEW_ARB_create_context_robustness = _glewSearchExtension("GLX_ARB_create_context_robustness", extStart, extEnd); #endif /* GLX_ARB_create_context_robustness */ #ifdef GLX_ARB_fbconfig_float GLXEW_ARB_fbconfig_float = _glewSearchExtension("GLX_ARB_fbconfig_float", extStart, extEnd); #endif /* GLX_ARB_fbconfig_float */ #ifdef GLX_ARB_framebuffer_sRGB GLXEW_ARB_framebuffer_sRGB = _glewSearchExtension("GLX_ARB_framebuffer_sRGB", extStart, extEnd); #endif /* GLX_ARB_framebuffer_sRGB */ #ifdef GLX_ARB_get_proc_address GLXEW_ARB_get_proc_address = _glewSearchExtension("GLX_ARB_get_proc_address", extStart, extEnd); #endif /* GLX_ARB_get_proc_address */ #ifdef GLX_ARB_multisample GLXEW_ARB_multisample = _glewSearchExtension("GLX_ARB_multisample", extStart, extEnd); #endif /* GLX_ARB_multisample */ #ifdef GLX_ARB_robustness_application_isolation GLXEW_ARB_robustness_application_isolation = _glewSearchExtension("GLX_ARB_robustness_application_isolation", extStart, extEnd); #endif /* GLX_ARB_robustness_application_isolation */ #ifdef GLX_ARB_robustness_share_group_isolation GLXEW_ARB_robustness_share_group_isolation = _glewSearchExtension("GLX_ARB_robustness_share_group_isolation", extStart, extEnd); #endif /* GLX_ARB_robustness_share_group_isolation */ #ifdef GLX_ARB_vertex_buffer_object GLXEW_ARB_vertex_buffer_object = _glewSearchExtension("GLX_ARB_vertex_buffer_object", extStart, extEnd); #endif /* GLX_ARB_vertex_buffer_object */ #ifdef GLX_ATI_pixel_format_float GLXEW_ATI_pixel_format_float = _glewSearchExtension("GLX_ATI_pixel_format_float", extStart, extEnd); #endif /* GLX_ATI_pixel_format_float */ #ifdef GLX_ATI_render_texture GLXEW_ATI_render_texture = _glewSearchExtension("GLX_ATI_render_texture", extStart, extEnd); if (glewExperimental || GLXEW_ATI_render_texture) GLXEW_ATI_render_texture = !_glewInit_GLX_ATI_render_texture(); #endif /* GLX_ATI_render_texture */ #ifdef GLX_EXT_buffer_age GLXEW_EXT_buffer_age = _glewSearchExtension("GLX_EXT_buffer_age", extStart, extEnd); #endif /* GLX_EXT_buffer_age */ #ifdef GLX_EXT_create_context_es2_profile GLXEW_EXT_create_context_es2_profile = _glewSearchExtension("GLX_EXT_create_context_es2_profile", extStart, extEnd); #endif /* GLX_EXT_create_context_es2_profile */ #ifdef GLX_EXT_create_context_es_profile GLXEW_EXT_create_context_es_profile = _glewSearchExtension("GLX_EXT_create_context_es_profile", extStart, extEnd); #endif /* GLX_EXT_create_context_es_profile */ #ifdef GLX_EXT_fbconfig_packed_float GLXEW_EXT_fbconfig_packed_float = _glewSearchExtension("GLX_EXT_fbconfig_packed_float", extStart, extEnd); #endif /* GLX_EXT_fbconfig_packed_float */ #ifdef GLX_EXT_framebuffer_sRGB GLXEW_EXT_framebuffer_sRGB = _glewSearchExtension("GLX_EXT_framebuffer_sRGB", extStart, extEnd); #endif /* GLX_EXT_framebuffer_sRGB */ #ifdef GLX_EXT_import_context GLXEW_EXT_import_context = _glewSearchExtension("GLX_EXT_import_context", extStart, extEnd); if (glewExperimental || GLXEW_EXT_import_context) GLXEW_EXT_import_context = !_glewInit_GLX_EXT_import_context(); #endif /* GLX_EXT_import_context */ #ifdef GLX_EXT_libglvnd GLXEW_EXT_libglvnd = _glewSearchExtension("GLX_EXT_libglvnd", extStart, extEnd); #endif /* GLX_EXT_libglvnd */ #ifdef GLX_EXT_scene_marker GLXEW_EXT_scene_marker = _glewSearchExtension("GLX_EXT_scene_marker", extStart, extEnd); #endif /* GLX_EXT_scene_marker */ #ifdef GLX_EXT_stereo_tree GLXEW_EXT_stereo_tree = _glewSearchExtension("GLX_EXT_stereo_tree", extStart, extEnd); #endif /* GLX_EXT_stereo_tree */ #ifdef GLX_EXT_swap_control GLXEW_EXT_swap_control = _glewSearchExtension("GLX_EXT_swap_control", extStart, extEnd); if (glewExperimental || GLXEW_EXT_swap_control) GLXEW_EXT_swap_control = !_glewInit_GLX_EXT_swap_control(); #endif /* GLX_EXT_swap_control */ #ifdef GLX_EXT_swap_control_tear GLXEW_EXT_swap_control_tear = _glewSearchExtension("GLX_EXT_swap_control_tear", extStart, extEnd); #endif /* GLX_EXT_swap_control_tear */ #ifdef GLX_EXT_texture_from_pixmap GLXEW_EXT_texture_from_pixmap = _glewSearchExtension("GLX_EXT_texture_from_pixmap", extStart, extEnd); if (glewExperimental || GLXEW_EXT_texture_from_pixmap) GLXEW_EXT_texture_from_pixmap = !_glewInit_GLX_EXT_texture_from_pixmap(); #endif /* GLX_EXT_texture_from_pixmap */ #ifdef GLX_EXT_visual_info GLXEW_EXT_visual_info = _glewSearchExtension("GLX_EXT_visual_info", extStart, extEnd); #endif /* GLX_EXT_visual_info */ #ifdef GLX_EXT_visual_rating GLXEW_EXT_visual_rating = _glewSearchExtension("GLX_EXT_visual_rating", extStart, extEnd); #endif /* GLX_EXT_visual_rating */ #ifdef GLX_INTEL_swap_event GLXEW_INTEL_swap_event = _glewSearchExtension("GLX_INTEL_swap_event", extStart, extEnd); #endif /* GLX_INTEL_swap_event */ #ifdef GLX_MESA_agp_offset GLXEW_MESA_agp_offset = _glewSearchExtension("GLX_MESA_agp_offset", extStart, extEnd); if (glewExperimental || GLXEW_MESA_agp_offset) GLXEW_MESA_agp_offset = !_glewInit_GLX_MESA_agp_offset(); #endif /* GLX_MESA_agp_offset */ #ifdef GLX_MESA_copy_sub_buffer GLXEW_MESA_copy_sub_buffer = _glewSearchExtension("GLX_MESA_copy_sub_buffer", extStart, extEnd); if (glewExperimental || GLXEW_MESA_copy_sub_buffer) GLXEW_MESA_copy_sub_buffer = !_glewInit_GLX_MESA_copy_sub_buffer(); #endif /* GLX_MESA_copy_sub_buffer */ #ifdef GLX_MESA_pixmap_colormap GLXEW_MESA_pixmap_colormap = _glewSearchExtension("GLX_MESA_pixmap_colormap", extStart, extEnd); if (glewExperimental || GLXEW_MESA_pixmap_colormap) GLXEW_MESA_pixmap_colormap = !_glewInit_GLX_MESA_pixmap_colormap(); #endif /* GLX_MESA_pixmap_colormap */ #ifdef GLX_MESA_query_renderer GLXEW_MESA_query_renderer = _glewSearchExtension("GLX_MESA_query_renderer", extStart, extEnd); if (glewExperimental || GLXEW_MESA_query_renderer) GLXEW_MESA_query_renderer = !_glewInit_GLX_MESA_query_renderer(); #endif /* GLX_MESA_query_renderer */ #ifdef GLX_MESA_release_buffers GLXEW_MESA_release_buffers = _glewSearchExtension("GLX_MESA_release_buffers", extStart, extEnd); if (glewExperimental || GLXEW_MESA_release_buffers) GLXEW_MESA_release_buffers = !_glewInit_GLX_MESA_release_buffers(); #endif /* GLX_MESA_release_buffers */ #ifdef GLX_MESA_set_3dfx_mode GLXEW_MESA_set_3dfx_mode = _glewSearchExtension("GLX_MESA_set_3dfx_mode", extStart, extEnd); if (glewExperimental || GLXEW_MESA_set_3dfx_mode) GLXEW_MESA_set_3dfx_mode = !_glewInit_GLX_MESA_set_3dfx_mode(); #endif /* GLX_MESA_set_3dfx_mode */ #ifdef GLX_MESA_swap_control GLXEW_MESA_swap_control = _glewSearchExtension("GLX_MESA_swap_control", extStart, extEnd); if (glewExperimental || GLXEW_MESA_swap_control) GLXEW_MESA_swap_control = !_glewInit_GLX_MESA_swap_control(); #endif /* GLX_MESA_swap_control */ #ifdef GLX_NV_copy_buffer GLXEW_NV_copy_buffer = _glewSearchExtension("GLX_NV_copy_buffer", extStart, extEnd); if (glewExperimental || GLXEW_NV_copy_buffer) GLXEW_NV_copy_buffer = !_glewInit_GLX_NV_copy_buffer(); #endif /* GLX_NV_copy_buffer */ #ifdef GLX_NV_copy_image GLXEW_NV_copy_image = _glewSearchExtension("GLX_NV_copy_image", extStart, extEnd); if (glewExperimental || GLXEW_NV_copy_image) GLXEW_NV_copy_image = !_glewInit_GLX_NV_copy_image(); #endif /* GLX_NV_copy_image */ #ifdef GLX_NV_delay_before_swap GLXEW_NV_delay_before_swap = _glewSearchExtension("GLX_NV_delay_before_swap", extStart, extEnd); if (glewExperimental || GLXEW_NV_delay_before_swap) GLXEW_NV_delay_before_swap = !_glewInit_GLX_NV_delay_before_swap(); #endif /* GLX_NV_delay_before_swap */ #ifdef GLX_NV_float_buffer GLXEW_NV_float_buffer = _glewSearchExtension("GLX_NV_float_buffer", extStart, extEnd); #endif /* GLX_NV_float_buffer */ #ifdef GLX_NV_multisample_coverage GLXEW_NV_multisample_coverage = _glewSearchExtension("GLX_NV_multisample_coverage", extStart, extEnd); #endif /* GLX_NV_multisample_coverage */ #ifdef GLX_NV_present_video GLXEW_NV_present_video = _glewSearchExtension("GLX_NV_present_video", extStart, extEnd); if (glewExperimental || GLXEW_NV_present_video) GLXEW_NV_present_video = !_glewInit_GLX_NV_present_video(); #endif /* GLX_NV_present_video */ #ifdef GLX_NV_robustness_video_memory_purge GLXEW_NV_robustness_video_memory_purge = _glewSearchExtension("GLX_NV_robustness_video_memory_purge", extStart, extEnd); #endif /* GLX_NV_robustness_video_memory_purge */ #ifdef GLX_NV_swap_group GLXEW_NV_swap_group = _glewSearchExtension("GLX_NV_swap_group", extStart, extEnd); if (glewExperimental || GLXEW_NV_swap_group) GLXEW_NV_swap_group = !_glewInit_GLX_NV_swap_group(); #endif /* GLX_NV_swap_group */ #ifdef GLX_NV_vertex_array_range GLXEW_NV_vertex_array_range = _glewSearchExtension("GLX_NV_vertex_array_range", extStart, extEnd); if (glewExperimental || GLXEW_NV_vertex_array_range) GLXEW_NV_vertex_array_range = !_glewInit_GLX_NV_vertex_array_range(); #endif /* GLX_NV_vertex_array_range */ #ifdef GLX_NV_video_capture GLXEW_NV_video_capture = _glewSearchExtension("GLX_NV_video_capture", extStart, extEnd); if (glewExperimental || GLXEW_NV_video_capture) GLXEW_NV_video_capture = !_glewInit_GLX_NV_video_capture(); #endif /* GLX_NV_video_capture */ #ifdef GLX_NV_video_out GLXEW_NV_video_out = _glewSearchExtension("GLX_NV_video_out", extStart, extEnd); if (glewExperimental || GLXEW_NV_video_out) GLXEW_NV_video_out = !_glewInit_GLX_NV_video_out(); #endif /* GLX_NV_video_out */ #ifdef GLX_OML_swap_method GLXEW_OML_swap_method = _glewSearchExtension("GLX_OML_swap_method", extStart, extEnd); #endif /* GLX_OML_swap_method */ #ifdef GLX_OML_sync_control GLXEW_OML_sync_control = _glewSearchExtension("GLX_OML_sync_control", extStart, extEnd); if (glewExperimental || GLXEW_OML_sync_control) GLXEW_OML_sync_control = !_glewInit_GLX_OML_sync_control(); #endif /* GLX_OML_sync_control */ #ifdef GLX_SGIS_blended_overlay GLXEW_SGIS_blended_overlay = _glewSearchExtension("GLX_SGIS_blended_overlay", extStart, extEnd); #endif /* GLX_SGIS_blended_overlay */ #ifdef GLX_SGIS_color_range GLXEW_SGIS_color_range = _glewSearchExtension("GLX_SGIS_color_range", extStart, extEnd); #endif /* GLX_SGIS_color_range */ #ifdef GLX_SGIS_multisample GLXEW_SGIS_multisample = _glewSearchExtension("GLX_SGIS_multisample", extStart, extEnd); #endif /* GLX_SGIS_multisample */ #ifdef GLX_SGIS_shared_multisample GLXEW_SGIS_shared_multisample = _glewSearchExtension("GLX_SGIS_shared_multisample", extStart, extEnd); #endif /* GLX_SGIS_shared_multisample */ #ifdef GLX_SGIX_fbconfig GLXEW_SGIX_fbconfig = _glewSearchExtension("GLX_SGIX_fbconfig", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_fbconfig) GLXEW_SGIX_fbconfig = !_glewInit_GLX_SGIX_fbconfig(); #endif /* GLX_SGIX_fbconfig */ #ifdef GLX_SGIX_hyperpipe GLXEW_SGIX_hyperpipe = _glewSearchExtension("GLX_SGIX_hyperpipe", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_hyperpipe) GLXEW_SGIX_hyperpipe = !_glewInit_GLX_SGIX_hyperpipe(); #endif /* GLX_SGIX_hyperpipe */ #ifdef GLX_SGIX_pbuffer GLXEW_SGIX_pbuffer = _glewSearchExtension("GLX_SGIX_pbuffer", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_pbuffer) GLXEW_SGIX_pbuffer = !_glewInit_GLX_SGIX_pbuffer(); #endif /* GLX_SGIX_pbuffer */ #ifdef GLX_SGIX_swap_barrier GLXEW_SGIX_swap_barrier = _glewSearchExtension("GLX_SGIX_swap_barrier", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_swap_barrier) GLXEW_SGIX_swap_barrier = !_glewInit_GLX_SGIX_swap_barrier(); #endif /* GLX_SGIX_swap_barrier */ #ifdef GLX_SGIX_swap_group GLXEW_SGIX_swap_group = _glewSearchExtension("GLX_SGIX_swap_group", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_swap_group) GLXEW_SGIX_swap_group = !_glewInit_GLX_SGIX_swap_group(); #endif /* GLX_SGIX_swap_group */ #ifdef GLX_SGIX_video_resize GLXEW_SGIX_video_resize = _glewSearchExtension("GLX_SGIX_video_resize", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_video_resize) GLXEW_SGIX_video_resize = !_glewInit_GLX_SGIX_video_resize(); #endif /* GLX_SGIX_video_resize */ #ifdef GLX_SGIX_visual_select_group GLXEW_SGIX_visual_select_group = _glewSearchExtension("GLX_SGIX_visual_select_group", extStart, extEnd); #endif /* GLX_SGIX_visual_select_group */ #ifdef GLX_SGI_cushion GLXEW_SGI_cushion = _glewSearchExtension("GLX_SGI_cushion", extStart, extEnd); if (glewExperimental || GLXEW_SGI_cushion) GLXEW_SGI_cushion = !_glewInit_GLX_SGI_cushion(); #endif /* GLX_SGI_cushion */ #ifdef GLX_SGI_make_current_read GLXEW_SGI_make_current_read = _glewSearchExtension("GLX_SGI_make_current_read", extStart, extEnd); if (glewExperimental || GLXEW_SGI_make_current_read) GLXEW_SGI_make_current_read = !_glewInit_GLX_SGI_make_current_read(); #endif /* GLX_SGI_make_current_read */ #ifdef GLX_SGI_swap_control GLXEW_SGI_swap_control = _glewSearchExtension("GLX_SGI_swap_control", extStart, extEnd); if (glewExperimental || GLXEW_SGI_swap_control) GLXEW_SGI_swap_control = !_glewInit_GLX_SGI_swap_control(); #endif /* GLX_SGI_swap_control */ #ifdef GLX_SGI_video_sync GLXEW_SGI_video_sync = _glewSearchExtension("GLX_SGI_video_sync", extStart, extEnd); if (glewExperimental || GLXEW_SGI_video_sync) GLXEW_SGI_video_sync = !_glewInit_GLX_SGI_video_sync(); #endif /* GLX_SGI_video_sync */ #ifdef GLX_SUN_get_transparent_index GLXEW_SUN_get_transparent_index = _glewSearchExtension("GLX_SUN_get_transparent_index", extStart, extEnd); if (glewExperimental || GLXEW_SUN_get_transparent_index) GLXEW_SUN_get_transparent_index = !_glewInit_GLX_SUN_get_transparent_index(); #endif /* GLX_SUN_get_transparent_index */ #ifdef GLX_SUN_video_resize GLXEW_SUN_video_resize = _glewSearchExtension("GLX_SUN_video_resize", extStart, extEnd); if (glewExperimental || GLXEW_SUN_video_resize) GLXEW_SUN_video_resize = !_glewInit_GLX_SUN_video_resize(); #endif /* GLX_SUN_video_resize */ return GLEW_OK; } #endif /* !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) */ /* ------------------------------------------------------------------------ */ const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error) { static const GLubyte* _glewErrorString[] = { (const GLubyte*)"No error", (const GLubyte*)"Missing GL version", (const GLubyte*)"GL 1.1 and up are not supported", (const GLubyte*)"GLX 1.2 and up are not supported", (const GLubyte*)"Unknown error" }; const size_t max_error = sizeof(_glewErrorString)/sizeof(*_glewErrorString) - 1; return _glewErrorString[(size_t)error > max_error ? max_error : (size_t)error]; } const GLubyte * GLEWAPIENTRY glewGetString (GLenum name) { static const GLubyte* _glewString[] = { (const GLubyte*)NULL, (const GLubyte*)"2.1.0", (const GLubyte*)"2", (const GLubyte*)"1", (const GLubyte*)"0" }; const size_t max_string = sizeof(_glewString)/sizeof(*_glewString) - 1; return _glewString[(size_t)name > max_string ? 0 : (size_t)name]; } /* ------------------------------------------------------------------------ */ GLboolean glewExperimental = GL_FALSE; GLenum GLEWAPIENTRY glewInit (void) { GLenum r; #if defined(GLEW_EGL) PFNEGLGETCURRENTDISPLAYPROC getCurrentDisplay = NULL; #endif r = glewContextInit(); if ( r != 0 ) return r; #if defined(GLEW_EGL) getCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) glewGetProcAddress("eglGetCurrentDisplay"); return eglewInit(getCurrentDisplay()); #elif defined(GLEW_OSMESA) || defined(__ANDROID__) || defined(__native_client__) || defined(__HAIKU__) return r; #elif defined(_WIN32) return wglewInit(); #elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) /* _UNIX */ return glxewInit(); #else return r; #endif /* _WIN32 */ } #if defined(_WIN32) && defined(GLEW_BUILD) && defined(__GNUC__) /* GCC requires a DLL entry point even without any standard library included. */ /* Types extracted from windows.h to avoid polluting the rest of the file. */ int __stdcall DllMainCRTStartup(void* instance, unsigned reason, void* reserved) { (void) instance; (void) reason; (void) reserved; return 1; } #endif GLboolean GLEWAPIENTRY glewIsSupported (const char* name) { const GLubyte* pos = (const GLubyte*)name; GLuint len = _glewStrLen(pos); GLboolean ret = GL_TRUE; while (ret && len > 0) { if (_glewStrSame1(&pos, &len, (const GLubyte*)"GL_", 3)) { if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) { #ifdef GL_VERSION_1_2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) { ret = GLEW_VERSION_1_2; continue; } #endif #ifdef GL_VERSION_1_2_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2_1", 5)) { ret = GLEW_VERSION_1_2_1; continue; } #endif #ifdef GL_VERSION_1_3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) { ret = GLEW_VERSION_1_3; continue; } #endif #ifdef GL_VERSION_1_4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) { ret = GLEW_VERSION_1_4; continue; } #endif #ifdef GL_VERSION_1_5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3)) { ret = GLEW_VERSION_1_5; continue; } #endif #ifdef GL_VERSION_2_0 if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_0", 3)) { ret = GLEW_VERSION_2_0; continue; } #endif #ifdef GL_VERSION_2_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_1", 3)) { ret = GLEW_VERSION_2_1; continue; } #endif #ifdef GL_VERSION_3_0 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_0", 3)) { ret = GLEW_VERSION_3_0; continue; } #endif #ifdef GL_VERSION_3_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_1", 3)) { ret = GLEW_VERSION_3_1; continue; } #endif #ifdef GL_VERSION_3_2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_2", 3)) { ret = GLEW_VERSION_3_2; continue; } #endif #ifdef GL_VERSION_3_3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_3", 3)) { ret = GLEW_VERSION_3_3; continue; } #endif #ifdef GL_VERSION_4_0 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_0", 3)) { ret = GLEW_VERSION_4_0; continue; } #endif #ifdef GL_VERSION_4_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_1", 3)) { ret = GLEW_VERSION_4_1; continue; } #endif #ifdef GL_VERSION_4_2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_2", 3)) { ret = GLEW_VERSION_4_2; continue; } #endif #ifdef GL_VERSION_4_3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_3", 3)) { ret = GLEW_VERSION_4_3; continue; } #endif #ifdef GL_VERSION_4_4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_4", 3)) { ret = GLEW_VERSION_4_4; continue; } #endif #ifdef GL_VERSION_4_5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_5", 3)) { ret = GLEW_VERSION_4_5; continue; } #endif #ifdef GL_VERSION_4_6 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_6", 3)) { ret = GLEW_VERSION_4_6; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) { #ifdef GL_3DFX_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLEW_3DFX_multisample; continue; } #endif #ifdef GL_3DFX_tbuffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"tbuffer", 7)) { ret = GLEW_3DFX_tbuffer; continue; } #endif #ifdef GL_3DFX_texture_compression_FXT1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_FXT1", 24)) { ret = GLEW_3DFX_texture_compression_FXT1; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) { #ifdef GL_AMD_blend_minmax_factor if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax_factor", 19)) { ret = GLEW_AMD_blend_minmax_factor; continue; } #endif #ifdef GL_AMD_compressed_3DC_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_3DC_texture", 22)) { ret = GLEW_AMD_compressed_3DC_texture; continue; } #endif #ifdef GL_AMD_compressed_ATC_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_ATC_texture", 22)) { ret = GLEW_AMD_compressed_ATC_texture; continue; } #endif #ifdef GL_AMD_conservative_depth if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) { ret = GLEW_AMD_conservative_depth; continue; } #endif #ifdef GL_AMD_debug_output if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) { ret = GLEW_AMD_debug_output; continue; } #endif #ifdef GL_AMD_depth_clamp_separate if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp_separate", 20)) { ret = GLEW_AMD_depth_clamp_separate; continue; } #endif #ifdef GL_AMD_draw_buffers_blend if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) { ret = GLEW_AMD_draw_buffers_blend; continue; } #endif #ifdef GL_AMD_framebuffer_sample_positions if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sample_positions", 28)) { ret = GLEW_AMD_framebuffer_sample_positions; continue; } #endif #ifdef GL_AMD_gcn_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"gcn_shader", 10)) { ret = GLEW_AMD_gcn_shader; continue; } #endif #ifdef GL_AMD_gpu_shader_half_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_half_float", 21)) { ret = GLEW_AMD_gpu_shader_half_float; continue; } #endif #ifdef GL_AMD_gpu_shader_int16 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int16", 16)) { ret = GLEW_AMD_gpu_shader_int16; continue; } #endif #ifdef GL_AMD_gpu_shader_int64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16)) { ret = GLEW_AMD_gpu_shader_int64; continue; } #endif #ifdef GL_AMD_interleaved_elements if (_glewStrSame3(&pos, &len, (const GLubyte*)"interleaved_elements", 20)) { ret = GLEW_AMD_interleaved_elements; continue; } #endif #ifdef GL_AMD_multi_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) { ret = GLEW_AMD_multi_draw_indirect; continue; } #endif #ifdef GL_AMD_name_gen_delete if (_glewStrSame3(&pos, &len, (const GLubyte*)"name_gen_delete", 15)) { ret = GLEW_AMD_name_gen_delete; continue; } #endif #ifdef GL_AMD_occlusion_query_event if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query_event", 21)) { ret = GLEW_AMD_occlusion_query_event; continue; } #endif #ifdef GL_AMD_performance_monitor if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_monitor", 19)) { ret = GLEW_AMD_performance_monitor; continue; } #endif #ifdef GL_AMD_pinned_memory if (_glewStrSame3(&pos, &len, (const GLubyte*)"pinned_memory", 13)) { ret = GLEW_AMD_pinned_memory; continue; } #endif #ifdef GL_AMD_program_binary_Z400 if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary_Z400", 19)) { ret = GLEW_AMD_program_binary_Z400; continue; } #endif #ifdef GL_AMD_query_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) { ret = GLEW_AMD_query_buffer_object; continue; } #endif #ifdef GL_AMD_sample_positions if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_positions", 16)) { ret = GLEW_AMD_sample_positions; continue; } #endif #ifdef GL_AMD_seamless_cubemap_per_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) { ret = GLEW_AMD_seamless_cubemap_per_texture; continue; } #endif #ifdef GL_AMD_shader_atomic_counter_ops if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25)) { ret = GLEW_AMD_shader_atomic_counter_ops; continue; } #endif #ifdef GL_AMD_shader_ballot if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_ballot", 13)) { ret = GLEW_AMD_shader_ballot; continue; } #endif #ifdef GL_AMD_shader_explicit_vertex_parameter if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_explicit_vertex_parameter", 32)) { ret = GLEW_AMD_shader_explicit_vertex_parameter; continue; } #endif #ifdef GL_AMD_shader_stencil_export if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) { ret = GLEW_AMD_shader_stencil_export; continue; } #endif #ifdef GL_AMD_shader_stencil_value_export if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_value_export", 27)) { ret = GLEW_AMD_shader_stencil_value_export; continue; } #endif #ifdef GL_AMD_shader_trinary_minmax if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_trinary_minmax", 21)) { ret = GLEW_AMD_shader_trinary_minmax; continue; } #endif #ifdef GL_AMD_sparse_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) { ret = GLEW_AMD_sparse_texture; continue; } #endif #ifdef GL_AMD_stencil_operation_extended if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_operation_extended", 26)) { ret = GLEW_AMD_stencil_operation_extended; continue; } #endif #ifdef GL_AMD_texture_gather_bias_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_gather_bias_lod", 23)) { ret = GLEW_AMD_texture_gather_bias_lod; continue; } #endif #ifdef GL_AMD_texture_texture4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_texture4", 16)) { ret = GLEW_AMD_texture_texture4; continue; } #endif #ifdef GL_AMD_transform_feedback3_lines_triangles if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3_lines_triangles", 35)) { ret = GLEW_AMD_transform_feedback3_lines_triangles; continue; } #endif #ifdef GL_AMD_transform_feedback4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback4", 19)) { ret = GLEW_AMD_transform_feedback4; continue; } #endif #ifdef GL_AMD_vertex_shader_layer if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_layer", 19)) { ret = GLEW_AMD_vertex_shader_layer; continue; } #endif #ifdef GL_AMD_vertex_shader_tessellator if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_tessellator", 25)) { ret = GLEW_AMD_vertex_shader_tessellator; continue; } #endif #ifdef GL_AMD_vertex_shader_viewport_index if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_viewport_index", 28)) { ret = GLEW_AMD_vertex_shader_viewport_index; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANDROID_", 8)) { #ifdef GL_ANDROID_extension_pack_es31a if (_glewStrSame3(&pos, &len, (const GLubyte*)"extension_pack_es31a", 20)) { ret = GLEW_ANDROID_extension_pack_es31a; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANGLE_", 6)) { #ifdef GL_ANGLE_depth_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) { ret = GLEW_ANGLE_depth_texture; continue; } #endif #ifdef GL_ANGLE_framebuffer_blit if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) { ret = GLEW_ANGLE_framebuffer_blit; continue; } #endif #ifdef GL_ANGLE_framebuffer_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) { ret = GLEW_ANGLE_framebuffer_multisample; continue; } #endif #ifdef GL_ANGLE_instanced_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) { ret = GLEW_ANGLE_instanced_arrays; continue; } #endif #ifdef GL_ANGLE_pack_reverse_row_order if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_reverse_row_order", 22)) { ret = GLEW_ANGLE_pack_reverse_row_order; continue; } #endif #ifdef GL_ANGLE_program_binary if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary", 14)) { ret = GLEW_ANGLE_program_binary; continue; } #endif #ifdef GL_ANGLE_texture_compression_dxt1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) { ret = GLEW_ANGLE_texture_compression_dxt1; continue; } #endif #ifdef GL_ANGLE_texture_compression_dxt3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt3", 24)) { ret = GLEW_ANGLE_texture_compression_dxt3; continue; } #endif #ifdef GL_ANGLE_texture_compression_dxt5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt5", 24)) { ret = GLEW_ANGLE_texture_compression_dxt5; continue; } #endif #ifdef GL_ANGLE_texture_usage if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_usage", 13)) { ret = GLEW_ANGLE_texture_usage; continue; } #endif #ifdef GL_ANGLE_timer_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) { ret = GLEW_ANGLE_timer_query; continue; } #endif #ifdef GL_ANGLE_translated_shader_source if (_glewStrSame3(&pos, &len, (const GLubyte*)"translated_shader_source", 24)) { ret = GLEW_ANGLE_translated_shader_source; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"APPLE_", 6)) { #ifdef GL_APPLE_aux_depth_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"aux_depth_stencil", 17)) { ret = GLEW_APPLE_aux_depth_stencil; continue; } #endif #ifdef GL_APPLE_client_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_storage", 14)) { ret = GLEW_APPLE_client_storage; continue; } #endif #ifdef GL_APPLE_clip_distance if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_distance", 13)) { ret = GLEW_APPLE_clip_distance; continue; } #endif #ifdef GL_APPLE_color_buffer_packed_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_packed_float", 25)) { ret = GLEW_APPLE_color_buffer_packed_float; continue; } #endif #ifdef GL_APPLE_copy_texture_levels if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture_levels", 19)) { ret = GLEW_APPLE_copy_texture_levels; continue; } #endif #ifdef GL_APPLE_element_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) { ret = GLEW_APPLE_element_array; continue; } #endif #ifdef GL_APPLE_fence if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) { ret = GLEW_APPLE_fence; continue; } #endif #ifdef GL_APPLE_float_pixels if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_pixels", 12)) { ret = GLEW_APPLE_float_pixels; continue; } #endif #ifdef GL_APPLE_flush_buffer_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_buffer_range", 18)) { ret = GLEW_APPLE_flush_buffer_range; continue; } #endif #ifdef GL_APPLE_framebuffer_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) { ret = GLEW_APPLE_framebuffer_multisample; continue; } #endif #ifdef GL_APPLE_object_purgeable if (_glewStrSame3(&pos, &len, (const GLubyte*)"object_purgeable", 16)) { ret = GLEW_APPLE_object_purgeable; continue; } #endif #ifdef GL_APPLE_pixel_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer", 12)) { ret = GLEW_APPLE_pixel_buffer; continue; } #endif #ifdef GL_APPLE_rgb_422 if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgb_422", 7)) { ret = GLEW_APPLE_rgb_422; continue; } #endif #ifdef GL_APPLE_row_bytes if (_glewStrSame3(&pos, &len, (const GLubyte*)"row_bytes", 9)) { ret = GLEW_APPLE_row_bytes; continue; } #endif #ifdef GL_APPLE_specular_vector if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_vector", 15)) { ret = GLEW_APPLE_specular_vector; continue; } #endif #ifdef GL_APPLE_sync if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) { ret = GLEW_APPLE_sync; continue; } #endif #ifdef GL_APPLE_texture_2D_limited_npot if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_2D_limited_npot", 23)) { ret = GLEW_APPLE_texture_2D_limited_npot; continue; } #endif #ifdef GL_APPLE_texture_format_BGRA8888 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_format_BGRA8888", 23)) { ret = GLEW_APPLE_texture_format_BGRA8888; continue; } #endif #ifdef GL_APPLE_texture_max_level if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_max_level", 17)) { ret = GLEW_APPLE_texture_max_level; continue; } #endif #ifdef GL_APPLE_texture_packed_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_packed_float", 20)) { ret = GLEW_APPLE_texture_packed_float; continue; } #endif #ifdef GL_APPLE_texture_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) { ret = GLEW_APPLE_texture_range; continue; } #endif #ifdef GL_APPLE_transform_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_hint", 14)) { ret = GLEW_APPLE_transform_hint; continue; } #endif #ifdef GL_APPLE_vertex_array_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) { ret = GLEW_APPLE_vertex_array_object; continue; } #endif #ifdef GL_APPLE_vertex_array_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) { ret = GLEW_APPLE_vertex_array_range; continue; } #endif #ifdef GL_APPLE_vertex_program_evaluators if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program_evaluators", 25)) { ret = GLEW_APPLE_vertex_program_evaluators; continue; } #endif #ifdef GL_APPLE_ycbcr_422 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_422", 9)) { ret = GLEW_APPLE_ycbcr_422; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) { #ifdef GL_ARB_ES2_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES2_compatibility", 17)) { ret = GLEW_ARB_ES2_compatibility; continue; } #endif #ifdef GL_ARB_ES3_1_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_1_compatibility", 19)) { ret = GLEW_ARB_ES3_1_compatibility; continue; } #endif #ifdef GL_ARB_ES3_2_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_2_compatibility", 19)) { ret = GLEW_ARB_ES3_2_compatibility; continue; } #endif #ifdef GL_ARB_ES3_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_compatibility", 17)) { ret = GLEW_ARB_ES3_compatibility; continue; } #endif #ifdef GL_ARB_arrays_of_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"arrays_of_arrays", 16)) { ret = GLEW_ARB_arrays_of_arrays; continue; } #endif #ifdef GL_ARB_base_instance if (_glewStrSame3(&pos, &len, (const GLubyte*)"base_instance", 13)) { ret = GLEW_ARB_base_instance; continue; } #endif #ifdef GL_ARB_bindless_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) { ret = GLEW_ARB_bindless_texture; continue; } #endif #ifdef GL_ARB_blend_func_extended if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19)) { ret = GLEW_ARB_blend_func_extended; continue; } #endif #ifdef GL_ARB_buffer_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_storage", 14)) { ret = GLEW_ARB_buffer_storage; continue; } #endif #ifdef GL_ARB_cl_event if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8)) { ret = GLEW_ARB_cl_event; continue; } #endif #ifdef GL_ARB_clear_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_buffer_object", 19)) { ret = GLEW_ARB_clear_buffer_object; continue; } #endif #ifdef GL_ARB_clear_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_texture", 13)) { ret = GLEW_ARB_clear_texture; continue; } #endif #ifdef GL_ARB_clip_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_control", 12)) { ret = GLEW_ARB_clip_control; continue; } #endif #ifdef GL_ARB_color_buffer_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) { ret = GLEW_ARB_color_buffer_float; continue; } #endif #ifdef GL_ARB_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"compatibility", 13)) { ret = GLEW_ARB_compatibility; continue; } #endif #ifdef GL_ARB_compressed_texture_pixel_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_texture_pixel_storage", 32)) { ret = GLEW_ARB_compressed_texture_pixel_storage; continue; } #endif #ifdef GL_ARB_compute_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_shader", 14)) { ret = GLEW_ARB_compute_shader; continue; } #endif #ifdef GL_ARB_compute_variable_group_size if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_variable_group_size", 27)) { ret = GLEW_ARB_compute_variable_group_size; continue; } #endif #ifdef GL_ARB_conditional_render_inverted if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render_inverted", 27)) { ret = GLEW_ARB_conditional_render_inverted; continue; } #endif #ifdef GL_ARB_conservative_depth if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) { ret = GLEW_ARB_conservative_depth; continue; } #endif #ifdef GL_ARB_copy_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) { ret = GLEW_ARB_copy_buffer; continue; } #endif #ifdef GL_ARB_copy_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) { ret = GLEW_ARB_copy_image; continue; } #endif #ifdef GL_ARB_cull_distance if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_distance", 13)) { ret = GLEW_ARB_cull_distance; continue; } #endif #ifdef GL_ARB_debug_output if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) { ret = GLEW_ARB_debug_output; continue; } #endif #ifdef GL_ARB_depth_buffer_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) { ret = GLEW_ARB_depth_buffer_float; continue; } #endif #ifdef GL_ARB_depth_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) { ret = GLEW_ARB_depth_clamp; continue; } #endif #ifdef GL_ARB_depth_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) { ret = GLEW_ARB_depth_texture; continue; } #endif #ifdef GL_ARB_derivative_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"derivative_control", 18)) { ret = GLEW_ARB_derivative_control; continue; } #endif #ifdef GL_ARB_direct_state_access if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) { ret = GLEW_ARB_direct_state_access; continue; } #endif #ifdef GL_ARB_draw_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) { ret = GLEW_ARB_draw_buffers; continue; } #endif #ifdef GL_ARB_draw_buffers_blend if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) { ret = GLEW_ARB_draw_buffers_blend; continue; } #endif #ifdef GL_ARB_draw_elements_base_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_elements_base_vertex", 25)) { ret = GLEW_ARB_draw_elements_base_vertex; continue; } #endif #ifdef GL_ARB_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_indirect", 13)) { ret = GLEW_ARB_draw_indirect; continue; } #endif #ifdef GL_ARB_draw_instanced if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) { ret = GLEW_ARB_draw_instanced; continue; } #endif #ifdef GL_ARB_enhanced_layouts if (_glewStrSame3(&pos, &len, (const GLubyte*)"enhanced_layouts", 16)) { ret = GLEW_ARB_enhanced_layouts; continue; } #endif #ifdef GL_ARB_explicit_attrib_location if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24)) { ret = GLEW_ARB_explicit_attrib_location; continue; } #endif #ifdef GL_ARB_explicit_uniform_location if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_uniform_location", 25)) { ret = GLEW_ARB_explicit_uniform_location; continue; } #endif #ifdef GL_ARB_fragment_coord_conventions if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coord_conventions", 26)) { ret = GLEW_ARB_fragment_coord_conventions; continue; } #endif #ifdef GL_ARB_fragment_layer_viewport if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_layer_viewport", 23)) { ret = GLEW_ARB_fragment_layer_viewport; continue; } #endif #ifdef GL_ARB_fragment_program if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) { ret = GLEW_ARB_fragment_program; continue; } #endif #ifdef GL_ARB_fragment_program_shadow if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_shadow", 23)) { ret = GLEW_ARB_fragment_program_shadow; continue; } #endif #ifdef GL_ARB_fragment_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) { ret = GLEW_ARB_fragment_shader; continue; } #endif #ifdef GL_ARB_fragment_shader_interlock if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25)) { ret = GLEW_ARB_fragment_shader_interlock; continue; } #endif #ifdef GL_ARB_framebuffer_no_attachments if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_no_attachments", 26)) { ret = GLEW_ARB_framebuffer_no_attachments; continue; } #endif #ifdef GL_ARB_framebuffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) { ret = GLEW_ARB_framebuffer_object; continue; } #endif #ifdef GL_ARB_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = GLEW_ARB_framebuffer_sRGB; continue; } #endif #ifdef GL_ARB_geometry_shader4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) { ret = GLEW_ARB_geometry_shader4; continue; } #endif #ifdef GL_ARB_get_program_binary if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_program_binary", 18)) { ret = GLEW_ARB_get_program_binary; continue; } #endif #ifdef GL_ARB_get_texture_sub_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_texture_sub_image", 21)) { ret = GLEW_ARB_get_texture_sub_image; continue; } #endif #ifdef GL_ARB_gl_spirv if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_spirv", 8)) { ret = GLEW_ARB_gl_spirv; continue; } #endif #ifdef GL_ARB_gpu_shader5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) { ret = GLEW_ARB_gpu_shader5; continue; } #endif #ifdef GL_ARB_gpu_shader_fp64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_fp64", 15)) { ret = GLEW_ARB_gpu_shader_fp64; continue; } #endif #ifdef GL_ARB_gpu_shader_int64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16)) { ret = GLEW_ARB_gpu_shader_int64; continue; } #endif #ifdef GL_ARB_half_float_pixel if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_pixel", 16)) { ret = GLEW_ARB_half_float_pixel; continue; } #endif #ifdef GL_ARB_half_float_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_vertex", 17)) { ret = GLEW_ARB_half_float_vertex; continue; } #endif #ifdef GL_ARB_imaging if (_glewStrSame3(&pos, &len, (const GLubyte*)"imaging", 7)) { ret = GLEW_ARB_imaging; continue; } #endif #ifdef GL_ARB_indirect_parameters if (_glewStrSame3(&pos, &len, (const GLubyte*)"indirect_parameters", 19)) { ret = GLEW_ARB_indirect_parameters; continue; } #endif #ifdef GL_ARB_instanced_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) { ret = GLEW_ARB_instanced_arrays; continue; } #endif #ifdef GL_ARB_internalformat_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query", 20)) { ret = GLEW_ARB_internalformat_query; continue; } #endif #ifdef GL_ARB_internalformat_query2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query2", 21)) { ret = GLEW_ARB_internalformat_query2; continue; } #endif #ifdef GL_ARB_invalidate_subdata if (_glewStrSame3(&pos, &len, (const GLubyte*)"invalidate_subdata", 18)) { ret = GLEW_ARB_invalidate_subdata; continue; } #endif #ifdef GL_ARB_map_buffer_alignment if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_alignment", 20)) { ret = GLEW_ARB_map_buffer_alignment; continue; } #endif #ifdef GL_ARB_map_buffer_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_range", 16)) { ret = GLEW_ARB_map_buffer_range; continue; } #endif #ifdef GL_ARB_matrix_palette if (_glewStrSame3(&pos, &len, (const GLubyte*)"matrix_palette", 14)) { ret = GLEW_ARB_matrix_palette; continue; } #endif #ifdef GL_ARB_multi_bind if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_bind", 10)) { ret = GLEW_ARB_multi_bind; continue; } #endif #ifdef GL_ARB_multi_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) { ret = GLEW_ARB_multi_draw_indirect; continue; } #endif #ifdef GL_ARB_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLEW_ARB_multisample; continue; } #endif #ifdef GL_ARB_multitexture if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12)) { ret = GLEW_ARB_multitexture; continue; } #endif #ifdef GL_ARB_occlusion_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) { ret = GLEW_ARB_occlusion_query; continue; } #endif #ifdef GL_ARB_occlusion_query2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query2", 16)) { ret = GLEW_ARB_occlusion_query2; continue; } #endif #ifdef GL_ARB_parallel_shader_compile if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_shader_compile", 23)) { ret = GLEW_ARB_parallel_shader_compile; continue; } #endif #ifdef GL_ARB_pipeline_statistics_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"pipeline_statistics_query", 25)) { ret = GLEW_ARB_pipeline_statistics_query; continue; } #endif #ifdef GL_ARB_pixel_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) { ret = GLEW_ARB_pixel_buffer_object; continue; } #endif #ifdef GL_ARB_point_parameters if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) { ret = GLEW_ARB_point_parameters; continue; } #endif #ifdef GL_ARB_point_sprite if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) { ret = GLEW_ARB_point_sprite; continue; } #endif #ifdef GL_ARB_polygon_offset_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset_clamp", 20)) { ret = GLEW_ARB_polygon_offset_clamp; continue; } #endif #ifdef GL_ARB_post_depth_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19)) { ret = GLEW_ARB_post_depth_coverage; continue; } #endif #ifdef GL_ARB_program_interface_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_interface_query", 23)) { ret = GLEW_ARB_program_interface_query; continue; } #endif #ifdef GL_ARB_provoking_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) { ret = GLEW_ARB_provoking_vertex; continue; } #endif #ifdef GL_ARB_query_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) { ret = GLEW_ARB_query_buffer_object; continue; } #endif #ifdef GL_ARB_robust_buffer_access_behavior if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) { ret = GLEW_ARB_robust_buffer_access_behavior; continue; } #endif #ifdef GL_ARB_robustness if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) { ret = GLEW_ARB_robustness; continue; } #endif #ifdef GL_ARB_robustness_application_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) { ret = GLEW_ARB_robustness_application_isolation; continue; } #endif #ifdef GL_ARB_robustness_share_group_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) { ret = GLEW_ARB_robustness_share_group_isolation; continue; } #endif #ifdef GL_ARB_sample_locations if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16)) { ret = GLEW_ARB_sample_locations; continue; } #endif #ifdef GL_ARB_sample_shading if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_shading", 14)) { ret = GLEW_ARB_sample_shading; continue; } #endif #ifdef GL_ARB_sampler_objects if (_glewStrSame3(&pos, &len, (const GLubyte*)"sampler_objects", 15)) { ret = GLEW_ARB_sampler_objects; continue; } #endif #ifdef GL_ARB_seamless_cube_map if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cube_map", 17)) { ret = GLEW_ARB_seamless_cube_map; continue; } #endif #ifdef GL_ARB_seamless_cubemap_per_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) { ret = GLEW_ARB_seamless_cubemap_per_texture; continue; } #endif #ifdef GL_ARB_separate_shader_objects if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) { ret = GLEW_ARB_separate_shader_objects; continue; } #endif #ifdef GL_ARB_shader_atomic_counter_ops if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25)) { ret = GLEW_ARB_shader_atomic_counter_ops; continue; } #endif #ifdef GL_ARB_shader_atomic_counters if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) { ret = GLEW_ARB_shader_atomic_counters; continue; } #endif #ifdef GL_ARB_shader_ballot if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_ballot", 13)) { ret = GLEW_ARB_shader_ballot; continue; } #endif #ifdef GL_ARB_shader_bit_encoding if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_bit_encoding", 19)) { ret = GLEW_ARB_shader_bit_encoding; continue; } #endif #ifdef GL_ARB_shader_clock if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_clock", 12)) { ret = GLEW_ARB_shader_clock; continue; } #endif #ifdef GL_ARB_shader_draw_parameters if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_draw_parameters", 22)) { ret = GLEW_ARB_shader_draw_parameters; continue; } #endif #ifdef GL_ARB_shader_group_vote if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_group_vote", 17)) { ret = GLEW_ARB_shader_group_vote; continue; } #endif #ifdef GL_ARB_shader_image_load_store if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) { ret = GLEW_ARB_shader_image_load_store; continue; } #endif #ifdef GL_ARB_shader_image_size if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_size", 17)) { ret = GLEW_ARB_shader_image_size; continue; } #endif #ifdef GL_ARB_shader_objects if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_objects", 14)) { ret = GLEW_ARB_shader_objects; continue; } #endif #ifdef GL_ARB_shader_precision if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_precision", 16)) { ret = GLEW_ARB_shader_precision; continue; } #endif #ifdef GL_ARB_shader_stencil_export if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) { ret = GLEW_ARB_shader_stencil_export; continue; } #endif #ifdef GL_ARB_shader_storage_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) { ret = GLEW_ARB_shader_storage_buffer_object; continue; } #endif #ifdef GL_ARB_shader_subroutine if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_subroutine", 17)) { ret = GLEW_ARB_shader_subroutine; continue; } #endif #ifdef GL_ARB_shader_texture_image_samples if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_image_samples", 28)) { ret = GLEW_ARB_shader_texture_image_samples; continue; } #endif #ifdef GL_ARB_shader_texture_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) { ret = GLEW_ARB_shader_texture_lod; continue; } #endif #ifdef GL_ARB_shader_viewport_layer_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_viewport_layer_array", 27)) { ret = GLEW_ARB_shader_viewport_layer_array; continue; } #endif #ifdef GL_ARB_shading_language_100 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_100", 20)) { ret = GLEW_ARB_shading_language_100; continue; } #endif #ifdef GL_ARB_shading_language_420pack if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_420pack", 24)) { ret = GLEW_ARB_shading_language_420pack; continue; } #endif #ifdef GL_ARB_shading_language_include if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_include", 24)) { ret = GLEW_ARB_shading_language_include; continue; } #endif #ifdef GL_ARB_shading_language_packing if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_packing", 24)) { ret = GLEW_ARB_shading_language_packing; continue; } #endif #ifdef GL_ARB_shadow if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) { ret = GLEW_ARB_shadow; continue; } #endif #ifdef GL_ARB_shadow_ambient if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) { ret = GLEW_ARB_shadow_ambient; continue; } #endif #ifdef GL_ARB_sparse_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_buffer", 13)) { ret = GLEW_ARB_sparse_buffer; continue; } #endif #ifdef GL_ARB_sparse_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) { ret = GLEW_ARB_sparse_texture; continue; } #endif #ifdef GL_ARB_sparse_texture2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15)) { ret = GLEW_ARB_sparse_texture2; continue; } #endif #ifdef GL_ARB_sparse_texture_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture_clamp", 20)) { ret = GLEW_ARB_sparse_texture_clamp; continue; } #endif #ifdef GL_ARB_spirv_extensions if (_glewStrSame3(&pos, &len, (const GLubyte*)"spirv_extensions", 16)) { ret = GLEW_ARB_spirv_extensions; continue; } #endif #ifdef GL_ARB_stencil_texturing if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_texturing", 17)) { ret = GLEW_ARB_stencil_texturing; continue; } #endif #ifdef GL_ARB_sync if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) { ret = GLEW_ARB_sync; continue; } #endif #ifdef GL_ARB_tessellation_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_shader", 19)) { ret = GLEW_ARB_tessellation_shader; continue; } #endif #ifdef GL_ARB_texture_barrier if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) { ret = GLEW_ARB_texture_barrier; continue; } #endif #ifdef GL_ARB_texture_border_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) { ret = GLEW_ARB_texture_border_clamp; continue; } #endif #ifdef GL_ARB_texture_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) { ret = GLEW_ARB_texture_buffer_object; continue; } #endif #ifdef GL_ARB_texture_buffer_object_rgb32 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object_rgb32", 27)) { ret = GLEW_ARB_texture_buffer_object_rgb32; continue; } #endif #ifdef GL_ARB_texture_buffer_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_range", 20)) { ret = GLEW_ARB_texture_buffer_range; continue; } #endif #ifdef GL_ARB_texture_compression if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression", 19)) { ret = GLEW_ARB_texture_compression; continue; } #endif #ifdef GL_ARB_texture_compression_bptc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_bptc", 24)) { ret = GLEW_ARB_texture_compression_bptc; continue; } #endif #ifdef GL_ARB_texture_compression_rgtc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) { ret = GLEW_ARB_texture_compression_rgtc; continue; } #endif #ifdef GL_ARB_texture_cube_map if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) { ret = GLEW_ARB_texture_cube_map; continue; } #endif #ifdef GL_ARB_texture_cube_map_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22)) { ret = GLEW_ARB_texture_cube_map_array; continue; } #endif #ifdef GL_ARB_texture_env_add if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) { ret = GLEW_ARB_texture_env_add; continue; } #endif #ifdef GL_ARB_texture_env_combine if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) { ret = GLEW_ARB_texture_env_combine; continue; } #endif #ifdef GL_ARB_texture_env_crossbar if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_crossbar", 20)) { ret = GLEW_ARB_texture_env_crossbar; continue; } #endif #ifdef GL_ARB_texture_env_dot3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) { ret = GLEW_ARB_texture_env_dot3; continue; } #endif #ifdef GL_ARB_texture_filter_anisotropic if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26)) { ret = GLEW_ARB_texture_filter_anisotropic; continue; } #endif #ifdef GL_ARB_texture_filter_minmax if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21)) { ret = GLEW_ARB_texture_filter_minmax; continue; } #endif #ifdef GL_ARB_texture_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) { ret = GLEW_ARB_texture_float; continue; } #endif #ifdef GL_ARB_texture_gather if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_gather", 14)) { ret = GLEW_ARB_texture_gather; continue; } #endif #ifdef GL_ARB_texture_mirror_clamp_to_edge if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp_to_edge", 28)) { ret = GLEW_ARB_texture_mirror_clamp_to_edge; continue; } #endif #ifdef GL_ARB_texture_mirrored_repeat if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) { ret = GLEW_ARB_texture_mirrored_repeat; continue; } #endif #ifdef GL_ARB_texture_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) { ret = GLEW_ARB_texture_multisample; continue; } #endif #ifdef GL_ARB_texture_non_power_of_two if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_non_power_of_two", 24)) { ret = GLEW_ARB_texture_non_power_of_two; continue; } #endif #ifdef GL_ARB_texture_query_levels if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_levels", 20)) { ret = GLEW_ARB_texture_query_levels; continue; } #endif #ifdef GL_ARB_texture_query_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_lod", 17)) { ret = GLEW_ARB_texture_query_lod; continue; } #endif #ifdef GL_ARB_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) { ret = GLEW_ARB_texture_rectangle; continue; } #endif #ifdef GL_ARB_texture_rg if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rg", 10)) { ret = GLEW_ARB_texture_rg; continue; } #endif #ifdef GL_ARB_texture_rgb10_a2ui if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rgb10_a2ui", 18)) { ret = GLEW_ARB_texture_rgb10_a2ui; continue; } #endif #ifdef GL_ARB_texture_stencil8 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stencil8", 16)) { ret = GLEW_ARB_texture_stencil8; continue; } #endif #ifdef GL_ARB_texture_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15)) { ret = GLEW_ARB_texture_storage; continue; } #endif #ifdef GL_ARB_texture_storage_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage_multisample", 27)) { ret = GLEW_ARB_texture_storage_multisample; continue; } #endif #ifdef GL_ARB_texture_swizzle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) { ret = GLEW_ARB_texture_swizzle; continue; } #endif #ifdef GL_ARB_texture_view if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_view", 12)) { ret = GLEW_ARB_texture_view; continue; } #endif #ifdef GL_ARB_timer_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) { ret = GLEW_ARB_timer_query; continue; } #endif #ifdef GL_ARB_transform_feedback2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) { ret = GLEW_ARB_transform_feedback2; continue; } #endif #ifdef GL_ARB_transform_feedback3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3", 19)) { ret = GLEW_ARB_transform_feedback3; continue; } #endif #ifdef GL_ARB_transform_feedback_instanced if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_instanced", 28)) { ret = GLEW_ARB_transform_feedback_instanced; continue; } #endif #ifdef GL_ARB_transform_feedback_overflow_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_overflow_query", 33)) { ret = GLEW_ARB_transform_feedback_overflow_query; continue; } #endif #ifdef GL_ARB_transpose_matrix if (_glewStrSame3(&pos, &len, (const GLubyte*)"transpose_matrix", 16)) { ret = GLEW_ARB_transpose_matrix; continue; } #endif #ifdef GL_ARB_uniform_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_object", 21)) { ret = GLEW_ARB_uniform_buffer_object; continue; } #endif #ifdef GL_ARB_vertex_array_bgra if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) { ret = GLEW_ARB_vertex_array_bgra; continue; } #endif #ifdef GL_ARB_vertex_array_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) { ret = GLEW_ARB_vertex_array_object; continue; } #endif #ifdef GL_ARB_vertex_attrib_64bit if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) { ret = GLEW_ARB_vertex_attrib_64bit; continue; } #endif #ifdef GL_ARB_vertex_attrib_binding if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_binding", 21)) { ret = GLEW_ARB_vertex_attrib_binding; continue; } #endif #ifdef GL_ARB_vertex_blend if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_blend", 12)) { ret = GLEW_ARB_vertex_blend; continue; } #endif #ifdef GL_ARB_vertex_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) { ret = GLEW_ARB_vertex_buffer_object; continue; } #endif #ifdef GL_ARB_vertex_program if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) { ret = GLEW_ARB_vertex_program; continue; } #endif #ifdef GL_ARB_vertex_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) { ret = GLEW_ARB_vertex_shader; continue; } #endif #ifdef GL_ARB_vertex_type_10f_11f_11f_rev if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_10f_11f_11f_rev", 27)) { ret = GLEW_ARB_vertex_type_10f_11f_11f_rev; continue; } #endif #ifdef GL_ARB_vertex_type_2_10_10_10_rev if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_2_10_10_10_rev", 26)) { ret = GLEW_ARB_vertex_type_2_10_10_10_rev; continue; } #endif #ifdef GL_ARB_viewport_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array", 14)) { ret = GLEW_ARB_viewport_array; continue; } #endif #ifdef GL_ARB_window_pos if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) { ret = GLEW_ARB_window_pos; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARM_", 4)) { #ifdef GL_ARM_mali_program_binary if (_glewStrSame3(&pos, &len, (const GLubyte*)"mali_program_binary", 19)) { ret = GLEW_ARM_mali_program_binary; continue; } #endif #ifdef GL_ARM_mali_shader_binary if (_glewStrSame3(&pos, &len, (const GLubyte*)"mali_shader_binary", 18)) { ret = GLEW_ARM_mali_shader_binary; continue; } #endif #ifdef GL_ARM_rgba8 if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgba8", 5)) { ret = GLEW_ARM_rgba8; continue; } #endif #ifdef GL_ARM_shader_framebuffer_fetch if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch", 24)) { ret = GLEW_ARM_shader_framebuffer_fetch; continue; } #endif #ifdef GL_ARM_shader_framebuffer_fetch_depth_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch_depth_stencil", 38)) { ret = GLEW_ARM_shader_framebuffer_fetch_depth_stencil; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATIX_", 5)) { #ifdef GL_ATIX_point_sprites if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprites", 13)) { ret = GLEW_ATIX_point_sprites; continue; } #endif #ifdef GL_ATIX_texture_env_combine3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) { ret = GLEW_ATIX_texture_env_combine3; continue; } #endif #ifdef GL_ATIX_texture_env_route if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_route", 17)) { ret = GLEW_ATIX_texture_env_route; continue; } #endif #ifdef GL_ATIX_vertex_shader_output_point_size if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_output_point_size", 31)) { ret = GLEW_ATIX_vertex_shader_output_point_size; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) { #ifdef GL_ATI_draw_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) { ret = GLEW_ATI_draw_buffers; continue; } #endif #ifdef GL_ATI_element_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) { ret = GLEW_ATI_element_array; continue; } #endif #ifdef GL_ATI_envmap_bumpmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"envmap_bumpmap", 14)) { ret = GLEW_ATI_envmap_bumpmap; continue; } #endif #ifdef GL_ATI_fragment_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) { ret = GLEW_ATI_fragment_shader; continue; } #endif #ifdef GL_ATI_map_object_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_object_buffer", 17)) { ret = GLEW_ATI_map_object_buffer; continue; } #endif #ifdef GL_ATI_meminfo if (_glewStrSame3(&pos, &len, (const GLubyte*)"meminfo", 7)) { ret = GLEW_ATI_meminfo; continue; } #endif #ifdef GL_ATI_pn_triangles if (_glewStrSame3(&pos, &len, (const GLubyte*)"pn_triangles", 12)) { ret = GLEW_ATI_pn_triangles; continue; } #endif #ifdef GL_ATI_separate_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_stencil", 16)) { ret = GLEW_ATI_separate_stencil; continue; } #endif #ifdef GL_ATI_shader_texture_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) { ret = GLEW_ATI_shader_texture_lod; continue; } #endif #ifdef GL_ATI_text_fragment_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"text_fragment_shader", 20)) { ret = GLEW_ATI_text_fragment_shader; continue; } #endif #ifdef GL_ATI_texture_compression_3dc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_3dc", 23)) { ret = GLEW_ATI_texture_compression_3dc; continue; } #endif #ifdef GL_ATI_texture_env_combine3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) { ret = GLEW_ATI_texture_env_combine3; continue; } #endif #ifdef GL_ATI_texture_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) { ret = GLEW_ATI_texture_float; continue; } #endif #ifdef GL_ATI_texture_mirror_once if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_once", 19)) { ret = GLEW_ATI_texture_mirror_once; continue; } #endif #ifdef GL_ATI_vertex_array_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) { ret = GLEW_ATI_vertex_array_object; continue; } #endif #ifdef GL_ATI_vertex_attrib_array_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_array_object", 26)) { ret = GLEW_ATI_vertex_attrib_array_object; continue; } #endif #ifdef GL_ATI_vertex_streams if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_streams", 14)) { ret = GLEW_ATI_vertex_streams; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"EGL_", 4)) { #ifdef GL_EGL_KHR_context_flush_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"KHR_context_flush_control", 25)) { ret = GLEW_EGL_KHR_context_flush_control; continue; } #endif #ifdef GL_EGL_NV_robustness_video_memory_purge if (_glewStrSame3(&pos, &len, (const GLubyte*)"NV_robustness_video_memory_purge", 32)) { ret = GLEW_EGL_NV_robustness_video_memory_purge; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) { #ifdef GL_EXT_422_pixels if (_glewStrSame3(&pos, &len, (const GLubyte*)"422_pixels", 10)) { ret = GLEW_EXT_422_pixels; continue; } #endif #ifdef GL_EXT_Cg_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"Cg_shader", 9)) { ret = GLEW_EXT_Cg_shader; continue; } #endif #ifdef GL_EXT_EGL_image_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"EGL_image_array", 15)) { ret = GLEW_EXT_EGL_image_array; continue; } #endif #ifdef GL_EXT_YUV_target if (_glewStrSame3(&pos, &len, (const GLubyte*)"YUV_target", 10)) { ret = GLEW_EXT_YUV_target; continue; } #endif #ifdef GL_EXT_abgr if (_glewStrSame3(&pos, &len, (const GLubyte*)"abgr", 4)) { ret = GLEW_EXT_abgr; continue; } #endif #ifdef GL_EXT_base_instance if (_glewStrSame3(&pos, &len, (const GLubyte*)"base_instance", 13)) { ret = GLEW_EXT_base_instance; continue; } #endif #ifdef GL_EXT_bgra if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgra", 4)) { ret = GLEW_EXT_bgra; continue; } #endif #ifdef GL_EXT_bindable_uniform if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindable_uniform", 16)) { ret = GLEW_EXT_bindable_uniform; continue; } #endif #ifdef GL_EXT_blend_color if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_color", 11)) { ret = GLEW_EXT_blend_color; continue; } #endif #ifdef GL_EXT_blend_equation_separate if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_separate", 23)) { ret = GLEW_EXT_blend_equation_separate; continue; } #endif #ifdef GL_EXT_blend_func_extended if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19)) { ret = GLEW_EXT_blend_func_extended; continue; } #endif #ifdef GL_EXT_blend_func_separate if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_separate", 19)) { ret = GLEW_EXT_blend_func_separate; continue; } #endif #ifdef GL_EXT_blend_logic_op if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_logic_op", 14)) { ret = GLEW_EXT_blend_logic_op; continue; } #endif #ifdef GL_EXT_blend_minmax if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax", 12)) { ret = GLEW_EXT_blend_minmax; continue; } #endif #ifdef GL_EXT_blend_subtract if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_subtract", 14)) { ret = GLEW_EXT_blend_subtract; continue; } #endif #ifdef GL_EXT_buffer_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_storage", 14)) { ret = GLEW_EXT_buffer_storage; continue; } #endif #ifdef GL_EXT_clear_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_texture", 13)) { ret = GLEW_EXT_clear_texture; continue; } #endif #ifdef GL_EXT_clip_cull_distance if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_cull_distance", 18)) { ret = GLEW_EXT_clip_cull_distance; continue; } #endif #ifdef GL_EXT_clip_volume_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_volume_hint", 16)) { ret = GLEW_EXT_clip_volume_hint; continue; } #endif #ifdef GL_EXT_cmyka if (_glewStrSame3(&pos, &len, (const GLubyte*)"cmyka", 5)) { ret = GLEW_EXT_cmyka; continue; } #endif #ifdef GL_EXT_color_buffer_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) { ret = GLEW_EXT_color_buffer_float; continue; } #endif #ifdef GL_EXT_color_buffer_half_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_half_float", 23)) { ret = GLEW_EXT_color_buffer_half_float; continue; } #endif #ifdef GL_EXT_color_subtable if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_subtable", 14)) { ret = GLEW_EXT_color_subtable; continue; } #endif #ifdef GL_EXT_compiled_vertex_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"compiled_vertex_array", 21)) { ret = GLEW_EXT_compiled_vertex_array; continue; } #endif #ifdef GL_EXT_compressed_ETC1_RGB8_sub_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_ETC1_RGB8_sub_texture", 32)) { ret = GLEW_EXT_compressed_ETC1_RGB8_sub_texture; continue; } #endif #ifdef GL_EXT_conservative_depth if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) { ret = GLEW_EXT_conservative_depth; continue; } #endif #ifdef GL_EXT_convolution if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution", 11)) { ret = GLEW_EXT_convolution; continue; } #endif #ifdef GL_EXT_coordinate_frame if (_glewStrSame3(&pos, &len, (const GLubyte*)"coordinate_frame", 16)) { ret = GLEW_EXT_coordinate_frame; continue; } #endif #ifdef GL_EXT_copy_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) { ret = GLEW_EXT_copy_image; continue; } #endif #ifdef GL_EXT_copy_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture", 12)) { ret = GLEW_EXT_copy_texture; continue; } #endif #ifdef GL_EXT_cull_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) { ret = GLEW_EXT_cull_vertex; continue; } #endif #ifdef GL_EXT_debug_label if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_label", 11)) { ret = GLEW_EXT_debug_label; continue; } #endif #ifdef GL_EXT_debug_marker if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_marker", 12)) { ret = GLEW_EXT_debug_marker; continue; } #endif #ifdef GL_EXT_depth_bounds_test if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_bounds_test", 17)) { ret = GLEW_EXT_depth_bounds_test; continue; } #endif #ifdef GL_EXT_direct_state_access if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) { ret = GLEW_EXT_direct_state_access; continue; } #endif #ifdef GL_EXT_discard_framebuffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"discard_framebuffer", 19)) { ret = GLEW_EXT_discard_framebuffer; continue; } #endif #ifdef GL_EXT_draw_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) { ret = GLEW_EXT_draw_buffers; continue; } #endif #ifdef GL_EXT_draw_buffers2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers2", 13)) { ret = GLEW_EXT_draw_buffers2; continue; } #endif #ifdef GL_EXT_draw_buffers_indexed if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_indexed", 20)) { ret = GLEW_EXT_draw_buffers_indexed; continue; } #endif #ifdef GL_EXT_draw_elements_base_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_elements_base_vertex", 25)) { ret = GLEW_EXT_draw_elements_base_vertex; continue; } #endif #ifdef GL_EXT_draw_instanced if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) { ret = GLEW_EXT_draw_instanced; continue; } #endif #ifdef GL_EXT_draw_range_elements if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_range_elements", 19)) { ret = GLEW_EXT_draw_range_elements; continue; } #endif #ifdef GL_EXT_external_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"external_buffer", 15)) { ret = GLEW_EXT_external_buffer; continue; } #endif #ifdef GL_EXT_float_blend if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_blend", 11)) { ret = GLEW_EXT_float_blend; continue; } #endif #ifdef GL_EXT_fog_coord if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_coord", 9)) { ret = GLEW_EXT_fog_coord; continue; } #endif #ifdef GL_EXT_frag_depth if (_glewStrSame3(&pos, &len, (const GLubyte*)"frag_depth", 10)) { ret = GLEW_EXT_frag_depth; continue; } #endif #ifdef GL_EXT_fragment_lighting if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting", 17)) { ret = GLEW_EXT_fragment_lighting; continue; } #endif #ifdef GL_EXT_framebuffer_blit if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) { ret = GLEW_EXT_framebuffer_blit; continue; } #endif #ifdef GL_EXT_framebuffer_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) { ret = GLEW_EXT_framebuffer_multisample; continue; } #endif #ifdef GL_EXT_framebuffer_multisample_blit_scaled if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_blit_scaled", 35)) { ret = GLEW_EXT_framebuffer_multisample_blit_scaled; continue; } #endif #ifdef GL_EXT_framebuffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) { ret = GLEW_EXT_framebuffer_object; continue; } #endif #ifdef GL_EXT_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = GLEW_EXT_framebuffer_sRGB; continue; } #endif #ifdef GL_EXT_geometry_point_size if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_point_size", 19)) { ret = GLEW_EXT_geometry_point_size; continue; } #endif #ifdef GL_EXT_geometry_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader", 15)) { ret = GLEW_EXT_geometry_shader; continue; } #endif #ifdef GL_EXT_geometry_shader4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) { ret = GLEW_EXT_geometry_shader4; continue; } #endif #ifdef GL_EXT_gpu_program_parameters if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_parameters", 22)) { ret = GLEW_EXT_gpu_program_parameters; continue; } #endif #ifdef GL_EXT_gpu_shader4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader4", 11)) { ret = GLEW_EXT_gpu_shader4; continue; } #endif #ifdef GL_EXT_gpu_shader5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) { ret = GLEW_EXT_gpu_shader5; continue; } #endif #ifdef GL_EXT_histogram if (_glewStrSame3(&pos, &len, (const GLubyte*)"histogram", 9)) { ret = GLEW_EXT_histogram; continue; } #endif #ifdef GL_EXT_index_array_formats if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_array_formats", 19)) { ret = GLEW_EXT_index_array_formats; continue; } #endif #ifdef GL_EXT_index_func if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_func", 10)) { ret = GLEW_EXT_index_func; continue; } #endif #ifdef GL_EXT_index_material if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_material", 14)) { ret = GLEW_EXT_index_material; continue; } #endif #ifdef GL_EXT_index_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_texture", 13)) { ret = GLEW_EXT_index_texture; continue; } #endif #ifdef GL_EXT_instanced_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) { ret = GLEW_EXT_instanced_arrays; continue; } #endif #ifdef GL_EXT_light_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_texture", 13)) { ret = GLEW_EXT_light_texture; continue; } #endif #ifdef GL_EXT_map_buffer_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_range", 16)) { ret = GLEW_EXT_map_buffer_range; continue; } #endif #ifdef GL_EXT_memory_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"memory_object", 13)) { ret = GLEW_EXT_memory_object; continue; } #endif #ifdef GL_EXT_memory_object_fd if (_glewStrSame3(&pos, &len, (const GLubyte*)"memory_object_fd", 16)) { ret = GLEW_EXT_memory_object_fd; continue; } #endif #ifdef GL_EXT_memory_object_win32 if (_glewStrSame3(&pos, &len, (const GLubyte*)"memory_object_win32", 19)) { ret = GLEW_EXT_memory_object_win32; continue; } #endif #ifdef GL_EXT_misc_attribute if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_attribute", 14)) { ret = GLEW_EXT_misc_attribute; continue; } #endif #ifdef GL_EXT_multi_draw_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_arrays", 17)) { ret = GLEW_EXT_multi_draw_arrays; continue; } #endif #ifdef GL_EXT_multi_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) { ret = GLEW_EXT_multi_draw_indirect; continue; } #endif #ifdef GL_EXT_multiple_textures if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiple_textures", 17)) { ret = GLEW_EXT_multiple_textures; continue; } #endif #ifdef GL_EXT_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLEW_EXT_multisample; continue; } #endif #ifdef GL_EXT_multisample_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_compatibility", 25)) { ret = GLEW_EXT_multisample_compatibility; continue; } #endif #ifdef GL_EXT_multisampled_render_to_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisampled_render_to_texture", 30)) { ret = GLEW_EXT_multisampled_render_to_texture; continue; } #endif #ifdef GL_EXT_multisampled_render_to_texture2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisampled_render_to_texture2", 31)) { ret = GLEW_EXT_multisampled_render_to_texture2; continue; } #endif #ifdef GL_EXT_multiview_draw_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_draw_buffers", 22)) { ret = GLEW_EXT_multiview_draw_buffers; continue; } #endif #ifdef GL_EXT_packed_depth_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) { ret = GLEW_EXT_packed_depth_stencil; continue; } #endif #ifdef GL_EXT_packed_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float", 12)) { ret = GLEW_EXT_packed_float; continue; } #endif #ifdef GL_EXT_packed_pixels if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_pixels", 13)) { ret = GLEW_EXT_packed_pixels; continue; } #endif #ifdef GL_EXT_paletted_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"paletted_texture", 16)) { ret = GLEW_EXT_paletted_texture; continue; } #endif #ifdef GL_EXT_pixel_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) { ret = GLEW_EXT_pixel_buffer_object; continue; } #endif #ifdef GL_EXT_pixel_transform if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform", 15)) { ret = GLEW_EXT_pixel_transform; continue; } #endif #ifdef GL_EXT_pixel_transform_color_table if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform_color_table", 27)) { ret = GLEW_EXT_pixel_transform_color_table; continue; } #endif #ifdef GL_EXT_point_parameters if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) { ret = GLEW_EXT_point_parameters; continue; } #endif #ifdef GL_EXT_polygon_offset if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset", 14)) { ret = GLEW_EXT_polygon_offset; continue; } #endif #ifdef GL_EXT_polygon_offset_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset_clamp", 20)) { ret = GLEW_EXT_polygon_offset_clamp; continue; } #endif #ifdef GL_EXT_post_depth_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19)) { ret = GLEW_EXT_post_depth_coverage; continue; } #endif #ifdef GL_EXT_provoking_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) { ret = GLEW_EXT_provoking_vertex; continue; } #endif #ifdef GL_EXT_pvrtc_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"pvrtc_sRGB", 10)) { ret = GLEW_EXT_pvrtc_sRGB; continue; } #endif #ifdef GL_EXT_raster_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"raster_multisample", 18)) { ret = GLEW_EXT_raster_multisample; continue; } #endif #ifdef GL_EXT_read_format_bgra if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_format_bgra", 16)) { ret = GLEW_EXT_read_format_bgra; continue; } #endif #ifdef GL_EXT_render_snorm if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_snorm", 12)) { ret = GLEW_EXT_render_snorm; continue; } #endif #ifdef GL_EXT_rescale_normal if (_glewStrSame3(&pos, &len, (const GLubyte*)"rescale_normal", 14)) { ret = GLEW_EXT_rescale_normal; continue; } #endif #ifdef GL_EXT_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"sRGB", 4)) { ret = GLEW_EXT_sRGB; continue; } #endif #ifdef GL_EXT_sRGB_write_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"sRGB_write_control", 18)) { ret = GLEW_EXT_sRGB_write_control; continue; } #endif #ifdef GL_EXT_scene_marker if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) { ret = GLEW_EXT_scene_marker; continue; } #endif #ifdef GL_EXT_secondary_color if (_glewStrSame3(&pos, &len, (const GLubyte*)"secondary_color", 15)) { ret = GLEW_EXT_secondary_color; continue; } #endif #ifdef GL_EXT_semaphore if (_glewStrSame3(&pos, &len, (const GLubyte*)"semaphore", 9)) { ret = GLEW_EXT_semaphore; continue; } #endif #ifdef GL_EXT_semaphore_fd if (_glewStrSame3(&pos, &len, (const GLubyte*)"semaphore_fd", 12)) { ret = GLEW_EXT_semaphore_fd; continue; } #endif #ifdef GL_EXT_semaphore_win32 if (_glewStrSame3(&pos, &len, (const GLubyte*)"semaphore_win32", 15)) { ret = GLEW_EXT_semaphore_win32; continue; } #endif #ifdef GL_EXT_separate_shader_objects if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) { ret = GLEW_EXT_separate_shader_objects; continue; } #endif #ifdef GL_EXT_separate_specular_color if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_specular_color", 23)) { ret = GLEW_EXT_separate_specular_color; continue; } #endif #ifdef GL_EXT_shader_framebuffer_fetch if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch", 24)) { ret = GLEW_EXT_shader_framebuffer_fetch; continue; } #endif #ifdef GL_EXT_shader_group_vote if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_group_vote", 17)) { ret = GLEW_EXT_shader_group_vote; continue; } #endif #ifdef GL_EXT_shader_image_load_formatted if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_formatted", 27)) { ret = GLEW_EXT_shader_image_load_formatted; continue; } #endif #ifdef GL_EXT_shader_image_load_store if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) { ret = GLEW_EXT_shader_image_load_store; continue; } #endif #ifdef GL_EXT_shader_implicit_conversions if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_implicit_conversions", 27)) { ret = GLEW_EXT_shader_implicit_conversions; continue; } #endif #ifdef GL_EXT_shader_integer_mix if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_integer_mix", 18)) { ret = GLEW_EXT_shader_integer_mix; continue; } #endif #ifdef GL_EXT_shader_io_blocks if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_io_blocks", 16)) { ret = GLEW_EXT_shader_io_blocks; continue; } #endif #ifdef GL_EXT_shader_non_constant_global_initializers if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_non_constant_global_initializers", 39)) { ret = GLEW_EXT_shader_non_constant_global_initializers; continue; } #endif #ifdef GL_EXT_shader_pixel_local_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_pixel_local_storage", 26)) { ret = GLEW_EXT_shader_pixel_local_storage; continue; } #endif #ifdef GL_EXT_shader_pixel_local_storage2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_pixel_local_storage2", 27)) { ret = GLEW_EXT_shader_pixel_local_storage2; continue; } #endif #ifdef GL_EXT_shader_texture_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) { ret = GLEW_EXT_shader_texture_lod; continue; } #endif #ifdef GL_EXT_shadow_funcs if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_funcs", 12)) { ret = GLEW_EXT_shadow_funcs; continue; } #endif #ifdef GL_EXT_shadow_samplers if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_samplers", 15)) { ret = GLEW_EXT_shadow_samplers; continue; } #endif #ifdef GL_EXT_shared_texture_palette if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_texture_palette", 22)) { ret = GLEW_EXT_shared_texture_palette; continue; } #endif #ifdef GL_EXT_sparse_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) { ret = GLEW_EXT_sparse_texture; continue; } #endif #ifdef GL_EXT_sparse_texture2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15)) { ret = GLEW_EXT_sparse_texture2; continue; } #endif #ifdef GL_EXT_stencil_clear_tag if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_clear_tag", 17)) { ret = GLEW_EXT_stencil_clear_tag; continue; } #endif #ifdef GL_EXT_stencil_two_side if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_two_side", 16)) { ret = GLEW_EXT_stencil_two_side; continue; } #endif #ifdef GL_EXT_stencil_wrap if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_wrap", 12)) { ret = GLEW_EXT_stencil_wrap; continue; } #endif #ifdef GL_EXT_subtexture if (_glewStrSame3(&pos, &len, (const GLubyte*)"subtexture", 10)) { ret = GLEW_EXT_subtexture; continue; } #endif #ifdef GL_EXT_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture", 7)) { ret = GLEW_EXT_texture; continue; } #endif #ifdef GL_EXT_texture3D if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture3D", 9)) { ret = GLEW_EXT_texture3D; continue; } #endif #ifdef GL_EXT_texture_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_array", 13)) { ret = GLEW_EXT_texture_array; continue; } #endif #ifdef GL_EXT_texture_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) { ret = GLEW_EXT_texture_buffer_object; continue; } #endif #ifdef GL_EXT_texture_compression_astc_decode_mode if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_decode_mode", 36)) { ret = GLEW_EXT_texture_compression_astc_decode_mode; continue; } #endif #ifdef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_decode_mode_rgb9e5", 43)) { ret = GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5; continue; } #endif #ifdef GL_EXT_texture_compression_bptc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_bptc", 24)) { ret = GLEW_EXT_texture_compression_bptc; continue; } #endif #ifdef GL_EXT_texture_compression_dxt1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) { ret = GLEW_EXT_texture_compression_dxt1; continue; } #endif #ifdef GL_EXT_texture_compression_latc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_latc", 24)) { ret = GLEW_EXT_texture_compression_latc; continue; } #endif #ifdef GL_EXT_texture_compression_rgtc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) { ret = GLEW_EXT_texture_compression_rgtc; continue; } #endif #ifdef GL_EXT_texture_compression_s3tc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24)) { ret = GLEW_EXT_texture_compression_s3tc; continue; } #endif #ifdef GL_EXT_texture_cube_map if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) { ret = GLEW_EXT_texture_cube_map; continue; } #endif #ifdef GL_EXT_texture_cube_map_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22)) { ret = GLEW_EXT_texture_cube_map_array; continue; } #endif #ifdef GL_EXT_texture_edge_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) { ret = GLEW_EXT_texture_edge_clamp; continue; } #endif #ifdef GL_EXT_texture_env if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env", 11)) { ret = GLEW_EXT_texture_env; continue; } #endif #ifdef GL_EXT_texture_env_add if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) { ret = GLEW_EXT_texture_env_add; continue; } #endif #ifdef GL_EXT_texture_env_combine if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) { ret = GLEW_EXT_texture_env_combine; continue; } #endif #ifdef GL_EXT_texture_env_dot3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) { ret = GLEW_EXT_texture_env_dot3; continue; } #endif #ifdef GL_EXT_texture_filter_anisotropic if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26)) { ret = GLEW_EXT_texture_filter_anisotropic; continue; } #endif #ifdef GL_EXT_texture_filter_minmax if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21)) { ret = GLEW_EXT_texture_filter_minmax; continue; } #endif #ifdef GL_EXT_texture_format_BGRA8888 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_format_BGRA8888", 23)) { ret = GLEW_EXT_texture_format_BGRA8888; continue; } #endif #ifdef GL_EXT_texture_integer if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_integer", 15)) { ret = GLEW_EXT_texture_integer; continue; } #endif #ifdef GL_EXT_texture_lod_bias if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) { ret = GLEW_EXT_texture_lod_bias; continue; } #endif #ifdef GL_EXT_texture_mirror_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp", 20)) { ret = GLEW_EXT_texture_mirror_clamp; continue; } #endif #ifdef GL_EXT_texture_norm16 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_norm16", 14)) { ret = GLEW_EXT_texture_norm16; continue; } #endif #ifdef GL_EXT_texture_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_object", 14)) { ret = GLEW_EXT_texture_object; continue; } #endif #ifdef GL_EXT_texture_perturb_normal if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_perturb_normal", 22)) { ret = GLEW_EXT_texture_perturb_normal; continue; } #endif #ifdef GL_EXT_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) { ret = GLEW_EXT_texture_rectangle; continue; } #endif #ifdef GL_EXT_texture_rg if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rg", 10)) { ret = GLEW_EXT_texture_rg; continue; } #endif #ifdef GL_EXT_texture_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB", 12)) { ret = GLEW_EXT_texture_sRGB; continue; } #endif #ifdef GL_EXT_texture_sRGB_R8 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_R8", 15)) { ret = GLEW_EXT_texture_sRGB_R8; continue; } #endif #ifdef GL_EXT_texture_sRGB_RG8 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_RG8", 16)) { ret = GLEW_EXT_texture_sRGB_RG8; continue; } #endif #ifdef GL_EXT_texture_sRGB_decode if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_decode", 19)) { ret = GLEW_EXT_texture_sRGB_decode; continue; } #endif #ifdef GL_EXT_texture_shared_exponent if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shared_exponent", 23)) { ret = GLEW_EXT_texture_shared_exponent; continue; } #endif #ifdef GL_EXT_texture_snorm if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_snorm", 13)) { ret = GLEW_EXT_texture_snorm; continue; } #endif #ifdef GL_EXT_texture_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15)) { ret = GLEW_EXT_texture_storage; continue; } #endif #ifdef GL_EXT_texture_swizzle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) { ret = GLEW_EXT_texture_swizzle; continue; } #endif #ifdef GL_EXT_texture_type_2_10_10_10_REV if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_type_2_10_10_10_REV", 27)) { ret = GLEW_EXT_texture_type_2_10_10_10_REV; continue; } #endif #ifdef GL_EXT_texture_view if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_view", 12)) { ret = GLEW_EXT_texture_view; continue; } #endif #ifdef GL_EXT_timer_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) { ret = GLEW_EXT_timer_query; continue; } #endif #ifdef GL_EXT_transform_feedback if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) { ret = GLEW_EXT_transform_feedback; continue; } #endif #ifdef GL_EXT_unpack_subimage if (_glewStrSame3(&pos, &len, (const GLubyte*)"unpack_subimage", 15)) { ret = GLEW_EXT_unpack_subimage; continue; } #endif #ifdef GL_EXT_vertex_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array", 12)) { ret = GLEW_EXT_vertex_array; continue; } #endif #ifdef GL_EXT_vertex_array_bgra if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) { ret = GLEW_EXT_vertex_array_bgra; continue; } #endif #ifdef GL_EXT_vertex_array_setXXX if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_setXXX", 19)) { ret = GLEW_EXT_vertex_array_setXXX; continue; } #endif #ifdef GL_EXT_vertex_attrib_64bit if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) { ret = GLEW_EXT_vertex_attrib_64bit; continue; } #endif #ifdef GL_EXT_vertex_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) { ret = GLEW_EXT_vertex_shader; continue; } #endif #ifdef GL_EXT_vertex_weighting if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_weighting", 16)) { ret = GLEW_EXT_vertex_weighting; continue; } #endif #ifdef GL_EXT_win32_keyed_mutex if (_glewStrSame3(&pos, &len, (const GLubyte*)"win32_keyed_mutex", 17)) { ret = GLEW_EXT_win32_keyed_mutex; continue; } #endif #ifdef GL_EXT_window_rectangles if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_rectangles", 17)) { ret = GLEW_EXT_window_rectangles; continue; } #endif #ifdef GL_EXT_x11_sync_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"x11_sync_object", 15)) { ret = GLEW_EXT_x11_sync_object; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"GREMEDY_", 8)) { #ifdef GL_GREMEDY_frame_terminator if (_glewStrSame3(&pos, &len, (const GLubyte*)"frame_terminator", 16)) { ret = GLEW_GREMEDY_frame_terminator; continue; } #endif #ifdef GL_GREMEDY_string_marker if (_glewStrSame3(&pos, &len, (const GLubyte*)"string_marker", 13)) { ret = GLEW_GREMEDY_string_marker; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"HP_", 3)) { #ifdef GL_HP_convolution_border_modes if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) { ret = GLEW_HP_convolution_border_modes; continue; } #endif #ifdef GL_HP_image_transform if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_transform", 15)) { ret = GLEW_HP_image_transform; continue; } #endif #ifdef GL_HP_occlusion_test if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_test", 14)) { ret = GLEW_HP_occlusion_test; continue; } #endif #ifdef GL_HP_texture_lighting if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lighting", 16)) { ret = GLEW_HP_texture_lighting; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"IBM_", 4)) { #ifdef GL_IBM_cull_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) { ret = GLEW_IBM_cull_vertex; continue; } #endif #ifdef GL_IBM_multimode_draw_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"multimode_draw_arrays", 21)) { ret = GLEW_IBM_multimode_draw_arrays; continue; } #endif #ifdef GL_IBM_rasterpos_clip if (_glewStrSame3(&pos, &len, (const GLubyte*)"rasterpos_clip", 14)) { ret = GLEW_IBM_rasterpos_clip; continue; } #endif #ifdef GL_IBM_static_data if (_glewStrSame3(&pos, &len, (const GLubyte*)"static_data", 11)) { ret = GLEW_IBM_static_data; continue; } #endif #ifdef GL_IBM_texture_mirrored_repeat if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) { ret = GLEW_IBM_texture_mirrored_repeat; continue; } #endif #ifdef GL_IBM_vertex_array_lists if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_lists", 18)) { ret = GLEW_IBM_vertex_array_lists; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"INGR_", 5)) { #ifdef GL_INGR_color_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_clamp", 11)) { ret = GLEW_INGR_color_clamp; continue; } #endif #ifdef GL_INGR_interlace_read if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace_read", 14)) { ret = GLEW_INGR_interlace_read; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) { #ifdef GL_INTEL_conservative_rasterization if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_rasterization", 26)) { ret = GLEW_INTEL_conservative_rasterization; continue; } #endif #ifdef GL_INTEL_fragment_shader_ordering if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_ordering", 24)) { ret = GLEW_INTEL_fragment_shader_ordering; continue; } #endif #ifdef GL_INTEL_framebuffer_CMAA if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_CMAA", 16)) { ret = GLEW_INTEL_framebuffer_CMAA; continue; } #endif #ifdef GL_INTEL_map_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_texture", 11)) { ret = GLEW_INTEL_map_texture; continue; } #endif #ifdef GL_INTEL_parallel_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_arrays", 15)) { ret = GLEW_INTEL_parallel_arrays; continue; } #endif #ifdef GL_INTEL_performance_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_query", 17)) { ret = GLEW_INTEL_performance_query; continue; } #endif #ifdef GL_INTEL_texture_scissor if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scissor", 15)) { ret = GLEW_INTEL_texture_scissor; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"KHR_", 4)) { #ifdef GL_KHR_blend_equation_advanced if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) { ret = GLEW_KHR_blend_equation_advanced; continue; } #endif #ifdef GL_KHR_blend_equation_advanced_coherent if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) { ret = GLEW_KHR_blend_equation_advanced_coherent; continue; } #endif #ifdef GL_KHR_context_flush_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) { ret = GLEW_KHR_context_flush_control; continue; } #endif #ifdef GL_KHR_debug if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug", 5)) { ret = GLEW_KHR_debug; continue; } #endif #ifdef GL_KHR_no_error if (_glewStrSame3(&pos, &len, (const GLubyte*)"no_error", 8)) { ret = GLEW_KHR_no_error; continue; } #endif #ifdef GL_KHR_parallel_shader_compile if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_shader_compile", 23)) { ret = GLEW_KHR_parallel_shader_compile; continue; } #endif #ifdef GL_KHR_robust_buffer_access_behavior if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) { ret = GLEW_KHR_robust_buffer_access_behavior; continue; } #endif #ifdef GL_KHR_robustness if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) { ret = GLEW_KHR_robustness; continue; } #endif #ifdef GL_KHR_texture_compression_astc_hdr if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_hdr", 28)) { ret = GLEW_KHR_texture_compression_astc_hdr; continue; } #endif #ifdef GL_KHR_texture_compression_astc_ldr if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_ldr", 28)) { ret = GLEW_KHR_texture_compression_astc_ldr; continue; } #endif #ifdef GL_KHR_texture_compression_astc_sliced_3d if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_sliced_3d", 34)) { ret = GLEW_KHR_texture_compression_astc_sliced_3d; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"KTX_", 4)) { #ifdef GL_KTX_buffer_region if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) { ret = GLEW_KTX_buffer_region; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESAX_", 6)) { #ifdef GL_MESAX_texture_stack if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stack", 13)) { ret = GLEW_MESAX_texture_stack; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) { #ifdef GL_MESA_pack_invert if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_invert", 11)) { ret = GLEW_MESA_pack_invert; continue; } #endif #ifdef GL_MESA_resize_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"resize_buffers", 14)) { ret = GLEW_MESA_resize_buffers; continue; } #endif #ifdef GL_MESA_shader_integer_functions if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_integer_functions", 24)) { ret = GLEW_MESA_shader_integer_functions; continue; } #endif #ifdef GL_MESA_window_pos if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) { ret = GLEW_MESA_window_pos; continue; } #endif #ifdef GL_MESA_ycbcr_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_texture", 13)) { ret = GLEW_MESA_ycbcr_texture; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NVX_", 4)) { #ifdef GL_NVX_blend_equation_advanced_multi_draw_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_multi_draw_buffers", 42)) { ret = GLEW_NVX_blend_equation_advanced_multi_draw_buffers; continue; } #endif #ifdef GL_NVX_conditional_render if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) { ret = GLEW_NVX_conditional_render; continue; } #endif #ifdef GL_NVX_gpu_memory_info if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_memory_info", 15)) { ret = GLEW_NVX_gpu_memory_info; continue; } #endif #ifdef GL_NVX_linked_gpu_multicast if (_glewStrSame3(&pos, &len, (const GLubyte*)"linked_gpu_multicast", 20)) { ret = GLEW_NVX_linked_gpu_multicast; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) { #ifdef GL_NV_3dvision_settings if (_glewStrSame3(&pos, &len, (const GLubyte*)"3dvision_settings", 17)) { ret = GLEW_NV_3dvision_settings; continue; } #endif #ifdef GL_NV_EGL_stream_consumer_external if (_glewStrSame3(&pos, &len, (const GLubyte*)"EGL_stream_consumer_external", 28)) { ret = GLEW_NV_EGL_stream_consumer_external; continue; } #endif #ifdef GL_NV_alpha_to_coverage_dither_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"alpha_to_coverage_dither_control", 32)) { ret = GLEW_NV_alpha_to_coverage_dither_control; continue; } #endif #ifdef GL_NV_bgr if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgr", 3)) { ret = GLEW_NV_bgr; continue; } #endif #ifdef GL_NV_bindless_multi_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect", 28)) { ret = GLEW_NV_bindless_multi_draw_indirect; continue; } #endif #ifdef GL_NV_bindless_multi_draw_indirect_count if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect_count", 34)) { ret = GLEW_NV_bindless_multi_draw_indirect_count; continue; } #endif #ifdef GL_NV_bindless_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) { ret = GLEW_NV_bindless_texture; continue; } #endif #ifdef GL_NV_blend_equation_advanced if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) { ret = GLEW_NV_blend_equation_advanced; continue; } #endif #ifdef GL_NV_blend_equation_advanced_coherent if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) { ret = GLEW_NV_blend_equation_advanced_coherent; continue; } #endif #ifdef GL_NV_blend_minmax_factor if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax_factor", 19)) { ret = GLEW_NV_blend_minmax_factor; continue; } #endif #ifdef GL_NV_blend_square if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_square", 12)) { ret = GLEW_NV_blend_square; continue; } #endif #ifdef GL_NV_clip_space_w_scaling if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_space_w_scaling", 20)) { ret = GLEW_NV_clip_space_w_scaling; continue; } #endif #ifdef GL_NV_command_list if (_glewStrSame3(&pos, &len, (const GLubyte*)"command_list", 12)) { ret = GLEW_NV_command_list; continue; } #endif #ifdef GL_NV_compute_program5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_program5", 16)) { ret = GLEW_NV_compute_program5; continue; } #endif #ifdef GL_NV_conditional_render if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) { ret = GLEW_NV_conditional_render; continue; } #endif #ifdef GL_NV_conservative_raster if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster", 19)) { ret = GLEW_NV_conservative_raster; continue; } #endif #ifdef GL_NV_conservative_raster_dilate if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster_dilate", 26)) { ret = GLEW_NV_conservative_raster_dilate; continue; } #endif #ifdef GL_NV_conservative_raster_pre_snap_triangles if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster_pre_snap_triangles", 38)) { ret = GLEW_NV_conservative_raster_pre_snap_triangles; continue; } #endif #ifdef GL_NV_copy_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) { ret = GLEW_NV_copy_buffer; continue; } #endif #ifdef GL_NV_copy_depth_to_color if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_depth_to_color", 19)) { ret = GLEW_NV_copy_depth_to_color; continue; } #endif #ifdef GL_NV_copy_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) { ret = GLEW_NV_copy_image; continue; } #endif #ifdef GL_NV_deep_texture3D if (_glewStrSame3(&pos, &len, (const GLubyte*)"deep_texture3D", 14)) { ret = GLEW_NV_deep_texture3D; continue; } #endif #ifdef GL_NV_depth_buffer_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) { ret = GLEW_NV_depth_buffer_float; continue; } #endif #ifdef GL_NV_depth_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) { ret = GLEW_NV_depth_clamp; continue; } #endif #ifdef GL_NV_depth_range_unclamped if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_range_unclamped", 21)) { ret = GLEW_NV_depth_range_unclamped; continue; } #endif #ifdef GL_NV_draw_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) { ret = GLEW_NV_draw_buffers; continue; } #endif #ifdef GL_NV_draw_instanced if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) { ret = GLEW_NV_draw_instanced; continue; } #endif #ifdef GL_NV_draw_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_texture", 12)) { ret = GLEW_NV_draw_texture; continue; } #endif #ifdef GL_NV_draw_vulkan_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_vulkan_image", 17)) { ret = GLEW_NV_draw_vulkan_image; continue; } #endif #ifdef GL_NV_evaluators if (_glewStrSame3(&pos, &len, (const GLubyte*)"evaluators", 10)) { ret = GLEW_NV_evaluators; continue; } #endif #ifdef GL_NV_explicit_attrib_location if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24)) { ret = GLEW_NV_explicit_attrib_location; continue; } #endif #ifdef GL_NV_explicit_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_multisample", 20)) { ret = GLEW_NV_explicit_multisample; continue; } #endif #ifdef GL_NV_fbo_color_attachments if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbo_color_attachments", 21)) { ret = GLEW_NV_fbo_color_attachments; continue; } #endif #ifdef GL_NV_fence if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) { ret = GLEW_NV_fence; continue; } #endif #ifdef GL_NV_fill_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"fill_rectangle", 14)) { ret = GLEW_NV_fill_rectangle; continue; } #endif #ifdef GL_NV_float_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) { ret = GLEW_NV_float_buffer; continue; } #endif #ifdef GL_NV_fog_distance if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_distance", 12)) { ret = GLEW_NV_fog_distance; continue; } #endif #ifdef GL_NV_fragment_coverage_to_color if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coverage_to_color", 26)) { ret = GLEW_NV_fragment_coverage_to_color; continue; } #endif #ifdef GL_NV_fragment_program if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) { ret = GLEW_NV_fragment_program; continue; } #endif #ifdef GL_NV_fragment_program2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program2", 17)) { ret = GLEW_NV_fragment_program2; continue; } #endif #ifdef GL_NV_fragment_program4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program4", 17)) { ret = GLEW_NV_fragment_program4; continue; } #endif #ifdef GL_NV_fragment_program_option if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_option", 23)) { ret = GLEW_NV_fragment_program_option; continue; } #endif #ifdef GL_NV_fragment_shader_interlock if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25)) { ret = GLEW_NV_fragment_shader_interlock; continue; } #endif #ifdef GL_NV_framebuffer_blit if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) { ret = GLEW_NV_framebuffer_blit; continue; } #endif #ifdef GL_NV_framebuffer_mixed_samples if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_mixed_samples", 25)) { ret = GLEW_NV_framebuffer_mixed_samples; continue; } #endif #ifdef GL_NV_framebuffer_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) { ret = GLEW_NV_framebuffer_multisample; continue; } #endif #ifdef GL_NV_framebuffer_multisample_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_coverage", 32)) { ret = GLEW_NV_framebuffer_multisample_coverage; continue; } #endif #ifdef GL_NV_generate_mipmap_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap_sRGB", 20)) { ret = GLEW_NV_generate_mipmap_sRGB; continue; } #endif #ifdef GL_NV_geometry_program4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_program4", 17)) { ret = GLEW_NV_geometry_program4; continue; } #endif #ifdef GL_NV_geometry_shader4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) { ret = GLEW_NV_geometry_shader4; continue; } #endif #ifdef GL_NV_geometry_shader_passthrough if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader_passthrough", 27)) { ret = GLEW_NV_geometry_shader_passthrough; continue; } #endif #ifdef GL_NV_gpu_multicast if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_multicast", 13)) { ret = GLEW_NV_gpu_multicast; continue; } #endif #ifdef GL_NV_gpu_program4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program4", 12)) { ret = GLEW_NV_gpu_program4; continue; } #endif #ifdef GL_NV_gpu_program5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5", 12)) { ret = GLEW_NV_gpu_program5; continue; } #endif #ifdef GL_NV_gpu_program5_mem_extended if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5_mem_extended", 25)) { ret = GLEW_NV_gpu_program5_mem_extended; continue; } #endif #ifdef GL_NV_gpu_program_fp64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_fp64", 16)) { ret = GLEW_NV_gpu_program_fp64; continue; } #endif #ifdef GL_NV_gpu_shader5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) { ret = GLEW_NV_gpu_shader5; continue; } #endif #ifdef GL_NV_half_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float", 10)) { ret = GLEW_NV_half_float; continue; } #endif #ifdef GL_NV_image_formats if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_formats", 13)) { ret = GLEW_NV_image_formats; continue; } #endif #ifdef GL_NV_instanced_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) { ret = GLEW_NV_instanced_arrays; continue; } #endif #ifdef GL_NV_internalformat_sample_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_sample_query", 27)) { ret = GLEW_NV_internalformat_sample_query; continue; } #endif #ifdef GL_NV_light_max_exponent if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_max_exponent", 18)) { ret = GLEW_NV_light_max_exponent; continue; } #endif #ifdef GL_NV_multisample_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) { ret = GLEW_NV_multisample_coverage; continue; } #endif #ifdef GL_NV_multisample_filter_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_filter_hint", 23)) { ret = GLEW_NV_multisample_filter_hint; continue; } #endif #ifdef GL_NV_non_square_matrices if (_glewStrSame3(&pos, &len, (const GLubyte*)"non_square_matrices", 19)) { ret = GLEW_NV_non_square_matrices; continue; } #endif #ifdef GL_NV_occlusion_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) { ret = GLEW_NV_occlusion_query; continue; } #endif #ifdef GL_NV_pack_subimage if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_subimage", 13)) { ret = GLEW_NV_pack_subimage; continue; } #endif #ifdef GL_NV_packed_depth_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) { ret = GLEW_NV_packed_depth_stencil; continue; } #endif #ifdef GL_NV_packed_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float", 12)) { ret = GLEW_NV_packed_float; continue; } #endif #ifdef GL_NV_packed_float_linear if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float_linear", 19)) { ret = GLEW_NV_packed_float_linear; continue; } #endif #ifdef GL_NV_parameter_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object", 23)) { ret = GLEW_NV_parameter_buffer_object; continue; } #endif #ifdef GL_NV_parameter_buffer_object2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object2", 24)) { ret = GLEW_NV_parameter_buffer_object2; continue; } #endif #ifdef GL_NV_path_rendering if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering", 14)) { ret = GLEW_NV_path_rendering; continue; } #endif #ifdef GL_NV_path_rendering_shared_edge if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering_shared_edge", 26)) { ret = GLEW_NV_path_rendering_shared_edge; continue; } #endif #ifdef GL_NV_pixel_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) { ret = GLEW_NV_pixel_buffer_object; continue; } #endif #ifdef GL_NV_pixel_data_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_data_range", 16)) { ret = GLEW_NV_pixel_data_range; continue; } #endif #ifdef GL_NV_platform_binary if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_binary", 15)) { ret = GLEW_NV_platform_binary; continue; } #endif #ifdef GL_NV_point_sprite if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) { ret = GLEW_NV_point_sprite; continue; } #endif #ifdef GL_NV_polygon_mode if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_mode", 12)) { ret = GLEW_NV_polygon_mode; continue; } #endif #ifdef GL_NV_present_video if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) { ret = GLEW_NV_present_video; continue; } #endif #ifdef GL_NV_primitive_restart if (_glewStrSame3(&pos, &len, (const GLubyte*)"primitive_restart", 17)) { ret = GLEW_NV_primitive_restart; continue; } #endif #ifdef GL_NV_read_depth if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_depth", 10)) { ret = GLEW_NV_read_depth; continue; } #endif #ifdef GL_NV_read_depth_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_depth_stencil", 18)) { ret = GLEW_NV_read_depth_stencil; continue; } #endif #ifdef GL_NV_read_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_stencil", 12)) { ret = GLEW_NV_read_stencil; continue; } #endif #ifdef GL_NV_register_combiners if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners", 18)) { ret = GLEW_NV_register_combiners; continue; } #endif #ifdef GL_NV_register_combiners2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners2", 19)) { ret = GLEW_NV_register_combiners2; continue; } #endif #ifdef GL_NV_robustness_video_memory_purge if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_video_memory_purge", 29)) { ret = GLEW_NV_robustness_video_memory_purge; continue; } #endif #ifdef GL_NV_sRGB_formats if (_glewStrSame3(&pos, &len, (const GLubyte*)"sRGB_formats", 12)) { ret = GLEW_NV_sRGB_formats; continue; } #endif #ifdef GL_NV_sample_locations if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16)) { ret = GLEW_NV_sample_locations; continue; } #endif #ifdef GL_NV_sample_mask_override_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_mask_override_coverage", 29)) { ret = GLEW_NV_sample_mask_override_coverage; continue; } #endif #ifdef GL_NV_shader_atomic_counters if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) { ret = GLEW_NV_shader_atomic_counters; continue; } #endif #ifdef GL_NV_shader_atomic_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float", 19)) { ret = GLEW_NV_shader_atomic_float; continue; } #endif #ifdef GL_NV_shader_atomic_float64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float64", 21)) { ret = GLEW_NV_shader_atomic_float64; continue; } #endif #ifdef GL_NV_shader_atomic_fp16_vector if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_fp16_vector", 25)) { ret = GLEW_NV_shader_atomic_fp16_vector; continue; } #endif #ifdef GL_NV_shader_atomic_int64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_int64", 19)) { ret = GLEW_NV_shader_atomic_int64; continue; } #endif #ifdef GL_NV_shader_buffer_load if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_buffer_load", 18)) { ret = GLEW_NV_shader_buffer_load; continue; } #endif #ifdef GL_NV_shader_noperspective_interpolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_noperspective_interpolation", 34)) { ret = GLEW_NV_shader_noperspective_interpolation; continue; } #endif #ifdef GL_NV_shader_storage_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) { ret = GLEW_NV_shader_storage_buffer_object; continue; } #endif #ifdef GL_NV_shader_thread_group if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_group", 19)) { ret = GLEW_NV_shader_thread_group; continue; } #endif #ifdef GL_NV_shader_thread_shuffle if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_shuffle", 21)) { ret = GLEW_NV_shader_thread_shuffle; continue; } #endif #ifdef GL_NV_shadow_samplers_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_samplers_array", 21)) { ret = GLEW_NV_shadow_samplers_array; continue; } #endif #ifdef GL_NV_shadow_samplers_cube if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_samplers_cube", 20)) { ret = GLEW_NV_shadow_samplers_cube; continue; } #endif #ifdef GL_NV_stereo_view_rendering if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_view_rendering", 21)) { ret = GLEW_NV_stereo_view_rendering; continue; } #endif #ifdef GL_NV_tessellation_program5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_program5", 21)) { ret = GLEW_NV_tessellation_program5; continue; } #endif #ifdef GL_NV_texgen_emboss if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_emboss", 13)) { ret = GLEW_NV_texgen_emboss; continue; } #endif #ifdef GL_NV_texgen_reflection if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_reflection", 17)) { ret = GLEW_NV_texgen_reflection; continue; } #endif #ifdef GL_NV_texture_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_array", 13)) { ret = GLEW_NV_texture_array; continue; } #endif #ifdef GL_NV_texture_barrier if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) { ret = GLEW_NV_texture_barrier; continue; } #endif #ifdef GL_NV_texture_border_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) { ret = GLEW_NV_texture_border_clamp; continue; } #endif #ifdef GL_NV_texture_compression_latc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_latc", 24)) { ret = GLEW_NV_texture_compression_latc; continue; } #endif #ifdef GL_NV_texture_compression_s3tc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24)) { ret = GLEW_NV_texture_compression_s3tc; continue; } #endif #ifdef GL_NV_texture_compression_s3tc_update if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc_update", 31)) { ret = GLEW_NV_texture_compression_s3tc_update; continue; } #endif #ifdef GL_NV_texture_compression_vtc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_vtc", 23)) { ret = GLEW_NV_texture_compression_vtc; continue; } #endif #ifdef GL_NV_texture_env_combine4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine4", 20)) { ret = GLEW_NV_texture_env_combine4; continue; } #endif #ifdef GL_NV_texture_expand_normal if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_expand_normal", 21)) { ret = GLEW_NV_texture_expand_normal; continue; } #endif #ifdef GL_NV_texture_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) { ret = GLEW_NV_texture_multisample; continue; } #endif #ifdef GL_NV_texture_npot_2D_mipmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_npot_2D_mipmap", 22)) { ret = GLEW_NV_texture_npot_2D_mipmap; continue; } #endif #ifdef GL_NV_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) { ret = GLEW_NV_texture_rectangle; continue; } #endif #ifdef GL_NV_texture_rectangle_compressed if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle_compressed", 28)) { ret = GLEW_NV_texture_rectangle_compressed; continue; } #endif #ifdef GL_NV_texture_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader", 14)) { ret = GLEW_NV_texture_shader; continue; } #endif #ifdef GL_NV_texture_shader2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader2", 15)) { ret = GLEW_NV_texture_shader2; continue; } #endif #ifdef GL_NV_texture_shader3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader3", 15)) { ret = GLEW_NV_texture_shader3; continue; } #endif #ifdef GL_NV_transform_feedback if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) { ret = GLEW_NV_transform_feedback; continue; } #endif #ifdef GL_NV_transform_feedback2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) { ret = GLEW_NV_transform_feedback2; continue; } #endif #ifdef GL_NV_uniform_buffer_unified_memory if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_unified_memory", 29)) { ret = GLEW_NV_uniform_buffer_unified_memory; continue; } #endif #ifdef GL_NV_vdpau_interop if (_glewStrSame3(&pos, &len, (const GLubyte*)"vdpau_interop", 13)) { ret = GLEW_NV_vdpau_interop; continue; } #endif #ifdef GL_NV_vertex_array_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) { ret = GLEW_NV_vertex_array_range; continue; } #endif #ifdef GL_NV_vertex_array_range2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range2", 19)) { ret = GLEW_NV_vertex_array_range2; continue; } #endif #ifdef GL_NV_vertex_attrib_integer_64bit if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_integer_64bit", 27)) { ret = GLEW_NV_vertex_attrib_integer_64bit; continue; } #endif #ifdef GL_NV_vertex_buffer_unified_memory if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_unified_memory", 28)) { ret = GLEW_NV_vertex_buffer_unified_memory; continue; } #endif #ifdef GL_NV_vertex_program if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) { ret = GLEW_NV_vertex_program; continue; } #endif #ifdef GL_NV_vertex_program1_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program1_1", 17)) { ret = GLEW_NV_vertex_program1_1; continue; } #endif #ifdef GL_NV_vertex_program2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2", 15)) { ret = GLEW_NV_vertex_program2; continue; } #endif #ifdef GL_NV_vertex_program2_option if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2_option", 22)) { ret = GLEW_NV_vertex_program2_option; continue; } #endif #ifdef GL_NV_vertex_program3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program3", 15)) { ret = GLEW_NV_vertex_program3; continue; } #endif #ifdef GL_NV_vertex_program4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program4", 15)) { ret = GLEW_NV_vertex_program4; continue; } #endif #ifdef GL_NV_video_capture if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) { ret = GLEW_NV_video_capture; continue; } #endif #ifdef GL_NV_viewport_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array", 14)) { ret = GLEW_NV_viewport_array; continue; } #endif #ifdef GL_NV_viewport_array2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array2", 15)) { ret = GLEW_NV_viewport_array2; continue; } #endif #ifdef GL_NV_viewport_swizzle if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_swizzle", 16)) { ret = GLEW_NV_viewport_swizzle; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"OES_", 4)) { #ifdef GL_OES_byte_coordinates if (_glewStrSame3(&pos, &len, (const GLubyte*)"byte_coordinates", 16)) { ret = GLEW_OES_byte_coordinates; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) { #ifdef GL_OML_interlace if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) { ret = GLEW_OML_interlace; continue; } #endif #ifdef GL_OML_resample if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) { ret = GLEW_OML_resample; continue; } #endif #ifdef GL_OML_subsample if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9)) { ret = GLEW_OML_subsample; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"OVR_", 4)) { #ifdef GL_OVR_multiview if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview", 9)) { ret = GLEW_OVR_multiview; continue; } #endif #ifdef GL_OVR_multiview2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview2", 10)) { ret = GLEW_OVR_multiview2; continue; } #endif #ifdef GL_OVR_multiview_multisampled_render_to_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_multisampled_render_to_texture", 40)) { ret = GLEW_OVR_multiview_multisampled_render_to_texture; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"PGI_", 4)) { #ifdef GL_PGI_misc_hints if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_hints", 10)) { ret = GLEW_PGI_misc_hints; continue; } #endif #ifdef GL_PGI_vertex_hints if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_hints", 12)) { ret = GLEW_PGI_vertex_hints; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"QCOM_", 5)) { #ifdef GL_QCOM_alpha_test if (_glewStrSame3(&pos, &len, (const GLubyte*)"alpha_test", 10)) { ret = GLEW_QCOM_alpha_test; continue; } #endif #ifdef GL_QCOM_binning_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"binning_control", 15)) { ret = GLEW_QCOM_binning_control; continue; } #endif #ifdef GL_QCOM_driver_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"driver_control", 14)) { ret = GLEW_QCOM_driver_control; continue; } #endif #ifdef GL_QCOM_extended_get if (_glewStrSame3(&pos, &len, (const GLubyte*)"extended_get", 12)) { ret = GLEW_QCOM_extended_get; continue; } #endif #ifdef GL_QCOM_extended_get2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"extended_get2", 13)) { ret = GLEW_QCOM_extended_get2; continue; } #endif #ifdef GL_QCOM_framebuffer_foveated if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_foveated", 20)) { ret = GLEW_QCOM_framebuffer_foveated; continue; } #endif #ifdef GL_QCOM_perfmon_global_mode if (_glewStrSame3(&pos, &len, (const GLubyte*)"perfmon_global_mode", 19)) { ret = GLEW_QCOM_perfmon_global_mode; continue; } #endif #ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch_noncoherent", 36)) { ret = GLEW_QCOM_shader_framebuffer_fetch_noncoherent; continue; } #endif #ifdef GL_QCOM_tiled_rendering if (_glewStrSame3(&pos, &len, (const GLubyte*)"tiled_rendering", 15)) { ret = GLEW_QCOM_tiled_rendering; continue; } #endif #ifdef GL_QCOM_writeonly_rendering if (_glewStrSame3(&pos, &len, (const GLubyte*)"writeonly_rendering", 19)) { ret = GLEW_QCOM_writeonly_rendering; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"REGAL_", 6)) { #ifdef GL_REGAL_ES1_0_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_0_compatibility", 19)) { ret = GLEW_REGAL_ES1_0_compatibility; continue; } #endif #ifdef GL_REGAL_ES1_1_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_1_compatibility", 19)) { ret = GLEW_REGAL_ES1_1_compatibility; continue; } #endif #ifdef GL_REGAL_enable if (_glewStrSame3(&pos, &len, (const GLubyte*)"enable", 6)) { ret = GLEW_REGAL_enable; continue; } #endif #ifdef GL_REGAL_error_string if (_glewStrSame3(&pos, &len, (const GLubyte*)"error_string", 12)) { ret = GLEW_REGAL_error_string; continue; } #endif #ifdef GL_REGAL_extension_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"extension_query", 15)) { ret = GLEW_REGAL_extension_query; continue; } #endif #ifdef GL_REGAL_log if (_glewStrSame3(&pos, &len, (const GLubyte*)"log", 3)) { ret = GLEW_REGAL_log; continue; } #endif #ifdef GL_REGAL_proc_address if (_glewStrSame3(&pos, &len, (const GLubyte*)"proc_address", 12)) { ret = GLEW_REGAL_proc_address; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"REND_", 5)) { #ifdef GL_REND_screen_coordinates if (_glewStrSame3(&pos, &len, (const GLubyte*)"screen_coordinates", 18)) { ret = GLEW_REND_screen_coordinates; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"S3_", 3)) { #ifdef GL_S3_s3tc if (_glewStrSame3(&pos, &len, (const GLubyte*)"s3tc", 4)) { ret = GLEW_S3_s3tc; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) { #ifdef GL_SGIS_clip_band_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_band_hint", 14)) { ret = GLEW_SGIS_clip_band_hint; continue; } #endif #ifdef GL_SGIS_color_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) { ret = GLEW_SGIS_color_range; continue; } #endif #ifdef GL_SGIS_detail_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"detail_texture", 14)) { ret = GLEW_SGIS_detail_texture; continue; } #endif #ifdef GL_SGIS_fog_function if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_function", 12)) { ret = GLEW_SGIS_fog_function; continue; } #endif #ifdef GL_SGIS_generate_mipmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap", 15)) { ret = GLEW_SGIS_generate_mipmap; continue; } #endif #ifdef GL_SGIS_line_texgen if (_glewStrSame3(&pos, &len, (const GLubyte*)"line_texgen", 11)) { ret = GLEW_SGIS_line_texgen; continue; } #endif #ifdef GL_SGIS_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLEW_SGIS_multisample; continue; } #endif #ifdef GL_SGIS_multitexture if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12)) { ret = GLEW_SGIS_multitexture; continue; } #endif #ifdef GL_SGIS_pixel_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) { ret = GLEW_SGIS_pixel_texture; continue; } #endif #ifdef GL_SGIS_point_line_texgen if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_line_texgen", 17)) { ret = GLEW_SGIS_point_line_texgen; continue; } #endif #ifdef GL_SGIS_shared_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18)) { ret = GLEW_SGIS_shared_multisample; continue; } #endif #ifdef GL_SGIS_sharpen_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"sharpen_texture", 15)) { ret = GLEW_SGIS_sharpen_texture; continue; } #endif #ifdef GL_SGIS_texture4D if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture4D", 9)) { ret = GLEW_SGIS_texture4D; continue; } #endif #ifdef GL_SGIS_texture_border_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) { ret = GLEW_SGIS_texture_border_clamp; continue; } #endif #ifdef GL_SGIS_texture_edge_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) { ret = GLEW_SGIS_texture_edge_clamp; continue; } #endif #ifdef GL_SGIS_texture_filter4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter4", 15)) { ret = GLEW_SGIS_texture_filter4; continue; } #endif #ifdef GL_SGIS_texture_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod", 11)) { ret = GLEW_SGIS_texture_lod; continue; } #endif #ifdef GL_SGIS_texture_select if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_select", 14)) { ret = GLEW_SGIS_texture_select; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) { #ifdef GL_SGIX_async if (_glewStrSame3(&pos, &len, (const GLubyte*)"async", 5)) { ret = GLEW_SGIX_async; continue; } #endif #ifdef GL_SGIX_async_histogram if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_histogram", 15)) { ret = GLEW_SGIX_async_histogram; continue; } #endif #ifdef GL_SGIX_async_pixel if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_pixel", 11)) { ret = GLEW_SGIX_async_pixel; continue; } #endif #ifdef GL_SGIX_bali_g_instruments if (_glewStrSame3(&pos, &len, (const GLubyte*)"bali_g_instruments", 18)) { ret = GLEW_SGIX_bali_g_instruments; continue; } #endif #ifdef GL_SGIX_bali_r_instruments if (_glewStrSame3(&pos, &len, (const GLubyte*)"bali_r_instruments", 18)) { ret = GLEW_SGIX_bali_r_instruments; continue; } #endif #ifdef GL_SGIX_bali_timer_instruments if (_glewStrSame3(&pos, &len, (const GLubyte*)"bali_timer_instruments", 22)) { ret = GLEW_SGIX_bali_timer_instruments; continue; } #endif #ifdef GL_SGIX_blend_alpha_minmax if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_alpha_minmax", 18)) { ret = GLEW_SGIX_blend_alpha_minmax; continue; } #endif #ifdef GL_SGIX_blend_cadd if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_cadd", 10)) { ret = GLEW_SGIX_blend_cadd; continue; } #endif #ifdef GL_SGIX_blend_cmultiply if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_cmultiply", 15)) { ret = GLEW_SGIX_blend_cmultiply; continue; } #endif #ifdef GL_SGIX_calligraphic_fragment if (_glewStrSame3(&pos, &len, (const GLubyte*)"calligraphic_fragment", 21)) { ret = GLEW_SGIX_calligraphic_fragment; continue; } #endif #ifdef GL_SGIX_clipmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"clipmap", 7)) { ret = GLEW_SGIX_clipmap; continue; } #endif #ifdef GL_SGIX_color_matrix_accuracy if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix_accuracy", 21)) { ret = GLEW_SGIX_color_matrix_accuracy; continue; } #endif #ifdef GL_SGIX_color_table_index_mode if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table_index_mode", 22)) { ret = GLEW_SGIX_color_table_index_mode; continue; } #endif #ifdef GL_SGIX_complex_polar if (_glewStrSame3(&pos, &len, (const GLubyte*)"complex_polar", 13)) { ret = GLEW_SGIX_complex_polar; continue; } #endif #ifdef GL_SGIX_convolution_accuracy if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_accuracy", 20)) { ret = GLEW_SGIX_convolution_accuracy; continue; } #endif #ifdef GL_SGIX_cube_map if (_glewStrSame3(&pos, &len, (const GLubyte*)"cube_map", 8)) { ret = GLEW_SGIX_cube_map; continue; } #endif #ifdef GL_SGIX_cylinder_texgen if (_glewStrSame3(&pos, &len, (const GLubyte*)"cylinder_texgen", 15)) { ret = GLEW_SGIX_cylinder_texgen; continue; } #endif #ifdef GL_SGIX_datapipe if (_glewStrSame3(&pos, &len, (const GLubyte*)"datapipe", 8)) { ret = GLEW_SGIX_datapipe; continue; } #endif #ifdef GL_SGIX_decimation if (_glewStrSame3(&pos, &len, (const GLubyte*)"decimation", 10)) { ret = GLEW_SGIX_decimation; continue; } #endif #ifdef GL_SGIX_depth_pass_instrument if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_pass_instrument", 21)) { ret = GLEW_SGIX_depth_pass_instrument; continue; } #endif #ifdef GL_SGIX_depth_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) { ret = GLEW_SGIX_depth_texture; continue; } #endif #ifdef GL_SGIX_dvc if (_glewStrSame3(&pos, &len, (const GLubyte*)"dvc", 3)) { ret = GLEW_SGIX_dvc; continue; } #endif #ifdef GL_SGIX_flush_raster if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_raster", 12)) { ret = GLEW_SGIX_flush_raster; continue; } #endif #ifdef GL_SGIX_fog_blend if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_blend", 9)) { ret = GLEW_SGIX_fog_blend; continue; } #endif #ifdef GL_SGIX_fog_factor_to_alpha if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_factor_to_alpha", 19)) { ret = GLEW_SGIX_fog_factor_to_alpha; continue; } #endif #ifdef GL_SGIX_fog_layers if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_layers", 10)) { ret = GLEW_SGIX_fog_layers; continue; } #endif #ifdef GL_SGIX_fog_offset if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_offset", 10)) { ret = GLEW_SGIX_fog_offset; continue; } #endif #ifdef GL_SGIX_fog_patchy if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_patchy", 10)) { ret = GLEW_SGIX_fog_patchy; continue; } #endif #ifdef GL_SGIX_fog_scale if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_scale", 9)) { ret = GLEW_SGIX_fog_scale; continue; } #endif #ifdef GL_SGIX_fog_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_texture", 11)) { ret = GLEW_SGIX_fog_texture; continue; } #endif #ifdef GL_SGIX_fragment_lighting_space if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting_space", 23)) { ret = GLEW_SGIX_fragment_lighting_space; continue; } #endif #ifdef GL_SGIX_fragment_specular_lighting if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_specular_lighting", 26)) { ret = GLEW_SGIX_fragment_specular_lighting; continue; } #endif #ifdef GL_SGIX_fragments_instrument if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragments_instrument", 20)) { ret = GLEW_SGIX_fragments_instrument; continue; } #endif #ifdef GL_SGIX_framezoom if (_glewStrSame3(&pos, &len, (const GLubyte*)"framezoom", 9)) { ret = GLEW_SGIX_framezoom; continue; } #endif #ifdef GL_SGIX_icc_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"icc_texture", 11)) { ret = GLEW_SGIX_icc_texture; continue; } #endif #ifdef GL_SGIX_igloo_interface if (_glewStrSame3(&pos, &len, (const GLubyte*)"igloo_interface", 15)) { ret = GLEW_SGIX_igloo_interface; continue; } #endif #ifdef GL_SGIX_image_compression if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_compression", 17)) { ret = GLEW_SGIX_image_compression; continue; } #endif #ifdef GL_SGIX_impact_pixel_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"impact_pixel_texture", 20)) { ret = GLEW_SGIX_impact_pixel_texture; continue; } #endif #ifdef GL_SGIX_instrument_error if (_glewStrSame3(&pos, &len, (const GLubyte*)"instrument_error", 16)) { ret = GLEW_SGIX_instrument_error; continue; } #endif #ifdef GL_SGIX_interlace if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) { ret = GLEW_SGIX_interlace; continue; } #endif #ifdef GL_SGIX_ir_instrument1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ir_instrument1", 14)) { ret = GLEW_SGIX_ir_instrument1; continue; } #endif #ifdef GL_SGIX_line_quality_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"line_quality_hint", 17)) { ret = GLEW_SGIX_line_quality_hint; continue; } #endif #ifdef GL_SGIX_list_priority if (_glewStrSame3(&pos, &len, (const GLubyte*)"list_priority", 13)) { ret = GLEW_SGIX_list_priority; continue; } #endif #ifdef GL_SGIX_mpeg1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"mpeg1", 5)) { ret = GLEW_SGIX_mpeg1; continue; } #endif #ifdef GL_SGIX_mpeg2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"mpeg2", 5)) { ret = GLEW_SGIX_mpeg2; continue; } #endif #ifdef GL_SGIX_nonlinear_lighting_pervertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"nonlinear_lighting_pervertex", 28)) { ret = GLEW_SGIX_nonlinear_lighting_pervertex; continue; } #endif #ifdef GL_SGIX_nurbs_eval if (_glewStrSame3(&pos, &len, (const GLubyte*)"nurbs_eval", 10)) { ret = GLEW_SGIX_nurbs_eval; continue; } #endif #ifdef GL_SGIX_occlusion_instrument if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_instrument", 20)) { ret = GLEW_SGIX_occlusion_instrument; continue; } #endif #ifdef GL_SGIX_packed_6bytes if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_6bytes", 13)) { ret = GLEW_SGIX_packed_6bytes; continue; } #endif #ifdef GL_SGIX_pixel_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) { ret = GLEW_SGIX_pixel_texture; continue; } #endif #ifdef GL_SGIX_pixel_texture_bits if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_bits", 18)) { ret = GLEW_SGIX_pixel_texture_bits; continue; } #endif #ifdef GL_SGIX_pixel_texture_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_lod", 17)) { ret = GLEW_SGIX_pixel_texture_lod; continue; } #endif #ifdef GL_SGIX_pixel_tiles if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_tiles", 11)) { ret = GLEW_SGIX_pixel_tiles; continue; } #endif #ifdef GL_SGIX_polynomial_ffd if (_glewStrSame3(&pos, &len, (const GLubyte*)"polynomial_ffd", 14)) { ret = GLEW_SGIX_polynomial_ffd; continue; } #endif #ifdef GL_SGIX_quad_mesh if (_glewStrSame3(&pos, &len, (const GLubyte*)"quad_mesh", 9)) { ret = GLEW_SGIX_quad_mesh; continue; } #endif #ifdef GL_SGIX_reference_plane if (_glewStrSame3(&pos, &len, (const GLubyte*)"reference_plane", 15)) { ret = GLEW_SGIX_reference_plane; continue; } #endif #ifdef GL_SGIX_resample if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) { ret = GLEW_SGIX_resample; continue; } #endif #ifdef GL_SGIX_scalebias_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"scalebias_hint", 14)) { ret = GLEW_SGIX_scalebias_hint; continue; } #endif #ifdef GL_SGIX_shadow if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) { ret = GLEW_SGIX_shadow; continue; } #endif #ifdef GL_SGIX_shadow_ambient if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) { ret = GLEW_SGIX_shadow_ambient; continue; } #endif #ifdef GL_SGIX_slim if (_glewStrSame3(&pos, &len, (const GLubyte*)"slim", 4)) { ret = GLEW_SGIX_slim; continue; } #endif #ifdef GL_SGIX_spotlight_cutoff if (_glewStrSame3(&pos, &len, (const GLubyte*)"spotlight_cutoff", 16)) { ret = GLEW_SGIX_spotlight_cutoff; continue; } #endif #ifdef GL_SGIX_sprite if (_glewStrSame3(&pos, &len, (const GLubyte*)"sprite", 6)) { ret = GLEW_SGIX_sprite; continue; } #endif #ifdef GL_SGIX_subdiv_patch if (_glewStrSame3(&pos, &len, (const GLubyte*)"subdiv_patch", 12)) { ret = GLEW_SGIX_subdiv_patch; continue; } #endif #ifdef GL_SGIX_subsample if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9)) { ret = GLEW_SGIX_subsample; continue; } #endif #ifdef GL_SGIX_tag_sample_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"tag_sample_buffer", 17)) { ret = GLEW_SGIX_tag_sample_buffer; continue; } #endif #ifdef GL_SGIX_texture_add_env if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_add_env", 15)) { ret = GLEW_SGIX_texture_add_env; continue; } #endif #ifdef GL_SGIX_texture_coordinate_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_coordinate_clamp", 24)) { ret = GLEW_SGIX_texture_coordinate_clamp; continue; } #endif #ifdef GL_SGIX_texture_lod_bias if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) { ret = GLEW_SGIX_texture_lod_bias; continue; } #endif #ifdef GL_SGIX_texture_mipmap_anisotropic if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mipmap_anisotropic", 26)) { ret = GLEW_SGIX_texture_mipmap_anisotropic; continue; } #endif #ifdef GL_SGIX_texture_multi_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multi_buffer", 20)) { ret = GLEW_SGIX_texture_multi_buffer; continue; } #endif #ifdef GL_SGIX_texture_phase if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_phase", 13)) { ret = GLEW_SGIX_texture_phase; continue; } #endif #ifdef GL_SGIX_texture_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) { ret = GLEW_SGIX_texture_range; continue; } #endif #ifdef GL_SGIX_texture_scale_bias if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scale_bias", 18)) { ret = GLEW_SGIX_texture_scale_bias; continue; } #endif #ifdef GL_SGIX_texture_supersample if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_supersample", 19)) { ret = GLEW_SGIX_texture_supersample; continue; } #endif #ifdef GL_SGIX_vector_ops if (_glewStrSame3(&pos, &len, (const GLubyte*)"vector_ops", 10)) { ret = GLEW_SGIX_vector_ops; continue; } #endif #ifdef GL_SGIX_vertex_array_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) { ret = GLEW_SGIX_vertex_array_object; continue; } #endif #ifdef GL_SGIX_vertex_preclip if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip", 14)) { ret = GLEW_SGIX_vertex_preclip; continue; } #endif #ifdef GL_SGIX_vertex_preclip_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip_hint", 19)) { ret = GLEW_SGIX_vertex_preclip_hint; continue; } #endif #ifdef GL_SGIX_ycrcb if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb", 5)) { ret = GLEW_SGIX_ycrcb; continue; } #endif #ifdef GL_SGIX_ycrcb_subsample if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb_subsample", 15)) { ret = GLEW_SGIX_ycrcb_subsample; continue; } #endif #ifdef GL_SGIX_ycrcba if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcba", 6)) { ret = GLEW_SGIX_ycrcba; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) { #ifdef GL_SGI_color_matrix if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix", 12)) { ret = GLEW_SGI_color_matrix; continue; } #endif #ifdef GL_SGI_color_table if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table", 11)) { ret = GLEW_SGI_color_table; continue; } #endif #ifdef GL_SGI_complex if (_glewStrSame3(&pos, &len, (const GLubyte*)"complex", 7)) { ret = GLEW_SGI_complex; continue; } #endif #ifdef GL_SGI_complex_type if (_glewStrSame3(&pos, &len, (const GLubyte*)"complex_type", 12)) { ret = GLEW_SGI_complex_type; continue; } #endif #ifdef GL_SGI_fft if (_glewStrSame3(&pos, &len, (const GLubyte*)"fft", 3)) { ret = GLEW_SGI_fft; continue; } #endif #ifdef GL_SGI_texture_color_table if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_color_table", 19)) { ret = GLEW_SGI_texture_color_table; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUNX_", 5)) { #ifdef GL_SUNX_constant_data if (_glewStrSame3(&pos, &len, (const GLubyte*)"constant_data", 13)) { ret = GLEW_SUNX_constant_data; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) { #ifdef GL_SUN_convolution_border_modes if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) { ret = GLEW_SUN_convolution_border_modes; continue; } #endif #ifdef GL_SUN_global_alpha if (_glewStrSame3(&pos, &len, (const GLubyte*)"global_alpha", 12)) { ret = GLEW_SUN_global_alpha; continue; } #endif #ifdef GL_SUN_mesh_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"mesh_array", 10)) { ret = GLEW_SUN_mesh_array; continue; } #endif #ifdef GL_SUN_read_video_pixels if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_video_pixels", 17)) { ret = GLEW_SUN_read_video_pixels; continue; } #endif #ifdef GL_SUN_slice_accum if (_glewStrSame3(&pos, &len, (const GLubyte*)"slice_accum", 11)) { ret = GLEW_SUN_slice_accum; continue; } #endif #ifdef GL_SUN_triangle_list if (_glewStrSame3(&pos, &len, (const GLubyte*)"triangle_list", 13)) { ret = GLEW_SUN_triangle_list; continue; } #endif #ifdef GL_SUN_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex", 6)) { ret = GLEW_SUN_vertex; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"WIN_", 4)) { #ifdef GL_WIN_phong_shading if (_glewStrSame3(&pos, &len, (const GLubyte*)"phong_shading", 13)) { ret = GLEW_WIN_phong_shading; continue; } #endif #ifdef GL_WIN_scene_markerXXX if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_markerXXX", 15)) { ret = GLEW_WIN_scene_markerXXX; continue; } #endif #ifdef GL_WIN_specular_fog if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_fog", 12)) { ret = GLEW_WIN_specular_fog; continue; } #endif #ifdef GL_WIN_swap_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_hint", 9)) { ret = GLEW_WIN_swap_hint; continue; } #endif } } ret = (len == 0); } return ret; } #if defined(_WIN32) && !defined(GLEW_EGL) && !defined(GLEW_OSMESA) GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) { const GLubyte* pos = (const GLubyte*)name; GLuint len = _glewStrLen(pos); GLboolean ret = GL_TRUE; while (ret && len > 0) { if (_glewStrSame1(&pos, &len, (const GLubyte*)"WGL_", 4)) { if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) { #ifdef WGL_3DFX_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = WGLEW_3DFX_multisample; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DL_", 4)) { #ifdef WGL_3DL_stereo_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_control", 14)) { ret = WGLEW_3DL_stereo_control; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) { #ifdef WGL_AMD_gpu_association if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) { ret = WGLEW_AMD_gpu_association; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) { #ifdef WGL_ARB_buffer_region if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) { ret = WGLEW_ARB_buffer_region; continue; } #endif #ifdef WGL_ARB_context_flush_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) { ret = WGLEW_ARB_context_flush_control; continue; } #endif #ifdef WGL_ARB_create_context if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) { ret = WGLEW_ARB_create_context; continue; } #endif #ifdef WGL_ARB_create_context_no_error if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_no_error", 23)) { ret = WGLEW_ARB_create_context_no_error; continue; } #endif #ifdef WGL_ARB_create_context_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) { ret = WGLEW_ARB_create_context_profile; continue; } #endif #ifdef WGL_ARB_create_context_robustness if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) { ret = WGLEW_ARB_create_context_robustness; continue; } #endif #ifdef WGL_ARB_extensions_string if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) { ret = WGLEW_ARB_extensions_string; continue; } #endif #ifdef WGL_ARB_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = WGLEW_ARB_framebuffer_sRGB; continue; } #endif #ifdef WGL_ARB_make_current_read if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) { ret = WGLEW_ARB_make_current_read; continue; } #endif #ifdef WGL_ARB_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = WGLEW_ARB_multisample; continue; } #endif #ifdef WGL_ARB_pbuffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) { ret = WGLEW_ARB_pbuffer; continue; } #endif #ifdef WGL_ARB_pixel_format if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) { ret = WGLEW_ARB_pixel_format; continue; } #endif #ifdef WGL_ARB_pixel_format_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) { ret = WGLEW_ARB_pixel_format_float; continue; } #endif #ifdef WGL_ARB_render_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) { ret = WGLEW_ARB_render_texture; continue; } #endif #ifdef WGL_ARB_robustness_application_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) { ret = WGLEW_ARB_robustness_application_isolation; continue; } #endif #ifdef WGL_ARB_robustness_share_group_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) { ret = WGLEW_ARB_robustness_share_group_isolation; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) { #ifdef WGL_ATI_pixel_format_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) { ret = WGLEW_ATI_pixel_format_float; continue; } #endif #ifdef WGL_ATI_render_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) { ret = WGLEW_ATI_render_texture_rectangle; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) { #ifdef WGL_EXT_colorspace if (_glewStrSame3(&pos, &len, (const GLubyte*)"colorspace", 10)) { ret = WGLEW_EXT_colorspace; continue; } #endif #ifdef WGL_EXT_create_context_es2_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) { ret = WGLEW_EXT_create_context_es2_profile; continue; } #endif #ifdef WGL_EXT_create_context_es_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) { ret = WGLEW_EXT_create_context_es_profile; continue; } #endif #ifdef WGL_EXT_depth_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_float", 11)) { ret = WGLEW_EXT_depth_float; continue; } #endif #ifdef WGL_EXT_display_color_table if (_glewStrSame3(&pos, &len, (const GLubyte*)"display_color_table", 19)) { ret = WGLEW_EXT_display_color_table; continue; } #endif #ifdef WGL_EXT_extensions_string if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) { ret = WGLEW_EXT_extensions_string; continue; } #endif #ifdef WGL_EXT_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = WGLEW_EXT_framebuffer_sRGB; continue; } #endif #ifdef WGL_EXT_make_current_read if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) { ret = WGLEW_EXT_make_current_read; continue; } #endif #ifdef WGL_EXT_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = WGLEW_EXT_multisample; continue; } #endif #ifdef WGL_EXT_pbuffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) { ret = WGLEW_EXT_pbuffer; continue; } #endif #ifdef WGL_EXT_pixel_format if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) { ret = WGLEW_EXT_pixel_format; continue; } #endif #ifdef WGL_EXT_pixel_format_packed_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_packed_float", 25)) { ret = WGLEW_EXT_pixel_format_packed_float; continue; } #endif #ifdef WGL_EXT_swap_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) { ret = WGLEW_EXT_swap_control; continue; } #endif #ifdef WGL_EXT_swap_control_tear if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) { ret = WGLEW_EXT_swap_control_tear; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"I3D_", 4)) { #ifdef WGL_I3D_digital_video_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"digital_video_control", 21)) { ret = WGLEW_I3D_digital_video_control; continue; } #endif #ifdef WGL_I3D_gamma if (_glewStrSame3(&pos, &len, (const GLubyte*)"gamma", 5)) { ret = WGLEW_I3D_gamma; continue; } #endif #ifdef WGL_I3D_genlock if (_glewStrSame3(&pos, &len, (const GLubyte*)"genlock", 7)) { ret = WGLEW_I3D_genlock; continue; } #endif #ifdef WGL_I3D_image_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_buffer", 12)) { ret = WGLEW_I3D_image_buffer; continue; } #endif #ifdef WGL_I3D_swap_frame_lock if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_lock", 15)) { ret = WGLEW_I3D_swap_frame_lock; continue; } #endif #ifdef WGL_I3D_swap_frame_usage if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_usage", 16)) { ret = WGLEW_I3D_swap_frame_usage; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) { #ifdef WGL_NV_DX_interop if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop", 10)) { ret = WGLEW_NV_DX_interop; continue; } #endif #ifdef WGL_NV_DX_interop2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop2", 11)) { ret = WGLEW_NV_DX_interop2; continue; } #endif #ifdef WGL_NV_copy_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) { ret = WGLEW_NV_copy_image; continue; } #endif #ifdef WGL_NV_delay_before_swap if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17)) { ret = WGLEW_NV_delay_before_swap; continue; } #endif #ifdef WGL_NV_float_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) { ret = WGLEW_NV_float_buffer; continue; } #endif #ifdef WGL_NV_gpu_affinity if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_affinity", 12)) { ret = WGLEW_NV_gpu_affinity; continue; } #endif #ifdef WGL_NV_multisample_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) { ret = WGLEW_NV_multisample_coverage; continue; } #endif #ifdef WGL_NV_present_video if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) { ret = WGLEW_NV_present_video; continue; } #endif #ifdef WGL_NV_render_depth_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_depth_texture", 20)) { ret = WGLEW_NV_render_depth_texture; continue; } #endif #ifdef WGL_NV_render_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) { ret = WGLEW_NV_render_texture_rectangle; continue; } #endif #ifdef WGL_NV_swap_group if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) { ret = WGLEW_NV_swap_group; continue; } #endif #ifdef WGL_NV_vertex_array_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) { ret = WGLEW_NV_vertex_array_range; continue; } #endif #ifdef WGL_NV_video_capture if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) { ret = WGLEW_NV_video_capture; continue; } #endif #ifdef WGL_NV_video_output if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_output", 12)) { ret = WGLEW_NV_video_output; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) { #ifdef WGL_OML_sync_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) { ret = WGLEW_OML_sync_control; continue; } #endif } } ret = (len == 0); } return ret; } #elif !defined(GLEW_OSMESA) && !defined(GLEW_EGL) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) GLboolean glxewIsSupported (const char* name) { const GLubyte* pos = (const GLubyte*)name; GLuint len = _glewStrLen(pos); GLboolean ret = GL_TRUE; while (ret && len > 0) { if(_glewStrSame1(&pos, &len, (const GLubyte*)"GLX_", 4)) { if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) { #ifdef GLX_VERSION_1_2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) { ret = GLXEW_VERSION_1_2; continue; } #endif #ifdef GLX_VERSION_1_3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) { ret = GLXEW_VERSION_1_3; continue; } #endif #ifdef GLX_VERSION_1_4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) { ret = GLXEW_VERSION_1_4; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) { #ifdef GLX_3DFX_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLXEW_3DFX_multisample; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) { #ifdef GLX_AMD_gpu_association if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) { ret = GLXEW_AMD_gpu_association; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) { #ifdef GLX_ARB_context_flush_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) { ret = GLXEW_ARB_context_flush_control; continue; } #endif #ifdef GLX_ARB_create_context if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) { ret = GLXEW_ARB_create_context; continue; } #endif #ifdef GLX_ARB_create_context_no_error if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_no_error", 23)) { ret = GLXEW_ARB_create_context_no_error; continue; } #endif #ifdef GLX_ARB_create_context_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) { ret = GLXEW_ARB_create_context_profile; continue; } #endif #ifdef GLX_ARB_create_context_robustness if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) { ret = GLXEW_ARB_create_context_robustness; continue; } #endif #ifdef GLX_ARB_fbconfig_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_float", 14)) { ret = GLXEW_ARB_fbconfig_float; continue; } #endif #ifdef GLX_ARB_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = GLXEW_ARB_framebuffer_sRGB; continue; } #endif #ifdef GLX_ARB_get_proc_address if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_proc_address", 16)) { ret = GLXEW_ARB_get_proc_address; continue; } #endif #ifdef GLX_ARB_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLXEW_ARB_multisample; continue; } #endif #ifdef GLX_ARB_robustness_application_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) { ret = GLXEW_ARB_robustness_application_isolation; continue; } #endif #ifdef GLX_ARB_robustness_share_group_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) { ret = GLXEW_ARB_robustness_share_group_isolation; continue; } #endif #ifdef GLX_ARB_vertex_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) { ret = GLXEW_ARB_vertex_buffer_object; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) { #ifdef GLX_ATI_pixel_format_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) { ret = GLXEW_ATI_pixel_format_float; continue; } #endif #ifdef GLX_ATI_render_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) { ret = GLXEW_ATI_render_texture; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) { #ifdef GLX_EXT_buffer_age if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_age", 10)) { ret = GLXEW_EXT_buffer_age; continue; } #endif #ifdef GLX_EXT_create_context_es2_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) { ret = GLXEW_EXT_create_context_es2_profile; continue; } #endif #ifdef GLX_EXT_create_context_es_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) { ret = GLXEW_EXT_create_context_es_profile; continue; } #endif #ifdef GLX_EXT_fbconfig_packed_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_packed_float", 21)) { ret = GLXEW_EXT_fbconfig_packed_float; continue; } #endif #ifdef GLX_EXT_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = GLXEW_EXT_framebuffer_sRGB; continue; } #endif #ifdef GLX_EXT_import_context if (_glewStrSame3(&pos, &len, (const GLubyte*)"import_context", 14)) { ret = GLXEW_EXT_import_context; continue; } #endif #ifdef GLX_EXT_libglvnd if (_glewStrSame3(&pos, &len, (const GLubyte*)"libglvnd", 8)) { ret = GLXEW_EXT_libglvnd; continue; } #endif #ifdef GLX_EXT_scene_marker if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) { ret = GLXEW_EXT_scene_marker; continue; } #endif #ifdef GLX_EXT_stereo_tree if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_tree", 11)) { ret = GLXEW_EXT_stereo_tree; continue; } #endif #ifdef GLX_EXT_swap_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) { ret = GLXEW_EXT_swap_control; continue; } #endif #ifdef GLX_EXT_swap_control_tear if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) { ret = GLXEW_EXT_swap_control_tear; continue; } #endif #ifdef GLX_EXT_texture_from_pixmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19)) { ret = GLXEW_EXT_texture_from_pixmap; continue; } #endif #ifdef GLX_EXT_visual_info if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_info", 11)) { ret = GLXEW_EXT_visual_info; continue; } #endif #ifdef GLX_EXT_visual_rating if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_rating", 13)) { ret = GLXEW_EXT_visual_rating; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) { #ifdef GLX_INTEL_swap_event if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_event", 10)) { ret = GLXEW_INTEL_swap_event; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) { #ifdef GLX_MESA_agp_offset if (_glewStrSame3(&pos, &len, (const GLubyte*)"agp_offset", 10)) { ret = GLXEW_MESA_agp_offset; continue; } #endif #ifdef GLX_MESA_copy_sub_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_sub_buffer", 15)) { ret = GLXEW_MESA_copy_sub_buffer; continue; } #endif #ifdef GLX_MESA_pixmap_colormap if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_colormap", 15)) { ret = GLXEW_MESA_pixmap_colormap; continue; } #endif #ifdef GLX_MESA_query_renderer if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_renderer", 14)) { ret = GLXEW_MESA_query_renderer; continue; } #endif #ifdef GLX_MESA_release_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"release_buffers", 15)) { ret = GLXEW_MESA_release_buffers; continue; } #endif #ifdef GLX_MESA_set_3dfx_mode if (_glewStrSame3(&pos, &len, (const GLubyte*)"set_3dfx_mode", 13)) { ret = GLXEW_MESA_set_3dfx_mode; continue; } #endif #ifdef GLX_MESA_swap_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) { ret = GLXEW_MESA_swap_control; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) { #ifdef GLX_NV_copy_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) { ret = GLXEW_NV_copy_buffer; continue; } #endif #ifdef GLX_NV_copy_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) { ret = GLXEW_NV_copy_image; continue; } #endif #ifdef GLX_NV_delay_before_swap if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17)) { ret = GLXEW_NV_delay_before_swap; continue; } #endif #ifdef GLX_NV_float_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) { ret = GLXEW_NV_float_buffer; continue; } #endif #ifdef GLX_NV_multisample_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) { ret = GLXEW_NV_multisample_coverage; continue; } #endif #ifdef GLX_NV_present_video if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) { ret = GLXEW_NV_present_video; continue; } #endif #ifdef GLX_NV_robustness_video_memory_purge if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_video_memory_purge", 29)) { ret = GLXEW_NV_robustness_video_memory_purge; continue; } #endif #ifdef GLX_NV_swap_group if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) { ret = GLXEW_NV_swap_group; continue; } #endif #ifdef GLX_NV_vertex_array_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) { ret = GLXEW_NV_vertex_array_range; continue; } #endif #ifdef GLX_NV_video_capture if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) { ret = GLXEW_NV_video_capture; continue; } #endif #ifdef GLX_NV_video_out if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_out", 9)) { ret = GLXEW_NV_video_out; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) { #ifdef GLX_OML_swap_method if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_method", 11)) { ret = GLXEW_OML_swap_method; continue; } #endif #ifdef GLX_OML_sync_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) { ret = GLXEW_OML_sync_control; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) { #ifdef GLX_SGIS_blended_overlay if (_glewStrSame3(&pos, &len, (const GLubyte*)"blended_overlay", 15)) { ret = GLXEW_SGIS_blended_overlay; continue; } #endif #ifdef GLX_SGIS_color_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) { ret = GLXEW_SGIS_color_range; continue; } #endif #ifdef GLX_SGIS_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLXEW_SGIS_multisample; continue; } #endif #ifdef GLX_SGIS_shared_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18)) { ret = GLXEW_SGIS_shared_multisample; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) { #ifdef GLX_SGIX_fbconfig if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig", 8)) { ret = GLXEW_SGIX_fbconfig; continue; } #endif #ifdef GLX_SGIX_hyperpipe if (_glewStrSame3(&pos, &len, (const GLubyte*)"hyperpipe", 9)) { ret = GLXEW_SGIX_hyperpipe; continue; } #endif #ifdef GLX_SGIX_pbuffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) { ret = GLXEW_SGIX_pbuffer; continue; } #endif #ifdef GLX_SGIX_swap_barrier if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_barrier", 12)) { ret = GLXEW_SGIX_swap_barrier; continue; } #endif #ifdef GLX_SGIX_swap_group if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) { ret = GLXEW_SGIX_swap_group; continue; } #endif #ifdef GLX_SGIX_video_resize if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) { ret = GLXEW_SGIX_video_resize; continue; } #endif #ifdef GLX_SGIX_visual_select_group if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_select_group", 19)) { ret = GLXEW_SGIX_visual_select_group; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) { #ifdef GLX_SGI_cushion if (_glewStrSame3(&pos, &len, (const GLubyte*)"cushion", 7)) { ret = GLXEW_SGI_cushion; continue; } #endif #ifdef GLX_SGI_make_current_read if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) { ret = GLXEW_SGI_make_current_read; continue; } #endif #ifdef GLX_SGI_swap_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) { ret = GLXEW_SGI_swap_control; continue; } #endif #ifdef GLX_SGI_video_sync if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_sync", 10)) { ret = GLXEW_SGI_video_sync; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) { #ifdef GLX_SUN_get_transparent_index if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_transparent_index", 21)) { ret = GLXEW_SUN_get_transparent_index; continue; } #endif #ifdef GLX_SUN_video_resize if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) { ret = GLXEW_SUN_video_resize; continue; } #endif } } ret = (len == 0); } return ret; } #elif defined(GLEW_EGL) GLboolean eglewIsSupported (const char* name) { const GLubyte* pos = (const GLubyte*)name; GLuint len = _glewStrLen(pos); GLboolean ret = GL_TRUE; while (ret && len > 0) { if(_glewStrSame1(&pos, &len, (const GLubyte*)"EGL_", 4)) { if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) { #ifdef EGL_VERSION_1_0 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_0", 3)) { ret = EGLEW_VERSION_1_0; continue; } #endif #ifdef EGL_VERSION_1_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_1", 3)) { ret = EGLEW_VERSION_1_1; continue; } #endif #ifdef EGL_VERSION_1_2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) { ret = EGLEW_VERSION_1_2; continue; } #endif #ifdef EGL_VERSION_1_3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) { ret = EGLEW_VERSION_1_3; continue; } #endif #ifdef EGL_VERSION_1_4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) { ret = EGLEW_VERSION_1_4; continue; } #endif #ifdef EGL_VERSION_1_5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3)) { ret = EGLEW_VERSION_1_5; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANDROID_", 8)) { #ifdef EGL_ANDROID_blob_cache if (_glewStrSame3(&pos, &len, (const GLubyte*)"blob_cache", 10)) { ret = EGLEW_ANDROID_blob_cache; continue; } #endif #ifdef EGL_ANDROID_create_native_client_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_native_client_buffer", 27)) { ret = EGLEW_ANDROID_create_native_client_buffer; continue; } #endif #ifdef EGL_ANDROID_framebuffer_target if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_target", 18)) { ret = EGLEW_ANDROID_framebuffer_target; continue; } #endif #ifdef EGL_ANDROID_front_buffer_auto_refresh if (_glewStrSame3(&pos, &len, (const GLubyte*)"front_buffer_auto_refresh", 25)) { ret = EGLEW_ANDROID_front_buffer_auto_refresh; continue; } #endif #ifdef EGL_ANDROID_image_native_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_native_buffer", 19)) { ret = EGLEW_ANDROID_image_native_buffer; continue; } #endif #ifdef EGL_ANDROID_native_fence_sync if (_glewStrSame3(&pos, &len, (const GLubyte*)"native_fence_sync", 17)) { ret = EGLEW_ANDROID_native_fence_sync; continue; } #endif #ifdef EGL_ANDROID_presentation_time if (_glewStrSame3(&pos, &len, (const GLubyte*)"presentation_time", 17)) { ret = EGLEW_ANDROID_presentation_time; continue; } #endif #ifdef EGL_ANDROID_recordable if (_glewStrSame3(&pos, &len, (const GLubyte*)"recordable", 10)) { ret = EGLEW_ANDROID_recordable; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANGLE_", 6)) { #ifdef EGL_ANGLE_d3d_share_handle_client_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"d3d_share_handle_client_buffer", 30)) { ret = EGLEW_ANGLE_d3d_share_handle_client_buffer; continue; } #endif #ifdef EGL_ANGLE_device_d3d if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_d3d", 10)) { ret = EGLEW_ANGLE_device_d3d; continue; } #endif #ifdef EGL_ANGLE_query_surface_pointer if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_surface_pointer", 21)) { ret = EGLEW_ANGLE_query_surface_pointer; continue; } #endif #ifdef EGL_ANGLE_surface_d3d_texture_2d_share_handle if (_glewStrSame3(&pos, &len, (const GLubyte*)"surface_d3d_texture_2d_share_handle", 35)) { ret = EGLEW_ANGLE_surface_d3d_texture_2d_share_handle; continue; } #endif #ifdef EGL_ANGLE_window_fixed_size if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_fixed_size", 17)) { ret = EGLEW_ANGLE_window_fixed_size; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARM_", 4)) { #ifdef EGL_ARM_implicit_external_sync if (_glewStrSame3(&pos, &len, (const GLubyte*)"implicit_external_sync", 22)) { ret = EGLEW_ARM_implicit_external_sync; continue; } #endif #ifdef EGL_ARM_pixmap_multisample_discard if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_multisample_discard", 26)) { ret = EGLEW_ARM_pixmap_multisample_discard; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) { #ifdef EGL_EXT_buffer_age if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_age", 10)) { ret = EGLEW_EXT_buffer_age; continue; } #endif #ifdef EGL_EXT_client_extensions if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_extensions", 17)) { ret = EGLEW_EXT_client_extensions; continue; } #endif #ifdef EGL_EXT_create_context_robustness if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) { ret = EGLEW_EXT_create_context_robustness; continue; } #endif #ifdef EGL_EXT_device_base if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_base", 11)) { ret = EGLEW_EXT_device_base; continue; } #endif #ifdef EGL_EXT_device_drm if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_drm", 10)) { ret = EGLEW_EXT_device_drm; continue; } #endif #ifdef EGL_EXT_device_enumeration if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_enumeration", 18)) { ret = EGLEW_EXT_device_enumeration; continue; } #endif #ifdef EGL_EXT_device_openwf if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_openwf", 13)) { ret = EGLEW_EXT_device_openwf; continue; } #endif #ifdef EGL_EXT_device_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_query", 12)) { ret = EGLEW_EXT_device_query; continue; } #endif #ifdef EGL_EXT_gl_colorspace_bt2020_linear if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_bt2020_linear", 27)) { ret = EGLEW_EXT_gl_colorspace_bt2020_linear; continue; } #endif #ifdef EGL_EXT_gl_colorspace_bt2020_pq if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_bt2020_pq", 23)) { ret = EGLEW_EXT_gl_colorspace_bt2020_pq; continue; } #endif #ifdef EGL_EXT_gl_colorspace_scrgb_linear if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_scrgb_linear", 26)) { ret = EGLEW_EXT_gl_colorspace_scrgb_linear; continue; } #endif #ifdef EGL_EXT_image_dma_buf_import if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_dma_buf_import", 20)) { ret = EGLEW_EXT_image_dma_buf_import; continue; } #endif #ifdef EGL_EXT_image_dma_buf_import_modifiers if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_dma_buf_import_modifiers", 30)) { ret = EGLEW_EXT_image_dma_buf_import_modifiers; continue; } #endif #ifdef EGL_EXT_multiview_window if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_window", 16)) { ret = EGLEW_EXT_multiview_window; continue; } #endif #ifdef EGL_EXT_output_base if (_glewStrSame3(&pos, &len, (const GLubyte*)"output_base", 11)) { ret = EGLEW_EXT_output_base; continue; } #endif #ifdef EGL_EXT_output_drm if (_glewStrSame3(&pos, &len, (const GLubyte*)"output_drm", 10)) { ret = EGLEW_EXT_output_drm; continue; } #endif #ifdef EGL_EXT_output_openwf if (_glewStrSame3(&pos, &len, (const GLubyte*)"output_openwf", 13)) { ret = EGLEW_EXT_output_openwf; continue; } #endif #ifdef EGL_EXT_pixel_format_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) { ret = EGLEW_EXT_pixel_format_float; continue; } #endif #ifdef EGL_EXT_platform_base if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_base", 13)) { ret = EGLEW_EXT_platform_base; continue; } #endif #ifdef EGL_EXT_platform_device if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_device", 15)) { ret = EGLEW_EXT_platform_device; continue; } #endif #ifdef EGL_EXT_platform_wayland if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_wayland", 16)) { ret = EGLEW_EXT_platform_wayland; continue; } #endif #ifdef EGL_EXT_platform_x11 if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_x11", 12)) { ret = EGLEW_EXT_platform_x11; continue; } #endif #ifdef EGL_EXT_protected_content if (_glewStrSame3(&pos, &len, (const GLubyte*)"protected_content", 17)) { ret = EGLEW_EXT_protected_content; continue; } #endif #ifdef EGL_EXT_protected_surface if (_glewStrSame3(&pos, &len, (const GLubyte*)"protected_surface", 17)) { ret = EGLEW_EXT_protected_surface; continue; } #endif #ifdef EGL_EXT_stream_consumer_egloutput if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_consumer_egloutput", 25)) { ret = EGLEW_EXT_stream_consumer_egloutput; continue; } #endif #ifdef EGL_EXT_surface_SMPTE2086_metadata if (_glewStrSame3(&pos, &len, (const GLubyte*)"surface_SMPTE2086_metadata", 26)) { ret = EGLEW_EXT_surface_SMPTE2086_metadata; continue; } #endif #ifdef EGL_EXT_swap_buffers_with_damage if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_buffers_with_damage", 24)) { ret = EGLEW_EXT_swap_buffers_with_damage; continue; } #endif #ifdef EGL_EXT_yuv_surface if (_glewStrSame3(&pos, &len, (const GLubyte*)"yuv_surface", 11)) { ret = EGLEW_EXT_yuv_surface; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"HI_", 3)) { #ifdef EGL_HI_clientpixmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"clientpixmap", 12)) { ret = EGLEW_HI_clientpixmap; continue; } #endif #ifdef EGL_HI_colorformats if (_glewStrSame3(&pos, &len, (const GLubyte*)"colorformats", 12)) { ret = EGLEW_HI_colorformats; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"IMG_", 4)) { #ifdef EGL_IMG_context_priority if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_priority", 16)) { ret = EGLEW_IMG_context_priority; continue; } #endif #ifdef EGL_IMG_image_plane_attribs if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_plane_attribs", 19)) { ret = EGLEW_IMG_image_plane_attribs; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"KHR_", 4)) { #ifdef EGL_KHR_cl_event if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8)) { ret = EGLEW_KHR_cl_event; continue; } #endif #ifdef EGL_KHR_cl_event2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event2", 9)) { ret = EGLEW_KHR_cl_event2; continue; } #endif #ifdef EGL_KHR_client_get_all_proc_addresses if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_get_all_proc_addresses", 29)) { ret = EGLEW_KHR_client_get_all_proc_addresses; continue; } #endif #ifdef EGL_KHR_config_attribs if (_glewStrSame3(&pos, &len, (const GLubyte*)"config_attribs", 14)) { ret = EGLEW_KHR_config_attribs; continue; } #endif #ifdef EGL_KHR_context_flush_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) { ret = EGLEW_KHR_context_flush_control; continue; } #endif #ifdef EGL_KHR_create_context if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) { ret = EGLEW_KHR_create_context; continue; } #endif #ifdef EGL_KHR_create_context_no_error if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_no_error", 23)) { ret = EGLEW_KHR_create_context_no_error; continue; } #endif #ifdef EGL_KHR_debug if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug", 5)) { ret = EGLEW_KHR_debug; continue; } #endif #ifdef EGL_KHR_fence_sync if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence_sync", 10)) { ret = EGLEW_KHR_fence_sync; continue; } #endif #ifdef EGL_KHR_get_all_proc_addresses if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_all_proc_addresses", 22)) { ret = EGLEW_KHR_get_all_proc_addresses; continue; } #endif #ifdef EGL_KHR_gl_colorspace if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace", 13)) { ret = EGLEW_KHR_gl_colorspace; continue; } #endif #ifdef EGL_KHR_gl_renderbuffer_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_renderbuffer_image", 21)) { ret = EGLEW_KHR_gl_renderbuffer_image; continue; } #endif #ifdef EGL_KHR_gl_texture_2D_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_texture_2D_image", 19)) { ret = EGLEW_KHR_gl_texture_2D_image; continue; } #endif #ifdef EGL_KHR_gl_texture_3D_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_texture_3D_image", 19)) { ret = EGLEW_KHR_gl_texture_3D_image; continue; } #endif #ifdef EGL_KHR_gl_texture_cubemap_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_texture_cubemap_image", 24)) { ret = EGLEW_KHR_gl_texture_cubemap_image; continue; } #endif #ifdef EGL_KHR_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"image", 5)) { ret = EGLEW_KHR_image; continue; } #endif #ifdef EGL_KHR_image_base if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_base", 10)) { ret = EGLEW_KHR_image_base; continue; } #endif #ifdef EGL_KHR_image_pixmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_pixmap", 12)) { ret = EGLEW_KHR_image_pixmap; continue; } #endif #ifdef EGL_KHR_lock_surface if (_glewStrSame3(&pos, &len, (const GLubyte*)"lock_surface", 12)) { ret = EGLEW_KHR_lock_surface; continue; } #endif #ifdef EGL_KHR_lock_surface2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"lock_surface2", 13)) { ret = EGLEW_KHR_lock_surface2; continue; } #endif #ifdef EGL_KHR_lock_surface3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"lock_surface3", 13)) { ret = EGLEW_KHR_lock_surface3; continue; } #endif #ifdef EGL_KHR_mutable_render_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"mutable_render_buffer", 21)) { ret = EGLEW_KHR_mutable_render_buffer; continue; } #endif #ifdef EGL_KHR_no_config_context if (_glewStrSame3(&pos, &len, (const GLubyte*)"no_config_context", 17)) { ret = EGLEW_KHR_no_config_context; continue; } #endif #ifdef EGL_KHR_partial_update if (_glewStrSame3(&pos, &len, (const GLubyte*)"partial_update", 14)) { ret = EGLEW_KHR_partial_update; continue; } #endif #ifdef EGL_KHR_platform_android if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_android", 16)) { ret = EGLEW_KHR_platform_android; continue; } #endif #ifdef EGL_KHR_platform_gbm if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_gbm", 12)) { ret = EGLEW_KHR_platform_gbm; continue; } #endif #ifdef EGL_KHR_platform_wayland if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_wayland", 16)) { ret = EGLEW_KHR_platform_wayland; continue; } #endif #ifdef EGL_KHR_platform_x11 if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_x11", 12)) { ret = EGLEW_KHR_platform_x11; continue; } #endif #ifdef EGL_KHR_reusable_sync if (_glewStrSame3(&pos, &len, (const GLubyte*)"reusable_sync", 13)) { ret = EGLEW_KHR_reusable_sync; continue; } #endif #ifdef EGL_KHR_stream if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream", 6)) { ret = EGLEW_KHR_stream; continue; } #endif #ifdef EGL_KHR_stream_attrib if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_attrib", 13)) { ret = EGLEW_KHR_stream_attrib; continue; } #endif #ifdef EGL_KHR_stream_consumer_gltexture if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_consumer_gltexture", 25)) { ret = EGLEW_KHR_stream_consumer_gltexture; continue; } #endif #ifdef EGL_KHR_stream_cross_process_fd if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_process_fd", 23)) { ret = EGLEW_KHR_stream_cross_process_fd; continue; } #endif #ifdef EGL_KHR_stream_fifo if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_fifo", 11)) { ret = EGLEW_KHR_stream_fifo; continue; } #endif #ifdef EGL_KHR_stream_producer_aldatalocator if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_producer_aldatalocator", 29)) { ret = EGLEW_KHR_stream_producer_aldatalocator; continue; } #endif #ifdef EGL_KHR_stream_producer_eglsurface if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_producer_eglsurface", 26)) { ret = EGLEW_KHR_stream_producer_eglsurface; continue; } #endif #ifdef EGL_KHR_surfaceless_context if (_glewStrSame3(&pos, &len, (const GLubyte*)"surfaceless_context", 19)) { ret = EGLEW_KHR_surfaceless_context; continue; } #endif #ifdef EGL_KHR_swap_buffers_with_damage if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_buffers_with_damage", 24)) { ret = EGLEW_KHR_swap_buffers_with_damage; continue; } #endif #ifdef EGL_KHR_vg_parent_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"vg_parent_image", 15)) { ret = EGLEW_KHR_vg_parent_image; continue; } #endif #ifdef EGL_KHR_wait_sync if (_glewStrSame3(&pos, &len, (const GLubyte*)"wait_sync", 9)) { ret = EGLEW_KHR_wait_sync; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) { #ifdef EGL_MESA_drm_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"drm_image", 9)) { ret = EGLEW_MESA_drm_image; continue; } #endif #ifdef EGL_MESA_image_dma_buf_export if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_dma_buf_export", 20)) { ret = EGLEW_MESA_image_dma_buf_export; continue; } #endif #ifdef EGL_MESA_platform_gbm if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_gbm", 12)) { ret = EGLEW_MESA_platform_gbm; continue; } #endif #ifdef EGL_MESA_platform_surfaceless if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_surfaceless", 20)) { ret = EGLEW_MESA_platform_surfaceless; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NOK_", 4)) { #ifdef EGL_NOK_swap_region if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_region", 11)) { ret = EGLEW_NOK_swap_region; continue; } #endif #ifdef EGL_NOK_swap_region2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_region2", 12)) { ret = EGLEW_NOK_swap_region2; continue; } #endif #ifdef EGL_NOK_texture_from_pixmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19)) { ret = EGLEW_NOK_texture_from_pixmap; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) { #ifdef EGL_NV_3dvision_surface if (_glewStrSame3(&pos, &len, (const GLubyte*)"3dvision_surface", 16)) { ret = EGLEW_NV_3dvision_surface; continue; } #endif #ifdef EGL_NV_coverage_sample if (_glewStrSame3(&pos, &len, (const GLubyte*)"coverage_sample", 15)) { ret = EGLEW_NV_coverage_sample; continue; } #endif #ifdef EGL_NV_coverage_sample_resolve if (_glewStrSame3(&pos, &len, (const GLubyte*)"coverage_sample_resolve", 23)) { ret = EGLEW_NV_coverage_sample_resolve; continue; } #endif #ifdef EGL_NV_cuda_event if (_glewStrSame3(&pos, &len, (const GLubyte*)"cuda_event", 10)) { ret = EGLEW_NV_cuda_event; continue; } #endif #ifdef EGL_NV_depth_nonlinear if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_nonlinear", 15)) { ret = EGLEW_NV_depth_nonlinear; continue; } #endif #ifdef EGL_NV_device_cuda if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_cuda", 11)) { ret = EGLEW_NV_device_cuda; continue; } #endif #ifdef EGL_NV_native_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"native_query", 12)) { ret = EGLEW_NV_native_query; continue; } #endif #ifdef EGL_NV_post_convert_rounding if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_convert_rounding", 21)) { ret = EGLEW_NV_post_convert_rounding; continue; } #endif #ifdef EGL_NV_post_sub_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_sub_buffer", 15)) { ret = EGLEW_NV_post_sub_buffer; continue; } #endif #ifdef EGL_NV_robustness_video_memory_purge if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_video_memory_purge", 29)) { ret = EGLEW_NV_robustness_video_memory_purge; continue; } #endif #ifdef EGL_NV_stream_consumer_gltexture_yuv if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_consumer_gltexture_yuv", 29)) { ret = EGLEW_NV_stream_consumer_gltexture_yuv; continue; } #endif #ifdef EGL_NV_stream_cross_display if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_display", 20)) { ret = EGLEW_NV_stream_cross_display; continue; } #endif #ifdef EGL_NV_stream_cross_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_object", 19)) { ret = EGLEW_NV_stream_cross_object; continue; } #endif #ifdef EGL_NV_stream_cross_partition if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_partition", 22)) { ret = EGLEW_NV_stream_cross_partition; continue; } #endif #ifdef EGL_NV_stream_cross_process if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_process", 20)) { ret = EGLEW_NV_stream_cross_process; continue; } #endif #ifdef EGL_NV_stream_cross_system if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_system", 19)) { ret = EGLEW_NV_stream_cross_system; continue; } #endif #ifdef EGL_NV_stream_fifo_next if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_fifo_next", 16)) { ret = EGLEW_NV_stream_fifo_next; continue; } #endif #ifdef EGL_NV_stream_fifo_synchronous if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_fifo_synchronous", 23)) { ret = EGLEW_NV_stream_fifo_synchronous; continue; } #endif #ifdef EGL_NV_stream_frame_limits if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_frame_limits", 19)) { ret = EGLEW_NV_stream_frame_limits; continue; } #endif #ifdef EGL_NV_stream_metadata if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_metadata", 15)) { ret = EGLEW_NV_stream_metadata; continue; } #endif #ifdef EGL_NV_stream_remote if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_remote", 13)) { ret = EGLEW_NV_stream_remote; continue; } #endif #ifdef EGL_NV_stream_reset if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_reset", 12)) { ret = EGLEW_NV_stream_reset; continue; } #endif #ifdef EGL_NV_stream_socket if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_socket", 13)) { ret = EGLEW_NV_stream_socket; continue; } #endif #ifdef EGL_NV_stream_socket_inet if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_socket_inet", 18)) { ret = EGLEW_NV_stream_socket_inet; continue; } #endif #ifdef EGL_NV_stream_socket_unix if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_socket_unix", 18)) { ret = EGLEW_NV_stream_socket_unix; continue; } #endif #ifdef EGL_NV_stream_sync if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_sync", 11)) { ret = EGLEW_NV_stream_sync; continue; } #endif #ifdef EGL_NV_sync if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) { ret = EGLEW_NV_sync; continue; } #endif #ifdef EGL_NV_system_time if (_glewStrSame3(&pos, &len, (const GLubyte*)"system_time", 11)) { ret = EGLEW_NV_system_time; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"TIZEN_", 6)) { #ifdef EGL_TIZEN_image_native_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_native_buffer", 19)) { ret = EGLEW_TIZEN_image_native_buffer; continue; } #endif #ifdef EGL_TIZEN_image_native_surface if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_native_surface", 20)) { ret = EGLEW_TIZEN_image_native_surface; continue; } #endif } } ret = (len == 0); } return ret; } #endif /* _WIN32 */ asymptote-3.05/configure.ac0000644000000000000000000005470015031566105014462 0ustar rootroot# -*- Autoconf -*- # Run autoheader and autoconf to produce a header and configure script from # this file. AC_PREREQ([2.71]) AC_INIT([Asymptote],[3.05],[https://github.com/vectorgraphics/asymptote/issues]) VERSION=$PACKAGE_VERSION AC_SUBST(VERSION) m4_include([ax_pthread.m4]) m4_include([pkg.m4]) AH_TOP([#pragma once]) AC_CANONICAL_HOST AC_CANONICAL_TARGET test "$prefix" = NONE && prefix=/usr/local Datadir=$datadir test "$Datadir" = '${datarootdir}' && Datadir=$datarootdir test "$Datadir" = '${prefix}/share' && Datadir=$prefix/share AC_SUBST(Datadir) AC_ARG_ENABLE(lsp, [AS_HELP_STRING(--enable-lsp[[[=yes]]],enable Language Server Protocol)]) cxxstd="c++17" CXXFLAGS=$CXXFLAGS" -std=$cxxstd" test "$CFLAGS" || CFLAGS="-g -O3" AC_C_BIGENDIAN( [AC_DEFINE(WORDS_BIGENDIAN,1,[Build is big endian])], [], [], [AC_DEFINE(UNIVERSAL_ENDIAN_BUILD,1,[Endianness is determined at compile time])] ) echo Compiling with $CXXFLAGS $CFLAGS # --------------- begin vcpkg option/check --------------------- # result: # with_vcpkg is yes/no, depending if user wants to use vcpkg or not # vcpkg_exec is the executable of vcpkg. this is only given if use_vcpkg is yes. AC_ARG_WITH(vcpkg, [AS_HELP_STRING(--with-vcpkg=[[[no]]], [Use vcpkg. If VCPKG_ROOT environment variable is set, will use that vcpkg. Otherwise searches in PATH.] ) ],[ if test "x$VCPKG_ROOT" = "x"; then # vcpkg root not given echo "VCPKG_ROOT is not given; searching vcpkg in path" AC_CHECK_PROG(has_vcpkg,vcpkg,true) if test "x$has_vcpkg" = "xtrue"; then vcpkg_exec=vcpkg fi else echo "VCPKG_ROOT is given; is using VCPKG_ROOT" AC_CHECK_FILE($VCPKG_ROOT/vcpkg,[ vcpkg_exec=$VCPKG_ROOT/vcpkg ]) fi # ensure vcpkg is specified if test "x$vcpkg_exec" = "x"; then AC_MSG_ERROR([Please ensure vcpkg is available through VCPKG_ROOT or in PATH]) fi echo "Using vcpkg executable $vcpkg_exec" ],[ with_vcpkg=no ]) #----------------- end vcpkg option check -------------------- AC_ARG_WITH(latex, [AS_HELP_STRING(--with-latex=PATH, specify path to LaTeX installation)], [if test "x$withval" != "x" ; then latexdir=$withval fi ],[ AC_CHECK_PROG(kpsewhich,kpsewhich,true) if test "x$kpsewhich" = "xtrue"; then latexdir=`kpsewhich -expand-var='$TEXMFLOCAL'/tex/latex` else latexdir=$prefix/share/texmf/tex/latex AC_CHECK_FILE($latexdir/base/latex.ltx,, [latexdir=/usr/share/texmf/tex/latex AC_CHECK_FILE($latexdir/base/latex.ltx,,)]) fi ]) AC_ARG_WITH(context, [AS_HELP_STRING(--with-context=PATH, specify path to ConTeXt installation)], [if test "x$withval" != "x" ; then contextdir=$withval fi ],[ AC_CHECK_PROG(kpsewhich,kpsewhich,true) if test "x$kpsewhich" = "xtrue"; then contextdir=`kpsewhich -expand-var='$TEXMFLOCAL'/tex/context/third` else contextdir=$prefix/share/texmf/tex/context/third fi ]) AC_CHECK_PROGS(TEXI2DVI,[texi2dvi], [@echo \*\*\*\*\*\*\*\*\*\* Please install texi2dvi or put https://asymptote.sourceforge.io/asymptote.pdf in the doc directory: cannot execute texi2dvi]) AC_SUBST(TEXI2DVI) latexdir=$latexdir/asymptote contextdir=$contextdir/asymptote AC_MSG_NOTICE([Using $latexdir for LaTeX style file]) AC_MSG_NOTICE([Using $contextdir for ConTeXT style file]) AC_SUBST(latexdir) AC_SUBST(contextdir) docdir=$Datadir/doc/asymptote AC_ARG_WITH(docdir, [AS_HELP_STRING(--with-docdir=PATH, alternate documentation installation directory)], [if test "x$withval" != "x" ; then docdir=$withval fi ]) AC_SUBST(docdir) sysdir=$Datadir/asymptote AC_ARG_ENABLE(texlive-build, [AS_HELP_STRING(--enable-texlive-build, automatically determine sysdir from kpsewhich)], [ if test "x$enableval" = "xyes" ; then sysdir="" fi ]) AC_DEFINE_UNQUOTED(ASYMPTOTE_SYSDIR,"$sysdir", [System directory for global .asy files]) AC_DEFINE_UNQUOTED(ASYMPTOTE_DOCDIR,"$docdir", [Directory for documentation]) AC_CONFIG_SRCDIR([absyn.cc]) AC_LANG([C++]) # Checks for programs. AC_PROG_LEX(noyywrap) AC_PROG_CXX AC_PROG_INSTALL AC_PROG_CC AC_PROG_MAKE_SET AC_ARG_VAR([BISON], [bison command]) AC_CHECK_PROG([BISON], [bison -y], [yes], [no]) AS_IF([test "x$BISON" = "xno"], [AC_MSG_ERROR([bison not found])]) AC_ARG_VAR([FLEX], [flex command]) AC_CHECK_PROG([FLEX], [flex -y], [yes], [no]) AS_IF([test "x$FLEX" = "xno"], [AC_MSG_ERROR([flex not found])]) if test "$GXX" = yes ; then ac_gcc_version=`echo __GNUC__ | $CC -E - | grep -v ^\#` ac_clang=`echo __clang__ | $CC -E - | grep -v ^\#` if test "$ac_gcc_version" -lt 4; then CFLAGS=$CFLAGS" -finline-limit=400" else if test "$ac_clang" != 1; then CFLAGS=$CFLAGS" -fno-var-tracking" fi fi fi AC_DEFUN([DEFINE],[ Define to 1 if you have `$1`. ]) AC_DEFUN([DEFINE_LIB],[ Define to 1 if you have the `$1` library (-l$1). ]) ASYGLVERSION=1.02 DEFS="" OPTIONS=$OPTIONS"-D_FILE_OFFSET_BITS=64 " INCL="" OPTIONS="" LIBS="" CPPFLAGS=$CPPFLAGS" -I. " # ------------- vcpkg initialization --------------- # vcpkg_triplet AC_ARG_WITH(vcpkg-target-triplet, AS_HELP_STRING(--with-vcpkg-target-triplet[[[=]]], [ specify custom vcpkg triplet. This option is only relevant if vcpkg is used. If left blank, will try to determine the triplet ] ), [ # given if test "x$with_vcpkg" != "xno" -a "x$withval" != "xno"; then vcpkg_triplet=$withval fi ],[ # not given if test "x$with_vcpkg" != "xno"; then case $target_cpu in x86_64) triplet_arch=x64 ;; aarch64) triplet_arch=arm64 ;; i*86) triplet_arch=x86 ;; *) AC_MSG_NOTICE([Cannot determine architecture, will leave triplet blank]) ;; esac case "$OSTYPE" in darwin*) triplet_os=osx ;; *) triplet_os=linux ;; esac if test "x$triplet_arch" != "x" -a "x$triplet_os" != "x"; then vcpkg_triplet="${triplet_arch}-${triplet_os}" AC_MSG_NOTICE([Determined vcpkg triplet as $vcpkg_triplet]) else AC_MSG_ERROR([Cannot determine vcpkg triplet for usage]) fi fi ] ) if test "x$with_vcpkg" != "xno"; then VCPKG_INSTALL_ARGUMENTS="--triplet=$vcpkg_triplet " VCPKG_PKG_CONFIG_LOC="vcpkg_installed/$vcpkg_triplet/lib/pkgconfig" INCL=$INCL" -Ivcpkg_installed/$vcpkg_triplet/include" LIBS=$LIBS"-Lvcpkg_installed/$vcpkg_triplet/lib " VCPKG_LIBS_TO_USE_PKG_CONFIG="" AC_DEFUN([ADD_VCPKG_LIB_FOR_PKGCONFIG],[VCPKG_LIBS_TO_USE_PKG_CONFIG=$VCPKG_LIBS_TO_USE_PKG_CONFIG"$1 "]) AC_DEFUN([ADD_VCPKG_FEATURE],[VCPKG_INSTALL_ARGUMENTS=$VCPKG_INSTALL_ARGUMENTS"--x-feature=$1 "]) fi AC_ARG_WITH(vcpkg-host-triplet, AS_HELP_STRING(--with-vcpkg-host-triplet[[[=]]], [ specify custom vcpkg host triplet. This option is only relevant if vcpkg is ued. If left blank, will try to determine the triplet ] ), [ # given if test "x$with_vcpkg" != "xno" -a "x$withval" != "xno"; then VCPKG_INSTALL_ARGUMENTS=$VCPKG_INSTALL_ARGUMENTS"--host-triplet=$withval " fi ], ) # Checks for libraries. #AC_SEARCH_LIBS([lgamma],[m c],, #AC_MSG_ERROR([*** Please install libm on your system ***])) # ----------------- zlib ---------------------------- if test "x$with_vcpkg" != "xno"; then ADD_VCPKG_LIB_FOR_PKGCONFIG(zlib) else AC_CHECK_LIB( [z], [deflate], , AC_MSG_ERROR([*** Please install libz or zlib-devel on your system ***]) ) fi AC_DEFINE(HAVE_ZLIB,1,[ZLib library present]) # -------------- threads ------------------- GCOPTIONS="--disable-shared --disable-dependency-tracking" AC_ARG_ENABLE( threads, [AS_HELP_STRING(--enable-threads[[[=yes]]],enable POSIX threads)] ) if test "x$enable_threads" != "xno"; then if test "x$with_vcpkg" != "xno"; then ADD_VCPKG_FEATURE(threading) AC_DEFINE(HAVE_PTHREAD,1) OPTIONS=$OPTIONS" -pthread" else AX_PTHREAD fi else GCOPTIONS=$GCOPTIONS"--disable-threads " fi # --------------- sigsegv ------------------------------ if test "x$with_vcpkg" = "xno"; then AC_ARG_ENABLE(sigsegv, [AS_HELP_STRING(--enable-sigsegv[[[=yes]]],enable GNU Stack Overflow Handler)]) if test "x$enable_sigsegv" != "xno"; then AC_CHECK_LIB([sigsegv], [stackoverflow_install_handler]) fi AC_CHECK_LIB([rt], [sched_yield]) fi # ----------------- lsp ------------------------------- LSP_ROOT=LspCpp AC_SUBST(LSP_ROOT) LSPLIBS= LSPLIB= if test "x$enable_lsp" != "xno" -a "x$enable_threads" != "xno"; then AC_CHECK_LIB([boost_filesystem],[opendir], [AC_CHECK_LIB([boost_thread],[pthread_attr_getdetachstate], [ LSPLIB=$LSP_ROOT/liblspcpp.a LSPLIBS=$LSPLIBS" -L$LSP_ROOT -L$LSP_ROOT/third_party/uri/src -llspcpp -lnetwork-uri -lboost_filesystem -lboost_thread" LSP_CMAKE_OPTIONS="-DLSPCPP_USE_CPP17=ON " if test "x$enable_gc" != "xno"; then LSP_CMAKE_OPTIONS=$LSP_CMAKE_OPTIONS"-DLSPCPP_SUPPORT_BOEHM_GC=ON " if test "x$with_vcpkg" = "xno"; then LSP_CMAKE_OPTIONS=$LSP_CMAKE_OPTIONS"-DLSPCPP_GC_DOWNLOADED_ROOT=../\$(GC) " fi else LSP_CMAKE_OPTIONS=$LSP_CMAKE_OPTIONS"-DLSPCPP_SUPPORT_BOEHM_GC=OFF " fi AC_DEFUN([ENABLE_LSP_MACRO], AC_SUBST(LSP_CXX_BUILD_FLAGS) AC_SUBST(LSP_CMAKE_OPTIONS) AC_DEFINE(HAVE_LSP,1,DEFINE([Language server protocol])) ) if test "x$with_vcpkg" != "xno"; then ADD_VCPKG_FEATURE(lsp) RELATIVE_LSP_VCPKG_ROOT=../vcpkg_installed/$vcpkg_triplet LSP_CXX_BUILD_FLAGS=$LSP_BUILD_FLAGS"-I$RELATIVE_LSP_VCPKG_ROOT/include -L$RELATIVE_LSP_VCPKG_ROOT/lib " LSP_CMAKE_OPTIONS=$LSP_CMAKE_OPTIONS"-DUSE_SYSTEM_RAPIDJSON=True -DCMAKE_PREFIX_PATH=\"$RELATIVE_LSP_VCPKG_ROOT\" " fi ENABLE_LSP_MACRO], AC_MSG_NOTICE([*** Could not find libboost_thread: will compile without optional Language Server Protocol. ***]))], AC_MSG_NOTICE([*** Could not find libboost_filesystem: will compile without optional Language Server Protocol. ***])) fi AC_ARG_ENABLE(readline, [AS_HELP_STRING(--enable-readline[[[=yes]]],enable GNU Readline Library)]) AC_ARG_ENABLE(static, [AS_HELP_STRING(--enable-static[[[=no]]],link against static libraries)]) AC_DEFUN([PKG_CONFIG],[ ifdef( [PKG_CHECK_MODULES], $1="$2 "$(pkg-config --silence-errors $3 $4 || echo), $1="$2 " ) ]) STATIC="" DYNAMIC="" if test "x$enable_static" = "xyes"; then STATIC="-Wl,-Bstatic " DYNAMIC="-Wl,-Bdynamic " fi AC_DEFUN([CHECK_LIB_STATIC],[ PKG_CONFIG(PKG_FLAGS,,--libs,$1) if test "x$PKG_FLAGS" == "x "; then PKG_FLAGS=-l"$2" echo will try linking with $PKG_FLAGS fi LDFLAGS_SAVE=$LDFLAGS LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC AC_MSG_NOTICE([Checking $2 for function $3... PKG_FLAGS:$PKG_FLAGS]) AC_CHECK_LIB( $2,$3, AC_DEFINE($4,1,DEFINE_LIB($2)), if test "x$enable_static" = "xyes"; then [ echo "Static library not found; will check for dynamic version" LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS " AS_UNSET([ac_cv_lib_$2_$3]) AC_CHECK_LIB( $2,$3, AC_DEFINE($4,1,DEFINE_LIB($2)), [ LDFLAGS=$LDFLAGS_SAVE $5 ], $PKG_FLAGS ) ] else [ LDFLAGS=$LDFLAGS_SAVE $5 ] fi, $PKG_FLAGS ) ]) if test "x$enable_readline" != "xno"; then if test "x$with_vcpkg" != "xno"; then # vcpkg ADD_VCPKG_FEATURE(readline) AC_DEFINE(HAVE_NCURSES_CURSES_H) AC_DEFINE(HAVE_LIBCURSES) AC_DEFINE(HAVE_LIBREADLINE) ADD_VCPKG_LIB_FOR_PKGCONFIG(readline) ADD_VCPKG_LIB_FOR_PKGCONFIG(ncurses) else # managed by the system PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,readline) AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([ #include #include #include ],[ #ifndef RL_READLINE_VERSION abort #endif ])], CHECK_LIB_STATIC(readline,readline,history_list,HAVE_LIBREADLINE, readline="no"),readline="no") if test "x$readline" == "xno"; then AC_MSG_NOTICE([*** Could not find GNU readline 4.3 or later: will compile without readline support ***]) AC_CHECK_LIB([edit],[readline]) AC_CHECK_HEADERS(editline/readline.h) fi PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,tinfo) CHECK_LIB_STATIC(tinfo,tinfo,tgetent,HAVE_LIBTINFO,AC_MSG_NOTICE([perhaps tgetent is in -lncurses])) PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,ncurses) AC_CHECK_HEADERS([ncurses/curses.h ncurses.h curses.h],[break]) CHECK_LIB_STATIC(ncurses,ncurses,setupterm,HAVE_LIBCURSES, AC_CHECK_LIB(curses,setupterm)) fi fi # --------------- gc ------------------------------- GCNAME="Boehm Garbage Collector" AC_ARG_ENABLE(gc, [AS_HELP_STRING(--enable-gc[[[=yes]]],enable local $GCNAME)]) if test "x$enable_gc" != "xno" ; then if test "x$with_vcpkg" == "xno"; then AC_DEFINE(USEGC,1,[GC Enabled]) GCLIB="\$(GC)/.libs/libgc.a" INCL=$INCL" -I\$(GC)/include" AC_MSG_NOTICE([$GCNAME is enabled]) fi else AC_MSG_NOTICE([*** $GCNAME disabled by configure flag: will compile without garbage collection. ***]) fi AC_ARG_ENABLE(gc-debug, [AS_HELP_STRING(--enable-gc-debug,enable (slow) garbage collector debugging)], [ if test "x$enable_gc" != "xno" ; then if test "x$enableval" = "xyes" ; then AC_DEFINE(GC_DEBUG,1,[GC Debug is enabled]) AC_MSG_NOTICE([*** Enabling GC debugging: remember to make clean ***]) AC_MSG_NOTICE([*** Set the environment variable GC_FIND_LEAK at runtime ***]) fi fi ]) AC_ARG_ENABLE(gc-full-debug, [AS_HELP_STRING(--enable-gc-full-debug,enable (very slow) garbage collector backtrace)], [ if test "x$enable_gc" != "xno" ; then if test "x$enableval" = "xyes" ; then AC_DEFINE(GC_DEBUG,1,[GC Debug is enabled]) AC_DEFINE(GC_BACKTRACE,1,[GC backtrace is enabled]) GCOPTIONS=$GCOPTIONS"--enable-gc-debug " AC_MSG_NOTICE([*** Enabling GC backtrace debugging; remember to make gc-clean ***]) fi fi ]) # ---------------- curl ------------------------ AC_ARG_ENABLE(curl, [AS_HELP_STRING(--enable-curl[[[=yes]]],enable libcurl and compile with optional URL support)]) if test "x$enable_curl" != "xno"; then if test "x$with_vcpkg" != "xno"; then ADD_VCPKG_FEATURE(curl) AC_DEFINE(HAVE_LIBCURL) ADD_VCPKG_LIB_FOR_PKGCONFIG(libcurl) else PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,curl) AC_CHECK_HEADER(curl/curl.h, CHECK_LIB_STATIC(libcurl,curl,curl_easy_init,HAVE_LIBCURL, AC_MSG_NOTICE([*** Could not find libcurl: will compile without optional URL support. ***])), AC_MSG_NOTICE([*** Header file curl.h not found: will compile without optional URL support. ***])) fi else AC_MSG_NOTICE([*** libcurl support disabled by configure flag: will compile without optional URL support. ***]) fi # --------------------- fftw ------------------------- AC_ARG_ENABLE(fftw, [AS_HELP_STRING(--enable-fftw[[[=yes]]],enable FFTW Library)]) if test "x$enable_fftw" != "xno"; then if test "x$with_vcpkg" != "xno"; then # vcpkg ADD_VCPKG_FEATURE(fftw3) AC_DEFINE(HAVE_LIBFFTW3) ADD_VCPKG_LIB_FOR_PKGCONFIG(fftw3) else # system managed PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,fftw3) AC_CHECK_HEADER(fftw3.h, CHECK_LIB_STATIC(fftw3,fftw3,fftw_execute,HAVE_LIBFFTW3, AC_MSG_NOTICE([*** Could not find libfftw3: will compile without optional fast Fourier transforms. ***])), AC_MSG_NOTICE([*** Header file fftw3.h not found: will compile without optional fast Fourier transforms. ***])) fi fi # ------------------- eigen ------------------------- AC_ARG_ENABLE(eigen, [AS_HELP_STRING(--enable-eigen[[[=yes]]],enable Eigen Library)]) if test "x$enable_eigen" != "xno"; then if test "x$with_vcpkg" != "xno"; then ADD_VCPKG_FEATURE(eigen3) AC_DEFINE(HAVE_EIGEN_DENSE) ADD_VCPKG_LIB_FOR_PKGCONFIG(eigen3) else PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,eigen3) AC_CHECK_HEADERS(Eigen/Dense) fi fi # Checks for header files. AC_HEADER_SYS_WAIT AC_CHECK_HEADERS([fenv.h stddef.h libintl.h]) AC_CHECK_HEADERS(fpu_control.h) AC_CHECK_FUNCS([feenableexcept]) # ------------------- GSL -------------------- AC_ARG_ENABLE(gsl, [AS_HELP_STRING(--enable-gsl[[[=yes]]],enable GNU Scientific Library)]) if test "x$enable_gsl" != "xno"; then if test "x$with_vcpkg" != "xno"; then # vcpkg ADD_VCPKG_FEATURE(gsl) AC_DEFINE(HAVE_LIBGSL) LIBS=$LIBS"-lgsl " # gsl's pkg-config file is incomplete ADD_VCPKG_LIB_FOR_PKGCONFIG(gsl) else PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,gsl) PKG_CONFIG(LDFLAGS,$LDFLAGS,--libs,gsl) AC_CHECK_HEADER(gsl/gsl_sf.h, CHECK_LIB_STATIC(gsl,gsl,gsl_sf_debye_6,HAVE_LIBGSL, AC_MSG_NOTICE([*** Could not find libgsl: will compile without optional special functions. ***])), AC_MSG_NOTICE([*** Header file gsl_sf.h not found: will compile without optional special functions. ***])) fi fi # ----------------- OpenGL ----------------- AC_ARG_ENABLE(gl, [AS_HELP_STRING(--enable-gl[[[=yes]]],enable OpenGL Library)]) if test "x$with_vcpkg" != "xno"; then AC_DEFINE(HAVE_SSBO,1) # SSBO/Compute shader check should be done at runtime, not at compilation AC_DEFINE(HAVE_COMPUTE_SHADER,1) else AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [#include ] [#if !defined(GL_VERSION_4_3) && !defined(GL_ARB_shader_storage_buffer_object)] [#error] [#endif ] )], AC_DEFINE(HAVE_SSBO,1,DEFINE([GLSL shader storage buffer objects]))) AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [#include ] [#if !defined(GL_VERSION_4_3) && !defined(GL_ARB_compute_shader)] [#error] [#endif ] )], AC_DEFINE(HAVE_COMPUTE_SHADER,1,DEFINE([GLSL compute shaders]))) fi # -------------- offscreen rendering AC_ARG_ENABLE(offscreen, [AS_HELP_STRING(--enable-offscreen[[[=no]]],use OSMesa library to implement offscreen rendering)]) # ----------- glm if test "x$with_vcpkg" != "xno"; then AC_DEFINE(HAVE_LIBGLM,1) LIBS=$LIBS"-lglm " else # glm is header only and is already on the include path AC_CHECK_HEADER( glm/glm.hpp, [AC_DEFINE( HAVE_LIBGLM,1, DEFINE([the header])) ], AC_MSG_NOTICE([*** Could not find glm header files: will compile without WebGL or OpenGL support ***]) ) fi TINYEXR_ROOT=tinyexr INCL=$INCL" -I$TINYEXR_ROOT" AC_SUBST(TINYEXR_ROOT) if test "x$enable_gl" != "xno"; then if test "x$with_vcpkg" != "xno"; then # managed by vcpkg ADD_VCPKG_FEATURE(opengl) AC_DEFINE(HAVE_LIBGL,1,[libgl is enabled]) AC_DEFINE(FREEGLUT,1,[Freeglut is enabled]) AC_DEFINE(HAVE_LIBGLUT,1,[Freeglut library is available]) INCL=$INCL" -Ibackports/glew/include" GLEW="glew.o " ADD_VCPKG_LIB_FOR_PKGCONFIG(glut) else # managed by the system AC_CHECK_HEADERS([ncurses/curses.h ncurses.h curses.h],[break]) case "$OSTYPE" in darwin*) AC_CHECK_LIB([gccpp],[GC_throw_bad_alloc]) AC_CHECK_HEADER(OpenGL/gl.h, [AC_DEFINE(HAVE_LIBGL,1, DEFINE([ header]))]) AC_CHECK_HEADER(GLUT/glut.h, [AC_DEFINE(HAVE_LIBGLUT,1, DEFINE_LIB[GLUT]) LIBS=$LIBS"-framework GLUT -framework OpenGL -framework Cocoa " INCL=$INCL" -Ibackports/glew/include" GLEW="glew.o "], AC_MSG_NOTICE([*** Could not find GLUT: will compile without OpenGLLUT support ***])) ;; *) AC_CHECK_LIB([glut], [glutMainLoop],, AC_MSG_NOTICE([*** Could not find libglut: will compile without OpenGL support ***])) AC_CHECK_LIB([GL], [glDepthMask], [AC_DEFINE(HAVE_LIBGL,1, DEFINE_LIB([GL])) LIBS=$LIBS"-lGL " GLEW="glew.o " INCL=$INCL" -Ibackports/glew/include"], AC_MSG_NOTICE([*** Could not find libGL: will compile without OpenGL support ***])) esac if test "x$enable_offscreen" = "xyes"; then AC_CHECK_LIB([OSMesa],OSMesaCreateContext,, AC_MSG_NOTICE([*** Could not find libOSMesa: will compile without offscreen rendering support ***])) fi fi fi # ------------------- VCPKG INSTALL if test "x$with_vcpkg" != "xno"; then AC_MSG_NOTICE([Running vcpkg install]) $vcpkg_exec install $VCPKG_INSTALL_ARGUMENTS LIBS=$LIBS"$(PKG_CONFIG_PATH=$VCPKG_PKG_CONFIG_LOC pkg-config --libs $VCPKG_LIBS_TO_USE_PKG_CONFIG) " CFLAGS=$CFLAGS" $(PKG_CONFIG_PATH=$VCPKG_PKG_CONFIG_LOC pkg-config --cflags-only-other $VCPKG_LIBS_TO_USE_PKG_CONFIG)" INCL=$INCL" $(PKG_CONFIG_PATH=$VCPKG_PKG_CONFIG_LOC pkg-config --cflags-only-I $VCPKG_LIBS_TO_USE_PKG_CONFIG)" fi # ----------------- xdr ------------------------ # managed by the system here, unlike other packages AC_ARG_ENABLE(xdr, [AS_HELP_STRING(--enable-xdr[[[=yes]]],enable XDR/V3D support)]) if test "x$enable_xdr" != "xno"; then case "$OSTYPE" in darwin* | FreeBSD) AC_DEFINE(HAVE_LIBTIRPC,1,DEFINE_LIB([tirpc])) ;; *) PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,libtirpc) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([#include "xstream.h"])], CHECK_LIB_STATIC(libtirpc,tirpc,xdrstdio_create, HAVE_LIBTIRPC, AC_MSG_NOTICE([*** Could not find libtirpc; XDR/V3D support disabled ***]) ), AC_MSG_NOTICE([*** Broken rpc headers; XDR/V3D support disabled ***]) ) ;; esac fi CPPFLAGS=$CPPFLAGS" $INCL" CXX_STANDARD=$cxxstd AC_SUBST(getopt) AC_SUBST(ASYGLVERSION) AC_SUBST(GCOPTIONS) AC_SUBST(GCLIB) AC_SUBST(GCPPLIB) AC_SUBST(LSPLIB) AC_SUBST(LSPLIBS) AC_SUBST(INCL) AC_SUBST(CXX_STANDARD) AC_SUBST(DEFS) AC_SUBST(OPTIONS) AC_SUBST(GLEW) # we are on C++ >= 11, so unordered map is a guarantee AC_DEFINE(HAVE_UNORDERED_MAP,1,[Unordered map is present]) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_PID_T AC_TYPE_SIZE_T AC_CHECK_TYPES([ptrdiff_t]) AC_CHECK_TYPES([long long]) AC_CHECK_TYPES([long]) AC_C_CONST AC_C_INLINE # Checks for library functions. AC_FUNC_FORK AC_CHECK_FUNCS([dup2 floor memset strchr tgamma lgamma memrchr popcount]) AC_FUNC_STRFTIME AC_FUNC_ERROR_AT_LINE AC_FUNC_FSEEKO AC_CHECK_FUNCS(strptime) AC_CHECK_FUNCS(strnlen) AC_CONFIG_FILES([Makefile doc/Makefile doc/png/Makefile]) AC_CONFIG_HEADERS([config.h]) AC_OUTPUT asymptote-3.05/policy.h0000644000000000000000000000475615031566105013652 0ustar rootroot/***** * policy.h * Andy Hammerlindl 2011/09/03 * * Defines a low-level C interface for interacting with the interpreter and * its datatypes. *****/ // TODO: Wrap in namespace. typedef long long int_typ; typedef struct {} handle_base_typ; typedef handle_base_typ *handle_typ; typedef struct {} arguments_base_typ; typedef arguments_base_typ *arguments_typ; typedef struct {} state_base_typ; typedef state_base_typ *state_typ; typedef void (*function_typ)(state_typ, void *); typedef struct { const char *buf; size_t length; } string_typ; typedef void (*error_callback_typ)(string_typ); typedef long arg_rest_option; #define NORMAL_ARG 45000 #define REST_ARG 45001 typedef struct { int_typ version; handle_typ (*copyHandle)(handle_typ handle); void (*releaseHandle)(); handle_typ (*handleFromInt)(int_typ x); // For bool, O is false, 1 is true, and no other value is allowed. handle_typ (*handleFromBool)(int_typ x); handle_typ (*handleFromDouble)(double x); handle_typ (*handleFromString)(string_typ x); handle_typ (*handleFromFunction)(const char *signature, function_typ f, void *data); int_typ (*IntFromHandle)(handle_typ handle); int_typ (*boolFromHandle)(handle_typ handle); double (*doubleFromHandle)(handle_typ handle); // TODO: Note that a pointer and length are returned, but the pointer is // valid for a limited time only. string_typ (*stringFromHandle)(handle_typ handle); #if 0 bool (*handleIsOverloaded)(handle_typ handle); handle_typ (*signatureless)(handle_typ handle); #endif handle_typ (*getField)(handle_typ handle, const char *name); handle_typ (*getCell)(handle_typ handle, handle_typ index); // Adds a field to a datum (possibly a module) and sets it to an initial // value. // TODO: Change name to sig. void (*addField)(handle_typ handle, const char *name, handle_typ init); arguments_typ (*newArguments)(); void (*releaseArguments)(arguments_typ args); void (*addArgument)(arguments_typ args, const char *name, handle_typ handle, arg_rest_option at); handle_typ (*call)(handle_typ callee, arguments_typ args); handle_typ (*globals)(state_typ state); int_typ (*numParams)(state_typ state); handle_typ (*getParam)(state_typ state, int_typ index); void (*setReturnValue)(state_typ state, handle_typ handle); // Allows the user sets an error callback, which is called on any error. void (*setErrorCallback)(error_callback_typ callback); } policy_typ; asymptote-3.05/pen.h0000644000000000000000000006646615031566105013143 0ustar rootroot/***** * pen.h * John Bowman 2003/03/23 * *****/ #ifndef PEN_H #define PEN_H #include #include "transform.h" #include "settings.h" #include "bbox.h" #include "common.h" #include "path.h" #include "array.h" namespace camp { class LineType { public: vm::array pattern; // Array of PostScript style line pattern entries. double offset; // The offset in the pattern at which to start drawing. bool scale; // Scale the line type values by the pen width? bool adjust; // Adjust the line type values to fit the arclength? bool isdefault; LineType() : offset(0.0), scale(true), adjust(true), isdefault(true) {} LineType(vm::array pattern, double offset, bool scale, bool adjust) : pattern(pattern), offset(offset), scale(scale), adjust(adjust), isdefault(false) {} void Scale(double factor) { size_t n=pattern.size(); for(size_t i=0; i < n; i++) pattern[i]=vm::read(pattern,i)*factor; offset *= factor; } }; extern const char* DEFPAT; extern const char* DEFLATEXFONT; extern const char* DEFCONTEXTFONT; extern const char* DEFTEXFONT; extern const double DEFWIDTH; extern const Int DEFCAP; extern const Int DEFJOIN; extern const double DEFMITER; extern const transform nullTransform; static const struct invisiblepen_t {} invisiblepen={}; static const struct setlinewidth_t {} setlinewidth={}; static const struct setfont_t {} setfont={}; static const struct setfontsize_t {} setfontsize={}; static const struct setpattern_t {} setpattern={}; static const struct setlinecap_t {} setlinecap={}; static const struct setlinejoin_t {} setlinejoin={}; static const struct setmiterlimit_t {} setmiterlimit={}; static const struct setoverwrite_t {} setoverwrite={}; static const struct initialpen_t {} initialpen={}; static const struct resolvepen_t {} resolvepen={}; extern const char* PSCap[]; extern const char* Cap[]; extern const Int nCap; extern const char* Join[]; extern const Int nJoin; enum overwrite_t {DEFWRITE=-1,ALLOW,SUPPRESS,SUPPRESSQUIET,MOVE,MOVEQUIET}; extern const char* OverwriteTag[]; extern const Int nOverwrite; enum FillRule {DEFFILL=-1,ZEROWINDING,EVENODD}; extern const char* FillRuleTag[]; extern const Int nFill; enum BaseLine {DEFBASE=-1,NOBASEALIGN,BASEALIGN}; extern const char* BaseLineTag[]; extern const Int nBaseLine; enum ColorSpace {DEFCOLOR=0,INVISIBLE,GRAYSCALE,RGB,CMYK,PATTERN}; extern const size_t ColorComponents[]; extern const char* ColorDeviceSuffix[]; extern const unsigned nColorSpace; enum LineCap {SquareCap,RoundCap,ExtendedCap}; enum LineJoin {MiterJoin,RoundJoin,BevelJoin}; inline bool operator == (const vm::array& a, const vm::array& b) { size_t asize=a.size(); size_t bsize=b.size(); if(asize != bsize) return false; for(size_t i=0; i < asize; ++i) if(vm::read(a,i) != vm::read(b,i)) return false; return true; } inline bool operator == (const LineType& a, const LineType& b) { return a.pattern == b.pattern && a.offset == b.offset && a.scale == b.scale && a.adjust == b.adjust; } inline ostream& operator << (ostream& out, const vm::array& a) { out << "["; size_t n=a.size(); if(n > 0) { out << vm::read(a,0); for(size_t i=1; i < n; ++i) out << " " << vm::read(a,i); } out << "]"; return out; } class Transparency { public: string blend; double opacity; bool isdefault; Transparency() : blend("Compatible"), opacity(1.0), isdefault(true) {} Transparency(const string& blend, double opacity) : blend(blend), opacity(opacity), isdefault(false) {} }; inline bool operator == (const Transparency& a, const Transparency& b) { return a.blend == b.blend && a.opacity == b.opacity; } extern const char* BlendMode[]; extern const Int nBlendMode; // Map [0,1] to [0,255] uniformly, with 0.5 mapping to 128. inline unsigned int byte(double r) { if(r < 0.0) r=0.0; unsigned int c=(unsigned int)(r*256); return c < 255 ? c : 255; } inline double byteinv(unsigned char i) { if(i == 255) return 1.0; return i/256.0; } class pen; pen& defaultpen(); class pen : public gc { LineType line; // Width of line, in PS units. double linewidth; path P; // A polygonal path defining a custom pen nib; // nullpath means the default (typically circular) nib. string font; double fontsize; double lineskip; ColorSpace color; double r,g,b; // RGB or CMY value double grey; // grayscale or K value string pattern; // The name of the user-defined fill/draw pattern FillRule fillrule; // Zero winding-number (default) or even-odd rule BaseLine baseline; // Align to TeX baseline? Transparency transparency; Int linecap; Int linejoin; double miterlimit; overwrite_t overwrite; // The transformation applied to the pen nib for calligraphic effects. // nullTransform means the default (typically identity) transformation. transform t; public: static double pos0(double x) {return x >= 0 ? x : 0;} void greyrange() {if(grey > 1.0) grey=1.0;} void rgbrange() { double sat=rgbsaturation(); if(sat > 1.0) { double scale=1.0/sat; r *= scale; g *= scale; b *= scale; } } void cmykrange() { double sat=cmyksaturation(); if(sat > 1.0) { double scale=1.0/sat; r *= scale; g *= scale; b *= scale; grey *= scale; } } void colorless() { r=g=b=grey=0.0; color=DEFCOLOR; } pen() : line(), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(DEFCOLOR), r(0), g(0), b(0), grey(0), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {} pen(const LineType& line, double linewidth, const path& P, const string& font, double fontsize, double lineskip, ColorSpace color, double r, double g, double b, double grey, const string& pattern, FillRule fillrule, BaseLine baseline, const Transparency& transparency, Int linecap, Int linejoin, double miterlimit, overwrite_t overwrite, const transform& t) : line(line), linewidth(linewidth), P(P), font(font), fontsize(fontsize), lineskip(lineskip), color(color), r(r), g(g), b(b), grey(grey), pattern(pattern), fillrule(fillrule), baseline(baseline), transparency(transparency), linecap(linecap), linejoin(linejoin), miterlimit(miterlimit), overwrite(overwrite), t(t) {} pen(invisiblepen_t) : line(), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(INVISIBLE), r(0), g(0), b(0), grey(0), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {} pen(setlinewidth_t, double linewidth) : line(), linewidth(linewidth), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(DEFCOLOR), r(0), g(0), b(0), grey(0), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {} pen(path P) : line(), linewidth(DEFWIDTH), P(P), font(""), fontsize(0.0), lineskip(0.0), color(DEFCOLOR), r(0), g(0), b(0), grey(0), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {} pen(const LineType& line) : line(line), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(DEFCOLOR), r(0), g(0), b(0), grey(0), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {} pen(setfont_t, string font) : line(), linewidth(DEFWIDTH), P(nullpath), font(font), fontsize(0.0), lineskip(0.0), color(DEFCOLOR), r(0), g(0), b(0), grey(0), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {} pen(setfontsize_t, double fontsize, double lineskip) : line(), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(fontsize), lineskip(lineskip), color(DEFCOLOR), r(0), g(0), b(0), grey(0), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {} pen(setpattern_t, const string& pattern) : line(), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(PATTERN), r(0), g(0), b(0), grey(0), pattern(pattern), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {} pen(FillRule fillrule) : line(), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(DEFCOLOR), r(0), g(0), b(0), grey(0), pattern(DEFPAT), fillrule(fillrule), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {} pen(BaseLine baseline) : line(), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(DEFCOLOR), r(0), g(0), b(0), grey(0), pattern(DEFPAT), fillrule(DEFFILL), baseline(baseline), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {} pen(const Transparency& transparency) : line(), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(DEFCOLOR), r(0), g(0), b(0), grey(0), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(transparency), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {} pen(setlinecap_t, Int linecap) : line(), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(DEFCOLOR), r(0), g(0), b(0), grey(0), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(linecap), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {} pen(setlinejoin_t, Int linejoin) : line(), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(DEFCOLOR), r(0), g(0), b(0), grey(0), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(linejoin), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {} pen(setmiterlimit_t, double miterlimit) : line(), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(DEFCOLOR), r(0), g(0), b(0), grey(0), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(miterlimit), overwrite(DEFWRITE), t(nullTransform) {} pen(setoverwrite_t, overwrite_t overwrite) : line(), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(DEFCOLOR), r(0), g(0), b(0), grey(0), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(overwrite), t(nullTransform) {} explicit pen(double grey) : line(), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(GRAYSCALE), r(0.0), g(0.0), b(0.0), grey(pos0(grey)), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {greyrange();} pen(double r, double g, double b) : line(), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(RGB), r(pos0(r)), g(pos0(g)), b(pos0(b)), grey(0.0), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {rgbrange();} pen(double c, double m, double y, double k) : line(), linewidth(DEFWIDTH), P(nullpath), font(""), fontsize(0.0), lineskip(0.0), color(CMYK), r(pos0(c)), g(pos0(m)), b(pos0(y)), grey(pos0(k)), pattern(DEFPAT), fillrule(DEFFILL), baseline(DEFBASE), transparency(), linecap(DEFCAP), linejoin(DEFJOIN), miterlimit(DEFMITER), overwrite(DEFWRITE), t(nullTransform) {cmykrange();} // Construct one pen from another, resolving defaults pen(resolvepen_t, const pen& p) : line(LineType(p.line.pattern,p.line.offset,p.line.scale,p.line.adjust)), linewidth(p.width()), P(p.Path()), font(p.Font()), fontsize(p.size()), lineskip(p.Lineskip()), color(p.colorspace()), r(p.red()), g(p.green()), b(p.blue()), grey(p.gray()), pattern(""), fillrule(p.Fillrule()), baseline(p.Baseline()), transparency(Transparency(p.blend(), p.opacity())), linecap(p.cap()), linejoin(p.join()), miterlimit(p.miter()), overwrite(p.Overwrite()), t(p.getTransform()) {} static pen initialpen() { return pen(LineType(vm::array(0),0.0,true,true),0.5,nullpath,"", 12.0*settings::tex2ps,12.0*1.2*settings::tex2ps,GRAYSCALE, 0.0,0.0,0.0,0.0,"",ZEROWINDING,NOBASEALIGN, Transparency(),1,1,10.0,ALLOW,identity); } pen(initialpen_t) : line(), linewidth(-2.0), P(nullpath), font(""), fontsize(-1.0), lineskip(-1.0), color(INVISIBLE), r(0.0), g(0.0), b(0.0), grey(0.0), pattern(DEFPAT), fillrule(DEFFILL), baseline(NOBASEALIGN), transparency("",-1.0),linecap(-2), linejoin(-2), miterlimit(-1.0), overwrite(DEFWRITE), t(nullTransform) {} double width() const { return linewidth == DEFWIDTH ? defaultpen().linewidth : linewidth; } path Path() const { return P.empty() ? defaultpen().P : P; } double size() const { return fontsize == 0.0 ? defaultpen().fontsize : fontsize; } string Font() const { if(font.empty()) { if(defaultpen().font.empty()) { string texengine=settings::getSetting("tex"); if(settings::latex(texengine)) return DEFLATEXFONT; else if(texengine == "none") return settings::getSetting("textinitialfont"); else { ostringstream buf; // Work around misalignment in ConTeXt switchtobodyfont if font is not found. if(texengine == "context") buf << "\\switchtobodyfont[" << DEFCONTEXTFONT << "," << size()*settings::ps2tex << "pt]\\removeunwantedspaces%" << newl; else buf << "\\font\\ASYfont=" << DEFTEXFONT << " at " << size()*settings::ps2tex << "pt\\ASYfont"; return buf.str(); } } else return defaultpen().font; } return font; } double Lineskip() const { return lineskip == 0.0 ? defaultpen().lineskip : lineskip; } const LineType *linetype() const { return line.isdefault ? &defaultpen().line : &line; } void adjust(double factor) { if(line.isdefault) line=defaultpen().line; line.Scale(factor); } void setstroke(const vm::array& s) {line.pattern=s;} void setoffset(const double& offset) {line.offset=offset;} string fillpattern() const { return pattern == DEFPAT ? (string)"" : pattern; } FillRule Fillrule() const { return fillrule == DEFFILL ? defaultpen().fillrule : fillrule; } bool evenodd() const { return Fillrule() == EVENODD; } bool inside(Int count) const { return evenodd() ? count % 2 : count != 0; } BaseLine Baseline() const { return baseline == DEFBASE ? defaultpen().baseline : baseline; } Transparency transp() const { return transparency.isdefault ? defaultpen().transparency : transparency; } string blend() const { return transparency.isdefault ? defaultpen().transparency.blend : transparency.blend; } double opacity() const { return transparency.isdefault ? defaultpen().transparency.opacity : transparency.opacity; } Int cap() const { return linecap == DEFCAP ? defaultpen().linecap : linecap; } Int join() const { return linejoin == DEFJOIN ? defaultpen().linejoin : linejoin; } double miter() const { return miterlimit == DEFMITER ? defaultpen().miterlimit : miterlimit; } overwrite_t Overwrite() const { return overwrite == DEFWRITE ? defaultpen().overwrite : overwrite; } ColorSpace colorspace() const { return color == DEFCOLOR ? defaultpen().color : color; } string hex() const { int n=ColorComponents[colorspace()]; ostringstream buf; buf.setf(std::ios::hex,std::ios::basefield); buf.fill('0'); switch(n) { case 0: break; case 1: buf << std::setw(2) << byte(gray()); break; case 3: buf << std::setw(2) << byte(red()) << std::setw(2) << byte(green()) << std::setw(2) << byte(blue()); break; case 4: buf << std::setw(2) << byte(cyan()) << std::setw(2) << byte(magenta()) << std::setw(2) << byte(yellow()) << std::setw(2) << byte(black()); break; default: break; } return buf.str(); } bool invisible() const {return colorspace() == INVISIBLE;} bool grayscale() const {return colorspace() == GRAYSCALE;} bool rgb() const {return colorspace() == RGB;} bool cmyk() const {return colorspace() == CMYK;} double gray() const {return color == DEFCOLOR ? defaultpen().grey : grey;} double red() const {return color == DEFCOLOR ? defaultpen().r : r;} double green() const {return color == DEFCOLOR ? defaultpen().g : g;} double blue() const {return color == DEFCOLOR ? defaultpen().b : b;} double cyan() const {return red();} double magenta() const {return green();} double yellow() const {return blue();} double black() const {return gray();} double rgbsaturation() const {return max(max(r,g),b);} double cmyksaturation() const {return max(rgbsaturation(),black());} void greytorgb() { r=g=b=grey; grey=0.0; color=RGB; } void rgbtogrey() { grey=0.299*r+0.587*g+0.114*b; // Standard YUV luminosity coefficients r=g=b=0.0; color=GRAYSCALE; } void greytocmyk() { grey=1.0-grey; r=g=b=0.0; color=CMYK; } void rgbtocmyk() { double sat=rgbsaturation(); grey=1.0-sat; if(sat) { double scale=1.0/sat; r=1.0-r*scale; g=1.0-g*scale; b=1.0-b*scale; } color=CMYK; } void cmyktorgb() { double sat=1.0-grey; r=(1.0-r)*sat; g=(1.0-g)*sat; b=(1.0-b)*sat; grey=0.0; color=RGB; } void cmyktogrey() { cmyktorgb(); rgbtogrey(); } void togrey() { if(rgb()) rgbtogrey(); else if(cmyk()) cmyktogrey(); } void torgb() { if(cmyk()) cmyktorgb(); else if(grayscale()) greytorgb(); } void tocmyk() { if(rgb()) rgbtocmyk(); else if(grayscale()) greytocmyk(); } void settransparency(const pen& p) { transparency=p.transparency; } void setfont(const pen& p) { font=p.font; } void setfillrule(const pen& p) { fillrule=p.fillrule; } void convert() { if(settings::gray || settings::bw) { if(rgb()) rgbtogrey(); else if(cmyk()) cmyktogrey(); if(settings::bw) {grey=(grey == 1.0) ? 1.0 : 0.0;} } else if(settings::rgb && cmyk()) cmyktorgb(); else if(settings::cmyk && rgb()) rgbtocmyk(); } // Try to upgrade to the specified colorspace. bool promote(ColorSpace c) { if(color == c) return true; switch(color) { case PATTERN: case INVISIBLE: break; case DEFCOLOR: { return true; break; } break; case GRAYSCALE: { if(c == RGB) {greytorgb(); return true;} else if(c == CMYK) {greytocmyk(); return true;} break; } case RGB: { if(c == CMYK) {rgbtocmyk(); return true;} break; } case CMYK: { break; } } return false; } friend pen operator * (double x, const pen& q) { pen p=q; if(x < 0.0) x = 0.0; switch(p.color) { case PATTERN: case INVISIBLE: case DEFCOLOR: break; case GRAYSCALE: { p.grey *= x; p.greyrange(); break; } case RGB: { p.r *= x; p.g *= x; p.b *= x; p.rgbrange(); break; } case CMYK: { p.r *= x; p.g *= x; p.b *= x; p.grey *= x; p.cmykrange(); break; } } return p; } friend pen operator + (const pen& p, const pen& q) { pen P=p; pen Q=q; if(P.color == PATTERN && P.pattern.empty()) P.color=DEFCOLOR; ColorSpace colorspace=(ColorSpace) max((Int) P.color,(Int) Q.color); if(!(p.transparency.isdefault && q.transparency.isdefault)) P.transparency.opacity=max(p.opacity(),q.opacity()); switch(colorspace) { case PATTERN: case INVISIBLE: case DEFCOLOR: break; case GRAYSCALE: { P.grey += Q.grey; P.greyrange(); break; } case RGB: { if(P.color == GRAYSCALE) P.greytorgb(); else if(Q.color == GRAYSCALE) Q.greytorgb(); P.r += Q.r; P.g += Q.g; P.b += Q.b; P.rgbrange(); break; } case CMYK: { if(P.color == GRAYSCALE) P.greytocmyk(); else if(Q.color == GRAYSCALE) Q.greytocmyk(); if(P.color == RGB) P.rgbtocmyk(); else if(Q.color == RGB) Q.rgbtocmyk(); P.r += Q.r; P.g += Q.g; P.b += Q.b; P.grey += Q.grey; P.cmykrange(); break; } } return pen(q.line.isdefault ? p.line : q.line, q.linewidth == DEFWIDTH ? p.linewidth : q.linewidth, q.P.empty() ? p.P : q.P, q.font.empty() ? p.font : q.font, q.fontsize == 0.0 ? p.fontsize : q.fontsize, q.lineskip == 0.0 ? p.lineskip : q.lineskip, colorspace,P.r,P.g,P.b,P.grey, q.pattern == DEFPAT ? p.pattern : q.pattern, q.fillrule == DEFFILL ? p.fillrule : q.fillrule, q.baseline == DEFBASE ? p.baseline : q.baseline, q.transparency.isdefault ? p.transparency : q.transparency, q.linecap == DEFCAP ? p.linecap : q.linecap, q.linejoin == DEFJOIN ? p.linejoin : q.linejoin, q.miterlimit == DEFMITER ? p.miterlimit : q.miterlimit, q.overwrite == DEFWRITE ? p.overwrite : q.overwrite, q.t.isNull() ? p.t : q.t); } friend pen interpolate(const pen& p, const pen& q, double t) { pen P=p; pen Q=q; if(P.color == PATTERN && P.pattern.empty()) P.color=DEFCOLOR; ColorSpace colorspace=(ColorSpace) max((Int) P.color,(Int) Q.color); switch(colorspace) { case PATTERN: case INVISIBLE: case DEFCOLOR: case GRAYSCALE: break; case RGB: { if(P.color == GRAYSCALE) P.greytorgb(); else if(Q.color == GRAYSCALE) Q.greytorgb(); break; } case CMYK: { if(P.color == GRAYSCALE) P.greytocmyk(); else if(Q.color == GRAYSCALE) Q.greytocmyk(); if(P.color == RGB) P.rgbtocmyk(); else if(Q.color == RGB) Q.rgbtocmyk(); break; } } return (1-t)*P+t*Q; } friend bool operator == (const pen& p, const pen& q) { return *(p.linetype()) == *(q.linetype()) && p.width() == q.width() && p.Path() == q.Path() && p.Font() == q.Font() && p.Lineskip() == q.Lineskip() && p.size() == q.size() && p.colorspace() == q.colorspace() && (!(p.grayscale() || p.cmyk()) || p.gray() == q.gray()) && (!(p.rgb() || p.cmyk()) || (p.red() == q.red() && p.green() == q.green() && p.blue() == q.blue())) && p.pattern == q.pattern && p.Fillrule() == q.Fillrule() && p.Baseline() == q.Baseline() && p.transp() == q.transp() && p.cap() == q.cap() && p.join() == q.join() && p.miter() == q.miter() && p.Overwrite() == q.Overwrite() && p.t == q.t; } friend bool operator != (const pen& p, const pen& q) { return !(p == q); } friend ostream& operator << (ostream& out, const pen& p) { out << "("; if(p.line.isdefault) out << "default"; else out << p.line.pattern; if(p.line.offset) out << p.line.offset; if(!p.line.scale) out << " bp"; if(!p.line.adjust) out << " fixed"; if(p.linewidth != DEFWIDTH) out << ", linewidth=" << p.linewidth; if(!p.P.empty()) out << ", path=" << p.P; if(p.linecap != DEFCAP) out << ", linecap=" << Cap[p.linecap]; if(p.linejoin != DEFJOIN) out << ", linejoin=" << Join[p.linejoin]; if(p.miterlimit != DEFMITER) out << ", miterlimit=" << p.miterlimit; if(!p.font.empty()) out << ", font=\"" << p.font << "\""; if(p.fontsize) out << ", fontsize=" << p.fontsize; if(p.lineskip) out << ", lineskip=" << p.lineskip; if(p.color == INVISIBLE) out << ", invisible"; else if(p.color == GRAYSCALE) out << ", gray=" << p.grey; else if(p.color == RGB) out << ", red=" << p.red() << ", green=" << p.green() << ", blue=" << p.blue(); else if(p.color == CMYK) out << ", cyan=" << p.cyan() << ", magenta=" << p.magenta() << ", yellow=" << p.yellow() << ", black=" << p.black(); if(p.pattern != DEFPAT) out << ", pattern=" << "\"" << p.pattern << "\""; if(p.fillrule != DEFFILL) out << ", fillrule=" << FillRuleTag[p.fillrule]; if(p.baseline != DEFBASE) out << ", baseline=" << BaseLineTag[p.baseline]; if(!p.transparency.isdefault) { out << ", opacity=" << p.transparency.opacity; out << ", blend=" << p.transparency.blend; } if(p.overwrite != DEFWRITE) out << ", overwrite=" << OverwriteTag[p.overwrite]; if(!p.t.isNull()) out << ", transform=" << p.t; out << ")"; return out; } const transform getTransform() const { return t.isNull() ? defaultpen().t : t; } // The bounds of the circle or ellipse the pen describes. bbox bounds() const { double maxx, maxy; pair shift; if(!P.empty()) return P.bounds(); transform t=getTransform(); if(t.isIdentity()) { maxx = 1; maxy = 1; shift = pair(0,0); } else { double xx = t.getxx(), xy = t.getxy(), yx = t.getyx(), yy = t.getyy(); // These are the maximum x and y values that a linear transform can map // a point in the unit circle. This can be proven by the Lagrange // Multiplier theorem or by properties of the dot product. maxx = length(pair(xx,xy)); maxy = length(pair(yx,yy)); shift = t*pair(0,0); } bbox b; pair z=0.5*width()*pair(maxx,maxy); b += z + shift; b += -z + shift; return b; } friend pen transformed(const transform& t, const pen& p) { pen ret = p; if(!p.P.empty()) ret.P = p.P.transformed(t); ret.t = p.t.isNull() ? t : t*p.t; return ret; } }; pen transformed(const transform& t, const pen &p); } #endif asymptote-3.05/pen.cc0000644000000000000000000000307215031566105013261 0ustar rootroot/***** * pen.cc * John Bowman * *****/ #include "pen.h" #include "drawelement.h" namespace camp { const char* DEFPAT=""; const char* DEFLATEXFONT="\\usefont{\\ASYencoding}{\\ASYfamily}{\\ASYseries}{\\ASYshape}"; const char* DEFCONTEXTFONT="modern"; const char* DEFTEXFONT="cmr12"; const double DEFWIDTH=-1; const Int DEFCAP=-1; const Int DEFJOIN=-1; const double DEFMITER=0; const transform nullTransform=transform(0.0,0.0,0.0,0.0,0.0,0.0); const char* PSCap[]={"butt","round","square"}; const char* Cap[]={"square","round","extended"}; const Int nCap=sizeof(Cap)/sizeof(char*); const char* Join[]={"miter","round","bevel"}; const Int nJoin=sizeof(Join)/sizeof(char*); const char* OverwriteTag[]={"Allow","Suppress","SupressQuiet", "Move","MoveQuiet"}; const Int nOverwrite=sizeof(OverwriteTag)/sizeof(char*); const char* FillRuleTag[]={"ZeroWinding","EvenOdd"}; const Int nFill=sizeof(FillRuleTag)/sizeof(char*); const char* BaseLineTag[]={"NoAlign","Align"}; const Int nBaseLine=sizeof(BaseLineTag)/sizeof(char*); const char* ColorDeviceSuffix[]={"","","Gray","RGB","CMYK",""}; const unsigned nColorSpace=sizeof(ColorDeviceSuffix)/sizeof(char*); const char* BlendMode[]={"Compatible","Normal","Multiply","Screen", "Overlay","SoftLight","HardLight", "ColorDodge","ColorBurn","Darken", "Lighten","Difference","Exclusion", "Hue","Saturation","Color","Luminosity"}; const Int nBlendMode=sizeof(BlendMode)/sizeof(char*); pen drawElement::lastpen; } asymptote-3.05/cmake-scripts/0000755000000000000000000000000015031566105014733 5ustar rootrootasymptote-3.05/cmake-scripts/tests-wce.cmake0000644000000000000000000000061715031566105017657 0ustar rootrootadd_test( NAME "wce" COMMAND ${CMAKE_COMMAND} -DASY_EXEC=$ -DASY_BASE_DIR=${ASY_BUILD_BASE_DIR} -DSOURCE_ROOT=${CMAKE_CURRENT_SOURCE_DIR} -P ${ASY_MISC_CMAKE_SCRIPTS_DIR}/wce.script.cmake WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) set_property( TEST wce PROPERTY LABELS asy-check-tests ) asymptote-3.05/cmake-scripts/asy-macro.cmake0000644000000000000000000000240215031566105017626 0ustar rootrootif (NOT ASY_VERSION_OVERRIDE) if (ASY_ADDR_VERSION_SUFFIX_FILE STREQUAL "NOTFOUND") if (CMAKE_BUILD_TYPE IN_LIST cmake_debug_build_types) set(ASY_VERSION_SUFFIX "+debug") endif() endif() set(ASY_VERSION "${ASY_VERSION_BASE}${ASY_VERSION_SUFFIX}") else() message(STATUS "Override version specified") set(ASY_VERSION ${ASY_VERSION_OVERRIDE}) endif() message(STATUS "Asymptote version: ${ASY_VERSION}") list(APPEND ASY_MACROS PACKAGE_NAME="${ASY_PACKAGE_NAME}" PACKAGE_VERSION="${ASY_VERSION}" PACKAGE_BUGREPORT="${ASY_BUGREPORT}" PACKAGE_STRING="${ASY_PACKAGE_NAME} ${ASY_VERSION}" ) # Since we require C++11 and up, some macros are automatically included list(APPEND ASY_MACROS HAVE_UNORDERED_MAP HAVE_STRFTIME _USE_MATH_DEFINES ) if (DEBUG_GC_ENABLE) list(APPEND ASY_MACROS GC_DEBUG) endif() if (DEBUG_GC_BACKTRACE_ENABLE) list(APPEND ASY_MACROS GC_BACKTRACE) endif() if (CMAKE_BUILD_TYPE IN_LIST cmake_debug_build_types) list(APPEND ASY_MACROS DEBUG) endif() if (CTAN_BUILD) list(APPEND ASY_MACROS CTAN_BUILD) endif() if (ENABLE_COMPACT_ZERO_BUILD) message(STATUS "Setting COMPACT=0. Ensure this is not a production build.") list(APPEND ASY_MACROS COMPACT=0) endif() asymptote-3.05/cmake-scripts/thirdparty-impl.cmake0000644000000000000000000000050015031566105021061 0ustar rootroot# tinyexr set(TINYEXR_REPO_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/tinyexr CACHE INTERNAL "tinyexr repo location") add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty_impl/tinyexr_impl/) list(APPEND ASY_STATIC_LIBARIES tinyexr-impl) list(APPEND ASYMPTOTE_INCLUDES $) asymptote-3.05/cmake-scripts/subrepo-projects.cmake0000644000000000000000000000553015031566105021246 0ustar rootrootset(ASY_SUBREPO_CLONE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}) set(LSP_REPO_ROOT ${ASY_SUBREPO_CLONE_ROOT}/LspCpp) set(TINYEXR_SUBREPO_ROOT ${ASY_SUBREPO_CLONE_ROOT}/tinyexr) set(BOEHM_GC_ROOT ${ASY_SUBREPO_CLONE_ROOT}/gc) set(LIBATOMIC_OPS_ROOT ${ASY_SUBREPO_CLONE_ROOT}/libatomic_ops) # boehm gc if (ENABLE_GC) set(enable_gpl OFF CACHE INTERNAL "libatomicops gpl libs option") add_subdirectory(${LIBATOMIC_OPS_ROOT}) set(OLD_CFLAG_EXTRA ${CFLAG_EXTRA}) set(CFLAGS_EXTRA -I${LIBATOMIC_OPS_ROOT}/src) # for bdwgc set(OLD_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS}) set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "bdwgc shared libs flag") set(enable_cplusplus ON CACHE INTERNAL "bdwgc enable C++") set(without_libatomic_ops ON CACHE INTERNAL "bdwgc use libatomic ops") add_subdirectory(${BOEHM_GC_ROOT}) set(CFLAG_EXTRA ${OLD_CFLAG_EXTRA}) unset(BUILD_SHARED_LIBS CACHE) set(BUILD_SHARED_LIBS ${OLD_BUILD_SHARED_LIBS}) list(APPEND ASY_STATIC_LIBARIES gc gccpp atomic_ops) if (WIN32) list(APPEND ASY_MACROS GC_NOT_DLL) endif() # We use #include as opposed to (and also for other gc include files) to allow # linking directly to the compiled source for testing different GC versions. # In GC tarballs downloaded from https://www.hboehm.info/gc/, the header files are in include/gc.h, and not # include/gc/gc.h, hence we need a way to allow inclusion of "gc.h". In vcpkg gc distributions, the include # files are provided in include/gc/gc.h (and other files). Hence we append "/gc" to the include directories. if (WIN32) list(APPEND ASY_STATIC_LIBARIES gctba) endif() list(APPEND ASY_MACROS USEGC) else() message(STATUS "Disabling gc support") endif() if (ENABLE_LSP) message(STATUS "LSP Enabled.") # disable New Boost version warning set(Boost_NO_WARN_NEW_VERSIONS 1) set(USE_SYSTEM_RAPIDJSON ON CACHE INTERNAL "Use system rapidjson") set(LSPCPP_USE_CPP17 ON CACHE INTERNAL "C++17 mode") # For transitive URI dependency set(Uri_BUILD_DOCS OFF CACHE INTERNAL "build docs for uri") set(Uri_BUILD_TESTS OFF CACHE INTERNAL "build tests for uri") if (WIN32) set(LSPCPP_WIN32_WINNT_VALUE ${ASY_WIN32_WINVER_VERSION} CACHE INTERNAL "lsp win32 winver value") endif() if (ENABLE_GC) set(LSPCPP_SUPPORT_BOEHM_GC ON CACHE INTERNAL "Use boehm GC") set(LSPCPP_GC_DOWNLOADED_ROOT ${BOEHM_GC_ROOT} CACHE INTERNAL "gc root for lsp") set(LSPCPP_GC_STATIC ON CACHE INTERNAL "lsp use static gc") endif() add_subdirectory(${LSP_REPO_ROOT}) list(APPEND ASY_STATIC_LIBARIES lspcpp) list(APPEND ASY_MACROS HAVE_LSP=1) else() # only include lsp libraries message(STATUS "LSP Disabled. Will not have language server protocol support.") list(APPEND ASYMPTOTE_INCLUDES ${LSP_REPO_ROOT}/include) endif() asymptote-3.05/cmake-scripts/asy-base-files.cmake0000644000000000000000000000620015031566105020537 0ustar rootrootset(ASY_STATIC_BASE_FILES animate animation annotate babel bezulate binarytree bsp CAD colormap contour3 contour drawtree embed external feynman flowchart fontsize geometry graph3 graph graph_settings graph_splinetype grid3 interpolate labelpath3 labelpath lmfit map mapArray markers math metapost obj ode palette patterns plain_arcs plain_arrows plain plain_bounds plain_boxes plain_constants plain_debugger plain_filldraw plain_Label plain_margins plain_markers plain_paths plain_pens plain_picture plain_prethree plain_scaling plain_shipout plain_strings pstoedit rational rationalSimplex roundedpath simplex size10 size11 slide slopefield smoothcontour3 solids stats syzygy simplex2 texcolors three_arrows three three_light three_margins three_surface three_tube tree trembling tube v3d x11colors ) set(ASY_STATIC_SHADER_FILES blend compress count fragment screen sum1 sum2 sum2fast sum3 vertex zero ) set(OTHER_STATIC_BASE_FILES nopapersize.ps) # base dir set(ASY_SOURCE_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/base) set(ASY_BUILD_BASE_DIR ${CMAKE_CURRENT_BINARY_DIR}/base) file(MAKE_DIRECTORY ${ASY_BUILD_BASE_DIR}) # version.asy configure_file(${ASY_RESOURCE_DIR}/versionTemplate.asy.in ${ASY_BUILD_BASE_DIR}/version.asy) list(APPEND ASY_OUTPUT_BASE_FILES ${ASY_BUILD_BASE_DIR}/version.asy) # copy base files to build dir macro (copy_base_file_with_custom_output_name base_file_name output_file_name) add_custom_command( COMMAND ${CMAKE_COMMAND} -E copy ${ASY_SOURCE_BASE_DIR}/${base_file_name} ${ASY_BUILD_BASE_DIR}/${output_file_name} OUTPUT ${ASY_BUILD_BASE_DIR}/${output_file_name} MAIN_DEPENDENCY ${ASY_SOURCE_BASE_DIR}/${base_file_name} ) list(APPEND ASY_OUTPUT_BASE_FILES ${ASY_BUILD_BASE_DIR}/${output_file_name}) endmacro() macro (copy_base_file base_file_name) copy_base_file_with_custom_output_name(${base_file_name} ${base_file_name}) endmacro() foreach(ASY_STATIC_BASE_FILE ${ASY_STATIC_BASE_FILES}) copy_base_file(${ASY_STATIC_BASE_FILE}.asy) endforeach () foreach(OTHER_STATIC_BASE_FILE ${OTHER_STATIC_BASE_FILES}) copy_base_file(${OTHER_STATIC_BASE_FILE}) endforeach () file(MAKE_DIRECTORY ${ASY_BUILD_BASE_DIR}/shaders) foreach(ASY_STATIC_SHADER_FILE ${ASY_STATIC_SHADER_FILES}) copy_base_file(shaders/${ASY_STATIC_SHADER_FILE}.glsl) endforeach () # generated csv files foreach(csv_enum_file ${ASY_CSV_ENUM_FILES}) add_custom_command( OUTPUT ${ASY_BUILD_BASE_DIR}/${csv_enum_file}.asy COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/generate_enums.py --language asy --name ${csv_enum_file} --input ${ASY_RESOURCE_DIR}/${csv_enum_file}.csv --output ${ASY_BUILD_BASE_DIR}/${csv_enum_file}.asy MAIN_DEPENDENCY ${ASY_RESOURCE_DIR}/${csv_enum_file}.csv ) list(APPEND ASY_OUTPUT_BASE_FILES ${ASY_BUILD_BASE_DIR}/${csv_enum_file}.asy) endforeach () # asygl file(MAKE_DIRECTORY ${ASY_BUILD_BASE_DIR}/webgl) copy_base_file_with_custom_output_name(webgl/asygl-${ASY_GL_VERSION}.js webgl/asygl.js) asymptote-3.05/cmake-scripts/vcpkg-features.cmake0000644000000000000000000000126315031566105020665 0ustar rootrootif (ENABLE_READLINE) list(APPEND VCPKG_MANIFEST_FEATURES readline) endif() if (ENABLE_CURL) list(APPEND VCPKG_MANIFEST_FEATURES curl) endif() if (ENABLE_GSL) list(APPEND VCPKG_MANIFEST_FEATURES gsl) endif() if (ENABLE_EIGEN3) list(APPEND VCPKG_MANIFEST_FEATURES eigen3) endif() if (ENABLE_FFTW3) list(APPEND VCPKG_MANIFEST_FEATURES fftw3) endif() if (ENABLE_OPENGL) list(APPEND VCPKG_MANIFEST_FEATURES opengl) endif() if (ENABLE_THREADING) list(APPEND VCPKG_MANIFEST_FEATURES threading) endif() if (ENABLE_ASY_CXXTEST) list(APPEND VCPKG_MANIFEST_FEATURES build-cxx-testing) endif() if (ENABLE_LSP) list(APPEND VCPKG_MANIFEST_FEATURES lsp) endif() asymptote-3.05/cmake-scripts/basic-parameters.cmake0000644000000000000000000000057315031566105021164 0ustar rootrootset(ASY_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(ASY_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(ASY_RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(ASY_SRC_TEMPLATES_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(ASY_SCRIPTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(ASY_DOC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/doc) set(ASY_MISC_CMAKE_SCRIPTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cmake-scripts/scripts) asymptote-3.05/cmake-scripts/buildfiles-to-src.cmake0000644000000000000000000000025715031566105021270 0ustar rootrootmacro(build_files_to_src in_var out_var) list(TRANSFORM ${in_var} PREPEND ${ASY_SRC_DIR}/ OUTPUT_VARIABLE ${out_var}) list(TRANSFORM ${out_var} APPEND .cc) endmacro() asymptote-3.05/cmake-scripts/scripts/0000755000000000000000000000000015031566105016422 5ustar rootrootasymptote-3.05/cmake-scripts/scripts/wce.script.cmake0000644000000000000000000000075515031566105021514 0ustar rootroot# testing for wce. Equivalent to ./wce script execute_process( COMMAND ${ASY_EXEC} -q -sysdir ${ASY_BASE_DIR} -noautoplain -debug errortest WORKING_DIRECTORY ${SOURCE_ROOT} ERROR_VARIABLE ASY_STDERR_OUTPUT ) file(READ ${SOURCE_ROOT}/errors EXPECTED_ERROR_OUTPUT) if (NOT ASY_STDERR_OUTPUT STREQUAL EXPECTED_ERROR_OUTPUT) message(FATAL_ERROR "Asymptote error test fails.") else() message(STATUS "Asymptote error messages equal expected. Test passes") endif() asymptote-3.05/cmake-scripts/tests-asy.cmake0000644000000000000000000000412515031566105017673 0ustar rootroot# ---- asy tests ------ set(ASY_ASYLANG_TEST_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/tests) set(ASY_ASYLANG_TEST_SCRATCH_DIR ${ASY_ASYLANG_TEST_ROOT}/out/) function(add_individual_asy_tests) set(fn_opts) set(fn_oneval_args DIR FILE ADDR_ASY_ARGS) set(fn_multival_args TEST_LABELS) cmake_parse_arguments( ASY_TEST "${fn_opts}" "${fn_oneval_args}" "${fn_multival_args}" ${ARGN} ) set(TEST_PATH ${ASY_ASYLANG_TEST_ROOT}/${ASY_TEST_DIR}/${ASY_TEST_FILE}.asy) set(TEST_NAME "asy.${ASY_TEST_DIR}.${ASY_TEST_FILE}") add_test( NAME ${TEST_NAME} COMMAND asy -dir ${ASY_BUILD_BASE_DIR} ${TEST_PATH} -noV -o out -globalwrite ${ASY_TEST_ADDR_ASY_ARGS} WORKING_DIRECTORY ${ASY_ASYLANG_TEST_ROOT} ) if (ASY_TEST_TEST_LABELS) set_property( TEST ${TEST_NAME} PROPERTY LABELS ${ASY_TEST_TEST_LABELS} ) endif() endfunction() macro(add_asy_tests) set(macro_opts TEST_NOT_PART_OF_CHECK_TEST) set(macro_oneval_args TEST_DIR ADDR_ASY_ARGS) set(macro_multival_args TESTS TEST_ARTIFACTS) cmake_parse_arguments( ASY_TESTING "${macro_opts}" "${macro_oneval_args}" "${macro_multival_args}" ${ARGN} ) foreach(testfile ${ASY_TESTING_TESTS}) if (ASY_TESTING_TEST_NOT_PART_OF_CHECK_TEST) set(TEST_LABEL asy-extended-tests) else() set(TEST_LABEL asy-check-tests) endif() add_individual_asy_tests( DIR ${ASY_TESTING_TEST_DIR} FILE ${testfile} ADDR_ASY_ARGS ${ASY_TESTING_ADDR_ASY_ARGS} TEST_LABELS ${TEST_LABEL} ) endforeach() foreach(artifact ${ASY_TESTING_TEST_ARTIFACTS}) set_property( TARGET asy APPEND PROPERTY ADDITIONAL_CLEAN_FILES ${ASY_ASYLANG_TEST_SCRATCH_DIR}/${artifact} ) endforeach() endmacro() # ------ tests ---------- include(${CMAKE_CURRENT_LIST_DIR}/generated/asy-tests-list.cmake) asymptote-3.05/cmake-scripts/gnu-install-macros.cmake0000644000000000000000000000075715031566105021465 0ustar rootroot# Only run on unix-like systems, windows does not use gnu docpath/syspath locations if (UNIX) include(GNUInstallDirs) if (CTAN_BUILD) set(ASYMPTOTE_SYSDIR_VALUE "") else() set(ASYMPTOTE_SYSDIR_VALUE ${CMAKE_INSTALL_FULL_DATADIR}/asymptote) endif() set(ASYMPTOTE_DOCDIR_VALUE ${CMAKE_INSTALL_FULL_DATADIR}/doc/asymptote) list(APPEND ASY_MACROS ASYMPTOTE_SYSDIR="${ASYMPTOTE_SYSDIR_VALUE}" ASYMPTOTE_DOCDIR="${ASYMPTOTE_DOCDIR_VALUE}" ) endif() asymptote-3.05/cmake-scripts/options.cmake0000644000000000000000000002453215031566105017436 0ustar rootrootinclude(CMakeDependentOption) # version override set( ASY_VERSION_OVERRIDE "" CACHE STRING "Overriding asymptote version. If left blank, version is determined from configure.ac." ) # Perl set(PERL_INTERPRETER "" CACHE STRING "Perl interpreter. If left empty, will try to determine interpreter automatically") if(NOT PERL_INTERPRETER) message(STATUS "No Perl interpreter specified, attempting to find perl") find_program( PERL_INTERPRETER_FOUND perl REQUIRED ) message(STATUS "Found perl at ${PERL_INTERPRETER_FOUND}") set(PERL_INTERPRETER ${PERL_INTERPRETER_FOUND} CACHE STRING "" FORCE) endif() execute_process(COMMAND ${PERL_INTERPRETER} -e "print \"$]\"" OUTPUT_VARIABLE PERL_VERSION) message(STATUS "Perl version: ${PERL_VERSION}") # Python set(PY3_INTERPRETER "" CACHE STRING "Python 3 interpreter. If left empty, will try to determine Python automatically") function(verify_py3_interpreter_is_py3 validator_result_var py_interpreter) execute_process( COMMAND ${py_interpreter} -c "import sys; print(int(sys.version[0])>=3,end='')" OUTPUT_VARIABLE PY3_INTERPRETER_VERSION_RESULT) if (NOT PY3_INTERPRETER_VERSION_RESULT STREQUAL "True") set(${validator_result_var} FALSE PARENT_SCOPE) endif() endfunction() if(NOT PY3_INTERPRETER) message(STATUS "No Python3 interpreter specified, attempting to find python") find_program( PY3_INTERPRETER_FOUND NAMES python3 python VALIDATOR verify_py3_interpreter_is_py3 REQUIRED ) message(STATUS "Found python3 at ${PY3_INTERPRETER_FOUND}") set(PY3_INTERPRETER ${PY3_INTERPRETER_FOUND} CACHE STRING "" FORCE) else() set(PY_INTERPRETER_IS_PY3 TRUE) set(VARIABLE_RESULT_VAR PY_INTERPRETER_IS_PY3) verify_py3_interpreter_is_py3(VARIABLE_RESULT_VAR ${PY3_INTERPRETER}) if (NOT PY_INTERPRETER_IS_PY3) message(FATAL_ERROR "Specified python interpreter cannot be used as python3 interpreter!") endif() endif() execute_process(COMMAND ${PY3_INTERPRETER} --version OUTPUT_VARIABLE PY3_VERSION) message(STATUS "Version: ${PY3_VERSION}") # windows flex + bison set( WIN32_FLEX_BINARY "" CACHE STRING "Flex binary for windows. If not specified, downloads from winflexibson. This option is inert on UNIX systems" ) set( WIN32_BISON_BINARY "" CACHE STRING "Bison binary for windows. If not specified, downloads from winflexbison. This option is inert on UNIX systems" ) # feature libraries option(ENABLE_GC "enable boehm gc support" true) option(ENABLE_CURL "enable curl support" true) option(ENABLE_READLINE "libreadline" true) option(ENABLE_THREADING "enable threading support" true) option(ENABLE_GSL "Enable GSL support" true) option(ENABLE_EIGEN3 "Enable eigen3 support" true) option(ENABLE_FFTW3 "Enable fftw3 support" true) option(ENABLE_OPENGL "Whether to enable opengl or not." true) cmake_dependent_option(ENABLE_GL_COMPUTE_SHADERS "Whether to enable compute shaders for OpenGL. Requires OpenGL >= 4.3 and GL_ARB_compute_shader" true "ENABLE_OPENGL" false) cmake_dependent_option(ENABLE_GL_SSBO "Whether to enable compute SSBO. Requires OpenGL >= 4.3 and GL_ARB_shader_storage_buffer_object" true "ENABLE_OPENGL" false) option( ENABLE_RPC_FEATURES "Whether to enable XDR/RPC features. Also enables V3D. If compiling on UNIX systems, requires libtirpc to be installed." true) # Additional options option(DEBUG_GC_ENABLE "Enable debug mode for gc" false) option(DEBUG_GC_BACKTRACE_ENABLE "Enable backtrace for gc" false) option(CTAN_BUILD "Build for CTAN." false) option( ENABLE_COMPACT_ZERO_BUILD "\ Set COMPACT flag to 0. \ Unless if building for debugging/testing with an explicit need for additional type verification, \ this option should be turned off." false) # additional optimization options if (CMAKE_BUILD_TYPE IN_LIST cmake_release_build_types) set(default_lto true) else() set(default_lto false) endif() option(OPTIMIZE_LINK_TIME "Enable link-time optimization. Enabled by default in release build types" ${default_lto}) # testing option(ENABLE_ASY_CXXTEST "Enable C++-side testing. This option is inert for final asy libraries and binaries" true) option( DOWNLOAD_GTEST_FROM_SRC "Download google test from googletest's github repo. Otherwise use system libraries." true) # msvc-specific # The only reason this option is here is because msvc compiler (cl.exe) does not partial preprocessing # (e.g. ignore missing headers and treat them as generated files or depfile generation with missing headers) # We use MSVC compiler for all C++ compilation/linking set(GCCCOMPAT_CXX_COMPILER_FOR_MSVC "" CACHE STRING "gcc-compatible C++ compiler for preprocessing with MSVC toolchain. This option is inert if not using MSVC. This option is only used for preprocessing, it is not used for compilation." ) # CUDA + asy cuda reflect include(CheckLanguage) check_language(CUDA) if (CMAKE_CUDA_COMPILER) set(CAN_COMPILE_CUDA_REFLECT true) endif() cmake_dependent_option( ENABLE_CUDA_ASY_REFLECT "Enable target for reflect excutable for generating IBL lighting data. Requires CUDA installed and a CUDA-compatible NVIDIA Graphics card" true "CAN_COMPILE_CUDA_REFLECT" false ) # Language server protocol option( ENABLE_LSP "Enable Language Server Protocol support." true ) # documentation set(WIN32_TEXINDEX "WSL" CACHE STRING "Location to texindex for windows, or WSL to use internal WSL wrapper. Inert for non-windows systems.") function(determine_asymptote_pdf_gen_possible_win32) # windows doesn't have an up-to-date # texi2dvi release in multiple years, so # we are using MikTeX's texify find_program(TEXIFY texify) if (NOT TEXIFY) message(STATUS "texify not found; will not enable docgen by default") set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE false PARENT_SCOPE) return() endif() if (NOT WIN32_TEXINDEX) message(STATUS "texindex for windows not given; will not enable docgen by default") set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE false PARENT_SCOPE) return() endif() # another issue is that if (WIN32_TEXINDEX STREQUAL WSL) execute_process( COMMAND wsl sh -c "which texindex >/dev/null 2>/dev/null && echo OK" OUTPUT_VARIABLE TEXINDEX_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE ) if (NOT TEXINDEX_RESULT STREQUAL "OK") message(STATUS "Cannot execute texindex on wsl; will not enable docgen by default") set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE false PARENT_SCOPE) return() endif() endif() message(STATUS "Building of asymptote.pdf is possible; enabling") set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE true PARENT_SCOPE) endfunction() set(ENABLE_BASE_DOCGEN_POSSIBLE false) set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE false) # finding latex and other programs needed # pdflatex find_package(LATEX COMPONENTS PDFLATEX) # pdftex set(PDFTEX_EXEC "" CACHE STRING "pdftex. If left empty, will try to determine interpreter automatically") if (NOT PDFTEX) message(STATUS "No pdftex specified, attempting to find pdftex") find_program( PDFTEX_EXEC_FOUND pdftex ) if (PDFTEX_EXEC_FOUND) message(STATUS "Found pdftex at ${PDFTEX_EXEC_FOUND}") set(PDFTEX_EXEC ${PDFTEX_EXEC_FOUND} CACHE STRING "" FORCE) endif() endif() if (LATEX_PDFLATEX_FOUND AND PDFTEX_EXEC) set(ENABLE_BASE_DOCGEN_POSSIBLE true) message(STATUS "LaTeX and pdftex found; building basic documentation is possible") if (WIN32) determine_asymptote_pdf_gen_possible_win32() elseif(UNIX) find_program(TEXI2DVI texi2dvi) if (TEXI2DVI) set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE true) message("Building of asymptote.pdf is possible and enabled") endif() endif() endif() set( EXTERNAL_DOCUMENTATION_DIR "" CACHE STRING "If specified, installation will use files from this directory as documentation. In particular, - if ENABLE_DOCGEN and ENABLE_ASYMPTOTE_PDF_DOCGEN is enabled and the system has the capability to build all documentation files, this option is inert. - if ENABLE_DOCGEN is enabled but ENABLE_ASYMPTOTE_PDF_DOCGEN is disabled or if the system cannot produce asymptote.pdf, only asymptote.pdf will be copied from this directory. - if ENABLE_DOCGEN is disabled, every documentation file will be copied from this directory. " ) cmake_dependent_option( ENABLE_DOCGEN "Enable basic document generation. Requires pdflatex" true "ENABLE_BASE_DOCGEN_POSSIBLE" false ) cmake_dependent_option( ENABLE_ASYMPTOTE_PDF_DOCGEN "Enable asymptote.pdf document generation. Requires texinfo, and additionally WSL + texindex on windows." true "ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE;ENABLE_DOCGEN" false ) # misc files option( ENABLE_MISCFILES_GEN "Enable generation of non-essential, non-documentation asymptote files (e.g. asy.list, asy-keywords.el) " true ) # warnings if external docs dir is not given if (NOT EXTERNAL_DOCUMENTATION_DIR) if (NOT ENABLE_DOCGEN) message(STATUS "Build is not generating documentation. If you are planning on generating installation files, please make sure you have access to documentation files in a directory and specify this directory in EXTERNAL_DOCUMENTATION_DIR cache variable. ") elseif(NOT ENABLE_ASYMPTOTE_PDF_DOCGEN) message(STATUS "Build is not generating asymptote.pdf. If you are planning on generating installation files, please make sure you have access to asymptote.pdf in a directory and specify this directory in EXTERNAL_DOCUMENTATION_DIR cache variable. ") endif() if (NOT ENABLE_MISCFILES_GEN) message(STATUS "Build is not generating non-essential, non-documentation asymptote files. If you are planning on generating installation files, please make sure you have access to asy-keywords.el in a directory and specify this directory in EXTERNAL_DOCUMENTATION_DIR cache variable. ") endif() endif() # windows-specific installation option( ALLOW_PARTIAL_INSTALLATION "Allow installation to go through, even if not every component is buildable. CMake will produce a warning instead of a fatal error." false ) asymptote-3.05/cmake-scripts/asy-files.cmake0000644000000000000000000000245015031566105017632 0ustar rootrootset(ASYMPTOTE_INCLUDES ${ASY_INCLUDE_DIR}) set(CAMP_BUILD_FILES camperror path drawpath drawlabel picture psfile texfile util settings guide flatguide knot drawfill path3 drawpath3 drawsurface beziercurve bezierpatch pen pipestream ) set(RUNTIME_BUILD_FILES runtime runbacktrace runpicture runlabel runhistory runarray runfile runsystem runpair runtriple runpath runpath3d runstring runmath ) set(SYMBOL_STATIC_BUILD_FILES types builtin gsl) set(SYMBOL_BUILD_FILES ${RUNTIME_BUILD_FILES} ${SYMBOL_STATIC_BUILD_FILES}) set(GENERATED_SOURCE_BUILD_FILES ${SYMBOL_BUILD_FILES} camp.tab lex.yy ) set(CORE_BUILD_FILES ${CAMP_BUILD_FILES} ${SYMBOL_STATIC_BUILD_FILES} env genv stm dec errormsg callable name symbol entry exp newexp stack exithandlers access virtualfieldaccess absyn record interact fileio fftw++asy parallel simpson coder coenv impdatum locate asyparser program application varinit fundec refaccess envcompleter asyprocess constructor array memory Delaunay predicates glrender tr shaders jsfile v3dfile EXRFiles GLTextures lspserv symbolmaps win32helpers win32pipestream win32xdr xstream lspdec lspexp lspfundec lspstm ) set(ASY_CSV_ENUM_FILES v3dtypes v3dheadertypes) asymptote-3.05/cmake-scripts/generated-files.cmake0000644000000000000000000002107215031566105020775 0ustar rootroot# generated include directories set(GENERATED_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated/include") file(MAKE_DIRECTORY ${GENERATED_INCLUDE_DIR}) # directory for auxilliary files set(GENERATED_AUX_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated/auxiliary") file(MAKE_DIRECTORY ${GENERATED_AUX_DIR}) # generated sources set(GENERATED_SRC_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated/src") file(MAKE_DIRECTORY ${GENERATED_SRC_DIR}) # opsymbols.h add_custom_command( OUTPUT ${GENERATED_INCLUDE_DIR}/opsymbols.h COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/opsymbols.py --campfile ${ASY_RESOURCE_DIR}/camp.l --output ${GENERATED_INCLUDE_DIR}/opsymbols.h MAIN_DEPENDENCY ${ASY_RESOURCE_DIR}/camp.l DEPENDS ${ASY_SCRIPTS_DIR}/opsymbols.py ) list(APPEND ASYMPTOTE_INCLUDES ${GENERATED_INCLUDE_DIR}) list(APPEND ASYMPTOTE_GENERATED_HEADERS ${GENERATED_INCLUDE_DIR}/opsymbols.h) list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${GENERATED_INCLUDE_DIR}/opsymbols.h) # run-* files function(_int_add_runtime_file runtime_file) set(RUNTIME_FILE_IN_BASE ${ASY_SRC_TEMPLATES_DIR}/${runtime_file}) set(RUNTIME_FILES_OUT ${GENERATED_SRC_DIR}/${runtime_file}.cc ${GENERATED_INCLUDE_DIR}/${runtime_file}.h) set(RUNTIME_SCRIPT ${ASY_SCRIPTS_DIR}/runtime.pl) set(OPSYM_FILE ${GENERATED_INCLUDE_DIR}/opsymbols.h) set(RUNTIME_BASE_FILE ${ASY_SRC_TEMPLATES_DIR}/runtimebase.in) add_custom_command( OUTPUT ${RUNTIME_FILES_OUT} COMMAND ${PERL_INTERPRETER} ${RUNTIME_SCRIPT} --opsym-file ${OPSYM_FILE} --runtime-base-file ${RUNTIME_BASE_FILE} --src-template-dir ${ASY_SRC_TEMPLATES_DIR} --prefix ${runtime_file} --header-out-dir ${GENERATED_INCLUDE_DIR} --src-out-dir ${GENERATED_SRC_DIR} MAIN_DEPENDENCY ${RUNTIME_FILE_IN_BASE}.in DEPENDS ${RUNTIME_SCRIPT} ${OPSYM_FILE} ${RUNTIME_BASE_FILE} ${RUNTIME_FILE_DEP} ) endfunction() macro(add_runtime_file runtime_file) _int_add_runtime_file(${runtime_file}) list(APPEND ASY_GENERATED_BUILD_SOURCES ${GENERATED_SRC_DIR}/${runtime_file}.cc ) set(_ASY_GENERATED_HEADER_NAME ${GENERATED_INCLUDE_DIR}/${runtime_file}.h) list(APPEND ASYMPTOTE_GENERATED_HEADERS ${_ASY_GENERATED_HEADER_NAME}) list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${_ASY_GENERATED_HEADER_NAME}) endmacro() foreach(RUNTIME_FILE ${RUNTIME_BUILD_FILES}) add_runtime_file(${RUNTIME_FILE}) endforeach() # keywords.h set(KEYWORDS_HEADER_OUT ${GENERATED_INCLUDE_DIR}/keywords.h) add_custom_command( OUTPUT ${KEYWORDS_HEADER_OUT} COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/keywords.py --camplfile ${ASY_RESOURCE_DIR}/camp.l --output ${GENERATED_INCLUDE_DIR}/keywords.h --process-file ${ASY_SRC_DIR}/asyprocess.cc MAIN_DEPENDENCY ${ASY_RESOURCE_DIR}/camp.l DEPENDS ${ASY_SCRIPTS_DIR}/keywords.py ${ASY_SRC_DIR}/asyprocess.cc ) list(APPEND ASYMPTOTE_GENERATED_HEADERS ${KEYWORDS_HEADER_OUT}) list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${KEYWORDS_HEADER_OUT}) set(camp_lex_output ${GENERATED_SRC_DIR}/lex.yy.cc) set(camp_l_file ${ASY_RESOURCE_DIR}/camp.l) if (WIN32) list(APPEND FLEX_ARGS --wincompat) endif() # flex + bison # flex add_custom_command( OUTPUT ${camp_lex_output} COMMAND ${FLEX_EXECUTABLE} ${FLEX_ARGS} -o ${camp_lex_output} ${camp_l_file} MAIN_DEPENDENCY ${camp_l_file} ) list(APPEND ASY_GENERATED_BUILD_SOURCES ${camp_lex_output}) # bison set(bison_output ${GENERATED_SRC_DIR}/camp.tab.cc) set(bison_header ${GENERATED_INCLUDE_DIR}/camp.tab.h) set(bison_input ${ASY_RESOURCE_DIR}/camp.y) add_custom_command( OUTPUT ${bison_output} ${bison_header} COMMAND ${BISON_EXECUTABLE} -t --header=${bison_header} -o ${bison_output} ${bison_input} MAIN_DEPENDENCY ${bison_input} ) list(APPEND ASY_GENERATED_BUILD_SOURCES ${bison_output}) list(APPEND ASYMPTOTE_GENERATED_HEADERS ${bison_header}) list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${bison_header}) # generate enums from csv foreach(csv_enum_file ${ASY_CSV_ENUM_FILES}) set(generated_header_file ${GENERATED_INCLUDE_DIR}/${csv_enum_file}.h) add_custom_command( OUTPUT ${generated_header_file} COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/generate_enums.py --language cpp --name ${csv_enum_file} --input ${ASY_RESOURCE_DIR}/${csv_enum_file}.csv --output ${generated_header_file} --xopt namespace=camp MAIN_DEPENDENCY ${ASY_RESOURCE_DIR}/${csv_enum_file}.csv DEPENDS ${ASY_SCRIPTS_DIR}/generate_enums.py ) list(APPEND ASYMPTOTE_GENERATED_HEADERS ${generated_header_file}) list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${generated_header_file}) endforeach () # raw.i files # generating preprocessed files set(FINDSYM_FILE ${ASY_SCRIPTS_DIR}/findsym.py) # combine all files into allsymbols.h function(symfile_preprocess src_dir symfile symfile_raw_output_varname header_output_varname) set(symfile_raw_output_var ${symfile_raw_output_varname}) set(processed_output_file ${GENERATED_AUX_DIR}/${symfile}.raw.i) set(${symfile_raw_output_var} ${processed_output_file} PARENT_SCOPE) set(cxx_preprocessor ${CMAKE_CXX_COMPILER}) if (MSVC) if (GCCCOMPAT_CXX_COMPILER_FOR_MSVC) set(cxx_preprocessor ${GCCCOMPAT_CXX_COMPILER_FOR_MSVC}) else() set(msvc_flag --msvc) endif() endif() set(asy_includes_list "$") set(asy_macros_list "$") set(asy_cxx_std "$") if (UNIX) # for unix systems, need verbatim flag because # the arguments contains semicolon, though somehow # verbatim option causes problems for windows set(ADDITIONAL_ADD_CUSTOM_CMD_ARGS VERBATIM) endif() add_custom_command( OUTPUT ${processed_output_file} COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/gen_preprocessed_depfile.py --cxx-compiler=${cxx_preprocessor} "$<$:--include-dirs=$>" "$<$:--cxx-standard=${asy_cxx_std}>" "$<$:--macro-defs=$>" --out-dep-file=${GENERATED_AUX_DIR}/${symfile}.d --out-i-file=${processed_output_file} --in-src-file=${src_dir}/${symfile}.cc ${msvc_flag} DEPFILE ${GENERATED_AUX_DIR}/${symfile}.d BYPRODUCTS ${GENERATED_AUX_DIR}/${symfile}.d DEPENDS ${src_dir}/${symfile}.cc ${ASY_SCRIPTS_DIR}/gen_preprocessed_depfile.py ${ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS} ${ADDITIONAL_ADD_CUSTOM_CMD_ARGS} ) # *.symbols.h file set(symfile_raw_output_var ${header_output_varname}) set(sym_header_file ${GENERATED_INCLUDE_DIR}/${symfile}.symbols.h) set(${symfile_raw_output_var} ${sym_header_file} PARENT_SCOPE) add_custom_command( OUTPUT ${sym_header_file} COMMAND ${PY3_INTERPRETER} ${FINDSYM_FILE} ${sym_header_file} ${processed_output_file} MAIN_DEPENDENCY ${processed_output_file} ) endfunction() # preprocess each individual symbol files foreach(SYM_FILE ${SYMBOL_STATIC_BUILD_FILES}) symfile_preprocess(${ASY_SRC_DIR} ${SYM_FILE} SYMFILE_OUT HEADER_OUT) list(APPEND SYMFILE_OUT_LIST ${SYMFILE_OUT}) list(APPEND ASYMPTOTE_GENERATED_HEADERS ${HEADER_OUT}) endforeach() foreach(SYM_FILE ${RUNTIME_BUILD_FILES}) symfile_preprocess(${GENERATED_SRC_DIR} ${SYM_FILE} SYMFILE_OUT HEADER_OUT) list(APPEND SYMFILE_OUT_LIST ${SYMFILE_OUT}) list(APPEND ASYMPTOTE_GENERATED_HEADERS ${HEADER_OUT}) endforeach () # allsymbols.h add_custom_command( OUTPUT ${GENERATED_INCLUDE_DIR}/allsymbols.h COMMAND ${PY3_INTERPRETER} ${FINDSYM_FILE} ${GENERATED_INCLUDE_DIR}/allsymbols.h ${SYMFILE_OUT_LIST} DEPENDS ${FINDSYM_FILE} ${SYMFILE_OUT_LIST} ) list(APPEND ASYMPTOTE_GENERATED_HEADERS ${GENERATED_INCLUDE_DIR}/allsymbols.h) # macro files message(STATUS "Generating revision.cc file") set(revision_cc_file ${GENERATED_SRC_DIR}/revision.cc) configure_file(${ASY_RESOURCE_DIR}/template_rev.cc.in ${revision_cc_file}) list(APPEND ASY_GENERATED_BUILD_SOURCES ${revision_cc_file}) add_custom_target(asy_gen_headers DEPENDS ${ASYMPTOTE_GENERATED_HEADERS} ) asymptote-3.05/cmake-scripts/compiler-config.cmake0000644000000000000000000000067115031566105021016 0ustar rootrootset(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED TRUE) if (OPTIMIZE_LINK_TIME) include(CheckIPOSupported) check_ipo_supported(RESULT ipo_supported_result LANGUAGES C CXX) if (ipo_supported_result) set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) message(STATUS "Using link-time optimization") else() message(FATAL_ERROR "Compiler does not support link-time optimization") endif() endif() asymptote-3.05/cmake-scripts/backport-libs.cmake0000644000000000000000000000055515031566105020476 0ustar rootrootadd_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/backports/optional) list(APPEND ASY_STATIC_LIBARIES OptionalBackport) if (ENABLE_OPENGL) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/backports/glew) # using glew within the repo list(APPEND ASY_STATIC_LIBARIES GLEW) list(APPEND ASYMPTOTE_INCLUDES $) endif() asymptote-3.05/cmake-scripts/common.cmake0000644000000000000000000000027015031566105017224 0ustar rootrootmacro(TODO_NOTIMPL message) message(FATAL_ERROR "TODO: ${message}") endmacro() set(cmake_release_build_types Release RelWithDebInfo MinSizeRel) set(cmake_debug_build_types Debug) asymptote-3.05/cmake-scripts/win32-specific.cmake0000644000000000000000000000646315031566105020473 0ustar rootrootif (NOT WIN32) message(FATAL_ERROR "This file is only for use with windows.") endif() # msvc compile options if (MSVC) list(APPEND ASY_COMPILE_OPTS /Zc:__cplusplus /Zc:__STDC__ /Zc:externC /Zc:preprocessor /Zc:hiddenFriend) endif() # alot of asymptote sources use __MSDOS__ macro for checking windows list(APPEND ASY_MACROS WIN32_LEAN_AND_MEAN NOMINMAX __MSDOS__=1) # set ASYMPTOTE_SYSDIR to empty string if (CTAN_BUILD) list(APPEND ASY_MACROS ASYMPTOTE_SYSDIR="") else() # because of how ASYMPTOTE_SYSDIR is calculated on windows, # this value is replaced by the what is in the registry when we launch # asymptote, given if ASYMPTOTE_SYSDIR is not empty # (empty indicates a CTAN build which uses kpsewhich for determining path) # hence, we can leave this value to anything non-empty. list(APPEND ASY_MACROS ASYMPTOTE_SYSDIR="NUL") endif() set(BUILD_SHARED_LIBS OFF) # gcc/clang++ compatible validators function(validate_gcc_compat_cxx validator_result_var gcccompat_compiler) execute_process( COMMAND ${gcccompat_compiler} "--version" OUTPUT_VARIABLE COMPILER_RESULT) if (NOT COMPILER_RESULT MATCHES "(clang version )|(g\\+\\+\\.exe \\(MinGW\\))|(g\\+\\+ \\(GCC\\))") set(${validator_result_var} FALSE PARENT_SCOPE) endif() endfunction() macro(find_compatible_gcc_compilers) find_program( GCCCOMPAT_CXX_COMPILER_FOUND NAMES clang++ g++ VALIDATOR validate_gcc_compat_cxx ) if (GCCCOMPAT_CXX_COMPILER_FOUND) message(STATUS "Found clang++/g++ at ${GCCCOMPAT_CXX_COMPILER_FOUND}") set(GCCCOMPAT_CXX_COMPILER_FOR_MSVC ${GCCCOMPAT_CXX_COMPILER_FOUND}) endif() endmacro() # attempting to find gcc-compatible C++ compiler if (MSVC) if (NOT GCCCOMPAT_CXX_COMPILER_FOR_MSVC) message(STATUS "GCCCOMPAT_CXX_COMPILER_FOR_MSVC not given, will attempt to find g++.exe or clang++.exe") find_compatible_gcc_compilers() endif() if (GCCCOMPAT_CXX_COMPILER_FOR_MSVC) message(STATUS "Using GCC-compatible C++ compiler at \ ${GCCCOMPAT_CXX_COMPILER_FOR_MSVC} for preprocessing.") endif() if (NOT GCCCOMPAT_CXX_COMPILER_FOR_MSVC) message(WARNING "\ GCC-compatible C++ compiler not specified, target dependency resolution for generated files may \ not work properly. If you are looking for a GCC-compatible C++ compiler on windows for preprocessing, \ we recommend the LLVM toolchain. You can find LLVM at \ \ https://releases.llvm.org/download.html \ \ or through msys2. After that, re-run cmake with either \ -DGCCCOMPAT_CXX_COMPILER_FOR_MSVC= \ or if running msvc/* presets, with GCCCOMPAT_CXX_COMPILER_FOR_MSVC \ environment variable set to the path \ to clang++.exe.") endif() endif() # additional win32 api libraries list(APPEND ASY_STATIC_LIBARIES Shlwapi Shell32 Ws2_32) # RC file set(ASY_WIN_RESOURCE_DIR ${ASY_RESOURCE_DIR}/windows) list(APPEND ASY_WIN_RC_FILE ${ASY_WIN_RESOURCE_DIR}/asy.rc) # Minimum Windows version - for now, pinning on windows 10, # since that is currently the minimum supported version by Microsoft # See https://learn.microsoft.com/en-us/windows/win32/winprog/using-the-windows-headers set(ASY_WIN32_WINVER_VERSION 0x0A00) list(APPEND ASY_MACROS _WIN32_WINNT=${ASY_WIN32_WINVER_VERSION}) asymptote-3.05/cmake-scripts/asy-misc-files.cmake0000644000000000000000000000262615031566105020570 0ustar rootroot# Non-documentation, Non-core files for Asymptote # This file is intended for any files that are generated by asy. # Additionally, ensure this file is included after asy target & base files target has been defined in # CMakeLists.txt. set(ASY_MISC_FILES_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/misc-output) file(MAKE_DIRECTORY ${ASY_MISC_FILES_OUT_DIR}) # asy.list add_custom_command( OUTPUT ${ASY_MISC_FILES_OUT_DIR}/asy.list COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/generate_asy_list_file.py --asy-executable $ --asy-base-dir=${ASY_BUILD_BASE_DIR} --output-file ${ASY_MISC_FILES_OUT_DIR}/asy.list DEPENDS asy ${ASY_OUTPUT_BASE_FILES} ${ASY_SCRIPTS_DIR}/generate_asy_list_file.py ) # asy-keywords.el add_custom_command( OUTPUT ${ASY_MISC_FILES_OUT_DIR}/asy-keywords.el COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/asy-list.py --asy-list-file ${ASY_MISC_FILES_OUT_DIR}/asy.list --revision ${ASY_VERSION} --output-file ${ASY_MISC_FILES_OUT_DIR}/asy-keywords.el WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${ASY_MISC_FILES_OUT_DIR}/asy.list ${CMAKE_CURRENT_SOURCE_DIR}/camp.l ${ASY_SCRIPTS_DIR}/asy-list.py ) set(ASY_OUTPUT_DIST_MISC_FILES ${ASY_MISC_FILES_OUT_DIR}/asy-keywords.el ) add_custom_target(asy-dist-misc-files DEPENDS ${ASY_OUTPUT_DIST_MISC_FILES}) asymptote-3.05/cmake-scripts/generated/0000755000000000000000000000000015031566105016671 5ustar rootrootasymptote-3.05/cmake-scripts/generated/asy-tests-list.cmake0000644000000000000000000000225315031566105022602 0ustar rootroot # This file is automatically generated. Do not modify manually. # This file is checked in as part of the repo. It is not meant to be ignored. # # If more tests are added, run scan-asy-tests-cmake.py to re-generate # the test list. add_asy_tests( TEST_DIR arith TESTS integer pair random real roots transform triple ) add_asy_tests( TEST_DIR array TESTS array delete determinant fields slice solve sort transpose ) add_asy_tests( TEST_DIR frames TESTS loop stat stat2 ) add_asy_tests( TEST_DIR gs TESTS ghostscript TEST_NOT_PART_OF_CHECK_TEST true ) add_asy_tests( TEST_DIR imp TESTS unravel ) add_asy_tests( TEST_DIR io TESTS csv read xdr ) add_asy_tests( TEST_DIR pic TESTS trans ) add_asy_tests( TEST_DIR string TESTS erase find insert length rfind substr ) add_asy_tests( TEST_DIR template TESTS functionTest initTest mapArrayTest multiImport nestedImport singletype sortedsetTest splaytreeTest structTest ) add_asy_tests( TEST_DIR types TESTS autounravel builtinOps cast constructor ecast guide init keyword order overrideEquals resolve shadow spec var ) asymptote-3.05/cmake-scripts/docgen.cmake0000644000000000000000000003053715031566105017204 0ustar rootrootif (NOT ENABLE_DOCGEN) message(FATAL_ERROR "Documentation generation is disabled") endif() set(ASY_TEX_BUILD_ROOT ${CMAKE_CURRENT_BINARY_DIR}/docbuild) file(MAKE_DIRECTORY ${ASY_TEX_BUILD_ROOT}) configure_file(${ASY_RESOURCE_DIR}/version.texi.in ${ASY_TEX_BUILD_ROOT}/version.texi) set(LATEX_ARTIFRACT_EXTENSIONS aux hd idx ins log out toc) set(PDFLATEX_BASE_ARGUMENTS ${PDFLATEX_COMPILER} -output-directory=${ASY_TEX_BUILD_ROOT} ) find_package(LATEX COMPONENTS PDFLATEX REQUIRED) list( TRANSFORM LATEX_ARTIFRACT_EXTENSIONS PREPEND ${ASY_TEX_BUILD_ROOT}/asy-latex. OUTPUT_VARIABLE ASY_LATEX_DTX_ARTIFACTS ) add_custom_command( OUTPUT ${ASY_TEX_BUILD_ROOT}/asy-latex.pdf ${ASY_TEX_BUILD_ROOT}/asymptote.sty DEPENDS ${ASY_DOC_DIR}/asy-latex.dtx COMMAND ${PDFLATEX_BASE_ARGUMENTS} ${ASY_DOC_DIR}/asy-latex.dtx WORKING_DIRECTORY ${ASY_DOC_DIR} BYPRODUCTS ${ASY_LATEX_DTX_ARTIFACTS} ) add_custom_command( OUTPUT ${ASY_TEX_BUILD_ROOT}/latexusage.pdf DEPENDS ${ASY_DOC_DIR}/latexusage.tex ${ASY_TEX_BUILD_ROOT}/asymptote.sty asy ${ASY_OUTPUT_BASE_FILES} COMMAND ${PY3_INTERPRETER} ${ASY_DOC_DIR}/build-latexusage-pdf.py --build-dir=${ASY_TEX_BUILD_ROOT} --latexusage-source-dir=${ASY_DOC_DIR} --pdflatex-executable=${PDFLATEX_COMPILER} --asy-executable=$ --asy-base-dir=${ASY_BUILD_BASE_DIR} WORKING_DIRECTORY ${ASY_DOC_DIR} BYPRODUCTS ${ASY_TEX_BUILD_ROOT}/latexusage.log ) set(CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS ${CMAKE_COMMAND} -E copy -t ${ASY_TEX_BUILD_ROOT}) set(CMAKE_RM_BASE_ARGUMENTS ${CMAKE_COMMAND} -E rm) set(ASY_BASE_ARGUMENTS asy -dir ${ASY_BUILD_BASE_DIR} -config '' -render=0 -noprc -noV) macro(add_additional_pdf_outputs filename_base num_times_to_call_pdflatex compiler) # ARGN can be used to specify additional dependencies foreach (DUMMY_VAR RANGE 1 ${num_times_to_call_pdflatex}) list(APPEND COMMAND_ARGS COMMAND ${compiler} ${ASY_DOC_DIR}/${filename_base}.tex) endforeach() set(PDFLATEX_OUTPUT_PREFIX ${ASY_TEX_BUILD_ROOT}/${filename_base}) # there are unfortunately still some issues with out-of-source builds # with pdflatex, hence we have to copy the files to the build root first add_custom_command( OUTPUT ${PDFLATEX_OUTPUT_PREFIX}.tex DEPENDS ${ASY_DOC_DIR}/${filename_base}.tex COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS} ${ASY_DOC_DIR}/${filename_base}.tex ) add_custom_command( OUTPUT ${PDFLATEX_OUTPUT_PREFIX}.pdf DEPENDS ${PDFLATEX_OUTPUT_PREFIX}.tex ${ARGN} ${COMMAND_ARGS} COMMAND ${CMAKE_RM_BASE_ARGUMENTS} -f ${PDFLATEX_OUTPUT_PREFIX}.dvi WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT} BYPRODUCTS ${PDFLATEX_OUTPUT_PREFIX}.aux ${PDFLATEX_OUTPUT_PREFIX}.log ${PDFLATEX_OUTPUT_PREFIX}.toc ) endmacro() # asy -> pdf file generation set(ASY_DOC_PDF_FILES "") macro(add_asy_pdf_dependency_basic asyfile) set(ASY_DOC_FILE_OUTPUT ${ASY_TEX_BUILD_ROOT}/${asyfile}.pdf) # asymptote has some problems (currently as writing this) with asy files involving tex # and output directory not matching, so a workaround is to copy to the doc build root add_custom_command( OUTPUT ${ASY_DOC_FILE_OUTPUT} DEPENDS ${ASY_DOC_DIR}/${asyfile}.asy asy ${ASY_OUTPUT_BASE_FILES} # copy /file.asy -> /file.asy COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS} ${ASY_DOC_DIR}/${asyfile}.asy COMMAND ${ASY_BASE_ARGUMENTS} -fpdf ${asyfile}.asy # cleanup /file.asy COMMAND ${CMAKE_RM_BASE_ARGUMENTS} ${ASY_TEX_BUILD_ROOT}/${asyfile}.asy # cleanup tex artifacts, if exist COMMAND ${CMAKE_RM_BASE_ARGUMENTS} -f ${ASY_TEX_BUILD_ROOT}/${asyfile}_.tex WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT} ) list(APPEND ASY_DOC_PDF_FILES ${ASY_DOC_FILE_OUTPUT}) endmacro() # CAD1 is here because it is needed for CAD.pdf. add_asy_pdf_dependency_basic(CAD1) # additional asymptote file outputs add_additional_pdf_outputs(asyRefCard 1 ${PDFTEX_EXEC}) add_additional_pdf_outputs(TeXShopAndAsymptote 2 ${PDFLATEX_COMPILER}) add_additional_pdf_outputs( CAD 3 ${PDFLATEX_COMPILER} DEPENDS ${ASY_TEX_BUILD_ROOT}/CAD1.pdf ) set( BASE_ASYMPTOTE_DOC_AND_TEX_FILES ${ASY_TEX_BUILD_ROOT}/asymptote.sty ${ASY_TEX_BUILD_ROOT}/asy-latex.pdf ${ASY_TEX_BUILD_ROOT}/CAD.pdf ${ASY_TEX_BUILD_ROOT}/TeXShopAndAsymptote.pdf ${ASY_TEX_BUILD_ROOT}/asyRefCard.pdf ) add_custom_target(docgen DEPENDS ${BASE_ASYMPTOTE_DOC_AND_TEX_FILES}) # the following files are only used with docgen, hence they are not added if # ENABLE_ASYMPTOTE_PDF_DOCGEN is not used if (ENABLE_ASYMPTOTE_PDF_DOCGEN) # asy files set(ASY_DOC_FILE_PREFIXES axis3 basealign bezier bigdiagonal binarytreetest Bode brokenaxis colons colors cube cylinderskeleton datagraph diagonal dots eetomumu elliptic errorbars exp fillcontour flow flowchartdemo GaussianSurface generalaxis generalaxis3 graphmarkers graphwithderiv grid3xyz hatch helix HermiteSpline histogram Hobbycontrol Hobbydir icon image imagecontour irregularcontour join join3 knots labelsquare legend lineargraph lineargraph0 linetype log2graph loggraph loggrid logimage logticks makepen markers1 markers2 mexicanhat monthaxis multicontour onecontour parametricgraph penfunctionimage penimage planes quartercircle saddle scaledgraph shadedtiling slopefield1 square subpictures superpath tile triangulate unitcircle3 vectorfield ) # independent asymptote files that can be generated with any other files foreach(ASY_DOC_FILE_PREFIX ${ASY_DOC_FILE_PREFIXES}) add_asy_pdf_dependency_basic(${ASY_DOC_FILE_PREFIX}) endforeach() macro(add_asy_file_with_extension asy_file extra_ext) set(ASY_DOC_FILE_OUTPUT ${ASY_TEX_BUILD_ROOT}/${asy_file}.pdf) set(ASY_AUX_FILE_NAME ${asy_file}.${extra_ext}) # asymptote has some problems (currently as writing this) with asy files involving tex # and output directory not matching, so a workaround is to copy to the doc build root add_custom_command( OUTPUT ${ASY_DOC_FILE_OUTPUT} DEPENDS ${ASY_DOC_DIR}/${asy_file}.asy ${ASY_DOC_DIR}/${ASY_AUX_FILE_NAME} asy ${ASY_OUTPUT_BASE_FILES} COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS} ${ASY_DOC_DIR}/${asy_file}.asy ${ASY_DOC_DIR}/${ASY_AUX_FILE_NAME} COMMAND ${ASY_BASE_ARGUMENTS} -fpdf ${ASY_DOC_FILE_PREFIX}.asy COMMAND ${CMAKE_RM_BASE_ARGUMENTS} ${ASY_TEX_BUILD_ROOT}/${asy_file}.asy ${ASY_TEX_BUILD_ROOT}/${ASY_AUX_FILE_NAME} COMMAND ${CMAKE_RM_BASE_ARGUMENTS} -f ${ASY_TEX_BUILD_ROOT}/${asy_file}_.tex WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT} ) list(APPEND ASY_DOC_PDF_FILES ${ASY_DOC_FILE_OUTPUT}) endmacro() # asy + csv Files foreach(ASY_DOC_FILE_PREFIX diatom secondaryaxis westnile) add_asy_file_with_extension(${ASY_DOC_FILE_PREFIX} csv) endforeach() # asy + dat files foreach(ASY_DOC_FILE_PREFIX filegraph leastsquares) add_asy_file_with_extension(${ASY_DOC_FILE_PREFIX} dat) endforeach() # handle CDlabel and logo separately macro(copy_doc_asy_file_to_docbuild_root asyfile) add_custom_command( OUTPUT ${ASY_TEX_BUILD_ROOT}/${asyfile}.asy COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS} ${ASY_DOC_DIR}/${asyfile}.asy DEPENDS ${ASY_DOC_DIR}/${asyfile}.asy ) endmacro() function(add_asy_file_with_asy_dependency asyfile) # [asydep2] ... list( TRANSFORM ARGN PREPEND ${ASY_TEX_BUILD_ROOT}/ OUTPUT_VARIABLE ASY_REQUIRED_DEPS ) list( TRANSFORM ASY_REQUIRED_DEPS APPEND .asy ) add_custom_command( OUTPUT ${ASY_TEX_BUILD_ROOT}/${asyfile}.pdf DEPENDS ${ASY_DOC_DIR}/${asyfile}.asy asy ${ASY_OUTPUT_BASE_FILES} ${ASY_REQUIRED_DEPS} # copy /file.asy -> /file.asy COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS} ${ASY_DOC_DIR}/${asyfile}.asy COMMAND ${ASY_BASE_ARGUMENTS} -fpdf ${asyfile}.asy # cleanup /file.asy COMMAND ${CMAKE_RM_BASE_ARGUMENTS} ${ASY_TEX_BUILD_ROOT}/${asyfile}.asy # cleanup tex artifacts, if exist COMMAND ${CMAKE_RM_BASE_ARGUMENTS} -f ${ASY_TEX_BUILD_ROOT}/${asyfile}_.tex WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT} ) endfunction() macro(add_asy_file_from_docbuild_root asyfile) # does not copy from doc root to docbuild root; have to do manually add_custom_command( OUTPUT ${ASY_TEX_BUILD_ROOT}/${asyfile}.pdf COMMAND ${ASY_BASE_ARGUMENTS} -fpdf ${asyfile}.asy DEPENDS ${ASY_TEX_BUILD_ROOT}/${asyfile}.asy BYPRODUCTS ${ASY_TEX_BUILD_ROOT}/${asyfile}_.tex ${ASY_TEX_BUILD_ROOT}/${asyfile}_.eps WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT} ) endmacro() # CDlabel + logo copy_doc_asy_file_to_docbuild_root(logo) add_asy_file_from_docbuild_root(logo) add_asy_file_with_asy_dependency(CDlabel logo) # bezier2 & beziercurve copy_doc_asy_file_to_docbuild_root(beziercurve) add_asy_file_from_docbuild_root(beziercurve) add_asy_file_with_asy_dependency(bezier2 beziercurve) list(APPEND ASY_DOC_PDF_FILES ${ASY_TEX_BUILD_ROOT}/logo.pdf ${ASY_TEX_BUILD_ROOT}/CDlabel.pdf ${ASY_TEX_BUILD_ROOT}/beziercurve.pdf ${ASY_TEX_BUILD_ROOT}/bezier2.pdf ) # options file add_custom_command( OUTPUT ${ASY_TEX_BUILD_ROOT}/options DEPENDS asy ${ASY_DOC_DIR}/gen-asy-options-file.py COMMAND ${PY3_INTERPRETER} ${ASY_DOC_DIR}/gen-asy-options-file.py --asy-executable=$ --output-file=${ASY_TEX_BUILD_ROOT}/options ) # asymptote.pdf set(TEXI_ARTIFACT_EXTENSIONS log tmp cp toc cps aux) list( TRANSFORM TEXI_ARTIFACT_EXTENSIONS PREPEND ${ASY_TEX_BUILD_ROOT}/asymptote. OUTPUT_VARIABLE ASYMPTOTE_PDF_EXTRA_ARTIFACTS ) if (WIN32) if (WIN32_TEXINDEX STREQUAL WSL) set(TEXINDEX_WRAPPER ${CMAKE_CURRENT_SOURCE_DIR}/windows/texindex-wsl.cmd) else() set(TEXINDEX_WRAPPER ${WIN32_TEXINDEX}) endif() add_custom_command( OUTPUT ${ASY_TEX_BUILD_ROOT}/asymptote.pdf DEPENDS ${ASY_TEX_BUILD_ROOT}/options ${ASY_TEX_BUILD_ROOT}/latexusage.pdf ${ASY_DOC_DIR}/asymptote.texi ${ASY_DOC_PDF_FILES} COMMAND ${PY3_INTERPRETER} ${ASY_DOC_DIR}/build-asymptote-pdf-win.py --texify-loc=${TEXIFY} --texindex-loc=${TEXINDEX_WRAPPER} --texi-file=${ASY_DOC_DIR}/asymptote.texi WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT} BYPRODUCTS ${ASYMPTOTE_PDF_EXTRA_ARTIFACTS} ) else() add_custom_command( OUTPUT ${ASY_TEX_BUILD_ROOT}/asymptote.pdf DEPENDS ${ASY_TEX_BUILD_ROOT}/options ${ASY_TEX_BUILD_ROOT}/latexusage.pdf ${ASY_DOC_DIR}/asymptote.texi ${ASY_DOC_PDF_FILES} COMMAND ${TEXI2DVI} --pdf ${ASY_DOC_DIR}/asymptote.texi WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT} BYPRODUCTS ${ASYMPTOTE_PDF_EXTRA_ARTIFACTS} ) endif() add_custom_target(asymptote_pdf_file DEPENDS ${ASY_TEX_BUILD_ROOT}/asymptote.pdf) add_dependencies(docgen asymptote_pdf_file) # manual page add_custom_command( OUTPUT ${ASY_TEX_BUILD_ROOT}/asy.1 DEPENDS ${ASY_DOC_DIR}/asy.1.begin ${ASY_DOC_DIR}/asy.1.end ${ASY_TEX_BUILD_ROOT}/options ${ASY_DOC_DIR}/build-asy-1-file.py COMMAND ${PY3_INTERPRETER} ${ASY_DOC_DIR}/build-asy-1-file.py --options-file=${ASY_TEX_BUILD_ROOT}/options --asy-1-begin-file=${ASY_DOC_DIR}/asy.1.begin --asy-1-end-file=${ASY_DOC_DIR}/asy.1.end --out-file=${ASY_TEX_BUILD_ROOT}/asy.1 WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT} ) add_custom_target(manpage DEPENDS ${ASY_TEX_BUILD_ROOT}/asy.1) if (UNIX) add_dependencies(docgen manpage) endif() endif() # ENABLE_ASYMPTOTE_PDF_DOCGEN asymptote-3.05/cmake-scripts/linux-install.cmake0000644000000000000000000000755215031566105020551 0ustar rootrootif (NOT LINUX) if (UNIX) message(WARNING "This file has not been tested on non-linux unix systems. It may not work!") # TODO: Do more testing on non-linux UNIX systems. else() message(FATAL_ERROR "This file is only for use with unix systems") endif() endif() if (CTAN_BUILD) message(FATAL_ERROR "system install is not supported for CTAN builds.") endif() # Requires gnu-install-macros to be ran already set(PERMISSION_755_LIST OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) set(PERMISSION_644_LIST OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) set(ASY_BASE_EXTRA_FILES_NAME asy-mode.el asy-init.el asy.vim asy_filetype.vim asy-kate.sh asymptote.py reload.js nopapersize.ps) list( TRANSFORM ASY_BASE_EXTRA_FILES_NAME PREPEND ${ASY_SOURCE_BASE_DIR}/ OUTPUT_VARIABLE ASY_BASE_EXTRA_FILES ) set(ASY_INSTALL_SYSDIR_VALUE ${CMAKE_INSTALL_DATADIR}/asymptote) set(ASY_BASE_INSTALL_COMPONENT asy) # installing files #region base files install( TARGETS asy PERMISSIONS ${PERMISSION_755_LIST} COMPONENT ${ASY_BASE_INSTALL_COMPONENT} DESTINATION ${CMAKE_INSTALL_BINDIR} ) # base/* -> / install( DIRECTORY ${ASY_BUILD_BASE_DIR}/ DESTINATION ${ASY_INSTALL_SYSDIR_VALUE} COMPONENT ${ASY_BASE_INSTALL_COMPONENT} FILE_PERMISSIONS ${PERMISSION_644_LIST} ) # extra base files -> / install( FILES ${ASY_MISC_FILES_OUT_DIR}/asy-keywords.el ${ASY_BASE_EXTRA_FILES} DESTINATION ${ASY_INSTALL_SYSDIR_VALUE} COMPONENT ${ASY_BASE_INSTALL_COMPONENT} PERMISSIONS ${PERMISSION_644_LIST} ) #endregion #region example files set(ASYMPTOTE_EXAMPLESDIR_VALUE ${ASY_INSTALL_SYSDIR_VALUE}/examples) # example files install( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/examples/ DESTINATION ${ASYMPTOTE_EXAMPLESDIR_VALUE} COMPONENT ${ASY_BASE_INSTALL_COMPONENT} FILE_PERMISSIONS ${PERMISSION_644_LIST} ) # extra examples from docs -> examples install( DIRECTORY ${ASY_DOC_DIR}/extra/ DESTINATION ${ASYMPTOTE_EXAMPLESDIR_VALUE} COMPONENT ${ASY_BASE_INSTALL_COMPONENT} FILES_MATCHING PATTERN "*.asy" PERMISSIONS ${PERMISSION_644_LIST} ) # DOCEXTRA files -> examples install( DIRECTORY ${ASY_DOC_DIR}/ DESTINATION ${ASYMPTOTE_EXAMPLESDIR_VALUE} COMPONENT ${ASY_BASE_INSTALL_COMPONENT} FILES_MATCHING PATTERN "*.asy" PATTERN "*.csv" PATTERN "*.dat" PERMISSIONS ${PERMISSION_644_LIST} ) set(ASY_DOCEXTRA_FILE_NAMES latexusage.tex externalprc.tex pixel.pdf) list( TRANSFORM ASY_DOCEXTRA_FILE_NAMES PREPEND ${ASY_DOC_DIR}/ OUTPUT_VARIABLE ASY_DOCEXTRA_FILES ) install( FILES ${ASY_DOCEXTRA_FILES} DESTINATION ${ASYMPTOTE_EXAMPLESDIR_VALUE} COMPONENT ${ASY_BASE_INSTALL_COMPONENT} PERMISSIONS ${PERMISSION_644_LIST} ) #endregion #region documentation files if (ENABLE_DOCGEN) set(ASY_DOCS_INSTALL_COMPONENT asy-docs) set(ASY_INSTALL_DOCDIR_VALUE ${CMAKE_INSTALL_DATADIR}/asymptote/doc) set(ASY_DOCFILE_PDF_FILES ${BASE_ASYMPTOTE_DOC_AND_TEX_FILES}) list(FILTER ASY_DOCFILE_PDF_FILES INCLUDE REGEX "^.*\.pdf$") list(APPEND ASY_DOCFILE_PDF_FILES ${ASY_TEX_BUILD_ROOT}/asymptote.pdf) # pdf files install( FILES ${ASY_DOCFILE_PDF_FILES} COMPONENT ${ASY_DOCS_INSTALL_COMPONENT} DESTINATION ${ASY_INSTALL_DOCDIR_VALUE} PERMISSIONS ${PERMISSION_644_LIST} ) # manpage install( FILES ${ASY_TEX_BUILD_ROOT}/asy.1 COMPONENT ${ASY_DOCS_INSTALL_COMPONENT} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 PERMISSIONS ${PERMISSION_644_LIST} ) endif() #endregion asymptote-3.05/cmake-scripts/external-libs.cmake0000644000000000000000000001742415031566105020516 0ustar rootrootinclude(FindPkgConfig) include(FetchContent) # zlib find_package(ZLIB REQUIRED) list(APPEND ASY_STATIC_LIBARIES ZLIB::ZLIB) # flex + bison if (UNIX) include(FindFLEX) include(FindBISON) if (NOT FLEX_FOUND) message(FATAL_ERROR "FLEX is required for building") endif() if (NOT BISON_FOUND) message(FATAL_ERROR "Bison is required for building") endif() elseif(WIN32) if ((NOT WIN32_FLEX_BINARY) OR (NOT WIN32_BISON_BINARY)) # downlod winflexbison message(STATUS "Flex or bison not given; downloading winflexbison.") FetchContent_Declare( winflexbison URL https://github.com/lexxmark/winflexbison/releases/download/v2.5.25/win_flex_bison-2.5.25.zip URL_HASH SHA256=8D324B62BE33604B2C45AD1DD34AB93D722534448F55A16CA7292DE32B6AC135 ) FetchContent_MakeAvailable(winflexbison) message(STATUS "Downloaded winflexbison") if (NOT WIN32_FLEX_BINARY) set(FLEX_EXECUTABLE ${winflexbison_SOURCE_DIR}/win_flex.exe) endif() if (NOT WIN32_BISON_BINARY) set(BISON_EXECUTABLE ${winflexbison_SOURCE_DIR}/win_bison.exe) endif() else() set(FLEX_EXECUTABLE ${WIN32_FLEX_BINARY}) set(BISON_EXECUTABLE ${WIN32_BISON_BINARY}) endif() endif() # getopt (win32 only) if (WIN32) find_package(unofficial-getopt-win32 REQUIRED) list(APPEND ASY_STATIC_LIBARIES unofficial::getopt-win32::getopt) endif() # glm; mandatory for all builds find_package(glm CONFIG) if (glm_FOUND) list(APPEND ASY_STATIC_LIBARIES glm::glm) list(APPEND ASY_MACROS HAVE_LIBGLM) else() message(FATAL_ERROR "glm not found; will not use glm") endif() if (ENABLE_READLINE) # curses if (UNIX) # we know ncurses work on unix systems, however # not always supported on windows (esp. msvc) set(CURSES_NEED_NCURSES TRUE) find_package(Curses) if (Curses_FOUND) list(APPEND ASYMPTOTE_INCLUDES ${CURSES_INCLUDE_DIRS}) list(APPEND ASY_COMPILE_OPTS ${CURSES_CFLAGS}) list(APPEND ASY_STATIC_LIBRARIES ${CURSES_LIBRARIES}) list(APPEND ASY_MACROS HAVE_NCURSES_CURSES_H HAVE_LIBCURSES) else() message(FATAL_ERROR "curses not found; will compile without curses") endif() pkg_check_modules(readline IMPORTED_TARGET readline) if (readline_FOUND) list(APPEND ASY_STATIC_LIBARIES PkgConfig::readline) list(APPEND ASY_MACROS HAVE_LIBREADLINE) else () message(FATAL_ERROR "readline not found; will compile without libreadline") endif() elseif(WIN32) find_package(unofficial-pdcurses CONFIG) if (unofficial-pdcurses_FOUND) list(APPEND ASY_STATIC_LIBRARIES unofficial::pdcurses::pdcurses) list(APPEND ASY_MACROS HAVE_CURSES_H HAVE_LIBCURSES) else() message(FATAL_ERROR "curses not found; will compile without curses") endif() find_package(unofficial-readline-win32 CONFIG) if (unofficial-readline-win32_FOUND) list(APPEND ASY_STATIC_LIBARIES unofficial::readline-win32::readline) list(APPEND ASY_MACROS HAVE_LIBREADLINE) else () message(FATAL_ERROR "readline not found; will compile without libreadline") endif() else() message(FATAL_ERROR "Only supported on Unix or Win32 systems") endif() else() message(STATUS "libreadline disabled; will not use libreadline") endif() # libcurl if (ENABLE_CURL) find_package(CURL) if (CURL_FOUND) list(APPEND ASY_STATIC_LIBARIES CURL::libcurl) list(APPEND ASY_MACROS HAVE_LIBCURL) else() message(FATAL_ERROR "curl not found") endif() else() message(STATUS "Disabling curl support") endif() # pthreads if (ENABLE_THREADING) if (UNIX) set(CMAKE_THREAD_PREFER_PTHREAD TRUE) set(THREADS_PREFER_PTHREAD_FLAG TRUE) include(FindThreads) if(CMAKE_USE_PTHREADS_INIT) list(APPEND ASY_STATIC_LIBARIES Threads::Threads) list(APPEND ASY_MACROS HAVE_PTHREAD=1) else() message(FATAL_ERROR "No thread library specified") endif() elseif(WIN32) find_package(PThreads4W) if(PThreads4W_FOUND) list(APPEND ASY_STATIC_LIBARIES PThreads4W::PThreads4W) list(APPEND ASY_MACROS HAVE_PTHREAD=1) else() message(FATAL_ERROR "No thread library specified") endif() else() message(FATAL_ERROR "Only supported on Unix or Win32 systems") endif() else() message(STATUS "Disabling threading support") endif() # gsl if (ENABLE_GSL) find_package(GSL) if (GSL_FOUND) list(APPEND ASY_STATIC_LIBARIES GSL::gsl) list(APPEND ASY_MACROS HAVE_LIBGSL) else() message(FATAL_ERROR "GSL not found") endif() else() message(STATUS "Disabling gsl support") endif() # eigen if (ENABLE_EIGEN3) find_package(Eigen3 CONFIG) if (Eigen3_FOUND) list(APPEND ASY_STATIC_LIBARIES Eigen3::Eigen) list(APPEND ASY_MACROS HAVE_EIGEN_DENSE) else() message(FATAL_ERROR "eigen3 not found") endif() else() message(STATUS "Disabling eigen3 support") endif() # OpenGL stuff if (ENABLE_OPENGL) # fatal error here, since OpenGL is optional find_package(OpenGL REQUIRED) if (OPENGL_FOUND) list(APPEND ASY_STATIC_LIBARIES OpenGL::GL) else() message(WARNING "gl libraries not found") endif() if (OPENGL_GLU_FOUND) list(APPEND ASY_MACROS HAVE_LIBGL) else() message(FATAL_ERROR "GL components incomplete; will not use OpenGL") endif() find_package(FreeGLUT CONFIG) if (FreeGLUT_FOUND) list(APPEND ASY_STATIC_LIBARIES $,FreeGLUT::freeglut,FreeGLUT::freeglut_static>) list(APPEND ASY_MACROS FREEGLUT HAVE_LIBGLUT) else() message(FATAL_ERROR "freeglut not found; will not use freeglut") endif() if (ENABLE_GL_COMPUTE_SHADERS) list(APPEND ASY_MACROS HAVE_COMPUTE_SHADER) else() message(WARNING "Compute shader disabled") endif() if (ENABLE_GL_SSBO) list(APPEND ASY_MACROS HAVE_SSBO) else() message(WARNING "SSBO disabled") endif() else() message(STATUS "Disabling opengl support") endif() if (ENABLE_RPC_FEATURES) if(UNIX) pkg_check_modules(TIRPC REQUIRED IMPORTED_TARGET libtirpc) list(APPEND ASY_STATIC_LIBARIES PkgConfig::TIRPC) endif() if (WIN32) # win32 does not have native open_memstream support set(OLD_BUILD_TESTING ${BUILD_TESTING}) set(BUILD_TESTING OFF CACHE INTERNAL "build testing") FetchContent_Declare( fmem GIT_REPOSITORY https://github.com/Kreijstal/fmem.git GIT_TAG 5f79fef3606be5dac54d62c7d0e2123363afabd7 ) FetchContent_MakeAvailable(fmem) set(BUILD_TESTING ${OLD_BUILD_TESTING} CACHE INTERNAL "build testing") list(APPEND ASY_STATIC_LIBARIES fmem) list(APPEND ASYMPTOTE_INCLUDES $) endif() list(APPEND ASY_MACROS HAVE_LIBTIRPC) else() message(STATUS "Disabling rpc and xdr/v3d support") endif() # fftw3 if (ENABLE_FFTW3) set(FFTW3_USABLE TRUE) find_package(FFTW3 CONFIG) if (NOT FFTW3_FOUND) message(WARNING "libfftw3 not found; will not use fftw3") set(FFTW3_USABLE FALSE) endif() if (FFTW3_USABLE) list(APPEND ASY_STATIC_LIBARIES FFTW3::fftw3) list(APPEND ASY_MACROS HAVE_LIBFFTW3 FFTWPP_SINGLE_THREAD) else() message(FATAL_ERROR "environment lacks needed fftw3 features") endif() else() message(STATUS "Disabling fftw3 support") endif() asymptote-3.05/cmake-scripts/win32-pre-nsis-installer.cmake0000644000000000000000000001436115031566105022435 0ustar rootrootif (NOT WIN32) message(FATAL_ERROR "Pre-NSIS installation is intended for windows only!") endif() if (NOT ASY_WIN_RESOURCE_DIR) message(FATAL_ERROR "ASY_WIN_RESOURCE_DIR is not defined. Please ensure win32-specific.cmake is included before this file!") endif() if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set_property(CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${CMAKE_CURRENT_SOURCE_DIR}/cmake-install-win32") endif() # helper target for files needed add_custom_target(asy-pre-nsis-targets DEPENDS asy asy-basefiles) # check done, start configuration set(ASYMPTOTE_NSI_CONFIGURATION_DIR ${CMAKE_CURRENT_BINARY_DIR}/nsifiles) file(MAKE_DIRECTORY ${ASYMPTOTE_NSI_CONFIGURATION_DIR}) configure_file( ${ASY_WIN_RESOURCE_DIR}/AsymptoteInstallInfo.nsi.in ${ASYMPTOTE_NSI_CONFIGURATION_DIR}/AsymptoteInstallInfo.nsi ) set(ASY_INSTALL_DIRECTORY build-${ASY_VERSION}) set(BUILD_ASY_INSTALLER_SCRIPT ${ASY_WIN_RESOURCE_DIR}/build-asymptote-installer.py) configure_file( ${ASY_WIN_RESOURCE_DIR}/build-asy-installer.ps1.in ${ASYMPTOTE_NSI_CONFIGURATION_DIR}/build-asy-installer.ps1 ) set(ASY_PRE_NSIS_COMPONENT_NAME asy-pre-nsis) set(ASY_NSIS_INSTALL_ARGUMENT COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME} DESTINATION ${ASY_INSTALL_DIRECTORY} ) set(ASY_NSIS_TARGET_EXAMPLES_INSTALL_ARGUMENT COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME} DESTINATION ${ASY_INSTALL_DIRECTORY}/examples ) set(ASY_NSIS_INSTALL_RESOURCES_ARGUMENT COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME} DESTINATION . ) # /asy.exe -> /asy.exe install(TARGETS asy RUNTIME_DEPENDENCIES PRE_EXCLUDE_REGEXES "api-ms-" "ext-ms-" POST_EXCLUDE_REGEXES ".*system32/.*\\.dll" ${ASY_NSIS_INSTALL_ARGUMENT} ) # /base/*, /examples -> / install( DIRECTORY ${ASY_BUILD_BASE_DIR}/ ${CMAKE_CURRENT_SOURCE_DIR}/examples ${ASY_NSIS_INSTALL_ARGUMENT} ) # /base/asy-{init,mode}.el -> / install( FILES ${ASY_SOURCE_BASE_DIR}/asy-init.el ${ASY_SOURCE_BASE_DIR}/asy-mode.el ${ASY_NSIS_INSTALL_ARGUMENT} ) # misc files -> / install( FILES ${ASY_OUTPUT_MISC_FILES} ${ASY_NSIS_INSTALL_ARGUMENT} ) # extra doc files install( FILES ${ASY_DOC_DIR}/latexusage.tex ${ASY_DOC_DIR}/externalprc.tex ${ASY_NSIS_TARGET_EXAMPLES_INSTALL_ARGUMENT} ) install( DIRECTORY ${ASY_DOC_DIR}/ ${ASY_NSIS_TARGET_EXAMPLES_INSTALL_ARGUMENT} FILES_MATCHING PATTERN "*.asy" PATTERN "*.csv" PATTERN "*.dat" ) # resources files for installer + nsi files install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE ${ASY_WIN_RESOURCE_DIR}/asy.ico ${ASY_WIN_RESOURCE_DIR}/asymptote.nsi ${ASYMPTOTE_NSI_CONFIGURATION_DIR}/AsymptoteInstallInfo.nsi ${ASYMPTOTE_NSI_CONFIGURATION_DIR}/build-asy-installer.ps1 ${ASY_NSIS_INSTALL_RESOURCES_ARGUMENT} ) install( DIRECTORY ${ASY_WIN_RESOURCE_DIR}/ ${ASY_NSIS_INSTALL_RESOURCES_ARGUMENT} FILES_MATCHING PATTERN "*.nsh" ) # if a component is not buildable macro(action_if_component_not_buildable message) message(WARNING "Please ensure this issue is resolved before installing. Message: ${message}") if (ALLOW_PARTIAL_INSTALLATION) install(CODE "message(WARNING \"${message}\")" COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME}) else() install(CODE "message(FATAL_ERROR \"${message}\")" COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME}) endif() endmacro() # unfortuantely, we have to first call the "docgen" target manually # this can also be called from asy-pre-nsis-targets, which includes asy-with-basefiles alongside docgen. # this is a limitation of cmake currently (https://discourse.cmake.org/t/install-file-with-custom-target/2984/2) if (ASY_TEX_BUILD_ROOT) add_dependencies(asy-pre-nsis-targets docgen) endif() if (ENABLE_MISCFILES_GEN) add_dependencies(asy-pre-nsis-targets asy-dist-misc-files) endif() macro(install_from_external_documentation_dir docfile_name) set(DOCFILE_LOCATION ${EXTERNAL_DOCUMENTATION_DIR}/${docfile_name}) message(STATUS "Using external documentation file at ${DOCFILE_LOCATION}") if (NOT EXISTS ${DOCFILE_LOCATION}) message(WARNING "${DOCFILE_LOCATION} not found. Please ensure this file exists before running \"cmake --install\"." ) endif() install(FILES ${DOCFILE_LOCATION} ${ASY_NSIS_INSTALL_ARGUMENT}) endmacro() if (ASY_TEX_BUILD_ROOT) # basic docgen possible install( FILES ${BASE_ASYMPTOTE_DOC_AND_TEX_FILES} ${ASY_NSIS_INSTALL_ARGUMENT} ) elseif(EXTERNAL_DOCUMENTATION_DIR) set( ASY_DOC_FILES_TO_COPY asymptote.sty asy-latex.pdf CAD.pdf TeXShopAndAsymptote.pdf asyRefCard.pdf ) foreach(ASY_DOC_FILE ${ASY_DOC_FILES_TO_COPY}) install_from_external_documentation_dir(${ASY_DOC_FILE}) endforeach() else() action_if_component_not_buildable("base asymptote documentation cannot be found and is not buildable") endif() # asymptote.pdf if(ENABLE_ASYMPTOTE_PDF_DOCGEN) message(STATUS "Using asymptote.pdf from ${ASY_TEX_BUILD_ROOT}/asymptote.pdf") install( FILES ${ASY_TEX_BUILD_ROOT}/asymptote.pdf ${ASY_NSIS_INSTALL_ARGUMENT} ) elseif (EXTERNAL_DOCUMENTATION_DIR) install_from_external_documentation_dir(asymptote.pdf) else() action_if_component_not_buildable("asymptote.pdf cannot be found and is not buildable") endif() # asy-keywords.el (and potentially other misc files) if (ENABLE_MISCFILES_GEN) install( FILES ${ASY_OUTPUT_DIST_MISC_FILES} ${ASY_NSIS_INSTALL_ARGUMENT} ) elseif(EXTERNAL_DOCUMENTATION_DIR) install_from_external_documentation_dir(asy-keywords.el) else() action_if_component_not_buildable("Non-essential, non-documentation asymptote files cannot be found") endif() # README files install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.LESSER ${CMAKE_CURRENT_SOURCE_DIR}/README ${ASY_WIN_RESOURCE_DIR}/asy.ico ${ASY_NSIS_INSTALL_ARGUMENT} ) asymptote-3.05/build-scripts/0000755000000000000000000000000015031566105014752 5ustar rootrootasymptote-3.05/build-scripts/build-asymptote-CTAN0000755000000000000000000000137415031566105020552 0ustar rootroot#!/bin/sh -x BINDIR=x86_64-windows HOME=/home/$USER SHARED=$HOME/shared/asy ASYMPTOTE=$HOME/asymptote cd $ASYMPTOTE VERSION=`grep AC_INIT configure.ac | cut -s -d[ -f3 | cut -s -d] -f1 | sed -e 's/git//'` cd /tmp echo Building asymptote-$VERSION-CTAN SRC=/usr/local/src/asymptote-$VERSION.src.tgz rm -rf asymptote-$VERSION tar -zxf $SRC cd asymptote-$VERSION find . -name ".[^.]*" -exec rm -rf {} \; rm -rf libatomic_ops/m4 mkdir -p binaries/$BINDIR/texlive cd binaries/$BINDIR cp $SHARED/CTAN/asy.exe texlive cp $SHARED/CTAN/dll/*.dll . cp -a ../../README . cp -a ../../build-scripts/README-binaries texlive/README cd ../../.. rm -rf asymptote mv asymptote-$VERSION asymptote tar cfz asymptote-$VERSION-CTAN.tgz asymptote cp asymptote-$VERSION-CTAN.tgz $SHARED asymptote-3.05/build-scripts/build-asymptote.ps10000644000000000000000000002230415031566105020522 0ustar rootroot#!/usr/bin/env pwsh <# .SYNOPSIS Script to build asymptote .DESCRIPTION Builds asymptote installer file. This script uses asymptote source directory. If building fails, try removing cmake-build-msvc/release directory .PARAMETER Version Specifies Asymptote version to build. If not given, will automatically determine version from configure.ac. #> param( [AllowEmptyString()] [Parameter()] [string]$Version ) $ErrorActionPreference = "Stop" $PSNativeCommandUseErrorActionPreference = $true $usageString="Usage: $PSCommandPath -Version " $asymptoteRoot="$(Split-Path -Parent $PSCommandPath)/.." if (-Not (Test-Path -PathType container $asymptoteRoot)) { Write-Error "No asymptote root found. Exiting." Break } # ---------------------------------------------------- # checking documentation files if ($env:ASYMPTOTE_BUILD_SHARED_DIRECTORY) { $extfilesRoot="$env:ASYMPTOTE_BUILD_SHARED_DIRECTORY/asydoc" } else { $extfilesRoot = "asydoc" } $requiredDocumentationFiles=@( "asymptote.sty" "asymptote.pdf" "asy-latex.pdf" "CAD.pdf" "TeXShopAndAsymptote.pdf" "asyRefCard.pdf" "asy-keywords.el" ) $hasDocFiles=$true foreach ($requiredDocFile in $requiredDocumentationFiles) { if (-Not (Test-Path -PathType leaf "$extfilesRoot/$requiredDocFile")) { $hasDocFiles=$false Write-Error "$requiredDocFile not found. Please ensure $requiredDocFile is available in $extfilesRoot directory" } } if (-Not $hasDocFiles) { Write-Error "Documentation file(s) are not present in $extFilesRoot directory. Will not build asymptote." Break } # ---------------------------------------------------- # copy documentation files to asymptote directory $localAsyDocRoot="$asymptoteRoot/asydoc" if (-Not (Test-Path -Type Container $localAsyDocRoot)) { New-Item -ItemType Directory -Path $localAsyDocRoot -Force } foreach ($requiredDocFile in $requiredDocumentationFiles) { $sourceDocFile="$extfilesRoot/$requiredDocFile" $destDocFile="$localAsyDocRoot/$requiredDocFile" $docFileHash=Get-FileHash -Algorithm SHA256 -Path $sourceDocFile if (Test-Path -Type Leaf "$destDocFile") { $asyDocFilehash=Get-FileHash -Algorithm SHA256 -Path $destDocFile if ($docFileHash.Hash -eq $asyDocFilehash.Hash) { Write-Host "File $requiredDocFile exists in asydoc directory; not copying" continue } } Write-Host "Copying $sourceDocFile to $destDocFile" Copy-Item -Force $sourceDocFile -Destination $destDocFile } # ---------------------------------------------------- # tools cache $toolscacheRoot="tools-cache" New-Item -ItemType Directory -Path $toolscacheRoot -Force $useToolsCacheVcpkg=$false # tools cache variables $vcpkgSha256="5e5d0e1cd7785623065e77eff011afdeec1a3574" # vcpkg if (-Not $env:VCPKG_ROOT) { $vcpkgToolsCacheLoc = "$toolscacheRoot/vcpkg" Write-Host "VCPKG_ROOT Not found, checking for $vcpkgToolsCacheLoc" if (-Not (Test-Path -PathType Container $vcpkgToolsCacheLoc)) { git clone https://github.com/microsoft/vcpkg.git "$vcpkgToolsCacheLoc" } else { Write-Host "vcpkg directory found" } git -C $vcpkgToolsCacheLoc fetch git -C $vcpkgToolsCacheLoc reset --hard $vcpkgSha256 if (-Not (Test-Path $vcpkgToolsCacheLoc/vcpkg.exe)) { Push-Location $vcpkgToolsCacheLoc & ./bootstrap-vcpkg.bat Pop-Location } $useToolsCacheVcpkg=true } else { Write-Host "Using VCPKG_ROOT at $($env:VCPKG_ROOT)" } # ------------------------------------------------------ # checking for NSIS $makeNsisLoc=$null # checking for downloaded nsis if ($null -eq $makeNsisLoc) { $nsisToolsCacheRoot="$toolscacheRoot/nsis" $downloadedNsis = "$nsisToolsCacheRoot/makensis.exe" if (Test-Path -PathType leaf $downloadedNsis) { Write-Host "Found downloaded NSIS at $downloadedNsis" $makeNsisLoc=$downloadedNsis } } # checking registry & install location if ($null -eq $makeNsisLoc) { $nsisInstallEntry = Get-ItemProperty ` -Path HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\NSIS ` -Name InstallLocation ` -ErrorAction SilentlyContinue if ($null -ne $nsisInstallEntry) { # entry found for registry $nsisTestPath = "$( $nsisInstallEntry.InstallLocation )/makensis.exe" if (Test-Path -PathType leaf $nsisTestPath) { Write-Host "Found installed NSIS. Using NSIS at $nsisTestPath" $makeNsisLoc = $nsisTestPath } } } # check in tools-cache/nsis if ($null -Eq $makeNsisLoc) { $nsisPathExec = Get-Command makensis -ErrorAction ignore if ($null -Ne $nsisPathExec) { Write-Host "Found NSIS in PATH at $($makeNsisLoc.Path)". $makeNsisLoc=$nsisPathExec.Path } } # nsis not found if ($null -eq $makeNsisLoc) { Write-Error "Cannot find NSIS. Please either (1, Recommended) Install NSIS from https://sourceforge.net/projects/nsis/ (2) Download NSIS ZIP and extract the files to $toolscacheRoot so that $nsisToolsCacheRoot/makensis.exe is available " Break } # ------------------------------------------------ # python $pyVenvLocation="$toolscacheRoot/pyxasy" $pyXasyActivateScript="$pyVenvLocation/Scripts/activate.ps1" if (-Not (Test-Path -PathType leaf $pyXasyActivateScript)) { python -m virtualenv -p C:\\Users\\jamievl\\AppData\\Local\\Programs\\Python\\Python39\\python.exe $pyVenvLocation } # ---------------------------------------------------- # determine version, if not given in arguments if (0 -eq $Version.Length) { Write-Host "Version not given; will try to determine version" Push-Location $asymptoteRoot $Version=python generate_asy_ver_info.py --version-for-release if (0 -ne $LASTEXITCODE) { Write-Error $usageString Write-Error "Cannot automatically determine release asymptote version. Please specify the version manually" Pop-Location Break } Pop-Location Write-Host "Asymptote version is $Version" } # ---------------------------------------------------- # build GUI & $pyXasyActivateScript Push-Location $asymptoteRoot/GUI & python -m pip install -r requirements.txt & python buildtool.py build --version-override=$Version Pop-Location # ---------------------------------------------------- function buildAsy($preset, $cfgDir) { # build C++ side Import-VisualStudioVars -Architecture x64 Push-EnvironmentBlock $env:ASY_VERSION_OVERRIDE = $Version if ($useToolsCacheVcpkg) { $env:VCPKG_ROOT = $vcpkgToolsCacheLoc } # ------------------------------------ # clear CMakeCache.txt if (Test-Path -Type Leaf "$asymptoteRoot/$cfgDir/CMakeCache.txt") { Remove-Item -Force "$asymptoteRoot/$cfgDir/CMakeCache.txt" } # ------------------------------------ # configure Push-Location $asymptoteRoot cmake --preset $preset Pop-Location # ------------------------------------ # build cmake --build $asymptoteRoot/$cfgDir --target asy-pre-nsis-targets -j Pop-EnvironmentBlock # ASY_VERSION_OVERRIDE, VCPKG_ROOT Pop-EnvironmentBlock # Visual studio vars # install to pre-installation root } buildAsy msvc/release/with-external-doc-files cmake-build-msvc/release cmake --install $asymptoteRoot/cmake-build-msvc/release --component asy-pre-nsis copy $asymptoteRoot/cmake-build-msvc/release/base/version.asy base # ------------------------------------------------------ # Generate NSIS installer file & $asymptoteRoot/cmake-install-w32-nsis-release/build-asy-installer.ps1 "$makeNsisLoc" $asySetupName="asymptote-$Version-setup.exe" $asySetupFile="$asymptoteRoot/cmake-install-w32-nsis-release/$asySetupName" if (Test-Path -PathType leaf "$asySetupName") { Write-Host "Found old setup file. Will delete the file." Remove-Item -Force "asymptote-$Version-setup.exe" } if (Test-Path -PathType leaf $asySetupFile) { # --------------------------------------- # copy setup file to shared directory, if given if ($env:ASYMPTOTE_BUILD_SHARED_DIRECTORY) { Write-Host "Copying setup file to shared directory." Copy-Item -Force $asySetupFile "$env:ASYMPTOTE_BUILD_SHARED_DIRECTORY/$asySetupName" } Move-Item $asySetupFile . -Force } else { Write-Error "Asymptote setup file not built." Break } # ------------------------------------------------------ # building for CTAN buildAsy msvc/release/with-external-doc-files/with-ctan cmake-build-msvc/release if ($env:ASYMPTOTE_BUILD_SHARED_DIRECTORY) { Write-Output "Using shared build directory at $ASYMPTOTE_BUILD_SHARED_DIRECTORY for CTAN output" $ctanOutputDir = "$env:ASYMPTOTE_BUILD_SHARED_DIRECTORY/CTAN" } else { Write-Output "No shared directory specified. Using CTAN directory at top-level" $ctanOutputDir = "CTAN" } New-Item -ItemType Directory -Path "$ctanOutputDir" -Force New-Item -ItemType Directory -Path "$ctanOutputDir/dll" -Force Get-ChildItem "$asymptoteRoot/cmake-install-w32-nsis-release/build-$Version/" ` -Filter "*.dll" | Copy-Item -Force -Destination "$ctanOutputDir/dll" Copy-Item $asymptoteRoot/cmake-build-msvc/release/asy.exe -Force -Destination "$ctanOutputDir/asy.exe" Pop-Location # asymptote deactivate # pyxasy build environment asymptote-3.05/build-scripts/run-in-indent.el0000644000000000000000000000031215031566105017757 0ustar rootroot(load-file "cc-mode2.el") (c++-mode) (indent-region (search-forward " " nil nil 2) (point-max) nil) (untabify (point-min) (point-max)) (delete-trailing-whitespace (point-min) (point-max)) (save-buffer) asymptote-3.05/build-scripts/cc-format.el0000644000000000000000000000305215031566105017147 0ustar rootroot(defun change (old-pat new-pat) "Replace all occurences of old-pat to new-pat in current buffer." (interactive "r") (goto-char (point-min)) (replace-string old-pat new-pat)) (defun changereg (old-regexp new-regexp) "Replace all occurences of old-regexp to new-regexp in current buffer." (interactive "r") (goto-char (point-min)) (replace-regexp old-regexp new-regexp)) (defun querychangereg (old-regexp new-regexp) "Replace all occurences of old-regexp to new-regexp in current buffer, with query." (interactive "r") (goto-char (point-min)) (query-replace-regexp old-regexp new-regexp)) (set-variable 'case-fold-search nil) (change " + " "+") (change " - " "-") (change " * " "*") (change " / " "/") (change " = " "=") (change " --" "--") (change "-- " "--") (change " ++" "++") (change "++ " "++") (change " .. " "..") (change " ^^ " "^^") (change " & " "&") (change " :: " "::") (change ";--" "; --") (change " (" "(") (change " )" ")") (change " }" "}") (changereg "( \\([^/]\\)" "(\\1") (changereg "{ \\([^/]\\)" "{\\1") (changereg "\\([^ ]\\)\\?" "\\1 ?") (changereg "\\?\\([^ ]\\)" "? \\1") (changereg ";\\([^ \\} ]\\)" "; \\1") ;;(changereg "\\([^ ]\\):" "\\1 :") (changereg ":\\([^ ]\\)" ": \\1") (changereg "\\([+-*/=!]\\)=\\([^ ]\\)" "\\1= \\2") (changereg "\\([^ ]\\)\\([+-*/=!]\\)=" "\\1 \\2=") (changereg "\\([]\\)\\([^ =]\\)" "\\1 \\2") (changereg "\\([^ ]\\)\\([]\\)" "\\1 \\2") (changereg "&&\\([^ ]\\)" "&& \\1") (changereg "||\\([^ ]\\)" "|| \\1") (changereg "\\[\\]\\([^ []\\)" "[] \\1") (indent-region (point-min) (point-max)) (querychangereg ", " ",") asymptote-3.05/build-scripts/README-binaries0000644000000000000000000000045115031566105017424 0ustar rootrootThe Asymptote executable for MSWindows can only be released under the GNU General Public License (GPL) as it is linked against the GNU Scientific Library, GNU Readline library, WolfSSL, and other GPL libraries. The Asymptote source itself is released under the GNU Lesser General Public License. asymptote-3.05/build-scripts/asy-format.el0000644000000000000000000000306415031566105017361 0ustar rootroot(defun change (old-pat new-pat) "Replace all occurences of old-pat to new-pat in current buffer." (interactive "r") (goto-char (point-min)) (replace-string old-pat new-pat)) (defun changereg (old-regexp new-regexp) "Replace all occurences of old-regexp to new-regexp in current buffer." (interactive "r") (goto-char (point-min)) (replace-regexp old-regexp new-regexp)) (defun querychangereg (old-regexp new-regexp) "Replace all occurences of old-regexp to new-regexp in current buffer, with query." (interactive "r") (goto-char (point-min)) (query-replace-regexp old-regexp new-regexp)) (set-variable 'case-fold-search nil) (change " + " "+") (change " - " "-") ;;(change " * " "*") (change " / " "/") (change " = " "=") (change " --" "--") (change "-- " "--") (change " ++" "++") (change "++ " "++") (change " .. " "..") (change " ^^ " "^^") (change " & " "&") (change " :: " "::") (change ";--" "; --") (change " (" "(") (change " )" ")") (change " }" "}") (changereg "( \\([^/]\\)" "(\\1") (changereg "{ \\([^/]\\)" "{\\1") (changereg "\\([^ ]\\)\\?" "\\1 ?") (changereg "\\?\\([^ ]\\)" "? \\1") (changereg ";\\([^ \\} ]\\)" "; \\1") ;;(changereg "\\([^ ]\\):" "\\1 :") (changereg ":\\([^ ]\\)" ": \\1") (changereg "\\([+-*/=!<>]\\)=\\([^ ]\\)" "\\1= \\2") (changereg "\\([^ ]\\)\\([+-*/=!<>]\\)=" "\\1 \\2=") (changereg "\\([<>]\\)\\([^ =]\\)" "\\1 \\2") (changereg "\\([^ ]\\)\\([<>]\\)" "\\1 \\2") (changereg "&&\\([^ ]\\)" "&& \\1") (changereg "||\\([^ ]\\)" "|| \\1") (changereg "\\[\\]\\([^ []\\)" "[] \\1") (indent-region (point-min) (point-max)) (querychangereg ", " ",") asymptote-3.05/build-scripts/asy-indent.el0000644000000000000000000000032215031566105017344 0ustar rootroot(load-file "/usr/local/share/asymptote/asy-mode.el") (asy-mode) (indent-region (point-min) (point-max) nil) (untabify (point-min) (point-max)) (delete-trailing-whitespace (point-min) (point-max)) (save-buffer) asymptote-3.05/build-scripts/build-asymptote0000755000000000000000000000451115031566105020023 0ustar rootroot#!/bin/sh -x HOME=/home/$USER SHARED=$HOME/shared/asy ASYMPTOTE=$HOME/asymptote BUILD=/usr/local/src MAKEFLAGS=-j8 export MAKEFLAGS BINDIR=usr test /usr -ef $BUILD/$BINDIR && exit LATEXDIR=$BUILD/$BINDIR/share/texmf/tex/latex/asymptote cd $BUILD rm -rf asymptote git clone http://github.com/vectorgraphics/asymptote cd asymptote git log > ChangeLog VERSIONgit=`grep AC_INIT configure.ac | cut -s -d[ -f3 | cut -s -d] -f1` VERSION=${VERSIONgit/git/}$1 cat configure.ac | sed -e "s/$VERSIONgit/$VERSION/" > configure.ac_ mv configure.ac_ configure.ac cat $ASYMPTOTE/asymptote.spec | sed -e "s|Version:.*|Version: $VERSION|" > asymptote.spec SRC=asymptote-$VERSION.src.tgz cp asymptote.spec $ASYMPTOTE cd $BUILD rm -rf asymptote-$VERSION rm -rf $BUILD/$BINDIR mv asymptote asymptote-$VERSION chown -R root:root asymptote-$VERSION cd asymptote-$VERSION find . -name ".[^.]*" -exec rm -rf {} \; ./autogen.sh ./configure make $MAKEFLAGS check || exit make uninstall build-scripts/build-asygl GLMATRIX=`/bin/ls -d gl-matrix-*-pruned` mkdir temp mv $GLMATRIX temp mkdir -p $GLMATRIX/dist cp temp/$GLMATRIX/LICENSE.js $GLMATRIX/ cp temp/$GLMATRIX/dist/gl-matrix.js $GLMATRIX/dist/ rm -rf temp make $MAKEFLAGS asy rm base/webgl/asygl-*.js make -j1 all make -j1 install strip asy make DESTDIR="$BUILD/" latexdir=$LATEXDIR install rm $BUILD/$BINDIR/local/info/dir cp -a $BUILD/asymptote-$VERSION/ChangeLog . cp -a $ASYMPTOTE/ReleaseNotes . rm -rf $SHARED/asydoc mkdir -p $SHARED/asydoc/png mkdir -p $SHARED/asydoc/FAQ cp -a $BUILD/asymptote-$VERSION/doc/asymptote.sty $SHARED/asydoc make distclean rm -rf autom4te.cache cd /usr/local/share/doc/asymptote cp -a *.pdf ../../man/man1/asy.1 ../../asymptote/asy-keywords.el $SHARED/asydoc cp -a *.pdf ../../man/man1/asy.1 $BUILD/asymptote-$VERSION/doc cp -a /usr/local/share/info/asymptote/asymptote.info $SHARED/asydoc/png cp -a /usr/local/share/info/asymptote/asymptote.info $BUILD/asymptote-$VERSION/doc/png cp -a /usr/local/share/info/asy-faq.info $SHARED/asydoc/FAQ cp -a /usr/local/share/info/asy-faq.info $BUILD/asymptote-$VERSION/doc/FAQ cd $BUILD tar cfz $SRC asymptote-$VERSION tar cfz asymptote-$VERSION.x86_64.tgz $BINDIR cp $SRC $SHARED rm -rf $BUILD/$BINDIR tar -zxf asymptote-$VERSION.x86_64.tgz su rpmbuild -c "rpmbuild -ta --nodeps $SRC && rm -rf ~/rpms/BUILD/asymptote-$VERSION&&chmod -R g+r /u/rpmbuild/rpms/RPMS/" asymptote-3.05/build-scripts/HOWTO-MSWindows0000644000000000000000000000222115031566105017462 0ustar rootroot Compiling MSWindows binary of Asymptote under MSVC First ensure that the asymptote documentation files and asymptote.sty are built under Linux. Copy these to the Z:\asy\asydoc directory. Ensure git is available Ensure Powershell execution policy is at least unrestricted (the default for Powershell 7): Set-ExecutionPolicy -Scope CurrentUser unrestricted # TODO: Does unrestricted execution policy work by default? Install powershell community extensions by "Install-Module Pscx -Scope CurrentUser" (https://github.com/Pscx/Pscx) Install VSSetup extension for powershell by "Install-Module VSSetup -Scope CurrentUser" Install Visual Studio Build Tools (Select CMake build tools as part of installation) Install python3 (https://www.python.org/) Install perl (https://strawberryperl.com/) Install LLVM (https://github.com/llvm/llvm-project/releases) Install virtualenv: pip3 install virtualenv Download NSIS 3+ ZIP from https://sourceforge.net/projects/nsis/ and extract to tools-cache/nsis (Make sure tools-cache/nsis/makensis.exe is available) # TODO: check if NSIS puts makensis in PATH or not for default installation ./build-asymptote.ps1 asymptote-3.05/build-scripts/build-asygl0000755000000000000000000000232015031566105017111 0ustar rootroot#!/bin/sh if [ $# -gt 1 -o \( $# = 1 -a "$1" != "debug" \) ]; then \ echo Usage: "$0 [debug]"; exit 1; \ fi if [ $# -eq 1 ]; then \ UGLIFY=cat; \ UGLIFYOPT=""; \ else \ UGLIFY=terser; \ UGLIFYOPTIONS="-m -c --comments"; \ fi GL_MATRIX_VERSION=2.4.0 GL_MATRIX_DIR=gl-matrix-$GL_MATRIX_VERSION GL_MATRIX_DIR_PRUNED=$GL_MATRIX_DIR-pruned if test ! -r $GL_MATRIX_DIR_PRUNED; then \ TEMPDIR=`mktemp -d` TARFILE=$TEMPDIR/$GL_MATRIX_DIR.tar.gz wget https://github.com/toji/gl-matrix/archive/v$GL_MATRIX_VERSION.tar.gz --output-document=$TARFILE tar -zxf $TARFILE mv $GL_MATRIX_DIR $GL_MATRIX_DIR_PRUNED rm -r $TEMPDIR cd $GL_MATRIX_DIR_PRUNED patch -p1 < ../patches/$GL_MATRIX_DIR_PRUNED.patch npm install npm run build-all echo "/*@license for gl-matrix mat3 and mat4 functions:" > LICENSE.js echo "*/"| cat LICENSE.md - >> LICENSE.js cd .. fi SHADERS=`mktemp` echo "let vertex=\`" > $SHADERS echo "\`;" | cat webgl/vertex.glsl - >> $SHADERS echo "let fragment=\`" >> $SHADERS echo "\`;" | cat webgl/fragment.glsl - >> $SHADERS echo | cat webgl/license $GL_MATRIX_DIR_PRUNED/LICENSE.js \ $SHADERS $GL_MATRIX_DIR_PRUNED/dist/gl-matrix.js - webgl/gl.js | \ $UGLIFY $UGLIFYOPTIONS > base/webgl/asygl.js rm $SHADERS asymptote-3.05/build-scripts/cc-indent.el0000644000000000000000000000026715031566105017145 0ustar rootroot(load-file "cc-mode2.el") (c++-mode) (indent-region (point-min) (point-max) nil) (untabify (point-min) (point-max)) (delete-trailing-whitespace (point-min) (point-max)) (save-buffer) asymptote-3.05/versionTemplate.asy.in0000644000000000000000000000014215031566105016467 0ustar rootroot// This file is automatically generated. Do not modify manually string VERSION="${ASY_VERSION}"; asymptote-3.05/pipestream.h0000644000000000000000000000521715031566105014515 0ustar rootroot/* Pipestream: A simple C++ interface to UNIX pipes Version 0.05 Copyright (C) 2005-2014 John C. Bowman, with contributions from Mojca Miklavec This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef PIPESTREAM_H #define PIPESTREAM_H #if defined(_WIN32) #include "win32pipestream.h" typedef w32::Win32IoPipeStream iopipestream; #else #include #include #include "common.h" // bidirectional stream for reading and writing to pipes class iopipestream { protected: int in[2]; int out[2]; static const int BUFSIZE=SHRT_MAX; char buffer[BUFSIZE]; string sbuffer; int pid; bool Running; bool pipeopen; bool pipein; public: void open(const mem::vector &command, const char *hint=NULL, const char *application="", int out_fileno=STDOUT_FILENO); bool isopen() {return pipeopen;} iopipestream(): pid(0), pipeopen(false) {} iopipestream(const mem::vector &command, const char *hint=NULL, const char *application="", int out_fileno=STDOUT_FILENO) : pid(0), pipeopen(false) { open(command,hint,application,out_fileno); } void eof(); virtual void pipeclose(); virtual ~iopipestream() { pipeclose(); } void block(bool write=false, bool read=true); ssize_t readbuffer(); string readline(); bool running() {return Running;} typedef iopipestream& (*imanip)(iopipestream&); iopipestream& operator << (imanip func) { return (*func)(*this); } iopipestream& operator >> (string& s) { readbuffer(); s=buffer; return *this; } bool tailequals(const char *buf, size_t len, const char *prompt, size_t plen); string getbuffer() {return sbuffer;} void wait(const char *prompt); int wait(); void Write(const string &s); iopipestream& operator << (const string& s) { Write(s); return *this; } template iopipestream& operator << (T x) { ostringstream os; os << x; Write(os.str()); return *this; } }; #endif #endif asymptote-3.05/drawgrestore.h0000644000000000000000000000075615031566105015057 0ustar rootroot/***** * drawgrestore.h * John Bowman * * Output PostScript grestore to picture. *****/ #ifndef DRAWGRESTORE_H #define DRAWGRESTORE_H #include "drawelement.h" namespace camp { class drawGrestore : public drawElement { public: drawGrestore() {} virtual ~drawGrestore() {} bool draw(psfile *out) { out->grestore(); return true; } bool write(texfile *out, const bbox&) { out->grestore(); return true; } }; } GC_DECLARE_PTRFREE(camp::drawGrestore); #endif asymptote-3.05/knot.h0000644000000000000000000002774315031566105013327 0ustar rootroot/***** * knot.h * Andy Hammerlindl 200/02/10 * * Describes a knot, a point and its neighbouring specifiers, used as an * intermediate structure in solving paths. *****/ #ifndef KNOT_H #define KNOT_H #include #include #include #include "mod.h" #include "pair.h" #include "path.h" namespace camp { using mem::vector; // The choice of branch cuts of atan2 disguishes between y=+0.0 and y=-0.0 in // the case where x<0. This can lead to strange looking paths being // calculated from guides of the form a..b..cycle. To avoid these degenerate // cases, the niceAngle routine moves the branch cut so that the sign of a // zero won't matter. double niceAngle(pair z); // A cyclic vector: ie. a vector where the index is taken mod the size of the // vector. template class cvector : public vector { public: cvector() {} cvector(size_t n) : vector(n) {} cvector(size_t n, const T& t) : vector(n,t) {} cvector(const vector& v) : vector(v) {} T& operator[](Int j) { return vector::operator[](imod(j,(Int) this->size())); } const T& operator[](Int j) const { return vector::operator[](imod(j,(Int) this->size())); } }; // Forward declaration. class knotlist; /* A linear equation (one of a set of equations to solve for direction through knots in a path). The i-th equation is: pre*theta[i-1] + piv*theta[i] + post*theta[i+1] = aug where indices are taken mod n. */ struct eqn { double pre,piv,post,aug; eqn(double pre, double piv, double post, double aug) : pre(pre), piv(piv), post(post), aug(aug) {} friend ostream& operator<< (ostream& out, const eqn& e) { return out << e.pre << " * pre + " << e.piv << " * piv + " << e.post << " * post = " << e.aug; } }; // A direction specifier, telling how the path behaves coming in or out of a // point. The base class represents the "open" specifier. class spec : public gc { public: virtual ~spec() {} // If the knot is open, it gives no restriction on the behavior of the // path. virtual bool open() { return true; } virtual bool controlled() { return false; } virtual pair control() {return pair(0.0,0.0);} virtual double curl() { return -1.0; } virtual pair dir() { return pair(0.0,0.0); } // When a knot has a restriction on one side but is open on the other, the // restriction implies a restriction on the other side. This is the partner // restriction defined here, where the pair argument is for the location of // the knot. virtual spec *outPartner(pair) { return this; } virtual spec *inPartner(pair) { return this; } virtual void print(ostream&) const {} }; inline ostream& operator<< (ostream& out, spec& s) { s.print(out); return out; } // Specifier used at an endpoint. class endSpec : public spec { public: bool open() { return false; } // Returns an equation used to solve for the thetas along the knot. These are // called by eqnprop in the non-cyclic case for the first and last equations. virtual eqn eqnOut(Int j, knotlist& l, cvector& d, cvector& psi) = 0; virtual eqn eqnIn (Int j, knotlist& l, cvector& d, cvector& psi) = 0; }; // A specifier with a given direction (in radians). class dirSpec : public endSpec { double given; public: // Direction should be given in the range [-PI,PI] dirSpec(double given) : given(given) {} dirSpec(pair z) : given(niceAngle(z)) {} pair dir() { return expi(given); } eqn eqnOut(Int j, knotlist& l, cvector& d, cvector& psi); eqn eqnIn (Int j, knotlist& l, cvector& d, cvector& psi); void print(ostream& out) const { out << "{dir(" << degrees(given) << ")}"; } }; // A curl specifier. The curvature at the end knot should be gamma times the // curvature at the neighbouring knot. class curlSpec : public endSpec { double gamma; public: // Gamma should be non-negative. curlSpec(double gamma=1.0) : gamma(gamma) { if(gamma < 0) reportError("curl cannot be less than 0"); } double curl() { return gamma; } eqn eqnOut(Int j, knotlist& l, cvector& d, cvector& psi); eqn eqnIn (Int j, knotlist& l, cvector& d, cvector& psi); void print(ostream& out) const { out << "{curl " << gamma << "}"; } }; // A specifier with a control point. All information for this portion of the // curve has been determined. class controlSpec : public spec { public: pair cz; bool straight; controlSpec(pair cz, bool straight=false) : cz(cz), straight(straight) {} bool open() { return false; } bool controlled() { return true; } pair control() { return cz; } // The partner spec will be a dirSpec in the same direction the specifier // takes the path, unless the velocity is zero, then it uses a curl // specifier. spec *outPartner(pair); spec *inPartner(pair); void print(ostream& out) const { // NOTE: This format cannot be read back in. out << "{control " << cz << "}"; } }; // The tension information for one side of a knot. struct tension { double val; bool atleast; tension(double val=1.0, bool atleast=false) : val(val), atleast(atleast) { if(val < 0.75) reportError("tension cannot be less than 3/4"); } }; inline ostream& operator<<(ostream& out, tension t) { return out << "tension" << (t.atleast ? " atleast " : " ") << t.val; } // A knot, a point with specifiers to double the path coming in and going out // of the knot. struct knot { pair z; spec *in; spec *out; tension tin, tout; knot() {} knot(pair z, spec *in, spec *out, tension tin=tension(), tension tout=tension()) : z(z), in(in), out(out), tin(tin), tout(tout) {} double alpha() { return 1.0/tout.val; } double beta() { return 1.0/tin.val; } }; ostream& operator<<(ostream& out, const knot& k); // Abstract base class for a section of a guide. class knotlist { public: virtual ~knotlist() {} virtual Int length() = 0; virtual bool cyclic() = 0; // Returns the number of knots. Int size() { return cyclic() ? length() : length() + 1; } bool empty() { return size()==0; } virtual knot& cell(Int) = 0; virtual knot& operator[] (Int i) { #if 0 assert(cyclic() || (0 <= i && i <= length())); // Bounds check. #endif return cell(i); } knot& front() { return (*this)[0]; } knot& back() { return (*this)[length()]; } }; // Defines a knotlist as a piece of another knotlist. class subknotlist : public knotlist { knotlist& l; Int a,b; public: subknotlist(knotlist& l, Int a, Int b) : l(l), a(a), b(b) {} Int length() { return b-a; } bool cyclic() { return false; } knot& cell(Int i) { return l[a+i]; } }; struct simpleknotlist : public knotlist { cvector nodes; bool cycles; simpleknotlist(cvector nodes, bool cycles=false) : nodes(nodes), cycles(cycles) {} Int length() { return cycles ? (Int) nodes.size() : (Int) nodes.size() - 1; } bool cyclic() { return cycles; } knot& cell(Int j) { return nodes[j]; } }; // A protopath is a path being made. struct protopath { bool cycles; Int n; mem::vector nodes; protopath(Int n, bool cycles) : cycles(cycles), n(n), nodes(n) {} solvedKnot& operator[](Int j) { return nodes[imod(j,n)]; } bool& straight(Int j) { return (*this)[j].straight; } pair& pre(Int j) { return (*this)[j].pre; } pair& point(Int j) { return (*this)[j].point; } pair& post(Int j) { return (*this)[j].post; } void controlEnds() { if (!cycles) { solvedKnot& start=(*this)[0]; solvedKnot& end=(*this)[n-1]; start.pre=start.point; end.post=end.point; } } // Once all the controls are set, return the final (constant) path. path fix() { return path(nodes,n,cycles); } }; // Represents properties that can be computed along a knotlist. // Examples include distances (d), turning angles (psi), and the linear // equations used to solve for the thetas. template class knotprop { protected: knotlist& l; // Calculate the property for the usual case in the iteration (and for a // cyclic knot, the only case), at the index given. virtual T mid(Int) = 0; // The special cases, these default to the usual case: mid. virtual T solo(Int j) // Calculates the property for a list of length 0. { return mid(j); } virtual T start(Int j) // Calculates it at the start of the list. { return mid(j); } virtual T end(Int j) // Calculate it at the end. { return mid(j); } virtual cvector linearCompute() { Int n=l.length(); cvector v; if (n==0) v.push_back(solo(0)); else { v.push_back(start(0)); for (Int j=1; j cyclicCompute() { Int n=l.length(); cvector v; for (Int j=0; j linearBackCompute() { Int n=l.length(); cvector v; if (n==0) v.push_back(solo(0)); else { v.push_back(end(n)); for (Int j=1; j cyclicBackCompute() { Int n=l.length(); cvector v; for (Int j=1; j<=n; ++j) v.push_back(mid(n-j)); return v; } public: virtual ~knotprop() {} virtual cvector compute() { return l.cyclic() ? cyclicCompute() : linearCompute(); } // Compute the values in the opposite order. This is needed for instance if // the i-th calculation needed a result computed in the i+1-th, such as in the // back substitution for solving thetas. virtual cvector backCompute() { cvector v=l.cyclic() ? cyclicBackCompute() : linearBackCompute(); // Even though they are computed in the backwards order, return them in the // standard order. reverse(v.begin(),v.end()); return v; } knotprop(knotlist& l) : l(l) {} }; // A knot transforms, it takes in one knotlist and transforms it knot for knot // into a new one. class knottrans : public knotprop { protected: virtual knot mid(Int j) { /* By default, just copy the knot. */ return l[j]; } public: virtual ~knottrans() {} knottrans(knotlist& l) : knotprop(l) {} virtual simpleknotlist trans() { return simpleknotlist(compute(),l.cyclic()); } }; // Like a knotprop, but it doesn't compute a vector of values for the knot. It // iterates over the knotlist calling method for side-effect. For instance, // this is used to plug control points into protopaths. class knoteffect { protected: knotlist& l; virtual void mid(Int) = 0; // The special cases, these default to the usual case: mid. virtual void solo(Int j) { mid(j); } virtual void start(Int j) { mid(j); } virtual void end(Int j) { mid(j); } virtual void linearExec() { Int n=l.length(); if (n==0) solo(0); else { start(0); for (Int j=1; j& z); double velocity(double theta, double phi, tension t); } // namespace camp GC_DECLARE_PTRFREE(camp::eqn); GC_DECLARE_PTRFREE(camp::tension); #endif // KNOT_H asymptote-3.05/application.cc0000644000000000000000000004422215031566105015004 0ustar rootroot/***** * application.cc * Andy Hammerlindl 2005/05/20 * * An application is a matching of arguments in a call expression to formal * parameters of a function. Since the language allows default arguments, * keyword arguments, rest arguments, and anything else we think of, this * is not a simple mapping. *****/ #include "application.h" #include "exp.h" #include "coenv.h" #include "runtime.h" #include "runarray.h" using namespace types; using absyntax::varinit; using absyntax::arrayinit; using absyntax::arglist; namespace trans { // Lower scores are better. Packed is added onto the other qualifiers so // we may score both exact and casted packed arguments. const score FAIL=0, EXACT=1, CAST=2; const score PACKED=2; bool castable(env &e, formal& target, formal& source) { return target.Explicit ? equivalent(target.t,source.t) : e.castable(target.t,source.t, symbol::castsym); } score castScore(env &e, formal& target, formal& source) { return equivalent(target.t,source.t) ? EXACT : (!target.Explicit && e.fastCastable(target.t,source.t)) ? CAST : FAIL; } void restArg::transMaker(coenv &e, Int size, bool rest) { // Push the number of cells and call the array maker. e.c.encode(inst::intpush, size); e.c.encode(inst::builtin, rest ? run::newAppendedArray : run::newInitializedArray); } void restArg::trans(coenv &e, temp_vector &temps) { // Push the values on the stack. for (mem::list::iterator p = inits.begin(); p != inits.end(); ++p) (*p)->trans(e, temps); if (rest) rest->trans(e, temps); transMaker(e, (Int)inits.size(), (bool)rest); } class maximizer { app_list l; // Tests if x is as good (or better) an application as y. bool asgood(application *x, application *y) { // Matches to open signatures are always worse than matches to normal // signatures. if (x->sig->isOpen) return y->sig->isOpen; else if (y->sig->isOpen) return true; assert (x->scores.size() == y->scores.size()); // Test if each score in x is no higher than the corresponding score in // y. return std::equal(x->scores.begin(), x->scores.end(), y->scores.begin(), std::less_equal()); } bool better(application *x, application *y) { return asgood(x,y) && !asgood(y,x); } // Add an application that has already been determined to be maximal. // Remove any other applications that are now not maximal because of its // addition. void addMaximal(application *x) { app_list::iterator y=l.begin(); while (y!=l.end()) if (better(x,*y)) y=l.erase(y); else ++y; l.push_front(x); } // Tests if x is maximal. bool maximal(application *x) { for (app_list::iterator y=l.begin(); y!=l.end(); ++y) if (better(*y,x)) return false; return true; } public: maximizer() {} void add(application *x) { if (maximal(x)) addMaximal(x); } app_list result() { return l; } }; ty *restCellType(signature *sig) { formal& f=sig->getRest(); if (f.t) { array *a=dynamic_cast(f.t); if (a) return a->celltype; } return 0; } void application::initRest() { formal& f=sig->getRest(); if (f.t) { ty *ct = restCellType(sig); if (!ct) vm::error("formal rest argument must be an array"); rf=formal(ct, symbol::nullsym, false, f.Explicit); } if (f.t || sig->isOpen) { rest=new restArg(); } } //const Int REST=-1; const Int NOMATCH=-2; Int application::find(symbol name) { formal_vector &f=sig->formals; for (size_t i=index; iadd(seq.addArg(a, rf.t, evalIndex)); scores.push_back(s+PACKED); return true; } } return false; } bool application::matchAtSpot(size_t spot, env &e, formal &source, varinit *a, size_t evalIndex) { formal &target=sig->getFormal(spot); if(target.t->kind == types::ty_error) return false; score s=castScore(e, target, source); if (s == FAIL) return false; else if (sig->formalIsKeywordOnly(spot) && source.name == symbol::nullsym) return false; else { // The argument matches. args[spot]=seq.addArg(a, target.t, evalIndex); if (spot==index) advanceIndex(); scores.push_back(s); return true; } } bool application::matchArgument(env &e, formal &source, varinit *a, size_t evalIndex) { assert(!source.name); if (index==args.size()) // Try to pack into the rest array. return matchArgumentToRest(e, source, a, evalIndex); else // Match here, or failing that use a default and try to match at the next // spot. return matchAtSpot(index, e, source, a, evalIndex) || (matchDefault() && matchArgument(e, source, a, evalIndex)); } bool application::matchNamedArgument(env &e, formal &source, varinit *a, size_t evalIndex) { assert(source.name); Int spot=find(source.name); return spot!=NOMATCH && matchAtSpot(spot, e, source, a, evalIndex); } bool application::complete() { if (index==args.size()) return true; else if (matchDefault()) return complete(); else return false; } bool application::matchRest(env &e, formal &source, varinit *a, size_t evalIndex) { // First make sure all non-rest arguments are matched (matching to defaults // if necessary). if (complete()) // Match rest to rest. if (rest) { formal &target=sig->getRest(); score s=castScore(e, target, source); if (s!=FAIL) { rest->addRest(seq.addArg(a, target.t, evalIndex)); scores.push_back(s); return true; } } return false; } // When the argument should be evaluated, possibly adjusting for a rest // argument which occurs before named arguments. size_t adjustIndex(size_t i, size_t ri) { return i < ri ? i : i+1; } bool application::matchSignature(env &e, types::signature *source, arglist &al) { formal_vector &f=source->formals; #if 0 cout << "num args: " << f.size() << endl; cout << "num keyword-only: " << sig->numKeywordOnly << endl; #endif size_t ri = al.rest.val ? al.restPosition : f.size(); // First, match all of the named (non-rest) arguments. for (size_t i=0; ihasRest()) if (!matchRest(e, source->getRest(), al.rest.val, ri)) return false; // Fill in any remaining arguments with their defaults. return complete(); } bool application::matchOpen(env &e, signature *source, arglist &al) { assert(rest); // Pack all given parameters into the rest argument. formal_vector &f=source->formals; for (size_t i = 0; i < f.size(); ++i) if (al[i].name) // Named arguments are not handled by open signatures. return false; else rest->add(seq.addArg(al[i].val, f[i].t, i)); if (source->hasRest()) rest->addRest(new varinitArg(al.rest.val, source->getRest().t)); return true; } application *application::match(env &e, function *t, signature *source, arglist &al) { assert(t->kind==ty_function); application *app=new application(t); bool success = t->getSignature()->isOpen ? app->matchOpen(e, source, al) : app->matchSignature(e, source, al); //cout << "MATCH " << success << endl; return success ? app : 0; } void application::transArgs(coenv &e) { temp_vector temps; for(arg_vector::iterator a=args.begin(); a != args.end(); ++a) (*a)->trans(e,temps); if (rest) rest->trans(e,temps); } bool application::exact() { if (sig->isOpen) return false; for (score_vector::iterator p = scores.begin(); p != scores.end(); ++p) if (*p != EXACT) return false; return true; } bool application::halfExact() { if (sig->isOpen) return false; if (scores.size() != 2) return false; if (scores[0] == EXACT && scores[1] == CAST) return true; if (scores[0] == CAST && scores[1] == EXACT) return true; return false; } // True if any of the formals have names. bool namedFormals(signature *sig) { formal_vector& formals = sig->formals; size_t n = formals.size(); for (size_t i = 0; i < n; ++i) { if (formals[i].name) return true; } return false; } // Tests if arguments in the source signature can be matched to the formals // in the target signature with no casting or packing. // This allows overloaded args, but not named args. bool exactMightMatch(signature *target, signature *source) { // Open signatures never exactly match. if (target->isOpen) return false; #if 0 assert(!namedFormals(source)); #endif formal_vector& formals = target->formals; formal_vector& args = source->formals; // Sizes of the two lists. size_t fn = formals.size(), an = args.size(); // Indices for the two lists. size_t fi = 0, ai = 0; while (fi < fn && ai < an) { if (equivalent(formals[fi].t, args[ai].t)) { // Arguments match, move to the next. ++fi; ++ai; } else if (formals[fi].defval) { // Match formal to default value. ++fi; } else { // Failed to match formal. return false; } } assert(fi == fn || ai == an); // Packing array arguments into the rest formal is inexact. Do not allow it // here. if (ai < an) return false; assert(ai == an); // Match any remaining formal to defaults. while (fi < fn) if (formals[fi].defval) { // Match formal to default value. ++fi; } else { // Failed to match formal. return false; } // Non-rest arguments have matched. assert(fi == fn && ai == an); // Try to match the rest argument if given. if (source->hasRest()) { if (!target->hasRest()) return false; if (!equivalent(source->getRest().t, target->getRest().t)) return false; } // All arguments have matched. return true; } // Tries to match applications without casting. If an application matches // here, we need not attempt to match others with the slower, more general // techniques. app_list exactMultimatch(env &e, types::overloaded *o, types::signature *source, arglist &al) { assert(source); app_list l; // This can't handle named arguments. if (namedFormals(source)) return l; /* empty */ for (ty_vector::iterator t=o->sub.begin(); t!=o->sub.end(); ++t) { if ((*t)->kind != ty_function) continue; function *ft = (function *)*t; // First we run a test to see if all arguments could be exactly matched. // If this returns false, no such match is possible. // If it returns true, an exact match may or may not be possible. if (!exactMightMatch(ft->getSignature(), source)) continue; application *a=application::match(e, ft, source, al); // Consider calling // void f(A a=new A, int y) // with // f(3) // This matches exactly if there is no implicit cast from int to A. // Otherwise, it does not match. // Thus, there is no way to know if the // match truly is exact without looking at the environment. // In such a case, exactMightMatch() must return true, but there is no // exact match. Such false positives are eliminated here. // // Consider calling // void f(int x, real y=0.0, int z=0) // with // f(1,2) // exactMightMatch() will return true, matching 1 to x and 2 to z, but the // application::match will give an inexact match of 1 to x to 2 to y, due // to the cast from int to real. Therefore, we must test for exactness // even after matching. if (a && a->exact()) l.push_back(a); } //cout << "EXACTMATCH " << (!l.empty()) << endl; return l; } bool halfExactMightMatch(env &e, signature *target, types::ty *t1, types::ty *t2) { formal_vector& formals = target->formals; if (formals.size() < 2) return false; if (formals.size() > 2) { // We should probably abort the whole matching in this case. For now, // return true and let the usual matching handle it. return true; } assert(formals[0].t); assert(formals[1].t); // These casting tests if successful will be repeated again by // application::match. It would be nice to avoid this somehow, but the // additional complexity is probably not worth the minor speed improvement. if (equivalent(formals[0].t, t1)) return e.fastCastable(formals[1].t, t2); else return equivalent(formals[1].t, t2) && e.fastCastable(formals[0].t, t1); } // Most common after exact matches are cases such as // 2 + 3.4 (int, real) --> (real, real) // that is, binary operations where one of the operands matches exactly and the // other does not. This function searches for these so-called "half-exact" // matches. This should only be called after exactMultimatch has failed. app_list halfExactMultimatch(env &e, types::overloaded *o, types::signature *source, arglist &al) { assert(source); app_list l; // Half exact is only in the case of two arguments. formal_vector& formals = source->formals; if (formals.size() != 2 || source->hasRest()) return l; /* empty */ // This can't handle named arguments. if (namedFormals(source)) return l; /* empty */ // Alias the two argument types. types::ty *t1 = formals[0].t; types::ty *t2 = formals[1].t; assert(t1); assert(t2); for (ty_vector::iterator t=o->sub.begin(); t!=o->sub.end(); ++t) { if ((*t)->kind != ty_function) continue; function *ft = (function *)*t; #if 1 if (!halfExactMightMatch(e, ft->getSignature(), t1, t2)) continue; #endif application *a=application::match(e, ft, source, al); #if 1 if (a && a->halfExact()) l.push_back(a); #endif } return l; } // Simple check if there are too many arguments to match the candidate // function. // A "tooFewArgs" variant was also implemented at some point, but did // not give any speed-up. bool tooManyArgs(types::signature *target, types::signature *source) { return source->getNumFormals() > target->getNumFormals() && !target->hasRest(); } // The full overloading resolution system, which handles casting of arguments, // packing into rest arguments, named arguments, etc. app_list inexactMultimatch(env &e, types::overloaded *o, types::signature *source, arglist &al) { assert(source); app_list l; #define DEBUG_GETAPP 0 #if DEBUG_GETAPP //cout << "source: " << *source << endl; //cout << "ARGS: " << source->getNumFormals() << endl; bool perfect=false; bool exact=false; bool halfExact=false; #endif for(ty_vector::iterator t=o->sub.begin(); t!=o->sub.end(); ++t) { if ((*t)->kind==ty_function) { #if DEBUG_GETAPP function *ft = dynamic_cast(*t); signature *target = ft->getSignature(); if (equivalent(target, source)) perfect = true; #endif // Check if there are two many arguments to match. if (tooManyArgs((*t)->getSignature(), source)) continue; application *a=application::match(e, (function *)(*t), source, al); if (a) l.push_back(a); #if DEBUG_GETAPP if (a && !namedFormals(source)) { assert(a->exact() == exactlyMatchable(ft->getSignature(), source)); if (a->halfExact() && !namedFormals(source)) { assert(halfExactMightMatch(e, target, source->getFormal(0).t, source->getFormal(1).t)); } } if (a && a->exact()) exact = true; if (a && a->halfExact()) halfExact = true; #endif } } #if DEBUG_GETAPP cout << (perfect ? "PERFECT" : exact ? "EXACT" : halfExact ? "HALFEXACT" : "IMPERFECT") << endl; #endif if (l.size() > 1) { // Return the most specific candidates. maximizer m; for (app_list::iterator x=l.begin(); x!=l.end(); ++x) { assert(*x); m.add(*x); } return m.result(); } else return l; } enum testExactType { TEST_EXACT, DONT_TEST_EXACT, }; // Sanity check for multimatch optimizations. void sameApplications(app_list a, app_list b, testExactType te) { assert(a.size() == b.size()); if (te == TEST_EXACT) { for (app_list::iterator i = a.begin(); i != a.end(); ++i) { if (!(*i)->exact()) { cout << *(*i)->getType() << endl; } assert((*i)->exact()); } for (app_list::iterator i = b.begin(); i != b.end(); ++i) assert((*i)->exact()); } if (a.size() == 1) assert(equivalent(a.front()->getType(), b.front()->getType())); } app_list multimatch(env &e, types::overloaded *o, types::signature *source, arglist &al) { app_list a = exactMultimatch(e, o, source, al); if (!a.empty()) { #if DEBUG_CACHE // Make sure that exactMultimatch and the fallback return the same // application(s). sameApplications(a, inexactMultimatch(e, o, source, al), TEST_EXACT); #endif return a; } a = halfExactMultimatch(e, o, source, al); if (!a.empty()) { #if DEBUG_CACHE sameApplications(a, inexactMultimatch(e, o, source, al), DONT_TEST_EXACT); #endif return a; } // Slow but most general method. return inexactMultimatch(e, o, source, al); } } // namespace trans asymptote-3.05/version.texi.in0000644000000000000000000000011415031566105015147 0ustar rootroot@set VERSION ${ASY_VERSION} @set Datadir asy-datadir @set Docdir asy-docdir asymptote-3.05/prc/0000755000000000000000000000000015031566105012752 5ustar rootrootasymptote-3.05/prc/include/0000755000000000000000000000000015031566105014375 5ustar rootrootasymptote-3.05/prc/include/prc/0000755000000000000000000000000015031566105015161 5ustar rootrootasymptote-3.05/prc/include/prc/PRCbitStream.h0000644000000000000000000000477315031566105017644 0ustar rootroot/************ * * This file is part of a tool for producing 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt and * Michail Vidiassov * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #ifndef __PRC_BIT_STREAM_H #define __PRC_BIT_STREAM_H #include "PRCuniversalendianness.h" #ifdef _MSC_VER #include #if _MSC_VER >= 1600 #include #else typedef signed char int8_t; typedef signed short int16_t; typedef signed long int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; #endif // _MSC_VER >= 1600 #else #include #endif // _MSC_VER #include #include #include #define CHUNK_SIZE (1024) // Is this a reasonable initial size? class PRCbitStream { public: PRCbitStream(uint8_t*& buff, unsigned int l) : byteIndex(0), bitIndex(0), allocatedLength(l), data(buff), compressed(false) { if(data == 0) { getAChunk(); } } unsigned int getSize() const; uint8_t* getData(); PRCbitStream& operator <<(const std::string&); PRCbitStream& operator <<(bool); PRCbitStream& operator <<(uint32_t); PRCbitStream& operator <<(uint8_t); PRCbitStream& operator <<(int32_t); PRCbitStream& operator <<(double); PRCbitStream& operator <<(const char*); void compress(); void write(std::ostream &out) const; private: void writeBit(bool); void writeBits(uint32_t,uint8_t); void writeByte(uint8_t); void nextByte(); void nextBit(); void getAChunk(); // bitIndex is "big endian", zero based, location of next bit to write unsigned int byteIndex,bitIndex; unsigned int allocatedLength; uint8_t*& data; bool compressed; uint32_t compressedDataSize; }; #endif // __PRC_BIT_STREAM_H asymptote-3.05/prc/include/prc/writePRC.h0000644000000000000000000013654415031566105017046 0ustar rootroot/************ * * This file is part of a tool for producing 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt and * Michail Vidiassov * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #ifndef __WRITE_PRC_H #define __WRITE_PRC_H #include #include #include #include #include "PRCuniversalendianness.h" #include "PRC.h" #include "PRCbitStream.h" #include #include #include #include static const uint32_t m1=(uint32_t)-1; static const double pi=acos(-1.0); class PRCVector3d { public : double x; double y; double z; PRCVector3d() : x(0), y(0), z(0) {} PRCVector3d(double fx, double fy, double fz) : x(fx), y(fy), z(fz) {} PRCVector3d(const double c[], double fx=0, double fy=0, double fz=0) : x(c?c[0]:fx), y(c?c[1]:fy), z(c?c[2]:fz) {} PRCVector3d(const PRCVector3d& sVector3d) : x(sVector3d.x), y(sVector3d.y), z(sVector3d.z) {} void Set(double fx, double fy, double fz) { x = fx; y = fy; z = fz; } double Dot(const PRCVector3d & sPt) const { return(x*sPt.x)+(y*sPt.y)+(z*sPt.z); } double LengthSquared() { return(x*x+y*y+z*z); } friend PRCVector3d operator + (const PRCVector3d& a, const PRCVector3d& b) { return PRCVector3d(a.x+b.x,a.y+b.y,a.z+b.z); } friend PRCVector3d operator - (const PRCVector3d& a) { return PRCVector3d(-a.x,-a.y,-a.z); } friend PRCVector3d operator - (const PRCVector3d& a, const PRCVector3d& b) { return PRCVector3d(a.x-b.x,a.y-b.y,a.z-b.z); } friend PRCVector3d operator * (const PRCVector3d& a, const double d) { return PRCVector3d(a.x*d,a.y*d,a.z*d); } friend PRCVector3d operator * (const double d, const PRCVector3d& a) { return PRCVector3d(a.x*d,a.y*d,a.z*d); } friend PRCVector3d operator / (const PRCVector3d& a, const double d) { return PRCVector3d(a.x/d,a.y/d,a.z/d); } friend PRCVector3d operator * (const PRCVector3d& a, const PRCVector3d& b) { return PRCVector3d((a.y*b.z)-(a.z*b.y), (a.z*b.x)-(a.x*b.z), (a.x*b.y)-(a.y*b.x)); } void write(PRCbitStream &out) { out << x << y << z; } void serializeVector3d(PRCbitStream &pbs) const { pbs << x << y << z; } void serializeVector2d(PRCbitStream &pbs) const { pbs << x << y; } double Length(); bool Normalize(); bool operator==(const PRCVector3d &v) const { return x==v.x && y==v.y && z==v.z; } bool operator!=(const PRCVector3d &v) const { return !(x==v.x && y==v.y && z==v.z); } bool operator<(const PRCVector3d &v) const { if(x!=v.x) return (x attribute_keys; }; typedef std::list PRCAttributeList; class PRCAttributes { public: void serializeAttributes(PRCbitStream&) const; PRCAttribute& newAttribute() { attributes.push_front(PRCAttribute()); return attributes.front(); } void addAttribute(const PRCAttribute &attribute) { attributes.push_front(attribute); } PRCAttributeList attributes; }; bool type_eligible_for_reference(uint32_t type); uint32_t makeCADID(); uint32_t makePRCID(); class ContentPRCBase : public PRCAttributes { public: ContentPRCBase(uint32_t t, std::string n="") : type(t),name(n),CAD_identifier(0), CAD_persistent_identifier(0), PRC_unique_identifier(0) { if(type_eligible_for_reference(type)) { CAD_identifier = makeCADID(); PRC_unique_identifier = makePRCID(); } } void serializeContentPRCBase(PRCbitStream&) const; uint32_t getPRCID() const { return PRC_unique_identifier; } uint32_t getType() const { return type; } uint32_t type; std::string name; uint32_t CAD_identifier, CAD_persistent_identifier, PRC_unique_identifier; }; class PRCReferenceUniqueIdentifier { public: PRCReferenceUniqueIdentifier() : type(0), unique_identifier(m1) {} void serializeReferenceUniqueIdentifier(PRCbitStream&); uint32_t type; // bool reference_in_same_file_structure; // PRCUniqueId target_file_structure; uint32_t unique_identifier; }; extern std::string currentName; void writeName(PRCbitStream&,const std::string&); void resetName(); extern uint32_t current_layer_index; extern uint32_t current_index_of_line_style; extern uint16_t current_behaviour_bit_field; void writeGraphics(PRCbitStream&,uint32_t=m1,uint32_t=m1,uint16_t=1,bool=false); void resetGraphics(); void resetGraphicsAndName(); struct PRCRgbColor { PRCRgbColor(double r=0.0, double g=0.0, double b=0.0) : red(r), green(g), blue(b) {} double red,green,blue; void serializeRgbColor(PRCbitStream&); bool operator==(const PRCRgbColor &c) const { return (red==c.red && green==c.green && blue==c.blue); } bool operator!=(const PRCRgbColor &c) const { return !(red==c.red && green==c.green && blue==c.blue); } bool operator<(const PRCRgbColor &c) const { if(red!=c.red) return (red PRCTextureDefinitionList; class PRCMaterial { public: virtual ~PRCMaterial() {} virtual void serializeMaterial(PRCbitStream&) = 0; }; typedef std::deque PRCMaterialList; class PRCMaterialGeneric : public ContentPRCBase, public PRCMaterial { public: PRCMaterialGeneric(std::string n="") : ContentPRCBase(PRC_TYPE_GRAPH_Material,n), ambient(m1), diffuse(m1), emissive(m1), specular(m1), shininess(0.0), ambient_alpha(1.0), diffuse_alpha(1.0), emissive_alpha(1.0), specular_alpha(1.0) {} void serializeMaterialGeneric(PRCbitStream&); void serializeMaterial(PRCbitStream &pbs) { serializeMaterialGeneric(pbs); } uint32_t picture_index; uint32_t ambient; uint32_t diffuse; uint32_t emissive; uint32_t specular; double shininess; double ambient_alpha; double diffuse_alpha; double emissive_alpha; double specular_alpha; bool operator==(const PRCMaterialGeneric &m) const { return (ambient==m.ambient && diffuse==m.diffuse && emissive==m.emissive && specular==m.specular && shininess==m.shininess && ambient_alpha==m.ambient_alpha && diffuse_alpha==m.diffuse_alpha && emissive_alpha==m.emissive_alpha && specular_alpha==m.specular_alpha); } }; class PRCTextureApplication : public ContentPRCBase, public PRCMaterial { public: PRCTextureApplication(std::string n="") : ContentPRCBase(PRC_TYPE_GRAPH_TextureApplication,n), material_generic_index(m1), texture_definition_index(m1), next_texture_index(m1), UV_coordinates_index(0) {} void serializeTextureApplication(PRCbitStream&); void serializeMaterial(PRCbitStream &pbs) { serializeTextureApplication(pbs); } uint32_t material_generic_index; uint32_t texture_definition_index; uint32_t next_texture_index; uint32_t UV_coordinates_index; }; class PRCLinePattern : public ContentPRCBase { public: PRCLinePattern(std::string n="") : ContentPRCBase(PRC_TYPE_GRAPH_LinePattern,n), phase(0), is_real_length(false) {} void serializeLinePattern(PRCbitStream&); std::vector lengths; double phase; bool is_real_length; }; typedef std::deque PRCLinePatternList; class PRCStyle : public ContentPRCBase { public: PRCStyle(std::string n="") : ContentPRCBase(PRC_TYPE_GRAPH_Style,n), line_width(0.0), is_vpicture(false), line_pattern_vpicture_index(m1), is_material(false), color_material_index(m1), is_transparency_defined(false), transparency(255), additional(0) {} void serializeCategory1LineStyle(PRCbitStream&); double line_width; bool is_vpicture; uint32_t line_pattern_vpicture_index; bool is_material; uint32_t color_material_index; bool is_transparency_defined; uint8_t transparency; uint8_t additional; }; typedef std::deque PRCStyleList; class PRCTessFace { public: PRCTessFace() : start_wire(0), used_entities_flag(0), start_triangulated(0), number_of_texture_coordinate_indexes(0), is_rgba(false), behaviour(PRC_GRAPHICS_Show) {} void serializeTessFace(PRCbitStream&); std::vector line_attributes; uint32_t start_wire; // specifing bounding wire seems not to work as of Acrobat/Reader 9.2 std::vector sizes_wire; // specifing bounding wire seems not to work as of Acrobat/Reader 9.2 uint32_t used_entities_flag; uint32_t start_triangulated; std::vector sizes_triangulated; uint32_t number_of_texture_coordinate_indexes; bool is_rgba; std::vector rgba_vertices; uint32_t behaviour; }; typedef std::deque PRCTessFaceList; class PRCContentBaseTessData { public: PRCContentBaseTessData() : is_calculated(false) {} void serializeContentBaseTessData(PRCbitStream&); bool is_calculated; std::vector coordinates; }; class PRCTess : public PRCContentBaseTessData { public: virtual ~PRCTess() {} virtual void serializeBaseTessData(PRCbitStream &pbs) = 0; }; typedef std::deque PRCTessList; class PRC3DTess : public PRCTess { public: PRC3DTess() : has_faces(false), has_loops(false), crease_angle(25.8419) // arccos(0.9), default found in Acrobat output {} ~PRC3DTess() { for(PRCTessFaceList::iterator it=face_tessellation.begin(); it!=face_tessellation.end(); ++it) delete *it; } void serialize3DTess(PRCbitStream&); void serializeBaseTessData(PRCbitStream &pbs) { serialize3DTess(pbs); } void addTessFace(PRCTessFace*& pTessFace); bool has_faces; bool has_loops; double crease_angle; std::vector normal_coordinate; std::vector wire_index; // specifing bounding wire seems not to work as of Acrobat/Reader 9.2 std::vector triangulated_index; PRCTessFaceList face_tessellation; std::vector texture_coordinate; }; class PRC3DWireTess : public PRCTess { public: PRC3DWireTess() : is_rgba(false), is_segment_color(false) {} void serialize3DWireTess(PRCbitStream&); void serializeBaseTessData(PRCbitStream &pbs) { serialize3DWireTess(pbs); } bool is_rgba; bool is_segment_color; std::vector wire_indexes; std::vector rgba_vertices; }; class PRCMarkupTess : public PRCTess { public: PRCMarkupTess() : behaviour(0) {} void serializeMarkupTess(PRCbitStream&); void serializeBaseTessData(PRCbitStream &pbs) { serializeMarkupTess(pbs); } std::vector codes; std::vector texts; std::string label; uint8_t behaviour; }; class PRCGraphics { public: PRCGraphics() : layer_index(m1), index_of_line_style(m1), behaviour_bit_field(PRC_GRAPHICS_Show) {} void serializeGraphics(PRCbitStream&); void serializeGraphicsForced(PRCbitStream&); bool has_graphics() { return (index_of_line_style!=m1 || layer_index!=m1 || behaviour_bit_field!=PRC_GRAPHICS_Show) ; } uint32_t layer_index; uint32_t index_of_line_style; uint16_t behaviour_bit_field; }; typedef std::deque PRCGraphicsList; void writeGraphics(PRCbitStream&,const PRCGraphics&,bool=false); class PRCMarkup: public PRCGraphics, public ContentPRCBase { public: PRCMarkup(std::string n="") : ContentPRCBase(PRC_TYPE_MKP_Markup,n), type(KEPRCMarkupType_Unknown), sub_type(KEPRCMarkupSubType_Unknown), index_tessellation(m1) {} void serializeMarkup(PRCbitStream&); EPRCMarkupType type; EPRCMarkupSubType sub_type; // vector linked_items; // vector leaders; uint32_t index_tessellation; }; typedef std::deque PRCMarkupList; class PRCAnnotationItem: public PRCGraphics, public ContentPRCBase { public: PRCAnnotationItem(std::string n="") : ContentPRCBase(PRC_TYPE_MKP_AnnotationItem,n) {} void serializeAnnotationItem(PRCbitStream&); void serializeAnnotationEntity(PRCbitStream &pbs) { serializeAnnotationItem(pbs); } PRCReferenceUniqueIdentifier markup; }; typedef std::deque PRCAnnotationItemList; class PRCRepresentationItemContent: public PRCGraphics, public ContentPRCBase { public: PRCRepresentationItemContent(uint32_t t, std::string n="") : ContentPRCBase(t,n), index_local_coordinate_system(m1), index_tessellation(m1) {} void serializeRepresentationItemContent(PRCbitStream&); uint32_t index_local_coordinate_system; uint32_t index_tessellation; }; class PRCRepresentationItem : public PRCRepresentationItemContent { public: PRCRepresentationItem(uint32_t t, std::string n="") : PRCRepresentationItemContent(t,n) {} virtual ~PRCRepresentationItem() {} virtual void serializeRepresentationItem(PRCbitStream &pbs) = 0; }; typedef std::deque PRCRepresentationItemList; class PRCBrepModel : public PRCRepresentationItem { public: PRCBrepModel(std::string n="") : PRCRepresentationItem(PRC_TYPE_RI_BrepModel,n), has_brep_data(true), context_id(m1), body_id(m1), is_closed(false) {} void serializeBrepModel(PRCbitStream&); void serializeRepresentationItem(PRCbitStream &pbs) { serializeBrepModel(pbs); } bool has_brep_data; uint32_t context_id; uint32_t body_id; bool is_closed; }; class PRCPolyBrepModel : public PRCRepresentationItem { public: PRCPolyBrepModel(std::string n="") : PRCRepresentationItem(PRC_TYPE_RI_PolyBrepModel,n), is_closed(false) {} void serializePolyBrepModel(PRCbitStream&); void serializeRepresentationItem(PRCbitStream &pbs) { serializePolyBrepModel(pbs); } bool is_closed; }; class PRCPointSet : public PRCRepresentationItem { public: PRCPointSet(std::string n="") : PRCRepresentationItem(PRC_TYPE_RI_PointSet,n) {} void serializePointSet(PRCbitStream&); void serializeRepresentationItem(PRCbitStream &pbs) { serializePointSet(pbs); } std::vector point; }; class PRCWire : public PRCRepresentationItem { public: PRCWire(std::string n="") : PRCRepresentationItem(PRC_TYPE_RI_Curve,n), has_wire_body(true), context_id(m1), body_id(m1) {} void serializeWire(PRCbitStream&); void serializeRepresentationItem(PRCbitStream &pbs) { serializeWire(pbs); } bool has_wire_body; uint32_t context_id; uint32_t body_id; }; class PRCPolyWire : public PRCRepresentationItem { public: PRCPolyWire(std::string n="") : PRCRepresentationItem(PRC_TYPE_RI_PolyWire,n) {} void serializePolyWire(PRCbitStream&); void serializeRepresentationItem(PRCbitStream &pbs) { serializePolyWire(pbs); } }; class PRCSet : public PRCRepresentationItem { public: PRCSet(std::string n="") : PRCRepresentationItem(PRC_TYPE_RI_Set,n) {} ~PRCSet() { for(PRCRepresentationItemList::iterator it=elements.begin(); it!=elements.end(); ++it) delete *it; } void serializeSet(PRCbitStream&); void serializeRepresentationItem(PRCbitStream &pbs) { serializeSet(pbs); } uint32_t addBrepModel(PRCBrepModel*& pBrepModel); uint32_t addPolyBrepModel(PRCPolyBrepModel*& pPolyBrepModel); uint32_t addPointSet(PRCPointSet*& pPointSet); uint32_t addSet(PRCSet*& pSet); uint32_t addWire(PRCWire*& pWire); uint32_t addPolyWire(PRCPolyWire*& pPolyWire); uint32_t addRepresentationItem(PRCRepresentationItem*& pRepresentationItem); PRCRepresentationItemList elements; }; class PRCTransformation3d { public: virtual ~PRCTransformation3d() {} virtual void serializeTransformation3d(PRCbitStream&) const =0; }; typedef std::deque PRCTransformation3dList; class PRCGeneralTransformation3d : public PRCTransformation3d { public: PRCGeneralTransformation3d() { setidentity(); } PRCGeneralTransformation3d(const double t[]) { set(t); } void serializeGeneralTransformation3d(PRCbitStream&) const; void serializeTransformation3d(PRCbitStream& pbs) const { serializeGeneralTransformation3d(pbs); } double mat[4][4]; bool operator==(const PRCGeneralTransformation3d &t) const { for (size_t i=0;i<4;i++) for (size_t j=0;j<4;j++) if(mat[i][j]!=t.mat[i][j]) return false; return true; } bool operator<(const PRCGeneralTransformation3d &t) const { for (size_t i=0;i<4;i++) for (size_t j=0;j<4;j++) if(mat[i][j]!=t.mat[i][j]) { return (mat[i][j] PRCGeneralTransformation3dList; class PRCCartesianTransformation3d : public PRCTransformation3d { public: PRCCartesianTransformation3d() : behaviour(PRC_TRANSFORMATION_Identity), origin(0.0,0.0,0.0), X(1.0,0.0,0.0), Y(0.0,1.0,0.0), Z(0.0,0.0,1.0), scale(1.0,1.0,1.0), uniform_scale(1.0), X_homogeneous_coord(0.0), Y_homogeneous_coord(0.0), Z_homogeneous_coord(0.0), origin_homogeneous_coord(1.0) {} PRCCartesianTransformation3d(const double o[3], const double x[3], const double y[3], double sc) : behaviour(PRC_TRANSFORMATION_Identity), origin(o,0.0,0.0,0.0), X(x,1.0,0.0,0.0), Y(y,0.0,1.0,0.0), Z(0.0,0.0,1.0), scale(1.0,1.0,1.0), uniform_scale(sc), X_homogeneous_coord(0.0), Y_homogeneous_coord(0.0), Z_homogeneous_coord(0.0), origin_homogeneous_coord(1.0) { if(origin!=PRCVector3d(0.0,0.0,0.0)) behaviour = behaviour | PRC_TRANSFORMATION_Translate; if(X!=PRCVector3d(1.0,0.0,0.0) || Y!=PRCVector3d(0.0,1.0,0.0)) behaviour = behaviour | PRC_TRANSFORMATION_Rotate; if(uniform_scale!=1) behaviour = behaviour | PRC_TRANSFORMATION_Scale; } void serializeCartesianTransformation3d(PRCbitStream& pbs) const; void serializeTransformation3d(PRCbitStream& pbs) const { serializeCartesianTransformation3d(pbs); } uint8_t behaviour; PRCVector3d origin; PRCVector3d X; PRCVector3d Y; PRCVector3d Z; PRCVector3d scale; double uniform_scale; double X_homogeneous_coord; double Y_homogeneous_coord; double Z_homogeneous_coord; double origin_homogeneous_coord; bool operator==(const PRCCartesianTransformation3d &t) const { return behaviour==t.behaviour && origin==t.origin && X==t.X && Y==t.Y && Z==t.Z && scale==t.scale && uniform_scale==t.uniform_scale && X_homogeneous_coord==t.X_homogeneous_coord && Y_homogeneous_coord==t.Y_homogeneous_coord && Z_homogeneous_coord==t.Z_homogeneous_coord && origin_homogeneous_coord==t.origin_homogeneous_coord; } }; class PRCTransformation { public: PRCTransformation() : has_transformation(false), geometry_is_2D(false), behaviour(PRC_TRANSFORMATION_Identity), origin(0.0,0.0,0.0), x_axis(1.0,0.0,0.0), y_axis(0.0,1.0,0.0), scale(1) {} void serializeTransformation(PRCbitStream&); bool has_transformation; bool geometry_is_2D; uint8_t behaviour; PRCVector3d origin; PRCVector3d x_axis; PRCVector3d y_axis; double scale; }; class PRCCoordinateSystem : public PRCRepresentationItem { public: PRCCoordinateSystem(std::string n="") : PRCRepresentationItem(PRC_TYPE_RI_CoordinateSystem,n), axis_set(NULL) {} ~PRCCoordinateSystem() { delete axis_set; } void serializeCoordinateSystem(PRCbitStream&); void serializeRepresentationItem(PRCbitStream &pbs) { serializeCoordinateSystem(pbs); } void setAxisSet(PRCGeneralTransformation3d*& transform) { axis_set = transform; transform = NULL; } void setAxisSet(PRCCartesianTransformation3d*& transform) { axis_set = transform; transform = NULL; } PRCTransformation3d *axis_set; bool operator==(const PRCCoordinateSystem &t) const { if(index_local_coordinate_system!=t.index_local_coordinate_system) return false; PRCGeneralTransformation3d* axis_set_general = dynamic_cast(axis_set); PRCGeneralTransformation3d* t_axis_set_general = dynamic_cast(t.axis_set); PRCCartesianTransformation3d* axis_set_cartesian = dynamic_cast(axis_set); PRCCartesianTransformation3d* t_axis_set_cartesian = dynamic_cast(t.axis_set); if(axis_set_general!=NULL) return (t_axis_set_general!=NULL?(*axis_set_general==*t_axis_set_general):false); if(axis_set_cartesian!=NULL) return (t_axis_set_cartesian!=NULL?(*axis_set_cartesian==*t_axis_set_cartesian):false); return false; } }; typedef std::deque PRCCoordinateSystemList; struct PRCFontKey { uint32_t font_size; uint8_t attributes; }; class PRCFontKeysSameFont { public: void serializeFontKeysSameFont(PRCbitStream&); std::string font_name; uint32_t char_set; std::vector font_keys; }; // Topology class PRCBaseGeometry : public PRCAttributes { public: PRCBaseGeometry() : base_information(false), identifier(0) {} PRCBaseGeometry(std::string n, uint32_t id = 0) : base_information(true),name(n),identifier(id) {} void serializeBaseGeometry(PRCbitStream&); bool base_information; std::string name; uint32_t identifier; }; class PRCBoundingBox { public: PRCBoundingBox() : min(0.0,0.0,0.0), max(0.0,0.0,0.0) {} PRCBoundingBox(const PRCVector3d &m1, const PRCVector3d& m2) : min(m1),max(m2) {} void serializeBoundingBox(PRCbitStream &pbs); PRCVector3d min; PRCVector3d max; }; class PRCDomain { public: void serializeDomain(PRCbitStream &pbs); PRCVector2d min; PRCVector2d max; }; class PRCInterval { public: PRCInterval() : min(0), max(0) {} PRCInterval(double m, double M) : min(m), max(M) {} void serializeInterval(PRCbitStream &pbs); double min; double max; }; class PRCParameterization { public: PRCParameterization() : parameterization_coeff_a(1), parameterization_coeff_b(0) {} PRCParameterization(double min, double max) : interval(min, max), parameterization_coeff_a(1), parameterization_coeff_b(0) {} void serializeParameterization(PRCbitStream &pbs); PRCInterval interval; double parameterization_coeff_a; double parameterization_coeff_b; }; class PRCUVParameterization { public: PRCUVParameterization() : swap_uv(false), parameterization_on_u_coeff_a(1), parameterization_on_v_coeff_a(1), parameterization_on_u_coeff_b(0), parameterization_on_v_coeff_b(0) {} void serializeUVParameterization(PRCbitStream &pbs); bool swap_uv; PRCDomain uv_domain; double parameterization_on_u_coeff_a; double parameterization_on_v_coeff_a; double parameterization_on_u_coeff_b; double parameterization_on_v_coeff_b; }; class PRCControlPoint { public: PRCControlPoint() : x(0), y(0), z(0), w(1) {} PRCControlPoint(double X, double Y, double Z=0, double W=1) : x(X), y(Y), z(Z), w(W) {} PRCControlPoint(const PRCVector3d &v) : x(v.x), y(v.y), z(v.z), w(1) {} void Set(double fx, double fy, double fz, double fw=1) { x = fx; y = fy; z = fz; w = fw; } double x; double y; double z; double w; }; class PRCContentSurface: public PRCBaseGeometry { public: PRCContentSurface() : PRCBaseGeometry(), extend_info(KEPRCExtendTypeNone) {} PRCContentSurface(std::string n) : PRCBaseGeometry(n,makeCADID()),extend_info(KEPRCExtendTypeNone) {} void serializeContentSurface(PRCbitStream&); EPRCExtendType extend_info; }; class PRCSurface : public PRCContentSurface { public: PRCSurface() : PRCContentSurface() {} PRCSurface(std::string n) : PRCContentSurface(n) {} virtual ~PRCSurface() {} virtual void serializeSurface(PRCbitStream &pbs) = 0; }; class PRCNURBSSurface : public PRCSurface { public: PRCNURBSSurface() : PRCSurface(), knot_type(KEPRCKnotTypeUnspecified), surface_form(KEPRCBSplineSurfaceFormUnspecified) {} PRCNURBSSurface(std::string n) : PRCSurface(n), knot_type(KEPRCKnotTypeUnspecified), surface_form(KEPRCBSplineSurfaceFormUnspecified) {} void serializeNURBSSurface(PRCbitStream &pbs); void serializeSurface(PRCbitStream &pbs) { serializeNURBSSurface(pbs); } bool is_rational; uint32_t degree_in_u; uint32_t degree_in_v; std::vector control_point; std::vector knot_u; std::vector knot_v; const EPRCKnotType knot_type; const EPRCBSplineSurfaceForm surface_form; }; class PRCContentCurve: public PRCBaseGeometry { public: PRCContentCurve() : PRCBaseGeometry(), extend_info(KEPRCExtendTypeNone), is_3d(true) {} PRCContentCurve(std::string n) : PRCBaseGeometry(n,makeCADID()),extend_info(KEPRCExtendTypeNone), is_3d(true) {} void serializeContentCurve(PRCbitStream&); EPRCExtendType extend_info; bool is_3d; }; class PRCCurve : public PRCContentCurve { public: PRCCurve() : PRCContentCurve() {} PRCCurve(std::string n) : PRCContentCurve(n) {} virtual ~PRCCurve() {} virtual void serializeCurve(PRCbitStream &pbs) = 0; }; typedef std::deque PRCCurveList; class PRCNURBSCurve : public PRCCurve { public: PRCNURBSCurve() : PRCCurve(), knot_type(KEPRCKnotTypeUnspecified), curve_form(KEPRCBSplineCurveFormUnspecified) {} PRCNURBSCurve(std::string n) : PRCCurve(n), knot_type(KEPRCKnotTypeUnspecified), curve_form(KEPRCBSplineCurveFormUnspecified) {} void serializeNURBSCurve(PRCbitStream &pbs); void serializeCurve(PRCbitStream &pbs) { serializeNURBSCurve(pbs); } bool is_rational; uint32_t degree; std::vector control_point; std::vector knot; const EPRCKnotType knot_type; const EPRCBSplineCurveForm curve_form; }; class PRCPolyLine : public PRCCurve, public PRCTransformation, public PRCParameterization { public: PRCPolyLine() : PRCCurve() {} PRCPolyLine(std::string n) : PRCCurve(n) {} void serializePolyLine(PRCbitStream &pbs); void serializeCurve(PRCbitStream &pbs) { serializePolyLine(pbs); } std::vector point; }; class PRCCircle : public PRCCurve, public PRCTransformation, public PRCParameterization { public: PRCCircle() : PRCCurve(), PRCParameterization(0,2*pi) {} PRCCircle(std::string n) : PRCCurve(n), PRCParameterization(0,2*pi) {} void serializeCircle(PRCbitStream &pbs); void serializeCurve(PRCbitStream &pbs) { serializeCircle(pbs); } double radius; }; class PRCComposite : public PRCCurve, public PRCTransformation, public PRCParameterization { public: PRCComposite() : PRCCurve() {} PRCComposite(std::string n) : PRCCurve(n) {} void serializeComposite(PRCbitStream &pbs); void serializeCurve(PRCbitStream &pbs) { serializeComposite(pbs); } PRCCurveList base_curve; std::vector base_sense; bool is_closed; }; class PRCBlend01 : public PRCSurface, public PRCTransformation, public PRCUVParameterization { public: PRCBlend01() : PRCSurface(), center_curve(NULL), origin_curve(NULL), tangent_curve(NULL) {} PRCBlend01(std::string n) : PRCSurface(n), center_curve(NULL), origin_curve(NULL), tangent_curve(NULL) {} ~PRCBlend01() { delete center_curve; delete origin_curve; delete tangent_curve; } void serializeBlend01(PRCbitStream &pbs); void serializeSurface(PRCbitStream &pbs) { serializeBlend01(pbs); } // void setCenterCurve (PRCCurve*& curve) { center_curve = curve; curve = NULL; } // void setOriginCurve (PRCCurve*& curve) { origin_curve = curve; curve = NULL; } // void setTangentCurve(PRCCurve*& curve) { tangent_curve = curve; curve = NULL; } PRCCurve* center_curve; PRCCurve* origin_curve; PRCCurve* tangent_curve; }; class PRCRuled : public PRCSurface, public PRCTransformation, public PRCUVParameterization { public: PRCRuled() : PRCSurface(), first_curve(NULL), second_curve(NULL) {} PRCRuled(std::string n) : PRCSurface(n) {} ~PRCRuled() { delete first_curve; delete second_curve; } void serializeRuled(PRCbitStream &pbs); void serializeSurface(PRCbitStream &pbs) { serializeRuled(pbs); } // void setFirstCurve(PRCCurve*& curve) { first_curve = curve; curve = NULL; } // void setSecondCurve(PRCCurve*& curve) { second_curve = curve; curve = NULL; } PRCCurve* first_curve; PRCCurve* second_curve; }; class PRCSphere : public PRCSurface, public PRCTransformation, public PRCUVParameterization { public: PRCSphere() : PRCSurface() {} PRCSphere(std::string n) : PRCSurface(n) {} void serializeSphere(PRCbitStream &pbs); void serializeSurface(PRCbitStream &pbs) { serializeSphere(pbs); } double radius; }; class PRCCone : public PRCSurface, public PRCTransformation, public PRCUVParameterization { public: PRCCone() : PRCSurface() {} PRCCone(std::string n) : PRCSurface(n) {} void serializeCone(PRCbitStream &pbs); void serializeSurface(PRCbitStream &pbs) { serializeCone(pbs); } double bottom_radius; double semi_angle; }; class PRCCylinder : public PRCSurface, public PRCTransformation, public PRCUVParameterization { public: PRCCylinder() : PRCSurface() {} PRCCylinder(std::string n) : PRCSurface(n) {} void serializeCylinder(PRCbitStream &pbs); void serializeSurface(PRCbitStream &pbs) { serializeCylinder(pbs); } double radius; }; class PRCTorus : public PRCSurface, public PRCTransformation, public PRCUVParameterization { public: PRCTorus() : PRCSurface() {} PRCTorus(std::string n) : PRCSurface(n) {} void serializeTorus(PRCbitStream &pbs); void serializeSurface(PRCbitStream &pbs) { serializeTorus(pbs); } double major_radius; double minor_radius; }; class PRCBaseTopology : public PRCAttributes { public: PRCBaseTopology() : base_information(false),identifier(0) {} PRCBaseTopology(std::string n, uint32_t id = 0) : base_information(true),name(n),identifier(id) {} void serializeBaseTopology(PRCbitStream&); bool base_information; std::string name; uint32_t identifier; }; class PRCTopoItem { public: virtual ~PRCTopoItem() {} virtual void serializeTopoItem(PRCbitStream&)=0; }; class PRCContentBody: public PRCBaseTopology { public: PRCContentBody() : PRCBaseTopology(), behavior(0) {} PRCContentBody(std::string n) : PRCBaseTopology(n,makeCADID()), behavior(0) {} void serializeContentBody(PRCbitStream&); uint8_t behavior; }; class PRCBody : public PRCContentBody, public PRCTopoItem { public: PRCBody() : PRCContentBody(), topo_item_type(PRC_TYPE_ROOT) {} PRCBody(uint32_t tit) : PRCContentBody(), topo_item_type(tit) {} PRCBody(uint32_t tit, std::string n) : PRCContentBody(n), topo_item_type(tit) {} virtual ~PRCBody() {} virtual void serializeBody(PRCbitStream &pbs) = 0; void serializeTopoItem(PRCbitStream &pbs) { serializeBody(pbs); } uint32_t serialType() { return topo_item_type; } virtual double serialTolerance() { return 0; } const uint32_t topo_item_type; }; typedef std::deque PRCBodyList; class PRCContentWireEdge : public PRCBaseTopology { public: PRCContentWireEdge() : PRCBaseTopology(), curve_3d(NULL), has_curve_trim_interval(false) {} PRCContentWireEdge(std::string n) : PRCBaseTopology(n,makeCADID()), curve_3d(NULL), has_curve_trim_interval(false) {} ~PRCContentWireEdge() { delete curve_3d; } void serializeContentWireEdge(PRCbitStream &pbs); // void setCurve(PRCCurve*& curve) { curve_3d = curve; curve = NULL; } PRCCurve* curve_3d; bool has_curve_trim_interval; PRCInterval curve_trim_interval; }; class PRCWireEdge : public PRCContentWireEdge, public PRCTopoItem { public: void serializeWireEdge(PRCbitStream &pbs); void serializeTopoItem(PRCbitStream &pbs) { serializeWireEdge(pbs); } }; class PRCSingleWireBody : public PRCBody { public: PRCSingleWireBody() : PRCBody(PRC_TYPE_TOPO_SingleWireBody), wire_edge(NULL) {} PRCSingleWireBody(std::string n) : PRCBody(PRC_TYPE_TOPO_SingleWireBody, n), wire_edge(NULL) {} ~PRCSingleWireBody() { delete wire_edge; } void serializeSingleWireBody(PRCbitStream &pbs); void serializeBody(PRCbitStream &pbs) { serializeSingleWireBody(pbs); } void setWireEdge(PRCWireEdge*& wireEdge) { wire_edge = wireEdge; wireEdge = NULL; } PRCWireEdge* wire_edge; }; class PRCFace : public PRCBaseTopology, public PRCTopoItem, public PRCGraphics { public: PRCFace() : PRCBaseTopology(), base_surface(NULL), have_surface_trim_domain(false), have_tolerance(false), tolerance(0), number_of_loop(0), outer_loop_index(-1) {} PRCFace(std::string n) : PRCBaseTopology(n,makeCADID()), base_surface(NULL), have_surface_trim_domain(false), have_tolerance(false), tolerance(0), number_of_loop(0), outer_loop_index(-1) {} ~PRCFace() { delete base_surface; } void serializeFace(PRCbitStream &pbs); void serializeTopoItem(PRCbitStream &pbs) { serializeFace(pbs); } void setBaseSurface(PRCSurface*& surface) { base_surface = surface; surface = NULL; } PRCSurface *base_surface; const bool have_surface_trim_domain; PRCDomain surface_trim_domain; const bool have_tolerance; const double tolerance; const uint32_t number_of_loop; const int32_t outer_loop_index; // PRCLoopList loop; }; typedef std::deque PRCFaceList; class PRCShell : public PRCBaseTopology, public PRCTopoItem { public: PRCShell() : PRCBaseTopology(), shell_is_closed(false) {} PRCShell(std::string n) : PRCBaseTopology(n,makeCADID()), shell_is_closed(false) {} ~PRCShell() { for(PRCFaceList::iterator it=face.begin(); it!=face.end(); ++it) delete *it; } void serializeShell(PRCbitStream &pbs); void serializeTopoItem(PRCbitStream &pbs) { serializeShell(pbs); } void addFace(PRCFace*& pFace, uint8_t orientation=2); bool shell_is_closed; PRCFaceList face; std::vector orientation_surface_with_shell; }; typedef std::deque PRCShellList; class PRCConnex : public PRCBaseTopology, public PRCTopoItem { public: PRCConnex() : PRCBaseTopology() {} PRCConnex(std::string n) : PRCBaseTopology(n,makeCADID()) {} ~PRCConnex() { for(PRCShellList::iterator it=shell.begin(); it!=shell.end(); ++it) delete *it; } void serializeConnex(PRCbitStream &pbs); void serializeTopoItem(PRCbitStream &pbs) { serializeConnex(pbs); } void addShell(PRCShell*& pShell); PRCShellList shell; }; typedef std::deque PRCConnexList; class PRCBrepData : public PRCBody, public PRCBoundingBox { public: PRCBrepData() : PRCBody(PRC_TYPE_TOPO_BrepData) {} PRCBrepData(std::string n) : PRCBody(PRC_TYPE_TOPO_BrepData, n) {} ~PRCBrepData() { for(PRCConnexList::iterator it=connex.begin(); it!=connex.end(); ++it) delete *it; } void serializeBrepData(PRCbitStream &pbs); void serializeBody(PRCbitStream &pbs) { serializeBrepData(pbs); } void addConnex(PRCConnex*& pConnex); PRCConnexList connex; }; // For now - treat just the case of Bezier surfaces cubic 4x4 or linear 2x2 class PRCCompressedFace : public PRCBaseTopology, public PRCGraphics { public: PRCCompressedFace() : PRCBaseTopology(), orientation_surface_with_shell(true), degree(0) {} PRCCompressedFace(std::string n) : PRCBaseTopology(n,makeCADID()), orientation_surface_with_shell(true), degree(0) {} void serializeCompressedFace(PRCbitStream &pbs, double brep_data_compressed_tolerance); void serializeContentCompressedFace(PRCbitStream &pbs); void serializeCompressedAnaNurbs(PRCbitStream &pbs, double brep_data_compressed_tolerance); void serializeCompressedNurbs(PRCbitStream &pbs, double brep_data_compressed_tolerance); bool orientation_surface_with_shell; uint32_t degree; std::vector control_point; }; typedef std::deque PRCCompressedFaceList; // For now - treat just the case of one connex/one shell class PRCCompressedBrepData : public PRCBody { public: PRCCompressedBrepData() : PRCBody(PRC_TYPE_TOPO_BrepDataCompress), serial_tolerance(0), brep_data_compressed_tolerance(0) {} PRCCompressedBrepData(std::string n) : PRCBody(PRC_TYPE_TOPO_BrepDataCompress, n), serial_tolerance(0), brep_data_compressed_tolerance(0) {} ~PRCCompressedBrepData() { for(PRCCompressedFaceList::iterator it=face.begin(); it!=face.end(); ++it) delete *it; } void serializeCompressedBrepData(PRCbitStream &pbs); void serializeBody(PRCbitStream &pbs) { serializeCompressedBrepData(pbs); } void serializeCompressedShell(PRCbitStream &pbs); double serialTolerance() { return serial_tolerance; } double serial_tolerance; double brep_data_compressed_tolerance; PRCCompressedFaceList face; }; class PRCTopoContext : public ContentPRCBase { public: PRCTopoContext(std::string n="") : ContentPRCBase(PRC_TYPE_TOPO_Context,n), behaviour(0), granularity(1), tolerance(0), have_smallest_face_thickness(false), smallest_thickness(0), have_scale(false), scale(1) {} ~PRCTopoContext() { for(PRCBodyList::iterator it=body.begin(); it!=body.end(); ++it) delete *it; } void serializeTopoContext(PRCbitStream&); void serializeContextAndBodies(PRCbitStream&); void serializeGeometrySummary(PRCbitStream&); void serializeContextGraphics(PRCbitStream&); uint32_t addSingleWireBody(PRCSingleWireBody*& body); uint32_t addBrepData(PRCBrepData*& body); uint32_t addCompressedBrepData(PRCCompressedBrepData*& body); uint8_t behaviour; double granularity; double tolerance; bool have_smallest_face_thickness; double smallest_thickness; bool have_scale; double scale; PRCBodyList body; }; typedef std::deque PRCTopoContextList; class PRCUniqueId { public: PRCUniqueId() : id0(0), id1(0), id2(0), id3(0) {} void serializeCompressedUniqueId(PRCbitStream&) const; void serializeFileStructureUncompressedUniqueId(std::ostream& out) const; uint32_t id0; uint32_t id1; uint32_t id2; uint32_t id3; }; class PRCUnit { public: PRCUnit() : unit_from_CAD_file(false), unit(1) {} PRCUnit(double u, bool ufcf=true) : unit_from_CAD_file(ufcf), unit(u) {} void serializeUnit(PRCbitStream&); bool unit_from_CAD_file; double unit; }; class PRCProductOccurrence: public PRCGraphics, public ContentPRCBase { public: PRCProductOccurrence(std::string n="") : ContentPRCBase(PRC_TYPE_ASM_ProductOccurence,n), index_part(m1), index_prototype(m1), prototype_in_same_file_structure(true), index_external_data(m1), external_data_in_same_file_structure(true), product_behaviour(0), product_information_flags(0), product_load_status(KEPRCProductLoadStatus_Loaded), location(NULL) {} ~PRCProductOccurrence() { delete location; } void setLocation(PRCGeneralTransformation3d*& transform) { location = transform; transform = NULL; } void serializeProductOccurrence(PRCbitStream&); uint32_t index_part; uint32_t index_prototype; bool prototype_in_same_file_structure; PRCUniqueId prototype_file_structure; uint32_t index_external_data; bool external_data_in_same_file_structure; PRCUniqueId external_data_file_structure; std::vector index_son_occurrence; uint8_t product_behaviour; PRCUnit unit_information; uint8_t product_information_flags; EPRCProductLoadStatus product_load_status; PRCGeneralTransformation3d *location; }; typedef std::deque PRCProductOccurrenceList; class PRCPartDefinition: public PRCGraphics, public ContentPRCBase, public PRCBoundingBox { public: PRCPartDefinition(std::string n="") : ContentPRCBase(PRC_TYPE_ASM_PartDefinition,n) {} ~PRCPartDefinition() { for(PRCRepresentationItemList::iterator it=representation_item.begin(); it!=representation_item.end(); ++it) delete *it; } void serializePartDefinition(PRCbitStream&); uint32_t addBrepModel(PRCBrepModel*& pBrepModel); uint32_t addPolyBrepModel(PRCPolyBrepModel*& pPolyBrepModel); uint32_t addPointSet(PRCPointSet*& pPointSet); uint32_t addSet(PRCSet*& pSet); uint32_t addWire(PRCWire*& pWire); uint32_t addPolyWire(PRCPolyWire*& pPolyWire); uint32_t addRepresentationItem(PRCRepresentationItem*& pRepresentationItem); PRCRepresentationItemList representation_item; }; typedef std::deque PRCPartDefinitionList; #endif //__WRITE_PRC_H asymptote-3.05/prc/include/prc/oPRCFile.h0000644000000000000000000014477215031566105016754 0ustar rootroot/************ * * This file is part of a tool for producing 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt and * Michail Vidiassov * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #ifndef __O_PRC_FILE_H #define __O_PRC_FILE_H #include #include #include #include #include #include #include #include #include #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "PRC.h" #include "PRCbitStream.h" #include "writePRC.h" #include "PRCuniversalendianness.h" #ifdef HAVE_LIBTIRPC #include "xstream.h" #endif namespace prc { class oPRCFile; class PRCFileStructure; // Map [0,1] to [0,255] inline uint8_t byte(double r) { if(r < 0.0) r=0.0; else if(r > 1.0) r=1.0; int a=(int)(256.0*r); if(a == 256) a=255; return a; } struct RGBAColour { RGBAColour(double r=0.0, double g=0.0, double b=0.0, double a=1.0) : R(r), G(g), B(b), A(a) {} double R,G,B,A; void Set(double r, double g, double b, double a=1.0) { R = r; G = g; B = b; A = a; } bool operator==(const RGBAColour &c) const { return (R==c.R && G==c.G && B==c.B && A==c.A); } bool operator!=(const RGBAColour &c) const { return !(R==c.R && G==c.G && B==c.B && A==c.A); } bool operator<(const RGBAColour &c) const { if(R!=c.R) return (R PRCcolourMap; struct RGBAColourWidth { RGBAColourWidth(double r=0.0, double g=0.0, double b=0.0, double a=1.0, double w=1.0) : R(r), G(g), B(b), A(a), W(w) {} double R,G,B,A,W; bool operator==(const RGBAColourWidth &c) const { return (R==c.R && G==c.G && B==c.B && A==c.A && W==c.W); } bool operator!=(const RGBAColourWidth &c) const { return !(R==c.R && G==c.G && B==c.B && A==c.A && W==c.W); } bool operator<(const RGBAColourWidth &c) const { if(R!=c.R) return (R PRCcolourwidthMap; typedef std::map PRCcolorMap; struct PRCmaterial { PRCmaterial() : alpha(1.0),shininess(1.0), picture_data(NULL), picture_format(KEPRCPicture_BITMAP_RGB_BYTE), picture_width(0), picture_height(0), picture_size(0), picture_replace(false), picture_repeat(false) {} PRCmaterial(const RGBAColour &a, const RGBAColour &d, const RGBAColour &e, const RGBAColour &s, double p, double h, const uint8_t* pic=NULL, EPRCPictureDataFormat picf=KEPRCPicture_BITMAP_RGB_BYTE, uint32_t picw=0, uint32_t pich=0, uint32_t pics=0, bool picreplace=false, bool picrepeat=false) : ambient(a), diffuse(d), emissive(e), specular(s), alpha(p), shininess(h), picture_data(pic), picture_format(picf), picture_width(picw), picture_height(pich), picture_size(pics), picture_replace(picreplace), picture_repeat(picrepeat) { if(picture_size==0) { if (picture_format==KEPRCPicture_BITMAP_RGB_BYTE) picture_size = picture_width*picture_height*3; if (picture_format==KEPRCPicture_BITMAP_RGBA_BYTE) picture_size = picture_width*picture_height*4; if (picture_format==KEPRCPicture_BITMAP_GREY_BYTE) picture_size = picture_width*picture_height*1; if (picture_format==KEPRCPicture_BITMAP_GREYA_BYTE) picture_size = picture_width*picture_height*2; } } RGBAColour ambient,diffuse,emissive,specular; double alpha,shininess; const uint8_t* picture_data; EPRCPictureDataFormat picture_format; uint32_t picture_width; uint32_t picture_height; uint32_t picture_size; bool picture_replace; // replace material color with texture color? if false - just modify bool picture_repeat; // repeat texture? if false - clamp to edge bool operator==(const PRCmaterial &m) const { return (ambient==m.ambient && diffuse==m.diffuse && emissive==m.emissive && specular==m.specular && alpha==m.alpha && shininess==m.shininess && picture_replace==m.picture_replace && picture_repeat==m.picture_repeat && picture_format==m.picture_format && picture_width==m.picture_width && picture_height==m.picture_height && picture_size==m.picture_size && (picture_data==m.picture_data || memcmp(picture_data,m.picture_data,picture_size)==0) ); } bool operator<(const PRCmaterial &m) const { if(ambient!=m.ambient) return (ambient PRCmaterialMap; struct PRCpicture { PRCpicture() : data(NULL), format(KEPRCPicture_BITMAP_RGB_BYTE), width(0), height(0), size(0) {} PRCpicture(const uint8_t* pic, EPRCPictureDataFormat picf, uint32_t picw, uint32_t pich, uint32_t pics=0) : data(pic), format(picf), width(picw), height(pich), size(pics) { if(size==0) { if (format==KEPRCPicture_BITMAP_RGB_BYTE) size = width*height*3; if (format==KEPRCPicture_BITMAP_RGBA_BYTE) size = width*height*4; if (format==KEPRCPicture_BITMAP_GREY_BYTE) size = width*height*1; if (format==KEPRCPicture_BITMAP_GREYA_BYTE) size = width*height*2; } } PRCpicture(const PRCmaterial& m) : data(m.picture_data), format(m.picture_format), width(m.picture_width), height(m.picture_height), size(m.picture_size) {} const uint8_t* data; EPRCPictureDataFormat format; uint32_t width; uint32_t height; uint32_t size; bool operator==(const PRCpicture& p) const { return ( format==p.format && width==p.width && height==p.height && size==p.size && (data==p.data || memcmp(data,p.data,size)==0) ); } bool operator<(const PRCpicture& p) const { if(format!=p.format) return (format PRCpictureMap; struct PRCmaterialgeneric { PRCmaterialgeneric() : alpha(1.0),shininess(1.0) {} PRCmaterialgeneric(const RGBAColour& a, const RGBAColour& d, const RGBAColour& e, const RGBAColour& s, double p, double h) : ambient(a), diffuse(d), emissive(e), specular(s), alpha(p), shininess(h) {} PRCmaterialgeneric(const PRCmaterial& m) : ambient(m.ambient), diffuse(m.diffuse), emissive(m.emissive), specular(m.specular), alpha(m.alpha), shininess(m.shininess) {} RGBAColour ambient,diffuse,emissive,specular; double alpha,shininess; bool operator==(const PRCmaterialgeneric& m) const { return (ambient==m.ambient && diffuse==m.diffuse && emissive==m.emissive && specular==m.specular && alpha==m.alpha && shininess==m.shininess); } bool operator<(const PRCmaterialgeneric& m) const { if(ambient!=m.ambient) return (ambient PRCmaterialgenericMap; struct PRCtexturedefinition { PRCtexturedefinition() : picture_index(m1), picture_replace(false), picture_repeat(false) {} PRCtexturedefinition(uint32_t picindex, bool picreplace=false, bool picrepeat=false) : picture_index(picindex), picture_replace(picreplace), picture_repeat(picrepeat) {} PRCtexturedefinition(uint32_t picindex, const PRCmaterial& m) : picture_index(picindex), picture_replace(m.picture_replace), picture_repeat(m.picture_repeat) {} uint32_t picture_index; bool picture_replace; // replace material color with texture color? if false - just modify bool picture_repeat; // repeat texture? if false - clamp to edge bool operator==(const PRCtexturedefinition& t) const { return (picture_index==t.picture_index && picture_replace==t.picture_replace && picture_repeat==t.picture_repeat); } bool operator<(const PRCtexturedefinition& t) const { if(picture_index!=t.picture_index) return (picture_index PRCtexturedefinitionMap; struct PRCtextureapplication { PRCtextureapplication() : material_generic_index(m1), texture_definition_index(m1) {} PRCtextureapplication(uint32_t matindex, uint32_t texindex) : material_generic_index(matindex), texture_definition_index(texindex) {} uint32_t material_generic_index; uint32_t texture_definition_index; bool operator==(const PRCtextureapplication& t) const { return (material_generic_index==t.material_generic_index && texture_definition_index==t.texture_definition_index); } bool operator<(const PRCtextureapplication& t) const { if(material_generic_index!=t.material_generic_index) return (material_generic_index PRCtextureapplicationMap; struct PRCstyle { PRCstyle() : line_width(0), alpha(1), is_material(false), color_material_index(m1) {} PRCstyle(double linewidth, double alph, bool ismat, uint32_t colindex=m1) : line_width(linewidth), alpha(alph), is_material(ismat), color_material_index(colindex) {} double line_width; double alpha; bool is_material; uint32_t color_material_index; bool operator==(const PRCstyle& s) const { return (line_width==s.line_width && alpha==s.alpha && is_material==s.is_material && color_material_index==s.color_material_index); } bool operator<(const PRCstyle& s) const { if(line_width!=s.line_width) return (line_width PRCstyleMap; struct PRCtessrectangle // rectangle { PRCVector3d vertices[4]; uint32_t style; }; typedef std::vector PRCtessrectangleList; struct PRCtessquad // rectangle { PRCVector3d vertices[4]; RGBAColour colours[4]; }; typedef std::vector PRCtessquadList; /* struct PRCtesstriangle // textured triangle { PRCtesstriangle() : style(m1) {} PRCVector3d vertices[3]; // PRCVector3d normals[3]; // RGBAColour colors[3]; PRCVector2d texcoords[3]; uint32_t style; }; typedef std::vector PRCtesstriangleList; */ struct PRCtessline // polyline { std::vector point; PRCRgbColor color; }; typedef std::list PRCtesslineList; typedef std::map PRCtesslineMap; struct PRCface { PRCface() : transform(NULL), face(NULL) {} uint32_t style; bool transparent; PRCGeneralTransformation3d* transform; PRCFace* face; }; typedef std::vector PRCfaceList; struct PRCcompface { PRCcompface() : face(NULL) {} uint32_t style; bool transparent; PRCCompressedFace* face; }; typedef std::vector PRCcompfaceList; struct PRCwire { PRCwire() : style(m1), transform(NULL), curve(NULL) {} uint32_t style; PRCGeneralTransformation3d* transform; PRCCurve* curve; }; typedef std::vector PRCwireList; typedef std::map > PRCpointsetMap; class PRCoptions { public: double compression; double granularity; bool closed; // render the surface as one-sided; may yield faster rendering bool tess; // use tessellated mesh to store straight patches bool do_break; // bool no_break; // do not render transparent patches as one-faced nodes double crease_angle; // crease angle for meshes PRCoptions(double compression=0.0, double granularity=0.0, bool closed=false, bool tess=false, bool do_break=true, bool no_break=false, double crease_angle=25.8419) : compression(compression), granularity(granularity), closed(closed), tess(tess), do_break(do_break), no_break(no_break), crease_angle(crease_angle) {} }; class PRCgroup { public: PRCgroup() : product_occurrence(NULL), parent_product_occurrence(NULL), part_definition(NULL), parent_part_definition(NULL), transform(NULL) {} PRCgroup(const std::string& name) : product_occurrence(NULL), parent_product_occurrence(NULL), part_definition(NULL), parent_part_definition(NULL), transform(NULL), name(name) {} PRCProductOccurrence *product_occurrence, *parent_product_occurrence; PRCPartDefinition *part_definition, *parent_part_definition; PRCfaceList faces; PRCcompfaceList compfaces; PRCtessrectangleList rectangles; // PRCtesstriangleList triangles; PRCtessquadList quads; PRCtesslineMap lines; PRCwireList wires; PRCpointsetMap points; std::vector pointsets; std::vector polymodels; std::vector polywires; PRCGeneralTransformation3d* transform; std::string name; PRCoptions options; }; void makeFileUUID(PRCUniqueId&); void makeAppUUID(PRCUniqueId&); class PRCUncompressedFile { public: PRCUncompressedFile() : file_size(0), data(NULL) {} PRCUncompressedFile(uint32_t fs, uint8_t *d) : file_size(fs), data(d) {} ~PRCUncompressedFile() { if(data != NULL) delete[] data; } uint32_t file_size; uint8_t *data; void write(std::ostream&) const; uint32_t getSize() const; }; typedef std::deque PRCUncompressedFileList; class PRCStartHeader { public: uint32_t minimal_version_for_read; // PRCVersion uint32_t authoring_version; // PRCVersion PRCUniqueId file_structure_uuid; PRCUniqueId application_uuid; // should be 0 PRCStartHeader() : minimal_version_for_read(PRCVersion), authoring_version(PRCVersion) {} void serializeStartHeader(std::ostream&) const; uint32_t getStartHeaderSize() const; }; class PRCFileStructure : public PRCStartHeader { public: uint32_t number_of_referenced_file_structures; double tessellation_chord_height_ratio; double tessellation_angle_degree; std::string default_font_family_name; std::vector colors; std::vector pictures; PRCUncompressedFileList uncompressed_files; PRCTextureDefinitionList texture_definitions; PRCMaterialList materials; PRCStyleList styles; PRCCoordinateSystemList reference_coordinate_systems; std::vector font_keys_of_font; PRCPartDefinitionList part_definitions; PRCProductOccurrenceList product_occurrences; // PRCMarkupList markups; // PRCAnnotationItemList annotation_entities; double unit; PRCTopoContextList contexts; PRCTessList tessellations; uint32_t sizes[6]; uint8_t *globals_data; PRCbitStream globals_out; // order matters: PRCbitStream must be initialized last uint8_t *tree_data; PRCbitStream tree_out; uint8_t *tessellations_data; PRCbitStream tessellations_out; uint8_t *geometry_data; PRCbitStream geometry_out; uint8_t *extraGeometry_data; PRCbitStream extraGeometry_out; ~PRCFileStructure () { for(PRCUncompressedFileList::iterator it=uncompressed_files.begin(); it!=uncompressed_files.end(); ++it) delete *it; for(PRCTextureDefinitionList::iterator it=texture_definitions.begin(); it!=texture_definitions.end(); ++it) delete *it; for(PRCMaterialList::iterator it=materials.begin(); it!=materials.end(); ++it) delete *it; for(PRCStyleList::iterator it=styles.begin(); it!=styles.end(); ++it) delete *it; for(PRCTopoContextList::iterator it=contexts.begin(); it!=contexts.end(); ++it) delete *it; for(PRCTessList::iterator it=tessellations.begin(); it!=tessellations.end(); ++it) delete *it; for(PRCPartDefinitionList::iterator it=part_definitions.begin(); it!=part_definitions.end(); ++it) delete *it; for(PRCProductOccurrenceList::iterator it=product_occurrences.begin(); it!=product_occurrences.end(); ++it) delete *it; for(PRCCoordinateSystemList::iterator it=reference_coordinate_systems.begin(); it!=reference_coordinate_systems.end(); it++) delete *it; free(globals_data); free(tree_data); free(tessellations_data); free(geometry_data); free(extraGeometry_data); } PRCFileStructure() : number_of_referenced_file_structures(0), tessellation_chord_height_ratio(2000.0),tessellation_angle_degree(40.0), default_font_family_name(""), unit(1), globals_data(NULL),globals_out(globals_data,0), tree_data(NULL),tree_out(tree_data,0), tessellations_data(NULL),tessellations_out(tessellations_data,0), geometry_data(NULL),geometry_out(geometry_data,0), extraGeometry_data(NULL),extraGeometry_out(extraGeometry_data,0) {} void write(std::ostream&); void prepare(); uint32_t getSize(); void serializeFileStructureGlobals(PRCbitStream&); void serializeFileStructureTree(PRCbitStream&); void serializeFileStructureTessellation(PRCbitStream&); void serializeFileStructureGeometry(PRCbitStream&); void serializeFileStructureExtraGeometry(PRCbitStream&); uint32_t addPicture(EPRCPictureDataFormat format, uint32_t size, const uint8_t *picture, uint32_t width=0, uint32_t height=0, std::string name=""); uint32_t addTextureDefinition(PRCTextureDefinition*& pTextureDefinition); uint32_t addRgbColor(const PRCRgbColor &color); uint32_t addRgbColorUnique(const PRCRgbColor &color); uint32_t addMaterialGeneric(PRCMaterialGeneric*& pMaterialGeneric); uint32_t addTextureApplication(PRCTextureApplication*& pTextureApplication); uint32_t addStyle(PRCStyle*& pStyle); uint32_t addPartDefinition(PRCPartDefinition*& pPartDefinition); uint32_t addProductOccurrence(PRCProductOccurrence*& pProductOccurrence); uint32_t addTopoContext(PRCTopoContext*& pTopoContext); uint32_t getTopoContext(PRCTopoContext*& pTopoContext); uint32_t add3DTess(PRC3DTess*& p3DTess); uint32_t add3DWireTess(PRC3DWireTess*& p3DWireTess); /* uint32_t addMarkupTess(PRCMarkupTess*& pMarkupTess); uint32_t addMarkup(PRCMarkup*& pMarkup); uint32_t addAnnotationItem(PRCAnnotationItem*& pAnnotationItem); */ uint32_t addCoordinateSystem(PRCCoordinateSystem*& pCoordinateSystem); uint32_t addCoordinateSystemUnique(PRCCoordinateSystem*& pCoordinateSystem); }; class PRCFileStructureInformation { public: PRCUniqueId UUID; uint32_t reserved; // 0 uint32_t number_of_offsets; uint32_t *offsets; void write(std::ostream&); uint32_t getSize(); }; class PRCHeader : public PRCStartHeader { public : uint32_t number_of_file_structures; PRCFileStructureInformation *fileStructureInformation; uint32_t model_file_offset; uint32_t file_size; // not documented PRCUncompressedFileList uncompressed_files; void write(std::ostream&); uint32_t getSize(); }; typedef std::map PRCtransformMap; inline double X(const double *v) {return v[0];} inline double Y(const double *v) {return v[1];} inline double Z(const double *v) {return v[2];} class oPRCFile { public: oPRCFile(std::ostream &os, double u=1, uint32_t n=1) : number_of_file_structures(n), fileStructures(new PRCFileStructure*[n]), unit(u), modelFile_data(NULL),modelFile_out(modelFile_data,0), fout(NULL),output(os) { for(uint32_t i = 0; i < number_of_file_structures; ++i) { fileStructures[i] = new PRCFileStructure(); fileStructures[i]->minimal_version_for_read = PRCVersion; fileStructures[i]->authoring_version = PRCVersion; makeFileUUID(fileStructures[i]->file_structure_uuid); makeAppUUID(fileStructures[i]->application_uuid); fileStructures[i]->unit = u; } groups.push(PRCgroup()); PRCgroup &group = groups.top(); group.name="root"; group.transform = NULL; group.product_occurrence = new PRCProductOccurrence(group.name); group.parent_product_occurrence = NULL; group.part_definition = new PRCPartDefinition; group.parent_part_definition = NULL; } oPRCFile(const std::string &name, double u=1, uint32_t n=1) : number_of_file_structures(n), fileStructures(new PRCFileStructure*[n]), unit(u), modelFile_data(NULL),modelFile_out(modelFile_data,0), fout(new std::ofstream(name.c_str(), std::ios::out|std::ios::binary|std::ios::trunc)), output(*fout) { for(uint32_t i = 0; i < number_of_file_structures; ++i) { fileStructures[i] = new PRCFileStructure(); fileStructures[i]->minimal_version_for_read = PRCVersion; fileStructures[i]->authoring_version = PRCVersion; makeFileUUID(fileStructures[i]->file_structure_uuid); makeAppUUID(fileStructures[i]->application_uuid); fileStructures[i]->unit = u; } groups.push(PRCgroup()); PRCgroup &group = groups.top(); group.name="root"; group.transform = NULL; group.product_occurrence = new PRCProductOccurrence(group.name); group.parent_product_occurrence = NULL; group.part_definition = new PRCPartDefinition; group.parent_part_definition = NULL; } ~oPRCFile() { for(uint32_t i = 0; i < number_of_file_structures; ++i) delete fileStructures[i]; delete[] fileStructures; if(fout != NULL) delete fout; free(modelFile_data); for(PRCpictureMap::iterator it=pictureMap.begin(); it!=pictureMap.end(); ++it) delete it->first.data; } void begingroup(const char *name, PRCoptions *options=NULL, const double* t=NULL); void endgroup(); std::string lastgroupname; std::vector lastgroupnames; std::string calculate_unique_name(const ContentPRCBase *prc_entity,const ContentPRCBase *prc_occurence); bool finish(); uint32_t getSize(); const uint32_t number_of_file_structures; PRCFileStructure **fileStructures; PRCHeader header; PRCUnit unit; uint8_t *modelFile_data; PRCbitStream modelFile_out; // order matters: PRCbitStream must be initialized last PRCcolorMap colorMap; PRCcolourMap colourMap; PRCcolourwidthMap colourwidthMap; PRCmaterialgenericMap materialgenericMap; PRCtexturedefinitionMap texturedefinitionMap; PRCtextureapplicationMap textureapplicationMap; PRCstyleMap styleMap; PRCpictureMap pictureMap; PRCgroup rootGroup; PRCtransformMap transformMap; std::stack groups; PRCgroup& findGroup(); void doGroup(PRCgroup& group); uint32_t addColor(const PRCRgbColor &color); uint32_t addColour(const RGBAColour &colour); uint32_t addColourWidth(const RGBAColour &colour, double width); uint32_t addLineMaterial(const RGBAColour& c, double width) { return addColourWidth(c,width); } uint32_t addMaterial(const PRCmaterial &material); uint32_t addTransform(PRCGeneralTransformation3d*& transform); uint32_t addTransform(const double* t); uint32_t addTransform(const double origin[3], const double x_axis[3], const double y_axis[3], double scale); template void addPoint(const V P, const RGBAColour &c, double w=1.0) { PRCgroup &group = findGroup(); group.points[addColourWidth(c,w)].push_back(PRCVector3d(X(P),Y(P),Z(P))); } void addPoints(uint32_t n, const double P[][3], const RGBAColour &c, double w=1.0); void addLines(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[], const RGBAColour& c, double w, bool segment_color, uint32_t nC, const RGBAColour C[], uint32_t nCI, const uint32_t CI[]); uint32_t createLines(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[], bool segment_color, uint32_t nC, const RGBAColour C[], uint32_t nCI, const uint32_t CI[]); template void addTriangles(uint32_t nP, const V P[], uint32_t nI, const uint32_t PI[][3], const PRCmaterial &m, uint32_t nN, const V N[], const uint32_t NI[][3], uint32_t nT, const double T[][2], const uint32_t TI[][3], uint32_t nC, const RGBAColour C[], const uint32_t CI[][3], uint32_t nM, const PRCmaterial M[], const uint32_t MI[], double ca) { if(nP==0 || P==NULL || nI==0 || PI==NULL) return; const uint32_t tess_index = createTriangleMesh(nP, P, nI, PI, m, nN, N, NI, nT, T, TI, nC, C, CI, nM, M, MI, ca); useMesh(tess_index,m1); } template uint32_t createTriangleMesh(uint32_t nP, const V P[], uint32_t nI, const uint32_t PI[][3], const PRCmaterial& m, uint32_t nN, const V N[], const uint32_t NI[][3], uint32_t nT, const double T[][2], const uint32_t TI[][3], uint32_t nC, const RGBAColour C[], const uint32_t CI[][3], uint32_t nM, const PRCmaterial M[], const uint32_t MI[], double ca) { const uint32_t style = addMaterial(m); if(M!=NULL && nM>0) { uint32_t* const styles = new uint32_t[nM]; for(uint32_t i=0; i uint32_t createTriangleMesh(uint32_t nP, const V P[], uint32_t nI, const uint32_t PI[][3], const uint32_t style_index, uint32_t nN, const V N[], const uint32_t NI[][3], uint32_t nT, const double T[][2], const uint32_t TI[][3], uint32_t nC, const RGBAColour C[], const uint32_t CI[][3], uint32_t nS, const uint32_t S[], const uint32_t SI[], double ca) { if(nP==0 || P==NULL || nI==0 || PI==NULL) return m1; const bool triangle_color = (nS != 0 && S != NULL && SI != NULL); const bool vertex_color = (nC != 0 && C != NULL && CI != NULL); const bool has_normals = (nN != 0 && N != NULL && NI != NULL); const bool textured = (nT != 0 && T != NULL && TI != NULL); PRC3DTess *tess = new PRC3DTess(); PRCTessFace *tessFace = new PRCTessFace(); tessFace->used_entities_flag = textured ? PRC_FACETESSDATA_TriangleTextured : PRC_FACETESSDATA_Triangle; tessFace->number_of_texture_coordinate_indexes = textured ? 1 : 0; tess->coordinates.reserve(3*nP); for(uint32_t i=0; icoordinates.push_back(X(P[i])); tess->coordinates.push_back(Y(P[i])); tess->coordinates.push_back(Z(P[i])); } if(has_normals) { tess->normal_coordinate.reserve(3*nN); for(uint32_t i=0; inormal_coordinate.push_back(X(N[i])); tess->normal_coordinate.push_back(Y(N[i])); tess->normal_coordinate.push_back(Z(N[i])); } } else tess->crease_angle = ca; if(textured) { tess->texture_coordinate.reserve(2*nT); for(uint32_t i=0; itexture_coordinate.push_back(T[i][0]); tess->texture_coordinate.push_back(T[i][1]); } } tess->triangulated_index.reserve(3*nI+(has_normals?3:0)*nI+(textured?3:0)*nI); for(uint32_t i=0; itriangulated_index.push_back(3*NI[i][0]); if(textured) tess->triangulated_index.push_back(2*TI[i][0]); tess->triangulated_index.push_back(3*PI[i][0]); if(has_normals) tess->triangulated_index.push_back(3*NI[i][1]); if(textured) tess->triangulated_index.push_back(2*TI[i][1]); tess->triangulated_index.push_back(3*PI[i][1]); if(has_normals) tess->triangulated_index.push_back(3*NI[i][2]); if(textured) tess->triangulated_index.push_back(2*TI[i][2]); tess->triangulated_index.push_back(3*PI[i][2]); } tessFace->sizes_triangulated.push_back(nI); if(triangle_color) { tessFace->line_attributes.reserve(nI); for(uint32_t i=0; iline_attributes.push_back(SI[i]); } else if (style_index != m1 ) { tessFace->line_attributes.push_back(style_index); } if(vertex_color) { tessFace->is_rgba=false; for(uint32_t i=0; iis_rgba=true; break; } tessFace->rgba_vertices.reserve((tessFace->is_rgba?4:3)*3*nI); for(uint32_t i=0; irgba_vertices.push_back(byte(C[CI[i][0]].R)); tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].G)); tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].A)); tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].R)); tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].G)); tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].A)); tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].R)); tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].G)); tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].A)); } } tess->addTessFace(tessFace); const uint32_t tess_index = add3DTess(tess); return tess_index; } void addQuads(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[][4], const PRCmaterial &m, uint32_t nN, const double N[][3], const uint32_t NI[][4], uint32_t nT, const double T[][2], const uint32_t TI[][4], uint32_t nC, const RGBAColour C[], const uint32_t CI[][4], uint32_t nM, const PRCmaterial M[], const uint32_t MI[], double ca); uint32_t createQuadMesh(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[][4], uint32_t style_index, uint32_t nN, const double N[][3], const uint32_t NI[][4], uint32_t nT, const double T[][2], const uint32_t TI[][4], uint32_t nC, const RGBAColour C[], const uint32_t CI[][4], uint32_t nS, const uint32_t S[], const uint32_t SI[], double ca); uint32_t createQuadMesh(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[][4], const PRCmaterial& m, uint32_t nN, const double N[][3], const uint32_t NI[][4], uint32_t nT, const double T[][2], const uint32_t TI[][4], uint32_t nC, const RGBAColour C[], const uint32_t CI[][4], uint32_t nM, const PRCmaterial M[], const uint32_t MI[], double ca) { const uint32_t style = addMaterial(m); if(M!=NULL && nM>0) { uint32_t* const styles = new uint32_t[nM]; for(uint32_t i=0; ibase_surface = surface; \ face.transparent = m.alpha < 1.0; \ face.style = addMaterial(m); #define ADDCOMPFACE \ PRCgroup &group = findGroup(); \ group.compfaces.push_back(PRCcompface()); \ PRCcompface& face = group.compfaces.back(); \ PRCCompressedFace *compface = new PRCCompressedFace; \ face.face = compface; \ face.transparent = m.alpha < 1.0; \ face.style = addMaterial(m); inline bool isid(const double* t) { return( t[0]==1 && t[1]==0 && t[2]==0 && t[3]==0 && t[4]==0 && t[5]==1 && t[6]==0 && t[7]==0 && t[8]==0 && t[9]==0 && t[10]==1 && t[11]==0 && t[12]==0 && t[13]==0 && t[14]==0 && t[15]==1); } #define SETTRANSF \ if(t&&!isid(t)) \ face.transform = new PRCGeneralTransformation3d(t); \ if(origin) surface->origin.Set(origin[0],origin[1],origin[2]); \ if(x_axis) surface->x_axis.Set(x_axis[0],x_axis[1],x_axis[2]); \ if(y_axis) surface->y_axis.Set(y_axis[0],y_axis[1],y_axis[2]); \ surface->scale = scale; \ surface->geometry_is_2D = false; \ if(surface->origin!=PRCVector3d(0.0,0.0,0.0)) \ surface->behaviour = surface->behaviour | PRC_TRANSFORMATION_Translate; \ if(surface->x_axis!=PRCVector3d(1.0,0.0,0.0)||surface->y_axis!=PRCVector3d(0.0,1.0,0.0)) \ surface->behaviour = surface->behaviour | PRC_TRANSFORMATION_Rotate; \ if(surface->scale!=1) \ surface->behaviour = surface->behaviour | PRC_TRANSFORMATION_Scale; \ surface->has_transformation = (surface->behaviour != PRC_TRANSFORMATION_Identity); void useMesh(uint32_t tess_index, uint32_t style_index, PRCGENTRANSFORM); void useMesh(uint32_t tess_index, const PRCmaterial& m, PRCGENTRANSFORM) { useMesh(tess_index,addMaterial(m),t); } void useMesh(uint32_t tess_index, uint32_t style_index, PRCCARTRANSFORM); void useMesh(uint32_t tess_index, const PRCmaterial& m, PRCCARTRANSFORM) { useMesh(tess_index,addMaterial(m),origin, x_axis, y_axis, scale); } void useLines(uint32_t tess_index, uint32_t style_index, PRCGENTRANSFORM); void useLines(uint32_t tess_index, const RGBAColour& c, double w, PRCGENTRANSFORM) { useLines(tess_index, addLineMaterial(c,w), t); } void useLines(uint32_t tess_index, uint32_t style_index, PRCCARTRANSFORM); void useLines(uint32_t tess_index, const RGBAColour& c, double w, PRCCARTRANSFORM) { useLines(tess_index,addLineMaterial(c,w),origin, x_axis, y_axis, scale); } // void addTriangle(const double P[][3], const double T[][2], uint32_t style_index); template void addLine(uint32_t n, const V P[], const RGBAColour &c, double w=1.0) { PRCgroup &group = findGroup(); if(group.options.tess) { group.lines[w].push_back(PRCtessline()); PRCtessline& line = group.lines[w].back(); line.color.red = c.R; line.color.green = c.G; line.color.blue = c.B; for(uint32_t i=0; ipoint.resize(n); for(uint32_t i=0; ipoint[i].Set(X(P[i]),Y(P[i]),Z(P[i])); curve->interval.min = 0; curve->interval.max = curve->point.size()-1; } } template void addBezierCurve(uint32_t n, const V cP[], const RGBAColour &c) { ADDWIRE(PRCNURBSCurve) curve->is_rational = false; curve->degree = 3; const size_t NUMBER_OF_POINTS = n; curve->control_point.resize(NUMBER_OF_POINTS); for(size_t i = 0; i < NUMBER_OF_POINTS; ++i) curve->control_point[i].Set(X(cP[i]),Y(cP[i]),Z(cP[i])); curve->knot.resize(3+NUMBER_OF_POINTS+1); curve->knot[0] = 1; for(size_t i = 1; i < 3+NUMBER_OF_POINTS; ++i) curve->knot[i] = (i+2)/3; // integer division is intentional curve->knot[3+NUMBER_OF_POINTS] = (3+NUMBER_OF_POINTS+1)/3; } template void addCurve(uint32_t d, uint32_t n, const V cP[], const double *k, const RGBAColour &c, const double w[]) { ADDWIRE(PRCNURBSCurve) curve->is_rational = (w!=NULL); curve->degree = d; curve->control_point.resize(n); for(uint32_t i = 0; i < n; i++) if(w) curve->control_point[i].Set(X(cP[i])*w[i],Y(cP[i])*w[i],Z(cP[i])*w[i], w[i]); else curve->control_point[i].Set(X(cP[i]),Y(cP[i]),Z(cP[i])); curve->knot.resize(d+n+1); for(uint32_t i = 0; i < d+n+1; i++) curve->knot[i] = k[i]; } template void addQuad(const V P[], const RGBAColour C[]) { PRCgroup &group = findGroup(); group.quads.push_back(PRCtessquad()); PRCtessquad &quad = group.quads.back(); for(size_t i = 0; i < 4; i++) { quad.vertices[i].x = X(P[i]); quad.vertices[i].y = Y(P[i]); quad.vertices[i].z = Z(P[i]); quad.colours[i] = C[i]; } } template void addRectangle(const V P[], const PRCmaterial &m) { PRCgroup &group = findGroup(); if(group.options.tess) { group.rectangles.push_back(PRCtessrectangle()); PRCtessrectangle &rectangle = group.rectangles.back(); rectangle.style = addMaterial(m); for(size_t i = 0; i < 4; i++) { rectangle.vertices[i].x = X(P[i]); rectangle.vertices[i].y = Y(P[i]); rectangle.vertices[i].z = Z(P[i]); } } else if(group.options.compression == 0.0) { ADDFACE(PRCNURBSSurface) surface->is_rational = false; surface->degree_in_u = 1; surface->degree_in_v = 1; surface->control_point.resize(4); for(size_t i = 0; i < 4; ++i) { surface->control_point[i].x = X(P[i]); surface->control_point[i].y = Y(P[i]); surface->control_point[i].z = Z(P[i]); } surface->knot_u.resize(4); surface->knot_v.resize(4); surface->knot_v[0] = surface->knot_u[0] = 1; surface->knot_v[1] = surface->knot_u[1] = 3; surface->knot_v[2] = surface->knot_u[2] = 4; surface->knot_v[3] = surface->knot_u[3] = 4; } else { ADDCOMPFACE compface->degree = 1; compface->control_point.resize(4); for(size_t i = 0; i < 4; ++i) { compface->control_point[i].x = X(P[i]); compface->control_point[i].y = Y(P[i]); compface->control_point[i].z = Z(P[i]); } } } template void addPatch(const V cP[], const PRCmaterial &m) { PRCgroup &group = findGroup(); if(group.options.compression == 0.0) { ADDFACE(PRCNURBSSurface) surface->is_rational = false; surface->degree_in_u = 3; surface->degree_in_v = 3; surface->control_point.resize(16); for(size_t i = 0; i < 16; ++i) { surface->control_point[i].x = X(cP[i]); surface->control_point[i].y = Y(cP[i]); surface->control_point[i].z = Z(cP[i]); } surface->knot_u.resize(8); surface->knot_v.resize(8); surface->knot_v[0] = surface->knot_u[0] = 1; surface->knot_v[1] = surface->knot_u[1] = 1; surface->knot_v[2] = surface->knot_u[2] = 1; surface->knot_v[3] = surface->knot_u[3] = 1; surface->knot_v[4] = surface->knot_u[4] = 2; surface->knot_v[5] = surface->knot_u[5] = 2; surface->knot_v[6] = surface->knot_u[6] = 2; surface->knot_v[7] = surface->knot_u[7] = 2; } else { ADDCOMPFACE compface->degree = 3; compface->control_point.resize(16); for(size_t i = 0; i < 16; ++i) { compface->control_point[i].x = X(cP[i]); compface->control_point[i].y = Y(cP[i]); compface->control_point[i].z = Z(cP[i]); } } } template void addSurface(uint32_t dU, uint32_t dV, uint32_t nU, uint32_t nV, const V cP[], const double *kU, const double *kV, const PRCmaterial &m, const double w[]) { ADDFACE(PRCNURBSSurface) surface->is_rational = (w!=NULL); surface->degree_in_u = dU; surface->degree_in_v = dV; surface->control_point.resize(nU*nV); for(size_t i = 0; i < nU*nV; i++) if(w) surface->control_point[i]=PRCControlPoint(X(cP[i])*w[i],Y(cP[i])*w[i],Z(cP[i])*w[i],w[i]); else surface->control_point[i]=PRCControlPoint(X(cP[i]),Y(cP[i]),Z(cP[i])); surface->knot_u.insert(surface->knot_u.end(), kU, kU+(dU+nU+1)); surface->knot_v.insert(surface->knot_v.end(), kV, kV+(dV+nV+1)); } template void addTube(uint32_t n, const V cP[], const V oP[], bool straight, const PRCmaterial &m, PRCTRANSFORM) { ADDFACE(PRCBlend01) SETTRANSF if(straight) { PRCPolyLine *center_curve = new PRCPolyLine; center_curve->point.resize(n); for(uint32_t i=0; ipoint[i].Set(X(cP[i]),Y(cP[i]),Z(cP[i])); center_curve->interval.min = 0; center_curve->interval.max = center_curve->point.size()-1; surface->center_curve = center_curve; PRCPolyLine *origin_curve = new PRCPolyLine; origin_curve->point.resize(n); for(uint32_t i=0; ipoint[i].Set(X(oP[i]),Y(oP[i]),Z(oP[i])); origin_curve->interval.min = 0; origin_curve->interval.max = origin_curve->point.size()-1; surface->origin_curve = origin_curve; surface->uv_domain.min.x = 0; surface->uv_domain.max.x = 2*pi; surface->uv_domain.min.y = 0; surface->uv_domain.max.y = n-1; } else { PRCNURBSCurve *center_curve = new PRCNURBSCurve; center_curve->is_rational = false; center_curve->degree = 3; const uint32_t CENTER_NUMBER_OF_POINTS = n; center_curve->control_point.resize(CENTER_NUMBER_OF_POINTS); for(uint32_t i = 0; i < CENTER_NUMBER_OF_POINTS; ++i) center_curve->control_point[i].Set(X(cP[i]),Y(cP[i]),Z(cP[i])); center_curve->knot.resize(3+CENTER_NUMBER_OF_POINTS+1); center_curve->knot[0] = 1; for(uint32_t i = 1; i < 3+CENTER_NUMBER_OF_POINTS; ++i) center_curve->knot[i] = (i+2)/3; // integer division is intentional center_curve->knot[3+CENTER_NUMBER_OF_POINTS] = (3+CENTER_NUMBER_OF_POINTS+1)/3; surface->center_curve = center_curve; PRCNURBSCurve *origin_curve = new PRCNURBSCurve; origin_curve->is_rational = false; origin_curve->degree = 3; const uint32_t ORIGIN_NUMBER_OF_POINTS = n; origin_curve->control_point.resize(ORIGIN_NUMBER_OF_POINTS); for(uint32_t i = 0; i < ORIGIN_NUMBER_OF_POINTS; ++i) origin_curve->control_point[i].Set(X(oP[i]),Y(oP[i]),Z(oP[i])); origin_curve->knot.resize(3+ORIGIN_NUMBER_OF_POINTS+1); origin_curve->knot[0] = 1; for(size_t i = 1; i < 3+ORIGIN_NUMBER_OF_POINTS; ++i) origin_curve->knot[i] = (i+2)/3; // integer division is intentional origin_curve->knot[3+ORIGIN_NUMBER_OF_POINTS] = (3+ORIGIN_NUMBER_OF_POINTS+1)/3; surface->origin_curve = origin_curve; surface->uv_domain.min.x = 0; surface->uv_domain.max.x = 2*pi; surface->uv_domain.min.y = 1; // first knot surface->uv_domain.max.y = (3+CENTER_NUMBER_OF_POINTS+1)/3; // last knot } } void addHemisphere(double radius, const PRCmaterial& m, PRCTRANSFORM); void addSphere(double radius, const PRCmaterial& m, PRCTRANSFORM); void addDisk(double radius, const PRCmaterial& m, PRCTRANSFORM); void addCylinder(double radius, double height, const PRCmaterial& m, PRCTRANSFORM); void addCone(double radius, double height, const PRCmaterial& m, PRCTRANSFORM); void addTorus(double major_radius, double minor_radius, double angle1, double angle2, const PRCmaterial& m, PRCTRANSFORM); #undef PRCTRANSFORM #undef PRCCARTRANSFORM #undef PRCGENTRANSFORM #undef ADDCOMPFACE uint32_t addPicture(EPRCPictureDataFormat format, uint32_t size, const uint8_t *picture, uint32_t width=0, uint32_t height=0, std::string name="", uint32_t fileStructure=0) { return fileStructures[fileStructure]->addPicture(format, size, picture, width, height, name); } uint32_t addPicture(const PRCpicture& pic, std::string name="", uint32_t fileStructure=0) { return fileStructures[fileStructure]->addPicture(pic.format, pic.size, pic.data, pic.width, pic.height, name); } uint32_t addTextureDefinition(PRCTextureDefinition*& pTextureDefinition, uint32_t fileStructure=0) { return fileStructures[fileStructure]->addTextureDefinition(pTextureDefinition); } uint32_t addTextureApplication(PRCTextureApplication*& pTextureApplication, uint32_t fileStructure=0) { return fileStructures[fileStructure]->addTextureApplication(pTextureApplication); } uint32_t addRgbColor(const PRCRgbColor &color, uint32_t fileStructure=0) { return fileStructures[fileStructure]->addRgbColor(color); } uint32_t addRgbColorUnique(const PRCRgbColor &color, uint32_t fileStructure=0) { return fileStructures[fileStructure]->addRgbColorUnique(color); } uint32_t addMaterialGeneric(PRCMaterialGeneric*& pMaterialGeneric, uint32_t fileStructure=0) { return fileStructures[fileStructure]->addMaterialGeneric(pMaterialGeneric); } uint32_t addStyle(PRCStyle*& pStyle, uint32_t fileStructure=0) { return fileStructures[fileStructure]->addStyle(pStyle); } uint32_t addPartDefinition(PRCPartDefinition*& pPartDefinition, uint32_t fileStructure=0) { return fileStructures[fileStructure]->addPartDefinition(pPartDefinition); } uint32_t addProductOccurrence(PRCProductOccurrence*& pProductOccurrence, uint32_t fileStructure=0) { return fileStructures[fileStructure]->addProductOccurrence(pProductOccurrence); } uint32_t addTopoContext(PRCTopoContext*& pTopoContext, uint32_t fileStructure=0) { return fileStructures[fileStructure]->addTopoContext(pTopoContext); } uint32_t getTopoContext(PRCTopoContext*& pTopoContext, uint32_t fileStructure=0) { return fileStructures[fileStructure]->getTopoContext(pTopoContext); } uint32_t add3DTess(PRC3DTess*& p3DTess, uint32_t fileStructure=0) { return fileStructures[fileStructure]->add3DTess(p3DTess); } uint32_t add3DWireTess(PRC3DWireTess*& p3DWireTess, uint32_t fileStructure=0) { return fileStructures[fileStructure]->add3DWireTess(p3DWireTess); } /* uint32_t addMarkupTess(PRCMarkupTess*& pMarkupTess, uint32_t fileStructure=0) { return fileStructures[fileStructure]->addMarkupTess(pMarkupTess); } uint32_t addMarkup(PRCMarkup*& pMarkup, uint32_t fileStructure=0) { return fileStructures[fileStructure]->addMarkup(pMarkup); } uint32_t addAnnotationItem(PRCAnnotationItem*& pAnnotationItem, uint32_t fileStructure=0) { return fileStructures[fileStructure]->addAnnotationItem(pAnnotationItem); } */ uint32_t addCoordinateSystem(PRCCoordinateSystem*& pCoordinateSystem, uint32_t fileStructure=0) { return fileStructures[fileStructure]->addCoordinateSystem(pCoordinateSystem); } uint32_t addCoordinateSystemUnique(PRCCoordinateSystem*& pCoordinateSystem, uint32_t fileStructure=0) { return fileStructures[fileStructure]->addCoordinateSystemUnique(pCoordinateSystem); } private: void serializeModelFileData(PRCbitStream&); std::ofstream *fout; std::ostream &output; }; } #endif // __O_PRC_FILE_H asymptote-3.05/prc/include/prc/PRCdouble.h0000644000000000000000000000677315031566105017166 0ustar rootroot#ifndef __PRC_DOUBLE_H #define __PRC_DOUBLE_H #include #include #include #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "PRCuniversalendianness.h" // from Adobe's documentation union ieee754_double { double d; /* This is the IEEE 754 double-precision format. */ struct { #ifdef WORDS_BIGENDIAN unsigned int negative:1; unsigned int exponent:11; /* Together these comprise the mantissa. */ unsigned int mantissa0:20; unsigned int mantissa1:32; #else /* Together these comprise the mantissa. */ unsigned int mantissa1:32; unsigned int mantissa0:20; unsigned int exponent:11; unsigned int negative:1; #endif } ieee; }; union ieee754_float { float f; /* This is the IEEE 754 float-precision format. */ struct { #ifdef WORDS_BIGENDIAN unsigned int negative:1; unsigned int exponent:8; unsigned int mantissa:23; #else unsigned int mantissa:23; unsigned int exponent:8; unsigned int negative:1; #endif } ieee; }; enum ValueType {VT_double,VT_exponent}; struct sCodageOfFrequentDoubleOrExponent { short Type; short NumberOfBits; unsigned Bits; union { unsigned ul[2]; double Value; } u2uod; }; #ifdef WORDS_BIGENDIAN # define DOUBLEWITHTWODWORD(upper,lower) upper,lower # define UPPERPOWER (0) # define LOWERPOWER (!UPPERPOWER) # define NEXTBYTE(pbd) ((pbd)++) # define PREVIOUSBYTE(pbd) ((pbd)--) # define MOREBYTE(pbd,pbend) ((pbd)<=(pbend)) # define OFFSETBYTE(pbd,offset) ((pbd)+=offset) # define BEFOREBYTE(pbd) ((pbd)-1) # define DIFFPOINTERS(p1,p2) ((p1)-(p2)) # define SEARCHBYTE(pbstart,b,nb) (unsigned char *)memrchr((pbstart),(b),(nb)) # define BYTEAT(pb,i) *((pb)-(i)) #else # define DOUBLEWITHTWODWORD(upper,lower) lower,upper # define UPPERPOWER (1) # define LOWERPOWER (!UPPERPOWER) # define NEXTBYTE(pbd) ((pbd)--) # define PREVIOUSBYTE(pbd) ((pbd)++) # define MOREBYTE(pbd,pbend) ((pbd)>=(pbend)) # define OFFSETBYTE(pbd,offset) ((pbd)-=offset) # define BEFOREBYTE(pbd) ((pbd)+1) # define DIFFPOINTERS(p1,p2) ((unsigned)((p2)-(p1))) # define SEARCHBYTE(pbstart,b,nb) (unsigned char *)memchr((pbstart),(b),(nb)) # define BYTEAT(pb,i) *((pb)+(i)) #endif #define MAXLENGTHFORCOMPRESSEDTYPE ((22+1+1+4+6*(1+8))+7)/8 #define NEGATIVE(d) (((union ieee754_double *)&(d))->ieee.negative) #define EXPONENT(d) (((union ieee754_double *)&(d))->ieee.exponent) #define MANTISSA0(d) (((union ieee754_double *)&(d))->ieee.mantissa0) #define MANTISSA1(d) (((union ieee754_double *)&(d))->ieee.mantissa1) typedef unsigned char PRCbyte; typedef unsigned short PRCword; typedef unsigned PRCdword; extern PRCdword stadwZero[2],stadwNegativeZero[2]; #define NUMBEROFELEMENTINACOFDOE (2077) #ifdef WORDS_BIGENDIAN # define DOUBLEWITHTWODWORDINTREE(upper,lower) {upper,lower} #else # define DOUBLEWITHTWODWORDINTREE(upper,lower) {lower,upper} #endif extern sCodageOfFrequentDoubleOrExponent acofdoe[NUMBEROFELEMENTINACOFDOE]; struct sCodageOfFrequentDoubleOrExponent* getcofdoe(unsigned,short); #define STAT_V #define STAT_DOUBLE int stCOFDOECompare(const void*,const void*); #ifdef WORDS_BIGENDIAN #ifndef HAVE_MEMRCHR void *memrchr(const void *,int,size_t); #endif #endif #endif // __PRC_DOUBLE_H asymptote-3.05/prc/include/prc/PRCuniversalendianness.h0000644000000000000000000000046015031566105021757 0ustar rootroot#pragma once #if defined(UNIVERSAL_ENDIAN_BUILD) #if defined(__BIG_ENDIAN__) #define WORDS_BIGENDIAN 1 #endif // defined(__BIG_ENDIAN__) #else // defined(UNIVERSAL_ENDIAN_BUILD) #ifndef WORDS_BIGENDIAN #undef WORDS_BIGENDIAN #endif // !defined(WORDS_BIGENDIAN) #endif // defined(UNIVERSAL_ENDIAN_BUILD) asymptote-3.05/prc/include/prc/PRC.h0000644000000000000000000007266615031566105015777 0ustar rootroot#ifndef __PRC_H #define __PRC_H #include "PRCuniversalendianness.h" #ifdef _MSC_VER #if _MSC_VER >= 1600 #include #else typedef signed char int8_t; typedef signed short int16_t; typedef signed long int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; #endif // _MSC_VER >= 1600 #else #include #endif // _MSC_VER //const uint32_t PRCVersion=7094; // For Adobe Reader 8 or later const uint32_t PRCVersion=8137; // For Adobe Reader 9 or later // from Adobe's documentation #define PRC_TYPE_Unknown ( (uint32_t)-1 ) #define PRC_TYPE_ROOT 0 // This type does not correspond to any entity #define PRC_TYPE_ROOT_PRCBase ( PRC_TYPE_ROOT + 1 ) // Abstract root type for any PRC entity. #define PRC_TYPE_ROOT_PRCBaseWithGraphics ( PRC_TYPE_ROOT + 2 ) // Abstract root type for any PRC entity which can bear graphics. #define PRC_TYPE_CRV ( PRC_TYPE_ROOT + 10 ) // Types for PRC geometrical curves #define PRC_TYPE_SURF ( PRC_TYPE_ROOT + 75 ) // Types for PRC geometrical surfaces #define PRC_TYPE_TOPO ( PRC_TYPE_ROOT + 140 ) // Types for PRC topology #define PRC_TYPE_TESS ( PRC_TYPE_ROOT + 170 ) // Types for PRC tessellation #define PRC_TYPE_MISC ( PRC_TYPE_ROOT + 200 ) // Types for PRC global data #define PRC_TYPE_RI ( PRC_TYPE_ROOT + 230 ) // Types for PRC representation items #define PRC_TYPE_ASM ( PRC_TYPE_ROOT + 300 ) // Types for PRC assembly #define PRC_TYPE_MKP ( PRC_TYPE_ROOT + 500 ) // Types for PRC markup #define PRC_TYPE_GRAPH ( PRC_TYPE_ROOT + 700 ) // Types for PRC graphics #define PRC_TYPE_MATH ( PRC_TYPE_ROOT + 900 ) // Types for PRC mathematical operators #define PRC_TYPE_CRV_Base ( PRC_TYPE_CRV + 1 ) // Abstract type for all geometric curves. #define PRC_TYPE_CRV_Blend02Boundary ( PRC_TYPE_CRV + 2 ) // Boundary Curve. #define PRC_TYPE_CRV_NURBS ( PRC_TYPE_CRV + 3 ) // Non Uniform BSpline curve. #define PRC_TYPE_CRV_Circle ( PRC_TYPE_CRV + 4 ) // Circle. #define PRC_TYPE_CRV_Composite ( PRC_TYPE_CRV + 5 ) // Array of oriented curves. #define PRC_TYPE_CRV_OnSurf ( PRC_TYPE_CRV + 6 ) // Curve defined by a UV curve on a surface. #define PRC_TYPE_CRV_Ellipse ( PRC_TYPE_CRV + 7 ) // Ellipse. #define PRC_TYPE_CRV_Equation ( PRC_TYPE_CRV + 8 ) // curve described by specific law elements #define PRC_TYPE_CRV_Helix ( PRC_TYPE_CRV + 9 ) // Helix curve. #define PRC_TYPE_CRV_Hyperbola ( PRC_TYPE_CRV + 10 ) // Hyperbola. #define PRC_TYPE_CRV_Intersection ( PRC_TYPE_CRV + 11 ) // Intersection between 2 surfaces. #define PRC_TYPE_CRV_Line ( PRC_TYPE_CRV + 12 ) // Line. #define PRC_TYPE_CRV_Offset ( PRC_TYPE_CRV + 13 ) // Offset curve. #define PRC_TYPE_CRV_Parabola ( PRC_TYPE_CRV + 14 ) // Parabola. #define PRC_TYPE_CRV_PolyLine ( PRC_TYPE_CRV + 15 ) // Polyedric curve. #define PRC_TYPE_CRV_Transform ( PRC_TYPE_CRV + 16 ) // Transformed curve. #define PRC_TYPE_SURF_Base ( PRC_TYPE_SURF + 1 ) // Abstract type for all geometric surfaces. #define PRC_TYPE_SURF_Blend01 ( PRC_TYPE_SURF + 2 ) // Blend surface. #define PRC_TYPE_SURF_Blend02 ( PRC_TYPE_SURF + 3 ) // Blend Surface. #define PRC_TYPE_SURF_Blend03 ( PRC_TYPE_SURF + 4 ) // Blend Surface. #define PRC_TYPE_SURF_NURBS ( PRC_TYPE_SURF + 5 ) // Non Uniform BSpline surface. #define PRC_TYPE_SURF_Cone ( PRC_TYPE_SURF + 6 ) // Cone. #define PRC_TYPE_SURF_Cylinder ( PRC_TYPE_SURF + 7 ) // Cylinder. #define PRC_TYPE_SURF_Cylindrical ( PRC_TYPE_SURF + 8 ) // Surface who is defined in cylindrical space. #define PRC_TYPE_SURF_Offset ( PRC_TYPE_SURF + 9 ) // Offset surface. #define PRC_TYPE_SURF_Pipe ( PRC_TYPE_SURF + 10 ) // Pipe. #define PRC_TYPE_SURF_Plane ( PRC_TYPE_SURF + 11 ) // Plane. #define PRC_TYPE_SURF_Ruled ( PRC_TYPE_SURF + 12 ) // Ruled surface. #define PRC_TYPE_SURF_Sphere ( PRC_TYPE_SURF + 13 ) // Sphere. #define PRC_TYPE_SURF_Revolution ( PRC_TYPE_SURF + 14 ) // Surface of revolution. #define PRC_TYPE_SURF_Extrusion ( PRC_TYPE_SURF + 15 ) // Surface of extrusion. #define PRC_TYPE_SURF_FromCurves ( PRC_TYPE_SURF + 16 ) // Surface from two curves. #define PRC_TYPE_SURF_Torus ( PRC_TYPE_SURF + 17 ) // Torus. #define PRC_TYPE_SURF_Transform ( PRC_TYPE_SURF + 18 ) // Transformed surface. #define PRC_TYPE_SURF_Blend04 ( PRC_TYPE_SURF + 19 ) // defined for future use. #define PRC_TYPE_TOPO_Context ( PRC_TYPE_TOPO + 1 ) // Self-containing set of topological entities. #define PRC_TYPE_TOPO_Item ( PRC_TYPE_TOPO + 2 ) // Abstract root type for any topological entity (body or single item). #define PRC_TYPE_TOPO_MultipleVertex ( PRC_TYPE_TOPO + 3 ) // Vertex whose position is the average of all edges' extremity positions to whom it belongs. #define PRC_TYPE_TOPO_UniqueVertex ( PRC_TYPE_TOPO + 4 ) // Vertex with one set of coordinates (absolute position). #define PRC_TYPE_TOPO_WireEdge ( PRC_TYPE_TOPO + 5 ) // Edge belonging to a wire body / single wire body. #define PRC_TYPE_TOPO_Edge ( PRC_TYPE_TOPO + 6 ) // Edge belonging to a brep data. #define PRC_TYPE_TOPO_CoEdge ( PRC_TYPE_TOPO + 7 ) // Usage of an edge in a loop. #define PRC_TYPE_TOPO_Loop ( PRC_TYPE_TOPO + 8 ) // Array of co edges which delimits a face. #define PRC_TYPE_TOPO_Face ( PRC_TYPE_TOPO + 9 ) // Topological face delimiting a shell. #define PRC_TYPE_TOPO_Shell ( PRC_TYPE_TOPO + 10 ) // Topological shell (open or closed). #define PRC_TYPE_TOPO_Connex ( PRC_TYPE_TOPO + 11 ) // Topological region delimited by one or several shells. #define PRC_TYPE_TOPO_Body ( PRC_TYPE_TOPO + 12 ) // Abstract root type for any topological body. #define PRC_TYPE_TOPO_SingleWireBody ( PRC_TYPE_TOPO + 13 ) // Single wire body. #define PRC_TYPE_TOPO_BrepData ( PRC_TYPE_TOPO + 14 ) // Main entry to solid and surface topology (regular form). #define PRC_TYPE_TOPO_SingleWireBodyCompress ( PRC_TYPE_TOPO + 15 ) // Single wire body. (ultra compressed form). #define PRC_TYPE_TOPO_BrepDataCompress ( PRC_TYPE_TOPO + 16 ) // Main entry to solid and surface topology (ultra compressed form). #define PRC_TYPE_TOPO_WireBody ( PRC_TYPE_TOPO + 17 ) // This type is the main entry to wire topology. #define PRC_TYPE_TESS_Base ( PRC_TYPE_TESS + 1 ) // Abstract root type for any tessellated entity. #define PRC_TYPE_TESS_3D ( PRC_TYPE_TESS + 2 ) // Tessellated faceted data; regular form. #define PRC_TYPE_TESS_3D_Compressed ( PRC_TYPE_TESS + 3 ) // Tessellated faceted data; highly compressed form. #define PRC_TYPE_TESS_Face ( PRC_TYPE_TESS + 4 ) // Tessellated face. #define PRC_TYPE_TESS_3D_Wire ( PRC_TYPE_TESS + 5 ) // Tessellated wireframe. #define PRC_TYPE_TESS_Markup ( PRC_TYPE_TESS + 6 ) // Tessellated markup. #define PRC_TYPE_MISC_Attribute ( PRC_TYPE_MISC + 1 ) // Entity attribute. #define PRC_TYPE_MISC_CartesianTransformation ( PRC_TYPE_MISC + 2 ) // Cartesian transformation. #define PRC_TYPE_MISC_EntityReference ( PRC_TYPE_MISC + 3 ) // Entity reference. #define PRC_TYPE_MISC_MarkupLinkedItem ( PRC_TYPE_MISC + 4 ) // Link between a markup and an entity. #define PRC_TYPE_MISC_ReferenceOnPRCBase ( PRC_TYPE_MISC + 5 ) // Reference pointing on a regular entity (not topological). #define PRC_TYPE_MISC_ReferenceOnTopology ( PRC_TYPE_MISC + 6 ) // Reference pointing on a topological entity. #define PRC_TYPE_MISC_GeneralTransformation ( PRC_TYPE_MISC + 7 ) // General transformation. #define PRC_TYPE_RI_RepresentationItem ( PRC_TYPE_RI + 1 ) // Basic abstract type for representation items. #define PRC_TYPE_RI_BrepModel ( PRC_TYPE_RI + 2 ) // Basic type for surfaces and solids. #define PRC_TYPE_RI_Curve ( PRC_TYPE_RI + 3 ) // Basic type for curves. #define PRC_TYPE_RI_Direction ( PRC_TYPE_RI + 4 ) // Optional point + vector. #define PRC_TYPE_RI_Plane ( PRC_TYPE_RI + 5 ) // Construction plane, as opposed to planar surface. #define PRC_TYPE_RI_PointSet ( PRC_TYPE_RI + 6 ) // Set of points. #define PRC_TYPE_RI_PolyBrepModel ( PRC_TYPE_RI + 7 ) // Basic type to polyhedral surfaces and solids. #define PRC_TYPE_RI_PolyWire ( PRC_TYPE_RI + 8 ) // Polyedric wireframe entity. #define PRC_TYPE_RI_Set ( PRC_TYPE_RI + 9 ) // Logical grouping of arbitrary number of representation items. #define PRC_TYPE_RI_CoordinateSystem ( PRC_TYPE_RI + 10 ) // Coordinate system. #define PRC_TYPE_ASM_ModelFile ( PRC_TYPE_ASM + 1 ) // Basic entry type for PRC. #define PRC_TYPE_ASM_FileStructure ( PRC_TYPE_ASM + 2 ) // Basic structure for PRC files. #define PRC_TYPE_ASM_FileStructureGlobals ( PRC_TYPE_ASM + 3 ) // Basic structure for PRC files : globals. #define PRC_TYPE_ASM_FileStructureTree ( PRC_TYPE_ASM + 4 ) // Basic structure for PRC files : tree. #define PRC_TYPE_ASM_FileStructureTessellation ( PRC_TYPE_ASM + 5 ) // Basic structure for PRC files : tessellation. #define PRC_TYPE_ASM_FileStructureGeometry ( PRC_TYPE_ASM + 6 ) // Basic structure for PRC files : geometry. #define PRC_TYPE_ASM_FileStructureExtraGeometry ( PRC_TYPE_ASM + 7 ) // Basic structure for PRC files : extra geometry data. #define PRC_TYPE_ASM_ProductOccurence ( PRC_TYPE_ASM + 10 ) // Basic contruct for assemblies. #define PRC_TYPE_ASM_PartDefinition ( PRC_TYPE_ASM + 11 ) // Basic construct for parts. #define PRC_TYPE_ASM_Filter ( PRC_TYPE_ASM + 20 ) #define PRC_TYPE_MKP_View ( PRC_TYPE_MKP + 1 ) // Grouping of markup by views. #define PRC_TYPE_MKP_Markup ( PRC_TYPE_MKP + 2 ) // Basic type for simple markups. #define PRC_TYPE_MKP_Leader ( PRC_TYPE_MKP + 3 ) // basic type for markup leader #define PRC_TYPE_MKP_AnnotationItem ( PRC_TYPE_MKP + 4 ) // Usage of a markup. #define PRC_TYPE_MKP_AnnotationSet ( PRC_TYPE_MKP + 5 ) // Group of annotations. #define PRC_TYPE_MKP_AnnotationReference ( PRC_TYPE_MKP + 6 ) // Logical grouping of annotations for reference. #define PRC_TYPE_GRAPH_Style ( PRC_TYPE_GRAPH + 1 ) // Display style. #define PRC_TYPE_GRAPH_Material ( PRC_TYPE_GRAPH + 2 ) // Display material properties. #define PRC_TYPE_GRAPH_Picture ( PRC_TYPE_GRAPH + 3 ) // Picture. #define PRC_TYPE_GRAPH_TextureApplication ( PRC_TYPE_GRAPH + 11 ) // Texture application. #define PRC_TYPE_GRAPH_TextureDefinition ( PRC_TYPE_GRAPH + 12 ) // Texture definition. #define PRC_TYPE_GRAPH_TextureTransformation ( PRC_TYPE_GRAPH + 13 ) // Texture transformation. #define PRC_TYPE_GRAPH_LinePattern ( PRC_TYPE_GRAPH + 21 ) // One dimensional display style. #define PRC_TYPE_GRAPH_FillPattern ( PRC_TYPE_GRAPH + 22 ) // Abstract class for two-dimensional display style. #define PRC_TYPE_GRAPH_DottingPattern ( PRC_TYPE_GRAPH + 23 ) // Two-dimensional filling with dots. #define PRC_TYPE_GRAPH_HatchingPattern ( PRC_TYPE_GRAPH + 24 ) // Two-dimensional filling with hatches. #define PRC_TYPE_GRAPH_SolidPattern ( PRC_TYPE_GRAPH + 25 ) // Two-dimensional filling with particular style (color, material, texture). #define PRC_TYPE_GRAPH_VPicturePattern ( PRC_TYPE_GRAPH + 26 ) // Two-dimensional filling with vectorised picture. #define PRC_TYPE_GRAPH_AmbientLight ( PRC_TYPE_GRAPH + 31 ) // Scene ambient illumination. #define PRC_TYPE_GRAPH_PointLight ( PRC_TYPE_GRAPH + 32 ) // Scene point illumination. #define PRC_TYPE_GRAPH_DirectionalLight ( PRC_TYPE_GRAPH + 33 ) // Scene directional illumination. #define PRC_TYPE_GRAPH_SpotLight ( PRC_TYPE_GRAPH + 34 ) // Scene spot illumination. #define PRC_TYPE_GRAPH_SceneDisplayParameters ( PRC_TYPE_GRAPH + 41 ) // Parameters for scene visualisation. #define PRC_TYPE_GRAPH_Camera ( PRC_TYPE_GRAPH + 42 ) // #define PRC_TYPE_MATH_FCT_1D ( PRC_TYPE_MATH + 1 ) // Basic type for one degree equation object. #define PRC_TYPE_MATH_FCT_1D_Polynom ( PRC_TYPE_MATH_FCT_1D + 1 ) // Polynomial equation. #define PRC_TYPE_MATH_FCT_1D_Trigonometric ( PRC_TYPE_MATH_FCT_1D + 2 ) // Cosinus based equation. #define PRC_TYPE_MATH_FCT_1D_Fraction ( PRC_TYPE_MATH_FCT_1D + 3 ) // Fraction between 2 one degree equation object. #define PRC_TYPE_MATH_FCT_1D_ArctanCos ( PRC_TYPE_MATH_FCT_1D + 4 ) // Specific equation. #define PRC_TYPE_MATH_FCT_1D_Combination ( PRC_TYPE_MATH_FCT_1D + 5 ) // Combination of one degree equation object. #define PRC_TYPE_MATH_FCT_3D ( PRC_TYPE_MATH + 10 ) // Basic type for 3rd degree equation object. #define PRC_TYPE_MATH_FCT_3D_Linear ( PRC_TYPE_MATH_FCT_3D + 1 ) // Linear transformation ( with a matrix ). #define PRC_TYPE_MATH_FCT_3D_NonLinear ( PRC_TYPE_MATH_FCT_3D + 2 ) // Specific transformation. #define PRC_PRODUCT_FLAG_DEFAULT 0x0001 #define PRC_PRODUCT_FLAG_INTERNAL 0x0002 #define PRC_PRODUCT_FLAG_CONTAINER 0x0004 #define PRC_PRODUCT_FLAG_CONFIG 0x0008 #define PRC_PRODUCT_FLAG_VIEW 0x0010 #define PRC_TRANSFORMATION_Identity 0x00 #define PRC_TRANSFORMATION_Translate 0x01 #define PRC_TRANSFORMATION_Rotate 0x02 #define PRC_TRANSFORMATION_Mirror 0x04 #define PRC_TRANSFORMATION_Scale 0x08 #define PRC_TRANSFORMATION_NonUniformScale 0x10 #define PRC_TRANSFORMATION_NonOrtho 0x20 #define PRC_TRANSFORMATION_Homogeneous 0x40 #define PRC_FACETESSDATA_Polyface 0x0001 #define PRC_FACETESSDATA_Triangle 0x0002 #define PRC_FACETESSDATA_TriangleFan 0x0004 #define PRC_FACETESSDATA_TriangleStripe 0x0008 #define PRC_FACETESSDATA_PolyfaceOneNormal 0x0010 #define PRC_FACETESSDATA_TriangleOneNormal 0x0020 #define PRC_FACETESSDATA_TriangleFanOneNormal 0x0040 #define PRC_FACETESSDATA_TriangleStripeOneNormal 0x0080 #define PRC_FACETESSDATA_PolyfaceTextured 0x0100 #define PRC_FACETESSDATA_TriangleTextured 0x0200 #define PRC_FACETESSDATA_TriangleFanTextured 0x0400 #define PRC_FACETESSDATA_TriangleStripeTextured 0x0800 #define PRC_FACETESSDATA_PolyfaceOneNormalTextured 0x1000 #define PRC_FACETESSDATA_TriangleOneNormalTextured 0x2000 #define PRC_FACETESSDATA_TriangleFanOneNormalTextured 0x4000 #define PRC_FACETESSDATA_TriangleStripeOneNormalTextured 0x8000 #define PRC_FACETESSDATA_NORMAL_Single 0x40000000 #define PRC_FACETESSDATA_NORMAL_Mask 0x3FFFFFFF #define PRC_FACETESSDATA_WIRE_IsNotDrawn 0x4000 // Indicates that the edge should not be drawn (its neighbor will be drawn). #define PRC_FACETESSDATA_WIRE_IsClosing 0x8000 // Indicates that this is the last edge of a loop. #define PRC_3DWIRETESSDATA_IsClosing 0x10000000 // Indicates that the first point is implicitely repeated after the last one to close the wire edge. #define PRC_3DWIRETESSDATA_IsContinuous 0x20000000 // Indicates that the last point of the preceding wire should be linked with the first point of the current one. #define PRC_TEXTURE_MAPPING_DIFFUSE 0x0001 // Diffuse texture mapping attribute. Default value. #define PRC_TEXTURE_MAPPING_BUMP 0x0002 // Bump texture mapping attribute. #define PRC_TEXTURE_MAPPING_OPACITY 0x0004 // Opacity texture mapping attribute. #define PRC_TEXTURE_MAPPING_SPHERICAL_REFLECTION 0x0008 // Spherical reflection texture mapping attribute (used for environment mapping). #define PRC_TEXTURE_MAPPING_CUBICAL_REFLECTION 0x0010 // Cubical reflection texture mapping attribute (used for environment mapping). #define PRC_TEXTURE_MAPPING_REFRACTION 0x0020 // Refraction texture mapping attribute. #define PRC_TEXTURE_MAPPING_SPECULAR 0x0040 // Specular texture mapping attribute. #define PRC_TEXTURE_MAPPING_AMBIENT 0x0080 // Ambient texture mapping attribute. #define PRC_TEXTURE_MAPPING_EMISSION 0x0100 // Emission texture mapping attribute. #define PRC_TEXTURE_APPLYING_MODE_NONE 0x00 // let the application choose #define PRC_TEXTURE_APPLYING_MODE_LIGHTING 0x01 // use lighting mode #define PRC_TEXTURE_APPLYING_MODE_ALPHATEST 0x02 // use alpha test #define PRC_TEXTURE_APPLYING_MODE_VERTEXCOLOR 0x04 // combine a texture with one-color-per-vertex mode #define PRC_TEXTURE_MAPPING_COMPONENTS_RED 0x0001 // Red texture mapping component. #define PRC_TEXTURE_MAPPING_COMPONENTS_GREEN 0x0002 // Green texture mapping component. #define PRC_TEXTURE_MAPPING_COMPONENTS_BLUE 0x0004 // Blue texture mapping component. #define PRC_TEXTURE_MAPPING_COMPONENTS_RGB 0x0007 // RGB texture mapping component. #define PRC_TEXTURE_MAPPING_COMPONENTS_ALPHA 0x0008 // Alpha texture mapping component. #define PRC_TEXTURE_MAPPING_COMPONENTS_RGBA 0x000F // RGBA texture mapping component. enum EPRCModellerAttributeType { KEPRCModellerAttributeTypeNull = 0, KEPRCModellerAttributeTypeInt = 1, KEPRCModellerAttributeTypeReal = 2, KEPRCModellerAttributeTypeTime = 3, KEPRCModellerAttributeTypeString = 4 }; enum EPRCPictureDataFormat { KEPRCPicture_PNG, KEPRCPicture_JPG, KEPRCPicture_BITMAP_RGB_BYTE, KEPRCPicture_BITMAP_RGBA_BYTE, KEPRCPicture_BITMAP_GREY_BYTE, KEPRCPicture_BITMAP_GREYA_BYTE }; enum EPRCProductLoadStatus { KEPRCProductLoadStatus_Unknown = 0, KEPRCProductLoadStatus_Error, KEPRCProductLoadStatus_NotLoaded, KEPRCProductLoadStatus_NotLoadable, KEPRCProductLoadStatus_Loaded }; enum EPRCExtendType { KEPRCExtendTypeNone = 0, // Discontinuous position. KEPRCExtendTypeExt1 = 2, // Same as EPRCExtendTypeCInfinity. KEPRCExtendTypeExt2 = 4, // Same as EPRCExtendTypeG1R for surface, and EPRCExtendTypeG1 for curve. KEPRCExtendTypeG1 = 6, // Continuous in direction but not magnitude of first derivative. KEPRCExtendTypeG1R = 8, // Surface extended with a ruled surface that connects with G1-continuity. KEPRCExtendTypeG1_G2 = 10, // Extended by reflection, yielding a G2 continuous extension. KEPRCExtendTypeCInfinity = 12 // Unlimited continuity. }; enum EPRCKnotType { // Knot vector type KEPRCKnotTypeUniformKnots, // Uniform knot vector. KEPRCKnotTypeUnspecified, // Unspecified knot type. KEPRCKnotTypeQuasiUniformKnots, // Quasi-uniform knot vector. KEPRCKnotTypePiecewiseBezierKnots // Extrema with multiplicities of degree +1. }; // Note : this value is currently unused and should be set to KEPRCKnotTypeUnspecified. enum EPRCBSplineSurfaceForm { KEPRCBSplineSurfaceFormPlane, // Planar surface. KEPRCBSplineSurfaceFormCylindrical, // Cylindrical surface. KEPRCBSplineSurfaceFormConical, // Conical surface. KEPRCBSplineSurfaceFormSpherical, // Spherical surface. KEPRCBSplineSurfaceFormRevolution, // Surface of revolution. KEPRCBSplineSurfaceFormRuled, // Ruled surface. KEPRCBSplineSurfaceFormGeneralizedCone, // Cone. KEPRCBSplineSurfaceFormQuadric, // Quadric surface. KEPRCBSplineSurfaceFormLinearExtrusion, // Surface of extrusion. KEPRCBSplineSurfaceFormUnspecified, // Unspecified surface. KEPRCBSplineSurfaceFormPolynomial // Polynomial surface. }; enum EPRCBSplineCurveForm { // NURBS curve form KEPRCBSplineCurveFormUnspecified, // Unspecified curve form. KEPRCBSplineCurveFormPolyline, // Polygon. KEPRCBSplineCurveFormCircularArc, // Circle arc. KEPRCBSplineCurveFormEllipticArc, // Elliptical arc. KEPRCBSplineCurveFormParabolicArc, // Parabolic arc. KEPRCBSplineCurveFormHyperbolicArc // Hyperbolic arc. }; // Note : this value is currently unused and should be set to KEPRCBSplineCurveFormUnspecified. enum EPRCTextureMappingType { // Defines how to retrieve mapping coordinates. KEPRCTextureMappingType_Unknown, // Let the application choose. KEPRCTextureMappingType_Stored, // Use the mapping coordinates that are stored on a 3D tessellation object KEPRCTextureMappingType_Parametric, // Retrieve the UV coordinates on the surface as mapping coordinates KEPRCTextureMappingType_Operator // Use the defined Texture mapping operator to calculate mapping coordinates }; enum EPRCTextureFunction { // Defines how to paint a texture on the surface being rendered. KEPRCTextureFunction_Unknown, // Let the application choose. KEPRCTextureFunction_Modulate, // Combine lighting with texturing. This is the default value. KEPRCTextureFunction_Replace, // Replace the object color with texture color data. KEPRCTextureFunction_Blend, // Reserved for future use. KEPRCTextureFunction_Decal // Reserved for future use. }; enum EPRCTextureMappingOperator { // The operator to use when computing mapping coordinates. KEPRCTextureMappingOperator_Unknown, // Default value KEPRCTextureMappingOperator_Planar, // Reserved for future use KEPRCTextureMappingOperator_Cylindrical, // Reserved for future use KEPRCTextureMappingOperator_Spherical, // Reserved for future use KEPRCTextureMappingOperator_Cubical // Reserved for future use }; enum EPRCTextureBlendParameter { // Reserved for future use. Defines how to apply blending. KEPRCTextureBlendParameter_Unknown, // Default value. KEPRCTextureBlendParameter_Zero, // Reserved for future use. KEPRCTextureBlendParameter_One, // Reserved for future use. KEPRCTextureBlendParameter_SrcColor, // Reserved for future use. KEPRCTextureBlendParameter_OneMinusSrcColor, // Reserved for future use. KEPRCTextureBlendParameter_DstColor, // Reserved for future use. KEPRCTextureBlendParameter_OneMinusDstColor, // Reserved for future use. KEPRCTextureBlendParameter_SrcAlpha, // Reserved for future use. KEPRCTextureBlendParameter_OneMinusSrcAlpha, // Reserved for future use. KEPRCTextureBlendParameter_DstAlpha, // Reserved for future use. KEPRCTextureBlendParameter_OneMinusDstAlpha, // Reserved for future use. KEPRCTextureBlendParameter_SrcAlphaSaturate // Reserved for future use. }; enum EPRCTextureWrappingMode { // Defines repeating and clamping texture modes. KEPRCTextureWrappingMode_Unknown, // Let the application choose. KEPRCTextureWrappingMode_Repeat, // Display the repeated texture on the surface. KEPRCTextureWrappingMode_ClampToBorder, // Clamp the texture to the border. Display the surface color along the texture limits. KEPRCTextureWrappingMode_Clamp, // Reserved for future use. KEPRCTextureWrappingMode_ClampToEdge, // Reserved for future use. KEPRCTextureWrappingMode_MirroredRepeat // Reserved for future use. }; enum EPRCTextureAlphaTest { // Reserved for future use. Defines how to use a texture alpha test. KEPRCTextureAlphaTest_Unknown, // Default value. KEPRCTextureAlphaTest_Never, // Reserved for future use. KEPRCTextureAlphaTest_Less, // Reserved for future use. KEPRCTextureAlphaTest_Equal, // Reserved for future use. KEPRCTextureAlphaTest_Lequal, // Reserved for future use. KEPRCTextureAlphaTest_Greater, // Reserved for future use. KEPRCTextureAlphaTest_Notequal, // Reserved for future use. KEPRCTextureAlphaTest_Gequal, // Reserved for future use. KEPRCTextureAlphaTest_Always // Reserved for future use. }; // Bit field for graphics behavior #define PRC_GRAPHICS_Show 0x0001 // The entity is shown. #define PRC_GRAPHICS_SonHeritShow 0x0002 // Shown entity son inheritance. #define PRC_GRAPHICS_FatherHeritShow 0x0004 // Shown entity father inheritance. #define PRC_GRAPHICS_SonHeritColor 0x0008 // Color/material son inheritance. #define PRC_GRAPHICS_FatherHeritColor 0x0010 // Color/material father inheritance. #define PRC_GRAPHICS_SonHeritLayer 0x0020 // Layer son inheritance. #define PRC_GRAPHICS_FatherHeritLayer 0x0040 // Layer father inheritance. #define PRC_GRAPHICS_SonHeritTransparency 0x0080 // Transparency son inheritance. #define PRC_GRAPHICS_FatherHeritTransparency 0x0100 // Transparency father inheritance. #define PRC_GRAPHICS_SonHeritLinePattern 0x0200 // Line pattern son inheritance. #define PRC_GRAPHICS_FatherHeritLinePattern 0x0400 // Line pattern father inheritance. #define PRC_GRAPHICS_SonHeritLineWidth 0x0800 // Line width son inheritance. #define PRC_GRAPHICS_FatherHeritLineWidth 0x1000 // Line width father inheritance. #define PRC_GRAPHICS_Removed 0x2000 // The entity has been removed and no longer appears in the tree. enum EPRCMarkupType { KEPRCMarkupType_Unknown = 0, KEPRCMarkupType_Text, KEPRCMarkupType_Dimension, KEPRCMarkupType_Arrow, KEPRCMarkupType_Balloon, KEPRCMarkupType_CircleCenter, KEPRCMarkupType_Coordinate, KEPRCMarkupType_Datum, KEPRCMarkupType_Fastener, KEPRCMarkupType_Gdt, KEPRCMarkupType_Locator, KEPRCMarkupType_MeasurementPoint, KEPRCMarkupType_Roughness, KEPRCMarkupType_Welding, KEPRCMarkupType_Table, KEPRCMarkupType_Other }; enum EPRCMarkupSubType { KEPRCMarkupSubType_Unknown = 0, KEPRCMarkupSubType_EnumMax, KEPRCMarkupSubType_Datum_Ident = 1 , KEPRCMarkupSubType_Datum_EnumMax, KEPRCMarkupSubType_Dimension_Distance = 1, KEPRCMarkupSubType_Dimension_Radius_Tangent, KEPRCMarkupSubType_Dimension_Radius_Cylinder, KEPRCMarkupSubType_Dimension_Radius_Edge, KEPRCMarkupSubType_Dimension_Diameter, KEPRCMarkupSubType_Dimension_Diameter_Tangent, KEPRCMarkupSubType_Dimension_Diameter_Cylinder, KEPRCMarkupSubType_Dimension_Diameter_Edge, KEPRCMarkupSubType_Dimension_Diameter_Cone, KEPRCMarkupSubType_Dimension_Length, KEPRCMarkupSubType_Dimension_Length_Curvilinear, KEPRCMarkupSubType_Dimension_Length_Circular, KEPRCMarkupSubType_Dimension_Angle, KEPRCMarkupSubType_Dimension_EnumMax, KEPRCMarkupSubType_Gdt_Fcf = 1, KEPRCMarkupSubType_Gdt_EnumMax, KEPRCMarkupSubType_Welding_Line = 1, KEPRCMarkupSubType_Welding_EnumMax, KEPRCMarkupSubType_Other_Symbol_User = 1, KEPRCMarkupSubType_Other_EnumMax }; #define PRC_MARKUP_IsHidden 0x01 // The tessellation is hidden. #define PRC_MARKUP_HasFrame 0x02 // The tessellation has a frame. #define PRC_MARKUP_IsNotModifiable 0x04 // The tessellation is given and should not be modified. #define PRC_MARKUP_IsZoomable 0x08 // The tessellation has zoom capability. #define PRC_MARKUP_IsOnTop 0x10 // The tessellation is on top of the geometry. #define PRC_MARKUP_IsFlipable 0x20 // The text tessellation can be flipped to always be readable on screen. This value is currently unused. #define PRC_RENDERING_PARAMETER_SPECIAL_CULLING 0x0001 // special culling strategy to apply #define PRC_RENDERING_PARAMETER_FRONT_CULLING 0x0002 // apply front culling (ignored if no special culling strategy) #define PRC_RENDERING_PARAMETER_BACK_CULLING 0x0004 // apply back culling (ignored if no special culling strategy) #define PRC_RENDERING_PARAMETER_NO_LIGHT 0x0008 // if set, no light will apply on corresponding object #define PRC_MARKUP_IsMatrix 0x08000000 // Bit to denote that the current entity is a matrix. #define PRC_MARKUP_IsExtraData 0x04000000 // Bit to denote that the current entity is extra data (it is neither a matrix nor a polyline). #define PRC_MARKUP_IntegerMask 0xFFFFF // Integer mask to retrieve sizes. #define PRC_MARKUP_ExtraDataType 0x3E00000 // Mask to retrieve the integer type of the entity. #define PRC_MARKUP_ExtraDataType_Pattern (( 0<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_Picture (( 1<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_Triangles (( 2<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_Quads (( 3<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_FaceViewMode (( 6<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_FrameDrawMode (( 7<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_FixedSizeMode (( 8<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_Symbol (( 9<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_Cylinder ((10<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_Color ((11<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_LineStipple ((12<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_Font ((13<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_Text ((14<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_Points ((15<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_Polygon ((16<<21)|PRC_MARKUP_IsExtraData) #define PRC_MARKUP_ExtraDataType_LineWidth ((17<<21)|PRC_MARKUP_IsExtraData) enum EPRCCharSet { KEPRCCharsetUnknown = -1, KEPRCCharsetRoman = 0, KEPRCCharsetJapanese, KEPRCCharsetTraditionalChinese, KEPRCCharsetKorean, KEPRCCharsetArabic, KEPRCCharsetHebrew, KEPRCCharsetGreek, KEPRCCharsetCyrillic, KEPRCCharsetRightLeft, KEPRCCharsetDevanagari, KEPRCCharsetGurmukhi, KEPRCCharsetGujarati, KEPRCCharsetOriya, KEPRCCharsetBengali, KEPRCCharsetTamil, KEPRCCharsetTelugu, KEPRCCharsetKannada, KEPRCCharsetMalayalam, KEPRCCharsetSinhalese, KEPRCCharsetBurmese, KEPRCCharsetKhmer, KEPRCCharsetThai, KEPRCCharsetLaotian, KEPRCCharsetGeorgian, KEPRCCharsetArmenian, KEPRCCharsetSimplifiedChinese, KEPRCCharsetTibetan, KEPRCCharsetMongolian, KEPRCCharsetGeez, KEPRCCharsetEastEuropeanRoman, KEPRCCharsetVietnamese, KEPRCCharsetExtendedArabic }; #define PRC_Font_Bold 0x02 /*!< Bold. */ #define PRC_Font_Italic 0x04 /*!< Italic. */ #define PRC_Font_Underlined 0x08 /*!< Underlined. */ #define PRC_Font_StrikedOut 0x10 /*!< Striked-out. */ #define PRC_Font_Overlined 0x20 /*!< Overlined. */ #define PRC_Font_Streched 0x40 /*!< Streched. In case the font used is not the original font, it indicates that the text needs to be stretched to fit its bounding box. */ #define PRC_Font_Wired 0x80 /*!< Wired. Indicates that the original font is a wirefame font. */ #define PRC_Font_FixedWidth 0x100 /*!< Fixed width. Indicates that the original font is not proportional (each glyph has the same width). */ #define PRC_CONTEXT_OuterLoopFirst 0x0001 // Outer loops are always first loops (specific to PRC_TYPE_TOPO_BrepData). #define PRC_CONTEXT_NoClamp 0x0002 // UV curves are clamped on the surface (specific to PRC_TYPE_TOPO_BrepData). #define PRC_CONTEXT_NoSplit 0x0004 // Faces are split (specific to PRC_TYPE_TOPO_BrepData). #define PRC_BODY_BBOX_Evaluation 0x0001 // Bounding box based on geometry. #define PRC_BODY_BBOX_Precise 0x0002 // Bounding box based on tessellation. #define PRC_BODY_BBOX_CADData 0x0003 // Bounding box given by a CAD data file. #endif // __PRC_H asymptote-3.05/prc/writePRC.cc0000644000000000000000000020175015031566105014765 0ustar rootroot/************ * * This file is part of a tool for producing 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt and * Michail Vidiassov * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include "prc/writePRC.h" #include #include // debug print includes #include #include #include #include #if !defined(__GNUC__) || defined(__clang__) #include #endif using namespace std; #ifndef __GNUC_PREREQ #define __GNUC_PREREQ(maj, min) (0) #endif // Count leading zeros. uint32_t CLZ(uint32_t a) { #if __GNUC_PREREQ(3,4) return __builtin_clz(a); #else // find the log base 2 of a 32-bit integer static const int MultiplyDeBruijnBitPosition[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 }; a |= a >> 1; // first round down to one less than a power of 2 a |= a >> 2; a |= a >> 4; a |= a >> 8; a |= a >> 16; return 31-MultiplyDeBruijnBitPosition[(uint32_t)(a * 0x07C4ACDDU) >> 27]; #endif } // Portable integer implementation of ceil(log2(x)). uint32_t Log2(uint32_t x) { assert(x != 0); uint32_t L=31-CLZ(x); return ((uint32_t) 1 << L == x) ? L : L+1; } #define WriteUnsignedInteger( value ) pbs << (uint32_t)(value); #define WriteInteger( value ) pbs << (int32_t)(value); #define WriteCharacter( value ) pbs << (uint8_t)(value); #define WriteDouble( value ) pbs << (double)(value); #define WriteBit( value ) pbs << (bool)(value); #define WriteBoolean( value ) pbs << (bool)(value); #define WriteString( value ) pbs << (value); #define SerializeContentPRCBase serializeContentPRCBase(pbs); #define SerializeGraphics serializeGraphics(pbs); #define SerializePRCBaseWithGraphics { serializeContentPRCBase(pbs); serializeGraphics(pbs); } #define SerializeRepresentationItemContent serializeRepresentationItemContent(pbs); #define SerializeRepresentationItem( value ) (value)->serializeRepresentationItem(pbs); #define SerializeMarkup( value ) (value).serializeMarkup(pbs); #define SerializeReferenceUniqueIdentifier( value ) (value).serializeReferenceUniqueIdentifier(pbs); #define SerializeContentBaseTessData serializeContentBaseTessData(pbs); #define SerializeTessFace( value ) (value)->serializeTessFace(pbs); #define SerializeUserData UserData(0,0).write(pbs); #define SerializeLineAttr( value ) pbs << (uint32_t)((value)+1); #define SerializeVector3d( value ) (value).serializeVector3d(pbs); #define SerializeVector2d( value ) (value).serializeVector2d(pbs); #define SerializeName( value ) writeName(pbs, (value)); #define SerializeInterval( value ) (value).serializeInterval(pbs); // #define SerializeBoundingBox( value ) (value).serializeBoundingBox(pbs); #define SerializeDomain( value ) (value).serializeDomain(pbs); #define SerializeParameterization serializeParameterization(pbs); #define SerializeUVParameterization serializeUVParameterization(pbs); #define SerializeTransformation serializeTransformation(pbs); #define SerializeBaseTopology serializeBaseTopology(pbs); #define SerializeBaseGeometry serializeBaseGeometry(pbs); #define SerializePtrCurve( value ) {WriteBoolean( false ); if((value)==NULL) pbs << (uint32_t)PRC_TYPE_ROOT; else (value)->serializeCurve(pbs);} #define SerializePtrSurface( value ) {WriteBoolean( false ); if((value)==NULL) pbs << (uint32_t)PRC_TYPE_ROOT; else (value)->serializeSurface(pbs);} #define SerializePtrTopology( value ) {WriteBoolean( false ); if((value)==NULL) pbs << (uint32_t)PRC_TYPE_ROOT; else (value)->serializeTopoItem(pbs);} #define SerializeContentCurve serializeContentCurve(pbs); #define SerializeContentWireEdge serializeContentWireEdge(pbs); #define SerializeContentBody serializeContentBody(pbs); #define SerializeTopoContext serializeTopoContext(pbs); #define SerializeContextAndBodies( value ) (value).serializeContextAndBodies(pbs); #define SerializeBody( value ) (value)->serializeBody(pbs); #define ResetCurrentGraphics resetGraphics(); #define SerializeContentSurface serializeContentSurface(pbs); #define SerializeCompressedUniqueId( value ) (value).serializeCompressedUniqueId(pbs); #define SerializeUnit( value ) (value).serializeUnit(pbs); #define SerializeBoundingBox serializeBoundingBox(pbs); #define SerializeAttributeEntry serializeAttributeEntry(pbs); #define SerializeContentSingleAttribute( value ) (value).serializeSingleAttribute(pbs); #define SerializeAttribute( value ) (value).serializeAttribute(pbs); #define SerializeAttributeData serializeAttributes(pbs); #define WriteUncompressedUnsignedInteger( value ) writeUncompressedUnsignedInteger(out, (uint32_t)(value)); #define SerializeFileStructureUncompressedUniqueId( value ) (value).serializeFileStructureUncompressedUniqueId(out); void writeUncompressedUnsignedInteger(ostream &out, uint32_t data) { #ifdef WORDS_BIGENDIAN out.write(((char*)&data)+3,1); out.write(((char*)&data)+2,1); out.write(((char*)&data)+1,1); out.write(((char*)&data)+0,1); #else out.write(((char*)&data)+0,1); out.write(((char*)&data)+1,1); out.write(((char*)&data)+2,1); out.write(((char*)&data)+3,1); #endif } double PRCVector3d::Length() { return sqrt(x*x+y*y+z*z); } bool PRCVector3d::Normalize() { double fLength=Length(); if(fLength < FLT_EPSILON) return false; double factor=1.0/fLength; x *= factor; y *= factor; z *= factor; return true; } double PRCVector2d::Length() { return sqrt(x*x+y*y); } bool PRCVector2d::Normalize() { double fLength=Length(); if(fLength < FLT_EPSILON) return false; double factor=1.0/fLength; x *= factor; y *= factor; return true; } void PRCVector2d::serializeVector2d(PRCbitStream &pbs) { WriteDouble (x) WriteDouble (y) } uint32_t makeCADID() { static uint32_t ID = 1; return ID++; } uint32_t makePRCID() { static uint32_t ID = 1; return ID++; } bool type_eligible_for_reference(uint32_t type) { if( type == PRC_TYPE_MISC_EntityReference || type == PRC_TYPE_MISC_MarkupLinkedItem || type == PRC_TYPE_RI_BrepModel || type == PRC_TYPE_RI_Curve || type == PRC_TYPE_RI_Direction || type == PRC_TYPE_RI_Plane || type == PRC_TYPE_RI_PointSet || type == PRC_TYPE_RI_PolyBrepModel || type == PRC_TYPE_RI_PolyWire || type == PRC_TYPE_RI_Set || type == PRC_TYPE_RI_CoordinateSystem || type == PRC_TYPE_ASM_ProductOccurence || type == PRC_TYPE_ASM_PartDefinition || type == PRC_TYPE_ASM_Filter || type == PRC_TYPE_MKP_View || type == PRC_TYPE_MKP_Markup || type == PRC_TYPE_MKP_Leader || type == PRC_TYPE_MKP_AnnotationItem || type == PRC_TYPE_MKP_AnnotationSet || type == PRC_TYPE_MKP_AnnotationReference || type == PRC_TYPE_GRAPH_Style || type == PRC_TYPE_GRAPH_Material || type == PRC_TYPE_GRAPH_TextureApplication || type == PRC_TYPE_GRAPH_TextureDefinition || type == PRC_TYPE_GRAPH_LinePattern || type == PRC_TYPE_GRAPH_DottingPattern || type == PRC_TYPE_GRAPH_HatchingPattern || type == PRC_TYPE_GRAPH_SolidPattern || type == PRC_TYPE_GRAPH_VPicturePattern || type == PRC_TYPE_GRAPH_AmbientLight || type == PRC_TYPE_GRAPH_PointLight || type == PRC_TYPE_GRAPH_DirectionalLight || type == PRC_TYPE_GRAPH_SpotLight || type == PRC_TYPE_GRAPH_SceneDisplayParameters || type == PRC_TYPE_GRAPH_Camera ) return true; else return false; } void UserData::write(PRCbitStream &pbs) { pbs << size; if(size > 0) { uint32_t quot=size/8; uint32_t rem=size-8*quot; for(uint32_t i = 0; i < quot; ++i) pbs << data[i]; for(uint32_t j = 0; j < rem; ++j) // 0-based, big endian bit counting pbs << (bool)((data[quot] & (0x80 >> j))!=0); } } void PRCAttributeEntry::serializeAttributeEntry(PRCbitStream &pbs) const { WriteBoolean (title_is_integer) if (title_is_integer) WriteUnsignedInteger (title_integer) else WriteString (title_text) } void PRCSingleAttribute::serializeSingleAttribute(PRCbitStream &pbs) const { SerializeAttributeEntry WriteUnsignedInteger (type) switch (type) { case KEPRCModellerAttributeTypeInt: WriteInteger (value.integer) break; case KEPRCModellerAttributeTypeReal: WriteDouble (value.real) break; case KEPRCModellerAttributeTypeTime: WriteUnsignedInteger (value.time) break; case KEPRCModellerAttributeTypeString: WriteString (value_text) break; default: break; } } void PRCAttribute::serializeAttribute(PRCbitStream &pbs) const { WriteUnsignedInteger (PRC_TYPE_MISC_Attribute) SerializeAttributeEntry const uint32_t size_of_attribute_keys = attribute_keys.size(); WriteUnsignedInteger (size_of_attribute_keys) for(uint32_t i=0;i 1) WriteInteger (texture_wrapping_mode_T) // Texture wrapping mode if (texture_dimension > 2 ) WriteInteger (texture_wrapping_mode_R) // Texture wrapping mode WriteBit (texture_transformation) // if (texture_transformation) // SerializeTextureTransformation (texture_transformation) } void PRCMaterialGeneric::serializeMaterialGeneric(PRCbitStream &pbs) { WriteUnsignedInteger (PRC_TYPE_GRAPH_Material) SerializeContentPRCBase WriteUnsignedInteger (ambient + 1) WriteUnsignedInteger (diffuse + 1) WriteUnsignedInteger (emissive + 1) WriteUnsignedInteger (specular + 1) WriteDouble (shininess) WriteDouble (ambient_alpha) WriteDouble (diffuse_alpha) WriteDouble (emissive_alpha) WriteDouble (specular_alpha) } void PRCTextureApplication::serializeTextureApplication(PRCbitStream &pbs) { WriteUnsignedInteger (PRC_TYPE_GRAPH_TextureApplication) SerializeContentPRCBase WriteUnsignedInteger (material_generic_index+1) WriteUnsignedInteger (texture_definition_index+1) WriteUnsignedInteger (next_texture_index+1) WriteUnsignedInteger (UV_coordinates_index+1) } void PRCLinePattern::serializeLinePattern(PRCbitStream &pbs) { uint32_t i = 0; WriteUnsignedInteger (PRC_TYPE_GRAPH_LinePattern) SerializeContentPRCBase const uint32_t size_lengths = lengths.size(); WriteUnsignedInteger (size_lengths) for (i=0;i>8)&0xFF); current_layer_index = l; current_index_of_line_style = i; current_behaviour_bit_field = b; } else pbs << true; } void writeGraphics(PRCbitStream &pbs,const PRCGraphics &graphics,bool force) { if(force || current_layer_index != graphics.layer_index || current_index_of_line_style != graphics.index_of_line_style || current_behaviour_bit_field != graphics.behaviour_bit_field) { pbs << false << (uint32_t)(graphics.layer_index+1) << (uint32_t)(graphics.index_of_line_style+1) << (uint8_t)(graphics.behaviour_bit_field&0xFF) << (uint8_t)((graphics.behaviour_bit_field>>8)&0xFF); current_layer_index = graphics.layer_index; current_index_of_line_style = graphics.index_of_line_style; current_behaviour_bit_field = graphics.behaviour_bit_field; } else pbs << true; } void PRCGraphics::serializeGraphics(PRCbitStream &pbs) { if(current_layer_index != this->layer_index || current_index_of_line_style != this->index_of_line_style || current_behaviour_bit_field != this->behaviour_bit_field) { pbs << false << (uint32_t)(this->layer_index+1) << (uint32_t)(this->index_of_line_style+1) << (uint8_t)(this->behaviour_bit_field&0xFF) << (uint8_t)((this->behaviour_bit_field>>8)&0xFF); current_layer_index = this->layer_index; current_index_of_line_style = this->index_of_line_style; current_behaviour_bit_field = this->behaviour_bit_field; } else pbs << true; } void PRCGraphics::serializeGraphicsForced(PRCbitStream &pbs) { pbs << false << (uint32_t)(this->layer_index+1) << (uint32_t)(this->index_of_line_style+1) << (uint8_t)(this->behaviour_bit_field&0xFF) << (uint8_t)((this->behaviour_bit_field>>8)&0xFF); current_layer_index = this->layer_index; current_index_of_line_style = this->index_of_line_style; current_behaviour_bit_field = this->behaviour_bit_field; } void resetGraphics() { current_layer_index = m1; current_index_of_line_style = m1; current_behaviour_bit_field = 1; } void resetGraphicsAndName() { resetGraphics(); resetName(); } void PRCMarkup::serializeMarkup(PRCbitStream &pbs) { WriteUnsignedInteger (PRC_TYPE_MKP_Markup) SerializeContentPRCBase SerializeGraphics WriteUnsignedInteger (type) WriteUnsignedInteger (sub_type) const uint32_t number_of_linked_items = 0; WriteUnsignedInteger (number_of_linked_items) // for (i=0;iserializeTransformation3d(pbs); SerializeUserData } void PRCFontKeysSameFont::serializeFontKeysSameFont(PRCbitStream &pbs) { uint32_t i=0; // universal index for PRC standart compatibility WriteString (font_name) WriteUnsignedInteger (char_set) const uint32_t number_of_font_keys = font_keys.size(); WriteUnsignedInteger (number_of_font_keys) for (i=0;i &rgba_vertices,const bool is_rgba, PRCbitStream &pbs) { uint32_t i = 0; uint32_t j = 0; // number_by_vector can be assigned a value of 3 (RGB) or 4 (RGBA). // number_of_vectors is equal to number_of_colors / number_by_vector. const uint32_t number_by_vector=is_rgba?4:3; const std::vector &vector_color = rgba_vertices; const uint32_t number_of_colors=vector_color.size(); const uint32_t number_of_vectors=number_of_colors / number_by_vector; // first one for (i=0;i= 1u<<(bit_number - 1 - i) ) { WriteBoolean (true) value -= 1u<<(bit_number - 1 - i); } else { WriteBoolean (false) } } } #define WriteUnsignedIntegerWithVariableBitNumber( value, bit_number ) writeUnsignedIntegerWithVariableBitNumber( pbs, (value), (bit_number) ); void writeIntegerWithVariableBitNumber(PRCbitStream &pbs, int32_t iValue, uint32_t uBitNumber) { WriteBoolean(iValue<0); WriteUnsignedIntegerWithVariableBitNumber(abs(iValue), uBitNumber - 1); } #define WriteIntegerWithVariableBitNumber( value, bit_number ) writeIntegerWithVariableBitNumber( pbs, (value), (bit_number) ); void writeDoubleWithVariableBitNumber(PRCbitStream &pbs, double dValue,double dTolerance, unsigned uBitNumber) { // calling functions must ensure no overflow int32_t iTempValue = (int32_t) ( dValue / dTolerance ); WriteIntegerWithVariableBitNumber(iTempValue, uBitNumber); } #define WriteDoubleWithVariableBitNumber( value, bit_number ) writeDoubleWithVariableBitNumber( pbs, (value), (bit_number) ); uint32_t GetNumberOfBitsUsedToStoreUnsignedInteger(uint32_t uValue) { uint32_t uNbBit=2; uint32_t uTemp = 2; while(uValue >= uTemp) { uTemp*=2; uNbBit++; } return uNbBit-1; } void writeNumberOfBitsThenUnsignedInteger(PRCbitStream &pbs, uint32_t unsigned_integer) { uint32_t number_of_bits = GetNumberOfBitsUsedToStoreUnsignedInteger( unsigned_integer ); WriteUnsignedIntegerWithVariableBitNumber ( number_of_bits, 5 ) WriteUnsignedIntegerWithVariableBitNumber ( unsigned_integer, number_of_bits ) } #define WriteNumberOfBitsThenUnsignedInteger( value ) writeNumberOfBitsThenUnsignedInteger( pbs, value ); uint32_t GetNumberOfBitsUsedToStoreInteger(int32_t iValue) { return GetNumberOfBitsUsedToStoreUnsignedInteger(abs(iValue))+1; } int32_t intdiv(double dValue, double dTolerance) { double ratio=fabs(dValue)/dTolerance; assert(ratio <= INT_MAX); int32_t iTempValue=(int32_t) ratio; if(ratio - iTempValue >= 0.5) iTempValue++; if(dValue < 0) return -iTempValue; else return iTempValue; } // round dValue to nearest multiple of dTolerance double roundto(double dValue, double dTolerance) { return intdiv(dValue, dTolerance) * dTolerance; } PRCVector3d roundto(PRCVector3d vec, double dTolerance) { PRCVector3d res; res.x = roundto(vec.x,dTolerance); res.y = roundto(vec.y,dTolerance); res.z = roundto(vec.z,dTolerance); return res; } uint32_t GetNumberOfBitsUsedToStoreDouble(double dValue, double dTolerance ) { return GetNumberOfBitsUsedToStoreInteger(intdiv(dValue,dTolerance)); } struct itriple { int32_t x; int32_t y; int32_t z; }; uint32_t GetNumberOfBitsUsedToStoreTripleInteger(const itriple &iTriple) { const uint32_t x_bits = GetNumberOfBitsUsedToStoreInteger(iTriple.x); const uint32_t y_bits = GetNumberOfBitsUsedToStoreInteger(iTriple.y); const uint32_t z_bits = GetNumberOfBitsUsedToStoreInteger(iTriple.z); uint32_t bits = x_bits; if(y_bits > bits) bits = y_bits; if(z_bits > bits) bits = z_bits; return bits; } itriple iroundto(PRCVector3d vec, double dTolerance) { itriple res; res.x = intdiv(vec.x, dTolerance); res.y = intdiv(vec.y, dTolerance); res.z = intdiv(vec.z, dTolerance); return res; } void PRCCompressedFace::serializeCompressedFace(PRCbitStream &pbs, double brep_data_compressed_tolerance) { serializeCompressedAnaNurbs( pbs, brep_data_compressed_tolerance ); } #define SerializeCompressedFace( value ) (value)->serializeCompressedFace( pbs, brep_data_compressed_tolerance ); void PRCCompressedFace::serializeContentCompressedFace(PRCbitStream &pbs) { WriteBoolean ( orientation_surface_with_shell ) const bool surface_is_trimmed = false; WriteBoolean ( surface_is_trimmed ) } void PRCCompressedFace::serializeCompressedAnaNurbs(PRCbitStream &pbs, double brep_data_compressed_tolerance) { // WriteCompressedEntityType ( PRC_HCG_AnaNurbs ) const bool is_a_curve = false; WriteBoolean ( is_a_curve ) WriteUnsignedIntegerWithVariableBitNumber (13 , 4) serializeContentCompressedFace( pbs ); serializeCompressedNurbs( pbs, brep_data_compressed_tolerance ); } void PRCCompressedFace::serializeCompressedNurbs(PRCbitStream &pbs, double brep_data_compressed_tolerance) { const double nurbs_tolerance = 0.2*brep_data_compressed_tolerance; const uint32_t degree_in_u = degree; const uint32_t degree_in_v = degree; WriteUnsignedIntegerWithVariableBitNumber ( degree_in_u, 5) WriteUnsignedIntegerWithVariableBitNumber ( degree_in_v, 5) const uint32_t number_of_knots_in_u = 4; // 0011 or 00001111 knot vector - just 2 spans WriteUnsignedIntegerWithVariableBitNumber (number_of_knots_in_u - 2, 16) uint32_t number_bit = degree_in_u ? Log2( degree_in_u + 2 ) : 2; WriteBoolean (false) // Multiplicity_is_already_stored - no WriteUnsignedIntegerWithVariableBitNumber( degree_in_u+1,number_bit) WriteBoolean (true) // Multiplicity_is_already_stored - yes const uint32_t number_of_knots_in_v = 4; // 0011 or 00001111 knot vector - just 2 spans WriteUnsignedIntegerWithVariableBitNumber (number_of_knots_in_v - 2, 16) number_bit = degree_in_v ? Log2( degree_in_v + 2 ) : 2; WriteBoolean (false) // Multiplicity_is_already_stored - no WriteUnsignedIntegerWithVariableBitNumber( degree_in_v+1,number_bit) WriteBoolean (true) // Multiplicity_is_already_stored - yes const bool is_closed_u = false; WriteBoolean ( is_closed_u ) const bool is_closed_v = false; WriteBoolean ( is_closed_v ) const uint32_t number_of_control_point_in_u = degree_in_u + 1; const uint32_t number_of_control_point_in_v = degree_in_v + 1; #if defined(__GNUC__) && !defined(__clang__) PRCVector3d P[number_of_control_point_in_u][number_of_control_point_in_v]; #else vector > P(number_of_control_point_in_u, vector(number_of_control_point_in_v)); #endif for(uint32_t i=0;i > compressed_control_point(number_of_control_point_in_u, vector(number_of_control_point_in_v)); vector > control_point_type(number_of_control_point_in_u, vector(number_of_control_point_in_v)); #endif uint32_t number_of_bits_for_isomin = 1; uint32_t number_of_bits_for_rest = 1; for(uint32_t j = 1; j < number_of_control_point_in_v; j++) { compressed_control_point[0][j] = iroundto(P[0][j]-P[0][j-1], nurbs_tolerance ); P[0][j] = P[0][j-1] + roundto(P[0][j]-P[0][j-1], nurbs_tolerance); uint32_t bit_size = GetNumberOfBitsUsedToStoreTripleInteger(compressed_control_point[0][j]); if (bit_size > number_of_bits_for_isomin) number_of_bits_for_isomin = bit_size; } for(uint32_t i = 1; i < number_of_control_point_in_u; i++) { compressed_control_point[i][0] = iroundto(P[i][0]-P[i-1][0], nurbs_tolerance ); P[i][0] = P[i-1][0] + roundto(P[i][0]-P[i-1][0], nurbs_tolerance); uint32_t bit_size = GetNumberOfBitsUsedToStoreTripleInteger(compressed_control_point[i][0]); if (bit_size > number_of_bits_for_isomin) number_of_bits_for_isomin = bit_size; } for(uint32_t i=1;i number_of_bits_for_rest) number_of_bits_for_rest = bit_size; } if( number_of_bits_for_rest == 2 ) number_of_bits_for_rest--; // really I think it must be unconditional, but so it seems to be done in Adobe Acrobat (9.3) WriteUnsignedIntegerWithVariableBitNumber ( number_of_bits_for_isomin, 20 ) WriteUnsignedIntegerWithVariableBitNumber ( number_of_bits_for_rest, 20 ) WriteDouble ( P[0][0].x ) WriteDouble ( P[0][0].y ) WriteDouble ( P[0][0].z ) for(uint32_t j = 1; j < number_of_control_point_in_v; j++) { WriteIntegerWithVariableBitNumber(compressed_control_point[0][j].x, number_of_bits_for_isomin+1) WriteIntegerWithVariableBitNumber(compressed_control_point[0][j].y, number_of_bits_for_isomin+1) WriteIntegerWithVariableBitNumber(compressed_control_point[0][j].z, number_of_bits_for_isomin+1) } for(uint32_t i = 1; i < number_of_control_point_in_u; i++) { WriteIntegerWithVariableBitNumber(compressed_control_point[i][0].x, number_of_bits_for_isomin+1) WriteIntegerWithVariableBitNumber(compressed_control_point[i][0].y, number_of_bits_for_isomin+1) WriteIntegerWithVariableBitNumber(compressed_control_point[i][0].z, number_of_bits_for_isomin+1) } for(uint32_t i = 1; i < number_of_control_point_in_u; i++) { for(uint32_t j = 1; j < number_of_control_point_in_v; j++) { WriteUnsignedIntegerWithVariableBitNumber ( control_point_type[i][j], 2 ) if(control_point_type[i][j] == 1) { WriteIntegerWithVariableBitNumber ( compressed_control_point[i][j].z, number_of_bits_for_rest+1 ) } else if(control_point_type[i][j] == 2) { WriteIntegerWithVariableBitNumber ( compressed_control_point[i][j].x, number_of_bits_for_rest+1 ) WriteIntegerWithVariableBitNumber ( compressed_control_point[i][j].y, number_of_bits_for_rest+1 ) } else if(control_point_type[i][j] == 3) { WriteIntegerWithVariableBitNumber ( compressed_control_point[i][j].x, number_of_bits_for_rest+1 ) WriteIntegerWithVariableBitNumber ( compressed_control_point[i][j].y, number_of_bits_for_rest+1 ) WriteIntegerWithVariableBitNumber ( compressed_control_point[i][j].z, number_of_bits_for_rest+1 ) } } } const uint32_t type_param_u = 0; WriteBoolean( type_param_u == 0 ) const uint32_t type_param_v = 0; WriteBoolean( type_param_v == 0 ) const bool is_rational = false; WriteBoolean( is_rational ) } void PRCCompressedBrepData::serializeCompressedShell(PRCbitStream &pbs) { uint32_t i; const uint32_t number_of_face = face.size(); WriteBoolean ( number_of_face == 1 ) if( number_of_face != 1 ) WriteNumberOfBitsThenUnsignedInteger (number_of_face) for( i=0; i < number_of_face; i++) SerializeCompressedFace ( face[i] ) const bool is_an_iso_face = false; for( i=0; i < number_of_face; i++) WriteBoolean ( is_an_iso_face ) } void PRCCompressedBrepData::serializeCompressedBrepData(PRCbitStream &pbs) { WriteUnsignedInteger ( PRC_TYPE_TOPO_BrepDataCompress ) SerializeContentBody WriteDouble ( brep_data_compressed_tolerance ) const uint32_t number_of_bits_to_store_reference = 1; WriteNumberOfBitsThenUnsignedInteger ( number_of_bits_to_store_reference ) const uint32_t number_vertex_iso = 0; WriteUnsignedIntegerWithVariableBitNumber ( number_vertex_iso, number_of_bits_to_store_reference ) const uint32_t number_edge_iso = 0; WriteUnsignedIntegerWithVariableBitNumber ( number_edge_iso, number_of_bits_to_store_reference ) const uint32_t number_of_shell = 1; const uint32_t number_of_connex = 1; WriteBoolean ( number_of_shell == 1 && number_of_connex == 1 ) serializeCompressedShell( pbs ); uint32_t i; const uint32_t number_of_faces = face.size(); for(i=0; i< number_of_faces; i++) face[i]->serializeBaseTopology( pbs ); } void PRCBlend01::serializeBlend01(PRCbitStream &pbs) { WriteUnsignedInteger (PRC_TYPE_SURF_Blend01) SerializeContentSurface SerializeTransformation SerializeUVParameterization SerializePtrCurve ( center_curve ) SerializePtrCurve ( origin_curve ) SerializePtrCurve ( tangent_curve ) } void PRCRuled::serializeRuled(PRCbitStream &pbs) { WriteUnsignedInteger (PRC_TYPE_SURF_Ruled) SerializeContentSurface SerializeTransformation SerializeUVParameterization SerializePtrCurve ( first_curve ) SerializePtrCurve ( second_curve ) } void PRCSphere::serializeSphere(PRCbitStream &pbs) { WriteUnsignedInteger (PRC_TYPE_SURF_Sphere) SerializeContentSurface SerializeTransformation SerializeUVParameterization WriteDouble ( radius ) } void PRCCone::serializeCone(PRCbitStream &pbs) { WriteUnsignedInteger (PRC_TYPE_SURF_Cone) SerializeContentSurface SerializeTransformation SerializeUVParameterization WriteDouble ( bottom_radius ) WriteDouble ( semi_angle ) } void PRCCylinder::serializeCylinder(PRCbitStream &pbs) { WriteUnsignedInteger (PRC_TYPE_SURF_Cylinder) SerializeContentSurface SerializeTransformation SerializeUVParameterization WriteDouble ( radius ) } void PRCTorus::serializeTorus(PRCbitStream &pbs) { WriteUnsignedInteger (PRC_TYPE_SURF_Torus) SerializeContentSurface SerializeTransformation SerializeUVParameterization WriteDouble ( major_radius ) WriteDouble ( minor_radius ) } void PRCFace::serializeFace(PRCbitStream &pbs) { uint32_t i = 0; WriteUnsignedInteger (PRC_TYPE_TOPO_Face) SerializeBaseTopology SerializePtrSurface ( base_surface ) WriteBit ( have_surface_trim_domain ) if ( have_surface_trim_domain ) SerializeDomain ( surface_trim_domain ) WriteBit ( have_tolerance ) if ( have_tolerance ) WriteDouble ( tolerance ) WriteUnsignedInteger ( number_of_loop ) WriteInteger ( outer_loop_index ) for (i=0;iserialType() ) if ( IsCompressedType(body[i]->serialType()) ) { WriteDouble ( body[i]->serialTolerance() ) } } } void PRCTopoContext::serializeContextGraphics(PRCbitStream &pbs) { uint32_t i=0, j=0, k=0, l=0; ResetCurrentGraphics uint32_t number_of_body = body.size(); PRCGraphicsList element; bool has_graphics = false; for (i=0;itopo_item_type == PRC_TYPE_TOPO_BrepData && dynamic_cast(body[i])) { PRCBrepData *body_i = dynamic_cast(body[i]); for (j=0;jconnex.size();j++) { for(k=0;kconnex[j]->shell.size();k++) { for( l=0;lconnex[j]->shell[k]->face.size();l++) { element.push_back( body_i->connex[j]->shell[k]->face[l] ); has_graphics = has_graphics || body_i->connex[j]->shell[k]->face[l]->has_graphics(); } } } } else if ( body[i]->topo_item_type == PRC_TYPE_TOPO_BrepDataCompress && dynamic_cast(body[i])) { PRCCompressedBrepData *body_i = dynamic_cast(body[i]); for( l=0;lface.size();l++) { element.push_back( body_i->face[l] ); has_graphics = has_graphics || body_i->face[l]->has_graphics(); } } } uint32_t number_of_treat_type = 0; if (has_graphics && !element.empty()) number_of_treat_type = 1; WriteUnsignedInteger (number_of_treat_type) for (i=0;ihas_graphics() ) if (element[j]->has_graphics()) { element[j]->serializeGraphics(pbs); } } } } uint32_t PRCTopoContext::addSingleWireBody(PRCSingleWireBody*& pSingleWireBody) { body.push_back(pSingleWireBody); pSingleWireBody = NULL; return body.size()-1; } uint32_t PRCTopoContext::addBrepData(PRCBrepData*& pBrepData) { body.push_back(pBrepData); pBrepData = NULL; return body.size()-1; } uint32_t PRCTopoContext::addCompressedBrepData(PRCCompressedBrepData*& pCompressedBrepData) { body.push_back(pCompressedBrepData); pCompressedBrepData = NULL; return body.size()-1; } void PRCSingleWireBody::serializeSingleWireBody(PRCbitStream &pbs) { WriteUnsignedInteger ( PRC_TYPE_TOPO_SingleWireBody) SerializeContentBody SerializePtrTopology ( wire_edge ) } void PRCUniqueId::serializeCompressedUniqueId(PRCbitStream &pbs) const { WriteUnsignedInteger (id0) WriteUnsignedInteger (id1) WriteUnsignedInteger (id2) WriteUnsignedInteger (id3) } void PRCUniqueId::serializeFileStructureUncompressedUniqueId(std::ostream& out) const { WriteUncompressedUnsignedInteger (id0) WriteUncompressedUnsignedInteger (id1) WriteUncompressedUnsignedInteger (id2) WriteUncompressedUnsignedInteger (id3) } void PRCUnit::serializeUnit(PRCbitStream &pbs) { WriteBoolean (unit_from_CAD_file) WriteDouble (unit) } void PRCProductOccurrence::serializeProductOccurrence(PRCbitStream &pbs) { WriteUnsignedInteger ( PRC_TYPE_ASM_ProductOccurence ) SerializePRCBaseWithGraphics // SerializeReferencesOfProductOccurrence WriteUnsignedInteger (index_part+1) WriteUnsignedInteger (index_prototype+1) if (index_prototype != m1) { WriteBoolean (prototype_in_same_file_structure) if (!prototype_in_same_file_structure) SerializeCompressedUniqueId (prototype_file_structure) } WriteUnsignedInteger(index_external_data+1) if (index_external_data != m1) { WriteBoolean (external_data_in_same_file_structure) if (!external_data_in_same_file_structure) SerializeCompressedUniqueId (external_data_file_structure) } const uint32_t number_of_son_product_occurrences = index_son_occurrence.size(); WriteUnsignedInteger (number_of_son_product_occurrences) for (uint32_t i=0;iserializeTransformation3d (pbs); WriteUnsignedInteger (0) // number_of_references // SerializeMarkups (markups) WriteUnsignedInteger (0) // number_of_linked_items WriteUnsignedInteger (0) // number_of_leaders WriteUnsignedInteger (0) // number_of_markups WriteUnsignedInteger (0) // number_of_annotation_entities WriteUnsignedInteger (0) // number_of_views WriteBit (false) // has_entity_filter WriteUnsignedInteger (0) // number_of_display_filters WriteUnsignedInteger (0) // number_of_scene_display_parameters SerializeUserData } uint32_t PRCPartDefinition::addBrepModel(PRCBrepModel*& pBrepModel) { representation_item.push_back(pBrepModel); pBrepModel = NULL; return representation_item.size()-1; } uint32_t PRCPartDefinition::addPolyBrepModel(PRCPolyBrepModel*& pPolyBrepModel) { representation_item.push_back(pPolyBrepModel); pPolyBrepModel = NULL; return representation_item.size()-1; } uint32_t PRCPartDefinition::addPointSet(PRCPointSet*& pPointSet) { representation_item.push_back(pPointSet); pPointSet = NULL; return representation_item.size()-1; } uint32_t PRCPartDefinition::addSet(PRCSet*& pSet) { representation_item.push_back(pSet); pSet = NULL; return representation_item.size()-1; } uint32_t PRCPartDefinition::addWire(PRCWire*& pWire) { representation_item.push_back(pWire); pWire = NULL; return representation_item.size()-1; } uint32_t PRCPartDefinition::addPolyWire(PRCPolyWire*& pPolyWire) { representation_item.push_back(pPolyWire); pPolyWire = NULL; return representation_item.size()-1; } uint32_t PRCPartDefinition::addRepresentationItem(PRCRepresentationItem*& pRepresentationItem) { representation_item.push_back(pRepresentationItem); pRepresentationItem = NULL; return representation_item.size()-1; } void PRCPartDefinition::serializePartDefinition(PRCbitStream &pbs) { WriteUnsignedInteger ( PRC_TYPE_ASM_PartDefinition ) SerializePRCBaseWithGraphics SerializeBoundingBox uint32_t number_of_representation_items = representation_item.size(); WriteUnsignedInteger (number_of_representation_items) for (uint32_t i=0;i * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #ifndef __DESCRIBE_PRC_H #define __DESCRIBE_PRC_H #include "iPRCFile.h" #include "bitData.h" void describeGlobals(BitByBitData&); void describeTree(BitByBitData&); void describeTessellation(BitByBitData&); void describeGeometry(BitByBitData&); void describeExtraGeometry(BitByBitData&); void describeModelFileData(BitByBitData&,unsigned int); void describePicture(BitByBitData&); void describeTextureDefinition(BitByBitData&); void describeMaterial(BitByBitData&); void describeLinePattern(BitByBitData&); void describeCategory1LineStyle(BitByBitData&); void describeFillPattern(BitByBitData&); void describeRepresentationItem(BitByBitData&); //void describe(BitByBitData&); void describeLight(BitByBitData&); void describeCamera(BitByBitData&); bool describeContentCurve(BitByBitData&); void describeCurvCircle(BitByBitData&); void describeCurvLine(BitByBitData&); void describeCurvNURBS(BitByBitData&); void describeCurvPolyLine(BitByBitData&); void describeContentWireEdge(BitByBitData&); bool isCompressedSerialType(unsigned int); void describeUVParametrization(BitByBitData&); void describeSurfNURBS(BitByBitData&); void describeSurfCylinder(BitByBitData&); void describeSurfPlane(BitByBitData&); void describeTopoFace(BitByBitData&); void describeTopoLoop(BitByBitData&); void describeTopoCoEdge(BitByBitData&); void describeTopoEdge(BitByBitData&); void describeTopoConnex(BitByBitData&); void describeTopoShell(BitByBitData&); void describeObject(BitByBitData&); void describeBaseTopology(BitByBitData&); void describeBaseGeometry(BitByBitData&); unsigned int describeContentBody(BitByBitData&); void describeContentSurface(BitByBitData&); void describeBody(BitByBitData&); void describeTopoContext(BitByBitData&); void describeLineAttr(BitByBitData&); void describeArrayRGBA(BitByBitData&,int,int); void describeContentBaseTessData(BitByBitData&); void describeTessFace(BitByBitData&); void describe3DTess(BitByBitData&); void describe3DWireTess(BitByBitData&); void describe3DMarkupTess(BitByBitData&); void describeHighlyCompressed3DTess(BitByBitData&); void describeSceneDisplayParameters(BitByBitData&); void describeCartesionTransformation3d(BitByBitData&); void describeTransformation3d(BitByBitData&); void describeTransformation2d(BitByBitData&); void describeFileStructureInternalData(BitByBitData&); void describeProductOccurrence(BitByBitData&); void describeRepresentationItemContent(BitByBitData&); void describeMarkups(BitByBitData&); void describeAnnotationView(BitByBitData&); void describeExtent3d(BitByBitData&); void describeExtent2d(BitByBitData&); void describeExtent1d(BitByBitData&); void describeVector3d(BitByBitData&); void describeVector2d(BitByBitData&); void describeContentPRCBaseWithGraphics(BitByBitData&,bool); void describeGraphics(BitByBitData&); void describePartDefinition(BitByBitData&); void describeRGBColour(BitByBitData&); void describeSchema(BitByBitData&); void describeName(BitByBitData&); void describeAttributes(BitByBitData&); void describeContentPRCBase(BitByBitData&,bool); void describeUnit(BitByBitData&); void describeCompressedUniqueID(BitByBitData&); void describeUserData(BitByBitData&); extern std::string currentName; extern int layer_index; extern int index_of_line_style; extern unsigned short behaviour_bit_field; void unFlushSerialization(); void resetCurrentGraphics(); bool checkSectionCode(BitByBitData&,unsigned int); std::string getIndent(); void indent(); void dedent(); #endif // __DESCRIBE_PRC_H asymptote-3.05/prc/PRCTools/describeMain.cc0000644000000000000000000000233515031566105017316 0ustar rootroot/************ * * This file is part of a tool for reading 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include #include #include "iPRCFile.h" using namespace std; int main(int argc, char* argv[]) { if(argc < 2) { cerr << "Error: Input file not specified." << endl; return 1; } ifstream inFile(argv[1]); if(!inFile) { cerr << "Error: Cannot open input file." << endl; return 1; } iPRCFile myFile(inFile); myFile.describe(); return 0; } asymptote-3.05/prc/PRCTools/bitData.cc0000644000000000000000000001363515031566105016306 0ustar rootroot/************ * * This file is part of a tool for reading 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include "bitData.h" #include "../include/prc/PRC.h" #include "../include/prc/PRCdouble.h" using std::cout; using std::endl; using std::hex; using std::cerr; BitPosition BitByBitData::getPosition() { BitPosition bp; bp.byteIndex = data - start; bp.bitIndex = 0; for(unsigned char temp = bitMask<<1; temp != 0; temp <<= 1) bp.bitIndex++; return bp; } void BitByBitData::setPosition(const BitPosition& bp) { if(bp.byteIndex < length) { data = start + bp.byteIndex; bitMask = 0x80 >> bp.bitIndex; // big-endian, zero based bit index (from 0 to 7) // so 0x80 => bit 0, 0x01 => bit 7 // Why? It is easy to see in a hex editor. failed = false; } else { failed = true; } } void BitByBitData::setPosition(unsigned int byte, unsigned int bit) { if(byte <= length) { data = start + byte; bitMask = 0x80 >> bit; // big-endian, zero based bit index (from 0 to 7) // so 0x80 => bit 0, 0x01 => bit 7 // Why? It is easy to see in a hex editor. failed = false; } else { failed = true; } } void BitByBitData::setShowBits(bool val) { showBits = val; } void BitByBitData::tellPosition() { BitPosition bp = getPosition(); cout << bp.byteIndex << ':' << bp.bitIndex << endl; } bool BitByBitData::readBit() { if(!failed) { bool val = *data & bitMask; if(showBits) cout << (val?'1':'0'); nextBit(); return val; } else return false; } unsigned char BitByBitData::readChar() { unsigned char dat = 0; dat |= readBit(); for(int a = 0; a < 7; ++a) { dat <<= 1; dat |= readBit(); } return dat; } unsigned int BitByBitData::readUnsignedInt() { unsigned int result = 0; unsigned int count = 0; while(readBit()) { result |= (static_cast(readChar()) << 8*count++); } if(showBits) cout << " " << result << endl; return result; } std::string BitByBitData::readString() { bool isNotNull = readBit(); std::string result; if(isNotNull) { unsigned int stringLength = readUnsignedInt(); char *buf = new char[stringLength+1]; buf[stringLength] = '\0'; for(unsigned int a = 0; a < stringLength; ++a) { buf[a] = readChar(); } result = buf; delete[] buf; } if(showBits) cout << " " << result << endl; return result; } int BitByBitData::readInt() { int result = 0; unsigned int count = 0; while(readBit()) { result |= (static_cast(readChar()) << 8*count++); } result <<= (4-count)*8; result >>= (4-count)*8; if(showBits) cout << " " << result << endl; return result; } // Thanks to Michail Vidiassov double BitByBitData::readDouble() { ieee754_double value; value.d = 0; sCodageOfFrequentDoubleOrExponent *pcofdoe; unsigned int ucofdoe = 0; for(int i = 1; i <= 22; ++i) { ucofdoe <<= 1; ucofdoe |= readBit(); if((pcofdoe = getcofdoe(ucofdoe,i)) != NULL) break; } value.d = pcofdoe->u2uod.Value; // check if zero if(pcofdoe->NumberOfBits==2 && pcofdoe->Bits==1 && pcofdoe->Type==VT_double) return value.d; value.ieee.negative = readBit(); // get sign if(pcofdoe->Type == VT_double) // double from list return value.d; if(readBit()==0) // no mantissa return value.d; // read the mantissa // read uppermost 4 bits of mantissa unsigned char b4 = 0; for(int i = 0; i < 4; ++i) { b4 <<= 1; b4 |= readBit(); } #ifdef WORDS_BIGENDIAN *(reinterpret_cast(&value)+1) |= b4; unsigned char *lastByte = reinterpret_cast(&value)+7; unsigned char *currentByte = reinterpret_cast(&value)+2; #else *(reinterpret_cast(&value)+6) |= b4; unsigned char *lastByte = reinterpret_cast(&value)+0; unsigned char *currentByte = reinterpret_cast(&value)+5; #endif for(;MOREBYTE(currentByte,lastByte); NEXTBYTE(currentByte)) { if(readBit()) { // new byte *currentByte = readChar(); } else { // get 3 bit offset unsigned int offset = 0; offset |= (readBit() << 2); offset |= (readBit() << 1); offset |= readBit(); if(offset == 0) { // fill remaining bytes in mantissa with previous byte unsigned char pByte = BYTEAT(currentByte,1); for(;MOREBYTE(currentByte,lastByte); NEXTBYTE(currentByte)) *currentByte = pByte; break; } else if(offset == 6) { // fill remaining bytes except last byte with previous byte unsigned char pByte = BYTEAT(currentByte,1); PREVIOUSBYTE(lastByte); for(;MOREBYTE(currentByte,lastByte); NEXTBYTE(currentByte)) *currentByte = pByte; *currentByte = readChar(); break; } else { // one repeated byte *currentByte = BYTEAT(currentByte,offset); } } } if(showBits) cout << " " << value.d << endl; return value.d; } void BitByBitData::nextBit() { bitMask >>= 1; if(bitMask == 0) { if(data < start+length) data++; else { failed = true; cout << "End of data."<< endl; } bitMask = 0x80; } } asymptote-3.05/prc/PRCTools/bitSearchUI.cc0000644000000000000000000000350715031566105017075 0ustar rootroot/************ * * This file is part of a tool for reading 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include #include #include #include "bitData.h" using namespace std; int main(int argc, char *argv[]) { if(argc < 2) { cerr << "Error: Input file not specified." << endl; return 1; } ifstream inFile(argv[1]); if(!inFile) { cerr << "Error: Cannot open input file." << endl; return 1; } inFile.seekg(0,ios::end); unsigned int length = inFile.tellg(); inFile.seekg(0,ios::beg); char *buf = new char[length]; inFile.read(buf,length); BitByBitData bbbd(buf,length); unsigned int uisf; cout << "Unsigned int to search for: "; cin >> uisf; BitPosition currP; for(currP.byteIndex = 0; currP.byteIndex < length; ++currP.byteIndex) for(currP.bitIndex = 0; currP.bitIndex < 8; ++currP.bitIndex) { bbbd.setPosition(currP); if(bbbd.readUnsignedInt() == uisf) { cout << "Found " << uisf << " at " << currP.byteIndex << ':' << currP.bitIndex << endl; } } delete[] buf; return 0; } asymptote-3.05/prc/PRCTools/inflationMain.cc0000644000000000000000000000270715031566105017524 0ustar rootroot/************ * * This file is part of a tool for reading 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include #include #include #include #include "inflation.h" using namespace std; int main(int argc, char *argv[]) { if(argc < 2) { cerr << "No file specified." << endl; return 1; } ifstream data(argv[1]); char *buff = NULL; int dataSize = decompress(data,buff); cout << hex; for(int i = 0; i < dataSize; ++i) { cout << ' ' << setw(2) << setfill('0') << static_cast(static_cast(buff[i])); if(i%16 == 15) cout << endl; } cout << endl << dec << dataSize << " bytes" << endl; free(buff); return 0; } asymptote-3.05/prc/PRCTools/makePRC.cc0000644000000000000000000001117015031566105016210 0ustar rootroot/************ * * This file is part of a tool for producing 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include "../include/prc/oPRCFile.h" #include #include #include #include #include using namespace std; void readPoints(istream &is, unsigned int n, double p[][3]) { for(unsigned int i = 0; i < n; ++i) { is >> p[i][0] >> p[i][1] >> p[i][2]; } if(!is) { cerr << "Error reading list of points." << endl; exit(1); } } void readDoubles(istream &is, unsigned int n, double d[]) { for(unsigned int i = 0; i < n; ++i) { is >> d[i]; } if(!is) { cerr << "Error reading list of doubles." << endl; exit(1); } } int main(int argc, char **argv) { const char *oFileName = "output.prc"; int c; opterr = 0; while ((c = getopt (argc, argv, "o:")) != -1) switch (c) { case 'o': oFileName = optarg; break; case '?': if (optopt == 'o') cerr << "Option '-o' requires an argument, the filename." << endl; else cerr << "Unrecognized option '-" << (char)optopt << "'." << endl; exit(1); break; default: exit(1); } istream *ins = NULL; if(optind < argc) { ins = new ifstream(argv[optind]); if(!*ins) { cerr << "Error opening input file " << argv[optind] << endl; exit(1); } } else { ins = &cin; } ofstream outf(oFileName); if(!outf) { cerr << "Error opening output file " << oFileName << endl; exit(1); } oPRCFile oPRC(outf); string entityType; while(*ins) { *ins >> entityType; if(!*ins) break; if(entityType == "Line") { double r,g,b,a; unsigned int numberOfPoints; *ins >> r >> g >> b >> a >> numberOfPoints; if(!*ins) { cerr << "Error reading line data." << endl; exit(1); } else { double (*points)[3] = new double[numberOfPoints][3]; readPoints(*ins,numberOfPoints,points); oPRC.add(new PRCline(&oPRC,numberOfPoints,points, *new RGBAColour(r,g,b,a))); } } else if(entityType == "Curve") { double r,g,b,a; unsigned int numberOfPoints; unsigned int degree; *ins >> r >> g >> b >> a >> degree >> numberOfPoints; if(!*ins) { cerr << "Error reading curve data." << endl; exit(1); } else { double (*points)[3] = new double[numberOfPoints][3]; double *knots = new double[degree+numberOfPoints+1]; readPoints(*ins,numberOfPoints,points); readDoubles(*ins,degree+numberOfPoints+1,knots); oPRC.add(new PRCcurve(&oPRC,degree,numberOfPoints,points, knots,*new RGBAColour(r,g,b,a))); } } else if(entityType == "Surface") { double r,g,b,a; unsigned int numberOfPointsU,numberOfPointsV; unsigned int degreeU,degreeV; *ins >> r >> g >> b >> a >> degreeU >> degreeV >> numberOfPointsU >> numberOfPointsV; if(!*ins) { cerr << "Error reading surface data." << endl; exit(1); } else { double (*points)[3] = new double[numberOfPointsU*numberOfPointsV][3]; double *knotsU = new double[degreeU+numberOfPointsU+1]; double *knotsV = new double[degreeV+numberOfPointsV+1]; readPoints(*ins,numberOfPointsU*numberOfPointsV,points); readDoubles(*ins,degreeU+numberOfPointsU+1,knotsU); readDoubles(*ins,degreeV+numberOfPointsV+1,knotsV); oPRC.add(new PRCsurface(&oPRC,degreeU,degreeV,numberOfPointsU, numberOfPointsV,points,knotsU,knotsV, *new RGBAColour(r,g,b,a))); } } else { cerr << "Unrecognized entity type " << entityType << endl; exit(1); } } if(ins && ins != &cin) delete ins; oPRC.finish(); outf.close(); return 0; } asymptote-3.05/prc/PRCTools/Makefile0000644000000000000000000000317215031566105016062 0ustar rootrootCFLAGS = -O3 -Wall CXX = g++ makePRC: PRCbitStream oPRCFile PRCdouble writePRC makePRC.cc $(CXX) $(CFLAGS) -o makePRC PRCbitStream.o oPRCFile.o PRCdouble.o writePRC.o makePRC.cc -lz describePRC: bitData inflation PRCdouble iPRCFile describePRC.cc describeMain.cc $(CXX) $(CFLAGS) -o describePRC bitData.o inflation.o PRCdouble.o iPRCFile.o describePRC.cc describeMain.cc -lz bitSearchUI: bitSearchUI.cc bitData PRCdouble $(CXX) $(CFLAGS) -o bitSearchUI bitData.o PRCdouble.o bitSearchUI.cc bitSearchDouble: bitSearchDouble.cc bitData PRCdouble $(CXX) $(CFLAGS) -o bitSearchDouble bitData.o PRCdouble.o bitSearchDouble.cc extractSections: extractSections.cc iPRCFile inflation bitData PRCdouble $(CXX) $(CFLAGS) -o extractSections iPRCFile.o inflation.o bitData.o PRCdouble.o describePRC.cc extractSections.cc -lz inflateTest: inflation inflationMain.cc $(CXX) $(CFLAGS) -o inflateTest inflation.o inflationMain.cc -lz PRCdouble: ../PRCdouble.cc $(CXX) $(CFLAGS) -c ../PRCdouble.cc -o PRCdouble.o PRCbitStream: ../PRCbitStream.cc $(CXX) $(CFLAGS) -c ../PRCbitStream.cc -o PRCbitStream.o oPRCFile: ../oPRCFile.cc $(CXX) $(CFLAGS) -c ../oPRCFile.cc -o oPRCFile.o writePRC: ../writePRC.cc PRCbitStream $(CXX) $(CFLAGS) -c ../writePRC.cc -o writePRC.o bitData: bitData.cc $(CXX) $(CFLAGS) -c bitData.cc -o bitData.o inflation: inflation.cc $(CXX) $(CFLAGS) -c inflation.cc -o inflation.o iPRCFile: iPRCFile.cc $(CXX) $(CFLAGS) -c iPRCFile.cc -o iPRCFile.o all: makePRC describePRC bitSearchUI bitSearchDouble extractSections inflateTest tools: all clean: rm -f *.o describePRC bitSearchUI bitSearchDouble extractSections inflateTest asymptote-3.05/prc/PRCTools/extractSections.cc0000644000000000000000000000243615031566105020115 0ustar rootroot/************ * * This file is part of a tool for reading 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include #include #include "iPRCFile.h" using namespace std; int main(int argc, char* argv[]) { if(argc < 2) { cerr << "Error: Input file not specified." << endl; return 1; } ifstream inFile(argv[1]); if(!inFile) { cerr << "Error: Cannot open input file." << endl; return 1; } iPRCFile myFile(inFile); string name(argv[1]); myFile.dumpSections(name.substr(0,name.find(".")).c_str()); return 0; } asymptote-3.05/prc/PRCTools/describePRC.cc0000644000000000000000000020503715031566105017062 0ustar rootroot/************ * * This file is part of a tool for reading 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include #include #include #include #include #include "../include/prc/PRC.h" #include "describePRC.h" using std::ostringstream; using std::cout; using std::endl; using std::hex; using std::dec; using std::string; using std::setw; using std::setfill; // describe sections void describeGlobals(BitByBitData &mData) { mData.tellPosition(); cout << getIndent() << "--Globals--" << endl; if(!checkSectionCode(mData,PRC_TYPE_ASM_FileStructureGlobals)) return; indent(); describeContentPRCBase(mData,false); unsigned int numberOfReferencedFileStructures = mData.readUnsignedInt(); cout << getIndent() << "numberOfReferencedFileStructures " << numberOfReferencedFileStructures << endl; indent(); for(unsigned int i = 0; i < numberOfReferencedFileStructures; ++i) { describeCompressedUniqueID(mData); } dedent(); double tessellation_chord_height_ratio = mData.readDouble(); cout << getIndent() << "tessellation_chord_height_ratio " << tessellation_chord_height_ratio << endl; double tessellation_angle_degree = mData.readDouble(); cout << getIndent() << "tessellation_angle_degree " << tessellation_angle_degree << endl; string default_font_family_name = mData.readString(); cout << getIndent() << "default_font_family_name \"" << default_font_family_name << '\"' << endl; unsigned int number_of_fonts = mData.readUnsignedInt(); cout << getIndent() << "number_of_fonts " << number_of_fonts << endl; indent(); for(unsigned int q = 0; q < number_of_fonts; ++q) { string font_name = mData.readString(); cout << getIndent() << "font_name \"" << font_name << '\"' << endl; unsigned int char_set = mData.readUnsignedInt(); cout << getIndent() << "char_set " << char_set << endl; unsigned int number_of_font_keys = mData.readUnsignedInt(); cout << getIndent() << "number_of_font_keys " << number_of_font_keys << endl; indent(); for(unsigned int i = 0; i < number_of_font_keys; i++) { unsigned int font_size = mData.readUnsignedInt() - 1; cout << getIndent() << "font_size " << font_size << endl; unsigned char attributes = mData.readChar(); cout << getIndent() << "attributes " << static_cast(attributes) << endl; } dedent(); } dedent(); unsigned int number_of_colours = mData.readUnsignedInt(); cout << getIndent() << "number_of_colours " << number_of_colours << endl; indent(); for(unsigned int i = 0; i < number_of_colours; ++i) describeRGBColour(mData); dedent(); unsigned int number_of_pictures = mData.readUnsignedInt(); cout << getIndent() << "number_of_pictures " << number_of_pictures << endl; indent(); for(unsigned int i=0;i(mData.readChar()) << endl; unsigned int number_of_coedge = mData.readUnsignedInt(); cout << getIndent() << "number_of_coedge " << number_of_coedge << endl; indent(); for(unsigned int i = 0; i < number_of_coedge; ++i) { describeObject(mData); cout << getIndent() << "neigh_serial_index " << mData.readUnsignedInt() << endl; } dedent(); dedent(); } void describeTopoCoEdge(BitByBitData &mData) { cout << getIndent() << "--CoEdge--" << endl; indent(); describeBaseTopology(mData); describeObject(mData); // edge describeObject(mData); // uv_curve cout << getIndent() << "orientation_with_loop " << static_cast(mData.readChar()) << endl; cout << getIndent() << "orientation_uv_with_loop " << static_cast(mData.readChar()) << endl; dedent(); } void describeTopoEdge(BitByBitData &mData) { cout << getIndent() << "--Edge--" << endl; indent(); describeContentWireEdge(mData); describeObject(mData); // vertex_start describeObject(mData); // vertex_end bool have_tolerance = mData.readBit(); cout << getIndent() << "have_tolerance " << (have_tolerance?"yes":"no") << endl; if(have_tolerance) cout << getIndent() << "tolerance " << mData.readDouble() << endl; dedent(); } void describeTopoUniqueVertex(BitByBitData &mData) { cout << getIndent() << "--Unique Vertex--" << endl; indent(); describeBaseTopology(mData); describeVector3d(mData); bool have_tolerance = mData.readBit(); cout << getIndent() << "have_tolerance " << (have_tolerance?"yes":"no") << endl; if(have_tolerance) cout << getIndent() << "tolerance " << mData.readDouble() << endl; dedent(); } void describeTopoConnex(BitByBitData &mData) { cout << getIndent() << "--Connex--" << endl; indent(); describeBaseTopology(mData); unsigned int number_of_shells = mData.readUnsignedInt(); cout << getIndent() << "number_of_shells " << number_of_shells << endl; indent(); for(unsigned int i = 0; i < number_of_shells; ++i) { // NOTE: this does not check if the objects are actually shells! describeObject(mData); } dedent(); dedent(); } void describeTopoShell(BitByBitData &mData) { cout << getIndent() << "--Shell--" << endl; indent(); describeBaseTopology(mData); cout << getIndent() << "shell_is_closed " << (mData.readBit()?"yes":"no") << endl; unsigned int number_of_faces = mData.readUnsignedInt(); cout << getIndent() << "number_of_faces " << number_of_faces << endl; for(unsigned int i = 0; i < number_of_faces; ++i) { // NOTE: this does not check if the objects are actually faces! describeObject(mData); unsigned char orientation = mData.readChar(); cout << getIndent() << "orientation_surface_with_shell " << static_cast(orientation) << endl; } dedent(); } void describeObject(BitByBitData &mData) { cout << getIndent() << "--Object--" << endl; bool already_stored = mData.readBit(); cout << getIndent() << "already_stored " << (already_stored?"yes":"no") << endl; if(already_stored) // reverse of documentation? { cout << getIndent() << "index of stored item " << mData.readUnsignedInt() << endl; } else { unsigned int type = mData.readUnsignedInt(); switch(type) { case PRC_TYPE_ROOT: cout << getIndent() << "NULL Object" << endl; break; // topological items case PRC_TYPE_TOPO_Connex: describeTopoConnex(mData); break; case PRC_TYPE_TOPO_Shell: describeTopoShell(mData); break; case PRC_TYPE_TOPO_Face: describeTopoFace(mData); break; case PRC_TYPE_TOPO_Loop: describeTopoLoop(mData); break; case PRC_TYPE_TOPO_CoEdge: describeTopoCoEdge(mData); break; case PRC_TYPE_TOPO_Edge: describeTopoEdge(mData); break; case PRC_TYPE_TOPO_UniqueVertex: describeTopoUniqueVertex(mData); break; case PRC_TYPE_TOPO_WireEdge: describeContentWireEdge(mData); break; // curves case PRC_TYPE_CRV_Circle: describeCurvCircle(mData); break; case PRC_TYPE_CRV_NURBS: describeCurvNURBS(mData); break; case PRC_TYPE_CRV_PolyLine: describeCurvPolyLine(mData); break; case PRC_TYPE_CRV_Line: describeCurvLine(mData); break; // surfaces case PRC_TYPE_SURF_NURBS: describeSurfNURBS(mData); break; case PRC_TYPE_SURF_Cylinder: describeSurfCylinder(mData); break; case PRC_TYPE_SURF_Plane: describeSurfPlane(mData); break; // topological items case PRC_TYPE_TOPO_Item: case PRC_TYPE_TOPO_MultipleVertex: // curves case PRC_TYPE_CRV_Base: case PRC_TYPE_CRV_Blend02Boundary: case PRC_TYPE_CRV_Composite: case PRC_TYPE_CRV_OnSurf: case PRC_TYPE_CRV_Ellipse: case PRC_TYPE_CRV_Equation: case PRC_TYPE_CRV_Helix: case PRC_TYPE_CRV_Hyperbola: case PRC_TYPE_CRV_Intersection: case PRC_TYPE_CRV_Offset: case PRC_TYPE_CRV_Parabola: case PRC_TYPE_CRV_Transform: // surfaces case PRC_TYPE_SURF_Base: case PRC_TYPE_SURF_Blend01: case PRC_TYPE_SURF_Blend02: case PRC_TYPE_SURF_Blend03: case PRC_TYPE_SURF_Cone: case PRC_TYPE_SURF_Cylindrical: case PRC_TYPE_SURF_Offset: case PRC_TYPE_SURF_Pipe: case PRC_TYPE_SURF_Ruled: case PRC_TYPE_SURF_Sphere: case PRC_TYPE_SURF_Revolution: case PRC_TYPE_SURF_Extrusion: case PRC_TYPE_SURF_FromCurves: case PRC_TYPE_SURF_Torus: case PRC_TYPE_SURF_Transform: case PRC_TYPE_SURF_Blend04: cout << getIndent() << "TODO: Unhandled object of type " << type << endl; break; default: cout << getIndent() << "Invalid object of type " << type << endl; break; } } } void describeBaseTopology(BitByBitData &mData) { bool base_information = mData.readBit(); cout << getIndent() << "base_information " << (base_information?"yes":"no") << endl; if(base_information) { describeAttributes(mData); describeName(mData); cout << getIndent() << "identifier " << mData.readUnsignedInt() << endl; } } void describeBaseGeometry(BitByBitData &mData) { bool base_information = mData.readBit(); cout << getIndent() << "base_information " << (base_information?"yes":"no") << endl; if(base_information) { describeAttributes(mData); describeName(mData); cout << getIndent() << "identifier " << mData.readUnsignedInt() << endl; } } unsigned int describeContentBody(BitByBitData &mData) { describeBaseTopology(mData); unsigned int behaviour = static_cast(mData.readChar()); cout << getIndent() << "behaviour " << behaviour << endl; return behaviour; } void describeContentSurface(BitByBitData &mData) { describeBaseGeometry(mData); cout << getIndent() << "extend_info " << mData.readUnsignedInt() << endl; } void describeBody(BitByBitData &mData) { cout << getIndent() << "--Body--" << endl; unsigned int type = mData.readUnsignedInt(); switch(type) { case PRC_TYPE_TOPO_BrepData: { cout << getIndent() << "--PRC_TYPE_TOPO_BrepData--" << endl; unsigned int behaviour = describeContentBody(mData); unsigned int number_of_connex = mData.readUnsignedInt(); cout << getIndent() << "number_of_connex " << number_of_connex << endl; indent(); for(unsigned int i = 0; i < number_of_connex; ++i) { describeObject(mData); } dedent(); if(behaviour != 0) { cout << getIndent() << "bbox " << endl; indent(); describeExtent3d(mData); dedent(); } break; } case PRC_TYPE_TOPO_SingleWireBody: { cout << getIndent() << "--PRC_TYPE_TOPO_SingleWireBody--" << endl; // unsigned int behaviour = describeContentBody(mData); // TODO: is behaviour needed to get data about how to describe? describeContentBody(mData); describeObject(mData); // curve break; } case PRC_TYPE_TOPO_BrepDataCompress: case PRC_TYPE_TOPO_SingleWireBodyCompress: cout << getIndent() << "TODO: Unhandled body type " << type << endl; break; default: cout << getIndent() << "Invalid body type " << type << endl; break; } } void describeTopoContext(BitByBitData &mData) { cout << getIndent() << "--Topological Context--" << endl; if(!checkSectionCode(mData,PRC_TYPE_TOPO_Context)) return; indent(); describeContentPRCBase(mData,false); cout << getIndent() << "behaviour " << static_cast(mData.readChar()) << endl; cout << getIndent() << "granularity " << mData.readDouble() << endl; cout << getIndent() << "tolerance " << mData.readDouble() << endl; bool have_smallest_face_thickness = mData.readBit(); cout << getIndent() << "have_smallest_face_thickness " << (have_smallest_face_thickness?"yes":"no") << endl; if(have_smallest_face_thickness) cout << getIndent() << "smallest_thickness " << mData.readDouble() << endl; bool have_scale = mData.readBit(); cout << getIndent() << "have_scale " << (have_scale?"yes":"no") << endl; if(have_scale) cout << getIndent() << "scale " << mData.readDouble() << endl; dedent(); } void describeLineAttr(BitByBitData& mData) { cout << getIndent() << "index_of_line_style " << mData.readUnsignedInt()-1 << endl; } void describeArrayRGBA(BitByBitData& mData, int number_of_colours, int number_by_vector) { // bool new_colour = true; // not currently used for(int i = 0; i < number_by_vector; ++i) { cout << getIndent() << static_cast(mData.readChar()) << ' '; cout << static_cast(mData.readChar()) << ' '; cout << static_cast(mData.readChar()) << endl; //TODO: finish this } } void describeContentBaseTessData(BitByBitData &mData) { cout << getIndent() << "is_calculated " << (mData.readBit()?"yes":"no") << endl; unsigned int number_of_coordinates = mData.readUnsignedInt(); cout << getIndent() << "number_of_coordinates " << number_of_coordinates << endl; indent(); for(unsigned int i = 0; i < number_of_coordinates; ++i) { cout << getIndent() << mData.readDouble() << endl; } dedent(); } void describeTessFace(BitByBitData &mData) { cout << getIndent() << "--Tessellation Face--" << endl; if(!checkSectionCode(mData,PRC_TYPE_TESS_Face)) return; indent(); unsigned int size_of_line_attributes = mData.readUnsignedInt(); cout << getIndent() << "size_of_line_attributes " << size_of_line_attributes << endl; indent(); for(unsigned int i = 0; i < size_of_line_attributes; ++i) { describeLineAttr(mData); } dedent(); unsigned int start_wire = mData.readUnsignedInt(); cout << getIndent() << "start_wire " << start_wire << endl; unsigned int size_of_sizes_wire = mData.readUnsignedInt(); cout << getIndent() << "size_of_sizes_wire " << size_of_sizes_wire << endl; indent(); for(unsigned int i = 0; i < size_of_sizes_wire; ++i) { cout << getIndent() << mData.readUnsignedInt() << endl; } dedent(); unsigned int used_entities_flag = mData.readUnsignedInt(); cout << getIndent() << "used_entities_flag " << used_entities_flag << endl; unsigned int start_triangulated = mData.readUnsignedInt(); cout << getIndent() << "start_triangulated " << start_triangulated << endl; unsigned int size_of_sizes_triangulated = mData.readUnsignedInt(); cout << getIndent() << "size_of_sizes_triangulated " << size_of_sizes_triangulated << endl; indent(); for(unsigned int i = 0; i < size_of_sizes_triangulated; ++i) { cout << getIndent() << mData.readUnsignedInt() << endl; } dedent(); cout << getIndent() << "number_of_texture_coordinate_indexes " << mData.readUnsignedInt() << endl; bool has_vertex_colors = mData.readBit(); cout << getIndent() << "has_vertex_colors " << (has_vertex_colors?"yes":"no") << endl; indent(); if(has_vertex_colors) { bool is_rgba = mData.readBit(); cout << getIndent() << "is_rgba " << (is_rgba?"yes":"no") << endl; bool b_optimised = mData.readBit(); cout << getIndent() << "b_optimised " << (b_optimised?"yes":"no") << endl; if(!b_optimised) { indent(); //TODO: compute size of Array and pass it instead of 0 describeArrayRGBA(mData,0,(is_rgba ? 4 : 3)); dedent(); } else { // not described // what does this mean? that this should not happen? // or is omitted from the docs? } } dedent(); if(size_of_line_attributes) { cout << getIndent() << "behaviour " << mData.readUnsignedInt() << endl; } dedent(); } void describe3DTess(BitByBitData &mData) { cout << getIndent() << "--3D Tessellation--" << endl; indent(); describeContentBaseTessData(mData); cout << getIndent() << "has_faces " << (mData.readBit()?"yes":"no") << endl; cout << getIndent() << "has_loops " << (mData.readBit()?"yes":"no") << endl; bool must_recalculate_normals = mData.readBit(); cout << getIndent() << "must_recalculate_normals " << (must_recalculate_normals?"yes":"no") << endl; indent(); if(must_recalculate_normals) { cout << getIndent() << "Docs were wrong: must_recalculate_normals is true." << endl; cout << getIndent() << "normals_recalculation_flags " << static_cast(mData.readChar()) << endl; cout << getIndent() << "crease_angle " << mData.readDouble() << endl; } dedent(); unsigned int number_of_normal_coordinates = mData.readUnsignedInt(); cout << getIndent() << "number_of_normal_coordinates " << number_of_normal_coordinates << endl; indent(); for(unsigned int i = 0; i < number_of_normal_coordinates; ++i) { cout << getIndent() << mData.readDouble() << endl; } dedent(); unsigned int number_of_wire_indices = mData.readUnsignedInt(); cout << getIndent() << "number_of_wire_indices " << number_of_wire_indices << endl; indent(); for(unsigned int i = 0; i < number_of_wire_indices; ++i) { cout << getIndent() << mData.readUnsignedInt() << endl; } dedent(); unsigned int number_of_triangulated_indices = mData.readUnsignedInt(); cout << getIndent() << "number_of_triangulated_indices " << number_of_triangulated_indices << endl; indent(); for(unsigned int i = 0; i < number_of_triangulated_indices; ++i) { cout << getIndent() << mData.readUnsignedInt() << endl; } dedent(); unsigned int number_of_face_tessellation = mData.readUnsignedInt(); cout << getIndent() << "number_of_face_tessellation " << number_of_face_tessellation << endl; indent(); for(unsigned int i = 0; i < number_of_face_tessellation; ++i) { describeTessFace(mData); } dedent(); unsigned int number_of_texture_coordinates = mData.readUnsignedInt(); cout << getIndent() << "number_of_texture_coordinates " << number_of_texture_coordinates << endl; indent(); for(unsigned int i = 0; i < number_of_texture_coordinates; ++i) { cout << getIndent() << mData.readDouble() << endl; } dedent(); dedent(); } void describe3DWireTess(BitByBitData &mData) { //TODO } void describe3DMarkupTess(BitByBitData &mData) { //TODO } void describeHighlyCompressed3DTess(BitByBitData &mData) { //TODO } void describeSceneDisplayParameters(BitByBitData &mData) { cout << getIndent() << "--Scene Display Parameters--" << endl; if(!checkSectionCode(mData,PRC_TYPE_GRAPH_SceneDisplayParameters)) return; indent(); describeContentPRCBase(mData,true); cout << getIndent() << "is active? " << (mData.readBit()?"yes":"no") << endl; unsigned int number_of_lights = mData.readUnsignedInt(); cout << getIndent() << "number of lights " << number_of_lights << endl; indent(); for(unsigned int i = 0; i < number_of_lights; ++i) { describeLight(mData); } dedent(); bool camera = mData.readBit(); cout << getIndent() << "camera? " << (camera?"yes":"no") << endl; if(camera) describeCamera(mData); bool rotation_centre = mData.readBit(); cout << getIndent() << "rotation centre? " << (rotation_centre?"yes":"no") << endl; if(rotation_centre) describeVector3d(mData); unsigned int number_of_clipping_planes = mData.readUnsignedInt(); cout << getIndent() << "number of clipping planes " << number_of_clipping_planes << endl; indent(); for(unsigned int i = 0; i < number_of_clipping_planes; ++i) { cout << "Can't describe planes!!!" << endl; //describePlane(mData); } dedent(); cout << getIndent() << "Background line style index: " << mData.readUnsignedInt()-1 << endl; cout << getIndent() << "Default line style index: " << mData.readUnsignedInt()-1 << endl; unsigned int number_of_default_styles_per_type = mData.readUnsignedInt(); cout << getIndent() << "number_of_default_styles_per_type " << number_of_default_styles_per_type << endl; indent(); for(unsigned int i = 0; i < number_of_default_styles_per_type; ++i) { cout << getIndent() << "type " << mData.readUnsignedInt() << endl; cout << getIndent() << "line style index: " << mData.readUnsignedInt()-1 << endl; } dedent(); dedent(); } void describeCartesionTransformation3d(BitByBitData& mData) { cout << getIndent() << "--3d Cartesian Transformation--" << endl; if(!checkSectionCode(mData,PRC_TYPE_MISC_CartesianTransformation)) return; indent(); unsigned char behaviour = mData.readChar(); cout << getIndent() << "behaviour " << static_cast(behaviour) << endl; if((behaviour & PRC_TRANSFORMATION_Translate) != 0) { cout << getIndent() << "Translation" << endl; describeVector3d(mData); } if((behaviour & PRC_TRANSFORMATION_NonOrtho) != 0) { cout << getIndent() << "Non orthogonal transformation" << endl; cout << getIndent() << "X" << endl; describeVector3d(mData); cout << getIndent() << "Y" << endl; describeVector3d(mData); cout << getIndent() << "Z" << endl; describeVector3d(mData); } else if((behaviour & PRC_TRANSFORMATION_Rotate) != 0) { cout << getIndent() << "Rotation" << endl; cout << getIndent() << "X" << endl; describeVector3d(mData); cout << getIndent() << "Y" << endl; describeVector3d(mData); } // this is different from the docs!!! but it works... if ((behaviour & PRC_TRANSFORMATION_NonUniformScale) != 0) { cout << getIndent() << "Non-uniform scale by " << endl; describeVector3d(mData); } // this is different from the docs!!! but it works... if((behaviour & PRC_TRANSFORMATION_Scale) != 0) { cout << getIndent() << "Uniform Scale by " << mData.readDouble() << endl; } if((behaviour & PRC_TRANSFORMATION_Homogeneous) != 0) { cout << getIndent() << "transformation has homogenous values" << endl; cout << getIndent() << "x = " << mData.readDouble() << endl; cout << getIndent() << "y = " << mData.readDouble() << endl; cout << getIndent() << "z = " << mData.readDouble() << endl; cout << getIndent() << "w = " << mData.readDouble() << endl; } dedent(); } void describeTransformation3d(BitByBitData& mData) { cout << getIndent() << "--3d Transformation--" << endl; indent(); bool has_transformation = mData.readBit(); cout << getIndent() << "has_transformation " << (has_transformation?"yes":"no") << endl; if(has_transformation) { unsigned char behaviour = mData.readChar(); cout << getIndent() << "behaviour " << static_cast(behaviour) << endl; if((behaviour & PRC_TRANSFORMATION_Translate) != 0) { cout << getIndent() << "Translation" << endl; describeVector3d(mData); } if((behaviour & PRC_TRANSFORMATION_Rotate) != 0) { cout << getIndent() << "Rotation" << endl; cout << getIndent() << "X" << endl; describeVector3d(mData); cout << getIndent() << "Y" << endl; describeVector3d(mData); } if((behaviour & PRC_TRANSFORMATION_Scale) != 0) { cout << getIndent() << "Uniform Scale by " << mData.readDouble() << endl; } } dedent(); } void describeTransformation2d(BitByBitData& mData) { cout << getIndent() << "--2d Transformation--" << endl; indent(); bool has_transformation = mData.readBit(); cout << "has_transformation " << (has_transformation?"yes":"no") << endl; if(has_transformation) { unsigned char behaviour = mData.readChar(); cout << getIndent() << "behaviour " << static_cast(behaviour) << endl; if((behaviour & PRC_TRANSFORMATION_Translate) != 0) { cout << getIndent() << "Translation" << endl; describeVector2d(mData); } if((behaviour & PRC_TRANSFORMATION_Rotate) != 0) { cout << getIndent() << "Rotation" << endl; cout << getIndent() << "X" << endl; describeVector2d(mData); cout << getIndent() << "Y" << endl; describeVector2d(mData); } if((behaviour & PRC_TRANSFORMATION_Scale) != 0) { cout << getIndent() << "Uniform Scale by " << mData.readDouble() << endl; } } dedent(); } void describeFileStructureInternalData(BitByBitData &mData) { cout << getIndent() << "--File Structure Internal Data--" << endl; if(!checkSectionCode(mData,PRC_TYPE_ASM_FileStructure)) return; indent(); describeContentPRCBase(mData,false); cout << getIndent() << "next_available_index " << mData.readUnsignedInt() << endl; cout << getIndent() << "index_product_occurence " << mData.readUnsignedInt() << endl; dedent(); } void describeProductOccurrence(BitByBitData &mData) { cout << getIndent() << "--Product Occurrence--" << endl; if(!checkSectionCode(mData,PRC_TYPE_ASM_ProductOccurence)) return; indent(); describeContentPRCBaseWithGraphics(mData,true); cout << getIndent() << "index_part " << static_cast(mData.readUnsignedInt()-1) << endl; unsigned int index_prototype = mData.readUnsignedInt()-1; cout << getIndent() << "index_prototype " << static_cast(index_prototype) << endl; if(index_prototype+1 != 0) { bool prototype_in_same_file_structure = mData.readBit(); cout << getIndent() << "prototype_in_same_file_structure " << (prototype_in_same_file_structure?"yes":"no") << endl; if(!prototype_in_same_file_structure) describeCompressedUniqueID(mData); } unsigned int index_external_data = mData.readUnsignedInt()-1; cout << getIndent() << "index_external_data " << static_cast(index_external_data) << endl; if(index_external_data+1 != 0) { bool external_data_in_same_file_structure = mData.readBit(); cout << getIndent() << "external_data_in_same_file_structure " << (external_data_in_same_file_structure?"yes":"no") << endl; if(!external_data_in_same_file_structure) describeCompressedUniqueID(mData); } unsigned int number_of_son_product_occurences = mData.readUnsignedInt(); cout << getIndent() << "number_of_son_product_occurences " << number_of_son_product_occurences << endl; indent(); for(unsigned int i = 0; i < number_of_son_product_occurences; ++i) cout << getIndent() << mData.readUnsignedInt() << endl; dedent(); cout << getIndent() << "product_behaviour " << static_cast(mData.readChar()) << endl; describeUnit(mData); cout << getIndent() << "Product information flags " << static_cast(mData.readChar()) << endl; cout << getIndent() << "product_load_status " << mData.readUnsignedInt() << endl; bool has_location = mData.readBit(); cout << getIndent() << "has_location " << has_location << endl; if(has_location) { describeCartesionTransformation3d(mData); } unsigned int number_of_references = mData.readUnsignedInt(); cout << getIndent() << "number_of_references " << number_of_references << endl; indent(); for(unsigned int i = 0; i < number_of_references; ++i) { //TODO: describeReferenceToPRCBase(mData); } dedent(); describeMarkups(mData); unsigned int number_of_views = mData.readUnsignedInt(); cout << getIndent() << "number_of_views " << number_of_views << endl; indent(); for(unsigned int i = 0; i < number_of_views; ++i) { describeAnnotationView(mData); } dedent(); bool has_entity_filter = mData.readBit(); cout << getIndent() << "has_entity_filter " << (has_entity_filter?"yes":"no") << endl; if(has_entity_filter) { //TODO: describeEntityFilter(mData); } unsigned int number_of_display_filters = mData.readUnsignedInt(); cout << getIndent() << "number_of_display_filters " << number_of_display_filters << endl; indent(); for(unsigned int i = 0; i < number_of_display_filters; ++i) { //TODO: describeFilter(mData); } dedent(); unsigned int number_of_scene_display_parameters = mData.readUnsignedInt(); cout << getIndent() << "number_of_scene_display_parameters " << number_of_scene_display_parameters << endl; indent(); for(unsigned int i = 0; i < number_of_scene_display_parameters; ++i) { describeSceneDisplayParameters(mData); } dedent(); describeUserData(mData); dedent(); } void describeGraphics(BitByBitData &mData) { bool sameGraphicsAsCurrent = mData.readBit(); cout << getIndent() << "Same graphics as current graphics? " << (sameGraphicsAsCurrent?"yes":"no") << endl; if(!sameGraphicsAsCurrent) { layer_index = mData.readUnsignedInt()-1; cout << getIndent() << "layer_index " << layer_index << endl; index_of_line_style = mData.readUnsignedInt()-1; cout << getIndent() << "index_of_line_style " << index_of_line_style << endl; unsigned char c1 = mData.readChar(); unsigned char c2 = mData.readChar(); behaviour_bit_field = c1 | (static_cast(c2) << 8); cout << getIndent() << "behaviour_bit_field " << behaviour_bit_field << endl; } } void describeContentPRCBaseWithGraphics(BitByBitData &mData, bool efr) { describeContentPRCBase(mData,efr); describeGraphics(mData); } void describePartDefinition(BitByBitData &mData) { cout << getIndent() << "--Part Definition--" << endl; if(!checkSectionCode(mData,PRC_TYPE_ASM_PartDefinition)) return; indent(); describeContentPRCBaseWithGraphics(mData,true); describeExtent3d(mData); unsigned int number_of_representation_items = mData.readUnsignedInt(); cout << getIndent() << "number_of_representation_items " << number_of_representation_items << endl; indent(); for(unsigned int i = 0; i < number_of_representation_items; ++i) { describeRepresentationItem(mData); } dedent(); describeMarkups(mData); unsigned int number_of_views = mData.readUnsignedInt(); cout << getIndent() << "number_of_views " << number_of_views << endl; indent(); for(unsigned int i = 0; i < number_of_views; ++i) { describeAnnotationView(mData); } dedent(); describeUserData(mData); dedent(); } void describeMarkups(BitByBitData& mData) { cout << getIndent() << "--Markups--" << endl; indent(); unsigned int number_of_linked_items = mData.readUnsignedInt(); cout << getIndent() << "number_of_linked_items " << number_of_linked_items << endl; for(unsigned int i = 0; i < number_of_linked_items; ++i) { cout << "describe linked item!" << endl; } unsigned int number_of_leaders = mData.readUnsignedInt(); cout << getIndent() << "number_of_leaders " << number_of_leaders << endl; for(unsigned int i = 0; i < number_of_leaders; ++i) { cout << "describe leader!" << endl; } unsigned int number_of_markups = mData.readUnsignedInt(); cout << getIndent() << "number_of_markups " << number_of_markups << endl; for(unsigned int i=0; i < number_of_markups; ++i) { cout << "describe markup!" << endl; } unsigned int number_of_annotation_entities = mData.readUnsignedInt(); cout << getIndent() << "number_of_annotation_entities " << number_of_annotation_entities << endl; for(unsigned int i=0; i < number_of_annotation_entities; ++i) { cout << "describe annotation entity!" << endl; } dedent(); } void describeAnnotationView(BitByBitData &mData) { cout << getIndent() << "--Annotation View--" << endl; if(!checkSectionCode(mData,PRC_TYPE_MKP_View)) return; indent(); describeContentPRCBaseWithGraphics(mData,true); unsigned int number_of_annotations = mData.readUnsignedInt(); for(unsigned int i = 0; i < number_of_annotations; ++i) { //TODO: describeReferenceUniqueIdentifier(mData); } //TODO: describePlane(mData); bool scene_display_parameters = mData.readBit(); if(scene_display_parameters) { describeSceneDisplayParameters(mData); } describeUserData(mData); dedent(); } void describeExtent3d(BitByBitData &mData) { // I suspect the order of min/max should be flipped cout << getIndent() << "Minimum" << endl; indent(); describeVector3d(mData); dedent(); cout << getIndent() << "Maximum" << endl; indent(); describeVector3d(mData); dedent(); } void describeExtent1d(BitByBitData &mData) { cout << getIndent() << "Minimum " << mData.readDouble() << endl; cout << getIndent() << "Maximum " << mData.readDouble() << endl; } void describeExtent2d(BitByBitData &mData) { cout << getIndent() << "Minimum" << endl; indent(); describeVector2d(mData); dedent(); cout << getIndent() << "Maximum" << endl; indent(); describeVector2d(mData); dedent(); } void describeVector3d(BitByBitData &mData) { double x = mData.readDouble(); double y = mData.readDouble(); double z = mData.readDouble(); cout << getIndent() << '(' << x << ',' << y << ',' << z << ')' << endl; } void describeVector2d(BitByBitData &mData) { double x = mData.readDouble(); double y = mData.readDouble(); cout << getIndent() << '(' << x << ',' << y << ')' << endl; } void describePicture(BitByBitData &mData) { cout << getIndent() << "--Picture--" << endl; unsigned int sectionCode = mData.readUnsignedInt(); if(sectionCode != PRC_TYPE_GRAPH_Picture) { cout << getIndent() << "Invalid section code." << endl; } describeContentPRCBase(mData,false); int format = mData.readInt(); switch(format) { case KEPRCPicture_PNG: cout << getIndent() << "PNG format" << endl; break; case KEPRCPicture_JPG: cout << getIndent() << "JPG format" << endl; break; case KEPRCPicture_BITMAP_RGB_BYTE: cout << getIndent() << "gzipped pixel data (see PRC base compression). Each element is a RGB triple. (3 components)" << endl; break; case KEPRCPicture_BITMAP_RGBA_BYTE: cout << getIndent() << "gzipped pixel data (see PRC base compression). Each element is a complete RGBA element. (4 components)" << endl; break; case KEPRCPicture_BITMAP_GREY_BYTE: cout << getIndent() << "gzipped pixel data (see PRC base compression). Each element is a single luminance value. (1 components)" << endl; break; case KEPRCPicture_BITMAP_GREYA_BYTE: cout << getIndent() << "gzipped pixel data (see PRC base compression). Each element is a luminance/alpha pair. (2 components)" << endl; break; default: cout << getIndent() << "Invalid picture format." << endl; break; } cout << getIndent() << "uncompressed_file_index " << mData.readUnsignedInt()-1 << endl; cout << getIndent() << "pixel width " << mData.readUnsignedInt() << endl; cout << getIndent() << "pixel height " << mData.readUnsignedInt() << endl; } void describeTextureDefinition(BitByBitData &mData) { cout << getIndent() << "--Texture Definition--" << endl; if(!checkSectionCode(mData,PRC_TYPE_GRAPH_TextureDefinition)) return; cout << getIndent() << "TODO: Can't describe textures yet." << endl; } void describeMaterial(BitByBitData &mData) { cout << getIndent() << "--Material--" << endl; unsigned int code = mData.readUnsignedInt(); if(code == PRC_TYPE_GRAPH_Material) { describeContentPRCBase(mData,true); cout << getIndent() << "index of ambient color " << mData.readUnsignedInt() - 1 << endl; cout << getIndent() << "index of diffuse color " << mData.readUnsignedInt() - 1 << endl; cout << getIndent() << "index of emissive color " << mData.readUnsignedInt() - 1 << endl; cout << getIndent() << "index of specular color " << mData.readUnsignedInt() - 1 << endl; cout << getIndent() << "shininess " << mData.readDouble() << endl; cout << getIndent() << "ambient_alpha " << mData.readDouble() << endl; cout << getIndent() << "diffuse_alpha " << mData.readDouble() << endl; cout << getIndent() << "emissive_alpha " << mData.readDouble() << endl; cout << getIndent() << "specular_alpha " << mData.readDouble() << endl; } else if(code == PRC_TYPE_GRAPH_TextureApplication) { describeContentPRCBase(mData,true); cout << getIndent() << "material_generic_index " << mData.readUnsignedInt() - 1 << endl; cout << getIndent() << "texture_definition_index " << mData.readUnsignedInt() - 1 << endl; cout << getIndent() << "next_texture_index " << mData.readUnsignedInt() - 1 << endl; cout << getIndent() << "UV_coordinates_index " << mData.readUnsignedInt() - 1 << endl; } else { cout << getIndent() << "Invalid section code in material definition." << endl; } } void describeLinePattern(BitByBitData &mData) { cout << getIndent() << "--Line Pattern--" << endl; if(!checkSectionCode(mData,PRC_TYPE_GRAPH_LinePattern)) return; indent(); describeContentPRCBase(mData,true); unsigned int size_lengths = mData.readUnsignedInt(); cout << getIndent() << "size_lengths " << size_lengths << endl; indent(); for(unsigned int i=0;i(mData.readUnsignedInt()-1) << endl; cout << getIndent() << "is_material " << (mData.readBit()?"yes":"no") << endl; cout << getIndent() << "color_index / material_index " << static_cast(mData.readUnsignedInt()-1) << endl; bool is_transparency_defined = mData.readBit(); cout << getIndent() << "is_transparency_defined " << (is_transparency_defined?"yes":"no") << endl; if(is_transparency_defined) { indent(); cout << getIndent() << "transparency " << static_cast(mData.readChar()) << endl; dedent(); } bool is_additional_1_defined = mData.readBit(); cout << getIndent() << "is_additional_1_defined " << (is_additional_1_defined?"yes":"no") << endl; if(is_additional_1_defined) { indent(); cout << getIndent() << "additional_1 " << static_cast(mData.readChar()) << endl; dedent(); } bool is_additional_2_defined = mData.readBit(); cout << getIndent() << "is_additional_2_defined " << (is_additional_2_defined?"yes":"no") << endl; if(is_additional_2_defined) { indent(); cout << getIndent() << "additional_2 " << static_cast(mData.readChar()) << endl; dedent(); } bool is_additional_3_defined = mData.readBit(); cout << getIndent() << "is_additional_3_defined " << (is_additional_3_defined?"yes":"no") << endl; if(is_additional_3_defined) { indent(); cout << getIndent() << "additional_3 " << static_cast(mData.readChar()) << endl; dedent(); } dedent(); } void describeFillPattern(BitByBitData &mData) { cout << getIndent() << "--Fill Pattern--" << endl; unsigned int type = mData.readUnsignedInt(); cout << getIndent() << "type " << type << endl; switch(type) { //TODO: actually describe fill patterns default: cout << getIndent() << "Invalid fill pattern type " << type << endl; } } void describeRepresentationItemContent(BitByBitData &mData) { describeContentPRCBaseWithGraphics(mData,true); unsigned int index_local_coordinate_system = mData.readUnsignedInt()-1; unsigned int index_tessellation = mData.readUnsignedInt()-1; //cast to int will not be right for big indices cout << getIndent() << "index_local_coordinate_system " << static_cast(index_local_coordinate_system) << endl; cout << getIndent() << "index_tessellation " << static_cast(index_tessellation) << endl; } void describeRepresentationItem(BitByBitData &mData) { cout << getIndent() << "--Representation Item--" << endl; unsigned int type = mData.readUnsignedInt(); switch(type) { case PRC_TYPE_RI_Curve: { cout << getIndent() << "--PRC_TYPE_RI_Curve--" << endl; describeRepresentationItemContent(mData); bool has_wire_body = mData.readBit(); if(has_wire_body) { cout << getIndent() << "context_id " << mData.readUnsignedInt() << endl; cout << getIndent() << "body_id " << mData.readUnsignedInt() << endl; } describeUserData(mData); break; } case PRC_TYPE_RI_PolyBrepModel: { cout << getIndent() << "--PRC_TYPE_RI_PolyBrepModel--" << endl; describeRepresentationItemContent(mData); cout << getIndent() << "is_closed " << (mData.readBit()?"yes":"no") << endl; describeUserData(mData); break; } case PRC_TYPE_RI_BrepModel: { cout << getIndent() << "--PRC_TYPE_RI_BrepModel--" << endl; describeRepresentationItemContent(mData); bool has_brep_data = mData.readBit(); cout << getIndent() << "has_brep_data " << (has_brep_data?"yes":"no") << endl; if(has_brep_data) { cout << getIndent() << "context_id " << mData.readUnsignedInt() << endl; cout << getIndent() << "object_id " << mData.readUnsignedInt() << endl; } cout << getIndent() << "is_closed " << (mData.readBit()?"yes":"no") << endl; describeUserData(mData); break; } case PRC_TYPE_RI_Direction: case PRC_TYPE_RI_Plane: case PRC_TYPE_RI_CoordinateSystem: case PRC_TYPE_RI_PointSet: case PRC_TYPE_RI_Set: case PRC_TYPE_RI_PolyWire: cout << getIndent() << "TODO: Unhandled representation item " << type << endl; break; default: cout << getIndent() << "Invalid representation item type " << type << endl; break; } } void describeRGBColour(BitByBitData &mData) { cout << getIndent() << "R: " << mData.readDouble(); cout << " G: " << mData.readDouble(); cout << " B: " << mData.readDouble() << endl; } void describeSchema(BitByBitData &mData) { cout << getIndent() << "--Schema--" << endl; indent(); unsigned int numSchemas = mData.readUnsignedInt(); cout << getIndent() << "Number of Schemas " << numSchemas << endl; if(numSchemas != 0) { cout << "Error: Don't know how to handle multiple schemas." << endl; } dedent(); } string currentName; int layer_index; int index_of_line_style; unsigned short behaviour_bit_field; void resetCurrentGraphics() { layer_index = -1; index_of_line_style = -1; behaviour_bit_field = 1; } void unFlushSerialization() { currentName = ""; resetCurrentGraphics(); } void describeName(BitByBitData &mData) { bool sameNameAsCurrent = mData.readBit(); cout << getIndent() << "Same name as current name? " << (sameNameAsCurrent?"yes":"no") << endl; if(!sameNameAsCurrent) currentName = mData.readString(); cout << getIndent() << "Name \"" << currentName << '\"' << endl; } void describeUnit(BitByBitData &mData) { cout << getIndent() << "Unit is from CAD file? " << (mData.readBit()?"yes":"no") << endl; cout << getIndent() << "Unit is " << mData.readDouble() << " mm" << endl; } void describeAttributes(BitByBitData &mData) { cout << getIndent() << "--Attributes--" << endl; indent(); unsigned int numAttribs = mData.readUnsignedInt(); cout << getIndent() << "Number of Attributes " << numAttribs << endl; indent(); for(unsigned int i = 0; i < numAttribs; ++i) { cout << getIndent() << "PRC_TYPE_MISC_Attribute " << mData.readUnsignedInt() << endl; bool titleIsInt = mData.readBit(); cout << getIndent() << "Title is integer? " << (titleIsInt?"yes":"no") << endl; indent(); if(titleIsInt) { cout << getIndent() << "Title " << mData.readUnsignedInt() << endl; } else { cout << getIndent() << "Title \"" << mData.readString() << '\"' << endl; } unsigned int sizeOfAttributeKeys = mData.readUnsignedInt(); cout << getIndent() << "Size of Attribute Keys " << sizeOfAttributeKeys << endl; for(unsigned int a = 0; a < sizeOfAttributeKeys; ++a) { bool titleIsInt = mData.readBit(); cout << getIndent() << "Title is integer? " << (titleIsInt?"yes":"no") << endl; indent(); if(titleIsInt) { cout << getIndent() << "Title " << mData.readUnsignedInt() << endl; } else { cout << getIndent() << "Title \"" << mData.readString() << '\"' << endl; } dedent(); unsigned int attributeType = mData.readUnsignedInt(); cout << getIndent() << "Attribute Type " << attributeType << endl; switch(attributeType) { case KEPRCModellerAttributeTypeInt: cout << getIndent() << "Attribute Value (int) " << mData.readInt() << endl; break; case KEPRCModellerAttributeTypeReal: cout << getIndent() << "Attribute Value (double) " << mData.readDouble() << endl; break; case KEPRCModellerAttributeTypeTime: cout << getIndent() << "Attribute Value (time_t) " << mData.readUnsignedInt() << endl; break; case KEPRCModellerAttributeTypeString: cout << getIndent() << "Attribute Value (string) \"" << mData.readString() << '\"' << endl; break; default: break; } } dedent(); cout << endl; } dedent(); dedent(); } void describeContentPRCBase(BitByBitData &mData, bool typeEligibleForReference) { cout << getIndent() << "--ContentPRCBase--" << endl; indent(); describeAttributes(mData); describeName(mData); if(typeEligibleForReference) { cout << getIndent() << "CAD_identifier " << mData.readUnsignedInt() << endl; cout << getIndent() << "CAD_persistent_identifier " << mData.readUnsignedInt() << endl; cout << getIndent() << "PRC_unique_identifier " << mData.readUnsignedInt() << endl; } dedent(); } void describeCompressedUniqueID(BitByBitData &mData) { cout << getIndent() << "UUID: " << hex << setfill('0'); for(int i = 0; i < 4; ++i) cout << setw(8) << mData.readUnsignedInt() << ' '; cout << dec << setfill(' ') << endl; } void describeUserData(BitByBitData &mData) { unsigned int bits = mData.readUnsignedInt(); cout << getIndent() << bits << " bits of user data" << endl; indent(); for(unsigned int i = 0; i < bits; ++i) { if(i%64 == 0) cout << getIndent(); cout << mData.readBit(); if(i%64 == 63) cout << endl; } if(bits%64 != 0) cout << endl; dedent(); } bool checkSectionCode(BitByBitData &mData, unsigned int code) { unsigned int num = mData.readUnsignedInt(); if(code != num) { cout << getIndent() << "Invalid section code " << num << ". Expected " << code << " at "; mData.tellPosition(); return false; } else { cout << getIndent() << "Section code " << code << endl; return true; } } unsigned int currentIndent = 0; string getIndent() { ostringstream out; for(unsigned int i = 0; i < currentIndent; ++i) out << " "; return out.str(); } void indent() { ++currentIndent; } void dedent() { --currentIndent; } asymptote-3.05/prc/PRCTools/inflation.h0000644000000000000000000000203315031566105016551 0ustar rootroot/************ * * This file is part of a tool for reading 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #ifndef __INFLATION_H #define __INFLATION_H #include #include #include int decompress(std::istream&,char*&); int decompress(char*,int,char*&); #endif // __INFLATION_H asymptote-3.05/prc/PRCTools/iPRCFile.h0000644000000000000000000000446115031566105016172 0ustar rootroot/************ * * This file is part of a tool for reading 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #ifndef __READPRC_H #define __READPRC_H #include "../include/prc/PRC.h" #include "inflation.h" #include #include #include #include #include #include struct FileStructureInformation { unsigned int UUID[4]; unsigned int reserved; std::vector offsets; }; const int GLOBALS_SECTION = 0; const int TREE_SECTION = 1; const int TESSELLATION_SECTION = 2; const int GEOMETRY_SECTION = 3; const int EXTRA_GEOMETRY_SECTION = 4; struct FileStructure { unsigned int readVersion; unsigned int authoringVersion; unsigned int fileUUID[4]; unsigned int appUUID[4]; char* sections[5]; unsigned int sectionLengths[5]; }; class iPRCFile { public: iPRCFile(std::istream&); ~iPRCFile() { for(unsigned int i = 0; i < fileStructures.size(); ++i) for(unsigned int j = 0; j < 5; ++j) if(fileStructures[i].sections[j] != NULL) free(fileStructures[i].sections[j]); if(modelFileData!=NULL) free(modelFileData); if(buffer != 0) delete[] buffer; } void describe(); void dumpSections(std::string); private: // header data std::vector fileStructureInfos; std::vector fileStructures; unsigned int modelFileOffset; char* modelFileData; unsigned int modelFileLength; char *buffer; unsigned int fileSize; unsigned int numberOfUncompressedFiles; }; #endif // __READPRC_H asymptote-3.05/prc/PRCTools/bitData.h0000644000000000000000000000350415031566105016142 0ustar rootroot/************ * * This file is part of a tool for reading 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #ifndef __BITDATA_H #define __BITDATA_H #include #include struct BitPosition { unsigned int byteIndex; unsigned int bitIndex; }; class BitByBitData { public: BitByBitData(char* s,unsigned int l) : start(s),data(s),length(l), bitMask(0x80),showBits(false),failed(false) {} void tellPosition(); BitPosition getPosition(); void setPosition(const BitPosition&); void setPosition(unsigned int,unsigned int); void setShowBits(bool); bool readBit(); unsigned char readChar(); unsigned int readUnsignedInt(); std::string readString(); int readInt(); double readDouble(); private: char *start; // first byte so we know where we are char *data; // last byte read unsigned int length; unsigned char bitMask; // mask to read next bit of current byte bool showBits; // show each bit read? bool failed; void nextBit(); // shift bit mask and get next byte if needed }; #endif // __BITDATA_H asymptote-3.05/prc/PRCTools/bitSearchDouble.cc0000644000000000000000000000360715031566105017773 0ustar rootroot/************ * * This file is part of a tool for reading 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include #include #include #include "bitData.h" using namespace std; int main(int argc, char *argv[]) { if(argc < 2) { cerr << "Error: Input file not specified." << endl; return 1; } ifstream inFile(argv[1]); if(!inFile) { cerr << "Error: Cannot open input file." << endl; return 1; } inFile.seekg(0,ios::end); unsigned int length = inFile.tellg(); inFile.seekg(0,ios::beg); char *buf = new char[length]; inFile.read(buf,length); BitByBitData bbbd(buf,length); double dsf; cout << "double to search for: "; cin >> dsf; BitPosition currP; for(currP.byteIndex = 0; currP.byteIndex < length; ++currP.byteIndex) for(currP.bitIndex = 0; currP.bitIndex < 8; ++currP.bitIndex) { bbbd.setPosition(currP); if(bbbd.readDouble() == dsf) { BitPosition bp = bbbd.getPosition(); cout << "Found " << dsf << " at " << currP.byteIndex << ':' << currP.bitIndex << " to " << bp.byteIndex << ':' << bp.bitIndex << endl; } } delete[] buf; return 0; } asymptote-3.05/prc/PRCTools/inflation.cc0000644000000000000000000000434415031566105016716 0ustar rootroot/************ * * This file is part of a tool for reading 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include "inflation.h" using std::istream; using std::ios; using std::cout; using std::cerr; using std::endl; using std::exit; int decompress(char* inb, int fileLength, char* &outb) { const int CHUNK = 16384; unsigned int resultSize = 0; outb = (char*) realloc(outb,CHUNK); z_stream strm; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.avail_in = fileLength; strm.next_in = (unsigned char*)inb; strm.opaque = Z_NULL; int code = inflateInit(&strm); if(code != Z_OK) return -1; strm.next_out = (unsigned char*)outb; strm.avail_out = CHUNK; code = inflate(&strm,Z_NO_FLUSH); resultSize = CHUNK-strm.avail_out; unsigned int size = CHUNK; while(code == Z_OK) { outb = (char*) realloc(outb,2*size); if(outb == NULL) { cerr << "Ran out of memory while decompressing." << endl; exit(1); } strm.next_out = (Bytef*)(outb + resultSize); strm.avail_out += size; size *= 2; code = inflate(&strm,Z_NO_FLUSH); resultSize = size - strm.avail_out; } code = inflateEnd(&strm); if(code != Z_OK) { free(outb); return 0; } return resultSize; } int decompress(istream &input,char* &result) { input.seekg(0,ios::end); int fileLength = input.tellg(); input.seekg(0,ios::beg); char *inb = new char[fileLength]; input.read(inb,fileLength); int code = decompress(inb,fileLength,result); delete[] inb; return code; } asymptote-3.05/prc/PRCTools/iPRCFile.cc0000644000000000000000000002113015031566105016320 0ustar rootroot/************ * * This file is part of a tool for reading 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include "bitData.h" #include "iPRCFile.h" #include "describePRC.h" using std::vector; using std::istream; using std::ios; using std::cout; using std::endl; using std::cerr; using std::string; using std::ofstream; using std::ostringstream; void iPRCFile::dumpSections(string prefix) { ofstream out; for(unsigned int i = 0; i < fileStructures.size(); ++i) { ostringstream name; name << prefix << "Structure" << i; out.open((name.str()+"-Globals.bin").c_str()); out.write(fileStructures[i].sections[GLOBALS_SECTION],fileStructures[i].sectionLengths[GLOBALS_SECTION]); out.close(); out.open((name.str()+"-Tree.bin").c_str()); out.write(fileStructures[i].sections[TREE_SECTION],fileStructures[i].sectionLengths[TREE_SECTION]); out.close(); out.open((name.str()+"-Tessellation.bin").c_str()); out.write(fileStructures[i].sections[TESSELLATION_SECTION],fileStructures[i].sectionLengths[TESSELLATION_SECTION]); out.close(); out.open((name.str()+"-Geometry.bin").c_str()); out.write(fileStructures[i].sections[GEOMETRY_SECTION],fileStructures[i].sectionLengths[GEOMETRY_SECTION]); out.close(); out.open((name.str()+"-ExtraGeometry.bin").c_str()); out.write(fileStructures[i].sections[EXTRA_GEOMETRY_SECTION],fileStructures[i].sectionLengths[EXTRA_GEOMETRY_SECTION]); out.close(); } out.open((prefix+"-ModelFile.bin").c_str()); out.write(modelFileData,modelFileLength); out.close(); } void iPRCFile::describe() { /* for(int i = 0; i < modelFileLength; ++i) { cout << ' ' << std::hex << std::setw(2) << std::setfill('0') << static_cast(static_cast(mfd.readChar())); if(i%16 == 15) cout << endl; } cout << endl; */ unFlushSerialization(); for(unsigned int i = 0; i < fileStructures.size(); ++i) { cout << "File Structure " << i << ":" << endl; //describe header char *header = buffer + fileStructureInfos[i].offsets[0]; cout << "--Header Section--" << endl; cout << " Signature " << header[0] << header[1] << header[2] << endl; cout << " Minimal version for read " << *(unsigned int*)(header+3) << endl; cout << " Authoring version " << *(unsigned int*)(header+7) << endl; cout << std::hex; cout << " File structure UUID " << *(unsigned int*)(header+11) << ' ' << *(unsigned int*)(header+15) << ' ' << *(unsigned int*)(header+19) << ' ' << *(unsigned int*)(header+23) << endl; cout << " Application UUID " << *(unsigned int*)(header+27) << ' ' << *(unsigned int*)(header+31) << ' ' << *(unsigned int*)(header+35) << ' ' << *(unsigned int*)(header+39) << endl; cout << std::dec; // uncompressed files unsigned int numberOfUncompressedFiles = *(unsigned int*)(header+43); cout << "Number of uncompressed files " << numberOfUncompressedFiles << endl; char *position = header+47; for(unsigned int j = 0; j < numberOfUncompressedFiles; ++j) { cout << "Uncompressed file " << j << ":" << endl; unsigned int size = *(unsigned int*)position; cout << " size " << size << " bytes" << endl; position += size+sizeof(unsigned int); } BitByBitData fileStruct(fileStructures[i].sections[GLOBALS_SECTION],fileStructures[i].sectionLengths[GLOBALS_SECTION]); describeSchema(fileStruct); describeGlobals(fileStruct); unFlushSerialization(); fileStruct = BitByBitData(fileStructures[i].sections[TREE_SECTION],fileStructures[i].sectionLengths[TREE_SECTION]); describeTree(fileStruct); unFlushSerialization(); fileStruct = BitByBitData(fileStructures[i].sections[TESSELLATION_SECTION],fileStructures[i].sectionLengths[TESSELLATION_SECTION]); describeTessellation(fileStruct); unFlushSerialization(); fileStruct = BitByBitData(fileStructures[i].sections[GEOMETRY_SECTION],fileStructures[i].sectionLengths[GEOMETRY_SECTION]); describeGeometry(fileStruct); unFlushSerialization(); fileStruct = BitByBitData(fileStructures[i].sections[EXTRA_GEOMETRY_SECTION],fileStructures[i].sectionLengths[EXTRA_GEOMETRY_SECTION]); describeExtraGeometry(fileStruct); unFlushSerialization(); } BitByBitData mfd(modelFileData,modelFileLength); describeSchema(mfd); describeModelFileData(mfd,fileStructures.size()); unFlushSerialization(); } iPRCFile::iPRCFile(istream& in) { char PRC[3]; in.read(PRC,3); if(PRC[0] != 'P' || PRC[1] != 'R' || PRC[2] != 'C') { cerr << "Error: Invalid file format: PRC not found." << endl; } unsigned int versionForRead,authoringVersion; in.read((char*)&versionForRead,sizeof(versionForRead)); in.read((char*)&authoringVersion,sizeof(authoringVersion)); cout << "Version for reading " << versionForRead << endl; cout << "Authoring version " << authoringVersion << endl; unsigned int fileStructureUUID[4]; in.read((char*)fileStructureUUID,sizeof(fileStructureUUID)); //(void*) is for formatting cout << "File structure UUID " << (void*)(fileStructureUUID[0]) << ' ' << (void*)(fileStructureUUID[1]) << ' ' << (void*)(fileStructureUUID[2]) << ' ' << (void*)(fileStructureUUID[3]) << endl; unsigned int applicationUUID[4]; in.read((char*)applicationUUID,sizeof(applicationUUID)); cout << "Application UUID " << (void*)(applicationUUID[0]) << ' ' << (void*)(applicationUUID[1]) << ' ' << (void*)(applicationUUID[2]) << ' ' << (void*)(applicationUUID[3]) << endl; unsigned int numberOfFileStructures; in.read((char*)&numberOfFileStructures,sizeof(numberOfFileStructures)); cout << "number of file structures " << numberOfFileStructures << endl; // load fileStructureInformation for(unsigned int fsi = 0; fsi < numberOfFileStructures; ++fsi) { FileStructureInformation info; in.read((char*)&info.UUID,sizeof(info.UUID)); cout << "\tFile structure UUID " << (void*)(info.UUID[0]) << ' ' << (void*)(info.UUID[1]) << ' ' << (void*)(info.UUID[2]) << ' ' << (void*)(info.UUID[3]) << endl; in.read((char*)&info.reserved,sizeof(info.reserved)); cout << "\tReserved " << info.reserved << endl; unsigned int numberOfOffsets; in.read((char*)&numberOfOffsets,sizeof(numberOfOffsets)); cout << "\tNumber of Offsets " << numberOfOffsets << endl; for(unsigned int oi = 0; oi < numberOfOffsets; ++oi) { unsigned int offset; in.read((char*)&offset,sizeof(offset)); info.offsets.push_back(offset); cout << "\t\tOffset " << offset << endl; } fileStructureInfos.push_back(info); } in.read((char*)&modelFileOffset,sizeof(modelFileOffset)); cout << "Model file offset " << modelFileOffset << endl; in.read((char*)&fileSize,sizeof(fileSize)); // this is not documented cout << "File size " << fileSize << endl; in.read((char*)&numberOfUncompressedFiles,sizeof(numberOfUncompressedFiles)); cout << "Number of uncompressed files " << numberOfUncompressedFiles << endl; for(unsigned int ufi = 0; ufi < numberOfUncompressedFiles; ++ufi) { unsigned int size; in.read((char*)&size,sizeof(size)); in.seekg(size,ios::cur); } //read the whole file into memory in.seekg(0,ios::beg); buffer = new char[fileSize]; if(!buffer) cerr << "Couldn't get memory." << endl; in.read(buffer,fileSize); //decompress fileStructures for(unsigned int fs = 0; fs < fileStructureInfos.size(); ++fs) { fileStructures.push_back(FileStructure()); for(unsigned int i = 1; i < fileStructureInfos[fs].offsets.size(); ++i) // start at 1 since header is decompressed { fileStructures[fs].sections[i-1] = NULL; unsigned int offset = fileStructureInfos[fs].offsets[i]; fileStructures[fs].sectionLengths[i-1] = decompress(buffer+offset,fileSize-offset,fileStructures[fs].sections[i-1]); } } //decompress modelFileData modelFileData = NULL; modelFileLength = decompress(buffer+modelFileOffset,fileSize-modelFileOffset,modelFileData); } asymptote-3.05/prc/CMakeLists.txt0000644000000000000000000000140415031566105015511 0ustar rootrootcmake_minimum_required(VERSION 3.27) project(PRC) add_library(PRC ${CMAKE_CURRENT_LIST_DIR}/oPRCFile.cc ${CMAKE_CURRENT_LIST_DIR}/PRCbitStream.cc ${CMAKE_CURRENT_LIST_DIR}/PRCdouble.cc ${CMAKE_CURRENT_LIST_DIR}/writePRC.cc ) find_package(ZLIB REQUIRED) if (CMAKE_CXX_BYTE_ORDER EQUAL BIG_ENDIAN) target_compile_definitions(PRC PUBLIC WORDS_BIGENDIAN=1) elseif (NOT CMAKE_CXX_BYTE_ORDER) # only on apple platforms message(STATUS "Targeting multiple platforms with different endianness") target_compile_definitions(PRC PUBLIC UNIVERSAL_ENDIAN_BUILD) endif() target_include_directories( PRC PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include ) target_link_libraries( PRC PRIVATE ZLIB::ZLIB ) asymptote-3.05/prc/test.asy0000644000000000000000000000013715031566105014450 0ustar rootrootsettings.outformat="pdf"; import embed; label(embed("test.prc","poster,3Droo=25",1500,500)); asymptote-3.05/prc/PRCbitStream.cc0000644000000000000000000002027315031566105015564 0ustar rootroot/************ * * This file is part of a tool for producing 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt and * Michail Vidiassov * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include "prc/PRCbitStream.h" #include "prc/PRCdouble.h" #include #include #include #include #include using std::string; using std::cerr; using std::endl; void PRCbitStream::compress() { const int CHUNK= 1024; // is this reasonable? compressedDataSize = 0; z_stream strm; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; if(deflateInit(&strm,Z_DEFAULT_COMPRESSION) != Z_OK) { cerr << "Compression initialization failed" << endl; return; } unsigned int sizeAvailable = deflateBound(&strm,getSize()); uint8_t *compressedData = (uint8_t*) malloc(sizeAvailable); strm.avail_in = getSize(); strm.next_in = (unsigned char*)data; strm.next_out = (unsigned char*)compressedData; strm.avail_out = sizeAvailable; int code; unsigned int chunks = 0; while((code = deflate(&strm,Z_FINISH)) == Z_OK) { ++chunks; // strm.avail_out should be 0 if we got Z_OK compressedDataSize = sizeAvailable - strm.avail_out; compressedData = (uint8_t*) realloc(compressedData,CHUNK*chunks); strm.next_out = (Bytef*)(compressedData + compressedDataSize); strm.avail_out += CHUNK; sizeAvailable += CHUNK; } compressedDataSize = sizeAvailable-strm.avail_out; if(code != Z_STREAM_END) { cerr << "Compression error" << endl; deflateEnd(&strm); free(compressedData); return; } compressed = true; free(data); data = compressedData; deflateEnd(&strm); } void PRCbitStream::write(std::ostream &out) const { if(compressed) { out.write((char*)data,compressedDataSize); } else { cerr << "Attempt to write stream before compression." << endl; exit(1); } } unsigned int PRCbitStream::getSize() const { if(compressed) return compressedDataSize; else return byteIndex+1; } uint8_t* PRCbitStream::getData() { return data; } PRCbitStream& PRCbitStream::operator <<(bool b) { writeBit(b); return *this; } PRCbitStream& PRCbitStream::operator <<(uint32_t u) { while(u != 0) { writeBit(1); writeByte(u & 0xFF); u >>= 8; } writeBit(0); return *this; } PRCbitStream& PRCbitStream::operator <<(uint8_t u) { writeByte(u); return *this; } PRCbitStream& PRCbitStream::operator <<(int32_t i) { uint8_t lastByte = 0; //while(!((current value is 0 and last byte was positive) OR (current value is -1 and last value was negative))) while(!(((i == 0)&&((lastByte & 0x80)==0))||((i == -1)&&((lastByte & 0x80) != 0)))) { writeBit(1); lastByte = i & 0xFF; writeByte(lastByte); i >>= 8; } writeBit(0); return *this; } PRCbitStream& PRCbitStream::operator <<(double value) { // write a double if(compressed) { cerr << "Cannot write to a stream that has been compressed." << endl; return *this; } union ieee754_double *pid=(union ieee754_double *)&value; int i, fSaveAtEnd; PRCbyte *pb, *pbStart, *pbStop, *pbEnd, *pbResult, bSaveAtEnd = 0; struct sCodageOfFrequentDoubleOrExponent cofdoe, *pcofdoe; cofdoe.u2uod.Value=value; pcofdoe = (struct sCodageOfFrequentDoubleOrExponent *)bsearch( &cofdoe, acofdoe, sizeof(acofdoe)/sizeof(pcofdoe[0]), sizeof(pcofdoe[0]), stCOFDOECompare); while(pcofdoe>acofdoe && EXPONENT(pcofdoe->u2uod.Value)==EXPONENT((pcofdoe-1)->u2uod.Value)) pcofdoe--; assert(pcofdoe); while(pcofdoe->Type==VT_double) { if(fabs(value)==pcofdoe->u2uod.Value) break; pcofdoe++; } for(i=1<<(pcofdoe->NumberOfBits-1);i>=1;i>>=1) writeBit((pcofdoe->Bits&i)!=0); if ( !memcmp(&value,stadwZero,sizeof(value)) || !memcmp(&value,stadwNegativeZero,sizeof(value)) ) return *this; writeBit(pid->ieee.negative); if(pcofdoe->Type==VT_double) return *this; if(pid->ieee.mantissa0==0 && pid->ieee.mantissa1==0) { writeBit(0); return *this; } writeBit(1); #ifdef WORDS_BIGENDIAN pb=((PRCbyte *)&value)+1; #else pb=((PRCbyte *)&value)+6; #endif //add_bits((*pb)&0x0f,4 STAT_V STAT_DOUBLE); writeBits((*pb)&0x0F,4); NEXTBYTE(pb); pbStart=pb; #ifdef WORDS_BIGENDIAN pbEnd= pbStop= ((PRCbyte *)(&value+1))-1; #else pbEnd= pbStop= ((PRCbyte *)&value); #endif if((fSaveAtEnd=(*pbStop!=*BEFOREBYTE(pbStop)))!=0) bSaveAtEnd=*pbEnd; PREVIOUSBYTE(pbStop); while(*pbStop==*BEFOREBYTE(pbStop)) PREVIOUSBYTE(pbStop); for(;MOREBYTE(pb,pbStop);NEXTBYTE(pb)) { if(pb!=pbStart && (pbResult=SEARCHBYTE(BEFOREBYTE(pb),*pb,DIFFPOINTERS(pb,pbStart)))!=NULL) { writeBit(0); writeBits(DIFFPOINTERS(pb,pbResult),3); } else { writeBit(1); writeByte(*pb); } } if(!MOREBYTE(BEFOREBYTE(pbEnd),pbStop)) { if(fSaveAtEnd) { writeBit(0); writeBits(6,3); writeByte(bSaveAtEnd); } else { writeBit(0); writeBits(0,3); } } else { if((pbResult=SEARCHBYTE(BEFOREBYTE(pb),*pb,DIFFPOINTERS(pb,pbStart)))!=NULL) { writeBit(0); writeBits(DIFFPOINTERS(pb,pbResult),3); } else { writeBit(1); writeByte(*pb); } } return *this; } PRCbitStream& PRCbitStream::operator <<(const char* s) { if (s == NULL) { writeBit(false); // string is NULL return *this; } string str(s); *this << str; return *this; } PRCbitStream& PRCbitStream::operator <<(const string& s) { if(s == "") { writeBit(false); // string is NULL return *this; } writeBit(true); size_t l = s.length(); *this << static_cast(l); for(size_t i = 0; i < l; ++i) writeByte(s[i]); return *this; } void PRCbitStream::writeBit(bool b) { if(compressed) { cerr << "Cannot write to a stream that has been compressed." << endl; return; } if(b) { data[byteIndex] |= (0x80 >> bitIndex); } nextBit(); } void PRCbitStream::writeBits(uint32_t u, uint8_t bits) { if(bits > 32) return; else { for(uint32_t mask = (1 << (bits-1)); mask != 0; mask >>= 1) { writeBit((u&mask) != 0); } } } void PRCbitStream::writeByte(uint8_t u) { if(compressed) { cerr << "Cannot write to a stream that has been compressed." << endl; return; } if(bitIndex == 0) { data[byteIndex] = u; nextByte(); } else { data[byteIndex] |= (u >> bitIndex); unsigned int obi = bitIndex; nextByte(); data[byteIndex] |= (u << (8-obi)); bitIndex = obi; // bit index is not changed by writing 8 bits } } void PRCbitStream::nextBit() { ++bitIndex; if(bitIndex == 8) { nextByte(); } } void PRCbitStream::nextByte() { ++byteIndex; if(byteIndex >= allocatedLength) getAChunk(); data[byteIndex] = 0; // clear the garbage data bitIndex = 0; } void PRCbitStream::getAChunk() { if(allocatedLength==0) data = (uint8_t*)realloc((void*)data,CHUNK_SIZE); else data = (uint8_t*)realloc((void*)data,2*allocatedLength); if(data != NULL) { if(allocatedLength==0) { allocatedLength = CHUNK_SIZE; *data = 0; // clear first byte } else allocatedLength *= 2; } else { // warn about memory problem! cerr << "Memory allocation error." << endl; exit(1); } } asymptote-3.05/prc/PRCdouble.cc0000644000000000000000000053214215031566105015107 0ustar rootroot#include "prc/PRCdouble.h" // from Adobe's documentation PRCdword stadwZero[2]={DOUBLEWITHTWODWORD(0x00000000,0x00000000)}; PRCdword stadwNegativeZero[2]={DOUBLEWITHTWODWORD(0x80000000,0x00000000)}; struct sCodageOfFrequentDoubleOrExponent* getcofdoe(unsigned Bits, short NumberOfBits) { struct sCodageOfFrequentDoubleOrExponent *pcofdoe; for(pcofdoe=acofdoe; pcofdoe < acofdoe+NUMBEROFELEMENTINACOFDOE; ++pcofdoe) { if(pcofdoe->NumberOfBits == NumberOfBits && pcofdoe->Bits == Bits) return pcofdoe; } return NULL; } int stCOFDOECompare(const void* pcofdoe1,const void* pcofdoe2) { return(EXPONENT(((const struct sCodageOfFrequentDoubleOrExponent *)pcofdoe1)->u2uod.Value)- EXPONENT(((const struct sCodageOfFrequentDoubleOrExponent *)pcofdoe2)->u2uod.Value)); } #ifdef WORDS_BIGENDIAN #ifndef HAVE_MEMRCHR void *memrchr(const void *buf,int c,size_t count) { unsigned char *pcBuffer=(unsigned char *)buf, *pcBufferEnd=pcBuffer-count; for(;pcBuffer>pcBufferEnd;pcBuffer--) if(*pcBuffer==c) return(pcBuffer); return(NULL); } #endif #endif sCodageOfFrequentDoubleOrExponent acofdoe[NUMBEROFELEMENTINACOFDOE] = { {VT_double,2,0x1,{DOUBLEWITHTWODWORDINTREE(0x00000000,0x00000000)}}, {VT_exponent,22,0xd1d32,{DOUBLEWITHTWODWORDINTREE(0x00000000,0x00000000)}}, {VT_exponent,22,0xd1d33,{DOUBLEWITHTWODWORDINTREE(0x00100000,0x00000000)}}, {VT_exponent,22,0xf78d8,{DOUBLEWITHTWODWORDINTREE(0x00200000,0x00000000)}}, {VT_exponent,22,0xf78d9,{DOUBLEWITHTWODWORDINTREE(0x00300000,0x00000000)}}, {VT_exponent,22,0xf78da,{DOUBLEWITHTWODWORDINTREE(0x00400000,0x00000000)}}, {VT_exponent,22,0xf78db,{DOUBLEWITHTWODWORDINTREE(0x00500000,0x00000000)}}, {VT_exponent,22,0xf78dc,{DOUBLEWITHTWODWORDINTREE(0x00600000,0x00000000)}}, {VT_exponent,22,0xf78dd,{DOUBLEWITHTWODWORDINTREE(0x00700000,0x00000000)}}, {VT_exponent,22,0xf78de,{DOUBLEWITHTWODWORDINTREE(0x00800000,0x00000000)}}, {VT_exponent,22,0xf78df,{DOUBLEWITHTWODWORDINTREE(0x00900000,0x00000000)}}, {VT_exponent,22,0xf78e0,{DOUBLEWITHTWODWORDINTREE(0x00a00000,0x00000000)}}, {VT_exponent,22,0xf78e1,{DOUBLEWITHTWODWORDINTREE(0x00b00000,0x00000000)}}, {VT_exponent,22,0xf78e2,{DOUBLEWITHTWODWORDINTREE(0x00c00000,0x00000000)}}, {VT_exponent,22,0xf78e3,{DOUBLEWITHTWODWORDINTREE(0x00d00000,0x00000000)}}, {VT_exponent,22,0xf78e4,{DOUBLEWITHTWODWORDINTREE(0x00e00000,0x00000000)}}, {VT_exponent,22,0xf78e5,{DOUBLEWITHTWODWORDINTREE(0x00f00000,0x00000000)}}, {VT_exponent,22,0xf78e6,{DOUBLEWITHTWODWORDINTREE(0x01000000,0x00000000)}}, {VT_exponent,22,0xf78e7,{DOUBLEWITHTWODWORDINTREE(0x01100000,0x00000000)}}, {VT_exponent,22,0xf78e8,{DOUBLEWITHTWODWORDINTREE(0x01200000,0x00000000)}}, {VT_exponent,22,0xf78e9,{DOUBLEWITHTWODWORDINTREE(0x01300000,0x00000000)}}, {VT_exponent,22,0xf78ea,{DOUBLEWITHTWODWORDINTREE(0x01400000,0x00000000)}}, {VT_exponent,22,0xf78eb,{DOUBLEWITHTWODWORDINTREE(0x01500000,0x00000000)}}, {VT_exponent,22,0xf78ec,{DOUBLEWITHTWODWORDINTREE(0x01600000,0x00000000)}}, {VT_exponent,22,0xf78ed,{DOUBLEWITHTWODWORDINTREE(0x01700000,0x00000000)}}, {VT_exponent,22,0xf78ee,{DOUBLEWITHTWODWORDINTREE(0x01800000,0x00000000)}}, {VT_exponent,22,0xf78ef,{DOUBLEWITHTWODWORDINTREE(0x01900000,0x00000000)}}, {VT_exponent,22,0xf78f0,{DOUBLEWITHTWODWORDINTREE(0x01a00000,0x00000000)}}, {VT_exponent,22,0xf78f1,{DOUBLEWITHTWODWORDINTREE(0x01b00000,0x00000000)}}, {VT_exponent,22,0xf78f2,{DOUBLEWITHTWODWORDINTREE(0x01c00000,0x00000000)}}, {VT_exponent,22,0xf78f3,{DOUBLEWITHTWODWORDINTREE(0x01d00000,0x00000000)}}, {VT_exponent,22,0xf78f4,{DOUBLEWITHTWODWORDINTREE(0x01e00000,0x00000000)}}, {VT_exponent,22,0xf78f5,{DOUBLEWITHTWODWORDINTREE(0x01f00000,0x00000000)}}, {VT_exponent,22,0xf78f6,{DOUBLEWITHTWODWORDINTREE(0x02000000,0x00000000)}}, {VT_exponent,22,0xf78f7,{DOUBLEWITHTWODWORDINTREE(0x02100000,0x00000000)}}, {VT_exponent,22,0xf78f8,{DOUBLEWITHTWODWORDINTREE(0x02200000,0x00000000)}}, {VT_exponent,22,0xf78f9,{DOUBLEWITHTWODWORDINTREE(0x02300000,0x00000000)}}, {VT_exponent,22,0xf78fa,{DOUBLEWITHTWODWORDINTREE(0x02400000,0x00000000)}}, {VT_exponent,22,0xf78fb,{DOUBLEWITHTWODWORDINTREE(0x02500000,0x00000000)}}, {VT_exponent,22,0xf78fc,{DOUBLEWITHTWODWORDINTREE(0x02600000,0x00000000)}}, {VT_exponent,22,0xf78fd,{DOUBLEWITHTWODWORDINTREE(0x02700000,0x00000000)}}, {VT_exponent,22,0xf78fe,{DOUBLEWITHTWODWORDINTREE(0x02800000,0x00000000)}}, {VT_exponent,22,0xf78ff,{DOUBLEWITHTWODWORDINTREE(0x02900000,0x00000000)}}, {VT_exponent,22,0x3a8300,{DOUBLEWITHTWODWORDINTREE(0x02a00000,0x00000000)}}, {VT_exponent,22,0x3a8301,{DOUBLEWITHTWODWORDINTREE(0x02b00000,0x00000000)}}, {VT_exponent,22,0x3a8302,{DOUBLEWITHTWODWORDINTREE(0x02c00000,0x00000000)}}, {VT_exponent,22,0x3a8303,{DOUBLEWITHTWODWORDINTREE(0x02d00000,0x00000000)}}, {VT_exponent,22,0x3a8304,{DOUBLEWITHTWODWORDINTREE(0x02e00000,0x00000000)}}, {VT_exponent,22,0x3a8305,{DOUBLEWITHTWODWORDINTREE(0x02f00000,0x00000000)}}, {VT_exponent,22,0x3a8306,{DOUBLEWITHTWODWORDINTREE(0x03000000,0x00000000)}}, {VT_exponent,22,0x3a8307,{DOUBLEWITHTWODWORDINTREE(0x03100000,0x00000000)}}, {VT_exponent,22,0x3a8308,{DOUBLEWITHTWODWORDINTREE(0x03200000,0x00000000)}}, {VT_exponent,22,0x3a8309,{DOUBLEWITHTWODWORDINTREE(0x03300000,0x00000000)}}, {VT_exponent,22,0x3a830a,{DOUBLEWITHTWODWORDINTREE(0x03400000,0x00000000)}}, {VT_exponent,22,0x3a830b,{DOUBLEWITHTWODWORDINTREE(0x03500000,0x00000000)}}, {VT_exponent,22,0x3a830c,{DOUBLEWITHTWODWORDINTREE(0x03600000,0x00000000)}}, {VT_exponent,22,0x3a830d,{DOUBLEWITHTWODWORDINTREE(0x03700000,0x00000000)}}, {VT_exponent,22,0x3a830e,{DOUBLEWITHTWODWORDINTREE(0x03800000,0x00000000)}}, {VT_exponent,22,0x3a830f,{DOUBLEWITHTWODWORDINTREE(0x03900000,0x00000000)}}, {VT_exponent,22,0x3a8310,{DOUBLEWITHTWODWORDINTREE(0x03a00000,0x00000000)}}, {VT_exponent,22,0x3a8311,{DOUBLEWITHTWODWORDINTREE(0x03b00000,0x00000000)}}, {VT_exponent,22,0x3a8312,{DOUBLEWITHTWODWORDINTREE(0x03c00000,0x00000000)}}, {VT_exponent,22,0x3a8313,{DOUBLEWITHTWODWORDINTREE(0x03d00000,0x00000000)}}, {VT_exponent,22,0x3a8314,{DOUBLEWITHTWODWORDINTREE(0x03e00000,0x00000000)}}, {VT_exponent,22,0x3a8315,{DOUBLEWITHTWODWORDINTREE(0x03f00000,0x00000000)}}, {VT_exponent,22,0x3a8316,{DOUBLEWITHTWODWORDINTREE(0x04000000,0x00000000)}}, {VT_exponent,22,0x3a8317,{DOUBLEWITHTWODWORDINTREE(0x04100000,0x00000000)}}, {VT_exponent,22,0x3a8318,{DOUBLEWITHTWODWORDINTREE(0x04200000,0x00000000)}}, {VT_exponent,22,0x3a8319,{DOUBLEWITHTWODWORDINTREE(0x04300000,0x00000000)}}, {VT_exponent,22,0x3a831a,{DOUBLEWITHTWODWORDINTREE(0x04400000,0x00000000)}}, {VT_exponent,22,0x3a831b,{DOUBLEWITHTWODWORDINTREE(0x04500000,0x00000000)}}, {VT_exponent,22,0x3a831c,{DOUBLEWITHTWODWORDINTREE(0x04600000,0x00000000)}}, {VT_exponent,22,0x3a831d,{DOUBLEWITHTWODWORDINTREE(0x04700000,0x00000000)}}, {VT_exponent,22,0x3a831e,{DOUBLEWITHTWODWORDINTREE(0x04800000,0x00000000)}}, {VT_exponent,22,0x3a831f,{DOUBLEWITHTWODWORDINTREE(0x04900000,0x00000000)}}, {VT_exponent,22,0x3a8320,{DOUBLEWITHTWODWORDINTREE(0x04a00000,0x00000000)}}, {VT_exponent,22,0x3a8321,{DOUBLEWITHTWODWORDINTREE(0x04b00000,0x00000000)}}, {VT_exponent,22,0x3a8322,{DOUBLEWITHTWODWORDINTREE(0x04c00000,0x00000000)}}, {VT_exponent,22,0x3a8323,{DOUBLEWITHTWODWORDINTREE(0x04d00000,0x00000000)}}, {VT_exponent,22,0x3a8324,{DOUBLEWITHTWODWORDINTREE(0x04e00000,0x00000000)}}, {VT_exponent,22,0x3a8325,{DOUBLEWITHTWODWORDINTREE(0x04f00000,0x00000000)}}, {VT_exponent,22,0x3a8326,{DOUBLEWITHTWODWORDINTREE(0x05000000,0x00000000)}}, {VT_exponent,22,0x3a8327,{DOUBLEWITHTWODWORDINTREE(0x05100000,0x00000000)}}, {VT_exponent,22,0x3a8328,{DOUBLEWITHTWODWORDINTREE(0x05200000,0x00000000)}}, {VT_exponent,22,0x3a8329,{DOUBLEWITHTWODWORDINTREE(0x05300000,0x00000000)}}, {VT_exponent,22,0x3a832a,{DOUBLEWITHTWODWORDINTREE(0x05400000,0x00000000)}}, {VT_exponent,22,0x3a832b,{DOUBLEWITHTWODWORDINTREE(0x05500000,0x00000000)}}, {VT_exponent,22,0x3a832c,{DOUBLEWITHTWODWORDINTREE(0x05600000,0x00000000)}}, {VT_exponent,22,0x3a832d,{DOUBLEWITHTWODWORDINTREE(0x05700000,0x00000000)}}, {VT_exponent,22,0x3a832e,{DOUBLEWITHTWODWORDINTREE(0x05800000,0x00000000)}}, {VT_exponent,22,0x3a832f,{DOUBLEWITHTWODWORDINTREE(0x05900000,0x00000000)}}, {VT_exponent,22,0x3a8330,{DOUBLEWITHTWODWORDINTREE(0x05a00000,0x00000000)}}, {VT_exponent,22,0x3a8331,{DOUBLEWITHTWODWORDINTREE(0x05b00000,0x00000000)}}, {VT_exponent,22,0x3a8332,{DOUBLEWITHTWODWORDINTREE(0x05c00000,0x00000000)}}, {VT_exponent,22,0x3a8333,{DOUBLEWITHTWODWORDINTREE(0x05d00000,0x00000000)}}, {VT_exponent,22,0x3a8334,{DOUBLEWITHTWODWORDINTREE(0x05e00000,0x00000000)}}, {VT_exponent,22,0x3a8335,{DOUBLEWITHTWODWORDINTREE(0x05f00000,0x00000000)}}, {VT_exponent,22,0x3a8336,{DOUBLEWITHTWODWORDINTREE(0x06000000,0x00000000)}}, {VT_exponent,22,0x3a8337,{DOUBLEWITHTWODWORDINTREE(0x06100000,0x00000000)}}, {VT_exponent,22,0x3a8338,{DOUBLEWITHTWODWORDINTREE(0x06200000,0x00000000)}}, {VT_exponent,22,0x3a8339,{DOUBLEWITHTWODWORDINTREE(0x06300000,0x00000000)}}, {VT_exponent,22,0x3a833a,{DOUBLEWITHTWODWORDINTREE(0x06400000,0x00000000)}}, {VT_exponent,22,0x3a833b,{DOUBLEWITHTWODWORDINTREE(0x06500000,0x00000000)}}, {VT_exponent,22,0x3a833c,{DOUBLEWITHTWODWORDINTREE(0x06600000,0x00000000)}}, {VT_exponent,22,0x3a833d,{DOUBLEWITHTWODWORDINTREE(0x06700000,0x00000000)}}, {VT_exponent,22,0x3a833e,{DOUBLEWITHTWODWORDINTREE(0x06800000,0x00000000)}}, {VT_exponent,22,0x3a833f,{DOUBLEWITHTWODWORDINTREE(0x06900000,0x00000000)}}, {VT_exponent,22,0x3a8340,{DOUBLEWITHTWODWORDINTREE(0x06a00000,0x00000000)}}, {VT_exponent,22,0x3a8341,{DOUBLEWITHTWODWORDINTREE(0x06b00000,0x00000000)}}, {VT_exponent,22,0x3a8342,{DOUBLEWITHTWODWORDINTREE(0x06c00000,0x00000000)}}, {VT_exponent,22,0x3a8343,{DOUBLEWITHTWODWORDINTREE(0x06d00000,0x00000000)}}, {VT_exponent,22,0x3a8344,{DOUBLEWITHTWODWORDINTREE(0x06e00000,0x00000000)}}, {VT_exponent,22,0x3a8345,{DOUBLEWITHTWODWORDINTREE(0x06f00000,0x00000000)}}, {VT_exponent,22,0x3a8346,{DOUBLEWITHTWODWORDINTREE(0x07000000,0x00000000)}}, {VT_exponent,22,0x3a8347,{DOUBLEWITHTWODWORDINTREE(0x07100000,0x00000000)}}, {VT_exponent,22,0x3a8348,{DOUBLEWITHTWODWORDINTREE(0x07200000,0x00000000)}}, {VT_exponent,22,0x3a8349,{DOUBLEWITHTWODWORDINTREE(0x07300000,0x00000000)}}, {VT_exponent,22,0x3a834a,{DOUBLEWITHTWODWORDINTREE(0x07400000,0x00000000)}}, {VT_exponent,22,0x3a834b,{DOUBLEWITHTWODWORDINTREE(0x07500000,0x00000000)}}, {VT_exponent,22,0x3a834c,{DOUBLEWITHTWODWORDINTREE(0x07600000,0x00000000)}}, {VT_exponent,22,0x3a834d,{DOUBLEWITHTWODWORDINTREE(0x07700000,0x00000000)}}, {VT_exponent,22,0x3a834e,{DOUBLEWITHTWODWORDINTREE(0x07800000,0x00000000)}}, {VT_exponent,22,0x3a834f,{DOUBLEWITHTWODWORDINTREE(0x07900000,0x00000000)}}, {VT_exponent,22,0x3a8350,{DOUBLEWITHTWODWORDINTREE(0x07a00000,0x00000000)}}, {VT_exponent,22,0x3a8351,{DOUBLEWITHTWODWORDINTREE(0x07b00000,0x00000000)}}, {VT_exponent,22,0x3a8352,{DOUBLEWITHTWODWORDINTREE(0x07c00000,0x00000000)}}, {VT_exponent,22,0x3a8353,{DOUBLEWITHTWODWORDINTREE(0x07d00000,0x00000000)}}, {VT_exponent,22,0x3a8354,{DOUBLEWITHTWODWORDINTREE(0x07e00000,0x00000000)}}, {VT_exponent,22,0x3a8355,{DOUBLEWITHTWODWORDINTREE(0x07f00000,0x00000000)}}, {VT_exponent,22,0x3a8356,{DOUBLEWITHTWODWORDINTREE(0x08000000,0x00000000)}}, {VT_exponent,22,0x3a8357,{DOUBLEWITHTWODWORDINTREE(0x08100000,0x00000000)}}, {VT_exponent,22,0x3a8358,{DOUBLEWITHTWODWORDINTREE(0x08200000,0x00000000)}}, {VT_exponent,22,0x3a8359,{DOUBLEWITHTWODWORDINTREE(0x08300000,0x00000000)}}, {VT_exponent,22,0x3a835a,{DOUBLEWITHTWODWORDINTREE(0x08400000,0x00000000)}}, {VT_exponent,22,0x3a835b,{DOUBLEWITHTWODWORDINTREE(0x08500000,0x00000000)}}, {VT_exponent,22,0x3a835c,{DOUBLEWITHTWODWORDINTREE(0x08600000,0x00000000)}}, {VT_exponent,22,0x3a835d,{DOUBLEWITHTWODWORDINTREE(0x08700000,0x00000000)}}, {VT_exponent,22,0x3a835e,{DOUBLEWITHTWODWORDINTREE(0x08800000,0x00000000)}}, {VT_exponent,22,0x3a835f,{DOUBLEWITHTWODWORDINTREE(0x08900000,0x00000000)}}, {VT_exponent,22,0x3a8360,{DOUBLEWITHTWODWORDINTREE(0x08a00000,0x00000000)}}, {VT_exponent,22,0x3a8361,{DOUBLEWITHTWODWORDINTREE(0x08b00000,0x00000000)}}, {VT_exponent,22,0x3a8362,{DOUBLEWITHTWODWORDINTREE(0x08c00000,0x00000000)}}, {VT_exponent,22,0x3a8363,{DOUBLEWITHTWODWORDINTREE(0x08d00000,0x00000000)}}, {VT_exponent,22,0x3a8364,{DOUBLEWITHTWODWORDINTREE(0x08e00000,0x00000000)}}, {VT_exponent,22,0x3a8365,{DOUBLEWITHTWODWORDINTREE(0x08f00000,0x00000000)}}, {VT_exponent,22,0x3a8366,{DOUBLEWITHTWODWORDINTREE(0x09000000,0x00000000)}}, {VT_exponent,22,0x3a8367,{DOUBLEWITHTWODWORDINTREE(0x09100000,0x00000000)}}, {VT_exponent,22,0x3a8368,{DOUBLEWITHTWODWORDINTREE(0x09200000,0x00000000)}}, {VT_exponent,22,0x3a8369,{DOUBLEWITHTWODWORDINTREE(0x09300000,0x00000000)}}, {VT_exponent,22,0x3a836a,{DOUBLEWITHTWODWORDINTREE(0x09400000,0x00000000)}}, {VT_exponent,22,0x3a836b,{DOUBLEWITHTWODWORDINTREE(0x09500000,0x00000000)}}, {VT_exponent,22,0x3a836c,{DOUBLEWITHTWODWORDINTREE(0x09600000,0x00000000)}}, {VT_exponent,22,0x3a836d,{DOUBLEWITHTWODWORDINTREE(0x09700000,0x00000000)}}, {VT_exponent,22,0x3a836e,{DOUBLEWITHTWODWORDINTREE(0x09800000,0x00000000)}}, {VT_exponent,22,0x3a836f,{DOUBLEWITHTWODWORDINTREE(0x09900000,0x00000000)}}, {VT_exponent,22,0x3a8370,{DOUBLEWITHTWODWORDINTREE(0x09a00000,0x00000000)}}, {VT_exponent,22,0x3a8371,{DOUBLEWITHTWODWORDINTREE(0x09b00000,0x00000000)}}, {VT_exponent,22,0x3a8372,{DOUBLEWITHTWODWORDINTREE(0x09c00000,0x00000000)}}, {VT_exponent,22,0x3a8373,{DOUBLEWITHTWODWORDINTREE(0x09d00000,0x00000000)}}, {VT_exponent,22,0x3a8374,{DOUBLEWITHTWODWORDINTREE(0x09e00000,0x00000000)}}, {VT_exponent,22,0x3a8375,{DOUBLEWITHTWODWORDINTREE(0x09f00000,0x00000000)}}, {VT_exponent,22,0x3a8376,{DOUBLEWITHTWODWORDINTREE(0x0a000000,0x00000000)}}, {VT_exponent,22,0x3a8377,{DOUBLEWITHTWODWORDINTREE(0x0a100000,0x00000000)}}, {VT_exponent,22,0x3a8378,{DOUBLEWITHTWODWORDINTREE(0x0a200000,0x00000000)}}, {VT_exponent,22,0x3a8379,{DOUBLEWITHTWODWORDINTREE(0x0a300000,0x00000000)}}, {VT_exponent,22,0x3a837a,{DOUBLEWITHTWODWORDINTREE(0x0a400000,0x00000000)}}, {VT_exponent,22,0x3a837b,{DOUBLEWITHTWODWORDINTREE(0x0a500000,0x00000000)}}, {VT_exponent,22,0x3a837c,{DOUBLEWITHTWODWORDINTREE(0x0a600000,0x00000000)}}, {VT_exponent,22,0x3a837d,{DOUBLEWITHTWODWORDINTREE(0x0a700000,0x00000000)}}, {VT_exponent,22,0x3a837e,{DOUBLEWITHTWODWORDINTREE(0x0a800000,0x00000000)}}, {VT_exponent,22,0x3a837f,{DOUBLEWITHTWODWORDINTREE(0x0a900000,0x00000000)}}, {VT_exponent,22,0x3a8380,{DOUBLEWITHTWODWORDINTREE(0x0aa00000,0x00000000)}}, {VT_exponent,22,0x3a8381,{DOUBLEWITHTWODWORDINTREE(0x0ab00000,0x00000000)}}, {VT_exponent,22,0x3a8382,{DOUBLEWITHTWODWORDINTREE(0x0ac00000,0x00000000)}}, {VT_exponent,22,0x3a8383,{DOUBLEWITHTWODWORDINTREE(0x0ad00000,0x00000000)}}, {VT_exponent,22,0x3a8384,{DOUBLEWITHTWODWORDINTREE(0x0ae00000,0x00000000)}}, {VT_exponent,22,0x3a8385,{DOUBLEWITHTWODWORDINTREE(0x0af00000,0x00000000)}}, {VT_exponent,22,0x3a8386,{DOUBLEWITHTWODWORDINTREE(0x0b000000,0x00000000)}}, {VT_exponent,22,0x3a8387,{DOUBLEWITHTWODWORDINTREE(0x0b100000,0x00000000)}}, {VT_exponent,22,0x3a8388,{DOUBLEWITHTWODWORDINTREE(0x0b200000,0x00000000)}}, {VT_exponent,22,0x3a8389,{DOUBLEWITHTWODWORDINTREE(0x0b300000,0x00000000)}}, {VT_exponent,22,0x3a838a,{DOUBLEWITHTWODWORDINTREE(0x0b400000,0x00000000)}}, {VT_exponent,22,0x3a838b,{DOUBLEWITHTWODWORDINTREE(0x0b500000,0x00000000)}}, {VT_exponent,22,0x3a838c,{DOUBLEWITHTWODWORDINTREE(0x0b600000,0x00000000)}}, {VT_exponent,22,0x3a838d,{DOUBLEWITHTWODWORDINTREE(0x0b700000,0x00000000)}}, {VT_exponent,22,0x3a838e,{DOUBLEWITHTWODWORDINTREE(0x0b800000,0x00000000)}}, {VT_exponent,22,0x3a838f,{DOUBLEWITHTWODWORDINTREE(0x0b900000,0x00000000)}}, {VT_exponent,22,0x3a8390,{DOUBLEWITHTWODWORDINTREE(0x0ba00000,0x00000000)}}, {VT_exponent,22,0x3a8391,{DOUBLEWITHTWODWORDINTREE(0x0bb00000,0x00000000)}}, {VT_exponent,22,0x3a8392,{DOUBLEWITHTWODWORDINTREE(0x0bc00000,0x00000000)}}, {VT_exponent,22,0x3a8393,{DOUBLEWITHTWODWORDINTREE(0x0bd00000,0x00000000)}}, {VT_exponent,22,0x3a8394,{DOUBLEWITHTWODWORDINTREE(0x0be00000,0x00000000)}}, {VT_exponent,22,0x3a8395,{DOUBLEWITHTWODWORDINTREE(0x0bf00000,0x00000000)}}, {VT_exponent,22,0x3a8396,{DOUBLEWITHTWODWORDINTREE(0x0c000000,0x00000000)}}, {VT_exponent,22,0x3a8397,{DOUBLEWITHTWODWORDINTREE(0x0c100000,0x00000000)}}, {VT_exponent,22,0x3a8398,{DOUBLEWITHTWODWORDINTREE(0x0c200000,0x00000000)}}, {VT_exponent,22,0x3a8399,{DOUBLEWITHTWODWORDINTREE(0x0c300000,0x00000000)}}, {VT_exponent,22,0x3a839a,{DOUBLEWITHTWODWORDINTREE(0x0c400000,0x00000000)}}, {VT_exponent,22,0x3a839b,{DOUBLEWITHTWODWORDINTREE(0x0c500000,0x00000000)}}, {VT_exponent,22,0x3a839c,{DOUBLEWITHTWODWORDINTREE(0x0c600000,0x00000000)}}, {VT_exponent,22,0x3a839d,{DOUBLEWITHTWODWORDINTREE(0x0c700000,0x00000000)}}, {VT_exponent,22,0x3a839e,{DOUBLEWITHTWODWORDINTREE(0x0c800000,0x00000000)}}, {VT_exponent,22,0x3a839f,{DOUBLEWITHTWODWORDINTREE(0x0c900000,0x00000000)}}, {VT_exponent,22,0x3a83a0,{DOUBLEWITHTWODWORDINTREE(0x0ca00000,0x00000000)}}, {VT_exponent,22,0x3a83a1,{DOUBLEWITHTWODWORDINTREE(0x0cb00000,0x00000000)}}, {VT_exponent,22,0x3a83a2,{DOUBLEWITHTWODWORDINTREE(0x0cc00000,0x00000000)}}, {VT_exponent,22,0x3a83a3,{DOUBLEWITHTWODWORDINTREE(0x0cd00000,0x00000000)}}, {VT_exponent,22,0x3a83a4,{DOUBLEWITHTWODWORDINTREE(0x0ce00000,0x00000000)}}, {VT_exponent,22,0x3a83a5,{DOUBLEWITHTWODWORDINTREE(0x0cf00000,0x00000000)}}, {VT_exponent,22,0x3a83a6,{DOUBLEWITHTWODWORDINTREE(0x0d000000,0x00000000)}}, {VT_exponent,22,0x3a83a7,{DOUBLEWITHTWODWORDINTREE(0x0d100000,0x00000000)}}, {VT_exponent,22,0x3a83a8,{DOUBLEWITHTWODWORDINTREE(0x0d200000,0x00000000)}}, {VT_exponent,22,0x3a83a9,{DOUBLEWITHTWODWORDINTREE(0x0d300000,0x00000000)}}, {VT_exponent,22,0x3a83aa,{DOUBLEWITHTWODWORDINTREE(0x0d400000,0x00000000)}}, {VT_exponent,22,0x3a83ab,{DOUBLEWITHTWODWORDINTREE(0x0d500000,0x00000000)}}, {VT_exponent,22,0x3a83ac,{DOUBLEWITHTWODWORDINTREE(0x0d600000,0x00000000)}}, {VT_exponent,22,0x3a83ad,{DOUBLEWITHTWODWORDINTREE(0x0d700000,0x00000000)}}, {VT_exponent,22,0x3a83ae,{DOUBLEWITHTWODWORDINTREE(0x0d800000,0x00000000)}}, {VT_exponent,22,0x3a83af,{DOUBLEWITHTWODWORDINTREE(0x0d900000,0x00000000)}}, {VT_exponent,22,0x3a83b0,{DOUBLEWITHTWODWORDINTREE(0x0da00000,0x00000000)}}, {VT_exponent,22,0x3a83b1,{DOUBLEWITHTWODWORDINTREE(0x0db00000,0x00000000)}}, {VT_exponent,22,0x3a83b2,{DOUBLEWITHTWODWORDINTREE(0x0dc00000,0x00000000)}}, {VT_exponent,22,0x3a83b3,{DOUBLEWITHTWODWORDINTREE(0x0dd00000,0x00000000)}}, {VT_exponent,22,0x3a83b4,{DOUBLEWITHTWODWORDINTREE(0x0de00000,0x00000000)}}, {VT_exponent,22,0x3a83b5,{DOUBLEWITHTWODWORDINTREE(0x0df00000,0x00000000)}}, {VT_exponent,22,0x3a83b6,{DOUBLEWITHTWODWORDINTREE(0x0e000000,0x00000000)}}, {VT_exponent,22,0x3a83b7,{DOUBLEWITHTWODWORDINTREE(0x0e100000,0x00000000)}}, {VT_exponent,22,0x3a83b8,{DOUBLEWITHTWODWORDINTREE(0x0e200000,0x00000000)}}, {VT_exponent,22,0x3a83b9,{DOUBLEWITHTWODWORDINTREE(0x0e300000,0x00000000)}}, {VT_exponent,22,0x3a83ba,{DOUBLEWITHTWODWORDINTREE(0x0e400000,0x00000000)}}, {VT_exponent,22,0x3a83bb,{DOUBLEWITHTWODWORDINTREE(0x0e500000,0x00000000)}}, {VT_exponent,22,0x3a83bc,{DOUBLEWITHTWODWORDINTREE(0x0e600000,0x00000000)}}, {VT_exponent,22,0x3a83bd,{DOUBLEWITHTWODWORDINTREE(0x0e700000,0x00000000)}}, {VT_exponent,22,0x3a83be,{DOUBLEWITHTWODWORDINTREE(0x0e800000,0x00000000)}}, {VT_exponent,22,0x3a83bf,{DOUBLEWITHTWODWORDINTREE(0x0e900000,0x00000000)}}, {VT_exponent,22,0x3a83c0,{DOUBLEWITHTWODWORDINTREE(0x0ea00000,0x00000000)}}, {VT_exponent,22,0x3a83c1,{DOUBLEWITHTWODWORDINTREE(0x0eb00000,0x00000000)}}, {VT_exponent,22,0x3a83c2,{DOUBLEWITHTWODWORDINTREE(0x0ec00000,0x00000000)}}, {VT_exponent,22,0x3a83c3,{DOUBLEWITHTWODWORDINTREE(0x0ed00000,0x00000000)}}, {VT_exponent,22,0x3a83c4,{DOUBLEWITHTWODWORDINTREE(0x0ee00000,0x00000000)}}, {VT_exponent,22,0x3a83c5,{DOUBLEWITHTWODWORDINTREE(0x0ef00000,0x00000000)}}, {VT_exponent,22,0x3a83c6,{DOUBLEWITHTWODWORDINTREE(0x0f000000,0x00000000)}}, {VT_exponent,22,0x3a83c7,{DOUBLEWITHTWODWORDINTREE(0x0f100000,0x00000000)}}, {VT_exponent,22,0x3a83c8,{DOUBLEWITHTWODWORDINTREE(0x0f200000,0x00000000)}}, {VT_exponent,22,0x3a83c9,{DOUBLEWITHTWODWORDINTREE(0x0f300000,0x00000000)}}, {VT_exponent,22,0x3a83ca,{DOUBLEWITHTWODWORDINTREE(0x0f400000,0x00000000)}}, {VT_exponent,22,0x3a83cb,{DOUBLEWITHTWODWORDINTREE(0x0f500000,0x00000000)}}, {VT_exponent,22,0x3a83cc,{DOUBLEWITHTWODWORDINTREE(0x0f600000,0x00000000)}}, {VT_exponent,22,0x3a83cd,{DOUBLEWITHTWODWORDINTREE(0x0f700000,0x00000000)}}, {VT_exponent,22,0x3a83ce,{DOUBLEWITHTWODWORDINTREE(0x0f800000,0x00000000)}}, {VT_exponent,22,0x3a83cf,{DOUBLEWITHTWODWORDINTREE(0x0f900000,0x00000000)}}, {VT_exponent,22,0x3a83d0,{DOUBLEWITHTWODWORDINTREE(0x0fa00000,0x00000000)}}, {VT_exponent,22,0x3a83d1,{DOUBLEWITHTWODWORDINTREE(0x0fb00000,0x00000000)}}, {VT_exponent,22,0x3a83d2,{DOUBLEWITHTWODWORDINTREE(0x0fc00000,0x00000000)}}, {VT_exponent,22,0x3a83d3,{DOUBLEWITHTWODWORDINTREE(0x0fd00000,0x00000000)}}, {VT_exponent,22,0x3a83d4,{DOUBLEWITHTWODWORDINTREE(0x0fe00000,0x00000000)}}, {VT_exponent,22,0x3a83d5,{DOUBLEWITHTWODWORDINTREE(0x0ff00000,0x00000000)}}, {VT_exponent,22,0x3a83d6,{DOUBLEWITHTWODWORDINTREE(0x10000000,0x00000000)}}, {VT_exponent,22,0x3a83d7,{DOUBLEWITHTWODWORDINTREE(0x10100000,0x00000000)}}, {VT_exponent,22,0x3a83d8,{DOUBLEWITHTWODWORDINTREE(0x10200000,0x00000000)}}, {VT_exponent,22,0x3a83d9,{DOUBLEWITHTWODWORDINTREE(0x10300000,0x00000000)}}, {VT_exponent,22,0x3a83da,{DOUBLEWITHTWODWORDINTREE(0x10400000,0x00000000)}}, {VT_exponent,22,0x3a83db,{DOUBLEWITHTWODWORDINTREE(0x10500000,0x00000000)}}, {VT_exponent,22,0x3a83dc,{DOUBLEWITHTWODWORDINTREE(0x10600000,0x00000000)}}, {VT_exponent,22,0x3a83dd,{DOUBLEWITHTWODWORDINTREE(0x10700000,0x00000000)}}, {VT_exponent,22,0x3a83de,{DOUBLEWITHTWODWORDINTREE(0x10800000,0x00000000)}}, {VT_exponent,22,0x3a83df,{DOUBLEWITHTWODWORDINTREE(0x10900000,0x00000000)}}, {VT_exponent,22,0x3a83e0,{DOUBLEWITHTWODWORDINTREE(0x10a00000,0x00000000)}}, {VT_exponent,22,0x3a83e1,{DOUBLEWITHTWODWORDINTREE(0x10b00000,0x00000000)}}, {VT_exponent,22,0x3a83e2,{DOUBLEWITHTWODWORDINTREE(0x10c00000,0x00000000)}}, {VT_exponent,22,0x3a83e3,{DOUBLEWITHTWODWORDINTREE(0x10d00000,0x00000000)}}, {VT_exponent,22,0x3a83e4,{DOUBLEWITHTWODWORDINTREE(0x10e00000,0x00000000)}}, {VT_exponent,22,0x3a83e5,{DOUBLEWITHTWODWORDINTREE(0x10f00000,0x00000000)}}, {VT_exponent,22,0x3a83e6,{DOUBLEWITHTWODWORDINTREE(0x11000000,0x00000000)}}, {VT_exponent,22,0x3a83e7,{DOUBLEWITHTWODWORDINTREE(0x11100000,0x00000000)}}, {VT_exponent,22,0x3a83e8,{DOUBLEWITHTWODWORDINTREE(0x11200000,0x00000000)}}, {VT_exponent,22,0x3a83e9,{DOUBLEWITHTWODWORDINTREE(0x11300000,0x00000000)}}, {VT_exponent,22,0x3a83ea,{DOUBLEWITHTWODWORDINTREE(0x11400000,0x00000000)}}, {VT_exponent,22,0x3a83eb,{DOUBLEWITHTWODWORDINTREE(0x11500000,0x00000000)}}, {VT_exponent,22,0x3a83ec,{DOUBLEWITHTWODWORDINTREE(0x11600000,0x00000000)}}, {VT_exponent,22,0x3a83ed,{DOUBLEWITHTWODWORDINTREE(0x11700000,0x00000000)}}, {VT_exponent,22,0x3a83ee,{DOUBLEWITHTWODWORDINTREE(0x11800000,0x00000000)}}, {VT_exponent,22,0x3a83ef,{DOUBLEWITHTWODWORDINTREE(0x11900000,0x00000000)}}, {VT_exponent,22,0x3a83f0,{DOUBLEWITHTWODWORDINTREE(0x11a00000,0x00000000)}}, {VT_exponent,22,0x3a83f1,{DOUBLEWITHTWODWORDINTREE(0x11b00000,0x00000000)}}, {VT_exponent,22,0x3a83f2,{DOUBLEWITHTWODWORDINTREE(0x11c00000,0x00000000)}}, {VT_exponent,22,0x3a83f3,{DOUBLEWITHTWODWORDINTREE(0x11d00000,0x00000000)}}, {VT_exponent,22,0x3a83f4,{DOUBLEWITHTWODWORDINTREE(0x11e00000,0x00000000)}}, {VT_exponent,22,0x3a83f5,{DOUBLEWITHTWODWORDINTREE(0x11f00000,0x00000000)}}, {VT_exponent,22,0x3a83f6,{DOUBLEWITHTWODWORDINTREE(0x12000000,0x00000000)}}, {VT_exponent,22,0x3a83f7,{DOUBLEWITHTWODWORDINTREE(0x12100000,0x00000000)}}, {VT_exponent,22,0x3a83f8,{DOUBLEWITHTWODWORDINTREE(0x12200000,0x00000000)}}, {VT_exponent,22,0x3a83f9,{DOUBLEWITHTWODWORDINTREE(0x12300000,0x00000000)}}, {VT_exponent,22,0x3a83fa,{DOUBLEWITHTWODWORDINTREE(0x12400000,0x00000000)}}, {VT_exponent,22,0x3a83fb,{DOUBLEWITHTWODWORDINTREE(0x12500000,0x00000000)}}, {VT_exponent,22,0x3a83fc,{DOUBLEWITHTWODWORDINTREE(0x12600000,0x00000000)}}, {VT_exponent,22,0x3a83fd,{DOUBLEWITHTWODWORDINTREE(0x12700000,0x00000000)}}, {VT_exponent,22,0x3a83fe,{DOUBLEWITHTWODWORDINTREE(0x12800000,0x00000000)}}, {VT_exponent,22,0x3a83ff,{DOUBLEWITHTWODWORDINTREE(0x12900000,0x00000000)}}, {VT_exponent,22,0x3a8400,{DOUBLEWITHTWODWORDINTREE(0x12a00000,0x00000000)}}, {VT_exponent,22,0x3a8401,{DOUBLEWITHTWODWORDINTREE(0x12b00000,0x00000000)}}, {VT_exponent,22,0x3a8402,{DOUBLEWITHTWODWORDINTREE(0x12c00000,0x00000000)}}, {VT_exponent,22,0x3a8403,{DOUBLEWITHTWODWORDINTREE(0x12d00000,0x00000000)}}, {VT_exponent,22,0x3a8404,{DOUBLEWITHTWODWORDINTREE(0x12e00000,0x00000000)}}, {VT_exponent,22,0x3a8405,{DOUBLEWITHTWODWORDINTREE(0x12f00000,0x00000000)}}, {VT_exponent,22,0x3a8406,{DOUBLEWITHTWODWORDINTREE(0x13000000,0x00000000)}}, {VT_exponent,22,0x3a8407,{DOUBLEWITHTWODWORDINTREE(0x13100000,0x00000000)}}, {VT_exponent,22,0x3a8408,{DOUBLEWITHTWODWORDINTREE(0x13200000,0x00000000)}}, {VT_exponent,22,0x3a8409,{DOUBLEWITHTWODWORDINTREE(0x13300000,0x00000000)}}, {VT_exponent,22,0x3a840a,{DOUBLEWITHTWODWORDINTREE(0x13400000,0x00000000)}}, {VT_exponent,22,0x3a840b,{DOUBLEWITHTWODWORDINTREE(0x13500000,0x00000000)}}, {VT_exponent,22,0x3a840c,{DOUBLEWITHTWODWORDINTREE(0x13600000,0x00000000)}}, {VT_exponent,22,0x3a840d,{DOUBLEWITHTWODWORDINTREE(0x13700000,0x00000000)}}, {VT_exponent,22,0x3a840e,{DOUBLEWITHTWODWORDINTREE(0x13800000,0x00000000)}}, {VT_exponent,22,0x3a840f,{DOUBLEWITHTWODWORDINTREE(0x13900000,0x00000000)}}, {VT_exponent,22,0x3a8410,{DOUBLEWITHTWODWORDINTREE(0x13a00000,0x00000000)}}, {VT_exponent,22,0x3a8411,{DOUBLEWITHTWODWORDINTREE(0x13b00000,0x00000000)}}, {VT_exponent,22,0x3a8412,{DOUBLEWITHTWODWORDINTREE(0x13c00000,0x00000000)}}, {VT_exponent,22,0x3a8413,{DOUBLEWITHTWODWORDINTREE(0x13d00000,0x00000000)}}, {VT_exponent,22,0x3a8414,{DOUBLEWITHTWODWORDINTREE(0x13e00000,0x00000000)}}, {VT_exponent,22,0x3a8415,{DOUBLEWITHTWODWORDINTREE(0x13f00000,0x00000000)}}, {VT_exponent,22,0x3a8416,{DOUBLEWITHTWODWORDINTREE(0x14000000,0x00000000)}}, {VT_exponent,22,0x3a8417,{DOUBLEWITHTWODWORDINTREE(0x14100000,0x00000000)}}, {VT_exponent,22,0x3a8418,{DOUBLEWITHTWODWORDINTREE(0x14200000,0x00000000)}}, {VT_exponent,22,0x3a8419,{DOUBLEWITHTWODWORDINTREE(0x14300000,0x00000000)}}, {VT_exponent,22,0x3a841a,{DOUBLEWITHTWODWORDINTREE(0x14400000,0x00000000)}}, {VT_exponent,22,0x3a841b,{DOUBLEWITHTWODWORDINTREE(0x14500000,0x00000000)}}, {VT_exponent,22,0x3a841c,{DOUBLEWITHTWODWORDINTREE(0x14600000,0x00000000)}}, {VT_exponent,22,0x3a841d,{DOUBLEWITHTWODWORDINTREE(0x14700000,0x00000000)}}, {VT_exponent,22,0x3a841e,{DOUBLEWITHTWODWORDINTREE(0x14800000,0x00000000)}}, {VT_exponent,22,0x3a841f,{DOUBLEWITHTWODWORDINTREE(0x14900000,0x00000000)}}, {VT_exponent,22,0x3a8420,{DOUBLEWITHTWODWORDINTREE(0x14a00000,0x00000000)}}, {VT_exponent,22,0x3a8421,{DOUBLEWITHTWODWORDINTREE(0x14b00000,0x00000000)}}, {VT_exponent,22,0x3a8422,{DOUBLEWITHTWODWORDINTREE(0x14c00000,0x00000000)}}, {VT_exponent,22,0x3a8423,{DOUBLEWITHTWODWORDINTREE(0x14d00000,0x00000000)}}, {VT_exponent,22,0x3a8424,{DOUBLEWITHTWODWORDINTREE(0x14e00000,0x00000000)}}, {VT_exponent,22,0x3a8425,{DOUBLEWITHTWODWORDINTREE(0x14f00000,0x00000000)}}, {VT_exponent,22,0x3a8426,{DOUBLEWITHTWODWORDINTREE(0x15000000,0x00000000)}}, {VT_exponent,22,0x3a8427,{DOUBLEWITHTWODWORDINTREE(0x15100000,0x00000000)}}, {VT_exponent,22,0x3a8428,{DOUBLEWITHTWODWORDINTREE(0x15200000,0x00000000)}}, {VT_exponent,22,0x3a8429,{DOUBLEWITHTWODWORDINTREE(0x15300000,0x00000000)}}, {VT_exponent,22,0x3a842a,{DOUBLEWITHTWODWORDINTREE(0x15400000,0x00000000)}}, {VT_exponent,22,0x3a842b,{DOUBLEWITHTWODWORDINTREE(0x15500000,0x00000000)}}, {VT_exponent,22,0x3a842c,{DOUBLEWITHTWODWORDINTREE(0x15600000,0x00000000)}}, {VT_exponent,22,0x3a842d,{DOUBLEWITHTWODWORDINTREE(0x15700000,0x00000000)}}, {VT_exponent,22,0x3a842e,{DOUBLEWITHTWODWORDINTREE(0x15800000,0x00000000)}}, {VT_exponent,22,0x3a842f,{DOUBLEWITHTWODWORDINTREE(0x15900000,0x00000000)}}, {VT_exponent,22,0x3a8430,{DOUBLEWITHTWODWORDINTREE(0x15a00000,0x00000000)}}, {VT_exponent,22,0x3a8431,{DOUBLEWITHTWODWORDINTREE(0x15b00000,0x00000000)}}, {VT_exponent,22,0x3a8432,{DOUBLEWITHTWODWORDINTREE(0x15c00000,0x00000000)}}, {VT_exponent,22,0x3a8433,{DOUBLEWITHTWODWORDINTREE(0x15d00000,0x00000000)}}, {VT_exponent,22,0x3a8434,{DOUBLEWITHTWODWORDINTREE(0x15e00000,0x00000000)}}, {VT_exponent,22,0x3a8435,{DOUBLEWITHTWODWORDINTREE(0x15f00000,0x00000000)}}, {VT_exponent,22,0x3a8436,{DOUBLEWITHTWODWORDINTREE(0x16000000,0x00000000)}}, {VT_exponent,22,0x3a8437,{DOUBLEWITHTWODWORDINTREE(0x16100000,0x00000000)}}, {VT_exponent,22,0x3a8438,{DOUBLEWITHTWODWORDINTREE(0x16200000,0x00000000)}}, {VT_exponent,22,0x3a8439,{DOUBLEWITHTWODWORDINTREE(0x16300000,0x00000000)}}, {VT_exponent,22,0x3a843a,{DOUBLEWITHTWODWORDINTREE(0x16400000,0x00000000)}}, {VT_exponent,22,0x3a843b,{DOUBLEWITHTWODWORDINTREE(0x16500000,0x00000000)}}, {VT_exponent,22,0x3a843c,{DOUBLEWITHTWODWORDINTREE(0x16600000,0x00000000)}}, {VT_exponent,22,0x3a843d,{DOUBLEWITHTWODWORDINTREE(0x16700000,0x00000000)}}, {VT_exponent,22,0x3a843e,{DOUBLEWITHTWODWORDINTREE(0x16800000,0x00000000)}}, {VT_exponent,22,0x3a843f,{DOUBLEWITHTWODWORDINTREE(0x16900000,0x00000000)}}, {VT_exponent,22,0x3a8440,{DOUBLEWITHTWODWORDINTREE(0x16a00000,0x00000000)}}, {VT_exponent,22,0x3a8441,{DOUBLEWITHTWODWORDINTREE(0x16b00000,0x00000000)}}, {VT_exponent,22,0x3a8442,{DOUBLEWITHTWODWORDINTREE(0x16c00000,0x00000000)}}, {VT_exponent,22,0x3a8443,{DOUBLEWITHTWODWORDINTREE(0x16d00000,0x00000000)}}, {VT_exponent,22,0x3a8444,{DOUBLEWITHTWODWORDINTREE(0x16e00000,0x00000000)}}, {VT_exponent,22,0x3a8445,{DOUBLEWITHTWODWORDINTREE(0x16f00000,0x00000000)}}, {VT_exponent,22,0x3a8446,{DOUBLEWITHTWODWORDINTREE(0x17000000,0x00000000)}}, {VT_exponent,22,0x3a8447,{DOUBLEWITHTWODWORDINTREE(0x17100000,0x00000000)}}, {VT_exponent,22,0x3a8448,{DOUBLEWITHTWODWORDINTREE(0x17200000,0x00000000)}}, {VT_exponent,22,0x3a8449,{DOUBLEWITHTWODWORDINTREE(0x17300000,0x00000000)}}, {VT_exponent,22,0x3a844a,{DOUBLEWITHTWODWORDINTREE(0x17400000,0x00000000)}}, {VT_exponent,22,0x3a844b,{DOUBLEWITHTWODWORDINTREE(0x17500000,0x00000000)}}, {VT_exponent,22,0x3a844c,{DOUBLEWITHTWODWORDINTREE(0x17600000,0x00000000)}}, {VT_exponent,22,0x3a844d,{DOUBLEWITHTWODWORDINTREE(0x17700000,0x00000000)}}, {VT_exponent,22,0x3a844e,{DOUBLEWITHTWODWORDINTREE(0x17800000,0x00000000)}}, {VT_exponent,22,0x3a844f,{DOUBLEWITHTWODWORDINTREE(0x17900000,0x00000000)}}, {VT_exponent,22,0x3a8450,{DOUBLEWITHTWODWORDINTREE(0x17a00000,0x00000000)}}, {VT_exponent,22,0x3a8451,{DOUBLEWITHTWODWORDINTREE(0x17b00000,0x00000000)}}, {VT_exponent,22,0x3a8452,{DOUBLEWITHTWODWORDINTREE(0x17c00000,0x00000000)}}, {VT_exponent,22,0x3a8453,{DOUBLEWITHTWODWORDINTREE(0x17d00000,0x00000000)}}, {VT_exponent,22,0x3a8454,{DOUBLEWITHTWODWORDINTREE(0x17e00000,0x00000000)}}, {VT_exponent,22,0x3a8455,{DOUBLEWITHTWODWORDINTREE(0x17f00000,0x00000000)}}, {VT_exponent,22,0x3a8456,{DOUBLEWITHTWODWORDINTREE(0x18000000,0x00000000)}}, {VT_exponent,22,0x3a8457,{DOUBLEWITHTWODWORDINTREE(0x18100000,0x00000000)}}, {VT_exponent,22,0x3a8458,{DOUBLEWITHTWODWORDINTREE(0x18200000,0x00000000)}}, {VT_exponent,22,0x3a8459,{DOUBLEWITHTWODWORDINTREE(0x18300000,0x00000000)}}, {VT_exponent,22,0x3a845a,{DOUBLEWITHTWODWORDINTREE(0x18400000,0x00000000)}}, {VT_exponent,22,0x3a845b,{DOUBLEWITHTWODWORDINTREE(0x18500000,0x00000000)}}, {VT_exponent,22,0x3a845c,{DOUBLEWITHTWODWORDINTREE(0x18600000,0x00000000)}}, {VT_exponent,22,0x3a845d,{DOUBLEWITHTWODWORDINTREE(0x18700000,0x00000000)}}, {VT_exponent,22,0x3a845e,{DOUBLEWITHTWODWORDINTREE(0x18800000,0x00000000)}}, {VT_exponent,22,0x3a845f,{DOUBLEWITHTWODWORDINTREE(0x18900000,0x00000000)}}, {VT_exponent,22,0x3a8460,{DOUBLEWITHTWODWORDINTREE(0x18a00000,0x00000000)}}, {VT_exponent,22,0x3a8461,{DOUBLEWITHTWODWORDINTREE(0x18b00000,0x00000000)}}, {VT_exponent,22,0x3a8462,{DOUBLEWITHTWODWORDINTREE(0x18c00000,0x00000000)}}, {VT_exponent,22,0x3a8463,{DOUBLEWITHTWODWORDINTREE(0x18d00000,0x00000000)}}, {VT_exponent,22,0x3a8464,{DOUBLEWITHTWODWORDINTREE(0x18e00000,0x00000000)}}, {VT_exponent,22,0x3a8465,{DOUBLEWITHTWODWORDINTREE(0x18f00000,0x00000000)}}, {VT_exponent,22,0x3a8466,{DOUBLEWITHTWODWORDINTREE(0x19000000,0x00000000)}}, {VT_exponent,22,0x3a8467,{DOUBLEWITHTWODWORDINTREE(0x19100000,0x00000000)}}, {VT_exponent,22,0x3a8468,{DOUBLEWITHTWODWORDINTREE(0x19200000,0x00000000)}}, {VT_exponent,22,0x3a8469,{DOUBLEWITHTWODWORDINTREE(0x19300000,0x00000000)}}, {VT_exponent,22,0x3a846a,{DOUBLEWITHTWODWORDINTREE(0x19400000,0x00000000)}}, {VT_exponent,22,0x3a846b,{DOUBLEWITHTWODWORDINTREE(0x19500000,0x00000000)}}, {VT_exponent,22,0x3a846c,{DOUBLEWITHTWODWORDINTREE(0x19600000,0x00000000)}}, {VT_exponent,22,0x3a846d,{DOUBLEWITHTWODWORDINTREE(0x19700000,0x00000000)}}, {VT_exponent,22,0x3a846e,{DOUBLEWITHTWODWORDINTREE(0x19800000,0x00000000)}}, {VT_exponent,22,0x3a846f,{DOUBLEWITHTWODWORDINTREE(0x19900000,0x00000000)}}, {VT_exponent,22,0x3a8470,{DOUBLEWITHTWODWORDINTREE(0x19a00000,0x00000000)}}, {VT_exponent,22,0x3a8471,{DOUBLEWITHTWODWORDINTREE(0x19b00000,0x00000000)}}, {VT_exponent,22,0x3a8472,{DOUBLEWITHTWODWORDINTREE(0x19c00000,0x00000000)}}, {VT_exponent,22,0x3a8473,{DOUBLEWITHTWODWORDINTREE(0x19d00000,0x00000000)}}, {VT_exponent,22,0x3a8474,{DOUBLEWITHTWODWORDINTREE(0x19e00000,0x00000000)}}, {VT_exponent,22,0x3a8475,{DOUBLEWITHTWODWORDINTREE(0x19f00000,0x00000000)}}, {VT_exponent,22,0x3a8476,{DOUBLEWITHTWODWORDINTREE(0x1a000000,0x00000000)}}, {VT_exponent,22,0x3a8477,{DOUBLEWITHTWODWORDINTREE(0x1a100000,0x00000000)}}, {VT_exponent,22,0x3a8478,{DOUBLEWITHTWODWORDINTREE(0x1a200000,0x00000000)}}, {VT_exponent,22,0x3a8479,{DOUBLEWITHTWODWORDINTREE(0x1a300000,0x00000000)}}, {VT_exponent,22,0x3a847a,{DOUBLEWITHTWODWORDINTREE(0x1a400000,0x00000000)}}, {VT_exponent,22,0x3a847b,{DOUBLEWITHTWODWORDINTREE(0x1a500000,0x00000000)}}, {VT_exponent,22,0x3a847c,{DOUBLEWITHTWODWORDINTREE(0x1a600000,0x00000000)}}, {VT_exponent,22,0x3a847d,{DOUBLEWITHTWODWORDINTREE(0x1a700000,0x00000000)}}, {VT_exponent,22,0x3a847e,{DOUBLEWITHTWODWORDINTREE(0x1a800000,0x00000000)}}, {VT_exponent,22,0x3a847f,{DOUBLEWITHTWODWORDINTREE(0x1a900000,0x00000000)}}, {VT_exponent,22,0x3a8480,{DOUBLEWITHTWODWORDINTREE(0x1aa00000,0x00000000)}}, {VT_exponent,22,0x3a8481,{DOUBLEWITHTWODWORDINTREE(0x1ab00000,0x00000000)}}, {VT_exponent,22,0x3a8482,{DOUBLEWITHTWODWORDINTREE(0x1ac00000,0x00000000)}}, {VT_exponent,22,0x3a8483,{DOUBLEWITHTWODWORDINTREE(0x1ad00000,0x00000000)}}, {VT_exponent,22,0x3a8484,{DOUBLEWITHTWODWORDINTREE(0x1ae00000,0x00000000)}}, {VT_exponent,22,0x3a8485,{DOUBLEWITHTWODWORDINTREE(0x1af00000,0x00000000)}}, {VT_exponent,22,0x3a8486,{DOUBLEWITHTWODWORDINTREE(0x1b000000,0x00000000)}}, {VT_exponent,22,0x3a8487,{DOUBLEWITHTWODWORDINTREE(0x1b100000,0x00000000)}}, {VT_exponent,22,0x3a8488,{DOUBLEWITHTWODWORDINTREE(0x1b200000,0x00000000)}}, {VT_exponent,22,0x3a8489,{DOUBLEWITHTWODWORDINTREE(0x1b300000,0x00000000)}}, {VT_exponent,22,0x3a848a,{DOUBLEWITHTWODWORDINTREE(0x1b400000,0x00000000)}}, {VT_exponent,22,0x3a848b,{DOUBLEWITHTWODWORDINTREE(0x1b500000,0x00000000)}}, {VT_exponent,22,0x3a848c,{DOUBLEWITHTWODWORDINTREE(0x1b600000,0x00000000)}}, {VT_exponent,22,0x3a848d,{DOUBLEWITHTWODWORDINTREE(0x1b700000,0x00000000)}}, {VT_exponent,22,0x3a848e,{DOUBLEWITHTWODWORDINTREE(0x1b800000,0x00000000)}}, {VT_exponent,22,0x3a848f,{DOUBLEWITHTWODWORDINTREE(0x1b900000,0x00000000)}}, {VT_exponent,22,0x3a8490,{DOUBLEWITHTWODWORDINTREE(0x1ba00000,0x00000000)}}, {VT_exponent,22,0x3a8491,{DOUBLEWITHTWODWORDINTREE(0x1bb00000,0x00000000)}}, {VT_exponent,22,0x3a8492,{DOUBLEWITHTWODWORDINTREE(0x1bc00000,0x00000000)}}, {VT_exponent,22,0x3a8493,{DOUBLEWITHTWODWORDINTREE(0x1bd00000,0x00000000)}}, {VT_exponent,22,0x3a8494,{DOUBLEWITHTWODWORDINTREE(0x1be00000,0x00000000)}}, {VT_exponent,22,0x3a8495,{DOUBLEWITHTWODWORDINTREE(0x1bf00000,0x00000000)}}, {VT_exponent,22,0x3a8496,{DOUBLEWITHTWODWORDINTREE(0x1c000000,0x00000000)}}, {VT_exponent,22,0x3a8497,{DOUBLEWITHTWODWORDINTREE(0x1c100000,0x00000000)}}, {VT_exponent,22,0x3a8498,{DOUBLEWITHTWODWORDINTREE(0x1c200000,0x00000000)}}, {VT_exponent,22,0x3a8499,{DOUBLEWITHTWODWORDINTREE(0x1c300000,0x00000000)}}, {VT_exponent,22,0x3a849a,{DOUBLEWITHTWODWORDINTREE(0x1c400000,0x00000000)}}, {VT_exponent,22,0x3a849b,{DOUBLEWITHTWODWORDINTREE(0x1c500000,0x00000000)}}, {VT_exponent,22,0x3a849c,{DOUBLEWITHTWODWORDINTREE(0x1c600000,0x00000000)}}, {VT_exponent,22,0x3a849d,{DOUBLEWITHTWODWORDINTREE(0x1c700000,0x00000000)}}, {VT_exponent,22,0x3a849e,{DOUBLEWITHTWODWORDINTREE(0x1c800000,0x00000000)}}, {VT_exponent,22,0x3a849f,{DOUBLEWITHTWODWORDINTREE(0x1c900000,0x00000000)}}, {VT_exponent,22,0x3a84a0,{DOUBLEWITHTWODWORDINTREE(0x1ca00000,0x00000000)}}, {VT_exponent,22,0x3a84a1,{DOUBLEWITHTWODWORDINTREE(0x1cb00000,0x00000000)}}, {VT_exponent,22,0x3a84a2,{DOUBLEWITHTWODWORDINTREE(0x1cc00000,0x00000000)}}, {VT_exponent,22,0x3a84a3,{DOUBLEWITHTWODWORDINTREE(0x1cd00000,0x00000000)}}, {VT_exponent,22,0x3a84a4,{DOUBLEWITHTWODWORDINTREE(0x1ce00000,0x00000000)}}, {VT_exponent,22,0x3a84a5,{DOUBLEWITHTWODWORDINTREE(0x1cf00000,0x00000000)}}, {VT_exponent,22,0x3a84a6,{DOUBLEWITHTWODWORDINTREE(0x1d000000,0x00000000)}}, {VT_exponent,22,0x3a84a7,{DOUBLEWITHTWODWORDINTREE(0x1d100000,0x00000000)}}, {VT_exponent,22,0x3a84a8,{DOUBLEWITHTWODWORDINTREE(0x1d200000,0x00000000)}}, {VT_exponent,22,0x3a84a9,{DOUBLEWITHTWODWORDINTREE(0x1d300000,0x00000000)}}, {VT_exponent,22,0x3a84aa,{DOUBLEWITHTWODWORDINTREE(0x1d400000,0x00000000)}}, {VT_exponent,22,0x3a84ab,{DOUBLEWITHTWODWORDINTREE(0x1d500000,0x00000000)}}, {VT_exponent,22,0x3a84ac,{DOUBLEWITHTWODWORDINTREE(0x1d600000,0x00000000)}}, {VT_exponent,22,0x3a84ad,{DOUBLEWITHTWODWORDINTREE(0x1d700000,0x00000000)}}, {VT_exponent,22,0x3a84ae,{DOUBLEWITHTWODWORDINTREE(0x1d800000,0x00000000)}}, {VT_exponent,22,0x3a84af,{DOUBLEWITHTWODWORDINTREE(0x1d900000,0x00000000)}}, {VT_exponent,22,0x3a84b0,{DOUBLEWITHTWODWORDINTREE(0x1da00000,0x00000000)}}, {VT_exponent,22,0x3a84b1,{DOUBLEWITHTWODWORDINTREE(0x1db00000,0x00000000)}}, {VT_exponent,22,0x3a84b2,{DOUBLEWITHTWODWORDINTREE(0x1dc00000,0x00000000)}}, {VT_exponent,22,0x3a84b3,{DOUBLEWITHTWODWORDINTREE(0x1dd00000,0x00000000)}}, {VT_exponent,22,0x3a84b4,{DOUBLEWITHTWODWORDINTREE(0x1de00000,0x00000000)}}, {VT_exponent,22,0x3a84b5,{DOUBLEWITHTWODWORDINTREE(0x1df00000,0x00000000)}}, {VT_exponent,22,0x3a84b6,{DOUBLEWITHTWODWORDINTREE(0x1e000000,0x00000000)}}, {VT_exponent,22,0x3a84b7,{DOUBLEWITHTWODWORDINTREE(0x1e100000,0x00000000)}}, {VT_exponent,22,0x3a84b8,{DOUBLEWITHTWODWORDINTREE(0x1e200000,0x00000000)}}, {VT_exponent,22,0x3a84b9,{DOUBLEWITHTWODWORDINTREE(0x1e300000,0x00000000)}}, {VT_exponent,22,0x3a84ba,{DOUBLEWITHTWODWORDINTREE(0x1e400000,0x00000000)}}, {VT_exponent,22,0x3a84bb,{DOUBLEWITHTWODWORDINTREE(0x1e500000,0x00000000)}}, {VT_exponent,22,0x3a84bc,{DOUBLEWITHTWODWORDINTREE(0x1e600000,0x00000000)}}, {VT_exponent,22,0x3a84bd,{DOUBLEWITHTWODWORDINTREE(0x1e700000,0x00000000)}}, {VT_exponent,22,0x3a84be,{DOUBLEWITHTWODWORDINTREE(0x1e800000,0x00000000)}}, {VT_exponent,22,0x3a84bf,{DOUBLEWITHTWODWORDINTREE(0x1e900000,0x00000000)}}, {VT_exponent,22,0x3a84c0,{DOUBLEWITHTWODWORDINTREE(0x1ea00000,0x00000000)}}, {VT_exponent,22,0x3a84c1,{DOUBLEWITHTWODWORDINTREE(0x1eb00000,0x00000000)}}, {VT_exponent,22,0x3a84c2,{DOUBLEWITHTWODWORDINTREE(0x1ec00000,0x00000000)}}, {VT_exponent,22,0x3a84c3,{DOUBLEWITHTWODWORDINTREE(0x1ed00000,0x00000000)}}, {VT_exponent,22,0x3a84c4,{DOUBLEWITHTWODWORDINTREE(0x1ee00000,0x00000000)}}, {VT_exponent,22,0x3a84c5,{DOUBLEWITHTWODWORDINTREE(0x1ef00000,0x00000000)}}, {VT_exponent,22,0x3a84c6,{DOUBLEWITHTWODWORDINTREE(0x1f000000,0x00000000)}}, {VT_exponent,22,0x3a84c7,{DOUBLEWITHTWODWORDINTREE(0x1f100000,0x00000000)}}, {VT_exponent,22,0x3a84c8,{DOUBLEWITHTWODWORDINTREE(0x1f200000,0x00000000)}}, {VT_exponent,22,0x3a84c9,{DOUBLEWITHTWODWORDINTREE(0x1f300000,0x00000000)}}, {VT_exponent,22,0x3a84ca,{DOUBLEWITHTWODWORDINTREE(0x1f400000,0x00000000)}}, {VT_exponent,22,0x3a84cb,{DOUBLEWITHTWODWORDINTREE(0x1f500000,0x00000000)}}, {VT_exponent,22,0x3a84cc,{DOUBLEWITHTWODWORDINTREE(0x1f600000,0x00000000)}}, {VT_exponent,22,0x3a84cd,{DOUBLEWITHTWODWORDINTREE(0x1f700000,0x00000000)}}, {VT_exponent,22,0x3a84ce,{DOUBLEWITHTWODWORDINTREE(0x1f800000,0x00000000)}}, {VT_exponent,22,0x3a84cf,{DOUBLEWITHTWODWORDINTREE(0x1f900000,0x00000000)}}, {VT_exponent,22,0x3a84d0,{DOUBLEWITHTWODWORDINTREE(0x1fa00000,0x00000000)}}, {VT_exponent,22,0x3a84d1,{DOUBLEWITHTWODWORDINTREE(0x1fb00000,0x00000000)}}, {VT_exponent,22,0x3a84d2,{DOUBLEWITHTWODWORDINTREE(0x1fc00000,0x00000000)}}, {VT_exponent,22,0x3a84d3,{DOUBLEWITHTWODWORDINTREE(0x1fd00000,0x00000000)}}, {VT_exponent,22,0x3a84d4,{DOUBLEWITHTWODWORDINTREE(0x1fe00000,0x00000000)}}, {VT_exponent,22,0x3a84d5,{DOUBLEWITHTWODWORDINTREE(0x1ff00000,0x00000000)}}, {VT_exponent,22,0x3a84d6,{DOUBLEWITHTWODWORDINTREE(0x20000000,0x00000000)}}, {VT_exponent,22,0x3a84d7,{DOUBLEWITHTWODWORDINTREE(0x20100000,0x00000000)}}, {VT_exponent,22,0x3a84d8,{DOUBLEWITHTWODWORDINTREE(0x20200000,0x00000000)}}, {VT_exponent,22,0x3a84d9,{DOUBLEWITHTWODWORDINTREE(0x20300000,0x00000000)}}, {VT_exponent,22,0x3a84da,{DOUBLEWITHTWODWORDINTREE(0x20400000,0x00000000)}}, {VT_exponent,22,0x3a84db,{DOUBLEWITHTWODWORDINTREE(0x20500000,0x00000000)}}, {VT_exponent,22,0x3a84dc,{DOUBLEWITHTWODWORDINTREE(0x20600000,0x00000000)}}, {VT_exponent,22,0x3a84dd,{DOUBLEWITHTWODWORDINTREE(0x20700000,0x00000000)}}, {VT_exponent,22,0x3a84de,{DOUBLEWITHTWODWORDINTREE(0x20800000,0x00000000)}}, {VT_exponent,22,0x3a84df,{DOUBLEWITHTWODWORDINTREE(0x20900000,0x00000000)}}, {VT_exponent,22,0x3a84e0,{DOUBLEWITHTWODWORDINTREE(0x20a00000,0x00000000)}}, {VT_exponent,22,0x3a84e1,{DOUBLEWITHTWODWORDINTREE(0x20b00000,0x00000000)}}, {VT_exponent,22,0x3a84e2,{DOUBLEWITHTWODWORDINTREE(0x20c00000,0x00000000)}}, {VT_exponent,22,0x3a84e3,{DOUBLEWITHTWODWORDINTREE(0x20d00000,0x00000000)}}, {VT_exponent,22,0x3a84e4,{DOUBLEWITHTWODWORDINTREE(0x20e00000,0x00000000)}}, {VT_exponent,22,0x3a84e5,{DOUBLEWITHTWODWORDINTREE(0x20f00000,0x00000000)}}, {VT_exponent,22,0x3a84e6,{DOUBLEWITHTWODWORDINTREE(0x21000000,0x00000000)}}, {VT_exponent,22,0x3a84e7,{DOUBLEWITHTWODWORDINTREE(0x21100000,0x00000000)}}, {VT_exponent,22,0x3a84e8,{DOUBLEWITHTWODWORDINTREE(0x21200000,0x00000000)}}, {VT_exponent,22,0x3a84e9,{DOUBLEWITHTWODWORDINTREE(0x21300000,0x00000000)}}, {VT_exponent,22,0x3a84ea,{DOUBLEWITHTWODWORDINTREE(0x21400000,0x00000000)}}, {VT_exponent,22,0x3a84eb,{DOUBLEWITHTWODWORDINTREE(0x21500000,0x00000000)}}, {VT_exponent,22,0x3a84ec,{DOUBLEWITHTWODWORDINTREE(0x21600000,0x00000000)}}, {VT_exponent,22,0x3a84ed,{DOUBLEWITHTWODWORDINTREE(0x21700000,0x00000000)}}, {VT_exponent,22,0x3a84ee,{DOUBLEWITHTWODWORDINTREE(0x21800000,0x00000000)}}, {VT_exponent,22,0x3a84ef,{DOUBLEWITHTWODWORDINTREE(0x21900000,0x00000000)}}, {VT_exponent,22,0x3a84f0,{DOUBLEWITHTWODWORDINTREE(0x21a00000,0x00000000)}}, {VT_exponent,22,0x3a84f1,{DOUBLEWITHTWODWORDINTREE(0x21b00000,0x00000000)}}, {VT_exponent,22,0x3a84f2,{DOUBLEWITHTWODWORDINTREE(0x21c00000,0x00000000)}}, {VT_exponent,22,0x3a84f3,{DOUBLEWITHTWODWORDINTREE(0x21d00000,0x00000000)}}, {VT_exponent,22,0x3a84f4,{DOUBLEWITHTWODWORDINTREE(0x21e00000,0x00000000)}}, {VT_exponent,22,0x3a84f5,{DOUBLEWITHTWODWORDINTREE(0x21f00000,0x00000000)}}, {VT_exponent,22,0x3a84f6,{DOUBLEWITHTWODWORDINTREE(0x22000000,0x00000000)}}, {VT_exponent,22,0x3a84f7,{DOUBLEWITHTWODWORDINTREE(0x22100000,0x00000000)}}, {VT_exponent,22,0x3a84f8,{DOUBLEWITHTWODWORDINTREE(0x22200000,0x00000000)}}, {VT_exponent,22,0x3a84f9,{DOUBLEWITHTWODWORDINTREE(0x22300000,0x00000000)}}, {VT_exponent,22,0x3a84fa,{DOUBLEWITHTWODWORDINTREE(0x22400000,0x00000000)}}, {VT_exponent,22,0x3a84fb,{DOUBLEWITHTWODWORDINTREE(0x22500000,0x00000000)}}, {VT_exponent,22,0x3a84fc,{DOUBLEWITHTWODWORDINTREE(0x22600000,0x00000000)}}, {VT_exponent,22,0x3a84fd,{DOUBLEWITHTWODWORDINTREE(0x22700000,0x00000000)}}, {VT_exponent,22,0x3a84fe,{DOUBLEWITHTWODWORDINTREE(0x22800000,0x00000000)}}, {VT_exponent,22,0x3a84ff,{DOUBLEWITHTWODWORDINTREE(0x22900000,0x00000000)}}, {VT_exponent,22,0x3a8500,{DOUBLEWITHTWODWORDINTREE(0x22a00000,0x00000000)}}, {VT_exponent,22,0x3a8501,{DOUBLEWITHTWODWORDINTREE(0x22b00000,0x00000000)}}, {VT_exponent,22,0x3a8502,{DOUBLEWITHTWODWORDINTREE(0x22c00000,0x00000000)}}, {VT_exponent,22,0x3a8503,{DOUBLEWITHTWODWORDINTREE(0x22d00000,0x00000000)}}, {VT_exponent,22,0x3a8504,{DOUBLEWITHTWODWORDINTREE(0x22e00000,0x00000000)}}, {VT_exponent,22,0x3a8505,{DOUBLEWITHTWODWORDINTREE(0x22f00000,0x00000000)}}, {VT_exponent,22,0x3a8506,{DOUBLEWITHTWODWORDINTREE(0x23000000,0x00000000)}}, {VT_exponent,22,0x3a8507,{DOUBLEWITHTWODWORDINTREE(0x23100000,0x00000000)}}, {VT_exponent,22,0x3a8508,{DOUBLEWITHTWODWORDINTREE(0x23200000,0x00000000)}}, {VT_exponent,22,0x3a8509,{DOUBLEWITHTWODWORDINTREE(0x23300000,0x00000000)}}, {VT_exponent,22,0x3a850a,{DOUBLEWITHTWODWORDINTREE(0x23400000,0x00000000)}}, {VT_exponent,22,0x3a850b,{DOUBLEWITHTWODWORDINTREE(0x23500000,0x00000000)}}, {VT_exponent,22,0x3a850c,{DOUBLEWITHTWODWORDINTREE(0x23600000,0x00000000)}}, {VT_exponent,22,0x3a850d,{DOUBLEWITHTWODWORDINTREE(0x23700000,0x00000000)}}, {VT_exponent,22,0x3a850e,{DOUBLEWITHTWODWORDINTREE(0x23800000,0x00000000)}}, {VT_exponent,22,0x3a850f,{DOUBLEWITHTWODWORDINTREE(0x23900000,0x00000000)}}, {VT_exponent,22,0x3a8510,{DOUBLEWITHTWODWORDINTREE(0x23a00000,0x00000000)}}, {VT_exponent,22,0x3a8511,{DOUBLEWITHTWODWORDINTREE(0x23b00000,0x00000000)}}, {VT_exponent,22,0x3a8512,{DOUBLEWITHTWODWORDINTREE(0x23c00000,0x00000000)}}, {VT_exponent,22,0x3a8513,{DOUBLEWITHTWODWORDINTREE(0x23d00000,0x00000000)}}, {VT_exponent,22,0x3a8514,{DOUBLEWITHTWODWORDINTREE(0x23e00000,0x00000000)}}, {VT_exponent,22,0x3a8515,{DOUBLEWITHTWODWORDINTREE(0x23f00000,0x00000000)}}, {VT_exponent,22,0x3a8516,{DOUBLEWITHTWODWORDINTREE(0x24000000,0x00000000)}}, {VT_exponent,22,0x3a8517,{DOUBLEWITHTWODWORDINTREE(0x24100000,0x00000000)}}, {VT_exponent,22,0x3a8518,{DOUBLEWITHTWODWORDINTREE(0x24200000,0x00000000)}}, {VT_exponent,22,0x3a8519,{DOUBLEWITHTWODWORDINTREE(0x24300000,0x00000000)}}, {VT_exponent,22,0x3a851a,{DOUBLEWITHTWODWORDINTREE(0x24400000,0x00000000)}}, {VT_exponent,22,0x3a851b,{DOUBLEWITHTWODWORDINTREE(0x24500000,0x00000000)}}, {VT_exponent,22,0x3a851c,{DOUBLEWITHTWODWORDINTREE(0x24600000,0x00000000)}}, {VT_exponent,22,0x3a851d,{DOUBLEWITHTWODWORDINTREE(0x24700000,0x00000000)}}, {VT_exponent,22,0x3a851e,{DOUBLEWITHTWODWORDINTREE(0x24800000,0x00000000)}}, {VT_exponent,22,0x3a851f,{DOUBLEWITHTWODWORDINTREE(0x24900000,0x00000000)}}, {VT_exponent,22,0x3a8520,{DOUBLEWITHTWODWORDINTREE(0x24a00000,0x00000000)}}, {VT_exponent,22,0x3a8521,{DOUBLEWITHTWODWORDINTREE(0x24b00000,0x00000000)}}, {VT_exponent,22,0x3a8522,{DOUBLEWITHTWODWORDINTREE(0x24c00000,0x00000000)}}, {VT_exponent,22,0x3a8523,{DOUBLEWITHTWODWORDINTREE(0x24d00000,0x00000000)}}, {VT_exponent,22,0x3a8524,{DOUBLEWITHTWODWORDINTREE(0x24e00000,0x00000000)}}, {VT_exponent,22,0x3a8525,{DOUBLEWITHTWODWORDINTREE(0x24f00000,0x00000000)}}, {VT_exponent,22,0x3a8526,{DOUBLEWITHTWODWORDINTREE(0x25000000,0x00000000)}}, {VT_exponent,22,0x3a8527,{DOUBLEWITHTWODWORDINTREE(0x25100000,0x00000000)}}, {VT_exponent,22,0x3a8528,{DOUBLEWITHTWODWORDINTREE(0x25200000,0x00000000)}}, {VT_exponent,22,0x3a8529,{DOUBLEWITHTWODWORDINTREE(0x25300000,0x00000000)}}, {VT_exponent,22,0x3a852a,{DOUBLEWITHTWODWORDINTREE(0x25400000,0x00000000)}}, {VT_exponent,22,0x3a852b,{DOUBLEWITHTWODWORDINTREE(0x25500000,0x00000000)}}, {VT_exponent,22,0x3a852c,{DOUBLEWITHTWODWORDINTREE(0x25600000,0x00000000)}}, {VT_exponent,22,0x3a852d,{DOUBLEWITHTWODWORDINTREE(0x25700000,0x00000000)}}, {VT_exponent,22,0x3a852e,{DOUBLEWITHTWODWORDINTREE(0x25800000,0x00000000)}}, {VT_exponent,22,0x3a852f,{DOUBLEWITHTWODWORDINTREE(0x25900000,0x00000000)}}, {VT_exponent,22,0x3a8530,{DOUBLEWITHTWODWORDINTREE(0x25a00000,0x00000000)}}, {VT_exponent,22,0x3a8531,{DOUBLEWITHTWODWORDINTREE(0x25b00000,0x00000000)}}, {VT_exponent,22,0x3a8532,{DOUBLEWITHTWODWORDINTREE(0x25c00000,0x00000000)}}, {VT_exponent,22,0x3a8533,{DOUBLEWITHTWODWORDINTREE(0x25d00000,0x00000000)}}, {VT_exponent,22,0x3a8534,{DOUBLEWITHTWODWORDINTREE(0x25e00000,0x00000000)}}, {VT_exponent,22,0x3a8535,{DOUBLEWITHTWODWORDINTREE(0x25f00000,0x00000000)}}, {VT_exponent,22,0x3a8536,{DOUBLEWITHTWODWORDINTREE(0x26000000,0x00000000)}}, {VT_exponent,22,0x3a8537,{DOUBLEWITHTWODWORDINTREE(0x26100000,0x00000000)}}, {VT_exponent,22,0x3a8538,{DOUBLEWITHTWODWORDINTREE(0x26200000,0x00000000)}}, {VT_exponent,22,0x3a8539,{DOUBLEWITHTWODWORDINTREE(0x26300000,0x00000000)}}, {VT_exponent,22,0x3a853a,{DOUBLEWITHTWODWORDINTREE(0x26400000,0x00000000)}}, {VT_exponent,22,0x3a853b,{DOUBLEWITHTWODWORDINTREE(0x26500000,0x00000000)}}, {VT_exponent,22,0x3a853c,{DOUBLEWITHTWODWORDINTREE(0x26600000,0x00000000)}}, {VT_exponent,22,0x3a853d,{DOUBLEWITHTWODWORDINTREE(0x26700000,0x00000000)}}, {VT_exponent,22,0x3a853e,{DOUBLEWITHTWODWORDINTREE(0x26800000,0x00000000)}}, {VT_exponent,22,0x3a853f,{DOUBLEWITHTWODWORDINTREE(0x26900000,0x00000000)}}, {VT_exponent,22,0x3a8540,{DOUBLEWITHTWODWORDINTREE(0x26a00000,0x00000000)}}, {VT_exponent,22,0x3a8541,{DOUBLEWITHTWODWORDINTREE(0x26b00000,0x00000000)}}, {VT_exponent,22,0x3a8542,{DOUBLEWITHTWODWORDINTREE(0x26c00000,0x00000000)}}, {VT_exponent,22,0x3a8543,{DOUBLEWITHTWODWORDINTREE(0x26d00000,0x00000000)}}, {VT_exponent,22,0x3a8544,{DOUBLEWITHTWODWORDINTREE(0x26e00000,0x00000000)}}, {VT_exponent,22,0x3a8545,{DOUBLEWITHTWODWORDINTREE(0x26f00000,0x00000000)}}, {VT_exponent,22,0x3a8546,{DOUBLEWITHTWODWORDINTREE(0x27000000,0x00000000)}}, {VT_exponent,22,0x3a8547,{DOUBLEWITHTWODWORDINTREE(0x27100000,0x00000000)}}, {VT_exponent,22,0x3a8548,{DOUBLEWITHTWODWORDINTREE(0x27200000,0x00000000)}}, {VT_exponent,22,0x3a8549,{DOUBLEWITHTWODWORDINTREE(0x27300000,0x00000000)}}, {VT_exponent,22,0x3a854a,{DOUBLEWITHTWODWORDINTREE(0x27400000,0x00000000)}}, {VT_exponent,22,0x3a854b,{DOUBLEWITHTWODWORDINTREE(0x27500000,0x00000000)}}, {VT_exponent,22,0x3a854c,{DOUBLEWITHTWODWORDINTREE(0x27600000,0x00000000)}}, {VT_exponent,22,0x3a854d,{DOUBLEWITHTWODWORDINTREE(0x27700000,0x00000000)}}, {VT_exponent,22,0x3a854e,{DOUBLEWITHTWODWORDINTREE(0x27800000,0x00000000)}}, {VT_exponent,22,0x3a854f,{DOUBLEWITHTWODWORDINTREE(0x27900000,0x00000000)}}, {VT_exponent,22,0x3a8550,{DOUBLEWITHTWODWORDINTREE(0x27a00000,0x00000000)}}, {VT_exponent,22,0x3a8551,{DOUBLEWITHTWODWORDINTREE(0x27b00000,0x00000000)}}, {VT_exponent,22,0x3a8552,{DOUBLEWITHTWODWORDINTREE(0x27c00000,0x00000000)}}, {VT_exponent,22,0x3a8553,{DOUBLEWITHTWODWORDINTREE(0x27d00000,0x00000000)}}, {VT_exponent,22,0x3a8554,{DOUBLEWITHTWODWORDINTREE(0x27e00000,0x00000000)}}, {VT_exponent,22,0x3a8555,{DOUBLEWITHTWODWORDINTREE(0x27f00000,0x00000000)}}, {VT_exponent,22,0x3a8556,{DOUBLEWITHTWODWORDINTREE(0x28000000,0x00000000)}}, {VT_exponent,22,0x3a8557,{DOUBLEWITHTWODWORDINTREE(0x28100000,0x00000000)}}, {VT_exponent,22,0x3a8558,{DOUBLEWITHTWODWORDINTREE(0x28200000,0x00000000)}}, {VT_exponent,22,0x3a8559,{DOUBLEWITHTWODWORDINTREE(0x28300000,0x00000000)}}, {VT_exponent,22,0x3a855a,{DOUBLEWITHTWODWORDINTREE(0x28400000,0x00000000)}}, {VT_exponent,22,0x3a855b,{DOUBLEWITHTWODWORDINTREE(0x28500000,0x00000000)}}, {VT_exponent,22,0x3a855c,{DOUBLEWITHTWODWORDINTREE(0x28600000,0x00000000)}}, {VT_exponent,22,0x3a855d,{DOUBLEWITHTWODWORDINTREE(0x28700000,0x00000000)}}, {VT_exponent,22,0x3a855e,{DOUBLEWITHTWODWORDINTREE(0x28800000,0x00000000)}}, {VT_exponent,22,0x3a855f,{DOUBLEWITHTWODWORDINTREE(0x28900000,0x00000000)}}, {VT_exponent,22,0x3a8560,{DOUBLEWITHTWODWORDINTREE(0x28a00000,0x00000000)}}, {VT_exponent,22,0x3a8561,{DOUBLEWITHTWODWORDINTREE(0x28b00000,0x00000000)}}, {VT_exponent,22,0x3a8562,{DOUBLEWITHTWODWORDINTREE(0x28c00000,0x00000000)}}, {VT_exponent,22,0x3a8563,{DOUBLEWITHTWODWORDINTREE(0x28d00000,0x00000000)}}, {VT_exponent,22,0x3a8564,{DOUBLEWITHTWODWORDINTREE(0x28e00000,0x00000000)}}, {VT_exponent,22,0x3a8565,{DOUBLEWITHTWODWORDINTREE(0x28f00000,0x00000000)}}, {VT_exponent,22,0x3a8566,{DOUBLEWITHTWODWORDINTREE(0x29000000,0x00000000)}}, {VT_exponent,22,0x3a8567,{DOUBLEWITHTWODWORDINTREE(0x29100000,0x00000000)}}, {VT_exponent,22,0x3a8568,{DOUBLEWITHTWODWORDINTREE(0x29200000,0x00000000)}}, {VT_exponent,22,0x3a8569,{DOUBLEWITHTWODWORDINTREE(0x29300000,0x00000000)}}, {VT_exponent,22,0x3a856a,{DOUBLEWITHTWODWORDINTREE(0x29400000,0x00000000)}}, {VT_exponent,22,0x3a856b,{DOUBLEWITHTWODWORDINTREE(0x29500000,0x00000000)}}, {VT_exponent,22,0x3a856c,{DOUBLEWITHTWODWORDINTREE(0x29600000,0x00000000)}}, {VT_exponent,22,0x3a856d,{DOUBLEWITHTWODWORDINTREE(0x29700000,0x00000000)}}, {VT_exponent,22,0x3a856e,{DOUBLEWITHTWODWORDINTREE(0x29800000,0x00000000)}}, {VT_exponent,22,0x3a856f,{DOUBLEWITHTWODWORDINTREE(0x29900000,0x00000000)}}, {VT_exponent,22,0x3a8570,{DOUBLEWITHTWODWORDINTREE(0x29a00000,0x00000000)}}, {VT_exponent,22,0x3a8571,{DOUBLEWITHTWODWORDINTREE(0x29b00000,0x00000000)}}, {VT_exponent,22,0x3a8572,{DOUBLEWITHTWODWORDINTREE(0x29c00000,0x00000000)}}, {VT_exponent,22,0x3a8573,{DOUBLEWITHTWODWORDINTREE(0x29d00000,0x00000000)}}, {VT_exponent,22,0x3a8574,{DOUBLEWITHTWODWORDINTREE(0x29e00000,0x00000000)}}, {VT_exponent,22,0x3a8575,{DOUBLEWITHTWODWORDINTREE(0x29f00000,0x00000000)}}, {VT_exponent,22,0x3a8576,{DOUBLEWITHTWODWORDINTREE(0x2a000000,0x00000000)}}, {VT_exponent,22,0x3a8577,{DOUBLEWITHTWODWORDINTREE(0x2a100000,0x00000000)}}, {VT_exponent,22,0x3a8578,{DOUBLEWITHTWODWORDINTREE(0x2a200000,0x00000000)}}, {VT_exponent,22,0x3a8579,{DOUBLEWITHTWODWORDINTREE(0x2a300000,0x00000000)}}, {VT_exponent,22,0x3a857a,{DOUBLEWITHTWODWORDINTREE(0x2a400000,0x00000000)}}, {VT_exponent,22,0x3a857b,{DOUBLEWITHTWODWORDINTREE(0x2a500000,0x00000000)}}, {VT_exponent,22,0x3a857c,{DOUBLEWITHTWODWORDINTREE(0x2a600000,0x00000000)}}, {VT_exponent,22,0x3a857d,{DOUBLEWITHTWODWORDINTREE(0x2a700000,0x00000000)}}, {VT_exponent,22,0x3a857e,{DOUBLEWITHTWODWORDINTREE(0x2a800000,0x00000000)}}, {VT_exponent,22,0x3a857f,{DOUBLEWITHTWODWORDINTREE(0x2a900000,0x00000000)}}, {VT_exponent,22,0x3a8580,{DOUBLEWITHTWODWORDINTREE(0x2aa00000,0x00000000)}}, {VT_exponent,22,0x3a8581,{DOUBLEWITHTWODWORDINTREE(0x2ab00000,0x00000000)}}, {VT_exponent,22,0x3a8582,{DOUBLEWITHTWODWORDINTREE(0x2ac00000,0x00000000)}}, {VT_exponent,22,0x3a8583,{DOUBLEWITHTWODWORDINTREE(0x2ad00000,0x00000000)}}, {VT_exponent,22,0x3a8584,{DOUBLEWITHTWODWORDINTREE(0x2ae00000,0x00000000)}}, {VT_exponent,22,0x3a8585,{DOUBLEWITHTWODWORDINTREE(0x2af00000,0x00000000)}}, {VT_exponent,22,0x3a8586,{DOUBLEWITHTWODWORDINTREE(0x2b000000,0x00000000)}}, {VT_exponent,22,0x3a8587,{DOUBLEWITHTWODWORDINTREE(0x2b100000,0x00000000)}}, {VT_exponent,22,0x3a8588,{DOUBLEWITHTWODWORDINTREE(0x2b200000,0x00000000)}}, {VT_exponent,22,0x3a8589,{DOUBLEWITHTWODWORDINTREE(0x2b300000,0x00000000)}}, {VT_exponent,22,0x3a858a,{DOUBLEWITHTWODWORDINTREE(0x2b400000,0x00000000)}}, {VT_exponent,22,0x3a858b,{DOUBLEWITHTWODWORDINTREE(0x2b500000,0x00000000)}}, {VT_exponent,22,0x3a858c,{DOUBLEWITHTWODWORDINTREE(0x2b600000,0x00000000)}}, {VT_exponent,22,0x3a858d,{DOUBLEWITHTWODWORDINTREE(0x2b700000,0x00000000)}}, {VT_exponent,22,0x3a858e,{DOUBLEWITHTWODWORDINTREE(0x2b800000,0x00000000)}}, {VT_exponent,22,0x3a858f,{DOUBLEWITHTWODWORDINTREE(0x2b900000,0x00000000)}}, {VT_exponent,22,0x3a8590,{DOUBLEWITHTWODWORDINTREE(0x2ba00000,0x00000000)}}, {VT_exponent,22,0x3a8591,{DOUBLEWITHTWODWORDINTREE(0x2bb00000,0x00000000)}}, {VT_exponent,22,0x3a8592,{DOUBLEWITHTWODWORDINTREE(0x2bc00000,0x00000000)}}, {VT_exponent,22,0x3a8593,{DOUBLEWITHTWODWORDINTREE(0x2bd00000,0x00000000)}}, {VT_exponent,22,0x3a8594,{DOUBLEWITHTWODWORDINTREE(0x2be00000,0x00000000)}}, {VT_exponent,22,0x3a8595,{DOUBLEWITHTWODWORDINTREE(0x2bf00000,0x00000000)}}, {VT_exponent,22,0x3a8596,{DOUBLEWITHTWODWORDINTREE(0x2c000000,0x00000000)}}, {VT_exponent,22,0x3a8597,{DOUBLEWITHTWODWORDINTREE(0x2c100000,0x00000000)}}, {VT_exponent,22,0x3a8598,{DOUBLEWITHTWODWORDINTREE(0x2c200000,0x00000000)}}, {VT_exponent,22,0x3a8599,{DOUBLEWITHTWODWORDINTREE(0x2c300000,0x00000000)}}, {VT_exponent,22,0x3a859a,{DOUBLEWITHTWODWORDINTREE(0x2c400000,0x00000000)}}, {VT_exponent,22,0x3a859b,{DOUBLEWITHTWODWORDINTREE(0x2c500000,0x00000000)}}, {VT_exponent,22,0x3a859c,{DOUBLEWITHTWODWORDINTREE(0x2c600000,0x00000000)}}, {VT_exponent,22,0x3a859d,{DOUBLEWITHTWODWORDINTREE(0x2c700000,0x00000000)}}, {VT_exponent,22,0x3a859e,{DOUBLEWITHTWODWORDINTREE(0x2c800000,0x00000000)}}, {VT_exponent,22,0x3a859f,{DOUBLEWITHTWODWORDINTREE(0x2c900000,0x00000000)}}, {VT_exponent,22,0x3a85a0,{DOUBLEWITHTWODWORDINTREE(0x2ca00000,0x00000000)}}, {VT_exponent,22,0x3a85a1,{DOUBLEWITHTWODWORDINTREE(0x2cb00000,0x00000000)}}, {VT_exponent,22,0x3a85a2,{DOUBLEWITHTWODWORDINTREE(0x2cc00000,0x00000000)}}, {VT_exponent,22,0x3a85a3,{DOUBLEWITHTWODWORDINTREE(0x2cd00000,0x00000000)}}, {VT_exponent,22,0x3a85a4,{DOUBLEWITHTWODWORDINTREE(0x2ce00000,0x00000000)}}, {VT_exponent,22,0x3a85a5,{DOUBLEWITHTWODWORDINTREE(0x2cf00000,0x00000000)}}, {VT_exponent,22,0x3a85a6,{DOUBLEWITHTWODWORDINTREE(0x2d000000,0x00000000)}}, {VT_exponent,22,0x3a85a7,{DOUBLEWITHTWODWORDINTREE(0x2d100000,0x00000000)}}, {VT_exponent,22,0x3a85a8,{DOUBLEWITHTWODWORDINTREE(0x2d200000,0x00000000)}}, {VT_exponent,22,0x3a85a9,{DOUBLEWITHTWODWORDINTREE(0x2d300000,0x00000000)}}, {VT_exponent,22,0x3a85aa,{DOUBLEWITHTWODWORDINTREE(0x2d400000,0x00000000)}}, {VT_exponent,22,0x3a85ab,{DOUBLEWITHTWODWORDINTREE(0x2d500000,0x00000000)}}, {VT_exponent,22,0x3a85ac,{DOUBLEWITHTWODWORDINTREE(0x2d600000,0x00000000)}}, {VT_exponent,22,0x3a85ad,{DOUBLEWITHTWODWORDINTREE(0x2d700000,0x00000000)}}, {VT_exponent,22,0x3a85ae,{DOUBLEWITHTWODWORDINTREE(0x2d800000,0x00000000)}}, {VT_exponent,22,0x3a85af,{DOUBLEWITHTWODWORDINTREE(0x2d900000,0x00000000)}}, {VT_exponent,22,0x3a85b0,{DOUBLEWITHTWODWORDINTREE(0x2da00000,0x00000000)}}, {VT_exponent,22,0x3a85b1,{DOUBLEWITHTWODWORDINTREE(0x2db00000,0x00000000)}}, {VT_exponent,22,0x3a85b2,{DOUBLEWITHTWODWORDINTREE(0x2dc00000,0x00000000)}}, {VT_exponent,22,0x3a85b3,{DOUBLEWITHTWODWORDINTREE(0x2dd00000,0x00000000)}}, {VT_exponent,22,0x3a85b4,{DOUBLEWITHTWODWORDINTREE(0x2de00000,0x00000000)}}, {VT_exponent,22,0x3a85b5,{DOUBLEWITHTWODWORDINTREE(0x2df00000,0x00000000)}}, {VT_exponent,22,0x3a85b6,{DOUBLEWITHTWODWORDINTREE(0x2e000000,0x00000000)}}, {VT_exponent,22,0x3a85b7,{DOUBLEWITHTWODWORDINTREE(0x2e100000,0x00000000)}}, {VT_exponent,22,0x3a85b8,{DOUBLEWITHTWODWORDINTREE(0x2e200000,0x00000000)}}, {VT_exponent,22,0x3a85b9,{DOUBLEWITHTWODWORDINTREE(0x2e300000,0x00000000)}}, {VT_exponent,22,0x3a85ba,{DOUBLEWITHTWODWORDINTREE(0x2e400000,0x00000000)}}, {VT_exponent,22,0x3a85bb,{DOUBLEWITHTWODWORDINTREE(0x2e500000,0x00000000)}}, {VT_exponent,22,0x3a85bc,{DOUBLEWITHTWODWORDINTREE(0x2e600000,0x00000000)}}, {VT_exponent,22,0x3a85bd,{DOUBLEWITHTWODWORDINTREE(0x2e700000,0x00000000)}}, {VT_exponent,22,0x3a85be,{DOUBLEWITHTWODWORDINTREE(0x2e800000,0x00000000)}}, {VT_exponent,22,0x3a85bf,{DOUBLEWITHTWODWORDINTREE(0x2e900000,0x00000000)}}, {VT_exponent,22,0x3a85c0,{DOUBLEWITHTWODWORDINTREE(0x2ea00000,0x00000000)}}, {VT_exponent,22,0x3a85c1,{DOUBLEWITHTWODWORDINTREE(0x2eb00000,0x00000000)}}, {VT_exponent,22,0x3a85c2,{DOUBLEWITHTWODWORDINTREE(0x2ec00000,0x00000000)}}, {VT_exponent,22,0x3a85c3,{DOUBLEWITHTWODWORDINTREE(0x2ed00000,0x00000000)}}, {VT_exponent,22,0x3a85c4,{DOUBLEWITHTWODWORDINTREE(0x2ee00000,0x00000000)}}, {VT_exponent,22,0x3a85c5,{DOUBLEWITHTWODWORDINTREE(0x2ef00000,0x00000000)}}, {VT_exponent,22,0x3a85c6,{DOUBLEWITHTWODWORDINTREE(0x2f000000,0x00000000)}}, {VT_exponent,22,0x3a85c7,{DOUBLEWITHTWODWORDINTREE(0x2f100000,0x00000000)}}, {VT_exponent,22,0x3a85c8,{DOUBLEWITHTWODWORDINTREE(0x2f200000,0x00000000)}}, {VT_exponent,22,0x3a85c9,{DOUBLEWITHTWODWORDINTREE(0x2f300000,0x00000000)}}, {VT_exponent,22,0x3a85ca,{DOUBLEWITHTWODWORDINTREE(0x2f400000,0x00000000)}}, {VT_exponent,22,0x3a85cb,{DOUBLEWITHTWODWORDINTREE(0x2f500000,0x00000000)}}, {VT_exponent,22,0x3a85cc,{DOUBLEWITHTWODWORDINTREE(0x2f600000,0x00000000)}}, {VT_exponent,22,0x3a85cd,{DOUBLEWITHTWODWORDINTREE(0x2f700000,0x00000000)}}, {VT_exponent,22,0x3a85ce,{DOUBLEWITHTWODWORDINTREE(0x2f800000,0x00000000)}}, {VT_exponent,22,0x3a85cf,{DOUBLEWITHTWODWORDINTREE(0x2f900000,0x00000000)}}, {VT_exponent,22,0x3a85d0,{DOUBLEWITHTWODWORDINTREE(0x2fa00000,0x00000000)}}, {VT_exponent,22,0x3a85d1,{DOUBLEWITHTWODWORDINTREE(0x2fb00000,0x00000000)}}, {VT_exponent,22,0x3a85d2,{DOUBLEWITHTWODWORDINTREE(0x2fc00000,0x00000000)}}, {VT_exponent,22,0x3a85d3,{DOUBLEWITHTWODWORDINTREE(0x2fd00000,0x00000000)}}, {VT_exponent,22,0x3a85d4,{DOUBLEWITHTWODWORDINTREE(0x2fe00000,0x00000000)}}, {VT_exponent,22,0x3a85d5,{DOUBLEWITHTWODWORDINTREE(0x2ff00000,0x00000000)}}, {VT_exponent,22,0x3a85d6,{DOUBLEWITHTWODWORDINTREE(0x30000000,0x00000000)}}, {VT_exponent,22,0x3a85d7,{DOUBLEWITHTWODWORDINTREE(0x30100000,0x00000000)}}, {VT_exponent,22,0x3a85d8,{DOUBLEWITHTWODWORDINTREE(0x30200000,0x00000000)}}, {VT_exponent,22,0x3a85d9,{DOUBLEWITHTWODWORDINTREE(0x30300000,0x00000000)}}, {VT_exponent,22,0x3a85da,{DOUBLEWITHTWODWORDINTREE(0x30400000,0x00000000)}}, {VT_exponent,22,0x3a85db,{DOUBLEWITHTWODWORDINTREE(0x30500000,0x00000000)}}, {VT_exponent,22,0x3a85dc,{DOUBLEWITHTWODWORDINTREE(0x30600000,0x00000000)}}, {VT_exponent,22,0x3a85dd,{DOUBLEWITHTWODWORDINTREE(0x30700000,0x00000000)}}, {VT_exponent,22,0x3a85de,{DOUBLEWITHTWODWORDINTREE(0x30800000,0x00000000)}}, {VT_exponent,22,0x3a85df,{DOUBLEWITHTWODWORDINTREE(0x30900000,0x00000000)}}, {VT_exponent,22,0x3a85e0,{DOUBLEWITHTWODWORDINTREE(0x30a00000,0x00000000)}}, {VT_exponent,22,0x3a85e1,{DOUBLEWITHTWODWORDINTREE(0x30b00000,0x00000000)}}, {VT_exponent,22,0x3a85e2,{DOUBLEWITHTWODWORDINTREE(0x30c00000,0x00000000)}}, {VT_exponent,22,0x3a85e3,{DOUBLEWITHTWODWORDINTREE(0x30d00000,0x00000000)}}, {VT_exponent,22,0x3a85e4,{DOUBLEWITHTWODWORDINTREE(0x30e00000,0x00000000)}}, {VT_exponent,22,0x3a85e5,{DOUBLEWITHTWODWORDINTREE(0x30f00000,0x00000000)}}, {VT_exponent,22,0x3a85e6,{DOUBLEWITHTWODWORDINTREE(0x31000000,0x00000000)}}, {VT_exponent,22,0x3a85e7,{DOUBLEWITHTWODWORDINTREE(0x31100000,0x00000000)}}, {VT_exponent,22,0x3a85e8,{DOUBLEWITHTWODWORDINTREE(0x31200000,0x00000000)}}, {VT_exponent,22,0x3a85e9,{DOUBLEWITHTWODWORDINTREE(0x31300000,0x00000000)}}, {VT_exponent,22,0x3a85ea,{DOUBLEWITHTWODWORDINTREE(0x31400000,0x00000000)}}, {VT_exponent,22,0x3a85eb,{DOUBLEWITHTWODWORDINTREE(0x31500000,0x00000000)}}, {VT_exponent,22,0x3a85ec,{DOUBLEWITHTWODWORDINTREE(0x31600000,0x00000000)}}, {VT_exponent,22,0x3a85ed,{DOUBLEWITHTWODWORDINTREE(0x31700000,0x00000000)}}, {VT_exponent,22,0x3a85ee,{DOUBLEWITHTWODWORDINTREE(0x31800000,0x00000000)}}, {VT_exponent,22,0x3a85ef,{DOUBLEWITHTWODWORDINTREE(0x31900000,0x00000000)}}, {VT_exponent,22,0x3a85f0,{DOUBLEWITHTWODWORDINTREE(0x31a00000,0x00000000)}}, {VT_exponent,22,0x3a85f1,{DOUBLEWITHTWODWORDINTREE(0x31b00000,0x00000000)}}, {VT_exponent,22,0x3a85f2,{DOUBLEWITHTWODWORDINTREE(0x31c00000,0x00000000)}}, {VT_exponent,22,0x3a85f3,{DOUBLEWITHTWODWORDINTREE(0x31d00000,0x00000000)}}, {VT_exponent,22,0x3a85f4,{DOUBLEWITHTWODWORDINTREE(0x31e00000,0x00000000)}}, {VT_exponent,22,0x3a85f5,{DOUBLEWITHTWODWORDINTREE(0x31f00000,0x00000000)}}, {VT_exponent,22,0x3a85f6,{DOUBLEWITHTWODWORDINTREE(0x32000000,0x00000000)}}, {VT_exponent,22,0x3a85f7,{DOUBLEWITHTWODWORDINTREE(0x32100000,0x00000000)}}, {VT_exponent,22,0x3a85f8,{DOUBLEWITHTWODWORDINTREE(0x32200000,0x00000000)}}, {VT_exponent,22,0x3a85f9,{DOUBLEWITHTWODWORDINTREE(0x32300000,0x00000000)}}, {VT_exponent,22,0x3a85fa,{DOUBLEWITHTWODWORDINTREE(0x32400000,0x00000000)}}, {VT_exponent,22,0x3a85fb,{DOUBLEWITHTWODWORDINTREE(0x32500000,0x00000000)}}, {VT_exponent,22,0x3a85fc,{DOUBLEWITHTWODWORDINTREE(0x32600000,0x00000000)}}, {VT_exponent,22,0x3a85fd,{DOUBLEWITHTWODWORDINTREE(0x32700000,0x00000000)}}, {VT_exponent,22,0x3a85fe,{DOUBLEWITHTWODWORDINTREE(0x32800000,0x00000000)}}, {VT_exponent,22,0x3a85ff,{DOUBLEWITHTWODWORDINTREE(0x32900000,0x00000000)}}, {VT_exponent,22,0x3a8600,{DOUBLEWITHTWODWORDINTREE(0x32a00000,0x00000000)}}, {VT_exponent,22,0x3a8601,{DOUBLEWITHTWODWORDINTREE(0x32b00000,0x00000000)}}, {VT_exponent,22,0x3a8602,{DOUBLEWITHTWODWORDINTREE(0x32c00000,0x00000000)}}, {VT_exponent,22,0x3a8603,{DOUBLEWITHTWODWORDINTREE(0x32d00000,0x00000000)}}, {VT_exponent,22,0x3a8604,{DOUBLEWITHTWODWORDINTREE(0x32e00000,0x00000000)}}, {VT_exponent,22,0x3a8605,{DOUBLEWITHTWODWORDINTREE(0x32f00000,0x00000000)}}, {VT_exponent,22,0x3a8606,{DOUBLEWITHTWODWORDINTREE(0x33000000,0x00000000)}}, {VT_exponent,22,0x3a8607,{DOUBLEWITHTWODWORDINTREE(0x33100000,0x00000000)}}, {VT_exponent,22,0x3a8608,{DOUBLEWITHTWODWORDINTREE(0x33200000,0x00000000)}}, {VT_exponent,22,0x3a8609,{DOUBLEWITHTWODWORDINTREE(0x33300000,0x00000000)}}, {VT_exponent,22,0x3a860a,{DOUBLEWITHTWODWORDINTREE(0x33400000,0x00000000)}}, {VT_exponent,22,0x3a860b,{DOUBLEWITHTWODWORDINTREE(0x33500000,0x00000000)}}, {VT_exponent,22,0x3a860c,{DOUBLEWITHTWODWORDINTREE(0x33600000,0x00000000)}}, {VT_exponent,22,0x3a860d,{DOUBLEWITHTWODWORDINTREE(0x33700000,0x00000000)}}, {VT_exponent,22,0x3a860e,{DOUBLEWITHTWODWORDINTREE(0x33800000,0x00000000)}}, {VT_exponent,22,0x3a860f,{DOUBLEWITHTWODWORDINTREE(0x33900000,0x00000000)}}, {VT_exponent,22,0x3a8610,{DOUBLEWITHTWODWORDINTREE(0x33a00000,0x00000000)}}, {VT_exponent,22,0x3a8611,{DOUBLEWITHTWODWORDINTREE(0x33b00000,0x00000000)}}, {VT_exponent,22,0x3a8612,{DOUBLEWITHTWODWORDINTREE(0x33c00000,0x00000000)}}, {VT_exponent,22,0x3a8613,{DOUBLEWITHTWODWORDINTREE(0x33d00000,0x00000000)}}, {VT_exponent,22,0x3a8614,{DOUBLEWITHTWODWORDINTREE(0x33e00000,0x00000000)}}, {VT_exponent,22,0x3a8615,{DOUBLEWITHTWODWORDINTREE(0x33f00000,0x00000000)}}, {VT_exponent,22,0x3a8616,{DOUBLEWITHTWODWORDINTREE(0x34000000,0x00000000)}}, {VT_exponent,22,0x3a8617,{DOUBLEWITHTWODWORDINTREE(0x34100000,0x00000000)}}, {VT_exponent,22,0x3a8618,{DOUBLEWITHTWODWORDINTREE(0x34200000,0x00000000)}}, {VT_exponent,22,0x3a8619,{DOUBLEWITHTWODWORDINTREE(0x34300000,0x00000000)}}, {VT_exponent,22,0x3a861a,{DOUBLEWITHTWODWORDINTREE(0x34400000,0x00000000)}}, {VT_exponent,22,0x3a861b,{DOUBLEWITHTWODWORDINTREE(0x34500000,0x00000000)}}, {VT_exponent,22,0x3a861c,{DOUBLEWITHTWODWORDINTREE(0x34600000,0x00000000)}}, {VT_exponent,22,0x3a861d,{DOUBLEWITHTWODWORDINTREE(0x34700000,0x00000000)}}, {VT_exponent,22,0x3a861e,{DOUBLEWITHTWODWORDINTREE(0x34800000,0x00000000)}}, {VT_exponent,22,0x3a861f,{DOUBLEWITHTWODWORDINTREE(0x34900000,0x00000000)}}, {VT_exponent,22,0x3a8620,{DOUBLEWITHTWODWORDINTREE(0x34a00000,0x00000000)}}, {VT_exponent,22,0x3a8621,{DOUBLEWITHTWODWORDINTREE(0x34b00000,0x00000000)}}, {VT_exponent,22,0x3a8622,{DOUBLEWITHTWODWORDINTREE(0x34c00000,0x00000000)}}, {VT_exponent,22,0x3a8623,{DOUBLEWITHTWODWORDINTREE(0x34d00000,0x00000000)}}, {VT_exponent,22,0x3a8624,{DOUBLEWITHTWODWORDINTREE(0x34e00000,0x00000000)}}, {VT_exponent,22,0x3a8625,{DOUBLEWITHTWODWORDINTREE(0x34f00000,0x00000000)}}, {VT_exponent,22,0x3a8626,{DOUBLEWITHTWODWORDINTREE(0x35000000,0x00000000)}}, {VT_exponent,22,0x3a8627,{DOUBLEWITHTWODWORDINTREE(0x35100000,0x00000000)}}, {VT_exponent,22,0x3a8628,{DOUBLEWITHTWODWORDINTREE(0x35200000,0x00000000)}}, {VT_exponent,22,0x3a8629,{DOUBLEWITHTWODWORDINTREE(0x35300000,0x00000000)}}, {VT_exponent,18,0xf787,{DOUBLEWITHTWODWORDINTREE(0x35400000,0x00000000)}}, {VT_exponent,18,0xd1d4,{DOUBLEWITHTWODWORDINTREE(0x35500000,0x00000000)}}, {VT_exponent,19,0x77f9f,{DOUBLEWITHTWODWORDINTREE(0x35600000,0x00000000)}}, {VT_exponent,18,0x3b8fb,{DOUBLEWITHTWODWORDINTREE(0x35700000,0x00000000)}}, {VT_exponent,19,0x1ef1a,{DOUBLEWITHTWODWORDINTREE(0x35800000,0x00000000)}}, {VT_exponent,21,0x1d4315,{DOUBLEWITHTWODWORDINTREE(0x35900000,0x00000000)}}, {VT_exponent,16,0x3de2,{DOUBLEWITHTWODWORDINTREE(0x35a00000,0x00000000)}}, {VT_exponent,22,0x3a862c,{DOUBLEWITHTWODWORDINTREE(0x35b00000,0x00000000)}}, {VT_exponent,22,0x3a862d,{DOUBLEWITHTWODWORDINTREE(0x35c00000,0x00000000)}}, {VT_exponent,22,0x3a862e,{DOUBLEWITHTWODWORDINTREE(0x35d00000,0x00000000)}}, {VT_exponent,22,0x3a862f,{DOUBLEWITHTWODWORDINTREE(0x35e00000,0x00000000)}}, {VT_exponent,22,0x3a8630,{DOUBLEWITHTWODWORDINTREE(0x35f00000,0x00000000)}}, {VT_exponent,22,0x3a8631,{DOUBLEWITHTWODWORDINTREE(0x36000000,0x00000000)}}, {VT_exponent,22,0x3a8632,{DOUBLEWITHTWODWORDINTREE(0x36100000,0x00000000)}}, {VT_exponent,22,0x3a8633,{DOUBLEWITHTWODWORDINTREE(0x36200000,0x00000000)}}, {VT_exponent,22,0x3a8634,{DOUBLEWITHTWODWORDINTREE(0x36300000,0x00000000)}}, {VT_exponent,22,0x3a8635,{DOUBLEWITHTWODWORDINTREE(0x36400000,0x00000000)}}, {VT_exponent,22,0x3a8636,{DOUBLEWITHTWODWORDINTREE(0x36500000,0x00000000)}}, {VT_exponent,22,0x3a8637,{DOUBLEWITHTWODWORDINTREE(0x36600000,0x00000000)}}, {VT_exponent,22,0x3a8638,{DOUBLEWITHTWODWORDINTREE(0x36700000,0x00000000)}}, {VT_exponent,21,0x1d431d,{DOUBLEWITHTWODWORDINTREE(0x36800000,0x00000000)}}, {VT_exponent,22,0x3a8639,{DOUBLEWITHTWODWORDINTREE(0x36900000,0x00000000)}}, {VT_exponent,22,0x3a863c,{DOUBLEWITHTWODWORDINTREE(0x36a00000,0x00000000)}}, {VT_exponent,16,0x3de0,{DOUBLEWITHTWODWORDINTREE(0x36b00000,0x00000000)}}, {VT_exponent,18,0x3a95e,{DOUBLEWITHTWODWORDINTREE(0x36c00000,0x00000000)}}, {VT_exponent,21,0x1d431f,{DOUBLEWITHTWODWORDINTREE(0x36d00000,0x00000000)}}, {VT_exponent,22,0x3a863d,{DOUBLEWITHTWODWORDINTREE(0x36e00000,0x00000000)}}, {VT_exponent,22,0x3a8640,{DOUBLEWITHTWODWORDINTREE(0x36f00000,0x00000000)}}, {VT_exponent,20,0x34749,{DOUBLEWITHTWODWORDINTREE(0x37000000,0x00000000)}}, {VT_exponent,20,0x3474d,{DOUBLEWITHTWODWORDINTREE(0x37100000,0x00000000)}}, {VT_exponent,22,0x3a8641,{DOUBLEWITHTWODWORDINTREE(0x37200000,0x00000000)}}, {VT_exponent,22,0x3a8642,{DOUBLEWITHTWODWORDINTREE(0x37300000,0x00000000)}}, {VT_exponent,22,0x3a8643,{DOUBLEWITHTWODWORDINTREE(0x37400000,0x00000000)}}, {VT_exponent,22,0x3a8644,{DOUBLEWITHTWODWORDINTREE(0x37500000,0x00000000)}}, {VT_exponent,22,0x3a8645,{DOUBLEWITHTWODWORDINTREE(0x37600000,0x00000000)}}, {VT_exponent,22,0x3a8646,{DOUBLEWITHTWODWORDINTREE(0x37700000,0x00000000)}}, {VT_exponent,22,0x3a8647,{DOUBLEWITHTWODWORDINTREE(0x37800000,0x00000000)}}, {VT_exponent,22,0x3a8648,{DOUBLEWITHTWODWORDINTREE(0x37900000,0x00000000)}}, {VT_exponent,22,0x3a8649,{DOUBLEWITHTWODWORDINTREE(0x37a00000,0x00000000)}}, {VT_exponent,22,0x3a864a,{DOUBLEWITHTWODWORDINTREE(0x37b00000,0x00000000)}}, {VT_exponent,22,0x3a864b,{DOUBLEWITHTWODWORDINTREE(0x37c00000,0x00000000)}}, {VT_exponent,22,0x3a864c,{DOUBLEWITHTWODWORDINTREE(0x37d00000,0x00000000)}}, {VT_exponent,22,0x3a864d,{DOUBLEWITHTWODWORDINTREE(0x37e00000,0x00000000)}}, {VT_exponent,22,0x3a864e,{DOUBLEWITHTWODWORDINTREE(0x37f00000,0x00000000)}}, {VT_exponent,22,0x3a864f,{DOUBLEWITHTWODWORDINTREE(0x38000000,0x00000000)}}, {VT_exponent,22,0x3a8650,{DOUBLEWITHTWODWORDINTREE(0x38100000,0x00000000)}}, {VT_exponent,22,0x3a8651,{DOUBLEWITHTWODWORDINTREE(0x38200000,0x00000000)}}, {VT_exponent,22,0x3a8652,{DOUBLEWITHTWODWORDINTREE(0x38300000,0x00000000)}}, {VT_exponent,22,0x3a8653,{DOUBLEWITHTWODWORDINTREE(0x38400000,0x00000000)}}, {VT_exponent,22,0x3a8654,{DOUBLEWITHTWODWORDINTREE(0x38500000,0x00000000)}}, {VT_exponent,22,0x3a8655,{DOUBLEWITHTWODWORDINTREE(0x38600000,0x00000000)}}, {VT_exponent,22,0x3a8656,{DOUBLEWITHTWODWORDINTREE(0x38700000,0x00000000)}}, {VT_exponent,22,0x3a8657,{DOUBLEWITHTWODWORDINTREE(0x38800000,0x00000000)}}, {VT_exponent,22,0x3a8658,{DOUBLEWITHTWODWORDINTREE(0x38900000,0x00000000)}}, {VT_exponent,22,0x3a8659,{DOUBLEWITHTWODWORDINTREE(0x38a00000,0x00000000)}}, {VT_exponent,22,0x3a865a,{DOUBLEWITHTWODWORDINTREE(0x38b00000,0x00000000)}}, {VT_exponent,22,0x3a865b,{DOUBLEWITHTWODWORDINTREE(0x38c00000,0x00000000)}}, {VT_exponent,22,0x3a865c,{DOUBLEWITHTWODWORDINTREE(0x38d00000,0x00000000)}}, {VT_exponent,22,0x3a865d,{DOUBLEWITHTWODWORDINTREE(0x38e00000,0x00000000)}}, {VT_exponent,21,0x1d432f,{DOUBLEWITHTWODWORDINTREE(0x38f00000,0x00000000)}}, {VT_exponent,22,0x3a8660,{DOUBLEWITHTWODWORDINTREE(0x39000000,0x00000000)}}, {VT_exponent,22,0x3a8661,{DOUBLEWITHTWODWORDINTREE(0x39100000,0x00000000)}}, {VT_exponent,22,0x3a8662,{DOUBLEWITHTWODWORDINTREE(0x39200000,0x00000000)}}, {VT_exponent,21,0x1d4332,{DOUBLEWITHTWODWORDINTREE(0x39300000,0x00000000)}}, {VT_exponent,18,0xd1d5,{DOUBLEWITHTWODWORDINTREE(0x39400000,0x00000000)}}, {VT_exponent,18,0x3bfda,{DOUBLEWITHTWODWORDINTREE(0x39500000,0x00000000)}}, {VT_exponent,15,0x7528,{DOUBLEWITHTWODWORDINTREE(0x39600000,0x00000000)}}, {VT_exponent,15,0x7529,{DOUBLEWITHTWODWORDINTREE(0x39700000,0x00000000)}}, {VT_exponent,18,0x3a95f,{DOUBLEWITHTWODWORDINTREE(0x39800000,0x00000000)}}, {VT_exponent,17,0x1d434,{DOUBLEWITHTWODWORDINTREE(0x39900000,0x00000000)}}, {VT_exponent,19,0x750cd,{DOUBLEWITHTWODWORDINTREE(0x39a00000,0x00000000)}}, {VT_exponent,18,0x3a867,{DOUBLEWITHTWODWORDINTREE(0x39b00000,0x00000000)}}, {VT_exponent,19,0x771fd,{DOUBLEWITHTWODWORDINTREE(0x39c00000,0x00000000)}}, {VT_exponent,15,0x7764,{DOUBLEWITHTWODWORDINTREE(0x39d00000,0x00000000)}}, {VT_exponent,20,0xee3f9,{DOUBLEWITHTWODWORDINTREE(0x39e00000,0x00000000)}}, {VT_exponent,18,0x3bfdb,{DOUBLEWITHTWODWORDINTREE(0x39f00000,0x00000000)}}, {VT_exponent,16,0xeff7,{DOUBLEWITHTWODWORDINTREE(0x3a000000,0x00000000)}}, {VT_exponent,18,0xd1d6,{DOUBLEWITHTWODWORDINTREE(0x3a100000,0x00000000)}}, {VT_exponent,22,0x3a8663,{DOUBLEWITHTWODWORDINTREE(0x3a200000,0x00000000)}}, {VT_exponent,22,0x3a8666,{DOUBLEWITHTWODWORDINTREE(0x3a300000,0x00000000)}}, {VT_exponent,18,0x3b8fa,{DOUBLEWITHTWODWORDINTREE(0x3a400000,0x00000000)}}, {VT_exponent,17,0x1d435,{DOUBLEWITHTWODWORDINTREE(0x3a500000,0x00000000)}}, {VT_exponent,17,0x1dfe4,{DOUBLEWITHTWODWORDINTREE(0x3a600000,0x00000000)}}, {VT_exponent,19,0x750d8,{DOUBLEWITHTWODWORDINTREE(0x3a700000,0x00000000)}}, {VT_exponent,18,0x3a95b,{DOUBLEWITHTWODWORDINTREE(0x3a800000,0x00000000)}}, {VT_exponent,19,0x77f9e,{DOUBLEWITHTWODWORDINTREE(0x3a900000,0x00000000)}}, {VT_exponent,19,0x750d9,{DOUBLEWITHTWODWORDINTREE(0x3aa00000,0x00000000)}}, {VT_exponent,18,0xd1d7,{DOUBLEWITHTWODWORDINTREE(0x3ab00000,0x00000000)}}, {VT_exponent,18,0x3b8ff,{DOUBLEWITHTWODWORDINTREE(0x3ac00000,0x00000000)}}, {VT_exponent,17,0x1dc7c,{DOUBLEWITHTWODWORDINTREE(0x3ad00000,0x00000000)}}, {VT_exponent,19,0x750da,{DOUBLEWITHTWODWORDINTREE(0x3ae00000,0x00000000)}}, {VT_exponent,17,0x7bc2,{DOUBLEWITHTWODWORDINTREE(0x3af00000,0x00000000)}}, {VT_exponent,18,0x3bfca,{DOUBLEWITHTWODWORDINTREE(0x3b000000,0x00000000)}}, {VT_exponent,19,0x1a3a5,{DOUBLEWITHTWODWORDINTREE(0x3b100000,0x00000000)}}, {VT_exponent,17,0x1d4ac,{DOUBLEWITHTWODWORDINTREE(0x3b200000,0x00000000)}}, {VT_exponent,18,0x3a86e,{DOUBLEWITHTWODWORDINTREE(0x3b300000,0x00000000)}}, {VT_exponent,17,0x1d438,{DOUBLEWITHTWODWORDINTREE(0x3b400000,0x00000000)}}, {VT_exponent,18,0x3bfcb,{DOUBLEWITHTWODWORDINTREE(0x3b500000,0x00000000)}}, {VT_exponent,19,0x1a3a7,{DOUBLEWITHTWODWORDINTREE(0x3b600000,0x00000000)}}, {VT_exponent,17,0x1d4ae,{DOUBLEWITHTWODWORDINTREE(0x3b700000,0x00000000)}}, {VT_exponent,18,0x3bfce,{DOUBLEWITHTWODWORDINTREE(0x3b800000,0x00000000)}}, {VT_exponent,18,0xf78c,{DOUBLEWITHTWODWORDINTREE(0x3b900000,0x00000000)}}, {VT_exponent,17,0x1dfec,{DOUBLEWITHTWODWORDINTREE(0x3ba00000,0x00000000)}}, {VT_exponent,17,0x1d439,{DOUBLEWITHTWODWORDINTREE(0x3bb00000,0x00000000)}}, {VT_exponent,17,0x68e8,{DOUBLEWITHTWODWORDINTREE(0x3bc00000,0x00000000)}}, {VT_exponent,18,0xf786,{DOUBLEWITHTWODWORDINTREE(0x3bd00000,0x00000000)}}, {VT_exponent,15,0x771e,{DOUBLEWITHTWODWORDINTREE(0x3be00000,0x00000000)}}, {VT_exponent,17,0x1dfe6,{DOUBLEWITHTWODWORDINTREE(0x3bf00000,0x00000000)}}, {VT_exponent,15,0x77f8,{DOUBLEWITHTWODWORDINTREE(0x3c000000,0x00000000)}}, {VT_exponent,14,0x3bb3,{DOUBLEWITHTWODWORDINTREE(0x3c100000,0x00000000)}}, {VT_exponent,14,0x3b8e,{DOUBLEWITHTWODWORDINTREE(0x3c200000,0x00000000)}}, {VT_exponent,14,0x3a82,{DOUBLEWITHTWODWORDINTREE(0x3c300000,0x00000000)}}, {VT_exponent,14,0x3b96,{DOUBLEWITHTWODWORDINTREE(0x3c400000,0x00000000)}}, {VT_exponent,13,0x68f,{DOUBLEWITHTWODWORDINTREE(0x3c500000,0x00000000)}}, {VT_exponent,12,0x3d4,{DOUBLEWITHTWODWORDINTREE(0x3c600000,0x00000000)}}, {VT_exponent,13,0x1dca,{DOUBLEWITHTWODWORDINTREE(0x3c700000,0x00000000)}}, {VT_exponent,12,0x346,{DOUBLEWITHTWODWORDINTREE(0x3c800000,0x00000000)}}, {VT_exponent,12,0xee7,{DOUBLEWITHTWODWORDINTREE(0x3c900000,0x00000000)}}, {VT_exponent,12,0xeea,{DOUBLEWITHTWODWORDINTREE(0x3ca00000,0x00000000)}}, {VT_exponent,11,0x1ed,{DOUBLEWITHTWODWORDINTREE(0x3cb00000,0x00000000)}}, {VT_exponent,12,0x3df,{DOUBLEWITHTWODWORDINTREE(0x3cc00000,0x00000000)}}, {VT_exponent,11,0x1a2,{DOUBLEWITHTWODWORDINTREE(0x3cd00000,0x00000000)}}, {VT_exponent,11,0x56f,{DOUBLEWITHTWODWORDINTREE(0x3ce00000,0x00000000)}}, {VT_exponent,11,0xb9,{DOUBLEWITHTWODWORDINTREE(0x3cf00000,0x00000000)}}, {VT_exponent,13,0x7b2,{DOUBLEWITHTWODWORDINTREE(0x3d000000,0x00000000)}}, {VT_exponent,13,0x1dd8,{DOUBLEWITHTWODWORDINTREE(0x3d100000,0x00000000)}}, {VT_exponent,13,0x15ba,{DOUBLEWITHTWODWORDINTREE(0x3d200000,0x00000000)}}, {VT_exponent,12,0xee6,{DOUBLEWITHTWODWORDINTREE(0x3d300000,0x00000000)}}, {VT_exponent,13,0x15b8,{DOUBLEWITHTWODWORDINTREE(0x3d400000,0x00000000)}}, {VT_exponent,14,0xf79,{DOUBLEWITHTWODWORDINTREE(0x3d500000,0x00000000)}}, {VT_exponent,14,0x3a81,{DOUBLEWITHTWODWORDINTREE(0x3d600000,0x00000000)}}, {VT_exponent,14,0xd1c,{DOUBLEWITHTWODWORDINTREE(0x3d700000,0x00000000)}}, {VT_exponent,15,0x7765,{DOUBLEWITHTWODWORDINTREE(0x3d800000,0x00000000)}}, {VT_exponent,14,0xf54,{DOUBLEWITHTWODWORDINTREE(0x3d900000,0x00000000)}}, {VT_exponent,13,0x15b9,{DOUBLEWITHTWODWORDINTREE(0x3da00000,0x00000000)}}, {VT_exponent,13,0x7ab,{DOUBLEWITHTWODWORDINTREE(0x3db00000,0x00000000)}}, {VT_exponent,15,0x7500,{DOUBLEWITHTWODWORDINTREE(0x3dc00000,0x00000000)}}, {VT_exponent,15,0x1eaa,{DOUBLEWITHTWODWORDINTREE(0x3dd00000,0x00000000)}}, {VT_exponent,15,0x7501,{DOUBLEWITHTWODWORDINTREE(0x3de00000,0x00000000)}}, {VT_exponent,15,0x1eab,{DOUBLEWITHTWODWORDINTREE(0x3df00000,0x00000000)}}, {VT_exponent,14,0x3b97,{DOUBLEWITHTWODWORDINTREE(0x3e000000,0x00000000)}}, {VT_exponent,15,0x752a,{DOUBLEWITHTWODWORDINTREE(0x3e100000,0x00000000)}}, {VT_exponent,15,0x77fa,{DOUBLEWITHTWODWORDINTREE(0x3e200000,0x00000000)}}, {VT_double,10,0xf4,{DOUBLEWITHTWODWORDINTREE(0x3e35798e,0xe2308c3a)}}, {VT_exponent,14,0x3a93,{DOUBLEWITHTWODWORDINTREE(0x3e300000,0x00000000)}}, {VT_double,11,0x77c,{DOUBLEWITHTWODWORDINTREE(0x3e45798e,0xe2308c3a)}}, {VT_exponent,13,0x1dc6,{DOUBLEWITHTWODWORDINTREE(0x3e400000,0x00000000)}}, {VT_exponent,13,0x7bd,{DOUBLEWITHTWODWORDINTREE(0x3e500000,0x00000000)}}, {VT_exponent,13,0x1dff,{DOUBLEWITHTWODWORDINTREE(0x3e600000,0x00000000)}}, {VT_exponent,12,0xefe,{DOUBLEWITHTWODWORDINTREE(0x3e700000,0x00000000)}}, {VT_double,8,0xaf,{DOUBLEWITHTWODWORDINTREE(0x3e8ad7f2,0x9abcaf4a)}}, {VT_exponent,12,0xeed,{DOUBLEWITHTWODWORDINTREE(0x3e800000,0x00000000)}}, {VT_exponent,11,0xb8,{DOUBLEWITHTWODWORDINTREE(0x3e900000,0x00000000)}}, {VT_exponent,12,0x3d8,{DOUBLEWITHTWODWORDINTREE(0x3ea00000,0x00000000)}}, {VT_exponent,11,0x1eb,{DOUBLEWITHTWODWORDINTREE(0x3eb00000,0x00000000)}}, {VT_double,9,0x1d2,{DOUBLEWITHTWODWORDINTREE(0x3ec0c6f7,0xa0b5ed8e)}}, {VT_exponent,13,0x1d4b,{DOUBLEWITHTWODWORDINTREE(0x3ec00000,0x00000000)}}, {VT_exponent,13,0x7b3,{DOUBLEWITHTWODWORDINTREE(0x3ed00000,0x00000000)}}, {VT_exponent,10,0x5d,{DOUBLEWITHTWODWORDINTREE(0x3ee00000,0x00000000)}}, {VT_exponent,12,0xeeb,{DOUBLEWITHTWODWORDINTREE(0x3ef00000,0x00000000)}}, {VT_exponent,11,0x1ee,{DOUBLEWITHTWODWORDINTREE(0x3f000000,0x00000000)}}, {VT_exponent,10,0x5f,{DOUBLEWITHTWODWORDINTREE(0x3f100000,0x00000000)}}, {VT_exponent,10,0x2b6,{DOUBLEWITHTWODWORDINTREE(0x3f200000,0x00000000)}}, {VT_exponent,9,0x1de,{DOUBLEWITHTWODWORDINTREE(0x3f300000,0x00000000)}}, {VT_double,10,0xd0,{DOUBLEWITHTWODWORDINTREE(0x3f454c98,0x5f06f694)}}, {VT_double,6,0x9,{DOUBLEWITHTWODWORDINTREE(0x3f4a36e2,0xeb1c432d)}}, {VT_exponent,8,0xe8,{DOUBLEWITHTWODWORDINTREE(0x3f400000,0x00000000)}}, {VT_double,4,0xf,{DOUBLEWITHTWODWORDINTREE(0x3f50624d,0xd2f1a9fc)}}, {VT_exponent,8,0xae,{DOUBLEWITHTWODWORDINTREE(0x3f500000,0x00000000)}}, {VT_double,5,0x16,{DOUBLEWITHTWODWORDINTREE(0x3f60624d,0xd2f1a9fc)}}, {VT_exponent,7,0x1b,{DOUBLEWITHTWODWORDINTREE(0x3f600000,0x00000000)}}, {VT_exponent,7,0x76,{DOUBLEWITHTWODWORDINTREE(0x3f700000,0x00000000)}}, {VT_exponent,7,0xa,{DOUBLEWITHTWODWORDINTREE(0x3f800000,0x00000000)}}, {VT_exponent,6,0x8,{DOUBLEWITHTWODWORDINTREE(0x3f900000,0x00000000)}}, {VT_exponent,6,0xe,{DOUBLEWITHTWODWORDINTREE(0x3fa00000,0x00000000)}}, {VT_double,11,0x751,{DOUBLEWITHTWODWORDINTREE(0x3fbe69ad,0x42c3c9ee)}}, {VT_exponent,6,0x4,{DOUBLEWITHTWODWORDINTREE(0x3fb00000,0x00000000)}}, {VT_exponent,6,0xc,{DOUBLEWITHTWODWORDINTREE(0x3fc00000,0x00000000)}}, {VT_exponent,5,0x3,{DOUBLEWITHTWODWORDINTREE(0x3fd00000,0x00000000)}}, {VT_double,11,0x777,{DOUBLEWITHTWODWORDINTREE(0x3fe00000,0x00000000)}}, {VT_double,9,0x1d6,{DOUBLEWITHTWODWORDINTREE(0x3fefffff,0xf8000002)}}, {VT_exponent,4,0x8,{DOUBLEWITHTWODWORDINTREE(0x3fe00000,0x00000000)}}, {VT_double,4,0x0,{DOUBLEWITHTWODWORDINTREE(0x3ff00000,0x00000000)}}, {VT_exponent,5,0x13,{DOUBLEWITHTWODWORDINTREE(0x3ff00000,0x00000000)}}, {VT_exponent,5,0x1b,{DOUBLEWITHTWODWORDINTREE(0x40000000,0x00000000)}}, {VT_double,9,0x15a,{DOUBLEWITHTWODWORDINTREE(0x401921fb,0x54442d18)}}, {VT_exponent,5,0x17,{DOUBLEWITHTWODWORDINTREE(0x40100000,0x00000000)}}, {VT_exponent,5,0x12,{DOUBLEWITHTWODWORDINTREE(0x40200000,0x00000000)}}, {VT_double,11,0x774,{DOUBLEWITHTWODWORDINTREE(0x4035ee14,0x80000000)}}, {VT_exponent,5,0x19,{DOUBLEWITHTWODWORDINTREE(0x40300000,0x00000000)}}, {VT_double,9,0x1d3,{DOUBLEWITHTWODWORDINTREE(0x404ca5dc,0x1a63c1f8)}}, {VT_exponent,5,0x1a,{DOUBLEWITHTWODWORDINTREE(0x40400000,0x00000000)}}, {VT_double,11,0x77e,{DOUBLEWITHTWODWORDINTREE(0x405bb32f,0xe0000000)}}, {VT_double,10,0x5e,{DOUBLEWITHTWODWORDINTREE(0x405c332f,0xe0000000)}}, {VT_exponent,5,0x18,{DOUBLEWITHTWODWORDINTREE(0x40500000,0x00000000)}}, {VT_double,9,0x1d7,{DOUBLEWITHTWODWORDINTREE(0x40668000,0x00000000)}}, {VT_exponent,5,0x1c,{DOUBLEWITHTWODWORDINTREE(0x40600000,0x00000000)}}, {VT_double,9,0x1d5,{DOUBLEWITHTWODWORDINTREE(0x40768000,0x00000000)}}, {VT_exponent,5,0x14,{DOUBLEWITHTWODWORDINTREE(0x40700000,0x00000000)}}, {VT_double,11,0x77d,{DOUBLEWITHTWODWORDINTREE(0x408f4000,0x00000000)}}, {VT_exponent,5,0x5,{DOUBLEWITHTWODWORDINTREE(0x40800000,0x00000000)}}, {VT_double,10,0xd2,{DOUBLEWITHTWODWORDINTREE(0x409233ff,0xffffffff)}}, {VT_double,8,0x3c,{DOUBLEWITHTWODWORDINTREE(0x40923400,0x00000000)}}, {VT_double,11,0x753,{DOUBLEWITHTWODWORDINTREE(0x40923400,0x00000001)}}, {VT_double,10,0xd3,{DOUBLEWITHTWODWORDINTREE(0x4092abff,0xffffffff)}}, {VT_double,8,0x35,{DOUBLEWITHTWODWORDINTREE(0x4092ac00,0x00000000)}}, {VT_double,11,0x770,{DOUBLEWITHTWODWORDINTREE(0x4092ac00,0x00000001)}}, {VT_exponent,8,0x16,{DOUBLEWITHTWODWORDINTREE(0x40900000,0x00000000)}}, {VT_exponent,12,0xee2,{DOUBLEWITHTWODWORDINTREE(0x40a00000,0x00000000)}}, {VT_exponent,12,0xee4,{DOUBLEWITHTWODWORDINTREE(0x40b00000,0x00000000)}}, {VT_double,7,0x1f,{DOUBLEWITHTWODWORDINTREE(0x40c81c80,0x00000000)}}, {VT_exponent,8,0xac,{DOUBLEWITHTWODWORDINTREE(0x40c00000,0x00000000)}}, {VT_exponent,13,0x15bb,{DOUBLEWITHTWODWORDINTREE(0x40d00000,0x00000000)}}, {VT_exponent,22,0x3a8667,{DOUBLEWITHTWODWORDINTREE(0x40e00000,0x00000000)}}, {VT_exponent,22,0x3a86d8,{DOUBLEWITHTWODWORDINTREE(0x40f00000,0x00000000)}}, {VT_exponent,22,0x3a86d9,{DOUBLEWITHTWODWORDINTREE(0x41000000,0x00000000)}}, {VT_exponent,22,0x3a86da,{DOUBLEWITHTWODWORDINTREE(0x41100000,0x00000000)}}, {VT_exponent,17,0x1dc7e,{DOUBLEWITHTWODWORDINTREE(0x41200000,0x00000000)}}, {VT_exponent,22,0x3a86db,{DOUBLEWITHTWODWORDINTREE(0x41300000,0x00000000)}}, {VT_exponent,22,0x3a86dc,{DOUBLEWITHTWODWORDINTREE(0x41400000,0x00000000)}}, {VT_exponent,22,0x3a86dd,{DOUBLEWITHTWODWORDINTREE(0x41500000,0x00000000)}}, {VT_exponent,22,0x3a86de,{DOUBLEWITHTWODWORDINTREE(0x41600000,0x00000000)}}, {VT_exponent,22,0x3a86df,{DOUBLEWITHTWODWORDINTREE(0x41700000,0x00000000)}}, {VT_exponent,22,0x3a86f0,{DOUBLEWITHTWODWORDINTREE(0x41800000,0x00000000)}}, {VT_exponent,22,0x3a86f1,{DOUBLEWITHTWODWORDINTREE(0x41900000,0x00000000)}}, {VT_exponent,22,0x3a86f2,{DOUBLEWITHTWODWORDINTREE(0x41a00000,0x00000000)}}, {VT_exponent,22,0x3a86f3,{DOUBLEWITHTWODWORDINTREE(0x41b00000,0x00000000)}}, {VT_double,6,0x2a,{DOUBLEWITHTWODWORDINTREE(0x41cdcd64,0xff800000)}}, {VT_exponent,22,0x3a86f4,{DOUBLEWITHTWODWORDINTREE(0x41c00000,0x00000000)}}, {VT_exponent,22,0x3a86f5,{DOUBLEWITHTWODWORDINTREE(0x41d00000,0x00000000)}}, {VT_exponent,22,0x3a86f6,{DOUBLEWITHTWODWORDINTREE(0x41e00000,0x00000000)}}, {VT_exponent,22,0x3a86f7,{DOUBLEWITHTWODWORDINTREE(0x41f00000,0x00000000)}}, {VT_exponent,22,0x3a86f8,{DOUBLEWITHTWODWORDINTREE(0x42000000,0x00000000)}}, {VT_exponent,22,0x3a86f9,{DOUBLEWITHTWODWORDINTREE(0x42100000,0x00000000)}}, {VT_exponent,22,0x3a86fa,{DOUBLEWITHTWODWORDINTREE(0x42200000,0x00000000)}}, {VT_exponent,22,0x3a86fb,{DOUBLEWITHTWODWORDINTREE(0x42300000,0x00000000)}}, {VT_exponent,22,0x3a86fc,{DOUBLEWITHTWODWORDINTREE(0x42400000,0x00000000)}}, {VT_exponent,22,0x3a86fd,{DOUBLEWITHTWODWORDINTREE(0x42500000,0x00000000)}}, {VT_exponent,22,0x3a86fe,{DOUBLEWITHTWODWORDINTREE(0x42600000,0x00000000)}}, {VT_exponent,22,0x3a86ff,{DOUBLEWITHTWODWORDINTREE(0x42700000,0x00000000)}}, {VT_exponent,22,0x3a8740,{DOUBLEWITHTWODWORDINTREE(0x42800000,0x00000000)}}, {VT_exponent,22,0x3a8741,{DOUBLEWITHTWODWORDINTREE(0x42900000,0x00000000)}}, {VT_exponent,22,0x3a8742,{DOUBLEWITHTWODWORDINTREE(0x42a00000,0x00000000)}}, {VT_exponent,22,0x3a8743,{DOUBLEWITHTWODWORDINTREE(0x42b00000,0x00000000)}}, {VT_exponent,22,0x3a8744,{DOUBLEWITHTWODWORDINTREE(0x42c00000,0x00000000)}}, {VT_exponent,22,0x3a8745,{DOUBLEWITHTWODWORDINTREE(0x42d00000,0x00000000)}}, {VT_exponent,22,0x3a8746,{DOUBLEWITHTWODWORDINTREE(0x42e00000,0x00000000)}}, {VT_exponent,22,0x3a8747,{DOUBLEWITHTWODWORDINTREE(0x42f00000,0x00000000)}}, {VT_exponent,22,0x3a8748,{DOUBLEWITHTWODWORDINTREE(0x43000000,0x00000000)}}, {VT_exponent,22,0x3a8749,{DOUBLEWITHTWODWORDINTREE(0x43100000,0x00000000)}}, {VT_exponent,22,0x3a874a,{DOUBLEWITHTWODWORDINTREE(0x43200000,0x00000000)}}, {VT_exponent,22,0x3a874b,{DOUBLEWITHTWODWORDINTREE(0x43300000,0x00000000)}}, {VT_exponent,22,0x3a874c,{DOUBLEWITHTWODWORDINTREE(0x43400000,0x00000000)}}, {VT_exponent,22,0x3a874d,{DOUBLEWITHTWODWORDINTREE(0x43500000,0x00000000)}}, {VT_exponent,22,0x3a874e,{DOUBLEWITHTWODWORDINTREE(0x43600000,0x00000000)}}, {VT_exponent,22,0x3a874f,{DOUBLEWITHTWODWORDINTREE(0x43700000,0x00000000)}}, {VT_exponent,22,0x3a8750,{DOUBLEWITHTWODWORDINTREE(0x43800000,0x00000000)}}, {VT_exponent,22,0x3a8751,{DOUBLEWITHTWODWORDINTREE(0x43900000,0x00000000)}}, {VT_exponent,22,0x3a8752,{DOUBLEWITHTWODWORDINTREE(0x43a00000,0x00000000)}}, {VT_exponent,22,0x3a8753,{DOUBLEWITHTWODWORDINTREE(0x43b00000,0x00000000)}}, {VT_exponent,22,0x3a8754,{DOUBLEWITHTWODWORDINTREE(0x43c00000,0x00000000)}}, {VT_exponent,22,0x3a8755,{DOUBLEWITHTWODWORDINTREE(0x43d00000,0x00000000)}}, {VT_exponent,22,0x3a8756,{DOUBLEWITHTWODWORDINTREE(0x43e00000,0x00000000)}}, {VT_exponent,22,0x3a8757,{DOUBLEWITHTWODWORDINTREE(0x43f00000,0x00000000)}}, {VT_exponent,22,0x3a8758,{DOUBLEWITHTWODWORDINTREE(0x44000000,0x00000000)}}, {VT_exponent,15,0x1a3b,{DOUBLEWITHTWODWORDINTREE(0x44100000,0x00000000)}}, {VT_exponent,22,0x3a8759,{DOUBLEWITHTWODWORDINTREE(0x44200000,0x00000000)}}, {VT_exponent,22,0x3a875a,{DOUBLEWITHTWODWORDINTREE(0x44300000,0x00000000)}}, {VT_exponent,22,0x3a875b,{DOUBLEWITHTWODWORDINTREE(0x44400000,0x00000000)}}, {VT_exponent,22,0x3a875c,{DOUBLEWITHTWODWORDINTREE(0x44500000,0x00000000)}}, {VT_exponent,22,0x3a875d,{DOUBLEWITHTWODWORDINTREE(0x44600000,0x00000000)}}, {VT_exponent,22,0x3a875e,{DOUBLEWITHTWODWORDINTREE(0x44700000,0x00000000)}}, {VT_exponent,22,0x3a875f,{DOUBLEWITHTWODWORDINTREE(0x44800000,0x00000000)}}, {VT_exponent,22,0x3a8760,{DOUBLEWITHTWODWORDINTREE(0x44900000,0x00000000)}}, {VT_exponent,22,0x3a8761,{DOUBLEWITHTWODWORDINTREE(0x44a00000,0x00000000)}}, {VT_exponent,22,0x3a8762,{DOUBLEWITHTWODWORDINTREE(0x44b00000,0x00000000)}}, {VT_exponent,22,0x3a8763,{DOUBLEWITHTWODWORDINTREE(0x44c00000,0x00000000)}}, {VT_exponent,22,0x3a8764,{DOUBLEWITHTWODWORDINTREE(0x44d00000,0x00000000)}}, {VT_exponent,22,0x3a8765,{DOUBLEWITHTWODWORDINTREE(0x44e00000,0x00000000)}}, {VT_exponent,22,0x3a8766,{DOUBLEWITHTWODWORDINTREE(0x44f00000,0x00000000)}}, {VT_exponent,22,0x3a8767,{DOUBLEWITHTWODWORDINTREE(0x45000000,0x00000000)}}, {VT_exponent,22,0x3a8768,{DOUBLEWITHTWODWORDINTREE(0x45100000,0x00000000)}}, {VT_exponent,22,0x3a8769,{DOUBLEWITHTWODWORDINTREE(0x45200000,0x00000000)}}, {VT_exponent,22,0x3a876a,{DOUBLEWITHTWODWORDINTREE(0x45300000,0x00000000)}}, {VT_exponent,22,0x3a876b,{DOUBLEWITHTWODWORDINTREE(0x45400000,0x00000000)}}, {VT_exponent,22,0x3a876c,{DOUBLEWITHTWODWORDINTREE(0x45500000,0x00000000)}}, {VT_exponent,22,0x3a876d,{DOUBLEWITHTWODWORDINTREE(0x45600000,0x00000000)}}, {VT_exponent,22,0x3a876e,{DOUBLEWITHTWODWORDINTREE(0x45700000,0x00000000)}}, {VT_exponent,22,0x3a876f,{DOUBLEWITHTWODWORDINTREE(0x45800000,0x00000000)}}, {VT_exponent,22,0x3a8770,{DOUBLEWITHTWODWORDINTREE(0x45900000,0x00000000)}}, {VT_exponent,22,0x3a8771,{DOUBLEWITHTWODWORDINTREE(0x45a00000,0x00000000)}}, {VT_exponent,22,0x3a8772,{DOUBLEWITHTWODWORDINTREE(0x45b00000,0x00000000)}}, {VT_exponent,22,0x3a8773,{DOUBLEWITHTWODWORDINTREE(0x45c00000,0x00000000)}}, {VT_exponent,22,0x3a8774,{DOUBLEWITHTWODWORDINTREE(0x45d00000,0x00000000)}}, {VT_exponent,22,0x3a8775,{DOUBLEWITHTWODWORDINTREE(0x45e00000,0x00000000)}}, {VT_exponent,22,0x3a8776,{DOUBLEWITHTWODWORDINTREE(0x45f00000,0x00000000)}}, {VT_exponent,22,0x3a8777,{DOUBLEWITHTWODWORDINTREE(0x46000000,0x00000000)}}, {VT_exponent,22,0x3a8778,{DOUBLEWITHTWODWORDINTREE(0x46100000,0x00000000)}}, {VT_exponent,22,0x3a8779,{DOUBLEWITHTWODWORDINTREE(0x46200000,0x00000000)}}, {VT_exponent,22,0x3a877a,{DOUBLEWITHTWODWORDINTREE(0x46300000,0x00000000)}}, {VT_exponent,22,0x3a877b,{DOUBLEWITHTWODWORDINTREE(0x46400000,0x00000000)}}, {VT_exponent,22,0x3a877c,{DOUBLEWITHTWODWORDINTREE(0x46500000,0x00000000)}}, {VT_exponent,22,0x3a877d,{DOUBLEWITHTWODWORDINTREE(0x46600000,0x00000000)}}, {VT_exponent,22,0x3a877e,{DOUBLEWITHTWODWORDINTREE(0x46700000,0x00000000)}}, {VT_exponent,22,0x3a877f,{DOUBLEWITHTWODWORDINTREE(0x46800000,0x00000000)}}, {VT_exponent,22,0x3a8780,{DOUBLEWITHTWODWORDINTREE(0x46900000,0x00000000)}}, {VT_exponent,22,0x3a8781,{DOUBLEWITHTWODWORDINTREE(0x46a00000,0x00000000)}}, {VT_exponent,22,0x3a8782,{DOUBLEWITHTWODWORDINTREE(0x46b00000,0x00000000)}}, {VT_exponent,22,0x3a8783,{DOUBLEWITHTWODWORDINTREE(0x46c00000,0x00000000)}}, {VT_exponent,22,0x3a8784,{DOUBLEWITHTWODWORDINTREE(0x46d00000,0x00000000)}}, {VT_exponent,22,0x3a8785,{DOUBLEWITHTWODWORDINTREE(0x46e00000,0x00000000)}}, {VT_exponent,22,0x3a8786,{DOUBLEWITHTWODWORDINTREE(0x46f00000,0x00000000)}}, {VT_exponent,22,0x3a8787,{DOUBLEWITHTWODWORDINTREE(0x47000000,0x00000000)}}, {VT_exponent,22,0x3a8788,{DOUBLEWITHTWODWORDINTREE(0x47100000,0x00000000)}}, {VT_exponent,22,0x3a8789,{DOUBLEWITHTWODWORDINTREE(0x47200000,0x00000000)}}, {VT_exponent,22,0x3a878a,{DOUBLEWITHTWODWORDINTREE(0x47300000,0x00000000)}}, {VT_exponent,22,0x3a878b,{DOUBLEWITHTWODWORDINTREE(0x47400000,0x00000000)}}, {VT_exponent,22,0x3a878c,{DOUBLEWITHTWODWORDINTREE(0x47500000,0x00000000)}}, {VT_exponent,22,0x3a878d,{DOUBLEWITHTWODWORDINTREE(0x47600000,0x00000000)}}, {VT_exponent,22,0x3a878e,{DOUBLEWITHTWODWORDINTREE(0x47700000,0x00000000)}}, {VT_exponent,22,0x3a878f,{DOUBLEWITHTWODWORDINTREE(0x47800000,0x00000000)}}, {VT_exponent,22,0x3a8790,{DOUBLEWITHTWODWORDINTREE(0x47900000,0x00000000)}}, {VT_exponent,22,0x3a8791,{DOUBLEWITHTWODWORDINTREE(0x47a00000,0x00000000)}}, {VT_exponent,22,0x3a8792,{DOUBLEWITHTWODWORDINTREE(0x47b00000,0x00000000)}}, {VT_exponent,22,0x3a8793,{DOUBLEWITHTWODWORDINTREE(0x47c00000,0x00000000)}}, {VT_exponent,22,0x3a8794,{DOUBLEWITHTWODWORDINTREE(0x47d00000,0x00000000)}}, {VT_exponent,22,0x3a8795,{DOUBLEWITHTWODWORDINTREE(0x47e00000,0x00000000)}}, {VT_exponent,22,0x3a8796,{DOUBLEWITHTWODWORDINTREE(0x47f00000,0x00000000)}}, {VT_exponent,22,0x3a8797,{DOUBLEWITHTWODWORDINTREE(0x48000000,0x00000000)}}, {VT_exponent,22,0x3a8798,{DOUBLEWITHTWODWORDINTREE(0x48100000,0x00000000)}}, {VT_exponent,22,0x3a8799,{DOUBLEWITHTWODWORDINTREE(0x48200000,0x00000000)}}, {VT_exponent,22,0x3a879a,{DOUBLEWITHTWODWORDINTREE(0x48300000,0x00000000)}}, {VT_exponent,22,0x3a879b,{DOUBLEWITHTWODWORDINTREE(0x48400000,0x00000000)}}, {VT_exponent,22,0x3a879c,{DOUBLEWITHTWODWORDINTREE(0x48500000,0x00000000)}}, {VT_exponent,22,0x3a879d,{DOUBLEWITHTWODWORDINTREE(0x48600000,0x00000000)}}, {VT_exponent,22,0x3a879e,{DOUBLEWITHTWODWORDINTREE(0x48700000,0x00000000)}}, {VT_exponent,22,0x3a879f,{DOUBLEWITHTWODWORDINTREE(0x48800000,0x00000000)}}, {VT_exponent,22,0x3a87a0,{DOUBLEWITHTWODWORDINTREE(0x48900000,0x00000000)}}, {VT_exponent,22,0x3a87a1,{DOUBLEWITHTWODWORDINTREE(0x48a00000,0x00000000)}}, {VT_exponent,22,0x3a87a2,{DOUBLEWITHTWODWORDINTREE(0x48b00000,0x00000000)}}, {VT_exponent,22,0x3a87a3,{DOUBLEWITHTWODWORDINTREE(0x48c00000,0x00000000)}}, {VT_exponent,22,0x3a87a4,{DOUBLEWITHTWODWORDINTREE(0x48d00000,0x00000000)}}, {VT_exponent,22,0x3a87a5,{DOUBLEWITHTWODWORDINTREE(0x48e00000,0x00000000)}}, {VT_exponent,22,0x3a87a6,{DOUBLEWITHTWODWORDINTREE(0x48f00000,0x00000000)}}, {VT_exponent,22,0x3a87a7,{DOUBLEWITHTWODWORDINTREE(0x49000000,0x00000000)}}, {VT_exponent,22,0x3a87a8,{DOUBLEWITHTWODWORDINTREE(0x49100000,0x00000000)}}, {VT_exponent,22,0x3a87a9,{DOUBLEWITHTWODWORDINTREE(0x49200000,0x00000000)}}, {VT_exponent,22,0x3a87aa,{DOUBLEWITHTWODWORDINTREE(0x49300000,0x00000000)}}, {VT_exponent,22,0x3a87ab,{DOUBLEWITHTWODWORDINTREE(0x49400000,0x00000000)}}, {VT_exponent,22,0x3a87ac,{DOUBLEWITHTWODWORDINTREE(0x49500000,0x00000000)}}, {VT_exponent,22,0x3a87ad,{DOUBLEWITHTWODWORDINTREE(0x49600000,0x00000000)}}, {VT_exponent,22,0x3a87ae,{DOUBLEWITHTWODWORDINTREE(0x49700000,0x00000000)}}, {VT_exponent,22,0x3a87af,{DOUBLEWITHTWODWORDINTREE(0x49800000,0x00000000)}}, {VT_exponent,22,0x3a87b0,{DOUBLEWITHTWODWORDINTREE(0x49900000,0x00000000)}}, {VT_exponent,22,0x3a87b1,{DOUBLEWITHTWODWORDINTREE(0x49a00000,0x00000000)}}, {VT_exponent,22,0x3a87b2,{DOUBLEWITHTWODWORDINTREE(0x49b00000,0x00000000)}}, {VT_exponent,22,0x3a87b3,{DOUBLEWITHTWODWORDINTREE(0x49c00000,0x00000000)}}, {VT_exponent,22,0x3a87b4,{DOUBLEWITHTWODWORDINTREE(0x49d00000,0x00000000)}}, {VT_exponent,22,0x3a87b5,{DOUBLEWITHTWODWORDINTREE(0x49e00000,0x00000000)}}, {VT_exponent,22,0x3a87b6,{DOUBLEWITHTWODWORDINTREE(0x49f00000,0x00000000)}}, {VT_exponent,22,0x3a87b7,{DOUBLEWITHTWODWORDINTREE(0x4a000000,0x00000000)}}, {VT_exponent,22,0x3a87b8,{DOUBLEWITHTWODWORDINTREE(0x4a100000,0x00000000)}}, {VT_exponent,22,0x3a87b9,{DOUBLEWITHTWODWORDINTREE(0x4a200000,0x00000000)}}, {VT_exponent,22,0x3a87ba,{DOUBLEWITHTWODWORDINTREE(0x4a300000,0x00000000)}}, {VT_exponent,22,0x3a87bb,{DOUBLEWITHTWODWORDINTREE(0x4a400000,0x00000000)}}, {VT_exponent,22,0x3a87bc,{DOUBLEWITHTWODWORDINTREE(0x4a500000,0x00000000)}}, {VT_exponent,22,0x3a87bd,{DOUBLEWITHTWODWORDINTREE(0x4a600000,0x00000000)}}, {VT_exponent,22,0x3a87be,{DOUBLEWITHTWODWORDINTREE(0x4a700000,0x00000000)}}, {VT_exponent,22,0x3a87bf,{DOUBLEWITHTWODWORDINTREE(0x4a800000,0x00000000)}}, {VT_exponent,22,0x3a87c0,{DOUBLEWITHTWODWORDINTREE(0x4a900000,0x00000000)}}, {VT_exponent,22,0x3a87c1,{DOUBLEWITHTWODWORDINTREE(0x4aa00000,0x00000000)}}, {VT_exponent,22,0x3a87c2,{DOUBLEWITHTWODWORDINTREE(0x4ab00000,0x00000000)}}, {VT_exponent,22,0x3a87c3,{DOUBLEWITHTWODWORDINTREE(0x4ac00000,0x00000000)}}, {VT_exponent,22,0x3a87c4,{DOUBLEWITHTWODWORDINTREE(0x4ad00000,0x00000000)}}, {VT_exponent,22,0x3a87c5,{DOUBLEWITHTWODWORDINTREE(0x4ae00000,0x00000000)}}, {VT_exponent,22,0x3a87c6,{DOUBLEWITHTWODWORDINTREE(0x4af00000,0x00000000)}}, {VT_exponent,22,0x3a87c7,{DOUBLEWITHTWODWORDINTREE(0x4b000000,0x00000000)}}, {VT_exponent,22,0x3a87c8,{DOUBLEWITHTWODWORDINTREE(0x4b100000,0x00000000)}}, {VT_exponent,22,0x3a87c9,{DOUBLEWITHTWODWORDINTREE(0x4b200000,0x00000000)}}, {VT_exponent,22,0x3a87ca,{DOUBLEWITHTWODWORDINTREE(0x4b300000,0x00000000)}}, {VT_exponent,22,0x3a87cb,{DOUBLEWITHTWODWORDINTREE(0x4b400000,0x00000000)}}, {VT_exponent,22,0x3a87cc,{DOUBLEWITHTWODWORDINTREE(0x4b500000,0x00000000)}}, {VT_exponent,22,0x3a87cd,{DOUBLEWITHTWODWORDINTREE(0x4b600000,0x00000000)}}, {VT_exponent,22,0x3a87ce,{DOUBLEWITHTWODWORDINTREE(0x4b700000,0x00000000)}}, {VT_exponent,22,0x3a87cf,{DOUBLEWITHTWODWORDINTREE(0x4b800000,0x00000000)}}, {VT_exponent,22,0x3a87d0,{DOUBLEWITHTWODWORDINTREE(0x4b900000,0x00000000)}}, {VT_exponent,22,0x3a87d1,{DOUBLEWITHTWODWORDINTREE(0x4ba00000,0x00000000)}}, {VT_exponent,22,0x3a87d2,{DOUBLEWITHTWODWORDINTREE(0x4bb00000,0x00000000)}}, {VT_exponent,22,0x3a87d3,{DOUBLEWITHTWODWORDINTREE(0x4bc00000,0x00000000)}}, {VT_exponent,22,0x3a87d4,{DOUBLEWITHTWODWORDINTREE(0x4bd00000,0x00000000)}}, {VT_exponent,22,0x3a87d5,{DOUBLEWITHTWODWORDINTREE(0x4be00000,0x00000000)}}, {VT_exponent,22,0x3a87d6,{DOUBLEWITHTWODWORDINTREE(0x4bf00000,0x00000000)}}, {VT_exponent,22,0x3a87d7,{DOUBLEWITHTWODWORDINTREE(0x4c000000,0x00000000)}}, {VT_exponent,22,0x3a87d8,{DOUBLEWITHTWODWORDINTREE(0x4c100000,0x00000000)}}, {VT_exponent,22,0x3a87d9,{DOUBLEWITHTWODWORDINTREE(0x4c200000,0x00000000)}}, {VT_exponent,22,0x3a87da,{DOUBLEWITHTWODWORDINTREE(0x4c300000,0x00000000)}}, {VT_exponent,22,0x3a87db,{DOUBLEWITHTWODWORDINTREE(0x4c400000,0x00000000)}}, {VT_exponent,22,0x3a87dc,{DOUBLEWITHTWODWORDINTREE(0x4c500000,0x00000000)}}, {VT_exponent,22,0x3a87dd,{DOUBLEWITHTWODWORDINTREE(0x4c600000,0x00000000)}}, {VT_exponent,22,0x3a87de,{DOUBLEWITHTWODWORDINTREE(0x4c700000,0x00000000)}}, {VT_exponent,22,0x3a87df,{DOUBLEWITHTWODWORDINTREE(0x4c800000,0x00000000)}}, {VT_exponent,22,0x3a87e0,{DOUBLEWITHTWODWORDINTREE(0x4c900000,0x00000000)}}, {VT_exponent,22,0x3a87e1,{DOUBLEWITHTWODWORDINTREE(0x4ca00000,0x00000000)}}, {VT_exponent,22,0x3a87e2,{DOUBLEWITHTWODWORDINTREE(0x4cb00000,0x00000000)}}, {VT_exponent,22,0x3a87e3,{DOUBLEWITHTWODWORDINTREE(0x4cc00000,0x00000000)}}, {VT_exponent,22,0x3a87e4,{DOUBLEWITHTWODWORDINTREE(0x4cd00000,0x00000000)}}, {VT_exponent,22,0x3a87e5,{DOUBLEWITHTWODWORDINTREE(0x4ce00000,0x00000000)}}, {VT_exponent,22,0x3a87e6,{DOUBLEWITHTWODWORDINTREE(0x4cf00000,0x00000000)}}, {VT_exponent,22,0x3a87e7,{DOUBLEWITHTWODWORDINTREE(0x4d000000,0x00000000)}}, {VT_exponent,22,0x3a87e8,{DOUBLEWITHTWODWORDINTREE(0x4d100000,0x00000000)}}, {VT_exponent,22,0x3a87e9,{DOUBLEWITHTWODWORDINTREE(0x4d200000,0x00000000)}}, {VT_exponent,22,0x3a87ea,{DOUBLEWITHTWODWORDINTREE(0x4d300000,0x00000000)}}, {VT_exponent,22,0x3a87eb,{DOUBLEWITHTWODWORDINTREE(0x4d400000,0x00000000)}}, {VT_exponent,22,0x3a87ec,{DOUBLEWITHTWODWORDINTREE(0x4d500000,0x00000000)}}, {VT_exponent,22,0x3a87ed,{DOUBLEWITHTWODWORDINTREE(0x4d600000,0x00000000)}}, {VT_exponent,22,0x3a87ee,{DOUBLEWITHTWODWORDINTREE(0x4d700000,0x00000000)}}, {VT_exponent,22,0x3a87ef,{DOUBLEWITHTWODWORDINTREE(0x4d800000,0x00000000)}}, {VT_exponent,22,0x3a87f0,{DOUBLEWITHTWODWORDINTREE(0x4d900000,0x00000000)}}, {VT_exponent,22,0x3a87f1,{DOUBLEWITHTWODWORDINTREE(0x4da00000,0x00000000)}}, {VT_exponent,22,0x3a87f2,{DOUBLEWITHTWODWORDINTREE(0x4db00000,0x00000000)}}, {VT_exponent,22,0x3a87f3,{DOUBLEWITHTWODWORDINTREE(0x4dc00000,0x00000000)}}, {VT_exponent,22,0x3a87f4,{DOUBLEWITHTWODWORDINTREE(0x4dd00000,0x00000000)}}, {VT_exponent,22,0x3a87f5,{DOUBLEWITHTWODWORDINTREE(0x4de00000,0x00000000)}}, {VT_exponent,22,0x3a87f6,{DOUBLEWITHTWODWORDINTREE(0x4df00000,0x00000000)}}, {VT_exponent,22,0x3a87f7,{DOUBLEWITHTWODWORDINTREE(0x4e000000,0x00000000)}}, {VT_exponent,22,0x3a87f8,{DOUBLEWITHTWODWORDINTREE(0x4e100000,0x00000000)}}, {VT_exponent,22,0x3a87f9,{DOUBLEWITHTWODWORDINTREE(0x4e200000,0x00000000)}}, {VT_exponent,22,0x3a87fa,{DOUBLEWITHTWODWORDINTREE(0x4e300000,0x00000000)}}, {VT_exponent,22,0x3a87fb,{DOUBLEWITHTWODWORDINTREE(0x4e400000,0x00000000)}}, {VT_exponent,22,0x3a87fc,{DOUBLEWITHTWODWORDINTREE(0x4e500000,0x00000000)}}, {VT_exponent,22,0x3a87fd,{DOUBLEWITHTWODWORDINTREE(0x4e600000,0x00000000)}}, {VT_exponent,22,0x3a87fe,{DOUBLEWITHTWODWORDINTREE(0x4e700000,0x00000000)}}, {VT_exponent,22,0x3a87ff,{DOUBLEWITHTWODWORDINTREE(0x4e800000,0x00000000)}}, {VT_exponent,22,0x3a9000,{DOUBLEWITHTWODWORDINTREE(0x4e900000,0x00000000)}}, {VT_exponent,22,0x3a9001,{DOUBLEWITHTWODWORDINTREE(0x4ea00000,0x00000000)}}, {VT_exponent,22,0x3a9002,{DOUBLEWITHTWODWORDINTREE(0x4eb00000,0x00000000)}}, {VT_exponent,22,0x3a9003,{DOUBLEWITHTWODWORDINTREE(0x4ec00000,0x00000000)}}, {VT_exponent,22,0x3a9004,{DOUBLEWITHTWODWORDINTREE(0x4ed00000,0x00000000)}}, {VT_exponent,22,0x3a9005,{DOUBLEWITHTWODWORDINTREE(0x4ee00000,0x00000000)}}, {VT_exponent,22,0x3a9006,{DOUBLEWITHTWODWORDINTREE(0x4ef00000,0x00000000)}}, {VT_exponent,22,0x3a9007,{DOUBLEWITHTWODWORDINTREE(0x4f000000,0x00000000)}}, {VT_exponent,22,0x3a9008,{DOUBLEWITHTWODWORDINTREE(0x4f100000,0x00000000)}}, {VT_exponent,22,0x3a9009,{DOUBLEWITHTWODWORDINTREE(0x4f200000,0x00000000)}}, {VT_exponent,22,0x3a900a,{DOUBLEWITHTWODWORDINTREE(0x4f300000,0x00000000)}}, {VT_exponent,22,0x3a900b,{DOUBLEWITHTWODWORDINTREE(0x4f400000,0x00000000)}}, {VT_exponent,22,0x3a900c,{DOUBLEWITHTWODWORDINTREE(0x4f500000,0x00000000)}}, {VT_exponent,22,0x3a900d,{DOUBLEWITHTWODWORDINTREE(0x4f600000,0x00000000)}}, {VT_exponent,22,0x3a900e,{DOUBLEWITHTWODWORDINTREE(0x4f700000,0x00000000)}}, {VT_exponent,22,0x3a900f,{DOUBLEWITHTWODWORDINTREE(0x4f800000,0x00000000)}}, {VT_exponent,22,0x3a9010,{DOUBLEWITHTWODWORDINTREE(0x4f900000,0x00000000)}}, {VT_exponent,22,0x3a9011,{DOUBLEWITHTWODWORDINTREE(0x4fa00000,0x00000000)}}, {VT_exponent,22,0x3a9012,{DOUBLEWITHTWODWORDINTREE(0x4fb00000,0x00000000)}}, {VT_exponent,22,0x3a9013,{DOUBLEWITHTWODWORDINTREE(0x4fc00000,0x00000000)}}, {VT_exponent,22,0x3a9014,{DOUBLEWITHTWODWORDINTREE(0x4fd00000,0x00000000)}}, {VT_exponent,22,0x3a9015,{DOUBLEWITHTWODWORDINTREE(0x4fe00000,0x00000000)}}, {VT_exponent,22,0x3a9016,{DOUBLEWITHTWODWORDINTREE(0x4ff00000,0x00000000)}}, {VT_exponent,22,0x3a9017,{DOUBLEWITHTWODWORDINTREE(0x50000000,0x00000000)}}, {VT_exponent,22,0x3a9018,{DOUBLEWITHTWODWORDINTREE(0x50100000,0x00000000)}}, {VT_exponent,22,0x3a9019,{DOUBLEWITHTWODWORDINTREE(0x50200000,0x00000000)}}, {VT_exponent,22,0x3a901a,{DOUBLEWITHTWODWORDINTREE(0x50300000,0x00000000)}}, {VT_exponent,22,0x3a901b,{DOUBLEWITHTWODWORDINTREE(0x50400000,0x00000000)}}, {VT_exponent,22,0x3a901c,{DOUBLEWITHTWODWORDINTREE(0x50500000,0x00000000)}}, {VT_exponent,22,0x3a901d,{DOUBLEWITHTWODWORDINTREE(0x50600000,0x00000000)}}, {VT_exponent,22,0x3a901e,{DOUBLEWITHTWODWORDINTREE(0x50700000,0x00000000)}}, {VT_exponent,22,0x3a901f,{DOUBLEWITHTWODWORDINTREE(0x50800000,0x00000000)}}, {VT_exponent,22,0x3a9020,{DOUBLEWITHTWODWORDINTREE(0x50900000,0x00000000)}}, {VT_exponent,22,0x3a9021,{DOUBLEWITHTWODWORDINTREE(0x50a00000,0x00000000)}}, {VT_exponent,22,0x3a9022,{DOUBLEWITHTWODWORDINTREE(0x50b00000,0x00000000)}}, {VT_exponent,22,0x3a9023,{DOUBLEWITHTWODWORDINTREE(0x50c00000,0x00000000)}}, {VT_exponent,22,0x3a9024,{DOUBLEWITHTWODWORDINTREE(0x50d00000,0x00000000)}}, {VT_exponent,22,0x3a9025,{DOUBLEWITHTWODWORDINTREE(0x50e00000,0x00000000)}}, {VT_exponent,22,0x3a9026,{DOUBLEWITHTWODWORDINTREE(0x50f00000,0x00000000)}}, {VT_exponent,22,0x3a9027,{DOUBLEWITHTWODWORDINTREE(0x51000000,0x00000000)}}, {VT_exponent,22,0x3a9028,{DOUBLEWITHTWODWORDINTREE(0x51100000,0x00000000)}}, {VT_exponent,22,0x3a9029,{DOUBLEWITHTWODWORDINTREE(0x51200000,0x00000000)}}, {VT_exponent,22,0x3a902a,{DOUBLEWITHTWODWORDINTREE(0x51300000,0x00000000)}}, {VT_exponent,22,0x3a902b,{DOUBLEWITHTWODWORDINTREE(0x51400000,0x00000000)}}, {VT_exponent,22,0x3a902c,{DOUBLEWITHTWODWORDINTREE(0x51500000,0x00000000)}}, {VT_exponent,22,0x3a902d,{DOUBLEWITHTWODWORDINTREE(0x51600000,0x00000000)}}, {VT_exponent,22,0x3a902e,{DOUBLEWITHTWODWORDINTREE(0x51700000,0x00000000)}}, {VT_exponent,22,0x3a902f,{DOUBLEWITHTWODWORDINTREE(0x51800000,0x00000000)}}, {VT_exponent,22,0x3a9030,{DOUBLEWITHTWODWORDINTREE(0x51900000,0x00000000)}}, {VT_exponent,22,0x3a9031,{DOUBLEWITHTWODWORDINTREE(0x51a00000,0x00000000)}}, {VT_exponent,22,0x3a9032,{DOUBLEWITHTWODWORDINTREE(0x51b00000,0x00000000)}}, {VT_exponent,22,0x3a9033,{DOUBLEWITHTWODWORDINTREE(0x51c00000,0x00000000)}}, {VT_exponent,22,0x3a9034,{DOUBLEWITHTWODWORDINTREE(0x51d00000,0x00000000)}}, {VT_exponent,22,0x3a9035,{DOUBLEWITHTWODWORDINTREE(0x51e00000,0x00000000)}}, {VT_exponent,22,0x3a9036,{DOUBLEWITHTWODWORDINTREE(0x51f00000,0x00000000)}}, {VT_exponent,22,0x3a9037,{DOUBLEWITHTWODWORDINTREE(0x52000000,0x00000000)}}, {VT_exponent,22,0x3a9038,{DOUBLEWITHTWODWORDINTREE(0x52100000,0x00000000)}}, {VT_exponent,22,0x3a9039,{DOUBLEWITHTWODWORDINTREE(0x52200000,0x00000000)}}, {VT_exponent,22,0x3a903a,{DOUBLEWITHTWODWORDINTREE(0x52300000,0x00000000)}}, {VT_exponent,22,0x3a903b,{DOUBLEWITHTWODWORDINTREE(0x52400000,0x00000000)}}, {VT_exponent,22,0x3a903c,{DOUBLEWITHTWODWORDINTREE(0x52500000,0x00000000)}}, {VT_exponent,22,0x3a903d,{DOUBLEWITHTWODWORDINTREE(0x52600000,0x00000000)}}, {VT_exponent,22,0x3a903e,{DOUBLEWITHTWODWORDINTREE(0x52700000,0x00000000)}}, {VT_exponent,22,0x3a903f,{DOUBLEWITHTWODWORDINTREE(0x52800000,0x00000000)}}, {VT_exponent,22,0x3a9040,{DOUBLEWITHTWODWORDINTREE(0x52900000,0x00000000)}}, {VT_exponent,22,0x3a9041,{DOUBLEWITHTWODWORDINTREE(0x52a00000,0x00000000)}}, {VT_exponent,22,0x3a9042,{DOUBLEWITHTWODWORDINTREE(0x52b00000,0x00000000)}}, {VT_exponent,22,0x3a9043,{DOUBLEWITHTWODWORDINTREE(0x52c00000,0x00000000)}}, {VT_exponent,22,0x3a9044,{DOUBLEWITHTWODWORDINTREE(0x52d00000,0x00000000)}}, {VT_exponent,22,0x3a9045,{DOUBLEWITHTWODWORDINTREE(0x52e00000,0x00000000)}}, {VT_exponent,22,0x3a9046,{DOUBLEWITHTWODWORDINTREE(0x52f00000,0x00000000)}}, {VT_exponent,22,0x3a9047,{DOUBLEWITHTWODWORDINTREE(0x53000000,0x00000000)}}, {VT_exponent,22,0x3a9048,{DOUBLEWITHTWODWORDINTREE(0x53100000,0x00000000)}}, {VT_exponent,22,0x3a9049,{DOUBLEWITHTWODWORDINTREE(0x53200000,0x00000000)}}, {VT_exponent,22,0x3a904a,{DOUBLEWITHTWODWORDINTREE(0x53300000,0x00000000)}}, {VT_exponent,22,0x3a904b,{DOUBLEWITHTWODWORDINTREE(0x53400000,0x00000000)}}, {VT_exponent,22,0x3a904c,{DOUBLEWITHTWODWORDINTREE(0x53500000,0x00000000)}}, {VT_exponent,22,0x3a904d,{DOUBLEWITHTWODWORDINTREE(0x53600000,0x00000000)}}, {VT_exponent,22,0x3a904e,{DOUBLEWITHTWODWORDINTREE(0x53700000,0x00000000)}}, {VT_exponent,22,0x3a904f,{DOUBLEWITHTWODWORDINTREE(0x53800000,0x00000000)}}, {VT_exponent,22,0x3a9050,{DOUBLEWITHTWODWORDINTREE(0x53900000,0x00000000)}}, {VT_exponent,22,0x3a9051,{DOUBLEWITHTWODWORDINTREE(0x53a00000,0x00000000)}}, {VT_exponent,22,0x3a9052,{DOUBLEWITHTWODWORDINTREE(0x53b00000,0x00000000)}}, {VT_exponent,22,0x3a9053,{DOUBLEWITHTWODWORDINTREE(0x53c00000,0x00000000)}}, {VT_exponent,22,0x3a9054,{DOUBLEWITHTWODWORDINTREE(0x53d00000,0x00000000)}}, {VT_exponent,22,0x3a9055,{DOUBLEWITHTWODWORDINTREE(0x53e00000,0x00000000)}}, {VT_exponent,22,0x3a9056,{DOUBLEWITHTWODWORDINTREE(0x53f00000,0x00000000)}}, {VT_exponent,22,0x3a9057,{DOUBLEWITHTWODWORDINTREE(0x54000000,0x00000000)}}, {VT_exponent,22,0x3a9058,{DOUBLEWITHTWODWORDINTREE(0x54100000,0x00000000)}}, {VT_exponent,22,0x3a9059,{DOUBLEWITHTWODWORDINTREE(0x54200000,0x00000000)}}, {VT_exponent,22,0x3a905a,{DOUBLEWITHTWODWORDINTREE(0x54300000,0x00000000)}}, {VT_exponent,22,0x3a905b,{DOUBLEWITHTWODWORDINTREE(0x54400000,0x00000000)}}, {VT_exponent,22,0x3a905c,{DOUBLEWITHTWODWORDINTREE(0x54500000,0x00000000)}}, {VT_exponent,22,0x3a905d,{DOUBLEWITHTWODWORDINTREE(0x54600000,0x00000000)}}, {VT_exponent,22,0x3a905e,{DOUBLEWITHTWODWORDINTREE(0x54700000,0x00000000)}}, {VT_exponent,22,0x3a905f,{DOUBLEWITHTWODWORDINTREE(0x54800000,0x00000000)}}, {VT_exponent,22,0x3a9060,{DOUBLEWITHTWODWORDINTREE(0x54900000,0x00000000)}}, {VT_exponent,22,0x3a9061,{DOUBLEWITHTWODWORDINTREE(0x54a00000,0x00000000)}}, {VT_exponent,22,0x3a9062,{DOUBLEWITHTWODWORDINTREE(0x54b00000,0x00000000)}}, {VT_exponent,22,0x3a9063,{DOUBLEWITHTWODWORDINTREE(0x54c00000,0x00000000)}}, {VT_exponent,22,0x3a9064,{DOUBLEWITHTWODWORDINTREE(0x54d00000,0x00000000)}}, {VT_exponent,22,0x3a9065,{DOUBLEWITHTWODWORDINTREE(0x54e00000,0x00000000)}}, {VT_exponent,22,0x3a9066,{DOUBLEWITHTWODWORDINTREE(0x54f00000,0x00000000)}}, {VT_exponent,22,0x3a9067,{DOUBLEWITHTWODWORDINTREE(0x55000000,0x00000000)}}, {VT_exponent,22,0x3a9068,{DOUBLEWITHTWODWORDINTREE(0x55100000,0x00000000)}}, {VT_exponent,22,0x3a9069,{DOUBLEWITHTWODWORDINTREE(0x55200000,0x00000000)}}, {VT_exponent,22,0x3a906a,{DOUBLEWITHTWODWORDINTREE(0x55300000,0x00000000)}}, {VT_exponent,22,0x3a906b,{DOUBLEWITHTWODWORDINTREE(0x55400000,0x00000000)}}, {VT_exponent,22,0x3a906c,{DOUBLEWITHTWODWORDINTREE(0x55500000,0x00000000)}}, {VT_exponent,22,0x3a906d,{DOUBLEWITHTWODWORDINTREE(0x55600000,0x00000000)}}, {VT_exponent,22,0x3a906e,{DOUBLEWITHTWODWORDINTREE(0x55700000,0x00000000)}}, {VT_exponent,22,0x3a906f,{DOUBLEWITHTWODWORDINTREE(0x55800000,0x00000000)}}, {VT_exponent,22,0x3a9070,{DOUBLEWITHTWODWORDINTREE(0x55900000,0x00000000)}}, {VT_exponent,22,0x3a9071,{DOUBLEWITHTWODWORDINTREE(0x55a00000,0x00000000)}}, {VT_exponent,22,0x3a9072,{DOUBLEWITHTWODWORDINTREE(0x55b00000,0x00000000)}}, {VT_exponent,22,0x3a9073,{DOUBLEWITHTWODWORDINTREE(0x55c00000,0x00000000)}}, {VT_exponent,22,0x3a9074,{DOUBLEWITHTWODWORDINTREE(0x55d00000,0x00000000)}}, {VT_exponent,22,0x3a9075,{DOUBLEWITHTWODWORDINTREE(0x55e00000,0x00000000)}}, {VT_exponent,22,0x3a9076,{DOUBLEWITHTWODWORDINTREE(0x55f00000,0x00000000)}}, {VT_exponent,22,0x3a9077,{DOUBLEWITHTWODWORDINTREE(0x56000000,0x00000000)}}, {VT_exponent,22,0x3a9078,{DOUBLEWITHTWODWORDINTREE(0x56100000,0x00000000)}}, {VT_exponent,22,0x3a9079,{DOUBLEWITHTWODWORDINTREE(0x56200000,0x00000000)}}, {VT_exponent,22,0x3a907a,{DOUBLEWITHTWODWORDINTREE(0x56300000,0x00000000)}}, {VT_exponent,22,0x3a907b,{DOUBLEWITHTWODWORDINTREE(0x56400000,0x00000000)}}, {VT_exponent,22,0x3a907c,{DOUBLEWITHTWODWORDINTREE(0x56500000,0x00000000)}}, {VT_exponent,22,0x3a907d,{DOUBLEWITHTWODWORDINTREE(0x56600000,0x00000000)}}, {VT_exponent,22,0x3a907e,{DOUBLEWITHTWODWORDINTREE(0x56700000,0x00000000)}}, {VT_exponent,22,0x3a907f,{DOUBLEWITHTWODWORDINTREE(0x56800000,0x00000000)}}, {VT_exponent,22,0x3a9080,{DOUBLEWITHTWODWORDINTREE(0x56900000,0x00000000)}}, {VT_exponent,22,0x3a9081,{DOUBLEWITHTWODWORDINTREE(0x56a00000,0x00000000)}}, {VT_exponent,22,0x3a9082,{DOUBLEWITHTWODWORDINTREE(0x56b00000,0x00000000)}}, {VT_exponent,22,0x3a9083,{DOUBLEWITHTWODWORDINTREE(0x56c00000,0x00000000)}}, {VT_exponent,22,0x3a9084,{DOUBLEWITHTWODWORDINTREE(0x56d00000,0x00000000)}}, {VT_exponent,22,0x3a9085,{DOUBLEWITHTWODWORDINTREE(0x56e00000,0x00000000)}}, {VT_exponent,22,0x3a9086,{DOUBLEWITHTWODWORDINTREE(0x56f00000,0x00000000)}}, {VT_exponent,22,0x3a9087,{DOUBLEWITHTWODWORDINTREE(0x57000000,0x00000000)}}, {VT_exponent,22,0x3a9088,{DOUBLEWITHTWODWORDINTREE(0x57100000,0x00000000)}}, {VT_exponent,22,0x3a9089,{DOUBLEWITHTWODWORDINTREE(0x57200000,0x00000000)}}, {VT_exponent,22,0x3a908a,{DOUBLEWITHTWODWORDINTREE(0x57300000,0x00000000)}}, {VT_exponent,22,0x3a908b,{DOUBLEWITHTWODWORDINTREE(0x57400000,0x00000000)}}, {VT_exponent,22,0x3a908c,{DOUBLEWITHTWODWORDINTREE(0x57500000,0x00000000)}}, {VT_exponent,22,0x3a908d,{DOUBLEWITHTWODWORDINTREE(0x57600000,0x00000000)}}, {VT_exponent,22,0x3a908e,{DOUBLEWITHTWODWORDINTREE(0x57700000,0x00000000)}}, {VT_exponent,22,0x3a908f,{DOUBLEWITHTWODWORDINTREE(0x57800000,0x00000000)}}, {VT_exponent,22,0x3a9090,{DOUBLEWITHTWODWORDINTREE(0x57900000,0x00000000)}}, {VT_exponent,22,0x3a9091,{DOUBLEWITHTWODWORDINTREE(0x57a00000,0x00000000)}}, {VT_exponent,22,0x3a9092,{DOUBLEWITHTWODWORDINTREE(0x57b00000,0x00000000)}}, {VT_exponent,22,0x3a9093,{DOUBLEWITHTWODWORDINTREE(0x57c00000,0x00000000)}}, {VT_exponent,22,0x3a9094,{DOUBLEWITHTWODWORDINTREE(0x57d00000,0x00000000)}}, {VT_exponent,22,0x3a9095,{DOUBLEWITHTWODWORDINTREE(0x57e00000,0x00000000)}}, {VT_exponent,22,0x3a9096,{DOUBLEWITHTWODWORDINTREE(0x57f00000,0x00000000)}}, {VT_exponent,22,0x3a9097,{DOUBLEWITHTWODWORDINTREE(0x58000000,0x00000000)}}, {VT_exponent,22,0x3a9098,{DOUBLEWITHTWODWORDINTREE(0x58100000,0x00000000)}}, {VT_exponent,22,0x3a9099,{DOUBLEWITHTWODWORDINTREE(0x58200000,0x00000000)}}, {VT_exponent,22,0x3a909a,{DOUBLEWITHTWODWORDINTREE(0x58300000,0x00000000)}}, {VT_exponent,22,0x3a909b,{DOUBLEWITHTWODWORDINTREE(0x58400000,0x00000000)}}, {VT_exponent,22,0x3a909c,{DOUBLEWITHTWODWORDINTREE(0x58500000,0x00000000)}}, {VT_exponent,22,0x3a909d,{DOUBLEWITHTWODWORDINTREE(0x58600000,0x00000000)}}, {VT_exponent,22,0x3a909e,{DOUBLEWITHTWODWORDINTREE(0x58700000,0x00000000)}}, {VT_exponent,22,0x3a909f,{DOUBLEWITHTWODWORDINTREE(0x58800000,0x00000000)}}, {VT_exponent,22,0x3a90a0,{DOUBLEWITHTWODWORDINTREE(0x58900000,0x00000000)}}, {VT_exponent,22,0x3a90a1,{DOUBLEWITHTWODWORDINTREE(0x58a00000,0x00000000)}}, {VT_exponent,22,0x3a90a2,{DOUBLEWITHTWODWORDINTREE(0x58b00000,0x00000000)}}, {VT_exponent,22,0x3a90a3,{DOUBLEWITHTWODWORDINTREE(0x58c00000,0x00000000)}}, {VT_exponent,22,0x3a90a4,{DOUBLEWITHTWODWORDINTREE(0x58d00000,0x00000000)}}, {VT_exponent,22,0x3a90a5,{DOUBLEWITHTWODWORDINTREE(0x58e00000,0x00000000)}}, {VT_exponent,22,0x3a90a6,{DOUBLEWITHTWODWORDINTREE(0x58f00000,0x00000000)}}, {VT_exponent,22,0x3a90a7,{DOUBLEWITHTWODWORDINTREE(0x59000000,0x00000000)}}, {VT_exponent,22,0x3a90a8,{DOUBLEWITHTWODWORDINTREE(0x59100000,0x00000000)}}, {VT_exponent,22,0x3a90a9,{DOUBLEWITHTWODWORDINTREE(0x59200000,0x00000000)}}, {VT_exponent,22,0x3a90aa,{DOUBLEWITHTWODWORDINTREE(0x59300000,0x00000000)}}, {VT_exponent,22,0x3a90ab,{DOUBLEWITHTWODWORDINTREE(0x59400000,0x00000000)}}, {VT_exponent,22,0x3a90ac,{DOUBLEWITHTWODWORDINTREE(0x59500000,0x00000000)}}, {VT_exponent,22,0x3a90ad,{DOUBLEWITHTWODWORDINTREE(0x59600000,0x00000000)}}, {VT_exponent,22,0x3a90ae,{DOUBLEWITHTWODWORDINTREE(0x59700000,0x00000000)}}, {VT_exponent,22,0x3a90af,{DOUBLEWITHTWODWORDINTREE(0x59800000,0x00000000)}}, {VT_exponent,22,0x3a90b0,{DOUBLEWITHTWODWORDINTREE(0x59900000,0x00000000)}}, {VT_exponent,22,0x3a90b1,{DOUBLEWITHTWODWORDINTREE(0x59a00000,0x00000000)}}, {VT_exponent,22,0x3a90b2,{DOUBLEWITHTWODWORDINTREE(0x59b00000,0x00000000)}}, {VT_exponent,22,0x3a90b3,{DOUBLEWITHTWODWORDINTREE(0x59c00000,0x00000000)}}, {VT_exponent,22,0x3a90b4,{DOUBLEWITHTWODWORDINTREE(0x59d00000,0x00000000)}}, {VT_exponent,22,0x3a90b5,{DOUBLEWITHTWODWORDINTREE(0x59e00000,0x00000000)}}, {VT_exponent,22,0x3a90b6,{DOUBLEWITHTWODWORDINTREE(0x59f00000,0x00000000)}}, {VT_exponent,22,0x3a90b7,{DOUBLEWITHTWODWORDINTREE(0x5a000000,0x00000000)}}, {VT_exponent,22,0x3a90b8,{DOUBLEWITHTWODWORDINTREE(0x5a100000,0x00000000)}}, {VT_exponent,22,0x3a90b9,{DOUBLEWITHTWODWORDINTREE(0x5a200000,0x00000000)}}, {VT_exponent,22,0x3a90ba,{DOUBLEWITHTWODWORDINTREE(0x5a300000,0x00000000)}}, {VT_exponent,22,0x3a90bb,{DOUBLEWITHTWODWORDINTREE(0x5a400000,0x00000000)}}, {VT_exponent,22,0x3a90bc,{DOUBLEWITHTWODWORDINTREE(0x5a500000,0x00000000)}}, {VT_exponent,22,0x3a90bd,{DOUBLEWITHTWODWORDINTREE(0x5a600000,0x00000000)}}, {VT_exponent,22,0x3a90be,{DOUBLEWITHTWODWORDINTREE(0x5a700000,0x00000000)}}, {VT_exponent,22,0x3a90bf,{DOUBLEWITHTWODWORDINTREE(0x5a800000,0x00000000)}}, {VT_exponent,22,0x3a90c0,{DOUBLEWITHTWODWORDINTREE(0x5a900000,0x00000000)}}, {VT_exponent,22,0x3a90c1,{DOUBLEWITHTWODWORDINTREE(0x5aa00000,0x00000000)}}, {VT_exponent,22,0x3a90c2,{DOUBLEWITHTWODWORDINTREE(0x5ab00000,0x00000000)}}, {VT_exponent,22,0x3a90c3,{DOUBLEWITHTWODWORDINTREE(0x5ac00000,0x00000000)}}, {VT_exponent,22,0x3a90c4,{DOUBLEWITHTWODWORDINTREE(0x5ad00000,0x00000000)}}, {VT_exponent,22,0x3a90c5,{DOUBLEWITHTWODWORDINTREE(0x5ae00000,0x00000000)}}, {VT_exponent,22,0x3a90c6,{DOUBLEWITHTWODWORDINTREE(0x5af00000,0x00000000)}}, {VT_exponent,22,0x3a90c7,{DOUBLEWITHTWODWORDINTREE(0x5b000000,0x00000000)}}, {VT_exponent,22,0x3a90c8,{DOUBLEWITHTWODWORDINTREE(0x5b100000,0x00000000)}}, {VT_exponent,22,0x3a90c9,{DOUBLEWITHTWODWORDINTREE(0x5b200000,0x00000000)}}, {VT_exponent,22,0x3a90ca,{DOUBLEWITHTWODWORDINTREE(0x5b300000,0x00000000)}}, {VT_exponent,22,0x3a90cb,{DOUBLEWITHTWODWORDINTREE(0x5b400000,0x00000000)}}, {VT_exponent,22,0x3a90cc,{DOUBLEWITHTWODWORDINTREE(0x5b500000,0x00000000)}}, {VT_exponent,22,0x3a90cd,{DOUBLEWITHTWODWORDINTREE(0x5b600000,0x00000000)}}, {VT_exponent,22,0x3a90ce,{DOUBLEWITHTWODWORDINTREE(0x5b700000,0x00000000)}}, {VT_exponent,22,0x3a90cf,{DOUBLEWITHTWODWORDINTREE(0x5b800000,0x00000000)}}, {VT_exponent,22,0x3a90d0,{DOUBLEWITHTWODWORDINTREE(0x5b900000,0x00000000)}}, {VT_exponent,22,0x3a90d1,{DOUBLEWITHTWODWORDINTREE(0x5ba00000,0x00000000)}}, {VT_exponent,22,0x3a90d2,{DOUBLEWITHTWODWORDINTREE(0x5bb00000,0x00000000)}}, {VT_exponent,22,0x3a90d3,{DOUBLEWITHTWODWORDINTREE(0x5bc00000,0x00000000)}}, {VT_exponent,22,0x3a90d4,{DOUBLEWITHTWODWORDINTREE(0x5bd00000,0x00000000)}}, {VT_exponent,22,0x3a90d5,{DOUBLEWITHTWODWORDINTREE(0x5be00000,0x00000000)}}, {VT_exponent,22,0x3a90d6,{DOUBLEWITHTWODWORDINTREE(0x5bf00000,0x00000000)}}, {VT_exponent,22,0x3a90d7,{DOUBLEWITHTWODWORDINTREE(0x5c000000,0x00000000)}}, {VT_exponent,22,0x3a90d8,{DOUBLEWITHTWODWORDINTREE(0x5c100000,0x00000000)}}, {VT_exponent,22,0x3a90d9,{DOUBLEWITHTWODWORDINTREE(0x5c200000,0x00000000)}}, {VT_exponent,22,0x3a90da,{DOUBLEWITHTWODWORDINTREE(0x5c300000,0x00000000)}}, {VT_exponent,22,0x3a90db,{DOUBLEWITHTWODWORDINTREE(0x5c400000,0x00000000)}}, {VT_exponent,22,0x3a90dc,{DOUBLEWITHTWODWORDINTREE(0x5c500000,0x00000000)}}, {VT_exponent,22,0x3a90dd,{DOUBLEWITHTWODWORDINTREE(0x5c600000,0x00000000)}}, {VT_exponent,22,0x3a90de,{DOUBLEWITHTWODWORDINTREE(0x5c700000,0x00000000)}}, {VT_exponent,22,0x3a90df,{DOUBLEWITHTWODWORDINTREE(0x5c800000,0x00000000)}}, {VT_exponent,22,0x3a90e0,{DOUBLEWITHTWODWORDINTREE(0x5c900000,0x00000000)}}, {VT_exponent,22,0x3a90e1,{DOUBLEWITHTWODWORDINTREE(0x5ca00000,0x00000000)}}, {VT_exponent,22,0x3a90e2,{DOUBLEWITHTWODWORDINTREE(0x5cb00000,0x00000000)}}, {VT_exponent,22,0x3a90e3,{DOUBLEWITHTWODWORDINTREE(0x5cc00000,0x00000000)}}, {VT_exponent,22,0x3a90e4,{DOUBLEWITHTWODWORDINTREE(0x5cd00000,0x00000000)}}, {VT_exponent,22,0x3a90e5,{DOUBLEWITHTWODWORDINTREE(0x5ce00000,0x00000000)}}, {VT_exponent,22,0x3a90e6,{DOUBLEWITHTWODWORDINTREE(0x5cf00000,0x00000000)}}, {VT_exponent,22,0x3a90e7,{DOUBLEWITHTWODWORDINTREE(0x5d000000,0x00000000)}}, {VT_exponent,22,0x3a90e8,{DOUBLEWITHTWODWORDINTREE(0x5d100000,0x00000000)}}, {VT_exponent,22,0x3a90e9,{DOUBLEWITHTWODWORDINTREE(0x5d200000,0x00000000)}}, {VT_exponent,22,0x3a90ea,{DOUBLEWITHTWODWORDINTREE(0x5d300000,0x00000000)}}, {VT_exponent,22,0x3a90eb,{DOUBLEWITHTWODWORDINTREE(0x5d400000,0x00000000)}}, {VT_exponent,22,0x3a90ec,{DOUBLEWITHTWODWORDINTREE(0x5d500000,0x00000000)}}, {VT_exponent,22,0x3a90ed,{DOUBLEWITHTWODWORDINTREE(0x5d600000,0x00000000)}}, {VT_exponent,22,0x3a90ee,{DOUBLEWITHTWODWORDINTREE(0x5d700000,0x00000000)}}, {VT_exponent,22,0x3a90ef,{DOUBLEWITHTWODWORDINTREE(0x5d800000,0x00000000)}}, {VT_exponent,22,0x3a90f0,{DOUBLEWITHTWODWORDINTREE(0x5d900000,0x00000000)}}, {VT_exponent,22,0x3a90f1,{DOUBLEWITHTWODWORDINTREE(0x5da00000,0x00000000)}}, {VT_exponent,22,0x3a90f2,{DOUBLEWITHTWODWORDINTREE(0x5db00000,0x00000000)}}, {VT_exponent,22,0x3a90f3,{DOUBLEWITHTWODWORDINTREE(0x5dc00000,0x00000000)}}, {VT_exponent,22,0x3a90f4,{DOUBLEWITHTWODWORDINTREE(0x5dd00000,0x00000000)}}, {VT_exponent,22,0x3a90f5,{DOUBLEWITHTWODWORDINTREE(0x5de00000,0x00000000)}}, {VT_exponent,22,0x3a90f6,{DOUBLEWITHTWODWORDINTREE(0x5df00000,0x00000000)}}, {VT_exponent,22,0x3a90f7,{DOUBLEWITHTWODWORDINTREE(0x5e000000,0x00000000)}}, {VT_exponent,22,0x3a90f8,{DOUBLEWITHTWODWORDINTREE(0x5e100000,0x00000000)}}, {VT_exponent,22,0x3a90f9,{DOUBLEWITHTWODWORDINTREE(0x5e200000,0x00000000)}}, {VT_exponent,22,0x3a90fa,{DOUBLEWITHTWODWORDINTREE(0x5e300000,0x00000000)}}, {VT_exponent,22,0x3a90fb,{DOUBLEWITHTWODWORDINTREE(0x5e400000,0x00000000)}}, {VT_exponent,22,0x3a90fc,{DOUBLEWITHTWODWORDINTREE(0x5e500000,0x00000000)}}, {VT_exponent,22,0x3a90fd,{DOUBLEWITHTWODWORDINTREE(0x5e600000,0x00000000)}}, {VT_exponent,22,0x3a90fe,{DOUBLEWITHTWODWORDINTREE(0x5e700000,0x00000000)}}, {VT_exponent,22,0x3a90ff,{DOUBLEWITHTWODWORDINTREE(0x5e800000,0x00000000)}}, {VT_exponent,22,0x3a9100,{DOUBLEWITHTWODWORDINTREE(0x5e900000,0x00000000)}}, {VT_exponent,22,0x3a9101,{DOUBLEWITHTWODWORDINTREE(0x5ea00000,0x00000000)}}, {VT_exponent,22,0x3a9102,{DOUBLEWITHTWODWORDINTREE(0x5eb00000,0x00000000)}}, {VT_exponent,22,0x3a9103,{DOUBLEWITHTWODWORDINTREE(0x5ec00000,0x00000000)}}, {VT_exponent,22,0x3a9104,{DOUBLEWITHTWODWORDINTREE(0x5ed00000,0x00000000)}}, {VT_exponent,22,0x3a9105,{DOUBLEWITHTWODWORDINTREE(0x5ee00000,0x00000000)}}, {VT_exponent,22,0x3a9106,{DOUBLEWITHTWODWORDINTREE(0x5ef00000,0x00000000)}}, {VT_exponent,22,0x3a9107,{DOUBLEWITHTWODWORDINTREE(0x5f000000,0x00000000)}}, {VT_exponent,22,0x3a9108,{DOUBLEWITHTWODWORDINTREE(0x5f100000,0x00000000)}}, {VT_exponent,22,0x3a9109,{DOUBLEWITHTWODWORDINTREE(0x5f200000,0x00000000)}}, {VT_exponent,22,0x3a910a,{DOUBLEWITHTWODWORDINTREE(0x5f300000,0x00000000)}}, {VT_exponent,22,0x3a910b,{DOUBLEWITHTWODWORDINTREE(0x5f400000,0x00000000)}}, {VT_exponent,22,0x3a910c,{DOUBLEWITHTWODWORDINTREE(0x5f500000,0x00000000)}}, {VT_exponent,22,0x3a910d,{DOUBLEWITHTWODWORDINTREE(0x5f600000,0x00000000)}}, {VT_exponent,22,0x3a910e,{DOUBLEWITHTWODWORDINTREE(0x5f700000,0x00000000)}}, {VT_exponent,22,0x3a910f,{DOUBLEWITHTWODWORDINTREE(0x5f800000,0x00000000)}}, {VT_exponent,22,0x3a9110,{DOUBLEWITHTWODWORDINTREE(0x5f900000,0x00000000)}}, {VT_exponent,22,0x3a9111,{DOUBLEWITHTWODWORDINTREE(0x5fa00000,0x00000000)}}, {VT_exponent,22,0x3a9112,{DOUBLEWITHTWODWORDINTREE(0x5fb00000,0x00000000)}}, {VT_exponent,22,0x3a9113,{DOUBLEWITHTWODWORDINTREE(0x5fc00000,0x00000000)}}, {VT_exponent,22,0x3a9114,{DOUBLEWITHTWODWORDINTREE(0x5fd00000,0x00000000)}}, {VT_exponent,22,0x3a9115,{DOUBLEWITHTWODWORDINTREE(0x5fe00000,0x00000000)}}, {VT_exponent,22,0x3a9116,{DOUBLEWITHTWODWORDINTREE(0x5ff00000,0x00000000)}}, {VT_exponent,22,0x3a9117,{DOUBLEWITHTWODWORDINTREE(0x60000000,0x00000000)}}, {VT_exponent,22,0x3a9118,{DOUBLEWITHTWODWORDINTREE(0x60100000,0x00000000)}}, {VT_exponent,22,0x3a9119,{DOUBLEWITHTWODWORDINTREE(0x60200000,0x00000000)}}, {VT_exponent,22,0x3a911a,{DOUBLEWITHTWODWORDINTREE(0x60300000,0x00000000)}}, {VT_exponent,22,0x3a911b,{DOUBLEWITHTWODWORDINTREE(0x60400000,0x00000000)}}, {VT_exponent,22,0x3a911c,{DOUBLEWITHTWODWORDINTREE(0x60500000,0x00000000)}}, {VT_exponent,22,0x3a911d,{DOUBLEWITHTWODWORDINTREE(0x60600000,0x00000000)}}, {VT_exponent,22,0x3a911e,{DOUBLEWITHTWODWORDINTREE(0x60700000,0x00000000)}}, {VT_exponent,22,0x3a911f,{DOUBLEWITHTWODWORDINTREE(0x60800000,0x00000000)}}, {VT_exponent,22,0x3a9120,{DOUBLEWITHTWODWORDINTREE(0x60900000,0x00000000)}}, {VT_exponent,22,0x3a9121,{DOUBLEWITHTWODWORDINTREE(0x60a00000,0x00000000)}}, {VT_exponent,22,0x3a9122,{DOUBLEWITHTWODWORDINTREE(0x60b00000,0x00000000)}}, {VT_exponent,22,0x3a9123,{DOUBLEWITHTWODWORDINTREE(0x60c00000,0x00000000)}}, {VT_exponent,22,0x3a9124,{DOUBLEWITHTWODWORDINTREE(0x60d00000,0x00000000)}}, {VT_exponent,22,0x3a9125,{DOUBLEWITHTWODWORDINTREE(0x60e00000,0x00000000)}}, {VT_exponent,22,0x3a9126,{DOUBLEWITHTWODWORDINTREE(0x60f00000,0x00000000)}}, {VT_exponent,22,0x3a9127,{DOUBLEWITHTWODWORDINTREE(0x61000000,0x00000000)}}, {VT_exponent,22,0x3a9128,{DOUBLEWITHTWODWORDINTREE(0x61100000,0x00000000)}}, {VT_exponent,22,0x3a9129,{DOUBLEWITHTWODWORDINTREE(0x61200000,0x00000000)}}, {VT_exponent,22,0x3a912a,{DOUBLEWITHTWODWORDINTREE(0x61300000,0x00000000)}}, {VT_exponent,22,0x3a912b,{DOUBLEWITHTWODWORDINTREE(0x61400000,0x00000000)}}, {VT_exponent,22,0x3a912c,{DOUBLEWITHTWODWORDINTREE(0x61500000,0x00000000)}}, {VT_exponent,22,0x3a912d,{DOUBLEWITHTWODWORDINTREE(0x61600000,0x00000000)}}, {VT_exponent,22,0x3a912e,{DOUBLEWITHTWODWORDINTREE(0x61700000,0x00000000)}}, {VT_exponent,22,0x3a912f,{DOUBLEWITHTWODWORDINTREE(0x61800000,0x00000000)}}, {VT_exponent,22,0x3a9130,{DOUBLEWITHTWODWORDINTREE(0x61900000,0x00000000)}}, {VT_exponent,22,0x3a9131,{DOUBLEWITHTWODWORDINTREE(0x61a00000,0x00000000)}}, {VT_exponent,22,0x3a9132,{DOUBLEWITHTWODWORDINTREE(0x61b00000,0x00000000)}}, {VT_exponent,22,0x3a9133,{DOUBLEWITHTWODWORDINTREE(0x61c00000,0x00000000)}}, {VT_exponent,22,0x3a9134,{DOUBLEWITHTWODWORDINTREE(0x61d00000,0x00000000)}}, {VT_exponent,22,0x3a9135,{DOUBLEWITHTWODWORDINTREE(0x61e00000,0x00000000)}}, {VT_exponent,22,0x3a9136,{DOUBLEWITHTWODWORDINTREE(0x61f00000,0x00000000)}}, {VT_exponent,22,0x3a9137,{DOUBLEWITHTWODWORDINTREE(0x62000000,0x00000000)}}, {VT_exponent,22,0x3a9138,{DOUBLEWITHTWODWORDINTREE(0x62100000,0x00000000)}}, {VT_exponent,22,0x3a9139,{DOUBLEWITHTWODWORDINTREE(0x62200000,0x00000000)}}, {VT_exponent,22,0x3a913a,{DOUBLEWITHTWODWORDINTREE(0x62300000,0x00000000)}}, {VT_exponent,22,0x3a913b,{DOUBLEWITHTWODWORDINTREE(0x62400000,0x00000000)}}, {VT_exponent,22,0x3a913c,{DOUBLEWITHTWODWORDINTREE(0x62500000,0x00000000)}}, {VT_exponent,22,0x3a913d,{DOUBLEWITHTWODWORDINTREE(0x62600000,0x00000000)}}, {VT_exponent,22,0x3a913e,{DOUBLEWITHTWODWORDINTREE(0x62700000,0x00000000)}}, {VT_exponent,22,0x3a913f,{DOUBLEWITHTWODWORDINTREE(0x62800000,0x00000000)}}, {VT_exponent,22,0x3a9140,{DOUBLEWITHTWODWORDINTREE(0x62900000,0x00000000)}}, {VT_exponent,22,0x3a9141,{DOUBLEWITHTWODWORDINTREE(0x62a00000,0x00000000)}}, {VT_exponent,22,0x3a9142,{DOUBLEWITHTWODWORDINTREE(0x62b00000,0x00000000)}}, {VT_exponent,22,0x3a9143,{DOUBLEWITHTWODWORDINTREE(0x62c00000,0x00000000)}}, {VT_exponent,22,0x3a9144,{DOUBLEWITHTWODWORDINTREE(0x62d00000,0x00000000)}}, {VT_exponent,22,0x3a9145,{DOUBLEWITHTWODWORDINTREE(0x62e00000,0x00000000)}}, {VT_exponent,22,0x3a9146,{DOUBLEWITHTWODWORDINTREE(0x62f00000,0x00000000)}}, {VT_exponent,22,0x3a9147,{DOUBLEWITHTWODWORDINTREE(0x63000000,0x00000000)}}, {VT_exponent,22,0x3a9148,{DOUBLEWITHTWODWORDINTREE(0x63100000,0x00000000)}}, {VT_exponent,22,0x3a9149,{DOUBLEWITHTWODWORDINTREE(0x63200000,0x00000000)}}, {VT_exponent,22,0x3a914a,{DOUBLEWITHTWODWORDINTREE(0x63300000,0x00000000)}}, {VT_exponent,22,0x3a914b,{DOUBLEWITHTWODWORDINTREE(0x63400000,0x00000000)}}, {VT_exponent,22,0x3a914c,{DOUBLEWITHTWODWORDINTREE(0x63500000,0x00000000)}}, {VT_exponent,22,0x3a914d,{DOUBLEWITHTWODWORDINTREE(0x63600000,0x00000000)}}, {VT_exponent,22,0x3a914e,{DOUBLEWITHTWODWORDINTREE(0x63700000,0x00000000)}}, {VT_exponent,22,0x3a914f,{DOUBLEWITHTWODWORDINTREE(0x63800000,0x00000000)}}, {VT_exponent,22,0x3a9150,{DOUBLEWITHTWODWORDINTREE(0x63900000,0x00000000)}}, {VT_exponent,22,0x3a9151,{DOUBLEWITHTWODWORDINTREE(0x63a00000,0x00000000)}}, {VT_exponent,22,0x3a9152,{DOUBLEWITHTWODWORDINTREE(0x63b00000,0x00000000)}}, {VT_exponent,22,0x3a9153,{DOUBLEWITHTWODWORDINTREE(0x63c00000,0x00000000)}}, {VT_exponent,22,0x3a9154,{DOUBLEWITHTWODWORDINTREE(0x63d00000,0x00000000)}}, {VT_exponent,22,0x3a9155,{DOUBLEWITHTWODWORDINTREE(0x63e00000,0x00000000)}}, {VT_exponent,22,0x3a9156,{DOUBLEWITHTWODWORDINTREE(0x63f00000,0x00000000)}}, {VT_exponent,22,0x3a9157,{DOUBLEWITHTWODWORDINTREE(0x64000000,0x00000000)}}, {VT_exponent,22,0x3a9158,{DOUBLEWITHTWODWORDINTREE(0x64100000,0x00000000)}}, {VT_exponent,22,0x3a9159,{DOUBLEWITHTWODWORDINTREE(0x64200000,0x00000000)}}, {VT_exponent,22,0x3a915a,{DOUBLEWITHTWODWORDINTREE(0x64300000,0x00000000)}}, {VT_exponent,22,0x3a915b,{DOUBLEWITHTWODWORDINTREE(0x64400000,0x00000000)}}, {VT_exponent,22,0x3a915c,{DOUBLEWITHTWODWORDINTREE(0x64500000,0x00000000)}}, {VT_exponent,22,0x3a915d,{DOUBLEWITHTWODWORDINTREE(0x64600000,0x00000000)}}, {VT_exponent,22,0x3a915e,{DOUBLEWITHTWODWORDINTREE(0x64700000,0x00000000)}}, {VT_exponent,22,0x3a915f,{DOUBLEWITHTWODWORDINTREE(0x64800000,0x00000000)}}, {VT_exponent,22,0x3a9160,{DOUBLEWITHTWODWORDINTREE(0x64900000,0x00000000)}}, {VT_exponent,22,0x3a9161,{DOUBLEWITHTWODWORDINTREE(0x64a00000,0x00000000)}}, {VT_exponent,22,0x3a9162,{DOUBLEWITHTWODWORDINTREE(0x64b00000,0x00000000)}}, {VT_exponent,22,0x3a9163,{DOUBLEWITHTWODWORDINTREE(0x64c00000,0x00000000)}}, {VT_exponent,22,0x3a9164,{DOUBLEWITHTWODWORDINTREE(0x64d00000,0x00000000)}}, {VT_exponent,22,0x3a9165,{DOUBLEWITHTWODWORDINTREE(0x64e00000,0x00000000)}}, {VT_exponent,22,0x3a9166,{DOUBLEWITHTWODWORDINTREE(0x64f00000,0x00000000)}}, {VT_exponent,22,0x3a9167,{DOUBLEWITHTWODWORDINTREE(0x65000000,0x00000000)}}, {VT_exponent,22,0x3a9168,{DOUBLEWITHTWODWORDINTREE(0x65100000,0x00000000)}}, {VT_exponent,22,0x3a9169,{DOUBLEWITHTWODWORDINTREE(0x65200000,0x00000000)}}, {VT_exponent,22,0x3a916a,{DOUBLEWITHTWODWORDINTREE(0x65300000,0x00000000)}}, {VT_exponent,22,0x3a916b,{DOUBLEWITHTWODWORDINTREE(0x65400000,0x00000000)}}, {VT_exponent,22,0x3a916c,{DOUBLEWITHTWODWORDINTREE(0x65500000,0x00000000)}}, {VT_exponent,22,0x3a916d,{DOUBLEWITHTWODWORDINTREE(0x65600000,0x00000000)}}, {VT_exponent,22,0x3a916e,{DOUBLEWITHTWODWORDINTREE(0x65700000,0x00000000)}}, {VT_exponent,22,0x3a916f,{DOUBLEWITHTWODWORDINTREE(0x65800000,0x00000000)}}, {VT_exponent,22,0x3a9170,{DOUBLEWITHTWODWORDINTREE(0x65900000,0x00000000)}}, {VT_exponent,22,0x3a9171,{DOUBLEWITHTWODWORDINTREE(0x65a00000,0x00000000)}}, {VT_exponent,22,0x3a9172,{DOUBLEWITHTWODWORDINTREE(0x65b00000,0x00000000)}}, {VT_exponent,22,0x3a9173,{DOUBLEWITHTWODWORDINTREE(0x65c00000,0x00000000)}}, {VT_exponent,22,0x3a9174,{DOUBLEWITHTWODWORDINTREE(0x65d00000,0x00000000)}}, {VT_exponent,22,0x3a9175,{DOUBLEWITHTWODWORDINTREE(0x65e00000,0x00000000)}}, {VT_exponent,22,0x3a9176,{DOUBLEWITHTWODWORDINTREE(0x65f00000,0x00000000)}}, {VT_exponent,22,0x3a9177,{DOUBLEWITHTWODWORDINTREE(0x66000000,0x00000000)}}, {VT_exponent,22,0x3a9178,{DOUBLEWITHTWODWORDINTREE(0x66100000,0x00000000)}}, {VT_exponent,22,0x3a9179,{DOUBLEWITHTWODWORDINTREE(0x66200000,0x00000000)}}, {VT_exponent,22,0x3a917a,{DOUBLEWITHTWODWORDINTREE(0x66300000,0x00000000)}}, {VT_exponent,22,0x3a917b,{DOUBLEWITHTWODWORDINTREE(0x66400000,0x00000000)}}, {VT_exponent,22,0x3a917c,{DOUBLEWITHTWODWORDINTREE(0x66500000,0x00000000)}}, {VT_exponent,22,0x3a917d,{DOUBLEWITHTWODWORDINTREE(0x66600000,0x00000000)}}, {VT_exponent,22,0x3a917e,{DOUBLEWITHTWODWORDINTREE(0x66700000,0x00000000)}}, {VT_exponent,22,0x3a917f,{DOUBLEWITHTWODWORDINTREE(0x66800000,0x00000000)}}, {VT_exponent,22,0x3a9180,{DOUBLEWITHTWODWORDINTREE(0x66900000,0x00000000)}}, {VT_exponent,22,0x3a9181,{DOUBLEWITHTWODWORDINTREE(0x66a00000,0x00000000)}}, {VT_exponent,22,0x3a9182,{DOUBLEWITHTWODWORDINTREE(0x66b00000,0x00000000)}}, {VT_exponent,22,0x3a9183,{DOUBLEWITHTWODWORDINTREE(0x66c00000,0x00000000)}}, {VT_exponent,22,0x3a9184,{DOUBLEWITHTWODWORDINTREE(0x66d00000,0x00000000)}}, {VT_exponent,22,0x3a9185,{DOUBLEWITHTWODWORDINTREE(0x66e00000,0x00000000)}}, {VT_exponent,22,0x3a9186,{DOUBLEWITHTWODWORDINTREE(0x66f00000,0x00000000)}}, {VT_exponent,22,0x3a9187,{DOUBLEWITHTWODWORDINTREE(0x67000000,0x00000000)}}, {VT_exponent,22,0x3a9188,{DOUBLEWITHTWODWORDINTREE(0x67100000,0x00000000)}}, {VT_exponent,22,0x3a9189,{DOUBLEWITHTWODWORDINTREE(0x67200000,0x00000000)}}, {VT_exponent,22,0x3a918a,{DOUBLEWITHTWODWORDINTREE(0x67300000,0x00000000)}}, {VT_exponent,22,0x3a918b,{DOUBLEWITHTWODWORDINTREE(0x67400000,0x00000000)}}, {VT_exponent,22,0x3a918c,{DOUBLEWITHTWODWORDINTREE(0x67500000,0x00000000)}}, {VT_exponent,22,0x3a918d,{DOUBLEWITHTWODWORDINTREE(0x67600000,0x00000000)}}, {VT_exponent,22,0x3a918e,{DOUBLEWITHTWODWORDINTREE(0x67700000,0x00000000)}}, {VT_exponent,22,0x3a918f,{DOUBLEWITHTWODWORDINTREE(0x67800000,0x00000000)}}, {VT_exponent,22,0x3a9190,{DOUBLEWITHTWODWORDINTREE(0x67900000,0x00000000)}}, {VT_exponent,22,0x3a9191,{DOUBLEWITHTWODWORDINTREE(0x67a00000,0x00000000)}}, {VT_exponent,22,0x3a9192,{DOUBLEWITHTWODWORDINTREE(0x67b00000,0x00000000)}}, {VT_exponent,22,0x3a9193,{DOUBLEWITHTWODWORDINTREE(0x67c00000,0x00000000)}}, {VT_exponent,22,0x3a9194,{DOUBLEWITHTWODWORDINTREE(0x67d00000,0x00000000)}}, {VT_exponent,22,0x3a9195,{DOUBLEWITHTWODWORDINTREE(0x67e00000,0x00000000)}}, {VT_exponent,22,0x3a9196,{DOUBLEWITHTWODWORDINTREE(0x67f00000,0x00000000)}}, {VT_exponent,22,0x3a9197,{DOUBLEWITHTWODWORDINTREE(0x68000000,0x00000000)}}, {VT_exponent,22,0x3a9198,{DOUBLEWITHTWODWORDINTREE(0x68100000,0x00000000)}}, {VT_exponent,22,0x3a9199,{DOUBLEWITHTWODWORDINTREE(0x68200000,0x00000000)}}, {VT_exponent,22,0x3a919a,{DOUBLEWITHTWODWORDINTREE(0x68300000,0x00000000)}}, {VT_exponent,22,0x3a919b,{DOUBLEWITHTWODWORDINTREE(0x68400000,0x00000000)}}, {VT_exponent,22,0x3a919c,{DOUBLEWITHTWODWORDINTREE(0x68500000,0x00000000)}}, {VT_exponent,22,0x3a919d,{DOUBLEWITHTWODWORDINTREE(0x68600000,0x00000000)}}, {VT_exponent,22,0x3a919e,{DOUBLEWITHTWODWORDINTREE(0x68700000,0x00000000)}}, {VT_exponent,22,0x3a919f,{DOUBLEWITHTWODWORDINTREE(0x68800000,0x00000000)}}, {VT_exponent,22,0x3a91a0,{DOUBLEWITHTWODWORDINTREE(0x68900000,0x00000000)}}, {VT_exponent,22,0x3a91a1,{DOUBLEWITHTWODWORDINTREE(0x68a00000,0x00000000)}}, {VT_exponent,22,0x3a91a2,{DOUBLEWITHTWODWORDINTREE(0x68b00000,0x00000000)}}, {VT_exponent,22,0x3a91a3,{DOUBLEWITHTWODWORDINTREE(0x68c00000,0x00000000)}}, {VT_exponent,22,0x3a91a4,{DOUBLEWITHTWODWORDINTREE(0x68d00000,0x00000000)}}, {VT_exponent,22,0x3a91a5,{DOUBLEWITHTWODWORDINTREE(0x68e00000,0x00000000)}}, {VT_exponent,22,0x3a91a6,{DOUBLEWITHTWODWORDINTREE(0x68f00000,0x00000000)}}, {VT_exponent,22,0x3a91a7,{DOUBLEWITHTWODWORDINTREE(0x69000000,0x00000000)}}, {VT_exponent,22,0x3a91a8,{DOUBLEWITHTWODWORDINTREE(0x69100000,0x00000000)}}, {VT_exponent,22,0x3a91a9,{DOUBLEWITHTWODWORDINTREE(0x69200000,0x00000000)}}, {VT_exponent,22,0x3a91aa,{DOUBLEWITHTWODWORDINTREE(0x69300000,0x00000000)}}, {VT_exponent,22,0x3a91ab,{DOUBLEWITHTWODWORDINTREE(0x69400000,0x00000000)}}, {VT_exponent,22,0x3a91ac,{DOUBLEWITHTWODWORDINTREE(0x69500000,0x00000000)}}, {VT_exponent,22,0x3a91ad,{DOUBLEWITHTWODWORDINTREE(0x69600000,0x00000000)}}, {VT_exponent,22,0x3a91ae,{DOUBLEWITHTWODWORDINTREE(0x69700000,0x00000000)}}, {VT_exponent,22,0x3a91af,{DOUBLEWITHTWODWORDINTREE(0x69800000,0x00000000)}}, {VT_exponent,22,0x3a91b0,{DOUBLEWITHTWODWORDINTREE(0x69900000,0x00000000)}}, {VT_exponent,22,0x3a91b1,{DOUBLEWITHTWODWORDINTREE(0x69a00000,0x00000000)}}, {VT_exponent,22,0x3a91b2,{DOUBLEWITHTWODWORDINTREE(0x69b00000,0x00000000)}}, {VT_exponent,22,0x3a91b3,{DOUBLEWITHTWODWORDINTREE(0x69c00000,0x00000000)}}, {VT_exponent,22,0x3a91b4,{DOUBLEWITHTWODWORDINTREE(0x69d00000,0x00000000)}}, {VT_exponent,22,0x3a91b5,{DOUBLEWITHTWODWORDINTREE(0x69e00000,0x00000000)}}, {VT_exponent,22,0x3a91b6,{DOUBLEWITHTWODWORDINTREE(0x69f00000,0x00000000)}}, {VT_exponent,22,0x3a91b7,{DOUBLEWITHTWODWORDINTREE(0x6a000000,0x00000000)}}, {VT_exponent,22,0x3a91b8,{DOUBLEWITHTWODWORDINTREE(0x6a100000,0x00000000)}}, {VT_exponent,22,0x3a91b9,{DOUBLEWITHTWODWORDINTREE(0x6a200000,0x00000000)}}, {VT_exponent,22,0x3a91ba,{DOUBLEWITHTWODWORDINTREE(0x6a300000,0x00000000)}}, {VT_exponent,22,0x3a91bb,{DOUBLEWITHTWODWORDINTREE(0x6a400000,0x00000000)}}, {VT_exponent,22,0x3a91bc,{DOUBLEWITHTWODWORDINTREE(0x6a500000,0x00000000)}}, {VT_exponent,22,0x3a91bd,{DOUBLEWITHTWODWORDINTREE(0x6a600000,0x00000000)}}, {VT_exponent,22,0x3a91be,{DOUBLEWITHTWODWORDINTREE(0x6a700000,0x00000000)}}, {VT_exponent,22,0x3a91bf,{DOUBLEWITHTWODWORDINTREE(0x6a800000,0x00000000)}}, {VT_exponent,22,0x3a91c0,{DOUBLEWITHTWODWORDINTREE(0x6a900000,0x00000000)}}, {VT_exponent,22,0x3a91c1,{DOUBLEWITHTWODWORDINTREE(0x6aa00000,0x00000000)}}, {VT_exponent,22,0x3a91c2,{DOUBLEWITHTWODWORDINTREE(0x6ab00000,0x00000000)}}, {VT_exponent,22,0x3a91c3,{DOUBLEWITHTWODWORDINTREE(0x6ac00000,0x00000000)}}, {VT_exponent,22,0x3a91c4,{DOUBLEWITHTWODWORDINTREE(0x6ad00000,0x00000000)}}, {VT_exponent,22,0x3a91c5,{DOUBLEWITHTWODWORDINTREE(0x6ae00000,0x00000000)}}, {VT_exponent,22,0x3a91c6,{DOUBLEWITHTWODWORDINTREE(0x6af00000,0x00000000)}}, {VT_exponent,22,0x3a91c7,{DOUBLEWITHTWODWORDINTREE(0x6b000000,0x00000000)}}, {VT_exponent,22,0x3a91c8,{DOUBLEWITHTWODWORDINTREE(0x6b100000,0x00000000)}}, {VT_exponent,22,0x3a91c9,{DOUBLEWITHTWODWORDINTREE(0x6b200000,0x00000000)}}, {VT_exponent,22,0x3a91ca,{DOUBLEWITHTWODWORDINTREE(0x6b300000,0x00000000)}}, {VT_exponent,22,0x3a91cb,{DOUBLEWITHTWODWORDINTREE(0x6b400000,0x00000000)}}, {VT_exponent,22,0x3a91cc,{DOUBLEWITHTWODWORDINTREE(0x6b500000,0x00000000)}}, {VT_exponent,22,0x3a91cd,{DOUBLEWITHTWODWORDINTREE(0x6b600000,0x00000000)}}, {VT_exponent,22,0x3a91ce,{DOUBLEWITHTWODWORDINTREE(0x6b700000,0x00000000)}}, {VT_exponent,22,0x3a91cf,{DOUBLEWITHTWODWORDINTREE(0x6b800000,0x00000000)}}, {VT_exponent,22,0x3a91d0,{DOUBLEWITHTWODWORDINTREE(0x6b900000,0x00000000)}}, {VT_exponent,22,0x3a91d1,{DOUBLEWITHTWODWORDINTREE(0x6ba00000,0x00000000)}}, {VT_exponent,22,0x3a91d2,{DOUBLEWITHTWODWORDINTREE(0x6bb00000,0x00000000)}}, {VT_exponent,22,0x3a91d3,{DOUBLEWITHTWODWORDINTREE(0x6bc00000,0x00000000)}}, {VT_exponent,22,0x3a91d4,{DOUBLEWITHTWODWORDINTREE(0x6bd00000,0x00000000)}}, {VT_exponent,22,0x3a91d5,{DOUBLEWITHTWODWORDINTREE(0x6be00000,0x00000000)}}, {VT_exponent,22,0x3a91d6,{DOUBLEWITHTWODWORDINTREE(0x6bf00000,0x00000000)}}, {VT_exponent,22,0x3a91d7,{DOUBLEWITHTWODWORDINTREE(0x6c000000,0x00000000)}}, {VT_exponent,22,0x3a91d8,{DOUBLEWITHTWODWORDINTREE(0x6c100000,0x00000000)}}, {VT_exponent,22,0x3a91d9,{DOUBLEWITHTWODWORDINTREE(0x6c200000,0x00000000)}}, {VT_exponent,22,0x3a91da,{DOUBLEWITHTWODWORDINTREE(0x6c300000,0x00000000)}}, {VT_exponent,22,0x3a91db,{DOUBLEWITHTWODWORDINTREE(0x6c400000,0x00000000)}}, {VT_exponent,22,0x3a91dc,{DOUBLEWITHTWODWORDINTREE(0x6c500000,0x00000000)}}, {VT_exponent,22,0x3a91dd,{DOUBLEWITHTWODWORDINTREE(0x6c600000,0x00000000)}}, {VT_exponent,22,0x3a91de,{DOUBLEWITHTWODWORDINTREE(0x6c700000,0x00000000)}}, {VT_exponent,22,0x3a91df,{DOUBLEWITHTWODWORDINTREE(0x6c800000,0x00000000)}}, {VT_exponent,22,0x3a91e0,{DOUBLEWITHTWODWORDINTREE(0x6c900000,0x00000000)}}, {VT_exponent,22,0x3a91e1,{DOUBLEWITHTWODWORDINTREE(0x6ca00000,0x00000000)}}, {VT_exponent,22,0x3a91e2,{DOUBLEWITHTWODWORDINTREE(0x6cb00000,0x00000000)}}, {VT_exponent,22,0x3a91e3,{DOUBLEWITHTWODWORDINTREE(0x6cc00000,0x00000000)}}, {VT_exponent,22,0x3a91e4,{DOUBLEWITHTWODWORDINTREE(0x6cd00000,0x00000000)}}, {VT_exponent,22,0x3a91e5,{DOUBLEWITHTWODWORDINTREE(0x6ce00000,0x00000000)}}, {VT_exponent,22,0x3a91e6,{DOUBLEWITHTWODWORDINTREE(0x6cf00000,0x00000000)}}, {VT_exponent,22,0x3a91e7,{DOUBLEWITHTWODWORDINTREE(0x6d000000,0x00000000)}}, {VT_exponent,22,0x3a91e8,{DOUBLEWITHTWODWORDINTREE(0x6d100000,0x00000000)}}, {VT_exponent,22,0x3a91e9,{DOUBLEWITHTWODWORDINTREE(0x6d200000,0x00000000)}}, {VT_exponent,22,0x3a91ea,{DOUBLEWITHTWODWORDINTREE(0x6d300000,0x00000000)}}, {VT_exponent,22,0x3a91eb,{DOUBLEWITHTWODWORDINTREE(0x6d400000,0x00000000)}}, {VT_exponent,22,0x3a91ec,{DOUBLEWITHTWODWORDINTREE(0x6d500000,0x00000000)}}, {VT_exponent,22,0x3a91ed,{DOUBLEWITHTWODWORDINTREE(0x6d600000,0x00000000)}}, {VT_exponent,22,0x3a91ee,{DOUBLEWITHTWODWORDINTREE(0x6d700000,0x00000000)}}, {VT_exponent,22,0x3a91ef,{DOUBLEWITHTWODWORDINTREE(0x6d800000,0x00000000)}}, {VT_exponent,22,0x3a91f0,{DOUBLEWITHTWODWORDINTREE(0x6d900000,0x00000000)}}, {VT_exponent,22,0x3a91f1,{DOUBLEWITHTWODWORDINTREE(0x6da00000,0x00000000)}}, {VT_exponent,22,0x3a91f2,{DOUBLEWITHTWODWORDINTREE(0x6db00000,0x00000000)}}, {VT_exponent,22,0x3a91f3,{DOUBLEWITHTWODWORDINTREE(0x6dc00000,0x00000000)}}, {VT_exponent,22,0x3a91f4,{DOUBLEWITHTWODWORDINTREE(0x6dd00000,0x00000000)}}, {VT_exponent,22,0x3a91f5,{DOUBLEWITHTWODWORDINTREE(0x6de00000,0x00000000)}}, {VT_exponent,22,0x3a91f6,{DOUBLEWITHTWODWORDINTREE(0x6df00000,0x00000000)}}, {VT_exponent,22,0x3a91f7,{DOUBLEWITHTWODWORDINTREE(0x6e000000,0x00000000)}}, {VT_exponent,22,0x3a91f8,{DOUBLEWITHTWODWORDINTREE(0x6e100000,0x00000000)}}, {VT_exponent,22,0x3a91f9,{DOUBLEWITHTWODWORDINTREE(0x6e200000,0x00000000)}}, {VT_exponent,22,0x3a91fa,{DOUBLEWITHTWODWORDINTREE(0x6e300000,0x00000000)}}, {VT_exponent,22,0x3a91fb,{DOUBLEWITHTWODWORDINTREE(0x6e400000,0x00000000)}}, {VT_exponent,22,0x3a91fc,{DOUBLEWITHTWODWORDINTREE(0x6e500000,0x00000000)}}, {VT_exponent,22,0x3a91fd,{DOUBLEWITHTWODWORDINTREE(0x6e600000,0x00000000)}}, {VT_exponent,22,0x3a91fe,{DOUBLEWITHTWODWORDINTREE(0x6e700000,0x00000000)}}, {VT_exponent,22,0x3a91ff,{DOUBLEWITHTWODWORDINTREE(0x6e800000,0x00000000)}}, {VT_exponent,22,0x3a9200,{DOUBLEWITHTWODWORDINTREE(0x6e900000,0x00000000)}}, {VT_exponent,22,0x3a9201,{DOUBLEWITHTWODWORDINTREE(0x6ea00000,0x00000000)}}, {VT_exponent,22,0x3a9202,{DOUBLEWITHTWODWORDINTREE(0x6eb00000,0x00000000)}}, {VT_exponent,22,0x3a9203,{DOUBLEWITHTWODWORDINTREE(0x6ec00000,0x00000000)}}, {VT_exponent,22,0x3a9204,{DOUBLEWITHTWODWORDINTREE(0x6ed00000,0x00000000)}}, {VT_exponent,22,0x3a9205,{DOUBLEWITHTWODWORDINTREE(0x6ee00000,0x00000000)}}, {VT_exponent,22,0x3a9206,{DOUBLEWITHTWODWORDINTREE(0x6ef00000,0x00000000)}}, {VT_exponent,22,0x3a9207,{DOUBLEWITHTWODWORDINTREE(0x6f000000,0x00000000)}}, {VT_exponent,22,0x3a9208,{DOUBLEWITHTWODWORDINTREE(0x6f100000,0x00000000)}}, {VT_exponent,22,0x3a9209,{DOUBLEWITHTWODWORDINTREE(0x6f200000,0x00000000)}}, {VT_exponent,22,0x3a920a,{DOUBLEWITHTWODWORDINTREE(0x6f300000,0x00000000)}}, {VT_exponent,22,0x3a920b,{DOUBLEWITHTWODWORDINTREE(0x6f400000,0x00000000)}}, {VT_exponent,22,0x3a920c,{DOUBLEWITHTWODWORDINTREE(0x6f500000,0x00000000)}}, {VT_exponent,22,0x3a920d,{DOUBLEWITHTWODWORDINTREE(0x6f600000,0x00000000)}}, {VT_exponent,22,0x3a920e,{DOUBLEWITHTWODWORDINTREE(0x6f700000,0x00000000)}}, {VT_exponent,22,0x3a920f,{DOUBLEWITHTWODWORDINTREE(0x6f800000,0x00000000)}}, {VT_exponent,22,0x3a9210,{DOUBLEWITHTWODWORDINTREE(0x6f900000,0x00000000)}}, {VT_exponent,22,0x3a9211,{DOUBLEWITHTWODWORDINTREE(0x6fa00000,0x00000000)}}, {VT_exponent,22,0x3a9212,{DOUBLEWITHTWODWORDINTREE(0x6fb00000,0x00000000)}}, {VT_exponent,22,0x3a9213,{DOUBLEWITHTWODWORDINTREE(0x6fc00000,0x00000000)}}, {VT_exponent,22,0x3a9214,{DOUBLEWITHTWODWORDINTREE(0x6fd00000,0x00000000)}}, {VT_exponent,22,0x3a9215,{DOUBLEWITHTWODWORDINTREE(0x6fe00000,0x00000000)}}, {VT_exponent,22,0x3a9216,{DOUBLEWITHTWODWORDINTREE(0x6ff00000,0x00000000)}}, {VT_exponent,22,0x3a9217,{DOUBLEWITHTWODWORDINTREE(0x70000000,0x00000000)}}, {VT_exponent,22,0x3a9218,{DOUBLEWITHTWODWORDINTREE(0x70100000,0x00000000)}}, {VT_exponent,22,0x3a9219,{DOUBLEWITHTWODWORDINTREE(0x70200000,0x00000000)}}, {VT_exponent,22,0x3a921a,{DOUBLEWITHTWODWORDINTREE(0x70300000,0x00000000)}}, {VT_exponent,22,0x3a921b,{DOUBLEWITHTWODWORDINTREE(0x70400000,0x00000000)}}, {VT_exponent,22,0x3a921c,{DOUBLEWITHTWODWORDINTREE(0x70500000,0x00000000)}}, {VT_exponent,22,0x3a921d,{DOUBLEWITHTWODWORDINTREE(0x70600000,0x00000000)}}, {VT_exponent,22,0x3a921e,{DOUBLEWITHTWODWORDINTREE(0x70700000,0x00000000)}}, {VT_exponent,22,0x3a921f,{DOUBLEWITHTWODWORDINTREE(0x70800000,0x00000000)}}, {VT_exponent,22,0x3a9220,{DOUBLEWITHTWODWORDINTREE(0x70900000,0x00000000)}}, {VT_exponent,22,0x3a9221,{DOUBLEWITHTWODWORDINTREE(0x70a00000,0x00000000)}}, {VT_exponent,22,0x3a9222,{DOUBLEWITHTWODWORDINTREE(0x70b00000,0x00000000)}}, {VT_exponent,22,0x3a9223,{DOUBLEWITHTWODWORDINTREE(0x70c00000,0x00000000)}}, {VT_exponent,22,0x3a9224,{DOUBLEWITHTWODWORDINTREE(0x70d00000,0x00000000)}}, {VT_exponent,22,0x3a9225,{DOUBLEWITHTWODWORDINTREE(0x70e00000,0x00000000)}}, {VT_exponent,22,0x3a9226,{DOUBLEWITHTWODWORDINTREE(0x70f00000,0x00000000)}}, {VT_exponent,22,0x3a9227,{DOUBLEWITHTWODWORDINTREE(0x71000000,0x00000000)}}, {VT_exponent,22,0x3a9228,{DOUBLEWITHTWODWORDINTREE(0x71100000,0x00000000)}}, {VT_exponent,22,0x3a9229,{DOUBLEWITHTWODWORDINTREE(0x71200000,0x00000000)}}, {VT_exponent,22,0x3a922a,{DOUBLEWITHTWODWORDINTREE(0x71300000,0x00000000)}}, {VT_exponent,22,0x3a922b,{DOUBLEWITHTWODWORDINTREE(0x71400000,0x00000000)}}, {VT_exponent,22,0x3a922c,{DOUBLEWITHTWODWORDINTREE(0x71500000,0x00000000)}}, {VT_exponent,22,0x3a922d,{DOUBLEWITHTWODWORDINTREE(0x71600000,0x00000000)}}, {VT_exponent,22,0x3a922e,{DOUBLEWITHTWODWORDINTREE(0x71700000,0x00000000)}}, {VT_exponent,22,0x3a922f,{DOUBLEWITHTWODWORDINTREE(0x71800000,0x00000000)}}, {VT_exponent,22,0x3a9230,{DOUBLEWITHTWODWORDINTREE(0x71900000,0x00000000)}}, {VT_exponent,22,0x3a9231,{DOUBLEWITHTWODWORDINTREE(0x71a00000,0x00000000)}}, {VT_exponent,22,0x3a9232,{DOUBLEWITHTWODWORDINTREE(0x71b00000,0x00000000)}}, {VT_exponent,22,0x3a9233,{DOUBLEWITHTWODWORDINTREE(0x71c00000,0x00000000)}}, {VT_exponent,22,0x3a9234,{DOUBLEWITHTWODWORDINTREE(0x71d00000,0x00000000)}}, {VT_exponent,22,0x3a9235,{DOUBLEWITHTWODWORDINTREE(0x71e00000,0x00000000)}}, {VT_exponent,22,0x3a9236,{DOUBLEWITHTWODWORDINTREE(0x71f00000,0x00000000)}}, {VT_exponent,22,0x3a9237,{DOUBLEWITHTWODWORDINTREE(0x72000000,0x00000000)}}, {VT_exponent,22,0x3a9238,{DOUBLEWITHTWODWORDINTREE(0x72100000,0x00000000)}}, {VT_exponent,22,0x3a9239,{DOUBLEWITHTWODWORDINTREE(0x72200000,0x00000000)}}, {VT_exponent,22,0x3a923a,{DOUBLEWITHTWODWORDINTREE(0x72300000,0x00000000)}}, {VT_exponent,22,0x3a923b,{DOUBLEWITHTWODWORDINTREE(0x72400000,0x00000000)}}, {VT_exponent,22,0x3a923c,{DOUBLEWITHTWODWORDINTREE(0x72500000,0x00000000)}}, {VT_exponent,22,0x3a923d,{DOUBLEWITHTWODWORDINTREE(0x72600000,0x00000000)}}, {VT_exponent,22,0x3a923e,{DOUBLEWITHTWODWORDINTREE(0x72700000,0x00000000)}}, {VT_exponent,22,0x3a923f,{DOUBLEWITHTWODWORDINTREE(0x72800000,0x00000000)}}, {VT_exponent,22,0x3a9240,{DOUBLEWITHTWODWORDINTREE(0x72900000,0x00000000)}}, {VT_exponent,22,0x3a9241,{DOUBLEWITHTWODWORDINTREE(0x72a00000,0x00000000)}}, {VT_exponent,22,0x3a9242,{DOUBLEWITHTWODWORDINTREE(0x72b00000,0x00000000)}}, {VT_exponent,22,0x3a9243,{DOUBLEWITHTWODWORDINTREE(0x72c00000,0x00000000)}}, {VT_exponent,22,0x3a9244,{DOUBLEWITHTWODWORDINTREE(0x72d00000,0x00000000)}}, {VT_exponent,22,0x3a9245,{DOUBLEWITHTWODWORDINTREE(0x72e00000,0x00000000)}}, {VT_exponent,22,0x3a9246,{DOUBLEWITHTWODWORDINTREE(0x72f00000,0x00000000)}}, {VT_exponent,22,0x3a9247,{DOUBLEWITHTWODWORDINTREE(0x73000000,0x00000000)}}, {VT_exponent,22,0x3a9248,{DOUBLEWITHTWODWORDINTREE(0x73100000,0x00000000)}}, {VT_exponent,22,0x3a9249,{DOUBLEWITHTWODWORDINTREE(0x73200000,0x00000000)}}, {VT_exponent,22,0x3a924a,{DOUBLEWITHTWODWORDINTREE(0x73300000,0x00000000)}}, {VT_exponent,22,0x3a924b,{DOUBLEWITHTWODWORDINTREE(0x73400000,0x00000000)}}, {VT_exponent,22,0x3a924c,{DOUBLEWITHTWODWORDINTREE(0x73500000,0x00000000)}}, {VT_exponent,22,0x3a924d,{DOUBLEWITHTWODWORDINTREE(0x73600000,0x00000000)}}, {VT_exponent,22,0x3a924e,{DOUBLEWITHTWODWORDINTREE(0x73700000,0x00000000)}}, {VT_exponent,22,0x3a924f,{DOUBLEWITHTWODWORDINTREE(0x73800000,0x00000000)}}, {VT_exponent,22,0x3a9250,{DOUBLEWITHTWODWORDINTREE(0x73900000,0x00000000)}}, {VT_exponent,22,0x3a9251,{DOUBLEWITHTWODWORDINTREE(0x73a00000,0x00000000)}}, {VT_exponent,22,0x3a9252,{DOUBLEWITHTWODWORDINTREE(0x73b00000,0x00000000)}}, {VT_exponent,22,0x3a9253,{DOUBLEWITHTWODWORDINTREE(0x73c00000,0x00000000)}}, {VT_exponent,22,0x3a9254,{DOUBLEWITHTWODWORDINTREE(0x73d00000,0x00000000)}}, {VT_exponent,22,0x3a9255,{DOUBLEWITHTWODWORDINTREE(0x73e00000,0x00000000)}}, {VT_exponent,22,0x3a9256,{DOUBLEWITHTWODWORDINTREE(0x73f00000,0x00000000)}}, {VT_exponent,22,0x3a9257,{DOUBLEWITHTWODWORDINTREE(0x74000000,0x00000000)}}, {VT_exponent,22,0x3a9258,{DOUBLEWITHTWODWORDINTREE(0x74100000,0x00000000)}}, {VT_exponent,22,0x3a9259,{DOUBLEWITHTWODWORDINTREE(0x74200000,0x00000000)}}, {VT_exponent,22,0x3a925a,{DOUBLEWITHTWODWORDINTREE(0x74300000,0x00000000)}}, {VT_exponent,22,0x3a925b,{DOUBLEWITHTWODWORDINTREE(0x74400000,0x00000000)}}, {VT_exponent,22,0x3a925c,{DOUBLEWITHTWODWORDINTREE(0x74500000,0x00000000)}}, {VT_exponent,22,0x3a925d,{DOUBLEWITHTWODWORDINTREE(0x74600000,0x00000000)}}, {VT_exponent,22,0x3a925e,{DOUBLEWITHTWODWORDINTREE(0x74700000,0x00000000)}}, {VT_exponent,22,0x3a925f,{DOUBLEWITHTWODWORDINTREE(0x74800000,0x00000000)}}, {VT_exponent,22,0x3a9260,{DOUBLEWITHTWODWORDINTREE(0x74900000,0x00000000)}}, {VT_exponent,22,0x3a9261,{DOUBLEWITHTWODWORDINTREE(0x74a00000,0x00000000)}}, {VT_exponent,22,0x3a9262,{DOUBLEWITHTWODWORDINTREE(0x74b00000,0x00000000)}}, {VT_exponent,22,0x3a9263,{DOUBLEWITHTWODWORDINTREE(0x74c00000,0x00000000)}}, {VT_exponent,22,0x3a9264,{DOUBLEWITHTWODWORDINTREE(0x74d00000,0x00000000)}}, {VT_exponent,22,0x3a9265,{DOUBLEWITHTWODWORDINTREE(0x74e00000,0x00000000)}}, {VT_exponent,22,0x3a9266,{DOUBLEWITHTWODWORDINTREE(0x74f00000,0x00000000)}}, {VT_exponent,22,0x3a9267,{DOUBLEWITHTWODWORDINTREE(0x75000000,0x00000000)}}, {VT_exponent,22,0x3a9268,{DOUBLEWITHTWODWORDINTREE(0x75100000,0x00000000)}}, {VT_exponent,22,0x3a9269,{DOUBLEWITHTWODWORDINTREE(0x75200000,0x00000000)}}, {VT_exponent,22,0x3a926a,{DOUBLEWITHTWODWORDINTREE(0x75300000,0x00000000)}}, {VT_exponent,22,0x3a926b,{DOUBLEWITHTWODWORDINTREE(0x75400000,0x00000000)}}, {VT_exponent,22,0x3a926c,{DOUBLEWITHTWODWORDINTREE(0x75500000,0x00000000)}}, {VT_exponent,22,0x3a926d,{DOUBLEWITHTWODWORDINTREE(0x75600000,0x00000000)}}, {VT_exponent,22,0x3a926e,{DOUBLEWITHTWODWORDINTREE(0x75700000,0x00000000)}}, {VT_exponent,22,0x3a926f,{DOUBLEWITHTWODWORDINTREE(0x75800000,0x00000000)}}, {VT_exponent,22,0x3a9270,{DOUBLEWITHTWODWORDINTREE(0x75900000,0x00000000)}}, {VT_exponent,22,0x3a9271,{DOUBLEWITHTWODWORDINTREE(0x75a00000,0x00000000)}}, {VT_exponent,22,0x3a9272,{DOUBLEWITHTWODWORDINTREE(0x75b00000,0x00000000)}}, {VT_exponent,22,0x3a9273,{DOUBLEWITHTWODWORDINTREE(0x75c00000,0x00000000)}}, {VT_exponent,22,0x3a9274,{DOUBLEWITHTWODWORDINTREE(0x75d00000,0x00000000)}}, {VT_exponent,22,0x3a9275,{DOUBLEWITHTWODWORDINTREE(0x75e00000,0x00000000)}}, {VT_exponent,22,0x3a9276,{DOUBLEWITHTWODWORDINTREE(0x75f00000,0x00000000)}}, {VT_exponent,22,0x3a9277,{DOUBLEWITHTWODWORDINTREE(0x76000000,0x00000000)}}, {VT_exponent,22,0x3a9278,{DOUBLEWITHTWODWORDINTREE(0x76100000,0x00000000)}}, {VT_exponent,22,0x3a9279,{DOUBLEWITHTWODWORDINTREE(0x76200000,0x00000000)}}, {VT_exponent,22,0x3a927a,{DOUBLEWITHTWODWORDINTREE(0x76300000,0x00000000)}}, {VT_exponent,22,0x3a927b,{DOUBLEWITHTWODWORDINTREE(0x76400000,0x00000000)}}, {VT_exponent,22,0x3a927c,{DOUBLEWITHTWODWORDINTREE(0x76500000,0x00000000)}}, {VT_exponent,22,0x3a927d,{DOUBLEWITHTWODWORDINTREE(0x76600000,0x00000000)}}, {VT_exponent,22,0x3a927e,{DOUBLEWITHTWODWORDINTREE(0x76700000,0x00000000)}}, {VT_exponent,22,0x3a927f,{DOUBLEWITHTWODWORDINTREE(0x76800000,0x00000000)}}, {VT_exponent,22,0x3a9280,{DOUBLEWITHTWODWORDINTREE(0x76900000,0x00000000)}}, {VT_exponent,22,0x3a9281,{DOUBLEWITHTWODWORDINTREE(0x76a00000,0x00000000)}}, {VT_exponent,22,0x3a9282,{DOUBLEWITHTWODWORDINTREE(0x76b00000,0x00000000)}}, {VT_exponent,22,0x3a9283,{DOUBLEWITHTWODWORDINTREE(0x76c00000,0x00000000)}}, {VT_exponent,22,0x3a9284,{DOUBLEWITHTWODWORDINTREE(0x76d00000,0x00000000)}}, {VT_exponent,22,0x3a9285,{DOUBLEWITHTWODWORDINTREE(0x76e00000,0x00000000)}}, {VT_exponent,22,0x3a9286,{DOUBLEWITHTWODWORDINTREE(0x76f00000,0x00000000)}}, {VT_exponent,22,0x3a9287,{DOUBLEWITHTWODWORDINTREE(0x77000000,0x00000000)}}, {VT_exponent,22,0x3a9288,{DOUBLEWITHTWODWORDINTREE(0x77100000,0x00000000)}}, {VT_exponent,22,0x3a9289,{DOUBLEWITHTWODWORDINTREE(0x77200000,0x00000000)}}, {VT_exponent,22,0x3a928a,{DOUBLEWITHTWODWORDINTREE(0x77300000,0x00000000)}}, {VT_exponent,22,0x3a928b,{DOUBLEWITHTWODWORDINTREE(0x77400000,0x00000000)}}, {VT_exponent,22,0x3a928c,{DOUBLEWITHTWODWORDINTREE(0x77500000,0x00000000)}}, {VT_exponent,22,0x3a928d,{DOUBLEWITHTWODWORDINTREE(0x77600000,0x00000000)}}, {VT_exponent,22,0x3a928e,{DOUBLEWITHTWODWORDINTREE(0x77700000,0x00000000)}}, {VT_exponent,22,0x3a928f,{DOUBLEWITHTWODWORDINTREE(0x77800000,0x00000000)}}, {VT_exponent,22,0x3a9290,{DOUBLEWITHTWODWORDINTREE(0x77900000,0x00000000)}}, {VT_exponent,22,0x3a9291,{DOUBLEWITHTWODWORDINTREE(0x77a00000,0x00000000)}}, {VT_exponent,22,0x3a9292,{DOUBLEWITHTWODWORDINTREE(0x77b00000,0x00000000)}}, {VT_exponent,22,0x3a9293,{DOUBLEWITHTWODWORDINTREE(0x77c00000,0x00000000)}}, {VT_exponent,22,0x3a9294,{DOUBLEWITHTWODWORDINTREE(0x77d00000,0x00000000)}}, {VT_exponent,22,0x3a9295,{DOUBLEWITHTWODWORDINTREE(0x77e00000,0x00000000)}}, {VT_exponent,22,0x3a9296,{DOUBLEWITHTWODWORDINTREE(0x77f00000,0x00000000)}}, {VT_exponent,22,0x3a9297,{DOUBLEWITHTWODWORDINTREE(0x78000000,0x00000000)}}, {VT_exponent,22,0x3a9298,{DOUBLEWITHTWODWORDINTREE(0x78100000,0x00000000)}}, {VT_exponent,22,0x3a9299,{DOUBLEWITHTWODWORDINTREE(0x78200000,0x00000000)}}, {VT_exponent,22,0x3a929a,{DOUBLEWITHTWODWORDINTREE(0x78300000,0x00000000)}}, {VT_exponent,22,0x3a929b,{DOUBLEWITHTWODWORDINTREE(0x78400000,0x00000000)}}, {VT_exponent,22,0x3a929c,{DOUBLEWITHTWODWORDINTREE(0x78500000,0x00000000)}}, {VT_exponent,22,0x3a929d,{DOUBLEWITHTWODWORDINTREE(0x78600000,0x00000000)}}, {VT_exponent,22,0x3a929e,{DOUBLEWITHTWODWORDINTREE(0x78700000,0x00000000)}}, {VT_exponent,22,0x3a929f,{DOUBLEWITHTWODWORDINTREE(0x78800000,0x00000000)}}, {VT_exponent,22,0x3a92a0,{DOUBLEWITHTWODWORDINTREE(0x78900000,0x00000000)}}, {VT_exponent,22,0x3a92a1,{DOUBLEWITHTWODWORDINTREE(0x78a00000,0x00000000)}}, {VT_exponent,22,0x3a92a2,{DOUBLEWITHTWODWORDINTREE(0x78b00000,0x00000000)}}, {VT_exponent,22,0x3a92a3,{DOUBLEWITHTWODWORDINTREE(0x78c00000,0x00000000)}}, {VT_exponent,22,0x3a92a4,{DOUBLEWITHTWODWORDINTREE(0x78d00000,0x00000000)}}, {VT_exponent,22,0x3a92a5,{DOUBLEWITHTWODWORDINTREE(0x78e00000,0x00000000)}}, {VT_exponent,22,0x3a92a6,{DOUBLEWITHTWODWORDINTREE(0x78f00000,0x00000000)}}, {VT_exponent,22,0x3a92a7,{DOUBLEWITHTWODWORDINTREE(0x79000000,0x00000000)}}, {VT_exponent,22,0x3a92a8,{DOUBLEWITHTWODWORDINTREE(0x79100000,0x00000000)}}, {VT_exponent,22,0x3a92a9,{DOUBLEWITHTWODWORDINTREE(0x79200000,0x00000000)}}, {VT_exponent,22,0x3a92aa,{DOUBLEWITHTWODWORDINTREE(0x79300000,0x00000000)}}, {VT_exponent,22,0x3a92ab,{DOUBLEWITHTWODWORDINTREE(0x79400000,0x00000000)}}, {VT_exponent,22,0x3a92ac,{DOUBLEWITHTWODWORDINTREE(0x79500000,0x00000000)}}, {VT_exponent,22,0x3a92ad,{DOUBLEWITHTWODWORDINTREE(0x79600000,0x00000000)}}, {VT_exponent,22,0x3a92ae,{DOUBLEWITHTWODWORDINTREE(0x79700000,0x00000000)}}, {VT_exponent,22,0x3a92af,{DOUBLEWITHTWODWORDINTREE(0x79800000,0x00000000)}}, {VT_exponent,22,0x3a92b0,{DOUBLEWITHTWODWORDINTREE(0x79900000,0x00000000)}}, {VT_exponent,22,0x3a92b1,{DOUBLEWITHTWODWORDINTREE(0x79a00000,0x00000000)}}, {VT_exponent,22,0x3a92b2,{DOUBLEWITHTWODWORDINTREE(0x79b00000,0x00000000)}}, {VT_exponent,22,0x3a92b3,{DOUBLEWITHTWODWORDINTREE(0x79c00000,0x00000000)}}, {VT_exponent,22,0x3a92b4,{DOUBLEWITHTWODWORDINTREE(0x79d00000,0x00000000)}}, {VT_exponent,22,0x3a92b5,{DOUBLEWITHTWODWORDINTREE(0x79e00000,0x00000000)}}, {VT_exponent,22,0x3a92b6,{DOUBLEWITHTWODWORDINTREE(0x79f00000,0x00000000)}}, {VT_exponent,22,0x3a92b7,{DOUBLEWITHTWODWORDINTREE(0x7a000000,0x00000000)}}, {VT_exponent,22,0x3a92b8,{DOUBLEWITHTWODWORDINTREE(0x7a100000,0x00000000)}}, {VT_exponent,22,0x3a92b9,{DOUBLEWITHTWODWORDINTREE(0x7a200000,0x00000000)}}, {VT_exponent,22,0x3a92ba,{DOUBLEWITHTWODWORDINTREE(0x7a300000,0x00000000)}}, {VT_exponent,22,0x3a92bb,{DOUBLEWITHTWODWORDINTREE(0x7a400000,0x00000000)}}, {VT_exponent,22,0x3a92bc,{DOUBLEWITHTWODWORDINTREE(0x7a500000,0x00000000)}}, {VT_exponent,22,0x3a92bd,{DOUBLEWITHTWODWORDINTREE(0x7a600000,0x00000000)}}, {VT_exponent,22,0x3a92be,{DOUBLEWITHTWODWORDINTREE(0x7a700000,0x00000000)}}, {VT_exponent,22,0x3a92bf,{DOUBLEWITHTWODWORDINTREE(0x7a800000,0x00000000)}}, {VT_exponent,22,0x3a92c0,{DOUBLEWITHTWODWORDINTREE(0x7a900000,0x00000000)}}, {VT_exponent,22,0x3a92c1,{DOUBLEWITHTWODWORDINTREE(0x7aa00000,0x00000000)}}, {VT_exponent,22,0x3a92c2,{DOUBLEWITHTWODWORDINTREE(0x7ab00000,0x00000000)}}, {VT_exponent,22,0x3a92c3,{DOUBLEWITHTWODWORDINTREE(0x7ac00000,0x00000000)}}, {VT_exponent,22,0x3a92c4,{DOUBLEWITHTWODWORDINTREE(0x7ad00000,0x00000000)}}, {VT_exponent,22,0x3a92c5,{DOUBLEWITHTWODWORDINTREE(0x7ae00000,0x00000000)}}, {VT_exponent,22,0x3a92c6,{DOUBLEWITHTWODWORDINTREE(0x7af00000,0x00000000)}}, {VT_exponent,22,0x3a92c7,{DOUBLEWITHTWODWORDINTREE(0x7b000000,0x00000000)}}, {VT_exponent,22,0x3a92c8,{DOUBLEWITHTWODWORDINTREE(0x7b100000,0x00000000)}}, {VT_exponent,22,0x3a92c9,{DOUBLEWITHTWODWORDINTREE(0x7b200000,0x00000000)}}, {VT_exponent,22,0x3a92ca,{DOUBLEWITHTWODWORDINTREE(0x7b300000,0x00000000)}}, {VT_exponent,22,0x3a92cb,{DOUBLEWITHTWODWORDINTREE(0x7b400000,0x00000000)}}, {VT_exponent,22,0x3a92cc,{DOUBLEWITHTWODWORDINTREE(0x7b500000,0x00000000)}}, {VT_exponent,22,0x3a92cd,{DOUBLEWITHTWODWORDINTREE(0x7b600000,0x00000000)}}, {VT_exponent,22,0x3a92ce,{DOUBLEWITHTWODWORDINTREE(0x7b700000,0x00000000)}}, {VT_exponent,22,0x3a92cf,{DOUBLEWITHTWODWORDINTREE(0x7b800000,0x00000000)}}, {VT_exponent,22,0x3a92d0,{DOUBLEWITHTWODWORDINTREE(0x7b900000,0x00000000)}}, {VT_exponent,22,0x3a92d1,{DOUBLEWITHTWODWORDINTREE(0x7ba00000,0x00000000)}}, {VT_exponent,22,0x3a92d2,{DOUBLEWITHTWODWORDINTREE(0x7bb00000,0x00000000)}}, {VT_exponent,22,0x3a92d3,{DOUBLEWITHTWODWORDINTREE(0x7bc00000,0x00000000)}}, {VT_exponent,22,0x3a92d4,{DOUBLEWITHTWODWORDINTREE(0x7bd00000,0x00000000)}}, {VT_exponent,22,0x3a92d5,{DOUBLEWITHTWODWORDINTREE(0x7be00000,0x00000000)}}, {VT_exponent,22,0x3a92d6,{DOUBLEWITHTWODWORDINTREE(0x7bf00000,0x00000000)}}, {VT_exponent,22,0x3a92d7,{DOUBLEWITHTWODWORDINTREE(0x7c000000,0x00000000)}}, {VT_exponent,22,0x3a92d8,{DOUBLEWITHTWODWORDINTREE(0x7c100000,0x00000000)}}, {VT_exponent,22,0x3a92d9,{DOUBLEWITHTWODWORDINTREE(0x7c200000,0x00000000)}}, {VT_exponent,22,0x3a92da,{DOUBLEWITHTWODWORDINTREE(0x7c300000,0x00000000)}}, {VT_exponent,22,0x3a92db,{DOUBLEWITHTWODWORDINTREE(0x7c400000,0x00000000)}}, {VT_exponent,22,0x3a92dc,{DOUBLEWITHTWODWORDINTREE(0x7c500000,0x00000000)}}, {VT_exponent,22,0x3a92dd,{DOUBLEWITHTWODWORDINTREE(0x7c600000,0x00000000)}}, {VT_exponent,22,0x3a92de,{DOUBLEWITHTWODWORDINTREE(0x7c700000,0x00000000)}}, {VT_exponent,22,0x3a92df,{DOUBLEWITHTWODWORDINTREE(0x7c800000,0x00000000)}}, {VT_exponent,22,0x3a92e0,{DOUBLEWITHTWODWORDINTREE(0x7c900000,0x00000000)}}, {VT_exponent,22,0x3a92e1,{DOUBLEWITHTWODWORDINTREE(0x7ca00000,0x00000000)}}, {VT_exponent,22,0x3a92e2,{DOUBLEWITHTWODWORDINTREE(0x7cb00000,0x00000000)}}, {VT_exponent,22,0x3a92e3,{DOUBLEWITHTWODWORDINTREE(0x7cc00000,0x00000000)}}, {VT_exponent,22,0x3a92e4,{DOUBLEWITHTWODWORDINTREE(0x7cd00000,0x00000000)}}, {VT_exponent,22,0x3a92e5,{DOUBLEWITHTWODWORDINTREE(0x7ce00000,0x00000000)}}, {VT_exponent,22,0x3a92e6,{DOUBLEWITHTWODWORDINTREE(0x7cf00000,0x00000000)}}, {VT_exponent,22,0x3a92e7,{DOUBLEWITHTWODWORDINTREE(0x7d000000,0x00000000)}}, {VT_exponent,22,0x3a92e8,{DOUBLEWITHTWODWORDINTREE(0x7d100000,0x00000000)}}, {VT_exponent,22,0x3a92e9,{DOUBLEWITHTWODWORDINTREE(0x7d200000,0x00000000)}}, {VT_exponent,22,0x3a92ea,{DOUBLEWITHTWODWORDINTREE(0x7d300000,0x00000000)}}, {VT_exponent,22,0x3a92eb,{DOUBLEWITHTWODWORDINTREE(0x7d400000,0x00000000)}}, {VT_exponent,22,0x3a92ec,{DOUBLEWITHTWODWORDINTREE(0x7d500000,0x00000000)}}, {VT_exponent,22,0x3a92ed,{DOUBLEWITHTWODWORDINTREE(0x7d600000,0x00000000)}}, {VT_exponent,22,0x3a92ee,{DOUBLEWITHTWODWORDINTREE(0x7d700000,0x00000000)}}, {VT_exponent,22,0x3a92ef,{DOUBLEWITHTWODWORDINTREE(0x7d800000,0x00000000)}}, {VT_exponent,22,0x3a92f0,{DOUBLEWITHTWODWORDINTREE(0x7d900000,0x00000000)}}, {VT_exponent,22,0x3a92f1,{DOUBLEWITHTWODWORDINTREE(0x7da00000,0x00000000)}}, {VT_exponent,22,0x3a92f2,{DOUBLEWITHTWODWORDINTREE(0x7db00000,0x00000000)}}, {VT_exponent,22,0x3a92f3,{DOUBLEWITHTWODWORDINTREE(0x7dc00000,0x00000000)}}, {VT_exponent,22,0x3a92f4,{DOUBLEWITHTWODWORDINTREE(0x7dd00000,0x00000000)}}, {VT_exponent,22,0x3a92f5,{DOUBLEWITHTWODWORDINTREE(0x7de00000,0x00000000)}}, {VT_exponent,22,0x3a92f6,{DOUBLEWITHTWODWORDINTREE(0x7df00000,0x00000000)}}, {VT_exponent,22,0x3a92f7,{DOUBLEWITHTWODWORDINTREE(0x7e000000,0x00000000)}}, {VT_exponent,22,0x3a92f8,{DOUBLEWITHTWODWORDINTREE(0x7e100000,0x00000000)}}, {VT_exponent,22,0x3a92f9,{DOUBLEWITHTWODWORDINTREE(0x7e200000,0x00000000)}}, {VT_exponent,22,0x3a92fa,{DOUBLEWITHTWODWORDINTREE(0x7e300000,0x00000000)}}, {VT_exponent,22,0x3a92fb,{DOUBLEWITHTWODWORDINTREE(0x7e400000,0x00000000)}}, {VT_exponent,22,0x3a92fc,{DOUBLEWITHTWODWORDINTREE(0x7e500000,0x00000000)}}, {VT_exponent,22,0x3a92fd,{DOUBLEWITHTWODWORDINTREE(0x7e600000,0x00000000)}}, {VT_exponent,22,0x3a92fe,{DOUBLEWITHTWODWORDINTREE(0x7e700000,0x00000000)}}, {VT_exponent,22,0x3a92ff,{DOUBLEWITHTWODWORDINTREE(0x7e800000,0x00000000)}}, {VT_exponent,22,0x3a95a0,{DOUBLEWITHTWODWORDINTREE(0x7e900000,0x00000000)}}, {VT_exponent,22,0x3a95a1,{DOUBLEWITHTWODWORDINTREE(0x7ea00000,0x00000000)}}, {VT_exponent,22,0x3a95a2,{DOUBLEWITHTWODWORDINTREE(0x7eb00000,0x00000000)}}, {VT_exponent,22,0x3a95a3,{DOUBLEWITHTWODWORDINTREE(0x7ec00000,0x00000000)}}, {VT_exponent,22,0x3a95a4,{DOUBLEWITHTWODWORDINTREE(0x7ed00000,0x00000000)}}, {VT_exponent,22,0x3a95a5,{DOUBLEWITHTWODWORDINTREE(0x7ee00000,0x00000000)}}, {VT_exponent,22,0x3a95a6,{DOUBLEWITHTWODWORDINTREE(0x7ef00000,0x00000000)}}, {VT_exponent,22,0x3a95a7,{DOUBLEWITHTWODWORDINTREE(0x7f000000,0x00000000)}}, {VT_exponent,22,0x3a95a8,{DOUBLEWITHTWODWORDINTREE(0x7f100000,0x00000000)}}, {VT_exponent,22,0x3a95a9,{DOUBLEWITHTWODWORDINTREE(0x7f200000,0x00000000)}}, {VT_exponent,22,0x3a95aa,{DOUBLEWITHTWODWORDINTREE(0x7f300000,0x00000000)}}, {VT_exponent,22,0x3a95ab,{DOUBLEWITHTWODWORDINTREE(0x7f400000,0x00000000)}}, {VT_exponent,22,0x3a95ac,{DOUBLEWITHTWODWORDINTREE(0x7f500000,0x00000000)}}, {VT_exponent,22,0x3a95ad,{DOUBLEWITHTWODWORDINTREE(0x7f600000,0x00000000)}}, {VT_exponent,22,0x3a95ae,{DOUBLEWITHTWODWORDINTREE(0x7f700000,0x00000000)}}, {VT_exponent,22,0x3a95af,{DOUBLEWITHTWODWORDINTREE(0x7f800000,0x00000000)}}, {VT_exponent,22,0x3b8fe0,{DOUBLEWITHTWODWORDINTREE(0x7f900000,0x00000000)}}, {VT_exponent,22,0x3b8fe1,{DOUBLEWITHTWODWORDINTREE(0x7fa00000,0x00000000)}}, {VT_exponent,22,0x3b8fe2,{DOUBLEWITHTWODWORDINTREE(0x7fb00000,0x00000000)}}, {VT_exponent,22,0x3b8fe3,{DOUBLEWITHTWODWORDINTREE(0x7fc00000,0x00000000)}}, {VT_exponent,21,0x68e90,{DOUBLEWITHTWODWORDINTREE(0x7fd00000,0x00000000)}}, {VT_exponent,21,0x68e91,{DOUBLEWITHTWODWORDINTREE(0x7fe00000,0x00000000)}}, {VT_exponent,21,0x68e98,{DOUBLEWITHTWODWORDINTREE(0x7ff80000,0x00000000)}}, }; // End of acofdoe array asymptote-3.05/prc/oPRCFile.cc0000644000000000000000000021273015031566105014671 0ustar rootroot/************ * * This file is part of a tool for producing 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt and * Michail Vidiassov * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include "prc/oPRCFile.h" #include #include #include #include #include #include #include namespace prc { #define WriteUnsignedInteger( value ) out << (uint32_t)(value); #define WriteInteger( value ) out << (int32_t)(value); #define WriteDouble( value ) out << (double)(value); #define WriteString( value ) out << (value); #define WriteUncompressedUnsignedInteger( value ) writeUncompressedUnsignedInteger(out, (uint32_t)(value)); #define WriteUncompressedBlock( value, count ) out.write((char *)(value),(count)); #define SerializeFileStructureUncompressedUniqueId( value ) (value).serializeFileStructureUncompressedUniqueId(out); #define SerializeCompressedUniqueId( value ) (value).serializeCompressedUniqueId(out); #define SerializeContentPRCBase write(out); #define SerializeRgbColor( value ) (value).serializeRgbColor(out); #define SerializePicture( value ) (value).serializePicture(out); #define SerializeTextureDefinition( value ) (value)->serializeTextureDefinition(out); #define SerializeMarkup( value ) (value)->serializeMarkup(out); #define SerializeAnnotationEntity( value ) (value)->serializeAnnotationEntity(out); #define SerializeFontKeysSameFont( value ) (value).serializeFontKeysSameFont(out); #define SerializeMaterial( value ) (value)->serializeMaterial(out); #define SerializeUserData UserData(0,0).write(out); #define SerializeEmptyContentPRCBase ContentPRCBase(PRC_TYPE_ROOT_PRCBase).serializeContentPRCBase(out); #define SerializeCategory1LineStyle( value ) (value)->serializeCategory1LineStyle(out); #define SerializeCoordinateSystem( value ) (value)->serializeCoordinateSystem(out); #define SerializeRepresentationItem( value ) (value)->serializeRepresentationItem(out); #define SerializePartDefinition( value ) (value)->serializePartDefinition(out); #define SerializeProductOccurrence( value ) (value)->serializeProductOccurrence(out); #define SerializeContextAndBodies( value ) (value)->serializeContextAndBodies(out); #define SerializeGeometrySummary( value ) (value)->serializeGeometrySummary(out); #define SerializeContextGraphics( value ) (value)->serializeContextGraphics(out); #define SerializeStartHeader serializeStartHeader(out); #define SerializeUncompressedFiles \ { \ const size_t number_of_uncompressed_files = uncompressed_files.size(); \ WriteUncompressedUnsignedInteger (number_of_uncompressed_files) \ for(PRCUncompressedFileList::const_iterator it = uncompressed_files.begin(); it != uncompressed_files.end(); it++) \ { \ WriteUncompressedUnsignedInteger ((*it)->file_size) \ WriteUncompressedBlock ((*it)->data, (*it)->file_size) \ } \ } #define SerializeModelFileData serializeModelFileData(modelFile_out); modelFile_out.compress(); #define SerializeUnit( value ) (value).serializeUnit(out); using namespace std; void PRCFileStructure::serializeFileStructureGlobals(PRCbitStream &out) { // even though this is technically not part of this section, // it is handled here for convenience const uint32_t number_of_schema = 0; WriteUnsignedInteger (number_of_schema) WriteUnsignedInteger (PRC_TYPE_ASM_FileStructureGlobals) PRCSingleAttribute sa((int32_t)PRCVersion); PRCAttribute a("__PRC_RESERVED_ATTRIBUTE_PRCInternalVersion"); a.addKey(sa); ContentPRCBase cb(PRC_TYPE_ROOT_PRCBase); cb.addAttribute(a); cb.serializeContentPRCBase(out); WriteUnsignedInteger (number_of_referenced_file_structures) // SerializeFileStructureInternalGlobalData WriteDouble (tessellation_chord_height_ratio) WriteDouble (tessellation_angle_degree) // SerializeMarkupSerializationHelper WriteString (default_font_family_name) const size_t number_of_fonts = font_keys_of_font.size(); WriteUnsignedInteger (number_of_fonts) for (size_t i=0;iunit_information.unit_from_CAD_file = true; product_occurrences[i]->unit_information.unit = unit; SerializeProductOccurrence (product_occurrences[i]) } // SerializeFileStructureInternalData WriteUnsignedInteger (PRC_TYPE_ASM_FileStructure) SerializeEmptyContentPRCBase const uint32_t next_available_index = makePRCID(); WriteUnsignedInteger (next_available_index) const size_t index_product_occurence = number_of_product_occurrences; // Asymptote (oPRCFile) specific - we write the root product last WriteUnsignedInteger (index_product_occurence) SerializeUserData } void PRCFileStructure::serializeFileStructureTessellation(PRCbitStream &out) { WriteUnsignedInteger (PRC_TYPE_ASM_FileStructureTessellation) SerializeEmptyContentPRCBase const size_t number_of_tessellations = tessellations.size(); WriteUnsignedInteger (number_of_tessellations) for (size_t i=0;iserializeBaseTessData(out); SerializeUserData } void PRCFileStructure::serializeFileStructureGeometry(PRCbitStream &out) { WriteUnsignedInteger (PRC_TYPE_ASM_FileStructureGeometry) SerializeEmptyContentPRCBase const size_t number_of_contexts = contexts.size(); WriteUnsignedInteger (number_of_contexts) for (size_t i=0;ifile_structure_uuid ) // index+1 out << (uint32_t)fileStructures[0]->product_occurrences.size(); // active out << true; out << (uint32_t)0; // index in model file SerializeUserData } void makeFileUUID(PRCUniqueId& UUID) { // make a UUID static uint32_t count = 0; ++count; // the minimum requirement on UUIDs is that all must be unique in the file UUID.id0 = 0x33595341; // some constant UUID.id1 = (uint32_t)time(NULL); // the time UUID.id2 = count; UUID.id3 = 0xa5a55a5a; // Something random, not seeded by the time, would be nice. But for now, a constant // maybe add something else to make it more unique // so multiple files can be combined // a hash of some data perhaps? } void makeAppUUID(PRCUniqueId& UUID) { UUID.id0 = UUID.id1 = UUID.id2 = UUID.id3 = 0; } void PRCUncompressedFile::write(ostream &out) const { if(data!=NULL) { WriteUncompressedUnsignedInteger (file_size) out.write((char*)data,file_size); } } uint32_t PRCUncompressedFile::getSize() const { return sizeof(file_size)+file_size; } void PRCStartHeader::serializeStartHeader(ostream &out) const { WriteUncompressedBlock ("PRC",3) WriteUncompressedUnsignedInteger (minimal_version_for_read) WriteUncompressedUnsignedInteger (authoring_version) SerializeFileStructureUncompressedUniqueId( file_structure_uuid ); SerializeFileStructureUncompressedUniqueId( application_uuid ); } uint32_t PRCStartHeader::getStartHeaderSize() const { return 3+(2+2*4)*sizeof(uint32_t); } void PRCFileStructure::write(ostream &out) { // SerializeFileStructureHeader SerializeStartHeader SerializeUncompressedFiles globals_out.write(out); tree_out.write(out); tessellations_out.write(out); geometry_out.write(out); extraGeometry_out.write(out); } #define SerializeFileStructureGlobals serializeFileStructureGlobals(globals_out); globals_out.compress(); sizes[1]=globals_out.getSize(); #define SerializeFileStructureTree serializeFileStructureTree(tree_out); tree_out.compress(); sizes[2]=tree_out.getSize(); #define SerializeFileStructureTessellation serializeFileStructureTessellation(tessellations_out); tessellations_out.compress(); sizes[3]=tessellations_out.getSize(); #define SerializeFileStructureGeometry serializeFileStructureGeometry(geometry_out); geometry_out.compress(); sizes[4]=geometry_out.getSize(); #define SerializeFileStructureExtraGeometry serializeFileStructureExtraGeometry(extraGeometry_out); extraGeometry_out.compress(); sizes[5]=extraGeometry_out.getSize(); #define FlushSerialization resetGraphicsAndName(); void PRCFileStructure::prepare() { uint32_t size = 0; size += getStartHeaderSize(); size += sizeof(uint32_t); for(PRCUncompressedFileList::const_iterator it = uncompressed_files.begin(); it != uncompressed_files.end(); it++) size += (*it)->getSize(); sizes[0]=size; SerializeFileStructureGlobals FlushSerialization SerializeFileStructureTree FlushSerialization SerializeFileStructureTessellation FlushSerialization SerializeFileStructureGeometry FlushSerialization SerializeFileStructureExtraGeometry FlushSerialization } uint32_t PRCFileStructure::getSize() { uint32_t size = 0; for(size_t i=0; i<6; i++) size += sizes[i]; return size; } void PRCFileStructureInformation::write(ostream &out) { SerializeFileStructureUncompressedUniqueId( UUID ); WriteUncompressedUnsignedInteger (reserved) WriteUncompressedUnsignedInteger (number_of_offsets) for(uint32_t i = 0; i < number_of_offsets; ++i) { WriteUncompressedUnsignedInteger (offsets[i]) } } uint32_t PRCFileStructureInformation::getSize() { return (4+2+number_of_offsets)*sizeof(uint32_t); } void PRCHeader::write(ostream &out) { SerializeStartHeader WriteUncompressedUnsignedInteger (number_of_file_structures) for(uint32_t i = 0; i < number_of_file_structures; ++i) { fileStructureInformation[i].write(out); } WriteUncompressedUnsignedInteger (model_file_offset) WriteUncompressedUnsignedInteger (file_size) SerializeUncompressedFiles } uint32_t PRCHeader::getSize() { uint32_t size = getStartHeaderSize() + sizeof(uint32_t); for(uint32_t i = 0; i < number_of_file_structures; ++i) size += fileStructureInformation[i].getSize(); size += 3*sizeof(uint32_t); for(PRCUncompressedFileList::const_iterator it = uncompressed_files.begin(); it != uncompressed_files.end(); it++) size += (*it)->getSize(); return size; } void oPRCFile::doGroup(PRCgroup& group) { const std::string& name = group.name; PRCProductOccurrence*& product_occurrence = group.product_occurrence; PRCProductOccurrence*& parent_product_occurrence = group.parent_product_occurrence; PRCPartDefinition*& part_definition = group.part_definition; PRCPartDefinition*& parent_part_definition = group.parent_part_definition; if(group.options.tess) { if(!group.lines.empty()) { for(PRCtesslineMap::const_iterator wit=group.lines.begin(); wit!=group.lines.end(); wit++) { bool same_color = true; const PRCtesslineList& lines = wit->second; const PRCRgbColor &color = lines.front().color; for(PRCtesslineList::const_iterator lit=lines.begin(); lit!=lines.end(); lit++) if(color!=lit->color) { same_color = false; break; } map points; PRC3DWireTess *tess = new PRC3DWireTess(); if(!same_color) { tess->is_segment_color = true; tess->is_rgba = false; } for(PRCtesslineList::const_iterator lit=lines.begin(); lit!=lines.end(); lit++) { tess->wire_indexes.push_back(static_cast(lit->point.size())); for(uint32_t i=0; ipoint.size(); i++) { map::iterator pPoint = points.find(lit->point[i]); if(pPoint!=points.end()) tess->wire_indexes.push_back(pPoint->second); else { const uint32_t point_index = static_cast(tess->coordinates.size()); points.insert(make_pair(lit->point[i],point_index)); tess->wire_indexes.push_back(point_index); tess->coordinates.push_back(lit->point[i].x); tess->coordinates.push_back(lit->point[i].y); tess->coordinates.push_back(lit->point[i].z); } if(!same_color && i>0) { tess->rgba_vertices.push_back(byte(lit->color.red)); tess->rgba_vertices.push_back(byte(lit->color.green)); tess->rgba_vertices.push_back(byte(lit->color.blue)); } } } const uint32_t tess_index = add3DWireTess(tess); PRCPolyWire *polyWire = new PRCPolyWire(); polyWire->index_tessellation = tess_index; if(same_color) polyWire->index_of_line_style = addColourWidth(RGBAColour(color.red,color.green,color.blue),wit->first); else polyWire->index_of_line_style = addColourWidth(RGBAColour(1,1,1),wit->first); part_definition->addPolyWire(polyWire); } } // make rectangles pairs of triangles in a tesselation if(!group.rectangles.empty()) { bool same_color = true; const uint32_t &style = group.rectangles.front().style; for(PRCtessrectangleList::const_iterator rit=group.rectangles.begin(); rit!=group.rectangles.end(); rit++) if(style!=rit->style) { same_color = false; break; } map points; PRC3DTess *tess = new PRC3DTess(); tess->crease_angle = group.options.crease_angle; PRCTessFace *tessFace = new PRCTessFace(); tessFace->used_entities_flag=PRC_FACETESSDATA_Triangle; uint32_t triangles = 0; for(PRCtessrectangleList::const_iterator rit=group.rectangles.begin(); rit!=group.rectangles.end(); rit++) { const bool degenerate = (rit->vertices[0]==rit->vertices[1]); uint32_t vertex_indices[4]; for(size_t i = (degenerate?1:0); i < 4; ++i) { map::const_iterator pPoint = points.find(rit->vertices[i]); if(pPoint!=points.end()) vertex_indices[i] = pPoint->second; else { points.insert(make_pair(rit->vertices[i],(vertex_indices[i] = static_cast(tess->coordinates.size())))); tess->coordinates.push_back(rit->vertices[i].x); tess->coordinates.push_back(rit->vertices[i].y); tess->coordinates.push_back(rit->vertices[i].z); } } if(degenerate) { tess->triangulated_index.push_back(vertex_indices[1]); tess->triangulated_index.push_back(vertex_indices[2]); tess->triangulated_index.push_back(vertex_indices[3]); triangles++; if(!same_color) tessFace->line_attributes.push_back(rit->style); } else { tess->triangulated_index.push_back(vertex_indices[0]); tess->triangulated_index.push_back(vertex_indices[2]); tess->triangulated_index.push_back(vertex_indices[3]); triangles++; if(!same_color) tessFace->line_attributes.push_back(rit->style); tess->triangulated_index.push_back(vertex_indices[3]); tess->triangulated_index.push_back(vertex_indices[1]); tess->triangulated_index.push_back(vertex_indices[0]); triangles++; if(!same_color) tessFace->line_attributes.push_back(rit->style); } } tessFace->sizes_triangulated.push_back(triangles); tess->addTessFace(tessFace); const uint32_t tess_index = add3DTess(tess); PRCPolyBrepModel *polyBrepModel = new PRCPolyBrepModel(); polyBrepModel->index_tessellation = tess_index; polyBrepModel->is_closed = group.options.closed; if(same_color) polyBrepModel->index_of_line_style = style; part_definition->addPolyBrepModel(polyBrepModel); } } if(!group.quads.empty()) { map points; PRC3DTess *tess = new PRC3DTess(); tess->crease_angle = group.options.crease_angle; PRCTessFace *tessFace = new PRCTessFace(); tessFace->used_entities_flag=PRC_FACETESSDATA_Triangle; uint32_t triangles = 0; tessFace->is_rgba = false; for(PRCtessquadList::const_iterator qit=group.quads.begin(); qit!=group.quads.end(); qit++) { const RGBAColour* C = qit->colours; if(C[0].A != 1.0 || C[1].A != 1.0 || C[2].A != 1.0 || C[3].A != 1.0) { tessFace->is_rgba = true; break; } } bool same_colour = true; const RGBAColour& colour = group.quads.front().colours[0]; for(PRCtessquadList::const_iterator qit=group.quads.begin(); qit!=group.quads.end(); qit++) { const RGBAColour* C = qit->colours; if(colour!=C[0] || colour!=C[1] || colour!=C[2] || colour!=C[3]) { same_colour = false; break; } } for(PRCtessquadList::const_iterator qit=group.quads.begin(); qit!=group.quads.end(); qit++) { const RGBAColour* C = qit->colours; const bool degenerate = (qit->vertices[0]==qit->vertices[1]); uint32_t vertex_indices[4]; for(size_t i = (degenerate?1:0); i < 4; ++i) { map::const_iterator pPoint = points.find(qit->vertices[i]); if(pPoint!=points.end()) vertex_indices[i] = pPoint->second; else { points.insert(make_pair(qit->vertices[i],(vertex_indices[i] = static_cast(tess->coordinates.size())))); tess->coordinates.push_back(qit->vertices[i].x); tess->coordinates.push_back(qit->vertices[i].y); tess->coordinates.push_back(qit->vertices[i].z); } } if(degenerate) { tess->triangulated_index.push_back(vertex_indices[1]); tess->triangulated_index.push_back(vertex_indices[2]); tess->triangulated_index.push_back(vertex_indices[3]); triangles++; if(!same_colour) { tessFace->rgba_vertices.push_back(byte(C[1].R)); tessFace->rgba_vertices.push_back(byte(C[1].G)); tessFace->rgba_vertices.push_back(byte(C[1].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[1].A)); tessFace->rgba_vertices.push_back(byte(C[2].R)); tessFace->rgba_vertices.push_back(byte(C[2].G)); tessFace->rgba_vertices.push_back(byte(C[2].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[2].A)); tessFace->rgba_vertices.push_back(byte(C[3].R)); tessFace->rgba_vertices.push_back(byte(C[3].G)); tessFace->rgba_vertices.push_back(byte(C[3].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[3].A)); } } else { tess->triangulated_index.push_back(vertex_indices[0]); tess->triangulated_index.push_back(vertex_indices[2]); tess->triangulated_index.push_back(vertex_indices[3]); triangles++; if(!same_colour) { tessFace->rgba_vertices.push_back(byte(C[0].R)); tessFace->rgba_vertices.push_back(byte(C[0].G)); tessFace->rgba_vertices.push_back(byte(C[0].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[0].A)); tessFace->rgba_vertices.push_back(byte(C[2].R)); tessFace->rgba_vertices.push_back(byte(C[2].G)); tessFace->rgba_vertices.push_back(byte(C[2].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[2].A)); tessFace->rgba_vertices.push_back(byte(C[3].R)); tessFace->rgba_vertices.push_back(byte(C[3].G)); tessFace->rgba_vertices.push_back(byte(C[3].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[3].A)); } tess->triangulated_index.push_back(vertex_indices[3]); tess->triangulated_index.push_back(vertex_indices[1]); tess->triangulated_index.push_back(vertex_indices[0]); triangles++; if(!same_colour) { tessFace->rgba_vertices.push_back(byte(C[3].R)); tessFace->rgba_vertices.push_back(byte(C[3].G)); tessFace->rgba_vertices.push_back(byte(C[3].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[3].A)); tessFace->rgba_vertices.push_back(byte(C[1].R)); tessFace->rgba_vertices.push_back(byte(C[1].G)); tessFace->rgba_vertices.push_back(byte(C[1].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[1].A)); tessFace->rgba_vertices.push_back(byte(C[0].R)); tessFace->rgba_vertices.push_back(byte(C[0].G)); tessFace->rgba_vertices.push_back(byte(C[0].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[0].A)); } } } tessFace->sizes_triangulated.push_back(triangles); tess->addTessFace(tessFace); const uint32_t tess_index = add3DTess(tess); PRCPolyBrepModel *polyBrepModel = new PRCPolyBrepModel(); polyBrepModel->index_tessellation = tess_index; polyBrepModel->is_closed = group.options.closed; if(same_colour) polyBrepModel->index_of_line_style = addColour(colour); part_definition->addPolyBrepModel(polyBrepModel); } if(!group.points.empty()) { for(PRCpointsetMap::const_iterator pit=group.points.begin(); pit!=group.points.end(); pit++) { PRCPointSet *pointset = new PRCPointSet(); pointset->index_of_line_style = pit->first; pointset->point = pit->second; part_definition->addPointSet(pointset); } } if(!group.pointsets.empty()) { for(std::vector::iterator pit=group.pointsets.begin(); pit!=group.pointsets.end(); pit++) { part_definition->addPointSet(*pit); } } if(!group.polymodels.empty()) { for(std::vector::iterator pit=group.polymodels.begin(); pit!=group.polymodels.end(); pit++) { (*pit)->is_closed = group.options.closed; part_definition->addPolyBrepModel(*pit); } } if(!group.polywires.empty()) { for(std::vector::iterator pit=group.polywires.begin(); pit!=group.polywires.end(); pit++) { part_definition->addPolyWire(*pit); } } if(!group.wires.empty()) { PRCTopoContext *wireContext = NULL; const uint32_t context_index = getTopoContext(wireContext); for(PRCwireList::iterator wit=group.wires.begin(); wit!=group.wires.end(); wit++) { PRCWireEdge *wireEdge = new PRCWireEdge; wireEdge->curve_3d = wit->curve; PRCSingleWireBody *wireBody = new PRCSingleWireBody; wireBody->setWireEdge(wireEdge); const uint32_t wire_body_index = wireContext->addSingleWireBody(wireBody); PRCWire *wire = new PRCWire(); wire->index_of_line_style = wit->style; wire->context_id = context_index; wire->body_id = wire_body_index; if(wit->transform) wire->index_local_coordinate_system = addTransform(wit->transform); part_definition->addWire(wire); } } PRCfaceList &faces = group.faces; if(!faces.empty()) { bool same_color = true; const uint32_t style = faces.front().style; for(PRCfaceList::const_iterator fit=faces.begin(); fit!=faces.end(); fit++) if(style!=fit->style) { same_color = false; break; } PRCTopoContext *context = NULL; const uint32_t context_index = getTopoContext(context); context->granularity = group.options.granularity; // Acrobat 9 also does the following: // context->tolerance = group.options.granularity; // context->have_smallest_face_thickness = true; // context->smallest_thickness = group.options.granularity; PRCShell *shell = new PRCShell; for(PRCfaceList::iterator fit=faces.begin(); fit!=faces.end(); fit++) { if(fit->transform || group.options.do_break || (fit->transparent && !group.options.no_break)) { PRCShell *shell = new PRCShell; shell->addFace(fit->face); PRCConnex *connex = new PRCConnex; connex->addShell(shell); PRCBrepData *body = new PRCBrepData; body->addConnex(connex); const uint32_t body_index = context->addBrepData(body); PRCBrepModel *brepmodel = new PRCBrepModel(); brepmodel->index_of_line_style = fit->style; brepmodel->context_id = context_index; brepmodel->body_id = body_index; brepmodel->is_closed = group.options.closed; brepmodel->index_local_coordinate_system = addTransform(fit->transform); part_definition->addBrepModel(brepmodel); } else { if(!same_color) fit->face->index_of_line_style = fit->style; shell->addFace(fit->face); } } if(shell->face.empty()) { delete shell; } else { PRCConnex *connex = new PRCConnex; connex->addShell(shell); PRCBrepData *body = new PRCBrepData; body->addConnex(connex); const uint32_t body_index = context->addBrepData(body); PRCBrepModel *brepmodel = new PRCBrepModel(); if(same_color) brepmodel->index_of_line_style = style; brepmodel->context_id = context_index; brepmodel->body_id = body_index; brepmodel->is_closed = group.options.closed; part_definition->addBrepModel(brepmodel); } } PRCcompfaceList &compfaces = group.compfaces; if(!compfaces.empty()) { bool same_color = true; const uint32_t style = compfaces.front().style; for(PRCcompfaceList::const_iterator fit=compfaces.begin(); fit!=compfaces.end(); fit++) if(style!=fit->style) { same_color = false; break; } PRCTopoContext *context = NULL; const uint32_t context_index = getTopoContext(context); PRCCompressedBrepData *body = new PRCCompressedBrepData; body->serial_tolerance=group.options.compression; body->brep_data_compressed_tolerance=0.1*group.options.compression; for(PRCcompfaceList::const_iterator fit=compfaces.begin(); fit!=compfaces.end(); fit++) { if(group.options.do_break || (fit->transparent && !group.options.no_break)) { PRCCompressedBrepData *body = new PRCCompressedBrepData; body->face.push_back(fit->face); body->serial_tolerance=group.options.compression; body->brep_data_compressed_tolerance=2.8346456* group.options.compression; const uint32_t body_index = context->addCompressedBrepData(body); PRCBrepModel *brepmodel = new PRCBrepModel(); brepmodel->index_of_line_style = fit->style; brepmodel->context_id = context_index; brepmodel->body_id = body_index; brepmodel->is_closed = group.options.closed; part_definition->addBrepModel(brepmodel); } else { if(!same_color) fit->face->index_of_line_style = fit->style; body->face.push_back(fit->face); } } if(body->face.empty()) { delete body; } else { const uint32_t body_index = context->addCompressedBrepData(body); PRCBrepModel *brepmodel = new PRCBrepModel(); if(same_color) brepmodel->index_of_line_style = style; brepmodel->context_id = context_index; brepmodel->body_id = body_index; brepmodel->is_closed = group.options.closed; part_definition->addBrepModel(brepmodel); } } // Simplify and reduce to as simple entities as possible // products with named representation items can not be reduced to sets, since // outside references are already set bool nonamedparts = true; for(PRCRepresentationItemList::const_iterator it=part_definition->representation_item.begin(); it!=part_definition->representation_item.end(); it++) { if (!(*it)->name.empty()) { nonamedparts = false; break; } } lastgroupname.clear(); lastgroupnames.clear(); // First option - reduce to one element in parent if (parent_part_definition && product_occurrence->index_son_occurrence.empty() && part_definition->representation_item.size() == 1 && ( name.empty() || part_definition->representation_item.front()->name.empty() ) && ( !group.transform || part_definition->representation_item.front()->index_local_coordinate_system==m1) ) { if(part_definition->representation_item.front()->name.empty() ) part_definition->representation_item.front()->name = name; if(part_definition->representation_item.front()->index_local_coordinate_system==m1) part_definition->representation_item.front()->index_local_coordinate_system = addTransform(group.transform); lastgroupname = calculate_unique_name(part_definition->representation_item.front(), parent_product_occurrence); parent_part_definition->addRepresentationItem(part_definition->representation_item.front()); part_definition->representation_item.clear(); delete product_occurrence; product_occurrence = NULL; delete part_definition; part_definition = NULL; } // Second option - reduce to a set else if (parent_part_definition && product_occurrence->index_son_occurrence.empty() && !part_definition->representation_item.empty() && !group.options.do_break && nonamedparts) { PRCSet *set = new PRCSet(name); set->index_local_coordinate_system = addTransform(group.transform); lastgroupname = calculate_unique_name(set, parent_product_occurrence); for(PRCRepresentationItemList::iterator it=part_definition->representation_item.begin(); it!=part_definition->representation_item.end(); it++) { lastgroupnames.push_back(calculate_unique_name(*it, parent_product_occurrence)); set->addRepresentationItem(*it); } part_definition->representation_item.clear(); parent_part_definition->addSet(set); delete product_occurrence; product_occurrence = NULL; delete part_definition; part_definition = NULL; } // Third option - create product else if ( !product_occurrence->index_son_occurrence.empty() || !part_definition->representation_item.empty()) { // if everything is enclosed in one group - drop the root group if (parent_product_occurrence == NULL && group.transform == NULL && part_definition->representation_item.empty() && product_occurrence->index_son_occurrence.size()==1) { delete part_definition; part_definition = NULL; delete product_occurrence; product_occurrence = NULL; } else { lastgroupname = calculate_unique_name(product_occurrence, NULL); if (part_definition->representation_item.empty()) { delete part_definition; part_definition = NULL; } else { for(PRCRepresentationItemList::const_iterator it=part_definition->representation_item.begin(); it!=part_definition->representation_item.end(); it++) if ((*it)->name.empty()) lastgroupnames.push_back(calculate_unique_name(*it, product_occurrence)); product_occurrence->index_part = addPartDefinition(part_definition); } if (group.transform) { product_occurrence->location = group.transform; group.transform = NULL; } if (parent_product_occurrence) { parent_product_occurrence->index_son_occurrence.push_back(addProductOccurrence(product_occurrence)); } else { addProductOccurrence(product_occurrence); } } } // Last case - absolutely nothing to do else { delete product_occurrence; product_occurrence = NULL; delete part_definition; part_definition = NULL; } } std::string oPRCFile::calculate_unique_name(const ContentPRCBase *prc_entity,const ContentPRCBase *prc_occurence) { std::stringstream ss (std::stringstream::in | std::stringstream::out); uint8_t *serialization_buffer = NULL; PRCbitStream serialization(serialization_buffer,0u); const PRCFileStructure *pfile_structure = fileStructures[0]; const PRCUniqueId& uuid = pfile_structure->file_structure_uuid; // ConvertUniqueIdentifierToString (prc_entity) // SerializeCompressedUniqueId (file_structure) serialization << uuid.id0 << uuid.id1 << uuid.id2 << uuid.id3; // WriteUnsignedInteger (type) serialization << prc_entity->getType(); // WriteUnsignedInteger (unique_identifier) serialization << prc_entity->getPRCID(); if (prc_occurence) { // serialization_buffer = Flush serialization (serialization) { const uint32_t size_serialization = serialization.getSize(); while(size_serialization == serialization.getSize()) serialization << false; } // ConvertUniqueIdentifierToString (prc_occurrence_unique_id) // SerializeCompressedUniqueId (file_structure) serialization << uuid.id0 << uuid.id1 << uuid.id2 << uuid.id3; // WriteUnsignedInteger (type) serialization << (uint32_t)PRC_TYPE_ASM_ProductOccurence; // WriteUnsignedInteger (unique_identifier) serialization << prc_occurence->getPRCID(); } ss << (prc_entity->name.empty()?"node":prc_entity->name) << '.'; const uint32_t size_serialization = serialization.getSize(); for(size_t j=0; jprepare(); SerializeModelFileData // create the header // fill out enough info so that sizes can be computed correctly header.number_of_file_structures = number_of_file_structures; header.fileStructureInformation = new PRCFileStructureInformation[number_of_file_structures]; for(uint32_t i = 0; i < number_of_file_structures; ++i) { header.fileStructureInformation[i].UUID = fileStructures[i]->file_structure_uuid; header.fileStructureInformation[i].reserved = 0; header.fileStructureInformation[i].number_of_offsets = 6; header.fileStructureInformation[i].offsets = new uint32_t[6]; } header.minimal_version_for_read = PRCVersion; header.authoring_version = PRCVersion; makeFileUUID(header.file_structure_uuid); makeAppUUID(header.application_uuid); header.file_size = getSize(); header.model_file_offset = header.file_size - modelFile_out.getSize(); uint32_t currentOffset = header.getSize(); for(uint32_t i = 0; i < number_of_file_structures; ++i) { for(size_t j=0; j<6; j++) { header.fileStructureInformation[i].offsets[j] = currentOffset; currentOffset += fileStructures[i]->sizes[j]; } } // write the data header.write(output); for(uint32_t i = 0; i < number_of_file_structures; ++i) { fileStructures[i]->write(output); } modelFile_out.write(output); output.flush(); for(uint32_t i = 0; i < number_of_file_structures; ++i) delete[] header.fileStructureInformation[i].offsets; delete[] header.fileStructureInformation; return true; } uint32_t oPRCFile::getSize() { uint32_t size = header.getSize(); for(uint32_t i = 0; i < number_of_file_structures; ++i) { size += fileStructures[i]->getSize(); } size += modelFile_out.getSize(); return size; } uint32_t PRCFileStructure::addPicture(EPRCPictureDataFormat format, uint32_t size, const uint8_t *p, uint32_t width, uint32_t height, std::string name) { uint8_t *data = NULL; uint32_t components=0; PRCPicture picture(name); if(size==0 || p==NULL) { cerr << "image not set" << endl; return m1; } PRCUncompressedFile* uncompressed_file = new PRCUncompressedFile; if(format==KEPRCPicture_PNG || format==KEPRCPicture_JPG) { data = new uint8_t[size]; memcpy(data, p, size); uncompressed_files.push_back(uncompressed_file); uncompressed_files.back()->file_size = size; uncompressed_files.back()->data = data; picture.format = format; picture.uncompressed_file_index = static_cast(uncompressed_files.size()-1); picture.pixel_width = 0; // width and height are ignored for JPG and PNG pictures - but let us keep things clean picture.pixel_height = 0; pictures.push_back(picture); return static_cast(pictures.size()-1); } switch(format) { case KEPRCPicture_BITMAP_RGB_BYTE: components = 3; break; case KEPRCPicture_BITMAP_RGBA_BYTE: components = 4; break; case KEPRCPicture_BITMAP_GREY_BYTE: components = 1; break; case KEPRCPicture_BITMAP_GREYA_BYTE: components = 2; break; default: { cerr << "unknown picture format" << endl; return m1; } } if(width==0 || height==0) { cerr << "width or height parameter not set" << endl; return m1; } if (size < width*height*components) { cerr << "image too small" << endl; return m1; } { uint32_t compressedDataSize = 0; const int CHUNK= 1024; // is this reasonable? z_stream strm; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; if(deflateInit(&strm,Z_DEFAULT_COMPRESSION) != Z_OK) { cerr << "Compression initialization failed" << endl; return m1; } unsigned int sizeAvailable = deflateBound(&strm,size); uint8_t *compressedData = (uint8_t*) malloc(sizeAvailable); strm.avail_in = size; strm.next_in = (unsigned char*)p; strm.next_out = (unsigned char*)compressedData; strm.avail_out = sizeAvailable; int code; unsigned int chunks = 0; while((code = deflate(&strm,Z_FINISH)) == Z_OK) { ++chunks; // strm.avail_out should be 0 if we got Z_OK compressedDataSize = sizeAvailable - strm.avail_out; compressedData = (uint8_t*) realloc(compressedData,CHUNK*chunks); strm.next_out = (Bytef*)(compressedData + compressedDataSize); strm.avail_out += CHUNK; sizeAvailable += CHUNK; } compressedDataSize = sizeAvailable-strm.avail_out; if(code != Z_STREAM_END) { deflateEnd(&strm); free(compressedData); { cerr << "Compression error" << endl; return m1; } } deflateEnd(&strm); size = compressedDataSize; data = new uint8_t[compressedDataSize]; memcpy(data, compressedData, compressedDataSize); free(compressedData); } uncompressed_files.push_back(uncompressed_file); uncompressed_files.back()->file_size = size; uncompressed_files.back()->data = data; picture.format = format; picture.uncompressed_file_index = static_cast(uncompressed_files.size()-1); picture.pixel_width = width; picture.pixel_height = height; pictures.push_back(picture); return static_cast(pictures.size()-1); } uint32_t PRCFileStructure::addTextureDefinition(PRCTextureDefinition*& pTextureDefinition) { texture_definitions.push_back(pTextureDefinition); pTextureDefinition = NULL; return static_cast(texture_definitions.size()-1); } uint32_t PRCFileStructure::addRgbColor(const PRCRgbColor &color) { colors.push_back(color); return 3*static_cast(colors.size()-1); } uint32_t PRCFileStructure::addRgbColorUnique(const PRCRgbColor &color) { for(uint32_t i = 0; i < colors.size(); ++i) { if(colors[i] == color) return 3*i; } colors.push_back(color); return 3*static_cast(colors.size()-1); } uint32_t oPRCFile::addColor(const PRCRgbColor &color) { PRCcolorMap::const_iterator pColor = colorMap.find(color); if(pColor!=colorMap.end()) return pColor->second; // color_index = addRgbColorUnique(color); const uint32_t color_index = fileStructures[0]->addRgbColor(color); colorMap.insert(make_pair(color,color_index)); return color_index; } uint32_t oPRCFile::addColour(const RGBAColour &colour) { PRCcolourMap::const_iterator pColour = colourMap.find(colour); if(pColour!=colourMap.end()) return pColour->second; const uint32_t color_index = addColor(PRCRgbColor(colour.R, colour.G, colour.B)); PRCStyle *style = new PRCStyle(); style->line_width = 1.0; style->is_vpicture = false; style->line_pattern_vpicture_index = 0; style->is_material = false; style->color_material_index = color_index; style->is_transparency_defined = (colour.A < 1.0); style->transparency = (uint8_t)(colour.A * 256); style->additional = 0; const uint32_t style_index = fileStructures[0]->addStyle(style); colourMap.insert(make_pair(colour,style_index)); return style_index; } uint32_t oPRCFile::addColourWidth(const RGBAColour &colour, double width) { RGBAColourWidth colourwidth(colour.R, colour.G, colour.B, colour.A, width); PRCcolourwidthMap::const_iterator pColour = colourwidthMap.find(colourwidth); if(pColour!=colourwidthMap.end()) return pColour->second; const uint32_t color_index = addColor(PRCRgbColor(colour.R, colour.G, colour.B)); PRCStyle *style = new PRCStyle(); style->line_width = width; style->is_vpicture = false; style->line_pattern_vpicture_index = 0; style->is_material = false; style->color_material_index = color_index; style->is_transparency_defined = (colour.A < 1.0); style->transparency = (uint8_t)(colour.A * 256); style->additional = 0; const uint32_t style_index = fileStructures[0]->addStyle(style); colourwidthMap.insert(make_pair(colourwidth,style_index)); return style_index; } uint32_t oPRCFile::addTransform(PRCGeneralTransformation3d*& transform) { if(!transform) return m1; PRCtransformMap::const_iterator pTransform = transformMap.find(*transform); if(pTransform!=transformMap.end()) return pTransform->second; PRCCoordinateSystem *coordinateSystem = new PRCCoordinateSystem(); bool transform_replaced = false; if( transform->M(0,1)==0 && transform->M(0,2)==0 && transform->M(1,0)==0 && transform->M(1,2)==0 && transform->M(2,0)==0 && transform->M(2,1)==0 && transform->M(3,0)==0 && transform->M(3,1)==0 && transform->M(3,2)==0 && transform->M(3,3)==1 ) { transform_replaced = true; PRCCartesianTransformation3d *carttransform = new PRCCartesianTransformation3d; // if(transform->M(0,3)==0 && transform->M(1,3)==0 && transform->M(1,3)==0 && // transform->M(0,0)==1 && transform->M(1,1)==1 && transform->M(2,2)==1 ) // carttransform->behaviour = PRC_TRANSFORMATION_Identity; if(transform->M(0,3)!=0 || transform->M(1,3)!=0 || transform->M(2,3)!=0) { carttransform->behaviour |= PRC_TRANSFORMATION_Translate; carttransform->origin.Set(transform->M(0,3),transform->M(1,3),transform->M(2,3)); } if(transform->M(0,0)!=transform->M(1,1) || transform->M(0,0)!=transform->M(2,2)) { carttransform->behaviour |= PRC_TRANSFORMATION_NonUniformScale; carttransform->scale.Set(transform->M(0,0),transform->M(1,1),transform->M(2,2)); } else if(transform->M(0,0)!=1) { carttransform->behaviour |= PRC_TRANSFORMATION_Scale; carttransform->uniform_scale=transform->M(0,0); } coordinateSystem->axis_set = carttransform; } else coordinateSystem->axis_set = transform; const uint32_t coordinate_system_index = fileStructures[0]->addCoordinateSystem(coordinateSystem); transformMap.insert(make_pair(*transform,coordinate_system_index)); if(transform_replaced) delete transform; transform = NULL; return coordinate_system_index; } uint32_t oPRCFile::addTransform(const double* t) { if(!t) return m1; PRCGeneralTransformation3d* transform = new PRCGeneralTransformation3d(t); return addTransform(transform); } uint32_t oPRCFile::addTransform(const double origin[3], const double x_axis[3], const double y_axis[3], double scale) { PRCCartesianTransformation3d* transform = new PRCCartesianTransformation3d(origin, x_axis, y_axis, scale); if(transform->behaviour==PRC_TRANSFORMATION_Identity) return m1; PRCCoordinateSystem *coordinateSystem = new PRCCoordinateSystem(); coordinateSystem->axis_set = transform; const uint32_t coordinate_system_index = fileStructures[0]->addCoordinateSystem(coordinateSystem); return coordinate_system_index; } uint32_t oPRCFile::addMaterial(const PRCmaterial& m) { uint32_t material_index = m1; const PRCmaterialgeneric materialgeneric(m); PRCmaterialgenericMap::const_iterator pMaterialgeneric = materialgenericMap.find(materialgeneric); if(pMaterialgeneric!=materialgenericMap.end()) material_index = pMaterialgeneric->second; else { PRCMaterialGeneric *materialGeneric = new PRCMaterialGeneric(); const PRCRgbColor ambient(m.ambient.R, m.ambient.G, m.ambient.B); materialGeneric->ambient = addColor(ambient); const PRCRgbColor diffuse(m.diffuse.R, m.diffuse.G, m.diffuse.B); materialGeneric->diffuse = addColor(diffuse); const PRCRgbColor emissive(m.emissive.R, m.emissive.G, m.emissive.B); materialGeneric->emissive = addColor(emissive); const PRCRgbColor specular(m.specular.R, m.specular.G, m.specular.B); materialGeneric->specular = addColor(specular); materialGeneric->shininess = m.shininess; materialGeneric->ambient_alpha = m.ambient.A; materialGeneric->diffuse_alpha = m.diffuse.A; materialGeneric->emissive_alpha = m.emissive.A; materialGeneric->specular_alpha = m.specular.A; material_index = addMaterialGeneric(materialGeneric); materialgenericMap.insert(make_pair(materialgeneric,material_index)); } uint32_t color_material_index = m1; if(m.picture_data!=NULL) { uint32_t picture_index = m1; PRCpicture picture(m); PRCpictureMap::const_iterator pPicture = pictureMap.find(picture); if(pPicture!=pictureMap.end()) picture_index = pPicture->second; else { picture_index = addPicture(picture); uint8_t* data = new uint8_t[picture.size]; memcpy(data,picture.data,picture.size); picture.data = data; pictureMap.insert(make_pair(picture,picture_index)); } uint32_t texture_definition_index = m1; PRCtexturedefinition texturedefinition(picture_index, m); PRCtexturedefinitionMap::const_iterator pTexturedefinition = texturedefinitionMap.find(texturedefinition); if(pTexturedefinition!=texturedefinitionMap.end()) texture_definition_index = pTexturedefinition->second; else { PRCTextureDefinition *TextureDefinition = new PRCTextureDefinition; if (m.picture_size==216688 && m.picture_format==KEPRCPicture_JPG) TextureDefinition->texture_mapping_attribute=PRC_TEXTURE_MAPPING_OPACITY; TextureDefinition->picture_index = picture_index; TextureDefinition->texture_function = m.picture_replace ? KEPRCTextureFunction_Replace : KEPRCTextureFunction_Modulate; TextureDefinition->texture_wrapping_mode_S = m.picture_repeat ? KEPRCTextureWrappingMode_Repeat : KEPRCTextureWrappingMode_ClampToEdge; TextureDefinition->texture_wrapping_mode_T = m.picture_repeat ? KEPRCTextureWrappingMode_Repeat : KEPRCTextureWrappingMode_ClampToEdge; TextureDefinition->texture_mapping_attribute_components = (m.picture_format==KEPRCPicture_BITMAP_RGB_BYTE || m.picture_format==KEPRCPicture_JPG) ? PRC_TEXTURE_MAPPING_COMPONENTS_RGB : PRC_TEXTURE_MAPPING_COMPONENTS_RGBA; texture_definition_index = addTextureDefinition(TextureDefinition); texturedefinitionMap.insert(make_pair(texturedefinition,texture_definition_index)); } uint32_t texture_application_index = m1; const PRCtextureapplication textureapplication(material_index, texture_definition_index); PRCtextureapplicationMap::const_iterator pTextureapplication = textureapplicationMap.find(textureapplication); if(pTextureapplication!=textureapplicationMap.end()) texture_application_index = pTextureapplication->second; else { PRCTextureApplication *TextureApplication = new PRCTextureApplication; TextureApplication->material_generic_index = material_index; TextureApplication->texture_definition_index = texture_definition_index; texture_application_index = addTextureApplication(TextureApplication); textureapplicationMap.insert(make_pair(textureapplication,texture_application_index)); } color_material_index = texture_application_index; } else color_material_index = material_index; uint32_t style_index = m1; PRCstyle style(0,m.alpha,true,color_material_index); PRCstyleMap::const_iterator pStyle = styleMap.find(style); if(pStyle!=styleMap.end()) style_index = pStyle->second; else { PRCStyle *Style = new PRCStyle(); Style->line_width = 0.0; Style->is_vpicture = false; Style->line_pattern_vpicture_index = 0; Style->is_material = true; Style->is_transparency_defined = (m.alpha < 1.0); Style->transparency = (uint8_t)(m.alpha * 256); Style->additional = 0; Style->color_material_index = color_material_index; style_index = addStyle(Style); styleMap.insert(make_pair(style,style_index)); } // materialMap.insert(make_pair(material,style_index)); return style_index; } void oPRCFile::begingroup(const char *name, PRCoptions *options, const double* t) { const PRCgroup &parent_group = groups.top(); groups.push(PRCgroup()); PRCgroup &group = groups.top(); group.name=name; if(options) group.options=*options; if(t&&!isid(t)) group.transform = new PRCGeneralTransformation3d(t); group.product_occurrence = new PRCProductOccurrence(name); group.parent_product_occurrence = parent_group.product_occurrence; group.part_definition = new PRCPartDefinition; group.parent_part_definition = parent_group.part_definition; } void oPRCFile::endgroup() { if(groups.size()<2) { fputs("begingroup without matching endgroup",stderr); exit(1); } doGroup(groups.top()); groups.pop(); // std::cout << lastgroupname << std::endl; // for(std::vector::const_iterator it=lastgroupnames.begin(); it!=lastgroupnames.end(); it++) // std::cout << " " << *it << std::endl; } PRCgroup& oPRCFile::findGroup() { return groups.top(); } void oPRCFile::addPoints(uint32_t n, const double P[][3], const RGBAColour &c, double w) { if(n==0 || P==NULL) return; PRCgroup &group = findGroup(); PRCPointSet *pointset = new PRCPointSet(); group.pointsets.push_back(pointset); pointset->index_of_line_style = addColourWidth(c,w); pointset->point.reserve(n); for(uint32_t i=0; ipoint.push_back(PRCVector3d(P[i][0],P[i][1],P[i][2])); } void oPRCFile::useMesh(uint32_t tess_index, uint32_t style_index, const double origin[3], const double x_axis[3], const double y_axis[3], double scale) { PRCgroup &group = findGroup(); PRCPolyBrepModel *polyBrepModel = new PRCPolyBrepModel(); polyBrepModel->index_local_coordinate_system = addTransform(origin, x_axis, y_axis, scale); polyBrepModel->index_tessellation = tess_index; polyBrepModel->is_closed = group.options.closed; polyBrepModel->index_of_line_style = style_index; group.polymodels.push_back(polyBrepModel); } void oPRCFile::useMesh(uint32_t tess_index, uint32_t style_index, const double* t) { PRCgroup &group = findGroup(); PRCPolyBrepModel *polyBrepModel = new PRCPolyBrepModel(); polyBrepModel->index_local_coordinate_system = addTransform(t); polyBrepModel->index_tessellation = tess_index; polyBrepModel->is_closed = group.options.closed; polyBrepModel->index_of_line_style = style_index; group.polymodels.push_back(polyBrepModel); } void oPRCFile::useLines(uint32_t tess_index, uint32_t style_index, const double origin[3], const double x_axis[3], const double y_axis[3], double scale) { PRCgroup &group = findGroup(); PRCPolyWire *polyWire = new PRCPolyWire(); polyWire->index_local_coordinate_system = addTransform(origin, x_axis, y_axis, scale); polyWire->index_tessellation = tess_index; polyWire->index_of_line_style = style_index; group.polywires.push_back(polyWire); } void oPRCFile::useLines(uint32_t tess_index, uint32_t style_index, const double* t) { PRCgroup &group = findGroup(); PRCPolyWire *polyWire = new PRCPolyWire(); polyWire->index_local_coordinate_system = addTransform(t); polyWire->index_tessellation = tess_index; polyWire->index_of_line_style = style_index; group.polywires.push_back(polyWire); } void oPRCFile::addQuads(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[][4], const PRCmaterial &m, uint32_t nN, const double N[][3], const uint32_t NI[][4], uint32_t nT, const double T[][2], const uint32_t TI[][4], uint32_t nC, const RGBAColour C[], const uint32_t CI[][4], uint32_t nM, const PRCmaterial M[], const uint32_t MI[], double ca) { if(nP==0 || P==NULL || nI==0 || PI==NULL) return; const uint32_t tess_index = createQuadMesh(nP, P, nI, PI, m, nN, N, NI, nT, T, TI, nC, C, CI, nM, M, MI, ca); useMesh(tess_index,m1); } uint32_t oPRCFile::createQuadMesh(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[][4], uint32_t style_index, uint32_t nN, const double N[][3], const uint32_t NI[][4], uint32_t nT, const double T[][2], const uint32_t TI[][4], uint32_t nC, const RGBAColour C[], const uint32_t CI[][4], uint32_t nS, const uint32_t S[], const uint32_t SI[], double ca) { if(nP==0 || P==NULL || nI==0 || PI==NULL) return m1; const bool triangle_color = (nS != 0 && S != NULL && SI != NULL); const bool vertex_color = (nC != 0 && C != NULL && CI != NULL); const bool has_normals = (nN != 0 && N != NULL && NI != NULL); const bool textured = (nT != 0 && T != NULL && TI != NULL); PRC3DTess *tess = new PRC3DTess(); PRCTessFace *tessFace = new PRCTessFace(); tessFace->used_entities_flag = textured ? PRC_FACETESSDATA_TriangleTextured : PRC_FACETESSDATA_Triangle; tessFace->number_of_texture_coordinate_indexes = textured ? 1 : 0; tess->coordinates.reserve(3*nP); for(uint32_t i=0; icoordinates.push_back(P[i][0]); tess->coordinates.push_back(P[i][1]); tess->coordinates.push_back(P[i][2]); } if(has_normals) { tess->normal_coordinate.reserve(3*nN); for(uint32_t i=0; inormal_coordinate.push_back(N[i][0]); tess->normal_coordinate.push_back(N[i][1]); tess->normal_coordinate.push_back(N[i][2]); } } else tess->crease_angle = ca; if(textured) { tess->texture_coordinate.reserve(2*nT); for(uint32_t i=0; itexture_coordinate.push_back(T[i][0]); tess->texture_coordinate.push_back(T[i][1]); } } tess->triangulated_index.reserve(2*(3*nI+(has_normals?3:0)*nI+(textured?3:0)*nI)); for(uint32_t i=0; itriangulated_index.push_back(3*NI[i][0]); if(textured) tess->triangulated_index.push_back(2*TI[i][0]); tess->triangulated_index.push_back(3*PI[i][0]); if(has_normals) tess->triangulated_index.push_back(3*NI[i][1]); if(textured) tess->triangulated_index.push_back(2*TI[i][1]); tess->triangulated_index.push_back(3*PI[i][1]); if(has_normals) tess->triangulated_index.push_back(3*NI[i][3]); if(textured) tess->triangulated_index.push_back(2*TI[i][3]); tess->triangulated_index.push_back(3*PI[i][3]); // second triangle if(has_normals) tess->triangulated_index.push_back(3*NI[i][1]); if(textured) tess->triangulated_index.push_back(2*TI[i][1]); tess->triangulated_index.push_back(3*PI[i][1]); if(has_normals) tess->triangulated_index.push_back(3*NI[i][2]); if(textured) tess->triangulated_index.push_back(2*TI[i][2]); tess->triangulated_index.push_back(3*PI[i][2]); if(has_normals) tess->triangulated_index.push_back(3*NI[i][3]); if(textured) tess->triangulated_index.push_back(2*TI[i][3]); tess->triangulated_index.push_back(3*PI[i][3]); } tessFace->sizes_triangulated.push_back(2*nI); if(triangle_color) { tessFace->line_attributes.reserve(2*nI); for(uint32_t i=0; iline_attributes.push_back(SI[i]); tessFace->line_attributes.push_back(SI[i]); } } else { tessFace->line_attributes.push_back(style_index); } if(vertex_color) { tessFace->is_rgba=false; for(uint32_t i=0; iis_rgba=true; break; } tessFace->rgba_vertices.reserve(2*(tessFace->is_rgba?4:3)*3*nI); for(uint32_t i=0; irgba_vertices.push_back(byte(C[CI[i][0]].R)); tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].G)); tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].A)); tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].R)); tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].G)); tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].A)); tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].R)); tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].G)); tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].A)); // second triangle tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].R)); tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].G)); tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].A)); tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].R)); tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].G)); tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].A)); tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].R)); tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].G)); tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].B)); if(tessFace->is_rgba) tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].A)); } } tess->addTessFace(tessFace); const uint32_t tess_index = add3DTess(tess); return tess_index; } /* void oPRCFile::addTriangle(const double P[][3], const double T[][2], uint32_t style_index) { PRCgroup &group = findGroup(); group.triangles.push_back(PRCtesstriangle()); PRCtesstriangle &triangle = group.triangles.back(); for(size_t i = 0; i < 3; i++) { triangle.vertices[i].x = P[i][0]; triangle.vertices[i].y = P[i][1]; triangle.vertices[i].z = P[i][2]; triangle.texcoords[i].x = T[i][0]; triangle.texcoords[i].y = T[i][1]; } triangle.style = style_index; } */ void oPRCFile::addLines(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[], const RGBAColour& c, double w, bool segment_color, uint32_t nC, const RGBAColour C[], uint32_t nCI, const uint32_t CI[]) { if(nP==0 || P==NULL || nI==0 || PI==NULL) return; const uint32_t tess_index = createLines(nP, P, nI, PI, segment_color, nC, C, nCI, CI); useLines(tess_index, c, w); } uint32_t oPRCFile::createLines(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[], bool segment_color, uint32_t nC, const RGBAColour C[], uint32_t nCI, const uint32_t CI[]) { if(nP==0 || P==NULL || nI==0 || PI==NULL) return m1; const bool vertex_color = (nC != 0 && C != NULL && CI != NULL); PRC3DWireTess *tess = new PRC3DWireTess(); tess->coordinates.reserve(3*nP); for(uint32_t i=0; icoordinates.push_back(P[i][0]); tess->coordinates.push_back(P[i][1]); tess->coordinates.push_back(P[i][2]); } tess->wire_indexes.reserve(nI); for(uint32_t i=0; iwire_indexes.push_back(PI[i]); const uint32_t ni = i+PI[i]+1; for(i++; iwire_indexes.push_back(3*PI[i]); } if(vertex_color) { tess->is_segment_color = segment_color; tess->is_rgba=false; for(uint32_t i=0; iis_rgba=true; break; } tess->rgba_vertices.reserve((tess->is_rgba?4:3)*nCI); for(uint32_t i=0; irgba_vertices.push_back(byte(C[CI[i]].R)); tess->rgba_vertices.push_back(byte(C[CI[i]].G)); tess->rgba_vertices.push_back(byte(C[CI[i]].B)); if(tess->is_rgba) tess->rgba_vertices.push_back(byte(C[CI[i]].A)); } } const uint32_t tess_index = add3DWireTess(tess); return tess_index; } #define PRCFACETRANSFORM const double origin[3], const double x_axis[3], const double y_axis[3], double scale, const double* t void oPRCFile::addHemisphere(double radius, const PRCmaterial &m, PRCFACETRANSFORM) { ADDFACE(PRCSphere) SETTRANSF surface->uv_domain.min.x = 0; surface->uv_domain.max.x = 2*pi; surface->uv_domain.min.y = 0; surface->uv_domain.max.y = 0.5*pi; surface->radius = radius; } void oPRCFile::addSphere(double radius, const PRCmaterial &m, PRCFACETRANSFORM) { ADDFACE(PRCSphere) SETTRANSF surface->uv_domain.min.x = 0; surface->uv_domain.max.x = 2*pi; surface->uv_domain.min.y =-0.5*pi; surface->uv_domain.max.y = 0.5*pi; surface->radius = radius; } void oPRCFile::addDisk(double radius, const PRCmaterial &m, PRCFACETRANSFORM) { ADDFACE(PRCRuled) SETTRANSF PRCCircle *first_curve = new PRCCircle; first_curve->radius = radius; surface->first_curve = first_curve; PRCCircle *second_curve = new PRCCircle; second_curve->radius = 0; surface->second_curve = second_curve; surface->uv_domain.min.x = 0; surface->uv_domain.max.x = 1; surface->uv_domain.min.y = 0; surface->uv_domain.max.y = 2*pi; surface->parameterization_on_v_coeff_a = -1; surface->parameterization_on_v_coeff_b = 2*pi; } void oPRCFile::addCylinder(double radius, double height, const PRCmaterial &m, PRCFACETRANSFORM) { ADDFACE(PRCCylinder) SETTRANSF surface->uv_domain.min.x = 0; surface->uv_domain.max.x = 2*pi; surface->uv_domain.min.y = (height>0)?0:height; surface->uv_domain.max.y = (height>0)?height:0; surface->radius = radius; } void oPRCFile::addCone(double radius, double height, const PRCmaterial &m, PRCFACETRANSFORM) { ADDFACE(PRCCone) SETTRANSF surface->uv_domain.min.x = 0; surface->uv_domain.max.x = 2*pi; surface->uv_domain.min.y = (height>0)?0:height; surface->uv_domain.max.y = (height>0)?height:0; surface->bottom_radius = radius; surface->semi_angle = -atan(radius/height);; } void oPRCFile::addTorus(double major_radius, double minor_radius, double angle1, double angle2, const PRCmaterial &m, PRCFACETRANSFORM) { ADDFACE(PRCTorus) SETTRANSF surface->uv_domain.min.x = (angle1/180)*pi; surface->uv_domain.max.x = (angle2/180)*pi; surface->uv_domain.min.y = 0; surface->uv_domain.max.y = 2*pi; surface->major_radius = major_radius; surface->minor_radius = minor_radius; } #undef ADDWIRE #undef SETTRANSF uint32_t PRCFileStructure::addMaterialGeneric(PRCMaterialGeneric*& pMaterialGeneric) { materials.push_back(pMaterialGeneric); pMaterialGeneric = NULL; return static_cast(materials.size()-1); } uint32_t PRCFileStructure::addTextureApplication(PRCTextureApplication*& pTextureApplication) { materials.push_back(pTextureApplication); pTextureApplication = NULL; return static_cast(materials.size()-1); } uint32_t PRCFileStructure::addStyle(PRCStyle*& pStyle) { styles.push_back(pStyle); pStyle = NULL; return static_cast(styles.size()-1); } uint32_t PRCFileStructure::addPartDefinition(PRCPartDefinition*& pPartDefinition) { part_definitions.push_back(pPartDefinition); pPartDefinition = NULL; return static_cast(part_definitions.size()-1); } uint32_t PRCFileStructure::addProductOccurrence(PRCProductOccurrence*& pProductOccurrence) { product_occurrences.push_back(pProductOccurrence); pProductOccurrence = NULL; return static_cast(product_occurrences.size()-1); } uint32_t PRCFileStructure::addTopoContext(PRCTopoContext*& pTopoContext) { contexts.push_back(pTopoContext); pTopoContext = NULL; return static_cast(contexts.size()-1); } uint32_t PRCFileStructure::getTopoContext(PRCTopoContext*& pTopoContext) { pTopoContext = new PRCTopoContext; contexts.push_back(pTopoContext); return static_cast(contexts.size()-1); } uint32_t PRCFileStructure::add3DTess(PRC3DTess*& p3DTess) { tessellations.push_back(p3DTess); p3DTess = NULL; return static_cast(tessellations.size()-1); } uint32_t PRCFileStructure::add3DWireTess(PRC3DWireTess*& p3DWireTess) { tessellations.push_back(p3DWireTess); p3DWireTess = NULL; return static_cast(tessellations.size()-1); } /* uint32_t PRCFileStructure::addMarkupTess(PRCMarkupTess*& pMarkupTess) { tessellations.push_back(pMarkupTess); pMarkupTess = NULL; return tessellations.size()-1; } uint32_t PRCFileStructure::addMarkup(PRCMarkup*& pMarkup) { markups.push_back(pMarkup); pMarkup = NULL; return markups.size()-1; } uint32_t PRCFileStructure::addAnnotationItem(PRCAnnotationItem*& pAnnotationItem) { annotation_entities.push_back(pAnnotationItem); pAnnotationItem = NULL; return annotation_entities.size()-1; } */ uint32_t PRCFileStructure::addCoordinateSystem(PRCCoordinateSystem*& pCoordinateSystem) { reference_coordinate_systems.push_back(pCoordinateSystem); pCoordinateSystem = NULL; return static_cast(reference_coordinate_systems.size()-1); } uint32_t PRCFileStructure::addCoordinateSystemUnique(PRCCoordinateSystem*& pCoordinateSystem) { for(uint32_t i = 0; i < reference_coordinate_systems.size(); ++i) { if(*(reference_coordinate_systems[i])==*pCoordinateSystem) { pCoordinateSystem = NULL; return i; } } reference_coordinate_systems.push_back(pCoordinateSystem); pCoordinateSystem = NULL; return static_cast(reference_coordinate_systems.size()-1); } } asymptote-3.05/prc/test.cc0000644000000000000000000010662215031566105014247 0ustar rootroot/************ * * This file is part of a tool for producing 3D content in the PRC format. * Copyright (C) 2008 Orest Shardt and * Michail Vidiassov * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * *************/ #include "include/prc/oPRCFile.h" #include #include #include #include #include using namespace std; extern const double pi; int main() { #if 0 // List of pictures used; keep track of memory allocated to free it in the end // shared pointers or garbage collector may be an alternative uint8_t *picture1 = NULL; uint8_t *picture2 = NULL; uint8_t *picture3 = NULL; uint8_t *picture4 = NULL; oPRCFile file("test.prc"); const size_t N_COLOURS = 32; RGBAColour colours[N_COLOURS]; for(size_t i = 0; i < N_COLOURS; ++i) { colours[i%N_COLOURS].R = 0.0; colours[i%N_COLOURS].G = (i%N_COLOURS)/static_cast(N_COLOURS); colours[i%N_COLOURS].B = 0.95; colours[i%N_COLOURS].A = 0.75; } PRCmaterial materials[N_COLOURS]; for(size_t i = 0; i < N_COLOURS; ++i) { materials[i%N_COLOURS].diffuse.R = 0.0; materials[i%N_COLOURS].diffuse.G = (i%N_COLOURS)/static_cast(N_COLOURS); materials[i%N_COLOURS].diffuse.B = 0.95; materials[i%N_COLOURS].diffuse.A = 0.75; materials[i%N_COLOURS].specular.R = 0.01*0.0; materials[i%N_COLOURS].specular.G = 0.01*(i%N_COLOURS)/static_cast(N_COLOURS); materials[i%N_COLOURS].specular.B = 0.01*0.95; materials[i%N_COLOURS].specular.A = 0.01*0.75; materials[i%N_COLOURS].emissive.R = 0.20*0.0; materials[i%N_COLOURS].emissive.G = 0.20*(i%N_COLOURS)/static_cast(N_COLOURS); materials[i%N_COLOURS].emissive.B = 0.20*0.95; materials[i%N_COLOURS].emissive.A = 0.20*0.75; materials[i%N_COLOURS].ambient.R = 0.05*0.0; materials[i%N_COLOURS].ambient.G = 0.05*(i%N_COLOURS)/static_cast(N_COLOURS); materials[i%N_COLOURS].ambient.B = 0.05*0.95; materials[i%N_COLOURS].ambient.A = 0.05*0.75; materials[i%N_COLOURS].alpha = 0.75; materials[i%N_COLOURS].shininess = 0.1; } if(1) { double knotsU[] = {1,1,1,1,2,2,2,2}; double knotsV[] = {1,1,1,1,2,2,2,2}; const size_t NUMBER_OF_PATCHES = 32; double controlPoints[NUMBER_OF_PATCHES][16][3] = { { // Patch 0 {1.4,0,2.4},{1.4,-0.784,2.4},{0.784,-1.4,2.4},{0,-1.4,2.4}, {1.3375,0,2.53125},{1.3375,-0.749,2.53125},{0.749,-1.3375,2.53125},{0,-1.3375,2.53125}, {1.4375,0,2.53125},{1.4375,-0.805,2.53125},{0.805,-1.4375,2.53125},{0,-1.4375,2.53125}, {1.5,0,2.4},{1.5,-0.84,2.4},{0.84,-1.5,2.4},{0,-1.5,2.4}, }, { // Patch 1 {0,-1.4,2.4},{-0.784,-1.4,2.4},{-1.4,-0.784,2.4},{-1.4,0,2.4}, {0,-1.3375,2.53125},{-0.749,-1.3375,2.53125},{-1.3375,-0.749,2.53125},{-1.3375,0,2.53125}, {0,-1.4375,2.53125},{-0.805,-1.4375,2.53125},{-1.4375,-0.805,2.53125},{-1.4375,0,2.53125}, {0,-1.5,2.4},{-0.84,-1.5,2.4},{-1.5,-0.84,2.4},{-1.5,0,2.4}, }, { // Patch 2 {-1.4,0,2.4},{-1.4,0.784,2.4},{-0.784,1.4,2.4},{0,1.4,2.4}, {-1.3375,0,2.53125},{-1.3375,0.749,2.53125},{-0.749,1.3375,2.53125},{0,1.3375,2.53125}, {-1.4375,0,2.53125},{-1.4375,0.805,2.53125},{-0.805,1.4375,2.53125},{0,1.4375,2.53125}, {-1.5,0,2.4},{-1.5,0.84,2.4},{-0.84,1.5,2.4},{0,1.5,2.4}, }, { // Patch 3 {0,1.4,2.4},{0.784,1.4,2.4},{1.4,0.784,2.4},{1.4,0,2.4}, {0,1.3375,2.53125},{0.749,1.3375,2.53125},{1.3375,0.749,2.53125},{1.3375,0,2.53125}, {0,1.4375,2.53125},{0.805,1.4375,2.53125},{1.4375,0.805,2.53125},{1.4375,0,2.53125}, {0,1.5,2.4},{0.84,1.5,2.4},{1.5,0.84,2.4},{1.5,0,2.4}, }, { // Patch 4 {1.5,0,2.4},{1.5,-0.84,2.4},{0.84,-1.5,2.4},{0,-1.5,2.4}, {1.75,0,1.875},{1.75,-0.98,1.875},{0.98,-1.75,1.875},{0,-1.75,1.875}, {2,0,1.35},{2,-1.12,1.35},{1.12,-2,1.35},{0,-2,1.35}, {2,0,0.9},{2,-1.12,0.9},{1.12,-2,0.9},{0,-2,0.9}, }, { // Patch 5 {0,-1.5,2.4},{-0.84,-1.5,2.4},{-1.5,-0.84,2.4},{-1.5,0,2.4}, {0,-1.75,1.875},{-0.98,-1.75,1.875},{-1.75,-0.98,1.875},{-1.75,0,1.875}, {0,-2,1.35},{-1.12,-2,1.35},{-2,-1.12,1.35},{-2,0,1.35}, {0,-2,0.9},{-1.12,-2,0.9},{-2,-1.12,0.9},{-2,0,0.9}, }, { // Patch 6 {-1.5,0,2.4},{-1.5,0.84,2.4},{-0.84,1.5,2.4},{0,1.5,2.4}, {-1.75,0,1.875},{-1.75,0.98,1.875},{-0.98,1.75,1.875},{0,1.75,1.875}, {-2,0,1.35},{-2,1.12,1.35},{-1.12,2,1.35},{0,2,1.35}, {-2,0,0.9},{-2,1.12,0.9},{-1.12,2,0.9},{0,2,0.9}, }, { // Patch 7 {0,1.5,2.4},{0.84,1.5,2.4},{1.5,0.84,2.4},{1.5,0,2.4}, {0,1.75,1.875},{0.98,1.75,1.875},{1.75,0.98,1.875},{1.75,0,1.875}, {0,2,1.35},{1.12,2,1.35},{2,1.12,1.35},{2,0,1.35}, {0,2,0.9},{1.12,2,0.9},{2,1.12,0.9},{2,0,0.9}, }, { // Patch 8 {2,0,0.9},{2,-1.12,0.9},{1.12,-2,0.9},{0,-2,0.9}, {2,0,0.45},{2,-1.12,0.45},{1.12,-2,0.45},{0,-2,0.45}, {1.5,0,0.225},{1.5,-0.84,0.225},{0.84,-1.5,0.225},{0,-1.5,0.225}, {1.5,0,0.15},{1.5,-0.84,0.15},{0.84,-1.5,0.15},{0,-1.5,0.15}, }, { // Patch 9 {0,-2,0.9},{-1.12,-2,0.9},{-2,-1.12,0.9},{-2,0,0.9}, {0,-2,0.45},{-1.12,-2,0.45},{-2,-1.12,0.45},{-2,0,0.45}, {0,-1.5,0.225},{-0.84,-1.5,0.225},{-1.5,-0.84,0.225},{-1.5,0,0.225}, {0,-1.5,0.15},{-0.84,-1.5,0.15},{-1.5,-0.84,0.15},{-1.5,0,0.15}, }, { // Patch 10 {-2,0,0.9},{-2,1.12,0.9},{-1.12,2,0.9},{0,2,0.9}, {-2,0,0.45},{-2,1.12,0.45},{-1.12,2,0.45},{0,2,0.45}, {-1.5,0,0.225},{-1.5,0.84,0.225},{-0.84,1.5,0.225},{0,1.5,0.225}, {-1.5,0,0.15},{-1.5,0.84,0.15},{-0.84,1.5,0.15},{0,1.5,0.15}, }, { // Patch 11 {0,2,0.9},{1.12,2,0.9},{2,1.12,0.9},{2,0,0.9}, {0,2,0.45},{1.12,2,0.45},{2,1.12,0.45},{2,0,0.45}, {0,1.5,0.225},{0.84,1.5,0.225},{1.5,0.84,0.225},{1.5,0,0.225}, {0,1.5,0.15},{0.84,1.5,0.15},{1.5,0.84,0.15},{1.5,0,0.15}, }, { // Patch 12 {-1.6,0,2.025},{-1.6,-0.3,2.025},{-1.5,-0.3,2.25},{-1.5,0,2.25}, {-2.3,0,2.025},{-2.3,-0.3,2.025},{-2.5,-0.3,2.25},{-2.5,0,2.25}, {-2.7,0,2.025},{-2.7,-0.3,2.025},{-3,-0.3,2.25},{-3,0,2.25}, {-2.7,0,1.8},{-2.7,-0.3,1.8},{-3,-0.3,1.8},{-3,0,1.8}, }, { // Patch 13 {-1.5,0,2.25},{-1.5,0.3,2.25},{-1.6,0.3,2.025},{-1.6,0,2.025}, {-2.5,0,2.25},{-2.5,0.3,2.25},{-2.3,0.3,2.025},{-2.3,0,2.025}, {-3,0,2.25},{-3,0.3,2.25},{-2.7,0.3,2.025},{-2.7,0,2.025}, {-3,0,1.8},{-3,0.3,1.8},{-2.7,0.3,1.8},{-2.7,0,1.8}, }, { // Patch 14 {-2.7,0,1.8},{-2.7,-0.3,1.8},{-3,-0.3,1.8},{-3,0,1.8}, {-2.7,0,1.575},{-2.7,-0.3,1.575},{-3,-0.3,1.35},{-3,0,1.35}, {-2.5,0,1.125},{-2.5,-0.3,1.125},{-2.65,-0.3,0.9375},{-2.65,0,0.9375}, {-2,0,0.9},{-2,-0.3,0.9},{-1.9,-0.3,0.6},{-1.9,0,0.6}, }, { // Patch 15 {-3,0,1.8},{-3,0.3,1.8},{-2.7,0.3,1.8},{-2.7,0,1.8}, {-3,0,1.35},{-3,0.3,1.35},{-2.7,0.3,1.575},{-2.7,0,1.575}, {-2.65,0,0.9375},{-2.65,0.3,0.9375},{-2.5,0.3,1.125},{-2.5,0,1.125}, {-1.9,0,0.6},{-1.9,0.3,0.6},{-2,0.3,0.9},{-2,0,0.9}, }, { // Patch 16 {1.7,0,1.425},{1.7,-0.66,1.425},{1.7,-0.66,0.6},{1.7,0,0.6}, {2.6,0,1.425},{2.6,-0.66,1.425},{3.1,-0.66,0.825},{3.1,0,0.825}, {2.3,0,2.1},{2.3,-0.25,2.1},{2.4,-0.25,2.025},{2.4,0,2.025}, {2.7,0,2.4},{2.7,-0.25,2.4},{3.3,-0.25,2.4},{3.3,0,2.4}, }, { // Patch 17 {1.7,0,0.6},{1.7,0.66,0.6},{1.7,0.66,1.425},{1.7,0,1.425}, {3.1,0,0.825},{3.1,0.66,0.825},{2.6,0.66,1.425},{2.6,0,1.425}, {2.4,0,2.025},{2.4,0.25,2.025},{2.3,0.25,2.1},{2.3,0,2.1}, {3.3,0,2.4},{3.3,0.25,2.4},{2.7,0.25,2.4},{2.7,0,2.4}, }, { // Patch 18 {2.7,0,2.4},{2.7,-0.25,2.4},{3.3,-0.25,2.4},{3.3,0,2.4}, {2.8,0,2.475},{2.8,-0.25,2.475},{3.525,-0.25,2.49375},{3.525,0,2.49375}, {2.9,0,2.475},{2.9,-0.15,2.475},{3.45,-0.15,2.5125},{3.45,0,2.5125}, {2.8,0,2.4},{2.8,-0.15,2.4},{3.2,-0.15,2.4},{3.2,0,2.4}, }, { // Patch 19 {3.3,0,2.4},{3.3,0.25,2.4},{2.7,0.25,2.4},{2.7,0,2.4}, {3.525,0,2.49375},{3.525,0.25,2.49375},{2.8,0.25,2.475},{2.8,0,2.475}, {3.45,0,2.5125},{3.45,0.15,2.5125},{2.9,0.15,2.475},{2.9,0,2.475}, {3.2,0,2.4},{3.2,0.15,2.4},{2.8,0.15,2.4},{2.8,0,2.4}, }, { // Patch 20 {0,0,3.15},{0,0,3.15},{0,0,3.15},{0,0,3.15}, {0.8,0,3.15},{0.8,-0.45,3.15},{0.45,-0.8,3.15},{0,-0.8,3.15}, {0,0,2.85},{0,0,2.85},{0,0,2.85},{0,0,2.85}, {0.2,0,2.7},{0.2,-0.112,2.7},{0.112,-0.2,2.7},{0,-0.2,2.7}, }, { // Patch 21 {0,0,3.15},{0,0,3.15},{0,0,3.15},{0,0,3.15}, {0,-0.8,3.15},{-0.45,-0.8,3.15},{-0.8,-0.45,3.15},{-0.8,0,3.15}, {0,0,2.85},{0,0,2.85},{0,0,2.85},{0,0,2.85}, {0,-0.2,2.7},{-0.112,-0.2,2.7},{-0.2,-0.112,2.7},{-0.2,0,2.7}, }, { // Patch 22 {0,0,3.15},{0,0,3.15},{0,0,3.15},{0,0,3.15}, {-0.8,0,3.15},{-0.8,0.45,3.15},{-0.45,0.8,3.15},{0,0.8,3.15}, {0,0,2.85},{0,0,2.85},{0,0,2.85},{0,0,2.85}, {-0.2,0,2.7},{-0.2,0.112,2.7},{-0.112,0.2,2.7},{0,0.2,2.7}, }, { // Patch 23 {0,0,3.15},{0,0,3.15},{0,0,3.15},{0,0,3.15}, {0,0.8,3.15},{0.45,0.8,3.15},{0.8,0.45,3.15},{0.8,0,3.15}, {0,0,2.85},{0,0,2.85},{0,0,2.85},{0,0,2.85}, {0,0.2,2.7},{0.112,0.2,2.7},{0.2,0.112,2.7},{0.2,0,2.7}, }, { // Patch 24 {0.2,0,2.7},{0.2,-0.112,2.7},{0.112,-0.2,2.7},{0,-0.2,2.7}, {0.4,0,2.55},{0.4,-0.224,2.55},{0.224,-0.4,2.55},{0,-0.4,2.55}, {1.3,0,2.55},{1.3,-0.728,2.55},{0.728,-1.3,2.55},{0,-1.3,2.55}, {1.3,0,2.4},{1.3,-0.728,2.4},{0.728,-1.3,2.4},{0,-1.3,2.4}, }, { // Patch 25 {0,-0.2,2.7},{-0.112,-0.2,2.7},{-0.2,-0.112,2.7},{-0.2,0,2.7}, {0,-0.4,2.55},{-0.224,-0.4,2.55},{-0.4,-0.224,2.55},{-0.4,0,2.55}, {0,-1.3,2.55},{-0.728,-1.3,2.55},{-1.3,-0.728,2.55},{-1.3,0,2.55}, {0,-1.3,2.4},{-0.728,-1.3,2.4},{-1.3,-0.728,2.4},{-1.3,0,2.4}, }, { // Patch 26 {-0.2,0,2.7},{-0.2,0.112,2.7},{-0.112,0.2,2.7},{0,0.2,2.7}, {-0.4,0,2.55},{-0.4,0.224,2.55},{-0.224,0.4,2.55},{0,0.4,2.55}, {-1.3,0,2.55},{-1.3,0.728,2.55},{-0.728,1.3,2.55},{0,1.3,2.55}, {-1.3,0,2.4},{-1.3,0.728,2.4},{-0.728,1.3,2.4},{0,1.3,2.4}, }, { // Patch 27 {0,0.2,2.7},{0.112,0.2,2.7},{0.2,0.112,2.7},{0.2,0,2.7}, {0,0.4,2.55},{0.224,0.4,2.55},{0.4,0.224,2.55},{0.4,0,2.55}, {0,1.3,2.55},{0.728,1.3,2.55},{1.3,0.728,2.55},{1.3,0,2.55}, {0,1.3,2.4},{0.728,1.3,2.4},{1.3,0.728,2.4},{1.3,0,2.4}, }, { // Patch 28 {0,0,0},{0,0,0},{0,0,0},{0,0,0}, {1.425,0,0},{1.425,0.798,0},{0.798,1.425,0},{0,1.425,0}, {1.5,0,0.075},{1.5,0.84,0.075},{0.84,1.5,0.075},{0,1.5,0.075}, {1.5,0,0.15},{1.5,0.84,0.15},{0.84,1.5,0.15},{0,1.5,0.15}, }, { // Patch 29 {0,0,0},{0,0,0},{0,0,0},{0,0,0}, {0,1.425,0},{-0.798,1.425,0},{-1.425,0.798,0},{-1.425,0,0}, {0,1.5,0.075},{-0.84,1.5,0.075},{-1.5,0.84,0.075},{-1.5,0,0.075}, {0,1.5,0.15},{-0.84,1.5,0.15},{-1.5,0.84,0.15},{-1.5,0,0.15}, }, { // Patch 30 {0,0,0},{0,0,0},{0,0,0},{0,0,0}, {-1.425,0,0},{-1.425,-0.798,0},{-0.798,-1.425,0},{0,-1.425,0}, {-1.5,0,0.075},{-1.5,-0.84,0.075},{-0.84,-1.5,0.075},{0,-1.5,0.075}, {-1.5,0,0.15},{-1.5,-0.84,0.15},{-0.84,-1.5,0.15},{0,-1.5,0.15}, }, { // Patch 31 {0,0,0},{0,0,0},{0,0,0},{0,0,0}, {0,-1.425,0},{0.798,-1.425,0},{1.425,-0.798,0},{1.425,0,0}, {0,-1.5,0.075},{0.84,-1.5,0.075},{1.5,-0.84,0.075},{1.5,0,0.075}, {0,-1.5,0.15},{0.84,-1.5,0.15},{1.5,-0.84,0.15},{1.5,0,0.15}, }, }; file.begingroup("Teapot"); for(size_t i = 0; i < NUMBER_OF_PATCHES; ++i) { if(1) file.addPatch(controlPoints[i],materials[i%N_COLOURS]); if(0) file.addSurface(3,3,4,4,controlPoints[i],knotsU,knotsV,materials[i%N_COLOURS],NULL); // use (too) general API for the same result as above } file.endgroup(); double t[4][4]; t[0][0]=1; t[0][1]=0; t[0][2]=0; t[0][3]=6; t[1][0]=0; t[1][1]=1; t[1][2]=0; t[1][3]=0; t[2][0]=0; t[2][1]=0; t[2][2]=1; t[2][3]=0; t[3][0]=0; t[3][1]=0; t[3][2]=0; t[3][3]=1; PRCoptions teapotopt; teapotopt.no_break = true; teapotopt.do_break = false; teapotopt.compression = 0.0001; // force joining together of patches, damaging transparency file.begingroup("Teapot rendered in the way of opaque surfaces and transferred",&teapotopt,t); for(size_t i = 0; i < NUMBER_OF_PATCHES; ++i) { file.addPatch(controlPoints[i],materials[i%N_COLOURS]); } file.endgroup(); } const size_t NUMBER_OF_POINTS = 31; double points[NUMBER_OF_POINTS][3]; for(size_t i = 0; i < NUMBER_OF_POINTS; ++i) { points[i][0] = 3.5*cos(3.0*i/NUMBER_OF_POINTS*2.0*pi); points[i][1] = 3.5*sin(3.0*i/NUMBER_OF_POINTS*2.0*pi); points[i][2] = 5.0*i/NUMBER_OF_POINTS-1.0; } const size_t NUMBER_OF_WIRES = 2; double shifted_points[NUMBER_OF_WIRES][NUMBER_OF_POINTS][3]; for(size_t wire = 0; wire < NUMBER_OF_WIRES; ++wire) for(size_t point = 0; point < NUMBER_OF_POINTS; ++point) { shifted_points[wire][point][0] = points[point][0]; shifted_points[wire][point][1] = points[point][1]; shifted_points[wire][point][2] = points[point][2]+0.1*wire+0.1; } double knots[3+NUMBER_OF_POINTS+1]; knots[0] = 1; for(size_t i = 1; i < 3+NUMBER_OF_POINTS; ++i) { knots[i] = (i+2)/3; // integer division is intentional } knots[3+NUMBER_OF_POINTS] = (3+NUMBER_OF_POINTS+1)/3; PRCoptions grpopt; grpopt.no_break = true; grpopt.do_break = false; grpopt.tess = true; if(1){ double point1[3] = {11,0,0}; double point2[3] = {12,0,0}; double points[2][3] = {{9,0,0},{10,0,0}}; file.begingroup("points",&grpopt); file.addPoint(point1, RGBAColour(1.0,0.0,0.0)); file.addPoint(point2, RGBAColour(1.0,0.0,0.0)); file.addPoints(2, points, RGBAColour(1.0,0.0,0.0,0.5),10); file.endgroup(); } if(1){ PRCoptions grpopt; grpopt.no_break = true; grpopt.do_break = false; grpopt.tess = true; grpopt.closed = true; double t[4][4]; const size_t nP = 5; double P[nP][3] = {{0,0,0},{1,0,0},{1,1,0},{0,1,0},{0,2,0}}; const size_t nI = 3; uint32_t PI[nI][3] = {{0,1,3},{1,2,3},{3,2,4}}; const size_t nM = 2; PRCmaterial M[nM]; M[0] = PRCmaterial( RGBAColour(0.0,0.0,0.18), RGBAColour(0.0,0.0,0.878431), RGBAColour(0.0,0.0,0.32), RGBAColour(0.0,0.0,0.072), 1.0,0.1); M[1] = PRCmaterial( RGBAColour(0.18,0.0,0.0), RGBAColour(0.878431,0.0,0.0), RGBAColour(0.32,0.0,0.0), RGBAColour(0.072,0.0,0.0), 0.5,0.1); uint32_t MI[nI] = {0,1,0}; const size_t nN = 2; double N[nN][3] = {{0,0,1},{0,0,-1}}; uint32_t NI[nI][3] = {{0,0,0},{0,0,0},{1,1,1}}; const uint32_t nC = 3; RGBAColour C[nC]; uint32_t CI[nI][3] = {{0,0,0},{1,1,1},{1,1,2}}; PRCmaterial materialGreen( RGBAColour(0.0,0.18,0.0), RGBAColour(0.0,0.878431,0.0), RGBAColour(0.0,0.32,0.0), RGBAColour(0.0,0.072,0.0), 1.0,0.1); if(1){ t[0][0]=1; t[0][1]=0; t[0][2]=0; t[0][3]=0; t[1][0]=0; t[1][1]=1; t[1][2]=0; t[1][3]=0; t[2][0]=0; t[2][1]=0; t[2][2]=1; t[2][3]=-1; t[3][0]=0; t[3][1]=0; t[3][2]=0; t[3][3]=1; file.begingroup("triangles_onecolor_with_normals",&grpopt,t); file.addTriangles(nP, P, nI, PI, materialGreen, nN, N, NI, 0, NULL, NULL, 0, NULL, NULL, 0, NULL, NULL); file.endgroup(); } if(1){ file.begingroup("triangles_onecolor",&grpopt); file.addTriangles(nP, P, nI, PI, materialGreen, 0, NULL, NULL, 0, NULL, NULL, 0, NULL, NULL, 0, NULL, NULL); file.endgroup(); } if(1){ t[0][0]=1; t[0][1]=0; t[0][2]=0; t[0][3]=0; t[1][0]=0; t[1][1]=1; t[1][2]=0; t[1][3]=0; t[2][0]=0; t[2][1]=0; t[2][2]=1; t[2][3]=1; t[3][0]=0; t[3][1]=0; t[3][2]=0; t[3][3]=1; file.begingroup("triangles_manymaterials",&grpopt,t); file.addTriangles(nP, P, nI, PI, materialGreen, 0, NULL, NULL, 0, NULL, NULL, 0, NULL, NULL, nM, M, MI); file.endgroup(); } if(1){ t[0][0]=1; t[0][1]=0; t[0][2]=0; t[0][3]=0; t[1][0]=0; t[1][1]=1; t[1][2]=0; t[1][3]=0; t[2][0]=0; t[2][1]=0; t[2][2]=1; t[2][3]=2; t[3][0]=0; t[3][1]=0; t[3][2]=0; t[3][3]=1; PRCmaterial materialBase( RGBAColour(0.1,0.1,0.1,1), RGBAColour(1,1,1,1), RGBAColour(0.1,0.1,0.1,1), RGBAColour(0.1,0.1,0.1,1), 1.0,0.1); C[0] = RGBAColour(1,0,0,0.1); C[1] = RGBAColour(0,1,0,0.5); C[2] = RGBAColour(0,0,1,0.9); file.begingroup("triangles_rgba_vertexcolors_on_opaque_a_component_of_vertexcolor_ignored",&grpopt,t); file.addTriangles(nP, P, nI, PI, materialBase, 0, NULL, NULL, 0, NULL, NULL, nC, C, CI, 0, NULL, NULL); file.endgroup(); t[0][0]=1; t[0][1]=0; t[0][2]=0; t[0][3]=0; t[1][0]=0; t[1][1]=1; t[1][2]=0; t[1][3]=0; t[2][0]=0; t[2][1]=0; t[2][2]=1; t[2][3]=3; t[3][0]=0; t[3][1]=0; t[3][2]=0; t[3][3]=1; PRCmaterial materialTransparent( RGBAColour(0.1,0.1,0.1,0.3), RGBAColour(1,1,1,0.3), RGBAColour(0.1,0.1,0.1,0.3), RGBAColour(0.1,0.1,0.1,0.3), 0.3,0.1); C[0] = RGBAColour(1,0,0,0.1); C[1] = RGBAColour(0,1,0,0.5); C[2] = RGBAColour(0,0,1,0.9); file.begingroup("triangles_rgba_vertexcolors_on_transparent_a_component_of_vertexcolor_ignored",&grpopt,t); file.addTriangles(nP, P, nI, PI, materialTransparent, 0, NULL, NULL, 0, NULL, NULL, nC, C, CI, 0, NULL, NULL); file.endgroup(); t[0][0]=1; t[0][1]=0; t[0][2]=0; t[0][3]=0; t[1][0]=0; t[1][1]=1; t[1][2]=0; t[1][3]=0; t[2][0]=0; t[2][1]=0; t[2][2]=1; t[2][3]=4; t[3][0]=0; t[3][1]=0; t[3][2]=0; t[3][3]=1; C[0] = RGBAColour(1,0,0,0.5); C[1] = RGBAColour(0,1,0,0.5); C[2] = RGBAColour(0,0,1,0.5); file.begingroup("triangles_rgb_vertexcolors_on_transparent_may_not_work_in_OpenGL",&grpopt,t); file.addTriangles(nP, P, nI, PI, materialTransparent, 0, NULL, NULL, 0, NULL, NULL, nC, C, CI, 0, NULL, NULL); file.endgroup(); } if(1){ t[0][0]=1; t[0][1]=0; t[0][2]=0; t[0][3]=0; t[1][0]=0; t[1][1]=1; t[1][2]=0; t[1][3]=0; t[2][0]=0; t[2][1]=0; t[2][2]=1; t[2][3]=5; t[3][0]=0; t[3][1]=0; t[3][2]=0; t[3][3]=1; const uint32_t picture_width=2; const uint32_t picture_height=2; const uint8_t picRGB[picture_width*picture_height*3] = {255,0,0, 0,255,0, 0,0,255, 0,0,0 }; // {255,255,0, 255,0,0, 255,0,0, 255,0,0 }; // { 255,0,0, 255,255,0, 255,255,0, 255,255,255 }; // {255,0,0, 0,255,0, 0,0,255, 0,0,0 }; const uint8_t picRGBA[picture_width*picture_height*4] = {255,0,0,255, 0,255,0,150, 0,0,255,150, 0,0,0,100 }; // (1,0) 2 3 (1,1) // (0,0) 0 1 (1,0) uint8_t *pictureRGB = new uint8_t[picture_width*picture_height*3]; for(size_t i=0; i \$opsymbolsFile, "runtime-base-file=s" => \$runtimeBaseFile, "src-template-dir=s" => \$srcTemplateDir, "prefix=s" => \$prefix, "header-out-dir=s" => \$headerOutDir, "src-out-dir=s" => \$srcOutDir ) || die("Argument error"); my $outHeaderFile = "$headerOutDir/$prefix.h"; my $outSrcFile = "$srcOutDir/$prefix.cc"; my $stack = "Stack"; my $errors = 0; sub report_error { my $filename = shift; my $line = shift; my $error = shift; print STDERR "$filename:$line: $error\n"; $errors = 1; } sub assoc_error { my $filename = shift; my $line = shift; my $type = shift; report_error($filename, $line, "no asy type associated to '$type'"); } sub clean_type { for (@_) { s/\s//g; } } sub clean_params { for (@_) { s/\n//g; } } my %type_map; sub read_types { my @types = split /\n/, shift; my $filename = shift; my $line = shift; for (@types) { ++$line; # Remove // comments. s/\/\/.*//g; # Skip blank lines. next if /^\s*$/; my ($type,$code) = m|(\w*(?:\s*\*)?) \s*=>\s* (.*) |x; if (not $type) { report_error($filename, $line, "bad type declaration"); } clean_type($type); $type_map{$type} = $code; } } # Scrape the symbol names of the operators from opsymbols.h. my %opsymbols = (); open(my $opsyms, $opsymbolsFile) || die("Couldn't open $opsymbolsFile"); while (<$opsyms>) { if (m/^OPSYMBOL\(\"(.*)\", ([A-Za-z_]+)\);/) { $opsymbols{ $1 } = $2; } } close($opsyms); # Turn a name into a symbol. sub symbolize { my $name = shift; if ($name =~ /^[A-Za-z0-9_]+$/) { return "SYM($name)"; } if ($opsymbols{ $name }) { return $opsymbols{ $name }; } if ($name =~ /operator (\w+)/ && $opsymbols{ $1 }) { return $opsymbols{ $1 } } return "symbol::trans(\"" . $name . "\")" } sub asy_params { my $params = shift; my @params = split m/,\s*/, $params; my $filename = shift; my $line = shift; for (@params) { my ($explicit, $type, $name, $default) = m|^\s* (explicit)*\s*(\w*(?:\s*\*)?) \s* (\w*)(=*)|xs; clean_type($type); if (not $type_map{$type}) { assoc_error($filename, $line, $type); } $_ = "formal(" . $type_map{$type} . ", " . symbolize(lc($name)) . ", " . ($default ? "true" : "false") . ", " . ($explicit ? "true" : "false") . ")"; } return @params; } sub c_params { my @params = @_; for (@params) { my ($explicit, $type, $name, $default, $value) = m|^\s* (explicit)*\s*(\w*(?:\s*\*)?) \s* (\w*)(=*)([\w.+\-]*)|xs; $_ = " $type $name=vm::pop" . ($type =~ /^item$/ ? "" : "<$type>") . "($stack" . ($default ? "," . $value : "") . ");\n"; } reverse @params; } $/ = "\f\n"; open STDIN, "<$srcTemplateDir/$prefix.in" or die "can't open input file $srcTemplateDir/$prefix.in"; open BASE, "<$runtimeBaseFile" or die "can't open $runtimeBaseFile"; open STDOUT, ">$outSrcFile" or die "can't open output file $outSrcFile"; binmode STDIN, ":unix:crlf"; binmode BASE, ":unix:crlf"; my $autogenerated= "/***** Autogenerated from $prefix.in; changes will be overwritten *****/\n\n"; my $basesource_line = 1; my $source_line = 1; print $autogenerated; print "#line $basesource_line \"$srcTemplateDir/runtimebase.in\"\n"; my $baseheader = ; print $baseheader; $basesource_line += ($baseheader =~ tr/\n//);; my $basesource_type_line = $basesource_line; print "#line $source_line \"$srcTemplateDir/$prefix.in\"\n"; my $header = <>; print $header; $source_line += ($header =~ tr/\n//);; my $source_type_line = $source_line; my $basetypes = ; $basesource_line += ($basetypes =~ tr/\n//);; my $types = <>; $source_line += ($types =~ tr/\n//);; print "#line $basesource_line \"$srcTemplateDir/runtimebase.in\"\n"; $baseheader = ; print $baseheader; $basesource_line += ($baseheader =~ tr/\n//);; print "#line $source_line \"$prefix.in\"\n"; $header = <>; print $header; $source_line += ($header =~ tr/\n//);; print "\n#ifndef NOSYM"; print "\n#include \"$prefix.symbols.h\"\n"; print "\n#endif"; print "\nnamespace run {\n"; read_types($basetypes, "runtimebase.in", $basesource_type_line); read_types($types, "$prefix.in", $source_type_line); ### Begining of `$prefix.h' my @header; push @header, $autogenerated; # TODO: Capitalize prefix push @header, "#pragma once\n"; push @header, "namespace run {\n"; my $count = 0; my @builtin; while (<>) { my ($comments,$type,$name,$cname,$params,$code) = m|^((?:\s*//[^\n]*\n)*) # comment lines \s* (\w*(?:\s*\*)?) # return type \s* ([^(:]*)\:*([^(]*) # function name \s* \(([\w\s*,=.+\-]*)\) # parameters \s* \{(.*)} # body |xs; if (not $type) { report_error("$prefix.in", $source_line, "bad function definition"); } if($cname) {push @header, "void $cname(vm::stack *);\n";} else {$cname="gen_$prefix${count}";} # Unique C++ function name clean_type($type); my @params = split m/,\s*/, $params; # Build addFunc call for asymptote if($name) { $name =~ s/Operator\s*//; if (not $type_map{$type}) { assoc_error("$prefix.in", $source_line, $type); } my @asy_params = asy_params($params, "$prefix.in", $source_line); push @builtin, "#line $source_line \"$srcTemplateDir/$prefix.in\"\n" . " addFunc(ve, run::" . $cname . ", " . $type_map{$type} . ", " . symbolize($name) . ( @params ? ", " . join(", ",@asy_params) : "" ) . ");\n"; } # Build REGISTER_BLTIN command for builtin functions which are not added to # the environment. if (not $name and $cname) { push @builtin, "#line $source_line \"$srcTemplateDir/$prefix.in\"\n" . " REGISTER_BLTIN(run::" . $cname . ',"' . $cname . '"' . ");\n"; } # Handle marshalling of values to/from stack my $qualifier = ($type eq "item" ? "" : "<$type>"); $code =~ s/\breturn ([^;]*);/{$stack->push$qualifier($1); return;}/g; my $args = join("",c_params(@params)); print $comments; my $ncomments = ($comments =~ tr/\n//); $source_line += $ncomments; print "#line $source_line \"$srcTemplateDir/$prefix.in\"\n"; my $prototype=$type . " " . $name . "(" . $params . ");"; my $nprototype = ($prototype =~ tr/\n//)+1; $source_line += $nprototype; if($name) { clean_params($prototype); print "// $prototype\n"; } print "void $cname(stack *"; if($type ne "void" or $params ne "") {print $stack;} print ")\n{\n$args"; print "#line $source_line \"$srcTemplateDir/$prefix.in\""; print "$code}\n\n"; $source_line -= $ncomments+$nprototype; $source_line += ($_ =~ tr/\n//); ++$count; } print "} // namespace run\n"; print "\nnamespace trans {\n\n"; print "void gen_${prefix}_venv(venv &ve)\n{\n"; print @builtin; print "}\n\n"; print "} // namespace trans\n"; ### End of `header.h' push @header, "}\n\n"; undef $/; my $orig_header = ""; my $HEADER; if (-e $outHeaderFile) { open $HEADER, "<", $outHeaderFile; $orig_header = <$HEADER>; close $HEADER; } my $new_header = join "", @header; if ($new_header ne $orig_header) { open $HEADER, ">", $outHeaderFile; print $HEADER $new_header; close $HEADER; } if ($errors) { unlink($outHeaderFile); unlink($outSrcFile); } exit($errors); asymptote-3.05/runbacktrace.in0000644000000000000000000000147715031566105015173 0ustar rootroot/***** * backtrace.in * Andy Hammerlindl 2009/07/28 * * Runtime functions for printing garbage collector backtraces. * *****/ // No extra types defined. // No extra code for .cc file. // Autogenerated routines: void generate_random_backtrace() { #if defined(USEGC) && defined(GC_DEBUG) && defined(GC_BACKTRACE) GC_generate_random_backtrace(); #else error("generate_random_backtrace() requires ./configure --enable-gc-debug"); #endif } void print_random_addresses(Int n=1) { #if defined(USEGC) && defined(GC_DEBUG) && defined(GC_BACKTRACE) GC_gcollect(); for (Int i=0; i < n; ++i) GC_debug_print_heap_obj_proc(GC_base(GC_generate_random_valid_address())); #else error("print_random_addresses() requires ./configure --enable-gc-debug"); unused(&n); // Avoid unused variable warning message. #endif } asymptote-3.05/builtin.cc0000644000000000000000000007554315031566105014161 0ustar rootroot/***** * builtin.cc * Tom Prince 2004/08/25 * * Initialize builtins. *****/ #include #include "builtin.h" #include "entry.h" #include "runtime.h" #include "runpicture.h" #include "runlabel.h" #include "runhistory.h" #include "runarray.h" #include "runfile.h" #include "runsystem.h" #include "runstring.h" #include "runpair.h" #include "runtriple.h" #include "runpath.h" #include "runpath3d.h" #include "runmath.h" #include "types.h" #include "castop.h" #include "mathop.h" #include "arrayop.h" #include "vm.h" #include "coder.h" #include "exp.h" #include "refaccess.h" #include "settings.h" #include "opsymbols.h" #ifndef NOSYM #include "builtin.symbols.h" #endif namespace vm { // Defined in stack.cc extern vm::vmFrame *make_dummyframe(string name); } using namespace types; using namespace camp; using namespace vm; namespace trans { using camp::transform; using camp::pair; using vm::bltin; using run::divide; using run::less; using run::greater; using run::plus; using run::minus; using namespace run; void gen_runtime_venv(venv &ve); void gen_runbacktrace_venv(venv &ve); void gen_runpicture_venv(venv &ve); void gen_runlabel_venv(venv &ve); void gen_runhistory_venv(venv &ve); void gen_runarray_venv(venv &ve); void gen_runfile_venv(venv &ve); void gen_runsystem_venv(venv &ve); void gen_runstring_venv(venv &ve); void gen_runpair_venv(venv &ve); void gen_runtriple_venv(venv &ve); void gen_runpath_venv(venv &ve); void gen_runpath3d_venv(venv &ve); void gen_runmath_venv(venv &ve); void gen_rungsl_venv(venv &ve); void addType(tenv &te, symbol name, ty *t) { te.enter(name, new tyEntry(t,0,0,nullPos)); } // The base environments for built-in types and functions void base_tenv(tenv &te) { #define PRIMITIVE(name,Name,asyName) \ addType(te, symbol::trans(#asyName), prim##Name()); #include "primitives.h" #undef PRIMITIVE } const formal noformal(0); function *functionFromFormals(ty *result, formal f1=noformal, formal f2=noformal, formal f3=noformal, formal f4=noformal, formal f5=noformal, formal f6=noformal, formal f7=noformal, formal f8=noformal, formal f9=noformal, formal fA=noformal, formal fB=noformal, formal fC=noformal, formal fD=noformal, formal fE=noformal, formal fF=noformal, formal fG=noformal, formal fH=noformal, formal fI=noformal) { function *fun = new function(result); if (f1.t) fun->add(f1); if (f2.t) fun->add(f2); if (f3.t) fun->add(f3); if (f4.t) fun->add(f4); if (f5.t) fun->add(f5); if (f6.t) fun->add(f6); if (f7.t) fun->add(f7); if (f8.t) fun->add(f8); if (f9.t) fun->add(f9); if (fA.t) fun->add(fA); if (fB.t) fun->add(fB); if (fC.t) fun->add(fC); if (fD.t) fun->add(fD); if (fE.t) fun->add(fE); if (fF.t) fun->add(fF); if (fG.t) fun->add(fG); if (fH.t) fun->add(fH); if (fI.t) fun->add(fI); return fun; } varEntry *addFunc(venv &ve, access *a, ty *result, symbol id, formal f1=noformal, formal f2=noformal, formal f3=noformal, formal f4=noformal, formal f5=noformal, formal f6=noformal, formal f7=noformal, formal f8=noformal, formal f9=noformal, formal fA=noformal, formal fB=noformal, formal fC=noformal, formal fD=noformal, formal fE=noformal, formal fF=noformal, formal fG=noformal, formal fH=noformal, formal fI=noformal) { function *fun = functionFromFormals(result,f1,f2,f3,f4,f5,f6,f7,f8,f9, fA,fB,fC,fD,fE,fF,fG,fH,fI); // NOTE: If the function is a field, we should encode the defining record in // the entry varEntry *ent = new varEntry(fun, a, 0, nullPos); ve.enter(id, ent); return ent; } // Add a function with one or more default arguments. varEntry *addFunc(venv &ve, bltin f, ty *result, symbol name, formal f1, formal f2, formal f3, formal f4, formal f5, formal f6, formal f7, formal f8, formal f9, formal fA, formal fB, formal fC, formal fD, formal fE, formal fF, formal fG, formal fH, formal fI) { #ifdef DEBUG_BLTIN // If the function is an operator, print out the whole signature with the // types, as operators are heavily overloaded. min and max are also heavily // overloaded, so we check for them too. Many builtin functions have so // many arguments that it is noise to print out their full signatures. string s = name; if (s.find("operator ", 0) == 0 || s == "min" || s == "max") { function *fun = functionFromFormals(result,f1,f2,f3,f4,f5,f6,f7,f8,f9, fA,fB,fC,fD,fE,fF,fG,fH,fI); ostringstream out; fun->printVar(out, name); REGISTER_BLTIN(f, out.str()); } else { REGISTER_BLTIN(f, name); } #endif access *a = new bltinAccess(f); return addFunc(ve,a,result,name,f1,f2,f3,f4,f5,f6,f7,f8,f9, fA,fB,fC,fD,fE,fF,fG,fH,fI); } void addOpenFunc(venv &ve, bltin f, ty *result, symbol name) { function *fun = new function(result, signature::OPEN); REGISTER_BLTIN(f, name); access *a= new bltinAccess(f); varEntry *ent = new varEntry(fun, a, 0, nullPos); ve.enter(name, ent); } // Add a rest function with zero or more default/explicit arguments. void addRestFunc(venv &ve, bltin f, ty *result, symbol name, formal frest, formal f1=noformal, formal f2=noformal, formal f3=noformal, formal f4=noformal, formal f5=noformal, formal f6=noformal, formal f7=noformal, formal f8=noformal, formal f9=noformal) { REGISTER_BLTIN(f, name); access *a = new bltinAccess(f); function *fun = new function(result); if (f1.t) fun->add(f1); if (f2.t) fun->add(f2); if (f3.t) fun->add(f3); if (f4.t) fun->add(f4); if (f5.t) fun->add(f5); if (f6.t) fun->add(f6); if (f7.t) fun->add(f7); if (f8.t) fun->add(f8); if (f9.t) fun->add(f9); if (frest.t) fun->addRest(frest); varEntry *ent = new varEntry(fun, a, 0, nullPos); ve.enter(name, ent); } void addRealFunc0(venv &ve, bltin fcn, symbol name) { addFunc(ve, fcn, primReal(), name); } template void addRealFunc(venv &ve, symbol name) { addFunc(ve, realReal, primReal(), name, formal(primReal(),SYM(x))); addFunc(ve, arrayFunc, realArray(), name, formal(realArray(),SYM(a))); } #define addRealFunc(fcn, sym) addRealFunc(ve, sym); void addRealFunc2(venv &ve, bltin fcn, symbol name) { addFunc(ve,fcn,primReal(),name,formal(primReal(),SYM(a)), formal(primReal(),SYM(b))); } template void realRealInt(vm::stack *s) { Int n = pop(s); double x = pop(s); s->push(func(x, intcast(n))); } template void addRealIntFunc(venv& ve, symbol name, symbol arg1, symbol arg2) { addFunc(ve, realRealInt, primReal(), name, formal(primReal(), arg1), formal(primInt(), arg2)); } void addInitializer(venv &ve, ty *t, access *a) { addFunc(ve, a, t, symbol::initsym); } void addInitializer(venv &ve, ty *t, bltin f) { #ifdef DEBUG_BLTIN ostringstream s; s << "initializer for " << *t; REGISTER_BLTIN(f, s.str()); #endif access *a = new bltinAccess(f); addInitializer(ve, t, a); } // Specifies that source may be cast to target, but only if an explicit // cast expression is used. void addExplicitCast(venv &ve, ty *target, ty *source, access *a) { addFunc(ve, a, target, symbol::ecastsym, source); } // Specifies that source may be implicitly cast to target by the // function or instruction stores at a. void addCast(venv &ve, ty *target, ty *source, access *a) { //addExplicitCast(target,source,a); addFunc(ve, a, target, symbol::castsym, source); } void addExplicitCast(venv &ve, ty *target, ty *source, bltin f) { #ifdef DEBUG_BLTIN ostringstream s; s << "explicit cast from " << *source << " to " << *target; REGISTER_BLTIN(f, s.str()); #endif addExplicitCast(ve, target, source, new bltinAccess(f)); } void addCast(venv &ve, ty *target, ty *source, bltin f) { #ifdef DEBUG_BLTIN ostringstream s; s << "cast from " << *source << " to " << *target; REGISTER_BLTIN(f, s.str()); #endif addCast(ve, target, source, new bltinAccess(f)); } template void addVariable(venv &ve, T *ref, ty *t, symbol name, record *module=settings::getSettingsModule()) { access *a = new refAccess(ref); varEntry *ent = new varEntry(t, a, PUBLIC, module, 0, nullPos); ve.enter(name, ent); } template void addVariable(venv &ve, T value, ty *t, symbol name, record *module=settings::getSettingsModule(), permission perm=PUBLIC) { item* ref=new item; *ref=value; access *a = new itemRefAccess(ref); varEntry *ent = new varEntry(t, a, perm, module, 0, nullPos); ve.enter(name, ent); } template void addConstant(venv &ve, T value, ty *t, symbol name, record *module=settings::getSettingsModule()) { addVariable(ve,value,t,name,module,RESTRICTED); } // The identity access, i.e. no instructions are encoded for a cast or // operation, and no functions are called. identAccess id; function *IntRealFunction() { return new function(primInt(),primReal()); } function *realPairFunction() { return new function(primReal(),primPair()); } function *voidFileFunction() { return new function(primVoid(),primFile()); } void addInitializers(venv &ve) { addInitializer(ve, primBoolean(), boolFalse); addInitializer(ve, primInt(), IntZero); addInitializer(ve, primReal(), realZero); addInitializer(ve, primString(), emptyString); addInitializer(ve, primPair(), pairZero); addInitializer(ve, primTriple(), tripleZero); addInitializer(ve, primTransform(), transformIdentity); addInitializer(ve, primGuide(), nullGuide); addInitializer(ve, primPath(), nullPath); addInitializer(ve, primPath3(), nullPath3); addInitializer(ve, primPen(), newPen); addInitializer(ve, primPicture(), newPicture); addInitializer(ve, primFile(), nullFile); } void addCasts(venv &ve) { addExplicitCast(ve, primString(), primInt(), stringCast); addExplicitCast(ve, primString(), primReal(), stringCast); addExplicitCast(ve, primString(), primPair(), stringCast); addExplicitCast(ve, primString(), primTriple(), stringCast); addExplicitCast(ve, primInt(), primString(), castString); addExplicitCast(ve, primReal(), primString(), castString); addExplicitCast(ve, primPair(), primString(), castString); addExplicitCast(ve, primTriple(), primString(), castString); addExplicitCast(ve, primInt(), primReal(), castDoubleInt); addCast(ve, primReal(), primInt(), cast); addCast(ve, primPair(), primInt(), cast); addCast(ve, primPair(), primReal(), cast); addCast(ve, primPath(), primPair(), cast); addCast(ve, primGuide(), primPair(), pairToGuide); addCast(ve, primGuide(), primPath(), pathToGuide); addCast(ve, primPath(), primGuide(), guideToPath); addCast(ve, primFile(), primNull(), nullFile); // Vectorized casts. addExplicitCast(ve, IntArray(), realArray(), arrayToArray); addCast(ve, realArray(), IntArray(), arrayToArray); addCast(ve, pairArray(), IntArray(), arrayToArray); addCast(ve, pairArray(), realArray(), arrayToArray); addCast(ve, realArray2(), IntArray2(), array2ToArray2); addCast(ve, pairArray2(), IntArray2(), array2ToArray2); addCast(ve, pairArray2(), realArray2(), array2ToArray2); } void addTupleOperators(venv &ve) { addFunc(ve, realRealToPair, primPair(), SYM_TUPLE, formal(primReal(), SYM(x)), formal(primReal(), SYM(y))); addFunc(ve, realRealRealToTriple, primTriple(), SYM_TUPLE, formal(primReal(), SYM(x)), formal(primReal(), SYM(y)), formal(primReal(), SYM(z))); addFunc(ve, real6ToTransform, primTransform(), SYM_TUPLE, formal(primReal(), SYM(x)), formal(primReal(), SYM(y)), formal(primReal(), SYM(xx)), formal(primReal(), SYM(xy)), formal(primReal(), SYM(yx)), formal(primReal(), SYM(yy))); } void addGuideOperators(venv &ve) { // The guide operators .. and -- take an array of guides, and turn them // into a single guide. addRestFunc(ve, dotsGuide, primGuide(), SYM_DOTS, guideArray()); addRestFunc(ve, dashesGuide, primGuide(), SYM_DASHES, guideArray()); } /* Avoid typing the same type three times. */ void addSimpleOperator(venv &ve, bltin f, ty *t, symbol name) { addFunc(ve,f,t,name,formal(t,SYM(a)),formal(t,SYM(b))); } void addBooleanOperator(venv &ve, bltin f, ty *t, symbol name) { addFunc(ve,f,primBoolean(),name,formal(t,SYM(a)),formal(t,SYM(b))); } template class op> void addArray2Array2Op(venv &ve, ty *t3, symbol name) { addFunc(ve,array2Array2Op,t3,name,formal(t3,SYM(a)),formal(t3,SYM(b))); } template class op> void addOpArray2(venv &ve, ty *t1, symbol name, ty *t3) { addFunc(ve,opArray2,t3,name,formal(t1,SYM(a)),formal(t3,SYM(b))); } template class op> void addArray2Op(venv &ve, ty *t1, symbol name, ty *t3) { addFunc(ve,array2Op,t3,name,formal(t3,SYM(a)),formal(t1,SYM(b))); } template class op> void addOps(venv &ve, ty *t1, symbol name, ty *t2) { addSimpleOperator(ve,binaryOp,t1,name); addFunc(ve,opArray,t2,name,formal(t1,SYM(a)),formal(t2,SYM(b))); addFunc(ve,arrayOp,t2,name,formal(t2,SYM(a)),formal(t1,SYM(b))); addSimpleOperator(ve,arrayArrayOp,t2,name); } template class op> void addBooleanOps(venv &ve, ty *t1, symbol name, ty *t2) { addBooleanOperator(ve,binaryOp,t1,name); addFunc(ve,opArray, booleanArray(),name,formal(t1,SYM(a)),formal(t2,SYM(b))); addFunc(ve,arrayOp, booleanArray(),name,formal(t2,SYM(a)),formal(t1,SYM(b))); addFunc(ve,arrayArrayOp,booleanArray(),name,formal(t2,SYM(a)), formal(t2,SYM(b))); } void addWrite(venv &ve, bltin f, ty *t1, ty *t2) { addRestFunc(ve,f,primVoid(),SYM(write),t2, formal(primFile(),SYM(file),true), formal(primString(),SYM(s),true), formal(t1,SYM(x)),formal(voidFileFunction(),SYM(suffix),true)); } template void addUnorderedOps(venv &ve, ty *t1, ty *t2, ty *t3, ty *t4) { addBooleanOps(ve,t1,SYM_EQ,t2); addBooleanOps(ve,t1,SYM_NEQ,t2); addFunc(ve, run::array2Equals, primBoolean(), SYM_EQ, formal(t3, SYM(a)), formal(t3, SYM(b))); addFunc(ve, run::array2NotEquals, primBoolean(), SYM_NEQ, formal(t3, SYM(a)), formal(t3, SYM(b))); addCast(ve,t1,primFile(),read); addCast(ve,t2,primFile(),readArray1); addCast(ve,t3,primFile(),readArray2); addCast(ve,t4,primFile(),readArray3); addWrite(ve,write,t1,t2); addRestFunc(ve,writeArray,primVoid(),SYM(write),t3, formal(primFile(),SYM(file),true), formal(primString(),SYM(s),true), formal(t2,SYM(a),false,true)); addFunc(ve,writeArray2,primVoid(),SYM(write), formal(primFile(),SYM(file),true),t3); addFunc(ve,writeArray3,primVoid(),SYM(write), formal(primFile(),SYM(file),true),t4); } inline double abs(pair z) { return z.length(); } inline double abs(triple v) { return v.length(); } inline pair conjugate(pair z) { return conj(z); } template inline T negate(T x) { return -x; } template class op> void addBinOps(venv &ve, ty *t1, ty *t2, ty *t3, ty *t4, symbol name) { addFunc(ve,binopArray,t1,name,formal(t2,SYM(a))); addFunc(ve,binopArray2,t1,name,formal(t3,SYM(a))); addFunc(ve,binopArray3,t1,name,formal(t4,SYM(a))); } template void addOrderedOps(venv &ve, ty *t1, ty *t2, ty *t3, ty *t4) { addBooleanOps(ve,t1,SYM_LT,t2); addBooleanOps(ve,t1,SYM_LE,t2); addBooleanOps(ve,t1,SYM_GE,t2); addBooleanOps(ve,t1,SYM_GT,t2); addOps(ve,t1,SYM(min),t2); addOps(ve,t1,SYM(max),t2); addBinOps(ve,t1,t2,t3,t4,SYM(min)); addBinOps(ve,t1,t2,t3,t4,SYM(max)); addFunc(ve,sortArray,t2,SYM(sort),formal(t2,SYM(a))); addFunc(ve,sortArray2,t3,SYM(sort),formal(t3,SYM(a))); addFunc(ve,searchArray,primInt(),SYM(search),formal(t2,SYM(a)), formal(t1,SYM(key))); } template void addBasicOps(venv &ve, ty *t1, ty *t2, ty *t3, ty *t4, bool integer=false, bool Explicit=false) { addOps(ve,t1,SYM_PLUS,t2); addOps(ve,t1,SYM_MINUS,t2); addFunc(ve,initialized,primBoolean(),SYM(initialized),formal(t1,SYM(a))); addArray2Array2Op(ve,t3,SYM_PLUS); addArray2Array2Op(ve,t3,SYM_MINUS); addFunc(ve,&id,t1,SYM_PLUS,formal(t1,SYM(a))); addFunc(ve,&id,t2,SYM_PLUS,formal(t2,SYM(a))); addFunc(ve,Negate,t1,SYM_MINUS,formal(t1,SYM(a))); addFunc(ve,arrayFunc,t2,SYM_MINUS,formal(t2,SYM(a))); addFunc(ve,arrayFunc2,t3,SYM_MINUS,formal(t3,SYM(a))); if(!integer) addFunc(ve,interp,t1,SYM(interp), formal(t1,SYM(a),false,Explicit), formal(t1,SYM(b),false,Explicit), formal(primReal(),SYM(t))); addFunc(ve,sumArray,t1,SYM(sum),formal(t2,SYM(a))); addUnorderedOps(ve,t1,t2,t3,t4); } template void addOps(venv &ve, ty *t1, ty *t2, ty *t3, ty *t4, bool integer=false, bool Explicit=false) { addBasicOps(ve,t1,t2,t3,t4,integer,Explicit); addOps(ve,t1,SYM_TIMES,t2); addOpArray2(ve,t1,SYM_TIMES,t3); addArray2Op(ve,t1,SYM_TIMES,t3); if(!integer) { addOps(ve,t1,SYM_DIVIDE,t2); addArray2Op(ve,t1,SYM_DIVIDE,t3); } addOps(ve,t1,SYM_CARET,t2); } // Adds standard functions for a newly added array type. void addArrayOps(venv &ve, types::array *t) { ty *ct = t->celltype; // Check for the alias function to see if these operation have already been // added, if they have, don't add them again. static types::function aliasType(primBoolean(), primVoid(), primVoid()); aliasType.sig.formals[0].t = t; aliasType.sig.formals[1].t = t; if (ve.lookByType(SYM(alias), &aliasType)) return; addFunc(ve, run::arrayAlias, primBoolean(), SYM(alias), formal(t, SYM(a)), formal(t, SYM(b))); size_t depth=(size_t) t->depth(); // Define an array constructor. This needs to know the depth of the array, // which may not be known at runtime. Therefore, the depth, which is known // here at compile-time, is pushed on the stack beforehand by use of a // thunk. callable *copyValueFunc = new thunk(new vm::bfunc(run::copyArrayValue),(Int) depth-1); addFunc(ve, new callableAccess(copyValueFunc), t, SYM(array), formal(primInt(), SYM(n)), formal(ct, SYM(value)), formal(primInt(), SYM(depth), true)); callable *copyFunc = new thunk(new vm::bfunc(run::copyArray),(Int) depth); addFunc(ve, new callableAccess(copyFunc), t, SYM(copy), formal(t, SYM(a)), formal(primInt(), SYM(depth), true)); addFunc(ve, run::arrayFunction, t, SYM(map), formal(new function(ct, ct), SYM(f)), formal(t, SYM(a))); addFunc(ve, run::arraySequence, t, SYM(sequence), formal(new function(ct, primInt()), SYM(f)), formal(primInt(), SYM(n))); addFunc(ve, run::arraySort, t, SYM(sort), formal(t, SYM(a)), formal(new function(primBoolean(), ct, ct), SYM(less)), formal(primBoolean(), SYM(stable), true)); switch (depth) { case 1: addRestFunc(ve, run::arrayConcat, t, SYM(concat), new types::array(t)); addFunc(ve, run::arraySearch, primInt(), SYM(search), formal(t, SYM(a)), formal(ct, SYM(key)), formal(new function(primBoolean(), ct, ct), SYM(less))); break; case 2: addFunc(ve, run::array2Transpose, t, SYM(transpose), formal(t, SYM(a))); break; case 3: addFunc(ve, run::array3Transpose, t, SYM(transpose), formal(t, SYM(a)), formal(IntArray(),SYM(perm))); break; default: break; } } void addRecordOps(record* r) { assert(r); trans::venv &ve = r->e.ve; auto addOp= [&ve](vm::bltin f, ty* result, symbol name, auto&&... formals) { varEntry* fVar= addFunc(ve, f, result, name, std::forward(formals)...); ve.registerAutoUnravel(name, fVar, AutounravelPriority::OFFER); }; // alias addOp(run::boolMemEq, primBoolean(), SYM(alias), formal(r, SYM(a)), formal(r, SYM(b))); // operator== addOp(run::boolMemEq, primBoolean(), SYM_EQ, formal(r, SYM(a)), formal(r, SYM(b))); // operator!= addOp(run::boolMemNeq, primBoolean(), SYM_NEQ, formal(r, SYM(a)), formal(r, SYM(b))); } void addOperators(venv &ve) { addSimpleOperator(ve,binaryOp,primString(),SYM_PLUS); addBooleanOps(ve,primBoolean(),SYM_AMPERSAND,booleanArray()); addBooleanOps(ve,primBoolean(),SYM_BAR,booleanArray()); addBooleanOps(ve,primBoolean(),SYM_CARET,booleanArray()); addUnorderedOps(ve,primBoolean(),booleanArray(),booleanArray2(), booleanArray3()); addOps(ve,primInt(),IntArray(),IntArray2(),IntArray3(),true); addOps(ve,primReal(),realArray(),realArray2(),realArray3()); addOps(ve,primPair(),pairArray(),pairArray2(),pairArray3(),false,true); addBasicOps(ve,primTriple(),tripleArray(),tripleArray2(), tripleArray3()); addFunc(ve,opArray,tripleArray(),SYM_TIMES, formal(primReal(),SYM(a)),formal(tripleArray(),SYM(b))); addFunc(ve,opArray2,tripleArray2(),SYM_TIMES, formal(primReal(),SYM(a)),formal(tripleArray2(),SYM(b))); addFunc(ve,arrayOp,tripleArray(),SYM_TIMES, formal(tripleArray(),SYM(a)),formal(primReal(),SYM(b))); addFunc(ve,array2Op,tripleArray2(),SYM_TIMES, formal(tripleArray2(),SYM(a)),formal(primReal(),SYM(b))); addFunc(ve,arrayOp,tripleArray(),SYM_DIVIDE, formal(tripleArray(),SYM(a)),formal(primReal(),SYM(b))); addUnorderedOps(ve,primString(),stringArray(),stringArray2(), stringArray3()); addSimpleOperator(ve,binaryOp,primPair(),SYM(minbound)); addSimpleOperator(ve,binaryOp,primPair(),SYM(maxbound)); addSimpleOperator(ve,binaryOp,primTriple(),SYM(minbound)); addSimpleOperator(ve,binaryOp,primTriple(),SYM(maxbound)); addBinOps(ve,primPair(),pairArray(),pairArray2(),pairArray3(), SYM(minbound)); addBinOps(ve,primPair(),pairArray(),pairArray2(),pairArray3(), SYM(maxbound)); addBinOps(ve,primTriple(),tripleArray(),tripleArray2(), tripleArray3(),SYM(minbound)); addBinOps(ve,primTriple(),tripleArray(),tripleArray2(), tripleArray3(),SYM(maxbound)); addFunc(ve,arrayFunc,realArray(),SYM(abs), formal(pairArray(),SYM(a))); addFunc(ve,arrayFunc,realArray(),SYM(abs), formal(tripleArray(),SYM(a))); addFunc(ve,arrayFunc,pairArray(),SYM(conj), formal(pairArray(),SYM(a))); addFunc(ve,arrayFunc2,pairArray2(),SYM(conj), formal(pairArray2(),SYM(a))); addFunc(ve,binaryOp,primReal(),SYM_DIVIDE, formal(primInt(),SYM(a)),formal(primInt(),SYM(b))); addFunc(ve,arrayOp,realArray(),SYM_DIVIDE, formal(IntArray(),SYM(a)),formal(primInt(),SYM(b))); addFunc(ve,opArray,realArray(),SYM_DIVIDE, formal(primInt(),SYM(a)),formal(IntArray(),SYM(b))); addFunc(ve,arrayArrayOp,realArray(),SYM_DIVIDE, formal(IntArray(),SYM(a)),formal(IntArray(),SYM(b))); addOrderedOps(ve,primInt(),IntArray(),IntArray2(),IntArray3()); addOrderedOps(ve,primReal(),realArray(),realArray2(),realArray3()); addOrderedOps(ve,primString(),stringArray(),stringArray2(), stringArray3()); addOps(ve,primInt(),SYM_MOD,IntArray()); addOps(ve,primInt(),SYM_QUOTIENT,IntArray()); addOps(ve,primReal(),SYM_MOD,realArray()); addRestFunc(ve,diagonal,IntArray2(),SYM(diagonal),IntArray()); addRestFunc(ve,diagonal,realArray2(),SYM(diagonal),realArray()); addRestFunc(ve,diagonal,pairArray2(),SYM(diagonal),pairArray()); } dummyRecord *createDummyRecord(venv &ve, symbol name) { dummyRecord *r=new dummyRecord(name); vm::vmFrame *f = make_dummyframe(name); addConstant(ve, f, r, name); addRecordOps(r); return r; } double identity(double x) {return x;} double pow10(double x) {return run::pow(10.0,x);} // An example of an open function. #ifdef OPENFUNCEXAMPLE void openFunc(stack *Stack) { vm::array *a=vm::pop(Stack); size_t numArgs=checkArray(a); for (size_t k=0; kpush((Int)numArgs); } #endif // A function accessible in asy code print the bytecode of a function. void printBytecode(stack *Stack) { // As arbitrary addresses can be sent to printBytecode, it should not be run // in safe mode. if (settings::safe) { cerr << "use -nosafe flag to enable printBytecode" << endl; return; } vm::array *a=vm::pop(Stack); size_t numArgs=checkArray(a); if (numArgs != 1) cerr << "printBytecode takes one argument" << endl; // TODO: Add a reliable test for the object being a func. callable *c = a->read(0); if (func *f = dynamic_cast(c)) print(cout, f->body->code); else cout << "callable is not a standard function"; } // NOTE: We should move all of these into a "builtin" module. void base_venv(venv &ve) { // Register the name of arrayDeleteHelper for debugging in "asy -s" mode. // This is done automatically for other function, but because // arrayDeleteHelper is not defined in the usual way, it must be done // explicitly, and here is as good a place as any. REGISTER_BLTIN(arrayDeleteHelper, "arrayDeleteHelper"); addInitializers(ve); addCasts(ve); addOperators(ve); addTupleOperators(ve); addGuideOperators(ve); addRealFunc(sin,SYM(sin)); addRealFunc(cos,SYM(cos)); addRealFunc(tan,SYM(tan)); addRealFunc(asin,SYM(asin)); addRealFunc(acos,SYM(acos)); addRealFunc(atan,SYM(atan)); addRealFunc(exp,SYM(exp)); addRealFunc(log,SYM(log)); addRealFunc(log10,SYM(log10)); addRealFunc(sinh,SYM(sinh)); addRealFunc(cosh,SYM(cosh)); addRealFunc(tanh,SYM(tanh)); addRealFunc(asinh,SYM(asinh)); addRealFunc(acosh,SYM(acosh)); addRealFunc(atanh,SYM(atanh)); addRealFunc(sqrt,SYM(sqrt)); addRealFunc(cbrt,SYM(cbrt)); addRealFunc(fabs,SYM(fabs)); addRealFunc(ve,SYM(abs)); addRealFunc(expm1,SYM(expm1)); addRealFunc(log1p,SYM(log1p)); addRealIntFunc(ve, SYM(ldexp), SYM(x), SYM(e)); addRealFunc(pow10,SYM(pow10)); addRealFunc(identity,SYM(identity)); #ifdef STRUCTEXAMPLE dummyRecord *fun=createDummyRecord(ve, SYM(test)); addFunc(fun->e.ve,realReal,primReal(),SYM(f),formal(primReal(),SYM(x))); addVariable(fun->e.ve,1,primInt(),SYM(x)); #endif addFunc(ve,writestring,primVoid(),SYM(write), formal(primFile(),SYM(file),true), formal(primString(),SYM(s)), formal(voidFileFunction(),SYM(suffix),true)); addWrite(ve,write,primTransform(),transformArray()); addWrite(ve,write,primGuide(),guideArray()); addWrite(ve,write,primPen(),penArray()); addFunc(ve,arrayArrayOp,booleanArray(),SYM_EQ, formal(penArray(),SYM(a)),formal(penArray(),SYM(b))); addFunc(ve,arrayArrayOp,booleanArray(),SYM_NEQ, formal(penArray(),SYM(a)),formal(penArray(),SYM(b))); addFunc(ve,arrayFunction,realArray(),SYM(map), formal(realPairFunction(),SYM(f)), formal(pairArray(),SYM(a))); addFunc(ve,arrayFunction,IntArray(),SYM(map), formal(IntRealFunction(),SYM(f)), formal(realArray(),SYM(a))); addConstant(ve, Int_MAX, primInt(), SYM(intMax)); addConstant(ve, Int_MIN, primInt(), SYM(intMin)); addConstant(ve, HUGE_VAL, primReal(), SYM(inf)); addConstant(ve, run::infinity, primReal(), SYM(infinity)); addConstant(ve, nan(""), primReal(), SYM(nan)); addConstant(ve, DBL_MAX, primReal(), SYM(realMax)); addConstant(ve, DBL_MIN, primReal(), SYM(realMin)); addConstant(ve, DBL_EPSILON, primReal(), SYM(realEpsilon)); addConstant(ve, DBL_DIG, primInt(), SYM(realDigits)); addConstant(ve, Int_MAX, primInt(), SYM(randMax)); addConstant(ve, PI, primReal(), SYM(pi)); addConstant(ve, string(REVISION),primString(),SYM(VERSION)); addVariable(ve, &processData().currentpen, primPen(), SYM(currentpen)); #ifdef OPENFUNCEXAMPLE addOpenFunc(ve, openFunc, primInt(), SYM(openFunc)); #endif addOpenFunc(ve, printBytecode, primVoid(), SYM(printBytecode)); gen_runtime_venv(ve); gen_runbacktrace_venv(ve); gen_runpicture_venv(ve); gen_runlabel_venv(ve); gen_runhistory_venv(ve); gen_runarray_venv(ve); gen_runfile_venv(ve); gen_runsystem_venv(ve); gen_runstring_venv(ve); gen_runpair_venv(ve); gen_runtriple_venv(ve); gen_runpath_venv(ve); gen_runpath3d_venv(ve); gen_runmath_venv(ve); #ifdef HAVE_LIBGSL gen_rungsl_venv(ve); #endif } } //namespace trans namespace run { double infinity=cbrt(DBL_MAX); // Reduced for tension atleast infinity void arrayDeleteHelper(stack *Stack) { array *a=pop(Stack); item itj=pop(Stack); bool jdefault=isdefault(itj); item iti=pop(Stack); Int i,j; if(isdefault(iti)) { if(jdefault) { (*a).clear(); return; } else i=j=get(itj); } else { i=get(iti); j=jdefault ? i : get(itj); } size_t asize=checkArray(a); if(a->cyclic() && asize > 0) { if(j-i+1 >= (Int) asize) { (*a).clear(); return; } i=imod(i,asize); j=imod(j,asize); if(j >= i) (*a).erase((*a).begin()+i,(*a).begin()+j+1); else { (*a).erase((*a).begin()+i,(*a).end()); (*a).erase((*a).begin(),(*a).begin()+j+1); } return; } if(i < 0 || i >= (Int) asize || i > j || j >= (Int) asize) { ostringstream buf; buf << "delete called on array of length " << (Int) asize << " with out-of-bounds index range [" << i << "," << j << "]"; error(buf); } (*a).erase((*a).begin()+i,(*a).begin()+j+1); } // Used by coder to optimize conditional jumps. const bltin intLess = binaryOp; const bltin intGreater = binaryOp; } asymptote-3.05/lexical.h0000644000000000000000000000052615031566105013763 0ustar rootroot#ifndef __lexical_h__ #define __lexical_h__ 1 #include #include "common.h" namespace lexical { class bad_cast {}; template T cast(const string& s, bool tolerant=false) { istringstream is(s); T value; if(is && is >> value && ((is >> std::ws).eof() || tolerant)) return value; throw bad_cast(); } } #endif asymptote-3.05/callable.h0000644000000000000000000000315215031566105014077 0ustar rootroot/***** * callable.h * Tom Prince 2005/06/19 * * Runtime representation of functions. *****/ #ifndef CALLABLE_H #define CALLABLE_H #include "common.h" #include "item.h" #include "inst.h" namespace vm { class stack; typedef void (*bltin)(stack *s); struct callable : public gc { virtual void call(stack *) = 0; virtual ~callable(); virtual bool compare(callable*) { return false; } // For debugging: virtual void print(ostream& out) = 0; }; class nullfunc : public callable { private: nullfunc() {} static nullfunc func; public: virtual void call (stack*); virtual bool compare(callable*); static callable* instance() { return &func; } void print(ostream& out); }; // How a function reference to a non-builtin function is stored. struct func : public callable { lambda *body; vmFrame *closure; func () : body(), closure() {} virtual void call (stack*); virtual bool compare(callable*); void print(ostream& out); }; class bfunc : public callable { public: bfunc(bltin b) : func(b) {} virtual void call (stack *s) { func(s); } virtual bool compare(callable*); void print(ostream& out); private: bltin func; }; class thunk : public callable { public: thunk(callable *f, item i) : func(f), arg(i) {} virtual void call (stack*); void print(ostream& out); private: callable *func; item arg; }; inline ostream& operator<< (ostream& out, callable &c) { c.print(out); return out; } } // namespace vm GC_DECLARE_PTRFREE(vm::nullfunc); // I believe this is safe, as pointers to C++ functions do not point to // the heap. GC_DECLARE_PTRFREE(vm::bfunc); #endif // CALLABLE_H asymptote-3.05/lspserv.h0000644000000000000000000001472215031566105014043 0ustar rootroot#pragma once #include "LibLsp/lsp/ProtocolJsonHandler.h" #include "LibLsp/lsp/AbsolutePath.h" #include "LibLsp/JsonRpc/Endpoint.h" #include "LibLsp/JsonRpc/TcpServer.h" #include "LibLsp/JsonRpc/Condition.h" // header for requests #include "LibLsp/lsp/textDocument/hover.h" #include "LibLsp/lsp/general/initialize.h" #include "LibLsp/lsp/general/shutdown.h" #include "LibLsp/lsp/textDocument/declaration_definition.h" #include "LibLsp/lsp/textDocument/colorPresentation.h" //header for notifs #include "LibLsp/lsp/general/exit.h" #include "LibLsp/lsp/general/initialized.h" #include "LibLsp/lsp/textDocument/did_open.h" #include "LibLsp/lsp/textDocument/did_change.h" #include "LibLsp/lsp/textDocument/did_save.h" #include "LibLsp/lsp/textDocument/did_close.h" #include "LibLsp/JsonRpc/stream.h" #include "common.h" #include "symbolmaps.h" //everything else #include #include #include namespace absyntax { class block; } namespace AsymptoteLsp { class istream : public lsp::base_istream { public: istream(std::istream& ist) : lsp::base_istream(ist) { } std::string what() override { return "AsymptoteLSP_istream"; } }; class ostream : public lsp::base_ostream { public: ostream(std::ostream& ost) : lsp::base_ostream(ost) { } std::string what() override { return "AsymptoteLSP_ostream"; } }; template inline optional, optional>> opt_left(TLeft const& opt) { return make_optional(std::make_pair(optional(opt), optional())); } template inline optional, optional>> opt_right(TRight const& opt) { return make_optional(std::make_pair(optional(), optional(opt))); } TextDocumentHover::Either fromString(std::string const &str); TextDocumentHover::Either fromMarkedStr(lsMarkedString const& markedString); TextDocumentHover::Either fromMarkedStr(std::string const& str, std::string const& language="asymptote"); TextDocumentHover::Either fromMarkedStr(std::vector const& stringList, std::string const& language="asymptote"); #if defined(LINUX_SYSTEM) // these functions have no use for apple or windows builds std::string wslDos2Unix(std::string const& dosPath); std::string wslUnix2Dos(std::string const& unixPath); #endif std::string getDocIdentifierRawPath(lsTextDocumentIdentifier const&); typedef std::unordered_map> SymContextFilemap; class LspLog: public lsp::Log { public: void log(Level level, std::string&& msg) override; void log(Level level, const std::string& msg) override; void log(Level level, std::wstring&& msg) override; void log(Level level, const std::wstring& msg) override; }; class AsymptoteLspServer { public: AsymptoteLspServer(shared_ptr const& jsonHandler, shared_ptr const& endpoint, LspLog& log); AsymptoteLspServer(RemoteEndPoint* remoteEndPt, shared_ptr const& jsonHandler, shared_ptr const& endpoint, LspLog& log); virtual ~AsymptoteLspServer(); // copy constructors + copy assignment op AsymptoteLspServer(AsymptoteLspServer& sv) = delete; AsymptoteLspServer& operator=(AsymptoteLspServer const& sv) = delete; // move constructors and move assignment op AsymptoteLspServer(AsymptoteLspServer&& sv) = delete; AsymptoteLspServer& operator=(AsymptoteLspServer&& sv) = delete; virtual void start(); void startIO(std::istream& in=cin, std::ostream& out=cout); protected: td_hover::response handleHoverRequest(td_hover::request const&); virtual td_initialize::response handleInitailizeRequest(td_initialize::request const&); virtual td_shutdown::response handleShutdownRequest(td_shutdown::request const&); td_definition::response handleDefnRequest(td_definition::request const&); td_documentColor::response handleDocColorRequest(td_documentColor::request const&); td_colorPresentation::response handleColorPresRequest(td_colorPresentation::request const&); virtual void onInitialized(Notify_InitializedNotification::notify& notify); virtual void onExit(Notify_Exit::notify& notify); void onChange(Notify_TextDocumentDidChange::notify& notify); void onOpen(Notify_TextDocumentDidOpen::notify& notify); void onSave(Notify_TextDocumentDidSave::notify& notify); void onClose(Notify_TextDocumentDidClose::notify& notify); void generateMissingTrees(std::string const& inputFile); void initializeRequestFn(); void initializeNotifyFn(); void reloadFile(std::string const&); void updateFileContentsTable(std::string const& filename); void updateFileContentsTable(std::string const& filename, std::istream& in); // logging functions void log(lsp::Log::Level const& level, std::string const& message); void logInfo(std::string const& message); void logWarning(std::string const& message); void logError(std::string const& message); SymbolContext* reloadFileRaw(std::string const&, bool const& fillTree=true); SymbolContext* fromRawPath(lsTextDocumentIdentifier const& identifier); SymbolContext* reloadFileRaw(absyntax::block* blk, std::string const& rawPath, bool const& fillTree=true); virtual void clearVariables(); Condition serverClosed; private: unique_ptr internalREP; protected: // [owned, ptr] RemoteEndPoint* const remoteEndPoint; private: shared_ptr pjh; shared_ptr ep; SymbolContext* plainCtx=NULL; LspLog& _log; unique_ptr symmapContextsPtr; unique_ptr>> fileContentsPtr; std::string plainFile; }; class TCPAsymptoteLSPServer : public lsp::TcpServer, public AsymptoteLspServer { public: TCPAsymptoteLSPServer( std::string const& addr, std::string const& port, shared_ptr const& jsonHandler, shared_ptr const& endpoint, LspLog& log); ~TCPAsymptoteLSPServer() override; protected: void start() override; Condition serverInitialized; }; } asymptote-3.05/asy-list.py0000644000000000000000000001246415031566105014314 0ustar rootroot#!/usr/bin/env python3 ##### # asy-list.py # # Build asy-keywords.el from a list of Asymptote global functions and # variables. This script reads definitions from 'camp.l' and writes Emacs Lisp # code to 'asy-keywords.el'. # ##### import argparse import re import textwrap parser = argparse.ArgumentParser() parser.add_argument( "--asy-list-file", type=str, required=True, help="Path to the asy list file" ) parser.add_argument("--revision", type=str, required=True, help="Revision identifier") parser.add_argument( "--output-file", type=str, required=True, help="Path to output file" ) args = parser.parse_args() # Open the file 'asy-keywords.el' for writing. with open(args.output_file, "w", encoding="utf-8") as keywords: # Write header information to 'asy-keywords.el'. # This includes comments and the definition of 'asy-keywords-version' using a # command-line argument. keywords.write( textwrap.dedent( f"""\ ;; ;; This file is automatically generated by asy-list.py. ;; Changes will be overwritten. ;; (defvar asy-keywords-version "{args.revision}") """ ) ) # Define a function 'add' that adds a keyword to the output file. def add(keyword): keywords.write(keyword + " ") # Write the beginning of the Emacs Lisp definition for 'asy-keyword-name'. keywords.write("(defvar asy-keyword-name '(\n") # Open the file 'camp.l' for reading. with open("camp.l", "r", encoding="utf-8") as camp: # Read lines from 'camp.l' until reaching a line that contains only '%%'. for line in camp: if re.search(r"^%%\s*$", line): break # Continue reading lines from 'camp.l' after the '%%' line. for line in camp: if re.search(r"^%%\s*$", line): # Exit the loop when a second '%%' line is found, indicating the end of # the section. break # Match lines that start with a word (the keyword) followed by optional # whitespace and a '{'. match = re.search(r"^(\w+)\s*\{", line) if match: # Write the keyword followed by a space. keywords.write(match.group(1) + " ") # Open an input file specified in the command-line arguments. with open(args.asy_list_file, "r", encoding="utf-8") as asylist: # Lists to store types, functions, and variables found in the file. types = [] # List to hold data types. functions = [] # List to hold function names. variables = [] # List to hold variable names. # Read each line from the file handle asylist. for line in asylist: # Match lines that define functions. # The pattern looks for: # - An optional word (\w*) representing the return type. # - Any number of non-space characters ([^ ]*), which may include # modifiers. # - A space character. # - Capture the function name (\w*). # - An opening parenthesis '(', indicating the start of the parameter # list. matchFun = re.search(r"^(\w*)[^ ]* (\w*)\(", line) if matchFun: types.append(matchFun.group(1)) functions.append(matchFun.group(2)) # Match lines that declare variables. # The pattern looks for: # - Any non-space characters before a space ([^ ]*), representing the # type. # - A space character. # - Capture the variable name (\w*). # - A semicolon ';', indicating the end of the declaration. matchVarDec = re.search(r"^([^ ]*) (\w*);", line) if matchVarDec: variables.append(matchVarDec.group(2)) # Remove duplicates and sort the lists. types = sorted(set(types)) functions = sorted(set(functions)) variables = sorted(set(variables)) # Write the closing parentheses for the 'asy-keyword-name' definition in the # output file. keywords.write("))\n\n") # Write the beginning of the 'asy-type-name' definition to the output file. keywords.write("(defvar asy-type-name '(\n") # Write each type from types to the output file. for t in types: keywords.write(t + " ") # Write the type followed by a space. # Write the closing parentheses for the 'asy-type-name' definition. keywords.write("))\n\n") # Write the beginning of the 'asy-function-name' definition to the output # file. keywords.write("(defvar asy-function-name '(\n") # Write each function name from functions to the output file. for f in functions: keywords.write(f + " ") # Write the function name followed by a space. # Write the closing parentheses for the 'asy-function-name' definition. keywords.write("))\n\n") # Write the beginning of the 'asy-variable-name' definition to the output # file. keywords.write("(defvar asy-variable-name '(\n") # Write each variable name from variables to the output file. for v in variables: keywords.write(v + " ") # Write the variable name followed by a space. # Write the closing parentheses for the 'asy-variable-name' definition. keywords.write("))\n") asymptote-3.05/drawverbatim.h0000644000000000000000000000236215031566105015031 0ustar rootroot/***** * drawverbatim.h * John Bowman 2003/03/18 * * Add verbatim postscript to picture. *****/ #ifndef DRAWVERBATIM_H #define DRAWVERBATIM_H #include "drawelement.h" namespace camp { enum Language {PostScript,TeX}; class drawVerbatim : public drawElement { private: Language language; string text; bool userbounds; pair min,max; bool havebounds; public: drawVerbatim(Language language, const string& text) : language(language), text(text), userbounds(false), havebounds(false) {} drawVerbatim(Language language, const string& text, pair min, pair max) : language(language), text(text), userbounds(true), min(min), max(max), havebounds(false) {} virtual ~drawVerbatim() {} void bounds(bbox& b, iopipestream& tex, boxvector&, bboxlist&) { if(havebounds) return; havebounds=true; if(language == TeX) tex << text << "%" << newl; if(userbounds) { b += min; b += max; } } bool islabel() { return language == TeX; } bool draw(psfile *out) { if(language == PostScript) out->verbatimline(text); return true; } bool write(texfile *out, const bbox&) { if(language == TeX) out->verbatimline(stripblanklines(text)); return true; } }; } #endif asymptote-3.05/record.cc0000644000000000000000000000323715031566105013760 0ustar rootroot/***** * record.cc * Tom Prince 2004/07/15 * * The type for records and modules in the language. *****/ #include "record.h" #include "inst.h" #include "runtime.h" #include "coder.h" namespace types { record::record(symbol name, frame *level) : ty(ty_record), name(name), level(level), init(new vm::lambda), e() { assert(init); #ifdef DEBUG_FRAME init->name = "struct "+string(name); #endif } record::~record() {} record *record::newRecord(symbol id, bool statically) { frame *underlevel = getLevel(statically); assert(underlevel); frame *level = new frame(id, underlevel, 0); record *r = new record(id, level); return r; } // Initialize to null by default. trans::access *record::initializer() { static trans::bltinAccess a(run::pushNullRecord); return &a; } dummyRecord::dummyRecord(symbol name) : record(name, new frame(name, 0,0)) { // Encode the instructions to put an placeholder instance of the record // on the stack. trans::coder c(nullPos, this, 0); c.closeRecord(); } dummyRecord::dummyRecord(string s) : record (symbol::trans(s), new frame(s,0,0)) { // Encode the instructions to put an placeholder instance of the record // on the stack. trans::coder c(nullPos, this, 0); c.closeRecord(); } void dummyRecord::add(string name, ty *t, trans::access *a, trans::permission perm) { e.addVar(symbol::trans(name), new trans::varEntry(t, a, perm, this, this, nullPos)); } void dummyRecord::add(string name, function *t, vm::bltin f, trans::permission perm) { REGISTER_BLTIN(f, name); add(name, t, new trans::bltinAccess(f), perm); } } // namespace types asymptote-3.05/runpath.in0000644000000000000000000002036715031566105014207 0ustar rootroot/***** * runpath.in * * Runtime functions for path operations. * *****/ pen => primPen() pair => primPair() path => primPath() transform => primTransform() realarray* => realArray() realarray2* => realArray2() patharray* => pathArray() penarray* => penArray() #include "path.h" #include "arrayop.h" #include "predicates.h" using namespace camp; using namespace vm; typedef array realarray; typedef array realarray2; typedef array patharray; using types::realArray; using types::realArray2; using types::pathArray; Int windingnumber(array *p, camp::pair z) { size_t size=checkArray(p); Int count=0; for(size_t i=0; i < size; i++) count += read(p,i)->windingnumber(z); return count; } // Autogenerated routines: path :nullPath() { return nullpath; } bool ==(path a, path b) { return a == b; } bool !=(path a, path b) { return !(a == b); } pair point(path p, Int t) { return p.point((Int) t); } pair point(path p, real t) { return p.point(t); } pair precontrol(path p, Int t) { return p.precontrol((Int) t); } pair precontrol(path p, real t) { return p.precontrol(t); } pair postcontrol(path p, Int t) { return p.postcontrol((Int) t); } pair postcontrol(path p, real t) { return p.postcontrol(t); } pair dir(path p, Int t, Int sign=0, bool normalize=true) { return p.dir(t,sign,normalize); } pair dir(path p, real t, bool normalize=true) { return p.dir(t,normalize); } pair accel(path p, Int t, Int sign=0) { return p.accel(t,sign); } pair accel(path p, real t) { return p.accel(t); } real radius(path p, real t) { pair v=p.dir(t,false); pair a=p.accel(t); real d=dot(a,v); real v2=v.abs2(); real a2=a.abs2(); real denom=v2*a2-d*d; real r=v2*sqrt(v2); return denom > 0 ? r/sqrt(denom) : 0.0; } path reverse(path p) { return p.reverse(); } path subpath(path p, Int a, Int b) { return p.subpath((Int) a, (Int) b); } path subpath(path p, real a, real b) { return p.subpath(a,b); } path nurb(pair z0, pair z1, pair z2, pair z3, real w0, real w1, real w2, real w3, Int m) { return nurb(z0,z1,z2,z3,w0,w1,w2,w3,m); } Int length(path p) { return p.length(); } bool cyclic(path p) { return p.cyclic(); } bool straight(path p, Int t) { return p.straight(t); } path unstraighten(path p) { return p.unstraighten(); } bool piecewisestraight(path p) { return p.piecewisestraight(); } real arclength(path p) { return p.arclength(); } real arclength(pair z0, pair c0, pair c1, pair z1) { return arcLength(z0,c0,c1,z1); } real arctime(path p, real L) { return p.arctime(L); } real dirtime(path p, pair z) { return p.directiontime(z); } realarray* intersect(path p, path q, real fuzz=-1) { bool exact=fuzz <= 0.0; if(fuzz < 0) fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())), ::max(length(q.max()),length(q.min()))); std::vector S,T; real s,t; if(intersections(s,t,S,T,p,q,fuzz,true,exact)) { array *V=new array(2); (*V)[0]=s; (*V)[1]=t; return V; } return new array(0); } realarray2* intersections(path p, path q, real fuzz=-1) { bool exact=fuzz <= 0.0; if(fuzz < 0.0) fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())), ::max(length(q.max()),length(q.min()))); real s,t; std::vector S,T; intersections(s,t,S,T,p,q,fuzz,false,true); size_t n=S.size(); if(n == 0 && !exact) { if(intersections(s,t,S,T,p,q,fuzz,true,false)) { array *V=new array(1); array *Vi=new array(2); (*V)[0]=Vi; (*Vi)[0]=s; (*Vi)[1]=t; return V; } } array *V=new array(n); for(size_t i=0; i < n; ++i) { array *Vi=new array(2); (*V)[i]=Vi; (*Vi)[0]=S[i]; (*Vi)[1]=T[i]; } stable_sort(V->begin(),V->end(),run::compare2()); return V; } realarray* intersections(path p, explicit pair a, explicit pair b, real fuzz=-1) { if(fuzz < 0) fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())), ::max(length(a),length(b))); std::vector S; intersections(S,p,a,b,fuzz); sort(S.begin(),S.end()); size_t n=S.size(); array *V=new array(n); for(size_t i=0; i < n; ++i) (*V)[i]=S[i]; return V; } // Return the intersection point of the extensions of the line segments // PQ and pq. pair extension(pair P, pair Q, pair p, pair q) { pair ac=P-Q; pair bd=q-p; real det=ac.getx()*bd.gety()-ac.gety()*bd.getx(); if(det == 0) return pair(infinity,infinity); return P+((p.getx()-P.getx())*bd.gety()-(p.gety()-P.gety())*bd.getx())*ac/det; } Int size(path p) { return p.size(); } path &(path p, path q) { return camp::concat(p,q); } pair min(explicit path p) { return p.min(); } pair max(explicit path p) { return p.max(); } Int size(patharray *p) { size_t size=checkArray(p); Int count=0; for (size_t i = 0; i < size; i++) count += read(p,i)->size(); return count; } pair min(patharray *p) { size_t size=checkArray(p); if(size == 0) error(nopoints); path *g = p->read(0); pair z = g->min(); double minx = z.getx(), miny = z.gety(); for (size_t i = 1; i < size; ++i) { path *g = p->read(i); pair z = g->min(); double x = z.getx(), y = z.gety(); if (x < minx) minx = x; if (y < miny) miny = y; } return pair(minx, miny); } pair max(patharray *p) { size_t size=checkArray(p); if(size == 0) error(nopoints); path *g = p->read(0); pair z = g->max(); double maxx = z.getx(), maxy = z.gety(); for (size_t i = 1; i < size; ++i) { path *g = p->read(i); pair z = g->max(); double x = z.getx(), y = z.gety(); if (x > maxx) maxx = x; if (y > maxy) maxy = y; } return pair(maxx, maxy); } pair minAfterTransform(transform t, patharray *p) { size_t size=checkArray(p); if(size == 0) error(nopoints); path g = p->read(0)->transformed(t); pair z = g.min(); double minx = z.getx(), miny = z.gety(); for (size_t i = 1; i < size; ++i) { path g = p->read(i)->transformed(t); pair z = g.min(); double x = z.getx(), y = z.gety(); if (x < minx) minx = x; if (y < miny) miny = y; } return pair(minx, miny); } pair maxAfterTransform(transform t, patharray *p) { size_t size=checkArray(p); if(size == 0) error(nopoints); path g = p->read(0)->transformed(t); pair z = g.max(); double maxx = z.getx(), maxy = z.gety(); for (size_t i = 1; i < size; ++i) { path g = p->read(i)->transformed(t); pair z = g.max(); double x = z.getx(), y = z.gety(); if (x > maxx) maxx = x; if (y > maxy) maxy = y; } return pair(maxx, maxy); } realarray *mintimes(path p) { array *V=new array(2); pair z=p.mintimes(); (*V)[0]=z.getx(); (*V)[1]=z.gety(); return V; } realarray *maxtimes(path p) { array *V=new array(2); pair z=p.maxtimes(); (*V)[0]=z.getx(); (*V)[1]=z.gety(); return V; } real relativedistance(real theta, real phi, real t, bool atleast) { return camp::velocity(theta,phi,tension(t,atleast)); } Int windingnumber(patharray *p, pair z) { return windingnumber(p,z); } bool inside(explicit patharray *g, pair z, pen fillrule=CURRENTPEN) { return fillrule.inside(windingnumber(g,z)); } bool inside(path g, pair z, pen fillrule=CURRENTPEN) { return fillrule.inside(g.windingnumber(z)); } // Return a positive (negative) value if a--b--c--cycle is oriented // counterclockwise (clockwise) or zero if all three points are colinear. // Equivalently, return a positive (negative) value if c lies to the // left (right) of the line through a and b or zero if c lies on this line. // The value returned is the determinant // |a.x a.y 1| // |b.x b.y 1| // |c.x c.y 1| // real orient(pair a, pair b, pair c) { return orient2d(a,b,c); } // Return a positive (negative) value if d lies inside (outside) // the circle passing through the counterclockwise-oriented points a,b,c // or zero if d lies on this circle. // The value returned is the determinant // |a.x a.y a.x^2+a.y^2 1| // |b.x b.y b.x^2+b.y^2 1| // |c.x c.y c.x^2+c.y^2 1| // |d.x d.y d.x^2+d.y^2 1| real incircle(pair a, pair b, pair c, pair d) { return incircle(a.getx(),a.gety(),b.getx(),b.gety(),c.getx(),c.gety(), d.getx(),d.gety()); } asymptote-3.05/memory.h0000644000000000000000000001031715031566105013651 0ustar rootroot/**** * memory.h * * Interface to the Boehm Garbage Collector. *****/ #ifndef MEMORY_H #define MEMORY_H #include #include #include #include #include #include #include #include #ifdef USEGC #define GC_THREADS #ifdef __clang__ #define GC_ATTR_EXPLICIT #define GC_NOEXCEPT #endif #include #ifdef GC_DEBUG extern "C" { #include } #endif void* asy_malloc(size_t n); void* asy_malloc_atomic(size_t n); #undef GC_MALLOC #undef GC_MALLOC_ATOMIC #define GC_MALLOC(sz) asy_malloc(sz) #define GC_MALLOC_ATOMIC(sz) asy_malloc_atomic(sz) #include #include #define gc_allocator gc_allocator_ignore_off_page #else // USEGC using std::allocator; #define gc_allocator allocator class gc {}; class gc_cleanup {}; enum GCPlacement {UseGC, NoGC, PointerFreeGC}; inline void* operator new(size_t size, GCPlacement) { return operator new(size); } inline void* operator new[](size_t size, GCPlacement) { return operator new(size); } template struct GC_type_traits {}; #define GC_DECLARE_PTRFREE(T) \ template<> struct GC_type_traits {} #endif // USEGC namespace mem { #define GC_CONTAINER(KIND) \ template \ struct KIND : public std::KIND >, public gc { \ KIND() : std::KIND >() {} \ KIND(size_t n) : std::KIND >(n) {} \ KIND(size_t n, const T& t) : std::KIND >(n,t) {} \ } GC_CONTAINER(list); GC_CONTAINER(vector); GC_CONTAINER(deque); template > struct stack : public std::stack, public gc {}; template struct pair : public std::pair, public gc { pair(T t, S s) : std::pair(t,s) {} }; #define PAIR_ALLOC gc_allocator > /* space */ #undef GC_CONTAINER #define GC_CONTAINER(KIND) \ template > \ struct KIND : public std::KIND, public gc \ { \ KIND() : std::KIND () {} \ } GC_CONTAINER(map); GC_CONTAINER(multimap); #undef GC_CONTAINER #define GC_CONTAINER(KIND) \ template , \ typename Eq = std::equal_to > \ struct KIND : public \ std::KIND, public gc { \ KIND() : std::KIND () {} \ KIND(size_t n) \ : std::KIND (n) {} \ } GC_CONTAINER(unordered_map); GC_CONTAINER(unordered_multimap); #undef GC_CONTAINER #undef PAIR_ALLOC #ifdef USEGC typedef std::basic_string, gc_allocator > string; typedef std::basic_stringstream, gc_allocator > stringstream; typedef std::basic_istringstream, gc_allocator > istringstream; typedef std::basic_ostringstream, gc_allocator > ostringstream; typedef std::basic_stringbuf, gc_allocator > stringbuf; void compact(int x); #else inline void compact(int) {} typedef std::string string; typedef std::stringstream stringstream; typedef std::istringstream istringstream; typedef std::ostringstream ostringstream; typedef std::stringbuf stringbuf; #endif // USEGC std::string stdString(string s); } // namespace mem #endif asymptote-3.05/lex.yy.cc0000644000000000000000000024431415031566132013735 0ustar rootroot#line 1 "lex.yy.cc" #line 3 "lex.yy.cc" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ /* %not-for-header */ /* %if-c-only */ /* %if-not-reentrant */ /* %endif */ /* %endif */ /* %ok-for-header */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 6 #define YY_FLEX_SUBMINOR_VERSION 4 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* %if-c++-only */ /* %endif */ /* %if-c-only */ /* %endif */ /* %if-c-only */ /* %endif */ /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* %if-c-only */ #include #include #include #include /* %endif */ /* %if-tables-serialization */ /* %endif */ /* end standard C headers. */ /* %if-c-or-c++ */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #ifndef SIZE_MAX #define SIZE_MAX (~(size_t)0) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* %endif */ /* begin standard C++ headers. */ /* %if-c++-only */ /* %endif */ /* TODO: this is always defined, so inline it */ #define yyconst const #if defined(__GNUC__) && __GNUC__ >= 3 #define yynoreturn __attribute__((__noreturn__)) #else #define yynoreturn #endif /* %not-for-header */ /* Returned upon end-of-file. */ #define YY_NULL 0 /* %ok-for-header */ /* %not-for-header */ /* Promotes a possibly negative, possibly signed char to an * integer in range [0..255] for use as an array index. */ #define YY_SC_TO_UI(c) ((YY_CHAR) (c)) /* %ok-for-header */ /* %if-reentrant */ /* %endif */ /* %if-not-reentrant */ /* %endif */ /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif /* %if-not-reentrant */ extern int yyleng; /* %endif */ /* %if-c-only */ /* %if-not-reentrant */ extern FILE *yyin, *yyout; /* %endif */ /* %endif */ #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { /* %if-c-only */ FILE *yy_input_file; /* %endif */ /* %if-c++-only */ /* %endif */ char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* %if-c-only Standard (non-C++) definition */ /* %not-for-header */ /* %if-not-reentrant */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* %endif */ /* %ok-for-header */ /* %endif */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* %if-c-only Standard (non-C++) definition */ /* %if-not-reentrant */ /* %not-for-header */ /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = NULL; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; /* %ok-for-header */ /* %endif */ void yyrestart ( FILE *input_file ); void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ); void yy_delete_buffer ( YY_BUFFER_STATE b ); void yy_flush_buffer ( YY_BUFFER_STATE b ); void yypush_buffer_state ( YY_BUFFER_STATE new_buffer ); void yypop_buffer_state ( void ); static void yyensure_buffer_stack ( void ); static void yy_load_buffer_state ( void ); static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size ); YY_BUFFER_STATE yy_scan_string ( const char *yy_str ); YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len ); /* %endif */ void *yyalloc ( yy_size_t ); void *yyrealloc ( void *, yy_size_t ); void yyfree ( void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* %% [1.0] yytext/yyin/yyout/yy_state_type/yylineno etc. def's & init go here */ #define FLEX_DEBUG typedef flex_uint8_t YY_CHAR; FILE *yyin = NULL, *yyout = NULL; typedef int yy_state_type; extern int yylineno; int yylineno = 1; extern char *yytext; #ifdef yytext_ptr #undef yytext_ptr #endif #define yytext_ptr yytext /* %% [1.5] DFA */ /* %if-c-only Standard (non-C++) definition */ static yy_state_type yy_get_previous_state ( void ); static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); static int yy_get_next_buffer ( void ); static void yynoreturn yy_fatal_error ( const char* msg ); /* %endif */ /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ /* %% [2.0] code to fiddle yytext and yyleng for yymore() goes here \ */\ yyleng = (int) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\ (yy_c_buf_p) = yy_cp; /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */ #define YY_NUM_RULES 126 #define YY_END_OF_BUFFER 127 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static const flex_int16_t yy_accept[351] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 125, 28, 29, 29, 60, 123, 46, 69, 47, 67, 124, 34, 35, 44, 42, 31, 43, 40, 45, 107, 32, 33, 54, 51, 56, 50, 69, 121, 36, 125, 37, 48, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 38, 68, 39, 69, 4, 3, 3, 4, 4, 10, 7, 7, 6, 10, 27, 13, 13, 12, 27, 126, 120, 115, 116, 115, 118, 118, 118, 118, 118, 118, 120, 120, 118, 120, 118, 118, 119, 120, 118, 118, 29, 53, 74, 69, 75, 58, 49, 72, 63, 70, 65, 71, 64, 108, 122, 30, 73, 108, 107, 0, 62, 55, 52, 57, 121, 29, 76, 61, 121, 121, 121, 121, 121, 121, 121, 121, 86, 121, 121, 121, 121, 121, 82, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 59, 3, 2, 1, 7, 0, 0, 5, 0, 7, 9, 8, 13, 0, 0, 11, 0, 13, 14, 22, 22, 15, 16, 17, 18, 19, 20, 21, 0, 116, 118, 118, 117, 118, 119, 116, 66, 41, 0, 30, 0, 108, 0, 0, 108, 121, 77, 121, 121, 121, 121, 121, 121, 121, 121, 121, 85, 121, 121, 121, 93, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 0, 0, 23, 23, 25, 0, 0, 108, 121, 121, 121, 121, 121, 81, 121, 83, 121, 121, 97, 121, 121, 121, 111, 121, 121, 121, 121, 121, 121, 121, 121, 121, 105, 109, 121, 121, 121, 121, 24, 26, 0, 108, 121, 121, 121, 88, 121, 121, 112, 121, 110, 121, 121, 121, 121, 121, 121, 99, 121, 121, 121, 121, 121, 121, 121, 92, 84, 94, 121, 121, 121, 121, 121, 95, 121, 121, 121, 121, 102, 121, 87, 100, 90, 121, 121, 121, 80, 121, 121, 121, 121, 98, 121, 121, 103, 121, 79, 91, 96, 121, 89, 78, 106, 113, 114, 121, 121, 121, 121, 104, 101, 0 } ; static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 23, 24, 25, 26, 27, 28, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 34, 35, 31, 1, 36, 37, 38, 39, 40, 41, 42, 43, 44, 31, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 31, 60, 61, 62, 63, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const YY_CHAR yy_meta[64] = { 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1 } ; static const flex_int16_t yy_base[358] = { 0, 0, 0, 61, 63, 65, 70, 75, 80, 0, 0, 113, 0, 557, 558, 558, 558, 553, 529, 558, 528, 545, 526, 541, 558, 558, 558, 67, 70, 558, 71, 84, 73, 159, 527, 558, 84, 523, 63, 558, 519, 0, 558, 91, 558, 152, 146, 495, 133, 497, 54, 153, 149, 143, 495, 151, 489, 503, 488, 164, 138, 498, 558, 479, 558, 558, 558, 558, 536, 519, 523, 558, 558, 533, 206, 215, 558, 558, 532, 222, 253, 558, 558, 558, 558, 531, 507, 558, 524, 517, 515, 512, 510, 504, 188, 500, 203, 496, 0, 228, 489, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 506, 558, 216, 220, 558, 0, 558, 225, 231, 246, 558, 558, 558, 558, 0, 519, 558, 558, 483, 481, 473, 464, 477, 468, 463, 476, 0, 460, 462, 465, 458, 460, 0, 458, 469, 449, 459, 464, 459, 465, 452, 216, 159, 452, 455, 443, 447, 444, 451, 450, 558, 558, 558, 558, 558, 273, 289, 558, 279, 490, 558, 558, 558, 310, 321, 558, 284, 489, 558, 276, 278, 558, 558, 558, 558, 558, 558, 558, 314, 558, 558, 558, 558, 474, 0, 487, 558, 297, 317, 0, 327, 320, 341, 349, 282, 449, 0, 448, 438, 450, 431, 438, 437, 442, 435, 427, 0, 432, 429, 431, 435, 429, 422, 417, 426, 417, 416, 414, 414, 412, 413, 412, 424, 423, 426, 413, 414, 370, 376, 308, 558, 368, 379, 390, 330, 406, 422, 402, 411, 141, 0, 415, 0, 410, 413, 0, 400, 396, 398, 0, 413, 412, 403, 406, 393, 392, 399, 404, 397, 0, 0, 401, 383, 396, 397, 558, 558, 398, 371, 383, 381, 369, 0, 368, 365, 0, 370, 0, 352, 365, 366, 343, 341, 348, 0, 341, 335, 339, 321, 319, 327, 325, 0, 0, 0, 305, 303, 298, 300, 289, 0, 291, 279, 271, 270, 0, 270, 0, 0, 0, 237, 239, 232, 0, 236, 222, 205, 200, 0, 210, 192, 0, 181, 0, 0, 0, 171, 0, 0, 0, 0, 0, 182, 180, 68, 55, 0, 0, 558, 420, 423, 426, 429, 69, 67, 432 } ; static const flex_int16_t yy_def[358] = { 0, 350, 1, 351, 351, 352, 352, 353, 353, 354, 354, 350, 11, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 355, 350, 350, 350, 350, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 356, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 357, 350, 350, 350, 350, 350, 350, 350, 350, 355, 350, 350, 350, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 356, 350, 350, 350, 350, 357, 350, 350, 350, 350, 350, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 350, 350, 350, 350, 350, 350, 350, 350, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 350, 350, 350, 350, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 0, 350, 350, 350, 350, 350, 350, 350 } ; static const flex_int16_t yy_nxt[622] = { 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 33, 33, 34, 35, 36, 37, 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 41, 41, 52, 41, 41, 41, 53, 54, 55, 56, 57, 58, 59, 60, 41, 61, 41, 41, 62, 63, 64, 65, 67, 68, 67, 68, 72, 73, 196, 74, 126, 72, 73, 69, 74, 69, 77, 78, 70, 108, 70, 77, 78, 110, 79, 116, 112, 125, 105, 79, 117, 109, 102, 127, 111, 113, 75, 118, 139, 349, 114, 75, 115, 115, 115, 348, 80, 105, 123, 105, 140, 80, 82, 83, 84, 85, 86, 82, 87, 88, 87, 87, 82, 82, 82, 89, 90, 82, 91, 92, 87, 82, 82, 82, 93, 82, 94, 95, 96, 82, 97, 98, 98, 82, 99, 82, 100, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 82, 87, 82, 101, 119, 128, 120, 120, 120, 135, 147, 130, 285, 159, 129, 136, 141, 144, 160, 137, 286, 131, 230, 145, 146, 148, 121, 132, 133, 142, 150, 155, 143, 151, 156, 167, 167, 168, 231, 169, 193, 192, 193, 157, 169, 166, 171, 347, 172, 346, 158, 175, 175, 176, 345, 177, 192, 193, 191, 197, 177, 199, 344, 200, 200, 200, 170, 115, 115, 115, 202, 343, 203, 203, 203, 173, 119, 342, 120, 120, 120, 341, 178, 174, 179, 340, 180, 121, 205, 339, 205, 180, 204, 206, 206, 206, 228, 229, 121, 338, 181, 182, 167, 167, 168, 337, 169, 336, 180, 167, 168, 169, 335, 180, 175, 176, 183, 184, 167, 239, 168, 185, 169, 241, 241, 242, 242, 169, 186, 206, 206, 206, 187, 170, 188, 334, 189, 333, 190, 175, 175, 176, 202, 177, 200, 200, 200, 332, 177, 170, 175, 240, 176, 331, 177, 277, 277, 243, 330, 177, 329, 243, 243, 243, 200, 200, 200, 203, 203, 203, 178, 243, 202, 328, 200, 200, 200, 246, 246, 246, 327, 178, 326, 245, 121, 245, 325, 244, 246, 246, 246, 205, 324, 205, 323, 322, 206, 206, 206, 167, 167, 168, 321, 169, 320, 175, 175, 176, 169, 177, 319, 278, 318, 317, 177, 278, 278, 278, 280, 280, 280, 279, 316, 279, 315, 278, 280, 280, 280, 314, 170, 313, 245, 312, 245, 311, 178, 246, 246, 246, 279, 310, 279, 309, 308, 280, 280, 280, 66, 66, 66, 71, 71, 71, 76, 76, 76, 81, 81, 81, 201, 307, 201, 306, 305, 304, 303, 302, 301, 300, 299, 298, 297, 296, 295, 294, 293, 292, 291, 290, 289, 288, 287, 284, 283, 282, 281, 276, 275, 274, 273, 272, 271, 270, 269, 268, 267, 266, 265, 264, 263, 262, 261, 260, 259, 258, 257, 256, 255, 254, 253, 252, 251, 250, 249, 248, 247, 191, 192, 174, 166, 238, 237, 236, 235, 234, 233, 232, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 102, 198, 192, 193, 192, 192, 192, 195, 192, 194, 193, 192, 191, 174, 166, 165, 164, 163, 162, 161, 154, 153, 152, 149, 138, 134, 105, 124, 122, 107, 106, 105, 104, 103, 102, 350, 13, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350 } ; static const flex_int16_t yy_chk[622] = { 0, 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, 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, 3, 3, 4, 4, 5, 5, 356, 5, 355, 6, 6, 3, 6, 4, 7, 7, 3, 27, 4, 8, 8, 28, 7, 32, 30, 38, 38, 8, 32, 27, 43, 43, 28, 30, 5, 32, 50, 347, 31, 6, 31, 31, 31, 346, 7, 36, 36, 36, 50, 8, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 33, 45, 33, 33, 33, 48, 53, 46, 251, 60, 45, 48, 51, 52, 60, 48, 251, 46, 154, 52, 52, 53, 33, 46, 46, 51, 55, 59, 51, 55, 59, 74, 74, 74, 154, 74, 94, 94, 94, 59, 74, 75, 75, 345, 75, 344, 59, 79, 79, 79, 338, 79, 96, 96, 99, 99, 79, 114, 334, 114, 114, 114, 74, 115, 115, 115, 119, 332, 119, 119, 119, 75, 120, 331, 120, 120, 120, 329, 79, 80, 80, 328, 80, 115, 121, 327, 121, 80, 119, 121, 121, 121, 153, 153, 120, 326, 80, 80, 167, 167, 167, 324, 167, 323, 80, 170, 170, 167, 322, 80, 178, 178, 80, 80, 168, 168, 168, 80, 168, 181, 181, 182, 182, 168, 80, 206, 206, 206, 80, 167, 80, 318, 80, 316, 80, 175, 175, 175, 199, 175, 199, 199, 199, 315, 175, 168, 176, 176, 176, 314, 176, 241, 241, 190, 313, 176, 311, 190, 190, 190, 200, 200, 200, 203, 203, 203, 175, 190, 202, 310, 202, 202, 202, 246, 246, 246, 309, 176, 308, 204, 200, 204, 307, 203, 204, 204, 204, 205, 303, 205, 302, 301, 205, 205, 205, 239, 239, 239, 300, 239, 299, 240, 240, 240, 239, 240, 298, 243, 297, 295, 240, 243, 243, 243, 280, 280, 280, 244, 294, 244, 293, 243, 244, 244, 244, 292, 239, 291, 245, 290, 245, 288, 240, 245, 245, 245, 279, 286, 279, 285, 283, 279, 279, 279, 351, 351, 351, 352, 352, 352, 353, 353, 353, 354, 354, 354, 357, 282, 357, 281, 276, 275, 274, 273, 270, 269, 268, 267, 266, 265, 264, 263, 262, 260, 259, 258, 256, 255, 253, 250, 249, 248, 247, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 217, 216, 215, 214, 213, 212, 211, 210, 209, 207, 197, 195, 179, 171, 161, 160, 159, 158, 157, 156, 155, 152, 151, 150, 149, 148, 147, 146, 145, 143, 142, 141, 140, 139, 137, 136, 135, 134, 133, 132, 131, 130, 127, 112, 100, 97, 95, 93, 92, 91, 90, 89, 88, 86, 85, 78, 73, 70, 69, 68, 63, 61, 58, 57, 56, 54, 49, 47, 40, 37, 34, 23, 22, 21, 20, 18, 17, 13, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350 } ; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 1; static const flex_int16_t yy_rule_linenum[126] = { 0, 214, 215, 217, 223, 227, 228, 238, 239, 240, 241, 245, 246, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 270, 275, 281, 287, 295, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 342, 343, 344, 345, 346, 347, 348, 350, 351, 352, 353, 354, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 376, 378, 379, 380, 381, 382, 385, 392, 399, 401, 403, 405, 407, 410, 412, 413, 419, 423, 427, 431, 434, 438, 439, 440, 444 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #line 1 "camp.l" #line 2 "camp.l" /***** * camp.l * Andy Hammerlindl 2002/06/14 * * The lexical analyzer of the Asymptote language. *****/ #include #include #include #include #include "util.h" #include "modifier.h" #include "exp.h" #include "stm.h" #include "fundec.h" #include "errormsg.h" #include "interact.h" #include "lexical.h" using namespace absyntax; using mem::string; #include "camp.tab.h" #include "opsymbols.h" #define YY_NO_INPUT #define register static void yyunput(int, char *); void (*unused)(int,char *) = yyunput; fileinfo* fi; Int tokPos; Int charPos; //int commentDepth = 0; bool isEof; string eofMessage; extern errorstream em; extern "C" int yywrap(void) { charPos=1; return 1; } typedef size_t (*input_f) (char* bif, size_t max_size); input_f yy_input = NULL; void setlexer(input_f input, string filename) { YY_FLUSH_BUFFER; yywrap(); fi = new fileinfo(filename); yy_input = input; tokPos = charPos = 1; isEof=false; eofMessage=""; } #define YY_INPUT(buf,result,max_size) {result=yy_input(buf,max_size);} position lexerPos() { position p; p.init(fi, tokPos); return p; } namespace { position here() { return lexerPos(); } void adjust() { tokPos = charPos; charPos += yyleng; yylval.pos = here(); } void savesymbol(symbol name) { adjust(); yylval.ps.pos=yylval.pos; // avoid invoking here() twice yylval.ps.sym=name; } /* For optimization reasons, the operator names are translated into symbols * just once, and can be accessed throughout the code as SYM_PLUS, SYM_DASHES, * etc. Following the Don't Repeat Yourself principle, the mapping from * strings to names is defined only here in camp.l (because we can't produce * lex rules from a C style macro). * The script opsymbols.py reads this file scanning for rules using DEFSYMBOL * and creates opsymbols.h which defines the names for use in C++ code. */ #define DEFSYMBOL(name) \ savesymbol(name) /* Extra symbols can be added by EXTRASYMBOL */ #define EXTRASYMBOL(chars, codename) /* blank */ EXTRASYMBOL(tuple, SYM_TUPLE); void makesymbol() { assert(strlen(yytext) == (size_t)yyleng); savesymbol(symbol::rawTrans(yytext, yyleng+1)); } void makeopsymbol() { savesymbol(symbol::opTrans(yytext)); } void makemod(trans::modifier mod) { yylval.mod.pos=here(); yylval.mod.val=mod; } void makeperm(trans::permission perm) { yylval.perm.pos=here(); yylval.perm.val=perm; } void newline() { fi->newline(); charPos = tokPos = 1; } void error(void) { em.error(here()); } } // Used by the lexer rules to flag an unexpected end of input. The message is // the error message that should be reported, and may differ if, say the input // ends in the middle of a string or comment. void setEOF(string message) { isEof=true; eofMessage=message; } // Called by code outside of the lexer to see if a parse error was caused by // running out of input. bool lexerEOF() { return isEof; } // Called by code outside of the lexer when it wants to report the unexpected // eof as an error (instead of looking for more input). void reportEOF() { assert(isEof); error(); em << eofMessage; em.sync(true); } position stringpos; // The position of the start of the string. string stringbuild; // Stores the string literal as it is read. namespace { void startstring() { adjust(); stringpos = here(); } void append(char c) { stringbuild.push_back(c); yylval.pos = here(); } void getstring(void) { // NOTE: Replace here() with a position at the start of the string. yylval.stre = new stringExp(stringpos, stringbuild); string().swap(stringbuild); } } #line 989 "lex.yy.cc" #line 991 "lex.yy.cc" #define INITIAL 0 #define lexcomment 1 #define texstring 2 #define cstring 3 #define lexformat 4 #define opname 5 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ /* %if-c-only */ #include /* %endif */ /* %if-c++-only */ /* %endif */ #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif /* %if-c-only Reentrant structure and macros (non-C++). */ /* %if-reentrant */ /* %if-c-only */ static int yy_init_globals ( void ); /* %endif */ /* %if-reentrant */ /* %endif */ /* %endif End reentrant structures and macros. */ /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy ( void ); int yyget_debug ( void ); void yyset_debug ( int debug_flag ); YY_EXTRA_TYPE yyget_extra ( void ); void yyset_extra ( YY_EXTRA_TYPE user_defined ); FILE *yyget_in ( void ); void yyset_in ( FILE * _in_str ); FILE *yyget_out ( void ); void yyset_out ( FILE * _out_str ); int yyget_leng ( void ); char *yyget_text ( void ); int yyget_lineno ( void ); void yyset_lineno ( int _line_number ); /* %if-bison-bridge */ /* %endif */ /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap ( void ); #else extern int yywrap ( void ); #endif #endif /* %not-for-header */ #ifndef YY_NO_UNPUT static void yyunput ( int c, char *buf_ptr ); #endif /* %ok-for-header */ /* %endif */ #ifndef yytext_ptr static void yy_flex_strncpy ( char *, const char *, int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen ( const char * ); #endif #ifndef YY_NO_INPUT /* %if-c-only Standard (non-C++) definition */ /* %not-for-header */ #ifdef __cplusplus static int yyinput ( void ); #else static int input ( void ); #endif /* %ok-for-header */ /* %endif */ #endif /* %if-c-only */ /* %endif */ /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* %if-c-only Standard (non-C++) definition */ /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) /* %endif */ /* %if-c++-only C++ definition */ /* %endif */ #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ /* %% [5.0] fread()/read() definition of YY_INPUT goes here unless we're doing C++ \ */\ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ /* %if-c++-only C++ definition \ */\ /* %endif */ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR /* %if-c-only */ #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) /* %endif */ /* %if-c++-only */ /* %endif */ #endif /* %if-tables-serialization structures and prototypes */ /* %not-for-header */ /* %ok-for-header */ /* %not-for-header */ /* %tables-yydmap generated elements */ /* %endif */ /* end tables serialization structures and prototypes */ /* %ok-for-header */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 /* %if-c-only Standard (non-C++) definition */ extern int yylex (void); #define YY_DECL int yylex (void) /* %endif */ /* %if-c++-only C++ definition */ /* %endif */ #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK /*LINTED*/break; #endif /* %% [6.0] YY_RULE_SETUP definition goes here */ #define YY_RULE_SETUP \ YY_USER_ACTION /* %not-for-header */ /** The main scanner function which does all the work. */ YY_DECL { yy_state_type yy_current_state; char *yy_cp, *yy_bp; int yy_act; if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) /* %if-c-only */ yyin = stdin; /* %endif */ /* %if-c++-only */ /* %endif */ if ( ! yyout ) /* %if-c-only */ yyout = stdout; /* %endif */ /* %if-c++-only */ /* %endif */ if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } { /* %% [7.0] user's declarations go here */ #line 211 "camp.l" #line 1279 "lex.yy.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { /* %% [8.0] yymore()-related code goes here */ yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; /* %% [9.0] code to set up and find next match goes here */ yy_current_state = (yy_start); yy_match: do { YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 351 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 558 ); yy_find_action: /* %% [10.0] code to find the action number goes here */ yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; /* %% [11.0] code for yylineno update goes here */ do_action: /* This label is used only to access EOF actions. */ /* %% [12.0] debug code goes here */ if ( yy_flex_debug ) { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); else if ( yy_act < 126 ) fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n", (long)yy_rule_linenum[yy_act], yytext ); else if ( yy_act == 126 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); else if ( yy_act == 127 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); } switch ( yy_act ) { /* beginning of action switch */ /* %% [13.0] actions go here */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 214 "camp.l" {adjust(); /*commentDepth++;*/} YY_BREAK case 2: YY_RULE_SETUP #line 215 "camp.l" {adjust(); /*commentDepth--;*/ /*if (commentDepth == 0)*/ BEGIN INITIAL; } YY_BREAK case 3: /* rule 3 can match eol */ YY_RULE_SETUP #line 217 "camp.l" {adjust(); newline(); continue; } YY_BREAK case YY_STATE_EOF(lexcomment): #line 218 "camp.l" {adjust(); setEOF("comment not terminated"); BEGIN INITIAL; return GARBAGE; } YY_BREAK case 4: YY_RULE_SETUP #line 223 "camp.l" {adjust(); continue; } YY_BREAK case 5: /* rule 5 can match eol */ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ YY_LINENO_REWIND_TO(yy_bp + 1); (yy_c_buf_p) = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 227 "camp.l" {adjust(); BEGIN INITIAL;} YY_BREAK case 6: YY_RULE_SETUP #line 228 "camp.l" {adjust(); BEGIN INITIAL; getstring(); return STRING; } YY_BREAK case YY_STATE_EOF(texstring): #line 232 "camp.l" {adjust(); setEOF("string not terminated"); BEGIN INITIAL; getstring(); return GARBAGE; } YY_BREAK case 7: /* rule 7 can match eol */ YY_RULE_SETUP #line 238 "camp.l" {adjust(); newline(); append('\n'); continue; } YY_BREAK case 8: YY_RULE_SETUP #line 239 "camp.l" {adjust(); append('\\'); append('\\'); continue; } YY_BREAK case 9: YY_RULE_SETUP #line 240 "camp.l" {adjust(); append('\"'); continue; } YY_BREAK case 10: YY_RULE_SETUP #line 241 "camp.l" {adjust(); append(*yytext); } YY_BREAK case 11: /* rule 11 can match eol */ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ YY_LINENO_REWIND_TO(yy_bp + 1); (yy_c_buf_p) = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 245 "camp.l" {adjust(); BEGIN INITIAL;} YY_BREAK case 12: YY_RULE_SETUP #line 246 "camp.l" {adjust(); BEGIN INITIAL; getstring(); return STRING; } YY_BREAK case YY_STATE_EOF(cstring): #line 250 "camp.l" {adjust(); setEOF("string not terminated"); BEGIN INITIAL; getstring(); return GARBAGE; } YY_BREAK case 13: /* rule 13 can match eol */ YY_RULE_SETUP #line 256 "camp.l" {adjust(); newline(); append('\n'); continue; } YY_BREAK case 14: YY_RULE_SETUP #line 257 "camp.l" {adjust(); append(yytext[1]); continue; } YY_BREAK case 15: YY_RULE_SETUP #line 258 "camp.l" {adjust(); append('\a'); continue; } YY_BREAK case 16: YY_RULE_SETUP #line 259 "camp.l" {adjust(); append('\b'); continue; } YY_BREAK case 17: YY_RULE_SETUP #line 260 "camp.l" {adjust(); append('\f'); continue; } YY_BREAK case 18: YY_RULE_SETUP #line 261 "camp.l" {adjust(); append('\n'); continue; } YY_BREAK case 19: YY_RULE_SETUP #line 262 "camp.l" {adjust(); append('\r'); continue; } YY_BREAK case 20: YY_RULE_SETUP #line 263 "camp.l" {adjust(); append('\t'); continue; } YY_BREAK case 21: YY_RULE_SETUP #line 264 "camp.l" {adjust(); append('\v'); continue; } YY_BREAK case 22: YY_RULE_SETUP #line 265 "camp.l" {adjust(); char x=(char)(yytext[1]-'0'); append(x); continue; } YY_BREAK case 23: YY_RULE_SETUP #line 270 "camp.l" {adjust(); char x=(char)((yytext[1]-'0')*8+yytext[2]-'0'); append(x); continue; } YY_BREAK case 24: YY_RULE_SETUP #line 275 "camp.l" {adjust(); char x=(char)((yytext[1]-'0')*64+(yytext[2]-'0')*8 +yytext[3]-'0'); append(x); continue; } YY_BREAK case 25: YY_RULE_SETUP #line 281 "camp.l" {adjust(); char x=(char) (yytext[2] <= '9' ? yytext[2]-'0' : 10+yytext[2]-'A'); append(x); continue; } YY_BREAK case 26: YY_RULE_SETUP #line 287 "camp.l" {adjust(); char x=(char) ((yytext[2] <= '9' ? yytext[2]-'0' : 10+yytext[2]-'A')*16 +(yytext[3] <= '9' ? yytext[3]-'0' : 10+yytext[3]-'A')); append(x); continue; } YY_BREAK case 27: YY_RULE_SETUP #line 295 "camp.l" {adjust(); append(*yytext); } YY_BREAK case 28: YY_RULE_SETUP #line 298 "camp.l" {adjust(); continue;} YY_BREAK case 29: /* rule 29 can match eol */ YY_RULE_SETUP #line 299 "camp.l" {adjust(); newline(); continue;} YY_BREAK case 30: YY_RULE_SETUP #line 300 "camp.l" {adjust(); continue;} YY_BREAK case 31: YY_RULE_SETUP #line 301 "camp.l" {adjust(); return ','; } YY_BREAK case 32: YY_RULE_SETUP #line 302 "camp.l" {adjust(); return ':'; } YY_BREAK case 33: YY_RULE_SETUP #line 303 "camp.l" {adjust(); return ';'; } YY_BREAK case 34: YY_RULE_SETUP #line 304 "camp.l" {adjust(); return '('; } YY_BREAK case 35: YY_RULE_SETUP #line 305 "camp.l" {adjust(); return ')'; } YY_BREAK case 36: YY_RULE_SETUP #line 306 "camp.l" {adjust(); return '['; } YY_BREAK case 37: YY_RULE_SETUP #line 307 "camp.l" {adjust(); return ']'; } YY_BREAK case 38: YY_RULE_SETUP #line 308 "camp.l" {adjust(); return '{'; } YY_BREAK case 39: YY_RULE_SETUP #line 309 "camp.l" {adjust(); return '}'; } YY_BREAK case 40: YY_RULE_SETUP #line 310 "camp.l" {adjust(); return '.'; } YY_BREAK case 41: YY_RULE_SETUP #line 311 "camp.l" {adjust(); return ELLIPSIS; } YY_BREAK case 42: YY_RULE_SETUP #line 313 "camp.l" {DEFSYMBOL(SYM_PLUS); return '+'; } YY_BREAK case 43: YY_RULE_SETUP #line 314 "camp.l" {DEFSYMBOL(SYM_MINUS); return '-'; } YY_BREAK case 44: YY_RULE_SETUP #line 315 "camp.l" {DEFSYMBOL(SYM_TIMES); return '*'; } YY_BREAK case 45: YY_RULE_SETUP #line 316 "camp.l" {DEFSYMBOL(SYM_DIVIDE); return '/'; } YY_BREAK case 46: YY_RULE_SETUP #line 317 "camp.l" {DEFSYMBOL(SYM_QUOTIENT); return '#'; } YY_BREAK case 47: YY_RULE_SETUP #line 318 "camp.l" {DEFSYMBOL(SYM_MOD); return '%'; } YY_BREAK case 48: YY_RULE_SETUP #line 319 "camp.l" {DEFSYMBOL(SYM_CARET); return '^'; } YY_BREAK case 49: YY_RULE_SETUP #line 320 "camp.l" {savesymbol(SYM_CARET); return '^'; } YY_BREAK case 50: YY_RULE_SETUP #line 321 "camp.l" {adjust(); return '?'; } YY_BREAK case 51: YY_RULE_SETUP #line 322 "camp.l" {adjust(); return ASSIGN; } YY_BREAK case 52: YY_RULE_SETUP #line 323 "camp.l" {DEFSYMBOL(SYM_EQ); return EQ; } YY_BREAK case 53: YY_RULE_SETUP #line 324 "camp.l" {DEFSYMBOL(SYM_NEQ); return NEQ; } YY_BREAK case 54: YY_RULE_SETUP #line 325 "camp.l" {DEFSYMBOL(SYM_LT); return LT; } YY_BREAK case 55: YY_RULE_SETUP #line 326 "camp.l" {DEFSYMBOL(SYM_LE); return LE; } YY_BREAK case 56: YY_RULE_SETUP #line 327 "camp.l" {DEFSYMBOL(SYM_GT); return GT; } YY_BREAK case 57: YY_RULE_SETUP #line 328 "camp.l" {DEFSYMBOL(SYM_GE); return GE; } YY_BREAK case 58: YY_RULE_SETUP #line 329 "camp.l" {DEFSYMBOL(SYM_CAND); return CAND; } YY_BREAK case 59: YY_RULE_SETUP #line 330 "camp.l" {DEFSYMBOL(SYM_COR); return COR; } YY_BREAK case 60: YY_RULE_SETUP #line 331 "camp.l" {DEFSYMBOL(SYM_LOGNOT); return OPERATOR; } YY_BREAK case 61: YY_RULE_SETUP #line 332 "camp.l" {DEFSYMBOL(SYM_CARETS); return CARETS; } YY_BREAK case 62: YY_RULE_SETUP #line 333 "camp.l" {DEFSYMBOL(SYM_COLONS); return COLONS; } YY_BREAK case 63: YY_RULE_SETUP #line 334 "camp.l" {DEFSYMBOL(SYM_INCR); return INCR; } YY_BREAK case 64: YY_RULE_SETUP #line 335 "camp.l" {DEFSYMBOL(SYM_DOTS); return DOTS; } YY_BREAK case 65: YY_RULE_SETUP #line 336 "camp.l" {DEFSYMBOL(SYM_DASHES); return DASHES; } YY_BREAK case 66: YY_RULE_SETUP #line 337 "camp.l" {DEFSYMBOL(SYM_LONGDASH); return LONGDASH; } YY_BREAK case 67: YY_RULE_SETUP #line 338 "camp.l" {DEFSYMBOL(SYM_AMPERSAND); return AMPERSAND; } YY_BREAK case 68: YY_RULE_SETUP #line 339 "camp.l" {DEFSYMBOL(SYM_BAR); return BAR; } YY_BREAK case 69: YY_RULE_SETUP #line 340 "camp.l" {makeopsymbol(); return OPERATOR; } YY_BREAK case 70: YY_RULE_SETUP #line 342 "camp.l" {savesymbol(SYM_PLUS); return SELFOP; } YY_BREAK case 71: YY_RULE_SETUP #line 343 "camp.l" {savesymbol(SYM_MINUS); return SELFOP; } YY_BREAK case 72: YY_RULE_SETUP #line 344 "camp.l" {savesymbol(SYM_TIMES); return SELFOP; } YY_BREAK case 73: YY_RULE_SETUP #line 345 "camp.l" {savesymbol(SYM_DIVIDE); return SELFOP; } YY_BREAK case 74: YY_RULE_SETUP #line 346 "camp.l" {savesymbol(SYM_QUOTIENT); return SELFOP; } YY_BREAK case 75: YY_RULE_SETUP #line 347 "camp.l" {savesymbol(SYM_MOD); return SELFOP; } YY_BREAK case 76: YY_RULE_SETUP #line 348 "camp.l" {savesymbol(SYM_CARET); return SELFOP; } YY_BREAK case 77: YY_RULE_SETUP #line 350 "camp.l" {adjust(); return AND; } YY_BREAK case 78: YY_RULE_SETUP #line 351 "camp.l" {DEFSYMBOL(SYM_CONTROLS); return CONTROLS; } YY_BREAK case 79: YY_RULE_SETUP #line 352 "camp.l" {DEFSYMBOL(SYM_TENSION); return TENSION; } YY_BREAK case 80: YY_RULE_SETUP #line 353 "camp.l" {DEFSYMBOL(SYM_ATLEAST); return ATLEAST; } YY_BREAK case 81: YY_RULE_SETUP #line 354 "camp.l" {DEFSYMBOL(SYM_CURL); return CURL; } YY_BREAK case 82: YY_RULE_SETUP #line 356 "camp.l" {adjust(); return IF; } YY_BREAK case 83: YY_RULE_SETUP #line 357 "camp.l" {adjust(); return ELSE; } YY_BREAK case 84: YY_RULE_SETUP #line 358 "camp.l" {adjust(); return WHILE; } YY_BREAK case 85: YY_RULE_SETUP #line 359 "camp.l" {adjust(); return FOR; } YY_BREAK case 86: YY_RULE_SETUP #line 360 "camp.l" {adjust(); return DO; } YY_BREAK case 87: YY_RULE_SETUP #line 361 "camp.l" {adjust(); return RETURN_; } YY_BREAK case 88: YY_RULE_SETUP #line 362 "camp.l" {adjust(); return BREAK; } YY_BREAK case 89: YY_RULE_SETUP #line 363 "camp.l" {adjust(); return CONTINUE; } YY_BREAK case 90: YY_RULE_SETUP #line 364 "camp.l" {adjust(); return STRUCT; } YY_BREAK case 91: YY_RULE_SETUP #line 365 "camp.l" {adjust(); return TYPEDEF; } YY_BREAK case 92: YY_RULE_SETUP #line 366 "camp.l" {adjust(); return USING; } YY_BREAK case 93: YY_RULE_SETUP #line 367 "camp.l" {adjust(); return NEW; } YY_BREAK case 94: YY_RULE_SETUP #line 368 "camp.l" {adjust(); return ACCESS; } YY_BREAK case 95: YY_RULE_SETUP #line 369 "camp.l" {adjust(); return IMPORT; } YY_BREAK case 96: YY_RULE_SETUP #line 370 "camp.l" {adjust(); return UNRAVEL; } YY_BREAK case 97: YY_RULE_SETUP #line 371 "camp.l" {adjust(); return FROM; } YY_BREAK case 98: YY_RULE_SETUP #line 372 "camp.l" {adjust(); return INCLUDE; } YY_BREAK case 99: YY_RULE_SETUP #line 373 "camp.l" {adjust(); return QUOTE; } YY_BREAK case 100: YY_RULE_SETUP #line 374 "camp.l" {adjust(); makemod(trans::EXPLICIT_STATIC); return MODIFIER; } YY_BREAK case 101: YY_RULE_SETUP #line 376 "camp.l" {adjust(); makemod(trans::AUTOUNRAVEL); return MODIFIER; } YY_BREAK case 102: YY_RULE_SETUP #line 378 "camp.l" {adjust(); makeperm(trans::PUBLIC); return PERM; } YY_BREAK case 103: YY_RULE_SETUP #line 379 "camp.l" {adjust(); makeperm(trans::PRIVATE); return PERM; } YY_BREAK case 104: YY_RULE_SETUP #line 380 "camp.l" {adjust(); makeperm(trans::RESTRICTED); return PERM; } YY_BREAK case 105: YY_RULE_SETUP #line 381 "camp.l" {adjust(); return THIS_TOK; } YY_BREAK case 106: YY_RULE_SETUP #line 382 "camp.l" {adjust(); return EXPLICIT; } YY_BREAK case 107: YY_RULE_SETUP #line 385 "camp.l" try { adjust(); yylval.e= new intExp(here(), lexical::cast(yytext)); } catch (lexical::bad_cast&) { error(); em << "invalid integer"; yylval.e= new intExp(here(), 0); } return LIT; YY_BREAK case 108: YY_RULE_SETUP #line 392 "camp.l" try { adjust(); yylval.e= new realExp(here(), lexical::cast(yytext)); } catch (lexical::bad_cast&) { error(); em << "invalid real"; yylval.e= new realExp(here(), 0); } return LIT; YY_BREAK case 109: YY_RULE_SETUP #line 399 "camp.l" { adjust(); yylval.e= new booleanExp(here(), true); return LIT; } YY_BREAK case 110: YY_RULE_SETUP #line 401 "camp.l" { adjust(); yylval.e= new booleanExp(here(), false); return LIT; } YY_BREAK case 111: YY_RULE_SETUP #line 403 "camp.l" { adjust(); yylval.e= new nullExp(here()); return LIT; } YY_BREAK case 112: YY_RULE_SETUP #line 405 "camp.l" { adjust(); yylval.e= new cycleExp(here()); return LIT; } YY_BREAK case 113: YY_RULE_SETUP #line 407 "camp.l" { adjust(); yylval.e= new newPictureExp(here()); return LIT; } YY_BREAK case 114: YY_RULE_SETUP #line 410 "camp.l" {adjust(); BEGIN opname; } YY_BREAK case 115: YY_RULE_SETUP #line 412 "camp.l" {adjust(); continue;} YY_BREAK case 116: /* rule 116 can match eol */ YY_RULE_SETUP #line 413 "camp.l" {adjust(); newline(); continue;} YY_BREAK case YY_STATE_EOF(opname): #line 414 "camp.l" {adjust(); setEOF("missing operator name"); BEGIN INITIAL; return GARBAGE; } YY_BREAK case 117: YY_RULE_SETUP #line 419 "camp.l" { savesymbol(SYM_CARET); BEGIN INITIAL; return ID; } YY_BREAK case 118: YY_RULE_SETUP #line 423 "camp.l" { makeopsymbol(); BEGIN INITIAL; return ID;} YY_BREAK case 119: YY_RULE_SETUP #line 427 "camp.l" { makeopsymbol(); BEGIN INITIAL; return ID; } YY_BREAK case 120: YY_RULE_SETUP #line 431 "camp.l" {} YY_BREAK case 121: YY_RULE_SETUP #line 434 "camp.l" { makesymbol(); return ID; } YY_BREAK case 122: YY_RULE_SETUP #line 438 "camp.l" {adjust(); /*commentDepth = 1;*/ BEGIN lexcomment; } YY_BREAK case 123: YY_RULE_SETUP #line 439 "camp.l" {startstring(); BEGIN texstring; } YY_BREAK case 124: YY_RULE_SETUP #line 440 "camp.l" {startstring(); BEGIN cstring; } YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(lexformat): #line 442 "camp.l" { setEOF("unexpected end of input"); yyterminate(); } YY_BREAK case 125: YY_RULE_SETUP #line 444 "camp.l" {adjust(); error(); em << "invalid token"; if (isgraph(yytext[0])) em << " '" << yytext[0] << "'"; } YY_BREAK case 126: YY_RULE_SETUP #line 450 "camp.l" ECHO; YY_BREAK #line 2117 "lex.yy.cc" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; /* %if-c-only */ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; /* %endif */ /* %if-c++-only */ /* %endif */ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { /* %% [14.0] code to do back-up for compressed tables and set up yy_cp goes here */ yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of user's declarations */ } /* end of yylex */ /* %ok-for-header */ /* %if-c++-only */ /* %not-for-header */ /* %ok-for-header */ /* %endif */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ /* %if-c-only */ static int yy_get_next_buffer (void) /* %endif */ /* %if-c++-only */ /* %endif */ { char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; char *source = (yytext_ptr); int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc( (void *) b->yy_ch_buf, (yy_size_t) (b->yy_buf_size + 2) ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = NULL; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); /* "- 2" to take care of EOB's */ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ /* %if-c-only */ /* %not-for-header */ static yy_state_type yy_get_previous_state (void) /* %endif */ /* %if-c++-only */ /* %endif */ { yy_state_type yy_current_state; char *yy_cp; /* %% [15.0] code to get the start state into yy_current_state goes here */ yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { /* %% [16.0] code to find the next state goes here */ YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 351 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ /* %if-c-only */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) /* %endif */ /* %if-c++-only */ /* %endif */ { int yy_is_jam; /* %% [17.0] code to find the next state, and perhaps do backing up, goes here */ char *yy_cp = (yy_c_buf_p); YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 351 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; yy_is_jam = (yy_current_state == 350); return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT /* %if-c-only */ static void yyunput (int c, char * yy_bp ) /* %endif */ /* %if-c++-only */ /* %endif */ { char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ int number_to_move = (yy_n_chars) + 2; char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; /* %% [18.0] update yylineno here */ (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } /* %if-c-only */ /* %endif */ #endif /* %if-c-only */ #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif /* %endif */ /* %if-c++-only */ /* %endif */ { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); /* %% [19.0] update BOL and yylineno */ return c; } /* %if-c-only */ #endif /* ifndef YY_NO_INPUT */ /* %endif */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ /* %if-c-only */ void yyrestart (FILE * input_file ) /* %endif */ /* %if-c++-only */ /* %endif */ { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /* %if-c++-only */ /* %endif */ /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ /* %if-c-only */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) /* %endif */ /* %if-c++-only */ /* %endif */ { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } /* %if-c-only */ static void yy_load_buffer_state (void) /* %endif */ /* %if-c++-only */ /* %endif */ { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; /* %if-c-only */ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; /* %endif */ /* %if-c++-only */ /* %endif */ (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ /* %if-c-only */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) /* %endif */ /* %if-c++-only */ /* %endif */ { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /* %if-c++-only */ /* %endif */ /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ /* %if-c-only */ void yy_delete_buffer (YY_BUFFER_STATE b ) /* %endif */ /* %if-c++-only */ /* %endif */ { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree( (void *) b->yy_ch_buf ); yyfree( (void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ /* %if-c-only */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) /* %endif */ /* %if-c++-only */ /* %endif */ { int oerrno = errno; yy_flush_buffer( b ); /* %if-c-only */ b->yy_input_file = file; /* %endif */ /* %if-c++-only */ /* %endif */ b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } /* %if-c-only */ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; /* %endif */ /* %if-c++-only */ /* %endif */ errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ /* %if-c-only */ void yy_flush_buffer (YY_BUFFER_STATE b ) /* %endif */ /* %if-c++-only */ /* %endif */ { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /* %if-c-or-c++ */ /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ /* %if-c-only */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) /* %endif */ /* %if-c++-only */ /* %endif */ { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /* %endif */ /* %if-c-or-c++ */ /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ /* %if-c-only */ void yypop_buffer_state (void) /* %endif */ /* %if-c++-only */ /* %endif */ { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* %endif */ /* %if-c-or-c++ */ /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ /* %if-c-only */ static void yyensure_buffer_stack (void) /* %endif */ /* %if-c++-only */ /* %endif */ { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ yy_size_t grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /* %endif */ /* %if-c-only */ /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return NULL; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = NULL; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer( b ); return b; } /* %endif */ /* %if-c-only */ /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (const char * yystr ) { return yy_scan_bytes( yystr, (int) strlen(yystr) ); } /* %endif */ /* %if-c-only */ /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = (yy_size_t) (_yybytes_len + 2); buf = (char *) yyalloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } /* %endif */ #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif /* %if-c-only */ static void yynoreturn yy_fatal_error (const char* msg ) { fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* %endif */ /* %if-c++-only */ /* %endif */ /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* %if-c-only */ /* %if-reentrant */ /* %endif */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ int yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /* %if-reentrant */ /* %endif */ /** Set the current line number. * @param _line_number line number * */ void yyset_lineno (int _line_number ) { yylineno = _line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param _in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * _in_str ) { yyin = _in_str ; } void yyset_out (FILE * _out_str ) { yyout = _out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int _bdebug ) { yy_flex_debug = _bdebug ; } /* %endif */ /* %if-reentrant */ /* %if-bison-bridge */ /* %endif */ /* %endif if-c-only */ /* %if-c-only */ static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ (yy_buffer_stack) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = NULL; (yy_init) = 0; (yy_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = NULL; yyout = NULL; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* %endif */ /* %if-c-only SNIP! this currently causes conflicts with the c++ scanner */ /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer( YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); /* %if-reentrant */ /* %endif */ return 0; } /* %endif */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, const char * s2, int n ) { int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (const char * s ) { int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return malloc(size); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return realloc(ptr, size); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } /* %if-tables-serialization definitions */ /* %define-yytables The name for this specific scanner's tables. */ #define YYTABLES_NAME "yytables" /* %endif */ /* %ok-for-header */ #line 450 "camp.l" asymptote-3.05/symbol.h0000644000000000000000000000533015031566105013645 0ustar rootroot/***** * symbol.h * Andy Hammerlindl 2002/06/18 * * Creates symbols from strings so that multiple calls for a symbol of * the same string will return an identical object. *****/ #ifndef SYMBOL_H #define SYMBOL_H #include #include #include "common.h" using std::ostream; namespace sym { void initTable(); struct GCInit { #ifdef _AIX typedef char * GC_PTR; #endif GCInit() { #ifdef USEGC GC_set_free_space_divisor(2); mem::compact(0); GC_INIT(); #ifdef HAVE_PTHREAD GC_allow_register_threads(); #endif #endif // Put the symbol table into a state where symbols can be translated. initTable(); } }; typedef unsigned int uint; /* The symbol class, just a wrapper around the augmented hash value. This * wrapper is so that * cout << s << endl; * prints the symbol name instead of a meaningless integer. * * This is a lightweight class and should have no virtual functions for speed * reasons. */ struct symbol { // Is there any particular reason why this is in symbol? static GCInit initialize; uint hashplus; #if 0 symbol() {} symbol(uint h) : hashplus(h) {} #endif static symbol nullsym; static symbol initsym; static symbol castsym; static symbol ecastsym; bool special() const { return *this == initsym || *this == castsym || *this == ecastsym; } bool notSpecial() const { return !special(); } // Translate a string into a unique symbol, such that two strings are equal // if and only if their resulting symbols are equal. // len should be equal to strlen(s)+1 static symbol rawTrans(const char *s, size_t len); static symbol literalTrans(string s) { return rawTrans(s.c_str(), s.size() + 1); } static symbol opTrans(string s) { return literalTrans("operator "+s); } static symbol trans(string s) { // Figure out whether it's an operator or an identifier by looking at the // first character. char c=s[0]; return isalpha(c) || c == '_' ? literalTrans(s) : opTrans(s); } // Make a symbol that is guaranteed to be unique. It will not match any other // symbol in the namespace. static symbol gensym(string s); size_t hash() const { return (size_t)this->hashplus; } friend bool operator== (symbol s1, symbol s2) { return s1.hashplus == s2.hashplus; } friend bool operator!= (symbol s1, symbol s2) { return s1.hashplus != s2.hashplus; } friend bool operator< (symbol s1, symbol s2) { return s1.hashplus < s2.hashplus; } operator bool () const { return this->hashplus != 0; } operator string () const; #ifdef USEGC explicit operator std::string() const; #endif friend ostream& operator<< (ostream& out, const symbol sym); }; } // end namespace #endif // SYMBOL_H asymptote-3.05/picture.cc0000644000000000000000000013234315031566105014156 0ustar rootroot/***** * picture.cc * Andy Hammerlindl 2002/06/06 * * Stores a picture as a list of drawElements and handles its output to * PostScript. *****/ #include "errormsg.h" #include "picture.h" #include "util.h" #include "settings.h" #include "interact.h" #include "drawverbatim.h" #include "drawlabel.h" #include "drawlayer.h" #include "drawsurface.h" #include "drawpath3.h" #include "seconds.h" #if defined(_WIN32) #include #include #include #endif #include #include using std::ifstream; using std::ofstream; using vm::array; using namespace settings; using namespace gl; texstream::~texstream() { string texengine=getSetting("tex"); bool context=settings::context(texengine); string name; if(!context) name=stripFile(outname()); name += "texput."; unlink((name+"aux").c_str()); unlink((name+"log").c_str()); unlink((name+"out").c_str()); if(settings::pdf(texengine)) { unlink((name+"pdf").c_str()); unlink((name+"m9").c_str()); } else unlink((name+"pbsdat").c_str()); if(context) { unlink("cont-new.log"); unlink((name+"tex").c_str()); unlink((name+"top").c_str()); unlink((name+"tua").c_str()); unlink((name+"tui").c_str()); } } namespace camp { extern void draw(); bool isIdTransform3(const double* t) { return (t == NULL || (t[0]==1 && t[1]==0 && t[2]==0 && t[3]==0 && t[4]==0 && t[5]==1 && t[6]==0 && t[7]==0 && t[8]==0 && t[9]==0 && t[10]==1 && t[11]==0 && t[12]==0 && t[13]==0 && t[14]==0 && t[15]==1)); } // copy array to 4x4 transform matrix with range checks void copyArray4x4C(double*& dest, const vm::array *a) { double tt[16]; const size_t n=checkArray(a); const string fourbyfour="4x4 array of doubles expected"; if(n != 4) reportError(fourbyfour); for(size_t i=0; i < 4; i++) { const vm::array *ai=vm::read(a,i); const size_t aisize=checkArray(ai); double *tti=tt+4*i; if(aisize == 4) { for(size_t j=0; j < 4; j++) tti[j]=vm::read(ai,j); } else reportError(fourbyfour); } copyTransform3(dest,tt); } void copyTransform3(double*& d, const double* s, GCPlacement placement) { if(s != NULL) { if(d == NULL) d=placement == NoGC ? new double[16] : new(placement) double[16]; memcpy(d,s,sizeof(double)*16); } } // t = s*r void multiplyTransform3(double*& t, const double* s, const double* r) { if(isIdTransform3(s)) { copyTransform3(t,r); } else if(isIdTransform3(r)) { copyTransform3(t,s); } else { t=new(UseGC) double[16]; for(size_t i=0; i < 4; i++) { size_t i4=4*i; const double *si=s+i4; const double& s0=si[0]; const double& s1=si[1]; const double& s2=si[2]; const double& s3=si[3]; double *ti=t+i4; ti[0]=s0*r[0]+s1*r[4]+s2*r[8]+s3*r[12]; ti[1]=s0*r[1]+s1*r[5]+s2*r[9]+s3*r[13]; ti[2]=s0*r[2]+s1*r[6]+s2*r[10]+s3*r[14]; ti[3]=s0*r[3]+s1*r[7]+s2*r[11]+s3*r[15]; } } } double xratio(const triple& v) {return v.getx()/v.getz();} double yratio(const triple& v) {return v.gety()/v.getz();} class matrixstack { mem::stack mstack; public: // return current transform const double* T() const { if(mstack.empty()) return NULL; else return mstack.top(); } // we store the accumulated transform of all pushed transforms void push(const double *r) { double* T3 = NULL; multiplyTransform3(T3,T(),r); mstack.push(T3); } void pop() { if(!mstack.empty()) mstack.pop(); } }; const char *texpathmessage() { ostringstream buf; buf << "the directory containing your " << getSetting("tex") << " engine (" << texcommand() << ")"; return Strdup(buf.str()); } picture::~picture() { } void picture::enclose(drawElement *begin, drawElement *end) { assert(begin); assert(end); nodes.push_front(begin); lastnumber=0; lastnumber3=0; for(nodelist::iterator p=nodes.begin(); p != nodes.end(); ++p) { assert(*p); if((*p)->islayer()) { nodes.insert(p,end); ++p; while(p != nodes.end() && (*p)->islayer()) ++p; if(p == nodes.end()) return; nodes.insert(p,begin); } } nodes.push_back(end); } // Insert at beginning of picture. void picture::prepend(drawElement *p) { assert(p); nodes.push_front(p); lastnumber=0; lastnumber3=0; } void picture::append(drawElement *p) { assert(p); nodes.push_back(p); } void picture::add(picture &pic) { if (&pic == this) return; // STL's funny way of copying one list into another. copy(pic.nodes.begin(), pic.nodes.end(), back_inserter(nodes)); } // Insert picture pic at beginning of picture. void picture::prepend(picture &pic) { if (&pic == this) return; copy(pic.nodes.begin(), pic.nodes.end(), inserter(nodes, nodes.begin())); lastnumber=0; lastnumber3=0; } bool picture::havelabels() { size_t n=nodes.size(); if(n > lastnumber && !labels && getSetting("tex") != "none") { // Check to see if there are any labels yet nodelist::iterator p=nodes.begin(); for(size_t i=0; i < lastnumber; ++i) ++p; for(; p != nodes.end(); ++p) { assert(*p); if((*p)->islabel()) { labels=true; break; } } } return labels; } bool picture::have3D() { for(nodelist::iterator p=nodes.begin(); p != nodes.end(); ++p) { assert(*p); if((*p)->is3D()) return true; } return false; } bool picture::havepng() { for(nodelist::iterator p=nodes.begin(); p != nodes.end(); ++p) { assert(*p); if((*p)->svgpng()) return true; } return false; } unsigned int picture::pagecount() { unsigned int c=1; for(nodelist::iterator p=nodes.begin(); p != nodes.end(); ++p) { assert(*p); if((*p)->isnewpage()) ++c; } return c; } bbox picture::bounds() { size_t n=nodes.size(); if(n == lastnumber) return b_cached; if(lastnumber == 0) { // Maybe these should be put into a structure. b_cached=bbox(); labelbounds.clear(); bboxstack.clear(); } if(havelabels()) texinit(); nodelist::iterator p=nodes.begin(); processDataStruct& pd=processData(); for(size_t i=0; i < lastnumber; ++i) ++p; for(; p != nodes.end(); ++p) { assert(*p); (*p)->bounds(b_cached,pd.tex,labelbounds,bboxstack); // Optimization for interpreters with fixed stack limits. if((*p)->endclip()) { nodelist::iterator q=p; if(q != nodes.begin()) { --q; assert(*q); if((*q)->endclip()) (*q)->save(false); } } } lastnumber=n; return b_cached; } bbox3 picture::bounds3() { size_t n=nodes.size(); if(n == lastnumber3) return b3; if(lastnumber3 == 0) b3=bbox3(); matrixstack ms; for(nodelist::const_iterator p=nodes.begin(); p != nodes.end(); ++p) { assert(*p); if((*p)->begingroup3()) ms.push((*p)->transf3()); else if((*p)->endgroup3()) ms.pop(); else (*p)->bounds(ms.T(),b3); } lastnumber3=n; return b3; } pair picture::ratio(double (*m)(double, double)) { bool first=true; pair b; bounds3(); double fuzz=Fuzz*(b3.Max()-b3.Min()).length(); matrixstack ms; for(nodelist::const_iterator p=nodes.begin(); p != nodes.end(); ++p) { assert(*p); if((*p)->begingroup3()) ms.push((*p)->transf3()); else if((*p)->endgroup3()) ms.pop(); else (*p)->ratio(ms.T(),b,m,fuzz,first); } return b; } void texinit() { drawElement::lastpen=pen(initialpen); processDataStruct &pd=processData(); // Output any new texpreamble commands if(pd.tex.isopen()) { if(pd.TeXpipepreamble.empty()) return; texpreamble(pd.tex,pd.TeXpipepreamble,true); pd.TeXpipepreamble.clear(); return; } bool context=settings::context(getSetting("tex")); string dir=stripFile(outname()); string logname; if(!context) logname=dir; logname += "texput.log"; const char *cname=logname.c_str(); ofstream writeable(cname); if(!writeable) reportError("Cannot write to "+logname); else writeable.close(); unlink(cname); dir=dir.substr(0,dir.length()-1); mem::vector cmd; cmd.push_back(texprogram()); string oldPath; if(context) { if(!dir.empty()) { oldPath=getPath(); setPath(dir.c_str()); } cmd.push_back("--pipe"); } else { if(!dir.empty()) cmd.push_back("-output-directory="+dir); string jobname="texput"; if(getSetting("inlineimage") || getSetting("inlinetex")) { string name=stripDir(stripExt((outname()))); size_t pos=name.rfind("-"); if(pos < string::npos) { name=stripExt(name).substr(0,pos); unlink((name+".aux").c_str()); jobname=name.substr(0,pos); cmd.push_back("-jobname="+jobname); #ifdef __MSDOS__ cmd.push_back("NUL"); // For MikTeX #endif } } cmd.push_back("\\scrollmode"); } pd.tex.open(cmd,"texpath"); pd.tex.wait("\n*"); pd.tex << "\n"; texdocumentclass(pd.tex,true); texdefines(pd.tex,pd.TeXpreamble,true); pd.TeXpipepreamble.clear(); } int opentex(const string& texname, const string& prefix, bool dvi) { string aux=auxname(prefix,"aux"); unlink(aux.c_str()); bool context=settings::context(getSetting("tex")); mem::vector cmd; cmd.push_back(texprogram()); if(dvi) cmd.push_back("-output-format=dvi"); string dir=stripFile(texname); dir=dir.substr(0,dir.length()-1); string oldPath; if(context) { if(!dir.empty()) { oldPath=getPath(); setPath(dir.c_str()); } cmd.push_back("--nonstopmode"); cmd.push_back(texname); } else { if(!dir.empty()) cmd.push_back("-output-directory="+dir); cmd.push_back("\\nonstopmode\\input"); cmd.push_back(stripDir(texname)); } bool quiet=verbose <= 1; int status=System(cmd,quiet ? 1 : 0,true,"texpath",texpathmessage()); if(!status && getSetting("twice")) status=System(cmd,quiet ? 1 : 0,true,"texpath",texpathmessage()); if(status) { if(quiet) { cmd[1]=context ? "--scrollmode" : "\\scrollmode\\input"; System(cmd,0); } } if(context && !oldPath.empty()) setPath(oldPath.c_str()); return status; } string dvisvgmCommand(mem::vector& cmd, const string& outname) { string dir=stripFile(outname); string oldPath; if(!dir.empty()) { oldPath=getPath(); setPath(dir.c_str()); } cmd.push_back(getSetting("dvisvgm")); cmd.push_back("-n"); cmd.push_back("-v3"); string libgs=getSetting("libgs"); if(!libgs.empty()) cmd.push_back("--libgs="+libgs); push_split(cmd,getSetting("dvisvgmOptions")); string outfile=stripDir(outname); if(!outfile.empty()) cmd.push_back("-o"+outfile); return oldPath; } bool picture::texprocess(const string& texname, const string& outname, const string& prefix, const pair& bboxshift, bool svg) { int status=1; ifstream outfile; outfile.open(texname.c_str()); bool keep=getSetting("keep"); if(outfile) { outfile.close(); status=opentex(texname,prefix); string texengine=getSetting("tex"); if(status == 0) { string dviname=auxname(prefix,"dvi"); mem::vector cmd; if(svg) { string name=deconstruct ? buildname(prefix+"_%1p","svg") : outname; string oldPath=dvisvgmCommand(cmd,name); cmd.push_back(stripDir(dviname)); if(deconstruct) cmd.push_back("-p1-"); status=System(cmd,0,true,"dvisvgm"); if(!oldPath.empty()) setPath(oldPath.c_str()); if(!keep) unlink(dviname.c_str()); } else { if(!settings::pdf(texengine)) { string psname=auxname(prefix,"ps"); double height=b.top-b.bottom+1.0; // Magic dvips offsets: double hoffset=-128.4; double vertical=height; if(!latex(texengine)) vertical += 2.0; double voffset=(vertical < 13.0) ? -137.8+vertical : -124.8; double paperHeight=getSetting("paperheight"); hoffset += b.left+bboxshift.getx(); voffset += paperHeight-height-b.bottom-bboxshift.gety(); string dvipsrc=getSetting("dir"); if(dvipsrc.empty()) dvipsrc=systemDir; dvipsrc += dirsep+"nopapersize.ps"; setenv("DVIPSRC",dvipsrc.c_str(),true); string papertype=getSetting("papertype") == "letter" ? "letterSize" : "a4size"; cmd.push_back(getSetting("dvips")); cmd.push_back("-R"); cmd.push_back("-Pdownload35"); cmd.push_back("-D600"); cmd.push_back("-O"+String(hoffset)+"bp,"+String(voffset)+"bp"); bool ps=pagecount() > 1; cmd.push_back("-T"+String(getSetting("paperwidth"))+"bp,"+ String(paperHeight)+"bp"); push_split(cmd,getSetting("dvipsOptions")); if(ps && getSetting("papertype") != "") cmd.push_back("-t"+papertype); if(verbose <= 1) cmd.push_back("-q"); cmd.push_back("-o"+psname); cmd.push_back(dviname); status=System(cmd,0,true,"dvips"); if(status == 0) { ifstream fin(psname.c_str()); psfile fout(outname,false); string s; bool first=true; transform t=shift(bboxshift)*T; bool shift=!t.isIdentity(); const string beginspecial="TeXDict begin @defspecial"; const size_t beginlength=beginspecial.size(); const string endspecial="@fedspecial end"; const size_t endlength=endspecial.size(); bool inpapersize=false; while(getline(fin,s)) { if (inpapersize) { if(s.find("%%EndPaperSize") == 0) inpapersize=false; continue; } else { if (s.find("%%BeginPaperSize:") == 0) { inpapersize=true; continue; } } if (s[0] == '%') { if (s.find("%%DocumentPaperSizes:") == 0) continue; if(s.find("%!PS-Adobe-") == 0) { fout.header(!ps); continue; } if (first && s.find("%%BoundingBox:") == 0) { bbox box=b.shift(bboxshift); if(verbose > 2) BoundingBox(cout,box); fout.BoundingBox(box); first=false; continue; } } if (shift) { if (s.compare(0, beginlength, beginspecial) == 0) { fout.verbatimline(s); fout.gsave(); fout.concat(t); continue; } if (s.compare(0, endlength, endspecial) == 0) { fout.grestore(); fout.verbatimline(s); continue; } } // For the default line, output it unchanged. fout.verbatimline(s); } } if(!keep) { unlink(dviname.c_str()); unlink(psname.c_str()); } } } } if(!keep) { unlink(texname.c_str()); if(!getSetting("keepaux")) unlink(auxname(prefix,"aux").c_str()); unlink(auxname(prefix,"log").c_str()); unlink(auxname(prefix,"out").c_str()); string dir=stripFile(prefix); unlink((dir+"texput.log").c_str()); unlink((dir+"texput.aux").c_str()); if(settings::context(texengine)) { unlink(auxname(prefix,"top").c_str()); unlink(auxname(prefix,"tua").c_str()); unlink(auxname(prefix,"tuc").c_str()); unlink(auxname(prefix,"tui").c_str()); unlink(auxname(prefix,"tuo").c_str()); } } if(status == 0) return true; } return false; } int picture::epstopdf(const string& epsname, const string& pdfname) { string outputformat=getSetting("outformat"); bool pdf=settings::pdf(getSetting("tex")); bool pdfformat=(pdf && outputformat == "") || outputformat == "pdf"; string compress=getSetting("compress") && pdfformat ? "true" : "false"; mem::vector cmd; cmd.push_back(getSetting("gs")); cmd.push_back("-q"); cmd.push_back("-dNOPAUSE"); cmd.push_back("-dBATCH"); cmd.push_back("-P"); if(safe) cmd.push_back("-dSAFER"); cmd.push_back("-dALLOWPSTRANSPARENCY"); // Support transparency extensions. cmd.push_back("-sDEVICE=pdfwrite"); cmd.push_back("-dEPSCrop"); cmd.push_back("-dSubsetFonts=true"); cmd.push_back("-dEmbedAllFonts=true"); cmd.push_back("-dMaxSubsetPct=100"); cmd.push_back("-dEncodeColorImages="+compress); cmd.push_back("-dEncodeGrayImages="+compress); cmd.push_back("-dCompatibilityLevel=1.5"); cmd.push_back("-dTransferFunctionInfo=/Apply"); if(!getSetting("autorotate")) cmd.push_back("-dAutoRotatePages=/None"); cmd.push_back("-g"+String(max(ceil(getSetting("paperwidth")),1.0)) +"x"+String(max(ceil(getSetting("paperheight")),1.0))); cmd.push_back("-dDEVICEWIDTHPOINTS="+String(max(b.right-b.left,3.0))); cmd.push_back("-dDEVICEHEIGHTPOINTS="+String(max(b.top-b.bottom,3.0))); push_split(cmd,getSetting("gsOptions")); cmd.push_back("-sOutputFile="+stripDir(pdfname)); if(safe) { cmd.push_back("-c"); cmd.push_back(".setsafe"); cmd.push_back("-f"); } cmd.push_back(stripDir(epsname)); char *oldPath=NULL; string dir=stripFile(pdfname); if(!dir.empty()) { oldPath=getPath(); setPath(dir.c_str()); } int status=System(cmd,0,true,"gs","Ghostscript"); if(oldPath != NULL) setPath(oldPath); return status; } int picture::pdftoeps(const string& pdfname, const string& epsname, bool eps) { mem::vector cmd; cmd.push_back(getSetting("gs")); cmd.push_back("-q"); cmd.push_back("-dNoOutputFonts"); cmd.push_back("-dNOPAUSE"); cmd.push_back("-dBATCH"); cmd.push_back("-P"); if(safe) cmd.push_back("-dSAFER"); string texengine=getSetting("tex"); cmd.push_back("-sDEVICE="+getSetting(eps ? "epsdriver": "psdriver")); cmd.push_back("-sOutputFile="+stripDir(epsname)); cmd.push_back(stripDir(pdfname)); char *oldPath=NULL; string dir=stripFile(epsname); if(!dir.empty()) { oldPath=getPath(); setPath(dir.c_str()); } int status=System(cmd,0,true,"gs","Ghostscript"); if(oldPath != NULL) setPath(oldPath); return status; } bool picture::reloadPDF(const string& Viewer, const string& outname) const { static bool needReload=true; static bool haveReload=false; string reloadprefix="reload"; if(needReload) { needReload=false; string name=getPath()+string("/")+outname; // Write javascript code to redraw picture. runString("settings.tex='pdflatex'; tex('\\ \\pdfannot width 0pt height 0pt { /AA << /PO << /S /JavaScript /JS (try{reload(\""+name+"\");} catch(e) {} closeDoc(this);) >> >> }'); shipout('"+reloadprefix+"',wait=false,view=false);erase();exit();",false); haveReload=true; } if(haveReload) { mem::vector cmd; push_command(cmd,Viewer); string pdfreloadOptions=getSetting("pdfreloadOptions"); if(!pdfreloadOptions.empty()) cmd.push_back(pdfreloadOptions); cmd.push_back(reloadprefix+".pdf"); System(cmd,0,false); } return true; } int picture::epstosvg(const string& epsname, const string& outname, unsigned int pages) { string oldPath; int status=0; if(deconstruct && getSetting("dvisvgmMultipleFiles")) { mem::vector cmd; oldPath=dvisvgmCommand(cmd,stripFile(outname)); for(unsigned i=1; i <= pages; ++i) { ostringstream buf; buf << epsname << i << ".ps"; cmd.push_back(buf.str()); } cmd.push_back("-E"); status=System(cmd,0,true,"dvisvgm"); for(unsigned i=1; i <= pages; ++i) { ostringstream buf; buf << epsname << i << ".ps"; if(!getSetting("keep")) unlink(buf.str().c_str()); } if(!oldPath.empty()) setPath(oldPath.c_str()); } else { string outprefix=stripExt(outname); for(unsigned i=1; i <= pages; ++i) { mem::vector cmd; ostringstream out; out << outprefix; if(deconstruct) out << "_" << i; out << ".svg"; oldPath=dvisvgmCommand(cmd,out.str()); ostringstream buf; buf << epsname << i << ".ps"; cmd.push_back(buf.str()); cmd.push_back("-E"); status=System(cmd,0,true,"dvisvgm"); if(!getSetting("keep")) unlink(buf.str().c_str()); if(!oldPath.empty()) setPath(oldPath.c_str()); if(status != 0) break; } } return status; } void htmlView(string name) { string const browser=getSetting("htmlviewer"); string const htmlFile=locateFile(name, true); if (browser.empty()) { #if defined(_WIN32) // for windows, no browser means to use the windows' default auto const result = reinterpret_cast( ShellExecuteA( nullptr, "open", htmlFile.c_str(), nullptr, nullptr, SW_SHOWNORMAL )); // see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutea if (result <= 32) { // error code should be stored in GetLastError w32::reportAndFailWithLastError( "Cannot open browser for viewing"); } #else reportError("No browser specified; please specify your browser in htmlviewer"); #endif } else { string const browserOptions= getSetting("htmlviewerOptions"); mem::vector cmd; push_command(cmd, browser); cmd.push_back(htmlFile); if (browserOptions.empty()) { push_split(cmd, browserOptions); } System(cmd, 2, false); } } bool picture::postprocess(const string& prename, const string& outname, const string& outputformat, bool wait, bool view, bool pdftex, bool epsformat, bool svg) { int status=0; bool pdf=settings::pdf(getSetting("tex")); bool pdfformat=(pdf && outputformat == "") || outputformat == "pdf"; mem::vector cmd; if(pdftex || !epsformat) { if(pdfformat) { if(pdftex) { status=renameOverwrite(prename.c_str(),outname.c_str()); if(status != 0) reportError("Cannot rename "+prename+" to "+outname); } else status=epstopdf(prename,outname); } else if(epsformat) { if(svg) { string psname=stripExt(prename); status=pdftoeps(prename,psname+"%d.ps",false); if(status != 0) return false; status=epstosvg(stripDir(psname),outname,pagecount()); if(status != 0) return false; epsformat=false; } else status=pdftoeps(prename,outname); } else { double render=fabs(getSetting("render")); if(render == 0) render=1.0; double res=render*72.0; Int antialias=getSetting("antialias"); if(outputformat == "png" && antialias == 2) { cmd.push_back(getSetting("gs")); cmd.push_back("-q"); cmd.push_back("-dNOPAUSE"); cmd.push_back("-dBATCH"); cmd.push_back("-P"); cmd.push_back("-sDEVICE="+getSetting("pngdriver")); if(safe) cmd.push_back("-dSAFER"); cmd.push_back("-r"+String(res)+"x"+String(res)); push_split(cmd,getSetting("gsOptions")); cmd.push_back("-sOutputFile="+outname); cmd.push_back("-dTextAlphaBits=4"); cmd.push_back("-dGraphicsAlphaBits=4"); cmd.push_back(prename); status=System(cmd,0,true,"gs","Ghostscript"); } else if(!svg && !xasy) { double expand=antialias; if(expand < 2.0) expand=1.0; res *= expand; string s=getSetting("convert"); cmd.push_back(s); cmd.push_back("-density"); cmd.push_back(String(res)+"x"+String(res)); cmd.push_back(prename); if(expand == 1.0) cmd.push_back("+antialias"); push_split(cmd,getSetting("convertOptions")); cmd.push_back("-resize"); cmd.push_back(String(100.0/expand)+"%x"); if(outputformat == "jpg") cmd.push_back("-flatten"); cmd.push_back(outputformat+":"+outname); status=System(cmd,0,true,"convert"); } } if(!getSetting("keep")) unlink(prename.c_str()); } if(status != 0) return false; if(verbose > 0 && !deconstruct) cout << "Wrote " << outname << endl; return display(outname,outputformat,wait,view,epsformat); } bool picture::display(const string& outname, const string& outputformat, bool wait, bool view, bool epsformat) { static mem::map pids; if (settings::view() && view) { int status; bool const pdf=settings::pdf(getSetting("tex")); bool pdfformat=(pdf && outputformat.empty()) || outputformat == "pdf"; if(epsformat || pdfformat) { // Check to see if there is an existing viewer for this outname. mem::map::iterator const p=pids.find(outname); bool running=(p != pids.end()); string Viewer= pdfformat ? getSetting("pdfviewer") : getSetting("psviewer"); int pid; if(running) { pid=p->second; if(pid) { #if defined(_WIN32) running=w32::isProcessRunning(pid); #else running= (waitpid(pid, &status, WNOHANG) != pid); #endif } } bool pdfreload=pdfformat && getSetting("pdfreload"); if(running) { #if defined(_WIN32) if (pdfreload) { reloadPDF(Viewer,outname); } #else // win32 does not support reload by sighup // Tell gv/acroread to reread file. if(Viewer == "gv") { kill(pid,SIGHUP); } else if(pdfreload) { reloadPDF(Viewer,outname); } #endif } else { // start new process if (Viewer.empty()) { #if defined(_WIN32) // no viewer, use default string const fullOutFilePath= locateFile(outname, true); SHELLEXECUTEINFOA execInfo = {}; execInfo.cbSize= sizeof(execInfo); execInfo.hwnd = nullptr; execInfo.lpVerb= "open"; execInfo.lpFile= fullOutFilePath.c_str(); execInfo.lpDirectory = nullptr; execInfo.nShow= SW_SHOWNORMAL; execInfo.fMask= SEE_MASK_NOCLOSEPROCESS; if (!ShellExecuteExA(&execInfo)) { return false; } if (!w32::checkShellExecuteResult(reinterpret_cast(execInfo.hInstApp),false)) { // see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/ns-shellapi-shellexecuteinfoa return false; } if (execInfo.hProcess!=nullptr) { // wait option does not always work, especially if a new process is not created // for example, if an existing PDF viewer with multiple tabs open is the viewer, // asymptote thinks no process is being created; // in this case, treat it as "no wait" pid=static_cast(GetProcessId(execInfo.hProcess)); CloseHandle(execInfo.hProcess); } #else cerr << "No viewer specified" << endl; return false; #endif } else { string viewerOptions= getSetting(pdfformat ? "pdfviewerOptions" : "psviewerOptions"); mem::vector cmd; push_command(cmd, Viewer); if (!viewerOptions.empty()) push_split(cmd, viewerOptions); cmd.push_back(outname); status=System(cmd, 0, wait, pdfformat ? "pdfviewer" : "psviewer", pdfformat ? "your PDF viewer" : "your PostScript viewer", &pid); if (status != 0) return false; } if(!wait) pids[outname]=pid; if(pdfreload) { // Work around race conditions in acroread initialization script std::this_thread::sleep_for(std::chrono::microseconds( getSetting("pdfreloaddelay") )); // Only reload if pdf viewer process is already running #if defined(_WIN32) bool processRunning=w32::isProcessRunning(pid); #else bool processRunning= waitpid(pid, &status, WNOHANG) == pid; #endif if (processRunning) reloadPDF(Viewer,outname); } } } else { if(outputformat == "svg" || outputformat == "html") htmlView(outname); else { string displayProgram=getSetting("display"); if (displayProgram.empty()) { #if defined(_WIN32) auto const result = reinterpret_cast(ShellExecuteA( nullptr, "open", outname.c_str(), nullptr, nullptr, SW_SHOWNORMAL)); if (result <= 32) { cerr << "Cannot start display viewer" << endl; return false; } #else cerr << "No viewer specified; please specify a viewer in 'display' setting" << endl; return false; #endif } else { mem::vector cmd; push_command(cmd, displayProgram); cmd.push_back(outname); string const application= "your " + outputformat + " viewer"; status= System(cmd, 0, wait, "display", application.c_str()); if (status != 0) return false; } } } } return true; } string Outname(const string& prefix, const string& outputformat, bool standardout, string aux="") { return standardout ? "-" : buildname(prefix,outputformat,aux); } bool picture::shipout(picture *preamble, const string& Prefix, const string& format, bool wait, bool view) { bool keep=getSetting("keep"); string aux=""; b=bounds(); bool empty=b.empty; string outputformat=format.empty() ? defaultformat() : format; bool htmlformat=outputformat == "html"; if(htmlformat) { outputformat="svg"; aux="_"; if(view) view=false; else htmlformat=false; } if(outputformat == "v3d") camp::reportError("v3d format only supports 3D files"); bool svgformat=outputformat == "svg"; bool png=outputformat == "png"; string texengine=getSetting("tex"); string texengineSave; if(!empty && !deconstruct && (png || (svgformat && havepng())) && texengine == "latex") { texengineSave=texengine; Setting("tex")=texengine="pdflatex"; } bool usetex=texengine != "none"; bool TeXmode=getSetting("inlinetex") && usetex; bool pdf=settings::pdf(texengine); bool standardout=Prefix == "-"; string prefix=standardout ? standardprefix : Prefix; string preformat=nativeformat(); bool epsformat=outputformat == "eps"; bool pdfformat=pdf || png || outputformat == "pdf"; bool dvi=false; bool svg=svgformat && usetex && (!have3D() || getSetting("render") == 0.0); if(svg) { if(pdf) epsformat=true; else dvi=true; } string outname=Outname(prefix,outputformat,standardout,aux); string epsname=epsformat ? (standardout ? "" : outname) : auxname(prefix,"eps"); bool Labels=labels || TeXmode; bool Empty=b.right-b.left < 1.0 || b.top-b.bottom < 1.0; if(png && Empty) empty=true; if(Empty && (svgformat || htmlformat)) return true; if(empty && !Labels) { // Output a null file bbox b; b.left=b.bottom=0; b.right=b.top=1; psfile out(epsname,false); out.prologue(b); out.epilogue(); out.close(); return postprocess(epsname,outname,outputformat,wait,view,false, epsformat,false); } if(svg || png) Labels=true; if(Labels) prefix=cleanpath(prefix); string prename=((epsformat && !pdf) || !Labels) ? epsname : auxname(prefix,preformat); SetPageDimensions(); pair aligndir=getSetting("aligndir"); string origin=getSetting("align"); pair bboxshift=(origin == "Z" && epsformat) ? pair(0.0,0.0) : pair(-b.left,-b.bottom); if(epsformat) { bboxshift += getSetting("offset"); double yexcess=max(getSetting("paperheight")- (b.top-b.bottom+1.0),0.0); double xexcess=max(getSetting("paperwidth")- (b.right-b.left+1.0),0.0); if(aligndir == pair(0,0)) { if(origin != "Z" && origin != "B") { if(origin == "T") bboxshift += pair(0.0,yexcess); else bboxshift += pair(0.5*xexcess,0.5*yexcess); } } else { double scale=max(fabs(aligndir.getx()),fabs(aligndir.gety())); if(scale != 0) aligndir *= 0.5/scale; bboxshift += pair((aligndir.getx()+0.5)*xexcess,(aligndir.gety()+0.5)*yexcess); } } bool status=true; string texname; texfile *tex=NULL; if(Labels) { texname=TeXmode ? buildname(prefix,"tex") : auxname(prefix,"tex"); tex=dvi ? new svgtexfile(texname,b,false,deconstruct) : new texfile(texname,b); tex->prologue(deconstruct); } nodelist::iterator layerp=nodes.begin(); nodelist::iterator p=layerp; unsigned layer=0; mem::list files; bbox bshift=b; int svgcount=0; typedef mem::list clipstack; clipstack begin; while(p != nodes.end()) { string psname,pdfname; if(Labels) { ostringstream buf; buf << prefix << "_" << layer; psname=buildname(buf.str(),"eps"); if(pdf) pdfname=buildname(buf.str(),"pdf"); } else { psname=epsname; bshift=bshift.shift(bboxshift); } files.push_back(psname); if(pdf) files.push_back(pdfname); psfile out(psname,pdfformat); out.prologue(bshift); if(!Labels) { out.gsave(); out.translate(bboxshift); } if(preamble) { // Postscript preamble. nodelist Nodes=preamble->nodes; nodelist::iterator P=Nodes.begin(); if(P != Nodes.end()) { out.resetpen(); for(; P != Nodes.end(); ++P) { assert(*P); (*P)->draw(&out); } } } out.resetpen(); bool postscript=false; drawLabel *L=NULL; if(dvi) for(nodelist::const_iterator r=begin.begin(); r != begin.end(); ++r) (*r)->draw(&out); processDataStruct &pd=processData(); for(; p != nodes.end(); ++p) { assert(*p); if(Labels && (*p)->islayer()) break; if(dvi && (*p)->svg()) { picture *f=(*p)->svgpng() ? new picture : NULL; nodelist::const_iterator q=layerp; for(;;) { if((*q)->beginclip()) begin.push_back(*q); else if((*q)->endclip()) { if(begin.size() < 1) reportError("endclip without matching beginclip"); begin.pop_back(); } if(q == p) break; ++q; } if(f) { for(nodelist::const_iterator r=begin.begin(); r != begin.end(); ++r) f->append(*r); f->append(*(q++)); } while(q != nodes.end() && !(*q)->islayer()) ++q; clipstack end; for(nodelist::const_iterator r=--q;; --r) { if((*r)->beginclip() && end.size() >= 1) end.pop_back(); else if((*r)->endclip()) end.push_back(*r); if(r == p) break; } for(nodelist::reverse_iterator r=end.rbegin(); r != end.rend(); ++r) { (*r)->draw(&out); if(f) f->append(*r); } if(f) { ostringstream buf; buf << prefix << "_" << svgcount; ++svgcount; string pngname=buildname(buf.str(),"png"); f->shipout(preamble,buf.str(),"png",false,false); pair m=f->bounds().Min(); pair M=f->bounds().Max(); delete f; pair size=M-m; ostringstream cmd; cmd << "\\special{dvisvgm:img " << size.getx()*ps2tex << " " << size.gety()*ps2tex << " " << pngname << "}"; static pen P; static pair zero; L=new drawLabel(cmd.str(),"",identity,pair(m.getx(),M.gety()),zero,P); texinit(); L->bounds(b_cached,pd.tex,labelbounds,bboxstack); postscript=true; } break; } else postscript |= (*p)->draw(&out); } if(Labels) { if(!svg || pdf) tex->beginlayer(pdf ? pdfname : psname,postscript); } else out.grestore(); out.epilogue(); out.close(); if(Labels) { tex->resetpen(); if(pdf && !b.empty) { status=(epstopdf(psname,pdfname) == 0); if(!keep) unlink(psname.c_str()); } if(status) { for (p=layerp; p != nodes.end(); ++p) { assert(*p); bool islayer=(*p)->islayer(); if(dvi && (*p)->svg()) { islayer=true; if((*p)->svgpng()) L->write(tex,b); else (*p)->draw(tex); } else (*p)->write(tex,b); if(islayer) { tex->endlayer(); layerp=++p; layer++; break; } } } } } bool context=settings::context(texengine); if(status) { if(TeXmode) { if(Labels && verbose > 0) cout << "Wrote " << texname << endl; delete tex; } else { if(Labels) { tex->epilogue(); if(context) prefix=stripDir(prefix); delete tex; status=texprocess(texname,dvi ? outname : prename,prefix, bboxshift,dvi); if(!keep) { for(mem::list::iterator p=files.begin(); p != files.end(); ++p) unlink(p->c_str()); } } if(status) { if(context) prename=stripDir(prename); status=postprocess(prename,outname,outputformat,wait, view,pdf && Labels,epsformat,svg); if(pdfformat && !keep) { unlink(auxname(prefix,"m9").c_str()); unlink(auxname(prefix,"pbsdat").c_str()); } } } } if(!status) reportError("shipout failed"); if(!texengineSave.empty()) Setting("tex")=texengineSave; if(htmlformat) { jsfile out; out.svgtohtml(prefix); string name=buildname(prefix,"html"); display(name,"html",wait,true,false); if(!keep) unlink(outname.c_str()); } return true; } // render viewport with width x height pixels. void picture::render(double size2, const triple& Min, const triple& Max, double perspective, bool remesh) const { for(nodelist::const_iterator p=nodes.begin(); p != nodes.end(); ++p) { assert(*p); if(remesh) (*p)->meshinit(); (*p)->render(size2,Min,Max,perspective,remesh); } #ifdef HAVE_GL drawBuffers(); #endif } typedef gl::GLRenderArgs Communicate; Communicate com; extern bool allowRender; void glrenderWrapper() { #ifdef HAVE_GL #ifdef HAVE_PTHREAD wait(initSignal,initLock); endwait(initSignal,initLock); #endif if(allowRender) glrender(com); #endif } bool picture::shipout3(const string& prefix, const string& format, double width, double height, double angle, double zoom, const triple& m, const triple& M, const pair& shift, const pair& margin, double *t, double *tup, double *background, size_t nlights, triple *lights, double *diffuse, double *specular, bool view) { if(getSetting("interrupt")) return true; if(width <= 0 || height <= 0) return false; bool webgl=format == "html"; bool v3d=format == "v3d"; #ifndef HAVE_LIBGLM if(webgl) camp::reportError("to support WebGL rendering, please install glm header files, then ./configure; make"); if(v3d) camp::reportError("to support V3D rendering, please install glm header files, then ./configure; make"); #endif #ifndef HAVE_LIBOSMESA #ifndef HAVE_GL if(!webgl) camp::reportError("to support onscreen OpenGL rendering; please install the glut library, then ./configure; make"); #endif #endif picture *pic = new picture; matrixstack ms; for(nodelist::const_iterator p=nodes.begin(); p != nodes.end(); ++p) { assert(*p); if((*p)->begingroup3()) ms.push((*p)->transf3()); else if((*p)->endgroup3()) ms.pop(); else pic->append((*p)->transformed(ms.T())); } pic->b3=bbox3(); for(nodelist::iterator p=pic->nodes.begin(); p != pic->nodes.end(); ++p) { assert(*p); (*p)->bounds(pic->b3); } pic->lastnumber3=pic->nodes.size(); for(nodelist::iterator p=pic->nodes.begin(); p != pic->nodes.end(); ++p) { assert(*p); (*p)->displacement(); } const string outputformat=format.empty() ? getSetting("outformat") : format; #ifdef HAVE_LIBGLM static int oldpid=0; bool View=settings::view() && view; #endif #ifdef HAVE_GL bool offscreen=false; #ifdef HAVE_LIBOSMESA offscreen=true; #endif #ifdef HAVE_PTHREAD bool animating=getSetting("animating"); bool Wait=!interact::interactive || !View || animating; #endif #endif bool format3d=webgl || v3d; if(!format3d) { #ifdef HAVE_GL if(glthread && !offscreen) { #ifdef HAVE_PTHREAD if(gl::initialize) { gl::initialize=false; com.prefix=prefix; com.pic=pic; com.format=outputformat; com.width=width; com.height=height; com.angle=angle; com.zoom=zoom; com.m=m; com.M=M; com.shift=shift; com.margin=margin; com.t=t; com.tup=tup; com.background=background; com.nlights=nlights; com.lights=lights; com.diffuse=diffuse; com.specular=specular; com.view=View; if(Wait) pthread_mutex_lock(&readyLock); allowRender=true; wait(initSignal,initLock); endwait(initSignal,initLock); static bool initialize=true; if(initialize) { wait(initSignal,initLock); endwait(initSignal,initLock); initialize=false; } if(Wait) { pthread_cond_wait(&readySignal,&readyLock); pthread_mutex_unlock(&readyLock); } return true; } if(Wait) pthread_mutex_lock(&readyLock); #endif } else { #if !defined(_WIN32) int pid=fork(); if(pid == -1) camp::reportError("Cannot fork process"); if(pid != 0) { oldpid=pid; waitpid(pid,NULL,interact::interactive && View ? WNOHANG : 0); return true; } #else #pragma message("TODO: Check if (1) we need detach-based gl renderer") #endif } #endif } #if HAVE_LIBGLM gl::GLRenderArgs args; args.prefix=prefix; args.pic=pic; args.format=outputformat; args.width=width; args.height=height; args.angle=angle; args.zoom=zoom; args.m=m; args.M=M; args.shift=shift; args.margin=margin; args.t=t; args.tup=tup; args.background=background; args.nlights=nlights; args.lights=lights; args.diffuse=diffuse; args.specular=specular; args.view=View; glrender(args,oldpid); if(format3d) { string name=buildname(prefix,format); abs3Doutfile *fileObj=nullptr; if(webgl) fileObj=new jsfile(name); else if(v3d) #ifdef HAVE_LIBTIRPC fileObj=new gzv3dfile(name,getSetting("lossy") || getSetting("prerender") > 0.0); #else { ostringstream buf; buf << name << ": XDR write support not enabled"; reportError(buf); } #endif if(fileObj) { for (auto& p : pic->nodes) { assert(p); p->write(fileObj); } fileObj->close(); delete fileObj; } if(webgl && View) htmlView(name); #ifdef HAVE_GL if(format3dWait) { format3dWait=false; #ifdef HAVE_PTHREAD endwait(initSignal,initLock); #endif } #endif return true; } #endif #ifdef HAVE_GL #ifdef HAVE_PTHREAD if(glthread && !offscreen && Wait) { pthread_cond_wait(&readySignal,&readyLock); pthread_mutex_unlock(&readyLock); } return true; #endif #endif return false; } bool picture::shipout3(const string& prefix, const string format) { bounds3(); bool status; string name=buildname(prefix,"prc"); prcfile prc(name); static const double limit=2.5*10.0/INT_MAX; double compressionlimit=max(length(b3.Max()),length(b3.Min()))*limit; groups.push_back(groupmap()); for(nodelist::iterator p=nodes.begin(); p != nodes.end(); ++p) { assert(*p); (*p)->write(&prc,&billboard,compressionlimit,groups); } groups.pop_back(); status=prc.finish(); if(!status) reportError("shipout3 failed"); if(verbose > 0) cout << "Wrote " << name << endl; return true; } picture *picture::transformed(const transform& t) { picture *pic = new picture; nodelist::iterator p; for (p = nodes.begin(); p != nodes.end(); ++p) { assert(*p); pic->append((*p)->transformed(t)); } pic->T=transform(t*T); return pic; } picture *picture::transformed(const array& t) { picture *pic = new picture; double* T=NULL; copyArray4x4C(T,&t); size_t level = 0; for (nodelist::iterator p = nodes.begin(); p != nodes.end(); ++p) { assert(*p); if(level==0) pic->append((*p)->transformed(T)); else pic->append(*p); if((*p)->begingroup3()) level++; if((*p)->endgroup3()) { if(level==0) reportError("endgroup3 without matching begingroup3"); else level--; } } return pic; } } // namespace camp asymptote-3.05/base/0000755000000000000000000000000015031566776013116 5ustar rootrootasymptote-3.05/base/plain.asy0000644000000000000000000001702115031566105014722 0ustar rootroot/***** *plain.asy *Andy Hammerlindl and John Bowman 2004/08/19 * *A package for general purpose drawing, with automatic sizing of pictures. * *****/ access settings; if(settings.command != "") { string s=settings.command; settings.command=""; settings.multipleView=settings.batchView=settings.interactiveView; _eval(s+";",false,true); exit(); } include plain_constants; access version; if(version.VERSION != VERSION) { warning("version","using possibly incompatible version "+ version.VERSION+" of plain.asy"+'\n'); nowarn("version"); } include plain_strings; include plain_pens; include plain_paths; include plain_filldraw; include plain_margins; include plain_picture; include plain_Label; include plain_arcs; include plain_boxes; include plain_shipout; include plain_markers; include plain_arrows; include plain_debugger; real RELEASE=(real) split(VERSION,"-")[0]; using exitfcn=void(); void updatefunction() { implicitshipout=true; if(!currentpicture.uptodate) shipout(); implicitshipout=false; } void exitfunction() { implicitshipout=true; if(!currentpicture.empty()) shipout(); implicitshipout=false; } atupdate(updatefunction); atexit(exitfunction); // A restore thunk is a function, that when called, restores the graphics state // to what it was when the restore thunk was created. using restoreThunk=void(); using saveFunction=restoreThunk(); saveFunction[] saveFunctions={}; // When save is called, this will be redefined to do the corresponding restore. void restore() { warning("nomatchingsave","restore called with no matching save"); } void addSaveFunction(saveFunction s) { saveFunctions.push(s); } restoreThunk buildRestoreThunk() { // Call the save functions in reverse order, storing their restore thunks. restoreThunk[] thunks={}; for(int i=saveFunctions.length-1; i >= 0; --i) thunks.push(saveFunctions[i]()); return new void() { // Call the restore thunks in an order matching the saves. for(int i=thunks.length-1; i >= 0; --i) thunks[i](); }; } // Add the default save function. addSaveFunction(new restoreThunk() { pen defaultpen=defaultpen(); pen p=currentpen; picture pic=currentpicture.copy(); restoreThunk r=restore; return new void() { defaultpen(defaultpen); currentpen=p; currentpicture=pic; currentpicture.uptodate=false; restore=r; }; }); // Save the current state, so that restore will put things back in that state. restoreThunk save() { return restore=buildRestoreThunk(); } void restoredefaults() { warning("nomatchingsavedefaults", "restoredefaults called with no matching savedefaults"); } restoreThunk buildRestoreDefaults() { pen defaultpen=defaultpen(); exitfcn atupdate=atupdate(); exitfcn atexit=atexit(); restoreThunk r=restoredefaults; return new void() { defaultpen(defaultpen); atupdate(atupdate); atexit(atexit); restoredefaults=r; }; } // Save the current state, so that restore will put things back in that state. restoreThunk savedefaults() { return restoredefaults=buildRestoreDefaults(); } void initdefaults() { savedefaults(); resetdefaultpen(); atupdate(null); atexit(null); } // Return the sequence n,...,m int[] sequence(int n, int m) { return n+sequence(m-n+1); } // Return the sequence n,...,m skipping by skip int[] sequence(int n, int m, int skip) { return n+skip*sequence((m-n)#skip+1); } int[] reverse(int n) {return sequence(new int(int x){return n-1-x;},n);} bool[] reverse(bool[] a) {return a[reverse(a.length)];} int[] reverse(int[] a) {return a[reverse(a.length)];} real[] reverse(real[] a) {return a[reverse(a.length)];} pair[] reverse(pair[] a) {return a[reverse(a.length)];} triple[] reverse(triple[] a) {return a[reverse(a.length)];} string[] reverse(string[] a) {return a[reverse(a.length)];} // Return a uniform partition dividing [a,b] into n subintervals. real[] uniform(real a, real b, int n) { if(n <= 0) return new real[]; return a+sequence(n+1)/n*(b-a); } void eval(string s, bool embedded=false) { if(!embedded) initdefaults(); _eval(s+";",embedded); if(!embedded) restoredefaults(); } void eval(code s, bool embedded=false) { if(!embedded) initdefaults(); _eval(s,embedded); if(!embedded) restoredefaults(); } string mapArrayString(string From, string To) { return "typedef "+From+" From; typedef "+To+" To; To[] map(To f(From), From[] a) { return sequence(new To(int i) {return f(a[i]);},a.length); }"; } // This function is deprecated: use // from mapArray(Src=T1, Dst=T2) access map; void mapArray(string From, string To) { eval(mapArrayString(From,To),true); } // Evaluate user command line option. void usersetting() { eval(settings.user,true); } string stripsuffix(string f, string suffix=".asy") { int n=rfind(f,suffix); if(n != -1) f=erase(f,n,-1); return f; } string outdirectory() { return stripfile(outprefix()); } // Conditionally process each file name in array s in a new environment. void asy(string format, bool overwrite=false ... string[] s) { for(string f : s) { f=stripsuffix(f); string suffix="."+format; string fsuffix=stripdirectory(f+suffix); if(overwrite || error(input(outdirectory()+fsuffix,check=false))) { string outformat=settings.outformat; bool interactiveView=settings.interactiveView; bool batchView=settings.batchView; settings.outformat=format; settings.interactiveView=false; settings.batchView=false; string outname=outname(); delete(outname+"_"+".aux"); eval("import \""+f+"\" as dummy"); rename(stripsuffix(outname)+suffix,fsuffix); settings.outformat=outformat; settings.interactiveView=interactiveView; settings.batchView=batchView; } } } void beep() { write('\7',flush); } struct processtime { real user; real system; real clock; } struct cputime { processtime parent; processtime child; processtime change; } cputime cputime() { static processtime last; real[] a=_cputime(); cputime cputime; real clock=a[4]; cputime.parent.user=a[0]; // Includes system time cputime.parent.system=0; cputime.parent.clock=clock; cputime.child.user=a[2]; cputime.child.system=a[3]; cputime.child.clock=0; real user=cputime.parent.user+cputime.child.user; real system=cputime.parent.system+cputime.child.system; cputime.change.user=user-last.user; cputime.change.system=system-last.system; cputime.change.clock=clock-last.clock; last.user=user; last.system=system; last.clock=clock; return cputime; } string cputimeformat="%#.2f"; void write(file file, string s="", cputime c, string format=cputimeformat, suffix suffix=none) { write(file,s, format(format,c.change.user)+"u "+ format(format,c.change.system)+"s "+ format(format,c.parent.user+c.child.user)+"U "+ format(format,c.parent.system+c.child.system)+"S ",suffix); } void write(string s="", cputime c, string format=cputimeformat, suffix suffix=endl) { write(stdout,s,c,format,suffix); } struct realschur { real[][] U; real[][] T; } realschur schur(real[][] a) { real[][][] S=_schur(a); realschur schur; schur.U=S[0]; schur.T=S[1]; return schur; } struct schur { pair[][] U; pair[][] T; } schur schur(pair[][] a) { pair[][][] S=_schur(a); schur schur; schur.U=S[0]; schur.T=S[1]; return schur; } if(settings.autoimport != "") { string s=settings.autoimport; settings.autoimport=""; eval("import \""+s+"\" as dummy",true); atupdate(updatefunction); atexit(exitfunction); settings.autoimport=s; } cputime(); asymptote-3.05/base/reload.js0000644000000000000000000000122115031566105014700 0ustar rootroot// Load/reload the document associated with a given path. // UNIX: Copy to ~/.adobe/Acrobat/x.x/JavaScripts/ // To avoid random window placement we recommend specifying an acroread // geometry option, for example: -geometry +0+0 // MSWindows: Copy to %APPDATA%/Adobe/Acrobat/x.x/JavaScripts/ // Note: x.x represents the appropriate Acrobat Reader version number. reload = app.trustedFunction(function(path) { app.beginPriv(); n=app.activeDocs.length; for(i=app.activeDocs.length-1; i >= 0; --i) { Doc=app.activeDocs[i]; if(Doc.path == path && Doc != this) { Doc.closeDoc(); break; } } app.openDoc(path); app.endPriv(); }); asymptote-3.05/base/plain_arrows.asy0000644000000000000000000004642515031566105016331 0ustar rootrootreal arrowlength=0.75cm; real arrowfactor=15; real arrowangle=15; real arcarrowfactor=0.5*arrowfactor; real arcarrowangle=2*arrowangle; real arrowsizelimit=0.5; real arrow2sizelimit=1/3; real arrowdir=5; real arrowbarb=3; real arrowhookfactor=1.5; real arrowtexfactor=1; real barfactor=arrowfactor; real arrowsize(pen p=currentpen) { return arrowfactor*linewidth(p); } real arcarrowsize(pen p=currentpen) { return arcarrowfactor*linewidth(p); } real barsize(pen p=currentpen) { return barfactor*linewidth(p); } struct arrowhead { path head(path g, position position=EndPoint, pen p=currentpen, real size=0, real angle=arrowangle); real size(pen p)=arrowsize; real arcsize(pen p)=arcarrowsize; filltype defaultfilltype(pen) {return FillDraw;} } real[] arrowbasepoints(path base, path left, path right, real default=0) { real[][] Tl=transpose(intersections(left,base)); real[][] Tr=transpose(intersections(right,base)); return new real[] {Tl.length > 0 ? Tl[0][0] : default, Tr.length > 0 ? Tr[0][0] : default}; } path arrowbase(path r, pair y, real t, real size) { pair perp=2*size*I*dir(r,t); return size == 0 ? y : y+perp--y-perp; } arrowhead DefaultHead; DefaultHead.head=new path(path g, position position=EndPoint, pen p=currentpen, real size=0, real angle=arrowangle) { if(size == 0) size=DefaultHead.size(p); bool relative=position.relative; real position=position.position.x; if(relative) position=reltime(g,position); path r=subpath(g,position,0); pair x=point(r,0); real t=arctime(r,size); pair y=point(r,t); path base=arrowbase(r,y,t,size); path left=rotate(-angle,x)*r; path right=rotate(angle,x)*r; real[] T=arrowbasepoints(base,left,right); pair denom=point(right,T[1])-y; real factor=denom != 0 ? length((point(left,T[0])-y)/denom) : 1; path left=rotate(-angle*factor,x)*r; path right=rotate(angle*factor,x)*r; real[] T=arrowbasepoints(base,left,right); return subpath(left,0,T[0])--subpath(right,T[1],0)&cycle; }; arrowhead SimpleHead; SimpleHead.head=new path(path g, position position=EndPoint, pen p=currentpen, real size=0, real angle=arrowangle) { if(size == 0) size=SimpleHead.size(p); bool relative=position.relative; real position=position.position.x; if(relative) position=reltime(g,position); path r=subpath(g,position,0); pair x=point(r,0); real t=arctime(r,size); path left=rotate(-angle,x)*r; path right=rotate(angle,x)*r; return subpath(left,t,0)--subpath(right,0,t); }; arrowhead HookHead(real dir=arrowdir, real barb=arrowbarb) { arrowhead a; a.head=new path(path g, position position=EndPoint, pen p=currentpen, real size=0, real angle=arrowangle) { if(size == 0) size=a.size(p); angle=min(angle*arrowhookfactor,45); bool relative=position.relative; real position=position.position.x; if(relative) position=reltime(g,position); path r=subpath(g,position,0); pair x=point(r,0); real t=arctime(r,size); pair y=point(r,t); path base=arrowbase(r,y,t,size); path left=rotate(-angle,x)*r; path right=rotate(angle,x)*r; real[] T=arrowbasepoints(base,left,right,1); pair denom=point(right,T[1])-y; real factor=denom != 0 ? length((point(left,T[0])-y)/denom) : 1; path left=rotate(-angle*factor,x)*r; path right=rotate(angle*factor,x)*r; real[] T=arrowbasepoints(base,left,right,1); left=subpath(left,0,T[0]); right=subpath(right,T[1],0); pair pl0=point(left,0), pl1=relpoint(left,1); pair pr0=relpoint(right,0), pr1=relpoint(right,1); pair M=(pl1+pr0)/2; pair v=barb*unit(M-pl0); pl1=pl1+v; pr0=pr0+v; left=pl0{dir(-dir+degrees(M-pl0,false))}..pl1--M; right=M--pr0..pr1{dir(dir+degrees(pr1-M,false))}; return left--right&cycle; }; return a; } arrowhead HookHead=HookHead(); arrowhead TeXHead; TeXHead.size=new real(pen p) { static real hcoef=2.1; // 84/40=abs(base-hint)/base_height return hcoef*arrowtexfactor*linewidth(p); }; TeXHead.arcsize=TeXHead.size; TeXHead.head=new path(path g, position position=EndPoint, pen p=currentpen, real size=0, real angle=arrowangle) { static real wcoef=1/84; // 1/abs(base-hint) static path texhead=scale(wcoef)* ((0,20) .. controls (-75,75) and (-108,158) .. (-108,166) .. controls (-108,175) and (-100,178) .. (-93,178) .. controls (-82,178) and (-80,173) .. (-77,168) .. controls (-62,134) and (-30,61) .. (70,14) .. controls (82,8) and (84,7) .. (84,0) .. controls (84,-7) and (82,-8) .. (70,-14) .. controls (-30,-61) and (-62,-134) .. (-77,-168) .. controls (-80,-173) and (-82,-178) .. (-93,-178) .. controls (-100,-178) and (-108,-175).. (-108,-166).. controls (-108,-158) and (-75,-75) .. (0,-20)--cycle); if(size == 0) size=TeXHead.size(p); path gp=scale(size)*texhead; bool relative=position.relative; real position=position.position.x; if(relative) position=reltime(g,position); path r=subpath(g,position,0); pair y=point(r,arctime(r,size)); return shift(y)*rotate(degrees(-dir(r,arctime(r,0.5*size)),false))*gp; }; TeXHead.defaultfilltype=new filltype(pen p) {return Fill(p);}; private real position(position position, real size, path g, bool center) { bool relative=position.relative; real position=position.position.x; if(relative) { position *= arclength(g); if(center) position += 0.5*size; position=arctime(g,position); } else if(center) position=arctime(g,arclength(subpath(g,0,position))+0.5*size); return position; } void drawarrow(frame f, arrowhead arrowhead=DefaultHead, path g, pen p=currentpen, real size=0, real angle=arrowangle, filltype filltype=null, position position=EndPoint, bool forwards=true, margin margin=NoMargin, bool center=false) { if(size == 0) size=arrowhead.size(p); if(filltype == null) filltype=arrowhead.defaultfilltype(p); size=min(arrowsizelimit*arclength(g),size); real position=position(position,size,g,center); g=margin(g,p).g; int L=length(g); if(!forwards) { g=reverse(g); position=L-position; } path r=subpath(g,position,0); size=min(arrowsizelimit*arclength(r),size); path head=arrowhead.head(g,position,p,size,angle); bool endpoint=position > L-sqrtEpsilon; if(cyclic(head) && (filltype == NoFill || endpoint)) { if(position > 0) draw(f,subpath(r,arctime(r,size),length(r)),p); if(!endpoint) draw(f,subpath(g,position,L),p); } else draw(f,g,p); filltype.fill(f,head,p+solid); } void drawarrow2(frame f, arrowhead arrowhead=DefaultHead, path g, pen p=currentpen, real size=0, real angle=arrowangle, filltype filltype=null, margin margin=NoMargin) { if(size == 0) size=arrowhead.size(p); if(filltype == null) filltype=arrowhead.defaultfilltype(p); g=margin(g,p).g; size=min(arrow2sizelimit*arclength(g),size); path r=reverse(g); int L=length(g); path head=arrowhead.head(g,L,p,size,angle); path tail=arrowhead.head(r,L,p,size,angle); if(cyclic(head)) draw(f,subpath(r,arctime(r,size),L-arctime(g,size)),p); else draw(f,g,p); filltype.fill(f,head,p+solid); filltype.fill(f,tail,p+solid); } // Add to picture an estimate of the bounding box contribution of arrowhead // using the local slope at endpoint and ignoring margin. void addArrow(picture pic, arrowhead arrowhead, path g, pen p, real size, real angle, filltype filltype, real position) { if(filltype == null) filltype=arrowhead.defaultfilltype(p); pair z=point(g,position); path g=z-(size+linewidth(p))*dir(g,position)--z; frame f; filltype.fill(f,arrowhead.head(g,position,p,size,angle),p); pic.addBox(z,z,min(f)-z,max(f)-z); } picture arrow(arrowhead arrowhead=DefaultHead, path g, pen p=currentpen, real size=0, real angle=arrowangle, filltype filltype=null, position position=EndPoint, bool forwards=true, margin margin=NoMargin, bool center=false) { if(size == 0) size=arrowhead.size(p); picture pic; pic.add(new void(frame f, transform t) { drawarrow(f,arrowhead,t*g,p,size,angle,filltype,position,forwards,margin, center); }); pic.addPath(g,p); real position=position(position,size,g,center); path G; if(!forwards) { G=reverse(g); position=length(g)-position; } else G=g; addArrow(pic,arrowhead,G,p,size,angle,filltype,position); return pic; } picture arrow2(arrowhead arrowhead=DefaultHead, path g, pen p=currentpen, real size=0, real angle=arrowangle, filltype filltype=null, margin margin=NoMargin) { if(size == 0) size=arrowhead.size(p); picture pic; pic.add(new void(frame f, transform t) { drawarrow2(f,arrowhead,t*g,p,size,angle,filltype,margin); }); pic.addPath(g,p); int L=length(g); addArrow(pic,arrowhead,g,p,size,angle,filltype,L); addArrow(pic,arrowhead,reverse(g),p,size,angle,filltype,L); return pic; } void bar(picture pic, pair a, pair d, pen p=currentpen) { picture opic; Draw(opic,-0.5d--0.5d,p+solid); add(pic,opic,a); } picture bar(pair a, pair d, pen p=currentpen) { picture pic; bar(pic,a,d,p); return pic; } using arrowbar=bool(picture, path, pen, margin); bool Blank(picture, path, pen, margin) { return false; } bool None(picture, path, pen, margin) { return true; } arrowbar BeginArrow(arrowhead arrowhead=DefaultHead, real size=0, real angle=arrowangle, filltype filltype=null, position position=BeginPoint) { return new bool(picture pic, path g, pen p, margin margin) { add(pic,arrow(arrowhead,g,p,size,angle,filltype,position,forwards=false, margin)); return false; }; } arrowbar Arrow(arrowhead arrowhead=DefaultHead, real size=0, real angle=arrowangle, filltype filltype=null, position position=EndPoint) { return new bool(picture pic, path g, pen p, margin margin) { add(pic,arrow(arrowhead,g,p,size,angle,filltype,position,margin)); return false; }; } arrowbar EndArrow(arrowhead arrowhead=DefaultHead, real size=0, real angle=arrowangle, filltype filltype=null, position position=EndPoint)=Arrow; arrowbar MidArrow(arrowhead arrowhead=DefaultHead, real size=0, real angle=arrowangle, filltype filltype=null) { return new bool(picture pic, path g, pen p, margin margin) { add(pic,arrow(arrowhead,g,p,size,angle,filltype,MidPoint,margin, center=true)); return false; }; } arrowbar Arrows(arrowhead arrowhead=DefaultHead, real size=0, real angle=arrowangle, filltype filltype=null) { return new bool(picture pic, path g, pen p, margin margin) { add(pic,arrow2(arrowhead,g,p,size,angle,filltype,margin)); return false; }; } arrowbar BeginArcArrow(arrowhead arrowhead=DefaultHead, real size=0, real angle=arcarrowangle, filltype filltype=null, position position=BeginPoint) { return new bool(picture pic, path g, pen p, margin margin) { real size=size == 0 ? arrowhead.arcsize(p) : size; add(pic,arrow(arrowhead,g,p,size,angle,filltype,position, forwards=false,margin)); return false; }; } arrowbar ArcArrow(arrowhead arrowhead=DefaultHead, real size=0, real angle=arcarrowangle, filltype filltype=null, position position=EndPoint) { return new bool(picture pic, path g, pen p, margin margin) { real size=size == 0 ? arrowhead.arcsize(p) : size; add(pic,arrow(arrowhead,g,p,size,angle,filltype,position,margin)); return false; }; } arrowbar EndArcArrow(arrowhead arrowhead=DefaultHead, real size=0, real angle=arcarrowangle, filltype filltype=null, position position=EndPoint)=ArcArrow; arrowbar MidArcArrow(arrowhead arrowhead=DefaultHead, real size=0, real angle=arcarrowangle, filltype filltype=null) { return new bool(picture pic, path g, pen p, margin margin) { real size=size == 0 ? arrowhead.arcsize(p) : size; add(pic,arrow(arrowhead,g,p,size,angle,filltype,MidPoint,margin, center=true)); return false; }; } arrowbar ArcArrows(arrowhead arrowhead=DefaultHead, real size=0, real angle=arcarrowangle, filltype filltype=null) { return new bool(picture pic, path g, pen p, margin margin) { real size=size == 0 ? arrowhead.arcsize(p) : size; add(pic,arrow2(arrowhead,g,p,size,angle,filltype,margin)); return false; }; } arrowbar BeginBar(real size=0) { return new bool(picture pic, path g, pen p, margin margin) { real size=size == 0 ? barsize(p) : size; bar(pic,point(g,0),size*dir(g,0)*I,p); return true; }; } arrowbar Bar(real size=0) { return new bool(picture pic, path g, pen p, margin margin) { int L=length(g); real size=size == 0 ? barsize(p) : size; bar(pic,point(g,L),size*dir(g,L)*I,p); return true; }; } arrowbar EndBar(real size=0)=Bar; arrowbar Bars(real size=0) { return new bool(picture pic, path g, pen p, margin margin) { real size=size == 0 ? barsize(p) : size; BeginBar(size)(pic,g,p,margin); EndBar(size)(pic,g,p,margin); return true; }; } arrowbar BeginArrow=BeginArrow(), MidArrow=MidArrow(), Arrow=Arrow(), EndArrow=Arrow(), Arrows=Arrows(), BeginArcArrow=BeginArcArrow(), MidArcArrow=MidArcArrow(), ArcArrow=ArcArrow(), EndArcArrow=ArcArrow(), ArcArrows=ArcArrows(), BeginBar=BeginBar(), Bar=Bar(), EndBar=Bar(), Bars=Bars(); void draw(frame f, path g, pen p=currentpen, arrowbar arrow) { picture pic; if(arrow(pic,g,p,NoMargin)) draw(f,g,p); add(f,pic.fit()); } void draw(picture pic=currentpicture, Label L=null, path g, align align=NoAlign, pen p=currentpen, arrowbar arrow=None, arrowbar bar=None, margin margin=NoMargin, Label legend=null, marker marker=nomarker) { // These if statements are ordered in such a way that the most common case // (with just a path and a pen) executes the least bytecode. if (marker == nomarker) { if (arrow == None && bar == None) { if (margin == NoMargin && size(nib(p)) == 0) { pic.addExactAbove( new void(frame f, transform t, transform T, pair, pair) { _draw(f,t*T*g,p); }); pic.addPath(g,p); // Jumping over else clauses takes time, so test if we can return // here. if (L == null && legend == null) return; } else // With margin or polygonal pen. { _draw(pic, g, p, margin); } } else /* arrow or bar */ { // Note we are using & instead of && as both arrow and bar need to be // called. if (arrow(pic, g, p, margin) & bar(pic, g, p, margin)) _draw(pic, g, p, margin); } if(L != null && L.s != "") { L=L.copy(); L.align(align); L.p(p); L.out(pic,g); } if(legend != null && legend.s != "") { legend.p(p); pic.legend.push(Legend(legend.s,legend.p,p,marker.f,marker.above)); } } else /* marker != nomarker */ { if(marker != nomarker && !marker.above) marker.mark(pic,g); // Note we are using & instead of && as both arrow and bar need to be // called. if ((arrow == None || arrow(pic, g, p, margin)) & (bar == None || bar(pic, g, p, margin))) { _draw(pic, g, p, margin); } if(L != null && L.s != "") { L=L.copy(); L.align(align); L.p(p); L.out(pic,g); } if(legend != null && legend.s != "") { legend.p(p); pic.legend.push(Legend(legend.s,legend.p,p,marker.f,marker.above)); } if(marker != nomarker && marker.above) marker.mark(pic,g); } } // Draw a fixed-size line about the user-coordinate 'origin'. void draw(pair origin, picture pic=currentpicture, Label L=null, path g, align align=NoAlign, pen p=currentpen, arrowbar arrow=None, arrowbar bar=None, margin margin=NoMargin, Label legend=null, marker marker=nomarker) { picture opic; draw(opic,L,g,align,p,arrow,bar,margin,legend,marker); add(pic,opic,origin); } void draw(picture pic=currentpicture, explicit path[] g, pen p=currentpen, Label legend=null, marker marker=nomarker) { // This could be optimized to size and draw the entire array as a batch. for(int i=0; i < g.length-1; ++i) draw(pic,g[i],p,marker); if(g.length > 0) draw(pic,g[g.length-1],p,legend,marker); } void draw(picture pic=currentpicture, guide[] g, pen p=currentpen, Label legend=null, marker marker=nomarker) { draw(pic,(path[]) g,p,legend,marker); } void draw(pair origin, picture pic=currentpicture, explicit path[] g, pen p=currentpen, Label legend=null, marker marker=nomarker) { picture opic; draw(opic,g,p,legend,marker); add(pic,opic,origin); } void draw(pair origin, picture pic=currentpicture, guide[] g, pen p=currentpen, Label legend=null, marker marker=nomarker) { draw(origin,pic,(path[]) g,p,legend,marker); } // Align an arrow pointing to b from the direction dir. The arrow is // 'length' PostScript units long. void arrow(picture pic=currentpicture, Label L=null, pair b, pair dir, real length=arrowlength, align align=NoAlign, pen p=currentpen, arrowbar arrow=Arrow, margin margin=EndMargin) { if(L != null && L.s != "") { L=L.copy(); if(L.defaultposition) L.position(0); L.align(L.align,dir); L.p(p); } marginT margin=margin(b--b,p); // Extract margin.begin and margin.end pair a=(margin.begin+length+margin.end)*unit(dir); draw(b,pic,L,a--(0,0),align,p,arrow,margin); } // Fit an array of pictures simultaneously using the sizing of picture all. frame[] fit2(picture[] pictures, picture all) { frame[] out; if(!all.empty2()) { transform t=all.calculateTransform(); pair m=all.min(t); pair M=all.max(t); for(picture pic : pictures) { frame f=pic.fit(t); draw(f,m,nullpen); draw(f,M,nullpen); out.push(f); } } return out; } // Fit an array of pictures simultaneously using the size of the first picture. // TODO: Remove unused arguments. frame[] fit(string prefix="", picture[] pictures, string format="", bool view=true, string options="", string script="", projection P=currentprojection) { if(pictures.length == 0) return new frame[]; picture all; size(all,pictures[0]); for(picture pic : pictures) add(all,pic); return fit2(pictures,all); } // Pad a picture to a specified size frame pad(picture pic=currentpicture, real xsize=pic.xsize, real ysize=pic.ysize, filltype filltype=NoFill) { picture P; size(P,xsize,ysize,IgnoreAspect); draw(P,(0,0),invisible+thin()); draw(P,(xsize,ysize),invisible+thin()); add(P,pic.fit(xsize,ysize),(xsize,ysize)/2); frame f=P.fit(); if(filltype != NoFill) { frame F; filltype.fill(F,box(min(f),max(f)),invisible); prepend(f,F); } return f; } asymptote-3.05/base/solids.asy0000644000000000000000000002735415031566105015126 0ustar rootrootimport graph3; pen defaultbackpen=linetype(new real[] {4,4},4,scale=false); // A solid geometry package. // Try to find a bounding tangent line between two paths. real[] tangent(path p, path q, bool side) { static real fuzz=1.0e-5; if((cyclic(p) && inside(p,point(q,0)) || cyclic(q) && inside(q,point(p,0))) && intersect(p,q,fuzz).length == 0) return new real[]; for(int i=0; i < 100; ++i) { real ta=side ? mintimes(p)[1] : maxtimes(p)[1]; real tb=side ? mintimes(q)[1] : maxtimes(q)[1]; pair a=point(p,ta); pair b=point(q,tb); real angle=angle(b-a,warn=false); if(abs(angle) <= sqrtEpsilon || abs(abs(0.5*angle)-pi) <= sqrtEpsilon) return new real[] {ta,tb}; transform t=rotate(-degrees(angle)); p=t*p; q=t*q; } return new real[]; } path line(path p, path q, real[] t) { return point(p,t[0])--point(q,t[1]); } // Return the projection of a generalized cylinder of height h constructed // from area base in the XY plane and aligned with axis. path[] cylinder(path3 base, real h, triple axis=Z, projection P) { base=rotate(-colatitude(axis),cross(axis,Z))*base; path3 top=shift(h*axis)*base; path Base=project(base,P); path Top=project(top,P); real[] t1=tangent(Base,Top,true); real[] t2=tangent(Base,Top,false); path p=subpath(Base,t1[0]/P.ninterpolate,t2[0]/P.ninterpolate); path q=subpath(Base,t2[0]/P.ninterpolate,t1[0]/P.ninterpolate); return Base^^Top^^line(Base,Top,t1)^^line(Base,Top,t2); } // The three-dimensional "wireframe" used to visualize a volume of revolution struct skeleton { struct curve { path3[] front; path3[] back; } // transverse skeleton (perpendicular to axis of revolution) curve transverse; // longitudinal skeleton (parallel to axis of revolution) curve longitudinal; } // A surface of revolution generated by rotating a planar path3 g // from angle1 to angle2 about c--c+axis. struct revolution { triple c; path3 g; triple axis; real angle1,angle2; triple M; triple m; static real epsilon=10*sqrtEpsilon; void operator init(triple c=O, path3 g, triple axis=Z, real angle1=0, real angle2=360) { this.c=c; this.g=g; this.axis=unit(axis); this.angle1=angle1; this.angle2=angle2; M=max(g); m=min(g); } revolution copy() { return revolution(c,g,axis,angle1,angle2); } triple vertex(int i, real j) { triple v=point(g,i); triple center=c+dot(v-c,axis)*axis; triple perp=v-center; triple normal=cross(axis,perp); return center+Cos(j)*perp+Sin(j)*normal; } // Construct the surface of rotation generated by rotating g // from angle1 to angle2 sampled n times about the line c--c+axis. // An optional surface pen color(int i, real j) may be specified // to override the color at vertex(i,j). surface surface(int n=nslice, pen color(int i, real j)=null) { return surface(c,g,axis,n,angle1,angle2,color); } path3 slice(real position, int n=nCircle) { triple v=point(g,position); triple center=c+dot(v-c,axis)*axis; triple perp=v-center; if(abs(perp) <= epsilon*max(abs(m),abs(M))) return center; triple v1=center+rotate(angle1,axis)*perp; triple v2=center+rotate(angle2,axis)*perp; path3 p=Arc(center,v1,v2,axis,n); return (angle2-angle1) % 360 == 0 ? p&cycle : p; } // add transverse slice to skeleton s; void transverse(skeleton s, real t, int n=nslice, projection P) { skeleton.curve s=s.transverse; path3 S=slice(t,n); int L=length(g); real midtime=0.5*L; real sign=sgn(dot(axis,P.camera-c))*sgn(dot(axis,dir(g,midtime))); if(dot(M-m,axis) == 0 || (t <= epsilon && sign < 0) || (t >= L-epsilon && sign > 0)) s.front.push(S); else { path3 Sp=slice(t+epsilon,n); path3 Sm=slice(t-epsilon,n); path sp=project(Sp,P); path sm=project(Sm,P); real[] t1=tangent(sp,sm,true); real[] t2=tangent(sp,sm,false); if(t1.length > 1 && t2.length > 1) { real t1=t1[0]/P.ninterpolate; real t2=t2[0]/P.ninterpolate; int len=length(S); if(t2 < t1) { real temp=t1; t1=t2; t2=temp; } path3 p1=subpath(S,t1,t2); path3 p2=subpath(S,t2,len); path3 P2=subpath(S,0,t1); if(abs(midpoint(p1)-P.camera) <= abs(midpoint(p2)-P.camera)) { s.front.push(p1); if(cyclic(S)) s.back.push(p2 & P2); else { s.back.push(p2); s.back.push(P2); } } else { if(cyclic(S)) s.front.push(p2 & P2); else { s.front.push(p2); s.front.push(P2); } s.back.push(p1); } } else { if((t <= midtime && sign < 0) || (t >= midtime && sign > 0)) s.front.push(S); else s.back.push(S); } } } // add m evenly spaced transverse slices to skeleton s void transverse(skeleton s, int m=0, int n=nslice, projection P) { if(m == 0) { int N=size(g); for(int i=0; i < N; ++i) transverse(s,(real) i,n,P); } else if(m == 1) transverse(s,reltime(g,0.5),n,P); else { real factor=1/(m-1); for(int i=0; i < m; ++i) transverse(s,reltime(g,i*factor),n,P); } } // return approximate silhouette based on m evenly spaced transverse slices; // must be recomputed if camera is adjusted path3[] silhouette(int m=64, projection P=currentprojection) { if(is3D()) warning("2Dsilhouette", "silhouette routine is intended only for 2d projections"); path3 G,H; int N=size(g); int M=(m == 0) ? N : m; real factor=m == 1 ? 0 : 1/(m-1); int n=nslice; real tfirst=-1; real tlast; for(int i=0; i < M; ++i) { real t=(m == 0) ? i : reltime(g,i*factor); path3 S=slice(t,n); path3 Sp=slice(t+epsilon,n); path3 Sm=slice(t-epsilon,n); path sp=project(Sp,P); path sm=project(Sm,P); real[] t1=tangent(sp,sm,true); real[] t2=tangent(sp,sm,false); if(t1.length > 1 && t2.length > 1) { real t1=t1[0]/P.ninterpolate; real t2=t2[0]/P.ninterpolate; if(t1 != t2) { G=G..point(S,t1); H=point(S,t2)..H; if(tfirst < 0) tfirst=t; tlast=t; } } } int L=length(g); real midtime=0.5*L; real sign=sgn(dot(axis,P.camera-c))*sgn(dot(axis,dir(g,midtime))); skeleton sfirst; transverse(sfirst,tfirst,n,P); triple delta=this.M-this.m; path3 cap; if(dot(delta,axis) == 0 || (tfirst <= epsilon && sign < 0)) { cap=sfirst.transverse.front[0]; } else { if(sign > 0) { if(sfirst.transverse.front.length > 0) G=reverse(sfirst.transverse.front[0])..G; } else { if(sfirst.transverse.back.length > 0) G=sfirst.transverse.back[0]..G; } } skeleton slast; transverse(slast,tlast,n,P); if(dot(delta,axis) == 0 || (tlast >= L-epsilon && sign > 0)) { cap=slast.transverse.front[0]; } else { if(sign > 0) { if(slast.transverse.back.length > 0) H=reverse(slast.transverse.back[0])..H; } else { if(slast.transverse.front.length > 0) H=slast.transverse.front[0]..H; } } return size(cap) == 0 ? G^^H : G^^H^^cap; } // add longitudinal curves to skeleton; void longitudinal(skeleton s, int n=nslice, projection P) { real t, d=0; // Find a point on g of maximal distance from the axis. int N=size(g); for(int i=0; i < N; ++i) { triple v=point(g,i); triple center=c+dot(v-c,axis)*axis; real r=abs(v-center); if(r > d) { t=i; d=r; } } path3 S=slice(t,n); path3 Sm=slice(t+epsilon,n); path3 Sp=slice(t-epsilon,n); path sp=project(Sp,P); path sm=project(Sm,P); real[] t1=tangent(sp,sm,true); real[] t2=tangent(sp,sm,false); transform3 T=transpose(align(axis)); real Longitude(triple v) {return longitude(T*(v-c),warn=false);} real ref=Longitude(point(g,t)); real angle(real t) {return Longitude(point(S,t/P.ninterpolate))-ref;} void push(real[] T) { if(T.length > 1) { path3 p=rotate(angle(T[0]),c,c+axis)*g; path3 p1=subpath(p,0,t); path3 p2=subpath(p,t,length(p)); if(length(p1) > 0 && (length(p2) == 0 || abs(midpoint(p1)-P.camera) <= abs(midpoint(p2)-P.camera))) { s.longitudinal.front.push(p1); s.longitudinal.back.push(p2); } else { s.longitudinal.back.push(p1); s.longitudinal.front.push(p2); } } } push(t1); push(t2); } skeleton skeleton(int m=0, int n=nslice, projection P) { skeleton s; transverse(s,m,n,P); longitudinal(s,n,P); return s; } } revolution operator * (transform3 t, revolution r) { triple trc=t*r.c; return revolution(trc,t*r.g,t*(r.c+r.axis)-trc,r.angle1,r.angle2); } surface surface(revolution r, int n=nslice, pen color(int i, real j)=null) { return r.surface(n,color); } // Draw on picture pic the skeleton of the surface of revolution r. // Draw the front portion of each of the m transverse slices with pen p and // the back portion with pen backpen. Rotational arcs are based on // n-point approximations to the unit circle. void draw(picture pic=currentpicture, revolution r, int m=0, int n=nslice, pen frontpen=currentpen, pen backpen=frontpen, pen longitudinalpen=frontpen, pen longitudinalbackpen=backpen, light light=currentlight, string name="", render render=defaultrender, projection P=currentprojection) { if(is3D()) { pen thin=thin(); void drawskeleton(frame f, transform3 t, projection P) { skeleton s=r.skeleton(m,n,inverse(t)*P); if(frontpen != nullpen) { draw(f,t*s.transverse.back,thin+defaultbackpen+backpen,light); draw(f,t*s.transverse.front,thin+frontpen,light); } if(longitudinalpen != nullpen) { draw(f,t*s.longitudinal.back,thin+defaultbackpen+longitudinalbackpen, light); draw(f,t*s.longitudinal.front,thin+longitudinalpen,light); } } bool group=name != "" || render.defaultnames; if(group) begingroup3(pic,name == "" ? "skeleton" : name,render); pic.add(new void(frame f, transform3 t, picture pic, projection P) { drawskeleton(f,t,P); if(pic != null) pic.addBox(min(f,P),max(f,P),min(frontpen),max(frontpen)); }); frame f; drawskeleton(f,identity4,P); pic.addBox(min3(f),max3(f)); if(group) endgroup3(pic); } else { skeleton s=r.skeleton(m,n,P); if(frontpen != nullpen) { draw(pic,s.transverse.back,defaultbackpen+backpen,light); draw(pic,s.transverse.front,frontpen,light); } if(longitudinalpen != nullpen) { draw(pic,s.longitudinal.back,defaultbackpen+longitudinalbackpen, light); draw(pic,s.longitudinal.front,longitudinalpen,light); } } } // Return a right circular cylinder of height h in the direction of axis // based on a circle centered at c with radius r. // Note: unitcylinder provides a smoother and more efficient representation. revolution cylinder(triple c=O, real r, real h, triple axis=Z) { triple C=c+r*perp(axis); axis=h*unit(axis); return revolution(c,C--C+axis,axis); } // Return a right circular cone of height h in the direction of axis // based on a circle centered at c with radius r. The parameter n // controls the accuracy near the degenerate point at the apex. revolution cone(triple c=O, real r, real h, triple axis=Z, int n=nslice) { axis=unit(axis); return revolution(c,approach(c+r*perp(axis)--c+h*axis,n),axis); } // Return an approximate sphere of radius r centered at c obtained by rotating // an (n+1)-point approximation to a half circle about the Z axis. // Note: unitsphere provides a smoother and more efficient representation. revolution sphere(triple c=O, real r, int n=nslice) { return revolution(c,Arc(c,r,180-sqrtEpsilon,0,sqrtEpsilon,0,Y,n),Z); } asymptote-3.05/base/plain_prethree.asy0000644000000000000000000001417515031566105016627 0ustar rootroot// Critical definitions for transform3 needed by projection and picture. pair viewportmargin=settings.viewportmargin; using transform3=real[][]; restricted transform3 identity4=identity(4); // A uniform 3D scaling. transform3 scale3(real s) { transform3 t=identity(4); t[0][0]=t[1][1]=t[2][2]=s; return t; } // Simultaneous 3D scalings in the x, y, and z directions. transform3 scale(real x, real y, real z) { transform3 t=identity(4); t[0][0]=x; t[1][1]=y; t[2][2]=z; return t; } transform3 shiftless(transform3 t) { transform3 T=copy(t); T[0][3]=T[1][3]=T[2][3]=0; return T; } real camerafactor=2; // Factor used for camera adjustment. struct transformation { transform3 modelview; // For orientation and positioning transform3 projection; // For 3D to 2D projection bool infinity; void operator init(transform3 modelview) { this.modelview=modelview; this.projection=identity4; infinity=true; } void operator init(transform3 modelview, transform3 projection) { this.modelview=modelview; this.projection=projection; infinity=false; } transform3 compute() { return infinity ? modelview : projection*modelview; } transformation copy() { transformation T=new transformation; T.modelview=copy(modelview); T.projection=copy(projection); T.infinity=infinity; return T; } } struct projection { transform3 t; // projection*modelview (cached) bool infinity; bool absolute=false; triple camera; // Position of camera. triple up; // A vector that should be projected to direction (0,1). triple target; // Point where camera is looking at. triple normal; // Normal vector from target to projection plane. pair viewportshift; // Fractional viewport shift. real zoom=1; // Zoom factor. real angle; // Lens angle (for perspective projection). bool showtarget=true; // Expand bounding volume to include target? using projector=transformation(triple camera, triple up, triple target); projector projector; bool autoadjust=true; // Adjust camera to lie outside bounding volume? bool center=false; // Center target within bounding volume? int ninterpolate; // Used for projecting nurbs to 2D Bezier curves. bool bboxonly=true; // Typeset label bounding box only. transformation T; void calculate() { T=projector(camera,up,target); t=T.compute(); infinity=T.infinity; ninterpolate=infinity ? 1 : 16; } triple vector() { return camera-target; } void operator init(triple camera, triple up=(0,0,1), triple target=(0,0,0), triple normal=camera-target, real zoom=1, real angle=0, pair viewportshift=0, bool showtarget=true, bool autoadjust=true, bool center=false, projector projector) { this.camera=camera; this.up=up; this.target=target; this.normal=normal; this.zoom=zoom; this.angle=angle; this.viewportshift=viewportshift; this.showtarget=showtarget; this.autoadjust=autoadjust; this.center=center; this.projector=projector; calculate(); } projection copy() { projection P=new projection; P.t=t; P.infinity=infinity; P.absolute=absolute; P.camera=camera; P.up=up; P.target=target; P.normal=normal; P.zoom=zoom; P.angle=angle; P.viewportshift=viewportshift; P.showtarget=showtarget; P.autoadjust=autoadjust; P.center=center; P.projector=projector; P.ninterpolate=ninterpolate; P.bboxonly=bboxonly; P.T=T.copy(); return P; } // Return the maximum distance of box(m,M) from target. real distance(triple m, triple M) { triple[] c={m,(m.x,m.y,M.z),(m.x,M.y,m.z),(m.x,M.y,M.z), (M.x,m.y,m.z),(M.x,m.y,M.z),(M.x,M.y,m.z),M}; return max(abs(c-target)); } // This is redefined here to make projection as self-contained as possible. static private real sqrtEpsilon=sqrt(realEpsilon); // Move the camera so that the box(m,M) rotated about target will always // lie in front of the far clipping plane. bool adjust(triple m, triple M) { triple v=camera-target; real d=distance(m,M); static real lambda=camerafactor*(1-sqrtEpsilon); if(lambda*d >= abs(v)) { camera=target+camerafactor*d*unit(v); calculate(); return true; } return false; } } projection currentprojection; struct light { real[][] diffuse; real[][] specular; pen background=nullpen; // Background color of the 3D canvas. real specularfactor; triple[] position; // Only directional lights are currently implemented. transform3 T=identity(4); // Transform to apply to normal vectors. bool on() {return position.length > 0;} void operator init(pen[] diffuse, pen[] specular=diffuse, pen background=nullpen, real specularfactor=1, triple[] position) { int n=diffuse.length; assert(specular.length == n && position.length == n); this.diffuse=new real[n][]; this.specular=new real[n][]; this.background=background; this.position=new triple[n]; for(int i=0; i < position.length; ++i) { this.diffuse[i]=rgba(diffuse[i]); this.specular[i]=rgba(specular[i]); this.position[i]=unit(position[i]); } this.specularfactor=specularfactor; } void operator init(pen diffuse=white, pen specular=diffuse, pen background=nullpen, real specularfactor=1 ...triple[] position) { int n=position.length; operator init(array(n,diffuse),array(n,specular), background,specularfactor,position); } void operator init(pen diffuse=white, pen specular=diffuse, pen background=nullpen, real x, real y, real z) { operator init(diffuse,specular,background,(x,y,z)); } void operator init(explicit light light) { diffuse=copy(light.diffuse); specular=copy(light.specular); background=light.background; specularfactor=light.specularfactor; position=copy(light.position); } real[] background() {return rgba(background == nullpen ? white : background);} } light currentlight; asymptote-3.05/base/embed.asy0000644000000000000000000000223215031566105014671 0ustar rootrootif(latex()) { usepackage("hyperref"); texpreamble("\hypersetup{"+settings.hyperrefOptions+"}"); usepackage("media9","bigfiles"); } // For documentation of the options see // http://mirror.ctan.org/macros/latex/contrib/media9/doc/media9.pdf // Embed PRC or SWF content in pdf file string embedplayer(string name, string text="", string options="", real width=0, real height=0) { if(width != 0) options += ",width="+(string) (width/pt)+"pt"; if(height != 0) options += ",height="+(string) (height/pt)+"pt"; return "% \includemedia[noplaybutton,"+options+"]{"+text+"}{"+name+"}"; } // Embed media in pdf file string embed(string name, string text="", string options="", real width=0, real height=0) { return embedplayer("VPlayer.swf",text,"label="+name+ ",activate=pageopen,addresource="+name+ ",flashvars={source="+name+"&scaleMode=letterbox},"+ options,width,height); } string link(string label, string text="Play") { return "\PushButton[ onclick={ annotRM['"+label+"'].activated=true; annotRM['"+label+"'].callAS('playPause'); }]{\fbox{"+text+"}}"; } asymptote-3.05/base/drawtree.asy0000644000000000000000000000407515031566105015441 0ustar rootroot// A simple tree drawing module contributed by adarovsky // See example treetest.asy real treeNodeStep = 0.5cm; real treeLevelStep = 1cm; real treeMinNodeWidth = 2cm; struct TreeNode { TreeNode parent; TreeNode[] children; frame content; pair pos; real adjust; } void add( TreeNode child, TreeNode parent ) { child.parent = parent; parent.children.push( child ); } TreeNode makeNode( TreeNode parent = null, frame f ) { TreeNode child = new TreeNode; child.content = f; if( parent != null ) { add( child, parent ); } return child; } TreeNode makeNode( TreeNode parent = null, Label label ) { frame f; box( f, label); return makeNode( parent, f ); } real layout( int level, TreeNode node ) { if( node.children.length > 0 ) { real width[] = new real[node.children.length]; real curWidth = 0; for( int i = 0; i < node.children.length; ++i ) { width[i] = layout( level+1, node.children[i] ); node.children[i].pos = (curWidth + width[i]/2, -level*treeLevelStep); curWidth += width[i] + treeNodeStep; } real midPoint = ( sum( width )+treeNodeStep*(width.length-1)) / 2; for( int i = 0; i < node.children.length; ++i ) { node.children[i].adjust = - midPoint; } return max( (max(node.content)-min(node.content)).x, sum(width)+treeNodeStep*(width.length-1) ); } else { return max( treeMinNodeWidth, (max(node.content)-min(node.content)).x ); } } void drawAll( TreeNode node, frame f ) { pair pos; if( node.parent != null ) pos = (node.parent.pos.x+node.adjust, 0); else pos = (node.adjust, 0); node.pos += pos; node.content = shift(node.pos)*node.content; add( f, node.content ); if( node.parent != null ) { path p = point(node.content, N)--point(node.parent.content,S); draw( f, p, currentpen ); } for( int i = 0; i < node.children.length; ++i ) drawAll( node.children[i], f ); } void draw( TreeNode root, pair pos ) { frame f; root.pos = (0,0); layout( 1, root ); drawAll( root, f ); add(f,pos); } asymptote-3.05/base/three_arrows.asy0000644000000000000000000005624515031566105016336 0ustar rootroot// A transformation that bends points along a path transform3 bend(path3 g, real t) { triple dir=dir(g,t); triple a=point(g,0), b=postcontrol(g,0); triple c=precontrol(g,1), d=point(g,1); triple dir1=b-a; triple dir2=c-b; triple dir3=d-c; triple u = unit(cross(dir1,dir3)); real eps=1000*realEpsilon; if(abs(u) < eps) { u = unit(cross(dir1,dir2)); if(abs(u) < eps) { u = unit(cross(dir2,dir3)); if(abs(u) < eps) // linear segment: use any direction perpendicular to initial direction u = perp(dir1); } } u = unit(perp(u,dir)); triple w=cross(dir,u); triple q=point(g,t); return new real[][] { {u.x,w.x,dir.x,q.x}, {u.y,w.y,dir.y,q.y}, {u.z,w.z,dir.z,q.z}, {0,0,0,1} }; } // bend a point along a path; assumes that p.z is in [0,scale] triple bend(triple p, path3 g, real scale) { return bend(g,arctime(g,arclength(g)+p.z-scale))*(p.x,p.y,0); } void bend(surface s, path3 g, real L) { for(patch p : s.s) { for(int i=0; i < 4; ++i) { for(int j=0; j < 4; ++j) { p.P[i][j]=bend(p.P[i][j],g,L); } } } } // Refine a noncyclic path3 g so that it approaches its endpoint in // geometrically spaced steps. path3 approach(path3 p, int n, real radix=3) { guide3 G; real L=length(p); real tlast=0; real r=1/radix; for(int i=1; i < n; ++i) { real t=L*(1-r^i); G=G&subpath(p,tlast,t); tlast=t; } return G&subpath(p,tlast,L); } struct arrowhead3 { arrowhead arrowhead2=DefaultHead; real size(pen p)=arrowsize; real arcsize(pen p)=arcarrowsize; real gap=1; real size; bool splitpath=false; surface head(path3 g, position position=EndPoint, pen p=currentpen, real size=0, real angle=arrowangle, filltype filltype=null, bool forwards=true, projection P=currentprojection); static surface surface(path3 g, position position, real size, path[] h, pen p, filltype filltype, triple normal, projection P) { bool relative=position.relative; real position=position.position.x; if(relative) position=reltime(g,position); path3 r=subpath(g,position,0); path3 s=subpath(r,arctime(r,size),0); if(filltype == null) filltype=FillDraw(p); bool draw=filltype.type != filltype.Fill; triple v=point(s,length(s)); triple N=normal == O ? P.normal : normal; triple w=unit(v-point(s,0)); transform3 t=transform3(w,unit(cross(w,N))); path3[] H=t*path3(h); surface s; real width=linewidth(p); if(filltype != NoFill && filltype.type != filltype.UnFill && filltype.type != filltype.Draw) { triple n=0.5*width*unit(t*Z); s=surface(shift(n)*H,planar=true); s.append(surface(shift(-n)*H,planar=true)); if(!draw) for(path g : h) s.append(shift(-n)*t*extrude(g,width*Z)); } if(draw) for(path3 g : H) { tube T=tube(g,width); for(surface S : T.s) s.append(S); } return shift(v)*s; } static path project(path3 g, bool forwards, projection P) { path h=project(forwards ? g : reverse(g),P); return shift(-point(h,length(h)))*h; } static path[] align(path H, path h) { static real fuzz=1000*realEpsilon; real[][] t=intersections(H,h,fuzz*max(abs(max(h)),abs(min(h)))); return t.length >= 2 ? rotate(-degrees(point(H,t[0][0])-point(H,t[1][0]),warn=false))*H : H; } } arrowhead3 DefaultHead3; DefaultHead3.head=new surface(path3 g, position position=EndPoint, pen p=currentpen, real size=0, real angle=arrowangle, filltype filltype=null, bool forwards=true, projection P=currentprojection) { if(size == 0) size=DefaultHead3.size(p); bool relative=position.relative; real position=position.position.x; if(relative) position=reltime(g,position); path3 r=subpath(g,position,0); path3 s=subpath(r,arctime(r,size),0); int n=length(s); bool straight1=n == 1 && straight(g,0); real aspect=Tan(angle); real width=size*aspect; surface head; if(straight1) { triple v=point(s,0); triple u=point(s,1)-v; return shift(v)*align(unit(u))*scale(width,width,size)*unitsolidcone; } else { real remainL=size; bool first=true; for(int i=0; i < n; ++i) { path3 q=subpath(s,i,i+1); if(remainL > 0) { real l=arclength(q); real w=remainL*aspect; surface segment=scale(w,w,l)*unitcylinder; if(first) { // add base first=false; segment.append(scale(w,w,1)*unitdisk); } for(patch p : segment.s) { for(int i=0; i < 4; ++i) { for(int j=0; j < 4; ++j) { real k=1-p.P[i][j].z/remainL; p.P[i][j]=bend((k*p.P[i][j].x,k*p.P[i][j].y,p.P[i][j].z),q,l); } } } head.append(segment); remainL -= l; } } } return head; }; arrowhead3 HookHead3(real dir=arrowdir, real barb=arrowbarb) { arrowhead3 a; a.head=new surface(path3 g, position position=EndPoint, pen p=currentpen, real size=0, real angle=arrowangle, filltype filltype=null, bool forwards=true, projection P=currentprojection) { if(size == 0) size=a.size(p); bool relative=position.relative; real position=position.position.x; if(relative) position=reltime(g,position); path3 r=subpath(g,position,0); path3 s=subpath(r,arctime(r,size),0); bool straight1=length(s) == 1 && straight(g,0); path3 H=path3(HookHead(dir,barb).head((0,0)--(0,size),p,size,angle), YZplane); surface head=surface(O,reverse(approach(subpath(H,1,0),7,1.5))& approach(subpath(H,1,2),4,2),Z); if(straight1) { triple v=point(s,0); triple u=point(s,1)-v; return shift(v)*align(unit(u))*head; } else { bend(head,s,size); return head; } }; a.arrowhead2=HookHead; a.gap=0.7; return a; } arrowhead3 HookHead3=HookHead3(); arrowhead3 TeXHead3; TeXHead3.size=TeXHead.size; TeXHead3.arcsize=TeXHead.size; TeXHead3.arrowhead2=TeXHead; TeXHead3.head=new surface(path3 g, position position=EndPoint, pen p=currentpen, real size=0, real angle=arrowangle, filltype filltype=null, bool forwards=true, projection P=currentprojection) { real texsize=TeXHead3.size(p); if(size == 0) size=texsize; bool relative=position.relative; real position=position.position.x; if(relative) position=reltime(g,position); path3 r=subpath(g,position,0); path3 s=subpath(r,arctime(r,size),0); bool straight1=length(s) == 1 && straight(g,0); surface head=surface(O,approach(subpath(path3(TeXHead.head((0,0)--(0,1),p, size), YZplane),5,0),8,1.5),Z); if(straight1) { triple v=point(s,0); triple u=point(s,1)-v; return shift(v)*align(unit(u))*head; } else { path3 s=subpath(r,arctime(r,size/texsize*arrowsize(p)),0); bend(head,s,size); return head; } }; path3 arrowbase(path3 r, triple y, real t, real size) { triple perp=2*size*perp(dir(r,t)); return size == 0 ? y : y+perp--y-perp; } arrowhead3 DefaultHead2(triple normal=O) { arrowhead3 a; a.head=new surface(path3 g, position position=EndPoint, pen p=currentpen, real size=0, real angle=arrowangle, filltype filltype=null, bool forwards=true, projection P=currentprojection) { if(size == 0) size=a.size(p); path h=a.project(g,forwards,P); a.size=min(size,arclength(h)); path[] H=a.align(DefaultHead.head(h,p,size,angle),h); H=forwards ? yscale(-1)*H : H; return a.surface(g,position,size,H,p,filltype,normal,P); }; a.gap=1.005; return a; } arrowhead3 DefaultHead2=DefaultHead2(); arrowhead3 HookHead2(real dir=arrowdir, real barb=arrowbarb, triple normal=O) { arrowhead3 a; a.head=new surface(path3 g, position position=EndPoint, pen p=currentpen, real size=0, real angle=arrowangle, filltype filltype=null, bool forwards=true, projection P=currentprojection) { if(size == 0) size=a.size(p); path h=a.project(g,forwards,P); a.size=min(size,arclength(h)); path[] H=a.align(HookHead.head(h,p,size,angle),h); H=forwards ? yscale(-1)*H : H; return a.surface(g,position,size,H,p,filltype,normal,P); }; a.arrowhead2=HookHead; a.gap=1.005; a.splitpath=true; return a; } arrowhead3 HookHead2=HookHead2(); arrowhead3 TeXHead2(triple normal=O) { arrowhead3 a; a.head=new surface(path3 g, position position=EndPoint, pen p=currentpen, real size=0, real angle=arrowangle, filltype filltype=null, bool forwards=true, projection P=currentprojection) { if(size == 0) size=a.size(p); path h=a.project(g,forwards,P); a.size=min(size,arclength(h)); h=rotate(-degrees(dir(h,length(h)),warn=false))*h; path[] H=TeXHead.head(h,p,size,angle); H=forwards ? yscale(-1)*H : H; return a.surface(g,position,size,H,p, filltype == null ? TeXHead.defaultfilltype(p) : filltype, normal,P); }; a.arrowhead2=TeXHead; a.size=TeXHead.size; a.gap=1.005; return a; } arrowhead3 TeXHead2=TeXHead2(); private real position(position position, real size, path3 g, bool center) { bool relative=position.relative; real position=position.position.x; if(relative) { position *= arclength(g); if(center) position += 0.5*size; position=arctime(g,position); } else if(center) position=arctime(g,arclength(subpath(g,0,position))+0.5*size); return position; } void drawarrow(picture pic, arrowhead3 arrowhead=DefaultHead3, path3 g, material p=currentpen, material arrowheadpen=nullpen, real size=0, real angle=arrowangle, position position=EndPoint, filltype filltype=null, bool forwards=true, margin3 margin=NoMargin3, bool center=false, light light=nolight, light arrowheadlight=currentlight, projection P=currentprojection) { pen q=(pen) p; if(filltype != null) { if(arrowheadpen == nullpen && filltype != null) arrowheadpen=filltype.fillpen; if(arrowheadpen == nullpen && filltype != null) arrowheadpen=filltype.drawpen; } if(arrowheadpen == nullpen) arrowheadpen=p; if(size == 0) size=arrowhead.size(q); size=min(arrowsizelimit*arclength(g),size); real position=position(position,size,g,center); g=margin(g,q).g; int L=length(g); if(!forwards) { g=reverse(g); position=L-position; } path3 r=subpath(g,position,0); size=min(arrowsizelimit*arclength(r),size); surface head=arrowhead.head(g,position,q,size,angle,filltype,forwards,P); if(arrowhead.size > 0) size=arrowhead.size; bool endpoint=position > L-sqrtEpsilon; if(arrowhead.splitpath || endpoint) { if(position > 0) { real Size=size*arrowhead.gap; draw(pic,subpath(r,arctime(r,Size),length(r)),p,light); } if(!endpoint) draw(pic,subpath(g,position,L),p,light); } else draw(pic,g,p,light); draw(pic,head,arrowheadpen,arrowheadlight); } void drawarrow2(picture pic, arrowhead3 arrowhead=DefaultHead3, path3 g, material p=currentpen, material arrowheadpen=nullpen, real size=0, real angle=arrowangle, filltype filltype=null, margin3 margin=NoMargin3, light light=nolight, light arrowheadlight=currentlight, projection P=currentprojection) { pen q=(pen) p; if(filltype != null) { if(arrowheadpen == nullpen && filltype != null) arrowheadpen=filltype.fillpen; if(arrowheadpen == nullpen && filltype != null) arrowheadpen=filltype.drawpen; } if(arrowheadpen == nullpen) arrowheadpen=p; if(size == 0) size=arrowhead.size(q); g=margin(g,q).g; size=min(arrow2sizelimit*arclength(g),size); path3 r=reverse(g); int L=length(g); real Size=size*arrowhead.gap; draw(pic,subpath(r,arctime(r,Size),L-arctime(g,Size)),p,light); draw(pic,arrowhead.head(g,L,q,size,angle,filltype,forwards=true,P), arrowheadpen,arrowheadlight); draw(pic,arrowhead.head(r,L,q,size,angle,filltype,forwards=false,P), arrowheadpen,arrowheadlight); } // Add to picture an estimate of the bounding box contribution of arrowhead // using the local slope at endpoint. void addArrow(picture pic, arrowhead3 arrowhead, path3 g, pen p, real size, real angle, filltype filltype, real position) { triple v=point(g,position); path3 g=v-(size+linewidth(p))*dir(g,position)--v; surface s=arrowhead.head(g,position,p,size,angle); if(s.s.length > 0) { pic.addPoint(v,min(s)-v); pic.addPoint(v,max(s)-v); } else pic.addPoint(v); } picture arrow(arrowhead3 arrowhead=DefaultHead3, path3 g, material p=currentpen, material arrowheadpen=p, real size=0, real angle=arrowangle, filltype filltype=null, position position=EndPoint, bool forwards=true, margin3 margin=NoMargin3, bool center=false, light light=nolight, light arrowheadlight=currentlight) { pen q=(pen) p; if(size == 0) size=arrowhead.size(q); picture pic; if(is3D()) pic.add(new void(frame f, transform3 t, picture pic2, projection P) { picture opic; drawarrow(opic,arrowhead,t*g,p,arrowheadpen,size,angle,position, filltype,forwards,margin,center,light,arrowheadlight,P); add(f,opic.fit3(identity4,pic2,P)); }); addPath(pic,g,q); real position=position(position,size,g,center); path3 G; if(!forwards) { G=reverse(g); position=length(g)-position; } else G=g; addArrow(pic,arrowhead,G,q,size,angle,filltype,position); return pic; } picture arrow2(arrowhead3 arrowhead=DefaultHead3, path3 g, material p=currentpen, material arrowheadpen=p, real size=0, real angle=arrowangle, filltype filltype=null, margin3 margin=NoMargin3, light light=nolight, light arrowheadlight=currentlight) { pen q=(pen) p; if(size == 0) size=arrowhead.size(q); picture pic; if(is3D()) pic.add(new void(frame f, transform3 t, picture pic2, projection P) { picture opic; drawarrow2(opic,arrowhead,t*g,p,arrowheadpen,size,angle,filltype, margin,light,arrowheadlight,P); add(f,opic.fit3(identity4,pic2,P)); }); addPath(pic,g,q); int L=length(g); addArrow(pic,arrowhead,g,q,size,angle,filltype,L); addArrow(pic,arrowhead,reverse(g),q,size,angle,filltype,L); return pic; } void add(picture pic, arrowhead3 arrowhead, real size, real angle, filltype filltype, position position, material arrowheadpen, path3 g, material p, bool forwards=true, margin3 margin, bool center=false, light light, light arrowheadlight) { add(pic,arrow(arrowhead,g,p,arrowheadpen,size,angle,filltype,position, forwards,margin,center,light,arrowheadlight)); if(!is3D()) { pic.add(new void(frame f, transform3 t, picture pic, projection P) { if(pic != null) { pen q=(pen) p; path3 G=t*g; marginT3 m=margin(G,q); add(pic,arrow(arrowhead.arrowhead2,project(G,P),q,size,angle, filltype == null ? arrowhead.arrowhead2.defaultfilltype ((pen) arrowheadpen) : filltype,position, forwards,TrueMargin(m.begin,m.end),center)); } },true); } } void add2(picture pic, arrowhead3 arrowhead, real size, real angle, filltype filltype, material arrowheadpen, path3 g, material p, margin3 margin, light light, light arrowheadlight) { add(pic,arrow2(arrowhead,g,p,arrowheadpen,size,angle,filltype,margin,light, arrowheadlight)); if(!is3D()) { pic.add(new void(frame f, transform3 t, picture pic, projection P) { if(pic != null) { pen q=(pen) p; path3 G=t*g; marginT3 m=margin(G,q); add(pic,arrow2(arrowhead.arrowhead2,project(G,P),q,size,angle, filltype == null ? arrowhead.arrowhead2.defaultfilltype ((pen) arrowheadpen) : filltype, TrueMargin(m.begin,m.end))); } },true); } } void bar(picture pic, triple a, triple d, triple perp=O, material p=currentpen, light light=nolight) { d *= 0.5; perp *= 0.5; pic.add(new void(frame f, transform3 t, picture pic2, projection P) { picture opic; triple A=t*a; triple v=d == O ? abs(perp)*unit(cross(P.normal,perp)) : d; draw(opic,A-v--A+v,p,light); add(f,opic.fit3(identity4,pic2,P)); }); triple v=d == O ? cross(currentprojection.normal,perp) : d; pen q=(pen) p; triple m=min3(q); triple M=max3(q); pic.addPoint(a,-v-m); pic.addPoint(a,-v+m); pic.addPoint(a,v-M); pic.addPoint(a,v+M); } picture bar(triple a, triple dir, triple perp=O, material p=currentpen) { picture pic; bar(pic,a,dir,perp,p); return pic; } typedef bool arrowbar3(picture, path3, material, margin3, light, light); bool Blank(picture, path3, material, margin3, light, light) { return false; } bool None(picture, path3, material, margin3, light, light) { return true; } arrowbar3 BeginArrow3(arrowhead3 arrowhead=DefaultHead3, real size=0, real angle=arrowangle, filltype filltype=null, position position=BeginPoint, material arrowheadpen=nullpen) { return new bool(picture pic, path3 g, material p, margin3 margin, light light, light arrowheadlight) { add(pic,arrowhead,size,angle,filltype,position,arrowheadpen,g,p, forwards=false,margin,light,arrowheadlight); return false; }; } arrowbar3 Arrow3(arrowhead3 arrowhead=DefaultHead3, real size=0, real angle=arrowangle, filltype filltype=null, position position=EndPoint, material arrowheadpen=nullpen) { return new bool(picture pic, path3 g, material p, margin3 margin, light light, light arrowheadlight) { add(pic,arrowhead,size,angle,filltype,position,arrowheadpen,g,p,margin, light,arrowheadlight); return false; }; } arrowbar3 EndArrow3(arrowhead3 arrowhead=DefaultHead3, real size=0, real angle=arrowangle, filltype filltype=null, position position=EndPoint, material arrowheadpen=nullpen)=Arrow3; arrowbar3 MidArrow3(arrowhead3 arrowhead=DefaultHead3, real size=0, real angle=arrowangle, filltype filltype=null, material arrowheadpen=nullpen) { return new bool(picture pic, path3 g, material p, margin3 margin, light light, light arrowheadlight) { add(pic,arrowhead,size,angle,filltype,MidPoint, arrowheadpen,g,p,margin,center=true,light,arrowheadlight); return false; }; } arrowbar3 Arrows3(arrowhead3 arrowhead=DefaultHead3, real size=0, real angle=arrowangle, filltype filltype=null, material arrowheadpen=nullpen) { return new bool(picture pic, path3 g, material p, margin3 margin, light light, light arrowheadlight) { add2(pic,arrowhead,size,angle,filltype,arrowheadpen,g,p,margin,light, arrowheadlight); return false; }; } arrowbar3 BeginArcArrow3(arrowhead3 arrowhead=DefaultHead3, real size=0, real angle=arcarrowangle, filltype filltype=null, position position=BeginPoint, material arrowheadpen=nullpen) { return new bool(picture pic, path3 g, material p, margin3 margin, light light, light arrowheadlight) { real size=size == 0 ? arrowhead.arcsize((pen) p) : size; add(pic,arrowhead,size,angle,filltype,position,arrowheadpen,g,p, forwards=false,margin,light,arrowheadlight); return false; }; } arrowbar3 ArcArrow3(arrowhead3 arrowhead=DefaultHead3, real size=0, real angle=arcarrowangle, filltype filltype=null, position position=EndPoint, material arrowheadpen=nullpen) { return new bool(picture pic, path3 g, material p, margin3 margin, light light, light arrowheadlight) { real size=size == 0 ? arrowhead.arcsize((pen) p) : size; add(pic,arrowhead,size,angle,filltype,position,arrowheadpen,g,p,margin, light,arrowheadlight); return false; }; } arrowbar3 EndArcArrow3(arrowhead3 arrowhead=DefaultHead3, real size=0, real angle=arcarrowangle, filltype filltype=null, position position=EndPoint, material arrowheadpen=nullpen)=ArcArrow3; arrowbar3 MidArcArrow3(arrowhead3 arrowhead=DefaultHead3, real size=0, real angle=arcarrowangle, filltype filltype=null, material arrowheadpen=nullpen) { return new bool(picture pic, path3 g, material p, margin3 margin, light light, light arrowheadlight) { real size=size == 0 ? arrowhead.arcsize((pen) p) : size; add(pic,arrowhead,size,angle,filltype,MidPoint,arrowheadpen,g,p,margin, center=true,light,arrowheadlight); return false; }; } arrowbar3 ArcArrows3(arrowhead3 arrowhead=DefaultHead3, real size=0, real angle=arcarrowangle, filltype filltype=null, material arrowheadpen=nullpen) { return new bool(picture pic, path3 g, material p, margin3 margin, light light, light arrowheadlight) { real size=size == 0 ? arrowhead.arcsize((pen) p) : size; add2(pic,arrowhead,size,angle,filltype,arrowheadpen,g,p,margin,light, arrowheadlight); return false; }; } arrowbar3 BeginBar3(real size=0, triple dir=O) { return new bool(picture pic, path3 g, material p, margin3 margin, light light, light) { real size=size == 0 ? barsize((pen) p) : size; bar(pic,point(g,0),size*unit(dir),size*dir(g,0),p,light); return true; }; } arrowbar3 Bar3(real size=0, triple dir=O) { return new bool(picture pic, path3 g, material p, margin3 margin, light light, light) { int L=length(g); real size=size == 0 ? barsize((pen) p) : size; bar(pic,point(g,L),size*unit(dir),size*dir(g,L),p,light); return true; }; } arrowbar3 EndBar3(real size=0, triple dir=O)=Bar3; arrowbar3 Bars3(real size=0, triple dir=O) { return new bool(picture pic, path3 g, material p, margin3 margin, light light, light) { real size=size == 0 ? barsize((pen) p) : size; BeginBar3(size,dir)(pic,g,p,margin,light,nolight); EndBar3(size,dir)(pic,g,p,margin,light,nolight); return true; }; } arrowbar3 BeginArrow3=BeginArrow3(), MidArrow3=MidArrow3(), Arrow3=Arrow3(), EndArrow3=Arrow3(), Arrows3=Arrows3(), BeginArcArrow3=BeginArcArrow3(), MidArcArrow3=MidArcArrow3(), ArcArrow3=ArcArrow3(), EndArcArrow3=ArcArrow3(), ArcArrows3=ArcArrows3(), BeginBar3=BeginBar3(), Bar3=Bar3(), EndBar3=Bar3(), Bars3=Bars3(); asymptote-3.05/base/plain_picture.asy0000644000000000000000000013373315031566105016466 0ustar rootroot// Pre picture <<<1 import plain_bounds; include plain_prethree; // This variable is required by asymptote.sty. pair viewportsize=0; // Horizontal and vertical viewport limits. restricted bool Aspect=true; restricted bool IgnoreAspect=false; struct coords3 { coord[] x,y,z; void erase() { x.delete(); y.delete(); z.delete(); } // Only a shallow copy of the individual elements of x and y // is needed since, once entered, they are never modified. coords3 copy() { coords3 c=new coords3; c.x=copy(x); c.y=copy(y); c.z=copy(z); return c; } void append(coords3 c) { x.append(c.x); y.append(c.y); z.append(c.z); } void push(triple user, triple truesize) { x.push(coord.build(user.x,truesize.x)); y.push(coord.build(user.y,truesize.y)); z.push(coord.build(user.z,truesize.z)); } void push(coord cx, coord cy, coord cz) { x.push(cx); y.push(cy); z.push(cz); } void push(transform3 t, coords3 c1, coords3 c2, coords3 c3) { for(int i=0; i < c1.x.length; ++i) { coord cx=c1.x[i], cy=c2.y[i], cz=c3.z[i]; triple tinf=shiftless(t)*(0,0,0); triple z=t*(cx.user,cy.user,cz.user); triple w=(cx.truesize,cy.truesize,cz.truesize); w=length(w)*unit(shiftless(t)*w); coord Cx,Cy,Cz; Cx.user=z.x; Cy.user=z.y; Cz.user=z.z; Cx.truesize=w.x; Cy.truesize=w.y; Cz.truesize=w.z; push(Cx,Cy,Cz); } } } // scaleT and Legend <<< using scalefcn=real(real); struct scaleT { scalefcn T,Tinv; bool logarithmic; bool automin,automax; void operator init(scalefcn T, scalefcn Tinv, bool logarithmic=false, bool automin=false, bool automax=false) { this.T=T; this.Tinv=Tinv; this.logarithmic=logarithmic; this.automin=automin; this.automax=automax; } scaleT copy() { scaleT dest=scaleT(T,Tinv,logarithmic,automin,automax); return dest; } }; scaleT operator init() { scaleT S=scaleT(identity,identity); return S; } using boundRoutine=void(); struct autoscaleT { scaleT scale; scaleT postscale; real tickMin=-infinity, tickMax=infinity; boundRoutine[] bound; // Optional routines to recompute the bounding box. bool automin=false, automax=false; bool automin() {return automin && scale.automin;} bool automax() {return automax && scale.automax;} real T(real x) {return postscale.T(scale.T(x));} scalefcn T() {return scale.logarithmic ? postscale.T : T;} real Tinv(real x) {return scale.Tinv(postscale.Tinv(x));} autoscaleT copy() { autoscaleT dest=new autoscaleT; dest.scale=scale.copy(); dest.postscale=postscale.copy(); dest.tickMin=tickMin; dest.tickMax=tickMax; dest.bound=copy(bound); dest.automin=(bool) automin; dest.automax=(bool) automax; return dest; } } struct ScaleT { bool set; autoscaleT x; autoscaleT y; autoscaleT z; ScaleT copy() { ScaleT dest=new ScaleT; dest.set=set; dest.x=x.copy(); dest.y=y.copy(); dest.z=z.copy(); return dest; } }; struct Legend { string label; pen plabel; pen p; frame mark; bool above; void operator init(string label, pen plabel=currentpen, pen p=nullpen, frame mark=newframe, bool above=true) { this.label=label; this.plabel=plabel; this.p=(p == nullpen) ? plabel : p; this.mark=mark; this.above=above; } } // >>> // Frame Alignment was here triple min3(pen p) { return linewidth(p)*(-0.5,-0.5,-0.5); } triple max3(pen p) { return linewidth(p)*(0.5,0.5,0.5); } // A function that draws an object to frame pic, given that the transform // from user coordinates to true-size coordinates is t. using drawer=void(frame f, transform t); // A generalization of drawer that includes the final frame's bounds. // TODO: Add documentation as to what T is. using drawerBound=void(frame f, transform t, transform T, pair lb, pair rt); struct node { drawerBound d; string key; void operator init(drawerBound d, string key=xasyKEY()) { this.d=d; this.key=key; } } // PairOrTriple <<<1 // This struct is used to represent a userMin/userMax which serves as both a // pair and a triple depending on the context. struct pairOrTriple { real x,y,z; void init() { x=y=z=0; } }; void copyPairOrTriple(pairOrTriple dest, pairOrTriple src) { dest.x=src.x; dest.y=src.y; dest.z=src.z; } pair operator cast (pairOrTriple a) { return (a.x, a.y); }; triple operator cast (pairOrTriple a) { return (a.x, a.y, a.z); } void write(pairOrTriple a) { write((triple) a); } struct picture { // <<<1 // Nodes <<<2 // Three-dimensional version of drawer and drawerBound: using drawer3=void(frame f, transform3 t, picture pic, projection P); using drawerBound3=void(frame f, transform3 t, transform3 T, picture pic, projection P, triple lb, triple rt); struct node3 { drawerBound3 d; string key; void operator init(drawerBound3 d, string key=xasyKEY()) { this.d=d; this.key=key; } } // The functions to do the deferred drawing. node[] nodes; node3[] nodes3; bool uptodate=true; bool queueErase=false; bool queueErase3=false; struct bounds3 { coords3 point,min,max; bool exact=true; // An accurate picture bounds is provided by the user. void erase() { point.erase(); min.erase(); max.erase(); } bounds3 copy() { bounds3 b=new bounds3; b.point=point.copy(); b.min=min.copy(); b.max=max.copy(); b.exact=exact; return b; } } bounds bounds; bounds3 bounds3; // Other Fields <<<2 // Transform to be applied to this picture. transform T; transform3 T3; // The internal representation of the 3D user bounds. private pairOrTriple umin, umax; private bool usetx, usety, usetz; ScaleT scale; // Needed by graph Legend[] legend; pair[] clipmax; // Used by beginclip/endclip pair[] clipmin; // The maximum sizes in the x, y, and z directions; zero means no restriction. real xsize=0, ysize=0; real xsize3=0, ysize3=0, zsize3=0; // Fixed unitsizes in the x y, and z directions; zero means use // xsize, ysize, and zsize. real xunitsize=0, yunitsize=0, zunitsize=0; // If true, the x and y directions must be scaled by the same amount. bool keepAspect=true; // A fixed scaling transform. bool fixed; transform fixedscaling; // Init and erase <<<2 void init() { umin.init(); umax.init(); usetx=usety=usetz=false; T3=identity(4); } init(); // Erase the current picture, retaining bounds. void clear() { queueErase=nodes.length > 0; if(settings.render != 0) queueErase3=nodes3.length > 0; nodes.delete(); nodes3.delete(); legend.delete(); } // Erase the current picture, retaining any size specification. void erase() { clear(); bounds.erase(); bounds3.erase(); T=identity(); scale=new ScaleT; init(); } // Empty <<<2 bool empty2() { return nodes.length == 0; } bool empty3() { return nodes3.length == 0; } bool empty() { return empty2() && empty3(); } // User min/max <<<2 pair userMin2() {return bounds.userMin(); } pair userMax2() {return bounds.userMax(); } bool userSetx2() { return bounds.userBoundsAreSet(); } bool userSety2() { return bounds.userBoundsAreSet(); } triple userMin3() { return umin; } triple userMax3() { return umax; } bool userSetx3() { return usetx; } bool userSety3() { return usety; } bool userSetz3() { return usetz; } private using binop=real(real, real); // Helper functions for finding the minimum/maximum of two data, one of // which may not be defined. private static real merge(real x1, bool set1, real x2, bool set2, binop m) { return set1 ? (set2 ? m(x1,x2) : x1) : x2; } private pairOrTriple userExtreme(pair u2(), triple u3(), binop m) { bool setx2=userSetx2(); bool sety2=userSety2(); bool setx3=userSetx3(); bool sety3=userSety3(); pair p; if (setx2 || sety2) p=u2(); triple t=u3(); pairOrTriple r; r.x=merge(p.x, setx2, t.x, setx3, m); r.y=merge(p.y, sety2, t.y, sety3, m); r.z=t.z; return r; } // The combination of 2D and 3D data. pairOrTriple userMin() { return userExtreme(userMin2, userMin3, min); } pairOrTriple userMax() { return userExtreme(userMax2, userMax3, max); } bool userSetx() { return userSetx2() || userSetx3(); } bool userSety() { return userSety2() || userSety3(); } bool userSetz()=userSetz3; // Functions for setting the user bounds. void userMinx3(real x) { umin.x=x; usetx=true; } void userMiny3(real y) { umin.y=y; usety=true; } void userMinz3(real z) { umin.z=z; usetz=true; } void userMaxx3(real x) { umax.x=x; usetx=true; } void userMaxy3(real y) { umax.y=y; usety=true; } void userMaxz3(real z) { umax.z=z; usetz=true; } void userMinx2(real x) { bounds.alterUserBound("minx", x); } void userMinx(real x) { userMinx2(x); userMinx3(x); } void userMiny2(real y) { bounds.alterUserBound("miny", y); } void userMiny(real y) { userMiny2(y); userMiny3(y); } void userMaxx2(real x) { bounds.alterUserBound("maxx", x); } void userMaxx(real x) { userMaxx2(x); userMaxx3(x); } void userMaxy2(real y) { bounds.alterUserBound("maxy", y); } void userMaxy(real y) { userMaxy2(y); userMaxy3(y); } void userMinz(real z)=userMinz3; void userMaxz(real z)=userMaxz3; void userCorners3(triple c000, triple c001, triple c010, triple c011, triple c100, triple c101, triple c110, triple c111) { umin.x=min(c000.x,c001.x,c010.x,c011.x,c100.x,c101.x,c110.x,c111.x); umin.y=min(c000.y,c001.y,c010.y,c011.y,c100.y,c101.y,c110.y,c111.y); umin.z=min(c000.z,c001.z,c010.z,c011.z,c100.z,c101.z,c110.z,c111.z); umax.x=max(c000.x,c001.x,c010.x,c011.x,c100.x,c101.x,c110.x,c111.x); umax.y=max(c000.y,c001.y,c010.y,c011.y,c100.y,c101.y,c110.y,c111.y); umax.z=max(c000.z,c001.z,c010.z,c011.z,c100.z,c101.z,c110.z,c111.z); } // Cache the current user-space bounding box x coodinates void userBoxX3(real min, real max, binop m=min, binop M=max) { if (usetx) { umin.x=m(umin.x,min); umax.x=M(umax.x,max); } else { umin.x=min; umax.x=max; usetx=true; } } // Cache the current user-space bounding box y coodinates void userBoxY3(real min, real max, binop m=min, binop M=max) { if (usety) { umin.y=m(umin.y,min); umax.y=M(umax.y,max); } else { umin.y=min; umax.y=max; usety=true; } } // Cache the current user-space bounding box z coodinates void userBoxZ3(real min, real max, binop m=min, binop M=max) { if (usetz) { umin.z=m(umin.z,min); umax.z=M(umax.z,max); } else { umin.z=min; umax.z=max; usetz=true; } } // Cache the current user-space bounding box void userBox3(triple min, triple max) { userBoxX3(min.x,max.x); userBoxY3(min.y,max.y); userBoxZ3(min.z,max.z); } // Add drawer <<<2 void add(drawerBound d, bool exact=false, bool above=true) { uptodate=false; if(!exact) bounds.exact=false; if(above) nodes.push(node(d)); else nodes.insert(0,node(d)); } // Faster implementation of most common case. void addExactAbove(drawerBound d) { uptodate=false; nodes.push(node(d)); } void add(drawer d, bool exact=false, bool above=true) { add(new void(frame f, transform t, transform T, pair, pair) { d(f,t*T); },exact,above); } void add(drawerBound3 d, bool exact=false, bool above=true) { uptodate=false; if(!exact) bounds.exact=false; if(above) nodes3.push(node3(d)); else nodes3.insert(0,node3(d)); } void add(drawer3 d, bool exact=false, bool above=true) { add(new void(frame f, transform3 t, transform3 T, picture pic, projection P, triple, triple) { d(f,t*T,pic,P); },exact,above); } // Clip <<<2 void clip(pair min, pair max, drawer d, bool exact=false) { bounds.clip(min, max); this.add(d,exact); } void clip(pair min, pair max, drawerBound d, bool exact=false) { bounds.clip(min, max); this.add(d,exact); } // Add sizing <<<2 // Add a point to the sizing. void addPoint(pair user, pair truesize=0) { bounds.addPoint(user,truesize); //userBox(user,user); } // Add a point to the sizing, accounting also for the size of the pen. void addPoint(pair user, pair truesize=0, pen p) { addPoint(user,truesize+min(p)); addPoint(user,truesize+max(p)); } void addPoint(triple user, triple truesize=(0,0,0)) { bounds3.point.push(user,truesize); userBox3(user,user); } void addPoint(triple user, triple truesize=(0,0,0), pen p) { addPoint(user,truesize+min3(p)); addPoint(user,truesize+max3(p)); } // Add a box to the sizing. void addBox(pair userMin, pair userMax, pair trueMin=0, pair trueMax=0) { bounds.addBox(userMin, userMax, trueMin, trueMax); } void addBox(triple userMin, triple userMax, triple trueMin=(0,0,0), triple trueMax=(0,0,0)) { bounds3.min.push(userMin,trueMin); bounds3.max.push(userMax,trueMax); userBox3(userMin,userMax); } // For speed reason, we unravel the addPath routines from bounds. This // avoids an extra function call. from bounds unravel addPath; // Size commands <<<2 void size(real x, real y=x, bool keepAspect=this.keepAspect) { if(!empty()) uptodate=false; xsize=x; ysize=y; this.keepAspect=keepAspect; } void size3(real x, real y=x, real z=y, bool keepAspect=this.keepAspect) { if(!empty3()) uptodate=false; xsize3=x; ysize3=y; zsize3=z; this.keepAspect=keepAspect; } void unitsize(real x, real y=x, real z=y) { uptodate=false; xunitsize=x; yunitsize=y; zunitsize=z; } // min/max of picture <<<2 // Calculate the min for the final frame, given the coordinate transform. pair min(transform t) { return bounds.min(t); } // Calculate the max for the final frame, given the coordinate transform. pair max(transform t) { return bounds.max(t); } // Calculate the min for the final frame, given the coordinate transform. triple min(transform3 t) { if(bounds3.min.x.length == 0 && bounds3.point.x.length == 0 && bounds3.max.x.length == 0) return (0,0,0); triple a=t*(1,1,1)-t*(0,0,0), b=t*(0,0,0); scaling xs=scaling.build(a.x,b.x); scaling ys=scaling.build(a.y,b.y); scaling zs=scaling.build(a.z,b.z); return (min(min(min(infinity,xs,bounds3.point.x),xs,bounds3.min.x), xs,bounds3.max.x), min(min(min(infinity,ys,bounds3.point.y),ys,bounds3.min.y), ys,bounds3.max.y), min(min(min(infinity,zs,bounds3.point.z),zs,bounds3.min.z), zs,bounds3.max.z)); } // Calculate the max for the final frame, given the coordinate transform. triple max(transform3 t) { if(bounds3.min.x.length == 0 && bounds3.point.x.length == 0 && bounds3.max.x.length == 0) return (0,0,0); triple a=t*(1,1,1)-t*(0,0,0), b=t*(0,0,0); scaling xs=scaling.build(a.x,b.x); scaling ys=scaling.build(a.y,b.y); scaling zs=scaling.build(a.z,b.z); return (max(max(max(-infinity,xs,bounds3.point.x),xs,bounds3.min.x), xs,bounds3.max.x), max(max(max(-infinity,ys,bounds3.point.y),ys,bounds3.min.y), ys,bounds3.max.y), max(max(max(-infinity,zs,bounds3.point.z),zs,bounds3.min.z), zs,bounds3.max.z)); } void append(coords3 point, coords3 min, coords3 max, transform3 t, bounds3 bounds) { // Add the coord info to this picture. if(t == identity4) { point.append(bounds.point); min.append(bounds.min); max.append(bounds.max); } else { point.push(t,bounds.point,bounds.point,bounds.point); // Add in all 8 corner points, to properly size cuboid pictures. point.push(t,bounds.min,bounds.min,bounds.min); point.push(t,bounds.min,bounds.min,bounds.max); point.push(t,bounds.min,bounds.max,bounds.min); point.push(t,bounds.min,bounds.max,bounds.max); point.push(t,bounds.max,bounds.min,bounds.min); point.push(t,bounds.max,bounds.min,bounds.max); point.push(t,bounds.max,bounds.max,bounds.min); point.push(t,bounds.max,bounds.max,bounds.max); } } // Scaling and Fit <<<2 // Returns the transform for turning user-space pairs into true-space pairs. transform scaling(real xsize, real ysize, bool keepAspect=true, bool warn=true) { bounds b=(T == identity()) ? this.bounds : T * this.bounds; return b.scaling(xsize, ysize, xunitsize, yunitsize, keepAspect, warn); } transform scaling(bool warn=true) { return scaling(xsize,ysize,keepAspect,warn); } // Returns the transform for turning user-space pairs into true-space triples. transform3 scaling(real xsize, real ysize, real zsize, bool keepAspect=true, bool warn=true) { if(xsize == 0 && xunitsize == 0 && ysize == 0 && yunitsize == 0 && zsize == 0 && zunitsize == 0) return identity(4); coords3 Coords; append(Coords,Coords,Coords,T3,bounds3); real sx; if(xunitsize == 0) { if(xsize != 0) sx=calculateScaling("x",Coords.x,xsize,warn); } else sx=xunitsize; real sy; if(yunitsize == 0) { if(ysize != 0) sy=calculateScaling("y",Coords.y,ysize,warn); } else sy=yunitsize; real sz; if(zunitsize == 0) { if(zsize != 0) sz=calculateScaling("z",Coords.z,zsize,warn); } else sz=zunitsize; if(sx == 0) { sx=max(sy,sz); if(sx == 0) return identity(4); } if(sy == 0) sy=max(sz,sx); if(sz == 0) sz=max(sx,sy); if(keepAspect && (xunitsize == 0 || yunitsize == 0 || zunitsize == 0)) return scale3(min(sx,sy,sz)); else return scale(sx,sy,sz); } transform3 scaling3(bool warn=true) { return scaling(xsize3,ysize3,zsize3,keepAspect,warn); } frame fit(transform t, transform T0=T, pair m, pair M) { frame f; for(node n : nodes) { xasyKEY(n.key); n.d(f,t,T0,m,M); } return f; } frame fit3(transform3 t, transform3 T0=T3, picture pic, projection P, triple m, triple M) { frame f; for(node3 n : nodes3) { xasyKEY(settings.xasy ? nodes3[0].key : n.key); n.d(f,t,T0,pic,P,m,M); } return f; } // Returns a rigid version of the picture using t to transform user coords // into truesize coords. frame fit(transform t) { return fit(t,min(t),max(t)); } frame fit3(transform3 t, picture pic, projection P) { return fit3(t,pic,P,min(t),max(t)); } // Add drawer wrappers <<<2 void add(void d(picture, transform), bool exact=false) { add(new void(frame f, transform t) { picture opic=new picture; d(opic,t); add(f,opic.fit(identity)); },exact); } void add(void d(picture, transform3), bool exact=false, bool above=true) { add(new void(frame f, transform3 t, picture pic2, projection P) { picture opic=new picture; d(opic,t); add(f,opic.fit3(identity4,pic2,P)); },exact,above); } void add(void d(picture, transform3, transform3, projection, triple, triple), bool exact=false, bool above=true) { add(new void(frame f, transform3 t, transform3 T, picture pic2, projection P, triple lb, triple rt) { picture opic=new picture; d(opic,t,T,P,lb,rt); add(f,opic.fit3(identity4,pic2,P)); },exact,above); } // More scaling <<<2 frame scaled() { frame f=fit(fixedscaling); pair d=size(f); static real epsilon=100*realEpsilon; if(d.x > xsize*(1+epsilon)) warning("xlimit","frame exceeds xlimit: "+(string) d.x+" > "+ (string) xsize); if(d.y > ysize*(1+epsilon)) warning("ylimit","frame exceeds ylimit: "+(string) d.y+" > "+ (string) ysize); return f; } // Calculate additional scaling required if only an approximate picture // size estimate is available. transform scale(frame f, real xsize=this.xsize, real ysize=this.ysize, bool keepaspect=this.keepAspect) { if(bounds.exact) return identity(); pair m=min(f); pair M=max(f); real width=M.x-m.x; real height=M.y-m.y; real xgrow=xsize == 0 || width == 0 ? 1 : xsize/width; real ygrow=ysize == 0 || height == 0 ? 1 : ysize/height; if(keepAspect) { real[] grow; if(xsize > 0) grow.push(xgrow); if(ysize > 0) grow.push(ygrow); return scale(grow.length == 0 ? 1 : min(grow)); } else return scale(xgrow,ygrow); } // Calculate additional scaling required if only an approximate picture // size estimate is available. transform3 scale3(frame f, real xsize3=this.xsize3, real ysize3=this.ysize3, real zsize3=this.zsize3, bool keepaspect=this.keepAspect) { if(bounds3.exact) return identity(4); triple m=min3(f); triple M=max3(f); real width=M.x-m.x; real height=M.y-m.y; real depth=M.z-m.z; real xgrow=xsize3 == 0 || width == 0 ? 1 : xsize3/width; real ygrow=ysize3 == 0 || height == 0 ? 1 : ysize3/height; real zgrow=zsize3 == 0 || depth == 0 ? 1 : zsize3/depth; if(keepAspect) { real[] grow; if(xsize3 > 0) grow.push(xgrow); if(ysize3 > 0) grow.push(ygrow); if(zsize3 > 0) grow.push(zgrow); return scale3(grow.length == 0 ? 1 : min(grow)); } else return scale(xgrow,ygrow,zgrow); } // calculateTransform with scaling <<<2 // Return the transform that would be used to fit the picture to a frame transform calculateTransform(real xsize, real ysize, bool keepAspect=true, bool warn=true) { transform t=scaling(xsize,ysize,keepAspect,warn); return scale(fit(t),xsize,ysize,keepAspect)*t; } transform calculateTransform(bool warn=true) { if(fixed) return fixedscaling; return calculateTransform(xsize,ysize,keepAspect,warn); } transform3 calculateTransform3(real xsize=xsize3, real ysize=ysize3, real zsize=zsize3, bool keepAspect=true, bool warn=true, projection P=currentprojection) { transform3 t=scaling(xsize,ysize,zsize,keepAspect,warn); return scale3(fit3(t,null,P),keepAspect)*t; } // min/max with xsize and ysize <<<2 // NOTE: These are probably very slow as implemented. pair min(real xsize=this.xsize, real ysize=this.ysize, bool keepAspect=this.keepAspect, bool warn=true) { return min(calculateTransform(xsize,ysize,keepAspect,warn)); } pair max(real xsize=this.xsize, real ysize=this.ysize, bool keepAspect=this.keepAspect, bool warn=true) { return max(calculateTransform(xsize,ysize,keepAspect,warn)); } triple min3(real xsize=this.xsize3, real ysize=this.ysize3, real zsize=this.zsize3, bool keepAspect=this.keepAspect, bool warn=true, projection P) { return min(calculateTransform3(xsize,ysize,zsize,keepAspect,warn,P)); } triple max3(real xsize=this.xsize3, real ysize=this.ysize3, real zsize=this.zsize3, bool keepAspect=this.keepAspect, bool warn=true, projection P) { return max(calculateTransform3(xsize,ysize,zsize,keepAspect,warn,P)); } // More Fitting <<<2 // Returns the 2D picture fit to the requested size. frame fit2(real xsize=this.xsize, real ysize=this.ysize, bool keepAspect=this.keepAspect) { if(fixed) return scaled(); if(empty2()) return newframe; transform t=scaling(xsize,ysize,keepAspect); frame f=fit(t); transform s=scale(f,xsize,ysize,keepAspect); if(s == identity()) return f; return fit(s*t); } static frame fitter(string,picture,string,real,real,bool,bool,string,string, light,projection); frame fit(string prefix="", string format="", real xsize=this.xsize, real ysize=this.ysize, bool keepAspect=this.keepAspect, bool view=false, string options="", string script="", light light=currentlight, projection P=currentprojection) { return fitter == null ? fit2(xsize,ysize,keepAspect) : fitter(prefix,this,format,xsize,ysize,keepAspect,view,options,script, light,P); } // Fit a 3D picture. frame fit3(projection P=currentprojection) { if(settings.render == 0) return fit(P); if(fixed) return scaled(); if(empty3()) return newframe; transform3 t=scaling(xsize3,ysize3,zsize3,keepAspect); frame f=fit3(t,null,P); transform3 s=scale3(f,xsize3,ysize3,zsize3,keepAspect); if(s == identity4) return f; return fit3(s*t,null,P); } // In case only an approximate picture size estimate is available, return the // fitted frame slightly scaled (including labels and true size distances) // so that it precisely meets the given size specification. frame scale(real xsize=this.xsize, real ysize=this.ysize, bool keepAspect=this.keepAspect) { frame f=fit(xsize,ysize,keepAspect); transform s=scale(f,xsize,ysize,keepAspect); if(s == identity()) return f; return s*f; } // Copying <<<2 // Copies enough information to yield the same userMin/userMax. void userCopy2(picture pic) { userMinx2(pic.userMin2().x); userMiny2(pic.userMin2().y); userMaxx2(pic.userMax2().x); userMaxy2(pic.userMax2().y); } void userCopy3(picture pic) { copyPairOrTriple(umin, pic.umin); copyPairOrTriple(umax, pic.umax); usetx=pic.usetx; usety=pic.usety; usetz=pic.usetz; } void userCopy(picture pic) { userCopy2(pic); userCopy3(pic); } // Copies the drawing information, but not the sizing information into a new // picture. Fitting this picture will not scale as the original picture would. picture drawcopy() { picture dest=new picture; dest.nodes=copy(nodes); dest.nodes3=copy(nodes3); dest.T=T; dest.T3=T3; // TODO: User bounds are sizing info, which probably shouldn't be part of // a draw copy. Should we move this down to copy()? dest.userCopy3(this); dest.scale=scale.copy(); dest.legend=copy(legend); return dest; } // A deep copy of this picture. Modifying the copied picture will not affect // the original. picture copy() { picture dest=drawcopy(); dest.uptodate=uptodate; dest.bounds=bounds.copy(); dest.bounds3=bounds3.copy(); dest.xsize=xsize; dest.ysize=ysize; dest.xsize3=xsize; dest.ysize3=ysize3; dest.zsize3=zsize3; dest.keepAspect=keepAspect; dest.xunitsize=xunitsize; dest.yunitsize=yunitsize; dest.zunitsize=zunitsize; dest.fixed=fixed; dest.fixedscaling=fixedscaling; return dest; } // Helper function for defining transformed pictures. Do not call it // directly. picture transformed(transform t) { picture dest=drawcopy(); // Replace nodes with a single drawer that realizes the transform. node[] oldnodes=dest.nodes; void drawAll(frame f, transform tt, transform T, pair lb, pair rt) { transform Tt=T*t; for (node n : oldnodes) { xasyKEY(n.key); n.d(f,tt,Tt,lb,rt); } } dest.nodes=new node[] {node(drawAll)}; dest.uptodate=uptodate; dest.bounds=bounds.transformed(t); dest.bounds3=bounds3.copy(); dest.bounds.exact=false; dest.xsize=xsize; dest.ysize=ysize; dest.xsize3=xsize; dest.ysize3=ysize3; dest.zsize3=zsize3; dest.keepAspect=keepAspect; dest.xunitsize=xunitsize; dest.yunitsize=yunitsize; dest.zunitsize=zunitsize; dest.fixed=fixed; dest.fixedscaling=fixedscaling; return dest; } // Add Picture <<<2 // Add a picture to this picture, such that the user coordinates will be // scaled identically when fitted void add(picture src, bool group=true, filltype filltype=NoFill, bool above=true) { // Copy the picture. Only the drawing function closures are needed, so we // only copy them. This needs to be a deep copy, as src could later have // objects added to it that should not be included in this picture. if(src == this) abort("cannot add picture to itself"); uptodate=false; picture srcCopy=src.drawcopy(); // Draw by drawing the copied picture. if(srcCopy.nodes.length > 0) { nodes.push(node(new void(frame f, transform t, transform T, pair m, pair M) { add(f,srcCopy.fit(t,T*srcCopy.T,m,M),group,filltype,above); })); } if(srcCopy.nodes3.length > 0) { nodes3.push(node3(new void(frame f, transform3 t, transform3 T3, picture pic, projection P, triple m, triple M) { add(f,srcCopy.fit3(t,T3*srcCopy.T3,pic,P,m,M),group,above); })); } legend.append(src.legend); if(src.usetx) userBoxX3(src.umin.x,src.umax.x); if(src.usety) userBoxY3(src.umin.y,src.umax.y); if(src.usetz) userBoxZ3(src.umin.z,src.umax.z); bounds.append(srcCopy.T, src.bounds); //append(bounds.point,bounds.min,bounds.max,srcCopy.T,src.bounds); append(bounds3.point,bounds3.min,bounds3.max,srcCopy.T3,src.bounds3); //if(!src.bounds.exact) bounds.exact=false; if(!src.bounds3.exact) bounds3.exact=false; } } // Post Struct <<<1 picture operator * (transform t, picture orig) { return orig.transformed(t); } picture operator * (transform3 t, picture orig) { picture pic=orig.copy(); pic.T3=t*pic.T3; triple umin=pic.userMin3(), umax=pic.userMax3(); pic.userCorners3(t*umin, t*(umin.x,umin.y,umax.z), t*(umin.x,umax.y,umin.z), t*(umin.x,umax.y,umax.z), t*(umax.x,umin.y,umin.z), t*(umax.x,umin.y,umax.z), t*(umax.x,umax.y,umin.z), t*umax); pic.bounds3.exact=false; return pic; } picture currentpicture; void size(picture pic=currentpicture, real x, real y=x, bool keepAspect=pic.keepAspect) { pic.size(x,y,keepAspect); } void size(picture pic=currentpicture, transform t) { if(pic.empty3()) { pair z=size(pic.fit(t)); pic.size(z.x,z.y); } } void size3(picture pic=currentpicture, real x, real y=x, real z=y, bool keepAspect=pic.keepAspect) { pic.size3(x,y,z,keepAspect); } void unitsize(picture pic=currentpicture, real x, real y=x, real z=y) { pic.unitsize(x,y,z); } void size(picture pic=currentpicture, real xsize, real ysize, pair min, pair max) { pair size=max-min; pic.unitsize(size.x != 0 ? xsize/size.x : 0, size.y != 0 ? ysize/size.y : 0); } void size(picture dest, picture src) { dest.size(src.xsize,src.ysize,src.keepAspect); dest.size3(src.xsize3,src.ysize3,src.zsize3,src.keepAspect); dest.unitsize(src.xunitsize,src.yunitsize,src.zunitsize); } pair min(picture pic, bool user=false) { transform t=pic.calculateTransform(); pair z=pic.min(t); return user ? inverse(t)*z : z; } pair max(picture pic, bool user=false) { transform t=pic.calculateTransform(); pair z=pic.max(t); return user ? inverse(t)*z : z; } pair size(picture pic, bool user=false) { transform t=pic.calculateTransform(); pair M=pic.max(t); pair m=pic.min(t); if(!user) return M-m; t=inverse(t); return t*M-t*m; } // Return a projection adjusted to view center of pic from specified direction. projection centered(projection P, picture pic=currentpicture) { projection P=P.copy(); if(P.autoadjust && P.center) { triple min=pic.userMin3(); triple max=pic.userMax3(); if(min != max) { triple target=0.5*(max+min); if(pic.keepAspect) P.camera=target+P.vector(); else P.camera=target+realmult(unit(P.vector()),max-min); P.target=target; P.normal=P.vector(); P.calculate(); } } return P; } // Frame Alignment <<< pair rectify(pair dir) { real scale=max(abs(dir.x),abs(dir.y)); if(scale != 0) dir *= 0.5/scale; dir += (0.5,0.5); return dir; } pair point(frame f, pair dir) { pair m=min(f); pair M=max(f); return m+realmult(rectify(dir),M-m); } path[] align(path[] g, transform t=identity(), pair position, pair align, pen p=currentpen) { if(g.length == 0) return g; pair m=min(g); pair M=max(g); pair dir=rectify(inverse(t)*-align); if(basealign(p) == 1) dir -= (0,m.y/(M.y-m.y)); pair a=m+realmult(dir,M-m); return shift(position+align*labelmargin(p))*t*shift(-a)*g; } // Returns a transform for aligning frame f in the direction align transform shift(frame f, pair align) { return shift(align-point(f,-align)); } // Returns a copy of frame f aligned in the direction align frame align(frame f, pair align) { return shift(f,align)*f; } // >>> pair point(picture pic=currentpicture, pair dir, bool user=true) { pair umin=pic.userMin2(); pair umax=pic.userMax2(); pair z=umin+realmult(rectify(dir),umax-umin); return user ? z : pic.calculateTransform()*z; } pair truepoint(picture pic=currentpicture, pair dir, bool user=true) { transform t=pic.calculateTransform(); pair m=pic.min(t); pair M=pic.max(t); pair z=m+realmult(rectify(dir),M-m); return user ? inverse(t)*z : z; } // Transform coordinate in [0,1]x[0,1] to current user coordinates. pair relative(picture pic=currentpicture, pair z) { return pic.userMin2()+realmult(z,pic.userMax2()-pic.userMin2()); } void add(picture pic=currentpicture, drawer d, bool exact=false) { pic.add(d,exact); } using drawer3=void(frame f, transform3 t, picture pic, projection P); void add(picture pic=currentpicture, drawer3 d, bool exact=false) { pic.add(d,exact); } void add(picture pic=currentpicture, void d(picture,transform), bool exact=false) { pic.add(d,exact); } void add(picture pic=currentpicture, void d(picture,transform3), bool exact=false) { pic.add(d,exact); } void begingroup(picture pic=currentpicture) { pic.add(new void(frame f, transform) { begingroup(f); },true); } void endgroup(picture pic=currentpicture) { pic.add(new void(frame f, transform) { endgroup(f); },true); } void Draw(picture pic=currentpicture, path g, pen p=currentpen) { pic.add(new void(frame f, transform t) { draw(f,t*g,p); },true); pic.addPath(g,p); } // Default arguments have been removed to increase speed. void _draw(picture pic, path g, pen p, margin margin) { if (size(nib(p)) == 0 && margin==NoMargin) { // Inline the drawerBound wrapper for speed. pic.addExactAbove(new void(frame f, transform t, transform T, pair, pair) { _draw(f,t*T*g,p); }); } else { pic.add(new void(frame f, transform t) { draw(f,margin(t*g,p).g,p); },true); } pic.addPath(g,p); } void Draw(picture pic=currentpicture, explicit path[] g, pen p=currentpen) { // Could optimize this by adding one drawer. for(int i=0; i < g.length; ++i) Draw(pic,g[i],p); } void fill(picture pic=currentpicture, path[] g, pen p=currentpen, bool copy=true) { if(copy) g=copy(g); pic.add(new void(frame f, transform t) { fill(f,t*g,p,false); },true); pic.addPath(g); } void drawstrokepath(picture pic=currentpicture, path g, pen strokepen, pen p=currentpen) { pic.add(new void(frame f, transform t) { draw(f,strokepath(t*g,strokepen),p); },true); pic.addPath(g,p); } void latticeshade(picture pic=currentpicture, path[] g, bool stroke=false, pen fillrule=currentpen, pen[][] p, bool copy=true) { if(copy) { g=copy(g); p=copy(p); } pic.add(new void(frame f, transform t) { latticeshade(f,t*g,stroke,fillrule,p,t,false); },true); pic.addPath(g); } void axialshade(picture pic=currentpicture, path[] g, bool stroke=false, pen pena, pair a, bool extenda=true, pen penb, pair b, bool extendb=true, bool copy=true) { if(copy) g=copy(g); pic.add(new void(frame f, transform t) { axialshade(f,t*g,stroke,pena,t*a,extenda,penb,t*b,extendb,false); },true); pic.addPath(g); } void radialshade(picture pic=currentpicture, path[] g, bool stroke=false, pen pena, pair a, real ra, bool extenda=true, pen penb, pair b, real rb, bool extendb=true, bool copy=true) { if(copy) g=copy(g); pic.add(new void(frame f, transform t) { pair A=t*a, B=t*b; real RA=abs(t*(a+ra)-A); real RB=abs(t*(b+rb)-B); radialshade(f,t*g,stroke,pena,A,RA,extenda,penb,B,RB,extendb,false); },true); pic.addPath(g); } void gouraudshade(picture pic=currentpicture, path[] g, bool stroke=false, pen fillrule=currentpen, pen[] p, pair[] z, int[] edges, bool copy=true) { if(copy) { g=copy(g); p=copy(p); z=copy(z); edges=copy(edges); } pic.add(new void(frame f, transform t) { gouraudshade(f,t*g,stroke,fillrule,p,t*z,edges,false); },true); pic.addPath(g); } void gouraudshade(picture pic=currentpicture, path[] g, bool stroke=false, pen fillrule=currentpen, pen[] p, int[] edges, bool copy=true) { if(copy) { g=copy(g); p=copy(p); edges=copy(edges); } pic.add(new void(frame f, transform t) { gouraudshade(f,t*g,stroke,fillrule,p,edges,false); },true); pic.addPath(g); } void tensorshade(picture pic=currentpicture, path[] g, bool stroke=false, pen fillrule=currentpen, pen[][] p, path[] b=new path[], pair[][] z=new pair[][], bool copy=true) { bool compact=b.length == 0 || b[0] == nullpath; if(copy) { g=copy(g); p=copy(p); if(!compact) b=copy(b); z=copy(z); } pic.add(new void(frame f, transform t) { pair[][] Z=new pair[z.length][]; for(int i=0; i < z.length; ++i) Z[i]=t*z[i]; path[] G=t*g; if(compact) tensorshade(f,G,stroke,fillrule,p,Z,false); else tensorshade(f,G,stroke,fillrule,p,t*b,Z,false); },true); pic.addPath(g); } void tensorshade(frame f, path[] g, bool stroke=false, pen fillrule=currentpen, pen[] p, path b=g.length > 0 ? g[0] : nullpath, pair[] z=new pair[]) { tensorshade(f,g,stroke,fillrule,new pen[][] {p},b, z.length > 0 ? new pair[][] {z} : new pair[][]); } void tensorshade(picture pic=currentpicture, path[] g, bool stroke=false, pen fillrule=currentpen, pen[] p, path b=nullpath, pair[] z=new pair[]) { tensorshade(pic,g,stroke,fillrule,new pen[][] {p},b, z.length > 0 ? new pair[][] {z} : new pair[][]); } // Smoothly shade the regions between consecutive paths of a sequence using a // given array of pens: void draw(picture pic=currentpicture, path[] g, pen fillrule=currentpen, pen[] p) { path[] G; pen[][] P; string differentlengths="arrays have different lengths"; if(g.length != p.length) abort(differentlengths); for(int i=0; i < g.length-1; ++i) { path g0=g[i]; path g1=g[i+1]; if(length(g0) != length(g1)) abort(differentlengths); for(int j=0; j < length(g0); ++j) { G.push(subpath(g0,j,j+1)--reverse(subpath(g1,j,j+1))--cycle); P.push(new pen[] {p[i],p[i],p[i+1],p[i+1]}); } } tensorshade(pic,G,fillrule,P); } void functionshade(picture pic=currentpicture, path[] g, bool stroke=false, pen fillrule=currentpen, string shader, bool copy=true) { if(copy) g=copy(g); pic.add(new void(frame f, transform t) { functionshade(f,t*g,stroke,fillrule,shader); },true); pic.addPath(g); } void filldraw(picture pic=currentpicture, path[] g, pen fillpen=currentpen, pen drawpen=currentpen) { begingroup(pic); fill(pic,g,fillpen); Draw(pic,g,drawpen); endgroup(pic); } void clip(picture pic=currentpicture, path[] g, bool stroke=false, pen fillrule=currentpen, bool copy=true) { if(copy) g=copy(g); pic.clip(min(g), max(g), new void(frame f, transform t) { clip(f,t*g,stroke,fillrule,false); }, true); } void beginclip(picture pic=currentpicture, path[] g, bool stroke=false, pen fillrule=currentpen, bool copy=true) { if(copy) g=copy(g); pic.clipmin.push(min(g)); pic.clipmax.push(max(g)); pic.add(new void(frame f, transform t) { beginclip(f,t*g,stroke,fillrule,false); },true); } void endclip(picture pic=currentpicture) { pair min,max; if (pic.clipmin.length > 0 && pic.clipmax.length > 0) { min=pic.clipmin.pop(); max=pic.clipmax.pop(); } else { // We should probably abort here, since the PostScript output will be // garbage. warning("endclip", "endclip without beginclip"); min=pic.userMin2(); max=pic.userMax2(); } pic.clip(min, max, new void(frame f, transform) { endclip(f); }, true); } void unfill(picture pic=currentpicture, path[] g, bool copy=true) { if(copy) g=copy(g); pic.add(new void(frame f, transform t) { unfill(f,t*g,false); },true); } void filloutside(picture pic=currentpicture, path[] g, pen p=currentpen, bool copy=true) { if(copy) g=copy(g); pic.add(new void(frame f, transform t) { filloutside(f,t*g,p,false); },true); pic.addPath(g); } // Use a fixed scaling to map user coordinates in box(min,max) to the // desired picture size. transform fixedscaling(picture pic=currentpicture, pair min, pair max, pen p=nullpen, bool warn=false) { Draw(pic,min,p+invisible); Draw(pic,max,p+invisible); pic.fixed=true; return pic.fixedscaling=pic.calculateTransform(pic.xsize,pic.ysize, pic.keepAspect); } // Add frame src to frame dest about position with optional grouping. void add(frame dest, frame src, pair position, bool group=false, filltype filltype=NoFill, bool above=true) { add(dest,shift(position)*src,group,filltype,above); } // Add frame src to picture dest about position with optional grouping. void add(picture dest=currentpicture, frame src, pair position=0, bool group=true, filltype filltype=NoFill, bool above=true) { if(is3D(src)) { dest.add(new void(frame f, transform3, picture, projection) { add(f,src); // always add about 3D origin (ignore position) },true); dest.addBox((0,0,0),(0,0,0),min3(src),max3(src)); } else { dest.add(new void(frame f, transform t) { add(f,shift(t*position)*src,group,filltype,above); },true); dest.addBox(position,position,min(src),max(src)); } } // Like add(picture,frame,pair) but extend picture to accommodate frame. void attach(picture dest=currentpicture, frame src, pair position=0, bool group=true, filltype filltype=NoFill, bool above=true) { transform t=dest.calculateTransform(); add(dest,src,position,group,filltype,above); pair s=size(dest.fit(t)); size(dest,dest.xsize != 0 ? s.x : 0,dest.ysize != 0 ? s.y : 0); } // Like add(picture,frame,pair) but align frame in direction align. void add(picture dest=currentpicture, frame src, pair position, pair align, bool group=true, filltype filltype=NoFill, bool above=true) { add(dest,align(src,align),position,group,filltype,above); } // Like add(frame,frame,pair) but align frame in direction align. void add(frame dest, frame src, pair position, pair align, bool group=true, filltype filltype=NoFill, bool above=true) { add(dest,align(src,align),position,group,filltype,above); } // Like add(picture,frame,pair,pair) but extend picture to accommodate frame; void attach(picture dest=currentpicture, frame src, pair position, pair align, bool group=true, filltype filltype=NoFill, bool above=true) { attach(dest,align(src,align),position,group,filltype,above); } // Add a picture to another such that user coordinates in both will be scaled // identically in the shipout. void add(picture dest, picture src, bool group=true, filltype filltype=NoFill, bool above=true) { dest.add(src,group,filltype,above); } void add(picture src, bool group=true, filltype filltype=NoFill, bool above=true) { currentpicture.add(src,group,filltype,above); } // Fit the picture src and add it about the point position to picture dest. void add(picture dest, picture src, pair position, bool group=true, filltype filltype=NoFill, bool above=true) { add(dest,src.fit(),position,group,filltype,true); } void add(picture src, pair position, bool group=true, filltype filltype=NoFill, bool above=true) { add(currentpicture,src,position,group,filltype,above); } // Fill a region about the user-coordinate 'origin'. void fill(pair origin, picture pic=currentpicture, path[] g, pen p=currentpen) { picture opic; fill(opic,g,p); add(pic,opic.fit(identity),origin); } void postscript(picture pic=currentpicture, string s) { pic.add(new void(frame f, transform) { postscript(f,s); },true); } void postscript(picture pic=currentpicture, string s, pair min, pair max) { pic.add(new void(frame f, transform t) { postscript(f,s,t*min,t*max); },true); } void tex(picture pic=currentpicture, string s) { // Force TeX string s to be evaluated immediately (in case it is a macro). frame g; tex(g,s); size(g); pic.add(new void(frame f, transform) { tex(f,s); },true); } void tex(picture pic=currentpicture, string s, pair min, pair max) { frame g; tex(g,s); size(g); pic.add(new void(frame f, transform t) { tex(f,s,t*min,t*max); },true); } void layer(picture pic=currentpicture) { pic.add(new void(frame f, transform) { layer(f); },true); } void erase(picture pic=currentpicture) { pic.uptodate=false; pic.erase(); } void begin(picture pic=currentpicture, string name, string id="", bool visible=true) { if(!latex() || !pdf()) return; settings.twice=true; if(id == "") id=string(++ocgindex); tex(pic,"\begin{ocg}{"+name+"}{"+id+"}{"+(visible ? "1" : "0")+"}"); layer(pic); } void end(picture pic=currentpicture) { if(!latex() || !pdf()) return; tex(pic,"\end{ocg}%"); layer(pic); } // For users of the LaTeX babel package. void deactivatequote(picture pic=currentpicture) { tex(pic,"\catcode`\"=12"); } void activatequote(picture pic=currentpicture) { tex(pic,"\catcode`\"=13"); } asymptote-3.05/base/plain_debugger.asy0000644000000000000000000000421315031566105016565 0ustar rootrootint debuggerlines=5; int sourceline(string file, string text) { string file=locatefile(file); string[] source=input(file); for(int line=0; line < source.length; ++line) if(find(source[line],text) >= 0) return line+1; write("no matching line in "+file+": \""+text+"\""); return 0; } void stop(string file, string text, code s=quote{}) { int line=sourceline(file,text); if(line > 0) stop(file,line,s); } void clear(string file, string text) { int line=sourceline(file,text); if(line > 0) clear(file,line); } // Enable debugging. bool debugging=true; // Variables used by conditional expressions: // e.g. stop("test",2,quote{ignore=(++count <= 10);}); bool ignore; int count=0; string debugger(string file, int line, int column, code s=quote{}) { int verbose=settings.verbose; settings.verbose=0; _eval(s,true); if(ignore) { ignore=false; settings.verbose=verbose; return "c"; } static string s; if(debugging) { static string lastfile; static string[] source; bool help=false; while(true) { if(file != lastfile && file != "-") {source=input(file); lastfile=file;} write(); for(int i=max(line-debuggerlines,0); i < min(line,source.length); ++i) write(source[i]); for(int i=0; i < column-1; ++i) write(" ",none); write("^"+(verbose == 5 ? " trace" : "")); if(help) { write("c:continue f:file h:help i:inst n:next r:return s:step t:trace q:quit x:exit"); help=false; } string Prompt=file+": "+(string) line+"."+(string) column; Prompt += "? [%s] "; s=getstring(name="debug",default="h",prompt=Prompt,store=false); if(s == "h" || s == "?") {help=true; continue;} if(s == "c" || s == "s" || s == "n" || s == "i" || s == "f" || s == "r") break; if(s == "q") {debugging=false; abort();} // quit if(s == "x") {debugging=false; return "";} // exit if(s == "t") { // trace if(verbose == 0) { verbose=5; } else { verbose=0; } continue; } _eval(s+";",true); } } settings.verbose=verbose; return s; } atbreakpoint(debugger); asymptote-3.05/base/slide.asy0000644000000000000000000004000315031566105014713 0ustar rootrootimport fontsize; usepackage("asycolors"); bool reverse=false; // Set to true to enable reverse video. bool stepping=false; // Set to true to enable stepping. bool itemstep=true; // Set to false to disable stepping on each item. settings.toolbar=false; // Disable 3D toolbar by default. if(settings.render < 0) settings.render=4; bool allowstepping=false; // Allow stepping for current slide. real pagemargin=0.5cm; real pagewidth=-2pagemargin; real pageheight=-2pagemargin; bool landscape=orientation == Landscape || orientation == Seascape; if(landscape) { orientation=Portrait; pagewidth += settings.paperheight; pageheight += settings.paperwidth; } else { pagewidth += settings.paperwidth; pageheight += settings.paperheight; } texpreamble("\paperwidth="+string(pagewidth)+"bp"); texpreamble("\paperheight"+string(pageheight)+"bp"); size(pagewidth,pageheight,IgnoreAspect); picture background; real minipagemargin=1inch; real minipagewidth=pagewidth-2minipagemargin; transform tinv=inverse(fixedscaling((-1,-1),(1,1),currentpen)); pen itempen=fontsize(24pt); pen codepen=fontsize(20pt); pen titlepagepen=fontsize(36pt); pen authorpen=fontsize(24pt); pen institutionpen=authorpen; pen datepen=fontsize(18pt); pen urlpen=datepen; real itemskip=0.5; real codeskip=0.25; real aboveequationskip=-1.25; pair dateskip=(0,0.1); pair urlskip=(0,0.2); pair titlealign=3S; pen titlepen=fontsize(32pt); real titleskip=0.5; string oldbulletcolor; string newbulletcolor="red"; string bullet="{\bulletcolor\textbullet}"; pair pagenumberposition=S+E; pair pagenumberalign=4NW; pen pagenumberpen=fontsize(12); pen steppagenumberpen=colorless(pagenumberpen); real figureborder=0.25cm; pen figuremattpen; pen backgroundcolor; pen foregroundcolor; pair titlepageposition=(-0.8,0.4); pair startposition=(-0.8,0.9); pair currentposition=startposition; string bulletcolor(string color) { return "\def\bulletcolor{"+'\\'+"color{"+color+"}}%"; } int[] firstnode=new int[] {currentpicture.nodes.length}; int[] lastnode; bool firststep=true; int page=0; bool havepagenumber=true; int preamblenodes=2; bool empty() { return currentpicture.nodes.length <= preamblenodes; } void background() { if(!background.empty()) { add(background); layer(); preamblenodes += 2; } } void color(string name, string color) { texpreamble("\def"+'\\'+name+"#1{{\color{"+color+"}#1}}%"); } string texcolor(pen p) { real[] colors=colors(p); string s; if(colors.length > 0) { s="{"+colorspace(p)+"}{"; for(int i=0; i < colors.length-1; ++i) s += format("%.6f",colors[i],"C")+","; s += format("%.6f",colors[colors.length-1],"C")+"}"; } return s; } void setpens(pen red=red, pen blue=blue, pen steppen=red) { itempen=colorless(itempen); codepen=colorless(codepen); pagenumberpen=colorless(pagenumberpen); steppagenumberpen=colorless(steppagenumberpen)+steppen; titlepagepen=colorless(titlepagepen)+red; authorpen=colorless(authorpen)+blue; institutionpen=colorless(institutionpen)+blue; datepen=colorless(datepen); urlpen=colorless(urlpen); } void reversevideo() { backgroundcolor=black; foregroundcolor=white; fill(background,box((-1,-1),(1,1)),backgroundcolor); setpens(mediumred,paleblue,mediumblue); // Work around pdflatex bug, in which white is mapped to black! figuremattpen=pdf() ? cmyk(0,0,0,1/255) : white; color("Red","mediumred"); color("Green","green"); color("Blue","paleblue"); color("Foreground","white"); color("Background","black"); oldbulletcolor="white"; defaultpen(itempen+foregroundcolor); } void normalvideo() { backgroundcolor=invisible; foregroundcolor=black; background=new picture; size(background,currentpicture); setpens(); figuremattpen=invisible; color("Red","red"); color("Green","heavygreen"); color("Blue","blue"); color("Foreground","black"); color("Background","white"); oldbulletcolor="black"; defaultpen(itempen+foregroundcolor); } normalvideo(); texpreamble(bulletcolor(newbulletcolor)); texpreamble("\hyphenpenalty=10000\tolerance=1000"); texpreamble("\usepackage{amsmath}"); // Evaluate user command line option. void usersetting() { plain.usersetting(); if(reverse) { // Black background reversevideo(); } else { // White background normalvideo(); } } void numberpage(pen p=pagenumberpen) { if(havepagenumber) { label((string) page,pagenumberposition,pagenumberalign,p); } } void nextpage(pen p=pagenumberpen) { if(!empty()) { numberpage(p); newpage(); } background(); firststep=true; } void newslide(bool stepping=true) { allowstepping=stepping; nextpage(); ++page; havepagenumber=true; currentposition=startposition; firstnode=new int[] {currentpicture.nodes.length}; lastnode.delete(); } bool checkposition() { if(abs(currentposition.x) > 1 || abs(currentposition.y) > 1) { newslide(); return false; } return true; } void erasestep(int erasenode) { if(!stepping || !allowstepping) return; if(!checkposition()) return; lastnode.push(erasenode); nextpage(steppagenumberpen); for(int i=0; i < firstnode.length; ++i) { for(int j=firstnode[i]; j <= lastnode[i]; ++j) { tex(bulletcolor(oldbulletcolor)); currentpicture.add(currentpicture.nodes[j].d); } } firstnode.push(currentpicture.nodes.length-1); tex(bulletcolor(newbulletcolor)); } void step() { // Step without erasing anything. erasestep(currentpicture.nodes.length-1); } void incrementposition(pair z) { currentposition += z; } void title(string s, pair position=N, pair align=titlealign, pen p=titlepen, bool newslide=true) { if(newslide) newslide(); checkposition(); frame f; if(s != "") label(f,minipage("\center "+s,minipagewidth),(0,0),align,p); add(f,position,labelmargin(p)*align); currentposition=(currentposition.x,position.y+ (tinv*(min(f)-titleskip*I*lineskip(p)*pt)).y); } void outline(string s="Outline", pair position=N, pair align=titlealign, pen p=titlepen) { newslide(stepping=false); title(s,position,align,p,newslide=false); } void remark(bool center=false, string s, pair align=0, pen p=itempen, real indent=0, bool minipage=true, real skip=itemskip, filltype filltype=NoFill, bool step=false) { checkposition(); if(minipage) s=minipage(s,minipagewidth); pair offset; if(center) { if(align == 0) align=S; offset=(0,currentposition.y); } else { if(align == 0) align=SE; offset=currentposition; } frame f; label(f,s,(indent,0),align,p,filltype); pair m=tinv*min(f); pair M=tinv*min(f); if(abs(offset.x+M.x) > 1) warning("slidetoowide","slide too wide on page "+(string) page+':\n'+ (string) s); if(abs(offset.y+M.y) > 1) { void toohigh() { warning("slidetoohigh","slide too high on page "+(string) page+':\n'+ (string) s); } if(M.y-m.y < 2) { newslide(); offset=(offset.x,currentposition.y); if(offset.y+M.y > 1 || offset.y+m.y < -1) toohigh(); } else toohigh(); } if(step) { if(!firststep) step(); firststep=false; } add(f,offset); incrementposition((0,(tinv*(min(f)-skip*I*lineskip(p)*pt)).y)); } void center(string s, pen p=itempen) { remark(center=true,"\center "+s,p); } void vbox(string s, pen p=itempen) { remark(center=true,"\vbox{"+s+"}",p,minipage=false,skip=0); } void skip(real n=1) { incrementposition((0,(tinv*(-n*itemskip*I*lineskip(itempen)*pt)).y)); } void equation(string s, pen p=itempen) { skip(aboveequationskip); vbox("\begin{gather*}"+s+"\end{gather*}",p); } void equations(string s, pen p=itempen) { skip(aboveequationskip); if(find(s,"&") >= 0) vbox("\begin{align*}"+s+"\end{align*}",p); else vbox("\begin{gather*}"+s+"\end{gather*}",p); } void display(frame[] f, real margin=0, pair align=S, pen p=itempen, pen figuremattpen=figuremattpen, bool final=true) { if(f.length == 0) return; real[] width=new real[f.length]; real sum; for(int i=0; i < f.length; ++i) { width[i]=size(f[i]).x; sum += width[i]; } if(sum > pagewidth) warning("toowide","slide too wide on page "+(string) page); else margin=(pagewidth-sum)/(f.length+1); real pos; frame F; for(int i=0; i < f.length; ++i) { real w=0.5*(margin+width[i]); pos += w; add(F,f[i],(pos,0),Fill(figureborder,figuremattpen)); pos += w; } add(F,(0,currentposition.y),align); if (final) { real a=0.5(unit(align).y-1); incrementposition( (0, (tinv*(a*(max(F)-min(F))-itemskip*I*lineskip(p)*pt)).y)); } } void display(frame f, real margin=0, pair align=S, pen p=itempen, pen figuremattpen=figuremattpen, bool final=true) { display(new frame[] {f},margin,align,p,figuremattpen, final); } void display(string[] s, real margin=0, string[] captions=new string[], string caption="", pair align=S, pen p=itempen, pen figuremattpen=figuremattpen, bool final=true) { frame[] f=new frame[s.length]; frame F; for(int i=0; i < s.length; ++i) { f[i]=newframe; label(f[i],s[i]); add(F,f[i],(0,0)); } real y=point(F,S).y; int stop=min(s.length,captions.length); for(int i=0; i < stop; ++i) { if(captions[i] != "") label(f[i],captions[i],point(f[i],S).x+I*y,S); } display(f,margin,align,p,figuremattpen, final); if(caption != "") center(caption,p); } void display(string s, string caption="", pair align=S, pen p=itempen, pen figuremattpen=figuremattpen, bool final=true) { display(new string[] {s},caption,align,p,figuremattpen, final); } void figure(string[] s, string options="", real margin=0, string[] captions=new string[], string caption="", string[] url=new string[], pair align=S, pen p=itempen, pen figuremattpen=figuremattpen, bool final=true) { string[] S; for(int i=0; i < s.length; ++i) { S[i]=graphic(s[i],options); if(i < url.length && url[i] != "") S[i]="\href{"+url[i]+"/"+s[i]+".html}{"+S[i]+"}"; } display(S,margin,captions,caption,align,itempen,figuremattpen,final); } void figure(string s, string options="", string caption="", string url="", pair align=S, pen p=itempen, pen figuremattpen=figuremattpen, bool final=true) { figure(new string[] {s},options,caption,new string[] {url},align,p, figuremattpen,final); } void multifigure(string[] slist, string options="", string caption="", pair align=S, pen p=itempen, pen figuremattpen=figuremattpen, bool step=itemstep) { if(step) { int lastnode=currentpicture.nodes.length-1; for (int i=0; i 0 || ysize > 0) ? currentpicture.fit(xsize,ysize) : currentpicture.fit(); currentpicture=currentpictureSave; display(f); } string cropcode(string s) { while(substr(s,0,1) == '\n') s=substr(s,1,length(s)); while(substr(s,length(s)-1,1) == '\n') s=substr(s,0,length(s)-1); return s; } void code(bool center=false, string s, pen p=codepen, real indent=0, real skip=codeskip, filltype filltype=NoFill) { remark(center,"{\tt "+verbatim(cropcode(s))+"}",p,indent,skip,filltype); } void filecode(bool center=false, string s, pen p=codepen, real indent=0, real skip=codeskip, filltype filltype=NoFill) { code(center,file(s),p,indent,skip,filltype); } void asyfigure(string s, string options="", string caption="", pair align=S, pen p=codepen, pen figuremattpen=figuremattpen, filltype filltype=NoFill, bool newslide=false) { string a=s+".asy"; asy(nativeformat(),s); s += "."+nativeformat(); if(newslide && !empty()) { newslide(); currentposition=(currentposition.x,0); align=0; } figure(s,options,caption,align,p,figuremattpen); } string asywrite(string s, string preamble="") { static int count=0; string name=outprefix()+"_slide"+(string) count; ++count; file temp=output(name+".asy"); write(temp,preamble); write(temp,s); close(temp); codefile.push(name); return name; } void asycode(bool center=false, string s, string options="", string caption="", string preamble="", pair align=S, pen p=codepen, pen figuremattpen=figuremattpen, real indent=0, real skip=codeskip, filltype filltype=NoFill, bool newslide=false) { code(center,s,p,indent,skip,filltype); asyfigure(asywrite(s,preamble),options,caption,align,p,figuremattpen,filltype, newslide); } void asyfilecode(bool center=false, string s, string options="", string caption="", pair align=S, pen p=codepen, pen figuremattpen=figuremattpen, real indent=0, real skip=codeskip, filltype filltype=NoFill, bool newslide=false) { filecode(center,s+".asy",p,indent,skip,filltype); asyfigure(s,options,caption,align,p,figuremattpen,filltype,newslide); } void item(string s, pen p=itempen, bool step=itemstep) { frame b; label(b,bullet,(0,0),p); real bulletwidth=max(b).x-min(b).x; remark(bullet+"\hangindent"+(string) (bulletwidth/pt)+"pt$\,$"+s,p, -bulletwidth,step=step); } void subitem(string s, pen p=itempen) { remark("\quad -- "+s,p); } void titlepage(string title, string author, string institution="", string date="", string url="", bool newslide=false) { newslide(); currentposition=titlepageposition; center(title,titlepagepen); center(author,authorpen); if(institution != "") center(institution,institutionpen); currentposition -= dateskip; if(date != "") center(date,datepen); currentposition -= urlskip; if(url != "") center("{\tt "+url+"}",urlpen); } // Resolve optional bibtex citations: void bibliographystyle(string name) { settings.twice=true; settings.keepaux=true; texpreamble("\bibliographystyle{"+name+"}"); } void bibliography(string name) { numberpage(); havepagenumber=false; string s=texcolor(backgroundcolor); if(s != "") tex("\definecolor{Background}"+s+"\pagecolor{Background}%"); label("",itempen); tex("\eject\def\refname{\fontsize{"+string(fontsize(titlepen))+"}{"+ string(lineskip(titlepen))+"}\selectfont References}%"); real hmargin,vmargin; if(pdf()) { hmargin=1; vmargin=0.5; } else { hmargin=1.5; vmargin=1; } string s; if(landscape) { s="{\centering\textheight="+string(pageheight-1inch)+"bp\textwidth="+ string(pagewidth-1.5inches)+"bp"+ "\vsize=\textheight\hsize=\textwidth\linewidth=\hsize"+ "\topmargin="+string(vmargin)+"in\oddsidemargin="+string(hmargin)+"in"; } else s="{\centering\textheight="+string(pageheight-0.5inches)+"bp\textwidth="+ string(pagewidth-0.5inches)+ "bp\hsize=\textwidth\linewidth=\textwidth\vsize=\textheight"+ "\topmargin=0.5in\oddsidemargin=1in"; s += "\evensidemargin=\oddsidemargin\bibliography{"+name+"}\eject}"; tex(s); } exitfcn currentexitfunction=atexit(); void exitfunction() { numberpage(); if(currentexitfunction != null) currentexitfunction(); if(!settings.keep) for(int i=0; i < codefile.length; ++i) { string name=codefile[i]; delete(name+"."+nativeformat()); delete(name+"_.aux"); delete(name+".asy"); } codefile=new string[]; } atexit(exitfunction); asymptote-3.05/base/markers.asy0000644000000000000000000001620615031566105015267 0ustar rootroot// Mark routines and markers written by Philippe Ivaldi. // http://www.piprime.fr/ marker operator * (transform T, marker m) { marker M=new marker; M.f=T*m.f; M.above=m.above; M.markroutine=m.markroutine; return M; } // Add n frames f midway (in arclength) between n+1 uniformly spaced marks. markroutine markinterval(int n=1, frame f, bool rotated=false) { return new void(picture pic=currentpicture, frame mark, path g) { markuniform(n+1,rotated)(pic,mark,g); markuniform(centered=true,n,rotated)(pic,f,g); }; } // Return a frame containing n copies of the path g shifted by space // drawn with pen p. frame duplicate(path g, int n=1, pair space=0, pen p=currentpen) { if(space == 0) space=dotsize(p); frame f; int pos=0; int sign=1; int m=(n+1) % 2; for(int i=1; i <= n; ++i) { draw(f,shift(space*(pos-0.5*m))*g,p); pos += i*sign; sign *= -1; } return f; } real tildemarksizefactor=5; real tildemarksize(pen p=currentpen) { static real golden=(1+sqrt(5))/2; return (1mm+tildemarksizefactor*sqrt(linewidth(p)))/golden; } frame tildeframe(int n=1, real size=0, pair space=0, real angle=0, pair offset=0, pen p=currentpen) { size=(size == 0) ? tildemarksize(p) : size; space=(space == 0) ? 1.5*size : space; path g=yscale(1.25)*((-1.5,-0.5)..(-0.75,0.5)..(0,0)..(0.75,-0.5)..(1.5,0.5)); return duplicate(shift(offset)*rotate(angle)*scale(size)*g,n,space,p); } frame tildeframe=tildeframe(); real stickmarkspacefactor=4; real stickmarksizefactor=10; real stickmarksize(pen p=currentpen) { return 1mm+stickmarksizefactor*sqrt(linewidth(p)); } real stickmarkspace(pen p=currentpen) { return stickmarkspacefactor*sqrt(linewidth(p)); } frame stickframe(int n=1, real size=0, pair space=0, real angle=0, pair offset=0, pen p=currentpen) { if(size == 0) size=stickmarksize(p); if(space == 0) space=stickmarkspace(p); return duplicate(shift(offset)*rotate(angle)*scale(0.5*size)*(N--S),n, space,p); } frame stickframe=stickframe(); real circlemarkradiusfactor=stickmarksizefactor/2; real circlemarkradius(pen p=currentpen) { static real golden=(1+sqrt(5))/2; return (1mm+circlemarkradiusfactor*sqrt(linewidth(p)))/golden; } real barmarksizefactor=stickmarksizefactor; real barmarksize(pen p=currentpen) { return 1mm+barmarksizefactor*sqrt(linewidth(p)); } frame circlebarframe(int n=1, real barsize=0, real radius=0,real angle=0, pair offset=0, pen p=currentpen, filltype filltype=NoFill, bool above=false) { if(barsize == 0) barsize=barmarksize(p); if(radius == 0) radius=circlemarkradius(p); frame opic; path g=circle(offset,radius); frame f=stickframe(n,barsize,space=2*radius/(n+1),angle,offset,p); if(above) { add(opic,f); filltype.fill(opic,g,p); } else { filltype.fill(opic,g,p); add(opic,f); } return opic; } real crossmarksizefactor=5; real crossmarksize(pen p=currentpen) { return 1mm+crossmarksizefactor*sqrt(linewidth(p)); } frame crossframe(int n=3, real size=0, pair space=0, real angle=0, pair offset=0, pen p=currentpen) { if(size == 0) size=crossmarksize(p); frame opic; draw(opic,shift(offset)*rotate(angle)*scale(size)*cross(n),p); return opic; } real markanglespacefactor=4; real markangleradiusfactor=8; real markangleradius(pen p=currentpen) { return 8mm+markangleradiusfactor*sqrt(linewidth(p)); } real markangleradius=markangleradius(); real markanglespace(pen p=currentpen) { return markanglespacefactor*sqrt(linewidth(p)); } real markanglespace=markanglespace(); // Mark the oriented angle AOB counterclockwise with optional Label, arrows, and markers. // With radius < 0, AOB-2pi is marked clockwise. void markangle(picture pic=currentpicture, Label L="", int n=1, real radius=0, real space=0, pair A, pair O, pair B, arrowbar arrow=None, pen p=currentpen, filltype filltype=NoFill, margin margin=NoMargin, marker marker=nomarker) { if(space == 0) space=markanglespace(p); if(radius == 0) radius=markangleradius(p); picture lpic,phantom; frame ff; path lpth; p=squarecap+p; pair OB=unit(B-O), OA=unit(A-O); real xoa=degrees(OA,false); real gle=degrees(acos(dot(OA,OB))); if((conj(OA)*OB).y < 0) gle *= -1; bool ccw=radius > 0; if(!ccw) radius=-radius; bool drawarrow = !arrow(phantom,arc((0,0),radius,xoa,xoa+gle,ccw),p,margin); if(drawarrow && margin == NoMargin) margin=TrueMargin(0,0.5linewidth(p)); if(filltype != NoFill) { lpth=margin(arc((0,0),radius+(n-1)*space,xoa,xoa+gle,ccw),p).g; pair p0=relpoint(lpth,0), p1=relpoint(lpth,1); pair ac=p0-p0-A+O, bd=p1-p1-B+O, det=(conj(ac)*bd).y; pair op=(det == 0) ? O : p0+(conj(p1-p0)*bd).y*ac/det; filltype.fill(ff,op--lpth--relpoint(lpth,1)--cycle,p); add(lpic,ff); } for(int i=0; i < n; ++i) { lpth=margin(arc((0,0),radius+i*space,xoa,xoa+gle,ccw),p).g; draw(lpic,lpth,p=p,arrow=arrow,margin=NoMargin,marker=marker); } Label lL=L.copy(); real position=lL.position.position.x; if(lL.defaultposition) {lL.position.relative=true; position=0.5;} if(lL.position.relative) position=reltime(lpth,position); if(lL.align.default) { lL.align.relative=true; lL.align.dir=unit(point(lpth,position)); } label(lpic,lL,point(lpth,position),align=NoAlign, p=p); add(pic,lpic,O); } marker StickIntervalMarker(int i=2, int n=1, real size=0, real space=0, real angle=0, pair offset=0, bool rotated=true, pen p=currentpen, frame uniform=newframe, bool above=true) { return marker(uniform,markinterval(i,stickframe(n,size,space,angle,offset,p), rotated),above); } marker CrossIntervalMarker(int i=2, int n=3, real size=0, real space=0, real angle=0, pair offset=0, bool rotated=true, pen p=currentpen, frame uniform=newframe, bool above=true) { return marker(uniform,markinterval(i,crossframe(n,size,space,angle,offset,p), rotated=rotated),above); } marker CircleBarIntervalMarker(int i=2, int n=1, real barsize=0, real radius=0, real angle=0, pair offset=0, bool rotated=true, pen p=currentpen, filltype filltype=NoFill, bool circleabove=false, frame uniform=newframe, bool above=true) { return marker(uniform,markinterval(i,circlebarframe(n,barsize,radius,angle, offset,p,filltype, circleabove), rotated),above); } marker TildeIntervalMarker(int i=2, int n=1, real size=0, real space=0, real angle=0, pair offset=0, bool rotated=true, pen p=currentpen, frame uniform=newframe, bool above=true) { return marker(uniform,markinterval(i,tildeframe(n,size,space,angle,offset,p), rotated),above); } asymptote-3.05/base/three_surface.asy0000644000000000000000000022610115031566105016437 0ustar rootrootimport bezulate; private import interpolate; int nslice=12; real camerafactor=1.2; string meshname(string name) {return name+" mesh";} private real Fuzz=10.0*realEpsilon; private real nineth=1/9; // Return the default Coons interior control point for a Bezier triangle // based on the cyclic path3 external. triple coons3(path3 external) { return 0.25*(precontrol(external,0)+postcontrol(external,0)+ precontrol(external,1)+postcontrol(external,1)+ precontrol(external,2)+postcontrol(external,2))- (point(external,0)+point(external,1)+point(external,2))/6; } struct patch { triple[][] P; pen[] colors; // Optionally specify corner colors. bool straight; // Patch is based on a piecewise straight external path. bool3 planar; // Patch is planar. bool triangular; // Patch is a Bezier triangle. path3 external() { return straight ? P[0][0]--P[3][0]--P[3][3]--P[0][3]--cycle : P[0][0]..controls P[1][0] and P[2][0].. P[3][0]..controls P[3][1] and P[3][2].. P[3][3]..controls P[2][3] and P[1][3].. P[0][3]..controls P[0][2] and P[0][1]..cycle; } path3 externaltriangular() { return P[0][0]..controls P[1][0] and P[2][0].. P[3][0]..controls P[3][1] and P[3][2].. P[3][3]..controls P[2][2] and P[1][1]..cycle; } triple[] internal() { return new triple[] {P[1][1],P[2][1],P[2][2],P[1][2]}; } triple[] internaltriangular() { return new triple[] {P[2][1]}; } triple cornermean() { return 0.25*(P[0][0]+P[0][3]+P[3][0]+P[3][3]); } triple cornermeantriangular() { return (P[0][0]+P[3][0]+P[3][3])/3; } triple[] corners() {return new triple[] {P[0][0],P[3][0],P[3][3],P[0][3]};} triple[] cornerstriangular() {return new triple[] {P[0][0],P[3][0],P[3][3]};} real[] map(real f(triple)) { return new real[] {f(P[0][0]),f(P[3][0]),f(P[3][3]),f(P[0][3])}; } real[] maptriangular(real f(triple)) { return new real[] {f(P[0][0]),f(P[3][0]),f(P[3][3])}; } triple Bu(int j, real u) {return bezier(P[0][j],P[1][j],P[2][j],P[3][j],u);} triple BuP(int j, real u) { return bezierP(P[0][j],P[1][j],P[2][j],P[3][j],u); } path3 uequals(real u) { triple z0=Bu(0,u); triple z1=Bu(3,u); return path3(new triple[] {z0,Bu(2,u)},new triple[] {z0,z1}, new triple[] {Bu(1,u),z1},new bool[] {straight,false},false); } triple Bv(int i, real v) {return bezier(P[i][0],P[i][1],P[i][2],P[i][3],v);} triple BvP(int i, real v) { return bezierP(P[i][0],P[i][1],P[i][2],P[i][3],v); } path3 vequals(real v) { triple z0=Bv(0,v); triple z1=Bv(3,v); return path3(new triple[] {z0,Bv(2,v)},new triple[] {z0,z1}, new triple[] {Bv(1,v),z1},new bool[] {straight,false},false); } triple point(real u, real v) { return bezier(Bu(0,u),Bu(1,u),Bu(2,u),Bu(3,u),v); } static real fuzz=1000*realEpsilon; triple normal(triple left3, triple left2, triple left1, triple middle, triple right1, triple right2, triple right3) { real epsilon=fuzz*change2(P); triple lp=3.0*(left1-middle); triple rp=3.0*(right1-middle); triple n=cross(rp,lp); if(abs(n) > epsilon) return n; // Return one-half of the second derivative of the Bezier curve defined // by a,b,c,d at 0. triple bezierPP(triple a, triple b, triple c) { return 3.0*(a+c-2.0*b); } triple lpp=bezierPP(middle,left1,left2); triple rpp=bezierPP(middle,right1,right2); n=cross(rpp,lp)+cross(rp,lpp); if(abs(n) > epsilon) return n; // Return one-sixth of the third derivative of the Bezier curve defined // by a,b,c,d at 0. triple bezierPPP(triple a, triple b, triple c, triple d) { return d-a+3.0*(b-c); } triple lppp=bezierPPP(middle,left1,left2,left3); triple rppp=bezierPPP(middle,right1,right2,right3); n=cross(rpp,lpp)+cross(rppp,lp)+cross(rp,lppp); if(abs(n) > epsilon) return n; n=cross(rppp,lpp)+cross(rpp,lppp); if(abs(n) > epsilon) return n; return cross(rppp,lppp); } triple partialu(real u, real v) { return bezier(BuP(0,u),BuP(1,u),BuP(2,u),BuP(3,u),v); } triple partialv(real u, real v) { return bezier(BvP(0,v),BvP(1,v),BvP(2,v),BvP(3,v),u); } triple normal00() { return normal(P[0][3],P[0][2],P[0][1],P[0][0],P[1][0],P[2][0],P[3][0]); } triple normal10() { return normal(P[0][0],P[1][0],P[2][0],P[3][0],P[3][1],P[3][2],P[3][3]); } triple normal11() { return normal(P[3][0],P[3][1],P[3][2],P[3][3],P[2][3],P[1][3],P[0][3]); } triple normal01() { return normal(P[3][3],P[2][3],P[1][3],P[0][3],P[0][2],P[0][1],P[0][0]); } triple normal(real u, real v) { if(u == 0) { if(v == 0) return normal00(); if(v == 1) return normal01(); } if(u == 1) { if(v == 0) return normal10(); if(v == 1) return normal11(); } return cross(partialu(u,v),partialv(u,v)); } triple pointtriangular(real u, real v) { real w=1-u-v; return w^2*(w*P[0][0]+3*(u*P[1][0]+v*P[1][1]))+ u^2*(3*(w*P[2][0]+v*P[3][1])+u*P[3][0])+ 6*u*v*w*P[2][1]+v^2*(3*(w*P[2][2]+u*P[3][2])+v*P[3][3]); } triple partialutriangular(real u, real v) { // Compute one-third of the directional derivative of a Bezier triangle // in the u direction at (u,v). real w=1-u-v; return -w^2*P[0][0]+w*(w-2*u)*P[1][0]-2*w*v*P[1][1]+u*(2*w-u)*P[2][0]+ 2*v*(w-u)*P[2][1]-v^2*P[2][2]+u^2*P[3][0]+2*u*v*P[3][1]+v^2*P[3][2]; } triple partialvtriangular(real u, real v) { // Compute one-third of the directional derivative of a Bezier triangle // in the v direction at (u,v). real w=1-u-v; return -w^2*P[0][0]-2*u*w*P[1][0]+w*(w-2*v)*P[1][1]-u^2*P[2][0]+ 2*u*(w-v)*P[2][1]+v*(2*w-v)*P[2][2]+u*u*P[3][1]+2*u*v*P[3][2]+ v^2*P[3][3]; } triple normal00triangular() { return normal(P[3][3],P[2][2],P[1][1],P[0][0],P[1][0],P[2][0],P[3][0]); } triple normal10triangular() { return normal(P[0][0],P[1][0],P[2][0],P[3][0],P[3][1],P[3][2],P[3][3]); } triple normal01triangular() { return normal(P[3][0],P[3][1],P[3][2],P[3][3],P[2][2],P[1][1],P[0][0]); } // Compute the normal vector of a Bezier triangle at (u,v) triple normaltriangular(real u, real v) { if(u == 0) { if(v == 0) return normal00triangular(); if(v == 1) return normal01triangular(); } if(u == 1 && v == 0) return normal10triangular(); return cross(partialutriangular(u,v),partialvtriangular(u,v)); } pen[] colors(material m, light light=currentlight) { bool nocolors=colors.length == 0; if(planar) { triple normal=normal(0.5,0.5); return new pen[] {color(normal,nocolors ? m : colors[0],light), color(normal,nocolors ? m : colors[1],light), color(normal,nocolors ? m : colors[2],light), color(normal,nocolors ? m : colors[3],light)}; } return new pen[] {color(normal00(),nocolors ? m : colors[0],light), color(normal10(),nocolors ? m : colors[1],light), color(normal11(),nocolors ? m : colors[2],light), color(normal01(),nocolors ? m : colors[3],light)}; } pen[] colorstriangular(material m, light light=currentlight) { bool nocolors=colors.length == 0; if(planar) { triple normal=normal(1/3,1/3); return new pen[] {color(normal,nocolors ? m : colors[0],light), color(normal,nocolors ? m : colors[1],light), color(normal,nocolors ? m : colors[2],light)}; } return new pen[] {color(normal00(),nocolors ? m : colors[0],light), color(normal10(),nocolors ? m : colors[1],light), color(normal01(),nocolors ? m : colors[2],light)}; } triple min3,max3; bool havemin3,havemax3; void init() { havemin3=false; havemax3=false; if(triangular) { external=externaltriangular; internal=internaltriangular; cornermean=cornermeantriangular; corners=cornerstriangular; map=maptriangular; point=pointtriangular; normal=normaltriangular; normal00=normal00triangular; normal10=normal10triangular; normal01=normal01triangular; colors=colorstriangular; uequals=new path3(real u) {return nullpath3;}; vequals=new path3(real u) {return nullpath3;}; } } triple min(triple bound=P[0][0]) { if(havemin3) return minbound(min3,bound); havemin3=true; return min3=minbezier(P,bound); } triple max(triple bound=P[0][0]) { if(havemax3) return maxbound(max3,bound); havemax3=true; return max3=maxbezier(P,bound); } triple center() { return 0.5*(this.min()+this.max()); } pair min(projection P, pair bound=project(this.P[0][0],P.t)) { triple[][] Q=P.T.modelview*this.P; if(P.infinity) return xypart(minbezier(Q,(bound.x,bound.y,0))); real d=P.T.projection[3][2]; return maxratio(Q,d*bound)/d; // d is negative } pair max(projection P, pair bound=project(this.P[0][0],P.t)) { triple[][] Q=P.T.modelview*this.P; if(P.infinity) return xypart(maxbezier(Q,(bound.x,bound.y,0))); real d=P.T.projection[3][2]; return minratio(Q,d*bound)/d; // d is negative } void operator init(triple[][] P, pen[] colors=new pen[], bool straight=false, bool3 planar=default, bool triangular=false, bool copy=true) { this.P=copy ? copy(P) : P; if(colors.length != 0) this.colors=copy(colors); this.straight=straight; this.planar=planar; this.triangular=triangular; init(); } void operator init(pair[][] P, triple plane(pair)=XYplane, bool straight=false, bool triangular=false) { triple[][] Q=new triple[4][]; for(int i=0; i < 4; ++i) { pair[] Pi=P[i]; Q[i]=sequence(new triple(int j) {return plane(Pi[j]);},4); } operator init(Q,straight,planar=true,triangular); } void operator init(patch s) { operator init(s.P,s.colors,s.straight,s.planar,s.triangular); } // A constructor for a cyclic path3 of length 3 with a specified // internal point, corner normals, and pens (rendered as a Bezier triangle). void operator init(path3 external, triple internal, pen[] colors=new pen[], bool3 planar=default) { triangular=true; this.planar=planar; init(); if(colors.length != 0) this.colors=copy(colors); P=new triple[][] { {point(external,0)}, {postcontrol(external,0),precontrol(external,0)}, {precontrol(external,1),internal,postcontrol(external,2)}, {point(external,1),postcontrol(external,1),precontrol(external,2), point(external,2)} }; } // A constructor for a convex cyclic path3 of length <= 4 with optional // arrays of internal points (4 for a Bezier patch, 1 for a Bezier // triangle), and pens. void operator init(path3 external, triple[] internal=new triple[], pen[] colors=new pen[], bool3 planar=default) { if(internal.length == 0 && planar == default) this.planar=normal(external) != O; else this.planar=planar; int L=length(external); if(L == 3) { operator init(external,internal.length == 1 ? internal[0] : coons3(external),colors,this.planar); straight=piecewisestraight(external); return; } if(L > 4 || !cyclic(external)) abort("cyclic path3 of length <= 4 expected"); if(L == 1) { external=external--cycle--cycle--cycle; if(colors.length > 0) colors.append(array(3,colors[0])); } else if(L == 2) { external=external--cycle--cycle; if(colors.length > 0) colors.append(array(2,colors[0])); } init(); if(colors.length != 0) this.colors=copy(colors); if(internal.length == 0) { straight=piecewisestraight(external); internal=new triple[4]; for(int j=0; j < 4; ++j) internal[j]=nineth*(-4*point(external,j) +6*(precontrol(external,j)+postcontrol(external,j)) -2*(point(external,j-1)+point(external,j+1)) +3*(precontrol(external,j-1)+ postcontrol(external,j+1)) -point(external,j+2)); } P=new triple[][] { {point(external,0),precontrol(external,0),postcontrol(external,3), point(external,3)}, {postcontrol(external,0),internal[0],internal[3],precontrol(external,3)}, {precontrol(external,1),internal[1],internal[2],postcontrol(external,2)}, {point(external,1),postcontrol(external,1),precontrol(external,2), point(external,2)} }; } // A constructor for a triangle or convex quadrilateral. void operator init(triple[] external, triple[] internal=new triple[], pen[] colors=new pen[], bool3 planar=default) { straight=true; if(colors.length != 0) this.colors=copy(colors); if(external.length == 3) { triangular=true; this.planar=true; init(); P=new triple[][] { {external[0]}, {interp(external[0],external[1],1/3), interp(external[2],external[0],2/3)}, {interp(external[0],external[1],2/3),sum(external)/3, interp(external[2],external[0],1/3)}, {external[1],interp(external[1],external[2],1/3), interp(external[1],external[2],2/3),external[2]} }; } else { init(); if(internal.length == 0 && planar == default) this.planar=normal(external) != O; else this.planar=planar; if(internal.length == 0) { internal=new triple[4]; for(int j=0; j < 4; ++j) internal[j]=nineth*(4*external[j]+2*external[(j+1)%4]+ external[(j+2)%4]+2*external[(j+3)%4]); } triple delta[]=new triple[4]; for(int j=0; j < 4; ++j) delta[j]=(external[(j+1)% 4]-external[j])/3; P=new triple[][] { {external[0],external[0]-delta[3],external[3]+delta[3],external[3]}, {external[0]+delta[0],internal[0],internal[3],external[3]-delta[2]}, {external[1]-delta[0],internal[1],internal[2],external[2]+delta[2]}, {external[1],external[1]+delta[1],external[2]-delta[1],external[2]} }; } } } patch operator * (transform3 t, patch s) { patch S; S.P=new triple[s.P.length][]; for(int i=0; i < s.P.length; ++i) { triple[] si=s.P[i]; triple[] Si=S.P[i]; for(int j=0; j < si.length; ++j) Si[j]=t*si[j]; } S.colors=copy(s.colors); S.planar=s.planar; S.straight=s.straight; S.triangular=s.triangular; S.init(); return S; } patch reverse(patch s) { assert(!s.triangular); patch S; S.P=transpose(s.P); if(s.colors.length > 0) S.colors=new pen[] {s.colors[0],s.colors[3],s.colors[2],s.colors[1]}; S.straight=s.straight; S.planar=s.planar; return S; } triple[][] degenerate(triple[][] P) { return new triple[][] {{P[0][0],P[0][0],P[0][0],P[0][0]}, {P[1][0],P[1][0]*2/3+P[1][1]/3,P[1][0]/3+P[1][1]*2/3,P[1][1]}, {P[2][0],P[2][0]/3+P[2][1]*2/3,P[2][1]*2/3+P[2][2]/3,P[2][2]}, {P[3][0],P[3][1],P[3][2],P[3][3]}}; } // Return a degenerate tensor patch representation of a Bezier triangle. patch tensor(patch s) { if(!s.triangular) return s; return patch(degenerate(s.P), s.colors.length > 0 ? new pen[] { s.colors[0],s.colors[1],s.colors[2],s.colors[0]} : new pen[], s.straight,s.planar,false,false); } // Return the tensor product patch control points corresponding to path p // and points internal. pair[][] tensor(path p, pair[] internal) { return new pair[][] { {point(p,0),precontrol(p,0),postcontrol(p,3),point(p,3)}, {postcontrol(p,0),internal[0],internal[3],precontrol(p,3)}, {precontrol(p,1),internal[1],internal[2],postcontrol(p,2)}, {point(p,1),postcontrol(p,1),precontrol(p,2),point(p,2)} }; } // Return the Coons patch control points corresponding to path p. pair[][] coons(path p) { int L=length(p); if(L == 1) p=p--cycle--cycle--cycle; else if(L == 2) p=p--cycle--cycle; else if(L == 3) p=p--cycle; pair[] internal=new pair[4]; for(int j=0; j < 4; ++j) { internal[j]=nineth*(-4*point(p,j) +6*(precontrol(p,j)+postcontrol(p,j)) -2*(point(p,j-1)+point(p,j+1)) +3*(precontrol(p,j-1)+postcontrol(p,j+1)) -point(p,j+2)); } return tensor(p,internal); } // Decompose a possibly nonconvex cyclic path into an array of paths that // yield nondegenerate Coons patches. path[] regularize(path p, bool checkboundary=true) { path[] s; if(!cyclic(p)) abort("cyclic path expected"); int L=length(p); if(L > 4) { for(path g : bezulate(p)) s.append(regularize(g,checkboundary)); return s; } bool straight=piecewisestraight(p); if(L <= 3 && straight) { return new path[] {p}; } // Split p along the angle bisector at t. bool split(path p, real t) { pair dir=dir(p,t); if(dir != 0) { path g=subpath(p,t,t+length(p)); int L=length(g); pair z=point(g,0); real[] T=intersections(g,z,z+I*abs(z)*dir); for(int i=0; i < T.length; ++i) { real cut=T[i]; if(cut > sqrtEpsilon && cut < L-sqrtEpsilon) { pair w=point(g,cut); if(!inside(p,0.5*(z+w),zerowinding)) continue; pair delta=sqrtEpsilon*(w-z); if(intersections(g,z-delta--w+delta).length != 2) continue; s.append(regularize(subpath(g,0,cut)--cycle,checkboundary)); s.append(regularize(subpath(g,cut,L)--cycle,checkboundary)); return true; } } } return false; } // Ensure that all interior angles are less than 180 degrees. real fuzz=1e-4; int sign=sgn(windingnumber(p,inside(p,zerowinding))); for(int i=0; i < L; ++i) { if(sign*(conj(dir(p,i,-1))*dir(p,i,1)).y < -fuzz) { if(split(p,i)) return s; } } if(straight) return new path[] {p}; pair[][] P=coons(p); // Check for degeneracy. pair[][] U=new pair[3][4]; pair[][] V=new pair[4][3]; for(int i=0; i < 3; ++i) { for(int j=0; j < 4; ++j) U[i][j]=P[i+1][j]-P[i][j]; } for(int i=0; i < 4; ++i) { for(int j=0; j < 3; ++j) V[i][j]=P[i][j+1]-P[i][j]; } int[] choose2={1,2,1}; int[] choose3={1,3,3,1}; real T[][]=new real[6][6]; for(int p=0; p < 6; ++p) { int kstart=max(p-2,0); int kstop=min(p,3); real[] Tp=T[p]; for(int q=0; q < 6; ++q) { real Tpq; int jstop=min(q,3); int jstart=max(q-2,0); for(int k=kstart; k <= kstop; ++k) { int choose3k=choose3[k]; for(int j=jstart; j <= jstop; ++j) { int i=p-k; int l=q-j; Tpq += (conj(U[i][j])*V[k][l]).y* choose2[i]*choose3k*choose3[j]*choose2[l]; } } Tp[q]=Tpq; } } bool3 aligned=default; bool degenerate=false; for(int p=0; p < 6; ++p) { for(int q=0; q < 6; ++q) { if(aligned == default) { if(T[p][q] > sqrtEpsilon) aligned=true; if(T[p][q] < -sqrtEpsilon) aligned=false; } else { if((T[p][q] > sqrtEpsilon && aligned == false) || (T[p][q] < -sqrtEpsilon && aligned == true)) degenerate=true; } } } if(!degenerate) { if(aligned == (sign >= 0)) return new path[] {p}; return s; } if(checkboundary) { // Polynomial coefficients of (B_i'' B_j + B_i' B_j')/3. static real[][][] fpv0={ {{5, -20, 30, -20, 5}, {-3, 24, -54, 48, -15}, {0, -6, 27, -36, 15}, {0, 0, -3, 8, -5}}, {{-7, 36, -66, 52, -15}, {3, -36, 108, -120, 45}, {0, 6, -45, 84, -45}, {0, 0, 3, -16, 15}}, {{2, -18, 45, -44, 15}, {0, 12, -63, 96, -45}, {0, 0, 18, -60, 45}, {0, 0, 0, 8, -15}}, {{0, 2, -9, 12, -5}, {0, 0, 9, -24, 15}, {0, 0, 0, 12, -15}, {0, 0, 0, 0, 5}} }; // Compute one-ninth of the derivative of the Jacobian along the boundary. real[][] c=array(4,array(5,0.0)); for(int i=0; i < 4; ++i) { real[][] fpv0i=fpv0[i]; for(int j=0; j < 4; ++j) { real[] w=fpv0i[j]; c[0] += w*(conj(P[i][0])*(P[j][1]-P[j][0])).y; // v=0 c[1] += w*(conj(P[3][j]-P[2][j])*P[3][i]).y; // u=1 c[2] += w*(conj(P[i][3])*(P[j][3]-P[j][2])).y; // v=1 c[3] += w*(conj(P[0][j]-P[1][j])*P[0][i]).y; // u=0 } } pair BuP(int j, real u) { return bezierP(P[0][j],P[1][j],P[2][j],P[3][j],u); } pair BvP(int i, real v) { return bezierP(P[i][0],P[i][1],P[i][2],P[i][3],v); } real normal(real u, real v) { return (conj(bezier(BuP(0,u),BuP(1,u),BuP(2,u),BuP(3,u),v))* bezier(BvP(0,v),BvP(1,v),BvP(2,v),BvP(3,v),u)).y; } // Use Rolle's theorem to check for degeneracy on the boundary. real M=0; real cut; for(int i=0; i < 4; ++i) { if(!straight(p,i)) { real[] ci=c[i]; pair[] R=quarticroots(ci[4],ci[3],ci[2],ci[1],ci[0]); for(pair r : R) { if(fabs(r.y) < sqrtEpsilon) { real t=r.x; if(0 <= t && t <= 1) { real[] U={t,1,t,0}; real[] V={0,t,1,t}; real[] T={t,t,1-t,1-t}; real N=sign*normal(U[i],V[i]); if(N < M) { M=N; cut=i+T[i]; } } } } } } // Split at the worst boundary degeneracy. if(M < 0 && split(p,cut)) return s; } // Split arbitrarily to resolve any remaining (internal) degeneracy. checkboundary=false; for(int i=0; i < L; ++i) if(!straight(p,i) && split(p,i+0.5)) return s; while(true) for(int i=0; i < L; ++i) if(!straight(p,i) && split(p,i+unitrand())) return s; return s; } typedef void drawfcn(frame f, transform3 t=identity4, material[] m, light light=currentlight, render render=defaultrender); typedef bool primitivefcn(transform3 t); bool unscaled(transform3 t, triple v, triple w) { return abs(length(t*v)-length(t*w)) < sqrtEpsilon; } struct primitive { drawfcn draw; primitivefcn valid; void operator init(drawfcn draw, primitivefcn valid) { this.draw=draw; this.valid=valid; } } struct surface { patch[] s; int index[][];// Position of patch corresponding to major U,V parameter in s. bool vcyclic; transform3 T=identity4; primitive primitive=null; bool PRCprimitive=true; // True unless no PRC primitive is available. bool empty() { return s.length == 0; } void operator init(int n) { s=new patch[n]; } void operator init(... patch[] s) { this.s=s; } void operator init(surface s) { this.s=new patch[s.s.length]; for(int i=0; i < s.s.length; ++i) this.s[i]=patch(s.s[i]); this.index=copy(s.index); this.vcyclic=s.vcyclic; } void operator init(triple[][][] P, pen[][] colors=new pen[][], bool3 straight=false, bool3 planar=default, bool triangular=false) { s=sequence(new patch(int i) { return patch(P[i],colors.length == 0 ? new pen[] : colors[i], straight,planar,triangular); },P.length); } void colors(pen[][] palette) { for(int i=0; i < s.length; ++i) s[i].colors=copy(palette[i]); } triple[][] corners() { triple[][] a=new triple[s.length][]; for(int i=0; i < s.length; ++i) a[i]=s[i].corners(); return a; } real[][] map(real f(triple)) { real[][] a=new real[s.length][]; for(int i=0; i < s.length; ++i) a[i]=s[i].map(f); return a; } triple[] cornermean() { return sequence(new triple(int i) {return s[i].cornermean();},s.length); } triple point(real u, real v) { int U=floor(u); int V=floor(v); int index=index.length == 0 ? U+V : index[U][V]; return s[index].point(u-U,v-V); } triple normal(real u, real v) { int U=floor(u); int V=floor(v); int index=index.length == 0 ? U+V : index[U][V]; return s[index].normal(u-U,v-V); } void ucyclic(bool f) { index.cyclic=f; } void vcyclic(bool f) { for(int[] i : index) i.cyclic=f; vcyclic=f; } bool ucyclic() { return index.cyclic; } bool vcyclic() { return vcyclic; } path3 uequals(real u) { if(index.length == 0) return nullpath3; int U=floor(u); int[] index=index[U]; path3 g; for(int i : index) g=g&s[i].uequals(u-U); return vcyclic() ? g&cycle : g; } path3 vequals(real v) { if(index.length == 0) return nullpath3; int V=floor(v); path3 g; for(int[] i : index) g=g&s[i[V]].vequals(v-V); return ucyclic() ? g&cycle : g; } // A constructor for a possibly nonconvex simple cyclic path in a given // plane. void operator init(path p, triple plane(pair)=XYplane) { for(path g : regularize(p)) { if(length(g) == 3) { path3 G=path3(g,plane); s.push(patch(G,coons3(G),planar=true)); } else s.push(patch(coons(g),plane,piecewisestraight(g))); } } void operator init(explicit path[] g, triple plane(pair)=XYplane) { for(path p : bezulate(g)) s.append(surface(p,plane).s); } // A general surface constructor for both planar and nonplanar 3D paths. void construct(path3 external, triple[] internal=new triple[], pen[] colors=new pen[], bool3 planar=default) { int L=length(external); if(!cyclic(external)) abort("cyclic path expected"); if(L <= 3 && piecewisestraight(external)) { s.push(patch(external,internal,colors,planar)); return; } // Construct a surface from a possibly nonconvex planar cyclic path3. if(planar != false && internal.length == 0 && colors.length == 0) { triple n=normal(external); if(n != O) { transform3 T=align(n); external=transpose(T)*external; T *= shift(0,0,point(external,0).z); for(patch p : surface(path(external)).s) s.push(T*p); return; } } if(L <= 4 || internal.length > 0) { s.push(patch(external,internal,colors,planar)); return; } // Path is not planar; split into patches. real factor=1/L; pen[] p; triple[] n; bool nocolors=colors.length == 0; triple center; for(int i=0; i < L; ++i) center += point(external,i); center *= factor; if(!nocolors) p=new pen[] {mean(colors)}; // Use triangles for nonplanar surfaces. int step=normal(external) == O ? 1 : 2; int i=0; int end; while((end=i+step) < L) { s.push(patch(subpath(external,i,end)--center--cycle, nocolors ? p : concat(colors[i:end+1],p),planar)); i=end; } s.push(patch(subpath(external,i,L)--center--cycle, nocolors ? p : concat(colors[i:],colors[0:1],p),planar)); } void operator init(path3 external, triple[] internal=new triple[], pen[] colors=new pen[], bool3 planar=default) { s=new patch[]; construct(external,internal,colors,planar); } void operator init(explicit path3[] external, triple[][] internal=new triple[][], pen[][] colors=new pen[][], bool3 planar=default) { s=new patch[]; if(planar == true) {// Assume all path3 elements share a common normal. if(external.length != 0) { triple n=normal(external[0]); if(n != O) { transform3 T=align(n); external=transpose(T)*external; T *= shift(0,0,point(external[0],0).z); path[] g=sequence(new path(int i) {return path(external[i]);}, external.length); for(patch p : surface(g).s) s.push(T*p); return; } } } for(int i=0; i < external.length; ++i) construct(external[i], internal.length == 0 ? new triple[] : internal[i], colors.length == 0 ? new pen[] : colors[i],planar); } void push(path3 external, triple[] internal=new triple[], pen[] colors=new pen[], bool3 planar=default) { s.push(patch(external,internal,colors,planar)); } // Construct the surface of rotation generated by rotating g // from angle1 to angle2 sampled n times about the line c--c+axis. // An optional surface pen color(int i, real j) may be specified // to override the color at vertex(i,j). void operator init(triple c, path3 g, triple axis, int n=nslice, real angle1=0, real angle2=360, pen color(int i, real j)=null) { axis=unit(axis); real w=(angle2-angle1)/n; int L=length(g); s=new patch[L*n]; index=new int[n][L]; int m=-1; transform3[] T=new transform3[n+1]; transform3 t=rotate(w,c,c+axis); T[0]=rotate(angle1,c,c+axis); for(int k=1; k <= n; ++k) T[k]=T[k-1]*t; typedef pen colorfcn(int i, real j); bool defaultcolors=(colorfcn) color == null; for(int i=0; i < L; ++i) { path3 h=subpath(g,i,i+1); path3 r=reverse(h); path3 H=shift(-c)*h; real M=0; triple perp; void test(real[] t) { for(int i=0; i < 3; ++i) { triple v=point(H,t[i]); triple V=v-dot(v,axis)*axis; real a=abs(V); if(a > M) {M=a; perp=V;} } } test(maxtimes(H)); test(mintimes(H)); perp=unit(perp); triple normal=unit(cross(axis,perp)); triple dir(real j) {return Cos(j)*normal-Sin(j)*perp;} real j=angle1; transform3 Tk=T[0]; triple dirj=dir(j); for(int k=0; k < n; ++k, j += w) { transform3 Tp=T[k+1]; triple dirp=dir(j+w); path3 G=reverse(Tk*h{dirj}..{dirp}Tp*r{-dirp}..{-dirj}cycle); Tk=Tp; dirj=dirp; s[++m]=defaultcolors ? patch(G) : patch(G,new pen[] {color(i,j),color(i,j+w),color(i+1,j+w), color(i+1,j)}); index[k][i]=m; } ucyclic((angle2-angle1) % 360 == 0); vcyclic(cyclic(g)); } } void push(patch s) { this.s.push(s); } void append(surface s) { this.s.append(s.s); } void operator init(... surface[] s) { for(surface S : s) this.s.append(S.s); } } surface operator * (transform3 t, surface s) { surface S; S.s=new patch[s.s.length]; for(int i=0; i < s.s.length; ++i) S.s[i]=t*s.s[i]; S.index=copy(s.index); S.vcyclic=(bool) s.vcyclic; S.T=t*s.T; S.primitive=s.primitive; S.PRCprimitive=s.PRCprimitive; return S; } private string nullsurface="null surface"; triple min(surface s) { if(s.s.length == 0) abort(nullsurface); triple bound=s.s[0].min(); for(int i=1; i < s.s.length; ++i) bound=s.s[i].min(bound); return bound; } triple max(surface s) { if(s.s.length == 0) abort(nullsurface); triple bound=s.s[0].max(); for(int i=1; i < s.s.length; ++i) bound=s.s[i].max(bound); return bound; } pair min(surface s, projection P) { if(s.s.length == 0) abort(nullsurface); pair bound=s.s[0].min(P); for(int i=1; i < s.s.length; ++i) bound=s.s[i].min(P,bound); return bound; } pair max(surface s, projection P) { if(s.s.length == 0) abort(nullsurface); pair bound=s.s[0].max(P); for(int i=1; i < s.s.length; ++i) bound=s.s[i].max(P,bound); return bound; } private triple[] split(triple z0, triple c0, triple c1, triple z1, real t=0.5) { triple m0=interp(z0,c0,t); triple m1=interp(c0,c1,t); triple m2=interp(c1,z1,t); triple m3=interp(m0,m1,t); triple m4=interp(m1,m2,t); triple m5=interp(m3,m4,t); return new triple[] {m0,m3,m5,m4,m2}; } // Return the control points of the subpatches // produced by a horizontal split of P triple[][][] hsplit(triple[][] P, real v=0.5) { // get control points in rows triple[] P0=P[0]; triple[] P1=P[1]; triple[] P2=P[2]; triple[] P3=P[3]; triple[] c0=split(P0[0],P0[1],P0[2],P0[3],v); triple[] c1=split(P1[0],P1[1],P1[2],P1[3],v); triple[] c2=split(P2[0],P2[1],P2[2],P2[3],v); triple[] c3=split(P3[0],P3[1],P3[2],P3[3],v); // bottom, top return new triple[][][] { {{P0[0],c0[0],c0[1],c0[2]}, {P1[0],c1[0],c1[1],c1[2]}, {P2[0],c2[0],c2[1],c2[2]}, {P3[0],c3[0],c3[1],c3[2]}}, {{c0[2],c0[3],c0[4],P0[3]}, {c1[2],c1[3],c1[4],P1[3]}, {c2[2],c2[3],c2[4],P2[3]}, {c3[2],c3[3],c3[4],P3[3]}} }; } // Return the control points of the subpatches // produced by a vertical split of P triple[][][] vsplit(triple[][] P, real u=0.5) { // get control points in rows triple[] P0=P[0]; triple[] P1=P[1]; triple[] P2=P[2]; triple[] P3=P[3]; triple[] c0=split(P0[0],P1[0],P2[0],P3[0],u); triple[] c1=split(P0[1],P1[1],P2[1],P3[1],u); triple[] c2=split(P0[2],P1[2],P2[2],P3[2],u); triple[] c3=split(P0[3],P1[3],P2[3],P3[3],u); // left, right return new triple[][][] { {{P0[0],P0[1],P0[2],P0[3]}, {c0[0],c1[0],c2[0],c3[0]}, {c0[1],c1[1],c2[1],c3[1]}, {c0[2],c1[2],c2[2],c3[2]}}, {{c0[2],c1[2],c2[2],c3[2]}, {c0[3],c1[3],c2[3],c3[3]}, {c0[4],c1[4],c2[4],c3[4]}, {P3[0],P3[1],P3[2],P3[3]}} }; } // Return a 2D array of the control point arrays of the subpatches // produced by horizontal and vertical splits of P at u and v triple[][][][] split(triple[][] P, real u=0.5, real v=0.5) { triple[] P0=P[0]; triple[] P1=P[1]; triple[] P2=P[2]; triple[] P3=P[3]; // slice horizontally triple[] c0=split(P0[0],P0[1],P0[2],P0[3],v); triple[] c1=split(P1[0],P1[1],P1[2],P1[3],v); triple[] c2=split(P2[0],P2[1],P2[2],P2[3],v); triple[] c3=split(P3[0],P3[1],P3[2],P3[3],v); // bottom patch triple[] c4=split(P0[0],P1[0],P2[0],P3[0],u); triple[] c5=split(c0[0],c1[0],c2[0],c3[0],u); triple[] c6=split(c0[1],c1[1],c2[1],c3[1],u); triple[] c7=split(c0[2],c1[2],c2[2],c3[2],u); // top patch triple[] c8=split(c0[3],c1[3],c2[3],c3[3],u); triple[] c9=split(c0[4],c1[4],c2[4],c3[4],u); triple[] cA=split(P0[3],P1[3],P2[3],P3[3],u); // {{bottom-left, top-left}, {bottom-right, top-right}} return new triple[][][][] { {{{P0[0],c0[0],c0[1],c0[2]}, {c4[0],c5[0],c6[0],c7[0]}, {c4[1],c5[1],c6[1],c7[1]}, {c4[2],c5[2],c6[2],c7[2]}}, {{c0[2],c0[3],c0[4],P0[3]}, {c7[0],c8[0],c9[0],cA[0]}, {c7[1],c8[1],c9[1],cA[1]}, {c7[2],c8[2],c9[2],cA[2]}}}, {{{c4[2],c5[2],c6[2],c7[2]}, {c4[3],c5[3],c6[3],c7[3]}, {c4[4],c5[4],c6[4],c7[4]}, {P3[0],c3[0],c3[1],c3[2]}}, {{c7[2],c8[2],c9[2],cA[2]}, {c7[3],c8[3],c9[3],cA[3]}, {c7[4],c8[4],c9[4],cA[4]}, {c3[2],c3[3],c3[4],P3[3]}}} }; } // Return the control points for a subpatch of P on [u,1] x [v,1]. triple[][] subpatchend(triple[][] P, real u, real v) { triple[] P0=P[0]; triple[] P1=P[1]; triple[] P2=P[2]; triple[] P3=P[3]; triple[] c0=split(P0[0],P0[1],P0[2],P0[3],v); triple[] c1=split(P1[0],P1[1],P1[2],P1[3],v); triple[] c2=split(P2[0],P2[1],P2[2],P2[3],v); triple[] c3=split(P3[0],P3[1],P3[2],P3[3],v); triple[] c7=split(c0[2],c1[2],c2[2],c3[2],u); triple[] c8=split(c0[3],c1[3],c2[3],c3[3],u); triple[] c9=split(c0[4],c1[4],c2[4],c3[4],u); triple[] cA=split(P0[3],P1[3],P2[3],P3[3],u); return new triple[][] { {c7[2],c8[2],c9[2],cA[2]}, {c7[3],c8[3],c9[3],cA[3]}, {c7[4],c8[4],c9[4],cA[4]}, {c3[2],c3[3],c3[4],P3[3]}}; } // Return the control points for a subpatch of P on [0,u] x [0,v]. triple[][] subpatchbegin(triple[][] P, real u, real v) { triple[] P0=P[0]; triple[] P1=P[1]; triple[] P2=P[2]; triple[] P3=P[3]; triple[] c0=split(P0[0],P0[1],P0[2],P0[3],v); triple[] c1=split(P1[0],P1[1],P1[2],P1[3],v); triple[] c2=split(P2[0],P2[1],P2[2],P2[3],v); triple[] c3=split(P3[0],P3[1],P3[2],P3[3],v); triple[] c4=split(P0[0],P1[0],P2[0],P3[0],u); triple[] c5=split(c0[0],c1[0],c2[0],c3[0],u); triple[] c6=split(c0[1],c1[1],c2[1],c3[1],u); triple[] c7=split(c0[2],c1[2],c2[2],c3[2],u); return new triple[][] { {P0[0],c0[0],c0[1],c0[2]}, {c4[0],c5[0],c6[0],c7[0]}, {c4[1],c5[1],c6[1],c7[1]}, {c4[2],c5[2],c6[2],c7[2]}}; } triple[][] subpatch(triple[][] P, pair a, pair b) { return subpatchend(subpatchbegin(P,b.x,b.y),a.x/b.x,a.y/b.y); } patch subpatch(patch s, pair a, pair b) { assert(a.x >= 0 && a.y >= 0 && b.x <= 1 && b.y <= 1 && a.x < b.x && a.y < b.y && !s.triangular); return patch(subpatch(s.P,a,b),s.straight,s.planar); } // return an array containing the times for one intersection of path p and // patch s. real[] intersect(path3 p, patch s, real fuzz=-1) { return intersect(p,s.triangular ? degenerate(s.P) : s.P,fuzz); } // return an array containing the times for one intersection of path p and // surface s. real[] intersect(path3 p, surface s, real fuzz=-1) { for(int i=0; i < s.s.length; ++i) { real[] T=intersect(p,s.s[i],fuzz); if(T.length > 0) return T; } return new real[]; } // return an array containing all intersection times of path p and patch s. real[][] intersections(path3 p, patch s, real fuzz=-1) { return sort(intersections(p,s.triangular ? degenerate(s.P) : s.P,fuzz)); } // return an array containing all intersection times of path p and surface s. real[][] intersections(path3 p, surface s, real fuzz=-1) { real[][] T; if(length(p) < 0) return T; for(int i=0; i < s.s.length; ++i) for(real[] s: intersections(p,s.s[i],fuzz)) T.push(s); static real Fuzz=1000*realEpsilon; real fuzz=max(10*fuzz,Fuzz*max(abs(min(s)),abs(max(s)))); // Remove intrapatch duplicate points. for(int i=0; i < T.length; ++i) { triple v=point(p,T[i][0]); for(int j=i+1; j < T.length;) { if(abs(v-point(p,T[j][0])) < fuzz) T.delete(j); else ++j; } } return sort(T); } // return an array containing all intersection points of path p and surface s. triple[] intersectionpoints(path3 p, patch s, real fuzz=-1) { real[][] t=intersections(p,s,fuzz); return sequence(new triple(int i) {return point(p,t[i][0]);},t.length); } // return an array containing all intersection points of path p and surface s. triple[] intersectionpoints(path3 p, surface s, real fuzz=-1) { real[][] t=intersections(p,s,fuzz); return sequence(new triple(int i) {return point(p,t[i][0]);},t.length); } // Return true iff the control point bounding boxes of patches p and q overlap. bool overlap(triple[][] p, triple[][] q, real fuzz=-1) { triple pmin=minbound(p); triple pmax=maxbound(p); triple qmin=minbound(q); triple qmax=maxbound(q); if(fuzz == -1) fuzz=1000*realEpsilon*max(abs(pmin),abs(pmax),abs(qmin),abs(qmax)); return pmax.x+fuzz >= qmin.x && pmax.y+fuzz >= qmin.y && pmax.z+fuzz >= qmin.z && qmax.x+fuzz >= pmin.x && qmax.y+fuzz >= pmin.y && qmax.z+fuzz >= pmin.z; // Overlapping bounding boxes? } triple point(patch s, real u, real v) { return s.point(u,v); } interaction LabelInteraction() { return settings.autobillboard ? Billboard : Embedded; } material material(material m, light light, bool colors=false) { return light.on() || invisible((pen) m) ? m : emissive(m,colors); } void draw3D(frame f, patch s, material m, light light=currentlight, render render=defaultrender, bool primitive=false) { bool straight=s.straight && s.planar; // Planar Bezier surfaces require extra precision in WebGL int digits=s.planar && !straight ? 12 : settings.digits; if(s.colors.length > 0) { primitive=false; if(prc() && light.on()) straight=false; // PRC vertex colors (for quads only) ignore lighting m=material(m); if(prc()) m.diffuse(mean(s.colors)); } m=material(m,light,s.colors.length > 0); (s.triangular ? drawbeziertriangle : draw) (f,s.P,render.interaction.center,straight,m.p,m.opacity,m.shininess, m.metallic,m.fresnel0,s.colors,render.interaction.type,digits, primitive); } void _draw(frame f, path3 g, triple center=O, material m, light light=currentlight, interaction interaction=Embedded) { if(!prc()) m=material(m,light); _draw(f,g,center,m.p,m.opacity,m.shininess,m.metallic,m.fresnel0, interaction.type); } int computeNormals(triple[] v, int[][] vi, triple[] n, int[][] ni) { triple lastnormal=O; n.delete(); for(int i=0; i < vi.length; ++i) { int[] vii=vi[i]; int[] nii=ni[i]; triple normal=normal(new triple[] {v[vii[0]],v[vii[1]],v[vii[2]]}); if(normal != lastnormal || n.length == 0) { n.push(normal); lastnormal=normal; } nii[0]=nii[1]=nii[2]=n.length-1; } return ni.length; } // Draw a triangle group on a frame. void draw(frame f, triple[] v, int[][] vi, triple[] n={}, int[][] ni={}, material m=currentpen, pen[] p={}, int[][] pi={}, light light=currentlight, render render=defaultrender) { bool normals=ni.length > 0; if(!normals) { ni=new int[vi.length][3]; normals=computeNormals(v,vi,n,ni) > 0; } if(p.length > 0) m=mean(p); m=material(m,light); if(prc()) { int[] vertexNormal=new int[ni.length]; int[] vertexPen=new int[pi.length]; bool pens=pi.length > 0; for(int i=0; i < vi.length; ++i) { int[] vii=vi[i]; int[] nii=ni[i]; for(int j=0; j < 3; ++j) { int V=vii[j]; vertexNormal[V]=nii[j]; if(pens) vertexPen[V]=pi[i][j]; } } for(int i=0; i < vi.length; ++i) { int[] vii=vi[i]; for(int j=0; j < 3; ++j) { int V=vii[j]; ni[i][j]=vertexNormal[V]; if(pens) pi[i][j]=vertexPen[V]; } } } draw(f,v,vi,render.interaction.center,n,ni, m.p,m.opacity,m.shininess,m.metallic,m.fresnel0,p,pi, render.interaction.type); } // Draw a triangle group on a picture. void draw(picture pic=currentpicture, triple[] v, int[][] vi, triple[] n={}, int[][] ni={}, material m=currentpen, pen[] p={}, int[][] pi={}, light light=currentlight, render render=defaultrender) { bool colors=pi.length > 0; // TODO: copy inputs pic.add(new void(frame f, transform3 t, picture pic, projection P) { triple[] v=t*v; bool normals=ni.length > 0; if(normals) { transform3 T=transpose(inverse(shiftless(t))); n=sequence(new triple(int i) {return unit(T*n[i]);},n.length) ; } else { ni=new int[vi.length][3]; normals=computeNormals(v,vi,n,ni) > 0; } if(is3D()) { render Render=render(render,interaction(render.interaction, t*render.interaction.center)); draw(f,v,vi,n,ni,m,p,pi,light,Render); if(pic != null) { for(int[] vii : vi) for(int viij : vii) pic.addPoint(project(v[viij],P)); } } else if(pic != null) { static int[] edges={0,0,1}; if(colors) { for(int i=0; i < vi.length; ++i) { int[] vii=vi[i]; int[] pii=pi[i]; gouraudshade(pic,project(v[vii[0]],P)--project(v[vii[1]],P)-- project(v[vii[2]],P)--cycle, new pen[] {p[pii[0]],p[pii[1]],p[pii[2]]},edges); } } else { if(normals) { for(int i=0; i < vi.length; ++i) { int[] vii=vi[i]; int[] nii=ni[i]; gouraudshade(pic,project(v[vii[0]],P)--project(v[vii[1]],P)-- project(v[vii[2]],P)--cycle, new pen[] {color(n[nii[0]],m,light), color(n[nii[1]],m,light), color(n[nii[2]],m,light)},edges); } } else { for(int i=0; i < vi.length; ++i) { int[] vii=vi[i]; path g=project(v[vii[0]],P)--project(v[vii[1]],P)-- project(v[vii[2]],P)--cycle; pen p=color(n[ni[i][0]],m,light); fill(pic,g,p); } } } } },true); for(int[] vii : vi) { pic.addPoint(v[vii[0]]); pic.addPoint(v[vii[1]]); pic.addPoint(v[vii[2]]); } } void tensorshade(transform t=identity(), frame f, patch s, material m, light light=currentlight, projection P) { pen[] p; if(s.triangular) { p=s.colorstriangular(m,light); p.push(p[0]); s=tensor(s); } else p=s.colors(m,light); path g=t*project(s.external(),P,1); pair[] internal=t*project(s.internal(),P); pen fillrule=fillrule(fillrule(m.diffuse())); if(inside(g,internal[0],fillrule) && inside(g,internal[1],fillrule) && inside(g,internal[2],fillrule) && inside(g,internal[3],fillrule)) { if(p[0] == p[1] && p[1] == p[2] && p[2] == p[3]) fill(f,g,fillrule+p[0]); else tensorshade(f,g,fillrule,p,internal); } else { tensorshade(f,box(t*s.min(P),t*s.max(P)),fillrule,p,g,internal); } } restricted pen[] nullpens={nullpen}; nullpens.cyclic=true; void draw(transform t=identity(), frame f, surface s, int nu=1, int nv=1, material[] surfacepen, pen[] meshpen=nullpens, light light=currentlight, light meshlight=nolight, string name="", render render=defaultrender, projection P=currentprojection) { bool is3D=is3D(); if(is3D) { bool prc=prc(); if(s.primitive != null && (primitive() || (prc && s.PRCprimitive)) && s.primitive.valid(shiftless(s.T))) { bool noprerender=settings.prerender == 0; for(int k=0; k < s.s.length; ++k) { patch p=s.s[k]; draw3D(f,p,surfacepen[k],light,render,primitive=noprerender); if(p.colors.length > 0) noprerender=false; } if(noprerender) s.primitive.draw(f,s.T,surfacepen,light,render); } else { bool group=name != "" || render.defaultnames; if(group) begingroup3(f,name == "" ? "surface" : name,render); // Sort patches by mean distance from camera triple camera=P.camera; if(P.infinity) { triple m=min(s); triple M=max(s); camera=P.target+camerafactor*(abs(M-m)+abs(m-P.target))* unit(P.vector()); } real[][] depth=new real[s.s.length][]; for(int i=0; i < depth.length; ++i) depth[i]=new real[] {dot(P.normal,camera-s.s[i].cornermean()),i}; depth=sort(depth); for(int p=depth.length-1; p >= 0; --p) { real[] a=depth[p]; int k=round(a[1]); draw3D(f,s.s[k],surfacepen[k],light,render); } if(group) endgroup3(f); pen modifiers=thin()+squarecap; for(int p=depth.length-1; p >= 0; --p) { real[] a=depth[p]; int k=round(a[1]); patch S=s.s[k]; pen meshpen=meshpen[k]; if(!invisible(meshpen) && !S.triangular) { if(group) begingroup3(f,meshname(name),render); meshpen=modifiers+meshpen; real step=nu == 0 ? 0 : 1/nu; for(int i=0; i <= nu; ++i) draw(f,S.uequals(i*step),meshpen,meshlight,partname(i,render), render); step=nv == 0 ? 0 : 1/nv; for(int j=0; j <= nv; ++j) draw(f,S.vequals(j*step),meshpen,meshlight,partname(j,render), render); if(group) endgroup3(f); } } } } if(!is3D || settings.render == 0) { begingroup(f); // Sort patches by mean distance from camera triple camera=P.camera; if(P.infinity) { triple m=min(s); triple M=max(s); camera=P.target+camerafactor*(abs(M-m)+abs(m-P.target))*unit(P.vector()); } real[][] depth=new real[s.s.length][]; for(int i=0; i < depth.length; ++i) depth[i]=new real[] {dot(P.normal,camera-s.s[i].cornermean()),i}; depth=sort(depth); light.T=shiftless(P.T.modelview); // Draw from farthest to nearest for(int p=depth.length-1; p >= 0; --p) { real[] a=depth[p]; int k=round(a[1]); tensorshade(t,f,s.s[k],surfacepen[k],light,P); pen meshpen=meshpen[k]; if(!invisible(meshpen)) draw(f,t*project(s.s[k].external(),P),meshpen); } endgroup(f); } } void draw(transform t=identity(), frame f, surface s, int nu=1, int nv=1, material surfacepen=currentpen, pen meshpen=nullpen, light light=currentlight, light meshlight=nolight, string name="", render render=defaultrender, projection P=currentprojection) { material[] surfacepen={surfacepen}; pen[] meshpen={meshpen}; surfacepen.cyclic=true; meshpen.cyclic=true; draw(t,f,s,nu,nv,surfacepen,meshpen,light,meshlight,name,render,P); } // draw a triangle group on a frame for the tessellation of a surface // containing indexed patches. void drawTessellation(frame f, surface s, material surfacepen=currentpen, pen meshpen=nullpen, light light=currentlight, light meshlight=nolight, string name="", render render=defaultrender) { int nU=s.index.length; if(nU == 0) return; int nV=s.index[0].length; if(nV == 0) return; int N=(nU+1)*(nV+1); triple[] v=new triple[N]; triple[] n=new triple[N]; bool colors=s.s[0].colors.length > 0; pen[] p; if(colors) p=new pen[N]; int index(int i,int j) {return (nV+1)*i+j;} int k=0; for(int U=0; U < nU; ++U) { for(int V=0; V < nV; ++V) { patch q=s.s[s.index[U][V]]; v[k]=q.P[0][0]; n[k]=unit(q.normal00()); if(colors) p[k]=q.colors[0]; ++k; } patch q=s.s[s.index[U][nV-1]]; v[k]=q.P[0][3]; n[k]=unit(q.normal01()); if(colors) p[k]=q.colors[3]; ++k; } for(int V=0; V < nV; ++V) { patch q=s.s[s.index[nU-1][V]]; v[k]=q.P[3][0]; n[k]=unit(q.normal10()); if(colors) p[k]=q.colors[1]; ++k; } patch q=s.s[s.index[nU-1][nV-1]]; v[k]=q.P[3][3]; n[k]=unit(q.normal11()); if(colors) p[k]=q.colors[2]; ++k; int[][] vi=new int[nU*nV][]; int k=0; for(int i=0; i < nU; ++i) { for(int j=0; j < nV; ++j) { vi[k]=new int[] {index(i,j),index(i+1,j),index(i+1,j+1)}; ++k; vi[k]=new int[] {index(i,j),index(i+1,j+1),index(i,j+1)}; ++k; } } draw(f,v,vi,n,vi,surfacepen,p,colors ? vi : new int[][],light); if(!invisible(meshpen)) { if(is3D()) meshpen=thin()+squarecap+meshpen; bool group=name != "" || render.defaultnames; for(int k=0; k < s.s.length; ++k) { patch q=s.s[k]; if(group) begingroup3(f,meshname(name),render); draw(f,q.P[0][0]--q.P[3][0]--q.P[3][3]--q.P[0][3]--cycle, meshpen,meshlight,partname(k,render),render); if(group) endgroup3(f); } } } // draw a triangle group on a picture for the tessellation of a surface // containing indexed patches. void drawTessellation(picture pic=currentpicture, surface s, material surfacepen=currentpen, pen meshpen=nullpen, light light=currentlight, light meshlight=nolight, string name="", render render=defaultrender) { pic.add(new void(frame f, transform3 t, picture, projection) { drawTessellation(f,t*s,surfacepen,meshpen,light,meshlight,name,render); },true); pic.addPoint(min(s)); pic.addPoint(max(s)); if(!invisible(meshpen)) { for(int k=0; k < s.s.length; ++k) { patch q=s.s[k]; addPath(pic,q.P[0][0]--q.P[3][0]--q.P[3][3]--q.P[0][3]--cycle,meshpen); } } } void draw(picture pic=currentpicture, surface s, int nu=1, int nv=1, material[] surfacepen, pen[] meshpen=nullpens, light light=currentlight, light meshlight=nolight, string name="", render render=defaultrender) { if(s.empty()) return; surfacepen=copy(surfacepen); meshpen=copy(meshpen); pic.add(new void(frame f, transform3 t, picture pic, projection P) { surface S=t*s; if(is3D()) { render Render=render(render,interaction(render.interaction, t*render.interaction.center)); draw(f,S,nu,nv,surfacepen,meshpen,light,meshlight,name,Render); } if(pic != null) { pic.add(new void(frame f, transform T) { draw(T,f,S,nu,nv,surfacepen,meshpen,light,meshlight,P); },true); pic.addPoint(min(S,P)); pic.addPoint(max(S,P)); } },true); pic.addPoint(min(s)); pic.addPoint(max(s)); pen modifiers; if(is3D()) modifiers=thin()+squarecap; for(int k=0; k < s.s.length; ++k) { patch S=s.s[k]; pen meshpen=meshpen[k]; if(!invisible(meshpen) && !S.triangular) { meshpen=modifiers+meshpen; real step=nu == 0 ? 0 : 1/nu; for(int i=0; i <= nu; ++i) addPath(pic,s.s[k].uequals(i*step),meshpen); step=nv == 0 ? 0 : 1/nv; for(int j=0; j <= nv; ++j) addPath(pic,s.s[k].vequals(j*step),meshpen); } } } void draw(picture pic=currentpicture, surface s, int nu=1, int nv=1, material surfacepen=currentpen, pen meshpen=nullpen, light light=currentlight, light meshlight=nolight, string name="", render render=defaultrender) { if(render.tessellate && s.index.length > 0 && settings.render != 0) { drawTessellation(pic,s,surfacepen,meshpen,light,meshlight,name,render); } else { material[] surfacepen={surfacepen}; surfacepen.cyclic=true; pen[] meshpen={meshpen}; meshpen.cyclic=true; draw(pic,s,nu,nv,surfacepen,meshpen,light,meshlight,name,render); } } void draw(picture pic=currentpicture, surface s, int nu=1, int nv=1, material[] surfacepen, pen meshpen, light light=currentlight, light meshlight=nolight, string name="", render render=defaultrender) { pen[] meshpen={meshpen}; meshpen.cyclic=true; draw(pic,s,nu,nv,surfacepen,meshpen,light,meshlight,name,render); } surface extrude(path3 p, path3 q) { static patch[] allocate; return surface(...sequence(new patch(int i) { return patch(subpath(p,i,i+1)--subpath(q,i+1,i)--cycle); },length(p))); } surface extrude(path3 p, triple axis=Z) { return extrude(p,shift(axis)*p); } surface extrude(path p, triple plane(pair)=XYplane, triple axis=Z) { return extrude(path3(p,plane),axis); } surface extrude(explicit path[] p, triple axis=Z) { surface s; for(path g:p) s.append(extrude(g,axis)); return s; } triple rectify(triple dir) { real scale=max(abs(dir.x),abs(dir.y),abs(dir.z)); if(scale != 0) dir *= 0.5/scale; dir += (0.5,0.5,0.5); return dir; } path3[] align(path3[] g, transform3 t=identity4, triple position, triple align, pen p=currentpen) { if(determinant(t) == 0 || g.length == 0) return g; triple m=min(g); triple dir=rectify(inverse(t)*-align); triple a=m+realmult(dir,max(g)-m); return shift(position+align*labelmargin(p))*t*shift(-a)*g; } surface align(surface s, transform3 t=identity4, triple position, triple align, pen p=currentpen) { if(determinant(t) == 0 || s.s.length == 0) return s; triple m=min(s); triple dir=rectify(inverse(t)*-align); triple a=m+realmult(dir,max(s)-m); return shift(position+align*labelmargin(p))*t*shift(-a)*s; } surface surface(Label L, triple position=O, bool bbox=false) { surface s=surface(texpath(L,bbox=bbox)); return L.align.is3D ? align(s,L.T3,position,L.align.dir3,L.p) : shift(position)*L.T3*s; } private path[] path(Label L, pair z=0, projection P) { path[] g=texpath(L,bbox=P.bboxonly); return L.align.is3D ? align(g,z,project(L.align.dir3,P)-project(O,P),L.p) : shift(z)*g; } transform3 alignshift(path3[] g, transform3 t=identity4, triple position, triple align) { if(determinant(t) == 0) return identity4; triple m=min(g); triple dir=rectify(inverse(t)*-align); triple a=m+realmult(dir,max(g)-m); return shift(-a); } transform3 alignshift(surface s, transform3 t=identity4, triple position, triple align) { if(determinant(t) == 0) return identity4; triple m=min(s); triple dir=rectify(inverse(t)*-align); triple a=m+realmult(dir,max(s)-m); return shift(-a); } transform3 aligntransform(path3[] g, transform3 t=identity4, triple position, triple align, pen p=currentpen) { if(determinant(t) == 0) return identity4; triple m=min(g); triple dir=rectify(inverse(t)*-align); triple a=m+realmult(dir,max(g)-m); return shift(position+align*labelmargin(p))*t*shift(-a); } transform3 aligntransform(surface s, transform3 t=identity4, triple position, triple align, pen p=currentpen) { if(determinant(t) == 0) return identity4; triple m=min(s); triple dir=rectify(inverse(t)*-align); triple a=m+realmult(dir,max(s)-m); return shift(position+align*labelmargin(p))*t*shift(-a); } void label(frame f, Label L, triple position, align align=NoAlign, pen p=currentpen, light light=nolight, string name="", render render=defaultrender, interaction interaction=LabelInteraction(), projection P=currentprojection) { bool prc=prc(); Label L=L.copy(); L.align(align); L.p(p); if(interaction.targetsize && settings.render != 0) L.T=L.T*scale(abs(P.camera-position)/abs(P.vector())); transform3 T=transform3(P); if(L.defaulttransform3) L.T3=T; if(is3D()) { bool lighton=light.on(); if(name == "") name=L.s; if(prc() && interaction.type == Billboard.type) { surface s=surface(texpath(L)); transform3 centering=L.align.is3D ? alignshift(s,L.T3,position,L.align.dir3) : identity4; transform3 positioning= shift(L.align.is3D ? position+L.align.dir3*labelmargin(L.p) : position); frame f1,f2,f3; render Render=render(render,interaction(interaction,position)); begingroup3(f1,name,render); if(L.defaulttransform3) begingroup3(f3,Render); else { begingroup3(f2,Render); begingroup3(f3,Render); } for(patch S : s.s) draw3D(f3,centering*S,L.p,light,Render); endgroup3(f3); if(L.defaulttransform3) add(f1,T*f3); else { add(f2,inverse(T)*L.T3*f3); endgroup3(f2); add(f1,T*f2); } endgroup3(f1); add(f,positioning*f1); } else { begingroup3(f,name,render); for(patch S : surface(L,position).s) { triple V=L.align.is3D ? position+L.align.dir3*labelmargin(L.p) : position; draw3D(f,S,L.p,light,render(interaction(interaction,center=V))); } endgroup3(f); } } else { pen p=color(L.T3*Z,L.p,light,shiftless(P.T.modelview)); if(L.defaulttransform3) { if(L.filltype == NoFill) fill(f,path(L,project(position,P.t),P),p); else { frame d; fill(d,path(L,project(position,P.t),P),p); add(f,d,L.filltype); } } else for(patch S : surface(L,position).s) fill(f,project(S.external(),P,1),p); } } void label(picture pic=currentpicture, Label L, triple position, align align=NoAlign, pen p=currentpen, light light=nolight, string name="", render render=defaultrender, interaction interaction=LabelInteraction()) { Label L=L.copy(); L.align(align); L.p(p); L.position(0); pic.add(new void(frame f, transform3 t, picture pic2, projection P) { // Handle relative projected 3D alignments. bool prc=prc(); Label L=L.copy(); triple v=t*position; if(!align.is3D && L.align.relative && L.align.dir3 != O && determinant(P.t) != 0) L.align(L.align.dir*unit(project(v+L.align.dir3,P.t)-project(v,P.t))); if(interaction.targetsize && settings.render != 0) L.T=L.T*scale(abs(P.camera-v)/abs(P.vector())); transform3 T=transform3(P); if(L.defaulttransform3) L.T3=T; if(is3D()) { bool lighton=light.on(); if(name == "") name=L.s; if(prc && interaction.type == Billboard.type) { surface s=surface(texpath(L,bbox=P.bboxonly)); if(s.s.length > 0) { transform3 centering=L.align.is3D ? alignshift(s,L.T3,v,L.align.dir3) : identity4; transform3 positioning= shift(L.align.is3D ? v+L.align.dir3*labelmargin(L.p) : v); frame f1,f2,f3; begingroup3(f1,name,render); render Render=render(render,interaction(interaction,v)); if(L.defaulttransform3) begingroup3(f3,Render); else { begingroup3(f2,Render); begingroup3(f3,Render); } for(patch S : s.s) draw3D(f3,centering*S,L.p,light,Render); endgroup3(f3); if(L.defaulttransform3) add(f1,T*f3); else { add(f2,inverse(T)*L.T3*f3); endgroup3(f2); add(f1,T*f2); } endgroup3(f1); add(f,positioning*f1); } } else { begingroup3(f,name,render); for(patch S : surface(L,v,bbox=P.bboxonly).s) { triple V=L.align.is3D ? v+L.align.dir3*labelmargin(L.p) : v; draw3D(f,S,L.p,light,render(render,interaction(interaction,V))); } endgroup3(f); } } if(pic2 != null) { pen p=color(L.T3*Z,L.p,light,shiftless(P.T.modelview)); if(L.defaulttransform3) { if(L.filltype == NoFill) fill(project(v,P.t),pic2,path(L,P),p); else { picture d; fill(project(v,P.t),d,path(L,P),p); add(pic2,d,L.filltype); } } else pic2.add(new void(frame f, transform T) { for(patch S : surface(L,v).s) fill(f,T*project(S.external(),P,1),p); }); } },!L.defaulttransform3); Label L=L.copy(); if(interaction.targetsize && settings.render != 0) L.T=L.T*scale(abs(currentprojection.camera-position)/ abs(currentprojection.vector())); path[] g=texpath(L,bbox=true); if(g.length == 0 || (g.length == 1 && size(g[0]) == 0)) return; if(L.defaulttransform3) L.T3=transform3(currentprojection); path3[] G=path3(g); G=L.align.is3D ? align(G,L.T3,O,L.align.dir3,L.p) : L.T3*G; pic.addBox(position,position,min(G),max(G)); } void label(picture pic=currentpicture, Label L, path3 g, align align=NoAlign, pen p=currentpen, light light=nolight, string name="", interaction interaction=LabelInteraction()) { Label L=L.copy(); L.align(align); L.p(p); bool relative=L.position.relative; real position=L.position.position.x; if(L.defaultposition) {relative=true; position=0.5;} if(relative) position=reltime(g,position); if(L.align.default) { align a; a.init(-I*(position <= sqrtEpsilon ? S : position >= length(g)-sqrtEpsilon ? N : E),relative=true); a.dir3=dir(g,position); // Pass 3D direction via unused field. L.align(a); } label(pic,L,point(g,position),light,name,interaction); } surface extrude(Label L, triple axis=Z) { Label L=L.copy(); path[] g=texpath(L); surface S=extrude(g,axis); surface s=surface(g); S.append(s); S.append(shift(axis)*s); return S; } restricted surface nullsurface; // Embed a Label onto a surface. surface surface(Label L, surface s, real uoffset, real voffset, real height=0, bool bottom=true, bool top=true) { int nu=s.index.length; int nv; if(nu == 0) nu=nv=1; else { nv=s.index[0].length; if(nv == 0) nv=1; } path[] g=texpath(L); pair m=min(g); pair M=max(g); pair lambda=inverse(L.T*scale(nu-epsilon,nv-epsilon))*(M-m); lambda=(abs(lambda.x),abs(lambda.y)); path[] G=bezulate(g); path3 transpath(path p, real height) { return path3(unstraighten(p),new triple(pair z) { real u=uoffset+(z.x-m.x)/lambda.x; real v=voffset+(z.y-m.y)/lambda.y; if(((u < 0 || u >= nu) && !s.ucyclic()) || ((v < 0 || v >= nv) && !s.vcyclic())) { warning("cannotfit","cannot fit string to surface"); u=v=0; } return s.point(u,v)+height*unit(s.normal(u,v)); }); } surface s; for(path p : G) { for(path g : regularize(p)) { path3 b; bool extrude=height > 0; if(bottom || extrude) b=transpath(g,0); if(bottom) s.s.push(patch(b)); if(top || extrude) { path3 h=transpath(g,height); if(top) s.s.push(patch(h)); if(extrude) s.append(extrude(b,h)); } } } return s; } private real a=4/3*(sqrt(2)-1); private transform3 t1=rotate(90,O,Z); private transform3 t2=t1*t1; private transform3 t3=t2*t1; private transform3 i=xscale3(-1)*zscale3(-1); // Degenerate first octant restricted patch octant1x=patch(X{Y}..{-X}Y{Z}..{-Y}Z..Z{X}..{-Z}cycle, new triple[] {(1,a,a),(a,1,a),(a^2,a,1), (a,a^2,1)}); surface octant1(real transition) { private triple[][][] P=hsplit(octant1x.P,transition); private patch P0=patch(P[0]); private patch P1=patch(P[1][0][0]..controls P[1][1][0] and P[1][2][0].. P[1][3][0]..controls P[1][3][1] and P[1][3][2].. P[1][3][3]..controls P[1][0][2] and P[1][0][1].. cycle,O); // Set internal control point of P1 to match normals at P0.point(1/2,1). triple n=P0.normal(1/2,1); triple[][] P=P1.P; triple u=-P[0][0]-P[1][0]+P[2][0]+P[3][0]; triple v=-P[0][0]-2*P[1][0]+P[1][1]-P[2][0]+P[3][1]; triple w=cross(u,v+(0,0,2)); real i=0.5*(n.z*w.x/n.x-w.z)/(u.x-u.y); P1.P[2][1]=(i,i,1); return surface(P0,P1); } // Nondegenerate first octant restricted surface octant1=octant1(0.95); restricted surface unithemisphere=surface(octant1,t1*octant1,t2*octant1, t3*octant1); restricted surface unitsphere=surface(octant1,t1*octant1,t2*octant1,t3*octant1, i*octant1,i*t1*octant1,i*t2*octant1, i*t3*octant1); unitsphere.primitive=primitive( new void(frame f, transform3 t=identity4, material[] m, light light=currentlight, render render=defaultrender) { material m=material(m[0],light); drawSphere(f,t,half=false,m.p,m.opacity,m.shininess,m.metallic,m.fresnel0, render.sphere); },new bool(transform3 t) { return unscaled(t,X,Y) && unscaled(t,Y,Z); }); unithemisphere.primitive=primitive( new void(frame f, transform3 t=identity4, material[] m, light light=currentlight, render render=defaultrender) { material m=material(m[0],light); drawSphere(f,t,half=true,m.p,m.opacity,m.shininess,m.metallic,m.fresnel0, render.sphere); },new bool(transform3 t) { return unscaled(t,X,Y) && unscaled(t,Y,Z); }); restricted patch unitfrustum1(real ta, real tb) { real s1=interp(ta,tb,1/3); real s2=interp(ta,tb,2/3); return patch(interp(Z,X,tb){Y}..{-X}interp(Z,Y,tb)--interp(Z,Y,ta){X}..{-Y} interp(Z,X,ta)--cycle, new triple[] {(s2,s2*a,1-s2),(s2*a,s2,1-s2),(s1*a,s1,1-s1), (s1,s1*a,1-s1)}); } restricted surface unitfrustum(real ta, real tb) { patch p=unitfrustum1(ta,tb); return surface(p,t1*p,t2*p,t3*p); } restricted surface unitcone=surface(unitfrustum(0,1)); restricted surface unitsolidcone=surface(patch(unitcircle3)...unitcone.s); // Construct an approximate cone over an arbitrary base. surface cone(path3 base, triple vertex) {return extrude(base,vertex--cycle);} private patch unitcylinder1=patch(X{Y}..{-X}Y--Y+Z{X}..{-Y}X+Z--cycle); restricted surface unitcylinder=surface(unitcylinder1,t1*unitcylinder1, t2*unitcylinder1,t3*unitcylinder1); drawfcn unitcylinderDraw(bool core) { return new void(frame f, transform3 t=identity4, material[] m, light light=currentlight, render render=defaultrender) { material m=material(m[0],light); drawCylinder(f,t,m.p,m.opacity,m.shininess,m.metallic,m.fresnel0, m.opacity == 1 ? core : false); }; } unitcylinder.primitive=primitive(unitcylinderDraw(false), new bool(transform3 t) { return unscaled(t,X,Y); }); private patch unitplane=patch(new triple[] {O,X,X+Y,Y}); restricted surface unitcube=surface(reverse(unitplane), rotate(90,O,X)*unitplane, rotate(-90,O,Y)*unitplane, shift(Z)*unitplane, rotate(90,X,X+Y)*unitplane, rotate(-90,Y,X+Y)*unitplane); restricted surface unitplane=surface(unitplane); restricted surface unitdisk=surface(unitcircle3); unitdisk.primitive=primitive( new void(frame f, transform3 t=identity4, material[] m, light light=currentlight, render render=defaultrender) { material m=material(m[0],light); drawDisk(f,t,m.p,m.opacity,m.shininess,m.metallic,m.fresnel0); }, new bool(transform3 t) { return unscaled(t,X,Y); }); void dot(frame f, triple v, material p=currentpen, light light=nolight, string name="", render render=defaultrender, projection P=currentprojection) { if(name == "" && render.defaultnames) name="dot"; pen q=(pen) p; real size=0.5*linewidth(dotsize(q)+q); transform3 T=shift(v)*scale3(size); draw(f,T*unitsphere,p,light,name,render,P); } void dot(frame f, triple[] v, material p=currentpen, light light=nolight, string name="", render render=defaultrender, projection P=currentprojection) { if(v.length > 0) { // Remove duplicate points. v=sort(v,lexorder); triple last=v[0]; dot(f,last,p,light,name,render,P); for(int i=1; i < v.length; ++i) { triple V=v[i]; if(V != last) { dot(f,V,p,light,name,render,P); last=V; } } } } void dot(frame f, path3 g, material p=currentpen, light light=nolight, string name="", render render=defaultrender, projection P=currentprojection) { dot(f,sequence(new triple(int i) {return point(g,i);},size(g)), p,light,name,render,P); } void dot(frame f, path3[] g, material p=currentpen, light light=nolight, string name="", render render=defaultrender, projection P=currentprojection) { int sum; for(path3 G : g) sum += size(G); int i,j; dot(f,sequence(new triple(int) { while(j >= size(g[i])) { ++i; j=0; } triple v=point(g[i],j); ++j; return v; },sum),p,light,name,render,P); } void dot(picture pic=currentpicture, triple v, material p=currentpen, light light=nolight, string name="", render render=defaultrender) { pen q=(pen) p; real size=0.5*linewidth(dotsize(q)+q); pic.add(new void(frame f, transform3 t, picture pic, projection P) { triple V=t*v; dot(f,V,p,light,name,render,P); if(pic != null) dot(pic,project(V,P.t),q); },true); triple R=size*(1,1,1); pic.addBox(v,v,-R,R); } void dot(picture pic=currentpicture, triple[] v, material p=currentpen, light light=nolight, string name="", render render=defaultrender) { if(v.length > 0) { // Remove duplicate points. v=sort(v,lexorder); triple last=v[0]; bool group=name != "" || render.defaultnames; if(group) begingroup3(pic,name == "" ? "dots" : name,render); dot(pic,last,p,light,partname(0,render),render); int k=0; for(int i=1; i < v.length; ++i) { triple V=v[i]; if(V != last) { dot(pic,V,p,light,partname(++k,render),render); last=V; } } if(group) endgroup3(pic); } } void dot(picture pic=currentpicture, explicit path3 g, material p=currentpen, light light=nolight, string name="", render render=defaultrender) { dot(pic,sequence(new triple(int i) {return point(g,i);},size(g)), p,light,name,render); } void dot(picture pic=currentpicture, path3[] g, material p=currentpen, light light=nolight, string name="", render render=defaultrender) { int sum; for(path3 G : g) sum += size(G); int i,j; dot(pic,sequence(new triple(int) { while(j >= size(g[i])) { ++i; j=0; } triple v=point(g[i],j); ++j; return v; },sum),p,light,name,render); } void dot(picture pic=currentpicture, Label L, triple v, align align=NoAlign, string format=defaultformat, material p=currentpen, light light=nolight, string name="", render render=defaultrender) { Label L=L.copy(); if(L.s == "") { if(format == "") format=defaultformat; L.s="("+format(format,v.x)+","+format(format,v.y)+","+ format(format,v.z)+")"; } L.align(align,E); L.p((pen) p); dot(pic,v,p,light,name,render); label(pic,L,v,render); } void pixel(picture pic=currentpicture, triple v, pen p=currentpen, real width=1) { real h=0.5*width; pic.add(new void(frame f, transform3 t, picture pic, projection P) { triple V=t*v; if(is3D()) drawpixel(f,V,p,width); if(pic != null) { triple R=h*unit(cross(unit(P.vector()),P.up)); pair z=project(V,P.t); real h=0.5*abs(project(V+R,P.t)-project(V-R,P.t)); pair r=h*(1,1)/mm; fill(pic,box(z-r,z+r),p,false); } },true); triple R=h*(1,1,1); pic.addBox(v,v,-R,R); } pair minbound(triple[] A, projection P) { pair b=project(A[0],P); for(triple v : A) b=minbound(b,project(v,P.t)); return b; } pair maxbound(triple[] A, projection P) { pair b=project(A[0],P); for(triple v : A) b=maxbound(b,project(v,P.t)); return b; } pair minbound(triple[][] A, projection P) { pair b=project(A[0][0],P); for(triple[] a : A) { for(triple v : a) { b=minbound(b,project(v,P.t)); } } return b; } pair maxbound(triple[][] A, projection P) { pair b=project(A[0][0],P); for(triple[] a : A) { for(triple v : a) { b=maxbound(b,project(v,P.t)); } } return b; } triple[][] operator / (triple[][] a, real[][] b) { triple[][] A=new triple[a.length][]; for(int i=0; i < a.length; ++i) { triple[] ai=a[i]; real[] bi=b[i]; A[i]=sequence(new triple(int j) {return ai[j]/bi[j];},ai.length); } return A; } // Draw a NURBS curve. void draw(picture pic=currentpicture, triple[] P, real[] knot, real[] weights=new real[], pen p=currentpen, string name="", render render=defaultrender) { P=copy(P); knot=copy(knot); weights=copy(weights); pic.add(new void(frame f, transform3 t, picture pic, projection Q) { if(is3D()) { triple[] P=t*P; bool group=name != "" || render.defaultnames; if(group) begingroup3(f,name == "" ? "curve" : name,render); draw(f,P,knot,weights,p); if(group) endgroup3(f); if(pic != null) pic.addBox(minbound(P,Q),maxbound(P,Q)); } },true); pic.addBox(minbound(P),maxbound(P)); } // Draw a NURBS surface. void draw(picture pic=currentpicture, triple[][] P, real[] uknot, real[] vknot, real[][] weights=new real[][], material m=currentpen, pen[] colors=new pen[], light light=currentlight, string name="", render render=defaultrender) { if(colors.length > 0) m=mean(colors); m=material(m,light); bool lighton=light.on(); P=copy(P); uknot=copy(uknot); vknot=copy(vknot); weights=copy(weights); colors=copy(colors); pic.add(new void(frame f, transform3 t, picture pic, projection Q) { if(is3D()) { bool group=name != "" || render.defaultnames; if(group) begingroup3(f,name == "" ? "surface" : name,render); triple[][] P=t*P; draw(f,P,uknot,vknot,weights,m.p,m.opacity,m.shininess,m.metallic, m.fresnel0,colors); if(group) endgroup3(f); if(pic != null) pic.addBox(minbound(P,Q),maxbound(P,Q)); } },true); pic.addBox(minbound(P),maxbound(P)); } asymptote-3.05/base/palette.asy0000644000000000000000000003602415031566105015261 0ustar rootrootprivate import graph; private transform swap=(0,0,0,1,1,0); using range=bounds(picture pic, real min, real max); range Range(bool automin=false, real min=-infinity, bool automax=false, real max=infinity) { return new bounds(picture pic, real dmin, real dmax) { // autoscale routine finds reasonable limits bounds mz=autoscale(pic.scale.z.T(dmin), pic.scale.z.T(dmax), pic.scale.z.scale); // If automin/max, use autoscale result, else // if min/max is finite, use specified value, else // use minimum/maximum data value real pmin=automin ? pic.scale.z.Tinv(mz.min) : (finite(min) ? min : dmin); real pmax=automax ? pic.scale.z.Tinv(mz.max) : (finite(max) ? max : dmax); return bounds(pmin,pmax); }; } range Automatic=Range(true,true); range Full=Range(); void image(frame f, real[][] data, pair initial, pair final, pen[] palette, bool transpose=(initial.x < final.x && initial.y < final.y), transform t=identity(), bool copy=true, bool antialias=false) { transform T=transpose ? swap : identity(); _image(f,copy ? copy(data) : data,T*initial,T*final,palette,t*T,copy=false, antialias=antialias); } void image(frame f, pen[][] data, pair initial, pair final, bool transpose=(initial.x < final.x && initial.y < final.y), transform t=identity(), bool copy=true, bool antialias=false) { transform T=transpose ? swap : identity(); _image(f,copy ? copy(data) : data,T*initial,T*final,t*T,copy=false, antialias=antialias); } // Reduce color palette to approximate range of data relative to "display" // range => errors of 1/palette.length in resulting color space. pen[] adjust(picture pic, real min, real max, real rmin, real rmax, pen[] palette) { real dmin=pic.scale.z.T(min); real dmax=pic.scale.z.T(max); real delta=rmax-rmin; if(delta > 0) { real factor=palette.length/delta; int minindex=floor(factor*(dmin-rmin)); if(minindex < 0) minindex=0; int maxindex=ceil(factor*(dmax-rmin)); if(maxindex > palette.length) maxindex=palette.length; if(minindex > 0 || maxindex < palette.length) return palette[minindex:maxindex]; } return palette; } private real[] sequencereal; bounds image(picture pic=currentpicture, real[][] f, range range=Full, pair initial, pair final, pen[] palette, int divs=0, bool transpose=(initial.x < final.x && initial.y < final.y), bool copy=true, bool antialias=false) { if(copy) f=copy(f); if(copy) palette=copy(palette); real m=min(f); real M=max(f); bounds bounds=range(pic,m,M); real rmin=pic.scale.z.T(bounds.min); real rmax=pic.scale.z.T(bounds.max); palette=adjust(pic,m,M,rmin,rmax,palette); // Crop data to allowed range and scale if(range != Full || pic.scale.z.scale.T != identity || pic.scale.z.postscale.T != identity) { scalefcn T=pic.scale.z.T; real m=bounds.min; real M=bounds.max; for(int i=0; i < f.length; ++i) f[i]=map(new real(real x) {return T(min(max(x,m),M));},f[i]); } if(divs > 0) { int nx=f.length; int ny=f[0].length; real[][] data=new real[nx][ny]; real incr=(M-m)/divs; for(int i=0; i < nx; ++i) { // Take center point of each bin real[] fi=f[i]; data[i]=sequence(new real(int j) { return min(m+floor((fi[j]-m)/incr)*incr,M-incr); },ny); } f=data; } initial=Scale(pic,initial); final=Scale(pic,final); pic.addBox(initial,final); transform T; if(transpose) { T=swap; initial=T*initial; final=T*final; } pic.add(new void(frame F, transform t) { _image(F,f,initial,final,palette,t*T,copy=false,antialias=antialias); },true); return bounds; // Return bounds used for color space } bounds image(picture pic=currentpicture, real f(real, real), range range=Full, pair initial, pair final, int nx=ngraph, int ny=nx, pen[] palette, int divs=0, bool antialias=false) { // Generate data, taking scaling into account real xmin=pic.scale.x.T(initial.x); real xmax=pic.scale.x.T(final.x); real ymin=pic.scale.y.T(initial.y); real ymax=pic.scale.y.T(final.y); real[][] data=new real[ny][nx]; for(int j=0; j < ny; ++j) { real y=pic.scale.y.Tinv(interp(ymin,ymax,(j+0.5)/ny)); scalefcn Tinv=pic.scale.x.Tinv; // Take center point of each bin data[j]=sequence(new real(int i) { return f(Tinv(interp(xmin,xmax,(i+0.5)/nx)),y); },nx); } return image(pic,data,range,initial,final,palette,divs,transpose=false, copy=false,antialias=antialias); } void image(picture pic=currentpicture, pen[][] data, pair initial, pair final, bool transpose=(initial.x < final.x && initial.y < final.y), bool copy=true, bool antialias=false) { if(copy) data=copy(data); initial=Scale(pic,initial); final=Scale(pic,final); pic.addBox(initial,final); transform T; if(transpose) { T=swap; initial=T*initial; final=T*final; } pic.add(new void(frame F, transform t) { _image(F,data,initial,final,t*T,copy=false,antialias=antialias); },true); } void image(picture pic=currentpicture, pen f(int, int), int width, int height, pair initial, pair final, bool transpose=(initial.x < final.x && initial.y < final.y), bool antialias=false) { initial=Scale(pic,initial); final=Scale(pic,final); pic.addBox(initial,final); transform T; if(transpose) { T=swap; int temp=width; width=height; height=temp; initial=T*initial; final=T*final; } pic.add(new void(frame F, transform t) { _image(F,f,width,height,initial,final,t*T,antialias=antialias); },true); } bounds image(picture pic=currentpicture, pair[] z, real[] f, range range=Full, pen[] palette) { if(z.length != f.length) abort("z and f arrays have different lengths"); real m=min(f); real M=max(f); bounds bounds=range(pic,m,M); real rmin=pic.scale.z.T(bounds.min); real rmax=pic.scale.z.T(bounds.max); palette=adjust(pic,m,M,rmin,rmax,palette); rmin=max(rmin,pic.scale.z.T(m)); rmax=min(rmax,pic.scale.z.T(M)); // Crop data to allowed range and scale if(range != Full || pic.scale.z.scale.T != identity || pic.scale.z.postscale.T != identity) { scalefcn T=pic.scale.z.T; real m=bounds.min; real M=bounds.max; f=map(new real(real x) {return T(min(max(x,m),M));},f); } if(pic.scale.x.scale.T != identity || pic.scale.x.postscale.T != identity || pic.scale.y.scale.T != identity || pic.scale.y.postscale.T != identity) { scalefcn Tx=pic.scale.x.T; scalefcn Ty=pic.scale.y.T; z=map(new pair(pair z) {return (Tx(z.x),Ty(z.y));},z); } int[] edges={0,0,1}; int N=palette.length-1; int[][] trn=triangulate(z); real step=rmax == rmin ? 0.0 : N/(rmax-rmin); for(int i=0; i < trn.length; ++i) { int[] trni=trn[i]; int i0=trni[0], i1=trni[1], i2=trni[2]; pen color(int i) {return palette[round((f[i]-rmin)*step)];} gouraudshade(pic,z[i0]--z[i1]--z[i2]--cycle, new pen[] {color(i0),color(i1),color(i2)},edges); } return bounds; // Return bounds used for color space } bounds image(picture pic=currentpicture, real[] x, real[] y, real[] f, range range=Full, pen[] palette) { int n=x.length; if(n != y.length) abort("x and y arrays have different lengths"); pair[] z=sequence(new pair(int i) {return (x[i],y[i]);},n); return image(pic,z,f,range,palette); } // Construct a pen[] array from f using the specified palette. pen[] palette(real[] f, pen[] palette) { real Min=min(f); real Max=max(f); if(palette.length == 0) return new pen[]; real step=Max == Min ? 0.0 : (palette.length-1)/(Max-Min); return sequence(new pen(int i) {return palette[round((f[i]-Min)*step)];}, f.length); } // Construct a pen[][] array from f using the specified palette. pen[][] palette(real[][] f, pen[] palette) { real Min=min(f); real Max=max(f); int n=f.length; pen[][] p=new pen[n][]; real step=(Max == Min) ? 0.0 : (palette.length-1)/(Max-Min); for(int i=0; i < n; ++i) { real[] fi=f[i]; p[i]=sequence(new pen(int j) {return palette[round((fi[j]-Min)*step)];}, f[i].length); } return p; } typedef ticks paletteticks(int sign=-1); paletteticks PaletteTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, pen pTick=nullpen, pen ptick=nullpen) { return new ticks(int sign=-1) { format.align(sign > 0 ? RightSide : LeftSide); return Ticks(sign,format,ticklabel,beginlabel,endlabel,N,n,Step,step, true,true,extend=true,pTick,ptick); }; } paletteticks PaletteTicks=PaletteTicks(); paletteticks NoTicks=new ticks(int sign=-1) {return NoTicks;}; void palette(picture pic=currentpicture, Label L="", bounds bounds, pair initial, pair final, axis axis=Right, pen[] palette, pen p=currentpen, paletteticks ticks=PaletteTicks, bool copy=true, bool antialias=false) { real initialz=pic.scale.z.T(bounds.min); real finalz=pic.scale.z.T(bounds.max); bounds mz=autoscale(initialz,finalz,pic.scale.z.scale); axisT axis; axis(pic,axis); real angle=degrees(axis.align.dir); initial=Scale(pic,initial); final=Scale(pic,final); pair lambda=final-initial; bool vertical=(floor((angle+45)/90) % 2 == 0); pair perp,par; if(vertical) {perp=E; par=N;} else {perp=N; par=E;} path g=(final-dot(lambda,par)*par)--final; path g2=initial--final-dot(lambda,perp)*perp; if(sgn(dot(lambda,perp)*dot(axis.align.dir,perp)) == -1) { path tmp=g; g=g2; g2=tmp; } if(copy) palette=copy(palette); Label L=L.copy(); if(L.defaultposition) L.position(0.5); L.align(axis.align); L.p(p); if(vertical && L.defaulttransform) { frame f; add(f,Label(L.s,(0,0),L.p)); if(length(max(f)-min(f)) > ylabelwidth*fontsize(L.p)) L.transform(rotate(90)); } real[][] pdata={sequence(palette.length)}; transform T; pair Tinitial,Tfinal; if(vertical) { T=swap; Tinitial=T*initial; Tfinal=T*final; } else { Tinitial=initial; Tfinal=final; } pic.add(new void(frame f, transform t) { _image(f,pdata,Tinitial,Tfinal,palette,t*T,copy=false, antialias=antialias); },true); ticklocate locate=ticklocate(initialz,finalz,pic.scale.z,mz.min,mz.max); axis(pic,L,g,g2,p,ticks(sgn(axis.side.x*dot(lambda,par))),locate,mz.divisor, true); pic.add(new void(frame f, transform t) { pair Z0=t*initial; pair Z1=t*final; draw(f,Z0--(Z0.x,Z1.y)--Z1--(Z1.x,Z0.y)--cycle,p); },true); pic.addBox(initial,final); } // A grayscale palette pen[] Grayscale(int NColors=256) { real ninv=1.0/(NColors-1.0); return sequence(new pen(int i) {return gray(i*ninv);},NColors); } // A color wheel palette pen[] Wheel(int NColors=32766) { if(settings.gray) return Grayscale(NColors); int nintervals=6; if(NColors <= nintervals) NColors=nintervals+1; int n=-quotient(NColors,-nintervals); pen[] Palette; Palette=new pen[n*nintervals]; real ninv=1.0/n; for(int i=0; i < n; ++i) { real ininv=i*ninv; real ininv1=1.0-ininv; Palette[i]=rgb(1.0,0.0,ininv); Palette[n+i]=rgb(ininv1,0.0,1.0); Palette[2n+i]=rgb(0.0,ininv,1.0); Palette[3n+i]=rgb(0.0,1.0,ininv1); Palette[4n+i]=rgb(ininv,1.0,0.0); Palette[5n+i]=rgb(1.0,ininv1,0.0); } return Palette; } // A rainbow palette pen[] Rainbow(int NColors=32766) { if(settings.gray) return Grayscale(NColors); int offset=1; int nintervals=5; if(NColors <= nintervals) NColors=nintervals+1; int n=-quotient(NColors-1,-nintervals); pen[] Palette; Palette=new pen[n*nintervals+offset]; real ninv=1.0/n; for(int i=0; i < n; ++i) { real ininv=i*ninv; real ininv1=1.0-ininv; Palette[i]=rgb(ininv1,0.0,1.0); Palette[n+i]=rgb(0.0,ininv,1.0); Palette[2n+i]=rgb(0.0,1.0,ininv1); Palette[3n+i]=rgb(ininv,1.0,0.0); Palette[4n+i]=rgb(1.0,ininv1,0.0); } Palette[4n+n]=rgb(1.0,0.0,0.0); return Palette; } private pen[] BWRainbow(int NColors, bool two) { if(settings.gray) return Grayscale(NColors); int offset=1; int nintervals=6; int divisor=3; if(two) nintervals += 6; int Nintervals=nintervals*divisor; if(NColors <= Nintervals) NColors=Nintervals+1; int num=NColors-offset; int n=-quotient(num,-Nintervals)*divisor; NColors=n*nintervals+offset; pen[] Palette; Palette=new pen[NColors]; real ninv=1.0/n; int k=0; if(two) { for(int i=0; i < n; ++i) { real ininv=i*ninv; real ininv1=1.0-ininv; Palette[i]=rgb(ininv1,0.0,1.0); Palette[n+i]=rgb(0.0,ininv,1.0); Palette[2n+i]=rgb(0.0,1.0,ininv1); Palette[3n+i]=rgb(ininv,1.0,0.0); Palette[4n+i]=rgb(1.0,ininv1,0.0); Palette[5n+i]=rgb(1.0,0.0,ininv); } k += 6n; } if(two) for(int i=0; i < n; ++i) Palette[k+i]=rgb(1.0-i*ninv,0.0,1.0); else { int n3=-quotient(n,-3); int n23=2*n3; real third=n3*ninv; real twothirds=n23*ninv; for(int i=0; i < n3; ++i) { real ininv=i*ninv; Palette[k+i]=rgb(ininv,0.0,ininv); Palette[k+n3+i]=rgb(third,0.0,third+ininv); Palette[k+n23+i]=rgb(third-ininv,0.0,twothirds+ininv); } } k += n; for(int i=0; i < n; ++i) { real ininv=i*ninv; real ininv1=1.0-ininv; Palette[k+i]=rgb(0.0,ininv,1.0); Palette[k+n+i]=rgb(0.0,1.0,ininv1); Palette[k+2n+i]=rgb(ininv,1.0,0.0); Palette[k+3n+i]=rgb(1.0,ininv1,0.0); Palette[k+4n+i]=rgb(1.0,ininv,ininv); } Palette[k+5n]=rgb(1.0,1.0,1.0); return Palette; } // Quantize palette to exactly n values pen[] quantize(pen[] Palette, int n) { if(Palette.length == 0) abort("cannot quantize empty palette"); if(n <= 1) abort("palette must contain at least two pens"); real step=(Palette.length-1)/(n-1); return sequence(new pen(int i) { return Palette[round(i*step)]; },n); } // A rainbow palette tapering off to black/white at the spectrum ends, pen[] BWRainbow(int NColors=32761) { return BWRainbow(NColors,false); } // A double rainbow palette tapering off to black/white at the spectrum ends, // with a linearly scaled intensity. pen[] BWRainbow2(int NColors=32761) { pen[] Palette=BWRainbow(NColors,true); int n=Palette.length; real ninv=1.0/n; for(int i=0; i < n; ++i) Palette[i]=i*ninv*Palette[i]; return Palette; } //A palette varying linearly over the specified array of pens, using // NColors in each interpolation interval. pen[] Gradient(int NColors=256 ... pen[] p) { pen[] P; if(p.length < 2) abort("at least 2 colors must be specified"); real step=NColors > 1 ? (1/(NColors-1)) : 1; for(int i=0; i < p.length-1; ++i) { pen begin=p[i]; pen end=p[i+1]; P.append(sequence(new pen(int j) { return interp(begin,end,j*step); },NColors)); } return P; } pen[] cmyk(pen[] Palette) { int n=Palette.length; for(int i=0; i < n; ++i) Palette[i]=cmyk(Palette[i]); return Palette; } asymptote-3.05/base/contour.asy0000644000000000000000000004746515031566105015327 0ustar rootroot// Contour routines written by Radoslav Marinov and John Bowman. import graph_settings; real eps=10000*realEpsilon; // 1 // 6 +-------------------+ 5 // | \ / | // | \ / | // | \ / | // | \ / | // 2 | X | 0 // | / \ | // | / \ | // | / \ | // | / \ | // 7 +-------------------+ 4 or 8 // 3 private struct segment { bool active; pair a,b; // Endpoints; a is always an edge point if one exists. int c; // Contour value. int edge; // -1: interior, 0 to 3: edge, // 4-8: single-vertex edge, 9: double-vertex edge. } // Case 1: line passes through two vertices of a triangle private segment case1(pair p0, pair p1, int edge) { // Will cause a duplicate guide; luckily case1 is rare segment rtrn; rtrn.active=true; rtrn.a=p0; rtrn.b=p1; rtrn.edge=edge; return rtrn; } // Case 2: line passes through a vertex and a side of a triangle // (the first vertex passed and the side between the other two) private segment case2(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge) { segment rtrn; pair val=interp(p1,p2,abs(v1/(v2-v1))); rtrn.active=true; if(edge < 4) { rtrn.a=val; rtrn.b=p0; } else { rtrn.a=p0; rtrn.b=val; } rtrn.edge=edge; return rtrn; } // Case 3: line passes through two sides of a triangle // (through the sides formed by the first & second, and second & third // vertices) private segment case3(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge=-1) { segment rtrn; rtrn.active=true; rtrn.a=interp(p1,p0,abs(v1/(v0-v1))); rtrn.b=interp(p1,p2,abs(v1/(v2-v1))); rtrn.edge=edge; return rtrn; } // Check if a line passes through a triangle, and draw the required line. private segment checktriangle(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge=-1) { // default null return static segment dflt; real eps=eps*max(abs(v0),abs(v1),abs(v2)); if(v0 < -eps) { if(v1 < -eps) { if(v2 < -eps) return dflt; // nothing to do else if(v2 <= eps) return dflt; // nothing to do else return case3(p0,p2,p1,v0,v2,v1); } else if(v1 <= eps) { if(v2 < -eps) return dflt; // nothing to do else if(v2 <= eps) return case1(p1,p2,5+edge); else return case2(p1,p0,p2,v1,v0,v2,5+edge); } else { if(v2 < -eps) return case3(p0,p1,p2,v0,v1,v2,edge); else if(v2 <= eps) return case2(p2,p0,p1,v2,v0,v1,edge); else return case3(p1,p0,p2,v1,v0,v2,edge); } } else if(v0 <= eps) { if(v1 < -eps) { if(v2 < -eps) return dflt; // nothing to do else if(v2 <= eps) return case1(p0,p2,4+edge); else return case2(p0,p1,p2,v0,v1,v2,4+edge); } else if(v1 <= eps) { if(v2 < -eps) return case1(p0,p1,9); else if(v2 <= eps) return dflt; // use finer partitioning. else return case1(p0,p1,9); } else { if(v2 < -eps) return case2(p0,p1,p2,v0,v1,v2,4+edge); else if(v2 <= eps) return case1(p0,p2,4+edge); else return dflt; // nothing to do } } else { if(v1 < -eps) { if(v2 < -eps) return case3(p1,p0,p2,v1,v0,v2,edge); else if(v2 <= eps) return case2(p2,p0,p1,v2,v0,v1,edge); else return case3(p0,p1,p2,v0,v1,v2,edge); } else if(v1 <= eps) { if(v2 < -eps) return case2(p1,p0,p2,v1,v0,v2,5+edge); else if(v2 <= eps) return case1(p1,p2,5+edge); else return dflt; // nothing to do } else { if(v2 < -eps) return case3(p0,p2,p1,v0,v2,v1); else if(v2 <= eps) return dflt; // nothing to do else return dflt; // nothing to do } } } // Collect connecting path segments. private void collect(pair[][][] points, real[] c) { // use to reverse an array, omitting the first point int[] reverseF(int n) {return sequence(new int(int x){return n-1-x;},n-1);} // use to reverse an array, omitting the last point int[] reverseL(int n) {return sequence(new int(int x){return n-2-x;},n-1);} for(int cnt=0; cnt < c.length; ++cnt) { pair[][] gdscnt=points[cnt]; for(int i=0; i < gdscnt.length; ++i) { pair[] gig=gdscnt[i]; int Li=gig.length; for(int j=i+1; j < gdscnt.length; ++j) { pair[] gjg=gdscnt[j]; int Lj=gjg.length; if(abs(gig[0]-gjg[0]) < eps) { gdscnt[j]=gjg[reverseF(Lj)]; gdscnt[j].append(gig); gdscnt.delete(i); --i; break; } else if(abs(gig[0]-gjg[Lj-1]) < eps) { gig.delete(0); gdscnt[j].append(gig); gdscnt.delete(i); --i; break; } else if(abs(gig[Li-1]-gjg[0]) < eps) { gjg.delete(0); gig.append(gjg); gdscnt[j]=gig; gdscnt.delete(i); --i; break; } else if(abs(gig[Li-1]-gjg[Lj-1]) < eps) { gig.append(gjg[reverseL(Lj)]); gdscnt[j]=gig; gdscnt.delete(i); --i; break; } } } } } // Join path segments. private guide[][] connect(picture pic, pair[][][] points, real[] c, interpolate join) { // set up return value guide[][] result=new guide[c.length][]; for(int cnt=0; cnt < c.length; ++cnt) { pair[][] pointscnt=points[cnt]; guide[] resultcnt=result[cnt]=new guide[pointscnt.length]; for(int i=0; i < pointscnt.length; ++i) { pair[] pts=pointscnt[i]; guide gd; if(pts.length > 0) { if(pts.length > 1 && abs(pts[0]-pts[pts.length-1]) < eps) { guide[] g=sequence(new guide(int i) { return (pic.scale.x.T(pts[i].x), pic.scale.y.T(pts[i].y)); },pts.length-1); g.push(cycle); gd=join(...g); } else gd=join(...sequence(new guide(int i) { return (pic.scale.x.T(pts[i].x), pic.scale.y.T(pts[i].y)); },pts.length)); } resultcnt[i]=gd; } } return result; } // Return contour guides for a 2D data array. // z: two-dimensional array of nonoverlapping mesh points // f: two-dimensional array of corresponding f(z) data values // midpoint: optional array containing values of f at cell midpoints // c: array of contour values // join: interpolation operator (e.g. operator -- or operator ..) guide[][] contour(picture pic=currentpicture, pair[][] z, real[][] f, real[][] midpoint=new real[][], real[] c, interpolate join=operator --) { int nx=z.length-1; if(nx == 0) abort("array z must have length >= 2"); int ny=z[0].length-1; if(ny == 0) abort("array z[0] must have length >= 2"); c=sort(c); bool midpoints=midpoint.length > 0; segment segments[][][]=new segment[nx][ny][]; // go over region a rectangle at a time for(int i=0; i < nx; ++i) { pair[] zi=z[i]; pair[] zp=z[i+1]; real[] fi=f[i]; real[] fp=f[i+1]; real[] midpointi; if(midpoints) midpointi=midpoint[i]; segment[][] segmentsi=segments[i]; for(int j=0; j < ny; ++j) { segment[] segmentsij=segmentsi[j]; // define points pair bleft=zi[j]; pair bright=zp[j]; pair tleft=zi[j+1]; pair tright=zp[j+1]; pair middle=0.25*(bleft+bright+tleft+tright); real f00=fi[j]; real f01=fi[j+1]; real f10=fp[j]; real f11=fp[j+1]; real fmm=midpoints ? midpoint[i][j] : 0.25*(f00+f01+f10+f11); // optimization: we make sure we don't work with empty rectangles int checkcell(int cnt) { real C=c[cnt]; real vertdat0=f00-C; // bottom-left vertex real vertdat1=f10-C; // bottom-right vertex real vertdat2=f01-C; // top-left vertex real vertdat3=f11-C; // top-right vertex // optimization: we make sure we don't work with empty rectangles int countm=0; int countz=0; int countp=0; void check(real vertdat) { if(vertdat < -eps) ++countm; else { if(vertdat <= eps) ++countz; else ++countp; } } check(vertdat0); check(vertdat1); check(vertdat2); check(vertdat3); if(countm == 4) return 1; // nothing to do if(countp == 4) return -1; // nothing to do if((countm == 3 || countp == 3) && countz == 1) return 0; // go through the triangles void addseg(segment seg) { if(seg.active) { seg.c=cnt; segmentsij.push(seg); } } real vertdat4=fmm-C; addseg(checktriangle(bright,tright,middle, vertdat1,vertdat3,vertdat4,0)); addseg(checktriangle(tright,tleft,middle, vertdat3,vertdat2,vertdat4,1)); addseg(checktriangle(tleft,bleft,middle, vertdat2,vertdat0,vertdat4,2)); addseg(checktriangle(bleft,bright,middle, vertdat0,vertdat1,vertdat4,3)); return 0; } void process(int l, int u) { if(l >= u) return; int i=quotient(l+u,2); int sign=checkcell(i); if(sign == -1) process(i+1,u); else if(sign == 1) process(l,i); else { process(l,i); process(i+1,u); } } process(0,c.length); } } // set up return value pair[][][] points=new pair[c.length][][]; for(int i=0; i < nx; ++i) { segment[][] segmentsi=segments[i]; for(int j=0; j < ny; ++j) { segment[] segmentsij=segmentsi[j]; for(int k=0; k < segmentsij.length; ++k) { segment C=segmentsij[k]; if(!C.active) continue; pair[] g=new pair[] {C.a,C.b}; segmentsij[k].active=false; int forward(int I, int J, bool first=true) { if(I >= 0 && I < nx && J >= 0 && J < ny) { segment[] segmentsIJ=segments[I][J]; for(int l=0; l < segmentsIJ.length; ++l) { segment D=segmentsIJ[l]; if(!D.active) continue; if(abs(D.a-g[g.length-1]) < eps) { g.push(D.b); segmentsIJ[l].active=false; if(D.edge >= 0 && !first) return D.edge; first=false; l=-1; } else if(abs(D.b-g[g.length-1]) < eps) { g.push(D.a); segmentsIJ[l].active=false; if(D.edge >= 0 && !first) return D.edge; first=false; l=-1; } } } return -1; } int backward(int I, int J, bool first=true) { if(I >= 0 && I < nx && J >= 0 && J < ny) { segment[] segmentsIJ=segments[I][J]; for(int l=0; l < segmentsIJ.length; ++l) { segment D=segmentsIJ[l]; if(!D.active) continue; if(abs(D.a-g[0]) < eps) { g.insert(0,D.b); segmentsIJ[l].active=false; if(D.edge >= 0 && !first) return D.edge; first=false; l=-1; } else if(abs(D.b-g[0]) < eps) { g.insert(0,D.a); segmentsIJ[l].active=false; if(D.edge >= 0 && !first) return D.edge; first=false; l=-1; } } } return -1; } void follow(int f(int, int, bool first=true), int edge) { int I=i; int J=j; while(true) { static int ix[]={1,0,-1,0}; static int iy[]={0,1,0,-1}; if(edge >= 0 && edge < 4) { I += ix[edge]; J += iy[edge]; edge=f(I,J); } else { if(edge == -1) break; if(edge < 9) { int edge0=(edge-5) % 4; int edge1=(edge-4) % 4; int ix0=ix[edge0]; int iy0=iy[edge0]; I += ix0; J += iy0; // Search all 3 corner cells if((edge=f(I,J)) == -1) { I += ix[edge1]; J += iy[edge1]; if((edge=f(I,J)) == -1) { I -= ix0; J -= iy0; edge=f(I,J); } } } else { // Double-vertex edge: search all 8 surrounding cells void search() { for(int i=-1; i <= 1; ++i) { for(int j=-1; j <= 1; ++j) { if((edge=f(I+i,J+j,false)) >= 0) { I += i; J += j; return; } } } } search(); } } } } // Follow contour in cell int edge=forward(i,j,first=false); // Follow contour forward outside of cell follow(forward,edge); // Follow contour backward outside of cell follow(backward,C.edge); points[C.c].push(g); } } } collect(points,c); // Required to join remaining case1 cycles. return connect(pic,points,c,join); } // Return contour guides for a 2D data array on a uniform lattice // f: two-dimensional array of real data values // midpoint: optional array containing data values at cell midpoints // a,b: diagonally opposite vertices of rectangular domain // c: array of contour values // join: interpolation operator (e.g. operator -- or operator ..) guide[][] contour(picture pic=currentpicture, real[][] f, real[][] midpoint=new real[][], pair a, pair b, real[] c, interpolate join=operator --) { int nx=f.length-1; if(nx == 0) abort("array f must have length >= 2"); int ny=f[0].length-1; if(ny == 0) abort("array f[0] must have length >= 2"); pair[][] z=new pair[nx+1][ny+1]; for(int i=0; i <= nx; ++i) { pair[] zi=z[i]; real xi=interp(a.x,b.x,i/nx); for(int j=0; j <= ny; ++j) { zi[j]=(xi,interp(a.y,b.y,j/ny)); } } return contour(pic,z,f,midpoint,c,join); } // return contour guides for a real-valued function // f: real-valued function of two real variables // a,b: diagonally opposite vertices of rectangular domain // c: array of contour values // nx,ny: number of subdivisions in x and y directions (determines accuracy) // join: interpolation operator (e.g. operator -- or operator ..) guide[][] contour(picture pic=currentpicture, real f(real, real), pair a, pair b, real[] c, int nx=ngraph, int ny=nx, interpolate join=operator --) { // evaluate function at points and midpoints real[][] dat=new real[nx+1][ny+1]; real[][] midpoint=new real[nx+1][ny+1]; for(int i=0; i <= nx; ++i) { real x=interp(a.x,b.x,i/nx); real x2=interp(a.x,b.x,(i+0.5)/nx); real[] dati=dat[i]; real[] midpointi=midpoint[i]; for(int j=0; j <= ny; ++j) { dati[j]=f(x,interp(a.y,b.y,j/ny)); midpointi[j]=f(x2,interp(a.y,b.y,(j+0.5)/ny)); } } return contour(pic,dat,midpoint,a,b,c,join); } void draw(picture pic=currentpicture, Label[] L=new Label[], guide[][] g, pen[] p) { begingroup(pic); for(int cnt=0; cnt < g.length; ++cnt) { guide[] gcnt=g[cnt]; pen pcnt=p[cnt]; for(int i=0; i < gcnt.length; ++i) draw(pic,gcnt[i],pcnt); if(L.length > 0) { Label Lcnt=L[cnt]; for(int i=0; i < gcnt.length; ++i) { if(Lcnt.s != "" && size(gcnt[i]) > 1) label(pic,Lcnt,gcnt[i],pcnt); } } } endgroup(pic); } void draw(picture pic=currentpicture, Label[] L=new Label[], guide[][] g, pen p=currentpen) { draw(pic,L,g,sequence(new pen(int) {return p;},g.length)); } // Extend palette by the colors below and above at each end. pen[] extend(pen[] palette, pen below, pen above) { pen[] p=copy(palette); p.insert(0,below); p.push(above); return p; } // Compute the interior palette for a sequence of cyclic contours // corresponding to palette. pen[][] interior(picture pic=currentpicture, guide[][] g, pen[] palette) { if(palette.length != g.length+1) abort("Palette array must have length one more than guide array"); pen[][] fillpalette=new pen[g.length][]; for(int i=0; i < g.length; ++i) { guide[] gi=g[i]; guide[] gp; if(i+1 < g.length) gp=g[i+1]; guide[] gm; if(i > 0) gm=g[i-1]; pen[] fillpalettei=new pen[gi.length]; for(int j=0; j < gi.length; ++j) { path P=gi[j]; if(cyclic(P)) { int index=i+1; bool nextinside; for(int k=0; k < gp.length; ++k) { path next=gp[k]; if(cyclic(next)) { if(inside(P,point(next,0))) nextinside=true; else if(inside(next,point(P,0))) index=i; } } if(!nextinside) { // Check to see if previous contour is inside for(int k=0; k < gm.length; ++k) { path prev=gm[k]; if(cyclic(prev)) { if(inside(P,point(prev,0))) index=i; } } } fillpalettei[j]=palette[index]; } fillpalette[i]=fillpalettei; } } return fillpalette; } // Fill the interior of cyclic contours with palette void fill(picture pic=currentpicture, guide[][] g, pen[][] palette) { for(int i=0; i < g.length; ++i) { guide[] gi=g[i]; guide[] gp; if(i+1 < g.length) gp=g[i+1]; guide[] gm; if(i > 0) gm=g[i-1]; for(int j=0; j < gi.length; ++j) { path P=gi[j]; path[] S=P; if(cyclic(P)) { for(int k=0; k < gp.length; ++k) { path next=gp[k]; if(cyclic(next) && inside(P,point(next,0))) S=S^^next; } for(int k=0; k < gm.length; ++k) { path next=gm[k]; if(cyclic(next) && inside(P,point(next,0))) S=S^^next; } fill(pic,S,palette[i][j]+evenodd); } } } } // routines for irregularly spaced points: // check existing guides and adds new segment to them if possible, // or otherwise store segment as a new guide private void addseg(pair[][] gds, segment seg) { if(!seg.active) return; // search for a path to extend for(int i=0; i < gds.length; ++i) { pair[] gd=gds[i]; if(abs(gd[0]-seg.b) < eps) { gd.insert(0,seg.a); return; } else if(abs(gd[gd.length-1]-seg.b) < eps) { gd.push(seg.a); return; } else if(abs(gd[0]-seg.a) < eps) { gd.insert(0,seg.b); return; } else if(abs(gd[gd.length-1]-seg.a) < eps) { gd.push(seg.b); return; } } // in case nothing is found pair[] segm; segm=new pair[] {seg.a,seg.b}; gds.push(segm); return; } guide[][] contour(picture pic=currentpicture, real f(pair), pair a, pair b, real[] c, int nx=ngraph, int ny=nx, interpolate join=operator --) { return contour(pic,new real(real x, real y) {return f((x,y));},a,b,c,nx,ny,join); } guide[][] contour(picture pic=currentpicture, pair[] z, real[] f, real[] c, interpolate join=operator --) { if(z.length != f.length) abort("z and f arrays have different lengths"); int[][] trn=triangulate(z); // array to store guides found so far pair[][][] points=new pair[c.length][][]; for(int cnt=0; cnt < c.length; ++cnt) { pair[][] pointscnt=points[cnt]; real C=c[cnt]; for(int i=0; i < trn.length; ++i) { int[] trni=trn[i]; int i0=trni[0], i1=trni[1], i2=trni[2]; addseg(pointscnt,checktriangle(z[i0],z[i1],z[i2], f[i0]-C,f[i1]-C,f[i2]-C)); } } collect(points,c); return connect(pic,points,c,join); } asymptote-3.05/base/grid3.asy0000644000000000000000000003251415031566105014633 0ustar rootroot// grid3.asy // Author: Philippe Ivaldi (Grids in 3D) // http://www.piprime.fr/ // Created: 10 janvier 2007 import graph3; struct grid3 { path3 axea,axeb; bounds bds; triple dir; valuetime vt; ticklocate locate; void create(picture pic, path3 axea, path3 axeb, path3 axelevel, real min, real max, position pos, autoscaleT t) { real position=pos.position.x; triple level; if(pos.relative) { position=reltime(axelevel,position); level=point(axelevel,position)-point(axelevel,0); } else { triple v=unit(point(axelevel,1)-point(axelevel,0)); triple zerolevel=dot(-point(axelevel,0),v)*v; level=zerolevel+position*v; } this.axea=shift(level)*axea; this.axeb=shift(level)*axeb; bds=autoscale(min,max,t.scale); locate=ticklocate(min,max,t,bds.min,bds.max, Dir(point(axeb,0)-point(axea,0))); } }; typedef grid3 grid3routine(picture pic); triple X(picture pic) {return (pic.userMax().x,pic.userMin().y,pic.userMin().z);} triple XY(picture pic) {return (pic.userMax().x,pic.userMax().y,pic.userMin().z);} triple Y(picture pic) {return (pic.userMin().x,pic.userMax().y,pic.userMin().z);} triple YZ(picture pic) {return (pic.userMin().x,pic.userMax().y,pic.userMax().z);} triple Z(picture pic) {return (pic.userMin().x,pic.userMin().y,pic.userMax().z);} triple ZX(picture pic) {return (pic.userMax().x,pic.userMin().y,pic.userMax().z);} grid3routine XYgrid(position pos=Relative(0)) { return new grid3(picture pic) { grid3 og; triple m=pic.userMin(); triple M=pic.userMax(); og.create(pic,m--X(pic),Y(pic)--XY(pic),m--Z(pic), m.x,M.x,pos,pic.scale.x); return og; }; }; grid3routine XYgrid=XYgrid(); grid3routine YXgrid(position pos=Relative(0)) { return new grid3(picture pic) { grid3 og; triple m=pic.userMin(); triple M=pic.userMax(); og.create(pic,m--Y(pic),X(pic)--XY(pic),m--Z(pic), m.y,M.y,pos,pic.scale.y); return og; }; }; grid3routine YXgrid=YXgrid(); grid3routine XZgrid(position pos=Relative(0)) { return new grid3(picture pic) { grid3 og; triple m=pic.userMin(); triple M=pic.userMax(); og.create(pic,m--X(pic),Z(pic)--ZX(pic),m--Y(pic), m.x,M.x,pos,pic.scale.x); return og; }; }; grid3routine XZgrid=XZgrid(); grid3routine ZXgrid(position pos=Relative(0)) { return new grid3(picture pic) { grid3 og; triple m=pic.userMin(); triple M=pic.userMax(); og.create(pic,m--Z(pic),X(pic)--ZX(pic),m--Y(pic), m.z,M.z,pos,pic.scale.z); return og; }; }; grid3routine ZXgrid=ZXgrid(); grid3routine YZgrid(position pos=Relative(0)) { return new grid3(picture pic) { grid3 og; triple m=pic.userMin(); triple M=pic.userMax(); og.create(pic,m--Y(pic),Z(pic)--YZ(pic),m--X(pic), m.y,M.y,pos,pic.scale.y); return og; }; }; grid3routine YZgrid=YZgrid(); grid3routine ZYgrid(position pos=Relative(0)) { return new grid3(picture pic) { grid3 og; triple m=pic.userMin(); triple M=pic.userMax(); og.create(pic,m--Z(pic),Y(pic)--YZ(pic),m--X(pic), m.z,M.z,pos,pic.scale.z); return og; }; }; grid3routine ZYgrid=ZYgrid(); typedef grid3routine grid3routines[] ; grid3routines XYXgrid(position pos=Relative(0)) { grid3routines ogs=new grid3routine[] {XYgrid(pos),YXgrid(pos)}; return ogs; }; grid3routines XYXgrid=XYXgrid(); grid3routines YXYgrid(position pos=Relative(0)) {return XYXgrid(pos);}; grid3routines YXYgrid=XYXgrid(); grid3routines ZXZgrid(position pos=Relative(0)) { grid3routines ogs=new grid3routine[] {ZXgrid(pos),XZgrid(pos)}; return ogs; }; grid3routines ZXZgrid=ZXZgrid(); grid3routines XZXgrid(position pos=Relative(0)) {return ZXZgrid(pos);}; grid3routines XZXgrid=XZXgrid(); grid3routines ZYZgrid(position pos=Relative(0)) { grid3routines ogs=new grid3routine[] {ZYgrid(pos),YZgrid(pos)}; return ogs; }; grid3routines ZYZgrid=ZYZgrid(); grid3routines YZYgrid(position pos=Relative(0)) {return ZYZgrid(pos);}; grid3routines YZYgrid=YZYgrid(); grid3routines XY_XZgrid(position posa=Relative(0), position posb=Relative(0)) { grid3routines ogs=new grid3routine[] {XYgrid(posa),XZgrid(posb)}; return ogs; }; grid3routines XY_XZgrid=XY_XZgrid(); grid3routines YX_YZgrid(position posa=Relative(0), position posb=Relative(0)) { grid3routines ogs=new grid3routine[] {YXgrid(posa),YZgrid(posb)}; return ogs; }; grid3routines YX_YZgrid=YX_YZgrid(); grid3routines ZX_ZYgrid(position posa=Relative(0), position posb=Relative(0)) { grid3routines ogs=new grid3routine[] {ZXgrid(posa),ZYgrid(posb)}; return ogs; }; grid3routines ZX_ZYgrid=ZX_ZYgrid(); typedef grid3routines[] grid3routinetype; grid3routinetype XYZgrid(position pos=Relative(0)) { grid3routinetype ogs=new grid3routines[] {YZYgrid(pos),XYXgrid(pos), XZXgrid(pos)}; return ogs; } grid3routinetype XYZgrid=XYZgrid(); grid3routines operator cast(grid3routine gridroutine) { grid3routines og=new grid3routine[] {gridroutine}; return og; } grid3routinetype operator cast(grid3routines gridroutine) { grid3routinetype og=new grid3routines[] {gridroutine}; return og; } grid3routinetype operator cast(grid3routine gridroutine) { grid3routinetype og=(grid3routinetype)(grid3routines) gridroutine; return og; } void grid3(picture pic=currentpicture, grid3routinetype gridroutine=XYZgrid, int N=0, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, pen pGrid=grey, pen pgrid=lightgrey, bool above=false) { for(int j=0; j < gridroutine.length; ++j) { grid3routines gridroutinej=gridroutine[j]; for(int i=0; i < gridroutinej.length; ++i) { grid3 gt=gridroutinej[i](pic); pic.add(new void(picture f, transform3 t, transform3 T, projection P, triple, triple) { picture d; ticks3 ticks=Ticks3(1,F="%",ticklabel=null, beginlabel=false,endlabel=false, N=N,n=n,Step=Step,step=step, begin=begin,end=end, Size=0,size=0,extend=true, pTick=pGrid,ptick=pgrid); ticks(d,t,"",gt.axea,gt.axeb,nullpen,None,NoMargin3,gt.locate, gt.bds.divisor,opposite=true,primary=false,P); add(f,t*T*inverse(t)*d); },above=above); addPath(pic,gt.axea,pGrid); addPath(pic,gt.axeb,pGrid); } } } void grid3(picture pic=currentpicture, grid3routinetype gridroutine, int N=0, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, pen[] pGrid, pen[] pgrid, bool above=false) { if(pGrid.length != gridroutine.length || pgrid.length != gridroutine.length) abort("pen array has different length than grid"); for(int i=0; i < gridroutine.length; ++i) { grid3(pic=pic,gridroutine=gridroutine[i], N=N,n=n,Step=Step,step=step, begin=begin,end=end, pGrid=pGrid[i],pgrid=pgrid[i], above=above); } } position top=Relative(1); position bottom=Relative(0); position middle=Relative(0.5); // Structure used to communicate ticks and axis settings to grid3 routines. struct ticksgridT { ticks3 ticks; // Other arguments of grid3 are define by ticks and axis settings void grid3(picture, bool); }; typedef ticksgridT ticksgrid(); ticksgrid InOutTicks(Label F="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, real Size=0, real size=0, pen pTick=nullpen, pen ptick=nullpen, grid3routinetype gridroutine, pen pGrid=grey, pen pgrid=lightgrey) { return new ticksgridT() { ticksgridT otg; otg.ticks=Ticks3(0,F,ticklabel,beginlabel,endlabel, N,n,Step,step,begin,end, Size,size,false,pTick,ptick); otg.grid3=new void(picture pic, bool above) { grid3(pic,gridroutine,N,n,Step,step,begin,end,pGrid,pgrid,above); }; return otg; }; } ticksgrid InTicks(Label F="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, real Size=0, real size=0, pen pTick=nullpen, pen ptick=nullpen, grid3routinetype gridroutine, pen pGrid=grey, pen pgrid=lightgrey) { return new ticksgridT() { ticksgridT otg; otg.ticks=Ticks3(-1,F,ticklabel,beginlabel,endlabel,N,n,Step,step, begin,end,Size,size,false,pTick,ptick); otg.grid3=new void(picture pic, bool above) { grid3(pic,gridroutine,N,n,Step,step,begin,end,pGrid,pgrid,above); }; return otg; }; } ticksgrid OutTicks(Label F="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, real Size=0, real size=0, pen pTick=nullpen, pen ptick=nullpen, grid3routinetype gridroutine, pen pGrid=grey, pen pgrid=lightgrey) { return new ticksgridT() { ticksgridT otg; otg.ticks=Ticks3(1,F,ticklabel,beginlabel,endlabel,N,n,Step,step, begin,end,Size,size,false,pTick,ptick); otg.grid3=new void(picture pic, bool above) { grid3(pic,gridroutine,N,n,Step,step,begin,end,pGrid,pgrid,above); }; return otg; }; } void xaxis3(picture pic=currentpicture, Label L="", axis axis=YZZero, pen p=currentpen, ticksgrid ticks, arrowbar3 arrow=None, bool above=false) { xaxis3(pic,L,axis,p,ticks().ticks,arrow,above); ticks().grid3(pic,above); } void yaxis3(picture pic=currentpicture, Label L="", axis axis=XZZero, pen p=currentpen, ticksgrid ticks, arrowbar3 arrow=None, bool above=false) { yaxis3(pic,L,axis,p,ticks().ticks,arrow,above); ticks().grid3(pic,above); } void zaxis3(picture pic=currentpicture, Label L="", axis axis=XYZero, pen p=currentpen, ticksgrid ticks, arrowbar3 arrow=None, bool above=false) { zaxis3(pic,L,axis,p,ticks().ticks,arrow,above); ticks().grid3(pic,above); } /* Example: import grid3; size(8cm,0); currentprojection=orthographic(0.5,1,0.5); defaultpen(overwrite(SuppressQuiet)); scale(Linear, Linear, Log); grid3(pic=currentpicture, // picture gridroutine=XYZgrid(// grid3routine // or grid3routine[] (alias grid3routines) // or grid3routines[]: // The routine(s) to draw the grid(s): // *XYgrid: draw grid from X in direction of Y // *YXgrid: draw grid from Y in direction of X, ... // *An array of previous values XYgrid, YXgrid, ... // *XYXgrid: draw XYgrid and YXgrid grids // *YXYgrid: draw XYgrid and YXgrid grids // *ZXZgrid: draw ZXgrid and XZgrid grids // *YX_YZgrid: draw YXgrid and YZgrid grids // *XY_XZgrid: draw XYgrid and XZgrid grids // *YX_YZgrid: draw YXgrid and YZgrid grids // *An array of previous values XYXgrid,... // *XYZgrid: draw XYXgrid, ZYZgrid, XZXgrid grids. pos=Relative(0)), // the position of the grid relative to the axis // perpendicular to the grid; a real number // specifies a coordinate relative to this axis. // Aliases: top=Relative(1), middle=Relative(0.5) // and bottom=Relative(0). // These arguments are similar to those of InOutTicks(): N=0, // int n=0, // int Step=0, // real step=0, // real begin=true, // bool end=true, // bool pGrid=grey, // pen pgrid=lightgrey, // pen above=false // bool ); xaxis3(Label("$x$",position=EndPoint,align=S),OutTicks()); yaxis3(Label("$y$",position=EndPoint,align=S),OutTicks()); zaxis3(Label("$z$",position=EndPoint,align=(0,0.5)+W),OutTicks()); */ /* Other examples: int N=10, n=2; xaxis3(Label("$x$",position=EndPoint,align=S),OutTicks()); yaxis3(Label("$y$",position=EndPoint,align=S),OutTicks(N=N,n=n)); zaxis3(Label("$z$",position=EndPoint,align=(0,0.5)+W),OutTicks()); grid3(N=N,n=n); xaxis3(Label("$x$",position=EndPoint,align=S),OutTicks()); yaxis3(Label("$y$",position=EndPoint,align=S),OutTicks()); zaxis3(Label("$z$",position=EndPoint,align=(0,0.5)+W),OutTicks()); grid3(new grid3routines[] {XYXgrid(top),XZXgrid(0)}); xaxis3(Label("$x$",position=EndPoint,align=S),OutTicks()); yaxis3(Label("$y$",position=EndPoint,align=S),OutTicks()); zaxis3(Label("$z$",position=EndPoint,align=(0,0.5)+W),OutTicks()); grid3(new grid3routines[] {XYXgrid(-0.5),XYXgrid(1.5)}, pGrid=new pen[] {red,blue}, pgrid=new pen[] {0.5red,0.5blue}); // Axes with grids: xaxis3(Label("$x$",position=EndPoint,align=S), OutTicks(Step=0.5,gridroutine=XYgrid)); yaxis3(Label("$y$",position=EndPoint,align=S), InOutTicks(Label("",align=0.5X),N=8,n=2,gridroutine=YX_YZgrid)); zaxis3("$z$",OutTicks(ZYgrid)); */ asymptote-3.05/base/nopapersize.ps0000644000000000000000000000004715031566105016004 0ustar rootroot@ a4size 0in 0in @ letterSize 0in 0in asymptote-3.05/base/fontsize.asy0000644000000000000000000000004315031566105015454 0ustar rootrootif(latex()) usepackage("type1cm"); asymptote-3.05/base/contour3.asy0000644000000000000000000003463515031566105015405 0ustar rootrootimport graph_settings; import three; real eps=10000*realEpsilon; private struct weighted { triple normal; real ratio; int kpa0,kpa1,kpa2; int kpb0,kpb1,kpb2; triple v; } private struct bucket { triple v; triple val; int count; } struct vertex { triple v; triple normal; } // A group of 3 or 4 points. private struct object { bool active; weighted[] pts; } // Return contour vertices for a 3D data array. // z: three-dimensional array of nonoverlapping mesh points // f: three-dimensional arrays of real data values // midpoint: optional array containing estimate of f at midpoint values vertex[][] contour3(triple[][][] v, real[][][] f, real[][][] midpoint=new real[][][], projection P=currentprojection) { int nx=v.length-1; if(nx == 0) abort("array v must have length >= 2"); int ny=v[0].length-1; if(ny == 0) abort("array v[0] must have length >= 2"); int nz=v[0][0].length-1; if(nz == 0) abort("array v[0][0] must have length >= 2"); bool midpoints=midpoint.length > 0; bucket[][][][] kps=new bucket[2nx+1][2ny+1][2nz+1][]; for(int i=0; i < 2nx+1; ++i) for(int j=0; j < 2ny+1; ++j) for(int k=0; k < 2nz+1; ++k) kps[i][j][k]=new bucket[]; object[] objects; // go over region a rectangle at a time for(int i=0; i < nx; ++i) { triple[][] vi=v[i]; triple[][] vp=v[i+1]; real[][] fi=f[i]; real[][] fp=f[i+1]; int i2=2i; int i2p1=i2+1; int i2p2=i2+2; for(int j=0; j < ny; ++j) { triple[] vij=vi[j]; triple[] vpj=vp[j]; triple[] vip=vi[j+1]; triple[] vpp=vp[j+1]; real[] fij=fi[j]; real[] fpj=fp[j]; real[] fip=fi[j+1]; real[] fpp=fp[j+1]; int j2=2j; int j2p1=j2+1; int j2p2=j2+2; for(int k=0; k < nz; ++k) { // vertex values real vdat0=fij[k]; real vdat1=fij[k+1]; real vdat2=fip[k]; real vdat3=fip[k+1]; real vdat4=fpj[k]; real vdat5=fpj[k+1]; real vdat6=fpp[k]; real vdat7=fpp[k+1]; // define points triple p000=vij[k]; triple p001=vij[k+1]; triple p010=vip[k]; triple p011=vip[k+1]; triple p100=vpj[k]; triple p101=vpj[k+1]; triple p110=vpp[k]; triple p111=vpp[k+1]; triple m0=0.25*(p000+p010+p110+p100); triple m1=0.25*(p010+p110+p111+p011); triple m2=0.25*(p110+p100+p101+p111); triple m3=0.25*(p100+p000+p001+p101); triple m4=0.25*(p000+p010+p011+p001); triple m5=0.25*(p001+p011+p111+p101); triple mc=0.5*(m0+m5); // optimization: we make sure we don't work with empty rectangles int countm=0; int countz=0; int countp=0; void check(real vdat) { if(vdat < -eps) ++countm; else { if(vdat <= eps) ++countz; else ++countp; } } check(vdat0); check(vdat1); check(vdat2); check(vdat3); check(vdat4); check(vdat5); check(vdat6); check(vdat7); if(countm == 8 || countp == 8 || ((countm == 7 || countp == 7) && countz == 1)) continue; int k2=2k; int k2p1=k2+1; int k2p2=k2+2; // Evaluate midpoints of cube sides. // Then evaluate midpoint of cube. real vdat8=midpoints ? midpoint[i2p1][j2p1][k2] : 0.25*(vdat0+vdat2+vdat6+vdat4); real vdat9=midpoints ? midpoint[i2p1][j2p2][k2p1] : 0.25*(vdat2+vdat6+vdat7+vdat3); real vdat10=midpoints ? midpoint[i2p2][j2p1][k2p1] : 0.25*(vdat7+vdat6+vdat4+vdat5); real vdat11=midpoints ? midpoint[i2p1][j2][k2p1] : 0.25*(vdat0+vdat4+vdat5+vdat1); real vdat12=midpoints ? midpoint[i2][j2p1][k2p1] : 0.25*(vdat0+vdat2+vdat3+vdat1); real vdat13=midpoints ? midpoint[i2p1][j2p1][k2p2] : 0.25*(vdat1+vdat3+vdat7+vdat5); real vdat14=midpoints ? midpoint[i2p1][j2p1][k2p1] : 0.125*(vdat0+vdat1+vdat2+vdat3+vdat4+vdat5+vdat6+vdat7); // Go through the 24 pyramids, 4 for each side. void addval(int kp0, int kp1, int kp2, triple add, triple v) { bucket[] cur=kps[kp0][kp1][kp2]; for(int q=0; q < cur.length; ++q) { if(length(cur[q].v-v) < eps) { cur[q].val += add; ++cur[q].count; return; } } bucket newbuck; newbuck.v=v; newbuck.val=add; newbuck.count=1; cur.push(newbuck); } void accrue(weighted w) { triple val1=w.normal*w.ratio; triple val2=w.normal*(1-w.ratio); addval(w.kpa0,w.kpa1,w.kpa2,val1,w.v); addval(w.kpb0,w.kpb1,w.kpb2,val2,w.v); } triple dir=P.normal; void addnormals(weighted[] pts) { triple vec2=pts[1].v-pts[0].v; triple vec1=pts[0].v-pts[2].v; triple vec0=-vec2-vec1; vec2=unit(vec2); vec1=unit(vec1); vec0=unit(vec0); triple normal=cross(vec2,vec1); normal *= sgn(dot(normal,dir)); real angle(triple u, triple v) { real Dot=-dot(u,v); return Dot > 1 ? 0 : Dot < -1 ? pi : acos(Dot); } real angle0=angle(vec1,vec2); real angle1=angle(vec2,vec0); pts[0].normal=normal*angle0; pts[1].normal=normal*angle1; pts[2].normal=normal*(pi-angle0-angle1); } void addobj(object obj) { if(!obj.active) return; if(obj.pts.length == 4) { weighted[] points=obj.pts; object obj1; object obj2; obj1.active=true; obj2.active=true; obj1.pts=new weighted[] {points[0],points[1],points[2]}; obj2.pts=new weighted[] {points[1],points[2],points[3]}; addobj(obj1); addobj(obj2); } else { addnormals(obj.pts); for(int q=0; q < obj.pts.length; ++q) accrue(obj.pts[q]); objects.push(obj); } } weighted setupweighted(triple va, triple vb, real da, real db, int[] kpa, int[] kpb) { weighted w; real ratio=abs(da/(db-da)); w.v=interp(va,vb,ratio); w.ratio=ratio; w.kpa0=i2+kpa[0]; w.kpa1=j2+kpa[1]; w.kpa2=k2+kpa[2]; w.kpb0=i2+kpb[0]; w.kpb1=j2+kpb[1]; w.kpb2=k2+kpb[2]; return w; } weighted setupweighted(triple v, int[] kp) { weighted w; w.v=v; w.ratio=0.5; w.kpa0=w.kpb0=i2+kp[0]; w.kpa1=w.kpb1=j2+kp[1]; w.kpa2=w.kpb2=k2+kp[2]; return w; } // Checks if a pyramid contains a contour object. object checkpyr(triple v0, triple v1, triple v2, triple v3, real d0, real d1, real d2, real d3, int[] c0, int[] c1, int[] c2, int[] c3) { object obj; real a0=abs(d0); real a1=abs(d1); real a2=abs(d2); real a3=abs(d3); bool b0=a0 < eps; bool b1=a1 < eps; bool b2=a2 < eps; bool b3=a3 < eps; weighted[] pts; if(b0) pts.push(setupweighted(v0,c0)); if(b1) pts.push(setupweighted(v1,c1)); if(b2) pts.push(setupweighted(v2,c2)); if(b3) pts.push(setupweighted(v3,c3)); if(!b0 && !b1 && abs(d0+d1)+eps < a0+a1) pts.push(setupweighted(v0,v1,d0,d1,c0,c1)); if(!b0 && !b2 && abs(d0+d2)+eps < a0+a2) pts.push(setupweighted(v0,v2,d0,d2,c0,c2)); if(!b0 && !b3 && abs(d0+d3)+eps < a0+a3) pts.push(setupweighted(v0,v3,d0,d3,c0,c3)); if(!b1 && !b2 && abs(d1+d2)+eps < a1+a2) pts.push(setupweighted(v1,v2,d1,d2,c1,c2)); if(!b1 && !b3 && abs(d1+d3)+eps < a1+a3) pts.push(setupweighted(v1,v3,d1,d3,c1,c3)); if(!b2 && !b3 && abs(d2+d3)+eps < a2+a3) pts.push(setupweighted(v2,v3,d2,d3,c2,c3)); int s=pts.length; //There are three or four points. if(s > 2) { obj.active=true; obj.pts=pts; } else obj.active=false; return obj; } void check4pyr(triple v0, triple v1, triple v2, triple v3, triple v4, triple v5, real d0, real d1, real d2, real d3, real d4, real d5, int[] c0, int[] c1, int[] c2, int[] c3, int[] c4, int[] c5) { addobj(checkpyr(v5,v4,v0,v1,d5,d4,d0,d1,c5,c4,c0,c1)); addobj(checkpyr(v5,v4,v1,v2,d5,d4,d1,d2,c5,c4,c1,c2)); addobj(checkpyr(v5,v4,v2,v3,d5,d4,d2,d3,c5,c4,c2,c3)); addobj(checkpyr(v5,v4,v3,v0,d5,d4,d3,d0,c5,c4,c3,c0)); } static int[] pp000={0,0,0}; static int[] pp001={0,0,2}; static int[] pp010={0,2,0}; static int[] pp011={0,2,2}; static int[] pp100={2,0,0}; static int[] pp101={2,0,2}; static int[] pp110={2,2,0}; static int[] pp111={2,2,2}; static int[] pm0={1,1,0}; static int[] pm1={1,2,1}; static int[] pm2={2,1,1}; static int[] pm3={1,0,1}; static int[] pm4={0,1,1}; static int[] pm5={1,1,2}; static int[] pmc={1,1,1}; check4pyr(p000,p010,p110,p100,mc,m0, vdat0,vdat2,vdat6,vdat4,vdat14,vdat8, pp000,pp010,pp110,pp100,pmc,pm0); check4pyr(p010,p110,p111,p011,mc,m1, vdat2,vdat6,vdat7,vdat3,vdat14,vdat9, pp010,pp110,pp111,pp011,pmc,pm1); check4pyr(p110,p100,p101,p111,mc,m2, vdat6,vdat4,vdat5,vdat7,vdat14,vdat10, pp110,pp100,pp101,pp111,pmc,pm2); check4pyr(p100,p000,p001,p101,mc,m3, vdat4,vdat0,vdat1,vdat5,vdat14,vdat11, pp100,pp000,pp001,pp101,pmc,pm3); check4pyr(p000,p010,p011,p001,mc,m4, vdat0,vdat2,vdat3,vdat1,vdat14,vdat12, pp000,pp010,pp011,pp001,pmc,pm4); check4pyr(p001,p011,p111,p101,mc,m5, vdat1,vdat3,vdat7,vdat5,vdat14,vdat13, pp001,pp011,pp111,pp101,pmc,pm5); } } } vertex preparevertex(weighted w) { vertex ret; triple normal=O; bool first=true; bucket[] kp1=kps[w.kpa0][w.kpa1][w.kpa2]; bucket[] kp2=kps[w.kpb0][w.kpb1][w.kpb2]; bool notfound1=true; bool notfound2=true; int count=0; int stop=max(kp1.length,kp2.length); for(int r=0; r < stop; ++r) { if(notfound1) { if(length(w.v-kp1[r].v) < eps) { if(first) { ret.v=kp1[r].v; first=false; } normal += kp1[r].val; count += kp1[r].count; notfound1=false; } } if(notfound2) { if(length(w.v-kp2[r].v) < eps) { if(first) { ret.v=kp2[r].v; first=false; } normal += kp2[r].val; count += kp2[r].count; notfound2=false; } } } ret.normal=normal*2/count; return ret; } // Prepare return value. vertex[][] g; for(int q=0; q < objects.length; ++q) { object p=objects[q]; g.push(new vertex[] {preparevertex(p.pts[0]),preparevertex(p.pts[1]), preparevertex(p.pts[2])}); } return g; } // Return contour vertices for a 3D data array on a uniform lattice. // f: three-dimensional arrays of real data values // midpoint: optional array containing estimate of f at midpoint values // a,b: diagonally opposite points of rectangular parellelpiped domain vertex[][] contour3(real[][][] f, real[][][] midpoint=new real[][][], triple a, triple b, projection P=currentprojection) { int nx=f.length-1; if(nx == 0) abort("array f must have length >= 2"); int ny=f[0].length-1; if(ny == 0) abort("array f[0] must have length >= 2"); int nz=f[0][0].length-1; if(nz == 0) abort("array f[0][0] must have length >= 2"); triple[][][] v=new triple[nx+1][ny+1][nz+1]; for(int i=0; i <= nx; ++i) { real xi=interp(a.x,b.x,i/nx); triple[][] vi=v[i]; for(int j=0; j <= ny; ++j) { triple[] vij=v[i][j]; real yj=interp(a.y,b.y,j/ny); for(int k=0; k <= nz; ++k) { vij[k]=(xi,yj,interp(a.z,b.z,k/nz)); } } } return contour3(v,f,midpoint,P); } // Return contour vertices for a 3D data array, using a pyramid mesh // f: real-valued function of three real variables // a,b: diagonally opposite points of rectangular parellelpiped domain // nx,ny,nz number of subdivisions in x, y, and z directions vertex[][] contour3(real f(real, real, real), triple a, triple b, int nx=nmesh, int ny=nx, int nz=nx, projection P=currentprojection) { // evaluate function at points and midpoints real[][][] dat=new real[nx+1][ny+1][nz+1]; real[][][] midpoint=new real[2nx+2][2ny+2][2nz+1]; for(int i=0; i <= nx; ++i) { real x=interp(a.x,b.x,i/nx); real x2=interp(a.x,b.x,(i+0.5)/nx); real[][] dati=dat[i]; real[][] midpointi2=midpoint[2i]; real[][] midpointi2p1=midpoint[2i+1]; for(int j=0; j <= ny; ++j) { real y=interp(a.y,b.y,j/ny); real y2=interp(a.y,b.y,(j+0.5)/ny); real datij[]=dati[j]; real[] midpointi2p1j2=midpointi2p1[2j]; real[] midpointi2p1j2p1=midpointi2p1[2j+1]; real[] midpointi2j2p1=midpointi2[2j+1]; for(int k=0; k <= nz; ++k) { real z=interp(a.z,b.z,k/nz); real z2=interp(a.z,b.z,(k+0.5)/nz); datij[k]=f(x,y,z); if(i == nx || j == ny || k == nz) continue; int k2p1=2k+1; midpointi2p1j2p1[2k]=f(x2,y2,z); midpointi2p1j2p1[k2p1]=f(x2,y2,z2); midpointi2p1j2[k2p1]=f(x2,y,z2); midpointi2j2p1[k2p1]=f(x,y2,z2); if(i == 0) midpoint[2nx][2j+1][k2p1]=f(b.x,y2,z2); if(j == 0) midpointi2p1[2ny][k2p1]=f(x2,b.y,z2); if(k == 0) midpointi2p1j2p1[2nz]=f(x2,y2,b.z); } } } return contour3(dat,midpoint,a,b,P); } // Construct contour surface for a 3D data array, using a pyramid mesh. surface surface(vertex[][] g) { surface s=surface(g.length); for(int i=0; i < g.length; ++i) { vertex[] cur=g[i]; s.s[i]=patch(cur[0].v--cur[1].v--cur[2].v--cycle); } return s; } asymptote-3.05/base/labelpath3.asy0000644000000000000000000000462315031566105015642 0ustar rootroot// Fit a label to a path3. // Author: Jens Schwaiger import three; private real eps=100*realEpsilon; triple nextnormal(triple p, triple q) { triple nw=p-(dot(p,q)*q); return abs(nw) < 0.0001 ? p : unit(nw); } triple[] firstframe(path3 p, triple optional=O) { triple[] start=new triple[3]; start[0]=dir(p,reltime(p,0)); start[1]=(abs(cross(start[0],optional)) < eps) ? perp(start[0]) : unit(cross(start[0],optional)); start[2]=cross(start[0],start[1]); return start; } // Modification of the bishop frame construction contained in // space_tube.asy (from Philippe Ivaldi's modules). // For noncyclic path3s only triple[] nextframe(path3 p, real reltimestart, triple[] start, real reltimeend, int subdiv=20) { triple[][] bf=new triple[subdiv+1][3]; real lg=reltimeend-reltimestart; if(lg <= 0) return start; bf[0]=start; int n=subdiv+1; for(int i=1; i < n; ++i) bf[i][0]=dir(p,reltime(p,reltimestart+(i/subdiv)*lg)); for(int i=1; i < n; ++i) { bf[i][1]=nextnormal(bf[i-1][1],bf[i][0]); bf[i][2]=cross(bf[i][0],bf[i][1]); } return bf[subdiv]; } surface labelpath(string s, path3 p, real angle=90, triple optional=O) { real Cos=Cos(angle); real Sin=Sin(angle); path[] text=texpath(Label(s,(0,0),Align,basealign)); text=scale(1/(max(text).x-min(text).x))*text; path[][] decompose=containmentTree(text); real[][] xpos=new real[decompose.length][2]; surface sf; for(int i=0; i < decompose.length; ++i) {// Identify positions along x-axis xpos[i][1]=i; real pos0=0.5(max(decompose[i]).x+min(decompose[i]).x); xpos[i][0]=pos0; } xpos=sort(xpos); // sort by distance from 0; triple[] pos=new triple[decompose.length]; real lg=arclength(p); //create frames; triple[] first=firstframe(p,optional); triple[] t0=first; real tm0=0; triple[][] bfr=new triple[decompose.length][3]; for(int j=0; j < decompose.length; ++j) { bfr[j]=nextframe(p,tm0,t0,xpos[j][0]); tm0=xpos[j][0]; t0=bfr[j]; } transform3[] mt=new transform3[bfr.length]; for(int j=0; j < bfr.length; ++j) { triple f2=Cos*bfr[j][1]+Sin*bfr[j][2]; triple f3=Sin*bfr[j][1]+Cos*bfr[j][2]; mt[j]=shift(relpoint(p,xpos[j][0]))*transform3(bfr[j][0],f2,f3); } for(int j=0; j < bfr.length; ++j) { path[] dc=decompose[(int) xpos[j][1]]; pair pos0=(0.5(max(dc).x+min(dc).x),0); sf.append(mt[j]*surface(scale(lg)*shift(-pos0)*dc)); } return sf; } asymptote-3.05/base/plain_strings.asy0000644000000000000000000001401715031566105016475 0ustar rootrootstring defaultformat(int n, string trailingzero="", bool fixed=false, bool signed=true) { return "$%"+trailingzero+"."+string(n)+(fixed ? "f" : "g")+"$"; } string defaultformat=defaultformat(4); string defaultseparator="\!\times\!"; string ask(string prompt) { write(stdout,prompt); return stdin; } string getstring(string name="", string default="", string prompt="", bool store=true) { string[] history=history(name,1); if(history.length > 0) default=history[0]; if(prompt == "") prompt=name+"? [%s] "; prompt=replace(prompt,new string[][] {{"%s",default}}); string s=readline(prompt,name); if(s == "") s=default; else saveline(name,s,store); return s; } int getint(string name="", int default=0, string prompt="", bool store=true) { return (int) getstring(name,(string) default,prompt,store); } real getreal(string name="", real default=0, string prompt="", bool store=true) { return (real) getstring(name,(string) default,prompt,store); } pair getpair(string name="", pair default=0, string prompt="", bool store=true) { return (pair) getstring(name,(string) default,prompt,store); } triple gettriple(string name="", triple default=(0,0,0), string prompt="", bool store=true) { return (triple) getstring(name,(string) default,prompt,store); } // returns a string with all occurrences of string 'before' in string 's' // changed to string 'after'. string replace(string s, string before, string after) { return replace(s,new string[][] {{before,after}}); } // Like texify but don't convert embedded TeX commands: \${} string TeXify(string s) { static string[][] t={{"&","\&"},{"%","\%"},{"_","\_"},{"#","\#"},{"<","$<$"}, {">","$>$"},{"|","$|$"},{"^","$\hat{\ }$"}, {"~","$\tilde{\ }$"},{" ","\phantom{ }"}}; return replace(s,t); } private string[][] trans1={{'\\',"\backslash "}, {"$","\$"},{"{","\{"},{"}","\}"}}; private string[][] trans2={{"\backslash ","$\backslash$"}}; // Convert string to TeX string texify(string s) { return TeXify(replace(replace(s,trans1),trans2)); } // Convert string to TeX, preserving newlines string verbatim(string s) { bool space=substr(s,0,1) == '\n'; static string[][] t={{'\n',"\\"}}; t.append(trans1); s=TeXify(replace(replace(s,t),trans2)); return space ? "\ "+s : s; } // Split a string into an array of substrings delimited by delimiter // If delimiter is an empty string, use space delimiter but discard empty // substrings. TODO: Move to C++ code. string[] split(string s, string delimiter="") { bool prune=false; if(delimiter == "") { prune=true; delimiter=" "; } string[] S; int last=0; int i; int N=length(delimiter); int n=length(s); while((i=find(s,delimiter,last)) >= 0) { if(i > last || (i == last && !prune)) S.push(substr(s,last,i-last)); last=i+N; } if(n > last || (n == last && !prune)) S.push(substr(s,last,n-last)); return S; } // Returns an array of strings obtained by splitting s into individual // characters. TODO: Move to C++ code. string[] array(string s) { int len=length(s); string[] S=new string[len]; for(int i=0; i < len; ++i) S[i]=substr(s,i,1); return S; } // Concatenate an array of strings into a single string. // TODO: Move to C++ code. string operator +(...string[] a) { string S; for(string s : a) S += s; return S; } int system(string s) { return system(split(s)); } int[] operator ecast(string[] a) { return sequence(new int(int i) {return (int) a[i];},a.length); } real[] operator ecast(string[] a) { return sequence(new real(int i) {return (real) a[i];},a.length); } // Read contents of file as a string. string file(string s) { file f=input(s); string s; while(!eof(f)) { s += f+'\n'; } return s; } string italic(string s) { return s != "" ? "{\it "+s+"}" : s; } string baseline(string s, string template="\strut") { return s != "" && settings.tex != "none" ? "\vphantom{"+template+"}"+s : s; } string math(string s) { return s != "" ? "$"+s+"$" : s; } private void notimplemented(string text) { abort(text+" is not implemented for the '"+settings.tex+"' TeX engine"); } string jobname(string name) { int pos=rfind(name,"-"); return pos >= 0 ? "\ASYprefix\jobname"+substr(name,pos) : name; } string graphic(string name, string options="") { if(latex()) { if(options != "") options="["+options+"]"; string includegraphics="\includegraphics"+options; return includegraphics+"{"+(settings.inlinetex ? jobname(name) : name)+"}"; } if(settings.tex != "context") notimplemented("graphic"); return "\externalfigure["+name+"]["+options+"]"; } string graphicscale(real x) { return string(settings.tex == "context" ? 1000*x : x); } string minipage(string s, real width=100bp) { if(latex()) return "\begin{minipage}{"+(string) (width/pt)+"pt}"+s+"\end{minipage}"; if(settings.tex != "context") notimplemented("minipage"); return "\startframedtext[none][frame=off,width="+(string) (width/pt)+ "pt]"+s+"\stopframedtext"; } void usepackage(string s, string options="") { if(!latex()) notimplemented("usepackage"); string usepackage="\usepackage"; if(options != "") usepackage += "["+options+"]"; texpreamble(usepackage+"{"+s+"}"); } void pause(string w="Hit enter to continue") { write(w); w=stdin; } string format(string format=defaultformat, bool forcemath=false, real x, string locale="") { return format(format,forcemath,defaultseparator,x,locale); } string phantom(string s) { return settings.tex != "none" ? "\phantom{"+s+"}" : ""; } string[] spinner=new string[] {'|','/','-','\\'}; spinner.cyclic=true; void progress(bool3 init=default) { static int count=-1; static int lastseconds=-1; if(init == true) { lastseconds=0; write(stdout,' ',flush); } else if(init == default) { int seconds=seconds(); if(seconds > lastseconds) { lastseconds=seconds; write(stdout,'\b'+spinner[++count],flush); } } else write(stdout,'\b',flush); } restricted int ocgindex=0; asymptote-3.05/base/math.asy0000644000000000000000000002556215031566105014561 0ustar rootroot// Asymptote mathematics routines int quadrant(real degrees) { return floor(degrees/90) % 4; } // Roots of unity. pair unityroot(int n, int k=1) { return expi(2pi*k/n); } real csc(real x) {return 1/sin(x);} real sec(real x) {return 1/cos(x);} real cot(real x) {return tan(pi/2-x);} real acsc(real x) {return asin(1/x);} real asec(real x) {return acos(1/x);} real acot(real x) {return pi/2-atan(x);} real frac(real x) {return x-(int)x;} pair exp(explicit pair z) {return exp(z.x)*expi(z.y);} pair log(explicit pair z) {return log(abs(z))+I*angle(z);} // Return an Nx by Ny unit square lattice with lower-left corner at (0,0). picture grid(int Nx, int Ny, pen p=currentpen) { picture pic; for(int i=0; i <= Nx; ++i) draw(pic,(i,0)--(i,Ny),p); for(int j=0; j <= Ny; ++j) draw(pic,(0,j)--(Nx,j),p); return pic; } bool polygon(path p) { return cyclic(p) && piecewisestraight(p); } // Return the intersection time of the point on the line through p and q // that is closest to z. real intersect(pair p, pair q, pair z) { pair u=q-p; real denom=dot(u,u); return denom == 0 ? infinity : dot(z-p,u)/denom; } // Return the intersection time of the extension of the line segment PQ // with the plane perpendicular to n and passing through Z. real intersect(triple P, triple Q, triple n, triple Z) { real d=n.x*Z.x+n.y*Z.y+n.z*Z.z; real denom=n.x*(Q.x-P.x)+n.y*(Q.y-P.y)+n.z*(Q.z-P.z); return denom == 0 ? infinity : (d-n.x*P.x-n.y*P.y-n.z*P.z)/denom; } // Return any point on the intersection of the two planes with normals // n0 and n1 passing through points P0 and P1, respectively. // If the planes are parallel return (infinity,infinity,infinity). triple intersectionpoint(triple n0, triple P0, triple n1, triple P1) { real Dx=n0.y*n1.z-n1.y*n0.z; real Dy=n0.z*n1.x-n1.z*n0.x; real Dz=n0.x*n1.y-n1.x*n0.y; if(abs(Dx) > abs(Dy) && abs(Dx) > abs(Dz)) { Dx=1/Dx; real d0=n0.y*P0.y+n0.z*P0.z; real d1=n1.y*P1.y+n1.z*P1.z+n1.x*(P1.x-P0.x); real y=(d0*n1.z-d1*n0.z)*Dx; real z=(d1*n0.y-d0*n1.y)*Dx; return (P0.x,y,z); } else if(abs(Dy) > abs(Dz)) { Dy=1/Dy; real d0=n0.z*P0.z+n0.x*P0.x; real d1=n1.z*P1.z+n1.x*P1.x+n1.y*(P1.y-P0.y); real z=(d0*n1.x-d1*n0.x)*Dy; real x=(d1*n0.z-d0*n1.z)*Dy; return (x,P0.y,z); } else { if(Dz == 0) return (infinity,infinity,infinity); Dz=1/Dz; real d0=n0.x*P0.x+n0.y*P0.y; real d1=n1.x*P1.x+n1.y*P1.y+n1.z*(P1.z-P0.z); real x=(d0*n1.y-d1*n0.y)*Dz; real y=(d1*n0.x-d0*n1.x)*Dz; return (x,y,P0.z); } } // Given a real array a, return its partial sums. real[] partialsum(real[] a) { real[] b=new real[a.length]; real sum=0; for(int i=0; i < a.length; ++i) { sum += a[i]; b[i]=sum; } return b; } // Given a real array a, return its partial dx-weighted sums. real[] partialsum(real[] a, real[] dx) { real[] b=new real[a.length]; real sum=0; for(int i=0; i < a.length; ++i) { sum += a[i]*dx[i]; b[i]=sum; } return b; } // Given an integer array a, return its partial sums. int[] partialsum(int[] a) { int[] b=new int[a.length]; int sum=0; for(int i=0; i < a.length; ++i) { sum += a[i]; b[i]=sum; } return b; } // Given an integer array a, return its partial dx-weighted sums. int[] partialsum(int[] a, int[] dx) { int[] b=new int[a.length]; int sum=0; for(int i=0; i < a.length; ++i) { sum += a[i]*dx[i]; b[i]=sum; } return b; } // If strict=false, return whether i > j implies a[i] >= a[j] // If strict=true, return whether i > j implies a[i] > a[j] bool increasing(real[] a, bool strict=false) { real[] ap=copy(a); ap.delete(0); ap.push(0); bool[] b=strict ? (ap > a) : (ap >= a); b[a.length-1]=true; return all(b); } // Return the first and last indices of consecutive true-element segments // of bool[] b. int[][] segmentlimits(bool[] b) { int[][] segment; bool[] n=copy(b); n.delete(0); n.push(!b[b.length-1]); int[] edge=(b != n) ? sequence(1,b.length) : null; edge.insert(0,0); int stop=edge[0]; for(int i=1; i < edge.length; ++i) { int start=stop; stop=edge[i]; if(b[start]) segment.push(new int[] {start,stop-1}); } return segment; } // Return the indices of consecutive true-element segments of bool[] b. int[][] segment(bool[] b) { int[][] S=segmentlimits(b); return sequence(new int[](int i) { return sequence(S[i][0],S[i][1]); },S.length); } // If the sorted array a does not contain x, insert it sequentially, // returning the index of x in the resulting array. int unique(real[] a, real x) { int i=search(a,x); if(i == -1 || x != a[i]) { ++i; a.insert(i,x); } return i; } int unique(string[] a, string x) { int i=search(a,x); if(i == -1 || x != a[i]) { ++i; a.insert(i,x); } return i; } bool lexorder(pair a, pair b) { return a.x < b.x || (a.x == b.x && a.y < b.y); } bool lexorder(triple a, triple b) { return a.x < b.x || (a.x == b.x && (a.y < b.y || (a.y == b.y && a.z < b.z))); } real[] zero(int n) { return sequence(new real(int) {return 0;},n); } real[][] zero(int n, int m) { real[][] M=new real[n][]; for(int i=0; i < n; ++i) M[i]=sequence(new real(int) {return 0;},m); return M; } bool square(real[][] m) { int n=m.length; for(int i=0; i < n; ++i) if(m[i].length != n) return false; return true; } bool rectangular(real[][] m) { int n=m.length; if(n > 0) { int m0=m[0].length; for(int i=1; i < n; ++i) if(m[i].length != m0) return false; } return true; } bool rectangular(pair[][] m) { int n=m.length; if(n > 0) { int m0=m[0].length; for(int i=1; i < n; ++i) if(m[i].length != m0) return false; } return true; } bool rectangular(triple[][] m) { int n=m.length; if(n > 0) { int m0=m[0].length; for(int i=1; i < n; ++i) if(m[i].length != m0) return false; } return true; } // draw the (infinite) line going through P and Q, without altering the // size of picture pic. void drawline(picture pic=currentpicture, pair P, pair Q, pen p=currentpen) { pic.add(new void (frame f, transform t, transform T, pair m, pair M) { // Reduce the bounds by the size of the pen. m -= min(p); M -= max(p); // Calculate the points and direction vector in the transformed space. t=t*T; pair z=t*P; pair v=t*Q-z; // Handle horizontal and vertical lines. if(v.x == 0) { if(m.x <= z.x && z.x <= M.x) draw(f,(z.x,m.y)--(z.x,M.y),p); } else if(v.y == 0) { if(m.y <= z.y && z.y <= M.y) draw(f,(m.x,z.y)--(M.x,z.y),p); } else { // Calculate the maximum and minimum t values allowed for the // parametric equation z + t*v real mx=(m.x-z.x)/v.x, Mx=(M.x-z.x)/v.x; real my=(m.y-z.y)/v.y, My=(M.y-z.y)/v.y; real tmin=max(v.x > 0 ? mx : Mx, v.y > 0 ? my : My); real tmax=min(v.x > 0 ? Mx : mx, v.y > 0 ? My : my); if(tmin <= tmax) draw(f,z+tmin*v--z+tmax*v,p); } },true); } real interpolate(real[] x, real[] y, real x0, int i) { int n=x.length; if(n == 0) abort("Zero data points in interpolate"); if(n == 1) return y[0]; if(i < 0) { real dx=x[1]-x[0]; return y[0]+(y[1]-y[0])/dx*(x0-x[0]); } if(i >= n-1) { real dx=x[n-1]-x[n-2]; return y[n-1]+(y[n-1]-y[n-2])/dx*(x0-x[n-1]); } real D=x[i+1]-x[i]; real B=(x0-x[i])/D; real A=1.0-B; return A*y[i]+B*y[i+1]; } // Linearly interpolate data points (x,y) to (x0,y0), where the elements of // real[] x are listed in ascending order and return y0. Values outside the // available data range are linearly extrapolated using the first derivative // at the nearest endpoint. real interpolate(real[] x, real[] y, real x0) { return interpolate(x,y,x0,search(x,x0)); } private string nopoint="point not found"; // Return the nth intersection time of path g with the vertical line through x. real time(path g, real x, int n=0, real fuzz=-1) { real[] t=times(g,x,fuzz); if(t.length <= n) abort(nopoint); return t[n]; } // Return the nth intersection time of path g with the horizontal line through // (0,z.y). real time(path g, explicit pair z, int n=0, real fuzz=-1) { real[] t=times(g,z,fuzz); if(t.length <= n) abort(nopoint); return t[n]; } // Return the nth y value of g at x. real value(path g, real x, int n=0, real fuzz=-1) { return point(g,time(g,x,n,fuzz)).y; } // Return the nth x value of g at y=z.y. real value(path g, explicit pair z, int n=0, real fuzz=-1) { return point(g,time(g,(0,z.y),n,fuzz)).x; } // Return the nth slope of g at x. real slope(path g, real x, int n=0, real fuzz=-1) { pair a=dir(g,time(g,x,n,fuzz)); return a.y/a.x; } // Return the nth slope of g at y=z.y. real slope(path g, explicit pair z, int n=0, real fuzz=-1) { pair a=dir(g,time(g,(0,z.y),n,fuzz)); return a.y/a.x; } // A quartic complex root solver based on these references: // http://planetmath.org/encyclopedia/GaloisTheoreticDerivationOfTheQuarticFormula.html // Neumark, S., Solution of Cubic and Quartic Equations, Pergamon Press // Oxford (1965). pair[] quarticroots(real a, real b, real c, real d, real e) { real Fuzz=100000*realEpsilon; // Remove roots at numerical infinity. if(abs(a) <= Fuzz*(abs(b)+Fuzz*(abs(c)+Fuzz*(abs(d)+Fuzz*abs(e))))) return cubicroots(b,c,d,e); // Detect roots at numerical zero. if(abs(e) <= Fuzz*(abs(d)+Fuzz*(abs(c)+Fuzz*(abs(b)+Fuzz*abs(a))))) return cubicroots(a,b,c,d); real ainv=1/a; b *= ainv; c *= ainv; d *= ainv; e *= ainv; pair[] roots; real[] T=cubicroots(1,-2c,c^2+b*d-4e,d^2+b^2*e-b*c*d); if(T.length == 0) return roots; real t0=T[0]; pair[] sum=quadraticroots((1,0),(b,0),(t0,0)); pair[] product=quadraticroots((1,0),(t0-c,0),(e,0)); if(abs(sum[0]*product[0]+sum[1]*product[1]+d) < abs(sum[0]*product[1]+sum[1]*product[0]+d)) product=reverse(product); for(int i=0; i < 2; ++i) roots.append(quadraticroots((1,0),-sum[i],product[i])); return roots; } pair[][] fft(pair[][] a, int sign=1) { pair[][] A=new pair[a.length][]; int k=0; for(pair[] v : a) { A[k]=fft(v,sign); ++k; } a=transpose(A); k=0; for(pair[] v : a) { A[k]=fft(v,sign); ++k; } return transpose(A); } // Given a matrix A with independent columns, return // the unique vector y minimizing |Ay - b|^2 (the L2 norm). // If the columns of A are not linearly independent, // throw an error (if warn == true) or return an empty array // (if warn == false). real[] leastsquares(real[][] A, real[] b, bool warn=true) { real[] solution=solve(AtA(A),b*A,warn=false); if (solution.length == 0 && warn) abort("Cannot compute least-squares approximation for " + "a matrix with linearly dependent columns."); return solution; } // Namespace struct rootfinder_settings { static real roottolerance=1e-4; } real findroot(real f(real), real a, real b, real tolerance=rootfinder_settings.roottolerance, real fa=f(a), real fb=f(b)) { return _findroot(f,a,b,tolerance,fa,fb); } asymptote-3.05/base/plain_boxes.asy0000644000000000000000000000774015031566105016131 0ustar rootrootvoid fillbox(frame dest, path g, pen p=currentpen, filltype filltype=NoFill, bool above=true) { if(above == false) { frame F; filltype.fill(F,g,p); prepend(dest,F); } else filltype.fill(dest,g,p); } // Draw and/or fill a box on frame dest using the dimensions of frame src. path box(frame dest, frame src=dest, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill, bool above=true) { pair z=(xmargin,ymargin); int sign=filltype == NoFill ? 1 : -1; pair h=0.5*sign*(max(p)-min(p)); path g=box(min(src)-h-z,max(src)+h+z); fillbox(dest,g,p,filltype,above); return g; } path roundbox(frame dest, frame src=dest, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill, bool above=true) { pair m=min(src); pair M=max(src); pair bound=M-m; real a=bound.x+2*xmargin; real b=bound.y+2*ymargin; real ds=0; real dw=min(a,b)*0.3; path g=shift(m-(xmargin,ymargin))*((0,dw)--(0,b-dw){up}..{right} (dw,b)--(a-dw,b){right}..{down} (a,b-dw)--(a,dw){down}..{left} (a-dw,0)--(dw,0){left}..{up}cycle); fillbox(dest,g,p,filltype,above); return g; } path ellipse(frame dest, frame src=dest, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill, bool above=true) { pair m=min(src); pair M=max(src); pair D=M-m; static real factor=0.5*sqrt(2); int sign=filltype == NoFill ? 1 : -1; pair h=0.5*sign*(max(p)-min(p)); path g=ellipse(0.5*(M+m),factor*D.x+h.x+xmargin,factor*D.y+h.y+ymargin); fillbox(dest,g,p,filltype,above); return g; } path box(frame f, Label L, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill, bool above=true) { add(f,L); return box(f,xmargin,ymargin,p,filltype,above); } path roundbox(frame f, Label L, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill, bool above=true) { add(f,L); return roundbox(f,xmargin,ymargin,p,filltype,above); } path ellipse(frame f, Label L, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill, bool above=true) { add(f,L); return ellipse(f,xmargin,ymargin,p,filltype,above); } using envelope=path(frame dest, frame src=dest, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill, bool above=true); object object(Label L, envelope e, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill, bool above=true) { object F; F.L=L.copy(); Label L0=L.copy(); L0.position(0); L0.p(p); add(F.f,L0); F.g=e(F.f,xmargin,ymargin,p,filltype,above); return F; } object draw(picture pic=currentpicture, Label L, envelope e, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill, bool above=true) { object F=object(L,e,xmargin,ymargin,p,filltype,above); pic.add(new void (frame f, transform t) { frame d; add(d,t,F.L); e(f,d,xmargin,ymargin,p,filltype,above); add(f,d); },true); pic.addBox(L.position,L.position,min(F.f),max(F.f)); return F; } object draw(picture pic=currentpicture, Label L, envelope e, pair position, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill, bool above=true) { return draw(pic,Label(L,position),e,xmargin,ymargin,p,filltype,above); } pair point(object F, pair dir, transform t=identity()) { pair m=min(F.g); pair M=max(F.g); pair c=0.5*(m+M); pair z=t*F.L.position; real[] T=intersect(F.g,c--2*(m+realmult(rectify(dir),M-m))-c); if(T.length == 0) return z; return z+point(F.g,T[0]); } frame bbox(picture pic=currentpicture, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill) { real penwidth=linewidth(p); frame f=pic.fit(max(pic.xsize-2*(xmargin+penwidth),0), max(pic.ysize-2*(ymargin+penwidth),0)); box(f,xmargin,ymargin,p,filltype,above=false); return f; } asymptote-3.05/base/interpolate.asy0000644000000000000000000000754015031566105016152 0ustar rootroot// Lagrange and Hermite interpolation in Asymptote // Author: Olivier Guibé // Acknowledgements: Philippe Ivaldi // diffdiv(x,y) computes Newton's Divided Difference for // Lagrange interpolation with distinct values {x_0,..,x_n} in the array x // and values y_0,...,y_n in the array y, // hdiffdiv(x,y,dyp) computes Newton's Divided Difference for // Hermite interpolation where dyp={dy_0,...,dy_n}. // // fhorner(x,coeff) uses Horner's rule to compute the polynomial // a_0+a_1(x-x_0)+a_2(x-x_0)(x-x_1)+...+a_n(x-x_0)..(x-x_{n-1}), // where coeff={a_0,a_1,...,a_n}. // fspline does standard cubic spline interpolation of a function f // on the interval [a,b]. // The points a=x_1 < x_2 < .. < x_n=b form the array x; // the points y_1=f(x_1),....,y_n=f(x_n) form the array y // We use the Hermite form for the spline. // The syntax is: // s=fspline(x,y); default not_a_knot condition // s=fspline(x,y,natural); natural spline // s=fspline(x,y,periodic); periodic spline // s=fspline(x,y,clamped(1,1)); clamped spline // s=fspline(x,y,monotonic); piecewise monotonic spline // Here s is a real function that is constant on (-infinity,a] and [b,infinity). private import math; import graph_splinetype; typedef real fhorner(real); struct horner { // x={x0,..,xn}(not necessarily distinct) // a={a0,..,an} corresponds to the polyonmial // a_0+a_1(x-x_0)+a_2(x-x_0)(x-x_1)+...+a_n(x-x_0)..(x-x_{n-1}), real[] x; real[] a; } // Evaluate p(x)=d0+(x-x0)(d1+(x-x1)+...+(d(n-1)+(x-x(n-1))*dn))) // via Horner's rule: n-1 multiplications, 2n-2 additions. fhorner fhorner(horner sh) { int n=sh.x.length; checklengths(n,sh.a.length); return new real(real x) { real s=sh.a[n-1]; for(int k=n-2; k >= 0; --k) s=sh.a[k]+(x-sh.x[k])*s; return s; }; } // Newton's Divided Difference method: n(n-1)/2 divisions, n(n-1) additions. horner diffdiv(real[] x, real[] y) { int n=x.length; horner s; checklengths(n,y.length); for(int i=0; i < n; ++i) s.a[i]=y[i]; for(int k=0; k < n-1; ++k) { for(int i=n-1; i > k; --i) { s.a[i]=(s.a[i]-s.a[i-1])/(x[i]-x[i-k-1]); } } s.x=x; return s; } // Newton's Divided Difference for simple Hermite interpolation, // where one specifies both p(x_i) and p'(x_i). horner hdiffdiv(real[] x, real[] y, real[] dy) { int n=x.length; horner s; checklengths(n,y.length); checklengths(n,dy.length); for(int i=0; i < n; ++i) { s.a[2*i]=y[i]; s.a[2*i+1]=dy[i]; s.x[2*i]=x[i]; s.x[2*i+1]=x[i]; } for(int i=n-1; i > 0; --i) s.a[2*i]=(s.a[2*i]-s.a[2*i-2])/(x[i]-x[i-1]); int stop=2*n-1; for(int k=1; k < stop; ++k) { for(int i=stop; i > k; --i) { s.a[i]=(s.a[i]-s.a[i-1])/(s.x[i]-s.x[i-k-1]); } } return s; } typedef real realfunction(real); // piecewise Hermite interpolation: // return the piecewise polynomial p(x), where on [x_i,x_i+1], deg(p) <= 3, // p(x_i)=y_i, p(x_{i+1})=y_i+1, p'(x_i)=dy_i, and p'(x_{i+1})=dy_i+1. // Outside [x_1,x_n] the returned function is constant: y_1 on (infinity,x_1] // and y_n on [x_n,infinity). realfunction pwhermite(real[] x, real[] y, real[] dy) { int n=x.length; checklengths(n,y.length); checklengths(n,dy.length); if(n < 2) abort(morepoints); if(!increasing(x,strict=true)) abort("array x is not strictly increasing"); return new real(real t) { int i=search(x,t); if(i == n-1) { i=n-2; t=x[n-1]; } else if(i == -1) { i=0; t=x[0]; } real h=x[i+1]-x[i]; real delta=(y[i+1]-y[i])/h; real e=(3*delta-2*dy[i]-dy[i+1])/h; real f=(dy[i]-2*delta+dy[i+1])/h^2; real s=t-x[i]; return y[i]+s*(dy[i]+s*(e+s*f)); }; } realfunction fspline(real[] x, real[] y, splinetype splinetype=notaknot) { real[] dy=splinetype(x,y); return new real(real t) { return pwhermite(x,y,dy)(t); }; } asymptote-3.05/base/stats.asy0000644000000000000000000001751615031566105014766 0ustar rootrootprivate import graph; real legendmarkersize=2mm; real mean(real A[]) { return sum(A)/A.length; } // unbiased estimate real variance(real A[]) { return sum((A-mean(A))^2)/(A.length-1); } real variancebiased(real A[]) { return sum((A-mean(A))^2)/A.length; } // unbiased estimate real stdev(real A[]) { return sqrt(variance(A)); } real rms(real A[]) { return sqrt(sum(A^2)/A.length); } real skewness(real A[]) { real[] diff=A-mean(A); return sum(diff^3)/sqrt(sum(diff^2)^3/A.length); } real kurtosis(real A[]) { real[] diff=A-mean(A); return sum(diff^4)/sum(diff^2)^2*A.length; } real kurtosisexcess(real A[]) { return kurtosis(A)-3; } real Gaussian(real x, real sigma) { static real sqrt2pi=sqrt(2pi); return exp(-0.5*(x/sigma)^2)/(sigma*sqrt2pi); } real Gaussian(real x) { static real invsqrt2pi=1/sqrt(2pi); return exp(-0.5*x^2)*invsqrt2pi; } // Return frequency count of data in [bins[i],bins[i+1]) for i=0,...,n-1. int[] frequency(real[] data, real[] bins) { int n=bins.length-1; int[] freq=new int[n]; for(int i=0; i < n; ++i) freq[i]=sum(bins[i] <= data & data < bins[i+1]); return freq; } // Return frequency count in n uniform bins from a to b // (faster than the above more general algorithm). int[] frequency(real[] data, real a, real b, int n) { int[] freq=sequence(new int(int x) {return 0;},n); real h=n/(b-a); for(int i=0; i < data.length; ++i) { int I=Floor((data[i]-a)*h); if(I >= 0 && I < n) ++freq[I]; } return freq; } // Return frequency count in [xbins[i],xbins[i+1]) and [ybins[j],ybins[j+1]). int[][] frequency(real[] x, real[] y, real[] xbins, real[] ybins) { int n=xbins.length-1; int m=ybins.length-1; int[][] freq=new int[n][m]; bool[][] inybin=new bool[m][y.length]; for(int j=0; j < m; ++j) inybin[j]=ybins[j] <= y & y < ybins[j+1]; for(int i=0; i < n; ++i) { bool[] inxbini=xbins[i] <= x & x < xbins[i+1]; int[] freqi=freq[i]; for(int j=0; j < m; ++j) freqi[j]=sum(inxbini & inybin[j]); } return freq; } // Return frequency count in nx by ny uniform bins in box(a,b). int[][] frequency(real[] x, real[] y, pair a, pair b, int nx, int ny=nx) { int[][] freq=new int[nx][]; for(int i=0; i < nx; ++i) freq[i]=sequence(new int(int x) {return 0;},ny); real hx=nx/(b.x-a.x); real hy=ny/(b.y-a.y); real ax=a.x; real ay=a.y; for(int i=0; i < x.length; ++i) { int I=Floor((x[i]-ax)*hx); int J=Floor((y[i]-ay)*hy); if(I >= 0 && I <= nx && J >= 0 && J <= ny) ++freq[I][J]; } return freq; } int[][] frequency(pair[] z, pair a, pair b, int nx, int ny=nx) { int[][] freq=new int[nx][]; for(int i=0; i < nx; ++i) freq[i]=sequence(new int(int x) {return 0;},ny); real hx=nx/(b.x-a.x); real hy=ny/(b.y-a.y); real ax=a.x; real ay=a.y; for(int i=0; i < z.length; ++i) { int I=Floor((z[i].x-ax)*hx); int J=Floor((z[i].y-ay)*hy); if(I >= 0 && I < nx && J >= 0 && J < ny) ++freq[I][J]; } return freq; } path halfbox(pair a, pair b) { return a--(a.x,b.y)--b; } path topbox(pair a, pair b) { return a--(a.x,b.y)--b--(b.x,a.y); } // Draw a histogram for bin boundaries bin[n+1] of frequency data in count[n]. void histogram(picture pic=currentpicture, real[] bins, real[] count, real low=-infinity, pen fillpen=nullpen, pen drawpen=nullpen, bool bars=false, Label legend="", real markersize=legendmarkersize) { if((fillpen == nullpen || bars == true) && drawpen == nullpen) drawpen=currentpen; bool[] valid=count > 0; real m=min(valid ? count : null); real M=max(valid ? count : null); bounds my=autoscale(pic.scale.y.scale.T(m),pic.scale.y.T(M), pic.scale.y.scale); if(low == -infinity) low=pic.scale.y.scale.Tinv(my.min); real last=low; int n=count.length; begingroup(pic); for(int i=0; i < n; ++i) { if(valid[i]) { real c=count[i]; pair b=Scale(pic,(bins[i+1],c)); pair a=Scale(pic,(bins[i],low)); if(fillpen != nullpen) { fill(pic,box(a,b),fillpen); if(!bars) draw(pic,b--(b.x,a.y),fillpen); } if(!bars) draw(pic,halfbox(Scale(pic,(bins[i],last)),b),drawpen); else draw(pic,topbox(a,b),drawpen); last=c; } else { if(!bars && last != low) { draw(pic,Scale(pic,(bins[i],last))--Scale(pic,(bins[i],low)),drawpen); last=low; } } } if(!bars && last != low) draw(pic,Scale(pic,(bins[n],last))--Scale(pic,(bins[n],low)),drawpen); endgroup(pic); if(legend.s != "") { marker m=marker(scale(markersize)*shift((-0.5,-0.5))*unitsquare, drawpen,fillpen == nullpen ? Draw : (drawpen == nullpen ? Fill(fillpen) : FillDraw(fillpen))); legend.p(drawpen); pic.legend.push(Legend(legend.s,legend.p,invisible,m.f)); } } // Draw a histogram for data in n uniform bins between a and b // (optionally normalized). void histogram(picture pic=currentpicture, real[] data, real a, real b, int n, bool normalize=false, real low=-infinity, pen fillpen=nullpen, pen drawpen=nullpen, bool bars=false, Label legend="", real markersize=legendmarkersize) { real dx=(b-a)/n; real[] freq=frequency(data,a,b,n); if(normalize) freq /= dx*sum(freq); histogram(pic,a+sequence(n+1)*dx,freq,low,fillpen,drawpen,bars,legend, markersize); } // Method of Shimazaki and Shinomoto for selecting the optimal number of bins. // Shimazaki H. and Shinomoto S., A method for selecting the bin size of a // time histogram, Neural Computation (2007), Vol. 19(6), 1503-1527. // cf. http://www.ton.scphys.kyoto-u.ac.jp/~hideaki/res/histogram.html int bins(real[] data, int max=100) { real m=min(data); real M=max(data)*(1+epsilon); real n=data.length; int bins=1; real minC=2n-n^2; // Cost function for N=1. for(int N=2; N <= max; ++N) { real C=N*(2n-sum(frequency(data,m,M,N)^2)); if(C < minC) { minC=C; bins=N; } } return bins; } // return a pair of central Gaussian random numbers with unit variance pair Gaussrandpair() { real r2,v1,v2; do { v1=2.0*unitrand()-1.0; v2=2.0*unitrand()-1.0; r2=v1*v1+v2*v2; } while(r2 >= 1.0 || r2 == 0.0); return (v1,v2)*sqrt(-log(r2)/r2); } // return a central Gaussian random number with unit variance real Gaussrand() { static real sqrt2=sqrt(2.0); static pair z; static bool cached=true; cached=!cached; if(cached) return sqrt2*z.y; z=Gaussrandpair(); return sqrt2*z.x; } struct linefit { real m,b; // slope, intercept real dm,db; // standard error in slope, intercept real r; // correlation coefficient real fit(real x) { return m*x+b; } } // Do a least-squares fit of data in real arrays x and y to the line y=m*x+b linefit leastsquares(real[] x, real[] y) { linefit L; int n=x.length; if(n == 1) abort("Least squares fit requires at least 2 data points"); real sx=sum(x); real sy=sum(y); real sxx=n*sum(x^2)-sx^2; real sxy=n*sum(x*y)-sx*sy; L.m=sxy/sxx; L.b=(sy-L.m*sx)/n; if(n > 2) { real syy=n*sum(y^2)-sy^2; if(sxx == 0 || syy == 0) return L; L.r=sxy/sqrt(sxx*syy); real arg=syy-sxy^2/sxx; if(arg <= 0) return L; real s=sqrt(arg/(n-2)); L.dm=s*sqrt(1/sxx); L.db=s*sqrt(1+sx^2/sxx)/n; } return L; } // Do a least-squares fit of data in real arrays x and y weighted by w // to the line y=m*x+b, by minimizing sum(w*(y-m*x-b)^2). linefit leastsquares(real[] x, real[] y, real[] w) { linefit L; int n=x.length; if(n == 1) abort("Least squares fit requires at least 2 data points"); real sx=sum(w*x); real sy=sum(w*y); real W=sum(w); real sxx=W*sum(w*x^2)-sx^2; real sxy=W*sum(w*x*y)-sx*sy; L.m=sxy/sxx; L.b=(sy-L.m*sx)/W; if(n > 2) { real syy=W*sum(w*y^2)-sy^2; if(sxx == 0 || syy == 0) return L; L.r=sxy/sqrt(sxx*syy); real arg=syy-sxy^2/sxx; if(arg <= 0) return L; real s=sqrt(arg/(n-2)); L.dm=s*sqrt(1/sxx); L.db=s*sqrt(1+sx^2/sxx)/W; } return L; } asymptote-3.05/base/asy-init.el0000644000000000000000000000041415031566105015156 0ustar rootroot(autoload 'asy-mode "asy-mode.el" "Asymptote major mode." t) (autoload 'lasy-mode "asy-mode.el" "hybrid Asymptote/Latex major mode." t) (autoload 'asy-insinuate-latex "asy-mode.el" "Asymptote insinuate LaTeX." t) (add-to-list 'auto-mode-alist '("\\.asy$" . asy-mode)) asymptote-3.05/base/plain_shipout.asy0000644000000000000000000001111215031566105016470 0ustar rootroot// Default file prefix used for inline LaTeX mode string defaultfilename; file _outpipe; if(settings.xasy) _outpipe=output(mode="pipe"); string[] file3; string outprefix(string prefix=stripextension(defaultfilename)) { return prefix != "" ? prefix : outname(); } string outformat(string format="") { if(format == "") format=settings.outformat; if(format == "") format=nativeformat(); return format; } frame currentpatterns; frame Portrait(frame f) {return f;}; frame Landscape(frame f) {return rotate(90)*f;}; frame UpsideDown(frame f) {return rotate(180)*f;}; frame Seascape(frame f) {return rotate(-90)*f;}; using orientation=frame(frame); orientation orientation=Portrait; // Forward references to functions defined in module three. object embed3(string, frame, string, string, string, light, projection); string Embed(string name, string text="", string options="", real width=0, real height=0); bool primitive() { // Encode primitive objects return settings.outformat == "html" || settings.outformat=="v3d" || settings.v3d; } bool prconly(string format="") { return outformat(format) == "prc"; } bool prc0(string format="") { return settings.outformat == "prc" || (settings.prc && (outformat(format) == "pdf" || prconly() || settings.inlineimage )); } bool prc(string format="") { return prc0(format) && Embed != null; } bool is3D(string format="") { return prc(format) || settings.render != 0; } frame enclose(string prefix=defaultfilename, object F, string format="") { if(prc(format)) { frame f; label(f,F.L); return f; } return F.f; } void deconstruct(picture pic=currentpicture) { if(currentpicture.nodes3.length > 0) { if(currentpicture.xsize3 == 0 && currentpicture.ysize3 == 0 && currentpicture.zsize3 == 0) currentpicture.size3(hypot(currentpicture.xsize,currentpicture.ysize)); currentpicture.size(0); } frame f; transform t=pic.calculateTransform(); if(currentpicture.fitter == null) f=pic.fit(t); else f=pic.fit(); deconstruct(f,currentpatterns,t); } bool implicitshipout=false; void shipout(string prefix=defaultfilename, frame f, string format="", bool wait=false, bool view=true, string options="", string script="", light light=currentlight, projection P=currentprojection, transform t=identity) { if(is3D(f)) { f=enclose(prefix,embed3(prefix,f,format,options,script,light,P)); if(settings.render != 0 && !prc(format)) { return; } } bool defaultprefix=prefix == defaultfilename && outformat(format) == outformat(""); if(settings.xasy || (!implicitshipout && defaultprefix)) { if(defaultprefix) { currentpicture.clear(); add(f,group=false); } return; } // Applications like LaTeX cannot handle large PostScript coordinates. pair m=min(f); int limit=2000; if(abs(m.x) > limit || abs(m.y) > limit) f=shift(-m)*f; _shipout(prefix,f,currentpatterns,format,wait,view,t); } void shipout(string prefix=defaultfilename, picture pic=currentpicture, orientation orientation=orientation, string format="", bool wait=false, bool view=true, string options="", string script="", light light=currentlight, projection P=currentprojection) { projection P=centered(P,pic); if(!uptodate()) { bool inlinetex=settings.inlinetex; bool prc=prc(format) || settings.v3d; bool empty3=pic.empty3(); if(prc && !empty3) { if(settings.render == 0) { string image=outprefix(prefix)+"+"+(string) file3.length; if(settings.inlineimage) image += "_0"; settings.inlinetex=false; settings.prc=false; shipout(image,pic,orientation,nativeformat(),view=false,light,P); settings.prc=true; } settings.inlinetex=settings.inlineimage; } frame f; transform t=empty3 ? pic.calculateTransform() : identity; if(currentpicture.fitter == null) { pen background=currentlight.background; if(settings.outformat == "html" && background == nullpen) background=white; if(background != nullpen) f=bbox(pic,nullpen,Fill(background)); else f=pic.fit(t); } else f=pic.fit(prefix,format,view=view,options,script,light,P); if(!prconly() && (!pic.empty2() || settings.render == 0 || prc || pic.queueErase)) { shipout(prefix,orientation(f),format,wait,view,t); pic.queueErase=false; } settings.inlinetex=inlinetex; } pic.uptodate=true; } void newpage(picture pic=currentpicture) { pic.add(new void(frame f, transform) { newpage(f); },true); } asymptote-3.05/base/plain_Label.asy0000644000000000000000000004015215031566105016022 0ustar rootrootreal angle(transform t) { pair z=(2t.xx*t.yy,t.yx*t.yy-t.xx*t.xy); if(t.xx < 0 || t.yy < 0) z=-z; return degrees(z,warn=false); } transform rotation(transform t) { return rotate(angle(t)); } transform scaleless(transform t) { real a=t.xx, b=t.xy, c=t.yx, d=t.yy; real arg=(a-d)^2+4b*c; pair delta=arg >= 0 ? sqrt(arg) : I*sqrt(-arg); real trace=a+d; pair l1=0.5(trace+delta); pair l2=0.5(trace-delta); if(abs(delta) < sqrtEpsilon*max(abs(l1),abs(l2))) { real s=abs(0.5trace); return (s != 0) ? scale(1/s)*t : t; } if(abs(l1-d) < abs(l2-d)) {pair temp=l1; l1=l2; l2=temp;} pair dot(pair[] u, pair[] v) {return conj(u[0])*v[0]+conj(u[1])*v[1];} pair[] unit(pair[] u) { real norm2=abs(u[0])^2+abs(u[1])^2; return norm2 != 0 ? u/sqrt(norm2) : u; } pair[] u={l1-d,b}; pair[] v={c,l2-a}; u=unit(u); pair d=dot(u,u); if(d != 0) v -= dot(u,v)/d*u; v=unit(v); pair[][] U={{u[0],v[0]},{u[1],v[1]}}; pair[][] A={{a,b},{c,d}}; pair[][] operator *(pair[][] a, pair[][] b) { pair[][] c=new pair[2][2]; for(int i=0; i < 2; ++i) { for(int j=0; j < 2; ++j) { c[i][j]=a[i][0]*b[0][j]+a[i][1]*b[1][j]; } } return c; } pair[][] conj(pair[][] a) { pair[][] c=new pair[2][2]; for(int i=0; i < 2; ++i) { for(int j=0; j < 2; ++j) { c[i][j]=conj(a[j][i]); } } return c; } A=conj(U)*A*U; real D=abs(A[0][0]); if(D != 0) { A[0][0] /= D; A[0][1] /= D; } D=abs(A[1][1]); if(D != 0) { A[1][0] /= D; A[1][1] /= D; } A=U*A*conj(U); return (0,0,A[0][0].x,A[0][1].x,A[1][0].x,A[1][1].x); } struct align { pair dir; triple dir3; bool relative=false; bool default=true; bool is3D=false; void init(pair dir=0, bool relative=false, bool default=false) { this.dir=dir; this.relative=relative; this.default=default; is3D=false; } void init(triple dir=(0,0,0), bool relative=false, bool default=false) { this.dir3=dir; this.relative=relative; this.default=default; is3D=true; } align copy() { align align=new align; align.init(dir,relative,default); align.dir3=dir3; align.is3D=is3D; return align; } void align(align align) { if(!align.default) { bool is3D=align.is3D; init(align.dir,align.relative); dir3=align.dir3; this.is3D=is3D; } } void align(align align, align default) { align(align); if(this.default) { init(default.dir,default.relative,default.default); dir3=default.dir3; is3D=default.is3D; } } void write(file file=stdout, suffix suffix=endl) { if(!default) { if(relative) { write(file,"Relative("); if(is3D) write(file,dir3); else write(file,dir); write(file,")",suffix); } else { if(is3D) write(file,dir3,suffix); else write(file,dir,suffix); } } } bool Center() { return relative && (is3D ? dir3 == (0,0,0) : dir == 0); } } struct side { pair align; } side Relative(explicit pair align) { side s; s.align=align; return s; } restricted side NoSide; restricted side LeftSide=Relative(W); restricted side Center=Relative((0,0)); restricted side RightSide=Relative(E); side operator * (real x, side s) { side S; S.align=x*s.align; return S; } align operator cast(pair dir) {align A; A.init(dir,false); return A;} align operator cast(triple dir) {align A; A.init(dir,false); return A;} align operator cast(side side) {align A; A.init(side.align,true); return A;} restricted align NoAlign; void write(file file=stdout, align align, suffix suffix=endl) { align.write(file,suffix); } struct position { pair position; bool relative; } position Relative(real position) { position p; p.position=position; p.relative=true; return p; } restricted position BeginPoint=Relative(0); restricted position MidPoint=Relative(0.5); restricted position EndPoint=Relative(1); position operator cast(pair x) {position P; P.position=x; return P;} position operator cast(real x) {return (pair) x;} position operator cast(int x) {return (pair) x;} pair operator cast(position P) {return P.position;} using embed=transform(transform); transform Shift(transform t) {return identity();} transform Rotate(transform t) {return rotation(t);} transform Slant(transform t) {return scaleless(t);} transform Scale(transform t) {return t;} embed Rotate(pair z) { return new transform(transform t) {return rotate(degrees(shiftless(t)*z, warn=false));}; } path[] texpath(string s, pen p, bool tex=settings.tex != "none", bool bbox=false); struct Label { string s,size; position position; bool defaultposition=true; align align; pen p=nullpen; transform T; transform3 T3=identity(4); bool defaulttransform=true; bool defaulttransform3=true; embed embed=Rotate; // Shift, Rotate, Slant, or Scale with embedded picture filltype filltype=NoFill; void init(string s="", string size="", position position=0, bool defaultposition=true, align align=NoAlign, pen p=nullpen, transform T=identity(), transform3 T3=identity4, bool defaulttransform=true, bool defaulttransform3=true, embed embed=Rotate, filltype filltype=NoFill) { this.s=s; this.size=size; this.position=position; this.defaultposition=defaultposition; this.align=align.copy(); this.p=p; this.T=T; this.T3=copy(T3); this.defaulttransform=defaulttransform; this.defaulttransform3=defaulttransform3; this.embed=embed; this.filltype=filltype; } void initalign(string s="", string size="", align align, pen p=nullpen, embed embed=Rotate, filltype filltype=NoFill) { init(s,size,align,p,embed,filltype); } void transform(transform T) { this.T=T; defaulttransform=false; } void transform3(transform3 T) { this.T3=copy(T); defaulttransform3=false; } Label copy(transform3 T3=this.T3) { Label L=new Label; L.init(s,size,position,defaultposition,align,p,T,T3,defaulttransform, defaulttransform3,embed,filltype); return L; } void position(position pos) { this.position=pos; defaultposition=false; } void align(align a) { align.align(a); } void align(align a, align default) { align.align(a,default); } void p(pen p0) { if(this.p == nullpen) this.p=p0; } void filltype(filltype filltype0) { if(this.filltype == NoFill) this.filltype=filltype0; } void label(frame f, transform t=identity(), pair position, pair align) { pen p0=p == nullpen ? currentpen : p; align=length(align)*unit(rotation(t)*align); pair S=t*position+align*labelmargin(p0)+shift(T)*0; if(settings.tex != "none") label(f,s,size,embed(t)*shiftless(T),S,align,p0); else fill(f,align(texpath(s,p0),S,align,p0),p0); } void out(frame f, transform t=identity(), pair position=position.position, pair align=align.dir) { if(filltype == NoFill) label(f,t,position,align); else { frame d; label(d,t,position,align); add(f,d,filltype); } } void label(picture pic=currentpicture, pair position, pair align) { if(s == "") return; pic.add(new void (frame f, transform t) { out(f,t,position,align); },true); frame f; // Create a picture with label at the origin to extract its bbox truesize. label(f,(0,0),align); pic.addBox(position,position,min(f),max(f)); } void out(picture pic=currentpicture) { label(pic,position.position,align.dir); } void out(picture pic=currentpicture, path g) { bool relative=position.relative; real position=position.position.x; pair Align=align.dir; bool alignrelative=align.relative; if(defaultposition) {relative=true; position=0.5;} if(relative) position=reltime(g,position); if(align.default) { alignrelative=true; Align=position <= sqrtEpsilon ? S : position >= length(g)-sqrtEpsilon ? N : E; } pic.add(new void (frame f, transform t) { out(f,t,point(g,position),alignrelative ? inverse(rotation(t))*-Align*dir(t*g,position)*I : Align); },!alignrelative); frame f; pair align=alignrelative ? -Align*dir(g,position)*I : Align; label(f,(0,0),align); pair position=point(g,position); pic.addBox(position,position,min(f),max(f)); } void write(file file=stdout, suffix suffix=endl) { write(file,"\""+s+"\""); if(!defaultposition) write(file,", position=",position.position); if(!align.default) write(file,", align="); write(file,align); if(p != nullpen) write(file,", pen=",p); if(!defaulttransform) write(file,", transform=",T); if(!defaulttransform3) { write(file,", transform3=",endl); write(file,T3); } write(file,"",suffix); } real relative() { return defaultposition ? 0.5 : position.position.x; }; real relative(path g) { return position.relative ? reltime(g,relative()) : relative(); }; } Label Label; void add(frame f, transform t=identity(), Label L) { L.out(f,t); } void add(picture pic=currentpicture, Label L) { L.out(pic); } Label operator * (transform t, Label L) { Label tL=L.copy(); tL.align.dir=L.align.dir; tL.transform(t*L.T); return tL; } Label operator * (transform3 t, Label L) { Label tL=L.copy(t*L.T3); tL.align.dir=L.align.dir; tL.defaulttransform3=false; return tL; } Label Label(string s, string size="", explicit position position, align align=NoAlign, pen p=nullpen, embed embed=Rotate, filltype filltype=NoFill) { Label L; L.init(s,size,position,false,align,p,embed,filltype); return L; } Label Label(string s, string size="", pair position, align align=NoAlign, pen p=nullpen, embed embed=Rotate, filltype filltype=NoFill) { return Label(s,size,(position) position,align,p,embed,filltype); } Label Label(explicit pair position, align align=NoAlign, pen p=nullpen, embed embed=Rotate, filltype filltype=NoFill) { return Label((string) position,position,align,p,embed,filltype); } Label Label(string s="", string size="", align align=NoAlign, pen p=nullpen, embed embed=Rotate, filltype filltype=NoFill) { Label L; L.initalign(s,size,align,p,embed,filltype); return L; } Label Label(Label L, align align=NoAlign, pen p=nullpen, embed embed=L.embed, filltype filltype=NoFill) { Label L=L.copy(); L.align(align); L.p(p); L.embed=embed; L.filltype(filltype); return L; } Label Label(Label L, explicit position position, align align=NoAlign, pen p=nullpen, embed embed=L.embed, filltype filltype=NoFill) { Label L=Label(L,align,p,embed,filltype); L.position(position); return L; } Label Label(Label L, pair position, align align=NoAlign, pen p=nullpen, embed embed=L.embed, filltype filltype=NoFill) { return Label(L,(position) position,align,p,embed,filltype); } void write(file file=stdout, Label L, suffix suffix=endl) { L.write(file,suffix); } void label(frame f, Label L, pair position, align align=NoAlign, pen p=currentpen, filltype filltype=NoFill) { add(f,Label(L,position,align,p,filltype)); } void label(frame f, Label L, align align=NoAlign, pen p=currentpen, filltype filltype=NoFill) { add(f,Label(L,L.position,align,p,filltype)); } void label(picture pic=currentpicture, Label L, pair position, align align=NoAlign, pen p=currentpen, filltype filltype=NoFill) { Label L=Label(L,position,align,p,filltype); add(pic,L); } void label(picture pic=currentpicture, Label L, align align=NoAlign, pen p=currentpen, filltype filltype=NoFill) { label(pic,L,L.position,align,p,filltype); } // Label, but with postscript coords instead of asy void label(pair origin, picture pic=currentpicture, Label L, align align=NoAlign, pen p=currentpen, filltype filltype=NoFill) { picture opic; label(opic,L,L.position,align,p,filltype); add(pic,opic,origin); } void label(picture pic=currentpicture, Label L, explicit path g, align align=NoAlign, pen p=currentpen, filltype filltype=NoFill) { Label L=Label(L,align,p,filltype); L.out(pic,g); } void label(picture pic=currentpicture, Label L, explicit guide g, align align=NoAlign, pen p=currentpen, filltype filltype=NoFill) { label(pic,L,(path) g,align,p,filltype); } Label operator cast(string s) {return Label(s);} // A structure that a string, Label, or frame can be cast to. struct object { frame f; Label L=Label; path g; // Bounding path void operator init(frame f) { this.f=f; g=box(min(f),max(f)); } void operator init(Label L) { this.L=L.copy(); if(L != Label) L.out(f); g=box(min(f),max(f)); } } object operator cast(frame f) { return object(f); } object operator cast(Label L) { return object(L); } object operator cast(string s) { return object(s); } Label operator cast(object F) { return F.L; } frame operator cast(object F) { return F.f; } object operator * (transform t, explicit object F) { object f; f.f=t*F.f; f.L=t*F.L; f.g=t*F.g; return f; } // Returns a copy of object F aligned in the direction align object align(object F, pair align) { return shift(F.f,align)*F; } void add(picture dest=currentpicture, object F, pair position=0, bool group=true, filltype filltype=NoFill, bool above=true) { add(dest,F.f,position,group,filltype,above); } // Pack a list of objects into a frame. frame pack(pair align=2S ... object inset[]) { frame F; int n=inset.length; pair z; for (int i=0; i < n; ++i) { add(F,inset[i].f,z); z += align+realmult(unit(align),size(inset[i].f)); } return F; } path[] texpath(Label L, bool tex=settings.tex != "none", bool bbox=false) { struct stringfont { string s; real fontsize; string font; void operator init(Label L) { s=replace(L.s,'\n',' '); fontsize=fontsize(L.p); font=font(L.p); } pen pen() {return fontsize(fontsize)+fontcommand(font);} } bool lexorder(stringfont a, stringfont b) { return a.s < b.s || (a.s == b.s && (a.fontsize < b.fontsize || (a.fontsize == b.fontsize && a.font < b.font))); } static stringfont[] stringcache; static path[][] pathcache; static stringfont[] stringlist; static bool adjust[]; path[] G; stringfont s=stringfont(L); pen p=s.pen(); int i=search(stringcache,s,lexorder); if(i == -1 || lexorder(stringcache[i],s)) { int k=search(stringlist,s,lexorder); if(k == -1 || lexorder(stringlist[k],s)) { ++k; stringlist.insert(k,s); // PDF tex engines lose track of the baseline. adjust.insert(k,tex && basealign(L.p) == 1 && pdf()); } } path[] transform(path[] g, Label L) { if(g.length == 0) return g; pair m=min(g); pair M=max(g); pair dir=rectify(inverse(L.T)*-L.align.dir); if(tex && basealign(L.p) == 1) dir -= (0,(1-dir.y)*m.y/(M.y-m.y)); pair a=m+realmult(dir,M-m); return shift(L.position+L.align.dir*labelmargin(L.p))*L.T*shift(-a)*g; } if(tex && bbox) { frame f; label(f,L); return transform(box(min(f),max(f)),L); } if(stringlist.length > 0) { path[][] g; int n=stringlist.length; string[] s=new string[n]; pen[] p=new pen[n]; for(int i=0; i < n; ++i) { stringfont S=stringlist[i]; s[i]=adjust[i] ? "."+S.s : S.s; p[i]=adjust[i] ? S.pen()+basealign : S.pen(); } g=tex ? _texpath(s,p) : textpath(s,p); if(tex) for(int i=0; i < n; ++i) if(adjust[i]) { real y=min(g[i][0]).y; g[i].delete(0); g[i]=shift(0,-y)*g[i]; } for(int i=0; i < stringlist.length; ++i) { stringfont s=stringlist[i]; int j=search(stringcache,s,lexorder)+1; stringcache.insert(j,s); pathcache.insert(j,g[i]); } stringlist.delete(); adjust.delete(); } return transform(pathcache[search(stringcache,stringfont(L),lexorder)],L); } texpath=new path[](string s, pen p, bool tex=settings.tex != "none", bool bbox=false) { return texpath(Label(s,p)); }; asymptote-3.05/base/graph_settings.asy0000644000000000000000000000047215031566105016642 0ustar rootroot// Number of function samples. int ngraph=100; int nCircle=400; // Number of mesh intervals. int nmesh=10; real ticksize=1mm; real Ticksize=2*ticksize; real ylabelwidth=2.0; real axislabelfactor=1.5; real axiscoverage=0.8; real epsilon=10*realEpsilon; restricted bool Crop=true; restricted bool NoCrop=false; asymptote-3.05/base/flowchart.asy0000644000000000000000000003565515031566105015625 0ustar rootroot// Flowchart routines written by Jacques Pienaar, Steve Melenchuk, John Bowman. private import math; struct flowdir {} restricted flowdir Horizontal; restricted flowdir Vertical; real minblockwidth=0; real minblockheight=0; real mincirclediameter=0; real defaultexcursion=0.1; struct block { // The absolute center of the block in user coordinates. pair center; // The size of the block pair size; // The relative center of the block. pair f_center; // These eight variables return the appropriate location on the block // in relative coordinates, where the lower left corner of the block is (0,0). pair f_top; pair f_left; pair f_right; pair f_bottom; pair f_topleft; pair f_topright; pair f_bottomleft; pair f_bottomright; void operator init(pair z) { center=z; } void operator init(real x, real y) { center=(x,y); } pair shift(transform t=identity()) { return t*center-f_center; } // Returns the relative position along the boundary of the block. pair f_position(real x); // Returns the absolute position along the boundary of the block. pair position(real x, transform t=identity()) { return shift(t)+f_position(x); } // These eight functions return the appropriate location on the block // in absolute coordinates. pair top(transform t=identity()) { return shift(t)+f_top; } pair bottom(transform t=identity()) { return shift(t)+f_bottom; } pair left(transform t=identity()) { return shift(t)+f_left; } pair right(transform t=identity()) { return shift(t)+f_right; } pair topleft(transform t=identity()) { return shift(t)+f_topleft; } pair topright(transform t=identity()) { return shift(t)+f_topright; } pair bottomleft(transform t=identity()) { return shift(t)+f_bottomleft; } pair bottomright(transform t=identity()) { return shift(t)+f_bottomright; } // Return a frame representing the block. frame draw(pen p=currentpen); // Store optional label on outgoing edge. Label label; // Store rectilinear path directions. pair[] dirs; // Store optional arrow. arrowbar arrow=None; }; // Construct a rectangular block with header and body objects. block rectangle(object header, object body, pair center=(0,0), pen headerpen=mediumgray, pen bodypen=invisible, pen drawpen=currentpen, real dx=3, real minheaderwidth=minblockwidth, real minheaderheight=minblockwidth, real minbodywidth=minblockheight, real minbodyheight=minblockheight) { frame fbody=body.f; frame fheader=header.f; pair mheader=min(fheader); pair Mheader=max(fheader); pair mbody=min(fbody); pair Mbody=max(fbody); pair bound0=Mheader-mheader; pair bound1=Mbody-mbody; real width=max(bound0.x,bound1.x); pair z0=maxbound((width+2dx,bound0.y+2dx),(minbodywidth,minbodyheight)); pair z1=maxbound((width+2dx,bound1.y+2dx),(minheaderwidth,minheaderheight)); path shape=(0,0)--(0,z1.y)--(0,z0.y+z1.y)--(z0.x,z0.y+z1.y)--z1--(z0.x,0)-- cycle; block block; block.draw=new frame(pen p) { frame block; filldraw(block,shift(0,z1.y)*box((0,0),z0),headerpen,drawpen); add(block,shift(-0.5*(Mheader+mheader))*fheader,(0,z1.y)+0.5z0); filldraw(block,box((0,0),z1),bodypen,drawpen); add(block,shift(-0.5*(Mbody+mbody))*fbody,0.5z1); return block; }; block.f_position=new pair(real x) { return point(shape,x); }; block.f_center=interp(point(shape,0),point(shape,3),0.5); block.f_bottomleft=point(shape,0); block.f_bottom=point(shape,5.5); block.f_bottomright=point(shape,5); block.f_right=point(shape,4.5); block.f_topright=point(shape,3); block.f_top=point(shape,2.5); block.f_topleft=point(shape,2); block.f_left=point(shape,0.5); block.center=center; block.size=point(shape,3); return block; } // As above, but without the header. block rectangle(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real dx=3, real minwidth=minblockwidth, real minheight=minblockheight) { frame f=body.f; pair m=min(f); pair M=max(f); pair z=maxbound(M-m+dx*(2,2),(minwidth,minheight)); path shape=box((0,0),z); block block; block.draw=new frame(pen p) { frame block; filldraw(block,shape,fillpen,drawpen); add(block,shift(-0.5*(M+m))*f,0.5z); return block; }; block.f_position=new pair(real x) { return point(shape,x); }; block.f_center=0.5*z; block.center=center; block.size=z; block.f_bottomleft=point(shape,0); block.f_bottom=point(shape,0.5); block.f_bottomright=point(shape,1); block.f_right=point(shape,1.5); block.f_topright=point(shape,2); block.f_top=point(shape,2.5); block.f_topleft=point(shape,3); block.f_left=point(shape,3.5); return block; } block parallelogram(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real dx=3, real slope=2, real minwidth=minblockwidth, real minheight=minblockheight) { frame f=body.f; pair m=min(f); pair M=max(f); pair bound=maxbound(M-m+dx*(0,2),(minwidth,minheight)); real skew=bound.y/slope; real a=bound.x+skew; real b=bound.y; path shape=(0,0)--(a,0)--(a+skew,b)--(skew,b)--cycle; block block; block.draw=new frame(pen p) { frame block; filldraw(block,shape,fillpen,drawpen); add(block,shift(-0.5*(M+m))*f,((a+skew)/2,b/2)); return block; }; block.f_position=new pair(real x) { return point(shape,x); }; block.f_center=((a+skew)/2,b/2); block.center=center; block.size=(a+skew,b); block.f_bottomleft=(0,0); block.f_bottom=((a+skew)/2,0); block.f_bottomright=(a,0); block.f_right=(a+skew/2,b/2); block.f_topright=(a+skew,b); block.f_top=((a+skew)/2,b); block.f_topleft=(skew,b); block.f_left=(skew/2,b/2); return block; } block diamond(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real ds=5, real dw=1, real height=20, real minwidth=minblockwidth, real minheight=minblockheight) { frame f=body.f; pair m=min(f); pair M=max(f); pair bound=maxbound(M-m,(minwidth,minheight)); real e=ds; real a=0.5bound.x-dw; real b=0.5bound.y; real c=b+height; real arg=a^2+b^2+c^2-2b*c-e^2; real denom=e^2-a^2; real slope=arg >= 0 && denom != 0 ? (a*(c-b)-e*sqrt(arg))/denom : 1.0; real d=abs(c/slope); path shape=(2d,c)--(d,2c)--(0,c)--(d,0)--cycle; block block; block.draw=new frame(pen p) { frame block; filldraw(block,shape,fillpen,drawpen); add(block,shift(-0.5*(M+m))*f,(d,c)); return block; }; block.f_position=new pair(real x) { return point(shape,x); }; block.f_center=(point(shape,1).x,point(shape,0).y); block.center=center; block.size=(point(shape,0).x,point(shape,1).y); block.f_bottomleft=point(shape,2.5); block.f_bottom=point(shape,3); block.f_bottomright=point(shape,3.5); block.f_right=point(shape,0); block.f_topright=point(shape,0.5); block.f_top=point(shape,1); block.f_topleft=point(shape,1.5); block.f_left=point(shape,2); return block; } block circle(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real dr=3, real mindiameter=mincirclediameter) { frame f=body.f; pair m=min(f); pair M=max(f); real r=max(0.5length(M-m)+dr,0.5mindiameter); path shape=(0,r)..(r,2r)..(2r,r)..(r,0)..cycle; block block; block.draw=new frame(pen p) { frame block; filldraw(block,shape,fillpen,drawpen); add(block,shift(-0.5*(M+m))*f,(r,r)); return block; }; block.f_position=new pair(real x) { return point(shape,x); }; block.f_center=(r,r); block.center=center; block.size=(2r,2r); block.f_left=point(shape,0); block.f_topleft=point(shape,0.5); block.f_top=point(shape,1); block.f_topright=point(shape,1.5); block.f_right=point(shape,2); block.f_bottomright=point(shape,2.5); block.f_bottom=point(shape,3); block.f_bottomleft=point(shape,3.5); return block; } block roundrectangle(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real ds=5, real dw=0, real minwidth=minblockwidth, real minheight=minblockheight) { frame f=body.f; pair m=min(f); pair M=max(f); pair bound=maxbound(M-m,(minwidth,minheight)); real a=bound.x; real b=bound.y; path shape=(0,ds+dw)--(0,ds+b-dw){up}..{right} (ds+dw,2ds+b)--(ds+a-dw,2ds+b){right}..{down} (2ds+a,ds+b-dw)--(2ds+a,ds+dw){down}..{left} (ds+a-dw,0)--(ds+dw,0){left}..{up}cycle; block block; block.draw=new frame(pen p) { frame block; filldraw(block,shape,fillpen,drawpen); add(block,shift(-0.5*(M+m))*f,(ds,ds)+0.5bound); return block; }; block.f_position=new pair(real x) { return point(shape,x); }; block.f_center=(ds+0.5a,ds+0.5b); block.center=center; block.size=(2ds+a,2ds+b); block.f_bottomleft=point(shape,7.5); block.f_bottom=point(shape,6.5); block.f_bottomright=point(shape,5.5); block.f_right=point(shape,4.5); block.f_topright=point(shape,3.5); block.f_top=point(shape,2.5); block.f_topleft=point(shape,1.5); block.f_left=point(shape,0.5); return block; } block bevel(object body, pair center=(0,0), pen fillpen=invisible, pen drawpen=currentpen, real dh=5, real dw=5, real minwidth=minblockwidth, real minheight=minblockheight) { frame f=body.f; pair m=min(f); pair M=max(f); pair bound=maxbound(M-m,(minwidth,minheight)); real a=bound.x; real b=0.5bound.y; path shape=(2dw+a,b+dh)--(dw+a,2b+2dh)--(dw,2b+2dh)--(0,b+dh)--(dw,0)-- (dw+a,0)--cycle; block block; block.draw=new frame(pen p) { frame block; filldraw(block,shape,fillpen,drawpen); add(block,shift(-0.5*(M+m))*f,(0.5bound+(dw,dh))); return block; }; block.f_position=new pair(real x) { return point(shape,x); }; block.f_center=(dw+0.5a,dh+b); block.center=center; block.size=(2dw+a,2dh+2b); block.f_bottomleft=point(shape,4); block.f_bottom=point(shape,4.5); block.f_bottomright=point(shape,5); block.f_right=point(shape,0); block.f_topright=point(shape,1); block.f_top=point(shape,1.5); block.f_topleft=point(shape,2); block.f_left=point(shape,3); return block; } path path(pair point[] ... flowdir dir[]) { path line=point[0]; pair current, prev=point[0]; for(int i=1; i < point.length; ++i) { if(i-1 >= dir.length || dir[i-1] == Horizontal) current=(point[i].x,point[i-1].y); else current=(point[i-1].x,point[i].y); if(current != prev) { line=line--current; prev=current; } current=point[i]; if(current != prev) { line=line--current; prev=current; } } return line; } void draw(picture pic=currentpicture, block block, pen p=currentpen) { pic.add(new void(frame f, transform t) { add(f,shift(block.shift(t))*block.draw(p)); },true); pic.addBox(block.center,block.center, -0.5*block.size+min(p),0.5*block.size+max(p)); } typedef block blockconnector(block, block); blockconnector blockconnector(picture pic, transform t, pen p=currentpen, margin margin=PenMargin) { return new block(block b1, block b2) { if(b1.dirs.length == 0) { if(abs(b1.center.y-b2.center.y) < sqrtEpsilon) { // horizontally aligned b1.dirs[0]=b1.center.x < b2.center.x ? right : left; blockconnector(pic,t,p,margin)(b1,b2); } else if(abs(b1.center.x-b2.center.x) < sqrtEpsilon) { // vertically aligned b1.dirs[0]=b1.center.y < b2.center.y ? up : down; blockconnector(pic,t,p,margin)(b1,b2); } else { if(abs(b1.center.y-b2.center.y) < abs(b1.center.x-b2.center.x)) { b1.dirs[0]=b1.center.x < b2.center.x ? right : left; b1.dirs[1]=b1.center.y < b2.center.y ? up : down; blockconnector(pic,t,p,margin)(b1,b2); } else { b1.dirs[0]=b1.center.y < b2.center.y ? up : down; b1.dirs[1]=b1.center.x < b2.center.x ? right : left; blockconnector(pic,t,p,margin)(b1,b2); } } return b2; } // compute the link for given directions (and label if any) pair[] dirs=copy(b1.dirs); // deep copy pair current,prev; pair dir=dirs[0]; if(dir == up) prev=b1.top(t); if(dir == down) prev=b1.bottom(t); if(dir == left) prev=b1.left(t); if(dir == right) prev=b1.right(t); path line=prev; arrowbar arrow=b1.arrow; int i; for(i=1; i < dirs.length-1; ++i) { if(abs(length(dirs[i-1])-1) < sqrtEpsilon) current=prev+t*dirs[i-1]*defaultexcursion; else current=prev+t*dirs[i-1]; if(current != prev) { line=line--current; prev=current; } } dir=dirs[dirs.length-1]; current=0; if(dir == up) current=b2.bottom(t); if(dir == down) current=b2.top(t); if(dir == left) current=b2.right(t); if(dir == right) current=b2.left(t); if(abs(dirs[i-1].y) < sqrtEpsilon && abs(prev.x-current.x) > sqrtEpsilon) { prev=(current.x,prev.y); line=line--prev; // horizontal } else if(abs(dirs[i-1].x) < sqrtEpsilon && abs(prev.y-current.y) > sqrtEpsilon) { prev=(prev.x,current.y); line=line--prev; } if(current != prev) line=line--current; draw(pic,b1.label,line,p,arrow,margin); b1.label=""; b1.dirs.delete(); b1.arrow=None; return b2; }; } struct Dir { pair z; void operator init(pair z) {this.z=z;} } Dir Right=Dir(right); Dir Left=Dir(left); Dir Up=Dir(up); Dir Down=Dir(down); // Add a label to the current link block operator --(block b1, Label label) { b1.label=label; return b1; } // Add a direction to the current link block operator --(block b1, Dir dir) { b1.dirs.push(dir.z); return b1; } // Add an arrowbar to the current link block operator --(block b, arrowbar arrowbar) { b.arrow=arrowbar; return b; } asymptote-3.05/base/obj.asy0000644000000000000000000000631615031566105014376 0ustar rootroot// A module for reading simple obj files with groups. // Authors: Jens Schwaiger and John Bowman // // Here simple means that : // // 1) all vertex statements should come before the face statements; // // 2) face informations with respect to texture and/or normal vectors are // ignored; // // 3) face statements only contain positive numbers(no relative positions). // // The reading process only takes into account lines starting with "v" or // "f" or "g"(group). import three; struct obj { surface s; material[] surfacepen; pen[] meshpen; path3[][] read(string datafile, bool verbose=false) { file in=input(datafile).word().line(); triple[] vert; path3[][] g; g[0]=new path3[] ; string[] G; void Vertex(real x,real y ,real z) {vert.push((x,y,z));} void Face(int[] vertnr, int groupnr) { guide3 gh; for(int i=0; i < vertnr.length; ++i) gh=gh--vert[vertnr[i]-1]; gh=gh--cycle; g[groupnr].push(gh); } if(verbose) write("Reading data from "+datafile+"."); int groupnr; while(true) { string[] str=in; if(str.length == 0) break; str=sequence(new string(int i) {return split(str[i],"/")[0];},str.length); if(str[0] == "g" && str.length > 1) { int tst=find(G == str[1]); if(tst == -1) { G.push(str[1]); groupnr=G.length-1; g[groupnr]=new path3[] ; } if(tst > -1) groupnr=tst; } if(str[0] == "v") Vertex((real) str[1],(real) str[2],(real) str[3]); if(str[0] == "f") { int[] vertnr; for(int i=1; i < str.length; ++i) vertnr[i-1]=(int) str[i]; Face(vertnr,groupnr); } if(eof(in)) break; } close(in); if(verbose) { write("Number of groups: ",G.length); write("Groups and their names:"); write(G); write("Reading done."); write("Number of faces contained in the groups: "); for(int j=0; j < G.length; ++j) write(G[j],": ",(string) g[j].length); } return g; } void operator init(path3[][] g, material[] surfacepen, pen[] meshpen) { for(int i=0; i < g.length; ++i) { path3[] gi=g[i]; for(int j=0; j < gi.length; ++j) { // Treat all faces as planar to avoid subdivision cracks. surface sij=surface(gi[j],planar=true); s.append(sij); this.surfacepen.append(array(sij.s.length,surfacepen[i])); this.meshpen.append(array(sij.s.length,meshpen[i])); } } } void operator init(string datafile, bool verbose=false, material[] surfacepen, pen[] meshpen=nullpens) { operator init(read(datafile,verbose),surfacepen,meshpen); } void operator init(string datafile, bool verbose=false, material surfacepen, pen meshpen=nullpen) { material[] surfacepen={surfacepen}; pen[] meshpen={meshpen}; surfacepen.cyclic=true; meshpen.cyclic=true; operator init(read(datafile,verbose),surfacepen,meshpen); } } obj operator * (transform3 T, obj o) { obj ot; ot.s=T*o.s; ot.surfacepen=copy(o.surfacepen); ot.meshpen=copy(o.meshpen); return ot; } void draw(picture pic=currentpicture, obj o, light light=currentlight) { draw(pic,o.s,o.surfacepen,o.meshpen,light); } asymptote-3.05/base/plain_bounds.asy0000644000000000000000000005056315031566105016304 0ustar rootrootinclude plain_scaling; // After a transformation, produce new coordinate bounds. For paths that // have been added, this is only an approximation since it takes the bounds of // their transformed bounding box. private void addTransformedCoords(coords2 dest, transform t, coords2 point, coords2 min, coords2 max) { dest.push(t, point, point); // Add in all 4 corner coords, to properly size rectangular pictures. dest.push(t,min,min); dest.push(t,min,max); dest.push(t,max,min); dest.push(t,max,max); } // Adds another sizing restriction to the coordinates, but only if it is // maximal, that is, if under some scaling, this coordinate could be the // largest. private void addIfMaximal(coord[] coords, real user, real truesize) { // TODO: Test promoting coordinates for efficiency. for (coord c : coords) if (user <= c.user && truesize <= c.truesize) // Not maximal. return; // The coordinate is not dominated by any existing extreme, so it is // maximal and will be added, but first remove any coords it now dominates. int i=0; while (i < coords.length) { coord c=coords[i]; if (c.user <= user && c.truesize <= truesize) coords.delete(i); else ++i; } // Add the coordinate to the extremes. coords.push(coord.build(user, truesize)); } private void addIfMaximal(coord[] dest, coord[] src) { // This may be inefficient, as it rebuilds the coord struct when adding it. for (coord c : src) addIfMaximal(dest, c.user, c.truesize); } // Same as addIfMaximal, but testing for minimal coords. private void addIfMinimal(coord[] coords, real user, real truesize) { for (coord c : coords) if (user >= c.user && truesize >= c.truesize) return; int i=0; while (i < coords.length) { coord c=coords[i]; if (c.user >= user && c.truesize >= truesize) coords.delete(i); else ++i; } coords.push(coord.build(user, truesize)); } private void addIfMinimal(coord[] dest, coord[] src) { for (coord c : src) addIfMinimal(dest, c.user, c.truesize); } // This stores a list of sizing bounds for picture data. If the object is // frozen, then it cannot be modified further, and therefore can be safely // passed by reference and stored in the sizing data for multiple pictures. private struct freezableBounds { restricted bool frozen=false; void freeze() { frozen=true; } // Optional links to further (frozen) sizing data. private freezableBounds[] links; // Links to (frozen) sizing data that is transformed when added here. private static struct transformedBounds { transform t; freezableBounds link; }; private transformedBounds[] tlinks; // The sizing data. It cannot be modified once this object is frozen. private coords2 point, min, max; // A bound represented by a path. Using the path instead of the bounding // box means it will be accurate after a transformation by coordinates. private path[] pathBounds; // A bound represented by a path and a pen. // As often many paths use the same pen, we store an array of paths. private static struct pathpen { path[] g; pen p; void operator init(path g, pen p) { this.g.push(g); this.p=p; } } private static pathpen operator *(transform t, pathpen pp) { // Should the pen be transformed? pathpen newpp; for (path g : pp.g) newpp.g.push(t*g); newpp.p=pp.p; return newpp; } // WARNING: Due to crazy optimizations, if this array is changed between an // empty and non-empty state, the assignment of a method to // addPath(path,pen) must also change. private pathpen[] pathpenBounds; // Once frozen, the sizing is immutable, and therefore we can compute and // store the extremal coordinates. public static struct extremes { coord[] left, bottom, right, top; void operator init(coord[] left, coord[] bottom, coord[] right, coord[] top) { this.left=left; this.bottom=bottom; this.right=right; this.top=top; } } private static void addMaxToExtremes(extremes e, pair user, pair truesize) { addIfMaximal(e.right, user.x, truesize.x); addIfMaximal(e.top, user.y, truesize.y); } private static void addMinToExtremes(extremes e, pair user, pair truesize) { addIfMinimal(e.left, user.x, truesize.x); addIfMinimal(e.bottom, user.y, truesize.y); } private static void addMaxToExtremes(extremes e, coords2 coords) { addIfMaximal(e.right, coords.x); addIfMaximal(e.top, coords.y); } private static void addMinToExtremes(extremes e, coords2 coords) { addIfMinimal(e.left, coords.x); addIfMinimal(e.bottom, coords.y); } private extremes cachedExtremes=null; // Once frozen, getMutable returns a new object based on this one, which can // be modified. freezableBounds getMutable() { assert(frozen); var f=new freezableBounds; f.links.push(this); return f; } freezableBounds transformed(transform t) { // Freeze these bounds, as we are storing a reference to them. freeze(); var tlink=new transformedBounds; tlink.t=t; tlink.link=this; var b=new freezableBounds; b.tlinks.push(tlink); return b; } void append(freezableBounds b) { // Check that we can modify the object. assert(!frozen); //TODO: If b is "small", ie. a single tlink or cliplink, just copy the //link. // As we only reference b, we must freeze it to ensure it does not change. b.freeze(); links.push(b); } void addPoint(pair user, pair truesize) { assert(!frozen); point.push(user, truesize); } void addBox(pair userMin, pair userMax, pair trueMin, pair trueMax) { assert(!frozen); this.min.push(userMin, trueMin); this.max.push(userMax, trueMax); } void addPath(path g) { // This, and other asserts have been removed to speed things up slightly. //assert(!frozen); this.pathBounds.push(g); } void addPath(path[] g) { //assert(!frozen); this.pathBounds.append(g); } // To squeeze out a bit more performance, this method is either assigned // addPathToNonEmptyArray or addPathToEmptyArray depending on the state of // the pathpenBounds array. void addPath(path g, pen p); private void addPathToNonEmptyArray(path g, pen p) { //assert(!frozen); //assert(!pathpenBounds.empty()); var pp=pathpenBounds[0]; // Test if the pens are equal or have the same bounds. if (pp.p == p || (min(pp.p) == min(p) && max(pp.p) == max(p))) { // If this path has the same pen as the last one, just add it to the // array corresponding to that pen. pp.g.push(g); } else { // A different pen. Start a new bound and put it on the front. Put // the old bound at the end of the array. pathpenBounds[0]=pathpen(g,p); pathpenBounds.push(pp); } } void addPathToEmptyArray(path g, pen p) { //assert(!frozen); //assert(pathpenBounds.empty()); pathpenBounds.push(pathpen(g,p)); addPath=addPathToNonEmptyArray; } // Initial setting for addPath. addPath=addPathToEmptyArray; // Transform the sizing info by t then add the result to the coords // structure. private void accumulateCoords(transform t, coords2 coords) { for (var link : links) link.accumulateCoords(t, coords); for (var tlink : tlinks) tlink.link.accumulateCoords(t*tlink.t, coords); addTransformedCoords(coords, t, this.point, this.min, this.max); for (var g : pathBounds) { g=t*g; coords.push(min(g), (0,0)); coords.push(max(g), (0,0)); } for (var pp: pathpenBounds) { pair pm=min(pp.p), pM=max(pp.p); for (var g : pp.g) { g=t*g; coords.push(min(g), pm); coords.push(max(g), pM); } } } // Add all of the sizing info to the given coords structure. private void accumulateCoords(coords2 coords) { for (var link : links) link.accumulateCoords(coords); for (var tlink : tlinks) tlink.link.accumulateCoords(tlink.t, coords); coords.append(this.point); coords.append(this.min); coords.append(this.max); for (var g : pathBounds) { coords.push(min(g), (0,0)); coords.push(max(g), (0,0)); } for (var pp: pathpenBounds) { pair pm=min(pp.p), pM=max(pp.p); for (var g : pp.g) { coords.push(min(g), pm); coords.push(max(g), pM); } } } // Returns all of the coords that this sizing data represents. private coords2 allCoords() { coords2 coords; accumulateCoords(coords); return coords; } private void addLocalsToExtremes(transform t, extremes e) { coords2 coords; addTransformedCoords(coords, t, this.point, this.min, this.max); addMinToExtremes(e, coords); addMaxToExtremes(e, coords); if (pathBounds.length > 0) { addMinToExtremes(e, minAfterTransform(t, pathBounds), (0,0)); addMaxToExtremes(e, maxAfterTransform(t, pathBounds), (0,0)); } for (var pp : pathpenBounds) { if (pp.g.length > 0) { addMinToExtremes(e, minAfterTransform(t, pp.g), min(pp.p)); addMaxToExtremes(e, maxAfterTransform(t, pp.g), max(pp.p)); } } } private void addToExtremes(transform t, extremes e) { for (var link : links) link.addToExtremes(t, e); for (var tlink : tlinks) tlink.link.addToExtremes(t*tlink.t, e); addLocalsToExtremes(t, e); } private void addLocalsToExtremes(extremes e) { addMinToExtremes(e, point); addMaxToExtremes(e, point); addMinToExtremes(e, min); addMaxToExtremes(e, max); if (pathBounds.length > 0) { addMinToExtremes(e, min(pathBounds), (0,0)); addMaxToExtremes(e, max(pathBounds), (0,0)); } for(var pp : pathpenBounds) { pair m=min(pp.p); pair M=max(pp.p); for(path gg : pp.g) { if (size(gg) > 0) { addMinToExtremes(e,min(gg),m); addMaxToExtremes(e,max(gg),M); } } } } private void addToExtremes(extremes e) { for (var link : links) link.addToExtremes(e); for (var tlink : tlinks) tlink.link.addToExtremes(tlink.t, e); addLocalsToExtremes(e); } private static void write(extremes e) { static void write(coord[] coords) { for (coord c : coords) write(" " + (string)c.user + " u + " + (string)c.truesize); } write("left:"); write(e.left); write("bottom:"); write(e.bottom); write("right:"); write(e.right); write("top:"); write(e.top); } // Returns the extremal coordinates of the sizing data. public extremes extremes() { if (cachedExtremes == null) { freeze(); extremes e; addToExtremes(e); cachedExtremes=e; } return cachedExtremes; } // Helper functions for computing the usersize bounds. usermin and usermax // would be easily computable from extremes, except that the picture // interface actually allows calls that manually change the usermin and // usermax values. Therefore, we have to compute these values separately. private static struct userbounds { bool areSet=false; pair min; pair max; } private static struct boundsAccumulator { pair[] mins; pair[] maxs; void push(pair m, pair M) { mins.push(m); maxs.push(M); } void push(userbounds b) { if (b.areSet) push(b.min, b.max); } void push(transform t, userbounds b) { if (b.areSet) { pair[] box={ t*(b.min.x,b.max.y), t*b.max, t*b.min, t*(b.max.x,b.min.y) }; for (var z : box) push(z,z); } } void pushUserCoords(coords2 min, coords2 max) { int n=min.x.length; assert(min.y.length == n); assert(max.x.length == n); assert(max.y.length == n); for (int i=0; i < n; ++i) push((min.x[i].user, min.y[i].user), (max.x[i].user, max.y[i].user)); } userbounds collapse() { userbounds b; if (mins.length > 0) { b.areSet=true; b.min=minbound(mins); b.max=maxbound(maxs); } else { b.areSet=false; } return b; } } // The user bounds already calculated for this data. private userbounds storedUserBounds=null; private void accumulateUserBounds(boundsAccumulator acc) { if (storedUserBounds != null) { assert(frozen); acc.push(storedUserBounds); } else { acc.pushUserCoords(point, point); acc.pushUserCoords(min, max); if (pathBounds.length > 0) acc.push(min(pathBounds), max(pathBounds)); for (var pp : pathpenBounds) if(size(pp.g) > 0) acc.push(min(pp.g), max(pp.g)); for (var link : links) link.accumulateUserBounds(acc); // Transforms are handled as they were in the old system. for (var tlink : tlinks) { boundsAccumulator tacc; tlink.link.accumulateUserBounds(tacc); acc.push(tlink.t, tacc.collapse()); } } } private void computeUserBounds() { freeze(); boundsAccumulator acc; accumulateUserBounds(acc); storedUserBounds=acc.collapse(); } private userbounds userBounds() { if (storedUserBounds == null) computeUserBounds(); assert(storedUserBounds != null); return storedUserBounds; } // userMin/userMax returns the minimal/maximal userspace coordinate of the // sizing data. As coordinates for objects such as labels can have // significant truesize dimensions, this userMin/userMax values may not // correspond closely to the end of the screen, and are of limited use. // userSetx and userSety determine if there is sizing data in order to even // have userMin/userMax defined. public bool userBoundsAreSet() { return userBounds().areSet; } public pair userMin() { return userBounds().min; } public pair userMax() { return userBounds().max; } // To override the true userMin and userMax bounds, first compute the // userBounds as they should be at this point, then change the values. public void alterUserBound(string which, real val) { // We are changing the bounds data, so it cannot be frozen yet. After the // user bounds are set, however, the sizing data cannot change, so it will // be frozen. assert(!frozen); computeUserBounds(); assert(frozen); var b=storedUserBounds; if (which == "minx") b.min=(val, b.min.y); else if (which == "miny") b.min=(b.min.x, val); else if (which == "maxx") b.max=(val, b.max.y); else { assert(which == "maxy"); b.max=(b.max.x, val); } } // A temporary measure. Stuffs all of the data from the links and paths // into the coords. private void flatten() { assert(!frozen); // First, compute the user bounds, taking into account any manual // alterations. computeUserBounds(); // Calculate all coordinates. coords2 coords=allCoords(); // Erase all the old data. point.erase(); min.erase(); max.erase(); pathBounds.delete(); pathpenBounds.delete(); addPath=addPathToEmptyArray; links.delete(); tlinks.delete(); // Put all of the coordinates into point. point=coords; } void xclip(real Min, real Max) { assert(!frozen); flatten(); point.xclip(Min,Max); min.xclip(Min,Max); max.xclip(Min,Max); // Cap the userBounds. userbounds b=storedUserBounds; b.min=(max(Min, b.min.x), b.min.y); b.max=(min(Max, b.max.x), b.max.y); } void yclip(real Min, real Max) { assert(!frozen); flatten(); point.yclip(Min,Max); min.yclip(Min,Max); max.yclip(Min,Max); // Cap the userBounds. userbounds b=storedUserBounds; b.min=(b.min.x, max(Min, b.min.y)); b.max=(b.max.x, min(Max, b.max.y)); } // Calculate the min for the final frame, given the coordinate transform. pair min(transform t) { extremes e=extremes(); if (e.left.length == 0) return 0; pair a=t*(1,1)-t*(0,0), b=t*(0,0); scaling xs=scaling.build(a.x,b.x); scaling ys=scaling.build(a.y,b.y); return (min(infinity, xs, e.left), min(infinity, ys, e.bottom)); } // Calculate the max for the final frame, given the coordinate transform. pair max(transform t) { extremes e=extremes(); if (e.right.length == 0) return 0; pair a=t*(1,1)-t*(0,0), b=t*(0,0); scaling xs=scaling.build(a.x,b.x); scaling ys=scaling.build(a.y,b.y); return (max(-infinity, xs, e.right), max(-infinity, ys, e.top)); } // Returns the transform for turning user-space pairs into true-space pairs. transform scaling(real xsize, real ysize, real xunitsize, real yunitsize, bool keepAspect, bool warn) { if(xsize == 0 && xunitsize == 0 && ysize == 0 && yunitsize == 0) return identity(); // Get the extremal coordinates. extremes e=extremes(); real sx; if(xunitsize == 0) { if(xsize != 0) sx=calculateScaling("x",e.left,e.right,xsize,warn); } else sx=xunitsize; /* Possible alternative code : real sx=xunitsize != 0 ? xunitsize : xsize != 0 ? calculateScaling("x", Coords.x, xsize, warn) : 0; */ real sy; if(yunitsize == 0) { if(ysize != 0) sy=calculateScaling("y",e.bottom,e.top,ysize,warn); } else sy=yunitsize; if(sx == 0) { sx=sy; if(sx == 0) return identity(); } else if(sy == 0) sy=sx; if(keepAspect && (xunitsize == 0 || yunitsize == 0)) return scale(min(sx,sy)); else return scale(sx,sy); } } struct bounds { private var base=new freezableBounds; // We should probably put this back into picture. bool exact=true; // Called just before modifying the sizing data. It ensures base is // non-frozen. // Note that this is manually inlined for speed reasons in a couple often // called methods below. private void makeMutable() { if (base.frozen) base=base.getMutable(); //assert(!base.frozen); // Disabled for speed reasons. } void erase() { // Just discard the old bounds. base=new freezableBounds; // We don't reset the 'exact' field, for backward compatibility. } bounds copy() { // Freeze the underlying bounds and make a shallow copy. base.freeze(); var b=new bounds; b.base=this.base; b.exact=this.exact; return b; } bounds transformed(transform t) { var b=new bounds; b.base=base.transformed(t); b.exact=this.exact; return b; } void append(bounds b) { makeMutable(); base.append(b.base); } void append(transform t, bounds b) { // makeMutable will be called by append. if (t == identity()) append(b); else append(b.transformed(t)); } void addPoint(pair user, pair truesize) { makeMutable(); base.addPoint(user, truesize); } void addBox(pair userMin, pair userMax, pair trueMin, pair trueMax) { makeMutable(); base.addBox(userMin, userMax, trueMin, trueMax); } void addPath(path g) { //makeMutable(); // Manually inlined here for speed reasons. if (base.frozen) base=base.getMutable(); base.addPath(g); } void addPath(path[] g) { //makeMutable(); // Manually inlined here for speed reasons. if (base.frozen) base=base.getMutable(); base.addPath(g); } void addPath(path g, pen p) { //makeMutable(); // Manually inlined here for speed reasons. if (base.frozen) base=base.getMutable(); base.addPath(g, p); } public bool userBoundsAreSet() { return base.userBoundsAreSet(); } public pair userMin() { return base.userMin(); } public pair userMax() { return base.userMax(); } public void alterUserBound(string which, real val) { makeMutable(); base.alterUserBound(which, val); } void xclip(real Min, real Max) { makeMutable(); base.xclip(Min,Max); } void yclip(real Min, real Max) { makeMutable(); base.yclip(Min,Max); } void clip(pair Min, pair Max) { // TODO: If the user bounds have been manually altered, they may be // incorrect after the clip. xclip(Min.x,Max.x); yclip(Min.y,Max.y); } pair min(transform t) { return base.min(t); } pair max(transform t) { return base.max(t); } transform scaling(real xsize, real ysize, real xunitsize, real yunitsize, bool keepAspect, bool warn) { return base.scaling(xsize, ysize, xunitsize, yunitsize, keepAspect, warn); } } bounds operator *(transform t, bounds b) { return b.transformed(t); } asymptote-3.05/base/plain_filldraw.asy0000644000000000000000000001420415031566105016606 0ustar rootroot// Draw path g on frame f with user-constructed pen p. void makedraw(frame f, path g, pen p, int depth=mantissaBits) { if(depth == 0) return; --depth; path n=nib(p); for(int i=0; i < size(g); ++i) fill(f,shift(point(g,i))*n,p); static real epsilon=1000*realEpsilon; int L=length(g); real stop=L-epsilon; int N=length(n); pair first=point(n,0); pair n0=first; for(int i=0; i < N; ++i) { pair n1=point(n,i+1); pair dir=unit(n1-n0); real t=dirtime(g,-dir)-epsilon; if(straight(g,(int) t)) t=ceil(t); if(t > epsilon && t < stop) { makedraw(f,subpath(g,0,t),p,depth); makedraw(f,subpath(g,t,L),p,depth); return; } real t=dirtime(g,dir); if(straight(g,(int) t)) t=ceil(t); if(t > epsilon && t < stop) { makedraw(f,subpath(g,0,t),p,depth); makedraw(f,subpath(g,t,L),p,depth); return; } n0=n1; } n0=first; for(int i=0; i < N; ++i) { pair n1=point(n,i+1); fill(f,shift(n0)*g--shift(n1)*reverse(g)--cycle,p); n0=n1; } } void draw(frame f, path g, pen p=currentpen) { if(size(nib(p)) == 0) _draw(f,g,p); else { begingroup(f); makedraw(f,g,p); endgroup(f); } } void draw(frame f, explicit path[] g, pen p=currentpen) { for(int i=0; i < g.length; ++i) draw(f,g[i],p); } void draw(frame f, guide[] g, pen p=currentpen) { for(int i=0; i < g.length; ++i) draw(f,g[i],p); } void filldraw(frame f, path[] g, pen fillpen=currentpen, pen drawpen=currentpen) { begingroup(f); fill(f,g,fillpen); draw(f,g,drawpen); endgroup(f); } path[] complement(frame f, path[] g) { static pair margin=(0.5,0.5); return box(minbound(min(f),min(g))-margin,maxbound(max(f),max(g))+margin)^^g; } void unfill(frame f, path[] g, bool copy=true) { clip(f,complement(f,g),evenodd,copy); } void filloutside(frame f, path[] g, pen p=currentpen, bool copy=true) { fill(f,complement(f,g),p+evenodd,copy); } struct filltype { using fill2=void(frame f, path[] g, pen fillpen); fill2 fill2; pen fillpen; pen drawpen; int type; static int Fill=1; static int FillDraw=2; static int Draw=3; static int NoFill=4; static int UnFill=5; void operator init(int type=0, pen fillpen=nullpen, pen drawpen=nullpen, fill2 fill2) { this.type=type; this.fillpen=fillpen; this.drawpen=drawpen; this.fill2=fill2; } void fill(frame f, path[] g, pen p) {fill2(f,g,p);} } path[] margin(path[] g, real xmargin, real ymargin) { if(xmargin != 0 || ymargin != 0) { pair M=max(g); pair m=min(g); real width=M.x-m.x; real height=M.y-m.y; real xfactor=width > 0 ? (width+2xmargin)/width : 1; real yfactor=height > 0 ? (height+2ymargin)/height : 1; g=scale(xfactor,yfactor)*g; g=shift(0.5*(M+m)-0.5*(max(g)+min(g)))*g; } return g; } filltype Fill(real xmargin=0, real ymargin=xmargin, pen p=nullpen) { return filltype(filltype.Fill,p,new void(frame f, path[] g, pen fillpen) { if(p != nullpen) fillpen=p; if(fillpen == nullpen) fillpen=currentpen; fill(f,margin(g,xmargin,ymargin),fillpen); }); } filltype FillDraw(real xmargin=0, real ymargin=xmargin, pen fillpen=nullpen, pen drawpen=nullpen) { return filltype(filltype.FillDraw,fillpen,drawpen, new void(frame f, path[] g, pen Drawpen) { if(drawpen != nullpen) Drawpen=drawpen; pen Fillpen=fillpen == nullpen ? Drawpen : fillpen; if(Fillpen == nullpen) Fillpen=currentpen; if(Drawpen == nullpen) Drawpen=Fillpen; if(cyclic(g[0])) filldraw(f,margin(g,xmargin,ymargin),Fillpen,Drawpen); else draw(f,margin(g,xmargin,ymargin),Drawpen); }); } filltype Draw(real xmargin=0, real ymargin=xmargin, pen p=nullpen) { return filltype(filltype.Draw,drawpen=p, new void(frame f, path[] g, pen drawpen) { pen drawpen=p == nullpen ? drawpen : p; if(drawpen == nullpen) drawpen=currentpen; draw(f,margin(g,xmargin,ymargin),drawpen); }); } filltype NoFill=filltype(filltype.NoFill,new void(frame f, path[] g, pen p) { draw(f,g,p); }); filltype UnFill(real xmargin=0, real ymargin=xmargin) { return filltype(filltype.UnFill,new void(frame f, path[] g, pen) { unfill(f,margin(g,xmargin,ymargin)); }); } filltype FillDraw=FillDraw(), Fill=Fill(), Draw=Draw(), UnFill=UnFill(); // Fill varying radially from penc at the center of the bounding box to // penr at the edge. filltype RadialShade(pen penc, pen penr) { return filltype(new void(frame f, path[] g, pen) { pair c=(min(g)+max(g))/2; radialshade(f,g,penc,c,0,penr,c,abs(max(g)-min(g))/2); }); } filltype RadialShadeDraw(real xmargin=0, real ymargin=xmargin, pen penc, pen penr, pen drawpen=nullpen) { return filltype(new void(frame f, path[] g, pen Drawpen) { if(drawpen != nullpen) Drawpen=drawpen; if(Drawpen == nullpen) Drawpen=penc; pair c=(min(g)+max(g))/2; if(cyclic(g[0])) radialshade(f,margin(g,xmargin,ymargin),penc,c,0,penr,c, abs(max(g)-min(g))/2); draw(f,margin(g,xmargin,ymargin),Drawpen); }); } // Fill the region in frame dest underneath frame src and return the // boundary of src. path fill(frame dest, frame src, filltype filltype=NoFill, real xmargin=0, real ymargin=xmargin) { pair z=(xmargin,ymargin); path g=box(min(src)-z,max(src)+z); filltype.fill(dest,g,nullpen); return g; } // Add frame dest to frame src with optional grouping and background fill. void add(frame dest, frame src, bool group, filltype filltype=NoFill, bool above=true) { if(above) { if(filltype != NoFill) fill(dest,src,filltype); if(group) begingroup(dest); add(dest,src); if(group) endgroup(dest); } else { if(group) { frame f; endgroup(f); prepend(dest,f); } prepend(dest,src); if(group) { frame f; begingroup(f); prepend(dest,f); } if(filltype != NoFill) { frame f; fill(f,src,filltype); prepend(dest,f); } } } void add(frame dest, frame src, filltype filltype, bool above=filltype.type != filltype.UnFill) { if(filltype != NoFill) fill(dest,src,filltype); (above ? add : prepend)(dest,src); } asymptote-3.05/base/CAD.asy0000644000000000000000000002513015031566105014206 0ustar rootrootstruct sCAD { int nLineGroup = 0; // 0-3 pen // A pA, pVisibleEdge, // Sichtbare Kanten pVisibleContour, // Sichtbarer Umriss pUsableWindingLength, // Nutzbare Gewindelänge pSystemLine, // Systemlinie (Stahlbau) pDiagramCurve, // Kurve in Diagrammen pSurfaceStructure, // Oberflächenstrukturen // B pB, pLightEdge, // Lichtkante pMeasureLine, // Maßlinie pMeasureHelpLine, // Maßhilfslinie pMeasureLineBound, // Maßlinienbegrenzung pReferenceLine, // Hinweislinie pHatch, // Schraffur pWindingGround, // Gewindegrund pDiagonalCross, // Diagonalkreuz pBendLine, // Biegelinie pProjectionLine, // Projektionslinie pGrid, // Rasterlinien // C pC, pFreehand, // Begrenzung abgebrochener oder unterbrochener // Schnitte, wenn die Begrenzung // keine Mittellinie ist // E pE, pSurfaceTreatmentAllowed, // Bereich zulässiger Oberflächenbehandlung // F pF, pInvisibleEdge, // unsichtbare Kante pInvisibleContour, // unsichtbarer Umriss // G pG, pMiddleLine, // Mittellinie pSymmetryLine, // Symmetrielinie pPartialCircle, // Teilkreis pCircularHole, // Lochkreis pDivisionPlane, // Teilungsebene pTransferLine, // Trajektorien (Übertragungslinien) // J pJ, pCuttingPlane, // Schnittebene pSurfaceTreatmentRequested, // Bereich geforderter Behandlungen // K pK, pContourBeforeDeformation, // Umrisse vor Verformung pAdjacentPartContour, // Umrisse angrenzender Teile pEndShapeRawMaterial, // Fertigformen in Rohteilen pContourEligibleType, // Umrisse wahlweiser Ausführungen pPartInFrontOfCuttingPlane; // Teile vor der Schnittebene static sCAD Create(int nLineGroup = 1) { sCAD cad = new sCAD; if ( nLineGroup < 0 ) nLineGroup = 0; if ( nLineGroup > 3 ) nLineGroup = 3; cad.nLineGroup = nLineGroup; restricted real[] dblFullWidth = {0.35mm, 0.5mm, 0.7mm, 1.0mm}; restricted real[] dblHalfWidth = {0.18mm, 0.25mm, 0.35mm, 0.5mm}; pen pFullWidth = linewidth(dblFullWidth[nLineGroup]); pen pHalfWidth = linewidth(dblHalfWidth[nLineGroup]); // Linienarten: // A cad.pA = cad.pVisibleEdge = cad.pVisibleContour = cad.pUsableWindingLength = cad.pSystemLine = cad.pDiagramCurve = cad.pSurfaceStructure = pFullWidth + solid; // B cad.pB = cad.pLightEdge = cad.pMeasureLine = cad.pMeasureHelpLine = cad.pMeasureLineBound = cad.pReferenceLine = cad.pHatch = cad.pWindingGround = cad.pDiagonalCross = cad.pBendLine = cad.pProjectionLine = cad.pGrid = pHalfWidth + solid; // C cad.pC = cad.pFreehand = pHalfWidth + solid; // D // Missing, as I have no idea how to implement this... // E cad.pE = cad.pSurfaceTreatmentAllowed = pFullWidth + linetype(new real[] {10,2.5}); // F cad.pF = cad.pInvisibleEdge = cad.pInvisibleContour = pHalfWidth + linetype(new real[] {20,5}); // G cad.pG = cad.pMiddleLine = cad.pSymmetryLine = cad.pPartialCircle = cad.pCircularHole = cad.pDivisionPlane = cad.pTransferLine = pHalfWidth + linetype(new real[] {40,5,5,5}); // H // see J // I // This letter is not used in DIN 15 // J cad.pJ = cad.pCuttingPlane = cad.pSurfaceTreatmentRequested = pFullWidth + linetype(new real[] {20,2.5,2.5,2.5}); // K cad.pK = cad.pContourBeforeDeformation = cad.pAdjacentPartContour = cad.pEndShapeRawMaterial = cad.pContourEligibleType = cad.pPartInFrontOfCuttingPlane = pHalfWidth + linetype(new real[] {40,5,5,5,5,5}); return cad; } // end of Create real GetMeasurementBoundSize(bool bSmallBound = false) { if ( bSmallBound ) return 1.5 * linewidth(pVisibleEdge) / 2; else return 5 * linewidth(pVisibleEdge); } path GetMeasurementBound(bool bSmallBound = false) { if ( bSmallBound ) return scale(GetMeasurementBoundSize(bSmallBound = bSmallBound)) * unitcircle; else return (0,0) -- (-cos(radians(7.5)), -sin(radians(7.5))) * GetMeasurementBoundSize(bSmallBound = bSmallBound) -- (-cos(radians(7.5)), sin(radians(7.5))) * GetMeasurementBoundSize(bSmallBound = bSmallBound) -- cycle; } void MeasureLine(picture pic = currentpicture, Label L, pair pFrom, pair pTo, real dblLeft = 0, real dblRight = 0, real dblRelPosition = 0.5, bool bSmallBound = false) { if ( dblLeft < 0 ) dblLeft = 0; if ( dblRight < 0 ) dblRight = 0; if ( (dblLeft > 0) && (dblRight == 0) ) dblRight = dblLeft; if ( (dblLeft == 0) && (dblRight > 0) ) dblLeft = dblRight; pair pDiff = pTo - pFrom; real dblLength = length(pDiff); pair pBegin = pFrom - dblLeft * unit(pDiff); pair pEnd = pTo + dblRight * unit(pDiff); if ( bSmallBound ) { draw( pic = pic, g = pBegin--pEnd, p = pMeasureLine); } else { real dblBoundSize = GetMeasurementBoundSize(bSmallBound = bSmallBound); if ( dblLeft == 0 ) draw( pic = pic, g = (pFrom + dblBoundSize/2 * unit(pDiff)) -- (pTo - dblBoundSize/2 * unit(pDiff)), p = pMeasureLine); else draw( pic = pic, g = pBegin -- (pFrom - dblBoundSize/2 * unit(pDiff)) ^^ pFrom -- pTo ^^ (pTo + dblBoundSize/2 * unit(pDiff)) -- pEnd, p = pMeasureLine); } path gArrow = GetMeasurementBound(bSmallBound = bSmallBound); picture picL; label(picL, L); pair pLabelSize = 1.2 * (max(picL) - min(picL)); if ( dblLeft == 0 ) { fill( pic = pic, g = shift(pFrom) * rotate(degrees(-pDiff)) * gArrow, p = pVisibleEdge); fill( pic = pic, g = shift(pTo) * rotate(degrees(pDiff)) * gArrow, p = pVisibleEdge); if ( dblRelPosition < 0 ) dblRelPosition = 0; if ( dblRelPosition > 1 ) dblRelPosition = 1; label( pic = pic, L = rotate(degrees(pDiff)) * L, position = pFrom + dblRelPosition * pDiff + unit(rotate(90)*pDiff) * pLabelSize.y / 2); } else { fill( pic = pic, g = shift(pFrom) * rotate(degrees(pDiff)) * gArrow, p = pVisibleEdge); fill( pic = pic, g = shift(pTo) * rotate(degrees(-pDiff)) * gArrow, p = pVisibleEdge); if ( (dblRelPosition >= 0) && (dblRelPosition <= 1) ) label( pic = pic, L = rotate(degrees(pDiff)) * L, position = pFrom + dblRelPosition * pDiff + unit(rotate(90)*pDiff) * pLabelSize.y / 2); else { // draw label outside if ( dblRelPosition < 0 ) label( pic = pic, L = rotate(degrees(pDiff)) * L, position = pBegin + pLabelSize.x / 2 * unit(pDiff) + unit(rotate(90)*pDiff) * pLabelSize.y / 2); else // dblRelPosition > 1 label( pic = pic, L = rotate(degrees(pDiff)) * L, position = pEnd - pLabelSize.x / 2 * unit(pDiff) + unit(rotate(90)*pDiff) * pLabelSize.y / 2); } } } // end of MeasureLine void MeasureParallel(picture pic = currentpicture, Label L, pair pFrom, pair pTo, real dblDistance, // Variables from MeasureLine real dblLeft = 0, real dblRight = 0, real dblRelPosition = 0.5, bool bSmallBound = false) { pair pDiff = pTo - pFrom; pair pPerpendicularDiff = unit(rotate(90) * pDiff); real dblDistancePlus; if ( dblDistance >= 0 ) dblDistancePlus = dblDistance + 1mm; else dblDistancePlus = dblDistance - 1mm; draw( pic = pic, g = pFrom--(pFrom + dblDistancePlus*pPerpendicularDiff), p = pMeasureHelpLine ); draw( pic = pic, g = pTo--(pTo + dblDistancePlus*pPerpendicularDiff), p = pMeasureHelpLine ); MeasureLine( pic = pic, L = L, pFrom = pFrom + dblDistance * pPerpendicularDiff, pTo = pTo + dblDistance * pPerpendicularDiff, dblLeft = dblLeft, dblRight = dblRight, dblRelPosition = dblRelPosition, bSmallBound = bSmallBound); } // end of MeasureParallel path MakeFreehand(pair pFrom, pair pTo, real dblRelDivisionLength = 12.5, real dblRelDistortion = 2.5, bool bIncludeTo = true) { pair pDiff = pTo - pFrom; pair pPerpendicular = dblRelDistortion * linewidth(pFreehand) * unit(rotate(90) * pDiff); int nNumOfSubDivisions=ceil(length(pDiff) / (dblRelDivisionLength * linewidth(pFreehand))); restricted real[] dblDistortion = {1, -.5, .75, -.25, .25, -1, .5, -.75, .25, -.25}; int nDistortion = 0; guide g; g = pFrom; for ( int i = 1 ; i < nNumOfSubDivisions ; ++i ) { g = g .. (pFrom + pDiff * i / (real)nNumOfSubDivisions + pPerpendicular * dblDistortion[nDistortion]); nDistortion += 1; if ( nDistortion > 9 ) nDistortion = 0; } if ( bIncludeTo ) g = g .. pTo; return g; } // end of MakeFreehand } // end of CAD asymptote-3.05/base/lmfit.asy0000644000000000000000000006141515031566105014740 0ustar rootroot/* Copyright (c) 2009 Philipp Stephani Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Fitting $n$ data points $(x_1, y_1 \pm \Delta y_1), \dots, (x_n, y_n \pm \Delta y_n)$ to a function $f$ that depends on $m$ parameters $a_1, \dots, a_m$ means minimizing the least-squares sum % \begin{equation*} \sum_{i = 1}^n \left( \frac{y_i - f(a_1, \dots, a_m; x_i)}{\Delta y_i} \right)^2 \end{equation*} % with respect to the parameters $a_1, \dots, a_m$. */ /* This module provides an implementation of the Levenberg--Marquardt (LM) algorithm, converted from the C lmfit routine by Joachim Wuttke (see http://www.messen-und-deuten.de/lmfit/). Implementation strategy: Fortunately, Asymptote's syntax is very similar to C, and the original code cleanly separates the customizable parts (user-provided data, output routines, etc.) from the dirty number crunching. Thus, mst of the code was just copied and slightly modified from the original source files. I have amended the lm_data_type structure and the callback routines with a weight array that can be used to provide experimental errors. I have also created two simple wrapper functions. */ // copied from the C code private real LM_MACHEP = realEpsilon; private real LM_DWARF = realMin; private real LM_SQRT_DWARF = sqrt(realMin); private real LM_SQRT_GIANT = sqrt(realMax); private real LM_USERTOL = 30 * LM_MACHEP; restricted string lm_infmsg[] = { "improper input parameters", "the relative error in the sum of squares is at most tol", "the relative error between x and the solution is at most tol", "both errors are at most tol", "fvec is orthogonal to the columns of the jacobian to machine precision", "number of calls to fcn has reached or exceeded maxcall*(n+1)", "ftol is too small: no further reduction in the sum of squares is possible", "xtol too small: no further improvement in approximate solution x possible", "gtol too small: no further improvement in approximate solution x possible", "not enough memory", "break requested within function evaluation" }; restricted string lm_shortmsg[] = { "invalid input", "success (f)", "success (p)", "success (f,p)", "degenerate", "call limit", "failed (f)", "failed (p)", "failed (o)", "no memory", "user break" }; // copied from the C code and amended with the weight (user_w) array struct lm_data_type { real[] user_t; real[] user_y; real[] user_w; real user_func(real user_t_point, real[] par); }; // Asymptote has no pointer support, so we need reference wrappers for // the int and real types struct lm_int_type { int val; void operator init(int val) { this.val = val; } }; struct lm_real_type { real val; void operator init(real val) { this.val = val; } }; // copied from the C code; the lm_initialize_control function turned // into a constructor struct lm_control_type { real ftol; real xtol; real gtol; real epsilon; real stepbound; real fnorm; int maxcall; lm_int_type nfev; lm_int_type info; void operator init() { maxcall = 100; epsilon = LM_USERTOL; stepbound = 100; ftol = LM_USERTOL; xtol = LM_USERTOL; gtol = LM_USERTOL; } }; // copied from the C code typedef void lm_evaluate_ftype(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info); typedef void lm_print_ftype(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev); // copied from the C code private real SQR(real x) { return x * x; } // Asymptote doesn't support pointers to arbitrary array elements, so // we provide an offset parameter. private real lm_enorm(int n, real[] x, int offset=0) { real s1 = 0; real s2 = 0; real s3 = 0; real x1max = 0; real x3max = 0; real agiant = LM_SQRT_GIANT / n; real xabs, temp; for (int i = 0; i < n; ++i) { xabs = fabs(x[offset + i]); if (xabs > LM_SQRT_DWARF && xabs < agiant) { s2 += SQR(xabs); continue; } if (xabs > LM_SQRT_DWARF) { if (xabs > x1max) { temp = x1max / xabs; s1 = 1 + s1 * SQR(temp); x1max = xabs; } else { temp = xabs / x1max; s1 += SQR(temp); } continue; } if (xabs > x3max) { temp = x3max / xabs; s3 = 1 + s3 * SQR(temp); x3max = xabs; } else { if (xabs != 0.0) { temp = xabs / x3max; s3 += SQR(temp); } } } if (s1 != 0) return x1max * sqrt(s1 + (s2 / x1max) / x1max); if (s2 != 0) { if (s2 >= x3max) return sqrt(s2 * (1 + (x3max / s2) * (x3max * s3))); else return sqrt(x3max * ((s2 / x3max) + (x3max * s3))); } return x3max * sqrt(s3); } // This function calculated the vector whose square sum is to be // minimized. We use a slight modification of the original code that // includes the weight factor. The user may provide different // customizations. void lm_evaluate_default(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info) { for (int i = 0; i < m_dat; ++i) { fvec[i] = data.user_w[i] * (data.user_y[i] - data.user_func(data.user_t[i], par)); } } // Helper functions to print padded strings and numbers (until // Asymptote provides a real printf function) private string pad(string str, int count, string pad=" ") { string res = str; while (length(res) < count) res = pad + res; return res; } private string pad(int num, int digits, string pad=" ") { return pad(string(num), digits, pad); } private string pad(real num, int digits, string pad=" ") { return pad(string(num), digits, pad); } // Similar to the C code, also prints weights void lm_print_default(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev) { real f, y, t, w; int i; if (iflag == 2) { write("trying step in gradient direction"); } else if (iflag == 1) { write(format("determining gradient (iteration %d)", iter)); } else if (iflag == 0) { write("starting minimization"); } else if (iflag == -1) { write(format("terminated after %d evaluations", nfev)); } write(" par: ", none); for (i = 0; i < n_par; ++i) { write(" " + pad(par[i], 12), none); } write(" => norm: " + pad(lm_enorm(m_dat, fvec), 12)); if (iflag == -1) { write(" fitting data as follows:"); for (i = 0; i < m_dat; ++i) { t = data.user_t[i]; y = data.user_y[i]; w = data.user_w[i]; f = data.user_func(t, par); write(format(" t[%2d]=", i) + pad(t, 12) + " y=" + pad(y, 12) + " w=" + pad(w, 12) + " fit=" + pad(f, 12) + " residue=" + pad(y - f, 12)); } } } // Prints nothing void lm_print_quiet(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev) { } // copied from the C code private void lm_qrfac(int m, int n, real[] a, bool pivot, int[] ipvt, real[] rdiag, real[] acnorm, real[] wa) { int i, j, k, kmax, minmn; real ajnorm, sum, temp; static real p05 = 0.05; for (j = 0; j < n; ++j) { acnorm[j] = lm_enorm(m, a, j * m); rdiag[j] = acnorm[j]; wa[j] = rdiag[j]; if (pivot) ipvt[j] = j; } minmn = min(m, n); for (j = 0; j < minmn; ++j) { while (pivot) { kmax = j; for (k = j + 1; k < n; ++k) if (rdiag[k] > rdiag[kmax]) kmax = k; if (kmax == j) break; for (i = 0; i < m; ++i) { temp = a[j * m + i]; a[j * m + i] = a[kmax * m + i]; a[kmax * m + i] = temp; } rdiag[kmax] = rdiag[j]; wa[kmax] = wa[j]; k = ipvt[j]; ipvt[j] = ipvt[kmax]; ipvt[kmax] = k; break; } ajnorm = lm_enorm(m - j, a, j * m + j); if (ajnorm == 0.0) { rdiag[j] = 0; continue; } if (a[j * m + j] < 0.0) ajnorm = -ajnorm; for (i = j; i < m; ++i) a[j * m + i] /= ajnorm; a[j * m + j] += 1; for (k = j + 1; k < n; ++k) { sum = 0; for (i = j; i < m; ++i) sum += a[j * m + i] * a[k * m + i]; temp = sum / a[j + m * j]; for (i = j; i < m; ++i) a[k * m + i] -= temp * a[j * m + i]; if (pivot && rdiag[k] != 0.0) { temp = a[m * k + j] / rdiag[k]; temp = max(0.0, 1 - SQR(temp)); rdiag[k] *= sqrt(temp); temp = rdiag[k] / wa[k]; if (p05 * SQR(temp) <= LM_MACHEP) { rdiag[k] = lm_enorm(m - j - 1, a, m * k + j + 1); wa[k] = rdiag[k]; } } } rdiag[j] = -ajnorm; } } // copied from the C code private void lm_qrsolv(int n, real[] r, int ldr, int[] ipvt, real[] diag, real[] qtb, real[] x, real[] sdiag, real[] wa) { static real p25 = 0.25; static real p5 = 0.5; int i, kk, j, k, nsing; real qtbpj, sum, temp; real _sin, _cos, _tan, _cot; for (j = 0; j < n; ++j) { for (i = j; i < n; ++i) r[j * ldr + i] = r[i * ldr + j]; x[j] = r[j * ldr + j]; wa[j] = qtb[j]; } for (j = 0; j < n; ++j) { while (diag[ipvt[j]] != 0.0) { for (k = j; k < n; ++k) sdiag[k] = 0.0; sdiag[j] = diag[ipvt[j]]; qtbpj = 0.; for (k = j; k < n; ++k) { if (sdiag[k] == 0.) continue; kk = k + ldr * k; if (fabs(r[kk]) < fabs(sdiag[k])) { _cot = r[kk] / sdiag[k]; _sin = p5 / sqrt(p25 + p25 * _cot * _cot); _cos = _sin * _cot; } else { _tan = sdiag[k] / r[kk]; _cos = p5 / sqrt(p25 + p25 * _tan * _tan); _sin = _cos * _tan; } r[kk] = _cos * r[kk] + _sin * sdiag[k]; temp = _cos * wa[k] + _sin * qtbpj; qtbpj = -_sin * wa[k] + _cos * qtbpj; wa[k] = temp; for (i = k + 1; i < n; ++i) { temp = _cos * r[k * ldr + i] + _sin * sdiag[i]; sdiag[i] = -_sin * r[k * ldr + i] + _cos * sdiag[i]; r[k * ldr + i] = temp; } } break; } sdiag[j] = r[j * ldr + j]; r[j * ldr + j] = x[j]; } nsing = n; for (j = 0; j < n; ++j) { if (sdiag[j] == 0.0 && nsing == n) nsing = j; if (nsing < n) wa[j] = 0; } for (j = nsing - 1; j >= 0; --j) { sum = 0; for (i = j + 1; i < nsing; ++i) sum += r[j * ldr + i] * wa[i]; wa[j] = (wa[j] - sum) / sdiag[j]; } for (j = 0; j < n; ++j) x[ipvt[j]] = wa[j]; } // copied from the C code private void lm_lmpar(int n, real[] r, int ldr, int[] ipvt, real[] diag, real[] qtb, real delta, lm_real_type par, real[] x, real[] sdiag, real[] wa1, real[] wa2) { static real p1 = 0.1; static real p001 = 0.001; int nsing = n; real parl = 0.0; int i, iter, j; real dxnorm, fp, fp_old, gnorm, parc, paru; real sum, temp; for (j = 0; j < n; ++j) { wa1[j] = qtb[j]; if (r[j * ldr + j] == 0 && nsing == n) nsing = j; if (nsing < n) wa1[j] = 0; } for (j = nsing - 1; j >= 0; --j) { wa1[j] = wa1[j] / r[j + ldr * j]; temp = wa1[j]; for (i = 0; i < j; ++i) wa1[i] -= r[j * ldr + i] * temp; } for (j = 0; j < n; ++j) x[ipvt[j]] = wa1[j]; iter = 0; for (j = 0; j < n; ++j) wa2[j] = diag[j] * x[j]; dxnorm = lm_enorm(n, wa2); fp = dxnorm - delta; if (fp <= p1 * delta) { par.val = 0; return; } if (nsing >= n) { for (j = 0; j < n; ++j) wa1[j] = diag[ipvt[j]] * wa2[ipvt[j]] / dxnorm; for (j = 0; j < n; ++j) { sum = 0.0; for (i = 0; i < j; ++i) sum += r[j * ldr + i] * wa1[i]; wa1[j] = (wa1[j] - sum) / r[j + ldr * j]; } temp = lm_enorm(n, wa1); parl = fp / delta / temp / temp; } for (j = 0; j < n; ++j) { sum = 0; for (i = 0; i <= j; ++i) sum += r[j * ldr + i] * qtb[i]; wa1[j] = sum / diag[ipvt[j]]; } gnorm = lm_enorm(n, wa1); paru = gnorm / delta; if (paru == 0.0) paru = LM_DWARF / min(delta, p1); par.val = max(par.val, parl); par.val = min(par.val, paru); if (par.val == 0.0) par.val = gnorm / dxnorm; for (;; ++iter) { if (par.val == 0.0) par.val = max(LM_DWARF, p001 * paru); temp = sqrt(par.val); for (j = 0; j < n; ++j) wa1[j] = temp * diag[j]; lm_qrsolv(n, r, ldr, ipvt, wa1, qtb, x, sdiag, wa2); for (j = 0; j < n; ++j) wa2[j] = diag[j] * x[j]; dxnorm = lm_enorm(n, wa2); fp_old = fp; fp = dxnorm - delta; if (fabs(fp) <= p1 * delta || (parl == 0.0 && fp <= fp_old && fp_old < 0.0) || iter == 10) break; for (j = 0; j < n; ++j) wa1[j] = diag[ipvt[j]] * wa2[ipvt[j]] / dxnorm; for (j = 0; j < n; ++j) { wa1[j] = wa1[j] / sdiag[j]; for (i = j + 1; i < n; ++i) wa1[i] -= r[j * ldr + i] * wa1[j]; } temp = lm_enorm(n, wa1); parc = fp / delta / temp / temp; if (fp > 0) parl = max(parl, par.val); else if (fp < 0) paru = min(paru, par.val); par.val = max(parl, par.val + parc); } } // copied from the C code; the main function void lm_lmdif(int m, int n, real[] x, real[] fvec, real ftol, real xtol, real gtol, int maxfev, real epsfcn, real[] diag, int mode, real factor, lm_int_type info, lm_int_type nfev, real[] fjac, int[] ipvt, real[] qtf, real[] wa1, real[] wa2, real[] wa3, real[] wa4, lm_evaluate_ftype evaluate, lm_print_ftype printout, lm_data_type data) { static real p1 = 0.1; static real p5 = 0.5; static real p25 = 0.25; static real p75 = 0.75; static real p0001 = 1.0e-4; nfev.val = 0; int iter = 1; lm_real_type par = lm_real_type(0); real delta = 0; real xnorm = 0; real temp = max(epsfcn, LM_MACHEP); real eps = sqrt(temp); int i, j; real actred, dirder, fnorm, fnorm1, gnorm, pnorm, prered, ratio, step, sum, temp1, temp2, temp3; if ((n <= 0) || (m < n) || (ftol < 0.0) || (xtol < 0.0) || (gtol < 0.0) || (maxfev <= 0) || (factor <= 0)) { info.val = 0; return; } if (mode == 2) { for (j = 0; j < n; ++j) { if (diag[j] <= 0.0) { info.val = 0; return; } } } info.val = 0; evaluate(x, m, fvec, data, info); if(printout != null) printout(n, x, m, fvec, data, 0, 0, ++nfev.val); if (info.val < 0) return; fnorm = lm_enorm(m, fvec); do { for (j = 0; j < n; ++j) { temp = x[j]; step = eps * fabs(temp); if (step == 0.0) step = eps; x[j] = temp + step; info.val = 0; evaluate(x, m, wa4, data, info); if(printout != null) printout(n, x, m, wa4, data, 1, iter, ++nfev.val); if (info.val < 0) return; for (i = 0; i < m; ++i) fjac[j * m + i] = (wa4[i] - fvec[i]) / (x[j] - temp); x[j] = temp; } lm_qrfac(m, n, fjac, true, ipvt, wa1, wa2, wa3); if (iter == 1) { if (mode != 2) { for (j = 0; j < n; ++j) { diag[j] = wa2[j]; if (wa2[j] == 0.0) diag[j] = 1.0; } } for (j = 0; j < n; ++j) wa3[j] = diag[j] * x[j]; xnorm = lm_enorm(n, wa3); delta = factor * xnorm; if (delta == 0.0) delta = factor; } for (i = 0; i < m; ++i) wa4[i] = fvec[i]; for (j = 0; j < n; ++j) { temp3 = fjac[j * m + j]; if (temp3 != 0.0) { sum = 0; for (i = j; i < m; ++i) sum += fjac[j * m + i] * wa4[i]; temp = -sum / temp3; for (i = j; i < m; ++i) wa4[i] += fjac[j * m + i] * temp; } fjac[j * m + j] = wa1[j]; qtf[j] = wa4[j]; } gnorm = 0; if (fnorm != 0) { for (j = 0; j < n; ++j) { if (wa2[ipvt[j]] == 0) continue; sum = 0.0; for (i = 0; i <= j; ++i) sum += fjac[j * m + i] * qtf[i] / fnorm; gnorm = max(gnorm, fabs(sum / wa2[ipvt[j]])); } } if (gnorm <= gtol) { info.val = 4; return; } if (mode != 2) { for (j = 0; j < n; ++j) diag[j] = max(diag[j], wa2[j]); } do { lm_lmpar(n, fjac, m, ipvt, diag, qtf, delta, par, wa1, wa2, wa3, wa4); for (j = 0; j < n; ++j) { wa1[j] = -wa1[j]; wa2[j] = x[j] + wa1[j]; wa3[j] = diag[j] * wa1[j]; } pnorm = lm_enorm(n, wa3); if (nfev.val <= 1 + n) delta = min(delta, pnorm); info.val = 0; evaluate(wa2, m, wa4, data, info); if(printout != null) printout(n, x, m, wa4, data, 2, iter, ++nfev.val); if (info.val < 0) return; fnorm1 = lm_enorm(m, wa4); if (p1 * fnorm1 < fnorm) actred = 1 - SQR(fnorm1 / fnorm); else actred = -1; for (j = 0; j < n; ++j) { wa3[j] = 0; for (i = 0; i <= j; ++i) wa3[i] += fjac[j * m + i] * wa1[ipvt[j]]; } temp1 = lm_enorm(n, wa3) / fnorm; temp2 = sqrt(par.val) * pnorm / fnorm; prered = SQR(temp1) + 2 * SQR(temp2); dirder = -(SQR(temp1) + SQR(temp2)); ratio = prered != 0 ? actred / prered : 0; if (ratio <= p25) { if (actred >= 0.0) temp = p5; else temp = p5 * dirder / (dirder + p5 * actred); if (p1 * fnorm1 >= fnorm || temp < p1) temp = p1; delta = temp * min(delta, pnorm / p1); par.val /= temp; } else if (par.val == 0.0 || ratio >= p75) { delta = pnorm / p5; par.val *= p5; } if (ratio >= p0001) { for (j = 0; j < n; ++j) { x[j] = wa2[j]; wa2[j] = diag[j] * x[j]; } for (i = 0; i < m; ++i) fvec[i] = wa4[i]; xnorm = lm_enorm(n, wa2); fnorm = fnorm1; ++iter; } info.val = 0; if (fabs(actred) <= ftol && prered <= ftol && p5 * ratio <= 1) info.val = 1; if (delta <= xtol * xnorm) info.val += 2; if (info.val != 0) return; if (nfev.val >= maxfev) info.val = 5; if (fabs(actred) <= LM_MACHEP && prered <= LM_MACHEP && p5 * ratio <= 1) info.val = 6; if (delta <= LM_MACHEP * xnorm) info.val = 7; if (gnorm <= LM_MACHEP) info.val = 8; if (info.val != 0) return; } while (ratio < p0001); } while (true); } // copied from the C code; wrapper of lm_lmdif void lm_minimize(int m_dat, int n_par, real[] par, lm_evaluate_ftype evaluate, lm_print_ftype printout, lm_data_type data, lm_control_type control) { int n = n_par; int m = m_dat; real[] fvec = new real[m]; real[] diag = new real[n]; real[] qtf = new real[n]; real[] fjac = new real[n * m]; real[] wa1 = new real[n]; real[] wa2 = new real[n]; real[] wa3 = new real[n]; real[] wa4 = new real[m]; int[] ipvt = new int[n]; control.info.val = 0; control.nfev.val = 0; lm_lmdif(m, n, par, fvec, control.ftol, control.xtol, control.gtol, control.maxcall * (n + 1), control.epsilon, diag, 1, control.stepbound, control.info, control.nfev, fjac, ipvt, qtf, wa1, wa2, wa3, wa4, evaluate, printout, data); if(printout != null) printout(n, par, m, fvec, data, -1, 0, control.nfev.val); control.fnorm = lm_enorm(m, fvec); if (control.info.val < 0) control.info.val = 10; } // convenience functions; wrappers of lm_minimize /* The structure FitControl specifies various control parameters. */ struct FitControl { real squareSumTolerance; // relative error desired in the sum of squares real approximationTolerance; // relative error between last two approximations real desiredOrthogonality; // orthogonality desired between the residue vector and its derivatives real epsilon; // step used to calculate the jacobian real stepBound; // initial bound to steps in the outer loop int maxIterations; // maximum number of iterations bool verbose; // whether to print detailed information about every iteration, or nothing void operator init(real squareSumTolerance=LM_USERTOL, real approximationTolerance=LM_USERTOL, real desiredOrthogonality=LM_USERTOL, real epsilon=LM_USERTOL, real stepBound=100, int maxIterations=100, bool verbose=false) { this.squareSumTolerance = squareSumTolerance; this.approximationTolerance = approximationTolerance; this.desiredOrthogonality = desiredOrthogonality; this.epsilon = epsilon; this.stepBound = stepBound; this.maxIterations = maxIterations; this.verbose = verbose; } FitControl copy() { FitControl result = new FitControl; result.squareSumTolerance = this.squareSumTolerance; result.approximationTolerance = this.approximationTolerance; result.desiredOrthogonality = this.desiredOrthogonality; result.epsilon = this.epsilon; result.stepBound = this.stepBound; result.maxIterations = this.maxIterations; result.verbose = this.verbose; return result; } }; FitControl operator init() { return FitControl(); } FitControl defaultControl; /* Upon returning, this structure provides information about the fit. */ struct FitResult { real norm; // norm of the residue vector int iterations; // actual number of iterations int status; // status of minimization void operator init(real norm, int iterations, int status) { this.norm = norm; this.iterations = iterations; this.status = status; } }; /* Fits data points to a function that depends on some parameters. Parameters: - xdata: Array of x values. - ydata: Array of y values. - errors: Array of experimental errors; each element must be strictly positive - function: Fit function. - parameters: Parameter array. Before calling fit(), this must contain the initial guesses for the parameters. Upon return, it will contain the solution parameters. - control: object of type FitControl that controls various aspects of the fitting procedure. Returns: An object of type FitResult that conveys information about the fitting process. */ FitResult fit(real[] xdata, real[] ydata, real[] errors, real function(real[], real), real[] parameters, FitControl control=defaultControl) { int m_dat = min(xdata.length, ydata.length); int n_par = parameters.length; lm_evaluate_ftype evaluate = lm_evaluate_default; lm_print_ftype printout = control.verbose ? lm_print_default : lm_print_quiet; lm_data_type data; data.user_t = xdata; data.user_y = ydata; data.user_w = 1 / errors; data.user_func = new real(real x, real[] params) { return function(params, x); }; lm_control_type ctrl; ctrl.ftol = control.squareSumTolerance; ctrl.xtol = control.approximationTolerance; ctrl.gtol = control.desiredOrthogonality; ctrl.epsilon = control.epsilon; ctrl.stepbound = control.stepBound; ctrl.maxcall = control.maxIterations; lm_minimize(m_dat, n_par, parameters, evaluate, printout, data, ctrl); return FitResult(ctrl.fnorm, ctrl.nfev.val, ctrl.info.val); } /* Fits data points to a function that depends on some parameters. Parameters: - xdata: Array of x values. - ydata: Array of y values. - function: Fit function. - parameters: Parameter array. Before calling fit(), this must contain the initial guesses for the parameters. Upon return, it will contain the solution parameters. - control: object of type FitControl that controls various aspects of the fitting procedure. Returns: An object of type FitResult that conveys information about the fitting process. */ FitResult fit(real[] xdata, real[] ydata, real function(real[], real), real[] parameters, FitControl control=defaultControl) { return fit(xdata, ydata, array(min(xdata.length, ydata.length), 1.0), function, parameters, control); } asymptote-3.05/base/ode.asy0000644000000000000000000003636115031566105014376 0ustar rootrootreal stepfactor=2; // Maximum dynamic step size adjustment factor. struct coefficients { real[] steps; real[] factors; real[][] weights; real[] highOrderWeights; real[] lowOrderWeights; } struct RKTableau { int order; coefficients a; void stepDependence(real h, real c, coefficients a) {} real pgrow; real pshrink; bool exponential; void operator init(int order, real[][] weights, real[] highOrderWeights, real[] lowOrderWeights=new real[], real[] steps=sequence(new real(int i) { return sum(weights[i]);},weights.length), void stepDependence(real, real, coefficients)=null) { this.order=order; a.steps=steps; a.factors=array(a.steps.length+1,1); a.weights=weights; a.highOrderWeights=highOrderWeights; a.lowOrderWeights=lowOrderWeights; if(stepDependence != null) { this.stepDependence=stepDependence; exponential=true; } pgrow=(order > 0) ? 1/order : 0; pshrink=(order > 1) ? 1/(order-1) : pgrow; } } real[] Coeff={1,1/2,1/6,1/24,1/120,1/720,1/5040,1/40320,1/362880,1/3628800, 1/39916800.0,1/479001600.0,1/6227020800.0,1/87178291200.0, 1/1307674368000.0,1/20922789888000.0,1/355687428096000.0, 1/6402373705728000.0,1/121645100408832000.0, 1/2432902008176640000.0,1/51090942171709440000.0, 1/1124000727777607680000.0}; real phi1(real x) {return x != 0 ? expm1(x)/x : 1;} // phi2(x)=(exp(x)-1-x)/(x^2); // Use the identity phi2(2x)=0.25*(x*phi2(x)+1)^2+0.5*phi2(x); real phi2(real x) { if(fabs(x) > 1) return (exp(x)-x-1)/(x^2); x *= 0.125; real x2=x*x; real x3=x2*x; real x5=x2*x3; real y=Coeff[1]+x*Coeff[2]+x2*Coeff[3]+x3*Coeff[4]+x2*x2*Coeff[5]+ x5*Coeff[6]+x3*x3*Coeff[7]+x5*x2*Coeff[8]+x5*x3*Coeff[9]; y=0.25*(x*y+1.0)^2+0.5*y; y=(x*y+0.5)^2+0.5*y; return (2.0*x*y+0.5)^2+0.5*y; } // phi3(x)=(exp(x)-1-x-x^2/2)/(x^3) // Use the identity phi3(2x)=0.125*phi2(x)*(x*phi2(x)+2)+0.25*phi3(x) // where phi2(x)=x*phi3(x)+0.5 real phi3(real x) { if(fabs(x) > 1.6) return (exp(x)-0.5*x^2-x-1)/x^3; x *= 0.125; real x2=x*x; real x3=x2*x; real x5=x2*x3; real y=Coeff[2]+x*Coeff[3]+x2*Coeff[4]+x3*Coeff[5]+ x2*x2*Coeff[6]+x5*Coeff[7]+x3*x3*Coeff[8]+x5*x2*Coeff[9]+ x5*x3*Coeff[10]; real y2=x*y+0.5; y=0.125*y2*(x*y2+2)+0.25*y; y2=2*x*y+0.5; y=0.25*y2*(x*y2+1)+0.25*y; y2=4*x*y+0.5; return 0.25*y2*(2*x*y2+1)+0.25*y; } // phi4(x)=(exp(x)-1-x-x^2/2-x^3/6)/(x^4) // Use the identity phi4(2x)=0.0625*(x*phi3(x)+0.5)^2+0.125*(phi3(x)+phi4(x)); // where phi3(x)=x*phi4(x)+1/6 real phi4(real x) { if(fabs(x) > 1.6) return (exp(x)-Coeff[2]*x^3-0.5*x^2-x-1)/x^4; x *= 0.125; real x2=x*x; real x3=x2*x; real x4=x2*x2; real x5=x2*x3; real y=Coeff[3]+x*Coeff[4]+x2*Coeff[5]+x3*Coeff[6]+ x4*Coeff[7]+x5*Coeff[8]+x3*x3*Coeff[9]+x5*x2*Coeff[10]+ x4*x4*Coeff[11]; real y3=x*y+Coeff[2]; y=0.0625*(x*y3+0.5)^2+0.125*(y3+y); y3=2*x*y+Coeff[2]; y=(0.5*x*y3+0.125)^2+0.125*(y3+y); y3=4*x*y+Coeff[2]; return (x*y3+0.125)^2+0.125*(y3+y); } void expfactors(real x, coefficients a) { for(int i=0; i < a.steps.length; ++i) a.factors[i]=exp(x*a.steps[i]); a.factors[a.steps.length]=exp(x); } // First-Order Euler RKTableau Euler=RKTableau(1,new real[][], new real[] {1}); // First-Order Exponential Euler RKTableau E_Euler=RKTableau(1,new real[][], new real[] {1}, new void(real h, real c, coefficients a) { real x=-c*h; expfactors(x,a); a.highOrderWeights[0]=phi1(x); }); // Second-Order Runge-Kutta RKTableau RK2=RKTableau(2,new real[][] {{1/2}}, new real[] {0,1}, // 2nd order new real[] {1,0}); // 1st order // Second-Order Exponential Runge-Kutta RKTableau E_RK2=RKTableau(2,new real[][] {{1/2}}, new real[] {0,1}, // 2nd order new real[] {1,0}, // 1st order new void(real h, real c, coefficients a) { real x=-c*h; expfactors(x,a); a.weights[0][0]=1/2*phi1(x/2); real w=phi1(x); a.highOrderWeights[0]=0; a.highOrderWeights[1]=w; a.lowOrderWeights[0]=w; }); // Second-Order Predictor-Corrector RKTableau PC=RKTableau(2,new real[][] {{1}}, new real[] {1/2,1/2}, // 2nd order new real[] {1,0}); // 1st order // Second-Order Exponential Predictor-Corrector RKTableau E_PC=RKTableau(2,new real[][] {{1}}, new real[] {1/2,1/2}, // 2nd order new real[] {1,0}, // 1st order new void(real h, real c, coefficients a) { real x=-c*h; expfactors(x,a); real w=phi1(x); a.weights[0][0]=w; a.highOrderWeights[0]=w/2; a.highOrderWeights[1]=w/2; a.lowOrderWeights[0]=w; }); // Third-Order Classical Runge-Kutta RKTableau RK3=RKTableau(3,new real[][] {{1/2},{-1,2}}, new real[] {1/6,2/3,1/6}); // Third-Order Bogacki-Shampine Runge-Kutta RKTableau RK3BS=RKTableau(3,new real[][] {{1/2},{0,3/4}}, new real[] {2/9,1/3,4/9}, // 3rd order new real[] {7/24,1/4,1/3,1/8}); // 2nd order // Third-Order Exponential Bogacki-Shampine Runge-Kutta RKTableau E_RK3BS=RKTableau(3,new real[][] {{1/2},{0,3/4}}, new real[] {2/9,1/3,4/9}, // 3rd order new real[] {7/24,1/4,1/3,1/8}, // 2nd order new void(real h, real c, coefficients a) { real x=-c*h; expfactors(x,a); real w=phi1(x); real w2=phi2(x); a.weights[0][0]=1/2*phi1(x/2); real a11=9/8*phi2(3/4*x)+3/8*phi2(x/2); a.weights[1][0]=3/4*phi1(3/4*x)-a11; a.weights[1][1]=a11; real a21=1/3*w; real a22=4/3*w2-2/9*w; a.highOrderWeights[0]=w-a21-a22; a.highOrderWeights[1]=a21; a.highOrderWeights[2]=a22; a.lowOrderWeights[0]=w-17/12*w2; a.lowOrderWeights[1]=w2/2; a.lowOrderWeights[2]=2/3*w2; a.lowOrderWeights[3]=w2/4; }); // Fourth-Order Classical Runge-Kutta RKTableau RK4=RKTableau(4,new real[][] {{1/2},{0,1/2},{0,0,1}}, new real[] {1/6,1/3,1/3,1/6}); // Fifth-Order Cash-Karp Runge-Kutta RKTableau RK5=RKTableau(5,new real[][] {{1/5}, {3/40,9/40}, {3/10,-9/10,6/5}, {-11/54,5/2,-70/27,35/27}, {1631/55296,175/512,575/13824, 44275/110592,253/4096}}, new real[] {37/378,0,250/621,125/594, 0,512/1771}, // 5th order new real[] {2825/27648,0,18575/48384,13525/55296, 277/14336,1/4}); // 4th order // Fifth-Order Fehlberg Runge-Kutta RKTableau RK5F=RKTableau(5,new real[][] {{1/4}, {3/32,9/32}, {1932/2197,-7200/2197,7296/2197}, {439/216,-8,3680/513,-845/4104}, {-8/27,2,-3544/2565,1859/4104, -11/40}}, new real[] {16/135,0,6656/12825,28561/56430,-9/50,2/55}, // 5th order new real[] {25/216,0,1408/2565,2197/4104,-1/5,0}); // 4th order // Fifth-Order Dormand-Prince Runge-Kutta RKTableau RK5DP=RKTableau(5,new real[][] {{1/5}, {3/40,9/40}, {44/45,-56/15,32/9}, {19372/6561,-25360/2187,64448/6561, -212/729}, {9017/3168,-355/33,46732/5247,49/176, -5103/18656}}, new real[] {35/384,0,500/1113,125/192,-2187/6784, 11/84}, // 5th order new real[] {5179/57600,0,7571/16695,393/640, -92097/339200,187/2100,1/40}); // 4th order real error(real error, real initial, real lowOrder, real norm, real diff) { if(initial != 0 && lowOrder != initial) { static real epsilon=realMin/realEpsilon; real denom=max(abs(norm),abs(initial))+epsilon; return max(error,max(abs(diff)/denom)); } return error; } void report(real old, real h, real t) { write("Time step changed from "+(string) old+" to "+(string) h+" at t="+ (string) t+"."); } real adjust(real h, real error, real tolmin, real tolmax, RKTableau tableau) { if(error > tolmax) h *= max((tolmin/error)^tableau.pshrink,1/stepfactor); else if(error > 0 && error < tolmin) h *= min((tolmin/error)^tableau.pgrow,stepfactor); return h; } struct solution { real[] t; real[] y; } void write(solution S) { for(int i=0; i < S.t.length; ++i) write(S.t[i],S.y[i]); } // Integrate dy/dt+cy=f(t,y) from a to b using initial conditions y, // specifying either the step size h or the number of steps n. solution integrate(real y, real c=0, real f(real t, real y), real a, real b=a, real h=0, int n=0, bool dynamic=false, real tolmin=0, real tolmax=0, real dtmin=0, real dtmax=realMax, RKTableau tableau, bool verbose=false) { solution S; S.t=new real[] {a}; S.y=new real[] {y}; if(h == 0) { if(b == a) return S; if(n == 0) abort("Either n or h must be specified"); else h=(b-a)/n; } real F(real t, real y)=(c == 0 || tableau.exponential) ? f : new real(real t, real y) {return f(t,y)-c*y;}; tableau.stepDependence(h,c,tableau.a); real t=a; real f0; if(tableau.a.lowOrderWeights.length == 0) dynamic=false; bool fsal=dynamic && (tableau.a.lowOrderWeights.length > tableau.a.highOrderWeights.length); if(fsal) f0=F(t,y); real dt=h; while(t < b) { h=min(h,b-t); if(t+h == t) break; if(h != dt) { if(verbose) report(dt,h,t); tableau.stepDependence(h,c,tableau.a); dt=h; } real[] predictions={fsal ? f0 : F(t,y)}; for(int i=0; i < tableau.a.steps.length; ++i) predictions.push(F(t+h*tableau.a.steps[i], tableau.a.factors[i]*y+h*dot(tableau.a.weights[i], predictions))); real highOrder=h*dot(tableau.a.highOrderWeights,predictions); real y0=tableau.a.factors[tableau.a.steps.length]*y; if(dynamic) { real f1; if(fsal) { f1=F(t+h,y0+highOrder); predictions.push(f1); } real lowOrder=h*dot(tableau.a.lowOrderWeights,predictions); real error; error=error(error,y,y0+lowOrder,y0+highOrder,highOrder-lowOrder); h=adjust(h,error,tolmin,tolmax,tableau); if(h >= dt) { t += dt; y=y0+highOrder; S.t.push(t); S.y.push(y); f0=f1; } h=min(max(h,dtmin),dtmax); } else { t += h; y=y0+highOrder; S.t.push(t); S.y.push(y); } } return S; } struct Solution { real[] t; real[][] y; } void write(Solution S) { for(int i=0; i < S.t.length; ++i) { write(S.t[i],tab); for(real y : S.y[i]) write(y,tab); write(); } } // Integrate a set of equations, dy/dt=f(t,y), from a to b using initial // conditions y, specifying either the step size h or the number of steps n. Solution integrate(real[] y, real[] f(real t, real[] y), real a, real b=a, real h=0, int n=0, bool dynamic=false, real tolmin=0, real tolmax=0, real dtmin=0, real dtmax=realMax, RKTableau tableau, bool verbose=false) { Solution S; S.t=new real[] {a}; S.y=new real[][] {copy(y)}; if(h == 0) { if(b == a) return S; if(n == 0) abort("Either n or h must be specified"); else h=(b-a)/n; } real t=a; real[] f0; if(tableau.a.lowOrderWeights.length == 0) dynamic=false; bool fsal=dynamic && (tableau.a.lowOrderWeights.length > tableau.a.highOrderWeights.length); if(fsal) f0=f(t,y); real dt=h; while(t < b) { h=min(h,b-t); if(t+h == t) break; if(h != dt) { if(verbose) report(dt,h,t); dt=h; } real[][] predictions={fsal ? f0 : f(t,y)}; for(int i=0; i < tableau.a.steps.length; ++i) predictions.push(f(t+h*tableau.a.steps[i], y+h*tableau.a.weights[i]*predictions)); real[] highOrder=h*tableau.a.highOrderWeights*predictions; if(dynamic) { real[] f1; if(fsal) { f1=f(t+h,y+highOrder); predictions.push(f1); } real[] lowOrder=h*tableau.a.lowOrderWeights*predictions; real error; for(int i=0; i < y.length; ++i) error=error(error,y[i],y[i]+lowOrder[i],y[i]+highOrder[i], highOrder[i]-lowOrder[i]); h=adjust(h,error,tolmin,tolmax,tableau); if(h >= dt) { t += dt; y += highOrder; S.t.push(t); S.y.push(y); f0=f1; } h=min(max(h,dtmin),dtmax); } else { t += h; y += highOrder; S.t.push(t); S.y.push(y); } } return S; } real[][] finiteDifferenceJacobian(real[] f(real[]), real[] t, real[] h=sqrtEpsilon*abs(t)) { real[] ft=f(t); real[][] J=new real[t.length][ft.length]; real[] ti=copy(t); real tlast=ti[0]; ti[0] += h[0]; J[0]=(f(ti)-ft)/h[0]; for(int i=1; i < t.length; ++i) { ti[i-1]=tlast; tlast=ti[i]; ti[i] += h[i]; J[i]=(f(ti)-ft)/h[i]; } return transpose(J); } // Solve simultaneous nonlinear system by Newton's method. real[] newton(int iterations=100, real[] f(real[]), real[][] jacobian(real[]), real[] t) { real[] t=copy(t); for(int i=0; i < iterations; ++i) t += solve(jacobian(t),-f(t)); return t; } real[] solveBVP(real[] f(real, real[]), real a, real b=a, real h=0, int n=0, bool dynamic=false, real tolmin=0, real tolmax=0, real dtmin=0, real dtmax=realMax, RKTableau tableau, bool verbose=false, real[] initial(real[]), real[] discrepancy(real[]), real[] guess, int iterations=100) { real[] g(real[] t) { real[][] y=integrate(initial(t),f,a,b,h,n,dynamic,tolmin,tolmax,dtmin,dtmax, tableau,verbose).y;return discrepancy(y[y.length-1]); } real[][] jacobian(real[] t) {return finiteDifferenceJacobian(g,t);} return initial(newton(iterations,g,jacobian,guess)); } asymptote-3.05/base/x11colors.asy0000644000000000000000000001131315031566105015450 0ustar rootrootpen rgbint(int r, int g, int b) { return rgb(r/255,g/255,b/255); } pen AliceBlue=rgbint(240,248,255); pen AntiqueWhite=rgbint(250,235,215); pen Aqua=rgbint(0,255,255); pen Aquamarine=rgbint(127,255,212); pen Azure=rgbint(240,255,255); pen Beige=rgbint(245,245,220); pen Bisque=rgbint(255,228,196); pen Black=rgbint(0,0,0); pen BlanchedAlmond=rgbint(255,235,205); pen Blue=rgbint(0,0,255); pen BlueViolet=rgbint(138,43,226); pen Brown=rgbint(165,42,42); pen BurlyWood=rgbint(222,184,135); pen CadetBlue=rgbint(95,158,160); pen Chartreuse=rgbint(127,255,0); pen Chocolate=rgbint(210,105,30); pen Coral=rgbint(255,127,80); pen CornflowerBlue=rgbint(100,149,237); pen Cornsilk=rgbint(255,248,220); pen Crimson=rgbint(220,20,60); pen Cyan=rgbint(0,255,255); pen DarkBlue=rgbint(0,0,139); pen DarkCyan=rgbint(0,139,139); pen DarkGoldenrod=rgbint(184,134,11); pen DarkGray=rgbint(169,169,169); pen DarkGreen=rgbint(0,100,0); pen DarkKhaki=rgbint(189,183,107); pen DarkMagenta=rgbint(139,0,139); pen DarkOliveGreen=rgbint(85,107,47); pen DarkOrange=rgbint(255,140,0); pen DarkOrchid=rgbint(153,50,204); pen DarkRed=rgbint(139,0,0); pen DarkSalmon=rgbint(233,150,122); pen DarkSeaGreen=rgbint(143,188,143); pen DarkSlateBlue=rgbint(72,61,139); pen DarkSlateGray=rgbint(47,79,79); pen DarkTurquoise=rgbint(0,206,209); pen DarkViolet=rgbint(148,0,211); pen DeepPink=rgbint(255,20,147); pen DeepSkyBlue=rgbint(0,191,255); pen DimGray=rgbint(105,105,105); pen DodgerBlue=rgbint(30,144,255); pen FireBrick=rgbint(178,34,34); pen FloralWhite=rgbint(255,250,240); pen ForestGreen=rgbint(34,139,34); pen Fuchsia=rgbint(255,0,255); pen Gainsboro=rgbint(220,220,220); pen GhostWhite=rgbint(248,248,255); pen Gold=rgbint(255,215,0); pen Goldenrod=rgbint(218,165,32); pen Gray=rgbint(128,128,128); pen Green=rgbint(0,128,0); pen GreenYellow=rgbint(173,255,47); pen Honeydew=rgbint(240,255,240); pen HotPink=rgbint(255,105,180); pen IndianRed=rgbint(205,92,92); pen Indigo=rgbint(75,0,130); pen Ivory=rgbint(255,255,240); pen Khaki=rgbint(240,230,140); pen Lavender=rgbint(230,230,250); pen LavenderBlush=rgbint(255,240,245); pen LawnGreen=rgbint(124,252,0); pen LemonChiffon=rgbint(255,250,205); pen LightBlue=rgbint(173,216,230); pen LightCoral=rgbint(240,128,128); pen LightCyan=rgbint(224,255,255); pen LightGoldenrodYellow=rgbint(250,250,210); pen LightGreen=rgbint(144,238,144); pen LightGrey=rgbint(211,211,211); pen LightPink=rgbint(255,182,193); pen LightSalmon=rgbint(255,160,122); pen LightSeaGreen=rgbint(32,178,170); pen LightSkyBlue=rgbint(135,206,250); pen LightSlateGray=rgbint(119,136,153); pen LightSteelBlue=rgbint(176,196,222); pen LightYellow=rgbint(255,255,224); pen Lime=rgbint(0,255,0); pen LimeGreen=rgbint(50,205,50); pen Linen=rgbint(250,240,230); pen Magenta=rgbint(255,0,255); pen Maroon=rgbint(128,0,0); pen MediumAquamarine=rgbint(102,205,170); pen MediumBlue=rgbint(0,0,205); pen MediumOrchid=rgbint(186,85,211); pen MediumPurple=rgbint(147,112,219); pen MediumSeaGreen=rgbint(60,179,113); pen MediumSlateBlue=rgbint(123,104,238); pen MediumSpringGreen=rgbint(0,250,154); pen MediumTurquoise=rgbint(72,209,204); pen MediumVioletRed=rgbint(199,21,133); pen MidnightBlue=rgbint(25,25,112); pen MintCream=rgbint(245,255,250); pen MistyRose=rgbint(255,228,225); pen Moccasin=rgbint(255,228,181); pen NavajoWhite=rgbint(255,222,173); pen Navy=rgbint(0,0,128); pen OldLace=rgbint(253,245,230); pen Olive=rgbint(128,128,0); pen OliveDrab=rgbint(107,142,35); pen Orange=rgbint(255,165,0); pen OrangeRed=rgbint(255,69,0); pen Orchid=rgbint(218,112,214); pen PaleGoldenrod=rgbint(238,232,170); pen PaleGreen=rgbint(152,251,152); pen PaleTurquoise=rgbint(175,238,238); pen PaleVioletRed=rgbint(219,112,147); pen PapayaWhip=rgbint(255,239,213); pen PeachPuff=rgbint(255,218,185); pen Peru=rgbint(205,133,63); pen Pink=rgbint(255,192,203); pen Plum=rgbint(221,160,221); pen PowderBlue=rgbint(176,224,230); pen Purple=rgbint(128,0,128); pen Red=rgbint(255,0,0); pen RosyBrown=rgbint(188,143,143); pen RoyalBlue=rgbint(65,105,225); pen SaddleBrown=rgbint(139,69,19); pen Salmon=rgbint(250,128,114); pen SandyBrown=rgbint(244,164,96); pen SeaGreen=rgbint(46,139,87); pen Seashell=rgbint(255,245,238); pen Sienna=rgbint(160,82,45); pen Silver=rgbint(192,192,192); pen SkyBlue=rgbint(135,206,235); pen SlateBlue=rgbint(106,90,205); pen SlateGray=rgbint(112,128,144); pen Snow=rgbint(255,250,250); pen SpringGreen=rgbint(0,255,127); pen SteelBlue=rgbint(70,130,180); pen Tan=rgbint(210,180,140); pen Teal=rgbint(0,128,128); pen Thistle=rgbint(216,191,216); pen Tomato=rgbint(255,99,71); pen Turquoise=rgbint(64,224,208); pen Violet=rgbint(238,130,238); pen Wheat=rgbint(245,222,179); pen White=rgbint(255,255,255); pen WhiteSmoke=rgbint(245,245,245); pen Yellow=rgbint(255,255,0); pen YellowGreen=rgbint(154,205,50); asymptote-3.05/base/three_tube.asy0000644000000000000000000001424015031566105015745 0ustar rootrootstruct rmf { triple p,r,t,s; void operator init(triple p, triple r, triple t) { this.p=p; this.r=r; this.t=t; s=cross(t,r); } transform3 transform() { return transform3(r,s,t); } } // Rotation minimizing frame // http://www.cs.hku.hk/research/techreps/document/TR-2007-07.pdf rmf[] rmf(path3 g, real[] t, triple perp=O) { triple T=dir(g,0); triple Tp=abs(perp) < sqrtEpsilon ? perp(T) : unit(perp); rmf[] R=new rmf[t.length]; R[0]=rmf(point(g,0),Tp,T); for(int i=1; i < t.length; ++i) { rmf Ri=R[i-1]; real t=t[i]; triple p=point(g,t); triple v1=p-Ri.p; if(v1 != O) { triple r=Ri.r; triple u1=unit(v1); triple ti=Ri.t; triple tp=ti-2*dot(u1,ti)*u1; ti=dir(g,t); triple rp=r-2*dot(u1,r)*u1; triple u2=unit(ti-tp); rp=rp-2*dot(u2,rp)*u2; R[i]=rmf(p,unit(rp),unit(ti)); } else R[i]=R[i-1]; } return R; } rmf[] rmf(triple z0, triple c0, triple c1, triple z1, real[] t, triple perp=O) { static triple s0; real norm=sqrtEpsilon*max(abs(z0),abs(c0),abs(c1),abs(z1)); // Special case of dir for t in (0,1]. triple dir(real t) { if(t == 1) { triple dir=z1-c1; if(abs(dir) > norm) return unit(dir); dir=2.0*c1-c0-z1; if(abs(dir) > norm) return unit(dir); return unit(z1-z0+3.0*(c0-c1)); } triple a=z1-z0+3.0*(c0-c1); triple b=2.0*(z0+c1)-4.0*c0; triple c=c0-z0; triple dir=a*t*t+b*t+c; if(abs(dir) > norm) return unit(dir); dir=2.0*a*t+b; if(abs(dir) > norm) return unit(dir); return unit(a); } triple T=c0-z0; if(abs(T) < norm) { T=z0-2*c0+c1; if(abs(T) < norm) T=z1-z0+3.0*(c0-c1); } T=unit(T); triple Tp=perp == O ? cross(s0,T) : perp; Tp=abs(Tp) < sqrtEpsilon ? perp(T) : unit(Tp); rmf[] R=new rmf[t.length]; R[0]=rmf(z0,Tp,T); for(int i=1; i < t.length; ++i) { rmf Ri=R[i-1]; real t=t[i]; triple p=bezier(z0,c0,c1,z1,t); triple v1=p-Ri.p; if(v1 != O) { triple r=Ri.r; triple u1=unit(v1); triple ti=Ri.t; triple tp=ti-2*dot(u1,ti)*u1; ti=dir(t); triple rp=r-2*dot(u1,r)*u1; triple u2=unit(ti-tp); rp=rp-2*dot(u2,rp)*u2; R[i]=rmf(p,unit(rp),unit(ti)); } else R[i]=R[i-1]; } s0=R[t.length-1].s; return R; } drawfcn drawTube(triple[] g, real w, triple min, triple max) { return new void(frame f, transform3 t=identity4, material[] m, light light=currentlight, render render=defaultrender) { material m=material(m[0],light); drawTube(f,t*g,w,m.p,m.opacity,m.shininess,m.metallic,m.fresnel0, t*min,t*max,m.opacity == 1); }; } surface tube(triple z0, triple c0, triple c1, triple z1, real w) { surface s; static real[] T={0,1/3,2/3,1}; rmf[] rmf=rmf(z0,c0,c1,z1,T); real aw=a*w; triple[] arc={(w,0,0),(w,aw,0),(aw,w,0),(0,w,0)}; triple[] g={z0,c0,c1,z1}; void f(transform3 R) { triple[][] P=new triple[4][]; for(int i=0; i < 4; ++i) { transform3 T=shift(g[i])*rmf[i].transform()*R; P[i]=new triple[] {T*arc[0],T*arc[1],T*arc[2],T*arc[3]}; } s.push(patch(P,copy=false)); } f(identity4); f(t1); f(t2); f(t3); s.PRCprimitive=false; s.primitive=primitive(drawTube(g,w,min(s),max(s)), new bool(transform3 t) { return unscaled(t,X,Y); }); return s; } real tubethreshold=20; // Note: casting an array of surfaces to a single surface will disable // primitive compression. surface operator cast(surface[] s) { surface S; for(surface p : s) S.append(p); return S; } struct tube { surface[] s; path3 center; // tube axis void Null(transform3) {} void Null(transform3, bool) {} surface[] render(path3 g, real r) { triple z0=point(g,0); triple c0=postcontrol(g,0); triple c1=precontrol(g,1); triple z1=point(g,1); real norm=sqrtEpsilon*max(abs(z0),abs(c0),abs(c1),abs(z1),r); surface[] s; void Split(triple z0, triple c0, triple c1, triple z1, int depth=mantissaBits) { if(depth > 0) { pair threshold(triple z0, triple c0, triple c1) { triple u=c1-z0; triple v=c0-z0; real x=abs(v); return (x,abs(u*x^2-dot(u,v)*v)); } pair a0=threshold(z0,c0,c1); pair a1=threshold(z1,c1,c0); real rL=r*arclength(z0,c0,c1,z1)*tubethreshold; if((a0.x >= norm && rL*a0.y^2 > a0.x^8) || (a1.x >= norm && rL*a1.y^2 > a1.x^8)) { triple m0=0.5*(z0+c0); triple m1=0.5*(c0+c1); triple m2=0.5*(c1+z1); triple m3=0.5*(m0+m1); triple m4=0.5*(m1+m2); triple m5=0.5*(m3+m4); --depth; Split(z0,m0,m3,m5,depth); Split(m5,m4,m2,z1,depth); return; } } s.push(tube(z0,c0,c1,z1,r)); } Split(z0,c0,c1,z1); return s; } void operator init(path3 p, real width) { center=p; real r=0.5*width; void generate(path3 p) { int n=length(p); for(int i=0; i < n; ++i) { if(straight(p,i)) { triple v=point(p,i); triple u=point(p,i+1)-v; transform3 t=shift(v)*align(unit(u))*scale(r,r,abs(u)); // Draw opaque surfaces with core for better small-scale rendering. surface unittube=t*unitcylinder; unittube.primitive=primitive(unitcylinderDraw(core=true), new bool(transform3 t) { return unscaled(t,X,Y); }); s.push(unittube); } else s.append(render(subpath(p,i,i+1),r)); } } transform3 t=scale3(r); bool cyclic=cyclic(p); int begin=0; int n=length(p); for(int i=cyclic ? 0 : 1; i < n; ++i) if(abs(dir(p,i,1)-dir(p,i,-1)) > sqrtEpsilon) { generate(subpath(p,begin,i)); triple dir=dir(p,i,-1); transform3 T=t*align(dir); s.push(shift(point(p,i))*T*(straight(p,i-1) && straight(p,i) ? unithemisphere : unitsphere)); begin=i; } path3 g=subpath(p,begin,n); generate(g); } } asymptote-3.05/base/asymptote.py0000755000000000000000000000237415031566105015510 0ustar rootroot#!/usr/bin/env python3 # Python module to feed Asymptote with commands # (modified from gnuplot.py) from subprocess import * class asy: def __init__(self): self.session = Popen(['asy','-quiet','-inpipe=0','-outpipe=2'],stdin=PIPE) self.help() def send(self, cmd): self.session.stdin.write(bytes(cmd+'\n','utf-8')) self.session.stdin.flush() def size(self, size): self.send("size(%d);" % size) def draw(self, str): self.send("draw(%s);" % str) def fill(self, str): self.send("fill(%s);" % str) def clip(self, str): self.send("clip(%s);" % str) def label(self, str): self.send("label(%s);" % str) def shipout(self, str): self.send("shipout(\"%s\");" % str) def erase(self): self.send("erase();") def help(self): print("Asymptote session is open. Available methods are:") print(" help(), size(int), draw(str), fill(str), clip(str), label(str), shipout(str), send(str), erase()") def __del__(self): print("closing Asymptote session...") self.send('quit'); self.session.stdin.close(); self.session.wait() if __name__=="__main__": g=asy() g.size(200) g.draw('unitcircle') g.send('draw(unitsquare)') g.fill('unitsquare,blue') g.clip('unitcircle') g.label('"$O$",(0,0),SW') input('press ENTER to continue') g.erase() del g asymptote-3.05/base/feynman.asy0000644000000000000000000005204415031566105015260 0ustar rootroot/***************************************************************************** * feynman.asy -- An Asymptote library for drawing Feynman diagrams. * * * * by: Martin Wiebusch * * last change: 2007/04/13 * *****************************************************************************/ /* default parameters ********************************************************/ // default ratio of width (distance between two loops) to amplitude for a gluon // line. The gluon function uses this ratio, if the width parameter is // negative. real gluonratio; // default ratio of width (distance between two crests) to amplitude for a // photon line. The photon function uses this ratio, if the width parameter is // negative. real photonratio; // default gluon amplitude real gluonamplitude; // default photon amplitude real photonamplitude; // default pen for drawing the background. Usually white. pen backgroundpen; // default pen for drawing gluon lines pen gluonpen; // default pen for drawing photon lines pen photonpen; // default pen for drawing fermion lines pen fermionpen; // default pen for drawing scalar lines pen scalarpen; // default pen for drawing ghost lines pen ghostpen; // default pen for drawing double lines pen doublelinepen; // default pen for drawing vertices pen vertexpen; // default pen for drawing big vertices (drawVertexOX and drawVertexBoxX) pen bigvertexpen; // inner spacing of a double line real doublelinespacing; // default arrow for propagators arrowbar currentarrow; // if true, each of the drawSomething commands blots out the background // (with pen backgroundpen) before drawing. bool overpaint; // margin around lines. If one line is drawn over anoter, a white margin // of size linemargin is kept around the top one. real linemargin; // at vertices, where many lines join, the last line drawn should not blot // out the others. By not erasing the background near the ends of lines, // this is prevented for lines with an angle greater than minvertexangle to // each other. Note, that small values for minvertexangle mean that the // background is only erased behind a small segment of every line. Setting // minvertexangle = 0 effectively disables background erasing for lines. real minvertexangle; // size (radius) of vertices real vertexsize; // size (radius) of big vertices (drawVertexOX and drawVertexBoxX) real bigvertexsize; /* defaults for momentum arrows **********************************************/ // (momentum arrows are small arrows parallel to particle lines indicating the // direction of momentum) // default size of the arrowhead of momentum arrows arrowbar currentmomarrow; // default length of momentum arrows real momarrowlength; // default pen for momentum arrows pen momarrowpen; // default offset between momentum arrow and related particle line real momarrowoffset; // default margin for momentum arrows real momarrowmargin; // factor for determining the size of momentum arrowheads. After changing it, // you still have to update currentmomarrow manually. real momarrowfactor; // size function for momentum arrowheads real momarrowsize(pen p=momarrowpen) { return momarrowfactor*linewidth(p); } /* defaults for texshipout ***************************************************/ // tex command for including graphics. It takes one argument, which is the // name of the graphics (eps or pdf) file. string includegraphicscommand; // Determines whether the suffix (.eps or .pdf) should be appended to the stem // of the file name in the \includegraphics command. bool appendsuffix; /* helper functions **********************************************************/ // internal function for overpainting private void do_overpaint(picture pic, path p, pen bgpen, real halfwidth, real vertexangle) { real tanvertexangle = tan(vertexangle*pi/180); if(tanvertexangle != 0) { real t1 = arctime(p, halfwidth/tanvertexangle+halfwidth); real t2 = arctime(p, arclength(p)-halfwidth/tanvertexangle-halfwidth); draw(pic, subpath(p, t1, t2), bgpen+linewidth(2*halfwidth)); } } // returns the path of a gluon line along path p, with amplitude amp and width // width (distance between two loops). If width is negative, the width is // set to amp*gluonratio path gluon(path p, real amp = gluonamplitude, real width=-1) { if(width < 0) width = abs(gluonratio*amp); real pathlen = arclength(p); int ncurls = floor(pathlen/width); real firstlen = (pathlen - width*(ncurls-1))/2; real firstt = arctime(p, firstlen); pair firstv = dir(p, firstt); guide g = point(p, 0)..{firstv}( point(p, firstt) +amp*unit(rotate(90)*firstv)); real t1; pair v1; real t2; pair v2; pathlen -= firstlen; for(real len = firstlen+width/2; len < pathlen; len += width) { t1 = arctime(p, len); v1 = dir(p, t1); t2 = arctime(p, len + width/2); v2 = dir(p, t2); g=g..{-v1}(point(p, t1)+amp*unit(rotate(-90)*v1)) ..{+v2}(point(p, t2)+amp*unit(rotate(+90)*v2)); } g = g..point(p, size(p)); return g; } // returns the path of a photon line along path p, with amplitude amp and width // width (distance between two crests). If width is negative, the width is // set to amp*photonratio path photon(path p, real amp = photonamplitude, real width=-1) { if(width < 0) width = abs(photonratio*amp)/2; else width = width/2; real pathlen = arclength(p); int ncurls = floor(pathlen/width); real firstlen = (pathlen - width*ncurls)/2; real firstt = arctime(p, firstlen+width); guide g = point(p, 0){unit(point(p, firstt)-point(p, 0))}; real t; pair v; pathlen -= firstlen; for(real len = firstlen+width; len < pathlen; len += width) { t = arctime(p, len); v = dir(p, t); g=g..{v}(point(p, t)+amp*unit(rotate(90)*v)); amp = -amp; } g = g..{unit(point(p, size(p))-point(p, t))}point(p, size(p)); return g; } // returns the path of a momentum arrow along path p, with length length, // an offset offset from the path p and at position position. position will // usually be one of the predefined pairs left or right. Making adjust // nonzero shifts the momentum arrow along the path. path momArrowPath(path p, align align, position pos, real offset = momarrowoffset, real length = momarrowlength) { real pathlen = arclength(p); real t1, t2; if(pos.relative) { t1 = arctime(p, (pathlen-length)*pos.position.x); t2 = arctime(p, (pathlen-length)*pos.position.x+length); } else { t1 = arctime(p, (pathlen-length)/2 + pos.position.x); t2 = arctime(p, (pathlen+length)/2+ pos.position.x); } pair v1 = dir(p, t1); pair v2 = dir(p, t2); pair p1, p2; if(align.relative) { p1 = point(p, t1) + offset*abs(align.dir) *unit(rotate(degrees(align.dir)-90)*v1); p2 = point(p, t2) + offset*abs(align.dir) *unit(rotate(degrees(align.dir)-90)*v2); } else { p1 = point(p, t1) + offset*align.dir; p2 = point(p, t2) + offset*align.dir; } return p1{v1}..{v2}p2; } /* drawing functions *********************************************************/ // draw a gluon line on picture pic, along path p, with amplitude amp, width // width (distance between loops) and with pen fgpen. If erasebg is true, // bgpen is used to erase the background behind the line and at a margin // margin around it. The background is not erased at a certain distance to // the endpoints, which is determined by vertexangle (see comments to the // default parameter minvertexangle). For negative values of width, the width // is set to gluonratio*amp. void drawGluon(picture pic = currentpicture, path p, real amp = gluonamplitude, real width = -1, pen fgpen = gluonpen, bool erasebg = overpaint, pen bgpen = backgroundpen, real vertexangle = minvertexangle, real margin = linemargin) { if(width < 0) width = abs(2*amp); if(erasebg) do_overpaint(pic, p, bgpen, amp+margin, vertexangle); draw(pic, gluon(p, amp, width), fgpen); } // draw a photon line on picture pic, along path p, with amplitude amp, width // width (distance between loops) and with pen fgpen. If erasebg is true, // bgpen is used to erase the background behind the line and at a margin // margin around it. The background is not erased at a certain distance to // the endpoints, which is determined by vertexangle (see comments to the // default parameter minvertexangle). For negative values of width, the width // is set to photonratio*amp. void drawPhoton(picture pic = currentpicture, path p, real amp = photonamplitude, real width = -1, pen fgpen = currentpen, bool erasebg = overpaint, pen bgpen = backgroundpen, real vertexangle = minvertexangle, real margin = linemargin) { if(width < 0) width = abs(4*amp); if(erasebg) do_overpaint(pic, p, bgpen, amp+margin, vertexangle); draw(pic, photon(p, amp, width), fgpen); } // draw a fermion line on picture pic, along path p with pen fgpen and an // arrowhead arrow. If erasebg is true, bgpen is used to erase the background // at a margin margin around the line. The background is not erased at a // certain distance to the endpoints, which is determined by vertexangle // (see comments to the default parameter minvertexangle). void drawFermion(picture pic = currentpicture, path p, pen fgpen = currentpen, arrowbar arrow = currentarrow, bool erasebg = overpaint, pen bgpen = backgroundpen, real vertexangle = minvertexangle, real margin = linemargin) { if(erasebg) do_overpaint(pic, p, bgpen, linewidth(fgpen)+margin, vertexangle); draw(pic, p, fgpen, arrow); } // draw a scalar line on picture pic, along path p with pen fgpen and an // arrowhead arrow. If erasebg is true, bgpen is used to erase the background // at a margin margin around the line. The background is not erased at a // certain distance to the endpoints, which is determined by vertexangle // (see comments to the default parameter minvertexangle). void drawScalar(picture pic = currentpicture, path p, pen fgpen = scalarpen, arrowbar arrow = currentarrow, bool erasebg = overpaint, pen bgpen = backgroundpen, real vertexangle = minvertexangle, real margin = linemargin) { if(erasebg) do_overpaint(pic, p, bgpen, linewidth(fgpen)+margin, vertexangle); draw(pic, p, fgpen, arrow); } // draw a ghost line on picture pic, along path p with pen fgpen and an // arrowhead arrow. If erasebg is true, bgpen is used to erase the background // at a margin margin around the line. The background is not erased at a // certain distance to the endpoints, which is determined by vertexangle // (see comments to the default parameter minvertexangle). void drawGhost(picture pic = currentpicture, path p, pen fgpen = ghostpen, arrowbar arrow = currentarrow, bool erasebg = overpaint, pen bgpen = backgroundpen, real vertexangle = minvertexangle, real margin = linemargin) { if(erasebg) do_overpaint(pic, p, bgpen, linewidth(fgpen)+margin, vertexangle); draw(pic, p, fgpen, arrow); } arrowbar DoubleLineMidArrow=MidArrow(Fill(doublelinepen)); // draw a double line on picture pic, along path p with pen fgpen and // an inner spacing of dlspacint. An optional arrowhead DoubleLineMidArrow // can be specified. If erasebg is true, bgpen is used to erase the // background at a margin margin around the line. The background is // not erased at a certain distance to the endpoints, which is // determined by vertexangle (see comments to the default parameter // minvertexangle). void drawDoubleLine(picture pic = currentpicture, path p, pen fgpen = doublelinepen, real dlspacing = doublelinespacing, arrowbar arrow = None, bool erasebg = overpaint, pen bgpen = backgroundpen, real vertexangle = minvertexangle, real margin = linemargin) { if(erasebg) do_overpaint(pic, p, bgpen, linewidth(fgpen)+margin, vertexangle); real htw = linewidth(fgpen)+dlspacing/2; draw(pic, p, fgpen+2*htw); draw(pic, p, bgpen+(linewidth(dlspacing))); path rect = (-htw,-htw)--(-htw,htw)--(0,htw)--(0,-htw)--cycle; fill(shift(point(p,0))*rotate(degrees(dir(p,0)))*rect, bgpen); fill(shift(point(p,size(p)))*scale(-1)*rotate(degrees(dir(p,size(p))))* rect,bgpen); draw(pic, p, invisible, arrow); } // draw a vertex dot on picture pic, at position xy with radius r and pen // fgpen void drawVertex(picture pic = currentpicture, pair xy, real r = vertexsize, pen fgpen = vertexpen) { fill(pic, circle(xy, r), fgpen); } // draw an empty vertex dot on picture pic, at position xy with radius r // and pen fgpen. If erasebg is true, the background is erased in the inside // of the circle. void drawVertexO(picture pic = currentpicture, pair xy, real r = vertexsize, pen fgpen = vertexpen, bool erasebg = overpaint, pen bgpen = backgroundpen) { if(erasebg) filldraw(pic, circle(xy, r), bgpen, fgpen); else draw(pic, circle(xy, r), fgpen); } // draw a vertex triangle on picture pic, at position xy with radius r and pen // fgpen void drawVertexTriangle(picture pic = currentpicture, pair xy, real r = vertexsize, pen fgpen = vertexpen) { real cospi6 = cos(pi/6); real sinpi6 = sin(pi/6); path triangle = (cospi6,-sinpi6)--(0,1)--(-cospi6,-sinpi6)--cycle; fill(pic, shift(xy)*scale(r)*triangle, fgpen); } // draw an empty vertex triangle on picture pic, at position xy with size r // and pen fgpen. If erasebg is true, the background is erased in the inside // of the triangle. void drawVertexTriangleO(picture pic = currentpicture, pair xy, real r = vertexsize, pen fgpen = vertexpen, bool erasebg = overpaint, pen bgpen = backgroundpen) { real cospi6 = cos(pi/6); real sinpi6 = sin(pi/6); path triangle = (cospi6,-sinpi6)--(0,1)--(-cospi6,-sinpi6)--cycle; if(erasebg) filldraw(pic, shift(xy)*scale(r)*triangle, bgpen, fgpen); else draw(pic, shift(xy)*scale(r)*triangle, fgpen); } // draw a vertex box on picture pic, at position xy with radius r and pen // fgpen void drawVertexBox(picture pic = currentpicture, pair xy, real r = vertexsize, pen fgpen = vertexpen) { path box = (1,1)--(-1,1)--(-1,-1)--(1,-1)--cycle; fill(pic, shift(xy)*scale(r)*box, fgpen); } // draw an empty vertex box on picture pic, at position xy with size r // and pen fgpen. If erasebg is true, the background is erased in the inside // of the box. void drawVertexBoxO(picture pic = currentpicture, pair xy, real r = vertexsize, pen fgpen = vertexpen, bool erasebg = overpaint, pen bgpen = backgroundpen) { path box = (1,1)--(-1,1)--(-1,-1)--(1,-1)--cycle; if(erasebg) filldraw(pic, shift(xy)*scale(r)*box, bgpen, fgpen); else draw(pic, shift(xy)*scale(r)*box, fgpen); } // draw an X on picture pic, at position xy with size r and pen // fgpen void drawVertexX(picture pic = currentpicture, pair xy, real r = vertexsize, pen fgpen = vertexpen) { draw(pic, shift(xy)*scale(r)*((-1,-1)--(1,1)), fgpen); draw(pic, shift(xy)*scale(r)*((1,-1)--(-1,1)), fgpen); } // draw a circle with an X in the middle on picture pic, at position xy with // size r and pen fgpen. If erasebg is true, the background is erased in the // inside of the circle. void drawVertexOX(picture pic = currentpicture, pair xy, real r = bigvertexsize, pen fgpen = vertexpen, bool erasebg = overpaint, pen bgpen = backgroundpen) { if(erasebg) filldraw(pic, circle(xy, r), bgpen, fgpen); else draw(pic, circle(xy, r), fgpen); draw(pic, shift(xy)*scale(r)*(NW--SE), fgpen); draw(pic, shift(xy)*scale(r)*(SW--NE), fgpen); } // draw a box with an X in the middle on picture pic, at position xy with // size r and pen fgpen. If erasebg is true, the background is erased in the // inside of the box. void drawVertexBoxX(picture pic = currentpicture, pair xy, real r = bigvertexsize, pen fgpen = vertexpen, bool erasebg = overpaint, pen bgpen = backgroundpen) { path box = (1,1)--(-1,1)--(-1,-1)--(1,-1)--cycle; box = shift(xy)*scale(r)*box; if(erasebg) filldraw(pic, box, bgpen, fgpen); else draw(pic, box, fgpen); draw(pic, shift(xy)*scale(r)*((-1,-1)--(1,1)), fgpen); draw(pic, shift(xy)*scale(r)*((1,-1)--(-1,1)), fgpen); } // draw a momentum arrow on picture pic, along path p, at position position // (use one of the predefined pairs left or right), with an offset offset // from the path, a length length, a pen fgpen and an arrowhead arrow. Making // adjust nonzero shifts the momentum arrow along the path. If erasebg is true, // the background is erased inside a margin margin around the momentum arrow. // Make sure that offset and margin are chosen in such a way that the momentum // arrow does not overdraw the particle line. void drawMomArrow(picture pic = currentpicture, path p, align align, position pos = MidPoint, real offset = momarrowoffset, real length = momarrowlength, pen fgpen = momarrowpen, arrowbar arrow = currentmomarrow, bool erasebg = overpaint, pen bgpen = backgroundpen, real margin = momarrowmargin) { path momarrow = momArrowPath(p, align, pos, offset, length); if(erasebg) do_overpaint(pic, momarrow, bgpen, linewidth(fgpen)+margin, 90); draw(pic, momarrow, fgpen, arrow); } /* initialisation ************************************************************/ // The function fmdefaults() tries to guess reasonable values for the // default parameters above by looking at the default parameters of plain.asy // (essentially, currentpen, arrowfactor and dotfactor). After customising the // default parameters of plain.asy, you may call fmdefaults to adjust the // parameters of feynman.asy. void fmdefaults() { real arrowsize=arrowsize(currentpen); real linewidth=linewidth(currentpen); gluonratio = 2; photonratio = 4; gluonamplitude = arrowsize/3; photonamplitude = arrowsize/4; backgroundpen = white; gluonpen = currentpen; photonpen = currentpen; fermionpen = currentpen; scalarpen = dashed+linewidth; ghostpen = dotted+linewidth; doublelinepen = currentpen; vertexpen = currentpen; bigvertexpen = currentpen; currentarrow = MidArrow; doublelinespacing = 2*linewidth; linemargin = 0.5*arrowsize; minvertexangle = 30; overpaint = true; vertexsize = 0.5*dotfactor*linewidth; bigvertexsize = 0.4*arrowsize; momarrowfactor = 1.5*arrowfactor; momarrowlength = 2.5*arrowsize; momarrowpen = currentpen+0.5*linewidth; momarrowoffset = 0.8*arrowsize; momarrowmargin = 0.25*arrowsize; currentmomarrow = EndArrow(momarrowsize()); includegraphicscommand = "\includegraphics"; appendsuffix = false; } // We call fmdefaults once, when the module is loaded. fmdefaults(); /* shipout *******************************************************************/ bool YAlign = false; bool XYAlign = true; // texshipout("filename", pic) creates two files: filename.eps holding the // picture pic and filename.tex holding some LaTeX code that includes the // picture from filename.eps and shifts it vertically in such a way that the // point (0,0) lies on the baseline. void texshipout(string stem, picture pic = currentpicture, bool xalign = YAlign) { file tf = output(stem + ".tex"); pair min=pic.min(); real depth = min.y; real xoffset = min.x; if(xalign) { write(tf, "\makebox[0pt][l]{\kern"); write(tf, xoffset); write(tf, "bp\relax"); } write(tf, "\raisebox{"); write(tf, depth); write(tf, "bp}{"+includegraphicscommand+"{"); write(tf, stem); string suffix="."+nativeformat(); if(appendsuffix) write(tf, suffix); write(tf, "}}"); if(xalign) write(tf, "}"); close(tf); shipout(stem+suffix, pic); } asymptote-3.05/base/plain_margins.asy0000644000000000000000000000440415031566105016443 0ustar rootrootstruct marginT { path g; real begin,end; }; using margin=marginT(path, pen); path trim(path g, real begin, real end=begin) { real a=arctime(g,begin); real b=arctime(g,arclength(g)-end); return a <= b ? subpath(g,a,b) : point(g,a); } margin operator +(margin ma, margin mb) { return new marginT(path g, pen p) { marginT margin; real ba=ma(g,p).begin < 0 ? 0 : ma(g,p).begin; real bb=mb(g,p).begin < 0 ? 0 : mb(g,p).begin; real ea=ma(g,p).end < 0 ? 0 : ma(g,p).end; real eb=mb(g,p).end < 0 ? 0 : mb(g,p).end; margin.begin=ba+bb; margin.end=ea+eb; margin.g=trim(g,margin.begin,margin.end); return margin; }; } margin NoMargin() { return new marginT(path g, pen) { marginT margin; margin.begin=margin.end=0; margin.g=g; return margin; }; } margin Margin(real begin, real end=begin) { return new marginT(path g, pen p) { marginT margin; real factor=labelmargin(p); margin.begin=begin*factor; margin.end=end*factor; margin.g=trim(g,margin.begin,margin.end); return margin; }; } margin PenMargin(real begin, real end=begin) { return new marginT(path g, pen p) { marginT margin; real factor=linewidth(p); margin.begin=(begin+0.5)*factor; margin.end=(end+0.5)*factor; margin.g=trim(g,margin.begin,margin.end); return margin; }; } margin DotMargin(real begin, real end=begin) { return new marginT(path g, pen p) { marginT margin; real margindot(real x) {return x > 0 ? dotfactor*x : x;} real factor=linewidth(p); margin.begin=(margindot(begin)+0.5)*factor; margin.end=(margindot(end)+0.5)*factor; margin.g=trim(g,margin.begin,margin.end); return margin; }; } margin TrueMargin(real begin, real end=begin) { return new marginT(path g, pen p) { marginT margin; margin.begin=begin; margin.end=end; margin.g=trim(g,begin,end); return margin; }; } margin NoMargin=NoMargin(), BeginMargin=Margin(1,0), Margin=Margin(0,1), EndMargin=Margin, Margins=Margin(1,1), BeginPenMargin=PenMargin(0.5,-0.5), PenMargin=PenMargin(-0.5,0.5), EndPenMargin=PenMargin, PenMargins=PenMargin(0.5,0.5), BeginDotMargin=DotMargin(0.5,-0.5), DotMargin=DotMargin(-0.5,0.5), EndDotMargin=DotMargin, DotMargins=DotMargin(0.5,0.5); asymptote-3.05/base/texcolors.asy0000644000000000000000000000434515031566105015646 0ustar rootrootpen GreenYellow=cmyk(0.15,0,0.69,0); pen Yellow=cmyk(0,0,1,0); pen Goldenrod=cmyk(0,0.10,0.84,0); pen Dandelion=cmyk(0,0.29,0.84,0); pen Apricot=cmyk(0,0.32,0.52,0); pen Peach=cmyk(0,0.50,0.70,0); pen Melon=cmyk(0,0.46,0.50,0); pen YellowOrange=cmyk(0,0.42,1,0); pen Orange=cmyk(0,0.61,0.87,0); pen BurntOrange=cmyk(0,0.51,1,0); pen Bittersweet=cmyk(0,0.75,1,0.24); pen RedOrange=cmyk(0,0.77,0.87,0); pen Mahogany=cmyk(0,0.85,0.87,0.35); pen Maroon=cmyk(0,0.87,0.68,0.32); pen BrickRed=cmyk(0,0.89,0.94,0.28); pen Red=cmyk(0,1,1,0); pen OrangeRed=cmyk(0,1,0.50,0); pen RubineRed=cmyk(0,1,0.13,0); pen WildStrawberry=cmyk(0,0.96,0.39,0); pen Salmon=cmyk(0,0.53,0.38,0); pen CarnationPink=cmyk(0,0.63,0,0); pen Magenta=cmyk(0,1,0,0); pen VioletRed=cmyk(0,0.81,0,0); pen Rhodamine=cmyk(0,0.82,0,0); pen Mulberry=cmyk(0.34,0.90,0,0.02); pen RedViolet=cmyk(0.07,0.90,0,0.34); pen Fuchsia=cmyk(0.47,0.91,0,0.08); pen Lavender=cmyk(0,0.48,0,0); pen Thistle=cmyk(0.12,0.59,0,0); pen Orchid=cmyk(0.32,0.64,0,0); pen DarkOrchid=cmyk(0.40,0.80,0.20,0); pen Purple=cmyk(0.45,0.86,0,0); pen Plum=cmyk(0.50,1,0,0); pen Violet=cmyk(0.79,0.88,0,0); pen RoyalPurple=cmyk(0.75,0.90,0,0); pen BlueViolet=cmyk(0.86,0.91,0,0.04); pen Periwinkle=cmyk(0.57,0.55,0,0); pen CadetBlue=cmyk(0.62,0.57,0.23,0); pen CornflowerBlue=cmyk(0.65,0.13,0,0); pen MidnightBlue=cmyk(0.98,0.13,0,0.43); pen NavyBlue=cmyk(0.94,0.54,0,0); pen RoyalBlue=cmyk(1,0.50,0,0); pen Blue=cmyk(1,1,0,0); pen Cerulean=cmyk(0.94,0.11,0,0); pen Cyan=cmyk(1,0,0,0); pen ProcessBlue=cmyk(0.96,0,0,0); pen SkyBlue=cmyk(0.62,0,0.12,0); pen Turquoise=cmyk(0.85,0,0.20,0); pen TealBlue=cmyk(0.86,0,0.34,0.02); pen Aquamarine=cmyk(0.82,0,0.30,0); pen BlueGreen=cmyk(0.85,0,0.33,0); pen Emerald=cmyk(1,0,0.50,0); pen JungleGreen=cmyk(0.99,0,0.52,0); pen SeaGreen=cmyk(0.69,0,0.50,0); pen Green=cmyk(1,0,1,0); pen ForestGreen=cmyk(0.91,0,0.88,0.12); pen PineGreen=cmyk(0.92,0,0.59,0.25); pen LimeGreen=cmyk(0.50,0,1,0); pen YellowGreen=cmyk(0.44,0,0.74,0); pen SpringGreen=cmyk(0.26,0,0.76,0); pen OliveGreen=cmyk(0.64,0,0.95,0.40); pen RawSienna=cmyk(0,0.72,1,0.45); pen Sepia=cmyk(0,0.83,1,0.70); pen Brown=cmyk(0,0.81,1,0.60); pen Tan=cmyk(0.14,0.42,0.56,0); pen Gray=cmyk(0,0,0,0.50); pen Black=cmyk(0,0,0,1); pen White=cmyk(0,0,0,0); asymptote-3.05/base/smoothcontour3.asy0000644000000000000000000015526715031566105016644 0ustar rootroot// Copyright 2015 Charles Staats III // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // smoothcontour3 // An Asymptote module for drawing smooth implicitly defined surfaces // author: Charles Staats III // charles dot staats dot iii at gmail dot com import graph_settings; // for nmesh import three; import math; /***********************************************/ /******** CREATING BEZIER PATCHES **************/ /******** WITH SPECIFIED NORMALS **************/ /***********************************************/ // The weight given to minimizing the sum of squares of // the mixed partials at the corners of the bezier patch. // If this weight is zero, the result is undefined in // places and can be rather wild even where it is // defined. // The struct is used to as a namespace. struct pathwithnormals_settings { static real wildnessweight = 1e-3; } private from pathwithnormals_settings unravel wildnessweight; // The Bernstein basis polynomials of degree 3: real B03(real t) { return (1-t)^3; } real B13(real t) { return 3*t*(1-t)^2; } real B23(real t) { return 3*t^2*(1-t); } real B33(real t) { return t^3; } private typedef real function(real); function[] bernstein = new function[] {B03, B13, B23, B33}; // This function attempts to produce a Bezier patch // with the specified boundary path and normal directions. // For instance, the patch should be normal to // u0normals[0] at (0, 0.25), // normal to u0normals[1] at (0, 0.5), and // normal to u0normals[2] at (0, 0.75). // The actual normal (as computed by the patch.normal() function) // may be parallel to the specified normal, antiparallel, or // even zero. // // A small amount of deviation is allowed in order to stabilize // the algorithm (by keeping the mixed partials at the corners from // growing too large). // // Note that the specified normals are projected to be orthogonal to // the specified boundary path. However, the entries in the array // remain intact. patch patchwithnormals(path3 external, triple[] u0normals, triple[] u1normals, triple[] v0normals, triple[] v1normals) { assert(cyclic(external)); assert(length(external) == 4); assert(u0normals.length == 3); assert(u1normals.length == 3); assert(v0normals.length == 3); assert(v1normals.length == 3); triple[][] controlpoints = new triple[4][4]; controlpoints[0][0] = point(external,0); controlpoints[1][0] = postcontrol(external,0); controlpoints[2][0] = precontrol(external,1); controlpoints[3][0] = point(external,1); controlpoints[3][1] = postcontrol(external,1); controlpoints[3][2] = precontrol(external,2); controlpoints[3][3] = point(external,2); controlpoints[2][3] = postcontrol(external,2); controlpoints[1][3] = precontrol(external,3); controlpoints[0][3] = point(external,3); controlpoints[0][2] = postcontrol(external,3); controlpoints[0][1] = precontrol(external, 4); real[][] matrix = new real[24][12]; for (int i = 0; i < matrix.length; ++i) for (int j = 0; j < matrix[i].length; ++j) matrix[i][j] = 0; real[] rightvector = new real[24]; for (int i = 0; i < rightvector.length; ++i) rightvector[i] = 0; void addtocoeff(int i, int j, int count, triple coeffs) { if (1 <= i && i <= 2 && 1 <= j && j <= 2) { int position = 3 * (2 * (i-1) + (j-1)); matrix[count][position] += coeffs.x; matrix[count][position+1] += coeffs.y; matrix[count][position+2] += coeffs.z; } else { rightvector[count] -= dot(controlpoints[i][j], coeffs); } } void addtocoeff(int i, int j, int count, real coeff) { if (1 <= i && i <= 2 && 1 <= j && j <= 2) { int position = 3 * (2 * (i-1) + (j-1)); matrix[count][position] += coeff; matrix[count+1][position+1] += coeff; matrix[count+2][position+2] += coeff; } else { rightvector[count] -= controlpoints[i][j].x * coeff; rightvector[count+1] -= controlpoints[i][j].y * coeff; rightvector[count+2] -= controlpoints[i][j].z * coeff; } } int count = 0; void apply_u0(int j, real a, triple n) { real factor = 3 * bernstein[j](a); addtocoeff(0,j,count,-factor*n); addtocoeff(1,j,count,factor*n); } void apply_u0(real a, triple n) { triple tangent = dir(external, 4-a); n -= dot(n,tangent)*tangent; n = unit(n); for (int j = 0; j < 4; ++j) { apply_u0(j,a,n); } ++count; } apply_u0(0.25, u0normals[0]); apply_u0(0.5, u0normals[1]); apply_u0(0.75, u0normals[2]); void apply_u1(int j, real a, triple n) { real factor = 3 * bernstein[j](a); addtocoeff(3,j,count,factor*n); addtocoeff(2,j,count,-factor*n); } void apply_u1(real a, triple n) { triple tangent = dir(external, 1+a); n -= dot(n,tangent)*tangent; n = unit(n); for (int j = 0; j < 4; ++j) apply_u1(j,a,n); ++count; } apply_u1(0.25, u1normals[0]); apply_u1(0.5, u1normals[1]); apply_u1(0.75, u1normals[2]); void apply_v0(int i, real a, triple n) { real factor = 3 * bernstein[i](a); addtocoeff(i,0,count,-factor*n); addtocoeff(i,1,count,factor*n); } void apply_v0(real a, triple n) { triple tangent = dir(external, a); n -= dot(n,tangent) * tangent; n = unit(n); for (int i = 0; i < 4; ++i) apply_v0(i,a,n); ++count; } apply_v0(0.25, v0normals[0]); apply_v0(0.5, v0normals[1]); apply_v0(0.75, v0normals[2]); void apply_v1(int i, real a, triple n) { real factor = 3 * bernstein[i](a); addtocoeff(i,3,count,factor*n); addtocoeff(i,2,count,-factor*n); } void apply_v1(real a, triple n) { triple tangent = dir(external, 3-a); n -= dot(n,tangent)*tangent; n = unit(n); for (int i = 0; i < 4; ++i) apply_v1(i,a,n); ++count; } apply_v1(0.25, v1normals[0]); apply_v1(0.5, v1normals[1]); apply_v1(0.75, v1normals[2]); addtocoeff(0,0,count,9*wildnessweight); addtocoeff(1,1,count,9*wildnessweight); addtocoeff(0,1,count,-9*wildnessweight); addtocoeff(1,0,count,-9*wildnessweight); count+=3; addtocoeff(3,3,count,9*wildnessweight); addtocoeff(2,2,count,9*wildnessweight); addtocoeff(3,2,count,-9*wildnessweight); addtocoeff(2,3,count,-9*wildnessweight); count+=3; addtocoeff(0,3,count,9*wildnessweight); addtocoeff(1,2,count,9*wildnessweight); addtocoeff(1,3,count,-9*wildnessweight); addtocoeff(0,2,count,-9*wildnessweight); count += 3; addtocoeff(3,0,count,9*wildnessweight); addtocoeff(2,1,count,9*wildnessweight); addtocoeff(3,1,count,-9*wildnessweight); addtocoeff(2,0,count,-9*wildnessweight); count += 3; real[] solution = leastsquares(matrix, rightvector, warn=false); if (solution.length == 0) { // if the matrix was singular write("Warning: unable to solve matrix for specifying edge normals " + "on bezier patch. Using coons patch."); return patch(external); } for (int i = 1; i <= 2; ++i) { for (int j = 1; j <= 2; ++j) { int position = 3 * (2 * (i-1) + (j-1)); controlpoints[i][j] = (solution[position], solution[position+1], solution[position+2]); } } return patch(controlpoints); } // This function attempts to produce a Bezier triangle // with the specified boundary path and normal directions at the // edge midpoints. The bezier triangle should be normal to // n1 at point(external, 0.5), // normal to n2 at point(external, 1.5), and // normal to n3 at point(external, 2.5). // The actual normal (as computed by the patch.normal() function) // may be parallel to the specified normal, antiparallel, or // even zero. // // A small amount of deviation is allowed in order to stabilize // the algorithm (by keeping the mixed partials at the corners from // growing too large). patch trianglewithnormals(path3 external, triple n1, triple n2, triple n3) { assert(cyclic(external)); assert(length(external) == 3); // Use the formal symbols a3, a2b, abc, etc. to denote the control points, // following the Wikipedia article on Bezier triangles. triple a3 = point(external, 0), a2b = postcontrol(external, 0), ab2 = precontrol(external, 1), b3 = point(external, 1), b2c = postcontrol(external, 1), bc2 = precontrol(external, 2), c3 = point(external, 2), ac2 = postcontrol(external, 2), a2c = precontrol(external, 0); // Use orthogonal projection to ensure that the normal vectors are // actually normal to the boundary path. triple tangent = dir(external, 0.5); n1 -= dot(n1,tangent)*tangent; n1 = unit(n1); tangent = dir(external, 1.5); n2 -= dot(n2,tangent)*tangent; n2 = unit(n2); tangent = dir(external, 2.5); n3 -= dot(n3,tangent)*tangent; n3 = unit(n3); real wild = 2 * wildnessweight; real[][] matrix = { {n1.x, n1.y, n1.z}, {n2.x, n2.y, n2.z}, {n3.x, n3.y, n3.z}, { wild, 0, 0}, { 0, wild, 0}, { 0, 0, wild} }; real[] rightvector = { dot(n1, (a3 + 3a2b + 3ab2 + b3 - 2a2c - 2b2c)) / 4, dot(n2, (b3 + 3b2c + 3bc2 + c3 - 2ab2 - 2ac2)) / 4, dot(n3, (c3 + 3ac2 + 3a2c + a3 - 2bc2 - 2a2b)) / 4 }; // The inner control point that minimizes the sum of squares of // the mixed partials on the corners. triple tameinnercontrol = ((a2b + a2c - a3) + (ab2 + b2c - b3) + (ac2 + bc2 - c3)) / 3; rightvector.append(wild * new real[] {tameinnercontrol.x, tameinnercontrol.y, tameinnercontrol.z}); real[] solution = leastsquares(matrix, rightvector, warn=false); if (solution.length == 0) { // if the matrix was singular write("Warning: unable to solve matrix for specifying edge normals " + "on bezier triangle. Using coons triangle."); return patch(external); } triple innercontrol = (solution[0], solution[1], solution[2]); return patch(external, innercontrol); } // A wrapper for the previous functions when the normal direction // is given as a function of direction. The wrapper can also // accommodate cyclic boundary paths of between one and four // segments, although the results are best by far when there // are three or four segments. patch patchwithnormals(path3 external, triple normalat(triple)) { assert(cyclic(external)); assert(1 <= length(external) && length(external) <= 4); if (length(external) == 3) { triple n1 = normalat(point(external, 0.5)); triple n2 = normalat(point(external, 1.5)); triple n3 = normalat(point(external, 2.5)); return trianglewithnormals(external, n1, n2, n3); } while (length(external) < 4) external = external -- cycle; triple[] u0normals = new triple[3]; triple[] u1normals = new triple[3]; triple[] v0normals = new triple[3]; triple[] v1normals = new triple[3]; for (int i = 1; i <= 3; ++i) { v0normals[i-1] = unit(normalat(point(external, i/4))); u1normals[i-1] = unit(normalat(point(external, 1 + i/4))); v1normals[i-1] = unit(normalat(point(external, 3 - i/4))); u0normals[i-1] = unit(normalat(point(external, 4 - i/4))); } return patchwithnormals(external, u0normals, u1normals, v0normals, v1normals); } /***********************************************/ /********* DUAL CUBE GRAPH UTILITY *************/ /***********************************************/ // Suppose a plane intersects a (hollow) cube, and // does not intersect any vertices. Then its intersection // with cube forms a cycle. The goal of the code below // is to reconstruct the order of the cycle // given only an unordered list of which edges the plane // intersects. // // Basically, the question is this: If we know the points // in which a more-or-less planar surface intersects the // edges of cube, how do we connect those points? // // When I wrote the code, I was thinking in terms of the // dual graph of a cube, in which "vertices" are really // faces of the cube and "edges" connect those "vertices." // An enum for the different "vertices" (i.e. faces) // available. NULL_VERTEX is primarily intended as a // return value to indicate the absence of a desired // vertex. private int NULL_VERTEX = -1; private int XHIGH = 0; private int XLOW = 1; private int YHIGH = 2; private int YLOW = 3; private int ZHIGH = 4; private int ZLOW = 5; // An unordered set of nonnegative integers. // Since the intent is to use // only the six values from the enum above, no effort // was made to use scalable algorithms. struct intset { private bool[] ints = new bool[0]; private int size = 0; bool contains(int item) { assert(item >= 0); if (item >= ints.length) return false; return ints[item]; } // Returns true if the item was added (i.e., was // not already present). bool add(int item) { assert(item >= 0); while (item >= ints.length) ints.push(false); if (ints[item]) return false; ints[item] = true; ++size; return true; } int[] elements() { int[] toreturn; for (int i = 0; i < ints.length; ++i) { if (ints[i]) toreturn.push(i); } return toreturn; } int size() { return size; } } // A map from integers to sets of integers. Again, no // attempt is made to use scalable data structures. struct int_to_intset { int[] keys = new int[0]; intset[] values = new intset[0]; void add(int key, int value) { for (int i = 0; i < keys.length; ++i) { if (keys[i] == key) { values[i].add(value); return; } } keys.push(key); intset newset; values.push(newset); newset.add(value); } private int indexOf(int key) { for (int i = 0; i < keys.length; ++i) { if (keys[i] == key) return i; } return -1; } int[] get(int key) { int i = indexOf(key); if (i < 0) return new int[0]; else return values[i].elements(); } int numvalues(int key) { int i = indexOf(key); if (i < 0) return 0; else return values[i].size(); } int numkeys() { return keys.length; } } // A struct intended to represent an undirected edge between // two "vertices." struct edge { int start; int end; void operator init(int a, int b) { start = a; end = b; } bool bordersvertex(int v) { return start == v || end == v; } } string operator cast(edge e) { int a, b; if (e.start <= e.end) {a = e.start; b = e.end;} else {a = e.end; b = e.start; } return (string)a + " <-> " + (string)b; } bool operator == (edge a, edge b) { if (a.start == b.start && a.end == b.end) return true; if (a.start == b.end && a.end == b.start) return true; return false; } string operator cast(edge[] edges) { string toreturn = "{ "; for (int i = 0; i < edges.length; ++i) { toreturn += edges[i]; if (i < edges.length-1) toreturn += ", "; } return toreturn + " }"; } // Finally, the function that strings together a list of edges // into a cycle. It makes assumptions that hold true if the // list of edges did in fact come from a plane intersection // containing no vertices of the cube. For instance, such a // plane can contain at most two noncollinear points of any // one face; consequently, no face can border more than two of // the selected edges. // // If the underlying assumptions prove to be false, the function // returns null. int[] makecircle(edge[] edges) { if (edges.length == 0) return new int[0]; int_to_intset graph; for (edge e : edges) { graph.add(e.start, e.end); graph.add(e.end, e.start); } int currentvertex = edges[0].start; int startvertex = currentvertex; int lastvertex = NULL_VERTEX; int[] toreturn = new int[0]; do { toreturn.push(currentvertex); int[] adjacentvertices = graph.get(currentvertex); if (adjacentvertices.length != 2) return null; for (int v : adjacentvertices) { if (v != lastvertex) { lastvertex = currentvertex; currentvertex = v; break; } } } while (currentvertex != startvertex); if (toreturn.length != graph.numkeys()) return null; toreturn.cyclic = true; return toreturn; } /***********************************************/ /********** PATHS BETWEEN POINTS ***************/ /***********************************************/ // Construct paths between two points with additional // constraints; for instance, the path must be orthogonal // to a certain vector at each of the endpoints, must // lie within a specified plane or a specified face // of a rectangular solid,.... // A vector (typically a normal vector) at a specified position. struct positionedvector { triple position; triple direction; void operator init(triple position, triple direction) { this.position = position; this.direction = direction; } } string operator cast(positionedvector vv) { return "position: " + (string)(vv.position) + " vector: " + (string)vv.direction; } // The angle, in degrees, between two vectors. real angledegrees(triple a, triple b) { real dotprod = dot(a,b); real lengthprod = max(abs(a) * abs(b), abs(dotprod)); if (lengthprod == 0) return 0; return aCos(dotprod / lengthprod); } // A path (single curved segment) between two points. At each point // is specified a vector orthogonal to the path. path3 pathbetween(positionedvector v1, positionedvector v2) { triple n1 = unit(v1.direction); triple n2 = unit(v2.direction); triple p1 = v1.position; triple p2 = v2.position; triple delta = p2-p1; triple dir1 = delta - dot(delta, n1)*n1; triple dir2 = delta - dot(delta, n2)*n2; return p1 {dir1} .. {dir2} p2; } // Assuming v1 and v2 are linearly independent, returns an array {a, b} // such that a v1 + b v2 is the orthogonal projection of toproject onto // the span of v1 and v2. If v1 and v2 are dependent, returns an empty array // (if warn==false) or throws an error (if warn==true). real[] projecttospan_findcoeffs(triple toproject, triple v1, triple v2, bool warn=false) { real[][] matrix = {{v1.x, v2.x}, {v1.y, v2.y}, {v1.z, v2.z}}; real[] desiredanswer = {toproject.x, toproject.y, toproject.z}; return leastsquares(matrix, desiredanswer, warn=warn); } // Project the triple toproject into the span of a and b, but restrict // to the quarter-plane of linear combinations a v1 + b v2 such that // a >= mincoeff and b >= mincoeff. If v1 and v2 are linearly dependent, // return a random (positive) linear combination. triple projecttospan(triple toproject, triple v1, triple v2, real mincoeff = 0.05) { real[] coeffs = projecttospan_findcoeffs(toproject, v1, v2, warn=false); real a, b; if (coeffs.length == 0) { a = mincoeff + unitrand(); b = mincoeff + unitrand(); } else { a = max(coeffs[0], mincoeff); b = max(coeffs[1], mincoeff); } return a*v1 + b*v2; } // A path between two specified vertices of a cyclic path. The // path tangent at each endpoint is guaranteed to lie within the // quarter-plane spanned by positive linear combinations of the // tangents of the two outgoing paths at that endpoint. path3 pathbetween(path3 edgecycle, int vertex1, int vertex2) { triple point1 = point(edgecycle, vertex1); triple point2 = point(edgecycle, vertex2); triple v1 = -dir(edgecycle, vertex1, sign=-1); triple v2 = dir(edgecycle, vertex1, sign= 1); triple direction1 = projecttospan(unit(point2-point1), v1, v2); v1 = -dir(edgecycle, vertex2, sign=-1); v2 = dir(edgecycle, vertex2, sign= 1); triple direction2 = projecttospan(unit(point1-point2), v1, v2); return point1 {direction1} .. {-direction2} point2; } // This function applies a heuristic to choose two "opposite" // vertices (separated by three segments) of edgecycle, which // is required to be a cyclic path consisting of 5 or 6 segments. // The two chosen vertices are pushed to savevertices. // // The function returns a path between the two chosen vertices. The // path tangent at each endpoint is guaranteed to lie within the // quarter-plane spanned by positive linear combinations of the // tangents of the two outgoing paths at that endpoint. path3 bisector(path3 edgecycle, int[] savevertices) { real mincoeff = 0.05; assert(cyclic(edgecycle)); int n = length(edgecycle); assert(n >= 5 && n <= 6); triple[] forwarddirections = sequence(new triple(int i) { return dir(edgecycle, i, sign=1); }, n); forwarddirections.cyclic = true; triple[] backwarddirections = sequence(new triple(int i) { return -dir(edgecycle, i, sign=-1); }, n); backwarddirections.cyclic = true; real[] angles = sequence(new real(int i) { return angledegrees(forwarddirections[i], backwarddirections[i]); }, n); angles.cyclic = true; int lastindex = (n == 5 ? 4 : 2); real maxgoodness = 0; int chosenindex = -1; triple directionout, directionin; for (int i = 0; i <= lastindex; ++i) { int opposite = i + 3; triple vec = unit(point(edgecycle, opposite) - point(edgecycle, i)); real[] coeffsbegin = projecttospan_findcoeffs(vec, forwarddirections[i], backwarddirections[i]); if (coeffsbegin.length == 0) continue; coeffsbegin[0] = max(coeffsbegin[0], mincoeff); coeffsbegin[1] = max(coeffsbegin[1], mincoeff); real[] coeffsend = projecttospan_findcoeffs(-vec, forwarddirections[opposite], backwarddirections[opposite]); if (coeffsend.length == 0) continue; coeffsend[0] = max(coeffsend[0], mincoeff); coeffsend[1] = max(coeffsend[1], mincoeff); real goodness = angles[i] * angles[opposite] * coeffsbegin[0] * coeffsend[0] * coeffsbegin[1] * coeffsend[1]; if (goodness > maxgoodness) { maxgoodness = goodness; directionout = coeffsbegin[0] * forwarddirections[i] + coeffsbegin[1] * backwarddirections[i]; directionin = -(coeffsend[0] * forwarddirections[opposite] + coeffsend[1] * backwarddirections[opposite]); chosenindex = i; } } if (chosenindex == -1) { savevertices.push(0); savevertices.push(3); return pathbetween(edgecycle, 0, 3); } else { savevertices.push(chosenindex); savevertices.push(chosenindex+3); return point(edgecycle, chosenindex) {directionout} .. {directionin} point(edgecycle, chosenindex + 3); } } // A path between two specified points (with specified normals) that lies // within a specified face of a rectangular solid. path3 pathinface(positionedvector v1, positionedvector v2, triple facenorm, triple edge1normout, triple edge2normout) { triple dir1 = cross(v1.direction, facenorm); real dotprod = dot(dir1, edge1normout); if (dotprod > 0) dir1 = -dir1; // Believe it or not, this "tiebreaker" is actually relevant at times, // for instance, when graphing the cone x^2 + y^2 = z^2 over the region // -1 <= x,y,z <= 1. else if (dotprod == 0 && dot(dir1, v2.position - v1.position) < 0) dir1 = -dir1; triple dir2 = cross(v2.direction, facenorm); dotprod = dot(dir2, edge2normout); if (dotprod < 0) dir2 = -dir2; else if (dotprod == 0 && dot(dir2, v2.position - v1.position) < 0) dir2 = -dir2; return v1.position {dir1} .. {dir2} v2.position; } triple normalout(int face) { if (face == XHIGH) return X; else if (face == YHIGH) return Y; else if (face == ZHIGH) return Z; else if (face == XLOW) return -X; else if (face == YLOW) return -Y; else if (face == ZLOW) return -Z; else return O; } // A path between two specified points (with specified normals) that lies // within a specified face of a rectangular solid. path3 pathinface(positionedvector v1, positionedvector v2, int face, int edge1face, int edge2face) { return pathinface(v1, v2, normalout(face), normalout(edge1face), normalout(edge2face)); } /***********************************************/ /******** DRAWING IMPLICIT SURFACES ************/ /***********************************************/ // DEPRECATED // Quadrilateralization: // Produce a surface (array of *nondegenerate* Bezier patches) with a // specified three-segment boundary. The surface should approximate the // zero locus of the specified f with its specified gradient. // // If it is not possible to produce the desired result without leaving the // specified rectangular region, returns a length-zero array. // // Dividing a triangle into smaller quadrilaterals this way is opposite // the usual trend in mathematics. However, *before the introduction of bezier // triangles,* the pathwithnormals algorithm // did a poor job of choosing a good surface when the boundary path did // not consist of four positive-length segments. patch[] triangletoquads(path3 external, real f(triple), triple grad(triple), triple a, triple b) { static real epsilon = 1e-3; assert(length(external) == 3); assert(cyclic(external)); triple c0 = point(external, 0); triple c1 = point(external, 1); triple c2 = point(external, 2); triple center = (c0 + c1 + c2) / 3; triple n = unit(cross(c1-c0, c2-c0)); real g(real t) { return f(center + t*n); } real tmin = -realMax, tmax = realMax; void absorb(real t) { if (t < 0) tmin = max(t,tmin); else tmax = min(t,tmax); } if (n.x != 0) { absorb((a.x - center.x) / n.x); absorb((b.x - center.x) / n.x); } if (n.y != 0) { absorb((a.y - center.y) / n.y); absorb((b.y - center.y) / n.y); } if (n.z != 0) { absorb((a.z - center.z) / n.z); absorb((b.z - center.z) / n.z); } real fa = g(tmin); real fb = g(tmax); if ((fa > 0 && fb > 0) || (fa < 0 && fb < 0)) { return new patch[0]; } else { real t = findroot(g, tmin, tmax, fa=fa, fb=fb); center += t * n; } n = unit(grad(center)); triple m0 = point(external, 0.5); positionedvector m0 = positionedvector(m0, unit(grad(m0))); triple m1 = point(external, 1.5); positionedvector m1 = positionedvector(m1, unit(grad(m1))); triple m2 = point(external, 2.5); positionedvector m2 = positionedvector(m2, unit(grad(m2))); positionedvector c = positionedvector(center, unit(grad(center))); path3 pathto_m0 = pathbetween(c, m0); path3 pathto_m1 = pathbetween(c, m1); path3 pathto_m2 = pathbetween(c, m2); path3 quad0 = subpath(external, 0, 0.5) & reverse(pathto_m0) & pathto_m2 & subpath(external, -0.5, 0) & cycle; path3 quad1 = subpath(external, 1, 1.5) & reverse(pathto_m1) & pathto_m0 & subpath(external, 0.5, 1) & cycle; path3 quad2 = subpath(external, 2, 2.5) & reverse(pathto_m2) & pathto_m1 & subpath(external, 1.5, 2) & cycle; return new patch[] {patchwithnormals(quad0, grad), patchwithnormals(quad1, grad), patchwithnormals(quad2, grad)}; } // Attempts to fill the path external (which should by a cyclic path consisting of // three segments) with bezier triangle(s). Returns an empty array if it fails. // // In more detail: A single bezier triangle is computed using trianglewithnormals. The normals of // the resulting triangle at the midpoint of each edge are computed. If any of these normals // is in the negative f direction, the external triangle is subdivided into four external triangles // and the same procedure is applied to each. If one or more of them has an incorrectly oriented // edge normal, the function gives up and returns an empty array. // // Thus, the returned array consists of 0, 1, or 4 bezier triangles; no other array lengths // are possible. // // This function assumes that the path orientation is consistent with f (and its gradient) // -- i.e., that // at a corner, (tangent in) x (tangent out) is in the positive f direction. patch[] maketriangle(path3 external, real f(triple), triple grad(triple), bool allowsubdivide = true) { assert(cyclic(external)); assert(length(external) == 3); triple m1 = point(external, 0.5); triple n1 = unit(grad(m1)); triple m2 = point(external, 1.5); triple n2 = unit(grad(m2)); triple m3 = point(external, 2.5); triple n3 = unit(grad(m3)); patch beziertriangle = trianglewithnormals(external, n1, n2, n3); if (dot(n1, beziertriangle.normal(0.5, 0)) >= 0 && dot(n2, beziertriangle.normal(0.5, 0.5)) >= 0 && dot(n3, beziertriangle.normal(0, 0.5)) >= 0) return new patch[] {beziertriangle}; if (!allowsubdivide) return new patch[0]; positionedvector m1 = positionedvector(m1, n1); positionedvector m2 = positionedvector(m2, n2); positionedvector m3 = positionedvector(m3, n3); path3 p12 = pathbetween(m1, m2); path3 p23 = pathbetween(m2, m3); path3 p31 = pathbetween(m3, m1); patch[] triangles = maketriangle(p12 & p23 & p31 & cycle, f, grad=grad, allowsubdivide=false); if (triangles.length < 1) return new patch[0]; triangles.append(maketriangle(subpath(external, -0.5, 0.5) & reverse(p31) & cycle, f, grad=grad, allowsubdivide=false)); if (triangles.length < 2) return new patch[0]; triangles.append(maketriangle(subpath(external, 0.5, 1.5) & reverse(p12) & cycle, f, grad=grad, allowsubdivide=false)); if (triangles.length < 3) return new patch[0]; triangles.append(maketriangle(subpath(external, 1.5, 2.5) & reverse(p23) & cycle, f, grad=grad, allowsubdivide=false)); if (triangles.length < 4) return new patch[0]; return triangles; } // Returns true if the point is "nonsingular" (in the sense that the magnitude // of the gradient is not too small) AND very close to the zero locus of f // (assuming f is locally linear). bool check_fpt_zero(triple testpoint, real f(triple), triple grad(triple)) { real testval = f(testpoint); real slope = abs(grad(testpoint)); static real tolerance = 2*rootfinder_settings.roottolerance; return !(slope > tolerance && abs(testval) / slope > tolerance); } // Returns true if pt lies within the rectangular solid with // opposite corners at a and b. bool checkptincube(triple pt, triple a, triple b) { real xmin = a.x; real xmax = b.x; real ymin = a.y; real ymax = b.y; real zmin = a.z; real zmax = b.z; if (xmin > xmax) { real t = xmax; xmax=xmin; xmin=t; } if (ymin > ymax) { real t = ymax; ymax=ymin; ymin=t; } if (zmin > zmax) { real t = zmax; zmax=zmin; zmin=t; } return ((xmin <= pt.x) && (pt.x <= xmax) && (ymin <= pt.y) && (pt.y <= ymax) && (zmin <= pt.z) && (pt.z <= zmax)); } // A convenience function for combining the previous two tests. bool checkpt(triple testpt, real f(triple), triple grad(triple), triple a, triple b) { return checkptincube(testpt, a, b) && check_fpt_zero(testpt, f, grad); } // Attempts to fill in the boundary cycle with a collection of // patches to approximate smoothly the zero locus of f. If unable to // do so while satisfying certain checks, returns null. // This is distinct from returning an empty // array, which merely indicates that the boundary cycle is too small // to be worth filling in. patch[] quadpatches(path3 edgecycle, positionedvector[] corners, real f(triple), triple grad(triple), triple a, triple b, bool usetriangles) { assert(corners.cyclic); // The tolerance for considering two points "essentially identical." static real tolerance = 2.5 * rootfinder_settings.roottolerance; // If there are two neighboring vertices that are essentially identical, // unify them into one. for (int i = 0; i < corners.length; ++i) { if (abs(corners[i].position - corners[i+1].position) < tolerance) { if (corners.length == 2) return new patch[0]; corners.delete(i); edgecycle = subpath(edgecycle, 0, i) & subpath(edgecycle, i+1, length(edgecycle)) & cycle; --i; assert(length(edgecycle) == corners.length); } } static real areatolerance = tolerance^2; assert(corners.length >= 2); if (corners.length == 2) { // If the area is too small, just ignore it; otherwise, subdivide. real area0 = abs(cross(-dir(edgecycle, 0, sign=-1, normalize=false), dir(edgecycle, 0, sign=1, normalize=false))); real area1 = abs(cross(-dir(edgecycle, 1, sign=-1, normalize=false), dir(edgecycle, 1, sign=1, normalize=false))); if (area0 < areatolerance && area1 < areatolerance) return new patch[0]; else return null; } if (length(edgecycle) > 6) abort("too many edges: not possible."); for (int i = 0; i < length(edgecycle); ++i) { if (angledegrees(dir(edgecycle,i,sign=1), dir(edgecycle,i+1,sign=-1)) > 80) { return null; } } if (length(edgecycle) == 3) { patch[] toreturn = usetriangles ? maketriangle(edgecycle, f, grad) : triangletoquads(edgecycle, f, grad, a, b); if (toreturn.length == 0) return null; else return toreturn; } if (length(edgecycle) == 4) { return new patch[] {patchwithnormals(edgecycle, grad)}; } int[] bisectorindices; path3 middleguide = bisector(edgecycle, bisectorindices); triple testpoint = point(middleguide, 0.5); if (!checkpt(testpoint, f, grad, a, b)) { return null; } patch[] toreturn = null; path3 firstpatch = subpath(edgecycle, bisectorindices[0], bisectorindices[1]) & reverse(middleguide) & cycle; if (length(edgecycle) == 5) { path3 secondpatch = middleguide & subpath(edgecycle, bisectorindices[1], 5+bisectorindices[0]) & cycle; toreturn = usetriangles ? maketriangle(secondpatch, f, grad) : triangletoquads(secondpatch, f, grad, a, b); if (toreturn.length == 0) return null; toreturn.push(patchwithnormals(firstpatch, grad)); } else { // now length(edgecycle) == 6 path3 secondpatch = middleguide & subpath(edgecycle, bisectorindices[1], 6+bisectorindices[0]) & cycle; toreturn = new patch[] {patchwithnormals(firstpatch, grad), patchwithnormals(secondpatch, grad)}; } return toreturn; } // Numerical gradient of a function typedef triple vectorfunction(triple); vectorfunction nGrad(real f(triple)) { static real epsilon = 1e-3; return new triple(triple v) { return ( (f(v + epsilon*X) - f(v - epsilon*X)) / (2 epsilon), (f(v + epsilon*Y) - f(v - epsilon*Y)) / (2 epsilon), (f(v + epsilon*Z) - f(v - epsilon*Z)) / (2 epsilon) ); }; } // A point together with a value at that location. struct evaluatedpoint { triple pt; real value; void operator init(triple pt, real value) { this.pt = pt; this.value = value; } } triple operator cast(evaluatedpoint p) { return p.pt; } // Compute the values of a function at every vertex of an nx by ny by nz // array of rectangular solids. evaluatedpoint[][][] make3dgrid(triple a, triple b, int nx, int ny, int nz, real f(triple), bool allowzero = false) { evaluatedpoint[][][] toreturn = new evaluatedpoint[nx+1][ny+1][nz+1]; for (int i = 0; i <= nx; ++i) { for (int j = 0; j <= ny; ++j) { for (int k = 0; k <= nz; ++k) { triple pt = (interp(a.x, b.x, i/nx), interp(a.y, b.y, j/ny), interp(a.z, b.z, k/nz)); real value = f(pt); if (value == 0 && !allowzero) value = 1e-5; toreturn[i][j][k] = evaluatedpoint(pt, value); } } } return toreturn; } // The following utilities make, for instance, slice(A, i, j, k, l) // equivalent to what A[i:j][k:l] ought to mean for two- and three- // -dimensional arrays of evaluatedpoints and of positionedvectors. typedef evaluatedpoint T; T[][] slice(T[][] a, int start1, int end1, int start2, int end2) { T[][] toreturn = new T[end1-start1][]; for (int i = start1; i < end1; ++i) { toreturn[i-start1] = a[i][start2:end2]; } return toreturn; } T[][][] slice(T[][][] a, int start1, int end1, int start2, int end2, int start3, int end3) { T[][][] toreturn = new T[end1-start1][][]; for (int i = start1; i < end1; ++i) { toreturn[i-start1] = slice(a[i], start2, end2, start3, end3); } return toreturn; } typedef positionedvector T; T[][] slice(T[][] a, int start1, int end1, int start2, int end2) { T[][] toreturn = new T[end1-start1][]; for (int i = start1; i < end1; ++i) { toreturn[i-start1] = a[i][start2:end2]; } return toreturn; } T[][][] slice(T[][][] a, int start1, int end1, int start2, int end2, int start3, int end3) { T[][][] toreturn = new T[end1-start1][][]; for (int i = start1; i < end1; ++i) { toreturn[i-start1] = slice(a[i], start2, end2, start3, end3); } return toreturn; } // An object of class gridwithzeros stores the values of a function at each vertex // of a three-dimensional grid, together with zeros of the function along edges // of the grid and the gradient of the function at each such zero. struct gridwithzeros { int nx, ny, nz; evaluatedpoint[][][] corners; positionedvector[][][] xdirzeros; positionedvector[][][] ydirzeros; positionedvector[][][] zdirzeros; triple grad(triple); real f(triple); int maxdepth; bool usetriangles; // Populate the edges with zeros that have a sign change and are not already // populated. void fillzeros() { for (int j = 0; j < ny+1; ++j) { for (int k = 0; k < nz+1; ++k) { real y = corners[0][j][k].pt.y; real z = corners[0][j][k].pt.z; real f_along_x(real t) { return f((t, y, z)); } for (int i = 0; i < nx; ++i) { if (xdirzeros[i][j][k] != null) continue; evaluatedpoint start = corners[i][j][k]; evaluatedpoint end = corners[i+1][j][k]; if ((start.value > 0 && end.value > 0) || (start.value < 0 && end.value < 0)) xdirzeros[i][j][k] = null; else { triple root = (0,y,z); root += X * findroot(f_along_x, start.pt.x, end.pt.x, fa=start.value, fb=end.value); triple normal = grad(root); xdirzeros[i][j][k] = positionedvector(root, normal); } } } } for (int i = 0; i < nx+1; ++i) { for (int k = 0; k < nz+1; ++k) { real x = corners[i][0][k].pt.x; real z = corners[i][0][k].pt.z; real f_along_y(real t) { return f((x, t, z)); } for (int j = 0; j < ny; ++j) { if (ydirzeros[i][j][k] != null) continue; evaluatedpoint start = corners[i][j][k]; evaluatedpoint end = corners[i][j+1][k]; if ((start.value > 0 && end.value > 0) || (start.value < 0 && end.value < 0)) ydirzeros[i][j][k] = null; else { triple root = (x,0,z); root += Y * findroot(f_along_y, start.pt.y, end.pt.y, fa=start.value, fb=end.value); triple normal = grad(root); ydirzeros[i][j][k] = positionedvector(root, normal); } } } } for (int i = 0; i < nx+1; ++i) { for (int j = 0; j < ny+1; ++j) { real x = corners[i][j][0].pt.x; real y = corners[i][j][0].pt.y; real f_along_z(real t) { return f((x, y, t)); } for (int k = 0; k < nz; ++k) { if (zdirzeros[i][j][k] != null) continue; evaluatedpoint start = corners[i][j][k]; evaluatedpoint end = corners[i][j][k+1]; if ((start.value > 0 && end.value > 0) || (start.value < 0 && end.value < 0)) zdirzeros[i][j][k] = null; else { triple root = (x,y,0); root += Z * findroot(f_along_z, start.pt.z, end.pt.z, fa=start.value, fb=end.value); triple normal = grad(root); zdirzeros[i][j][k] = positionedvector(root, normal); } } } } } // Fill in the grid vertices and the zeros along edges. Each cube starts at // depth one and the depth increases each time it subdivides; maxdepth is the // maximum subdivision depth. When a cube at maxdepth cannot be resolved to // patches, it is left empty. void operator init(int nx, int ny, int nz, real f(triple), triple a, triple b, int maxdepth = 6, bool usetriangles) { this.nx = nx; this.ny = ny; this.nz = nz; grad = nGrad(f); this.f = f; this.maxdepth = maxdepth; this.usetriangles = usetriangles; corners = make3dgrid(a, b, nx, ny, nz, f); xdirzeros = new positionedvector[nx][ny+1][nz+1]; ydirzeros = new positionedvector[nx+1][ny][nz+1]; zdirzeros = new positionedvector[nx+1][ny+1][nz]; for (int i = 0; i <= nx; ++i) { for (int j = 0; j <= ny; ++j) { for (int k = 0; k <= nz; ++k) { if (i < nx) xdirzeros[i][j][k] = null; if (j < ny) ydirzeros[i][j][k] = null; if (k < nz) zdirzeros[i][j][k] = null; } } } fillzeros(); } // Doubles nx, ny, and nz by halving the sizes of the cubes along the x, y, and z // directions (resulting in 8 times as many cubes). Already existing data about // function values and zeros is copied; vertices and edges with no such pre-existing // data are populated. // // Returns true if subdivide succeeded, false if it failed (because maxdepth // was exceeded). bool subdivide() { if (maxdepth <= 1) { return false; } --maxdepth; triple a = corners[0][0][0]; triple b = corners[nx][ny][nz]; nx *= 2; ny *= 2; nz *= 2; evaluatedpoint[][][] oldcorners = corners; corners = new evaluatedpoint[nx+1][ny+1][nz+1]; for (int i = 0; i <= nx; ++i) { for (int j = 0; j <= ny; ++j) { for (int k = 0; k <= nz; ++k) { if (i % 2 == 0 && j % 2 == 0 && k % 2 == 0) { corners[i][j][k] = oldcorners[quotient(i,2)][quotient(j,2)][quotient(k,2)]; } else { triple pt = (interp(a.x, b.x, i/nx), interp(a.y, b.y, j/ny), interp(a.z, b.z, k/nz)); real value = f(pt); if (value == 0) value = 1e-5; corners[i][j][k] = evaluatedpoint(pt, value); } } } } positionedvector[][][] oldxdir = xdirzeros; xdirzeros = new positionedvector[nx][ny+1][nz+1]; for (int i = 0; i < nx; ++i) { for (int j = 0; j < ny + 1; ++j) { for (int k = 0; k < nz + 1; ++k) { if (j % 2 != 0 || k % 2 != 0) { xdirzeros[i][j][k] = null; } else { positionedvector zero = oldxdir[quotient(i,2)][quotient(j,2)][quotient(k,2)]; if (zero == null) { xdirzeros[i][j][k] = null; continue; } real x = zero.position.x; if (x > interp(a.x, b.x, i/nx) && x < interp(a.x, b.x, (i+1)/nx)) { xdirzeros[i][j][k] = zero; } else { xdirzeros[i][j][k] = null; } } } } } positionedvector[][][] oldydir = ydirzeros; ydirzeros = new positionedvector[nx+1][ny][nz+1]; for (int i = 0; i < nx+1; ++i) { for (int j = 0; j < ny; ++j) { for (int k = 0; k < nz + 1; ++k) { if (i % 2 != 0 || k % 2 != 0) { ydirzeros[i][j][k] = null; } else { positionedvector zero = oldydir[quotient(i,2)][quotient(j,2)][quotient(k,2)]; if (zero == null) { ydirzeros[i][j][k] = null; continue; } real y = zero.position.y; if (y > interp(a.y, b.y, j/ny) && y < interp(a.y, b.y, (j+1)/ny)) { ydirzeros[i][j][k] = zero; } else { ydirzeros[i][j][k] = null; } } } } } positionedvector[][][] oldzdir = zdirzeros; zdirzeros = new positionedvector[nx+1][ny+1][nz]; for (int i = 0; i < nx + 1; ++i) { for (int j = 0; j < ny + 1; ++j) { for (int k = 0; k < nz; ++k) { if (i % 2 != 0 || j % 2 != 0) { zdirzeros[i][j][k] = null; } else { positionedvector zero = oldzdir[quotient(i,2)][quotient(j,2)][quotient(k,2)]; if (zero == null) { zdirzeros[i][j][k] = null; continue; } real z = zero.position.z; if (z > interp(a.z, b.z, k/nz) && z < interp(a.z, b.z, (k+1)/nz)) { zdirzeros[i][j][k] = zero; } else { zdirzeros[i][j][k] = null; } } } } } fillzeros(); return true; } // Forward declaration of the draw method, which will be called by drawcube(). patch[] draw(bool[] reportactive = null); // Construct the patches, assuming that we are working // with a single cube (nx = ny = nz = 1). This method will subdivide the // cube if necessary. The parameter reportactive should be an array of // length 6. Setting an entry to true indicates that the surface abuts the // corresponding face (according to the earlier enum), and thus that the // algorithm should be sure that something is drawn in the cube sharing // that face--even if all the vertices of that cube have the same sign. patch[] drawcube(bool[] reportactive = null) { // First, determine which edges (if any) actually have zeros on them. edge[] zeroedges = new edge[0]; positionedvector[] zeros = new positionedvector[0]; int currentface, nextface; void pushifnonnull(positionedvector v) { if (v != null) { zeroedges.push(edge(currentface, nextface)); zeros.push(v); } } positionedvector findzero(int face1, int face2) { edge e = edge(face1, face2); for (int i = 0; i < zeroedges.length; ++i) { if (zeroedges[i] == e) return zeros[i]; } return null; } currentface = XLOW; nextface = YHIGH; pushifnonnull(zdirzeros[0][1][0]); nextface = YLOW; pushifnonnull(zdirzeros[0][0][0]); nextface = ZHIGH; pushifnonnull(ydirzeros[0][0][1]); nextface = ZLOW; pushifnonnull(ydirzeros[0][0][0]); currentface = XHIGH; nextface = YHIGH; pushifnonnull(zdirzeros[1][1][0]); nextface = YLOW; pushifnonnull(zdirzeros[1][0][0]); nextface = ZHIGH; pushifnonnull(ydirzeros[1][0][1]); nextface = ZLOW; pushifnonnull(ydirzeros[1][0][0]); currentface = YHIGH; nextface = ZHIGH; pushifnonnull(xdirzeros[0][1][1]); currentface = ZHIGH; nextface = YLOW; pushifnonnull(xdirzeros[0][0][1]); currentface = YLOW; nextface = ZLOW; pushifnonnull(xdirzeros[0][0][0]); currentface = ZLOW; nextface = YHIGH; pushifnonnull(xdirzeros[0][1][0]); //Now, string those edges together to make a circle. patch[] subdividecube() { if (!subdivide()) { return new patch[0]; } return draw(reportactive); } if (zeroedges.length < 3) { return subdividecube(); } int[] faceorder = makecircle(zeroedges); if (alias(faceorder,null)) { return subdividecube(); } positionedvector[] patchcorners = new positionedvector[0]; for (int i = 0; i < faceorder.length; ++i) { patchcorners.push(findzero(faceorder[i], faceorder[i+1])); } patchcorners.cyclic = true; //Now, produce the cyclic path around the edges. path3 edgecycle; for (int i = 0; i < faceorder.length; ++i) { path3 currentpath = pathinface(patchcorners[i], patchcorners[i+1], faceorder[i+1], faceorder[i], faceorder[i+2]); triple testpoint = point(currentpath, 0.5); if (!checkpt(testpoint, f, grad, corners[0][0][0], corners[1][1][1])) { return subdividecube(); } edgecycle = edgecycle & currentpath; } edgecycle = edgecycle & cycle; { // Ensure the outward normals are pointing in the same direction as the gradient. triple tangentin = patchcorners[0].position - precontrol(edgecycle, 0); triple tangentout = postcontrol(edgecycle, 0) - patchcorners[0].position; triple normal = cross(tangentin, tangentout); if (dot(normal, patchcorners[0].direction) < 0) { edgecycle = reverse(edgecycle); patchcorners = patchcorners[-sequence(patchcorners.length)]; patchcorners.cyclic = true; } } patch[] toreturn = quadpatches(edgecycle, patchcorners, f, grad, corners[0][0][0], corners[1][1][1], usetriangles); if (alias(toreturn, null)) return subdividecube(); return toreturn; } // Extracts the specified cube as a gridwithzeros object with // nx = ny = nz = 1. gridwithzeros getcube(int i, int j, int k) { gridwithzeros cube = new gridwithzeros; cube.grad = grad; cube.f = f; cube.nx = 1; cube.ny = 1; cube.nz = 1; cube.maxdepth = maxdepth; cube.usetriangles = usetriangles; cube.corners = slice(corners,i,i+2,j,j+2,k,k+2); cube.xdirzeros = slice(xdirzeros,i,i+1,j,j+2,k,k+2); cube.ydirzeros = slice(ydirzeros,i,i+2,j,j+1,k,k+2); cube.zdirzeros = slice(zdirzeros,i,i+2,j,j+2,k,k+1); return cube; } // Returns an array of patches representing the surface. // The parameter reportactive should be an array of // length 6. Setting an entry to true indicates that the surface abuts the // corresponding face of the cube that bounds the entire grid. // // If reportactive == null, it is assumed that this is a top-level call; // a dot is printed to stdout for each cube drawn as a very rough // progress indicator. // // If reportactive != null, then it is assumed that the caller had a strong // reason to believe that this grid contains a part of the surface; the // grid will subdivide all the way to maxdepth if necessary to find points // on the surface. draw = new patch[](bool[] reportactive = null) { if (alias(reportactive, null)) progress(true); // A list of all the patches not already drawn but known // to contain part of the surface. This "queue" is // actually implemented as stack for simplicity, since // it does not make any difference. In a multi-threaded // version of the algorithm, a queue (shared across all threads) // would make more sense than a stack. triple[] queue = new triple[0]; bool[][][] enqueued = new bool[nx][ny][nz]; for (int i = 0; i < enqueued.length; ++i) { for (int j = 0; j < enqueued[i].length; ++j) { for (int k = 0; k < enqueued[i][j].length; ++k) { enqueued[i][j][k] = false; } } } void enqueue(int i, int j, int k) { if (i >= 0 && i < nx && j >= 0 && j < ny && k >= 0 && k < nz && !enqueued[i][j][k]) { queue.push((i,j,k)); enqueued[i][j][k] = true; } if (!alias(reportactive, null)) { if (i < 0) reportactive[XLOW] = true; if (i >= nx) reportactive[XHIGH] = true; if (j < 0) reportactive[YLOW] = true; if (j >= ny) reportactive[YHIGH] = true; if (k < 0) reportactive[ZLOW] = true; if (k >= nz) reportactive[ZHIGH] = true; } } for (int i = 0; i < nx+1; ++i) { for (int j = 0; j < ny+1; ++j) { for (int k = 0; k < nz+1; ++k) { if (i < nx && xdirzeros[i][j][k] != null) { for (int jj = j-1; jj <= j; ++jj) for (int kk = k-1; kk <= k; ++kk) enqueue(i, jj, kk); } if (j < ny && ydirzeros[i][j][k] != null) { for (int ii = i-1; ii <= i; ++ii) for (int kk = k-1; kk <= k; ++kk) enqueue(ii, j, kk); } if (k < nz && zdirzeros[i][j][k] != null) { for (int ii = i-1; ii <= i; ++ii) for (int jj = j-1; jj <= j; ++jj) enqueue(ii, jj, k); } } } } if (!alias(reportactive, null) && queue.length == 0) { if (subdivide()) return draw(reportactive); } patch[] surface = new patch[0]; while (queue.length > 0) { triple coord = queue.pop(); int i = floor(coord.x); int j = floor(coord.y); int k = floor(coord.z); bool[] reportface = array(6, false); patch[] toappend = getcube(i,j,k).drawcube(reportface); if (reportface[XLOW]) enqueue(i-1,j,k); if (reportface[XHIGH]) enqueue(i+1,j,k); if (reportface[YLOW]) enqueue(i,j-1,k); if (reportface[YHIGH]) enqueue(i,j+1,k); if (reportface[ZLOW]) enqueue(i,j,k-1); if (reportface[ZHIGH]) enqueue(i,j,k+1); surface.append(toappend); if (alias(reportactive, null)) progress(); } if (alias(reportactive, null)) progress(false); return surface; }; } // The external interface of this whole module. Accepts exactly one // function (throws an error if two or zero functions are specified). // The function should be differentiable. (Whatever you do, do not // pass in an indicator function!) Ideally, the zero locus of the // function should be smooth; singularities will significantly slow // down the algorithm and potentially give bad results. // // Returns a plot of the zero locus of the function within the // rectangular solid with opposite corners at a and b. // // Additional parameters: // n - the number of initial segments in each of the x, y, z directions. // overlapedges - if true, the patches of the surface are slightly enlarged // to compensate for an artifact in which the viewer can see through the // boundary between patches. (Some of this may actually be a result of // edges not lining up perfectly, but I'm fairly sure a lot of it arises // purely as a rendering artifact.) // nx - override n in the x direction // ny - override n in the y direction // nz - override n in the z direction // maxdepth - the maximum depth to which the algorithm will subdivide in // an effort to find patches that closely approximate the true surface. surface implicitsurface(real f(triple) = null, real ff(real,real,real) = null, triple a, triple b, int n = nmesh, bool keyword overlapedges = false, int keyword nx=n, int keyword ny=n, int keyword nz=n, int keyword maxdepth = 8, bool keyword usetriangles=true) { if (f == null && ff == null) abort("implicitsurface called without specifying a function."); if (f != null && ff != null) abort("Only specify one function when calling implicitsurface."); if (f == null) f = new real(triple w) { return ff(w.x, w.y, w.z); }; gridwithzeros grid = gridwithzeros(nx, ny, nz, f, a, b, maxdepth=maxdepth, usetriangles=usetriangles); patch[] patches = grid.draw(); if (overlapedges) { for (int i = 0; i < patches.length; ++i) { triple center = (patches[i].triangular ? patches[i].point(1/3, 1/3) : patches[i].point(1/2,1/2)); transform3 T=shift(center) * scale3(1.03) * shift(-center); patches[i] = T * patches[i]; } } return surface(...patches); } asymptote-3.05/base/v3d.asy0000644000000000000000000003553015031566105014320 0ustar rootroot// Supakorn "Jamie" Rassameemasuang and // John C. Bowman import three; import v3dtypes; import v3dheadertypes; struct triangleGroup { triple[] positions; triple[] normals; pen[] colors; int[][] positionIndices; int[][] normalIndices; int[][] colorIndices; } struct pixel { triple point; real width; } struct CameraInformation { int canvasWidth; int canvasHeight; bool absolute; triple b; triple B; bool orthographic; real angle; real Zoom0; pair viewportshift; pair viewportmargin; light light; void setCameraInfo() { size(canvasWidth,canvasHeight); triple center=0.5*(b.z+B.z)*Z; if(orthographic) currentprojection=orthographic(Z,target=center,Zoom0, viewportshift=viewportshift); else currentprojection=perspective(Z,Y,target=center,Zoom0, degrees(2.0*atan(tan(0.5*angle)/Zoom0)), viewportshift=viewportshift, autoadjust=false); light.specular=light.diffuse; currentlight=light; } } transform3 Align(real polar, real azimuth) { return align(dir(degrees(polar),degrees(azimuth))); } struct v3dfile { file xdrfile; int version; bool hasCameraInfo=false; CameraInformation info; bool singleprecision=false; triple[] centers; material[] materials; surface[][][] surfaces; path3[][][] paths3; triangleGroup[][][] triangles; pixel[][] pixels; void initSurface(int center, int material) { if(!surfaces.initialized(center)) surfaces[center]=new surface[][]; if(!surfaces[center].initialized(material)) surfaces[center][material]=new surface[] {new surface}; } void initPath3(int center, int material) { if(!paths3.initialized(center)) paths3[center]=new path3[][]; if(!paths3[center].initialized(material)) paths3[center][material]=new path3[]; } void initTriangleGroup(int center, int material) { if (!triangles.initialized(center)) triangles[center]=new triangleGroup[][]; if(!triangles[center].initialized(material)) triangles[center][material]=new triangleGroup[]; } void initPixel(int material) { if(!pixels.initialized(material)) pixels[material]=new pixel[]; } void surface(int center, int material, patch p) { initSurface(center,material); surfaces[center][material][0].s.push(p); } void primitive(int center, int material, surface s) { initSurface(center,material); surfaces[center][material].push(s); } void path3(int center, int material, path3 p) { initPath3(center,material); paths3[center][material].push(p); } void triangleGroup(int center, int material, triangleGroup g) { initTriangleGroup(center,material); triangles[center][material].push(g); } void pixel(int material, pixel P) { initPixel(material); pixels[material].push(P); } void operator init(string name) { xdrfile=input(name, mode="xdrgz"); version=xdrfile; int doubleprecision=xdrfile; singleprecision=doubleprecision == 0; xdrfile.singlereal(singleprecision); } int getType() { return xdrfile; } void setCameraInfo() { if(hasCameraInfo) info.setCameraInfo(); } pen[] readColorData(int size=4, bool alpha=true) { xdrfile.singlereal(true); xdrfile.dimension(alpha ? 4 : 3); pen[] newPen=new pen[size]; for (int i=0; i < size; ++i) { newPen[i]=alpha ? rgba(xdrfile) : rgb((real[]) xdrfile); } xdrfile.singlereal(singleprecision); return newPen; } CameraInformation processHeader() { CameraInformation ci; int entryCount=xdrfile; for (int i=0;i0) centersFetched=xdrfile; return centersFetched; } void readBezierPatchColor() { triple[][] val=readRawPatchData(); int center=xdrfile; int material=xdrfile; pen[] colors=readColorData(4); surface(center,material,patch(val,colors=colors)); } void readBezierTriangleColor() { triple[][] val=readRawTriangleData(); int center=xdrfile; int material=xdrfile; pen[] colors=readColorData(3); surface(center,material,patch(val,triangular=true,colors=colors)); } void readSphere() { triple origin=xdrfile; real radius=xdrfile; int center=xdrfile; int material=xdrfile; surface s=shift(origin)*scale3(radius)*unitsphere; s.primitive=unitsphere.primitive; primitive(center,material,s); } void readHemisphere() { triple origin=xdrfile; real radius=xdrfile; int center=xdrfile; int material=xdrfile; real polar=xdrfile; real azimuth=xdrfile; surface s=shift(origin)*Align(polar,azimuth)*scale3(radius)*unithemisphere; s.primitive=unithemisphere.primitive; primitive(center,material,s); } void readDisk() { triple origin=xdrfile; real radius=xdrfile; int center=xdrfile; int material=xdrfile; real polar=xdrfile; real azimuth=xdrfile; surface s=shift(origin)*Align(polar,azimuth)*scale3(radius)*unitdisk; s.primitive=unitdisk.primitive; primitive(center,material,s); } void readPolygon(int n) { xdrfile.dimension(n); triple[] val=xdrfile; int center=xdrfile; int material=xdrfile; surface(center,material,patch(val)); } void readPolygonColor(int n) { xdrfile.dimension(n); triple[] val=xdrfile; int center=xdrfile; int material=xdrfile; pen[] colors=readColorData(n); surface(center,material,patch(val,colors=colors)); } void readCylinder() { triple origin=xdrfile; real radius=xdrfile; real height=xdrfile; int center=xdrfile; int material=xdrfile; real polar=xdrfile; real azimuth=xdrfile; int core=xdrfile; transform3 T=shift(origin)*Align(polar,azimuth)* scale(radius,radius,height); if(core != 0) path3(center,material,T*(O--Z)); surface s=T*unitcylinder; s.primitive=unitcylinder.primitive; primitive(center,material,s); } void readTube() { xdrfile.dimension(4); triple[] g=xdrfile; real width=xdrfile; int center=xdrfile; int material=xdrfile; int core=xdrfile; if(core != 0) path3(center,material,g[0]..controls g[1] and g[2]..g[3]); surface s=tube(g[0],g[1],g[2],g[3],width); s.primitive=primitive(drawTube(g,width,info.b,info.B), new bool(transform3 t) { return unscaled(t,X,Y); }); primitive(center,material,s); } void readCurve() { xdrfile.dimension(4); triple[] points=xdrfile; int center=xdrfile; int material=xdrfile; path3(center,material, points[0]..controls points[1] and points[2]..points[3]); } void readLine() { xdrfile.dimension(2); triple[] points=xdrfile; int center=xdrfile; int material=xdrfile; path3(center,material,points[0]--points[1]); } void readTriangles() { triangleGroup g; int nI=xdrfile; int nP=xdrfile; xdrfile.dimension(nP); g.positions=xdrfile; int nN=xdrfile; xdrfile.dimension(nN); g.normals=xdrfile; int explicitNI=xdrfile; int nC=xdrfile; int explicitCI; if (nC > 0) { g.colors=readColorData(nC); explicitCI=xdrfile; } g.positionIndices=new int[nI][3]; g.normalIndices=new int[nI][3]; int[][] colorIndices; if (nC > 0) g.colorIndices=new int[nI][3]; for (int i=0; i < nI; ++i) { xdrfile.dimension(3); g.positionIndices[i]=xdrfile; g.normalIndices[i]=explicitNI != 0 ? xdrfile : g.positionIndices[i]; g.colorIndices[i]=nC > 0 && explicitCI != 0 ? xdrfile : g.positionIndices[i]; } int center=xdrfile; int material=xdrfile; triangleGroup(center,material,g); } void readPixel() { pixel P; P.point=xdrfile; P.width=xdrfile; int material=xdrfile; pixel(material,P); } void process() { static bool processed; if(processed) return; while (!eof(xdrfile)) { int ty=getType(); if(ty == v3dtypes.header) { hasCameraInfo=true; info=processHeader(); } else if(ty == v3dtypes.material) { materials.push(readMaterial()); } else if(ty == v3dtypes.bezierPatch) { readBezierPatch(); } else if(ty == v3dtypes.bezierTriangle) { readBezierTriangle(); } else if(ty == v3dtypes.bezierPatchColor) { readBezierPatchColor(); } else if(ty == v3dtypes.bezierTriangleColor) { readBezierTriangleColor(); } else if(ty == v3dtypes.quad) { readPolygon(4); } else if(ty == v3dtypes.quadColor) { readPolygonColor(4); } else if(ty == v3dtypes.triangle) { readPolygon(3); } else if(ty == v3dtypes.triangleColor) { readPolygonColor(3); } else if(ty == v3dtypes.sphere) { readSphere(); } else if(ty == v3dtypes.halfSphere) { readHemisphere(); } else if(ty == v3dtypes.cylinder) { readCylinder(); } else if(ty == v3dtypes.tube) { readTube(); } else if(ty == v3dtypes.disk) { readDisk(); } else if(ty == v3dtypes.curve) { readCurve(); } else if(ty == v3dtypes.line) { readLine(); } else if(ty == v3dtypes.triangles) { readTriangles(); } else if(ty == v3dtypes.centers) { centers=readCenters(); } else if(ty == v3dtypes.pixel) { readPixel(); } else { // abort("Unknown type:"+string(ty)); } } processed=true; } } void importv3d(string name) { if(name == stripextension(name)) name += ".v3d"; v3dfile xf=v3dfile(name); xf.process(); xf.setCameraInfo(); for(int c=0; c < xf.surfaces.length; ++c) { triple center=c > 0 ? xf.centers[c-1] : O; render r=render(interaction(c == 0 ? Embedded : Billboard,center=center)); surface[][] S=xf.surfaces[c]; for(int m=0; m < S.length; ++m) if(S.initialized(m)) draw(S[m],xf.materials[m],r); } for(int c=0; c < xf.paths3.length; ++c) { triple center=c > 0 ? xf.centers[c-1] : O; render r=render(interaction(c == 0 ? Embedded : Billboard,center=center)); path3[][] G=xf.paths3[c]; for(int m=0; m < G.length; ++m) if(G.initialized(m)) { material material=material(xf.materials[m]); material.p[0] += thin(); draw(G[m],material,currentlight,r); } } for(int c=0;c < xf.triangles.length; ++c) { triple center=c > 0 ? xf.centers[c-1] : O; render r=render(interaction(c == 0 ? Embedded : Billboard,center=center)); triangleGroup[][] groups=xf.triangles[c]; for(int m=0; m < groups.length; ++m) { if(groups.initialized(m)) { material material=xf.materials[m]; triangleGroup[] triangleGroups=groups[m]; for(triangleGroup g : triangleGroups) { if(g.colors.length > 0) draw(g.positions,g.positionIndices,g.normals,g.normalIndices, g.colors,g.colorIndices,r); else draw(g.positions,g.positionIndices,g.normals,g.normalIndices, material,r); } } } } for(int m=0; m < xf.pixels.length; ++m) { if(xf.pixels.initialized(m)) { material material=xf.materials[m]; pixel[] pixels=xf.pixels[m]; for(pixel P : pixels) pixel(P.point,material.p[0],P.width); } } } asymptote-3.05/base/shaders/0000755000000000000000000000000015031566105014531 5ustar rootrootasymptote-3.05/base/shaders/sum2fast.glsl0000644000000000000000000000244415031566105017164 0ustar rootrootlayout(local_size_x=LOCALSIZE) in; const uint groupSize=LOCALSIZE*BLOCKSIZE; layout(binding=3, std430) buffer globalSumBuffer { uint globalSum[]; }; layout(binding=8, std430) buffer feedbackBuffer { uint maxSize; uint fragments; }; shared uint shuffle[groupSize+LOCALSIZE-1u]; shared uint groupSum[LOCALSIZE+1u]; void main() { uint id=gl_LocalInvocationID.x; // avoid bank conflicts and coalesce global memory accesses uint shuffleOffset=id/BLOCKSIZE+id; const uint stride=LOCALSIZE/BLOCKSIZE+LOCALSIZE; for(uint i=0u; i < BLOCKSIZE; i++) shuffle[shuffleOffset+i*stride]=globalSum[id+i*LOCALSIZE]; barrier(); uint Offset=id*BLOCKSIZE+id; uint stop=Offset+BLOCKSIZE; uint sum=0u; for(uint i=Offset; i < stop; ++i) { uint value=shuffle[i]; shuffle[i]=sum; sum += value; } if(id == 0u) groupSum[0u]=0u; groupSum[id+1u]=sum; barrier(); // Apply Hillis-Steele algorithm over all sums in workgroup for(uint shift=1u; shift < LOCALSIZE; shift *= 2u) { uint read; if(shift <= id) read=groupSum[id]+groupSum[id-shift]; barrier(); if(shift <= id) groupSum[id]=read; barrier(); } for(uint i=0u; i < BLOCKSIZE; i++) globalSum[id+i*LOCALSIZE]= shuffle[shuffleOffset+i*stride]+groupSum[(i*LOCALSIZE+id)/BLOCKSIZE]; } asymptote-3.05/base/shaders/sum2.glsl0000644000000000000000000000152015031566105016300 0ustar rootrootlayout(local_size_x=LOCALSIZE) in; const uint groupSize=LOCALSIZE*BLOCKSIZE; uniform uint blockSize; layout(binding=3, std430) buffer globalSumBuffer { uint globalSum[]; }; shared uint groupSum[LOCALSIZE]; void main() { uint localSum[groupSize]; uint id=gl_LocalInvocationID.x; uint dataOffset=blockSize*id; uint sum=0u; for(uint i=0; i < blockSize; ++i) { localSum[i]=sum; sum += globalSum[dataOffset+i]; } groupSum[id]=sum; barrier(); for(uint shift=1u; shift < LOCALSIZE; shift *= 2u) { uint read; if(shift <= id) read=groupSum[id]+groupSum[id-shift]; barrier(); if(shift <= id) groupSum[id]=read; barrier(); } // shift local sums and store uint shift=id > 0u ? groupSum[id-1u] : 0u; for(uint i=0u; i < blockSize; ++i) globalSum[dataOffset+i]=localSum[i]+shift; } asymptote-3.05/base/shaders/sum3.glsl0000644000000000000000000000333015031566105016302 0ustar rootrootlayout(local_size_x=LOCALSIZE) in; const uint groupSize=LOCALSIZE*BLOCKSIZE; uniform uint final; layout(binding=0, std430) buffer offsetBuffer { uint maxDepth; uint offset[]; }; layout(binding=2, std430) buffer countBuffer { uint maxSize; uint count[]; }; layout(binding=3, std430) buffer globalSumBuffer { uint globalSum[]; }; layout(binding=8, std430) buffer feedbackBuffer { uint size; uint fragments; }; shared uint shuffle[groupSize+LOCALSIZE-1u]; shared uint groupSum[LOCALSIZE+1u]; void main() { uint id=gl_LocalInvocationID.x; // avoid bank conflicts and coalesce global memory accesses uint dataOffset=gl_WorkGroupID.x*groupSize+id; uint shuffleOffset=id/BLOCKSIZE+id; const uint stride=LOCALSIZE/BLOCKSIZE+LOCALSIZE; for(uint i=0u; i < BLOCKSIZE; i++) shuffle[shuffleOffset+i*stride]=count[dataOffset+i*LOCALSIZE]; barrier(); uint Offset=id*BLOCKSIZE+id; uint stop=Offset+BLOCKSIZE; uint sum=0u; for(uint i=Offset; i < stop; ++i) shuffle[i]=sum += shuffle[i]; if(id == 0u) groupSum[0u]=0u; groupSum[id+1u]=sum; barrier(); // Apply Hillis-Steele algorithm over all sums in workgroup for(uint shift=1u; shift < LOCALSIZE; shift *= 2u) { uint read; if(shift <= id) read=groupSum[id]+groupSum[id-shift]; barrier(); if(shift <= id) groupSum[id]=read; barrier(); } uint groupOffset=globalSum[gl_WorkGroupID.x]; for(uint i=0u; i < BLOCKSIZE; ++i) offset[dataOffset+i*LOCALSIZE]=shuffle[shuffleOffset+i*stride]+ groupSum[(i*LOCALSIZE+id)/BLOCKSIZE]+groupOffset; uint diff=final-dataOffset; if(diff < groupSize && diff % LOCALSIZE == 0) { size=maxDepth; maxDepth=0u; fragments=offset[final+1u]=offset[final]; } } asymptote-3.05/base/shaders/compress.glsl0000644000000000000000000000064315031566105017252 0ustar rootrootlayout(binding=0) uniform atomic_uint elements; layout(binding=1, std430) buffer indexBuffer { uint index[]; }; layout(binding=2, std430) buffer countBuffer { uint maxSize; uint count[]; }; uniform uint width; void main() { uint pixel=uint(gl_FragCoord.y)*width+uint(gl_FragCoord.x); uint Count=index[pixel]; if(Count > 0u) count[(index[pixel]=atomicCounterIncrement(elements))]=Count; discard; } asymptote-3.05/base/shaders/sum1.glsl0000644000000000000000000000133215031566105016300 0ustar rootrootlayout(local_size_x=LOCALSIZE) in; const uint groupSize=LOCALSIZE*BLOCKSIZE; uniform uint elements; layout(binding=2, std430) buffer countBuffer { uint maxSize; uint count[]; }; layout(binding=3, std430) buffer globalSumBuffer { uint globalSum[]; }; shared uint groupSum[LOCALSIZE]; void main() { uint id=gl_LocalInvocationID.x; uint dataOffset=gl_WorkGroupID.x*groupSize+id; uint stop=dataOffset+groupSize; uint sum=0u; for(uint i=dataOffset; i < stop; i += LOCALSIZE) sum += count[i]; groupSum[id]=sum; barrier(); for(uint s=LOCALSIZE/2; s > 0u; s >>= 1u) { if(id < s) groupSum[id] += groupSum[id+s]; barrier(); } if(id == 0u) globalSum[gl_WorkGroupID.x]=groupSum[0u]; } asymptote-3.05/base/shaders/count.glsl0000644000000000000000000000045515031566105016550 0ustar rootroot#ifdef GPUCOMPRESS layout(binding=1, std430) buffer indexBuffer { uint index[]; }; #else layout(binding=2, std430) buffer countBuffer { uint maxSize; uint index[]; }; #endif uniform uint width; void main() { atomicAdd(index[uint(gl_FragCoord.y)*width+uint(gl_FragCoord.x)],1u); discard; } asymptote-3.05/base/shaders/blend.glsl0000644000000000000000000000642215031566105016504 0ustar rootrootlayout(binding=0, std430) buffer offsetBuffer { uint maxDepth; uint offset[]; }; layout(binding=2, std430) buffer countBuffer { uint maxSize; uint count[]; }; layout(binding=4, std430) buffer fragmentBuffer { vec4 fragment[]; }; layout(binding=5, std430) buffer depthBuffer { float depth[]; }; layout(binding=6, std430) buffer opaqueBuffer { vec4 opaqueColor[]; }; layout(binding=7, std430) buffer opaqueDepthBuffer { float opaqueDepth[]; }; #ifdef GPUCOMPRESS layout(binding=1, std430) buffer indexBuffer { uint index[]; }; #define INDEX(pixel) index[pixel] #define COUNT(pixel) index[pixel] #else #define INDEX(pixel) pixel #define COUNT(pixel) count[pixel] #endif out vec4 outColor; uniform uint width; uniform vec4 background; vec4 blend(vec4 outColor, vec4 color) { return mix(outColor,color,color.a); } void main() { uint pixel=uint(gl_FragCoord.y)*width+uint(gl_FragCoord.x); float OpaqueDepth=opaqueDepth[pixel]; uint element=INDEX(pixel); #ifdef GPUCOMPRESS if(element == 0u) { if(OpaqueDepth != 0.0) opaqueDepth[pixel]=0.0; discard; } #endif #ifdef GPUINDEXING uint listIndex=offset[element]; uint size=offset[element+1u]-listIndex; #else uint size=count[element]; #endif #ifndef GPUCOMPRESS if(size == 0u) { if(OpaqueDepth != 0.0) opaqueDepth[pixel]=0.0; discard; } #endif outColor=OpaqueDepth != 0.0 ? opaqueColor[pixel] : background; #ifndef GPUINDEXING uint listIndex=offset[element]-size; #endif uint k=0u; if(OpaqueDepth != 0.0) while(k < size && depth[listIndex+k] >= OpaqueDepth) ++k; uint n=size-k; // Sort the fragments with respect to descending depth if(n <= ARRAYSIZE) { if(n == 1) outColor=blend(outColor,fragment[listIndex+k]); else if(n > 0) { struct element { uint index; float depth; }; element E[ARRAYSIZE]; E[0]=element(k,depth[listIndex+k]); uint i=1u; while(++k < size) { float d=depth[listIndex+k]; if(OpaqueDepth != 0.0) { while(k < size && d >= OpaqueDepth) { ++k; d=depth[listIndex+k]; } if(k == size) break; } uint j=i; while(j > 0u && d > E[j-1u].depth) { E[j]=E[j-1u]; --j; } E[j]=element(k,d); ++i; } for(uint j=0u; j < i; ++j) outColor=blend(outColor,fragment[listIndex+E[j].index]); } if(OpaqueDepth != 0.0) opaqueDepth[pixel]=0.0; } else { atomicMax(maxDepth,size); #ifndef GPUINDEXING maxSize=maxDepth; #endif for(uint i=k+1u; i < size; i++) { vec4 temp=fragment[listIndex+i]; float d=depth[listIndex+i]; uint j=i; while(j > 0u && d > depth[listIndex+j-1u]) { fragment[listIndex+j]=fragment[listIndex+j-1u]; depth[listIndex+j]=depth[listIndex+j-1u]; --j; } fragment[listIndex+j]=temp; depth[listIndex+j]=d; } uint stop=listIndex+size; if(OpaqueDepth == 0.0) for(uint i=listIndex+k; i < stop; i++) outColor=blend(outColor,fragment[i]); else { for(uint i=listIndex+k; i < stop; i++) { if(depth[i] < OpaqueDepth) outColor=blend(outColor,fragment[i]); } opaqueDepth[pixel]=0.0; } } COUNT(pixel)=0u; } asymptote-3.05/base/shaders/fragment.glsl0000644000000000000000000001506515031566105017226 0ustar rootrootstruct Material { vec4 diffuse,emissive,specular; vec4 parameters; }; struct Light { vec3 direction; vec3 color; }; uniform uint nlights; uniform Light lights[max(Nlights,1)]; uniform MaterialBuffer { Material Materials[Nmaterials]; }; flat in int materialIndex; out vec4 outColor; // PBR material parameters vec3 Diffuse; // Diffuse for nonmetals, reflectance for metals. vec3 Specular; // Specular tint for nonmetals float Metallic; // Metallic/Nonmetals parameter float Fresnel0; // Fresnel at zero for nonmetals float Roughness2; // roughness squared, for smoothing float Roughness; #ifdef HAVE_SSBO layout(binding=0, std430) buffer offsetBuffer { uint maxDepth; uint offset[]; }; #ifndef GPUINDEXING layout(binding=2, std430) buffer countBuffer { uint maxSize; uint count[]; }; #endif layout(binding=4, std430) buffer fragmentBuffer { vec4 fragment[]; }; layout(binding=5, std430) buffer depthBuffer { float depth[]; }; layout(binding=6, std430) buffer opaqueBuffer { vec4 opaqueColor[]; }; layout(binding=7, std430) buffer opaqueDepthBuffer { float opaqueDepth[]; }; #ifdef GPUCOMPRESS layout(binding=1, std430) buffer indexBuffer { uint index[]; }; #define INDEX(pixel) index[pixel] #else #define INDEX(pixel) pixel #endif uniform uint width; #endif #ifdef NORMAL #ifndef ORTHOGRAPHIC in vec3 ViewPosition; #endif in vec3 Normal; vec3 normal; #ifdef USE_IBL uniform sampler2D reflBRDFSampler; uniform sampler2D diffuseSampler; uniform sampler3D reflImgSampler; const float pi=acos(-1.0); const float piInv=1.0/pi; const float twopi=2.0*pi; const float twopiInv=1.0/twopi; // (x,y,z) -> (r,theta,phi); // theta -> [0,pi]: colatitude // phi -> [-pi,pi]: longitude vec3 cart2sphere(vec3 cart) { float x=cart.x; float y=cart.z; float z=cart.y; float r=length(cart); float theta=r > 0.0 ? acos(z/r) : 0.0; float phi=atan(y,x); return vec3(r,theta,phi); } vec2 normalizedAngle(vec3 cartVec) { vec3 sphericalVec=cart2sphere(cartVec); sphericalVec.y=sphericalVec.y*piInv; sphericalVec.z=0.75-sphericalVec.z*twopiInv; return sphericalVec.zy; } vec3 IBLColor(vec3 viewDir) { // // based on the split sum formula approximation // L(v)=\int_\Omega L(l)f(l,v) \cos \theta_l // which, by the split sum approiximation (assuming independence+GGX distrubition), // roughly equals (within a margin of error) // [\int_\Omega L(l)] * [\int_\Omega f(l,v) \cos \theta_l]. // the first term is the reflectance irradiance integral vec3 IBLDiffuse=Diffuse*texture(diffuseSampler,normalizedAngle(normal)).rgb; vec3 reflectVec=normalize(reflect(-viewDir,normal)); vec2 reflCoord=normalizedAngle(reflectVec); vec3 IBLRefl=texture(reflImgSampler,vec3(reflCoord,Roughness)).rgb; vec2 IBLbrdf=texture(reflBRDFSampler,vec2(dot(normal,viewDir),Roughness)).rg; float specularMultiplier=Fresnel0*IBLbrdf.x+IBLbrdf.y; vec3 dielectric=IBLDiffuse+specularMultiplier*IBLRefl; vec3 metal=Diffuse*IBLRefl; return mix(dielectric,metal,Metallic); } #else // h is the halfway vector between normal and light direction // GGX Trowbridge-Reitz Approximation float NDF_TRG(vec3 h) { float ndoth=max(dot(normal,h),0.0); float alpha2=Roughness2*Roughness2; float denom=ndoth*ndoth*(alpha2-1.0)+1.0; return denom != 0.0 ? alpha2/(denom*denom) : 0.0; } float GGX_Geom(vec3 v) { float ndotv=max(dot(v,normal),0.0); float ap=1.0+Roughness2; float k=0.125*ap*ap; return ndotv/((ndotv*(1.0-k))+k); } float Geom(vec3 v, vec3 l) { return GGX_Geom(v)*GGX_Geom(l); } // Schlick's approximation float Fresnel(vec3 h, vec3 v, float fresnel0) { float a=1.0-max(dot(h,v),0.0); float b=a*a; return fresnel0+(1.0-fresnel0)*b*b*a; } vec3 BRDF(vec3 viewDirection, vec3 lightDirection) { vec3 lambertian=Diffuse; // Cook-Torrance model vec3 h=normalize(lightDirection+viewDirection); float omegain=max(dot(viewDirection,normal),0.0); float omegaln=max(dot(lightDirection,normal),0.0); float D=NDF_TRG(h); float G=Geom(viewDirection,lightDirection); float F=Fresnel(h,viewDirection,Fresnel0); float denom=4.0*omegain*omegaln; float rawReflectance=denom > 0.0 ? (D*G)/denom : 0.0; vec3 dielectric=mix(lambertian,rawReflectance*Specular,F); vec3 metal=rawReflectance*Diffuse; return mix(dielectric,metal,Metallic); } #endif #endif #ifdef COLOR in vec4 Color; #endif void main() { vec4 diffuse; vec4 emissive; Material m; #ifdef GENERAL m=Materials[abs(materialIndex)-1]; emissive=m.emissive; if(materialIndex >= 0) diffuse=m.diffuse; else { diffuse=Color; #if Nlights == 0 emissive += Color; #endif } #else m=Materials[materialIndex]; emissive=m.emissive; #ifdef COLOR diffuse=Color; #if Nlights == 0 emissive += Color; #endif #else diffuse=m.diffuse; #endif #endif #if defined(NORMAL) && Nlights > 0 Specular=m.specular.rgb; vec4 parameters=m.parameters; Roughness=1.0-parameters[0]; Roughness2=Roughness*Roughness; Metallic=parameters[1]; Fresnel0=parameters[2]; Diffuse=diffuse.rgb; // Given a point x and direction \omega, // L_i=\int_{\Omega}f(x,\omega_i,\omega) L(x,\omega_i)(\hat{n}\cdot \omega_i) // d\omega_i, where \Omega is the hemisphere covering a point, // f is the BRDF function, L is the radiance from a given angle and position. normal=normalize(Normal); normal=gl_FrontFacing ? normal : -normal; #ifdef ORTHOGRAPHIC vec3 viewDir=vec3(0.0,0.0,1.0); #else vec3 viewDir=-normalize(ViewPosition); #endif vec3 color; #ifdef USE_IBL color=IBLColor(viewDir); #else // For a finite point light, the rendering equation simplifies. color=emissive.rgb; for(uint i=0u; i < nlights; ++i) { Light Li=lights[i]; vec3 L=Li.direction; float cosTheta=max(dot(normal,L),0.0); // $\omega_i \cdot n$ term vec3 radiance=cosTheta*Li.color; color += BRDF(viewDir,L)*radiance; } #endif outColor=vec4(color,diffuse.a); #else outColor=emissive; #endif #ifndef WIDTH #ifdef HAVE_SSBO uint pixel=uint(gl_FragCoord.y)*width+uint(gl_FragCoord.x); #if defined(TRANSPARENT) || (!defined(HAVE_INTERLOCK) && !defined(OPAQUE)) uint element=INDEX(pixel); #ifdef GPUINDEXING uint listIndex=atomicAdd(offset[element],-1u)-1u; #else uint listIndex=offset[element]-atomicAdd(count[element],1u)-1u; #endif fragment[listIndex]=outColor; depth[listIndex]=gl_FragCoord.z; #ifndef WIREFRAME discard; #endif #else #if defined(HAVE_INTERLOCK) && !defined(OPAQUE) beginInvocationInterlockARB(); if(opaqueDepth[pixel] == 0.0 || gl_FragCoord.z < opaqueDepth[pixel]) { opaqueDepth[pixel]=gl_FragCoord.z; opaqueColor[pixel]=outColor; } endInvocationInterlockARB(); #endif #endif #endif #endif } asymptote-3.05/base/shaders/zero.glsl0000644000000000000000000000030015031566105016364 0ustar rootrootlayout(binding=2, std430) buffer countBuffer { uint maxSize; uint count[]; }; uniform uint width; void main() { count[uint(gl_FragCoord.y)*width+uint(gl_FragCoord.x)]=0u; discard; } asymptote-3.05/base/shaders/screen.glsl0000644000000000000000000000020115031566105016664 0ustar rootrootvoid main() { vec2 vertices[3]=vec2[3](vec2(-1,-1),vec2(3,-1),vec2(-1, 3)); gl_Position = vec4(vertices[gl_VertexID],0,1); } asymptote-3.05/base/shaders/vertex.glsl0000644000000000000000000000124515031566105016733 0ustar rootrootin vec3 position; #ifdef NORMAL #ifndef ORTHOGRAPHIC uniform mat4 viewMat; out vec3 ViewPosition; #endif uniform mat3 normMat; in vec3 normal; out vec3 Normal; #endif #ifdef MATERIAL in int material; flat out int materialIndex; #endif #ifdef COLOR in vec4 color; out vec4 Color; #endif #ifdef WIDTH in float width; #endif uniform mat4 projViewMat; void main() { vec4 v=vec4(position,1.0); gl_Position=projViewMat*v; #ifdef NORMAL #ifndef ORTHOGRAPHIC ViewPosition=(viewMat*v).xyz; #endif Normal=normalize(normal*normMat); #endif #ifdef COLOR Color=color; #endif #ifdef WIDTH gl_PointSize=width; #endif #ifdef MATERIAL materialIndex=material; #endif } asymptote-3.05/base/three.asy0000644000000000000000000025021615031566105014733 0ustar rootrootprivate import math; if(settings.v3d) settings.prc=false; if(prc0() || settings.v3d) { if(!latex()) { settings.prc=false; settings.v3d=false; } else { access embed; Embed=embed.embedplayer; } } // Useful lossy PRC compression values. restricted real Zero=0; restricted real Single=0.000001; restricted real Low=0.0001; restricted real Medium=0.001; restricted real High=0.01; restricted int PRCsphere=0; // Renders slowly but produces smaller PRC files. restricted int NURBSsphere=1; // Renders fast but produces larger PRC files. struct interaction { int type; triple center; // position to rotate billboard objects about bool targetsize; static interaction defaultinteraction; void operator init(interaction interaction=defaultinteraction, int type=interaction.type, triple center=interaction.center, bool targetsize=interaction.targetsize) { this.type=type; this.center=center; this.targetsize=targetsize; } } interaction.defaultinteraction=new interaction; restricted interaction Embedded=interaction(); restricted interaction Billboard=interaction(1); struct render { real compression; // lossy PRC compression parameter (0=no compression) real granularity; // PRC rendering granularity bool closed; // use one-sided PRC rendering? bool tessellate; // use tessellated mesh to store straight patches bool3 merge; // merge PRC nodes before rendering, for faster but // lower quality rendering (the value default means // merge opaque patches only). int sphere; // PRC sphere type (PRCsphere or NURBSsphere). // General parameters: real margin; // shrink amount for rendered OpenGL viewport, in bp. bool partnames; // assign part name indices to compound objects bool defaultnames; // assign default names to unnamed objects interaction interaction; // billboard interaction mode static render defaultrender; void operator init(render render=defaultrender, real compression=render.compression, real granularity=render.granularity, bool closed=render.closed, bool tessellate=render.tessellate, bool3 merge=render.merge, int sphere=render.sphere, real margin=render.margin, bool partnames=render.partnames, bool defaultnames=render.defaultnames, interaction interaction=render.interaction) { this.compression=compression; this.granularity=granularity; this.closed=closed; this.tessellate=tessellate; this.merge=merge; this.sphere=sphere; this.margin=margin; this.partnames=partnames; this.defaultnames=defaultnames; this.interaction=interaction; } } render operator init() {return render();} render defaultrender=render.defaultrender=new render; defaultrender.compression=High; defaultrender.granularity=Medium; defaultrender.closed=false; defaultrender.tessellate=false; defaultrender.merge=false; defaultrender.margin=0.02; defaultrender.sphere=NURBSsphere; defaultrender.partnames=false; defaultrender.defaultnames=true; defaultrender.interaction=Embedded; real defaultshininess=0.7; real defaultmetallic=0.0; real defaultfresnel0=0.04; real angleprecision=1e-5; // Precision for centering perspective projections. int maxangleiterations=25; string defaultembed3Doptions="3Dmenu"; string defaultembed3Dscript; real defaulteyetoview=63mm/1000mm; string partname(int i, render render=defaultrender) { return render.partnames ? string(i+1) : ""; } triple O=(0,0,0); triple X=(1,0,0), Y=(0,1,0), Z=(0,0,1); // A translation in 3D space. transform3 shift(triple v) { transform3 t=identity(4); t[0][3]=v.x; t[1][3]=v.y; t[2][3]=v.z; return t; } // Avoid two parentheses. transform3 shift(real x, real y, real z) { return shift((x,y,z)); } transform3 shift(transform3 t) { transform3 T=identity(4); T[0][3]=t[0][3]; T[1][3]=t[1][3]; T[2][3]=t[2][3]; return T; } // A 3D scaling in the x direction. transform3 xscale3(real x) { transform3 t=identity(4); t[0][0]=x; return t; } // A 3D scaling in the y direction. transform3 yscale3(real y) { transform3 t=identity(4); t[1][1]=y; return t; } // A 3D scaling in the z direction. transform3 zscale3(real z) { transform3 t=identity(4); t[2][2]=z; return t; } // A 3D scaling by s in the v direction. transform3 scale(triple v, real s) { v=unit(v); s -= 1; return new real[][] { {1+s*v.x^2, s*v.x*v.y, s*v.x*v.z, 0}, {s*v.x*v.y, 1+s*v.y^2, s*v.y*v.z, 0}, {s*v.x*v.z, s*v.y*v.z, 1+s*v.z^2, 0}, {0, 0, 0, 1}}; } // A transformation representing rotation by an angle in degrees about // an axis v through the origin (in the right-handed direction). transform3 rotate(real angle, triple v) { if(v == O) abort("cannot rotate about the zero vector"); v=unit(v); real x=v.x, y=v.y, z=v.z; real s=Sin(angle), c=Cos(angle), t=1-c; return new real[][] { {t*x^2+c, t*x*y-s*z, t*x*z+s*y, 0}, {t*x*y+s*z, t*y^2+c, t*y*z-s*x, 0}, {t*x*z-s*y, t*y*z+s*x, t*z^2+c, 0}, {0, 0, 0, 1}}; } // A transformation representing rotation by an angle in degrees about // the line u--v (in the right-handed direction). transform3 rotate(real angle, triple u, triple v) { return shift(u)*rotate(angle,v-u)*shift(-u); } // Reflects about the plane through u, v, and w. transform3 reflect(triple u, triple v, triple w) { triple n=unit(cross(v-u,w-u)); if(n == O) abort("points determining reflection plane cannot be colinear"); return new real[][] { {1-2*n.x^2, -2*n.x*n.y, -2*n.x*n.z, u.x}, {-2*n.x*n.y, 1-2*n.y^2, -2*n.y*n.z, u.y}, {-2*n.x*n.z, -2*n.y*n.z, 1-2*n.z^2, u.z}, {0, 0, 0, 1} }*shift(-u); } // Project u onto v. triple project(triple u, triple v) { v=unit(v); return dot(u,v)*v; } // Return a unit vector perpendicular to a given unit vector v. triple perp(triple v) { triple u=cross(v,Y); real norm=sqrtEpsilon*abs(v); if(abs(u) > norm) return unit(u); u=cross(v,Z); return (abs(u) > norm) ? unit(u) : X; } // Return the transformation corresponding to moving the camera from the target // (looking in the negative z direction) to the point 'eye' (looking at target, // orienting the camera so that direction 'up' points upwards. // Since, in actuality, we are transforming the points instead of the camera, // we calculate the inverse matrix. // Based on the gluLookAt implementation in the OpenGL manual. transform3 look(triple eye, triple up=Z, triple target=O) { triple f=unit(target-eye); if(f == O) f=-Z; // The eye is already at the origin: look down. triple s=cross(f,up); // If the eye is pointing either directly up or down, there is no // preferred "up" direction. Pick one arbitrarily. s=s != O ? unit(s) : perp(f); triple u=cross(s,f); transform3 M={{ s.x, s.y, s.z, 0}, { u.x, u.y, u.z, 0}, {-f.x, -f.y, -f.z, 0}, { 0, 0, 0, 1}}; return M*shift(-eye); } // Return a matrix to do perspective distortion based on a triple v. transform3 distort(triple v) { transform3 t=identity(4); real d=length(v); if(d == 0) return t; t[3][2]=-1/d; t[3][3]=0; return t; } projection operator * (transform3 t, projection P) { projection P=P.copy(); if(!P.absolute) { P.camera=t*P.camera; triple target=P.target; P.target=t*P.target; if(P.infinity) P.normal=t*(target+P.normal)-P.target; else P.normal=P.vector(); P.calculate(); } return P; } // With this, save() and restore() in plain also save and restore the // currentprojection. addSaveFunction(new restoreThunk() { projection P=currentprojection.copy(); return new void() { currentprojection=P; }; }); pair project(triple v, projection P=currentprojection) { return project(v,P.t); } pair dir(triple v, triple dir, projection P) { return unit(project(v+0.5dir,P)-project(v-0.5*dir,P)); } // Uses the homogenous coordinate to perform perspective distortion. // When combined with a projection to the XY plane, this effectively maps // points in three space to a plane through target and // perpendicular to the vector camera-target. projection perspective(triple camera, triple up=Z, triple target=O, real zoom=1, real angle=0, pair viewportshift=0, bool showtarget=true, bool autoadjust=true, bool center=autoadjust) { if(camera == target) abort("camera cannot be at target"); return projection(camera,up,target,zoom,angle,viewportshift, showtarget,autoadjust,center, new transformation(triple camera, triple up, triple target) {return transformation(look(camera,up,target), distort(camera-target));}); } projection perspective(real x, real y, real z, triple up=Z, triple target=O, real zoom=1, real angle=0, pair viewportshift=0, bool showtarget=true, bool autoadjust=true, bool center=autoadjust) { return perspective((x,y,z),up,target,zoom,angle,viewportshift,showtarget, autoadjust,center); } projection orthographic(triple camera, triple up=Z, triple target=O, real zoom=1, pair viewportshift=0, bool showtarget=true, bool center=true) { return projection(camera,up,target,zoom,viewportshift,showtarget, center=center,new transformation(triple camera, triple up, triple target) { return transformation(look(camera,up,target));}); } projection orthographic(real x, real y, real z, triple up=Z, triple target=O, real zoom=1, pair viewportshift=0, bool showtarget=true, bool center=true) { return orthographic((x,y,z),up,target,zoom,viewportshift,showtarget, center=center); } // Compute camera position with x axis below the horizontal at angle alpha, // y axis below the horizontal at angle beta, and z axis up. triple camera(real alpha, real beta) { real denom=Tan(alpha+beta); real Tanalpha=Tan(alpha); real Tanbeta=Tan(beta); return (sqrt(Tanalpha/denom),sqrt(Tanbeta/denom),sqrt(Tanalpha*Tanbeta)); } projection oblique(real angle=45) { transform3 t=identity(4); real c2=Cos(angle)^2; real s2=1-c2; t[0][2]=-c2; t[1][2]=-s2; t[2][2]=1; t[2][3]=-1; return projection((c2,s2,1),up=Y,normal=(0,0,1), new transformation(triple,triple,triple) { return transformation(t);}); } projection obliqueZ(real angle=45) {return oblique(angle);} projection obliqueX(real angle=45) { transform3 t=identity(4); real c2=Cos(angle)^2; real s2=1-c2; t[0][0]=-c2; t[1][0]=-s2; t[1][1]=0; t[0][1]=1; t[1][2]=1; t[2][2]=0; t[2][0]=1; t[2][3]=-1; return projection((1,c2,s2),normal=(1,0,0), new transformation(triple,triple,triple) { return transformation(t);}); } projection obliqueY(real angle=45) { transform3 t=identity(4); real c2=Cos(angle)^2; real s2=1-c2; t[0][1]=c2; t[1][1]=s2; t[1][2]=1; t[2][1]=-1; t[2][2]=0; t[2][3]=-1; return projection((c2,-1,s2),normal=(0,-1,0), new transformation(triple,triple,triple) { return transformation(t);}); } projection oblique=oblique(); projection obliqueX=obliqueX(), obliqueY=obliqueY(), obliqueZ=obliqueZ(); projection LeftView=orthographic(-X,showtarget=true); projection RightView=orthographic(X,showtarget=true); projection FrontView=orthographic(-Y,showtarget=true); projection BackView=orthographic(Y,showtarget=true); projection BottomView=orthographic(-Z,up=-Y,showtarget=true); projection TopView=orthographic(Z,up=Y,showtarget=true); currentprojection=perspective(5,4,2); projection projection() { projection P; real[] a=_projection(); if(a.length == 0 || a[10] == 0.0) return currentprojection; int k=0; return a[0] == 1 ? orthographic((a[++k],a[++k],a[++k]),(a[++k],a[++k],a[++k]), (a[++k],a[++k],a[++k]),a[++k],(a[k += 2],a[++k])) : perspective((a[++k],a[++k],a[++k]),(a[++k],a[++k],a[++k]), (a[++k],a[++k],a[++k]),a[++k],a[++k],(a[++k],a[++k])); } // Map pair z to a triple by inverting the projection P onto the // plane perpendicular to normal and passing through point. triple invert(pair z, triple normal, triple point, projection P=currentprojection) { transform3 t=P.t; real[][] A={{t[0][0]-z.x*t[3][0],t[0][1]-z.x*t[3][1],t[0][2]-z.x*t[3][2]}, {t[1][0]-z.y*t[3][0],t[1][1]-z.y*t[3][1],t[1][2]-z.y*t[3][2]}, {normal.x,normal.y,normal.z}}; real[] b={z.x*t[3][3]-t[0][3],z.y*t[3][3]-t[1][3],dot(normal,point)}; real[] x=solve(A,b,warn=false); return x.length > 0 ? (x[0],x[1],x[2]) : P.camera; } // Map pair to a triple on the projection plane. triple invert(pair z, projection P=currentprojection) { return invert(z,P.normal,P.target,P); } // Map pair dir to a triple direction at point v on the projection plane. triple invert(pair dir, triple v, projection P=currentprojection) { return invert(project(v,P)+dir,P.normal,v,P)-v; } pair xypart(triple v) { return (v.x,v.y); } struct control { triple post,pre; bool active=false; bool straight=true; void operator init(triple post, triple pre, bool straight=false) { this.post=post; this.pre=pre; active=true; this.straight=straight; } } control nocontrol; control operator * (transform3 t, control c) { control C; C.post=t*c.post; C.pre=t*c.pre; C.active=c.active; C.straight=c.straight; return C; } void write(file file, control c) { write(file,".. controls "); write(file,c.post); write(file," and "); write(file,c.pre); } struct Tension { real out,in; bool atLeast; bool active; void operator init(real out=1, real in=1, bool atLeast=false, bool active=true) { real check(real val) { if(val < 0.75) abort("tension cannot be less than 3/4"); return val; } this.out=check(out); this.in=check(in); this.atLeast=atLeast; this.active=active; } } Tension operator init() { return Tension(); } Tension noTension; noTension.active=false; void write(file file, Tension t) { write(file,"..tension "); if(t.atLeast) write(file,"atleast "); write(file,t.out); write(file," and "); write(file,t.in); } struct dir { triple dir; real gamma=1; // endpoint curl bool Curl; // curl specified bool active() { return dir != O || Curl; } void init(triple v) { this.dir=v; } void init(real gamma) { if(gamma < 0) abort("curl cannot be less than 0"); this.gamma=gamma; this.Curl=true; } void init(dir d) { dir=d.dir; gamma=d.gamma; Curl=d.Curl; } void default(triple v) { if(!active()) init(v); } void default(dir d) { if(!active()) init(d); } dir copy() { dir d=new dir; d.init(this); return d; } } void write(file file, dir d) { if(d.dir != O) { write(file,"{"); write(file,unit(d.dir)); write(file,"}"); } else if(d.Curl) { write(file,"{curl "); write(file,d.gamma); write(file,"}"); } } dir operator * (transform3 t, dir d) { dir D=d.copy(); D.init(unit(shiftless(t)*d.dir)); return D; } void checkEmpty(int n) { if(n == 0) abort("nullpath3 has no points"); } int adjustedIndex(int i, int n, bool cycles) { checkEmpty(n); if(cycles) return i % n; else if(i < 0) return 0; else if(i >= n) return n-1; else return i; } struct flatguide3 { triple[] nodes; bool[] cyclic; // true if node is really a cycle control[] control; // control points for segment starting at node Tension[] Tension; // Tension parameters for segment starting at node dir[] in,out; // in and out directions for segment starting at node bool cyclic() {int n=cyclic.length; return n > 0 ? cyclic[n-1] : false;} bool precyclic() {int i=find(cyclic); return i >= 0 && i < cyclic.length-1;} int size() { return cyclic() ? nodes.length-1 : nodes.length; } void node(triple v, bool b=false) { nodes.push(v); control.push(nocontrol); Tension.push(noTension); in.push(new dir); out.push(new dir); cyclic.push(b); } void control(triple post, triple pre) { if(control.length > 0) { control c=control(post,pre,false); control[control.length-1]=c; } } void Tension(real out, real in, bool atLeast) { if(Tension.length > 0) Tension[Tension.length-1]=Tension(out,in,atLeast,true); } void in(triple v) { if(in.length > 0) { in[in.length-1].init(v); } } void out(triple v) { if(out.length > 0) { out[out.length-1].init(v); } } void in(real gamma) { if(in.length > 0) { in[in.length-1].init(gamma); } } void out(real gamma) { if(out.length > 0) { out[out.length-1].init(gamma); } } void cycleToken() { if(nodes.length > 0) node(nodes[0],true); } // Return true if outgoing direction at node i is known. bool solved(int i) { return out[i].active() || control[i].active; } } void write(file file, string s="", explicit flatguide3 x, suffix suffix=none) { write(file,s); if(x.size() == 0) write(file,""); else for(int i=0; i < x.nodes.length; ++i) { if(i > 0) write(file,endl); if(x.cyclic[i]) write(file,"cycle"); else write(file,x.nodes[i]); if(i < x.nodes.length-1) { // Explicit control points trump other specifiers if(x.control[i].active) write(file,x.control[i]); else { write(file,x.out[i]); if(x.Tension[i].active) write(file,x.Tension[i]); } write(file,".."); if(!x.control[i].active) write(file,x.in[i]); } } write(file,suffix); } void write(string s="", flatguide3 x, suffix suffix=endl) { write(stdout,s,x,suffix); } // A guide3 is most easily represented as something that modifies a flatguide3. typedef void guide3(flatguide3); restricted void nullpath3(flatguide3) {}; guide3 operator init() {return nullpath3;} guide3 operator cast(triple v) { return new void(flatguide3 f) { f.node(v); }; } guide3 operator cast(cycleToken) { return new void(flatguide3 f) { f.cycleToken(); }; } guide3 operator controls(triple post, triple pre) { return new void(flatguide3 f) { f.control(post,pre); }; }; guide3 operator controls(triple v) { return operator controls(v,v); } guide3 operator cast(tensionSpecifier t) { return new void(flatguide3 f) { f.Tension(t.out, t.in, t.atLeast); }; } guide3 operator cast(curlSpecifier spec) { return new void(flatguide3 f) { if(spec.side == JOIN_OUT) f.out(spec.value); else if(spec.side == JOIN_IN) f.in(spec.value); else abort("invalid curl specifier"); }; } guide3 operator spec(triple v, int side) { return new void(flatguide3 f) { if(side == JOIN_OUT) f.out(v); else if(side == JOIN_IN) f.in(v); else abort("invalid direction specifier"); }; } guide3 operator -- (... guide3[] g) { return new void(flatguide3 f) { if(g.length > 0) { for(int i=0; i < g.length-1; ++i) { g[i](f); f.out(1); f.in(1); } g[g.length-1](f); } }; } guide3 operator .. (... guide3[] g) { return new void(flatguide3 f) { for(int i=0; i < g.length; ++i) g[i](f); }; } typedef guide3 interpolate3(... guide3[]); interpolate3 join3(tensionSpecifier t) { return new guide3(... guide3[] a) { if(a.length == 0) return nullpath3; guide3 g=a[0]; for(int i=1; i < a.length; ++i) g=g..t..a[i]; return g; }; } interpolate3 operator ::=join3(operator tension(1,true)); interpolate3 operator ---=join3(operator tension(infinity,true)); flatguide3 operator cast(guide3 g) { flatguide3 f; g(f); return f; } flatguide3[] operator cast(guide3[] g) { flatguide3[] p=new flatguide3[g.length]; for(int i=0; i < g.length; ++i) { flatguide3 f; g[i](f); p[i]=f; } return p; } // A version of asin that tolerates numerical imprecision real asin1(real x) { return asin(min(max(x,-1),1)); } // A version of acos that tolerates numerical imprecision real acos1(real x) { return acos(min(max(x,-1),1)); } struct Controls { triple c0,c1; // 3D extension of John Hobby's control point formula // (cf. The MetaFont Book, page 131), // as described in John C. Bowman and A. Hammerlindl, // TUGBOAT: The Communications of the TeX Users Group 29:2 (2008). void operator init(triple v0, triple v1, triple d0, triple d1, real tout, real tin, bool atLeast) { triple v=v1-v0; triple u=unit(v); real L=length(v); d0=unit(d0); d1=unit(d1); real theta=acos1(dot(d0,u)); real phi=acos1(dot(d1,u)); if(dot(cross(d0,v),cross(v,d1)) < 0) phi=-phi; c0=v0+d0*L*relativedistance(theta,phi,tout,atLeast); c1=v1-d1*L*relativedistance(phi,theta,tin,atLeast); } } private triple cross(triple d0, triple d1, triple reference) { triple normal=cross(d0,d1); return normal == O ? reference : normal; } private triple dir(real theta, triple d0, triple d1, triple reference) { triple normal=cross(d0,d1,reference); if(normal == O) return d1; return rotate(degrees(theta),dot(normal,reference) >= 0 ? normal : -normal)* d1; } private real angle(triple d0, triple d1, triple reference) { real theta=acos1(dot(unit(d0),unit(d1))); return dot(cross(d0,d1,reference),reference) >= 0 ? theta : -theta; } // 3D extension of John Hobby's angle formula (The MetaFont Book, page 131). // Notational differences: here psi[i] is the turning angle at z[i+1], // beta[i] is the tension for segment i, and in[i] is the incoming // direction for segment i (where segment i begins at node i). real[] theta(triple[] v, real[] alpha, real[] beta, triple dir0, triple dirn, real g0, real gn, triple reference) { real[] a,b,c,f,l,psi; int n=alpha.length; bool cyclic=v.cyclic; for(int i=0; i < n; ++i) l[i]=1/length(v[i+1]-v[i]); int i0,in; if(cyclic) {i0=0; in=n;} else {i0=1; in=n-1;} for(int i=0; i < in; ++i) psi[i]=angle(v[i+1]-v[i],v[i+2]-v[i+1],reference); if(cyclic) { l.cyclic=true; psi.cyclic=true; } else { psi[n-1]=0; if(dir0 == O) { real a0=alpha[0]; real b0=beta[0]; real chi=g0*(b0/a0)^2; a[0]=0; b[0]=3a0-a0/b0+chi; real C=chi*(3a0-1)+a0/b0; c[0]=C; f[0]=-C*psi[0]; } else { a[0]=c[0]=0; b[0]=1; f[0]=angle(v[1]-v[0],dir0,reference); } if(dirn == O) { real an=alpha[n-1]; real bn=beta[n-1]; real chi=gn*(an/bn)^2; a[n]=chi*(3bn-1)+bn/an; b[n]=3bn-bn/an+chi; c[n]=f[n]=0; } else { a[n]=c[n]=0; b[n]=1; f[n]=angle(v[n]-v[n-1],dirn,reference); } } for(int i=i0; i < n; ++i) { real in=beta[i-1]^2*l[i-1]; real A=in/alpha[i-1]; a[i]=A; real B=3*in-A; real out=alpha[i]^2*l[i]; real C=out/beta[i]; b[i]=B+3*out-C; c[i]=C; f[i]=-B*psi[i-1]-C*psi[i]; } return tridiagonal(a,b,c,f); } triple reference(triple[] v, int n, triple d0, triple d1) { triple[] V=sequence(new triple(int i) { return cross(v[i+1]-v[i],v[i+2]-v[i+1]); },n-1); if(n > 0) { V.push(cross(d0,v[1]-v[0])); V.push(cross(v[n]-v[n-1],d1)); } triple max=V[0]; real M=abs(max); for(int i=1; i < V.length; ++i) { triple vi=V[i]; real a=abs(vi); if(a > M) { M=a; max=vi; } } triple reference; for(int i=0; i < V.length; ++i) { triple u=unit(V[i]); reference += dot(u,max) < 0 ? -u : u; } return reference; } // Fill in missing directions for n cyclic nodes. void aim(flatguide3 g, int N) { bool cyclic=true; int start=0, end=0; // If the cycle contains one or more direction specifiers, break the loop. for(int k=0; k < N; ++k) if(g.solved(k)) {cyclic=false; end=k; break;} for(int k=N-1; k >= 0; --k) if(g.solved(k)) {cyclic=false; start=k; break;} while(start < N && g.control[start].active) ++start; int n=N-(start-end); if(n <= 1 || (cyclic && n <= 2)) return; triple[] v=new triple[cyclic ? n : n+1]; real[] alpha=new real[n]; real[] beta=new real[n]; for(int k=0; k < n; ++k) { int K=(start+k) % N; v[k]=g.nodes[K]; alpha[k]=g.Tension[K].out; beta[k]=g.Tension[K].in; } if(cyclic) { v.cyclic=true; alpha.cyclic=true; beta.cyclic=true; } else v[n]=g.nodes[(start+n) % N]; int final=(end-1) % N; triple d0=g.out[start].dir; triple d1=g.in[final].dir; triple reference=reference(v,n,d0,d1); real[] theta=theta(v,alpha,beta,d0,d1,g.out[start].gamma,g.in[final].gamma, reference); v.cyclic=true; theta.cyclic=true; for(int k=1; k < (cyclic ? n+1 : n); ++k) { triple w=dir(theta[k],v[k]-v[k-1],v[k+1]-v[k],reference); g.in[(start+k-1) % N].init(w); g.out[(start+k) % N].init(w); } if(g.out[start].dir == O) g.out[start].init(dir(theta[0],v[0]-g.nodes[(start-1) % N],v[1]-v[0], reference)); if(g.in[final].dir == O) g.in[final].init(dir(theta[n],v[n-1]-v[n-2],v[n]-v[n-1],reference)); } // Fill in missing directions for the sequence of nodes i...n. void aim(flatguide3 g, int i, int n) { int j=n-i; if(j > 1 || g.out[i].dir != O || g.in[i].dir != O) { triple[] v=new triple[j+1]; real[] alpha=new real[j]; real[] beta=new real[j]; for(int k=0; k < j; ++k) { v[k]=g.nodes[i+k]; alpha[k]=g.Tension[i+k].out; beta[k]=g.Tension[i+k].in; } v[j]=g.nodes[n]; triple d0=g.out[i].dir; triple d1=g.in[n-1].dir; triple reference=reference(v,j,d0,d1); real[] theta=theta(v,alpha,beta,d0,d1,g.out[i].gamma,g.in[n-1].gamma, reference); for(int k=1; k < j; ++k) { triple w=dir(theta[k],v[k]-v[k-1],v[k+1]-v[k],reference); g.in[i+k-1].init(w); g.out[i+k].init(w); } if(g.out[i].dir == O) { triple w=dir(theta[0],g.in[i].dir,v[1]-v[0],reference); if(i > 0) g.in[i-1].init(w); g.out[i].init(w); } if(g.in[n-1].dir == O) { triple w=dir(theta[j],g.out[n-1].dir,v[j]-v[j-1],reference); g.in[n-1].init(w); g.out[n].init(w); } } } private real Fuzz=10*realEpsilon; triple XYplane(pair z) {return (z.x,z.y,0);} triple YZplane(pair z) {return (0,z.x,z.y);} triple ZXplane(pair z) {return (z.y,0,z.x);} bool cyclic(guide3 g) {flatguide3 f; g(f); return f.cyclic();} int size(guide3 g) {flatguide3 f; g(f); return f.size();} int length(guide3 g) {flatguide3 f; g(f); return f.nodes.length-1;} triple dir(path3 p) { return dir(p,length(p)); } triple dir(path3 p, path3 h) { return unit(dir(p)+dir(h)); } // return the point on path3 p at arclength L triple arcpoint(path3 p, real L) { return point(p,arctime(p,L)); } // return the direction on path3 p at arclength L triple arcdir(path3 p, real L) { return dir(p,arctime(p,L)); } // return the time on path3 p at the relative fraction l of its arclength real reltime(path3 p, real l) { return arctime(p,l*arclength(p)); } // return the point on path3 p at the relative fraction l of its arclength triple relpoint(path3 p, real l) { return point(p,reltime(p,l)); } // return the direction of path3 p at the relative fraction l of its arclength triple reldir(path3 p, real l) { return dir(p,reltime(p,l)); } // return the initial point of path3 p triple beginpoint(path3 p) { return point(p,0); } // return the point on path3 p at half of its arclength triple midpoint(path3 p) { return relpoint(p,0.5); } // return the final point of path3 p triple endpoint(path3 p) { return point(p,length(p)); } path3 path3(triple v) { triple[] point={v}; return path3(point,point,point,new bool[] {false},false); } path3 path3(path p, triple plane(pair)=XYplane) { int n=size(p); return path3(sequence(new triple(int i) {return plane(precontrol(p,i));},n), sequence(new triple(int i) {return plane(point(p,i));},n), sequence(new triple(int i) {return plane(postcontrol(p,i));},n), sequence(new bool(int i) {return straight(p,i);},n), cyclic(p)); } path3[] path3(explicit path[] g, triple plane(pair)=XYplane) { return sequence(new path3(int i) {return path3(g[i],plane);},g.length); } path3 interp(path3 a, path3 b, real t) { int n=size(a); return path3(sequence(new triple(int i) { return interp(precontrol(a,i),precontrol(b,i),t);},n), sequence(new triple(int i) {return interp(point(a,i),point(b,i),t);},n), sequence(new triple(int i) {return interp(postcontrol(a,i), postcontrol(b,i),t);},n), sequence(new bool(int i) {return straight(a,i) && straight(b,i);},n), cyclic(a) && cyclic(b)); } path3 invert(path p, triple normal, triple point, projection P=currentprojection) { return path3(p,new triple(pair z) {return invert(z,normal,point,P);}); } path3 invert(path p, triple point, projection P=currentprojection) { return path3(p,new triple(pair z) {return invert(z,P.normal,point,P);}); } path3 invert(path p, projection P=currentprojection) { return path3(p,new triple(pair z) {return invert(z,P.normal,P.target,P);}); } // Construct a path from a path3 by applying P to each control point. path path(path3 p, pair P(triple)=xypart) { int n=length(p); if(n < 0) return nullpath; guide g=P(point(p,0)); if(n == 0) return g; for(int i=1; i < n; ++i) g=straight(p,i-1) ? g--P(point(p,i)) : g..controls P(postcontrol(p,i-1)) and P(precontrol(p,i))..P(point(p,i)); if(straight(p,n-1)) return cyclic(p) ? g--cycle : g--P(point(p,n)); pair post=P(postcontrol(p,n-1)); pair pre=P(precontrol(p,n)); return cyclic(p) ? g..controls post and pre..cycle : g..controls post and pre..P(point(p,n)); } void write(file file, string s="", explicit path3 x, suffix suffix=none) { write(file,s); int n=length(x); if(n < 0) write(""); else { for(int i=0; i < n; ++i) { write(file,point(x,i)); if(i < length(x)) { if(straight(x,i)) write(file,"--"); else { write(file,".. controls "); write(file,postcontrol(x,i)); write(file," and "); write(file,precontrol(x,i+1),newl); write(file," .."); } } } if(cyclic(x)) write(file,"cycle",suffix); else write(file,point(x,n),suffix); } } void write(string s="", explicit path3 x, suffix suffix=endl) { write(stdout,s,x,suffix); } void write(file file, string s="", explicit path3[] x, suffix suffix=none) { write(file,s); if(x.length > 0) write(file,x[0]); for(int i=1; i < x.length; ++i) { write(file,endl); write(file," ^^"); write(file,x[i]); } write(file,suffix); } void write(string s="", explicit path3[] x, suffix suffix=endl) { write(stdout,s,x,suffix); } path3 solve(flatguide3 g) { int n=g.nodes.length-1; // If duplicate points occur consecutively, add dummy controls (if absent). for(int i=0; i < n; ++i) { if(g.nodes[i] == g.nodes[i+1] && !g.control[i].active) g.control[i]=control(g.nodes[i],g.nodes[i],straight=true); } // Fill in empty direction specifiers inherited from explicit control points. for(int i=0; i < n; ++i) { if(g.control[i].active) { g.out[i].init(g.control[i].post-g.nodes[i]); g.in[i].init(g.nodes[i+1]-g.control[i].pre); } } // Propagate directions across nodes. for(int i=0; i < n; ++i) { int next=g.cyclic[i+1] ? 0 : i+1; if(g.out[next].active()) g.in[i].default(g.out[next]); if(g.in[i].active()) { g.out[next].default(g.in[i]); g.out[i+1].default(g.in[i]); } } // Compute missing 3D directions. // First, resolve cycles int i=find(g.cyclic); if(i > 0) { aim(g,i); // All other cycles can now be reduced to sequences. triple v=g.out[0].dir; for(int j=i; j <= n; ++j) { if(g.cyclic[j]) { g.in[j-1].default(v); g.out[j].default(v); if(g.nodes[j-1] == g.nodes[j] && !g.control[j-1].active) g.control[j-1]=control(g.nodes[j-1],g.nodes[j-1]); } } } // Next, resolve sequences. int i=0; int start=0; while(i < n) { // Look for a missing outgoing direction. while(i <= n && g.solved(i)) {start=i; ++i;} if(i > n) break; // Look for the end of the sequence. while(i < n && !g.solved(i)) ++i; while(start < i && g.control[start].active) ++start; if(start < i) aim(g,start,i); } // Compute missing 3D control points. for(int i=0; i < n; ++i) { int next=g.cyclic[i+1] ? 0 : i+1; if(!g.control[i].active) { control c; if((g.out[i].Curl && g.in[i].Curl) || (g.out[i].dir == O && g.in[i].dir == O)) { // fill in straight control points for path3 functions triple delta=(g.nodes[i+1]-g.nodes[i])/3; c=control(g.nodes[i]+delta,g.nodes[i+1]-delta,straight=true); } else { Controls C=Controls(g.nodes[i],g.nodes[next],g.out[i].dir,g.in[i].dir, g.Tension[i].out,g.Tension[i].in, g.Tension[i].atLeast); c=control(C.c0,C.c1); } g.control[i]=c; } } // Convert to Knuth's format (control points stored with nodes) int n=g.nodes.length; bool cyclic; if(n > 0) { cyclic=g.cyclic[n-1]; if(cyclic) --n; } triple[] pre=new triple[n]; triple[] point=new triple[n]; triple[] post=new triple[n]; bool[] straight=new bool[n]; if(n > 0) { for(int i=0; i < n-1; ++i) { point[i]=g.nodes[i]; post[i]=g.control[i].post; pre[i+1]=g.control[i].pre; straight[i]=g.control[i].straight; } point[n-1]=g.nodes[n-1]; if(cyclic) { pre[0]=g.control[n-1].pre; post[n-1]=g.control[n-1].post; straight[n-1]=g.control[n-1].straight; } else { pre[0]=point[0]; post[n-1]=point[n-1]; straight[n-1]=false; } } return path3(pre,point,post,straight,cyclic); } path nurb(path3 p, projection P, int ninterpolate=P.ninterpolate) { triple f=P.camera; triple u=unit(P.normal); transform3 t=P.t; path nurb(triple v0, triple v1, triple v2, triple v3) { return nurb(project(v0,t),project(v1,t),project(v2,t),project(v3,t), dot(u,f-v0),dot(u,f-v1),dot(u,f-v2),dot(u,f-v3),ninterpolate); } path g; if(straight(p,0)) g=project(point(p,0),t); int last=length(p); for(int i=0; i < last; ++i) { if(straight(p,i)) g=g--project(point(p,i+1),t); else g=g&nurb(point(p,i),postcontrol(p,i),precontrol(p,i+1),point(p,i+1)); } int n=length(g); if(cyclic(p)) g=g&cycle; return g; } path project(path3 p, projection P=currentprojection, int ninterpolate=P.ninterpolate) { guide g; int last=length(p); if(last < 0) return g; transform3 t=P.t; if(ninterpolate == 1 || piecewisestraight(p)) { g=project(point(p,0),t); // Construct the path. int stop=cyclic(p) ? last-1 : last; for(int i=0; i < stop; ++i) { if(straight(p,i)) g=g--project(point(p,i+1),t); else { g=g..controls project(postcontrol(p,i),t) and project(precontrol(p,i+1),t)..project(point(p,i+1),t); } } } else return nurb(p,P); if(cyclic(p)) g=straight(p,last-1) ? g--cycle : g..controls project(postcontrol(p,last-1),t) and project(precontrol(p,last),t)..cycle; return g; } pair[] project(triple[] v, projection P=currentprojection) { return sequence(new pair(int i) {return project(v[i],P.t);},v.length); } path[] project(explicit path3[] g, projection P=currentprojection) { return sequence(new path(int i) {return project(g[i],P);},g.length); } guide3 operator cast(path3 p) { int last=length(p); bool cyclic=cyclic(p); int stop=cyclic ? last-1 : last; return new void(flatguide3 f) { if(last >= 0) { f.node(point(p,0)); for(int i=0; i < stop; ++i) { if(straight(p,i)) { f.out(1); f.in(1); } else f.control(postcontrol(p,i),precontrol(p,i+1)); f.node(point(p,i+1)); } if(cyclic) { if(straight(p,stop)) { f.out(1); f.in(1); } else f.control(postcontrol(p,stop),precontrol(p,last)); f.cycleToken(); } } }; } // Return a unit normal vector to a planar path p (or O if the path is // nonplanar). triple normal(path3 p) { triple normal; real fuzz=sqrtEpsilon*abs(max(p)-min(p)); real absnormal; real theta; bool Cross(triple a, triple b) { if(abs(a) >= fuzz && abs(b) >= fuzz) { triple n=cross(unit(a),unit(b)); real absn=abs(n); if(absn < sqrtEpsilon) return false; n=unit(n); if(absnormal > 0 && abs(normal-n) > sqrtEpsilon && abs(normal+n) > sqrtEpsilon) return true; else { int sign=dot(n,normal) >= 0 ? 1 : -1; theta += sign*asin1(absn); if(absn > absnormal) { absnormal=absn; normal=n; theta=sign*theta; } } } return false; } int L=length(p); if(L <= 0) return O; triple zi=point(p,0); triple v0=zi-precontrol(p,0); for(int i=0; i < L; ++i) { triple c0=postcontrol(p,i); triple c1=precontrol(p,i+1); triple zp=point(p,i+1); triple v1=c0-zi; triple v2=c1-c0; triple v3=zp-c1; if(Cross(v0,v1) || Cross(v1,v2) || Cross(v2,v3)) return O; v0=v3; zi=zp; } return theta >= 0 ? normal : -normal; } // Return a unit normal vector to a polygon with vertices in p. triple normal(triple[] p) { triple normal; real fuzz=sqrtEpsilon*abs(maxbound(p)-minbound(p)); real absnormal; real theta; bool Cross(triple a, triple b) { if(abs(a) >= fuzz && abs(b) >= fuzz) { triple n=cross(unit(a),unit(b)); real absn=abs(n); n=unit(n); if(absnormal > 0 && absn > sqrtEpsilon && abs(normal-n) > sqrtEpsilon && abs(normal+n) > sqrtEpsilon) return true; else { int sign=dot(n,normal) >= 0 ? 1 : -1; theta += sign*asin1(absn); if(absn > absnormal) { absnormal=absn; normal=n; theta=sign*theta; } } } return false; } if(p.length <= 0) return O; triple zi=p[0]; triple v0=zi-p[p.length-1]; for(int i=0; i < p.length-1; ++i) { triple zp=p[i+1]; triple v1=zp-zi; if(Cross(v0,v1)) return O; v0=v1; zi=zp; } return theta >= 0 ? normal : -normal; } // Transforms that map XY plane to YX, YZ, ZY, ZX, and XZ planes. restricted transform3 XY=identity4; restricted transform3 YX=rotate(-90,O,Z); restricted transform3 YZ=rotate(90,O,Z)*rotate(90,O,X); restricted transform3 ZY=rotate(-90,O,X)*YZ; restricted transform3 ZX=rotate(-90,O,Z)*rotate(-90,O,Y); restricted transform3 XZ=rotate(-90,O,Y)*ZX; private transform3 flip(transform3 t, triple X, triple Y, triple Z, projection P) { static transform3 flip(triple v) { static real s(real x) {return x > 0 ? -1 : 1;} return scale(s(v.x),s(v.y),s(v.z)); } triple u=unit(P.normal); triple up=unit(perp(P.up,u)); bool upright=dot(Z,u) >= 0; if(dot(Y,up) < 0) { t=flip(Y)*t; upright=!upright; } return upright ? t : flip(X)*t; } restricted transform3 XY(projection P=currentprojection) { return flip(XY,X,Y,Z,P); } restricted transform3 YX(projection P=currentprojection) { return flip(YX,Y,X,Z,P); } restricted transform3 YZ(projection P=currentprojection) { return flip(YZ,Y,Z,X,P); } restricted transform3 ZY(projection P=currentprojection) { return flip(ZY,Z,Y,X,P); } restricted transform3 ZX(projection P=currentprojection) { return flip(ZX,Z,X,Y,P); } restricted transform3 XZ(projection P=currentprojection) { return flip(XZ,X,Z,Y,P); } // Transform3 that projects in direction dir onto plane with normal n // through point O. transform3 planeproject(triple n, triple O=O, triple dir=n) { real a=n.x, b=n.y, c=n.z; real u=dir.x, v=dir.y, w=dir.z; real delta=1.0/(a*u+b*v+c*w); real d=-(a*O.x+b*O.y+c*O.z)*delta; return new real[][] { {(b*v+c*w)*delta,-b*u*delta,-c*u*delta,-d*u}, {-a*v*delta,(a*u+c*w)*delta,-c*v*delta,-d*v}, {-a*w*delta,-b*w*delta,(a*u+b*v)*delta,-d*w}, {0,0,0,1} }; } // Transform3 that projects in direction dir onto plane defined by p. transform3 planeproject(path3 p, triple dir=O) { triple n=normal(p); return planeproject(n,point(p,0),dir == O ? n : dir); } // Transform for projecting onto plane through point O with normal cross(u,v). transform transform(triple u, triple v, triple O=O, projection P=currentprojection) { transform3 t=P.t; real[] tO=t*new real[] {O.x,O.y,O.z,1}; real tO3=tO[3]; real factor=1/tO3^2; real[] x=(tO3*t[0]-tO[0]*t[3])*factor; real[] y=(tO3*t[1]-tO[1]*t[3])*factor; triple x=(x[0],x[1],x[2]); triple y=(y[0],y[1],y[2]); u=unit(u); v=unit(v); return (0,0,dot(u,x),dot(v,x),dot(u,y),dot(v,y)); } // Project Label onto plane through point O with normal cross(u,v). Label project(Label L, triple u, triple v, triple O=O, projection P=currentprojection) { Label L=L.copy(); L.position=project(O,P.t); L.transform(transform(u,v,O,P)); return L; } path3 operator cast(guide3 g) {return solve(g);} path3 operator cast(triple v) {return path3(v);} guide3[] operator cast(triple[] v) { return sequence(new guide3(int i) {return v[i];},v.length); } path3[] operator cast(triple[] v) { return sequence(new path3(int i) {return v[i];},v.length); } path3[] operator cast(guide3[] g) { return sequence(new path3(int i) {return solve(g[i]);},g.length); } guide3[] operator cast(path3[] g) { return sequence(new guide3(int i) {return g[i];},g.length); } void write(file file, string s="", explicit guide3[] x, suffix suffix=none) { write(file,s,(path3[]) x,suffix); } void write(string s="", explicit guide3[] x, suffix suffix=endl) { write(stdout,s,(path3[]) x,suffix); } triple point(explicit guide3 g, int t) { flatguide3 f; g(f); int n=f.size(); return f.nodes[adjustedIndex(t,n,f.cyclic())]; } triple[] dirSpecifier(guide3 g, int t) { flatguide3 f; g(f); int n=f.size(); checkEmpty(n); if(f.cyclic()) t=t % n; else if(t < 0 || t >= n-1) return new triple[]; return new triple[] {f.out[t].dir,f.in[t].dir}; } triple[] controlSpecifier(guide3 g, int t) { flatguide3 f; g(f); int n=f.size(); checkEmpty(n); if(f.cyclic()) t=t % n; else if(t < 0 || t >= n-1) return new triple[]; control c=f.control[t]; if(c.active) return new triple[] {c.post,c.pre}; else return new triple[]; } tensionSpecifier tensionSpecifier(guide3 g, int t) { flatguide3 f; g(f); int n=f.size(); checkEmpty(n); if(f.cyclic()) t=t % n; else if(t < 0 || t >= n-1) return operator tension(1,1,false); Tension T=f.Tension[t]; return operator tension(T.out,T.in,T.atLeast); } real[] curlSpecifier(guide3 g, int t) { flatguide3 f; g(f); int n=f.size(); checkEmpty(n); if(f.cyclic()) t=t % n; else if(t < 0 || t >= n-1) return new real[]; return new real[] {f.out[t].gamma,f.in[t].gamma}; } guide3 reverse(guide3 g) { flatguide3 f; bool cyclic=cyclic(g); g(f); if(f.precyclic()) return reverse(solve(g)); int n=f.size(); checkEmpty(n); guide3 G; if(n >= 0) { int start=cyclic ? n : n-1; for(int i=start; i > 0; --i) { G=G..f.nodes[i]; control c=f.control[i-1]; if(c.active) G=G..operator controls(c.pre,c.post); else { dir in=f.in[i-1]; triple d=in.dir; if(d != O) G=G..operator spec(-d,JOIN_OUT); else if(in.Curl) G=G..operator curl(in.gamma,JOIN_OUT); dir out=f.out[i-1]; triple d=out.dir; if(d != O) G=G..operator spec(-d,JOIN_IN); else if(out.Curl) G=G..operator curl(out.gamma,JOIN_IN); } } if(cyclic) G=G..cycle; else G=G..f.nodes[0]; } return G; } triple intersectionpoint(path3 p, path3 q, real fuzz=-1) { real[] t=intersect(p,q,fuzz); if(t.length == 0) abort("paths do not intersect"); return point(p,t[0]); } // return an array containing all intersection points of p and q triple[] intersectionpoints(path3 p, path3 q, real fuzz=-1) { real[][] t=intersections(p,q,fuzz); return sequence(new triple(int i) {return point(p,t[i][0]);},t.length); } triple[] intersectionpoints(explicit path3[] p, explicit path3[] q, real fuzz=-1) { triple[] v; for(int i=0; i < p.length; ++i) for(int j=0; j < q.length; ++j) v.append(intersectionpoints(p[i],q[j],fuzz)); return v; } path3 operator &(path3 p, cycleToken tok) { int n=length(p); if(n < 0) return nullpath3; triple a=point(p,0); triple b=point(p,n); return subpath(p,0,n-1)..controls postcontrol(p,n-1) and precontrol(p,n).. cycle; } // return the point on path3 p at arclength L triple arcpoint(path3 p, real L) { return point(p,arctime(p,L)); } // return the point on path3 p at arclength L triple arcpoint(path3 p, real L) { return point(p,arctime(p,L)); } // return the direction on path3 p at arclength L triple arcdir(path3 p, real L) { return dir(p,arctime(p,L)); } // return the time on path3 p at the relative fraction l of its arclength real reltime(path3 p, real l) { return arctime(p,l*arclength(p)); } // return the point on path3 p at the relative fraction l of its arclength triple relpoint(path3 p, real l) { return point(p,reltime(p,l)); } // return the direction of path3 p at the relative fraction l of its arclength triple reldir(path3 p, real l) { return dir(p,reltime(p,l)); } // return the point on path3 p at half of its arclength triple midpoint(path3 p) { return relpoint(p,0.5); } real relative(Label L, path3 g) { return L.position.relative ? reltime(g,L.relative()) : L.relative(); } // return the linear transformation that maps X,Y,Z to u,v,w. transform3 transform3(triple u, triple v, triple w=cross(u,v)) { return new real[][] { {u.x,v.x,w.x,0}, {u.y,v.y,w.y,0}, {u.z,v.z,w.z,0}, {0,0,0,1} }; } // return the rotation that maps Z to a unit vector u about cross(u,Z), transform3 align(triple u) { real a=u.x; real b=u.y; real c=u.z; real d=a^2+b^2; if(d != 0) { d=sqrt(d); real e=1/d; return new real[][] { {-b*e,-a*c*e,a,0}, {a*e,-b*c*e,b,0}, {0,d,c,0}, {0,0,0,1}}; } return c >= 0 ? identity(4) : diagonal(1,-1,-1,1); } // Align Label with normal in direction dir. Label align(Label L, triple dir) { Label L=L.copy(); L.transform3(align(unit(dir))); return L; } // return a rotation that maps X,Y to the projection plane. transform3 transform3(projection P=currentprojection) { triple w=unit(P.normal); triple v=unit(perp(P.up,w)); if(v == O) v=cross(perp(w),w); triple u=cross(v,w); return u != O ? transform3(u,v,w) : identity(4); } triple[] triples(real[] x, real[] y, real[] z) { if(x.length != y.length || x.length != z.length) abort("arrays have different lengths"); return sequence(new triple(int i) {return (x[i],y[i],z[i]);},x.length); } path3[] operator cast(path3 p) { return new path3[] {p}; } path3[] operator cast(guide3 g) { return new path3[] {(path3) g}; } path3[] operator ^^ (path3 p, path3 q) { return new path3[] {p,q}; } path3[] operator ^^ (path3 p, explicit path3[] q) { return concat(new path3[] {p},q); } path3[] operator ^^ (explicit path3[] p, path3 q) { return concat(p,new path3[] {q}); } path3[] operator ^^ (explicit path3[] p, explicit path3[] q) { return concat(p,q); } path3[] operator * (transform3 t, explicit path3[] p) { return sequence(new path3(int i) {return t*p[i];},p.length); } triple[] operator * (transform3 t, triple[] v) { return sequence(new triple(int i) {return t*v[i];},v.length); } triple[][] operator * (transform3 t, triple[][] v) { triple[][] V=new triple[v.length][]; for(int i=0; i < v.length; ++i) { triple[] vi=v[i]; V[i]=sequence(new triple(int j) {return t*vi[j];},vi.length); } return V; } triple min(explicit path3[] p) { checkEmpty(p.length); triple minp=min(p[0]); for(int i=1; i < p.length; ++i) minp=minbound(minp,min(p[i])); return minp; } triple max(explicit path3[] p) { checkEmpty(p.length); triple maxp=max(p[0]); for(int i=1; i < p.length; ++i) maxp=maxbound(maxp,max(p[i])); return maxp; } path3 randompath3(int n, bool cumulate=true, interpolate3 join=operator ..) { guide3 g; triple w; for(int i=0; i <= n; ++i) { triple z=(unitrand()-0.5,unitrand()-0.5,unitrand()-0.5); if(cumulate) w += z; else w=z; g=join(g,w); } return g; } path3[] box(triple v1, triple v2) { return (v1.x,v1.y,v1.z)-- (v1.x,v1.y,v2.z)-- (v1.x,v2.y,v2.z)-- (v1.x,v2.y,v1.z)-- (v1.x,v1.y,v1.z)-- (v2.x,v1.y,v1.z)-- (v2.x,v1.y,v2.z)-- (v2.x,v2.y,v2.z)-- (v2.x,v2.y,v1.z)-- (v2.x,v1.y,v1.z)^^ (v2.x,v2.y,v1.z)-- (v1.x,v2.y,v1.z)^^ (v1.x,v2.y,v2.z)-- (v2.x,v2.y,v2.z)^^ (v2.x,v1.y,v2.z)-- (v1.x,v1.y,v2.z); } restricted path3[] unitbox=box(O,(1,1,1)); restricted path3 unitcircle3=X..Y..-X..-Y..cycle; restricted path3 unitsquare3=O--X--X+Y--Y--cycle; path3 circle(triple c, real r, triple normal=Z) { path3 p=normal == Z ? unitcircle3 : align(unit(normal))*unitcircle3; return shift(c)*scale3(r)*p; } // return an arc centered at c from triple v1 to v2 (assuming |v2-c|=|v1-c|), // drawing in the given direction. // The normal must be explicitly specified if c and the endpoints are colinear. path3 arc(triple c, triple v1, triple v2, triple normal=O, bool direction=CCW) { v1 -= c; real r=abs(v1); v1=unit(v1); v2=unit(v2-c); if(normal == O) { normal=cross(v1,v2); if(normal == O) abort("explicit normal required for these endpoints"); } transform3 T; bool align=normal != Z; if(align) { T=align(unit(normal)); transform3 Tinv=transpose(T); v1=Tinv*v1; v2=Tinv*v2; } string invalidnormal="invalid normal vector"; real fuzz=sqrtEpsilon; if(abs(v1.z) > fuzz || abs(v2.z) > fuzz) abort(invalidnormal); real[] t1=intersect(unitcircle3,O--2*(v1.x,v1.y,0)); real[] t2=intersect(unitcircle3,O--2*(v2.x,v2.y,0)); if(t1.length == 0 || t2.length == 0) abort(invalidnormal); real t1=t1[0]; real t2=t2[0]; int n=length(unitcircle3); if(direction) { if(t1 >= t2) t1 -= n; } else if(t2 >= t1) t2 -= n; path3 p=subpath(unitcircle3,t1,t2); if(align) p=T*p; return shift(c)*scale3(r)*p; } // return an arc centered at c with radius r from c+r*dir(theta1,phi1) to // c+r*dir(theta2,phi2) in degrees, drawing in the given direction // relative to the normal vector cross(dir(theta1,phi1),dir(theta2,phi2)). // The normal must be explicitly specified if c and the endpoints are colinear. path3 arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=O, bool direction) { return arc(c,c+r*dir(theta1,phi1),c+r*dir(theta2,phi2),normal,direction); } // return an arc centered at c with radius r from c+r*dir(theta1,phi1) to // c+r*dir(theta2,phi2) in degrees, drawing drawing counterclockwise // relative to the normal vector cross(dir(theta1,phi1),dir(theta2,phi2)) // iff theta2 > theta1 or (theta2 == theta1 and phi2 >= phi1). // The normal must be explicitly specified if c and the endpoints are colinear. path3 arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=O) { return arc(c,r,theta1,phi1,theta2,phi2,normal, theta2 > theta1 || (theta2 == theta1 && phi2 >= phi1) ? CCW : CW); } private real epsilon=1000*realEpsilon; // Return a representation of the plane through point O with normal cross(u,v). path3 plane(triple u, triple v, triple O=O) { return O--O+u--O+u+v--O+v--cycle; } // PRC/OpenGL support include three_light; void draw(frame f, path3 g, material p=currentpen, light light=nolight, string name="", render render=defaultrender, projection P=currentprojection); void begingroup3(frame f, string name="", render render=defaultrender) { _begingroup3(f,name,render.compression,render.granularity,render.closed, render.tessellate,render.merge == false, render.merge == true,render.interaction.center,render.interaction.type); } void begingroup3(picture pic=currentpicture, string name="", render render=defaultrender) { pic.add(new void(frame f, transform3, picture pic, projection) { if(is3D()) begingroup3(f,name,render); if(pic != null) begingroup(pic); },true); } void endgroup3(picture pic=currentpicture) { pic.add(new void(frame f, transform3, picture pic, projection) { if(is3D()) endgroup3(f); if(pic != null) endgroup(pic); },true); } void addPath(picture pic, path3 g, pen p) { if(size(g) > 0) pic.addBox(min(g),max(g),min3(p),max3(p)); } include three_surface; include three_margins; pair min(path3 p, projection P) { path3 q=P.T.modelview*p; if(P.infinity) return xypart(min(q)); return maxratio(q)/P.T.projection[3][2]; } pair max(path3 p, projection P) { path3 q=P.T.modelview*p; if(P.infinity) return xypart(max(q)); return minratio(q)/P.T.projection[3][2]; } pair min(frame f, projection P) { frame g=P.T.modelview*f; if(P.infinity) return xypart(min3(g)); return maxratio(g)/P.T.projection[3][2]; } pair max(frame f, projection P) { frame g=P.T.modelview*f; if(P.infinity) return xypart(max3(g)); return minratio(g)/P.T.projection[3][2]; } void draw(picture pic=currentpicture, Label L="", path3 g, align align=NoAlign, material p=currentpen, margin3 margin=NoMargin3, light light=nolight, string name="", render render=defaultrender) { pen q=(pen) p; pic.add(new void(frame f, transform3 t, picture pic, projection P) { path3 G=margin(t*g,q).g; if(is3D()) { draw(f,G,p,light,name,render,null); if(pic != null && size(G) > 0) pic.addBox(min(G,P),max(G,P),min(q),max(q)); } if(pic != null) draw(pic,project(G,P),q); },true); Label L=L.copy(); L.align(align); if(L.s != "") { L.p(q); label(pic,L,g); } addPath(pic,g,q); } include three_tube; draw=new void(frame f, path3 g, material p=currentpen, light light=nolight, string name="", render render=defaultrender, projection P=currentprojection) { pen q=(pen) p; if(is3D()) { real width=linewidth(q); void drawthick(path3 g) { if(settings.thick && width > 0) { bool prc=prc(); bool primitive=primitive(); real linecap=linecap(q); real r=0.5*width; bool open=!cyclic(g); int L=length(g); triple g0=point(g,0); triple gL=point(g,L); if(open && L > 0) { if(linecap == 2) { g0 -= r*dir(g,0); gL += r*dir(g,L); g=g0..g..gL; L += 2; } } tube T=tube(g,width); path3 c=T.center; if(L >= 0) { if(open) { int Lc=length(c); triple c0=point(c,0); triple cL=point(c,Lc); triple dir0=dir(g,0); triple dirL=dir(g,L); triple dirc0=dir(c,0); triple dircL=dir(c,Lc); transform3 t0=shift(g0)*align(-dir0); transform3 tL=shift(gL)*align(dirL); transform3 tc0=shift(c0)*align(-dirc0); transform3 tcL=shift(cL)*align(dircL); if(linecap == 0 || linecap == 2) { transform3 scale2r=scale(r,r,1); T.s.push(t0*scale2r*unitdisk); if(L > 0) { T.s.push(tL*scale2r*unitdisk); } } else if(linecap == 1) { transform3 scale3r=scale3(r); T.s.push(t0*scale3r*(straight(c,0) ? unithemisphere : unitsphere)); if(L > 0) T.s.push(tL*scale3r*(straight(c,Lc-1) ? unithemisphere : unitsphere)); } } // Draw central core for better small-scale rendering. if((!prc || piecewisestraight(g)) && !primitive && opacity(q) == 1) _draw(f,c,p,light); } for(surface s : T.s) draw(f,s,p,light,render); } else _draw(f,g,p,light); } bool group=q != nullpen && (name != "" || render.defaultnames); if(group) begingroup3(f,name == "" ? "curve" : name,render); if(linetype(q).length == 0) drawthick(g); else { real[] dash=linetype(adjust(q,arclength(g),cyclic(g))); if(sum(dash) > 0) { dash.cyclic=true; real offset=offset(q); real L=arclength(g); int i=0; real l=offset; while(l <= L) { real t1=arctime(g,l); l += dash[i]; real t2=arctime(g,min(l,L)); drawthick(subpath(g,t1,t2)); ++i; l += dash[i]; ++i; } } } if(group) endgroup3(f); } else draw(f,project(g,P),q); }; void draw(frame f, explicit path3[] g, material p=currentpen, light light=nolight, string name="", render render=defaultrender, projection P=currentprojection) { bool group=g.length > 1 && (name != "" || render.defaultnames); if(group) begingroup3(f,name == "" ? "curves" : name,render); for(int i=0; i < g.length; ++i) draw(f,g[i],p,light,partname(i,render),render,P); if(group) endgroup3(f); } void draw(picture pic=currentpicture, explicit path3[] g, material p=currentpen, margin3 margin=NoMargin3, light light=nolight, string name="", render render=defaultrender) { bool group=g.length > 1 && (name != "" || render.defaultnames); if(group) begingroup3(pic,name == "" ? "curves" : name,render); for(int i=0; i < g.length; ++i) draw(pic,g[i],p,margin,light,partname(i,render),render); if(group) endgroup3(pic); } include three_arrows; void draw(picture pic=currentpicture, Label L="", path3 g, align align=NoAlign, material p=currentpen, arrowbar3 arrow, arrowbar3 bar=None, margin3 margin=NoMargin3, light light=nolight, light arrowheadlight=currentlight, string name="", render render=defaultrender) { bool group=arrow != None || bar != None; if(group) begingroup3(pic,name,render); bool drawpath=arrow(pic,g,p,margin,light,arrowheadlight); if(bar(pic,g,p,margin,light,arrowheadlight) && drawpath) draw(pic,L,g,align,p,margin,light,render); if(group) endgroup3(pic); if(L.s != "") label(pic,L,g,align,(pen) p); } void draw(frame f, path3 g, material p=currentpen, arrowbar3 arrow, light light=nolight, light arrowheadlight=currentlight, string name="", render render=defaultrender, projection P=currentprojection) { picture pic; bool group=arrow != None; if(group) begingroup3(f,name,render); if(arrow(pic,g,p,NoMargin3,light,arrowheadlight)) draw(f,g,p,light,render,P); add(f,pic.fit()); if(group) endgroup3(f); } void add(picture pic=currentpicture, void d(picture,transform3), bool exact=false) { pic.add(d,exact); } // Fit the picture src using the identity transformation (so user // coordinates and truesize coordinates agree) and add it about the point // position to picture dest. void add(picture dest, picture src, triple position, bool group=true, bool above=true) { dest.add(new void(picture f, transform3 t) { f.add(shift(t*position)*src,group,above); }); } void add(picture src, triple position, bool group=true, bool above=true) { add(currentpicture,src,position,group,above); } // Align an arrow pointing to b from the direction dir. The arrow is // 'length' PostScript units long. void arrow(picture pic=currentpicture, Label L="", triple b, triple dir, real length=arrowlength, align align=NoAlign, pen p=currentpen, arrowbar3 arrow=Arrow3, margin3 margin=EndMargin3, light light=nolight, light arrowheadlight=currentlight, string name="", render render=defaultrender) { Label L=L.copy(); if(L.defaultposition) L.position(0); L.align(L.align,dir); L.p(p); picture opic; marginT3 margin=margin(b--b,p); // Extract margin.begin and margin.end triple a=(margin.begin+length+margin.end)*unit(dir); draw(opic,L,a--O,align,p,arrow,margin,light,arrowheadlight,name,render); add(pic,opic,b); } void arrow(picture pic=currentpicture, Label L="", triple b, pair dir, real length=arrowlength, align align=NoAlign, pen p=currentpen, arrowbar3 arrow=Arrow3, margin3 margin=EndMargin3, light light=nolight, light arrowheadlight=currentlight, string name="", render render=defaultrender, projection P=currentprojection) { arrow(pic,L,b,invert(dir,b,P),length,align,p,arrow,margin,light, arrowheadlight,name,render); } triple min3(picture pic, projection P=currentprojection) { return pic.min3(P); } triple max3(picture pic, projection P=currentprojection) { return pic.max3(P); } triple size3(picture pic, bool user=false, projection P=currentprojection) { transform3 t=pic.calculateTransform3(P); triple M=pic.max(t); triple m=pic.min(t); if(!user) return M-m; t=inverse(t); return t*M-t*m; } triple point(frame f, triple dir) { triple m=min3(f); triple M=max3(f); return m+realmult(rectify(dir),M-m); } triple point(picture pic=currentpicture, triple dir, bool user=true, projection P=currentprojection) { triple min = pic.userMin(), max = pic.userMax(); triple v=min+realmult(rectify(dir),max-min); return user ? v : pic.calculateTransform3(P)*v; } triple truepoint(picture pic=currentpicture, triple dir, bool user=true, projection P=currentprojection) { transform3 t=pic.calculateTransform3(P); triple m=pic.min(t); triple M=pic.max(t); triple v=m+realmult(rectify(dir),M-m); return user ? inverse(t)*v : v; } void add(picture dest=currentpicture, object src, pair position=0, pair align=0, bool group=true, filltype filltype=NoFill, bool above=true) { if(prc()) label(dest,src,position,align); else if(settings.render == 0) plain.add(dest,src,position,align,group,filltype,above); } private struct viewpoint { triple target,camera,up; real angle; void operator init(string s) { s=replace(s,'\n'," "); string[] S=split(s); int pos(string s, string key) { int pos=find(s,key); if(pos < 0) return -1; pos += length(key); while(substr(s,pos,1) == " ") ++pos; if(substr(s,pos,1) == "=") return pos+1; return -1; } triple C2C=X; real ROO=1; real ROLL=0; angle=30; int pos; for(int k=0; k < S.length; ++k) { if((pos=pos(S[k],"COO")) >= 0) target=((real) substr(S[k],pos),(real) S[++k],(real) S[++k]); else if((pos=pos(S[k],"C2C")) >= 0) C2C=((real) substr(S[k],pos),(real) S[++k],(real) S[++k]); else if((pos=pos(S[k],"ROO")) >= 0) ROO=(real) substr(S[k],pos); else if((pos=pos(S[k],"ROLL")) >= 0) ROLL=(real) substr(S[k],pos); else if((pos=pos(S[k],"AAC")) >= 0) angle=(real) substr(S[k],pos); } camera=target+ROO*C2C; triple u=unit(target-camera); triple w=unit(Z-u.z*u); up=rotate(ROLL,O,u)*w; } } projection perspective(string s) { viewpoint v=viewpoint(s); projection P=perspective(v.camera,v.up,v.target); P.angle=v.angle; P.absolute=true; return P; } projection absorthographic(triple camera=Z, triple target=O, real roll=0) { triple u=unit(target-camera); triple w=unit(Z-u.z*u); triple up=rotate(roll,O,u)*w; projection P= projection(camera,up,target,1,0,false,false, new transformation(triple camera, triple up, triple target) {return transformation(look(camera,up,target));}); P.absolute=true; return P; } projection absperspective(triple camera=Z, triple target=O, real roll=0, real angle=30) { triple u=unit(target-camera); triple w=unit(Z-u.z*u); triple up=rotate(roll,O,u)*w; projection P=perspective(camera,up,target); P.angle=angle; P.absolute=true; return P; } private string Format(real x) { assert(abs(x) < 1e17,"Number too large: "+string(x)); return format("%.9f",x,"C"); } private string Format(triple v, string sep=" ") { return Format(v.x)+sep+Format(v.y)+sep+Format(v.z); } private string Format(real[] c) { return Format((c[0],c[1],c[2])); } private string format(triple v, string sep=" ") { return string(v.x)+sep+string(v.y)+sep+string(v.z); } private string Format(transform3 t, string sep=" ") { return Format(t[0][0])+sep+Format(t[1][0])+sep+Format(t[2][0])+sep+ Format(t[0][1])+sep+Format(t[1][1])+sep+Format(t[2][1])+sep+ Format(t[0][2])+sep+Format(t[1][2])+sep+Format(t[2][2])+sep+ Format(t[0][3])+sep+Format(t[1][3])+sep+Format(t[2][3]); } pair viewportmargin(pair lambda) { return maxbound(0.5*(viewportsize-lambda),viewportmargin); } string embed3D(string prefix, string label=prefix, string text=label, frame f, string format="", real width=0, real height=0, string options="", string script="", light light=currentlight, projection P=currentprojection, real viewplanesize=0) { if(!prc(format) || Embed == null) return ""; if(width == 0) width=settings.paperwidth; if(height == 0) height=settings.paperheight; if(script == "") script=defaultembed3Dscript; if(P.infinity) { if(viewplanesize == 0) { triple lambda=max3(f)-min3(f); pair margin=viewportmargin((lambda.x,lambda.y)); viewplanesize=(max(lambda.x+2*margin.x,lambda.y+2*margin.y))/P.zoom; } } else if(!P.absolute) P.angle=2*aTan(Tan(0.5*P.angle)); shipout3(prefix,f); string name=prefix+".js"; if(!settings.inlinetex && !prconly()) file3.push(prefix+".prc"); static transform3 flipxz=xscale3(-1)*zscale3(-1); transform3 inv=inverse(flipxz*P.T.modelview); string options3="3Dlights="+ (light.on() ? "Headlamp" : "None"); if(defaultembed3Doptions != "") options3 += ","+defaultembed3Doptions; if((settings.render < 0 || !settings.embed) && settings.auto3D) options3 += ",activate=pagevisible"; options3 += ",3Dtoolbar="+(settings.toolbar ? "true" : "false")+ ",label="+label+ (P.infinity ? ",3Dortho="+Format(1/viewplanesize) : ",3Daac="+Format(P.angle))+ ",3Dc2w="+Format(inv)+ ",3Droo="+Format(abs(P.vector()))+ ",3Dpsob="+(P.infinity ? "Max" : "H")+ ",3Dbg="+Format(light.background()); if(options != "") options3 += ","+options; if(settings.inlinetex) prefix=jobname(prefix); options3 += ",add3Djscript=asylabels.js"; return text == "" ? Embed(prefix+".prc","",options3,width,height) : "\hbox to 0pt{"+text+"\hss}"+Embed(prefix+".prc","\phantom{"+text+"}", options3); } struct scene { frame f; transform3 t; projection P; bool adjusted; real width,height; pair viewportmargin; transform3 T=identity4; picture pic2; bool keepAspect=true; void operator init(frame f, real width, real height, projection P=currentprojection) { this.f=f; this.t=identity4; this.P=P; this.width=width; this.height=height; } void operator init(picture pic, real xsize=pic.xsize, real ysize=pic.ysize, bool keepAspect=pic.keepAspect, bool is3D=true, projection P=currentprojection) { real xsize3=pic.xsize3, ysize3=pic.ysize3, zsize3=pic.zsize3; bool warn=true; this.keepAspect=keepAspect; if(xsize3 == 0 && ysize3 == 0 && zsize3 == 0) { xsize3=ysize3=zsize3=max(xsize,ysize); warn=false; } this.P=P.copy(); if(!P.absolute && P.showtarget && !pic.empty3()) draw(pic,this.P.target,nullpen); t=pic.scaling(xsize3,ysize3,zsize3,keepAspect,warn); adjusted=false; triple m=pic.min(t); triple M=pic.max(t); if(!P.absolute) { this.P=t*this.P; if(this.P.autoadjust || this.P.infinity) adjusted=adjusted | this.P.adjust(m,M); } bool scale=xsize != 0 || ysize != 0; bool scaleAdjust=scale && this.P.autoadjust; bool noAdjust=this.P.absolute || !scaleAdjust; if(pic.bounds3.exact && noAdjust) this.P.bboxonly=false; f=pic.fit3(t,pic.bounds3.exact ? pic2 : null,this.P); if(!pic.bounds3.exact) { if(noAdjust) this.P.bboxonly=false; transform3 s=pic.scale3(f,xsize3,ysize3,zsize3,keepAspect); t=s*t; this.P=s*this.P; f=pic.fit3(t,pic2,this.P); } if(is3D || scale) { pic2.bounds.exact=true; transform s=pic2.scaling(xsize,ysize,keepAspect); pair m2=pic2.min(s); pair M2=pic2.max(s); pair lambda=M2-m2; viewportmargin=viewportmargin(lambda); width=ceil(lambda.x+2*viewportmargin.x); height=ceil(lambda.y+2*viewportmargin.y); if(!this.P.absolute) { if(scaleAdjust) { pair v=(s.xx,s.yy); transform3 T=this.P.t; pair x=project(X,T); pair y=project(Y,T); pair z=project(Z,T); real f(pair a, pair b) { return b == 0 ? (0.5*(a.x+a.y)) : (b.x^2*a.x+b.y^2*a.y)/(b.x^2+b.y^2); } transform3 s=keepAspect ? scale3(min(f(v,x),f(v,y),f(v,z))) : xscale3(f(v,x))*yscale3(f(v,y))*zscale3(f(v,z)); s=shift(this.P.target)*s*shift(-this.P.target); t=s*t; this.P=s*this.P; this.P.bboxonly=false; if(!is3D) pic2.erase(); f=pic.fit3(t,is3D ? null : pic2,this.P); } if(this.P.autoadjust || this.P.infinity) adjusted=adjusted | this.P.adjust(min3(f),max3(f)); } } } // Choose the angle to be just large enough to view the entire image. real angle(projection P) { T=identity4; real h=-0.5*P.target.z; pair r,R; real diff=realMax; pair s; int i; do { r=minratio(f); R=maxratio(f); pair lasts=s; if(P.autoadjust) { s=r+R; if(s != 0) { transform3 t=shift(h*s.x,h*s.y,0); f=t*f; T=t*T; adjusted=true; } } diff=abs(s-lasts); ++i; } while (diff > angleprecision && i < maxangleiterations); real aspect=width > 0 ? height/width : 1; real rx=-r.x*aspect; real Rx=R.x*aspect; real ry=-r.y; real Ry=R.y; if(!P.autoadjust) { if(rx > Rx) Rx=rx; else rx=Rx; if(ry > Ry) Ry=ry; else ry=Ry; } return (1+angleprecision)*max(aTan(rx)+aTan(Rx),aTan(ry)+aTan(Ry)); } } object embed(string prefix=outprefix(), string label=prefix, string text=label, scene S, string format="", bool view=true, string options="", string script="", light light=currentlight) { object F; transform3 modelview; projection P=S.P; transform3 tinv=inverse(S.t); projection Q; triple orthoshift; modelview=P.T.modelview; transform3 inv; bool prc=prc(format); if(P.absolute) { Q=modelview*P; inv=inverse(modelview); } else { triple target=P.target; S.f=modelview*S.f; P=modelview*P; Q=P.copy(); if(Q.t[2][3] == -1) // PRC can't handle oblique projections Q=orthographic(P.camera,P.up,P.target,P.zoom,P.viewportshift, P.showtarget,P.center); if(P.infinity) { triple m=min3(S.f); triple M=max3(S.f); triple lambda=M-m; if(S.keepAspect || prc) { S.viewportmargin=viewportmargin((lambda.x,lambda.y)); S.width=ceil(lambda.x+2*S.viewportmargin.x); S.height=ceil(lambda.y+2*S.viewportmargin.y); } orthoshift=(-0.5(m.x+M.x),-0.5*(m.y+M.y),0); S.f=shift(orthoshift)*S.f; // Eye will be at (0,0,0) inv=inverse(modelview); } else { if(P.angle == 0) { P.angle=S.angle(P); modelview=S.T*modelview; if(S.viewportmargin.y != 0) P.angle=2*aTan(Tan(0.5*P.angle)-S.viewportmargin.y/P.target.z); } inv=inverse(modelview); Q.angle=P.angle; if(settings.verbose > 0) { if(S.adjusted) write("adjusting camera to ",tinv*inv*P.camera); target=inv*P.target; } P=S.T*P; } if(settings.verbose > 0) { if((P.center && settings.render != 0) || (!P.infinity && P.autoadjust)) write("adjusting target to ",tinv*target); } } light Light=modelview*light; if(prefix == "") prefix=outprefix(); bool preview=settings.render > 0 && !prconly() && !settings.v3d; if(prc || settings.v3d) { // The media9.sty package cannot handle spaces or dots in filenames. string dir=stripfile(prefix); prefix=dir+replace(stripdirectory(prefix), new string[][]{{" ","_"},{".","_"}}); if((settings.embed || nativeformat() == "pdf") && !prconly()) prefix += "+"+(string) file3.length; } else preview=false; if(preview || (!prc && settings.render != 0) || settings.v3d) { frame f=S.f; triple m,M; real zcenter; real r; if(P.absolute) { f=modelview*f; m=min3(f); M=max3(f); r=0.5*abs(M-m); zcenter=0.5*(M.z+m.z); } else { m=min3(f); M=max3(f); zcenter=P.target.z; r=P.distance(m,M); } M=(M.x,M.y,zcenter+r); m=(m.x,m.y,zcenter-r); if(P.infinity) { triple margin=(S.viewportmargin.x,S.viewportmargin.y,0); M += margin; m -= margin; } else if(M.z >= 0 && !S.pic2.empty()) abort("camera too close"); if(primitive()) format=settings.v3d ? "v3d" : settings.outformat; transform3 s=inv*shift(0,0,zcenter); shipout3(prefix,f,preview ? nativeformat() : format, S.width-defaultrender.margin,S.height-defaultrender.margin, P.infinity ? 0 : 2aTan(Tan(0.5*P.angle)*P.zoom), P.zoom,m,M,P.viewportshift,S.viewportmargin, tinv*s,s,Light.background(),Light.position, Light.diffuse,Light.specular, view && !preview); if(settings.v3d) { string content=prefix+".v3d"; F.L=Embed(content,S.width,S.height); if(!settings.inlinetex) file3.push(content); return F; } if(!preview) return F; } string image; if((preview || (prc && settings.render == 0)) && settings.embed) { image=prefix; if(settings.inlinetex) image += "_0"; image += "."+nativeformat(); if(!settings.inlinetex) file3.push(image); image=graphic(image,"hiresbb"); } if(prc) { if(P.viewportshift != 0) { if(!P.infinity) warning("offaxis", "PRC does not support off-axis projections; use pan instead of shift"); triple lambda=max3(S.f)-min3(S.f); Q.target -= (P.viewportshift.x*lambda.x/P.zoom, P.viewportshift.y*lambda.y/P.zoom,0); } real viewplanesize=0; if(P.absolute) { if(P.infinity) { S.f=modelview*S.f; triple lambda=max3(S.f)-min3(S.f); pair margin=viewportmargin((lambda.x,lambda.y)); viewplanesize=(max(lambda.x+2*margin.x,lambda.y+2*margin.y))/Q.zoom; S.f=inv*S.f; } Q=inv*Q; } else { if(P.infinity) { triple lambda=max3(S.f)-min3(S.f); pair margin=viewportmargin((lambda.x,lambda.y)); viewplanesize=(max(lambda.x+2*margin.x,lambda.y+2*margin.y))/Q.zoom; transform3 t=inv*shift(-orthoshift); Q=t*Q; S.f=t*S.f; } else { Q=inv*Q; S.f=inv*S.f; } } F.L=embed3D(prefix,label,text=image,S.f,format, S.width-2,S.height-2,options,script,light,Q,viewplanesize); } return F; } object embed(string prefix=outprefix(), string label=prefix, string text=label, picture pic, string format="", real xsize=pic.xsize, real ysize=pic.ysize, bool keepAspect=pic.keepAspect, bool view=true, string options="", string script="", light light=currentlight, projection P=currentprojection) { bool is3D=is3D(format); scene S=scene(pic,xsize,ysize,keepAspect,is3D,P); if(is3D && !(settings.xasy && format == "")) return embed(prefix,label,text,S,format,view,options,script,light); else { object F; transform T=S.pic2.scaling(xsize,ysize,keepAspect); F.f=pic.fit(scale(S.t[0][0])*T); add(F.f,S.pic2.fit()); return F; } } object embed(string prefix=outprefix(), string label=prefix, string text=label, frame f, string format="", real width=0, real height=0, bool view=true, string options="", string script="", light light=currentlight, projection P=currentprojection) { if(is3D(format)) return embed(label,text,prefix,scene(f,width,height,P),format,view,options, script,light); else { object F; F.f=f; return F; } } embed3=new object(string prefix, frame f, string format, string options, string script, light light, projection P) { return embed(prefix=prefix,f,format,options,script,light,P); }; frame embedder(object embedder(string prefix, string format), string prefix, string format, bool view, light light) { frame f; bool prc=prc(format) || settings.v3d; if(!prc && settings.render != 0 && !view) { static int previewcount=0; bool keep=prefix != ""; prefix=outprefix(prefix)+"+"+(string) previewcount; ++previewcount; format=nativeformat(); if(!keep) file3.push(prefix+"."+format); } object F=embedder(prefix,format); if(prc) label(f,F.L); else { if(settings.render == 0) { add(f,F.f); if(light.background != nullpen) box(f,light.background,Fill,above=false); } else if(!view) label(f,settings.inlinetex ? "\input{"+prefix+"}" : graphic(prefix,"hiresbb")); } return f; } currentpicture.fitter=new frame(string prefix, picture pic, string format, real xsize, real ysize, bool keepAspect, bool view, string options, string script, light light, projection P) { frame f; bool empty3=pic.empty3(); if(!empty3 || pic.queueErase3) { f=embedder(new object(string prefix, string format) { return embed(prefix=prefix,pic,format,xsize,ysize,keepAspect,view, options,script,light,P); },prefix,format,view,light); pic.queueErase3=false; } if(is3D(format) || pic.queueErase || settings.render == 0) add(f,pic.fit2(xsize,ysize,keepAspect)); return f; }; frame embedder(string prefix, frame f, string format, real width, real height, bool view, string options, string script, light light, projection P) { return embedder(new object(string prefix, string format) { return embed(prefix=prefix,f,format,width,height,view,options,script, light,P); },prefix,format,view,light); } projection[][] ThreeViewsUS={{TopView}, {FrontView,RightView}}; projection[][] SixViewsUS={{null,TopView}, {LeftView,FrontView,RightView,BackView}, {null,BottomView}}; projection[][] ThreeViewsFR={{RightView,FrontView}, {null,TopView}}; projection[][] SixViewsFR={{null,BottomView}, {RightView,FrontView,LeftView,BackView}, {null,TopView}}; projection[][] ThreeViews={{FrontView,TopView,RightView}}; projection[][] SixViews={{FrontView,TopView,RightView}, {BackView,BottomView,LeftView}}; void addViews(picture dest, picture src, projection[][] views=SixViewsUS, bool group=true, filltype filltype=NoFill) { frame[][] F=array(views.length,new frame[]); pair[][] M=array(views.length,new pair[]); pair[][] m=array(views.length,new pair[]); for(int i=0; i < views.length; ++i) { projection[] viewsi=views[i]; frame[] Fi=F[i]; pair[] Mi=M[i]; pair[] mi=m[i]; for(projection P : viewsi) { if(P != null) { frame f=src.fit(P); mi.push(min(f)); Mi.push(max(f)); Fi.push(f); } else { pair Infinity=(infinity,infinity); mi.push(Infinity); Mi.push(-Infinity); Fi.push(newframe); } } } real[] my=new real[views.length]; real[] My=new real[views.length]; int Nj=0; for(int i=0; i < views.length; ++i) { my[i]=minbound(m[i]).y; My[i]=maxbound(M[i]).y; Nj=max(Nj,views[i].length); } real[] mx=array(Nj,infinity); real[] Mx=array(Nj,-infinity); for(int i=0; i < views.length; ++i) { pair[] mi=m[i]; pair[] Mi=M[i]; for(int j=0; j < views[i].length; ++j) { mx[j]=min(mx[j],mi[j].x); Mx[j]=max(Mx[j],Mi[j].x); } } if(group) begingroup(dest); real y; for(int i=0; i < views.length; ++i) { real x; pair[] mi=m[i]; for(int j=0; j < views[i].length; ++j) { if(size(F[i][j]) != 0) add(dest,shift(x-mx[j],y+my[i])*F[i][j],filltype); x += (Mx[j]-mx[j]); } y -= (My[i]-my[i]); } if(group) endgroup(dest); } void addViews(picture src, projection[][] views=SixViewsUS, bool group=true, filltype filltype=NoFill) { addViews(currentpicture,src,views,group,filltype); } void addStereoViews(picture dest, picture src, bool group=true, filltype filltype=NoFill, real eyetoview=defaulteyetoview, bool leftright=true, projection P=currentprojection) { triple v=P.vector(); triple h=0.5*abs(v)*eyetoview*unit(cross(P.up,v)); projection leftEye=P.copy(); leftEye.camera -= h; leftEye.calculate(); projection rightEye=P.copy(); rightEye.camera += h; rightEye.calculate(); addViews(dest,src,leftright ? new projection[][] {{leftEye,rightEye}} : new projection[][] {{rightEye,leftEye}},group,filltype); } void addStereoViews(picture src, bool group=true, filltype filltype=NoFill, real eyetoview=defaulteyetoview, bool leftright=true, projection P=currentprojection) { addStereoViews(currentpicture,src,group,filltype,eyetoview,leftright,P); } // Fit an array of 3D pictures simultaneously using the sizing of picture all. frame[] fit3(string prefix="", picture[] pictures, picture all, string format="", bool view=true, string options="", string script="", light light=currentlight, projection P=currentprojection) { frame[] out; scene S=scene(all,P); triple m=all.min(S.t); triple M=all.max(S.t); out=new frame[pictures.length]; int i=0; bool reverse=settings.reverse; settings.animating=true; for(picture pic : pictures) { picture pic2; frame f=pic.fit3(S.t,pic2,S.P); if(settings.interrupt) break; add(f,pic2.fit2()); draw(f,m,nullpen); draw(f,M,nullpen); out[i]=f; ++i; } while(!settings.interrupt) { for(int i=settings.reverse ? pictures.length-1 : 0; i >= 0 && i < pictures.length && !settings.interrupt; settings.reverse ? --i : ++i) { frame f=embedder(prefix,out[i],format,S.width,S.height,view,options, script,light,S.P); if(!settings.loop) out[i]=f; } if(!settings.loop) break; } settings.animating=false; settings.interrupt=false; settings.reverse=reverse; return out; } // Fit an array of pictures simultaneously using the size of the first picture. fit=new frame[](string prefix="", picture[] pictures, string format="", bool view=true, string options="", string script="", projection P=currentprojection) { if(pictures.length == 0) return new frame[]; picture all; size(all,pictures[0]); for(picture pic : pictures) add(all,pic); return all.empty3() ? fit2(pictures,all) : fit3(prefix,pictures,all,format,view,options,script,P); }; // Add frame src to picture dest about position. void add(picture dest=currentpicture, frame src, triple position) { if(is3D(src)) { dest.add(new void(frame f, transform3 t, picture, projection) { add(f,shift(t*position)*src); },true); } else { dest.add(new void(frame, transform3 t, picture pic, projection P) { if(pic != null) { pic.add(new void(frame f, transform T) { add(f,T*shift(project(t*position,P))*src); },true); } },true); } dest.addBox(position,position,min3(src),max3(src)); } exitfcn currentexitfunction=atexit(); void exitfunction() { if(currentexitfunction != null) currentexitfunction(); if(!settings.keep) for(int i=0; i < file3.length; ++i) delete(file3[i]); file3=new string[]; } atexit(exitfunction); asymptote-3.05/base/pstoedit.asy0000644000000000000000000000054215031566105015452 0ustar rootrootpen textpen=basealign; pair align=Align; // Compatibility routines for the pstoedit (version 3.43 or later) backend. void gsave(picture pic=currentpicture) { pic.add(new void (frame f, transform) { gsave(f); },true); } void grestore(picture pic=currentpicture) { pic.add(new void (frame f, transform) { grestore(f); },true); } asymptote-3.05/base/plain_constants.asy0000644000000000000000000000717015031566105017022 0ustar rootrootrestricted int undefined=(intMax % 2 == 1) ? intMax : intMax-1; restricted real inches=72; restricted real inch=inches; restricted real cm=inches/2.54; restricted real mm=0.1cm; restricted real bp=1; // A PostScript point. restricted real pt=72.0/72.27; // A TeX pt; smaller than a PostScript bp. restricted pair I=(0,1); restricted pair right=(1,0); restricted pair left=(-1,0); restricted pair up=(0,1); restricted pair down=(0,-1); restricted pair E=(1,0); restricted pair N=(0,1); restricted pair W=(-1,0); restricted pair S=(0,-1); restricted pair NE=unit(N+E); restricted pair NW=unit(N+W); restricted pair SW=unit(S+W); restricted pair SE=unit(S+E); restricted pair ENE=unit(E+NE); restricted pair NNE=unit(N+NE); restricted pair NNW=unit(N+NW); restricted pair WNW=unit(W+NW); restricted pair WSW=unit(W+SW); restricted pair SSW=unit(S+SW); restricted pair SSE=unit(S+SE); restricted pair ESE=unit(E+SE); restricted real sqrtEpsilon=sqrt(realEpsilon); restricted pair Align=sqrtEpsilon*NE; restricted int mantissaBits=ceil(-log(realEpsilon)/log(2))+1; restricted transform identity; restricted transform zeroTransform=(0,0,0,0,0,0); int min(... int[] a) {return min(a);} int max(... int[] a) {return max(a);} real min(... real[] a) {return min(a);} real max(... real[] a) {return max(a);} bool finite(real x) { return abs(x) < infinity; } bool finite(pair z) { return abs(z.x) < infinity && abs(z.y) < infinity; } bool finite(triple v) { return abs(v.x) < infinity && abs(v.y) < infinity && abs(v.z) < infinity; } restricted file stdin=input(); restricted file stdout=output(); void none(file file) {} void endl(file file) {write(file,'\n',flush);} void newl(file file) {write(file,'\n');} void DOSendl(file file) {write(file,'\r\n',flush);} void DOSnewl(file file) {write(file,'\r\n');} void tab(file file) {write(file,'\t');} void comma(file file) {write(file,',');} using suffix=void(file); // Used by interactive write to warn that the outputted type is the resolution // of an overloaded name. void overloadedMessage(file file) { write(file,' '); endl(file); } void write(suffix suffix=endl) {suffix(stdout);} void write(file file, suffix suffix=none) {suffix(file);} path box(pair a, pair b) { return a--(b.x,a.y)--b--(a.x,b.y)--cycle; } restricted path unitsquare=box((0,0),(1,1)); restricted path unitcircle=E..N..W..S..cycle; restricted real circleprecision=0.0006; restricted transform invert=reflect((0,0),(1,0)); restricted pen defaultpen; // A type that takes on one of the values true, false, or default. struct bool3 { bool value; bool set; } void write(file file, string s="", bool3 b, suffix suffix=none) { if(b.set) write(b.value,suffix); else write("default",suffix); } void write(string s="", bool3 b, suffix suffix=endl) { write(stdout,s,b,suffix); } restricted bool3 default; bool operator cast(bool3 b) { return b.set && b.value; } bool3 operator cast(bool b) { bool3 B; B.value=b; B.set=true; return B; } bool operator == (bool3 a, bool3 b) { return a.set == b.set && (!a.set || (a.value == b.value)); } bool operator != (bool3 a, bool3 b) { return a.set != b.set || (a.set && (a.value != b.value)); } bool operator == (bool3 a, bool b) { return a.set && a.value == b; } bool operator != (bool3 a, bool b) { return !a.set || a.value != b; } bool operator == (bool a, bool3 b) { return b.set && b.value == a; } bool operator != (bool a, bool3 b) { return !b.set || b.value != a; } bool[] operator cast(bool3[] b) { return sequence(new bool(int i) {return b[i];},b.length); } bool3[] operator cast(bool[] b) { return sequence(new bool3(int i) {return b[i];},b.length); } asymptote-3.05/base/bezulate.asy0000644000000000000000000002253215031566105015435 0ustar rootroot// Bezier triangulation routines written by Orest Shardt, 2008. private real fuzz=1e-6; real duplicateFuzz=1e-3; // Work around font errors. real maxrefinements=10; private real[][] intersections(pair a, pair b, path p) { pair delta=fuzz*unit(b-a); return intersections(a-delta--b+delta,p,fuzz); } int countIntersections(path[] p, pair start, pair end) { int intersects=0; for(path q : p) intersects += intersections(start,end,q).length; return intersects; } path[][] containmentTree(path[] paths) { path[][] result; for(path g : paths) { // check if current curve contains or is contained in a group of curves int j; for(j=0; j < result.length; ++j) { path[] resultj=result[j]; int test=inside(g,resultj[0],zerowinding); if(test == 1) { // current curve contains group's toplevel curve; // replace toplevel curve with current curve resultj.insert(0,g); // check to see if any other groups are contained within this curve for(int k=j+1; k < result.length;) { if(inside(g,result[k][0],zerowinding) == 1) { resultj.append(result[k]); result.delete(k); } else ++k; } break; } else if(test == -1) { // current curve contained within group's toplevel curve resultj.push(g); break; } } // create a new group if this curve does not belong to another group if(j == result.length) result.push(new path[] {g}); } return result; } bool isDuplicate(pair a, pair b, real relSize) { return abs(a-b) <= duplicateFuzz*relSize; } path removeDuplicates(path p) { real relSize = abs(max(p)-min(p)); bool cyclic=cyclic(p); for(int i=0; i < length(p); ++i) { if(isDuplicate(point(p,i),point(p,i+1),relSize)) { p=subpath(p,0,i)&subpath(p,i+1,length(p)); --i; } } return cyclic ? p&cycle : p; } path section(path p, real t1, real t2, bool loop=false) { if(t2 < t1 || loop && t1 == t2) t2 += length(p); return subpath(p,t1,t2); } path uncycle(path p, real t) { return subpath(p,t,t+length(p)); } // returns outer paths void connect(path[] paths, path[] result, path[] patch) { path[][] tree=containmentTree(paths); for(path[] group : tree) { path outer = group[0]; group.delete(0); path[][] innerTree = containmentTree(group); path[] remainingCurves; path[] inners; for(path[] innerGroup:innerTree) { inners.push(innerGroup[0]); if(innerGroup.length>1) remainingCurves.append(innerGroup[1:]); } connect(remainingCurves,result,patch); real d=2*abs(max(outer)-min(outer)); while(inners.length > 0) { int curveIndex = 0; //pair direction=I*dir(inners[curveIndex],0,1); // Use outgoing direction //if(direction == 0) // Try a random direction // direction=expi(2pi*unitrand()); //pair start=point(inners[curveIndex],0); // find shortest distance between a node on the inner curve and a node // on the outer curve real mindist = d; int inner_i = 0; int outer_i = 0; for(int ni = 0; ni < length(inners[curveIndex]); ++ni) { for(int no = 0; no < length(outer); ++no) { real dist = abs(point(inners[curveIndex],ni)-point(outer,no)); if(dist < mindist) { inner_i = ni; outer_i = no; mindist = dist; } } } pair start=point(inners[curveIndex],inner_i); pair end = point(outer,outer_i); // find first intersection of line segment with outer curve //real[][] ints=intersections(start,start+d*direction,outer); real[][] ints=intersections(start,end,outer); assert(ints.length != 0); real endtime=ints[0][1]; // endtime is time on outer end = point(outer,endtime); // find first intersection of end--start with any inner curve real starttime=inner_i; // starttime is time on inners[curveIndex] real earliestTime=1; for(int j=0; j < inners.length; ++j) { real[][] ints=intersections(end,start,inners[j]); if(ints.length > 0 && ints[0][0] < earliestTime) { earliestTime=ints[0][0]; // time on end--start starttime=ints[0][1]; // time on inner curve curveIndex=j; } } start=point(inners[curveIndex],starttime); bool found_forward = false; real timeoffset_forward = 2; path portion_forward; path[] allCurves = {outer}; allCurves.append(inners); while(!found_forward && timeoffset_forward > fuzz) { timeoffset_forward /= 2; if(countIntersections(allCurves,start, point(outer,endtime+timeoffset_forward)) == 2) { portion_forward = subpath(outer,endtime,endtime+timeoffset_forward)--start--cycle; found_forward=true; // check if an inner curve is inside the portion for(int k = 0; found_forward && k < inners.length; ++k) { if(k!=curveIndex && inside(portion_forward,point(inners[k],0),zerowinding)) found_forward = false; } } } bool found_backward = false; real timeoffset_backward = -2; path portion_backward; while(!found_backward && timeoffset_backward < -fuzz) { timeoffset_backward /= 2; if(countIntersections(allCurves,start, point(outer,endtime+timeoffset_backward))==2) { portion_backward = subpath(outer,endtime+timeoffset_backward,endtime)--start--cycle; found_backward = true; // check if an inner curve is inside the portion for(int k = 0; found_backward && k < inners.length; ++k) { if(k!=curveIndex && inside(portion_backward,point(inners[k],0),zerowinding)) found_backward = false; } } } assert(found_forward || found_backward); real timeoffset; path portion; if(found_forward && !found_backward) { timeoffset = timeoffset_forward; portion = portion_forward; } else if(found_backward && !found_forward) { timeoffset = timeoffset_backward; portion = portion_backward; } else // assert handles case of neither found { if(timeoffset_forward > -timeoffset_backward) { timeoffset = timeoffset_forward; portion = portion_forward; } else { timeoffset = timeoffset_backward; portion = portion_backward; } } endtime=min(endtime,endtime+timeoffset); // or go from timeoffset+timeoffset_backward to timeoffset+timeoffset_forward? timeoffset=abs(timeoffset); // depends on the curves having opposite orientations path remainder=section(outer,endtime+timeoffset,endtime) --uncycle(inners[curveIndex], starttime)--cycle; inners.delete(curveIndex); outer = remainder; patch.append(portion); } result.append(outer); } } bool checkSegment(path g, pair p, pair q) { pair mid=0.5*(p+q); return intersections(p,q,g).length == 2 && inside(g,mid,zerowinding) && intersections(g,mid).length == 0; } path subdivide(path p) { path q; int l=length(p); for(int i=0; i < l; ++i) q=q&(straight(p,i) ? subpath(p,i,i+1) : subpath(p,i,i+0.5)&subpath(p,i+0.5,i+1)); return cyclic(p) ? q&cycle : q; } path[] bezulate(path[] p) { if(p.length == 1 && length(p[0]) <= 4) return p; path[] patch; path[] result; connect(p,result,patch); for(int i=0; i < result.length; ++i) { path p=result[i]; int refinements=0; if(size(p) <= 1) return p; if(!cyclic(p)) abort("path must be cyclic and nonselfintersecting."); p=removeDuplicates(p); if(length(p) > 4) { static real SIZE_STEPS=10; static real factor=1.05/SIZE_STEPS; for(int k=1; k <= SIZE_STEPS; ++k) { real L=factor*k*abs(max(p)-min(p)); for(int i=0; length(p) > 4 && i < length(p); ++i) { bool found=false; pair start=point(p,i); //look for quadrilaterals and triangles with one line, 4 | 3 curves for(int desiredSides=4; !found && desiredSides >= 3; --desiredSides) { if(desiredSides == 3 && length(p) <= 3) break; pair end; int endi=i+desiredSides-1; end=point(p,endi); found=checkSegment(p,start,end) && abs(end-start) < L; if(found) { path p1=subpath(p,endi,i+length(p))--cycle; patch.append(subpath(p,i,endi)--cycle); p=removeDuplicates(p1); i=-1; // increment will make i be 0 } } if(!found && k == SIZE_STEPS && length(p) > 4 && i == length(p)-1) { // avoid infinite recursion ++refinements; if(refinements > maxrefinements) { warning("subdivisions","too many subdivisions",position=true); } else { p=subdivide(p); i=-1; } } } } } if(length(p) <= 4) patch.append(p); } return patch; } asymptote-3.05/base/external.asy0000644000000000000000000000214015031566105015435 0ustar rootrootusepackage("hyperref"); texpreamble("\hypersetup{"+settings.hyperrefOptions+"}"); // Embed object to be run in an external window. An image file name can be // specified; if not given one will be automatically generated. string embed(string name, string text="", string options="", real width=0, real height=0, string image="") { string options; // Ignore passed options. if(image == "") { image=stripdirectory(stripextension(name))+"."+nativeformat(); convert(name+"[0]",image,nativeformat()); if(!settings.keep) { exitfcn currentexitfunction=atexit(); void exitfunction() { if(currentexitfunction != null) currentexitfunction(); delete(image); } atexit(exitfunction); } } if(width != 0) options += ", width="+(string) (width/pt)+"pt"; if(height != 0) options +=", height="+(string) (height/pt)+"pt"; return "\href{run:"+name+"}{"+graphic(image,options)+"}"; } string hyperlink(string url, string text) { return "\href{"+url+"}{"+text+"}"; } string link(string label, string text="Play") { return hyperlink("run:"+label,text); } asymptote-3.05/base/map.asy0000644000000000000000000000133015031566105014370 0ustar rootroottypedef import(Key, Value); struct keyValue { Key key; Value value; void operator init(Key key) { this.key=key; } void operator init(Key key, Value value) { this.key=key; this.value=value; } } // Map keys to values, defaulting to the value default. struct map { keyValue[] M; Value Default; void operator init(Value Default) { this.Default=Default; } bool operator < (keyValue a, keyValue b) {return a.key < b.key;} void add(Key key, Value value) { keyValue m=keyValue(key,value); M.insert(search(M,m,operator <)+1,m); } Value lookup(Key key) { int i=search(M,keyValue(key),operator <); if(i >= 0 && M[i].key == key) return M[i].value; return Default; } } asymptote-3.05/base/three_light.asy0000644000000000000000000000720715031566105016122 0ustar rootrootstruct material { pen[] p; // diffusepen,emissivepen,specularpen real opacity; real shininess; real metallic; real fresnel0; // Reflectance rate at a perfect normal angle. void operator init(pen diffusepen=black, pen emissivepen=black, pen specularpen=mediumgray, real opacity=opacity(diffusepen), real shininess=defaultshininess, real metallic=defaultmetallic, real fresnel0=defaultfresnel0) { p=new pen[] {diffusepen,emissivepen,specularpen}; this.opacity=opacity; this.shininess=shininess; this.metallic=metallic; this.fresnel0=fresnel0; } void operator init(material m) { p=copy(m.p); opacity=m.opacity; shininess=m.shininess; metallic=m.metallic; fresnel0=m.fresnel0; } pen diffuse() {return p[0];} pen emissive() {return p[1];} pen specular() {return p[2];} void diffuse(pen q) {p[0]=q;} void emissive(pen q) {p[1]=q;} void specular(pen q) {p[2]=q;} } material operator init() { return material(); } void write(file file, string s="", material x, suffix suffix=none) { write(file,s); write(file,"{"); write(file,"diffuse=",x.diffuse()); write(file,", emissive=",x.emissive()); write(file,", specular=",x.specular()); write(file,", opacity=",x.opacity); write(file,", shininess=",x.shininess); write(file,", metallic=",x.metallic); write(file,", F0=",x.fresnel0); write(file,"}",suffix); } void write(string s="", material x, suffix suffix=endl) { write(stdout,s,x,suffix); } bool operator == (material m, material n) { return all(m.p == n.p) && m.opacity == n.opacity && m.shininess == n.shininess && m.metallic == n.metallic && m.fresnel0 == n.fresnel0; } material operator cast(pen p) { return material(p); } material[] operator cast(pen[] p) { return sequence(new material(int i) {return p[i];},p.length); } pen operator ecast(material m) { return m.p.length > 0 ? m.diffuse() : nullpen; } material emissive(material m, bool colors=false) { return material(black+opacity(m.opacity),colors ? m.emissive() : m.diffuse()+m.emissive(),black,m.opacity,1); } pen color(triple normal, material m, light light, transform3 T=light.T) { triple[] position=light.position; if(invisible((pen) m)) return invisible; if(position.length == 0) return m.diffuse(); normal=unit(transpose(inverse(shiftless(T)))*normal); if(settings.twosided) normal *= sgn(normal.z); real s=m.shininess*128; real[] Diffuse=rgba(m.diffuse()); real[] Specular=rgba(m.specular()); real[] p=rgba(m.emissive()); real[] diffuse={0,0,0,0}; real[] specular={0,0,0,0}; for(int i=0; i < position.length; ++i) { triple L=position[i]; real dotproduct=abs(dot(normal,L)); diffuse += dotproduct*light.diffuse[i]; dotproduct=abs(dot(normal,unit(L+Z))); // Phong-Blinn model of specular reflection specular += dotproduct^s*light.specular[i]; } p += diffuse*Diffuse; // Apply specularfactor to partially compensate non-pixel-based rendering. p += specular*Specular*light.specularfactor; return rgb(p[0],p[1],p[2])+opacity(opacity(m.diffuse())); } light operator * (transform3 t, light light) { light light=light(light); return light; } light operator cast(triple v) {return light(v);} light Viewport=light(specularfactor=3,(0.25,-0.25,1)); light White=light(new pen[] {rgb(0.38,0.38,0.45),rgb(0.6,0.6,0.67), rgb(0.5,0.5,0.57)},specularfactor=3, new triple[] {(-2,-1.5,-0.5),(2,1.1,-2.5),(-0.5,0,2)}); light Headlamp=light(white,specular=gray(0.7), specularfactor=3,dir(42,48)); currentlight=Headlamp; light nolight; asymptote-3.05/base/roundedpath.asy0000644000000000000000000000645615031566105016146 0ustar rootroot// a function to round sharp edges of open and cyclic paths // written by stefan knorr path roundedpath(path A, real R, real S = 1) // create rounded path from path A with radius R and scale S = 1 { path RoundPath; // returned path path LocalPath; // local straight subpath path LocalCirc; // local edge circle for intersection real LocalTime; // local intersectiontime between . and .. pair LocalPair; // local point to be added to 'RoundPath' int len=length(A); // length of given path 'A' bool PathClosed=cyclic(A); // true, if given path 'A' is cyclic // initialisation: define first Point of 'RoundPath' as if (PathClosed) // ? is 'A' cyclic RoundPath=scale(S)*point(point(A,0)--point(A,1), 0.5); // centerpoint of first straight subpath of 'A' else RoundPath=scale(S)*point(A,0); // first point of 'A' // doing everything between start and end // create round paths subpath by subpath for every i-th edge for(int i=1; i < len; ++i) { // straight subpath towards i-th edge LocalPath=point(A,i-1)---point(A,i); // circle with radius 'R' around i-th edge LocalCirc=circle(point(A,i),R); // calculate intersection time between straight subpath and circle real[] t=intersect(LocalPath, LocalCirc); if(t.length > 0) { LocalTime=t[0]; // define intersectionpoint between both paths LocalPair=point(subpath(LocalPath, 0, LocalTime), 1); // add straight subpath towards i-th curvature to 'RoundPath' RoundPath=RoundPath--scale(S)*LocalPair; } // straight subpath from i-th edge to (i+1)-th edge LocalPath=point(A,i)---point(A,i+1); // calculate intersection-time between straight subpath and circle real[] t=intersect(LocalPath, LocalCirc); if(t.length > 0) { LocalTime=t[0]; // define intersectionpoint between both paths LocalPair=point(subpath(LocalPath, 0, LocalTime), 1); // add curvature near i-th edge to 'RoundPath' RoundPath=RoundPath..scale(S)*LocalPair; } } // final steps to have a correct termination if(PathClosed) { // Is 'A' cyclic? // straight subpath towards 0-th edge LocalPath=point(A,len-1)---point(A,0); // circle with radius 'R' around 0-th edge LocalCirc=circle(point(A,0),R); // calculate intersection-time between straight subpath and circle real[] t=intersect(LocalPath, LocalCirc); if(t.length > 0) { LocalTime=t[0]; // define intersectionpoint between both paths LocalPair=point(subpath(LocalPath, 0, LocalTime), 1); // add straight subpath towards 0-th curvature to 'RoundPath' RoundPath=RoundPath--scale(S)*LocalPair; } // straight subpath from 0-th edge to 1st edge LocalPath=point(A,0)---point(A,1); // calculate intersection-time between straight subpath and circle real[] t=intersect(LocalPath, LocalCirc); if(t.length > 0) { LocalTime=t[0]; // define intersectionpoint between both paths LocalPair=point(subpath(LocalPath, 0, LocalTime), 1); // add curvature near 0-th edge to 'RoundPath' and close path RoundPath=RoundPath..scale(S)*LocalPair--cycle; } } else RoundPath=RoundPath--scale(S)*point(A,len); return RoundPath; } asymptote-3.05/base/annotate.asy0000644000000000000000000000110215031566105015421 0ustar rootrootvoid annotate(picture pic=currentpicture, string title, string text, pair position) { pic.add(new void(frame f, transform t) { position=t*position; label(f,"\special{!/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse [/Rect["+(string) position.x+" 0 0 "+(string) position.y+"] /Subtype /Text /Name /Comment /Title ("+title+") /Contents ("+text+") /ANN pdfmark}"); },true); draw(pic,position,invisible); } asymptote-3.05/base/animate.asy0000644000000000000000000000005215031566105015231 0ustar rootrootusepackage("animate"); import animation; asymptote-3.05/base/plain_paths.asy0000644000000000000000000002216415031566105016125 0ustar rootrootpath nullpath; using interpolate=guide(... guide[]); // These numbers identify the side of a specifier in an operator spec or // operator curl expression: // a{out} .. {in}b restricted int JOIN_OUT=0; restricted int JOIN_IN=1; // Define a.. tension t ..b to be equivalent to // a.. tension t and t ..b // and likewise with controls. tensionSpecifier operator tension(real t, bool atLeast) { return operator tension(t,t,atLeast); } guide operator controls(pair z) { return operator controls(z,z); } guide[] operator cast(pair[] z) { return sequence(new guide(int i) {return z[i];},z.length); } path[] operator cast(pair[] z) { return sequence(new path(int i) {return z[i];},z.length); } path[] operator cast(guide[] g) { return sequence(new path(int i) {return g[i];},g.length); } guide[] operator cast(path[] g) { return sequence(new guide(int i) {return g[i];},g.length); } path[] operator cast(path p) { return new path[] {p}; } path[] operator cast(guide g) { return new path[] {(path) g}; } path[] operator ^^ (path p, path q) { return new path[] {p,q}; } path[] operator ^^ (path p, explicit path[] q) { return concat(new path[] {p},q); } path[] operator ^^ (explicit path[] p, path q) { return concat(p,new path[] {q}); } path[] operator ^^ (explicit path[] p, explicit path[] q) { return concat(p,q); } path[] operator * (transform t, explicit path[] p) { return sequence(new path(int i) {return t*p[i];},p.length); } pair[] operator * (transform t, pair[] z) { return sequence(new pair(int i) {return t*z[i];},z.length); } void write(file file, string s="", explicit path[] x, suffix suffix=none) { write(file,s); if(x.length > 0) write(file,x[0]); for(int i=1; i < x.length; ++i) { write(file,endl); write(file," ^^"); write(file,x[i]); } write(file,suffix); } void write(string s="", explicit path[] x, suffix suffix=endl) { write(stdout,s,x,suffix); } void write(file file, string s="", explicit guide[] x, suffix suffix=none) { write(file,s); if(x.length > 0) write(file,x[0]); for(int i=1; i < x.length; ++i) { write(file,endl); write(file," ^^"); write(file,x[i]); } write(file,suffix); } void write(string s="", explicit guide[] x, suffix suffix=endl) { write(stdout,s,x,suffix); } interpolate operator ..(tensionSpecifier t) { return new guide(... guide[] a) { if(a.length == 0) return nullpath; guide g=a[0]; for(int i=1; i < a.length; ++i) g=g..t..a[i]; return g; }; } interpolate operator ::=operator ..(operator tension(1,true)); interpolate operator ---=operator ..(operator tension(infinity,true)); // return an arbitrary intersection point of paths p and q pair intersectionpoint(path p, path q, real fuzz=-1) { real[] t=intersect(p,q,fuzz); if(t.length == 0) abort("paths do not intersect"); return point(p,t[0]); } // return an array containing all intersection points of the paths p and q pair[] intersectionpoints(path p, path q, real fuzz=-1) { real[][] t=intersections(p,q,fuzz); return sequence(new pair(int i) {return point(p,t[i][0]);},t.length); } pair[] intersectionpoints(explicit path[] p, explicit path[] q, real fuzz=-1) { pair[] z; for(int i=0; i < p.length; ++i) for(int j=0; j < q.length; ++j) z.append(intersectionpoints(p[i],q[j],fuzz)); return z; } struct slice { path before,after; } slice cut(path p, path knife, int n) { slice s; real[][] T=intersections(p,knife); if(T.length == 0) {s.before=p; s.after=nullpath; return s;} T.cyclic=true; real t=T[n][0]; s.before=subpath(p,0,t); s.after=subpath(p,t,length(p)); return s; } slice firstcut(path p, path knife) { return cut(p,knife,0); } slice lastcut(path p, path knife) { return cut(p,knife,-1); } pair dir(path p) { return dir(p,length(p)); } pair dir(path p, path q) { return unit(dir(p)+dir(q)); } // return the point on path p at arclength L pair arcpoint(path p, real L) { return point(p,arctime(p,L)); } // return the direction on path p at arclength L pair arcdir(path p, real L) { return dir(p,arctime(p,L)); } // return the time on path p at the relative fraction l of its arclength real reltime(path p, real l) { return arctime(p,l*arclength(p)); } // return the point on path p at the relative fraction l of its arclength pair relpoint(path p, real l) { return point(p,reltime(p,l)); } // return the direction of path p at the relative fraction l of its arclength pair reldir(path p, real l) { return dir(p,reltime(p,l)); } // return the initial point of path p pair beginpoint(path p) { return point(p,0); } // return the point on path p at half of its arclength pair midpoint(path p) { return relpoint(p,0.5); } // return the final point of path p pair endpoint(path p) { return point(p,length(p)); } path operator &(path p, cycleToken tok) { int n=length(p); if(n < 0) return nullpath; if(n == 0) return p--cycle; if(cyclic(p)) return p; return straight(p,n-1) ? subpath(p,0,n-1)--cycle : subpath(p,0,n-1)..controls postcontrol(p,n-1) and precontrol(p,n)..cycle; } // return a cyclic path enclosing a region bounded by a list of two or more // consecutively intersecting paths path buildcycle(... path[] p) { int n=p.length; if(n < 2) return nullpath; real[] ta=new real[n]; real[] tb=new real[n]; if(n == 2) { real[][] t=intersections(p[0],p[1]); if(t.length < 2) return nullpath; int k=t.length-1; ta[0]=t[0][0]; tb[0]=t[k][0]; ta[1]=t[k][1]; tb[1]=t[0][1]; } else { int j=n-1; for(int i=0; i < n; ++i) { real[][] t=intersections(p[i],p[j]); if(t.length == 0) return nullpath; ta[i]=t[0][0]; tb[j]=t[0][1]; j=i; } } pair c; for(int i=0; i < n ; ++i) c += point(p[i],ta[i]); c /= n; path G; for(int i=0; i < n ; ++i) { real Ta=ta[i]; real Tb=tb[i]; if(cyclic(p[i])) { int L=length(p[i]); real t=Tb-L; if(abs(c-point(p[i],0.5(Ta+t))) < abs(c-point(p[i],0.5(Ta+Tb)))) Tb=t; while(Tb < Ta) Tb += L; } G=G&subpath(p[i],Ta,Tb); } return G&cycle; } // return 1 if p strictly contains q, // -1 if q strictly contains p, // 0 otherwise. int inside(path p, path q, pen fillrule=currentpen) { if(intersect(p,q).length > 0) return 0; if(cyclic(p) && inside(p,point(q,0),fillrule)) return 1; if(cyclic(q) && inside(q,point(p,0),fillrule)) return -1; return 0; } // Return an arbitrary point strictly inside a cyclic path p according to // the specified fill rule. pair inside(path p, pen fillrule=currentpen) { if(!cyclic(p)) abort("path is not cyclic"); int n=length(p); for(int i=0; i < n; ++i) { pair z=point(p,i); pair dir=dir(p,i); if(dir == 0) continue; real[] T=intersections(p,z,z+I*dir); // Check midpoints of line segments formed between the // corresponding intersection points and z. for(int j=0; j < T.length; ++j) { if(T[j] != i) { pair w=point(p,T[j]); pair m=0.5*(z+w); if(interior(windingnumber(p,m),fillrule)) return m; } } } // cannot find an interior point: path is degenerate return point(p,0); } // Return all intersection times of path g with the vertical line through (x,0). real[] times(path p, real x, real fuzz=-1) { return intersections(p,(x,0),(x,1),fuzz); } // Return all intersection times of path g with the horizontal line through // (0,z.y). real[] times(path p, explicit pair z, real fuzz=-1) { return intersections(p,(0,z.y),(1,z.y),fuzz); } path randompath(int n, bool cumulate=true, interpolate join=operator ..) { guide g; pair w; for(int i=0; i <= n; ++i) { pair z=(unitrand()-0.5,unitrand()-0.5); if(cumulate) w += z; else w=z; g=join(g,w); } return g; } path[] strokepath(path g, pen p=currentpen) { path[] G=_strokepath(g,p); if(G.length == 0) return G; pair center(path g) {return 0.5*(min(g)+max(g));} pair center(path[] g) {return 0.5*(min(g)+max(g));} return shift(center(g)-center(G))*G; } real braceinnerangle=radians(60); real braceouterangle=radians(70); real bracemidangle=radians(0); real bracedefaultratio=0.14; path brace(pair a, pair b, real amplitude=bracedefaultratio*length(b-a)) { real length=length(b-a); real sign=sgn(amplitude); real hamplitude=0.5*amplitude; real hlength=0.5*length; path brace; if(abs(amplitude) < bracedefaultratio*length) { real slope=2*bracedefaultratio; real controldist=(abs(hamplitude))/slope; brace=(0,0){expi(sign*braceouterangle)}:: {expi(sign*bracemidangle)}(controldist,hamplitude):: {expi(sign*bracemidangle)}(hlength-controldist,hamplitude):: {expi(sign*braceinnerangle)}(hlength,amplitude) {expi(-sign*braceinnerangle)}:: {expi(-sign*bracemidangle)}(hlength+controldist,hamplitude):: {expi(-sign*bracemidangle)}(length-controldist,hamplitude):: {expi(-sign*braceouterangle)}(length,0); } else { brace=(0,0){expi(sign*braceouterangle)}:: {expi(sign*bracemidangle)}(0.25*length,hamplitude):: {expi(sign*braceinnerangle)}(hlength,amplitude){expi(-sign*braceinnerangle)}:: {expi(-sign*bracemidangle)}(0.75*length,hamplitude):: {expi(-sign*braceouterangle)}(length,0); } return shift(a)*rotate(degrees(b-a,warn=false))*brace; } asymptote-3.05/base/plain_markers.asy0000644000000000000000000002615115031566105016452 0ustar rootrootreal legendlinelength=50; real legendhskip=1.2; real legendvskip=legendhskip; real legendmargin=10; real legendmaxrelativewidth=1; // Return a unit polygon with n sides. path polygon(int n) { guide g; for(int i=0; i < n; ++i) g=g--expi(2pi*(i+0.5)/n-0.5*pi); return g--cycle; } // Return a unit n-point cyclic cross, with optional inner radius r and // end rounding. path cross(int n, bool round=true, real r=0) { assert(n > 1); real r=min(r,1); real theta=pi/n; real s=sin(theta); real c=cos(theta); pair z=(c,s); transform mirror=reflect(0,z); pair p1=(r,0); path elementary; if(round) { pair e1=p1+z*max(1-r*(s+c),0); elementary=p1--e1..(c,s)..mirror*e1--mirror*p1; } else { pair p2=p1+z*(max(sqrt(1-(r*s)^2)-r*c),0); elementary=p1--p2--mirror*p2--mirror*p1; } guide g; real step=360/n; for(int i=0; i < n; ++i) g=g--rotate(i*step-90)*elementary; return g--cycle; } path plus=rotate(45)*cross(4); path diamond=rotate(45)*polygon(4); using markroutine=void(picture pic=currentpicture, frame f, path g); // On picture pic, add frame f about every node of path g. void marknodes(picture pic=currentpicture, frame f, path g) { for(int i=0; i < size(g); ++i) add(pic,f,point(g,i)); } // On picture pic, add n copies of frame f to path g, evenly spaced in // arclength. // If rotated=true, the frame will be rotated by the angle of the tangent // to the path at the points where the frame will be added. // If centered is true, center the frames within n evenly spaced arclength // intervals. markroutine markuniform(bool centered=false, int n, bool rotated=false) { return new void(picture pic=currentpicture, frame f, path g) { if(n <= 0) return; void add(real x) { real t=reltime(g,x); add(pic,rotated ? rotate(degrees(dir(g,t)))*f : f,point(g,t)); } if(centered) { real width=1/n; for(int i=0; i < n; ++i) add((i+0.5)*width); } else { if(n == 1) add(0.5); else { real width=1/(n-1); for(int i=0; i < n; ++i) add(i*width); } } }; } // On picture pic, add frame f at points z(t) for n evenly spaced values of // t in [a,b]. markroutine markuniform(pair z(real t), real a, real b, int n) { return new void(picture pic=currentpicture, frame f, path) { real width=b-a; for(int i=0; i <= n; ++i) { add(pic,f,z(a+i/n*width)); } }; } struct marker { frame f; bool above=true; markroutine markroutine=marknodes; void mark(picture pic=currentpicture, path g) { markroutine(pic,f,g); }; } marker marker(frame f=newframe, markroutine markroutine=marknodes, bool above=true) { marker m=new marker; m.f=f; m.above=above; m.markroutine=markroutine; return m; } marker marker(path[] g, markroutine markroutine=marknodes, pen p=currentpen, filltype filltype=NoFill, bool above=true) { frame f; filltype.fill(f,g,p); return marker(f,markroutine,above); } // On picture pic, add path g with opacity thinning about every node. marker markthin(path g, pen p=currentpen, real thin(real fraction)=new real(real x) {return x^2;}, filltype filltype=NoFill) { marker M=new marker; M.above=true; filltype.fill(M.f,g,p); real factor=1/abs(size(M.f)); M.markroutine=new void(picture pic=currentpicture, frame, path G) { transform t=pic.calculateTransform(); int n=size(G); for(int i=0; i < n; ++i) { pair z=point(G,i); frame f; real fraction=1; if(i > 0) fraction=min(fraction,abs(t*(z-point(G,i-1)))*factor); if(i < n-1) fraction=min(fraction,abs(t*(point(G,i+1)-z))*factor); filltype.fill(f,g,p+opacity(thin(fraction))); add(pic,f,point(G,i)); } }; return M; } marker nomarker; real circlescale=0.85; path[] MarkPath={scale(circlescale)*unitcircle, polygon(3),polygon(4),polygon(5),invert*polygon(3), cross(4),cross(6),diamond,plus}; int[] MarkFillable={0,1,2,3,4,7}; marker[] Mark=sequence(new marker(int i) {return marker(MarkPath[i]);}, MarkPath.length); marker[] MarkFill=sequence(new marker(int i) { return marker(MarkPath[MarkFillable[i]],Fill); },MarkFillable.length); marker Mark(int n) { n=n % (Mark.length+MarkFill.length); if(n < Mark.length) return Mark[n]; else return MarkFill[n-Mark.length]; } picture legenditem(Legend legenditem, real linelength) { picture pic; pair z1=(0,0); pair z2=z1+(linelength,0); if(!legenditem.above && !empty(legenditem.mark)) marknodes(pic,legenditem.mark,interp(z1,z2,0.5)); if(linelength > 0) Draw(pic,z1--z2,legenditem.p); if(legenditem.above && !empty(legenditem.mark)) marknodes(pic,legenditem.mark,interp(z1,z2,0.5)); if(legenditem.plabel != invisible) label(pic,legenditem.label,z2,E,legenditem.plabel); else label(pic,legenditem.label,z2,E,currentpen); return pic; } picture legend(Legend[] Legend, int perline=1, real linelength, real hskip, real vskip, real maxwidth=0, real maxheight=0, bool hstretch=false, bool vstretch=false) { if(maxwidth <= 0) hstretch=false; if(maxheight <= 0) vstretch=false; if(Legend.length <= 1) vstretch=hstretch=false; picture inset; size(inset,0,0,IgnoreAspect); if(Legend.length == 0) return inset; // Check for legend entries with lines: bool bLineEntriesAvailable=false; for(int i=0; i < Legend.length; ++i) { if(Legend[i].p != invisible) { bLineEntriesAvailable=true; break; } } real markersize=0; for(int i=0; i < Legend.length; ++i) markersize=max(markersize,size(Legend[i].mark).x); // If no legend has a line, set the line length to zero if(!bLineEntriesAvailable) linelength=0; linelength=max(linelength,markersize*(linelength == 0 ? 1 : 2)); // Get the maximum dimensions per legend entry; // calculate line length for a one-line legend real heightPerEntry=0; real widthPerEntry=0; real totalwidth=0; for(int i=0; i < Legend.length; ++i) { picture pic=legenditem(Legend[i],linelength); pair lambda=size(pic); heightPerEntry=max(heightPerEntry,lambda.y); widthPerEntry=max(widthPerEntry,lambda.x); if(Legend[i].p != invisible) totalwidth += lambda.x; else { // Legend entries without leading line need less space in one-line legends picture pic=legenditem(Legend[i],0); totalwidth += size(pic).x; } } // Does everything fit into one line? if(((perline < 1) || (perline >= Legend.length)) && (maxwidth >= totalwidth+(totalwidth/Legend.length)* (Legend.length-1)*(hskip-1))) { // One-line legend real currPosX=0; real itemDistance; if(hstretch) itemDistance=(maxwidth-totalwidth)/(Legend.length-1); else itemDistance=(totalwidth/Legend.length)*(hskip-1); for(int i=0; i < Legend.length; ++i) { picture pic=legenditem(Legend[i], Legend[i].p == invisible ? 0 : linelength); add(inset,pic,(currPosX,0)); currPosX += size(pic).x+itemDistance; } } else { // multiline legend if(maxwidth > 0) { int maxperline=floor(maxwidth/(widthPerEntry*hskip)); if((perline < 1) || (perline > maxperline)) perline=maxperline; } if(perline < 1) // This means: maxwidth < widthPerEntry perline=1; if(perline <= 1) hstretch=false; if(hstretch) hskip=(maxwidth/widthPerEntry-perline)/(perline-1)+1; if(vstretch) { int rows=ceil(Legend.length/perline); vskip=(maxheight/heightPerEntry-rows)/(rows-1)+1; } if(hstretch && (perline == 1)) { Draw(inset,(0,0)--(maxwidth,0),invisible()); for(int i=0; i < Legend.length; ++i) add(inset,legenditem(Legend[i],linelength), (0.5*(maxwidth-widthPerEntry), -quotient(i,perline)*heightPerEntry*vskip)); } else for(int i=0; i < Legend.length; ++i) add(inset,legenditem(Legend[i],linelength), ((i%perline)*widthPerEntry*hskip, -quotient(i,perline)*heightPerEntry*vskip)); } return inset; } frame legend(picture pic=currentpicture, int perline=1, real xmargin=legendmargin, real ymargin=xmargin, real linelength=legendlinelength, real hskip=legendhskip, real vskip=legendvskip, real maxwidth=perline == 0 ? legendmaxrelativewidth*size(pic).x : 0, real maxheight=0, bool hstretch=false, bool vstretch=false, pen p=currentpen) { frame F; if(pic.legend.length == 0) return F; F=legend(pic.legend,perline,linelength,hskip,vskip, max(maxwidth-2xmargin,0), max(maxheight-2ymargin,0), hstretch,vstretch).fit(); box(F,xmargin,ymargin,p); return F; } pair[] pairs(real[] x, real[] y) { if(x.length != y.length) abort("arrays have different lengths"); return sequence(new pair(int i) {return (x[i],y[i]);},x.length); } filltype dotfilltype=Fill; void dot(frame f, pair z, pen p=currentpen, filltype filltype=dotfilltype) { if(filltype == Fill) draw(f,z,dotsize(p)+p); else { real s=0.5*(dotsize(p)-linewidth(p)); if(s <= 0) return; path g=shift(z)*scale(s)*unitcircle; begingroup(f); filltype.fill(f,g,p); draw(f,g,p); endgroup(f); } } void dot(picture pic=currentpicture, pair z, pen p=currentpen, filltype filltype=dotfilltype) { pic.add(new void(frame f, transform t) { dot(f,t*z,p,filltype); },true); pic.addPoint(z,dotsize(p)+p); } void dot(picture pic=currentpicture, Label L, pair z, align align=NoAlign, string format=defaultformat, pen p=currentpen, filltype filltype=dotfilltype) { Label L=L.copy(); L.position(z); if(L.s == "") { if(format == "") format=defaultformat; L.s="("+format(format,z.x)+","+format(format,z.y)+")"; } L.align(align,E); L.p(p); dot(pic,z,p,filltype); add(pic,L); } void dot(picture pic=currentpicture, Label[] L=new Label[], pair[] z, align align=NoAlign, string format=defaultformat, pen p=currentpen, filltype filltype=dotfilltype) { int stop=min(L.length,z.length); for(int i=0; i < stop; ++i) dot(pic,L[i],z[i],align,format,p,filltype); for(int i=stop; i < z.length; ++i) dot(pic,z[i],p,filltype); } void dot(picture pic=currentpicture, Label[] L=new Label[], explicit path g, align align=RightSide, string format=defaultformat, pen p=currentpen, filltype filltype=dotfilltype) { int n=size(g); int stop=min(L.length,n); for(int i=0; i < stop; ++i) dot(pic,L[i],point(g,i),-sgn(align.dir.x)*I*dir(g,i),format,p,filltype); for(int i=stop; i < n; ++i) dot(pic,point(g,i),p,filltype); } void dot(picture pic=currentpicture, path[] g, pen p=currentpen, filltype filltype=dotfilltype) { for(int i=0; i < g.length; ++i) dot(pic,g[i],p,filltype); } void dot(picture pic=currentpicture, Label L, pen p=currentpen, filltype filltype=dotfilltype) { dot(pic,L,L.position,p,filltype); } // A dot in a frame. frame dotframe(pen p=currentpen, filltype filltype=dotfilltype) { frame f; dot(f,(0,0),p,filltype); return f; } frame dotframe=dotframe(); marker dot(pen p=currentpen, filltype filltype=dotfilltype) { return marker(dotframe(p,filltype)); } marker dot=dot(); asymptote-3.05/base/labelpath.asy0000644000000000000000000000133115031566105015550 0ustar rootrootusepackage("pstricks"); usepackage("pst-text"); string LeftJustified="l"; string RightJustified="r"; string Centered="c"; void labelpath(frame f, Label L, path g, string justify=Centered, pen p=currentpen) { if(latex() && !pdf()) { _labelpath(f,L.s,L.size,g,justify,(L.T.x,L.T.y+0.5linewidth(p)),p); return; } warning("labelpathlatex","labelpath requires -tex latex"); } void labelpath(picture pic=currentpicture, Label L, path g, string justify=Centered, pen p=currentpen) { pic.add(new void(frame f, transform t) { labelpath(f,L,t*g,justify,p); }); frame f; label(f,Label(L.s,L.size)); real w=size(f).y+L.T.y+0.5linewidth(p); pic.addBox(min(g),max(g),-w,w); } asymptote-3.05/base/plain_scaling.asy0000644000000000000000000001324115031566105016422 0ustar rootrootreal expansionfactor=sqrt(2); // A coordinate in "flex space." A linear combination of user and true-size // coordinates. struct coord { real user,truesize; // Build a coord. static coord build(real user, real truesize) { coord c=new coord; c.user=user; c.truesize=truesize; return c; } // Deep copy of coordinate. Users may add coords to the picture, but then // modify the struct. To prevent this from yielding unexpected results, deep // copying is used. coord copy() { return build(user, truesize); } void clip(real min, real max) { user=min(max(user,min),max); truesize=0; } } bool operator <= (coord a, coord b) { return a.user <= b.user && a.truesize <= b.truesize; } bool operator >= (coord a, coord b) { return a.user >= b.user && a.truesize >= b.truesize; } // Find the maximal elements of the input array, using the partial ordering // given. coord[] maxcoords(coord[] in, bool operator <= (coord,coord)) { // As operator <= is defined in the parameter list, it has a special // meaning in the body of the function. coord best; coord[] c; int n=in.length; if(n == 0) return c; int first=0; // Add the first coord without checking restrictions (as there are none). best=in[first]; c.push(best); static int NONE=-1; int dominator(coord x) { // This assumes it has already been checked against the best. for(int i=1; i < c.length; ++i) if(x <= c[i]) return i; return NONE; } void promote(int i) { // Swap with the top coord x=c[i]; c[i]=best; best=c[0]=x; } void addmaximal(coord x) { coord[] newc; // Check if it beats any others. for(int i=0; i < c.length; ++i) { coord y=c[i]; if(!(y <= x)) newc.push(y); } newc.push(x); c=newc; best=c[0]; } void add(coord x) { if(x <= best) return; else { int i=dominator(x); if(i == NONE) addmaximal(x); else promote(i); } } for(int i=1; i < n; ++i) add(in[i]); return c; } struct coords2 { coord[] x,y; void erase() { x.delete(); y.delete(); } // Only a shallow copy of the individual elements of x and y // is needed since, once entered, they are never modified. coords2 copy() { coords2 c=new coords2; c.x=copy(x); c.y=copy(y); return c; } void append(coords2 c) { x.append(c.x); y.append(c.y); } void push(pair user, pair truesize) { x.push(coord.build(user.x,truesize.x)); y.push(coord.build(user.y,truesize.y)); } void push(coord cx, coord cy) { x.push(cx); y.push(cy); } void push(transform t, coords2 c1, coords2 c2) { for(int i=0; i < c1.x.length; ++i) { coord cx=c1.x[i], cy=c2.y[i]; pair tinf=shiftless(t)*(0,0); pair z=t*(cx.user,cy.user); pair w=(cx.truesize,cy.truesize); w=length(w)*unit(shiftless(t)*w); coord Cx,Cy; Cx.user=z.x; Cy.user=z.y; Cx.truesize=w.x; Cy.truesize=w.y; push(Cx,Cy); } } void xclip(real min, real max) { for(int i=0; i < x.length; ++i) x[i].clip(min,max); } void yclip(real min, real max) { for(int i=0; i < y.length; ++i) y[i].clip(min,max); } } // The scaling in one dimension: x --> a*x + b struct scaling { real a,b; static scaling build(real a, real b) { scaling s=new scaling; s.a=a; s.b=b; return s; } real scale(real x) { return a*x+b; } real scale(coord c) { return scale(c.user) + c.truesize; } } // Calculate the minimum point in scaling the coords. real min(real m, scaling s, coord[] c) { for(int i=0; i < c.length; ++i) if(s.scale(c[i]) < m) m=s.scale(c[i]); return m; } // Calculate the maximum point in scaling the coords. real max(real M, scaling s, coord[] c) { for(int i=0; i < c.length; ++i) if(s.scale(c[i]) > M) M=s.scale(c[i]); return M; } /* Calculate the sizing constants for the given array and maximum size. Solve the two-variable linear programming problem using the simplex method. This problem is specialized in that the second variable, "b", does not have a non-negativity condition, and the first variable, "a", is the quantity being maximized. */ real calculateScaling(string dir, coord[] m, coord[] M, real size, bool warn=true) { from simplex2 access problem; problem p=new problem; void addMinCoord(coord c) { // (a*user + b) + truesize >= 0: p.addRestriction(c.user,1,c.truesize); } void addMaxCoord(coord c) { // (a*user + b) + truesize <= size: p.addRestriction(-c.user,-1,size-c.truesize); } for (int i=0; i < m.length; ++i) addMinCoord(m[i]); for (int i=0; i < M.length; ++i) addMaxCoord(M[i]); if(p.rows.length == 2) return 1; // Don't warn if there are no constraints int status=p.optimize(); if(status == problem.OPTIMAL) { // TODO: Could just be return a; return scaling.build(p.a(),p.b()).a; } else if(status == problem.UNBOUNDED) { if(warn) warning("unbounded",dir+" scaling in picture unbounded"); return 0; } else { if(!warn) return 1; bool userzero(coord[] coords) { for(var coord : coords) if(coord.user != 0) return false; return true; } if((userzero(m) && userzero(M)) || size >= infinity) return 1; warning("cannotfit","cannot fit picture to "+dir+"size "+(string) size +"...enlarging..."); return calculateScaling(dir,m,M,expansionfactor*size,warn); } } real calculateScaling(string dir, coord[] coords, real size, bool warn=true) { coord[] m=maxcoords(coords,operator >=); coord[] M=maxcoords(coords,operator <=); return calculateScaling(dir, m, M, size, warn); } asymptote-3.05/base/three_margins.asy0000644000000000000000000000467415031566105016460 0ustar rootrootstruct marginT3 { path3 g; real begin,end; }; typedef marginT3 margin3(path3, pen); path3 trim(path3 g, real begin, real end) { real a=arctime(g,begin); real b=arctime(g,arclength(g)-end); return a <= b ? subpath(g,a,b) : point(g,a); } margin3 operator +(margin3 ma, margin3 mb) { return new marginT3(path3 g, pen p) { marginT3 margin; real ba=ma(g,p).begin < 0 ? 0 : ma(g,p).begin; real bb=mb(g,p).begin < 0 ? 0 : mb(g,p).begin; real ea=ma(g,p).end < 0 ? 0 : ma(g,p).end; real eb=mb(g,p).end < 0 ? 0 : mb(g,p).end; margin.begin=ba+bb; margin.end=ea+eb; margin.g=trim(g,margin.begin,margin.end); return margin; }; } margin3 NoMargin3() { return new marginT3(path3 g, pen) { marginT3 margin; margin.begin=margin.end=0; margin.g=g; return margin; }; } margin3 Margin3(real begin, real end) { return new marginT3(path3 g, pen p) { marginT3 margin; real factor=labelmargin(p); real w=0.5*linewidth(p); margin.begin=begin*factor-w; margin.end=end*factor-w; margin.g=trim(g,margin.begin,margin.end); return margin; }; } margin3 PenMargin3(real begin, real end) { return new marginT3(path3 g, pen p) { marginT3 margin; real factor=linewidth(p); margin.begin=begin*factor; margin.end=end*factor; margin.g=trim(g,margin.begin,margin.end); return margin; }; } margin3 DotMargin3(real begin, real end) { return new marginT3(path3 g, pen p) { marginT3 margin; real margindot(real x) {return x > 0 ? dotfactor*x : x;} real factor=linewidth(p); margin.begin=margindot(begin)*factor; margin.end=margindot(end)*factor; margin.g=trim(g,margin.begin,margin.end); return margin; }; } margin3 TrueMargin3(real begin, real end) { return new marginT3(path3 g, pen p) { marginT3 margin; margin.begin=begin; margin.end=end; margin.g=trim(g,begin,end); return margin; }; } margin3 NoMargin3=NoMargin3(), BeginMargin3=Margin3(1,0), Margin3=Margin3(0,1), EndMargin3=Margin3, Margins3=Margin3(1,1), BeginPenMargin3=PenMargin3(0.5,-0.5), BeginPenMargin2=PenMargin3(1.0,-0.5), PenMargin3=PenMargin3(-0.5,0.5), PenMargin2=PenMargin3(-0.5,1.0), EndPenMargin3=PenMargin3, EndPenMargin2=PenMargin2, PenMargins3=PenMargin3(0.5,0.5), PenMargins2=PenMargin3(1.0,1.0), BeginDotMargin3=DotMargin3(0.5,-0.5), DotMargin3=DotMargin3(-0.5,0.5), EndDotMargin3=DotMargin3, DotMargins3=DotMargin3(0.5,0.5); asymptote-3.05/base/patterns.asy0000644000000000000000000000513115031566105015456 0ustar rootroot// Create a tiling named name from picture pic // with optional left-bottom margin lb and right-top margin rt. frame tiling(string name, picture pic, pair lb=0, pair rt=0) { frame tiling; frame f=pic.fit(identity()); pair pmin=min(f)-lb; pair pmax=max(f)+rt; string s="%.6f"; postscript(tiling,"<< /PaintType 1 /PatternType 1 /TilingType 1 /BBox ["+format(s,pmin.x,"C")+" "+format(s,pmin.y,"C")+" "+ format(s,pmax.x,"C")+" "+format(s,pmax.y,"C")+"] /XStep "+format(s,pmax.x-pmin.x,"C")+" /YStep "+format(s,pmax.y-pmin.y,"C")+" /PaintProc {pop"); gsave(tiling); add(tiling,f); grestore(tiling); postscript(tiling,"} >> matrix makepattern /"+name+" exch def"); return tiling; } // Add to frame preamble a tiling name constructed from picture pic // with optional left-bottom margin lb and right-top margin rt. void add(string name, picture pic, pair lb=0, pair rt=0) { add(currentpatterns,tiling(name,pic,lb,rt)); } picture tile(real Hx=5mm, real Hy=0, pen p=currentpen, filltype filltype=NoFill) { picture tiling; if(Hy == 0) Hy=Hx; path tile=box((0,0),(Hx,Hy)); tiling.add(new void (frame f, transform t) { filltype.fill(f,t*tile,p); }); clip(tiling,tile); return tiling; } picture checker(real Hx=5mm, real Hy=0, pen p=currentpen) { picture tiling; if(Hy == 0) Hy=Hx; path tile=box((0,0),(Hx,Hy)); fill(tiling,tile,p); fill(tiling,shift(Hx,Hy)*tile,p); clip(tiling,box((0,0),(2Hx,2Hy))); return tiling; } picture brick(real Hx=5mm, real Hy=0, pen p=currentpen) { picture tiling; if(Hy == 0) Hy=Hx/2; path tile=box((0,0),(Hx,Hy)); draw(tiling,tile,p); draw(tiling,(Hx/2,Hy)--(Hx/2,2Hy),p); draw(tiling,(0,2Hy)--(Hx,2Hy),p); clip(tiling,box((0,0),(Hx,2Hy))); return tiling; } real hatchepsilon=1e-4; picture hatch(real H=5mm, pair dir=NE, pen p=currentpen) { picture tiling; real theta=angle(dir); real s=sin(theta); real c=cos(theta); if(abs(s) <= hatchepsilon) { path g=(0,0)--(H,0); draw(tiling,g,p); draw(tiling,shift(0,H)*g,p); clip(tiling,scale(H)*unitsquare); } else if(abs(c) <= hatchepsilon) { path g=(0,0)--(0,H); draw(tiling,g,p); draw(tiling,shift(H,0)*g,p); clip(tiling,scale(H)*unitsquare); } else { real h=H/s; real y=H/c; path g=(0,0)--(h,y); draw(tiling,g,p); draw(tiling,shift(-h/2,y/2)*g,p); draw(tiling,shift(h/2,-y/2)*g,p); clip(tiling,box((0,0),(h,y))); } return tiling; } picture crosshatch(real H=5mm, pen p=currentpen) { picture tiling; add(tiling,hatch(H,p)); add(tiling,shift(H*sqrt(2))*rotate(90)*hatch(H,p)); return tiling; } asymptote-3.05/base/binarytree.asy0000644000000000000000000002661015031566105015767 0ustar rootroot/* ********************************************************************** * binarytree: An Asymptote module to draw binary trees * * * * Copyright(C) 2006 * * Tobias Langner tobias[at]langner[dot]nightlabs[dot]de * * * * Modified by John Bowman * * * * Condensed mode: * * Copyright(C) 2012 * * Gerasimos Dimitriadis dimeg [at] intracom [dot] gr * * * ************************************************************************ * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 3 of the License, or(at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, * * Boston, MA 02110-1301 USA * * * * Or get it online: * * http: //www.gnu.org/copyleft/lesser.html * * * ***********************************************************************/ // default values real minDistDefault=0.2cm; real nodeMarginDefault=0.1cm; // structure to represent nodes in a binary tree struct binarytreeNode { int key; binarytreeNode left; binarytreeNode right; binarytreeNode parent; bool spans_calculated=false; int left_span,total_left_span; int right_span,total_right_span; void update_spans(); // Get the horizontal span of the tree consisting of the current // node plus the whole subtree that is rooted at the right child // (condensed mode) int getTotalRightSpan() { if(spans_calculated == false) { update_spans(); } return total_right_span; } // Get the horizontal span of the tree consisting of the current // node plus the whole subtree that is rooted at the left child // (condensed mode) int getTotalLeftSpan() { if(spans_calculated == false) { update_spans(); } return total_left_span; } // Get the horizontal distance between this node and its right child // (condensed mode) int getRightSpan() { if(spans_calculated == false) { update_spans(); } return right_span; } // Get the horizontal distance between this node and its left child // (condensed mode) int getLeftSpan() { if(spans_calculated == false) { update_spans(); } return left_span; } // Update all span figures for this node. // condensed mode) update_spans=new void() { if(spans_calculated == true) return; left_span=0; total_left_span=0; right_span=0; total_right_span=0; if(left != null) { left_span=left.getTotalRightSpan()+1; total_left_span=left_span+left.getTotalLeftSpan(); } if(right != null) { right_span=right.getTotalLeftSpan()+1; total_right_span=right_span+right.getTotalRightSpan(); } spans_calculated=true; }; // set the left child of this node void setLeft(binarytreeNode left) { this.left=left; this.left.parent=this; } // set the right child of this node void setRight(binarytreeNode right) { this.right=right; this.right.parent=this; } // return a boolean indicating whether this node is the root bool isRoot() { return parent == null; } // return the level of the subtree rooted at this node. int getLevel() { if(isRoot()) return 1; else return parent.getLevel()+1; } // set the children of this binarytreeNode void setChildren(binarytreeNode left, binarytreeNode right) { setLeft(left); setRight(right); } // create a new binarytreeNode with key static binarytreeNode binarytreeNode(int key) { binarytreeNode toReturn=new binarytreeNode; toReturn.key=key; return toReturn; } // returns the height of the subtree rooted at this node. int getHeight() { if(left == null && right == null) return 1; if(left == null) return right.getHeight()+1; if(right == null) return left.getHeight()+1; return max(left.getHeight(),right.getHeight())+1; } } binarytreeNode operator init() {return null;} // "constructor" for binarytreeNode binarytreeNode binarytreeNode(int key)=binarytreeNode.binarytreeNode; // draw the tree rooted at the given at the given position , with // =the height of the containing tree, // =the minimal horizontal distance of two nodes at the lowest level, // =the vertical distance between two levels, // =the diameter of one node. object draw(picture pic=currentpicture, binarytreeNode node, pair pos, int height, real minDist, real levelDist, real nodeDiameter, pen p=currentpen, bool condensed=false) { Label label=Label(math((string) node.key),pos); binarytreeNode left=node.left; binarytreeNode right=node.right; // return the distance for two nodes at the given when the // containing tree has height // and the minimal distance between two nodes is . real getDistance(int level, int height, real minDist) { return(nodeDiameter+minDist)*2^(height-level); } // return the horiontal distance between node and its left child // (condensed mode) real getLeftDistance(binarytreeNode n) { return(nodeDiameter+minDist) *(real)n.getLeftSpan() * 0.5; } // return the horiontal distance between node and its right child // (condensed mode) real getRightDistance(binarytreeNode n) { return(nodeDiameter+minDist) *(real)n.getRightSpan() * 0.5; } real dist=getDistance(node.getLevel(),height,minDist)/2; // draw the connection between the two nodes at the given positions // by calculating the connection points and drawing the corresponding // arrow. void deferredDrawNodeConnection(pair parentPos, pair childPos) { pic.add(new void(frame f, transform t) { pair start,end; // calculate connection path transform T=shift(nodeDiameter/2*unit(t*childPos-t*parentPos)); path arr=(T*t*parentPos)--(inverse(T)*t*childPos); draw(f,PenMargin(arr,p).g,p,Arrow(5)); }); pic.addPoint(parentPos); pic.addPoint(childPos); } if(left != null) { pair childPos; if(condensed == false) { childPos=pos-(0,levelDist)-(dist/2,0); } else { childPos=pos-(0,levelDist)-((real)getLeftDistance(node),0); } draw(pic,left,childPos,height,minDist,levelDist,nodeDiameter,p,condensed); deferredDrawNodeConnection(pos,childPos); } if(right != null) { pair childPos; if(condensed == false) { childPos=pos-(0,levelDist)+(dist/2,0); } else { childPos=pos-(0,levelDist)+((real)getRightDistance(node),0); } draw(pic,right,childPos,height,minDist,levelDist,nodeDiameter,p,condensed); deferredDrawNodeConnection(pos,childPos); } picture obj; draw(obj,circle((0,0),nodeDiameter/2),p); label(obj,label,(0,0),p); add(pic,obj,pos); return label; } struct key { int n; bool active; } key key(int n, bool active=true) {key k; k.n=n; k.active=active; return k;} key operator cast(int n) {return key(n);} int operator cast(key k) {return k.n;} int[] operator cast(key[] k) { int[] I; for(int i=0; i < k.length; ++i) I[i]=k[i].n; return I; } key nil=key(0,false); // structure to represent a binary tree. struct binarytree { binarytreeNode root; int[] keys; // add the given to the tree by searching for its place and // inserting it there. void addKey(int key) { binarytreeNode newNode=binarytreeNode(key); if(root == null) { root=newNode; keys.push(key); return; } binarytreeNode n=root; while(n != null) { if(key < n.key) { if(n.left != null) n=n.left; else { n.setLeft(newNode); keys.push(key); return; } } else if(key > n.key) { if(n.right != null) n=n.right; else { n.setRight(newNode); keys.push(key); return; } } } } // return the height of the tree int getHeight() { if(root == null) return 0; else return root.getHeight(); } // add all given keys to the tree sequentially void addSearchKeys(int[] keys) { for(int i=0; i < keys.length; ++i) { int key=keys[i]; // Ignore duplicate keys if(find(this.keys == key) == -1) addKey(key); } } binarytreeNode build(key[] keys, int[] ind) { if(ind[0] >= keys.length) return null; key k=keys[ind[0]]; ++ind[0]; if(!k.active) return null; binarytreeNode bt=binarytreeNode(k); binarytreeNode left=build(keys,ind); binarytreeNode right=build(keys,ind); bt.left=left; bt.right=right; if(left != null) left.parent=bt; if(right != null) right.parent=bt; return bt; } void addKeys(key[] keys) { int[] ind={0}; root=build(keys,ind); this.keys=keys; } // return all key in the tree int[] getKeys() { return keys; } } binarytree searchtree(...int[] keys) { binarytree bt; bt.addSearchKeys(keys); return bt; } binarytree binarytree(...key[] keys) { binarytree bt; bt.addKeys(keys); return bt; } // draw the given binary tree. void draw(picture pic=currentpicture, binarytree tree, real minDist=minDistDefault, real nodeMargin=nodeMarginDefault, pen p=currentpen, bool condensed=false) { int[] keys=tree.getKeys(); // calculate the node diameter so that all keys fit into it frame f; for(int i=0; i < keys.length; ++i) label(f,math(string(keys[i])),p); real nodeDiameter=abs(max(f)-min(f))+2*nodeMargin; real levelDist=nodeDiameter*1.8; draw(pic,tree.root,(0,0),tree.getHeight(),minDist,levelDist,nodeDiameter,p, condensed); } asymptote-3.05/base/trembling.asy0000644000000000000000000001323515031566105015605 0ustar rootroot// Copyright(c) 2008, Philippe Ivaldi. // Simplified by John Bowman 02Feb2011 // http: //www.piprime.fr/ // trembling.asy: handwriting package for the software Asymptote. // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or //(at your option) any later version. // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // COMMENTARY: // THANKS: // BUGS: // magnetic points are experimental... // CODE: real magneticRadius=1; // unit is bp in postscript coordinates. real trembleFuzz(){return min(1e-3,magneticRadius/10);} real trembleAngle=4, trembleFrequency=0.5, trembleRandom=2; struct tremble { static real test=5; real angle,frequency,random,fuzz; pair[] single(pair[] P) { pair[] op; bool allow; for(int i=0; i < P.length-1; ++i) { allow=true; for(int j=i+1; j < P.length; ++j) { if(abs(P[i]-P[j]) < magneticRadius) { allow=false; break; } } if(allow) op.push(P[i]); } if(P.length > 0) op.push(P[P.length-1]); return op; } real atime(pair m, path g, real fuzz=trembleFuzz()) {// Return the time of the point on path g nearest to m, within fuzz. if(length(g) == 0) return 0.0; real[] t=intersect(m,g,fuzz); if(t.length > 0) return t[1]; real ot; static real eps=sqrt(realEpsilon); real abmax=abs(max(g)-m), abmin=abs(min(g)-m); real initr=abs(m-midpoint(g)); real maxR=2*max(abmax,abmin), step=eps, r=initr; real shx=1e-4; transform T=shift(m); path ig; if(t.length > 0) ot=t[1]; real rm=0, rM=r; while(rM-rm > eps) { r=(rm+rM)/2; t=intersect(T*scale(r)*unitcircle,g,fuzz); if(t.length <= 0) { rm=r; } else { rM=r; ot=t[1]; } } return ot; } path addnode(path g, real t) {// Add a node to 'g' at point(g,t). real l=length(g); real rt=t % 1; if(l == 0 || (t > l && !cyclic(g)) || rt == 0) return g; if(cyclic(g)) t=t % l; int t0=floor(t); int t1=t0+1; pair z0=point(g,t0), z1=point(g,t1), c0=postcontrol(g,t0), c1=precontrol(g,t1), m0=(1-rt)*z0+rt*c0, m1=(1-rt)*c0+rt*c1, m2=(1-rt)*c1+rt*z1, m3=(1-rt)*m0+rt*m1, m4=(1-rt)*m1+rt*m2; guide og=subpath(g,0,t0)..controls m0 and m3..point(g,t); if(cyclic(g)) { if(t1 < l) og=og..controls m4 and m2..subpath(g,t1,l)&cycle; else og=og..controls m4 and m2..cycle; } else og=og..controls m4 and m2..subpath(g,t1,l); return og; } path addnodes(path g, real fuzz=trembleFuzz()...pair[] P) { pair[] P=single(P); if(length(g) == 0 || P.length == 0 || magneticRadius <= 0) return g; path og=g; for(pair tp: P) { real t=atime(tp,og,fuzz); real d=abs(tp-point(og,t)); if(d < magneticRadius) og=addnode(og,t); } return og; } path addnodes(path g, int n) {// Add 'n' nodes between each node of 'g'. real l=length(g); if(n == 0 || l == 0) return g; path og=g; int np=0; for(int i=0; i < l; ++i) { real step=1/(n+1); for(int j=0; j < n; ++j) { og=addnode(og,i*(n+1)+j+step); step=1/(n-j); } } return og; } void operator init(real angle=trembleAngle, real frequency=trembleFrequency, real random=trembleRandom, real fuzz=trembleFuzz()) { this.angle=angle; this.frequency=frequency; this.random=random; this.fuzz=fuzz; } path deform(path g...pair[] magneticPoints) { /* Return g as it was handwriting. The postcontrols and precontrols of the nodes of g will be rotated by an angle proportional to 'angle'(in degrees). If frequency < 1, floor(1/frequency) nodes will be added to g to increase the control points. If frequency>= 1, one point for floor(frequency) will be used to deform the path. 'random' controls the randomized coefficient which will be multiplied by 'angle'. random is 0 means don't use randomized coefficient; The higher 'random' is, the more the trembling is randomized. */ if(length(g) == 0) return g; g=addnodes(g,fuzz*abs(max(g)-min(g))...magneticPoints); path tg=g; frequency=abs(frequency); int f=abs(floor(1/frequency)-1); tg=addnodes(tg,f); int frequency=floor(frequency); int tf=(frequency == 0) ? 1 : frequency; int l=length(tg); guide og=point(tg,0); random=abs(random); int rsgn(real x){ int d2=floor(100*x)-10*floor(10*x); if(d2 == 0) return 1; return 2 % d2 == 0 ? 1 : -1; } real randf() { real or; if(random != 0) { if(1 % tf != 0) or=0; else { real ur=unitrand(); or=rsgn(ur)*angle*(1+ur^(1/random)); } } else or=rsgn(unitrand())*1.5*angle; return or; } real first=randf(); for(int i=1; i <= l; ++i) { pair P=point(tg,i); real a=randf(); pair post=rotate(a,point(tg,i-1))*postcontrol(tg,i-1); pair pre=rotate((a+randf())/2,P)*precontrol(tg,i); if(i == l && (cyclic(tg))) og=og..controls post and pre..cycle; else og=og..controls post and pre..P; } return og; } } asymptote-3.05/base/tube.asy0000644000000000000000000001160015031566105014553 0ustar rootroot// Author: Philippe Ivaldi // http://www.piprime.fr/ // Based on this paper: // http://www.cs.hku.hk/research/techreps/document/TR-2007-07.pdf // Note: the additional rotation for a cyclic smooth spine curve is not // yet properly determined. // TODO: Implement variational principles for RMF with boundary conditions: // minimum total angular speed OR minimum total squared angular speed import three; real tubegranularity=1e-7; void render(path3 s, real r, void f(path3, real)) { void Split(triple z0, triple c0, triple c1, triple z1, real t0=0, real t1=1, int depth=mantissaBits) { if(depth > 0) { real S=straightness(z0,c0,c1,z1); if(S > max(tubegranularity*max(abs(z0),abs(c0),abs(c1),abs(z1),r))) { --depth; triple m0=0.5*(z0+c0); triple m1=0.5*(c0+c1); triple m2=0.5*(c1+z1); triple m3=0.5*(m0+m1); triple m4=0.5*(m1+m2); triple m5=0.5*(m3+m4); real tm=0.5*(t0+t1); Split(z0,m0,m3,m5,t0,tm,depth); Split(m5,m4,m2,z1,tm,t1,depth); return; } } f(z0..controls c0 and c1..z1,t0); } Split(point(s,0),postcontrol(s,0),precontrol(s,1),point(s,1)); } // A 3D version of roundedpath(path, real). path3 roundedpath(path3 A, real r) { // Author of this routine: Jens Schwaiger guide3 rounded; triple before, after, indir, outdir; int len=length(A); bool cyclic=cyclic(A); if(len < 2) {return A;}; if(cyclic) {rounded=point(point(A,0)--point(A,1),r);} else {rounded=point(A,0);} for(int i=1; i < len; i=i+1) { before=point(point(A,i)--point(A,i-1),r); after=point(point(A,i)--point(A,i+1),r); indir=dir(point(A,i-1)--point(A,i),1); outdir=dir(point(A,i)--point(A,i+1),1); rounded=rounded--before{indir}..{outdir}after; } if(cyclic) { before=point(point(A,0)--point(A,len-1),r); indir=dir(point(A,len-1)--point(A,0),1); outdir=dir(point(A,0)--point(A,1),1); rounded=rounded--before{indir}..{outdir}cycle; } else rounded=rounded--point(A,len); return rounded; } real[] sample(path3 g, real r, real relstep=0) { real[] t; int n=length(g); if(relstep <= 0) { for(int i=0; i < n; ++i) render(subpath(g,i,i+1),r,new void(path3, real s) {t.push(i+s);}); t.push(n); } else { int nb=ceil(1/relstep); relstep=n/nb; for(int i=0; i <= nb; ++i) t.push(i*relstep); } return t; } real degrees(rmf a, rmf b) { real d=degrees(acos1(dot(a.r,b.r))); real dt=dot(cross(a.r,b.r),a.t); d=dt > 0 ? d : 360-d; return d%360; } restricted int coloredNodes=1; restricted int coloredSegments=2; struct coloredpath { path p; pen[] pens(real); bool usepens=false; int colortype=coloredSegments; void operator init(path p, pen[] pens=new pen[] {currentpen}, int colortype=coloredSegments) { this.p=p; this.pens=new pen[] (real t) {return pens;}; this.usepens=true; this.colortype=colortype; } void operator init(path p, pen[] pens(real), int colortype=coloredSegments) { this.p=p; this.pens=pens; this.usepens=true; this.colortype=colortype; } void operator init(path p, pen pen(real)) { this.p=p; this.pens=new pen[] (real t) {return new pen[] {pen(t)};}; this.usepens=true; this.colortype=coloredSegments; } } coloredpath operator cast(path p) { coloredpath cp=coloredpath(p); cp.usepens=false; return cp; } coloredpath operator cast(guide p) { return coloredpath(p); } private surface surface(rmf[] R, real[] t, coloredpath cp, transform T(real), bool cyclic) { path g=cp.p; int l=length(g); bool[] planar; for(int i=0; i < l; ++i) planar[i]=straight(g,i); surface s; path3 sec=path3(T(t[0]/l)*g); real adjust=0; if(cyclic) adjust=-degrees(R[0],R[R.length-1])/(R.length-1); path3 sec1=shift(R[0].p)*transform3(R[0].r,R[0].s,R[0].t)*sec, sec2; for(int i=1; i < R.length; ++i) { sec=path3(T(t[i]/l)*g); sec2=shift(R[i].p)*transform3(R[i].r,cross(R[i].t,R[i].r),R[i].t)* rotate(i*adjust,Z)*sec; for(int j=0; j < l; ++j) { surface st=surface(subpath(sec1,j,j+1)--subpath(sec2,j+1,j)--cycle, planar=planar[j]); if(cp.usepens) { pen[] tp1=cp.pens(t[i-1]/l), tp2=cp.pens(t[i]/l); tp1.cyclic=true; tp2.cyclic=true; if(cp.colortype == coloredSegments) { st.colors(new pen[][] {{tp1[j],tp1[j],tp2[j],tp2[j]}}); } else { st.colors(new pen[][] {{tp1[j],tp1[j+1],tp2[j+1],tp2[j]}}); } } s.append(st); } sec1=sec2; } return s; } surface tube(path3 g, coloredpath section, transform T(real)=new transform(real t) {return identity();}, real corner=1, real relstep=0) { pair M=max(section.p), m=min(section.p); real[] t=sample(g,max(M.x-m.x,M.y-m.y)/max(realEpsilon,abs(corner)), min(abs(relstep),1)); bool cyclic=cyclic(g); t.cyclic=cyclic; return surface(rmf(g,t),t,section,T,cyclic); } asymptote-3.05/base/animation.asy0000644000000000000000000001215515031566105015601 0ustar rootroot/***** * animation.asy * Andy Hammerlindl and John Bowman 2005/11/06 * * Produce GIF, inline PDF, or other animations. *****/ // animation delay is in milliseconds real animationdelay=50; typedef frame enclosure(frame); frame NoBox(frame f) { return f; } enclosure BBox(real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill) { return new frame(frame f) { box(f,xmargin,ymargin,p,filltype,above=false); return f; }; } struct animation { picture[] pictures; string[] files; int index; string prefix; bool global; // If true, use a global scaling for all frames; this requires // extra memory since the actual shipout is deferred until all frames have // been generated. void operator init(string prefix="", bool global=true) { prefix=replace(stripdirectory(outprefix(prefix))," ","_"); this.prefix=prefix; this.global=global; } string basename(string prefix=stripextension(prefix)) { return "_"+prefix; } string name(string prefix, int index) { return stripextension(prefix)+"+"+string(index); } private string nextname() { string name=basename(name(prefix,index)); ++index; return name; } void shipout(string name=nextname(), frame f) { string format=nativeformat(); plain.shipout(name,f,format=format,view=false); files.push(name+"."+format); } void add(picture pic=currentpicture, enclosure enclosure=NoBox) { if(global) { ++index; pictures.push(pic.copy()); } else this.shipout(enclosure(pic.fit())); } void purge(bool keep=settings.keep) { if(!keep) { for(int i=0; i < files.length; ++i) delete(files[i]); } } int merge(int loops=0, real delay=animationdelay, string format="gif", string options="", bool keep=settings.keep) { string args="-loop " +(string) loops+" -delay "+(string)(delay/10); for(int i=0; i < files.length; ++i) args += " "+files[i]; args += " -alpha Off -dispose Background "+options; int rc=convert(args,prefix+"."+format,format=format); this.purge(keep); if(rc == 0) animate(file=prefix+"."+format); else abort("merge failed"); return rc; } void glmovie(string prefix=prefix, projection P=currentprojection) { if(!view() || settings.render == 0 || settings.outformat == "html") return; fit(prefix,pictures,view=true,P); } // Export all frames with the same scaling. void export(string prefix=prefix, enclosure enclosure=NoBox, bool multipage=false, bool view=false, projection P=currentprojection) { if(pictures.length == 0) return; if(!global) multipage=false; bool inlinetex=settings.inlinetex; if(multipage) settings.inlinetex=false; frame multi; frame[] fits=fit(prefix,pictures,view=false,P); for(int i=0; i < fits.length; ++i) { string s=name(prefix,i); if(multipage) { add(multi,enclosure(fits[i])); newpage(multi); files.push(s+"."+nativeformat()); } else { if(pictures[i].empty3() || settings.render <= 0) this.shipout(s,enclosure(fits[i])); else // 3D frames files.push(s+"."+nativeformat()); } } if(multipage) { plain.shipout(prefix,multi,view=view); settings.inlinetex=inlinetex; } } string load(int frames, real delay=animationdelay, string options="", bool multipage=false) { if(!global) multipage=false; string s="\animategraphics["+options+"]{"+format("%.18f",1000/delay,"C")+ "}{"+basename(); if(!multipage) s += "+"; s += "}{0}{"+string(frames-1)+"}"; return s; } bool pdflatex() { return latex() && pdf(); } string pdf(enclosure enclosure=NoBox, real delay=animationdelay, string options="", bool keep=settings.keep, bool multipage=true) { settings.twice=true; if(settings.inlinetex) multipage=true; if(!global) multipage=false; if(!pdflatex()) abort("inline pdf animations require -tex pdflatex or -tex xelatex"); if(settings.outformat != "") settings.outformat="pdf"; string filename=basename(); string pdfname=filename+".pdf"; if(global) export(filename,enclosure,multipage=multipage); if(!keep) { exitfcn currentexitfunction=atexit(); void exitfunction() { if(currentexitfunction != null) currentexitfunction(); if(multipage || !settings.inlinetex) this.purge(); if(multipage && !settings.inlinetex) delete(pdfname); } atexit(exitfunction); } if(!multipage) delete(pdfname); return load(index,delay,options,multipage); } int movie(enclosure enclosure=NoBox, int loops=0, real delay=animationdelay, string format=settings.outformat == "" ? "gif" : settings.outformat, string options="", bool keep=settings.keep) { if(global) { if(format == "pdf") { export(enclosure,multipage=true,view=true); return 0; } export(enclosure); } return merge(loops,delay,format,options,keep); } } animation operator init() { animation a=animation(); return a; } asymptote-3.05/base/asy-mode.el0000644000000000000000000021454315031566105015151 0ustar rootroot;;; asy-mode.el --- Major mode for editing Asymptote source code. ;; Copyright (C) 2006-8 ;; Author: Philippe IVALDI 20 August 2006 ;; Maintainer: John Bowman ;; URL: https://github.com/vectorgraphics/asymptote ;; Version: 1.6 ;; Keywords: language, mode ;;; License: ;; This program is free software ; you can redistribute it and/or modify ;; it under the terms of the GNU Lesser General Public License as published by ;; the Free Software Foundation ; either version 3 of the License, or ;; (at your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, but ;; WITHOUT ANY WARRANTY ; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; Lesser General Public License for more details. ;; ;; You should have received a copy of the GNU Lesser General Public License ;; along with this program ; if not, write to the Free Software ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ;;; Commentary ;; Major mode for editing Asymptote source code. ;; INSTALLATION: ;; Place this file (asy-mode.el) and asy-keywords.el in your Emacs load path. ;; Then choose ONE of the following installation methods: ;; * Method 1: ;; Copy and uncomment the following lines to your .emacs initialization file: ;;(autoload 'asy-mode "asy-mode.el" "Asymptote major mode." t) ;;(autoload 'lasy-mode "asy-mode.el" "hybrid Asymptote/Latex major mode." t) ;;(autoload 'asy-insinuate-latex "asy-mode.el" "Asymptote insinuate LaTeX." t) ;;(add-to-list 'auto-mode-alist '("\\.asy$" . asy-mode)) ;; * Method 2: ;; Copy and uncomment the following line to your .emacs initialization file: ;;(require 'asy-mode) ;; Notes: ;; ;; For full functionality the two-mode-mode package should also be installed ;; (http://www.dedasys.com/freesoftware/files/two-mode-mode.el). ;; ;; See also paragraph II of the documentation below to automate asy-insinuate-latex. ;;; Code: (defvar asy-mode-version "1.6") ;;;###autoload (define-derived-mode asy-mode objc-mode "Asymptote" "Emacs mode for editing Asymptote source code. For full functionality the `two-mode-mode' package should also be installed (http://www.dedasys.com/freesoftware/files/two-mode-mode.el). I. This package provides two modes: 1- asy-mode: All the files with the extension '.asy' are edited in this mode, which provides the following features: * Syntax color highlighting; * Compiling and viewing current buffer with the key binding C-c C-c; * Moving cursor to the error by pressing the key F4. * Showing the available function prototypes for the command at the cursor with the key binding C-c ? * Compiling and viewing a TeX document linked with the current buffer (usually a document that includes the output picture). To link a Tex document try 'M-x asy-set-master-tex' follow by C-Return (see descriptions further of the key binding C-Return, C-S-Return, M-Return, M-S-Return etc within 2- lasy-mode) 2- lasy-mode Editing a TeX file that contains Asymptote code is facilitated with the hybrid mode 'lasy-mode'. Toggle lasy-mode with M-x lasy-mode. In this hybrid mode the major mode is LaTeX when the cursor is in LaTeX code and becomes asy-mode when the cursor is between '\\begin{asy}' and '\\end{asy}'. All the features of asy-mode are provided and the key binding C-c C-c of asy-mode compiles and views only the code of the picture where the cursor is. Note that some keys binding are added to the LaTeX-mode-map in lasy-mode if the value of the variable lasy-extra-key is t (the default) . * C-return: compile (if the buffer/file is modified) and view the PostScript output with sequence [latex->[asy->latex]->dvips]->PSviewer * M-return: same with pdf output and with the sequence [pdflatex->[asy->pdflatex]]->PDFviewer * C-M-return: same with pdf output and with the sequence [latex->[asy->latex]->dvips->ps2pdf]->PSviewer * Add the Shift key to the sequence of keys to compile even if the file is not modified. II. To add a menu bar in current 'latex-mode' buffer and activate hot keys, use 'M-x asy-insinuate-latex '. You can automate this feature for all the 'latex-mode' buffers by inserting the five following lines in your .emacs initialization file: (eval-after-load \"latex\" '(progn ;; Add here your personal features for 'latex-mode': (asy-insinuate-latex t) ;; Asymptote globally insinuates Latex. )) You can access this help within Emacs by the key binding C-h f asy-mode BUGS: This package has been tested in: * Linux Debian Etch - GNU Emacs 22.0.50.1 - GNU Emacs 21.4.1 (only basic errors management and basic font-lock features within lasy-mode are supported) * WindowsXP - GNU Emacs 22.0.990.1 (i386-mingw-nt5.1.2600) This package seems to work with XEmacs 21.4 but not all the features are available (in particular syntax highlighting). Report bugs to https://github.com/vectorgraphics/asymptote/issues Some variables can be customized: M-x customize-group asymptote ." (setq c++-font-lock-extra-types (cons "true" c++-font-lock-extra-types))) (require 'font-lock) (require 'cc-mode) (require 'cl-lib) ;; Common Lisp extensions for Emacs (require 'compile) (require 'wid-edit) ;;;###autoload (add-to-list 'auto-mode-alist '("\\.asy$" . asy-mode)) (defvar running-xemacs-p (featurep 'xemacs)) (defvar running-unix-p (not (string-match "windows-nt\\|ms-dos" (symbol-name system-type)))) (when running-xemacs-p (defalias 'turn-on-font-lock-if-enabled 'ignore) (defalias 'line-number-at-pos 'line-number) (defvar temporary-file-directory (temp-directory)) (defun replace-regexp-in-string (regexp rep string) (replace-in-string string regexp rep)) ) (when (or (< emacs-major-version 22) running-xemacs-p) ;; Add regexp for parsing the compilation errors of asy (add-to-list 'compilation-error-regexp-alist '("\\(.*?.asy\\): \\(.*?\\)\\.\\(.*?\\):" 1 2 3))) (when (< emacs-major-version 22) (defun line-number-at-pos (&optional pos) "Return (narrowed) buffer line number at position POS. If POS is nil, use current buffer location. Counting starts at (point-min), so the value refers to the contents of the accessible portion of the buffer." (let ((opoint (or pos (point))) start) (save-excursion (goto-char (point-min)) (setq start (point)) (goto-char opoint) (forward-line 0) (1+ (count-lines start (point))))))) (defcustom lasy-extra-key t "* If on, the folowing binding keys are added in lasy-mode : (define-key lasy-mode-map (kbd \"\") 'lasy-view-ps) (define-key lasy-mode-map (kbd \"\") 'asy-master-tex-view-ps-f) (define-key lasy-mode-map (kbd \"\") 'lasy-view-pdf-via-pdflatex) (define-key lasy-mode-map (kbd \"\") 'asy-master-tex-view-pdflatex-f) (define-key lasy-mode-map (kbd \"\") 'lasy-view-pdf-via-ps2pdf) (define-key lasy-mode-map (kbd \"\") 'asy-master-tex-view-ps2pdf-f) If you also want this feature in pure latex-mode, you can set this variable to `nil' and add these lines in your .emacs: (require 'asy-mode) (eval-after-load \"latex\" '(progn (define-key LaTeX-mode-map (kbd \"\") 'lasy-view-ps) (define-key LaTeX-mode-map (kbd \"\") 'asy-master-tex-view-ps-f) (define-key LaTeX-mode-map (kbd \"\") 'lasy-view-pdf-via-pdflatex) (define-key LaTeX-mode-map (kbd \"\") 'asy-master-tex-view-pdflatex-f) (define-key LaTeX-mode-map (kbd \"\") 'lasy-view-pdf-via-ps2pdf) (define-key LaTeX-mode-map (kbd \"\") 'asy-master-tex-view-ps2pdf-f)))" :type 'boolean :group 'asymptote) (defcustom asy-compilation-buffer 'none " 'visible means keep compilation buffer visible ; 'available means keep compilation buffer available in other buffer but not visible; 'none means delete compilation buffer automatically after a *successful* compilation. 'never means don't open any window or buffer attached to the compilation process. If the value is 'never': * Emacs is suspended until the child program returns; * the management of errors is poorer than with other value; * the compilation doesn't modify your current window configuration." :type '(choice (const visible) (const available) (const none) (const never)) :group 'asymptote) (defcustom lasy-ask-about-temp-compilation-buffer t "* If t, ask before visiting a temporary buffer of compilation." :type 'boolean :group 'asymptote) (defcustom lasy-compilation-inline-auto-detection nil "* If t, lasy-mode detects automatically if the option 'inline' is passed to asymptote.sty. In case of 'inline' option, the compilation of a figure separately of the document is processed by rebuilding the preamble and compiling it as a file '.tex' containing only this picture. If nil (the default), the compilation of a figure separately of the document is processed by building a file '.asy', without the features of the LaTeX preamble." :type 'boolean :group 'asymptote) (defcustom asy-command-location "" "* If not in the path, you can put here the name of the directory containing Asy's binary files. this variable must end in /." :type 'directory :group 'asymptote) (defcustom asy-command "asy -V" "* Command invoked to compile a Asymptote file. You can define the location of this command with the variable `asy-command-location'." :type 'string :group 'asymptote) (defcustom lasy-command "asy" "* Command invoked to compile a Asymptote file generated compiling a .tex file. You can define the location of this command with the variable `asy-command-location'." :type 'string :group 'asymptote) (defcustom lasy-latex-command "latex -halt-on-error" "* Command invoked to compile a .tex file with LaTeX." :type 'string :group 'asymptote) (defcustom lasy-pdflatex-command "pdflatex -halt-on-error" "* Command invoked to compile a .tex file with pdflaTex." :type 'string :group 'asymptote) (defcustom lasy-dvips-pre-pdf-command "dvips -Ppdf" "* Command invoked to convert a .dvi file to a temporary .ps file in order to generate a final .pdf file." :type 'string :group 'asymptote) (defcustom lasy-dvips-command "dvips -q" "* Command invoked to convert a .dvi file to a final .ps file." :type 'string :group 'asymptote) (defcustom lasy-ps2pdf-command "ps2pdf14" "* Command invoked to convert a .dvi file to .ps file." :type 'string :group 'asymptote) (defcustom asy-temp-dir temporary-file-directory "*The name of a directory for Asy's temporary files. Such files are generated by functions like `asy-compile' when lasy-mode is enable." :type 'directory :group 'asymptote) (defcustom ps-view-command (if running-unix-p "gv" "") "Command to view a PostScript file generated by compiling a tex file within lasy-mode. This variable is not used when running the Windows OS. See `asy-open-file'." :type 'string :group 'asymptote) (defcustom pdf-view-command (if running-unix-p "xpdf" "") "Command to view a pdf file generated by compiling a tex file within lasy-mode. This variable is not used when running the Windows OS. See `asy-open-file'." :type 'string :group 'asymptote) (defvar asy-TeX-master-file nil "TeX file associate with current asymptote code. This variable must be modified only using the function 'asy-set-master-tex by M-x asy-set-master-tex .") (make-variable-buffer-local 'asy-TeX-master-file) (defvar lasy-compile-tex nil "* Internal use. t if LaTeX compilation come from latex-mode.") (when (fboundp 'font-lock-add-keywords) (if (< max-specpdl-size 2000) (setq max-specpdl-size 2000)) (defun asy-add-function-keywords (function-keywords face-name) (let* ((keyword-list (mapcar #'(lambda (x) (symbol-name x)) function-keywords)) (keyword-regexp (concat "\\<\\(" (regexp-opt keyword-list) "\\)("))) (font-lock-add-keywords 'asy-mode `((,keyword-regexp 1 ',face-name))))) (defun asy-add-variable-keywords (function-keywords face-name) (let* ((keyword-list (mapcar #'(lambda (x) (symbol-name x)) function-keywords)) (keyword-regexp (concat "\\<[0-9]*\\(" (regexp-opt keyword-list) "\\)\\(?:[^(a-zA-Z]\\|\\'\\)"))) (font-lock-add-keywords 'asy-mode `((,keyword-regexp 1 ',face-name))))) ;; External definitions of keywords: ;; asy-function-name and asy-variable-name (if (locate-library "asy-keywords.el") (load "asy-keywords.el") (progn ;; Use dummy keyword definitions if asy-keywords.el is not found: (defvar asy-keyword-name nil) (defvar asy-type-name nil) (defvar asy-function-name nil) (defvar asy-variable-name nil))) (defcustom asy-extra-type-name '() "Extra user type names highlighted with 'font-lock-type-face" :type '(repeat symbol) :group 'asymptote) (defcustom asy-extra-function-name '() "Extra user function names highlighted with 'font-lock-function-name-face" :type '(repeat symbol) :group 'asymptote) (defcustom asy-extra-variable-name '() "Extra user variable names highlighted with 'font-lock-constant-face" :type '(repeat symbol) :group 'asymptote) (asy-add-variable-keywords asy-keyword-name 'font-lock-builtin-face) (asy-add-variable-keywords (nconc asy-type-name asy-extra-type-name) 'font-lock-type-face) (asy-add-function-keywords (nconc asy-function-name asy-extra-function-name) 'font-lock-function-name-face) (asy-add-variable-keywords (nconc asy-variable-name asy-extra-variable-name) 'font-lock-constant-face) (defface asy-environment-face `((t (:underline t :inverse-video t))) "Face used to highlighting the keywords '\\begin{asy}' and '\\end{asy}' within lasy-mode." :group 'asymptote) (font-lock-add-keywords 'asy-mode '(("\\\\begin{asy}.*" . 'asy-environment-face) ("\\\\end{asy}" . 'asy-environment-face))) (defface asy-link-face ;; widget-field-face `((t (:underline t))) "Face used to highlighting the links." :group 'asymptote) (font-lock-add-keywords 'asy-mode '(("\\[.*?\\.asy\\]" . 'asy-link-face))) ) (setq buffers-menu-max-size nil) (setq mode-name "Asymptote") (if running-xemacs-p (defvar asy-menu '("Asy" ["Toggle lasy-mode" lasy-mode :active (and (featurep 'two-mode-mode) two-mode-bool)] ["Compile/View" asy-compile t] ["Go to error" asy-goto-error t] ["Describe command" asy-show-function-at-point t]"--" ("Master TeX file" ["Set/Change value" (asy-set-master-tex) :active (not (and (boundp two-mode-bool) two-mode-bool))] ["Erase value" (asy-unset-master-tex) :active (not (and (boundp two-mode-bool) two-mode-bool))] ("Compile OR View" ["PS" asy-master-tex-view-ps :active t] ["PDF (pdflatex)" asy-master-tex-view-pdflatex :active t] ["PDF (ps2pdf)" asy-master-tex-view-ps2pdf :active t]) ("Compile AND View" ["PS" asy-master-tex-view-ps-f :active t] ["PDF (pdflatex)" asy-master-tex-view-pdflatex-f :active t] ["PDF (ps2pdf)" asy-master-tex-view-ps2pdf-f :active t])) ["Asymptote insinuates globally LaTeX" asy-insinuate-latex-globally :active (not asy-insinuate-latex-globally-p)]"--" ("Debugger Buffer" ["Visible" (setq asy-compilation-buffer 'visible) :style radio :selected (eq asy-compilation-buffer 'visible) :active t] ["Available" (setq asy-compilation-buffer 'available) :style radio :selected (eq asy-compilation-buffer 'available) :active t] ["None" (setq asy-compilation-buffer 'none) :style radio :selected (eq asy-compilation-buffer 'none) :active t] ["Never" (setq asy-compilation-buffer 'never) :style radio :selected (eq asy-compilation-buffer 'never) :active t]) ("Compilation Options" :included (and (featurep 'two-mode-mode) two-mode-bool) ["Enable Automatic Detection of Option" (setq lasy-compilation-inline-auto-detection t) :style radio :selected lasy-compilation-inline-auto-detection :active t] ["Disable Automatic Detection of Option" (setq lasy-compilation-inline-auto-detection nil) :style radio :selected (not lasy-compilation-inline-auto-detection) :active t]) ["Customize" (customize-group "asymptote") :active t] ["Help" (describe-function 'asy-mode) :active t] )) (defvar asy-menu '("Asy" ["Toggle Lasy-Mode" lasy-mode :visible (and (featurep 'two-mode-mode) two-mode-bool)] ["Compile/View" asy-compile t] ["Go to Error" asy-goto-error t] ["Describe Command" asy-show-function-at-point t]"--" ("Master TeX File" ["Set/Change Value" (asy-set-master-tex) :active (not (and (boundp two-mode-bool) two-mode-bool)) :key-sequence nil] ["Erase Value" (asy-unset-master-tex) :active (not (and (boundp two-mode-bool) two-mode-bool)) :key-sequence nil] ("Compile or View" ["PS" asy-master-tex-view-ps :active t] ["PDF (pdflatex)" asy-master-tex-view-pdflatex :active t] ["PDF (ps2pdf)" asy-master-tex-view-ps2pdf :active t]) ("Compile and View" ["PS" asy-master-tex-view-ps-f :active t] ["PDF (pdflatex)" asy-master-tex-view-pdflatex-f :active t] ["PDF (ps2pdf)" asy-master-tex-view-ps2pdf-f :active t])) ["Asymptote Insinuates Globally LaTeX" asy-insinuate-latex-globally :active (not asy-insinuate-latex-globally-p)]"--" ("Debugger Buffer" ["Visible" (setq asy-compilation-buffer 'visible) :style radio :selected (eq asy-compilation-buffer 'visible) :active t :key-sequence nil] ["Available" (setq asy-compilation-buffer 'available) :style radio :selected (eq asy-compilation-buffer 'available) :active t :key-sequence nil] ["None" (setq asy-compilation-buffer 'none) :style radio :selected (eq asy-compilation-buffer 'none) :active t :key-sequence nil] ["Never" (setq asy-compilation-buffer 'never) :style radio :selected (eq asy-compilation-buffer 'never) :active t :key-sequence nil]) ("Compilation Options" :visible (and (featurep 'two-mode-mode) two-mode-bool) ["Enable Automatic Detection of Option" (setq lasy-compilation-inline-auto-detection t) :style radio :selected lasy-compilation-inline-auto-detection :active t :key-sequence nil] ["Disable Automatic Detection of Option" (setq lasy-compilation-inline-auto-detection nil) :style radio :selected (not lasy-compilation-inline-auto-detection) :active t :key-sequence nil]) ["Customize" (customize-group "asymptote") :active t :key-sequence nil] ["Help" (describe-function 'asy-mode) :active t :key-sequence nil] ))) (easy-menu-define asy-mode-menu asy-mode-map "Asymptote Mode Commands" asy-menu) ;; On the hook for XEmacs only. (if running-xemacs-p (add-hook 'asy-mode-hook (lambda () (and (eq major-mode 'asy-mode) (easy-menu-add asy-mode-menu asy-mode-map))))) (defun asy-protect-file-name(Filename) (concat "\"" Filename "\"")) (defun asy-get-temp-file-name(&optional noext) "Get a temp file name for printing." (if running-xemacs-p (concat (make-temp-name asy-temp-dir) (if noext "" ".asy")) (concat (make-temp-file (expand-file-name "asy" asy-temp-dir)) (if noext "" ".asy")))) (defun asy-log-filename() (concat buffer-file-name ".log")) (defun asy-compile() "Compile Asymptote code." (interactive) (if (and (boundp two-mode-bool) two-mode-bool) (lasy-compile) ;; compile asy code in a TeX file. (progn ;; compile asy code in a asy file. (let* ((buffer-base-name (file-name-sans-extension (file-name-nondirectory buffer-file-name))) (asy-compile-command (concat asy-command-location asy-command (if (eq asy-compilation-buffer 'never) " " " -wait ") (asy-protect-file-name buffer-base-name)))) (if (buffer-modified-p) (save-buffer)) (message "%s" asy-compile-command) (asy-internal-compile asy-compile-command t t))))) (defun asy-error-message(&optional P) (let ((asy-last-error (asy-log-field-string (asy-log-filename) 0))) (if (and asy-last-error (not (string= asy-last-error ""))) (message (concat asy-last-error (if P "\nPress F4 to go to error" ""))) (when (and (boundp two-mode-bool) two-mode-bool lasy-run-tex (not (zerop asy-last-compilation-code))) (message "The LaTeX code may be incorrect."))))) (defun asy-log-field-string(Filename Field) "Return field of first line of file filename. Fields are defined as 'field1: field2.field3:field4' . Field=0 <-> all fields" (let ((view-inhibit-help-message t)) (with-temp-buffer (progn (insert-file Filename) (beginning-of-buffer) (if (re-search-forward "^\\(.*?\\): \\(.*?\\)\\.\\(.*?\\):\\(.*\\)$" (point-max) t) (match-string Field) nil))))) (defun asy-next-error(arg reset) (if (> emacs-major-version 21) (next-error arg reset) (next-error arg))) (defun lasy-ask-visit-tem-compilation-buffer() "* Ask before visiting a temporary compilation buffer depending the value of `lasy-ask-about-temp-compilation-buffer'." (if lasy-ask-about-temp-compilation-buffer (y-or-n-p "Visit temporary buffer of compilation ? ") t)) (defun lasy-place-cursor-to-error(Filename li co) (save-excursion (with-temp-buffer (insert-file-contents (if running-unix-p Filename (replace-regexp-in-string "//" ":/" (replace-regexp-in-string "/cygdrive/" "" Filename)))) ;; Not right, ;;;maybe take a look at the code of compilation-find-file (beginning-of-buffer) (next-line (1- (string-to-number li))) (setq line-err (buffer-substring-no-properties (progn (beginning-of-line) (point)) (progn (end-of-line) (point)))))) (beginning-of-buffer) (search-forward line-err) (beginning-of-line) (forward-char (1- (string-to-number co)))) (defun asy-goto-error(&optional arg reset) "Go to point of last error within asy/lasy-mode." (interactive "P") (if (or (eq asy-compilation-buffer 'never) (and (boundp two-mode-bool) two-mode-bool)) (let* ((log-file (asy-log-filename)) (li_ (asy-log-field-string log-file 2)) (co_ (asy-log-field-string log-file 3))) (if (and (boundp two-mode-bool) two-mode-bool) ;; Within Lasy-mode (progn ;; lasy-mode need the compilation of file.tex ;; the error can be in Tex commands or in Asymptote commands (if (eq asy-compilation-buffer 'never) ;; Find error in the log file. (if li_ ;; Asy error found in the log-file (progn (lasy-place-cursor-to-error (asy-log-field-string log-file 1) li_ co_) (asy-error-message)) (message "There is an error in your LaTeX code...")) (if (or running-xemacs-p (< emacs-major-version 22)) (when (lasy-ask-visit-tem-compilation-buffer) (next-error arg)) (let ((msg)) ;; Find error in the compilation buffer (save-excursion (set-buffer (next-error-find-buffer)) (when reset (setq compilation-current-error nil)) (let* ((columns compilation-error-screen-columns) (last 1) (loc (compilation-next-error (or arg 1) nil (or compilation-current-error compilation-messages-start (point-min)))) (end-loc (nth 2 loc)) (marker (point-marker))) (setq compilation-current-error (point-marker) overlay-arrow-position (if (bolp) compilation-current-error (copy-marker (line-beginning-position))) loc (car loc))) (if (re-search-forward "^\\(.*?\\): \\(.*?\\)\\.\\(.*?\\):\\(.*\\)$" (point-max) t) (progn (setq msg (match-string 0) log-file (match-string 1) li_ (match-string 2) co_ (match-string 3))) (error "Not other errors."))) (lasy-place-cursor-to-error log-file li_ co_) (message msg))))) (if li_ ;;Pure asy-mode and compilation with shell-command (progn (goto-line (string-to-number li_)) (forward-char (1- (string-to-number co_))) (asy-error-message)) (progn (message "No error."))))) (asy-next-error arg reset))) (defun asy-grep (Regexp) "Internal function used by asymptote." (let ((Strout "") (case-fold-search-asy case-fold-search)) (progn (beginning-of-buffer) (setq case-fold-search nil) (while (re-search-forward Regexp (point-max) t) (setq Strout (concat Strout (match-string 0) "\n\n"))) (setq case-fold-search case-fold-search-asy) (if (string= Strout "") "No match.\n" Strout)))) (defun asy-widget-open-file-at-pos (widget &optional event) "" (kill-buffer (current-buffer)) (find-file (widget-get widget :follow-link)) (goto-line (string-to-number (widget-get widget :value)))) (defun asy-show-function-at-point() "Show the Asymptote definitions of the command at point." (interactive) (save-excursion (let ((cWord (current-word)) (cWindow (selected-window))) (switch-to-buffer-other-window "*asy-help*") (fundamental-mode) (setq default-directory "/") (if (> emacs-major-version 21) (call-process-shell-command (concat asy-command-location "asy -l --where") nil t nil) (insert (shell-command-to-string "asy -l --where"))) (let ((rHelp (asy-grep (concat "^.*\\b" cWord "(\\(.\\)*?$"))) (tag)(file)(line)) (erase-buffer) (insert rHelp) (beginning-of-buffer) (while (re-search-forward "\\(.*\\): \\([0-9]*\\)\\.\\([0-9]*\\)" (point-max) t) (setq file (match-string 1) line (match-string 2) tag (file-name-nondirectory file)) (widget-create `(file-link :tag ,tag :follow-link ,file :value ,line :action asy-widget-open-file-at-pos )))) (beginning-of-buffer) (while (re-search-forward "\\(.*: [0-9]*\\.[0-9]*\\)" (point-max) t) (replace-match "")) (asy-mode) (use-local-map widget-keymap) (widget-setup) (goto-char (point-min)) (select-window cWindow)))) (add-hook 'asy-mode-hook (lambda () (c-set-style "gnu"); (c-set-offset (quote topmost-intro-cont) 0 nil) (make-local-variable 'c-label-minimum-indentation) (setq c-label-minimum-indentation 0) (when (fboundp 'flyspell-mode) (flyspell-mode -1)) (turn-on-font-lock) (column-number-mode t) )) ;;;###autoload (defun lasy-mode ()) ;;; ************************************ ;;; asy-mode mixed with LaTeX-mode: lasy ;;; ************************************ (if (locate-library "two-mode-mode") (progn ;; patch two-mode-mode.el for Emacs >= 23. (defun make-local-hook (func)) (defvar lasy-fontify-asy-p nil "Variable to communicate with `font-lock-unfontify-region'. Internal use, don't set in any fashion.") (setq lasy-fontify-asy-p nil) (eval-after-load "two-mode-mode" '(progn ;; Redefine `two-mode-mode-update-mode' to use regexp. (defun two-mode-mode-update-mode () "Redefined in `asy-mode.el' to use regexp" (when (and two-mode-bool two-mode-update) (setq two-mode-update 0) (let ((mode-list second-modes) (flag 0)) (while mode-list (let ((mode (car mode-list)) (lm -1) (rm -1)) (save-excursion (if (search-backward-regexp (cadr mode) nil t) (setq lm (point)) (setq lm -1))) (save-excursion (if (search-backward-regexp (car (cddr mode)) nil t) (setq rm (point)) (setq rm -1))) (if (and (not (and (= lm -1) (= rm -1))) (>= lm rm)) (progn (setq flag 1) (setq mode-list '()) (two-mode-change-mode (car mode) (car (cdr (cddr mode))))))) (setq mode-list (cdr mode-list))) (if (= flag 0) (two-mode-change-mode (car default-mode) (cadr default-mode)))))) (defun two-mode-change-mode (to-mode func) "Redefined in asy-mode. Change the variable `lasy-fontify-asy-p' according to the value of func and the current mode." (if (string= to-mode mode-name) t (progn (setq lasy-fontify-asy-p (eq func 'asy-mode)) (funcall func) (hack-local-variables) ;; avoid infinite loop in two-mode-mode ;; (two-mode-mode-setup) (if two-mode-switch-hook (run-hooks 'two-mode-switch-hook)) (if (eq font-lock-mode t) (font-lock-fontify-buffer)) (turn-on-font-lock-if-enabled)))) )) (require 'two-mode-mode) (defun lasy-mode () "Treat, in some cases, the current buffer as a literal Asymptote program." (interactive) (save-excursion (let ((prefix (progn (goto-char (point-max)) (re-search-backward "^\\([^\n]+\\)Local Variables:" (- (point-max) 3000) t) (match-string 1))) (pos-b (point))) (when (and prefix (progn (re-search-forward (regexp-quote (concat prefix "End:")) (point-max) t) (re-search-backward (concat "\\(" prefix "mode: .*\\)") pos-b t)) ) (error (concat "lasy-mode can not work if a mode is specified as local file variable. You should remove the line " (int-to-string (line-number-at-pos))))))) (set (make-local-variable 'asy-insinuate-latex-p) asy-insinuate-latex-p) (make-local-variable 'lasy-fontify-asy-p) (when (< emacs-major-version 22) (make-local-variable 'font-lock-keywords-only)) (setq default-mode '("LaTeX" latex-mode) second-modes '(("Asymptote" "^\\\\begin{asy}.*$" "^\\\\end{asy}" asy-mode))) (if two-mode-bool (progn (latex-mode) (asy-insinuate-latex)) (progn (two-mode-mode) ))) (when (not running-xemacs-p) (defadvice TeX-command-master (around asy-choose-compile act) "Hack to circumvent the preempt of 'C-c C-c' by AucTeX within `lasy-mode'." (if (string-match "asymptote" (downcase mode-name)) (asy-compile) ad-do-it))) (add-hook 'two-mode-switch-hook (lambda () (if (eq major-mode 'latex-mode) (progn ;; Switch to latex-mode ;; Disable LaTeX-math-Mode within lasy-mode (because of incompatibility) (when LaTeX-math-mode (LaTeX-math-mode -1)) (asy-insinuate-latex) (when (< emacs-major-version 22) (setq font-lock-keywords-only nil))) (progn ;; Switch to asy-mode (when (< emacs-major-version 22) (setq font-lock-keywords-only t)) )))) ;; (setq two-mode-switch-hook nil) ;; Solve a problem restoring a TeX file via desktop.el previously in lasy-mode. (if (boundp 'desktop-buffer-mode-handlers) (progn (defun asy-restore-desktop-buffer (desktop-b-f-name d-b-n d-b-m) (find-file desktop-b-f-name)) (add-to-list 'desktop-buffer-mode-handlers '(asy-mode . asy-restore-desktop-buffer)))) ;; Functions and 'advises' to restrict 'font-lock-unfontify-region' ;; and 'font-lock-fontify-syntactically-region' within lasy-mode ;; Special thanks to Olivier Ramaré for his help. (when (and (fboundp 'font-lock-add-keywords) (> emacs-major-version 21)) (defun lasy-mode-at-pos (pos &optional interior strictly) "If point at POS is in an asy environment return the list (start end)." (save-excursion (save-match-data (goto-char pos) (let* ((basy (progn (unless strictly (end-of-line)) (when (re-search-backward "^\\\\begin{asy}" (point-min) t) (when interior (next-line)) (point)))) (easy (and basy (progn (when (re-search-forward "^\\\\end{asy}" (point-max) t) (when interior (previous-line)(beginning-of-line)) (point)))))) (and basy easy (> pos (- basy (if interior 12 0))) (< pos (+ easy (if interior 10 0))) (list basy easy)))))) (defun lasy-region (start end &optional interior) "If the region 'start to end' contains the beginning or the end of an asy environment return the list of points where the asy environment starts and ends." (let* ((beg (min start end)) (lim (max start end))) (or (lasy-mode-at-pos beg interior) (save-match-data (save-excursion (goto-char beg) (and (re-search-forward "^\\\\begin{asy}" lim t) (lasy-mode-at-pos (point) interior))))))) (defun lasy-tags (start end) "Return associated list of points where the tags starts and ends restricted to the region (start end). \"b\" associated with (start-beginTag end-beginTag), \"e\" associated with (start-endTag end-endTag)." (let* ((beg (min start end)) (lim (max start end)) out) (save-excursion (goto-char beg)(beginning-of-line) (while (when (re-search-forward "^\\\\begin{asy}.*" lim t) (push (list (progn (beginning-of-line)(point)) (progn (end-of-line)(point))) out))) (goto-char beg)(beginning-of-line) (while (when (re-search-forward "^\\\\end{asy}" lim t) (push (list (progn (beginning-of-line)(point)) (progn (end-of-line)(point))) out))) out))) (defun lasy-restrict-region (start end &optional interior) "If the region 'start to end' contains the beginning or the end of an asy environment, returns the list of points wich restricts the region to the asy environment. Else, return (start end)." (let* ((beg (min start end)) (lim (max start end)) (be (if (lasy-mode-at-pos beg) beg (or (save-excursion (goto-char beg) (when (re-search-forward "^\\\\begin{asy}.*" lim t) (unless interior (beginning-of-line)) (point))) beg))) (en (or (save-excursion (goto-char be) (when (re-search-forward "^\\\\end{asy}" lim t) (when interior (beginning-of-line)) (point))) lim))) (list be en))) (defun lasy-parse-region (start end) "Return a list ((a (start1 end1)) (b (start2 end2)) [...]). where a, b, ... are nil or t; t means the region from 'startX' through 'endX' (are points) is in a asy environnement." (let (regasy out rr brr err tags) (save-excursion (goto-char start) (while (< (point) end) (setq regasy (lasy-region (point) end)) (if regasy (progn (setq rr (lasy-mode-at-pos (point))) (setq brr (and rr (nth 0 rr)) err (and rr (nth 1 rr))) (if rr (progn (push (list t (list (max 1 (1- (point))) (min end err))) out) (goto-char (min end err))) (progn (push (list nil (list (point) (nth 0 regasy))) out) (goto-char (1+ (nth 0 regasy)))))) (progn (push (list nil (list (min (1+ (point)) end) end)) out) (goto-char end))) )) ;; Put start and end of tag in latex fontification. (setq tags (lasy-tags start end)) (dolist (tag tags) (push (list nil tag) out)) (reverse out))) (defadvice font-lock-unfontify-region (around asy-font-lock-unfontify-region (beg end)) (if two-mode-bool (let ((rstate (lasy-parse-region beg end)) curr reg asy-fontify latex-fontify) (while (setq curr (pop rstate)) (setq reg (nth 1 curr)) (setq asy-fontify (and (nth 0 curr) lasy-fontify-asy-p) latex-fontify (and (not (nth 0 curr)) (not lasy-fontify-asy-p))) (when (or asy-fontify latex-fontify) (setq beg (nth 0 reg) end (nth 1 reg)) (save-excursion (save-restriction (narrow-to-region beg end) ad-do-it (widen)))))) ad-do-it)) (ad-activate 'font-lock-unfontify-region) ;; (ad-deactivate 'font-lock-unfontify-region) (defadvice font-lock-fontify-syntactically-region (around asy-font-lock-fontify-syntactically-region (start end &optional loudly)) (if (and two-mode-bool (eq major-mode 'asy-mode)) (let*((reg (lasy-restrict-region start end))) (save-restriction (setq start (nth 0 reg) end (nth 1 reg)) (narrow-to-region start end) (condition-case nil ad-do-it (error nil)) (widen) )) ad-do-it)) (ad-activate 'font-lock-fontify-syntactically-region) ;; (ad-deactivate 'font-lock-fontify-syntactically-region) (defadvice font-lock-default-fontify-region (around asy-font-lock-default-fontify-region (beg end loudly)) (if two-mode-bool (let ((rstate (lasy-parse-region beg end)) asy-fontify latex-fontify curr reg) (while (setq curr (pop rstate)) (setq reg (nth 1 curr)) (setq asy-fontify (and (nth 0 curr) lasy-fontify-asy-p) latex-fontify (and (not (nth 0 curr)) (not lasy-fontify-asy-p))) (when (or asy-fontify latex-fontify) (setq beg (nth 0 reg) end (nth 1 reg)) (save-excursion (save-restriction (narrow-to-region beg end) (condition-case nil ad-do-it (error nil)) (widen) ))))) ad-do-it)) (ad-activate 'font-lock-default-fontify-region) ;; (ad-deactivate 'font-lock-default-fontify-region) )) (progn (defvar two-mode-bool nil) (defun lasy-mode () (message "You must install the package two-mode-mode.el.")))) (setq asy-latex-menu-item '(["Toggle lasy-mode" lasy-mode :active (featurep 'two-mode-mode)] ["View asy picture near cursor" lasy-compile :active t]"--" ("Compile OR View" ["PS" lasy-view-ps :active t] ["PDF (pdflatex)" lasy-view-pdf-via-pdflatex :active t] ["PDF (ps2pdf)" lasy-view-pdf-via-ps2pdf :active t]) ("Compile AND View" ["PS" asy-master-tex-view-ps-f :active t] ["PDF (pdflatex)" asy-master-tex-view-pdflatex-f :active t] ["PDF (ps2pdf)" asy-master-tex-view-ps2pdf-f :active t])"--" ["Asymptote insinuates globally LaTeX" asy-insinuate-latex-globally :active (not asy-insinuate-latex-globally-p)] ("Disable Asymptote insinuate Latex" ["locally" asy-no-insinuate-locally :active t] ["globally" asy-no-insinuate-globally :active t]) ("Debugger Buffer" ["Visible" (setq asy-compilation-buffer 'visible) :style radio :selected (eq asy-compilation-buffer 'visible) :active t] ["Available" (setq asy-compilation-buffer 'available) :style radio :selected (eq asy-compilation-buffer 'available) :active t] ["None" (setq asy-compilation-buffer 'none) :style radio :selected (eq asy-compilation-buffer 'none) :active t] ["Never" (setq asy-compilation-buffer 'never) :style radio :selected (eq asy-compilation-buffer 'never) :active t]) )) (if running-xemacs-p (setq asy-latex-menu-item (nconc '("Asymptote") asy-latex-menu-item)) (setq asy-latex-menu-item (nconc '("Asymptote" :visible asy-insinuate-latex-p) asy-latex-menu-item))) (defun asy-insinuate-latex-maybe () "This function is added to `LaTeX-mode-hook' to define the environment 'asy' and, eventually, set its indentation. For internal use only." (when (or asy-insinuate-latex-globally-p (save-excursion (beginning-of-buffer) (save-match-data (search-forward "\\begin{asy}" nil t)))) (asy-insinuate-latex)) (LaTeX-add-environments '("asy" (lambda (env &rest ignore) (unless asy-insinuate-latex-p (asy-insinuate-latex)) (LaTeX-insert-environment env))))) ;; (add-hook 'after-init-hook ;; (lambda () (eval-after-load "latex" '(progn (add-hook 'LaTeX-mode-hook 'asy-insinuate-latex-maybe) (setq lasy-mode-map (copy-keymap LaTeX-mode-map)) (setq LaTeX-mode-map-backup (copy-keymap LaTeX-mode-map)) (defadvice TeX-add-local-master (after asy-adjust-local-variable ()) "Delete the line that defines the mode in a file .tex because two-mode-mode reread the local variables after switching mode." (when (string= (file-name-extension buffer-file-name) "tex") (save-excursion (goto-char (point-max)) (delete-matching-lines "mode: latex" (re-search-backward "^\\([^\n]+\\)Local Variables:" (- (point-max) 3000) t) (re-search-forward (regexp-quote (concat (match-string 1) "End:"))) nil)))) (ad-activate 'TeX-add-local-master) ;; (ad-deactivate 'TeX-add-local-master) (when lasy-extra-key (define-key lasy-mode-map (kbd "") (lambda () (interactive) (lasy-view-ps nil nil t))) (define-key lasy-mode-map (kbd "") (lambda () (interactive) (lasy-view-ps t nil t))) (define-key lasy-mode-map (kbd "") (lambda () (interactive) (lasy-view-pdf-via-pdflatex nil nil t))) (define-key lasy-mode-map (kbd "") (lambda () (interactive) (lasy-view-pdf-via-pdflatex t nil t))) (define-key lasy-mode-map (kbd "") (lambda () (interactive) (lasy-view-pdf-via-ps2pdf nil nil t))) (define-key lasy-mode-map (kbd "") (lambda () (interactive) (lasy-view-pdf-via-ps2pdf t nil t))) (define-key lasy-mode-map (kbd "") 'asy-goto-error)) (easy-menu-define asy-latex-mode-menu lasy-mode-map "Asymptote insinuates LaTeX" asy-latex-menu-item) )) ;; )) (defvar asy-insinuate-latex-p nil "Not nil when current buffer is insinuated by Asymptote. May be a local variable. For internal use.") (defvar asy-insinuate-latex-globally-p nil "Not nil when all latex-mode buffers is insinuated by Asymptote. For internal use.") (defun asy-set-latex-asy-indentation () "Set the indentation of environnment 'asy' like the environnment 'verbatim' is." ;; Regexp matching environments with indentation at col 0 for begin/end. (set (make-local-variable 'LaTeX-verbatim-regexp) (concat (default-value 'LaTeX-verbatim-regexp) "\\|asy")) ;; Alist of environments with special indentation. (make-local-variable 'LaTeX-indent-environment-list) (add-to-list 'LaTeX-indent-environment-list '("asy" current-indentation))) (defun asy-unset-latex-asy-indentation () "Unset the indentation of environnment 'asy' like the environnment 'verbatim' is." (set (make-local-variable 'LaTeX-verbatim-regexp) (default-value 'LaTeX-verbatim-regexp)) (set (make-local-variable 'LaTeX-indent-environment-list) (default-value 'LaTeX-indent-environment-list))) (defun asy-no-insinuate-locally () (interactive) (set (make-local-variable 'asy-insinuate-latex-p) nil) (setq asy-insinuate-latex-globally-p nil) (asy-unset-latex-asy-indentation) (if running-xemacs-p (easy-menu-remove-item nil nil "Asymptote") (menu-bar-update-buffers)) (if (and (boundp 'two-mode-bool) two-mode-bool) (lasy-mode)) (use-local-map LaTeX-mode-map-backup)) (defun asy-no-insinuate-globally () (interactive) (if running-xemacs-p (easy-menu-remove-item nil nil "Asymptote") (easy-menu-remove-item LaTeX-mode-map nil "Asymptote")) (kill-local-variable asy-insinuate-latex-p) (setq-default asy-insinuate-latex-p nil) (setq asy-insinuate-latex-globally-p nil) (if (not running-xemacs-p) (menu-bar-update-buffers)) (setq LaTeX-mode-map (copy-keymap LaTeX-mode-map-backup)) ;;Disable lasy-mode in all latex-mode buffers. (when (featurep 'two-mode-mode) (mapc (lambda (buffer) (with-current-buffer buffer (when (and (buffer-file-name) (string= (file-name-extension (buffer-file-name)) "tex")) (asy-unset-latex-asy-indentation) (latex-mode) (setq asy-insinuate-latex-p nil)))) (buffer-list)))) ;;;###autoload (defun asy-insinuate-latex (&optional global) "Add a menu bar in current 'latex-mode' buffer and activate asy keys bindings. If the optional parameter (only for internal use) 'global' is 't' then all the FUTURE 'latex-mode' buffers are insinuated. To insinuate all (current and future) 'latex-mode' buffers, use 'asy-insinuate-latex-globally' instead. You can automate this feature for all the 'latex-mode' buffers by inserting the five following lines in your .emacs initialization file: (eval-after-load \"latex\" '(progn ;; Add here your personal features for 'latex-mode': (asy-insinuate-latex t) ;; Asymptote insinuates globally Latex. ))" (interactive) (if (and (not asy-insinuate-latex-globally-p) (or global (string= major-mode "latex-mode"))) (progn (asy-set-latex-asy-indentation) (if global (progn (setq asy-insinuate-latex-p t) (setq asy-insinuate-latex-globally-p t) (setq LaTeX-mode-map (copy-keymap lasy-mode-map)) (if running-xemacs-p (add-hook 'LaTeX-mode-hook (lambda () (if asy-insinuate-latex-globally-p (easy-menu-add asy-latex-mode-menu lasy-mode-map)))))) (progn (use-local-map lasy-mode-map) (easy-menu-add asy-latex-mode-menu lasy-mode-map) (set (make-local-variable 'asy-insinuate-latex-p) t))) ))) (defun asy-insinuate-latex-globally () "Insinuates all (current and future) 'latex-mode' buffers. See `asy-insinuate-latex'." (interactive) (asy-insinuate-latex t) (if running-xemacs-p (add-hook 'LaTeX-mode-hook (lambda () (if asy-insinuate-latex-globally-p (easy-menu-add asy-latex-mode-menu lasy-mode-map))))) (mapc (lambda (buffer) (with-current-buffer buffer (when (and (buffer-file-name) (string= (file-name-extension (buffer-file-name)) "tex")) (setq asy-insinuate-latex-p t) (use-local-map LaTeX-mode-map) (use-local-map lasy-mode-map) (asy-set-latex-asy-indentation) (easy-menu-add asy-latex-mode-menu lasy-mode-map)))) (buffer-list))) (defun lasy-inline-p() "Return nil if the option 'inline' is not used or if `lasy-compilation-inline-auto-detection' value is nil." (if lasy-compilation-inline-auto-detection (save-excursion (re-search-backward "^[^%]* *\\\\usepackage\\[ *inline *\\]{ *asymptote *}" 0 t)) nil)) (defvar lasy-run-tex nil) (defun lasy-asydef() "Return the content between the tags \\begin{asydef} and \\end{asydef}." (save-excursion (if (re-search-backward "\\\\begin{asydef}" 0 t) (buffer-substring (progn (next-line)(beginning-of-line)(point)) (progn (re-search-forward "\\\\end{asydef}") (previous-line)(end-of-line) (point))) ""))) (defun lasy-compile-tex() "Compile region between \\begin{asy}[text with backslash] and \\end{asy} through a reconstructed file .tex." (interactive) (setq lasy-run-tex t) (save-excursion (let* ((Filename (asy-get-temp-file-name t)) (FilenameTex (concat Filename ".tex")) (asydef (lasy-asydef))) (save-excursion (beginning-of-buffer) (write-region (point) (progn (re-search-forward "\\\\begin{document}.*\n") (point)) FilenameTex) (write-region (concat "\\begin{asydef}\n" asydef "\n\\end{asydef}\n") 0 FilenameTex t)) (re-search-backward "\\\\begin{asy}") (write-region (point) (progn (re-search-forward "\\\\end{asy}") (point)) FilenameTex t) (with-temp-file FilenameTex (insert-file FilenameTex) (end-of-buffer) (insert "\n\\end{document}")) (let ((default-directory asy-temp-dir)) (lasy-view-ps t Filename))))) (defun lasy-compile() "Compile region between \\begin{asy} and \\end{asy}." (interactive) (if (or (lasy-inline-p) (progn ;; find \begin{asy}[any backslash] (save-excursion (re-search-forward "\\\\end{asy}" (point-max) t) (re-search-backward "\\\\begin{asy}.*\\(\\[.*\\\\.*\\]\\)" 0 t)) (match-string 1))) (progn (lasy-compile-tex)) ;; a temporary TeX file must be reconstructed. (progn (setq lasy-run-tex nil) (save-excursion (let ((Filename (asy-get-temp-file-name)) (asydef (lasy-asydef))) (write-region (match-string 0) 0 Filename) (re-search-backward "\\\\begin{asy}") (write-region (point) (progn (re-search-forward "\\\\end{asy}") (point)) Filename) (with-temp-file Filename (insert-file-contents Filename) (beginning-of-buffer) (if (re-search-forward "\\\\begin{asy}\\[\\(.*\\)\\]" (point-max) t) (let ((sz (match-string 1))) (replace-match "") (insert (concat asydef "\nsize(" sz ");"))) (when (re-search-forward "\\\\begin{asy}" (point-max) t) (replace-match "") (insert asydef))) (while (re-search-forward "\\\\end{asy}" (point-max) t) (replace-match ""))) (let* ((asy-compile-command (concat asy-command-location asy-command (if (eq asy-compilation-buffer 'never) " " " -wait ") (asy-protect-file-name Filename)))) (asy-internal-compile asy-compile-command t (not (eq asy-compilation-buffer 'never))))))))) (defun asy-set-master-tex () "Set the local variable 'asy-TeX-master-file. This variable is used by 'asy-master-tex-view-ps" (interactive) (set (make-local-variable 'asy-TeX-master-file) (file-name-sans-extension (file-relative-name (expand-file-name (read-file-name "TeX document: "))))) (if (string= (concat default-directory asy-TeX-master-file) (file-name-sans-extension buffer-file-name)) (prog1 (set (make-local-variable 'asy-TeX-master-file) nil) (error "You should never give the same name to the TeX file and the Asymptote file")) (save-excursion (end-of-buffer) (if (re-search-backward "asy-TeX-master-file\\(.\\)*$" 0 t) (replace-match (concat "asy-TeX-master-file: \"" asy-TeX-master-file "\"")) (insert (concat " /// Local Variables: /// asy-TeX-master-file: \"" asy-TeX-master-file "\" /// End:")) t)))) (defun asy-unset-master-tex () "Set the local variable 'asy-TeX-master-file to 'nil. This variable is used by 'asy-master-tex-view-ps" (interactive) (set (make-local-variable 'asy-TeX-master-file) nil) (save-excursion (end-of-buffer) (if (re-search-backward "^.*asy-TeX-master-file:.*\n" 0 t) (replace-match "")))) (defun asy-master-tex-error () "Asy-mode internal use..." (if (y-or-n-p "You try to compile the TeX document that contains this picture. You must set the local variable asy-TeX-master-file. Do you want set this variable now ?") (asy-set-master-tex) nil)) (defun asy-master-tex-view (Func-view &optional Force fromtex) "Compile the LaTeX document that contains the picture of the current Asymptote code with the function Func-view. Func-view can be one of 'lasy-view-ps, 'lasy-view-pdf-via-pdflatex, 'lasy-view-pdf-via-ps2pdf." (interactive) (if (or (and (boundp two-mode-bool) two-mode-bool) (string-match "latex" (downcase mode-name))) (progn ;; Current mode is lasy-mode or latex-mode not asy-mode (funcall Func-view Force nil fromtex)) (if asy-TeX-master-file (if (string= asy-TeX-master-file (file-name-sans-extension buffer-file-name)) (error "You should never give the same name to the TeX file and the Asymptote file") (funcall Func-view Force asy-TeX-master-file fromtex)) (if (asy-master-tex-error) (funcall Func-view Force asy-TeX-master-file fromtex))))) (defvar asy-last-compilation-code nil "Code returned by the last compilation with `compile'.") (defvar asy-compilation-auto-close nil "Variable to communicate with `asy-compilation-finish-function'. Do not set this variable in any fashion.") (defun asy-compilation-finish-function (buf msg) "Function to automatically close the compilation buffer '*asy-compilation*' when no error or warning occurs." (when (string-match "*asy-compilation*" (buffer-name buf)) (when (and asy-compilation-auto-close (eq asy-compilation-buffer 'none)) (setq asy-compilation-auto-close nil) (if (not (string-match "exited abnormally" msg)) (progn (save-excursion (set-buffer buf) (beginning-of-buffer) (if (not (search-forward-regexp "[wW]arning" nil t)) (when (not (eq asy-compilation-buffer 'visible)) ;;no errors/Warning, make the compilation window go away (run-at-time 0.5 nil (lambda (buf_) (delete-windows-on buf_) (kill-buffer buf_)) buf) (message (replace-regexp-in-string "\n" "" msg))) (message "Compilation warnings...")))))))) (if running-xemacs-p (setq compilation-finish-function 'asy-compilation-finish-function) (add-to-list 'compilation-finish-functions 'asy-compilation-finish-function)) (defun asy-compilation-wait(&optional pass auto-close) "Wait for process in *asy-compilation* exits. If pass is 't' don't wait. If auto-close is 't' close the window if the process exit with success." (setq asy-compilation-auto-close auto-close) (let* ((buff (get-buffer "*asy-compilation*")) (comp-proc (get-buffer-process buff))) (while (and comp-proc (not (eq (process-status comp-proc) 'exit)) (not pass)) (setq comp-proc (get-buffer-process buff)) (sit-for 1) (message "Waiting process...") ;; need message in Windows system ) (message "") ;; Erase previous message. (if (and (not pass) comp-proc) (setq asy-last-compilation-code (process-exit-status comp-proc)) (setq asy-last-compilation-code 0)) (when (and (eq asy-compilation-buffer 'available) (zerop asy-last-compilation-code)) (delete-windows-on buff)))) (defun asy-internal-shell (command &optional pass) "Execute 'command' in a inferior shell discarding output and redirecting stderr in the file given by the command `asy-log-filename'. `asy-internal-shell' waits for PROGRAM to terminate and returns a numeric exit status. The variable `asy-last-compilation-code' is always set to the exit status. The optional argument pass, for compatibility, is not used." (let* ((log-file (asy-log-filename)) (discard (if pass 0 nil)) (status (progn (let ((view-inhibit-help-message t))(write-region "" 0 log-file nil)) (message "%s" command) (call-process shell-file-name nil (list nil log-file) nil shell-command-switch command)))) (setq asy-last-compilation-code (if status status 0)) (if status status nil))) ;; (defun asy-internal-shell (command &optional pass) ;; "Execute 'command' in a inferior shell discarding output and ;; redirecting stderr in the file given by the command `asy-log-filename'. ;; pass non-nil means `asy-internal-shell' returns immediately with nil value. ;; Otherwise it waits for PROGRAM to terminate and returns a numeric exit status. ;; The variable `asy-last-compilation-code' is always set to the exit status or 0 if the ;; process returns immediately." ;; (let* ((log-file (asy-log-filename)) ;; (discard (if pass 0 nil)) ;; (status ;; (progn ;; (let ((inhibit-redisplay t))(write-region "" 0 log-file nil)) ;; (message "%s" command) ;; (call-process shell-file-name nil (list discard log-file) nil shell-command-switch command)))) ;; (setq asy-last-compilation-code (if status status 0)) ;; (when pass (sit-for 1)) ;; (if status status nil))) (defun asy-internal-compile (command &optional pass auto-close stderr) "Execute command. pass non-nil means don't wait the end of the process. auto-close non-nil means automatically close the compilation buffer. stderr non-nil means redirect the standard output error to the file returned by `asy-log-filename'. In this case command is running in an inferior shell without any output and the parameter auto-close is not used (see `asy-internal-shell')." (setq asy-last-compilation-code -1) (let* ((compilation-buffer-name "*asy-compilation*") (compilation-buffer-name-function (lambda (mj) compilation-buffer-name))) (if (or stderr (eq asy-compilation-buffer 'never)) (progn (asy-internal-shell command pass) (asy-error-message t)) (progn (let ((comp-proc (get-buffer-process compilation-buffer-name))) (if comp-proc (condition-case () (progn (interrupt-process comp-proc) (sit-for 1) (delete-process comp-proc) (when (and asy-compilation-auto-close (eq asy-compilation-buffer 'none) (not (eq asy-compilation-buffer 'visible))) (sit-for 0.6))) (error "")) )) (let ((view-inhibit-help-message t)) (write-region "" 0 (asy-log-filename) nil)) (compile command)) (asy-compilation-wait pass auto-close)))) (defun asy-open-file(Filename) "Open the ps or pdf file Filename. In unix-like system the variables `ps-view-command' and `pdf-view-command' are used. In Windows the associated system file type is used instead." (let ((command (if running-unix-p (let ((ext (file-name-extension Filename))) (cond ((string= ext "ps") ps-view-command) ((string= ext "pdf") pdf-view-command) (t (error "Extension Not Supported.")))) (asy-protect-file-name (file-name-nondirectory Filename)))) ) (if running-unix-p (start-process "" nil command Filename) (call-process-shell-command command nil 0)))) (defun lasy-TeX-master-file () "Return the file name of the master file for the current document. The returned string contain the directory but does not contain the extension of the file." (expand-file-name (concat (TeX-master-directory) (TeX-master-file nil t)))) (defun lasy-must-compile-p (TeX-Master-File out-file &optional Force) "" (or Force (file-newer-than-file-p (concat TeX-Master-File ".tex") out-file) (and (stringp (TeX-master-file)) ;; current buffer is not a mater tex file (file-newer-than-file-p buffer-file-name out-file)))) (defun lasy-view-ps (&optional Force Filename fromtex) "Compile a LaTeX document embedding Asymptote code with latex->asy->latex->dvips and/or view the PostScript output. If optional argument Force is t then force compilation." (interactive) (setq lasy-run-tex t) (setq lasy-compile-tex fromtex) (if (buffer-modified-p) (save-buffer)) (when (eq asy-compilation-buffer 'never) (write-region "" 0 (asy-log-filename) nil)) (let* ((b-b-n (if Filename Filename (lasy-TeX-master-file))) (b-b-n-tex (asy-protect-file-name (concat b-b-n ".tex"))) (b-b-n-ps (asy-protect-file-name (concat b-b-n ".ps"))) (b-b-n-dvi (asy-protect-file-name (concat b-b-n ".dvi"))) (b-b-n-asy (asy-protect-file-name (concat b-b-n ".asy"))) (stderr (eq asy-compilation-buffer 'never))) (if (lasy-must-compile-p b-b-n (concat b-b-n ".ps") Force) (progn (let ((default-directory (file-name-directory b-b-n))) (asy-internal-compile (concat lasy-latex-command " " b-b-n-tex)) (when (and (zerop asy-last-compilation-code) (file-readable-p (concat b-b-n ".asy"))) (asy-internal-compile (concat asy-command-location lasy-command " " b-b-n-asy) nil nil stderr) (when (zerop asy-last-compilation-code) (asy-internal-compile (concat lasy-latex-command " " b-b-n-tex)))) (when (zerop asy-last-compilation-code) (asy-internal-compile (concat lasy-dvips-command " " b-b-n-dvi " -o " b-b-n-ps) nil t) (when (zerop asy-last-compilation-code) (asy-open-file (concat b-b-n ".ps")))))) (asy-open-file (concat b-b-n ".ps"))))) (defun lasy-view-pdf-via-pdflatex (&optional Force Filename fromtex) "Compile a LaTeX document embedding Asymptote code with pdflatex->asy->pdflatex and/or view the PDF output. If optional argument Force is t then force compilation." (interactive) (setq lasy-run-tex t) (setq lasy-compile-tex fromtex) (if (buffer-modified-p) (save-buffer)) (when (eq asy-compilation-buffer 'never) (write-region "" 0 (asy-log-filename) nil)) (let* ((b-b-n (if Filename Filename (lasy-TeX-master-file))) (b-b-n-tex (asy-protect-file-name (concat b-b-n ".tex"))) (b-b-n-pdf (asy-protect-file-name (concat b-b-n ".pdf"))) (b-b-n-asy (asy-protect-file-name (concat b-b-n ".asy"))) ;; (stderr (or (eq asy-compilation-buffer 'never) lasy-compile-tex))) (stderr (eq asy-compilation-buffer 'never))) (if (lasy-must-compile-p b-b-n (concat b-b-n ".pdf") Force) (progn (let ((default-directory (file-name-directory b-b-n))) (asy-internal-compile (concat lasy-pdflatex-command " " b-b-n-tex)) (when (and (zerop asy-last-compilation-code) (file-readable-p (concat b-b-n ".asy"))) (asy-internal-compile (concat asy-command-location lasy-command " " b-b-n-asy) nil nil stderr) (when (zerop asy-last-compilation-code) (asy-internal-compile (concat lasy-pdflatex-command " " b-b-n-tex) t))) (when (zerop asy-last-compilation-code) (asy-open-file (concat b-b-n ".pdf"))))) (asy-open-file (concat b-b-n ".pdf"))))) (defun lasy-view-pdf-via-ps2pdf (&optional Force Filename fromtex) "Compile a LaTeX document embedding Asymptote code with latex->asy->latex->dvips->ps2pdf14 and/or view the PDF output. If optional argument Force is t then force compilation." (interactive) (setq lasy-run-tex t) (setq lasy-compile-tex fromtex) (if (buffer-modified-p) (save-buffer)) (when (eq asy-compilation-buffer 'never) (write-region "" 0 (asy-log-filename) nil)) (let* ((b-b-n (if Filename Filename (lasy-TeX-master-file))) (b-b-n-tex (asy-protect-file-name (concat b-b-n ".tex"))) (b-b-n-ps (asy-protect-file-name (concat b-b-n ".ps"))) (b-b-n-dvi (asy-protect-file-name (concat b-b-n ".dvi"))) (b-b-n-pdf (asy-protect-file-name (concat b-b-n ".pdf"))) (b-b-n-asy (asy-protect-file-name (concat b-b-n ".asy"))) ;; (stderr (or (eq asy-compilation-buffer 'never) lasy-compile-tex))) (stderr (eq asy-compilation-buffer 'never))) (if (lasy-must-compile-p b-b-n (concat b-b-n ".pdf") Force) (progn (let ((default-directory (file-name-directory b-b-n))) (asy-internal-compile (concat lasy-latex-command " " b-b-n-tex)) (when (and (zerop asy-last-compilation-code) (file-readable-p (concat b-b-n ".asy"))) (asy-internal-compile (concat asy-command-location lasy-command " " b-b-n-asy) nil nil stderr) (when (zerop asy-last-compilation-code) (asy-internal-compile (concat lasy-latex-command " " b-b-n-tex)))) (when (zerop asy-last-compilation-code) (asy-internal-compile (concat lasy-dvips-pre-pdf-command " " b-b-n-dvi " -o " b-b-n-ps)) (when (zerop asy-last-compilation-code) (asy-internal-compile (concat lasy-ps2pdf-command " " b-b-n-ps " " b-b-n-pdf) t) (when (zerop asy-last-compilation-code) (asy-open-file (concat b-b-n ".pdf"))))))) (asy-open-file (concat b-b-n ".pdf"))))) ;; Goto error of last compilation (define-key asy-mode-map (kbd "") 'asy-goto-error) ;; Save and compile the file with option -V (define-key asy-mode-map (kbd "C-c C-c") 'asy-compile) ;; Show the definitions of command at point (define-key asy-mode-map (kbd "C-c ?") 'asy-show-function-at-point) ;; new line and indent (define-key asy-mode-map (kbd "RET") 'newline-and-indent) (defun asy-master-tex-view-ps () "Look at `asy-master-tex-view'" (interactive) (asy-master-tex-view 'lasy-view-ps nil t)) (define-key asy-mode-map (kbd "") 'asy-master-tex-view-ps) (defun asy-master-tex-view-ps-f () "Look at `asy-master-tex-view'" (interactive) (asy-master-tex-view 'lasy-view-ps t t)) (define-key asy-mode-map (kbd "") 'asy-master-tex-view-ps-f) (defun asy-master-tex-view-pdflatex () "Look at `asy-master-tex-view'" (interactive) (asy-master-tex-view 'lasy-view-pdf-via-pdflatex nil t)) (define-key asy-mode-map (kbd "") 'asy-master-tex-view-pdflatex) (defun asy-master-tex-view-pdflatex-f () "Look at `asy-master-tex-view'" (interactive) (asy-master-tex-view 'lasy-view-pdf-via-pdflatex t t)) (define-key asy-mode-map (kbd "") 'asy-master-tex-view-pdflatex-f) (defun asy-master-tex-view-ps2pdf () "Look at `asy-master-tex-view'" (interactive) (asy-master-tex-view 'lasy-view-pdf-via-ps2pdf nil t)) (define-key asy-mode-map (kbd "") 'asy-master-tex-view-ps2pdf) (defun asy-master-tex-view-ps2pdf-f () "Look at `asy-master-tex-view'" (interactive) (asy-master-tex-view 'lasy-view-pdf-via-ps2pdf t t)) (define-key asy-mode-map (kbd "") 'asy-master-tex-view-ps2pdf-f) ;; Integrate with flycheck (with-eval-after-load 'flycheck (flycheck-define-command-checker 'asy "Syntax checking of asymptote files." :command (append (split-string (concat asy-command-location asy-command)) '("-noV" "-o" temporary-file-name source)) :error-patterns ;; filename.asy: 123.45: warning: message ;; filename.asy: 123.45: error message '((warning line-start (file-name) ":" (* space) line (? ?\. column) ": warning: " (message) line-end) (error line-start (file-name) ":" (* space) line (? ?\. column) ": " (message) line-end)) :modes '(asy-mode)) (add-to-list 'flycheck-checkers 'asy)) (provide `asy-mode) ;;; asy-mode.el ends here asymptote-3.05/base/asy_filetype.vim0000644000000000000000000000014315031566105016310 0ustar rootroot" Vim filetype detection file " Language: Asymptote au BufNewFile,BufRead *.asy setfiletype asy asymptote-3.05/base/simplex.asy0000644000000000000000000002032315031566105015277 0ustar rootroot// Real simplex solver written by John C. Bowman and Pouria Ramazi, 2018. struct simplex { static int OPTIMAL=0; static int UNBOUNDED=1; static int INFEASIBLE=2; int case; real[] x; real cost; bool dual=false; int m,n; int J; real EpsilonA; // Row reduce based on pivot E[I][J] void rowreduce(real[][] E, int N, int I, int J) { real[] EI=E[I]; real v=EI[J]; for(int j=0; j < J; ++j) EI[j] /= v; EI[J]=1.0; for(int j=J+1; j <= N; ++j) EI[j] /= v; for(int i=0; i < I; ++i) { real[] Ei=E[i]; real EiJ=Ei[J]; for(int j=0; j < J; ++j) Ei[j] -= EI[j]*EiJ; Ei[J]=0.0; for(int j=J+1; j <= N; ++j) Ei[j] -= EI[j]*EiJ; } for(int i=I+1; i <= m; ++i) { real[] Ei=E[i]; real EiJ=Ei[J]; for(int j=0; j < J; ++j) Ei[j] -= EI[j]*EiJ; Ei[J]=0.0; for(int j=J+1; j <= N; ++j) Ei[j] -= EI[j]*EiJ; } } int iterate(real[][] E, int N, int[] Bindices, bool phase1=false) { while(true) { // Bland's rule: first negative entry in reduced cost (bottom) row enters real[] Em=E[m]; for(J=1; J <= N; ++J) if(Em[J] < 0) break; if(J > N) break; int I=-1; real t; for(int i=0; i < m; ++i) { real u=E[i][J]; if(u > EpsilonA) { t=E[i][0]/u; I=i; break; } } for(int i=I+1; i < m; ++i) { real u=E[i][J]; if(u > EpsilonA) { real r=E[i][0]/u; if(r <= t && (r < t || Bindices[i] < Bindices[I])) { t=r; I=i; } // Bland's rule: exiting variable has smallest minimizing subscript } } if(I == -1) return UNBOUNDED; // Can only happen in Phase 2. // Generate new tableau Bindices[I]=J; rowreduce(E,N,I,J); if(phase1 && abs(Em[0]) <= EpsilonA) break; } return OPTIMAL; } int iterateDual(real[][] E, int N, int[] Bindices, bool phase1=false) { while(true) { // Bland's rule: negative variable with smallest subscript exits int I; for(I=0; I < m; ++I) { if(E[I][0] < 0) break; } if(I == m) break; for(int i=I+1; i < m; ++i) { if(E[i][0] < 0 && Bindices[i] < Bindices[I]) I=i; } real[] Em=E[m]; real[] EI=E[I]; int J=0; real t; for(int j=1; j <= N; ++j) { real u=EI[j]; if(u < -EpsilonA) { t=-Em[j]/u; J=j; break; } } for(int j=J+1; j <= N; ++j) { real u=EI[j]; if(u < -EpsilonA) { real r=-Em[j]/u; if(r < t) { t=r; J=j; } // Bland's rule: smallest minimizing subscript enters } } if(J == 0) return INFEASIBLE; // Can only happen in Phase 2. // Generate new tableau Bindices[I]=J; rowreduce(E,N,I,J); } return OPTIMAL; } // Try to find a solution x to Ax=b that minimizes the cost c^T x, // where A is an m x n matrix, x is a vector of n non-negative numbers, // b is a vector of length m, and c is a vector of length n. // Can set phase1=false if the last m columns of A form the identity matrix. void operator init(real[] c, real[][] A, real[] b, bool phase1=true) { static real epsilon=sqrt(realEpsilon); real normA=norm(A); real epsilonA=100.0*realEpsilon*normA; EpsilonA=epsilon*normA; // Phase 1 m=A.length; if(m == 0) {case=INFEASIBLE; return;} n=A[0].length; if(n == 0) {case=INFEASIBLE; return;} real[][] E=new real[m+1][n+1]; real[] Em=E[m]; for(int j=1; j <= n; ++j) Em[j]=0; for(int i=0; i < m; ++i) { real[] Ai=A[i]; real[] Ei=E[i]; if(b[i] >= 0 || dual) { for(int j=1; j <= n; ++j) { real Aij=Ai[j-1]; Ei[j]=Aij; Em[j] -= Aij; } } else { for(int j=1; j <= n; ++j) { real Aij=-Ai[j-1]; Ei[j]=Aij; Em[j] -= Aij; } } } void basicValues() { real sum=0; for(int i=0; i < m; ++i) { real B=dual ? b[i] : abs(b[i]); E[i][0]=B; sum -= B; } Em[0]=sum; } int[] Bindices; if(phase1) { Bindices=new int[m]; int k=0; // Check for redundant basis vectors. for(int p=0; p < m; ++p) { bool checkBasis(int j) { for(int i=0; i < m; ++i) { real[] Ei=E[i]; if(i != p ? abs(Ei[j]) >= epsilonA : Ei[j] <= epsilonA) return false; } return true; } int checkTableau() { for(int j=1; j <= n; ++j) if(checkBasis(j)) return j; return 0; } int j=checkTableau(); Bindices[p]=n+1+p; if(j == 0) { // Add an artificial variable for(int i=0; i < p; ++i) E[i].push(0.0); E[p].push(1.0); for(int i=p+1; i < m; ++i) E[i].push(0.0); E[m].push(0.0); ++k; } } basicValues(); iterate(E,n+k,Bindices,true); if(abs(Em[0]) > EpsilonA) { case=INFEASIBLE; return; } } else { Bindices=sequence(new int(int x){return x;},m)+n-m+1; basicValues(); } real[] cB=phase1 ? new real[m] : c[n-m:n]; real[][] D=phase1 ? new real[m+1][n+1] : E; if(phase1) { // Drive artificial variables out of basis. for(int i=0; i < m; ++i) { if(Bindices[i] > n) { real[] Ei=E[i]; int j; for(j=1; j <= n; ++j) if(abs(Ei[j]) > EpsilonA) break; if(j > n) continue; Bindices[i]=j; rowreduce(E,n,i,j); } } int ip=0; // reduced i for(int i=0; i < m; ++i) { int k=Bindices[i]; if(k > n) continue; Bindices[ip]=k; cB[ip]=c[k-1]; real[] Dip=D[ip]; real[] Ei=E[i]; for(int j=1; j <= n; ++j) Dip[j]=Ei[j]; Dip[0]=Ei[0]; ++ip; } real[] Dip=D[ip]; real[] Em=E[m]; for(int j=1; j <= n; ++j) Dip[j]=Em[j]; Dip[0]=Em[0]; if(m > ip) { Bindices.delete(ip,m-1); D.delete(ip,m-1); m=ip; } } real[] Dm=D[m]; for(int j=1; j <= n; ++j) { real sum=0; for(int k=0; k < m; ++k) sum += cB[k]*D[k][j]; Dm[j]=c[j-1]-sum; } real sum=0; for(int k=0; k < m; ++k) sum += cB[k]*D[k][0]; Dm[0]=-sum; case=(dual ? iterateDual : iterate)(D,n,Bindices); if(case != OPTIMAL) return; for(int j=0; j < n; ++j) x[j]=0; for(int k=0; k < m; ++k) x[Bindices[k]-1]=D[k][0]; cost=-Dm[0]; } // Try to find a solution x to sgn(Ax-b)=sgn(s) that minimizes the cost // c^T x, where A is an m x n matrix, x is a vector of n non-negative // numbers, b is a vector of length m, and c is a vector of length n. void operator init(real[] c, real[][] A, int[] s, real[] b) { int m=A.length; if(m == 0) {case=INFEASIBLE; return;} int n=A[0].length; if(n == 0) {case=INFEASIBLE; return;} int count=0; for(int i=0; i < m; ++i) if(s[i] != 0) ++count; real[][] a=new real[m][n+count]; for(int i=0; i < m; ++i) { real[] ai=a[i]; real[] Ai=A[i]; for(int j=0; j < n; ++j) { ai[j]=Ai[j]; } } int k=0; bool phase1=false; bool dual=count == m && all(c >= 0); for(int i=0; i < m; ++i) { real[] ai=a[i]; for(int j=0; j < k; ++j) ai[n+j]=0; int si=s[i]; if(k < count) ai[n+k]=-si; for(int j=k+1; j < count; ++j) ai[n+j]=0; if(si == 0) phase1=true; else { ++k; real bi=b[i]; if(bi == 0) { if(si == 1) { s[i]=-1; for(int j=0; j < n+count; ++j) ai[j]=-ai[j]; } } else if(dual && si == 1) { b[i]=-bi; s[i]=-1; for(int j=0; j < n+count; ++j) ai[j]=-ai[j]; } else if(si*bi > 0) phase1=true; } } if(dual) phase1=false; operator init(concat(c,array(count,0.0)),a,b,phase1); if(case == OPTIMAL && count > 0) x.delete(n,n+count-1); } } asymptote-3.05/base/metapost.asy0000644000000000000000000000037315031566105015455 0ustar rootroot// MetaPost compatibility routines path cuttings; path cutbefore(path p, path q) { slice s=firstcut(p,q); cuttings=s.before; return s.after; } path cutafter(path p, path q) { slice s=lastcut(p,q); cuttings=s.after; return s.before; } asymptote-3.05/base/bsp.asy0000644000000000000000000001223715031566105014407 0ustar rootrootprivate import math; import three; real epsilon=10*realEpsilon; // Routines for hidden surface removal (via binary space partition): // Structure face is derived from picture. struct face { picture pic; transform t; frame fit; triple normal,point; triple min,max; void operator init(path3 p) { this.normal=normal(p); if(this.normal == O) abort("path is linear"); this.point=point(p,0); min=min(p); max=max(p); } face copy() { face f=new face; f.pic=pic.copy(); f.t=t; f.normal=normal; f.point=point; f.min=min; f.max=max; add(f.fit,fit); return f; } } picture operator cast(face f) {return f.pic;} face operator cast(path3 p) {return face(p);} struct line { triple point; triple dir; } private line intersection(face a, face b) { line L; L.point=intersectionpoint(a.normal,a.point,b.normal,b.point); L.dir=unit(cross(a.normal,b.normal)); return L; } struct half { pair[] left,right; // Sort the points in the pair array z according to whether they lie on the // left or right side of the line L in the direction dir passing through P. // Points exactly on L are considered to be on the right side. // Also push any points of intersection of L with the path operator --(... z) // onto each of the arrays left and right. void operator init(pair dir, pair P ... pair[] z) { pair lastz; pair invdir=dir != 0 ? 1/dir : 0; bool left,last; for(int i=0; i < z.length; ++i) { left=(invdir*z[i]).y > (invdir*P).y; if(i > 0 && last != left) { pair w=extension(P,P+dir,lastz,z[i]); this.left.push(w); this.right.push(w); } if(left) this.left.push(z[i]); else this.right.push(z[i]); last=left; lastz=z[i]; } } } struct splitface { face back,front; } // Return the pieces obtained by splitting face a by face cut. splitface split(face a, face cut, projection P) { splitface S; void nointersection() { if(abs(dot(a.point-P.camera,a.normal)) >= abs(dot(cut.point-P.camera,cut.normal))) { S.back=a; S.front=null; } else { S.back=null; S.front=a; } } if(P.infinity) { P=P.copy(); static real factor=1/sqrtEpsilon; P.camera *= factor*max(abs(a.min),abs(a.max), abs(cut.min),abs(cut.max)); } if((abs(a.normal-cut.normal) < epsilon || abs(a.normal+cut.normal) < epsilon)) { nointersection(); return S; } line L=intersection(a,cut); if(dot(P.camera-L.point,P.camera-P.target) < 0) { nointersection(); return S; } pair point=a.t*project(L.point,P); pair dir=a.t*project(L.point+L.dir,P)-point; pair invdir=dir != 0 ? 1/dir : 0; triple apoint=L.point+cross(L.dir,a.normal); bool left=(invdir*(a.t*project(apoint,P))).y >= (invdir*point).y; real t=intersect(apoint,P.camera,cut.normal,cut.point); bool rightfront=left ^ (t <= 0 || t >= 1); face back=a, front=a.copy(); pair max=max(a.fit); pair min=min(a.fit); half h=half(dir,point,max,(min.x,max.y),min,(max.x,min.y),max); if(h.right.length == 0) { if(rightfront) front=null; else back=null; } else if(h.left.length == 0) { if(rightfront) back=null; else front=null; } if(front != null) clip(front.fit,operator --(... rightfront ? h.right : h.left)--cycle, zerowinding); if(back != null) clip(back.fit,operator --(... rightfront ? h.left : h.right)--cycle, zerowinding); S.back=back; S.front=front; return S; } // A binary space partition struct bsp { bsp back; bsp front; face node; // Construct the bsp. void operator init(face[] faces, projection P) { if(faces.length != 0) { this.node=faces.pop(); face[] front,back; for(int i=0; i < faces.length; ++i) { splitface split=split(faces[i],this.node,P); if(split.front != null) front.push(split.front); if(split.back != null) back.push(split.back); } this.front=bsp(front,P); this.back=bsp(back,P); } } // Draw from back to front. void add(frame f) { if(back != null) back.add(f); add(f,node.fit,group=true); if(labels(node.fit)) layer(f); // Draw over any existing TeX layers. if(front != null) front.add(f); } } void add(picture pic=currentpicture, face[] faces, projection P=currentprojection) { int n=faces.length; face[] Faces=new face[n]; for(int i=0; i < n; ++i) Faces[i]=faces[i].copy(); pic.add(new void (frame f, transform t, transform T, pair m, pair M) { // Fit all of the pictures so we know their exact sizes. face[] faces=new face[n]; for(int i=0; i < n; ++i) { faces[i]=Faces[i].copy(); face F=faces[i]; F.t=t*T*F.pic.T; F.fit=F.pic.fit(t,T*F.pic.T,m,M); } bsp bsp=bsp(faces,P); if(bsp != null) bsp.add(f); }); for(int i=0; i < n; ++i) { picture F=Faces[i].pic; pic.userBox3(F.userMin3(), F.userMax3()); pic.bounds.append(F.T, F.bounds); // The above 2 lines should be replaced with a routine in picture which // copies only sizing data from another picture. } } asymptote-3.05/base/rationalSimplex.asy0000644000000000000000000002335215031566105016776 0ustar rootroot// Rational simplex solver written by John C. Bowman and Pouria Ramazi, 2018. import rational; bool optimizeTableau=true; int[] artificialColumn; void simplexInit(rational[] c, rational[][] A, int[] s=new int[], rational[] b, int count) {} void simplexTableau(rational[][] E, int[] Bindices, int I=-1, int J=-1, int n=E[0].length-1) {} void simplexPhase1(rational[] c, rational[][] A, rational[] b, int[] Bindices) {} void simplexPhase2() {} void simplexWrite(rational[][] E, int[] Bindices, int, int) { int m=E.length-1; int n=E[0].length-1; write(E[m][0],tab); for(int j=1; j <= n; ++j) write(E[m][j],tab); write(); for(int i=0; i < m; ++i) { write(E[i][0],tab); for(int j=1; j <= n; ++j) { write(E[i][j],tab); } write(); } write(); }; struct simplex { static int OPTIMAL=0; static int UNBOUNDED=1; static int INFEASIBLE=2; int case; rational[] x; rational[] xStandard; rational cost; rational[] d; bool dual=false; int m,n; int J; // Row reduce based on pivot E[I][J] void rowreduce(rational[][] E, int N, int I, int J) { rational[] EI=E[I]; rational v=EI[J]; for(int j=0; j < J; ++j) EI[j] /= v; EI[J]=1; for(int j=J+1; j <= N; ++j) EI[j] /= v; for(int i=0; i < I; ++i) { rational[] Ei=E[i]; rational EiJ=Ei[J]; for(int j=0; j < J; ++j) Ei[j] -= EI[j]*EiJ; Ei[J]=0; for(int j=J+1; j <= N; ++j) Ei[j] -= EI[j]*EiJ; } for(int i=I+1; i <= m; ++i) { rational[] Ei=E[i]; rational EiJ=Ei[J]; for(int j=0; j < J; ++j) Ei[j] -= EI[j]*EiJ; Ei[J]=0; for(int j=J+1; j <= N; ++j) Ei[j] -= EI[j]*EiJ; } } int iterate(rational[][] E, int N, int[] Bindices, bool phase1=false) { while(true) { // Bland's rule: first negative entry in reduced cost (bottom) row enters rational[] Em=E[m]; for(J=1; J <= N; ++J) if(Em[J] < 0) break; if(J > N) break; int I=-1; rational t; for(int i=0; i < m; ++i) { rational u=E[i][J]; if(u > 0) { t=E[i][0]/u; I=i; break; } } for(int i=I+1; i < m; ++i) { rational u=E[i][J]; if(u > 0) { rational r=E[i][0]/u; if(r <= t && (r < t || Bindices[i] < Bindices[I])) { t=r; I=i; } // Bland's rule: exiting variable has smallest minimizing subscript } } if(I == -1) return UNBOUNDED; // Can only happen in Phase 2. simplexTableau(E,Bindices,I,J); // Generate new tableau Bindices[I]=J; rowreduce(E,N,I,J); if(phase1 && Em[0] == 0) break; } return OPTIMAL; } int iterateDual(rational[][] E, int N, int[] Bindices, bool phase1=false) { while(true) { // Bland's rule: negative variable with smallest subscript exits int I; for(I=0; I < m; ++I) { if(E[I][0] < 0) break; } if(I == m) break; for(int i=I+1; i < m; ++i) { if(E[i][0] < 0 && Bindices[i] < Bindices[I]) I=i; } rational[] Em=E[m]; rational[] EI=E[I]; int J=0; rational t; for(int j=1; j <= N; ++j) { rational u=EI[j]; if(u < 0) { t=-Em[j]/u; J=j; break; } } for(int j=J+1; j <= N; ++j) { rational u=EI[j]; if(u < 0) { rational r=-Em[j]/u; if(r <= t && (r < t || j < J)) { t=r; J=j; } // Bland's rule: smallest minimizing subscript enters } } if(J == 0) return INFEASIBLE; // Can only happen in Phase 2. simplexTableau(E,Bindices,I,J); // Generate new tableau Bindices[I]=J; rowreduce(E,N,I,J); } return OPTIMAL; } // Try to find a solution x to Ax=b that minimizes the cost c^T x, // where A is an m x n matrix, x is a vector of n non-negative numbers, // b is a vector of length m, and c is a vector of length n. // Can set phase1=false if the last m columns of A form the identity matrix. void operator init(rational[] c, rational[][] A, rational[] b, bool phase1=true) { // Phase 1 m=A.length; if(m == 0) {case=INFEASIBLE; return;} n=A[0].length; if(n == 0) {case=INFEASIBLE; return;} rational[][] E=new rational[m+1][n+1]; rational[] Em=E[m]; for(int j=1; j <= n; ++j) Em[j]=0; for(int i=0; i < m; ++i) { rational[] Ai=A[i]; rational[] Ei=E[i]; if(b[i] >= 0 || dual) { for(int j=1; j <= n; ++j) { rational Aij=Ai[j-1]; Ei[j]=Aij; Em[j] -= Aij; } } else { for(int j=1; j <= n; ++j) { rational Aij=-Ai[j-1]; Ei[j]=Aij; Em[j] -= Aij; } } } void basicValues() { rational sum=0; for(int i=0; i < m; ++i) { rational B=dual ? b[i] : abs(b[i]); E[i][0]=B; sum -= B; } Em[0]=sum; } int[] Bindices; if(phase1) { Bindices=new int[m]; int k=0; artificialColumn.delete(); // Check for redundant basis vectors. for(int p=0; p < m; ++p) { bool checkBasis(int j) { for(int i=0; i < m; ++i) { rational[] Ei=E[i]; if(i != p ? Ei[j] != 0 : Ei[j] <= 0) return false; } return true; } int checkTableau() { if(optimizeTableau) for(int j=1; j <= n; ++j) if(checkBasis(j)) return j; return 0; } int j=checkTableau(); Bindices[p]=n+1+p; if(j == 0) { // Add an artificial variable artificialColumn.push(p+1); for(int i=0; i < p; ++i) E[i].push(0); E[p].push(1); for(int i=p+1; i < m; ++i) E[i].push(0); E[m].push(0); ++k; } } basicValues(); simplexPhase1(c,A,b,Bindices); iterate(E,n+k,Bindices,true); if(Em[0] != 0) { simplexTableau(E,Bindices); case=INFEASIBLE; return; } } else { Bindices=sequence(new int(int x){return x;},m)+n-m+1; basicValues(); } rational[] cB=phase1 ? new rational[m] : c[n-m:n]; rational[][] D=phase1 ? new rational[m+1][n+1] : E; if(phase1) { // Drive artificial variables out of basis. for(int i=0; i < m; ++i) { if(Bindices[i] > n) { rational[] Ei=E[i]; int j; for(j=1; j <= n; ++j) if(Ei[j] != 0) break; if(j > n) continue; simplexTableau(E,Bindices,i,j,n); Bindices[i]=j; rowreduce(E,n,i,j); } } simplexTableau(E,Bindices,-1,-1,n); int ip=0; // reduced i for(int i=0; i < m; ++i) { int k=Bindices[i]; if(k > n) continue; Bindices[ip]=k; cB[ip]=c[k-1]; rational[] Dip=D[ip]; rational[] Ei=E[i]; for(int j=1; j <= n; ++j) Dip[j]=Ei[j]; Dip[0]=Ei[0]; ++ip; } rational[] Dip=D[ip]; rational[] Em=E[m]; for(int j=1; j <= n; ++j) Dip[j]=Em[j]; Dip[0]=Em[0]; if(m > ip) { Bindices.delete(ip,m-1); D.delete(ip,m-1); m=ip; } } rational[] Dm=D[m]; for(int j=1; j <= n; ++j) { rational sum=0; for(int k=0; k < m; ++k) sum += cB[k]*D[k][j]; Dm[j]=c[j-1]-sum; } rational sum=0; for(int k=0; k < m; ++k) sum += cB[k]*D[k][0]; Dm[0]=-sum; simplexPhase2(); case=(dual ? iterateDual : iterate)(D,n,Bindices); simplexTableau(D,Bindices); if(case != INFEASIBLE) { x=new rational[n]; for(int j=0; j < n; ++j) x[j]=0; for(int k=0; k < m; ++k) x[Bindices[k]-1]=D[k][0]; xStandard=copy(x); } if(case == UNBOUNDED) { d=new rational[n]; for(int j=0; j < n; ++j) d[j]=0; d[J-1]=1; for(int k=0; k < m; ++k) d[Bindices[k]-1]=-D[k][J]; } if(case != OPTIMAL) return; cost=-Dm[0]; } // Try to find a solution x to sgn(Ax-b)=sgn(s) that minimizes the cost // c^T x, where A is an m x n matrix, x is a vector of n non-negative // numbers, b is a vector of length m, and c is a vector of length n. void operator init(rational[] c, rational[][] A, int[] s, rational[] b) { int m=A.length; if(m == 0) {case=INFEASIBLE; return;} int n=A[0].length; if(n == 0) {case=INFEASIBLE; return;} int count=0; for(int i=0; i < m; ++i) if(s[i] != 0) ++count; rational[][] a=new rational[m][n+count]; for(int i=0; i < m; ++i) { rational[] ai=a[i]; rational[] Ai=A[i]; for(int j=0; j < n; ++j) { ai[j]=Ai[j]; } } int k=0; bool phase1=false; dual=count == m && all(c >= 0); for(int i=0; i < m; ++i) { rational[] ai=a[i]; for(int j=0; j < k; ++j) ai[n+j]=0; int si=s[i]; if(k < count) ai[n+k]=-si; for(int j=k+1; j < count; ++j) ai[n+j]=0; if(si == 0) phase1=true; else { ++k; rational bi=b[i]; if(bi == 0) { if(si == 1) { s[i]=-1; for(int j=0; j < n+count; ++j) ai[j]=-ai[j]; } } else if(dual && si == 1) { b[i]=-bi; s[i]=-1; for(int j=0; j < n+count; ++j) ai[j]=-ai[j]; } else if(si*bi > 0) phase1=true; } } if(dual) phase1=false; rational[] C=concat(c,array(count,rational(0))); simplexInit(C,a,b,count); operator init(C,a,b,phase1); if(case != INFEASIBLE && count > 0) x.delete(n,n+count-1); } } asymptote-3.05/base/plain_pens.asy0000644000000000000000000002103115031566105015743 0ustar rootrootreal labelmargin=0.28; real dotfactor=6; pen solid=linetype(new real[]); pen dotted=linetype(new real[] {0,4}); pen dashed=linetype(new real[] {8,8}); pen longdashed=linetype(new real[] {24,8}); pen dashdotted=linetype(new real[] {8,8,0,8}); pen longdashdotted=linetype(new real[] {24,8,0,8}); pen linetype(string pattern, real offset=0, bool scale=true, bool adjust=true) { return linetype((real[]) split(pattern),offset,scale,adjust); } void defaultpen(real w) {defaultpen(linewidth(w));} pen operator +(pen p, real w) {return p+linewidth(w);} pen operator +(real w, pen p) {return linewidth(w)+p;} pen Dotted(pen p=currentpen) {return linetype(new real[] {0,3})+2*linewidth(p);} pen Dotted=Dotted(); restricted pen squarecap=linecap(0); restricted pen roundcap=linecap(1); restricted pen extendcap=linecap(2); restricted pen miterjoin=linejoin(0); restricted pen roundjoin=linejoin(1); restricted pen beveljoin=linejoin(2); restricted pen zerowinding=fillrule(0); restricted pen evenodd=fillrule(1); bool interior(int windingnumber, pen fillrule) { return windingnumber != undefined && (fillrule(fillrule) == 1 ? windingnumber % 2 == 1 : windingnumber != 0); } restricted pen nobasealign=basealign(0); restricted pen basealign=basealign(1); pen invisible=invisible(); pen thin() {return settings.thin ? linewidth(0) : defaultpen;} pen thick(pen p=currentpen) {return linewidth(linewidth(p));} pen nullpen=linewidth(0)+invisible; pen black=gray(0); pen white=gray(1); pen gray=gray(0.5); pen red=rgb(1,0,0); pen green=rgb(0,1,0); pen blue=rgb(0,0,1); pen Cyan=cmyk(1,0,0,0); pen Magenta=cmyk(0,1,0,0); pen Yellow=cmyk(0,0,1,0); pen Black=cmyk(0,0,0,1); pen cyan=rgb(0,1,1); pen magenta=rgb(1,0,1); pen yellow=rgb(1,1,0); pen palered=rgb(1,0.75,0.75); pen palegreen=rgb(0.75,1,0.75); pen paleblue=rgb(0.75,0.75,1); pen palecyan=rgb(0.75,1,1); pen palemagenta=rgb(1,0.75,1); pen paleyellow=rgb(1,1,0.75); pen palegray=gray(0.95); pen lightred=rgb(1,0.5,0.5); pen lightgreen=rgb(0.5,1,0.5); pen lightblue=rgb(0.5,0.5,1); pen lightcyan=rgb(0.5,1,1); pen lightmagenta=rgb(1,0.5,1); pen lightyellow=rgb(1,1,0.5); pen lightgray=gray(0.9); pen mediumred=rgb(1,0.25,0.25); pen mediumgreen=rgb(0.25,1,0.25); pen mediumblue=rgb(0.25,0.25,1); pen mediumcyan=rgb(0.25,1,1); pen mediummagenta=rgb(1,0.25,1); pen mediumyellow=rgb(1,1,0.25); pen mediumgray=gray(0.75); pen heavyred=rgb(0.75,0,0); pen heavygreen=rgb(0,0.75,0); pen heavyblue=rgb(0,0,0.75); pen heavycyan=rgb(0,0.75,0.75); pen heavymagenta=rgb(0.75,0,0.75); pen lightolive=rgb(0.75,0.75,0); pen heavygray=gray(0.25); pen deepred=rgb(0.5,0,0); pen deepgreen=rgb(0,0.5,0); pen deepblue=rgb(0,0,0.5); pen deepcyan=rgb(0,0.5,0.5); pen deepmagenta=rgb(0.5,0,0.5); pen deepyellow=rgb(0.5,0.5,0); pen deepgray=gray(0.1); pen darkred=rgb(0.25,0,0); pen darkgreen=rgb(0,0.25,0); pen darkblue=rgb(0,0,0.25); pen darkcyan=rgb(0,0.25,0.25); pen darkmagenta=rgb(0.25,0,0.25); pen darkolive=rgb(0.25,0.25,0); pen darkgray=gray(0.05); pen orange=rgb(1,0.5,0); pen fuchsia=rgb(1,0,0.5); pen chartreuse=rgb(0.5,1,0); pen springgreen=rgb(0,1,0.5); pen purple=rgb(0.5,0,1); pen royalblue=rgb(0,0.5,1); // Synonyms: pen salmon=lightred; pen brown=deepred; pen olive=deepyellow; pen darkbrown=darkred; pen pink=palemagenta; pen palegrey=palegray; pen lightgrey=lightgray; pen mediumgrey=mediumgray; pen grey=gray; pen heavygrey=heavygray; pen deepgrey=deepgray; pen darkgrey=darkgray; // Options for handling label overwriting restricted int Allow=0; restricted int Suppress=1; restricted int SuppressQuiet=2; restricted int Move=3; restricted int MoveQuiet=4; pen[] colorPen={red,blue,green,magenta,cyan,orange,purple,brown, deepblue,deepgreen,chartreuse,fuchsia,lightred, lightblue,black,pink,yellow,gray}; colorPen.cyclic=true; pen[] monoPen={solid,dashed,dotted,longdashed,dashdotted, longdashdotted}; monoPen.cyclic=true; pen Pen(int n) { return (settings.gray || settings.bw) ? monoPen[n] : colorPen[n]; } pen Pentype(int n) { return (settings.gray || settings.bw) ? monoPen[n] : monoPen[n]+colorPen[n]; } real dotsize(pen p=currentpen) { return dotfactor*linewidth(p); } pen fontsize(real size) { return fontsize(size,1.2*size); } real labelmargin(pen p=currentpen) { return labelmargin*fontsize(p)+0.5*linewidth(p); } void write(file file=stdout, string s="", pen[] p) { for(int i=0; i < p.length; ++i) write(file,s,p[i],endl); } void usetypescript(string s, string encoding="") { string s="\usetypescript["+s+"]"; if(encoding != "") s +="["+encoding+"]"; texpreamble(s); } pen font(string name, string options="") { // Work around misalignment in ConTeXt switchtobodyfont if font is not found. return fontcommand(settings.tex == "context" ? "\switchtobodyfont["+name+ (options == "" ? "" : ","+options)+ "]\removeunwantedspaces" : "\font\ASYfont="+name+"\ASYfont"); } pen font(string name, real size, string options="") { string s=(string) (size/pt)+"pt"; if(settings.tex == "context") return fontsize(size)+font(name+","+s,options); return fontsize(size)+font(name+" at "+s); } pen font(string encoding, string family, string series, string shape) { return fontcommand("\usefont{"+encoding+"}{"+family+"}{"+series+"}{"+shape+ "}"); } pen AvantGarde(string series="m", string shape="n") { return font("OT1","pag",series,shape); } pen Bookman(string series="m", string shape="n") { return font("OT1","pbk",series,shape); } pen Courier(string series="m", string shape="n") { return font("OT1","pcr",series,shape); } pen Helvetica(string series="m", string shape="n") { return font("OT1","phv",series,shape); } pen NewCenturySchoolBook(string series="m", string shape="n") { return font("OT1","pnc",series,shape); } pen Palatino(string series="m", string shape="n") { return font("OT1","ppl",series,shape); } pen TimesRoman(string series="m", string shape="n") { return font("OT1","ptm",series,shape); } pen ZapfChancery(string series="m", string shape="n") { return font("OT1","pzc",series,shape); } pen Symbol(string series="m", string shape="n") { return font("OT1","psy",series,shape); } pen ZapfDingbats(string series="m", string shape="n") { return font("OT1","pzd",series,shape); } pen squarepen=makepen(shift(-0.5,-0.5)*unitsquare); struct hsv { real h; real v; real s; void operator init(real h, real s, real v) { this.h=h; this.s=s; this.v=v; } void operator init(pen p) { real[] c=colors(rgb(p)); real r=c[0]; real g=c[1]; real b=c[2]; real M=max(r,g,b); real m=min(r,g,b); if(M == m) this.h=0; else { real denom=1/(M-m); if(M == r) { this.h=60*(g-b)*denom; if(g < b) h += 360; } else if(M == g) { this.h=60*(b-r)*denom+120; } else this.h=60*(r-g)*denom+240; } this.s=M == 0 ? 0 : 1-m/M; this.v=M; } // return an rgb pen corresponding to h in [0,360) and s and v in [0,1]. pen rgb() { real H=(h % 360)/60; int i=floor(H) % 6; real f=H-i; real[] V={v,v*(1-s),v*(1-(i % 2 == 0 ? 1-f : f)*s)}; int[] a={0,2,1,1,2,0}; int[] b={2,0,0,2,1,1}; int[] c={1,1,2,0,0,2}; return rgb(V[a[i]],V[b[i]],V[c[i]]); } } pen operator cast(hsv hsv) { return hsv.rgb(); } hsv operator cast(pen p) { return hsv(p); } real[] rgba(pen p) { real[] a=colors(rgb(p)); a.push(opacity(p)); return a; } pen rgb(real[] a) { return rgb(a[0],a[1],a[2]); } pen rgba(real[] a) { return rgb(a[0],a[1],a[2])+opacity(a[3]); } // Return a pen corresponding to a given 6-character RGB hexadecimal string. pen rgb(string s) { int offset=substr(s,0,1) == '#' ? 1 : 0; real value(string s, int i) {return byteinv(hex(substr(s,2i+offset,2)));} return rgb(value(s,0),value(s,1),value(s,2)); } pen RGB(int r, int g, int b) { return rgb(r/255,g/255,b/255); } pen[] operator +(pen[] a, pen b) { return sequence(new pen(int i) {return a[i]+b;},a.length); } pen[] operator +(pen a, pen[] b) { return sequence(new pen(int i) {return a+b[i];},b.length); } // Interpolate an array of pens in rgb space using by default their minimum // opacity. pen mean(pen[] p, real opacity(real[])=min) { if(p.length == 0) return nullpen; real[] a=rgba(p[0]); real[] t=new real[p.length]; t[0]=a[3]; for(int i=1; i < p.length; ++i) { real[] b=rgba(p[i]); a += b; t[i]=b[3]; } a /= p.length; return rgb(a[0],a[1],a[2])+opacity(opacity(t)); } pen[] mean(pen[][] palette, real opacity(real[])=min) { return sequence(new pen(int i) {return mean(palette[i],opacity);}, palette.length); } asymptote-3.05/base/geometry.asy0000644000000000000000000116406015031566105015461 0ustar rootroot// geometry.asy // Copyright (C) 2007 // Author: Philippe IVALDI 2007/09/01 // http://www.piprime.fr/ // This program is free software ; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation ; either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY ; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public License // along with this program ; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // COMMENTARY: // An Asymptote geometry module. // THANKS: // Special thanks to Olivier Guibe for his help in mathematical issues. // BUGS: // CODE: import math; import markers; real Infinity=1.0/(1000*realEpsilon); // A rotation in the direction dir limited to [-90,90] // This is useful for rotating text along a line in the direction dir. private transform rotate(explicit pair dir) { real angle=degrees(dir); if(angle > 90 && angle < 270) angle -= 180; return rotate(angle); } // *=======================================================* // *........................HEADER.........................* /**/ real epsgeo = 10 * sqrt(realEpsilon);/*Variable used in the approximate calculations.*/ /**/ void addMargins(picture pic = currentpicture, real lmargin = 0, real bmargin = 0, real rmargin = lmargin, real tmargin = bmargin, bool rigid = true, bool allObject = true) {/*Add margins to 'pic' with respect to the current bounding box of 'pic'. If 'rigid' is false, margins are added iff an infinite curve will be prolonged on the margin. If 'allObject' is false, fixed - size objects (such as labels and arrowheads) will be ignored.*/ pair m = allObject ? truepoint(pic, SW) : point(pic, SW); pair M = allObject ? truepoint(pic, NE) : point(pic, NE); if(rigid) { draw(m - inverse(pic.calculateTransform()) * (lmargin, bmargin), invisible); draw(M + inverse(pic.calculateTransform()) * (rmargin, tmargin), invisible); } else pic.addBox(m, M, -(lmargin, bmargin), (rmargin, tmargin)); } real approximate(real t) { real ot = t; if(abs(t - ceil(t)) < epsgeo) ot = ceil(t); else if(abs(t - floor(t)) < epsgeo) ot = floor(t); return ot; } real[] approximate(real[] T) { return map(approximate, T); } /**/ real binomial(real n, real k) {/*Return n!/((n - k)!*k!)*/ return gamma(n + 1)/(gamma(n - k + 1) * gamma(k + 1)); } /**/ real rf(real x, real y, real z) {/*Computes Carlson's elliptic integral of the first kind. x, y, and z must be non negative, and at most one can be zero.*/ real ERRTOL = 0.0025, TINY = 1.5e-38, BIG = 3e37, THIRD = 1/3, C1 = 1/24, C2 = 0.1, C3 = 3/44, C4 = 1/14; real alamb, ave, delx, dely, delz, e2, e3, sqrtx, sqrty, sqrtz, xt, yt, zt; if(min(x, y, z) < 0 || min(x + y, x + z, y + z) < TINY || max(x, y, z) > BIG) abort("rf: invalid arguments."); xt = x; yt = y; zt = z; do { sqrtx = sqrt(xt); sqrty = sqrt(yt); sqrtz = sqrt(zt); alamb = sqrtx * (sqrty + sqrtz) + sqrty * sqrtz; xt = 0.25 * (xt + alamb); yt = 0.25 * (yt + alamb); zt = 0.25 * (zt + alamb); ave = THIRD * (xt + yt + zt); delx = (ave - xt)/ave; dely = (ave - yt)/ave; delz = (ave - zt)/ave; } while(max(fabs(delx), fabs(dely), fabs(delz)) > ERRTOL); e2 = delx * dely - delz * delz; e3 = delx * dely * delz; return (1.0 + (C1 * e2 - C2 - C3 * e3) * e2 + C4 * e3)/sqrt(ave); } /**/ real rd(real x, real y, real z) {/*Computes Carlson's elliptic integral of the second kind. x and y must be positive, and at most one can be zero. z must be non negative.*/ real ERRTOL = 0.0015, TINY = 1e-25, BIG = 4.5 * 10.0^21, C1 = (3/14), C2 = (1/6), C3 = (9/22), C4 = (3/26), C5 = (0.25 * C3), C6 = (1.5 * C4); real alamb, ave, delx, dely, delz, ea, eb, ec, ed, ee, fac, sqrtx, sqrty, sqrtz, sum, xt, yt, zt; if (min(x, y) < 0 || min(x + y, z) < TINY || max(x, y, z) > BIG) abort("rd: invalid arguments"); xt = x; yt = y; zt = z; sum = 0; fac = 1; do { sqrtx = sqrt(xt); sqrty = sqrt(yt); sqrtz = sqrt(zt); alamb = sqrtx * (sqrty + sqrtz) + sqrty * sqrtz; sum += fac/(sqrtz * (zt + alamb)); fac = 0.25 * fac; xt = 0.25 * (xt + alamb); yt = 0.25 * (yt + alamb); zt = 0.25 * (zt + alamb); ave = 0.2 * (xt + yt + 3.0 * zt); delx = (ave - xt)/ave; dely = (ave - yt)/ave; delz = (ave - zt)/ave; } while (max(fabs(delx), fabs(dely), fabs(delz)) > ERRTOL); ea = delx * dely; eb = delz * delz; ec = ea - eb; ed = ea - 6 * eb; ee = ed + ec + ec; return 3 * sum + fac * (1.0 + ed * (-C1 + C5 * ed - C6 * delz * ee) +delz * (C2 * ee + delz * (-C3 * ec + delz * C4 * ea)))/(ave * sqrt(ave)); } /**/ real elle(real phi, real k) {/*Legendre elliptic integral of the 2nd kind, evaluated using Carlson's functions RD and RF. The argument ranges are -infinity < phi < +infinity, 0 <= k * sin(phi) <= 1.*/ real result; if (phi >= 0 && phi <= pi/2) { real cc, q, s; s = sin(phi); cc = cos(phi)^2; q = (1 - s * k) * (1 + s * k); result = s * (rf(cc, q, 1) - (s * k)^2 * rd(cc, q, 1)/3); } else if (phi <= pi && phi >= 0) { result = 2 * elle(pi/2, k) - elle(pi - phi, k); } else if (phi <= 3 * pi/2 && phi >= 0) { result = 2 * elle(pi/2, k) + elle(phi - pi, k); } else if (phi <= 2 * pi && phi >= 0) { result = 4 * elle(pi/2, k) - elle(2 * pi - phi, k); } else if (phi >= 0) { int nb = floor(0.5 * phi/pi); result = nb * elle(2 * pi, k) + elle(phi%(2 * pi), k); } else result = -elle(-phi, k); return result; } /**/ pair[] intersectionpoints(pair A, pair B, real a, real b, real c, real d, real f, real g) {/*Intersection points with the line (AB) and the quadric curve a * x^2 + b * x * y + c * y^2 + d * x + f * y + g = 0 given in the default coordinate system*/ pair[] op; real ap = B.y - A.y, bpp = A.x - B.x, cp = A.y * B.x - A.x * B.y; real sol[]; if (abs(ap) > epsgeo) { real aa = ap * c + a * bpp^2/ap - b * bpp, bb = ap * f - bpp * d + 2 * a * bpp * cp/ap - b * cp, cc = ap * g - cp * d + a * cp^2/ap; sol = quadraticroots(aa, bb, cc); for (int i = 0; i < sol.length; ++i) { op.push((-bpp * sol[i]/ap - cp/ap, sol[i])); } } else { real aa = a * bpp, bb = d * bpp - b * cp, cc = g * bpp - cp * f + c * cp^2/bpp; sol = quadraticroots(aa, bb, cc); for (int i = 0; i < sol.length; ++i) { op.push((sol[i], -cp/bpp)); } } return op; } /**/ pair[] intersectionpoints(pair A, pair B, real[] equation) {/*Return the intersection points of the line AB with the conic whose an equation is equation[0] * x^2 + equation[1] * x * y + equation[2] * y^2 + equation[3] * x + equation[4] * y + equation[5] = 0*/ if(equation.length != 6) abort("intersectionpoints: bad length of array for a conic equation."); return intersectionpoints(A, B, equation[0], equation[1], equation[2], equation[3], equation[4], equation[5]); } // *........................HEADER.........................* // *=======================================================* // *=======================================================* // *......................COORDINATES......................* real EPS = sqrt(realEpsilon); /**/ typedef pair convert(pair);/*Function type to convert pair in an other coordinate system.*/ /**/ typedef real abs(pair);/*Function type to calculate modulus of pair.*/ /**/ typedef real dot(pair, pair);/*Function type to calculate dot product.*/ /**/ typedef pair polar(real, real);/*Function type to calculate the coordinates from the polar coordinates.*/ /**/ struct coordsys {/*This structure represents a coordinate system in the plane.*/ /**/ restricted convert relativetodefault = new pair(pair m){return m;};/*Convert a pair given relatively to this coordinate system to the pair relatively to the default coordinate system.*/ /**/ restricted convert defaulttorelative = new pair(pair m){return m;};/*Convert a pair given relatively to the default coordinate system to the pair relatively to this coordinate system.*/ /**/ restricted dot dot = new real(pair m, pair n){return dot(m, n);};/*Return the dot product of this coordinate system.*/ /**/ restricted abs abs = new real(pair m){return abs(m);};/*Return the modulus of a pair in this coordinate system.*/ /**/ restricted polar polar = new pair(real r, real a){return (r * cos(a), r * sin(a));};/*Polar coordinates routine of this coordinate system.*/ /**/ restricted pair O = (0, 0), i = (1, 0), j = (0, 1);/*Origin and units vector.*/ /**/ void init(convert rtd, convert dtr, polar polar, dot dot) {/*The default constructor of the coordinate system.*/ this.relativetodefault = rtd; this.defaulttorelative = dtr; this.polar = polar; this.dot = dot; this.abs = new real(pair m){return sqrt(dot(m, m));};; this.O = rtd((0, 0)); this.i = rtd((1, 0)) - O; this.j = rtd((0, 1)) - O; } }/**/ /**/ bool operator ==(coordsys c1, coordsys c2) {/*Return true iff the coordinate system have the same origin and units vector.*/ return c1.O == c2.O && c1.i == c2.i && c1.j == c2.j; } /**/ coordsys cartesiansystem(pair O = (0, 0), pair i, pair j) {/*Return the Cartesian coordinate system (O, i, j).*/ coordsys R; real[][] P = {{0, 0}, {0, 0}}; real[][] iP; P[0][0] = i.x; P[0][1] = j.x; P[1][0] = i.y; P[1][1] = j.y; iP = inverse(P); real ni = abs(i); real nj = abs(j); real ij = angle(j) - angle(i); pair rtd(pair m) { return O + (P[0][0] * m.x + P[0][1] * m.y, P[1][0] * m.x + P[1][1] * m.y); } pair dtr(pair m) { m-=O; return (iP[0][0] * m.x + iP[0][1] * m.y, iP[1][0] * m.x + iP[1][1] * m.y); } pair polar(real r, real a) { real ca = sin(ij - a)/(ni * sin(ij)); real sa = sin(a)/(nj * sin(ij)); return r * (ca, sa); } real tdot(pair m, pair n) { return m.x * n.x * ni^2 + m.y * n.y * nj^2 + (m.x * n.y + n.x * m.y) * dot(i, j); } R.init(rtd, dtr, polar, tdot); return R; } /**/ void show(picture pic = currentpicture, Label lo = "$O$", Label li = "$\vec{\imath}$", Label lj = "$\vec{\jmath}$", coordsys R, pen dotpen = currentpen, pen xpen = currentpen, pen ypen = xpen, pen ipen = red, pen jpen = ipen, arrowbar arrow = Arrow) {/*Draw the components (O, i, j, x - axis, y - axis) of 'R'.*/ unravel R; drawline(pic, O, O + i, xpen); drawline(pic, O, O + j, ypen); draw(pic, li, O--(O + i), ipen, arrow); Label lj = lj.copy(); lj.align(lj.align, unit(I * j)); draw(pic, lj, O--(O + j), jpen, arrow); draw(pic, lj, O--(O + j), jpen, arrow); dot(pic, O, dotpen); Label lo = lo.copy(); lo.align(lo.align, -2 * dir(O--O + i, O--O + j)); lo.p(dotpen); label(pic, lo, O); } /**/ pair operator /(pair p, coordsys R) {/*Return the xy - coordinates of 'p' relatively to the coordinate system 'R'. For example, if R = cartesiansystem((1, 2), (1, 0), (0, 1)), (0, 0)/R is (-1, -2).*/ return R.defaulttorelative(p); } /**/ pair operator *(coordsys R, pair p) {/*Return the coordinates of 'p' given in the xy - coordinates 'R'. For example, if R = cartesiansystem((1, 2), (1, 0), (0, 1)), R * (0, 0) is (1, 2).*/ return R.relativetodefault(p); } /**/ path operator *(coordsys R, path g) {/*Return the reconstructed path applying R * pair to each node, pre and post control point of 'g'.*/ guide og = R * point(g, 0); real l = length(g); for(int i = 1; i <= l; ++i) { pair P = R * point(g, i); pair post = R * postcontrol(g, i - 1); pair pre = R * precontrol(g, i); if(i == l && (cyclic(g))) og = og..controls post and pre..cycle; else og = og..controls post and pre..P; } return og; } /**/ coordsys operator *(transform t,coordsys R) {/*Provide transform * coordsys. Note that shiftless(t) is applied to R.i and R.j.*/ coordsys oc; oc = cartesiansystem(t * R.O, shiftless(t) * R.i, shiftless(t) * R.j); return oc; } /**/ restricted coordsys defaultcoordsys = cartesiansystem(0, (1, 0), (0, 1));/*One can always refer to the default coordinate system using this constant.*/ /**/ coordsys currentcoordsys = defaultcoordsys;/*The coordinate system used by default.*/ /**/ struct point {/*This structure replaces the pair to embed its coordinate system. For example, if 'P = point(cartesiansystem((1, 2), i, j), (0, 0))', P is equal to the pair (1, 2).*/ /**/ coordsys coordsys;/*The coordinate system of this point.*/ restricted pair coordinates;/*The coordinates of this point relatively to the coordinate system 'coordsys'.*/ restricted real x, y;/*The xpart and the ypart of 'coordinates'.*/ /**/ real m = 1;/*Used to cast mass<->point.*/ void init(coordsys R, pair coordinates, real mass) {/*The constructor.*/ this.coordsys = R; this.coordinates = coordinates; this.x = coordinates.x; this.y = coordinates.y; this.m = mass; } }/**/ /**/ point point(coordsys R, pair p, real m = 1) {/*Return the point which has the coodinates 'p' in the coordinate system 'R' and the mass 'm'.*/ point op; op.init(R, p, m); return op; } /**/ point point(explicit pair p, real m) {/*Return the point which has the coodinates 'p' in the current coordinate system and the mass 'm'.*/ point op; op.init(currentcoordsys, p, m); return op; } /**/ point point(coordsys R, explicit point M, real m = M.m) {/*Return the point of 'R' which has the coordinates of 'M' and the mass 'm'. Do not confuse this routine with the further routine 'changecoordsys'.*/ point op; op.init(R, M.coordinates, M.m); return op; } /**/ point changecoordsys(coordsys R, point M) {/*Return the point 'M' in the coordinate system 'coordsys'. In other words, the returned point marks the same plot as 'M' does.*/ point op; coordsys mco = M.coordsys; op.init(R, R.defaulttorelative(mco.relativetodefault(M.coordinates)), M.m); return op; } /**/ pair coordinates(point M) {/*Return the coordinates of 'M' in its coordinate system.*/ return M.coordinates; } /**/ bool samecoordsys(bool warn = true ... point[] M) {/*Return true iff all the points have the same coordinate system. If 'warn' is true and the coordinate systems are different, a warning is sent.*/ bool ret = true; coordsys t = M[0].coordsys; for (int i = 1; i < M.length; ++i) { ret = (t == M[i].coordsys); if(!ret) break; t = M[i].coordsys; } if(warn && !ret) warning("coodinatesystem", "the coordinate system of two objects are not the same. The operation will be done relative to the default coordinate system."); return ret; } /**/ point[] standardizecoordsys(coordsys R = currentcoordsys, bool warn = true ... point[] M) {/*Return the points with the same coordinate system 'R'. If 'warn' is true and the coordinate systems are different, a warning is sent.*/ point[] op = new point[]; op = M; if(!samecoordsys(warn ... M)) for (int i = 1; i < M.length; ++i) op[i] = changecoordsys(R, M[i]); return op; } /**/ pair operator cast(point P) {/*Cast point to pair.*/ return P.coordsys.relativetodefault(P.coordinates); } /**/ pair[] operator cast(point[] P) {/*Cast point[] to pair[].*/ pair[] op; for (int i = 0; i < P.length; ++i) { op.push((pair)P[i]); } return op; } /**/ point operator cast(pair p) {/*Cast pair to point relatively to the current coordinate system 'currentcoordsys'.*/ return point(currentcoordsys, p); } /**/ point[] operator cast(pair[] p) {/*Cast pair[] to point[] relatively to the current coordinate system 'currentcoordsys'.*/ pair[] op; for (int i = 0; i < p.length; ++i) { op.push((point)p[i]); } return op; } /**/ pair locate(point P) {/*Return the coordinates of 'P' in the default coordinate system.*/ return P.coordsys * P.coordinates; } /**/ point locate(pair p) {/*Return the point in the current coordinate system 'currentcoordsys'.*/ return p; //automatic casting 'pair to point'. } /**/ point operator *(real x, explicit point P) {/*Multiply the coordinates (not the mass) of 'P' by 'x'.*/ return point(P.coordsys, x * P.coordinates, P.m); } /**/ point operator /(explicit point P, real x) {/*Divide the coordinates (not the mass) of 'P' by 'x'.*/ return point(P.coordsys, P.coordinates/x, P.m); } /**/ point operator /(real x, explicit point P) {/**/ return point(P.coordsys, x/P.coordinates, P.m); } /**/ point operator -(explicit point P) {/*-P. The mass is inchanged.*/ return point(P.coordsys, -P.coordinates, P.m); } /**/ point operator +(explicit point P1, explicit point P2) {/*Provide 'point + point'. If the two points haven't the same coordinate system, a warning is sent and the returned point has the default coordinate system 'defaultcoordsys'. The masses are added.*/ point[] P = standardizecoordsys(P1, P2); coordsys R = P[0].coordsys; return point(R, P[0].coordinates + P[1].coordinates, P1.m + P2.m); } /**/ point operator +(explicit point P1, explicit pair p2) {/*Provide 'point + pair'. The pair 'p2' is supposed to be coordinates relatively to the coordinates system of 'P1'. The mass is not changed.*/ coordsys R = currentcoordsys; return point(R, P1.coordinates + point(R, p2).coordinates, P1.m); } point operator +(explicit pair p1, explicit point p2) { return p2 + p1; } /**/ point operator -(explicit point P1, explicit point P2) {/*Provide 'point - point'.*/ return P1 + (-P2); } /**/ point operator -(explicit point P1, explicit pair p2) {/*Provide 'point - pair'. The pair 'p2' is supposed to be coordinates relatively to the coordinates system of 'P1'.*/ return P1 + (-p2); } point operator -(explicit pair p1, explicit point P2) { return p1 + (-P2); } /**/ point operator *(transform t, explicit point P) {/*Provide 'transform * point'. Note that the transforms scale, xscale, yscale and rotate are carried out relatively the default coordinate system 'defaultcoordsys' which is not desired for point defined in an other coordinate system. On can use scale(real, point), xscale(real, point), yscale(real, point), rotate(real, point), scaleO(real), xscaleO(real), yscaleO(real) and rotateO(real) (described further) to change the coordinate system of reference.*/ coordsys R = P.coordsys; return point(R, (t * locate(P))/R, P.m); } /**/ point operator *(explicit point P1, explicit point P2) {/*Provide 'point * point'. The resulted mass is the mass of P2*/ point[] P = standardizecoordsys(P1, P2); coordsys R = P[0].coordsys; return point(R, P[0].coordinates * P[1].coordinates, P2.m); } /**/ point operator *(explicit point P1, explicit pair p2) {/*Provide 'point * pair'. The pair 'p2' is supposed to be the coordinates of the point in the coordinates system of 'P1'. 'pair * point' is also defined.*/ point P = point(P1.coordsys, p2, P1.m); return P1 * P; } point operator *(explicit pair p1, explicit point p2) { return p2 * p1; } /**/ bool operator ==(explicit point M, explicit point N) {/*Provide the test 'M == N' wish returns true iff MN < EPS*/ return abs(locate(M) - locate(N)) < EPS; } /**/ bool operator !=(explicit point M, explicit point N) {/*Provide the test 'M != N' wish return true iff MN >= EPS*/ return !(M == N); } /**/ guide operator cast(point p) {/*Cast point to guide.*/ return locate(p); } /**/ path operator cast(point p) {/*Cast point to path.*/ return locate(p); } /**/ void dot(picture pic = currentpicture, Label L, explicit point Z, align align = NoAlign, string format = defaultformat, pen p = currentpen) {/**/ Label L = L.copy(); L.position(locate(Z)); if(L.s == "") { if(format == "") format = defaultformat; L.s = "("+format(format, Z.x)+", "+format(format, Z.y)+")"; } L.align(align, E); L.p(p); dot(pic, locate(Z), p); add(pic, L); } /**/ real abs(coordsys R, pair m) {/*Return the modulus |m| in the coordinate system 'R'.*/ return R.abs(m); } /**/ real abs(explicit point M) {/*Return the modulus |M| in its coordinate system.*/ return M.coordsys.abs(M.coordinates); } /**/ real length(explicit point M) {/*Return the modulus |M| in its coordinate system (same as 'abs').*/ return M.coordsys.abs(M.coordinates); } /**/ point conj(explicit point M) {/*Conjugate.*/ return point(M.coordsys, conj(M.coordinates), M.m); } /**/ real degrees(explicit point M, coordsys R = M.coordsys, bool warn = true) {/*Return the angle of M (in degrees) relatively to 'R'.*/ return (degrees(locate(M) - R.O, warn) - degrees(R.i))%360; } /**/ real angle(explicit point M, coordsys R = M.coordsys, bool warn = true) {/*Return the angle of M (in radians) relatively to 'R'.*/ return radians(degrees(M, R, warn)); } bool Finite(explicit point z) { return abs(z.x) < Infinity && abs(z.y) < Infinity; } /**/ bool finite(explicit point p) {/*Avoid to compute 'finite((pair)(infinite_point))'.*/ return finite(p.coordinates); } /**/ real dot(point A, point B) {/*Return the dot product in the coordinate system of 'A'.*/ point[] P = standardizecoordsys(A.coordsys, A, B); return P[0].coordsys.dot(P[0].coordinates, P[1].coordinates); } /**/ real dot(point A, explicit pair B) {/*Return the dot product in the default coordinate system. dot(explicit pair, point) is also defined.*/ return dot(locate(A), B); } real dot(explicit pair A, point B) { return dot(A, locate(B)); } /**/ transform rotateO(real a) {/*Rotation around the origin of the current coordinate system.*/ return rotate(a, currentcoordsys.O); } /**/ transform projection(point A, point B) {/*Return the orthogonal projection on the line (AB).*/ pair dir = unit(locate(A) - locate(B)); pair a = locate(A); real cof = dir.x * a.x + dir.y * a.y; real tx = a.x - dir.x * cof; real txx = dir.x^2; real txy = dir.x * dir.y; real ty = a.y - dir.y * cof; real tyx = txy; real tyy = dir.y^2; transform t = (tx, ty, txx, txy, tyx, tyy); return t; } /**/ transform projection(point A, point B, point C, point D, bool safe = false) {/*Return the (CD) parallel projection on (AB). If 'safe = true' and (AB)//(CD) return the identity. If 'safe = false' and (AB)//(CD) return an infinity scaling.*/ pair a = locate(A); pair u = unit(locate(B) - locate(A)); pair v = unit(locate(D) - locate(C)); real c = u.x * a.y - u.y * a.x; real d = (conj(u) * v).y; if (abs(d) < epsgeo) { return safe ? identity() : scale(infinity); } real tx = c * v.x/d; real ty = c * v.y/d; real txx = u.x * v.y/d; real txy = -u.x * v.x/d; real tyx = u.y * v.y/d; real tyy = -u.y * v.x/d; transform t = (tx, ty, txx, txy, tyx, tyy); return t; } /**/ transform scale(real k, point M) {/*Homothety.*/ pair P = locate(M); return shift(P) * scale(k) * shift(-P); } /**/ transform xscale(real k, point M) {/*xscale from 'M' relatively to the x - axis of the coordinate system of 'M'.*/ pair P = locate(M); real a = degrees(M.coordsys.i); return (shift(P) * rotate(a)) * xscale(k) * (rotate(-a) * shift(-P)); } /**/ transform yscale(real k, point M) {/*yscale from 'M' relatively to the y - axis of the coordinate system of 'M'.*/ pair P = locate(M); real a = degrees(M.coordsys.j) - 90; return (shift(P) * rotate(a)) * yscale(k) * (rotate(-a) * shift(-P)); } /**/ transform scale(real k, point A, point B, point C, point D, bool safe = false) {/* (help me for English translation...) If 'safe = true' and (AB)//(CD) return the identity. If 'safe = false' and (AB)//(CD) return a infinity scaling.*/ pair a = locate(A); pair u = unit(locate(B) - locate(A)); pair v = unit(locate(D) - locate(C)); real c = u.x * a.y - u.y * a.x; real d = (conj(u) * v).y; real d = (conj(u) * v).y; if (abs(d) < epsgeo) { return safe ? identity() : scale(infinity); } real tx = (1 - k) * c * v.x/d; real ty = (1 - k) * c * v.y/d; real txx = (1 - k) * u.x * v.y/d + k; real txy = (k - 1) * u.x * v.x/d; real tyx = (1 - k) * u.y * v.y/d; real tyy = (k - 1) * u.y * v.x/d + k; transform t = (tx, ty, txx, txy, tyx, tyy); return t; } /**/ transform scaleO(real x) {/*Homothety from the origin of the current coordinate system.*/ return scale(x, (0, 0)); } /**/ transform xscaleO(real x) {/*xscale from the origin and relatively to the current coordinate system.*/ return scale(x, (0, 0), (0, 1), (0, 0), (1, 0)); } /**/ transform yscaleO(real x) {/*yscale from the origin and relatively to the current coordinate system.*/ return scale(x, (0, 0), (1, 0), (0, 0), (0, 1)); } /**/ struct vector {/*Like a point but casting to pair, adding etc does not take account of the origin of the coordinate system.*/ point v;/*Coordinates as a point (embed coordinate system and pair).*/ }/**/ /**/ point operator cast(vector v) {/*Cast vector 'v' to point 'M' so that OM = v.*/ return v.v; } /**/ vector operator cast(pair v) {/*Cast pair to vector relatively to the current coordinate system 'currentcoordsys'.*/ vector ov; ov.v = point(currentcoordsys, v); return ov; } /**/ vector operator cast(explicit point v) {/*A point can be interpreted like a vector using the code '(vector)a_point'.*/ vector ov; ov.v = v; return ov; } /**/ pair operator cast(explicit vector v) {/*Cast vector to pair (the coordinates of 'v' in the default coordinate system).*/ return locate(v.v) - v.v.coordsys.O; } /**/ align operator cast(vector v) {/*Cast vector to align.*/ return (pair)v; } /**/ vector vector(coordsys R = currentcoordsys, pair v) {/*Return the vector of 'R' which has the coordinates 'v'.*/ vector ov; ov.v = point(R, v); return ov; } /**/ vector vector(point M) {/*Return the vector OM, where O is the origin of the coordinate system of 'M'. Useful to write 'vector(P - M);' instead of '(vector)(P - M)'.*/ return M; } /**/ point point(explicit vector u) {/*Return the point M so that OM = u, where O is the origin of the coordinate system of 'u'.*/ return u.v; } /**/ pair locate(explicit vector v) {/*Return the coordinates of 'v' in the default coordinate system (like casting vector to pair).*/ return (pair)v; } /**/ void show(Label L, vector v, pen p = currentpen, arrowbar arrow = Arrow) {/*Draw the vector v (from the origin of its coordinate system).*/ coordsys R = v.v.coordsys; draw(L, R.O--v.v, p, arrow); } /**/ vector changecoordsys(coordsys R, vector v) {/*Return the vector 'v' relatively to coordinate system 'R'.*/ vector ov; ov.v = point(R, (locate(v) + R.O)/R); return ov; } /**/ vector operator *(real x, explicit vector v) {/*Provide real * vector.*/ return x * v.v; } /**/ vector operator /(explicit vector v, real x) {/*Provide vector/real*/ return v.v/x; } /**/ vector operator *(transform t, explicit vector v) {/*Provide transform * vector.*/ return t * v.v; } /**/ vector operator *(explicit point M, explicit vector v) {/*Provide point * vector*/ return M * v.v; } /**/ point operator +(point M, explicit vector v) {/*Return 'M' shifted by 'v'.*/ return shift(locate(v)) * M; } /**/ point operator -(point M, explicit vector v) {/*Return 'M' shifted by '-v'.*/ return shift(-locate(v)) * M; } /**/ vector operator -(explicit vector v) {/*Provide -v.*/ return -v.v; } /**/ point operator +(explicit pair m, explicit vector v) {/*The pair 'm' is supposed to be the coordinates of a point in the current coordinates system 'currentcoordsys'. Return this point shifted by the vector 'v'.*/ return locate(m) + v; } /**/ point operator -(explicit pair m, explicit vector v) {/*The pair 'm' is supposed to be the coordinates of a point in the current coordinates system 'currentcoordsys'. Return this point shifted by the vector '-v'.*/ return m + (-v); } /**/ vector operator +(explicit vector v1, explicit vector v2) {/*Provide vector + vector. If the two vector haven't the same coordinate system, the returned vector is relative to the default coordinate system (without warning).*/ coordsys R = v1.v.coordsys; if(samecoordsys(false, v1, v2)){R = defaultcoordsys;} return vector(R, (locate(v1) + locate(v2))/R); } /**/ vector operator -(explicit vector v1, explicit vector v2) {/*Provide vector - vector. If the two vector haven't the same coordinate system, the returned vector is relative to the default coordinate system (without warning).*/ return v1 + (-v2); } /**/ bool operator ==(explicit vector u, explicit vector v) {/*Return true iff |u - v|*/ return abs(u - v) < EPS; } /**/ bool collinear(vector u, vector v) {/*Return 'true' iff the vectors 'u' and 'v' are collinear.*/ return abs(ypart((conj((pair)u) * (pair)v))) < EPS; } /**/ vector unit(point M) {/*Return the unit vector according to the modulus of its coordinate system.*/ return M/abs(M); } /**/ vector unit(vector u) {/*Return the unit vector according to the modulus of its coordinate system.*/ return u.v/abs(u.v); } /**/ real degrees(vector v, coordsys R = v.v.coordsys, bool warn = true) {/*Return the angle of 'v' (in degrees) relatively to 'R'.*/ return (degrees(locate(v), warn) - degrees(R.i))%360; } /**/ real angle(explicit vector v, coordsys R = v.v.coordsys, bool warn = true) {/*Return the angle of 'v' (in radians) relatively to 'R'.*/ return radians(degrees(v, R, warn)); } /**/ vector conj(explicit vector u) {/*Conjugate.*/ return conj(u.v); } /**/ transform rotate(explicit vector dir) {/*A rotation in the direction 'dir' limited to [-90, 90] This is useful for rotating text along a line in the direction dir. rotate(explicit point dir) is also defined. */ return rotate(locate(dir)); } transform rotate(explicit point dir){return rotate(locate(vector(dir)));} // *......................COORDINATES......................* // *=======================================================* // *=======================================================* // *.........................BASES.........................* /**/ point origin = point(defaultcoordsys, (0, 0));/*The origin of the current coordinate system.*/ /**/ point origin(coordsys R = currentcoordsys) {/*Return the origin of the coordinate system 'R'.*/ return point(R, (0, 0)); //use automatic casting; } /**/ real linemargin = 0;/*Margin used to draw lines.*/ /**/ real linemargin() {/*Return the margin used to draw lines.*/ return linemargin; } /**/ pen addpenline = squarecap;/*Add this property to the drawing pen of "finish" lines.*/ pen addpenline(pen p) { return addpenline + p; } /**/ pen addpenarc = squarecap;/*Add this property to the drawing pen of arcs.*/ pen addpenarc(pen p) {return addpenarc + p;} /**/ string defaultmassformat = "$\left(%L;%.4g\right)$";/*Format used to construct the default label of masses.*/ /**/ int sgnd(real x) {/*Return the -1 if x < 0, 1 if x >= 0.*/ return (x == 0) ? 1 : sgn(x); } int sgnd(int x) { return (x == 0) ? 1 : sgn(x); } /**/ bool defined(point P) {/*Return true iff the coordinates of 'P' are finite.*/ return finite(P.coordinates); } /**/ bool onpath(picture pic = currentpicture, path g, point M, pen p = currentpen) {/*Return true iff 'M' is on the path drawn with the pen 'p' in 'pic'.*/ transform t = inverse(pic.calculateTransform()); return intersect(g, shift(locate(M)) * scale(linewidth(p)/2) * t * unitcircle).length > 0; } /**/ bool sameside(point M, point N, point O) {/*Return 'true' iff 'M' and 'N' are same side of the point 'O'.*/ pair m = M, n = N, o = O; return dot(m - o, n - o) >= -epsgeo; } /**/ bool between(point M, point O, point N) {/*Return 'true' iff 'O' is between 'M' and 'N'.*/ return (!sameside(N, M, O) || M == O || N == O); } typedef path pathModifier(path); pathModifier NoModifier = new path(path g){return g;}; private void Drawline(picture pic = currentpicture, Label L = "", pair P, bool dirP = true, pair Q, bool dirQ = true, align align = NoAlign, pen p = currentpen, arrowbar arrow = None, Label legend = "", marker marker = nomarker, pathModifier pathModifier = NoModifier) {/* Add the two parameters 'dirP' and 'dirQ' to the native routine 'drawline' of the module 'math'. Segment [PQ] will be prolonged in direction of P if 'dirP = true', in direction of Q if 'dirQ = true'. If 'dirP = dirQ = true', the behavior is that of the native 'drawline'. Add all the other parameters of 'Draw'.*/ pic.add(new void (frame f, transform t, transform T, pair m, pair M) { picture opic; // Reduce the bounds by the size of the pen. m -= min(p) - (linemargin(), linemargin()); M -= max(p) + (linemargin(), linemargin()); // Calculate the points and direction vector in the transformed space. t = t * T; pair z = t * P; pair q = t * Q; pair v = q - z; // path g; pair ptp, ptq; real cp = dirP ? 1:0; real cq = dirQ ? 1:0; // Handle horizontal and vertical lines. if(v.x == 0) { if(m.x <= z.x && z.x <= M.x) if (dot(v, m - z) < 0) { ptp = (z.x, z.y + cp * (m.y - z.y)); ptq = (z.x, q.y + cq * (M.y - q.y)); } else { ptq = (z.x, q.y + cq * (m.y - q.y)); ptp = (z.x, z.y + cp * (M.y - z.y)); } } else if(v.y == 0) { if (dot(v, m - z) < 0) { ptp = (z.x + cp * (m.x - z.x), z.y); ptq = (q.x + cq * (M.x - q.x), z.y); } else { ptq = (q.x + cq * (m.x - q.x), z.y); ptp = (z.x + cp * (M.x - z.x), z.y); } } else { // Calculate the maximum and minimum t values allowed for the // parametric equation z + t * v real mx = (m.x - z.x)/v.x, Mx = (M.x - z.x)/v.x; real my = (m.y - z.y)/v.y, My = (M.y - z.y)/v.y; real tmin = max(v.x > 0 ? mx : Mx, v.y > 0 ? my : My); real tmax = min(v.x > 0 ? Mx : mx, v.y > 0 ? My : my); pair pmin = z + tmin * v; pair pmax = z + tmax * v; if(tmin <= tmax) { ptp = z + cp * tmin * v; ptq = z + (cq == 0 ? v:tmax * v); } } path g = ptp--ptq; if (length(g)>0) { if(L.s != "") { Label lL = L.copy(); if(L.defaultposition) lL.position(Relative(.9)); lL.p(p); lL.out(opic, g); } g = pathModifier(g); if(linetype(p).length == 0){ pair m = midpoint(g); pen tp; tp = dirP ? p : addpenline(p); draw(opic, pathModifier(m--ptp), tp); tp = dirQ ? p : addpenline(p); draw(opic, pathModifier(m--ptq), tp); } else { draw(opic, g, p); } marker.markroutine(opic, marker.f, g); arrow(opic, g, p, NoMargin); add(f, opic.fit()); } }); } /**/ void clipdraw(picture pic = currentpicture, Label L = "", path g, align align = NoAlign, pen p = currentpen, arrowbar arrow = None, arrowbar bar = None, real xmargin = 0, real ymargin = xmargin, Label legend = "", marker marker = nomarker) {/*Draw the path 'g' on 'pic' clipped to the bounding box of 'pic'.*/ if(L.s != "") { picture tmp; label(tmp, L, g, p); add(pic, tmp); } pic.add(new void (frame f, transform t, transform T, pair m, pair M) { // Reduce the bounds by the size of the pen and the margins. m += min(p) + (xmargin, ymargin); M -= max(p) + (xmargin, ymargin); path bound = box(m, M); picture tmp; draw(tmp, "", t * T * g, align, p, arrow, bar, NoMargin, legend, marker); clip(tmp, bound); add(f, tmp.fit()); }); } /**/ void distance(picture pic = currentpicture, Label L = "", point A, point B, bool rotated = true, real offset = 3mm, pen p = currentpen, pen joinpen = invisible, arrowbar arrow = Arrows(NoFill)) {/*Draw arrow between A and B (from FAQ).*/ pair A = A, B = B; path g = A--B; transform Tp = shift(-offset * unit(B - A) * I); pic.add(new void(frame f, transform t) { picture opic; path G = Tp * t * g; transform id = identity(); transform T = rotated ? rotate(B - A) : id; Label L = L.copy(); L.align(L.align, Center); if(abs(ypart((conj(A - B) * L.align.dir))) < epsgeo && L.filltype == NoFill) L.filltype = UnFill(1); draw(opic, T * L, G, p, arrow, Bars, PenMargins); pair Ap = t * A, Bp = t * B; draw(opic, (Ap--Tp * Ap)^^(Bp--Tp * Bp), joinpen); add(f, opic.fit()); }, true); pic.addBox(min(g), max(g), Tp * min(p), Tp * max(p)); } /**/ real perpfactor = 1;/*Factor for drawing perpendicular symbol.*/ /**/ void perpendicularmark(picture pic = currentpicture, point z, explicit pair align, explicit pair dir = E, real size = 0, pen p = currentpen, margin margin = NoMargin, filltype filltype = NoFill) {/*Draw a perpendicular symbol at z aligned in the direction align relative to the path z--z + dir. dir(45 + n * 90), where n in N*, are common values for 'align'.*/ p = squarecap + miterjoin + p; if(size == 0) size = perpfactor * 3mm + linewidth(p) / 2; frame apic; pair d1 = size * align * unit(dir) * dir(-45); pair d2 = I * d1; path g = d1--d1 + d2--d2; g = margin(g, p).g; draw(apic, g, p); if(filltype != NoFill) filltype.fill(apic, (relpoint(g, 0) - relpoint(g, 0.5)+ relpoint(g, 1))--g--cycle, p + solid); add(pic, apic, locate(z)); } /**/ void perpendicularmark(picture pic = currentpicture, point z, vector align, vector dir = E, real size = 0, pen p = currentpen, margin margin = NoMargin, filltype filltype = NoFill) {/*Draw a perpendicular symbol at z aligned in the direction align relative to the path z--z + dir. dir(45 + n * 90), where n in N, are common values for 'align'.*/ perpendicularmark(pic, z, (pair)align, (pair)dir, size, p, margin, filltype); } /**/ void perpendicularmark(picture pic = currentpicture, point z, explicit pair align, path g, real size = 0, pen p = currentpen, margin margin = NoMargin, filltype filltype = NoFill) {/*Draw a perpendicular symbol at z aligned in the direction align relative to the path z--z + dir(g, 0). dir(45 + n * 90), where n in N, are common values for 'align'.*/ perpendicularmark(pic, z, align, dir(g, 0), size, p, margin, filltype); } /**/ void perpendicularmark(picture pic = currentpicture, point z, vector align, path g, real size = 0, pen p = currentpen, margin margin = NoMargin, filltype filltype = NoFill) {/*Draw a perpendicular symbol at z aligned in the direction align relative to the path z--z + dir(g, 0). dir(45 + n * 90), where n in N, are common values for 'align'.*/ perpendicularmark(pic, z, (pair)align, dir(g, 0), size, p, margin, filltype); } /**/ void markrightangle(picture pic = currentpicture, point A, point O, point B, real size = 0, pen p = currentpen, margin margin = NoMargin, filltype filltype = NoFill) {/*Mark the angle AOB with a perpendicular symbol.*/ pair Ap = A, Bp = B, Op = O; pair dir = Ap - Op; real a1 = degrees(dir); pair align = rotate(-a1) * dir(Op--Ap, Op--Bp); perpendicularmark(pic = pic, z = O, align = align, dir = dir, size = size, p = p, margin = margin, filltype = filltype); } /**/ bool simeq(point A, point B, real fuzz = epsgeo) {/*Return true iff abs(A - B) < fuzz. This routine is used internally to know if two points are equal, in particular by the operator == in 'point == point'.*/ return (abs(A - B) < fuzz); } bool simeq(point a, real b, real fuzz = epsgeo) { coordsys R = a.coordsys; return (abs(a - point(R, ((pair)b)/R)) < fuzz); } /**/ pair attract(pair m, path g, real fuzz = 0) {/*Return the nearest point (A PAIR) of 'm' which is on the path g. 'fuzz' is the argument 'fuzz' of 'intersect'.*/ if(intersect(m, g, fuzz).length > 0) return m; pair p; real step = 1, r = 0; real[] t; static real eps = sqrt(realEpsilon); do {// Find a radius for intersection r += step; t = intersect(shift(m) * scale(r) * unitcircle, g); } while(t.length <= 0); p = point(g, t[1]); real rm = 0, rM = r; while(rM - rm > eps) { r = (rm + rM)/2; t = intersect(shift(m) * scale(r) * unitcircle, g, fuzz); if(t.length <= 0) { rm = r; } else { rM = r; p = point(g, t[1]); } } return p; } /**/ point attract(point M, path g, real fuzz = 0) {/*Return the nearest point (A POINT) of 'M' which is on the path g. 'fuzz' is the argument 'fuzz' of 'intersect'.*/ return point(M.coordsys, attract(locate(M), g)/M.coordsys); } /**/ real[] intersect(path g, explicit pair p, real fuzz = 0) {/**/ fuzz = fuzz <= 0 ? sqrt(realEpsilon) : fuzz; real[] or; real r = realEpsilon; do{ or = intersect(g, shift(p) * scale(r) * unitcircle, fuzz); r *= 2; } while(or.length == 0); return or; } /**/ real[] intersect(path g, explicit point P, real fuzz = epsgeo) {/**/ return intersect(g, locate(P), fuzz); } // *.........................BASES.........................* // *=======================================================* // *=======================================================* // *.........................LINES.........................* /**/ struct line {/*This structure provides the objects line, semi - line and segment oriented from A to B. All the calculus with this structure will be as exact as Asymptote can do. For a full precision, you must not cast 'line' to 'path' excepted for drawing routines.*/ /**/ restricted point A,B;/*Two line's points with same coordinate system.*/ bool extendA,extendB;/*If true,extend 'l' in direction of A (resp. B).*/ restricted vector u,v;/*u = unit(AB) = direction vector,v = normal vector.*/ restricted real a,b,c;/*Coefficients of the equation ax + by + c = 0 in the coordinate system of 'A'.*/ restricted real slope, origin;/*Slope and ordinate at the origin.*/ /**/ line copy() {/*Copy a line in a new instance.*/ line l = new line; l.A = A; l.B = B; l.a = a; l.b = b; l.c = c; l.slope = slope; l.origin = origin; l.u = u; l.v = v; l.extendA = extendA; l.extendB = extendB; return l; } /**/ void init(point A, bool extendA = true, point B, bool extendB = true) {/*Initialize line. If 'extendA' is true, the "line" is infinite in the direction of A.*/ point[] P = standardizecoordsys(A, B); this.A = P[0]; this.B = P[1]; this.a = B.y - A.y; this.b = A.x - B.x; this.c = A.y * B.x - A.x * B.y; this.slope= (this.b == 0) ? infinity : -this.a/this.b; this.origin = (this.b == 0) ? (this.c == 0) ? 0:infinity : -this.c/this.b; this.u = unit(P[1]-P[0]); // int tmp = sgnd(this.slope); // this.u = (dot((pair)this.u, N) >= 0) ? tmp * this.u : -tmp * this.u; this.v = rotate(90, point(P[0].coordsys, (0, 0))) * this.u; this.extendA = extendA; this.extendB = extendB; } }/**/ /**/ line line(point A, bool extendA = true, point B, bool extendB = true) {/*Return the line passing through 'A' and 'B'. If 'extendA' is true, the "line" is infinite in the direction of A. A "line" can be half-line or segment.*/ if (A == B) abort("line: the points must be distinct."); line l; l.init(A, extendA, B, extendB); return l; } /**/ struct segment {/*.*/ restricted point A, B;// Extremity. restricted vector u, v;// u = direction vector, v = normal vector. restricted real a, b, c;// Coefficients of the equation ax + by + c = 0 restricted real slope, origin; segment copy() { segment s = new segment; s.A = A; s.B = B; s.a = a; s.b = b; s.c = c; s.slope = slope; s.origin = origin; s.u = u; s.v = v; return s; } void init(point A, point B) { line l; l.init(A, B); this.A = l.A; this.B = l.B; this.a = l.a; this.b = l.b; this.c = l.c; this.slope = l.slope; this.origin = l.origin; this.u = l.u; this.v = l.v; } }/**/ /**/ segment segment(point A, point B) {/*Return the segment whose the extremities are A and B.*/ segment s; s.init(A, B); return s; } /**/ real length(segment s) {/*Return the length of 's'.*/ return abs(s.A - s.B); } /**/ line operator cast(segment s) {/*A segment is casted to a "finite line".*/ return line(s.A, false, s.B, false); } /**/ segment operator cast(line l) {/*Cast line 'l' to segment [l.A l.B].*/ return segment(l.A, l.B); } path operator ecast(segment s) { return s.A -- s.B; } /**/ line operator *(transform t, line l) {/*Provide transform * line*/ return line(t * l.A, l.extendA, t * l.B, l.extendB); } /**/ line operator /(line l, real x) {/*Provide l/x. Return the line passing through l.A/x and l.B/x.*/ return line(l.A/x, l.extendA, l.B/x, l.extendB); } line operator /(line l, int x){return line(l.A/x, l.B/x);} /**/ line operator *(real x, line l) {/*Provide x * l. Return the line passing through x * l.A and x * l.B.*/ return line(x * l.A, l.extendA, x * l.B, l.extendB); } line operator *(int x, line l){return line(x * l.A, l.extendA, x * l.B, l.extendB);} /**/ line operator *(point M, line l) {/*Provide point * line. Return the line passing through unit(M) * l.A and unit(M) * l.B.*/ return line(unit(M) * l.A, l.extendA, unit(M) * l.B, l.extendB); } /**/ line operator +(line l, vector u) {/*Provide line + vector (and so line + point). Return the line 'l' shifted by 'u'.*/ return line(l.A + u, l.extendA, l.B + u, l.extendB); } /**/ line operator -(line l, vector u) {/*Provide line - vector (and so line - point). Return the line 'l' shifted by '-u'.*/ return line(l.A - u, l.extendA, l.B - u, l.extendB); } /**/ line[] operator ^^(line l1, line l2) {/*Provide line^^line. Return the line array {l1, l2}.*/ line[] ol; ol.push(l1); ol.push(l2); return ol; } /**/ line[] operator ^^(line l1, line[] l2) {/*Provide line^^line[]. Return the line array {l1, l2[0], l2[1]...}. line[]^^line is also defined.*/ line[] ol; ol.push(l1); for (int i = 0; i < l2.length; ++i) { ol.push(l2[i]); } return ol; } line[] operator ^^(line[] l2, line l1) { line[] ol = l2; ol.push(l1); return ol; } /**/ line[] operator ^^(line l1[], line[] l2) {/*Provide line[]^^line[]. Return the line array {l1[0], l1[1], ..., l2[0], l2[1], ...}.*/ line[] ol = l1; for (int i = 0; i < l2.length; ++i) { ol.push(l2[i]); } return ol; } /**/ bool sameside(point M, point P, line l) {/*Return 'true' iff 'M' and 'N' are same side of the line (or on the line) 'l'.*/ pair A = l.A, B = l.B, m = M, p = P; pair mil = (A + B)/2; pair mA = rotate(90, mil) * A; pair mB = rotate(-90, mil) * A; return (abs(m - mA) <= abs(m - mB)) == (abs(p - mA) <= abs(p - mB)); // transform proj = projection(l.A, l.B); // point Mp = proj * M; // point Pp = proj * P; // dot(Mp);dot(Pp); // return dot(locate(Mp - M), locate(Pp - P)) >= 0; } /**/ line line(segment s) {/*Return the line passing through 's.A' and 's.B'.*/ return line(s.A, s.B); } /**/ segment segment(line l) {/*Return the segment whose extremities are 'l.A' and 'l.B'.*/ return segment(l.A, l.B); } /**/ point midpoint(segment s) {/*Return the midpoint of 's'.*/ return 0.5 * (s.A + s.B); } /**/ void write(explicit line l) {/*Write some informations about 'l'.*/ write("A = "+(string)((pair)l.A)); write("Extend A = "+(l.extendA ? "true" : "false")); write("B = "+(string)((pair)l.B)); write("Extend B = "+(l.extendB ? "true" : "false")); write("u = "+(string)((pair)l.u)); write("v = "+(string)((pair)l.v)); write("a = "+(string) l.a); write("b = "+(string) l.b); write("c = "+(string) l.c); write("slope = "+(string) l.slope); write("origin = "+(string) l.origin); } /**/ void write(explicit segment s) {/*Write some informations about 's'.*/ write("A = "+(string)((pair)s.A)); write("B = "+(string)((pair)s.B)); write("u = "+(string)((pair)s.u)); write("v = "+(string)((pair)s.v)); write("a = "+(string) s.a); write("b = "+(string) s.b); write("c = "+(string) s.c); write("slope = "+(string) s.slope); write("origin = "+(string) s.origin); } /**/ bool operator ==(line l1, line l2) {/*Provide the test 'line == line'.*/ return (collinear(l1.u, l2.u) && abs(ypart((locate(l1.A) - locate(l1.B))/(locate(l1.A) - locate(l2.B)))) < epsgeo && l1.extendA == l2.extendA && l1.extendB == l2.extendB); } /**/ bool operator !=(line l1, line l2) {/*Provide the test 'line != line'.*/ return !(l1 == l2); } /**/ bool operator @(point m, line l) {/*Provide the test 'point @ line'. Return true iff 'm' is on the 'l'.*/ point M = changecoordsys(l.A.coordsys, m); if (abs(l.a * M.x + l.b * M.y + l.c) >= epsgeo) return false; if (l.extendA && l.extendB) return true; if (!l.extendA && !l.extendB) return between(l.A, M, l.B); if (l.extendA) return sameside(M, l.A, l.B); return sameside(M, l.B, l.A); } /**/ coordsys coordsys(line l) {/*Return the coordinate system in which 'l' is defined.*/ return l.A.coordsys; } /**/ line reverse(line l) {/*Permute the points 'A' and 'B' of 'l' and so its orientation.*/ return line(l.B, l.extendB, l.A, l.extendA); } /**/ line extend(line l) {/*Return the infinite line passing through 'l.A' and 'l.B'.*/ line ol = l.copy(); ol.extendA = true; ol.extendB = true; return ol; } /**/ line complementary(explicit line l) {/*Return the complementary of a half-line with respect of the full line 'l'.*/ if (l.extendA && l.extendB) abort("complementary: the parameter is not a half-line."); point origin = l.extendA ? l.B : l.A; point ptdir = l.extendA ? rotate(180, l.B) * l.A : rotate(180, l.A) * l.B; return line(origin, false, ptdir); } /**/ line[] complementary(explicit segment s) {/*Return the two half-lines of origin 's.A' and 's.B' respectively.*/ line[] ol = new line[2]; ol[0] = complementary(line(s.A, false, s.B)); ol[1] = complementary(line(s.A, s.B, false)); return ol; } /**/ line Ox(coordsys R = currentcoordsys) {/*Return the x-axis of 'R'.*/ return line(point(R, (0, 0)), point(R, E)); } /**/ restricted line Ox = Ox();/*the x-axis of the default coordinate system.*/ /**/ line Oy(coordsys R = currentcoordsys) {/*Return the y-axis of 'R'.*/ return line(point(R, (0, 0)), point(R, N)); } /**/ restricted line Oy = Oy();/*the y-axis of the default coordinate system.*/ /**/ line line(real a, point A = point(currentcoordsys, (0, 0))) {/*Return the line passing through 'A' with an angle (in the coordinate system of A) 'a' in degrees. line(point, real) is also defined.*/ return line(A, A + point(A.coordsys, A.coordsys.polar(1, radians(a)))); } line line(point A = point(currentcoordsys, (0, 0)), real a) { return line(a, A); } line line(int a, point A = point(currentcoordsys, (0, 0))) { return line((real)a, A); } /**/ line line(coordsys R = currentcoordsys, real slope, real origin) {/*Return the line defined by slope and y-intercept relative to 'R'.*/ if (slope == infinity || slope == -infinity) abort("The slope is infinite. Please, use the routine 'vline'."); return line(point(R, (0, origin)), point(R, (1, origin + slope))); } /**/ line line(coordsys R = currentcoordsys, real a, real b, real c) {/*Retrun the line defined by equation relative to 'R'.*/ if (a == 0 && b == 0) abort("line: inconsistent equation..."); pair M; M = (a == 0) ? (0, -c/b) : (-c/a, 0); return line(point(R, M), point(R, M + (-b, a))); } /**/ line vline(coordsys R = currentcoordsys) {/*Return a vertical line in 'R' passing through the origin of 'R'.*/ point P = point(R, (0, 0)); point PP = point(R, (R.O + N)/R); return line(P, PP); } /**/ restricted line vline = vline();/*The vertical line in the current coordinate system passing through the origin of this system.*/ /**/ line hline(coordsys R = currentcoordsys) {/*Return a horizontal line in 'R' passing through the origin of 'R'.*/ point P = point(R, (0, 0)); point PP = point(R, (R.O + E)/R); return line(P, PP); } /**/ line hline = hline();/*The horizontal line in the current coordinate system passing through the origin of this system.*/ /**/ line changecoordsys(coordsys R, line l) {/*Return the line 'l' in the coordinate system 'R'.*/ point A = changecoordsys(R, l.A); point B = changecoordsys(R, l.B); return line(A, B); } /**/ transform scale(real k, line l1, line l2, bool safe = false) {/*Return the dilatation with respect to 'l1' in the direction of 'l2'.*/ return scale(k, l1.A, l1.B, l2.A, l2.B, safe); } /**/ transform reflect(line l) {/*Return the reflect about the line 'l'.*/ return reflect((pair)l.A, (pair)l.B); } /**/ transform reflect(line l1, line l2, bool safe = false) {/*Return the reflect about the line 'l1' in the direction of 'l2'.*/ return scale(-1.0, l1, l2, safe); } /**/ point[] intersectionpoints(line l, path g) {/*Return all points of intersection of the line 'l' with the path 'g'.*/ // TODO utiliser la version 1.44 de intersections(path g, pair p, pair q) // real [] t = intersections(g, l.A, l.B); // coordsys R = coordsys(l); // return sequence(new point(int n){return point(R, point(g, t[n])/R);}, t.length); real [] t; pair[] op; pair A = l.A; pair B = l.B; real dy = B.y - A.y, dx = A.x - B.x, lg = length(g); for (int i = 0; i < lg; ++i) { pair z0 = point(g, i), z1 = point(g, i + 1), c0 = postcontrol(g, i), c1 = precontrol(g, i + 1), t3 = z1 - z0 - 3 * c1 + 3 * c0, t2 = 3 * z0 + 3 * c1 - 6 * c0, t1 = 3 * c0 - 3z0; real a = dy * t3.x + dx * t3.y, b = dy * t2.x + dx * t2.y, c = dy * t1.x + dx * t1.y, d = dy * z0.x + dx * z0.y + A.y * B.x - A.x * B.y; t = cubicroots(a, b, c, d); for (int j = 0; j < t.length; ++j) if ( t[j]>=0 && ( t[j]<1 || ( t[j] == 1 && (i == lg - 1) && !cyclic(g) ) ) ) { op.push(point(g, i + t[j])); } } point[] opp; for (int i = 0; i < op.length; ++i) opp.push(point(coordsys(l), op[i]/coordsys(l))); return opp; } /**/ point intersectionpoint(line l1, line l2) {/*Return the point of intersection of line 'l1' with 'l2'. If 'l1' and 'l2' have an infinity or none point of intersection, this routine return (infinity, infinity).*/ point[] P = standardizecoordsys(l1.A, l1.B, l2.A, l2.B); coordsys R = P[0].coordsys; pair p = extension(P[0], P[1], P[2], P[3]); if(finite(p)){ point p = point(R, p/R); if (p @ l1 && p @ l2) return p; } return point(R, (infinity, infinity)); } /**/ line parallel(point M, line l) {/*Return the line parallel to 'l' passing through 'M'.*/ point A, B; if (M.coordsys != coordsys(l)) { A = changecoordsys(M.coordsys, l.A); B = changecoordsys(M.coordsys, l.B); } else {A = l.A;B = l.B;} return line(M, M - A + B); } /**/ line parallel(point M, explicit vector dir) {/*Return the line of direction 'dir' and passing through 'M'.*/ return line(M, M + locate(dir)); } /**/ line parallel(point M, explicit pair dir) {/*Return the line of direction 'dir' and passing through 'M'.*/ return line(M, M + vector(currentcoordsys, dir)); } /**/ bool parallel(line l1, line l2, bool strictly = false) {/*Return 'true' if 'l1' and 'l2' are (strictly ?) parallel.*/ bool coll = collinear(l1.u, l2.u); return strictly ? coll && (l1 != l2) : coll; } /**/ bool concurrent(... line[] l) {/*Returns true if all the lines 'l' are concurrent.*/ if (l.length < 3) abort("'concurrent' needs at least for three lines ..."); pair point = intersectionpoint(l[0], l[1]); bool conc; for (int i = 2; i < l.length; ++i) { pair pt = intersectionpoint(l[i - 1], l[i]); conc = simeq(pt, point); if (!conc) break; } return conc; } /**/ transform projection(line l) {/*Return the orthogonal projection on 'l'.*/ return projection(l.A, l.B); } /**/ transform projection(line l1, line l2, bool safe = false) {/*Return the projection on (AB) in parallel of (CD). If 'safe = true' and (l1)//(l2) return the identity. If 'safe = false' and (l1)//(l2) return a infinity scaling.*/ return projection(l1.A, l1.B, l2.A, l2.B, safe); } /**/ transform vprojection(line l, bool safe = false) {/*Return the projection on 'l' in parallel of N--S. If 'safe' is 'true' the projected point keeps the same place if 'l' is vertical.*/ coordsys R = defaultcoordsys; return projection(l, line(point(R, N), point(R, S)), safe); } /**/ transform hprojection(line l, bool safe = false) {/*Return the projection on 'l' in parallel of E--W. If 'safe' is 'true' the projected point keeps the same place if 'l' is horizontal.*/ coordsys R = defaultcoordsys; return projection(l, line(point(R, E), point(R, W)), safe); } /**/ line perpendicular(point M, line l) {/*Return the perpendicular line of 'l' passing through 'M'.*/ point Mp = projection(l) * M; point A = Mp == l.A ? l.B : l.A; return line(Mp, rotate(90, Mp) * A); } /**/ line perpendicular(point M, explicit vector normal) {/*Return the line passing through 'M' whose normal is \param{normal}.*/ return perpendicular(M, line(M, M + locate(normal))); } /**/ line perpendicular(point M, explicit pair normal) {/*Return the line passing through 'M' whose normal is \param{normal} (given in the currentcoordsys).*/ return perpendicular(M, line(M, M + vector(currentcoordsys, normal))); } /**/ bool perpendicular(line l1, line l2) {/*Return 'true' if 'l1' and 'l2' are perpendicular.*/ return abs(dot(locate(l1.u), locate(l2.u))) < epsgeo ; } /**/ real angle(line l, coordsys R = coordsys(l)) {/*Return the angle of the oriented line 'l', in radian, in the interval ]-pi, pi] and relatively to 'R'.*/ return angle(l.u, R, false); } /**/ real degrees(line l, coordsys R = coordsys(l)) {/*Returns the angle of the oriented line 'l' in degrees, in the interval [0, 360[ and relatively to 'R'.*/ return degrees(angle(l, R)); } /**/ real sharpangle(line l1, line l2) {/*Return the measure in radians of the sharp angle formed by 'l1' and 'l2'.*/ vector u1 = l1.u; vector u2 = (dot(l1.u, l2.u) < 0) ? -l2.u : l2.u; real a12 = angle(locate(u2)) - angle(locate(u1)); a12 = a12%(sgnd(a12) * pi); if (a12 <= -pi/2) { a12 += pi; } else if (a12 > pi/2) { a12 -= pi; } return a12; } /**/ real angle(line l1, line l2) {/*Return the measure in radians of oriented angle (l1.u, l2.u).*/ return angle(locate(l2.u)) - angle(locate(l1.u)); } /**/ real degrees(line l1, line l2) {/*Return the measure in degrees of the angle formed by the oriented lines 'l1' and 'l2'.*/ return degrees(angle(l1, l2)); } /**/ real sharpdegrees(line l1, line l2) {/*Return the measure in degrees of the sharp angle formed by 'l1' and 'l2'.*/ return degrees(sharpangle(l1, l2)); } /**/ line bisector(line l1, line l2, real angle = 0, bool sharp = true) {/*Return the bisector of the angle formed by 'l1' and 'l2' rotated by the angle 'angle' (in degrees) around intersection point of 'l1' with 'l2'. If 'sharp' is true (the default), this routine returns the bisector of the sharp angle. Note that the returned line inherit of coordinate system of 'l1'.*/ line ol; if (l1 == l2) return l1; point A = intersectionpoint(l1, l2); if (finite(A)) { if(sharp) ol = rotate(sharpdegrees(l1, l2)/2 + angle, A) * l1; else { coordsys R = coordsys(l1); pair a = A, b = A + l1.u, c = A + l2.u; pair pp = extension(a, a + dir(a--b, a--c), b, b + dir(b--a, b--c)); return rotate(angle, A) * line(A, point(R, pp/R)); } } else { ol = l1; } return ol; } /**/ line sector(int n = 2, int p = 1, line l1, line l2, real angle = 0, bool sharp = true) {/*Return the p-th nth-sector of the angle formed by the oriented line 'l1' and 'l2' rotated by the angle 'angle' (in degrees) around the intersection point of 'l1' with 'l2'. If 'sharp' is true (the default), this routine returns the bisector of the sharp angle. Note that the returned line inherit of coordinate system of 'l1'.*/ line ol; if (l1 == l2) return l1; point A = intersectionpoint(l1, l2); if (finite(A)) { if(sharp) ol = rotate(p * sharpdegrees(l1, l2)/n + angle, A) * l1; else { ol = rotate(p * degrees(l1, l2)/n + angle, A) * l1; } } else { ol = l1; } return ol; } /**/ line bisector(point A, point B, point C, point D, real angle = 0, bool sharp = true) {/*Return the bisector of the angle formed by the lines (AB) and (CD). .*/ point[] P = standardizecoordsys(A, B, C, D); return bisector(line(P[0], P[1]), line(P[2], P[3]), angle, sharp); } /**/ line bisector(segment s, real angle = 0) {/*Return the bisector of the segment line 's' rotated by 'angle' (in degrees) around the midpoint of 's'.*/ coordsys R = coordsys(s); point m = midpoint(s); vector dir = rotateO(90) * unit(s.A - m); return rotate(angle, m) * line(m + dir, m - dir); } /**/ line bisector(point A, point B, real angle = 0) {/*Return the bisector of the segment line [AB] rotated by 'angle' (in degrees) around the midpoint of [AB].*/ point[] P = standardizecoordsys(A, B); return bisector(segment(P[0], P[1]), angle); } /**/ real distance(point M, line l) {/*Return the distance from 'M' to 'l'. distance(line, point) is also defined.*/ point A = changecoordsys(defaultcoordsys, l.A); point B = changecoordsys(defaultcoordsys, l.B); line ll = line(A, B); pair m = locate(M); return abs(ll.a * m.x + ll.b * m.y + ll.c)/sqrt(ll.a^2 + ll.b^2); } real distance(line l, point M) { return distance(M, l); } /**/ void draw(picture pic = currentpicture, Label L = "", line l, bool dirA = l.extendA, bool dirB = l.extendB, align align = NoAlign, pen p = currentpen, arrowbar arrow = None, Label legend = "", marker marker = nomarker, pathModifier pathModifier = NoModifier) {/*Draw the line 'l' without altering the size of picture pic. The boolean parameters control the infinite section. The global variable 'linemargin' (default value is 0) allows to modify the bounding box in which the line must be drawn.*/ if(!(dirA || dirB)) draw(l.A--l.B, invisible);// l is a segment. Drawline(pic, L, l.A, dirP = dirA, l.B, dirQ = dirB, align, p, arrow, legend, marker, pathModifier); } /**/ void draw(picture pic = currentpicture, Label[] L = new Label[], line[] l, align align = NoAlign, pen[] p = new pen[], arrowbar arrow = None, Label[] legend = new Label[], marker marker = nomarker, pathModifier pathModifier = NoModifier) {/*Draw each lines with the corresponding pen.*/ for (int i = 0; i < l.length; ++i) { draw(pic, L.length>0 ? L[i] : "", l[i], align, p = p.length>0 ? p[i] : currentpen, arrow, legend.length>0 ? legend[i] : "", marker, pathModifier); } } /**/ void draw(picture pic = currentpicture, Label[] L = new Label[], line[] l, align align = NoAlign, pen p, arrowbar arrow = None, Label[] legend = new Label[], marker marker = nomarker, pathModifier pathModifier = NoModifier) {/*Draw each lines with the same pen 'p'.*/ pen[] tp = sequence(new pen(int i){return p;}, l.length); draw(pic, L, l, align, tp, arrow, legend, marker, pathModifier); } /**/ void show(picture pic = currentpicture, line l, pen p = red) {/*Draw some informations of 'l'.*/ dot("$A$", (pair)l.A, align = -locate(l.v), p); dot("$B$", (pair)l.B, align = -locate(l.v), p); draw(l, dotted); draw("$\vec{u}$", locate(l.A)--locate(l.A + l.u), p, Arrow); draw("$\vec{v}$", locate(l.A)--locate(l.A + l.v), p, Arrow); } /**/ point[] sameside(point M, line l1, line l2) {/*Return two points on 'l1' and 'l2' respectively. The first point is from the same side of M relatively to 'l2', the second point is from the same side of M relatively to 'l1'.*/ point[] op; coordsys R1 = coordsys(l1); coordsys R2 = coordsys(l2); if (parallel(l1, l2)) { op.push(projection(l1) * M); op.push(projection(l2) * M); } else { point O = intersectionpoint(l1, l2); if (M @ l2) op.push((sameside(M, O + l1.u, l2)) ? O + l1.u : rotate(180, O) * (O + l1.u)); else op.push(projection(l1, l2) * M); if (M @ l1) op.push((sameside(M, O + l2.u, l1)) ? O + l2.u : rotate(180, O) * (O + l2.u)); else {op.push(projection(l2, l1) * M);} } return op; } /**/ void markangle(picture pic = currentpicture, Label L = "", int n = 1, real radius = 0, real space = 0, explicit line l1, explicit line l2, explicit pair align = dir(1), arrowbar arrow = None, pen p = currentpen, filltype filltype = NoFill, margin margin = NoMargin, marker marker = nomarker) {/*Mark the angle (l1, l2) aligned in the direction 'align' relative to 'l1'. Commune values for 'align' are dir(real).*/ if (parallel(l1, l2, true)) return; real al = degrees(l1, defaultcoordsys); pair O, A, B; if (radius == 0) radius = markangleradius(p); real d = degrees(locate(l1.u)); align = rotate(d) * align; if (l1 == l2) { O = midpoint(segment(l1.A, l1.B)); A = l1.A;B = l1.B; if (sameside(rotate(sgn(angle(B-A)) * 45, O) * A, O + align, l1)) {radius = -radius;} } else { O = intersectionpoint(extend(l1), extend(l2)); pair R = O + align; point [] ss = sameside(point(coordsys(l1), R/coordsys(l1)), l1, l2); A = ss[0]; B = ss[1]; } markangle(pic = pic, L = L, n = n, radius = radius, space = space, O = O, A = A, B = B, arrow = arrow, p = p, filltype = filltype, margin = margin, marker = marker); } /**/ void markangle(picture pic = currentpicture, Label L = "", int n = 1, real radius = 0, real space = 0, explicit line l1, explicit line l2, explicit vector align, arrowbar arrow = None, pen p = currentpen, filltype filltype = NoFill, margin margin = NoMargin, marker marker = nomarker) {/*Mark the angle (l1, l2) in the direction 'dir' given relatively to 'l1'.*/ markangle(pic, L, n, radius, space, l1, l2, (pair)align, arrow, p, filltype, margin, marker); } /**/ // void markangle(picture pic = currentpicture, // Label L = "", int n = 1, real radius = 0, real space = 0, // explicit line l1, explicit line l2, // arrowbar arrow = None, pen p = currentpen, // filltype filltype = NoFill, // margin margin = NoMargin, marker marker = nomarker) // {/*Mark the oriented angle (l1, l2).*/ // if (parallel(l1, l2, true)) return; // real al = degrees(l1, defaultcoordsys); // pair O, A, B; // if (radius == 0) radius = markangleradius(p); // real d = degrees(locate(l1.u)); // if (l1 == l2) { // O = midpoint(segment(l1.A, l1.B)); // } else { // O = intersectionpoint(extend(l1), extend(l2)); // } // A = O + locate(l1.u); // B = O + locate(l2.u); // markangle(pic = pic, L = L, n = n, radius = radius, space = space, // O = O, A = A, B = B, // arrow = arrow, p = p, filltype = filltype, // margin = margin, marker = marker); // } /**/ void perpendicularmark(picture pic = currentpicture, line l1, line l2, real size = 0, pen p = currentpen, int quarter = 1, margin margin = NoMargin, filltype filltype = NoFill) {/*Draw a right angle at the intersection point of lines and aligned in the 'quarter' nth quarter of circle formed by 'l1.u' and 'l2.u'.*/ point P = intersectionpoint(l1, l2); pair align = rotate(90 * (quarter - 1)) * dir(45); perpendicularmark(P, align, locate(l1.u), size, p, margin, filltype); } // *.........................LINES.........................* // *=======================================================* // *=======================================================* // *........................CONICS.........................* /**/ struct bqe {/*Bivariate Quadratic Equation.*/ /**/ real[] a;/*a[0] * x^2 + a[1] * x * y + a[2] * y^2 + a[3] * x + a[4] * y + a[5] = 0*/ coordsys coordsys;/**/ }/**/ /**/ bqe bqe(coordsys R = currentcoordsys, real a, real b, real c, real d, real e, real f) {/*Return the bivariate quadratic equation a[0] * x^2 + a[1] * x * y + a[2] * y^2 + a[3] * x + a[4] * y + a[5] = 0 relatively to the coordinate system R.*/ bqe obqe; obqe.coordsys = R; obqe.a = new real[] {a, b, c, d, e, f}; return obqe; } /**/ bqe changecoordsys(coordsys R, bqe bqe) {/*Returns the bivariate quadratic equation relatively to 'R'.*/ pair i = coordinates(changecoordsys(R, vector(defaultcoordsys, bqe.coordsys.i))); pair j = coordinates(changecoordsys(R, vector(defaultcoordsys, bqe.coordsys.j))); pair O = coordinates(changecoordsys(R, point(defaultcoordsys, bqe.coordsys.O))); real a = bqe.a[0], b = bqe.a[1], c = bqe.a[2], d = bqe.a[3], f = bqe.a[4], g = bqe.a[5]; real ux = i.x, uy = i.y; real vx = j.x, vy = j.y; real ox = O.x, oy = O.y; real D = ux * vy - uy * vx; real ap = (a * vy^2 - b * uy * vy + c * uy^2)/D^2; real bpp = (-2 * a * vx * vy + b * ux * vy + b * uy * vx - 2 * c * ux * uy)/D^2; real cp = (a * vx^2 - b * ux * vx + c * ux^2)/D^2; real dp = (-2a * ox * vy^2 + 2a * oy * vx * vy + 2b * ox * uy * vy- b * oy * ux * vy - b * oy * uy * vx - 2c * ox * uy^2 + 2c * oy * uy * ux)/D^2+ (d * vy - f * uy)/D; real fp = (2a * ox * vx * vy - b * ox * ux * vy - 2a * oy * vx^2- b * ox * uy * vx + 2 * b * oy * ux * vx + 2c * ox * ux * uy - 2c * oy * ux^2)/D^2+ (f * ux - d * vx)/D; g = (a * ox^2 * vy^2 - 2a * ox * oy * vx * vy - b * ox^2 * uy * vy + b * ox * oy * ux * vy+ a * oy^2 * vx^2 + b * ox * oy * uy * vx - b * oy^2 * ux * vx + c * ox^2 * uy^2- 2 * c * ox * oy * ux * uy + c * oy^2 * ux^2)/D^2+ (d * oy * vx + f * ox * uy - d * ox * vy - f * oy * ux)/D + g; bqe obqe; obqe.a = approximate(new real[] {ap, bpp, cp, dp, fp, g}); obqe.coordsys = R; return obqe; } /**/ bqe bqe(point M1, point M2, point M3, point M4, point M5) {/*Return the bqe of conic passing through the five points (if possible).*/ coordsys R; pair[] pts; if (samecoordsys(M1, M2, M3, M4, M5)) { R = M1.coordsys; pts= new pair[] {M1.coordinates, M2.coordinates, M3.coordinates, M4.coordinates, M5.coordinates}; } else { R = defaultcoordsys; pts= new pair[] {M1, M2, M3, M4, M5}; } real[][] M; real[] x; bqe bqe; bqe.coordsys = R; for (int i = 0; i < 5; ++i) {// Try a = -1 M[i] = new real[] {pts[i].x * pts[i].y, pts[i].y^2, pts[i].x, pts[i].y, 1}; x[i] = pts[i].x^2; } if(abs(determinant(M)) < 1e-5) {// Try c = -1 for (int i = 0; i < 5; ++i) { M[i] = new real[] {pts[i].x^2, pts[i].x * pts[i].y, pts[i].x, pts[i].y, 1}; x[i] = pts[i].y^2; } real[] coef = solve(M, x); bqe.a = new real[] {coef[0], coef[1], -1, coef[2], coef[3], coef[4]}; } else { real[] coef = solve(M, x); bqe.a = new real[] {-1, coef[0], coef[1], coef[2], coef[3], coef[4]}; } bqe.a = approximate(bqe.a); return bqe; } /**/ bool samecoordsys(bool warn = true ... bqe[] bqes) {/*Return true if all the bivariate quadratic equations have the same coordinate system.*/ bool ret = true; coordsys t = bqes[0].coordsys; for (int i = 1; i < bqes.length; ++i) { ret = (t == bqes[i].coordsys); if(!ret) break; t = bqes[i].coordsys; } if(warn && !ret) warning("coodinatesystem", "the coordinate system of two bivariate quadratic equations are not the same. The operation will be done relatively to the default coordinate system."); return ret; } /**/ real[] realquarticroots(real a, real b, real c, real d, real e) {/*Return the real roots of the quartic equation ax^4 + b^x3 + cx^2 + dx = 0.*/ static real Fuzz = sqrt(realEpsilon); pair[] zroots = quarticroots(a, b, c, d, e); real[] roots; real p(real x){return a * x^4 + b * x^3 + c * x^2 + d * x + e;} real prime(real x){return 4 * a * x^3 + 3 * b * x^2 + 2 * c * x + d;} real x; bool search = true; int n; void addroot(real x) { bool exist = false; for (int i = 0; i < roots.length; ++i) { if(abs(roots[i]-x) < 1e-5) {exist = true; break;} } if(!exist) roots.push(x); } for(int i = 0; i < zroots.length; ++i) { if(zroots[i].y == 0 || abs(p(zroots[i].x)) < Fuzz) addroot(zroots[i].x); else { if(abs(zroots[i].y) < 1e-3) { x = zroots[i].x; search = true; n = 200; while(search) { real tx = abs(p(x)) < Fuzz ? x : newton(iterations = n, p, prime, x); if(tx < realMax) { if(abs(p(tx)) < Fuzz) { addroot(tx); search = false; } else if(n < 200) n *=2; else { search = false; } } else search = false; //It's not a real root. } } } } return roots; } /**/ struct conic {/**/ real e, p, h;/*BE CAREFUL: h = distance(F, D) and p = h * e (http://en.wikipedia.org/wiki/Ellipse) While http://mathworld.wolfram.com/ takes p = distance(F,D).*/ point F;/*Focus.*/ line D;/*Directrix.*/ line[] l;/*Case of degenerated conic (not yet implemented !).*/ }/**/ bool degenerate(conic c) { return !finite(c.p) || !finite(c.h); } /*ANCconic conic(point, line, real)ANC*/ conic conic(point F, line l, real e) {/*DOC The conic section define by the eccentricity 'e', the focus 'F' and the directrix 'l'. Note that an eccentricity equal to 0 defines a circle centered at F, with a radius equal at the distance from 'F' to 'l'. If the coordinate system of 'F' and 'l' are not identical, the conic is attached to 'defaultcoordsys'. DOC*/ if(e < 0) abort("conic: 'e' can't be negative."); conic oc; point[] P = standardizecoordsys(F, l.A, l.B); line ll; ll = line(P[1], P[2]); oc.e = e < epsgeo ? 0 : e; // Handle case of circle. oc.F = P[0]; oc.D = ll; oc.h = distance(P[0], ll); oc.p = abs(e) < epsgeo ? oc.h : e * oc.h; return oc; } /**/ struct circle {/*All the calculus with this structure will be as exact as Asymptote can do. For a full precision, you must not cast 'circle' to 'path' excepted for drawing routines.*/ /**/ point C;/*Center*/ real r;/*Radius*/ line l;/*If the radius is infinite, this line is used instead of circle.*/ }/**/ bool degenerate(circle c) { return !finite(c.r); } line line(circle c){ if(finite(c.r)) abort("Circle can not be casted to line here."); return c.l; } /**/ struct ellipse {/*Look at http://mathworld.wolfram.com/Ellipse.html*/ /**/ restricted point F1,F2,C;/*Foci and center.*/ restricted real a,b,c,e,p;/**/ restricted real angle;/*Value is degrees(F2 - F1).*/ restricted line D1,D2;/*Directrices.*/ line l;/*If one axis is infinite, this line is used instead of ellipse.*/ /**/ void init(point f1, point f2, real a) {/*Ellipse given by foci and semimajor axis.*/ point[] P = standardizecoordsys(f1, f2); this.F1 = P[0]; this.F2 = P[1]; this.C = (P[0] + P[1])/2; this.angle = degrees(F2 - F1, warn=false); this.a = a; if(!finite(a)) { this.l = line(P[0], P[1]); this.b = infinity; this.e = 0; this.c = 0; } else { this.c = abs(C - P[0]); this.b = this.c < epsgeo ? a : sqrt(a^2 - c^2); // Handle case of circle. this.e = this.c < epsgeo ? 0 : this.c/a; // Handle case of circle. if(this.e >= 1) abort("ellipse.init: wrong parameter: e >= 1."); this.p = a * (1 - this.e^2); if (this.c != 0) {// directrix is not set for a circle. point A = this.C + (a^2/this.c) * unit(P[0]-this.C); this.D1 = line(A, A + rotateO(90) * unit(A - this.C)); this.D2 = reverse(rotate(180, C) * D1); } } } }/**/ bool degenerate(ellipse el) { return !finite(el.a) || !finite(el.b); } /**/ struct parabola {/*Look at http://mathworld.wolfram.com/Parabola.html*/ restricted point F,V;/*Focus and vertex*/ restricted real a,p,e = 1;/**/ restricted real angle;/*Value is degrees(F - V).*/ restricted line D;/*Directrix*/ pair bmin, bmax;/*The (left, bottom) and (right, top) coordinates of region bounding box for drawing the parabola. If unset the current picture bounding box is used instead.*/ /**/ void init(point F, line directrix) {/*Parabola given by focus and directrix.*/ point[] P = standardizecoordsys(F, directrix.A, directrix.B); this.F = P[0]; line l = line(P[1], P[2]); this.D = l; this.a = distance(P[0], l)/2; this.p = 2 * a; this.V = 0.5 * (F + projection(D) * P[0]); this.angle = degrees(F - V, warn=false); } }/**/ /**/ struct hyperbola {/*Look at http://mathworld.wolfram.com/Hyperbola.html*/ restricted point F1,F2;/*Foci.*/ restricted point C,V1,V2;/*Center and vertices.*/ restricted real a,b,c,e,p;/**/ restricted real angle;/*Value is degrees(F2 - F1).*/ restricted line D1,D2,A1,A2;/*Directrices and asymptotes.*/ pair bmin, bmax; /*The (left, bottom) and (right, top) coordinates of region bounding box for drawing the hyperbola. If unset the current picture bounding box is used instead.*/ /**/ void init(point f1, point f2, real a) {/*Hyperbola given by foci and semimajor axis.*/ point[] P = standardizecoordsys(f1, f2); this.F1 = P[0]; this.F2 = P[1]; this.C = (P[0] + P[1])/2; this.angle = degrees(F2 - F1, warn=false); this.a = a; this.c = abs(C - P[0]); this.e = this.c/a; if(this.e <= 1) abort("hyperbola.init: wrong parameter: e <= 1."); this.b = a * sqrt(this.e^2 - 1); this.p = a * (this.e^2 - 1); point A = this.C + (a^2/this.c) * unit(P[0]-this.C); this.D1 = line(A, A + rotate(90,this.C.coordsys.O) * unit(A - this.C)); this.D2 = reverse(rotate(180, C) * D1); this.V1 = C + a * unit(F1 - C); this.V2 = C + a * unit(F2 - C); this.A1 = line(C, V1 + b * unit(rotateO(-90) * (C - V1))); this.A2 = line(C, V1 + b * unit(rotateO(90) * (C - V1))); } }/**/ /**/ int conicnodesfactor = 1;/*Factor for the node number of all conics.*/ /**/ int circlenodesnumberfactor = 100;/*Factor for the node number of circles.*/ /**/ int circlenodesnumber(real r) {/*Return the number of nodes for drawing a circle of radius 'r'.*/ if (circlenodesnumberfactor < 100) warning("circlenodesnumberfactor", "variable 'circlenodesnumberfactor' may be too small."); int oi = ceil(circlenodesnumberfactor * abs(r)^0.1); oi = 45 * floor(oi/45); return oi == 0 ? 4 : conicnodesfactor * oi; } /**/ int circlenodesnumber(real r, real angle1, real angle2) {/*Return the number of nodes to draw a circle arc.*/ return (r > 0) ? ceil(circlenodesnumber(r) * abs(angle1 - angle2)/360) : ceil(circlenodesnumber(r) * abs((1 - abs(angle1 - angle2)/360))); } /**/ int ellipsenodesnumberfactor = 250;/*Factor for the node number of ellispe (non-circle).*/ /**/ int ellipsenodesnumber(real a, real b) {/*Return the number of nodes to draw a ellipse of axis 'a' and 'b'.*/ if (ellipsenodesnumberfactor < 250) write("ellipsenodesnumberfactor", "variable 'ellipsenodesnumberfactor' maybe too small."); int tmp = circlenodesnumberfactor; circlenodesnumberfactor = ellipsenodesnumberfactor; int oi = circlenodesnumber(max(abs(a), abs(b))/min(abs(a), abs(b))); circlenodesnumberfactor = tmp; return conicnodesfactor * oi; } /**/ int ellipsenodesnumber(real a, real b, real angle1, real angle2, bool dir) {/*Return the number of nodes to draw an ellipse arc.*/ real d; real da = angle2 - angle1; if(dir) { d = angle1 < angle2 ? da : 360 + da; } else { d = angle1 < angle2 ? -360 + da : da; } int n = floor(ellipsenodesnumber(a, b) * abs(d)/360); return n < 5 ? 5 : n; } /**/ int parabolanodesnumberfactor = 100;/*Factor for the number of nodes of parabolas.*/ /**/ int parabolanodesnumber(parabola p, real angle1, real angle2) {/*Return the number of nodes for drawing a parabola.*/ return conicnodesfactor * floor(0.01 * parabolanodesnumberfactor * abs(angle1 - angle2)); } /**/ int hyperbolanodesnumberfactor = 100;/*Factor for the number of nodes of hyperbolas.*/ /**/ int hyperbolanodesnumber(hyperbola h, real angle1, real angle2) {/*Return the number of nodes for drawing an hyperbola.*/ return conicnodesfactor * floor(0.01 * hyperbolanodesnumberfactor * abs(angle1 - angle2)/h.e); } /**/ conic operator +(conic c, explicit point M) {/**/ return conic(c.F + M, c.D + M, c.e); } /**/ conic operator -(conic c, explicit point M) {/**/ return conic(c.F - M, c.D - M, c.e); } /**/ conic operator +(conic c, explicit pair m) {/**/ point M = point(c.F.coordsys, m); return conic(c.F + M, c.D + M, c.e); } /**/ conic operator -(conic c, explicit pair m) {/**/ point M = point(c.F.coordsys, m); return conic(c.F - M, c.D - M, c.e); } /**/ conic operator +(conic c, vector v) {/**/ return conic(c.F + v, c.D + v, c.e); } /**/ conic operator -(conic c, vector v) {/**/ return conic(c.F - v, c.D - v, c.e); } /**/ coordsys coordsys(conic co) {/*Return the coordinate system of 'co'.*/ return co.F.coordsys; } /**/ conic changecoordsys(coordsys R, conic co) {/*Change the coordinate system of 'co' to 'R'*/ line l = changecoordsys(R, co.D); point F = changecoordsys(R, co.F); return conic(F, l, co.e); } /**/ typedef path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction);/*Routine type used to draw conics from 'angle1' to 'angle2'*/ /**/ path arcfromfocus(conic co, real angle1, real angle2, int n = 400, bool direction = CCW) {/*Return the path of the conic section 'co' from angle1 to angle2 in degrees, drawing in the given direction, with n nodes.*/ guide op; if (n < 1) return op; if (angle1 > angle2) { path g = arcfromfocus(co, angle2, angle1, n, !direction); return g == nullpath ? g : reverse(g); } point O = projection(co.D) * co.F; pair i = unit(locate(co.F) - locate(O)); pair j = rotate(90) * i; coordsys Rp = cartesiansystem(co.F, i, j); real a1 = direction ? radians(angle1) : radians(angle2); real a2 = direction ? radians(angle2) : radians(angle1) + 2 * pi; real step = n == 1 ? 0 : (a2 - a1)/(n - 1); real a, r; for (int i = 0; i < n; ++i) { a = a1 + i * step; if(co.e >= 1) { r = 1 - co.e * cos(a); if(r > epsgeo) { r = co.p/r; op = op--Rp * Rp.polar(r, a); } } else { r = co.p/(1 - co.e * cos(a)); op = op..Rp * Rp.polar(r, a); } } if(co.e < 1 && abs(abs(a2 - a1) - 2 * pi) < epsgeo) op = (path)op..cycle; return (direction ? op : op == nullpath ? op :reverse(op)); } /**/ polarconicroutine currentpolarconicroutine = arcfromfocus;/*Default routine used to cast conic section to path.*/ /**/ point angpoint(conic co, real angle) {/*Return the point of 'co' whose the angular (in degrees) coordinate is 'angle' (mesured from the focus of 'co', relatively to its 'natural coordinate system').*/ coordsys R = coordsys(co); return point(R, point(arcfromfocus(co, angle, angle, 1, CCW), 0)/R); } /**/ bool operator @(point M, conic co) {/*Return true iff 'M' on 'co'.*/ if(co.e == 0) return abs(abs(co.F - M) - co.p) < 10 * epsgeo; return abs(co.e * distance(M, co.D) - abs(co.F - M)) < 10 * epsgeo; } /**/ coordsys coordsys(ellipse el) {/*Return the coordinate system of 'el'.*/ return el.F1.coordsys; } /**/ coordsys canonicalcartesiansystem(ellipse el) {/*Return the canonical cartesian system of the ellipse 'el'.*/ if(degenerate(el)) return cartesiansystem(el.l.A, el.l.u, el.l.v); pair O = locate(el.C); pair i = el.e == 0 ? el.C.coordsys.i : unit(locate(el.F1) - O); pair j = rotate(90) * i; return cartesiansystem(O, i, j); } /**/ coordsys canonicalcartesiansystem(parabola p) {/*Return the canonical cartesian system of a parabola, so that Origin = vertex of 'p' and directrix: x = -a.*/ point A = projection(p.D) * p.F; pair O = locate((A + p.F)/2); pair i = unit(locate(p.F) - O); pair j = rotate(90) * i; return cartesiansystem(O, i, j); } /**/ coordsys canonicalcartesiansystem(hyperbola h) {/*Return the canonical cartesian system of an hyperbola.*/ pair O = locate(h.C); pair i = unit(locate(h.F2) - O); pair j = rotate(90) * i; return cartesiansystem(O, i, j); } /**/ ellipse ellipse(point F1, point F2, real a) {/*Return the ellipse whose the foci are 'F1' and 'F2' and the semimajor axis is 'a'.*/ ellipse oe; oe.init(F1, F2, a); return oe; } /**/ restricted bool byfoci = true, byvertices = false;/*Constants useful for the routine 'hyperbola(point P1, point P2, real ae, bool byfoci = byfoci)'*/ /**/ hyperbola hyperbola(point P1, point P2, real ae, bool byfoci = byfoci) {/*if 'byfoci = true': return the hyperbola whose the foci are 'P1' and 'P2' and the semimajor axis is 'ae'. else return the hyperbola whose vertexes are 'P1' and 'P2' with eccentricity 'ae'.*/ hyperbola oh; point[] P = standardizecoordsys(P1, P2); if(byfoci) { oh.init(P[0], P[1], ae); } else { real a = abs(P[0]-P[1])/2; vector V = unit(P[0]-P[1]); point F1 = P[0] + a * (ae - 1) * V; point F2 = P[1]-a * (ae - 1) * V; oh.init(F1, F2, a); } return oh; } /**/ ellipse ellipse(point F1, point F2, point M) {/*Return the ellipse passing through 'M' whose the foci are 'F1' and 'F2'.*/ real a = abs(F1 - M) + abs(F2 - M); return ellipse(F1, F2, finite(a) ? a/2 : a); } /**/ ellipse ellipse(point C, real a, real b, real angle = 0) {/*Return the ellipse centered at 'C' with semimajor axis 'a' along C--C + dir(angle), semiminor axis 'b' along the perpendicular.*/ ellipse oe; coordsys R = C.coordsys; angle += degrees(R.i); if(a < b) {angle += 90; real tmp = a; a = b; b = tmp;} if(finite(a) && finite(b)) { real c = sqrt(abs(a^2 - b^2)); point f1, f2; if(abs(a - b) < epsgeo) { f1 = C; f2 = C; } else { f1 = point(R, (locate(C) + rotate(angle) * (-c, 0))/R); f2 = point(R, (locate(C) + rotate(angle) * (c, 0))/R); } oe.init(f1, f2, a); } else { if(finite(b) || !finite(a)) oe.init(C, C + R.polar(1, angle), infinity); else oe.init(C, C + R.polar(1, 90 + angle), infinity); } return oe; } /**/ ellipse ellipse(bqe bqe) {/*Return the ellipse a[0] * x^2 + a[1] * xy + a[2] * y^2 + a[3] * x + a[4] * y + a[5] = 0 given in the coordinate system of 'bqe' with a[i] = bque.a[i]. .*/ bqe lbqe = changecoordsys(defaultcoordsys, bqe); real a = lbqe.a[0], b = lbqe.a[1]/2, c = lbqe.a[2], d = lbqe.a[3]/2, f = lbqe.a[4]/2, g = lbqe.a[5]; coordsys R = bqe.coordsys; string message = "ellipse: the given equation is not an equation of an ellipse."; real u = b^2 * g + d^2 * c + f^2 * a; real delta = a * c * g + b * f * d + d * b * f - u; if(abs(delta) < epsgeo) abort(message); real j = b^2 - a * c; real i = a + c; real dd = j * (sgnd(c - a) * sqrt((a - c)^2 + 4 * (b^2)) - c-a); real ddd = j * (-sgnd(c - a) * sqrt((a - c)^2 + 4 * (b^2)) - c-a); if(abs(ddd) < epsgeo || abs(dd) < epsgeo || j >= -epsgeo || delta/sgnd(i) > 0) abort(message); real x = (c * d - b * f)/j, y = (a * f - b * d)/j; // real dir = abs(b) < epsgeo ? 0 : pi/2-0.5 * acot(0.5 * (c-a)/b); real dir = abs(b) < epsgeo ? 0 : 0.5 * acot(0.5 * (c - a)/b); if(dir * (c - a) * b < 0) dir = dir < 0 ? dir + pi/2 : dir - pi/2; real cd = cos(dir), sd = sin(dir); real t = a * cd^2 - 2 * b * cd * sd + c * sd^2; real tt = a * sd^2 + 2 * b * cd * sd + c * cd^2; real gg = -g + ((d * cd - f * sd)^2)/t + ((d * sd + f * cd)^2)/tt; t = t/gg; tt = tt/gg; // The equation of the ellipse is t * (x - center.x)^2 + tt * (y - center.y)^2 = 1; real aa, bb; aa = sqrt(2 * (u - 2 * b * d * f - a * c * g)/dd); bb = sqrt(2 * (u - 2 * b * d * f - a * c * g)/ddd); a = t > tt ? max(aa, bb) : min(aa, bb); b = t > tt ? min(aa, bb) : max(aa, bb); return ellipse(point(R, (x, y)/R), a, b, degrees(pi/2 - dir - angle(R.i))); } /**/ ellipse ellipse(point M1, point M2, point M3, point M4, point M5) {/*Return the ellipse passing through the five points (if possible)*/ return ellipse(bqe(M1, M2, M3, M4, M5)); } /**/ bool inside(ellipse el, point M) {/*Return 'true' iff 'M' is inside 'el'.*/ return abs(el.F1 - M) + abs(el.F2 - M) - 2 * el.a < -epsgeo; } /**/ bool inside(parabola p, point M) {/*Return 'true' if 'M' is inside 'p'.*/ return distance(p.D, M) - abs(p.F - M) > epsgeo; } /**/ parabola parabola(point F, line l) {/*Return the parabola whose focus is 'F' and directrix is 'l'.*/ parabola op; op.init(F, l); return op; } /**/ parabola parabola(point F, point vertex) {/*Return the parabola whose focus is 'F' and vertex is 'vertex'.*/ parabola op; point[] P = standardizecoordsys(F, vertex); point A = rotate(180, P[1]) * P[0]; point B = A + rotateO(90) * unit(P[1]-A); op.init(P[0], line(A, B)); return op; } /**/ parabola parabola(point F, real a, real angle) {/*Return the parabola whose focus is F, latus rectum is 4a and the angle of the axis of symmetry (in the coordinate system of F) is 'angle'.*/ parabola op; coordsys R = F.coordsys; point A = F - point(R, R.polar(2a, radians(angle))); point B = A + point(R, R.polar(1, radians(90 + angle))); op.init(F, line(A, B)); return op; } /**/ bool isparabola(bqe bqe) {/*Return true iff 'bqe' is the equation of a parabola.*/ bqe lbqe = changecoordsys(defaultcoordsys, bqe); real a = lbqe.a[0], b = lbqe.a[1]/2, c = lbqe.a[2], d = lbqe.a[3]/2, f = lbqe.a[4]/2, g = lbqe.a[5]; real delta = a * c * g + b * f * d + d * b * f - (b^2 * g + d^2 * c + f^2 * a); return (abs(delta) > epsgeo && abs(b^2 - a * c) < epsgeo); } /**/ parabola parabola(bqe bqe) {/*Return the parabola a[0]x^2 + a[1]xy + a[2]y^2 + a[3]x + a[4]y + a[5]] = 0 (a[n] means bqe.a[n]). */ bqe lbqe = changecoordsys(defaultcoordsys, bqe); real a = lbqe.a[0], b = lbqe.a[1]/2, c = lbqe.a[2], d = lbqe.a[3]/2, f = lbqe.a[4]/2, g = lbqe.a[5]; string message = "parabola: the given equation is not an equation of a parabola."; real delta = a * c * g + b * f * d + d * b * f - (b^2 * g + d^2 * c + f^2 * a); if(abs(delta) < 10 * epsgeo || abs(b^2 - a * c) > 10 * epsgeo) abort(message); real dir = abs(b) < epsgeo ? 0 : 0.5 * acot(0.5 * (c - a)/b); if(dir * (c - a) * b < 0) dir = dir < 0 ? dir + pi/2 : dir - pi/2; real cd = cos(dir), sd = sin(dir); real ap = a * cd^2 - 2 * b * cd * sd + c * sd^2; real cp = a * sd^2 + 2 * b * cd * sd + c * cd^2; real dp = d * cd - f * sd; real fp = d * sd + f * cd; real gp = g; parabola op; coordsys R = bqe.coordsys; // The equation of the parabola is ap * x'^2 + cp * y'^2 + 2dp * x'+2fp * y'+gp = 0 if (abs(ap) < epsgeo) {/* directrix parallel to the rotated(dir) y-axis equation: (y-vertex.y)^2 = 4 * a * (x-vertex) */ pair pvertex = rotate(degrees(-dir)) * (0.5(-gp + fp^2/cp)/dp, -fp/cp); real a = -0.5 * dp/cp; point vertex = point(R, pvertex/R); point focus = point(R, (pvertex + a * expi(-dir))/R); op = parabola(focus, vertex); } else {/* directrix parallel to the rotated(dir) x-axis equation: (x-vertex)^2 = 4 * a * (y-vertex.y) */ pair pvertex = rotate(degrees(-dir)) * (-dp/ap, 0.5 * (-gp + dp^2/ap)/fp); real a = -0.5 * fp/ap; point vertex = point(R, pvertex/R); point focus = point(R, (pvertex + a * expi(pi/2 - dir))/R); op = parabola(focus, vertex); } return op; } /**/ parabola parabola(point M1, point M2, point M3, line l) {/*Return the parabola passing through the three points with its directix parallel to the line 'l'.*/ coordsys R; pair[] pts; if (samecoordsys(M1, M2, M3)) { R = M1.coordsys; } else { R = defaultcoordsys; } real gle = degrees(l); coordsys Rp = cartesiansystem(R.O, rotate(gle) * R.i, rotate(gle) * R.j); pts = new pair[] {coordinates(changecoordsys(Rp, M1)), coordinates(changecoordsys(Rp, M2)), coordinates(changecoordsys(Rp, M3))}; real[][] M; real[] x; for (int i = 0; i < 3; ++i) { M[i] = new real[] {pts[i].x, pts[i].y, 1}; x[i] = -pts[i].x^2; } real[] coef = solve(M, x); return parabola(changecoordsys(R, bqe(Rp, 1, 0, 0, coef[0], coef[1], coef[2]))); } /**/ parabola parabola(point M1, point M2, point M3, point M4, point M5) {/*Return the parabola passing through the five points.*/ return parabola(bqe(M1, M2, M3, M4, M5)); } /**/ hyperbola hyperbola(point F1, point F2, point M) {/*Return the hyperbola passing through 'M' whose the foci are 'F1' and 'F2'.*/ real a = abs(abs(F1 - M) - abs(F2 - M)); return hyperbola(F1, F2, finite(a) ? a/2 : a); } /**/ hyperbola hyperbola(point C, real a, real b, real angle = 0) {/*Return the hyperbola centered at 'C' with semimajor axis 'a' along C--C + dir(angle), semiminor axis 'b' along the perpendicular.*/ hyperbola oh; coordsys R = C.coordsys; angle += degrees(R.i); real c = sqrt(a^2 + b^2); point f1 = point(R, (locate(C) + rotate(angle) * (-c, 0))/R); point f2 = point(R, (locate(C) + rotate(angle) * (c, 0))/R); oh.init(f1, f2, a); return oh; } /**/ hyperbola hyperbola(bqe bqe) {/*Return the hyperbola a[0]x^2 + a[1]xy + a[2]y^2 + a[3]x + a[4]y + a[5]] = 0 (a[n] means bqe.a[n]). */ bqe lbqe = changecoordsys(defaultcoordsys, bqe); real a = lbqe.a[0], b = lbqe.a[1]/2, c = lbqe.a[2], d = lbqe.a[3]/2, f = lbqe.a[4]/2, g = lbqe.a[5]; string message = "hyperbola: the given equation is not an equation of a hyperbola."; real delta = a * c * g + b * f * d + d * b * f - (b^2 * g + d^2 * c + f^2 * a); if(abs(delta) < 10 * epsgeo || abs(b^2 - a * c) < 0) abort(message); real dir = abs(b) < epsgeo ? 0 : 0.5 * acot(0.5 * (c - a)/b); real cd = cos(dir), sd = sin(dir); real ap = a * cd^2 - 2 * b * cd * sd + c * sd^2; real cp = a * sd^2 + 2 * b * cd * sd + c * cd^2; real dp = d * cd - f * sd; real fp = d * sd + f * cd; real gp = -g + dp^2/ap + fp^2/cp; hyperbola op; coordsys R = bqe.coordsys; real j = b^2 - a * c; point C = point(R, ((c * d - b * f)/j, (a * f - b * d)/j)/R); real aa = gp/ap, bb = gp/cp; real a = sqrt(abs(aa)), b = sqrt(abs(bb)); if(aa < 0) {dir -= pi/2; aa = a; a = b; b = aa;} return hyperbola(C, a, b, degrees(-dir - angle(R.i))); } /**/ hyperbola hyperbola(point M1, point M2, point M3, point M4, point M5) {/*Return the hyperbola passing through the five points (if possible).*/ return hyperbola(bqe(M1, M2, M3, M4, M5)); } /**/ hyperbola conj(hyperbola h) {/*Conjugate.*/ return hyperbola(h.C, h.b, h.a, 90 + h.angle); } /**/ circle circle(explicit point C, real r) {/*Circle given by center and radius.*/ circle oc = new circle; oc.C = C; oc.r = r; if(!finite(r)) oc.l = line(C, C + vector(C.coordsys, (1, 0))); return oc; } /**/ circle circle(point A, point B) {/*Return the circle of diameter AB.*/ real r; circle oc; real a = abs(A), b = abs(B); if(finite(a) && finite(b)) { oc = circle((A + B)/2, abs(A - B)/2); } else { oc.r = infinity; if(finite(abs(A))) oc.l = line(A, A + unit(B)); else { if(finite(abs(B))) oc.l = line(B, B + unit(A)); else if(finite(abs(A - B)/2)) oc = circle((A + B)/2, abs(A - B)/2); else oc.l = line(A, B); } } return oc; } /**/ circle circle(segment s) {/*Return the circle of diameter 's'.*/ return circle(s.A, s.B); } /**/ point circumcenter(point A, point B, point C) {/*Return the circumcenter of triangle ABC.*/ point[] P = standardizecoordsys(A, B, C); coordsys R = P[0].coordsys; pair a = A, b = B, c = C; pair mAB = (a + b)/2; pair mAC = (a + c)/2; pair pp = extension(mAB, rotate(90, mAB) * a, mAC, rotate(90, mAC) * c); return point(R, pp/R); } /**/ circle circle(point A, point B, point C) {/*Return the circumcircle of the triangle ABC.*/ if(collinear(A - B, A - C)) { circle oc; oc.r = infinity; oc.C = (A + B + C)/3; oc.l = line(oc.C, oc.C == A ? B : A); return oc; } point c = circumcenter(A, B, C); return circle(c, abs(c - A)); } /**/ circle circumcircle(point A, point B, point C) {/*Return the circumcircle of the triangle ABC.*/ return circle(A, B, C); } /**/ circle operator *(real x, explicit circle c) {/*Multiply the radius of 'c'.*/ return finite(c.r) ? circle(c.C, x * c.r) : c; } circle operator *(int x, explicit circle c) { return finite(c.r) ? circle(c.C, x * c.r) : c; } /**/ circle operator /(explicit circle c, real x) {/*Divide the radius of 'c'*/ return finite(c.r) ? circle(c.C, c.r/x) : c; } circle operator /(explicit circle c, int x) { return finite(c.r) ? circle(c.C, c.r/x) : c; } /**/ circle operator +(explicit circle c, explicit point M) {/*Translation of 'c'.*/ return circle(c.C + M, c.r); } /**/ circle operator -(explicit circle c, explicit point M) {/*Translation of 'c'.*/ return circle(c.C - M, c.r); } /**/ circle operator +(explicit circle c, pair m) {/*Translation of 'c'. 'm' represent coordinates in the coordinate system where 'c' is defined.*/ return circle(c.C + m, c.r); } /**/ circle operator -(explicit circle c, pair m) {/*Translation of 'c'. 'm' represent coordinates in the coordinate system where 'c' is defined.*/ return circle(c.C - m, c.r); } /**/ circle operator +(explicit circle c, vector m) {/*Translation of 'c'.*/ return circle(c.C + m, c.r); } /**/ circle operator -(explicit circle c, vector m) {/*Translation of 'c'.*/ return circle(c.C - m, c.r); } /**/ real operator ^(point M, explicit circle c) {/*The power of 'M' with respect to the circle 'c'*/ return xpart((abs(locate(M) - locate(c.C)), c.r)^2); } /**/ bool operator @(point M, explicit circle c) {/*Return true iff 'M' is on the circle 'c'.*/ return finite(c.r) ? abs(abs(locate(M) - locate(c.C)) - abs(c.r)) <= 10 * epsgeo : M @ c.l; } /**/ ellipse operator cast(circle c) {/**/ return finite(c.r) ? ellipse(c.C, c.r, c.r, 0) : ellipse(c.l.A, c.l.B, infinity); } /**/ circle operator ecast(ellipse el) {/**/ circle oc; bool infb = (!finite(el.a) || !finite(el.b)); if(!infb && abs(el.a - el.b) > epsgeo) abort("Can not cast ellipse with different axis values to circle"); oc = circle(el.C, infb ? infinity : el.a); oc.l = el.l.copy(); return oc; } /**/ ellipse operator ecast(conic co) {/*Cast a conic to an ellipse (can be a circle).*/ if(degenerate(co) && co.e < 1) return ellipse(co.l[0].A, co.l[0].B, infinity); ellipse oe; if(co.e < 1) { real a = co.p/(1 - co.e^2); real c = co.e * a; vector v = co.D.v; if(!sameside(co.D.A + v, co.F, co.D)) v = -v; point f2 = co.F + 2 * c * v; f2 = changecoordsys(co.F.coordsys, f2); oe = a == 0 ? ellipse(co.F, co.p, co.p, 0) : ellipse(co.F, f2, a); } else abort("casting: The conic section is not an ellipse."); return oe; } /**/ parabola operator ecast(conic co) {/*Cast a conic to a parabola.*/ parabola op; if(abs(co.e - 1) > epsgeo) abort("casting: The conic section is not a parabola."); op.init(co.F, co.D); return op; } /**/ conic operator cast(parabola p) {/*Cast a parabola to a conic section.*/ return conic(p.F, p.D, 1); } /**/ hyperbola operator ecast(conic co) {/*Cast a conic section to an hyperbola.*/ hyperbola oh; if(co.e > 1) { real a = co.p/(co.e^2 - 1); real c = co.e * a; vector v = co.D.v; if(sameside(co.D.A + v, co.F, co.D)) v = -v; point f2 = co.F + 2 * c * v; f2 = changecoordsys(co.F.coordsys, f2); oh = hyperbola(co.F, f2, a); } else abort("casting: The conic section is not an hyperbola."); return oh; } /**/ conic operator cast(hyperbola h) {/*Hyperbola to conic section.*/ return conic(h.F1, h.D1, h.e); } /**/ conic operator cast(ellipse el) {/*Ellipse to conic section.*/ conic oc; if(abs(el.c) > epsgeo) { real x = el.a^2/el.c; point O = (el.F1 + el.F2)/2; point A = O + x * unit(el.F1 - el.F2); oc = conic(el.F1, perpendicular(A, line(el.F1, el.F2)), el.e); } else {//The ellipse is a circle coordsys R = coordsys(el); point M = el.F1 + point(R, R.polar(el.a, 0)); line l = line(rotate(90, M) * el.F1, M); oc = conic(el.F1, l, 0); } if(degenerate(el)) { oc.p = infinity; oc.h = infinity; oc.l = new line[]{el.l}; } return oc; } /**/ conic operator cast(circle c) {/*Circle to conic section.*/ return (conic)((ellipse)c); } /**/ circle operator ecast(conic c) {/*Conic section to circle.*/ ellipse el = (ellipse)c; circle oc; if(abs(el.a - el.b) < epsgeo) { oc = circle(el.C, el.a); if(degenerate(c)) oc.l = c.l[0]; } else abort("Can not cast this conic to a circle"); return oc; } /**/ ellipse operator *(transform t, ellipse el) {/*Provide transform * ellipse.*/ if(!degenerate(el)) { point[] ep; for (int i = 0; i < 360; i += 72) { ep.push(t * angpoint(el, i)); } ellipse oe = ellipse(ep[0], ep[1], ep[2], ep[3], ep[4]); if(angpoint(oe, 0) != ep[0]) return ellipse(oe.F2, oe.F1, oe.a); return oe; } return ellipse(t * el.l.A, t * el.l.B, infinity); } /**/ parabola operator *(transform t, parabola p) {/*Provide transform * parabola.*/ point[] P; P.push(t * angpoint(p, 45)); P.push(t * angpoint(p, -45)); P.push(t * angpoint(p, 180)); parabola op = parabola(P[0], P[1], P[2], t * p.D); op.bmin = p.bmin; op.bmax = p.bmax; return op; } /**/ ellipse operator *(transform t, circle c) {/*Provide transform * circle. For example, 'circle C = scale(2) * circle' and 'ellipse E = xscale(2) * circle' are valid but 'circle C = xscale(2) * circle' is invalid.*/ return t * ((ellipse)c); } /**/ hyperbola operator *(transform t, hyperbola h) {/*Provide transform * hyperbola.*/ if (t == identity()) { return h; } point[] ep; for (int i = 90; i <= 270; i += 45) { ep.push(t * angpoint(h, i)); } hyperbola oe = hyperbola(ep[0], ep[1], ep[2], ep[3], ep[4]); if(angpoint(oe, 90) != ep[0]) { oe = hyperbola(oe.F2, oe.F1, oe.a); } oe.bmin = h.bmin; oe.bmax = h.bmax; return oe; } /**/ conic operator *(transform t, conic co) {/*Provide transform * conic.*/ if(co.e < 1) return (t * ((ellipse)co)); if(co.e == 1) return (t * ((parabola)co)); return (t * ((hyperbola)co)); } /**/ ellipse operator *(real x, ellipse el) {/*Identical but more efficient (rapid) than 'scale(x, el.C) * el'.*/ return degenerate(el) ? el : ellipse(el.C, x * el.a, x * el.b, el.angle); } /**/ ellipse operator /(ellipse el, real x) {/*Identical but more efficient (rapid) than 'scale(1/x, el.C) * el'.*/ return degenerate(el) ? el : ellipse(el.C, el.a/x, el.b/x, el.angle); } /**/ path arcfromcenter(ellipse el, real angle1, real angle2, bool direction=CCW, int n=ellipsenodesnumber(el.a,el.b,angle1,angle2,direction)) {/*Return the path of the ellipse 'el' from angle1 to angle2 in degrees, drawing in the given direction, with n nodes. The angles are mesured relatively to the axis (C,x-axis) where C is the center of the ellipse.*/ if(degenerate(el)) abort("arcfromcenter: can not convert degenerated ellipse to path."); if (angle1 > angle2) return reverse(arcfromcenter(el, angle2, angle1, !direction, n)); guide op; coordsys Rp=coordsys(el); if (n < 1) return op; interpolate join = operator ..; real stretch = max(el.a/el.b, el.b/el.a); if (stretch > 10) { n *= floor(stretch/5); join = operator --; } real a1 = direction ? radians(angle1) : radians(angle2); real a2 = direction ? radians(angle2) : radians(angle1) + 2 * pi; real step=(a2 - a1)/(n != 1 ? n-1 : 1); real a, r; real da = radians(el.angle); for (int i=0; i < n; ++i) { a = a1 + i * step; r = el.b/sqrt(1 - (el.e * cos(a))^2); op = join(op, Rp*Rp.polar(r, da + a)); } return shift(el.C.x*Rp.i + el.C.y*Rp.j) * (direction ? op : reverse(op)); } /**/ path arcfromcenter(hyperbola h, real angle1, real angle2, int n = hyperbolanodesnumber(h, angle1, angle2), bool direction = CCW) {/*Return the path of the hyperbola 'h' from angle1 to angle2 in degrees, drawing in the given direction, with n nodes. The angles are mesured relatively to the axis (C, x-axis) where C is the center of the hyperbola.*/ guide op; coordsys Rp = coordsys(h); if (n < 1) return op; if (angle1 > angle2) { path g = reverse(arcfromcenter(h, angle2, angle1, n, !direction)); return g == nullpath ? g : reverse(g); } real a1 = direction ? radians(angle1) : radians(angle2); real a2 = direction ? radians(angle2) : radians(angle1) + 2 * pi; real step = (a2 - a1)/(n != 1 ? n - 1 : 1); real a, r; typedef guide interpolate(... guide[]); interpolate join = operator ..; real da = radians(h.angle); for (int i = 0; i < n; ++i) { a = a1 + i * step; r = (h.b * cos(a))^2 - (h.a * sin(a))^2; if(r > epsgeo) { r = sqrt(h.a^2 * h.b^2/r); op = join(op, Rp * Rp.polar(r, a + da)); join = operator ..; } else join = operator --; } return shift(h.C.x * Rp.i + h.C.y * Rp.j)* (direction ? op : op == nullpath ? op : reverse(op)); } /**/ path arcfromcenter(explicit conic co, real angle1, real angle2, int n, bool direction = CCW) {/*Use arcfromcenter(ellipse, ...) or arcfromcenter(hyperbola, ...) depending of the eccentricity of 'co'.*/ path g; if(co.e < 1) g = arcfromcenter((ellipse)co, angle1, angle2, direction, n); else if(co.e > 1) g = arcfromcenter((hyperbola)co, angle1, angle2, n, direction); else abort("arcfromcenter: does not exist for a parabola."); return g; } /**/ restricted polarconicroutine fromCenter = arcfromcenter;/**/ /**/ restricted polarconicroutine fromFocus = arcfromfocus;/**/ /**/ bqe equation(ellipse el) {/*Return the coefficients of the equation of the ellipse in its coordinate system: bqe.a[0] * x^2 + bqe.a[1] * x * y + bqe.a[2] * y^2 + bqe.a[3] * x + bqe.a[4] * y + bqe.a[5] = 0. One can change the coordinate system of 'bqe' using the routine 'changecoordsys'.*/ pair[] pts; for (int i = 0; i < 360; i += 72) pts.push(locate(angpoint(el, i))); real[][] M; real[] x; for (int i = 0; i < 5; ++i) { M[i] = new real[] {pts[i].x * pts[i].y, pts[i].y^2, pts[i].x, pts[i].y, 1}; x[i] = -pts[i].x^2; } real[] coef = solve(M, x); bqe bqe = changecoordsys(coordsys(el), bqe(defaultcoordsys, 1, coef[0], coef[1], coef[2], coef[3], coef[4])); bqe.a = approximate(bqe.a); return bqe; } /**/ bqe equation(parabola p) {/*Return the coefficients of the equation of the parabola in its coordinate system. bqe.a[0] * x^2 + bqe.a[1] * x * y + bqe.a[2] * y^2 + bqe.a[3] * x + bqe.a[4] * y + bqe.a[5] = 0 One can change the coordinate system of 'bqe' using the routine 'changecoordsys'.*/ coordsys R = canonicalcartesiansystem(p); parabola tp = (parabola) changecoordsys(R, p); point A = projection(tp.D) * point(R, (0, 0)); real a = abs(A); return changecoordsys(coordsys(p), bqe(R, 0, 0, 1, -4 * a, 0, 0)); } /**/ bqe equation(hyperbola h) {/*Return the coefficients of the equation of the hyperbola in its coordinate system. bqe.a[0] * x^2 + bqe.a[1] * x * y + bqe.a[2] * y^2 + bqe.a[3] * x + bqe.a[4] * y + bqe.a[5] = 0 One can change the coordinate system of 'bqe' using the routine 'changecoordsys'.*/ coordsys R = canonicalcartesiansystem(h); return changecoordsys(coordsys(h), bqe(R, 1/h.a^2, 0, -1/h.b^2, 0, 0, -1)); } /**/ path operator cast(ellipse el) {/*Cast ellipse to path.*/ if(degenerate(el)) abort("Casting degenerated ellipse to path is not possible."); int n = el.e == 0 ? circlenodesnumber(el.a) : ellipsenodesnumber(el.a, el.b); return arcfromcenter(el, 0.0, 360, CCW, n)&cycle; } /**/ path operator cast(circle c) {/*Cast circle to path.*/ return (path)((ellipse)c); } /**/ real[] bangles(picture pic = currentpicture, parabola p) {/*Return the array {ma, Ma} where 'ma' and 'Ma' are respectively the smaller and the larger angles for which the parabola 'p' is included in the bounding box of the picture 'pic'.*/ pair bmin, bmax; pair[] b; if (p.bmin == p.bmax) { bmin = pic.userMin(); bmax = pic.userMax(); } else { bmin = p.bmin;bmax = p.bmax; } if(bmin.x == bmax.x || bmin.y == bmax.y || !finite(abs(bmin)) || !finite(abs(bmax))) return new real[] {0, 0}; b[0] = bmin; b[1] = (bmax.x, bmin.y); b[2] = bmax; b[3] = (bmin.x, bmax.y); real[] eq = changecoordsys(defaultcoordsys, equation(p)).a; pair[] inter; for (int i = 0; i < 4; ++i) { pair[] tmp = intersectionpoints(b[i], b[(i + 1)%4], eq); for (int j = 0; j < tmp.length; ++j) { if(dot(b[i]-tmp[j], b[(i + 1)%4]-tmp[j]) <= epsgeo) inter.push(tmp[j]); } } pair F = p.F, V = p.V; real d = degrees(F - V); real[] a = sequence(new real(int n){ return (360 - d + degrees(inter[n]-F))%360; }, inter.length); real ma = a.length != 0 ? min(a) : 0, Ma= a.length != 0 ? max(a) : 0; return new real[] {ma, Ma}; } /**/ real[][] bangles(picture pic = currentpicture, hyperbola h) {/*Return the array {{ma1, Ma1}, {ma2, Ma2}} where 'maX' and 'MaX' are respectively the smaller and the bigger angles (from h.FX) for which the hyperbola 'h' is included in the bounding box of the picture 'pic'.*/ pair bmin, bmax; pair[] b; if (h.bmin == h.bmax) { bmin = pic.userMin(); bmax = pic.userMax(); } else { bmin = h.bmin;bmax = h.bmax; } if(bmin.x == bmax.x || bmin.y == bmax.y || !finite(abs(bmin)) || !finite(abs(bmax))) return new real[][] {{0, 0}, {0, 0}}; b[0] = bmin; b[1] = (bmax.x, bmin.y); b[2] = bmax; b[3] = (bmin.x, bmax.y); real[] eq = changecoordsys(defaultcoordsys, equation(h)).a; pair[] inter0, inter1; pair C = locate(h.C); pair F1 = h.F1; for (int i = 0; i < 4; ++i) { pair[] tmp = intersectionpoints(b[i], b[(i + 1)%4], eq); for (int j = 0; j < tmp.length; ++j) { if(dot(b[i]-tmp[j], b[(i + 1)%4]-tmp[j]) <= epsgeo) { if(dot(F1 - C, tmp[j]-C) > 0) inter0.push(tmp[j]); else inter1.push(tmp[j]); } } } real d = degrees(F1 - C); real[] ma, Ma; pair[][] inter = new pair[][] {inter0, inter1}; for (int i = 0; i < 2; ++i) { real[] a = sequence(new real(int n){ return (360 - d + degrees(inter[i][n]-F1))%360; }, inter[i].length); ma[i] = a.length != 0 ? min(a) : 0; Ma[i] = a.length != 0 ? max(a) : 0; } return new real[][] {{ma[0], Ma[0]}, {ma[1], Ma[1]}}; } /**/ path operator cast(parabola p) {/*Cast parabola to path. If possible, the returned path is restricted to the actual bounding box of the current picture if the variables 'p.bmin' and 'p.bmax' are not set else the bounding box of box(p.bmin, p.bmax) is used instead.*/ real[] bangles = bangles(p); int n = parabolanodesnumber(p, bangles[0], bangles[1]); return arcfromfocus(p, bangles[0], bangles[1], n, CCW); } /**/ void draw(picture pic = currentpicture, Label L = "", circle c, align align = NoAlign, pen p = currentpen, arrowbar arrow = None, arrowbar bar = None, margin margin = NoMargin, Label legend = "", marker marker = nomarker) {/**/ if(degenerate(c)) draw(pic, L, c.l, align, p, arrow, legend, marker); else draw(pic, L, (path)c, align, p, arrow, bar, margin, legend, marker); } void fill(picture pic = currentpicture, circle c, pen p = currentpen) { if (!degenerate(c)) fill(pic, (path)c, p); } void filldraw(picture pic = currentpicture, circle c, pen fillpen = currentpen, pen drawpen = currentpen) { fill(pic, c, fillpen); draw(pic, c, drawpen); } /**/ void draw(picture pic = currentpicture, Label L = "", ellipse el, align align = NoAlign, pen p = currentpen, arrowbar arrow = None, arrowbar bar = None, margin margin = NoMargin, Label legend = "", marker marker = nomarker) {/*Draw the ellipse 'el' if it is not degenerated else draw 'el.l'.*/ if(degenerate(el)) draw(pic, L, el.l, align, p, arrow, legend, marker); else draw(pic, L, (path)el, align, p, arrow, bar, margin, legend, marker); } void fill(picture pic = currentpicture, ellipse el, pen p = currentpen) { if (!degenerate(el)) fill(pic, (path)el, p); } void filldraw(picture pic = currentpicture, ellipse el, pen fillpen = currentpen, pen drawpen = currentpen) { fill(pic, el, fillpen); draw(pic, el, drawpen); } /**/ void draw(picture pic = currentpicture, Label L = "", parabola parabola, align align = NoAlign, pen p = currentpen, arrowbar arrow = None, arrowbar bar = None, margin margin = NoMargin, Label legend = "", marker marker = nomarker) {/*Draw the parabola 'p' on 'pic' without (if possible) altering the size of picture pic.*/ pic.add(new void (frame f, transform t, transform T, pair m, pair M) { // Reduce the bounds by the size of the pen and the margins. m -= min(p); M -= max(p); parabola.bmin = inverse(t) * m; parabola.bmax = inverse(t) * M; picture tmp; path pp = t * ((path) (T * parabola)); if (pp != nullpath) { draw(tmp, L, pp, align, p, arrow, bar, NoMargin, legend, marker); add(f, tmp.fit()); } }, true); pair m = pic.userMin(), M = pic.userMax(); if(m != M) { pic.addBox(truepoint(SW), truepoint(NE)); } } /**/ path operator cast(hyperbola h) {/*Cast hyperbola to path. If possible, the returned path is restricted to the actual bounding box of the current picture unless the variables 'h.bmin' and 'h.bmax' are set; in this case the bounding box of box(h.bmin, h.bmax) is used instead. Only the branch on the side of 'h.F1' is considered.*/ real[][] bangles = bangles(h); int n = hyperbolanodesnumber(h, bangles[0][0], bangles[0][1]); return arcfromfocus(h, bangles[0][0], bangles[0][1], n, CCW); } /**/ void draw(picture pic = currentpicture, Label L = "", hyperbola h, align align = NoAlign, pen p = currentpen, arrowbar arrow = None, arrowbar bar = None, margin margin = NoMargin, Label legend = "", marker marker = nomarker) {/*Draw the hyperbola 'h' on 'pic' without (if possible) altering the size of the picture pic.*/ pic.add(new void (frame f, transform t, transform T, pair m, pair M) { // Reduce the bounds by the size of the pen and the margins. m -= min(p); M -= max(p); h.bmin = inverse(t) * m; h.bmax = inverse(t) * M; path hp; picture tmp; hp = t * ((path) (T * h)); if (hp != nullpath) { draw(tmp, L, hp, align, p, arrow, bar, NoMargin, legend, marker); } hyperbola ht = hyperbola(h.F2, h.F1, h.a); ht.bmin = h.bmin; ht.bmax = h.bmax; hp = t * ((path) (T * ht)); if (hp != nullpath) { draw(tmp, "", hp, align, p, arrow, bar, NoMargin, marker); } add(f, tmp.fit()); }, true); pair m = pic.userMin(), M = pic.userMax(); if(m != M) pic.addBox(truepoint(SW), truepoint(NE)); } /**/ void draw(picture pic = currentpicture, Label L = "", explicit conic co, align align = NoAlign, pen p = currentpen, arrowbar arrow = None, arrowbar bar = None, margin margin = NoMargin, Label legend = "", marker marker = nomarker) {/*Use one of the routine 'draw(ellipse, ...)', 'draw(parabola, ...)' or 'draw(hyperbola, ...)' depending of the value of eccentricity of 'co'.*/ if(co.e == 0) draw(pic, L, (circle)co, align, p, arrow, bar, margin, legend, marker); else if(co.e < 1) draw(pic, L, (ellipse)co, align, p, arrow, bar, margin, legend, marker); else if(co.e == 1) draw(pic, L, (parabola)co, align, p, arrow, bar, margin, legend, marker); else if(co.e > 1) draw(pic, L, (hyperbola)co, align, p, arrow, bar, margin, legend, marker); else abort("draw: unknown conic."); } /**/ int conicnodesnumber(conic co, real angle1, real angle2, bool dir = CCW) {/*Return the number of node to draw a conic arc.*/ int oi; if(co.e == 0) { circle c = (circle)co; oi = circlenodesnumber(c.r, angle1, angle2); } else if(co.e < 1) { ellipse el = (ellipse)co; oi = ellipsenodesnumber(el.a, el.b, angle1, angle2, dir); } else if(co.e == 1) { parabola p = (parabola)co; oi = parabolanodesnumber(p, angle1, angle2); } else { hyperbola h = (hyperbola)co; oi = hyperbolanodesnumber(h, angle1, angle2); } return oi; } /**/ path operator cast(conic co) {/*Cast conic section to path.*/ if(co.e < 1) return (path)((ellipse)co); if(co.e == 1) return (path)((parabola)co); return (path)((hyperbola)co); } /**/ bqe equation(explicit conic co) {/*Return the coefficients of the equation of conic section in its coordinate system: bqe.a[0] * x^2 + bqe.a[1] * x * y + bqe.a[2] * y^2 + bqe.a[3] * x + bqe.a[4] * y + bqe.a[5] = 0. One can change the coordinate system of 'bqe' using the routine 'changecoordsys'.*/ bqe obqe; if(co.e == 0) obqe = equation((circle)co); else if(co.e < 1) obqe = equation((ellipse)co); else if(co.e == 1) obqe = equation((parabola)co); else if(co.e > 1) obqe = equation((hyperbola)co); else abort("draw: unknown conic."); return obqe; } /**/ string conictype(bqe bqe) {/*Returned values are "ellipse" or "parabola" or "hyperbola" depending of the conic section represented by 'bqe'.*/ bqe lbqe = changecoordsys(defaultcoordsys, bqe); string os = "degenerated"; real a = lbqe.a[0], b = lbqe.a[1]/2, c = lbqe.a[2], d = lbqe.a[3]/2, f = lbqe.a[4]/2, g = lbqe.a[5]; real delta = a * c * g + b * f * d + d * b * f - (b^2 * g + d^2 * c + f^2 * a); if(abs(delta) < 10 * epsgeo) return os; real J = a * c - b^2; real I = a + c; if(J > epsgeo) { if(delta/I < -epsgeo); os = "ellipse"; } else { if(abs(J) < epsgeo) os = "parabola"; else os = "hyperbola"; } return os; } /**/ conic conic(point M1, point M2, point M3, point M4, point M5) {/*Return the conic passing through 'M1', 'M2', 'M3', 'M4' and 'M5' if the conic is not degenerated.*/ bqe bqe = bqe(M1, M2, M3, M4, M5); string ct = conictype(bqe); if(ct == "degenerated") abort("conic: degenerated conic passing through five points."); if(ct == "ellipse") return ellipse(bqe); if(ct == "parabola") return parabola(bqe); return hyperbola(bqe); } /**/ coordsys canonicalcartesiansystem(explicit conic co) {/*Return the canonical cartesian system of the conic 'co'.*/ if(co.e < 1) return canonicalcartesiansystem((ellipse)co); else if(co.e == 1) return canonicalcartesiansystem((parabola)co); return canonicalcartesiansystem((hyperbola)co); } /**/ bqe canonical(bqe bqe) {/*Return the bivariate quadratic equation relative to the canonical coordinate system of the conic section represented by 'bqe'.*/ string type = conictype(bqe); if(type == "") abort("canonical: the equation can not be performed."); bqe obqe; if(type == "ellipse") { ellipse el = ellipse(bqe); obqe = changecoordsys(canonicalcartesiansystem(el), equation(el)); } else { if(type == "parabola") { parabola p = parabola(bqe); obqe = changecoordsys(canonicalcartesiansystem(p), equation(p)); } else { hyperbola h = hyperbola(bqe); obqe = changecoordsys(canonicalcartesiansystem(h), equation(h)); } } return obqe; } /**/ conic conic(bqe bqe) {/*Return the conic section represented by the bivariate quartic equation 'bqe'.*/ string type = conictype(bqe); if(type == "") abort("canonical: the equation can not be performed."); conic oc; if(type == "ellipse") { oc = ellipse(bqe); } else { if(type == "parabola") oc = parabola(bqe); else oc = hyperbola(bqe); } return oc; } /**/ real arclength(circle c) {/**/ return c.r * 2 * pi; } /**/ real focusToCenter(ellipse el, real a) {/*Return the angle relatively to the center of 'el' for the angle 'a' given relatively to the focus of 'el'.*/ pair p = point(fromFocus(el, a, a, 1, CCW), 0); pair c = locate(el.C); real d = degrees(p - c) - el.angle; d = abs(d) < epsgeo ? 0 : d; // Avoid -1e-15 return d%(sgnd(a) * 360); } /**/ real centerToFocus(ellipse el, real a) {/*Return the angle relatively to the focus of 'el' for the angle 'a' given relatively to the center of 'el'.*/ pair P = point(fromCenter(el, a, a, 1, CCW), 0); pair F1 = locate(el.F1); pair F2 = locate(el.F2); real d = degrees(P - F1) - degrees(F2 - F1); d = abs(d) < epsgeo ? 0 : d; // Avoid -1e-15 return d%(sgnd(a) * 360); } /**/ real arclength(ellipse el) {/**/ return degenerate(el) ? infinity : 4 * el.a * elle(pi/2, el.e); } /**/ real arclength(ellipse el, real angle1, real angle2, bool direction = CCW, polarconicroutine polarconicroutine = currentpolarconicroutine) {/*Return the length of the arc of the ellipse between 'angle1' and 'angle2'. 'angle1' and 'angle2' must be in the interval ]-360;+oo[ if polarconicroutine = fromFocus, ]-oo;+oo[ if polarconicroutine = fromCenter.*/ if(degenerate(el)) return infinity; if(angle1 > angle2) return arclength(el, angle2, angle1, !direction, polarconicroutine); // path g;int n = 1000; // if(el.e == 0) g = arcfromcenter(el, angle1, angle2, n, direction); // if(el.e != 1) g = polarconicroutine(el, angle1, angle2, n, direction); // write("with path = ", arclength(g)); if(polarconicroutine == fromFocus) { // dot(point(fromFocus(el, angle1, angle1, 1, CCW), 0), 2mm + blue); // dot(point(fromFocus(el, angle2, angle2, 1, CCW), 0), 2mm + blue); // write("fromfocus1 = ", angle1); // write("fromfocus2 = ", angle2); real gle1 = focusToCenter(el, angle1); real gle2 = focusToCenter(el, angle2); if((gle1 - gle2) * (angle1 - angle2) > 0) { angle1 = gle1; angle2 = gle2; } else { angle1 = gle2; angle2 = gle1; } // dot(point(fromCenter(el, angle1, angle1, 1, CCW), 0), 1mm + red); // dot(point(fromCenter(el, angle2, angle2, 1, CCW), 0), 1mm + red); // write("fromcenter1 = ", angle1); // write("fromcenter2 = ", angle2); } if(angle1 < 0 || angle2 < 0) return arclength(el, 180 + angle1, 180 + angle2, direction, fromCenter); real a1 = direction ? angle1 : angle2; real a2 = direction ? angle2 : angle1 + 360; real elleq = el.a * elle(pi/2, el.e); real S(real a) {//Return the arclength from 0 to the angle 'a' (in degrees) // given form the center of the ellipse. real gle = atan(el.a * tan(radians(a))/el.b)+ pi * (((a%90 == 0 && a != 0) ? floor(a/90) - 1 : floor(a/90)) - ((a%180 == 0) ? 0 : floor(a/180)) - (a%360 == 0 ? floor(a/(360)) : 0)); /* // Uncomment to visualize the used branches unitsize(2cm, 1cm); import graph; real xmin = 0, xmax = 3pi; xlimits( xmin, xmax); ylimits( 0, 10); yaxis( "y" , LeftRight(), RightTicks(pTick=.8red, ptick = lightgrey, extend = true)); xaxis( "x - value", BottomTop(), Ticks(Label("$%.2f$", red), Step = pi/2, step = pi/4, pTick=.8red, ptick = lightgrey, extend = true)); real p2 = pi/2; real f(real t) { return atan(0.6 * tan(t))+ pi * ((t%p2 == 0 && t != 0) ? floor(t/p2) - 1 : floor(t/p2)) - ((t%pi == 0) ? 0 : pi * floor(t/pi)) - (t%(2pi) == 0 ? pi * floor(t/(2 * pi)) : 0); } draw(graph(f, xmin, xmax, 100)); write(degrees(f(pi/2))); write(degrees(f(pi))); write(degrees(f(3pi/2))); write(degrees(f(2pi))); draw(graph(new real(real t){return t;}, xmin, xmax, 3)); */ return elleq - el.a * elle(pi/2 - gle, el.e); } return S(a2) - S(a1); } /**/ real arclength(parabola p, real angle) {/*Return the arclength from 180 to 'angle' given from focus in the canonical coordinate system of 'p'.*/ real a = p.a; /* In canonicalcartesiansystem(p) the equation of p is x = y^2/(4a) */ // integrate(sqrt(1 + (x/(2 * a))^2), x); real S(real t){return 0.5 * t * sqrt(1 + t^2/(4 * a^2)) + a * asinh(t/(2 * a));} real R(real gle){return 2 * a/(1 - Cos(gle));} real t = Sin(angle) * R(angle); return S(t); } /**/ real arclength(parabola p, real angle1, real angle2) {/*Return the arclength from 'angle1' to 'angle2' given from focus in the canonical coordinate system of 'p'*/ return arclength(p, angle1) - arclength(p, angle2); } /**/ real arclength(parabola p) {/*Return the length of the arc of the parabola bounded to the bounding box of the current picture.*/ real[] b = bangles(p); return arclength(p, b[0], b[1]); } // *........................CONICS.........................* // *=======================================================* // *=======================================================* // *.......................ABSCISSA........................* /**/ struct abscissa {/*Provide abscissa structure on a curve used in the routine-like 'point(object, abscissa)' where object can be 'line','segment','ellipse','circle','conic'...*/ real x;/*The abscissa value.*/ int system;/*0 = relativesystem; 1 = curvilinearsystem; 2 = angularsystem; 3 = nodesystem*/ polarconicroutine polarconicroutine = fromCenter;/*The routine used with angular system and two foci conic section. Possible values are 'formCenter' and 'formFocus'.*/ /**/ abscissa copy() {/*Return a copy of this abscissa.*/ abscissa oa = new abscissa; oa.x = this.x; oa.system = this.system; oa.polarconicroutine = this.polarconicroutine; return oa; } }/**/ /**/ restricted int relativesystem = 0, curvilinearsystem = 1, angularsystem = 2, nodesystem = 3;/*Constant used to set the abscissa system.*/ /**/ abscissa operator cast(explicit position position) {/*Cast position to abscissa. If 'position' is relative, the abscissa is relative else it's a curvilinear abscissa.*/ abscissa oarcc; oarcc.x = position.position.x; oarcc.system = position.relative ? relativesystem : curvilinearsystem; return oarcc; } /**/ abscissa operator +(real x, explicit abscissa a) {/*Provide 'real + abscissa'. Return abscissa b so that b.x = a.x + x. +(explicit abscissa, real), -(real, explicit abscissa) and -(explicit abscissa, real) are also defined.*/ abscissa oa = a.copy(); oa.x = a.x + x; return oa; } abscissa operator +(explicit abscissa a, real x) { return x + a; } abscissa operator +(int x, explicit abscissa a) { return ((real)x) + a; } /**/ abscissa operator -(explicit abscissa a) {/*Return the abscissa b so that b.x = -a.x.*/ abscissa oa; oa.system = a.system; oa.x = -a.x; return oa; } abscissa operator -(real x, explicit abscissa a) { abscissa oa; oa.system = a.system; oa.x = x - a.x; return oa; } abscissa operator -(explicit abscissa a, real x) { abscissa oa; oa.system = a.system; oa.x = a.x - x; return oa; } abscissa operator -(int x, explicit abscissa a) { return ((real)x) - a; } /**/ abscissa operator *(real x, explicit abscissa a) {/*Provide 'real * abscissa'. Return abscissa b so that b.x = x * a.x. *(explicit abscissa, real), /(real, explicit abscissa) and /(explicit abscissa, real) are also defined.*/ abscissa oa; oa.system = a.system; oa.x = a.x * x; return oa; } abscissa operator *(explicit abscissa a, real x) { return x * a; } abscissa operator /(real x, explicit abscissa a) { abscissa oa; oa.system = a.system; oa.x = x/a.x; return oa; } abscissa operator /(explicit abscissa a, real x) { abscissa oa; oa.system = a.system; oa.x = a.x/x; return oa; } abscissa operator /(int x, explicit abscissa a) { return ((real)x)/a; } /**/ abscissa relabscissa(real x) {/*Return a relative abscissa.*/ return (abscissa)(Relative(x)); } abscissa relabscissa(int x) { return (abscissa)(Relative(x)); } /**/ abscissa curabscissa(real x) {/*Return a curvilinear abscissa.*/ return (abscissa)((position)x); } abscissa curabscissa(int x) { return (abscissa)((position)x); } /**/ abscissa angabscissa(real x, polarconicroutine polarconicroutine = currentpolarconicroutine) {/*Return a angular abscissa.*/ abscissa oarcc; oarcc.x = x; oarcc.polarconicroutine = polarconicroutine; oarcc.system = angularsystem; return oarcc; } abscissa angabscissa(int x, polarconicroutine polarconicroutine = currentpolarconicroutine) { return angabscissa((real)x, polarconicroutine); } /**/ abscissa nodabscissa(real x) {/*Return an abscissa as time on the path.*/ abscissa oarcc; oarcc.x = x; oarcc.system = nodesystem; return oarcc; } abscissa nodabscissa(int x) { return nodabscissa((real)x); } /**/ abscissa operator cast(real x) {/*Cast real to abscissa, precisely 'nodabscissa'.*/ return nodabscissa(x); } abscissa operator cast(int x) { return nodabscissa((real)x); } /**/ point point(circle c, abscissa l) {/*Return the point of 'c' which has the abscissa 'l.x' according to the abscissa system 'l.system'.*/ coordsys R = c.C.coordsys; if (l.system == nodesystem) return point(R, point((path)c, l.x)/R); if (l.system == relativesystem) return c.C + point(R, R.polar(c.r, 2 * pi * l.x)); if (l.system == curvilinearsystem) return c.C + point(R, R.polar(c.r, l.x/c.r)); if (l.system == angularsystem) return c.C + point(R, R.polar(c.r, radians(l.x))); abort("point: bad abscissa system."); return (0, 0); } /**/ point point(ellipse el, abscissa l) {/*Return the point of 'el' which has the abscissa 'l.x' according to the abscissa system 'l.system'.*/ if(el.e == 0) return point((circle)el, l); coordsys R = coordsys(el); if (l.system == nodesystem) return point(R, point((path)el, l.x)/R); if (l.system == relativesystem) { return point(el, curabscissa((l.x%1) * arclength(el))); } if (l.system == curvilinearsystem) { real a1 = 0, a2 = 360, cx = 0; real aout = a1; real x = abs(l.x)%arclength(el); while (abs(cx - x) > epsgeo) { aout = (a1 + a2)/2; cx = arclength(el, 0, aout, CCW, fromCenter); //fromCenter is speeder if(cx > x) a2 = (a1 + a2)/2; else a1 = (a1 + a2)/2; } path pel = fromCenter(el, sgn(l.x) * aout, sgn(l.x) * aout, 1, CCW); return point(R, point(pel, 0)/R); } if (l.system == angularsystem) { return point(R, point(l.polarconicroutine(el, l.x, l.x, 1, CCW), 0)/R); } abort("point: bad abscissa system."); return (0, 0); } /**/ point point(parabola p, abscissa l) {/*Return the point of 'p' which has the abscissa 'l.x' according to the abscissa system 'l.system'.*/ coordsys R = coordsys(p); if (l.system == nodesystem) return point(R, point((path)p, l.x)/R); if (l.system == relativesystem) { real[] b = bangles(p); real al = sgn(l.x) > 0 ? arclength(p, 180, b[1]) : arclength(p, 180, b[0]); return point(p, curabscissa(abs(l.x) * al)); } if (l.system == curvilinearsystem) { real a1 = 1e-3, a2 = 360 - 1e-3, cx = infinity; while (abs(cx - l.x) > epsgeo) { cx = arclength(p, 180, (a1 + a2)/2); if(cx > l.x) a2 = (a1 + a2)/2; else a1 = (a1 + a2)/2; } path pp = fromFocus(p, a1, a1, 1, CCW); return point(R, point(pp, 0)/R); } if (l.system == angularsystem) { return point(R, point(fromFocus(p, l.x, l.x, 1, CCW), 0)/R); } abort("point: bad abscissa system."); return (0, 0); } /**/ point point(hyperbola h, abscissa l) {/*Return the point of 'h' which has the abscissa 'l.x' according to the abscissa system 'l.system'.*/ coordsys R = coordsys(h); if (l.system == nodesystem) return point(R, point((path)h, l.x)/R); if (l.system == relativesystem) { abort("point(hyperbola, relativeSystem) is not implemented... Try relpoint((path)your_hyperbola, x);"); } if (l.system == curvilinearsystem) { abort("point(hyperbola, curvilinearSystem) is not implemented..."); } if (l.system == angularsystem) { return point(R, point(l.polarconicroutine(h, l.x, l.x, 1, CCW), 0)/R); } abort("point: bad abscissa system."); return (0, 0); } /**/ point point(explicit conic co, abscissa l) {/*Return the curvilinear abscissa of 'M' on the conic 'co'.*/ if(co.e == 0) return point((circle)co, l); if(co.e < 1) return point((ellipse)co, l); if(co.e == 1) return point((parabola)co, l); return point((hyperbola)co, l); } /**/ point point(line l, abscissa x) {/*Return the point of 'l' which has the abscissa 'l.x' according to the abscissa system 'l.system'. Note that the origin is l.A, and point(l, relabscissa(x)) returns l.A + x.x * vector(l.B - l.A).*/ coordsys R = l.A.coordsys; if (x.system == nodesystem) return l.A + (x.x < 0 ? 0 : x.x > 1 ? 1 : x.x) * vector(l.B - l.A); if (x.system == relativesystem) return l.A + x.x * vector(l.B - l.A); if (x.system == curvilinearsystem) return l.A + x.x * l.u; if (x.system == angularsystem) abort("point: what the meaning of angular abscissa on line ?."); abort("point: bad abscissa system."); return (0, 0); } /**/ point point(line l, explicit real x) {/*Return the point between node l.A and l.B (x <= 0 means l.A, x >=1 means l.B).*/ return point(l, nodabscissa(x)); } point point(line l, explicit int x) { return point(l, nodabscissa(x)); } /**/ point point(explicit circle c, explicit real x) {/*Return the point between node floor(x) and floor(x) + 1.*/ return point(c, nodabscissa(x)); } point point(explicit circle c, explicit int x) { return point(c, nodabscissa(x)); } /**/ point point(explicit ellipse el, explicit real x) {/*Return the point between node floor(x) and floor(x) + 1.*/ return point(el, nodabscissa(x)); } point point(explicit ellipse el, explicit int x) { return point(el, nodabscissa(x)); } /**/ point point(explicit parabola p, explicit real x) {/*Return the point between node floor(x) and floor(x) + 1.*/ return point(p, nodabscissa(x)); } point point(explicit parabola p, explicit int x) { return point(p, nodabscissa(x)); } /**/ point point(explicit hyperbola h, explicit real x) {/*Return the point between node floor(x) and floor(x) + 1.*/ return point(h, nodabscissa(x)); } point point(explicit hyperbola h, explicit int x) { return point(h, nodabscissa(x)); } /**/ point point(explicit conic co, explicit real x) {/*Return the point between node floor(x) and floor(x) + 1.*/ point op; if(co.e == 0) op = point((circle)co, nodabscissa(x)); else if(co.e < 1) op = point((ellipse)co, nodabscissa(x)); else if(co.e == 1) op = point((parabola)co, nodabscissa(x)); else op = point((hyperbola)co, nodabscissa(x)); return op; } point point(explicit conic co, explicit int x) { return point(co, (real)x); } /**/ point relpoint(line l, real x) {/*Return the relative point of 'l' (0 means l.A, 1 means l.B, x means l.A + x * vector(l.B - l.A) ).*/ return point(l, Relative(x)); } /**/ point relpoint(explicit circle c, real x) {/*Return the relative point of 'c' (0 means origin, 1 means end). Origin is c.center + c.r * (1, 0).*/ return point(c, Relative(x)); } /**/ point relpoint(explicit ellipse el, real x) {/*Return the relative point of 'el' (0 means origin, 1 means end).*/ return point(el, Relative(x)); } /**/ point relpoint(explicit parabola p, real x) {/*Return the relative point of the path of the parabola bounded by the bounding box of the current picture. 0 means origin, 1 means end, where the origin is the vertex of 'p'.*/ return point(p, Relative(x)); } /**/ point relpoint(explicit hyperbola h, real x) {/*Not yet implemented... */ return point(h, Relative(x)); } /**/ point relpoint(explicit conic co, explicit real x) {/*Return the relative point of 'co' (0 means origin, 1 means end).*/ point op; if(co.e == 0) op = point((circle)co, Relative(x)); else if(co.e < 1) op = point((ellipse)co, Relative(x)); else if(co.e == 1) op = point((parabola)co, Relative(x)); else op = point((hyperbola)co, Relative(x)); return op; } point relpoint(explicit conic co, explicit int x) { return relpoint(co, (real)x); } /**/ point angpoint(explicit circle c, real x) {/*Return the point of 'c' in the direction 'x' measured in degrees.*/ return point(c, angabscissa(x)); } /**/ point angpoint(explicit ellipse el, real x, polarconicroutine polarconicroutine = currentpolarconicroutine) {/*Return the point of 'el' in the direction 'x' measured in degrees according to 'polarconicroutine'.*/ return el.e == 0 ? angpoint((circle) el, x) : point(el, angabscissa(x, polarconicroutine)); } /**/ point angpoint(explicit parabola p, real x) {/*Return the point of 'p' in the direction 'x' measured in degrees.*/ return point(p, angabscissa(x)); } /**/ point angpoint(explicit hyperbola h, real x, polarconicroutine polarconicroutine = currentpolarconicroutine) {/*Return the point of 'h' in the direction 'x' measured in degrees according to 'polarconicroutine'.*/ return point(h, angabscissa(x, polarconicroutine)); } /**/ point curpoint(line l, real x) {/*Return the point of 'l' which has the curvilinear abscissa 'x'. Origin is l.A.*/ return point(l, curabscissa(x)); } /**/ point curpoint(explicit circle c, real x) {/*Return the point of 'c' which has the curvilinear abscissa 'x'. Origin is c.center + c.r * (1, 0).*/ return point(c, curabscissa(x)); } /**/ point curpoint(explicit ellipse el, real x) {/*Return the point of 'el' which has the curvilinear abscissa 'el'.*/ return point(el, curabscissa(x)); } /**/ point curpoint(explicit parabola p, real x) {/*Return the point of 'p' which has the curvilinear abscissa 'x'. Origin is the vertex of 'p'.*/ return point(p, curabscissa(x)); } /**/ point curpoint(conic co, real x) {/*Return the point of 'co' which has the curvilinear abscissa 'x'.*/ point op; if(co.e == 0) op = point((circle)co, curabscissa(x)); else if(co.e < 1) op = point((ellipse)co, curabscissa(x)); else if(co.e == 1) op = point((parabola)co, curabscissa(x)); else op = point((hyperbola)co, curabscissa(x)); return op; } /**/ abscissa angabscissa(circle c, point M) {/*Return the angular abscissa of 'M' on the circle 'c'.*/ if(!(M @ c)) abort("angabscissa: the point is not on the circle."); abscissa oa; oa.system = angularsystem; oa.x = degrees(M - c.C); if(oa.x < 0) oa.x+=360; return oa; } /**/ abscissa angabscissa(ellipse el, point M, polarconicroutine polarconicroutine = currentpolarconicroutine) {/*Return the angular abscissa of 'M' on the ellipse 'el' according to 'polarconicroutine'.*/ if(!(M @ el)) abort("angabscissa: the point is not on the ellipse."); abscissa oa; oa.system = angularsystem; oa.polarconicroutine = polarconicroutine; oa.x = polarconicroutine == fromCenter ? degrees(M - el.C) : degrees(M - el.F1); oa.x -= el.angle; if(oa.x < 0) oa.x += 360; return oa; } /**/ abscissa angabscissa(hyperbola h, point M, polarconicroutine polarconicroutine = currentpolarconicroutine) {/*Return the angular abscissa of 'M' on the hyperbola 'h' according to 'polarconicroutine'.*/ if(!(M @ h)) abort("angabscissa: the point is not on the hyperbola."); abscissa oa; oa.system = angularsystem; oa.polarconicroutine = polarconicroutine; oa.x = polarconicroutine == fromCenter ? degrees(M - h.C) : degrees(M - h.F1) + 180; oa.x -= h.angle; if(oa.x < 0) oa.x += 360; return oa; } /**/ abscissa angabscissa(parabola p, point M) {/*Return the angular abscissa of 'M' on the parabola 'p'.*/ if(!(M @ p)) abort("angabscissa: the point is not on the parabola."); abscissa oa; oa.system = angularsystem; oa.polarconicroutine = fromFocus;// Not used oa.x = degrees(M - p.F); oa.x -= p.angle; if(oa.x < 0) oa.x += 360; return oa; } /**/ abscissa angabscissa(explicit conic co, point M) {/*Return the angular abscissa of 'M' on the conic 'co'.*/ if(co.e == 0) return angabscissa((circle)co, M); if(co.e < 1) return angabscissa((ellipse)co, M); if(co.e == 1) return angabscissa((parabola)co, M); return angabscissa((hyperbola)co, M); } /**/ abscissa curabscissa(line l, point M) {/*Return the curvilinear abscissa of 'M' on the line 'l'.*/ if(!(M @ extend(l))) abort("curabscissa: the point is not on the line."); abscissa oa; oa.system = curvilinearsystem; oa.x = sgn(dot(M - l.A, l.B - l.A)) * abs(M - l.A); return oa; } /**/ abscissa curabscissa(circle c, point M) {/*Return the curvilinear abscissa of 'M' on the circle 'c'.*/ if(!(M @ c)) abort("curabscissa: the point is not on the circle."); abscissa oa; oa.system = curvilinearsystem; oa.x = pi * angabscissa(c, M).x * c.r/180; return oa; } /**/ abscissa curabscissa(ellipse el, point M) {/*Return the curvilinear abscissa of 'M' on the ellipse 'el'.*/ if(!(M @ el)) abort("curabscissa: the point is not on the ellipse."); abscissa oa; oa.system = curvilinearsystem; real a = angabscissa(el, M, fromCenter).x; oa.x = arclength(el, 0, a, fromCenter); oa.polarconicroutine = fromCenter; return oa; } /**/ abscissa curabscissa(parabola p, point M) {/*Return the curvilinear abscissa of 'M' on the parabola 'p'.*/ if(!(M @ p)) abort("curabscissa: the point is not on the parabola."); abscissa oa; oa.system = curvilinearsystem; real a = angabscissa(p, M).x; oa.x = arclength(p, 180, a); oa.polarconicroutine = fromFocus; // Not used. return oa; } /**/ abscissa curabscissa(conic co, point M) {/*Return the curvilinear abscissa of 'M' on the conic 'co'.*/ if(co.e > 1) abort("curabscissa: not implemented for this hyperbola."); if(co.e == 0) return curabscissa((circle)co, M); if(co.e < 1) return curabscissa((ellipse)co, M); return curabscissa((parabola)co, M); } /**/ abscissa nodabscissa(line l, point M) {/*Return the node abscissa of 'M' on the line 'l'.*/ if(!(M @ (segment)l)) abort("nodabscissa: the point is not on the segment."); abscissa oa; oa.system = nodesystem; oa.x = abs(M - l.A)/abs(l.A - l.B); return oa; } /**/ abscissa nodabscissa(circle c, point M) {/*Return the node abscissa of 'M' on the circle 'c'.*/ if(!(M @ c)) abort("nodabscissa: the point is not on the circle."); abscissa oa; oa.system = nodesystem; oa.x = intersect((path)c, locate(M))[0]; return oa; } /**/ abscissa nodabscissa(ellipse el, point M) {/*Return the node abscissa of 'M' on the ellipse 'el'.*/ if(!(M @ el)) abort("nodabscissa: the point is not on the ellipse."); abscissa oa; oa.system = nodesystem; oa.x = intersect((path)el, M)[0]; return oa; } /**/ abscissa nodabscissa(parabola p, point M) {/*Return the node abscissa OF 'M' on the parabola 'p'.*/ if(!(M @ p)) abort("nodabscissa: the point is not on the parabola."); abscissa oa; oa.system = nodesystem; path pg = p; real[] t = intersect(pg, M, 1e-5); if(t.length == 0) abort("nodabscissa: the point is not on the path of the parabola."); oa.x = t[0]; return oa; } /**/ abscissa nodabscissa(conic co, point M) {/*Return the node abscissa of 'M' on the conic 'co'.*/ if(co.e > 1) abort("nodabscissa: not implemented for hyperbola."); if(co.e == 0) return nodabscissa((circle)co, M); if(co.e < 1) return nodabscissa((ellipse)co, M); return nodabscissa((parabola)co, M); } /**/ abscissa relabscissa(line l, point M) {/*Return the relative abscissa of 'M' on the line 'l'.*/ if(!(M @ extend(l))) abort("relabscissa: the point is not on the line."); abscissa oa; oa.system = relativesystem; oa.x = sgn(dot(M - l.A, l.B - l.A)) * abs(M - l.A)/abs(l.A - l.B); return oa; } /**/ abscissa relabscissa(circle c, point M) {/*Return the relative abscissa of 'M' on the circle 'c'.*/ if(!(M @ c)) abort("relabscissa: the point is not on the circle."); abscissa oa; oa.system = relativesystem; oa.x = angabscissa(c, M).x/360; return oa; } /**/ abscissa relabscissa(ellipse el, point M) {/*Return the relative abscissa of 'M' on the ellipse 'el'.*/ if(!(M @ el)) abort("relabscissa: the point is not on the ellipse."); abscissa oa; oa.system = relativesystem; oa.x = curabscissa(el, M).x/arclength(el); oa.polarconicroutine = fromFocus; return oa; } /**/ abscissa relabscissa(conic co, point M) {/*Return the relative abscissa of 'M' on the conic 'co'.*/ if(co.e > 1) abort("relabscissa: not implemented for hyperbola and parabola."); if(co.e == 1) return relabscissa((parabola)co, M); if(co.e == 0) return relabscissa((circle)co, M); return relabscissa((ellipse)co, M); } // *.......................ABSCISSA........................* // *=======================================================* // *=======================================================* // *.........................ARCS..........................* /**/ struct arc { /*Implement oriented ellipse (included circle) arcs. All the calculus with this structure will be as exact as Asymptote can do. For a full precision, you must not cast 'arc' to 'path' excepted for drawing routines. */ ellipse el;/*The support of the arc.*/ restricted real angle0 = 0;/*Internal use: rotating a circle does not modify the origin point,this variable stocks the eventual angle rotation. This value is not used for ellipses which are not circles.*/ restricted real angle1, angle2;/*Values (in degrees) in ]-360, 360[.*/ bool direction = CCW;/*The arc will be drawn from 'angle1' to 'angle2' rotating in the direction 'direction'.*/ polarconicroutine polarconicroutine = currentpolarconicroutine;/*The routine to which the angles refer. If 'el' is a circle 'fromCenter' is always used.*/ /**/ void setangles(real a0, real a1, real a2) {/*Set the angles.*/ if (a1 < 0 && a2 < 0) { a1 += 360; a2 += 360; } this.angle0 = a0%(sgnd(a0) * 360); this.angle1 = a1%(sgnd(a1) * 360); this.angle2 = a2%(sgnd(2) * 360); } /**/ void init(ellipse el, real angle0 = 0, real angle1, real angle2, polarconicroutine polarconicroutine, bool direction = CCW) {/*Constructor.*/ if(abs(angle1 - angle2) > 360) abort("arc: |angle1 - angle2| > 360."); this.el = el; this.setangles(angle0, angle1, angle2); this.polarconicroutine = polarconicroutine; this.direction = direction; } /**/ arc copy() {/*Copy the arc.*/ arc oa = new arc; oa.el = this.el; oa.direction = this.direction; oa.polarconicroutine = this.polarconicroutine; oa.angle1 = this.angle1; oa.angle2 = this.angle2; oa.angle0 = this.angle0; return oa; } }/**/ /**/ polarconicroutine polarconicroutine(conic co) {/*Return the default routine used to draw a conic.*/ if(co.e == 0) return fromCenter; if(co.e == 1) return fromFocus; return currentpolarconicroutine; } /**/ arc arc(ellipse el, real angle1, real angle2, polarconicroutine polarconicroutine = polarconicroutine(el), bool direction = CCW) {/*Return the ellipse arc from 'angle1' to 'angle2' with respect to 'polarconicroutine' and rotating in the direction 'direction'.*/ arc oa; oa.init(el, 0, angle1, angle2, polarconicroutine, direction); return oa; } /**/ arc complementary(arc a) {/*Return the complementary of 'a'.*/ arc oa; oa.init(a.el, a.angle0, a.angle2, a.angle1, a.polarconicroutine, a.direction); return oa; } /**/ arc reverse(arc a) {/*Return arc 'a' oriented in reverse direction.*/ arc oa; oa.init(a.el, a.angle0, a.angle2, a.angle1, a.polarconicroutine, !a.direction); return oa; } /**/ real degrees(arc a) {/*Return the measure in degrees of the oriented arc 'a'.*/ real or; real da = a.angle2 - a.angle1; if(a.direction) { or = a.angle1 < a.angle2 ? da : 360 + da; } else { or = a.angle1 < a.angle2 ? -360 + da : da; } return or; } /**/ real angle(arc a) {/*Return the measure in radians of the oriented arc 'a'.*/ return radians(degrees(a)); } /**/ int arcnodesnumber(explicit arc a) {/*Return the number of nodes to draw the arc 'a'.*/ return ellipsenodesnumber(a.el.a, a.el.b, a.angle1, a.angle2, a.direction); } private path arctopath(arc a, int n) { if(a.el.e == 0) return arcfromcenter(a.el, a.angle0 + a.angle1, a.angle0 + a.angle2, a.direction, n); if(a.el.e != 1) return a.polarconicroutine(a.el, a.angle1, a.angle2, n, a.direction); return arcfromfocus(a.el, a.angle1, a.angle2, n, a.direction); } /**/ point angpoint(arc a, real angle) {/*Return the point given by its angular position (in degrees) relative to the arc 'a'. If 'angle > degrees(a)' or 'angle < 0' the returned point is on the extended arc.*/ pair p; if(a.el.e == 0) { real gle = a.angle0 + a.angle1 + (a.direction ? angle : -angle); p = point(arcfromcenter(a.el, gle, gle, CCW, 1), 0); } else { real gle = a.angle1 + (a.direction ? angle : -angle); p = point(a.polarconicroutine(a.el, gle, gle, 1, CCW), 0); } return point(coordsys(a.el), p/coordsys(a.el)); } /**/ path operator cast(explicit arc a) {/*Cast arc to path.*/ return arctopath(a, arcnodesnumber(a)); } /**/ guide operator cast(explicit arc a) {/*Cast arc to guide.*/ return arctopath(a, arcnodesnumber(a)); } /**/ arc operator *(transform t, explicit arc a) {/*Provide transform * arc.*/ pair[] P, PP; path g = arctopath(a, 3); real a0, a1 = a.angle1, a2 = a.angle2, ap1, ap2; bool dir = a.direction; P[0] = t * point(g, 0); P[1] = t * point(g, 2); ellipse el = t * a.el; arc oa; a0 = (a.angle0 + angle(shiftless(t)))%360; pair C; if(a.polarconicroutine == fromCenter) C = el.C; else C = el.F1; real d = abs(locate(el.F2 - el.F1)) > epsgeo ? degrees(locate(el.F2 - el.F1)) : a0 + degrees(el.C.coordsys.i); ap1 = (degrees(P[0]-C, false) - d)%360; ap2 = (degrees(P[1]-C, false) - d)%360; oa.init(el, a0, ap1, ap2, a.polarconicroutine, dir); g = arctopath(oa, 3); PP[0] = point(g, 0); PP[1] = point(g, 2); if((a1 - a2) * (ap1 - ap2) < 0) {// Handle reflection. dir=!a.direction; oa.init(el, a0, ap1, ap2, a.polarconicroutine, dir); } return oa; } /**/ arc operator *(real x, explicit arc a) {/*Provide real * arc. Return the arc subtracting and adding '(x - 1) * degrees(a)/2' to 'a.angle1' and 'a.angle2' respectively.*/ real a1, a2, gle; gle = (x - 1) * degrees(a)/2; a1 = a.angle1 - gle; a2 = a.angle2 + gle; arc oa; oa.init(a.el, a.angle0, a1, a2, a.polarconicroutine, a.direction); return oa; } arc operator *(int x, explicit arc a){return (real)x * a;} /**/ arc operator /(explicit arc a, real x) {/*Provide arc/real. Return the arc subtracting and adding '(1/x - 1) * degrees(a)/2' to 'a.angle1' and 'a.angle2' respectively.*/ return (1/x) * a; } /**/ arc operator +(explicit arc a, point M) {/*Provide arc + point. Return shifted arc. 'operator +(explicit arc, point)', 'operator +(explicit arc, vector)' and 'operator -(explicit arc, vector)' are also defined.*/ return shift(M) * a; } arc operator -(explicit arc a, point M){return a + (-M);} arc operator +(explicit arc a, vector v){return shift(locate(v)) * a;} arc operator -(explicit arc a, vector v){return a + (-v);} /**/ bool operator @(point M, arc a) {/*Return true iff 'M' is on the arc 'a'.*/ if (!(M @ a.el)) return false; coordsys R = defaultcoordsys; path ap = arctopath(a, 3); line l = line(point(R, point(ap, 0)), point(R, point(ap, 2))); return sameside(M, point(R, point(ap, 1)), l); } /**/ void draw(picture pic = currentpicture, Label L = "", arc a, align align = NoAlign, pen p = currentpen, arrowbar arrow = None, arrowbar bar = None, margin margin = NoMargin, Label legend = "", marker marker = nomarker) {/*Draw 'arc' adding the pen returned by 'addpenarc(p)' to the pen 'p'. */ draw(pic, L, (path)a, align, addpenarc(p), arrow, bar, margin, legend, marker); } /**/ real arclength(arc a) {/*The arc length of 'a'.*/ return arclength(a.el, a.angle1, a.angle2, a.direction, a.polarconicroutine); } private point ppoint(arc a, real x) {// Return the point of the arc proportionally to its length. point oP; if(a.el.e == 0) { // Case of circle. oP = angpoint(a, x * abs(degrees(a))); } else { // Ellipse and not circle. if(!a.direction) { transform t = reflect(line(a.el.F1, a.el.F2)); return t * ppoint(t * a, x); } real angle1 = a.angle1, angle2 = a.angle2; if(a.polarconicroutine == fromFocus) { // dot(point(fromFocus(a.el, angle1, angle1, 1, CCW), 0), 2mm + blue); // dot(point(fromFocus(a.el, angle2, angle2, 1, CCW), 0), 2mm + blue); // write("fromfocus1 = ", angle1); // write("fromfocus2 = ", angle2); real gle1 = focusToCenter(a.el, angle1); real gle2 = focusToCenter(a.el, angle2); if((gle1 - gle2) * (angle1 - angle2) > 0) { angle1 = gle1; angle2 = gle2; } else { angle1 = gle2; angle2 = gle1; } // write("fromcenter1 = ", angle1); // write("fromcenter2 = ", angle2); // dot(point(fromCenter(a.el, angle1, angle1, 1, CCW), 0), 1mm + red); // dot(point(fromCenter(a.el, angle2, angle2, 1, CCW), 0), 1mm + red); } if(angle1 > angle2) { arc ta = a.copy(); ta.polarconicroutine = fromCenter; ta.setangles(a0 = a.angle0, a1 = angle1 - 360, a2 = angle2); return ppoint(ta, x); } ellipse co = a.el; real gle, a1, a2, cx = 0; bool direction; if(x >= 0) { a1 = angle1; a2 = a1 + 360; direction = CCW; } else { a1 = angle1 - 360; a2 = a1 - 360; direction = CW; } gle = a1; real L = arclength(co, angle1, angle2, a.direction, fromCenter); real tx = L * abs(x)%arclength(co); real aout = a1; while(abs(cx - tx) > epsgeo) { aout = (a1 + a2)/2; cx = abs(arclength(co, gle, aout, direction, fromCenter)); if(cx > tx) a2 = (a1 + a2)/2 ; else a1 = (a1 + a2)/2; } pair p = point(arcfromcenter(co, aout, aout, CCW, 1), 0); oP = point(coordsys(co), p/coordsys(co)); } return oP; } /**/ point point(arc a, abscissa l) {/*Return the point of 'a' which has the abscissa 'l.x' according to the abscissa system 'l.system'. Note that 'a.polarconicroutine' is used instead of 'l.polarconicroutine'. */ real posx; arc ta = a.copy(); ellipse co = a.el; if (l.system == relativesystem) { posx = l.x; } else if (l.system == curvilinearsystem) { real tl; if(co.e == 0) { tl = curabscissa(a.el, angpoint(a.el, a.angle0 + a.angle1)).x; return curpoint(a.el, tl + (a.direction ? l.x : -l.x)); } else { tl = curabscissa(a.el, angpoint(a.el, a.angle1, a.polarconicroutine)).x; return curpoint(a.el, tl + (a.direction ? l.x : -l.x)); } } else if (l.system == nodesystem) { coordsys R = coordsys(co); return point(R, point((path)a, l.x)/R); } else if (l.system == angularsystem) { return angpoint(a, l.x); } else abort("point: bad abscissa system."); return ppoint(ta, posx); } /**/ point point(arc a, real x) {/*Return the point between node floor(t) and floor(t) + 1.*/ return point(a, nodabscissa(x)); } pair point(explicit arc a, int x) { return point(a, nodabscissa(x)); } /**/ point relpoint(arc a, real x) {/*Return the relative point of 'a'. If x > 1 or x < 0, the returned point is on the extended arc.*/ return point(a, relabscissa(x)); } /**/ point curpoint(arc a, real x) {/*Return the point of 'a' which has the curvilinear abscissa 'x'. If x < 0 or x > arclength(a), the returned point is on the extended arc.*/ return point(a, curabscissa(x)); } /**/ abscissa angabscissa(arc a, point M) {/*Return the angular abscissa of 'M' according to the arc 'a'.*/ if(!(M @ a.el)) abort("angabscissa: the point is not on the extended arc."); abscissa oa; oa.system = angularsystem; oa.polarconicroutine = a.polarconicroutine; real am = angabscissa(a.el, M, a.polarconicroutine).x; oa.x = (am - a.angle1 - (a.el.e == 0 ? a.angle0 : 0))%360; oa.x = a.direction ? oa.x : 360 - oa.x; return oa; } /**/ abscissa curabscissa(arc a, point M) {/*Return the curvilinear abscissa according to the arc 'a'.*/ ellipse el = a.el; if(!(M @ el)) abort("angabscissa: the point is not on the extended arc."); abscissa oa; oa.system = curvilinearsystem; real xm = curabscissa(el, M).x; real a0 = el.e == 0 ? a.angle0 : 0; real am = curabscissa(el, angpoint(el, a.angle1 + a0, a.polarconicroutine)).x; real l = arclength(el); oa.x = (xm - am)%l; oa.x = a.direction ? oa.x : l - oa.x; return oa; } /**/ abscissa nodabscissa(arc a, point M) {/*Return the node abscissa according to the arc 'a'.*/ if(!(M @ a)) abort("nodabscissa: the point is not on the arc."); abscissa oa; oa.system = nodesystem; oa.x = intersect((path)a, M)[0]; return oa; } /**/ abscissa relabscissa(arc a, point M) {/*Return the relative abscissa according to the arc 'a'.*/ ellipse el = a.el; if(!( M @ el)) abort("relabscissa: the point is not on the prolonged arc."); abscissa oa; oa.system = relativesystem; oa.x = curabscissa(a, M).x/arclength(a); return oa; } /**/ void markarc(picture pic = currentpicture, Label L = "", int n = 1, real radius = 0, real space = 0, arc a, pen sectorpen = currentpen, pen markpen = sectorpen, margin margin = NoMargin, arrowbar arrow = None, marker marker = nomarker) {/**/ real Da = degrees(a); pair p1 = point(a, 0); pair p2 = relpoint(a, 1); pair c = a.polarconicroutine == fromCenter ? locate(a.el.C) : locate(a.el.F1); if(radius == 0) radius = markangleradius(markpen); if(abs(Da) > 180) radius = -radius; radius = (a.direction ? 1 : -1) * sgnd(Da) * radius; draw(c--p1^^c--p2, sectorpen); markangle(pic = pic, L = L, n = n, radius = radius, space = space, A = p1, O = c, B = p2, arrow = arrow, p = markpen, margin = margin, marker = marker); } // *.........................ARCS..........................* // *=======================================================* // *=======================================================* // *........................MASSES.........................* /**/ struct mass {/**/ point M;/**/ real m;/**/ }/**/ /**/ mass mass(point M, real m) {/*Constructor of mass point.*/ mass om; om.M = M; om.m = m; return om; } /**/ point operator cast(mass m) {/*Cast mass point to point.*/ point op; op = m.M; op.m = m.m; return op; } /**/ point point(explicit mass m){return m;}/*Cast 'm' to point*/ /**/ mass operator cast(point M) {/*Cast point to mass point.*/ mass om; om.M = M; om.m = M.m; return om; } /**/ mass mass(explicit point P) {/*Cast 'P' to mass.*/ return mass(P, P.m); } /**/ point[] operator cast(mass[] m) {/*Cast mass[] to point[].*/ point[] op; for(mass am : m) op.push(point(am)); return op; } /**/ mass[] operator cast(point[] P) {/*Cast point[] to mass[].*/ mass[] om; for(point op : P) om.push(mass(op)); return om; } /**/ mass mass(coordsys R, explicit pair p, real m) {/*Return the mass which has coordinates 'p' with respect to 'R' and weight 'm'.*/ return point(R, p, m);// Using casting. } /**/ mass operator cast(pair m){return mass((point)m, 1);}/*Cast pair to mass point.*/ /**/ path operator cast(mass M){return M.M;}/*Cast mass point to path.*/ /**/ guide operator cast(mass M){return M.M;}/*Cast mass to guide.*/ /**/ mass operator +(mass M1, mass M2) {/*Provide mass + mass. mass - mass is also defined.*/ return mass(M1.M + M2.M, M1.m + M2.m); } mass operator -(mass M1, mass M2) { return mass(M1.M - M2.M, M1.m - M2.m); } /**/ mass operator *(real x, explicit mass M) {/*Provide real * mass. The resulted mass is the mass of 'M' multiplied by 'x' . mass/real, mass + real and mass - real are also defined.*/ return mass(M.M, x * M.m); } mass operator *(int x, explicit mass M){return mass(M.M, x * M.m);} mass operator /(explicit mass M, real x){return mass(M.M, M.m/x);} mass operator /(explicit mass M, int x){return mass(M.M, M.m/x);} mass operator +(explicit mass M, real x){return mass(M.M, M.m + x);} mass operator +(explicit mass M, int x){return mass(M.M, M.m + x);} mass operator -(explicit mass M, real x){return mass(M.M, M.m - x);} mass operator -(explicit mass M, int x){return mass(M.M, M.m - x);} /**/ mass operator *(transform t, mass M) {/*Provide transform * mass.*/ return mass(t * M.M, M.m); } /**/ mass masscenter(... mass[] M) {/*Return the center of the masses 'M'.*/ point[] P; for (int i = 0; i < M.length; ++i) P.push(M[i].M); P = standardizecoordsys(currentcoordsys, true ... P); real m = M[0].m; point oM = M[0].m * P[0]; for (int i = 1; i < M.length; ++i) { oM += M[i].m * P[i]; m += M[i].m; } if (m == 0) abort("masscenter: the sum of masses is null."); return mass(oM/m, m); } /**/ string massformat(string format = defaultmassformat, string s, mass M) {/*Return the string formated by 'format' with the mass value. In the parameter 'format', %L will be replaced by 's'. .*/ return format == "" ? s : format(replace(format, "%L", replace(s, "$", "")), M.m); } /**/ void label(picture pic = currentpicture, Label L, explicit mass M, align align = NoAlign, string format = defaultmassformat, pen p = nullpen, filltype filltype = NoFill) {/*Draw label returned by massformat(format, L, M) at coordinates of M. .*/ Label lL = L.copy(); lL.s = massformat(format, lL.s, M); Label L = Label(lL, M.M, align, p, filltype); add(pic, L); } /**/ void dot(picture pic = currentpicture, Label L, explicit mass M, align align = NoAlign, string format = defaultmassformat, pen p = currentpen) {/*Draw a dot with label 'L' as label(picture, Label, explicit mass, align, string, pen, filltype) does. .*/ Label lL = L.copy(); lL.s = massformat(format, lL.s, M); lL.position(locate(M.M)); lL.align(align, E); lL.p(p); dot(pic, M.M, p); add(pic, lL); } // *........................MASSES.........................* // *=======================================================* // *=======================================================* // *.......................TRIANGLES.......................* /**/ point orthocenter(point A, point B, point C) {/*Return the orthocenter of the triangle ABC.*/ point[] P = standardizecoordsys(A, B, C); coordsys R = P[0].coordsys; pair pp = extension(A, projection(P[1], P[2]) * P[0], B, projection(P[0], P[2]) * P[1]); return point(R, pp/R); } /**/ point centroid(point A, point B, point C) {/*Return the centroid of the triangle ABC.*/ return (A + B + C)/3; } /**/ point incenter(point A, point B, point C) {/*Return the center of the incircle of the triangle ABC.*/ point[] P = standardizecoordsys(A, B, C); coordsys R = P[0].coordsys; pair a = A, b = B, c = C; pair pp = extension(a, a + dir(a--b, a--c), b, b + dir(b--a, b--c)); return point(R, pp/R); } /**/ real inradius(point A, point B, point C) {/*Return the radius of the incircle of the triangle ABC.*/ point IC = incenter(A, B, C); return abs(IC - projection(A, B) * IC); } /**/ circle incircle(point A, point B, point C) {/*Return the incircle of the triangle ABC.*/ point IC = incenter(A, B, C); return circle(IC, abs(IC - projection(A, B) * IC)); } /**/ point excenter(point A, point B, point C) {/*Return the center of the excircle of the triangle tangent with (AB).*/ point[] P = standardizecoordsys(A, B, C); coordsys R = P[0].coordsys; pair a = A, b = B, c = C; pair pp = extension(a, a + rotate(90) * dir(a--b, a--c), b, b + rotate(90) * dir(b--a, b--c)); return point(R, pp/R); } /**/ real exradius(point A, point B, point C) {/*Return the radius of the excircle of the triangle ABC with (AB).*/ point EC = excenter(A, B, C); return abs(EC - projection(A, B) * EC); } /**/ circle excircle(point A, point B, point C) {/*Return the excircle of the triangle ABC tangent with (AB).*/ point center = excenter(A, B, C); real radius = abs(center - projection(B, C) * center); return circle(center, radius); } private int[] numarray = {1, 2, 3}; numarray.cyclic = true; /**/ struct triangle {/**/ /**/ struct vertex {/*Structure used to communicate the vertex of a triangle.*/ int n;/*1 means VA,2 means VB,3 means VC,4 means VA etc...*/ triangle t;/*The triangle to which the vertex refers.*/ }/**/ /**/ restricted point A, B, C;/*The vertices of the triangle (as point).*/ restricted vertex VA, VB, VC;/*The vertices of the triangle (as vertex). Note that the vertex structure contains the triangle to wish it refers.*/ VA.n = 1;VB.n = 2;VC.n = 3; /**/ vertex vertex(int n) {/*Return numbered vertex. 'n' is 1 means VA, 2 means VB, 3 means VC, 4 means VA etc...*/ n = numarray[n - 1]; if(n == 1) return VA; else if(n == 2) return VB; return VC; } /**/ point point(int n) {/*Return numbered point. n is 1 means A, 2 means B, 3 means C, 4 means A etc...*/ n = numarray[n - 1]; if(n == 1) return A; else if(n == 2) return B; return C; } /**/ void init(point A, point B, point C) {/*Constructor.*/ point[] P = standardizecoordsys(A, B, C); this.A = P[0]; this.B = P[1]; this.C = P[2]; VA.t = this; VB.t = this; VC.t = this; } /**/ void operator init(point A, point B, point C) {/*For backward compatibility. Provide the routine 'triangle(point A, point B, point C)'.*/ this.init(A, B, C); } /**/ void operator init(real b, real alpha, real c, real angle = 0, point A = (0, 0)) {/*For backward compatibility. Provide the routine 'triangle(real b, real alpha, real c, real angle = 0, point A = (0, 0)) which returns the triangle ABC rotated by 'angle' (in degrees) and where b = AC, degrees(A) = alpha, AB = c.*/ coordsys R = A.coordsys; this.init(A, A + R.polar(c, radians(angle)), A + R.polar(b, radians(angle + alpha))); } /**/ real a() {/*Return the length BC. b() and c() are also defined and return the length AC and AB respectively.*/ return length(C - B); } real b() {return length(A - C);} real c() {return length(B - A);} private real det(pair a, pair b) {return a.x * b.y - a.y * b.x;} /**/ real area() {/**/ pair a = locate(A), b = locate(B), c = locate(C); return 0.5 * abs(det(a, b) + det(b, c) + det(c, a)); } /**/ real alpha() {/*Return the measure (in degrees) of the angle A. beta() and gamma() are also defined and return the measure of the angles B and C respectively.*/ return degrees(acos((b()^2 + c()^2 - a()^2)/(2b() * c()))); } real beta() {return degrees(acos((c()^2 + a()^2 - b()^2)/(2c() * a())));} real gamma() {return degrees(acos((a()^2 + b()^2 - c()^2)/(2a() * b())));} /**/ path Path() // retained for backward compatibility {/*The path of the triangle.*/ return A--B--C--cycle; } /**/ struct side {/*Structure used to communicate the side of a triangle.*/ int n;/*1 or 0 means [AB],-1 means [BA],2 means [BC],-2 means [CB] etc.*/ triangle t;/*The triangle to which the side refers.*/ }/**/ /**/ side AB;/*For the routines using the structure 'side', triangle.AB means 'side AB'. BA, AC, CA etc are also defined.*/ AB.n = 1; AB.t = this; side BA; BA.n = -1; BA.t = this; side BC; BC.n = 2; BC.t = this; side CB; CB.n = -2; CB.t = this; side CA; CA.n = 3; CA.t = this; side AC; AC.n = -3; AC.t = this; /**/ side side(int n) {/*Return numbered side. n is 1 means AB, -1 means BA, 2 means BC, -2 means CB, etc.*/ if(n == 0) abort('Invalid side number.'); int an = numarray[abs(n)-1]; if(an == 1) return n > 0 ? AB : BA; else if(an == 2) return n > 0 ? BC : CB; return n > 0 ? CA : AC; } /**/ line line(int n) {/*Return the numbered line.*/ if(n == 0) abort('Invalid line number.'); int an = numarray[abs(n)-1]; if(an == 1) return n > 0 ? line(A, B) : line(B, A); else if(an == 2) return n > 0 ? line(B, C) : line(C, B); return n > 0 ? line(C, A) : line(A, C); } }/**/ path operator cast(triangle t) { return t.A -- t.B -- t.C -- cycle; } from triangle unravel side; // The structure 'side' is now available outside the triangle structure. from triangle unravel vertex; // The structure 'vertex' is now available outside the triangle structure. triangle[] operator ^^(triangle[] t1, triangle t2) { triangle[] T; for (int i = 0; i < t1.length; ++i) T.push(t1[i]); T.push(t2); return T; } triangle[] operator ^^(... triangle[] t) { triangle[] T; for (int i = 0; i < t.length; ++i) { T.push(t[i]); } return T; } /**/ line operator cast(side side) {/*Cast side to (infinite) line. Most routine with line parameters works with side parameters. One can use the code 'segment(a_side)' to obtain a line segment.*/ triangle t = side.t; return t.line(side.n); } /**/ line line(explicit side side) {/*Return 'side' as line.*/ return (line)side; } /**/ segment segment(explicit side side) {/*Return 'side' as segment.*/ return (segment)(line)side; } /**/ point operator cast(vertex V) {/*Cast vertex to point. Most routine with point parameters works with vertex parameters.*/ return V.t.point(V.n); } /**/ point point(explicit vertex V) {/*Return the point corresponding to the vertex 'V'.*/ return (point)V; } /**/ side opposite(vertex V) {/*Return the opposite side of vertex 'V'.*/ return V.t.side(numarray[abs(V.n)]); } /**/ vertex opposite(side side) {/*Return the opposite vertex of side 'side'.*/ return side.t.vertex(numarray[abs(side.n) + 1]); } /**/ point midpoint(side side) {/**/ return midpoint(segment(side)); } /**/ triangle operator *(transform T, triangle t) {/*Provide transform * triangle.*/ return triangle(T * t.A, T * t.B, T * t.C); } /**/ triangle triangleAbc(real alpha, real b, real c, real angle = 0, point A = (0, 0)) {/*Return the triangle ABC rotated by 'angle' with BAC = alpha, AC = b and AB = c.*/ triangle T; coordsys R = A.coordsys; T.init(A, A + R.polar(c, radians(angle)), A + R.polar(b, radians(angle + alpha))); return T; } /**/ triangle triangleabc(real a, real b, real c, real angle = 0, point A = (0, 0)) {/*Return the triangle ABC rotated by 'angle' with BC = a, AC = b and AB = c.*/ triangle T; coordsys R = A.coordsys; T.init(A, A + R.polar(c, radians(angle)), A + R.polar(b, radians(angle) + acos((b^2 + c^2 - a^2)/(2 * b * c)))); return T; } /**/ triangle triangle(line l1, line l2, line l3) {/*Return the triangle defined by three line.*/ point P1, P2, P3; P1 = intersectionpoint(l1, l2); P2 = intersectionpoint(l1, l3); P3 = intersectionpoint(l2, l3); if(!(defined(P1) && defined(P2) && defined(P3))) abort("triangle: two lines are parallel."); return triangle(P1, P2, P3); } /**/ point foot(vertex V) {/*Return the endpoint of the altitude from V.*/ return projection((line)opposite(V)) * ((point)V); } /**/ point foot(side side) {/*Return the endpoint of the altitude on 'side'.*/ return projection((line)side) * point(opposite(side)); } /**/ line altitude(vertex V) {/*Return the altitude passing through 'V'.*/ return line(point(V), foot(V)); } /**/ line altitude(side side) {/*Return the altitude cutting 'side'.*/ return altitude(opposite(side)); } /**/ point orthocenter(triangle t) {/*Return the orthocenter of the triangle t.*/ return orthocenter(t.A, t.B, t.C); } /**/ point centroid(triangle t) {/*Return the centroid of the triangle 't'.*/ return (t.A + t.B + t.C)/3; } /**/ point circumcenter(triangle t) {/*Return the circumcenter of the triangle 't'.*/ return circumcenter(t.A, t.B, t.C); } /**/ circle circle(triangle t) {/*Return the circumcircle of the triangle 't'.*/ return circle(t.A, t.B, t.C); } /**/ circle circumcircle(triangle t) {/*Return the circumcircle of the triangle 't'.*/ return circle(t.A, t.B, t.C); } /**/ point incenter(triangle t) {/*Return the center of the incircle of the triangle 't'.*/ return incenter(t.A, t.B, t.C); } /**/ real inradius(triangle t) {/*Return the radius of the incircle of the triangle 't'.*/ return inradius(t.A, t.B, t.C); } /**/ circle incircle(triangle t) {/*Return the the incircle of the triangle 't'.*/ return incircle(t.A, t.B, t.C); } /**/ point excenter(side side) {/*Return the center of the excircle tangent with the side 'side' of its triangle. side = 0 means AB, 1 means AC, other means BC. One must use the predefined sides t.AB, t.AC where 't' is a triangle....*/ point op; triangle t = side.t; int n = numarray[abs(side.n) - 1]; if(n == 1) op = excenter(t.A, t.B, t.C); else if(n == 2) op = excenter(t.B, t.C, t.A); else op = excenter(t.C, t.A, t.B); return op; } /**/ real exradius(side side) {/*Return radius of the excircle tangent with the side 'side' of its triangle. side = 0 means AB, 1 means BC, other means CA. One must use the predefined sides t.AB, t.AC where 't' is a triangle....*/ real or; triangle t = side.t; int n = numarray[abs(side.n) - 1]; if(n == 1) or = exradius(t.A, t.B, t.C); else if(n == 2) or = exradius(t.B, t.C, t.A); else or = exradius(t.A, t.C, t.B); return or; } /**/ circle excircle(side side) {/*Return the excircle tangent with the side 'side' of its triangle. side = 0 means AB, 1 means AC, other means BC. One must use the predefined sides t.AB, t.AC where 't' is a triangle....*/ circle oc; int n = numarray[abs(side.n) - 1]; triangle t = side.t; if(n == 1) oc = excircle(t.A, t.B, t.C); else if(n == 2) oc = excircle(t.B, t.C, t.A); else oc = excircle(t.A, t.C, t.B); return oc; } /**/ struct trilinear {/*Trilinear coordinates 'a:b:c' relative to triangle 't'. */ real a,b,c;/*The trilinear coordinates.*/ triangle t;/*The reference triangle.*/ }/**/ /**/ trilinear trilinear(triangle t, real a, real b, real c) {/*Return the trilinear coordinates relative to 't'. */ trilinear ot; ot.a = a; ot.b = b; ot.c = c; ot.t = t; return ot; } /**/ trilinear trilinear(triangle t, point M) {/*Return the trilinear coordinates of 'M' relative to 't'. */ trilinear ot; pair m = locate(M); int sameside(pair A, pair B, pair m, pair p) {// Return 1 if 'm' and 'p' are same side of line (AB) else return -1. pair mil = (A + B)/2; pair mA = rotate(90, mil) * A; pair mB = rotate(-90, mil) * A; return (abs(m - mA) <= abs(m - mB)) == (abs(p - mA) <= abs(p - mB)) ? 1 : -1; } real det(pair a, pair b) {return a.x * b.y - a.y * b.x;} real area(pair a, pair b, pair c){return 0.5 * abs(det(a, b) + det(b, c) + det(c, a));} pair A = t.A, B = t.B, C = t.C; real t1 = area(B, C, m), t2 = area(C, A, m), t3 = area(A, B, m); ot.a = sameside(B, C, A, m) * t1/t.a(); ot.b = sameside(A, C, B, m) * t2/t.b(); ot.c = sameside(A, B, C, m) * t3/t.c(); ot.t = t; return ot; } /**/ void write(trilinear tri) {/**/ write(format("%f : ", tri.a) + format("%f : ", tri.b) + format("%f", tri.c)); } /**/ point point(trilinear tri) {/*Return the trilinear coordinates relative to 't'. */ triangle t = tri.t; return masscenter(0.5 * t.a() * mass(t.A, tri.a), 0.5 * t.b() * mass(t.B, tri.b), 0.5 * t.c() * mass(t.C, tri.c)); } /**/ int[] tricoef(side side) {/*Return an array of integer (values are 0 or 1) which represents 'side'. For example, side = t.BC will be represented by {0, 1, 1}.*/ int[] oi; int n = numarray[abs(side.n) - 1]; oi.push((n == 1 || n == 3) ? 1 : 0); oi.push((n == 1 || n == 2) ? 1 : 0); oi.push((n == 2 || n == 3) ? 1 : 0); return oi; } /**/ point operator cast(trilinear tri) {/*Cast trilinear to point. One may use the routine 'point(trilinear)' to force the casting.*/ return point(tri); } /**/ typedef real centerfunction(real, real, real);/**/ /**/ trilinear trilinear(triangle t, centerfunction f, real a = t.a(), real b = t.b(), real c = t.c()) {/**/ return trilinear(t, f(a, b, c), f(b, c, a), f(c, a, b)); } /**/ point symmedian(triangle t) {/*Return the symmedian point of 't'.*/ point A, B, C; real a = t.a(), b = t.b(), c = t.c(); A = trilinear(t, 0, b, c); B = trilinear(t, a, 0, c); return intersectionpoint(line(t.A, A), line(t.B, B)); } /**/ point symmedian(side side) {/*The symmedian point on the side 'side'.*/ triangle t = side.t; int n = numarray[abs(side.n) - 1]; if(n == 1) return trilinear(t, t.a(), t.b(), 0); if(n == 2) return trilinear(t, 0, t.b(), t.c()); return trilinear(t, t.a(), 0, t.c()); } /**/ line symmedian(vertex V) {/*Return the symmedian passing through 'V'.*/ return line(point(V), symmedian(V.t)); } /**/ triangle cevian(triangle t, point P) {/*Return the Cevian triangle with respect of 'P' .*/ trilinear tri = trilinear(t, locate(P)); point A = point(trilinear(t, 0, tri.b, tri.c)); point B = point(trilinear(t, tri.a, 0, tri.c)); point C = point(trilinear(t, tri.a, tri.b, 0)); return triangle(A, B, C); } /**/ point cevian(side side, point P) {/*Return the Cevian point on 'side' with respect of 'P'.*/ triangle t = side.t; trilinear tri = trilinear(t, locate(P)); int[] s = tricoef(side); return point(trilinear(t, s[0] * tri.a, s[1] * tri.b, s[2] * tri.c)); } /**/ line cevian(vertex V, point P) {/*Return line passing through 'V' and its Cevian image with respect of 'P'.*/ return line(point(V), cevian(opposite(V), P)); } /**/ point gergonne(triangle t) {/*Return the Gergonne point of 't'.*/ real f(real a, real b, real c){return 1/(a * (b + c - a));} return point(trilinear(t, f)); } /**/ point[] fermat(triangle t) {/*Return the Fermat points of 't'.*/ point[] P; real A = t.alpha(), B = t.beta(), C = t.gamma(); P.push(point(trilinear(t, 1/Sin(A + 60), 1/Sin(B + 60), 1/Sin(C + 60)))); P.push(point(trilinear(t, 1/Sin(A - 60), 1/Sin(B - 60), 1/Sin(C - 60)))); return P; } /**/ point isotomicconjugate(triangle t, point M) {/**/ if(!inside(t.Path(), locate(M))) abort("isotomic: the point must be inside the triangle."); trilinear tr = trilinear(t, M); return point(trilinear(t, 1/(t.a()^2 * tr.a), 1/(t.b()^2 * tr.b), 1/(t.c()^2 * tr.c))); } /**/ line isotomic(vertex V, point M) {/*.*/ side op = opposite(V); return line(V, rotate(180, midpoint(op)) * cevian(op, M)); } /**/ point isotomic(side side, point M) {/**/ return intersectionpoint(isotomic(opposite(side), M), side); } /**/ triangle isotomic(triangle t, point M) {/**/ return triangle(isotomic(t.BC, M), isotomic(t.CA, M), isotomic(t.AB, M)); } /**/ point isogonalconjugate(triangle t, point M) {/**/ trilinear tr = trilinear(t, M); return point(trilinear(t, 1/tr.a, 1/tr.b, 1/tr.c)); } /**/ point isogonal(side side, point M) {/**/ return cevian(side, isogonalconjugate(side.t, M)); } /**/ line isogonal(vertex V, point M) {/**/ return line(V, isogonal(opposite(V), M)); } /**/ triangle isogonal(triangle t, point M) {/**/ return triangle(isogonal(t.BC, M), isogonal(t.CA, M), isogonal(t.AB, M)); } /**/ triangle pedal(triangle t, point M) {/*Return the pedal triangle of 'M' in 't'. */ return triangle(projection(t.BC) * M, projection(t.AC) * M, projection(t.AB) * M); } /**/ line pedal(side side, point M) {/*Return the pedal line of 'M' cutting 'side'. */ return line(M, projection(side) * M); } /**/ triangle antipedal(triangle t, point M) {/**/ trilinear Tm = trilinear(t, M); real a = Tm.a, b = Tm.b, c = Tm.c; real CA = Cos(t.alpha()), CB = Cos(t.beta()), CC = Cos(t.gamma()); point A = trilinear(t, -(b + a * CC) * (c + a * CB), (c + a * CB) * (a + b * CC), (b + a * CC) * (a + c * CB)); point B = trilinear(t, (c + b * CA) * (b + a * CC), -(c + b * CA) * (a + b * CC), (a + b * CC) * (b + c * CA)); point C = trilinear(t, (b + c * CA) * (c + a * CB), (a + c * CB) * (c + b * CA), -(a + c * CB) * (b + c * CA)); return triangle(A, B, C); } /**/ triangle extouch(triangle t) {/*Return the extouch triangle of the triangle 't'. The extouch triangle of 't' is the triangle formed by the points of tangency of a triangle 't' with its excircles.*/ point A, B, C; real a = t.a(), b = t.b(), c = t.c(); A = trilinear(t, 0, (a - b + c)/b, (a + b - c)/c); B = trilinear(t, (-a + b + c)/a, 0, (a + b - c)/c); C = trilinear(t, (-a + b + c)/a, (a - b + c)/b, 0); return triangle(A, B, C); } /**/ triangle incentral(triangle t) {/*Return the incentral triangle of the triangle 't'. It is the triangle whose vertices are determined by the intersections of the reference triangle's angle bisectors with the respective opposite sides.*/ point A, B, C; // real a = t.a(), b = t.b(), c = t.c(); A = trilinear(t, 0, 1, 1); B = trilinear(t, 1, 0, 1); C = trilinear(t, 1, 1, 0); return triangle(A, B, C); } /**/ triangle extouch(side side) {/*Return the triangle formed by the points of tangency of the triangle referenced by 'side' with its excircles. One vertex of the returned triangle is on the segment 'side'.*/ triangle t = side.t; transform p1 = projection((line)t.AB); transform p2 = projection((line)t.AC); transform p3 = projection((line)t.BC); point EP = excenter(side); return triangle(p3 * EP, p2 * EP, p1 * EP); } /**/ point bisectorpoint(side side) {/*The intersection point of the angle bisector from the opposite point of 'side' with the side 'side'.*/ triangle t = side.t; int n = numarray[abs(side.n) - 1]; if(n == 1) return trilinear(t, 1, 1, 0); if(n == 2) return trilinear(t, 0, 1, 1); return trilinear(t, 1, 0, 1); } /**/ line bisector(vertex V, real angle = 0) {/*Return the interior bisector passing through 'V' rotated by angle (in degrees) around 'V'.*/ return rotate(angle, point(V)) * line(point(V), incenter(V.t)); } /**/ line bisector(side side) {/*Return the bisector of the line segment 'side'.*/ return bisector(segment(side)); } /**/ point intouch(side side) {/*The point of tangency on the side 'side' of its incircle.*/ triangle t = side.t; real a = t.a(), b = t.b(), c = t.c(); int n = numarray[abs(side.n) - 1]; if(n == 1) return trilinear(t, b * c/(-a + b + c), a * c/(a - b + c), 0); if(n == 2) return trilinear(t, 0, a * c/(a - b + c), a * b/(a + b - c)); return trilinear(t, b * c/(-a + b + c), 0, a * b/(a + b - c)); } /**/ triangle intouch(triangle t) {/*Return the intouch triangle of the triangle 't'. The intouch triangle of 't' is the triangle formed by the points of tangency of a triangle 't' with its incircles.*/ point A, B, C; real a = t.a(), b = t.b(), c = t.c(); A = trilinear(t, 0, a * c/(a - b + c), a * b/(a + b - c)); B = trilinear(t, b * c/(-a + b + c), 0, a * b/(a + b - c)); C = trilinear(t, b * c/(-a + b + c), a * c/(a - b + c), 0); return triangle(A, B, C); } /**/ triangle tangential(triangle t) {/*Return the tangential triangle of the triangle 't'. The tangential triangle of 't' is the triangle formed by the lines tangent to the circumcircle of the given triangle 't' at its vertices.*/ point A, B, C; real a = t.a(), b = t.b(), c = t.c(); A = trilinear(t, -a, b, c); B = trilinear(t, a, -b, c); C = trilinear(t, a, b, -c); return triangle(A, B, C); } /**/ triangle medial(triangle t) {/*Return the triangle whose vertices are midpoints of the sides of 't'.*/ return triangle(midpoint(t.BC), midpoint(t.AC), midpoint(t.AB)); } /**/ line median(vertex V) {/*Return median from 'V'.*/ return line(point(V), midpoint(segment(opposite(V)))); } /**/ line median(side side) {/*Return median from the opposite vertex of 'side'.*/ return median(opposite(side)); } /**/ triangle orthic(triangle t) {/*Return the triangle whose vertices are endpoints of the altitudes from each of the vertices of 't'.*/ return triangle(foot(t.BC), foot(t.AC), foot(t.AB)); } /**/ triangle symmedial(triangle t) {/*Return the symmedial triangle of 't'.*/ point A, B, C; real a = t.a(), b = t.b(), c = t.c(); A = trilinear(t, 0, b, c); B = trilinear(t, a, 0, c); C = trilinear(t, a, b, 0); return triangle(A, B, C); } /**/ triangle anticomplementary(triangle t) {/*Return the triangle which has the given triangle 't' as its medial triangle.*/ real a = t.a(), b = t.b(), c = t.c(); real ab = a * b, bc = b * c, ca = c * a; point A = trilinear(t, -bc, ca, ab); point B = trilinear(t, bc, -ca, ab); point C = trilinear(t, bc, ca, -ab); return triangle(A, B, C); } /**/ point[] intersectionpoints(triangle t, line l, bool extended = false) {/*Return the intersection points. If 'extended' is true, the sides are lines else the sides are segments. intersectionpoints(line, triangle, bool) is also defined.*/ point[] OP; void addpoint(point P) { if(defined(P)) { bool exist = false; for (int i = 0; i < OP.length; ++i) { if(P == OP[i]) {exist = true; break;} } if(!exist) OP.push(P); } } if(extended) { for (int i = 1; i <= 3; ++i) { addpoint(intersectionpoint(t.line(i), l)); } } else { for (int i = 1; i <= 3; ++i) { addpoint(intersectionpoint((segment)t.line(i), l)); } } return OP; } point[] intersectionpoints(line l, triangle t, bool extended = false) { return intersectionpoints(t, l, extended); } /**/ vector dir(vertex V) {/*The direction (towards the outside of the triangle) of the interior angle bisector of 'V'.*/ triangle t = V.t; if(V.n == 1) return vector(defaultcoordsys, (-dir(t.A--t.B, t.A--t.C))); if(V.n == 2) return vector(defaultcoordsys, (-dir(t.B--t.A, t.B--t.C))); return vector(defaultcoordsys, (-dir(t.C--t.A, t.C--t.B))); } /**/ void label(picture pic = currentpicture, Label L, vertex V, pair align = dir(V), real alignFactor = 1, pen p = nullpen, filltype filltype = NoFill) {/*Draw 'L' on picture 'pic' at vertex 'V' aligned by 'alignFactor * align'.*/ label(pic, L, locate(point(V)), alignFactor * align, p, filltype); } /**/ void label(picture pic = currentpicture, Label LA = "$A$", Label LB = "$B$", Label LC = "$C$", triangle t, real alignAngle = 0, real alignFactor = 1, pen p = nullpen, filltype filltype = NoFill) {/*Draw labels LA, LB and LC aligned in the rotated (by 'alignAngle' in degrees) direction (towards the outside of the triangle) of the interior angle bisector of vertices. One can individually modify the alignment by setting the Label parameter 'align'.*/ Label lla = LA.copy(); lla.align(lla.align, rotate(alignAngle) * locate(dir(t.VA))); label(pic, LA, t.VA, align = lla.align.dir, alignFactor = alignFactor, p, filltype); Label llb = LB.copy(); llb.align(llb.align, rotate(alignAngle) * locate(dir(t.VB))); label(pic, llb, t.VB, align = llb.align.dir, alignFactor = alignFactor, p, filltype); Label llc = LC.copy(); llc.align(llc.align, rotate(alignAngle) * locate(dir(t.VC))); label(pic, llc, t.VC, align = llc.align.dir, alignFactor = alignFactor, p, filltype); } /**/ void show(picture pic = currentpicture, Label LA = "$A$", Label LB = "$B$", Label LC = "$C$", Label La = "$a$", Label Lb = "$b$", Label Lc = "$c$", triangle t, pen p = currentpen, filltype filltype = NoFill) {/*Draw triangle and labels of sides and vertices.*/ pair a = locate(t.A), b = locate(t.B), c = locate(t.C); draw(pic, a--b--c--cycle, p); label(pic, LA, a, -dir(a--b, a--c), p, filltype); label(pic, LB, b, -dir(b--a, b--c), p, filltype); label(pic, LC, c, -dir(c--a, c--b), p, filltype); pair aligna = I * unit(c - b), alignb = I * unit(c - a), alignc = I * unit(b - a); pair mAB = locate(midpoint(t.AB)), mAC = locate(midpoint(t.AC)), mBC = locate(midpoint(t.BC)); label(pic, La, b--c, align = rotate(dot(a - mBC, aligna) > 0 ? 180 :0) * aligna, p); label(pic, Lb, a--c, align = rotate(dot(b - mAC, alignb) > 0 ? 180 :0) * alignb, p); label(pic, Lc, a--b, align = rotate(dot(c - mAB, alignc) > 0 ? 180 :0) * alignc, p); } /**/ void draw(picture pic = currentpicture, triangle t, pen p = currentpen, marker marker = nomarker) {/*Draw sides of the triangle 't' on picture 'pic' using pen 'p'.*/ draw(pic, (path)t, p, marker); } void fill(picture pic = currentpicture, triangle t, pen p = currentpen) { fill(pic, (path)t, p); } void filldraw(picture pic = currentpicture, triangle t, pen fillpen = currentpen, pen drawpen = currentpen) { fill(pic, t, fillpen); draw(pic, t, drawpen); } /**/ void draw(picture pic = currentpicture, triangle[] ts, pen p = currentpen, marker marker = nomarker) {/*Draw sides of the triangles 't' on picture 'pic' using pen 'p'.*/ for(triangle t: ts) draw(pic, t, p, marker); } void fill(picture pic = currentpicture, triangle[] ts, pen p = currentpen) { for(triangle t: ts) fill(pic, t, p); } void filldraw(picture pic = currentpicture, triangle[] ts, pen fillpen = currentpen, pen drawpen = currentpen) { for(triangle t: ts) filldraw(pic, t, fillpen, drawpen); } /**/ void drawline(picture pic = currentpicture, triangle t, pen p = currentpen) {/*Draw lines of the triangle 't' on picture 'pic' using pen 'p'.*/ draw(t, p); draw(pic, line(t.A, t.B), p); draw(pic, line(t.A, t.C), p); draw(pic, line(t.B, t.C), p); } /**/ void dot(picture pic = currentpicture, triangle t, pen p = currentpen) {/*Draw a dot at each vertex of 't'.*/ dot(pic, t.A^^t.B^^t.C, p); } // *.......................TRIANGLES.......................* // *=======================================================* // *=======================================================* // *.......................INVERSIONS......................* /**/ struct inversion {/*https://mathworld.wolfram.com/Inversion.html*/ point C; real k; /**/ void operator init(point C, real k) {/*Return the inversion with respect to 'C' having circle power 'k'.*/ this.C = C; this.k = k; } /**/ void operator init(real k, point C) {/*Return the inversion with respect to 'C' having circle power 'k'.*/ this.C = C; this.k = k; } }/**/ /**/ point inverse(inversion i, point P) {/*Return the inverse point of 'P' with respect to 'i'.*/ pair C = locate(i.C), P1 = locate(P); pair P2 = C + i.k / conj(P1 - C); return P2 / currentcoordsys; } /**/ point radicalcenter(circle c1, circle c2) {/**/ real k = c1.r^2 - c2.r^2; pair C1 = locate(c1.C), C2 = locate(c2.C); pair D = C2 - C1; pair K = C1 == C2 ? (infinity, infinity) : 0.5 * (C1 + C2 + k * D / abs2(D)); return K / currentcoordsys; } /**/ line radicalline(circle c1, circle c2) {/**/ if (c1.C == c2.C) abort("radicalline: the centers must be distinct"); return perpendicular(radicalcenter(c1, c2), line(c1.C, c2.C)); } /**/ point radicalcenter(circle c1, circle c2, circle c3) {/**/ return intersectionpoint(radicalline(c1, c2), radicalline(c1, c3)); } /**/ inversion inversion(circle c1, circle c2, real sgn = 1) {/*Return the inversion which transforms 'c1' to • 'c2' and positive inversion radius if 'sgn > 0'; • 'c2' and negative inversion radius if 'sgn < 0'; • 'c1' and 'c2' to 'c2' if 'sgn = 0'.*/ if(sgn == 0) { point O = radicalcenter(c1, c2); return inversion(O, O^c1); } pair C1 = locate(c1.C), C2 = locate(c2.C); real r1 = c1.r, r2 = sgn(sgn) * c2.r; pair O = (r2 * C1 + r1 * C2) / (r1 + r2); real k = r1 * r2 * (1 - abs2(C2 - C1) / (r1 + r2)^2); return inversion(O / currentcoordsys, k); } /**/ inversion inversion(circle c1, circle c2, circle c3) {/*Return the inversion which transform 'c1' to 'c1', 'c2' to 'c2' and 'c3' to 'c3'.*/ point Rc = radicalcenter(c1, c2, c3); return inversion(Rc, Rc^c1); } circle operator cast(inversion i) { return circle(i.C, sgn(i.k) * sqrt(abs(i.k))); } /**/ circle circle(inversion i) {/*Return the inversion circle of 'i'.*/ return i; } inversion operator cast(circle c) { return inversion(c.C, sgn(c.r) * c.r^2); } /**/ inversion inversion(circle c) {/*Return the inversion represented by the circle of 'c'.*/ return c; } /**/ point operator *(inversion i, point P) {/*Provide inversion * point.*/ return inverse(i, P); } void lineinversion() { warning("lineinversion", "the inversion of the line is not a circle. The returned circle has an infinite radius, circle.l has been set."); } /**/ circle inverse(inversion i, line l) {/*Return the inverse circle of 'l' with respect to 'i'.*/ if(i.C @ l) { lineinversion(); circle c = circle(i.C, infinity); c.l = l; return c; } point A = inverse(i, l.A), B = inverse(i, l.B); return circle(i.C, A, B); } /**/ circle operator *(inversion i, line l) {/*Provide inversion * line for lines that don't pass through the inversion center.*/ return inverse(i, l); } /**/ circle inverse(inversion i, circle c) {/*Return the inverse circle of 'c' with respect to 'i'.*/ if(degenerate(c)) return inverse(i, c.l); if(i.C @ c) { lineinversion(); point M1 = rotate(90, c.C) * i.C, M2 = rotate(-90, c.C) * i.C; circle c1 = circle(i.C, infinity); c1.l = line(inverse(i, M1), inverse(i, M2)); return c1; } pair C1 = locate(i.C), C2 = locate(c.C); pair D = C2 - C1; real s = i.k / (abs2(D) - c.r^2); pair C3 = C1 + s * D; return circle((point)(C3 / currentcoordsys), abs(s) * c.r); } /**/ circle operator *(inversion i, circle c) {/*Provide inversion * circle.*/ return inverse(i, c); } // *.......................INVERSIONS......................* // *=======================================================* // *=======================================================* // *........................FOOTER.........................* /**/ point[] intersectionpoints(line l, circle c) {/*Note that the line 'l' may be a segment by casting. intersectionpoints(circle, line) is also defined.*/ if(degenerate(c)) return new point[]{intersectionpoint(l, c.l)}; point[] op; coordsys R = samecoordsys(l.A, c.C) ? l.A.coordsys : defaultcoordsys; coordsys Rp = defaultcoordsys; circle cc = circle(changecoordsys(Rp, c.C), c.r); point proj = projection(l) * c.C; if(proj @ cc) { // The line is a tangente of the circle. if(proj @ l) op.push(proj);// line may be a segement... } else { coordsys Rc = cartesiansystem(c.C, (1, 0), (0, 1)); line ll = changecoordsys(Rc, l); pair[] P = intersectionpoints(ll.A.coordinates, ll.B.coordinates, 1, 0, 1, 0, 0, -c.r^2); for (int i = 0; i < P.length; ++i) { point inter = changecoordsys(R, point(Rc, P[i])); if(inter @ l) op.push(inter); } } return op; } point[] intersectionpoints(circle c, line l) { return intersectionpoints(l, c); } /**/ point[] intersectionpoints(line l, ellipse el) {/*Note that the line 'l' may be a segment by casting. intersectionpoints(ellipse, line) is also defined.*/ if(el.e == 0) return intersectionpoints(l, (circle)el); if(degenerate(el)) return new point[]{intersectionpoint(l, el.l)}; point[] op; coordsys R = samecoordsys(l.A, el.C) ? l.A.coordsys : defaultcoordsys; coordsys Rp = defaultcoordsys; line ll = changecoordsys(Rp, l); ellipse ell = (ellipse) changecoordsys(Rp, el); circle C = circle(ell.C, ell.a); point[] Ip = intersectionpoints(ll, C); if (Ip.length > 0 && (perpendicular(ll, line(ell.F1, Ip[0])) || perpendicular(ll, line(ell.F2, Ip[0])))) { // http://www.mathcurve.com/courbes2d/ellipse/ellipse.shtml // Definition of the tangent at the antipodal point on the circle. // 'l' is a tangent of 'el' transform t = scale(el.a/el.b, el.F1, el.F2, el.C, rotate(90, el.C) * el.F1); point inter = inverse(t) * intersectionpoints(C, t * ll)[0]; if(inter @ l) op.push(inter); } else { coordsys Rc = canonicalcartesiansystem(el); line ll = changecoordsys(Rc, l); pair[] P = intersectionpoints(ll.A.coordinates, ll.B.coordinates, 1/el.a^2, 0, 1/el.b^2, 0, 0, -1); for (int i = 0; i < P.length; ++i) { point inter = changecoordsys(R, point(Rc, P[i])); if(inter @ l) op.push(inter); } } return op; } point[] intersectionpoints(ellipse el, line l) { return intersectionpoints(l, el); } /**/ point[] intersectionpoints(line l, parabola p) {/*Note that the line 'l' may be a segment by casting. intersectionpoints(parabola, line) is also defined.*/ point[] op; coordsys R = coordsys(p); bool tgt = false; line ll = changecoordsys(R, l), lv = parallel(p.V, p.D); point M = intersectionpoint(lv, ll), tgtp; if(finite(M)) {// Test if 'l' is tangent to 'p' line l1 = bisector(line(M, p.F)); line l2 = rotate(90, M) * lv; point P = intersectionpoint(l1, l2); tgtp = rotate(180, P) * p.F; tgt = (tgtp @ l); } if(tgt) { if(tgtp @ l) op.push(tgtp); } else { real[] eq = changecoordsys(defaultcoordsys, equation(p)).a; pair[] tp = intersectionpoints(locate(l.A), locate(l.B), eq); point inter; for (int i = 0; i < tp.length; ++i) { inter = point(R, tp[i]/R); if(inter @ l) op.push(inter); } } return op; } point[] intersectionpoints(parabola p, line l) { return intersectionpoints(l, p); } /**/ point[] intersectionpoints(line l, hyperbola h) {/*Note that the line 'l' may be a segment by casting. intersectionpoints(hyperbola, line) is also defined.*/ point[] op; coordsys R = coordsys(h); point A = intersectionpoint(l, h.A1), B = intersectionpoint(l, h.A2); point M = 0.5*(A + B); bool tgt = Finite(M) ? M @ h : false; if(tgt) { if(M @ l) op.push(M); } else { real[] eq = changecoordsys(defaultcoordsys, equation(h)).a; pair[] tp = intersectionpoints(locate(l.A), locate(l.B), eq); point inter; for (int i = 0; i < tp.length; ++i) { inter = point(R, tp[i]/R); if(inter @ l) op.push(inter); } } return op; } point[] intersectionpoints(hyperbola h, line l) { return intersectionpoints(l, h); } /**/ point[] intersectionpoints(line l, conic co) {/*Note that the line 'l' may be a segment by casting. intersectionpoints(conic, line) is also defined.*/ point[] op; if(co.e < 1) op = intersectionpoints((ellipse)co, l); else if(co.e == 1) op = intersectionpoints((parabola)co, l); else op = intersectionpoints((hyperbola)co, l); return op; } point[] intersectionpoints(conic co, line l) { return intersectionpoints(l, co); } /**/ point[] intersectionpoints(bqe bqe1, bqe bqe2) {/*Return the intersection of the two conic sections whose equations are 'bqe1' and 'bqe2'.*/ coordsys R=canonicalcartesiansystem(conic(bqe1)); real[] a=changecoordsys(R,bqe1).a; real[] b=changecoordsys(R,bqe2).a; static real e=100 * sqrt(realEpsilon); real[] x,y,c; point[] P; if(abs(a[0]-b[0]) > e || abs(a[1]-b[1]) > e || abs(a[2]-b[2]) > e) { c=new real[] {a[0]*a[2]*(-2*b[0]*b[2]+b[1]^2)+a[0]^2*b[2]^2+a[2]^2*b[0]^2, 2*a[0]*a[2]*b[1]*b[4]-2*a[2]*a[3]*b[0]*b[2] -2*a[0]*a[2]*b[2]*b[3]+a[2]*a[3]*b[1]^2+2*a[2]^2*b[0]*b[3], a[2]*a[5]*b[1]^2-2*a[2]*a[3]*b[2]*b[3]+2*a[2]^2*b[0]*b[5] +2*a[0]*a[5]*b[2]^2+a[3]^2*b[2]^2-2*a[2]*a[5]*b[0]*b[2] -2*a[0]*a[2]*b[2]*b[5]+a[2]^2*b[3]^2+2*a[2]*a[3]*b[1]*b[4] +a[0]*a[2]*b[4]^2, a[2]*a[3]*b[4]^2+2*a[2]^2*b[3]*b[5]-2*a[2]*a[3]*b[2]*b[5] -2*a[2]*a[5]*b[2]*b[3]+2*a[2]*a[5]*b[1]*b[4], -2*a[2]*a[5]*b[2]*b[5]+a[5]^2*b[2]^2+a[2]*a[5]*b[4]^2 +a[2]^2*b[5]^2}; x=realquarticroots(c[0],c[1],c[2],c[3],c[4]); } else { if(abs(b[4]) > e) { real D=b[4]^2; c=new real[] {(a[0]*b[4]^2+a[2]*b[3]^2+ (-2*a[2]*a[3])*b[3]+a[2]*a[3]^2)/D, -((-2*a[2]*b[3]+2*a[2]*a[3])*b[5]-a[3]*b[4]^2+ (2*a[2]*a[5])*b[3])/D,a[2]*(a[5]-b[5])^2/D+a[5]}; x=quadraticroots(c[0],c[1],c[2]); } else { if(abs(a[3]-b[3]) > e) { real D=b[3]-a[3]; c=new real[] {a[2],0,a[0]*(a[5]-b[5])^2/D^2-a[3]*b[5]/D+a[5]}; y=quadraticroots(c[0],c[1],c[2]); for(int i=0; i < y.length; ++i) { c=new real[] {a[0],a[3],a[2]*y[i]^2+a[5]}; x=quadraticroots(c[0],c[1],c[2]); for(int j=0; j < x.length; ++j) { if(abs(b[0]*x[j]^2+b[1]*x[j]*y[i]+b[2]*y[i]^2+b[3]*x[j] +b[4]*y[i]+b[5]) < 1e-5) P.push(changecoordsys(currentcoordsys,point(R,(x[j],y[i])))); } } return P; } else { if(abs(a[5]-b[5]) < e) abort("intersectionpoints: intersection of identical conics."); } } } for(int i=0; i < x.length; ++i) { c=new real[] {a[2],0,a[0]*x[i]^2+a[3]*x[i]+a[5]}; y=quadraticroots(c[0],c[1],c[2]); for(int j=0; j < y.length; ++j) { if(abs(b[0]*x[i]^2+b[1]*x[i]*y[j]+b[2]*y[j]^2+b[3]*x[i]+b[4]*y[j]+b[5]) < 1e-5) P.push(changecoordsys(currentcoordsys,point(R,(x[i],y[j])))); } } return P; } /**/ point[] intersectionpoints(conic co1, conic co2) {/*Return the intersection points of the two conics.*/ if(degenerate(co1)) return intersectionpoints(co1.l[0], co2); if(degenerate(co2)) return intersectionpoints(co1, co2.l[0]); return intersectionpoints(equation(co1), equation(co2)); } /**/ point[] intersectionpoints(triangle t, conic co, bool extended = false) {/*Return the intersection points. If 'extended' is true, the sides are lines else the sides are segments. intersectionpoints(conic, triangle, bool) is also defined.*/ if(degenerate(co)) return intersectionpoints(t, co.l[0], extended); point[] OP; void addpoint(point P[]) { for (int i = 0; i < P.length; ++i) { if(defined(P[i])) { bool exist = false; for (int j = 0; j < OP.length; ++j) { if(P[i] == OP[j]) {exist = true; break;} } if(!exist) OP.push(P[i]); }}} if(extended) { for (int i = 1; i <= 3; ++i) { addpoint(intersectionpoints(t.line(i), co)); } } else { for (int i = 1; i <= 3; ++i) { addpoint(intersectionpoints((segment)t.line(i), co)); } } return OP; } point[] intersectionpoints(conic co, triangle t, bool extended = false) { return intersectionpoints(t, co, extended); } /**/ point[] intersectionpoints(ellipse a, ellipse b) {/**/ // if(degenerate(a)) return intersectionpoints(a.l, b); // if(degenerate(b)) return intersectionpoints(a, b.l);; return intersectionpoints((conic)a, (conic)b); } /**/ point[] intersectionpoints(ellipse a, circle b) {/**/ // if(degenerate(a)) return intersectionpoints(a.l, b); // if(degenerate(b)) return intersectionpoints(a, b.l);; return intersectionpoints((conic)a, (conic)b); } /**/ point[] intersectionpoints(circle a, ellipse b) {/**/ return intersectionpoints(b, a); } /**/ point[] intersectionpoints(ellipse a, parabola b) {/**/ // if(degenerate(a)) return intersectionpoints(a.l, b); return intersectionpoints((conic)a, (conic)b); } /**/ point[] intersectionpoints(parabola a, ellipse b) {/**/ return intersectionpoints(b, a); } /**/ point[] intersectionpoints(ellipse a, hyperbola b) {/**/ // if(degenerate(a)) return intersectionpoints(a.l, b); return intersectionpoints((conic)a, (conic)b); } /**/ point[] intersectionpoints(hyperbola a, ellipse b) {/**/ return intersectionpoints(b, a); } /**/ point[] intersectionpoints(circle a, parabola b) {/**/ return intersectionpoints((conic)a, (conic)b); } /**/ point[] intersectionpoints(parabola a, circle b) {/**/ return intersectionpoints((conic)a, (conic)b); } /**/ point[] intersectionpoints(circle a, hyperbola b) {/**/ return intersectionpoints((conic)a, (conic)b); } /**/ point[] intersectionpoints(hyperbola a, circle b) {/**/ return intersectionpoints((conic)a, (conic)b); } /**/ point[] intersectionpoints(parabola a, parabola b) {/**/ return intersectionpoints((conic)a, (conic)b); } /**/ point[] intersectionpoints(parabola a, hyperbola b) {/**/ return intersectionpoints((conic)a, (conic)b); } /**/ point[] intersectionpoints(hyperbola a, parabola b) {/**/ return intersectionpoints((conic)a, (conic)b); } /**/ point[] intersectionpoints(hyperbola a, hyperbola b) {/**/ return intersectionpoints((conic)a, (conic)b); } /**/ point[] intersectionpoints(circle c1, circle c2) {/**/ if(degenerate(c1)) return degenerate(c2) ? new point[]{intersectionpoint(c1.l, c2.l)} : intersectionpoints(c1.l, c2); if(degenerate(c2)) return intersectionpoints(c1, c2.l); return (c1.C == c2.C) ? new point[] : intersectionpoints(radicalline(c1, c2), c1); } /**/ line tangent(circle c, abscissa x) {/*Return the tangent of 'c' at 'point(c, x)'.*/ if(c.r == 0) abort("tangent: a circle with a radius equals zero has no tangent."); point M = point(c, x); return line(rotate(90, M) * c.C, M); } /**/ line[] tangents(circle c, point M) {/*Return the tangents of 'c' passing through 'M'.*/ line[] ol; if(inside(c, M)) return ol; if(M @ c) { ol.push(tangent(c, relabscissa(c, M))); } else { circle cc = circle(c.C, M); point[] inter = intersectionpoints(c, cc); for (int i = 0; i < inter.length; ++i) ol.push(tangents(c, inter[i])[0]); } return ol; } /**/ point point(circle c, point M) {/*Return the intersection point of 'c' with the half-line '[c.C M)'.*/ return intersectionpoints(c, line(c.C, false, M))[0]; } /**/ line tangent(circle c, point M) {/*Return the tangent of 'c' at the intersection point of the half-line'[c.C M)'.*/ return tangents(c, point(c, M))[0]; } /**/ point point(circle c, explicit vector v) {/*Return the intersection point of 'c' with the half-line '[c.C v)'.*/ return point(c, c.C + v); } /**/ line tangent(circle c, explicit vector v) {/*Return the tangent of 'c' at the point M so that vec(c.C M) is collinear to 'v' with the same sense.*/ line ol = tangent(c, c.C + v); return dot(ol.v, v) > 0 ? ol : reverse(ol); } /**/ line tangent(ellipse el, abscissa x) {/*Return the tangent of 'el' at 'point(el, x)'.*/ point M = point(el, x); line l1 = line(el.F1, M); line l2 = line(el.F2, M); line ol = (l1 == l2) ? perpendicular(M, l1) : bisector(l1, l2, 90, false); return ol; } /**/ line[] tangents(ellipse el, point M) {/*Return the tangents of 'el' passing through 'M'.*/ line[] ol; if(inside(el, M)) return ol; if(M @ el) { ol.push(tangent(el, relabscissa(el, M))); } else { point Mp = samecoordsys(M, el.F2) ? M : changecoordsys(el.F2.coordsys, M); circle c = circle(Mp, abs(el.F1 - Mp)); circle cc = circle(el.F2, 2 * el.a); point[] inter = intersectionpoints(c, cc); for (int i = 0; i < inter.length; ++i) { line tl = line(inter[i], el.F2, false); point[] P = intersectionpoints(tl, el); ol.push(line(Mp, P[0])); } } return ol; } /**/ line tangent(parabola p, abscissa x) {/*Return the tangent of 'p' at 'point(p, x)' (use the Wells method).*/ line lt = rotate(90, p.V) * line(p.V, p.F); point P = point(p, x); if(P == p.V) return lt; point M = midpoint(segment(P, p.F)); line l = rotate(90, M) * line(P, p.F); return line(P, projection(lt) * M); } /**/ line[] tangents(parabola p, point M) {/*Return the tangent of 'p' at 'M' (use the Wells method).*/ line[] ol; if(inside(p, M)) return ol; if(M @ p) { ol.push(tangent(p, angabscissa(p, M))); } else { point Mt = changecoordsys(coordsys(p), M); circle c = circle(Mt, p.F); line l = rotate(90, p.V) * line(p.V, p.F); point[] R = intersectionpoints(l, c); for (int i = 0; i < R.length; ++i) { ol.push(line(Mt, R[i])); } // An other method: http://www.du.edu/~jcalvert/math/parabola.htm // point[] R = intersectionpoints(p.directrix, c); // for (int i = 0; i < R.length; ++i) { // ol.push(bisector(segment(p.F, R[i]))); // } } return ol; } /**/ line tangent(hyperbola h, abscissa x) {/*Return the tangent of 'h' at 'point(p, x)'.*/ point M = point(h, x); line ol = bisector(line(M, h.F1), line(M, h.F2)); if(sameside(h.F1, h.F2, ol) || ol == line(h.F1, h.F2)) ol = rotate(90, M) * ol; return ol; } /**/ line[] tangents(hyperbola h, point M) {/*Return the tangent of 'h' at 'M'.*/ line[] ol; if(M @ h) { ol.push(tangent(h, angabscissa(h, M, fromCenter))); } else { coordsys cano = canonicalcartesiansystem(h); bqe bqe = changecoordsys(cano, equation(h)); real a = abs(1/(bqe.a[5] * bqe.a[0])), b = abs(1/(bqe.a[5] * bqe.a[2])); point Mp = changecoordsys(cano, M); real x0 = Mp.x, y0 = Mp.y; if(abs(x0) > epsgeo) { real c0 = a * y0^2/(b * x0)^2 - 1/b, c1 = 2 * a * y0/(b * x0^2), c2 = a/x0^2 - 1; real[] sol = quadraticroots(c0, c1, c2); for (real y:sol) { point tmp = changecoordsys(coordsys(h), point(cano, (a * (1 + y * y0/b)/x0, y))); ol.push(line(M, tmp)); } } else if(abs(y0) > epsgeo) { real y = -b/y0, x = sqrt(a * (1 + b/y0^2)); ol.push(line(M, changecoordsys(coordsys(h), point(cano, (x, y))))); ol.push(line(M, changecoordsys(coordsys(h), point(cano, (-x, y))))); }} return ol; } /**/ point[] intersectionpoints(conic co, arc a) {/*intersectionpoints(arc, circle) is also defined.*/ point[] op; point[] tp = intersectionpoints(co, (conic)a.el); for (int i = 0; i < tp.length; ++i) if(tp[i] @ a) op.push(tp[i]); return op; } point[] intersectionpoints(arc a, conic co) { return intersectionpoints(co, a); } /**/ point[] intersectionpoints(arc a1, arc a2) {/**/ point[] op; point[] tp = intersectionpoints(a1.el, a2.el); for (int i = 0; i < tp.length; ++i) if(tp[i] @ a1 && tp[i] @ a2) op.push(tp[i]); return op; } /**/ point[] intersectionpoints(line l, arc a) {/*intersectionpoints(arc, line) is also defined.*/ point[] op; point[] tp = intersectionpoints(a.el, l); for (int i = 0; i < tp.length; ++i) if(tp[i] @ a && tp[i] @ l) op.push(tp[i]); return op; } point[] intersectionpoints(arc a, line l) { return intersectionpoints(l, a); } /**/ point arcsubtendedcenter(point A, point B, real angle) {/*Return the center of the arc retuned by the 'arcsubtended' routine.*/ point OM; point[] P = standardizecoordsys(A, B); angle = angle%(sgnd(angle) * 180); line bis = bisector(P[0], P[1]); line AB = line(P[0], P[1]); return intersectionpoint(bis, rotate(90 - angle, A) * AB); } /**/ arc arcsubtended(point A, point B, real angle) {/*Return the arc circle from which the segment AB is saw with the angle 'angle'. If the point 'M' is on this arc, the oriented angle (MA, MB) is equal to 'angle'.*/ point[] P = standardizecoordsys(A, B); line AB = line(P[0], P[1]); angle = angle%(sgnd(angle) * 180); point C = arcsubtendedcenter(P[0], P[1], angle); real BC = degrees(B - C)%360; real AC = degrees(A - C)%360; return arc(circle(C, abs(B - C)), BC, AC, angle > 0 ? CCW : CW); } /**/ arc arccircle(point A, point M, point B) {/*Return the CCW arc circle 'AB' passing through 'M'.*/ circle tc = circle(A, M, B); real a = degrees(A - tc.C); real b = degrees(B - tc.C); real m = degrees(M - tc.C); arc oa = arc(tc, a, b); // TODO: use cross product to determine CWW or CW if (!(M @ oa)) { oa.direction = !oa.direction; } return oa; } /**/ arc arc(ellipse el, explicit abscissa x1, explicit abscissa x2, bool direction = CCW) {/*Return the arc from 'point(c, x1)' to 'point(c, x2)' in the direction 'direction'.*/ real a = degrees(point(el, x1) - el.C); real b = degrees(point(el, x2) - el.C); arc oa = arc(el, a - el.angle, b - el.angle, fromCenter, direction); return oa; } /**/ arc arc(ellipse el, point M, point N, bool direction = CCW) {/*Return the arc from 'M' to 'N' in the direction 'direction'. The points 'M' and 'N' must belong to the ellipse 'el'.*/ return arc(el, relabscissa(el, M), relabscissa(el, N), direction); } /**/ arc arccircle(point A, point B, real angle, bool direction = CCW) {/*Return the arc circle centered on A from B to rotate(angle, A) * B in the direction 'direction'.*/ point M = rotate(angle, A) * B; return arc(circle(A, abs(A - B)), B, M, direction); } /**/ arc arc(explicit arc a, abscissa x1, abscissa x2) {/*Return the arc from 'point(a, x1)' to 'point(a, x2)' traversed in the direction of the arc direction.*/ real a1 = angabscissa(a.el, point(a, x1), a.polarconicroutine).x; real a2 = angabscissa(a.el, point(a, x2), a.polarconicroutine).x; return arc(a.el, a1, a2, a.polarconicroutine, a.direction); } /**/ arc arc(explicit arc a, point M, point N) {/*Return the arc from 'M' to 'N'. The points 'M' and 'N' must belong to the arc 'a'.*/ return arc(a, relabscissa(a, M), relabscissa(a, N)); } /**/ arc inverse(inversion i, segment s) {/*Return the inverse arc circle of 's' with respect to inversion 'i'.*/ point Ap = inverse(i, s.A), Bp = inverse(i, s.B), M = inverse(i, midpoint(s)); return arccircle(Ap, M, Bp); } /**/ arc operator *(inversion i, segment s) {/*Provide inversion * segment.*/ return inverse(i, s); } /**/ path operator *(inversion i, triangle t) {/*Provide inversion * triangle.*/ return (path)(i * segment(t.AB))-- (path)(i * segment(t.BC))-- (path)(i * segment(t.CA))&cycle; } /**/ path compassmark(pair O, pair A, real position, real angle = 10) {/*Return an arc centered on O with the angle 'angle' so that the position of 'A' on this arc makes an angle 'position * angle'.*/ real a = degrees(A - O); real pa = (a - position * angle)%360, pb = (a - (position - 1) * angle)%360; real t1 = intersect(unitcircle, (0, 0)--2 * dir(pa))[0]; real t2 = intersect(unitcircle, (0, 0)--2 * dir(pb))[0]; int n = length(unitcircle); if(t1 >= t2) t1 -= n; return shift(O) * scale(abs(O - A)) * subpath(unitcircle, t1, t2); } /**/ line tangent(explicit arc a, abscissa x) {/*Return the tangent of 'a' at 'point(a, x)'.*/ abscissa ag = angabscissa(a, point(a, x)); return tangent(a.el, ag + a.angle1 + (a.el.e == 0 ? a.angle0 : 0)); } /**/ line tangent(explicit arc a, point M) {/*Return the tangent of 'a' at 'M'. The points 'M' must belong to the arc 'a'.*/ return tangent(a, angabscissa(a, M)); } // *=======================================================* // *.......Routines for compatibility with original geometry module........* path square(pair z1, pair z2) { pair v = z2 - z1; pair z3 = z2 + I * v; pair z4 = z3 - v; return z1--z2--z3--z4--cycle; } // Draw a perpendicular symbol at z aligned in the direction align // relative to the path z--z + dir. void perpendicular(picture pic = currentpicture, pair z, pair align, pair dir = E, real size = 0, pen p = currentpen, margin margin = NoMargin, filltype filltype = NoFill) { perpendicularmark(pic, (point) z, align, dir, size, p, margin, filltype); } // Draw a perpendicular symbol at z aligned in the direction align // relative to the path z--z + dir(g, 0) void perpendicular(picture pic = currentpicture, pair z, pair align, path g, real size = 0, pen p = currentpen, margin margin = NoMargin, filltype filltype = NoFill) { perpendicularmark(pic, (point) z, align, dir(g, 0), size, p, margin, filltype); } // Return an interior arc BAC of triangle ABC, given a radius r > 0. // If r < 0, return the corresponding exterior arc of radius |r|. path arc(explicit pair B, explicit pair A, explicit pair C, real r) { real BA = degrees(B - A); real CA = degrees(C - A); return arc(A, abs(r), BA, CA, (r < 0) ^ ((BA-CA) % 360 < 180) ? CW : CCW); } point orthocentercenter(point A, point B, point C) { return orthocenter(A, B, C); } point orthocentercenter(triangle t) { return orthocenter(t.A, t.B, t.C); } // *.......End of compatibility routines........* // *=======================================================* // *........................FOOTER.........................* // *=======================================================* asymptote-3.05/base/size10.asy0000644000000000000000000000114015031566105014725 0ustar rootroottexpreamble("\makeatletter% \renewcommand\normalsize{\@setfontsize\normalsize\@xpt\@xiipt}% \renewcommand\small{\@setfontsize\small\@ixpt{11}}% \renewcommand\footnotesize{\@setfontsize\footnotesize\@viiipt{9.5}}% \renewcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt}% \renewcommand\tiny{\@setfontsize\tiny\@vpt\@vipt}% \renewcommand\large{\@setfontsize\large\@xiipt{14}}% \renewcommand\Large{\@setfontsize\Large\@xivpt{18}}% \renewcommand\LARGE{\@setfontsize\LARGE\@xviipt{22}}% \renewcommand\huge{\@setfontsize\huge\@xxpt{25}}% \renewcommand\Huge{\@setfontsize\Huge\@xxvpt{30}}% \makeatother"); asymptote-3.05/base/mapArray.asy0000644000000000000000000000025415031566105015373 0ustar rootroottypedef import(Src, Dst); private typedef Dst MapType(Src); Dst[] map(MapType f, Src[] a) { return sequence( new Dst(int i) {return f(a[i]);}, a.length); } asymptote-3.05/base/slopefield.asy0000644000000000000000000000366315031566105015754 0ustar rootrootimport graph_settings; real stepfraction=0.05; picture slopefield(real f(real,real), pair a, pair b, int nx=nmesh, int ny=nx, real tickfactor=0.5, pen p=currentpen) { picture pic; real dx=(b.x-a.x)/nx; real dy=(b.y-a.y)/ny; real step=0.5*tickfactor*min(dx,dy); for(int i=0; i <= nx; ++i) { real x=a.x+i*dx; for(int j=0; j <= ny; ++j) { pair cp=(x,a.y+j*dy); real slope=f(cp.x,cp.y); real mp=step/sqrt(1+slope^2); draw(pic,(cp.x-mp,cp.y-mp*slope)--(cp.x+mp,cp.y+mp*slope),p); } } return pic; } picture slopefield(real f(real), pair a, pair b, int nx=nmesh, int ny=nx, pen p=currentpen) { return slopefield(new real(real x, real y) {return f(x);},a,b,nx,ny,p); } path curve(pair c, real f(real,real), pair a, pair b) { real step=stepfraction*(b.x-a.x); real halfstep=0.5*step; real sixthstep=step/6; path follow(real sign) { pair cp=c; guide g=cp; real dx,dy; real factor=1; do { real slope; pair S(pair z) { slope=f(z.x,z.y); return factor*sign/sqrt(1+slope^2)*(1,slope); } pair S3; pair advance() { pair S0=S(cp); pair S1=S(cp+halfstep*S0); pair S2=S(cp+halfstep*S1); S3=S(cp+step*S2); pair cp0=cp+sixthstep*(S0+2S1+2S2+S3); dx=min(cp0.x-a.x,b.x-cp0.x); dy=min(cp0.y-a.y,b.y-cp0.y); return cp0; } pair cp0=advance(); if(dx < 0) { factor=(step+dx)/step; cp0=advance(); g=g..{S3}cp0{S3}; break; } if(dy < 0) { factor=(step+dy)/step; cp0=advance(); g=g..{S3}cp0{S3}; break; } cp=cp0; g=g..{S3}cp{S3}; } while (dx > 0 && dy > 0); return g; } return reverse(follow(-1))&follow(1); } path curve(pair c, real f(real), pair a, pair b) { return curve(c,new real(real x, real y){return f(x);},a,b); } asymptote-3.05/base/webgl/0000755000000000000000000000000015031566647014213 5ustar rootrootasymptote-3.05/base/webgl/asygl.js0000644000000000000000000020212715031566646015673 0ustar rootroot/*@license AsyGL: Render Bezier patches and triangles via subdivision with WebGL. Copyright 2019-2024: John C. Bowman and Supakorn "Jamie" Rassameemasmuang University of Alberta This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ /*@license for gl-matrix mat3 and mat4 functions: Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ let vertex="\n#ifdef WEBGL2\n#define IN in\n#define OUT out\n#else\n#define IN attribute\n#define OUT varying\n#endif\n\nIN vec3 position;\n#ifdef WIDTH\nIN float width;\n#endif\n#ifdef NORMAL\nIN vec3 normal;\n#endif\n\nIN float materialIndex;\n\n#ifdef WEBGL2\nflat out int MaterialIndex;\n#ifdef COLOR\nOUT vec4 Color;\n#endif\n\n#else\nOUT vec4 diffuse;\nOUT vec3 specular;\nOUT float roughness,metallic,fresnel0;\nOUT vec4 emissive;\n\nstruct Material {\n vec4 diffuse,emissive,specular;\n vec4 parameters;\n};\n\nuniform Material Materials[Nmaterials];\n#endif\n\n#ifdef COLOR\nIN vec4 color;\n#endif\n\nuniform bool orthographic;\nuniform mat3 normMat;\nuniform mat4 viewMat;\nuniform mat4 projViewMat;\n\n#ifdef NORMAL\nOUT vec3 ViewPosition;\nOUT vec3 Normal;\n#endif\n\nvoid main(void)\n{\n vec4 v=vec4(position,1.0);\n gl_Position=projViewMat*v;\n\n#ifdef NORMAL\n ViewPosition=orthographic ? vec3(0.0,0.0,-1.0) : (viewMat*v).xyz;\n Normal=normalize(normal*normMat);\n#endif\n\n#ifdef WEBGL2\n MaterialIndex=int(materialIndex);\n#ifdef COLOR\n Color=color;\n#endif\n#else\n#ifdef NORMAL\n Material m;\n#ifdef TRANSPARENT\n m=Materials[int(abs(materialIndex))-1];\n emissive=m.emissive;\n if(materialIndex >= 0.0)\n diffuse=m.diffuse;\n else {\n diffuse=color;\n#if nlights == 0\n emissive += color;\n#endif\n }\n#else\n m=Materials[int(materialIndex)];\n emissive=m.emissive;\n#ifdef COLOR\n diffuse=color;\n#if nlights == 0\n emissive += color;\n#endif\n#else\n diffuse=m.diffuse;\n#endif // COLOR\n#endif // TRANSPARENT\n specular=m.specular.rgb;\n vec4 parameters=m.parameters;\n roughness=1.0-parameters[0];\n metallic=parameters[1];\n fresnel0=parameters[2];\n#else\n emissive=Materials[int(materialIndex)].emissive;\n#endif // NORMAL\n#endif // WEBGL2\n\n#ifdef WIDTH\n gl_PointSize=width;\n#endif\n}\n",fragment="\n#ifdef WEBGL2\n#define IN in\nout vec4 outValue;\n#define OUTVALUE outValue\n#else\n#define IN varying\n#define OUTVALUE gl_FragColor\n#endif\n\n#ifdef WEBGL2\nflat in int MaterialIndex;\n\nstruct Material {\n vec4 diffuse,emissive,specular;\n vec4 parameters;\n};\n\nuniform Material Materials[Nmaterials];\n\nvec4 diffuse;\nvec3 specular;\nfloat roughness,metallic,fresnel0;\nvec4 emissive;\n\n#ifdef COLOR\nin vec4 Color;\n#endif\n\n#else\nIN vec4 diffuse;\nIN vec3 specular;\nIN float roughness,metallic,fresnel0;\nIN vec4 emissive;\n#endif\n\n#ifdef NORMAL\n\nIN vec3 ViewPosition;\nIN vec3 Normal;\n\nvec3 normal;\n\nstruct Light {\n vec3 direction;\n vec3 color;\n};\n\nuniform Light Lights[Nlights];\n\n#ifdef USE_IBL\nuniform sampler2D reflBRDFSampler;\nuniform sampler2D diffuseSampler;\nuniform sampler2D reflImgSampler;\n\nconst float pi=acos(-1.0);\nconst float piInv=1.0/pi;\nconst float twopi=2.0*pi;\nconst float twopiInv=1.0/twopi;\n\n// (x,y,z) -> (r,theta,phi);\n// theta -> [0,pi]: colatitude\n// phi -> [-pi,pi]: longitude\nvec3 cart2sphere(vec3 cart)\n{\n float x=cart.x;\n float y=cart.z;\n float z=cart.y;\n\n float r=length(cart);\n float theta=r > 0.0 ? acos(z/r) : 0.0;\n float phi=atan(y,x);\n\n return vec3(r,theta,phi);\n}\n\nvec2 normalizedAngle(vec3 cartVec)\n{\n vec3 sphericalVec=cart2sphere(cartVec);\n sphericalVec.y=sphericalVec.y*piInv;\n sphericalVec.z=0.75-sphericalVec.z*twopiInv;\n return sphericalVec.zy;\n}\n\nvec3 IBLColor(vec3 viewDir)\n{\n vec3 IBLDiffuse=diffuse.rgb*texture(diffuseSampler,normalizedAngle(normal)).rgb;\n vec3 reflectVec=normalize(reflect(-viewDir,normal));\n vec2 reflCoord=normalizedAngle(reflectVec);\n vec3 IBLRefl=textureLod(reflImgSampler,reflCoord,roughness*ROUGHNESS_STEP_COUNT).rgb;\n vec2 IBLbrdf=texture(reflBRDFSampler,vec2(dot(normal,viewDir),roughness)).rg;\n float specularMultiplier=fresnel0*IBLbrdf.x+IBLbrdf.y;\n vec3 dielectric=IBLDiffuse+specularMultiplier*IBLRefl;\n vec3 metal=diffuse.rgb*IBLRefl;\n return mix(dielectric,metal,metallic);\n}\n#else\nfloat Roughness2;\nfloat NDF_TRG(vec3 h)\n{\n float ndoth=max(dot(normal,h),0.0);\n float alpha2=Roughness2*Roughness2;\n float denom=ndoth*ndoth*(alpha2-1.0)+1.0;\n return denom != 0.0 ? alpha2/(denom*denom) : 0.0;\n}\n\nfloat GGX_Geom(vec3 v)\n{\n float ndotv=max(dot(v,normal),0.0);\n float ap=1.0+Roughness2;\n float k=0.125*ap*ap;\n return ndotv/((ndotv*(1.0-k))+k);\n}\n\nfloat Geom(vec3 v, vec3 l)\n{\n return GGX_Geom(v)*GGX_Geom(l);\n}\n\nfloat Fresnel(vec3 h, vec3 v, float fresnel0)\n{\n float a=1.0-max(dot(h,v),0.0);\n float b=a*a;\n return fresnel0+(1.0-fresnel0)*b*b*a;\n}\n\n// physical based shading using UE4 model.\nvec3 BRDF(vec3 viewDirection, vec3 lightDirection)\n{\n vec3 lambertian=diffuse.rgb;\n vec3 h=normalize(lightDirection+viewDirection);\n\n float omegain=max(dot(viewDirection,normal),0.0);\n float omegaln=max(dot(lightDirection,normal),0.0);\n\n float D=NDF_TRG(h);\n float G=Geom(viewDirection,lightDirection);\n float F=Fresnel(h,viewDirection,fresnel0);\n\n float denom=4.0*omegain*omegaln;\n float rawReflectance=denom > 0.0 ? (D*G)/denom : 0.0;\n\n vec3 dielectric=mix(lambertian,rawReflectance*specular,F);\n vec3 metal=rawReflectance*diffuse.rgb;\n\n return mix(dielectric,metal,metallic);\n}\n#endif\n\n#endif\n\nvoid main(void)\n{\n#ifdef WEBGL2\n#ifdef NORMAL\n Material m;\n#ifdef TRANSPARENT\n m=Materials[abs(MaterialIndex)-1];\n emissive=m.emissive;\n if(MaterialIndex >= 0)\n diffuse=m.diffuse;\n else {\n diffuse=Color;\n#if nlights == 0\n emissive += Color;\n#endif\n }\n#else\n m=Materials[MaterialIndex];\n emissive=m.emissive;\n#ifdef COLOR\n diffuse=Color;\n#if nlights == 0\n emissive += Color;\n#endif\n#else\n diffuse=m.diffuse;\n#endif // COLOR\n#endif // TRANSPARENT\n specular=m.specular.rgb;\n vec4 parameters=m.parameters;\n roughness=1.0-parameters[0];\n metallic=parameters[1];\n fresnel0=parameters[2];\n#else\n emissive=Materials[MaterialIndex].emissive;\n#endif // NORMAL\n#endif // WEBGL2\n\n#if defined(NORMAL) && nlights > 0\n normal=normalize(Normal);\n normal=gl_FrontFacing ? normal : -normal;\n vec3 viewDir=-normalize(ViewPosition);\n\nvec3 color;\n#ifdef USE_IBL\n color=IBLColor(viewDir);\n#else\n Roughness2=roughness*roughness;\n color=emissive.rgb;\n for(int i=0; i < nlights; ++i) {\n Light Li=Lights[i];\n vec3 L=Li.direction;\n float cosTheta=max(dot(normal,L),0.0);\n vec3 radiance=cosTheta*Li.color;\n color += BRDF(viewDir,L)*radiance;\n }\n#endif\n OUTVALUE=vec4(color,diffuse.a);\n#else\n OUTVALUE=emissive;\n#endif\n}\n";!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var i=e();for(var n in i)("object"==typeof exports?exports:t)[n]=i[n]}}("undefined"!=typeof self?self:this,(function(){return function(t){var e={};function i(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=t,i.c=e,i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=1)}([function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.setMatrixArrayType=function(t){e.ARRAY_TYPE=t},e.toRadian=function(t){return t*r},e.equals=function(t,e){return Math.abs(t-e)<=n*Math.max(1,Math.abs(t),Math.abs(e))};var n=e.EPSILON=1e-6;e.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,e.RANDOM=Math.random;var r=Math.PI/180},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.mat4=e.mat3=void 0;var n=s(i(2)),r=s(i(3));function s(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}e.mat3=n,e.mat4=r},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.create=function(){var t=new n.ARRAY_TYPE(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.fromMat4=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[4],t[4]=e[5],t[5]=e[6],t[6]=e[8],t[7]=e[9],t[8]=e[10],t},e.invert=function(t,e){var i=e[0],n=e[1],r=e[2],s=e[3],a=e[4],o=e[5],h=e[6],l=e[7],c=e[8],d=c*a-o*l,m=-c*s+o*h,f=l*s-a*h,u=i*d+n*m+r*f;if(!u)return null;return u=1/u,t[0]=d*u,t[1]=(-c*n+r*l)*u,t[2]=(o*n-r*a)*u,t[3]=m*u,t[4]=(c*i-r*h)*u,t[5]=(-o*i+r*s)*u,t[6]=f*u,t[7]=(-l*i+n*h)*u,t[8]=(a*i-n*s)*u,t};var n=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}(i(0))},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.create=function(){var t=new n.ARRAY_TYPE(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.invert=function(t,e){var i=e[0],n=e[1],r=e[2],s=e[3],a=e[4],o=e[5],h=e[6],l=e[7],c=e[8],d=e[9],m=e[10],f=e[11],u=e[12],p=e[13],v=e[14],x=e[15],g=i*o-n*a,w=i*h-r*a,M=i*l-s*a,b=n*h-r*o,T=n*l-s*o,R=r*l-s*h,y=c*p-d*u,A=c*v-m*u,E=c*x-f*u,I=d*v-m*p,L=d*x-f*p,N=m*x-f*v,_=g*N-w*L+M*I+b*E-T*A+R*y;if(!_)return null;return _=1/_,t[0]=(o*N-h*L+l*I)*_,t[1]=(r*L-n*N-s*I)*_,t[2]=(p*R-v*T+x*b)*_,t[3]=(m*T-d*R-f*b)*_,t[4]=(h*E-a*N-l*A)*_,t[5]=(i*N-r*E+s*A)*_,t[6]=(v*M-u*R-x*w)*_,t[7]=(c*R-m*M+f*w)*_,t[8]=(a*L-o*E+l*y)*_,t[9]=(n*E-i*L-s*y)*_,t[10]=(u*T-p*M+x*g)*_,t[11]=(d*M-c*T-f*g)*_,t[12]=(o*A-a*I-h*y)*_,t[13]=(i*I-n*A+r*y)*_,t[14]=(p*w-u*b-v*g)*_,t[15]=(c*b-d*w+m*g)*_,t},e.multiply=r,e.translate=function(t,e,i){var n=i[0],r=i[1],s=i[2],a=void 0,o=void 0,h=void 0,l=void 0,c=void 0,d=void 0,m=void 0,f=void 0,u=void 0,p=void 0,v=void 0,x=void 0;e===t?(t[12]=e[0]*n+e[4]*r+e[8]*s+e[12],t[13]=e[1]*n+e[5]*r+e[9]*s+e[13],t[14]=e[2]*n+e[6]*r+e[10]*s+e[14],t[15]=e[3]*n+e[7]*r+e[11]*s+e[15]):(a=e[0],o=e[1],h=e[2],l=e[3],c=e[4],d=e[5],m=e[6],f=e[7],u=e[8],p=e[9],v=e[10],x=e[11],t[0]=a,t[1]=o,t[2]=h,t[3]=l,t[4]=c,t[5]=d,t[6]=m,t[7]=f,t[8]=u,t[9]=p,t[10]=v,t[11]=x,t[12]=a*n+c*r+u*s+e[12],t[13]=o*n+d*r+p*s+e[13],t[14]=h*n+m*r+v*s+e[14],t[15]=l*n+f*r+x*s+e[15]);return t},e.rotate=function(t,e,i,r){var s,a,o,h,l,c,d,m,f,u,p,v,x,g,w,M,b,T,R,y,A,E,I,L,N=r[0],_=r[1],O=r[2],P=Math.sqrt(N*N+_*_+O*O);if(Math.abs(P)t.getUniformLocation(e,"Materials["+i+"]."+n);t.uniform4fv(n("diffuse"),new Float32Array(this.diffuse)),t.uniform4fv(n("emissive"),new Float32Array(this.emissive)),t.uniform4fv(n("specular"),new Float32Array(this.specular)),t.uniform4f(n("parameters"),this.shininess,this.metallic,this.fresnel0,0)}}let $,q,K,Z,Q,J,tt,et,it;class nt{constructor(t,e){this.direction=t,this.color=e}setUniform(e,i){let n=n=>t.getUniformLocation(e,"Lights["+i+"]."+n);t.uniform3fv(n("direction"),new Float32Array(this.direction)),t.uniform3fv(n("color"),new Float32Array(this.color))}}function rt(e=!1){let i=t.getParameter(t.MAX_VERTEX_UNIFORM_VECTORS);r=Math.floor((i-14)/4),m=Math.min(Math.max(m,c.length),r),pixelOpt=["WIDTH"],materialOpt=["NORMAL"],colorOpt=["NORMAL","COLOR"],transparentOpt=["NORMAL","COLOR","TRANSPARENT"],e&&(materialOpt.push("USE_IBL"),transparentOpt.push("USE_IBL")),we=_t(pixelOpt),Me=_t(materialOpt),be=_t(colorOpt),Te=_t(transparentOpt)}function st(){t.deleteProgram(Te),t.deleteProgram(be),t.deleteProgram(Me),t.deleteProgram(we)}function at(){let i=o.webgl2?window.top.document.asygl2[e]:window.top.document.asygl[e];i.gl=t,i.nlights=l.length,i.Nmaterials=m,i.maxMaterials=r,i.pixelShader=we,i.materialShader=Me,i.colorShader=be,i.transparentShader=Te}function ot(t,e){let i;return o.webgl2&&(i=t.getContext("webgl2",{alpha:e}),o.embedded&&!i)?(o.webgl2=!1,o.ibl=!1,lt(!1),null):(i||(o.webgl2=!1,o.ibl=!1,i=t.getContext("webgl",{alpha:e})),i||alert("Could not initialize WebGL"),i)}function ht(){let n=window.top.document;if(asygl=o.webgl2?n.asygl2:n.asygl,asygl[e]&&asygl[e].gl)!function(){let i=o.webgl2?window.top.document.asygl2[e]:window.top.document.asygl[e];t=i.gl,d=i.nlights,m=i.Nmaterials,r=i.maxMaterials,we=i.pixelShader,Me=i.materialShader,be=i.colorShader,Te=i.transparentShader}(),(l.length!=d||Math.min(c.length,r)>m)&&(rt(),at());else{if(rc=ot(i,e),!rc)return;t=rc,rt(),o.webgl2?n.asygl2[e]={}:n.asygl[e]={},at()}}function lt(r=!0){if(o.ibl&&(o.webgl2=!0),e=o.background[3]<1,o.embedded){let t=window.top.document;r&&(n=o.canvas.getContext("2d")),i=o.webgl2?t.offscreen2:t.offscreen,i||(i=t.createElement("canvas"),o.webgl2?t.offscreen2=i:t.offscreen=i),o.webgl2?t.asygl2||(t.asygl2=Array(2)):t.asygl||(t.asygl=Array(2)),ht()}else t=ot(o.canvas,e),rt();$=t.getExtension("OES_element_index_uint"),q=t.TRIANGLES,K=new ft(t.POINTS),Z=new ft(t.LINES),Q=new ft,J=new ft,tt=new ft,et=new ft}function ct(t,e,i,n=[]){let r=o.webgl2?"300 es":"100",s=Array(...n),a=[["nlights",0==V?l.length:0],["Nmaterials",m]],h=[["int","Nlights",Math.max(l.length,1)]];o.webgl2&&s.push("WEBGL2"),o.ibl&&a.push(["ROUGHNESS_STEP_COUNT",8..toFixed(2)]),macros_str=a.map(t=>`#define ${t[0]} ${t[1]}`).join("\n"),define_str=s.map(t=>"#define "+t).join("\n"),const_str=h.map(t=>`const ${t[0]} ${t[1]}=${t[2]};`).join("\n"),ext_str=[].map(t=>`#extension ${t}: enable`).join("\n"),shaderSrc=`#version ${r}\n${ext_str}\n${define_str}\n${const_str}\n${macros_str}\n\n\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n \n${e}\n `;let c=t.createShader(i);return t.shaderSource(c,shaderSrc),t.compileShader(c),t.getShaderParameter(c,t.COMPILE_STATUS)?c:(alert(t.getShaderInfoLog(c)),null)}function dt(e,i,n,r=t.ARRAY_BUFFER){return e.length>0&&(0==i&&(i=t.createBuffer(),n=!0),t.bindBuffer(r,i),n&&t.bufferData(r,e,t.STATIC_DRAW)),i}function mt(e,i,n=e.indices){if(0==e.indices.length)return;let r=i!=we;!function(e,i){let n=i==we;t.useProgram(i),t.enableVertexAttribArray(At),n&&t.enableVertexAttribArray(Nt);let r=!n&&l.length>0;r&&t.enableVertexAttribArray(Et);t.enableVertexAttribArray(It),i.projViewMatUniform=t.getUniformLocation(i,"projViewMat"),i.viewMatUniform=t.getUniformLocation(i,"viewMat"),i.normMatUniform=t.getUniformLocation(i,"normMat"),i.orthographicUniform=t.getUniformLocation(i,"orthographic"),(i==be||i==Te)&&t.enableVertexAttribArray(Lt);if(r)for(let t=0;t0&&t.vertexAttribPointer(Et,3,t.FLOAT,!1,24,12):t.vertexAttribPointer(Nt,1,t.FLOAT,!1,16,12),e.materialsBuffer=dt(new Int16Array(e.materialIndices),e.materialsBuffer,s),t.vertexAttribPointer(It,1,t.SHORT,!1,2,0),i!=be&&i!=Te||(e.colorsBuffer=dt(new Float32Array(e.colors),e.colorsBuffer,s),t.vertexAttribPointer(Lt,4,t.FLOAT,!0,0,0)),e.indicesBuffer=dt($?new Uint32Array(n):new Uint16Array(n),e.indicesBuffer,s,t.ELEMENT_ARRAY_BUFFER),e.rendered=!0,t.drawElements(r?V?t.LINES:e.type:t.POINTS,n.length,$?t.UNSIGNED_INT:t.UNSIGNED_SHORT,0)}class ft{constructor(t){this.type=t||q,this.verticesBuffer=0,this.materialsBuffer=0,this.colorsBuffer=0,this.indicesBuffer=0,this.rendered=!1,this.partial=!1,this.clear()}clear(){this.vertices=[],this.materialIndices=[],this.colors=[],this.indices=[],this.nvertices=0,this.materials=[],this.materialTable=[]}vertex(t,e){return this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.vertices.push(e[0]),this.vertices.push(e[1]),this.vertices.push(e[2]),this.materialIndices.push(it),this.nvertices++}Vertex(t,e,i=[0,0,0,0]){return this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.vertices.push(e[0]),this.vertices.push(e[1]),this.vertices.push(e[2]),this.materialIndices.push(it),this.colors.push(i[0]),this.colors.push(i[1]),this.colors.push(i[2]),this.colors.push(i[3]),this.nvertices++}vertex0(t,e){return this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.vertices.push(e),this.materialIndices.push(it),this.nvertices++}iVertex(t,e,i,n,r=[0,0,0,0]){let s=6*t;this.vertices[s]=e[0],this.vertices[s+1]=e[1],this.vertices[s+2]=e[2],this.vertices[s+3]=i[0],this.vertices[s+4]=i[1],this.vertices[s+5]=i[2],this.materialIndices[t]=it;let a=4*t;this.colors[a]=r[0],this.colors[a+1]=r[1],this.colors[a+2]=r[2],this.colors[a+3]=r[3],n&&this.indices.push(t)}append(t){ut(this.vertices,t.vertices),ut(this.materialIndices,t.materialIndices),ut(this.colors,t.colors),function(t,e,i){let n=t.length,r=e.length;t.length+=e.length;for(let s=0;sthis.X&&(this.X=h),lthis.Y&&(this.Y=l)}return(this.X<-1.01||this.x>1.01||this.Y<-1.01||this.y>1.01)&&(this.Onscreen=!1,!0)}T(t){let e=this.c[0],i=this.c[1],n=this.c[2],r=t[0]-e,s=t[1]-i,a=t[2]-n;return[r*I[0]+s*I[3]+a*I[6]+e,r*I[1]+s*I[4]+a*I[7]+i,r*I[2]+s*I[5]+a*I[8]+n]}Tcorners(t,e){return[this.T(t),this.T([t[0],t[1],e[2]]),this.T([t[0],e[1],t[2]]),this.T([t[0],e[1],e[2]]),this.T([e[0],t[1],t[2]]),this.T([e[0],t[1],e[2]]),this.T([e[0],e[1],t[2]]),this.T(e)]}setMaterial(t,e){null==t.materialTable[this.MaterialIndex]&&(t.materials.length>=m&&(t.partial=!0,e()),t.materialTable[this.MaterialIndex]=t.materials.length,t.materials.push(c[this.MaterialIndex])),it=t.materialTable[this.MaterialIndex]}render(){let t;var e,i;if(this.setMaterialIndex(),0==this.CenterIndex?(e=this.Min,i=this.Max,t=[e,[e[0],e[1],i[2]],[e[0],i[1],e[2]],[e[0],i[1],i[2]],[i[0],e[1],e[2]],[i[0],e[1],i[2]],[i[0],i[1],e[2]],i]):(this.c=o.Centers[this.CenterIndex-1],t=this.Tcorners(this.Min,this.Max)),this.offscreen(t))return this.data.clear(),void this.notRendered();let n,r=this.controlpoints;if(0==this.CenterIndex){if(!U&&this.Onscreen)return void this.append();n=r}else{let t=r.length;n=Array(t);for(let e=0;e=-n||0==r)return i;--r,n*=2;let s=new Ot(t[0],t[1],t[2],t[3]),a=new Ot(t[4],t[5],t[6],t[7]),o=new Ot(t[8],t[9],t[10],t[11]),h=new Ot(t[12],t[13],t[14],t[15]),l=new Ot(t[0],t[4],t[8],t[12]),c=new Ot(s.m0,a.m0,o.m0,h.m0),d=new Ot(s.m3,a.m3,o.m3,h.m3),m=new Ot(s.m5,a.m5,o.m5,h.m5),f=new Ot(s.m4,a.m4,o.m4,h.m4),u=new Ot(s.m2,a.m2,o.m2,h.m2),p=new Ot(t[3],t[7],t[11],t[15]),v=[t[0],s.m0,s.m3,s.m5,l.m0,c.m0,d.m0,m.m0,l.m3,c.m3,d.m3,m.m3,l.m5,c.m5,d.m5,m.m5];i=this.bound(v,e,i,n,r);let x=[l.m5,c.m5,d.m5,m.m5,l.m4,c.m4,d.m4,m.m4,l.m2,c.m2,d.m2,m.m2,t[12],h.m0,h.m3,h.m5];i=this.bound(x,e,i,n,r);let g=[m.m5,f.m5,u.m5,p.m5,m.m4,f.m4,u.m4,p.m4,m.m2,f.m2,u.m2,p.m2,h.m5,h.m4,h.m2,t[15]];i=this.bound(g,e,i,n,r);let w=[s.m5,s.m4,s.m2,t[3],m.m0,f.m0,u.m0,p.m0,m.m3,f.m3,u.m3,p.m3,m.m5,f.m5,u.m5,p.m5];return this.bound(w,e,i,n,r)}cornerboundtri(t,e){let i=e(t[0],t[6]);return e(i,t[9])}controlboundtri(t,e){let i=e(t[1],t[2]);return i=e(i,t[3]),i=e(i,t[4]),i=e(i,t[5]),i=e(i,t[7]),e(i,t[8])}boundtri(t,e,i,n,r){if(i=e(i,this.cornerboundtri(t,e)),e(-1,1)*(i-this.controlboundtri(t,e))>=-n||0==r)return i;--r,n*=2;let s=new St(t),a=[s.l003,s.l102,s.l012,s.l201,s.l111,s.l021,s.l300,s.l210,s.l120,s.l030];i=this.boundtri(a,e,i,n,r);let o=[s.l300,s.r102,s.r012,s.r201,s.r111,s.r021,s.r300,s.r210,s.r120,s.r030];i=this.boundtri(o,e,i,n,r);let h=[s.l030,s.u102,s.u012,s.u201,s.u111,s.u021,s.r030,s.u210,s.u120,s.u030];i=this.boundtri(h,e,i,n,r);let l=[s.r030,s.u201,s.r021,s.u102,s.c111,s.r012,s.l030,s.l120,s.l210,s.l300];return this.boundtri(l,e,i,n,r)}Bounds(t,e,i){let n=Array(3),r=t.length,s=Array(r);for(let a=0;a<3;++a){for(let e=0;e0&&this.append()}append(){this.transparent?tt.append(this.data):this.color?J.append(this.data):Q.append(this.data)}notRendered(){this.transparent?tt.rendered=!1:this.color?J.rendered=!1:Q.rendered=!1}Render(t,e,i,n,r,s,a,o,h,l,c,d,m,f,u,p,v){let x=this.Distance(t);if(x[0]0&&this.append()}Render3(t,e,i,n,r,s,a,o,h,l,c,d,m){if(this.Distance3(t)this.epsilon?r:(r=zt(t,e,i),Vt(r)>this.epsilon?r:Xt(t,e,i,n))}sumdifferential(t,e,i,n,r,s,a){let o=this.differential(t,e,i,n),h=this.differential(t,r,s,a);return[o[0]+h[0],o[1]+h[1],o[2]+h[2]]}normal(t,e,i,n,r,s,a){let o=3*(r[0]-n[0]),h=3*(r[1]-n[1]),l=3*(r[2]-n[2]),c=3*(i[0]-n[0]),d=3*(i[1]-n[1]),m=3*(i[2]-n[2]),f=[h*m-l*d,l*c-o*m,o*d-h*c];if(Vt(f)>this.epsilon)return f;let u=[c,d,m],p=[o,h,l],v=zt(n,i,e),x=zt(n,r,s),g=Dt(x,u),w=Dt(p,v);if(f=[g[0]+w[0],g[1]+w[1],g[2]+w[2]],Vt(f)>this.epsilon)return f;let M=Xt(n,i,e,t),b=Xt(n,r,s,a);g=Dt(p,M),w=Dt(b,u);let T=Dt(x,v);return f=[g[0]+w[0]+T[0],g[1]+w[1]+T[1],g[2]+w[2]+T[2]],Vt(f)>this.epsilon?f:(g=Dt(b,v),w=Dt(x,M),f=[g[0]+w[0],g[1]+w[1],g[2]+w[2]],Vt(f)>this.epsilon?f:Dt(b,M))}}function gt(t){return 0<=t&&t<=1}class wt{constructor(t,e,i){const n=1e3*Number.EPSILON,r=n*n;if(Math.abs(t)<=n*Math.abs(e)+r*Math.abs(i))Math.abs(e)>n*Math.abs(i)?(this.roots=1,this.t1=-i/e):0==i?(this.roots=1,this.t1=0):this.roots=0;else{let r=.5*e/t,s=e*r;if(Math.abs(s)<=n*Math.abs(i)){let e=-i/t;e>=0?(this.roots=2,this.t2=Math.sqrt(e),this.t1=-this.t2):this.roots=0}else{let t=-2*i/s;if(t>-1){this.roots=2;let e=r*function(t){return t/(Math.sqrt(1+t)+1)}(t),i=-e-2*r;i<=e?(this.t1=i,this.t2=e):(this.t1=e,this.t2=i)}else-1==t?(this.roots=1,this.t1=this.t2=-r):this.roots=0}}}}class Mt extends pt{constructor(t,e,i,n,r){if(super(),this.controlpoints=t,this.CenterIndex=e,this.MaterialIndex=i,n&&r)this.Min=n,this.Max=r;else{let t=this.Bounds(this.controlpoints);this.Min=t[0],this.Max=t[1]}}Bounds(t){let e=Array(3),i=Array(3),n=t.length,r=Array(n);for(let h=0;h<3;++h){for(let e=0;e0&&this.append()}append(){Z.append(this.data)}notRendered(){Z.rendered=!1}Render(t,e,i){let n=t[0],r=t[1],s=t[2],a=t[3];if(Wt(n,r,s,a)0?-1-it:1+it;for(let e=0,i=this.Indices.length;e1?i[1]:n;if(h&&0!=h.length||(h=n),this.Colors.length>0){let t=i.length>2?i[2]:n;t&&0!=t.length||(t=n);let e=this.Colors[t[0]],l=this.Colors[t[1]],c=this.Colors[t[2]];this.transparent|=e[3]+l[3]+c[3]<3,0==V?(this.data.iVertex(n[0],r,this.Normals[h[0]],o,e),this.data.iVertex(n[1],s,this.Normals[h[1]],o,l),this.data.iVertex(n[2],a,this.Normals[h[2]],o,c)):(this.data.iVertex(n[0],r,this.Normals[h[0]],o,e),this.data.iVertex(n[1],s,this.Normals[h[1]],o,l),this.data.iVertex(n[1],s,this.Normals[h[1]],o,l),this.data.iVertex(n[2],a,this.Normals[h[2]],o,c),this.data.iVertex(n[2],a,this.Normals[h[2]],o,c),this.data.iVertex(n[0],r,this.Normals[h[0]],o,e))}else 0==V?(this.data.iVertex(n[0],r,this.Normals[h[0]],o),this.data.iVertex(n[1],s,this.Normals[h[1]],o),this.data.iVertex(n[2],a,this.Normals[h[2]],o)):(this.data.iVertex(n[0],r,this.Normals[h[0]],o),this.data.iVertex(n[1],s,this.Normals[h[1]],o),this.data.iVertex(n[1],s,this.Normals[h[1]],o),this.data.iVertex(n[2],a,this.Normals[h[2]],o),this.data.iVertex(n[2],a,this.Normals[h[2]],o),this.data.iVertex(n[0],r,this.Normals[h[0]],o))}this.data.nvertices=t.length,this.data.indices.length>0&&this.append()}append(){this.transparent?tt.append(this.data):et.append(this.data)}notRendered(){this.transparent?tt.rendered=!1:et.rendered=!1}}function Rt(){M=-Math.tan(.5*o.angleOfView)*o.maxBound[2],O.x=O.y=0,O.z=.5*(o.minBound[2]+o.maxBound[2]),x=v=o.zoom0,S.zmin=o.minBound[2],S.zmax=o.maxBound[2],P.x=P.y=0,Pe(),U=!0,Oe()}function yt(){mat4.identity(R),Rt(),window.top.asyWebApplication&&window.top.asyWebApplication.setProjection(""),window.parent.asyProjection=!1}let At=0,Et=1,It=2,Lt=3,Nt=4;function _t(e=[]){let i=ct(t,vertex,t.VERTEX_SHADER,e),n=ct(t,fragment,t.FRAGMENT_SHADER,e),r=t.createProgram();return t.attachShader(r,i),t.attachShader(r,n),t.bindAttribLocation(r,At,"position"),t.bindAttribLocation(r,Et,"normal"),t.bindAttribLocation(r,It,"materialIndex"),t.bindAttribLocation(r,Lt,"color"),t.bindAttribLocation(r,Nt,"width"),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialize shaders"),r}class Ot{constructor(t,e,i,n){this.m0=.5*(t+e);let r=.5*(e+i);this.m2=.5*(i+n),this.m3=.5*(this.m0+r),this.m4=.5*(r+this.m2),this.m5=.5*(this.m3+this.m4)}}class Pt{constructor(t,e,i,n){this.m0=[.5*(t[0]+e[0]),.5*(t[1]+e[1]),.5*(t[2]+e[2])];let r=.5*(e[0]+i[0]),s=.5*(e[1]+i[1]),a=.5*(e[2]+i[2]);this.m2=[.5*(i[0]+n[0]),.5*(i[1]+n[1]),.5*(i[2]+n[2])],this.m3=[.5*(this.m0[0]+r),.5*(this.m0[1]+s),.5*(this.m0[2]+a)],this.m4=[.5*(r+this.m2[0]),.5*(s+this.m2[1]),.5*(a+this.m2[2])],this.m5=[.5*(this.m3[0]+this.m4[0]),.5*(this.m3[1]+this.m4[1]),.5*(this.m3[2]+this.m4[2])]}}class St{constructor(t){this.l003=t[0];let e=t[1],i=t[2],n=t[3],r=t[4],s=t[5];this.r300=t[6];let a=t[7],o=t[8];this.u030=t[9],this.u021=.5*(this.u030+s),this.u120=.5*(this.u030+o);let h=.5*(s+i),l=.5*(o+r),c=.5*(o+a),d=.5*(i+r);this.l012=.5*(i+this.l003);let m=.5*(r+n);this.r210=.5*(a+this.r300),this.l102=.5*(this.l003+e);let f=.5*(e+n);this.r201=.5*(n+this.r300),this.u012=.5*(this.u021+h),this.u210=.5*(this.u120+c),this.l021=.5*(h+this.l012);let u=.5*l+.25*(r+e);this.r120=.5*(c+this.r210);let p=.5*d+.25*(r+a),v=.25*(s+r)+.5*m;this.l201=.5*(this.l102+f),this.r102=.5*(f+this.r201),this.l210=.5*(p+this.l201),this.r012=.5*(p+this.r102),this.l300=.5*(this.l201+this.r102),this.r021=.5*(v+this.r120),this.u201=.5*(this.u210+v),this.r030=.5*(this.u210+this.r120),this.u102=.5*(this.u012+u),this.l120=.5*(this.l021+u),this.l030=.5*(this.u012+this.l021),this.l111=.5*(d+this.l102),this.r111=.5*(m+this.r210),this.u111=.5*(this.u021+l),this.c111=.25*(h+c+f+r)}}function Ut(t){let e=1/(Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2])||1);return[t[0]*e,t[1]*e,t[2]*e]}function Vt(t){return t[0]*t[0]+t[1]*t[1]+t[2]*t[2]}function Bt(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function Dt(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function Ct(t,e,i,n,r){let s=1-r,a=s*s;return a*s*t+r*(3*(a*e+r*s*i)+r*r*n)}function Ft(t,e){return[e[0]-t[0],e[1]-t[1],e[2]-t[2]]}function zt(t,e,i){return[3*(t[0]+i[0])-6*e[0],3*(t[1]+i[1])-6*e[1],3*(t[2]+i[2])-6*e[2]]}function Xt(t,e,i,n){return[n[0]-t[0]+3*(e[0]-i[0]),n[1]-t[1]+3*(e[1]-i[1]),n[2]-t[2]+3*(e[2]-i[2])]}function Wt(t,e,i,n){let r=[1/3*(n[0]-t[0]),1/3*(n[1]-t[1]),1/3*(n[2]-t[2])];return Math.max(Vt([e[0]-r[0]-t[0],e[1]-r[1]-t[1],e[2]-r[2]-t[2]]),Vt([n[0]-r[0]-i[0],n[1]-r[1]-i[1],n[2]-r[2]-i[2]]))}function Gt(t,e,i,n){let r=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],s=[n[0]-i[0],n[1]-i[1],n[2]-i[2]];return Math.max(Vt(Dt(r,Ut(s))),Vt(Dt(s,Ut(r))))/9}function Ht(t){return[Math.min(t[0][0],t[1][0],t[2][0],t[3][0],t[4][0],t[5][0],t[6][0],t[7][0]),Math.min(t[0][1],t[1][1],t[2][1],t[3][1],t[4][1],t[5][1],t[6][1],t[7][1]),Math.min(t[0][2],t[1][2],t[2][2],t[3][2],t[4][2],t[5][2],t[6][2],t[7][2])]}function jt(t){return[Math.max(t[0][0],t[1][0],t[2][0],t[3][0],t[4][0],t[5][0],t[6][0],t[7][0]),Math.max(t[0][1],t[1][1],t[2][1],t[3][1],t[4][1],t[5][1],t[6][1],t[7][1]),Math.max(t[0][2],t[1][2],t[2][2],t[3][2],t[4][2],t[5][2],t[6][2],t[7][2])]}function kt(t){he||le(),B=!0,D=t.clientX,C=t.clientY}let Yt,$t,qt=!1;function Kt(t){return Math.hypot(t[0].pageX-t[1].pageX,t[0].pageY-t[1].pageY)}function Zt(t){t.preventDefault(),he||le();let e=t.targetTouches;ve=xe=qt=!1,pe||(1!=e.length||B||($t=(new Date).getTime(),touchId=e[0].identifier,D=e[0].pageX,C=e[0].pageY),2!=e.length||B||(touchId=e[0].identifier,Yt=Kt(e),qt=!0))}function Qt(t){B=!1}function Jt(t,e,i,n,r){if(t==i&&e==n)return;let[s,a]=function(t,e){let i=se(t),n=se(e),r=Bt(i,n);return[r>1?0:r<-1?f:Math.acos(r),Ut(Dt(i,n))]}([t,-e],[i,-n]);mat4.fromRotation(_,2*r*T*s/v,a),mat4.multiply(R,_,R)}function te(t,e,i,n){let r=1/v;P.x+=(i-t)*r*s,P.y-=(n-e)*r*a}function ee(t,e,i,n){o.orthographic?te(t,e,i,n):(O.x+=(i-t)*(S.xmax-S.xmin),O.y-=(n-e)*(S.ymax-S.ymin))}function ie(){var t,e;t=A,e=R,mat4.fromTranslation(_,[O.x,O.y,O.z]),mat4.invert(N,_),mat4.multiply(t,e,N),mat4.multiply(t,_,t),mat4.translate(A,A,[O.x,O.y,0]),mat3.fromMat4(L,A),mat3.invert(I,L),mat4.multiply(E,y,A)}function ne(){let t=Math.sqrt(Number.MAX_VALUE),e=1/t;v<=e&&(v=e),v>=t&&(v=t),(1.5*v1.5*x)&&(U=!0,x=v)}function re(t){let e=o.zoomStep*a*t;const i=Math.log(.1*Number.MAX_VALUE)/Math.log(o.zoomFactor);Math.abs(e)1&&(denom=1/n,e*=denom,i*=denom),[e,i,Math.sqrt(Math.max(1-i*i-e*e,0))]}function ae(t,e,i,n){re(e-n)}function oe(t,e,i,n=1){let r;switch(i){case 1:r=Jt;break;case 2:r=te;break;case 3:r=ae;break;case 4:r=ee;break;default:r=(t,e,i,n)=>{}}r((D-s)/s,(C-a)/a,(t-s)/s,(e-a)/a,n),D=t,C=e,Pe(),Oe()}let he=0;function le(){he=1,o.canvas.addEventListener("wheel",fe,!1)}function ce(){let t,e,i;[t,e,i]=function(){let t=Array(3),e=Array(3),i=Array(3),n=O.x,r=O.y,s=.5*(S.zmin+S.zmax);for(let a=0;a<3;++a){let h=0,l=0,c=0,d=4*a;for(let t=0;t<4;++t){let e=4*t,i=R[e],a=R[e+1],m=R[e+2],f=R[e+3],u=o.Transform[d+t];h+=u*(f-n*i-r*a-s*m),c+=u*a,l+=u*(f-n*i-r*a)}t[a]=h,e[a]=c,i[a]=l}return[t,e,i]}();let n=o.orthographic?" orthographic(":" perspective(",r="".padStart(n.length),s="currentprojection=\n"+n+"camera=("+t+"),\n"+r+"up=("+e+"),\n"+r+"target=("+i+"),\n"+r+"zoom="+v*o.initialZoom/o.zoom0;return o.orthographic||(s+=",\n"+r+"angle="+2*Math.atan(Math.tan(.5*o.angleOfView)/v)/u),0==g&&0==w||(s+=",\n"+r+"viewportshift=("+g+","+w+")"),o.orthographic||(s+=",\n"+r+"autoadjust=false"),s+=");\n",window.parent.asyProjection=!0,s}function de(t){if(he||le(),o.embedded&&he&&27==t.keyCode)return he=0,void o.canvas.removeEventListener("wheel",fe,!1);let e=[];switch(t.key){case"x":e=[1,0,0];break;case"y":e=[0,1,0];break;case"z":e=[0,0,1];break;case"h":yt();break;case"m":++V,3==V&&(V=0),2!=V&&(o.embedded||st(),rt(o.ibl)),U=!0,Oe();break;case"+":case"=":case">":v*=o.zoomFactor,me();break;case"-":case"_":case"<":v/=o.zoomFactor,me();break;case"c":window.top.asyWebApplication||prompt("Ctrl+c Enter to copy currentprojection to clipboard; then append to asy file:",ce())}e.length>0&&(mat4.rotate(R,R,.1,e),ie(),Oe())}function me(){ne(),Pe(),Oe()}function fe(t){t.preventDefault(),t.deltaY<0?v*=o.zoomFactor:v/=o.zoomFactor,me()}function ue(t){if(!B)return;let e,i=t.clientX,n=t.clientY;e=t.getModifierState("Control")?2:t.getModifierState("Shift")?3:t.getModifierState("Alt")?4:1,oe(i,n,e)}let pe=!1,ve=!1,xe=!1;function ge(t){if(t.preventDefault(),pe)return;let e=t.targetTouches;if(!qt&&1==e.length&&touchId==e[0].identifier){let t=e[0].pageX,i=e[0].pageY,n=t-D,r=i-C,s=n*n+r*r<=o.shiftHoldDistance*o.shiftHoldDistance;if(s&&!ve&&!xe&&(new Date).getTime()-$t>o.shiftWaitTime&&(navigator.vibrate&&window.navigator.vibrate(o.vibrateTime),ve=!0),ve)oe(t,i,2);else if(!s){xe=!0,oe(e[0].pageX,e[0].pageY,1,.5)}}if(qt&&!ve&&2==e.length&&touchId==e[0].identifier){let t=Kt(e),i=t-Yt;pe=!0,i*=o.zoomPinchFactor,i>o.zoomPinchCap&&(i=o.zoomPinchCap),i<-o.zoomPinchCap&&(i=-o.zoomPinchCap),re(i/b),Yt=t,ve=xe=pe=!1,Pe(),Oe()}}let we,Me,be,Te,Re=[];function ye(){mt(K,we),K.clear()}function Ae(){mt(Z,Me),Z.clear()}function Ee(){mt(Q,Me),Q.clear()}function Ie(){mt(J,be),J.clear()}function Le(){mt(et,Te),et.rendered=!1,et.clear()}function Ne(){let e=tt.indices;if(V>0)return mt(tt,Te,e),void tt.clear();if(e.length>0){!function(t){let e=A[2],i=A[6],n=A[10];Re.length=t.length;for(let r=0;re);n.sort((function(t,i){let n=3*t;Ia=e[n],Ib=e[n+1],Ic=e[n+2];let r=3*i;return IA=e[r],IB=e[r+1],IC=e[r+2],Re[Ia]+Re[Ib]+Re[Ic]void 0&&(t=void 0),e>void 0&&(e=void 0),P.x*=t/o.canvasWidth,P.y*=e/o.canvasHeight,o.canvasWidth=t,o.canvasHeight=e,o.embedded&&(o.canvas.width=i.width=o.canvasWidth,o.canvas.height=i.height=o.canvasHeight),b=Math.hypot(o.canvasWidth,o.canvasHeight),s=.5*o.canvas.width,a=.5*o.canvas.height,T=1+8*Math.hypot(o.viewportMargin[0],o.viewportMargin[1])/b,Se(),Pe(),U=!0}function Ve(){if(o.zoom0=o.initialZoom,window.top.asyWebApplication&&""==window.top.asyWebApplication.getProjection()&&(window.parent.asyProjection=!1),o.absolute&&!o.embedded)o.canvasWidth=o.canvasWidth0*window.devicePixelRatio,o.canvasHeight=o.canvasHeight0*window.devicePixelRatio;else{let t=o.canvasWidth0/o.canvasHeight0;o.canvasWidth=Math.max(window.innerWidth-10,10),o.canvasHeight=Math.max(window.innerHeight-10,10),!o.orthographic&&!window.parent.asyProjection&&o.canvasWidthe%4!=3)}function Xe(e,i,n=t.RGB16F){let r=e.width(),s=e.height(),a=t.createTexture();return t.activeTexture(t.TEXTURE0+i),t.bindTexture(t.TEXTURE_2D,a),t.pixelStorei(t.UNPACK_ALIGNMENT,1),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texImage2D(t.TEXTURE_2D,0,n,r,s,0,t.RGB,t.FLOAT,ze(e)),a}window.webGLStart=function(){o.canvas=document.getElementById("Asymptote"),o.embedded=window.top.document!=document,lt(),t.enable(t.BLEND),t.blendFunc(t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA),t.enable(t.DEPTH_TEST),t.enable(t.SCISSOR_TEST),o.canvas.onmousedown=kt,document.onmouseup=Qt,document.onmousemove=ue,o.canvas.onkeydown=de,o.embedded||le(),o.canvas.addEventListener("touchstart",Zt,!1),o.canvas.addEventListener("touchend",Qt,!1),o.canvas.addEventListener("touchcancel",Qt,!1),o.canvas.addEventListener("touchleave",Qt,!1),o.canvas.addEventListener("touchmove",ge,!1),document.addEventListener("keydown",de,!1),o.canvasWidth0=o.canvasWidth,o.canvasHeight0=o.canvasHeight,mat4.identity(R),0!=window.innerWidth&&0!=window.innerHeight&&Ve(),window.addEventListener("resize",Ve,!1),o.ibl&&async function(){let e=o.imageURL+o.image+"/";function i(t){return new Promise(e=>setTimeout(e,t))}for(;!Module.EXRLoader;)await i(0);promises=[Fe(o.imageURL+"refl.exr").then(t=>{let e=new Module.EXRLoader(t);j=Xe(e,0)}),Fe(e+"diffuse.exr").then(t=>{let e=new Module.EXRLoader(t);H=Xe(e,1)})],refl_promise=[],refl_promise.push(Fe(e+"refl0.exr"));for(let t=1;t<=8;++t)refl_promise.push(Fe(e+"refl"+t+"w.exr"));finished_promise=Promise.all(refl_promise).then(e=>{let i=t.createTexture();t.activeTexture(t.TEXTURE0+2),t.pixelStorei(t.UNPACK_ALIGNMENT,1),t.bindTexture(t.TEXTURE_2D,i),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAX_LEVEL,e.length-1),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR_MIPMAP_LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameterf(t.TEXTURE_2D,t.TEXTURE_MIN_LOD,0),t.texParameterf(t.TEXTURE_2D,t.TEXTURE_MAX_LOD,8);for(let i=0;ia?Ut(r):(r=[2*i[0]-e[0]-n[0],2*i[1]-e[1]-n[1],2*i[2]-e[2]-n[2]],Vt(r)>a?Ut(r):[n[0]-t[0]+3*(e[0]-i[0]),n[1]-t[1]+3*(e[1]-i[1]),n[2]-t[2]+3*(e[2]-i[2])])}let s=[n[0]-t[0]+3*(e[0]-i[0]),n[1]-t[1]+3*(e[1]-i[1]),n[2]-t[2]+3*(e[2]-i[2])],o=[2*(t[0]+i[0])-4*e[0],2*(t[1]+i[1])-4*e[1],2*(t[2]+i[2])-4*e[2]],h=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],l=r*r,c=[s[0]*l+o[0]*r+h[0],s[1]*l+o[1]*r+h[1],s[2]*l+o[2]*r+h[2]];return Vt(c)>a?Ut(c):(l=2*r,c=[s[0]*l+o[0],s[1]*l+o[1],s[2]*l+o[2]],Vt(c)>a?Ut(c):Ut(s))}let h=Array(r.length),l=[e[0]-t[0],e[1]-t[1],e[2]-t[2]];Vt(l)i?Ut(e):(e=Dt(t,[0,0,1]),Vt(e)>i?Ut(e):[1,0,0])}(l);h[0]=new s(t,c,l);for(let a=1;a.palette(int NColors=256, real gamma=1.) // NColors are the number of colors in the palette // gamma is the gamma-factor // // 2) The listed palettes can only be used as // .palette() // // Both functions return pen[] that can be used as a palette in the // module palette. // list of palettes // see also https://matplotlib.org/tutorials/colors/colormaps.html // segmented palettes: // CMRmap // autumn // binary // bone // cool // coolwarm // copper // gist_earth // gist_ncar // gist_stern // gray // hot // hsv // jet // nipy_spectral // pink // spring // summer // winter // wistia // listed palettes: // Accent // Blues // BrBG // BuGn // BuPu // Dark2 // GnBu // Greens // Greys // OrRd // Oranges // PRGn // Paired // Pastel1 // Pastel2 // PiYG // PuBuGn // PuBu // PuOr // PuRd // Purples // RdBu // RdGy // RdPu // RdYlBu // RdYlGn // Reds // Set1 // Set2 // Set3 // Spectral // YlGnBu // YlGn // YlOrBr // YlOrRd // brg // bwr // seismic // tab10 // tab20 // tab20b // tab20c // cividis // inferno // magma // plasma // twilight // twilight_shifted // viridis // Example of usage: // import graph; // import palette; // import colormap; // int NColors=5; // pen[] Palette=spring.palette(NColors); // palette(bounds(0,1),(0.,0),(500,50),Bottom,Palette); // // SOURCE CODE // private real[] makeMappingArray(int N, triple[] data, real gamma=1.) { real[] x; real[] y0; real[] y1; for (int i=0; i= t2) t1 -= n; } else if(t2 >= t1) t2 -= n; return shift(c)*scale(r)*subpath(unitcircle,t1,t2); } // return an arc centered at c with radius r from angle1 to angle2 in degrees, // drawing in the given direction. path arc(pair c, real r, real angle1, real angle2, bool direction) { return arc(c,c+r*dir(angle1),c+r*dir(angle2),direction); } // return an arc centered at c with radius r > 0 from angle1 to angle2 in // degrees, drawing counterclockwise if angle2 >= angle1 (otherwise clockwise). path arc(pair c, real r, real angle1, real angle2) { return arc(c,r,angle1,angle2,angle2 >= angle1 ? CCW : CW); } asymptote-3.05/base/asy-kate.sh0000644000000000000000000002006015031566105015150 0ustar rootroot#!/bin/sh echo ' ' > asymptote.xml # 1. Change Name of lists in <\list> # 2. tail to get rid of the first lines # 3. building the right line ending # 4-5. kill linebreaks # 6. change spaces into <\item> # 7. Undo change (7.) in 'list name' # 8. do some formatting cat asy-keywords.el | sed 's/^(.*\-\([^\-]*\)\-.*/\n/' | tail -14 | sed 's/ ))/<\/item><\/list>/' | tr '\n' '@' | sed 's/@//g' | sed 's/ /<\/item>/g' | sed 's/list<\/item>name/list name/g' | sed 's/>\n> asymptote.xml echo ' ' >> asymptote.xml asymptote-3.05/base/graph_splinetype.asy0000644000000000000000000001635715031566105017207 0ustar rootrootprivate import math; typedef real[] splinetype(real[], real[]); restricted real[] Spline(real[] x, real[] y); restricted splinetype[] Spline; string morepoints="interpolation requires at least 2 points"; string differentlengths="arrays have different lengths"; void checklengths(int x, int y, string text=differentlengths) { if(x != y) abort(text+": "+string(x)+" != "+string(y)); } void checkincreasing(real[] x) { if(!increasing(x,true)) abort("strictly increasing array expected"); } // Linear interpolation real[] linear(real[] x, real[] y) { int n=x.length; checklengths(n,y.length); real[] d=new real[n]; for(int i=0; i < n-1; ++i) d[i]=(y[i+1]-y[i])/(x[i+1]-x[i]); d[n-1]=d[n-2]; return d; } // Standard cubic spline interpolation with not-a-knot condition: // s'''(x_2^-)=s'''(x_2^+) et s'''(x_(n_2)^-)=s'''(x_(n-2)^+) // if n=2, linear interpolation is returned // if n=3, an interpolation polynomial of degree <= 2 is returned: // p(x_1)=y_1, p(x_2)=y_2, p(x_3)=y_3 real[] notaknot(real[] x, real[] y) { int n=x.length; checklengths(n,y.length); checkincreasing(x); real[] d; if(n > 3) { real[] a=new real[n]; real[] b=new real[n]; real[] c=new real[n]; real[] g=new real[n]; b[0]=x[2]-x[1]; c[0]=x[2]-x[0]; a[0]=0; g[0]=((x[1]-x[0])^2*(y[2]-y[1])/b[0]+b[0]*(2*b[0]+3*(x[1]-x[0]))* (y[1]-y[0])/(x[1]-x[0]))/c[0]; for(int i=1; i < n-1; ++i) { a[i]=x[i+1]-x[i]; c[i]=x[i]-x[i-1]; b[i]=2*(a[i]+c[i]); g[i]=3*(c[i]*(y[i+1]-y[i])/a[i]+a[i]*(y[i]-y[i-1])/c[i]); } c[n-1]=0; b[n-1]=x[n-2]-x[n-3]; a[n-1]=x[n-1]-x[n-3]; g[n-1]=((x[n-1]-x[n-2])^2*(y[n-2]-y[n-3])/b[n-1]+ b[n-1]*(2*b[n-1]+3(x[n-1]-x[n-2]))* (y[n-1]-y[n-2])/(x[n-1]-x[n-2]))/a[n-1]; d=tridiagonal(a,b,c,g); } else if(n == 2) { real val=(y[1]-y[0])/(x[1]-x[0]); d=new real[] {val,val}; } else if(n == 3) { real a=(y[1]-y[0])/(x[1]-x[0]); real b=(y[2]-y[1])/(x[2]-x[1]); real c=(b-a)/(x[2]-x[0]); d=new real[] {a+c*(x[0]-x[1]),a+c*(x[1]-x[0]),a+c*(2*x[2]-x[0]-x[1])}; } else abort(morepoints); return d; } // Standard cubic spline interpolation with periodic condition // s'(a)=s'(b), s''(a)=s''(b), assuming that f(a)=f(b) // if n=2, linear interpolation is returned real[] periodic(real[] x, real[] y) { int n=x.length; checklengths(n,y.length); checkincreasing(x); if(abs(y[n-1]-y[0]) > sqrtEpsilon*norm(y)) abort("function values are not periodic"); real[] d; if(n > 2) { real[] a=new real[n-1]; real[] b=new real[n-1]; real[] c=new real[n-1]; real[] g=new real[n-1]; c[0]=x[n-1]-x[n-2]; a[0]=x[1]-x[0]; b[0]=2*(a[0]+c[0]); g[0]=3*c[0]*(y[1]-y[0])/a[0]+3*a[0]*(y[n-1]-y[n-2])/c[0]; for(int i=1; i < n-1; ++i) { a[i]=x[i+1]-x[i]; c[i]=x[i]-x[i-1]; b[i]=2*(a[i]+c[i]); g[i]=3*(c[i]*(y[i+1]-y[i])/a[i]+a[i]*(y[i]-y[i-1])/c[i]); } d=tridiagonal(a,b,c,g); d.push(d[0]); } else if(n == 2) { d=new real[] {0,0}; } else abort(morepoints); return d; } // Standard cubic spline interpolation with the natural condition // s''(a)=s''(b)=0. // if n=2, linear interpolation is returned // Don't use the natural type unless the underlying function // has zero second end points derivatives. real[] natural(real[] x, real[] y) { int n=x.length; checklengths(n,y.length); checkincreasing(x); real[] d; if(n > 2) { real[] a=new real[n]; real[] b=new real[n]; real[] c=new real[n]; real[] g=new real[n]; b[0]=2*(x[1]-x[0]); c[0]=x[1]-x[0]; a[0]=0; g[0]=3*(y[1]-y[0]); for(int i=1; i < n-1; ++i) { a[i]=x[i+1]-x[i]; c[i]=x[i]-x[i-1]; b[i]=2*(a[i]+c[i]); g[i]=3*(c[i]*(y[i+1]-y[i])/a[i]+a[i]*(y[i]-y[i-1])/c[i]); } c[n-1]=0; a[n-1]=x[n-1]-x[n-2]; b[n-1]=2*a[n-1]; g[n-1]=3*(y[n-1]-y[n-2]); d=tridiagonal(a,b,c,g); } else if(n == 2) { real val=(y[1]-y[0])/(x[1]-x[0]); d=new real[] {val,val}; } else abort(morepoints); return d; } // Standard cubic spline interpolation with clamped conditions f'(a), f'(b) splinetype clamped(real slopea, real slopeb) { return new real[] (real[] x, real[] y) { int n=x.length; checklengths(n,y.length); checkincreasing(x); real[] d; if(n > 2) { real[] a=new real[n]; real[] b=new real[n]; real[] c=new real[n]; real[] g=new real[n]; b[0]=x[1]-x[0]; g[0]=b[0]*slopea; c[0]=0; a[0]=0; for(int i=1; i < n-1; ++i) { a[i]=x[i+1]-x[i]; c[i]=x[i]-x[i-1]; b[i]=2*(a[i]+c[i]); g[i]=3*(c[i]*(y[i+1]-y[i])/a[i]+a[i]*(y[i]-y[i-1])/c[i]); } c[n-1]=0; a[n-1]=0; b[n-1]=x[n-1]-x[n-2]; g[n-1]=b[n-1]*slopeb; d=tridiagonal(a,b,c,g); } else if(n == 2) { d=new real[] {slopea,slopeb}; } else abort(morepoints); return d; }; } // Piecewise Cubic Hermite Interpolating Polynomial (PCHIP) // Modified MATLAB code // [1] Fritsch, F. N. and R. E. Carlson, // "Monotone Piecewise Cubic Interpolation," // SIAM J. Numerical Analysis, Vol. 17, 1980, pp.238-246. // [2] Kahaner, David, Cleve Moler, Stephen Nash, // Numerical Methods and Software, Prentice Hall, 1988. real[] monotonic(real[] x, real[] y) { int n=x.length; checklengths(n,y.length); checkincreasing(x); real[] d=new real[n]; if(n > 2) { real[] h=new real[n-1]; real[] del=new real[n-1]; for(int i=0; i < n-1; ++i) { h[i]=x[i+1]-x[i]; del[i]=(y[i+1]-y[i])/h[i]; } int j=0; int k[]=new int[]; for(int i=0; i < n-2; ++i) if((sgn(del[i])*sgn(del[i+1])) > 0) {k[j]=i; j=j+1;} real[] hs=new real[j]; for(int i=0; i < j; ++i) hs[i]=h[k[i]]+h[k[i]+1]; real w1[]=new real[j]; real w2[]=new real[j]; real dmax[]=new real[j]; real dmin[]=new real[j]; for(int i=0; i < j; ++i) { w1[i]=(h[k[i]]+hs[i])/(3*hs[i]); w2[i]=(h[k[i]+1]+hs[i])/(3*hs[i]); dmax[i]=max(abs(del[k[i]]),abs(del[k[i]+1])); dmin[i]=min(abs(del[k[i]]),abs(del[k[i]+1])); } for(int i=0; i < n; ++i) d[i]=0; for(int i=0; i < j; ++i) d[k[i]+1]=dmin[i]/(w1[i]*(del[k[i]]/dmax[i])+w2[i]*(del[k[i]+1]/dmax[i])); d[0]=((2*h[0]+h[1])*del[0]-h[0]*del[1])/(h[0]+h[1]); if(sgn(d[0]) != sgn(del[0])) {d[0]=0;} else if((sgn(del[0]) != sgn(del[1])) && (abs(d[0]) > abs(3*del[0]))) d[0]=3*del[0]; d[n-1]=((2*h[n-2]+h[n-3])*del[n-2]-h[n-2]*del[n-2])/(h[n-2]+h[n-3]); if(sgn(d[n-1]) != sgn(del[n-2])) {d[n-1]=0;} else if((sgn(del[n-2]) != sgn(del[n-3])) && (abs(d[n-1]) > abs(3*del[n-2]))) d[n-1]=3*del[n-2]; } else if(n == 2) { d[0]=d[1]=(y[1]-y[0])/(x[1]-x[0]); } else abort(morepoints); return d; } // Return standard cubic spline interpolation as a guide guide hermite(real[] x, real[] y, splinetype splinetype=null) { int n=x.length; if(n == 0) return nullpath; guide g=(x[0],y[0]); if(n == 1) return g; if(n == 2) return g--(x[1],y[1]); if(splinetype == null) splinetype=(x[0] == x[x.length-1] && y[0] == y[y.length-1]) ? periodic : notaknot; real[] dy=splinetype(x,y); for(int i=1; i < n; ++i) { pair z=(x[i],y[i]); real dx=x[i]-x[i-1]; g=g..controls((x[i-1],y[i-1])+dx*(1,dy[i-1])/3) and (z-dx*(1,dy[i])/3)..z; } return g; } asymptote-3.05/base/rational.asy0000644000000000000000000001453615031566105015440 0ustar rootroot// Asymptote module implementing rational arithmetic. int maxDenominator=100000; // Maximum denominator for approximating reals int gcd(int m, int n) { if(m < n) { int temp=m; m=n; n=temp; } while(n != 0) { int r=m % n; m=n; n=r; } return m; } int lcm(int m, int n) { return m#gcd(m,n)*n; } struct rational { int p=0,q=1; void reduce() { int d=gcd(p,q); if(abs(d) > 1) { p #= d; q #= d; } if(q <= 0) { if(q == 0) abort("Division by zero"); p=-p; q=-q; } } void operator init(int p=0, int q=1, bool reduce=true) { this.p=p; this.q=q; if(reduce) reduce(); } autounravel rational operator cast(int p) { return rational(p,false); } autounravel rational[] operator cast(int[] a) { return sequence(new rational(int i) {return a[i];},a.length); } autounravel rational[][] operator cast(int[][] a) { return sequence(new rational[](int i) {return a[i];},a.length); } real operator ecast(rational r) { return r.p/r.q; } autounravel rational operator ecast(real x) { int sign=x >= 0.0 ? 1 : -1; x=abs(x); int a=floor(x); int b=1; int c=a+1; int d=1; while(true) { int e=a+c; int f=b+d; if(f > maxDenominator) break; if(e/f == x) return rational(sign*e,f); else { if(e/f < x) { a=e; b=f; } else { c=e; d=f; } } } return abs(a/b-x) < abs(c/d-x) ? rational(sign*a,b) : rational(sign*c,d); } autounravel rational operator -(rational r) { return rational(-r.p,r.q,false); } autounravel rational operator +(rational r, rational s) { return rational(r.p*s.q+s.p*r.q,r.q*s.q); } autounravel rational operator -(rational r, rational s) { return rational(r.p*s.q-s.p*r.q,r.q*s.q); } autounravel rational operator *(rational r, rational s) { return rational(r.p*s.p,r.q*s.q); } autounravel rational operator /(rational r, rational s) { return rational(r.p*s.q,r.q*s.p); } autounravel bool operator ==(rational r, rational s) { return r.p == s.p && r.q == s.q; } autounravel bool operator !=(rational r, rational s) { return r.p != s.p || r.q != s.q; } autounravel bool operator <(rational r, rational s) { return r.p*s.q-s.p*r.q < 0; } autounravel bool operator >(rational r, rational s) { return r.p*s.q-s.p*r.q > 0; } autounravel bool operator <=(rational r, rational s) { return r.p*s.q-s.p*r.q <= 0; } autounravel bool operator >=(rational r, rational s) { return r.p*s.q-s.p*r.q >= 0; } } bool[] operator ==(rational[] r, rational s) { return sequence(new bool(int i) {return r[i] == s;},r.length); } bool operator ==(rational[] r, rational[] s) { if(r.length != s.length) abort(" operation attempted on arrays of different lengths: "+ string(r.length)+" != "+string(s.length)); return all(sequence(new bool(int i) {return r[i] == s[i];},r.length)); } bool operator ==(rational[][] r, rational[][] s) { if(r.length != s.length) abort(" operation attempted on arrays of different lengths: "+ string(r.length)+" != "+string(s.length)); return all(sequence(new bool(int i) {return r[i] == s[i];},r.length)); } rational[] operator +(rational[] r, rational[] s) { assert(r.length == s.length); return sequence(new rational(int i) {return r[i]+s[i];},r.length); } rational[] operator -(rational[] r, rational[] s) { assert(r.length == s.length); return sequence(new rational(int i) {return r[i]-s[i];},r.length); } rational[] operator *(rational[] r, rational[] s) { assert(r.length == s.length); return sequence(new rational(int i) {return r[i]*s[i];},r.length); } rational[] operator /(rational[] r, rational[] s) { assert(r.length == s.length); return sequence(new rational(int i) {return r[i]/s[i];},r.length); } bool[] operator <(rational[] r, rational s) { return sequence(new bool(int i) {return r[i] < s;},r.length); } bool[] operator >(rational[] r, rational s) { return sequence(new bool(int i) {return r[i] > s;},r.length); } bool[] operator <=(rational[] r, rational s) { return sequence(new bool(int i) {return r[i] <= s;},r.length); } bool[] operator >=(rational[] r, rational s) { return sequence(new bool(int i) {return r[i] >= s;},r.length); } rational min(rational a, rational b) { return a <= b ? a : b; } rational max(rational a, rational b) { return a >= b ? a : b; } string string(rational r) { return r.q == 1 ? string(r.p) : string(r.p)+"/"+string(r.q); } string texstring(rational r) { if(r.q == 1) return string(r.p); string s; if(r.p < 0) s="-"; return s+"\frac{"+string(abs(r.p))+"}{"+string(r.q)+"}"; } void write(file fout, string s="", rational r, suffix suffix=none) { write(fout,s+string(r),suffix); } void write(string s="", rational r, suffix suffix=endl) { write(stdout,s,r,suffix); } void write(file fout=stdout, string s="", rational[] a, suffix suffix=none) { if(s != "") write(fout,s,endl); for(int i=0; i < a.length; ++i) { write(fout,i,none); write(fout,':\t',a[i],endl); } write(fout,suffix); } void write(file fout=stdout, string s="", rational[][] a, suffix suffix=none) { if(s != "") write(fout,s); for(int i=0; i < a.length; ++i) { rational[] ai=a[i]; for(int j=0; j < ai.length; ++j) { write(fout,ai[j],tab); } write(fout,endl); } write(fout,suffix); } bool rectangular(rational[][] m) { int n=m.length; if(n > 0) { int m0=m[0].length; for(int i=1; i < n; ++i) if(m[i].length != m0) return false; } return true; } rational sum(rational[] a) { rational sum; for(rational r:a) sum += r; return sum; } rational max(rational[] a) { rational M=a[0]; for(rational r:a) M=max(M,r); return M; } rational abs(rational r) { return rational(abs(r.p),r.q,false); } rational[] operator -(rational[] r) { return sequence(new rational(int i) {return -r[i];},r.length); } rational[][] rationalidentity(int n) { return sequence(new rational[](int i) {return sequence(new rational(int j) {return j == i ? 1 : 0;},n);},n); } /* rational r=rational(1,3)+rational(1,4); write(r == rational(1,12)); write(r); real x=r; write(x); rational r=3; write(r); write(gcd(-8,12)); write(rational(-36,-14)); int[][] a=new int[][] {{1,2},{3,4}}; rational[][] r=a; write(r); */ asymptote-3.05/base/graph.asy0000644000000000000000000017533615031566105014736 0ustar rootrootprivate import math; import graph_splinetype; import graph_settings; scaleT Linear; scaleT Log=scaleT(log10,pow10,logarithmic=true); scaleT Logarithmic=Log; string baselinetemplate="$10^4$"; // A linear scale, with optional autoscaling of minimum and maximum values, // scaling factor s and intercept. scaleT Linear(bool automin=false, bool automax=automin, real s=1, real intercept=0) { real sinv=1/s; scalefcn T,Tinv; if(s == 1 && intercept == 0) T=Tinv=identity; else { T=new real(real x) {return (x-intercept)*s;}; Tinv=new real(real x) {return x*sinv+intercept;}; } return scaleT(T,Tinv,logarithmic=false,automin,automax); } // A logarithmic scale, with optional autoscaling of minimum and maximum // values. scaleT Log(bool automin=false, bool automax=automin) { return scaleT(Log.T,Log.Tinv,logarithmic=true,automin,automax); } // A "broken" linear axis omitting the segment [a,b]. scaleT Broken(real a, real b, bool automin=false, bool automax=automin) { real skip=b-a; real T(real x) { if(x <= a) return x; if(x <= b) return a; return x-skip; } real Tinv(real x) { if(x <= a) return x; return x+skip; } return scaleT(T,Tinv,logarithmic=false,automin,automax); } // A "broken" logarithmic axis omitting the segment [a,b], where a and b are // automatically rounded to the nearest integral power of the base. scaleT BrokenLog(real a, real b, bool automin=false, bool automax=automin) { real A=round(Log.T(a)); real B=round(Log.T(b)); a=Log.Tinv(A); b=Log.Tinv(B); real skip=B-A; real T(real x) { if(x <= a) return Log.T(x); if(x <= b) return A; return Log.T(x)-skip; } real Tinv(real x) { real X=Log.Tinv(x); if(X <= a) return X; return Log.Tinv(x+skip); } return scaleT(T,Tinv,logarithmic=true,automin,automax); } Label Break=Label("$\approx$",UnFill(0.2mm)); void scale(picture pic=currentpicture, scaleT x, scaleT y=x, scaleT z=y) { pic.scale.x.scale=x; pic.scale.y.scale=y; pic.scale.z.scale=z; pic.scale.x.automin=x.automin; pic.scale.y.automin=y.automin; pic.scale.z.automin=z.automin; pic.scale.x.automax=x.automax; pic.scale.y.automax=y.automax; pic.scale.z.automax=z.automax; } void scale(picture pic=currentpicture, bool xautoscale=false, bool yautoscale=xautoscale, bool zautoscale=yautoscale) { scale(pic,Linear(xautoscale,xautoscale),Linear(yautoscale,yautoscale), Linear(zautoscale,zautoscale)); } struct scientific { int sign; real mantissa; int exponent; int ceil() {return sign*ceil(mantissa);} real scale(real x, real exp) { static real max=0.1*realMax; static real limit=-log10(max); return x*(exp > limit ? 10^-exp : max); } real ceil(real x, real exp) {return ceil(sign*scale(abs(x),exp));} real floor(real x, real exp) {return floor(sign*scale(abs(x),exp));} } // Convert x to scientific notation scientific scientific(real x) { scientific s; s.sign=sgn(x); x=abs(x); if(x == 0) {s.mantissa=0; s.exponent=-intMax; return s;} real logx=log10(x); s.exponent=floor(logx); s.mantissa=s.scale(x,s.exponent); return s; } // Autoscale limits and tick divisor. struct bounds { real min; real max; // Possible tick intervals: int[] divisor; void operator init(real min, real max, int[] divisor=new int[]) { this.min=min; this.max=max; this.divisor=divisor; } } // Compute tick divisors. int[] divisors(int a, int b) { int[] dlist; int n=b-a; dlist[0]=1; if(n == 1) {dlist[1]=10; dlist[2]=100; return dlist;} if(n == 2) {dlist[1]=2; return dlist;} int sqrtn=floor(sqrt(n)); int i=0; for(int d=2; d <= sqrtn; ++d) if(n % d == 0 && (a*b >= 0 || b % (n/d) == 0)) dlist[++i]=d; for(int d=sqrtn; d >= 1; --d) if(n % d == 0 && (a*b >= 0 || b % d == 0)) dlist[++i]=quotient(n,d); return dlist; } real upscale(real b, real a) { if(b <= 5) b=5; else if (b > 10 && a >= 0 && b <= 12) b=12; else if (b > 10 && (a >= 0 || 15 % -a == 0) && b <= 15) b=15; else b=ceil(b/10)*10; return b; } // Compute autoscale limits and tick divisor. bounds autoscale(real Min, real Max, scaleT scale=Linear) { bounds m; if(scale.logarithmic) { m.min=floor(Min); m.max=ceil(Max); return m; } if(!(finite(Min) && finite(Max))) abort("autoscale requires finite limits"); Min=scale.Tinv(Min); Max=scale.Tinv(Max); m.min=Min; m.max=Max; if(Min > Max) {real temp=Min; Min=Max; Max=temp;} if(Min == Max) { if(Min == 0) {m.max=1; return m;} if(Min > 0) {Min=0; Max *= 2;} else {Min *= 2; Max=0;} } int sign; if(Min < 0 && Max <= 0) {real temp=-Min; Min=-Max; Max=temp; sign=-1;} else sign=1; scientific sa=scientific(Min); scientific sb=scientific(Max); int exp=max(sa.exponent,sb.exponent); real a=sa.floor(Min,exp); real b=sb.ceil(Max,exp); void zoom() { --exp; a=sa.floor(Min,exp); b=sb.ceil(Max,exp); } if(sb.mantissa <= 1.5) zoom(); while((b-a)*10.0^exp > 10*(Max-Min)) zoom(); real bsave=b; if(b-a > (a >= 0 ? 8 : 6)) { b=upscale(b,a); if(a >= 0) { if(a <= 5) a=0; else a=floor(a/10)*10; } else a=-upscale(-a,-1); } // Redo b in case the value of a has changed if(bsave-a > (a >= 0 ? 8 : 6)) b=upscale(bsave,a); if(sign == -1) {real temp=-a; a=-b; b=temp;} real Scale=10.0^exp; m.min=scale.T(a*Scale); m.max=scale.T(b*Scale); if(m.min > m.max) {real temp=m.min; m.min=m.max; m.max=temp;} m.divisor=divisors(round(a),round(b)); return m; } typedef string ticklabel(real); ticklabel Format(string s=defaultformat) { return new string(real x) {return format(s,x);}; } ticklabel OmitFormat(string s=defaultformat ... real[] x) { return new string(real v) { string V=format(s,v); for(real a : x) if(format(s,a) == V) return ""; return V; }; } string trailingzero="$%#$"; string signedtrailingzero="$%+#$"; ticklabel DefaultFormat=Format(); ticklabel NoZeroFormat=OmitFormat(0); // Format tick values as integral powers of base; otherwise with DefaultFormat. ticklabel DefaultLogFormat(int base) { return new string(real x) { string exponent=format("%.4f",log(x)/log(base)); return find(exponent,".") == -1 ? "$"+(string) base+"^{"+exponent+"}$" : format(x); }; } // Format all tick values as powers of base. ticklabel LogFormat(int base) { return new string(real x) { return format("$"+(string) base+"^{%g}$",log(x)/log(base)); }; } ticklabel LogFormat=LogFormat(10); ticklabel DefaultLogFormat=DefaultLogFormat(10); // The default direction specifier. pair zero(real) {return 0;} struct ticklocate { real a,b; // Tick values at point(g,0), point(g,length(g)). autoscaleT S; // Autoscaling transformation. pair dir(real t); // Absolute 2D tick direction. triple dir3(real t); // Absolute 3D tick direction. real time(real v); // Returns the time corresponding to the value v. ticklocate copy() { ticklocate T=new ticklocate; T.a=a; T.b=b; T.S=S.copy(); T.dir=dir; T.dir3=dir3; T.time=time; return T; } } autoscaleT defaultS; typedef real valuetime(real); valuetime linear(scalefcn S=identity, real Min, real Max) { real factor=Max == Min ? 0.0 : 1.0/(Max-Min); return new real(real v) {return (S(v)-Min)*factor;}; } ticklocate ticklocate(real a, real b, autoscaleT S=defaultS, real tickmin=-infinity, real tickmax=infinity, real time(real)=null, pair dir(real)=zero) { if((valuetime) time == null) time=linear(S.T(),a,b); ticklocate locate; locate.a=a; locate.b=b; locate.S=S.copy(); if(finite(tickmin)) locate.S.tickMin=tickmin; if(finite(tickmax)) locate.S.tickMax=tickmax; locate.time=time; locate.dir=dir; return locate; } private struct locateT { real t; // tick location time pair Z; // tick location in frame coordinates pair pathdir; // path direction in frame coordinates pair dir; // tick direction in frame coordinates void dir(transform T, path g, ticklocate locate, real t) { pathdir=unit(shiftless(T)*dir(g,t)); pair Dir=locate.dir(t); dir=Dir == 0 ? -I*pathdir : unit(Dir); } // Locate the desired position of a tick along a path. void calc(transform T, path g, ticklocate locate, real val) { t=locate.time(val); Z=T*point(g,t); dir(T,g,locate,t); } } pair ticklabelshift(pair align, pen p=currentpen) { return 0.25*unit(align)*labelmargin(p); } void drawtick(frame f, transform T, path g, path g2, ticklocate locate, real val, real Size, int sign, pen p, bool extend) { locateT locate1,locate2; locate1.calc(T,g,locate,val); if(extend && size(g2) > 0) { locate2.calc(T,g2,locate,val); draw(f,locate1.Z--locate2.Z,p); } else if(sign == 0) draw(f,locate1.Z-Size*locate1.dir--locate1.Z+Size*locate1.dir,p); else draw(f,locate1.Z--locate1.Z+Size*sign*locate1.dir,p); } real zerotickfuzz=10*epsilon; // Label a tick on a frame. pair labeltick(frame d, transform T, path g, ticklocate locate, real val, pair side, int sign, real Size, ticklabel ticklabel, Label F, real norm=0) { locateT locate1; locate1.calc(T,g,locate,val); pair align=side*locate1.dir; pair perp=I*locate1.pathdir; // Adjust tick label alignment pair adjust=unit(align+0.75perp*sgn(dot(align,perp))); // Project align onto adjusted direction. align=adjust*dot(align,adjust); pair shift=dot(align,-sign*locate1.dir) <= 0 ? align*Size : ticklabelshift(align,F.p); real label; if(locate.S.scale.logarithmic) label=locate.S.scale.Tinv(val); else { label=val; if(abs(label) < zerotickfuzz*norm) label=0; // Fix epsilon errors at +/-1e-4 // default format changes to scientific notation here if(abs(abs(label)-1e-4) < epsilon) label=sgn(label)*1e-4; } string s=ticklabel(label); if(s != "") label(d,F.T*baseline(s,baselinetemplate),locate1.Z+shift,align,F.p, F.filltype); return locate1.pathdir; } // Add axis label L to frame f. void labelaxis(frame f, transform T, Label L, path g, ticklocate locate=null, int sign=1, bool ticklabels=false) { Label L0=L.copy(); real t=L0.relative(g); pair z=point(g,t); pair dir=dir(g,t); pair perp=I*dir; if(locate != null) { locateT locate1; locate1.dir(T,g,locate,t); L0.align(L0.align,unit(-sgn(dot(sign*locate1.dir,perp))*perp)); } pair align=L0.align.dir; if(L0.align.relative) align *= -perp; pair alignperp=dot(align,perp)*perp; pair offset; if(ticklabels) { if(piecewisestraight(g)) { real angle=degrees(dir,warn=false); transform S=rotate(-angle,z); frame F=S*f; pair Align=rotate(-angle)*alignperp; offset=unit(alignperp-sign*locate.dir(t))* abs((Align.y >= 0 ? max(F).y : (Align.y < 0 ? min(F).y : 0))-z.y); } z += offset; } L0.align(align); L0.position(z); frame d; add(d,L0); pair width=0.5*size(d); int n=length(g); real t=L.relative(); pair s=realmult(width,dir(g,t)); if(t <= 0) { if(L.align.default) s *= -axislabelfactor; d=shift(s)*d; } else if(t >= n) { if(L.align.default) s *= -axislabelfactor; d=shift(-s)*d; } else if(offset == 0 && L.align.default) { pair s=realmult(width,I*dir(g,t)); s=axislabelfactor*s; d=shift(s)*d; } add(f,d); } // Check the tick coverage of a linear axis. bool axiscoverage(int N, transform T, path g, ticklocate locate, real Step, pair side, int sign, real Size, Label F, ticklabel ticklabel, real norm, real limit) { real coverage=0; bool loop=cyclic(g); real a=locate.S.Tinv(locate.a); real b=locate.S.Tinv(locate.b); real tickmin=finite(locate.S.tickMin) ? locate.S.Tinv(locate.S.tickMin) : a; if(Size > 0) { int count=0; if(loop) count=N+1; else { for(int i=0; i <= N; ++i) { real val=tickmin+i*Step; if(val >= a && val <= b) ++count; } } if(count > 0) limit /= count; for(int i=0; i <= N; ++i) { real val=tickmin+i*Step; if(loop || (val >= a && val <= b)) { frame d; pair dir=labeltick(d,T,g,locate,val,side,sign,Size,ticklabel,F,norm); if(abs(dot(size(d),dir)) > limit) return false; } } } return true; } // Check the tick coverage of a logarithmic axis. bool logaxiscoverage(int N, transform T, path g, ticklocate locate, pair side, int sign, real Size, Label F, ticklabel ticklabel, real limit, int first, int last) { bool loop=cyclic(g); real coverage=0; real a=locate.a; real b=locate.b; int count=0; for(int i=first-1; i <= last+1; i += N) { if(loop || i >= a && i <= b) ++count; } if(count > 0) limit /= count; for(int i=first-1; i <= last+1; i += N) { if(loop || i >= a && i <= b) { frame d; pair dir=labeltick(d,T,g,locate,i,side,sign,Size,ticklabel,F); if(abs(dot(size(d),dir)) > limit) return false; } } return true; } struct tickvalues { real[] major; real[] minor; int N; // For logarithmic axes: number of decades between tick labels. } // Determine a format that distinguishes adjacent pairs of ticks, optionally // adding trailing zeros. string autoformat(string format="", real norm ... real[] a) { bool trailingzero=(format == trailingzero); bool signedtrailingzero=(format == signedtrailingzero); if(!trailingzero && !signedtrailingzero && format != "") return format; real[] A=sort(a); real[] a=abs(A); bool signchange=(A.length > 1 && A[0] < 0 && A[A.length-1] >= 0); for(int i=0; i < A.length; ++i) if(a[i] < zerotickfuzz*norm) A[i]=a[i]=0; int n=0; bool Fixed=find(a >= 1e4-epsilon | (a > 0 & a <= 1e-4-epsilon)) < 0; string Format=defaultformat(4,fixed=Fixed); if(Fixed && n < 4) { for(int i=0; i < A.length; ++i) { real a=A[i]; while(format(defaultformat(n,fixed=Fixed),a) != format(Format,a)) ++n; } } string trailing=trailingzero ? (signchange ? "# " : "#") : signedtrailingzero ? "#+" : ""; string format=defaultformat(n,trailing,Fixed); for(int i=0; i < A.length-1; ++i) { real a=A[i]; real b=A[i+1]; // Check if an extra digit of precision should be added. string fixedformat="%#."+string(n+1)+"f"; string A=format(fixedformat,a); string B=format(fixedformat,b); if(substr(A,length(A)-1,1) != "0" || substr(B,length(B)-1,1) != "0") { a *= 0.1; b *= 0.1; } if(a != b) { while(format(format,a) == format(format,b)) format=defaultformat(++n,trailing,Fixed); } } if(n == 0) return defaultformat; return format; } // Automatic tick generation routine. tickvalues generateticks(int sign, Label F="", ticklabel ticklabel=null, int N, int n=0, real Step=0, real step=0, real Size=0, real size=0, transform T, pair side, path g, real limit, pen p, ticklocate locate, int[] divisor, bool opposite) { tickvalues tickvalues; sign=opposite ? -sign : sign; if(Size == 0) Size=Ticksize; if(size == 0) size=ticksize; F=F.copy(); F.p(p); if(F.align.dir != 0) side=F.align.dir; else if(side == 0) side=((sign == 1) ? left : right); bool ticklabels=false; path G=T*g; if(!locate.S.scale.logarithmic) { real a=locate.S.Tinv(locate.a); real b=locate.S.Tinv(locate.b); real norm=max(abs(a),abs(b)); string format=autoformat(F.s,norm,a,b); if(F.s == "%") F.s=""; if(ticklabel == null) ticklabel=Format(format); if(a > b) {real temp=a; a=b; b=temp;} if(b-a < 100.0*epsilon*norm) b=a; bool autotick=Step == 0 && N == 0; real tickmin=finite(locate.S.tickMin) && (autotick || locate.S.automin) ? locate.S.Tinv(locate.S.tickMin) : a; real tickmax=finite(locate.S.tickMax) && (autotick || locate.S.automax) ? locate.S.Tinv(locate.S.tickMax) : b; if(tickmin > tickmax) {real temp=tickmin; tickmin=tickmax; tickmax=temp;} real inStep=Step; bool calcStep=true; real len=tickmax-tickmin; if(autotick) { N=1; if(divisor.length > 0) { bool autoscale=locate.S.automin && locate.S.automax; real h=0.5*(b-a); if(h > 0) { for(int d=divisor.length-1; d >= 0; --d) { int N0=divisor[d]; Step=len/N0; int N1=N0; int m=2; while(Step > h) { N0=m*N1; Step=len/N0; m *= 2; } if(axiscoverage(N0,T,g,locate,Step,side,sign,Size,F,ticklabel,norm, limit)) { N=N0; if(N0 == 1 && !autoscale && d < divisor.length-1) { // Try using 2 ticks (otherwise 1); int div=divisor[d+1]; Step=quotient(div,2)*len/div; calcStep=false; if(axiscoverage(2,T,g,locate,Step,side,sign,Size,F,ticklabel, norm,limit)) N=2; else Step=len; } // Found a good divisor; now compute subtick divisor if(n == 0) { if(step != 0) n=ceil(Step/step); else { n=quotient(divisor[divisor.length-1],N); if(N == 1) n=(a*b >= 0) ? 2 : 1; if(n == 1) n=2; } } break; } } } } } if(inStep != 0 && !locate.S.automin) { tickmin=floor(tickmin/Step)*Step; len=tickmax-tickmin; } if(calcStep) { if(N == 1) N=2; if(N == 0) N=(int) (len/Step); else Step=len/N; } if(n == 0) { if(step != 0) n=ceil(Step/step); } else step=Step/n; b += epsilon*norm; if(Size > 0) { for(int i=0; i <= N; ++i) { real val=tickmin+i*Step; if(val >= a && val <= b) tickvalues.major.push(val); if(size > 0 && step > 0) { real iStep=i*Step; real jstop=(len-iStep)/step; for(int j=1; j < n && j <= jstop; ++j) { real val=tickmin+iStep+j*step; if(val >= a && val <= b) tickvalues.minor.push(val); } } } } } else { // Logarithmic string format=F.s; if(F.s == "%") F.s=""; int base=round(locate.S.scale.Tinv(1)); if(ticklabel == null) ticklabel=format == "%" ? Format("") : DefaultLogFormat(base); real a=locate.S.postscale.Tinv(locate.a); real b=locate.S.postscale.Tinv(locate.b); if(a > b) {real temp=a; a=b; b=temp;} int first=floor(a-epsilon); int last=ceil(b+epsilon); if(N == 0) { N=1; while(N <= last-first) { if(logaxiscoverage(N,T,g,locate,side,sign,Size,F,ticklabel,limit, first,last)) break; ++N; } } if(N <= 2 && n == 0) n=base; tickvalues.N=N; if(N > 0) { for(int i=first-1; i <= last+1; ++i) { if(i >= a && i <= b) tickvalues.major.push(locate.S.scale.Tinv(i)); if(n > 0) { for(int j=2; j < n; ++j) { real val=(i+1+locate.S.scale.T(j/n)); if(val >= a && val <= b) tickvalues.minor.push(locate.S.scale.Tinv(val)); } } } } } return tickvalues; } // Signature of routines that draw labelled paths with ticks and tick labels. typedef void ticks(frame, transform, Label, pair, path, path, pen, arrowbar, margin, ticklocate, int[], bool opposite=false); // Tick construction routine for a user-specified array of tick values. ticks Ticks(int sign, Label F="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, real[] Ticks=new real[], real[] ticks=new real[], int N=1, bool begin=true, bool end=true, real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return new void(frame f, transform t, Label L, pair side, path g, path g2, pen p, arrowbar arrow, margin margin, ticklocate locate, int[] divisor, bool opposite) { // Use local copy of context variables: int sign=opposite ? -sign : sign; pen pTick=pTick; pen ptick=ptick; ticklabel ticklabel=ticklabel; real Size=Size; real size=size; if(Size == 0) Size=Ticksize; if(size == 0) size=ticksize; Label L=L.copy(); Label F=F.copy(); L.p(p); F.p(p); if(pTick == nullpen) pTick=p; if(ptick == nullpen) ptick=pTick; if(F.align.dir != 0) side=F.align.dir; else if(side == 0) side=F.T*((sign == 1) ? left : right); bool ticklabels=false; path G=t*g; path G2=t*g2; scalefcn T; real a,b; if(locate.S.scale.logarithmic) { a=locate.S.postscale.Tinv(locate.a); b=locate.S.postscale.Tinv(locate.b); T=locate.S.scale.T; } else { a=locate.S.Tinv(locate.a); b=locate.S.Tinv(locate.b); T=identity; } if(a > b) {real temp=a; a=b; b=temp;} real norm=max(abs(a),abs(b)); string format=autoformat(F.s,norm...Ticks); if(F.s == "%") F.s=""; if(ticklabel == null) { if(locate.S.scale.logarithmic) { int base=round(locate.S.scale.Tinv(1)); ticklabel=format == "%" ? Format("") : DefaultLogFormat(base); } else ticklabel=Format(format); } begingroup(f); if(opposite) draw(f,G,p); else draw(f,margin(G,p).g,p,arrow); for(int i=(begin ? 0 : 1); i < (end ? Ticks.length : Ticks.length-1); ++i) { real val=T(Ticks[i]); if(val >= a && val <= b) drawtick(f,t,g,g2,locate,val,Size,sign,pTick,extend); } for(int i=0; i < ticks.length; ++i) { real val=T(ticks[i]); if(val >= a && val <= b) drawtick(f,t,g,g2,locate,val,size,sign,ptick,extend); } endgroup(f); if(N == 0) N=1; if(Size > 0 && !opposite) { for(int i=(beginlabel ? 0 : 1); i < (endlabel ? Ticks.length : Ticks.length-1); i += N) { real val=T(Ticks[i]); if(val >= a && val <= b) { ticklabels=true; labeltick(f,t,g,locate,val,side,sign,Size,ticklabel,F,norm); } } } if(L.s != "" && !opposite) labelaxis(f,t,L,G,locate,sign,ticklabels); }; } // Optional routine to allow modification of auto-generated tick values. typedef tickvalues tickmodifier(tickvalues); tickvalues None(tickvalues v) {return v;} // Tickmodifier that removes all ticks in the intervals [a[i],b[i]]. tickmodifier OmitTickIntervals(real[] a, real[] b) { return new tickvalues(tickvalues v) { if(a.length != b.length) abort(differentlengths); void omit(real[] A) { if(A.length != 0) { real norm=max(abs(A)); for(int i=0; i < a.length; ++i) { int j; while((j=find(A > a[i]-zerotickfuzz*norm & A < b[i]+zerotickfuzz*norm)) >= 0) { A.delete(j); } } } } omit(v.major); omit(v.minor); return v; }; } // Tickmodifier that removes all ticks in the interval [a,b]. tickmodifier OmitTickInterval(real a, real b) { return OmitTickIntervals(new real[] {a}, new real[] {b}); } // Tickmodifier that removes the specified ticks. tickmodifier OmitTick(... real[] x) { return OmitTickIntervals(x,x); } tickmodifier NoZero=OmitTick(0); tickmodifier Break(real, real)=OmitTickInterval; // Automatic tick construction routine. ticks Ticks(int sign, Label F="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, tickmodifier modify=None, real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return new void(frame f, transform T, Label L, pair side, path g, path g2, pen p, arrowbar arrow, margin margin, ticklocate locate, int[] divisor, bool opposite) { real limit=Step == 0 ? axiscoverage*arclength(T*g) : 0; tickvalues values=modify(generateticks(sign,F,ticklabel,N,n,Step,step, Size,size,T,side,g, limit,p,locate,divisor,opposite)); Ticks(sign,F,ticklabel,beginlabel,endlabel,values.major,values.minor, values.N,begin,end,Size,size,extend,pTick,ptick) (f,T,L,side,g,g2,p,arrow,margin,locate,divisor,opposite); }; } ticks NoTicks() { return new void(frame f, transform T, Label L, pair, path g, path, pen p, arrowbar arrow, margin margin, ticklocate, int[], bool opposite) { path G=T*g; if(opposite) draw(f,G,p); else { draw(f,margin(G,p).g,p,arrow); if(L.s != "") { Label L=L.copy(); L.p(p); labelaxis(f,T,L,G); } } }; } ticks LeftTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, tickmodifier modify=None, real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return Ticks(-1,format,ticklabel,beginlabel,endlabel,N,n,Step,step, begin,end,modify,Size,size,extend,pTick,ptick); } ticks RightTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, tickmodifier modify=None, real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return Ticks(1,format,ticklabel,beginlabel,endlabel,N,n,Step,step, begin,end,modify,Size,size,extend,pTick,ptick); } ticks Ticks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, tickmodifier modify=None, real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return Ticks(0,format,ticklabel,beginlabel,endlabel,N,n,Step,step, begin,end,modify,Size,size,extend,pTick,ptick); } ticks LeftTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, real[] Ticks, real[] ticks=new real[], real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return Ticks(-1,format,ticklabel,beginlabel,endlabel, Ticks,ticks,Size,size,extend,pTick,ptick); } ticks RightTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, real[] Ticks, real[] ticks=new real[], real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return Ticks(1,format,ticklabel,beginlabel,endlabel, Ticks,ticks,Size,size,extend,pTick,ptick); } ticks Ticks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, real[] Ticks, real[] ticks=new real[], real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return Ticks(0,format,ticklabel,beginlabel,endlabel, Ticks,ticks,Size,size,extend,pTick,ptick); } ticks NoTicks=NoTicks(), LeftTicks=LeftTicks(), RightTicks=RightTicks(), Ticks=Ticks(); pair tickMin(picture pic) { return minbound(pic.userMin(),(pic.scale.x.tickMin,pic.scale.y.tickMin)); } pair tickMax(picture pic) { return maxbound(pic.userMax(),(pic.scale.x.tickMax,pic.scale.y.tickMax)); } int Min=-1; int Value=0; int Max=1; int Both=2; // Structure used to communicate axis and autoscale settings to tick routines. struct axisT { int type; // -1 = min, 0 = given value, 1 = max, 2 = min/max int type2; // for 3D axis real value; real value2; pair side; // 2D tick label direction relative to path (left or right) real position; // label position along axis align align; // default axis label alignment and 3D tick label direction int[] xdivisor; int[] ydivisor; int[] zdivisor; bool extend; // extend axis to graph boundary? }; axisT axis; typedef void axis(picture, axisT); axis Bottom(bool extend=false) { return new void(picture pic, axisT axis) { axis.type=Min; axis.position=0.5; axis.side=right; axis.align=S; axis.extend=extend; }; } axis Top(bool extend=false) { return new void(picture pic, axisT axis) { axis.type=Max; axis.position=0.5; axis.side=left; axis.align=N; axis.extend=extend; }; } axis BottomTop(bool extend=false) { return new void(picture pic, axisT axis) { axis.type=Both; axis.position=0.5; axis.side=right; axis.align=S; axis.extend=extend; }; } axis Left(bool extend=false) { return new void(picture pic, axisT axis) { axis.type=Min; axis.position=0.5; axis.side=left; axis.align=W; axis.extend=extend; }; } axis Right(bool extend=false) { return new void(picture pic, axisT axis) { axis.type=Max; axis.position=0.5; axis.side=right; axis.align=E; axis.extend=extend; }; } axis LeftRight(bool extend=false) { return new void(picture pic, axisT axis) { axis.type=Both; axis.position=0.5; axis.side=left; axis.align=W; axis.extend=extend; }; } axis XEquals(real x, bool extend=true) { return new void(picture pic, axisT axis) { axis.type=Value; axis.value=pic.scale.x.T(x); axis.position=1; axis.side=left; axis.align=W; axis.extend=extend; }; } axis YEquals(real y, bool extend=true) { return new void(picture pic, axisT axis) { axis.type=Value; axis.value=pic.scale.y.T(y); axis.position=1; axis.side=right; axis.align=S; axis.extend=extend; }; } axis XZero(bool extend=true) { return new void(picture pic, axisT axis) { axis.type=Value; axis.value=pic.scale.x.T(pic.scale.x.scale.logarithmic ? 1 : 0); axis.position=1; axis.side=left; axis.align=W; axis.extend=extend; }; } axis YZero(bool extend=true) { return new void(picture pic, axisT axis) { axis.type=Value; axis.value=pic.scale.y.T(pic.scale.y.scale.logarithmic ? 1 : 0); axis.position=1; axis.side=right; axis.align=S; axis.extend=extend; }; } axis Bottom=Bottom(), Top=Top(), BottomTop=BottomTop(), Left=Left(), Right=Right(), LeftRight=LeftRight(), XZero=XZero(), YZero=YZero(); // Draw a general axis. void axis(picture pic=currentpicture, Label L="", path g, path g2=nullpath, pen p=currentpen, ticks ticks, ticklocate locate, arrowbar arrow=None, margin margin=NoMargin, int[] divisor=new int[], bool above=false, bool opposite=false) { Label L=L.copy(); real t=reltime(g,0.5); if(L.defaultposition) L.position(t); divisor=copy(divisor); locate=locate.copy(); pic.add(new void (frame f, transform t, transform T, pair lb, pair rt) { frame d; ticks(d,t,L,0,g,g2,p,arrow,margin,locate,divisor,opposite); (above ? add : prepend)(f,t*T*inverse(t)*d); }); pic.addPath(g,p); if(L.s != "") { frame f; Label L0=L.copy(); L0.position(0); add(f,L0); pair pos=point(g,L.relative()*length(g)); pic.addBox(pos,pos,min(f),max(f)); } } real xtrans(transform t, real x) { return (t*(x,0)).x; } real ytrans(transform t, real y) { return (t*(0,y)).y; } // An internal routine to draw an x axis at a particular y value. void xaxisAt(picture pic=currentpicture, Label L="", axis axis, real xmin=-infinity, real xmax=infinity, pen p=currentpen, ticks ticks=NoTicks, arrowbar arrow=None, margin margin=NoMargin, bool above=true, bool opposite=false) { real y=axis.value; real y2; Label L=L.copy(); int[] divisor=copy(axis.xdivisor); pair side=axis.side; int type=axis.type; pic.add(new void (frame f, transform t, transform T, pair lb, pair rt) { transform tinv=inverse(t); pair a=xmin == -infinity ? tinv*(lb.x-min(p).x,ytrans(t,y)) : (xmin,y); pair b=xmax == infinity ? tinv*(rt.x-max(p).x,ytrans(t,y)) : (xmax,y); pair a2=xmin == -infinity ? tinv*(lb.x-min(p).x,ytrans(t,y2)) : (xmin,y2); pair b2=xmax == infinity ? tinv*(rt.x-max(p).x,ytrans(t,y2)) : (xmax,y2); if(xmin == -infinity || xmax == infinity) { bounds mx=autoscale(a.x,b.x,pic.scale.x.scale); pic.scale.x.tickMin=mx.min; pic.scale.x.tickMax=mx.max; divisor=mx.divisor; } real fuzz=epsilon*max(abs(a.x),abs(b.x)); a -= (fuzz,0); b += (fuzz,0); frame d; ticks(d,t,L,side,a--b,finite(y2) ? a2--b2 : nullpath,p,arrow,margin, ticklocate(a.x,b.x,pic.scale.x),divisor,opposite); (above ? add : prepend)(f,t*T*tinv*d); }); void bounds() { if(type == Both) { y2=pic.scale.y.automax() ? tickMax(pic).y : pic.userMax().y; y=opposite ? y2 : (pic.scale.y.automin() ? tickMin(pic).y : pic.userMin().y); } else if(type == Min) y=pic.scale.y.automin() ? tickMin(pic).y : pic.userMin().y; else if(type == Max) y=pic.scale.y.automax() ? tickMax(pic).y : pic.userMax().y; real Xmin=finite(xmin) ? xmin : pic.userMin().x; real Xmax=finite(xmax) ? xmax : pic.userMax().x; pair a=(Xmin,y); pair b=(Xmax,y); pair a2=(Xmin,y2); pair b2=(Xmax,y2); if(finite(a)) { pic.addPoint(a,min(p)); pic.addPoint(a,max(p)); } if(finite(b)) { pic.addPoint(b,min(p)); pic.addPoint(b,max(p)); } if(finite(a) && finite(b)) { frame d; ticks(d,pic.scaling(warn=false),L,side, (a.x,0)--(b.x,0),(a2.x,0)--(b2.x,0),p,arrow,margin, ticklocate(a.x,b.x,pic.scale.x),divisor,opposite); frame f; if(L.s != "") { Label L0=L.copy(); L0.position(0); add(f,L0); } pair pos=a+L.relative()*(b-a); pic.addBox(pos,pos,(min(f).x,min(d).y),(max(f).x,max(d).y)); } } // Process any queued y axis bound calculation requests. for(int i=0; i < pic.scale.y.bound.length; ++i) pic.scale.y.bound[i](); pic.scale.y.bound.delete(); bounds(); // Request another x bounds calculation before final picture scaling. pic.scale.x.bound.push(bounds); } // An internal routine to draw a y axis at a particular x value. void yaxisAt(picture pic=currentpicture, Label L="", axis axis, real ymin=-infinity, real ymax=infinity, pen p=currentpen, ticks ticks=NoTicks, arrowbar arrow=None, margin margin=NoMargin, bool above=true, bool opposite=false) { real x=axis.value; real x2; Label L=L.copy(); int[] divisor=copy(axis.ydivisor); pair side=axis.side; int type=axis.type; pic.add(new void (frame f, transform t, transform T, pair lb, pair rt) { transform tinv=inverse(t); pair a=ymin == -infinity ? tinv*(xtrans(t,x),lb.y-min(p).y) : (x,ymin); pair b=ymax == infinity ? tinv*(xtrans(t,x),rt.y-max(p).y) : (x,ymax); pair a2=ymin == -infinity ? tinv*(xtrans(t,x2),lb.y-min(p).y) : (x2,ymin); pair b2=ymax == infinity ? tinv*(xtrans(t,x2),rt.y-max(p).y) : (x2,ymax); if(ymin == -infinity || ymax == infinity) { bounds my=autoscale(a.y,b.y,pic.scale.y.scale); pic.scale.y.tickMin=my.min; pic.scale.y.tickMax=my.max; divisor=my.divisor; } real fuzz=epsilon*max(abs(a.y),abs(b.y)); a -= (0,fuzz); b += (0,fuzz); frame d; ticks(d,t,L,side,a--b,finite(x2) ? a2--b2 : nullpath,p,arrow,margin, ticklocate(a.y,b.y,pic.scale.y),divisor,opposite); (above ? add : prepend)(f,t*T*tinv*d); }); void bounds() { if(type == Both) { x2=pic.scale.x.automax() ? tickMax(pic).x : pic.userMax().x; x=opposite ? x2 : (pic.scale.x.automin() ? tickMin(pic).x : pic.userMin().x); } else if(type == Min) x=pic.scale.x.automin() ? tickMin(pic).x : pic.userMin().x; else if(type == Max) x=pic.scale.x.automax() ? tickMax(pic).x : pic.userMax().x; real Ymin=finite(ymin) ? ymin : pic.userMin().y; real Ymax=finite(ymax) ? ymax : pic.userMax().y; pair a=(x,Ymin); pair b=(x,Ymax); pair a2=(x2,Ymin); pair b2=(x2,Ymax); if(finite(a)) { pic.addPoint(a,min(p)); pic.addPoint(a,max(p)); } if(finite(b)) { pic.addPoint(b,min(p)); pic.addPoint(b,max(p)); } if(finite(a) && finite(b)) { frame d; ticks(d,pic.scaling(warn=false),L,side, (0,a.y)--(0,b.y),(0,a2.y)--(0,b2.y),p,arrow,margin, ticklocate(a.y,b.y,pic.scale.y),divisor,opposite); frame f; if(L.s != "") { Label L0=L.copy(); L0.position(0); add(f,L0); } pair pos=a+L.relative()*(b-a); pic.addBox(pos,pos,(min(d).x,min(f).y),(max(d).x,max(f).y)); } } // Process any queued x axis bound calculation requests. for(int i=0; i < pic.scale.x.bound.length; ++i) pic.scale.x.bound[i](); pic.scale.x.bound.delete(); bounds(); // Request another y bounds calculation before final picture scaling. pic.scale.y.bound.push(bounds); } // Set the x limits of a picture. void xlimits(picture pic=currentpicture, real min=-infinity, real max=infinity, bool crop=NoCrop) { if(min > max) return; pic.scale.x.automin=min <= -infinity; pic.scale.x.automax=max >= infinity; bounds mx; if(pic.scale.x.automin() || pic.scale.x.automax()) mx=autoscale(pic.userMin().x,pic.userMax().x,pic.scale.x.scale); if(pic.scale.x.automin) { if(pic.scale.x.automin()) pic.userMinx(mx.min); } else pic.userMinx(min(pic.scale.x.T(min),pic.scale.x.T(max))); if(pic.scale.x.automax) { if(pic.scale.x.automax()) pic.userMaxx(mx.max); } else pic.userMaxx(max(pic.scale.x.T(min),pic.scale.x.T(max))); if(crop) { pair userMin=pic.userMin(); pair userMax=pic.userMax(); pic.bounds.xclip(userMin.x,userMax.x); pic.clip(userMin, userMax, new void (frame f, transform t, transform T, pair, pair) { frame Tinvf=T == identity() ? f : t*inverse(T)*inverse(t)*f; clip(f,T*box(((t*userMin).x,(min(Tinvf)).y), ((t*userMax).x,(max(Tinvf)).y))); }); } } // Set the y limits of a picture. void ylimits(picture pic=currentpicture, real min=-infinity, real max=infinity, bool crop=NoCrop) { if(min > max) return; pic.scale.y.automin=min <= -infinity; pic.scale.y.automax=max >= infinity; bounds my; if(pic.scale.y.automin() || pic.scale.y.automax()) my=autoscale(pic.userMin().y,pic.userMax().y,pic.scale.y.scale); if(pic.scale.y.automin) { if(pic.scale.y.automin()) pic.userMiny(my.min); } else pic.userMiny(min(pic.scale.y.T(min),pic.scale.y.T(max))); if(pic.scale.y.automax) { if(pic.scale.y.automax()) pic.userMaxy(my.max); } else pic.userMaxy(max(pic.scale.y.T(min),pic.scale.y.T(max))); if(crop) { pair userMin=pic.userMin(); pair userMax=pic.userMax(); pic.bounds.yclip(userMin.y,userMax.y); pic.clip(userMin, userMax, new void (frame f, transform t, transform T, pair, pair) { frame Tinvf=T == identity() ? f : t*inverse(T)*inverse(t)*f; clip(f,T*box(((min(Tinvf)).x,(t*userMin).y), ((max(Tinvf)).x,(t*userMax).y))); }); } } // Crop a picture to the current user-space picture limits. void crop(picture pic=currentpicture) { xlimits(pic,false); ylimits(pic,false); if(pic.userSetx() && pic.userSety()) clip(pic,box(pic.userMin(),pic.userMax())); } // Restrict the x and y limits to box(min,max). void limits(picture pic=currentpicture, pair min, pair max, bool crop=NoCrop) { xlimits(pic,min.x,max.x); ylimits(pic,min.y,max.y); if(crop && pic.userSetx() && pic.userSety()) clip(pic,box(pic.userMin(),pic.userMax())); } // Internal routine to autoscale the user limits of a picture. void autoscale(picture pic=currentpicture, axis axis) { if(!pic.scale.set) { bounds mx,my; pic.scale.set=true; if(pic.userSetx()) { mx=autoscale(pic.userMin().x,pic.userMax().x,pic.scale.x.scale); if(pic.scale.x.scale.logarithmic && floor(pic.userMin().x) == floor(pic.userMax().x)) { if(pic.scale.x.automin()) pic.userMinx2(floor(pic.userMin().x)); if(pic.scale.x.automax()) pic.userMaxx2(ceil(pic.userMax().x)); } } else {mx.min=mx.max=0; pic.scale.set=false;} if(pic.userSety()) { my=autoscale(pic.userMin().y,pic.userMax().y,pic.scale.y.scale); if(pic.scale.y.scale.logarithmic && floor(pic.userMin().y) == floor(pic.userMax().y)) { if(pic.scale.y.automin()) pic.userMiny2(floor(pic.userMin().y)); if(pic.scale.y.automax()) pic.userMaxy2(ceil(pic.userMax().y)); } } else {my.min=my.max=0; pic.scale.set=false;} pic.scale.x.tickMin=mx.min; pic.scale.x.tickMax=mx.max; pic.scale.y.tickMin=my.min; pic.scale.y.tickMax=my.max; axis.xdivisor=mx.divisor; axis.ydivisor=my.divisor; } } // Draw an x axis. void xaxis(picture pic=currentpicture, Label L="", axis axis=YZero, real xmin=-infinity, real xmax=infinity, pen p=currentpen, ticks ticks=NoTicks, arrowbar arrow=None, margin margin=NoMargin, bool above=false) { if(xmin > xmax) return; if(pic.scale.x.automin && xmin > -infinity) pic.scale.x.automin=false; if(pic.scale.x.automax && xmax < infinity) pic.scale.x.automax=false; if(!pic.scale.set) { axis(pic,axis); autoscale(pic,axis); } Label L=L.copy(); bool newticks=false; if(xmin != -infinity) { xmin=pic.scale.x.T(xmin); newticks=true; } if(xmax != infinity) { xmax=pic.scale.x.T(xmax); newticks=true; } if(newticks && pic.userSetx() && ticks != NoTicks) { if(xmin == -infinity) xmin=pic.userMin().x; if(xmax == infinity) xmax=pic.userMax().x; bounds mx=autoscale(xmin,xmax,pic.scale.x.scale); pic.scale.x.tickMin=mx.min; pic.scale.x.tickMax=mx.max; axis.xdivisor=mx.divisor; } axis(pic,axis); if(xmin == -infinity && !axis.extend) { if(pic.scale.set) xmin=pic.scale.x.automin() ? pic.scale.x.tickMin : max(pic.scale.x.tickMin,pic.userMin().x); else xmin=pic.userMin().x; } if(xmax == infinity && !axis.extend) { if(pic.scale.set) xmax=pic.scale.x.automax() ? pic.scale.x.tickMax : min(pic.scale.x.tickMax,pic.userMax().x); else xmax=pic.userMax().x; } if(L.defaultposition) L.position(axis.position); L.align(L.align,axis.align); xaxisAt(pic,L,axis,xmin,xmax,p,ticks,arrow,margin,above); if(axis.type == Both) xaxisAt(pic,L,axis,xmin,xmax,p,ticks,arrow,margin,above,true); } // Draw a y axis. void yaxis(picture pic=currentpicture, Label L="", axis axis=XZero, real ymin=-infinity, real ymax=infinity, pen p=currentpen, ticks ticks=NoTicks, arrowbar arrow=None, margin margin=NoMargin, bool above=false, bool autorotate=true) { if(ymin > ymax) return; if(pic.scale.y.automin && ymin > -infinity) pic.scale.y.automin=false; if(pic.scale.y.automax && ymax < infinity) pic.scale.y.automax=false; if(!pic.scale.set) { axis(pic,axis); autoscale(pic,axis); } Label L=L.copy(); bool newticks=false; if(ymin != -infinity) { ymin=pic.scale.y.T(ymin); newticks=true; } if(ymax != infinity) { ymax=pic.scale.y.T(ymax); newticks=true; } if(newticks && pic.userSety() && ticks != NoTicks) { if(ymin == -infinity) ymin=pic.userMin().y; if(ymax == infinity) ymax=pic.userMax().y; bounds my=autoscale(ymin,ymax,pic.scale.y.scale); pic.scale.y.tickMin=my.min; pic.scale.y.tickMax=my.max; axis.ydivisor=my.divisor; } axis(pic,axis); if(ymin == -infinity && !axis.extend) { if(pic.scale.set) ymin=pic.scale.y.automin() ? pic.scale.y.tickMin : max(pic.scale.y.tickMin,pic.userMin().y); else ymin=pic.userMin().y; } if(ymax == infinity && !axis.extend) { if(pic.scale.set) ymax=pic.scale.y.automax() ? pic.scale.y.tickMax : min(pic.scale.y.tickMax,pic.userMax().y); else ymax=pic.userMax().y; } if(L.defaultposition) L.position(axis.position); L.align(L.align,axis.align); if(autorotate && L.defaulttransform) { frame f; add(f,Label(L.s,(0,0),L.p)); if(length(max(f)-min(f)) > ylabelwidth*fontsize(L.p)) L.transform(rotate(90)); } yaxisAt(pic,L,axis,ymin,ymax,p,ticks,arrow,margin,above); if(axis.type == Both) yaxisAt(pic,L,axis,ymin,ymax,p,ticks,arrow,margin,above,true); } // Draw x and y axes. void axes(picture pic=currentpicture, Label xlabel="", Label ylabel="", bool extend=true, pair min=(-infinity,-infinity), pair max=(infinity,infinity), pen p=currentpen, arrowbar arrow=None, margin margin=NoMargin, bool above=false) { xaxis(pic,xlabel,YZero(extend),min.x,max.x,p,arrow,margin,above); yaxis(pic,ylabel,XZero(extend),min.y,max.y,p,arrow,margin,above); } // Draw a yaxis at x. void xequals(picture pic=currentpicture, Label L="", real x, bool extend=false, real ymin=-infinity, real ymax=infinity, pen p=currentpen, ticks ticks=NoTicks, arrowbar arrow=None, margin margin=NoMargin, bool above=true) { yaxis(pic,L,XEquals(x,extend),ymin,ymax,p,ticks,arrow,margin,above); } // Draw an xaxis at y. void yequals(picture pic=currentpicture, Label L="", real y, bool extend=false, real xmin=-infinity, real xmax=infinity, pen p=currentpen, ticks ticks=NoTicks, arrowbar arrow=None, margin margin=NoMargin, bool above=true) { xaxis(pic,L,YEquals(y,extend),xmin,xmax,p,ticks,arrow,margin,above); } pair Scale(picture pic=currentpicture, pair z) { return (pic.scale.x.T(z.x),pic.scale.y.T(z.y)); } real ScaleX(picture pic=currentpicture, real x) { return pic.scale.x.T(x); } real ScaleY(picture pic=currentpicture, real y) { return pic.scale.y.T(y); } // Draw a tick of length size at pair z in direction dir using pen p. void tick(picture pic=currentpicture, pair z, pair dir, real size=Ticksize, pen p=currentpen) { pair z=Scale(pic,z); pic.add(new void (frame f, transform t) { pair tz=t*z; draw(f,tz--tz+unit(dir)*size,p); }); pic.addPoint(z,p); pic.addPoint(z,unit(dir)*size,p); } void xtick(picture pic=currentpicture, explicit pair z, pair dir=N, real size=Ticksize, pen p=currentpen) { tick(pic,z,dir,size,p); } void xtick(picture pic=currentpicture, real x, pair dir=N, real size=Ticksize, pen p=currentpen) { tick(pic,(x,pic.scale.y.scale.logarithmic ? 1 : 0),dir,size,p); } void ytick(picture pic=currentpicture, explicit pair z, pair dir=E, real size=Ticksize, pen p=currentpen) { tick(pic,z,dir,size,p); } void ytick(picture pic=currentpicture, real y, pair dir=E, real size=Ticksize, pen p=currentpen) { tick(pic,(pic.scale.x.scale.logarithmic ? 1 : 0,y),dir,size,p); } void tick(picture pic=currentpicture, Label L, real value, explicit pair z, pair dir, string format="", real size=Ticksize, pen p=currentpen) { Label L=L.copy(); L.position(Scale(pic,z)); L.align(L.align,-dir); if(shift(L.T)*0 == 0) L.T=shift(dot(dir,L.align.dir) > 0 ? dir*size : ticklabelshift(L.align.dir,p))*L.T; L.p(p); if(L.s == "") L.s=format(format == "" ? defaultformat : format,value); L.s=baseline(L.s,baselinetemplate); add(pic,L); tick(pic,z,dir,size,p); } void xtick(picture pic=currentpicture, Label L, explicit pair z, pair dir=N, string format="", real size=Ticksize, pen p=currentpen) { tick(pic,L,z.x,z,dir,format,size,p); } void xtick(picture pic=currentpicture, Label L, real x, pair dir=N, string format="", real size=Ticksize, pen p=currentpen) { xtick(pic,L,(x,pic.scale.y.scale.logarithmic ? 1 : 0),dir,size,p); } void ytick(picture pic=currentpicture, Label L, explicit pair z, pair dir=E, string format="", real size=Ticksize, pen p=currentpen) { tick(pic,L,z.y,z,dir,format,size,p); } void ytick(picture pic=currentpicture, Label L, real y, pair dir=E, string format="", real size=Ticksize, pen p=currentpen) { xtick(pic,L,(pic.scale.x.scale.logarithmic ? 1 : 0,y),dir,format,size,p); } private void label(picture pic, Label L, pair z, real x, align align, string format, pen p) { Label L=L.copy(); L.position(z); L.align(align); L.p(p); if(shift(L.T)*0 == 0) L.T=shift(ticklabelshift(L.align.dir,L.p))*L.T; if(L.s == "") L.s=format(format == "" ? defaultformat : format,x); L.s=baseline(L.s,baselinetemplate); add(pic,L); } // Put a label on the x axis. void labelx(picture pic=currentpicture, Label L="", explicit pair z, align align=S, string format="", pen p=currentpen) { label(pic,L,Scale(pic,z),z.x,align,format,p); } void labelx(picture pic=currentpicture, Label L="", real x, align align=S, string format="", pen p=currentpen) { labelx(pic,L,(x,pic.scale.y.scale.logarithmic ? 1 : 0),align,format,p); } void labelx(picture pic=currentpicture, Label L, string format="", explicit pen p=currentpen) { labelx(pic,L,L.position.position,format,p); } // Put a label on the y axis. void labely(picture pic=currentpicture, Label L="", explicit pair z, align align=W, string format="", pen p=currentpen) { label(pic,L,Scale(pic,z),z.y,align,format,p); } void labely(picture pic=currentpicture, Label L="", real y, align align=W, string format="", pen p=currentpen) { labely(pic,L,(pic.scale.x.scale.logarithmic ? 1 : 0,y),align,format,p); } void labely(picture pic=currentpicture, Label L, string format="", explicit pen p=currentpen) { labely(pic,L,L.position.position,format,p); } private string noprimary="Primary axis must be drawn before secondary axis"; // Construct a secondary X axis picture secondaryX(picture primary=currentpicture, void f(picture)) { if(!primary.scale.set) abort(noprimary); picture pic; size(pic,primary); if(primary.userMax().x == primary.userMin().x) return pic; f(pic); if(!pic.userSetx()) return pic; bounds a=autoscale(pic.userMin().x,pic.userMax().x,pic.scale.x.scale); real bmin=pic.scale.x.automin() ? a.min : pic.userMin().x; real bmax=pic.scale.x.automax() ? a.max : pic.userMax().x; real denom=bmax-bmin; if(denom != 0) { pic.erase(); real m=(primary.userMax().x-primary.userMin().x)/denom; pic.scale.x.postscale=Linear(m,bmin-primary.userMin().x/m); pic.scale.set=true; pic.scale.x.tickMin=pic.scale.x.postscale.T(a.min); pic.scale.x.tickMax=pic.scale.x.postscale.T(a.max); pic.scale.y.tickMin=primary.userMin().y; pic.scale.y.tickMax=primary.userMax().y; axis.xdivisor=a.divisor; f(pic); } pic.userCopy(primary); return pic; } // Construct a secondary Y axis picture secondaryY(picture primary=currentpicture, void f(picture)) { if(!primary.scale.set) abort(noprimary); picture pic; size(pic,primary); if(primary.userMax().y == primary.userMin().y) return pic; f(pic); if(!pic.userSety()) return pic; bounds a=autoscale(pic.userMin().y,pic.userMax().y,pic.scale.y.scale); real bmin=pic.scale.y.automin() ? a.min : pic.userMin().y; real bmax=pic.scale.y.automax() ? a.max : pic.userMax().y; real denom=bmax-bmin; if(denom != 0) { pic.erase(); real m=(primary.userMax().y-primary.userMin().y)/denom; pic.scale.y.postscale=Linear(m,bmin-primary.userMin().y/m); pic.scale.set=true; pic.scale.x.tickMin=primary.userMin().x; pic.scale.x.tickMax=primary.userMax().x; pic.scale.y.tickMin=pic.scale.y.postscale.T(a.min); pic.scale.y.tickMax=pic.scale.y.postscale.T(a.max); axis.ydivisor=a.divisor; f(pic); } pic.userCopy(primary); return pic; } typedef guide graph(pair f(real), real, real, int); typedef guide[] multigraph(pair f(real), real, real, int); graph graph(interpolate join) { return new guide(pair f(real), real a, real b, int n) { real width=b-a; return n == 0 ? join(f(a)) : join(...sequence(new guide(int i) {return f(a+(i/n)*width);},n+1)); }; } multigraph graph(interpolate join, bool3 cond(real)) { return new guide[](pair f(real), real a, real b, int n) { real width=b-a; if(n == 0) return new guide[] {join(cond(a) ? f(a) : nullpath)}; guide[] G; guide[] g; for(int i=0; i < n+1; ++i) { real t=a+(i/n)*width; bool3 b=cond(t); if(b) g.push(f(t)); else { if(g.length > 0) { G.push(join(...g)); g=new guide[] {}; } if(b == default) g.push(f(t)); } } if(g.length > 0) G.push(join(...g)); return G; }; } guide Straight(... guide[])=operator --; guide Spline(... guide[])=operator ..; interpolate Hermite(splinetype splinetype) { return new guide(... guide[] a) { int n=a.length; if(n == 0) return nullpath; real[] x,y; guide G; for(int i=0; i < n; ++i) { guide g=a[i]; int m=size(g); if(m == 0) continue; pair z=point(g,0); x.push(z.x); y.push(z.y); if(m > 1) { G=G..hermite(x,y,splinetype) & g; pair z=point(g,m); x=new real[] {z.x}; y=new real[] {z.y}; } } return G & hermite(x,y,splinetype); }; } interpolate Hermite=Hermite(Spline); guide graph(picture pic=currentpicture, real f(real), real a, real b, int n=ngraph, real T(real)=identity, interpolate join=operator --) { if(T == identity) return graph(join)(new pair(real x) { return (x,pic.scale.y.T(f(pic.scale.x.Tinv(x))));}, pic.scale.x.T(a),pic.scale.x.T(b),n); else return graph(join)(new pair(real x) { return Scale(pic,(T(x),f(T(x))));}, a,b,n); } guide[] graph(picture pic=currentpicture, real f(real), real a, real b, int n=ngraph, real T(real)=identity, bool3 cond(real), interpolate join=operator --) { if(T == identity) return graph(join,cond)(new pair(real x) { return (x,pic.scale.y.T(f(pic.scale.x.Tinv(x))));}, pic.scale.x.T(a),pic.scale.x.T(b),n); else return graph(join,cond)(new pair(real x) { return Scale(pic,(T(x),f(T(x))));}, a,b,n); } guide graph(picture pic=currentpicture, real x(real), real y(real), real a, real b, int n=ngraph, real T(real)=identity, interpolate join=operator --) { if(T == identity) return graph(join)(new pair(real t) {return Scale(pic,(x(t),y(t)));},a,b,n); else return graph(join)(new pair(real t) { return Scale(pic,(x(T(t)),y(T(t)))); },a,b,n); } guide[] graph(picture pic=currentpicture, real x(real), real y(real), real a, real b, int n=ngraph, real T(real)=identity, bool3 cond(real), interpolate join=operator --) { if(T == identity) return graph(join,cond)(new pair(real t) {return Scale(pic,(x(t),y(t)));}, a,b,n); else return graph(join,cond)(new pair(real t) { return Scale(pic,(x(T(t)),y(T(t))));}, a,b,n); } guide graph(picture pic=currentpicture, pair z(real), real a, real b, int n=ngraph, real T(real)=identity, interpolate join=operator --) { if(T == identity) return graph(join)(new pair(real t) {return Scale(pic,z(t));},a,b,n); else return graph(join)(new pair(real t) { return Scale(pic,z(T(t))); },a,b,n); } guide[] graph(picture pic=currentpicture, pair z(real), real a, real b, int n=ngraph, real T(real)=identity, bool3 cond(real), interpolate join=operator --) { if(T == identity) return graph(join,cond)(new pair(real t) {return Scale(pic,z(t));},a,b,n); else return graph(join,cond)(new pair(real t) { return Scale(pic,z(T(t))); },a,b,n); } string conditionlength="condition array has different length than data"; void checkconditionlength(int x, int y) { checklengths(x,y,conditionlength); } guide graph(picture pic=currentpicture, pair[] z, interpolate join=operator --) { int i=0; return graph(join)(new pair(real) { pair w=Scale(pic,z[i]); ++i; return w; },0,0,z.length-1); } guide[] graph(picture pic=currentpicture, pair[] z, bool3[] cond, interpolate join=operator --) { int n=z.length; int i=0; pair w; checkconditionlength(cond.length,n); bool3 condition(real) { bool3 b=cond[i]; if(b != false) w=Scale(pic,z[i]); ++i; return b; } return graph(join,condition)(new pair(real) {return w;},0,0,n-1); } guide graph(picture pic=currentpicture, real[] x, real[] y, interpolate join=operator --) { int n=x.length; checklengths(n,y.length); int i=0; return graph(join)(new pair(real) { pair w=Scale(pic,(x[i],y[i])); ++i; return w; },0,0,n-1); } guide[] graph(picture pic=currentpicture, real[] x, real[] y, bool3[] cond, interpolate join=operator --) { int n=x.length; checklengths(n,y.length); int i=0; pair w; checkconditionlength(cond.length,n); bool3 condition(real) { bool3 b=cond[i]; if(b != false) w=Scale(pic,(x[i],y[i])); ++i; return b; } return graph(join,condition)(new pair(real) {return w;},0,0,n-1); } // Connect points in z into segments corresponding to consecutive true elements // of b using interpolation operator join. path[] segment(pair[] z, bool[] cond, interpolate join=operator --) { checkconditionlength(cond.length,z.length); int[][] segment=segment(cond); return sequence(new path(int i) {return join(...z[segment[i]]);}, segment.length); } pair polar(real r, real theta) { return r*expi(theta); } guide polargraph(picture pic=currentpicture, real r(real), real a, real b, int n=ngraph, interpolate join=operator --) { return graph(join)(new pair(real theta) { return Scale(pic,polar(r(theta),theta)); },a,b,n); } guide polargraph(picture pic=currentpicture, real[] r, real[] theta, interpolate join=operator--) { int n=r.length; checklengths(n,theta.length); int i=0; return graph(join)(new pair(real) { pair w=Scale(pic,polar(r[i],theta[i])); ++i; return w; },0,0,n-1); } // Graph a parametric function with the control points specified to match the // derivative. guide graphwithderiv(pair f(real), pair fprime(real), real a, real b, int n=ngraph # 10) { guide toreturn; real segmentlen = (b - a) / n; pair[] points = new pair[n+1]; pair[] derivs = new pair[n+1]; real derivfactor = segmentlen / 3; for (int i = 0; i <= n; ++i) { real t = interp(a, b, i/n); points[i] = f(t); derivs[i] = fprime(t) * derivfactor; } toreturn = points[0]; for (int i = 1; i <= n; ++i) { toreturn = toreturn .. controls (points[i-1] + derivs[i-1]) and (points[i] - derivs[i]) .. points[i]; } return toreturn; } void errorbar(picture pic, pair z, pair dp, pair dm, pen p=currentpen, real size=0) { real dmx=-abs(dm.x); real dmy=-abs(dm.y); real dpx=abs(dp.x); real dpy=abs(dp.y); if(dmx != dpx) draw(pic,Scale(pic,z+(dmx,0))--Scale(pic,z+(dpx,0)),p, Bars(size)); if(dmy != dpy) draw(pic,Scale(pic,z+(0,dmy))--Scale(pic,z+(0,dpy)),p, Bars(size)); } void errorbars(picture pic=currentpicture, pair[] z, pair[] dp, pair[] dm={}, bool[] cond={}, pen p=currentpen, real size=0) { if(dm.length == 0) dm=dp; int n=z.length; checklengths(n,dm.length); checklengths(n,dp.length); bool all=cond.length == 0; if(!all) checkconditionlength(cond.length,n); for(int i=0; i < n; ++i) { if(all || cond[i]) errorbar(pic,z[i],dp[i],dm[i],p,size); } } void errorbars(picture pic=currentpicture, real[] x, real[] y, real[] dpx, real[] dpy, real[] dmx={}, real[] dmy={}, bool[] cond={}, pen p=currentpen, real size=0) { if(dmx.length == 0) dmx=dpx; if(dmy.length == 0) dmy=dpy; int n=x.length; checklengths(n,y.length); checklengths(n,dpx.length); checklengths(n,dpy.length); checklengths(n,dmx.length); checklengths(n,dmy.length); bool all=cond.length == 0; if(!all) checkconditionlength(cond.length,n); for(int i=0; i < n; ++i) { if(all || cond[i]) errorbar(pic,(x[i],y[i]),(dpx[i],dpy[i]),(dmx[i],dmy[i]),p,size); } } void errorbars(picture pic=currentpicture, real[] x, real[] y, real[] dpy, bool[] cond={}, pen p=currentpen, real size=0) { errorbars(pic,x,y,0*x,dpy,cond,p,size); } // Return a vector field on path g, specifying the vector as a function of the // relative position along path g in [0,1]. picture vectorfield(path vector(real), path g, int n, bool truesize=false, pen p=currentpen, arrowbar arrow=Arrow, margin margin=PenMargin) { picture pic; for(int i=0; i < n; ++i) { real x=(n == 1) ? 0.5 : i/(n-1); if(truesize) draw(relpoint(g,x),pic,vector(x),p,arrow); else draw(pic,shift(relpoint(g,x))*vector(x),p,arrow,margin); } return pic; } // return a vector field over box(a,b). picture vectorfield(path vector(pair), pair a, pair b, int nx=nmesh, int ny=nx, bool truesize=false, bool cond(pair z)=null, pen p=currentpen, arrowbar arrow=Arrow, margin margin=PenMargin) { picture pic; real dx=(b.x-a.x)/(nx-1); real dy=(b.y-a.y)/(ny-1); bool all=cond == null; real scale; transform t=scale(dx,dy); pair size(pair z) { path g=t*vector(z); int n=size(g); pair w=n == 1 ? point(g,0) : point(g,n-1)-point(g,0); return (abs(w.x),abs(w.y)); } pair max=size(a); for(int i=0; i < nx; ++i) { real x=a.x+i*dx; for(int j=0; j < ny; ++j) { real y=a.y+j*dy; max=maxbound(max,size((x,y))); } } if(max.x == 0) scale=max.y == 0 ? 1.0 : dy/max.y; else if(max.y == 0) scale=dx/max.x; else scale=min(dx/max.x,dy/max.y); for(int i=0; i < nx; ++i) { real x=a.x+i*dx; for(int j=0; j < ny; ++j) { real y=a.y+j*dy; pair z=(x,y); if(all || cond(z)) { path v=scale(scale)*t*vector(z); path g=size(v) == 1 ? (0,0)--v : v; if(truesize) draw(z,pic,g,p,arrow); else draw(pic,shift(z)*g,p,arrow,margin); } } } return pic; } // True arc path Arc(pair c, real r, real angle1, real angle2, bool direction, int n=nCircle) { angle1=radians(angle1); angle2=radians(angle2); if(direction) { if(angle1 >= angle2) angle1 -= 2pi; } else if(angle2 >= angle1) angle2 -= 2pi; return shift(c)*polargraph(new real(real t){return r;},angle1,angle2,n, operator ..); } path Arc(pair c, real r, real angle1, real angle2, int n=nCircle) { return Arc(c,r,angle1,angle2,angle2 >= angle1 ? CCW : CW,n); } path Arc(pair c, explicit pair z1, explicit pair z2, bool direction=CCW, int n=nCircle) { return Arc(c,abs(z1-c),degrees(z1-c),degrees(z2-c),direction,n); } // True circle path Circle(pair c, real r, int n=nCircle) { return Arc(c,r,0,360,n)&cycle; } asymptote-3.05/base/tree.asy0000644000000000000000000000253715031566105014564 0ustar rootroot/***** * treedef.asy * Andy Hammerlindl 2003/10/25 * * Implements a dynamic binary search tree. *****/ struct tree { tree left; tree right; int key = 0; int value = 0; } tree newtree() { return null; } tree add(tree t, int key, int value) { if (t == null) { tree tt; tt.key = key; tt.value = value; return tt; } else if (key == t.key) { return t; } else if (key < t.key) { tree tt; tt.left = add(t.left, key, value); tt.key = t.key; tt.value = t.value; tt.right = t.right; return tt; } else { tree tt; tt.left = t.left; tt.key = t.key; tt.value = t.value; tt.right = add(t.right, key, value); return tt; } } bool contains(tree t, int key) { if (t == null) return false; else if (key == t.key) return true; else if (key < t.key) return contains(t.left, key); else return contains(t.right, key); } int lookup(tree t, int key) { if (t == null) return 0; else if (key == t.key) return t.value; else if (key < t.key) return lookup(t.left, key); else return lookup(t.right, key); } void write(file out=stdout, tree t) { if (t != null) { if(t.left != null) { write(out,t.left); } write(out,t.key); write(out,"->"); write(out,t.value,endl); if (t.right != null) { write(out,t.right); } } } asymptote-3.05/base/simplex2.asy0000644000000000000000000001647315031566105015374 0ustar rootroot/***** * simplex.asy * Andy Hammerlindl 2004/07/27 * * Solves the two-variable linear programming problem using the simplex method. * This problem is specialized in that the second variable, "b", does not have * a non-negativity condition, and the first variable, "a", is the quantity * being maximized. * Correct execution of the algorithm also assumes that the coefficient of "b" * will be +1 or -1 in every added restriction, and that the problem can be * initialized to a valid state by pivoting b with one of the slack * variables. This assumption may in fact be incorrect. *****/ struct problem { typedef int var; static var VAR_A = 0; static var VAR_B = 1; static int OPTIMAL = -1; static var UNBOUNDED = -2; static int INVALID = -3; struct row { real c, t[]; } // The variables of the rows. // Initialized for the two variable problem. var[] v = {VAR_A, VAR_B}; // The rows of equalities. row rowA() { row r = new row; r.c = 0; r.t = new real[] {1, 0}; return r; } row rowB() { row r = new row; r.c = 0; r.t = new real[] {0, 1}; return r; } row[] rows = {rowA(), rowB()}; // The number of original variables. int n = rows.length; // Pivot the variable v[col] with vp. void pivot(int col, var vp) { var vc=v[col]; // Recalculate rows v[col] and vp for the pivot-swap. row rvc = rows[vc], rvp = rows[vp]; real factor=1/rvp.t[col]; // NOTE: Handle rvp.t[col] == 0 case. rvc.c=-rvp.c*factor; rvp.c=0; rvc.t=-rvp.t*factor; rvp.t *= 0; rvc.t[col]=factor; rvp.t[col]=1; var a=min(vc,vp); var b=max(vc,vp); // Recalculate the rows other than the two used for the above pivot. for (var i = 0; i < a; ++i) { row r=rows[i]; real m = r.t[col]; r.c += m*rvc.c; r.t += m*rvc.t; r.t[col]=m*factor; } for (var i = a+1; i < b; ++i) { row r=rows[i]; real m = r.t[col]; r.c += m*rvc.c; r.t += m*rvc.t; r.t[col]=m*factor; } for (var i = b+1; i < rows.length; ++i) { row r=rows[i]; real m = r.t[col]; r.c += m*rvc.c; r.t += m*rvc.t; r.t[col]=m*factor; } // Relabel the vars. v[col] = vp; } // As b does not have a non-negativity condition, it must initially be // pivoted out for a variable that does. This selects the initial // variable to pivot with b. It also assumes that there is a valid // solution with a == 0 to the linear programming problem, and if so, it // picks a pivot to get to that state. In our case, a == 0 corresponds to // a picture with the user coordinates shrunk down to zero, and if that // doesn't fit, nothing will. // // If b has a minimal value, choose a pivot that will give b its minimal // value. Otherwise, if b has maximal value, choose a pivot to give b its // maximal value. var initVar() { real min; var argmin; var i=2; for (; i < rows.length; ++i) { row r=rows[i]; if (r.t[VAR_B] > 0) { min=r.c/r.t[VAR_B]; argmin=i; break; } } for (; i < rows.length; ++i) { row r=rows[i]; if (r.t[VAR_B] > 0) { real val=r.c/r.t[VAR_B]; if (val < min) { min=val; argmin=i; } } } if(argmin != 0) return argmin; real max; var argmax; var i=2; for (; i < rows.length; ++i) { row r=rows[i]; if (r.t[VAR_B] < 0) { max=r.c/r.t[VAR_B]; argmax=i; break; } } for (; i < rows.length; ++i) { row r=rows[i]; if (r.t[VAR_B] < 0) { real val=r.c/r.t[VAR_B]; if (val > max) { max=val; argmax=i; } } } if(argmax != 0) return argmax; return UNBOUNDED; } // Initialize the linear program problem by moving into an acceptable state // this assumes that b is unrestrained and is the second variable. // NOTE: Works in limited cases, may be bug-ridden. void init() { // Find the lowest constant term in the equations. var lowest = 0; for (var i = 2; i < rows.length; ++i) { if (rows[i].c < rows[lowest].c) lowest = i; } // Pivot if necessary. if (lowest != 0) pivot(VAR_B, lowest); } // Selects a column to pivot on. Returns OPTIMAL if the current state is // optimal. Assumes we are optimizing the first row. int selectColumn() { int i=find(rows[0].t > 0,1); return (i >= 0) ? i : OPTIMAL; } // Select the new variable associated with a pivot on the column given. // Returns UNBOUNDED if the space is unbounded. var selectVar(int col) { // We assume that the first two vars (a and b) once swapped out, won't be // swapped back in. This finds the variable which gives the tightest // non-negativity condition restricting our optimization. This turns // out to be the max of c/t[col]. Note that as c is positive, and // t[col] is negative, all c/t[col] will be negative, so we are finding // the smallest in magnitude. var vp=UNBOUNDED; real max=0; int i=2; for (; i < rows.length; ++i) { row r=rows[i]; if(r.c < 0) r.c=0; // Fix any numerical precision error if(r.t[col] < 0) { max=r.c/r.t[col]; vp=i; break; } } for (; i < rows.length; ++i) { row r=rows[i]; if(r.c < 0) r.c=0; // Fix any numerical precision error if(r.c < max*r.t[col]) { max=r.c/r.t[col]; vp=i; } } return vp; } // Checks that the rows are in a valid state. bool valid() { // Checks that constants are valid. bool validConstants() { for (int i = 0; i < rows.length; ++i) // Do not test the row for b, as it does not have a non-negativity // condition. if (i != VAR_B && rows[i].c < 0) return false; return true; } // Check a variable to see if its row is simple. // NOTE: Simple rows could be optimized out, since they are not really // used. bool validVar(int col) { var vc = v[col]; row rvc = rows[vc]; if (rvc.c != 0) return false; for (int i = 0; i < n; ++i) if (rvc.t[i] != (i == col ? 1 : 0)) return false; return true; } if (!validConstants()) { return false; } for (int i = 0; i < n; ++i) if (!validVar(i)) { return false; } return true; } // Perform the algorithm to find the optimal solution. Returns OPTIMAL, // UNBOUNDED, or INVALID (if no solution is possible). int optimize() { // Put into a valid state to begin and pivot b out. var iv=initVar(); if (iv == UNBOUNDED) return iv; pivot(VAR_B, iv); if (!valid()) return INVALID; while(true) { int col = selectColumn(); if (col == OPTIMAL) return col; var vp = selectVar(col); if (vp == UNBOUNDED) return vp; pivot(col, vp); } // Shouldn't reach here. return INVALID; } // Add a restriction to the problem: // t1*a + t2*b + c >= 0 void addRestriction(real t1, real t2, real c) { row r = new row; r.c = c; r.t = new real[] {t1, t2}; rows.push(r); } // Return the value of a computed. real a() { return rows[VAR_A].c; } // Return the value of b computed. real b() { return rows[VAR_B].c; } } asymptote-3.05/base/graph3.asy0000644000000000000000000021310715031566105015006 0ustar rootroot// Three-dimensional graphing routines private import math; import graph; import three; typedef triple direction3(real); direction3 Dir(triple dir) {return new triple(real) {return dir;};} ticklocate ticklocate(real a, real b, autoscaleT S=defaultS, real tickmin=-infinity, real tickmax=infinity, real time(real)=null, direction3 dir) { if((valuetime) time == null) time=linear(S.T(),a,b); ticklocate locate; locate.a=a; locate.b=b; locate.S=S.copy(); if(finite(tickmin)) locate.S.tickMin=tickmin; if(finite(tickmax)) locate.S.tickMax=tickmax; locate.time=time; locate.dir=zero; locate.dir3=dir; return locate; } private struct locateT { real t; // tick location time triple V; // tick location in frame coordinates triple pathdir; // path direction in frame coordinates triple dir; // tick direction in frame coordinates void dir(transform3 T, path3 g, ticklocate locate, real t) { pathdir=unit(shiftless(T)*dir(g,t)); triple Dir=locate.dir3(t); dir=unit(Dir); } // Locate the desired position of a tick along a path. void calc(transform3 T, path3 g, ticklocate locate, real val) { t=locate.time(val); V=T*point(g,t); dir(T,g,locate,t); } } void drawtick(picture pic, transform3 T, path3 g, path3 g2, ticklocate locate, real val, real Size, int sign, pen p, bool extend) { locateT locate1,locate2; locate1.calc(T,g,locate,val); path3 G; if(extend && size(g2) > 0) { locate2.calc(T,g2,locate,val); G=locate1.V--locate2.V; } else G=(sign == 0) ? locate1.V-Size*locate1.dir--locate1.V+Size*locate1.dir : locate1.V--locate1.V+Size*sign*locate1.dir; draw(pic,G,p,name="tick"); } triple ticklabelshift(triple align, pen p=currentpen) { return 0.25*unit(align)*labelmargin(p); } // Signature of routines that draw labelled paths with ticks and tick labels. typedef void ticks3(picture, transform3, Label, path3, path3, pen, arrowbar3, margin3, ticklocate, int[], bool opposite=false, bool primary=true, projection P); // Label a tick on a frame. void labeltick(picture pic, transform3 T, path3 g, ticklocate locate, real val, int sign, real Size, ticklabel ticklabel, Label F, real norm=0) { locateT locate1; locate1.calc(T,g,locate,val); triple align=F.align.dir3; if(align == O) align=sign*locate1.dir; triple shift=align*labelmargin(F.p); if(dot(align,sign*locate1.dir) >= 0) shift=sign*(Size)*locate1.dir; real label; if(locate.S.scale.logarithmic) label=locate.S.scale.Tinv(val); else { label=val; if(abs(label) < zerotickfuzz*norm) label=0; // Fix epsilon errors at +/-1e-4 // default format changes to scientific notation here if(abs(abs(label)-1e-4) < epsilon) label=sgn(label)*1e-4; } string s=ticklabel(label); triple v=locate1.V+shift; if(s != "") label(pic,F.defaulttransform3 ? baseline(s,baselinetemplate) : F.T3*s,v, align,F.p); } // Add axis label L to frame f. void labelaxis(picture pic, transform3 T, Label L, path3 g, ticklocate locate=null, int sign=1, bool ticklabels=false) { triple m=pic.min(identity4); triple M=pic.max(identity4); triple align=L.align.dir3; Label L=L.copy(); pic.add(new void(frame f, transform3 T, picture pic2, projection P) { path3 g=T*g; real t=relative(L,g); triple v=point(g,t); picture F; if(L.align.dir3 == O) align=unit(invert(L.align.dir,v,P))*abs(L.align.dir); if(ticklabels && locate != null && piecewisestraight(g)) { locateT locate1; locate1.dir(T,g,locate,t); triple pathdir=locate1.pathdir; triple perp=cross(pathdir,P.normal); if(align == O) align=unit(sgn(dot(sign*locate1.dir,perp))*perp); path[] g=project(box(T*m,T*M),P); pair z=project(v,P); pair Ppathdir=project(v+pathdir,P)-z; pair Perp=unit(I*Ppathdir); real angle=degrees(Ppathdir,warn=false); transform S=rotate(-angle,z); path[] G=S*g; pair Palign=project(v+align,P)-z; pair Align=rotate(-angle)*dot(Palign,Perp)*Perp; pair offset=unit(Palign)* abs((Align.y >= 0 ? max(G).y : (Align.y < 0 ? min(G).y : 0))-z.y); triple normal=cross(pathdir,align); if(normal != O) v=invert(z+offset,normal,v,P); } label(F,L,v); add(f,F.fit3(identity4,pic2,P)); },exact=false); path3[] G=path3(texpath(L,bbox=true)); if(G.length > 0) { G=L.align.is3D ? align(G,O,align,L.p) : L.T3*G; triple v=point(g,relative(L,g)); pic.addBox(v,v,min(G),max(G)); } } // Tick construction routine for a user-specified array of tick values. ticks3 Ticks3(int sign, Label F="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, real[] Ticks=new real[], real[] ticks=new real[], int N=1, bool begin=true, bool end=true, real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return new void(picture pic, transform3 t, Label L, path3 g, path3 g2, pen p, arrowbar3 arrow, margin3 margin, ticklocate locate, int[] divisor, bool opposite, bool primary, projection P=currentprojection) { // Use local copy of context variables: int Sign=opposite ? -1 : 1; int sign=Sign*sign; pen pTick=pTick; pen ptick=ptick; ticklabel ticklabel=ticklabel; real Size=Size; real size=size; if(Size == 0) Size=Ticksize; if(size == 0) size=ticksize; Label L=L.copy(); Label F=F.copy(); L.p(p); F.p(p); if(pTick == nullpen) pTick=p; if(ptick == nullpen) ptick=pTick; bool ticklabels=false; path3 G=t*g; path3 G2=t*g2; scalefcn T; real a,b; if(locate.S.scale.logarithmic) { a=locate.S.postscale.Tinv(locate.a); b=locate.S.postscale.Tinv(locate.b); T=locate.S.scale.T; } else { a=locate.S.Tinv(locate.a); b=locate.S.Tinv(locate.b); T=identity; } if(a > b) {real temp=a; a=b; b=temp;} real norm=max(abs(a),abs(b)); string format=autoformat(F.s,norm...Ticks); if(F.s == "%") F.s=""; if(ticklabel == null) { if(locate.S.scale.logarithmic) { int base=round(locate.S.scale.Tinv(1)); ticklabel=format == "%" ? Format("") : DefaultLogFormat(base); } else ticklabel=Format(format); } bool labelaxis=L.s != "" && primary; begingroup3(pic,"axis"); if(primary) draw(pic,margin(G,p).g,p,arrow); else draw(pic,G,p); for(int i=(begin ? 0 : 1); i < (end ? Ticks.length : Ticks.length-1); ++i) { real val=T(Ticks[i]); if(val >= a && val <= b) drawtick(pic,t,g,g2,locate,val,Size,sign,pTick,extend); } for(int i=0; i < ticks.length; ++i) { real val=T(ticks[i]); if(val >= a && val <= b) drawtick(pic,t,g,g2,locate,val,size,sign,ptick,extend); } if(N == 0) N=1; if(Size > 0 && primary) { for(int i=(beginlabel ? 0 : 1); i < (endlabel ? Ticks.length : Ticks.length-1); i += N) { real val=T(Ticks[i]); if(val >= a && val <= b) { ticklabels=true; labeltick(pic,t,g,locate,val,Sign,Size,ticklabel,F,norm); } } } if(labelaxis) labelaxis(pic,t,L,G,locate,Sign,ticklabels); endgroup3(pic); }; } // Automatic tick construction routine. ticks3 Ticks3(int sign, Label F="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, tickmodifier modify=None, real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return new void(picture pic, transform3 T, Label L, path3 g, path3 g2, pen p, arrowbar3 arrow, margin3 margin=NoMargin3, ticklocate locate, int[] divisor, bool opposite, bool primary, projection P=currentprojection) { path3 G=T*g; real limit=Step == 0 ? axiscoverage*arclength(G) : 0; tickvalues values=modify(generateticks(sign,F,ticklabel,N,n,Step,step, Size,size,identity(),1, project(G,P), limit,p,locate,divisor, opposite)); Ticks3(sign,F,ticklabel,beginlabel,endlabel,values.major,values.minor, values.N,begin,end,Size,size,extend,pTick,ptick) (pic,T,L,g,g2,p,arrow,margin,locate,divisor,opposite,primary,P); }; } ticks3 NoTicks3() { return new void(picture pic, transform3 T, Label L, path3 g, path3, pen p, arrowbar3 arrow, margin3 margin, ticklocate, int[], bool opposite, bool primary, projection P=currentprojection) { path3 G=T*g; if(primary) draw(pic,margin(G,p).g,p,arrow,margin); else draw(pic,G,p); if(L.s != "" && primary) { Label L=L.copy(); L.p(p); labelaxis(pic,T,L,G,opposite ? -1 : 1); } }; } ticks3 InTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, tickmodifier modify=None, real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return Ticks3(-1,format,ticklabel,beginlabel,endlabel,N,n,Step,step, begin,end,modify,Size,size,extend,pTick,ptick); } ticks3 OutTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, tickmodifier modify=None, real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return Ticks3(1,format,ticklabel,beginlabel,endlabel,N,n,Step,step, begin,end,modify,Size,size,extend,pTick,ptick); } ticks3 InOutTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, tickmodifier modify=None, real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return Ticks3(0,format,ticklabel,beginlabel,endlabel,N,n,Step,step, begin,end,modify,Size,size,extend,pTick,ptick); } ticks3 InTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, real[] Ticks, real[] ticks=new real[], real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return Ticks3(-1,format,ticklabel,beginlabel,endlabel, Ticks,ticks,Size,size,extend,pTick,ptick); } ticks3 OutTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, real[] Ticks, real[] ticks=new real[], real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return Ticks3(1,format,ticklabel,beginlabel,endlabel, Ticks,ticks,Size,size,extend,pTick,ptick); } ticks3 InOutTicks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, real[] Ticks, real[] ticks=new real[], real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen) { return Ticks3(0,format,ticklabel,beginlabel,endlabel, Ticks,ticks,Size,size,extend,pTick,ptick); } ticks3 NoTicks3=NoTicks3(), InTicks=InTicks(), OutTicks=OutTicks(), InOutTicks=InOutTicks(); triple tickMin3(picture pic) { return minbound(pic.userMin(),(pic.scale.x.tickMin,pic.scale.y.tickMin, pic.scale.z.tickMin)); } triple tickMax3(picture pic) { return maxbound(pic.userMax(),(pic.scale.x.tickMax,pic.scale.y.tickMax, pic.scale.z.tickMax)); } axis Bounds(int type=Both, int type2=Both, triple align=O, bool extend=false) { return new void(picture pic, axisT axis) { axis.type=type; axis.type2=type2; axis.position=0.5; axis.align=align; axis.extend=extend; }; } axis YZEquals(real y, real z, triple align=O, bool extend=false) { return new void(picture pic, axisT axis) { axis.type=Value; axis.type2=Value; axis.value=pic.scale.y.T(y); axis.value2=pic.scale.z.T(z); axis.position=1; axis.align=align; axis.extend=extend; }; } axis XZEquals(real x, real z, triple align=O, bool extend=false) { return new void(picture pic, axisT axis) { axis.type=Value; axis.type2=Value; axis.value=pic.scale.x.T(x); axis.value2=pic.scale.z.T(z); axis.position=1; axis.align=align; axis.extend=extend; }; } axis XYEquals(real x, real y, triple align=O, bool extend=false) { return new void(picture pic, axisT axis) { axis.type=Value; axis.type2=Value; axis.value=pic.scale.x.T(x); axis.value2=pic.scale.y.T(y); axis.position=1; axis.align=align; axis.extend=extend; }; } axis YZZero(triple align=O, bool extend=false) { return new void(picture pic, axisT axis) { axis.type=Value; axis.type2=Value; axis.value=pic.scale.y.T(pic.scale.y.scale.logarithmic ? 1 : 0); axis.value2=pic.scale.z.T(pic.scale.z.scale.logarithmic ? 1 : 0); axis.position=1; axis.align=align; axis.extend=extend; }; } axis XZZero(triple align=O, bool extend=false) { return new void(picture pic, axisT axis) { axis.type=Value; axis.type2=Value; axis.value=pic.scale.x.T(pic.scale.x.scale.logarithmic ? 1 : 0); axis.value2=pic.scale.z.T(pic.scale.z.scale.logarithmic ? 1 : 0); axis.position=1; axis.align=align; axis.extend=extend; }; } axis XYZero(triple align=O, bool extend=false) { return new void(picture pic, axisT axis) { axis.type=Value; axis.type2=Value; axis.value=pic.scale.x.T(pic.scale.x.scale.logarithmic ? 1 : 0); axis.value2=pic.scale.y.T(pic.scale.y.scale.logarithmic ? 1 : 0); axis.position=1; axis.align=align; axis.extend=extend; }; } axis Bounds=Bounds(), YZZero=YZZero(), XZZero=XZZero(), XYZero=XYZero(); // Draw a general three-dimensional axis. void axis(picture pic=currentpicture, Label L="", path3 g, path3 g2=nullpath3, pen p=currentpen, ticks3 ticks, ticklocate locate, arrowbar3 arrow=None, margin3 margin=NoMargin3, int[] divisor=new int[], bool above=false, bool opposite=false) { Label L=L.copy(); real t=reltime(g,0.5); if(L.defaultposition) L.position(t); divisor=copy(divisor); locate=locate.copy(); pic.add(new void (picture f, transform3 t, transform3 T, projection P, triple, triple) { picture d; ticks(d,t,L,g,g2,p,arrow,margin,locate,divisor,opposite,true,P); add(f,t*T*inverse(t)*d); },above=above); addPath(pic,g,p); if(L.s != "") { frame f; Label L0=L.copy(); L0.position(0); add(f,L0); triple pos=point(g,L.relative()*length(g)); pic.addBox(pos,pos,min3(f),max3(f)); } } real xtrans(transform3 t, real x) { return (t*(x,0,0)).x; } real ytrans(transform3 t, real y) { return (t*(0,y,0)).y; } real ztrans(transform3 t, real z) { return (t*(0,0,z)).z; } private triple defaultdir(triple X, triple Y, triple Z, bool opposite=false, projection P) { triple u=cross(P.normal,Z); return abs(dot(u,X)) > abs(dot(u,Y)) ? -X : (opposite ? Y : -Y); } // An internal routine to draw an x axis at a particular y value. void xaxis3At(picture pic=currentpicture, Label L="", axis axis, real xmin=-infinity, real xmax=infinity, pen p=currentpen, ticks3 ticks=NoTicks3, arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=true, bool opposite=false, bool opposite2=false, bool primary=true, projection P=currentprojection) { int type=axis.type; int type2=axis.type2; triple dir=axis.align.dir3 == O ? defaultdir(Y,Z,X,opposite^opposite2,P) : axis.align.dir3; Label L=L.copy(); if(L.align.dir3 == O && L.align.dir == 0) L.align(opposite ? -dir : dir); real y=axis.value; real z=axis.value2; real y2,z2; int[] divisor=copy(axis.xdivisor); pic.add(new void(picture f, transform3 t, transform3 T, projection P, triple lb, triple rt) { transform3 tinv=inverse(t); triple a=xmin == -infinity ? tinv*(lb.x-min3(p).x,ytrans(t,y), ztrans(t,z)) : (xmin,y,z); triple b=xmax == infinity ? tinv*(rt.x-max3(p).x,ytrans(t,y), ztrans(t,z)) : (xmax,y,z); real y0; real z0; if(abs(dir.y) < abs(dir.z)) { y0=y; z0=z2; } else { y0=y2; z0=z; } triple a2=xmin == -infinity ? tinv*(lb.x-min3(p).x,ytrans(t,y0), ztrans(t,z0)) : (xmin,y0,z0); triple b2=xmax == infinity ? tinv*(rt.x-max3(p).x,ytrans(t,y0), ztrans(t,z0)) : (xmax,y0,z0); if(xmin == -infinity || xmax == infinity) { bounds mx=autoscale(a.x,b.x,pic.scale.x.scale); pic.scale.x.tickMin=mx.min; pic.scale.x.tickMax=mx.max; divisor=mx.divisor; } triple fuzz=X*epsilon*max(abs(a.x),abs(b.x)); a -= fuzz; b += fuzz; picture d; ticks(d,t,L,a--b,finite(y0) && finite(z0) ? a2--b2 : nullpath3, p,arrow,margin, ticklocate(a.x,b.x,pic.scale.x,Dir(dir)),divisor, opposite,primary,P); add(f,t*T*tinv*d); },above=above); void bounds() { if(type == Min) y=pic.scale.y.automin() ? tickMin3(pic).y : pic.userMin().y; else if(type == Max) y=pic.scale.y.automax() ? tickMax3(pic).y : pic.userMax().y; else if(type == Both) { y2=pic.scale.y.automax() ? tickMax3(pic).y : pic.userMax().y; y=opposite ? y2 : (pic.scale.y.automin() ? tickMin3(pic).y : pic.userMin().y); } if(type2 == Min) z=pic.scale.z.automin() ? tickMin3(pic).z : pic.userMin().z; else if(type2 == Max) z=pic.scale.z.automax() ? tickMax3(pic).z : pic.userMax().z; else if(type2 == Both) { z2=pic.scale.z.automax() ? tickMax3(pic).z : pic.userMax().z; z=opposite2 ? z2 : (pic.scale.z.automin() ? tickMin3(pic).z : pic.userMin().z); } real Xmin=finite(xmin) ? xmin : pic.userMin().x; real Xmax=finite(xmax) ? xmax : pic.userMax().x; triple a=(Xmin,y,z); triple b=(Xmax,y,z); triple a2=(Xmin,y2,z2); triple b2=(Xmax,y2,z2); if(finite(a)) { pic.addPoint(a,min3(p)); pic.addPoint(a,max3(p)); } if(finite(b)) { pic.addPoint(b,min3(p)); pic.addPoint(b,max3(p)); } if(finite(a) && finite(b)) { picture d; ticks(d,pic.scaling3(warn=false),L, (a.x,0,0)--(b.x,0,0),(a2.x,0,0)--(b2.x,0,0),p,arrow,margin, ticklocate(a.x,b.x,pic.scale.x,Dir(dir)),divisor, opposite,primary,P); frame f; if(L.s != "") { Label L0=L.copy(); L0.position(0); add(f,L0); } triple pos=a+L.relative()*(b-a); triple m=min3(d); triple M=max3(d); pic.addBox(pos,pos,(min3(f).x,m.y,m.z),(max3(f).x,m.y,m.z)); } } // Process any queued y and z axes bound calculation requests. for(int i=0; i < pic.scale.y.bound.length; ++i) pic.scale.y.bound[i](); for(int i=0; i < pic.scale.z.bound.length; ++i) pic.scale.z.bound[i](); pic.scale.y.bound.delete(); pic.scale.z.bound.delete(); bounds(); // Request another x bounds calculation before final picture scaling. pic.scale.x.bound.push(bounds); } // An internal routine to draw a y axis at a particular value. void yaxis3At(picture pic=currentpicture, Label L="", axis axis, real ymin=-infinity, real ymax=infinity, pen p=currentpen, ticks3 ticks=NoTicks3, arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=true, bool opposite=false, bool opposite2=false, bool primary=true, projection P=currentprojection) { int type=axis.type; int type2=axis.type2; triple dir=axis.align.dir3 == O ? defaultdir(X,Z,Y,opposite^opposite2,P) : axis.align.dir3; Label L=L.copy(); if(L.align.dir3 == O && L.align.dir == 0) L.align(opposite ? -dir : dir); real x=axis.value; real z=axis.value2; real x2,z2; int[] divisor=copy(axis.ydivisor); pic.add(new void(picture f, transform3 t, transform3 T, projection P, triple lb, triple rt) { transform3 tinv=inverse(t); triple a=ymin == -infinity ? tinv*(xtrans(t,x),lb.y-min3(p).y, ztrans(t,z)) : (x,ymin,z); triple b=ymax == infinity ? tinv*(xtrans(t,x),rt.y-max3(p).y, ztrans(t,z)) : (x,ymax,z); real x0; real z0; if(abs(dir.x) < abs(dir.z)) { x0=x; z0=z2; } else { x0=x2; z0=z; } triple a2=ymin == -infinity ? tinv*(xtrans(t,x0),lb.y-min3(p).y, ztrans(t,z0)) : (x0,ymin,z0); triple b2=ymax == infinity ? tinv*(xtrans(t,x0),rt.y-max3(p).y, ztrans(t,z0)) : (x0,ymax,z0); if(ymin == -infinity || ymax == infinity) { bounds my=autoscale(a.y,b.y,pic.scale.y.scale); pic.scale.y.tickMin=my.min; pic.scale.y.tickMax=my.max; divisor=my.divisor; } triple fuzz=Y*epsilon*max(abs(a.y),abs(b.y)); a -= fuzz; b += fuzz; picture d; ticks(d,t,L,a--b,finite(x0) && finite(z0) ? a2--b2 : nullpath3, p,arrow,margin, ticklocate(a.y,b.y,pic.scale.y,Dir(dir)),divisor, opposite,primary,P); add(f,t*T*tinv*d); },above=above); void bounds() { if(type == Min) x=pic.scale.x.automin() ? tickMin3(pic).x : pic.userMin().x; else if(type == Max) x=pic.scale.x.automax() ? tickMax3(pic).x : pic.userMax().x; else if(type == Both) { x2=pic.scale.x.automax() ? tickMax3(pic).x : pic.userMax().x; x=opposite ? x2 : (pic.scale.x.automin() ? tickMin3(pic).x : pic.userMin().x); } if(type2 == Min) z=pic.scale.z.automin() ? tickMin3(pic).z : pic.userMin().z; else if(type2 == Max) z=pic.scale.z.automax() ? tickMax3(pic).z : pic.userMax().z; else if(type2 == Both) { z2=pic.scale.z.automax() ? tickMax3(pic).z : pic.userMax().z; z=opposite2 ? z2 : (pic.scale.z.automin() ? tickMin3(pic).z : pic.userMin().z); } real Ymin=finite(ymin) ? ymin : pic.userMin().y; real Ymax=finite(ymax) ? ymax : pic.userMax().y; triple a=(x,Ymin,z); triple b=(x,Ymax,z); triple a2=(x2,Ymin,z2); triple b2=(x2,Ymax,z2); if(finite(a)) { pic.addPoint(a,min3(p)); pic.addPoint(a,max3(p)); } if(finite(b)) { pic.addPoint(b,min3(p)); pic.addPoint(b,max3(p)); } if(finite(a) && finite(b)) { picture d; ticks(d,pic.scaling3(warn=false),L, (0,a.y,0)--(0,b.y,0),(0,a2.y,0)--(0,a2.y,0),p,arrow,margin, ticklocate(a.y,b.y,pic.scale.y,Dir(dir)),divisor, opposite,primary,P); frame f; if(L.s != "") { Label L0=L.copy(); L0.position(0); add(f,L0); } triple pos=a+L.relative()*(b-a); triple m=min3(d); triple M=max3(d); pic.addBox(pos,pos,(m.x,min3(f).y,m.z),(m.x,max3(f).y,m.z)); } } // Process any queued x and z axis bound calculation requests. for(int i=0; i < pic.scale.x.bound.length; ++i) pic.scale.x.bound[i](); for(int i=0; i < pic.scale.z.bound.length; ++i) pic.scale.z.bound[i](); pic.scale.x.bound.delete(); pic.scale.z.bound.delete(); bounds(); // Request another y bounds calculation before final picture scaling. pic.scale.y.bound.push(bounds); } // An internal routine to draw a z axis at a particular value. void zaxis3At(picture pic=currentpicture, Label L="", axis axis, real zmin=-infinity, real zmax=infinity, pen p=currentpen, ticks3 ticks=NoTicks3, arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=true, bool opposite=false, bool opposite2=false, bool primary=true, projection P=currentprojection) { int type=axis.type; int type2=axis.type2; triple dir=axis.align.dir3 == O ? defaultdir(X,Y,Z,opposite^opposite2,P) : axis.align.dir3; Label L=L.copy(); if(L.align.dir3 == O && L.align.dir == 0) L.align(opposite ? -dir : dir); real x=axis.value; real y=axis.value2; real x2,y2; int[] divisor=copy(axis.zdivisor); pic.add(new void(picture f, transform3 t, transform3 T, projection P, triple lb, triple rt) { transform3 tinv=inverse(t); triple a=zmin == -infinity ? tinv*(xtrans(t,x),ytrans(t,y), lb.z-min3(p).z) : (x,y,zmin); triple b=zmax == infinity ? tinv*(xtrans(t,x),ytrans(t,y), rt.z-max3(p).z) : (x,y,zmax); real x0; real y0; if(abs(dir.x) < abs(dir.y)) { x0=x; y0=y2; } else { x0=x2; y0=y; } triple a2=zmin == -infinity ? tinv*(xtrans(t,x0),ytrans(t,y0), lb.z-min3(p).z) : (x0,y0,zmin); triple b2=zmax == infinity ? tinv*(xtrans(t,x0),ytrans(t,y0), rt.z-max3(p).z) : (x0,y0,zmax); if(zmin == -infinity || zmax == infinity) { bounds mz=autoscale(a.z,b.z,pic.scale.z.scale); pic.scale.z.tickMin=mz.min; pic.scale.z.tickMax=mz.max; divisor=mz.divisor; } triple fuzz=Z*epsilon*max(abs(a.z),abs(b.z)); a -= fuzz; b += fuzz; picture d; ticks(d,t,L,a--b,finite(x0) && finite(y0) ? a2--b2 : nullpath3, p,arrow,margin, ticklocate(a.z,b.z,pic.scale.z,Dir(dir)),divisor, opposite,primary,P); add(f,t*T*tinv*d); },above=above); void bounds() { if(type == Min) x=pic.scale.x.automin() ? tickMin3(pic).x : pic.userMin().x; else if(type == Max) x=pic.scale.x.automax() ? tickMax3(pic).x : pic.userMax().x; else if(type == Both) { x2=pic.scale.x.automax() ? tickMax3(pic).x : pic.userMax().x; x=opposite ? x2 : (pic.scale.x.automin() ? tickMin3(pic).x : pic.userMin().x); } if(type2 == Min) y=pic.scale.y.automin() ? tickMin3(pic).y : pic.userMin().y; else if(type2 == Max) y=pic.scale.y.automax() ? tickMax3(pic).y : pic.userMax().y; else if(type2 == Both) { y2=pic.scale.y.automax() ? tickMax3(pic).y : pic.userMax().y; y=opposite2 ? y2 : (pic.scale.y.automin() ? tickMin3(pic).y : pic.userMin().y); } real Zmin=finite(zmin) ? zmin : pic.userMin().z; real Zmax=finite(zmax) ? zmax : pic.userMax().z; triple a=(x,y,Zmin); triple b=(x,y,Zmax); triple a2=(x2,y2,Zmin); triple b2=(x2,y2,Zmax); if(finite(a)) { pic.addPoint(a,min3(p)); pic.addPoint(a,max3(p)); } if(finite(b)) { pic.addPoint(b,min3(p)); pic.addPoint(b,max3(p)); } if(finite(a) && finite(b)) { picture d; ticks(d,pic.scaling3(warn=false),L, (0,0,a.z)--(0,0,b.z),(0,0,a2.z)--(0,0,a2.z),p,arrow,margin, ticklocate(a.z,b.z,pic.scale.z,Dir(dir)),divisor, opposite,primary,P); frame f; if(L.s != "") { Label L0=L.copy(); L0.position(0); add(f,L0); } triple pos=a+L.relative()*(b-a); triple m=min3(d); triple M=max3(d); pic.addBox(pos,pos,(m.x,m.y,min3(f).z),(m.x,m.y,max3(f).z)); } } // Process any queued x and y axes bound calculation requests. for(int i=0; i < pic.scale.x.bound.length; ++i) pic.scale.x.bound[i](); for(int i=0; i < pic.scale.y.bound.length; ++i) pic.scale.y.bound[i](); pic.scale.x.bound.delete(); pic.scale.y.bound.delete(); bounds(); // Request another z bounds calculation before final picture scaling. pic.scale.z.bound.push(bounds); } // Internal routine to autoscale the user limits of a picture. void autoscale3(picture pic=currentpicture, axis axis) { bool set=pic.scale.set; autoscale(pic,axis); if(!set) { bounds mz; if(pic.userSetz()) { mz=autoscale(pic.userMin().z,pic.userMax().z,pic.scale.z.scale); if(pic.scale.z.scale.logarithmic && floor(pic.userMin().z) == floor(pic.userMax().z)) { if(pic.scale.z.automin()) pic.userMinz3(floor(pic.userMin().z)); if(pic.scale.z.automax()) pic.userMaxz3(ceil(pic.userMax().z)); } } else {mz.min=mz.max=0; pic.scale.set=false;} pic.scale.z.tickMin=mz.min; pic.scale.z.tickMax=mz.max; axis.zdivisor=mz.divisor; } } // Draw an x axis in three dimensions. void xaxis3(picture pic=currentpicture, Label L="", axis axis=YZZero, real xmin=-infinity, real xmax=infinity, pen p=currentpen, ticks3 ticks=NoTicks3, arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=false, projection P=currentprojection) { if(xmin > xmax) return; if(pic.scale.x.automin && xmin > -infinity) pic.scale.x.automin=false; if(pic.scale.x.automax && xmax < infinity) pic.scale.x.automax=false; if(!pic.scale.set) { axis(pic,axis); autoscale3(pic,axis); } bool newticks=false; if(xmin != -infinity) { xmin=pic.scale.x.T(xmin); newticks=true; } if(xmax != infinity) { xmax=pic.scale.x.T(xmax); newticks=true; } if(newticks && pic.userSetx() && ticks != NoTicks3) { if(xmin == -infinity) xmin=pic.userMin().x; if(xmax == infinity) xmax=pic.userMax().x; bounds mx=autoscale(xmin,xmax,pic.scale.x.scale); pic.scale.x.tickMin=mx.min; pic.scale.x.tickMax=mx.max; axis.xdivisor=mx.divisor; } axis(pic,axis); if(xmin == -infinity && !axis.extend) { if(pic.scale.set) xmin=pic.scale.x.automin() ? pic.scale.x.tickMin : max(pic.scale.x.tickMin,pic.userMin().x); else xmin=pic.userMin().x; } if(xmax == infinity && !axis.extend) { if(pic.scale.set) xmax=pic.scale.x.automax() ? pic.scale.x.tickMax : min(pic.scale.x.tickMax,pic.userMax().x); else xmax=pic.userMax().x; } if(L.defaultposition) { L=L.copy(); L.position(axis.position); } bool back=false; if(axis.type == Both) { projection P=centered(P,pic); triple v=P.normal; back=dot((0,pic.userMax().y-pic.userMin().y,0),v)*sgn(v.z) > 0; } xaxis3At(pic,L,axis,xmin,xmax,p,ticks,arrow,margin,above,false,false,!back); if(axis.type == Both) xaxis3At(pic,L,axis,xmin,xmax,p,ticks,arrow,margin,above,true,false,back); if(axis.type2 == Both) { xaxis3At(pic,L,axis,xmin,xmax,p,ticks,arrow,margin,above,false,true,false); if(axis.type == Both) xaxis3At(pic,L,axis,xmin,xmax,p,ticks,arrow,margin,above,true,true,false); } } // Draw a y axis in three dimensions. void yaxis3(picture pic=currentpicture, Label L="", axis axis=XZZero, real ymin=-infinity, real ymax=infinity, pen p=currentpen, ticks3 ticks=NoTicks3, arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=false, projection P=currentprojection) { if(ymin > ymax) return; if(pic.scale.y.automin && ymin > -infinity) pic.scale.y.automin=false; if(pic.scale.y.automax && ymax < infinity) pic.scale.y.automax=false; if(!pic.scale.set) { axis(pic,axis); autoscale3(pic,axis); } bool newticks=false; if(ymin != -infinity) { ymin=pic.scale.y.T(ymin); newticks=true; } if(ymax != infinity) { ymax=pic.scale.y.T(ymax); newticks=true; } if(newticks && pic.userSety() && ticks != NoTicks3) { if(ymin == -infinity) ymin=pic.userMin().y; if(ymax == infinity) ymax=pic.userMax().y; bounds my=autoscale(ymin,ymax,pic.scale.y.scale); pic.scale.y.tickMin=my.min; pic.scale.y.tickMax=my.max; axis.ydivisor=my.divisor; } axis(pic,axis); if(ymin == -infinity && !axis.extend) { if(pic.scale.set) ymin=pic.scale.y.automin() ? pic.scale.y.tickMin : max(pic.scale.y.tickMin,pic.userMin().y); else ymin=pic.userMin().y; } if(ymax == infinity && !axis.extend) { if(pic.scale.set) ymax=pic.scale.y.automax() ? pic.scale.y.tickMax : min(pic.scale.y.tickMax,pic.userMax().y); else ymax=pic.userMax().y; } if(L.defaultposition) { L=L.copy(); L.position(axis.position); } bool back=false; if(axis.type == Both) { projection P=centered(P,pic); triple v=P.normal; back=dot((pic.userMax().x-pic.userMin().x,0,0),v)*sgn(v.z) > 0; } yaxis3At(pic,L,axis,ymin,ymax,p,ticks,arrow,margin,above,false,false,!back); if(axis.type == Both) yaxis3At(pic,L,axis,ymin,ymax,p,ticks,arrow,margin,above,true,false,back); if(axis.type2 == Both) { yaxis3At(pic,L,axis,ymin,ymax,p,ticks,arrow,margin,above,false,true,false); if(axis.type == Both) yaxis3At(pic,L,axis,ymin,ymax,p,ticks,arrow,margin,above,true,true,false); } } // Draw a z axis in three dimensions. void zaxis3(picture pic=currentpicture, Label L="", axis axis=XYZero, real zmin=-infinity, real zmax=infinity, pen p=currentpen, ticks3 ticks=NoTicks3, arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=false, projection P=currentprojection) { if(zmin > zmax) return; if(pic.scale.z.automin && zmin > -infinity) pic.scale.z.automin=false; if(pic.scale.z.automax && zmax < infinity) pic.scale.z.automax=false; if(!pic.scale.set) { axis(pic,axis); autoscale3(pic,axis); } bool newticks=false; if(zmin != -infinity) { zmin=pic.scale.z.T(zmin); newticks=true; } if(zmax != infinity) { zmax=pic.scale.z.T(zmax); newticks=true; } if(newticks && pic.userSetz() && ticks != NoTicks3) { if(zmin == -infinity) zmin=pic.userMin().z; if(zmax == infinity) zmax=pic.userMax().z; bounds mz=autoscale(zmin,zmax,pic.scale.z.scale); pic.scale.z.tickMin=mz.min; pic.scale.z.tickMax=mz.max; axis.zdivisor=mz.divisor; } axis(pic,axis); if(zmin == -infinity && !axis.extend) { if(pic.scale.set) zmin=pic.scale.z.automin() ? pic.scale.z.tickMin : max(pic.scale.z.tickMin,pic.userMin().z); else zmin=pic.userMin().z; } if(zmax == infinity && !axis.extend) { if(pic.scale.set) zmax=pic.scale.z.automax() ? pic.scale.z.tickMax : min(pic.scale.z.tickMax,pic.userMax().z); else zmax=pic.userMax().z; } if(L.defaultposition) { L=L.copy(); L.position(axis.position); } bool back=false; if(axis.type == Both) { projection P=centered(P,pic); triple v=P.vector(); back=dot((pic.userMax().x-pic.userMin().x,0,0),v)*sgn(v.y) > 0; } zaxis3At(pic,L,axis,zmin,zmax,p,ticks,arrow,margin,above,false,false,!back); if(axis.type == Both) zaxis3At(pic,L,axis,zmin,zmax,p,ticks,arrow,margin,above,true,false,back); if(axis.type2 == Both) { zaxis3At(pic,L,axis,zmin,zmax,p,ticks,arrow,margin,above,false,true,false); if(axis.type == Both) zaxis3At(pic,L,axis,zmin,zmax,p,ticks,arrow,margin,above,true,true,false); } } // Set the z limits of a picture. void zlimits(picture pic=currentpicture, real min=-infinity, real max=infinity, bool crop=NoCrop) { if(min > max) return; pic.scale.z.automin=min <= -infinity; pic.scale.z.automax=max >= infinity; bounds mz; if(pic.scale.z.automin() || pic.scale.z.automax()) mz=autoscale(pic.userMin().z,pic.userMax().z,pic.scale.z.scale); if(pic.scale.z.automin) { if(pic.scale.z.automin()) pic.userMinz(mz.min); } else pic.userMinz(min(pic.scale.z.T(min),pic.scale.z.T(max))); if(pic.scale.z.automax) { if(pic.scale.z.automax()) pic.userMaxz(mz.max); } else pic.userMaxz(max(pic.scale.z.T(min),pic.scale.z.T(max))); } // Restrict the x, y, and z limits to box(min,max). void limits(picture pic=currentpicture, triple min, triple max) { xlimits(pic,min.x,max.x); ylimits(pic,min.y,max.y); zlimits(pic,min.z,max.z); } // Draw x, y and z axes. void axes3(picture pic=currentpicture, Label xlabel="", Label ylabel="", Label zlabel="", bool extend=false, triple min=(-infinity,-infinity,-infinity), triple max=(infinity,infinity,infinity), pen p=currentpen, arrowbar3 arrow=None, margin3 margin=NoMargin3, projection P=currentprojection) { xaxis3(pic,xlabel,YZZero(extend),min.x,max.x,p,arrow,margin,P); yaxis3(pic,ylabel,XZZero(extend),min.y,max.y,p,arrow,margin,P); zaxis3(pic,zlabel,XYZero(extend),min.z,max.z,p,arrow,margin,P); } triple Scale(picture pic=currentpicture, triple v) { return (pic.scale.x.T(v.x),pic.scale.y.T(v.y),pic.scale.z.T(v.z)); } triple[][] Scale(picture pic=currentpicture, triple[][] P) { triple[][] Q=new triple[P.length][]; for(int i=0; i < P.length; ++i) { triple[] Pi=P[i]; Q[i]=new triple[Pi.length]; for(int j=0; j < Pi.length; ++j) Q[i][j]=Scale(pic,Pi[j]); } return Q; } real ScaleX(picture pic=currentpicture, real x) { return pic.scale.x.T(x); } real ScaleY(picture pic=currentpicture, real y) { return pic.scale.y.T(y); } real ScaleZ(picture pic=currentpicture, real z) { return pic.scale.z.T(z); } real[][] ScaleZ(picture pic=currentpicture, real[][] P) { real[][] Q=new real[P.length][]; for(int i=0; i < P.length; ++i) { real[] Pi=P[i]; Q[i]=new real[Pi.length]; for(int j=0; j < Pi.length; ++j) Q[i][j]=ScaleZ(pic,Pi[j]); } return Q; } real[] uniform(real T(real x), real Tinv(real x), real a, real b, int n) { return map(Tinv,uniform(T(a),T(b),n)); } // Draw a tick of length size at triple v in direction dir using pen p. void tick(picture pic=currentpicture, triple v, triple dir, real size=Ticksize, pen p=currentpen) { triple v=Scale(pic,v); pic.add(new void (picture f, transform3 t) { triple tv=t*v; draw(f,tv--tv+unit(dir)*size,p); }); pic.addPoint(v,p); pic.addPoint(v,unit(dir)*size,p); } void xtick(picture pic=currentpicture, triple v, triple dir=Y, real size=Ticksize, pen p=currentpen) { tick(pic,v,dir,size,p); } void xtick3(picture pic=currentpicture, real x, triple dir=Y, real size=Ticksize, pen p=currentpen) { tick(pic,(x,pic.scale.y.scale.logarithmic ? 1 : 0, pic.scale.z.scale.logarithmic ? 1 : 0),dir,size,p); } void ytick(picture pic=currentpicture, triple v, triple dir=X, real size=Ticksize, pen p=currentpen) { tick(pic,v,dir,size,p); } void ytick3(picture pic=currentpicture, real y, triple dir=X, real size=Ticksize, pen p=currentpen) { tick(pic,(pic.scale.x.scale.logarithmic ? 1 : 0,y, pic.scale.z.scale.logarithmic ? 1 : 0),dir,size,p); } void ztick(picture pic=currentpicture, triple v, triple dir=X, real size=Ticksize, pen p=currentpen) { xtick(pic,v,dir,size,p); } void ztick3(picture pic=currentpicture, real z, triple dir=X, real size=Ticksize, pen p=currentpen) { xtick(pic,(pic.scale.x.scale.logarithmic ? 1 : 0, pic.scale.y.scale.logarithmic ? 1 : 0,z),dir,size,p); } void tick(picture pic=currentpicture, Label L, real value, triple v, triple dir, string format="", real size=Ticksize, pen p=currentpen) { Label L=L.copy(); L.align(L.align,-dir); if(shift(L.T3)*O == O) L.T3=shift(dot(dir,L.align.dir3) > 0 ? dir*size : ticklabelshift(L.align.dir3,p))*L.T3; L.p(p); if(L.s == "") L.s=format(format == "" ? defaultformat : format,value); L.s=baseline(L.s,baselinetemplate); label(pic,L,Scale(pic,v)); tick(pic,v,dir,size,p); } void xtick(picture pic=currentpicture, Label L, triple v, triple dir=Y, string format="", real size=Ticksize, pen p=currentpen) { tick(pic,L,v.x,v,dir,format,size,p); } void xtick3(picture pic=currentpicture, Label L, real x, triple dir=Y, string format="", real size=Ticksize, pen p=currentpen) { xtick(pic,L,(x,pic.scale.y.scale.logarithmic ? 1 : 0, pic.scale.z.scale.logarithmic ? 1 : 0),dir,size,p); } void ytick(picture pic=currentpicture, Label L, triple v, triple dir=X, string format="", real size=Ticksize, pen p=currentpen) { tick(pic,L,v.y,v,dir,format,size,p); } void ytick3(picture pic=currentpicture, Label L, real y, triple dir=X, string format="", real size=Ticksize, pen p=currentpen) { xtick(pic,L,(pic.scale.x.scale.logarithmic ? 1 : 0,y, pic.scale.z.scale.logarithmic ? 1 : 0),dir,format,size,p); } void ztick(picture pic=currentpicture, Label L, triple v, triple dir=X, string format="", real size=Ticksize, pen p=currentpen) { tick(pic,L,v.z,v,dir,format,size,p); } void ztick3(picture pic=currentpicture, Label L, real z, triple dir=X, string format="", real size=Ticksize, pen p=currentpen) { xtick(pic,L,(pic.scale.x.scale.logarithmic ? 1 : 0, pic.scale.z.scale.logarithmic ? 1 : 0,z),dir,format,size,p); } private void label(picture pic, Label L, triple v, real x, align align, string format, pen p) { Label L=L.copy(); L.align(align); L.p(p); if(shift(L.T3)*O == O) L.T3=shift(ticklabelshift(L.align.dir3,L.p))*L.T3; if(L.s == "") L.s=format(format == "" ? defaultformat : format,x); L.s=baseline(L.s,baselinetemplate); label(pic,L,v); } void labelx(picture pic=currentpicture, Label L="", triple v, align align=-Y, string format="", pen p=currentpen) { label(pic,L,Scale(pic,v),v.x,align,format,p); } void labelx3(picture pic=currentpicture, Label L="", real x, align align=-Y, string format="", pen p=currentpen) { labelx(pic,L,(x,pic.scale.y.scale.logarithmic ? 1 : 0, pic.scale.z.scale.logarithmic ? 1 : 0),align,format,p); } void labely(picture pic=currentpicture, Label L="", triple v, align align=-X, string format="", pen p=currentpen) { label(pic,L,Scale(pic,v),v.y,align,format,p); } void labely3(picture pic=currentpicture, Label L="", real y, align align=-X, string format="", pen p=currentpen) { labely(pic,L,(pic.scale.x.scale.logarithmic ? 1 : 0,y, pic.scale.z.scale.logarithmic ? 1 : 0),align,format,p); } void labelz(picture pic=currentpicture, Label L="", triple v, align align=-X, string format="", pen p=currentpen) { label(pic,L,Scale(pic,v),v.z,align,format,p); } void labelz3(picture pic=currentpicture, Label L="", real z, align align=-X, string format="", pen p=currentpen) { labelz(pic,L,(pic.scale.x.scale.logarithmic ? 1 : 0, pic.scale.y.scale.logarithmic ? 1 : 0,z),align,format,p); } typedef guide3 graph(triple F(real), real, real, int); typedef guide3[] multigraph(triple F(real), real, real, int); graph graph(interpolate3 join) { return new guide3(triple f(real), real a, real b, int n) { real width=b-a; return n == 0 ? join(f(a)) : join(...sequence(new guide3(int i) {return f(a+(i/n)*width);},n+1)); }; } multigraph graph(interpolate3 join, bool3 cond(real)) { return new guide3[](triple f(real), real a, real b, int n) { real width=b-a; if(n == 0) return new guide3[] {join(cond(a) ? f(a) : nullpath3)}; guide3[] G; guide3[] g; for(int i=0; i < n+1; ++i) { real t=a+(i/n)*width; bool3 b=cond(t); if(b) g.push(f(t)); else { if(g.length > 0) { G.push(join(...g)); g=new guide3[] {}; } if(b == default) g.push(f(t)); } } if(g.length > 0) G.push(join(...g)); return G; }; } guide3 Straight(... guide3[])=operator --; guide3 Spline(... guide3[])=operator ..; guide3 graph(picture pic=currentpicture, real x(real), real y(real), real z(real), real a, real b, int n=ngraph, interpolate3 join=operator --) { return graph(join)(new triple(real t) {return Scale(pic,(x(t),y(t),z(t)));}, a,b,n); } guide3[] graph(picture pic=currentpicture, real x(real), real y(real), real z(real), real a, real b, int n=ngraph, bool3 cond(real), interpolate3 join=operator --) { return graph(join,cond)(new triple(real t) { return Scale(pic,(x(t),y(t),z(t))); },a,b,n); } guide3 graph(picture pic=currentpicture, triple v(real), real a, real b, int n=ngraph, interpolate3 join=operator --) { return graph(join)(new triple(real t) {return Scale(pic,v(t));},a,b,n); } guide3[] graph(picture pic=currentpicture, triple v(real), real a, real b, int n=ngraph, bool3 cond(real), interpolate3 join=operator --) { return graph(join,cond)(new triple(real t) { return Scale(pic,v(t)); },a,b,n); } guide3 graph(picture pic=currentpicture, triple[] v, interpolate3 join=operator --) { int i=0; return graph(join)(new triple(real) { triple w=Scale(pic,v[i]); ++i; return w; },0,0,v.length-1); } guide3[] graph(picture pic=currentpicture, triple[] v, bool3[] cond, interpolate3 join=operator --) { int n=v.length; int i=0; triple w; checkconditionlength(cond.length,n); bool3 condition(real) { bool b=cond[i]; if(b) w=Scale(pic,v[i]); ++i; return b; } return graph(join,condition)(new triple(real) {return w;},0,0,n-1); } guide3 graph(picture pic=currentpicture, real[] x, real[] y, real[] z, interpolate3 join=operator --) { int n=x.length; checklengths(n,y.length); checklengths(n,z.length); int i=0; return graph(join)(new triple(real) { triple w=Scale(pic,(x[i],y[i],z[i])); ++i; return w; },0,0,n-1); } guide3[] graph(picture pic=currentpicture, real[] x, real[] y, real[] z, bool3[] cond, interpolate3 join=operator --) { int n=x.length; checklengths(n,y.length); checklengths(n,z.length); int i=0; triple w; checkconditionlength(cond.length,n); bool3 condition(real) { bool3 b=cond[i]; if(b != false) w=Scale(pic,(x[i],y[i],z[i])); ++i; return b; } return graph(join,condition)(new triple(real) {return w;},0,0,n-1); } // The graph of a function along a path. guide3 graph(triple F(path, real), path p, int n=1, interpolate3 join=operator --) { guide3 g=join(...sequence(new guide3(int i) { return F(p,i/n); },n*length(p))); return cyclic(p) ? join(g,cycle) : join(g,F(p,length(p))); } guide3 graph(triple F(pair), path p, int n=1, interpolate3 join=operator --) { return graph(new triple(path p, real position) {return F(point(p,position));},p,n,join); } guide3 graph(picture pic=currentpicture, real f(pair), path p, int n=1, interpolate3 join=operator --) { return graph(new triple(pair z) {return Scale(pic,(z.x,z.y,f(z)));},p,n, join); } guide3 graph(real f(pair), path p, int n=1, real T(pair), interpolate3 join=operator --) { return graph(new triple(pair z) {pair w=T(z); return (w.x,w.y,f(w));},p,n, join); } // Connect points in v into segments corresponding to consecutive true elements // of b using interpolation operator join. path3[] segment(triple[] v, bool[] cond, interpolate3 join=operator --) { checkconditionlength(cond.length,v.length); int[][] segment=segment(cond); return sequence(new path3(int i) {return join(...v[segment[i]]);}, segment.length); } bool uperiodic(real[][] a) { int n=a.length; if(n == 0) return false; int m=a[0].length; real[] a0=a[0]; real[] a1=a[n-1]; for(int j=0; j < m; ++j) { real norm=0; for(int i=0; i < n; ++i) norm=max(norm,abs(a[i][j])); real epsilon=sqrtEpsilon*norm; if(abs(a0[j]-a1[j]) > epsilon) return false; } return true; } bool vperiodic(real[][] a) { int n=a.length; if(n == 0) return false; int m=a[0].length-1; for(int i=0; i < n; ++i) { real[] ai=a[i]; real epsilon=sqrtEpsilon*norm(ai); if(abs(ai[0]-ai[m]) > epsilon) return false; } return true; } bool uperiodic(triple[][] a) { int n=a.length; if(n == 0) return false; int m=a[0].length; triple[] a0=a[0]; triple[] a1=a[n-1]; real epsilon=sqrtEpsilon*norm(a); for(int j=0; j < m; ++j) if(abs(a0[j]-a1[j]) > epsilon) return false; return true; } bool vperiodic(triple[][] a) { int n=a.length; if(n == 0) return false; int m=a[0].length-1; real epsilon=sqrtEpsilon*norm(a); for(int i=0; i < n; ++i) if(abs(a[i][0]-a[i][m]) > epsilon) return false; return true; } // return the surface described by a matrix f surface surface(picture pic=currentpicture, triple[][] f, bool[][] cond={}) { if(!rectangular(f)) abort("matrix is not rectangular"); int nx=f.length-1; int ny=nx > 0 ? f[0].length-1 : 0; bool all=cond.length == 0; int count; if(all) count=nx*ny; else { count=0; for(int i=0; i < nx; ++i) { bool[] condi=cond[i]; bool[] condp=cond[i+1]; for(int j=0; j < ny; ++j) if(condi[j] && condi[j+1] && condp[j] && condp[j+1]) ++count; } } surface s=surface(count); s.index=new int[nx][ny]; int k=0; for(int i=0; i < nx; ++i) { bool[] condi,condp; if(!all) { condi=cond[i]; condp=cond[i+1]; } triple[] fi=f[i]; triple[] fp=f[i+1]; int[] indexi=s.index[i]; for(int j=0; j < ny; ++j) { if(all || (condi[j] && condi[j+1] && condp[j] && condp[j+1])) { s.s[k]=patch(new triple[] { Scale(pic,fi[j]), Scale(pic,fp[j]), Scale(pic,fp[j+1]), Scale(pic,fi[j+1])}); indexi[j]=k; ++k; } } } if(count == nx*ny) { if(uperiodic(f)) s.ucyclic(true); if(vperiodic(f)) s.vcyclic(true); } return s; } surface bispline(real[][] z, real[][] p, real[][] q, real[][] r, real[] x, real[] y, bool[][] cond={}) { // z[i][j] is the value at (x[i],y[j]) // p and q are the first derivatives with respect to x and y, respectively // r is the second derivative ddu/dxdy int n=x.length-1; int m=y.length-1; bool all=cond.length == 0; int count; if(all) count=n*m; else { count=0; for(int i=0; i < n; ++i) { bool[] condi=cond[i]; for(int j=0; j < m; ++j) if(condi[j]) ++count; } } surface s=surface(count); s.index=new int[n][m]; int k=0; for(int i=0; i < n; ++i) { int ip=i+1; real xi=x[i]; real xp=x[ip]; real x1=interp(xi,xp,1/3); real x2=interp(xi,xp,2/3); real hx=x1-xi; real[] zi=z[i]; real[] zp=z[ip]; real[] ri=r[i]; real[] rp=r[ip]; real[] pi=p[i]; real[] pp=p[ip]; real[] qi=q[i]; real[] qp=q[ip]; int[] indexi=s.index[i]; bool[] condi=all ? null : cond[i]; for(int j=0; j < m; ++j) { if(all || condi[j]) { real yj=y[j]; int jp=j+1; real yp=y[jp]; real y1=interp(yj,yp,1/3); real y2=interp(yj,yp,2/3); real hy=y1-yj; real hxy=hx*hy; real zij=zi[j]; real zip=zi[jp]; real zpj=zp[j]; real zpp=zp[jp]; real pij=hx*pi[j]; real ppj=hx*pp[j]; real qip=hy*qi[jp]; real qpp=hy*qp[jp]; real zippip=zip+hx*pi[jp]; real zppmppp=zpp-hx*pp[jp]; real zijqij=zij+hy*qi[j]; real zpjqpj=zpj+hy*qp[j]; s.s[k]=patch(new triple[][] { {(xi,yj,zij),(xi,y1,zijqij),(xi,y2,zip-qip),(xi,yp,zip)}, {(x1,yj,zij+pij),(x1,y1,zijqij+pij+hxy*ri[j]), (x1,y2,zippip-qip-hxy*ri[jp]),(x1,yp,zippip)}, {(x2,yj,zpj-ppj),(x2,y1,zpjqpj-ppj-hxy*rp[j]), (x2,y2,zppmppp-qpp+hxy*rp[jp]),(x2,yp,zppmppp)}, {(xp,yj,zpj),(xp,y1,zpjqpj),(xp,y2,zpp-qpp),(xp,yp,zpp)}}, copy=false); indexi[j]=k; ++k; } } } return s; } private real[][][] bispline0(real[][] z, real[][] p, real[][] q, real[][] r, real[] x, real[] y, bool[][] cond={}) { // z[i][j] is the value at (x[i],y[j]) // p and q are the first derivatives with respect to x and y, respectively // r is the second derivative ddu/dxdy int n=x.length-1; int m=y.length-1; bool all=cond.length == 0; int count; if(all) count=n*m; else { count=0; for(int i=0; i < n; ++i) { bool[] condi=cond[i]; bool[] condp=cond[i+1]; for(int j=0; j < m; ++j) if(all || (condi[j] && condi[j+1] && condp[j] && condp[j+1])) ++count; } } real[][][] s=new real[count][][]; int k=0; for(int i=0; i < n; ++i) { int ip=i+1; real xi=x[i]; real xp=x[ip]; real hx=(xp-xi)/3; real[] zi=z[i]; real[] zp=z[ip]; real[] ri=r[i]; real[] rp=r[ip]; real[] pi=p[i]; real[] pp=p[ip]; real[] qi=q[i]; real[] qp=q[ip]; bool[] condi=all ? null : cond[i]; bool[] condp=all ? null : cond[i+1]; for(int j=0; j < m; ++j) { if(all || (condi[j] && condi[j+1] && condp[j] && condp[j+1])) { real yj=y[j]; int jp=j+1; real yp=y[jp]; real hy=(yp-yj)/3; real hxy=hx*hy; real zij=zi[j]; real zip=zi[jp]; real zpj=zp[j]; real zpp=zp[jp]; real pij=hx*pi[j]; real ppj=hx*pp[j]; real qip=hy*qi[jp]; real qpp=hy*qp[jp]; real zippip=zip+hx*pi[jp]; real zppmppp=zpp-hx*pp[jp]; real zijqij=zij+hy*qi[j]; real zpjqpj=zpj+hy*qp[j]; s[k]=new real[][] {{zij,zijqij,zip-qip,zip}, {zij+pij,zijqij+pij+hxy*ri[j], zippip-qip-hxy*ri[jp],zippip}, {zpj-ppj,zpjqpj-ppj-hxy*rp[j], zppmppp-qpp+hxy*rp[jp],zppmppp}, {zpj,zpjqpj,zpp-qpp,zpp}}; ++k; } } } return s; } // return the surface values described by a real matrix f, interpolated with // xsplinetype and ysplinetype. real[][][] bispline(real[][] f, real[] x, real[] y, splinetype xsplinetype=null, splinetype ysplinetype=xsplinetype, bool[][] cond={}) { real epsilon=sqrtEpsilon*norm(y); if(xsplinetype == null) xsplinetype=(abs(x[0]-x[x.length-1]) <= epsilon) ? periodic : notaknot; if(ysplinetype == null) ysplinetype=(abs(y[0]-y[y.length-1]) <= epsilon) ? periodic : notaknot; int n=x.length; int m=y.length; real[][] ft=transpose(f); real[][] tp=new real[m][]; for(int j=0; j < m; ++j) tp[j]=xsplinetype(x,ft[j]); real[][] q=new real[n][]; for(int i=0; i < n; ++i) q[i]=ysplinetype(y,f[i]); real[][] qt=transpose(q); real[] d1=xsplinetype(x,qt[0]); real[] d2=xsplinetype(x,qt[m-1]); real[][] r=new real[n][]; real[][] p=transpose(tp); for(int i=0; i < n; ++i) r[i]=clamped(d1[i],d2[i])(y,p[i]); return bispline0(f,p,q,r,x,y,cond); } // return the surface described by a real matrix f, interpolated with // xsplinetype and ysplinetype. surface surface(picture pic=currentpicture, real[][] f, real[] x, real[] y, splinetype xsplinetype=null, splinetype ysplinetype=xsplinetype, bool[][] cond={}) { if(xsplinetype == linear && ysplinetype == linear) { int nx=f.length-1; int ny=nx > 0 ? f[0].length-1 : 0; if(nx == 0 || ny == 0) return nullsurface; bool all=cond.length == 0; triple[][] v=new triple[nx+1][ny+1]; for(int i=0; i <= nx; ++i) { bool[] condi=all ? null : cond[i]; real xi=x[i]; real[] fi=f[i]; triple[] vi=v[i]; for(int j=0; j <= ny; ++j) vi[j]=(xi,y[j],fi[j]); } return surface(pic,v,cond); } real[][] f=ScaleZ(pic,f); real[] x=map(pic.scale.x.T,x); real[] y=map(pic.scale.y.T,y); real epsilon=sqrtEpsilon*norm(y); if(xsplinetype == null) xsplinetype=(abs(x[0]-x[x.length-1]) <= epsilon) ? periodic : notaknot; if(ysplinetype == null) ysplinetype=(abs(y[0]-y[y.length-1]) <= epsilon) ? periodic : notaknot; int n=x.length; int m=y.length; real[][] ft=transpose(f); real[][] tp=new real[m][]; for(int j=0; j < m; ++j) tp[j]=xsplinetype(x,ft[j]); real[][] q=new real[n][]; for(int i=0; i < n; ++i) q[i]=ysplinetype(y,f[i]); real[][] qt=transpose(q); real[] d1=xsplinetype(x,qt[0]); real[] d2=xsplinetype(x,qt[m-1]); real[][] r=new real[n][]; real[][] p=transpose(tp); for(int i=0; i < n; ++i) r[i]=clamped(d1[i],d2[i])(y,p[i]); surface s=bispline(f,p,q,r,x,y,cond); if(xsplinetype == periodic) s.ucyclic(true); if(ysplinetype == periodic) s.vcyclic(true); return s; } // return the surface described by a real matrix f, interpolated with // xsplinetype and ysplinetype. surface surface(picture pic=currentpicture, real[][] f, pair a, pair b, splinetype xsplinetype, splinetype ysplinetype=xsplinetype, bool[][] cond={}) { if(!rectangular(f)) abort("matrix is not rectangular"); int nx=f.length-1; int ny=nx > 0 ? f[0].length-1 : 0; if(nx == 0 || ny == 0) return nullsurface; real[] x=uniform(pic.scale.x.T,pic.scale.x.Tinv,a.x,b.x,nx); real[] y=uniform(pic.scale.y.T,pic.scale.y.Tinv,a.y,b.y,ny); return surface(pic,f,x,y,xsplinetype,ysplinetype,cond); } // return the surface described by a real matrix f, interpolated linearly. surface surface(picture pic=currentpicture, real[][] f, pair a, pair b, bool[][] cond={}) { if(!rectangular(f)) abort("matrix is not rectangular"); int nx=f.length-1; int ny=nx > 0 ? f[0].length-1 : 0; if(nx == 0 || ny == 0) return nullsurface; bool all=cond.length == 0; triple[][] v=new triple[nx+1][ny+1]; pair a=Scale(pic,a); pair b=Scale(pic,b); for(int i=0; i <= nx; ++i) { real x=pic.scale.x.Tinv(interp(a.x,b.x,i/nx)); bool[] condi=all ? null : cond[i]; triple[] vi=v[i]; real[] fi=f[i]; for(int j=0; j <= ny; ++j) if(all || condi[j]) vi[j]=(x,pic.scale.y.Tinv(interp(a.y,b.y,j/ny)),fi[j]); } return surface(pic,v,cond); } // return the surface described by a parametric function f over box(a,b), // interpolated linearly. surface surface(picture pic=currentpicture, triple f(pair z), pair a, pair b, int nu=nmesh, int nv=nu, bool cond(pair z)=null) { if(nu <= 0 || nv <= 0) return nullsurface; bool[][] active; bool all=cond == null; if(!all) active=new bool[nu+1][nv+1]; real du=1/nu; real dv=1/nv; pair Idv=(0,dv); pair dz=(du,dv); triple[][] v=new triple[nu+1][nv+1]; pair a=Scale(pic,a); pair b=Scale(pic,b); for(int i=0; i <= nu; ++i) { real x=pic.scale.x.Tinv(interp(a.x,b.x,i*du)); bool[] activei=all ? null : active[i]; triple[] vi=v[i]; for(int j=0; j <= nv; ++j) { pair z=(x,pic.scale.y.Tinv(interp(a.y,b.y,j*dv))); if(all || (activei[j]=cond(z))) vi[j]=f(z); } } return surface(pic,v,active); } // return the surface described by a parametric function f evaluated at u and v // and interpolated with usplinetype and vsplinetype. surface surface(picture pic=currentpicture, triple f(pair z), real[] u, real[] v, splinetype[] usplinetype, splinetype[] vsplinetype=Spline, bool cond(pair z)=null) { int nu=u.length-1; int nv=v.length-1; real[] ipt=sequence(u.length); real[] jpt=sequence(v.length); real[][] fx=new real[u.length][v.length]; real[][] fy=new real[u.length][v.length]; real[][] fz=new real[u.length][v.length]; bool[][] active; bool all=cond == null; if(!all) active=new bool[u.length][v.length]; for(int i=0; i <= nu; ++i) { real ui=u[i]; real[] fxi=fx[i]; real[] fyi=fy[i]; real[] fzi=fz[i]; bool[] activei=all ? null : active[i]; for(int j=0; j <= nv; ++j) { pair z=(ui,v[j]); if(!all) activei[j]=cond(z); triple f=Scale(pic,f(z)); fxi[j]=f.x; fyi[j]=f.y; fzi[j]=f.z; } } if(usplinetype.length == 0) { usplinetype=new splinetype[] {uperiodic(fx) ? periodic : notaknot, uperiodic(fy) ? periodic : notaknot, uperiodic(fz) ? periodic : notaknot}; } else if(usplinetype.length != 3) abort("usplinetype must have length 3"); if(vsplinetype.length == 0) { vsplinetype=new splinetype[] {vperiodic(fx) ? periodic : notaknot, vperiodic(fy) ? periodic : notaknot, vperiodic(fz) ? periodic : notaknot}; } else if(vsplinetype.length != 3) abort("vsplinetype must have length 3"); real[][][] sx=bispline(fx,ipt,jpt,usplinetype[0],vsplinetype[0],active); real[][][] sy=bispline(fy,ipt,jpt,usplinetype[1],vsplinetype[1],active); real[][][] sz=bispline(fz,ipt,jpt,usplinetype[2],vsplinetype[2],active); surface s=surface(sx.length); s.index=new int[nu][nv]; int k=0; for(int i=0; i < nu; ++i) { int[] indexi=s.index[i]; for(int j=0; j < nv; ++j) { indexi[j]=k; ++k; } } for(int k=0; k < sx.length; ++k) { triple[][] Q=new triple[4][]; real[][] Px=sx[k]; real[][] Py=sy[k]; real[][] Pz=sz[k]; for(int i=0; i < 4 ; ++i) { real[] Pxi=Px[i]; real[] Pyi=Py[i]; real[] Pzi=Pz[i]; Q[i]=new triple[] {(Pxi[0],Pyi[0],Pzi[0]), (Pxi[1],Pyi[1],Pzi[1]), (Pxi[2],Pyi[2],Pzi[2]), (Pxi[3],Pyi[3],Pzi[3])}; } s.s[k]=patch(Q); } if(usplinetype[0] == periodic && usplinetype[1] == periodic && usplinetype[1] == periodic) s.ucyclic(true); if(vsplinetype[0] == periodic && vsplinetype[1] == periodic && vsplinetype[1] == periodic) s.vcyclic(true); return s; } // return the surface described by a parametric function f over box(a,b), // interpolated with usplinetype and vsplinetype. surface surface(picture pic=currentpicture, triple f(pair z), pair a, pair b, int nu=nmesh, int nv=nu, splinetype[] usplinetype, splinetype[] vsplinetype=Spline, bool cond(pair z)=null) { real[] x=uniform(pic.scale.x.T,pic.scale.x.Tinv,a.x,b.x,nu); real[] y=uniform(pic.scale.y.T,pic.scale.y.Tinv,a.y,b.y,nv); return surface(pic,f,x,y,usplinetype,vsplinetype,cond); } // return the surface described by a real function f over box(a,b), // interpolated linearly. surface surface(picture pic=currentpicture, real f(pair z), pair a, pair b, int nx=nmesh, int ny=nx, bool cond(pair z)=null) { return surface(pic,new triple(pair z) {return (z.x,z.y,f(z));},a,b,nx,ny, cond); } // return the surface described by a real function f over box(a,b), // interpolated with xsplinetype and ysplinetype. surface surface(picture pic=currentpicture, real f(pair z), pair a, pair b, int nx=nmesh, int ny=nx, splinetype xsplinetype, splinetype ysplinetype=xsplinetype, bool cond(pair z)=null) { bool[][] active; bool all=cond == null; if(!all) active=new bool[nx+1][ny+1]; real dx=1/nx; real dy=1/ny; pair Idy=(0,dy); pair dz=(dx,dy); real[][] F=new real[nx+1][ny+1]; real[] x=uniform(pic.scale.x.T,pic.scale.x.Tinv,a.x,b.x,nx); real[] y=uniform(pic.scale.y.T,pic.scale.y.Tinv,a.y,b.y,ny); for(int i=0; i <= nx; ++i) { bool[] activei=all ? null : active[i]; real[] Fi=F[i]; real x=x[i]; for(int j=0; j <= ny; ++j) { pair z=(x,y[j]); Fi[j]=f(z); if(!all) activei[j]=cond(z); } } return surface(pic,F,x,y,xsplinetype,ysplinetype,active); } guide3[][] lift(real f(real x, real y), guide[][] g, interpolate3 join=operator --) { guide3[][] G=new guide3[g.length][]; for(int cnt=0; cnt < g.length; ++cnt) { guide[] gcnt=g[cnt]; guide3[] Gcnt=new guide3[gcnt.length]; for(int i=0; i < gcnt.length; ++i) { guide gcnti=gcnt[i]; guide3 Gcnti=join(...sequence(new guide3(int j) { pair z=point(gcnti,j); return (z.x,z.y,f(z.x,z.y)); },size(gcnti))); if(cyclic(gcnti)) Gcnti=Gcnti..cycle; Gcnt[i]=Gcnti; } G[cnt]=Gcnt; } return G; } guide3[][] lift(real f(pair z), guide[][] g, interpolate3 join=operator --) { return lift(new real(real x, real y) {return f((x,y));},g,join); } void draw(picture pic=currentpicture, Label[] L=new Label[], guide3[][] g, pen[] p, light light=currentlight, string name="", render render=defaultrender, interaction interaction=LabelInteraction()) { pen thin=is3D() ? thin() : defaultpen; bool group=g.length > 1 && (name != "" || render.defaultnames); if(group) begingroup3(pic,name == "" ? "contours" : name,render); for(int cnt=0; cnt < g.length; ++cnt) { guide3[] gcnt=g[cnt]; pen pcnt=thin+p[cnt]; for(int i=0; i < gcnt.length; ++i) draw(pic,gcnt[i],pcnt,light,name); if(L.length > 0) { Label Lcnt=L[cnt]; for(int i=0; i < gcnt.length; ++i) { if(Lcnt.s != "" && size(gcnt[i]) > 1) label(pic,Lcnt,gcnt[i],pcnt,name,interaction); } } } if(group) endgroup3(pic); } void draw(picture pic=currentpicture, Label[] L=new Label[], guide3[][] g, pen p=currentpen, light light=currentlight, string name="", render render=defaultrender, interaction interaction=LabelInteraction()) { draw(pic,L,g,sequence(new pen(int) {return p;},g.length),light,name, render,interaction); } real maxlength(triple f(pair z), pair a, pair b, int nu, int nv) { return min(abs(f((b.x,a.y))-f(a))/nu,abs(f((a.x,b.y))-f(a))/nv); } // return a vector field on a parametric surface f over box(a,b). picture vectorfield(path3 vector(pair v), triple f(pair z), pair a, pair b, int nu=nmesh, int nv=nu, bool truesize=false, real maxlength=truesize ? 0 : maxlength(f,a,b,nu,nv), bool cond(pair z)=null, pen p=currentpen, arrowbar3 arrow=Arrow3, margin3 margin=PenMargin3, string name="", render render=defaultrender) { picture pic; real du=(b.x-a.x)/(nu-1); real dv=(b.y-a.y)/(nv-1); bool all=cond == null; real scale; if(maxlength > 0) { real size(pair z) { path3 g=vector(z); triple w=point(g,size(g)-1)-point(g,0); return max(w.x,w.y,w.z); } real max=size(a); for(int i=0; i <= nu; ++i) { real u=a.x+i*du; for(int j=0; j < nv; ++j) { real v=a.y+j*dv; max=max(max,size((u,v))); } } scale=max > 0 ? maxlength/max : 1; } else scale=1; bool group=name != "" || render.defaultnames; if(group) begingroup3(pic,name == "" ? "vectorfield" : name,render); for(int i=0; i <= nu; ++i) { real u=a.x+i*du; for(int j=0; j <= nv; ++j) { real v=a.y+j*dv; pair z=(u,v); if(all || cond(z)) { path3 g=scale3(scale)*vector(z); string name="vector"; if(truesize) { picture opic; draw(opic,g,p,arrow,margin,name,render); add(pic,opic,f(z)); } else draw(pic,shift(f(z))*g,p,arrow,margin,name,render); } } } if(group) endgroup3(pic); return pic; } triple polar(real r, real theta, real phi) { return r*expi(theta,phi); } guide3 polargraph(real r(real,real), real theta(real), real phi(real), int n=ngraph, interpolate3 join=operator --) { return graph(join)(new triple(real t) { return polar(r(theta(t),phi(t)),theta(t),phi(t)); },0,1,n); } // True arc path3 Arc(triple c, triple v1, triple v2, triple normal=O, bool direction=CCW, int n=nCircle) { v1 -= c; real r=abs(v1); v1=unit(v1); v2=unit(v2-c); if(normal == O) { normal=cross(v1,v2); if(normal == O) abort("explicit normal required for these endpoints"); } transform3 T=align(unit(normal)); transform3 Tinv=transpose(T); v1=Tinv*v1; v2=Tinv*v2; real fuzz=sqrtEpsilon*max(abs(v1),abs(v2)); if(abs(v1.z) > fuzz || abs(v2.z) > fuzz) abort("invalid normal vector"); real phi1=radians(longitude(v1,warn=false)); real phi2=radians(longitude(v2,warn=false)); if(direction) { if(phi1 >= phi2) phi1 -= 2pi; } else if(phi2 >= phi1) phi2 -= 2pi; static real piby2=pi/2; return shift(c)*T*polargraph(new real(real theta, real phi) {return r;}, new real(real t) {return piby2;}, new real(real t) {return interp(phi1,phi2,t);}, n,operator ..); } path3 Arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=O, bool direction, int n=nCircle) { return Arc(c,c+r*dir(theta1,phi1),c+r*dir(theta2,phi2),normal,direction,n); } path3 Arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=O, int n=nCircle) { return Arc(c,r,theta1,phi1,theta2,phi2,normal, theta2 > theta1 || (theta2 == theta1 && phi2 >= phi1) ? CCW : CW, n); } // True circle path3 Circle(triple c, real r, triple normal=Z, int n=nCircle) { static real piby2=pi/2; return shift(c)*align(unit(normal))* polargraph(new real(real theta, real phi) {return r;}, new real(real t) {return piby2;}, new real(real t) {return interp(0,2pi,t);},n,operator ..); } asymptote-3.05/base/syzygy.asy0000644000000000000000000005464215031566105015207 0ustar rootroot/***** syzygy.asy {{{1 * Andy Hammerlindl 2006/12/02 * * Automates the drawing of braids, relations, and syzygies, along with the * corresponding equations. * * See * http://katlas.math.toronto.edu/drorbn/index.php?title=06-1350/Syzygies_in_Asymptote * For more information. *****/ struct Component { // {{{1 // The number of strings coming in or out of the component. int in; int out; // Which 'out' string each 'in' string is connected to. For deriving // equations. int[] connections; string symbol; // For pullback notation. string lsym; // For linear equations. string codename; // For Mathematica code. guide[] draw(picture pic, guide[] ins); } // Utility functions {{{1 pair[] endpoints(guide[] a) { pair[] z; for (int i=0; i M.x) M=(z[i].x,M.y); if (z[i].y > M.y) M=(M.x,z[i].y); } return M; } // Component Definitions {{{1 real hwratio=1.4; real gapfactor=6; Component bp=new Component; bp.in=2; bp.out=2; bp.connections=new int[] {1,0}; bp.symbol="B^+"; bp.lsym="b^+"; bp.codename="bp"; bp.draw=new guide[] (picture pic, guide[] ins) { pair[] z=endpoints(ins); pair m=min(z), M=max(z); real w=M.x-m.x, h=hwratio*w; pair centre=(0.5(m.x+M.x),M.y+h/2); /* return new guide[] {ins[1]..centre{NW}..z[0]+h*N, ins[0]..centre{NE}..z[1]+h*N}; */ real offset=gapfactor*linewidth(currentpen); draw(pic, ins[1]..(centre-offset*NW){NW}); return new guide[] {(centre+offset*NW){NW}..z[0]+h*N, ins[0]..centre{NE}..z[1]+h*N}; }; Component bm=new Component; bm.in=2; bm.out=2; bm.connections=new int[] {1,0}; bm.symbol="B^-"; bm.lsym="b^-"; bm.codename="bm"; bm.draw=new guide[] (picture pic, guide[] ins) { pair[] z=endpoints(ins); pair m=min(z), M=max(z); real w=M.x-m.x, h=hwratio*w; pair centre=(0.5(m.x+M.x),M.y+h/2); /* return new guide[] {ins[1]..centre{NW}..z[0]+h*N, ins[0]..centre{NE}..z[1]+h*N}; */ real offset=gapfactor*linewidth(currentpen); draw(pic, ins[0]..(centre-offset*NE){NE}); return new guide[] {ins[1]..centre{NW}..z[0]+h*N, (centre+offset*NE){NE}..z[1]+h*N}; }; Component phi=new Component; phi.in=2; phi.out=1; phi.connections=new int[] {0,0}; phi.symbol="\Phi"; phi.lsym="\phi"; phi.codename="phi"; phi.draw=new guide[] (picture pic, guide[] ins) { pair[] z=endpoints(ins); pair m=min(z), M=max(z); real w=M.x-m.x, h=hwratio*w; pair centre=(0.5(m.x+M.x),M.y+h/2); //real offset=4*linewidth(currentpen); draw(pic, ins[0]..centre{NE}); draw(pic, ins[1]..centre{NW}); draw(pic, centre,linewidth(5*linewidth(currentpen))); dot(pic, centre); return new guide[] {centre..centre+0.5h*N}; }; Component wye=new Component; wye.in=1; wye.out=2; wye.connections=null; // TODO: Fix this! wye.symbol="Y"; wye.lsym="y"; wye.codename="wye"; wye.draw=new guide[] (picture pic, guide[] ins) { pair z=endpoint(ins[0]); real w=10, h=hwratio*w; // The 10 is a guess here, and may produce badness. pair centre=(z.x,z.y+h/2); draw(pic, ins[0]..centre); draw(pic, centre,linewidth(5*linewidth(currentpen))); return new guide[] {centre{NW}..centre+(-0.5w,0.5h), centre{NE}..centre+(0.5w,0.5h)}; }; struct Braid { // {{{1 // Members {{{2 // Number of lines initially. int n; struct Placement { Component c; int place; Placement copy() { Placement p=new Placement; p.c=this.c; p.place=this.place; return p; } } Placement[] places; void add(Component c, int place) { Placement p=new Placement; p.c=c; p.place=place; places.push(p); } void add(Braid sub, int place) { for (int i=0; i= minheight ? ins[i] : ins[i]..(z[i].x,minheight)); } } void draw(picture pic, guide[] ins, real minheight=0) { int steps=places.length; guide[] nodes=ins; for (int i=0; ij) return swap(j,i); else { assert(j==i+1); assert(swapable(places[i],places[j])); Placement p=places[i].copy(); Placement q=places[j].copy(); /*write("swap:"); write("p originally at " + (string)p.place); write("q originally at " + (string)q.place); write("p.c.in: " + (string)p.c.in + " p.c.out: " + (string)p.c.out); write("q.c.in: " + (string)q.c.in + " q.c.out: " + (string)q.c.out);*/ if (q.place + q.c.in <= p.place) // q is left of p - adjust for q renumbering strings. p.place+=q.c.out-q.c.in; else if (p.place + p.c.out <= q.place) // q is right of p - adjust for p renumbering strings. q.place+=p.c.in-p.c.out; else // q is directly on top of p assert(false, "swapable"); /*write("q now at " + (string)q.place); write("p now at " + (string)p.place);*/ Braid b=this.copy(); b.places[i]=q; b.places[j]=p; return b; } } // Tests if the component at index 'start' can be moved to index 'end' // without interfering with other components. bool moveable(int start, int end) { assert(start= sub.places.length) return true; // The next component to match. Placement p=sub.places[acc.length]; // Start looking immediately after the last match. for (int step=acc[acc.length-1]+1; step= sub.places.length) return true; // The next component to match. Placement p=sub.places[acc.length]; // Start looking immediately after the last match. for (int step=acc[acc.length-1]+1; step place && q.place < place + size) { // It's in the window, so it must match the next component in the // subbraid. if (p.c==q.c && p.place+place==q.place) { // A match - go on to the next component. acc.push(step); return tryMatch(sub, place, size, acc); // TODO: Adjust place/size. } else return false; } // TODO: Adjust place and size. } // We've run out of components to match. return false; } // This attempts to find a subbraid within the braid. It allows other // components to be interspersed with the components of the subbraid so long // as they don't occur on the same string as the ones the subbraid lies on. // Returns null on failure. int[] match(Braid sub, int place) { for (int i=0; i<=this.places.length-sub.places.length; ++i) { // Find where the first component of the subbraid matches and try to // match the rest of the braid starting from there. if (matchComponent(sub, 0, place, i)) { int[] result; result.push(i); if (tryMatch(sub,place,sub.n,result)) return result; } } return null; } // Equations {{{2 // Returns the string that 'place' moves to when going through the section // with Placement p. static int advancePast(Placement p, int place) { // If it's to the left of the component, it is unaffected. return place=0 && place=0 && step0) s+=" "; s+=stepToFormula(step); } return s; } } string windowToLinear(int step, int w_place, int w_size) { int[] a=pullbackWindow(step, w_place, w_size); string s="("; for (int arg=1; arg<=w_size+1; ++arg) { if (arg>1) s+=","; bool first=true; for (int var=0; var1) s+=", "; bool first=true; for (int var=0; var1) s+=","; bool first=true; for (int var=0; var0) s+= subtract ? " - " : " + "; s+=stepToLinear(step); } return s; } } string toCode(bool subtract=false) { if (places.length==0) return subtract ? "0" : ""; // or "1" ? else { string s = subtract ? " - " : ""; for (int step=0; step0) s+= subtract ? " - " : " + "; s+=stepToCode(step); } return s; } } } struct Relation { // {{{1 Braid lhs, rhs; string lsym, codename; bool inverted=false; string toFormula() { return lhs.toFormula() + " = " + rhs.toFormula(); } string linearName() { assert(lhs.n==rhs.n); assert(lsym!=""); string s=(inverted ? "-" : "") + lsym+"("; for (int i=1; i<=lhs.n+1; ++i) { if (i>1) s+=","; s+="x_"+(string)i; } return s+")"; } string fullCodeName() { assert(lhs.n==rhs.n); assert(codename!=""); string s=(inverted ? "minus" : "") + codename+"["; for (int i=1; i<=lhs.n+1; ++i) { if (i>1) s+=", "; s+="x"+(string)i+"_"; } return s+"]"; } string toLinear() { return linearName() + " = " + lhs.toLinear() + rhs.toLinear(true); } string toCode() { return fullCodeName() + " :> " + lhs.toCode() + rhs.toCode(true); } void draw(picture pic=currentpicture) { picture left; lhs.draw(left); frame l=left.fit(); picture right; rhs.draw(right); frame r=right.fit(); real xpad=30; add(pic, l); label(pic, "=", (max(l).x + 0.5xpad, 0.25(max(l).y+max(r).y))); add(pic, r, (max(l).x+xpad,0)); } } Relation operator- (Relation r) { Relation opposite; opposite.lhs=r.rhs; opposite.rhs=r.lhs; opposite.lsym=r.lsym; opposite.codename=r.codename; opposite.inverted=!r.inverted; return opposite; } Braid apply(Relation r, Braid b, int step, int place) { bool valid=b.exactMatch(r.lhs,place,step); if (valid) { Braid result=new Braid; result.n=b.n; for (int i=0; i M.x) M=(z.x,M.y); if (z.y > M.y) M=(M.x,z.y); } picture pic; real xpad=2.0, ypad=1.3; void place(int index, real row, real column) { pair z=((M.x*xpad)*column,(M.y*ypad)*row); add(pic, cards[index], z); if (number) { label(pic,(string)index, z+(0.5M.x,0), S); } } // Handle small collections. if (n<=4) { for (int i=0; i1) s+=","; s+="x_"+(string)i; } return s+")"; } string fullCodeName() { assert(codename!=""); string s=codename+"["; for (int i=1; i<=initial.n+1; ++i) { if (i>1) s+=", "; s+="x"+(string)i+"_"; } return s+"]"; } string toLinear() { string s=linearName()+" = "; Braid b=initial; bool first=true; for (int i=0; i "; Braid b=initial; bool first=true; for (int i=0; i= 508 || !exists("did_asy_syn_inits") if version < 508 let did_asy_syn_inits = 1 command -nargs=+ HiLink hi link else command -nargs=+ HiLink hi def link endif HiLink asyCommentL asyComment HiLink asyConditional Conditional HiLink asyRepeat Repeat HiLink asyNumber Number HiLink asyNumberError asyError HiLink asyCurlyError asyError HiLink asyBracketError asyError HiLink asyParenError asyError HiLink asyCommentError asyError HiLink asyCommentStartError asyError HiLink asyOperator Operator HiLink asyStructure Structure HiLink asyStorageClass StorageClass HiLink asyExternal Include HiLink asyDefine Macro HiLink asyError Error HiLink asyStatement Statement HiLink asyType Type HiLink asyConstant Constant HiLink asyCommentString asyString HiLink asyCommentCString asyString HiLink asyCommentLString asyString HiLink asyCommentLCString asyString HiLink asyCommentSkip asyComment HiLink asyString String HiLink asyCString String HiLink asyComment Comment HiLink asySpecial SpecialChar HiLink asyCSpecial SpecialChar HiLink asyTodo Todo HiLink asyPathSpec Statement delcommand HiLink endif let b:current_syntax = "c" asymptote-3.05/base/res/0000755000000000000000000000000015031566105013671 5ustar rootrootasymptote-3.05/base/res/notes.txt0000644000000000000000000000044115031566105015561 0ustar rootrootFor now, I decide not to commit in the *.hdr reflectance image files because of the size and that they are binary format. Meanwhile, the images I use (temporarily) can be found at: - - -- Supakorn "Jamie"asymptote-3.05/Delaunay.cc0000644000000000000000000001337315031566105014246 0ustar rootroot// Robust version of Gilles Dumoulin's C++ port of Paul Bourke's // triangulation code available from // http://astronomy.swin.edu.au/~pbourke/papers/triangulate // Used with permission of Paul Bourke. // Segmentation fault and numerical robustness improvements by John C. Bowman #include #include "Delaunay.h" #include "predicates.h" inline double max(double a, double b) { return (a > b) ? a : b; } int XYZCompare(const void *v1, const void *v2) { double x1=((XYZ*)v1)->p[0]; double x2=((XYZ*)v2)->p[0]; if(x1 < x2) return(-1); else if(x1 > x2) return(1); else return(0); } inline double hypot2(double *x) { return x[0]*x[0]+x[1]*x[1]; } /////////////////////////////////////////////////////////////////////////////// // Triangulate(): // Triangulation subroutine // Takes as input NV vertices in array pxyz // Returned is a list of ntri triangular faces in the array v // These triangles are arranged in a consistent clockwise order. // The triangle array v should be allocated to 4 * nv // The vertex array pxyz must be big enough to hold 3 additional points. // By default, the array pxyz is automatically presorted and postsorted. /////////////////////////////////////////////////////////////////////////////// Int Triangulate(Int nv, XYZ pxyz[], ITRIANGLE v[], Int &ntri, bool presort, bool postsort) { Int emax = 200; if(presort) qsort(pxyz,nv,sizeof(XYZ),XYZCompare); else postsort=false; /* Allocate memory for the completeness list, flag for each triangle */ Int trimax = 4 * nv; Int *complete = new Int[trimax]; /* Allocate memory for the edge list */ IEDGE *edges = new IEDGE[emax]; /* Find the maximum and minimum vertex bounds. This is to allow calculation of the bounding triangle */ double xmin = pxyz[0].p[0]; double ymin = pxyz[0].p[1]; double xmax = xmin; double ymax = ymin; for(Int i = 1; i < nv; i++) { XYZ *pxyzi=pxyz+i; double x=pxyzi->p[0]; double y=pxyzi->p[1]; if (x < xmin) xmin = x; if (x > xmax) xmax = x; if (y < ymin) ymin = y; if (y > ymax) ymax = y; } double dx = xmax - xmin; double dy = ymax - ymin; /* Set up the supertriangle. This is a triangle which encompasses all the sample points. The supertriangle coordinates are added to the end of the vertex list. The supertriangle is the first triangle in the triangle list. */ static const double margin=0.01; double xmargin=margin*dx; double ymargin=margin*dy; pxyz[nv+0].p[0] = xmin-xmargin; pxyz[nv+0].p[1] = ymin-ymargin; pxyz[nv+1].p[0] = xmin-xmargin; pxyz[nv+1].p[1] = ymax+ymargin+dx; pxyz[nv+2].p[0] = xmax+xmargin+dy; pxyz[nv+2].p[1] = ymin-ymargin; v->p1 = nv; v->p2 = nv+1; v->p3 = nv+2; complete[0] = false; ntri = 1; /* Include each point one at a time into the existing mesh */ for(Int i = 0; i < nv; i++) { Int nedge = 0; double *d=pxyz[i].p; /* Set up the edge buffer. If the point d lies inside the circumcircle then the three edges of that triangle are added to the edge buffer and that triangle is removed. */ for(Int j = 0; j < ntri; j++) { if(complete[j]) continue; ITRIANGLE *vj=v+j; double *a=pxyz[vj->p1].p; double *b=pxyz[vj->p2].p; double *c=pxyz[vj->p3].p; if(incircle(a,b,c,d) <= 0.0) { // Point d is inside or on circumcircle /* Check that we haven't exceeded the edge list size */ if(nedge + 3 >= emax) { emax += 100; IEDGE *p_EdgeTemp = new IEDGE[emax]; for (Int i = 0; i < nedge; i++) { p_EdgeTemp[i] = edges[i]; } delete[] edges; edges = p_EdgeTemp; } ITRIANGLE *vj=v+j; Int p1=vj->p1; Int p2=vj->p2; Int p3=vj->p3; edges[nedge].p1 = p1; edges[nedge].p2 = p2; edges[++nedge].p1 = p2; edges[nedge].p2 = p3; edges[++nedge].p1 = p3; edges[nedge].p2 = p1; ++nedge; ntri--; v[j] = v[ntri]; complete[j] = complete[ntri]; j--; } else { double A=hypot2(a); double B=hypot2(b); double C=hypot2(c); double a0=orient2d(a,b,c); // Is d[0] > xc+r for circumcircle abc of radius r about (xc,yc)? if(d[0]*a0 < 0.5*orient2d(A,a[1],B,b[1],C,c[1])) complete[j]= incircle(a[0]*a0,a[1]*a0,b[0]*a0,b[1]*a0,c[0]*a0,c[1]*a0, d[0]*a0,0.5*orient2d(a[0],A,b[0],B,c[0],C)) > 0.0; } } /* Tag multiple edges Note: if all triangles are specified anticlockwise then all interior edges are opposite pointing in direction. */ for(Int j = 0; j < nedge - 1; j++) { for(Int k = j + 1; k < nedge; k++) { if((edges[j].p1 == edges[k].p2) && (edges[j].p2 == edges[k].p1)) { edges[j].p1 = -1; edges[j].p2 = -1; edges[k].p1 = -1; edges[k].p2 = -1; } } } /* Form new triangles for the current point Skipping over any tagged edges. All edges are arranged in clockwise order. */ for(Int j = 0; j < nedge; j++) { if(edges[j].p1 < 0 || edges[j].p2 < 0) continue; v[ntri].p1 = edges[j].p1; v[ntri].p2 = edges[j].p2; v[ntri].p3 = i; complete[ntri] = false; ntri++; assert(ntri < trimax); } } /* Remove triangles with supertriangle vertices These are triangles which have a vertex number greater than nv */ for(Int i = 0; i < ntri; i++) { ITRIANGLE *vi=v+i; if(vi->p1 >= nv || vi->p2 >= nv || vi->p3 >= nv) { ntri--; *vi = v[ntri]; i--; } } delete[] edges; delete[] complete; if(postsort) { for(Int i = 0; i < ntri; i++) { ITRIANGLE *vi=v+i; vi->p1=pxyz[vi->p1].i; vi->p2=pxyz[vi->p2].i; vi->p3=pxyz[vi->p3].i; } } return 0; } asymptote-3.05/mod.h0000644000000000000000000000150415031566105013116 0ustar rootroot/***** * mod.h * Andy Hammerlindl 2005/03/16 * * Definition of implementation-independent mod function. *****/ #ifndef MOD_H #define MOD_H #include #include "common.h" using std::fmod; inline Int Mod(Int x, Int y) {return x % y;} inline double Mod(double x, double y) {return fmod(x,y);} template inline T portableMod(T x,T y) { // Implementation-independent definition of mod; ensure result has // same sign as divisor T val=Mod(x,y); return ((y > 0 && val >= 0) || (y < 0 && val <= 0)) ? val : val+y; } inline Int imod(Int x, size_t y) { if((y & (y-1)) == 0) return x & (y-1); // Use mask if y is a power of two x %= (Int) y; return (x >= 0) ? x : x+(Int) y; } inline Int imod(Int x, Int y) { if(y > 0) return imod(x,(size_t) y); else return portableMod(x,y); } #endif asymptote-3.05/guide.h0000644000000000000000000001510515031566105013436 0ustar rootroot/***** * guide.h * Andy Hammerlindl 2005/02/23 * *****/ #ifndef GUIDE_H #define GUIDE_H #include #include "knot.h" #include "flatguide.h" #include "settings.h" namespace camp { // Abstract base class for guides. class guide : public gc { protected: public: virtual ~guide() {} // Returns the path that the guide represents. virtual path solve() { return path(); } // Add the information in the guide to the flatguide, so that it can be // solved via the knotlist solving routines. // Returns true if guide has an interior cycle token. virtual void flatten(flatguide&, bool allowsolve=true)=0; virtual bool cyclic() {return false;} virtual void print(ostream& out) const { out << "nullpath"; } // Needed so that multiguide can know where to put in ".." symbols. virtual side printLocation() const { return END; } }; inline ostream& operator<< (ostream& out, const guide& g) { g.print(out); return out; } // Draws dots between two printings of guides, if their locations are such that // the dots are necessary. inline void adjustLocation(ostream& out, side l1, side l2) { if (l1 == END) out << endl; if ((l1 == END || l1 == OUT) && (l2 == IN || l2 == END)) out << ".."; } // A guide representing a pair. class pairguide : public guide { pair z; public: void flatten(flatguide& g, bool=true) { g.add(z); } pairguide(pair z) : z(z) {} path solve() { return path(z); } void print(ostream& out) const { out << z; } side printLocation() const { return END; } }; // A guide representing a path. class pathguide : public guide { path p; public: void flatten(flatguide& g, bool allowsolve=true) { g.add(p,allowsolve); } pathguide(path p) : p(p) {} path solve() { return p; } bool cyclic() {return p.cyclic();} void print(ostream& out) const { out << p; } side printLocation() const { return END; } }; // Tension expressions are evaluated to this class before being cast to a guide, // so that they can be cast to other types (such as guide3) instead. class tensionSpecifier : public gc { double out,in; bool atleast; public: tensionSpecifier(double val, bool atleast=false) : out(val), in(val), atleast(atleast) {} tensionSpecifier(double out, double in, bool atleast=false) : out(out), in(in), atleast(atleast) {} double getOut() const { return out; } double getIn() const { return in; } bool getAtleast() const { return atleast; } }; // A guide giving tension information (as part of a join). class tensionguide : public guide { tension tout,tin; public: void flatten(flatguide& g, bool=true) { g.setTension(tin,IN); g.setTension(tout,OUT); } tensionguide(tensionSpecifier spec) : tout(spec.getOut(), spec.getAtleast()), tin(spec.getIn(), spec.getAtleast()) {} void print(ostream& out) const { out << (tout.atleast ? ".. tension atleast " : ".. tension ") << tout.val << " and " << tin.val << " .."; } side printLocation() const { return JOIN; } }; // Similar to tensionSpecifier, curl expression are evaluated to this type // before being cast to guides. class curlSpecifier : public gc { double value; side s; public: curlSpecifier(double value, side s) : value(value), s(s) {} double getValue() const { return value; } side getSide() const { return s; } }; // A guide giving a specifier. class specguide : public guide { spec *p; side s; public: void flatten(flatguide& g, bool=true) { g.setSpec(p,s); } specguide(spec *p, side s) : p(p), s(s) {} specguide(curlSpecifier spec) : p(new curlSpec(spec.getValue())), s(spec.getSide()) {} void print(ostream& out) const { out << *p; } side printLocation() const { return s; } }; // A guide for explicit control points between two knots. This could be done // with two specguides, instead, but this prints nicer, and is easier to encode. class controlguide : public guide { pair zout, zin; public: void flatten(flatguide& g, bool=true) { g.setSpec(new controlSpec(zout), OUT); g.setSpec(new controlSpec(zin), IN); } controlguide(pair zout,pair zin) : zout(zout),zin(zin) {} controlguide(pair z) : zout(z),zin(z) {} void print(ostream& out) const { out << ".. controls " << zout << " and " << zin << " .."; } side printLocation() const { return JOIN; } }; // A guide that is a sequence of other guides. This is used, for instance is // joins, where we have the left and right guide, and possibly specifiers and // tensions in between. typedef mem::vector guidevector; // A multiguide represents a guide given by the first "length" items of // the vector pointed to by "base". // The constructor, if given another multiguide as a first argument, // will try to avoid allocating a new "base" array. class multiguide : public guide { guidevector *base; size_t length; guide *subguide(size_t i) const { assert(i < length); assert(length <= base->size()); return (*base)[i]; } public: multiguide(guidevector& v); void flatten(flatguide&, bool=true); bool cyclic() { size_t n=length; if(n < 1) return false; return subguide(n-1)->cyclic(); } path solve() { if (settings::verbose>3) { cerr << "solving guide:\n"; print(cerr); cerr << "\n\n"; } flatguide g; this->flatten(g); path p=g.solve(false); if (settings::verbose>3) cerr << "solved as:\n" << p << "\n\n"; return p; } void print(ostream& out) const; side printLocation() const { int n = length; return subguide(n-1)->printLocation(); } }; struct cycleToken : public gc {}; // A guide representing the cycle token. class cycletokguide : public guide { public: void flatten(flatguide& g, bool allowsolve=true) { // If cycles occur in the midst of a guide, the guide up to that point // should be solved as a path. Any subsequent guide will work with that // path locked in place. if(allowsolve) g.solve(true); else g.close(); } bool cyclic() {return true;} path solve() { // Just a cycle on it's own makes an empty guide. return path(); } void print(ostream& out) const { out << "cycle"; } side printLocation() const { return END; } }; } // namespace camp GC_DECLARE_PTRFREE(camp::pairguide); GC_DECLARE_PTRFREE(camp::tensionSpecifier); GC_DECLARE_PTRFREE(camp::tensionguide); GC_DECLARE_PTRFREE(camp::curlSpecifier); GC_DECLARE_PTRFREE(camp::controlguide); GC_DECLARE_PTRFREE(camp::cycleToken); GC_DECLARE_PTRFREE(camp::cycletokguide); #endif // GUIDE_H asymptote-3.05/interact.h0000644000000000000000000000346715031566105014162 0ustar rootroot/***** * interact.h * * The glue between the lexical analyzer and the readline library. *****/ #ifndef INTERACT_H #define INTERACT_H #include "common.h" #ifdef HAVE_LIBCURSES #ifdef HAVE_LIBREADLINE #include #include #else #ifdef HAVE_LIBEDIT // Work around incorrect declaration in NetBSD readline.h v1.33 #define rl_completion_entry_function rl_completion_entry_function_declaration #ifdef HAVE_EDITLINE_READLINE_H #include #else #include #endif #undef rl_completion_entry_function extern "C" rl_compentry_func_t *rl_completion_entry_function; #endif #endif #endif void interruptHandler(int); namespace interact { extern bool interactive; extern bool uptodate; extern int lines; // Interactive scroll count extern bool query; // Enable interactive scrolling; void init_interactive(); // Read a line from the input, without any processing. string simpleline(string prompt); // Add a line of input to the readline history. void addToHistory(string line); // Functions to work with the most recently entered line in the history. string getLastHistoryLine(); void setLastHistoryLine(string line); // Remove the line last added to the history. void deleteLastLine(); // Write out the history of input lines to the history file. void cleanup_interactive(); // This class is used to set a text completion function for readline. A class // is used instead the usual function pointer so that information such as the // current environment can be coded into the function (mimicking a closure). class completer { public: virtual ~completer() {}; virtual char *operator () (const char *text, int state) = 0; }; void setCompleter(completer *c); #define YY_READ_BUF_SIZE YY_BUF_SIZE void init_readline(bool tabcompletion); } #endif // INTERACT_H asymptote-3.05/INSTALL-VCPKG.md0000644000000000000000000000704415031566105014473 0ustar rootroot# Building Asymptote with VCPKG and CMake ## Dependency management The recommended way is to use [vcpkg](https://vcpkg.io/). Clone vcpkg to your system, run bootstrap script and ensure `VCPKG_ROOT` environment is exported as set as path to your vcpkg repository. For example, ```bash cd ~/dev/ git clone https://github.com/microsoft/vcpkg.git cd vcpkg && ./bootstrap-vcpkg.sh export VCPKG_ROOT=~/dev/vcpkg ``` # On Windows See INSTALL-WIN.md for windows-specific instructions. ## Linux-specific dependency (Experimental) Make sure flex and bison is available in path, if not, install them manually first. ```bash # This is specific to arch linux, other distributions might use a different name sudo pacman -S flex bison ``` For OpenGL, make sure all relevant dependencies for freeglut is installed. The relevant dependencies should be shown during vcpkg install ## Using CMake ### Quick start (Linux) Make sure `ninja` and `cmake`, `python3` and `perl` are installed, as well as `gcc`. Then run ```bash mkdir -p cmake-build-linux/release cmake --preset linux/release cmake --build --preset linux/release --target asy-with-basefiles ``` The asymptote binary should be available in `cmake-build-linux/release` directory. ### On Debug Builds One thing you may notice is that we do not provide a debug build preset. This is intentional since anyone developing might want to add configurations specific to their system (such as a particular clang they want to use for preprocessing), or for vendor-specific configurations (e.g. selecting a particular toolchain in CLion). Our recommendation is to create your own debug presets in `CMakeUserPresets.json` - for example, for my (Jamie's) setup: ```json { "version": 6, "cmakeMinimumRequired": { "major": 3, "minor": 26, "patch": 0 }, "configurePresets": [ { "name": "msvc/debug-clion+vs", "displayName": "[MSVC-x86/64] Debug (With preset environment vars)", "binaryDir": "${sourceDir}/cmake-build-msvc/debug", "inherits": ["base/buildBaseWithVcpkg", "base/debug", "base/gccCompatCacheVar", "base/windows-only"], "environment": { "GCCCOMPAT_CXX_COMPILER_FOR_MSVC": "C:\\msys64\\clang64\\bin\\clang++.exe" }, "vendor": { "jetbrains.com/clion": { "toolchain": "MSVC" } } }, { "name": "linux/debug-clion+vs", "displayName": "[linux-x86/64] Debug (With preset environment vars)", "binaryDir": "${sourceDir}/cmake-build-linux/debug", "inherits": [ "base/buildBaseWithVcpkg", "base/debug" ], "environment": { "VCPKG_ROOT": "$env{HOME}/dev/vcpkg" }, "vendor": { "jetbrains.com/clion": { "toolchain": "WSL" } } } ] } ``` ### Additional build information One can specify additional package string (this is useful for CI for denoting build revision). To do this, add a file called `asy-pkg-version-suffix.cmake` with a cmake command ```cmake set(ASY_VERSION_SUFFIX "") ``` This suffix will get embedded into the final asymptote version. If this file is not specified, the default suffix is "+debug" for debug builds, or an empty string for all other builds, including release builds ## Testing Asymptote unit testing is integerated into CMake's `CTest` framework. All Asymptote `.asy` based tests are named `asy..` excluding `*.asy` extension. These tests can be run by CTest. For example, after building on linux/release, ```bash ctest --test-dir cmake-build-linux/release/ -R "asy.types.*" ``` asymptote-3.05/entry.h0000644000000000000000000003452015031566105013504 0ustar rootroot/***** * entry.h * Andy Hammerlindl 2002/08/29 * * All variables, built-in functions and user-defined functions reside * within the same namespace. To keep track of all these, a table of * "entries" is used. *****/ #ifndef ENTRY_H #define ENTRY_H #include #include "common.h" #include "frame.h" #include "table.h" #include "types.h" #include "modifier.h" using sym::symbol; using types::ty; using types::signature; // Forward declaration. namespace types { class record; } using types::record; namespace trans { // An entry is associated to a name in the (variable or type) environment, and // has permission based on the enclosing records where it was defined or // imported. class entry : public gc { struct pr { permission perm; record *r; pr(permission perm, record *r) : perm(perm), r(r) {} // Returns true if the permission allows access in this context. bool check(action act, coder &c); // Reports an error if permission is not allowed. void report(action act, position pos, coder &c); }; mem::list perms; void addPerm(permission perm, record *r) { // Only store restrictive permissions. if (perm != PUBLIC && r) perms.push_back(pr(perm,r)); } // The record where the variable or type is defined, or 0 if the entry is // not a field. record *where; // The location (file and line number) where the entry was defined. position pos; public: entry(record *where, position pos) : where(where), pos(pos) {} entry(permission perm, record *r, record *where, position pos) : where(where), pos(pos) { addPerm(perm, r); } // (Non-destructively) merges two entries, appending permission lists. // The 'where' member is taken from the second entry. entry(entry &e1, entry &e2); // Create an entry with one more permission in the list. entry(entry &base, permission perm, record *r); bool checkPerm(action act, coder &c); void reportPerm(action act, position pos, coder &c); record *whereDefined() { return where; } position getPos() { return pos; } }; class varEntry : public entry { ty *t; access *location; public: varEntry(ty *t, access *location, record *where, position pos) : entry(where, pos), t(t), location(location) {} varEntry(ty *t, access *location, permission perm, record *r, record *where, position pos) : entry(perm, r, where, pos), t(t), location(location) {} // (Non-destructively) merges two varEntries, creating a qualified varEntry. varEntry(varEntry &qv, varEntry &v); // Copies the original varEntry and adds a new permission constraint. varEntry(varEntry &base, permission perm, record *r) : entry(base, perm, r), t(base.t), location(base.location) {} ty *getType() { return t; } signature *getSignature() { return t->getSignature(); } access *getLocation() { return location; } frame *getLevel(); // Encodes the access, but also checks permissions. void encode(action act, position pos, coder &c); void encode(action act, position pos, coder &c, frame *top); }; varEntry *qualifyVarEntry(varEntry *qv, varEntry *v); // As looked-up types can be allocated in a new expression, we need to know // what frame they should be allocated on. Type entries store this extra // information along with the type. class tyEntry : public entry { public: ty *t; varEntry *v; // NOTE: Name isn't very descriptive. tyEntry(ty *t, varEntry *v, record *where, position pos) : entry(where, pos), t(t), v(v) {} tyEntry(tyEntry *base, permission perm, record *r) : entry(*base, perm, r), t(base->t), v(base->v) {} // Records need a varEntry that refers back to the qualifier qv; i.e. in // the last new of the code // struct A { // struct B {} // } // A a=new A; // unravel a; // new B; // we need to put a's frame on the stack before allocating an instance of B. // NOTE: A possible optimization could be to only qualify the varEntry if // the type is a record, as other types don't use the varEntry. private: tyEntry(tyEntry *base, varEntry *qv) : entry(*base, *qv), t(base->t), v(qualifyVarEntry(qv, base->v)) {} public: // Since the constructor can only be used when qv is non-null it is private // for safety reasons, and we provide this method instead. friend tyEntry *qualifyTyEntry(varEntry *qv, tyEntry *ent); }; inline tyEntry *qualifyTyEntry(varEntry *qv, tyEntry *ent) { return qv ? new tyEntry(ent, qv) : ent; } // The type environment. class tenv : public sym::table { tyEntry *add(symbol dest, names_t::value_type &x, varEntry *qualifier, coder &c); public: // Add the entries in one environment to another, if qualifier is // non-null, it is a record and the source environment is its types. The // coder is used to see which entries are accessible and should be added. void add(tenv& source, varEntry *qualifier, coder &c); // Adds entries of the name src in source as the name dest, returning true if // any were added. tyEntry *add(symbol src, symbol dest, tenv& source, varEntry *qualifier, coder &c); }; // For speed reasons, many asserts are only tested when DEBUG_CACHE is set. #ifndef DEBUG_CACHE_ASSERT # ifdef DEBUG_CACHE # define DEBUG_CACHE_ASSERT(x) assert(x) # else # define DEBUG_CACHE_ASSERT(x) (void)(x) # endif #endif // The hash table which is at the core of the variable environment venv. class core_venv : public gc { public: // The cells of the table struct cell { symbol name; varEntry *ent; bool empty() const { return name == 0; } bool isATomb() const { DEBUG_CACHE_ASSERT(!empty()); return ent == 0; } bool filled() const { return !empty() and !isATomb(); } bool matches(symbol name, const ty *t) { DEBUG_CACHE_ASSERT(name.special()); DEBUG_CACHE_ASSERT(t); if (this->name != name) return false; if (!this->ent) return false; return equivalent(this->ent->getType(), t); } bool matches(symbol name, const signature *sig) { DEBUG_CACHE_ASSERT(!name.special()); if (this->name != name) return false; if (!this->ent) return false; return equivalent(this->ent->getSignature(), sig); } void storeNew(symbol name, varEntry *ent) { DEBUG_CACHE_ASSERT(empty() || isATomb()); this->name = name; this->ent = ent; } varEntry *replaceWith(symbol name, varEntry *ent) { this->name = name; varEntry *old = this->ent; this->ent = ent; return old; } void remove() { this->ent = 0; } }; private: size_t capacity; size_t size; size_t mask; cell *table; void initTable(size_t capacity); void resize(); cell& cellByIndex(size_t i); const cell& cellByIndex(size_t i) const; varEntry *storeNew(cell& cell, symbol name, varEntry *ent); varEntry *storeNonSpecialAfterTomb(size_t tombIndex, symbol name, varEntry *ent); varEntry *storeSpecialAfterTomb(size_t tombIndex, symbol name, varEntry *ent); public: core_venv(size_t capacity) { initTable(capacity); } bool empty() const { return size == 0; } void clear(); void confirm_size(); // Store an entry into the table. If this shadows a previous entry, the old // entry is returned, otherwise 0 is returned. varEntry *storeNonSpecial(symbol name, varEntry *ent); varEntry *storeSpecial(symbol name, varEntry *ent); varEntry *store(symbol name, varEntry *ent); // Lookup an entry in the table. varEntry *lookupNonSpecial(symbol name, const signature *sig); varEntry *lookupSpecial(symbol name, const ty *t); varEntry *lookup(symbol name, const ty *t); // Remove an entry from the table. void removeNonSpecial(symbol name, const signature *sig); void removeSpecial(symbol name, const ty *t); void remove(symbol name, const ty *t); // Features for iterating over the entire table. class const_iterator { const core_venv& core; size_t index; public: const_iterator(const core_venv& core, size_t index) : core(core), index(index) {} const cell& operator * () const { return core.cellByIndex(index); } const cell* operator -> () const { return &core.cellByIndex(index); } const_iterator& operator ++ () { // Advance to the next filled cell, or stop at the end of the array. do { ++index; } while (!(*this)->filled() && index < core.capacity); DEBUG_CACHE_ASSERT((*this)->filled() || (*this) == core.end()); return *this; } friend bool operator == (const const_iterator& a, const const_iterator& b) { // For speed, we don't compare the hashtables. return a.index == b.index; } friend bool operator != (const const_iterator& a, const const_iterator& b) { // For speed, we don't compare the hashtables. return a.index != b.index; } }; const_iterator begin() const { size_t index = 0; while (index < capacity && !cellByIndex(index).filled()) ++index; return const_iterator(*this, index); } const_iterator end() const { return const_iterator(*this, capacity); } }; struct SigHash { size_t operator()(const mem::pair& p) const; }; struct SigEquiv { bool operator()(const mem::pair& p1, const mem::pair& p2) const; }; enum class AutounravelPriority { OFFER, FORCE, }; // venv implemented with a hash table. class venv { // A hash table used to quickly look up a variable once its name and type are // known. Includes all scopes. core_venv core; // Record of added variables in the order they were added. struct addition { symbol name; ty *t; varEntry *shadowed; addition(symbol name, ty *t, varEntry *shadowed) : name(name), t(t), shadowed(shadowed) {} }; typedef mem::stack addstack; addstack additions; // A list of variables that need to be unraveled whenever the containing // record (if any) becomes available. mem::list> autoUnravels; mem::unordered_map, std::nullptr_t, SigHash, SigEquiv> nonShadowableAutoUnravels; // A scope can be recorded by the size of the addition stack at the time the // scope began. typedef mem::stack scopestack; scopestack scopesizes; struct namehash { size_t operator()(const symbol name) const { return name.hash(); } }; struct nameeq { bool operator()(const symbol s, const symbol t) const { return s==t; } }; struct namevalue { size_t maxFormals; ty *t; namevalue() : maxFormals(0), t(0) {} void addType(ty *s); void replaceType(ty *new_t, ty *old_t); #if DEBUG_CACHE void popType(astType *tnew); #else void popType(); #endif }; // A dictionary indexed solely on the name, storing for each name the // current (possibly overloaded) type of the name. // The hash table implementation is slightly faster than the std::map binary // tree implementation, so we use it if we can. typedef mem::unordered_map namemap; namemap names; // A sanity check. For a given name, it checks that the type stored in the // names hash table exactly matches with all of the entries of that name // stored in the full hash table. void checkName(symbol name); void listValues(symbol name, record *module); // Helper function for endScope. void remove(const addition& a); // These are roughly the size the hashtables will be after loading the // builtin functions and plain module. static const size_t fileCoreSize=1 << 13; static const size_t fileNamesSize=1000; // The number of scopes begun (but not yet ended) when the venv was empty. size_t empty_scopes; public: venv() : core(1 << 2), empty_scopes(0) {} // Most file level modules automatically import plain, so allocate hashtables // big enough to hold it in advance. struct file_env_tag {}; venv(file_env_tag) : core(fileCoreSize), names(fileNamesSize), empty_scopes(0) {} // Add a new variable definition. void enter(symbol name, varEntry *v); // Add the entries in one environment to another, if qualifier is // non-null, it is a record and entries of the source environment are its // fields. The coder is necessary to check which variables are accessible and // should be added. void add(venv& source, varEntry *qualifier, coder &c); // Add all unshadowed variables from source of the name src as variables // named dest. Returns true if at least one was added. bool add(symbol src, symbol dest, venv& source, varEntry *qualifier, coder &c, mem::vector *addedVec=nullptr); // Look for a function that exactly matches the type given. varEntry *lookByType(symbol name, ty *t) { return core.lookup(name, t); } // An optimization heuristic. Try to guess the signature of a variable and // look it up. This is allowed to return 0 even if the appropriate variable // exists. If it returns a varEntry from an overloaded number of choices, // the returned function must be the one which would be called with // arguments given by sig, and its signature must be equivalent to sig. // For instance, in // int f(int a, int b); // int f(int a, int b, int c = 1); // f(a,b); // looking up the signature of 'f' with arguments (int, int) must return 0 // as there is an ambiguity. The maxFormals field is used to ensure we // avoid such ambiguities. varEntry *lookBySignature(symbol name, signature *sig); // Get the (possibly overloaded) type of all variables associated to a // particular name. ty *getType(symbol name); void beginScope(); void endScope(); // Merges the top-level scope with the level immediately underneath it. void collapseScope(); // Prints a list of the variables to the standard output. void list(record *module=0); // Adds to l, all names prefixed by start. void completions(mem::list& l, string start); void registerAutoUnravel( symbol name, varEntry *v, AutounravelPriority priority=AutounravelPriority::FORCE ); const mem::list>& getAutoUnravels() { return autoUnravels; } }; } // namespace trans #endif //ENTRY_H asymptote-3.05/exithandlers.cc0000644000000000000000000000151015031566105015164 0ustar rootroot/** * @file exithandlers.cc * @brief Definitions for exit handlers */ #include "exithandlers.h" #include #include "common.h" #include "util.h" #include "interact.h" #include "errormsg.h" #include "vm.h" #ifdef HAVE_LIBFFTW3 #include "fftw++.h" #endif void interruptHandler(int) { #ifdef HAVE_LIBFFTW3 fftwpp::saveWisdom(); #endif em.Interrupt(true); } int returnCode() { return em.processStatus() || interact::interactive ? 0 : 1; } void exitHandler(int) { #if defined(HAVE_READLINE) && defined(HAVE_LIBCURSES) rl_cleanup_after_signal(); #endif exit(returnCode()); } void signalHandler(int) { // Print the position and trust the shell to print an error message. em.runtime(vm::getPos()); #if !defined(_WIN32) Signal(SIGBUS,SIG_DFL); #endif Signal(SIGFPE,SIG_DFL); } void hangup_handler(int sig) { } asymptote-3.05/genv.h0000644000000000000000000000352615031566105013304 0ustar rootroot/***** * genv.h * Andy Hammerlindl 2002/08/29 * * This is the global environment for the translation of programs. In * actuality, it is basically a module manager. When a module is * requested, it looks for the corresponding filename, and if found, * parses and translates the file, returning the resultant module. * * genv sets up the basic type bindings and function bindings for * builtin functions, casts and operators, and imports plain (if set), * but all other initialization, is done by the local environmet defined * in env.h. *****/ #ifndef GENV_H #define GENV_H #include "common.h" #include "table.h" #include "record.h" #include "absyn.h" #include "access.h" #include "stack.h" using types::record; using vm::lambda; namespace trans { class genv : public gc { // The initializer functions for imports, indexed by filename. typedef mem::map importMap; importMap imap; // List of modules in translation. Used to detect and prevent infinite // recursion in loading modules. mem::list inTranslation; // Checks for recursion in loading, reporting an error and throwing an // exception if it occurs. void checkRecursion(string filename); // Translate a module to build the record type. record *loadModule(symbol name, string filename); record *loadTemplatedModule( symbol id, string filename, mem::vector *args ); public: genv(); // Get an imported module, translating if necessary. record *getModule(symbol name, string filename); record *getTemplatedModule( string filename, mem::vector *args ); record *getLoadedModule(symbol index); // Uses the filename->record map to build a filename->initializer map to be // used at runtime. vm::stack::importInitMap *getInitMap(); }; } // namespace trans #endif asymptote-3.05/findsym.py0000644000000000000000000000514115031566105014212 0ustar rootroot#!/usr/bin/env python3 ##### # findsym2.py # Translated from findsym.pl # # This script scans through multiple C++ source files to find all occurrences # of the SYM(symbol_name) macro. It collects these unique symbol names and # generates a header file containing declarations for these symbols. The purpose # is to ensure that each symbol is translated only once when creating the # symbol table. ##### import re import sys import textwrap # Retrieve the first command-line argument, which should be the name of the # output header file. if len(sys.argv) < 2: print( "usage: ./findsym2.py out_symbols.h file1.cc file2.cc ...", file=sys.stderr, ) sys.exit(1) _, outname, *innames = sys.argv # Attempt to open the output file in write mode. with open(outname, "w", encoding="utf-8") as header: # Write a predefined header comment block to the output file. header.write( textwrap.dedent( """\ /***** * This file is automatically generated by findsym.py * Changes will be overwritten. *****/ // If the ADDSYMBOL macro is not already defined, define it with the default // purpose of referring to an external pre-translated symbol, such that // SYM(name) also refers to that symbol. #ifndef ADDSYMBOL #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name #define SYM(name) PRETRANSLATED_SYMBOL_##name #endif """ ) ) # Initialize an empty set to store unique symbols. symbols = set() # Iterate over each remaining command-line argument, which should be the names # of C++ source files to process. for inname in innames: # Attempt to open the current input file in read mode. with open(inname, "r", encoding="utf-8") as infile: # Read the input file line by line. for line in infile: # Use a regular expression to find all occurrences of the SYM macro # with a valid symbol name inside parentheses. matches = re.findall(r"SYM\(([_A-Za-z][_A-Za-z0-9]*)\)", line) for match in matches: # Add each matched symbol name to the symbols set. symbols.add(match) # After collecting all unique symbols, iterate over the sorted list of symbol # names. for symbol in sorted(symbols): # Concatenate the ADDSYMBOL macro with the provided symbol name and a # newline character, then write it to the header file. header.write(f"ADDSYMBOL({symbol});\n") asymptote-3.05/pkg.m40000644000000000000000000003057615031566105013224 0ustar rootroot# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 11 (pkg-config-0.29.1) dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.1]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------ dnl dnl Prepare a "--with-" configure option using the lowercase dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and dnl PKG_CHECK_MODULES in a single macro. AC_DEFUN([PKG_WITH_MODULES], [ m4_pushdef([with_arg], m4_tolower([$1])) m4_pushdef([description], [m4_default([$5], [build with ]with_arg[ support])]) m4_pushdef([def_arg], [m4_default([$6], [auto])]) m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) m4_case(def_arg, [yes],[m4_pushdef([with_without], [--without-]with_arg)], [m4_pushdef([with_without],[--with-]with_arg)]) AC_ARG_WITH(with_arg, AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, [AS_TR_SH([with_]with_arg)=def_arg]) AS_CASE([$AS_TR_SH([with_]with_arg)], [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], [auto],[PKG_CHECK_MODULES([$1],[$2], [m4_n([def_action_if_found]) $3], [m4_n([def_action_if_not_found]) $4])]) m4_popdef([with_arg]) m4_popdef([description]) m4_popdef([def_arg]) ])dnl PKG_WITH_MODULES dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ----------------------------------------------- dnl dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES dnl check._[VARIABLE-PREFIX] is exported as make variable. AC_DEFUN([PKG_HAVE_WITH_MODULES], [ PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) AM_CONDITIONAL([HAVE_][$1], [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) ])dnl PKG_HAVE_WITH_MODULES dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------------------ dnl dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make dnl and preprocessor variable. AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], [ PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ])dnl PKG_HAVE_DEFINE_WITH_MODULES asymptote-3.05/tests/0000755000000000000000000000000015031566777013347 5ustar rootrootasymptote-3.05/tests/template/0000755000000000000000000000000015031566105015143 5ustar rootrootasymptote-3.05/tests/template/sortedsetTest.asy0000644000000000000000000001601215031566105020535 0ustar rootrootimport TestLib; StartTest("NaiveSortedSet"); from "template/imports/wrapper"(T=int) access Wrapper_T as wrapped_int, wrap, alias; bool operator < (wrapped_int a, wrapped_int b) { return a.t < b.t; } bool operator == (wrapped_int a, wrapped_int b) { return a.t == b.t; } from "template/imports/pureset"(T=wrapped_int) access Set_T as Set_wrapped_int, makeNaiveSet; from "template/imports/sortedset"(T=wrapped_int) access SortedSet_T as SortedSet_wrapped_int, makeNaiveSortedSet, operator cast, unSort; struct ActionEnum { static restricted int numActions = 0; static private int next() { return ++numActions - 1; } static restricted int INSERT = next(); static restricted int REPLACE = next(); static restricted int DELETE = next(); static restricted int CONTAINS = next(); static restricted int DELETE_CONTAINS = next(); } from "template/imports/zip"(T=int) access zip; from mapArray(Src=wrapped_int, Dst=int) access map; int get(wrapped_int a) { return a.t; } int[] operator cast(wrapped_int[] a) { for (wrapped_int x : a) { assert(!alias(x, null), 'Null element in array'); } return map(get, a); } string differences(Set_wrapped_int a, Set_wrapped_int b) { if (a.size() != b.size()) { return 'Different sizes: ' + string(a.size()) + ' vs ' + string(b.size()); } wrapped_int[] aArray = sort(a, operator<); int[] aIntArray = map(get, aArray); wrapped_int[] bArray = sort(b, operator<); int[] bIntArray = map(get, bArray); string arrayValues = '[\n'; bool different = false; for (int i = 0; i < aIntArray.length; ++i) { arrayValues += ' [' + format('%5d', aIntArray[i]) + ',' + format('%5d', bIntArray[i]) + ']'; if (!alias(aArray[i], bArray[i])) { arrayValues += ' <---'; different = true; } arrayValues += '\n'; } arrayValues += ']'; // write(arrayValues + '\n'); if (different) { return arrayValues; } return ''; } string string(int[] a) { string result = '['; for (int i = 0; i < a.length; ++i) { if (i > 0) { result += ', '; } result += string(a[i]); } result += ']'; return result; } string string(bool[] a) { string result = '['; for (int i = 0; i < a.length; ++i) { if (i > 0) { result += ', '; } result += a[i] ? 'true' : 'false'; } result += ']'; return result; } typedef void Action(int ...Set_wrapped_int[]); Action[] actions = new Action[ActionEnum.numActions]; actions[ActionEnum.INSERT] = new void(int maxItem ...Set_wrapped_int[] sets) { wrapped_int toInsert = wrap(rand() % maxItem); // write('Inserting ' + string(toInsert.t) + '\n'); for (Set_wrapped_int s : sets) { s.insert(toInsert); } }; actions[ActionEnum.REPLACE] = new void(int maxItem ...Set_wrapped_int[] sets) { wrapped_int toReplace = wrap(rand() % maxItem); // write('Replacing ' + string(toReplace.t) + '\n'); wrapped_int[] results = new wrapped_int[]; for (Set_wrapped_int s : sets) { results.push(s.replace(toReplace)); } if (results.length > 0) { wrapped_int expected = results[0]; for (wrapped_int r : results) { if (!alias(r, expected)) { assert(false, 'Different results: ' + string(results)); } } } }; actions[ActionEnum.DELETE] = new void(int maxItem ...Set_wrapped_int[] sets) { wrapped_int toDelete = wrap(rand() % maxItem); // write('Deleting ' + string(toDelete.t) + '\n'); bool[] results = new bool[]; for (Set_wrapped_int s : sets) { results.push(s.delete(toDelete)); } if (results.length > 0) { bool expected = results[0]; for (bool r : results) { assert(r == expected, 'Different results: ' + string(results)); } } }; actions[ActionEnum.CONTAINS] = new void(int maxItem ...Set_wrapped_int[] sets) { int toCheck = rand() % maxItem; // write('Checking ' + string(toCheck) + '\n'); bool[] results = new bool[]; for (Set_wrapped_int s : sets) { results.push(s.contains(wrap(toCheck))); } if (results.length > 0) { bool expected = results[0]; for (bool r : results) { assert(r == expected, 'Different results: ' + string(results)); } } }; actions[ActionEnum.DELETE_CONTAINS] = new void(int ...Set_wrapped_int[] sets) { if (sets.length == 0) { return; } int initialSize = sets[0].size(); if (initialSize == 0) { return; } int indexToDelete = rand() % initialSize; int i = 0; wrapped_int toDelete = null; bool process(wrapped_int a) { if (i == indexToDelete) { toDelete = wrap(a.t); return false; } ++i; return true; } sets[0].forEach(process); assert(i < initialSize, 'Index out of range'); // write('Deleting ' + string(toDelete.t) + '\n'); int i = 0; for (Set_wrapped_int s : sets) { assert(s.contains(toDelete), 'Contains failed ' + string(i)); assert(s.delete(toDelete), 'Delete failed'); assert(!s.contains(toDelete), 'Contains failed'); assert(s.size() == initialSize - 1, 'Size failed'); ++i; } }; real[] increasingProbs = new real[ActionEnum.numActions]; increasingProbs[ActionEnum.INSERT] = 0.7; increasingProbs[ActionEnum.REPLACE] = 0.1; increasingProbs[ActionEnum.DELETE] = 0.05; increasingProbs[ActionEnum.CONTAINS] = 0.1; increasingProbs[ActionEnum.DELETE_CONTAINS] = 0.05; assert(sum(increasingProbs) == 1, 'Probabilities do not sum to 1'); real[] decreasingProbs = new real[ActionEnum.numActions]; decreasingProbs[ActionEnum.INSERT] = 0.1; decreasingProbs[ActionEnum.REPLACE] = 0.1; decreasingProbs[ActionEnum.DELETE] = 0.4; decreasingProbs[ActionEnum.CONTAINS] = 0.1; decreasingProbs[ActionEnum.DELETE_CONTAINS] = 0.3; assert(sum(decreasingProbs) == 1, 'Probabilities do not sum to 1'); Set_wrapped_int pure_set = makeNaiveSet(operator ==, (wrapped_int)null); SortedSet_wrapped_int sorted_set = makeNaiveSortedSet(operator <, (wrapped_int)null); int chooseAction(real[] probs) { real r = unitrand(); real sum = 0; for (int i = 0; i < probs.length; ++i) { sum += probs[i]; if (r < sum) { return i; } } return probs.length - 1; } bool isStrictlySorted(wrapped_int[] arr) { for (int i = 1; i < arr.length; ++i) { if (!(arr[i - 1] < arr[i])) { return false; } } return true; } int maxSize = 0; for (int i = 0; i < 2000; ++i) { real[] probs = i < 800 ? increasingProbs : decreasingProbs; int choice = chooseAction(probs); actions[choice](100, pure_set, sorted_set); string diffs = differences(pure_set, sorted_set); assert(diffs == '', 'Pure vs sorted: \n' + diffs); assert(isStrictlySorted(sorted_set), 'Not sorted'); maxSize = max(maxSize, pure_set.size()); } // write('Max size: ' + string(maxSize) + '\n'); // int maxSize = 0; // for (int i = 0; i < 2000; ++i) { // real[] probs = i < 800 ? increasingProbs : decreasingProbs; // int choice = chooseAction(probs); // actions[choice](1000, pure_set, unSort(sorted_set)); // string diffs = differences(pure_set, sorted_set); // assert(diffs == '', 'Pure vs sorted: \n' + diffs); // maxSize = max(maxSize, pure_set.size()); // } // write('Max size: ' + string(maxSize) + '\n'); EndTest();asymptote-3.05/tests/template/splaytreeTest.asy0000644000000000000000000004203315031566105020533 0ustar rootroot import TestLib; StartTest("SplayTree_as_Set"); from "template/imports/wrapper"(T=int) access Wrapper_T as wrapped_int, wrap, alias; bool operator < (wrapped_int a, wrapped_int b) { return a.t < b.t; } bool operator == (wrapped_int a, wrapped_int b) { return a.t == b.t; } from "template/imports/sortedset"(T=wrapped_int) access makeNaiveSortedSet, SortedSet_T as SortedSet_wrapped_int; from "template/imports/splaytree"(T=wrapped_int) access SplayTree_T as SplayTree_wrapped_int, operator cast; struct ActionEnum { static restricted int numActions = 0; static private int next() { return ++numActions - 1; } static restricted int INSERT = next(); static restricted int REPLACE = next(); static restricted int DELETE = next(); static restricted int CONTAINS = next(); static restricted int DELETE_CONTAINS = next(); } from mapArray(Src=wrapped_int, Dst=int) access map; int get(wrapped_int a) { return a.t; } int[] operator cast(wrapped_int[] a) { for (wrapped_int x : a) { assert(!alias(x, null), 'Null element in array'); } return map(get, a); } string differences(SortedSet_wrapped_int a, SortedSet_wrapped_int b) { if (a.size() != b.size()) { return 'Different sizes: ' + string(a.size()) + ' vs ' + string(b.size()); } wrapped_int[] aArray = a; int[] aIntArray = aArray; wrapped_int[] bArray = b; int[] bIntArray = bArray; string arrayValues = '[\n'; bool different = false; for (int i = 0; i < aIntArray.length; ++i) { arrayValues += ' [' + format('%5d', aIntArray[i]) + ',' + format('%5d', bIntArray[i]) + ']'; if (!alias(aArray[i], bArray[i])) { arrayValues += ' <---'; different = true; } arrayValues += '\n'; } arrayValues += ']'; // write(arrayValues + '\n'); if (different) { return arrayValues; } return ''; } string string(int[] a) { string result = '['; for (int i = 0; i < a.length; ++i) { if (i > 0) { result += ', '; } result += string(a[i]); } result += ']'; return result; } string string(bool[] a) { string result = '['; for (int i = 0; i < a.length; ++i) { if (i > 0) { result += ', '; } result += a[i] ? 'true' : 'false'; } result += ']'; return result; } typedef void Action(int ...SortedSet_wrapped_int[]); Action[] actions = new Action[ActionEnum.numActions]; actions[ActionEnum.INSERT] = new void(int maxItem ...SortedSet_wrapped_int[] sets) { wrapped_int toInsert = wrap(rand() % maxItem); // write('Inserting ' + string(toInsert.t) + '\n'); for (SortedSet_wrapped_int s : sets) { s.insert(toInsert); } }; actions[ActionEnum.REPLACE] = new void(int maxItem ...SortedSet_wrapped_int[] sets) { wrapped_int toReplace = wrap(rand() % maxItem); // write('Replacing ' + string(toReplace.t) + '\n'); wrapped_int[] results = new wrapped_int[]; for (SortedSet_wrapped_int s : sets) { results.push(s.replace(toReplace)); } if (results.length > 0) { wrapped_int expected = results[0]; for (wrapped_int r : results) { if (!alias(r, expected)) { assert(false, 'Different results: ' + string(results)); } } } }; actions[ActionEnum.DELETE] = new void(int maxItem ...SortedSet_wrapped_int[] sets) { wrapped_int toDelete = wrap(rand() % maxItem); // write('Deleting ' + string(toDelete.t) + '\n'); bool[] results = new bool[]; for (SortedSet_wrapped_int s : sets) { results.push(s.delete(toDelete)); } if (results.length > 0) { bool expected = results[0]; for (bool r : results) { assert(r == expected, 'Different results: ' + string(results)); } } }; actions[ActionEnum.CONTAINS] = new void(int maxItem ...SortedSet_wrapped_int[] sets) { int toCheck = rand() % maxItem; // write('Checking ' + string(toCheck) + '\n'); bool[] results = new bool[]; for (SortedSet_wrapped_int s : sets) { results.push(s.contains(wrap(toCheck))); } if (results.length > 0) { bool expected = results[0]; for (bool r : results) { assert(r == expected, 'Different results: ' + string(results)); } } }; actions[ActionEnum.DELETE_CONTAINS] = new void(int ...SortedSet_wrapped_int[] sets) { if (sets.length == 0) { return; } int initialSize = sets[0].size(); if (initialSize == 0) { return; } int indexToDelete = rand() % initialSize; int i = 0; wrapped_int toDelete = null; bool process(wrapped_int a) { if (i == indexToDelete) { toDelete = wrap(a.t); return false; } ++i; return true; } sets[0].forEach(process); assert(i < initialSize, 'Index out of range'); // write('Deleting ' + string(toDelete.t) + '\n'); int i = 0; for (SortedSet_wrapped_int s : sets) { assert(s.contains(toDelete), 'Contains failed ' + string(i)); assert(s.delete(toDelete), 'Delete failed'); assert(!s.contains(toDelete), 'Contains failed'); assert(s.size() == initialSize - 1, 'Size failed'); ++i; } }; real[] increasingProbs = new real[ActionEnum.numActions]; increasingProbs[ActionEnum.INSERT] = 0.7; increasingProbs[ActionEnum.REPLACE] = 0.1; increasingProbs[ActionEnum.DELETE] = 0.05; increasingProbs[ActionEnum.CONTAINS] = 0.1; increasingProbs[ActionEnum.DELETE_CONTAINS] = 0.05; assert(sum(increasingProbs) == 1, 'Probabilities do not sum to 1'); real[] decreasingProbs = new real[ActionEnum.numActions]; decreasingProbs[ActionEnum.INSERT] = 0.1; decreasingProbs[ActionEnum.REPLACE] = 0.1; decreasingProbs[ActionEnum.DELETE] = 0.4; decreasingProbs[ActionEnum.CONTAINS] = 0.1; decreasingProbs[ActionEnum.DELETE_CONTAINS] = 0.3; assert(sum(decreasingProbs) == 1, 'Probabilities do not sum to 1'); SortedSet_wrapped_int sorted_set = makeNaiveSortedSet(operator <, (wrapped_int)null); SplayTree_wrapped_int splayset = SplayTree_wrapped_int(operator <, (wrapped_int)null); int chooseAction(real[] probs) { real r = unitrand(); real sum = 0; for (int i = 0; i < probs.length; ++i) { sum += probs[i]; if (r < sum) { return i; } } return probs.length - 1; } bool isStrictlySorted(wrapped_int[] arr) { for (int i = 1; i < arr.length; ++i) { if (!(arr[i - 1] < arr[i])) { return false; } } return true; } int maxSize = 0; for (int i = 0; i < 2000; ++i) { real[] probs = i < 800 ? increasingProbs : decreasingProbs; int choice = chooseAction(probs); actions[choice](100, sorted_set, splayset); string diffs = differences(sorted_set, splayset); assert(diffs == '', 'Naive vs splayset: \n' + diffs); assert(isStrictlySorted(splayset), 'Not sorted'); maxSize = max(maxSize, splayset.size()); } EndTest(); StartTest("SplayTree_as_SortedSet"); struct ActionEnum { static restricted int numActions = 0; static private int next() { return ++numActions - 1; } static restricted int CONTAINS = next(); static restricted int AFTER = next(); static restricted int BEFORE = next(); static restricted int FIRST_GEQ = next(); static restricted int FIRST_LEQ = next(); static restricted int MIN = next(); static restricted int POP_MIN = next(); static restricted int MAX = next(); static restricted int POP_MAX = next(); static restricted int INSERT = next(); static restricted int REPLACE = next(); static restricted int GET = next(); static restricted int DELETE = next(); static restricted int DELETE_CONTAINS = next(); } Action[] actions = new Action[ActionEnum.numActions]; actions[ActionEnum.CONTAINS] = new void(int maxItem ...SortedSet_wrapped_int[] sets) { int toCheck = rand() % maxItem; // write('Checking ' + string(toCheck) + '\n'); bool[] results = new bool[]; for (SortedSet_wrapped_int s : sets) { results.push(s.contains(wrap(toCheck))); } if (results.length > 0) { bool expected = results[0]; for (bool r : results) { assert(r == expected, 'Different results: ' + string(results)); } } }; actions[ActionEnum.AFTER] = new void(int maxItem ...SortedSet_wrapped_int[] sets) { int toCheck = rand() % maxItem; // write('After ' + string(toCheck) + '\n'); wrapped_int[] results = new wrapped_int[]; for (SortedSet_wrapped_int s : sets) { results.push(s.after(wrap(toCheck))); } if (results.length > 0) { wrapped_int expected = results[0]; for (wrapped_int r : results) { if (!alias(r, expected)) { assert(false, 'Different results: ' + string(results)); } } } }; actions[ActionEnum.BEFORE] = new void(int maxItem ...SortedSet_wrapped_int[] sets) { int toCheck = rand() % maxItem; // write('Before ' + string(toCheck) + '\n'); wrapped_int[] results = new wrapped_int[]; for (SortedSet_wrapped_int s : sets) { results.push(s.before(wrap(toCheck))); } if (results.length > 0) { wrapped_int expected = results[0]; for (wrapped_int r : results) { if (!alias(r, expected)) { assert(false, 'Different results: ' + string(results)); } } } }; actions[ActionEnum.FIRST_GEQ] = new void(int maxItem ...SortedSet_wrapped_int[] sets) { int toCheck = rand() % maxItem; // write('First greater or equal ' + string(toCheck) + '\n'); wrapped_int[] results = new wrapped_int[]; for (SortedSet_wrapped_int s : sets) { results.push(s.firstGEQ(wrap(toCheck))); } if (results.length > 0) { wrapped_int expected = results[0]; for (wrapped_int r : results) { if (!alias(r, expected)) { assert(false, 'Different results: ' + string(results)); } } } }; actions[ActionEnum.FIRST_LEQ] = new void(int maxItem ...SortedSet_wrapped_int[] sets) { int toCheck = rand() % maxItem; // write('First less or equal ' + string(toCheck) + '\n'); wrapped_int[] results = new wrapped_int[]; for (SortedSet_wrapped_int s : sets) { results.push(s.firstLEQ(wrap(toCheck))); } if (results.length > 0) { wrapped_int expected = results[0]; for (wrapped_int r : results) { if (!alias(r, expected)) { assert(false, 'Different results: ' + string(results)); } } } }; actions[ActionEnum.MIN] = new void(int ...SortedSet_wrapped_int[] sets) { // write('Min\n'); wrapped_int[] results = new wrapped_int[]; for (SortedSet_wrapped_int s : sets) { results.push(s.min()); } if (results.length > 0) { wrapped_int expected = results[0]; for (wrapped_int r : results) { if (!alias(r, expected)) { assert(false, 'Different results: ' + string(results)); } } } }; actions[ActionEnum.POP_MIN] = new void(int ...SortedSet_wrapped_int[] sets) { // write('Pop min\n'); wrapped_int[] results = new wrapped_int[]; for (SortedSet_wrapped_int s : sets) { results.push(s.popMin()); } if (results.length > 0) { wrapped_int expected = results[0]; for (wrapped_int r : results) { if (!alias(r, expected)) { assert(false, 'Different results: ' + string(results)); } } } }; actions[ActionEnum.MAX] = new void(int ...SortedSet_wrapped_int[] sets) { // write('Max\n'); wrapped_int[] results = new wrapped_int[]; for (SortedSet_wrapped_int s : sets) { results.push(s.max()); } if (results.length > 0) { wrapped_int expected = results[0]; for (wrapped_int r : results) { if (!alias(r, expected)) { assert(false, 'Different results: ' + string(results)); } } } }; actions[ActionEnum.POP_MAX] = new void(int ...SortedSet_wrapped_int[] sets) { // write('Pop max\n'); wrapped_int[] results = new wrapped_int[]; for (SortedSet_wrapped_int s : sets) { results.push(s.popMax()); } if (results.length > 0) { wrapped_int expected = results[0]; for (wrapped_int r : results) { if (!alias(r, expected)) { assert(false, 'Different results: ' + string(results)); } } } }; actions[ActionEnum.INSERT] = new void(int maxItem ...SortedSet_wrapped_int[] sets) { wrapped_int toInsert = wrap(rand() % maxItem); // write('Inserting ' + string(toInsert.t) + '\n'); for (SortedSet_wrapped_int s : sets) { s.insert(toInsert); } }; actions[ActionEnum.REPLACE] = new void(int maxItem ...SortedSet_wrapped_int[] sets) { wrapped_int toReplace = wrap(rand() % maxItem); // write('Replacing ' + string(toReplace.t) + '\n'); wrapped_int[] results = new wrapped_int[]; for (SortedSet_wrapped_int s : sets) { results.push(s.replace(toReplace)); } if (results.length > 0) { wrapped_int expected = results[0]; for (wrapped_int r : results) { if (!alias(r, expected)) { assert(false, 'Different results: ' + string(results)); } } } }; actions[ActionEnum.GET] = new void(int maxItem ...SortedSet_wrapped_int[] sets) { wrapped_int toGet = wrap(rand() % maxItem); // write('Getting ' + string(toGet) + '\n'); wrapped_int[] results = new wrapped_int[]; for (SortedSet_wrapped_int s : sets) { results.push(s.get(toGet)); } if (results.length > 0) { wrapped_int expected = results[0]; for (wrapped_int r : results) { if (!alias(r, expected)) { assert(false, 'Different results: ' + string(results)); } } } }; actions[ActionEnum.DELETE] = new void(int maxItem ...SortedSet_wrapped_int[] sets) { wrapped_int toDelete = wrap(rand() % maxItem); // write('Deleting ' + string(toDelete.t) + '\n'); bool[] results = new bool[]; for (SortedSet_wrapped_int s : sets) { results.push(s.delete(toDelete)); } if (results.length > 0) { bool expected = results[0]; for (bool r : results) { assert(r == expected, 'Different results: ' + string(results)); } } }; actions[ActionEnum.DELETE_CONTAINS] = new void(int ...SortedSet_wrapped_int[] sets) { if (sets.length == 0) { return; } int initialSize = sets[0].size(); if (initialSize == 0) { return; } int indexToDelete = rand() % initialSize; int i = 0; wrapped_int toDelete = null; bool process(wrapped_int a) { if (i == indexToDelete) { toDelete = wrap(a.t); return false; } ++i; return true; } sets[0].forEach(process); assert(i < initialSize, 'Index out of range'); // write('Deleting ' + string(toDelete.t) + '\n'); int i = 0; for (SortedSet_wrapped_int s : sets) { assert(s.delete(toDelete), 'Delete failed'); assert(!s.contains(toDelete), 'Contains failed'); assert(s.size() == initialSize - 1, 'Size failed'); ++i; } }; real[] increasingProbs = array(n=ActionEnum.numActions, value=0.0); // Actions that don't modify the set (except for rebalancing): increasingProbs[ActionEnum.CONTAINS] = 1 / 2^5; increasingProbs[ActionEnum.AFTER] = 1 / 2^5; increasingProbs[ActionEnum.BEFORE] = 1 / 2^5; increasingProbs[ActionEnum.FIRST_GEQ] = 1 / 2^5; increasingProbs[ActionEnum.FIRST_LEQ] = 1 / 2^5; increasingProbs[ActionEnum.MIN] = 1 / 2^5; increasingProbs[ActionEnum.MAX] = 1 / 2^5; increasingProbs[ActionEnum.GET] = 1 / 2^5; // 1/4 probability of this sort of action: assert(sum(increasingProbs) == 8 / 2^5); // Actions that might add an element: increasingProbs[ActionEnum.INSERT] = 1 / 4; increasingProbs[ActionEnum.REPLACE] = 1 / 4; assert(sum(increasingProbs) == 3/4); // Actions that might remove an element: increasingProbs[ActionEnum.POP_MIN] = 1 / 16; increasingProbs[ActionEnum.POP_MAX] = 1 / 16; increasingProbs[ActionEnum.DELETE] = 1 / 16; increasingProbs[ActionEnum.DELETE_CONTAINS] = 1 / 16; assert(sum(increasingProbs) == 1, 'Probabilities do not sum to 1'); real[] decreasingProbs = copy(increasingProbs); // Actions that might add an element: decreasingProbs[ActionEnum.INSERT] = 1 / 8; decreasingProbs[ActionEnum.REPLACE] = 1 / 8; // Actions that might remove an element: decreasingProbs[ActionEnum.POP_MIN] = 1 / 8; decreasingProbs[ActionEnum.POP_MAX] = 1 / 8; decreasingProbs[ActionEnum.DELETE] = 1 / 8; decreasingProbs[ActionEnum.DELETE_CONTAINS] = 1 / 8; assert(sum(decreasingProbs) == 1, 'Probabilities do not sum to 1'); SortedSet_wrapped_int sorted_set = makeNaiveSortedSet(operator <, (wrapped_int)null); SplayTree_wrapped_int splayset = SplayTree_wrapped_int(operator <, (wrapped_int)null); int maxSize = 0; for (int i = 0; i < 2000; ++i) { real[] probs = i < 800 ? increasingProbs : decreasingProbs; int choice = chooseAction(probs); actions[choice](100, sorted_set, splayset); string diffs = differences(sorted_set, splayset); assert(diffs == '', 'Naive vs splayset: \n' + diffs); assert(isStrictlySorted(splayset), 'Not sorted'); maxSize = max(maxSize, splayset.size()); } EndTest();asymptote-3.05/tests/template/multiImport.asy0000644000000000000000000000112015031566105020200 0ustar rootrootimport TestLib; StartTest('multiple_imports'); struct A {int x=1;} access "template/imports/C"(T=A) as p; assert(p.global == 17); p.global = 42; access "template/imports/C"(T=A) as q; assert(q.global == 42); EndTest(); StartTest('import_in_function'); struct B {int x=1;} void f(int expected, int newValue) { // Importing inside a function is not recommended practice, but it should // work. access "template/imports/C"(T=B) as p; assert(p.global == expected); p.global = newValue; } f(17, 23); f(23, 27); access "template/imports/C"(T=B) as p; assert(p.global == 27); EndTest(); asymptote-3.05/tests/template/nestedImport.asy0000644000000000000000000000023415031566105020335 0ustar rootrootimport TestLib; StartTest('nested_import'); struct A { int x = 1; } access 'template/imports/Cpass'(T=A) as module; assert(module.global == 17); EndTest();asymptote-3.05/tests/template/imports/0000755000000000000000000000000015031566105016640 5ustar rootrootasymptote-3.05/tests/template/imports/zip.asy0000644000000000000000000000011615031566105020156 0ustar rootroottypedef import(T); T[][] zip(...T[][] arrays) { return transpose(arrays); }asymptote-3.05/tests/template/imports/splaytree.asy0000644000000000000000000003502115031566105021367 0ustar rootroottypedef import(T); from "template/imports/sortedset"(T=T) access Set_T, SortedSet_T, operator cast; private struct treenode { treenode leftchild; treenode rightchild; T value; void operator init(T value) { this.value = value; } bool inOrder(bool run(T)) { if (leftchild != null) { if (!leftchild.inOrder(run)) return false; } if (!run(value)) return false; if (rightchild != null) { if (!rightchild.inOrder(run)) return false; } return true; } } private struct NodeProgressEnum { restricted static int num = 0; private static int make() { return (++num - 1); } static int NOT_STARTED = make(); static int LEFT_DONE = make(); static int SELF_DONE = make(); static int RIGHT_DONE = make(); } private struct NodeInProgress { treenode node; int progress = NodeProgressEnum.NOT_STARTED; void operator init(treenode node) { this.node = node; } } void inOrderNonRecursive(treenode root, bool run(T)) { if (root == null) return; NodeInProgress[] stack = new NodeInProgress[0]; stack.cyclic = true; stack.push(NodeInProgress(root)); while (stack.length > 0) { NodeInProgress current = stack[-1]; if (current.progress == NodeProgressEnum.NOT_STARTED) { if (current.node.leftchild != null) { stack.push(NodeInProgress(current.node.leftchild)); } current.progress = NodeProgressEnum.LEFT_DONE; } else if (current.progress == NodeProgressEnum.LEFT_DONE) { if (!run(current.node.value)) return; current.progress = NodeProgressEnum.SELF_DONE; } else if (current.progress == NodeProgressEnum.SELF_DONE) { if (current.node.rightchild != null) { stack.push(NodeInProgress(current.node.rightchild)); } current.progress = NodeProgressEnum.RIGHT_DONE; } else { assert(current.progress == NodeProgressEnum.RIGHT_DONE); stack.pop(); } } } private treenode splay(treenode[] ancestors, bool lessthan(T a, T b)) { bool operator < (T a, T b) = lessthan; if (ancestors.length == 0) return null; treenode root = ancestors[0]; treenode current = ancestors.pop(); while (ancestors.length >= 2) { treenode parent = ancestors.pop(); treenode grandparent = ancestors.pop(); if (ancestors.length > 0) { treenode greatparent = ancestors[-1]; if (greatparent.leftchild == grandparent) { greatparent.leftchild = current; } else greatparent.rightchild = current; } bool currentside = (parent.leftchild == current); bool grandside = (grandparent.leftchild == parent); if (currentside == grandside) { // zig-zig if (currentside) { // both left treenode B = current.rightchild; treenode C = parent.rightchild; current.rightchild = parent; parent.leftchild = B; parent.rightchild = grandparent; grandparent.leftchild = C; } else { // both right treenode B = parent.leftchild; treenode C = current.leftchild; current.leftchild = parent; parent.leftchild = grandparent; parent.rightchild = C; grandparent.rightchild = B; } } else { // zig-zag if (grandside) { // left-right treenode B = current.leftchild; treenode C = current.rightchild; current.leftchild = parent; current.rightchild = grandparent; parent.rightchild = B; grandparent.leftchild = C; } else { //right-left treenode B = current.leftchild; treenode C = current.rightchild; current.leftchild = grandparent; current.rightchild = parent; grandparent.rightchild = B; parent.leftchild = C; } } } if (ancestors.length > 0) { ancestors.pop(); if (current == root.leftchild) { treenode B = current.rightchild; current.rightchild = root; root.leftchild = B; } else { treenode B = current.leftchild; current.leftchild = root; root.rightchild = B; } } return current; } struct SplayTree_T { private treenode root = null; restricted int size = 0; private bool operator < (T a, T b); private T emptyresponse; void operator init(bool lessthan(T,T), T emptyresponse) { operator< = lessthan; this.emptyresponse = emptyresponse; } int size() { return size; } bool empty() { assert((root == null) == (size == 0)); return root == null; } bool contains(T value) { treenode[] parentStack = new treenode[0]; parentStack.cyclic = true; parentStack.push(root); while (true) { treenode current = parentStack[-1]; if (current == null) { parentStack.pop(); root = splay(parentStack, operator<); return false; } if (value < current.value) { parentStack.push(current.leftchild); } else if (current.value < value) { parentStack.push(current.rightchild); } else break; } root = splay(parentStack, operator<); return true; } T after(T item) { treenode[] parentStack = new treenode[0]; parentStack.cyclic = true; parentStack.push(root); T strictUpperBound = emptyresponse; bool found = false; while (true) { treenode current = parentStack[-1]; if (current == null) { parentStack.pop(); root = splay(parentStack, operator<); return strictUpperBound; } if (found || item < current.value) { strictUpperBound = current.value; parentStack.push(current.leftchild); } else { parentStack.push(current.rightchild); if (!(current.value < item)) found = true; } } assert(false, "Unreachable code"); return emptyresponse; } T before(T item) { treenode[] parentStack = new treenode[0]; parentStack.cyclic = true; parentStack.push(root); T strictLowerBound = emptyresponse; bool found = false; while (true) { treenode current = parentStack[-1]; if (current == null) { parentStack.pop(); root = splay(parentStack, operator<); return strictLowerBound; } if (found || current.value < item) { strictLowerBound = current.value; parentStack.push(current.rightchild); } else { parentStack.push(current.leftchild); if (!(item < current.value)) found = true; } } assert(false, "Unreachable code"); return emptyresponse; } T firstGEQ(T item) { treenode[] parentStack = new treenode[0]; parentStack.cyclic = true; parentStack.push(root); T upperBound = emptyresponse; while (true) { treenode current = parentStack[-1]; if (current == null) { parentStack.pop(); root = splay(parentStack, operator<); return upperBound; } if (current.value < item) { parentStack.push(current.rightchild); } else if (item < current.value) { upperBound = current.value; parentStack.push(current.leftchild); } else { root = splay(parentStack, operator<); return current.value; } } assert(false, "Unreachable code"); return emptyresponse; } T firstLEQ(T item) { treenode[] parentStack = new treenode[0]; parentStack.cyclic = true; parentStack.push(root); T lowerBound = emptyresponse; while (true) { treenode current = parentStack[-1]; if (current == null) { parentStack.pop(); root = splay(parentStack, operator<); return lowerBound; } if (item < current.value) { parentStack.push(current.leftchild); } else if (current.value < item) { lowerBound = current.value; parentStack.push(current.rightchild); } else { root = splay(parentStack, operator<); return current.value; } } assert(false, "Unreachable code"); return emptyresponse; } T min() { if (root == null) return emptyresponse; treenode[] ancestors = new treenode[0]; ancestors.cyclic = true; treenode current = root; while (current != null) { ancestors.push(current); current = current.leftchild; } root = splay(ancestors, operator<); return root.value; } T popMin() { if (root == null) return emptyresponse; treenode[] ancestors = new treenode[0]; ancestors.cyclic = true; treenode current = root; while (current != null) { ancestors.push(current); current = current.leftchild; } root = splay(ancestors, operator<); T toReturn = root.value; root = root.rightchild; --size; return toReturn; } T max() { if (root == null) return emptyresponse; treenode[] ancestors = new treenode[0]; ancestors.cyclic = true; treenode current = root; while (current != null) { ancestors.push(current); current = current.rightchild; } root = splay(ancestors, operator<); return root.value; } T popMax() { if (root == null) return emptyresponse; treenode[] ancestors = new treenode[0]; ancestors.cyclic = true; treenode current = root; while (current != null) { ancestors.push(current); current = current.rightchild; } root = splay(ancestors, operator<); T toReturn = root.value; root = root.leftchild; --size; return toReturn; } /* * returns true iff the tree was modified */ bool insert(T value) { if (root == null) { root = treenode(value); ++size; return true; } treenode[] ancestors = new treenode[0]; ancestors.cyclic = true; ancestors.push(root); bool toReturn = false; while (!toReturn) { treenode current = ancestors[-1]; if (value < current.value) { if (current.leftchild == null) { current.leftchild = treenode(value); toReturn = true; } ancestors.push(current.leftchild); } else if (current.value < value) { if (current.rightchild == null) { current.rightchild = treenode(value); toReturn = true; } ancestors.push(current.rightchild); } else { root = splay(ancestors, operator<); return false; } } root = splay(ancestors, operator<); ++size; return true; } T replace(T item) { if (root == null) { insert(item); return emptyresponse; } treenode[] ancestors = new treenode[0]; ancestors.cyclic = true; ancestors.push(root); treenode current = root; while (true) { if (item < current.value) { if (current.leftchild == null) { current.leftchild = treenode(item); ancestors.push(current.leftchild); break; } ancestors.push(current.leftchild); current = current.leftchild; } else if (current.value < item) { if (current.rightchild == null) { current.rightchild = treenode(item); ancestors.push(current.rightchild); break; } ancestors.push(current.rightchild); current = current.rightchild; } else { T toReturn = current.value; current.value = item; root = splay(ancestors, operator<); return toReturn; } } root = splay(ancestors, operator<); ++size; return emptyresponse; } T get(T item) { if (root == null) return emptyresponse; treenode[] parentStack = new treenode[0]; parentStack.cyclic = true; parentStack.push(root); while (true) { treenode current = parentStack[-1]; if (current == null) { parentStack.pop(); root = splay(parentStack, operator<); return emptyresponse; } if (item < current.value) { parentStack.push(current.leftchild); } else if (current.value < item) { parentStack.push(current.rightchild); } else { root = splay(parentStack, operator<); return current.value; } } assert(false, "Unreachable code"); return emptyresponse; } /* * returns true iff the tree was modified */ bool delete(T value) { treenode[] ancestors = new treenode[0]; ancestors.cyclic = true; // Makes ancestors[-1] refer to the last entry. ancestors.push(root); while (true) { treenode current = ancestors[-1]; if (current == null) { ancestors.pop(); root = splay(ancestors, operator<); return false; } if (value < current.value) ancestors.push(current.leftchild); else if (current.value < value) ancestors.push(current.rightchild); else break; } treenode toDelete = ancestors.pop(); treenode parent = null; if (ancestors.length > 0) parent = ancestors[-1]; if (toDelete.leftchild == null) { if (parent != null) { if (parent.rightchild == toDelete) { parent.rightchild = toDelete.rightchild; } else { parent.leftchild = toDelete.rightchild; } } else root = toDelete.rightchild; } else if (toDelete.rightchild == null) { if (parent == null) { root = toDelete.leftchild; } else if (parent.rightchild == toDelete) { parent.rightchild = toDelete.leftchild; } else parent.leftchild = toDelete.leftchild; } else { treenode[] innerStack = new treenode[0]; innerStack.cyclic = true; treenode current = toDelete.rightchild; while (current != null) { innerStack.push(current); current = current.leftchild; } toDelete.rightchild = splay(innerStack, operator<); toDelete.value = toDelete.rightchild.value; toDelete.rightchild = toDelete.rightchild.rightchild; } if (parent != null) root = splay(ancestors, operator<); --size; return true; } void forEach(bool run(T)) { inOrderNonRecursive(root, run); } } SortedSet_T operator cast(SplayTree_T splaytree) { SortedSet_T result = new SortedSet_T; result.size = splaytree.size; result.empty = splaytree.empty; result.contains = splaytree.contains; result.after = splaytree.after; result.before = splaytree.before; result.firstGEQ = splaytree.firstGEQ; result.firstLEQ = splaytree.firstLEQ; result.min = splaytree.min; result.popMin = splaytree.popMin; result.max = splaytree.max; result.popMax = splaytree.popMax; result.insert = splaytree.insert; result.replace = splaytree.replace; result.get = splaytree.get; result.delete = splaytree.delete; result.forEach = splaytree.forEach; return result; } Set_T operator cast(SplayTree_T splaytree) { return (SortedSet_T)splaytree; } T[] operator cast(SplayTree_T splaytree) { return (SortedSet_T)splaytree; }asymptote-3.05/tests/template/imports/composeFunctions.asy0000644000000000000000000000017615031566105022720 0ustar rootroottypedef import(R, F1, F2, I); typedef R FF(I); FF compose(F1 f1, F2 f2) { return new R(I i) { return f1(f2(i)); }; }asymptote-3.05/tests/template/imports/Cpass.asy0000644000000000000000000000010115031566105020417 0ustar rootroottypedef import(T); from 'template/imports/C'(T=T) access global;asymptote-3.05/tests/template/imports/B.asy0000644000000000000000000000002315031566105017532 0ustar rootroottypedef import(T); asymptote-3.05/tests/template/imports/notTemplate2.asy0000644000000000000000000000011115031566105021725 0ustar rootrootstruct B { import 'template/imports/notTemplate' as notTemplate; } B b;asymptote-3.05/tests/template/imports/structTemplate.asy0000644000000000000000000000277615031566105022412 0ustar rootroot// Assumption: T is a struct with a static int `global`, a non-static int // `local`, and an autounravel int `au`. The value of T.au is -1. Lib is a // struct with a static string `testName`. typedef import(T, Lib); import TestLib; StartTest('Accessing static testName'); Lib.testName; EndTest(); StartTest(Lib.testName + ': new'); new T; EndTest(); StartTest(Lib.testName + ': Unspecified Declaration'); T a; EndTest(); StartTest(Lib.testName + ': Initializing to null'); T b = null; EndTest(); StartTest(Lib.testName + ': Initializing to new'); T c = new T; EndTest(); StartTest(Lib.testName + ': Access static member'); int d = T.global; EndTest(); StartTest(Lib.testName + ': Access non-static member'); int e = c.local; EndTest(); StartTest(Lib.testName + ': Access static member from instance'); int f = c.global; EndTest(); StartTest(Lib.testName + ': Unraveling and accessing static member'); from T unravel global; int g = global; EndTest(); StartTest(Lib.testName + ': Access autounravel member'); assert(au == -1); assert(T.au == -1); assert(c.au == -1); au = -2; assert(au == -2); assert(T.au == -2); assert(c.au == -2); T.au = -3; assert(au == -3); assert(T.au == -3); assert(c.au == -3); c.au = -4; assert(au == -4); assert(T.au == -4); assert(c.au == -4); au = -1; // Reset for next test EndTest(); StartTest(Lib.testName + ': Equality, inequality, and alias'); T h = new T; assert(h == h); assert(!(h == null)); assert(h != null); assert(!(h != h)); assert(alias(h, h)); assert(!alias(h, null)); EndTest();asymptote-3.05/tests/template/imports/sortedset.asy0000644000000000000000000001274515031566105021403 0ustar rootroottypedef import(T); from "template/imports/pureset"(T=T) access Set_T, operator cast, makeNaiveSet; struct SortedSet_T { int size(); bool empty() { return size() == 0; } bool contains(T item); T get(T item); // Returns the item in the collection that is // equivalent to item, or emptyresponse if there is no // such item. // Returns the least element > item, or emptyresponse if there is no such // element. T after(T item); // Returns the greatest element < item, or emptyresponse if there is no such // element. T before(T item); T firstGEQ(T item) { return contains(item) ? get(item) : after(item); } T firstLEQ(T item) { return contains(item) ? get(item) : before(item); } T min(); // Returns emptyresponse if collection is empty. T popMin(); // Returns emptyresponse if collection is empty. T max(); // Returns emptyresponse if collection is empty. T popMax(); // Returns emptyresponse if collection is empty. bool insert(T item); // Returns true iff the collection is modified. T replace(T item); // Inserts item, and returns the item that was // replaced, or emptyresponse if no item was replaced. bool delete(T item); // Returns true iff the collection is modified. // Calls process on each item in the collection, in ascending order, // until process returns false. void forEach(bool process(T item)); } T[] operator cast(SortedSet_T set) { T[] result; set.forEach(new bool(T item) { result.push(item); return true; }); return result; } Set_T unSort(SortedSet_T sorted_set) { Set_T set = new Set_T; set.size = sorted_set.size; set.empty = sorted_set.empty; set.contains = sorted_set.contains; set.insert = sorted_set.insert; set.replace = sorted_set.replace; set.get = sorted_set.get; set.delete = sorted_set.delete; set.forEach = sorted_set.forEach; return set; } Set_T operator cast(SortedSet_T) = unSort; // For testing purposes, we provide a naive implementation of SortedSet_T. // This implementation is highly inefficient, but it is correct, and can be // used to test other implementations of SortedSet_T. struct NaiveSortedSet_T { private bool lt(T a, T b); private T[] buffer = new T[0]; private T emptyresponse; private bool leq(T a, T b) { return !lt(b, a); } private bool gt(T a, T b) { return lt(b, a); } private bool geq(T a, T b) { return leq(b, a); } private bool equiv(T a, T b) { return leq(a, b) && leq(b, a); } void operator init(bool lessThan(T, T), T emptyresponse) { this.lt = lessThan; this.emptyresponse = emptyresponse; } int size() { return buffer.length; } bool contains(T item) { for (T possibility : buffer) { if (equiv(possibility, item)) return true; } return false; } T after(T item) { for (T possibility : buffer) { if (gt(possibility, item)) return possibility; } return emptyresponse; } T before(T item) { for (int ii = buffer.length - 1; ii >= 0; --ii) { T possibility = buffer[ii]; if (lt(possibility, item)) return possibility; } return emptyresponse; } T min() { if (buffer.length == 0) return emptyresponse; return buffer[0]; } T popMin() { if (buffer.length == 0) return emptyresponse; T toreturn = buffer[0]; buffer.delete(0); return toreturn; } T max() { if (buffer.length == 0) return emptyresponse; return buffer[buffer.length - 1]; } T popMax() { if (buffer.length == 0) return emptyresponse; return buffer.pop(); } bool insert(T item) { for (int i = 0; i < buffer.length; ++i) { if (equiv(buffer[i], item)) return false; else if (gt(buffer[i], item)) { buffer.insert(i, item); return true; } } buffer.push(item); return true; } T replace(T item) { for (int i = 0; i < buffer.length; ++i) { if (equiv(buffer[i], item)) { T toreturn = buffer[i]; buffer[i] = item; return toreturn; } else if (gt(buffer[i], item)) { buffer.insert(i, item); return emptyresponse; } } buffer.push(item); return emptyresponse; } T get(T item) { for (T possibility : buffer) { if (equiv(possibility, item)) return possibility; } return emptyresponse; } bool delete(T item) { for (int i = 0; i < buffer.length; ++i) { if (equiv(buffer[i], item)) { buffer.delete(i); return true; } } return false; } void forEach(bool process(T item)) { for (T item : buffer) { if (!process(item)) break; } } } SortedSet_T operator cast(NaiveSortedSet_T naive) { SortedSet_T toreturn; toreturn.size = naive.size; toreturn.contains = naive.contains; toreturn.after = naive.after; toreturn.before = naive.before; toreturn.min = naive.min; toreturn.popMin = naive.popMin; toreturn.max = naive.max; toreturn.popMax = naive.popMax; toreturn.insert = naive.insert; toreturn.replace = naive.replace; toreturn.get = naive.get; toreturn.delete = naive.delete; toreturn.forEach = naive.forEach; return toreturn; } // Compose cast operators, since implicit casting is not transitive. T[] operator cast(NaiveSortedSet_T naive) { return (SortedSet_T)naive; } SortedSet_T makeNaiveSortedSet(bool lessThan(T, T), T emptyresponse) { return NaiveSortedSet_T(lessThan, emptyresponse); }asymptote-3.05/tests/template/imports/wrapperWithEquals.asy0000644000000000000000000000034215031566105023044 0ustar rootroottypedef import(T); access "template/imports/wrapper"(T=T) as wrapper; unravel wrapper; bool operator == (Wrapper_T a, Wrapper_T b) { return a.t == b.t; } bool operator != (Wrapper_T a, Wrapper_T b) { return a.t != b.t; }asymptote-3.05/tests/template/imports/wrapper.asy0000644000000000000000000000021715031566105021036 0ustar rootroottypedef import(T); struct Wrapper_T { T t; void operator init(T t) { this.t = t; } } Wrapper_T wrap(T t) { return Wrapper_T(t); }asymptote-3.05/tests/template/imports/pureset.asy0000644000000000000000000000443515031566105021053 0ustar rootroottypedef import(T); struct Set_T { int size(); bool empty() { return size() == 0; } bool contains(T item); bool insert(T item); T replace(T item); // Inserts item, and returns the item that was // replaced, or emptyresponse if no item was replaced. T get(T item); bool delete(T item); // Calls process on each item in the collection until process returns false. void forEach(bool process(T item)); } struct NaiveSet_T { private T[] buffer = new T[0]; private T emptyresponse; private bool equiv(T a, T b); void operator init(bool equiv(T a, T b), T emptyresponse) { this.equiv = equiv; this.emptyresponse = emptyresponse; } int size() { return buffer.length; } bool contains(T item) { for (T a : buffer) { if (equiv(a, item)) { return true; } } return false; } bool insert(T item) { if (contains(item)) { return false; } buffer.push(item); return true; } T replace(T item) { for (int i = 0; i < buffer.length; ++i) { if (equiv(buffer[i], item)) { T old = buffer[i]; buffer[i] = item; return old; } } buffer.push(item); return emptyresponse; } T get(T item) { for (T a : buffer) { if (equiv(a, item)) { return a; } } return emptyresponse; } bool delete(T item) { for (int i = 0; i < buffer.length; ++i) { if (equiv(buffer[i], item)) { buffer[i] = buffer[buffer.length - 1]; buffer.pop(); return true; } } return false; } void forEach(bool process(T item)) { for (T a : buffer) { if (!process(a)) { return; } } } } Set_T operator cast(NaiveSet_T naiveSet) { Set_T set = new Set_T; set.size = naiveSet.size; set.contains = naiveSet.contains; set.insert = naiveSet.insert; set.replace = naiveSet.replace; set.get = naiveSet.get; set.delete = naiveSet.delete; set.forEach = naiveSet.forEach; return set; } T[] operator cast(Set_T set) { T[] buffer = new T[set.size()]; int i = 0; set.forEach(new bool(T item) { buffer[i] = item; ++i; return true; }); return buffer; } Set_T makeNaiveSet(bool equiv(T, T), T emptyresponse) { return NaiveSet_T(equiv, emptyresponse); }asymptote-3.05/tests/template/imports/A.asy0000644000000000000000000000004115031566105017531 0ustar rootroottypedef import(T); struct A { } asymptote-3.05/tests/template/imports/notTemplate.asy0000644000000000000000000000012215031566105021645 0ustar rootrootstruct A { static int global = 17; int local = 3; autounravel int au = -1; }asymptote-3.05/tests/template/imports/C.asy0000644000000000000000000000010315031566105017532 0ustar rootroottypedef import(T); T a=new T; assert(a.x == 1); int global = 17; asymptote-3.05/tests/template/functionTest.asy0000644000000000000000000000051415031566105020346 0ustar rootrootimport TestLib; typedef real F1(string); typedef string F2(int); real f1(string s) { return length(s); } F2 f2 = operator ecast; StartTest("Function type parameters"); from 'template/imports/composeFunctions'(R=real, F1=F1, F2=F2, I=int) access compose; real r = compose(f1, f2)(1234567890); assert(r == 10); EndTest();asymptote-3.05/tests/template/mapArrayTest.asy0000644000000000000000000000042415031566105020275 0ustar rootrootimport TestLib; StartTest("mapArray"); from mapArray(Src=real, Dst=string) access map; real[] a = {1.0, 1.5, 2.5, -3.14}; string[] b = map(new string(real x) {return (string)x;}, a); assert(all(b == new string[] {"1", "1.5", "2.5", "-3.14"})); EndTest();asymptote-3.05/tests/template/structTest.asy0000644000000000000000000000240215031566105020043 0ustar rootrootstruct BareStruct { static string testName = "bare struct"; } struct A { static int global = 17; int local = 3; autounravel int au = -1; } access 'template/imports/structTemplate'(T=A, Lib=BareStruct) as bareStruct; struct NestedStruct { static string testName = "nested struct"; } struct B { static struct C { static int global = 17; int local = 3; autounravel int au = -1; } } access 'template/imports/structTemplate'(T=B.C, Lib=NestedStruct) as nestedStruct; struct DeeplyNestedStruct { static string testName = "deeply nested struct"; } struct G { static struct H { static struct I { static int global = 17; int local = 3; autounravel int au = -1; } } } G g; access 'template/imports/structTemplate'(T=g.H.I, Lib=DeeplyNestedStruct) as deeplyNestedStruct; struct ImportedStruct { static string testName = "imported struct"; } access 'template/imports/notTemplate' as notTemplate; access 'template/imports/structTemplate'(T=notTemplate.A, Lib=ImportedStruct) as importedStruct; struct NestedImport { static string testName = "nested import"; } access 'template/imports/notTemplate2' as notTemplate2; access 'template/imports/structTemplate'(T=notTemplate2.b.A, Lib=NestedImport) as nestedImport;asymptote-3.05/tests/template/initTest.asy0000644000000000000000000000042615031566105017466 0ustar rootrootaccess "template/imports/A"(T=int) as a; unravel a; access "template/imports/B"(T=A) as b; unravel b; import TestLib; StartTest("init"); A c; EndTest(); StartTest("new"); struct X { static struct A { int x=1; } } access "template/imports/C"(T=X.A) as p; EndTest(); asymptote-3.05/tests/template/singletype.asy0000644000000000000000000000161615031566105020050 0ustar rootrootimport TestLib; StartTest("singletype"); struct A {} // TODO: Should we import operator== and alias for free? from "template/imports/wrapperWithEquals"(T=int) access Wrapper_T as Wrapper_int, wrap, operator ==, alias; // TODO: Create a way to pass operator==(A, A) to the template, either // implicitly or explicitly. // from "template/imports/wrapperWithEquals"(T=A) access // Wrapper_T as Wrapper_A, wrap, operator ==, alias; // error from "template/imports/wrapper"(T=A) access Wrapper_T as Wrapper_A, wrap, alias; // Basic functionality for ints: Wrapper_int w1 = wrap(5); Wrapper_int w2 = Wrapper_int(5); // tests constructor assert(w1.t == 5); assert(w2.t == 5); assert(w1 == w2); assert(!alias(w1, w2)); // Basic functionality for A: var a = new A; Wrapper_A w3 = wrap(a); Wrapper_A w4 = Wrapper_A(a); // tests constructor assert(w3.t == w4.t); assert(!alias(w3, w4)); EndTest(); asymptote-3.05/tests/string/0000755000000000000000000000000015031566105014636 5ustar rootrootasymptote-3.05/tests/string/erase.asy0000644000000000000000000000035415031566105016455 0ustar rootrootimport TestLib; StartTest("erase"); string s = "abcdef"; assert(erase(s,2,2) == "abef"); assert(erase(s,-1,2) == "abcdef"); assert(erase(s,7,1) == "abcdef"); assert(erase(s,3,0) == "abcdef"); assert(erase(s,5,2) == "abcde"); EndTest(); asymptote-3.05/tests/string/find.asy0000644000000000000000000000026615031566105016300 0ustar rootrootimport TestLib; StartTest("find"); string s = "abcdefab"; assert(find(s,"cd") == 2); assert(find(s,"cd",3) == -1); assert(find(s,"ab") == 0); assert(find(s,"ab",1) == 6); EndTest(); asymptote-3.05/tests/string/length.asy0000644000000000000000000000020415031566105016631 0ustar rootrootimport TestLib; StartTest("length"); assert(length("") == 0); assert(length("abc") == 3); assert(length("abcdef") == 6); EndTest(); asymptote-3.05/tests/string/insert.asy0000644000000000000000000000015515031566105016661 0ustar rootrootimport TestLib; StartTest("insert"); string sub = insert("abef",2,"cd"); assert(sub == "abcdef"); EndTest(); asymptote-3.05/tests/string/substr.asy0000644000000000000000000000016615031566105016701 0ustar rootrootimport TestLib; StartTest("substr"); string s = "abcdef"; string sub = substr(s,2,2); assert(sub == "cd"); EndTest(); asymptote-3.05/tests/string/rfind.asy0000644000000000000000000000027315031566105016460 0ustar rootrootimport TestLib; StartTest("rfind"); string s = "abcdefab"; assert(rfind(s,"cd") == 2); assert(rfind(s,"cd",1) == -1); assert(rfind(s,"ab") == 6); assert(rfind(s,"ab",5) == 0); EndTest(); asymptote-3.05/tests/io/0000755000000000000000000000000015031566105013737 5ustar rootrootasymptote-3.05/tests/io/data3.txt0000644000000000000000000000010715031566105015472 0ustar rootroot2 3 4 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 asymptote-3.05/tests/io/csv.asy0000644000000000000000000000057715031566105015261 0ustar rootrootimport TestLib; StartTest("csv"); { real[] a=input("io/input_with_nan.csv").csv(); assert(a.length == 20); for (int i=0; i<4; ++i) assert(a[i] == i); for (int i=4; i<8; ++i) assert(isnan(a[i])); for (int i=8; i<12; ++i) assert(isnan(a[i])); for (int i=12; i<16; ++i) assert(a[i] == inf); for (int i=16; i<20; ++i) assert(a[i] == -inf); } EndTest(); asymptote-3.05/tests/io/xdr.asy0000644000000000000000000000205415031566105015253 0ustar rootrootimport TestLib; void test(bool r, bool i) { file fout=output("xdata",mode="xdr").word().singlereal(r).singleint(i); write(fout,"test"); write(fout,1); write(fout,2.0); write(fout,(3,4)); write(fout,(5,6,7)); close(fout); file fin=input("xdata",mode="xdr").word().singlereal(r).singleint(i); string a=fin; assert(a == "test"); int b=fin; assert(b == 1); real c=fin; assert(c == 2.0); pair d=fin; assert(d == (3,4)); triple e=fin; assert(e == (5,6,7)); } StartTest("xdr: single real, single int"); { test(true,true); } EndTest(); StartTest("xdr: single real, double int"); { test(true,false); } EndTest(); StartTest("xdr: double real, single int"); { test(false,true); } EndTest(); StartTest("xdr: double real, double int"); { test(false,false); } EndTest(); StartTest("xdr: character"); { file fout=output("xdata",mode="xdr"); write(fout,"a"); write(fout,"b"); close(fout); file fin=input("xdata",mode="xdr"); string a=getc(fin); assert(a == "a"); string b=getc(fin); assert(b == "b"); } EndTest(); asymptote-3.05/tests/io/data2.txt0000644000000000000000000000002015031566105015463 0ustar rootroot2 3 0 1 2 3 4 5 asymptote-3.05/tests/io/input_with_nan.csv0000644000000000000000000000014415031566105017501 0ustar rootroot 0, 1, 2, 3 NaN, NAN, nan, nAn -NaN,-NAN,-nan,-nAn InF, INF, inf, iNf -InF,-INF,-inf,-iNf asymptote-3.05/tests/io/data1.txt0000644000000000000000000000002715031566105015471 0ustar rootroot10 0 1 2 3 4 5 6 7 8 9 asymptote-3.05/tests/io/read.asy0000644000000000000000000000342715031566105015376 0ustar rootrootimport TestLib; StartTest("read1"); { file fin=input("io/data1.txt").read(1); real[] a=fin; assert(a.length == 10); int c=-1; for(int i=0; i < a.length; ++i) assert(a[i] == ++c); seek(fin,0); real[] b=fin.line(); assert(fin.line); assert(b[0] == a.length); real[] b=fin; c=-1; for(int i=0; i < b.length; ++i) assert(b[i] == ++c); seek(fin,0); real nx=fin; real[] b=fin.dimension(5); assert(all(fin.dimension == new int[] {5,-1,-1})); c=-1; for(int i=0; i < 5; ++i) assert(b[i] == ++c); } EndTest(); StartTest("read2"); { file fin=input("io/data2.txt").read(2); real[][] a=fin; assert(a.length == 2); assert(a[0].length == 3); int c=-1; for(int i=0; i < a.length; ++i) for(int j=0; j < a[0].length; ++j) assert(a[i][j] == ++c); seek(fin,0); real nx=fin; real ny=fin; c=-1; real[][] b=fin.dimension(a.length,a[0].length); assert(all(fin.dimension == new int[] {a.length,a[0].length,-1})); for(int i=0; i < a.length; ++i) for(int j=0; j < a[0].length; ++j) assert(b[i][j] == ++c); } EndTest(); StartTest("read3"); { file fin=input("io/data3.txt").read(3); real[][][] a=fin; assert(a.length == 2); assert(a[0].length == 3); assert(a[0][0].length == 4); int c=-1; for(int i=0; i < a.length; ++i) for(int j=0; j < a[0].length; ++j) for(int k=0; k < a[0][0].length; ++k) assert(a[i][j][k] == ++c); seek(fin,0); real nx=fin; real ny=fin; real nz=fin; real[][][] b=fin.dimension(a.length,a[0].length,a[0][0].length); assert(all(fin.dimension == new int[] {a.length,a[0].length,a[0][0].length})); c=-1; for(int i=0; i < a.length; ++i) for(int j=0; j < a[0].length; ++j) for(int k=0; k < a[0][0].length; ++k) assert(b[i][j][k] == ++c); } EndTest(); asymptote-3.05/tests/arith/0000755000000000000000000000000015031566105014437 5ustar rootrootasymptote-3.05/tests/arith/pair.asy0000644000000000000000000000071215031566105016110 0ustar rootrootimport TestLib; StartTest("complex addition"); assert((1,0)+(0,1) == (1,1)); EndTest(); StartTest("complex subtraction"); assert((1,0)-(0,1) == (1,-1)); EndTest(); StartTest("complex multiplication"); assert((1,2)*(2,1) == (0,5)); EndTest(); StartTest("complex division"); assert((0,5)/(2,1) == (1,2)); EndTest(); StartTest("length(pair)"); assert(length((0.0,1.0)) == 1.0); EndTest(); StartTest("conj()"); assert(conj((0.0,1.0)) == (0.0,-1.0)); EndTest(); asymptote-3.05/tests/arith/real.asy0000644000000000000000000000103315031566105016075 0ustar rootroot// Real arithmetic. import TestLib; StartTest("real error"); assert((1.0-1.0) < realEpsilon); EndTest(); StartTest("real addition"); assert((1.0+1.0) == (2.0)); EndTest(); StartTest("real subtraction"); assert((2.0-1.0) == (1.0)); EndTest(); StartTest("real multiplication"); assert((2.0*2.0) == (4.0)); EndTest(); StartTest("real division"); assert((4.0/2.0) == (2.0)); EndTest(); StartTest("real mod"); assert((12.0%5.0) == (2.0)); assert((-12.0%5.0) == (3.0)); assert((12.0%-5.0) == (-3.0)); assert((-12.0%-5.0) == (-2.0)); EndTest(); asymptote-3.05/tests/arith/random.asy0000644000000000000000000000030115031566105016427 0ustar rootrootimport TestLib; StartTest("random"); bool bit32=false; for(int i=0; i < 1000; ++i) { real x=unitrand(); if(x > 0.5) bit32=true; assert(x >= 0.0 && x <= 1.0); } assert(bit32); EndTest(); asymptote-3.05/tests/arith/transform.asy0000644000000000000000000000117715031566105017176 0ustar rootrootimport TestLib; pair x = (1, 2); StartTest("identity transform"); assert(identity()*x == x); EndTest(); StartTest("shift transform"); assert(shift((1,1))*x == (2, 3)); assert(shift(1,1)*x == (2, 3)); EndTest(); StartTest("scaling transforms"); assert(xscale(2)*x == (2, 2)); assert(yscale(2)*x == (1, 4)); assert(scale(2)*x == (2, 4)); EndTest(); StartTest("slant transform"); assert(slant(1)*x == (3, 2)); EndTest(); StartTest("rotation transform"); assert(length((rotate(90)*x) - (-2,1)) <= realEpsilon); assert(rotate(90, x)*x == x); EndTest(); StartTest("reflect transform"); assert(reflect((-1, -1), (1, 1))*x == (2, 1)); EndTest(); asymptote-3.05/tests/arith/triple.asy0000644000000000000000000000036415031566105016457 0ustar rootrootimport TestLib; triple t = (1,0,0); StartTest("polar()"); assert(polar(t) == (pi / 2.0) ); EndTest(); StartTest("azimuth()"); assert(azimuth(t) < realEpsilon); EndTest(); StartTest("unit()"); assert(length(t-unit(t)) < realEpsilon); EndTest(); asymptote-3.05/tests/arith/roots.asy0000644000000000000000000000325615031566105016331 0ustar rootroot// Roots. import TestLib; real x; real[] r; StartTest("quadratic roots"); r=quadraticroots(1,0,-8); assert(r.length == 2); r=sort(r); x=2sqrt(2); assert(close(r[0],-x)); assert(close(r[1],x)); r=quadraticroots(1,2,1); assert(r.length == 2); assert(close(r[0],-1)); assert(close(r[1],-1)); r=quadraticroots(1,0,8); assert(r.length == 0); r=quadraticroots(0,2,3); assert(r.length == 1); assert(close(r[0],-3/2)); EndTest(); StartTest("cubic roots"); r=cubicroots(1,0,0,-8); assert(r.length == 1); assert(close(r[0],2)); real[] r=cubicroots(1,3,3,1); assert(r.length == 3); assert(close(r[0],-1)); assert(close(r[1],-1)); assert(close(r[2],-1)); real[] r=cubicroots(1,-3,3,-1); assert(r.length == 3); assert(close(r[0],1)); assert(close(r[1],1)); assert(close(r[2],1)); r=cubicroots(1,0,0,0); assert(r.length == 3); assert(r[0] == 0); assert(r[1] == 0); assert(r[2] == 0); r=cubicroots(1,0,-15,-4); assert(r.length == 3); r=sort(r); assert(close(r[0],-2-sqrt(3))); assert(close(r[1],-2+sqrt(3))); assert(close(r[2],4)); r=cubicroots(1,0,-15,4); assert(r.length == 3); r=sort(r); assert(close(r[0],-4)); assert(close(r[1],2-sqrt(3))); assert(close(r[2],2+sqrt(3))); r=cubicroots(1,0,-15,0); assert(r.length == 3); r=sort(r); x=sqrt(15); assert(close(r[0],-x)); assert(r[1] == 0); assert(close(r[2],x)); r=cubicroots(1,1,1,0); assert(r.length == 1); assert(r[0] == 0); r=cubicroots(1,0,20,-4); assert(r.length == 1); x=cbrt(54+6sqrt(6081)); assert(close(r[0],x/3-20/x)); EndTest(); StartTest("newton"); real f(real x) {return cos(x);} real dfdx(real x) {return -sin(x);} assert(close(newton(f,dfdx,1),pi/2)); assert(newton(f,dfdx,0) == realMax); assert(newton(f,dfdx,0,2) == pi/2); EndTest(); asymptote-3.05/tests/arith/integer.asy0000644000000000000000000000202415031566105016610 0ustar rootroot// Integer arithmetic. import TestLib; StartTest("integer addition"); assert(1+1 == 2); EndTest(); StartTest("integer subtraction"); assert(2-1 == 1); EndTest(); StartTest("integer multiplication"); assert(2*2 == 4); EndTest(); StartTest("integer division"); assert(4/2 == 2); assert(3/2 == 1.5); EndTest(); StartTest("integer quotient"); assert(4#2 == 2); assert(3#2 == 1); assert(1#2 == 0); assert(-1#2 == -1); assert(1#-2 == -1); assert(-1#-2 == 0); assert(-3#2 == -2); EndTest(); StartTest("integer mod"); assert(12%5 == 2); assert(-12%5 == 3); assert(12%-5 == -3); assert(-12%-5 == -2); assert(13%4 == 1); assert(-13%4 == 3); assert(13%-4 == -3); assert(-13%-4 == -1); EndTest(); StartTest("integer self ops"); { int x=3; assert(++x == 4); assert(x == 4); } { int x=3; assert(--x == 2); assert(x == 2); } { int x=3; assert((x += 7) == 10); assert(x == 10); } { int x=3; assert((x -= 7) == -4); assert(x == -4); } { int x=3; assert((x *= 7) == 21); assert(x == 21); } { int x=10; assert((x %= 4) == 2); assert(x == 2); } EndTest(); asymptote-3.05/tests/imp/0000755000000000000000000000000015031566105014115 5ustar rootrootasymptote-3.05/tests/imp/imports/0000755000000000000000000000000015031566105015612 5ustar rootrootasymptote-3.05/tests/imp/imports/A.asy0000644000000000000000000000003615031566105016507 0ustar rootrootstruct B { static int x=4; }asymptote-3.05/tests/imp/unravel.asy0000644000000000000000000000265115031566105016313 0ustar rootrootimport TestLib; StartTest("unravel"); { struct A { int x=1, y=2, z=3; int y() { return 7; } } A a=new A; unravel a; assert(x==1); assert(y==2); assert(z==3); assert(y()==7); } { struct A { private int x=1; int y=2, z=3; int y() { return 7; } } int x=5; A a=new A; unravel a; assert(x==5); assert(y==2); assert(z==3); } { struct A { public int x=1; int y=2, z=3; int y() { return 7; } } int z=5; A a=new A; from a unravel x,y; assert(x==1); assert(y==2); assert(z==5); assert(y()==7); } { struct A { public int x=1; int y=2, z=3; int y() { return 7; } } int y=4; int z=5; A a=new A; from a unravel x,y as blah; assert(x==1); assert(y==4); assert(blah==2); assert(z==5); assert(blah()==7); } { struct A { struct B { static int x=4; } } A a=new A; int x=3; from a.B unravel x; assert(x==4); } { struct A { struct B { static int x=4; } } A a=new A; A.B b=new a.B; int x=3; from b unravel x; assert(x==4); } { struct A { static struct B { static int x=4; } } int x=3; from A.B unravel x; assert(x==4); } { struct A { static struct B { static int x=4; } } int x=3; from A unravel B; from B unravel x; assert(x==4); } { access 'imp/imports/A' as A; int x=3; from A unravel B; from B unravel x; assert(x==4); } EndTest(); asymptote-3.05/tests/Makefile0000644000000000000000000000033715031566105014773 0ustar rootroot.NOTPARALLEL: TESTDIRS = $(wildcard */) test: $(TESTDIRS) $(TESTDIRS):: @echo ../asy -dir ../base $@*.asy $(EXTRADIRS):: @echo ../asy -dir ../base $@*.asy clean: FORCE rm -f *.eps distclean: FORCE clean FORCE: asymptote-3.05/tests/gs/0000755000000000000000000000000015031566105013741 5ustar rootrootasymptote-3.05/tests/gs/ghostscript.asy0000644000000000000000000000056115031566105017032 0ustar rootrootimport TestLib; StartTest("Ghostscript"); bool uptodate=texpath("A").length != 0; if(!uptodate) { write(); write(); write("Incompatible Ghostscript version!"); write("Please set environment variable ASYMPTOTE_EPSDRIVER to"); write("\"epswrite\" for Ghostscript < 9.14 and to \"eps2write\" for Ghostscript >= 9.14"); write(); } assert(uptodate); EndTest(); asymptote-3.05/tests/pic/0000755000000000000000000000000015031566105014103 5ustar rootrootasymptote-3.05/tests/pic/trans.asy0000644000000000000000000000255015031566105015752 0ustar rootrootimport TestLib; StartTest("trans"); // Ensure the same test each time. srand(3456); pair randompair() { return (unitrand(),unitrand()); } path randombox() { return box(randompair(), randompair()); } // For now, only tests transforms which take axes to axes. transform randomtrans() { return rotate(90 * (rand() % 4)) * shift(unitrand(), unitrand()); } real tolerance = 1e-4; void testpic(int objs, int trans) { path[] pp; picture orig; for (int i = 0; i < objs; ++i) { pp.push(randombox()); fill(orig, pp[i]); } picture pic = orig; transform t = identity(); for (int i = 0; i < trans; ++i) { transform tt = randomtrans(); pic = tt * pic; t = tt * t; } pair m = pic.userMin2(), M = pic.userMax2(); pair pm = min(t * pp), pM = max(t * pp); assert(abs(m-pm) < tolerance); assert(abs(M-pM) < tolerance); } for (int i = 0; i < 100; ++i) testpic(1,1); for (int i = 0; i < 100; ++i) testpic(1,1); for (int i = 0; i < 100; ++i) testpic(3,1); for (int i = 0; i < 100; ++i) testpic(1,2); for (int i = 0; i < 100; ++i) testpic(2,2); for (int i = 0; i < 100; ++i) testpic(3,2); for (int i = 0; i < 100; ++i) testpic(3,4); for (int i = 0; i < 100; ++i) testpic(1,4); for (int i = 0; i < 100; ++i) testpic(2,4); for (int i = 0; i < 100; ++i) testpic(3,4); for (int i = 0; i < 100; ++i) testpic(3,4); EndTest(); asymptote-3.05/tests/frames/0000755000000000000000000000000015031566105014605 5ustar rootrootasymptote-3.05/tests/frames/stat2.asy0000644000000000000000000000031215031566105016354 0ustar rootrootimport TestLib; StartTest("stat2"); struct T { int x; static void f(T t) { static void g(T t) { t.x=2; } g(t); } } T t=new T; assert(t.x==0); T.f(t); assert(t.x==2); EndTest(); asymptote-3.05/tests/frames/stat.asy0000644000000000000000000000023615031566105016277 0ustar rootrootimport TestLib; StartTest("stat"); struct T { int x; static void f(T t) { t.x=2; } } T t=new T; assert(t.x==0); T.f(t); assert(t.x==2); EndTest(); asymptote-3.05/tests/frames/loop.asy0000644000000000000000000000425615031566105016303 0ustar rootrootimport TestLib; StartTest("loop"); int f(); for (int i=0; i<10; ++i) { int x=i; for (int j=0; j<10; ++j) { int y=j; if (i==5 && j==7) { f = new int () { return x*y; }; } } } assert(f()==35); int f(); for (int i=0; i<10; ++i) { int x=i; for (int j=0; j<10; ++j) { int y=j; if (i==5 && j==7) { f = new int () { return i*y; }; } } } assert(f()==70); { int y = 3; int z = 0; for (int i = 0; i < 7; ++i) { ++z; continue; y = 4; } assert(y == 3); assert(z == 7); } { int y = 3; int z = 0; for (int i = 0; i < 7; ++i) { ++z; break; y = 4; } assert(y == 3); assert(z == 1); } { int y = 3; int z = 0; for (int i = 0; i < 7; ++i) { void g() {} ++z; continue; y = 4; } assert(y == 3); assert(z == 7); } { int y = 3; int z = 0; for (int i = 0; i < 7; ++i) { void g() {} ++z; break; y = 4; } assert(y == 3); assert(z == 1); } // While loops { int y = 7; int z = 0; while (z < 10) { ++z; continue; ++y; } assert(z == 10); assert(y == 7); } { int y = 7; int z = 0; while (z < 10) { void g() {} ++z; continue; ++y; } assert(z == 10); assert(y == 7); } { int y = 7; int z = 0; while (z < 10) { ++z; break; ++y; } assert(z == 1); assert(y == 7); } { int y = 7; int z = 0; while (z < 10) { void g() {} ++z; break; ++y; } assert(z == 1); assert(y == 7); } { int y = 7; int z = 0; while (z < 10) { ++z; continue; ++y; } assert(z == 10); assert(y == 7); } // Do loops { int y = 7; int z = 0; do { void g() {} ++z; continue; ++y; } while (z < 10); assert(z == 10); assert(y == 7); } { int y = 7; int z = 0; do { ++z; break; ++y; } while (z < 10); assert(z == 1); assert(y == 7); } { int y = 7; int z = 0; do { void g() {} ++z; break; ++y; } while (z < 10); assert(z == 1); assert(y == 7); } { int x = 456; do { x = 123; } while (false); assert(x == 123); } { int x = 456; do { void g() {} x = 123; } while (false); assert(x == 123); } EndTest(); asymptote-3.05/tests/xdata0000644000000000000000000000000215031566616014353 0ustar rootrootabasymptote-3.05/tests/TestLib.asy0000644000000000000000000000035015031566105015412 0ustar rootrootbool close(pair a, pair b) { real norm=(b == 0) ? 1 : max(abs(a),abs(b)); return abs(a-b) <= 100*realEpsilon*norm; } void StartTest(string desc) { write("Testing " + desc + "..."); } void EndTest() { write("PASSED."); } asymptote-3.05/tests/bench/0000755000000000000000000000000015031566105014407 5ustar rootrootasymptote-3.05/tests/bench/6000circles.asy0000644000000000000000000000042415031566105017057 0ustar rootrootsize(0,100); import math; import stats; currentpen=magenta; // A centered random number real crand() {return unitrand()*5;} real r1; pair pcenter; for(int i=0; i < 6000; ++i) { r1 = unitrand()/10; pcenter = ( crand(), crand()); Draw(circle(pcenter,r1)); } asymptote-3.05/tests/array/0000755000000000000000000000000015031566105014446 5ustar rootrootasymptote-3.05/tests/array/solve.asy0000644000000000000000000000170615031566105016320 0ustar rootrootimport TestLib; StartTest("solve"); real[][] a=new real[][] {{1,1,1},{1,2,2},{0,0,1}}; real[][] b=new real[][] {{3,9},{5,11},{1,3}}; real[][] x=new real[][] {{1,7},{1,-1,},{1,3}}; real[][] c=solve(a,b); for(int i=0; i < c.length; ++i) for(int j=0; j < c[i].length; ++j) assert(close(c[i][j],x[i][j])); real[][] a={{1,-2,3,0},{4,-5,6,2},{-7,-8,10,5},{1,50,1,-2}}; real[] b={7,19,33,3}; real[] x=solve(a,b); real[] c=a*x; for(int i=0; i < c.length; ++i) assert(close(c[i],b[i])); EndTest(); StartTest("inverse"); real[][] a=new real[][] {{1,1,1},{1,2,2},{0,0,1}}; real[][] ainverse=new real[][] {{2,-1,0},{-1,1,-1},{0,0,1}}; real[][] d=inverse(a); real[][] l=d*a; real[][] r=a*d; real[][] I=identity(a.length); for(int i=0; i < d.length; ++i) { for(int j=0; j < d[i].length; ++j) { assert(close(d[i][j],ainverse[i][j])); assert(I[i][j] == (i == j ? 1 : 0)); assert(close(l[i][j],I[i][j])); assert(close(r[i][j],I[i][j])); } } EndTest(); asymptote-3.05/tests/array/transpose.asy0000644000000000000000000000211015031566105017174 0ustar rootrootimport TestLib; import math; StartTest("transpose"); int n=3; real[][] a=new real[n][n]; real[][] b=new real[n][n]; for(int i=0; i < n; ++i) { for(int j=0; j < n; ++j) { a[i][j]=b[j][i]=rand(); } } bool operator == (real[][] a, real[][] b) { int n=a.length; for(int i=0; i < n; ++i) if(!all(a[i] == b[i])) return false; return true; } bool operator == (real[][][] a, real[][][] b) { int n=a.length; for(int i=0; i < n; ++i) { real[][] ai=a[i]; real[][] bi=b[i]; int m=ai.length; for(int j=0; j < m; ++j) { if(!all(ai[j] == bi[j])) return false; } } return true; } assert(a == transpose(b)); int n=3; real[][][] a=new real[n][n][n]; real[][][] b=new real[n][n][n]; real[][][] c=new real[n][n][n]; real[][][] d=new real[n][n][n]; for(int i=0; i < n; ++i) { for(int j=0; j < n; ++j) { for(int k=0; k < n; ++k) { a[i][j][k]=b[j][i][k]=c[i][k][j]=d[k][j][i]=rand(); } } } assert(a == transpose(b,new int[] {1,0,2})); assert(a == transpose(c,new int[] {0,2,1})); assert(a == transpose(d,new int[] {2,1,0})); EndTest(); asymptote-3.05/tests/array/slice.asy0000644000000000000000000001135115031566105016264 0ustar rootrootimport TestLib; StartTest("slice"); int[] x={0,1,2,3,4,5,6,7,8,9}; // Non-cyclic cases. assert(all(x[:] == x)); assert(!alias(x[:],x)); assert(all(x[0:4] == new int[] {0,1,2,3} )); assert(all(x[2:4] == new int[] {2,3} )); assert(all(x[5:] == new int[] {5,6,7,8,9} )); assert(all(x[:5] == new int[] {0,1,2,3,4} )); assert(all(x[3:3] == new int[] {} )); assert(all(x[3:4] == new int[] {3} )); assert(all(x[98:99] == new int[] {} )); assert(x[:].cyclic == false); assert(x[2:].cyclic == false); assert(x[:7].cyclic == false); assert(x[3:3].cyclic == false); assert(x[2:9].cyclic == false); // Cyclic cases x.cyclic=true; assert(all(x[:] == new int[] {0,1,2,3,4,5,6,7,8,9} )); assert(all(x[0:4] == new int[] {0,1,2,3} )); assert(all(x[2:4] == new int[] {2,3} )); assert(all(x[5:] == new int[] {5,6,7,8,9} )); assert(all(x[-5:] == new int[] {5,6,7,8,9,0,1,2,3,4,5,6,7,8,9} )); assert(all(x[:5] == new int[] {0,1,2,3,4} )); assert(all(x[3:3] == new int[] {} )); assert(all(x[3:4] == new int[] {3} )); assert(all(x[-1:1] == new int[] {9,0} )); assert(all(x[9:11] == new int[] {9,0} )); assert(all(x[9:21] == new int[] {9,0,1,2,3,4,5,6,7,8,9,0} )); assert(all(x[-15:15] == new int[] {5,6,7,8,9,0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4})); assert(all(x[6728:6729] == new int[] {8} )); assert(all(x[-6729:-6728] == new int[] {1} )); assert(x[:].cyclic == false); assert(x[2:].cyclic == false); assert(x[:7].cyclic == false); assert(x[3:3].cyclic == false); assert(x[2:9].cyclic == false); assert(x[5:100].cyclic == false); pair[] z={(1,2), (3,4), (5,6)}; assert(all(z[1:1] == new pair[] {})); assert(all(z[:1] == new pair[] {(1,2)})); assert(all(z[1:] == new pair[] {(3,4), (5,6)})); assert(all(z[:] == z)); assert(all(z[1:2] == new pair[] {(3,4)})); // Writing tests. { int[] y={0,1,2,3,4,5,6,7,8,9}; int[] z={56,67,78}; y[:] = z; assert(all(y == z)); assert(!alias(y,z)); } { int[] y={0,1,2,3,4,5,6,7,8,9}; int[] z={56,67,78}; z.cyclic=true; y[:] = z; assert(all(y == z)); assert(!alias(y,z)); assert(y.cyclic == false); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y[2:3] = y[5:6] = new int[] {77}; assert(all(y == new int[] {0,1,77,3,4,77,6,7,8,9})); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y[:3] = y[7:] = new int[] {}; assert(all(y == new int[] {3,4,5,6})); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y[3:5] = new int[] {13,14,15,16,17}; assert(all(y == new int[] {0,1,2,13,14,15,16,17,5,6,7,8,9})); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y.cyclic=true; int[] z={56,67,78}; y[:] = z; assert(all(y == z)); assert(!alias(y,z)); assert(y.cyclic == true); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y.cyclic=true; int[] z={56,67,78}; z.cyclic=true; y[:] = z; assert(all(y == z)); assert(!alias(y,z)); assert(y.cyclic == true); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y.cyclic=true; y[2:3] = y[5:6] = new int[] {77}; assert(all(y == new int[] {0,1,77,3,4,77,6,7,8,9})); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y.cyclic=true; y[:3] = y[7:] = new int[] {}; assert(all(y == new int[] {3,4,5,6})); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y.cyclic=true; y[8:] = new int[] {18,19,20,21,22}; assert(all(y == new int[] {0,1,2,3,4,5,6,7,18,19,20,21,22})); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y.cyclic=true; y[-2:0] = new int[] {18,19,20,21,22}; assert(all(y == new int[] {0,1,2,3,4,5,6,7,18,19,20,21,22})); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y.cyclic=true; y[18:20] = new int[] {18,19,20,21,22}; assert(all(y == new int[] {0,1,2,3,4,5,6,7,18,19,20,21,22})); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y.cyclic=true; y[3:5] = new int[] {13,14,15,16,17}; assert(all(y == new int[] {0,1,2,13,14,15,16,17,5,6,7,8,9})); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y.cyclic=true; y[13:15] = new int[] {13,14,15,16,17}; assert(all(y == new int[] {0,1,2,13,14,15,16,17,5,6,7,8,9})); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y.cyclic=true; y[3-10:5-10] = new int[] {13,14,15,16,17}; assert(all(y == new int[] {0,1,2,13,14,15,16,17,5,6,7,8,9})); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y.cyclic=true; y[8:12] = new int[] {18,19,20,21}; assert(all(y == new int[] {20,21,2,3,4,5,6,7,18,19})); } { int[] y={0,1,2,3,4,5,6,7,8,9}; y.cyclic=true; y[-2:2] = new int[] {18,19,20,21}; assert(all(y == new int[] {20,21,2,3,4,5,6,7,18,19})); } // Side Effect Test { int state=0; int[] x={0,1,2,3,4,5,6,7,8,9}; int[] a() { assert(state==0); ++state; return x; } int l() { assert(state==1); ++state; return 2; } int r() { assert(state==2); ++state; return 6; } int[] b() { assert(state==3); ++state; return new int[] {77,77}; } assert(state==0); a()[l():r()]=b(); assert(state==4); assert(all(x == new int[] {0,1,77,77,6,7,8,9})); } EndTest(); asymptote-3.05/tests/array/sort.asy0000644000000000000000000000135215031566105016154 0ustar rootrootimport TestLib; import math; string[] a={"bob","alice","pete","alice"}; string[] b={"alice","alice","bob","pete"}; StartTest("sort"); assert(all(sort(a) == b)); EndTest(); StartTest("search"); assert(search(b,"a") == -1); assert(search(b,"bob") == 2); assert(search(b,"z") == b.length-1); EndTest(); StartTest("sort2"); string[][] a={{"bob","9"},{"alice","5"},{"pete","7"},{"alice","4"}}; string[][] b={{"alice","4"},{"alice","5"},{"bob","9"},{"pete","7"}}; assert(sort(a) == b); EndTest(); pair[] a={(2,1),(0,0),(1,1),(1,0)}; pair[] b={(0,0),(1,0),(1,1),(2,1)}; StartTest("lexicographical sort"); assert(all(sort(a,lexorder) == b)); EndTest(); StartTest("lexicographical search"); assert(search(b,(1,0),lexorder) == 1); EndTest(); asymptote-3.05/tests/array/delete.asy0000644000000000000000000000125015031566105016424 0ustar rootrootimport TestLib; import math; StartTest("delete"); int[] a=sequence(4); a.delete(2); assert(all(a == new int[] {0,1,3})); int[] a=sequence(4); a.delete(0,2); assert(all(a == new int[] {3})); int[] a=sequence(4); a.delete(1,2); assert(all(a == new int[] {0,3})); int[] a=sequence(4); a.delete(2,2); assert(all(a == new int[] {0,1,3})); int[] a=sequence(4); a.delete(2,3); assert(all(a == new int[] {0,1})); int[] a=sequence(4); a.cyclic=true; a.delete(2,3); assert(all(a == new int[] {0,1})); int[] a=sequence(4); a.cyclic=true; a.delete(2,4); assert(all(a == new int[] {1})); int[] a=sequence(4); a.cyclic=true; a.delete(3,1); assert(all(a == new int[] {2})); EndTest(); asymptote-3.05/tests/array/fields.asy0000644000000000000000000000360715031566105016440 0ustar rootrootimport TestLib; StartTest("fields"); { int[] z = {1, 2, 3}; assert(z.length == 3); int[] keys = z.keys; assert(keys.length == 3); for (int i; i<3; ++i) assert(keys[i] == i); for (int j = 0; j < 10; ++j) { assert(z.cyclic == false); z.cyclic=true; assert(z.cyclic == true); z.cyclic=false; } } { int[] z = {2, 3, 5}; for (int k = -100; k <= 100; ++k) assert(z.initialized(k) == (k >= 0 && k < 3)); } { int[] z; for (int i=0; i<10; ++i) { for (int k = 0; k <= 100; ++k) { assert(z.length == k); z.push(k*k+3k+1); assert(z.length == k+1); } for (int k = 100; k >= 0; --k) { assert(z.length == k+1); assert(z.pop() == k*k+3k+1); assert(z.length == k); } } z.cyclic=true; for (int i=0; i<10; ++i) { for (int k = 0; k <= 100; ++k) { assert(z.length == k); z.push(k*k+3k+1); assert(z.length == k+1); } for (int k = 100; k >= 0; --k) { assert(z.length == k+1); z.delete(quotient(k,2)); assert(z.length == k); } } } { int[] base={4,5,9,5,0,2,3}; int[] z; for (int i=0; i<9; ++i) { assert(z.length == i*base.length); for (int j : z.keys) assert(z[j] == base[j%base.length]); z.append(base); } } { int[] z = {1,2,3,4,6,7,8,9}; assert(z.length == 8); z.insert(4, 5); assert(z.length == 9); z.insert(0, 0); assert(z.length == 10); for (int i=0; i<10; ++i) assert(z[i] == i); z.insert(7, 100, 101, 102, 103); assert(z.length == 14); // TODO: Test inserting/deleting lengths more seriously. } { // Test extended for. int[] a = {1,4,6,2,7,4,8,9,1,3,-1}; int i = 0; for (int x : a) { assert(x == a[i]); ++i; } assert(i == a.length); } { // Test extended for. int[] a = {1,4,6,2,7,4,8,9,1,3,-1}; int i = 0; for (var x : a) { assert(x == a[i]); ++i; } assert(i == a.length); } EndTest(); asymptote-3.05/tests/array/determinant.asy0000644000000000000000000000134115031566105017475 0ustar rootrootimport TestLib; import math; StartTest("determinant"); assert(determinant(new real[][] {{0}}) == 0); assert(determinant(new real[][] {{1}}) == 1); assert(determinant(new real[][] {{1,2},{3,4}}) == -2); real e=1e-20; assert(close(determinant(new real[][] {{1e,2e},{3e,4e}}),-2e-40)); assert(close(determinant(new real[][] {{1,2,3},{4,5,6},{7,8,9}}),0)); assert(close(determinant(new real[][] {{1,2},{1,2}}),0)); assert(close(determinant(new real[][] {{1,2,3,4}, {5,6,7,8},{9,10,11,12},{13,14,15,16}}),0)); assert(close(determinant(new real[][] {{1,2,3,4}, {5,0,7,8},{9,10,0,12},{13,14,15,16}}),-2376)); assert(close(determinant(new real[][]{{1,-2,3,0},{4,-5,6,2},{-7,-8,10,5}, {1,50,1,-2}}),-4588)); EndTest(); asymptote-3.05/tests/array/array.asy0000644000000000000000000000165015031566105016304 0ustar rootrootimport TestLib; StartTest("array"); { int[] x=array(10, 7); assert(x.length == 10); for (int i=0; i= 0; --i, ++j) assert(point(p, j) == (i,i^2)); EndTest(); asymptote-3.05/tests/types/var.asy0000644000000000000000000000224515031566105016005 0ustar rootrootimport TestLib; StartTest("var"); var x = 4; assert(x + x == 8); assert(x^2 == 16); assert((real)x == 4.0); var y = x; assert(y + y == 8); assert(x + y == 8); assert(y^2 == 16); assert((real)y == 4.0); var z = 2 * x; assert(z + z == 16); assert(x + z == 12); assert(z^2 == 64); assert((real)z == 8.0); var t = sin(0); assert(t == 0.0); assert(2t == 0.0); struct A { int x; }; A a; a.x = 3; var b = a; assert(a == b); assert(a.x == 3); A func(int x, int y) { return a; } var c = func(2,3); assert(a == b); assert(a.x == 3); int f(int x) { return x*x; } var g = f; assert(g == f); for (int i = 0; i < 100; ++i) assert(g(i) == i*i); /* var can be replaced with a normal type. */ { typedef int var; var x; assert(x == 0); var v = 14; assert(v == 14); } { struct var { int x; } var n = null; assert(n == null); var a; assert(a != null); assert(a.x == 0); a.x = 11; assert(a.x == 11); } // Test for single evaluation of the initializer. { int x = 3; assert(x == 3); var y = ++x; assert(x == 4); assert(y == 4); } { int f = 4, f() = null; var x = (int)f; assert(x == 4); } EndTest(); asymptote-3.05/tests/types/init.asy0000644000000000000000000000071215031566105016155 0ustar rootrootimport TestLib; { StartTest("init"); int operator init() { return 7; } int x; assert(x==7); struct A { int x=3; } A a; assert(a!=null); assert(a.x==3); A operator init() { return null; } A aa; assert(aa==null); EndTest(); } { StartTest("init autounravel"); struct A { int x = 3; autounravel A operator init() { A a = new A; a.x = 17; return a; } } A a; assert(a.x==17); EndTest(); }asymptote-3.05/tests/types/keyword.asy0000644000000000000000000001022215031566105016673 0ustar rootrootimport TestLib; StartTest("keyword"); { int f(int keyword x) { return 2*x; } assert(f(x=17) == 34); } { int f(int keyword x = 10) { return 2*x; } assert(f() == 20); } { int f(int keyword x = 10, int keyword y = 20) { return 2x+y; } assert(f(x=1,y=2) == 4); assert(f(y=1,x=2) == 5); assert(f(x=1) == 22); assert(f(y=7) == 27); assert(f() == 40); } { int f(int keyword x, int keyword y = 20) { return x+y; } assert(f(x=1,y=2) == 3); assert(f(x=1) == 21); } { int f(int keyword x = 10, int keyword y) { return x+y; } assert(f(x=1,y=2) == 3); assert(f(y=2) == 12); } { int f(int keyword x, int keyword y) { return x+y; } assert(f(x=1,y=2) == 3); } { int f(int x, int keyword y) { return 2x+y; } assert(f(x=1,y=2) == 4); assert(f(1,y=2) == 4); assert(f(y=2,1) == 4); assert(f(y=2,x=1) == 4); } { int f(... int[] nums, int keyword r) { return r; } assert(f(r=3) == 3); assert(f(1,r=3) == 3); assert(f(1,2, r=3) == 3); assert(f(1,2,4,5,6, r=3) == 3); assert(f(r=3, 10, 20, 30) == 3); assert(f(4, 5, r=3, 10, 20, 30) == 3); assert(f(4, 5, r=3, 10, 20, 30 ... new int[] {40,50,60}) == 3); assert(f(r=3, 10, 20, 30 ... new int[] {40,50,60}) == 3); assert(f(r=3, 10, 20, 30 ... new int[] {40,50,60}) == 3); assert(f(... new int[] {40,50,60}, r=3) == 3); assert(f(... new int[] {40,50,60}, r=3) == 3); } { int f(... int[] nums, int keyword r=77) { return r; } assert(f(r=3) == 3); assert(f(1,r=3) == 3); assert(f(1,2, r=3) == 3); assert(f(1,2,4,5,6, r=3) == 3); assert(f(r=3, 10, 20, 30) == 3); assert(f(4, 5, r=3, 10, 20, 30) == 3); assert(f(4, 5, r=3, 10, 20, 30 ... new int[] {40,50,60}) == 3); assert(f(r=3, 10, 20, 30 ... new int[] {40,50,60}) == 3); assert(f(r=3, 10, 20, 30 ... new int[] {40,50,60}) == 3); assert(f(... new int[] {40,50,60}, r=3) == 3); assert(f(... new int[] {40,50,60}, r=3) == 3); assert(f() == 77); assert(f(1) == 77); assert(f(1,2) == 77); assert(f(1,2,4,5,6) == 77); assert(f(10, 20, 30) == 77); assert(f(4, 5, 10, 20, 30) == 77); assert(f(4, 5, 10, 20, 30 ... new int[] {40,50,60}) == 77); assert(f(10, 20, 30 ... new int[] {40,50,60}) == 77); assert(f(10, 20, 30 ... new int[] {40,50,60}) == 77); assert(f(... new int[] {40,50,60}) == 77); assert(f(... new int[] {40,50,60}) == 77); } { int f(int x ... int[] nums, int keyword r=77) { return r; } assert(f(345,r=3) == 3); assert(f(345,1,r=3) == 3); assert(f(345,1,2, r=3) == 3); assert(f(345,1,2,4,5,6, r=3) == 3); assert(f(345,r=3, 10, 20, 30) == 3); assert(f(345,4, 5, r=3, 10, 20, 30) == 3); assert(f(345,4, 5, r=3, 10, 20, 30 ... new int[] {40,50,60}) == 3); assert(f(345,r=3, 10, 20, 30 ... new int[] {40,50,60}) == 3); assert(f(345,r=3, 10, 20, 30 ... new int[] {40,50,60}) == 3); assert(f(345 ... new int[] {40,50,60}, r=3) == 3); assert(f(345 ... new int[] {40,50,60}, r=3) == 3); assert(f(345) == 77); assert(f(345,1) == 77); assert(f(345,1,2) == 77); assert(f(345,1,2,4,5,6) == 77); assert(f(345,10, 20, 30) == 77); assert(f(345,4, 5, 10, 20, 30) == 77); assert(f(345,4, 5, 10, 20, 30 ... new int[] {40,50,60}) == 77); assert(f(345,10, 20, 30 ... new int[] {40,50,60}) == 77); assert(f(345,10, 20, 30 ... new int[] {40,50,60}) == 77); assert(f(345 ... new int[] {40,50,60}) == 77); assert(f(345 ... new int[] {40,50,60}) == 77); } { int sqr(int x=7) { return x*x; } int f(int keyword x) = sqr; int g(int keyword x=666) = sqr; assert(f(x=5) == 25); assert(g(x=5) == 25); assert(g() == 49); } { int sqr(int n=7) { return n*n; } int f(int keyword x) = sqr; int g(int keyword x=666) = sqr; assert(f(x=5) == 25); assert(g(x=5) == 25); assert(g() == 49); } { int sqr(int keyword x=7) { return x*x; } int f(int x) = sqr; int g(int x=666) = sqr; assert(f(x=5) == 25); assert(g(x=5) == 25); assert(f(5) == 25); assert(g(5) == 25); assert(g() == 49); } { int sqr(int keyword n=7) { return n*n; } int f(int x) = sqr; int g(int x=666) = sqr; assert(f(x=5) == 25); assert(g(x=5) == 25); assert(f(5) == 25); assert(g(5) == 25); assert(g() == 49); } EndTest(); asymptote-3.05/tests/types/order.asy0000644000000000000000000000775015031566105016336 0ustar rootrootimport TestLib; StartTest("order"); // Ordering tests. int counter = 0; int step(int n) { ++counter; assert(counter == n); return n; } int[] stepArray(int n) { return new int[] {step(n)}; } void reset() { counter = 0; } { reset(); assert(step(1) + step(2) == step(3)); step(4); } { reset(); assert(step(1) == 0 || step(2) == 2); step(3); } { reset(); step(1) == 0 && step(999) == step(456); step(2); } { reset(); int x = step(1), y = step(2); step(3); int x = step(4), y = step(5); step(6); } { void f(int x, int y) {} reset(); f(step(1), step(2)); step(3); reset(); f(x=step(1), y=step(2)); step(3); reset(); f(y=step(1), x=step(2)); step(3); reset(); f(x=step(1), step(2)); step(3); reset(); f(y=step(1), step(2)); step(3); reset(); f(step(1), x=step(2)); step(3); reset(); f(step(1), y=step(2)); step(3); } { void f(int x, int y ... int[] z) {} reset(); f(step(1), step(2)); step(3); reset(); f(x=step(1), y=step(2)); step(3); reset(); f(y=step(1), x=step(2)); step(3); reset(); f(x=step(1), step(2)); step(3); reset(); f(y=step(1), step(2)); step(3); reset(); f(step(1), x=step(2)); step(3); reset(); f(step(1), y=step(2)); step(3); reset(); f(step(1), step(2), step(3)); step(4); reset(); f(x=step(1), y=step(2), step(3)); step(4); reset(); f(y=step(1), x=step(2), step(3)); step(4); reset(); f(x=step(1), step(2), step(3)); step(4); reset(); f(y=step(1), step(2), step(3)); step(4); reset(); f(step(1), x=step(2), step(3)); step(4); reset(); f(step(1), y=step(2), step(3)); step(4); reset(); f(step(1), step(2), step(3), step(4)); step(5); reset(); f(x=step(1), y=step(2), step(3), step(4)); step(5); reset(); f(y=step(1), x=step(2), step(3), step(4)); step(5); reset(); f(x=step(1), step(2), step(3), step(4)); step(5); reset(); f(y=step(1), step(2), step(3), step(4)); step(5); reset(); f(step(1), x=step(2), step(3), step(4)); step(5); reset(); f(step(1), y=step(2), step(3), step(4)); step(5); reset(); f(step(1), step(2), step(3)); step(4); reset(); f(x=step(1), step(2), y=step(3)); step(4); reset(); f(y=step(1), step(2), x=step(3)); step(4); reset(); f(x=step(1), step(2), step(3)); step(4); reset(); f(y=step(1), step(2), step(3)); step(4); reset(); f(step(1), step(2), x=step(3)); step(4); reset(); f(step(1), step(2), y=step(3)); step(4); reset(); f(step(1), step(2), step(3), step(4)); step(5); reset(); f(x=step(1), step(2), y=step(3), step(4)); step(5); reset(); f(y=step(1), step(2), x=step(3), step(4)); step(5); reset(); f(x=step(1), step(2), step(3), step(4)); step(5); reset(); f(y=step(1), step(2), step(3), step(4)); step(5); reset(); f(step(1), step(2), x=step(3), step(4)); step(5); reset(); f(step(1), step(2), y=step(3), step(4)); step(5); reset(); f(step(1), step(2), step(3), step(4)... stepArray(5)); step(6); reset(); f(x=step(1), step(2), y=step(3), step(4)... stepArray(5)); step(6); reset(); f(y=step(1), step(2), x=step(3), step(4)... stepArray(5)); step(6); reset(); f(x=step(1), step(2), step(3), step(4)... stepArray(5)); step(6); reset(); f(y=step(1), step(2), step(3), step(4)... stepArray(5)); step(6); reset(); f(step(1), step(2), x=step(3), step(4)... stepArray(5)); step(6); reset(); f(step(1), step(2), y=step(3), step(4)... stepArray(5)); step(6); reset(); f(...stepArray(1), x=step(2), y=step(3)); step(4); reset(); f(...stepArray(1), y=step(2), x=step(3)); step(4); reset(); f(step(1)...stepArray(2), x=step(3), y=step(4)); step(5); reset(); f(step(1)...stepArray(2), y=step(3), x=step(4)); step(5); reset(); f(step(1),step(2)...stepArray(3), y=step(4), x=step(5)); step(6); reset(); f(step(1),step(2)...stepArray(3), y=step(4), x=step(5)); step(6); reset(); f(step(1),step(2),x=step(3)...stepArray(4), y=step(5)); step(6); reset(); f(step(1),step(2),x=step(3)...stepArray(4), y=step(5)); step(6); } // TODO: Add packing vs. casting tests. EndTest(); asymptote-3.05/tests/types/spec.asy0000644000000000000000000000246315031566105016151 0ustar rootrootimport TestLib; StartTest("spec"); // Test if the cycle keyword can be used in different contexts. { int operator cast(cycleToken) { return 55; } int x=cycle; assert(x==55); } // Test the tensionSpecifier type. { tensionSpecifier operator ..(string a, tensionSpecifier t, string b) { return t; } tensionSpecifier t="hello" .. tension 2 .. "joe"; assert(t.out==2); assert(t.in==2); assert(t.atLeast==false); tensionSpecifier t="hello" .. tension 3 and 2 .. "joe"; assert(t.out==3); assert(t.in==2); assert(t.atLeast==false); tensionSpecifier t="hello" .. tension atleast 7 .. "joe"; assert(t.out==7); assert(t.in==7); assert(t.atLeast==true); tensionSpecifier t="hello" .. tension atleast 3 and 2 .. "joe"; assert(t.out==3); assert(t.in==2); assert(t.atLeast==true); } // Test the curlSpecifier type. { curlSpecifier operator ..(curlSpecifier spec, string b) { return spec; } curlSpecifier operator ..(string a, curlSpecifier spec) { return spec; } curlSpecifier operator ..(string a, curlSpecifier spec, string b) { return spec; } curlSpecifier spec="hello"{curl 3}.."joe"; assert(spec.value==3); assert(spec.side==JOIN_OUT); curlSpecifier spec="hello"..{curl 7}"joe"; assert(spec.value==7); assert(spec.side==JOIN_IN); } EndTest(); asymptote-3.05/tests/types/builtinOps.asy0000644000000000000000000000102215031566105017335 0ustar rootrootimport TestLib; { StartTest('builtin record ops: external'); struct A {} A a = new A; assert(a == a); assert(alias(a, a)); assert(a != null); EndTest(); } { StartTest('builtin record ops: internal'); struct A { void runTest() { assert(this == this); assert(alias(this, this)); assert(this != null); } } (new A).runTest(); EndTest(); } { StartTest('builtin record ops: nested'); struct A { struct B {} } A a; a.B b; from a unravel operator==; assert(b == b); }asymptote-3.05/predicates.cc0000644000000000000000000034245215031566105014632 0ustar rootroot/*****************************************************************************/ /* */ /* Routines for Arbitrary Precision Floating-point Arithmetic */ /* and Fast Robust Geometric Predicates */ /* (predicates.c) */ /* */ /* May 18, 1996 */ /* */ /* Placed in the public domain by */ /* Jonathan Richard Shewchuk */ /* School of Computer Science */ /* Carnegie Mellon University */ /* 5000 Forbes Avenue */ /* Pittsburgh, Pennsylvania 15213-3891 */ /* jrs@cs.cmu.edu */ /* */ /* This file contains C implementation of algorithms for exact addition */ /* and multiplication of floating-point numbers, and predicates for */ /* robustly performing the orientation and incircle tests used in */ /* computational geometry. The algorithms and underlying theory are */ /* described in Jonathan Richard Shewchuk. "Adaptive Precision Floating- */ /* Point Arithmetic and Fast Robust Geometric Predicates." Technical */ /* Report CMU-CS-96-140, School of Computer Science, Carnegie Mellon */ /* University, Pittsburgh, Pennsylvania, May 1996. (Submitted to */ /* Discrete & Computational Geometry.) */ /* */ /* This file, the paper listed above, and other information are available */ /* from the Web page http://www.cs.cmu.edu/~quake/robust.html . */ /* */ /*****************************************************************************/ /*****************************************************************************/ /* */ /* Using this code: */ /* */ /* First, read the short or long version of the paper (from the Web page */ /* above). */ /* */ /* Be sure to call exactinit() once, before calling any of the arithmetic */ /* functions or geometric predicates. Also be sure to turn on the */ /* optimizer when compiling this file. */ /* */ /* */ /* Several geometric predicates are defined. Their parameters are all */ /* points. Each point is an array of two or three floating-point */ /* numbers. The geometric predicates, described in the papers, are */ /* */ /* orient2d(pa, pb, pc) */ /* orient2dfast(pa, pb, pc) */ /* orient3d(pa, pb, pc, pd) */ /* orient3dfast(pa, pb, pc, pd) */ /* incircle(pa, pb, pc, pd) */ /* incirclefast(pa, pb, pc, pd) */ /* insphere(pa, pb, pc, pd, pe) */ /* inspherefast(pa, pb, pc, pd, pe) */ /* */ /* Those with suffix "fast" are approximate, non-robust versions. Those */ /* without the suffix are adaptive precision, robust versions. There */ /* are also versions with the suffices "exact" and "slow", which are */ /* non-adaptive, exact arithmetic versions, which I use only for timings */ /* in my arithmetic papers. */ /* */ /* */ /* An expansion is represented by an array of floating-point numbers, */ /* sorted from smallest to largest magnitude (possibly with interspersed */ /* zeros). The length of each expansion is stored as a separate integer, */ /* and each arithmetic function returns an integer which is the length */ /* of the expansion it created. */ /* */ /* Several arithmetic functions are defined. Their parameters are */ /* */ /* e, f Input expansions */ /* elen, flen Lengths of input expansions (must be >= 1) */ /* h Output expansion */ /* b Input scalar */ /* */ /* The arithmetic functions are */ /* */ /* grow_expansion(elen, e, b, h) */ /* grow_expansion_zeroelim(elen, e, b, h) */ /* expansion_sum(elen, e, flen, f, h) */ /* expansion_sum_zeroelim1(elen, e, flen, f, h) */ /* expansion_sum_zeroelim2(elen, e, flen, f, h) */ /* fast_expansion_sum(elen, e, flen, f, h) */ /* fast_expansion_sum_zeroelim(elen, e, flen, f, h) */ /* linear_expansion_sum(elen, e, flen, f, h) */ /* linear_expansion_sum_zeroelim(elen, e, flen, f, h) */ /* scale_expansion(elen, e, b, h) */ /* scale_expansion_zeroelim(elen, e, b, h) */ /* compress(elen, e, h) */ /* */ /* All of these are described in the long version of the paper; some are */ /* described in the short version. All return an integer that is the */ /* length of h. Those with suffix _zeroelim perform zero elimination, */ /* and are recommended over their counterparts. The procedure */ /* fast_expansion_sum_zeroelim() (or linear_expansion_sum_zeroelim() on */ /* processors that do not use the round-to-even tiebreaking rule) is */ /* recommended over expansion_sum_zeroelim(). Each procedure has a */ /* little note next to it (in the code below) that tells you whether or */ /* not the output expansion may be the same array as one of the input */ /* expansions. */ /* */ /* */ /* If you look around below, you'll also find macros for a bunch of */ /* simple unrolled arithmetic operations, and procedures for printing */ /* expansions (commented out because they don't work with all C */ /* compilers) and for generating random floating-point numbers whose */ /* significand bits are all random. Most of the macros have undocumented */ /* requirements that certain of their parameters should not be the same */ /* variable; for safety, better to make sure all the parameters are */ /* distinct variables. Feel free to send email to jrs@cs.cmu.edu if you */ /* have questions. */ /* */ /*****************************************************************************/ #include #include #include #include #include "predicates.h" /* FPU control. We MUST have only double precision (not extended precision) */ #include "rounding.h" /* On some machines, the exact arithmetic routines might be defeated by the */ /* use of internal extended precision floating-point registers. Sometimes */ /* this problem can be fixed by defining certain values to be volatile, */ /* thus forcing them to be stored to memory and rounded off. This isn't */ /* a great solution, though, as it slows the arithmetic down. */ /* */ /* To try this out, write "#define INEXACT volatile" below. Normally, */ /* however, INEXACT should be defined to be nothing. ("#define INEXACT".) */ #define INEXACT /* Nothing */ /* #define INEXACT volatile */ #define REAL double /* float or double */ #define REALPRINT doubleprint #define REALRAND doublerand #define NARROWRAND narrowdoublerand #define UNIFORMRAND uniformdoublerand /* Which of the following two methods of finding the absolute values is */ /* fastest is compiler-dependent. A few compilers can inline and optimize */ /* the fabs() call; but most will incur the overhead of a function call, */ /* which is disastrously slow. A faster way on IEEE machines might be to */ /* mask the appropriate bit, but that's difficult to do in C. */ /*#define Absolute(a) ((a) >= 0.0 ? (a) : -(a)) */ #define Absolute(a) fabs(a) /* Many of the operations are broken up into two pieces, a main part that */ /* performs an approximate operation, and a "tail" that computes the */ /* roundoff error of that operation. */ /* */ /* The operations Fast_Two_Sum(), Fast_Two_Diff(), Two_Sum(), Two_Diff(), */ /* Split(), and Two_Product() are all implemented as described in the */ /* reference. Each of these macros requires certain variables to be */ /* defined in the calling routine. The variables `bvirt', `c', `abig', */ /* `_i', `_j', `_k', `_l', `_m', and `_n' are declared `INEXACT' because */ /* they store the result of an operation that may incur roundoff error. */ /* The input parameter `x' (or the highest numbered `x_' parameter) must */ /* also be declared `INEXACT'. */ #define Fast_Two_Sum_Tail(a, b, x, y) \ bvirt = x - a; \ y = b - bvirt #define Fast_Two_Sum(a, b, x, y) \ x = (REAL) (a + b); \ Fast_Two_Sum_Tail(a, b, x, y) #define Fast_Two_Diff_Tail(a, b, x, y) \ bvirt = a - x; \ y = bvirt - b #define Fast_Two_Diff(a, b, x, y) \ x = (REAL) (a - b); \ Fast_Two_Diff_Tail(a, b, x, y) #define Two_Sum_Tail(a, b, x, y) \ bvirt = (REAL) (x - a); \ avirt = x - bvirt; \ bround = b - bvirt; \ around = a - avirt; \ y = around + bround #define Two_Sum(a, b, x, y) \ x = (REAL) (a + b); \ Two_Sum_Tail(a, b, x, y) #define Two_Diff_Tail(a, b, x, y) \ bvirt = (REAL) (a - x); \ avirt = x + bvirt; \ bround = bvirt - b; \ around = a - avirt; \ y = around + bround #define Two_Diff(a, b, x, y) \ x = (REAL) (a - b); \ Two_Diff_Tail(a, b, x, y) #define Split(a, ahi, alo) \ c = (REAL) (splitter * a); \ abig = (REAL) (c - a); \ ahi = c - abig; \ alo = a - ahi #define Two_Product_Tail(a, b, x, y) \ Split(a, ahi, alo); \ Split(b, bhi, blo); \ err1 = x - (ahi * bhi); \ err2 = err1 - (alo * bhi); \ err3 = err2 - (ahi * blo); \ y = (alo * blo) - err3 #define Two_Product(a, b, x, y) \ x = (REAL) (a * b); \ Two_Product_Tail(a, b, x, y) /* Two_Product_Presplit() is Two_Product() where one of the inputs has */ /* already been split. Avoids redundant splitting. */ #define Two_Product_Presplit(a, b, bhi, blo, x, y) \ x = (REAL) (a * b); \ Split(a, ahi, alo); \ err1 = x - (ahi * bhi); \ err2 = err1 - (alo * bhi); \ err3 = err2 - (ahi * blo); \ y = (alo * blo) - err3 /* Two_Product_2Presplit() is Two_Product() where both of the inputs have */ /* already been split. Avoids redundant splitting. */ #define Two_Product_2Presplit(a, ahi, alo, b, bhi, blo, x, y) \ x = (REAL) (a * b); \ err1 = x - (ahi * bhi); \ err2 = err1 - (alo * bhi); \ err3 = err2 - (ahi * blo); \ y = (alo * blo) - err3 /* Square() can be done more quickly than Two_Product(). */ #define Square_Tail(a, x, y) \ Split(a, ahi, alo); \ err1 = x - (ahi * ahi); \ err3 = err1 - ((ahi + ahi) * alo); \ y = (alo * alo) - err3 #define Square(a, x, y) \ x = (REAL) (a * a); \ Square_Tail(a, x, y) /* Macros for summing expansions of various fixed lengths. These are all */ /* unrolled versions of Expansion_Sum(). */ #define Two_One_Sum(a1, a0, b, x2, x1, x0) \ Two_Sum(a0, b , _i, x0); \ Two_Sum(a1, _i, x2, x1) #define Two_One_Diff(a1, a0, b, x2, x1, x0) \ Two_Diff(a0, b , _i, x0); \ Two_Sum( a1, _i, x2, x1) #define Two_Two_Sum(a1, a0, b1, b0, x3, x2, x1, x0) \ Two_One_Sum(a1, a0, b0, _j, _0, x0); \ Two_One_Sum(_j, _0, b1, x3, x2, x1) #define Two_Two_Diff(a1, a0, b1, b0, x3, x2, x1, x0) \ Two_One_Diff(a1, a0, b0, _j, _0, x0); \ Two_One_Diff(_j, _0, b1, x3, x2, x1) #define Four_One_Sum(a3, a2, a1, a0, b, x4, x3, x2, x1, x0) \ Two_One_Sum(a1, a0, b , _j, x1, x0); \ Two_One_Sum(a3, a2, _j, x4, x3, x2) #define Four_Two_Sum(a3, a2, a1, a0, b1, b0, x5, x4, x3, x2, x1, x0) \ Four_One_Sum(a3, a2, a1, a0, b0, _k, _2, _1, _0, x0); \ Four_One_Sum(_k, _2, _1, _0, b1, x5, x4, x3, x2, x1) #define Four_Four_Sum(a3, a2, a1, a0, b4, b3, b1, b0, x7, x6, x5, x4, x3, x2, \ x1, x0) \ Four_Two_Sum(a3, a2, a1, a0, b1, b0, _l, _2, _1, _0, x1, x0); \ Four_Two_Sum(_l, _2, _1, _0, b4, b3, x7, x6, x5, x4, x3, x2) #define Eight_One_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b, x8, x7, x6, x5, x4, \ x3, x2, x1, x0) \ Four_One_Sum(a3, a2, a1, a0, b , _j, x3, x2, x1, x0); \ Four_One_Sum(a7, a6, a5, a4, _j, x8, x7, x6, x5, x4) #define Eight_Two_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b1, b0, x9, x8, x7, \ x6, x5, x4, x3, x2, x1, x0) \ Eight_One_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b0, _k, _6, _5, _4, _3, _2, \ _1, _0, x0); \ Eight_One_Sum(_k, _6, _5, _4, _3, _2, _1, _0, b1, x9, x8, x7, x6, x5, x4, \ x3, x2, x1) #define Eight_Four_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b4, b3, b1, b0, x11, \ x10, x9, x8, x7, x6, x5, x4, x3, x2, x1, x0) \ Eight_Two_Sum(a7, a6, a5, a4, a3, a2, a1, a0, b1, b0, _l, _6, _5, _4, _3, \ _2, _1, _0, x1, x0); \ Eight_Two_Sum(_l, _6, _5, _4, _3, _2, _1, _0, b4, b3, x11, x10, x9, x8, \ x7, x6, x5, x4, x3, x2) /* Macros for multiplying expansions of various fixed lengths. */ #define Two_One_Product(a1, a0, b, x3, x2, x1, x0) \ Split(b, bhi, blo); \ Two_Product_Presplit(a0, b, bhi, blo, _i, x0); \ Two_Product_Presplit(a1, b, bhi, blo, _j, _0); \ Two_Sum(_i, _0, _k, x1); \ Fast_Two_Sum(_j, _k, x3, x2) #define Four_One_Product(a3, a2, a1, a0, b, x7, x6, x5, x4, x3, x2, x1, x0) \ Split(b, bhi, blo); \ Two_Product_Presplit(a0, b, bhi, blo, _i, x0); \ Two_Product_Presplit(a1, b, bhi, blo, _j, _0); \ Two_Sum(_i, _0, _k, x1); \ Fast_Two_Sum(_j, _k, _i, x2); \ Two_Product_Presplit(a2, b, bhi, blo, _j, _0); \ Two_Sum(_i, _0, _k, x3); \ Fast_Two_Sum(_j, _k, _i, x4); \ Two_Product_Presplit(a3, b, bhi, blo, _j, _0); \ Two_Sum(_i, _0, _k, x5); \ Fast_Two_Sum(_j, _k, x7, x6) #define Two_Two_Product(a1, a0, b1, b0, x7, x6, x5, x4, x3, x2, x1, x0) \ Split(a0, a0hi, a0lo); \ Split(b0, bhi, blo); \ Two_Product_2Presplit(a0, a0hi, a0lo, b0, bhi, blo, _i, x0); \ Split(a1, a1hi, a1lo); \ Two_Product_2Presplit(a1, a1hi, a1lo, b0, bhi, blo, _j, _0); \ Two_Sum(_i, _0, _k, _1); \ Fast_Two_Sum(_j, _k, _l, _2); \ Split(b1, bhi, blo); \ Two_Product_2Presplit(a0, a0hi, a0lo, b1, bhi, blo, _i, _0); \ Two_Sum(_1, _0, _k, x1); \ Two_Sum(_2, _k, _j, _1); \ Two_Sum(_l, _j, _m, _2); \ Two_Product_2Presplit(a1, a1hi, a1lo, b1, bhi, blo, _j, _0); \ Two_Sum(_i, _0, _n, _0); \ Two_Sum(_1, _0, _i, x2); \ Two_Sum(_2, _i, _k, _1); \ Two_Sum(_m, _k, _l, _2); \ Two_Sum(_j, _n, _k, _0); \ Two_Sum(_1, _0, _j, x3); \ Two_Sum(_2, _j, _i, _1); \ Two_Sum(_l, _i, _m, _2); \ Two_Sum(_1, _k, _i, x4); \ Two_Sum(_2, _i, _k, x5); \ Two_Sum(_m, _k, x7, x6) /* An expansion of length two can be squared more quickly than finding the */ /* product of two different expansions of length two, and the result is */ /* guaranteed to have no more than six (rather than eight) components. */ #define Two_Square(a1, a0, x5, x4, x3, x2, x1, x0) \ Square(a0, _j, x0); \ _0 = a0 + a0; \ Two_Product(a1, _0, _k, _1); \ Two_One_Sum(_k, _1, _j, _l, _2, x1); \ Square(a1, _j, _1); \ Two_Two_Sum(_j, _1, _l, _2, x5, x4, x3, x2) /* 2^(-p), where p=DBL_MANT_DIG. Used to estimate roundoff errors. */ static const REAL epsilon=0.5*DBL_EPSILON; /* 2^ceiling(p/2) + 1. Used to split floats in half. */ static const REAL splitter=sqrt((DBL_MANT_DIG % 2 ? 2.0 : 1.0)/epsilon)+1.0; /* A set of coefficients used to calculate maximum roundoff errors. */ const REAL resulterrbound=(3.0 + 8.0 * epsilon) * epsilon; const REAL ccwerrboundA=(3.0 + 16.0 * epsilon) * epsilon; const REAL ccwerrboundB=(2.0 + 12.0 * epsilon) * epsilon; const REAL ccwerrboundC=(9.0 + 64.0 * epsilon) * epsilon * epsilon; const REAL o3derrboundA=(7.0 + 56.0 * epsilon) * epsilon; const REAL o3derrboundB=(3.0 + 28.0 * epsilon) * epsilon; const REAL o3derrboundC=(26.0 + 288.0 * epsilon) * epsilon * epsilon; const REAL iccerrboundA=(10.0 + 96.0 * epsilon) * epsilon; const REAL iccerrboundB=(4.0 + 48.0 * epsilon) * epsilon; const REAL iccerrboundC=(44.0 + 576.0 * epsilon) * epsilon * epsilon; const REAL isperrboundA=(16.0 + 224.0 * epsilon) * epsilon; const REAL isperrboundB=(5.0 + 72.0 * epsilon) * epsilon; const REAL isperrboundC=(71.0 + 1408.0 * epsilon) * epsilon * epsilon; /*****************************************************************************/ /* */ /* doubleprint() Print the bit representation of a double. */ /* */ /* Useful for debugging exact arithmetic routines. */ /* */ /*****************************************************************************/ /* void doubleprint(number) double number; { unsigned long long no; unsigned long long sign, expo; int exponent; int i, bottomi; no = *(unsigned long long *) &number; sign = no & 0x8000000000000000ll; expo = (no >> 52) & 0x7ffll; exponent = (int) expo; exponent = exponent - 1023; if (sign) { printf("-"); } else { printf(" "); } if (exponent == -1023) { printf( "0.0000000000000000000000000000000000000000000000000000_ ( )"); } else { printf("1."); bottomi = -1; for (i = 0; i < 52; i++) { if (no & 0x0008000000000000ll) { printf("1"); bottomi = i; } else { printf("0"); } no <<= 1; } printf("_%d (%d)", exponent, exponent - 1 - bottomi); } } */ /*****************************************************************************/ /* */ /* floatprint() Print the bit representation of a float. */ /* */ /* Useful for debugging exact arithmetic routines. */ /* */ /*****************************************************************************/ /* void floatprint(number) float number; { unsigned no; unsigned sign, expo; int exponent; int i, bottomi; no = *(unsigned *) &number; sign = no & 0x80000000; expo = (no >> 23) & 0xff; exponent = (int) expo; exponent = exponent - 127; if (sign) { printf("-"); } else { printf(" "); } if (exponent == -127) { printf("0.00000000000000000000000_ ( )"); } else { printf("1."); bottomi = -1; for (i = 0; i < 23; i++) { if (no & 0x00400000) { printf("1"); bottomi = i; } else { printf("0"); } no <<= 1; } printf("_%3d (%3d)", exponent, exponent - 1 - bottomi); } } */ /*****************************************************************************/ /* */ /* expansion_print() Print the bit representation of an expansion. */ /* */ /* Useful for debugging exact arithmetic routines. */ /* */ /*****************************************************************************/ /* void expansion_print(elen, e) int elen; REAL *e; { int i; for (i = elen - 1; i >= 0; i--) { REALPRINT(e[i]); if (i > 0) { printf(" +\n"); } else { printf("\n"); } } } */ /*****************************************************************************/ /* */ /* doublerand() Generate a double with random 53-bit significand and a */ /* random exponent in [0, 511]. */ /* */ /*****************************************************************************/ /* static double doublerand() { double result; double expo; long a, b, c; long i; a = random(); b = random(); c = random(); result = (double) (a - 1073741824) * 8388608.0 + (double) (b >> 8); for (i = 512, expo = 2; i <= 131072; i *= 2, expo = expo * expo) { if (c & i) { result *= expo; } } return result; } */ /*****************************************************************************/ /* */ /* narrowdoublerand() Generate a double with random 53-bit significand */ /* and a random exponent in [0, 7]. */ /* */ /*****************************************************************************/ /* static double narrowdoublerand() { double result; double expo; long a, b, c; long i; a = random(); b = random(); c = random(); result = (double) (a - 1073741824) * 8388608.0 + (double) (b >> 8); for (i = 512, expo = 2; i <= 2048; i *= 2, expo = expo * expo) { if (c & i) { result *= expo; } } return result; } */ /*****************************************************************************/ /* */ /* uniformdoublerand() Generate a double with random 53-bit significand. */ /* */ /*****************************************************************************/ /* static double uniformdoublerand() { double result; long a, b; a = random(); b = random(); result = (double) (a - 1073741824) * 8388608.0 + (double) (b >> 8); return result; } */ /*****************************************************************************/ /* */ /* floatrand() Generate a float with random 24-bit significand and a */ /* random exponent in [0, 63]. */ /* */ /*****************************************************************************/ /* static float floatrand() { float result; float expo; long a, c; long i; a = random(); c = random(); result = (float) ((a - 1073741824) >> 6); for (i = 512, expo = 2; i <= 16384; i *= 2, expo = expo * expo) { if (c & i) { result *= expo; } } return result; } */ /*****************************************************************************/ /* */ /* narrowfloatrand() Generate a float with random 24-bit significand and */ /* a random exponent in [0, 7]. */ /* */ /*****************************************************************************/ /* static float narrowfloatrand() { float result; float expo; long a, c; long i; a = random(); c = random(); result = (float) ((a - 1073741824) >> 6); for (i = 512, expo = 2; i <= 2048; i *= 2, expo = expo * expo) { if (c & i) { result *= expo; } } return result; } */ /*****************************************************************************/ /* */ /* uniformfloatrand() Generate a float with random 24-bit significand. */ /* */ /*****************************************************************************/ /* static float uniformfloatrand() { float result; long a; a = random(); result = (float) ((a - 1073741824) >> 6); return result; } */ /*****************************************************************************/ /* */ /* fast_expansion_sum_zeroelim() Sum two expansions, eliminating zero */ /* components from the output expansion. */ /* */ /* Sets h = e + f. See the long version of my paper for details. */ /* */ /* If round-to-even is used (as with IEEE 754), maintains the strongly */ /* nonoverlapping property. (That is, if e is strongly nonoverlapping, h */ /* will be also.) Does NOT maintain the nonoverlapping or nonadjacent */ /* properties. */ /* */ /*****************************************************************************/ static int fast_expansion_sum_zeroelim(int elen, const REAL *e, int flen, const REAL *f, REAL *h) /* h cannot be e or f. */ { REAL Q; INEXACT REAL Qnew; INEXACT REAL hh; INEXACT REAL bvirt; REAL avirt, bround, around; int eindex, findex, hindex; REAL enow, fnow; enow = e[0]; fnow = f[0]; eindex = findex = 0; if ((fnow > enow) == (fnow > -enow)) { Q = enow; enow = e[++eindex]; } else { Q = fnow; fnow = f[++findex]; } hindex = 0; if ((eindex < elen) && (findex < flen)) { if ((fnow > enow) == (fnow > -enow)) { Fast_Two_Sum(enow, Q, Qnew, hh); enow = e[++eindex]; } else { Fast_Two_Sum(fnow, Q, Qnew, hh); fnow = f[++findex]; } Q = Qnew; if (hh != 0.0) { h[hindex++] = hh; } while ((eindex < elen) && (findex < flen)) { if ((fnow > enow) == (fnow > -enow)) { Two_Sum(Q, enow, Qnew, hh); enow = e[++eindex]; } else { Two_Sum(Q, fnow, Qnew, hh); fnow = f[++findex]; } Q = Qnew; if (hh != 0.0) { h[hindex++] = hh; } } } while (eindex < elen) { Two_Sum(Q, enow, Qnew, hh); enow = e[++eindex]; Q = Qnew; if (hh != 0.0) { h[hindex++] = hh; } } while (findex < flen) { Two_Sum(Q, fnow, Qnew, hh); fnow = f[++findex]; Q = Qnew; if (hh != 0.0) { h[hindex++] = hh; } } if ((Q != 0.0) || (hindex == 0)) { h[hindex++] = Q; } return hindex; } /*****************************************************************************/ /* */ /* scale_expansion_zeroelim() Multiply an expansion by a scalar, */ /* eliminating zero components from the */ /* output expansion. */ /* */ /* Sets h = be. See either version of my paper for details. */ /* */ /* Maintains the nonoverlapping property. If round-to-even is used (as */ /* with IEEE 754), maintains the strongly nonoverlapping and nonadjacent */ /* properties as well. (That is, if e has one of these properties, so */ /* will h.) */ /* */ /*****************************************************************************/ static int scale_expansion_zeroelim(int elen, const REAL *e, REAL b, REAL *h) /* e and h cannot be the same. */ { INEXACT REAL Q, sum; REAL hh; INEXACT REAL product1; REAL product0; int eindex, hindex; REAL enow; INEXACT REAL bvirt; REAL avirt, bround, around; INEXACT REAL c; INEXACT REAL abig; REAL ahi, alo, bhi, blo; REAL err1, err2, err3; Split(b, bhi, blo); Two_Product_Presplit(e[0], b, bhi, blo, Q, hh); hindex = 0; if (hh != 0) { h[hindex++] = hh; } for (eindex = 1; eindex < elen; eindex++) { enow = e[eindex]; Two_Product_Presplit(enow, b, bhi, blo, product1, product0); Two_Sum(Q, product0, sum, hh); if (hh != 0) { h[hindex++] = hh; } Fast_Two_Sum(product1, sum, Q, hh); if (hh != 0) { h[hindex++] = hh; } } if ((Q != 0.0) || (hindex == 0)) { h[hindex++] = Q; } return hindex; } /*****************************************************************************/ /* */ /* estimate() Produce a one-word estimate of an expansion's value. */ /* */ /* See either version of my paper for details. */ /* */ /*****************************************************************************/ static REAL estimate(int elen, const REAL *e) { REAL Q; int eindex; Q = e[0]; for (eindex = 1; eindex < elen; eindex++) { Q += e[eindex]; } return Q; } /*****************************************************************************/ /* */ /* orient2dfast() Approximate 2D orientation test. Nonrobust. */ /* orient2dexact() Exact 2D orientation test. Robust. */ /* orient2dslow() Another exact 2D orientation test. Robust. */ /* orient2d() Adaptive exact 2D orientation test. Robust. */ /* */ /* Return a positive value if the points pa, pb, and pc occur */ /* in counterclockwise order; a negative value if they occur */ /* in clockwise order; and zero if they are collinear. The */ /* result is also a rough approximation of twice the signed */ /* area of the triangle defined by the three points. */ /* */ /* Only the first and last routine should be used; the middle two are for */ /* timings. */ /* */ /* The last three use exact arithmetic to ensure a correct answer. The */ /* result returned is the determinant of a matrix. In orient2d() only, */ /* this determinant is computed adaptively, in the sense that exact */ /* arithmetic is used only to the degree it is needed to ensure that the */ /* returned value has the correct sign. Hence, orient2d() is usually quite */ /* fast, but will run more slowly when the input points are collinear or */ /* nearly so. */ /* */ /*****************************************************************************/ REAL orient2dadapt(const REAL *pa, const REAL *pb, const REAL *pc, const REAL detsum) { INEXACT REAL acx, acy, bcx, bcy; REAL acxtail, acytail, bcxtail, bcytail; INEXACT REAL detleft, detright; REAL detlefttail, detrighttail; REAL det, errbound; REAL B[4], C1[8], C2[12], D[16]; INEXACT REAL B3; int C1length, C2length, Dlength; REAL u[4]; INEXACT REAL u3; INEXACT REAL s1, t1; REAL s0, t0; INEXACT REAL bvirt; REAL avirt, bround, around; INEXACT REAL c; INEXACT REAL abig; REAL ahi, alo, bhi, blo; REAL err1, err2, err3; INEXACT REAL _i, _j; REAL _0; acx = (REAL) (pa[0] - pc[0]); bcx = (REAL) (pb[0] - pc[0]); acy = (REAL) (pa[1] - pc[1]); bcy = (REAL) (pb[1] - pc[1]); Two_Product(acx, bcy, detleft, detlefttail); Two_Product(acy, bcx, detright, detrighttail); Two_Two_Diff(detleft, detlefttail, detright, detrighttail, B3, B[2], B[1], B[0]); B[3] = B3; det = estimate(4, B); errbound = ccwerrboundB * detsum; if ((det >= errbound) || (-det >= errbound)) { return det; } Two_Diff_Tail(pa[0], pc[0], acx, acxtail); Two_Diff_Tail(pb[0], pc[0], bcx, bcxtail); Two_Diff_Tail(pa[1], pc[1], acy, acytail); Two_Diff_Tail(pb[1], pc[1], bcy, bcytail); if ((acxtail == 0.0) && (acytail == 0.0) && (bcxtail == 0.0) && (bcytail == 0.0)) { return det; } errbound = ccwerrboundC * detsum + resulterrbound * Absolute(det); det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail); if ((det >= errbound) || (-det >= errbound)) { return det; } Two_Product(acxtail, bcy, s1, s0); Two_Product(acytail, bcx, t1, t0); Two_Two_Diff(s1, s0, t1, t0, u3, u[2], u[1], u[0]); u[3] = u3; C1length = fast_expansion_sum_zeroelim(4, B, 4, u, C1); Two_Product(acx, bcytail, s1, s0); Two_Product(acy, bcxtail, t1, t0); Two_Two_Diff(s1, s0, t1, t0, u3, u[2], u[1], u[0]); u[3] = u3; C2length = fast_expansion_sum_zeroelim(C1length, C1, 4, u, C2); Two_Product(acxtail, bcytail, s1, s0); Two_Product(acytail, bcxtail, t1, t0); Two_Two_Diff(s1, s0, t1, t0, u3, u[2], u[1], u[0]); u[3] = u3; Dlength = fast_expansion_sum_zeroelim(C2length, C2, 4, u, D); return(D[Dlength - 1]); } REAL orient2d(const REAL *pa, const REAL *pb, const REAL *pc) { REAL detleft, detright, det; REAL detsum, errbound; REAL orient; FPU_ROUND_DOUBLE; detleft = (pa[0] - pc[0]) * (pb[1] - pc[1]); detright = (pa[1] - pc[1]) * (pb[0] - pc[0]); det = detleft - detright; if (detleft > 0.0) { if (detright <= 0.0) { FPU_RESTORE; return det; } else { detsum = detleft + detright; } } else if (detleft < 0.0) { if (detright >= 0.0) { FPU_RESTORE; return det; } else { detsum = -detleft - detright; } } else { FPU_RESTORE; return det; } errbound = ccwerrboundA * detsum; if ((det >= errbound) || (-det >= errbound)) { FPU_RESTORE; return det; } orient = orient2dadapt(pa, pb, pc, detsum); FPU_RESTORE; return orient; } REAL orient2d(const REAL ax, const REAL ay, const REAL bx, const REAL by, const REAL cx, const REAL cy) { REAL detleft, detright, det; REAL detsum, errbound; REAL orient; FPU_ROUND_DOUBLE; detleft = (ax - cx) * (by - cy); detright = (ay - cy) * (bx - cx); det = detleft - detright; if (detleft > 0.0) { if (detright <= 0.0) { FPU_RESTORE; return det; } else { detsum = detleft + detright; } } else if (detleft < 0.0) { if (detright >= 0.0) { FPU_RESTORE; return det; } else { detsum = -detleft - detright; } } else { FPU_RESTORE; return det; } errbound = ccwerrboundA * detsum; if ((det >= errbound) || (-det >= errbound)) { FPU_RESTORE; return det; } REAL pa[]={ax,ay}; REAL pb[]={bx,by}; REAL pc[]={cx,cy}; orient = orient2dadapt(pa, pb, pc, detsum); FPU_RESTORE; return orient; } /*****************************************************************************/ /* */ /* orient3dfast() Approximate 3D orientation test. Nonrobust. */ /* orient3dexact() Exact 3D orientation test. Robust. */ /* orient3dslow() Another exact 3D orientation test. Robust. */ /* orient3d() Adaptive exact 3D orientation test. Robust. */ /* */ /* Return a positive value if the point pd lies below the */ /* plane passing through pa, pb, and pc; "below" is defined so */ /* that pa, pb, and pc appear in counterclockwise order when */ /* viewed from above the plane. Returns a negative value if */ /* pd lies above the plane. Returns zero if the points are */ /* coplanar. The result is also a rough approximation of six */ /* times the signed volume of the tetrahedron defined by the */ /* four points. */ /* */ /* Only the first and last routine should be used; the middle two are for */ /* timings. */ /* */ /* The last three use exact arithmetic to ensure a correct answer. The */ /* result returned is the determinant of a matrix. In orient3d() only, */ /* this determinant is computed adaptively, in the sense that exact */ /* arithmetic is used only to the degree it is needed to ensure that the */ /* returned value has the correct sign. Hence, orient3d() is usually quite */ /* fast, but will run more slowly when the input points are coplanar or */ /* nearly so. */ /* */ /*****************************************************************************/ static REAL orient3dadapt(const REAL *pa, const REAL *pb, const REAL *pc, const REAL *pd, REAL permanent) { INEXACT REAL adx, bdx, cdx, ady, bdy, cdy, adz, bdz, cdz; REAL det, errbound; INEXACT REAL bdxcdy1, cdxbdy1, cdxady1, adxcdy1, adxbdy1, bdxady1; REAL bdxcdy0, cdxbdy0, cdxady0, adxcdy0, adxbdy0, bdxady0; REAL bc[4], ca[4], ab[4]; INEXACT REAL bc3, ca3, ab3; REAL adet[8], bdet[8], cdet[8]; int alen, blen, clen; REAL abdet[16]; int ablen; REAL *finnow, *finother, *finswap; REAL fin1[192], fin2[192]; int finlength; REAL adxtail, bdxtail, cdxtail; REAL adytail, bdytail, cdytail; REAL adztail, bdztail, cdztail; INEXACT REAL at_blarge, at_clarge; INEXACT REAL bt_clarge, bt_alarge; INEXACT REAL ct_alarge, ct_blarge; REAL at_b[4], at_c[4], bt_c[4], bt_a[4], ct_a[4], ct_b[4]; int at_blen, at_clen, bt_clen, bt_alen, ct_alen, ct_blen; INEXACT REAL bdxt_cdy1, cdxt_bdy1, cdxt_ady1; INEXACT REAL adxt_cdy1, adxt_bdy1, bdxt_ady1; REAL bdxt_cdy0, cdxt_bdy0, cdxt_ady0; REAL adxt_cdy0, adxt_bdy0, bdxt_ady0; INEXACT REAL bdyt_cdx1, cdyt_bdx1, cdyt_adx1; INEXACT REAL adyt_cdx1, adyt_bdx1, bdyt_adx1; REAL bdyt_cdx0, cdyt_bdx0, cdyt_adx0; REAL adyt_cdx0, adyt_bdx0, bdyt_adx0; REAL bct[8], cat[8], abt[8]; int bctlen, catlen, abtlen; INEXACT REAL bdxt_cdyt1, cdxt_bdyt1, cdxt_adyt1; INEXACT REAL adxt_cdyt1, adxt_bdyt1, bdxt_adyt1; REAL bdxt_cdyt0, cdxt_bdyt0, cdxt_adyt0; REAL adxt_cdyt0, adxt_bdyt0, bdxt_adyt0; REAL u[4], v[12], w[16]; INEXACT REAL u3; int vlength, wlength; REAL negate; INEXACT REAL bvirt; REAL avirt, bround, around; INEXACT REAL c; INEXACT REAL abig; REAL ahi, alo, bhi, blo; REAL err1, err2, err3; INEXACT REAL _i, _j, _k; REAL _0; adx = (REAL) (pa[0] - pd[0]); bdx = (REAL) (pb[0] - pd[0]); cdx = (REAL) (pc[0] - pd[0]); ady = (REAL) (pa[1] - pd[1]); bdy = (REAL) (pb[1] - pd[1]); cdy = (REAL) (pc[1] - pd[1]); adz = (REAL) (pa[2] - pd[2]); bdz = (REAL) (pb[2] - pd[2]); cdz = (REAL) (pc[2] - pd[2]); Two_Product(bdx, cdy, bdxcdy1, bdxcdy0); Two_Product(cdx, bdy, cdxbdy1, cdxbdy0); Two_Two_Diff(bdxcdy1, bdxcdy0, cdxbdy1, cdxbdy0, bc3, bc[2], bc[1], bc[0]); bc[3] = bc3; alen = scale_expansion_zeroelim(4, bc, adz, adet); Two_Product(cdx, ady, cdxady1, cdxady0); Two_Product(adx, cdy, adxcdy1, adxcdy0); Two_Two_Diff(cdxady1, cdxady0, adxcdy1, adxcdy0, ca3, ca[2], ca[1], ca[0]); ca[3] = ca3; blen = scale_expansion_zeroelim(4, ca, bdz, bdet); Two_Product(adx, bdy, adxbdy1, adxbdy0); Two_Product(bdx, ady, bdxady1, bdxady0); Two_Two_Diff(adxbdy1, adxbdy0, bdxady1, bdxady0, ab3, ab[2], ab[1], ab[0]); ab[3] = ab3; clen = scale_expansion_zeroelim(4, ab, cdz, cdet); ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); finlength = fast_expansion_sum_zeroelim(ablen, abdet, clen, cdet, fin1); det = estimate(finlength, fin1); errbound = o3derrboundB * permanent; if ((det >= errbound) || (-det >= errbound)) { return det; } Two_Diff_Tail(pa[0], pd[0], adx, adxtail); Two_Diff_Tail(pb[0], pd[0], bdx, bdxtail); Two_Diff_Tail(pc[0], pd[0], cdx, cdxtail); Two_Diff_Tail(pa[1], pd[1], ady, adytail); Two_Diff_Tail(pb[1], pd[1], bdy, bdytail); Two_Diff_Tail(pc[1], pd[1], cdy, cdytail); Two_Diff_Tail(pa[2], pd[2], adz, adztail); Two_Diff_Tail(pb[2], pd[2], bdz, bdztail); Two_Diff_Tail(pc[2], pd[2], cdz, cdztail); if ((adxtail == 0.0) && (bdxtail == 0.0) && (cdxtail == 0.0) && (adytail == 0.0) && (bdytail == 0.0) && (cdytail == 0.0) && (adztail == 0.0) && (bdztail == 0.0) && (cdztail == 0.0)) { return det; } errbound = o3derrboundC * permanent + resulterrbound * Absolute(det); det += (adz * ((bdx * cdytail + cdy * bdxtail) - (bdy * cdxtail + cdx * bdytail)) + adztail * (bdx * cdy - bdy * cdx)) + (bdz * ((cdx * adytail + ady * cdxtail) - (cdy * adxtail + adx * cdytail)) + bdztail * (cdx * ady - cdy * adx)) + (cdz * ((adx * bdytail + bdy * adxtail) - (ady * bdxtail + bdx * adytail)) + cdztail * (adx * bdy - ady * bdx)); if ((det >= errbound) || (-det >= errbound)) { return det; } finnow = fin1; finother = fin2; if (adxtail == 0.0) { if (adytail == 0.0) { at_b[0] = 0.0; at_blen = 1; at_c[0] = 0.0; at_clen = 1; } else { negate = -adytail; Two_Product(negate, bdx, at_blarge, at_b[0]); at_b[1] = at_blarge; at_blen = 2; Two_Product(adytail, cdx, at_clarge, at_c[0]); at_c[1] = at_clarge; at_clen = 2; } } else { if (adytail == 0.0) { Two_Product(adxtail, bdy, at_blarge, at_b[0]); at_b[1] = at_blarge; at_blen = 2; negate = -adxtail; Two_Product(negate, cdy, at_clarge, at_c[0]); at_c[1] = at_clarge; at_clen = 2; } else { Two_Product(adxtail, bdy, adxt_bdy1, adxt_bdy0); Two_Product(adytail, bdx, adyt_bdx1, adyt_bdx0); Two_Two_Diff(adxt_bdy1, adxt_bdy0, adyt_bdx1, adyt_bdx0, at_blarge, at_b[2], at_b[1], at_b[0]); at_b[3] = at_blarge; at_blen = 4; Two_Product(adytail, cdx, adyt_cdx1, adyt_cdx0); Two_Product(adxtail, cdy, adxt_cdy1, adxt_cdy0); Two_Two_Diff(adyt_cdx1, adyt_cdx0, adxt_cdy1, adxt_cdy0, at_clarge, at_c[2], at_c[1], at_c[0]); at_c[3] = at_clarge; at_clen = 4; } } if (bdxtail == 0.0) { if (bdytail == 0.0) { bt_c[0] = 0.0; bt_clen = 1; bt_a[0] = 0.0; bt_alen = 1; } else { negate = -bdytail; Two_Product(negate, cdx, bt_clarge, bt_c[0]); bt_c[1] = bt_clarge; bt_clen = 2; Two_Product(bdytail, adx, bt_alarge, bt_a[0]); bt_a[1] = bt_alarge; bt_alen = 2; } } else { if (bdytail == 0.0) { Two_Product(bdxtail, cdy, bt_clarge, bt_c[0]); bt_c[1] = bt_clarge; bt_clen = 2; negate = -bdxtail; Two_Product(negate, ady, bt_alarge, bt_a[0]); bt_a[1] = bt_alarge; bt_alen = 2; } else { Two_Product(bdxtail, cdy, bdxt_cdy1, bdxt_cdy0); Two_Product(bdytail, cdx, bdyt_cdx1, bdyt_cdx0); Two_Two_Diff(bdxt_cdy1, bdxt_cdy0, bdyt_cdx1, bdyt_cdx0, bt_clarge, bt_c[2], bt_c[1], bt_c[0]); bt_c[3] = bt_clarge; bt_clen = 4; Two_Product(bdytail, adx, bdyt_adx1, bdyt_adx0); Two_Product(bdxtail, ady, bdxt_ady1, bdxt_ady0); Two_Two_Diff(bdyt_adx1, bdyt_adx0, bdxt_ady1, bdxt_ady0, bt_alarge, bt_a[2], bt_a[1], bt_a[0]); bt_a[3] = bt_alarge; bt_alen = 4; } } if (cdxtail == 0.0) { if (cdytail == 0.0) { ct_a[0] = 0.0; ct_alen = 1; ct_b[0] = 0.0; ct_blen = 1; } else { negate = -cdytail; Two_Product(negate, adx, ct_alarge, ct_a[0]); ct_a[1] = ct_alarge; ct_alen = 2; Two_Product(cdytail, bdx, ct_blarge, ct_b[0]); ct_b[1] = ct_blarge; ct_blen = 2; } } else { if (cdytail == 0.0) { Two_Product(cdxtail, ady, ct_alarge, ct_a[0]); ct_a[1] = ct_alarge; ct_alen = 2; negate = -cdxtail; Two_Product(negate, bdy, ct_blarge, ct_b[0]); ct_b[1] = ct_blarge; ct_blen = 2; } else { Two_Product(cdxtail, ady, cdxt_ady1, cdxt_ady0); Two_Product(cdytail, adx, cdyt_adx1, cdyt_adx0); Two_Two_Diff(cdxt_ady1, cdxt_ady0, cdyt_adx1, cdyt_adx0, ct_alarge, ct_a[2], ct_a[1], ct_a[0]); ct_a[3] = ct_alarge; ct_alen = 4; Two_Product(cdytail, bdx, cdyt_bdx1, cdyt_bdx0); Two_Product(cdxtail, bdy, cdxt_bdy1, cdxt_bdy0); Two_Two_Diff(cdyt_bdx1, cdyt_bdx0, cdxt_bdy1, cdxt_bdy0, ct_blarge, ct_b[2], ct_b[1], ct_b[0]); ct_b[3] = ct_blarge; ct_blen = 4; } } bctlen = fast_expansion_sum_zeroelim(bt_clen, bt_c, ct_blen, ct_b, bct); wlength = scale_expansion_zeroelim(bctlen, bct, adz, w); finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, finother); finswap = finnow; finnow = finother; finother = finswap; catlen = fast_expansion_sum_zeroelim(ct_alen, ct_a, at_clen, at_c, cat); wlength = scale_expansion_zeroelim(catlen, cat, bdz, w); finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, finother); finswap = finnow; finnow = finother; finother = finswap; abtlen = fast_expansion_sum_zeroelim(at_blen, at_b, bt_alen, bt_a, abt); wlength = scale_expansion_zeroelim(abtlen, abt, cdz, w); finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, finother); finswap = finnow; finnow = finother; finother = finswap; if (adztail != 0.0) { vlength = scale_expansion_zeroelim(4, bc, adztail, v); finlength = fast_expansion_sum_zeroelim(finlength, finnow, vlength, v, finother); finswap = finnow; finnow = finother; finother = finswap; } if (bdztail != 0.0) { vlength = scale_expansion_zeroelim(4, ca, bdztail, v); finlength = fast_expansion_sum_zeroelim(finlength, finnow, vlength, v, finother); finswap = finnow; finnow = finother; finother = finswap; } if (cdztail != 0.0) { vlength = scale_expansion_zeroelim(4, ab, cdztail, v); finlength = fast_expansion_sum_zeroelim(finlength, finnow, vlength, v, finother); finswap = finnow; finnow = finother; finother = finswap; } if (adxtail != 0.0) { if (bdytail != 0.0) { Two_Product(adxtail, bdytail, adxt_bdyt1, adxt_bdyt0); Two_One_Product(adxt_bdyt1, adxt_bdyt0, cdz, u3, u[2], u[1], u[0]); u[3] = u3; finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, finother); finswap = finnow; finnow = finother; finother = finswap; if (cdztail != 0.0) { Two_One_Product(adxt_bdyt1, adxt_bdyt0, cdztail, u3, u[2], u[1], u[0]); u[3] = u3; finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, finother); finswap = finnow; finnow = finother; finother = finswap; } } if (cdytail != 0.0) { negate = -adxtail; Two_Product(negate, cdytail, adxt_cdyt1, adxt_cdyt0); Two_One_Product(adxt_cdyt1, adxt_cdyt0, bdz, u3, u[2], u[1], u[0]); u[3] = u3; finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, finother); finswap = finnow; finnow = finother; finother = finswap; if (bdztail != 0.0) { Two_One_Product(adxt_cdyt1, adxt_cdyt0, bdztail, u3, u[2], u[1], u[0]); u[3] = u3; finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, finother); finswap = finnow; finnow = finother; finother = finswap; } } } if (bdxtail != 0.0) { if (cdytail != 0.0) { Two_Product(bdxtail, cdytail, bdxt_cdyt1, bdxt_cdyt0); Two_One_Product(bdxt_cdyt1, bdxt_cdyt0, adz, u3, u[2], u[1], u[0]); u[3] = u3; finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, finother); finswap = finnow; finnow = finother; finother = finswap; if (adztail != 0.0) { Two_One_Product(bdxt_cdyt1, bdxt_cdyt0, adztail, u3, u[2], u[1], u[0]); u[3] = u3; finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, finother); finswap = finnow; finnow = finother; finother = finswap; } } if (adytail != 0.0) { negate = -bdxtail; Two_Product(negate, adytail, bdxt_adyt1, bdxt_adyt0); Two_One_Product(bdxt_adyt1, bdxt_adyt0, cdz, u3, u[2], u[1], u[0]); u[3] = u3; finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, finother); finswap = finnow; finnow = finother; finother = finswap; if (cdztail != 0.0) { Two_One_Product(bdxt_adyt1, bdxt_adyt0, cdztail, u3, u[2], u[1], u[0]); u[3] = u3; finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, finother); finswap = finnow; finnow = finother; finother = finswap; } } } if (cdxtail != 0.0) { if (adytail != 0.0) { Two_Product(cdxtail, adytail, cdxt_adyt1, cdxt_adyt0); Two_One_Product(cdxt_adyt1, cdxt_adyt0, bdz, u3, u[2], u[1], u[0]); u[3] = u3; finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, finother); finswap = finnow; finnow = finother; finother = finswap; if (bdztail != 0.0) { Two_One_Product(cdxt_adyt1, cdxt_adyt0, bdztail, u3, u[2], u[1], u[0]); u[3] = u3; finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, finother); finswap = finnow; finnow = finother; finother = finswap; } } if (bdytail != 0.0) { negate = -cdxtail; Two_Product(negate, bdytail, cdxt_bdyt1, cdxt_bdyt0); Two_One_Product(cdxt_bdyt1, cdxt_bdyt0, adz, u3, u[2], u[1], u[0]); u[3] = u3; finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, finother); finswap = finnow; finnow = finother; finother = finswap; if (adztail != 0.0) { Two_One_Product(cdxt_bdyt1, cdxt_bdyt0, adztail, u3, u[2], u[1], u[0]); u[3] = u3; finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u, finother); finswap = finnow; finnow = finother; finother = finswap; } } } if (adztail != 0.0) { wlength = scale_expansion_zeroelim(bctlen, bct, adztail, w); finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, finother); finswap = finnow; finnow = finother; finother = finswap; } if (bdztail != 0.0) { wlength = scale_expansion_zeroelim(catlen, cat, bdztail, w); finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, finother); finswap = finnow; finnow = finother; finother = finswap; } if (cdztail != 0.0) { wlength = scale_expansion_zeroelim(abtlen, abt, cdztail, w); finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w, finother); finswap = finnow; finnow = finother; finother = finswap; } return finnow[finlength - 1]; } REAL orient3d(const REAL *pa, const REAL *pb, const REAL *pc, const REAL *pd) { REAL adx, bdx, cdx, ady, bdy, cdy, adz, bdz, cdz; REAL bdxcdy, cdxbdy, cdxady, adxcdy, adxbdy, bdxady; REAL det; REAL permanent, errbound; REAL orient; FPU_ROUND_DOUBLE; adx = pa[0] - pd[0]; bdx = pb[0] - pd[0]; cdx = pc[0] - pd[0]; ady = pa[1] - pd[1]; bdy = pb[1] - pd[1]; cdy = pc[1] - pd[1]; adz = pa[2] - pd[2]; bdz = pb[2] - pd[2]; cdz = pc[2] - pd[2]; bdxcdy = bdx * cdy; cdxbdy = cdx * bdy; cdxady = cdx * ady; adxcdy = adx * cdy; adxbdy = adx * bdy; bdxady = bdx * ady; det = adz * (bdxcdy - cdxbdy) + bdz * (cdxady - adxcdy) + cdz * (adxbdy - bdxady); permanent = (Absolute(bdxcdy) + Absolute(cdxbdy)) * Absolute(adz) + (Absolute(cdxady) + Absolute(adxcdy)) * Absolute(bdz) + (Absolute(adxbdy) + Absolute(bdxady)) * Absolute(cdz); errbound = o3derrboundA * permanent; if ((det > errbound) || (-det > errbound)) { FPU_RESTORE; return det; } orient = orient3dadapt(pa, pb, pc, pd, permanent); FPU_RESTORE; return orient; } /*****************************************************************************/ /* */ /* incirclefast() Approximate 2D incircle test. Nonrobust. */ /* incircleexact() Exact 2D incircle test. Robust. */ /* incircleslow() Another exact 2D incircle test. Robust. */ /* incircle() Adaptive exact 2D incircle test. Robust. */ /* */ /* Return a positive value if the point pd lies inside the */ /* circle passing through pa, pb, and pc; a negative value if */ /* it lies outside; and zero if the four points are cocircular.*/ /* The points pa, pb, and pc must be in counterclockwise */ /* order, or the sign of the result will be reversed. */ /* */ /* Only the first and last routine should be used; the middle two are for */ /* timings. */ /* */ /* The last three use exact arithmetic to ensure a correct answer. The */ /* result returned is the determinant of a matrix. In incircle() only, */ /* this determinant is computed adaptively, in the sense that exact */ /* arithmetic is used only to the degree it is needed to ensure that the */ /* returned value has the correct sign. Hence, incircle() is usually quite */ /* fast, but will run more slowly when the input points are cocircular or */ /* nearly so. */ /* */ /*****************************************************************************/ static REAL incircleadapt(const REAL *pa, const REAL *pb, const REAL *pc, const REAL *pd, REAL permanent) { INEXACT REAL adx, bdx, cdx, ady, bdy, cdy; REAL det, errbound; INEXACT REAL bdxcdy1, cdxbdy1, cdxady1, adxcdy1, adxbdy1, bdxady1; REAL bdxcdy0, cdxbdy0, cdxady0, adxcdy0, adxbdy0, bdxady0; REAL bc[4], ca[4], ab[4]; INEXACT REAL bc3, ca3, ab3; REAL axbc[8], axxbc[16], aybc[8], ayybc[16], adet[32]; int axbclen, axxbclen, aybclen, ayybclen, alen; REAL bxca[8], bxxca[16], byca[8], byyca[16], bdet[32]; int bxcalen, bxxcalen, bycalen, byycalen, blen; REAL cxab[8], cxxab[16], cyab[8], cyyab[16], cdet[32]; int cxablen, cxxablen, cyablen, cyyablen, clen; REAL abdet[64]; int ablen; REAL fin1[1152], fin2[1152]; REAL *finnow, *finother, *finswap; int finlength; REAL adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail; INEXACT REAL adxadx1, adyady1, bdxbdx1, bdybdy1, cdxcdx1, cdycdy1; REAL adxadx0, adyady0, bdxbdx0, bdybdy0, cdxcdx0, cdycdy0; REAL aa[4], bb[4], cc[4]; INEXACT REAL aa3, bb3, cc3; INEXACT REAL ti1, tj1; REAL ti0, tj0; REAL u[4], v[4]; INEXACT REAL u3, v3; REAL temp8[8], temp16a[16], temp16b[16], temp16c[16]; REAL temp32a[32], temp32b[32], temp48[48], temp64[64]; int temp8len, temp16alen, temp16blen, temp16clen; int temp32alen, temp32blen, temp48len, temp64len; REAL axtbb[8], axtcc[8], aytbb[8], aytcc[8]; int axtbblen, axtcclen, aytbblen, aytcclen; REAL bxtaa[8], bxtcc[8], bytaa[8], bytcc[8]; int bxtaalen, bxtcclen, bytaalen, bytcclen; REAL cxtaa[8], cxtbb[8], cytaa[8], cytbb[8]; int cxtaalen, cxtbblen, cytaalen, cytbblen; REAL axtbc[8], aytbc[8], bxtca[8], bytca[8], cxtab[8], cytab[8]; int axtbclen = 0, aytbclen = 0; int bxtcalen = 0, bytcalen = 0; int cxtablen = 0, cytablen = 0; REAL axtbct[16], aytbct[16], bxtcat[16], bytcat[16], cxtabt[16], cytabt[16]; int axtbctlen, aytbctlen, bxtcatlen, bytcatlen, cxtabtlen, cytabtlen; REAL axtbctt[8], aytbctt[8], bxtcatt[8]; REAL bytcatt[8], cxtabtt[8], cytabtt[8]; int axtbcttlen, aytbcttlen, bxtcattlen, bytcattlen, cxtabttlen, cytabttlen; REAL abt[8], bct[8], cat[8]; int abtlen, bctlen, catlen; REAL abtt[4], bctt[4], catt[4]; int abttlen, bcttlen, cattlen; INEXACT REAL abtt3, bctt3, catt3; REAL negate; INEXACT REAL bvirt; REAL avirt, bround, around; INEXACT REAL c; INEXACT REAL abig; REAL ahi, alo, bhi, blo; REAL err1, err2, err3; INEXACT REAL _i, _j; REAL _0; adx = (REAL) (pa[0] - pd[0]); bdx = (REAL) (pb[0] - pd[0]); cdx = (REAL) (pc[0] - pd[0]); ady = (REAL) (pa[1] - pd[1]); bdy = (REAL) (pb[1] - pd[1]); cdy = (REAL) (pc[1] - pd[1]); Two_Product(bdx, cdy, bdxcdy1, bdxcdy0); Two_Product(cdx, bdy, cdxbdy1, cdxbdy0); Two_Two_Diff(bdxcdy1, bdxcdy0, cdxbdy1, cdxbdy0, bc3, bc[2], bc[1], bc[0]); bc[3] = bc3; axbclen = scale_expansion_zeroelim(4, bc, adx, axbc); axxbclen = scale_expansion_zeroelim(axbclen, axbc, adx, axxbc); aybclen = scale_expansion_zeroelim(4, bc, ady, aybc); ayybclen = scale_expansion_zeroelim(aybclen, aybc, ady, ayybc); alen = fast_expansion_sum_zeroelim(axxbclen, axxbc, ayybclen, ayybc, adet); Two_Product(cdx, ady, cdxady1, cdxady0); Two_Product(adx, cdy, adxcdy1, adxcdy0); Two_Two_Diff(cdxady1, cdxady0, adxcdy1, adxcdy0, ca3, ca[2], ca[1], ca[0]); ca[3] = ca3; bxcalen = scale_expansion_zeroelim(4, ca, bdx, bxca); bxxcalen = scale_expansion_zeroelim(bxcalen, bxca, bdx, bxxca); bycalen = scale_expansion_zeroelim(4, ca, bdy, byca); byycalen = scale_expansion_zeroelim(bycalen, byca, bdy, byyca); blen = fast_expansion_sum_zeroelim(bxxcalen, bxxca, byycalen, byyca, bdet); Two_Product(adx, bdy, adxbdy1, adxbdy0); Two_Product(bdx, ady, bdxady1, bdxady0); Two_Two_Diff(adxbdy1, adxbdy0, bdxady1, bdxady0, ab3, ab[2], ab[1], ab[0]); ab[3] = ab3; cxablen = scale_expansion_zeroelim(4, ab, cdx, cxab); cxxablen = scale_expansion_zeroelim(cxablen, cxab, cdx, cxxab); cyablen = scale_expansion_zeroelim(4, ab, cdy, cyab); cyyablen = scale_expansion_zeroelim(cyablen, cyab, cdy, cyyab); clen = fast_expansion_sum_zeroelim(cxxablen, cxxab, cyyablen, cyyab, cdet); ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); finlength = fast_expansion_sum_zeroelim(ablen, abdet, clen, cdet, fin1); det = estimate(finlength, fin1); errbound = iccerrboundB * permanent; if ((det >= errbound) || (-det >= errbound)) { return det; } Two_Diff_Tail(pa[0], pd[0], adx, adxtail); Two_Diff_Tail(pa[1], pd[1], ady, adytail); Two_Diff_Tail(pb[0], pd[0], bdx, bdxtail); Two_Diff_Tail(pb[1], pd[1], bdy, bdytail); Two_Diff_Tail(pc[0], pd[0], cdx, cdxtail); Two_Diff_Tail(pc[1], pd[1], cdy, cdytail); if ((adxtail == 0.0) && (bdxtail == 0.0) && (cdxtail == 0.0) && (adytail == 0.0) && (bdytail == 0.0) && (cdytail == 0.0)) { return det; } errbound = iccerrboundC * permanent + resulterrbound * Absolute(det); det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) - (bdy * cdxtail + cdx * bdytail)) + 2.0 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) + ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) - (cdy * adxtail + adx * cdytail)) + 2.0 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) + ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) - (ady * bdxtail + bdx * adytail)) + 2.0 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx)); if ((det >= errbound) || (-det >= errbound)) { return det; } finnow = fin1; finother = fin2; if ((bdxtail != 0.0) || (bdytail != 0.0) || (cdxtail != 0.0) || (cdytail != 0.0)) { Square(adx, adxadx1, adxadx0); Square(ady, adyady1, adyady0); Two_Two_Sum(adxadx1, adxadx0, adyady1, adyady0, aa3, aa[2], aa[1], aa[0]); aa[3] = aa3; } if ((cdxtail != 0.0) || (cdytail != 0.0) || (adxtail != 0.0) || (adytail != 0.0)) { Square(bdx, bdxbdx1, bdxbdx0); Square(bdy, bdybdy1, bdybdy0); Two_Two_Sum(bdxbdx1, bdxbdx0, bdybdy1, bdybdy0, bb3, bb[2], bb[1], bb[0]); bb[3] = bb3; } if ((adxtail != 0.0) || (adytail != 0.0) || (bdxtail != 0.0) || (bdytail != 0.0)) { Square(cdx, cdxcdx1, cdxcdx0); Square(cdy, cdycdy1, cdycdy0); Two_Two_Sum(cdxcdx1, cdxcdx0, cdycdy1, cdycdy0, cc3, cc[2], cc[1], cc[0]); cc[3] = cc3; } if (adxtail != 0.0) { axtbclen = scale_expansion_zeroelim(4, bc, adxtail, axtbc); temp16alen = scale_expansion_zeroelim(axtbclen, axtbc, 2.0 * adx, temp16a); axtcclen = scale_expansion_zeroelim(4, cc, adxtail, axtcc); temp16blen = scale_expansion_zeroelim(axtcclen, axtcc, bdy, temp16b); axtbblen = scale_expansion_zeroelim(4, bb, adxtail, axtbb); temp16clen = scale_expansion_zeroelim(axtbblen, axtbb, -cdy, temp16c); temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp16blen, temp16b, temp32a); temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, temp32alen, temp32a, temp48); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, temp48, finother); finswap = finnow; finnow = finother; finother = finswap; } if (adytail != 0.0) { aytbclen = scale_expansion_zeroelim(4, bc, adytail, aytbc); temp16alen = scale_expansion_zeroelim(aytbclen, aytbc, 2.0 * ady, temp16a); aytbblen = scale_expansion_zeroelim(4, bb, adytail, aytbb); temp16blen = scale_expansion_zeroelim(aytbblen, aytbb, cdx, temp16b); aytcclen = scale_expansion_zeroelim(4, cc, adytail, aytcc); temp16clen = scale_expansion_zeroelim(aytcclen, aytcc, -bdx, temp16c); temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp16blen, temp16b, temp32a); temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, temp32alen, temp32a, temp48); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, temp48, finother); finswap = finnow; finnow = finother; finother = finswap; } if (bdxtail != 0.0) { bxtcalen = scale_expansion_zeroelim(4, ca, bdxtail, bxtca); temp16alen = scale_expansion_zeroelim(bxtcalen, bxtca, 2.0 * bdx, temp16a); bxtaalen = scale_expansion_zeroelim(4, aa, bdxtail, bxtaa); temp16blen = scale_expansion_zeroelim(bxtaalen, bxtaa, cdy, temp16b); bxtcclen = scale_expansion_zeroelim(4, cc, bdxtail, bxtcc); temp16clen = scale_expansion_zeroelim(bxtcclen, bxtcc, -ady, temp16c); temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp16blen, temp16b, temp32a); temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, temp32alen, temp32a, temp48); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, temp48, finother); finswap = finnow; finnow = finother; finother = finswap; } if (bdytail != 0.0) { bytcalen = scale_expansion_zeroelim(4, ca, bdytail, bytca); temp16alen = scale_expansion_zeroelim(bytcalen, bytca, 2.0 * bdy, temp16a); bytcclen = scale_expansion_zeroelim(4, cc, bdytail, bytcc); temp16blen = scale_expansion_zeroelim(bytcclen, bytcc, adx, temp16b); bytaalen = scale_expansion_zeroelim(4, aa, bdytail, bytaa); temp16clen = scale_expansion_zeroelim(bytaalen, bytaa, -cdx, temp16c); temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp16blen, temp16b, temp32a); temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, temp32alen, temp32a, temp48); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, temp48, finother); finswap = finnow; finnow = finother; finother = finswap; } if (cdxtail != 0.0) { cxtablen = scale_expansion_zeroelim(4, ab, cdxtail, cxtab); temp16alen = scale_expansion_zeroelim(cxtablen, cxtab, 2.0 * cdx, temp16a); cxtbblen = scale_expansion_zeroelim(4, bb, cdxtail, cxtbb); temp16blen = scale_expansion_zeroelim(cxtbblen, cxtbb, ady, temp16b); cxtaalen = scale_expansion_zeroelim(4, aa, cdxtail, cxtaa); temp16clen = scale_expansion_zeroelim(cxtaalen, cxtaa, -bdy, temp16c); temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp16blen, temp16b, temp32a); temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, temp32alen, temp32a, temp48); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, temp48, finother); finswap = finnow; finnow = finother; finother = finswap; } if (cdytail != 0.0) { cytablen = scale_expansion_zeroelim(4, ab, cdytail, cytab); temp16alen = scale_expansion_zeroelim(cytablen, cytab, 2.0 * cdy, temp16a); cytaalen = scale_expansion_zeroelim(4, aa, cdytail, cytaa); temp16blen = scale_expansion_zeroelim(cytaalen, cytaa, bdx, temp16b); cytbblen = scale_expansion_zeroelim(4, bb, cdytail, cytbb); temp16clen = scale_expansion_zeroelim(cytbblen, cytbb, -adx, temp16c); temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp16blen, temp16b, temp32a); temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, temp32alen, temp32a, temp48); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, temp48, finother); finswap = finnow; finnow = finother; finother = finswap; } if ((adxtail != 0.0) || (adytail != 0.0)) { if ((bdxtail != 0.0) || (bdytail != 0.0) || (cdxtail != 0.0) || (cdytail != 0.0)) { Two_Product(bdxtail, cdy, ti1, ti0); Two_Product(bdx, cdytail, tj1, tj0); Two_Two_Sum(ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0]); u[3] = u3; negate = -bdy; Two_Product(cdxtail, negate, ti1, ti0); negate = -bdytail; Two_Product(cdx, negate, tj1, tj0); Two_Two_Sum(ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0]); v[3] = v3; bctlen = fast_expansion_sum_zeroelim(4, u, 4, v, bct); Two_Product(bdxtail, cdytail, ti1, ti0); Two_Product(cdxtail, bdytail, tj1, tj0); Two_Two_Diff(ti1, ti0, tj1, tj0, bctt3, bctt[2], bctt[1], bctt[0]); bctt[3] = bctt3; bcttlen = 4; } else { bct[0] = 0.0; bctlen = 1; bctt[0] = 0.0; bcttlen = 1; } if (adxtail != 0.0) { temp16alen = scale_expansion_zeroelim(axtbclen, axtbc, adxtail, temp16a); axtbctlen = scale_expansion_zeroelim(bctlen, bct, adxtail, axtbct); temp32alen = scale_expansion_zeroelim(axtbctlen, axtbct, 2.0 * adx, temp32a); temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp32alen, temp32a, temp48); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, temp48, finother); finswap = finnow; finnow = finother; finother = finswap; if (bdytail != 0.0) { temp8len = scale_expansion_zeroelim(4, cc, adxtail, temp8); temp16alen = scale_expansion_zeroelim(temp8len, temp8, bdytail, temp16a); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, temp16a, finother); finswap = finnow; finnow = finother; finother = finswap; } if (cdytail != 0.0) { temp8len = scale_expansion_zeroelim(4, bb, -adxtail, temp8); temp16alen = scale_expansion_zeroelim(temp8len, temp8, cdytail, temp16a); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, temp16a, finother); finswap = finnow; finnow = finother; finother = finswap; } temp32alen = scale_expansion_zeroelim(axtbctlen, axtbct, adxtail, temp32a); axtbcttlen = scale_expansion_zeroelim(bcttlen, bctt, adxtail, axtbctt); temp16alen = scale_expansion_zeroelim(axtbcttlen, axtbctt, 2.0 * adx, temp16a); temp16blen = scale_expansion_zeroelim(axtbcttlen, axtbctt, adxtail, temp16b); temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp16blen, temp16b, temp32b); temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, temp32blen, temp32b, temp64); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, temp64, finother); finswap = finnow; finnow = finother; finother = finswap; } if (adytail != 0.0) { temp16alen = scale_expansion_zeroelim(aytbclen, aytbc, adytail, temp16a); aytbctlen = scale_expansion_zeroelim(bctlen, bct, adytail, aytbct); temp32alen = scale_expansion_zeroelim(aytbctlen, aytbct, 2.0 * ady, temp32a); temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp32alen, temp32a, temp48); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, temp48, finother); finswap = finnow; finnow = finother; finother = finswap; temp32alen = scale_expansion_zeroelim(aytbctlen, aytbct, adytail, temp32a); aytbcttlen = scale_expansion_zeroelim(bcttlen, bctt, adytail, aytbctt); temp16alen = scale_expansion_zeroelim(aytbcttlen, aytbctt, 2.0 * ady, temp16a); temp16blen = scale_expansion_zeroelim(aytbcttlen, aytbctt, adytail, temp16b); temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp16blen, temp16b, temp32b); temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, temp32blen, temp32b, temp64); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, temp64, finother); finswap = finnow; finnow = finother; finother = finswap; } } if ((bdxtail != 0.0) || (bdytail != 0.0)) { if ((cdxtail != 0.0) || (cdytail != 0.0) || (adxtail != 0.0) || (adytail != 0.0)) { Two_Product(cdxtail, ady, ti1, ti0); Two_Product(cdx, adytail, tj1, tj0); Two_Two_Sum(ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0]); u[3] = u3; negate = -cdy; Two_Product(adxtail, negate, ti1, ti0); negate = -cdytail; Two_Product(adx, negate, tj1, tj0); Two_Two_Sum(ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0]); v[3] = v3; catlen = fast_expansion_sum_zeroelim(4, u, 4, v, cat); Two_Product(cdxtail, adytail, ti1, ti0); Two_Product(adxtail, cdytail, tj1, tj0); Two_Two_Diff(ti1, ti0, tj1, tj0, catt3, catt[2], catt[1], catt[0]); catt[3] = catt3; cattlen = 4; } else { cat[0] = 0.0; catlen = 1; catt[0] = 0.0; cattlen = 1; } if (bdxtail != 0.0) { temp16alen = scale_expansion_zeroelim(bxtcalen, bxtca, bdxtail, temp16a); bxtcatlen = scale_expansion_zeroelim(catlen, cat, bdxtail, bxtcat); temp32alen = scale_expansion_zeroelim(bxtcatlen, bxtcat, 2.0 * bdx, temp32a); temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp32alen, temp32a, temp48); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, temp48, finother); finswap = finnow; finnow = finother; finother = finswap; if (cdytail != 0.0) { temp8len = scale_expansion_zeroelim(4, aa, bdxtail, temp8); temp16alen = scale_expansion_zeroelim(temp8len, temp8, cdytail, temp16a); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, temp16a, finother); finswap = finnow; finnow = finother; finother = finswap; } if (adytail != 0.0) { temp8len = scale_expansion_zeroelim(4, cc, -bdxtail, temp8); temp16alen = scale_expansion_zeroelim(temp8len, temp8, adytail, temp16a); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, temp16a, finother); finswap = finnow; finnow = finother; finother = finswap; } temp32alen = scale_expansion_zeroelim(bxtcatlen, bxtcat, bdxtail, temp32a); bxtcattlen = scale_expansion_zeroelim(cattlen, catt, bdxtail, bxtcatt); temp16alen = scale_expansion_zeroelim(bxtcattlen, bxtcatt, 2.0 * bdx, temp16a); temp16blen = scale_expansion_zeroelim(bxtcattlen, bxtcatt, bdxtail, temp16b); temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp16blen, temp16b, temp32b); temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, temp32blen, temp32b, temp64); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, temp64, finother); finswap = finnow; finnow = finother; finother = finswap; } if (bdytail != 0.0) { temp16alen = scale_expansion_zeroelim(bytcalen, bytca, bdytail, temp16a); bytcatlen = scale_expansion_zeroelim(catlen, cat, bdytail, bytcat); temp32alen = scale_expansion_zeroelim(bytcatlen, bytcat, 2.0 * bdy, temp32a); temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp32alen, temp32a, temp48); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, temp48, finother); finswap = finnow; finnow = finother; finother = finswap; temp32alen = scale_expansion_zeroelim(bytcatlen, bytcat, bdytail, temp32a); bytcattlen = scale_expansion_zeroelim(cattlen, catt, bdytail, bytcatt); temp16alen = scale_expansion_zeroelim(bytcattlen, bytcatt, 2.0 * bdy, temp16a); temp16blen = scale_expansion_zeroelim(bytcattlen, bytcatt, bdytail, temp16b); temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp16blen, temp16b, temp32b); temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, temp32blen, temp32b, temp64); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, temp64, finother); finswap = finnow; finnow = finother; finother = finswap; } } if ((cdxtail != 0.0) || (cdytail != 0.0)) { if ((adxtail != 0.0) || (adytail != 0.0) || (bdxtail != 0.0) || (bdytail != 0.0)) { Two_Product(adxtail, bdy, ti1, ti0); Two_Product(adx, bdytail, tj1, tj0); Two_Two_Sum(ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0]); u[3] = u3; negate = -ady; Two_Product(bdxtail, negate, ti1, ti0); negate = -adytail; Two_Product(bdx, negate, tj1, tj0); Two_Two_Sum(ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0]); v[3] = v3; abtlen = fast_expansion_sum_zeroelim(4, u, 4, v, abt); Two_Product(adxtail, bdytail, ti1, ti0); Two_Product(bdxtail, adytail, tj1, tj0); Two_Two_Diff(ti1, ti0, tj1, tj0, abtt3, abtt[2], abtt[1], abtt[0]); abtt[3] = abtt3; abttlen = 4; } else { abt[0] = 0.0; abtlen = 1; abtt[0] = 0.0; abttlen = 1; } if (cdxtail != 0.0) { temp16alen = scale_expansion_zeroelim(cxtablen, cxtab, cdxtail, temp16a); cxtabtlen = scale_expansion_zeroelim(abtlen, abt, cdxtail, cxtabt); temp32alen = scale_expansion_zeroelim(cxtabtlen, cxtabt, 2.0 * cdx, temp32a); temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp32alen, temp32a, temp48); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, temp48, finother); finswap = finnow; finnow = finother; finother = finswap; if (adytail != 0.0) { temp8len = scale_expansion_zeroelim(4, bb, cdxtail, temp8); temp16alen = scale_expansion_zeroelim(temp8len, temp8, adytail, temp16a); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, temp16a, finother); finswap = finnow; finnow = finother; finother = finswap; } if (bdytail != 0.0) { temp8len = scale_expansion_zeroelim(4, aa, -cdxtail, temp8); temp16alen = scale_expansion_zeroelim(temp8len, temp8, bdytail, temp16a); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, temp16a, finother); finswap = finnow; finnow = finother; finother = finswap; } temp32alen = scale_expansion_zeroelim(cxtabtlen, cxtabt, cdxtail, temp32a); cxtabttlen = scale_expansion_zeroelim(abttlen, abtt, cdxtail, cxtabtt); temp16alen = scale_expansion_zeroelim(cxtabttlen, cxtabtt, 2.0 * cdx, temp16a); temp16blen = scale_expansion_zeroelim(cxtabttlen, cxtabtt, cdxtail, temp16b); temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp16blen, temp16b, temp32b); temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, temp32blen, temp32b, temp64); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, temp64, finother); finswap = finnow; finnow = finother; finother = finswap; } if (cdytail != 0.0) { temp16alen = scale_expansion_zeroelim(cytablen, cytab, cdytail, temp16a); cytabtlen = scale_expansion_zeroelim(abtlen, abt, cdytail, cytabt); temp32alen = scale_expansion_zeroelim(cytabtlen, cytabt, 2.0 * cdy, temp32a); temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp32alen, temp32a, temp48); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, temp48, finother); finswap = finnow; finnow = finother; finother = finswap; temp32alen = scale_expansion_zeroelim(cytabtlen, cytabt, cdytail, temp32a); cytabttlen = scale_expansion_zeroelim(abttlen, abtt, cdytail, cytabtt); temp16alen = scale_expansion_zeroelim(cytabttlen, cytabtt, 2.0 * cdy, temp16a); temp16blen = scale_expansion_zeroelim(cytabttlen, cytabtt, cdytail, temp16b); temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, temp16blen, temp16b, temp32b); temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, temp32blen, temp32b, temp64); finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, temp64, finother); finswap = finnow; finnow = finother; finother = finswap; } } return finnow[finlength - 1]; } REAL incircle(const REAL *pa, const REAL *pb, const REAL *pc, const REAL *pd) { REAL adx, bdx, cdx, ady, bdy, cdy; REAL bdxcdy, cdxbdy, cdxady, adxcdy, adxbdy, bdxady; REAL alift, blift, clift; REAL det; REAL permanent, errbound; REAL inc; FPU_ROUND_DOUBLE; adx = pa[0] - pd[0]; bdx = pb[0] - pd[0]; cdx = pc[0] - pd[0]; ady = pa[1] - pd[1]; bdy = pb[1] - pd[1]; cdy = pc[1] - pd[1]; bdxcdy = bdx * cdy; cdxbdy = cdx * bdy; alift = adx * adx + ady * ady; cdxady = cdx * ady; adxcdy = adx * cdy; blift = bdx * bdx + bdy * bdy; adxbdy = adx * bdy; bdxady = bdx * ady; clift = cdx * cdx + cdy * cdy; det = alift * (bdxcdy - cdxbdy) + blift * (cdxady - adxcdy) + clift * (adxbdy - bdxady); permanent = (Absolute(bdxcdy) + Absolute(cdxbdy)) * alift + (Absolute(cdxady) + Absolute(adxcdy)) * blift + (Absolute(adxbdy) + Absolute(bdxady)) * clift; errbound = iccerrboundA * permanent; if ((det > errbound) || (-det > errbound)) { FPU_RESTORE; return det; } inc = incircleadapt(pa, pb, pc, pd, permanent); FPU_RESTORE; return inc; } REAL incircle(REAL ax, REAL ay, REAL bx, REAL by, REAL cx, REAL cy, REAL dx, REAL dy) { REAL adx, bdx, cdx, ady, bdy, cdy; REAL bdxcdy, cdxbdy, cdxady, adxcdy, adxbdy, bdxady; REAL alift, blift, clift; REAL det; REAL permanent, errbound; REAL inc; FPU_ROUND_DOUBLE; adx = ax - dx; bdx = bx - dx; cdx = cx - dx; ady = ay - dy; bdy = by - dy; cdy = cy - dy; bdxcdy = bdx * cdy; cdxbdy = cdx * bdy; alift = adx * adx + ady * ady; cdxady = cdx * ady; adxcdy = adx * cdy; blift = bdx * bdx + bdy * bdy; adxbdy = adx * bdy; bdxady = bdx * ady; clift = cdx * cdx + cdy * cdy; det = alift * (bdxcdy - cdxbdy) + blift * (cdxady - adxcdy) + clift * (adxbdy - bdxady); permanent = (Absolute(bdxcdy) + Absolute(cdxbdy)) * alift + (Absolute(cdxady) + Absolute(adxcdy)) * blift + (Absolute(adxbdy) + Absolute(bdxady)) * clift; errbound = iccerrboundA * permanent; if ((det > errbound) || (-det > errbound)) { FPU_RESTORE; return det; } REAL pa[]={ax,ay}; REAL pb[]={bx,by}; REAL pc[]={cx,cy}; REAL pd[]={dx,dy}; inc = incircleadapt(pa, pb, pc, pd, permanent); FPU_RESTORE; return inc; } /*****************************************************************************/ /* */ /* inspherefast() Approximate 3D insphere test. Nonrobust. */ /* insphereexact() Exact 3D insphere test. Robust. */ /* insphereslow() Another exact 3D insphere test. Robust. */ /* insphere() Adaptive exact 3D insphere test. Robust. */ /* */ /* Return a positive value if the point pe lies inside the */ /* sphere passing through pa, pb, pc, and pd; a negative value */ /* if it lies outside; and zero if the five points are */ /* cospherical. The points pa, pb, pc, and pd must be ordered */ /* so that they have a positive orientation (as defined by */ /* orient3d()), or the sign of the result will be reversed. */ /* */ /* Only the first and last routine should be used; the middle two are for */ /* timings. */ /* */ /* The last three use exact arithmetic to ensure a correct answer. The */ /* result returned is the determinant of a matrix. In insphere() only, */ /* this determinant is computed adaptively, in the sense that exact */ /* arithmetic is used only to the degree it is needed to ensure that the */ /* returned value has the correct sign. Hence, insphere() is usually quite */ /* fast, but will run more slowly when the input points are cospherical or */ /* nearly so. */ /* */ /*****************************************************************************/ static REAL insphereexact(const REAL *pa, const REAL *pb, const REAL *pc, const REAL *pd, const REAL *pe) { INEXACT REAL axby1, bxcy1, cxdy1, dxey1, exay1; INEXACT REAL bxay1, cxby1, dxcy1, exdy1, axey1; INEXACT REAL axcy1, bxdy1, cxey1, dxay1, exby1; INEXACT REAL cxay1, dxby1, excy1, axdy1, bxey1; REAL axby0, bxcy0, cxdy0, dxey0, exay0; REAL bxay0, cxby0, dxcy0, exdy0, axey0; REAL axcy0, bxdy0, cxey0, dxay0, exby0; REAL cxay0, dxby0, excy0, axdy0, bxey0; REAL ab[4], bc[4], cd[4], de[4], ea[4]; REAL ac[4], bd[4], ce[4], da[4], eb[4]; REAL temp8a[8], temp8b[8], temp16[16]; int temp8alen, temp8blen, temp16len; REAL abc[24], bcd[24], cde[24], dea[24], eab[24]; REAL abd[24], bce[24], cda[24], deb[24], eac[24]; int abclen, bcdlen, cdelen, dealen, eablen; int abdlen, bcelen, cdalen, deblen, eaclen; REAL temp48a[48], temp48b[48]; int temp48alen, temp48blen; REAL abcd[96], bcde[96], cdea[96], deab[96], eabc[96]; int abcdlen, bcdelen, cdealen, deablen, eabclen; REAL temp192[192]; REAL det384x[384], det384y[384], det384z[384]; int xlen, ylen, zlen; REAL detxy[768]; int xylen; REAL adet[1152], bdet[1152], cdet[1152], ddet[1152], edet[1152]; int alen, blen, clen, dlen, elen; REAL abdet[2304], cddet[2304], cdedet[3456]; int ablen, cdlen; REAL deter[5760]; int deterlen; int i; INEXACT REAL bvirt; REAL avirt, bround, around; INEXACT REAL c; INEXACT REAL abig; REAL ahi, alo, bhi, blo; REAL err1, err2, err3; INEXACT REAL _i, _j; REAL _0; Two_Product(pa[0], pb[1], axby1, axby0); Two_Product(pb[0], pa[1], bxay1, bxay0); Two_Two_Diff(axby1, axby0, bxay1, bxay0, ab[3], ab[2], ab[1], ab[0]); Two_Product(pb[0], pc[1], bxcy1, bxcy0); Two_Product(pc[0], pb[1], cxby1, cxby0); Two_Two_Diff(bxcy1, bxcy0, cxby1, cxby0, bc[3], bc[2], bc[1], bc[0]); Two_Product(pc[0], pd[1], cxdy1, cxdy0); Two_Product(pd[0], pc[1], dxcy1, dxcy0); Two_Two_Diff(cxdy1, cxdy0, dxcy1, dxcy0, cd[3], cd[2], cd[1], cd[0]); Two_Product(pd[0], pe[1], dxey1, dxey0); Two_Product(pe[0], pd[1], exdy1, exdy0); Two_Two_Diff(dxey1, dxey0, exdy1, exdy0, de[3], de[2], de[1], de[0]); Two_Product(pe[0], pa[1], exay1, exay0); Two_Product(pa[0], pe[1], axey1, axey0); Two_Two_Diff(exay1, exay0, axey1, axey0, ea[3], ea[2], ea[1], ea[0]); Two_Product(pa[0], pc[1], axcy1, axcy0); Two_Product(pc[0], pa[1], cxay1, cxay0); Two_Two_Diff(axcy1, axcy0, cxay1, cxay0, ac[3], ac[2], ac[1], ac[0]); Two_Product(pb[0], pd[1], bxdy1, bxdy0); Two_Product(pd[0], pb[1], dxby1, dxby0); Two_Two_Diff(bxdy1, bxdy0, dxby1, dxby0, bd[3], bd[2], bd[1], bd[0]); Two_Product(pc[0], pe[1], cxey1, cxey0); Two_Product(pe[0], pc[1], excy1, excy0); Two_Two_Diff(cxey1, cxey0, excy1, excy0, ce[3], ce[2], ce[1], ce[0]); Two_Product(pd[0], pa[1], dxay1, dxay0); Two_Product(pa[0], pd[1], axdy1, axdy0); Two_Two_Diff(dxay1, dxay0, axdy1, axdy0, da[3], da[2], da[1], da[0]); Two_Product(pe[0], pb[1], exby1, exby0); Two_Product(pb[0], pe[1], bxey1, bxey0); Two_Two_Diff(exby1, exby0, bxey1, bxey0, eb[3], eb[2], eb[1], eb[0]); temp8alen = scale_expansion_zeroelim(4, bc, pa[2], temp8a); temp8blen = scale_expansion_zeroelim(4, ac, -pb[2], temp8b); temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, temp16); temp8alen = scale_expansion_zeroelim(4, ab, pc[2], temp8a); abclen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, abc); temp8alen = scale_expansion_zeroelim(4, cd, pb[2], temp8a); temp8blen = scale_expansion_zeroelim(4, bd, -pc[2], temp8b); temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, temp16); temp8alen = scale_expansion_zeroelim(4, bc, pd[2], temp8a); bcdlen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, bcd); temp8alen = scale_expansion_zeroelim(4, de, pc[2], temp8a); temp8blen = scale_expansion_zeroelim(4, ce, -pd[2], temp8b); temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, temp16); temp8alen = scale_expansion_zeroelim(4, cd, pe[2], temp8a); cdelen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, cde); temp8alen = scale_expansion_zeroelim(4, ea, pd[2], temp8a); temp8blen = scale_expansion_zeroelim(4, da, -pe[2], temp8b); temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, temp16); temp8alen = scale_expansion_zeroelim(4, de, pa[2], temp8a); dealen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, dea); temp8alen = scale_expansion_zeroelim(4, ab, pe[2], temp8a); temp8blen = scale_expansion_zeroelim(4, eb, -pa[2], temp8b); temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, temp16); temp8alen = scale_expansion_zeroelim(4, ea, pb[2], temp8a); eablen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, eab); temp8alen = scale_expansion_zeroelim(4, bd, pa[2], temp8a); temp8blen = scale_expansion_zeroelim(4, da, pb[2], temp8b); temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, temp16); temp8alen = scale_expansion_zeroelim(4, ab, pd[2], temp8a); abdlen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, abd); temp8alen = scale_expansion_zeroelim(4, ce, pb[2], temp8a); temp8blen = scale_expansion_zeroelim(4, eb, pc[2], temp8b); temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, temp16); temp8alen = scale_expansion_zeroelim(4, bc, pe[2], temp8a); bcelen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, bce); temp8alen = scale_expansion_zeroelim(4, da, pc[2], temp8a); temp8blen = scale_expansion_zeroelim(4, ac, pd[2], temp8b); temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, temp16); temp8alen = scale_expansion_zeroelim(4, cd, pa[2], temp8a); cdalen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, cda); temp8alen = scale_expansion_zeroelim(4, eb, pd[2], temp8a); temp8blen = scale_expansion_zeroelim(4, bd, pe[2], temp8b); temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, temp16); temp8alen = scale_expansion_zeroelim(4, de, pb[2], temp8a); deblen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, deb); temp8alen = scale_expansion_zeroelim(4, ac, pe[2], temp8a); temp8blen = scale_expansion_zeroelim(4, ce, pa[2], temp8b); temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, temp16); temp8alen = scale_expansion_zeroelim(4, ea, pc[2], temp8a); eaclen = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp16len, temp16, eac); temp48alen = fast_expansion_sum_zeroelim(cdelen, cde, bcelen, bce, temp48a); temp48blen = fast_expansion_sum_zeroelim(deblen, deb, bcdlen, bcd, temp48b); for (i = 0; i < temp48blen; i++) { temp48b[i] = -temp48b[i]; } bcdelen = fast_expansion_sum_zeroelim(temp48alen, temp48a, temp48blen, temp48b, bcde); xlen = scale_expansion_zeroelim(bcdelen, bcde, pa[0], temp192); xlen = scale_expansion_zeroelim(xlen, temp192, pa[0], det384x); ylen = scale_expansion_zeroelim(bcdelen, bcde, pa[1], temp192); ylen = scale_expansion_zeroelim(ylen, temp192, pa[1], det384y); zlen = scale_expansion_zeroelim(bcdelen, bcde, pa[2], temp192); zlen = scale_expansion_zeroelim(zlen, temp192, pa[2], det384z); xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); alen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, adet); temp48alen = fast_expansion_sum_zeroelim(dealen, dea, cdalen, cda, temp48a); temp48blen = fast_expansion_sum_zeroelim(eaclen, eac, cdelen, cde, temp48b); for (i = 0; i < temp48blen; i++) { temp48b[i] = -temp48b[i]; } cdealen = fast_expansion_sum_zeroelim(temp48alen, temp48a, temp48blen, temp48b, cdea); xlen = scale_expansion_zeroelim(cdealen, cdea, pb[0], temp192); xlen = scale_expansion_zeroelim(xlen, temp192, pb[0], det384x); ylen = scale_expansion_zeroelim(cdealen, cdea, pb[1], temp192); ylen = scale_expansion_zeroelim(ylen, temp192, pb[1], det384y); zlen = scale_expansion_zeroelim(cdealen, cdea, pb[2], temp192); zlen = scale_expansion_zeroelim(zlen, temp192, pb[2], det384z); xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); blen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, bdet); temp48alen = fast_expansion_sum_zeroelim(eablen, eab, deblen, deb, temp48a); temp48blen = fast_expansion_sum_zeroelim(abdlen, abd, dealen, dea, temp48b); for (i = 0; i < temp48blen; i++) { temp48b[i] = -temp48b[i]; } deablen = fast_expansion_sum_zeroelim(temp48alen, temp48a, temp48blen, temp48b, deab); xlen = scale_expansion_zeroelim(deablen, deab, pc[0], temp192); xlen = scale_expansion_zeroelim(xlen, temp192, pc[0], det384x); ylen = scale_expansion_zeroelim(deablen, deab, pc[1], temp192); ylen = scale_expansion_zeroelim(ylen, temp192, pc[1], det384y); zlen = scale_expansion_zeroelim(deablen, deab, pc[2], temp192); zlen = scale_expansion_zeroelim(zlen, temp192, pc[2], det384z); xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); clen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, cdet); temp48alen = fast_expansion_sum_zeroelim(abclen, abc, eaclen, eac, temp48a); temp48blen = fast_expansion_sum_zeroelim(bcelen, bce, eablen, eab, temp48b); for (i = 0; i < temp48blen; i++) { temp48b[i] = -temp48b[i]; } eabclen = fast_expansion_sum_zeroelim(temp48alen, temp48a, temp48blen, temp48b, eabc); xlen = scale_expansion_zeroelim(eabclen, eabc, pd[0], temp192); xlen = scale_expansion_zeroelim(xlen, temp192, pd[0], det384x); ylen = scale_expansion_zeroelim(eabclen, eabc, pd[1], temp192); ylen = scale_expansion_zeroelim(ylen, temp192, pd[1], det384y); zlen = scale_expansion_zeroelim(eabclen, eabc, pd[2], temp192); zlen = scale_expansion_zeroelim(zlen, temp192, pd[2], det384z); xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); dlen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, ddet); temp48alen = fast_expansion_sum_zeroelim(bcdlen, bcd, abdlen, abd, temp48a); temp48blen = fast_expansion_sum_zeroelim(cdalen, cda, abclen, abc, temp48b); for (i = 0; i < temp48blen; i++) { temp48b[i] = -temp48b[i]; } abcdlen = fast_expansion_sum_zeroelim(temp48alen, temp48a, temp48blen, temp48b, abcd); xlen = scale_expansion_zeroelim(abcdlen, abcd, pe[0], temp192); xlen = scale_expansion_zeroelim(xlen, temp192, pe[0], det384x); ylen = scale_expansion_zeroelim(abcdlen, abcd, pe[1], temp192); ylen = scale_expansion_zeroelim(ylen, temp192, pe[1], det384y); zlen = scale_expansion_zeroelim(abcdlen, abcd, pe[2], temp192); zlen = scale_expansion_zeroelim(zlen, temp192, pe[2], det384z); xylen = fast_expansion_sum_zeroelim(xlen, det384x, ylen, det384y, detxy); elen = fast_expansion_sum_zeroelim(xylen, detxy, zlen, det384z, edet); ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); cdelen = fast_expansion_sum_zeroelim(cdlen, cddet, elen, edet, cdedet); deterlen = fast_expansion_sum_zeroelim(ablen, abdet, cdelen, cdedet, deter); return deter[deterlen - 1]; } static REAL insphereadapt(const REAL *pa, const REAL *pb, const REAL *pc, const REAL *pd, const REAL *pe, REAL permanent) { INEXACT REAL aex, bex, cex, dex, aey, bey, cey, dey, aez, bez, cez, dez; REAL det, errbound; INEXACT REAL aexbey1, bexaey1, bexcey1, cexbey1; INEXACT REAL cexdey1, dexcey1, dexaey1, aexdey1; INEXACT REAL aexcey1, cexaey1, bexdey1, dexbey1; REAL aexbey0, bexaey0, bexcey0, cexbey0; REAL cexdey0, dexcey0, dexaey0, aexdey0; REAL aexcey0, cexaey0, bexdey0, dexbey0; REAL ab[4], bc[4], cd[4], da[4], ac[4], bd[4]; INEXACT REAL ab3, bc3, cd3, da3, ac3, bd3; REAL abeps, bceps, cdeps, daeps, aceps, bdeps; REAL temp8a[8], temp8b[8], temp8c[8], temp16[16], temp24[24], temp48[48]; int temp8alen, temp8blen, temp8clen, temp16len, temp24len, temp48len; REAL xdet[96], ydet[96], zdet[96], xydet[192]; int xlen, ylen, zlen, xylen; REAL adet[288], bdet[288], cdet[288], ddet[288]; int alen, blen, clen, dlen; REAL abdet[576], cddet[576]; int ablen, cdlen; REAL fin1[1152]; int finlength; REAL aextail, bextail, cextail, dextail; REAL aeytail, beytail, ceytail, deytail; REAL aeztail, beztail, ceztail, deztail; INEXACT REAL bvirt; REAL avirt, bround, around; INEXACT REAL c; INEXACT REAL abig; REAL ahi, alo, bhi, blo; REAL err1, err2, err3; INEXACT REAL _i, _j; REAL _0; aex = (REAL) (pa[0] - pe[0]); bex = (REAL) (pb[0] - pe[0]); cex = (REAL) (pc[0] - pe[0]); dex = (REAL) (pd[0] - pe[0]); aey = (REAL) (pa[1] - pe[1]); bey = (REAL) (pb[1] - pe[1]); cey = (REAL) (pc[1] - pe[1]); dey = (REAL) (pd[1] - pe[1]); aez = (REAL) (pa[2] - pe[2]); bez = (REAL) (pb[2] - pe[2]); cez = (REAL) (pc[2] - pe[2]); dez = (REAL) (pd[2] - pe[2]); Two_Product(aex, bey, aexbey1, aexbey0); Two_Product(bex, aey, bexaey1, bexaey0); Two_Two_Diff(aexbey1, aexbey0, bexaey1, bexaey0, ab3, ab[2], ab[1], ab[0]); ab[3] = ab3; Two_Product(bex, cey, bexcey1, bexcey0); Two_Product(cex, bey, cexbey1, cexbey0); Two_Two_Diff(bexcey1, bexcey0, cexbey1, cexbey0, bc3, bc[2], bc[1], bc[0]); bc[3] = bc3; Two_Product(cex, dey, cexdey1, cexdey0); Two_Product(dex, cey, dexcey1, dexcey0); Two_Two_Diff(cexdey1, cexdey0, dexcey1, dexcey0, cd3, cd[2], cd[1], cd[0]); cd[3] = cd3; Two_Product(dex, aey, dexaey1, dexaey0); Two_Product(aex, dey, aexdey1, aexdey0); Two_Two_Diff(dexaey1, dexaey0, aexdey1, aexdey0, da3, da[2], da[1], da[0]); da[3] = da3; Two_Product(aex, cey, aexcey1, aexcey0); Two_Product(cex, aey, cexaey1, cexaey0); Two_Two_Diff(aexcey1, aexcey0, cexaey1, cexaey0, ac3, ac[2], ac[1], ac[0]); ac[3] = ac3; Two_Product(bex, dey, bexdey1, bexdey0); Two_Product(dex, bey, dexbey1, dexbey0); Two_Two_Diff(bexdey1, bexdey0, dexbey1, dexbey0, bd3, bd[2], bd[1], bd[0]); bd[3] = bd3; temp8alen = scale_expansion_zeroelim(4, cd, bez, temp8a); temp8blen = scale_expansion_zeroelim(4, bd, -cez, temp8b); temp8clen = scale_expansion_zeroelim(4, bc, dez, temp8c); temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, temp16); temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, temp16len, temp16, temp24); temp48len = scale_expansion_zeroelim(temp24len, temp24, aex, temp48); xlen = scale_expansion_zeroelim(temp48len, temp48, -aex, xdet); temp48len = scale_expansion_zeroelim(temp24len, temp24, aey, temp48); ylen = scale_expansion_zeroelim(temp48len, temp48, -aey, ydet); temp48len = scale_expansion_zeroelim(temp24len, temp24, aez, temp48); zlen = scale_expansion_zeroelim(temp48len, temp48, -aez, zdet); xylen = fast_expansion_sum_zeroelim(xlen, xdet, ylen, ydet, xydet); alen = fast_expansion_sum_zeroelim(xylen, xydet, zlen, zdet, adet); temp8alen = scale_expansion_zeroelim(4, da, cez, temp8a); temp8blen = scale_expansion_zeroelim(4, ac, dez, temp8b); temp8clen = scale_expansion_zeroelim(4, cd, aez, temp8c); temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, temp16); temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, temp16len, temp16, temp24); temp48len = scale_expansion_zeroelim(temp24len, temp24, bex, temp48); xlen = scale_expansion_zeroelim(temp48len, temp48, bex, xdet); temp48len = scale_expansion_zeroelim(temp24len, temp24, bey, temp48); ylen = scale_expansion_zeroelim(temp48len, temp48, bey, ydet); temp48len = scale_expansion_zeroelim(temp24len, temp24, bez, temp48); zlen = scale_expansion_zeroelim(temp48len, temp48, bez, zdet); xylen = fast_expansion_sum_zeroelim(xlen, xdet, ylen, ydet, xydet); blen = fast_expansion_sum_zeroelim(xylen, xydet, zlen, zdet, bdet); temp8alen = scale_expansion_zeroelim(4, ab, dez, temp8a); temp8blen = scale_expansion_zeroelim(4, bd, aez, temp8b); temp8clen = scale_expansion_zeroelim(4, da, bez, temp8c); temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, temp16); temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, temp16len, temp16, temp24); temp48len = scale_expansion_zeroelim(temp24len, temp24, cex, temp48); xlen = scale_expansion_zeroelim(temp48len, temp48, -cex, xdet); temp48len = scale_expansion_zeroelim(temp24len, temp24, cey, temp48); ylen = scale_expansion_zeroelim(temp48len, temp48, -cey, ydet); temp48len = scale_expansion_zeroelim(temp24len, temp24, cez, temp48); zlen = scale_expansion_zeroelim(temp48len, temp48, -cez, zdet); xylen = fast_expansion_sum_zeroelim(xlen, xdet, ylen, ydet, xydet); clen = fast_expansion_sum_zeroelim(xylen, xydet, zlen, zdet, cdet); temp8alen = scale_expansion_zeroelim(4, bc, aez, temp8a); temp8blen = scale_expansion_zeroelim(4, ac, -bez, temp8b); temp8clen = scale_expansion_zeroelim(4, ab, cez, temp8c); temp16len = fast_expansion_sum_zeroelim(temp8alen, temp8a, temp8blen, temp8b, temp16); temp24len = fast_expansion_sum_zeroelim(temp8clen, temp8c, temp16len, temp16, temp24); temp48len = scale_expansion_zeroelim(temp24len, temp24, dex, temp48); xlen = scale_expansion_zeroelim(temp48len, temp48, dex, xdet); temp48len = scale_expansion_zeroelim(temp24len, temp24, dey, temp48); ylen = scale_expansion_zeroelim(temp48len, temp48, dey, ydet); temp48len = scale_expansion_zeroelim(temp24len, temp24, dez, temp48); zlen = scale_expansion_zeroelim(temp48len, temp48, dez, zdet); xylen = fast_expansion_sum_zeroelim(xlen, xdet, ylen, ydet, xydet); dlen = fast_expansion_sum_zeroelim(xylen, xydet, zlen, zdet, ddet); ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); cdlen = fast_expansion_sum_zeroelim(clen, cdet, dlen, ddet, cddet); finlength = fast_expansion_sum_zeroelim(ablen, abdet, cdlen, cddet, fin1); det = estimate(finlength, fin1); errbound = isperrboundB * permanent; if ((det >= errbound) || (-det >= errbound)) { return det; } Two_Diff_Tail(pa[0], pe[0], aex, aextail); Two_Diff_Tail(pa[1], pe[1], aey, aeytail); Two_Diff_Tail(pa[2], pe[2], aez, aeztail); Two_Diff_Tail(pb[0], pe[0], bex, bextail); Two_Diff_Tail(pb[1], pe[1], bey, beytail); Two_Diff_Tail(pb[2], pe[2], bez, beztail); Two_Diff_Tail(pc[0], pe[0], cex, cextail); Two_Diff_Tail(pc[1], pe[1], cey, ceytail); Two_Diff_Tail(pc[2], pe[2], cez, ceztail); Two_Diff_Tail(pd[0], pe[0], dex, dextail); Two_Diff_Tail(pd[1], pe[1], dey, deytail); Two_Diff_Tail(pd[2], pe[2], dez, deztail); if ((aextail == 0.0) && (aeytail == 0.0) && (aeztail == 0.0) && (bextail == 0.0) && (beytail == 0.0) && (beztail == 0.0) && (cextail == 0.0) && (ceytail == 0.0) && (ceztail == 0.0) && (dextail == 0.0) && (deytail == 0.0) && (deztail == 0.0)) { return det; } errbound = isperrboundC * permanent + resulterrbound * Absolute(det); abeps = (aex * beytail + bey * aextail) - (aey * bextail + bex * aeytail); bceps = (bex * ceytail + cey * bextail) - (bey * cextail + cex * beytail); cdeps = (cex * deytail + dey * cextail) - (cey * dextail + dex * ceytail); daeps = (dex * aeytail + aey * dextail) - (dey * aextail + aex * deytail); aceps = (aex * ceytail + cey * aextail) - (aey * cextail + cex * aeytail); bdeps = (bex * deytail + dey * bextail) - (bey * dextail + dex * beytail); det += (((bex * bex + bey * bey + bez * bez) * ((cez * daeps + dez * aceps + aez * cdeps) + (ceztail * da3 + deztail * ac3 + aeztail * cd3)) + (dex * dex + dey * dey + dez * dez) * ((aez * bceps - bez * aceps + cez * abeps) + (aeztail * bc3 - beztail * ac3 + ceztail * ab3))) - ((aex * aex + aey * aey + aez * aez) * ((bez * cdeps - cez * bdeps + dez * bceps) + (beztail * cd3 - ceztail * bd3 + deztail * bc3)) + (cex * cex + cey * cey + cez * cez) * ((dez * abeps + aez * bdeps + bez * daeps) + (deztail * ab3 + aeztail * bd3 + beztail * da3)))) + 2.0 * (((bex * bextail + bey * beytail + bez * beztail) * (cez * da3 + dez * ac3 + aez * cd3) + (dex * dextail + dey * deytail + dez * deztail) * (aez * bc3 - bez * ac3 + cez * ab3)) - ((aex * aextail + aey * aeytail + aez * aeztail) * (bez * cd3 - cez * bd3 + dez * bc3) + (cex * cextail + cey * ceytail + cez * ceztail) * (dez * ab3 + aez * bd3 + bez * da3))); if ((det >= errbound) || (-det >= errbound)) { return det; } return insphereexact(pa, pb, pc, pd, pe); } REAL insphere(const REAL *pa, const REAL *pb, const REAL *pc, const REAL *pd, const REAL *pe) { REAL aex, bex, cex, dex; REAL aey, bey, cey, dey; REAL aez, bez, cez, dez; REAL aexbey, bexaey, bexcey, cexbey, cexdey, dexcey, dexaey, aexdey; REAL aexcey, cexaey, bexdey, dexbey; REAL alift, blift, clift, dlift; REAL ab, bc, cd, da, ac, bd; REAL abc, bcd, cda, dab; REAL aezplus, bezplus, cezplus, dezplus; REAL aexbeyplus, bexaeyplus, bexceyplus, cexbeyplus; REAL cexdeyplus, dexceyplus, dexaeyplus, aexdeyplus; REAL aexceyplus, cexaeyplus, bexdeyplus, dexbeyplus; REAL det; REAL permanent, errbound; REAL ins; FPU_ROUND_DOUBLE; aex = pa[0] - pe[0]; bex = pb[0] - pe[0]; cex = pc[0] - pe[0]; dex = pd[0] - pe[0]; aey = pa[1] - pe[1]; bey = pb[1] - pe[1]; cey = pc[1] - pe[1]; dey = pd[1] - pe[1]; aez = pa[2] - pe[2]; bez = pb[2] - pe[2]; cez = pc[2] - pe[2]; dez = pd[2] - pe[2]; aexbey = aex * bey; bexaey = bex * aey; ab = aexbey - bexaey; bexcey = bex * cey; cexbey = cex * bey; bc = bexcey - cexbey; cexdey = cex * dey; dexcey = dex * cey; cd = cexdey - dexcey; dexaey = dex * aey; aexdey = aex * dey; da = dexaey - aexdey; aexcey = aex * cey; cexaey = cex * aey; ac = aexcey - cexaey; bexdey = bex * dey; dexbey = dex * bey; bd = bexdey - dexbey; abc = aez * bc - bez * ac + cez * ab; bcd = bez * cd - cez * bd + dez * bc; cda = cez * da + dez * ac + aez * cd; dab = dez * ab + aez * bd + bez * da; alift = aex * aex + aey * aey + aez * aez; blift = bex * bex + bey * bey + bez * bez; clift = cex * cex + cey * cey + cez * cez; dlift = dex * dex + dey * dey + dez * dez; det = (dlift * abc - clift * dab) + (blift * cda - alift * bcd); aezplus = Absolute(aez); bezplus = Absolute(bez); cezplus = Absolute(cez); dezplus = Absolute(dez); aexbeyplus = Absolute(aexbey); bexaeyplus = Absolute(bexaey); bexceyplus = Absolute(bexcey); cexbeyplus = Absolute(cexbey); cexdeyplus = Absolute(cexdey); dexceyplus = Absolute(dexcey); dexaeyplus = Absolute(dexaey); aexdeyplus = Absolute(aexdey); aexceyplus = Absolute(aexcey); cexaeyplus = Absolute(cexaey); bexdeyplus = Absolute(bexdey); dexbeyplus = Absolute(dexbey); permanent = ((cexdeyplus + dexceyplus) * bezplus + (dexbeyplus + bexdeyplus) * cezplus + (bexceyplus + cexbeyplus) * dezplus) * alift + ((dexaeyplus + aexdeyplus) * cezplus + (aexceyplus + cexaeyplus) * dezplus + (cexdeyplus + dexceyplus) * aezplus) * blift + ((aexbeyplus + bexaeyplus) * dezplus + (bexdeyplus + dexbeyplus) * aezplus + (dexaeyplus + aexdeyplus) * bezplus) * clift + ((bexceyplus + cexbeyplus) * aezplus + (cexaeyplus + aexceyplus) * bezplus + (aexbeyplus + bexaeyplus) * cezplus) * dlift; errbound = isperrboundA * permanent; if ((det > errbound) || (-det > errbound)) { FPU_RESTORE; return det; } ins = insphereadapt(pa, pb, pc, pd, pe, permanent); FPU_RESTORE; return ins; } asymptote-3.05/camperror.cc0000644000000000000000000000226215031566105014471 0ustar rootroot/***** * camperror.cc * 2003/02/25 Andy Hammerlindl * * Provides a way for the classes in camp to report errors in * computation elegantly. After running a method on a camp object that * could encounter an error, the program should call camp::errors to see * if any errors were encountered. *****/ #include #include #include "camperror.h" #include "vm.h" #include "errormsg.h" namespace camp { // Used internally to report an error in an operation. void reportError(const string& desc) { em.runtime(vm::getPos()); em << desc; em.sync(true); throw handled_error(); } // Used internally to report a warning in an operation. void reportWarning(const string& desc) { em.warning(vm::getPos()); em << desc; em.sync(true); } void reportFatal(const string& desc) { em.fatal(vm::getPos()); em << desc; em.sync(true); em.statusError(); try { throw quit(); } catch(handled_error const&) { } } void reportError(const ostringstream& desc) { reportError(desc.str()); } void reportWarning(const ostringstream& desc) { reportWarning(desc.str()); } void reportFatal(const ostringstream& desc) { reportFatal(desc.str()); } } // namespace camp asymptote-3.05/access.h0000644000000000000000000000562415031566105013607 0ustar rootroot/***** * access.h * Andy Hammerlindl 2003/12/03 * * Describes an "access," a representation of where a variable will be * stored at runtime, so that read, write, and call instructions can be * made. *****/ #ifndef ACCESS_H #define ACCESS_H #include #include "errormsg.h" #include "item.h" #include "vm.h" namespace vm { struct callable; } namespace trans { class frame; class coder; enum action { READ, WRITE, CALL }; // These serves as the base class for the accesses. class access : public gc { protected: // Generic compiler access error - if the compiler functions properly, // none of these should be reachable by the user. void error(position pos) { em.compiler(pos); em << "invalid use of access"; } public: virtual ~access() = 0; // Encode a read/write/call of the access when nothing is on the stack. virtual void encode(action, position pos, coder &) { error(pos); } // Encode a read/write/call of the access when the frame "top" is on top // of the stack. virtual void encode(action, position pos, coder &, frame *) { error(pos); } }; // This class represents identity conversions in casting. class identAccess : public access { virtual void encode(action act, position, coder&); }; // Represents a function that is implemented by a built-in C++ function. class bltinAccess : public access { vm::bltin f; public: bltinAccess(vm::bltin f) : f(f) {} void encode(action act, position pos, coder &e); void encode(action act, position pos, coder &e, frame *); }; // Similar to bltinAccess, but works for any callable. class callableAccess : public access { vm::callable *f; public: callableAccess(vm::callable *f) : f(f) {} void encode(action act, position pos, coder &e); void encode(action act, position pos, coder &e, frame *); }; // An access that puts a frame on the top of the stack. class frameAccess : public access { frame *f; public: frameAccess(frame *f) : f(f) {} void encode(action act, position pos, coder &e); void encode(action act, position pos, coder &e, frame *top); }; // Represents the access of a local variable. class localAccess : public access { Int offset; frame *level; public: localAccess(Int offset, frame *level) : offset(offset), level(level) {} void encode(action act, position pos, coder &e); void encode(action act, position pos, coder &e, frame *top); }; class qualifiedAccess : public access { // The location and frame of the record. access *qualifier; frame *qualifierLevel; // The location of the field relative to the record. access *field; public: qualifiedAccess(access *qualifier, frame *qualifierLevel, access *field) : qualifier(qualifier), qualifierLevel(qualifierLevel), field(field) {} void encode(action act, position pos, coder &e); void encode(action act, position pos, coder &e, frame *top); }; } // namespace trans #endif // ACCESS_H asymptote-3.05/scan-asy-tests-cmake.py0000755000000000000000000001051115031566105016475 0ustar rootroot#!/usr/bin/env python3 __doc__ = """ This file scans tests directory and generates a cmake file containing all *.asy tests, excluding wce. The resulting file is supposed to be checked in and imported by the main cmake build scripts. This script has 2 modes - list generation and verification. Verification does not write to any file, but raises an error if the file output does not match the contents of the test list cmake file (that is, could be missing a test). To run in verification mode, pass in "--verify-no-missing-tests" arguments. """ import io import os import pathlib import sys import textwrap REPO_ROOT = pathlib.Path(__file__).parent TESTS_DIR = REPO_ROOT / "tests" GENERATED_TESTS_LIST_CMAKE_FILE_PATH = ( REPO_ROOT / "cmake-scripts/generated/asy-tests-list.cmake" ) TESTS_REQUIRING_CMAKE_FEATURES = {"gsl": "ENABLE_GSL", "gc": "ENABLE_GC"} TESTS_NOT_PART_OF_CORE_CHECKS = {"gc", "gs"} TESTS_WITH_ARTIFACTS = {"gc": [".eps"], "output": ["circle.eps", "line.eps"]} EXCLUDED_TESTS = {"bench"} GENERATED_CMAKE_FILE_COMMENT_HEADER = textwrap.dedent( f""" # This file is automatically generated. Do not modify manually. # This file is checked in as part of the repo. It is not meant to be ignored. # # If more tests are added, run {pathlib.Path(__file__).name} to re-generate # the test list. """ ) def generate_tests_list_per_directory(test_dir: os.DirEntry): test_name = test_dir.name if test_name in EXCLUDED_TESTS: return "" with os.scandir(test_dir) as scanner_it: tests = sorted( entry.name[:-4] # removing .asy extension for entry in scanner_it if entry.is_file() and entry.name.endswith(".asy") ) if not tests: return "" if test_name in TESTS_WITH_ARTIFACTS: artifacts_text = f"TEST_ARTIFACTS {' '.join(TESTS_WITH_ARTIFACTS[test_name])}" else: artifacts_text = "" test_not_check_str = ( "TEST_NOT_PART_OF_CHECK_TEST true" if test_name in TESTS_NOT_PART_OF_CORE_CHECKS else "" ) with io.StringIO() as text_writer: if test_name in TESTS_REQUIRING_CMAKE_FEATURES: text_writer.write(f"if ({TESTS_REQUIRING_CMAKE_FEATURES[test_name]})\n") text_writer.write( textwrap.dedent( f""" add_asy_tests( TEST_DIR {test_name} TESTS {' '.join(tests)} {artifacts_text} {test_not_check_str} ) """ ) ) text_writer.write("\n") if test_name in TESTS_REQUIRING_CMAKE_FEATURES: text_writer.write("endif()\n") return text_writer.getvalue() def write_cmake_lists_data_to_file(test_dirs, out_file): out_file.write(GENERATED_CMAKE_FILE_COMMENT_HEADER) out_file.write("\n") for entry in test_dirs: cmake_text = generate_tests_list_per_directory(entry) out_file.write(cmake_text) out_file.write("\n") def get_test_dirs(): with os.scandir(TESTS_DIR) as scanner_it: return sorted( (entry for entry in scanner_it if entry.is_dir()), key=lambda entry: entry.name, ) def main(): # sort to make output deterministic args = sys.argv[1:] test_dirs = get_test_dirs() if "--verify-no-missing-tests" in args: with io.StringIO() as text_writer: write_cmake_lists_data_to_file(test_dirs, text_writer) expected_file_contents = text_writer.getvalue().strip() with open(GENERATED_TESTS_LIST_CMAKE_FILE_PATH, "r", encoding="utf-8") as in_f: actual_file_contents = in_f.read().strip() if expected_file_contents != actual_file_contents: print( "asy-tests-list.cmake has not been updated properly. " + "It may be missing some unit tests. " + f"\nPlease run {pathlib.Path(__file__).name} to " + "regenerate asy-tests-list.cmake." ) raise RuntimeError("File contents do not match") print("test file has no missing tests!") else: with open(GENERATED_TESTS_LIST_CMAKE_FILE_PATH, "w", encoding="utf-8") as out_f: write_cmake_lists_data_to_file(test_dirs, out_f) if __name__ == "__main__": main() asymptote-3.05/refaccess.cc0000644000000000000000000000211015031566105014425 0ustar rootroot/***** * refaccess.cc * Andy Hammerlindl 2005/11/28 * * An access which refers to a variable or other object in C++. *****/ #include "refaccess.h" namespace trans { using vm::item; using vm::stack; using vm::pop; /* itemRefAccess */ void itemPointerRead(stack *s) { item *p=pop(s); s->push(*p); } void itemPointerWrite(stack *s) { item *p=pop(s); item value=pop(s); *p=value; s->push(value); } void itemRefAccess::encode(action act, position, coder &e) { REGISTER_BLTIN(itemPointerRead, "itemPointerRead"); REGISTER_BLTIN(itemPointerWrite, "itemPointerWrite"); e.encode(inst::constpush, (item)ref); switch (act) { case READ: e.encode(inst::builtin, itemPointerRead); break; case WRITE: e.encode(inst::builtin, itemPointerWrite); break; case CALL: e.encode(inst::builtin, itemPointerRead); e.encode(inst::popcall); break; }; } void itemRefAccess::encode(action act, position pos, coder &e, frame *) { // Get rid of the useless top frame. e.encode(inst::pop); encode(act, pos, e); } } asymptote-3.05/GLTextures.h0000644000000000000000000000706215031566105014412 0ustar rootroot// // Created by jamie on 8/23/21. // #pragma once #include "common.h" #ifdef HAVE_GL #include "GL/glew.h" namespace gl { struct GLTexturesFmt { GLint minFilter=GL_LINEAR_MIPMAP_LINEAR; GLint magFilter=GL_LINEAR; GLint wrapS=GL_REPEAT; GLint wrapT=GL_REPEAT; GLint wrapR=GL_REPEAT; GLuint format=GL_RGBA; GLuint internalFmt=GL_RGBA; }; class AGLTexture { protected: AGLTexture() = default; explicit AGLTexture(int textureNumber); AGLTexture(AGLTexture const&) = delete; AGLTexture& operator=(AGLTexture const&) = delete; AGLTexture(AGLTexture&& glTex) noexcept; AGLTexture& operator=(AGLTexture&& glTex) noexcept; public: virtual ~AGLTexture(); void setActive() const; virtual void setUniform(GLint uniformNumber) const = 0; protected: GLuint textureId=0; int textureNumber=-1; }; template class GLTexture2 : public AGLTexture { public: GLTexture2() = default; GLTexture2(GLTexture2 const& glTex)=delete; GLTexture2& operator= (GLTexture2 const& glTex)=delete; GLTexture2(GLTexture2&& glTex) noexcept: AGLTexture(std::move(glTex)) { } GLTexture2& operator=(GLTexture2&& glTex) noexcept { AGLTexture::operator=(std::move(glTex)); return *this; } GLTexture2(T const* data, std::pair size, int textureNumber, GLTexturesFmt const& fmt) : AGLTexture(textureNumber) { glGenTextures(1, &textureId); glActiveTexture(GL_TEXTURE0+textureNumber); glBindTexture(GL_TEXTURE_2D, textureId); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, fmt.minFilter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, fmt.magFilter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, fmt.wrapS); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, fmt.wrapT); glTexImage2D(GL_TEXTURE_2D, 0, fmt.internalFmt, size.first, size.second, 0, fmt.format, GLDataType, data); glGenerateMipmap(GL_TEXTURE_2D); glActiveTexture(0); } void setUniform(GLint uniformNumber) const override { glActiveTexture(GL_TEXTURE0+textureNumber); glBindTexture(GL_TEXTURE_2D, textureId); glUniform1i(uniformNumber, textureNumber); glActiveTexture(0); } }; template class GLTexture3 : public AGLTexture { public: GLTexture3() = default; GLTexture3(T const* data, std::tuple size, int textureNumber, GLTexturesFmt const& fmt) : AGLTexture(textureNumber) { int width=std::get<0>(size); int height=std::get<1>(size); int depth=std::get<2>(size); glEnable(GL_TEXTURE_3D); glGenTextures(1, &textureId); glActiveTexture(GL_TEXTURE0+textureNumber); glBindTexture(GL_TEXTURE_3D, textureId); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, fmt.wrapS); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, fmt.wrapT); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, fmt.wrapR); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, fmt.minFilter); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, fmt.magFilter); glTexImage3D(GL_TEXTURE_3D, 0, fmt.internalFmt, width, height, depth, 0, fmt.format, GLDataType, data); glGenerateMipmap(GL_TEXTURE_3D); glActiveTexture(0); } void setUniform(GLint uniformNumber) const override { glActiveTexture(GL_TEXTURE0+textureNumber); glBindTexture(GL_TEXTURE_3D, textureId); glUniform1i(uniformNumber, textureNumber); glActiveTexture(0); } }; } // namespace gl #endif asymptote-3.05/drawgsave.h0000644000000000000000000000072015031566105014321 0ustar rootroot/***** * drawgsave.h * John Bowman * * Output PostScript gsave to picture. *****/ #ifndef DRAWGSAVE_H #define DRAWGSAVE_H #include "drawelement.h" namespace camp { class drawGsave : public drawElement { public: drawGsave() {} virtual ~drawGsave() {} bool draw(psfile *out) { out->gsave(); return true; } bool write(texfile *out, const bbox&) { out->gsave(); return true; } }; } GC_DECLARE_PTRFREE(camp::drawGsave); #endif asymptote-3.05/bezierpatch.cc0000644000000000000000000006203215031566105015000 0ustar rootroot/***** * bezierpatch.cc * Authors: John C. Bowman and Jesse Frohlich * * Render Bezier patches and triangles. *****/ #include "bezierpatch.h" #include "predicates.h" namespace camp { using ::orient2d; using ::orient3d; #ifdef HAVE_LIBGLM int MaterialIndex; bool colors; const double FillFactor=0.1; void BezierPatch::init(double res) { res2=res*res; if(transparent) { Epsilon=0.0; MaterialIndex=color ? -1-materialIndex : 1+materialIndex; pvertex=&vertexBuffer::tvertex; } else { Epsilon=FillFactor*res; MaterialIndex=materialIndex; pvertex=&vertexBuffer::vertex; } } void BezierPatch::render(const triple *p, bool straight, GLfloat *c0) { triple p0=p[0]; epsilon=0; for(unsigned i=1; i < 16; ++i) epsilon=max(epsilon,abs2(p[i]-p0)); epsilon *= DBL_EPSILON; triple p3=p[3]; triple p12=p[12]; triple p15=p[15]; triple n0=normal(p3,p[2],p[1],p0,p[4],p[8],p12); if(abs2(n0) <= epsilon) { n0=normal(p3,p[2],p[1],p0,p[13],p[14],p15); if(abs2(n0) <= epsilon) n0=normal(p15,p[11],p[7],p3,p[4],p[8],p12); } triple n1=normal(p0,p[4],p[8],p12,p[13],p[14],p15); if(abs2(n1) <= epsilon) { n1=normal(p0,p[4],p[8],p12,p[11],p[7],p3); if(abs2(n1) <= epsilon) n1=normal(p3,p[2],p[1],p0,p[13],p[14],p15); } triple n2=normal(p12,p[13],p[14],p15,p[11],p[7],p3); if(abs2(n2) <= epsilon) { n2=normal(p12,p[13],p[14],p15,p[2],p[1],p0); if(abs2(n2) <= epsilon) n2=normal(p0,p[4],p[8],p12,p[11],p[7],p3); } triple n3=normal(p15,p[11],p[7],p3,p[2],p[1],p0); if(abs2(n3) <= epsilon) { n3=normal(p15,p[11],p[7],p3,p[4],p[8],p12); if(abs2(n3) <= epsilon) n3=normal(p12,p[13],p[14],p15,p[2],p[1],p0); } GLuint i0,i1,i2,i3; if(color) { GLfloat *c1=c0+4; GLfloat *c2=c0+8; GLfloat *c3=c0+12; i0=data.Vertex(p0,n0,c0); i1=data.Vertex(p12,n1,c1); i2=data.Vertex(p15,n2,c2); i3=data.Vertex(p3,n3,c3); if(!straight) render(p,i0,i1,i2,i3,p0,p12,p15,p3,false,false,false,false, c0,c1,c2,c3); } else { i0=(data.*pvertex)(p0,n0); i1=(data.*pvertex)(p12,n1); i2=(data.*pvertex)(p15,n2); i3=(data.*pvertex)(p3,n3); if(!straight) render(p,i0,i1,i2,i3,p0,p12,p15,p3,false,false,false,false); } if(straight) { std::vector &q=data.indices; triple Pa[]={p0,p12,p15}; if(!offscreen(3,Pa)) { q.push_back(i0); q.push_back(i1); q.push_back(i2); } triple Pb[]={p0,p15,p3}; if(!offscreen(3,Pb)) { q.push_back(i0); q.push_back(i2); q.push_back(i3); } } append(); } // Use a uniform partition to draw a Bezier patch. // p is an array of 16 triples representing the control points. // Pi are the (possibly) adjusted vertices indexed by Ii. // The 'flati' are flatness flags for each boundary. void BezierPatch::render(const triple *p, GLuint I0, GLuint I1, GLuint I2, GLuint I3, triple P0, triple P1, triple P2, triple P3, bool flat0, bool flat1, bool flat2, bool flat3, GLfloat *C0, GLfloat *C1, GLfloat *C2, GLfloat *C3) { pair d=Distance(p); if(d.getx() < res2 && d.gety() < res2) { // Bezier patch is flat triple Pa[]={P0,P1,P2}; std::vector &q=data.indices; if(!offscreen(3,Pa)) { q.push_back(I0); q.push_back(I1); q.push_back(I2); } triple Pb[]={P0,P2,P3}; if(!offscreen(3,Pb)) { q.push_back(I0); q.push_back(I2); q.push_back(I3); } } else { // Patch is not flat if(offscreen(16,p)) return; /* Control points are indexed as follows: Coordinate +----- Index 03 13 23 33 +-----+-----+-----+ |3 |7 |11 |15 | | | | |02 |12 |22 |32 +-----+-----+-----+ |2 |6 |10 |14 | | | | |01 |11 |21 |31 +-----+-----+-----+ |1 |5 |9 |13 | | | | |00 |10 |20 |30 +-----+-----+-----+ 0 4 8 12 */ triple p0=p[0]; triple p3=p[3]; triple p12=p[12]; triple p15=p[15]; if(d.getx() < res2) { // flat in horizontal direction; split vertically /* P refers to a corner m refers to a midpoint s refers to a subpatch +--------+--------+ |P3 P2| | | | s1 | | | | | m1 +-----------------+ m0 | | | | | s0 | | | |P0 P1| +-----------------+ */ Split3 c0(p0,p[1],p[2],p3); Split3 c1(p[4],p[5],p[6],p[7]); Split3 c2(p[8],p[9],p[10],p[11]); Split3 c3(p12,p[13],p[14],p15); triple s0[]={p0 ,c0.m0,c0.m3,c0.m5, p[4],c1.m0,c1.m3,c1.m5, p[8],c2.m0,c2.m3,c2.m5, p12 ,c3.m0,c3.m3,c3.m5}; triple s1[]={c0.m5,c0.m4,c0.m2,p3, c1.m5,c1.m4,c1.m2,p[7], c2.m5,c2.m4,c2.m2,p[11], c3.m5,c3.m4,c3.m2,p15}; triple n0=normal(s0[12],s0[13],s0[14],s0[15],s0[11],s0[7],s0[3]); if(abs2(n0) <= epsilon) { n0=normal(s0[12],s0[13],s0[14],s0[15],s0[2],s0[1],s0[0]); if(abs2(n0) <= epsilon) n0=normal(s0[0],s0[4],s0[8],s0[12],s0[11],s0[7],s0[3]); } triple n1=normal(s1[3],s1[2],s1[1],s1[0],s1[4],s1[8],s1[12]); if(abs2(n1) <= epsilon) { n1=normal(s1[3],s1[2],s1[1],s1[0],s1[13],s1[14],s1[15]); if(abs2(n1) <= epsilon) n1=normal(s1[15],s1[11],s1[7],s1[3],s1[4],s1[8],s1[12]); } // A kludge to remove subdivision cracks, only applied the first time // an edge is found to be flat before the rest of the subpatch is. triple m0=0.5*(P1+P2); if(!flat1) { if((flat1=Straightness(p12,p[13],p[14],p15) < res2)) { if(Epsilon) m0 -= Epsilon*unit(differential(s1[12],s1[8],s1[4],s1[0])); } else m0=s0[15]; } triple m1=0.5*(P3+P0); if(!flat3) { if((flat3=Straightness(p0,p[1],p[2],p3) < res2)) { if(Epsilon) m1 -= Epsilon*unit(differential(s0[3],s0[7],s0[11],s0[15])); } else m1=s1[0]; } if(color) { GLfloat c0[4],c1[4]; for(size_t i=0; i < 4; ++i) { c0[i]=0.5*(C1[i]+C2[i]); c1[i]=0.5*(C3[i]+C0[i]); } GLuint i0=data.Vertex(m0,n0,c0); GLuint i1=data.Vertex(m1,n1,c1); render(s0,I0,I1,i0,i1,P0,P1,m0,m1,flat0,flat1,false,flat3,C0,C1,c0,c1); render(s1,i1,i0,I2,I3,m1,m0,P2,P3,false,flat1,flat2,flat3,c1,c0,C2,C3); } else { GLuint i0=(data.*pvertex)(m0,n0); GLuint i1=(data.*pvertex)(m1,n1); render(s0,I0,I1,i0,i1,P0,P1,m0,m1,flat0,flat1,false,flat3); render(s1,i1,i0,I2,I3,m1,m0,P2,P3,false,flat1,flat2,flat3); } return; } if(d.gety() < res2) { // flat in vertical direction; split horizontally /* P refers to a corner m refers to a midpoint s refers to a subpatch m1 +--------+--------+ |P3 | P2| | | | | | | | | | | | | | s0 | s1 | | | | | | | | | | | | | |P0 | P1| +--------+--------+ m0 */ Split3 c0(p0,p[4],p[8],p12); Split3 c1(p[1],p[5],p[9],p[13]); Split3 c2(p[2],p[6],p[10],p[14]); Split3 c3(p3,p[7],p[11],p15); triple s0[]={p0,p[1],p[2],p3, c0.m0,c1.m0,c2.m0,c3.m0, c0.m3,c1.m3,c2.m3,c3.m3, c0.m5,c1.m5,c2.m5,c3.m5}; triple s1[]={c0.m5,c1.m5,c2.m5,c3.m5, c0.m4,c1.m4,c2.m4,c3.m4, c0.m2,c1.m2,c2.m2,c3.m2, p12,p[13],p[14],p15}; triple n0=normal(s0[0],s0[4],s0[8],s0[12],s0[13],s0[14],s0[15]); if(abs2(n0) <= epsilon) { n0=normal(s0[0],s0[4],s0[8],s0[12],s0[11],s0[7],s0[3]); if(abs2(n0) <= epsilon) n0=normal(s0[3],s0[2],s0[1],s0[0],s0[13],s0[14],s0[15]); } triple n1=normal(s1[15],s1[11],s1[7],s1[3],s1[2],s1[1],s1[0]); if(abs2(n1) <= epsilon) { n1=normal(s1[15],s1[11],s1[7],s1[3],s1[4],s1[8],s1[12]); if(abs2(n1) <= epsilon) n1=normal(s1[12],s1[13],s1[14],s1[15],s1[2],s1[1],s1[0]); } // A kludge to remove subdivision cracks, only applied the first time // an edge is found to be flat before the rest of the subpatch is. triple m0=0.5*(P0+P1); if(!flat0) { if((flat0=Straightness(p0,p[4],p[8],p12) < res2)) { if(Epsilon) m0 -= Epsilon*unit(differential(s1[0],s1[1],s1[2],s1[3])); } else m0=s0[12]; } triple m1=0.5*(P2+P3); if(!flat2) { if((flat2=Straightness(p15,p[11],p[7],p3) < res2)) { if(Epsilon) m1 -= Epsilon*unit(differential(s0[15],s0[14],s0[13],s0[12])); } else m1=s1[3]; } if(color) { GLfloat c0[4],c1[4]; for(size_t i=0; i < 4; ++i) { c0[i]=0.5*(C0[i]+C1[i]); c1[i]=0.5*(C2[i]+C3[i]); } GLuint i0=data.Vertex(m0,n0,c0); GLuint i1=data.Vertex(m1,n1,c1); render(s0,I0,i0,i1,I3,P0,m0,m1,P3,flat0,false,flat2,flat3,C0,c0,c1,C3); render(s1,i0,I1,I2,i1,m0,P1,P2,m1,flat0,flat1,flat2,false,c0,C1,C2,c1); } else { GLuint i0=(data.*pvertex)(m0,n0); GLuint i1=(data.*pvertex)(m1,n1); render(s0,I0,i0,i1,I3,P0,m0,m1,P3,flat0,false,flat2,flat3); render(s1,i0,I1,I2,i1,m0,P1,P2,m1,flat0,flat1,flat2,false); } return; } /* Horizontal and vertical subdivision: P refers to a corner m refers to a midpoint s refers to a subpatch m2 +--------+--------+ |P3 | P2| | | | | s3 | s2 | | | | | | m4 | m3 +--------+--------+ m1 | | | | | | | s0 | s1 | | | | |P0 | P1| +--------+--------+ m0 */ // Subdivide patch: Split3 c0(p0,p[1],p[2],p3); Split3 c1(p[4],p[5],p[6],p[7]); Split3 c2(p[8],p[9],p[10],p[11]); Split3 c3(p12,p[13],p[14],p15); Split3 c4(p0,p[4],p[8],p12); Split3 c5(c0.m0,c1.m0,c2.m0,c3.m0); Split3 c6(c0.m3,c1.m3,c2.m3,c3.m3); Split3 c7(c0.m5,c1.m5,c2.m5,c3.m5); Split3 c8(c0.m4,c1.m4,c2.m4,c3.m4); Split3 c9(c0.m2,c1.m2,c2.m2,c3.m2); Split3 c10(p3,p[7],p[11],p15); triple s0[]={p0,c0.m0,c0.m3,c0.m5,c4.m0,c5.m0,c6.m0,c7.m0, c4.m3,c5.m3,c6.m3,c7.m3,c4.m5,c5.m5,c6.m5,c7.m5}; triple s1[]={c4.m5,c5.m5,c6.m5,c7.m5,c4.m4,c5.m4,c6.m4,c7.m4, c4.m2,c5.m2,c6.m2,c7.m2,p12,c3.m0,c3.m3,c3.m5}; triple s2[]={c7.m5,c8.m5,c9.m5,c10.m5,c7.m4,c8.m4,c9.m4,c10.m4, c7.m2,c8.m2,c9.m2,c10.m2,c3.m5,c3.m4,c3.m2,p15}; triple s3[]={c0.m5,c0.m4,c0.m2,p3,c7.m0,c8.m0,c9.m0,c10.m0, c7.m3,c8.m3,c9.m3,c10.m3,c7.m5,c8.m5,c9.m5,c10.m5}; triple m4=s0[15]; triple n0=normal(s0[0],s0[4],s0[8],s0[12],s0[13],s0[14],s0[15]); if(abs2(n0) <= epsilon) { n0=normal(s0[0],s0[4],s0[8],s0[12],s0[11],s0[7],s0[3]); if(abs2(n0) <= epsilon) n0=normal(s0[3],s0[2],s0[1],s0[0],s0[13],s0[14],s0[15]); } triple n1=normal(s1[12],s1[13],s1[14],s1[15],s1[11],s1[7],s1[3]); if(abs2(n1) <= epsilon) { n1=normal(s1[12],s1[13],s1[14],s1[15],s1[2],s1[1],s1[0]); if(abs2(n1) <= epsilon) n1=normal(s1[0],s1[4],s1[8],s1[12],s1[11],s1[7],s1[3]); } triple n2=normal(s2[15],s2[11],s2[7],s2[3],s2[2],s2[1],s2[0]); if(abs2(n2) <= epsilon) { n2=normal(s2[15],s2[11],s2[7],s2[3],s2[4],s2[8],s2[12]); if(abs2(n2) <= epsilon) n2=normal(s2[12],s2[13],s2[14],s2[15],s2[2],s2[1],s2[0]); } triple n3=normal(s3[3],s3[2],s3[1],s3[0],s3[4],s3[8],s3[12]); if(abs2(n3) <= epsilon) { n3=normal(s3[3],s3[2],s3[1],s3[0],s3[13],s3[14],s3[15]); if(abs2(n3) <= epsilon) n3=normal(s3[15],s3[11],s3[7],s3[3],s3[4],s3[8],s3[12]); } triple n4=normal(s2[3],s2[2],s2[1],m4,s2[4],s2[8],s2[12]); // A kludge to remove subdivision cracks, only applied the first time // an edge is found to be flat before the rest of the subpatch is. triple m0=0.5*(P0+P1); if(!flat0) { if((flat0=Straightness(p0,p[4],p[8],p12) < res2)) { if(Epsilon) m0 -= Epsilon*unit(differential(s1[0],s1[1],s1[2],s1[3])); } else m0=s0[12]; } triple m1=0.5*(P1+P2); if(!flat1) { if((flat1=Straightness(p12,p[13],p[14],p15) < res2)) { if(Epsilon) m1 -= Epsilon*unit(differential(s2[12],s2[8],s2[4],s2[0])); } else m1=s1[15]; } triple m2=0.5*(P2+P3); if(!flat2) { if((flat2=Straightness(p15,p[11],p[7],p3) < res2)) { if(Epsilon) m2 -= Epsilon*unit(differential(s3[15],s3[14],s3[13],s3[12])); } else m2=s2[3]; } triple m3=0.5*(P3+P0); if(!flat3) { if((flat3=Straightness(p0,p[1],p[2],p3) < res2)) { if(Epsilon) m3 -= Epsilon*unit(differential(s0[3],s0[7],s0[11],s0[15])); } else m3=s3[0]; } if(color) { GLfloat c0[4],c1[4],c2[4],c3[4],c4[4]; for(size_t i=0; i < 4; ++i) { c0[i]=0.5*(C0[i]+C1[i]); c1[i]=0.5*(C1[i]+C2[i]); c2[i]=0.5*(C2[i]+C3[i]); c3[i]=0.5*(C3[i]+C0[i]); c4[i]=0.5*(c0[i]+c2[i]); } GLuint i0=data.Vertex(m0,n0,c0); GLuint i1=data.Vertex(m1,n1,c1); GLuint i2=data.Vertex(m2,n2,c2); GLuint i3=data.Vertex(m3,n3,c3); GLuint i4=data.Vertex(m4,n4,c4); render(s0,I0,i0,i4,i3,P0,m0,m4,m3,flat0,false,false,flat3,C0,c0,c4,c3); render(s1,i0,I1,i1,i4,m0,P1,m1,m4,flat0,flat1,false,false,c0,C1,c1,c4); render(s2,i4,i1,I2,i2,m4,m1,P2,m2,false,flat1,flat2,false,c4,c1,C2,c2); render(s3,i3,i4,i2,I3,m3,m4,m2,P3,false,false,flat2,flat3,c3,c4,c2,C3); } else { GLuint i0=(data.*pvertex)(m0,n0); GLuint i1=(data.*pvertex)(m1,n1); GLuint i2=(data.*pvertex)(m2,n2); GLuint i3=(data.*pvertex)(m3,n3); GLuint i4=(data.*pvertex)(m4,n4); render(s0,I0,i0,i4,i3,P0,m0,m4,m3,flat0,false,false,flat3); render(s1,i0,I1,i1,i4,m0,P1,m1,m4,flat0,flat1,false,false); render(s2,i4,i1,I2,i2,m4,m1,P2,m2,false,flat1,flat2,false); render(s3,i3,i4,i2,I3,m3,m4,m2,P3,false,false,flat2,flat3); } } } void BezierTriangle::render(const triple *p, bool straight, GLfloat *c0) { triple p0=p[0]; epsilon=0; for(int i=1; i < 10; ++i) epsilon=max(epsilon,abs2(p[i]-p0)); epsilon *= DBL_EPSILON; triple p6=p[6]; triple p9=p[9]; triple n0=normal(p9,p[5],p[2],p0,p[1],p[3],p6); triple n1=normal(p0,p[1],p[3],p6,p[7],p[8],p9); triple n2=normal(p6,p[7],p[8],p9,p[5],p[2],p0); GLuint i0,i1,i2; if(color) { GLfloat *c1=c0+4; GLfloat *c2=c0+8; i0=data.Vertex(p0,n0,c0); i1=data.Vertex(p6,n1,c1); i2=data.Vertex(p9,n2,c2); if(!straight) render(p,i0,i1,i2,p0,p6,p9,false,false,false,c0,c1,c2); } else { i0=(data.*pvertex)(p0,n0); i1=(data.*pvertex)(p6,n1); i2=(data.*pvertex)(p9,n2); if(!straight) render(p,i0,i1,i2,p0,p6,p9,false,false,false); } if(straight) { triple P[]={p0,p6,p9}; if(!offscreen(3,P)) { std::vector &q=data.indices; q.push_back(i0); q.push_back(i1); q.push_back(i2); } } append(); } // Use a uniform partition to draw a Bezier triangle. // p is an array of 10 triples representing the control points. // Pi are the (possibly) adjusted vertices indexed by Ii. // The 'flati' are flatness flags for each boundary. void BezierTriangle::render(const triple *p, GLuint I0, GLuint I1, GLuint I2, triple P0, triple P1, triple P2, bool flat0, bool flat1, bool flat2, GLfloat *C0, GLfloat *C1, GLfloat *C2) { if(Distance(p) < res2) { // Bezier triangle is flat triple P[]={P0,P1,P2}; if(!offscreen(3,P)) { std::vector &q=data.indices; q.push_back(I0); q.push_back(I1); q.push_back(I2); } } else { // Triangle is not flat if(offscreen(10,p)) return; /* Control points are indexed as follows: Coordinate Index 030 9 /\ / \ / \ / \ / \ 021 + + 120 5 / \ 8 / \ / \ / \ / \ 012 + + + 210 2 / 111 \ 7 / 4 \ / \ / \ / \ /__________________________________\ 003 102 201 300 0 1 3 6 Subdivision: P2 030 /\ / \ / \ / \ / \ / up \ / \ / \ p1 /________________\ p0 /\ / \ / \ / \ / \ / \ / \ center / \ / \ / \ / \ / \ / left \ / right \ / \ / \ /________________V_________________\ 003 p2 300 P0 P1 */ // Subdivide triangle: triple l003=p[0]; triple p102=p[1]; triple p012=p[2]; triple p201=p[3]; triple p111=p[4]; triple p021=p[5]; triple r300=p[6]; triple p210=p[7]; triple p120=p[8]; triple u030=p[9]; triple u021=0.5*(u030+p021); triple u120=0.5*(u030+p120); triple p033=0.5*(p021+p012); triple p231=0.5*(p120+p111); triple p330=0.5*(p120+p210); triple p123=0.5*(p012+p111); triple l012=0.5*(p012+l003); triple p312=0.5*(p111+p201); triple r210=0.5*(p210+r300); triple l102=0.5*(l003+p102); triple p303=0.5*(p102+p201); triple r201=0.5*(p201+r300); triple u012=0.5*(u021+p033); triple u210=0.5*(u120+p330); triple l021=0.5*(p033+l012); triple p4xx=0.5*p231+0.25*(p111+p102); triple r120=0.5*(p330+r210); triple px4x=0.5*p123+0.25*(p111+p210); triple pxx4=0.25*(p021+p111)+0.5*p312; triple l201=0.5*(l102+p303); triple r102=0.5*(p303+r201); triple l210=0.5*(px4x+l201); // =c120 triple r012=0.5*(px4x+r102); // =c021 triple l300=0.5*(l201+r102); // =r003=c030 triple r021=0.5*(pxx4+r120); // =c012 triple u201=0.5*(u210+pxx4); // =c102 triple r030=0.5*(u210+r120); // =u300=c003 triple u102=0.5*(u012+p4xx); // =c201 triple l120=0.5*(l021+p4xx); // =c210 triple l030=0.5*(u012+l021); // =u003=c300 triple l111=0.5*(p123+l102); triple r111=0.5*(p312+r210); triple u111=0.5*(u021+p231); triple c111=0.25*(p033+p330+p303+p111); triple l[]={l003,l102,l012,l201,l111,l021,l300,l210,l120,l030}; // left triple r[]={l300,r102,r012,r201,r111,r021,r300,r210,r120,r030}; // right triple u[]={l030,u102,u012,u201,u111,u021,r030,u210,u120,u030}; // up triple c[]={r030,u201,r021,u102,c111,r012,l030,l120,l210,l300}; // center triple n0=normal(l300,r012,r021,r030,u201,u102,l030); triple n1=normal(r030,u201,u102,l030,l120,l210,l300); triple n2=normal(l030,l120,l210,l300,r012,r021,r030); // A kludge to remove subdivision cracks, only applied the first time // an edge is found to be flat before the rest of the subpatch is. triple m0=0.5*(P1+P2); if(!flat0) { if((flat0=Straightness(r300,p210,p120,u030) < res2)) { if(Epsilon) m0 -= Epsilon*unit(differential(c[0],c[2],c[5],c[9])+ differential(c[0],c[1],c[3],c[6])); } else m0=r030; } triple m1=0.5*(P2+P0); if(!flat1) { if((flat1=Straightness(l003,p012,p021,u030) < res2)) { if(Epsilon) m1 -= Epsilon*unit(differential(c[6],c[3],c[1],c[0])+ differential(c[6],c[7],c[8],c[9])); } else m1=l030; } triple m2=0.5*(P0+P1); if(!flat2) { if((flat2=Straightness(l003,p102,p201,r300) < res2)) { if(Epsilon) m2 -= Epsilon*unit(differential(c[9],c[8],c[7],c[6])+ differential(c[9],c[5],c[2],c[0])); } else m2=l300; } if(color) { GLfloat c0[4],c1[4],c2[4]; for(int i=0; i < 4; ++i) { c0[i]=0.5*(C1[i]+C2[i]); c1[i]=0.5*(C2[i]+C0[i]); c2[i]=0.5*(C0[i]+C1[i]); } GLuint i0=data.Vertex(m0,n0,c0); GLuint i1=data.Vertex(m1,n1,c1); GLuint i2=data.Vertex(m2,n2,c2); render(l,I0,i2,i1,P0,m2,m1,false,flat1,flat2,C0,c2,c1); render(r,i2,I1,i0,m2,P1,m0,flat0,false,flat2,c2,C1,c0); render(u,i1,i0,I2,m1,m0,P2,flat0,flat1,false,c1,c0,C2); render(c,i0,i1,i2,m0,m1,m2,false,false,false,c0,c1,c2); } else { GLuint i0=(data.*pvertex)(m0,n0); GLuint i1=(data.*pvertex)(m1,n1); GLuint i2=(data.*pvertex)(m2,n2); render(l,I0,i2,i1,P0,m2,m1,false,flat1,flat2); render(r,i2,I1,i0,m2,P1,m0,flat0,false,flat2); render(u,i1,i0,I2,m1,m0,P2,flat0,flat1,false); render(c,i0,i1,i2,m0,m1,m2,false,false,false); } } } std::vector zbuffer; void transform(const std::vector& b) { unsigned n=b.size(); zbuffer.resize(n); double Tz0=gl::dView[2]; double Tz1=gl::dView[6]; double Tz2=gl::dView[10]; for(unsigned i=0; i < n; ++i) { const GLfloat *v=b[i].position; zbuffer[i]=Tz0*v[0]+Tz1*v[1]+Tz2*v[2]; } } // Sort nonintersecting triangles by depth. int compare(const void *p, const void *P) { unsigned Ia=((GLuint *) p)[0]; unsigned Ib=((GLuint *) p)[1]; unsigned Ic=((GLuint *) p)[2]; unsigned IA=((GLuint *) P)[0]; unsigned IB=((GLuint *) P)[1]; unsigned IC=((GLuint *) P)[2]; return zbuffer[Ia]+zbuffer[Ib]+zbuffer[Ic] < zbuffer[IA]+zbuffer[IB]+zbuffer[IC] ? -1 : 1; } void sortTriangles() { if(!transparentData.indices.empty()) { transform(transparentData.Vertices); qsort(&transparentData.indices[0],transparentData.indices.size()/3, 3*sizeof(GLuint),compare); } } void Triangles::queue(size_t nP, const triple* P, size_t nN, const triple* N, size_t nC, const prc::RGBAColour* C, size_t nI, const uint32_t (*PP)[3], const uint32_t (*NN)[3], const uint32_t (*CC)[3], bool Transparent) { if(!nN) return; data.clear(); Onscreen=true; transparent=Transparent; notRendered(); data.Vertices.resize(nP); MaterialIndex=nC ? -1-materialIndex : 1+materialIndex; for(size_t i=0; i < nI; ++i) { const uint32_t *PI=PP[i]; uint32_t PI0=PI[0]; uint32_t PI1=PI[1]; uint32_t PI2=PI[2]; triple P0=P[PI0]; triple P1=P[PI1]; triple P2=P[PI2]; const uint32_t *NI=NN[i]; if(nC) { const uint32_t *CI=CC[i]; prc::RGBAColour C0=C[CI[0]]; prc::RGBAColour C1=C[CI[1]]; prc::RGBAColour C2=C[CI[2]]; GLfloat c0[]={(GLfloat) C0.R,(GLfloat) C0.G,(GLfloat) C0.B, (GLfloat) C0.A}; GLfloat c1[]={(GLfloat) C1.R,(GLfloat) C1.G,(GLfloat) C1.B, (GLfloat) C1.A}; GLfloat c2[]={(GLfloat) C2.R,(GLfloat) C2.G,(GLfloat) C2.B, (GLfloat) C2.A}; transparent |= c0[3]+c1[3]+c2[3] < 3.0; data.Vertices[PI0]=VertexData(P0,N[NI[0]],c0); data.Vertices[PI1]=VertexData(P1,N[NI[1]],c1); data.Vertices[PI2]=VertexData(P2,N[NI[2]],c2); } else { data.Vertices[PI0]=VertexData(P0,N[NI[0]]); data.Vertices[PI1]=VertexData(P1,N[NI[1]]); data.Vertices[PI2]=VertexData(P2,N[NI[2]]); } triple Q[]={P0,P1,P2}; std::vector &q=data.indices; if(!offscreen(3,Q)) { q.push_back(PI0); q.push_back(PI1); q.push_back(PI2); } } append(); } #endif } //namespace camp asymptote-3.05/drawlayer.h0000644000000000000000000000211015031566105014323 0ustar rootroot/***** * drawlayer.h * John Bowman * * Start a new postscript/TeX layer in picture. *****/ #ifndef DRAWLAYER_H #define DRAWLAYER_H #include "drawelement.h" namespace camp { class drawLayer : public drawElement { public: drawLayer() {} virtual ~drawLayer() {} bool islayer() {return true;} }; class drawBBox : public drawLayer { protected: bbox box; public: drawBBox() : box() {} drawBBox(const bbox& box) : box(box) {} bool islayer() {return false;} virtual ~drawBBox() {} bool write(texfile *out, const bbox& b) { out->BBox(box.empty ? b : box); return true; } }; class drawNewPage : public drawBBox { public: drawNewPage() : drawBBox() {} drawNewPage(const bbox& box) : drawBBox(box) {} virtual ~drawNewPage() {} bool islayer() {return true;} bool islabel() {return true;} bool isnewpage() {return true;} bool write(texfile *out, const bbox& b) { out->newpage(box.empty ? b : box); return true; } }; } GC_DECLARE_PTRFREE(camp::drawLayer); GC_DECLARE_PTRFREE(camp::drawBBox); GC_DECLARE_PTRFREE(camp::drawNewPage); #endif asymptote-3.05/program.cc0000644000000000000000000000630715031566105014152 0ustar rootroot/***** * program.cc * Tom Prince * * The list of instructions used by the virtual machine. *****/ #include #include "util.h" #include "callable.h" #include "program.h" namespace vm { static const char* opnames[] = { #define OPCODE(name, type) #name, #include "opcodes.h" #undef OPCODE }; static const Int numOps = (Int)(sizeof(opnames)/sizeof(char *)); static const char optypes[] = { #define OPCODE(name, type) type, #include "opcodes.h" #undef OPCODE }; #ifdef DEBUG_BLTIN mem::map bltinRegistry; void registerBltin(bltin b, string s) { bltinRegistry[b] = s; } string lookupBltin(bltin b) { return bltinRegistry[b]; } #endif ostream& operator<< (ostream& out, const item& i) { if (i.empty()) return out << "empty"; if (isdefault(i)) return out << "default"; #if COMPACT // TODO: Try to guess the type from the value. Int n = get(i); double x = get(i); void *p = get(i); if (n == BoolTruthValue) return out << "true"; if (n == BoolFalseValue) return out << "false"; if (std::abs(n) < 1000000) return out << n; if (fabs(x) < 1e30 and fabs(x) > 1e-30) return out << x; return out << ""; #else // TODO: Make a data structure mapping typeids to print functions. else if (i.type() == typeid(Int)) out << "Int, value = " << get(i); else if (i.type() == typeid(double)) out << "real, value = " << get(i); else if (i.type() == typeid(string)) out << "string, value = " << get(i); else if (i.type() == typeid(callable)) out << *(get(i)); else if (i.type() == typeid(vmFrame)) { out << "frame"; # ifdef DEBUG_FRAME { vmFrame *f = get(i); if (f) out << " " << f->getName(); else out << " "; } # endif } else out << "type " << demangle(i.type().name()); #endif return out; } void printInst(ostream& out, const program::label& code, const program::label& base) { out.width(4); out << offset(base,code) << " "; Int i = (Int)code->op; if (i < 0 || i >= numOps) { out << "<>" << i; return; } out << opnames[i]; switch (optypes[i]) { case 'n': { out << " " << get(*code); break; } case 't': { item c = code->ref; out << " " << c; break; } case 'b': { #ifdef DEBUG_BLTIN string s=lookupBltin(get(*code)); out << " " << (!s.empty() ? s : "") << " "; #endif break; } case 'o': { char f = out.fill('0'); out << " i"; out.width(4); out << offset(base,get(*code)); out.fill(f); break; } case 'l': { #ifdef DEBUG_FRAME out << " " << get(*code)->name << " "; #endif break; } default: { /* nothing else to do */ break; } }; } void print(ostream& out, program *base) { program::label code = base->begin(); bool active = true; while (active) { if (code->op == inst::ret || code->op < 0 || code->op >= numOps) active = false; printInst(out, code, base->begin()); out << '\n'; ++code; } } } // namespace vm asymptote-3.05/path.cc0000644000000000000000000010121115031566105013425 0ustar rootroot/***** * path.cc * Andy Hammerlindl 2002/06/06 * * Stores and returns information on a predefined path. * * When changing the path algorithms, also update the corresponding * three-dimensional algorithms in path3.cc. *****/ #include "path.h" #include "util.h" #include "angle.h" #include "camperror.h" #include "mathop.h" #include "predicates.h" #include "rounding.h" namespace camp { const double Fuzz2=1000.0*DBL_EPSILON; const double Fuzz=sqrt(Fuzz2); const double Fuzz4=Fuzz2*Fuzz2; const double BigFuzz=10.0*Fuzz2; const double fuzzFactor=100.0; const double third=1.0/3.0; path nullpath; const char *nopoints="nullpath has no points"; void checkEmpty(Int n) { if(n == 0) reportError(nopoints); } // Accurate computation of sqrt(1+x)-1. inline double sqrt1pxm1(double x) { return x/(sqrt(1.0+x)+1.0); } inline pair sqrt1pxm1(pair x) { return x/(Sqrt(1.0+x)+1.0); } // Solve for the real roots of the quadratic equation ax^2+bx+c=0. quadraticroots::quadraticroots(double a, double b, double c) { // Remove roots at numerical infinity. if(fabs(a) <= Fuzz2*fabs(b)+Fuzz4*fabs(c)) { if(fabs(b) > Fuzz2*fabs(c)) { distinct=quadraticroots::ONE; roots=1; t1=-c/b; } else if(c == 0.0) { distinct=quadraticroots::MANY; roots=1; t1=0.0; } else { distinct=quadraticroots::NONE; roots=0; } } else { double factor=0.5*b/a; double denom=b*factor; if(fabs(denom) <= Fuzz2*fabs(c)) { double x=-c/a; if(x >= 0.0) { distinct=quadraticroots::TWO; roots=2; t2=sqrt(x); t1=-t2; } else { distinct=quadraticroots::NONE; roots=0; } } else { double x=-2.0*c/denom; if(x > -1.0) { distinct=quadraticroots::TWO; roots=2; double r2=factor*sqrt1pxm1(x); double r1=-r2-2.0*factor; if(r1 <= r2) { t1=r1; t2=r2; } else { t1=r2; t2=r1; } } else if(x == -1.0) { distinct=quadraticroots::ONE; roots=2; t1=t2=-factor; } else { distinct=quadraticroots::NONE; roots=0; } } } } // Solve for the complex roots of the quadratic equation ax^2+bx+c=0. Quadraticroots::Quadraticroots(pair a, pair b, pair c) { if(a == 0.0) { if(b != 0.0) { roots=1; z1=-c/b; } else if(c == 0.0) { roots=1; z1=0.0; } else roots=0; } else { roots=2; pair factor=0.5*b/a; pair denom=b*factor; if(denom == 0.0) { z1=Sqrt(-c/a); z2=-z1; } else { z1=factor*sqrt1pxm1(-2.0*c/denom); z2=-z1-2.0*factor; } } } inline bool goodroot(double a, double b, double c, double t) { return goodroot(t) && quadratic(a,b,c,t) >= 0.0; } // Accurate computation of cbrt(sqrt(1+x)+1)-cbrt(sqrt(1+x)-1). inline double cbrtsqrt1pxm(double x) { double s=sqrt1pxm1(x); return 2.0/(cbrt(x+2.0*(sqrt(1.0+x)+1.0))+cbrt(x)+cbrt(s*s)); } // Taylor series of cos((atan(1.0/w)+pi)/3.0). static inline double costhetapi3(double w) { static const double c1=1.0/3.0; static const double c3=-19.0/162.0; static const double c5=425.0/5832.0; static const double c7=-16829.0/314928.0; double w2=w*w; double w3=w2*w; double w5=w3*w2; return c1*w+c3*w3+c5*w5+c7*w5*w2; } // Solve for the real roots of the cubic equation ax^3+bx^2+cx+d=0. cubicroots::cubicroots(double a, double b, double c, double d) { static const double ninth=1.0/9.0; static const double fiftyfourth=1.0/54.0; // Remove roots at numerical infinity. if(fabs(a) <= Fuzz2*(fabs(b)+fabs(c)*Fuzz2+fabs(d)*Fuzz4)) { quadraticroots q(b,c,d); roots=q.roots; if(q.roots >= 1) t1=q.t1; if(q.roots == 2) t2=q.t2; return; } // Detect roots at numerical zero. if(fabs(d) <= Fuzz2*(fabs(c)+fabs(b)*Fuzz2+fabs(a)*Fuzz4)) { quadraticroots q(a,b,c); roots=q.roots+1; t1=0; if(q.roots >= 1) t2=q.t1; if(q.roots == 2) t3=q.t2; return; } b /= a; c /= a; d /= a; double b2=b*b; double Q=3.0*c-b2; if(fabs(Q) < Fuzz2*(3.0*fabs(c)+fabs(b2))) Q=0.0; double R=(3.0*Q+b2)*b-27.0*d; if(fabs(R) < Fuzz2*((3.0*fabs(Q)+fabs(b2))*fabs(b)+27.0*fabs(d))) R=0.0; Q *= ninth; R *= fiftyfourth; double Q3=Q*Q*Q; double R2=R*R; double D=Q3+R2; double mthirdb=-b*third; if(D > 0.0) { roots=1; t1=mthirdb; if(R2 != 0.0) t1 += cbrt(R)*cbrtsqrt1pxm(Q3/R2); } else { roots=3; double v=0.0,theta; if(R2 > 0.0) { v=sqrt(-D/R2); theta=atan(v); } else theta=0.5*PI; double factor=2.0*sqrt(-Q)*(R >= 0 ? 1 : -1); t1=mthirdb+factor*cos(third*theta); t2=mthirdb-factor*cos(third*(theta-PI)); t3=mthirdb; if(R2 > 0.0) t3 -= factor*((v < 100.0) ? cos(third*(theta+PI)) : costhetapi3(1.0/v)); } } pair path::point(double t) const { checkEmpty(n); Int i = Floor(t); Int iplus; t = fmod(t,1); if (t < 0) t += 1; if (cycles) { i = imod(i,n); iplus = imod(i+1,n); } else if (i < 0) return nodes[0].point; else if (i >= n-1) return nodes[n-1].point; else iplus = i+1; double one_t = 1.0-t; pair a = nodes[i].point, b = nodes[i].post, c = nodes[iplus].pre, d = nodes[iplus].point, ab = one_t*a + t*b, bc = one_t*b + t*c, cd = one_t*c + t*d, abc = one_t*ab + t*bc, bcd = one_t*bc + t*cd, abcd = one_t*abc + t*bcd; return abcd; } pair path::precontrol(double t) const { checkEmpty(n); Int i = Floor(t); Int iplus; t = fmod(t,1); if (t < 0) t += 1; if (cycles) { i = imod(i,n); iplus = imod(i+1,n); } else if (i < 0) return nodes[0].pre; else if (i >= n-1) return nodes[n-1].pre; else iplus = i+1; double one_t = 1.0-t; pair a = nodes[i].point, b = nodes[i].post, c = nodes[iplus].pre, ab = one_t*a + t*b, bc = one_t*b + t*c, abc = one_t*ab + t*bc; return (abc == a) ? nodes[i].pre : abc; } pair path::postcontrol(double t) const { checkEmpty(n); Int i = Floor(t); Int iplus; t = fmod(t,1); if (t < 0) t += 1; if (cycles) { i = imod(i,n); iplus = imod(i+1,n); } else if (i < 0) return nodes[0].post; else if (i >= n-1) return nodes[n-1].post; else iplus = i+1; double one_t = 1.0-t; pair b = nodes[i].post, c = nodes[iplus].pre, d = nodes[iplus].point, bc = one_t*b + t*c, cd = one_t*c + t*d, bcd = one_t*bc + t*cd; return (bcd == d) ? nodes[iplus].post : bcd; } path path::reverse() const { mem::vector nodes(n); Int len=length(); for (Int i = 0, j = len; i < n; i++, j--) { nodes[i].pre = postcontrol(j); nodes[i].point = point(j); nodes[i].post = precontrol(j); nodes[i].straight = straight(j-1); } return path(nodes, n, cycles); } path path::subpath(Int a, Int b) const { if(empty()) return path(); if (a > b) { const path &rp = reverse(); Int len=length(); path result = rp.subpath(len-a, len-b); return result; } if (!cycles) { if (a < 0) { a = 0; if(b < 0) b = 0; } if (b > n-1) { b = n-1; if(a > b) a = b; } } Int sn = b-a+1; mem::vector nodes(sn); for (Int i = 0, j = a; j <= b; i++, j++) { nodes[i].pre = precontrol(j); nodes[i].point = point(j); nodes[i].post = postcontrol(j); nodes[i].straight = straight(j); } nodes[0].pre = nodes[0].point; nodes[sn-1].post = nodes[sn-1].point; return path(nodes, sn); } inline pair split(double t, const pair& x, const pair& y) { return x+(y-x)*t; } inline void splitCubic(solvedKnot sn[], double t, const solvedKnot& left_, const solvedKnot& right_) { solvedKnot &left=(sn[0]=left_), &mid=sn[1], &right=(sn[2]=right_); if(left.straight) { mid.point=split(t,left.point,right.point); pair deltaL=third*(mid.point-left.point); left.post=left.point+deltaL; mid.pre=mid.point-deltaL; pair deltaR=third*(right.point-mid.point); mid.post=mid.point+deltaR; right.pre=right.point-deltaR; mid.straight=true; } else { pair x=split(t,left.post,right.pre); // m1 left.post=split(t,left.point,left.post); // m0 right.pre=split(t,right.pre,right.point); // m2 mid.pre=split(t,left.post,x); // m3 mid.post=split(t,x,right.pre); // m4 mid.point=split(t,mid.pre,mid.post); // m5 } } path path::subpath(double a, double b) const { if(empty()) return path(); if (a > b) { const path &rp = reverse(); Int len=length(); return rp.subpath(len-a, len-b); } solvedKnot aL, aR, bL, bR; if (!cycles) { if (a < 0) { a = 0; if (b < 0) b = 0; } if (b > n-1) { b = n-1; if (a > b) a = b; } aL = nodes[(Int)floor(a)]; aR = nodes[(Int)ceil(a)]; bL = nodes[(Int)floor(b)]; bR = nodes[(Int)ceil(b)]; } else { if(run::validInt(a) && run::validInt(b)) { aL = nodes[imod((Int) floor(a),n)]; aR = nodes[imod((Int) ceil(a),n)]; bL = nodes[imod((Int) floor(b),n)]; bR = nodes[imod((Int) ceil(b),n)]; } else reportError("invalid path index"); } if (a == b) return path(point(a)); solvedKnot sn[3]; path p = subpath(Ceil(a), Floor(b)); if (a > floor(a)) { if (b < ceil(a)) { splitCubic(sn,a-floor(a),aL,aR); splitCubic(sn,(b-a)/(ceil(b)-a),sn[1],sn[2]); return path(sn[0],sn[1]); } splitCubic(sn,a-floor(a),aL,aR); p=concat(path(sn[1],sn[2]),p); } if (ceil(b) > b) { splitCubic(sn,b-floor(b),bL,bR); p=concat(p,path(sn[0],sn[1])); } return p; } // Special case of subpath for paths of length 1 used by intersect. void path::halve(path &first, path &second) const { solvedKnot sn[3]; splitCubic(sn,0.5,nodes[0],nodes[1]); first=path(sn[0],sn[1]); second=path(sn[1],sn[2]); } // Calculate the coefficients of a Bezier derivative divided by 3. static inline void derivative(pair& a, pair& b, pair& c, const pair& z0, const pair& c0, const pair& c1, const pair& z1) { a=z1-z0+3.0*(c0-c1); b=2.0*(z0+c1)-4.0*c0; c=c0-z0; } bbox path::bounds() const { if(!box.empty) return box; if (empty()) { // No bounds return bbox(); } Int len=length(); box.add(point(len)); times=bbox(len,len,len,len); for (Int i = 0; i < len; i++) { addpoint(box,i); if(straight(i)) continue; pair a,b,c; derivative(a,b,c,point(i),postcontrol(i),precontrol(i+1),point(i+1)); // Check x coordinate quadraticroots x(a.getx(),b.getx(),c.getx()); if(x.distinct != quadraticroots::NONE && goodroot(x.t1)) addpoint(box,i+x.t1); if(x.distinct == quadraticroots::TWO && goodroot(x.t2)) addpoint(box,i+x.t2); // Check y coordinate quadraticroots y(a.gety(),b.gety(),c.gety()); if(y.distinct != quadraticroots::NONE && goodroot(y.t1)) addpoint(box,i+y.t1); if(y.distinct == quadraticroots::TWO && goodroot(y.t2)) addpoint(box,i+y.t2); } return box; } bbox path::bounds(double min, double max) const { bbox box; Int len=length(); for (Int i = 0; i < len; i++) { addpoint(box,i,min,max); if(straight(i)) continue; pair a,b,c; derivative(a,b,c,point(i),postcontrol(i),precontrol(i+1),point(i+1)); // Check x coordinate quadraticroots x(a.getx(),b.getx(),c.getx()); if(x.distinct != quadraticroots::NONE && goodroot(x.t1)) addpoint(box,i+x.t1,min,max); if(x.distinct == quadraticroots::TWO && goodroot(x.t2)) addpoint(box,i+x.t2,min,max); // Check y coordinate quadraticroots y(a.gety(),b.gety(),c.gety()); if(y.distinct != quadraticroots::NONE && goodroot(y.t1)) addpoint(box,i+y.t1,min,max); if(y.distinct == quadraticroots::TWO && goodroot(y.t2)) addpoint(box,i+y.t2,min,max); } addpoint(box,len,min,max); return box; } inline void add(bbox& box, const pair& z, const pair& min, const pair& max) { box += z+min; box += z+max; } bbox path::internalbounds(const bbox& padding) const { bbox box; // Check interior nodes. Int len=length(); // Check interior segments. for (Int i = 0; i < len; i++) { if(straight(i)) continue; pair a,b,c; derivative(a,b,c,point(i),postcontrol(i),precontrol(i+1),point(i+1)); // Check x coordinate quadraticroots x(a.getx(),b.getx(),c.getx()); if(x.distinct != quadraticroots::NONE && goodroot(x.t1)) add(box,point(i+x.t1),padding.left,padding.right); if(x.distinct == quadraticroots::TWO && goodroot(x.t2)) add(box,point(i+x.t2),padding.left,padding.right); // Check y coordinate quadraticroots y(a.gety(),b.gety(),c.gety()); if(y.distinct != quadraticroots::NONE && goodroot(y.t1)) add(box,point(i+y.t1),pair(0,padding.bottom),pair(0,padding.top)); if(y.distinct == quadraticroots::TWO && goodroot(y.t2)) add(box,point(i+y.t2),pair(0,padding.bottom),pair(0,padding.top)); } return box; } // {{{ Arclength Calculations static pair a,b,c; static double ds(double t) { double dx=quadratic(a.getx(),b.getx(),c.getx(),t); double dy=quadratic(a.gety(),b.gety(),c.gety(),t); return sqrt(dx*dx+dy*dy); } // Calculates arclength of a cubic Bezier curve using adaptive Simpson // integration. double arcLength(const pair& z0, const pair& c0, const pair& c1, const pair& z1) { double integral; derivative(a,b,c,z0,c0,c1,z1); if(!simpson(integral,ds,0.0,1.0,DBL_EPSILON,1.0)) reportError("nesting capacity exceeded in computing arclength"); return integral; } double path::cubiclength(Int i, double goal) const { const pair& z0=point(i); const pair& z1=point(i+1); double L; if(straight(i)) { L=(z1-z0).length(); return (goal < 0 || goal >= L) ? L : -goal/L; } double integral=arcLength(z0,postcontrol(i),precontrol(i+1),z1); L=3.0*integral; if(goal < 0 || goal >= L) return L; double t=goal/L; goal *= third; static double dxmin=sqrt(DBL_EPSILON); if(!unsimpson(goal,ds,0.0,t,100.0*DBL_EPSILON,integral,1.0,dxmin)) reportError("nesting capacity exceeded in computing arctime"); return -t; } double path::arclength() const { if (cached_length != -1) return cached_length; double L=0.0; for (Int i = 0; i < n-1; i++) { L += cubiclength(i); } if(cycles) L += cubiclength(n-1); cached_length = L; return cached_length; } double path::arctime(double goal) const { if (cycles) { if (goal == 0 || cached_length == 0) return 0; if (goal < 0) { const path &rp = this->reverse(); double result = -rp.arctime(-goal); return result; } if (cached_length > 0 && goal >= cached_length) { Int loops = (Int)(goal / cached_length); goal -= loops*cached_length; return loops*n+arctime(goal); } } else { if (goal <= 0) return 0; if (cached_length > 0 && goal >= cached_length) return n-1; } double l,L=0; for (Int i = 0; i < n-1; i++) { l = cubiclength(i,goal); if (l < 0) return (-l+i); else { L += l; goal -= l; if (goal <= 0) return i+1; } } if (cycles) { l = cubiclength(n-1,goal); if (l < 0) return -l+n-1; if (cached_length > 0 && cached_length != L+l) { reportError("arclength != length.\n" "path::arclength(double) must have broken semantics.\n" "Please report this error."); } cached_length = L += l; goal -= l; return arctime(goal)+n; } else { cached_length = L; return length(); } } // }}} // {{{ Direction Time Calulation // Algorithm Stolen from Knuth's MetaFont inline double cubicDir(const solvedKnot& left, const solvedKnot& right, const pair& rot) { pair a,b,c; derivative(a,b,c,left.point,left.post,right.pre,right.point); a *= rot; b *= rot; c *= rot; quadraticroots ret(a.gety(),b.gety(),c.gety()); switch(ret.distinct) { case quadraticroots::MANY: case quadraticroots::ONE: { if(goodroot(a.getx(),b.getx(),c.getx(),ret.t1)) return ret.t1; } break; case quadraticroots::TWO: { if(goodroot(a.getx(),b.getx(),c.getx(),ret.t1)) return ret.t1; if(goodroot(a.getx(),b.getx(),c.getx(),ret.t2)) return ret.t2; } break; case quadraticroots::NONE: break; } return -1; } // TODO: Check that we handle corner cases. // Velocity(t) == (0,0) double path::directiontime(const pair& dir) const { if (dir == pair(0,0)) return 0; pair rot = pair(1,0)/unit(dir); double t; double pre,post; for (Int i = 0; i < n-1+cycles; ) { t = cubicDir(this->nodes[i],(cycles && i==n-1) ? nodes[0]:nodes[i+1],rot); if (t >= 0) return i+t; i++; if (cycles || i != n-1) { pair Pre = (point(i)-precontrol(i))*rot; pair Post = (postcontrol(i)-point(i))*rot; static pair zero(0.0,0.0); if(Pre != zero && Post != zero) { pre = angle(Pre); post = angle(Post); if ((pre <= 0 && post >= 0 && pre >= post - PI) || (pre >= 0 && post <= 0 && pre <= post + PI)) return i; } } } return -1; } // }}} // {{{ Path Intersection Calculations const unsigned maxdepth=DBL_MANT_DIG; const unsigned mindepth=maxdepth-16; void roots(std::vector &roots, double a, double b, double c, double d) { cubicroots r(a,b,c,d); if(r.roots >= 1) roots.push_back(r.t1); if(r.roots >= 2) roots.push_back(r.t2); if(r.roots == 3) roots.push_back(r.t3); } void roots(std::vector &r, double x0, double c0, double c1, double x1, double x) { double a=x1-x0+3.0*(c0-c1); double b=3.0*(x0+c1)-6.0*c0; double c=3.0*(c0-x0); double d=x0-x; roots(r,a,b,c,d); } // Return all intersection times of path g with the pair z. void intersections(std::vector& T, const path& g, const pair& z, double fuzz) { double fuzz2=fuzz*fuzz; Int n=g.length(); bool cycles=g.cyclic(); for(Int i=0; i < n; ++i) { // Check both directions to circumvent degeneracy. std::vector r; roots(r,g.point(i).getx(),g.postcontrol(i).getx(), g.precontrol(i+1).getx(),g.point(i+1).getx(),z.getx()); roots(r,g.point(i).gety(),g.postcontrol(i).gety(), g.precontrol(i+1).gety(),g.point(i+1).gety(),z.gety()); size_t m=r.size(); for(size_t j=0 ; j < m; ++j) { double t=r[j]; if(t >= -Fuzz2 && t <= 1.0+Fuzz2) { double s=i+t; if((g.point(s)-z).abs2() <= fuzz2) { if(cycles && s >= n-Fuzz2) s=0; T.push_back(s); } } } } } inline bool online(const pair&p, const pair& q, const pair& z, double fuzz) { if(p == q) return (z-p).abs2() <= fuzz*fuzz; return (z.getx()-p.getx())*(q.gety()-p.gety()) == (q.getx()-p.getx())*(z.gety()-p.gety()); } // Return all intersection times of path g with the (infinite) // line through p and q; if there are an infinite number of intersection points, // the returned list is guaranteed to include the endpoint times of // the intersection if endpoints=true. void lineintersections(std::vector& T, const path& g, const pair& p, const pair& q, double fuzz, bool endpoints=false) { Int n=g.length(); if(n == 0) { if(online(p,q,g.point((Int) 0),fuzz)) T.push_back(0.0); return; } bool cycles=g.cyclic(); double dx=q.getx()-p.getx(); double dy=q.gety()-p.gety(); double det=p.gety()*q.getx()-p.getx()*q.gety(); for(Int i=0; i < n; ++i) { pair z0=g.point(i); pair c0=g.postcontrol(i); pair c1=g.precontrol(i+1); pair z1=g.point(i+1); pair t3=z1-z0+3.0*(c0-c1); pair t2=3.0*(z0+c1)-6.0*c0; pair t1=3.0*(c0-z0); double a=dy*t3.getx()-dx*t3.gety(); double b=dy*t2.getx()-dx*t2.gety(); double c=dy*t1.getx()-dx*t1.gety(); double d=dy*z0.getx()-dx*z0.gety()+det; std::vector r; if(max(max(max(a*a,b*b),c*c),d*d) > Fuzz4*max(max(max(z0.abs2(),z1.abs2()),c0.abs2()),c1.abs2())) roots(r,a,b,c,d); else r.push_back(0.0); if(endpoints) { path h=g.subpath(i,i+1); intersections(r,h,p,fuzz); intersections(r,h,q,fuzz); if(online(p,q,z0,fuzz)) r.push_back(0.0); if(online(p,q,z1,fuzz)) r.push_back(1.0); } size_t m=r.size(); for(size_t j=0 ; j < m; ++j) { double t=r[j]; if(t >= -Fuzz2 && t <= 1.0+Fuzz2) { double s=i+t; if(cycles && s >= n-Fuzz2) s=0; T.push_back(s); } } } } // An optimized implementation of intersections(g,p--q); // if there are an infinite number of intersection points, the returned list is // only guaranteed to include the endpoint times of the intersection. void intersections(std::vector& S, std::vector& T, const path& g, const pair& p, const pair& q, double fuzz) { double length2=(q-p).abs2(); if(length2 == 0.0) { std::vector S1; intersections(S1,g,p,fuzz); size_t n=S1.size(); for(size_t i=0; i < n; ++i) { S.push_back(S1[i]); T.push_back(0.0); } } else { pair factor=(q-p)/length2; std::vector S1; lineintersections(S1,g,p,q,fuzz,true); size_t n=S1.size(); for(size_t i=0; i < n; ++i) { double s=S1[i]; double t=dot(g.point(s)-p,factor); if(t >= -Fuzz2 && t <= 1.0+Fuzz2) { S.push_back(s); T.push_back(t); } } } } void add(std::vector& S, double s, const path& p, double fuzz2) { pair z=p.point(s); size_t n=S.size(); for(size_t i=0; i < n; ++i) if((p.point(S[i])-z).abs2() <= fuzz2) return; S.push_back(s); } void add(std::vector& S, std::vector& T, double s, double t, const path& p, double fuzz2) { pair z=p.point(s); size_t n=S.size(); for(size_t i=0; i < n; ++i) if((p.point(S[i])-z).abs2() <= fuzz2) return; S.push_back(s); T.push_back(t); } void add(double& s, double& t, std::vector& S, std::vector& T, std::vector& S1, std::vector& T1, double pscale, double qscale, double poffset, double qoffset, const path& p, double fuzz2, bool single) { if(single) { s=s*pscale+poffset; t=t*qscale+qoffset; } else { size_t n=S1.size(); for(size_t i=0; i < n; ++i) add(S,T,pscale*S1[i]+poffset,qscale*T1[i]+qoffset,p,fuzz2); } } void add(double& s, double& t, std::vector& S, std::vector& T, std::vector& S1, std::vector& T1, const path& p, double fuzz2, bool single) { size_t n=S1.size(); if(single) { if(n > 0) { s=S1[0]; t=T1[0]; } } else { for(size_t i=0; i < n; ++i) add(S,T,S1[i],T1[i],p,fuzz2); } } void intersections(std::vector& S, path& g, const pair& p, const pair& q, double fuzz) { double fuzz2=max(fuzzFactor*fuzz*fuzz,Fuzz2); std::vector S1; lineintersections(S1,g,p,q,fuzz); size_t n=S1.size(); for(size_t i=0; i < n; ++i) add(S,S1[i],g,fuzz2); } bool intersections(double &s, double &t, std::vector& S, std::vector& T, path& p, path& q, double fuzz, bool single, bool exact, unsigned depth) { if(errorstream::interrupt) throw interrupted(); double fuzz2=max(fuzzFactor*fuzz*fuzz,Fuzz2); Int lp=p.length(); if(((lp == 1 && p.straight(0)) || lp == 0) && exact) { std::vector T1,S1; intersections(T1,S1,q,p.point((Int) 0),p.point(lp),fuzz); add(s,t,S,T,S1,T1,p,fuzz2,single); return S1.size() > 0; } Int lq=q.length(); if(((lq == 1 && q.straight(0)) || lq == 0) && exact) { std::vector S1,T1; intersections(S1,T1,p,q.point((Int) 0),q.point(lq),fuzz); add(s,t,S,T,S1,T1,p,fuzz2,single); return S1.size() > 0; } pair maxp=p.max(); pair minp=p.min(); pair maxq=q.max(); pair minq=q.min(); if(maxp.getx()+fuzz >= minq.getx() && maxp.gety()+fuzz >= minq.gety() && maxq.getx()+fuzz >= minp.getx() && maxq.gety()+fuzz >= minp.gety()) { // Overlapping bounding boxes --depth; // fuzz *= 2; // fuzz2=max(fuzzFactor*fuzz*fuzz,Fuzz2); if((maxp-minp).length()+(maxq-minq).length() <= fuzz || depth == 0) { if(single) { s=0.5; t=0.5; } else { S.push_back(0.5); T.push_back(0.5); } return true; } path p1,p2; double pscale,poffset; std::vector S1,T1; if(lp <= 1) { if(lp == 1) p.halve(p1,p2); if(lp == 0 || p1 == p || p2 == p) { intersections(T1,S1,q,p.point((Int) 0),p.point((Int) 0),fuzz); add(s,t,S,T,S1,T1,p,fuzz2,single); return S1.size() > 0; } pscale=poffset=0.5; } else { Int tp=lp/2; p1=p.subpath(0,tp); p2=p.subpath(tp,lp); poffset=tp; pscale=1.0; } path q1,q2; double qscale,qoffset; if(lq <= 1) { if(lq == 1) q.halve(q1,q2); if(lq == 0 || q1 == q || q2 == q) { intersections(S1,T1,p,q.point((Int) 0),q.point((Int) 0),fuzz); add(s,t,S,T,S1,T1,p,fuzz2,single); return S1.size() > 0; } qscale=qoffset=0.5; } else { Int tq=lq/2; q1=q.subpath(0,tq); q2=q.subpath(tq,lq); qoffset=tq; qscale=1.0; } bool Short=lp == 1 && lq == 1; static size_t maxcount=9; size_t count=0; if(intersections(s,t,S1,T1,p1,q1,fuzz,single,exact,depth)) { add(s,t,S,T,S1,T1,pscale,qscale,0.0,0.0,p,fuzz2,single); if(single || depth <= mindepth) return true; count += S1.size(); if(Short && count > maxcount) return true; } S1.clear(); T1.clear(); if(intersections(s,t,S1,T1,p1,q2,fuzz,single,exact,depth)) { add(s,t,S,T,S1,T1,pscale,qscale,0.0,qoffset,p,fuzz2,single); if(single || depth <= mindepth) return true; count += S1.size(); if(Short && count > maxcount) return true; } S1.clear(); T1.clear(); if(intersections(s,t,S1,T1,p2,q1,fuzz,single,exact,depth)) { add(s,t,S,T,S1,T1,pscale,qscale,poffset,0.0,p,fuzz2,single); if(single || depth <= mindepth) return true; count += S1.size(); if(Short && count > maxcount) return true; } S1.clear(); T1.clear(); if(intersections(s,t,S1,T1,p2,q2,fuzz,single,exact,depth)) { add(s,t,S,T,S1,T1,pscale,qscale,poffset,qoffset,p,fuzz2,single); if(single || depth <= mindepth) return true; count += S1.size(); if(Short && count > maxcount) return true; } return S.size() > 0; } return false; } // }}} ostream& operator<< (ostream& out, const path& p) { Int n = p.length(); if(n < 0) out << ""; else { for(Int i = 0; i < n; i++) { out << p.point(i); if(p.straight(i)) out << "--"; else out << ".. controls " << p.postcontrol(i) << " and " << p.precontrol(i+1) << newl << " .."; } if(p.cycles) out << "cycle"; else out << p.point(n); } return out; } path concat(const path& p1, const path& p2) { Int n1 = p1.length(), n2 = p2.length(); if (n1 == -1) return p2; if (n2 == -1) return p1; mem::vector nodes(n1+n2+1); Int i = 0; nodes[0].pre = p1.point((Int) 0); for (Int j = 0; j < n1; j++) { nodes[i].point = p1.point(j); nodes[i].straight = p1.straight(j); nodes[i].post = p1.postcontrol(j); nodes[i+1].pre = p1.precontrol(j+1); i++; } for (Int j = 0; j < n2; j++) { nodes[i].point = p2.point(j); nodes[i].straight = p2.straight(j); nodes[i].post = p2.postcontrol(j); nodes[i+1].pre = p2.precontrol(j+1); i++; } nodes[i].point = nodes[i].post = p2.point(n2); return path(nodes, i+1); } // Interface to orient2d predicate optimized for pairs. double orient2d(const pair& a, const pair& b, const pair& c) { double detleft, detright, det; double detsum, errbound; double orient; FPU_ROUND_DOUBLE; detleft = (a.getx() - c.getx()) * (b.gety() - c.gety()); detright = (a.gety() - c.gety()) * (b.getx() - c.getx()); det = detleft - detright; if (detleft > 0.0) { if (detright <= 0.0) { FPU_RESTORE; return det; } else { detsum = detleft + detright; } } else if (detleft < 0.0) { if (detright >= 0.0) { FPU_RESTORE; return det; } else { detsum = -detleft - detright; } } else { FPU_RESTORE; return det; } errbound = ccwerrboundA * detsum; if ((det >= errbound) || (-det >= errbound)) { FPU_RESTORE; return det; } double pa[]={a.getx(),a.gety()}; double pb[]={b.getx(),b.gety()}; double pc[]={c.getx(),c.gety()}; orient = orient2dadapt(pa, pb, pc, detsum); FPU_RESTORE; return orient; } // Returns true iff the point z lies in or on the bounding box // of a,b,c, and d. bool insidebbox(const pair& a, const pair& b, const pair& c, const pair& d, const pair& z) { bbox B(a); B.addnonempty(b); B.addnonempty(c); B.addnonempty(d); return B.left <= z.getx() && z.getx() <= B.right && B.bottom <= z.gety() && z.gety() <= B.top; } inline bool inrange(double x0, double x1, double x) { return (x0 <= x && x <= x1) || (x1 <= x && x <= x0); } // Return true if point z is on z0--z1; otherwise compute contribution to // winding number. bool checkstraight(const pair& z0, const pair& z1, const pair& z, Int& count) { if(z0.gety() <= z.gety() && z.gety() <= z1.gety()) { double side=orient2d(z0,z1,z); if(side == 0.0 && inrange(z0.getx(),z1.getx(),z.getx())) return true; if(z.gety() < z1.gety() && side > 0) ++count; } else if(z1.gety() <= z.gety() && z.gety() <= z0.gety()) { double side=orient2d(z0,z1,z); if(side == 0.0 && inrange(z0.getx(),z1.getx(),z.getx())) return true; if(z.gety() < z0.gety() && side < 0) --count; } return false; } // returns true if point is on curve; otherwise compute contribution to // winding number. bool checkcurve(const pair& z0, const pair& c0, const pair& c1, const pair& z1, const pair& z, Int& count, unsigned depth) { if(depth == 0) return true; --depth; if(insidebbox(z0,c0,c1,z1,z)) { const pair m0=0.5*(z0+c0); const pair m1=0.5*(c0+c1); const pair m2=0.5*(c1+z1); const pair m3=0.5*(m0+m1); const pair m4=0.5*(m1+m2); const pair m5=0.5*(m3+m4); if(checkcurve(z0,m0,m3,m5,z,count,depth) || checkcurve(m5,m4,m2,z1,z,count,depth)) return true; } else if(checkstraight(z0,z1,z,count)) return true; return false; } // Return the winding number of the region bounded by the (cyclic) path // relative to the point z, or the largest odd integer if the point lies on // the path. Int path::windingnumber(const pair& z) const { static const Int undefined=Int_MAX % 2 ? Int_MAX : Int_MAX-1; if(!cycles) reportError("path is not cyclic"); bbox b=bounds(); if(z.getx() < b.left || z.getx() > b.right || z.gety() < b.bottom || z.gety() > b.top) return 0; Int count=0; for(Int i=0; i < n; ++i) if(straight(i)) { if(checkstraight(point(i),point(i+1),z,count)) return undefined; } else if(checkcurve(point(i),postcontrol(i),precontrol(i+1),point(i+1),z,count, maxdepth)) return undefined; return count; } path path::transformed(const transform& t) const { mem::vector nodes(n); for (Int i = 0; i < n; ++i) { nodes[i].pre = t * this->nodes[i].pre; nodes[i].point = t * this->nodes[i].point; nodes[i].post = t * this->nodes[i].post; nodes[i].straight = this->nodes[i].straight; } path p(nodes, n, cyclic()); return p; } path transformed(const transform& t, const path& p) { Int n = p.size(); mem::vector nodes(n); for (Int i = 0; i < n; ++i) { nodes[i].pre = t * p.precontrol(i); nodes[i].point = t * p.point(i); nodes[i].post = t * p.postcontrol(i); nodes[i].straight = p.straight(i); } return path(nodes, n, p.cyclic()); } path nurb(pair z0, pair z1, pair z2, pair z3, double w0, double w1, double w2, double w3, Int m) { mem::vector nodes(m+1); if(m < 1) reportError("invalid sampling interval"); double step=1.0/m; for(Int i=0; i <= m; ++i) { double t=i*step; double t2=t*t; double onemt=1.0-t; double onemt2=onemt*onemt; double W0=w0*onemt2*onemt; double W1=w1*3.0*t*onemt2; double W2=w2*3.0*t2*onemt; double W3=w3*t2*t; nodes[i].point=(W0*z0+W1*z1+W2*z2+W3*z3)/(W0+W1+W2+W3); } static const double twothirds=2.0/3.0; pair z=nodes[0].point; nodes[0].pre=z; nodes[0].post=twothirds*z+third*nodes[1].point; for(int i=1; i < m; ++i) { pair z0=nodes[i].point; pair zm=nodes[i-1].point; pair zp=nodes[i+1].point; pair pre=twothirds*z0+third*zm; pair pos=twothirds*z0+third*zp; pair dir=unit(pos-pre); nodes[i].pre=z0-length(z0-pre)*dir; nodes[i].post=z0+length(pos-z0)*dir; } z=nodes[m].point; nodes[m].pre=twothirds*z+third*nodes[m-1].point; nodes[m].post=z; return path(nodes,m+1); } } //namespace camp asymptote-3.05/drawlabel.h0000644000000000000000000000412615031566105014277 0ustar rootroot/***** * drawlabel.h * John Bowman 2003/03/14 * * Add a label to a picture. *****/ #ifndef DRAWLABEL_H #define DRAWLABEL_H #include "drawelement.h" #include "path.h" #include "angle.h" #include "transform.h" namespace camp { class drawLabel : public virtual drawElement { protected: string label,size; transform T; // A linear (shiftless) transformation. pair position; pair align; pair scale; pen pentype; double width,height,depth; bool havebounds; bool suppress; pair Align; pair texAlign; bbox Box; bool enabled; public: drawLabel(string label, string size, transform T, pair position, pair align, pen pentype, const string& key="") : drawElement(key), label(label), size(size), T(shiftless(T)), position(position), align(align), pentype(pentype), width(0.0), height(0.0), depth(0.0), havebounds(false), suppress(false), enabled(false) {} virtual ~drawLabel() {} void getbounds(iopipestream& tex, const string& texengine); void checkbounds(); void bounds(bbox& b, iopipestream&, boxvector&, bboxlist&); bool islabel() { return true; } bool write(texfile *out, const bbox&); drawElement *transformed(const transform& t); void labelwarning(const char *action); }; class drawLabelPath : public drawLabel, public drawPathPenBase { private: string justify; pair shift; public: drawLabelPath(string label, string size, path src, string justify, pair shift, pen pentype, const string& key="") : drawLabel(label,size,identity,pair(0.0,0.0),pair(0.0,0.0),pentype,key), drawPathPenBase(src,pentype), justify(justify), shift(shift) {} virtual ~drawLabelPath() {} bool svg() {return true;} bool svgpng() {return true;} void bounds(bbox& b, iopipestream& tex, boxvector&, bboxlist&); bool write(texfile *out, const bbox&); drawElement *transformed(const transform& t); }; void setpen(iopipestream& tex, const string& texengine, const pen& pentype); void texbounds(double& width, double& height, double& depth, iopipestream& tex, string& s); } #endif asymptote-3.05/asyparser.h0000644000000000000000000000215515031566105014353 0ustar rootroot/***** * asyparser.h * Tom Prince 2004/01/10 * *****/ #pragma once #include "common.h" #include "absyn.h" namespace parser { // Opens and parses the file returning the abstract syntax tree. // If there is an unrecoverable parse error, returns null. absyntax::file *parseFile(const string& filename, const char *nameOfAction); // Opens and parses the URL returning the abstract syntax tree. // If there is an unrecoverable parse error, returns null. absyntax::file *parseURL(const string& filename, const char *nameOfAction); // Parses string and returns the abstract syntax tree. Any error in lexing or // parsing will be reported and a handled_error thrown. If the string is // "extendable", then a parse error simply due to running out of input will not // throw an exception, but will return null. absyntax::file *parseString(const string& code, const string& filename, bool extendable=false); bool isURL(const string& filename); bool readURL(stringstream& buf, const string& filename); } // namespace parser asymptote-3.05/gl-matrix-2.4.0-pruned/0000755000000000000000000000000015031566646016036 5ustar rootrootasymptote-3.05/gl-matrix-2.4.0-pruned/dist/0000755000000000000000000000000015031566646017001 5ustar rootrootasymptote-3.05/gl-matrix-2.4.0-pruned/dist/gl-matrix.js0000644000000000000000000022600115031566646021244 0ustar rootroot/** * @fileoverview gl-matrix - High performance matrix and vector operations * @author Brandon Jones * @author Colin MacKenzie IV * @version 2.4.0 */ /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else { var a = factory(); for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; } })(typeof self !== 'undefined' ? self : this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 1); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.setMatrixArrayType = setMatrixArrayType; exports.toRadian = toRadian; exports.equals = equals; /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * Common utilities * @module glMatrix */ // Configuration Constants var EPSILON = exports.EPSILON = 0.000001; var ARRAY_TYPE = exports.ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array; var RANDOM = exports.RANDOM = Math.random; /** * Sets the type of array used when creating new vectors and matrices * * @param {Type} type Array type, such as Float32Array or Array */ function setMatrixArrayType(type) { exports.ARRAY_TYPE = ARRAY_TYPE = type; } var degree = Math.PI / 180; /** * Convert Degree To Radian * * @param {Number} a Angle in Degrees */ function toRadian(a) { return a * degree; } /** * Tests whether or not the arguments have approximately the same value, within an absolute * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less * than or equal to 1.0, and a relative tolerance is used for larger values) * * @param {Number} a The first number to test. * @param {Number} b The second number to test. * @returns {Boolean} True if the numbers are approximately equal, false otherwise. */ function equals(a, b) { return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b)); } /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.mat4 = exports.mat3 = undefined; var _mat = __webpack_require__(2); var mat3 = _interopRequireWildcard(_mat); var _mat2 = __webpack_require__(3); var mat4 = _interopRequireWildcard(_mat2); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } /** * @fileoverview gl-matrix - High performance matrix and vector operations * @author Brandon Jones * @author Colin MacKenzie IV * @version 2.4.0 */ /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // END HEADER exports.mat3 = mat3; exports.mat4 = mat4; /***/ }), /* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.create = create; exports.fromMat4 = fromMat4; exports.invert = invert; var _common = __webpack_require__(0); var glMatrix = _interopRequireWildcard(_common); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } /** * 3x3 Matrix * @module mat3 */ /** * Creates a new identity mat3 * * @returns {mat3} a new 3x3 matrix */ function create() { var out = new glMatrix.ARRAY_TYPE(9); out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 1; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } /** * Copies the upper-left 3x3 values into the given mat3. * * @param {mat3} out the receiving 3x3 matrix * @param {mat4} a the source 4x4 matrix * @returns {mat3} out */ /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function fromMat4(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[4]; out[4] = a[5]; out[5] = a[6]; out[6] = a[8]; out[7] = a[9]; out[8] = a[10]; return out; } /** * Creates a new mat3 initialized with values from an existing matrix * * @param {mat3} a matrix to clone * @returns {mat3} a new 3x3 matrix */ function clone(a) { var out = new glMatrix.ARRAY_TYPE(9); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out; } /** * Copy the values from one mat3 to another * * @param {mat3} out the receiving matrix * @param {mat3} a the source matrix * @returns {mat3} out */ function copy(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out; } /** * Create a new mat3 with the given values * * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m02 Component in column 0, row 2 position (index 2) * @param {Number} m10 Component in column 1, row 0 position (index 3) * @param {Number} m11 Component in column 1, row 1 position (index 4) * @param {Number} m12 Component in column 1, row 2 position (index 5) * @param {Number} m20 Component in column 2, row 0 position (index 6) * @param {Number} m21 Component in column 2, row 1 position (index 7) * @param {Number} m22 Component in column 2, row 2 position (index 8) * @returns {mat3} A new mat3 */ function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) { var out = new glMatrix.ARRAY_TYPE(9); out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m10; out[4] = m11; out[5] = m12; out[6] = m20; out[7] = m21; out[8] = m22; return out; } /** * Set the components of a mat3 to the given values * * @param {mat3} out the receiving matrix * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m02 Component in column 0, row 2 position (index 2) * @param {Number} m10 Component in column 1, row 0 position (index 3) * @param {Number} m11 Component in column 1, row 1 position (index 4) * @param {Number} m12 Component in column 1, row 2 position (index 5) * @param {Number} m20 Component in column 2, row 0 position (index 6) * @param {Number} m21 Component in column 2, row 1 position (index 7) * @param {Number} m22 Component in column 2, row 2 position (index 8) * @returns {mat3} out */ function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) { out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m10; out[4] = m11; out[5] = m12; out[6] = m20; out[7] = m21; out[8] = m22; return out; } /** * Set a mat3 to the identity matrix * * @param {mat3} out the receiving matrix * @returns {mat3} out */ function identity(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 1; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } /** * Transpose the values of a mat3 * * @param {mat3} out the receiving matrix * @param {mat3} a the source matrix * @returns {mat3} out */ function transpose(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache some values if (out === a) { var a01 = a[1], a02 = a[2], a12 = a[5]; out[1] = a[3]; out[2] = a[6]; out[3] = a01; out[5] = a[7]; out[6] = a02; out[7] = a12; } else { out[0] = a[0]; out[1] = a[3]; out[2] = a[6]; out[3] = a[1]; out[4] = a[4]; out[5] = a[7]; out[6] = a[2]; out[7] = a[5]; out[8] = a[8]; } return out; } /** * Inverts a mat3 * * @param {mat3} out the receiving matrix * @param {mat3} a the source matrix * @returns {mat3} out */ function invert(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; var b01 = a22 * a11 - a12 * a21; var b11 = -a22 * a10 + a12 * a20; var b21 = a21 * a10 - a11 * a20; // Calculate the determinant var det = a00 * b01 + a01 * b11 + a02 * b21; if (!det) { return null; } det = 1.0 / det; out[0] = b01 * det; out[1] = (-a22 * a01 + a02 * a21) * det; out[2] = (a12 * a01 - a02 * a11) * det; out[3] = b11 * det; out[4] = (a22 * a00 - a02 * a20) * det; out[5] = (-a12 * a00 + a02 * a10) * det; out[6] = b21 * det; out[7] = (-a21 * a00 + a01 * a20) * det; out[8] = (a11 * a00 - a01 * a10) * det; return out; } /** * Calculates the adjugate of a mat3 * * @param {mat3} out the receiving matrix * @param {mat3} a the source matrix * @returns {mat3} out */ function adjoint(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; out[0] = a11 * a22 - a12 * a21; out[1] = a02 * a21 - a01 * a22; out[2] = a01 * a12 - a02 * a11; out[3] = a12 * a20 - a10 * a22; out[4] = a00 * a22 - a02 * a20; out[5] = a02 * a10 - a00 * a12; out[6] = a10 * a21 - a11 * a20; out[7] = a01 * a20 - a00 * a21; out[8] = a00 * a11 - a01 * a10; return out; } /** * Calculates the determinant of a mat3 * * @param {mat3} a the source matrix * @returns {Number} determinant of a */ function determinant(a) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20); } /** * Multiplies two mat3's * * @param {mat3} out the receiving matrix * @param {mat3} a the first operand * @param {mat3} b the second operand * @returns {mat3} out */ function multiply(out, a, b) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; var b00 = b[0], b01 = b[1], b02 = b[2]; var b10 = b[3], b11 = b[4], b12 = b[5]; var b20 = b[6], b21 = b[7], b22 = b[8]; out[0] = b00 * a00 + b01 * a10 + b02 * a20; out[1] = b00 * a01 + b01 * a11 + b02 * a21; out[2] = b00 * a02 + b01 * a12 + b02 * a22; out[3] = b10 * a00 + b11 * a10 + b12 * a20; out[4] = b10 * a01 + b11 * a11 + b12 * a21; out[5] = b10 * a02 + b11 * a12 + b12 * a22; out[6] = b20 * a00 + b21 * a10 + b22 * a20; out[7] = b20 * a01 + b21 * a11 + b22 * a21; out[8] = b20 * a02 + b21 * a12 + b22 * a22; return out; } /** * Translate a mat3 by the given vector * * @param {mat3} out the receiving matrix * @param {mat3} a the matrix to translate * @param {vec2} v vector to translate by * @returns {mat3} out */ function translate(out, a, v) { var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], x = v[0], y = v[1]; out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a10; out[4] = a11; out[5] = a12; out[6] = x * a00 + y * a10 + a20; out[7] = x * a01 + y * a11 + a21; out[8] = x * a02 + y * a12 + a22; return out; } /** * Rotates a mat3 by the given angle * * @param {mat3} out the receiving matrix * @param {mat3} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat3} out */ function rotate(out, a, rad) { var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], s = Math.sin(rad), c = Math.cos(rad); out[0] = c * a00 + s * a10; out[1] = c * a01 + s * a11; out[2] = c * a02 + s * a12; out[3] = c * a10 - s * a00; out[4] = c * a11 - s * a01; out[5] = c * a12 - s * a02; out[6] = a20; out[7] = a21; out[8] = a22; return out; }; /** * Scales the mat3 by the dimensions in the given vec2 * * @param {mat3} out the receiving matrix * @param {mat3} a the matrix to rotate * @param {vec2} v the vec2 to scale the matrix by * @returns {mat3} out **/ function scale(out, a, v) { var x = v[0], y = v[1]; out[0] = x * a[0]; out[1] = x * a[1]; out[2] = x * a[2]; out[3] = y * a[3]; out[4] = y * a[4]; out[5] = y * a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out; } /** * Creates a matrix from a vector translation * This is equivalent to (but much faster than): * * mat3.identity(dest); * mat3.translate(dest, dest, vec); * * @param {mat3} out mat3 receiving operation result * @param {vec2} v Translation vector * @returns {mat3} out */ function fromTranslation(out, v) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 1; out[5] = 0; out[6] = v[0]; out[7] = v[1]; out[8] = 1; return out; } /** * Creates a matrix from a given angle * This is equivalent to (but much faster than): * * mat3.identity(dest); * mat3.rotate(dest, dest, rad); * * @param {mat3} out mat3 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat3} out */ function fromRotation(out, rad) { var s = Math.sin(rad), c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = 0; out[3] = -s; out[4] = c; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } /** * Creates a matrix from a vector scaling * This is equivalent to (but much faster than): * * mat3.identity(dest); * mat3.scale(dest, dest, vec); * * @param {mat3} out mat3 receiving operation result * @param {vec2} v Scaling vector * @returns {mat3} out */ function fromScaling(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = v[1]; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } /** * Copies the values from a mat2d into a mat3 * * @param {mat3} out the receiving matrix * @param {mat2d} a the matrix to copy * @returns {mat3} out **/ function fromMat2d(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = 0; out[3] = a[2]; out[4] = a[3]; out[5] = 0; out[6] = a[4]; out[7] = a[5]; out[8] = 1; return out; } /** * Calculates a 3x3 matrix from the given quaternion * * @param {mat3} out mat3 receiving operation result * @param {quat} q Quaternion to create matrix from * * @returns {mat3} out */ function fromQuat(out, q) { var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var yx = y * x2; var yy = y * y2; var zx = z * x2; var zy = z * y2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - yy - zz; out[3] = yx - wz; out[6] = zx + wy; out[1] = yx + wz; out[4] = 1 - xx - zz; out[7] = zy - wx; out[2] = zx - wy; out[5] = zy + wx; out[8] = 1 - xx - yy; return out; } /** * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix * * @param {mat3} out mat3 receiving operation result * @param {mat4} a Mat4 to derive the normal matrix from * * @returns {mat3} out */ function normalFromMat4(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; // Calculate the determinant var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; if (!det) { return null; } det = 1.0 / det; out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det; out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det; out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det; out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det; out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det; out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det; out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det; out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det; return out; } /** * Generates a 2D projection matrix with the given bounds * * @param {mat3} out mat3 frustum matrix will be written into * @param {number} width Width of your gl context * @param {number} height Height of gl context * @returns {mat3} out */ function projection(out, width, height) { out[0] = 2 / width; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = -2 / height; out[5] = 0; out[6] = -1; out[7] = 1; out[8] = 1; return out; } /** * Returns a string representation of a mat3 * * @param {mat3} a matrix to represent as a string * @returns {String} string representation of the matrix */ function str(a) { return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + a[8] + ')'; } /** * Returns Frobenius norm of a mat3 * * @param {mat3} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ function frob(a) { return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2)); } /** * Adds two mat3's * * @param {mat3} out the receiving matrix * @param {mat3} a the first operand * @param {mat3} b the second operand * @returns {mat3} out */ function add(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; out[6] = a[6] + b[6]; out[7] = a[7] + b[7]; out[8] = a[8] + b[8]; return out; } /** * Subtracts matrix b from matrix a * * @param {mat3} out the receiving matrix * @param {mat3} a the first operand * @param {mat3} b the second operand * @returns {mat3} out */ function subtract(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; out[4] = a[4] - b[4]; out[5] = a[5] - b[5]; out[6] = a[6] - b[6]; out[7] = a[7] - b[7]; out[8] = a[8] - b[8]; return out; } /** * Multiply each element of the matrix by a scalar. * * @param {mat3} out the receiving matrix * @param {mat3} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat3} out */ function multiplyScalar(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; out[6] = a[6] * b; out[7] = a[7] * b; out[8] = a[8] * b; return out; } /** * Adds two mat3's after multiplying each element of the second operand by a scalar value. * * @param {mat3} out the receiving vector * @param {mat3} a the first operand * @param {mat3} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat3} out */ function multiplyScalarAndAdd(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; out[4] = a[4] + b[4] * scale; out[5] = a[5] + b[5] * scale; out[6] = a[6] + b[6] * scale; out[7] = a[7] + b[7] * scale; out[8] = a[8] + b[8] * scale; return out; } /** * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) * * @param {mat3} a The first matrix. * @param {mat3} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function exactEquals(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8]; } /** * Returns whether or not the matrices have approximately the same elements in the same position. * * @param {mat3} a The first matrix. * @param {mat3} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], a8 = a[8]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8]; return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)); } /** * Alias for {@link mat3.multiply} * @function */ var mul = multiply; /** * Alias for {@link mat3.subtract} * @function */ var sub = subtract; /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.create = create; exports.identity = identity; exports.invert = invert; exports.multiply = multiply; exports.translate = translate; exports.rotate = rotate; exports.fromTranslation = fromTranslation; exports.fromRotation = fromRotation; exports.frustum = frustum; exports.ortho = ortho; var _common = __webpack_require__(0); var glMatrix = _interopRequireWildcard(_common); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } /** * 4x4 Matrix * @module mat4 */ /** * Creates a new identity mat4 * * @returns {mat4} a new 4x4 matrix */ function create() { var out = new glMatrix.ARRAY_TYPE(16); out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a new mat4 initialized with values from an existing matrix * * @param {mat4} a matrix to clone * @returns {mat4} a new 4x4 matrix */ /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function clone(a) { var out = new glMatrix.ARRAY_TYPE(16); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out; } /** * Copy the values from one mat4 to another * * @param {mat4} out the receiving matrix * @param {mat4} a the source matrix * @returns {mat4} out */ function copy(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out; } /** * Create a new mat4 with the given values * * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m02 Component in column 0, row 2 position (index 2) * @param {Number} m03 Component in column 0, row 3 position (index 3) * @param {Number} m10 Component in column 1, row 0 position (index 4) * @param {Number} m11 Component in column 1, row 1 position (index 5) * @param {Number} m12 Component in column 1, row 2 position (index 6) * @param {Number} m13 Component in column 1, row 3 position (index 7) * @param {Number} m20 Component in column 2, row 0 position (index 8) * @param {Number} m21 Component in column 2, row 1 position (index 9) * @param {Number} m22 Component in column 2, row 2 position (index 10) * @param {Number} m23 Component in column 2, row 3 position (index 11) * @param {Number} m30 Component in column 3, row 0 position (index 12) * @param {Number} m31 Component in column 3, row 1 position (index 13) * @param {Number} m32 Component in column 3, row 2 position (index 14) * @param {Number} m33 Component in column 3, row 3 position (index 15) * @returns {mat4} A new mat4 */ function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { var out = new glMatrix.ARRAY_TYPE(16); out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m03; out[4] = m10; out[5] = m11; out[6] = m12; out[7] = m13; out[8] = m20; out[9] = m21; out[10] = m22; out[11] = m23; out[12] = m30; out[13] = m31; out[14] = m32; out[15] = m33; return out; } /** * Set the components of a mat4 to the given values * * @param {mat4} out the receiving matrix * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m02 Component in column 0, row 2 position (index 2) * @param {Number} m03 Component in column 0, row 3 position (index 3) * @param {Number} m10 Component in column 1, row 0 position (index 4) * @param {Number} m11 Component in column 1, row 1 position (index 5) * @param {Number} m12 Component in column 1, row 2 position (index 6) * @param {Number} m13 Component in column 1, row 3 position (index 7) * @param {Number} m20 Component in column 2, row 0 position (index 8) * @param {Number} m21 Component in column 2, row 1 position (index 9) * @param {Number} m22 Component in column 2, row 2 position (index 10) * @param {Number} m23 Component in column 2, row 3 position (index 11) * @param {Number} m30 Component in column 3, row 0 position (index 12) * @param {Number} m31 Component in column 3, row 1 position (index 13) * @param {Number} m32 Component in column 3, row 2 position (index 14) * @param {Number} m33 Component in column 3, row 3 position (index 15) * @returns {mat4} out */ function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m03; out[4] = m10; out[5] = m11; out[6] = m12; out[7] = m13; out[8] = m20; out[9] = m21; out[10] = m22; out[11] = m23; out[12] = m30; out[13] = m31; out[14] = m32; out[15] = m33; return out; } /** * Set a mat4 to the identity matrix * * @param {mat4} out the receiving matrix * @returns {mat4} out */ function identity(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Transpose the values of a mat4 * * @param {mat4} out the receiving matrix * @param {mat4} a the source matrix * @returns {mat4} out */ function transpose(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache some values if (out === a) { var a01 = a[1], a02 = a[2], a03 = a[3]; var a12 = a[6], a13 = a[7]; var a23 = a[11]; out[1] = a[4]; out[2] = a[8]; out[3] = a[12]; out[4] = a01; out[6] = a[9]; out[7] = a[13]; out[8] = a02; out[9] = a12; out[11] = a[14]; out[12] = a03; out[13] = a13; out[14] = a23; } else { out[0] = a[0]; out[1] = a[4]; out[2] = a[8]; out[3] = a[12]; out[4] = a[1]; out[5] = a[5]; out[6] = a[9]; out[7] = a[13]; out[8] = a[2]; out[9] = a[6]; out[10] = a[10]; out[11] = a[14]; out[12] = a[3]; out[13] = a[7]; out[14] = a[11]; out[15] = a[15]; } return out; } /** * Inverts a mat4 * * @param {mat4} out the receiving matrix * @param {mat4} a the source matrix * @returns {mat4} out */ function invert(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; // Calculate the determinant var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; if (!det) { return null; } det = 1.0 / det; out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; return out; } /** * Calculates the adjugate of a mat4 * * @param {mat4} out the receiving matrix * @param {mat4} a the source matrix * @returns {mat4} out */ function adjoint(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22); out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22)); out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12); out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12)); out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22)); out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22); out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12)); out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12); out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21); out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21)); out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11); out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11)); out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21)); out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21); out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11)); out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11); return out; } /** * Calculates the determinant of a mat4 * * @param {mat4} a the source matrix * @returns {Number} determinant of a */ function determinant(a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; // Calculate the determinant return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; } /** * Multiplies two mat4s * * @param {mat4} out the receiving matrix * @param {mat4} a the first operand * @param {mat4} b the second operand * @returns {mat4} out */ function multiply(out, a, b) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; // Cache only the current line of the second matrix var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[4];b1 = b[5];b2 = b[6];b3 = b[7]; out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[8];b1 = b[9];b2 = b[10];b3 = b[11]; out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[12];b1 = b[13];b2 = b[14];b3 = b[15]; out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; return out; } /** * Translate a mat4 by the given vector * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to translate * @param {vec3} v vector to translate by * @returns {mat4} out */ function translate(out, a, v) { var x = v[0], y = v[1], z = v[2]; var a00 = void 0, a01 = void 0, a02 = void 0, a03 = void 0; var a10 = void 0, a11 = void 0, a12 = void 0, a13 = void 0; var a20 = void 0, a21 = void 0, a22 = void 0, a23 = void 0; if (a === out) { out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; } else { a00 = a[0];a01 = a[1];a02 = a[2];a03 = a[3]; a10 = a[4];a11 = a[5];a12 = a[6];a13 = a[7]; a20 = a[8];a21 = a[9];a22 = a[10];a23 = a[11]; out[0] = a00;out[1] = a01;out[2] = a02;out[3] = a03; out[4] = a10;out[5] = a11;out[6] = a12;out[7] = a13; out[8] = a20;out[9] = a21;out[10] = a22;out[11] = a23; out[12] = a00 * x + a10 * y + a20 * z + a[12]; out[13] = a01 * x + a11 * y + a21 * z + a[13]; out[14] = a02 * x + a12 * y + a22 * z + a[14]; out[15] = a03 * x + a13 * y + a23 * z + a[15]; } return out; } /** * Scales the mat4 by the dimensions in the given vec3 not using vectorization * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to scale * @param {vec3} v the vec3 to scale the matrix by * @returns {mat4} out **/ function scale(out, a, v) { var x = v[0], y = v[1], z = v[2]; out[0] = a[0] * x; out[1] = a[1] * x; out[2] = a[2] * x; out[3] = a[3] * x; out[4] = a[4] * y; out[5] = a[5] * y; out[6] = a[6] * y; out[7] = a[7] * y; out[8] = a[8] * z; out[9] = a[9] * z; out[10] = a[10] * z; out[11] = a[11] * z; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out; } /** * Rotates a mat4 by the given angle around the given axis * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @param {vec3} axis the axis to rotate around * @returns {mat4} out */ function rotate(out, a, rad, axis) { var x = axis[0], y = axis[1], z = axis[2]; var len = Math.sqrt(x * x + y * y + z * z); var s = void 0, c = void 0, t = void 0; var a00 = void 0, a01 = void 0, a02 = void 0, a03 = void 0; var a10 = void 0, a11 = void 0, a12 = void 0, a13 = void 0; var a20 = void 0, a21 = void 0, a22 = void 0, a23 = void 0; var b00 = void 0, b01 = void 0, b02 = void 0; var b10 = void 0, b11 = void 0, b12 = void 0; var b20 = void 0, b21 = void 0, b22 = void 0; if (Math.abs(len) < glMatrix.EPSILON) { return null; } len = 1 / len; x *= len; y *= len; z *= len; s = Math.sin(rad); c = Math.cos(rad); t = 1 - c; a00 = a[0];a01 = a[1];a02 = a[2];a03 = a[3]; a10 = a[4];a11 = a[5];a12 = a[6];a13 = a[7]; a20 = a[8];a21 = a[9];a22 = a[10];a23 = a[11]; // Construct the elements of the rotation matrix b00 = x * x * t + c;b01 = y * x * t + z * s;b02 = z * x * t - y * s; b10 = x * y * t - z * s;b11 = y * y * t + c;b12 = z * y * t + x * s; b20 = x * z * t + y * s;b21 = y * z * t - x * s;b22 = z * z * t + c; // Perform rotation-specific matrix multiplication out[0] = a00 * b00 + a10 * b01 + a20 * b02; out[1] = a01 * b00 + a11 * b01 + a21 * b02; out[2] = a02 * b00 + a12 * b01 + a22 * b02; out[3] = a03 * b00 + a13 * b01 + a23 * b02; out[4] = a00 * b10 + a10 * b11 + a20 * b12; out[5] = a01 * b10 + a11 * b11 + a21 * b12; out[6] = a02 * b10 + a12 * b11 + a22 * b12; out[7] = a03 * b10 + a13 * b11 + a23 * b12; out[8] = a00 * b20 + a10 * b21 + a20 * b22; out[9] = a01 * b20 + a11 * b21 + a21 * b22; out[10] = a02 * b20 + a12 * b21 + a22 * b22; out[11] = a03 * b20 + a13 * b21 + a23 * b22; if (a !== out) { // If the source and destination differ, copy the unchanged last row out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } return out; } /** * Rotates a matrix by the given angle around the X axis * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function rotateX(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a10 = a[4]; var a11 = a[5]; var a12 = a[6]; var a13 = a[7]; var a20 = a[8]; var a21 = a[9]; var a22 = a[10]; var a23 = a[11]; if (a !== out) { // If the source and destination differ, copy the unchanged rows out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } // Perform axis-specific matrix multiplication out[4] = a10 * c + a20 * s; out[5] = a11 * c + a21 * s; out[6] = a12 * c + a22 * s; out[7] = a13 * c + a23 * s; out[8] = a20 * c - a10 * s; out[9] = a21 * c - a11 * s; out[10] = a22 * c - a12 * s; out[11] = a23 * c - a13 * s; return out; } /** * Rotates a matrix by the given angle around the Y axis * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function rotateY(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a00 = a[0]; var a01 = a[1]; var a02 = a[2]; var a03 = a[3]; var a20 = a[8]; var a21 = a[9]; var a22 = a[10]; var a23 = a[11]; if (a !== out) { // If the source and destination differ, copy the unchanged rows out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } // Perform axis-specific matrix multiplication out[0] = a00 * c - a20 * s; out[1] = a01 * c - a21 * s; out[2] = a02 * c - a22 * s; out[3] = a03 * c - a23 * s; out[8] = a00 * s + a20 * c; out[9] = a01 * s + a21 * c; out[10] = a02 * s + a22 * c; out[11] = a03 * s + a23 * c; return out; } /** * Rotates a matrix by the given angle around the Z axis * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function rotateZ(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a00 = a[0]; var a01 = a[1]; var a02 = a[2]; var a03 = a[3]; var a10 = a[4]; var a11 = a[5]; var a12 = a[6]; var a13 = a[7]; if (a !== out) { // If the source and destination differ, copy the unchanged last row out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } // Perform axis-specific matrix multiplication out[0] = a00 * c + a10 * s; out[1] = a01 * c + a11 * s; out[2] = a02 * c + a12 * s; out[3] = a03 * c + a13 * s; out[4] = a10 * c - a00 * s; out[5] = a11 * c - a01 * s; out[6] = a12 * c - a02 * s; out[7] = a13 * c - a03 * s; return out; } /** * Creates a matrix from a vector translation * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.translate(dest, dest, vec); * * @param {mat4} out mat4 receiving operation result * @param {vec3} v Translation vector * @returns {mat4} out */ function fromTranslation(out, v) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out; } /** * Creates a matrix from a vector scaling * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.scale(dest, dest, vec); * * @param {mat4} out mat4 receiving operation result * @param {vec3} v Scaling vector * @returns {mat4} out */ function fromScaling(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = v[1]; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = v[2]; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from a given angle around a given axis * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.rotate(dest, dest, rad, axis); * * @param {mat4} out mat4 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @param {vec3} axis the axis to rotate around * @returns {mat4} out */ function fromRotation(out, rad, axis) { var x = axis[0], y = axis[1], z = axis[2]; var len = Math.sqrt(x * x + y * y + z * z); var s = void 0, c = void 0, t = void 0; if (Math.abs(len) < glMatrix.EPSILON) { return null; } len = 1 / len; x *= len; y *= len; z *= len; s = Math.sin(rad); c = Math.cos(rad); t = 1 - c; // Perform rotation-specific matrix multiplication out[0] = x * x * t + c; out[1] = y * x * t + z * s; out[2] = z * x * t - y * s; out[3] = 0; out[4] = x * y * t - z * s; out[5] = y * y * t + c; out[6] = z * y * t + x * s; out[7] = 0; out[8] = x * z * t + y * s; out[9] = y * z * t - x * s; out[10] = z * z * t + c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from the given angle around the X axis * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.rotateX(dest, dest, rad); * * @param {mat4} out mat4 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function fromXRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); // Perform axis-specific matrix multiplication out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = c; out[6] = s; out[7] = 0; out[8] = 0; out[9] = -s; out[10] = c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from the given angle around the Y axis * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.rotateY(dest, dest, rad); * * @param {mat4} out mat4 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function fromYRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); // Perform axis-specific matrix multiplication out[0] = c; out[1] = 0; out[2] = -s; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = s; out[9] = 0; out[10] = c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from the given angle around the Z axis * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.rotateZ(dest, dest, rad); * * @param {mat4} out mat4 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function fromZRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); // Perform axis-specific matrix multiplication out[0] = c; out[1] = s; out[2] = 0; out[3] = 0; out[4] = -s; out[5] = c; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from a quaternion rotation and vector translation * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.translate(dest, vec); * let quatMat = mat4.create(); * quat4.toMat4(quat, quatMat); * mat4.multiply(dest, quatMat); * * @param {mat4} out mat4 receiving operation result * @param {quat4} q Rotation quaternion * @param {vec3} v Translation vector * @returns {mat4} out */ function fromRotationTranslation(out, q, v) { // Quaternion math var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - (yy + zz); out[1] = xy + wz; out[2] = xz - wy; out[3] = 0; out[4] = xy - wz; out[5] = 1 - (xx + zz); out[6] = yz + wx; out[7] = 0; out[8] = xz + wy; out[9] = yz - wx; out[10] = 1 - (xx + yy); out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out; } /** * Returns the translation vector component of a transformation * matrix. If a matrix is built with fromRotationTranslation, * the returned vector will be the same as the translation vector * originally supplied. * @param {vec3} out Vector to receive translation component * @param {mat4} mat Matrix to be decomposed (input) * @return {vec3} out */ function getTranslation(out, mat) { out[0] = mat[12]; out[1] = mat[13]; out[2] = mat[14]; return out; } /** * Returns the scaling factor component of a transformation * matrix. If a matrix is built with fromRotationTranslationScale * with a normalized Quaternion paramter, the returned vector will be * the same as the scaling vector * originally supplied. * @param {vec3} out Vector to receive scaling factor component * @param {mat4} mat Matrix to be decomposed (input) * @return {vec3} out */ function getScaling(out, mat) { var m11 = mat[0]; var m12 = mat[1]; var m13 = mat[2]; var m21 = mat[4]; var m22 = mat[5]; var m23 = mat[6]; var m31 = mat[8]; var m32 = mat[9]; var m33 = mat[10]; out[0] = Math.sqrt(m11 * m11 + m12 * m12 + m13 * m13); out[1] = Math.sqrt(m21 * m21 + m22 * m22 + m23 * m23); out[2] = Math.sqrt(m31 * m31 + m32 * m32 + m33 * m33); return out; } /** * Returns a quaternion representing the rotational component * of a transformation matrix. If a matrix is built with * fromRotationTranslation, the returned quaternion will be the * same as the quaternion originally supplied. * @param {quat} out Quaternion to receive the rotation component * @param {mat4} mat Matrix to be decomposed (input) * @return {quat} out */ function getRotation(out, mat) { // Algorithm taken from http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm var trace = mat[0] + mat[5] + mat[10]; var S = 0; if (trace > 0) { S = Math.sqrt(trace + 1.0) * 2; out[3] = 0.25 * S; out[0] = (mat[6] - mat[9]) / S; out[1] = (mat[8] - mat[2]) / S; out[2] = (mat[1] - mat[4]) / S; } else if (mat[0] > mat[5] & mat[0] > mat[10]) { S = Math.sqrt(1.0 + mat[0] - mat[5] - mat[10]) * 2; out[3] = (mat[6] - mat[9]) / S; out[0] = 0.25 * S; out[1] = (mat[1] + mat[4]) / S; out[2] = (mat[8] + mat[2]) / S; } else if (mat[5] > mat[10]) { S = Math.sqrt(1.0 + mat[5] - mat[0] - mat[10]) * 2; out[3] = (mat[8] - mat[2]) / S; out[0] = (mat[1] + mat[4]) / S; out[1] = 0.25 * S; out[2] = (mat[6] + mat[9]) / S; } else { S = Math.sqrt(1.0 + mat[10] - mat[0] - mat[5]) * 2; out[3] = (mat[1] - mat[4]) / S; out[0] = (mat[8] + mat[2]) / S; out[1] = (mat[6] + mat[9]) / S; out[2] = 0.25 * S; } return out; } /** * Creates a matrix from a quaternion rotation, vector translation and vector scale * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.translate(dest, vec); * let quatMat = mat4.create(); * quat4.toMat4(quat, quatMat); * mat4.multiply(dest, quatMat); * mat4.scale(dest, scale) * * @param {mat4} out mat4 receiving operation result * @param {quat4} q Rotation quaternion * @param {vec3} v Translation vector * @param {vec3} s Scaling vector * @returns {mat4} out */ function fromRotationTranslationScale(out, q, v, s) { // Quaternion math var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; var sx = s[0]; var sy = s[1]; var sz = s[2]; out[0] = (1 - (yy + zz)) * sx; out[1] = (xy + wz) * sx; out[2] = (xz - wy) * sx; out[3] = 0; out[4] = (xy - wz) * sy; out[5] = (1 - (xx + zz)) * sy; out[6] = (yz + wx) * sy; out[7] = 0; out[8] = (xz + wy) * sz; out[9] = (yz - wx) * sz; out[10] = (1 - (xx + yy)) * sz; out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out; } /** * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.translate(dest, vec); * mat4.translate(dest, origin); * let quatMat = mat4.create(); * quat4.toMat4(quat, quatMat); * mat4.multiply(dest, quatMat); * mat4.scale(dest, scale) * mat4.translate(dest, negativeOrigin); * * @param {mat4} out mat4 receiving operation result * @param {quat4} q Rotation quaternion * @param {vec3} v Translation vector * @param {vec3} s Scaling vector * @param {vec3} o The origin vector around which to scale and rotate * @returns {mat4} out */ function fromRotationTranslationScaleOrigin(out, q, v, s, o) { // Quaternion math var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; var sx = s[0]; var sy = s[1]; var sz = s[2]; var ox = o[0]; var oy = o[1]; var oz = o[2]; out[0] = (1 - (yy + zz)) * sx; out[1] = (xy + wz) * sx; out[2] = (xz - wy) * sx; out[3] = 0; out[4] = (xy - wz) * sy; out[5] = (1 - (xx + zz)) * sy; out[6] = (yz + wx) * sy; out[7] = 0; out[8] = (xz + wy) * sz; out[9] = (yz - wx) * sz; out[10] = (1 - (xx + yy)) * sz; out[11] = 0; out[12] = v[0] + ox - (out[0] * ox + out[4] * oy + out[8] * oz); out[13] = v[1] + oy - (out[1] * ox + out[5] * oy + out[9] * oz); out[14] = v[2] + oz - (out[2] * ox + out[6] * oy + out[10] * oz); out[15] = 1; return out; } /** * Calculates a 4x4 matrix from the given quaternion * * @param {mat4} out mat4 receiving operation result * @param {quat} q Quaternion to create matrix from * * @returns {mat4} out */ function fromQuat(out, q) { var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var yx = y * x2; var yy = y * y2; var zx = z * x2; var zy = z * y2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - yy - zz; out[1] = yx + wz; out[2] = zx - wy; out[3] = 0; out[4] = yx - wz; out[5] = 1 - xx - zz; out[6] = zy + wx; out[7] = 0; out[8] = zx + wy; out[9] = zy - wx; out[10] = 1 - xx - yy; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Generates a frustum matrix with the given bounds * * @param {mat4} out mat4 frustum matrix will be written into * @param {Number} left Left bound of the frustum * @param {Number} right Right bound of the frustum * @param {Number} bottom Bottom bound of the frustum * @param {Number} top Top bound of the frustum * @param {Number} near Near bound of the frustum * @param {Number} far Far bound of the frustum * @returns {mat4} out */ function frustum(out, left, right, bottom, top, near, far) { var rl = 1 / (right - left); var tb = 1 / (top - bottom); var nf = 1 / (near - far); out[0] = near * 2 * rl; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = near * 2 * tb; out[6] = 0; out[7] = 0; out[8] = (right + left) * rl; out[9] = (top + bottom) * tb; out[10] = (far + near) * nf; out[11] = -1; out[12] = 0; out[13] = 0; out[14] = far * near * 2 * nf; out[15] = 0; return out; } /** * Generates a perspective projection matrix with the given bounds * * @param {mat4} out mat4 frustum matrix will be written into * @param {number} fovy Vertical field of view in radians * @param {number} aspect Aspect ratio. typically viewport width/height * @param {number} near Near bound of the frustum * @param {number} far Far bound of the frustum * @returns {mat4} out */ function perspective(out, fovy, aspect, near, far) { var f = 1.0 / Math.tan(fovy / 2); var nf = 1 / (near - far); out[0] = f / aspect; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = f; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = (far + near) * nf; out[11] = -1; out[12] = 0; out[13] = 0; out[14] = 2 * far * near * nf; out[15] = 0; return out; } /** * Generates a perspective projection matrix with the given field of view. * This is primarily useful for generating projection matrices to be used * with the still experiemental WebVR API. * * @param {mat4} out mat4 frustum matrix will be written into * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees * @param {number} near Near bound of the frustum * @param {number} far Far bound of the frustum * @returns {mat4} out */ function perspectiveFromFieldOfView(out, fov, near, far) { var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0); var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0); var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0); var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0); var xScale = 2.0 / (leftTan + rightTan); var yScale = 2.0 / (upTan + downTan); out[0] = xScale; out[1] = 0.0; out[2] = 0.0; out[3] = 0.0; out[4] = 0.0; out[5] = yScale; out[6] = 0.0; out[7] = 0.0; out[8] = -((leftTan - rightTan) * xScale * 0.5); out[9] = (upTan - downTan) * yScale * 0.5; out[10] = far / (near - far); out[11] = -1.0; out[12] = 0.0; out[13] = 0.0; out[14] = far * near / (near - far); out[15] = 0.0; return out; } /** * Generates a orthogonal projection matrix with the given bounds * * @param {mat4} out mat4 frustum matrix will be written into * @param {number} left Left bound of the frustum * @param {number} right Right bound of the frustum * @param {number} bottom Bottom bound of the frustum * @param {number} top Top bound of the frustum * @param {number} near Near bound of the frustum * @param {number} far Far bound of the frustum * @returns {mat4} out */ function ortho(out, left, right, bottom, top, near, far) { var lr = 1 / (left - right); var bt = 1 / (bottom - top); var nf = 1 / (near - far); out[0] = -2 * lr; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = -2 * bt; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 2 * nf; out[11] = 0; out[12] = (left + right) * lr; out[13] = (top + bottom) * bt; out[14] = (far + near) * nf; out[15] = 1; return out; } /** * Generates a look-at matrix with the given eye position, focal point, and up axis * * @param {mat4} out mat4 frustum matrix will be written into * @param {vec3} eye Position of the viewer * @param {vec3} center Point the viewer is looking at * @param {vec3} up vec3 pointing up * @returns {mat4} out */ function lookAt(out, eye, center, up) { var x0 = void 0, x1 = void 0, x2 = void 0, y0 = void 0, y1 = void 0, y2 = void 0, z0 = void 0, z1 = void 0, z2 = void 0, len = void 0; var eyex = eye[0]; var eyey = eye[1]; var eyez = eye[2]; var upx = up[0]; var upy = up[1]; var upz = up[2]; var centerx = center[0]; var centery = center[1]; var centerz = center[2]; if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) { return mat4.identity(out); } z0 = eyex - centerx; z1 = eyey - centery; z2 = eyez - centerz; len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2); z0 *= len; z1 *= len; z2 *= len; x0 = upy * z2 - upz * z1; x1 = upz * z0 - upx * z2; x2 = upx * z1 - upy * z0; len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2); if (!len) { x0 = 0; x1 = 0; x2 = 0; } else { len = 1 / len; x0 *= len; x1 *= len; x2 *= len; } y0 = z1 * x2 - z2 * x1; y1 = z2 * x0 - z0 * x2; y2 = z0 * x1 - z1 * x0; len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2); if (!len) { y0 = 0; y1 = 0; y2 = 0; } else { len = 1 / len; y0 *= len; y1 *= len; y2 *= len; } out[0] = x0; out[1] = y0; out[2] = z0; out[3] = 0; out[4] = x1; out[5] = y1; out[6] = z1; out[7] = 0; out[8] = x2; out[9] = y2; out[10] = z2; out[11] = 0; out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); out[15] = 1; return out; } /** * Generates a matrix that makes something look at something else. * * @param {mat4} out mat4 frustum matrix will be written into * @param {vec3} eye Position of the viewer * @param {vec3} center Point the viewer is looking at * @param {vec3} up vec3 pointing up * @returns {mat4} out */ function targetTo(out, eye, target, up) { var eyex = eye[0], eyey = eye[1], eyez = eye[2], upx = up[0], upy = up[1], upz = up[2]; var z0 = eyex - target[0], z1 = eyey - target[1], z2 = eyez - target[2]; var len = z0 * z0 + z1 * z1 + z2 * z2; if (len > 0) { len = 1 / Math.sqrt(len); z0 *= len; z1 *= len; z2 *= len; } var x0 = upy * z2 - upz * z1, x1 = upz * z0 - upx * z2, x2 = upx * z1 - upy * z0; out[0] = x0; out[1] = x1; out[2] = x2; out[3] = 0; out[4] = z1 * x2 - z2 * x1; out[5] = z2 * x0 - z0 * x2; out[6] = z0 * x1 - z1 * x0; out[7] = 0; out[8] = z0; out[9] = z1; out[10] = z2; out[11] = 0; out[12] = eyex; out[13] = eyey; out[14] = eyez; out[15] = 1; return out; }; /** * Returns a string representation of a mat4 * * @param {mat4} a matrix to represent as a string * @returns {String} string representation of the matrix */ function str(a) { return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' + a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')'; } /** * Returns Frobenius norm of a mat4 * * @param {mat4} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ function frob(a) { return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2) + Math.pow(a[9], 2) + Math.pow(a[10], 2) + Math.pow(a[11], 2) + Math.pow(a[12], 2) + Math.pow(a[13], 2) + Math.pow(a[14], 2) + Math.pow(a[15], 2)); } /** * Adds two mat4's * * @param {mat4} out the receiving matrix * @param {mat4} a the first operand * @param {mat4} b the second operand * @returns {mat4} out */ function add(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; out[6] = a[6] + b[6]; out[7] = a[7] + b[7]; out[8] = a[8] + b[8]; out[9] = a[9] + b[9]; out[10] = a[10] + b[10]; out[11] = a[11] + b[11]; out[12] = a[12] + b[12]; out[13] = a[13] + b[13]; out[14] = a[14] + b[14]; out[15] = a[15] + b[15]; return out; } /** * Subtracts matrix b from matrix a * * @param {mat4} out the receiving matrix * @param {mat4} a the first operand * @param {mat4} b the second operand * @returns {mat4} out */ function subtract(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; out[4] = a[4] - b[4]; out[5] = a[5] - b[5]; out[6] = a[6] - b[6]; out[7] = a[7] - b[7]; out[8] = a[8] - b[8]; out[9] = a[9] - b[9]; out[10] = a[10] - b[10]; out[11] = a[11] - b[11]; out[12] = a[12] - b[12]; out[13] = a[13] - b[13]; out[14] = a[14] - b[14]; out[15] = a[15] - b[15]; return out; } /** * Multiply each element of the matrix by a scalar. * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat4} out */ function multiplyScalar(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; out[6] = a[6] * b; out[7] = a[7] * b; out[8] = a[8] * b; out[9] = a[9] * b; out[10] = a[10] * b; out[11] = a[11] * b; out[12] = a[12] * b; out[13] = a[13] * b; out[14] = a[14] * b; out[15] = a[15] * b; return out; } /** * Adds two mat4's after multiplying each element of the second operand by a scalar value. * * @param {mat4} out the receiving vector * @param {mat4} a the first operand * @param {mat4} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat4} out */ function multiplyScalarAndAdd(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; out[4] = a[4] + b[4] * scale; out[5] = a[5] + b[5] * scale; out[6] = a[6] + b[6] * scale; out[7] = a[7] + b[7] * scale; out[8] = a[8] + b[8] * scale; out[9] = a[9] + b[9] * scale; out[10] = a[10] + b[10] * scale; out[11] = a[11] + b[11] * scale; out[12] = a[12] + b[12] * scale; out[13] = a[13] + b[13] * scale; out[14] = a[14] + b[14] * scale; out[15] = a[15] + b[15] * scale; return out; } /** * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) * * @param {mat4} a The first matrix. * @param {mat4} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function exactEquals(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15]; } /** * Returns whether or not the matrices have approximately the same elements in the same position. * * @param {mat4} a The first matrix. * @param {mat4} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7]; var a8 = a[8], a9 = a[9], a10 = a[10], a11 = a[11]; var a12 = a[12], a13 = a[13], a14 = a[14], a15 = a[15]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; var b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7]; var b8 = b[8], b9 = b[9], b10 = b[10], b11 = b[11]; var b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15]; return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)); } /** * Alias for {@link mat4.multiply} * @function */ var mul = multiply; /** * Alias for {@link mat4.subtract} * @function */ var sub = subtract; /***/ }) /******/ ]); });asymptote-3.05/gl-matrix-2.4.0-pruned/LICENSE.js0000644000000000000000000000215315031566646017457 0ustar rootroot/*@license for gl-matrix mat3 and mat4 functions: Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ asymptote-3.05/LspCpp/0000755000000000000000000000000015031566776013405 5ustar rootrootasymptote-3.05/LspCpp/include/0000755000000000000000000000000015031566105015012 5ustar rootrootasymptote-3.05/LspCpp/include/LibLsp/0000755000000000000000000000000015031566105016177 5ustar rootrootasymptote-3.05/LspCpp/include/LibLsp/lsp/0000755000000000000000000000000015031566105016775 5ustar rootrootasymptote-3.05/LspCpp/include/LibLsp/lsp/utils.h0000644000000000000000000001077715031566105020322 0ustar rootroot#pragma once #include #include #include #include #include #include #include #include #include #include #include "lsPosition.h" namespace lsp { // Returns true if |value| starts/ends with |start| or |ending|. bool StartsWith(std::string value, std::string start); bool EndsWith(std::string value, std::string ending); bool AnyStartsWith(std::vector const& values, std::string const& start); bool StartsWithAny(std::string const& value, std::vector const& startings); bool EndsWithAny(std::string const& value, std::vector const& endings); bool FindAnyPartial(std::string const& value, std::vector const& values); // Returns the dirname of |path|, i.e. "foo/bar.cc" => "foo/", "foo" => "./", // "/foo" => "/". The result always ends in '/'. std::string GetDirName(std::string path); // Returns the basename of |path|, ie, "foo/bar.cc" => "bar.cc". std::string GetBaseName(std::string const& path); // Returns |path| without the filetype, ie, "foo/bar.cc" => "foo/bar". std::string StripFileType(std::string const& path); std::string ReplaceAll(std::string const& source, std::string const& from, std::string const& to); std::vector SplitString(std::string const& str, std::string const& delimiter); template std::string StringJoinMap(TValues const& values, TMap const& map, std::string const& sep = ", ") { std::string result; bool first = true; for (auto& entry : values) { if (!first) { result += sep; } first = false; result += map(entry); } return result; } template std::string StringJoin(TValues const& values, std::string const& sep = ", ") { return StringJoinMap(values, [](std::string const& entry) { return entry; }, sep); } template bool ContainsValue(TCollection const& collection, TValue const& value) { return std::find(std::begin(collection), std::end(collection), value) != std::end(collection); } // Ensures that |path| ends in a slash. void EnsureEndsInSlash(std::string& path); // Converts a file path to one that can be used as filename. // e.g. foo/bar.c => foo_bar.c std::string EscapeFileName(std::string path); // FIXME: Move ReadContent into ICacheManager? bool FileExists(std::string const& filename); optional ReadContent(AbsolutePath const& filename); std::vector ReadLinesWithEnding(AbsolutePath const& filename); bool WriteToFile(std::string const& filename, std::string const& content); template void RemoveIf(std::vector* vec, Fn predicate) { vec->erase(std::remove_if(vec->begin(), vec->end(), predicate), vec->end()); } std::string FormatMicroseconds(long long microseconds); // Makes sure all newlines in |output| are in \r\n format. std::string UpdateToRnNewlines(std::string output); // Utility methods to check if |path| is absolute. bool IsAbsolutePath(std::string const& path); bool IsUnixAbsolutePath(std::string const& path); bool IsWindowsAbsolutePath(std::string const& path); bool IsDirectory(std::string const& path); // string <-> wstring conversion (UTF-16), e.g. for use with Window's wide APIs. std::string ws2s(std::wstring const& wstr); std::wstring s2ws(std::string const& str); AbsolutePath NormalizePath(std::string const& path, bool ensure_exists = true, bool force_lower_on_windows = true); int GetOffsetForPosition(lsPosition position, std::string const& content); // Finds the position for an |offset| in |content|. lsPosition GetPositionForOffset(int offset, std::string const& content); // Utility method to find a position for the given character. lsPosition CharPos(std::string const& search, char character, int character_offset = 0); void scanDirsNoRecursive(std::wstring const& rootPath, std::vector& ret); void scanFilesUseRecursive(std::wstring const& rootPath, std::vector& ret, std::wstring strSuf = L""); void scanFileNamesUseRecursive(std::wstring const& rootPath, std::vector& ret, std::wstring strSuf = L""); void scanFileNamesUseRecursive(std::string const& rootPath, std::vector& ret, std::string strSuf = ""); void scanFilesUseRecursive(std::string const& rootPath, std::vector& ret, std::string strSuf = ""); void scanDirsUseRecursive(std::wstring const& rootPath, std::vector& ret); } // namespace lsp asymptote-3.05/LspCpp/include/LibLsp/lsp/CodeActionParams.h0000644000000000000000000000606315031566105022327 0ustar rootroot#pragma once #include "LibLsp/lsp/method_type.h" #include "LibLsp/JsonRpc/message.h" #include "LibLsp/lsp/lsp_diagnostic.h" #include "LibLsp/lsp/workspace/execute_command.h" #include "LibLsp/lsp/lsTextDocumentIdentifier.h" #include "LibLsp/lsp/lsCodeAction.h" namespace JDT { namespace CodeActionKind { /** * Base kind for quickfix actions: 'quickfix' */ extern char const* QuickFix; /** * Base kind for refactoring actions: 'refactor' */ extern char const* Refactor; /** * Base kind for refactoring extraction actions: 'refactor.extract' * * Example extract actions: * * - Extract method - Extract function - Extract variable - Extract interface * from class - ... */ extern char const* RefactorExtract; /** * Base kind for refactoring inline actions: 'refactor.inline' * * Example inline actions: * * - Inline function - Inline variable - Inline constant - ... */ extern char const* RefactorInline; /** * Base kind for refactoring rewrite actions: 'refactor.rewrite' * * Example rewrite actions: * * - Convert JavaScript function to class - Add or remove parameter - * Encapsulate field - Make method static - Move method to base class - ... */ extern char const* RefactorRewrite; /** * Base kind for source actions: `source` * * Source code actions apply to the entire file. */ extern char const* Source; /** * Base kind for an organize imports source action: `source.organizeImports` */ extern char const* SourceOrganizeImports; extern char const* COMMAND_ID_APPLY_EDIT; }; // namespace CodeActionKind } // namespace JDT struct lsCodeActionContext { // An array of diagnostics. std::vector diagnostics; /** * Requested kind of actions to return. * * Actions not of this kind are filtered out by the client before being shown. So servers * can omit computing them. * * See {@link CodeActionKind} for allowed values. */ optional> only; MAKE_SWAP_METHOD(lsCodeActionContext, diagnostics, only); }; MAKE_REFLECT_STRUCT(lsCodeActionContext, diagnostics, only); // Params for the CodeActionRequest struct lsCodeActionParams { // The document in which the command was invoked. lsTextDocumentIdentifier textDocument; // The range for which the command was invoked. lsRange range; // Context carrying additional information. lsCodeActionContext context; MAKE_SWAP_METHOD(lsCodeActionParams, textDocument, range, context); }; MAKE_REFLECT_STRUCT(lsCodeActionParams, textDocument, range, context); asymptote-3.05/LspCpp/include/LibLsp/lsp/Directory.h0000644000000000000000000000037015031566105021112 0ustar rootroot#pragma once #include struct AbsolutePath; struct Directory { explicit Directory(AbsolutePath const& path); bool operator==(Directory const& rhs) const; bool operator!=(Directory const& rhs) const; std::string path; }; asymptote-3.05/LspCpp/include/LibLsp/lsp/lsResponseError.h0000644000000000000000000000661115031566105022321 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include #include "LibLsp/lsp/lsAny.h" enum class lsErrorCodes : int32_t { // Defined by JSON RPC ParseError = -32700, InvalidRequest = -32600, MethodNotFound = -32601, InvalidParams = -32602, InternalError = -32603, /** * This is the start range of JSON RPC reserved error codes. * It doesn't denote a real error code. No LSP error codes should * be defined between the start and end range. For backwards * compatibility the `ServerNotInitialized` and the `UnknownErrorCode` * are left in the range. * * @since 3.16.0 */ jsonrpcReservedErrorRangeStart = -32099, /** @deprecated use jsonrpcReservedErrorRangeStart */ serverErrorStart = jsonrpcReservedErrorRangeStart, /** * This is the start range of JSON RPC reserved error codes. * It doesn't denote a real error code. * * @since 3.16.0 */ jsonrpcReservedErrorRangeEnd = -32000, /** @deprecated use jsonrpcReservedErrorRangeEnd */ serverErrorEnd = jsonrpcReservedErrorRangeEnd, /** * Error code indicating that a server received a notification or * request before the server has received the `initialize` request. */ ServerNotInitialized = -32002, UnknownErrorCode = -32001, /** * This is the start range of LSP reserved error codes. * It doesn't denote a real error code. * * @since 3.16.0 */ lspReservedErrorRangeStart = -32899, /** * The server cancelled the request. This error code should * only be used for requests that explicitly support being * server cancellable. * * @since 3.17.0 */ ServerCancelled = -32802, /** * The server detected that the content of a document got * modified outside normal conditions. A server should * NOT send this error code if it detects a content change * in it unprocessed messages. The result even computed * on an older state might still be useful for the client. * * If a client decides that a result is not of any use anymore * the client should cancel the request. */ ContentModified = -32801, /** * The client has canceled a request and a server as detected * the cancel. */ RequestCancelled = -32800, /** * This is the end range of LSP reserved error codes. * It doesn't denote a real error code. * * @since 3.16.0 */ lspReservedErrorRangeEnd = -32800, }; MAKE_REFLECT_TYPE_PROXY(lsErrorCodes); struct lsResponseError { lsResponseError() : code(lsErrorCodes::UnknownErrorCode) { } /** * A number indicating the error type that occurred. */ lsErrorCodes code; // Short description. /** * A string providing a short description of the error. */ std::string message; /** * A primitive or structured value that contains additional * information about the error. Can be omitted. */ optional data; std::string ToString(); void Write(Writer& visitor); MAKE_SWAP_METHOD(lsResponseError, code, message, data) }; MAKE_REFLECT_STRUCT(lsResponseError, code, message, data) asymptote-3.05/LspCpp/include/LibLsp/lsp/ProcessIoService.h0000644000000000000000000000166315031566105022403 0ustar rootroot#pragma once #include #include namespace lsp { class ProcessIoService { public: using IOService = boost::asio::io_context; using Work = boost::asio::executor_work_guard; using WorkPtr = std::unique_ptr; ProcessIoService() { work_ = std::unique_ptr(new Work(ioService_.get_executor())); auto temp_thread_ = new std::thread([this] { ioService_.run(); }); thread_ = std::unique_ptr(temp_thread_); } ProcessIoService(ProcessIoService const&) = delete; ProcessIoService& operator=(ProcessIoService const&) = delete; boost::asio::io_context& getIOService() { return ioService_; } void stop() { work_.reset(); thread_->join(); } private: IOService ioService_; WorkPtr work_; std::unique_ptr thread_; }; } // namespace lsp asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/0000755000000000000000000000000015031566105021012 5ustar rootrootasymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/0000755000000000000000000000000015031566105022132 5ustar rootrootasymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/organizeImports.h0000644000000000000000000000045115031566105025477 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "LibLsp/lsp/CodeActionParams.h" DEFINE_REQUEST_RESPONSE_TYPE(java_organizeImports, lsCodeActionParams, lsWorkspaceEdit, "java/organizeImports"); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/classFileContents.h0000644000000000000000000000044515031566105025731 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "LibLsp/lsp/lsTextDocumentIdentifier.h" DEFINE_REQUEST_RESPONSE_TYPE(java_classFileContents, lsTextDocumentIdentifier, std::string, "java/classFileContents"); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/getMoveDestinations.h0000644000000000000000000000346415031566105026305 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "LibLsp/lsp/lsAny.h" #include "LibLsp/lsp/CodeActionParams.h" struct MoveKindInfo { static std::string moveResource() { return "moveResource"; } static std::string moveInstanceMethod() { return "moveInstanceMethod"; } static std::string moveStaticMember() { return "moveStaticMember"; } }; struct MoveParams { /** * The supported move kind: moveResource, moveInstanceMethod, moveStaticMember, * moveTypeToNewFile. */ std::string moveKind; /** * The selected resource uris when the move operation is triggered. */ std::vector sourceUris; /** * The code action params when the move operation is triggered. */ optional params; /** * The possible destination: a folder/package, class, instanceDeclaration. */ lsp::Any destination; bool updateReferences; void swap(MoveParams& arg) noexcept { moveKind.swap(arg.moveKind); sourceUris.swap(arg.sourceUris); params.swap(arg.params); destination.swap(arg.destination); std::swap(updateReferences, arg.updateReferences); } }; MAKE_REFLECT_STRUCT(MoveParams, moveKind, sourceUris, params, destination, updateReferences); struct MoveDestinationsResponse { std::string errorMessage; std::vector destinations; MAKE_SWAP_METHOD(MoveDestinationsResponse, errorMessage, destinations); }; MAKE_REFLECT_STRUCT(MoveDestinationsResponse, errorMessage, destinations); DEFINE_REQUEST_RESPONSE_TYPE( java_getMoveDestinations, MoveParams, MoveDestinationsResponse, "java/getMoveDestinations" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/executeCommand.h0000644000000000000000000000167015031566105025250 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "LibLsp/lsp/lsWorkspaceEdit.h" #include "LibLsp/lsp/ExecuteCommandParams.h" namespace buildpath { // static const char* EDIT_ORGNIZEIMPORTS = "java.edit.organizeImports"; // static const char* RESOLVE_SOURCE_ATTACHMENT = "java.project.resolveSourceAttachment"; // static const char* UPDATE_SOURCE_ATTACHMENT = "java.project.updateSourceAttachment"; // static const char* ADD_TO_SOURCEPATH = "java.project.addToSourcePath"; // static const char* REMOVE_FROM_SOURCEPATH = "java.project.removeFromSourcePath"; // static const char* LIST_SOURCEPATHS = "java.project.listSourcePaths"; struct Result { bool status; std::string message; }; } // namespace buildpath DEFINE_REQUEST_RESPONSE_TYPE(java_executeCommand, ExecuteCommandParams, lsWorkspaceEdit, "java/executeCommand"); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/generateAccessors.h0000644000000000000000000000110115031566105025734 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "checkHashCodeEqualsStatus.h" #include "resolveUnimplementedAccessors.h" struct GenerateAccessorsParams { lsCodeActionParams context; std::vector accessors; MAKE_SWAP_METHOD(GenerateAccessorsParams, context, accessors) }; MAKE_REFLECT_STRUCT(GenerateAccessorsParams, context, accessors) DEFINE_REQUEST_RESPONSE_TYPE( java_generateAccessors, GenerateAccessorsParams, lsWorkspaceEdit, "java/generateAccessors" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/checkHashCodeEqualsStatus.h0000644000000000000000000000204115031566105027333 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "LibLsp/lsp/CodeActionParams.h" struct LspVariableBinding { std::string bindingKey; std::string name; std::string type; bool isField; void swap(LspVariableBinding& arg) noexcept { bindingKey.swap(arg.bindingKey); name.swap(arg.name); type.swap(arg.type); std::swap(isField, arg.isField); } }; MAKE_REFLECT_STRUCT(LspVariableBinding, bindingKey, name, type, isField) struct CheckHashCodeEqualsResponse { std::string type; std::vector fields; std::vector existingMethods; MAKE_SWAP_METHOD(CheckHashCodeEqualsResponse, type, fields, type, existingMethods) }; MAKE_REFLECT_STRUCT(CheckHashCodeEqualsResponse, type, fields, type, existingMethods) DEFINE_REQUEST_RESPONSE_TYPE( java_checkHashCodeEqualsStatus, lsCodeActionParams, CheckHashCodeEqualsResponse, "java/checkHashCodeEqualsStatus" ) asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/Move.h0000644000000000000000000000047415031566105023216 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "LibLsp/lsp/CodeActionParams.h" #include "getMoveDestinations.h" #include "getRefactorEdit.h" DEFINE_REQUEST_RESPONSE_TYPE(java_move, MoveParams, RefactorWorkspaceEdit, "java/move"); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/codeActionResult.h0000644000000000000000000000224115031566105025551 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include "LibLsp/JsonRpc/message.h" #include "LibLsp/lsp/lsCodeAction.h" #include "LibLsp/lsp/workspace/execute_command.h" #include #include "LibLsp/lsp/textDocument/code_action.h" namespace SourceAssistProcessor { /*std::set UNSUPPORTED_RESOURCES = { "module-info.java", "package-info.java" };*/ // static const char* COMMAND_ID_ACTION_OVERRIDEMETHODSPROMPT = "java.action.overrideMethodsPrompt"; // static const char* COMMAND_ID_ACTION_HASHCODEEQUALSPROMPT = "java.action.hashCodeEqualsPrompt"; // static const char* COMMAND_ID_ACTION_ORGANIZEIMPORTS = "java.action.organizeImports"; // static const char* COMMAND_ID_ACTION_GENERATETOSTRINGPROMPT = "java.action.generateToStringPrompt"; // static const char* COMMAND_ID_ACTION_GENERATEACCESSORSPROMPT = "java.action.generateAccessorsPrompt"; // static const char* COMMAND_ID_ACTION_GENERATECONSTRUCTORSPROMPT = "java.action.generateConstructorsPrompt"; // static const char* COMMAND_ID_ACTION_GENERATEDELEGATEMETHODSPROMPT = "java.action.generateDelegateMethodsPrompt"; }; // namespace SourceAssistProcessor asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/resolveUnimplementedAccessors.h0000644000000000000000000000145015031566105030357 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "checkHashCodeEqualsStatus.h" struct AccessorField { std::string fieldName; bool isStatic = false; bool generateGetter = false; bool generateSetter = false; void swap(AccessorField& arg) noexcept { fieldName.swap(arg.fieldName); std::swap(isStatic, arg.isStatic); std::swap(generateGetter, arg.generateGetter); std::swap(generateSetter, arg.generateSetter); } }; MAKE_REFLECT_STRUCT(AccessorField, fieldName, isStatic, generateGetter, generateSetter) DEFINE_REQUEST_RESPONSE_TYPE( java_resolveUnimplementedAccessors, lsCodeActionParams, std::vector, "java/resolveUnimplementedAccessors" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/generateDelegateMethods.h0000644000000000000000000000152115031566105027053 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "checkHashCodeEqualsStatus.h" #include "checkConstructorsStatus.h" struct LspDelegateEntry { LspVariableBinding field; LspMethodBinding delegateMethod; MAKE_SWAP_METHOD(LspDelegateEntry, field, delegateMethod); }; MAKE_REFLECT_STRUCT(LspDelegateEntry, field, delegateMethod); struct GenerateDelegateMethodsParams { lsCodeActionParams context; std::vector delegateEntries; MAKE_SWAP_METHOD(GenerateDelegateMethodsParams, context, delegateEntries) }; MAKE_REFLECT_STRUCT(GenerateDelegateMethodsParams, context, delegateEntries) DEFINE_REQUEST_RESPONSE_TYPE( java_generateDelegateMethods, GenerateDelegateMethodsParams, lsWorkspaceEdit, "java/generateDelegateMethods" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/generateConstructors.h0000644000000000000000000000117015031566105026525 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "checkHashCodeEqualsStatus.h" #include "checkConstructorsStatus.h" struct GenerateConstructorsParams { lsCodeActionParams context; std::vector constructors; std::vector fields; MAKE_SWAP_METHOD(GenerateConstructorsParams, context, fields) }; MAKE_REFLECT_STRUCT(GenerateConstructorsParams, context, fields) DEFINE_REQUEST_RESPONSE_TYPE( java_generateConstructors, GenerateConstructorsParams, lsWorkspaceEdit, "java/generateConstructors" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/projectConfigurationUpdate.h0000644000000000000000000000046315031566105027647 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/NotificationInMessage.h" #include #include #include "WorkspaceSymbolParams.h" #include "LibLsp/lsp/lsTextDocumentIdentifier.h" DEFINE_NOTIFICATION_TYPE(java_projectConfigurationUpdate, lsTextDocumentIdentifier, "java/projectConfigurationUpdate"); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/checkToStringStatus.h0000644000000000000000000000123115031566105026253 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/CodeActionParams.h" #include "checkHashCodeEqualsStatus.h" struct CheckToStringResponse { std::string type; std::vector fields; bool exists; void swap(CheckToStringResponse& arg) noexcept { type.swap(arg.type); fields.swap(arg.fields); std::swap(exists, arg.exists); } }; MAKE_REFLECT_STRUCT(CheckToStringResponse, type, fields, exists) DEFINE_REQUEST_RESPONSE_TYPE( java_checkToStringStatus, lsCodeActionParams, CheckToStringResponse, "java/checkToStringStatus" ) asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/WorkspaceSymbolParams.h0000644000000000000000000000035015031566105026571 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include struct WorkspaceSymbolParams { std::string query; MAKE_SWAP_METHOD(WorkspaceSymbolParams, query); }; MAKE_REFLECT_STRUCT(WorkspaceSymbolParams, query); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/findLinks.h0000644000000000000000000000111515031566105024222 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "LibLsp/lsp/CodeActionParams.h" #include "getRefactorEdit.h" #include "LibLsp/lsp/lsTextDocumentPositionParams.h" struct FindLinksParams { // Supported link types: superImplementation std::string type; lsTextDocumentPositionParams position; MAKE_SWAP_METHOD(FindLinksParams, type, position) }; MAKE_REFLECT_STRUCT(FindLinksParams, type, position) DEFINE_REQUEST_RESPONSE_TYPE(java_findLinks, FindLinksParams, lsp::Any, "java/findLinks"); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/addOverridableMethods.h0000644000000000000000000000117615031566105026543 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/message.h" #include "OverridableMethod.h" #include "LibLsp/lsp/CodeActionParams.h" #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" struct AddOverridableMethodParams { lsCodeActionParams context; std::vector overridableMethods; MAKE_SWAP_METHOD(AddOverridableMethodParams, context, overridableMethods); }; MAKE_REFLECT_STRUCT(AddOverridableMethodParams, context, overridableMethods); DEFINE_REQUEST_RESPONSE_TYPE( java_addOverridableMethods, AddOverridableMethodParams, lsWorkspaceEdit, "java/addOverridableMethods" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/checkDelegateMethodsStatus.h0000644000000000000000000000151315031566105027543 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/CodeActionParams.h" #include "checkHashCodeEqualsStatus.h" #include "checkConstructorsStatus.h" struct LspDelegateField { LspVariableBinding field; std::vector delegateMethods; MAKE_SWAP_METHOD(LspDelegateField, field, delegateMethods); }; MAKE_REFLECT_STRUCT(LspDelegateField, field, delegateMethods); struct CheckDelegateMethodsResponse { std::vector delegateFields; MAKE_SWAP_METHOD(CheckDelegateMethodsResponse, delegateFields) }; MAKE_REFLECT_STRUCT(CheckDelegateMethodsResponse, delegateFields) DEFINE_REQUEST_RESPONSE_TYPE( java_checkDelegateMethodsStatus, lsCodeActionParams, CheckDelegateMethodsResponse, "java/checkDelegateMethodsStatus" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/generateHashCodeEquals.h0000644000000000000000000000141215031566105026645 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "LibLsp/lsp/CodeActionParams.h" #include "checkHashCodeEqualsStatus.h" struct GenerateHashCodeEqualsParams { lsCodeActionParams context; std::vector fields; bool regenerate = false; void swap(GenerateHashCodeEqualsParams& arg) noexcept { context.swap(arg.context); fields.swap(arg.fields); std::swap(regenerate, arg.regenerate); } }; MAKE_REFLECT_STRUCT(GenerateHashCodeEqualsParams, context, fields, regenerate); DEFINE_REQUEST_RESPONSE_TYPE( java_generateHashCodeEquals, GenerateHashCodeEqualsParams, lsWorkspaceEdit, "java/generateHashCodeEquals" ) asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/getRefactorEdit.h0000644000000000000000000000422415031566105025360 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include #include "WorkspaceSymbolParams.h" #include "LibLsp/lsp/method_type.h" #include "LibLsp/lsp/textDocument/code_action.h" #include "LibLsp/lsp/lsFormattingOptions.h" namespace RefactorProposalUtility { extern char const* APPLY_REFACTORING_COMMAND_ID; extern char const* EXTRACT_VARIABLE_ALL_OCCURRENCE_COMMAND; extern char const* EXTRACT_VARIABLE_COMMAND; extern char const* EXTRACT_CONSTANT_COMMAND; extern char const* EXTRACT_METHOD_COMMAND; extern char const* EXTRACT_FIELD_COMMAND; extern char const* CONVERT_VARIABLE_TO_FIELD_COMMAND; extern char const* MOVE_FILE_COMMAND; extern char const* MOVE_INSTANCE_METHOD_COMMAND; extern char const* MOVE_STATIC_MEMBER_COMMAND; extern char const* MOVE_TYPE_COMMAND; }; // namespace RefactorProposalUtility struct RenamePosition { lsDocumentUri uri; int offset = 0; int length = 0; void swap(RenamePosition& arg) noexcept { uri.swap(arg.uri); std::swap(offset, arg.offset); std::swap(length, arg.length); } }; MAKE_REFLECT_STRUCT(RenamePosition, uri, offset, length); struct GetRefactorEditParams { std::string command; std::vector commandArguments; lsCodeActionParams context; optional options; MAKE_SWAP_METHOD(GetRefactorEditParams, command, context, options); }; MAKE_REFLECT_STRUCT(GetRefactorEditParams, command, context, options); struct RefactorWorkspaceEdit { /** * The workspace edit this code action performs. */ lsWorkspaceEdit edit; /** * A command this code action executes. If a code action provides a edit and a * command, first the edit is executed and then the command. */ optional errorMessage; optional command; MAKE_SWAP_METHOD(RefactorWorkspaceEdit, edit, command, errorMessage) }; MAKE_REFLECT_STRUCT(RefactorWorkspaceEdit, edit, command, errorMessage) DEFINE_REQUEST_RESPONSE_TYPE( java_getRefactorEdit, GetRefactorEditParams, RefactorWorkspaceEdit, "java/getRefactorEdit" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/OverridableMethod.h0000644000000000000000000000172215031566105025704 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include struct OverridableMethod { std::string bindingKey; std::string name; std::vector parameters; bool unimplemented = false; std::string declaringClass; std::string declaringClassType; void swap(OverridableMethod& arg) noexcept { bindingKey.swap(arg.bindingKey); name.swap(arg.name); parameters.swap(arg.parameters); declaringClass.swap(arg.declaringClass); declaringClassType.swap(arg.declaringClassType); std::swap(unimplemented, arg.unimplemented); } }; MAKE_REFLECT_STRUCT(OverridableMethod, bindingKey, name, parameters, unimplemented, declaringClass, declaringClassType); struct OverridableMethodsResponse { std::string type; std::vector methods; MAKE_SWAP_METHOD(OverridableMethodsResponse, type, methods) }; MAKE_REFLECT_STRUCT(OverridableMethodsResponse, type, methods) asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/buildWorkspace.h0000644000000000000000000000061215031566105025260 0ustar rootroot#pragma once #include "WorkspaceSymbolParams.h" #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" enum class BuildWorkspaceStatus : uint8_t { FAILED, SUCCEED, WITH_ERROR, CANCELLED, }; MAKE_REFLECT_TYPE_PROXY(BuildWorkspaceStatus) DEFINE_REQUEST_RESPONSE_TYPE(java_buildWorkspace, bool, BuildWorkspaceStatus, "java/buildWorkspace"); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/generateToString.h0000644000000000000000000000100615031566105025564 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "checkHashCodeEqualsStatus.h" struct GenerateToStringParams { lsCodeActionParams context; std::vector fields; MAKE_SWAP_METHOD(GenerateToStringParams, context, fields) }; MAKE_REFLECT_STRUCT(GenerateToStringParams, context, fields) DEFINE_REQUEST_RESPONSE_TYPE(java_generateToString, GenerateToStringParams, lsWorkspaceEdit, "java/generateToString"); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/listOverridableMethods.h0000644000000000000000000000050315031566105026757 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/CodeActionParams.h" #include "OverridableMethod.h" DEFINE_REQUEST_RESPONSE_TYPE( java_listOverridableMethods, lsCodeActionParams, OverridableMethodsResponse, "java/listOverridableMethods" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/searchSymbols.h0000644000000000000000000000130715031566105025122 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include #include "WorkspaceSymbolParams.h" #include "LibLsp/lsp/method_type.h" #include "LibLsp/lsp/symbol.h" struct SearchSymbolParams : public WorkspaceSymbolParams { optional projectName; optional sourceOnly; optional maxResults; MAKE_SWAP_METHOD(SearchSymbolParams, query, projectName, sourceOnly, maxResults); }; MAKE_REFLECT_STRUCT(SearchSymbolParams, query, projectName, sourceOnly, maxResults); DEFINE_REQUEST_RESPONSE_TYPE( java_searchSymbols, SearchSymbolParams, std::vector, "java/searchSymbols" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/jdtls/checkConstructorsStatus.h0000644000000000000000000000153515031566105027221 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/CodeActionParams.h" #include "checkHashCodeEqualsStatus.h" struct LspMethodBinding { std::string bindingKey; std::string name; std::vector parameters; MAKE_SWAP_METHOD(LspMethodBinding, bindingKey, name, parameters); }; MAKE_REFLECT_STRUCT(LspMethodBinding, bindingKey, name, parameters); struct CheckConstructorsResponse { std::vector constructors; std::vector fields; MAKE_SWAP_METHOD(CheckConstructorsResponse, constructors, fields) }; MAKE_REFLECT_STRUCT(CheckConstructorsResponse, constructors, fields) DEFINE_REQUEST_RESPONSE_TYPE( java_checkConstructorsStatus, lsCodeActionParams, CheckConstructorsResponse, "java/checkConstructorsStatus" ) asymptote-3.05/LspCpp/include/LibLsp/lsp/extention/sonarlint/0000755000000000000000000000000015031566105023023 5ustar rootrootasymptote-3.05/LspCpp/include/LibLsp/lsp/extention/sonarlint/protocol.h0000644000000000000000000001120615031566105025035 0ustar rootroot#pragma once #include #include #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/lsp/lsDocumentUri.h" #include "LibLsp/lsp/lsAny.h" #include "LibLsp/JsonRpc/NotificationInMessage.h" #include "LibLsp/lsp/general/InitializeParams.h" struct LintRule { std::string key; std::string name; std::string Display() const { return name + " (" + key + ")"; } bool activeByDefault = true; optional severity; optional type; int icon_index = -1; MAKE_SWAP_METHOD(LintRule, key, name, activeByDefault, severity, type); }; MAKE_REFLECT_STRUCT(LintRule, key, name, activeByDefault, severity, type); struct RuleParameter { std::string name; optional description; optional defaultValue; }; MAKE_REFLECT_STRUCT(RuleParameter, name, description, defaultValue); struct ShowRuleDescriptionParams { optional key; optional name; optional htmlDescription; optional type; optional severity; optional> parameters; MAKE_SWAP_METHOD(ShowRuleDescriptionParams, key, name, htmlDescription, type, severity, parameters) }; MAKE_REFLECT_STRUCT(ShowRuleDescriptionParams, key, name, htmlDescription, type, severity, parameters); struct GetJavaConfigResponse { std::string projectRoot; std::string sourceLevel; std::vector classpath; bool isTest; std::string vmLocation; MAKE_SWAP_METHOD(GetJavaConfigResponse, projectRoot, sourceLevel, classpath, isTest, vmLocation); }; MAKE_REFLECT_STRUCT(GetJavaConfigResponse, projectRoot, sourceLevel, classpath, isTest, vmLocation); struct SetTraceNotificationParams { lsInitializeParams::lsTrace value; }; MAKE_REFLECT_STRUCT(SetTraceNotificationParams, value); struct ServerConnectionSettings { std::string SONARCLOUD_URL = "https://sonarcloud.io"; std::vector SONARCLOUD_ALIAS = { "https://sonarqube.com", "https://www.sonarqube.com", "https://www.sonarcloud.io", "https://sonarcloud.io" }; std::string connectionId; std::string serverUrl; std::string token; optional organizationKey; MAKE_SWAP_METHOD(ServerConnectionSettings, connectionId, serverUrl, token, organizationKey) }; MAKE_REFLECT_STRUCT(ServerConnectionSettings, connectionId, serverUrl, token, organizationKey) struct RuleSetting { bool IsOn(); std::string level = "on"; RuleSetting(bool activate); RuleSetting() = default; void toggle(); void on() { level = "on"; } void off() { level = "off"; } void turn(bool activate) { if (activate) { on(); } else { off(); } } optional> parameters; }; MAKE_REFLECT_STRUCT(RuleSetting, level, parameters) struct ConsoleParams { optional showAnalyzerLogs; optional showVerboseLogs; MAKE_SWAP_METHOD(ConsoleParams, showAnalyzerLogs, showVerboseLogs) }; MAKE_REFLECT_STRUCT(ConsoleParams, showAnalyzerLogs, showVerboseLogs) struct SonarLintWorkspaceSettings { optional disableTelemetry; optional> connectedMode; optional> rules; optional output; optional pathToNodeExecutable; optional> getConfigurationParameters(std::string const& ruleKey); }; MAKE_REFLECT_STRUCT(SonarLintWorkspaceSettings, disableTelemetry, connectedMode, rules, output, pathToNodeExecutable) DEFINE_REQUEST_RESPONSE_TYPE(slls_listAllRules, JsonNull, lsp::Any, "sonarlint/listAllRules"); DEFINE_NOTIFICATION_TYPE(Notify_didClasspathUpdate, lsDocumentUri, "sonarlint/didClasspathUpdate") DEFINE_NOTIFICATION_TYPE(Notify_didJavaServerModeChange, std::string, "sonarlint/didJavaServerModeChange") DEFINE_REQUEST_RESPONSE_TYPE(slls_showSonarLintOutput, JsonNull, JsonNull, "sonarlint/showSonarLintOutput"); DEFINE_REQUEST_RESPONSE_TYPE(slls_openJavaHomeSettings, JsonNull, JsonNull, "sonarlint/openJavaHomeSettings"); DEFINE_REQUEST_RESPONSE_TYPE(slls_openPathToNodeSettings, JsonNull, JsonNull, "sonarlint/openPathToNodeSettings"); DEFINE_REQUEST_RESPONSE_TYPE( slls_showRuleDescription, ShowRuleDescriptionParams, JsonNull, "sonarlint/showRuleDescription" ); DEFINE_REQUEST_RESPONSE_TYPE(slls_getJavaConfig, lsDocumentUri, GetJavaConfigResponse, "sonarlint/getJavaConfig"); DEFINE_NOTIFICATION_TYPE(slls_setTraceNotification, SetTraceNotificationParams, "$/setTraceNotification") asymptote-3.05/LspCpp/include/LibLsp/lsp/general/0000755000000000000000000000000015031566105020412 5ustar rootrootasymptote-3.05/LspCpp/include/LibLsp/lsp/general/exit.h0000644000000000000000000000030415031566105021531 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/NotificationInMessage.h" /** * A notification to ask the server to exit its process. */ DEFINE_NOTIFICATION_TYPE(Notify_Exit, optional, "exit"); asymptote-3.05/LspCpp/include/LibLsp/lsp/general/progress.h0000644000000000000000000000125515031566105022432 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/NotificationInMessage.h" #include "LibLsp/lsp/lsAny.h" //The base protocol offers also support to report progress in a generic fashion. //This mechanism can be used to report any kind of progress including work done //progress(usually used to report progress in the user interface using a progress bar) //and partial result progress to support streaming of results. struct ProgressParams { std::pair, optional> token; lsp::Any value; MAKE_SWAP_METHOD(ProgressParams, token, value) }; MAKE_REFLECT_STRUCT(ProgressParams, token, value) DEFINE_NOTIFICATION_TYPE(Notify_Progress, ProgressParams, "$/progress"); asymptote-3.05/LspCpp/include/LibLsp/lsp/general/lsWorkspaceClientCapabilites.h0000644000000000000000000001707615031566105026373 0ustar rootroot#pragma once #include "LibLsp/lsp/method_type.h" #include #include "LibLsp/JsonRpc/message.h" #include "LibLsp/lsp/lsDocumentUri.h" #include "LibLsp/lsp/lsAny.h" #include "LibLsp/lsp/extention/jdtls/searchSymbols.h" /** * Capabilities specific to `WorkspaceEdit`s */ //New in version 3.13: ResourceOperationKind and FailureHandlingKind and the client capability workspace.workspaceEdit. //resourceOperations as well as workspace.workspaceEdit.failureHandling. //The capabilities of a workspace edit has evolved over the time. //Clients can describe their support using the following client capability : struct lschangeAnnotationSupport { /** * Whether the client groups edits with equal labels into tree nodes, * for instance all edits labelled with "Changes in Strings" would * be a tree node. */ optional groupsOnLabel; MAKE_SWAP_METHOD(lschangeAnnotationSupport, groupsOnLabel) }; MAKE_REFLECT_STRUCT(lschangeAnnotationSupport, groupsOnLabel) struct WorkspaceEditCapabilities { /** * The client supports versioned document changes in `WorkspaceEdit`s */ optional documentChanges; /** * The client supports resource changes * in `WorkspaceEdit`s. * * @deprecated Since LSP introduces resource operations, use {link #resourceOperations} */ optional resourceChanges; /** * The resource operations the client supports. Clients should at least * support 'create', 'rename' and 'delete' files and folders. * * @since 3.13.0 */ optional> resourceOperations; /** * The failure handling strategy of a client if applying the workspace edit * fails. * * See {@link FailureHandlingKind} for allowed values. */ optional failureHandling; /** * Whether the client normalizes line endings to the client specific * setting. * If set to `true` the client will normalize line ending characters * in a workspace edit to the client specific new line character(s). * * @since 3.16.0 */ optional normalizesLineEndings; ; /** * Whether the client in general supports change annotations on text edits, * create file, rename file and delete file changes. * * @since 3.16.0 */ optional changeAnnotationSupport; MAKE_SWAP_METHOD( WorkspaceEditCapabilities, documentChanges, resourceChanges, resourceOperations, failureHandling, normalizesLineEndings, changeAnnotationSupport ) }; MAKE_REFLECT_STRUCT( WorkspaceEditCapabilities, documentChanges, resourceChanges, resourceOperations, failureHandling, normalizesLineEndings, changeAnnotationSupport ) struct DynamicRegistrationCapabilities { // Did foo notification supports dynamic registration. optional dynamicRegistration; MAKE_SWAP_METHOD(DynamicRegistrationCapabilities, dynamicRegistration); }; MAKE_REFLECT_STRUCT(DynamicRegistrationCapabilities, dynamicRegistration); struct InlayHintLazyProperties { optional> properties; MAKE_SWAP_METHOD(InlayHintLazyProperties, properties) }; MAKE_REFLECT_STRUCT(InlayHintLazyProperties, properties) struct InlayHintClientCapabilities { // Whether inlay hints support dynamic registration. optional dynamicRegistration; optional resolveSupport; MAKE_SWAP_METHOD(InlayHintClientCapabilities, dynamicRegistration, resolveSupport); }; MAKE_REFLECT_STRUCT(InlayHintClientCapabilities, dynamicRegistration, resolveSupport) // Workspace specific client capabilities. struct SymbolKindCapabilities { optional> valueSet; MAKE_SWAP_METHOD(SymbolKindCapabilities, valueSet) }; MAKE_REFLECT_STRUCT(SymbolKindCapabilities, valueSet) struct SymbolCapabilities : public DynamicRegistrationCapabilities { /** * Specific capabilities for the `SymbolKind` in the `workspace/symbol` request. */ optional symbolKind; MAKE_SWAP_METHOD(SymbolCapabilities, symbolKind, dynamicRegistration) }; MAKE_REFLECT_STRUCT(SymbolCapabilities, symbolKind, dynamicRegistration) struct lsFileOperations { /** * Whether the client supports dynamic registration for file * requests/notifications. */ optional dynamicRegistration; /** * The client has support for sending didCreateFiles notifications. */ optional didCreate; /** * The client has support for sending willCreateFiles requests. */ optional willCreate; /** * The client has support for sending didRenameFiles notifications. */ optional didRename; /** * The client has support for sending willRenameFiles requests. */ optional willRename; /** * The client has support for sending didDeleteFiles notifications. */ optional didDelete; /** * The client has support for sending willDeleteFiles requests. */ optional willDelete; MAKE_SWAP_METHOD( lsFileOperations, dynamicRegistration, didCreate, willCreate, didRename, willRename, didDelete, willDelete ) }; MAKE_REFLECT_STRUCT( lsFileOperations, dynamicRegistration, didCreate, willCreate, didRename, willRename, didDelete, willDelete ) struct lsWorkspaceClientCapabilites { // The client supports applying batch edits to the workspace. optional applyEdit; // Capabilities specific to `WorkspaceEdit`s optional workspaceEdit; // Capabilities specific to the `workspace/didChangeConfiguration` // notification. optional didChangeConfiguration; // Capabilities specific to the `workspace/didChangeWatchedFiles` // notification. optional didChangeWatchedFiles; // Capabilities specific to the `workspace/symbol` request. optional symbol; // Capabilities specific to the `workspace/executeCommand` request. optional executeCommand; /** * The client has support for workspace folders. * * Since 3.6.0 */ optional workspaceFolders; /** * The client supports `workspace/configuration` requests. * * Since 3.6.0 */ optional configuration; /** * Capabilities specific to the semantic token requests scoped to the * workspace. * * @since 3.16.0 */ optional semanticTokens; /** * Capabilities specific to the code lens requests scoped to the * workspace. * * @since 3.16.0 */ optional codeLens; /** * The client has support for file requests/notifications. * * @since 3.16.0 */ optional fileOperations; MAKE_SWAP_METHOD( lsWorkspaceClientCapabilites, applyEdit, workspaceEdit, didChangeConfiguration, didChangeWatchedFiles, symbol, executeCommand, workspaceFolders, configuration, semanticTokens, codeLens, fileOperations ) }; MAKE_REFLECT_STRUCT( lsWorkspaceClientCapabilites, applyEdit, workspaceEdit, didChangeConfiguration, didChangeWatchedFiles, symbol, executeCommand, workspaceFolders, configuration, semanticTokens, codeLens, fileOperations ) asymptote-3.05/LspCpp/include/LibLsp/lsp/general/lsClientCapabilities.h0000644000000000000000000000222715031566105024655 0ustar rootroot#pragma once #include "LibLsp/lsp/lsAny.h" #include "lsWorkspaceClientCapabilites.h" #include "lsTextDocumentClientCapabilities.h" /** * Client capabilities specific to the used markdown parser. * * @since 3.16.0 */ struct MarkdownClientCapabilities { /** * The name of the parser. */ std::string parser; /** * The version of the parser. */ optional version; MAKE_SWAP_METHOD(MarkdownClientCapabilities, parser, version) }; MAKE_REFLECT_STRUCT(MarkdownClientCapabilities, parser, version) struct lsClientCapabilities { // Workspace specific client capabilities. optional workspace; // Text document specific client capabilities. optional textDocument; /** * Window specific client capabilities. */ optional window; /** * Experimental client capabilities. */ optional experimental; MAKE_SWAP_METHOD(lsClientCapabilities, workspace, textDocument, window, experimental) }; MAKE_REFLECT_STRUCT(lsClientCapabilities, workspace, textDocument, window, experimental) asymptote-3.05/LspCpp/include/LibLsp/lsp/general/lsServerCapabilities.h0000644000000000000000000004603115031566105024706 0ustar rootroot#pragma once #include "LibLsp/lsp/method_type.h" #include #include "LibLsp/JsonRpc/message.h" #include "LibLsp/lsp/lsDocumentUri.h" #include "LibLsp/lsp/lsAny.h" #include "InitializeParams.h" #include "LibLsp/lsp/textDocument/SemanticTokens.h" extern void Reflect(Reader&, std::pair, optional>&); // // Code Action options. // struct CodeActionOptions : WorkDoneProgressOptions { // // CodeActionKinds that this server may return. // // The list of kinds may be generic, such as `CodeActionKind.Refactor`, or the server // may list out every specific kind they provide. // typedef std::string CodeActionKind; std::vector codeActionKinds; MAKE_SWAP_METHOD(CodeActionOptions, workDoneProgress, codeActionKinds); }; MAKE_REFLECT_STRUCT(CodeActionOptions, workDoneProgress, codeActionKinds) struct CodeLensOptions : WorkDoneProgressOptions { // // Code lens has a resolve provider as well. // optional resolveProvider; MAKE_SWAP_METHOD(CodeLensOptions, workDoneProgress, resolveProvider); }; MAKE_REFLECT_STRUCT(CodeLensOptions, workDoneProgress, resolveProvider) // Format document on type options struct lsDocumentOnTypeFormattingOptions : WorkDoneProgressOptions { // A character on which formatting should be triggered, like `}`. std::string firstTriggerCharacter; // More trigger characters. std::vector moreTriggerCharacter; MAKE_SWAP_METHOD(lsDocumentOnTypeFormattingOptions, workDoneProgress, firstTriggerCharacter, moreTriggerCharacter); }; MAKE_REFLECT_STRUCT(lsDocumentOnTypeFormattingOptions, workDoneProgress, firstTriggerCharacter, moreTriggerCharacter); struct RenameOptions : WorkDoneProgressOptions { // // Renames should be checked and tested before being executed. // optional prepareProvider; MAKE_SWAP_METHOD(RenameOptions, workDoneProgress, prepareProvider); }; MAKE_REFLECT_STRUCT(RenameOptions, workDoneProgress, prepareProvider) struct DocumentFilter { // // A language id, like `typescript`. // optional language; // // A Uri [scheme](#Uri.scheme), like `file` or `untitled`. // optional scheme; // // A glob pattern, like `*.{ts,js}`. // // Glob patterns can have the following syntax: // - `*` to match one or more characters in a path segment // - `?` to match on one character in a path segment // - `**` to match any number of path segments, including none // - `{}` to group sub patterns into an OR expression. (e.g. `**/*.{ts,js} // matches all TypeScript and JavaScript files) // - `[]` to declare a range of characters to match in a path segment // (e.g., `example.[0-9]` to match on `example.0`, `example.1`,...) // - `[!...]` to negate a range of characters to match in a path segment // (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but // not `example.0`) // optional pattern; MAKE_SWAP_METHOD(DocumentFilter, language, scheme, pattern) }; MAKE_REFLECT_STRUCT(DocumentFilter, language, scheme, pattern) //A document selector is the combination of one or more document filters. using DocumentSelector = std::vector; // Document link options struct lsDocumentLinkOptions : WorkDoneProgressOptions { // Document links have a resolve provider as well. optional resolveProvider; MAKE_SWAP_METHOD(lsDocumentLinkOptions, workDoneProgress, resolveProvider); }; MAKE_REFLECT_STRUCT(lsDocumentLinkOptions, workDoneProgress, resolveProvider); // Execute command options. struct lsExecuteCommandOptions : WorkDoneProgressOptions { // The commands to be executed on the server std::vector commands; MAKE_SWAP_METHOD(lsExecuteCommandOptions, workDoneProgress, commands); }; MAKE_REFLECT_STRUCT(lsExecuteCommandOptions, workDoneProgress, commands); struct TextDocumentRegistrationOptions { // // A document selector to identify the scope of the registration. If set to null // the document selector provided on the client side will be used. // optional documentSelector; MAKE_SWAP_METHOD(TextDocumentRegistrationOptions, documentSelector); }; MAKE_REFLECT_STRUCT(TextDocumentRegistrationOptions, documentSelector); // // Static registration options to be returned in the initialize request. // struct StaticRegistrationOptions : public TextDocumentRegistrationOptions { // // The id used to register the request. The id can be used to deregister // the request again. See also Registration#id. // optional id; MAKE_SWAP_METHOD(StaticRegistrationOptions, documentSelector, id) }; MAKE_REFLECT_STRUCT(StaticRegistrationOptions, documentSelector, id) // // The server supports workspace folder. // // Since 3.6.0 // struct WorkspaceFoldersOptions { // // The server has support for workspace folders // optional supported; // // Whether the server wants to receive workspace folder // change notifications. // // If a string is provided, the string is treated as an ID // under which the notification is registered on the client // side. The ID can be used to unregister for these events // using the `client/unregisterCapability` request. // optional, optional>> changeNotifications; MAKE_SWAP_METHOD(WorkspaceFoldersOptions, supported, changeNotifications); }; MAKE_REFLECT_STRUCT(WorkspaceFoldersOptions, supported, changeNotifications); // // A pattern kind describing if a glob pattern matches a file a folder or // both. // // @since 3.16.0 // enum lsFileOperationPatternKind { file, folder }; MAKE_REFLECT_TYPE_PROXY(lsFileOperationPatternKind) // // Matching options for the file operation pattern. // // @since 3.16.0 // struct lsFileOperationPatternOptions { // // The pattern should be matched ignoring casing. // optional ignoreCase; MAKE_SWAP_METHOD(lsFileOperationPatternOptions, ignoreCase) }; MAKE_REFLECT_STRUCT(lsFileOperationPatternOptions, ignoreCase) // // A pattern to describe in which file operation requests or notifications // the server is interested in. // // @since 3.16.0 // struct lsFileOperationPattern { // // The glob pattern to match. Glob patterns can have the following syntax: // - `*` to match one or more characters in a path segment // - `?` to match on one character in a path segment // - `**` to match any number of path segments, including none // - `{}` to group sub patterns into an OR expression. (e.g. `**/*.{ts,js}` // matches all TypeScript and JavaScript files) // - `[]` to declare a range of characters to match in a path segment // (e.g., `example.[0-9]` to match on `example.0`, `example.1`,...) // - `[!...]` to negate a range of characters to match in a path segment // (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but // not `example.0`) // std::string glob; // // Whether to match files or folders with this pattern. // // Matches both if undefined. // optional matches; // // Additional options used during matching. // optional options; MAKE_SWAP_METHOD(lsFileOperationPattern, glob, matches, options) }; MAKE_REFLECT_STRUCT(lsFileOperationPattern, glob, matches, options) // // A filter to describe in which file operation requests or notifications // the server is interested in. // // @since 3.16.0 // struct lsFileOperationFilter { // // A Uri like `file` or `untitled`. // optional scheme; // // The actual file operation pattern. // optional pattern; MAKE_SWAP_METHOD(lsFileOperationFilter, scheme, pattern) }; MAKE_REFLECT_STRUCT(lsFileOperationFilter, scheme, pattern) // // The options to register for file operations. // // @since 3.16.0 // struct lsFileOperationRegistrationOptions { // // The actual filters. // optional> filters; MAKE_SWAP_METHOD(lsFileOperationRegistrationOptions, filters) }; MAKE_REFLECT_STRUCT(lsFileOperationRegistrationOptions, filters) struct WorkspaceServerCapabilities { // // The server supports workspace folder. // // Since 3.6.0 // WorkspaceFoldersOptions workspaceFolders; // // The server is interested in file notifications/requests. // // @since 3.16.0 // struct lsFileOperations { // // The server is interested in receiving didCreateFiles // notifications. // optional didCreate; // // The server is interested in receiving willCreateFiles requests. // optional willCreate; // // The server is interested in receiving didRenameFiles // notifications. // optional didRename; // // The server is interested in receiving willRenameFiles requests. // optional willRename; // // The server is interested in receiving didDeleteFiles file // notifications. // optional didDelete; // // The server is interested in receiving willDeleteFiles file // requests. // optional willDelete; MAKE_SWAP_METHOD(lsFileOperations, didCreate, willCreate, didRename, willRename, didDelete, willDelete) }; optional fileOperations; MAKE_SWAP_METHOD(WorkspaceServerCapabilities, workspaceFolders, fileOperations) }; MAKE_REFLECT_STRUCT(WorkspaceServerCapabilities, workspaceFolders, fileOperations) MAKE_REFLECT_STRUCT( WorkspaceServerCapabilities::lsFileOperations, didCreate, willCreate, didRename, willRename, didDelete, willDelete ) // // Semantic highlighting server capabilities. // //

    // Note: the {@code textDocument/semanticHighlighting} // language feature is not yet part of the official LSP specification. // struct SemanticHighlightingServerCapabilities { // // A "lookup table" of semantic highlighting TextMate scopes // supported by the language server. If not defined or empty, then the server does not support the semantic highlighting // feature. Otherwise, clients should reuse this "lookup table" when receiving semantic highlighting notifications from // the server. // std::vector> scopes; MAKE_SWAP_METHOD(SemanticHighlightingServerCapabilities, scopes) }; MAKE_REFLECT_STRUCT(SemanticHighlightingServerCapabilities, scopes) struct SemanticTokensServerFull { // // The server supports deltas for full documents. // bool delta = false; MAKE_SWAP_METHOD(SemanticTokensServerFull, delta) }; MAKE_REFLECT_STRUCT(SemanticTokensServerFull, delta) struct SemanticTokensWithRegistrationOptions { SemanticTokensLegend legend; // // Server supports providing semantic tokens for a specific range // of a document. // optional, optional>> range; // // Server supports providing semantic tokens for a full document. // optional, optional>> full; // // A document selector to identify the scope of the registration. If set to null // the document selector provided on the client side will be used. // optional> documentSelector; // // The id used to register the request. The id can be used to deregister // the request again. See also Registration#id. // optional id; MAKE_SWAP_METHOD(SemanticTokensWithRegistrationOptions, legend, range, full, documentSelector, id) }; MAKE_REFLECT_STRUCT(SemanticTokensWithRegistrationOptions, legend, range, full, documentSelector, id) using DocumentColorOptions = WorkDoneProgressOptions; using FoldingRangeOptions = WorkDoneProgressOptions; struct InlayHintOptions : WorkDoneProgressOptions { /** * The server provides support to resolve additional * information for an inlay hint item. */ optional resolveProvider; MAKE_SWAP_METHOD(InlayHintOptions, workDoneProgress, resolveProvider); }; MAKE_REFLECT_STRUCT(InlayHintOptions, workDoneProgress, resolveProvider) struct lsServerCapabilities { // Defines how text documents are synced. Is either a detailed structure // defining each notification or for backwards compatibility the // TextDocumentSyncKind number. optional, optional>> textDocumentSync; // The server provides hover support. optional hoverProvider; // The server provides completion support. optional completionProvider; // The server provides signature help support. optional signatureHelpProvider; // The server provides goto definition support. optional, optional>> definitionProvider; // // The server provides Goto Type Definition support. // // Since 3.6.0 // optional, optional>> typeDefinitionProvider; // The server provides implementation support. optional, optional>> implementationProvider; // The server provides find references support. optional, optional>> referencesProvider; // The server provides document highlight support. optional, optional>> documentHighlightProvider; // The server provides document symbol support. optional, optional>> documentSymbolProvider; // The server provides workspace symbol support. optional, optional>> workspaceSymbolProvider; // The server provides code actions. optional, optional>> codeActionProvider; // The server provides code lens. optional codeLensProvider; // The server provides document formatting. optional, optional>> documentFormattingProvider; // The server provides document range formatting. optional, optional>> documentRangeFormattingProvider; // The server provides document formatting on typing. optional documentOnTypeFormattingProvider; // The server provides rename support. optional, optional>> renameProvider; // The server provides document link support. optional documentLinkProvider; // // The server provides color provider support. // // @since 3.6.0 // optional, optional>> colorProvider; // // The server provides folding provider support. // // @since 3.10.0 // optional, optional>> foldingRangeProvider; // The server provides execute command support. optional executeCommandProvider; // // Workspace specific server capabilities // optional workspace; // // Semantic highlighting server capabilities. // optional semanticHighlighting; // // Server capability for calculating super- and subtype hierarchies. // The LS supports the type hierarchy language feature, if this capability is set to {@code true}. // //

    // Note: the {@code textDocument/typeHierarchy} // language feature is not yet part of the official LSP specification. // optional, optional>> typeHierarchyProvider; // // The server provides Call Hierarchy support. // optional, optional>> callHierarchyProvider; // // The server provides selection range support. // // Since 3.15.0 // optional, optional>> selectionRangeProvider; // // The server provides linked editing range support. // // Since 3.16.0 // optional, optional>> linkedEditingRangeProvider; // // The server provides semantic tokens support. // // Since 3.16.0 // optional semanticTokensProvider; // // Whether server provides moniker support. // // Since 3.16.0 // optional, optional>> monikerProvider; /** * The server provides inlay hints. * * @since 3.17.0 */ optional, optional>> inlayHintProvider; optional experimental; MAKE_SWAP_METHOD( lsServerCapabilities, textDocumentSync, hoverProvider, completionProvider, signatureHelpProvider, definitionProvider, typeDefinitionProvider, implementationProvider, referencesProvider, documentHighlightProvider, documentSymbolProvider, workspaceSymbolProvider, codeActionProvider, codeLensProvider, documentFormattingProvider, documentRangeFormattingProvider, documentOnTypeFormattingProvider, renameProvider, documentLinkProvider, executeCommandProvider, workspace, semanticHighlighting, typeHierarchyProvider, callHierarchyProvider, selectionRangeProvider, experimental, colorProvider, foldingRangeProvider, linkedEditingRangeProvider, monikerProvider, semanticTokensProvider ) }; MAKE_REFLECT_STRUCT( lsServerCapabilities, textDocumentSync, hoverProvider, completionProvider, signatureHelpProvider, definitionProvider, typeDefinitionProvider, implementationProvider, referencesProvider, documentHighlightProvider, documentSymbolProvider, workspaceSymbolProvider, codeActionProvider, codeLensProvider, documentFormattingProvider, documentRangeFormattingProvider, documentOnTypeFormattingProvider, renameProvider, documentLinkProvider, executeCommandProvider, workspace, semanticHighlighting, typeHierarchyProvider, callHierarchyProvider, selectionRangeProvider, experimental, colorProvider, foldingRangeProvider, linkedEditingRangeProvider, monikerProvider, semanticTokensProvider ) asymptote-3.05/LspCpp/include/LibLsp/lsp/general/lsTextDocumentClientCapabilities.h0000644000000000000000000005476615031566105027240 0ustar rootroot#pragma once #include "LibLsp/lsp/method_type.h" #include #include "LibLsp/JsonRpc/message.h" #include "LibLsp/lsp/lsDocumentUri.h" #include "LibLsp/lsp/lsAny.h" #include "LibLsp/lsp/extention/jdtls/searchSymbols.h" #include "lsWorkspaceClientCapabilites.h" #include "LibLsp/lsp/lsp_completion.h" #include "LibLsp/lsp/lsp_diagnostic.h" struct WorkDoneProgressOptions { optional workDoneProgress; MAKE_SWAP_METHOD(WorkDoneProgressOptions, workDoneProgress); }; MAKE_REFLECT_STRUCT(WorkDoneProgressOptions, workDoneProgress); // Completion options. struct lsCompletionOptions : WorkDoneProgressOptions { // The server provides support to resolve additional // information for a completion item. optional resolveProvider = false; // // Most tools trigger completion request automatically without explicitly requesting // it using a keyboard shortcut (e.g. Ctrl+Space). Typically they do so when the user // starts to type an identifier. For example if the user types `c` in a JavaScript file // code complete will automatically pop up present `console` besides others as a // completion item. Characters that make up identifiers don't need to be listed here. // // If code complete should automatically be trigger on characters not being valid inside // an identifier (for example `.` in JavaScript) list them in `triggerCharacters`. // // https://github.com/Microsoft/language-server-protocol/issues/138. optional> triggerCharacters; // // The list of all possible characters that commit a completion. This field can be used // if clients don't support individual commmit characters per completion item. See // `ClientCapabilities.textDocument.completion.completionItem.commitCharactersSupport` // optional> allCommitCharacters; MAKE_SWAP_METHOD(lsCompletionOptions, workDoneProgress, resolveProvider, triggerCharacters, allCommitCharacters); }; MAKE_REFLECT_STRUCT(lsCompletionOptions, workDoneProgress, resolveProvider, triggerCharacters, allCommitCharacters); // Save options. struct lsSaveOptions { // The client is supposed to include the content on save. bool includeText = false; void swap(lsSaveOptions& arg) noexcept { auto temp = includeText; includeText = arg.includeText; arg.includeText = temp; } }; MAKE_REFLECT_STRUCT(lsSaveOptions, includeText); // Signature help options. struct lsSignatureHelpOptions : WorkDoneProgressOptions { // The characters that trigger signature help automatically. // NOTE: If updating signature help tokens make sure to also update // WorkingFile::FindClosestCallNameInBuffer. std::vector triggerCharacters; MAKE_SWAP_METHOD(lsSignatureHelpOptions, workDoneProgress, triggerCharacters); }; MAKE_REFLECT_STRUCT(lsSignatureHelpOptions, workDoneProgress, triggerCharacters); // Defines how the host (editor) should sync document changes to the language // server. enum class lsTextDocumentSyncKind { // Documents should not be synced at all. None = 0, // Documents are synced by always sending the full content // of the document. Full = 1, // Documents are synced by sending the full content on open. // After that only incremental updates to the document are // send. Incremental = 2 }; #if _WIN32 MAKE_REFLECT_TYPE_PROXY(lsTextDocumentSyncKind) #else //#pragma clang diagnostic push //#pragma clang diagnostic ignored "-Wunused-function" MAKE_REFLECT_TYPE_PROXY(lsTextDocumentSyncKind) //#pragma clang diagnostic pop #endif struct lsTextDocumentSyncOptions { // Open and close notifications are sent to the server. optional openClose; // Change notificatins are sent to the server. See TextDocumentSyncKind.None, // TextDocumentSyncKind.Full and TextDocumentSyncKindIncremental. optional change; // Will save notifications are sent to the server. optional willSave; // Will save wait until requests are sent to the server. optional willSaveWaitUntil; // Save notifications are sent to the server. optional save; MAKE_SWAP_METHOD(lsTextDocumentSyncOptions, openClose, change, willSave, willSaveWaitUntil, save); }; MAKE_REFLECT_STRUCT(lsTextDocumentSyncOptions, openClose, change, willSave, willSaveWaitUntil, save); struct SynchronizationCapabilities { // Whether text document synchronization supports dynamic registration. optional dynamicRegistration; // The client supports sending will save notifications. optional willSave; // The client supports sending a will save request and // waits for a response providing text edits which will // be applied to the document before it is saved. optional willSaveWaitUntil; // The client supports did save notifications. optional didSave; MAKE_SWAP_METHOD(SynchronizationCapabilities, dynamicRegistration, willSave, willSaveWaitUntil, didSave); }; MAKE_REFLECT_STRUCT(SynchronizationCapabilities, dynamicRegistration, willSave, willSaveWaitUntil, didSave); struct CompletionItemKindCapabilities { optional> valueSet; MAKE_SWAP_METHOD(CompletionItemKindCapabilities, valueSet); }; MAKE_REFLECT_STRUCT(CompletionItemKindCapabilities, valueSet); struct CompletionItemCapabilities { // Client supports snippets as insert text. // // A snippet can define tab stops and placeholders with `$1`, `$2` // and `${3:foo}`. `$0` defines the final tab stop, it defaults to // the end of the snippet. Placeholders with equal identifiers are linked, // that is typing in one will update others too. optional snippetSupport; // Client supports commit characters on a completion item. optional commitCharactersSupport; // Client supports the following content formats for the documentation // property. The order describes the preferred format of the client. optional> documentationFormat; // Client supports the deprecated property on a completion item. optional deprecatedSupport; // // Client supports the preselect property on a completion item. // optional preselectSupport; MAKE_SWAP_METHOD( CompletionItemCapabilities, snippetSupport, commitCharactersSupport, documentationFormat, deprecatedSupport, preselectSupport ); }; MAKE_REFLECT_STRUCT( CompletionItemCapabilities, snippetSupport, commitCharactersSupport, documentationFormat, deprecatedSupport, preselectSupport ); // // Capabilities specific to the `textDocument/completion` // struct CompletionCapabilities { // Whether completion supports dynamic registration. optional dynamicRegistration; // The client supports the following `CompletionItem` specific // capabilities. optional completionItem; // // The client supports the following `CompletionItemKind` specific // capabilities. // optional completionItemKind; // // The client supports sending additional context information for a // `textDocument/completion` request. // optional contextSupport; MAKE_SWAP_METHOD(CompletionCapabilities, dynamicRegistration, completionItem, completionItemKind); }; MAKE_REFLECT_STRUCT(CompletionCapabilities, dynamicRegistration, completionItem, completionItemKind); struct HoverCapabilities : public DynamicRegistrationCapabilities { // // Client supports the following content formats for the content // property. The order describes the preferred format of the client. // // See {@link MarkupKind} for allowed values. // optional> contentFormat; MAKE_SWAP_METHOD(HoverCapabilities, dynamicRegistration, contentFormat); }; MAKE_REFLECT_STRUCT(HoverCapabilities, dynamicRegistration, contentFormat); // // Client capabilities specific to parameter information. // struct ParameterInformationCapabilities { // // The client supports processing label offsets instead of a // simple label string. // // Since 3.14.0 // optional labelOffsetSupport; MAKE_SWAP_METHOD(ParameterInformationCapabilities, labelOffsetSupport); }; MAKE_REFLECT_STRUCT(ParameterInformationCapabilities, labelOffsetSupport) struct SignatureInformationCapabilities { // // Client supports the following content formats for the documentation // property. The order describes the preferred format of the client. // // See {@link MarkupKind} for allowed values. // std::vector documentationFormat; // // Client capabilities specific to parameter information. // ParameterInformationCapabilities parameterInformation; MAKE_SWAP_METHOD(SignatureInformationCapabilities, documentationFormat, parameterInformation) }; MAKE_REFLECT_STRUCT(SignatureInformationCapabilities, documentationFormat, parameterInformation) struct SignatureHelpCapabilities : public DynamicRegistrationCapabilities { // // The client supports the following `SignatureInformation` // specific properties. // optional signatureInformation; MAKE_SWAP_METHOD(SignatureHelpCapabilities, dynamicRegistration, signatureInformation) }; MAKE_REFLECT_STRUCT(SignatureHelpCapabilities, dynamicRegistration, signatureInformation) struct DocumentSymbolCapabilities : public DynamicRegistrationCapabilities { // // Specific capabilities for the `SymbolKind`. // optional symbolKind; // // The client support hierarchical document symbols. // optional hierarchicalDocumentSymbolSupport; MAKE_SWAP_METHOD(DocumentSymbolCapabilities, dynamicRegistration, symbolKind, hierarchicalDocumentSymbolSupport) }; MAKE_REFLECT_STRUCT(DocumentSymbolCapabilities, dynamicRegistration, symbolKind, hierarchicalDocumentSymbolSupport) struct DeclarationCapabilities : public DynamicRegistrationCapabilities { // // The client supports additional metadata in the form of declaration links. // optional linkSupport; MAKE_SWAP_METHOD(DeclarationCapabilities, dynamicRegistration, linkSupport); }; MAKE_REFLECT_STRUCT(DeclarationCapabilities, dynamicRegistration, linkSupport) struct CodeActionKindCapabilities { // // The code action kind values the client supports. When this // property exists the client also guarantees that it will // handle values outside its set gracefully and falls back // to a default value when unknown. // // See {@link CodeActionKind} for allowed values. // optional> valueSet; MAKE_SWAP_METHOD(CodeActionKindCapabilities, valueSet) }; MAKE_REFLECT_STRUCT(CodeActionKindCapabilities, valueSet) struct CodeActionLiteralSupportCapabilities { optional codeActionKind; MAKE_SWAP_METHOD(CodeActionLiteralSupportCapabilities, codeActionKind) }; MAKE_REFLECT_STRUCT(CodeActionLiteralSupportCapabilities, codeActionKind) struct CodeActionCapabilities : public DynamicRegistrationCapabilities { // // The client support code action literals as a valid // response of the `textDocument/codeAction` request. // optional codeActionLiteralSupport; MAKE_SWAP_METHOD(CodeActionCapabilities, dynamicRegistration, codeActionLiteralSupport) }; MAKE_REFLECT_STRUCT(CodeActionCapabilities, dynamicRegistration, codeActionLiteralSupport) struct RenameCapabilities : public DynamicRegistrationCapabilities { // // The client support code action literals as a valid // response of the `textDocument/codeAction` request. // optional prepareSupport; MAKE_SWAP_METHOD(RenameCapabilities, dynamicRegistration, prepareSupport) }; MAKE_REFLECT_STRUCT(RenameCapabilities, dynamicRegistration, prepareSupport) struct DiagnosticsTagSupport { /** * The tags supported by the client. */ std::vector valueSet; MAKE_SWAP_METHOD(DiagnosticsTagSupport, valueSet) }; MAKE_REFLECT_STRUCT(DiagnosticsTagSupport, valueSet) struct PublishDiagnosticsClientCapabilities : public DynamicRegistrationCapabilities { /** * The client support code action literals as a valid * response of the `textDocument/codeAction` request. */ optional relatedInformation; /** * Client supports the tag property to provide meta data about a diagnostic. * Clients supporting tags have to handle unknown tags gracefully. * * This property had been added and implemented as boolean before it was * added to the specification as {@link DiagnosticsTagSupport}. In order to * keep this implementation compatible with intermediate clients (including * vscode-language-client < 6.0.0) we add an either type here. * * Since 3.15 */ optional, optional>> tagSupport; /** * Whether the client interprets the version property of the * `textDocument/publishDiagnostics` notification's parameter. * * Since 3.15.0 */ optional versionSupport; /** * Client supports a codeDescription property * * @since 3.16.0 */ optional codeDescriptionSupport; /** * Whether code action supports the `data` property which is * preserved between a `textDocument/publishDiagnostics` and * `textDocument/codeAction` request. * * @since 3.16.0 */ optional dataSupport; MAKE_SWAP_METHOD( PublishDiagnosticsClientCapabilities, dynamicRegistration, relatedInformation, tagSupport, versionSupport, codeDescriptionSupport, dataSupport ) }; MAKE_REFLECT_STRUCT( PublishDiagnosticsClientCapabilities, dynamicRegistration, relatedInformation, tagSupport, versionSupport, codeDescriptionSupport, dataSupport ) struct FoldingRangeCapabilities : public DynamicRegistrationCapabilities { // // The maximum number of folding ranges that the client prefers to receive per document. The value serves as a // hint, servers are free to follow the limit. // optional rangeLimit; // // If set, the client signals that it only supports folding complete lines. If set, client will // ignore specified `startCharacter` and `endCharacter` properties in a FoldingRange. // optional lineFoldingOnly; MAKE_SWAP_METHOD(FoldingRangeCapabilities, dynamicRegistration, rangeLimit, lineFoldingOnly) }; MAKE_REFLECT_STRUCT(FoldingRangeCapabilities, dynamicRegistration, rangeLimit, lineFoldingOnly) struct SemanticHighlightingCapabilities : public DynamicRegistrationCapabilities { // // The client support code action literals as a valid // response of the `textDocument/codeAction` request. // optional semanticHighlighting; MAKE_SWAP_METHOD(SemanticHighlightingCapabilities, dynamicRegistration, semanticHighlighting) }; MAKE_REFLECT_STRUCT(SemanticHighlightingCapabilities, dynamicRegistration, semanticHighlighting) struct SemanticTokensClientCapabilitiesRequestsFull { // // The client will send the `textDocument/semanticTokens/full/delta` request if // the server provides a corresponding handler. // bool delta = false; MAKE_SWAP_METHOD(SemanticTokensClientCapabilitiesRequestsFull, delta) }; MAKE_REFLECT_STRUCT(SemanticTokensClientCapabilitiesRequestsFull, delta) struct SemanticTokensClientCapabilities : public DynamicRegistrationCapabilities { //export TokenFormat = 'relative'; struct lsRequests { // // The client will send the `textDocument/semanticTokens/range` request // if the server provides a corresponding handler. // optional, optional>> range; // // The client will send the `textDocument/semanticTokens/full` request // if the server provides a corresponding handler. // optional, optional>> full; MAKE_SWAP_METHOD(lsRequests, range, full) }; lsRequests requests; // // The token types that the client supports. // std::vector tokenTypes; // // The token modifiers that the client supports. // std::vector tokenModifiers; // // The formats the clients supports. // std::vector formats; // // Whether the client supports tokens that can overlap each other. // optional overlappingTokenSupport; // // Whether the client supports tokens that can span multiple lines. // optional multilineTokenSupport; MAKE_SWAP_METHOD( SemanticTokensClientCapabilities, dynamicRegistration, requests, tokenTypes, tokenModifiers, formats, overlappingTokenSupport, multilineTokenSupport ) }; MAKE_REFLECT_STRUCT(SemanticTokensClientCapabilities::lsRequests, range, full) MAKE_REFLECT_STRUCT( SemanticTokensClientCapabilities, dynamicRegistration, requests, tokenTypes, tokenModifiers, formats, overlappingTokenSupport, multilineTokenSupport ) // Text document specific client capabilities. struct lsTextDocumentClientCapabilities { SynchronizationCapabilities synchronization; // Capabilities specific to the `textDocument/completion` optional completion; // Capabilities specific to the `textDocument/hover` optional hover; // Capabilities specific to the `textDocument/signatureHelp` optional signatureHelp; // Capabilities specific to the `textDocument/references` optional references; // Capabilities specific to the `textDocument/documentHighlight` optional documentHighlight; // Capabilities specific to the `textDocument/documentSymbol` optional documentSymbol; // Capabilities specific to the `textDocument/formatting` optional formatting; // Capabilities specific to the `textDocument/rangeFormatting` optional rangeFormatting; // Capabilities specific to the `textDocument/onTypeFormatting` optional onTypeFormatting; // // Capabilities specific to the `textDocument/declaration` // // Since 3.14.0 // optional declaration; typedef DeclarationCapabilities DefinitionCapabilities; // Capabilities specific to the `textDocument/definition` optional definition; // // Capabilities specific to the `textDocument/typeDefinition` // // Since 3.6.0 // typedef DeclarationCapabilities TypeDefinitionCapabilities; optional typeDefinition; typedef DeclarationCapabilities ImplementationCapabilities; // Capabilities specific to the `textDocument/implementation` optional implementation; // Capabilities specific to the `textDocument/codeAction` optional codeAction; // Capabilities specific to the `textDocument/codeLens` optional codeLens; // Capabilities specific to the `textDocument/documentLink` optional documentLink; // // Capabilities specific to the `textDocument/documentColor` and the // `textDocument/colorPresentation` request. // // Since 3.6.0 // optional colorProvider; // Capabilities specific to the `textDocument/rename` optional rename; // // Capabilities specific to `textDocument/publishDiagnostics`. // optional publishDiagnostics; // // Capabilities specific to `textDocument/foldingRange` requests. // // Since 3.10.0 // optional foldingRange; // // Capabilities specific to {@code textDocument/semanticHighlighting}. // optional semanticHighlightingCapabilities; // // Capabilities specific to {@code textDocument/typeHierarchy}. // optional typeHierarchyCapabilities; // // Capabilities specific to `textDocument/selectionRange` requests // optional selectionRange; // // Capabilities specific to the `textDocument/linkedEditingRange` request. // // @since 3.16.0 // optional linkedEditingRange; // // Capabilities specific to the various call hierarchy requests. // // @since 3.16.0 // optional callHierarchy; // // Capabilities specific to the various semantic token requests. // // @since 3.16.0 // optional semanticTokens; // // Capabilities specific to the `textDocument/moniker` request. // // @since 3.16.0 // optional moniker; // // Capabilities specific to the `textDocument/inlayHint` request. // // @since 3.17.0 // optional inlayHint; MAKE_SWAP_METHOD( lsTextDocumentClientCapabilities, synchronization, completion, hover, signatureHelp, implementation, references, documentHighlight, documentSymbol, formatting, rangeFormatting, onTypeFormatting, declaration, definition, typeDefinition, implementation, codeAction, codeLens, documentLink, colorProvider, rename, publishDiagnostics, foldingRange, semanticHighlightingCapabilities, typeHierarchyCapabilities, callHierarchy, selectionRange, linkedEditingRange, semanticTokens, moniker, inlayHint ) }; MAKE_REFLECT_STRUCT( lsTextDocumentClientCapabilities, synchronization, completion, hover, signatureHelp, implementation, references, documentHighlight, documentSymbol, formatting, rangeFormatting, onTypeFormatting, declaration, definition, typeDefinition, implementation, codeAction, codeLens, documentLink, colorProvider, rename, publishDiagnostics, foldingRange, semanticHighlightingCapabilities, typeHierarchyCapabilities, callHierarchy, selectionRange, linkedEditingRange, semanticTokens, moniker, inlayHint ) asymptote-3.05/LspCpp/include/LibLsp/lsp/general/InitializeParams.h0000644000000000000000000000637015031566105024036 0ustar rootroot#pragma once #include "LibLsp/lsp/lsDocumentUri.h" #include "LibLsp/lsp/lsAny.h" #include "lsClientCapabilities.h" #include "LibLsp/lsp/workspace/workspaceFolders.h" struct ClientInfo { std::string name; optional version; MAKE_SWAP_METHOD(ClientInfo, name, version); }; MAKE_REFLECT_STRUCT(ClientInfo, name, version); struct lsInitializeParams { // The process Id of the parent process that started // the server. Is null if the process has not been started by another process. // If the parent process is not alive then the server should exit (see exit // notification) its process. optional processId; /** * Information about the client * * @since 3.15.0 */ optional clientInfo; /** * The locale the client is currently showing the user interface * in. This must not necessarily be the locale of the operating * system. * * Uses IETF language tags as the value's syntax * (See https://en.wikipedia.org/wiki/IETF_language_tag) * * @since 3.16.0 */ optional locale; // The rootPath of the workspace. Is null // if no folder is open. // // @deprecated in favour of rootUri. optional rootPath; // The rootUri of the workspace. Is null if no // folder is open. If both `rootPath` and `rootUri` are set // `rootUri` wins. optional rootUri; // User provided initialization options. optional initializationOptions; // The capabilities provided by the client (editor or tool) lsClientCapabilities capabilities; /** * An optional extension to the protocol. * To tell the server what client (editor) is talking to it. */ // @Deprecated optional clientName; enum class lsTrace { // NOTE: serialized as a string, one of 'off' | 'messages' | 'verbose'; Off, // off Messages, // messages Verbose // verbose }; // The initial trace setting. If omitted trace is disabled ('off'). lsTrace trace = lsTrace::Off; /** * The workspace folders configured in the client when the server starts. * This property is only available if the client supports workspace folders. * It can be `null` if the client supports workspace folders but none are * configured. * * Since 3.6.0 */ optional> workspaceFolders; MAKE_SWAP_METHOD( lsInitializeParams, processId, rootPath, rootUri, initializationOptions, capabilities, clientName, clientInfo, trace, workspaceFolders, locale ) }; void Reflect(Reader& reader, lsInitializeParams::lsTrace& value); void Reflect(Writer& writer, lsInitializeParams::lsTrace& value); MAKE_REFLECT_STRUCT( lsInitializeParams, processId, rootPath, rootUri, initializationOptions, capabilities, clientName, clientInfo, trace, workspaceFolders, locale ) struct lsInitializeError { // Indicates whether the client should retry to send the // initilize request after showing the message provided // in the ResponseError. bool retry; void swap(lsInitializeError& arg) noexcept { auto tem = retry; retry = arg.retry; arg.retry = tem; } }; MAKE_REFLECT_STRUCT(lsInitializeError, retry); asymptote-3.05/LspCpp/include/LibLsp/lsp/general/initialized.h0000644000000000000000000000074015031566105023071 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/NotificationInMessage.h" /** * The initialized notification is sent from the client to the server after * the client received the result of the initialize request but before the * client is sending any other request or notification to the server. The * server can use the initialized notification for example to dynamically * register capabilities. */ DEFINE_NOTIFICATION_TYPE(Notify_InitializedNotification, JsonNull, "initialized"); asymptote-3.05/LspCpp/include/LibLsp/lsp/general/shutdown.h0000644000000000000000000000072715031566105022444 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/JsonRpc/RequestInMessage.h" /** * The shutdown request is sent from the client to the server. It asks the * server to shutdown, but to not exit (otherwise the response might not be * delivered correctly to the client). There is a separate exit notification * that asks the server to exit. */ DEFINE_REQUEST_RESPONSE_TYPE(td_shutdown, optional, optional, "shutdown"); asymptote-3.05/LspCpp/include/LibLsp/lsp/general/initialize.h0000644000000000000000000000254115031566105022726 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/message.h" #include "InitializeParams.h" #include "lsServerCapabilities.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/JsonRpc/RequestInMessage.h" /** * The capabilities the language server provides. */ struct InitializeResult { lsServerCapabilities capabilities; MAKE_SWAP_METHOD(InitializeResult, capabilities); }; MAKE_REFLECT_STRUCT(InitializeResult, capabilities); /** * The initialize request is sent as the first request from the client to * the server. * * If the server receives request or notification before the initialize request it should act as follows: * - for a request the respond should be errored with code: -32001. The message can be picked by the server. * - notifications should be dropped, except for the exit notification. This will allow the exit a server without an initialize request. * * Until the server has responded to the initialize request with an InitializeResult * the client must not sent any additional requests or notifications to the server. * * During the initialize request the server is allowed to sent the notifications window/showMessage, * window/logMessage and telemetry/event as well as the window/showMessageRequest request to the client. */ DEFINE_REQUEST_RESPONSE_TYPE(td_initialize, lsInitializeParams, InitializeResult, "initialize"); asymptote-3.05/LspCpp/include/LibLsp/lsp/lsTextDocumentEdit.h0000644000000000000000000000137715031566105022746 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include #include "LibLsp/JsonRpc/message.h" #include "lsVersionedTextDocumentIdentifier.h" #include "lsTextEdit.h" struct lsTextDocumentEdit { // The text document to change. lsVersionedTextDocumentIdentifier textDocument; /** * The edits to be applied. * * @since 3.16.0 - support for AnnotatedTextEdit. This is guarded by the * client capability `workspace.workspaceEdit.changeAnnotationSupport` */ // The edits to be applied. std::vector edits; MAKE_SWAP_METHOD(lsTextDocumentEdit, textDocument, edits); }; MAKE_REFLECT_STRUCT(lsTextDocumentEdit, textDocument, edits); asymptote-3.05/LspCpp/include/LibLsp/lsp/out_list.h0000644000000000000000000000106215031566105021007 0ustar rootroot#pragma once #include "location_type.h" #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" //DEFINE_RESPONCE_TYPE(Rsp_FindLinkLocationList, std::vector); //DEFINE_RESPONCE_TYPE(Rsp_LocationList, std::vector); namespace LocationListEither { typedef std::pair>, optional>> Either; }; extern void Reflect(Reader& visitor, LocationListEither::Either& value); //DEFINE_RESPONCE_TYPE(Rsp_LocationListEither, LocationListEither::Either); asymptote-3.05/LspCpp/include/LibLsp/lsp/lsp_diagnostic.h0000644000000000000000000000761415031566105022160 0ustar rootroot#pragma once #include #include "lsRange.h" #include "lsTextEdit.h" #include "lsDocumentUri.h" #include "lsResponseError.h" #include "location_type.h" #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" enum class lsDiagnosticSeverity { // Reports an error. Error = 1, // Reports a warning. Warning = 2, // Reports an information. Information = 3, // Reports a hint. Hint = 4 }; MAKE_REFLECT_TYPE_PROXY(lsDiagnosticSeverity); /** * The diagnostic tags. * * @since 3.15.0 */ enum class DiagnosticTag : uint8_t { /** * Unused or unnecessary code. * * Clients are allowed to render diagnostics with this tag faded out instead of having * an error squiggle. */ Unnecessary = (1), /** * Deprecated or obsolete code. * * Clients are allowed to rendered diagnostics with this tag strike through. */ Deprecated = (2), }; MAKE_REFLECT_TYPE_PROXY(DiagnosticTag); /** * Represents a related message and source code location for a diagnostic. This should be * used to point to code locations that cause or related to a diagnostics, e.g when duplicating * a symbol in a scope. * * Since 3.7.0 */ struct DiagnosticRelatedInformation { /** * The location of this related diagnostic information. */ lsLocation location; /** * The message of this related diagnostic information. */ std::string message; MAKE_SWAP_METHOD(DiagnosticRelatedInformation, location, message) }; MAKE_REFLECT_STRUCT(DiagnosticRelatedInformation, location, message) /** * Structure to capture a description for an error code. * * @since 3.16.0 */ struct DiagnosticCodeDescription { /** * An URI to open with more information about the diagnostic error. */ std::string href; MAKE_SWAP_METHOD(DiagnosticCodeDescription, href) }; MAKE_REFLECT_STRUCT(DiagnosticCodeDescription, href) //Represents a diagnostic, such as a compiler error or warning.Diagnostic objects are only valid in the scope of a resource. struct lsDiagnostic { // The range at which the message applies. lsRange range; // The diagnostic's severity. Can be omitted. If omitted it is up to the // client to interpret diagnostics as error, warning, info or hint. optional severity; // The diagnostic's code. Can be omitted. optional, optional>> code; optional codeDescription; // A human-readable string describing the source of this // diagnostic, e.g. 'typescript' or 'super lint'. optional source; // The diagnostic's message. std::string message; // Non-serialized set of fixits. std::vector fixits_; /** * Additional metadata about the diagnostic. * * @since 3.15.0 */ optional> tags; /** * An array of related diagnostic information, e.g. when symbol-names within a scope collide * all definitions can be marked via this property. * * Since 3.7.0 */ optional> relatedInformation; /** * A data entry field that is preserved between a * `textDocument/publishDiagnostics` notification and * `textDocument/codeAction` request. * * @since 3.16.0 */ optional data; bool operator==(lsDiagnostic const& rhs) const; bool operator!=(lsDiagnostic const& rhs) const; MAKE_SWAP_METHOD(lsDiagnostic, range, severity, code, codeDescription, source, message, tags, data) }; MAKE_REFLECT_STRUCT(lsDiagnostic, range, severity, code, codeDescription, source, message, tags, data) struct Rsp_Error : ResponseError { MAKE_SWAP_METHOD(Rsp_Error, jsonrpc, id, error) }; MAKE_REFLECT_STRUCT(Rsp_Error, jsonrpc, id, error) asymptote-3.05/LspCpp/include/LibLsp/lsp/lsTextDocumentPositionParams.h0000644000000000000000000000126215031566105025022 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/message.h" #include "lsTextDocumentIdentifier.h" #include "lsPosition.h" /** * A parameter literal used in requests to pass a text document and a position inside that document. */ struct lsTextDocumentPositionParams { // The text document. lsTextDocumentIdentifier textDocument; // The position inside the text document. lsPosition position; /** * Legacy property to support protocol version 1.0 requests. */ optional uri; MAKE_SWAP_METHOD(lsTextDocumentPositionParams, textDocument, position, uri); }; MAKE_REFLECT_STRUCT(lsTextDocumentPositionParams, textDocument, position, uri); asymptote-3.05/LspCpp/include/LibLsp/lsp/lsMarkedString.h0000644000000000000000000000217015031566105022077 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include #include // MarkedString can be used to render human readable text. It is either a // markdown string or a code-block that provides a language and a code snippet. // The language identifier is sematically equal to the optional language // identifier in fenced code blocks in GitHub issues. See // https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting // // The pair of a language and a value is an equivalent to markdown: // ```${language} // ${value} // ``` // // Note that markdown strings will be sanitized - that means html will be // escaped. struct lsMarkedString { optional language; std::string value; }; struct MarkupContent { /** * The type of the Markup. */ std::string kind; /** * The content itself. */ std::string value; MAKE_SWAP_METHOD(MarkupContent, kind, value); }; MAKE_REFLECT_STRUCT(MarkupContent, kind, value); void Reflect(Writer& visitor, lsMarkedString& value); void Reflect(Reader& visitor, lsMarkedString& value); asymptote-3.05/LspCpp/include/LibLsp/lsp/lsCodeAction.h0000644000000000000000000000241015031566105021512 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include #include #include "lsPosition.h" #include "lsWorkspaceEdit.h" #include "lsp_diagnostic.h" #include "lsCommand.h" struct CodeAction { /** * A short, human-readable, title for this code action. */ std::string title; /** * The kind of the code action. * * Used to filter code actions. */ optional kind; /** * The diagnostics that this code action resolves. */ optional> diagnostics; /** * The workspace edit this code action performs. */ optional edit; /** * A command this code action executes. If a code action * provides a edit and a command, first the edit is * executed and then the command. */ optional command; MAKE_SWAP_METHOD(CodeAction, title, kind, diagnostics, edit, command) }; MAKE_REFLECT_STRUCT(CodeAction, title, kind, diagnostics, edit, command) struct TextDocumentCodeAction { typedef std::pair, optional> Either; }; extern void Reflect(Reader& visitor, TextDocumentCodeAction::Either& value); asymptote-3.05/LspCpp/include/LibLsp/lsp/workspace/0000755000000000000000000000000015031566105020773 5ustar rootrootasymptote-3.05/LspCpp/include/LibLsp/lsp/workspace/did_change_watched_files.h0000644000000000000000000000253315031566105026075 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/NotificationInMessage.h" #include "LibLsp/lsp/lsDocumentUri.h" enum class lsFileChangeType { Created = 1, Changed = 2, Deleted = 3, }; #ifdef _WIN32 MAKE_REFLECT_TYPE_PROXY(lsFileChangeType); #else //#pragma clang diagnostic push //#pragma clang diagnostic ignored "-Wunused-function" MAKE_REFLECT_TYPE_PROXY(lsFileChangeType); //#pragma clang diagnostic pop #endif /** * An event describing a file change. */ struct lsFileEvent { lsDocumentUri uri; lsFileChangeType type; MAKE_SWAP_METHOD(lsFileEvent, uri, type) }; MAKE_REFLECT_STRUCT(lsFileEvent, uri, type); struct lsDidChangeWatchedFilesParams { std::vector changes; MAKE_SWAP_METHOD(lsDidChangeWatchedFilesParams, changes); }; MAKE_REFLECT_STRUCT(lsDidChangeWatchedFilesParams, changes); /** * The workspace/didChangeWorkspaceFolders notification is sent from the client * to the server to inform the server about workspace folder configuration changes. * The notification is sent by default if both ServerCapabilities/workspaceFolders * and ClientCapabilities/workspace/workspaceFolders are true; or if the server has * registered to receive this notification it first. */ DEFINE_NOTIFICATION_TYPE( Notify_WorkspaceDidChangeWatchedFiles, lsDidChangeWatchedFilesParams, "workspace/didChangeWatchedFiles" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/workspace/configuration.h0000644000000000000000000000230115031566105024007 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsDocumentUri.h" struct ConfigurationItem { /** * The scope to get the configuration section for. */ lsDocumentUri scopeUri; /** * The configuration section asked for. */ std::string section; MAKE_SWAP_METHOD(ConfigurationItem, scopeUri, section); }; MAKE_REFLECT_STRUCT(ConfigurationItem, scopeUri, section); struct ConfigurationParams { std::vector items; MAKE_SWAP_METHOD(ConfigurationParams, items) }; MAKE_REFLECT_STRUCT(ConfigurationParams, items); /** * The workspace/configuration request is sent from the server to the client to fetch * configuration settings from the client. The request can fetch n configuration settings * in one roundtrip. The order of the returned configuration settings correspond to the * order of the passed ConfigurationItems (e.g. the first item in the response is the * result for the first configuration item in the params). */ DEFINE_REQUEST_RESPONSE_TYPE( WorkspaceConfiguration, ConfigurationParams, std::vector, "workspace/configuration" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/workspace/workspaceFolders.h0000644000000000000000000000172715031566105024470 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsDocumentUri.h" struct WorkspaceFolder { /** * The associated URI for this workspace folder. */ lsDocumentUri uri; /** * The name of the workspace folder. Defaults to the uri's basename. */ std::string name; MAKE_SWAP_METHOD(WorkspaceFolder, uri, name) }; MAKE_REFLECT_STRUCT(WorkspaceFolder, uri, name); /** * The workspace/workspaceFolders request is sent from the server to the client * to fetch the current open list of workspace folders. * * @return null in the response if only a single file is open in the tool, * an empty array if a workspace is open but no folders are configured, * the workspace folders otherwise. */ DEFINE_REQUEST_RESPONSE_TYPE( WorkspaceFolders, optional, optional>, "workspace/workspaceFolders" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/workspace/did_change_configuration.h0000644000000000000000000000113515031566105026140 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/NotificationInMessage.h" #include "workspaceFolders.h" struct lsDidChangeConfigurationParams { /** * The actual changed settings. */ lsp::Any settings; MAKE_SWAP_METHOD(lsDidChangeConfigurationParams, settings); }; MAKE_REFLECT_STRUCT(lsDidChangeConfigurationParams, settings); /** * A notification sent from the client to the server to signal the change of * configuration settings. */ DEFINE_NOTIFICATION_TYPE( Notify_WorkspaceDidChangeConfiguration, lsDidChangeConfigurationParams, "workspace/didChangeConfiguration" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/workspace/applyEdit.h0000644000000000000000000000216115031566105023077 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsDocumentUri.h" #include "LibLsp/lsp/lsWorkspaceEdit.h" struct ApplyWorkspaceEditParams { /** * The edits to apply. */ lsWorkspaceEdit edit; /** * An optional label of the workspace edit. This label is * presented in the user interface for example on an undo * stack to undo the workspace edit. */ std::string label; MAKE_SWAP_METHOD(ApplyWorkspaceEditParams, edit, label) }; /** * The workspace/applyEdit request is sent from the server to the client to modify resource on the client side. */ MAKE_REFLECT_STRUCT(ApplyWorkspaceEditParams, edit, label); struct ApplyWorkspaceEditResponse { bool applied; optional failureReason; MAKE_SWAP_METHOD(ApplyWorkspaceEditResponse, applied, failureReason) }; MAKE_REFLECT_STRUCT(ApplyWorkspaceEditResponse, applied, failureReason); DEFINE_REQUEST_RESPONSE_TYPE( WorkspaceApply, ApplyWorkspaceEditParams, ApplyWorkspaceEditResponse, "workspace/applyEdit" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/workspace/symbol.h0000644000000000000000000000065315031566105022455 0ustar rootroot#pragma once #include "LibLsp/lsp/symbol.h" #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" /** * The workspace symbol request is sent from the client to the server to * list project-wide symbols matching the query string. * * Registration Options: void */ DEFINE_REQUEST_RESPONSE_TYPE(wp_symbol, WorkspaceSymbolParams, std::vector, "workspace/symbol"); asymptote-3.05/LspCpp/include/LibLsp/lsp/workspace/didChangeWorkspaceFolders.h0000644000000000000000000000254615031566105026217 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/NotificationInMessage.h" #include "LibLsp/lsp/workspace/workspaceFolders.h" /** * The workspace folder change event. */ struct WorkspaceFoldersChangeEvent { /** * The array of added workspace folders */ std::vector added; /** * The array of the removed workspace folders */ std::vector removed; MAKE_SWAP_METHOD(WorkspaceFoldersChangeEvent, added, removed); }; MAKE_REFLECT_STRUCT(WorkspaceFoldersChangeEvent, added, removed); struct DidChangeWorkspaceFoldersParams { /** * The actual workspace folder change event. */ WorkspaceFoldersChangeEvent event; MAKE_SWAP_METHOD(DidChangeWorkspaceFoldersParams, event); }; MAKE_REFLECT_STRUCT(DidChangeWorkspaceFoldersParams, event); /** * The workspace/didChangeWorkspaceFolders notification is sent from the client * to the server to inform the server about workspace folder configuration changes. * The notification is sent by default if both ServerCapabilities/workspaceFolders * and ClientCapabilities/workspace/workspaceFolders are true; or if the server has * registered to receive this notification it first. */ DEFINE_NOTIFICATION_TYPE( Notify_WorkspaceDidChangeWorkspaceFolders, DidChangeWorkspaceFoldersParams, "workspace/didChangeWorkspaceFolders" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/workspace/execute_command.h0000644000000000000000000000143015031566105024302 0ustar rootroot#pragma once #include "LibLsp/lsp/ExecuteCommandParams.h" #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/JsonRpc/NotificationInMessage.h" /** * The workspace/executeCommand request is sent from the client to the * server to trigger command execution on the server. In most cases the * server creates a WorkspaceEdit structure and applies the changes to the * workspace using the request workspace/applyEdit which is sent from the * server to the client. * * Registration Options: ExecuteCommandRegistrationOptions */ DEFINE_REQUEST_RESPONSE_TYPE(wp_executeCommand, ExecuteCommandParams, lsp::Any, "workspace/executeCommand"); DEFINE_NOTIFICATION_TYPE(Notify_sendNotification, ExecuteCommandParams, "workspace/notify") asymptote-3.05/LspCpp/include/LibLsp/lsp/client/0000755000000000000000000000000015031566105020253 5ustar rootrootasymptote-3.05/LspCpp/include/LibLsp/lsp/client/unregisterCapability.h0000644000000000000000000000207215031566105024616 0ustar rootroot#pragma once #include "LibLsp/lsp/lsDocumentUri.h" #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" /** * General parameters to unregister a capability. */ struct Unregistration { /** * The id used to unregister the request or notification. Usually an id * provided during the register request. */ std::string id; /** * The method / capability to unregister for. */ std::string method; MAKE_SWAP_METHOD(Unregistration, id, method); }; MAKE_REFLECT_STRUCT(Unregistration, id, method); /** * The client/unregisterCapability request is sent from the server to the client to unregister * a previously registered capability. */ struct UnregistrationParams { std::vector unregisterations; MAKE_SWAP_METHOD(UnregistrationParams, unregisterations); }; MAKE_REFLECT_STRUCT(UnregistrationParams, unregisterations); DEFINE_REQUEST_RESPONSE_TYPE( Req_ClientUnregisterCapability, UnregistrationParams, JsonNull, "client/unregisterCapability" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/client/registerCapability.h0000644000000000000000000000313115031566105024250 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/message.h" #include "LibLsp/lsp/lsDocumentUri.h" /** * General parameters to register for a capability. */ struct Registration { static Registration Create(std::string const& method); /** * The id used to register the request. The id can be used to deregister * the request again. */ std::string id; /** * The method / capability to register for. */ std::string method; MAKE_SWAP_METHOD(Registration, id, method); }; MAKE_REFLECT_STRUCT(Registration, id, method); /** * The client/registerCapability request is sent from the server to the client to register * for a new capability on the client side. Not all clients need to support dynamic * capability registration. A client opts in via the dynamicRegistration property on the * specific client capabilities. A client can even provide dynamic registration for * capability A but not for capability B (see TextDocumentClientCapabilities as an example). */ struct RegistrationParams { std::vector registrations; MAKE_SWAP_METHOD(RegistrationParams, registrations); }; /** * The client/registerCapability request is sent from the server to the client * to register for a new capability on the client side. * Not all clients need to support dynamic capability registration. * A client opts in via the ClientCapabilities.dynamicRegistration property */ MAKE_REFLECT_STRUCT(RegistrationParams, registrations); DEFINE_REQUEST_RESPONSE_TYPE(Req_ClientRegisterCapability, RegistrationParams, JsonNull, "client/registerCapability"); asymptote-3.05/LspCpp/include/LibLsp/lsp/lsp_code_action.h0000644000000000000000000000323615031566105022277 0ustar rootroot#pragma once #include "location_type.h" #include "lsDocumentUri.h" #include "lsTextEdit.h" #include "lsPosition.h" // codeAction struct CommandArgs { lsDocumentUri textDocumentUri; std::vector edits; }; MAKE_REFLECT_STRUCT_WRITER_AS_ARRAY(CommandArgs, textDocumentUri, edits); inline void Reflect(Reader& visitor, CommandArgs& value) { int i = 0; visitor.IterArray( [&](Reader& visitor) { switch (i++) { case 0: Reflect(visitor, value.textDocumentUri); break; case 1: Reflect(visitor, value.edits); break; } } ); } // codeLens struct lsCodeLensUserData { }; MAKE_REFLECT_EMPTY_STRUCT(lsCodeLensUserData); struct lsCodeLensCommandArguments { lsDocumentUri uri; lsPosition position; std::vector locations; }; // FIXME Don't use array in vscode-cquery inline void Reflect(Writer& visitor, lsCodeLensCommandArguments& value) { visitor.StartArray(3); Reflect(visitor, value.uri); Reflect(visitor, value.position); Reflect(visitor, value.locations); visitor.EndArray(); } inline void Reflect(Reader& visitor, lsCodeLensCommandArguments& value) { int i = 0; visitor.IterArray( [&](Reader& visitor) { switch (i++) { case 0: Reflect(visitor, value.uri); break; case 1: Reflect(visitor, value.position); break; case 2: Reflect(visitor, value.locations); break; } } ); } asymptote-3.05/LspCpp/include/LibLsp/lsp/Markup/0000755000000000000000000000000015031566105020234 5ustar rootrootasymptote-3.05/LspCpp/include/LibLsp/lsp/Markup/string_ref.h0000644000000000000000000011047715031566105022561 0ustar rootroot #pragma once #include #include #include #include #include #ifndef _WIN32 #include #endif namespace std { /** * An extension of STL's string providing additional functionality that is often availiable in * higher-level languages such as Python. */ class string_ref : public string { public: //static unsigned GetAutoSenseRadix(string_ref& Str) { // if (Str.empty()) // return 10; // if (Str.start_with("0x") || Str.start_with("0X")) { // Str = Str.substr(2); // return 16; // } // if (Str.start_with("0b") || Str.start_with("0B")) { // Str = Str.substr(2); // return 2; // } // if (Str.start_with("0o")) { // Str = Str.substr(2); // return 8; // } // if (Str[0] == '0' && Str.size() > 1 && std::isdigit(Str[1])) { // Str = Str.substr(1); // return 8; // } // return 10; //} //static bool consumeUnsignedInteger(string_ref& Str, unsigned Radix, // unsigned long long& Result) { // // Autosense radix if not specified. // if (Radix == 0) // Radix = GetAutoSenseRadix(Str); // // Empty strings (after the radix autosense) are invalid. // if (Str.empty()) return true; // // Parse all the bytes of the string given this radix. Watch for overflow. // string_ref Str2 = Str; // Result = 0; // while (!Str2.empty()) { // unsigned CharVal; // if (Str2[0] >= '0' && Str2[0] <= '9') // CharVal = Str2[0] - '0'; // else if (Str2[0] >= 'a' && Str2[0] <= 'z') // CharVal = Str2[0] - 'a' + 10; // else if (Str2[0] >= 'A' && Str2[0] <= 'Z') // CharVal = Str2[0] - 'A' + 10; // else // break; // // If the parsed value is larger than the integer radix, we cannot // // consume any more characters. // if (CharVal >= Radix) // break; // // Add in this character. // unsigned long long PrevResult = Result; // Result = Result * Radix + CharVal; // // Check for overflow by shifting back and seeing if bits were lost. // if (Result / Radix < PrevResult) // return true; // Str2 = Str2.substr(1); // } // // We consider the operation a failure if no characters were consumed // // successfully. // if (Str.size() == Str2.size()) // return true; // Str = Str2; // return false; //} //static bool consumeSignedInteger(string_ref& Str, unsigned Radix, // long long& Result) { // unsigned long long ULLVal; // // Handle positive strings first. // if (Str.empty() || Str.front() != '-') { // if (consumeUnsignedInteger(Str, Radix, ULLVal) || // // Check for value so large it overflows a signed value. // (long long)ULLVal < 0) // return true; // Result = ULLVal; // return false; // } // // Get the positive part of the value. // string_ref Str2 = Str.drop_front(1); // if (consumeUnsignedInteger(Str2, Radix, ULLVal) || // // Reject values so large they'd overflow as negative signed, but allow // // "-0". This negates the unsigned so that the negative isn't undefined // // on signed overflow. // (long long)-ULLVal > 0) // return true; // Str = Str2; // Result = -ULLVal; // return false; //} ///// GetAsUnsignedInteger - Workhorse method that converts a integer character ///// sequence of radix up to 36 to an unsigned long long value. //static bool getAsUnsignedInteger(string_ref Str, unsigned Radix, // unsigned long long& Result) { // if (consumeUnsignedInteger(Str, Radix, Result)) // return true; // // For getAsUnsignedInteger, we require the whole string to be consumed or // // else we consider it a failure. // return !Str.empty(); //} //static bool getAsSignedInteger(string_ref Str, unsigned Radix, // long long& Result) { // if (consumeSignedInteger(Str, Radix, Result)) // return true; // // For getAsSignedInteger, we require the whole string to be consumed or else // // we consider it a failure. // return !Str.empty(); //} ///// Parse the current string as an integer of the specified radix. If ///// \p Radix is specified as zero, this does radix autosensing using ///// extended C rules: 0 is octal, 0x is hex, 0b is binary. ///// ///// If the string is invalid or if only a subset of the string is valid, ///// this returns true to signify the error. The string is considered ///// erroneous if empty or if it overflows T. //template //std::enable_if_t::is_signed, bool> // getAsInteger(unsigned Radix, T& Result) const { // long long LLVal; // if (getAsSignedInteger(*this, Radix, LLVal) || // static_cast(LLVal) != LLVal) // return true; // Result = LLVal; // return false; //} //template //std::enable_if_t::is_signed, bool> // getAsInteger(unsigned Radix, T& Result) const { // unsigned long long ULLVal; // // The additional cast to unsigned long long is required to avoid the // // Visual C++ warning C4805: '!=' : unsafe mix of type 'bool' and type // // 'unsigned __int64' when instantiating getAsInteger with T = bool. // if (getAsUnsignedInteger(*this, Radix, ULLVal) || // static_cast(static_cast(ULLVal)) != ULLVal) // return true; // Result = ULLVal; // return false; //} /**` * Default constructor * * Constructs an empty string_ref ("") */ string_ref() : string() { } /** * Duplicate the STL string copy constructor * * @param[in] s The string to copy * @param[in] pos The starting position in the string to copy from * @param[in] n The number of characters to copy */ string_ref(string const& s, size_type pos = 0, size_type n = npos) : string(s, pos, n) { } /** * Construct an string_ref from a null-terminated character array * * @param[in] s The character array to copy into the new string */ string_ref(value_type const* s) : string(s) { } /** * Construct an string_ref from a character array and a length * * @param[in] s The character array to copy into the new string * @param[in] n The number of characters to copy */ string_ref(value_type const* s, size_type n) : string(s, n) { } /** * Create an string_ref with @p n copies of @p c * * @param[in] n The number of copies * @param[in] c The character to copy @p n times */ string_ref(size_type n, value_type c) : string(n, c) { } /** * Create a string from a range * * @param[in] first The first element to copy in * @param[in] last The last element to copy in */ template string_ref(InputIterator first, InputIterator last) : string(first, last) { } /** * The destructor */ ~string_ref() { } /** * Split a string by whitespace * * @return A vector of strings, each of which is a substring of the string */ vector split(size_type limit = npos) const { vector v; const_iterator i = begin(), last = i; for (; i != end(); i++) { if (*i == ' ' || *i == '\n' || *i == '\t' || *i == '\r') { if (i + 1 != end() && (i[1] == ' ' || i[1] == '\n' || i[1] == '\t' || i[1] == '\r')) { continue; } v.push_back(string_ref(last, i)); last = i + 1; if (v.size() >= limit - 1) { v.push_back(string_ref(last, end())); return v; } } } if (last != i) { v.push_back(string_ref(last, i)); } return v; } /** * Split a string by a character * * Returns a vector of ext_strings, each of which is a substring of the string formed by splitting * it on boundaries formed by the character @p separator. If @p limit is set, the returned vector * will contain a maximum of @p limit elements with the last element containing the rest of * the string. * * If @p separator is not found in the string, a single element will be returned in the vector * containing the entire string. * * The separators are removed from the output * * @param[in] separator The character separator to split the string on * @param[in] limit The maximum number of output elements * @return A vector of strings, each of which is a substring of the string * * @section split_ex Example * @code * std::string_ref s("This|is|a|test."); * std::vector v = s.split('|'); * std::copy(v.begin(), v.end(), std::ostream_iterator(std::cout, "\n")); * * This * is * a * test. * @endcode */ vector split(value_type separator, size_type limit = npos) const { vector v; const_iterator i = begin(), last = i; for (; i != end(); i++) { if (*i == separator) { v.push_back(string_ref(last, i)); last = i + 1; if (v.size() >= limit - 1) { v.push_back(string_ref(last, end())); return v; } } } if (last != i) { v.push_back(string_ref(last, i)); } return v; } /** * Split a string by another string * * Returns a vector of ext_strings, each of which is a substring of the string formed by * splitting it on boundaries formed by the string @p separator. If @p limit is set, the * returned vector will contain a maximum of @p limit elements with the last element * containing the rest of the string. * * If @p separator is not found in the string, a single element will be returned in the * vector containing the entire string. * * The separators are removed from the output * * @param[in] separator The string separator to split the string on * @param[in] limit The maximum number of output elements * @return A vector of strings, each of which is a substring of the string * * @ref split_ex */ vector split(string const& separator, size_type limit = npos) const { vector v; const_iterator i = begin(), last = i; for (; i != end(); i++) { if (string(i, i + separator.length()) == separator) { v.push_back(string_ref(last, i)); last = i + separator.length(); if (v.size() >= limit - 1) { v.push_back(string_ref(last, end())); return v; } } } if (last != i) { v.push_back(string_ref(last, i)); } return v; } /** * Convert a string into an integer * * Convert the initial portion of a string into a signed integer. Once a non-numeric * character is reached, the remainder of @p string is ignored and the integer that was * read returned. * * @param s The string to convert * @return The integer converted from @p string */ static long int integer(string const& s) { long int retval = 0; bool neg = false; for (const_iterator i = s.begin(); i != s.end(); i++) { if (i == s.begin()) { if (*i == '-') { neg = true; continue; } else if (*i == '+') { continue; } } if (*i >= '0' && *i <= '9') { retval *= 10; retval += *i - '0'; } else { break; } } if (neg) { retval *= -1; } return retval; } /** * Convert the string to an integer * * Convert the initial portion of the string into a signed integer. Once a non-numeric * character is reached, the remainder of the string is ignored and the integer that had * been read thus far is returned. * * @return The integer converted from the string */ long int integer() const { return integer(*this); } /** * Split a string into chunks of size @p chunklen. Returns a vector of strings. * * Splits a string into chunks of the given size. The final chunk may not fill its * entire allocated number of characters. * * @param[in] chunklen The number of characters per chunk * @return A vector of strings, each of length <= chunklen * * @section chunk_split-ex Example * @code * std::string_ref s("abcdefghijk"); * std::vector v = s.chunk_split(3); * std::copy(v.begin(), v.end(), ostream_iterator(cout, " ")); * * abc def ghi jk * @endcode */ vector chunk_split(size_type chunklen) const { vector retval; retval.reserve(size() / chunklen + 1); size_type count = 0; const_iterator i = begin(), last = i; for (; i != end(); i++, count++) { if (count == chunklen) { count = 0; retval.push_back(string_ref(last, i)); last = i; } } if (last != i) { retval.push_back(string_ref(last, i)); } return retval; } /** * Join a sequence of strings by some glue to create a new string * * Glue is not added to the end of the string. * * @pre [first, last) is a valid range * @pre InputIterator is a model of STL's Input Iterator * @pre InputIterator must point to a string type (std::string, std::string_ref, char *) * * @param[in] glue The glue to join strings with * @param[in] first The beginning of the range to join * @param[in] last The end of the range to join * @return A string constructed of each element of the range connected together with @p glue * * @section join_ex Example * @code * std::vector v; * v.push_back("This"); * v.push_back("is"); * v.push_back("a"); * v.push_back("test."); * std::cout << std::string_ref::join("|", v.begin(), v.end()) << std::endl; * * This|is|a|test. * @endcode */ template static string_ref join(string const& glue, InputIterator first, InputIterator last) { string_ref retval; for (; first != last; ++first) { retval.append(*first); retval.append(glue); } retval.erase(retval.length() - glue.length()); return retval; } /** * Join a sequence of strings by some glue to create a new string * * @copydoc join * @ref join_ex */ template static string_ref join(value_type glue, InputIterator first, InputIterator last) { string_ref retval; for (; first != last; ++first) { retval.append(*first); retval.append(1, glue); } retval.erase(retval.length() - 1); return retval; } /** * Search for any instances of @p needle and replace them with @p s * * @param[in] needle The string to replace * @param[in] s The replacement string * @return *this * @post All instances of @p needle in the string are replaced with @p s * * @section replace-ex Example * @code * std::string_ref s("This is a test."); * s.replace("is", "ere"); * std::cout << s << std::endl; * * There ere a test. * @endcode */ string_ref& replace(string const& needle, string const& s) { size_type lastpos = 0, thispos; while ((thispos = find(needle, lastpos)) != npos) { string::replace(thispos, needle.length(), s); lastpos = thispos + 1; } return *this; } string_ref& replace_first(string const& needle, string const& s) { size_type lastpos = 0, thispos; if ((thispos = find(needle, lastpos)) != npos) { string::replace(thispos, needle.length(), s); lastpos = thispos + 1; } return *this; } /** * Search of any instances of @p needle and replace them with @p c * * @param[in] needle The character to replace * @param[in] c The replacement character * @return *this * @post All instances of @p needle in the string are replaced with @p c * * @ref replace-ex */ string_ref& replace(value_type needle, value_type c) { for (iterator i = begin(); i != end(); i++) { if (*i == needle) { *i = c; } } return *this; } /** * Repeat a string @p n times * * @param[in] n The number of times to repeat the string * @return string_ref containing @p n copies of the string * * @section repeat-ex Example * @code * std::string_ref s("123"); * s = s * 3; * std::cout << s << std::endl; * * 123123123 * @endcode */ string_ref operator*(size_type n) { string_ref retval; for (size_type i = 0; i < n; i++) { retval.append(*this); } return retval; } /** * Convert the string to lowercase * * @return *this * @post The string is converted to lowercase */ string_ref& tolower() { for (iterator i = begin(); i != end(); i++) { if (*i >= 'A' && *i <= 'Z') { *i = (*i) + ('a' - 'A'); } } return *this; } /** * Convert the string to uppercase * * @return *this * @post The string is converted to uppercase */ string_ref& toupper() { for (iterator i = begin(); i != end(); i++) { if (*i >= 'a' && *i <= 'z') { *i = (*i) - ('a' - 'A'); } } return *this; } /** * Count the occurances of @p str in the string. * * @return The count of substrings @p str in the string */ size_type count(string const& str) const { size_type count = 0, last = 0, cur = 0; while ((cur = find(str, last + 1)) != npos) { count++; last = cur; } return count; } /** * Determine if the string is alphanumeric * * @return true if the string contains only characters between a-z, A-Z and 0-9 and * contains at least one character, else false */ bool is_alnum() const { if (length() == 0) { return false; } for (const_iterator i = begin(); i != end(); i++) { if (*i < 'A' || *i > 'Z') { if (*i < '0' || *i > '9') { if (*i < 'a' || *i > 'z') { return false; } } } } return true; } /** * Determine if the string is alphabetic only * * @return true of the string contains only characters between a-z and A-Z and contains at * least one character, else false */ bool is_alpha() const { if (length() == 0) { return false; } for (const_iterator i = begin(); i != end(); i++) { if (*i < 'A' || (*i > 'Z' && (*i < 'a' || *i > 'z'))) { return false; } } return true; } /** * Determine if the string is numeric only * * @return true if the string contains only characters between 0-9 and contains at least * one character, else false */ bool is_numeric() const { if (length() == 0) { return false; } for (const_iterator i = begin(); i != end(); i++) { if (*i < '0' || *i > '9') { return false; } } return true; } /** * Determine if a string is all lower case * * @return true if there is at least one character, and all characters are lowercase * letters, else false */ bool is_lower() const { if (length() == 0) { return false; } for (const_iterator i = begin(); i != end(); i++) { if (*i < 'a' || *i < 'z') { return false; } } return true; } /** * Determine if a string is all upper case * * @return true if there is at least one character, and all characters are uppercase * letters, else false */ bool is_upper() const { if (length() == 0) { return false; } for (const_iterator i = begin(); i != end(); i++) { if (*i < 'A' || *i > 'Z') { return false; } } return true; } /** * Swap the case of a string * * @post Converts all uppercase to lowercase, and all lowercase to uppercase in the string * @return *this */ string_ref& swapcase() { for (iterator i = begin(); i != end(); i++) { if (*i >= 'A' && *i <= 'Z') { *i += ('a' - 'A'); } else if (*i >= 'a' && *i <= 'z') { *i -= ('a' - 'A'); } } return *this; } /******************************************************************************* Function: std::string_ref::start_with Access: public Qualifier: const Parameter: const string & str Returns: bool Purpose: is the string start with str *******************************************************************************/ bool start_with(string const& str) const { return (this->find(str) == 0); } /// Return a string_ref equal to 'this' but with only the last \p N /// elements remaining. If \p N is greater than the length of the /// string, the entire string is returned. string_ref take_back(size_t N = 1) const { if (N >= size()) { return *this; } return drop_front(size() - N); } /// Return a string_ref equal to 'this' but with the first \p N elements /// dropped. string_ref drop_front(size_t N = 1) const { //assert(size() >= N && "Dropping more elements than exist"); return substr(N); } /// Return a string_ref equal to 'this' but with the last \p N elements /// dropped. string_ref drop_back(size_t N = 1) const { return substr(0, size() - N); } /// Return a string_ref equal to 'this', but with all characters satisfying /// the given predicate dropped from the beginning of the string. string_ref drop_while(std::function F) const { return substr(std::find_if_not(begin(), end(), F) - begin()); } /// Return a string_ref equal to 'this', but with all characters not /// satisfying the given predicate dropped from the beginning of the string. string_ref drop_until(std::function F) const { return substr(std::find_if(begin(), end(), F) - begin()); } /// Returns true if this string_ref has the given prefix and removes that /// prefix. bool consume_front(string_ref Prefix) { if (!start_with(Prefix)) { return false; } *this = drop_front(Prefix.size()); return true; } /// Returns true if this string_ref has the given suffix and removes that /// suffix. bool consume_back(string_ref Suffix) { if (!end_with(Suffix)) { return false; } *this = drop_back(Suffix.size()); return true; } /******************************************************************************* Function: std::string_ref::end_with Access: public Qualifier: const Parameter: const string & str Returns: bool Purpose: is the string end with str *******************************************************************************/ bool end_with(string const& str) const { if (str.length() > this->length()) { return false; } size_type off = this->length() - str.length(); return (find(str, off) == off); } /******************************************************************************* Function: hl_lib::string_ref::format Access: public Qualifier: Parameter: const char * format_string Parameter: ... Returns: string_ref& Purpose: format the string *******************************************************************************/ string_ref& format(char const* format_string, ...) { if (format_string == 0) { return *this; } va_list argList; va_start(argList, format_string); #ifdef _WIN32 int len = _vscprintf(format_string, argList); char* pbuf = new char[len + 1]; if (pbuf != 0) { vsprintf_s(pbuf, len + 1, format_string, argList); *this = pbuf; delete[] pbuf; } #else int const INLINE_FORMAT_BUFFER_LEN = 2048; char* buf = new char[INLINE_FORMAT_BUFFER_LEN + 1]; if (buf != 0) { int len = vsnprintf(buf, INLINE_FORMAT_BUFFER_LEN, format_string, argList); assign(buf, buf + len); delete[] buf; } #endif va_end(argList); return *this; } /******************************************************************************* Function: hl_lib::string_ref::trim_left Access: public Qualifier: Parameter: value_type ch Returns: string_ref& Purpose: delete all char which is ch at the left of the string *******************************************************************************/ string_ref& trim_left(value_type ch = ' ') { size_type off = this->find_first_not_of(ch); if (off != string::npos) { this->erase(0, off); } return *this; } /******************************************************************************* Function: hl_lib::string_ref::trim_right Access: public Qualifier: Parameter: value_type ch Returns: string_ref& Purpose: delete all char which is ch at the right of the string *******************************************************************************/ string_ref& trim_right(value_type ch = ' ') { size_type off = this->find_last_not_of(ch); if (off == string::npos) { off = 0; } else { off++; } this->erase(off, length() - off); return *this; } /******************************************************************************* Function: hl_lib::string_ref::trim Access: public Qualifier: Parameter: value_type ch Returns: string_ref& Purpose: delete all char which is ch at the left and right of the string *******************************************************************************/ string_ref& trim(value_type ch = ' ') { trim_left(ch); trim_right(ch); return *this; } /******************************************************************************* Function: hl_lib::string_ref::float_num Access: public static Qualifier: Parameter: const string & str Returns: double Purpose: parse str to a float number *******************************************************************************/ static double float_num(string const& str) { return atof(str.c_str()); } /******************************************************************************* Function: hl_lib::string_ref::float_num Access: public static Qualifier: Returns: double Purpose: parse this to a float number *******************************************************************************/ double float_num() const { return float_num(*this); } /******************************************************************************* Function: hl_lib::string_ref::compare_nocase Access: public Qualifier: const Parameter: const string & str Returns: int Purpose: compare string no case *******************************************************************************/ int compare_nocase(string const& str) const { #ifdef _WIN32 return _stricmp(this->c_str(), str.c_str()); #else return strcasecmp(this->c_str(), str.c_str()); #endif } /******************************************************************************* Function: hl_lib::string_ref::compare_nocase Access: public Qualifier: const Parameter: size_type index Parameter: size_type length Parameter: const string & str Returns: int Purpose: compare substring no case *******************************************************************************/ int compare_nocase(size_type index, size_type length, string const& str) const { string_ref temp = this->substr(index, length); return temp.compare_nocase(str); } /******************************************************************************* Function: hl_lib::string_ref::compare_nocase Access: public Qualifier: const Parameter: size_type index Parameter: size_type length Parameter: const string & str Parameter: size_type index2 Parameter: size_type length2 Returns: int Purpose: compare two substring no case *******************************************************************************/ int compare_nocase(size_type index, size_type length, string const& str, size_type index2, size_type length2) const { string_ref temp1 = this->substr(index, length); string_ref temp2 = str.substr(index2, length2); return temp1.compare_nocase(temp2); } }; } // namespace std asymptote-3.05/LspCpp/include/LibLsp/lsp/Markup/Markup.h0000644000000000000000000001002515031566105021642 0ustar rootroot#pragma once #include #include #include #include #include #include #include #include "string_ref.h" namespace lsp { /// Holds text and knows how to lay it out. Multiple blocks can be grouped to /// form a document. Blocks include their own trailing newlines, std::string_ref /// should trim them if need be. class Block { public: virtual void renderMarkdown(std::ostringstream& OS) const = 0; virtual void renderPlainText(std::ostringstream& OS) const = 0; virtual std::unique_ptr clone() const = 0; std::string_ref asMarkdown() const; std::string_ref asPlainText() const; virtual bool isRuler() const { return false; } virtual ~Block() = default; }; /// Represents parts of the markup that can contain strings, like inline code, /// code block or plain text. /// One must introduce different paragraphs to create separate blocks. class Paragraph : public Block { public: void renderMarkdown(std::ostringstream& OS) const override; void renderPlainText(std::ostringstream& OS) const override; std::unique_ptr clone() const override; /// Append plain text to the end of the string. Paragraph& appendText(std::string_ref const& Text); /// Append inline code, this translates to the ` block in markdown. /// \p Preserve indicates the code span must be apparent even in plaintext. Paragraph& appendCode(std::string_ref const& Code, bool Preserve = false); /// Ensure there is space between the surrounding chunks. /// Has no effect at the beginning or end of a paragraph. Paragraph& appendSpace(); private: struct Chunk { enum { PlainText, InlineCode, } Kind = PlainText; // Preserve chunk markers in plaintext. bool Preserve = false; std::string_ref Contents; // Whether this chunk should be surrounded by whitespace. // Consecutive SpaceAfter and SpaceBefore will be collapsed into one space. // Code spans don't usually set this: their spaces belong "inside" the span. bool SpaceBefore = false; bool SpaceAfter = false; }; std::vector Chunks; }; /// Represents a sequence of one or more documents. Knows how to print them in a /// list like format, e.g. by prepending with "- " and indentation. class BulletList : public Block { public: void renderMarkdown(std::ostringstream& OS) const override; void renderPlainText(std::ostringstream& OS) const override; std::unique_ptr clone() const override; class Document& addItem(); private: std::vector Items; }; /// A format-agnostic representation for structured text. Allows rendering into /// markdown and plaintext. class Document { public: Document() = default; Document(Document const& Other) { *this = Other; } Document& operator=(Document const&); Document(Document&&) = default; Document& operator=(Document&&) = default; void append(Document Other); /// Adds a semantical block that will be separate from others. Paragraph& addParagraph(); /// Inserts a horizontal separator to the document. void addRuler(); /// Adds a block of code. This translates to a ``` block in markdown. In plain /// text representation, the code block will be surrounded by newlines. void addCodeBlock(std::string_ref Code, std::string_ref Language = "cpp"); /// Heading is a special type of paragraph that will be prepended with \p /// Level many '#'s in markdown. Paragraph& addHeading(size_t Level); BulletList& addBulletList(); /// Doesn't contain any trailing newlines. /// We try to make the markdown human-readable, e.g. avoid extra escaping. /// At least one client (coc.nvim) displays the markdown verbatim! std::string_ref asMarkdown() const; /// Doesn't contain any trailing newlines. std::string_ref asPlainText() const; private: std::vector> Children; }; } // namespace lsp asymptote-3.05/LspCpp/include/LibLsp/lsp/ResourceOperation.h0000644000000000000000000000555415031566105022627 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include #include "lsDocumentUri.h" #include "LibLsp/lsp/lsAny.h" #include "LibLsp/lsp/lsTextEdit.h" struct ResourceOperation { std::string kind; virtual ~ResourceOperation() = default; MAKE_SWAP_METHOD(ResourceOperation, kind); }; MAKE_REFLECT_STRUCT(ResourceOperation, kind); extern void Reflect(Writer& visitor, ResourceOperation* value); struct CreateFileOptions { /** * Overwrite existing file. Overwrite wins over `ignoreIfExists` */ optional overwrite = false; /** * Ignore if exists. */ optional ignoreIfExists = false; MAKE_SWAP_METHOD(CreateFileOptions, overwrite, ignoreIfExists) }; MAKE_REFLECT_STRUCT(CreateFileOptions, overwrite, ignoreIfExists) struct lsCreateFile : public ResourceOperation { /** * The resource to create. */ lsCreateFile(); lsDocumentUri uri; /** * Additional options */ optional options; /** * An optional annotation identifer describing the operation. * * @since 3.16.0 */ optional annotationId; MAKE_SWAP_METHOD(lsCreateFile, kind, uri, options, annotationId) }; MAKE_REFLECT_STRUCT(lsCreateFile, kind, uri, options, annotationId) struct DeleteFileOptions { /** * Delete the content recursively if a folder is denoted. */ optional recursive = false; /** * Ignore the operation if the file doesn't exist. */ optional ignoreIfNotExists = false; MAKE_SWAP_METHOD(DeleteFileOptions, recursive, ignoreIfNotExists); }; MAKE_REFLECT_STRUCT(DeleteFileOptions, recursive, ignoreIfNotExists) struct lsDeleteFile : public ResourceOperation { /** * The file to delete. */ lsDeleteFile(); lsDocumentUri uri; /** * Delete options. */ optional options; MAKE_SWAP_METHOD(lsDeleteFile, kind, uri, options); }; MAKE_REFLECT_STRUCT(lsDeleteFile, kind, uri, options); typedef CreateFileOptions RenameFileOptions; struct lsRenameFile : public ResourceOperation { /** * The old (existing) location. */ lsRenameFile(); lsDocumentUri oldUri; /** * The new location. */ lsDocumentUri newUri; /** * Rename options. */ optional options; /** * An optional annotation identifer describing the operation. * * @since 3.16.0 */ optional annotationId; MAKE_SWAP_METHOD(lsRenameFile, kind, oldUri, newUri, options, annotationId) }; MAKE_REFLECT_STRUCT(lsRenameFile, kind, oldUri, newUri, options, annotationId); extern ResourceOperation* GetResourceOperation(lsp::Any& lspAny); asymptote-3.05/LspCpp/include/LibLsp/lsp/lsRange.h0000644000000000000000000000160415031566105020542 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include #include #include "lsPosition.h" //A range in a text document expressed as(zero - based) startand end positions. //A range is comparable to a selection in an editor.Therefore the end position is exclusive. //If you want to specify a range that contains a line including the line ending character(s) //then use an end position denoting the start of the next line. struct lsRange { lsRange(); lsRange(lsPosition start, lsPosition end); bool operator==(lsRange const& other) const; bool operator<(lsRange const& other) const; /** * The range's start position. */ lsPosition start; /** * The range's end position. */ lsPosition end; std::string ToString() const; MAKE_SWAP_METHOD(lsRange, start, end) }; MAKE_REFLECT_STRUCT(lsRange, start, end) asymptote-3.05/LspCpp/include/LibLsp/lsp/windows/0000755000000000000000000000000015031566105020467 5ustar rootrootasymptote-3.05/LspCpp/include/LibLsp/lsp/windows/MessageNotify.h0000644000000000000000000000446315031566105023424 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/NotificationInMessage.h" #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" // Show a message to the user. enum class lsMessageType : int { Error = 1, Warning = 2, Info = 3, Log = 4 }; MAKE_REFLECT_TYPE_PROXY(lsMessageType) struct MessageParams { /** * The message type. */ lsMessageType type = lsMessageType::Error; /** * The actual message. */ std::string message; void swap(MessageParams& arg) noexcept { lsMessageType temp = type; type = arg.type; arg.type = temp; message.swap(arg.message); } }; MAKE_REFLECT_STRUCT(MessageParams, type, message) /** * The log message notification is send from the server to the client to ask * the client to log a particular message. */ DEFINE_NOTIFICATION_TYPE(Notify_LogMessage, MessageParams, "window/logMessage") /** * The show message notification is sent from a server to a client to ask * the client to display a particular message in the user interface. */ DEFINE_NOTIFICATION_TYPE(Notify_ShowMessage, MessageParams, "window/showMessage") /** * The show message request is sent from a server to a client to ask the client to display a particular message in the * user class. In addition to the show message notification the request allows to pass actions and to wait for an * answer from the client. */ struct MessageActionItem { /** * A short title like 'Retry', 'Open Log' etc. */ std::string title; MAKE_SWAP_METHOD(MessageActionItem, title) }; MAKE_REFLECT_STRUCT(MessageActionItem, title); struct ShowMessageRequestParams : public MessageParams { /** * The message action items to present. */ std::vector actions; MAKE_SWAP_METHOD(ShowMessageRequestParams, type, message, actions) }; MAKE_REFLECT_STRUCT(ShowMessageRequestParams, type, message, actions) /** * The show message request is sent from a server to a client to ask the * client to display a particular message in the user interface. In addition * to the show message notification the request allows to pass actions and * to wait for an answer from the client. */ DEFINE_REQUEST_RESPONSE_TYPE(WindowShowMessage, ShowMessageRequestParams, MessageActionItem, "window/showMessage") asymptote-3.05/LspCpp/include/LibLsp/lsp/lsAny.h0000644000000000000000000000716115031566105020241 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include #include "LibLsp/JsonRpc/message.h" namespace lsp { struct Any { //! Type of JSON value enum Type { kUnKnown = -1, kNullType = 0, //!< null kFalseType = 1, //!< false kTrueType = 2, //!< true kObjectType = 3, //!< object kArrayType = 4, //!< array kStringType = 5, //!< string kNumberType = 6 //!< number }; template bool Get(T& value); template void Set(T& value); int GuessType(); int GetType(); void Set(std::unique_ptr value); void SetJsonString(std::string&& _data, Type _type); void SetJsonString(std::string const& _data, Type _type); std::string const& Data() const { return data; } void swap(Any& arg) noexcept; /* *Example for GetFromMap struct A{ std::string visitor; bool verbose; } REFLECT_MAP_TO_STRUCT(A,visitor,verbose) std::string data = "{\"visitor\":\"default\",\"verbose\":\"true\"}; lsp:Any any; any.SetJsonString(data, static_cast(-1)); A a_object; any.GetFromMap(a_object); */ template bool GetFromMap(T& value); template bool GetForMapHelper(T& value); bool GetForMapHelper(std::string& value); bool GetForMapHelper(optional& value); private: std::unique_ptr GetReader(); std::unique_ptr GetWriter() const; void SetData(std::unique_ptr&); std::string data; int jsonType = kUnKnown; }; }; // namespace lsp extern void Reflect(Reader& visitor, lsp::Any& value); extern void Reflect(Writer& visitor, lsp::Any& value); template void ReflectMember(std::map& visitor, char const* name, T& value) { auto it = visitor.find(name); if (it != visitor.end()) { it->second.GetForMapHelper(value); } } template void ReflectMember(std::map& visitor, char const* name, T& value) { auto it = visitor.find(name); if (it != visitor.end()) { lsp::Any any; any.SetJsonString(it->second, static_cast(-1)); any.Get(value); } } #define REFLECT_MAP_TO_STRUCT(type, ...) \ template \ void ReflectMap(TVisitor& visitor, type& value) \ { \ MACRO_MAP(_MAPPABLE_REFLECT_MEMBER, __VA_ARGS__) \ } namespace lsp { template bool Any::Get(T& value) { auto const visitor = GetReader(); Reflect(*visitor, value); return true; } template void Any::Set(T& value) { auto visitor = GetWriter(); Reflect(*visitor, value); SetData(visitor); } template bool Any::GetFromMap(T& value) { auto const visitor = GetReader(); std::map _temp; Reflect(*visitor, _temp); ReflectMap(_temp, value); return true; } template bool Any::GetForMapHelper(T& value) { jsonType = GetType(); if (jsonType == kStringType) { auto copy = data; copy.erase(copy.find_last_not_of('"') + 1); copy.erase(0, copy.find_first_not_of('"')); lsp::Any any; any.SetJsonString(copy, kUnKnown); any.Get(value); } else { Get(value); } return true; } } // namespace lsp asymptote-3.05/LspCpp/include/LibLsp/lsp/lru_cache.h0000644000000000000000000001077315031566105021103 0ustar rootroot#pragma once #include #include #include #include #include #include // Cache that evicts old entries which have not been used recently. Implemented // using array/linear search so this works well for small array sizes. template struct LruCache { explicit LruCache(int max_entries); // Fetches an entry for |key|. If it does not exist, |allocator| will be // invoked to create one. template TValue Get(TKey const& key, TAllocator allocator); // Returns true if there is an entry for |key|. bool Has(TKey const& key); // Fetches the entry for |filename| and updates it's usage so it is less // likely to be evicted. bool TryGet(TKey const& key, TValue* dest); // TryGetEntry, except the entry is removed from the cache. bool TryTake(TKey const& key, TValue* dest); // Inserts an entry. Evicts the oldest unused entry if there is no space. void Insert(TKey const& key, TValue const& value); // Call |func| on existing entries. If |func| returns false iteration // terminates early. template void IterateValues(TFunc func); // Empties the cache void Clear(void); private: // There is a global score counter, when we access an element we increase // its score to the current global value, so it has the highest overall // score. This means that the oldest/least recently accessed value has the // lowest score. // // There is a bit of special logic to handle score overlow. struct Entry { uint32_t score = 0; TKey key; TValue value; bool operator<(Entry const& other) const { return score < other.score; } }; void IncrementScore(); std::vector entries_; int max_entries_ = 1; uint32_t next_score_ = 0; }; template LruCache::LruCache(int max_entries) : max_entries_(max_entries) { assert(max_entries > 0); } template template TValue LruCache::Get(TKey const& key, TAllocator allocator) { for (Entry& entry : entries_) { if (entry.key == key) { return entry.value; } } auto result = allocator(); Insert(key, result); return result; } template bool LruCache::Has(TKey const& key) { for (Entry& entry : entries_) { if (entry.key == key) { return true; } } return false; } template bool LruCache::TryGet(TKey const& key, TValue* dest) { // Assign new score. for (Entry& entry : entries_) { if (entry.key == key) { entry.score = next_score_; IncrementScore(); if (dest) { *dest = entry.value; } return true; } } return false; } template bool LruCache::TryTake(TKey const& key, TValue* dest) { for (size_t i = 0; i < entries_.size(); ++i) { if (entries_[i].key == key) { if (dest) { *dest = entries_[i].value; } entries_.erase(entries_.begin() + i); return true; } } return false; } template void LruCache::Insert(TKey const& key, TValue const& value) { if ((int)entries_.size() >= max_entries_) { entries_.erase(std::min_element(entries_.begin(), entries_.end())); } Entry entry; entry.score = next_score_; IncrementScore(); entry.key = key; entry.value = value; entries_.push_back(entry); } template template void LruCache::IterateValues(TFunc func) { for (Entry& entry : entries_) { if (!func(entry.value)) { break; } } } template void LruCache::IncrementScore() { // Overflow. if (++next_score_ == 0) { std::sort(entries_.begin(), entries_.end()); for (Entry& entry : entries_) { entry.score = next_score_++; } } } template void LruCache::Clear(void) { entries_.clear(); next_score_ = 0; } asymptote-3.05/LspCpp/include/LibLsp/lsp/lsFormattingOptions.h0000644000000000000000000000247115031566105023177 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" struct lsFormattingOptions { struct KeyData { optional _boolean; optional _integer; optional _string; }; // Size of a tab in spaces. int tabSize = 4; // Prefer spaces over tabs. bool insertSpaces = true; /** * Trim trailing whitespace on a line. * * @since 3.15.0 */ optional trimTrailingWhitespace; /** * Insert a newline character at the end of the file if one does not exist. * * @since 3.15.0 */ optional insertFinalNewline; /** * Trim all newlines after the final newline at the end of the file. * * @since 3.15.0 */ optional trimFinalNewlines; optional key; MAKE_SWAP_METHOD( lsFormattingOptions, tabSize, insertSpaces, trimTrailingWhitespace, insertFinalNewline, trimFinalNewlines, key ) }; MAKE_REFLECT_STRUCT( lsFormattingOptions, tabSize, insertSpaces, trimTrailingWhitespace, insertFinalNewline, trimFinalNewlines, key ); extern void Reflect(Reader& visitor, lsFormattingOptions::KeyData& value); extern void Reflect(Writer& visitor, lsFormattingOptions::KeyData& value); asymptote-3.05/LspCpp/include/LibLsp/lsp/SimpleTimer.h0000644000000000000000000000234715031566105021406 0ustar rootroot#pragma once #include #include #include #include template class SimpleTimer { public: SimpleTimer(unsigned int duration, std::function const& _call_back) : is_running_(true), call_back(_call_back), _deadline_timer(_ios, Duration(duration)) { _deadline_timer.async_wait( [&](boost::system::error_code const& e) { if (e.value() == boost::asio::error::operation_aborted) { return; } if (is_running_.load(std::memory_order_relaxed)) { call_back(); } } ); _thread = std::thread([this] { _ios.run(); }); } ~SimpleTimer() { Stop(); } void Stop() { is_running_.store(false, std::memory_order_relaxed); _ios.stop(); if (_thread.joinable()) { _thread.join(); } } private: std::atomic_bool is_running_; std::function call_back; boost::asio::io_context _ios; boost::asio::deadline_timer _deadline_timer; std::thread _thread; }; asymptote-3.05/LspCpp/include/LibLsp/lsp/lsTextDocumentIdentifier.h0000644000000000000000000000067515031566105024143 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include "lsDocumentUri.h" //Text documents are identified using a URI.On the protocol level, //URIs are passed as strings.The corresponding JSON structure looks like this: struct lsTextDocumentIdentifier { /** * The text document's URI. */ lsDocumentUri uri; MAKE_SWAP_METHOD(lsTextDocumentIdentifier, uri) }; MAKE_REFLECT_STRUCT(lsTextDocumentIdentifier, uri) asymptote-3.05/LspCpp/include/LibLsp/lsp/lsVersionedTextDocumentIdentifier.h0000644000000000000000000000221115031566105026006 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include "LibLsp/JsonRpc/message.h" #include "LibLsp/lsp/lsDocumentUri.h" #include "LibLsp/lsp/lsTextDocumentIdentifier.h" struct lsVersionedTextDocumentIdentifier { lsDocumentUri uri; // The version number of this document. number | null optional version; lsTextDocumentIdentifier AsTextDocumentIdentifier() const; MAKE_SWAP_METHOD(lsVersionedTextDocumentIdentifier, uri, version) }; MAKE_REFLECT_STRUCT(lsVersionedTextDocumentIdentifier, uri, version) /** * The version number of this document. If an optional versioned text document * identifier is sent from the server to the client and the file is not * open in the editor (the server has not received an open notification * before) the server can send `null` to indicate that the version is * known and the content on disk is the master (as specified with document * content ownership). * * The version number of a document will increase after each change, * including undo/redo. The number doesn't need to be consecutive. */ using lsOptionalVersionedTextDocumentIdentifier = lsVersionedTextDocumentIdentifier; asymptote-3.05/LspCpp/include/LibLsp/lsp/IProgressMonitor.h0000644000000000000000000001240415031566105022434 0ustar rootroot#pragma once #include namespace lsp { /** * The IProgressMonitor interface is implemented * by objects that monitor the progress of an activity; the methods * in this interface are invoked by code that performs the activity. *

    * All activity is broken down into a linear sequence of tasks against * which progress is reported. When a task begins, a beginTask(const wstring&, int) * notification is reported, followed by any number and mixture of * progress reports (worked()) and subtask notifications * (subTask(const wstring&)). When the task is eventually completed, a * done() notification is reported. After the done() * notification, the progress monitor cannot be reused; i.e., * beginTask(const wstring&, int) cannot be called again after the call to * done(). *

    *

    * A request to cancel an operation can be signaled using the * setCanceled method. Operations taking a progress * monitor are expected to poll the monitor (using isCanceled) * periodically and abort at their earliest convenience. Operation can however * choose to ignore cancelation requests. *

    *

    * Since notification is synchronous with the activity itself, the listener should * provide a fast and robust implementation. If the handling of notifications would * involve blocking operations, or operations which might throw uncaught exceptions, * the notifications should be queued, and the actual processing deferred (or perhaps * delegated to a separate thread). *

    *

    * Clients may implement this interface. *

    */ class IProgressMonitor { public: virtual ~IProgressMonitor() { } /** Constant indicating an unknown amount of work. */ static int const UNKNOWN = -1; /** * Notifies that the main task is beginning. This must only be called once * on a given progress monitor instance. * * @param name the name (or description) of the main task * @param totalWork the total number of work units into which * the main task is been subdivided. If the value is UNKNOWN * the implemenation is free to indicate progress in a way which * doesn't require the total number of work units in advance. */ virtual void beginTask(void*, int totalWork) { }; /** * Notifies that the work is done; that is, either the main task is completed * or the user canceled it. This method may be called more than once * (implementations should be prepared to handle this case). */ virtual void endTask(void*, int totalWork) { } virtual void done(void*) = 0; /** * Internal method to handle scaling correctly. This method * must not be called by a client. Clients should * always use the method worked(int). */ virtual void internalWorked(double work) { } /** * Returns whether cancelation of current operation has been requested. * Long-running operations should poll to see if cancelation * has been requested. * * @return true if cancellation has been requested, * and false otherwise * @see #setCanceled */ virtual bool isCanceled() = 0; /** * Sets the cancel state to the given value. * * @param value true indicates that cancelation has * been requested (but not necessarily acknowledged); * false clears this flag * * @see #isCanceled */ virtual void setCanceled(bool value) = 0; /** * Sets the task name to the given value. This method is used to * restore the task label after a nested operation was executed. * Normally there is no need for clients to call this method. * * @param name the name (or description) of the main task * @see #beginTask(java.lang.const wstring&, int) */ virtual void setTaskName(void*) { }; /** * Notifies that a subtask of the main task is beginning. * Subtasks are optional; the main task might not have subtasks. * * @param name the name (or description) of the subtask */ virtual void subTask(void*) { } /** * Notifies that a given number of work unit of the main task * has been completed. Note that this amount represents an * installment, as opposed to a cumulative amount of work done * to date. * * @param work the number of work units just completed */ virtual void worked(int work) { }; virtual void catch_exception(void*) = 0; }; } // namespace lsp asymptote-3.05/LspCpp/include/LibLsp/lsp/lsPosition.h0000644000000000000000000000232515031566105021313 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include #include //Position in a text document expressed as zero - based line and zero - based character offset. //A position is between two characters like an insert cursor in a editor.Special values like //for example - 1 to denote the end of a line are not supported. struct lsPosition { lsPosition(); lsPosition(int line, int character); bool operator==(lsPosition const& other) const; bool operator<(lsPosition const& other) const; std::string ToString() const; /** * Line position in a document (zero-based). */ // Note: these are 0-based. unsigned line = 0; /** * Character offset on a line in a document (zero-based). Assuming that * the line is represented as a string, the `character` value represents * the gap between the `character` and `character + 1`. * * If the character value is greater than the line length it defaults back * to the line length. */ unsigned character = 0; static lsPosition const kZeroPosition; MAKE_SWAP_METHOD(lsPosition, line, character) }; MAKE_REFLECT_STRUCT(lsPosition, line, character); asymptote-3.05/LspCpp/include/LibLsp/lsp/ParentProcessWatcher.h0000644000000000000000000000057015031566105023256 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/MessageIssue.h" #include #include class ParentProcessWatcher { public: struct ParentProcessWatcherData; ParentProcessWatcher(lsp::Log& log, int pid, std::function const&& callback, uint32_t poll_delay_secs = 10); ~ParentProcessWatcher(); std::shared_ptr d_ptr; }; asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/0000755000000000000000000000000015031566105021460 5ustar rootrootasymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/foldingRange.h0000644000000000000000000000343515031566105024235 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "document_symbol.h" #include "LibLsp/lsp/lsTextDocumentIdentifier.h" struct FoldingRangeRequestParams { /** * The text document. */ lsTextDocumentIdentifier textDocument; MAKE_SWAP_METHOD(FoldingRangeRequestParams, textDocument) }; MAKE_REFLECT_STRUCT(FoldingRangeRequestParams, textDocument) struct FoldingRange { /** * The zero-based line number from where the folded range starts. */ int startLine; /** * The zero-based line number where the folded range ends. */ int endLine; /** * The zero-based character offset from where the folded range starts. If not defined, defaults * to the length of the start line. */ int startCharacter; /** * The zero-based character offset before the folded range ends. If not defined, defaults to the * length of the end line. */ int endCharacter; /** * Describes the kind of the folding range such as `comment' or 'region'. The kind * is used to categorize folding ranges and used by commands like 'Fold all comments'. See * FoldingRangeKind for an enumeration of standardized kinds. */ std::string kind; MAKE_SWAP_METHOD(FoldingRange, startLine, endLine, startCharacter, endCharacter, kind) }; MAKE_REFLECT_STRUCT(FoldingRange, startLine, endLine, startCharacter, endCharacter, kind) /** * The folding range request is sent from the client to the server to return all folding * ranges found in a given text document. */ DEFINE_REQUEST_RESPONSE_TYPE( td_foldingRange, FoldingRangeRequestParams, std::vector, "textDocument/foldingRange" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/resolveCompletionItem.h0000644000000000000000000000074315031566105026165 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "LibLsp/lsp/lsp_completion.h" #include "LibLsp/lsp/lsTextDocumentPositionParams.h" #include "completion.h" /** * The request is sent from the client to the server to resolve additional * information for a given completion item. */ DEFINE_REQUEST_RESPONSE_TYPE(completionItem_resolve, lsCompletionItem, lsCompletionItem, "completionItem/resolve"); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/range_formatting.h0000644000000000000000000000145315031566105025162 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsFormattingOptions.h" struct lsTextDocumentRangeFormattingParams { lsTextDocumentIdentifier textDocument; lsRange range; lsFormattingOptions options; MAKE_SWAP_METHOD(lsTextDocumentRangeFormattingParams, textDocument, range, options) }; MAKE_REFLECT_STRUCT(lsTextDocumentRangeFormattingParams, textDocument, range, options); /** * The document range formatting request is sent from the client to the * server to format a given range in a document. * * Registration Options: TextDocumentRegistrationOptions */ DEFINE_REQUEST_RESPONSE_TYPE( td_rangeFormatting, lsTextDocumentRangeFormattingParams, std::vector, "textDocument/rangeFormatting" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/onTypeFormatting.h0000644000000000000000000000200515031566105025137 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsFormattingOptions.h" #include "LibLsp/lsp/lsTextDocumentIdentifier.h" #include "LibLsp/lsp/lsRange.h" #include "LibLsp/lsp/lsTextEdit.h" struct lsDocumentOnTypeFormattingParams { lsTextDocumentIdentifier textDocument; lsFormattingOptions options; lsPosition position; /** * The character that has been typed. */ std::string ch; MAKE_SWAP_METHOD(lsDocumentOnTypeFormattingParams, textDocument, position, options, ch); }; MAKE_REFLECT_STRUCT(lsDocumentOnTypeFormattingParams, textDocument, position, options, ch); /** * The document range formatting request is sent from the client to the * server to format a given range in a document. * * Registration Options: TextDocumentRegistrationOptions */ DEFINE_REQUEST_RESPONSE_TYPE( td_onTypeFormatting, lsDocumentOnTypeFormattingParams, std::vector, "textDocument/onTypeFormatting" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/document_link.h0000644000000000000000000000255215031566105024470 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsTextDocumentIdentifier.h" #include "LibLsp/lsp/lsRange.h" #include "LibLsp/lsp/lsAny.h" namespace TextDocumentDocumentLink { struct Params { // The document to provide document links for. lsTextDocumentIdentifier textDocument; MAKE_SWAP_METHOD(Params, textDocument) }; }; // namespace TextDocumentDocumentLink MAKE_REFLECT_STRUCT(TextDocumentDocumentLink::Params, textDocument); // A document link is a range in a text document that links to an internal or // external resource, like another text document or a web site. struct lsDocumentLink { // The range this link applies to. lsRange range; // The uri this link points to. If missing a resolve request is sent later. optional target; optional data; MAKE_SWAP_METHOD(lsDocumentLink, range, target, data) }; MAKE_REFLECT_STRUCT(lsDocumentLink, range, target, data); DEFINE_REQUEST_RESPONSE_TYPE( td_links, TextDocumentDocumentLink::Params, std::vector, "textDocument/documentLink" ); /** * The document link resolve request is sent from the client to the server to resolve the target of a given document link. */ DEFINE_REQUEST_RESPONSE_TYPE(td_linkResolve, lsDocumentLink, lsDocumentLink, "documentLink/resolve"); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/willSave.h0000644000000000000000000000406015031566105023417 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsTextDocumentIdentifier.h" namespace WillSaveTextDocumentParams { /** * Represents reasons why a text document is saved. */ enum class TextDocumentSaveReason { /** * Manually triggered, e.g. by the user pressing save, by starting debugging, * or by an API call. */ Manual = (1), /** * Automatic after a delay. */ AfterDelay = (2), /** * When the editor lost focus. */ FocusOut = (3) }; struct Params { /** * The document that will be saved. */ lsTextDocumentIdentifier textDocument; /* * A reason why a text document is saved. */ optional reason; MAKE_SWAP_METHOD(Params, textDocument, reason); }; }; // namespace WillSaveTextDocumentParams MAKE_REFLECT_TYPE_PROXY(WillSaveTextDocumentParams::TextDocumentSaveReason); MAKE_REFLECT_STRUCT(WillSaveTextDocumentParams::Params, textDocument, reason); /** * The document save notification is sent from the client to the server when * the document for saved in the client. * * Registration Options: TextDocumentSaveRegistrationOptions */ DEFINE_NOTIFICATION_TYPE(td_willSave, WillSaveTextDocumentParams::Params, "textDocument/willSave"); /** * The document will save request is sent from the client to the server before the document is actually saved. * The request can return an array of TextEdits which will be applied to the text document before it is saved. * Please note that clients might drop results if computing the text edits took too long or if a server constantly fails on this request. * This is done to keep the save fast and reliable. * * Registration Options: TextDocumentRegistrationOptions */ DEFINE_REQUEST_RESPONSE_TYPE( td_willSaveWaitUntil, WillSaveTextDocumentParams::Params, std::vector, "textDocument/willSaveWaitUntil" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/prepareRename.h0000644000000000000000000000202515031566105024416 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsWorkspaceEdit.h" #include "LibLsp/lsp/lsTextDocumentPositionParams.h" /** * The rename request is sent from the client to the server to do a * workspace wide rename of a symbol. * * Registration Options: TextDocumentRegistrationOptions */ struct PrepareRenameResult { /** * The range of the string to rename */ lsRange range; /** * A placeholder text of the string content to be renamed. */ std::string placeholder; MAKE_SWAP_METHOD(PrepareRenameResult, range, placeholder) }; MAKE_REFLECT_STRUCT(PrepareRenameResult, range, placeholder) typedef std::pair, optional> TextDocumentPrepareRenameResult; extern void Reflect(Reader& visitor, TextDocumentPrepareRenameResult& value); DEFINE_REQUEST_RESPONSE_TYPE( td_prepareRename, lsTextDocumentPositionParams, TextDocumentPrepareRenameResult, "textDocument/prepareRename" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/semanticHighlighting.h0000644000000000000000000000540615031566105025767 0ustar rootroot#pragma once #include "LibLsp/lsp/lsDocumentUri.h" #include "LibLsp/lsp/lsVersionedTextDocumentIdentifier.h" #include "LibLsp/JsonRpc/NotificationInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" /** * Represents a semantic highlighting information that has to be applied on a specific line of the text document. */ struct SemanticHighlightingInformation { /** * The zero-based line position in the text document. */ int line = 0; /** * A base64 encoded string representing every single highlighted ranges in the line with its start position, length * and the "lookup table" index of of the semantic highlighting * TextMate scopes. If the {@code tokens} is empty or not defined, then no highlighted positions are available for the line. */ std::string tokens; MAKE_SWAP_METHOD(SemanticHighlightingInformation, line, tokens) }; MAKE_REFLECT_STRUCT(SemanticHighlightingInformation, line, tokens); /** * Parameters for the semantic highlighting (server-side) push notification. */ struct SemanticHighlightingParams { /** * The text document that has to be decorated with the semantic highlighting information. */ lsVersionedTextDocumentIdentifier textDocument; /** * An array of semantic highlighting information. */ std::vector lines; MAKE_SWAP_METHOD(SemanticHighlightingParams, textDocument, lines) }; MAKE_REFLECT_STRUCT(SemanticHighlightingParams, textDocument, lines); /** * The {@code textDocument/semanticHighlighting} notification is pushed from the server to the client * to inform the client about additional semantic highlighting information that has to be applied * on the text document. It is the server's responsibility to decide which lines are included in * the highlighting information. In other words, the server is capable of sending only a delta * information. For instance, after opening the text document ({@code DidOpenTextDocumentNotification}) * the server sends the semantic highlighting information for the entire document, but if the server * receives a {@code DidChangeTextDocumentNotification}, it pushes the information only about * the affected lines in the document. * *

    * Note: the {@code textDocument/semanticHighlighting} * language feature is not yet part of the official LSP specification. */ DEFINE_NOTIFICATION_TYPE(Notify_semanticHighlighting, SemanticHighlightingParams, "textDocument/semanticHighlighting"); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/linkedEditingRange.h0000644000000000000000000000242115031566105025357 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsAny.h" #include "LibLsp/lsp/symbol.h" #include "LibLsp/lsp/lsTextDocumentPositionParams.h" #include "LibLsp/lsp/lsRange.h" struct LinkedEditingRangeParams { lsTextDocumentIdentifier textDocument; lsPosition position; MAKE_SWAP_METHOD(LinkedEditingRangeParams, textDocument, position) }; MAKE_REFLECT_STRUCT(LinkedEditingRangeParams, textDocument, position) struct LinkedEditingRanges { /** * A list of ranges that can be renamed together. The ranges must have * identical length and contain identical text content. The ranges cannot overlap. */ std::vector ranges; /** * An optional word pattern (regular expression) that describes valid contents for * the given ranges. If no pattern is provided, the client configuration's word * pattern will be used. */ optional wordPattern; MAKE_SWAP_METHOD(LinkedEditingRanges, ranges, wordPattern) }; MAKE_REFLECT_STRUCT(LinkedEditingRanges, ranges, wordPattern) DEFINE_REQUEST_RESPONSE_TYPE( td_linkedEditingRange, LinkedEditingRangeParams, optional>, "textDocument/linkedEditingRange" ) asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/did_close.h0000644000000000000000000000144315031566105023560 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/NotificationInMessage.h" namespace TextDocumentDidClose { struct Params { lsTextDocumentIdentifier textDocument; void swap(Params& arg) noexcept { textDocument.swap(arg.textDocument); } }; }; // namespace TextDocumentDidClose MAKE_REFLECT_STRUCT(TextDocumentDidClose::Params, textDocument); /** * The document close notification is sent from the client to the server * when the document got closed in the client. The document's truth now * exists where the document's uri points to (e.g. if the document's uri is * a file uri the truth now exists on disk). * * Registration Options: TextDocumentRegistrationOptions */ DEFINE_NOTIFICATION_TYPE(Notify_TextDocumentDidClose, TextDocumentDidClose::Params, "textDocument/didClose"); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/code_action.h0000644000000000000000000000524015031566105024101 0ustar rootroot#pragma once #include "LibLsp/lsp/method_type.h" #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsTextDocumentIdentifier.h" #include "LibLsp/lsp/CodeActionParams.h" namespace QuickAssistProcessor { extern char const* SPLIT_JOIN_VARIABLE_DECLARATION_ID; //$NON-NLS-1$ extern char const* CONVERT_FOR_LOOP_ID; // ;// "org.eclipse.jdt.ls.correction.convertForLoop.assist"; //$NON-NLS-1$ extern char const* ASSIGN_TO_LOCAL_ID; // "org.eclipse.jdt.ls.correction.assignToLocal.assist"; //$NON-NLS-1$ extern char const* ASSIGN_TO_FIELD_ID; // "org.eclipse.jdt.ls.correction.assignToField.assist"; //$NON-NLS-1$ extern char const* ASSIGN_PARAM_TO_FIELD_ID; // "org.eclipse.jdt.ls.correction.assignParamToField.assist"; //$NON-NLS-1$ extern char const* ASSIGN_ALL_PARAMS_TO_NEW_FIELDS_ID; // "org.eclipse.jdt.ls.correction.assignAllParamsToNewFields.assist"; //$NON-NLS-1$ extern char const* ADD_BLOCK_ID; // "org.eclipse.jdt.ls.correction.addBlock.assist"; //$NON-NLS-1$ extern char const* EXTRACT_LOCAL_ID; // "org.eclipse.jdt.ls.correction.extractLocal.assist"; //$NON-NLS-1$ extern char const* EXTRACT_LOCAL_NOT_REPLACE_ID; // "org.eclipse.jdt.ls.correction.extractLocalNotReplaceOccurrences.assist"; //$NON-NLS-1$ extern char const* EXTRACT_CONSTANT_ID; // "org.eclipse.jdt.ls.correction.extractConstant.assist"; //$NON-NLS-1$ extern char const* INLINE_LOCAL_ID; // "org.eclipse.jdt.ls.correction.inlineLocal.assist"; //$NON-NLS-1$ extern char const* CONVERT_LOCAL_TO_FIELD_ID; // "org.eclipse.jdt.ls.correction.convertLocalToField.assist"; //$NON-NLS-1$ extern char const* CONVERT_ANONYMOUS_TO_LOCAL_ID; // "org.eclipse.jdt.ls.correction.convertAnonymousToLocal.assist"; //$NON-NLS-1$ extern char const* CONVERT_TO_STRING_BUFFER_ID; // "org.eclipse.jdt.ls.correction.convertToStringBuffer.assist"; //$NON-NLS-1$ extern char const* CONVERT_TO_MESSAGE_FORMAT_ID; // "org.eclipse.jdt.ls.correction.convertToMessageFormat.assist"; //$NON-NLS-1$; extern char const* EXTRACT_METHOD_INPLACE_ID; // "org.eclipse.jdt.ls.correction.extractMethodInplace.assist"; //$NON-NLS-1$; extern char const* CONVERT_ANONYMOUS_CLASS_TO_NESTED_COMMAND; // "convertAnonymousClassToNestedCommand"; }; // namespace QuickAssistProcessor /** * The code action request is sent from the client to the server to compute * commands for a given text document and range. These commands are * typically code fixes to either fix problems or to beautify/refactor code. * * Registration Options: TextDocumentRegistrationOptions */ DEFINE_REQUEST_RESPONSE_TYPE( td_codeAction, lsCodeActionParams, std::vector, "textDocument/codeAction" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/typeHierarchy.h0000644000000000000000000001070415031566105024453 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsTextDocumentPositionParams.h" #include "LibLsp/lsp/symbol.h" #include "LibLsp/lsp/lsAny.h" /** * The {@code textDocument/typeHierarchy} request is sent from the client to the * server to retrieve a {@link TypeHierarchyItem type hierarchy item} based on * the {@link TypeHierarchyParams cursor position in the text document}. This * request would also allow to specify if the item should be resolved and * whether sub- or supertypes are to be resolved. If no type hierarchy item can * be found under the given text document position, resolves to {@code null}. * *

    * Note: the {@code textDocument/typeHierarchy} * language feature is not yet part of the official LSP specification. */ enum class TypeHierarchyDirection : uint32_t { /** * Flag for retrieving/resolving the subtypes. Value: {@code 0}. */ Children = 0, /** * Flag to use when retrieving/resolving the supertypes. Value: {@code 1}. */ Parents = 1, /** * Flag for resolving both the super- and subtypes. Value: {@code 2}. */ Both = 2 }; void Reflect(Reader& reader, TypeHierarchyDirection& value); void Reflect(Writer& writer, TypeHierarchyDirection& value); struct TypeHierarchyParams : public lsTextDocumentPositionParams { optional resolve; optional direction; MAKE_SWAP_METHOD(TypeHierarchyParams, textDocument, position, resolve, direction) }; MAKE_REFLECT_STRUCT(TypeHierarchyParams, textDocument, position, resolve, direction); /** * Representation of an item that carries type information (such as class, interface, enumeration, etc) with additional parentage details. */ struct TypeHierarchyItem { /** * The human readable name of the hierarchy item. */ std::string name; /** * Optional detail for the hierarchy item. It can be, for instance, the signature of a function or method. */ optional detail; /** * The kind of the hierarchy item. For instance, class or interface. */ SymbolKind kind; /** * {@code true} if the hierarchy item is deprecated. Otherwise, {@code false}. It is {@code false} by default. */ optional deprecated; /** * The URI of the text document where this type hierarchy item belongs to. */ lsDocumentUri uri; /** * The range enclosing this type hierarchy item not including leading/trailing whitespace but everything else * like comments. This information is typically used to determine if the clients cursor is inside the type * hierarchy item to reveal in the symbol in the UI. * * @see TypeHierarchyItem#selectionRange */ lsRange range; /** * The range that should be selected and revealed when this type hierarchy item is being picked, e.g the name of a function. * Must be contained by the the {@link TypeHierarchyItem#getRange range}. * * @see TypeHierarchyItem#range */ lsRange selectionRange; /** * If this type hierarchy item is resolved, it contains the direct parents. Could be empty if the item does not have any * direct parents. If not defined, the parents have not been resolved yet. */ optional> parents; /** * If this type hierarchy item is resolved, it contains the direct children of the current item. * Could be empty if the item does not have any descendants. If not defined, the children have not been resolved. */ optional> children; /** * An optional data field can be used to identify a type hierarchy item in a resolve request. */ optional data; MAKE_SWAP_METHOD( TypeHierarchyItem, name, detail, kind, deprecated, uri, range, selectionRange, parents, children, data ) }; MAKE_REFLECT_STRUCT( TypeHierarchyItem, name, detail, kind, deprecated, uri, range, selectionRange, parents, children, data ); DEFINE_REQUEST_RESPONSE_TYPE(td_typeHierarchy, TypeHierarchyParams, TypeHierarchyItem, "textDocument/typeHierarchy"); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/type_definition.h0000644000000000000000000000075715031566105025033 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/lsp/out_list.h" /** * The goto type definition request is sent from the client to the server to resolve * the type definition location of a symbol at a given text document position. * * Registration Options: TextDocumentRegistrationOptions * * Since version 3.6.0 */ DEFINE_REQUEST_RESPONSE_TYPE( td_typeDefinition, lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/typeDefinition" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/publishDiagnostics.h0000644000000000000000000000143515031566105025472 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/NotificationInMessage.h" #include "LibLsp/lsp/lsp_diagnostic.h" // Diagnostics namespace TextDocumentPublishDiagnostics { struct Params { // The URI for which diagnostic information is reported. lsDocumentUri uri; // An array of diagnostic information items. std::vector diagnostics; MAKE_SWAP_METHOD(Params, uri, diagnostics); }; }; // namespace TextDocumentPublishDiagnostics MAKE_REFLECT_STRUCT(TextDocumentPublishDiagnostics::Params, uri, diagnostics); /** * Diagnostics notifications are sent from the server to the client to * signal results of validation runs. */ DEFINE_NOTIFICATION_TYPE( Notify_TextDocumentPublishDiagnostics, TextDocumentPublishDiagnostics::Params, "textDocument/publishDiagnostics" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/rename.h0000644000000000000000000000204415031566105023100 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsWorkspaceEdit.h" #include "LibLsp/lsp/lsTextDocumentIdentifier.h" namespace TextDocumentRename { struct Params { // The document to format. lsTextDocumentIdentifier textDocument; // The position at which this request was sent. lsPosition position; // The new name of the symbol. If the given name is not valid the // request must return a [ResponseError](#ResponseError) with an // appropriate message set. std::string newName; MAKE_SWAP_METHOD(Params, textDocument, position, newName); }; }; // namespace TextDocumentRename MAKE_REFLECT_STRUCT(TextDocumentRename::Params, textDocument, position, newName); /** * The rename request is sent from the client to the server to do a * workspace wide rename of a symbol. * * Registration Options: TextDocumentRegistrationOptions */ DEFINE_REQUEST_RESPONSE_TYPE(td_rename, TextDocumentRename::Params, lsWorkspaceEdit, "textDocument/rename"); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/implementation.h0000644000000000000000000000075515031566105024665 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/lsp/out_list.h" /** * The goto implementation request is sent from the client to the server to resolve * the implementation location of a symbol at a given text document position. * * Registration Options: TextDocumentRegistrationOptions * * Since version 3.6.0 */ DEFINE_REQUEST_RESPONSE_TYPE( td_implementation, lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/implementation" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/did_save.h0000644000000000000000000000147315031566105023414 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/NotificationInMessage.h" namespace TextDocumentDidSave { struct Params { // The document that was saved. lsTextDocumentIdentifier textDocument; // Optional the content when saved. Depends on the includeText value // when the save notifcation was requested. optional text; MAKE_SWAP_METHOD(TextDocumentDidSave::Params, textDocument, text); }; }; // namespace TextDocumentDidSave MAKE_REFLECT_STRUCT(TextDocumentDidSave::Params, textDocument, text); /** * The document save notification is sent from the client to the server when * the document for saved in the client. * * Registration Options: TextDocumentSaveRegistrationOptions */ DEFINE_NOTIFICATION_TYPE(Notify_TextDocumentDidSave, TextDocumentDidSave::Params, "textDocument/didSave"); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/declaration_definition.h0000644000000000000000000000165615031566105026336 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsTextDocumentPositionParams.h" #include "LibLsp/lsp/out_list.h" /** * The go to declaration request is sent from the client to the server to resolve * the declaration location of a symbol at a given text document position. * * Registration Options: TextDocumentRegistrationOptions * * Since version 3.14.0 */ DEFINE_REQUEST_RESPONSE_TYPE( td_declaration, lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/declaration" ); /** * The goto definition request is sent from the client to the server to resolve * the definition location of a symbol at a given text document position. * * Registration Options: TextDocumentRegistrationOptions */ DEFINE_REQUEST_RESPONSE_TYPE( td_definition, lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/definition" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/SemanticTokens.h0000644000000000000000000002500015031566105024555 0ustar rootroot#pragma once #include "LibLsp/lsp/lsTextDocumentIdentifier.h" #include "LibLsp/lsp/lsVersionedTextDocumentIdentifier.h" #include "LibLsp/JsonRpc/RequestInMessage.h" enum class HighlightingKind_clangD { Variable = 0, LocalVariable, Parameter, Function, Method, StaticMethod, Field, StaticField, Class, Interface, Enum, EnumConstant, Typedef, Type, Unknown, Namespace, TemplateParameter, Concept, Primitive, Macro, // This one is different from the other kinds as it's a line style // rather than a token style. InactiveCode, LastKind = InactiveCode }; std::string toSemanticTokenType(HighlightingKind_clangD kind); enum class HighlightingModifier_clangD { Declaration, Deprecated, Deduced, Readonly, Static, Abstract, DependentName, DefaultLibrary, FunctionScope, ClassScope, FileScope, GlobalScope, LastModifier = GlobalScope }; std::string toSemanticTokenModifier(HighlightingModifier_clangD modifier); enum SemanticTokenType { ls_namespace = 0, // 'namespace', /** * Represents a generic type. Acts as a fallback for types which * can't be mapped to a specific type like class or enum. */ ls_type, // 'type', ls_class, // 'class', ls_enum, // 'enum', ls_interface, // 'interface', ls_struct, // 'struct', ls_typeParameter, // 'typeParameter', ls_parameter, // 'parameter', ls_variable, // 'variable', ls_property, // 'property', ls_enumMember, // 'enumMember', ls_event, // 'event', ls_function, // 'function', ls_method, // 'method', ls_macro, // 'macro', ls_keyword, // 'keyword', ls_modifier, // 'modifier', ls_comment, // 'comment', ls_string, // 'string', ls_number, // 'number', ls_regexp, // 'regexp', ls_operator, // 'operator' lastKind = ls_operator }; std::string to_string(SemanticTokenType); unsigned toSemanticTokenType(std::vector& modifiers); enum TokenType_JDT { PACKAGE_JDT = 0, CLASS_JDT, INTERFACE_JDT, ENUM_JDT, ENUM_MEMBER_JDT, TYPE_JDT, TYPE_PARAMETER_JDT, ANNOTATION_JDT, ANNOTATION_MEMBER_JDT, METHOD_JDT, PROPERTY_JDT, VARIABLE_JDT, PARAMETER_JDT }; std::string to_string(TokenType_JDT); enum SemanticTokenModifier { ls_declaration = 0, // 'declaration', ls_definition, // 'definition', ls_readonly, // 'readonly', ls_static, // 'static', ls_deprecated, // 'deprecated', ls_abstract, // 'abstract', ls_async, // 'async', ls_modification, // 'modification', ls_documentation, // 'documentation', ls_defaultLibrary, // 'defaultLibrary' LastModifier = ls_defaultLibrary }; std::string to_string(SemanticTokenModifier); unsigned toSemanticTokenModifiers(std::vector&); /// Specifies a single semantic token in the document. /// This struct is not part of LSP, which just encodes lists of tokens as /// arrays of numbers directly. struct SemanticToken { /// token line number, relative to the previous token unsigned deltaLine = 0; /// token start character, relative to the previous token /// (relative to 0 or the previous token's start if they are on the same line) unsigned deltaStart = 0; /// the length of the token. A token cannot be multiline unsigned length = 0; /// will be looked up in `SemanticTokensLegend.tokenTypes` unsigned tokenType = 0; /// each set bit will be looked up in `SemanticTokensLegend.tokenModifiers` unsigned tokenModifiers = 0; }; bool operator==(SemanticToken const&, SemanticToken const&); struct SemanticTokens { /** * Tokens in a file are represented as an array of integers. The position of each token is expressed relative to * the token before it, because most tokens remain stable relative to each other when edits are made in a file. * * --- * In short, each token takes 5 integers to represent, so a specific token `i` in the file consists of the following array indices: * - at index `5*i` - `deltaLine`: token line number, relative to the previous token * - at index `5*i+1` - `deltaStart`: token start character, relative to the previous token (relative to 0 or the previous token's start if they are on the same line) * - at index `5*i+2` - `length`: the length of the token. A token cannot be multiline. * - at index `5*i+3` - `tokenType`: will be looked up in `SemanticTokensLegend.tokenTypes`. We currently ask that `tokenType` < 65536. * - at index `5*i+4` - `tokenModifiers`: each set bit will be looked up in `SemanticTokensLegend.tokenModifiers` * * --- * ### How to encode tokens * * Here is an example for encoding a file with 3 tokens in a uint32 array: * ``` * { line: 2, startChar: 5, length: 3, tokenType: "property", tokenModifiers: ["private", "static"] }, * { line: 2, startChar: 10, length: 4, tokenType: "type", tokenModifiers: [] }, * { line: 5, startChar: 2, length: 7, tokenType: "class", tokenModifiers: [] } * ``` * * 1. First of all, a legend must be devised. This legend must be provided up-front and capture all possible token types. * For this example, we will choose the following legend which must be passed in when registering the provider: * ``` * tokenTypes: ['property', 'type', 'class'], * tokenModifiers: ['private', 'static'] * ``` * * 2. The first transformation step is to encode `tokenType` and `tokenModifiers` as integers using the legend. Token types are looked * up by index, so a `tokenType` value of `1` means `tokenTypes[1]`. Multiple token modifiers can be set by using bit flags, * so a `tokenModifier` value of `3` is first viewed as binary `0b00000011`, which means `[tokenModifiers[0], tokenModifiers[1]]` because * bits 0 and 1 are set. Using this legend, the tokens now are: * ``` * { line: 2, startChar: 5, length: 3, tokenType: 0, tokenModifiers: 3 }, * { line: 2, startChar: 10, length: 4, tokenType: 1, tokenModifiers: 0 }, * { line: 5, startChar: 2, length: 7, tokenType: 2, tokenModifiers: 0 } * ``` * * 3. The next step is to represent each token relative to the previous token in the file. In this case, the second token * is on the same line as the first token, so the `startChar` of the second token is made relative to the `startChar` * of the first token, so it will be `10 - 5`. The third token is on a different line than the second token, so the * `startChar` of the third token will not be altered: * ``` * { deltaLine: 2, deltaStartChar: 5, length: 3, tokenType: 0, tokenModifiers: 3 }, * { deltaLine: 0, deltaStartChar: 5, length: 4, tokenType: 1, tokenModifiers: 0 }, * { deltaLine: 3, deltaStartChar: 2, length: 7, tokenType: 2, tokenModifiers: 0 } * ``` * * 4. Finally, the last step is to inline each of the 5 fields for a token in a single array, which is a memory friendly representation: * ``` * // 1st token, 2nd token, 3rd token * [ 2,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] * ``` */ std::vector data; static std::vector encodeTokens(std::vector& tokens); /** * An optional result id. If provided and clients support delta updating * the client will include the result id in the next semantic token request. * A server can then instead of computing all semantic tokens again simply * send a delta. */ optional resultId; MAKE_SWAP_METHOD(SemanticTokens, data, resultId) }; MAKE_REFLECT_STRUCT(SemanticTokens, data, resultId) /// Body of textDocument/semanticTokens/full request. struct SemanticTokensParams { /// The text document. lsTextDocumentIdentifier textDocument; MAKE_REFLECT_STRUCT(SemanticTokensParams, textDocument) }; MAKE_REFLECT_STRUCT(SemanticTokensParams, textDocument) /// Body of textDocument/semanticTokens/full/delta request. /// Requests the changes in semantic tokens since a previous response. struct SemanticTokensDeltaParams { /// The text document. lsTextDocumentIdentifier textDocument; /** * The result id of a previous response. The result Id can either point to * a full response or a delta response depending on what was received last. */ std::string previousResultId; MAKE_REFLECT_STRUCT(SemanticTokensDeltaParams, textDocument, previousResultId) }; MAKE_REFLECT_STRUCT(SemanticTokensDeltaParams, textDocument, previousResultId) /// Describes a a replacement of a contiguous range of semanticTokens. struct SemanticTokensEdit { // LSP specifies `start` and `deleteCount` which are relative to the array // encoding of the previous tokens. // We use token counts instead, and translate when serializing this struct. unsigned startToken = 0; unsigned deleteTokens = 0; std::vector tokens; // encoded as a flat integer array MAKE_REFLECT_STRUCT(SemanticTokensEdit, startToken, deleteTokens, tokens) }; MAKE_REFLECT_STRUCT(SemanticTokensEdit, startToken, deleteTokens, tokens) /// This models LSP SemanticTokensDelta | SemanticTokens, which is the result of /// textDocument/semanticTokens/full/delta. struct SemanticTokensOrDelta { optional resultId; /// Set if we computed edits relative to a previous set of tokens. optional> edits; /// Set if we computed a fresh set of tokens. /// Set if we computed edits relative to a previous set of tokens. optional> tokens; // encoded as integer array MAKE_REFLECT_STRUCT(SemanticTokensOrDelta, resultId, edits, tokens) }; MAKE_REFLECT_STRUCT(SemanticTokensOrDelta, resultId, edits, tokens) struct SemanticTokensLegend { std::vector tokenTypes; std::vector tokenModifiers; MAKE_REFLECT_STRUCT(SemanticTokensLegend, tokenTypes, tokenModifiers) }; MAKE_REFLECT_STRUCT(SemanticTokensLegend, tokenTypes, tokenModifiers) DEFINE_REQUEST_RESPONSE_TYPE( td_semanticTokens_full, SemanticTokensParams, optional, "textDocument/semanticTokens/full" ) DEFINE_REQUEST_RESPONSE_TYPE( td_semanticTokens_full_delta, SemanticTokensDeltaParams, optional, "textDocument/semanticTokens/full/delta" ) asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/callHierarchy.h0000644000000000000000000000745015031566105024411 0ustar rootroot#pragma once #include "LibLsp/lsp/lsAny.h" #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/symbol.h" #include "LibLsp/lsp/lsTextDocumentPositionParams.h" #include "LibLsp/lsp/lsRange.h" enum class SymbolTag { Deprecated = 1 }; MAKE_REFLECT_TYPE_PROXY(SymbolTag) struct CallHierarchyPrepareParams { lsTextDocumentIdentifier textDocument; lsPosition position; MAKE_SWAP_METHOD(CallHierarchyPrepareParams, textDocument, position) }; MAKE_REFLECT_STRUCT(CallHierarchyPrepareParams, textDocument, position) /// Represents programming constructs like functions or constructors /// in the context of call hierarchy. struct CallHierarchyItem { /// The name of this item. std::string name; /// The kind of this item. SymbolKind kind; /// Tags for this item. optional> tags; /// More detaill for this item, e.g. the signature of a function. optional detail; /// The resource identifier of this item. lsDocumentUri uri; /** * The range enclosing this symbol not including leading/trailing whitespace * but everything else, e.g. comments and code. */ lsRange range; /** * The range that should be selected and revealed when this symbol is being * picked, e.g. the name of a function. Must be contained by the * [`range`](#CallHierarchyItem.range). */ lsRange selectionRange; /** * A data entry field that is preserved between a call hierarchy prepare and * incoming calls or outgoing calls requests. */ optional data; MAKE_SWAP_METHOD(CallHierarchyItem, name, kind, tags, detail, uri, range, selectionRange, data) }; MAKE_REFLECT_STRUCT(CallHierarchyItem, name, kind, tags, detail, uri, range, selectionRange, data) /// The parameter of a `callHierarchy/incomingCalls` request. struct CallHierarchyIncomingCallsParams { CallHierarchyItem item; MAKE_SWAP_METHOD(CallHierarchyIncomingCallsParams, item) }; MAKE_REFLECT_STRUCT(CallHierarchyIncomingCallsParams, item) /// Represents an incoming call, e.g. a caller of a method or constructor. struct CallHierarchyIncomingCall { /// The item that makes the call. CallHierarchyItem from; /// The range at which the calls appear. /// This is relative to the caller denoted by `From`. std::vector fromRanges; MAKE_SWAP_METHOD(CallHierarchyIncomingCall, from, fromRanges) }; MAKE_REFLECT_STRUCT(CallHierarchyIncomingCall, from, fromRanges) /// The parameter of a `callHierarchy/outgoingCalls` request. struct CallHierarchyOutgoingCallsParams { CallHierarchyItem item; MAKE_SWAP_METHOD(CallHierarchyOutgoingCallsParams, item) }; MAKE_REFLECT_STRUCT(CallHierarchyOutgoingCallsParams, item) /// Represents an outgoing call, e.g. calling a getter from a method or /// a method from a constructor etc. struct CallHierarchyOutgoingCall { /// The item that is called. CallHierarchyItem to; /// The range at which this item is called. /// This is the range relative to the caller, and not `To`. std::vector fromRanges; MAKE_SWAP_METHOD(CallHierarchyOutgoingCall, to, fromRanges) }; MAKE_REFLECT_STRUCT(CallHierarchyOutgoingCall, to, fromRanges) DEFINE_REQUEST_RESPONSE_TYPE( td_prepareCallHierarchy, CallHierarchyPrepareParams, optional>, "textDocument/prepareCallHierarchy" ) DEFINE_REQUEST_RESPONSE_TYPE( td_incomingCalls, CallHierarchyIncomingCallsParams, optional>, "callHierarchy/incomingCalls" ) DEFINE_REQUEST_RESPONSE_TYPE( td_outgoingCalls, CallHierarchyOutgoingCallsParams, optional>, "callHierarchy/CallHierarchyOutgoingCall" ) asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/did_change.h0000644000000000000000000000300215031566105023671 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/NotificationInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsVersionedTextDocumentIdentifier.h" #include "LibLsp/lsp/lsRange.h" #include "LibLsp/lsp/lsDocumentUri.h" struct lsTextDocumentContentChangeEvent { // The range of the document that changed. optional range; // The length of the range that got replaced. optional rangeLength; // The new text of the range/document. std::string text; MAKE_SWAP_METHOD(lsTextDocumentContentChangeEvent, range, rangeLength, text); }; MAKE_REFLECT_STRUCT(lsTextDocumentContentChangeEvent, range, rangeLength, text); struct lsTextDocumentDidChangeParams { lsVersionedTextDocumentIdentifier textDocument; std::vector contentChanges; /** * Legacy property to support protocol version 1.0 requests. */ optional uri; void swap(lsTextDocumentDidChangeParams& arg) noexcept { uri.swap(arg.uri); contentChanges.swap(arg.contentChanges); textDocument.swap(arg.textDocument); } }; MAKE_REFLECT_STRUCT(lsTextDocumentDidChangeParams, textDocument, contentChanges, uri); /** * The document change notification is sent from the client to the server to * signal changes to a text document. * * Registration Options: TextDocumentChangeRegistrationOptions */ DEFINE_NOTIFICATION_TYPE(Notify_TextDocumentDidChange, lsTextDocumentDidChangeParams, "textDocument/didChange"); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/formatting.h0000644000000000000000000000153615031566105024010 0ustar rootroot#pragma once #include "LibLsp/lsp/lsFormattingOptions.h" #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" namespace TextDocumentFormatting { struct Params { /** * The document to format. */ lsTextDocumentIdentifier textDocument; /** * The format options. */ lsFormattingOptions options; MAKE_SWAP_METHOD(Params, textDocument, options); }; }; // namespace TextDocumentFormatting MAKE_REFLECT_STRUCT(TextDocumentFormatting::Params, textDocument, options); /** * The document formatting request is sent from the client to the server to * format a whole document. * * Registration Options: TextDocumentRegistrationOptions */ DEFINE_REQUEST_RESPONSE_TYPE( td_formatting, TextDocumentFormatting::Params, std::vector, "textDocument/formatting" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/highlight.h0000644000000000000000000000107215031566105023600 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsTextDocumentPositionParams.h" #include "document_symbol.h" /** * The references request is sent from the client to the server to resolve * project-wide references for the symbol denoted by the given text document * position. * * Registration Options: TextDocumentRegistrationOptions */ DEFINE_REQUEST_RESPONSE_TYPE( td_highlight, lsTextDocumentPositionParams, std::vector, "textDocument/documentHighlight" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/resolveTypeHierarchy.h0000644000000000000000000000152315031566105026012 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/symbol.h" #include "typeHierarchy.h" struct ResolveTypeHierarchyItemParams { /** * The hierarchy item to resolve. */ TypeHierarchyItem item; /** * The number of hierarchy levels to resolve. {@code 0} indicates no hierarchy level. */ optional resolve; /** * The direction of the type hierarchy resolution. */ TypeHierarchyDirection direction; MAKE_SWAP_METHOD(ResolveTypeHierarchyItemParams, item, resolve, direction) }; MAKE_REFLECT_STRUCT(ResolveTypeHierarchyItemParams, item, resolve, direction) DEFINE_REQUEST_RESPONSE_TYPE( typeHierarchy_resolve, ResolveTypeHierarchyItemParams, TypeHierarchyItem, "typeHierarchy/resolve" ) asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/did_open.h0000644000000000000000000000166615031566105023423 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/NotificationInMessage.h" #include "LibLsp/lsp/lsTextDocumentItem.h" // Open, view, change, close file namespace TextDocumentDidOpen { struct Params { lsTextDocumentItem textDocument; /** * Legacy property to support protocol version 1.0 requests. */ optional text; MAKE_SWAP_METHOD(TextDocumentDidOpen::Params, textDocument, text); }; } // namespace TextDocumentDidOpen MAKE_REFLECT_STRUCT(TextDocumentDidOpen::Params, textDocument, text); /** * The document open notification is sent from the client to the server to * signal newly opened text documents. The document's truth is now managed * by the client and the server must not try to read the document's truth * using the document's uri. * * Registration Options: TextDocumentRegistrationOptions */ ; DEFINE_NOTIFICATION_TYPE(Notify_TextDocumentDidOpen, TextDocumentDidOpen::Params, "textDocument/didOpen"); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/resolveCodeLens.h0000644000000000000000000000033515031566105024726 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "code_lens.h" DEFINE_REQUEST_RESPONSE_TYPE(codeLens_resolve, lsCodeLens, lsCodeLens, "codeLens/resolve") asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/hover.h0000644000000000000000000000326715031566105022764 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsMarkedString.h" #include "LibLsp/lsp/lsTextDocumentPositionParams.h" #include "LibLsp/lsp/lsRange.h" /** * The hover request is sent from the client to the server to request hover * information at a given text document position. * * Registration Options: TextDocumentRegistrationOptions */ namespace TextDocumentHover { typedef optional, optional>>> Left; typedef std::pair> Either; struct Result { /** * The hover's content as markdown */ Either contents; /** * An optional range */ optional range; MAKE_SWAP_METHOD(Result, contents, range) }; } // namespace TextDocumentHover MAKE_REFLECT_STRUCT(TextDocumentHover::Result, contents, range); extern void Reflect(Reader& visitor, std::pair, optional>& value); extern void Reflect(Reader& visitor, TextDocumentHover::Either& value); DEFINE_REQUEST_RESPONSE_TYPE(td_hover, lsTextDocumentPositionParams, TextDocumentHover::Result, "textDocument/hover") //struct Rsp_TextDocumentHover : ResponseMessage< TextDocumentHover::Result, Rsp_TextDocumentHover> { // //}; //MAKE_REFLECT_STRUCT(Rsp_TextDocumentHover, // jsonrpc, // id, // result); //MAKE_REFLECT_STRUCT_OPTIONALS_MANDATORY(Rsp_TextDocumentHover, // jsonrpc, // id, // result); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/documentColor.h0000644000000000000000000000401115031566105024442 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsTextDocumentIdentifier.h" #include "LibLsp/lsp/lsRange.h" #include struct DocumentColorParams { /** * The text document. */ lsTextDocumentIdentifier textDocument; MAKE_SWAP_METHOD(DocumentColorParams, textDocument); }; MAKE_REFLECT_STRUCT(DocumentColorParams, textDocument); /** * The document color request is sent from the client to the server to list all color references found in a given text * document. Along with the range, a color value in RGB is returned. * * Clients can use the result to decorate color references in an editor. For example: * - Color boxes showing the actual color next to the reference * - Show a color picker when a color reference is edited * * Since version 3.6.0 */ namespace TextDocument { struct Color { /** * The red component of this color in the range [0-1]. */ double red = 0; /** * The green component of this color in the range [0-1]. */ double green = 0; /** * The blue component of this color in the range [0-1]. */ double blue = 0; /** * The alpha component of this color in the range [0-1]. */ double alpha = 0; MAKE_SWAP_METHOD(TextDocument::Color, red, green, blue, alpha) }; } // namespace TextDocument MAKE_REFLECT_STRUCT(TextDocument::Color, red, green, blue, alpha) struct ColorInformation { /** * The range in the document where this color appers. */ lsRange range; /** * The actual color value for this color range. */ TextDocument::Color color; MAKE_SWAP_METHOD(ColorInformation, range, color) }; MAKE_REFLECT_STRUCT(ColorInformation, range, color) DEFINE_REQUEST_RESPONSE_TYPE( td_documentColor, DocumentColorParams, std::vector, "textDocument/documentColor" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/selectionRange.h0000644000000000000000000000275215031566105024601 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsPosition.h" #include "LibLsp/lsp/lsTextDocumentIdentifier.h" struct SelectionRangeParams { /** * The text document. */ lsTextDocumentIdentifier textDocument; /** * The positions inside the text document. */ std::vector positions; MAKE_SWAP_METHOD(SelectionRangeParams, textDocument, positions) }; MAKE_REFLECT_STRUCT(SelectionRangeParams, textDocument, positions) struct SelectionRange { /** * The [range](#Range) of this selection range. */ lsRange range; /** * The parent selection range containing this range. Therefore `parent.range` must contain `this.range`. */ optional parent; MAKE_SWAP_METHOD(SelectionRange, range, parent) }; extern void Reflect(Reader& visitor, optional& value); extern void Reflect(Writer& visitor, SelectionRange* value); MAKE_REFLECT_STRUCT(SelectionRange, range, parent) /** * The {@code textDocument/selectionRange} request is sent from the client to the server to return * suggested selection ranges at an array of given positions. A selection range is a range around * the cursor position which the user might be interested in selecting. */ DEFINE_REQUEST_RESPONSE_TYPE( td_selectionRange, SelectionRangeParams, std::vector, "textDocument/selectionRange" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/code_lens.h0000644000000000000000000000216315031566105023566 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" struct lsDocumentCodeLensParams { /** * The document to request code lens for. */ lsTextDocumentIdentifier textDocument; MAKE_SWAP_METHOD(lsDocumentCodeLensParams, textDocument); }; MAKE_REFLECT_STRUCT(lsDocumentCodeLensParams, textDocument); struct lsCodeLens { // The range in which this code lens is valid. Should only span a single line. lsRange range; // The command this code lens represents. optional command; // A data entry field that is preserved on a code lens item between // a code lens and a code lens resolve request. optional data; MAKE_SWAP_METHOD(lsCodeLens, range, command, data) }; MAKE_REFLECT_STRUCT(lsCodeLens, range, command, data) /** * The code lens request is sent from the client to the server to compute * code lenses for a given text document. * * Registration Options: CodeLensRegistrationOptions */ DEFINE_REQUEST_RESPONSE_TYPE(td_codeLens, lsDocumentCodeLensParams, std::vector, "textDocument/codeLens") asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/inlayHint.h0000644000000000000000000001201515031566105023567 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsTextDocumentIdentifier.h" #include "LibLsp/lsp/lsRange.h" #include "LibLsp/lsp/location_type.h" #include "LibLsp/lsp/lsCommand.h" #include "LibLsp/lsp/lsTextEdit.h" #include "LibLsp/lsp/lsAny.h" namespace TextDocumentInlayHint { struct Params { // The text document lsTextDocumentIdentifier textDocument; // The visible document range for which inlay hints should be computed. lsRange range; MAKE_SWAP_METHOD(Params, textDocument, range) }; }; // namespace TextDocumentInlayHint MAKE_REFLECT_STRUCT(TextDocumentInlayHint::Params, textDocument, range); struct lsInlayHintLabelPart { /** * The value of this label part. */ std::string value; /** * The tooltip text when you hover over this label part. Depending on * the client capability `inlayHint.resolveSupport` clients might resolve * this property late using the resolve request. */ optional tooltip; /** * An optional source code location that represents this * label part. * * The editor will use this location for the hover and for code navigation * features: This part will become a clickable link that resolves to the * definition of the symbol at the given location (not necessarily the * location itself), it shows the hover that shows at the given location, * and it shows a context menu with further code navigation commands. * * Depending on the client capability `inlayHint.resolveSupport` clients * might resolve this property late using the resolve request. */ optional location; /** * An optional command for this label part. * * Depending on the client capability `inlayHint.resolveSupport` clients * might resolve this property late using the resolve request. */ optional> command; MAKE_SWAP_METHOD(lsInlayHintLabelPart, value, tooltip, location, command) }; MAKE_REFLECT_STRUCT(lsInlayHintLabelPart, value, tooltip, location, command); enum class lsInlayHintKind { // An inlay hint that for a type annotation. Type = 1, // An inlay hint that is for a parameter. Parameter = 2 }; MAKE_REFLECT_TYPE_PROXY(lsInlayHintKind); /** * a inlay hint is displayed in the editor right next to normal code, it is only readable text * that acts like a hint, for example parameter names in function calls are displayed in editors * as inlay hints */ struct lsInlayHint { /** * The position of this hint. * * If multiple hints have the same position, they will be shown in the order * they appear in the response. */ lsPosition position; /** * The label of this hint. A human readable string or an array of * InlayHintLabelPart label parts. * * *Note* that neither the string nor the label part can be empty. */ std::string label; /** * The kind of this hint. Can be omitted in which case the client * should fall back to a reasonable default. */ optional kind; /** * Optional text edits that are performed when accepting this inlay hint. * * *Note* that edits are expected to change the document so that the inlay * hint (or its nearest variant) is now part of the document and the inlay * hint itself is now obsolete. * * Depending on the client capability `inlayHint.resolveSupport` clients * might resolve this property late using the resolve request. */ optional> textEdits; /** * The tooltip text when you hover over this item. * * Depending on the client capability `inlayHint.resolveSupport` clients * might resolve this property late using the resolve request. */ optional tooltip; /** * Render padding before the hint. * * Note: Padding should use the editor's background color, not the * background color of the hint itself. That means padding can be used * to visually align/separate an inlay hint. */ optional paddingLeft; /** * Render padding after the hint. * * Note: Padding should use the editor's background color, not the * background color of the hint itself. That means padding can be used * to visually align/separate an inlay hint. */ optional paddingRight; /** * A data entry field that is preserved on an inlay hint between * a `textDocument/inlayHint` and a `inlayHint/resolve` request. */ optional data; MAKE_SWAP_METHOD(lsInlayHint, position, label, kind, textEdits, tooltip, paddingLeft, paddingRight, data) }; MAKE_REFLECT_STRUCT(lsInlayHint, position, label, kind, textEdits, tooltip, paddingLeft, paddingRight, data) DEFINE_REQUEST_RESPONSE_TYPE( td_inlayHint, TextDocumentInlayHint::Params, std::vector, "textDocument/inlayHint" ); /** * The document link resolve request is sent from the client to the server to resolve the target of a given document link. */ DEFINE_REQUEST_RESPONSE_TYPE(td_inlayHintResolve, lsInlayHint, lsInlayHint, "inlayHint/resolve"); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/didRenameFiles.h0000644000000000000000000000212715031566105024506 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "LibLsp/lsp/CodeActionParams.h" #include "LibLsp/lsp/lsWorkspaceEdit.h" class FileRenameEvent { public: std::string oldUri; std::string newUri; FileRenameEvent() { } FileRenameEvent(std::string oldUri, std::string newUri) { this->oldUri = oldUri; this->newUri = newUri; } MAKE_SWAP_METHOD(FileRenameEvent, oldUri, newUri); }; MAKE_REFLECT_STRUCT(FileRenameEvent, oldUri, newUri); class FileRenameParams { public: std::vector files; FileRenameParams() { } FileRenameParams(std::vector& files) { this->files = files; } MAKE_SWAP_METHOD(FileRenameParams, files); }; MAKE_REFLECT_STRUCT(FileRenameParams, files); DEFINE_REQUEST_RESPONSE_TYPE(td_didRenameFiles, FileRenameParams, optional, "java/didRenameFiles"); DEFINE_REQUEST_RESPONSE_TYPE(td_willRenameFiles, FileRenameParams, optional, "java/willRenameFiles"); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/document_symbol.h0000644000000000000000000000341315031566105025035 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/symbol.h" #include "LibLsp/lsp/lsTextDocumentIdentifier.h" /** * The document symbol request is sent from the client to the server to list all symbols found in a given text document. */ struct lsDocumentSymbolParams { lsTextDocumentIdentifier textDocument; MAKE_SWAP_METHOD(lsDocumentSymbolParams, textDocument) }; MAKE_REFLECT_STRUCT(lsDocumentSymbolParams, textDocument); struct TextDocumentDocumentSymbol { typedef std::pair, optional> Either; }; void Reflect(Reader& visitor, TextDocumentDocumentSymbol::Either& value); /** * The document symbol request is sent from the client to the server to list all * symbols found in a given text document. * * Registration Options: {@link TextDocumentRegistrationOptions} * *

    * Caveat: although the return type allows mixing the * {@link DocumentSymbol} and {@link SymbolInformation} instances into a list do * not do it because the clients cannot accept a heterogeneous list. A list of * {@code DocumentSymbol} instances is only a valid return value if the * {@link DocumentSymbolCapabilities#getHierarchicalDocumentSymbolSupport() * textDocument.documentSymbol.hierarchicalDocumentSymbolSupport} is * {@code true}. More details on this difference between the LSP and the LSP4J * can be found here. *

    */ //DEFINE_REQUEST_RESPONSE_TYPE(td_symbol, // lsDocumentSymbolParams, // std::vector ); // DEFINE_REQUEST_RESPONSE_TYPE( td_symbol, lsDocumentSymbolParams, std::vector, "textDocument/documentSymbol" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/completion.h0000644000000000000000000000470615031566105024011 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include #include "LibLsp/lsp/lsp_completion.h" #include "LibLsp/lsp/lsTextDocumentPositionParams.h" // How a completion was triggered enum class lsCompletionTriggerKind { // Completion was triggered by typing an identifier (24x7 code // complete), manual invocation (e.g Ctrl+Space) or via API. Invoked = 1, // Completion was triggered by a trigger character specified by // the `triggerCharacters` properties of the `CompletionRegistrationOptions`. TriggerCharacter = 2 }; MAKE_REFLECT_TYPE_PROXY(lsCompletionTriggerKind); // Contains additional information about the context in which a completion // request is triggered. struct lsCompletionContext { // How the completion was triggered. lsCompletionTriggerKind triggerKind = lsCompletionTriggerKind::Invoked; // The trigger character (a single character) that has trigger code complete. // Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter` optional triggerCharacter; MAKE_SWAP_METHOD(lsCompletionContext, triggerKind, triggerCharacter); }; MAKE_REFLECT_STRUCT(lsCompletionContext, triggerKind, triggerCharacter); struct lsCompletionParams : lsTextDocumentPositionParams { // The completion context. This is only available it the client specifies to // send this using // `ClientCapabilities.textDocument.completion.contextSupport === true` optional context; MAKE_SWAP_METHOD(lsCompletionParams, textDocument, position, context); }; MAKE_REFLECT_STRUCT(lsCompletionParams, textDocument, position, context); namespace TextDocumentComplete { typedef std::pair>, optional> Either; }; extern void Reflect(Reader& visitor, TextDocumentComplete::Either& value); /** * The Completion request is sent from the client to the server to compute * completion items at a given cursor position. Completion items are * presented in the IntelliSense user interface. If computing complete * completion items is expensive servers can additional provide a handler * for the resolve completion item request. This request is sent when a * completion item is selected in the user interface. * * Registration Options: CompletionRegistrationOptions */ DEFINE_REQUEST_RESPONSE_TYPE(td_completion, lsCompletionParams, CompletionList, "textDocument/completion") asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/references.h0000644000000000000000000000214315031566105023752 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/symbol.h" namespace TextDocumentReferences { struct lsReferenceContext { // Include the declaration of the current symbol. optional includeDeclaration; MAKE_REFLECT_STRUCT(lsReferenceContext, includeDeclaration) }; struct Params { lsTextDocumentIdentifier textDocument; lsPosition position; lsReferenceContext context; MAKE_SWAP_METHOD(Params, textDocument, position, context) }; }; // namespace TextDocumentReferences MAKE_REFLECT_STRUCT(TextDocumentReferences::lsReferenceContext, includeDeclaration); MAKE_REFLECT_STRUCT(TextDocumentReferences::Params, textDocument, position, context); /** * The references request is sent from the client to the server to resolve * project-wide references for the symbol denoted by the given text document * position. * * Registration Options: TextDocumentRegistrationOptions */ DEFINE_REQUEST_RESPONSE_TYPE( td_references, TextDocumentReferences::Params, std::vector, "textDocument/references" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/colorPresentation.h0000644000000000000000000000333215031566105025344 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsTextDocumentIdentifier.h" #include "LibLsp/lsp/lsRange.h" #include "documentColor.h" #include "LibLsp/lsp/lsTextEdit.h" struct ColorPresentationParams { /** * The text document. */ lsTextDocumentIdentifier textDocument; /** * The range in the document where this color appers. */ lsRange range; /** * The actual color value for this color range. */ TextDocument::Color color; MAKE_SWAP_METHOD(ColorPresentationParams, textDocument, range, color) }; MAKE_REFLECT_STRUCT(ColorPresentationParams, textDocument, range, color) struct ColorPresentation { /** * The label of this color presentation. It will be shown on the color * picker header. By default this is also the text that is inserted when selecting * this color presentation. */ std::string label; /** * An edit which is applied to a document when selecting * this presentation for the color. When `null` the label is used. */ lsTextEdit textEdit; /** * An optional array of additional text edits that are applied when * selecting this color presentation. Edits must not overlap with the main edit nor with themselves. */ std::vector additionalTextEdits; MAKE_SWAP_METHOD(ColorPresentation, label, textEdit, additionalTextEdits) }; MAKE_REFLECT_STRUCT(ColorPresentation, label, textEdit, additionalTextEdits) DEFINE_REQUEST_RESPONSE_TYPE( td_colorPresentation, ColorPresentationParams, std::vector, "textDocument/colorPresentation" ) asymptote-3.05/LspCpp/include/LibLsp/lsp/textDocument/signature_help.h0000644000000000000000000000617715031566105024655 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsMarkedString.h" #include "LibLsp/lsp/lsTextDocumentPositionParams.h" // Represents a parameter of a callable-signature. A parameter can // have a label and a doc-comment. struct lsParameterInformation { // The label of this parameter. Will be shown in // the UI. std::string label; // The human-readable doc-comment of this parameter. Will be shown // in the UI but can be omitted. optional, optional>> documentation; MAKE_SWAP_METHOD(lsParameterInformation, label, documentation) }; MAKE_REFLECT_STRUCT(lsParameterInformation, label, documentation); // Represents the signature of something callable. A signature // can have a label, like a function-name, a doc-comment, and // a set of parameters. struct lsSignatureInformation { // The label of this signature. Will be shown in // the UI. std::string label; // The human-readable doc-comment of this signature. Will be shown // in the UI but can be omitted. optional, optional>> documentation; // The parameters of this signature. std::vector parameters; MAKE_SWAP_METHOD(lsSignatureInformation, label, documentation, parameters) }; MAKE_REFLECT_STRUCT(lsSignatureInformation, label, documentation, parameters); // Signature help represents the signature of something // callable. There can be multiple signature but only one // active and only one active parameter. struct lsSignatureHelp { // One or more signatures. std::vector signatures; // The active signature. If omitted or the value lies outside the // range of `signatures` the value defaults to zero or is ignored if // `signatures.length === 0`. Whenever possible implementors should // make an active decision about the active signature and shouldn't // rely on a default value. // In future version of the protocol this property might become // mandantory to better express this. optional activeSignature; // The active parameter of the active signature. If omitted or the value // lies outside the range of `signatures[activeSignature].parameters` // defaults to 0 if the active signature has parameters. If // the active signature has no parameters it is ignored. // In future version of the protocol this property might become // mandantory to better express the active parameter if the // active signature does have any. optional activeParameter; MAKE_SWAP_METHOD(lsSignatureHelp, signatures, activeSignature, activeParameter) }; MAKE_REFLECT_STRUCT(lsSignatureHelp, signatures, activeSignature, activeParameter); /** * The signature help request is sent from the client to the server to * request signature information at a given cursor position. * * Registration Options: SignatureHelpRegistrationOptions */ DEFINE_REQUEST_RESPONSE_TYPE( td_signatureHelp, lsTextDocumentPositionParams, lsSignatureHelp, "textDocument/signatureHelp" ); asymptote-3.05/LspCpp/include/LibLsp/lsp/ExecuteCommandParams.h0000644000000000000000000000117515031566105023217 0ustar rootroot#pragma once #include "lsAny.h" struct ExecuteCommandParams { /** * The identifier of the actual command handler. */ std::string command; /** * Arguments that the command should be invoked with. * The arguments are typically specified when a command is returned from the server to the client. * Example requests that return a command are textDocument/codeAction or textDocument/codeLens. */ optional> arguments; MAKE_SWAP_METHOD(ExecuteCommandParams, command, arguments); }; MAKE_REFLECT_STRUCT(ExecuteCommandParams, command, arguments) asymptote-3.05/LspCpp/include/LibLsp/lsp/symbol.h0000644000000000000000000001067315031566105020462 0ustar rootroot#pragma once #include "LibLsp/lsp/location_type.h" enum class lsSymbolKind : uint8_t { Unknown = 0, File = 1, Module = 2, Namespace = 3, Package = 4, Class = 5, Method = 6, Property = 7, Field = 8, Constructor = 9, Enum = 10, Interface = 11, Function = 12, Variable = 13, Constant = 14, String = 15, Number = 16, Boolean = 17, Array = 18, Object = 19, Key = 20, Null = 21, EnumMember = 22, Struct = 23, Event = 24, Operator = 25, // For C++, this is interpreted as "template parameter" (including // non-type template parameters). TypeParameter = 26, // cquery extensions // See also https://github.com/Microsoft/language-server-protocol/issues/344 // for new SymbolKind clang/Index/IndexSymbol.h clang::index::SymbolKind TypeAlias = 252, Parameter = 253, StaticMethod = 254, Macro = 255, }; MAKE_REFLECT_TYPE_PROXY(lsSymbolKind); typedef lsSymbolKind SymbolKind; // A document highlight kind. enum class lsDocumentHighlightKind { // A textual occurrence. Text = 1, // Read-access of a symbol, like reading a variable. Read = 2, // Write-access of a symbol, like writing to a variable. Write = 3 }; MAKE_REFLECT_TYPE_PROXY(lsDocumentHighlightKind); // A document highlight is a range inside a text document which deserves // special attention. Usually a document highlight is visualized by changing // the background color of its range. struct lsDocumentHighlight { // The range this highlight applies to. lsRange range; // The highlight kind, default is DocumentHighlightKind.Text. optional kind; MAKE_SWAP_METHOD(lsDocumentHighlight, range, kind) }; MAKE_REFLECT_STRUCT(lsDocumentHighlight, range, kind); struct lsSymbolInformation { /** * The name of this symbol. */ std::string name; /** * The kind of this symbol. */ lsSymbolKind kind; /** * Indicates if this symbol is deprecated. */ optional deprecated; /** * The location of this symbol. The location's range is used by a tool * to reveal the location in the editor. If the symbol is selected in the * tool the range's start information is used to position the cursor. So * the range usually spans more then the actual symbol's name and does * normally include things like visibility modifiers. * * The range doesn't have to denote a node range in the sense of a abstract * syntax tree. It can therefore not be used to re-construct a hierarchy of * the symbols. */ lsLocation location; /** * The name of the symbol containing this symbol. This information is for * user interface purposes (e.g. to render a qualifier in the user interface * if necessary). It can't be used to re-infer a hierarchy for the document * symbols. */ optional containerName; MAKE_SWAP_METHOD(lsSymbolInformation, name, kind, deprecated, location, containerName); }; MAKE_REFLECT_STRUCT(lsSymbolInformation, name, kind, deprecated, location, containerName); struct lsDocumentSymbol { /** * The name of this symbol. */ std::string name; /** * The kind of this symbol. */ lsSymbolKind kind = lsSymbolKind::Unknown; /** * The range enclosing this symbol not including leading/trailing whitespace but everything else * like comments. This information is typically used to determine if the clients cursor is * inside the symbol to reveal in the symbol in the UI. */ lsRange range; /** * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function. * Must be contained by the `range`. */ lsRange selectionRange; /** * More detail for this symbol, e.g the signature of a function. If not provided the * name is used. */ optional detail; /** * Indicates if this symbol is deprecated. */ optional deprecated; /** * Children of this symbol, e.g. properties of a class. */ optional> children; //internal use int flags = 0; MAKE_SWAP_METHOD(lsDocumentSymbol, name, kind, range, selectionRange, detail, deprecated, children, flags); }; MAKE_REFLECT_STRUCT(lsDocumentSymbol, name, kind, range, selectionRange, detail, deprecated, children, flags); asymptote-3.05/LspCpp/include/LibLsp/lsp/ClientPreferences.h0000644000000000000000000002502415031566105022551 0ustar rootroot#pragma once #include #include #include #include #include class ClientPreferences { public: std::shared_ptr workspace; lsTextDocumentClientCapabilities textDocument; ClientPreferences(lsClientCapabilities const& capabilities) { v3supported = capabilities.textDocument.has_value(); if (v3supported) { textDocument = capabilities.textDocument.value(); } if (capabilities.workspace) { workspace = std::make_shared(capabilities.workspace.value()); } } bool v3supported = false; bool isSignatureHelpSupported() { return v3supported && (textDocument.signatureHelp); } bool isWorkspaceDidChangeConfigurationSupported() const { return workspace && isDynamicRegistrationSupported(workspace->didChangeConfiguration); } bool isWorkspaceFoldersSupported() { return workspace != nullptr && isTrue(workspace->workspaceFolders); } bool isCompletionDynamicRegistered() { return v3supported && isDynamicRegistrationSupported(textDocument.completion); } bool isCompletionSnippetsSupported() { //@formatter:off if (!v3supported || !textDocument.completion) { return false; } auto const& completion = textDocument.completion.value(); if (completion.completionItem) { return isTrue(completion.completionItem.value().snippetSupport); } return false; } bool isV3Supported() { return v3supported; } bool isFormattingDynamicRegistrationSupported() { return v3supported && isDynamicRegistrationSupported(textDocument.formatting); } bool isRangeFormattingDynamicRegistrationSupported() { return v3supported && isDynamicRegistrationSupported(textDocument.rangeFormatting); } bool isOnTypeFormattingDynamicRegistrationSupported() { return v3supported && isDynamicRegistrationSupported(textDocument.onTypeFormatting); } bool isCodeLensDynamicRegistrationSupported() { return v3supported && isDynamicRegistrationSupported(textDocument.codeLens); } bool isSignatureHelpDynamicRegistrationSupported() { return v3supported && isDynamicRegistrationSupported(textDocument.signatureHelp); } template static bool isDynamicRegistrationSupported(optional& capability) { if (capability) { return (capability.value().dynamicRegistration.value()); } return false; } bool isTrue(optional const& value) { if (value) { return *value; } else { return false; } } bool isRenameDynamicRegistrationSupported() { return v3supported && isDynamicRegistrationSupported(textDocument.rename); } bool isExecuteCommandDynamicRegistrationSupported() { return v3supported && workspace != nullptr && isDynamicRegistrationSupported(workspace->executeCommand); } bool isWorkspaceSymbolDynamicRegistered() { return v3supported && workspace != nullptr && isDynamicRegistrationSupported(workspace->symbol); } bool isWorkspaceChangeWatchedFilesDynamicRegistered() { return v3supported && workspace != nullptr && isDynamicRegistrationSupported(workspace->didChangeWatchedFiles); } bool isDocumentSymbolDynamicRegistered() { return v3supported && isDynamicRegistrationSupported(textDocument.documentSymbol); } bool isCodeActionDynamicRegistered() { return v3supported && isDynamicRegistrationSupported(textDocument.codeAction); } bool isDefinitionDynamicRegistered() { return v3supported && isDynamicRegistrationSupported(textDocument.definition); } bool isTypeDefinitionDynamicRegistered() { return v3supported && isDynamicRegistrationSupported(textDocument.typeDefinition); } bool isHoverDynamicRegistered() { return v3supported && isDynamicRegistrationSupported(textDocument.hover); } bool isReferencesDynamicRegistered() { return v3supported && isDynamicRegistrationSupported(textDocument.references); } bool isDocumentHighlightDynamicRegistered() { return v3supported && isDynamicRegistrationSupported(textDocument.documentHighlight); } bool isDocumentLinkDynamicRegistered() { return v3supported && isDynamicRegistrationSupported(textDocument.documentLink); } bool isFoldgingRangeDynamicRegistered() { return v3supported && isDynamicRegistrationSupported(textDocument.foldingRange); } bool isInlayHintDynamicRegistered() { return v3supported && isDynamicRegistrationSupported(textDocument.inlayHint); } bool isImplementationDynamicRegistered() { return v3supported && isDynamicRegistrationSupported(textDocument.implementation); } bool isSelectionRangeDynamicRegistered() { return v3supported && isDynamicRegistrationSupported(textDocument.selectionRange); } bool isWillSaveRegistered() { return v3supported && isTrue(textDocument.synchronization.willSave); } bool isWillSaveWaitUntilRegistered() { return v3supported && isTrue(textDocument.synchronization.willSaveWaitUntil); } bool isWorkspaceApplyEditSupported() { return workspace != nullptr && isTrue(workspace->applyEdit); } bool isSupportsCompletionDocumentationMarkdown() { if (!v3supported || !textDocument.completion) { return false; } auto const& completion = textDocument.completion.value(); if (completion.completionItem) { auto& documentationFormat = completion.completionItem.value().documentationFormat; if (documentationFormat) { auto& data = documentationFormat.value(); for (auto& it : data) { if (it == "markdown") { return true; } } } } return false; } bool isWorkspaceEditResourceChangesSupported() { if (!workspace) { return false; } if (workspace->workspaceEdit) { return isTrue(workspace->workspaceEdit.value().resourceChanges); } return false; } static bool contains(std::vector const& v, std::string const& target) { for (auto& it : v) { if (it == target) { return true; } } return false; } bool isResourceOperationSupported() const { if (!workspace) { return false; } if (!workspace->workspaceEdit) { return false; } auto& it = (workspace->workspaceEdit.value()); if (!it.resourceOperations) { return false; } auto const& resourceOperations = it.resourceOperations.value(); return contains(resourceOperations, "create") && contains(resourceOperations, "rename") && contains(resourceOperations, "delete"); } /** * {@code true} if the client has explicitly set the * {@code textDocument.documentSymbol.hierarchicalDocumentSymbolSupport} to * {@code true} when initializing the LS. Otherwise, {@code false}. */ bool isHierarchicalDocumentSymbolSupported() { if (!v3supported || !textDocument.documentSymbol) { return false; } return isTrue(textDocument.documentSymbol.value().hierarchicalDocumentSymbolSupport); } bool isSemanticHighlightingSupported() { //@formatter:off if (!v3supported || !textDocument.semanticHighlightingCapabilities) { return false; } return isTrue(textDocument.semanticHighlightingCapabilities.value().semanticHighlighting); //@formatter:on } /** * {@code true} if the client has explicitly set the * {@code textDocument.codeAction.codeActionLiteralSupport.codeActionKind.valueSet} * value. Otherwise, {@code false}. */ bool isSupportedCodeActionKind(std::string const& kind) { if (!v3supported || !textDocument.codeAction) { return false; } //@formatter:off auto const& codeAction = textDocument.codeAction.value(); if (codeAction.codeActionLiteralSupport) { auto const& codeActionKind = codeAction.codeActionLiteralSupport.value().codeActionKind; if (codeActionKind) { auto const& valueSet = codeActionKind.value().valueSet; if (valueSet) { for (auto& k : valueSet.value()) { if (lsp::StartsWith(kind, k)) { return true; } } } } } return false; //@formatter:on } /** * {@code true} if the client has explicitly set the * {@code textDocument.publishDiagnostics.tagSupport} to * {@code true} when initializing the LS. Otherwise, {@code false}. */ bool isDiagnosticTagSupported() { if (!v3supported || !textDocument.publishDiagnostics) { return false; } auto const& publishDiagnostics = textDocument.publishDiagnostics.value(); if (publishDiagnostics.tagSupport) { isTagSupported(publishDiagnostics.tagSupport); } return false; } bool isTagSupported(optional, optional>> const& tagSupport) { if (tagSupport) { auto& v = tagSupport.value(); if (v.first) { return v.first.value(); } if (v.second) { return !v.second.value().valueSet.empty(); } } return false; } bool isCallHierarchyDynamicRegistered() { return v3supported && isDynamicRegistrationSupported(textDocument.callHierarchy); } }; asymptote-3.05/LspCpp/include/LibLsp/lsp/lsTextEdit.h0000644000000000000000000000504115031566105021237 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include #include "lsRange.h" //Since 3.16.0 there is also the concept of an annotated text edit which supports to add an annotation to a text edit. //The annotation can add information describing the change to the text edit. /** * Additional information that describes document changes. * * @since 3.16.0 */ struct lsChangeAnnotation { /** * A human-readable string describing the actual change. The string * is rendered prominent in the user interface. */ std::string label; /** * A flag which indicates that user confirmation is needed * before applying the change. */ optional needsConfirmation; /** * A human-readable string which is rendered less prominent in * the user interface. */ optional description; MAKE_REFLECT_STRUCT(lsChangeAnnotation, label, needsConfirmation, description) }; MAKE_REFLECT_STRUCT(lsChangeAnnotation, label, needsConfirmation, description) //Usually clients provide options to group the changes along the annotations they are associated with. //To support this in the protocol an edit or resource operation refers to a change annotation //using an identifier and not the change annotation literal directly.This allows servers to use //the identical annotation across multiple edits or resource operations which then allows clients //to group the operations under that change annotation.The actual change annotations together with //their identifers are managed by the workspace edit via the new property changeAnnotations. /** * An identifier referring to a change annotation managed by a workspace * edit. * * @since 3.16.0. */ using lsChangeAnnotationIdentifier = std::string; /** * A special text edit with an additional change annotation. * * @since 3.16.0. */ //A textual edit applicable to a text document. struct lsTextEdit { // The range of the text document to be manipulated. To insert // text into a document create a range where start === end. lsRange range; // The string to be inserted. For delete operations use an // empty string. std::string newText; /** * The actual annotation identifier. */ optional annotationId; bool operator==(lsTextEdit const& that); std::string ToString() const; MAKE_SWAP_METHOD(lsTextEdit, range, newText, annotationId) }; MAKE_REFLECT_STRUCT(lsTextEdit, range, newText, annotationId) using lsAnnotatedTextEdit = lsTextEdit; asymptote-3.05/LspCpp/include/LibLsp/lsp/language/0000755000000000000000000000000015031566105020560 5ustar rootrootasymptote-3.05/LspCpp/include/LibLsp/lsp/language/language.h0000644000000000000000000000634215031566105022521 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/NotificationInMessage.h" #include "LibLsp/lsp/lsDocumentUri.h" #include "LibLsp/lsp/lsCommand.h" #ifdef _WIN32 #include #endif struct StatusReport { std::string ToString() const { std::string info; info += "type:" + type + "\n"; info += "message:" + message + "\n"; return info; } /** * The message type. See { * */ std::string type; /** * The actual message * */ std::string message; MAKE_SWAP_METHOD(StatusReport, type, message); }; MAKE_REFLECT_STRUCT(StatusReport, type, message); /** * The show message notification is sent from a server to a client to ask * the client to display a particular message in the user interface. */ DEFINE_NOTIFICATION_TYPE(lang_status, StatusReport, "language/status"); enum class MessageType { /** * An error message. */ Error = (1), /** * A warning message. */ Warning = (2), /** * An information message. */ Info = (3), /** * A log message. */ Log = (4) }; MAKE_REFLECT_TYPE_PROXY(MessageType); struct ActionableNotification { /** * The message type. See { * */ MessageType severity; /** * The actual message * */ std::string message; /** * Optional data * */ optional data; /** * Optional commands * */ std::vector commands; MAKE_SWAP_METHOD(ActionableNotification, severity, message, data, commands) }; MAKE_REFLECT_STRUCT(ActionableNotification, severity, message, data, commands) /** * The actionable notification is sent from a server to a client to ask the * client to display a particular message in the user interface, and possible * commands to execute. The commands must be implemented on the client side. */ DEFINE_NOTIFICATION_TYPE(lang_actionableNotification, ActionableNotification, "language/actionableNotification"); struct ProgressReport { std::string ToString() const; std::string id; std::string task; std::string subTask; std::string status; int totalWork = 0; int workDone = 0; bool complete = false; MAKE_SWAP_METHOD(ProgressReport, id, task, subTask, status, workDone, complete); }; MAKE_REFLECT_STRUCT(ProgressReport, id, task, subTask, status, workDone, complete); /** * The progress report notification is sent from a server to be handled by the * client. */ DEFINE_NOTIFICATION_TYPE(lang_progressReport, ProgressReport, "language/progressReport"); enum EventType { /** * classpath updated event. */ ClasspathUpdated = (100), /** * projects imported event. */ ProjectsImported = (200) }; struct EventNotification { int eventType; lsp::Any data; std::string ToString() const; MAKE_SWAP_METHOD(EventNotification, eventType, data) }; MAKE_REFLECT_STRUCT(EventNotification, eventType, data); DEFINE_NOTIFICATION_TYPE(lang_eventNotification, EventNotification, "language/eventNotification"); asymptote-3.05/LspCpp/include/LibLsp/lsp/lsCommand.h0000644000000000000000000000254315031566105021067 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include #include #include "lsAny.h" // //Represents a reference to a command.Provides a title which will be used to represent a command in the UI. //Commands are identified by a string identifier. //The recommended way to handle commands is to implement their execution on the server side //if the clientand server provides the corresponding capabilities.Alternatively the tool //extension code could handle the command.The protocol currently doesn't specify a set of well - known commands. template struct lsCommand { // Title of the command (ie, 'save') std::string title; // Actual command identifier. std::string command; // Arguments to run the command with. // **NOTE** This must be serialized as an array. Use // MAKE_REFLECT_STRUCT_WRITER_AS_ARRAY. optional arguments; void swap(lsCommand& arg) noexcept { title.swap(arg.title); command.swap(arg.command); arguments.swap(arg.arguments); } }; template void Reflect(TVisitor& visitor, lsCommand& value) { REFLECT_MEMBER_START(); REFLECT_MEMBER(title); REFLECT_MEMBER(command); REFLECT_MEMBER(arguments); REFLECT_MEMBER_END(); } using lsCommandWithAny = lsCommand>; asymptote-3.05/LspCpp/include/LibLsp/lsp/location_type.h0000644000000000000000000000364415031566105022026 0ustar rootroot#pragma once #include "lsDocumentUri.h" #include "lsRange.h" //Represents a location inside a resource, such as a line inside a text file. struct lsLocation { lsLocation(); lsLocation(lsDocumentUri uri, lsRange range); bool operator==(lsLocation const& other) const; bool operator<(lsLocation const& o) const; lsDocumentUri uri; lsRange range; MAKE_SWAP_METHOD(lsLocation, uri, range) }; MAKE_REFLECT_STRUCT(lsLocation, uri, range) struct LinkLocation : public lsLocation { std::string displayName; std::string kind; MAKE_REFLECT_STRUCT(LinkLocation, uri, range, displayName, kind) }; MAKE_REFLECT_STRUCT(LinkLocation, uri, range, displayName, kind) //Represents a link between a sourceand a target location. struct LocationLink { /** * Span of the origin of this link. * * Used as the underlined span for mouse interaction. Defaults to the word range at * the mouse position. */ optional originSelectionRange; /** * The target resource identifier of this link. */ lsDocumentUri targetUri; /** * The full target range of this link. If the target for example is a symbol then target range is the * range enclosing this symbol not including leading/trailing whitespace but everything else * like comments. This information is typically used to highlight the range in the editor. */ lsRange targetRange; /** * The range that should be selected and revealed when this link is being followed, e.g the name of a function. * Must be contained by the the `targetRange`. See also `DocumentSymbol#range` */ lsRange targetSelectionRange; MAKE_SWAP_METHOD(LocationLink, originSelectionRange, targetUri, targetRange, targetSelectionRange); }; MAKE_REFLECT_STRUCT(LocationLink, originSelectionRange, targetUri, targetRange, targetSelectionRange); asymptote-3.05/LspCpp/include/LibLsp/lsp/lsDocumentUri.h0000644000000000000000000000146615031566105021752 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include struct lsDocumentUri { static lsDocumentUri FromPath(AbsolutePath const& path); lsDocumentUri(); lsDocumentUri(AbsolutePath const& path); lsDocumentUri(lsDocumentUri const& other); ; bool operator==(lsDocumentUri const& other) const; bool operator==(std::string const& other) const; void SetPath(AbsolutePath const& path); std::string GetRawPath() const; AbsolutePath GetAbsolutePath() const; std::string raw_uri_; void swap(lsDocumentUri& arg) noexcept { raw_uri_.swap(arg.raw_uri_); } }; extern void Reflect(Writer& visitor, lsDocumentUri& value); extern void Reflect(Reader& visitor, lsDocumentUri& value); extern std::string make_file_scheme_uri(std::string const& absolute_path); asymptote-3.05/LspCpp/include/LibLsp/lsp/method_type.h0000644000000000000000000000010615031566105021464 0ustar rootroot#pragma once #include using MethodType = char const* const; asymptote-3.05/LspCpp/include/LibLsp/lsp/ProtocolJsonHandler.h0000644000000000000000000000027715031566105023105 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/MessageJsonHandler.h" namespace lsp { class ProtocolJsonHandler : public MessageJsonHandler { public: ProtocolJsonHandler(); }; } // namespace lsp asymptote-3.05/LspCpp/include/LibLsp/lsp/lsWorkspaceEdit.h0000644000000000000000000000475115031566105022260 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include #include "lsTextDocumentEdit.h" #include "LibLsp/lsp/ResourceOperation.h" #include "lsAny.h" //A workspace edit represents changes to many resources managed in the workspace. //The edit should either provide changes or documentChanges. //If the client can handle versioned document edits and if documentChanges are present, the latter are preferred over changes. //Since version 3.13.0 a workspace edit can contain resource operations(create, delete or rename files and folders) as well. //If resource operations are present clients need to execute the operations in the order in which they are provided. //So a workspace edit for example can consist of the following two changes : (1) create file a.txt and (2) a text document edit which insert text into file a. //txt.An invalid sequence(e.g. (1) delete file a.txt and (2) insert text into file a.txt) will cause failure of the operation. //How the client recovers from the failure is described by the client capability : workspace.workspaceEdit.failureHandling struct lsChangeAnnotations { lsChangeAnnotation id; MAKE_SWAP_METHOD(lsChangeAnnotations, id) }; MAKE_REFLECT_STRUCT(lsChangeAnnotations, id) struct lsWorkspaceEdit { // Holds changes to existing resources. // changes ? : { [uri:string]: TextEdit[]; }; // std::unordered_map> changes; // An array of `TextDocumentEdit`s to express changes to specific a specific // version of a text document. Whether a client supports versioned document // edits is expressed via `WorkspaceClientCapabilites.versionedWorkspaceEdit`. // optional>> changes; typedef std::pair, optional> Either; optional> documentChanges; /** * A map of change annotations that can be referenced in * `AnnotatedTextEdit`s or create, rename and delete file / folder * operations. * * Whether clients honor this property depends on the client capability * `workspace.changeAnnotationSupport`. * * @since 3.16.0 */ optional changeAnnotations; MAKE_SWAP_METHOD(lsWorkspaceEdit, changes, documentChanges, changeAnnotations) }; MAKE_REFLECT_STRUCT(lsWorkspaceEdit, changes, documentChanges, changeAnnotations) extern void Reflect(Reader& visitor, lsWorkspaceEdit::Either& value); asymptote-3.05/LspCpp/include/LibLsp/lsp/AbsolutePath.h0000644000000000000000000000134415031566105021543 0ustar rootroot#pragma once #include #include struct AbsolutePath { static AbsolutePath BuildDoNotUse(std::string const& path); // Try not to use this. AbsolutePath(); // Provide implicit conversions to std::string for the time being. AbsolutePath(std::string const& path, bool validate = true); operator std::string() const; bool operator==(AbsolutePath const& rhs) const; bool operator!=(AbsolutePath const& rhs) const; bool operator<(AbsolutePath const& rhs) const; bool operator>(AbsolutePath const& rhs) const; std::string path; bool qualify = true; }; void Reflect(Reader& visitor, AbsolutePath& value); void Reflect(Writer& visitor, AbsolutePath& value); asymptote-3.05/LspCpp/include/LibLsp/lsp/lsTextDocumentItem.h0000644000000000000000000000130315031566105022744 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" #include #include #include "lsDocumentUri.h" //An item to transfer a text document from the client to the server. struct lsTextDocumentItem { // The text document's URI. lsDocumentUri uri; // The text document's language identifier. std::string languageId; // The version number of this document (it will strictly increase after each // change, including undo/redo). int version = 0; // The content of the opened text document. std::string text; MAKE_SWAP_METHOD(lsTextDocumentItem, uri, languageId, version, text) }; MAKE_REFLECT_STRUCT(lsTextDocumentItem, uri, languageId, version, text) asymptote-3.05/LspCpp/include/LibLsp/lsp/working_files.h0000644000000000000000000000427515031566105022020 0ustar rootroot#pragma once #include "LibLsp/lsp/lsp_diagnostic.h" #include "LibLsp/lsp/AbsolutePath.h" #include "LibLsp/lsp/textDocument/did_change.h" #include "LibLsp/lsp/textDocument/did_close.h" #include "LibLsp/lsp/textDocument/did_open.h" #include #include #include #include "Directory.h" struct WorkingFiles; struct WorkingFilesData; struct WorkingFile { int version = 0; AbsolutePath filename; Directory directory; WorkingFiles& parent; std::atomic counter; WorkingFile(WorkingFiles&, AbsolutePath const& filename, std::string const& buffer_content); WorkingFile(WorkingFiles&, AbsolutePath const& filename, std::string&& buffer_content); std::string const& GetContentNoLock() const { return buffer_content; } protected: friend struct WorkingFiles; std::string buffer_content; }; struct WorkingFiles { WorkingFiles(); ~WorkingFiles(); void CloseFilesInDirectory(std::vector const&); std::shared_ptr OnOpen(lsTextDocumentItem& open); std::shared_ptr OnChange(lsTextDocumentDidChangeParams const& change); bool OnClose(lsTextDocumentIdentifier const& close); std::shared_ptr OnSave(lsTextDocumentIdentifier const& _save); bool GetFileBufferContent(AbsolutePath const& filename, std::wstring& out) { auto file = GetFileByFilename(filename); if (!file) { return false; } return GetFileBufferContent(file, out); } bool GetFileBufferContent(AbsolutePath const& filename, std::string& out) { auto file = GetFileByFilename(filename); if (!file) { return false; } return GetFileBufferContent(file, out); } bool GetFileBufferContent(std::shared_ptr&, std::string& out); bool GetFileBufferContent(std::shared_ptr&, std::wstring& out); // Find the file with the given filename. std::shared_ptr GetFileByFilename(AbsolutePath const& filename); void Clear(); private: std::shared_ptr GetFileByFilenameNoLock(AbsolutePath const& filename); WorkingFilesData* d_ptr; }; asymptote-3.05/LspCpp/include/LibLsp/lsp/lsp_completion.h0000644000000000000000000001555015031566105022203 0ustar rootroot#pragma once #include "lsTextEdit.h" #include "lsMarkedString.h" #include "lsCommand.h" // The kind of a completion entry. enum class lsCompletionItemKind { Text = 1, Method = 2, Function = 3, Constructor = 4, Field = 5, Variable = 6, Class = 7, Interface = 8, Module = 9, Property = 10, Unit = 11, Value = 12, Enum = 13, Keyword = 14, Snippet = 15, Color = 16, File = 17, Reference = 18, Folder = 19, EnumMember = 20, Constant = 21, Struct = 22, Event = 23, Operator = 24, TypeParameter = 25, }; MAKE_REFLECT_TYPE_PROXY(lsCompletionItemKind); // Defines whether the insert text in a completion item should be interpreted as // plain text or a snippet. enum class lsInsertTextFormat { // The primary text to be inserted is treated as a plain string. PlainText = 1, // The primary text to be inserted is treated as a snippet. // // A snippet can define tab stops and placeholders with `$1`, `$2` // and `${3:foo}`. `$0` defines the final tab stop, it defaults to // the end of the snippet. Placeholders with equal identifiers are linked, // that is typing in one will update others too. // // See also: // https://github.com/Microsoft/vscode/blob/master/src/vs/editor/contrib/snippet/common/snippet.md Snippet = 2 }; MAKE_REFLECT_TYPE_PROXY(lsInsertTextFormat); namespace lsp { std::string ToString(lsCompletionItemKind); std::string ToString(lsInsertTextFormat); } // namespace lsp /** * The Completion request is sent from the client to the server to compute completion items at a given cursor position. * Completion items are presented in the IntelliSense user class. If computing complete completion items is expensive * servers can additional provide a handler for the resolve completion item request. This request is send when a * completion item is selected in the user class. */ struct lsCompletionItem { // The label of this completion item. By default // also the text that is inserted when selecting // this completion. std::string label; // The kind of this completion item. Based of the kind // an icon is chosen by the editor. optional kind; // A human-readable string with additional information // about this item, like type or symbol information. optional detail; // A human-readable string that represents a doc-comment. optional, optional>> documentation; /** * Indicates if this item is deprecated. */ optional deprecated; /** * Select this item when showing. * * *Note* that only one completion item can be selected and that the * tool / client decides which item that is. The rule is that the *first * item of those that match best is selected. */ optional preselect; // Internal information to order candidates. int relevance = 0; // A string that shoud be used when comparing this item // with other items. When `falsy` the label is used. optional sortText; // A string that should be used when filtering a set of // completion items. When `falsy` the label is used. optional filterText; // A string that should be inserted a document when selecting // this completion. When `falsy` the label is used. optional insertText; // The format of the insert text. The format applies to both the `insertText` // property and the `newText` property of a provided `textEdit`. optional insertTextFormat; // An edit which is applied to a document when selecting this completion. When // an edit is provided the value of `insertText` is ignored. // // *Note:* The range of the edit must be a single line range and it must // contain the position at which completion has been requested. optional textEdit; // An optional array of additional text edits that are applied when // selecting this completion. Edits must not overlap with the main edit // nor with themselves. // std::vector additionalTextEdits; // An optional command that is executed *after* inserting this completion. // *Note* that additional modifications to the current document should be // described with the additionalTextEdits-property. Command command; // An data entry field that is preserved on a completion item between // a completion and a completion resolve request. // data ? : any // Use this helper to figure out what content the completion item will insert // into the document, as it could live in either |textEdit|, |insertText|, or // |label|. std::string const& InsertedContent() const; std::string DisplayText(); /** * An optional array of additional text edits that are applied when * selecting this completion. Edits must not overlap (including the same insert position) * with the main edit nor with themselves. * * Additional text edits should be used to change text unrelated to the current cursor position * (for example adding an import statement at the top of the file if the completion item will * insert an unqualified type). */ optional> additionalTextEdits; /** * An optional set of characters that when pressed while this completion is active will accept it first and * then type that character. *Note* that all commit characters should have `length=1` and that superfluous * characters will be ignored. */ optional> commitCharacters; /** * An optional command that is executed *after* inserting this completion. *Note* that * additional modifications to the current document should be described with the * additionalTextEdits-property. */ optional command; /** * An data entry field that is preserved on a completion item between a completion and a completion resolve request. */ optional data; std::string ToString(); MAKE_SWAP_METHOD( lsCompletionItem, label, kind, detail, documentation, sortText, insertText, filterText, insertTextFormat, textEdit, deprecated, preselect, additionalTextEdits, commitCharacters, command, data ); }; MAKE_REFLECT_STRUCT( lsCompletionItem, label, kind, detail, documentation, sortText, insertText, filterText, insertTextFormat, textEdit, deprecated, preselect, additionalTextEdits, commitCharacters, command, data ); struct CompletionList { // This list it not complete. Further typing should result in recomputing // this list. bool isIncomplete = false; // The completion items. std::vector items; void swap(CompletionList& arg) noexcept { items.swap(arg.items); std::swap(isIncomplete, arg.isIncomplete); } }; MAKE_REFLECT_STRUCT(CompletionList, isIncomplete, items); asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/0000755000000000000000000000000015031566105017555 5ustar rootrootasymptote-3.05/LspCpp/include/LibLsp/JsonRpc/lsRequestId.h0000644000000000000000000000267615031566105022205 0ustar rootroot#pragma once #include "LibLsp/JsonRpc/serializer.h" struct lsRequestId { // The client can send the request id as an int or a string. We should output // the same format we received. enum Type { kNone, kInt, kString }; Type type = kNone; int value = -1; std::string k_string; bool has_value() const { return type != kNone; } void swap(lsRequestId& arg) noexcept { std::swap(arg, *this); } void set(int v) { value = v; type = kInt; } void set(std::string const& v) { k_string = v; type = kString; } bool operator==(lsRequestId const& rhs) const { if (type != rhs.type) { return false; } if (type == kInt) { return value == rhs.value; } return k_string == rhs.k_string; } bool operator!=(lsRequestId const& rhs) const { return !operator==(rhs); } bool operator<(lsRequestId const& rhs) const { if (type != rhs.type) { return false; } if (type == kInt) { return value < rhs.value; } return k_string < rhs.k_string; } }; void Reflect(Reader& visitor, lsRequestId& value); void Reflect(Writer& visitor, lsRequestId& value); // Debug method to convert an id to a string. std::string ToString(lsRequestId const& id); asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/message.h0000644000000000000000000000124115031566105021350 0ustar rootroot#pragma once #include #include #include #include #include "LibLsp/lsp/method_type.h" struct LspMessage { public: std::string jsonrpc = "2.0"; virtual void ReflectWriter(Writer&) = 0; // Send the message to the language client by writing it to stdout. void Write(std::ostream& out); virtual MethodType GetMethodType() const = 0; virtual void SetMethodType(MethodType) = 0; virtual ~LspMessage() = default; enum Kind { REQUEST_MESSAGE, RESPONCE_MESSAGE, NOTIFICATION_MESSAGE }; virtual Kind GetKid() = 0; virtual std::string ToJson(); }; asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/threaded_queue.h0000644000000000000000000001661115031566105022717 0ustar rootroot#pragma once #include #include #include #include #include #include #include #include #include #include #include "optionalVersion.h" struct MultiQueueWaiter; struct BaseThreadQueue { virtual ~BaseThreadQueue() = default; virtual bool IsEmpty() = 0; std::shared_ptr waiter; }; // std::lock accepts two or more arguments. We define an overload for one // argument. namespace std { template void lock(Lockable& l) { l.lock(); } } // namespace std template struct MultiQueueLock { MultiQueueLock(Queue... lockable) : tuple_ {lockable...} { lock(); } ~MultiQueueLock() { unlock(); } void lock() { lock_impl(typename std::index_sequence_for {}); } void unlock() { unlock_impl(typename std::index_sequence_for {}); } private: template void lock_impl(std::index_sequence) { std::lock(std::get(tuple_)->mutex...); } template void unlock_impl(std::index_sequence) { (void)std::initializer_list {(std::get(tuple_)->mutex.unlock(), 0)...}; } std::tuple tuple_; }; struct MultiQueueWaiter { static bool HasState(std::initializer_list queues); bool ValidateWaiter(std::initializer_list queues); template bool Wait(std::atomic& quit, BaseThreadQueue... queues) { MultiQueueLock l(queues...); while (!quit.load(std::memory_order_relaxed)) { if (HasState({queues...})) { return false; } cv.wait(l); } return true; } template void WaitUntil(std::chrono::steady_clock::time_point t, BaseThreadQueue... queues) { MultiQueueLock l(queues...); if (!HasState({queues...})) { cv.wait_until(l, t); } } template void Wait(BaseThreadQueue... queues) { assert(ValidateWaiter({queues...})); MultiQueueLock l(queues...); while (!HasState({queues...})) { cv.wait(l); } } std::condition_variable_any cv; }; // A threadsafe-queue. http://stackoverflow.com/a/16075550 template struct ThreadedQueue : public BaseThreadQueue { public: ThreadedQueue() : ThreadedQueue(std::make_shared()) { } explicit ThreadedQueue(std::shared_ptr waiter) : total_count_(0) { this->waiter = waiter; } // Returns the number of elements in the queue. This is lock-free. size_t Size() const { return total_count_; } // Add an element to the queue. void Enqueue(T&& t, bool priority) { { std::lock_guard lock(mutex); if (priority) { priority_.push_back(std::move(t)); } else { queue_.push_back(std::move(t)); } ++total_count_; } waiter->cv.notify_one(); } // Add a set of elements to the queue. void EnqueueAll(std::vector&& elements, bool priority) { if (elements.empty()) { return; } { std::lock_guard lock(mutex); total_count_ += elements.size(); for (T& element : elements) { if (priority) { priority_.push_back(std::move(element)); } else { queue_.push_back(std::move(element)); } } elements.clear(); } waiter->cv.notify_all(); } // Returns true if the queue is empty. This is lock-free. bool IsEmpty() { return total_count_ == 0; } // Get the first element from the queue. Blocks until one is available. T Dequeue() { std::unique_lock lock(mutex); waiter->cv.wait(lock, [&]() { return !priority_.empty() || !queue_.empty(); }); auto execute = [&](std::deque* q) { auto val = std::move(q->front()); q->pop_front(); --total_count_; return std::move(val); }; if (!priority_.empty()) { return execute(&priority_); } return execute(&queue_); } // Get the first element from the queue without blocking. Returns a null // value if the queue is empty. optional TryDequeue(bool priority) { std::lock_guard lock(mutex); auto pop = [&](std::deque* q) { auto val = std::move(q->front()); q->pop_front(); --total_count_; return std::move(val); }; auto get_result = [&](std::deque* first, std::deque* second) -> optional { if (!first->empty()) { return pop(first); } if (!second->empty()) { return pop(second); } return {}; }; if (priority) { return get_result(&priority_, &queue_); } return get_result(&queue_, &priority_); } // Return all elements in the queue. std::vector DequeueAll() { std::lock_guard lock(mutex); total_count_ = 0; std::vector result; result.reserve(priority_.size() + queue_.size()); while (!priority_.empty()) { result.emplace_back(std::move(priority_.front())); priority_.pop_front(); } while (!queue_.empty()) { result.emplace_back(std::move(queue_.front())); queue_.pop_front(); } return result; } std::vector TryDequeueSome(size_t num) { std::lock_guard lock(mutex); std::vector result; num = std::min(num, priority_.size() + queue_.size()); total_count_ -= num; result.reserve(num); while (num) { if (!priority_.empty()) { result.emplace_back(std::move(priority_.front())); priority_.pop_front(); } else { break; } num -= 1; } while (num) { if (!queue_.empty()) { result.emplace_back(std::move(queue_.front())); queue_.pop_front(); } else { break; } num -= 1; } return result; } template void Iterate(Fn fn) { std::lock_guard lock(mutex); for (auto& entry : priority_) { fn(entry); } for (auto& entry : queue_) { fn(entry); } } mutable std::mutex mutex; private: std::atomic total_count_; std::deque priority_; std::deque queue_; }; asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/GCThreadContext.h0000644000000000000000000000034715031566105022720 0ustar rootroot#pragma once #if defined(LSPCPP_USEGC) #define GC_THREADS #include #endif class GCThreadContext { public: GCThreadContext(); ~GCThreadContext(); private: #if defined(LSPCPP_USEGC) GC_stack_base gsb; #endif }; asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/stream.h0000644000000000000000000000630515031566105021225 0ustar rootroot#pragma once #include #include namespace lsp { class stream { public: virtual ~stream() = default; virtual bool fail() = 0; virtual bool bad() = 0; virtual bool eof() = 0; virtual bool good() = 0; virtual void clear() = 0; virtual std::string what() = 0; virtual bool need_to_clear_the_state() { return false; } bool operator!() { return bad(); } }; class istream : public stream { public: virtual int get() = 0; virtual ~istream() = default; virtual istream& read(char* str, std::streamsize count) = 0; }; template class base_istream : public istream { public: explicit base_istream(T& _t) : _impl(_t) { } int get() override { return _impl.get(); } bool fail() override { return _impl.fail(); } bool bad() override { return _impl.bad(); } bool eof() override { return _impl.eof(); } bool good() override { return _impl.good(); } istream& read(char* str, std::streamsize count) override { _impl.read(str, count); return *this; } void clear() override { _impl.clear(); } T& _impl; }; class ostream : public stream { public: virtual ~ostream() = default; virtual ostream& write(std::string const&) = 0; virtual ostream& write(std::streamsize) = 0; virtual ostream& flush() = 0; }; template class base_ostream : public ostream { public: explicit base_ostream(T& _t) : _impl(_t) { } bool fail() override { return _impl.fail(); } bool good() override { return _impl.good(); } bool bad() override { return _impl.bad(); } bool eof() override { return _impl.eof(); } ostream& write(std::string const& c) override { _impl << c; return *this; } ostream& write(std::streamsize _s) override { _impl << std::to_string(_s); return *this; } ostream& flush() override { _impl.flush(); return *this; } void clear() override { _impl.clear(); } protected: T& _impl; }; template class base_iostream : public istream, public ostream { public: explicit base_iostream(T& _t) : _impl(_t) { } int get() override { return _impl.get(); } bool fail() override { return _impl.fail(); } bool bad() override { return _impl.bad(); } bool eof() override { return _impl.eof(); } bool good() override { return _impl.good(); } istream& read(char* str, std::streamsize count) override { _impl.read(str, count); return *this; } ostream& write(std::string const& c) override { _impl << c; return *this; } ostream& write(std::streamsize _s) override { _impl << std::to_string(_s); return *this; } ostream& flush() override { _impl.flush(); return *this; } void clear() override { _impl.clear(); } protected: T& _impl; }; } // namespace lsp asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/RequestInMessage.h0000644000000000000000000000374015031566105023156 0ustar rootroot#pragma once #include "serializer.h" #include #include #include "lsRequestId.h" #include "LibLsp/JsonRpc/message.h" #include "LibLsp/lsp/method_type.h" #include "lsResponseMessage.h" struct RequestInMessage : public LspMessage { // number or string, actually no null lsRequestId id; std::string method; Kind GetKid() override { return REQUEST_MESSAGE; } }; template struct lsRequest : public RequestInMessage { lsRequest(MethodType _method) { method = _method; } MethodType GetMethodType() const override { return method.c_str(); } void SetMethodType(MethodType _method) override { method = _method; } void ReflectWriter(Writer& writer) override { Reflect(writer, static_cast(*this)); } static std::unique_ptr ReflectReader(Reader& visitor) { TDerived* temp = new TDerived(); std::unique_ptr message = std::unique_ptr(temp); // Reflect may throw and *message will be partially deserialized. Reflect(visitor, static_cast(*temp)); return message; } void swap(lsRequest& arg) noexcept { id.swap(arg.id); method.swap(method); std::swap(params, arg.params); } T params; }; #define DEFINE_REQUEST_RESPONSE_TYPE(MSG, request_param, response_result, methodInfo) \ namespace MSG \ { \ struct response : public ResponseMessage \ { \ }; \ struct request : public lsRequest \ { \ static constexpr MethodType kMethodInfo = methodInfo; \ request() : lsRequest(kMethodInfo) \ { \ } \ using Response = response; \ }; \ }; \ MAKE_REFLECT_STRUCT(MSG::request, jsonrpc, id, method, params); \ MAKE_REFLECT_STRUCT(MSG::response, jsonrpc, id, result); asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/RemoteEndPoint.h0000644000000000000000000002751215031566105022631 0ustar rootroot#pragma once #include "LibLsp/lsp/lsp_diagnostic.h" #include "LibLsp/JsonRpc/Cancellation.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/NotificationInMessage.h" #include "traits.h" #include #include #include "threaded_queue.h" #include #include "MessageIssue.h" #include "LibLsp/JsonRpc/MessageJsonHandler.h" #include "Endpoint.h" #include "future.h" #include "MessageProducer.h" class MessageJsonHandler; class Endpoint; struct LspMessage; class RemoteEndPoint; namespace lsp { class ostream; class istream; //////////////////////////////////////////////////////////////////////////////// // ResponseOrError //////////////////////////////////////////////////////////////////////////////// // ResponseOrError holds either the response to a request or an error // message. template struct ResponseOrError { using Request = T; ResponseOrError(); ResponseOrError(T const& response); ResponseOrError(T&& response); ResponseOrError(Rsp_Error const& error); ResponseOrError(Rsp_Error&& error); ResponseOrError(ResponseOrError const& other); ResponseOrError(ResponseOrError&& other) noexcept; ResponseOrError& operator=(ResponseOrError const& other); ResponseOrError& operator=(ResponseOrError&& other) noexcept; bool IsError() const { return is_error; } std::string ToJson() { if (is_error) { return error.ToJson(); } return response.ToJson(); } T response; Rsp_Error error; // empty represents success. bool is_error; }; template ResponseOrError::ResponseOrError() : is_error(false) { } template ResponseOrError::ResponseOrError(T const& resp) : response(resp), is_error(false) { } template ResponseOrError::ResponseOrError(T&& resp) : response(std::move(resp)), is_error(false) { } template ResponseOrError::ResponseOrError(Rsp_Error const& err) : error(err), is_error(true) { } template ResponseOrError::ResponseOrError(Rsp_Error&& err) : error(std::move(err)), is_error(true) { } template ResponseOrError::ResponseOrError(ResponseOrError const& other) : response(other.response), error(other.error), is_error(other.is_error) { } template ResponseOrError::ResponseOrError(ResponseOrError&& other) noexcept : response(std::move(other.response)), error(std::move(other.error)), is_error(other.is_error) { } template ResponseOrError& ResponseOrError::operator=(ResponseOrError const& other) { response = other.response; error = other.error; is_error = other.is_error; return *this; } template ResponseOrError& ResponseOrError::operator=(ResponseOrError&& other) noexcept { response = std::move(other.response); error = std::move(other.error); is_error = other.is_error; return *this; } } // namespace lsp class RemoteEndPoint : MessageIssueHandler { template using ParamType = lsp::traits::ParameterType; template using IsRequest = lsp::traits::EnableIfIsType; template using IsResponse = lsp::traits::EnableIfIsType; template using IsNotify = lsp::traits::EnableIfIsType; template using IsRequestHandler = lsp::traits::EnableIf< lsp::traits::CompatibleWith>::value>; template using IsRequestHandlerWithMonitor = lsp::traits::EnableIf>::value>; public: RemoteEndPoint( std::shared_ptr const& json_handler, std::shared_ptr const& localEndPoint, lsp::Log& _log, lsp::JSONStreamStyle style = lsp::JSONStreamStyle::Standard, uint8_t max_workers = 2 ); ~RemoteEndPoint() override; template, typename ResponseType = typename RequestType::Response> IsRequestHandler> registerHandler(F&& handler) { processRequestJsonHandler(handler); local_endpoint->registerRequestHandler( RequestType::kMethodInfo, [=](std::unique_ptr msg) { auto req = reinterpret_cast(msg.get()); lsp::ResponseOrError res(handler(*req)); if (res.is_error) { res.error.id = req->id; send(res.error); } else { res.response.id = req->id; send(res.response); } return true; } ); } template, typename ResponseType = typename RequestType::Response> IsRequestHandlerWithMonitor> registerHandler(F&& handler) { processRequestJsonHandler(handler); local_endpoint->registerRequestHandler( RequestType::kMethodInfo, [=](std::unique_ptr msg) { auto req = static_cast(msg.get()); lsp::ResponseOrError res(handler(*req, getCancelMonitor(req->id))); if (res.is_error) { res.error.id = req->id; send(res.error); } else { res.response.id = req->id; send(res.response); } return true; } ); } using RequestErrorCallback = std::function; template> void send(T& request, F&& handler, RequestErrorCallback onError) { processRequestJsonHandler(handler); auto cb = [=](std::unique_ptr msg) { if (!msg) { return true; } auto const result = msg.get(); if (static_cast(result)->IsErrorType()) { auto const rsp_error = static_cast(result); onError(*rsp_error); } else { handler(*static_cast(result)); } return true; }; internalSendRequest(request, cb); } template> IsNotify registerHandler(F&& handler) { { std::lock_guard lock(m_sendMutex); if (!jsonHandler->GetNotificationJsonHandler(NotifyType::kMethodInfo)) { jsonHandler->SetNotificationJsonHandler( NotifyType::kMethodInfo, [](Reader& visitor) { return NotifyType::ReflectReader(visitor); } ); } } local_endpoint->registerNotifyHandler( NotifyType::kMethodInfo, [=](std::unique_ptr msg) { handler(*static_cast(msg.get())); return true; } ); } template> lsp::future> send(T& request) { processResponseJsonHandler(request); using Response = typename T::Response; auto promise = std::make_shared>>(); auto cb = [=](std::unique_ptr msg) { if (!msg) { return true; } auto result = msg.get(); if (reinterpret_cast(result)->IsErrorType()) { Rsp_Error* rsp_error = static_cast(result); Rsp_Error temp; std::swap(temp, *rsp_error); promise->set_value(std::move(lsp::ResponseOrError(std::move(temp)))); } else { Response temp; std::swap(temp, *static_cast(result)); promise->set_value(std::move(lsp::ResponseOrError(std::move(temp)))); } return true; }; internalSendRequest(request, cb); return promise->get_future(); } template> std::unique_ptr> waitResponse(T& request, unsigned const time_out = 0) { auto future_rsp = send(request); if (time_out == 0) { future_rsp.wait(); } else { auto state = future_rsp.wait_for(std::chrono::milliseconds(time_out)); if (lsp::future_status::timeout == state) { return {}; } } using Response = typename T::Response; return std::make_unique>(std::move(future_rsp.get())); } void send(NotificationInMessage& msg) { sendMsg(msg); } void send(ResponseInMessage& msg) { sendMsg(msg); } void sendNotification(NotificationInMessage& msg) { send(msg); } void sendResponse(ResponseInMessage& msg) { send(msg); } template T createRequest() { auto req = T(); req.id.set(getNextRequestId()); return req; } int getNextRequestId(); bool cancelRequest(lsRequestId const&); void startProcessingMessages(std::shared_ptr r, std::shared_ptr w); bool isWorking() const; void stop(); std::unique_ptr internalWaitResponse(RequestInMessage&, unsigned time_out = 0); bool internalSendRequest(RequestInMessage& info, GenericResponseHandler handler); void handle(std::vector&&) override; void handle(MessageIssue&&) override; private: CancelMonitor getCancelMonitor(lsRequestId const&); void sendMsg(LspMessage& msg); void mainLoop(std::unique_ptr); bool dispatch(std::string const&); template> IsRequest processRequestJsonHandler(F const& handler) { std::lock_guard lock(m_sendMutex); if (!jsonHandler->GetRequestJsonHandler(RequestType::kMethodInfo)) { jsonHandler->SetRequestJsonHandler( RequestType::kMethodInfo, [](Reader& visitor) { return RequestType::ReflectReader(visitor); } ); } } template> void processResponseJsonHandler(T& request) { using Response = typename T::Response; std::lock_guard lock(m_sendMutex); if (!jsonHandler->GetResponseJsonHandler(T::kMethodInfo)) { jsonHandler->SetResponseJsonHandler( T::kMethodInfo, [](Reader& visitor) { if (visitor.HasMember("error")) { return Rsp_Error::ReflectReader(visitor); } return Response::ReflectReader(visitor); } ); } } struct Data; Data* d_ptr; std::shared_ptr jsonHandler; std::mutex m_sendMutex; std::shared_ptr local_endpoint; public: std::shared_ptr message_producer_thread_; }; asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/Cancellation.h0000644000000000000000000000075715031566105022333 0ustar rootroot#pragma once #include #include "lsRequestId.h" #include using CancelMonitor = std::function; namespace Cancellation { struct Params { /** * The request id to cancel. */ lsRequestId id; MAKE_SWAP_METHOD(Cancellation::Params, id); }; }; // namespace Cancellation MAKE_REFLECT_STRUCT(Cancellation::Params, id); DEFINE_NOTIFICATION_TYPE(Notify_Cancellation, Cancellation::Params, "$/cancelRequest"); asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/traits.h0000644000000000000000000001510315031566105021234 0ustar rootroot// Copyright 2021 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #pragma once #include #include namespace lsp { namespace traits { // NthTypeOf returns the `N`th type in `Types` template using NthTypeOf = typename std::tuple_element>::type; // `IsTypeOrDerived::value` is true iff `T` is of type `BASE`, or // derives from `BASE`. template using IsTypeOrDerived = std::integral_constant< bool, std::is_base_of::type>::value || std::is_same::type>::value>; // `EachIsTypeOrDerived::value` is true iff all of the types in // the std::tuple `TYPES` is of, or derives from the corresponding indexed type // in the std::tuple `BASES`. // `N` must be equal to the number of types in both the std::tuple `BASES` and // `TYPES`. template struct EachIsTypeOrDerived { using base = typename std::tuple_element::type; using type = typename std::tuple_element::type; using last_matches = IsTypeOrDerived; using others_match = EachIsTypeOrDerived; static constexpr bool value = last_matches::value && others_match::value; }; // EachIsTypeOrDerived specialization for N = 1 template struct EachIsTypeOrDerived<1, BASES, TYPES> { using base = typename std::tuple_element<0, BASES>::type; using type = typename std::tuple_element<0, TYPES>::type; static constexpr bool value = IsTypeOrDerived::value; }; // EachIsTypeOrDerived specialization for N = 0 template struct EachIsTypeOrDerived<0, BASES, TYPES> { static constexpr bool value = true; }; // Signature describes the signature of a function. template struct Signature { // The return type of the function signature using ret = RETURN; // The parameters of the function signature held in a std::tuple using parameters = std::tuple; // The type of the Nth parameter of function signature template using parameter = NthTypeOf; // The total number of parameters static constexpr std::size_t parameter_count = sizeof...(PARAMETERS); }; // SignatureOf is a traits helper that infers the signature of the function, // method, static method, lambda, or function-like object `F`. template struct SignatureOf { // The signature of the function-like object `F` using type = typename SignatureOf::type; }; // SignatureOf specialization for a regular function or static method. template struct SignatureOf { // The signature of the function-like object `F` using type = Signature::type, typename std::decay::type...>; }; // SignatureOf specialization for a non-static method. template struct SignatureOf { // The signature of the function-like object `F` using type = Signature::type, typename std::decay::type...>; }; // SignatureOf specialization for a non-static, const method. template struct SignatureOf { // The signature of the function-like object `F` using type = Signature::type, typename std::decay::type...>; }; // SignatureOfT is an alias to `typename SignatureOf::type`. template using SignatureOfT = typename SignatureOf::type; // ParameterType is an alias to `typename SignatureOf::type::parameter`. template using ParameterType = typename SignatureOfT::template parameter; // `HasSignature::value` is true iff the function-like `F` has a matching // signature to the function-like `S`. template using HasSignature = std::integral_constant, SignatureOfT>::value>; // `Min::value` resolves to the smaller value of A and B. template using Min = std::integral_constant; // `CompatibleWith::value` is true iff the function-like `F` // can be called with the argument types of the function-like `S`. Return type // of the two functions are not considered. template using CompatibleWith = std::integral_constant< bool, (SignatureOfT::parameter_count == SignatureOfT::parameter_count) && EachIsTypeOrDerived< Min::parameter_count, SignatureOfT::parameter_count>::value, typename SignatureOfT::parameters, typename SignatureOfT::parameters>::value>; // If `CONDITION` is true then EnableIf resolves to type T, otherwise an // invalid type. template using EnableIf = typename std::enable_if::type; // If `BASE` is a base of `T` then EnableIfIsType resolves to type `TRUE`, // otherwise an invalid type. template using EnableIfIsType = EnableIf::value, TRUE_>; // If the function-like `F` has a matching signature to the function-like `S` // then EnableIfHasSignature resolves to type `TRUE`, otherwise an invalid type. template using EnableIfHasSignature = EnableIf::value, TRUE_>; } // namespace traits } // namespace lsp asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/json.h0000644000000000000000000000676115031566105020711 0ustar rootroot#pragma once #include "serializer.h" #include #include class JsonReader : public Reader { std::vector path_; public: rapidjson::GenericValue>* m_; JsonReader(rapidjson::GenericValue>* m) : m_(m) { } SerializeFormat Format() const override { return SerializeFormat::Json; } bool IsBool() override { return m_->IsBool(); } bool IsNull() override { return m_->IsNull(); } bool IsArray() override { return m_->IsArray(); } bool IsInt() override { return m_->IsInt(); } bool IsInt64() override { return m_->IsInt64(); } bool IsUint64() override { return m_->IsUint64(); } bool IsDouble() override { return m_->IsDouble(); } bool IsNumber() override { return m_->IsNumber(); } bool IsString() override { return m_->IsString(); } void GetNull() override { } bool GetBool() override { return m_->GetBool(); } int GetInt() override { return m_->GetInt(); } uint32_t GetUint32() override { return static_cast(m_->GetUint64()); } int64_t GetInt64() override { return m_->GetInt64(); } uint64_t GetUint64() override { return m_->GetUint64(); } double GetDouble() override { return m_->GetDouble(); } std::string GetString() override { return m_->GetString(); } bool HasMember(char const* x) override { if (m_->IsObject()) { return m_->HasMember(x); } else { return false; } } std::unique_ptr operator[](char const* x) override { auto& sub = (*m_)[x]; return std::unique_ptr(new JsonReader(&sub)); } std::string ToString() const override; void IterMap(std::function fn) override; void IterArray(std::function fn) override; void DoMember(char const* name, std::function fn) override; std::string GetPath() const; }; class JsonWriter : public Writer { public: rapidjson::Writer* m_; JsonWriter(rapidjson::Writer* m) : m_(m) { } SerializeFormat Format() const override { return SerializeFormat::Json; } void Null() override { m_->Null(); } void Bool(bool x) override { m_->Bool(x); } void Int(int x) override { m_->Int(x); } void Uint32(uint32_t x) override { m_->Uint64(x); } void Int64(int64_t x) override { m_->Int64(x); } void Uint64(uint64_t x) override { m_->Uint64(x); } void Double(double x) override { m_->Double(x); } void String(char const* x) override { m_->String(x); } void String(char const* x, size_t len) override { m_->String(x, len); } void StartArray(size_t) override { m_->StartArray(); } void EndArray() override { m_->EndArray(); } void StartObject() override { m_->StartObject(); } void EndObject() override { m_->EndObject(); } void Key(char const* name) override { m_->Key(name); } }; asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/future.h0000644000000000000000000001231615031566105021243 0ustar rootroot// Copyright 2019 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #pragma once #include #include #include namespace lsp { // internal functionality namespace detail { template struct promise_state { T val; std::mutex mutex; std::condition_variable cv; bool hasVal = false; }; } // namespace detail // forward declaration template class promise; // future_status is the enumeration returned by future::wait_for and // future::wait_until. enum class future_status { ready, timeout, }; // future is a minimal reimplementation of std::future, that does not suffer // from TSAN false positives. See: // https://gcc.gnu.org/bugzilla//show_bug.cgi?id=69204 template class future { public: using State = detail::promise_state; // constructors inline future() = default; inline future(future&&) = default; // valid() returns true if the future has an internal state. bool valid() const; // get() blocks until the future has a valid result, and returns it. // The future must have a valid internal state to call this method. inline T get(); // wait() blocks until the future has a valid result. // The future must have a valid internal state to call this method. void wait() const; // wait_for() blocks until the future has a valid result, or the timeout is // reached. // The future must have a valid internal state to call this method. template future_status wait_for(std::chrono::duration const& timeout) const; // wait_until() blocks until the future has a valid result, or the timeout is // reached. // The future must have a valid internal state to call this method. template future_status wait_until(std::chrono::time_point const& timeout) const; private: friend promise; future(future const&) = delete; inline future(std::shared_ptr const& state); std::shared_ptr state = std::make_shared(); }; template future::future(std::shared_ptr const& s) : state(s) { } template bool future::valid() const { return static_cast(state); } template T future::get() { std::unique_lock lock(state->mutex); state->cv.wait(lock, [&] { return state->hasVal; }); return state->val; } template void future::wait() const { std::unique_lock lock(state->mutex); state->cv.wait(lock, [&] { return state->hasVal; }); } template template future_status future::wait_for(std::chrono::duration const& timeout) const { std::unique_lock lock(state->mutex); return state->cv.wait_for(lock, timeout, [&] { return state->hasVal; }) ? future_status::ready : future_status::timeout; } template template future_status future::wait_until(std::chrono::time_point const& timeout) const { std::unique_lock lock(state->mutex); return state->cv.wait_until(lock, timeout, [&] { return state->hasVal; }) ? future_status::ready : future_status::timeout; } // promise is a minimal reimplementation of std::promise, that does not suffer // from TSAN false positives. See: // https://gcc.gnu.org/bugzilla//show_bug.cgi?id=69204 template class promise { public: // constructors inline promise() = default; inline promise(promise&& other) = default; inline promise(promise const& other) = default; // set_value() stores value to the shared state. // set_value() must only be called once. inline void set_value(T const& value) const; inline void set_value(T&& value) const; // get_future() returns a future sharing this promise's state. future get_future(); private: using State = detail::promise_state; std::shared_ptr state = std::make_shared(); }; template future promise::get_future() { return future(state); } template void promise::set_value(T const& value) const { std::unique_lock lock(state->mutex); state->val = value; state->hasVal = true; state->cv.notify_all(); } template void promise::set_value(T&& value) const { std::unique_lock lock(state->mutex); state->val = std::move(value); state->hasVal = true; state->cv.notify_all(); } } // namespace lsp asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/Context.h0000644000000000000000000001751415031566105021362 0ustar rootroot//===--- Context.h - Mechanism for passing implicit data --------*- C++-*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Context for storing and retrieving implicit data. Useful for passing implicit // parameters on a per-request basis. // //===----------------------------------------------------------------------===// #pragma once #include #include namespace lsp { /// Values in a Context are indexed by typed keys. /// Key serves two purposes: /// - it provides a lookup key for the context (each Key is unique), /// - it makes lookup type-safe: a Key can only map to a T (or nothing). /// /// Example: /// Key RequestID; /// Key Version; /// /// Context Ctx = Context::empty().derive(RequestID, 10).derive(Version, 3); /// assert(*Ctx.get(RequestID) == 10); /// assert(*Ctx.get(Version) == 3); /// /// Keys are typically used across multiple functions, so most of the time you /// would want to make them static class members or global variables. template class Key { public: static_assert(!std::is_reference::value, "Reference arguments to Key<> are not allowed"); constexpr Key() = default; Key(Key const&) = delete; Key& operator=(Key const&) = delete; Key(Key&&) = delete; Key& operator=(Key&&) = delete; }; /// A context is an immutable container for per-request data that must be /// propagated through layers that don't care about it. An example is a request /// ID that we may want to use when logging. /// /// Conceptually, a context is a heterogeneous map, T>. Each key has /// an associated value type, which allows the map to be typesafe. /// /// There is an "ambient" context for each thread, Context::current(). /// Most functions should read from this, and use WithContextValue or /// WithContext to extend or replace the context within a block scope. /// Only code dealing with threads and extension points should need to use /// other Context objects. /// /// You can't add data to an existing context, instead you create a new /// immutable context derived from it with extra data added. When you retrieve /// data, the context will walk up the parent chain until the key is found. class Context { public: /// Returns an empty root context that contains no data. static Context empty(); /// Returns the context for the current thread, creating it if needed. static Context const& current(); // Sets the current() context to Replacement, and returns the old context. // Prefer to use WithContext or WithContextValue to do this safely. static Context swapCurrent(Context Replacement); private: struct Data; Context(std::shared_ptr DataPtr); public: /// Same as Context::empty(), please use Context::empty() instead. Context() = default; /// Copy operations for this class are deleted, use an explicit clone() method /// when you need a copy of the context instead. Context(Context const&) = delete; Context& operator=(Context const&) = delete; Context(Context&&) = default; Context& operator=(Context&&) = default; /// Get data stored for a typed \p Key. If values are not found /// \returns Pointer to the data associated with \p Key. If no data is /// specified for \p Key, return null. template Type const* get(Key const& Key) const { for (Data const* DataPtr = this->dataPtr.get(); DataPtr != nullptr; DataPtr = DataPtr->parent.get()) { if (DataPtr->KeyPtr == &Key) { return static_cast(DataPtr->value->getValuePtr()); } } return nullptr; } /// A helper to get a reference to a \p Key that must exist in the map. /// Must not be called for keys that are not in the map. template Type const& getExisting(Key const& Key) const { auto Val = get(Key); assert(Val && "Key does not exist"); return *Val; } /// Derives a child context /// It is safe to move or destroy a parent context after calling derive(). /// The child will keep its parent alive, and its data remains accessible. template Context derive(Key const& Key, typename std::decay::type Value) const& { return Context(std::make_shared(Data { /*parent=*/dataPtr, &Key, std::make_unique::type>>(std::move(Value)) })); } template Context derive(Key const& Key, typename std::decay::type Value) && /* takes ownership */ { return Context(std::make_shared(Data { /*parent=*/std::move(dataPtr), &Key, std::make_unique::type>>(std::move(Value)) })); } /// Derives a child context, using an anonymous key. /// Intended for objects stored only for their destructor's side-effect. template Context derive(Type&& Value) const& { static Key::type> Private; return derive(Private, std::forward(Value)); } template Context derive(Type&& Value) && { static Key::type> Private; return std::move(*this).derive(Private, std::forward(Value)); } /// Clone this context object. Context clone() const; private: class AnyStorage { public: virtual ~AnyStorage() = default; virtual void* getValuePtr() = 0; }; template class TypedAnyStorage : public Context::AnyStorage { static_assert( std::is_same::type, T>::value, "Argument to TypedAnyStorage must be decayed" ); public: TypedAnyStorage(T&& Value) : value(std::move(Value)) { } void* getValuePtr() override { return &value; } private: T value; }; struct Data { // We need to make sure parent outlives the value, so the order of members // is important. We do that to allow classes stored in Context's child // layers to store references to the data in the parent layers. std::shared_ptr parent; void const* KeyPtr; std::unique_ptr value; }; std::shared_ptr dataPtr; }; /// WithContext replaces Context::current() with a provided scope. /// When the WithContext is destroyed, the original scope is restored. /// For extending the current context with new value, prefer WithContextValue. class WithContext { public: WithContext(Context C) : restore(Context::swapCurrent(std::move(C))) { } ~WithContext() { Context::swapCurrent(std::move(restore)); } WithContext(WithContext const&) = delete; WithContext& operator=(WithContext const&) = delete; WithContext(WithContext&&) = delete; WithContext& operator=(WithContext&&) = delete; private: Context restore; }; /// WithContextValue extends Context::current() with a single value. /// When the WithContextValue is destroyed, the original scope is restored. class WithContextValue { public: template WithContextValue(Key const& K, typename std::decay::type V) : restore(Context::current().derive(K, std::move(V))) { } // Anonymous values can be used for the destructor side-effect. template WithContextValue(T&& V) : restore(Context::current().derive(std::forward(V))) { } private: WithContext restore; }; } // namespace lsp asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/optionalVersion.h0000644000000000000000000000023615031566105023122 0ustar rootroot#ifndef boost #if __cplusplus < 201703L #include using boost::optional; #else #include using std::optional; #endif #endif asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/Condition.h0000644000000000000000000000236715031566105021664 0ustar rootroot#pragma once #include template class Condition { public: std::mutex m_mutex; std::condition_variable m_condition; ~Condition() { m_condition.notify_all(); } void notify(std::unique_ptr data) noexcept { { std::lock_guard eventLock(m_mutex); any.swap(data); } // wake up one waiter m_condition.notify_one(); }; std::unique_ptr wait(unsigned timeout = 0) { std::unique_lock ul(m_mutex); if (!timeout) { m_condition.wait( ul, [&]() { if (!any) { return false; } return true; } ); } else { if (!any) { std::cv_status status = m_condition.wait_for(ul, std::chrono::milliseconds(timeout)); if (status == std::cv_status::timeout) { return {}; } } } return std::unique_ptr(any.release()); } private: std::unique_ptr any; }; asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/lsResponseMessage.h0000644000000000000000000000337415031566105023377 0ustar rootroot#pragma once #include "serializer.h" #include "lsRequestId.h" #include "LibLsp/JsonRpc/message.h" #include "LibLsp/lsp/method_type.h" struct ResponseInMessage : public LspMessage { lsRequestId id; std::string m_methodType; virtual MethodType GetMethodType() const override { return m_methodType.data(); }; virtual void SetMethodType(MethodType _type) override { m_methodType = _type; }; Kind GetKid() override { return RESPONCE_MESSAGE; } virtual bool IsErrorType() { return false; } }; template struct BaseResponseMessage : ResponseInMessage { void ReflectWriter(Writer& writer) override { Reflect(writer, static_cast(*this)); } static std::unique_ptr ReflectReader(Reader& visitor) { TDerived* temp = new TDerived(); std::unique_ptr message = std::unique_ptr(temp); // Reflect may throw and *message will be partially deserialized. Reflect(visitor, static_cast(*temp)); return message; } }; template struct ResponseMessage : BaseResponseMessage { T result; void swap(ResponseMessage& arg) noexcept { std::swap(result, arg.result); this->id.swap(arg.id); this->m_methodType.swap(arg.m_methodType); } }; template struct ResponseError : BaseResponseMessage { T error; bool IsErrorType() override { return true; } void swap(ResponseError& arg) noexcept { this->id.swap(arg.id); this->m_methodType.swap(arg.m_methodType); std::swap(error, arg.error); } }; asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/serializer.h0000644000000000000000000002456415031566105022112 0ustar rootroot#pragma once #include "macro_map.h" #include #include #include #include #include #include #include #include #include #include "optionalVersion.h" struct AbsolutePath; enum class SerializeFormat { Json, MessagePack }; // A tag type that can be used to write `null` to json. struct JsonNull { void swap(JsonNull& arg) noexcept; }; class Reader { public: virtual ~Reader() { } virtual SerializeFormat Format() const = 0; virtual bool IsBool() = 0; virtual bool IsNull() = 0; virtual bool IsArray() = 0; virtual bool IsInt() = 0; virtual bool IsInt64() = 0; virtual bool IsUint64() = 0; virtual bool IsDouble() = 0; virtual bool IsNumber() = 0; virtual bool IsString() = 0; virtual void GetNull() = 0; virtual bool GetBool() = 0; virtual int GetInt() = 0; virtual uint32_t GetUint32() = 0; virtual int64_t GetInt64() = 0; virtual uint64_t GetUint64() = 0; virtual double GetDouble() = 0; virtual std::string GetString() = 0; virtual bool HasMember(char const* x) = 0; virtual std::unique_ptr operator[](char const* x) = 0; virtual void IterMap(std::function fn) = 0; virtual void IterArray(std::function fn) = 0; virtual void DoMember(char const* name, std::function fn) = 0; virtual std::string ToString() const = 0; }; class Writer { public: virtual ~Writer() { } virtual SerializeFormat Format() const = 0; virtual void Null() = 0; virtual void Bool(bool x) = 0; virtual void Int(int x) = 0; virtual void Uint32(uint32_t x) = 0; virtual void Int64(int64_t x) = 0; virtual void Uint64(uint64_t x) = 0; virtual void Double(double x) = 0; virtual void String(char const* x) = 0; virtual void String(char const* x, size_t len) = 0; virtual void StartArray(size_t) = 0; virtual void EndArray() = 0; virtual void StartObject() = 0; virtual void EndObject() = 0; virtual void Key(char const* name) = 0; }; struct optionals_mandatory_tag { }; #define REFLECT_MEMBER_START() ReflectMemberStart(visitor, value) #define REFLECT_MEMBER_END() ReflectMemberEnd(visitor, value); #define REFLECT_MEMBER_END1(value) ReflectMemberEnd(visitor, value); #define REFLECT_MEMBER(name) ReflectMember(visitor, #name, value.name) #define REFLECT_MEMBER_OPTIONALS(name) ReflectMember(visitor, #name, value.name, optionals_mandatory_tag {}) #define REFLECT_MEMBER2(name, value) ReflectMember(visitor, name, value) #define MAKE_REFLECT_TYPE_PROXY(type_name) MAKE_REFLECT_TYPE_PROXY2(type_name, std::underlying_type::type) #define MAKE_REFLECT_TYPE_PROXY2(type, as_type) \ inline void Reflect(Reader& visitor, type& value) \ { \ as_type value0; \ ::Reflect(visitor, value0); \ value = static_cast(value0); \ } \ inline void Reflect(Writer& visitor, type& value) \ { \ auto value0 = static_cast(value); \ ::Reflect(visitor, value0); \ } #define _MAPPABLE_REFLECT_MEMBER(name) REFLECT_MEMBER(name); #define _MAPPABLE_REFLECT_MEMBER_OPTIONALS(name) REFLECT_MEMBER_OPTIONALS(name); #define MAKE_REFLECT_EMPTY_STRUCT(type, ...) \ template \ void Reflect(TVisitor& visitor, type& value) \ { \ REFLECT_MEMBER_START(); \ REFLECT_MEMBER_END(); \ } #define MAKE_REFLECT_STRUCT(type, ...) \ template \ void Reflect(TVisitor& visitor, type& value) \ { \ REFLECT_MEMBER_START(); \ MACRO_MAP(_MAPPABLE_REFLECT_MEMBER, __VA_ARGS__) \ REFLECT_MEMBER_END(); \ } #define _MAPPABLE_SWAP_MEMBER(name) std::swap(name, arg.name); #define MAKE_SWAP_METHOD(type, ...) \ void swap(type& arg) noexcept \ { \ MACRO_MAP(_MAPPABLE_SWAP_MEMBER, __VA_ARGS__) \ } #define MAKE_REFLECT_STRUCT_OPTIONALS_MANDATORY(type, ...) \ template \ void Reflect(TVisitor& visitor, type& value) \ { \ REFLECT_MEMBER_START(); \ MACRO_MAP(_MAPPABLE_REFLECT_MEMBER_OPTIONALS, __VA_ARGS__) \ REFLECT_MEMBER_END(); \ } // clang-format off // Config has many fields, we need to support at least its number of fields. #define NUM_VA_ARGS_IMPL(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,N,...) N #define NUM_VA_ARGS(...) NUM_VA_ARGS_IMPL(__VA_ARGS__,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1) // clang-format on #define _MAPPABLE_REFLECT_ARRAY(name) Reflect(visitor, value.name); // Reflects the struct so it is serialized as an array instead of an object. // This currently only supports writers. #define MAKE_REFLECT_STRUCT_WRITER_AS_ARRAY(type, ...) \ inline void Reflect(Writer& visitor, type& value) \ { \ visitor.StartArray(NUM_VA_ARGS(__VA_ARGS__)); \ MACRO_MAP(_MAPPABLE_REFLECT_ARRAY, __VA_ARGS__) \ visitor.EndArray(); \ } //// Elementary types void Reflect(Reader& visitor, uint8_t& value); void Reflect(Writer& visitor, uint8_t& value); void Reflect(Reader& visitor, short& value); void Reflect(Writer& visitor, short& value); void Reflect(Reader& visitor, unsigned short& value); void Reflect(Writer& visitor, unsigned short& value); void Reflect(Reader& visitor, int& value); void Reflect(Writer& visitor, int& value); void Reflect(Reader& visitor, unsigned& value); void Reflect(Writer& visitor, unsigned& value); void Reflect(Reader& visitor, long& value); void Reflect(Writer& visitor, long& value); void Reflect(Reader& visitor, unsigned long& value); void Reflect(Writer& visitor, unsigned long& value); void Reflect(Reader& visitor, long long& value); void Reflect(Writer& visitor, long long& value); void Reflect(Reader& visitor, unsigned long long& value); void Reflect(Writer& visitor, unsigned long long& value); void Reflect(Reader& visitor, double& value); void Reflect(Writer& visitor, double& value); void Reflect(Reader& visitor, bool& value); void Reflect(Writer& visitor, bool& value); void Reflect(Reader& visitor, std::string& value); void Reflect(Writer& visitor, std::string& value); void Reflect(Reader& visitor, JsonNull& value); void Reflect(Writer& visitor, JsonNull& value); void Reflect(Reader& visitor, SerializeFormat& value); void Reflect(Writer& visitor, SerializeFormat& value); //// Type constructors template void Reflect(Reader& visitor, optional& value) { if (visitor.IsNull()) { visitor.GetNull(); return; } T real_value; Reflect(visitor, real_value); value = std::move(real_value); } template void Reflect(Writer& visitor, optional& value) { if (value) { Reflect(visitor, *value); } else { visitor.Null(); } } template void ReflectMember(Writer& visitor, char const* name, optional& value) { // For TypeScript optional property key?: value in the spec, // We omit both key and value if value is std::nullopt (null) for JsonWriter // to reduce output. But keep it for other serialization formats. if (value || visitor.Format() != SerializeFormat::Json) { visitor.Key(name); Reflect(visitor, value); } } template void ReflectMember(Writer& visitor, char const* name, T& value, optionals_mandatory_tag) { visitor.Key(name); Reflect(visitor, value); } template void ReflectMember(Reader& visitor, char const* name, T& value, optionals_mandatory_tag) { Reflect(visitor, value); } template void Reflect(Reader& visitor, std::map& value) { visitor.IterMap( [&](char const* name, Reader& entry) { T entry_value; Reflect(entry, entry_value); value[name] = (std::move(entry_value)); } ); } template void Reflect(Writer& visitor, std::map& value) { REFLECT_MEMBER_START(); for (auto& it : value) { visitor.Key(it.first.c_str()); Reflect(visitor, it.second); } REFLECT_MEMBER_END(); } // std::vector template void Reflect(Reader& visitor, std::vector& values) { visitor.IterArray( [&](Reader& entry) { T entry_value; Reflect(entry, entry_value); values.push_back(std::move(entry_value)); } ); } template void Reflect(Writer& visitor, std::vector& values) { visitor.StartArray(values.size()); for (auto& value : values) { Reflect(visitor, value); } visitor.EndArray(); } // ReflectMember inline void DefaultReflectMemberStart(Writer& visitor) { visitor.StartObject(); } inline void DefaultReflectMemberStart(Reader&) { } template bool ReflectMemberStart(Reader&, T&) { return false; } template bool ReflectMemberStart(Writer& visitor, T&) { visitor.StartObject(); return true; } template void ReflectMemberEnd(Reader&, T&) { } template void ReflectMemberEnd(Writer& visitor, T&) { visitor.EndObject(); } template void ReflectMember(Reader& visitor, char const* name, T& value) { visitor.DoMember(name, [&](Reader& child) { Reflect(child, value); }); } template void ReflectMember(Writer& visitor, char const* name, T& value) { visitor.Key(name); Reflect(visitor, value); } template void Reflect(Writer& visitor, std::pair, optional<_Ty2>>& value) { if (value.first) { Reflect(visitor, value.first); } else { Reflect(visitor, value.second); } } template void Reflect(Reader& visitor, std::pair, optional<_Ty2>>& value) { if (visitor.IsBool()) { Reflect(visitor, value.first); return; } Reflect(visitor, value.second); } template void Reflect(Reader& visitor, std::pair, optional<_Ty2>>& value) { if (visitor.IsString()) { Reflect(visitor, value.first); return; } Reflect(visitor, value.second); } template void Reflect(Reader& visitor, std::pair, optional<_Ty2>>& value) { try { Reflect(visitor, value.second); } catch (...) { Reflect(visitor, value.first); } } asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/StreamMessageProducer.h0000644000000000000000000000402015031566105024166 0ustar rootroot#pragma once #include #include #include "MessageProducer.h" #include #include #include "MessageIssue.h" namespace lsp { class istream; } class StreamMessageProducer : public MessageProducer { public: StreamMessageProducer(MessageIssueHandler& message_issue_handler, std::shared_ptr _input) : issueHandler(message_issue_handler), input(_input) { } StreamMessageProducer(MessageIssueHandler& message_issue_handler) : issueHandler(message_issue_handler) { } bool keepRunning = false; virtual void bind(std::shared_ptr) = 0; protected: MessageIssueHandler& issueHandler; std::shared_ptr input; }; class LSPStreamMessageProducer : public StreamMessageProducer { public: struct Headers { int contentLength = -1; std::string charset; void clear() { contentLength = -1; charset.clear(); } }; bool handleMessage(Headers& headers, MessageConsumer callBack); LSPStreamMessageProducer(MessageIssueHandler& message_issue_handler, std::shared_ptr _input) : StreamMessageProducer(message_issue_handler, _input) { } LSPStreamMessageProducer(MessageIssueHandler& message_issue_handler) : StreamMessageProducer(message_issue_handler) { } void listen(MessageConsumer) override; void bind(std::shared_ptr) override; void parseHeader(std::string& line, Headers& headers); }; class DelimitedStreamMessageProducer : public StreamMessageProducer { public: DelimitedStreamMessageProducer(MessageIssueHandler& message_issue_handler, std::shared_ptr _input) : StreamMessageProducer(message_issue_handler, _input) { } DelimitedStreamMessageProducer(MessageIssueHandler& message_issue_handler) : StreamMessageProducer(message_issue_handler) { } void listen(MessageConsumer) override; void bind(std::shared_ptr) override; }; asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/ScopeExit.h0000644000000000000000000000364115031566105021635 0ustar rootroot//===- llvm/ADT/ScopeExit.h - Execute code at scope exit --------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file defines the make_scope_exit function, which executes user-defined // cleanup logic at scope exit. // //===----------------------------------------------------------------------===// #pragma once #include #include namespace lsp { namespace detail { template class scope_exit { Callable ExitFunction; bool Engaged = true; // False once moved-from or release()d. public: template explicit scope_exit(Fp&& F) : ExitFunction(std::forward(F)) { } scope_exit(scope_exit&& Rhs) : ExitFunction(std::move(Rhs.ExitFunction)), Engaged(Rhs.Engaged) { Rhs.release(); } scope_exit(scope_exit const&) = delete; scope_exit& operator=(scope_exit&&) = delete; scope_exit& operator=(scope_exit const&) = delete; void release() { Engaged = false; } ~scope_exit() { if (Engaged) { ExitFunction(); } } }; } // end namespace detail // Keeps the callable object that is passed in, and execute it at the // destruction of the returned object (usually at the scope exit where the // returned object is kept). // // Interface is specified by p0052r2. template detail::scope_exit::type> make_scope_exit(Callable&& F) { return detail::scope_exit::type>(std::forward(F)); } } // end namespace lsp asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/Endpoint.h0000644000000000000000000000326115031566105021510 0ustar rootroot#pragma once #include #include #include #include "MessageIssue.h" struct LspMessage; struct NotificationInMessage; struct lsBaseOutMessage; struct RequestInMessage; using GenericResponseHandler = std::function)>; using GenericRequestHandler = std::function)>; using GenericNotificationHandler = std::function)>; class Endpoint { public: virtual ~Endpoint() = default; virtual bool onRequest(std::unique_ptr) = 0; virtual bool notify(std::unique_ptr) = 0; virtual bool onResponse(std::string const&, std::unique_ptr) = 0; virtual void registerRequestHandler(std::string const&, GenericResponseHandler) = 0; virtual void registerNotifyHandler(std::string const&, GenericNotificationHandler) = 0; }; class GenericEndpoint : public Endpoint { public: GenericEndpoint(lsp::Log& l) : log(l) { } bool notify(std::unique_ptr) override; bool onResponse(std::string const&, std::unique_ptr) override; bool onRequest(std::unique_ptr) override; std::map method2request; std::map method2response; std::map method2notification; void registerRequestHandler(std::string const& method, GenericResponseHandler cb) override { method2request[method] = cb; } void registerNotifyHandler(std::string const& method, GenericNotificationHandler cb) override { method2notification[method] = cb; } lsp::Log& log; }; asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/MessageJsonHandler.h0000644000000000000000000000425715031566105023452 0ustar rootroot#pragma once #include #include #include #include class Reader; using GenericRequestJsonHandler = std::function(Reader&)>; using GenericResponseJsonHandler = std::function(Reader&)>; using GenericNotificationJsonHandler = std::function(Reader&)>; class MessageJsonHandler { public: std::map method2request; std::map method2response; std::map method2notification; GenericRequestJsonHandler const* GetRequestJsonHandler(char const* methodInfo) const { auto const findIt = method2request.find(methodInfo); return findIt == method2request.end() ? nullptr : &findIt->second; } void SetRequestJsonHandler(std::string const& methodInfo, GenericRequestJsonHandler handler) { method2request[methodInfo] = handler; } GenericResponseJsonHandler const* GetResponseJsonHandler(char const* methodInfo) const { auto const findIt = method2response.find(methodInfo); return findIt == method2response.end() ? nullptr : &findIt->second; } void SetResponseJsonHandler(std::string const& methodInfo, GenericResponseJsonHandler handler) { method2response[methodInfo] = handler; } GenericNotificationJsonHandler const* GetNotificationJsonHandler(char const* methodInfo) const { auto const findIt = method2notification.find(methodInfo); return findIt == method2notification.end() ? nullptr : &findIt->second; } void SetNotificationJsonHandler(std::string const& methodInfo, GenericNotificationJsonHandler handler) { method2notification[methodInfo] = handler; } std::unique_ptr parseResponseMessage(std::string const&, Reader&); std::unique_ptr parseRequstMessage(std::string const&, Reader&); bool resovleResponseMessage(Reader&, std::pair>& result); std::unique_ptr parseNotificationMessage(std::string const&, Reader&); }; asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/NotificationInMessage.h0000644000000000000000000000321115031566105024145 0ustar rootroot#pragma once #include "lsRequestId.h" #include "LibLsp/JsonRpc/message.h" // NotificationInMessage does not have |id|. struct NotificationInMessage : public LspMessage { Kind GetKid() override { return NOTIFICATION_MESSAGE; } MethodType GetMethodType() const override { return method.c_str(); } void SetMethodType(MethodType _t) override { method = _t; } std::string method; }; template struct lsNotificationInMessage : NotificationInMessage { void ReflectWriter(Writer& writer) override { Reflect(writer, static_cast(*this)); } lsNotificationInMessage(MethodType _method) { method = _method; } static std::unique_ptr ReflectReader(Reader& visitor) { TDerived* temp = new TDerived(); std::unique_ptr message = std::unique_ptr(temp); // Reflect may throw and *message will be partially deserialized. Reflect(visitor, static_cast(*temp)); return message; } void swap(lsNotificationInMessage& arg) noexcept { method.swap(method); std::swap(params, arg.params); } T params; }; #define DEFINE_NOTIFICATION_TYPE(MSG, paramType, methodInfo) \ namespace MSG \ { \ struct notify : public lsNotificationInMessage \ { \ static constexpr MethodType kMethodInfo = methodInfo; \ notify() : lsNotificationInMessage(kMethodInfo) \ { \ } \ }; \ }; \ MAKE_REFLECT_STRUCT(MSG::notify, jsonrpc, method, params) asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/macro_map.h0000644000000000000000000010603115031566105021665 0ustar rootroot/* Boost Software License - Version 1.0 - August 17th, 2003 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // Taken from https://github.com/cbeck88/visit_struct. // // Usage // // #define PRINT_DOUBLE(x) printf(#x " = %d\n", x); // // MACRO_MAP(PRINT_DOUBLE, 1, 2, 3) // #define PRINT_DOUBLES(...) MACRO_MAP(PRINT_DOUBLE, __VA_ARGS__) #pragma once static constexpr int const max_visitable_members = 69; #define VISIT_STRUCT_EXPAND(x) x #define VISIT_STRUCT_PP_ARG_N( \ _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, _65, _66, _67, _68, _69, N, \ ... \ ) \ N #define VISIT_STRUCT_PP_NARG(...) \ VISIT_STRUCT_EXPAND(VISIT_STRUCT_PP_ARG_N( \ __VA_ARGS__, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, \ 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, \ 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 \ )) /* need extra level to force extra eval */ #define VISIT_STRUCT_CONCAT_(a, b) a##b #define VISIT_STRUCT_CONCAT(a, b) VISIT_STRUCT_CONCAT_(a, b) #define VISIT_STRUCT_APPLYF0(f) #define VISIT_STRUCT_APPLYF1(f, _1) f(_1) #define VISIT_STRUCT_APPLYF2(f, _1, _2) f(_1) f(_2) #define VISIT_STRUCT_APPLYF3(f, _1, _2, _3) f(_1) f(_2) f(_3) #define VISIT_STRUCT_APPLYF4(f, _1, _2, _3, _4) f(_1) f(_2) f(_3) f(_4) #define VISIT_STRUCT_APPLYF5(f, _1, _2, _3, _4, _5) f(_1) f(_2) f(_3) f(_4) f(_5) #define VISIT_STRUCT_APPLYF6(f, _1, _2, _3, _4, _5, _6) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) #define VISIT_STRUCT_APPLYF7(f, _1, _2, _3, _4, _5, _6, _7) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) #define VISIT_STRUCT_APPLYF8(f, _1, _2, _3, _4, _5, _6, _7, _8) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) #define VISIT_STRUCT_APPLYF9(f, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) #define VISIT_STRUCT_APPLYF10(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) #define VISIT_STRUCT_APPLYF11(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) #define VISIT_STRUCT_APPLYF12(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) #define VISIT_STRUCT_APPLYF13(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) #define VISIT_STRUCT_APPLYF14(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) #define VISIT_STRUCT_APPLYF15(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) #define VISIT_STRUCT_APPLYF16(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) #define VISIT_STRUCT_APPLYF17(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) #define VISIT_STRUCT_APPLYF18(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) #define VISIT_STRUCT_APPLYF19(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) #define VISIT_STRUCT_APPLYF20( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) #define VISIT_STRUCT_APPLYF21( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) #define VISIT_STRUCT_APPLYF22( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) #define VISIT_STRUCT_APPLYF23( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) #define VISIT_STRUCT_APPLYF24( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) #define VISIT_STRUCT_APPLYF25( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) #define VISIT_STRUCT_APPLYF26( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) #define VISIT_STRUCT_APPLYF27( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) #define VISIT_STRUCT_APPLYF28( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) #define VISIT_STRUCT_APPLYF29( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) #define VISIT_STRUCT_APPLYF30( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) #define VISIT_STRUCT_APPLYF31( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) #define VISIT_STRUCT_APPLYF32( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) #define VISIT_STRUCT_APPLYF33( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17 \ ) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) #define VISIT_STRUCT_APPLYF34( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) #define VISIT_STRUCT_APPLYF35( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) #define VISIT_STRUCT_APPLYF36( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) #define VISIT_STRUCT_APPLYF37( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) #define VISIT_STRUCT_APPLYF38( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) #define VISIT_STRUCT_APPLYF39( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) #define VISIT_STRUCT_APPLYF40( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) #define VISIT_STRUCT_APPLYF41( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) #define VISIT_STRUCT_APPLYF42( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) #define VISIT_STRUCT_APPLYF43( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) #define VISIT_STRUCT_APPLYF44( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) #define VISIT_STRUCT_APPLYF45( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) #define VISIT_STRUCT_APPLYF46( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) #define VISIT_STRUCT_APPLYF47( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) #define VISIT_STRUCT_APPLYF48( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) #define VISIT_STRUCT_APPLYF49( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) #define VISIT_STRUCT_APPLYF50( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) #define VISIT_STRUCT_APPLYF51( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) #define VISIT_STRUCT_APPLYF52( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) #define VISIT_STRUCT_APPLYF53( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) #define VISIT_STRUCT_APPLYF54( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) #define VISIT_STRUCT_APPLYF55( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) #define VISIT_STRUCT_APPLYF56( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) #define VISIT_STRUCT_APPLYF57( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) #define VISIT_STRUCT_APPLYF58( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) #define VISIT_STRUCT_APPLYF59( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) #define VISIT_STRUCT_APPLYF60( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) #define VISIT_STRUCT_APPLYF61( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) #define VISIT_STRUCT_APPLYF62( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \ f(_62) #define VISIT_STRUCT_APPLYF63( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \ f(_62) f(_63) #define VISIT_STRUCT_APPLYF64( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \ f(_62) f(_63) f(_64) #define VISIT_STRUCT_APPLYF65( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, _65 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \ f(_62) f(_63) f(_64) f(_65) #define VISIT_STRUCT_APPLYF66( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, _65, _66 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \ f(_62) f(_63) f(_64) f(_65) f(_66) #define VISIT_STRUCT_APPLYF67( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, _65, _66, _67 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \ f(_62) f(_63) f(_64) f(_65) f(_66) f(_67) #define VISIT_STRUCT_APPLYF68( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, _65, _66, _67, _68 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \ f(_62) f(_63) f(_64) f(_65) f(_66) f(_67) f(_68) #define VISIT_STRUCT_APPLYF69( \ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, _65, _66, _67, _68, _69 \ ) \ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \ f(_62) f(_63) f(_64) f(_65) f(_66) f(_67) f(_68) f(_69) #define VISIT_STRUCT_APPLY_F_(M, ...) VISIT_STRUCT_EXPAND(M(__VA_ARGS__)) #define MACRO_MAP(f, ...) \ VISIT_STRUCT_EXPAND(VISIT_STRUCT_APPLY_F_( \ VISIT_STRUCT_CONCAT(VISIT_STRUCT_APPLYF, VISIT_STRUCT_PP_NARG(__VA_ARGS__)), f, __VA_ARGS__ \ )) asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/WebSocketServer.h0000644000000000000000000000401615031566105023004 0ustar rootroot#pragma once #include #include #include #include #include "RemoteEndPoint.h" #include "stream.h" #include "threaded_queue.h" namespace lsp { class Log; } namespace lsp { class websocket_stream_wrapper : public istream, public ostream { public: websocket_stream_wrapper(boost::beast::websocket::stream& _w); boost::beast::websocket::stream& ws_; std::atomic quit {}; std::shared_ptr request_waiter; ThreadedQueue on_request; std::string error_message; bool fail() override; bool eof() override; bool good() override; websocket_stream_wrapper& read(char* str, std::streamsize count) override; int get() override; bool bad() override; websocket_stream_wrapper& write(std::string const& c) override; websocket_stream_wrapper& write(std::streamsize _s) override; websocket_stream_wrapper& flush() override; void clear() override; std::string what() override; }; /// The top-level class of the HTTP server. class WebSocketServer { public: WebSocketServer(WebSocketServer const&) = delete; WebSocketServer& operator=(WebSocketServer const&) = delete; ~WebSocketServer(); /// Construct the server to listen on the specified TCP address and port, and /// serve up files from the given directory. explicit WebSocketServer( std::string const& user_agent, std::string const& address, std::string const& port, std::shared_ptr json_handler, std::shared_ptr localEndPoint, lsp::Log&, uint32_t _max_workers = 2 ); /// Run the server's io_context loop. void run(); void stop(); RemoteEndPoint point; private: struct Data; /// Perform an asynchronous accept operation. void do_accept(); /// Wait for a request to stop the server. void do_stop(); Data* d_ptr = nullptr; }; } // namespace lsp asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/MessageIssue.h0000644000000000000000000001374315031566105022333 0ustar rootroot#pragma once #include #include #include namespace lsp { class Log { public: virtual ~Log() = default; enum class Level { /** * OFF is a special level that can be used to turn off logging. */ OFF = 0, /** * SEVERE is a message level indicating a serious failure. *

    * In general SEVERE messages should describe events that are * of considerable importance and which will prevent normal * program execution. They should be reasonably intelligible * to end users and to system administrators. */ SEVERE = 1, /** * WARNING is a message level indicating a potential problem. *

    * In general WARNING messages should describe events that will * be of interest to end users or system managers, or which * indicate potential problems. * */ WARNING = 2, /** * INFO is a message level for informational messages. *

    * Typically INFO messages will be written to the console * or its equivalent. So the INFO level should only be * used for reasonably significant messages that will * make sense to end users and system administrators. */ INFO = 3, /** * CONFIG is a message level for static configuration messages. *

    * CONFIG messages are intended to provide a variety of static * configuration information, to assist in debugging problems * that may be associated with particular configurations. * For example, CONFIG message might include the CPU type, * the graphics depth, the GUI look-and-feel, etc. * This level is initialized to 4. */ CONFIG = 4, /** * FINE is a message level providing tracing information. *

    * All of FINE, FINER, and FINEST are intended for relatively * detailed tracing. The exact meaning of the three levels will * vary between subsystems, but in general, FINEST should be used * for the most voluminous detailed output, FINER for somewhat * less detailed output, and FINE for the lowest volume (and * most important) messages. *

    * In general the FINE level should be used for information * that will be broadly interesting to developers who do not have * a specialized interest in the specific subsystem. *

    * FINE messages might include things like minor (recoverable) * failures. Issues indicating potential performance problems * are also worth logging as FINE. * This level is initialized to 5. */ FINE = 5, /** * FINER indicates a fairly detailed tracing message. * By default logging calls for entering, returning, or throwing * an exception are traced at this level. * This level is initialized to 400. */ FINER = 6, /** * FINEST indicates a highly detailed tracing message. * This level is initialized to 300. */ FINEST = 7, /** * ALL indicates that all messages should be logged. * This level is initialized to Integer.MIN_VALUE. */ ALL, }; virtual void log(Level level, std::wstring&& msg) = 0; virtual void log(Level level, std::wstring const& msg) = 0; virtual void log(Level level, std::string&& msg) = 0; virtual void log(Level level, std::string const& msg) = 0; void info(std::string const& msg) { log(Level::INFO, msg); } void info(std::wstring const& msg) { log(Level::INFO, msg); } void error(std::string const& msg) { log(Level::SEVERE, msg); } void error(std::wstring const& msg) { log(Level::SEVERE, msg); } void warning(std::string const& msg) { log(Level::WARNING, msg); } void warning(std::wstring const& msg) { log(Level::WARNING, msg); } }; } // namespace lsp class MessageIssue { public: std::string text; lsp::Log::Level code; MessageIssue(std::string const& text, lsp::Log::Level code) : text(text), code(code) { } MessageIssue(std::string&& text, lsp::Log::Level code) : text(text), code(code) { } std::string getText() { return text; } lsp::Log::Level getIssueCode() { return code; } std::string toString() { return getText(); } }; class MessageIssueHandler { public: /** * Handle issues found while parsing or validating a message. The list of issues must not be empty. */ virtual ~MessageIssueHandler() = default; virtual void handle(std::vector&&) = 0; virtual void handle(MessageIssue&&) = 0; }; asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/TcpServer.h0000644000000000000000000000174115031566105021646 0ustar rootroot#pragma once #include #include #include "RemoteEndPoint.h" namespace lsp { class Log; } namespace lsp { /// The top-level class of the HTTP server. class TcpServer { public: TcpServer(TcpServer const&) = delete; TcpServer& operator=(TcpServer const&) = delete; ~TcpServer(); /// Construct the server to listen on the specified TCP address and port, and /// serve up files from the given directory. explicit TcpServer( std::string const& address, std::string const& port, std::shared_ptr json_handler, std::shared_ptr localEndPoint, lsp::Log&, uint32_t _max_workers = 2 ); /// Run the server's io_context loop. void run(); void stop(); RemoteEndPoint point; private: struct Data; /// Perform an asynchronous accept operation. void do_accept(); /// Wait for a request to stop the server. void do_stop(); Data* d_ptr = nullptr; }; } // namespace lsp asymptote-3.05/LspCpp/include/LibLsp/JsonRpc/MessageProducer.h0000644000000000000000000000106715031566105023022 0ustar rootroot#pragma once #include #include namespace lsp { /// The encoding style of the JSON-RPC messages (both input and output). enum JSONStreamStyle { /// Encoding per the LSP specification, with mandatory Content-Length header. Standard, /// Messages are delimited by a '// -----' line. Comment lines start with //. Delimited }; } // namespace lsp class MessageProducer { public: typedef std::function MessageConsumer; virtual ~MessageProducer() = default; virtual void listen(MessageConsumer) = 0; }; asymptote-3.05/LspCpp/third_party/0000755000000000000000000000000015031566105015720 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/0000755000000000000000000000000015031566105017711 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/include/0000755000000000000000000000000015031566105021334 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/0000755000000000000000000000000015031566105023325 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/allocators.h0000644000000000000000000005406415031566105025652 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_ALLOCATORS_H_ #define RAPIDJSON_ALLOCATORS_H_ #include "rapidjson.h" #include "internal/meta.h" #include #include #if RAPIDJSON_HAS_CXX11 #include #endif RAPIDJSON_NAMESPACE_BEGIN /////////////////////////////////////////////////////////////////////////////// // Allocator /*! \class rapidjson::Allocator \brief Concept for allocating, resizing and freeing memory block. Note that Malloc() and Realloc() are non-static but Free() is static. So if an allocator need to support Free(), it needs to put its pointer in the header of memory block. \code concept Allocator { static const bool kNeedFree; //!< Whether this allocator needs to call Free(). // Allocate a memory block. // \param size of the memory block in bytes. // \returns pointer to the memory block. void* Malloc(size_t size); // Resize a memory block. // \param originalPtr The pointer to current memory block. Null pointer is permitted. // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.) // \param newSize the new size in bytes. void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); // Free a memory block. // \param pointer to the memory block. Null pointer is permitted. static void Free(void *ptr); }; \endcode */ /*! \def RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY \ingroup RAPIDJSON_CONFIG \brief User-defined kDefaultChunkCapacity definition. User can define this as any \c size that is a power of 2. */ #ifndef RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY #define RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY (64 * 1024) #endif /////////////////////////////////////////////////////////////////////////////// // CrtAllocator //! C-runtime library allocator. /*! This class is just wrapper for standard C library memory routines. \note implements Allocator concept */ class CrtAllocator { public: static const bool kNeedFree = true; void* Malloc(size_t size) { if (size) // behavior of malloc(0) is implementation defined. return RAPIDJSON_MALLOC(size); else return NULL; // standardize to returning NULL. } void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { (void)originalSize; if (newSize == 0) { RAPIDJSON_FREE(originalPtr); return NULL; } return RAPIDJSON_REALLOC(originalPtr, newSize); } static void Free(void *ptr) RAPIDJSON_NOEXCEPT { RAPIDJSON_FREE(ptr); } bool operator==(const CrtAllocator&) const RAPIDJSON_NOEXCEPT { return true; } bool operator!=(const CrtAllocator&) const RAPIDJSON_NOEXCEPT { return false; } }; /////////////////////////////////////////////////////////////////////////////// // MemoryPoolAllocator //! Default memory allocator used by the parser and DOM. /*! This allocator allocate memory blocks from pre-allocated memory chunks. It does not free memory blocks. And Realloc() only allocate new memory. The memory chunks are allocated by BaseAllocator, which is CrtAllocator by default. User may also supply a buffer as the first chunk. If the user-buffer is full then additional chunks are allocated by BaseAllocator. The user-buffer is not deallocated by this allocator. \tparam BaseAllocator the allocator type for allocating memory chunks. Default is CrtAllocator. \note implements Allocator concept */ template class MemoryPoolAllocator { //! Chunk header for perpending to each chunk. /*! Chunks are stored as a singly linked list. */ struct ChunkHeader { size_t capacity; //!< Capacity of the chunk in bytes (excluding the header itself). size_t size; //!< Current size of allocated memory in bytes. ChunkHeader *next; //!< Next chunk in the linked list. }; struct SharedData { ChunkHeader *chunkHead; //!< Head of the chunk linked-list. Only the head chunk serves allocation. BaseAllocator* ownBaseAllocator; //!< base allocator created by this object. size_t refcount; bool ownBuffer; }; static const size_t SIZEOF_SHARED_DATA = RAPIDJSON_ALIGN(sizeof(SharedData)); static const size_t SIZEOF_CHUNK_HEADER = RAPIDJSON_ALIGN(sizeof(ChunkHeader)); static inline ChunkHeader *GetChunkHead(SharedData *shared) { return reinterpret_cast(reinterpret_cast(shared) + SIZEOF_SHARED_DATA); } static inline uint8_t *GetChunkBuffer(SharedData *shared) { return reinterpret_cast(shared->chunkHead) + SIZEOF_CHUNK_HEADER; } static const size_t kDefaultChunkCapacity = RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY; //!< Default chunk capacity. public: static const bool kNeedFree = false; //!< Tell users that no need to call Free() with this allocator. (concept Allocator) static const bool kRefCounted = true; //!< Tell users that this allocator is reference counted on copy //! Constructor with chunkSize. /*! \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. \param baseAllocator The allocator for allocating memory chunks. */ explicit MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : chunk_capacity_(chunkSize), baseAllocator_(baseAllocator ? baseAllocator : RAPIDJSON_NEW(BaseAllocator)()), shared_(static_cast(baseAllocator_ ? baseAllocator_->Malloc(SIZEOF_SHARED_DATA + SIZEOF_CHUNK_HEADER) : 0)) { RAPIDJSON_ASSERT(baseAllocator_ != 0); RAPIDJSON_ASSERT(shared_ != 0); if (baseAllocator) { shared_->ownBaseAllocator = 0; } else { shared_->ownBaseAllocator = baseAllocator_; } shared_->chunkHead = GetChunkHead(shared_); shared_->chunkHead->capacity = 0; shared_->chunkHead->size = 0; shared_->chunkHead->next = 0; shared_->ownBuffer = true; shared_->refcount = 1; } //! Constructor with user-supplied buffer. /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size. The user buffer will not be deallocated when this allocator is destructed. \param buffer User supplied buffer. \param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader). \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. \param baseAllocator The allocator for allocating memory chunks. */ MemoryPoolAllocator(void *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : chunk_capacity_(chunkSize), baseAllocator_(baseAllocator), shared_(static_cast(AlignBuffer(buffer, size))) { RAPIDJSON_ASSERT(size >= SIZEOF_SHARED_DATA + SIZEOF_CHUNK_HEADER); shared_->chunkHead = GetChunkHead(shared_); shared_->chunkHead->capacity = size - SIZEOF_SHARED_DATA - SIZEOF_CHUNK_HEADER; shared_->chunkHead->size = 0; shared_->chunkHead->next = 0; shared_->ownBaseAllocator = 0; shared_->ownBuffer = false; shared_->refcount = 1; } MemoryPoolAllocator(const MemoryPoolAllocator& rhs) RAPIDJSON_NOEXCEPT : chunk_capacity_(rhs.chunk_capacity_), baseAllocator_(rhs.baseAllocator_), shared_(rhs.shared_) { RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); ++shared_->refcount; } MemoryPoolAllocator& operator=(const MemoryPoolAllocator& rhs) RAPIDJSON_NOEXCEPT { RAPIDJSON_NOEXCEPT_ASSERT(rhs.shared_->refcount > 0); ++rhs.shared_->refcount; this->~MemoryPoolAllocator(); baseAllocator_ = rhs.baseAllocator_; chunk_capacity_ = rhs.chunk_capacity_; shared_ = rhs.shared_; return *this; } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS MemoryPoolAllocator(MemoryPoolAllocator&& rhs) RAPIDJSON_NOEXCEPT : chunk_capacity_(rhs.chunk_capacity_), baseAllocator_(rhs.baseAllocator_), shared_(rhs.shared_) { RAPIDJSON_NOEXCEPT_ASSERT(rhs.shared_->refcount > 0); rhs.shared_ = 0; } MemoryPoolAllocator& operator=(MemoryPoolAllocator&& rhs) RAPIDJSON_NOEXCEPT { RAPIDJSON_NOEXCEPT_ASSERT(rhs.shared_->refcount > 0); this->~MemoryPoolAllocator(); baseAllocator_ = rhs.baseAllocator_; chunk_capacity_ = rhs.chunk_capacity_; shared_ = rhs.shared_; rhs.shared_ = 0; return *this; } #endif //! Destructor. /*! This deallocates all memory chunks, excluding the user-supplied buffer. */ ~MemoryPoolAllocator() RAPIDJSON_NOEXCEPT { if (!shared_) { // do nothing if moved return; } if (shared_->refcount > 1) { --shared_->refcount; return; } Clear(); BaseAllocator *a = shared_->ownBaseAllocator; if (shared_->ownBuffer) { baseAllocator_->Free(shared_); } RAPIDJSON_DELETE(a); } //! Deallocates all memory chunks, excluding the first/user one. void Clear() RAPIDJSON_NOEXCEPT { RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); for (;;) { ChunkHeader* c = shared_->chunkHead; if (!c->next) { break; } shared_->chunkHead = c->next; baseAllocator_->Free(c); } shared_->chunkHead->size = 0; } //! Computes the total capacity of allocated memory chunks. /*! \return total capacity in bytes. */ size_t Capacity() const RAPIDJSON_NOEXCEPT { RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); size_t capacity = 0; for (ChunkHeader* c = shared_->chunkHead; c != 0; c = c->next) capacity += c->capacity; return capacity; } //! Computes the memory blocks allocated. /*! \return total used bytes. */ size_t Size() const RAPIDJSON_NOEXCEPT { RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); size_t size = 0; for (ChunkHeader* c = shared_->chunkHead; c != 0; c = c->next) size += c->size; return size; } //! Whether the allocator is shared. /*! \return true or false. */ bool Shared() const RAPIDJSON_NOEXCEPT { RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); return shared_->refcount > 1; } //! Allocates a memory block. (concept Allocator) void* Malloc(size_t size) { RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); if (!size) return NULL; size = RAPIDJSON_ALIGN(size); if (RAPIDJSON_UNLIKELY(shared_->chunkHead->size + size > shared_->chunkHead->capacity)) if (!AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size)) return NULL; void *buffer = GetChunkBuffer(shared_) + shared_->chunkHead->size; shared_->chunkHead->size += size; return buffer; } //! Resizes a memory block (concept Allocator) void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { if (originalPtr == 0) return Malloc(newSize); RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); if (newSize == 0) return NULL; originalSize = RAPIDJSON_ALIGN(originalSize); newSize = RAPIDJSON_ALIGN(newSize); // Do not shrink if new size is smaller than original if (originalSize >= newSize) return originalPtr; // Simply expand it if it is the last allocation and there is sufficient space if (originalPtr == GetChunkBuffer(shared_) + shared_->chunkHead->size - originalSize) { size_t increment = static_cast(newSize - originalSize); if (shared_->chunkHead->size + increment <= shared_->chunkHead->capacity) { shared_->chunkHead->size += increment; return originalPtr; } } // Realloc process: allocate and copy memory, do not free original buffer. if (void* newBuffer = Malloc(newSize)) { if (originalSize) std::memcpy(newBuffer, originalPtr, originalSize); return newBuffer; } else return NULL; } //! Frees a memory block (concept Allocator) static void Free(void *ptr) RAPIDJSON_NOEXCEPT { (void)ptr; } // Do nothing //! Compare (equality) with another MemoryPoolAllocator bool operator==(const MemoryPoolAllocator& rhs) const RAPIDJSON_NOEXCEPT { RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); RAPIDJSON_NOEXCEPT_ASSERT(rhs.shared_->refcount > 0); return shared_ == rhs.shared_; } //! Compare (inequality) with another MemoryPoolAllocator bool operator!=(const MemoryPoolAllocator& rhs) const RAPIDJSON_NOEXCEPT { return !operator==(rhs); } private: //! Creates a new chunk. /*! \param capacity Capacity of the chunk in bytes. \return true if success. */ bool AddChunk(size_t capacity) { if (!baseAllocator_) shared_->ownBaseAllocator = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator)(); if (ChunkHeader* chunk = static_cast(baseAllocator_->Malloc(SIZEOF_CHUNK_HEADER + capacity))) { chunk->capacity = capacity; chunk->size = 0; chunk->next = shared_->chunkHead; shared_->chunkHead = chunk; return true; } else return false; } static inline void* AlignBuffer(void* buf, size_t &size) { RAPIDJSON_NOEXCEPT_ASSERT(buf != 0); const uintptr_t mask = sizeof(void*) - 1; const uintptr_t ubuf = reinterpret_cast(buf); if (RAPIDJSON_UNLIKELY(ubuf & mask)) { const uintptr_t abuf = (ubuf + mask) & ~mask; RAPIDJSON_ASSERT(size >= abuf - ubuf); buf = reinterpret_cast(abuf); size -= abuf - ubuf; } return buf; } size_t chunk_capacity_; //!< The minimum capacity of chunk when they are allocated. BaseAllocator* baseAllocator_; //!< base allocator for allocating memory chunks. SharedData *shared_; //!< The shared data of the allocator }; namespace internal { template struct IsRefCounted : public FalseType { }; template struct IsRefCounted::Type> : public TrueType { }; } template inline T* Realloc(A& a, T* old_p, size_t old_n, size_t new_n) { RAPIDJSON_NOEXCEPT_ASSERT(old_n <= (std::numeric_limits::max)() / sizeof(T) && new_n <= (std::numeric_limits::max)() / sizeof(T)); return static_cast(a.Realloc(old_p, old_n * sizeof(T), new_n * sizeof(T))); } template inline T *Malloc(A& a, size_t n = 1) { return Realloc(a, NULL, 0, n); } template inline void Free(A& a, T *p, size_t n = 1) { static_cast(Realloc(a, p, n, 0)); } #ifdef __GNUC__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) // std::allocator can safely be inherited #endif template class StdAllocator : public std::allocator { typedef std::allocator allocator_type; #if RAPIDJSON_HAS_CXX11 typedef std::allocator_traits traits_type; #else typedef allocator_type traits_type; #endif public: typedef BaseAllocator BaseAllocatorType; StdAllocator() RAPIDJSON_NOEXCEPT : allocator_type(), baseAllocator_() { } StdAllocator(const StdAllocator& rhs) RAPIDJSON_NOEXCEPT : allocator_type(rhs), baseAllocator_(rhs.baseAllocator_) { } template StdAllocator(const StdAllocator& rhs) RAPIDJSON_NOEXCEPT : allocator_type(rhs), baseAllocator_(rhs.baseAllocator_) { } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS StdAllocator(StdAllocator&& rhs) RAPIDJSON_NOEXCEPT : allocator_type(std::move(rhs)), baseAllocator_(std::move(rhs.baseAllocator_)) { } #endif #if RAPIDJSON_HAS_CXX11 using propagate_on_container_move_assignment = std::true_type; using propagate_on_container_swap = std::true_type; #endif /* implicit */ StdAllocator(const BaseAllocator& allocator) RAPIDJSON_NOEXCEPT : allocator_type(), baseAllocator_(allocator) { } ~StdAllocator() RAPIDJSON_NOEXCEPT { } template struct rebind { typedef StdAllocator other; }; typedef typename traits_type::size_type size_type; typedef typename traits_type::difference_type difference_type; typedef typename traits_type::value_type value_type; typedef typename traits_type::pointer pointer; typedef typename traits_type::const_pointer const_pointer; #if RAPIDJSON_HAS_CXX11 typedef typename std::add_lvalue_reference::type &reference; typedef typename std::add_lvalue_reference::type>::type &const_reference; pointer address(reference r) const RAPIDJSON_NOEXCEPT { return std::addressof(r); } const_pointer address(const_reference r) const RAPIDJSON_NOEXCEPT { return std::addressof(r); } size_type max_size() const RAPIDJSON_NOEXCEPT { return traits_type::max_size(*this); } template void construct(pointer p, Args&&... args) { traits_type::construct(*this, p, std::forward(args)...); } void destroy(pointer p) { traits_type::destroy(*this, p); } #else // !RAPIDJSON_HAS_CXX11 typedef typename allocator_type::reference reference; typedef typename allocator_type::const_reference const_reference; pointer address(reference r) const RAPIDJSON_NOEXCEPT { return allocator_type::address(r); } const_pointer address(const_reference r) const RAPIDJSON_NOEXCEPT { return allocator_type::address(r); } size_type max_size() const RAPIDJSON_NOEXCEPT { return allocator_type::max_size(); } void construct(pointer p, const_reference r) { allocator_type::construct(p, r); } void destroy(pointer p) { allocator_type::destroy(p); } #endif // !RAPIDJSON_HAS_CXX11 template U* allocate(size_type n = 1, const void* = 0) { return RAPIDJSON_NAMESPACE::Malloc(baseAllocator_, n); } template void deallocate(U* p, size_type n = 1) { RAPIDJSON_NAMESPACE::Free(baseAllocator_, p, n); } pointer allocate(size_type n = 1, const void* = 0) { return allocate(n); } void deallocate(pointer p, size_type n = 1) { deallocate(p, n); } #if RAPIDJSON_HAS_CXX11 using is_always_equal = std::is_empty; #endif template bool operator==(const StdAllocator& rhs) const RAPIDJSON_NOEXCEPT { return baseAllocator_ == rhs.baseAllocator_; } template bool operator!=(const StdAllocator& rhs) const RAPIDJSON_NOEXCEPT { return !operator==(rhs); } //! rapidjson Allocator concept static const bool kNeedFree = BaseAllocator::kNeedFree; static const bool kRefCounted = internal::IsRefCounted::Value; void* Malloc(size_t size) { return baseAllocator_.Malloc(size); } void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { return baseAllocator_.Realloc(originalPtr, originalSize, newSize); } static void Free(void *ptr) RAPIDJSON_NOEXCEPT { BaseAllocator::Free(ptr); } private: template friend class StdAllocator; // access to StdAllocator.* BaseAllocator baseAllocator_; }; #if !RAPIDJSON_HAS_CXX17 // std::allocator deprecated in C++17 template class StdAllocator : public std::allocator { typedef std::allocator allocator_type; public: typedef BaseAllocator BaseAllocatorType; StdAllocator() RAPIDJSON_NOEXCEPT : allocator_type(), baseAllocator_() { } StdAllocator(const StdAllocator& rhs) RAPIDJSON_NOEXCEPT : allocator_type(rhs), baseAllocator_(rhs.baseAllocator_) { } template StdAllocator(const StdAllocator& rhs) RAPIDJSON_NOEXCEPT : allocator_type(rhs), baseAllocator_(rhs.baseAllocator_) { } /* implicit */ StdAllocator(const BaseAllocator& baseAllocator) RAPIDJSON_NOEXCEPT : allocator_type(), baseAllocator_(baseAllocator) { } ~StdAllocator() RAPIDJSON_NOEXCEPT { } template struct rebind { typedef StdAllocator other; }; typedef typename allocator_type::value_type value_type; private: template friend class StdAllocator; // access to StdAllocator.* BaseAllocator baseAllocator_; }; #endif #ifdef __GNUC__ RAPIDJSON_DIAG_POP #endif RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_ENCODINGS_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/encodings.h0000644000000000000000000007107215031566105025456 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_ENCODINGS_H_ #define RAPIDJSON_ENCODINGS_H_ #include "rapidjson.h" #if defined(_MSC_VER) && !defined(__clang__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(4244) // conversion from 'type1' to 'type2', possible loss of data RAPIDJSON_DIAG_OFF(4702) // unreachable code #elif defined(__GNUC__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) RAPIDJSON_DIAG_OFF(overflow) #endif RAPIDJSON_NAMESPACE_BEGIN /////////////////////////////////////////////////////////////////////////////// // Encoding /*! \class rapidjson::Encoding \brief Concept for encoding of Unicode characters. \code concept Encoding { typename Ch; //! Type of character. A "character" is actually a code unit in unicode's definition. enum { supportUnicode = 1 }; // or 0 if not supporting unicode //! \brief Encode a Unicode codepoint to an output stream. //! \param os Output stream. //! \param codepoint An unicode codepoint, ranging from 0x0 to 0x10FFFF inclusively. template static void Encode(OutputStream& os, unsigned codepoint); //! \brief Decode a Unicode codepoint from an input stream. //! \param is Input stream. //! \param codepoint Output of the unicode codepoint. //! \return true if a valid codepoint can be decoded from the stream. template static bool Decode(InputStream& is, unsigned* codepoint); //! \brief Validate one Unicode codepoint from an encoded stream. //! \param is Input stream to obtain codepoint. //! \param os Output for copying one codepoint. //! \return true if it is valid. //! \note This function just validating and copying the codepoint without actually decode it. template static bool Validate(InputStream& is, OutputStream& os); // The following functions are deal with byte streams. //! Take a character from input byte stream, skip BOM if exist. template static CharType TakeBOM(InputByteStream& is); //! Take a character from input byte stream. template static Ch Take(InputByteStream& is); //! Put BOM to output byte stream. template static void PutBOM(OutputByteStream& os); //! Put a character to output byte stream. template static void Put(OutputByteStream& os, Ch c); }; \endcode */ /////////////////////////////////////////////////////////////////////////////// // UTF8 //! UTF-8 encoding. /*! http://en.wikipedia.org/wiki/UTF-8 http://tools.ietf.org/html/rfc3629 \tparam CharType Code unit for storing 8-bit UTF-8 data. Default is char. \note implements Encoding concept */ template struct UTF8 { typedef CharType Ch; enum { supportUnicode = 1 }; template static void Encode(OutputStream& os, unsigned codepoint) { if (codepoint <= 0x7F) os.Put(static_cast(codepoint & 0xFF)); else if (codepoint <= 0x7FF) { os.Put(static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); os.Put(static_cast(0x80 | ((codepoint & 0x3F)))); } else if (codepoint <= 0xFFFF) { os.Put(static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); os.Put(static_cast(0x80 | (codepoint & 0x3F))); } else { RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); os.Put(static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); os.Put(static_cast(0x80 | ((codepoint >> 12) & 0x3F))); os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); os.Put(static_cast(0x80 | (codepoint & 0x3F))); } } template static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { if (codepoint <= 0x7F) PutUnsafe(os, static_cast(codepoint & 0xFF)); else if (codepoint <= 0x7FF) { PutUnsafe(os, static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); PutUnsafe(os, static_cast(0x80 | ((codepoint & 0x3F)))); } else if (codepoint <= 0xFFFF) { PutUnsafe(os, static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); } else { RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); PutUnsafe(os, static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); PutUnsafe(os, static_cast(0x80 | ((codepoint >> 12) & 0x3F))); PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); } } template static bool Decode(InputStream& is, unsigned* codepoint) { #define RAPIDJSON_COPY() c = is.Take(); *codepoint = (*codepoint << 6) | (static_cast(c) & 0x3Fu) #define RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) #define RAPIDJSON_TAIL() RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x70) typename InputStream::Ch c = is.Take(); if (!(c & 0x80)) { *codepoint = static_cast(c); return true; } unsigned char type = GetRange(static_cast(c)); if (type >= 32) { *codepoint = 0; } else { *codepoint = (0xFFu >> type) & static_cast(c); } bool result = true; switch (type) { case 2: RAPIDJSON_TAIL(); return result; case 3: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; case 4: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x50); RAPIDJSON_TAIL(); return result; case 5: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x10); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; case 6: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; case 10: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x20); RAPIDJSON_TAIL(); return result; case 11: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x60); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; default: return false; } #undef RAPIDJSON_COPY #undef RAPIDJSON_TRANS #undef RAPIDJSON_TAIL } template static bool Validate(InputStream& is, OutputStream& os) { #define RAPIDJSON_COPY() os.Put(c = is.Take()) #define RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) #define RAPIDJSON_TAIL() RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x70) Ch c; RAPIDJSON_COPY(); if (!(c & 0x80)) return true; bool result = true; switch (GetRange(static_cast(c))) { case 2: RAPIDJSON_TAIL(); return result; case 3: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; case 4: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x50); RAPIDJSON_TAIL(); return result; case 5: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x10); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; case 6: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; case 10: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x20); RAPIDJSON_TAIL(); return result; case 11: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x60); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; default: return false; } #undef RAPIDJSON_COPY #undef RAPIDJSON_TRANS #undef RAPIDJSON_TAIL } static unsigned char GetRange(unsigned char c) { // Referring to DFA of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ // With new mapping 1 -> 0x10, 7 -> 0x20, 9 -> 0x40, such that AND operation can test multiple types. static const unsigned char type[] = { 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,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,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,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, 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, }; return type[c]; } template static CharType TakeBOM(InputByteStream& is) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); typename InputByteStream::Ch c = Take(is); if (static_cast(c) != 0xEFu) return c; c = is.Take(); if (static_cast(c) != 0xBBu) return c; c = is.Take(); if (static_cast(c) != 0xBFu) return c; c = is.Take(); return c; } template static Ch Take(InputByteStream& is) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); return static_cast(is.Take()); } template static void PutBOM(OutputByteStream& os) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); os.Put(static_cast(0xEFu)); os.Put(static_cast(0xBBu)); os.Put(static_cast(0xBFu)); } template static void Put(OutputByteStream& os, Ch c) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); os.Put(static_cast(c)); } }; /////////////////////////////////////////////////////////////////////////////// // UTF16 //! UTF-16 encoding. /*! http://en.wikipedia.org/wiki/UTF-16 http://tools.ietf.org/html/rfc2781 \tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead. \note implements Encoding concept \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. For streaming, use UTF16LE and UTF16BE, which handle endianness. */ template struct UTF16 { typedef CharType Ch; RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 2); enum { supportUnicode = 1 }; template static void Encode(OutputStream& os, unsigned codepoint) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); if (codepoint <= 0xFFFF) { RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair os.Put(static_cast(codepoint)); } else { RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); unsigned v = codepoint - 0x10000; os.Put(static_cast((v >> 10) | 0xD800)); os.Put(static_cast((v & 0x3FF) | 0xDC00)); } } template static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); if (codepoint <= 0xFFFF) { RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair PutUnsafe(os, static_cast(codepoint)); } else { RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); unsigned v = codepoint - 0x10000; PutUnsafe(os, static_cast((v >> 10) | 0xD800)); PutUnsafe(os, static_cast((v & 0x3FF) | 0xDC00)); } } template static bool Decode(InputStream& is, unsigned* codepoint) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); typename InputStream::Ch c = is.Take(); if (c < 0xD800 || c > 0xDFFF) { *codepoint = static_cast(c); return true; } else if (c <= 0xDBFF) { *codepoint = (static_cast(c) & 0x3FF) << 10; c = is.Take(); *codepoint |= (static_cast(c) & 0x3FF); *codepoint += 0x10000; return c >= 0xDC00 && c <= 0xDFFF; } return false; } template static bool Validate(InputStream& is, OutputStream& os) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); typename InputStream::Ch c; os.Put(static_cast(c = is.Take())); if (c < 0xD800 || c > 0xDFFF) return true; else if (c <= 0xDBFF) { os.Put(c = is.Take()); return c >= 0xDC00 && c <= 0xDFFF; } return false; } }; //! UTF-16 little endian encoding. template struct UTF16LE : UTF16 { template static CharType TakeBOM(InputByteStream& is) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); CharType c = Take(is); return static_cast(c) == 0xFEFFu ? Take(is) : c; } template static CharType Take(InputByteStream& is) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); unsigned c = static_cast(is.Take()); c |= static_cast(static_cast(is.Take())) << 8; return static_cast(c); } template static void PutBOM(OutputByteStream& os) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); os.Put(static_cast(0xFFu)); os.Put(static_cast(0xFEu)); } template static void Put(OutputByteStream& os, CharType c) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); os.Put(static_cast(static_cast(c) & 0xFFu)); os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); } }; //! UTF-16 big endian encoding. template struct UTF16BE : UTF16 { template static CharType TakeBOM(InputByteStream& is) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); CharType c = Take(is); return static_cast(c) == 0xFEFFu ? Take(is) : c; } template static CharType Take(InputByteStream& is) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); unsigned c = static_cast(static_cast(is.Take())) << 8; c |= static_cast(static_cast(is.Take())); return static_cast(c); } template static void PutBOM(OutputByteStream& os) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); os.Put(static_cast(0xFEu)); os.Put(static_cast(0xFFu)); } template static void Put(OutputByteStream& os, CharType c) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); os.Put(static_cast(static_cast(c) & 0xFFu)); } }; /////////////////////////////////////////////////////////////////////////////// // UTF32 //! UTF-32 encoding. /*! http://en.wikipedia.org/wiki/UTF-32 \tparam CharType Type for storing 32-bit UTF-32 data. Default is unsigned. C++11 may use char32_t instead. \note implements Encoding concept \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. For streaming, use UTF32LE and UTF32BE, which handle endianness. */ template struct UTF32 { typedef CharType Ch; RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 4); enum { supportUnicode = 1 }; template static void Encode(OutputStream& os, unsigned codepoint) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); os.Put(codepoint); } template static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); PutUnsafe(os, codepoint); } template static bool Decode(InputStream& is, unsigned* codepoint) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); Ch c = is.Take(); *codepoint = c; return c <= 0x10FFFF; } template static bool Validate(InputStream& is, OutputStream& os) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); Ch c; os.Put(c = is.Take()); return c <= 0x10FFFF; } }; //! UTF-32 little endian enocoding. template struct UTF32LE : UTF32 { template static CharType TakeBOM(InputByteStream& is) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); CharType c = Take(is); return static_cast(c) == 0x0000FEFFu ? Take(is) : c; } template static CharType Take(InputByteStream& is) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); unsigned c = static_cast(is.Take()); c |= static_cast(static_cast(is.Take())) << 8; c |= static_cast(static_cast(is.Take())) << 16; c |= static_cast(static_cast(is.Take())) << 24; return static_cast(c); } template static void PutBOM(OutputByteStream& os) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); os.Put(static_cast(0xFFu)); os.Put(static_cast(0xFEu)); os.Put(static_cast(0x00u)); os.Put(static_cast(0x00u)); } template static void Put(OutputByteStream& os, CharType c) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); os.Put(static_cast(c & 0xFFu)); os.Put(static_cast((c >> 8) & 0xFFu)); os.Put(static_cast((c >> 16) & 0xFFu)); os.Put(static_cast((c >> 24) & 0xFFu)); } }; //! UTF-32 big endian encoding. template struct UTF32BE : UTF32 { template static CharType TakeBOM(InputByteStream& is) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); CharType c = Take(is); return static_cast(c) == 0x0000FEFFu ? Take(is) : c; } template static CharType Take(InputByteStream& is) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); unsigned c = static_cast(static_cast(is.Take())) << 24; c |= static_cast(static_cast(is.Take())) << 16; c |= static_cast(static_cast(is.Take())) << 8; c |= static_cast(static_cast(is.Take())); return static_cast(c); } template static void PutBOM(OutputByteStream& os) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); os.Put(static_cast(0x00u)); os.Put(static_cast(0x00u)); os.Put(static_cast(0xFEu)); os.Put(static_cast(0xFFu)); } template static void Put(OutputByteStream& os, CharType c) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); os.Put(static_cast((c >> 24) & 0xFFu)); os.Put(static_cast((c >> 16) & 0xFFu)); os.Put(static_cast((c >> 8) & 0xFFu)); os.Put(static_cast(c & 0xFFu)); } }; /////////////////////////////////////////////////////////////////////////////// // ASCII //! ASCII encoding. /*! http://en.wikipedia.org/wiki/ASCII \tparam CharType Code unit for storing 7-bit ASCII data. Default is char. \note implements Encoding concept */ template struct ASCII { typedef CharType Ch; enum { supportUnicode = 0 }; template static void Encode(OutputStream& os, unsigned codepoint) { RAPIDJSON_ASSERT(codepoint <= 0x7F); os.Put(static_cast(codepoint & 0xFF)); } template static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { RAPIDJSON_ASSERT(codepoint <= 0x7F); PutUnsafe(os, static_cast(codepoint & 0xFF)); } template static bool Decode(InputStream& is, unsigned* codepoint) { uint8_t c = static_cast(is.Take()); *codepoint = c; return c <= 0X7F; } template static bool Validate(InputStream& is, OutputStream& os) { uint8_t c = static_cast(is.Take()); os.Put(static_cast(c)); return c <= 0x7F; } template static CharType TakeBOM(InputByteStream& is) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); uint8_t c = static_cast(Take(is)); return static_cast(c); } template static Ch Take(InputByteStream& is) { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); return static_cast(is.Take()); } template static void PutBOM(OutputByteStream& os) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); (void)os; } template static void Put(OutputByteStream& os, Ch c) { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); os.Put(static_cast(c)); } }; /////////////////////////////////////////////////////////////////////////////// // AutoUTF //! Runtime-specified UTF encoding type of a stream. enum UTFType { kUTF8 = 0, //!< UTF-8. kUTF16LE = 1, //!< UTF-16 little endian. kUTF16BE = 2, //!< UTF-16 big endian. kUTF32LE = 3, //!< UTF-32 little endian. kUTF32BE = 4 //!< UTF-32 big endian. }; //! Dynamically select encoding according to stream's runtime-specified UTF encoding type. /*! \note This class can be used with AutoUTFInputtStream and AutoUTFOutputStream, which provides GetType(). */ template struct AutoUTF { typedef CharType Ch; enum { supportUnicode = 1 }; #define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x template static RAPIDJSON_FORCEINLINE void Encode(OutputStream& os, unsigned codepoint) { typedef void (*EncodeFunc)(OutputStream&, unsigned); static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Encode) }; (*f[os.GetType()])(os, codepoint); } template static RAPIDJSON_FORCEINLINE void EncodeUnsafe(OutputStream& os, unsigned codepoint) { typedef void (*EncodeFunc)(OutputStream&, unsigned); static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(EncodeUnsafe) }; (*f[os.GetType()])(os, codepoint); } template static RAPIDJSON_FORCEINLINE bool Decode(InputStream& is, unsigned* codepoint) { typedef bool (*DecodeFunc)(InputStream&, unsigned*); static const DecodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Decode) }; return (*f[is.GetType()])(is, codepoint); } template static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { typedef bool (*ValidateFunc)(InputStream&, OutputStream&); static const ValidateFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Validate) }; return (*f[is.GetType()])(is, os); } #undef RAPIDJSON_ENCODINGS_FUNC }; /////////////////////////////////////////////////////////////////////////////// // Transcoder //! Encoding conversion. template struct Transcoder { //! Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the output stream. template static RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) { unsigned codepoint; if (!SourceEncoding::Decode(is, &codepoint)) return false; TargetEncoding::Encode(os, codepoint); return true; } template static RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) { unsigned codepoint; if (!SourceEncoding::Decode(is, &codepoint)) return false; TargetEncoding::EncodeUnsafe(os, codepoint); return true; } //! Validate one Unicode codepoint from an encoded stream. template static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { return Transcode(is, os); // Since source/target encoding is different, must transcode. } }; // Forward declaration. template inline void PutUnsafe(Stream& stream, typename Stream::Ch c); //! Specialization of Transcoder with same source and target encoding. template struct Transcoder { template static RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) { os.Put(is.Take()); // Just copy one code unit. This semantic is different from primary template class. return true; } template static RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) { PutUnsafe(os, is.Take()); // Just copy one code unit. This semantic is different from primary template class. return true; } template static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { return Encoding::Validate(is, os); // source/target encoding are the same } }; RAPIDJSON_NAMESPACE_END #if defined(__GNUC__) || (defined(_MSC_VER) && !defined(__clang__)) RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_ENCODINGS_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/filereadstream.h0000644000000000000000000000563615031566105026477 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_FILEREADSTREAM_H_ #define RAPIDJSON_FILEREADSTREAM_H_ #include "stream.h" #include #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(padded) RAPIDJSON_DIAG_OFF(unreachable-code) RAPIDJSON_DIAG_OFF(missing-noreturn) #endif RAPIDJSON_NAMESPACE_BEGIN //! File byte stream for input using fread(). /*! \note implements Stream concept */ class FileReadStream { public: typedef char Ch; //!< Character type (byte). //! Constructor. /*! \param fp File pointer opened for read. \param buffer user-supplied buffer. \param bufferSize size of buffer in bytes. Must >=4 bytes. */ FileReadStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { RAPIDJSON_ASSERT(fp_ != 0); RAPIDJSON_ASSERT(bufferSize >= 4); Read(); } Ch Peek() const { return *current_; } Ch Take() { Ch c = *current_; Read(); return c; } size_t Tell() const { return count_ + static_cast(current_ - buffer_); } // Not implemented void Put(Ch) { RAPIDJSON_ASSERT(false); } void Flush() { RAPIDJSON_ASSERT(false); } Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } // For encoding detection only. const Ch* Peek4() const { return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0; } private: void Read() { if (current_ < bufferLast_) ++current_; else if (!eof_) { count_ += readCount_; readCount_ = std::fread(buffer_, 1, bufferSize_, fp_); bufferLast_ = buffer_ + readCount_ - 1; current_ = buffer_; if (readCount_ < bufferSize_) { buffer_[readCount_] = '\0'; ++bufferLast_; eof_ = true; } } } std::FILE* fp_; Ch *buffer_; size_t bufferSize_; Ch *bufferLast_; Ch *current_; size_t readCount_; size_t count_; //!< Number of characters read bool eof_; }; RAPIDJSON_NAMESPACE_END #ifdef __clang__ RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_FILESTREAM_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/stream.h0000644000000000000000000001511415031566105024773 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "rapidjson.h" #ifndef RAPIDJSON_STREAM_H_ #define RAPIDJSON_STREAM_H_ #include "encodings.h" RAPIDJSON_NAMESPACE_BEGIN /////////////////////////////////////////////////////////////////////////////// // Stream /*! \class rapidjson::Stream \brief Concept for reading and writing characters. For read-only stream, no need to implement PutBegin(), Put(), Flush() and PutEnd(). For write-only stream, only need to implement Put() and Flush(). \code concept Stream { typename Ch; //!< Character type of the stream. //! Read the current character from stream without moving the read cursor. Ch Peek() const; //! Read the current character from stream and moving the read cursor to next character. Ch Take(); //! Get the current read cursor. //! \return Number of characters read from start. size_t Tell(); //! Begin writing operation at the current read pointer. //! \return The begin writer pointer. Ch* PutBegin(); //! Write a character. void Put(Ch c); //! Flush the buffer. void Flush(); //! End the writing operation. //! \param begin The begin write pointer returned by PutBegin(). //! \return Number of characters written. size_t PutEnd(Ch* begin); } \endcode */ //! Provides additional information for stream. /*! By using traits pattern, this type provides a default configuration for stream. For custom stream, this type can be specialized for other configuration. See TEST(Reader, CustomStringStream) in readertest.cpp for example. */ template struct StreamTraits { //! Whether to make local copy of stream for optimization during parsing. /*! By default, for safety, streams do not use local copy optimization. Stream that can be copied fast should specialize this, like StreamTraits. */ enum { copyOptimization = 0 }; }; //! Reserve n characters for writing to a stream. template inline void PutReserve(Stream& stream, size_t count) { (void)stream; (void)count; } //! Write character to a stream, presuming buffer is reserved. template inline void PutUnsafe(Stream& stream, typename Stream::Ch c) { stream.Put(c); } //! Put N copies of a character to a stream. template inline void PutN(Stream& stream, Ch c, size_t n) { PutReserve(stream, n); for (size_t i = 0; i < n; i++) PutUnsafe(stream, c); } /////////////////////////////////////////////////////////////////////////////// // GenericStreamWrapper //! A Stream Wrapper /*! \tThis string stream is a wrapper for any stream by just forwarding any \treceived message to the origin stream. \note implements Stream concept */ #if defined(_MSC_VER) && _MSC_VER <= 1800 RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(4702) // unreachable code RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated #endif template > class GenericStreamWrapper { public: typedef typename Encoding::Ch Ch; GenericStreamWrapper(InputStream& is): is_(is) {} Ch Peek() const { return is_.Peek(); } Ch Take() { return is_.Take(); } size_t Tell() { return is_.Tell(); } Ch* PutBegin() { return is_.PutBegin(); } void Put(Ch ch) { is_.Put(ch); } void Flush() { is_.Flush(); } size_t PutEnd(Ch* ch) { return is_.PutEnd(ch); } // wrapper for MemoryStream const Ch* Peek4() const { return is_.Peek4(); } // wrapper for AutoUTFInputStream UTFType GetType() const { return is_.GetType(); } bool HasBOM() const { return is_.HasBOM(); } protected: InputStream& is_; }; #if defined(_MSC_VER) && _MSC_VER <= 1800 RAPIDJSON_DIAG_POP #endif /////////////////////////////////////////////////////////////////////////////// // StringStream //! Read-only string stream. /*! \note implements Stream concept */ template struct GenericStringStream { typedef typename Encoding::Ch Ch; GenericStringStream(const Ch *src) : src_(src), head_(src) {} Ch Peek() const { return *src_; } Ch Take() { return *src_++; } size_t Tell() const { return static_cast(src_ - head_); } Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } void Put(Ch) { RAPIDJSON_ASSERT(false); } void Flush() { RAPIDJSON_ASSERT(false); } size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } const Ch* src_; //!< Current read position. const Ch* head_; //!< Original head of the string. }; template struct StreamTraits > { enum { copyOptimization = 1 }; }; //! String stream with UTF8 encoding. typedef GenericStringStream > StringStream; /////////////////////////////////////////////////////////////////////////////// // InsituStringStream //! A read-write string stream. /*! This string stream is particularly designed for in-situ parsing. \note implements Stream concept */ template struct GenericInsituStringStream { typedef typename Encoding::Ch Ch; GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {} // Read Ch Peek() { return *src_; } Ch Take() { return *src_++; } size_t Tell() { return static_cast(src_ - head_); } // Write void Put(Ch c) { RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; } Ch* PutBegin() { return dst_ = src_; } size_t PutEnd(Ch* begin) { return static_cast(dst_ - begin); } void Flush() {} Ch* Push(size_t count) { Ch* begin = dst_; dst_ += count; return begin; } void Pop(size_t count) { dst_ -= count; } Ch* src_; Ch* dst_; Ch* head_; }; template struct StreamTraits > { enum { copyOptimization = 1 }; }; //! Insitu string stream with UTF8 encoding. typedef GenericInsituStringStream > InsituStringStream; RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_STREAM_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/cursorstreamwrapper.h0000644000000000000000000000432415031566105027633 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_CURSORSTREAMWRAPPER_H_ #define RAPIDJSON_CURSORSTREAMWRAPPER_H_ #include "stream.h" #if defined(__GNUC__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) #endif #if defined(_MSC_VER) && _MSC_VER <= 1800 RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(4702) // unreachable code RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated #endif RAPIDJSON_NAMESPACE_BEGIN //! Cursor stream wrapper for counting line and column number if error exists. /*! \tparam InputStream Any stream that implements Stream Concept */ template > class CursorStreamWrapper : public GenericStreamWrapper { public: typedef typename Encoding::Ch Ch; CursorStreamWrapper(InputStream& is): GenericStreamWrapper(is), line_(1), col_(0) {} // counting line and column number Ch Take() { Ch ch = this->is_.Take(); if(ch == '\n') { line_ ++; col_ = 0; } else { col_ ++; } return ch; } //! Get the error line number, if error exists. size_t GetLine() const { return line_; } //! Get the error column number, if error exists. size_t GetColumn() const { return col_; } private: size_t line_; //!< Current Line size_t col_; //!< Current Column }; #if defined(_MSC_VER) && _MSC_VER <= 1800 RAPIDJSON_DIAG_POP #endif #if defined(__GNUC__) RAPIDJSON_DIAG_POP #endif RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_CURSORSTREAMWRAPPER_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/prettywriter.h0000644000000000000000000002441015031566105026263 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_PRETTYWRITER_H_ #define RAPIDJSON_PRETTYWRITER_H_ #include "writer.h" #ifdef __GNUC__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) #endif #if defined(__clang__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(c++98-compat) #endif RAPIDJSON_NAMESPACE_BEGIN //! Combination of PrettyWriter format flags. /*! \see PrettyWriter::SetFormatOptions */ enum PrettyFormatOptions { kFormatDefault = 0, //!< Default pretty formatting. kFormatSingleLineArray = 1 //!< Format arrays on a single line. }; //! Writer with indentation and spacing. /*! \tparam OutputStream Type of output os. \tparam SourceEncoding Encoding of source string. \tparam TargetEncoding Encoding of output stream. \tparam StackAllocator Type of allocator for allocating memory of stack. */ template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> class PrettyWriter : public Writer { public: typedef Writer Base; typedef typename Base::Ch Ch; //! Constructor /*! \param os Output stream. \param allocator User supplied allocator. If it is null, it will create a private one. \param levelDepth Initial capacity of stack. */ explicit PrettyWriter(OutputStream& os, StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : Base(os, allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {} explicit PrettyWriter(StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : Base(allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {} #if RAPIDJSON_HAS_CXX11_RVALUE_REFS PrettyWriter(PrettyWriter&& rhs) : Base(std::forward(rhs)), indentChar_(rhs.indentChar_), indentCharCount_(rhs.indentCharCount_), formatOptions_(rhs.formatOptions_) {} #endif //! Set custom indentation. /*! \param indentChar Character for indentation. Must be whitespace character (' ', '\\t', '\\n', '\\r'). \param indentCharCount Number of indent characters for each indentation level. \note The default indentation is 4 spaces. */ PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) { RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\t' || indentChar == '\n' || indentChar == '\r'); indentChar_ = indentChar; indentCharCount_ = indentCharCount; return *this; } //! Set pretty writer formatting options. /*! \param options Formatting options. */ PrettyWriter& SetFormatOptions(PrettyFormatOptions options) { formatOptions_ = options; return *this; } /*! @name Implementation of Handler \see Handler */ //@{ bool Null() { PrettyPrefix(kNullType); return Base::EndValue(Base::WriteNull()); } bool Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); return Base::EndValue(Base::WriteBool(b)); } bool Int(int i) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt(i)); } bool Uint(unsigned u) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint(u)); } bool Int64(int64_t i64) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt64(i64)); } bool Uint64(uint64_t u64) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint64(u64)); } bool Double(double d) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteDouble(d)); } bool RawNumber(const Ch* str, SizeType length, bool copy = false) { RAPIDJSON_ASSERT(str != 0); (void)copy; PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteString(str, length)); } bool String(const Ch* str, SizeType length, bool copy = false) { RAPIDJSON_ASSERT(str != 0); (void)copy; PrettyPrefix(kStringType); return Base::EndValue(Base::WriteString(str, length)); } #if RAPIDJSON_HAS_STDSTRING bool String(const std::basic_string& str) { return String(str.data(), SizeType(str.size())); } #endif bool StartObject() { PrettyPrefix(kObjectType); new (Base::level_stack_.template Push()) typename Base::Level(false); return Base::WriteStartObject(); } bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } #if RAPIDJSON_HAS_STDSTRING bool Key(const std::basic_string& str) { return Key(str.data(), SizeType(str.size())); } #endif bool EndObject(SizeType memberCount = 0) { (void)memberCount; RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); // not inside an Object RAPIDJSON_ASSERT(!Base::level_stack_.template Top()->inArray); // currently inside an Array, not Object RAPIDJSON_ASSERT(0 == Base::level_stack_.template Top()->valueCount % 2); // Object has a Key without a Value bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; if (!empty) { Base::os_->Put('\n'); WriteIndent(); } bool ret = Base::EndValue(Base::WriteEndObject()); (void)ret; RAPIDJSON_ASSERT(ret == true); if (Base::level_stack_.Empty()) // end of json text Base::Flush(); return true; } bool StartArray() { PrettyPrefix(kArrayType); new (Base::level_stack_.template Push()) typename Base::Level(true); return Base::WriteStartArray(); } bool EndArray(SizeType memberCount = 0) { (void)memberCount; RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); RAPIDJSON_ASSERT(Base::level_stack_.template Top()->inArray); bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; if (!empty && !(formatOptions_ & kFormatSingleLineArray)) { Base::os_->Put('\n'); WriteIndent(); } bool ret = Base::EndValue(Base::WriteEndArray()); (void)ret; RAPIDJSON_ASSERT(ret == true); if (Base::level_stack_.Empty()) // end of json text Base::Flush(); return true; } //@} /*! @name Convenience extensions */ //@{ //! Simpler but slower overload. bool String(const Ch* str) { return String(str, internal::StrLen(str)); } bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } //@} //! Write a raw JSON value. /*! For user to write a stringified JSON as a value. \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. \param length Length of the json. \param type Type of the root of json. \note When using PrettyWriter::RawValue(), the result json may not be indented correctly. */ bool RawValue(const Ch* json, size_t length, Type type) { RAPIDJSON_ASSERT(json != 0); PrettyPrefix(type); return Base::EndValue(Base::WriteRawValue(json, length)); } protected: void PrettyPrefix(Type type) { (void)type; if (Base::level_stack_.GetSize() != 0) { // this value is not at root typename Base::Level* level = Base::level_stack_.template Top(); if (level->inArray) { if (level->valueCount > 0) { Base::os_->Put(','); // add comma if it is not the first element in array if (formatOptions_ & kFormatSingleLineArray) Base::os_->Put(' '); } if (!(formatOptions_ & kFormatSingleLineArray)) { Base::os_->Put('\n'); WriteIndent(); } } else { // in object if (level->valueCount > 0) { if (level->valueCount % 2 == 0) { Base::os_->Put(','); Base::os_->Put('\n'); } else { Base::os_->Put(':'); Base::os_->Put(' '); } } else Base::os_->Put('\n'); if (level->valueCount % 2 == 0) WriteIndent(); } if (!level->inArray && level->valueCount % 2 == 0) RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name level->valueCount++; } else { RAPIDJSON_ASSERT(!Base::hasRoot_); // Should only has one and only one root. Base::hasRoot_ = true; } } void WriteIndent() { size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_; PutN(*Base::os_, static_cast(indentChar_), count); } Ch indentChar_; unsigned indentCharCount_; PrettyFormatOptions formatOptions_; private: // Prohibit copy constructor & assignment operator. PrettyWriter(const PrettyWriter&); PrettyWriter& operator=(const PrettyWriter&); }; RAPIDJSON_NAMESPACE_END #if defined(__clang__) RAPIDJSON_DIAG_POP #endif #ifdef __GNUC__ RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_RAPIDJSON_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/memorybuffer.h0000644000000000000000000000474615031566105026213 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_MEMORYBUFFER_H_ #define RAPIDJSON_MEMORYBUFFER_H_ #include "stream.h" #include "internal/stack.h" RAPIDJSON_NAMESPACE_BEGIN //! Represents an in-memory output byte stream. /*! This class is mainly for being wrapped by EncodedOutputStream or AutoUTFOutputStream. It is similar to FileWriteBuffer but the destination is an in-memory buffer instead of a file. Differences between MemoryBuffer and StringBuffer: 1. StringBuffer has Encoding but MemoryBuffer is only a byte buffer. 2. StringBuffer::GetString() returns a null-terminated string. MemoryBuffer::GetBuffer() returns a buffer without terminator. \tparam Allocator type for allocating memory buffer. \note implements Stream concept */ template struct GenericMemoryBuffer { typedef char Ch; // byte GenericMemoryBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} void Put(Ch c) { *stack_.template Push() = c; } void Flush() {} void Clear() { stack_.Clear(); } void ShrinkToFit() { stack_.ShrinkToFit(); } Ch* Push(size_t count) { return stack_.template Push(count); } void Pop(size_t count) { stack_.template Pop(count); } const Ch* GetBuffer() const { return stack_.template Bottom(); } size_t GetSize() const { return stack_.GetSize(); } static const size_t kDefaultCapacity = 256; mutable internal::Stack stack_; }; typedef GenericMemoryBuffer<> MemoryBuffer; //! Implement specialized version of PutN() with memset() for better performance. template<> inline void PutN(MemoryBuffer& memoryBuffer, char c, size_t n) { std::memset(memoryBuffer.stack_.Push(n), c, n * sizeof(c)); } RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_MEMORYBUFFER_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/reader.h0000644000000000000000000027017415031566105024753 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_READER_H_ #define RAPIDJSON_READER_H_ /*! \file reader.h */ #include "allocators.h" #include "stream.h" #include "encodedstream.h" #include "internal/clzll.h" #include "internal/meta.h" #include "internal/stack.h" #include "internal/strtod.h" #include #if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) #include #pragma intrinsic(_BitScanForward) #endif #ifdef RAPIDJSON_SSE42 #include #elif defined(RAPIDJSON_SSE2) #include #elif defined(RAPIDJSON_NEON) #include #endif #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(old-style-cast) RAPIDJSON_DIAG_OFF(padded) RAPIDJSON_DIAG_OFF(switch-enum) #elif defined(_MSC_VER) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant RAPIDJSON_DIAG_OFF(4702) // unreachable code #endif #ifdef __GNUC__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) #endif //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN #define RAPIDJSON_NOTHING /* deliberately empty */ #ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN #define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \ RAPIDJSON_MULTILINEMACRO_BEGIN \ if (RAPIDJSON_UNLIKELY(HasParseError())) { return value; } \ RAPIDJSON_MULTILINEMACRO_END #endif #define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \ RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING) //!@endcond /*! \def RAPIDJSON_PARSE_ERROR_NORETURN \ingroup RAPIDJSON_ERRORS \brief Macro to indicate a parse error. \param parseErrorCode \ref rapidjson::ParseErrorCode of the error \param offset position of the error in JSON input (\c size_t) This macros can be used as a customization point for the internal error handling mechanism of RapidJSON. A common usage model is to throw an exception instead of requiring the caller to explicitly check the \ref rapidjson::GenericReader::Parse's return value: \code #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode,offset) \ throw ParseException(parseErrorCode, #parseErrorCode, offset) #include // std::runtime_error #include "rapidjson/error/error.h" // rapidjson::ParseResult struct ParseException : std::runtime_error, rapidjson::ParseResult { ParseException(rapidjson::ParseErrorCode code, const char* msg, size_t offset) : std::runtime_error(msg), ParseResult(code, offset) {} }; #include "rapidjson/reader.h" \endcode \see RAPIDJSON_PARSE_ERROR, rapidjson::GenericReader::Parse */ #ifndef RAPIDJSON_PARSE_ERROR_NORETURN #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \ RAPIDJSON_MULTILINEMACRO_BEGIN \ RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \ SetParseError(parseErrorCode, offset); \ RAPIDJSON_MULTILINEMACRO_END #endif /*! \def RAPIDJSON_PARSE_ERROR \ingroup RAPIDJSON_ERRORS \brief (Internal) macro to indicate and handle a parse error. \param parseErrorCode \ref rapidjson::ParseErrorCode of the error \param offset position of the error in JSON input (\c size_t) Invokes RAPIDJSON_PARSE_ERROR_NORETURN and stops the parsing. \see RAPIDJSON_PARSE_ERROR_NORETURN \hideinitializer */ #ifndef RAPIDJSON_PARSE_ERROR #define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \ RAPIDJSON_MULTILINEMACRO_BEGIN \ RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \ RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \ RAPIDJSON_MULTILINEMACRO_END #endif #include "error/error.h" // ParseErrorCode, ParseResult RAPIDJSON_NAMESPACE_BEGIN /////////////////////////////////////////////////////////////////////////////// // ParseFlag /*! \def RAPIDJSON_PARSE_DEFAULT_FLAGS \ingroup RAPIDJSON_CONFIG \brief User-defined kParseDefaultFlags definition. User can define this as any \c ParseFlag combinations. */ #ifndef RAPIDJSON_PARSE_DEFAULT_FLAGS #define RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags #endif //! Combination of parseFlags /*! \see Reader::Parse, Document::Parse, Document::ParseInsitu, Document::ParseStream */ enum ParseFlag { kParseNoFlags = 0, //!< No flags are set. kParseInsituFlag = 1, //!< In-situ(destructive) parsing. kParseValidateEncodingFlag = 2, //!< Validate encoding of JSON strings. kParseIterativeFlag = 4, //!< Iterative(constant complexity in terms of function call stack size) parsing. kParseStopWhenDoneFlag = 8, //!< After parsing a complete JSON root from stream, stop further processing the rest of stream. When this flag is used, parser will not generate kParseErrorDocumentRootNotSingular error. kParseFullPrecisionFlag = 16, //!< Parse number in full precision (but slower). kParseCommentsFlag = 32, //!< Allow one-line (//) and multi-line (/**/) comments. kParseNumbersAsStringsFlag = 64, //!< Parse all numbers (ints/doubles) as strings. kParseTrailingCommasFlag = 128, //!< Allow trailing commas at the end of objects and arrays. kParseNanAndInfFlag = 256, //!< Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles. kParseEscapedApostropheFlag = 512, //!< Allow escaped apostrophe in strings. kParseDefaultFlags = RAPIDJSON_PARSE_DEFAULT_FLAGS //!< Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS }; /////////////////////////////////////////////////////////////////////////////// // Handler /*! \class rapidjson::Handler \brief Concept for receiving events from GenericReader upon parsing. The functions return true if no error occurs. If they return false, the event publisher should terminate the process. \code concept Handler { typename Ch; bool Null(); bool Bool(bool b); bool Int(int i); bool Uint(unsigned i); bool Int64(int64_t i); bool Uint64(uint64_t i); bool Double(double d); /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) bool RawNumber(const Ch* str, SizeType length, bool copy); bool String(const Ch* str, SizeType length, bool copy); bool StartObject(); bool Key(const Ch* str, SizeType length, bool copy); bool EndObject(SizeType memberCount); bool StartArray(); bool EndArray(SizeType elementCount); }; \endcode */ /////////////////////////////////////////////////////////////////////////////// // BaseReaderHandler //! Default implementation of Handler. /*! This can be used as base class of any reader handler. \note implements Handler concept */ template, typename Derived = void> struct BaseReaderHandler { typedef typename Encoding::Ch Ch; typedef typename internal::SelectIf, BaseReaderHandler, Derived>::Type Override; bool Default() { return true; } bool Null() { return static_cast(*this).Default(); } bool Bool(bool) { return static_cast(*this).Default(); } bool Int(int) { return static_cast(*this).Default(); } bool Uint(unsigned) { return static_cast(*this).Default(); } bool Int64(int64_t) { return static_cast(*this).Default(); } bool Uint64(uint64_t) { return static_cast(*this).Default(); } bool Double(double) { return static_cast(*this).Default(); } /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) bool RawNumber(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } bool String(const Ch*, SizeType, bool) { return static_cast(*this).Default(); } bool StartObject() { return static_cast(*this).Default(); } bool Key(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } bool EndObject(SizeType) { return static_cast(*this).Default(); } bool StartArray() { return static_cast(*this).Default(); } bool EndArray(SizeType) { return static_cast(*this).Default(); } }; /////////////////////////////////////////////////////////////////////////////// // StreamLocalCopy namespace internal { template::copyOptimization> class StreamLocalCopy; //! Do copy optimization. template class StreamLocalCopy { public: StreamLocalCopy(Stream& original) : s(original), original_(original) {} ~StreamLocalCopy() { original_ = s; } Stream s; private: StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; Stream& original_; }; //! Keep reference. template class StreamLocalCopy { public: StreamLocalCopy(Stream& original) : s(original) {} Stream& s; private: StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; }; } // namespace internal /////////////////////////////////////////////////////////////////////////////// // SkipWhitespace //! Skip the JSON white spaces in a stream. /*! \param is A input stream for skipping white spaces. \note This function has SSE2/SSE4.2 specialization. */ template void SkipWhitespace(InputStream& is) { internal::StreamLocalCopy copy(is); InputStream& s(copy.s); typename InputStream::Ch c; while ((c = s.Peek()) == ' ' || c == '\n' || c == '\r' || c == '\t') s.Take(); } inline const char* SkipWhitespace(const char* p, const char* end) { while (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) ++p; return p; } #ifdef RAPIDJSON_SSE42 //! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. inline const char *SkipWhitespace_SIMD(const char* p) { // Fast return for single non-whitespace if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') ++p; else return p; // 16-byte align to the next boundary const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); while (p != nextAligned) if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') ++p; else return p; // The rest of string using SIMD static const char whitespace[16] = " \n\r\t"; const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); for (;; p += 16) { const __m128i s = _mm_load_si128(reinterpret_cast(p)); const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY); if (r != 16) // some of characters is non-whitespace return p + r; } } inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { // Fast return for single non-whitespace if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) ++p; else return p; // The middle of string using SIMD static const char whitespace[16] = " \n\r\t"; const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); for (; p <= end - 16; p += 16) { const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY); if (r != 16) // some of characters is non-whitespace return p + r; } return SkipWhitespace(p, end); } #elif defined(RAPIDJSON_SSE2) //! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. inline const char *SkipWhitespace_SIMD(const char* p) { // Fast return for single non-whitespace if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') ++p; else return p; // 16-byte align to the next boundary const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); while (p != nextAligned) if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') ++p; else return p; // The rest of string #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; #undef C16 const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); for (;; p += 16) { const __m128i s = _mm_load_si128(reinterpret_cast(p)); __m128i x = _mm_cmpeq_epi8(s, w0); x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); unsigned short r = static_cast(~_mm_movemask_epi8(x)); if (r != 0) { // some of characters may be non-whitespace #ifdef _MSC_VER // Find the index of first non-whitespace unsigned long offset; _BitScanForward(&offset, r); return p + offset; #else return p + __builtin_ffs(r) - 1; #endif } } } inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { // Fast return for single non-whitespace if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) ++p; else return p; // The rest of string #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; #undef C16 const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); for (; p <= end - 16; p += 16) { const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); __m128i x = _mm_cmpeq_epi8(s, w0); x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); unsigned short r = static_cast(~_mm_movemask_epi8(x)); if (r != 0) { // some of characters may be non-whitespace #ifdef _MSC_VER // Find the index of first non-whitespace unsigned long offset; _BitScanForward(&offset, r); return p + offset; #else return p + __builtin_ffs(r) - 1; #endif } } return SkipWhitespace(p, end); } #elif defined(RAPIDJSON_NEON) //! Skip whitespace with ARM Neon instructions, testing 16 8-byte characters at once. inline const char *SkipWhitespace_SIMD(const char* p) { // Fast return for single non-whitespace if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') ++p; else return p; // 16-byte align to the next boundary const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); while (p != nextAligned) if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') ++p; else return p; const uint8x16_t w0 = vmovq_n_u8(' '); const uint8x16_t w1 = vmovq_n_u8('\n'); const uint8x16_t w2 = vmovq_n_u8('\r'); const uint8x16_t w3 = vmovq_n_u8('\t'); for (;; p += 16) { const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); uint8x16_t x = vceqq_u8(s, w0); x = vorrq_u8(x, vceqq_u8(s, w1)); x = vorrq_u8(x, vceqq_u8(s, w2)); x = vorrq_u8(x, vceqq_u8(s, w3)); x = vmvnq_u8(x); // Negate x = vrev64q_u8(x); // Rev in 64 uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract if (low == 0) { if (high != 0) { uint32_t lz = internal::clzll(high); return p + 8 + (lz >> 3); } } else { uint32_t lz = internal::clzll(low); return p + (lz >> 3); } } } inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { // Fast return for single non-whitespace if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) ++p; else return p; const uint8x16_t w0 = vmovq_n_u8(' '); const uint8x16_t w1 = vmovq_n_u8('\n'); const uint8x16_t w2 = vmovq_n_u8('\r'); const uint8x16_t w3 = vmovq_n_u8('\t'); for (; p <= end - 16; p += 16) { const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); uint8x16_t x = vceqq_u8(s, w0); x = vorrq_u8(x, vceqq_u8(s, w1)); x = vorrq_u8(x, vceqq_u8(s, w2)); x = vorrq_u8(x, vceqq_u8(s, w3)); x = vmvnq_u8(x); // Negate x = vrev64q_u8(x); // Rev in 64 uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract if (low == 0) { if (high != 0) { uint32_t lz = internal::clzll(high); return p + 8 + (lz >> 3); } } else { uint32_t lz = internal::clzll(low); return p + (lz >> 3); } } return SkipWhitespace(p, end); } #endif // RAPIDJSON_NEON #ifdef RAPIDJSON_SIMD //! Template function specialization for InsituStringStream template<> inline void SkipWhitespace(InsituStringStream& is) { is.src_ = const_cast(SkipWhitespace_SIMD(is.src_)); } //! Template function specialization for StringStream template<> inline void SkipWhitespace(StringStream& is) { is.src_ = SkipWhitespace_SIMD(is.src_); } template<> inline void SkipWhitespace(EncodedInputStream, MemoryStream>& is) { is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_); } #endif // RAPIDJSON_SIMD /////////////////////////////////////////////////////////////////////////////// // GenericReader //! SAX-style JSON parser. Use \ref Reader for UTF8 encoding and default allocator. /*! GenericReader parses JSON text from a stream, and send events synchronously to an object implementing Handler concept. It needs to allocate a stack for storing a single decoded string during non-destructive parsing. For in-situ parsing, the decoded string is directly written to the source text string, no temporary buffer is required. A GenericReader object can be reused for parsing multiple JSON text. \tparam SourceEncoding Encoding of the input stream. \tparam TargetEncoding Encoding of the parse output. \tparam StackAllocator Allocator type for stack. */ template class GenericReader { public: typedef typename SourceEncoding::Ch Ch; //!< SourceEncoding character type //! Constructor. /*! \param stackAllocator Optional allocator for allocating stack memory. (Only use for non-destructive parsing) \param stackCapacity stack capacity in bytes for storing a single decoded string. (Only use for non-destructive parsing) */ GenericReader(StackAllocator* stackAllocator = 0, size_t stackCapacity = kDefaultStackCapacity) : stack_(stackAllocator, stackCapacity), parseResult_(), state_(IterativeParsingStartState) {} //! Parse JSON text. /*! \tparam parseFlags Combination of \ref ParseFlag. \tparam InputStream Type of input stream, implementing Stream concept. \tparam Handler Type of handler, implementing Handler concept. \param is Input stream to be parsed. \param handler The handler to receive events. \return Whether the parsing is successful. */ template ParseResult Parse(InputStream& is, Handler& handler) { if (parseFlags & kParseIterativeFlag) return IterativeParse(is, handler); parseResult_.Clear(); ClearStackOnExit scope(*this); SkipWhitespaceAndComments(is); RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) { RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentEmpty, is.Tell()); RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); } else { ParseValue(is, handler); RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); if (!(parseFlags & kParseStopWhenDoneFlag)) { SkipWhitespaceAndComments(is); RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); if (RAPIDJSON_UNLIKELY(is.Peek() != '\0')) { RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell()); RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); } } } return parseResult_; } //! Parse JSON text (with \ref kParseDefaultFlags) /*! \tparam InputStream Type of input stream, implementing Stream concept \tparam Handler Type of handler, implementing Handler concept. \param is Input stream to be parsed. \param handler The handler to receive events. \return Whether the parsing is successful. */ template ParseResult Parse(InputStream& is, Handler& handler) { return Parse(is, handler); } //! Initialize JSON text token-by-token parsing /*! */ void IterativeParseInit() { parseResult_.Clear(); state_ = IterativeParsingStartState; } //! Parse one token from JSON text /*! \tparam InputStream Type of input stream, implementing Stream concept \tparam Handler Type of handler, implementing Handler concept. \param is Input stream to be parsed. \param handler The handler to receive events. \return Whether the parsing is successful. */ template bool IterativeParseNext(InputStream& is, Handler& handler) { while (RAPIDJSON_LIKELY(is.Peek() != '\0')) { SkipWhitespaceAndComments(is); Token t = Tokenize(is.Peek()); IterativeParsingState n = Predict(state_, t); IterativeParsingState d = Transit(state_, t, n, is, handler); // If we've finished or hit an error... if (RAPIDJSON_UNLIKELY(IsIterativeParsingCompleteState(d))) { // Report errors. if (d == IterativeParsingErrorState) { HandleError(state_, is); return false; } // Transition to the finish state. RAPIDJSON_ASSERT(d == IterativeParsingFinishState); state_ = d; // If StopWhenDone is not set... if (!(parseFlags & kParseStopWhenDoneFlag)) { // ... and extra non-whitespace data is found... SkipWhitespaceAndComments(is); if (is.Peek() != '\0') { // ... this is considered an error. HandleError(state_, is); return false; } } // Success! We are done! return true; } // Transition to the new state. state_ = d; // If we parsed anything other than a delimiter, we invoked the handler, so we can return true now. if (!IsIterativeParsingDelimiterState(n)) return true; } // We reached the end of file. stack_.Clear(); if (state_ != IterativeParsingFinishState) { HandleError(state_, is); return false; } return true; } //! Check if token-by-token parsing JSON text is complete /*! \return Whether the JSON has been fully decoded. */ RAPIDJSON_FORCEINLINE bool IterativeParseComplete() const { return IsIterativeParsingCompleteState(state_); } //! Whether a parse error has occurred in the last parsing. bool HasParseError() const { return parseResult_.IsError(); } //! Get the \ref ParseErrorCode of last parsing. ParseErrorCode GetParseErrorCode() const { return parseResult_.Code(); } //! Get the position of last parsing error in input, 0 otherwise. size_t GetErrorOffset() const { return parseResult_.Offset(); } protected: void SetParseError(ParseErrorCode code, size_t offset) { parseResult_.Set(code, offset); } private: // Prohibit copy constructor & assignment operator. GenericReader(const GenericReader&); GenericReader& operator=(const GenericReader&); void ClearStack() { stack_.Clear(); } // clear stack on any exit from ParseStream, e.g. due to exception struct ClearStackOnExit { explicit ClearStackOnExit(GenericReader& r) : r_(r) {} ~ClearStackOnExit() { r_.ClearStack(); } private: GenericReader& r_; ClearStackOnExit(const ClearStackOnExit&); ClearStackOnExit& operator=(const ClearStackOnExit&); }; template void SkipWhitespaceAndComments(InputStream& is) { SkipWhitespace(is); if (parseFlags & kParseCommentsFlag) { while (RAPIDJSON_UNLIKELY(Consume(is, '/'))) { if (Consume(is, '*')) { while (true) { if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); else if (Consume(is, '*')) { if (Consume(is, '/')) break; } else is.Take(); } } else if (RAPIDJSON_LIKELY(Consume(is, '/'))) while (is.Peek() != '\0' && is.Take() != '\n') {} else RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); SkipWhitespace(is); } } } // Parse object: { string : value, ... } template void ParseObject(InputStream& is, Handler& handler) { RAPIDJSON_ASSERT(is.Peek() == '{'); is.Take(); // Skip '{' if (RAPIDJSON_UNLIKELY(!handler.StartObject())) RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); SkipWhitespaceAndComments(is); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; if (Consume(is, '}')) { if (RAPIDJSON_UNLIKELY(!handler.EndObject(0))) // empty object RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); return; } for (SizeType memberCount = 0;;) { if (RAPIDJSON_UNLIKELY(is.Peek() != '"')) RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); ParseString(is, handler, true); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; SkipWhitespaceAndComments(is); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; if (RAPIDJSON_UNLIKELY(!Consume(is, ':'))) RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); SkipWhitespaceAndComments(is); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; ParseValue(is, handler); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; SkipWhitespaceAndComments(is); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; ++memberCount; switch (is.Peek()) { case ',': is.Take(); SkipWhitespaceAndComments(is); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; break; case '}': is.Take(); if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); return; default: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); break; // This useless break is only for making warning and coverage happy } if (parseFlags & kParseTrailingCommasFlag) { if (is.Peek() == '}') { if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); is.Take(); return; } } } } // Parse array: [ value, ... ] template void ParseArray(InputStream& is, Handler& handler) { RAPIDJSON_ASSERT(is.Peek() == '['); is.Take(); // Skip '[' if (RAPIDJSON_UNLIKELY(!handler.StartArray())) RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); SkipWhitespaceAndComments(is); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; if (Consume(is, ']')) { if (RAPIDJSON_UNLIKELY(!handler.EndArray(0))) // empty array RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); return; } for (SizeType elementCount = 0;;) { ParseValue(is, handler); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; ++elementCount; SkipWhitespaceAndComments(is); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; if (Consume(is, ',')) { SkipWhitespaceAndComments(is); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; } else if (Consume(is, ']')) { if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); return; } else RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); if (parseFlags & kParseTrailingCommasFlag) { if (is.Peek() == ']') { if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); is.Take(); return; } } } } template void ParseNull(InputStream& is, Handler& handler) { RAPIDJSON_ASSERT(is.Peek() == 'n'); is.Take(); if (RAPIDJSON_LIKELY(Consume(is, 'u') && Consume(is, 'l') && Consume(is, 'l'))) { if (RAPIDJSON_UNLIKELY(!handler.Null())) RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); } else RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); } template void ParseTrue(InputStream& is, Handler& handler) { RAPIDJSON_ASSERT(is.Peek() == 't'); is.Take(); if (RAPIDJSON_LIKELY(Consume(is, 'r') && Consume(is, 'u') && Consume(is, 'e'))) { if (RAPIDJSON_UNLIKELY(!handler.Bool(true))) RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); } else RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); } template void ParseFalse(InputStream& is, Handler& handler) { RAPIDJSON_ASSERT(is.Peek() == 'f'); is.Take(); if (RAPIDJSON_LIKELY(Consume(is, 'a') && Consume(is, 'l') && Consume(is, 's') && Consume(is, 'e'))) { if (RAPIDJSON_UNLIKELY(!handler.Bool(false))) RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); } else RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); } template RAPIDJSON_FORCEINLINE static bool Consume(InputStream& is, typename InputStream::Ch expect) { if (RAPIDJSON_LIKELY(is.Peek() == expect)) { is.Take(); return true; } else return false; } // Helper function to parse four hexadecimal digits in \uXXXX in ParseString(). template unsigned ParseHex4(InputStream& is, size_t escapeOffset) { unsigned codepoint = 0; for (int i = 0; i < 4; i++) { Ch c = is.Peek(); codepoint <<= 4; codepoint += static_cast(c); if (c >= '0' && c <= '9') codepoint -= '0'; else if (c >= 'A' && c <= 'F') codepoint -= 'A' - 10; else if (c >= 'a' && c <= 'f') codepoint -= 'a' - 10; else { RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, escapeOffset); RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0); } is.Take(); } return codepoint; } template class StackStream { public: typedef CharType Ch; StackStream(internal::Stack& stack) : stack_(stack), length_(0) {} RAPIDJSON_FORCEINLINE void Put(Ch c) { *stack_.template Push() = c; ++length_; } RAPIDJSON_FORCEINLINE void* Push(SizeType count) { length_ += count; return stack_.template Push(count); } size_t Length() const { return length_; } Ch* Pop() { return stack_.template Pop(length_); } private: StackStream(const StackStream&); StackStream& operator=(const StackStream&); internal::Stack& stack_; SizeType length_; }; // Parse string and generate String event. Different code paths for kParseInsituFlag. template void ParseString(InputStream& is, Handler& handler, bool isKey = false) { internal::StreamLocalCopy copy(is); InputStream& s(copy.s); RAPIDJSON_ASSERT(s.Peek() == '\"'); s.Take(); // Skip '\"' bool success = false; if (parseFlags & kParseInsituFlag) { typename InputStream::Ch *head = s.PutBegin(); ParseStringToStream(s, s); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; size_t length = s.PutEnd(head) - 1; RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); const typename TargetEncoding::Ch* const str = reinterpret_cast(head); success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false)); } else { StackStream stackStream(stack_); ParseStringToStream(s, stackStream); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; SizeType length = static_cast(stackStream.Length()) - 1; const typename TargetEncoding::Ch* const str = stackStream.Pop(); success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true)); } if (RAPIDJSON_UNLIKELY(!success)) RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); } // Parse string to an output is // This function handles the prefix/suffix double quotes, escaping, and optional encoding validation. template RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream& is, OutputStream& os) { //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN #define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 static const char escape[256] = { Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '/', Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, 0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0, 0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 }; #undef Z16 //!@endcond for (;;) { // Scan and copy string before "\\\"" or < 0x20. This is an optional optimzation. if (!(parseFlags & kParseValidateEncodingFlag)) ScanCopyUnescapedString(is, os); Ch c = is.Peek(); if (RAPIDJSON_UNLIKELY(c == '\\')) { // Escape size_t escapeOffset = is.Tell(); // For invalid escaping, report the initial '\\' as error offset is.Take(); Ch e = is.Peek(); if ((sizeof(Ch) == 1 || unsigned(e) < 256) && RAPIDJSON_LIKELY(escape[static_cast(e)])) { is.Take(); os.Put(static_cast(escape[static_cast(e)])); } else if ((parseFlags & kParseEscapedApostropheFlag) && RAPIDJSON_LIKELY(e == '\'')) { // Allow escaped apostrophe is.Take(); os.Put('\''); } else if (RAPIDJSON_LIKELY(e == 'u')) { // Unicode is.Take(); unsigned codepoint = ParseHex4(is, escapeOffset); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; if (RAPIDJSON_UNLIKELY(codepoint >= 0xD800 && codepoint <= 0xDFFF)) { // high surrogate, check if followed by valid low surrogate if (RAPIDJSON_LIKELY(codepoint <= 0xDBFF)) { // Handle UTF-16 surrogate pair if (RAPIDJSON_UNLIKELY(!Consume(is, '\\') || !Consume(is, 'u'))) RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); unsigned codepoint2 = ParseHex4(is, escapeOffset); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; if (RAPIDJSON_UNLIKELY(codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)) RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000; } // single low surrogate else { RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); } } TEncoding::Encode(os, codepoint); } else RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, escapeOffset); } else if (RAPIDJSON_UNLIKELY(c == '"')) { // Closing double quote is.Take(); os.Put('\0'); // null-terminate the string return; } else if (RAPIDJSON_UNLIKELY(static_cast(c) < 0x20)) { // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF if (c == '\0') RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell()); else RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, is.Tell()); } else { size_t offset = is.Tell(); if (RAPIDJSON_UNLIKELY((parseFlags & kParseValidateEncodingFlag ? !Transcoder::Validate(is, os) : !Transcoder::Transcode(is, os)))) RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, offset); } } } template static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InputStream&, OutputStream&) { // Do nothing for generic version } #if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) // StringStream -> StackStream static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { const char* p = is.src_; // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); while (p != nextAligned) if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { is.src_ = p; return; } else os.Put(*p++); // The rest of string using SIMD static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); for (;; p += 16) { const __m128i s = _mm_load_si128(reinterpret_cast(p)); const __m128i t1 = _mm_cmpeq_epi8(s, dq); const __m128i t2 = _mm_cmpeq_epi8(s, bs); const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); unsigned short r = static_cast(_mm_movemask_epi8(x)); if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped SizeType length; #ifdef _MSC_VER // Find the index of first escaped unsigned long offset; _BitScanForward(&offset, r); length = offset; #else length = static_cast(__builtin_ffs(r) - 1); #endif if (length != 0) { char* q = reinterpret_cast(os.Push(length)); for (size_t i = 0; i < length; i++) q[i] = p[i]; p += length; } break; } _mm_storeu_si128(reinterpret_cast<__m128i *>(os.Push(16)), s); } is.src_ = p; } // InsituStringStream -> InsituStringStream static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { RAPIDJSON_ASSERT(&is == &os); (void)os; if (is.src_ == is.dst_) { SkipUnescapedString(is); return; } char* p = is.src_; char *q = is.dst_; // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); while (p != nextAligned) if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { is.src_ = p; is.dst_ = q; return; } else *q++ = *p++; // The rest of string using SIMD static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); for (;; p += 16, q += 16) { const __m128i s = _mm_load_si128(reinterpret_cast(p)); const __m128i t1 = _mm_cmpeq_epi8(s, dq); const __m128i t2 = _mm_cmpeq_epi8(s, bs); const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); unsigned short r = static_cast(_mm_movemask_epi8(x)); if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped size_t length; #ifdef _MSC_VER // Find the index of first escaped unsigned long offset; _BitScanForward(&offset, r); length = offset; #else length = static_cast(__builtin_ffs(r) - 1); #endif for (const char* pend = p + length; p != pend; ) *q++ = *p++; break; } _mm_storeu_si128(reinterpret_cast<__m128i *>(q), s); } is.src_ = p; is.dst_ = q; } // When read/write pointers are the same for insitu stream, just skip unescaped characters static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { RAPIDJSON_ASSERT(is.src_ == is.dst_); char* p = is.src_; // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); for (; p != nextAligned; p++) if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { is.src_ = is.dst_ = p; return; } // The rest of string using SIMD static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); for (;; p += 16) { const __m128i s = _mm_load_si128(reinterpret_cast(p)); const __m128i t1 = _mm_cmpeq_epi8(s, dq); const __m128i t2 = _mm_cmpeq_epi8(s, bs); const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); unsigned short r = static_cast(_mm_movemask_epi8(x)); if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped size_t length; #ifdef _MSC_VER // Find the index of first escaped unsigned long offset; _BitScanForward(&offset, r); length = offset; #else length = static_cast(__builtin_ffs(r) - 1); #endif p += length; break; } } is.src_ = is.dst_ = p; } #elif defined(RAPIDJSON_NEON) // StringStream -> StackStream static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { const char* p = is.src_; // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); while (p != nextAligned) if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { is.src_ = p; return; } else os.Put(*p++); // The rest of string using SIMD const uint8x16_t s0 = vmovq_n_u8('"'); const uint8x16_t s1 = vmovq_n_u8('\\'); const uint8x16_t s2 = vmovq_n_u8('\b'); const uint8x16_t s3 = vmovq_n_u8(32); for (;; p += 16) { const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); uint8x16_t x = vceqq_u8(s, s0); x = vorrq_u8(x, vceqq_u8(s, s1)); x = vorrq_u8(x, vceqq_u8(s, s2)); x = vorrq_u8(x, vcltq_u8(s, s3)); x = vrev64q_u8(x); // Rev in 64 uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract SizeType length = 0; bool escaped = false; if (low == 0) { if (high != 0) { uint32_t lz = internal::clzll(high); length = 8 + (lz >> 3); escaped = true; } } else { uint32_t lz = internal::clzll(low); length = lz >> 3; escaped = true; } if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped if (length != 0) { char* q = reinterpret_cast(os.Push(length)); for (size_t i = 0; i < length; i++) q[i] = p[i]; p += length; } break; } vst1q_u8(reinterpret_cast(os.Push(16)), s); } is.src_ = p; } // InsituStringStream -> InsituStringStream static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { RAPIDJSON_ASSERT(&is == &os); (void)os; if (is.src_ == is.dst_) { SkipUnescapedString(is); return; } char* p = is.src_; char *q = is.dst_; // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); while (p != nextAligned) if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { is.src_ = p; is.dst_ = q; return; } else *q++ = *p++; // The rest of string using SIMD const uint8x16_t s0 = vmovq_n_u8('"'); const uint8x16_t s1 = vmovq_n_u8('\\'); const uint8x16_t s2 = vmovq_n_u8('\b'); const uint8x16_t s3 = vmovq_n_u8(32); for (;; p += 16, q += 16) { const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); uint8x16_t x = vceqq_u8(s, s0); x = vorrq_u8(x, vceqq_u8(s, s1)); x = vorrq_u8(x, vceqq_u8(s, s2)); x = vorrq_u8(x, vcltq_u8(s, s3)); x = vrev64q_u8(x); // Rev in 64 uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract SizeType length = 0; bool escaped = false; if (low == 0) { if (high != 0) { uint32_t lz = internal::clzll(high); length = 8 + (lz >> 3); escaped = true; } } else { uint32_t lz = internal::clzll(low); length = lz >> 3; escaped = true; } if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped for (const char* pend = p + length; p != pend; ) { *q++ = *p++; } break; } vst1q_u8(reinterpret_cast(q), s); } is.src_ = p; is.dst_ = q; } // When read/write pointers are the same for insitu stream, just skip unescaped characters static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { RAPIDJSON_ASSERT(is.src_ == is.dst_); char* p = is.src_; // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); for (; p != nextAligned; p++) if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { is.src_ = is.dst_ = p; return; } // The rest of string using SIMD const uint8x16_t s0 = vmovq_n_u8('"'); const uint8x16_t s1 = vmovq_n_u8('\\'); const uint8x16_t s2 = vmovq_n_u8('\b'); const uint8x16_t s3 = vmovq_n_u8(32); for (;; p += 16) { const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); uint8x16_t x = vceqq_u8(s, s0); x = vorrq_u8(x, vceqq_u8(s, s1)); x = vorrq_u8(x, vceqq_u8(s, s2)); x = vorrq_u8(x, vcltq_u8(s, s3)); x = vrev64q_u8(x); // Rev in 64 uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract if (low == 0) { if (high != 0) { uint32_t lz = internal::clzll(high); p += 8 + (lz >> 3); break; } } else { uint32_t lz = internal::clzll(low); p += lz >> 3; break; } } is.src_ = is.dst_ = p; } #endif // RAPIDJSON_NEON template class NumberStream; template class NumberStream { public: typedef typename InputStream::Ch Ch; NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader; } RAPIDJSON_FORCEINLINE Ch Peek() const { return is.Peek(); } RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); } RAPIDJSON_FORCEINLINE Ch Take() { return is.Take(); } RAPIDJSON_FORCEINLINE void Push(char) {} size_t Tell() { return is.Tell(); } size_t Length() { return 0; } const StackCharacter* Pop() { return 0; } protected: NumberStream& operator=(const NumberStream&); InputStream& is; }; template class NumberStream : public NumberStream { typedef NumberStream Base; public: NumberStream(GenericReader& reader, InputStream& s) : Base(reader, s), stackStream(reader.stack_) {} RAPIDJSON_FORCEINLINE Ch TakePush() { stackStream.Put(static_cast(Base::is.Peek())); return Base::is.Take(); } RAPIDJSON_FORCEINLINE void Push(StackCharacter c) { stackStream.Put(c); } size_t Length() { return stackStream.Length(); } const StackCharacter* Pop() { stackStream.Put('\0'); return stackStream.Pop(); } private: StackStream stackStream; }; template class NumberStream : public NumberStream { typedef NumberStream Base; public: NumberStream(GenericReader& reader, InputStream& s) : Base(reader, s) {} RAPIDJSON_FORCEINLINE Ch Take() { return Base::TakePush(); } }; template void ParseNumber(InputStream& is, Handler& handler) { typedef typename internal::SelectIf, typename TargetEncoding::Ch, char>::Type NumberCharacter; internal::StreamLocalCopy copy(is); NumberStream s(*this, copy.s); size_t startOffset = s.Tell(); double d = 0.0; bool useNanOrInf = false; // Parse minus bool minus = Consume(s, '-'); // Parse int: zero / ( digit1-9 *DIGIT ) unsigned i = 0; uint64_t i64 = 0; bool use64bit = false; int significandDigit = 0; if (RAPIDJSON_UNLIKELY(s.Peek() == '0')) { i = 0; s.TakePush(); } else if (RAPIDJSON_LIKELY(s.Peek() >= '1' && s.Peek() <= '9')) { i = static_cast(s.TakePush() - '0'); if (minus) while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { if (RAPIDJSON_UNLIKELY(i >= 214748364)) { // 2^31 = 2147483648 if (RAPIDJSON_LIKELY(i != 214748364 || s.Peek() > '8')) { i64 = i; use64bit = true; break; } } i = i * 10 + static_cast(s.TakePush() - '0'); significandDigit++; } else while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { if (RAPIDJSON_UNLIKELY(i >= 429496729)) { // 2^32 - 1 = 4294967295 if (RAPIDJSON_LIKELY(i != 429496729 || s.Peek() > '5')) { i64 = i; use64bit = true; break; } } i = i * 10 + static_cast(s.TakePush() - '0'); significandDigit++; } } // Parse NaN or Infinity here else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) { if (Consume(s, 'N')) { if (Consume(s, 'a') && Consume(s, 'N')) { d = std::numeric_limits::quiet_NaN(); useNanOrInf = true; } } else if (RAPIDJSON_LIKELY(Consume(s, 'I'))) { if (Consume(s, 'n') && Consume(s, 'f')) { d = (minus ? -std::numeric_limits::infinity() : std::numeric_limits::infinity()); useNanOrInf = true; if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n') && Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) { RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); } } } if (RAPIDJSON_UNLIKELY(!useNanOrInf)) { RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); } } else RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); // Parse 64bit int bool useDouble = false; if (use64bit) { if (minus) while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC))) // 2^63 = 9223372036854775808 if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8')) { d = static_cast(i64); useDouble = true; break; } i64 = i64 * 10 + static_cast(s.TakePush() - '0'); significandDigit++; } else while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999))) // 2^64 - 1 = 18446744073709551615 if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5')) { d = static_cast(i64); useDouble = true; break; } i64 = i64 * 10 + static_cast(s.TakePush() - '0'); significandDigit++; } } // Force double for big integer if (useDouble) { while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { d = d * 10 + (s.TakePush() - '0'); } } // Parse frac = decimal-point 1*DIGIT int expFrac = 0; size_t decimalPosition; if (Consume(s, '.')) { decimalPosition = s.Length(); if (RAPIDJSON_UNLIKELY(!(s.Peek() >= '0' && s.Peek() <= '9'))) RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell()); if (!useDouble) { #if RAPIDJSON_64BIT // Use i64 to store significand in 64-bit architecture if (!use64bit) i64 = i; while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { if (i64 > RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path break; else { i64 = i64 * 10 + static_cast(s.TakePush() - '0'); --expFrac; if (i64 != 0) significandDigit++; } } d = static_cast(i64); #else // Use double to store significand in 32-bit architecture d = static_cast(use64bit ? i64 : i); #endif useDouble = true; } while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { if (significandDigit < 17) { d = d * 10.0 + (s.TakePush() - '0'); --expFrac; if (RAPIDJSON_LIKELY(d > 0.0)) significandDigit++; } else s.TakePush(); } } else decimalPosition = s.Length(); // decimal position at the end of integer. // Parse exp = e [ minus / plus ] 1*DIGIT int exp = 0; if (Consume(s, 'e') || Consume(s, 'E')) { if (!useDouble) { d = static_cast(use64bit ? i64 : i); useDouble = true; } bool expMinus = false; if (Consume(s, '+')) ; else if (Consume(s, '-')) expMinus = true; if (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { exp = static_cast(s.Take() - '0'); if (expMinus) { // (exp + expFrac) must not underflow int => we're detecting when -exp gets // dangerously close to INT_MIN (a pessimistic next digit 9 would push it into // underflow territory): // // -(exp * 10 + 9) + expFrac >= INT_MIN // <=> exp <= (expFrac - INT_MIN - 9) / 10 RAPIDJSON_ASSERT(expFrac <= 0); int maxExp = (expFrac + 2147483639) / 10; while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { exp = exp * 10 + static_cast(s.Take() - '0'); if (RAPIDJSON_UNLIKELY(exp > maxExp)) { while (RAPIDJSON_UNLIKELY(s.Peek() >= '0' && s.Peek() <= '9')) // Consume the rest of exponent s.Take(); } } } else { // positive exp int maxExp = 308 - expFrac; while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { exp = exp * 10 + static_cast(s.Take() - '0'); if (RAPIDJSON_UNLIKELY(exp > maxExp)) RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); } } } else RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell()); if (expMinus) exp = -exp; } // Finish parsing, call event according to the type of number. bool cont = true; if (parseFlags & kParseNumbersAsStringsFlag) { if (parseFlags & kParseInsituFlag) { s.Pop(); // Pop stack no matter if it will be used or not. typename InputStream::Ch* head = is.PutBegin(); const size_t length = s.Tell() - startOffset; RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); // unable to insert the \0 character here, it will erase the comma after this number const typename TargetEncoding::Ch* const str = reinterpret_cast(head); cont = handler.RawNumber(str, SizeType(length), false); } else { SizeType numCharsToCopy = static_cast(s.Length()); GenericStringStream > srcStream(s.Pop()); StackStream dstStream(stack_); while (numCharsToCopy--) { Transcoder, TargetEncoding>::Transcode(srcStream, dstStream); } dstStream.Put('\0'); const typename TargetEncoding::Ch* str = dstStream.Pop(); const SizeType length = static_cast(dstStream.Length()) - 1; cont = handler.RawNumber(str, SizeType(length), true); } } else { size_t length = s.Length(); const NumberCharacter* decimal = s.Pop(); // Pop stack no matter if it will be used or not. if (useDouble) { int p = exp + expFrac; if (parseFlags & kParseFullPrecisionFlag) d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp); else d = internal::StrtodNormalPrecision(d, p); // Use > max, instead of == inf, to fix bogus warning -Wfloat-equal if (d > (std::numeric_limits::max)()) { // Overflow // TODO: internal::StrtodX should report overflow (or underflow) RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); } cont = handler.Double(minus ? -d : d); } else if (useNanOrInf) { cont = handler.Double(d); } else { if (use64bit) { if (minus) cont = handler.Int64(static_cast(~i64 + 1)); else cont = handler.Uint64(i64); } else { if (minus) cont = handler.Int(static_cast(~i + 1)); else cont = handler.Uint(i); } } } if (RAPIDJSON_UNLIKELY(!cont)) RAPIDJSON_PARSE_ERROR(kParseErrorTermination, startOffset); } // Parse any JSON value template void ParseValue(InputStream& is, Handler& handler) { switch (is.Peek()) { case 'n': ParseNull (is, handler); break; case 't': ParseTrue (is, handler); break; case 'f': ParseFalse (is, handler); break; case '"': ParseString(is, handler); break; case '{': ParseObject(is, handler); break; case '[': ParseArray (is, handler); break; default : ParseNumber(is, handler); break; } } // Iterative Parsing // States enum IterativeParsingState { IterativeParsingFinishState = 0, // sink states at top IterativeParsingErrorState, // sink states at top IterativeParsingStartState, // Object states IterativeParsingObjectInitialState, IterativeParsingMemberKeyState, IterativeParsingMemberValueState, IterativeParsingObjectFinishState, // Array states IterativeParsingArrayInitialState, IterativeParsingElementState, IterativeParsingArrayFinishState, // Single value state IterativeParsingValueState, // Delimiter states (at bottom) IterativeParsingElementDelimiterState, IterativeParsingMemberDelimiterState, IterativeParsingKeyValueDelimiterState, cIterativeParsingStateCount }; // Tokens enum Token { LeftBracketToken = 0, RightBracketToken, LeftCurlyBracketToken, RightCurlyBracketToken, CommaToken, ColonToken, StringToken, FalseToken, TrueToken, NullToken, NumberToken, kTokenCount }; RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) const { //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN #define N NumberToken #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N // Maps from ASCII to Token static const unsigned char tokenMap[256] = { N16, // 00~0F N16, // 10~1F N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F N16, // 40~4F N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF }; #undef N #undef N16 //!@endcond if (sizeof(Ch) == 1 || static_cast(c) < 256) return static_cast(tokenMap[static_cast(c)]); else return NumberToken; } RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) const { // current state x one lookahead token -> new state static const char G[cIterativeParsingStateCount][kTokenCount] = { // Finish(sink state) { IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState }, // Error(sink state) { IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState }, // Start { IterativeParsingArrayInitialState, // Left bracket IterativeParsingErrorState, // Right bracket IterativeParsingObjectInitialState, // Left curly bracket IterativeParsingErrorState, // Right curly bracket IterativeParsingErrorState, // Comma IterativeParsingErrorState, // Colon IterativeParsingValueState, // String IterativeParsingValueState, // False IterativeParsingValueState, // True IterativeParsingValueState, // Null IterativeParsingValueState // Number }, // ObjectInitial { IterativeParsingErrorState, // Left bracket IterativeParsingErrorState, // Right bracket IterativeParsingErrorState, // Left curly bracket IterativeParsingObjectFinishState, // Right curly bracket IterativeParsingErrorState, // Comma IterativeParsingErrorState, // Colon IterativeParsingMemberKeyState, // String IterativeParsingErrorState, // False IterativeParsingErrorState, // True IterativeParsingErrorState, // Null IterativeParsingErrorState // Number }, // MemberKey { IterativeParsingErrorState, // Left bracket IterativeParsingErrorState, // Right bracket IterativeParsingErrorState, // Left curly bracket IterativeParsingErrorState, // Right curly bracket IterativeParsingErrorState, // Comma IterativeParsingKeyValueDelimiterState, // Colon IterativeParsingErrorState, // String IterativeParsingErrorState, // False IterativeParsingErrorState, // True IterativeParsingErrorState, // Null IterativeParsingErrorState // Number }, // MemberValue { IterativeParsingErrorState, // Left bracket IterativeParsingErrorState, // Right bracket IterativeParsingErrorState, // Left curly bracket IterativeParsingObjectFinishState, // Right curly bracket IterativeParsingMemberDelimiterState, // Comma IterativeParsingErrorState, // Colon IterativeParsingErrorState, // String IterativeParsingErrorState, // False IterativeParsingErrorState, // True IterativeParsingErrorState, // Null IterativeParsingErrorState // Number }, // ObjectFinish(sink state) { IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState }, // ArrayInitial { IterativeParsingArrayInitialState, // Left bracket(push Element state) IterativeParsingArrayFinishState, // Right bracket IterativeParsingObjectInitialState, // Left curly bracket(push Element state) IterativeParsingErrorState, // Right curly bracket IterativeParsingErrorState, // Comma IterativeParsingErrorState, // Colon IterativeParsingElementState, // String IterativeParsingElementState, // False IterativeParsingElementState, // True IterativeParsingElementState, // Null IterativeParsingElementState // Number }, // Element { IterativeParsingErrorState, // Left bracket IterativeParsingArrayFinishState, // Right bracket IterativeParsingErrorState, // Left curly bracket IterativeParsingErrorState, // Right curly bracket IterativeParsingElementDelimiterState, // Comma IterativeParsingErrorState, // Colon IterativeParsingErrorState, // String IterativeParsingErrorState, // False IterativeParsingErrorState, // True IterativeParsingErrorState, // Null IterativeParsingErrorState // Number }, // ArrayFinish(sink state) { IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState }, // Single Value (sink state) { IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState }, // ElementDelimiter { IterativeParsingArrayInitialState, // Left bracket(push Element state) IterativeParsingArrayFinishState, // Right bracket IterativeParsingObjectInitialState, // Left curly bracket(push Element state) IterativeParsingErrorState, // Right curly bracket IterativeParsingErrorState, // Comma IterativeParsingErrorState, // Colon IterativeParsingElementState, // String IterativeParsingElementState, // False IterativeParsingElementState, // True IterativeParsingElementState, // Null IterativeParsingElementState // Number }, // MemberDelimiter { IterativeParsingErrorState, // Left bracket IterativeParsingErrorState, // Right bracket IterativeParsingErrorState, // Left curly bracket IterativeParsingObjectFinishState, // Right curly bracket IterativeParsingErrorState, // Comma IterativeParsingErrorState, // Colon IterativeParsingMemberKeyState, // String IterativeParsingErrorState, // False IterativeParsingErrorState, // True IterativeParsingErrorState, // Null IterativeParsingErrorState // Number }, // KeyValueDelimiter { IterativeParsingArrayInitialState, // Left bracket(push MemberValue state) IterativeParsingErrorState, // Right bracket IterativeParsingObjectInitialState, // Left curly bracket(push MemberValue state) IterativeParsingErrorState, // Right curly bracket IterativeParsingErrorState, // Comma IterativeParsingErrorState, // Colon IterativeParsingMemberValueState, // String IterativeParsingMemberValueState, // False IterativeParsingMemberValueState, // True IterativeParsingMemberValueState, // Null IterativeParsingMemberValueState // Number }, }; // End of G return static_cast(G[state][token]); } // Make an advance in the token stream and state based on the candidate destination state which was returned by Transit(). // May return a new state on state pop. template RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) { (void)token; switch (dst) { case IterativeParsingErrorState: return dst; case IterativeParsingObjectInitialState: case IterativeParsingArrayInitialState: { // Push the state(Element or MemeberValue) if we are nested in another array or value of member. // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop. IterativeParsingState n = src; if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState) n = IterativeParsingElementState; else if (src == IterativeParsingKeyValueDelimiterState) n = IterativeParsingMemberValueState; // Push current state. *stack_.template Push(1) = n; // Initialize and push the member/element count. *stack_.template Push(1) = 0; // Call handler bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray(); // On handler short circuits the parsing. if (!hr) { RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); return IterativeParsingErrorState; } else { is.Take(); return dst; } } case IterativeParsingMemberKeyState: ParseString(is, handler, true); if (HasParseError()) return IterativeParsingErrorState; else return dst; case IterativeParsingKeyValueDelimiterState: RAPIDJSON_ASSERT(token == ColonToken); is.Take(); return dst; case IterativeParsingMemberValueState: // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. ParseValue(is, handler); if (HasParseError()) { return IterativeParsingErrorState; } return dst; case IterativeParsingElementState: // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. ParseValue(is, handler); if (HasParseError()) { return IterativeParsingErrorState; } return dst; case IterativeParsingMemberDelimiterState: case IterativeParsingElementDelimiterState: is.Take(); // Update member/element count. *stack_.template Top() = *stack_.template Top() + 1; return dst; case IterativeParsingObjectFinishState: { // Transit from delimiter is only allowed when trailing commas are enabled if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingMemberDelimiterState) { RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissName, is.Tell()); return IterativeParsingErrorState; } // Get member count. SizeType c = *stack_.template Pop(1); // If the object is not empty, count the last member. if (src == IterativeParsingMemberValueState) ++c; // Restore the state. IterativeParsingState n = static_cast(*stack_.template Pop(1)); // Transit to Finish state if this is the topmost scope. if (n == IterativeParsingStartState) n = IterativeParsingFinishState; // Call handler bool hr = handler.EndObject(c); // On handler short circuits the parsing. if (!hr) { RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); return IterativeParsingErrorState; } else { is.Take(); return n; } } case IterativeParsingArrayFinishState: { // Transit from delimiter is only allowed when trailing commas are enabled if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingElementDelimiterState) { RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorValueInvalid, is.Tell()); return IterativeParsingErrorState; } // Get element count. SizeType c = *stack_.template Pop(1); // If the array is not empty, count the last element. if (src == IterativeParsingElementState) ++c; // Restore the state. IterativeParsingState n = static_cast(*stack_.template Pop(1)); // Transit to Finish state if this is the topmost scope. if (n == IterativeParsingStartState) n = IterativeParsingFinishState; // Call handler bool hr = handler.EndArray(c); // On handler short circuits the parsing. if (!hr) { RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); return IterativeParsingErrorState; } else { is.Take(); return n; } } default: // This branch is for IterativeParsingValueState actually. // Use `default:` rather than // `case IterativeParsingValueState:` is for code coverage. // The IterativeParsingStartState is not enumerated in this switch-case. // It is impossible for that case. And it can be caught by following assertion. // The IterativeParsingFinishState is not enumerated in this switch-case either. // It is a "derivative" state which cannot triggered from Predict() directly. // Therefore it cannot happen here. And it can be caught by following assertion. RAPIDJSON_ASSERT(dst == IterativeParsingValueState); // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. ParseValue(is, handler); if (HasParseError()) { return IterativeParsingErrorState; } return IterativeParsingFinishState; } } template void HandleError(IterativeParsingState src, InputStream& is) { if (HasParseError()) { // Error flag has been set. return; } switch (src) { case IterativeParsingStartState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); return; case IterativeParsingFinishState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); return; case IterativeParsingObjectInitialState: case IterativeParsingMemberDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); return; case IterativeParsingMemberKeyState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); return; case IterativeParsingMemberValueState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); return; case IterativeParsingKeyValueDelimiterState: case IterativeParsingArrayInitialState: case IterativeParsingElementDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); return; default: RAPIDJSON_ASSERT(src == IterativeParsingElementState); RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); return; } } RAPIDJSON_FORCEINLINE bool IsIterativeParsingDelimiterState(IterativeParsingState s) const { return s >= IterativeParsingElementDelimiterState; } RAPIDJSON_FORCEINLINE bool IsIterativeParsingCompleteState(IterativeParsingState s) const { return s <= IterativeParsingErrorState; } template ParseResult IterativeParse(InputStream& is, Handler& handler) { parseResult_.Clear(); ClearStackOnExit scope(*this); IterativeParsingState state = IterativeParsingStartState; SkipWhitespaceAndComments(is); RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); while (is.Peek() != '\0') { Token t = Tokenize(is.Peek()); IterativeParsingState n = Predict(state, t); IterativeParsingState d = Transit(state, t, n, is, handler); if (d == IterativeParsingErrorState) { HandleError(state, is); break; } state = d; // Do not further consume streams if a root JSON has been parsed. if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) break; SkipWhitespaceAndComments(is); RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); } // Handle the end of file. if (state != IterativeParsingFinishState) HandleError(state, is); return parseResult_; } static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string. internal::Stack stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing. ParseResult parseResult_; IterativeParsingState state_; }; // class GenericReader //! Reader with UTF8 encoding and default allocator. typedef GenericReader, UTF8<> > Reader; RAPIDJSON_NAMESPACE_END #if defined(__clang__) || defined(_MSC_VER) RAPIDJSON_DIAG_POP #endif #ifdef __GNUC__ RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_READER_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/istreamwrapper.h0000644000000000000000000000772315031566105026554 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_ISTREAMWRAPPER_H_ #define RAPIDJSON_ISTREAMWRAPPER_H_ #include "stream.h" #include #include #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(padded) #elif defined(_MSC_VER) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(4351) // new behavior: elements of array 'array' will be default initialized #endif RAPIDJSON_NAMESPACE_BEGIN //! Wrapper of \c std::basic_istream into RapidJSON's Stream concept. /*! The classes can be wrapped including but not limited to: - \c std::istringstream - \c std::stringstream - \c std::wistringstream - \c std::wstringstream - \c std::ifstream - \c std::fstream - \c std::wifstream - \c std::wfstream \tparam StreamType Class derived from \c std::basic_istream. */ template class BasicIStreamWrapper { public: typedef typename StreamType::char_type Ch; //! Constructor. /*! \param stream stream opened for read. */ BasicIStreamWrapper(StreamType &stream) : stream_(stream), buffer_(peekBuffer_), bufferSize_(4), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { Read(); } //! Constructor. /*! \param stream stream opened for read. \param buffer user-supplied buffer. \param bufferSize size of buffer in bytes. Must >=4 bytes. */ BasicIStreamWrapper(StreamType &stream, char* buffer, size_t bufferSize) : stream_(stream), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { RAPIDJSON_ASSERT(bufferSize >= 4); Read(); } Ch Peek() const { return *current_; } Ch Take() { Ch c = *current_; Read(); return c; } size_t Tell() const { return count_ + static_cast(current_ - buffer_); } // Not implemented void Put(Ch) { RAPIDJSON_ASSERT(false); } void Flush() { RAPIDJSON_ASSERT(false); } Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } // For encoding detection only. const Ch* Peek4() const { return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0; } private: BasicIStreamWrapper(); BasicIStreamWrapper(const BasicIStreamWrapper&); BasicIStreamWrapper& operator=(const BasicIStreamWrapper&); void Read() { if (current_ < bufferLast_) ++current_; else if (!eof_) { count_ += readCount_; readCount_ = bufferSize_; bufferLast_ = buffer_ + readCount_ - 1; current_ = buffer_; if (!stream_.read(buffer_, static_cast(bufferSize_))) { readCount_ = static_cast(stream_.gcount()); *(bufferLast_ = buffer_ + readCount_) = '\0'; eof_ = true; } } } StreamType &stream_; Ch peekBuffer_[4], *buffer_; size_t bufferSize_; Ch *bufferLast_; Ch *current_; size_t readCount_; size_t count_; //!< Number of characters read bool eof_; }; typedef BasicIStreamWrapper IStreamWrapper; typedef BasicIStreamWrapper WIStreamWrapper; #if defined(__clang__) || defined(_MSC_VER) RAPIDJSON_DIAG_POP #endif RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_ISTREAMWRAPPER_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/writer.h0000644000000000000000000006430115031566105025016 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_WRITER_H_ #define RAPIDJSON_WRITER_H_ #include "stream.h" #include "internal/clzll.h" #include "internal/meta.h" #include "internal/stack.h" #include "internal/strfunc.h" #include "internal/dtoa.h" #include "internal/itoa.h" #include "stringbuffer.h" #include // placement new #if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) #include #pragma intrinsic(_BitScanForward) #endif #ifdef RAPIDJSON_SSE42 #include #elif defined(RAPIDJSON_SSE2) #include #elif defined(RAPIDJSON_NEON) #include #endif #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(padded) RAPIDJSON_DIAG_OFF(unreachable-code) RAPIDJSON_DIAG_OFF(c++98-compat) #elif defined(_MSC_VER) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant #endif RAPIDJSON_NAMESPACE_BEGIN /////////////////////////////////////////////////////////////////////////////// // WriteFlag /*! \def RAPIDJSON_WRITE_DEFAULT_FLAGS \ingroup RAPIDJSON_CONFIG \brief User-defined kWriteDefaultFlags definition. User can define this as any \c WriteFlag combinations. */ #ifndef RAPIDJSON_WRITE_DEFAULT_FLAGS #define RAPIDJSON_WRITE_DEFAULT_FLAGS kWriteNoFlags #endif //! Combination of writeFlags enum WriteFlag { kWriteNoFlags = 0, //!< No flags are set. kWriteValidateEncodingFlag = 1, //!< Validate encoding of JSON strings. kWriteNanAndInfFlag = 2, //!< Allow writing of Infinity, -Infinity and NaN. kWriteDefaultFlags = RAPIDJSON_WRITE_DEFAULT_FLAGS //!< Default write flags. Can be customized by defining RAPIDJSON_WRITE_DEFAULT_FLAGS }; //! JSON writer /*! Writer implements the concept Handler. It generates JSON text by events to an output os. User may programmatically calls the functions of a writer to generate JSON text. On the other side, a writer can also be passed to objects that generates events, for example Reader::Parse() and Document::Accept(). \tparam OutputStream Type of output stream. \tparam SourceEncoding Encoding of source string. \tparam TargetEncoding Encoding of output stream. \tparam StackAllocator Type of allocator for allocating memory of stack. \note implements Handler concept */ template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> class Writer { public: typedef typename SourceEncoding::Ch Ch; static const int kDefaultMaxDecimalPlaces = 324; //! Constructor /*! \param os Output stream. \param stackAllocator User supplied allocator. If it is null, it will create a private one. \param levelDepth Initial capacity of stack. */ explicit Writer(OutputStream& os, StackAllocator* stackAllocator = 0, size_t levelDepth = kDefaultLevelDepth) : os_(&os), level_stack_(stackAllocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} explicit Writer(StackAllocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) : os_(0), level_stack_(allocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} #if RAPIDJSON_HAS_CXX11_RVALUE_REFS Writer(Writer&& rhs) : os_(rhs.os_), level_stack_(std::move(rhs.level_stack_)), maxDecimalPlaces_(rhs.maxDecimalPlaces_), hasRoot_(rhs.hasRoot_) { rhs.os_ = 0; } #endif //! Reset the writer with a new stream. /*! This function reset the writer with a new stream and default settings, in order to make a Writer object reusable for output multiple JSONs. \param os New output stream. \code Writer writer(os1); writer.StartObject(); // ... writer.EndObject(); writer.Reset(os2); writer.StartObject(); // ... writer.EndObject(); \endcode */ void Reset(OutputStream& os) { os_ = &os; hasRoot_ = false; level_stack_.Clear(); } //! Checks whether the output is a complete JSON. /*! A complete JSON has a complete root object or array. */ bool IsComplete() const { return hasRoot_ && level_stack_.Empty(); } int GetMaxDecimalPlaces() const { return maxDecimalPlaces_; } //! Sets the maximum number of decimal places for double output. /*! This setting truncates the output with specified number of decimal places. For example, \code writer.SetMaxDecimalPlaces(3); writer.StartArray(); writer.Double(0.12345); // "0.123" writer.Double(0.0001); // "0.0" writer.Double(1.234567890123456e30); // "1.234567890123456e30" (do not truncate significand for positive exponent) writer.Double(1.23e-4); // "0.0" (do truncate significand for negative exponent) writer.EndArray(); \endcode The default setting does not truncate any decimal places. You can restore to this setting by calling \code writer.SetMaxDecimalPlaces(Writer::kDefaultMaxDecimalPlaces); \endcode */ void SetMaxDecimalPlaces(int maxDecimalPlaces) { maxDecimalPlaces_ = maxDecimalPlaces; } /*!@name Implementation of Handler \see Handler */ //@{ bool Null() { Prefix(kNullType); return EndValue(WriteNull()); } bool Bool(bool b) { Prefix(b ? kTrueType : kFalseType); return EndValue(WriteBool(b)); } bool Int(int i) { Prefix(kNumberType); return EndValue(WriteInt(i)); } bool Uint(unsigned u) { Prefix(kNumberType); return EndValue(WriteUint(u)); } bool Int64(int64_t i64) { Prefix(kNumberType); return EndValue(WriteInt64(i64)); } bool Uint64(uint64_t u64) { Prefix(kNumberType); return EndValue(WriteUint64(u64)); } //! Writes the given \c double value to the stream /*! \param d The value to be written. \return Whether it is succeed. */ bool Double(double d) { Prefix(kNumberType); return EndValue(WriteDouble(d)); } bool RawNumber(const Ch* str, SizeType length, bool copy = false) { RAPIDJSON_ASSERT(str != 0); (void)copy; Prefix(kNumberType); return EndValue(WriteString(str, length)); } bool String(const Ch* str, SizeType length, bool copy = false) { RAPIDJSON_ASSERT(str != 0); (void)copy; Prefix(kStringType); return EndValue(WriteString(str, length)); } #if RAPIDJSON_HAS_STDSTRING bool String(const std::basic_string& str) { return String(str.data(), SizeType(str.size())); } #endif bool StartObject() { Prefix(kObjectType); new (level_stack_.template Push()) Level(false); return WriteStartObject(); } bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } #if RAPIDJSON_HAS_STDSTRING bool Key(const std::basic_string& str) { return Key(str.data(), SizeType(str.size())); } #endif bool EndObject(SizeType memberCount = 0) { (void)memberCount; RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); // not inside an Object RAPIDJSON_ASSERT(!level_stack_.template Top()->inArray); // currently inside an Array, not Object RAPIDJSON_ASSERT(0 == level_stack_.template Top()->valueCount % 2); // Object has a Key without a Value level_stack_.template Pop(1); return EndValue(WriteEndObject()); } bool StartArray() { Prefix(kArrayType); new (level_stack_.template Push()) Level(true); return WriteStartArray(); } bool EndArray(SizeType elementCount = 0) { (void)elementCount; RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); RAPIDJSON_ASSERT(level_stack_.template Top()->inArray); level_stack_.template Pop(1); return EndValue(WriteEndArray()); } //@} /*! @name Convenience extensions */ //@{ //! Simpler but slower overload. bool String(const Ch* const& str) { return String(str, internal::StrLen(str)); } bool Key(const Ch* const& str) { return Key(str, internal::StrLen(str)); } //@} //! Write a raw JSON value. /*! For user to write a stringified JSON as a value. \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. \param length Length of the json. \param type Type of the root of json. */ bool RawValue(const Ch* json, size_t length, Type type) { RAPIDJSON_ASSERT(json != 0); Prefix(type); return EndValue(WriteRawValue(json, length)); } //! Flush the output stream. /*! Allows the user to flush the output stream immediately. */ void Flush() { os_->Flush(); } static const size_t kDefaultLevelDepth = 32; protected: //! Information for each nested level struct Level { Level(bool inArray_) : valueCount(0), inArray(inArray_) {} size_t valueCount; //!< number of values in this level bool inArray; //!< true if in array, otherwise in object }; bool WriteNull() { PutReserve(*os_, 4); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 'l'); return true; } bool WriteBool(bool b) { if (b) { PutReserve(*os_, 4); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'r'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'e'); } else { PutReserve(*os_, 5); PutUnsafe(*os_, 'f'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 's'); PutUnsafe(*os_, 'e'); } return true; } bool WriteInt(int i) { char buffer[11]; const char* end = internal::i32toa(i, buffer); PutReserve(*os_, static_cast(end - buffer)); for (const char* p = buffer; p != end; ++p) PutUnsafe(*os_, static_cast(*p)); return true; } bool WriteUint(unsigned u) { char buffer[10]; const char* end = internal::u32toa(u, buffer); PutReserve(*os_, static_cast(end - buffer)); for (const char* p = buffer; p != end; ++p) PutUnsafe(*os_, static_cast(*p)); return true; } bool WriteInt64(int64_t i64) { char buffer[21]; const char* end = internal::i64toa(i64, buffer); PutReserve(*os_, static_cast(end - buffer)); for (const char* p = buffer; p != end; ++p) PutUnsafe(*os_, static_cast(*p)); return true; } bool WriteUint64(uint64_t u64) { char buffer[20]; char* end = internal::u64toa(u64, buffer); PutReserve(*os_, static_cast(end - buffer)); for (char* p = buffer; p != end; ++p) PutUnsafe(*os_, static_cast(*p)); return true; } bool WriteDouble(double d) { if (internal::Double(d).IsNanOrInf()) { if (!(writeFlags & kWriteNanAndInfFlag)) return false; if (internal::Double(d).IsNan()) { PutReserve(*os_, 3); PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); return true; } if (internal::Double(d).Sign()) { PutReserve(*os_, 9); PutUnsafe(*os_, '-'); } else PutReserve(*os_, 8); PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); return true; } char buffer[25]; char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); PutReserve(*os_, static_cast(end - buffer)); for (char* p = buffer; p != end; ++p) PutUnsafe(*os_, static_cast(*p)); return true; } bool WriteString(const Ch* str, SizeType length) { static const typename OutputStream::Ch hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; static const char escape[256] = { #define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //0 1 2 3 4 5 6 7 8 9 A B C D E F 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'b', 't', 'n', 'u', 'f', 'r', 'u', 'u', // 00 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', // 10 0, 0, '"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 Z16, Z16, // 30~4F 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, // 50 Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 // 60~FF #undef Z16 }; if (TargetEncoding::supportUnicode) PutReserve(*os_, 2 + length * 6); // "\uxxxx..." else PutReserve(*os_, 2 + length * 12); // "\uxxxx\uyyyy..." PutUnsafe(*os_, '\"'); GenericStringStream is(str); while (ScanWriteUnescapedString(is, length)) { const Ch c = is.Peek(); if (!TargetEncoding::supportUnicode && static_cast(c) >= 0x80) { // Unicode escaping unsigned codepoint; if (RAPIDJSON_UNLIKELY(!SourceEncoding::Decode(is, &codepoint))) return false; PutUnsafe(*os_, '\\'); PutUnsafe(*os_, 'u'); if (codepoint <= 0xD7FF || (codepoint >= 0xE000 && codepoint <= 0xFFFF)) { PutUnsafe(*os_, hexDigits[(codepoint >> 12) & 15]); PutUnsafe(*os_, hexDigits[(codepoint >> 8) & 15]); PutUnsafe(*os_, hexDigits[(codepoint >> 4) & 15]); PutUnsafe(*os_, hexDigits[(codepoint ) & 15]); } else { RAPIDJSON_ASSERT(codepoint >= 0x010000 && codepoint <= 0x10FFFF); // Surrogate pair unsigned s = codepoint - 0x010000; unsigned lead = (s >> 10) + 0xD800; unsigned trail = (s & 0x3FF) + 0xDC00; PutUnsafe(*os_, hexDigits[(lead >> 12) & 15]); PutUnsafe(*os_, hexDigits[(lead >> 8) & 15]); PutUnsafe(*os_, hexDigits[(lead >> 4) & 15]); PutUnsafe(*os_, hexDigits[(lead ) & 15]); PutUnsafe(*os_, '\\'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, hexDigits[(trail >> 12) & 15]); PutUnsafe(*os_, hexDigits[(trail >> 8) & 15]); PutUnsafe(*os_, hexDigits[(trail >> 4) & 15]); PutUnsafe(*os_, hexDigits[(trail ) & 15]); } } else if ((sizeof(Ch) == 1 || static_cast(c) < 256) && RAPIDJSON_UNLIKELY(escape[static_cast(c)])) { is.Take(); PutUnsafe(*os_, '\\'); PutUnsafe(*os_, static_cast(escape[static_cast(c)])); if (escape[static_cast(c)] == 'u') { PutUnsafe(*os_, '0'); PutUnsafe(*os_, '0'); PutUnsafe(*os_, hexDigits[static_cast(c) >> 4]); PutUnsafe(*os_, hexDigits[static_cast(c) & 0xF]); } } else if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? Transcoder::Validate(is, *os_) : Transcoder::TranscodeUnsafe(is, *os_)))) return false; } PutUnsafe(*os_, '\"'); return true; } bool ScanWriteUnescapedString(GenericStringStream& is, size_t length) { return RAPIDJSON_LIKELY(is.Tell() < length); } bool WriteStartObject() { os_->Put('{'); return true; } bool WriteEndObject() { os_->Put('}'); return true; } bool WriteStartArray() { os_->Put('['); return true; } bool WriteEndArray() { os_->Put(']'); return true; } bool WriteRawValue(const Ch* json, size_t length) { PutReserve(*os_, length); GenericStringStream is(json); while (RAPIDJSON_LIKELY(is.Tell() < length)) { RAPIDJSON_ASSERT(is.Peek() != '\0'); if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? Transcoder::Validate(is, *os_) : Transcoder::TranscodeUnsafe(is, *os_)))) return false; } return true; } void Prefix(Type type) { (void)type; if (RAPIDJSON_LIKELY(level_stack_.GetSize() != 0)) { // this value is not at root Level* level = level_stack_.template Top(); if (level->valueCount > 0) { if (level->inArray) os_->Put(','); // add comma if it is not the first element in array else // in object os_->Put((level->valueCount % 2 == 0) ? ',' : ':'); } if (!level->inArray && level->valueCount % 2 == 0) RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name level->valueCount++; } else { RAPIDJSON_ASSERT(!hasRoot_); // Should only has one and only one root. hasRoot_ = true; } } // Flush the value if it is the top level one. bool EndValue(bool ret) { if (RAPIDJSON_UNLIKELY(level_stack_.Empty())) // end of json text Flush(); return ret; } OutputStream* os_; internal::Stack level_stack_; int maxDecimalPlaces_; bool hasRoot_; private: // Prohibit copy constructor & assignment operator. Writer(const Writer&); Writer& operator=(const Writer&); }; // Full specialization for StringStream to prevent memory copying template<> inline bool Writer::WriteInt(int i) { char *buffer = os_->Push(11); const char* end = internal::i32toa(i, buffer); os_->Pop(static_cast(11 - (end - buffer))); return true; } template<> inline bool Writer::WriteUint(unsigned u) { char *buffer = os_->Push(10); const char* end = internal::u32toa(u, buffer); os_->Pop(static_cast(10 - (end - buffer))); return true; } template<> inline bool Writer::WriteInt64(int64_t i64) { char *buffer = os_->Push(21); const char* end = internal::i64toa(i64, buffer); os_->Pop(static_cast(21 - (end - buffer))); return true; } template<> inline bool Writer::WriteUint64(uint64_t u) { char *buffer = os_->Push(20); const char* end = internal::u64toa(u, buffer); os_->Pop(static_cast(20 - (end - buffer))); return true; } template<> inline bool Writer::WriteDouble(double d) { if (internal::Double(d).IsNanOrInf()) { // Note: This code path can only be reached if (RAPIDJSON_WRITE_DEFAULT_FLAGS & kWriteNanAndInfFlag). if (!(kWriteDefaultFlags & kWriteNanAndInfFlag)) return false; if (internal::Double(d).IsNan()) { PutReserve(*os_, 3); PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); return true; } if (internal::Double(d).Sign()) { PutReserve(*os_, 9); PutUnsafe(*os_, '-'); } else PutReserve(*os_, 8); PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); return true; } char *buffer = os_->Push(25); char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); os_->Pop(static_cast(25 - (end - buffer))); return true; } #if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) template<> inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { if (length < 16) return RAPIDJSON_LIKELY(is.Tell() < length); if (!RAPIDJSON_LIKELY(is.Tell() < length)) return false; const char* p = is.src_; const char* end = is.head_ + length; const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); if (nextAligned > end) return true; while (p != nextAligned) if (*p < 0x20 || *p == '\"' || *p == '\\') { is.src_ = p; return RAPIDJSON_LIKELY(is.Tell() < length); } else os_->PutUnsafe(*p++); // The rest of string using SIMD static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); for (; p != endAligned; p += 16) { const __m128i s = _mm_load_si128(reinterpret_cast(p)); const __m128i t1 = _mm_cmpeq_epi8(s, dq); const __m128i t2 = _mm_cmpeq_epi8(s, bs); const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); unsigned short r = static_cast(_mm_movemask_epi8(x)); if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped SizeType len; #ifdef _MSC_VER // Find the index of first escaped unsigned long offset; _BitScanForward(&offset, r); len = offset; #else len = static_cast(__builtin_ffs(r) - 1); #endif char* q = reinterpret_cast(os_->PushUnsafe(len)); for (size_t i = 0; i < len; i++) q[i] = p[i]; p += len; break; } _mm_storeu_si128(reinterpret_cast<__m128i *>(os_->PushUnsafe(16)), s); } is.src_ = p; return RAPIDJSON_LIKELY(is.Tell() < length); } #elif defined(RAPIDJSON_NEON) template<> inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { if (length < 16) return RAPIDJSON_LIKELY(is.Tell() < length); if (!RAPIDJSON_LIKELY(is.Tell() < length)) return false; const char* p = is.src_; const char* end = is.head_ + length; const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); if (nextAligned > end) return true; while (p != nextAligned) if (*p < 0x20 || *p == '\"' || *p == '\\') { is.src_ = p; return RAPIDJSON_LIKELY(is.Tell() < length); } else os_->PutUnsafe(*p++); // The rest of string using SIMD const uint8x16_t s0 = vmovq_n_u8('"'); const uint8x16_t s1 = vmovq_n_u8('\\'); const uint8x16_t s2 = vmovq_n_u8('\b'); const uint8x16_t s3 = vmovq_n_u8(32); for (; p != endAligned; p += 16) { const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); uint8x16_t x = vceqq_u8(s, s0); x = vorrq_u8(x, vceqq_u8(s, s1)); x = vorrq_u8(x, vceqq_u8(s, s2)); x = vorrq_u8(x, vcltq_u8(s, s3)); x = vrev64q_u8(x); // Rev in 64 uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract SizeType len = 0; bool escaped = false; if (low == 0) { if (high != 0) { uint32_t lz = internal::clzll(high); len = 8 + (lz >> 3); escaped = true; } } else { uint32_t lz = internal::clzll(low); len = lz >> 3; escaped = true; } if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped char* q = reinterpret_cast(os_->PushUnsafe(len)); for (size_t i = 0; i < len; i++) q[i] = p[i]; p += len; break; } vst1q_u8(reinterpret_cast(os_->PushUnsafe(16)), s); } is.src_ = p; return RAPIDJSON_LIKELY(is.Tell() < length); } #endif // RAPIDJSON_NEON RAPIDJSON_NAMESPACE_END #if defined(_MSC_VER) || defined(__clang__) RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_RAPIDJSON_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/memorystream.h0000644000000000000000000000512215031566105026222 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_MEMORYSTREAM_H_ #define RAPIDJSON_MEMORYSTREAM_H_ #include "stream.h" #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(unreachable-code) RAPIDJSON_DIAG_OFF(missing-noreturn) #endif RAPIDJSON_NAMESPACE_BEGIN //! Represents an in-memory input byte stream. /*! This class is mainly for being wrapped by EncodedInputStream or AutoUTFInputStream. It is similar to FileReadBuffer but the source is an in-memory buffer instead of a file. Differences between MemoryStream and StringStream: 1. StringStream has encoding but MemoryStream is a byte stream. 2. MemoryStream needs size of the source buffer and the buffer don't need to be null terminated. StringStream assume null-terminated string as source. 3. MemoryStream supports Peek4() for encoding detection. StringStream is specified with an encoding so it should not have Peek4(). \note implements Stream concept */ struct MemoryStream { typedef char Ch; // byte MemoryStream(const Ch *src, size_t size) : src_(src), begin_(src), end_(src + size), size_(size) {} Ch Peek() const { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_; } Ch Take() { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_++; } size_t Tell() const { return static_cast(src_ - begin_); } Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } void Put(Ch) { RAPIDJSON_ASSERT(false); } void Flush() { RAPIDJSON_ASSERT(false); } size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } // For encoding detection only. const Ch* Peek4() const { return Tell() + 4 <= size_ ? src_ : 0; } const Ch* src_; //!< Current read position. const Ch* begin_; //!< Original head of the string. const Ch* end_; //!< End of stream. size_t size_; //!< Size of the stream. }; RAPIDJSON_NAMESPACE_END #ifdef __clang__ RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_MEMORYBUFFER_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/error/0000755000000000000000000000000015031566105024456 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/error/en.h0000644000000000000000000003134115031566105025233 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_ERROR_EN_H_ #define RAPIDJSON_ERROR_EN_H_ #include "error.h" #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(switch-enum) RAPIDJSON_DIAG_OFF(covered-switch-default) #endif RAPIDJSON_NAMESPACE_BEGIN //! Maps error code of parsing into error message. /*! \ingroup RAPIDJSON_ERRORS \param parseErrorCode Error code obtained in parsing. \return the error message. \note User can make a copy of this function for localization. Using switch-case is safer for future modification of error codes. */ inline const RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(ParseErrorCode parseErrorCode) { switch (parseErrorCode) { case kParseErrorNone: return RAPIDJSON_ERROR_STRING("No error."); case kParseErrorDocumentEmpty: return RAPIDJSON_ERROR_STRING("The document is empty."); case kParseErrorDocumentRootNotSingular: return RAPIDJSON_ERROR_STRING("The document root must not be followed by other values."); case kParseErrorValueInvalid: return RAPIDJSON_ERROR_STRING("Invalid value."); case kParseErrorObjectMissName: return RAPIDJSON_ERROR_STRING("Missing a name for object member."); case kParseErrorObjectMissColon: return RAPIDJSON_ERROR_STRING("Missing a colon after a name of object member."); case kParseErrorObjectMissCommaOrCurlyBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or '}' after an object member."); case kParseErrorArrayMissCommaOrSquareBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or ']' after an array element."); case kParseErrorStringUnicodeEscapeInvalidHex: return RAPIDJSON_ERROR_STRING("Incorrect hex digit after \\u escape in string."); case kParseErrorStringUnicodeSurrogateInvalid: return RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid."); case kParseErrorStringEscapeInvalid: return RAPIDJSON_ERROR_STRING("Invalid escape character in string."); case kParseErrorStringMissQuotationMark: return RAPIDJSON_ERROR_STRING("Missing a closing quotation mark in string."); case kParseErrorStringInvalidEncoding: return RAPIDJSON_ERROR_STRING("Invalid encoding in string."); case kParseErrorNumberTooBig: return RAPIDJSON_ERROR_STRING("Number too big to be stored in double."); case kParseErrorNumberMissFraction: return RAPIDJSON_ERROR_STRING("Miss fraction part in number."); case kParseErrorNumberMissExponent: return RAPIDJSON_ERROR_STRING("Miss exponent in number."); case kParseErrorTermination: return RAPIDJSON_ERROR_STRING("Terminate parsing due to Handler error."); case kParseErrorUnspecificSyntaxError: return RAPIDJSON_ERROR_STRING("Unspecific syntax error."); default: return RAPIDJSON_ERROR_STRING("Unknown error."); } } //! Maps error code of validation into error message. /*! \ingroup RAPIDJSON_ERRORS \param validateErrorCode Error code obtained from validator. \return the error message. \note User can make a copy of this function for localization. Using switch-case is safer for future modification of error codes. */ inline const RAPIDJSON_ERROR_CHARTYPE* GetValidateError_En(ValidateErrorCode validateErrorCode) { switch (validateErrorCode) { case kValidateErrors: return RAPIDJSON_ERROR_STRING("One or more validation errors have occurred"); case kValidateErrorNone: return RAPIDJSON_ERROR_STRING("No error."); case kValidateErrorMultipleOf: return RAPIDJSON_ERROR_STRING("Number '%actual' is not a multiple of the 'multipleOf' value '%expected'."); case kValidateErrorMaximum: return RAPIDJSON_ERROR_STRING("Number '%actual' is greater than the 'maximum' value '%expected'."); case kValidateErrorExclusiveMaximum: return RAPIDJSON_ERROR_STRING("Number '%actual' is greater than or equal to the 'exclusiveMaximum' value '%expected'."); case kValidateErrorMinimum: return RAPIDJSON_ERROR_STRING("Number '%actual' is less than the 'minimum' value '%expected'."); case kValidateErrorExclusiveMinimum: return RAPIDJSON_ERROR_STRING("Number '%actual' is less than or equal to the 'exclusiveMinimum' value '%expected'."); case kValidateErrorMaxLength: return RAPIDJSON_ERROR_STRING("String '%actual' is longer than the 'maxLength' value '%expected'."); case kValidateErrorMinLength: return RAPIDJSON_ERROR_STRING("String '%actual' is shorter than the 'minLength' value '%expected'."); case kValidateErrorPattern: return RAPIDJSON_ERROR_STRING("String '%actual' does not match the 'pattern' regular expression."); case kValidateErrorMaxItems: return RAPIDJSON_ERROR_STRING("Array of length '%actual' is longer than the 'maxItems' value '%expected'."); case kValidateErrorMinItems: return RAPIDJSON_ERROR_STRING("Array of length '%actual' is shorter than the 'minItems' value '%expected'."); case kValidateErrorUniqueItems: return RAPIDJSON_ERROR_STRING("Array has duplicate items at indices '%duplicates' but 'uniqueItems' is true."); case kValidateErrorAdditionalItems: return RAPIDJSON_ERROR_STRING("Array has an additional item at index '%disallowed' that is not allowed by the schema."); case kValidateErrorMaxProperties: return RAPIDJSON_ERROR_STRING("Object has '%actual' members which is more than 'maxProperties' value '%expected'."); case kValidateErrorMinProperties: return RAPIDJSON_ERROR_STRING("Object has '%actual' members which is less than 'minProperties' value '%expected'."); case kValidateErrorRequired: return RAPIDJSON_ERROR_STRING("Object is missing the following members required by the schema: '%missing'."); case kValidateErrorAdditionalProperties: return RAPIDJSON_ERROR_STRING("Object has an additional member '%disallowed' that is not allowed by the schema."); case kValidateErrorPatternProperties: return RAPIDJSON_ERROR_STRING("Object has 'patternProperties' that are not allowed by the schema."); case kValidateErrorDependencies: return RAPIDJSON_ERROR_STRING("Object has missing property or schema dependencies, refer to following errors."); case kValidateErrorEnum: return RAPIDJSON_ERROR_STRING("Property has a value that is not one of its allowed enumerated values."); case kValidateErrorType: return RAPIDJSON_ERROR_STRING("Property has a type '%actual' that is not in the following list: '%expected'."); case kValidateErrorOneOf: return RAPIDJSON_ERROR_STRING("Property did not match any of the sub-schemas specified by 'oneOf', refer to following errors."); case kValidateErrorOneOfMatch: return RAPIDJSON_ERROR_STRING("Property matched more than one of the sub-schemas specified by 'oneOf', indices '%matches'."); case kValidateErrorAllOf: return RAPIDJSON_ERROR_STRING("Property did not match all of the sub-schemas specified by 'allOf', refer to following errors."); case kValidateErrorAnyOf: return RAPIDJSON_ERROR_STRING("Property did not match any of the sub-schemas specified by 'anyOf', refer to following errors."); case kValidateErrorNot: return RAPIDJSON_ERROR_STRING("Property matched the sub-schema specified by 'not'."); case kValidateErrorReadOnly: return RAPIDJSON_ERROR_STRING("Property is read-only but has been provided when validation is for writing."); case kValidateErrorWriteOnly: return RAPIDJSON_ERROR_STRING("Property is write-only but has been provided when validation is for reading."); default: return RAPIDJSON_ERROR_STRING("Unknown error."); } } //! Maps error code of schema document compilation into error message. /*! \ingroup RAPIDJSON_ERRORS \param schemaErrorCode Error code obtained from compiling the schema document. \return the error message. \note User can make a copy of this function for localization. Using switch-case is safer for future modification of error codes. */ inline const RAPIDJSON_ERROR_CHARTYPE* GetSchemaError_En(SchemaErrorCode schemaErrorCode) { switch (schemaErrorCode) { case kSchemaErrorNone: return RAPIDJSON_ERROR_STRING("No error."); case kSchemaErrorStartUnknown: return RAPIDJSON_ERROR_STRING("Pointer '%value' to start of schema does not resolve to a location in the document."); case kSchemaErrorRefPlainName: return RAPIDJSON_ERROR_STRING("$ref fragment '%value' must be a JSON pointer."); case kSchemaErrorRefInvalid: return RAPIDJSON_ERROR_STRING("$ref must not be an empty string."); case kSchemaErrorRefPointerInvalid: return RAPIDJSON_ERROR_STRING("$ref fragment '%value' is not a valid JSON pointer at offset '%offset'."); case kSchemaErrorRefUnknown: return RAPIDJSON_ERROR_STRING("$ref '%value' does not resolve to a location in the target document."); case kSchemaErrorRefCyclical: return RAPIDJSON_ERROR_STRING("$ref '%value' is cyclical."); case kSchemaErrorRefNoRemoteProvider: return RAPIDJSON_ERROR_STRING("$ref is remote but there is no remote provider."); case kSchemaErrorRefNoRemoteSchema: return RAPIDJSON_ERROR_STRING("$ref '%value' is remote but the remote provider did not return a schema."); case kSchemaErrorRegexInvalid: return RAPIDJSON_ERROR_STRING("Invalid regular expression '%value' in 'pattern' or 'patternProperties'."); case kSchemaErrorSpecUnknown: return RAPIDJSON_ERROR_STRING("JSON schema draft or OpenAPI version is not recognized."); case kSchemaErrorSpecUnsupported: return RAPIDJSON_ERROR_STRING("JSON schema draft or OpenAPI version is not supported."); case kSchemaErrorSpecIllegal: return RAPIDJSON_ERROR_STRING("Both JSON schema draft and OpenAPI version found in document."); case kSchemaErrorReadOnlyAndWriteOnly: return RAPIDJSON_ERROR_STRING("Property must not be both 'readOnly' and 'writeOnly'."); default: return RAPIDJSON_ERROR_STRING("Unknown error."); } } //! Maps error code of pointer parse into error message. /*! \ingroup RAPIDJSON_ERRORS \param pointerParseErrorCode Error code obtained from pointer parse. \return the error message. \note User can make a copy of this function for localization. Using switch-case is safer for future modification of error codes. */ inline const RAPIDJSON_ERROR_CHARTYPE* GetPointerParseError_En(PointerParseErrorCode pointerParseErrorCode) { switch (pointerParseErrorCode) { case kPointerParseErrorNone: return RAPIDJSON_ERROR_STRING("No error."); case kPointerParseErrorTokenMustBeginWithSolidus: return RAPIDJSON_ERROR_STRING("A token must begin with a '/'."); case kPointerParseErrorInvalidEscape: return RAPIDJSON_ERROR_STRING("Invalid escape."); case kPointerParseErrorInvalidPercentEncoding: return RAPIDJSON_ERROR_STRING("Invalid percent encoding in URI fragment."); case kPointerParseErrorCharacterMustPercentEncode: return RAPIDJSON_ERROR_STRING("A character must be percent encoded in a URI fragment."); default: return RAPIDJSON_ERROR_STRING("Unknown error."); } } RAPIDJSON_NAMESPACE_END #ifdef __clang__ RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_ERROR_EN_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/error/error.h0000644000000000000000000003205115031566105025761 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_ERROR_ERROR_H_ #define RAPIDJSON_ERROR_ERROR_H_ #include "../rapidjson.h" #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(padded) #endif /*! \file error.h */ /*! \defgroup RAPIDJSON_ERRORS RapidJSON error handling */ /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_ERROR_CHARTYPE //! Character type of error messages. /*! \ingroup RAPIDJSON_ERRORS The default character type is \c char. On Windows, user can define this macro as \c TCHAR for supporting both unicode/non-unicode settings. */ #ifndef RAPIDJSON_ERROR_CHARTYPE #define RAPIDJSON_ERROR_CHARTYPE char #endif /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_ERROR_STRING //! Macro for converting string literal to \ref RAPIDJSON_ERROR_CHARTYPE[]. /*! \ingroup RAPIDJSON_ERRORS By default this conversion macro does nothing. On Windows, user can define this macro as \c _T(x) for supporting both unicode/non-unicode settings. */ #ifndef RAPIDJSON_ERROR_STRING #define RAPIDJSON_ERROR_STRING(x) x #endif RAPIDJSON_NAMESPACE_BEGIN /////////////////////////////////////////////////////////////////////////////// // ParseErrorCode //! Error code of parsing. /*! \ingroup RAPIDJSON_ERRORS \see GenericReader::Parse, GenericReader::GetParseErrorCode */ enum ParseErrorCode { kParseErrorNone = 0, //!< No error. kParseErrorDocumentEmpty, //!< The document is empty. kParseErrorDocumentRootNotSingular, //!< The document root must not follow by other values. kParseErrorValueInvalid, //!< Invalid value. kParseErrorObjectMissName, //!< Missing a name for object member. kParseErrorObjectMissColon, //!< Missing a colon after a name of object member. kParseErrorObjectMissCommaOrCurlyBracket, //!< Missing a comma or '}' after an object member. kParseErrorArrayMissCommaOrSquareBracket, //!< Missing a comma or ']' after an array element. kParseErrorStringUnicodeEscapeInvalidHex, //!< Incorrect hex digit after \\u escape in string. kParseErrorStringUnicodeSurrogateInvalid, //!< The surrogate pair in string is invalid. kParseErrorStringEscapeInvalid, //!< Invalid escape character in string. kParseErrorStringMissQuotationMark, //!< Missing a closing quotation mark in string. kParseErrorStringInvalidEncoding, //!< Invalid encoding in string. kParseErrorNumberTooBig, //!< Number too big to be stored in double. kParseErrorNumberMissFraction, //!< Miss fraction part in number. kParseErrorNumberMissExponent, //!< Miss exponent in number. kParseErrorTermination, //!< Parsing was terminated. kParseErrorUnspecificSyntaxError //!< Unspecific syntax error. }; //! Result of parsing (wraps ParseErrorCode) /*! \ingroup RAPIDJSON_ERRORS \code Document doc; ParseResult ok = doc.Parse("[42]"); if (!ok) { fprintf(stderr, "JSON parse error: %s (%u)", GetParseError_En(ok.Code()), ok.Offset()); exit(EXIT_FAILURE); } \endcode \see GenericReader::Parse, GenericDocument::Parse */ struct ParseResult { //!! Unspecified boolean type typedef bool (ParseResult::*BooleanType)() const; public: //! Default constructor, no error. ParseResult() : code_(kParseErrorNone), offset_(0) {} //! Constructor to set an error. ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset) {} //! Get the error code. ParseErrorCode Code() const { return code_; } //! Get the error offset, if \ref IsError(), 0 otherwise. size_t Offset() const { return offset_; } //! Explicit conversion to \c bool, returns \c true, iff !\ref IsError(). operator BooleanType() const { return !IsError() ? &ParseResult::IsError : NULL; } //! Whether the result is an error. bool IsError() const { return code_ != kParseErrorNone; } bool operator==(const ParseResult& that) const { return code_ == that.code_; } bool operator==(ParseErrorCode code) const { return code_ == code; } friend bool operator==(ParseErrorCode code, const ParseResult & err) { return code == err.code_; } bool operator!=(const ParseResult& that) const { return !(*this == that); } bool operator!=(ParseErrorCode code) const { return !(*this == code); } friend bool operator!=(ParseErrorCode code, const ParseResult & err) { return err != code; } //! Reset error code. void Clear() { Set(kParseErrorNone); } //! Update error code and offset. void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; } private: ParseErrorCode code_; size_t offset_; }; //! Function pointer type of GetParseError(). /*! \ingroup RAPIDJSON_ERRORS This is the prototype for \c GetParseError_X(), where \c X is a locale. User can dynamically change locale in runtime, e.g.: \code GetParseErrorFunc GetParseError = GetParseError_En; // or whatever const RAPIDJSON_ERROR_CHARTYPE* s = GetParseError(document.GetParseErrorCode()); \endcode */ typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetParseErrorFunc)(ParseErrorCode); /////////////////////////////////////////////////////////////////////////////// // ValidateErrorCode //! Error codes when validating. /*! \ingroup RAPIDJSON_ERRORS \see GenericSchemaValidator */ enum ValidateErrorCode { kValidateErrors = -1, //!< Top level error code when kValidateContinueOnErrorsFlag set. kValidateErrorNone = 0, //!< No error. kValidateErrorMultipleOf, //!< Number is not a multiple of the 'multipleOf' value. kValidateErrorMaximum, //!< Number is greater than the 'maximum' value. kValidateErrorExclusiveMaximum, //!< Number is greater than or equal to the 'maximum' value. kValidateErrorMinimum, //!< Number is less than the 'minimum' value. kValidateErrorExclusiveMinimum, //!< Number is less than or equal to the 'minimum' value. kValidateErrorMaxLength, //!< String is longer than the 'maxLength' value. kValidateErrorMinLength, //!< String is longer than the 'maxLength' value. kValidateErrorPattern, //!< String does not match the 'pattern' regular expression. kValidateErrorMaxItems, //!< Array is longer than the 'maxItems' value. kValidateErrorMinItems, //!< Array is shorter than the 'minItems' value. kValidateErrorUniqueItems, //!< Array has duplicate items but 'uniqueItems' is true. kValidateErrorAdditionalItems, //!< Array has additional items that are not allowed by the schema. kValidateErrorMaxProperties, //!< Object has more members than 'maxProperties' value. kValidateErrorMinProperties, //!< Object has less members than 'minProperties' value. kValidateErrorRequired, //!< Object is missing one or more members required by the schema. kValidateErrorAdditionalProperties, //!< Object has additional members that are not allowed by the schema. kValidateErrorPatternProperties, //!< See other errors. kValidateErrorDependencies, //!< Object has missing property or schema dependencies. kValidateErrorEnum, //!< Property has a value that is not one of its allowed enumerated values. kValidateErrorType, //!< Property has a type that is not allowed by the schema. kValidateErrorOneOf, //!< Property did not match any of the sub-schemas specified by 'oneOf'. kValidateErrorOneOfMatch, //!< Property matched more than one of the sub-schemas specified by 'oneOf'. kValidateErrorAllOf, //!< Property did not match all of the sub-schemas specified by 'allOf'. kValidateErrorAnyOf, //!< Property did not match any of the sub-schemas specified by 'anyOf'. kValidateErrorNot, //!< Property matched the sub-schema specified by 'not'. kValidateErrorReadOnly, //!< Property is read-only but has been provided when validation is for writing kValidateErrorWriteOnly //!< Property is write-only but has been provided when validation is for reading }; //! Function pointer type of GetValidateError(). /*! \ingroup RAPIDJSON_ERRORS This is the prototype for \c GetValidateError_X(), where \c X is a locale. User can dynamically change locale in runtime, e.g.: \code GetValidateErrorFunc GetValidateError = GetValidateError_En; // or whatever const RAPIDJSON_ERROR_CHARTYPE* s = GetValidateError(validator.GetInvalidSchemaCode()); \endcode */ typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetValidateErrorFunc)(ValidateErrorCode); /////////////////////////////////////////////////////////////////////////////// // SchemaErrorCode //! Error codes when validating. /*! \ingroup RAPIDJSON_ERRORS \see GenericSchemaValidator */ enum SchemaErrorCode { kSchemaErrorNone = 0, //!< No error. kSchemaErrorStartUnknown, //!< Pointer to start of schema does not resolve to a location in the document kSchemaErrorRefPlainName, //!< $ref fragment must be a JSON pointer kSchemaErrorRefInvalid, //!< $ref must not be an empty string kSchemaErrorRefPointerInvalid, //!< $ref fragment is not a valid JSON pointer at offset kSchemaErrorRefUnknown, //!< $ref does not resolve to a location in the target document kSchemaErrorRefCyclical, //!< $ref is cyclical kSchemaErrorRefNoRemoteProvider, //!< $ref is remote but there is no remote provider kSchemaErrorRefNoRemoteSchema, //!< $ref is remote but the remote provider did not return a schema kSchemaErrorRegexInvalid, //!< Invalid regular expression in 'pattern' or 'patternProperties' kSchemaErrorSpecUnknown, //!< JSON schema draft or OpenAPI version is not recognized kSchemaErrorSpecUnsupported, //!< JSON schema draft or OpenAPI version is not supported kSchemaErrorSpecIllegal, //!< Both JSON schema draft and OpenAPI version found in document kSchemaErrorReadOnlyAndWriteOnly //!< Property must not be both 'readOnly' and 'writeOnly' }; //! Function pointer type of GetSchemaError(). /*! \ingroup RAPIDJSON_ERRORS This is the prototype for \c GetSchemaError_X(), where \c X is a locale. User can dynamically change locale in runtime, e.g.: \code GetSchemaErrorFunc GetSchemaError = GetSchemaError_En; // or whatever const RAPIDJSON_ERROR_CHARTYPE* s = GetSchemaError(validator.GetInvalidSchemaCode()); \endcode */ typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetSchemaErrorFunc)(SchemaErrorCode); /////////////////////////////////////////////////////////////////////////////// // PointerParseErrorCode //! Error code of JSON pointer parsing. /*! \ingroup RAPIDJSON_ERRORS \see GenericPointer::GenericPointer, GenericPointer::GetParseErrorCode */ enum PointerParseErrorCode { kPointerParseErrorNone = 0, //!< The parse is successful kPointerParseErrorTokenMustBeginWithSolidus, //!< A token must begin with a '/' kPointerParseErrorInvalidEscape, //!< Invalid escape kPointerParseErrorInvalidPercentEncoding, //!< Invalid percent encoding in URI fragment kPointerParseErrorCharacterMustPercentEncode //!< A character must percent encoded in URI fragment }; //! Function pointer type of GetPointerParseError(). /*! \ingroup RAPIDJSON_ERRORS This is the prototype for \c GetPointerParseError_X(), where \c X is a locale. User can dynamically change locale in runtime, e.g.: \code GetPointerParseErrorFunc GetPointerParseError = GetPointerParseError_En; // or whatever const RAPIDJSON_ERROR_CHARTYPE* s = GetPointerParseError(pointer.GetParseErrorCode()); \endcode */ typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetPointerParseErrorFunc)(PointerParseErrorCode); RAPIDJSON_NAMESPACE_END #ifdef __clang__ RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_ERROR_ERROR_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/filewritestream.h0000644000000000000000000000605715031566105026714 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_FILEWRITESTREAM_H_ #define RAPIDJSON_FILEWRITESTREAM_H_ #include "stream.h" #include #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(unreachable-code) #endif RAPIDJSON_NAMESPACE_BEGIN //! Wrapper of C file stream for output using fwrite(). /*! \note implements Stream concept */ class FileWriteStream { public: typedef char Ch; //!< Character type. Only support char. FileWriteStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) { RAPIDJSON_ASSERT(fp_ != 0); } void Put(char c) { if (current_ >= bufferEnd_) Flush(); *current_++ = c; } void PutN(char c, size_t n) { size_t avail = static_cast(bufferEnd_ - current_); while (n > avail) { std::memset(current_, c, avail); current_ += avail; Flush(); n -= avail; avail = static_cast(bufferEnd_ - current_); } if (n > 0) { std::memset(current_, c, n); current_ += n; } } void Flush() { if (current_ != buffer_) { size_t result = std::fwrite(buffer_, 1, static_cast(current_ - buffer_), fp_); if (result < static_cast(current_ - buffer_)) { // failure deliberately ignored at this time // added to avoid warn_unused_result build errors } current_ = buffer_; } } // Not implemented char Peek() const { RAPIDJSON_ASSERT(false); return 0; } char Take() { RAPIDJSON_ASSERT(false); return 0; } size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } private: // Prohibit copy constructor & assignment operator. FileWriteStream(const FileWriteStream&); FileWriteStream& operator=(const FileWriteStream&); std::FILE* fp_; char *buffer_; char *bufferEnd_; char *current_; }; //! Implement specialized version of PutN() with memset() for better performance. template<> inline void PutN(FileWriteStream& stream, char c, size_t n) { stream.PutN(c, n); } RAPIDJSON_NAMESPACE_END #ifdef __clang__ RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_FILESTREAM_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/rapidjson.h0000644000000000000000000006176015031566105025501 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_RAPIDJSON_H_ #define RAPIDJSON_RAPIDJSON_H_ /*!\file rapidjson.h \brief common definitions and configuration \see RAPIDJSON_CONFIG */ /*! \defgroup RAPIDJSON_CONFIG RapidJSON configuration \brief Configuration macros for library features Some RapidJSON features are configurable to adapt the library to a wide variety of platforms, environments and usage scenarios. Most of the features can be configured in terms of overridden or predefined preprocessor macros at compile-time. Some additional customization is available in the \ref RAPIDJSON_ERRORS APIs. \note These macros should be given on the compiler command-line (where applicable) to avoid inconsistent values when compiling different translation units of a single application. */ #include // malloc(), realloc(), free(), size_t #include // memset(), memcpy(), memmove(), memcmp() /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_VERSION_STRING // // ALWAYS synchronize the following 3 macros with corresponding variables in /CMakeLists.txt. // //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN // token stringification #define RAPIDJSON_STRINGIFY(x) RAPIDJSON_DO_STRINGIFY(x) #define RAPIDJSON_DO_STRINGIFY(x) #x // token concatenation #define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y) #define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y) #define RAPIDJSON_DO_JOIN2(X, Y) X##Y //!@endcond /*! \def RAPIDJSON_MAJOR_VERSION \ingroup RAPIDJSON_CONFIG \brief Major version of RapidJSON in integer. */ /*! \def RAPIDJSON_MINOR_VERSION \ingroup RAPIDJSON_CONFIG \brief Minor version of RapidJSON in integer. */ /*! \def RAPIDJSON_PATCH_VERSION \ingroup RAPIDJSON_CONFIG \brief Patch version of RapidJSON in integer. */ /*! \def RAPIDJSON_VERSION_STRING \ingroup RAPIDJSON_CONFIG \brief Version of RapidJSON in ".." string format. */ #define RAPIDJSON_MAJOR_VERSION 1 #define RAPIDJSON_MINOR_VERSION 1 #define RAPIDJSON_PATCH_VERSION 0 #define RAPIDJSON_VERSION_STRING \ RAPIDJSON_STRINGIFY(RAPIDJSON_MAJOR_VERSION.RAPIDJSON_MINOR_VERSION.RAPIDJSON_PATCH_VERSION) /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_NAMESPACE_(BEGIN|END) /*! \def RAPIDJSON_NAMESPACE \ingroup RAPIDJSON_CONFIG \brief provide custom rapidjson namespace In order to avoid symbol clashes and/or "One Definition Rule" errors between multiple inclusions of (different versions of) RapidJSON in a single binary, users can customize the name of the main RapidJSON namespace. In case of a single nesting level, defining \c RAPIDJSON_NAMESPACE to a custom name (e.g. \c MyRapidJSON) is sufficient. If multiple levels are needed, both \ref RAPIDJSON_NAMESPACE_BEGIN and \ref RAPIDJSON_NAMESPACE_END need to be defined as well: \code // in some .cpp file #define RAPIDJSON_NAMESPACE my::rapidjson #define RAPIDJSON_NAMESPACE_BEGIN namespace my { namespace rapidjson { #define RAPIDJSON_NAMESPACE_END } } #include "rapidjson/..." \endcode \see rapidjson */ /*! \def RAPIDJSON_NAMESPACE_BEGIN \ingroup RAPIDJSON_CONFIG \brief provide custom rapidjson namespace (opening expression) \see RAPIDJSON_NAMESPACE */ /*! \def RAPIDJSON_NAMESPACE_END \ingroup RAPIDJSON_CONFIG \brief provide custom rapidjson namespace (closing expression) \see RAPIDJSON_NAMESPACE */ #ifndef RAPIDJSON_NAMESPACE #define RAPIDJSON_NAMESPACE rapidjson #endif #ifndef RAPIDJSON_NAMESPACE_BEGIN #define RAPIDJSON_NAMESPACE_BEGIN namespace RAPIDJSON_NAMESPACE { #endif #ifndef RAPIDJSON_NAMESPACE_END #define RAPIDJSON_NAMESPACE_END } #endif /////////////////////////////////////////////////////////////////////////////// // __cplusplus macro //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN #if defined(_MSC_VER) #define RAPIDJSON_CPLUSPLUS _MSVC_LANG #else #define RAPIDJSON_CPLUSPLUS __cplusplus #endif //!@endcond /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_HAS_STDSTRING #ifndef RAPIDJSON_HAS_STDSTRING #ifdef RAPIDJSON_DOXYGEN_RUNNING #define RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation #else #define RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default #endif /*! \def RAPIDJSON_HAS_STDSTRING \ingroup RAPIDJSON_CONFIG \brief Enable RapidJSON support for \c std::string By defining this preprocessor symbol to \c 1, several convenience functions for using \ref rapidjson::GenericValue with \c std::string are enabled, especially for construction and comparison. \hideinitializer */ #endif // !defined(RAPIDJSON_HAS_STDSTRING) #if RAPIDJSON_HAS_STDSTRING #include #endif // RAPIDJSON_HAS_STDSTRING /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_USE_MEMBERSMAP /*! \def RAPIDJSON_USE_MEMBERSMAP \ingroup RAPIDJSON_CONFIG \brief Enable RapidJSON support for object members handling in a \c std::multimap By defining this preprocessor symbol to \c 1, \ref rapidjson::GenericValue object members are stored in a \c std::multimap for faster lookup and deletion times, a trade off with a slightly slower insertion time and a small object allocat(or)ed memory overhead. \hideinitializer */ #ifndef RAPIDJSON_USE_MEMBERSMAP #define RAPIDJSON_USE_MEMBERSMAP 0 // not by default #endif /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_NO_INT64DEFINE /*! \def RAPIDJSON_NO_INT64DEFINE \ingroup RAPIDJSON_CONFIG \brief Use external 64-bit integer types. RapidJSON requires the 64-bit integer types \c int64_t and \c uint64_t types to be available at global scope. If users have their own definition, define RAPIDJSON_NO_INT64DEFINE to prevent RapidJSON from defining its own types. */ #ifndef RAPIDJSON_NO_INT64DEFINE //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN #if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013 #include "msinttypes/stdint.h" #include "msinttypes/inttypes.h" #else // Other compilers should have this. #include #include #endif //!@endcond #ifdef RAPIDJSON_DOXYGEN_RUNNING #define RAPIDJSON_NO_INT64DEFINE #endif #endif // RAPIDJSON_NO_INT64TYPEDEF /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_FORCEINLINE #ifndef RAPIDJSON_FORCEINLINE //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN #if defined(_MSC_VER) && defined(NDEBUG) #define RAPIDJSON_FORCEINLINE __forceinline #elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG) #define RAPIDJSON_FORCEINLINE __attribute__((always_inline)) #else #define RAPIDJSON_FORCEINLINE #endif //!@endcond #endif // RAPIDJSON_FORCEINLINE /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_ENDIAN #define RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine #define RAPIDJSON_BIGENDIAN 1 //!< Big endian machine //! Endianness of the machine. /*! \def RAPIDJSON_ENDIAN \ingroup RAPIDJSON_CONFIG GCC 4.6 provided macro for detecting endianness of the target machine. But other compilers may not have this. User can define RAPIDJSON_ENDIAN to either \ref RAPIDJSON_LITTLEENDIAN or \ref RAPIDJSON_BIGENDIAN. Default detection implemented with reference to \li https://gcc.gnu.org/onlinedocs/gcc-4.6.0/cpp/Common-Predefined-Macros.html \li http://www.boost.org/doc/libs/1_42_0/boost/detail/endian.hpp */ #ifndef RAPIDJSON_ENDIAN // Detect with GCC 4.6's macro # ifdef __BYTE_ORDER__ # if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN # elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ # define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN # else # error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. # endif // __BYTE_ORDER__ // Detect with GLIBC's endian.h # elif defined(__GLIBC__) # include # if (__BYTE_ORDER == __LITTLE_ENDIAN) # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN # elif (__BYTE_ORDER == __BIG_ENDIAN) # define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN # else # error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. # endif // __GLIBC__ // Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro # elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN # elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) # define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN // Detect with architecture macros # elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__) # define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN # elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__) # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN # elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64)) # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN # elif defined(RAPIDJSON_DOXYGEN_RUNNING) # define RAPIDJSON_ENDIAN # else # error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. # endif #endif // RAPIDJSON_ENDIAN /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_64BIT //! Whether using 64-bit architecture #ifndef RAPIDJSON_64BIT #if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__) #define RAPIDJSON_64BIT 1 #else #define RAPIDJSON_64BIT 0 #endif #endif // RAPIDJSON_64BIT /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_ALIGN //! Data alignment of the machine. /*! \ingroup RAPIDJSON_CONFIG \param x pointer to align Some machines require strict data alignment. The default is 8 bytes. User can customize by defining the RAPIDJSON_ALIGN function macro. */ #ifndef RAPIDJSON_ALIGN #define RAPIDJSON_ALIGN(x) (((x) + static_cast(7u)) & ~static_cast(7u)) #endif /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_UINT64_C2 //! Construct a 64-bit literal by a pair of 32-bit integer. /*! 64-bit literal with or without ULL suffix is prone to compiler warnings. UINT64_C() is C macro which cause compilation problems. Use this macro to define 64-bit constants by a pair of 32-bit integer. */ #ifndef RAPIDJSON_UINT64_C2 #define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast(high32) << 32) | static_cast(low32)) #endif /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_48BITPOINTER_OPTIMIZATION //! Use only lower 48-bit address for some pointers. /*! \ingroup RAPIDJSON_CONFIG This optimization uses the fact that current X86-64 architecture only implement lower 48-bit virtual address. The higher 16-bit can be used for storing other data. \c GenericValue uses this optimization to reduce its size form 24 bytes to 16 bytes in 64-bit architecture. */ #ifndef RAPIDJSON_48BITPOINTER_OPTIMIZATION #if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) #define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1 #else #define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0 #endif #endif // RAPIDJSON_48BITPOINTER_OPTIMIZATION #if RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1 #if RAPIDJSON_64BIT != 1 #error RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when RAPIDJSON_64BIT=1 #endif #define RAPIDJSON_SETPOINTER(type, p, x) (p = reinterpret_cast((reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0xFFFF0000, 0x00000000))) | reinterpret_cast(reinterpret_cast(x)))) #define RAPIDJSON_GETPOINTER(type, p) (reinterpret_cast(reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFFFF)))) #else #define RAPIDJSON_SETPOINTER(type, p, x) (p = (x)) #define RAPIDJSON_GETPOINTER(type, p) (p) #endif /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_NEON/RAPIDJSON_SIMD /*! \def RAPIDJSON_SIMD \ingroup RAPIDJSON_CONFIG \brief Enable SSE2/SSE4.2/Neon optimization. RapidJSON supports optimized implementations for some parsing operations based on the SSE2, SSE4.2 or NEon SIMD extensions on modern Intel or ARM compatible processors. To enable these optimizations, three different symbols can be defined; \code // Enable SSE2 optimization. #define RAPIDJSON_SSE2 // Enable SSE4.2 optimization. #define RAPIDJSON_SSE42 \endcode // Enable ARM Neon optimization. #define RAPIDJSON_NEON \endcode \c RAPIDJSON_SSE42 takes precedence over SSE2, if both are defined. If any of these symbols is defined, RapidJSON defines the macro \c RAPIDJSON_SIMD to indicate the availability of the optimized code. */ #if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) \ || defined(RAPIDJSON_NEON) || defined(RAPIDJSON_DOXYGEN_RUNNING) #define RAPIDJSON_SIMD #endif /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_NO_SIZETYPEDEFINE #ifndef RAPIDJSON_NO_SIZETYPEDEFINE /*! \def RAPIDJSON_NO_SIZETYPEDEFINE \ingroup RAPIDJSON_CONFIG \brief User-provided \c SizeType definition. In order to avoid using 32-bit size types for indexing strings and arrays, define this preprocessor symbol and provide the type rapidjson::SizeType before including RapidJSON: \code #define RAPIDJSON_NO_SIZETYPEDEFINE namespace rapidjson { typedef ::std::size_t SizeType; } #include "rapidjson/..." \endcode \see rapidjson::SizeType */ #ifdef RAPIDJSON_DOXYGEN_RUNNING #define RAPIDJSON_NO_SIZETYPEDEFINE #endif RAPIDJSON_NAMESPACE_BEGIN //! Size type (for string lengths, array sizes, etc.) /*! RapidJSON uses 32-bit array/string indices even on 64-bit platforms, instead of using \c size_t. Users may override the SizeType by defining \ref RAPIDJSON_NO_SIZETYPEDEFINE. */ typedef unsigned SizeType; RAPIDJSON_NAMESPACE_END #endif // always import std::size_t to rapidjson namespace RAPIDJSON_NAMESPACE_BEGIN using std::size_t; RAPIDJSON_NAMESPACE_END /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_ASSERT //! Assertion. /*! \ingroup RAPIDJSON_CONFIG By default, rapidjson uses C \c assert() for internal assertions. User can override it by defining RAPIDJSON_ASSERT(x) macro. \note Parsing errors are handled and can be customized by the \ref RAPIDJSON_ERRORS APIs. */ #ifndef RAPIDJSON_ASSERT #include #define RAPIDJSON_ASSERT(x) assert(x) #endif // RAPIDJSON_ASSERT /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_STATIC_ASSERT // Prefer C++11 static_assert, if available #ifndef RAPIDJSON_STATIC_ASSERT #if RAPIDJSON_CPLUSPLUS >= 201103L || ( defined(_MSC_VER) && _MSC_VER >= 1800 ) #define RAPIDJSON_STATIC_ASSERT(x) \ static_assert(x, RAPIDJSON_STRINGIFY(x)) #endif // C++11 #endif // RAPIDJSON_STATIC_ASSERT // Adopt C++03 implementation from boost #ifndef RAPIDJSON_STATIC_ASSERT #ifndef __clang__ //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN #endif RAPIDJSON_NAMESPACE_BEGIN template struct STATIC_ASSERTION_FAILURE; template <> struct STATIC_ASSERTION_FAILURE { enum { value = 1 }; }; template struct StaticAssertTest {}; RAPIDJSON_NAMESPACE_END #if defined(__GNUC__) || defined(__clang__) #define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) #else #define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE #endif #ifndef __clang__ //!@endcond #endif /*! \def RAPIDJSON_STATIC_ASSERT \brief (Internal) macro to check for conditions at compile-time \param x compile-time condition \hideinitializer */ #define RAPIDJSON_STATIC_ASSERT(x) \ typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \ sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE)> \ RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE #endif // RAPIDJSON_STATIC_ASSERT /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_LIKELY, RAPIDJSON_UNLIKELY //! Compiler branching hint for expression with high probability to be true. /*! \ingroup RAPIDJSON_CONFIG \param x Boolean expression likely to be true. */ #ifndef RAPIDJSON_LIKELY #if defined(__GNUC__) || defined(__clang__) #define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1) #else #define RAPIDJSON_LIKELY(x) (x) #endif #endif //! Compiler branching hint for expression with low probability to be true. /*! \ingroup RAPIDJSON_CONFIG \param x Boolean expression unlikely to be true. */ #ifndef RAPIDJSON_UNLIKELY #if defined(__GNUC__) || defined(__clang__) #define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0) #else #define RAPIDJSON_UNLIKELY(x) (x) #endif #endif /////////////////////////////////////////////////////////////////////////////// // Helpers //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN #define RAPIDJSON_MULTILINEMACRO_BEGIN do { #define RAPIDJSON_MULTILINEMACRO_END \ } while((void)0, 0) // adopted from Boost #define RAPIDJSON_VERSION_CODE(x,y,z) \ (((x)*100000) + ((y)*100) + (z)) #if defined(__has_builtin) #define RAPIDJSON_HAS_BUILTIN(x) __has_builtin(x) #else #define RAPIDJSON_HAS_BUILTIN(x) 0 #endif /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_DIAG_PUSH/POP, RAPIDJSON_DIAG_OFF #if defined(__GNUC__) #define RAPIDJSON_GNUC \ RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) #endif #if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,2,0)) #define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x)) #define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x) #define RAPIDJSON_DIAG_OFF(x) \ RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x))) // push/pop support in Clang and GCC>=4.6 #if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) #define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) #define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) #else // GCC >= 4.2, < 4.6 #define RAPIDJSON_DIAG_PUSH /* ignored */ #define RAPIDJSON_DIAG_POP /* ignored */ #endif #elif defined(_MSC_VER) // pragma (MSVC specific) #define RAPIDJSON_PRAGMA(x) __pragma(x) #define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x)) #define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x) #define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) #define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) #else #define RAPIDJSON_DIAG_OFF(x) /* ignored */ #define RAPIDJSON_DIAG_PUSH /* ignored */ #define RAPIDJSON_DIAG_POP /* ignored */ #endif // RAPIDJSON_DIAG_* /////////////////////////////////////////////////////////////////////////////// // C++11 features #ifndef RAPIDJSON_HAS_CXX11 #define RAPIDJSON_HAS_CXX11 (RAPIDJSON_CPLUSPLUS >= 201103L) #endif #ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS #if RAPIDJSON_HAS_CXX11 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 #elif defined(__clang__) #if __has_feature(cxx_rvalue_references) && \ (defined(_MSC_VER) || defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306) #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 #else #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 #endif #elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ (defined(_MSC_VER) && _MSC_VER >= 1600) || \ (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 #else #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 #endif #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS #if RAPIDJSON_HAS_CXX11_RVALUE_REFS #include // std::move #endif #ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT #if RAPIDJSON_HAS_CXX11 #define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 #elif defined(__clang__) #define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept) #elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ (defined(_MSC_VER) && _MSC_VER >= 1900) || \ (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) #define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 #else #define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 #endif #endif #ifndef RAPIDJSON_NOEXCEPT #if RAPIDJSON_HAS_CXX11_NOEXCEPT #define RAPIDJSON_NOEXCEPT noexcept #else #define RAPIDJSON_NOEXCEPT throw() #endif // RAPIDJSON_HAS_CXX11_NOEXCEPT #endif // no automatic detection, yet #ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS #if (defined(_MSC_VER) && _MSC_VER >= 1700) #define RAPIDJSON_HAS_CXX11_TYPETRAITS 1 #else #define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 #endif #endif #ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR #if defined(__clang__) #define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for) #elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ (defined(_MSC_VER) && _MSC_VER >= 1700) || \ (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) #define RAPIDJSON_HAS_CXX11_RANGE_FOR 1 #else #define RAPIDJSON_HAS_CXX11_RANGE_FOR 0 #endif #endif // RAPIDJSON_HAS_CXX11_RANGE_FOR /////////////////////////////////////////////////////////////////////////////// // C++17 features #ifndef RAPIDJSON_HAS_CXX17 #define RAPIDJSON_HAS_CXX17 (RAPIDJSON_CPLUSPLUS >= 201703L) #endif #if RAPIDJSON_HAS_CXX17 # define RAPIDJSON_DELIBERATE_FALLTHROUGH [[fallthrough]] #elif defined(__has_cpp_attribute) # if __has_cpp_attribute(clang::fallthrough) # define RAPIDJSON_DELIBERATE_FALLTHROUGH [[clang::fallthrough]] # elif __has_cpp_attribute(fallthrough) # define RAPIDJSON_DELIBERATE_FALLTHROUGH __attribute__((fallthrough)) # else # define RAPIDJSON_DELIBERATE_FALLTHROUGH # endif #else # define RAPIDJSON_DELIBERATE_FALLTHROUGH #endif //!@endcond //! Assertion (in non-throwing contexts). /*! \ingroup RAPIDJSON_CONFIG Some functions provide a \c noexcept guarantee, if the compiler supports it. In these cases, the \ref RAPIDJSON_ASSERT macro cannot be overridden to throw an exception. This macro adds a separate customization point for such cases. Defaults to C \c assert() (as \ref RAPIDJSON_ASSERT), if \c noexcept is supported, and to \ref RAPIDJSON_ASSERT otherwise. */ /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_NOEXCEPT_ASSERT #ifndef RAPIDJSON_NOEXCEPT_ASSERT #ifdef RAPIDJSON_ASSERT_THROWS #include #define RAPIDJSON_NOEXCEPT_ASSERT(x) assert(x) #else #define RAPIDJSON_NOEXCEPT_ASSERT(x) RAPIDJSON_ASSERT(x) #endif // RAPIDJSON_ASSERT_THROWS #endif // RAPIDJSON_NOEXCEPT_ASSERT /////////////////////////////////////////////////////////////////////////////// // malloc/realloc/free #ifndef RAPIDJSON_MALLOC ///! customization point for global \c malloc #define RAPIDJSON_MALLOC(size) std::malloc(size) #endif #ifndef RAPIDJSON_REALLOC ///! customization point for global \c realloc #define RAPIDJSON_REALLOC(ptr, new_size) std::realloc(ptr, new_size) #endif #ifndef RAPIDJSON_FREE ///! customization point for global \c free #define RAPIDJSON_FREE(ptr) std::free(ptr) #endif /////////////////////////////////////////////////////////////////////////////// // new/delete #ifndef RAPIDJSON_NEW ///! customization point for global \c new #define RAPIDJSON_NEW(TypeName) new TypeName #endif #ifndef RAPIDJSON_DELETE ///! customization point for global \c delete #define RAPIDJSON_DELETE(x) delete x #endif /////////////////////////////////////////////////////////////////////////////// // Type /*! \namespace rapidjson \brief main RapidJSON namespace \see RAPIDJSON_NAMESPACE */ RAPIDJSON_NAMESPACE_BEGIN //! Type of JSON value enum Type { kNullType = 0, //!< null kFalseType = 1, //!< false kTrueType = 2, //!< true kObjectType = 3, //!< object kArrayType = 4, //!< array kStringType = 5, //!< string kNumberType = 6 //!< number }; RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_RAPIDJSON_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/fwd.h0000644000000000000000000000764715031566105024274 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_FWD_H_ #define RAPIDJSON_FWD_H_ #include "rapidjson.h" RAPIDJSON_NAMESPACE_BEGIN // encodings.h template struct UTF8; template struct UTF16; template struct UTF16BE; template struct UTF16LE; template struct UTF32; template struct UTF32BE; template struct UTF32LE; template struct ASCII; template struct AutoUTF; template struct Transcoder; // allocators.h class CrtAllocator; template class MemoryPoolAllocator; // stream.h template struct GenericStringStream; typedef GenericStringStream > StringStream; template struct GenericInsituStringStream; typedef GenericInsituStringStream > InsituStringStream; // stringbuffer.h template class GenericStringBuffer; typedef GenericStringBuffer, CrtAllocator> StringBuffer; // filereadstream.h class FileReadStream; // filewritestream.h class FileWriteStream; // memorybuffer.h template struct GenericMemoryBuffer; typedef GenericMemoryBuffer MemoryBuffer; // memorystream.h struct MemoryStream; // reader.h template struct BaseReaderHandler; template class GenericReader; typedef GenericReader, UTF8, CrtAllocator> Reader; // writer.h template class Writer; // prettywriter.h template class PrettyWriter; // document.h template class GenericMember; template class GenericMemberIterator; template struct GenericStringRef; template class GenericValue; typedef GenericValue, MemoryPoolAllocator > Value; template class GenericDocument; typedef GenericDocument, MemoryPoolAllocator, CrtAllocator> Document; // pointer.h template class GenericPointer; typedef GenericPointer Pointer; // schema.h template class IGenericRemoteSchemaDocumentProvider; template class GenericSchemaDocument; typedef GenericSchemaDocument SchemaDocument; typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; template < typename SchemaDocumentType, typename OutputHandler, typename StateAllocator> class GenericSchemaValidator; typedef GenericSchemaValidator, void>, CrtAllocator> SchemaValidator; RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_RAPIDJSONFWD_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/uri.h0000644000000000000000000004645015031566105024306 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // (C) Copyright IBM Corporation 2021 // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_URI_H_ #define RAPIDJSON_URI_H_ #include "internal/strfunc.h" #if defined(__clang__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(c++98-compat) #elif defined(_MSC_VER) RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated #endif RAPIDJSON_NAMESPACE_BEGIN /////////////////////////////////////////////////////////////////////////////// // GenericUri template class GenericUri { public: typedef typename ValueType::Ch Ch; #if RAPIDJSON_HAS_STDSTRING typedef std::basic_string String; #endif //! Constructors GenericUri(Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { } GenericUri(const Ch* uri, SizeType len, Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { Parse(uri, len); } GenericUri(const Ch* uri, Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { Parse(uri, internal::StrLen(uri)); } // Use with specializations of GenericValue template GenericUri(const T& uri, Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { const Ch* u = uri.template Get(); // TypeHelper from document.h Parse(u, internal::StrLen(u)); } #if RAPIDJSON_HAS_STDSTRING GenericUri(const String& uri, Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { Parse(uri.c_str(), internal::StrLen(uri.c_str())); } #endif //! Copy constructor GenericUri(const GenericUri& rhs) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(), ownAllocator_() { *this = rhs; } //! Copy constructor GenericUri(const GenericUri& rhs, Allocator* allocator) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { *this = rhs; } //! Destructor. ~GenericUri() { Free(); RAPIDJSON_DELETE(ownAllocator_); } //! Assignment operator GenericUri& operator=(const GenericUri& rhs) { if (this != &rhs) { // Do not delete ownAllocator Free(); Allocate(rhs.GetStringLength()); auth_ = CopyPart(scheme_, rhs.scheme_, rhs.GetSchemeStringLength()); path_ = CopyPart(auth_, rhs.auth_, rhs.GetAuthStringLength()); query_ = CopyPart(path_, rhs.path_, rhs.GetPathStringLength()); frag_ = CopyPart(query_, rhs.query_, rhs.GetQueryStringLength()); base_ = CopyPart(frag_, rhs.frag_, rhs.GetFragStringLength()); uri_ = CopyPart(base_, rhs.base_, rhs.GetBaseStringLength()); CopyPart(uri_, rhs.uri_, rhs.GetStringLength()); } return *this; } //! Getters // Use with specializations of GenericValue template void Get(T& uri, Allocator& allocator) { uri.template Set(this->GetString(), allocator); // TypeHelper from document.h } const Ch* GetString() const { return uri_; } SizeType GetStringLength() const { return uri_ == 0 ? 0 : internal::StrLen(uri_); } const Ch* GetBaseString() const { return base_; } SizeType GetBaseStringLength() const { return base_ == 0 ? 0 : internal::StrLen(base_); } const Ch* GetSchemeString() const { return scheme_; } SizeType GetSchemeStringLength() const { return scheme_ == 0 ? 0 : internal::StrLen(scheme_); } const Ch* GetAuthString() const { return auth_; } SizeType GetAuthStringLength() const { return auth_ == 0 ? 0 : internal::StrLen(auth_); } const Ch* GetPathString() const { return path_; } SizeType GetPathStringLength() const { return path_ == 0 ? 0 : internal::StrLen(path_); } const Ch* GetQueryString() const { return query_; } SizeType GetQueryStringLength() const { return query_ == 0 ? 0 : internal::StrLen(query_); } const Ch* GetFragString() const { return frag_; } SizeType GetFragStringLength() const { return frag_ == 0 ? 0 : internal::StrLen(frag_); } #if RAPIDJSON_HAS_STDSTRING static String Get(const GenericUri& uri) { return String(uri.GetString(), uri.GetStringLength()); } static String GetBase(const GenericUri& uri) { return String(uri.GetBaseString(), uri.GetBaseStringLength()); } static String GetScheme(const GenericUri& uri) { return String(uri.GetSchemeString(), uri.GetSchemeStringLength()); } static String GetAuth(const GenericUri& uri) { return String(uri.GetAuthString(), uri.GetAuthStringLength()); } static String GetPath(const GenericUri& uri) { return String(uri.GetPathString(), uri.GetPathStringLength()); } static String GetQuery(const GenericUri& uri) { return String(uri.GetQueryString(), uri.GetQueryStringLength()); } static String GetFrag(const GenericUri& uri) { return String(uri.GetFragString(), uri.GetFragStringLength()); } #endif //! Equality operators bool operator==(const GenericUri& rhs) const { return Match(rhs, true); } bool operator!=(const GenericUri& rhs) const { return !Match(rhs, true); } bool Match(const GenericUri& uri, bool full = true) const { Ch* s1; Ch* s2; if (full) { s1 = uri_; s2 = uri.uri_; } else { s1 = base_; s2 = uri.base_; } if (s1 == s2) return true; if (s1 == 0 || s2 == 0) return false; return internal::StrCmp(s1, s2) == 0; } //! Resolve this URI against another (base) URI in accordance with URI resolution rules. // See https://tools.ietf.org/html/rfc3986 // Use for resolving an id or $ref with an in-scope id. // Returns a new GenericUri for the resolved URI. GenericUri Resolve(const GenericUri& baseuri, Allocator* allocator = 0) { GenericUri resuri; resuri.allocator_ = allocator; // Ensure enough space for combining paths resuri.Allocate(GetStringLength() + baseuri.GetStringLength() + 1); // + 1 for joining slash if (!(GetSchemeStringLength() == 0)) { // Use all of this URI resuri.auth_ = CopyPart(resuri.scheme_, scheme_, GetSchemeStringLength()); resuri.path_ = CopyPart(resuri.auth_, auth_, GetAuthStringLength()); resuri.query_ = CopyPart(resuri.path_, path_, GetPathStringLength()); resuri.frag_ = CopyPart(resuri.query_, query_, GetQueryStringLength()); resuri.RemoveDotSegments(); } else { // Use the base scheme resuri.auth_ = CopyPart(resuri.scheme_, baseuri.scheme_, baseuri.GetSchemeStringLength()); if (!(GetAuthStringLength() == 0)) { // Use this auth, path, query resuri.path_ = CopyPart(resuri.auth_, auth_, GetAuthStringLength()); resuri.query_ = CopyPart(resuri.path_, path_, GetPathStringLength()); resuri.frag_ = CopyPart(resuri.query_, query_, GetQueryStringLength()); resuri.RemoveDotSegments(); } else { // Use the base auth resuri.path_ = CopyPart(resuri.auth_, baseuri.auth_, baseuri.GetAuthStringLength()); if (GetPathStringLength() == 0) { // Use the base path resuri.query_ = CopyPart(resuri.path_, baseuri.path_, baseuri.GetPathStringLength()); if (GetQueryStringLength() == 0) { // Use the base query resuri.frag_ = CopyPart(resuri.query_, baseuri.query_, baseuri.GetQueryStringLength()); } else { // Use this query resuri.frag_ = CopyPart(resuri.query_, query_, GetQueryStringLength()); } } else { if (path_[0] == '/') { // Absolute path - use all of this path resuri.query_ = CopyPart(resuri.path_, path_, GetPathStringLength()); resuri.RemoveDotSegments(); } else { // Relative path - append this path to base path after base path's last slash size_t pos = 0; if (!(baseuri.GetAuthStringLength() == 0) && baseuri.GetPathStringLength() == 0) { resuri.path_[pos] = '/'; pos++; } size_t lastslashpos = baseuri.GetPathStringLength(); while (lastslashpos > 0) { if (baseuri.path_[lastslashpos - 1] == '/') break; lastslashpos--; } std::memcpy(&resuri.path_[pos], baseuri.path_, lastslashpos * sizeof(Ch)); pos += lastslashpos; resuri.query_ = CopyPart(&resuri.path_[pos], path_, GetPathStringLength()); resuri.RemoveDotSegments(); } // Use this query resuri.frag_ = CopyPart(resuri.query_, query_, GetQueryStringLength()); } } } // Always use this frag resuri.base_ = CopyPart(resuri.frag_, frag_, GetFragStringLength()); // Re-constitute base_ and uri_ resuri.SetBase(); resuri.uri_ = resuri.base_ + resuri.GetBaseStringLength() + 1; resuri.SetUri(); return resuri; } //! Get the allocator of this GenericUri. Allocator& GetAllocator() { return *allocator_; } private: // Allocate memory for a URI // Returns total amount allocated std::size_t Allocate(std::size_t len) { // Create own allocator if user did not supply. if (!allocator_) ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); // Allocate one block containing each part of the URI (5) plus base plus full URI, all null terminated. // Order: scheme, auth, path, query, frag, base, uri // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. size_t total = (3 * len + 7) * sizeof(Ch); scheme_ = static_cast(allocator_->Malloc(total)); *scheme_ = '\0'; auth_ = scheme_; auth_++; *auth_ = '\0'; path_ = auth_; path_++; *path_ = '\0'; query_ = path_; query_++; *query_ = '\0'; frag_ = query_; frag_++; *frag_ = '\0'; base_ = frag_; base_++; *base_ = '\0'; uri_ = base_; uri_++; *uri_ = '\0'; return total; } // Free memory for a URI void Free() { if (scheme_) { Allocator::Free(scheme_); scheme_ = 0; } } // Parse a URI into constituent scheme, authority, path, query, & fragment parts // Supports URIs that match regex ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? as per // https://tools.ietf.org/html/rfc3986 void Parse(const Ch* uri, std::size_t len) { std::size_t start = 0, pos1 = 0, pos2 = 0; Allocate(len); // Look for scheme ([^:/?#]+):)? if (start < len) { while (pos1 < len) { if (uri[pos1] == ':') break; pos1++; } if (pos1 != len) { while (pos2 < len) { if (uri[pos2] == '/') break; if (uri[pos2] == '?') break; if (uri[pos2] == '#') break; pos2++; } if (pos1 < pos2) { pos1++; std::memcpy(scheme_, &uri[start], pos1 * sizeof(Ch)); scheme_[pos1] = '\0'; start = pos1; } } } // Look for auth (//([^/?#]*))? // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. auth_ = scheme_ + GetSchemeStringLength(); auth_++; *auth_ = '\0'; if (start < len - 1 && uri[start] == '/' && uri[start + 1] == '/') { pos2 = start + 2; while (pos2 < len) { if (uri[pos2] == '/') break; if (uri[pos2] == '?') break; if (uri[pos2] == '#') break; pos2++; } std::memcpy(auth_, &uri[start], (pos2 - start) * sizeof(Ch)); auth_[pos2 - start] = '\0'; start = pos2; } // Look for path ([^?#]*) // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. path_ = auth_ + GetAuthStringLength(); path_++; *path_ = '\0'; if (start < len) { pos2 = start; while (pos2 < len) { if (uri[pos2] == '?') break; if (uri[pos2] == '#') break; pos2++; } if (start != pos2) { std::memcpy(path_, &uri[start], (pos2 - start) * sizeof(Ch)); path_[pos2 - start] = '\0'; if (path_[0] == '/') RemoveDotSegments(); // absolute path - normalize start = pos2; } } // Look for query (\?([^#]*))? // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. query_ = path_ + GetPathStringLength(); query_++; *query_ = '\0'; if (start < len && uri[start] == '?') { pos2 = start + 1; while (pos2 < len) { if (uri[pos2] == '#') break; pos2++; } if (start != pos2) { std::memcpy(query_, &uri[start], (pos2 - start) * sizeof(Ch)); query_[pos2 - start] = '\0'; start = pos2; } } // Look for fragment (#(.*))? // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. frag_ = query_ + GetQueryStringLength(); frag_++; *frag_ = '\0'; if (start < len && uri[start] == '#') { std::memcpy(frag_, &uri[start], (len - start) * sizeof(Ch)); frag_[len - start] = '\0'; } // Re-constitute base_ and uri_ base_ = frag_ + GetFragStringLength() + 1; SetBase(); uri_ = base_ + GetBaseStringLength() + 1; SetUri(); } // Reconstitute base void SetBase() { Ch* next = base_; std::memcpy(next, scheme_, GetSchemeStringLength() * sizeof(Ch)); next+= GetSchemeStringLength(); std::memcpy(next, auth_, GetAuthStringLength() * sizeof(Ch)); next+= GetAuthStringLength(); std::memcpy(next, path_, GetPathStringLength() * sizeof(Ch)); next+= GetPathStringLength(); std::memcpy(next, query_, GetQueryStringLength() * sizeof(Ch)); next+= GetQueryStringLength(); *next = '\0'; } // Reconstitute uri void SetUri() { Ch* next = uri_; std::memcpy(next, base_, GetBaseStringLength() * sizeof(Ch)); next+= GetBaseStringLength(); std::memcpy(next, frag_, GetFragStringLength() * sizeof(Ch)); next+= GetFragStringLength(); *next = '\0'; } // Copy a part from one GenericUri to another // Return the pointer to the next part to be copied to Ch* CopyPart(Ch* to, Ch* from, std::size_t len) { RAPIDJSON_ASSERT(to != 0); RAPIDJSON_ASSERT(from != 0); std::memcpy(to, from, len * sizeof(Ch)); to[len] = '\0'; Ch* next = to + len + 1; return next; } // Remove . and .. segments from the path_ member. // https://tools.ietf.org/html/rfc3986 // This is done in place as we are only removing segments. void RemoveDotSegments() { std::size_t pathlen = GetPathStringLength(); std::size_t pathpos = 0; // Position in path_ std::size_t newpos = 0; // Position in new path_ // Loop through each segment in original path_ while (pathpos < pathlen) { // Get next segment, bounded by '/' or end size_t slashpos = 0; while ((pathpos + slashpos) < pathlen) { if (path_[pathpos + slashpos] == '/') break; slashpos++; } // Check for .. and . segments if (slashpos == 2 && path_[pathpos] == '.' && path_[pathpos + 1] == '.') { // Backup a .. segment in the new path_ // We expect to find a previously added slash at the end or nothing RAPIDJSON_ASSERT(newpos == 0 || path_[newpos - 1] == '/'); size_t lastslashpos = newpos; // Make sure we don't go beyond the start segment if (lastslashpos > 1) { // Find the next to last slash and back up to it lastslashpos--; while (lastslashpos > 0) { if (path_[lastslashpos - 1] == '/') break; lastslashpos--; } // Set the new path_ position newpos = lastslashpos; } } else if (slashpos == 1 && path_[pathpos] == '.') { // Discard . segment, leaves new path_ unchanged } else { // Move any other kind of segment to the new path_ RAPIDJSON_ASSERT(newpos <= pathpos); std::memmove(&path_[newpos], &path_[pathpos], slashpos * sizeof(Ch)); newpos += slashpos; // Add slash if not at end if ((pathpos + slashpos) < pathlen) { path_[newpos] = '/'; newpos++; } } // Move to next segment pathpos += slashpos + 1; } path_[newpos] = '\0'; } Ch* uri_; // Everything Ch* base_; // Everything except fragment Ch* scheme_; // Includes the : Ch* auth_; // Includes the // Ch* path_; // Absolute if starts with / Ch* query_; // Includes the ? Ch* frag_; // Includes the # Allocator* allocator_; //!< The current allocator. It is either user-supplied or equal to ownAllocator_. Allocator* ownAllocator_; //!< Allocator owned by this Uri. }; //! GenericUri for Value (UTF-8, default allocator). typedef GenericUri Uri; RAPIDJSON_NAMESPACE_END #if defined(__clang__) RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_URI_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/ostreamwrapper.h0000644000000000000000000000437715031566105026564 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_OSTREAMWRAPPER_H_ #define RAPIDJSON_OSTREAMWRAPPER_H_ #include "stream.h" #include #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(padded) #endif RAPIDJSON_NAMESPACE_BEGIN //! Wrapper of \c std::basic_ostream into RapidJSON's Stream concept. /*! The classes can be wrapped including but not limited to: - \c std::ostringstream - \c std::stringstream - \c std::wpstringstream - \c std::wstringstream - \c std::ifstream - \c std::fstream - \c std::wofstream - \c std::wfstream \tparam StreamType Class derived from \c std::basic_ostream. */ template class BasicOStreamWrapper { public: typedef typename StreamType::char_type Ch; BasicOStreamWrapper(StreamType& stream) : stream_(stream) {} void Put(Ch c) { stream_.put(c); } void Flush() { stream_.flush(); } // Not implemented char Peek() const { RAPIDJSON_ASSERT(false); return 0; } char Take() { RAPIDJSON_ASSERT(false); return 0; } size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } private: BasicOStreamWrapper(const BasicOStreamWrapper&); BasicOStreamWrapper& operator=(const BasicOStreamWrapper&); StreamType& stream_; }; typedef BasicOStreamWrapper OStreamWrapper; typedef BasicOStreamWrapper WOStreamWrapper; #ifdef __clang__ RAPIDJSON_DIAG_POP #endif RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_OSTREAMWRAPPER_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/schema.h0000644000000000000000000043647715031566105024763 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available-> // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip-> All rights reserved-> // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License-> You may obtain a copy of the License at // // http://opensource->org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied-> See the License for the // specific language governing permissions and limitations under the License-> #ifndef RAPIDJSON_SCHEMA_H_ #define RAPIDJSON_SCHEMA_H_ #include "document.h" #include "pointer.h" #include "stringbuffer.h" #include "error/en.h" #include "uri.h" #include // abs, floor #if !defined(RAPIDJSON_SCHEMA_USE_INTERNALREGEX) #define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 1 #else #define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 0 #endif #if !RAPIDJSON_SCHEMA_USE_INTERNALREGEX && defined(RAPIDJSON_SCHEMA_USE_STDREGEX) && (__cplusplus >=201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)) #define RAPIDJSON_SCHEMA_USE_STDREGEX 1 #else #define RAPIDJSON_SCHEMA_USE_STDREGEX 0 #endif #if RAPIDJSON_SCHEMA_USE_INTERNALREGEX #include "internal/regex.h" #elif RAPIDJSON_SCHEMA_USE_STDREGEX #include #endif #if RAPIDJSON_SCHEMA_USE_INTERNALREGEX || RAPIDJSON_SCHEMA_USE_STDREGEX #define RAPIDJSON_SCHEMA_HAS_REGEX 1 #else #define RAPIDJSON_SCHEMA_HAS_REGEX 0 #endif #ifndef RAPIDJSON_SCHEMA_VERBOSE #define RAPIDJSON_SCHEMA_VERBOSE 0 #endif RAPIDJSON_DIAG_PUSH #if defined(__GNUC__) RAPIDJSON_DIAG_OFF(effc++) #endif #ifdef __clang__ RAPIDJSON_DIAG_OFF(weak-vtables) RAPIDJSON_DIAG_OFF(exit-time-destructors) RAPIDJSON_DIAG_OFF(c++98-compat-pedantic) RAPIDJSON_DIAG_OFF(variadic-macros) #elif defined(_MSC_VER) RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated #endif RAPIDJSON_NAMESPACE_BEGIN /////////////////////////////////////////////////////////////////////////////// // Verbose Utilities #if RAPIDJSON_SCHEMA_VERBOSE namespace internal { inline void PrintInvalidKeywordData(const char* keyword) { printf(" Fail keyword: '%s'\n", keyword); } inline void PrintInvalidKeywordData(const wchar_t* keyword) { wprintf(L" Fail keyword: '%ls'\n", keyword); } inline void PrintInvalidDocumentData(const char* document) { printf(" Fail document: '%s'\n", document); } inline void PrintInvalidDocumentData(const wchar_t* document) { wprintf(L" Fail document: '%ls'\n", document); } inline void PrintValidatorPointersData(const char* s, const char* d, unsigned depth) { printf(" Sch: %*s'%s'\n Doc: %*s'%s'\n", depth * 4, " ", s, depth * 4, " ", d); } inline void PrintValidatorPointersData(const wchar_t* s, const wchar_t* d, unsigned depth) { wprintf(L" Sch: %*ls'%ls'\n Doc: %*ls'%ls'\n", depth * 4, L" ", s, depth * 4, L" ", d); } inline void PrintSchemaIdsData(const char* base, const char* local, const char* resolved) { printf(" Resolving id: Base: '%s', Local: '%s', Resolved: '%s'\n", base, local, resolved); } inline void PrintSchemaIdsData(const wchar_t* base, const wchar_t* local, const wchar_t* resolved) { wprintf(L" Resolving id: Base: '%ls', Local: '%ls', Resolved: '%ls'\n", base, local, resolved); } inline void PrintMethodData(const char* method) { printf("%s\n", method); } inline void PrintMethodData(const char* method, bool b) { printf("%s, Data: '%s'\n", method, b ? "true" : "false"); } inline void PrintMethodData(const char* method, int64_t i) { printf("%s, Data: '%" PRId64 "'\n", method, i); } inline void PrintMethodData(const char* method, uint64_t u) { printf("%s, Data: '%" PRIu64 "'\n", method, u); } inline void PrintMethodData(const char* method, double d) { printf("%s, Data: '%lf'\n", method, d); } inline void PrintMethodData(const char* method, const char* s) { printf("%s, Data: '%s'\n", method, s); } inline void PrintMethodData(const char* method, const wchar_t* s) { wprintf(L"%hs, Data: '%ls'\n", method, s); } inline void PrintMethodData(const char* method, const char* s1, const char* s2) { printf("%s, Data: '%s', '%s'\n", method, s1, s2); } inline void PrintMethodData(const char* method, const wchar_t* s1, const wchar_t* s2) { wprintf(L"%hs, Data: '%ls', '%ls'\n", method, s1, s2); } } // namespace internal #endif // RAPIDJSON_SCHEMA_VERBOSE #ifndef RAPIDJSON_SCHEMA_PRINT #if RAPIDJSON_SCHEMA_VERBOSE #define RAPIDJSON_SCHEMA_PRINT(name, ...) internal::Print##name##Data(__VA_ARGS__) #else #define RAPIDJSON_SCHEMA_PRINT(name, ...) #endif #endif /////////////////////////////////////////////////////////////////////////////// // RAPIDJSON_INVALID_KEYWORD_RETURN #define RAPIDJSON_INVALID_KEYWORD_RETURN(code)\ RAPIDJSON_MULTILINEMACRO_BEGIN\ context.invalidCode = code;\ context.invalidKeyword = SchemaType::GetValidateErrorKeyword(code).GetString();\ RAPIDJSON_SCHEMA_PRINT(InvalidKeyword, context.invalidKeyword);\ return false;\ RAPIDJSON_MULTILINEMACRO_END /////////////////////////////////////////////////////////////////////////////// // ValidateFlag /*! \def RAPIDJSON_VALIDATE_DEFAULT_FLAGS \ingroup RAPIDJSON_CONFIG \brief User-defined kValidateDefaultFlags definition. User can define this as any \c ValidateFlag combinations. */ #ifndef RAPIDJSON_VALIDATE_DEFAULT_FLAGS #define RAPIDJSON_VALIDATE_DEFAULT_FLAGS kValidateNoFlags #endif //! Combination of validate flags /*! \see */ enum ValidateFlag { kValidateNoFlags = 0, //!< No flags are set. kValidateContinueOnErrorFlag = 1, //!< Don't stop after first validation error. kValidateReadFlag = 2, //!< Validation is for a read semantic. kValidateWriteFlag = 4, //!< Validation is for a write semantic. kValidateDefaultFlags = RAPIDJSON_VALIDATE_DEFAULT_FLAGS //!< Default validate flags. Can be customized by defining RAPIDJSON_VALIDATE_DEFAULT_FLAGS }; /////////////////////////////////////////////////////////////////////////////// // Specification enum SchemaDraft { kDraftUnknown = -1, kDraftNone = 0, kDraft03 = 3, kDraftMin = 4, //!< Current minimum supported draft kDraft04 = 4, kDraft05 = 5, kDraftMax = 5, //!< Current maximum supported draft kDraft06 = 6, kDraft07 = 7, kDraft2019_09 = 8, kDraft2020_12 = 9 }; enum OpenApiVersion { kVersionUnknown = -1, kVersionNone = 0, kVersionMin = 2, //!< Current minimum supported version kVersion20 = 2, kVersion30 = 3, kVersionMax = 3, //!< Current maximum supported version kVersion31 = 4, }; struct Specification { Specification(SchemaDraft d) : draft(d), oapi(kVersionNone) {} Specification(OpenApiVersion o) : oapi(o) { if (oapi == kVersion20) draft = kDraft04; else if (oapi == kVersion30) draft = kDraft05; else if (oapi == kVersion31) draft = kDraft2020_12; else draft = kDraft04; } ~Specification() {} bool IsSupported() const { return ((draft >= kDraftMin && draft <= kDraftMax) && ((oapi == kVersionNone) || (oapi >= kVersionMin && oapi <= kVersionMax))); } SchemaDraft draft; OpenApiVersion oapi; }; /////////////////////////////////////////////////////////////////////////////// // Forward declarations template class GenericSchemaDocument; namespace internal { template class Schema; /////////////////////////////////////////////////////////////////////////////// // ISchemaValidator class ISchemaValidator { public: virtual ~ISchemaValidator() {} virtual bool IsValid() const = 0; virtual void SetValidateFlags(unsigned flags) = 0; virtual unsigned GetValidateFlags() const = 0; }; /////////////////////////////////////////////////////////////////////////////// // ISchemaStateFactory template class ISchemaStateFactory { public: virtual ~ISchemaStateFactory() {} virtual ISchemaValidator* CreateSchemaValidator(const SchemaType&, const bool inheritContinueOnErrors) = 0; virtual void DestroySchemaValidator(ISchemaValidator* validator) = 0; virtual void* CreateHasher() = 0; virtual uint64_t GetHashCode(void* hasher) = 0; virtual void DestroryHasher(void* hasher) = 0; virtual void* MallocState(size_t size) = 0; virtual void FreeState(void* p) = 0; }; /////////////////////////////////////////////////////////////////////////////// // IValidationErrorHandler template class IValidationErrorHandler { public: typedef typename SchemaType::Ch Ch; typedef typename SchemaType::SValue SValue; virtual ~IValidationErrorHandler() {} virtual void NotMultipleOf(int64_t actual, const SValue& expected) = 0; virtual void NotMultipleOf(uint64_t actual, const SValue& expected) = 0; virtual void NotMultipleOf(double actual, const SValue& expected) = 0; virtual void AboveMaximum(int64_t actual, const SValue& expected, bool exclusive) = 0; virtual void AboveMaximum(uint64_t actual, const SValue& expected, bool exclusive) = 0; virtual void AboveMaximum(double actual, const SValue& expected, bool exclusive) = 0; virtual void BelowMinimum(int64_t actual, const SValue& expected, bool exclusive) = 0; virtual void BelowMinimum(uint64_t actual, const SValue& expected, bool exclusive) = 0; virtual void BelowMinimum(double actual, const SValue& expected, bool exclusive) = 0; virtual void TooLong(const Ch* str, SizeType length, SizeType expected) = 0; virtual void TooShort(const Ch* str, SizeType length, SizeType expected) = 0; virtual void DoesNotMatch(const Ch* str, SizeType length) = 0; virtual void DisallowedItem(SizeType index) = 0; virtual void TooFewItems(SizeType actualCount, SizeType expectedCount) = 0; virtual void TooManyItems(SizeType actualCount, SizeType expectedCount) = 0; virtual void DuplicateItems(SizeType index1, SizeType index2) = 0; virtual void TooManyProperties(SizeType actualCount, SizeType expectedCount) = 0; virtual void TooFewProperties(SizeType actualCount, SizeType expectedCount) = 0; virtual void StartMissingProperties() = 0; virtual void AddMissingProperty(const SValue& name) = 0; virtual bool EndMissingProperties() = 0; virtual void PropertyViolations(ISchemaValidator** subvalidators, SizeType count) = 0; virtual void DisallowedProperty(const Ch* name, SizeType length) = 0; virtual void StartDependencyErrors() = 0; virtual void StartMissingDependentProperties() = 0; virtual void AddMissingDependentProperty(const SValue& targetName) = 0; virtual void EndMissingDependentProperties(const SValue& sourceName) = 0; virtual void AddDependencySchemaError(const SValue& souceName, ISchemaValidator* subvalidator) = 0; virtual bool EndDependencyErrors() = 0; virtual void DisallowedValue(const ValidateErrorCode code) = 0; virtual void StartDisallowedType() = 0; virtual void AddExpectedType(const typename SchemaType::ValueType& expectedType) = 0; virtual void EndDisallowedType(const typename SchemaType::ValueType& actualType) = 0; virtual void NotAllOf(ISchemaValidator** subvalidators, SizeType count) = 0; virtual void NoneOf(ISchemaValidator** subvalidators, SizeType count) = 0; virtual void NotOneOf(ISchemaValidator** subvalidators, SizeType count) = 0; virtual void MultipleOneOf(SizeType index1, SizeType index2) = 0; virtual void Disallowed() = 0; virtual void DisallowedWhenWriting() = 0; virtual void DisallowedWhenReading() = 0; }; /////////////////////////////////////////////////////////////////////////////// // Hasher // For comparison of compound value template class Hasher { public: typedef typename Encoding::Ch Ch; Hasher(Allocator* allocator = 0, size_t stackCapacity = kDefaultSize) : stack_(allocator, stackCapacity) {} bool Null() { return WriteType(kNullType); } bool Bool(bool b) { return WriteType(b ? kTrueType : kFalseType); } bool Int(int i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } bool Uint(unsigned u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } bool Int64(int64_t i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } bool Uint64(uint64_t u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } bool Double(double d) { Number n; if (d < 0) n.u.i = static_cast(d); else n.u.u = static_cast(d); n.d = d; return WriteNumber(n); } bool RawNumber(const Ch* str, SizeType len, bool) { WriteBuffer(kNumberType, str, len * sizeof(Ch)); return true; } bool String(const Ch* str, SizeType len, bool) { WriteBuffer(kStringType, str, len * sizeof(Ch)); return true; } bool StartObject() { return true; } bool Key(const Ch* str, SizeType len, bool copy) { return String(str, len, copy); } bool EndObject(SizeType memberCount) { uint64_t h = Hash(0, kObjectType); uint64_t* kv = stack_.template Pop(memberCount * 2); for (SizeType i = 0; i < memberCount; i++) h ^= Hash(kv[i * 2], kv[i * 2 + 1]); // Use xor to achieve member order insensitive *stack_.template Push() = h; return true; } bool StartArray() { return true; } bool EndArray(SizeType elementCount) { uint64_t h = Hash(0, kArrayType); uint64_t* e = stack_.template Pop(elementCount); for (SizeType i = 0; i < elementCount; i++) h = Hash(h, e[i]); // Use hash to achieve element order sensitive *stack_.template Push() = h; return true; } bool IsValid() const { return stack_.GetSize() == sizeof(uint64_t); } uint64_t GetHashCode() const { RAPIDJSON_ASSERT(IsValid()); return *stack_.template Top(); } private: static const size_t kDefaultSize = 256; struct Number { union U { uint64_t u; int64_t i; }u; double d; }; bool WriteType(Type type) { return WriteBuffer(type, 0, 0); } bool WriteNumber(const Number& n) { return WriteBuffer(kNumberType, &n, sizeof(n)); } bool WriteBuffer(Type type, const void* data, size_t len) { // FNV-1a from http://isthe.com/chongo/tech/comp/fnv/ uint64_t h = Hash(RAPIDJSON_UINT64_C2(0x84222325, 0xcbf29ce4), type); const unsigned char* d = static_cast(data); for (size_t i = 0; i < len; i++) h = Hash(h, d[i]); *stack_.template Push() = h; return true; } static uint64_t Hash(uint64_t h, uint64_t d) { static const uint64_t kPrime = RAPIDJSON_UINT64_C2(0x00000100, 0x000001b3); h ^= d; h *= kPrime; return h; } Stack stack_; }; /////////////////////////////////////////////////////////////////////////////// // SchemaValidationContext template struct SchemaValidationContext { typedef Schema SchemaType; typedef ISchemaStateFactory SchemaValidatorFactoryType; typedef IValidationErrorHandler ErrorHandlerType; typedef typename SchemaType::ValueType ValueType; typedef typename ValueType::Ch Ch; enum PatternValidatorType { kPatternValidatorOnly, kPatternValidatorWithProperty, kPatternValidatorWithAdditionalProperty }; SchemaValidationContext(SchemaValidatorFactoryType& f, ErrorHandlerType& eh, const SchemaType* s, unsigned fl = 0) : factory(f), error_handler(eh), schema(s), flags(fl), valueSchema(), invalidKeyword(), invalidCode(), hasher(), arrayElementHashCodes(), validators(), validatorCount(), patternPropertiesValidators(), patternPropertiesValidatorCount(), patternPropertiesSchemas(), patternPropertiesSchemaCount(), valuePatternValidatorType(kPatternValidatorOnly), propertyExist(), inArray(false), valueUniqueness(false), arrayUniqueness(false) { } ~SchemaValidationContext() { if (hasher) factory.DestroryHasher(hasher); if (validators) { for (SizeType i = 0; i < validatorCount; i++) { if (validators[i]) { factory.DestroySchemaValidator(validators[i]); } } factory.FreeState(validators); } if (patternPropertiesValidators) { for (SizeType i = 0; i < patternPropertiesValidatorCount; i++) { if (patternPropertiesValidators[i]) { factory.DestroySchemaValidator(patternPropertiesValidators[i]); } } factory.FreeState(patternPropertiesValidators); } if (patternPropertiesSchemas) factory.FreeState(patternPropertiesSchemas); if (propertyExist) factory.FreeState(propertyExist); } SchemaValidatorFactoryType& factory; ErrorHandlerType& error_handler; const SchemaType* schema; unsigned flags; const SchemaType* valueSchema; const Ch* invalidKeyword; ValidateErrorCode invalidCode; void* hasher; // Only validator access void* arrayElementHashCodes; // Only validator access this ISchemaValidator** validators; SizeType validatorCount; ISchemaValidator** patternPropertiesValidators; SizeType patternPropertiesValidatorCount; const SchemaType** patternPropertiesSchemas; SizeType patternPropertiesSchemaCount; PatternValidatorType valuePatternValidatorType; PatternValidatorType objectPatternValidatorType; SizeType arrayElementIndex; bool* propertyExist; bool inArray; bool valueUniqueness; bool arrayUniqueness; }; /////////////////////////////////////////////////////////////////////////////// // Schema template class Schema { public: typedef typename SchemaDocumentType::ValueType ValueType; typedef typename SchemaDocumentType::AllocatorType AllocatorType; typedef typename SchemaDocumentType::PointerType PointerType; typedef typename ValueType::EncodingType EncodingType; typedef typename EncodingType::Ch Ch; typedef SchemaValidationContext Context; typedef Schema SchemaType; typedef GenericValue SValue; typedef IValidationErrorHandler ErrorHandler; typedef GenericUri UriType; friend class GenericSchemaDocument; Schema(SchemaDocumentType* schemaDocument, const PointerType& p, const ValueType& value, const ValueType& document, AllocatorType* allocator, const UriType& id = UriType()) : allocator_(allocator), uri_(schemaDocument->GetURI(), *allocator), id_(id, allocator), spec_(schemaDocument->GetSpecification()), pointer_(p, allocator), typeless_(schemaDocument->GetTypeless()), enum_(), enumCount_(), not_(), type_((1 << kTotalSchemaType) - 1), // typeless validatorCount_(), notValidatorIndex_(), properties_(), additionalPropertiesSchema_(), patternProperties_(), patternPropertyCount_(), propertyCount_(), minProperties_(), maxProperties_(SizeType(~0)), additionalProperties_(true), hasDependencies_(), hasRequired_(), hasSchemaDependencies_(), additionalItemsSchema_(), itemsList_(), itemsTuple_(), itemsTupleCount_(), minItems_(), maxItems_(SizeType(~0)), additionalItems_(true), uniqueItems_(false), pattern_(), minLength_(0), maxLength_(~SizeType(0)), exclusiveMinimum_(false), exclusiveMaximum_(false), defaultValueLength_(0), readOnly_(false), writeOnly_(false), nullable_(false) { GenericStringBuffer sb; p.StringifyUriFragment(sb); RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Schema", sb.GetString(), id.GetString()); typedef typename ValueType::ConstValueIterator ConstValueIterator; typedef typename ValueType::ConstMemberIterator ConstMemberIterator; // PR #1393 // Early add this Schema and its $ref(s) in schemaDocument's map to avoid infinite // recursion (with recursive schemas), since schemaDocument->getSchema() is always // checked before creating a new one. Don't cache typeless_, though. if (this != typeless_) { typedef typename SchemaDocumentType::SchemaEntry SchemaEntry; SchemaEntry *entry = schemaDocument->schemaMap_.template Push(); new (entry) SchemaEntry(pointer_, this, true, allocator_); schemaDocument->AddSchemaRefs(this); } if (!value.IsObject()) return; // If we have an id property, resolve it with the in-scope id // Not supported for open api 2.0 or 3.0 if (spec_.oapi != kVersion20 && spec_.oapi != kVersion30) if (const ValueType* v = GetMember(value, GetIdString())) { if (v->IsString()) { UriType local(*v, allocator); id_ = local.Resolve(id_, allocator); RAPIDJSON_SCHEMA_PRINT(SchemaIds, id.GetString(), v->GetString(), id_.GetString()); } } if (const ValueType* v = GetMember(value, GetTypeString())) { type_ = 0; if (v->IsString()) AddType(*v); else if (v->IsArray()) for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) AddType(*itr); } if (const ValueType* v = GetMember(value, GetEnumString())) { if (v->IsArray() && v->Size() > 0) { enum_ = static_cast(allocator_->Malloc(sizeof(uint64_t) * v->Size())); for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) { typedef Hasher > EnumHasherType; char buffer[256u + 24]; MemoryPoolAllocator hasherAllocator(buffer, sizeof(buffer)); EnumHasherType h(&hasherAllocator, 256); itr->Accept(h); enum_[enumCount_++] = h.GetHashCode(); } } } if (schemaDocument) AssignIfExist(allOf_, *schemaDocument, p, value, GetAllOfString(), document); // AnyOf, OneOf, Not not supported for open api 2.0 if (schemaDocument && spec_.oapi != kVersion20) { AssignIfExist(anyOf_, *schemaDocument, p, value, GetAnyOfString(), document); AssignIfExist(oneOf_, *schemaDocument, p, value, GetOneOfString(), document); if (const ValueType* v = GetMember(value, GetNotString())) { schemaDocument->CreateSchema(¬_, p.Append(GetNotString(), allocator_), *v, document, id_); notValidatorIndex_ = validatorCount_; validatorCount_++; } } // Object const ValueType* properties = GetMember(value, GetPropertiesString()); const ValueType* required = GetMember(value, GetRequiredString()); const ValueType* dependencies = GetMember(value, GetDependenciesString()); { // Gather properties from properties/required/dependencies SValue allProperties(kArrayType); if (properties && properties->IsObject()) for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) AddUniqueElement(allProperties, itr->name); if (required && required->IsArray()) for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) if (itr->IsString()) AddUniqueElement(allProperties, *itr); // Dependencies not supported for open api 2.0 and 3.0 if (spec_.oapi != kVersion20 && spec_.oapi != kVersion30) if (dependencies && dependencies->IsObject()) for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { AddUniqueElement(allProperties, itr->name); if (itr->value.IsArray()) for (ConstValueIterator i = itr->value.Begin(); i != itr->value.End(); ++i) if (i->IsString()) AddUniqueElement(allProperties, *i); } if (allProperties.Size() > 0) { propertyCount_ = allProperties.Size(); properties_ = static_cast(allocator_->Malloc(sizeof(Property) * propertyCount_)); for (SizeType i = 0; i < propertyCount_; i++) { new (&properties_[i]) Property(); properties_[i].name = allProperties[i]; properties_[i].schema = typeless_; } } } if (properties && properties->IsObject()) { PointerType q = p.Append(GetPropertiesString(), allocator_); for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) { SizeType index; if (FindPropertyIndex(itr->name, &index)) schemaDocument->CreateSchema(&properties_[index].schema, q.Append(itr->name, allocator_), itr->value, document, id_); } } // PatternProperties not supported for open api 2.0 and 3.0 if (spec_.oapi != kVersion20 && spec_.oapi != kVersion30) if (const ValueType* v = GetMember(value, GetPatternPropertiesString())) { PointerType q = p.Append(GetPatternPropertiesString(), allocator_); patternProperties_ = static_cast(allocator_->Malloc(sizeof(PatternProperty) * v->MemberCount())); patternPropertyCount_ = 0; for (ConstMemberIterator itr = v->MemberBegin(); itr != v->MemberEnd(); ++itr) { new (&patternProperties_[patternPropertyCount_]) PatternProperty(); PointerType r = q.Append(itr->name, allocator_); patternProperties_[patternPropertyCount_].pattern = CreatePattern(itr->name, schemaDocument, r); schemaDocument->CreateSchema(&patternProperties_[patternPropertyCount_].schema, r, itr->value, document, id_); patternPropertyCount_++; } } if (required && required->IsArray()) for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) if (itr->IsString()) { SizeType index; if (FindPropertyIndex(*itr, &index)) { properties_[index].required = true; hasRequired_ = true; } } // Dependencies not supported for open api 2.0 and 3.0 if (spec_.oapi != kVersion20 && spec_.oapi != kVersion30) if (dependencies && dependencies->IsObject()) { PointerType q = p.Append(GetDependenciesString(), allocator_); hasDependencies_ = true; for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { SizeType sourceIndex; if (FindPropertyIndex(itr->name, &sourceIndex)) { if (itr->value.IsArray()) { properties_[sourceIndex].dependencies = static_cast(allocator_->Malloc(sizeof(bool) * propertyCount_)); std::memset(properties_[sourceIndex].dependencies, 0, sizeof(bool)* propertyCount_); for (ConstValueIterator targetItr = itr->value.Begin(); targetItr != itr->value.End(); ++targetItr) { SizeType targetIndex; if (FindPropertyIndex(*targetItr, &targetIndex)) properties_[sourceIndex].dependencies[targetIndex] = true; } } else if (itr->value.IsObject()) { hasSchemaDependencies_ = true; schemaDocument->CreateSchema(&properties_[sourceIndex].dependenciesSchema, q.Append(itr->name, allocator_), itr->value, document, id_); properties_[sourceIndex].dependenciesValidatorIndex = validatorCount_; validatorCount_++; } } } } if (const ValueType* v = GetMember(value, GetAdditionalPropertiesString())) { if (v->IsBool()) additionalProperties_ = v->GetBool(); else if (v->IsObject()) schemaDocument->CreateSchema(&additionalPropertiesSchema_, p.Append(GetAdditionalPropertiesString(), allocator_), *v, document, id_); } AssignIfExist(minProperties_, value, GetMinPropertiesString()); AssignIfExist(maxProperties_, value, GetMaxPropertiesString()); // Array if (const ValueType* v = GetMember(value, GetItemsString())) { PointerType q = p.Append(GetItemsString(), allocator_); if (v->IsObject()) // List validation schemaDocument->CreateSchema(&itemsList_, q, *v, document, id_); else if (v->IsArray()) { // Tuple validation itemsTuple_ = static_cast(allocator_->Malloc(sizeof(const Schema*) * v->Size())); SizeType index = 0; for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr, index++) schemaDocument->CreateSchema(&itemsTuple_[itemsTupleCount_++], q.Append(index, allocator_), *itr, document, id_); } } AssignIfExist(minItems_, value, GetMinItemsString()); AssignIfExist(maxItems_, value, GetMaxItemsString()); // AdditionalItems not supported for openapi 2.0 and 3.0 if (spec_.oapi != kVersion20 && spec_.oapi != kVersion30) if (const ValueType* v = GetMember(value, GetAdditionalItemsString())) { if (v->IsBool()) additionalItems_ = v->GetBool(); else if (v->IsObject()) schemaDocument->CreateSchema(&additionalItemsSchema_, p.Append(GetAdditionalItemsString(), allocator_), *v, document, id_); } AssignIfExist(uniqueItems_, value, GetUniqueItemsString()); // String AssignIfExist(minLength_, value, GetMinLengthString()); AssignIfExist(maxLength_, value, GetMaxLengthString()); if (const ValueType* v = GetMember(value, GetPatternString())) pattern_ = CreatePattern(*v, schemaDocument, p.Append(GetPatternString(), allocator_)); // Number if (const ValueType* v = GetMember(value, GetMinimumString())) if (v->IsNumber()) minimum_.CopyFrom(*v, *allocator_); if (const ValueType* v = GetMember(value, GetMaximumString())) if (v->IsNumber()) maximum_.CopyFrom(*v, *allocator_); AssignIfExist(exclusiveMinimum_, value, GetExclusiveMinimumString()); AssignIfExist(exclusiveMaximum_, value, GetExclusiveMaximumString()); if (const ValueType* v = GetMember(value, GetMultipleOfString())) if (v->IsNumber() && v->GetDouble() > 0.0) multipleOf_.CopyFrom(*v, *allocator_); // Default if (const ValueType* v = GetMember(value, GetDefaultValueString())) if (v->IsString()) defaultValueLength_ = v->GetStringLength(); // ReadOnly - open api only (until draft 7 supported) // WriteOnly - open api 3 only (until draft 7 supported) // Both can't be true if (spec_.oapi != kVersionNone) AssignIfExist(readOnly_, value, GetReadOnlyString()); if (spec_.oapi >= kVersion30) AssignIfExist(writeOnly_, value, GetWriteOnlyString()); if (readOnly_ && writeOnly_) schemaDocument->SchemaError(kSchemaErrorReadOnlyAndWriteOnly, p); // Nullable - open api 3 only // If true add 'null' as allowable type if (spec_.oapi >= kVersion30) { AssignIfExist(nullable_, value, GetNullableString()); if (nullable_) AddType(GetNullString()); } } ~Schema() { AllocatorType::Free(enum_); if (properties_) { for (SizeType i = 0; i < propertyCount_; i++) properties_[i].~Property(); AllocatorType::Free(properties_); } if (patternProperties_) { for (SizeType i = 0; i < patternPropertyCount_; i++) patternProperties_[i].~PatternProperty(); AllocatorType::Free(patternProperties_); } AllocatorType::Free(itemsTuple_); #if RAPIDJSON_SCHEMA_HAS_REGEX if (pattern_) { pattern_->~RegexType(); AllocatorType::Free(pattern_); } #endif } const SValue& GetURI() const { return uri_; } const UriType& GetId() const { return id_; } const Specification& GetSpecification() const { return spec_; } const PointerType& GetPointer() const { return pointer_; } bool BeginValue(Context& context) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::BeginValue"); if (context.inArray) { if (uniqueItems_) context.valueUniqueness = true; if (itemsList_) context.valueSchema = itemsList_; else if (itemsTuple_) { if (context.arrayElementIndex < itemsTupleCount_) context.valueSchema = itemsTuple_[context.arrayElementIndex]; else if (additionalItemsSchema_) context.valueSchema = additionalItemsSchema_; else if (additionalItems_) context.valueSchema = typeless_; else { context.error_handler.DisallowedItem(context.arrayElementIndex); // Must set valueSchema for when kValidateContinueOnErrorFlag is set, else reports spurious type error context.valueSchema = typeless_; // Must bump arrayElementIndex for when kValidateContinueOnErrorFlag is set context.arrayElementIndex++; RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorAdditionalItems); } } else context.valueSchema = typeless_; context.arrayElementIndex++; } return true; } RAPIDJSON_FORCEINLINE bool EndValue(Context& context) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::EndValue"); // Only check pattern properties if we have validators if (context.patternPropertiesValidatorCount > 0) { bool otherValid = false; SizeType count = context.patternPropertiesValidatorCount; if (context.objectPatternValidatorType != Context::kPatternValidatorOnly) otherValid = context.patternPropertiesValidators[--count]->IsValid(); bool patternValid = true; for (SizeType i = 0; i < count; i++) if (!context.patternPropertiesValidators[i]->IsValid()) { patternValid = false; break; } if (context.objectPatternValidatorType == Context::kPatternValidatorOnly) { if (!patternValid) { context.error_handler.PropertyViolations(context.patternPropertiesValidators, count); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPatternProperties); } } else if (context.objectPatternValidatorType == Context::kPatternValidatorWithProperty) { if (!patternValid || !otherValid) { context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPatternProperties); } } else if (!patternValid && !otherValid) { // kPatternValidatorWithAdditionalProperty) context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPatternProperties); } } // For enums only check if we have a hasher if (enum_ && context.hasher) { const uint64_t h = context.factory.GetHashCode(context.hasher); for (SizeType i = 0; i < enumCount_; i++) if (enum_[i] == h) goto foundEnum; context.error_handler.DisallowedValue(kValidateErrorEnum); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorEnum); foundEnum:; } // Only check allOf etc if we have validators if (context.validatorCount > 0) { if (allOf_.schemas) for (SizeType i = allOf_.begin; i < allOf_.begin + allOf_.count; i++) if (!context.validators[i]->IsValid()) { context.error_handler.NotAllOf(&context.validators[allOf_.begin], allOf_.count); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorAllOf); } if (anyOf_.schemas) { for (SizeType i = anyOf_.begin; i < anyOf_.begin + anyOf_.count; i++) if (context.validators[i]->IsValid()) goto foundAny; context.error_handler.NoneOf(&context.validators[anyOf_.begin], anyOf_.count); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorAnyOf); foundAny:; } if (oneOf_.schemas) { bool oneValid = false; SizeType firstMatch = 0; for (SizeType i = oneOf_.begin; i < oneOf_.begin + oneOf_.count; i++) if (context.validators[i]->IsValid()) { if (oneValid) { context.error_handler.MultipleOneOf(firstMatch, i - oneOf_.begin); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorOneOfMatch); } else { oneValid = true; firstMatch = i - oneOf_.begin; } } if (!oneValid) { context.error_handler.NotOneOf(&context.validators[oneOf_.begin], oneOf_.count); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorOneOf); } } if (not_ && context.validators[notValidatorIndex_]->IsValid()) { context.error_handler.Disallowed(); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorNot); } } return true; } bool Null(Context& context) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Null"); if (!(type_ & (1 << kNullSchemaType))) { DisallowedType(context, GetNullString()); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); } return CreateParallelValidator(context); } bool Bool(Context& context, bool b) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Bool", b); if (!CheckBool(context, b)) return false; return CreateParallelValidator(context); } bool Int(Context& context, int i) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Int", (int64_t)i); if (!CheckInt(context, i)) return false; return CreateParallelValidator(context); } bool Uint(Context& context, unsigned u) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Uint", (uint64_t)u); if (!CheckUint(context, u)) return false; return CreateParallelValidator(context); } bool Int64(Context& context, int64_t i) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Int64", i); if (!CheckInt(context, i)) return false; return CreateParallelValidator(context); } bool Uint64(Context& context, uint64_t u) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Uint64", u); if (!CheckUint(context, u)) return false; return CreateParallelValidator(context); } bool Double(Context& context, double d) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Double", d); if (!(type_ & (1 << kNumberSchemaType))) { DisallowedType(context, GetNumberString()); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); } if (!minimum_.IsNull() && !CheckDoubleMinimum(context, d)) return false; if (!maximum_.IsNull() && !CheckDoubleMaximum(context, d)) return false; if (!multipleOf_.IsNull() && !CheckDoubleMultipleOf(context, d)) return false; return CreateParallelValidator(context); } bool String(Context& context, const Ch* str, SizeType length, bool) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::String", str); if (!(type_ & (1 << kStringSchemaType))) { DisallowedType(context, GetStringString()); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); } if (minLength_ != 0 || maxLength_ != SizeType(~0)) { SizeType count; if (internal::CountStringCodePoint(str, length, &count)) { if (count < minLength_) { context.error_handler.TooShort(str, length, minLength_); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMinLength); } if (count > maxLength_) { context.error_handler.TooLong(str, length, maxLength_); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMaxLength); } } } if (pattern_ && !IsPatternMatch(pattern_, str, length)) { context.error_handler.DoesNotMatch(str, length); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPattern); } return CreateParallelValidator(context); } bool StartObject(Context& context) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::StartObject"); if (!(type_ & (1 << kObjectSchemaType))) { DisallowedType(context, GetObjectString()); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); } if (hasDependencies_ || hasRequired_) { context.propertyExist = static_cast(context.factory.MallocState(sizeof(bool) * propertyCount_)); std::memset(context.propertyExist, 0, sizeof(bool) * propertyCount_); } if (patternProperties_) { // pre-allocate schema array SizeType count = patternPropertyCount_ + 1; // extra for valuePatternValidatorType context.patternPropertiesSchemas = static_cast(context.factory.MallocState(sizeof(const SchemaType*) * count)); context.patternPropertiesSchemaCount = 0; std::memset(context.patternPropertiesSchemas, 0, sizeof(SchemaType*) * count); } return CreateParallelValidator(context); } bool Key(Context& context, const Ch* str, SizeType len, bool) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Key", str); if (patternProperties_) { context.patternPropertiesSchemaCount = 0; for (SizeType i = 0; i < patternPropertyCount_; i++) if (patternProperties_[i].pattern && IsPatternMatch(patternProperties_[i].pattern, str, len)) { context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = patternProperties_[i].schema; context.valueSchema = typeless_; } } SizeType index = 0; if (FindPropertyIndex(ValueType(str, len).Move(), &index)) { if (context.patternPropertiesSchemaCount > 0) { context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = properties_[index].schema; context.valueSchema = typeless_; context.valuePatternValidatorType = Context::kPatternValidatorWithProperty; } else context.valueSchema = properties_[index].schema; if (context.propertyExist) context.propertyExist[index] = true; return true; } if (additionalPropertiesSchema_) { if (context.patternPropertiesSchemaCount > 0) { context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = additionalPropertiesSchema_; context.valueSchema = typeless_; context.valuePatternValidatorType = Context::kPatternValidatorWithAdditionalProperty; } else context.valueSchema = additionalPropertiesSchema_; return true; } else if (additionalProperties_) { context.valueSchema = typeless_; return true; } if (context.patternPropertiesSchemaCount == 0) { // patternProperties are not additional properties // Must set valueSchema for when kValidateContinueOnErrorFlag is set, else reports spurious type error context.valueSchema = typeless_; context.error_handler.DisallowedProperty(str, len); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorAdditionalProperties); } return true; } bool EndObject(Context& context, SizeType memberCount) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::EndObject"); if (hasRequired_) { context.error_handler.StartMissingProperties(); for (SizeType index = 0; index < propertyCount_; index++) if (properties_[index].required && !context.propertyExist[index]) if (properties_[index].schema->defaultValueLength_ == 0 ) context.error_handler.AddMissingProperty(properties_[index].name); if (context.error_handler.EndMissingProperties()) RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorRequired); } if (memberCount < minProperties_) { context.error_handler.TooFewProperties(memberCount, minProperties_); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMinProperties); } if (memberCount > maxProperties_) { context.error_handler.TooManyProperties(memberCount, maxProperties_); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMaxProperties); } if (hasDependencies_) { context.error_handler.StartDependencyErrors(); for (SizeType sourceIndex = 0; sourceIndex < propertyCount_; sourceIndex++) { const Property& source = properties_[sourceIndex]; if (context.propertyExist[sourceIndex]) { if (source.dependencies) { context.error_handler.StartMissingDependentProperties(); for (SizeType targetIndex = 0; targetIndex < propertyCount_; targetIndex++) if (source.dependencies[targetIndex] && !context.propertyExist[targetIndex]) context.error_handler.AddMissingDependentProperty(properties_[targetIndex].name); context.error_handler.EndMissingDependentProperties(source.name); } else if (source.dependenciesSchema) { ISchemaValidator* dependenciesValidator = context.validators[source.dependenciesValidatorIndex]; if (!dependenciesValidator->IsValid()) context.error_handler.AddDependencySchemaError(source.name, dependenciesValidator); } } } if (context.error_handler.EndDependencyErrors()) RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorDependencies); } return true; } bool StartArray(Context& context) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::StartArray"); context.arrayElementIndex = 0; context.inArray = true; // Ensure we note that we are in an array if (!(type_ & (1 << kArraySchemaType))) { DisallowedType(context, GetArrayString()); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); } return CreateParallelValidator(context); } bool EndArray(Context& context, SizeType elementCount) const { RAPIDJSON_SCHEMA_PRINT(Method, "Schema::EndArray"); context.inArray = false; if (elementCount < minItems_) { context.error_handler.TooFewItems(elementCount, minItems_); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMinItems); } if (elementCount > maxItems_) { context.error_handler.TooManyItems(elementCount, maxItems_); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMaxItems); } return true; } static const ValueType& GetValidateErrorKeyword(ValidateErrorCode validateErrorCode) { switch (validateErrorCode) { case kValidateErrorMultipleOf: return GetMultipleOfString(); case kValidateErrorMaximum: return GetMaximumString(); case kValidateErrorExclusiveMaximum: return GetMaximumString(); // Same case kValidateErrorMinimum: return GetMinimumString(); case kValidateErrorExclusiveMinimum: return GetMinimumString(); // Same case kValidateErrorMaxLength: return GetMaxLengthString(); case kValidateErrorMinLength: return GetMinLengthString(); case kValidateErrorPattern: return GetPatternString(); case kValidateErrorMaxItems: return GetMaxItemsString(); case kValidateErrorMinItems: return GetMinItemsString(); case kValidateErrorUniqueItems: return GetUniqueItemsString(); case kValidateErrorAdditionalItems: return GetAdditionalItemsString(); case kValidateErrorMaxProperties: return GetMaxPropertiesString(); case kValidateErrorMinProperties: return GetMinPropertiesString(); case kValidateErrorRequired: return GetRequiredString(); case kValidateErrorAdditionalProperties: return GetAdditionalPropertiesString(); case kValidateErrorPatternProperties: return GetPatternPropertiesString(); case kValidateErrorDependencies: return GetDependenciesString(); case kValidateErrorEnum: return GetEnumString(); case kValidateErrorType: return GetTypeString(); case kValidateErrorOneOf: return GetOneOfString(); case kValidateErrorOneOfMatch: return GetOneOfString(); // Same case kValidateErrorAllOf: return GetAllOfString(); case kValidateErrorAnyOf: return GetAnyOfString(); case kValidateErrorNot: return GetNotString(); case kValidateErrorReadOnly: return GetReadOnlyString(); case kValidateErrorWriteOnly: return GetWriteOnlyString(); default: return GetNullString(); } } // Generate functions for string literal according to Ch #define RAPIDJSON_STRING_(name, ...) \ static const ValueType& Get##name##String() {\ static const Ch s[] = { __VA_ARGS__, '\0' };\ static const ValueType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1));\ return v;\ } RAPIDJSON_STRING_(Null, 'n', 'u', 'l', 'l') RAPIDJSON_STRING_(Boolean, 'b', 'o', 'o', 'l', 'e', 'a', 'n') RAPIDJSON_STRING_(Object, 'o', 'b', 'j', 'e', 'c', 't') RAPIDJSON_STRING_(Array, 'a', 'r', 'r', 'a', 'y') RAPIDJSON_STRING_(String, 's', 't', 'r', 'i', 'n', 'g') RAPIDJSON_STRING_(Number, 'n', 'u', 'm', 'b', 'e', 'r') RAPIDJSON_STRING_(Integer, 'i', 'n', 't', 'e', 'g', 'e', 'r') RAPIDJSON_STRING_(Type, 't', 'y', 'p', 'e') RAPIDJSON_STRING_(Enum, 'e', 'n', 'u', 'm') RAPIDJSON_STRING_(AllOf, 'a', 'l', 'l', 'O', 'f') RAPIDJSON_STRING_(AnyOf, 'a', 'n', 'y', 'O', 'f') RAPIDJSON_STRING_(OneOf, 'o', 'n', 'e', 'O', 'f') RAPIDJSON_STRING_(Not, 'n', 'o', 't') RAPIDJSON_STRING_(Properties, 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') RAPIDJSON_STRING_(Required, 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd') RAPIDJSON_STRING_(Dependencies, 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 'c', 'i', 'e', 's') RAPIDJSON_STRING_(PatternProperties, 'p', 'a', 't', 't', 'e', 'r', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') RAPIDJSON_STRING_(AdditionalProperties, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') RAPIDJSON_STRING_(MinProperties, 'm', 'i', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') RAPIDJSON_STRING_(MaxProperties, 'm', 'a', 'x', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') RAPIDJSON_STRING_(Items, 'i', 't', 'e', 'm', 's') RAPIDJSON_STRING_(MinItems, 'm', 'i', 'n', 'I', 't', 'e', 'm', 's') RAPIDJSON_STRING_(MaxItems, 'm', 'a', 'x', 'I', 't', 'e', 'm', 's') RAPIDJSON_STRING_(AdditionalItems, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'I', 't', 'e', 'm', 's') RAPIDJSON_STRING_(UniqueItems, 'u', 'n', 'i', 'q', 'u', 'e', 'I', 't', 'e', 'm', 's') RAPIDJSON_STRING_(MinLength, 'm', 'i', 'n', 'L', 'e', 'n', 'g', 't', 'h') RAPIDJSON_STRING_(MaxLength, 'm', 'a', 'x', 'L', 'e', 'n', 'g', 't', 'h') RAPIDJSON_STRING_(Pattern, 'p', 'a', 't', 't', 'e', 'r', 'n') RAPIDJSON_STRING_(Minimum, 'm', 'i', 'n', 'i', 'm', 'u', 'm') RAPIDJSON_STRING_(Maximum, 'm', 'a', 'x', 'i', 'm', 'u', 'm') RAPIDJSON_STRING_(ExclusiveMinimum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'i', 'n', 'i', 'm', 'u', 'm') RAPIDJSON_STRING_(ExclusiveMaximum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'a', 'x', 'i', 'm', 'u', 'm') RAPIDJSON_STRING_(MultipleOf, 'm', 'u', 'l', 't', 'i', 'p', 'l', 'e', 'O', 'f') RAPIDJSON_STRING_(DefaultValue, 'd', 'e', 'f', 'a', 'u', 'l', 't') RAPIDJSON_STRING_(Schema, '$', 's', 'c', 'h', 'e', 'm', 'a') RAPIDJSON_STRING_(Ref, '$', 'r', 'e', 'f') RAPIDJSON_STRING_(Id, 'i', 'd') RAPIDJSON_STRING_(Swagger, 's', 'w', 'a', 'g', 'g', 'e', 'r') RAPIDJSON_STRING_(OpenApi, 'o', 'p', 'e', 'n', 'a', 'p', 'i') RAPIDJSON_STRING_(ReadOnly, 'r', 'e', 'a', 'd', 'O', 'n', 'l', 'y') RAPIDJSON_STRING_(WriteOnly, 'w', 'r', 'i', 't', 'e', 'O', 'n', 'l', 'y') RAPIDJSON_STRING_(Nullable, 'n', 'u', 'l', 'l', 'a', 'b', 'l', 'e') #undef RAPIDJSON_STRING_ private: enum SchemaValueType { kNullSchemaType, kBooleanSchemaType, kObjectSchemaType, kArraySchemaType, kStringSchemaType, kNumberSchemaType, kIntegerSchemaType, kTotalSchemaType }; #if RAPIDJSON_SCHEMA_USE_INTERNALREGEX typedef internal::GenericRegex RegexType; #elif RAPIDJSON_SCHEMA_USE_STDREGEX typedef std::basic_regex RegexType; #else typedef char RegexType; #endif struct SchemaArray { SchemaArray() : schemas(), count() {} ~SchemaArray() { AllocatorType::Free(schemas); } const SchemaType** schemas; SizeType begin; // begin index of context.validators SizeType count; }; template void AddUniqueElement(V1& a, const V2& v) { for (typename V1::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) if (*itr == v) return; V1 c(v, *allocator_); a.PushBack(c, *allocator_); } static const ValueType* GetMember(const ValueType& value, const ValueType& name) { typename ValueType::ConstMemberIterator itr = value.FindMember(name); return itr != value.MemberEnd() ? &(itr->value) : 0; } static void AssignIfExist(bool& out, const ValueType& value, const ValueType& name) { if (const ValueType* v = GetMember(value, name)) if (v->IsBool()) out = v->GetBool(); } static void AssignIfExist(SizeType& out, const ValueType& value, const ValueType& name) { if (const ValueType* v = GetMember(value, name)) if (v->IsUint64() && v->GetUint64() <= SizeType(~0)) out = static_cast(v->GetUint64()); } void AssignIfExist(SchemaArray& out, SchemaDocumentType& schemaDocument, const PointerType& p, const ValueType& value, const ValueType& name, const ValueType& document) { if (const ValueType* v = GetMember(value, name)) { if (v->IsArray() && v->Size() > 0) { PointerType q = p.Append(name, allocator_); out.count = v->Size(); out.schemas = static_cast(allocator_->Malloc(out.count * sizeof(const Schema*))); memset(out.schemas, 0, sizeof(Schema*)* out.count); for (SizeType i = 0; i < out.count; i++) schemaDocument.CreateSchema(&out.schemas[i], q.Append(i, allocator_), (*v)[i], document, id_); out.begin = validatorCount_; validatorCount_ += out.count; } } } #if RAPIDJSON_SCHEMA_USE_INTERNALREGEX template RegexType* CreatePattern(const ValueType& value, SchemaDocumentType* sd, const PointerType& p) { if (value.IsString()) { RegexType* r = new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString(), allocator_); if (!r->IsValid()) { sd->SchemaErrorValue(kSchemaErrorRegexInvalid, p, value.GetString(), value.GetStringLength()); r->~RegexType(); AllocatorType::Free(r); r = 0; } return r; } return 0; } static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType) { GenericRegexSearch rs(*pattern); return rs.Search(str); } #elif RAPIDJSON_SCHEMA_USE_STDREGEX template RegexType* CreatePattern(const ValueType& value, SchemaDocumentType* sd, const PointerType& p) { if (value.IsString()) { RegexType *r = static_cast(allocator_->Malloc(sizeof(RegexType))); try { return new (r) RegexType(value.GetString(), std::size_t(value.GetStringLength()), std::regex_constants::ECMAScript); } catch (const std::regex_error& e) { sd->SchemaErrorValue(kSchemaErrorRegexInvalid, p, value.GetString(), value.GetStringLength()); AllocatorType::Free(r); } } return 0; } static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType length) { std::match_results r; return std::regex_search(str, str + length, r, *pattern); } #else template RegexType* CreatePattern(const ValueType&) { return 0; } static bool IsPatternMatch(const RegexType*, const Ch *, SizeType) { return true; } #endif // RAPIDJSON_SCHEMA_USE_STDREGEX void AddType(const ValueType& type) { if (type == GetNullString() ) type_ |= 1 << kNullSchemaType; else if (type == GetBooleanString()) type_ |= 1 << kBooleanSchemaType; else if (type == GetObjectString() ) type_ |= 1 << kObjectSchemaType; else if (type == GetArrayString() ) type_ |= 1 << kArraySchemaType; else if (type == GetStringString() ) type_ |= 1 << kStringSchemaType; else if (type == GetIntegerString()) type_ |= 1 << kIntegerSchemaType; else if (type == GetNumberString() ) type_ |= (1 << kNumberSchemaType) | (1 << kIntegerSchemaType); } // Creates parallel validators for allOf, anyOf, oneOf, not and schema dependencies, if required. // Also creates a hasher for enums and array uniqueness, if required. // Also a useful place to add type-independent error checks. bool CreateParallelValidator(Context& context) const { if (enum_ || context.arrayUniqueness) context.hasher = context.factory.CreateHasher(); if (validatorCount_) { RAPIDJSON_ASSERT(context.validators == 0); context.validators = static_cast(context.factory.MallocState(sizeof(ISchemaValidator*) * validatorCount_)); std::memset(context.validators, 0, sizeof(ISchemaValidator*) * validatorCount_); context.validatorCount = validatorCount_; // Always return after first failure for these sub-validators if (allOf_.schemas) CreateSchemaValidators(context, allOf_, false); if (anyOf_.schemas) CreateSchemaValidators(context, anyOf_, false); if (oneOf_.schemas) CreateSchemaValidators(context, oneOf_, false); if (not_) context.validators[notValidatorIndex_] = context.factory.CreateSchemaValidator(*not_, false); if (hasSchemaDependencies_) { for (SizeType i = 0; i < propertyCount_; i++) if (properties_[i].dependenciesSchema) context.validators[properties_[i].dependenciesValidatorIndex] = context.factory.CreateSchemaValidator(*properties_[i].dependenciesSchema, false); } } // Add any other type-independent checks here if (readOnly_ && (context.flags & kValidateWriteFlag)) { context.error_handler.DisallowedWhenWriting(); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorReadOnly); } if (writeOnly_ && (context.flags & kValidateReadFlag)) { context.error_handler.DisallowedWhenReading(); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorWriteOnly); } return true; } void CreateSchemaValidators(Context& context, const SchemaArray& schemas, const bool inheritContinueOnErrors) const { for (SizeType i = 0; i < schemas.count; i++) context.validators[schemas.begin + i] = context.factory.CreateSchemaValidator(*schemas.schemas[i], inheritContinueOnErrors); } // O(n) bool FindPropertyIndex(const ValueType& name, SizeType* outIndex) const { SizeType len = name.GetStringLength(); const Ch* str = name.GetString(); for (SizeType index = 0; index < propertyCount_; index++) if (properties_[index].name.GetStringLength() == len && (std::memcmp(properties_[index].name.GetString(), str, sizeof(Ch) * len) == 0)) { *outIndex = index; return true; } return false; } bool CheckBool(Context& context, bool) const { if (!(type_ & (1 << kBooleanSchemaType))) { DisallowedType(context, GetBooleanString()); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); } return true; } bool CheckInt(Context& context, int64_t i) const { if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) { DisallowedType(context, GetIntegerString()); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); } if (!minimum_.IsNull()) { if (minimum_.IsInt64()) { if (exclusiveMinimum_ ? i <= minimum_.GetInt64() : i < minimum_.GetInt64()) { context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMinimum_ ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum); } } else if (minimum_.IsUint64()) { context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMinimum_ ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum); // i <= max(int64_t) < minimum.GetUint64() } else if (!CheckDoubleMinimum(context, static_cast(i))) return false; } if (!maximum_.IsNull()) { if (maximum_.IsInt64()) { if (exclusiveMaximum_ ? i >= maximum_.GetInt64() : i > maximum_.GetInt64()) { context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMaximum_ ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum); } } else if (maximum_.IsUint64()) { } /* do nothing */ // i <= max(int64_t) < maximum_.GetUint64() else if (!CheckDoubleMaximum(context, static_cast(i))) return false; } if (!multipleOf_.IsNull()) { if (multipleOf_.IsUint64()) { if (static_cast(i >= 0 ? i : -i) % multipleOf_.GetUint64() != 0) { context.error_handler.NotMultipleOf(i, multipleOf_); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMultipleOf); } } else if (!CheckDoubleMultipleOf(context, static_cast(i))) return false; } return true; } bool CheckUint(Context& context, uint64_t i) const { if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) { DisallowedType(context, GetIntegerString()); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); } if (!minimum_.IsNull()) { if (minimum_.IsUint64()) { if (exclusiveMinimum_ ? i <= minimum_.GetUint64() : i < minimum_.GetUint64()) { context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMinimum_ ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum); } } else if (minimum_.IsInt64()) /* do nothing */; // i >= 0 > minimum.Getint64() else if (!CheckDoubleMinimum(context, static_cast(i))) return false; } if (!maximum_.IsNull()) { if (maximum_.IsUint64()) { if (exclusiveMaximum_ ? i >= maximum_.GetUint64() : i > maximum_.GetUint64()) { context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMaximum_ ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum); } } else if (maximum_.IsInt64()) { context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMaximum_ ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum); // i >= 0 > maximum_ } else if (!CheckDoubleMaximum(context, static_cast(i))) return false; } if (!multipleOf_.IsNull()) { if (multipleOf_.IsUint64()) { if (i % multipleOf_.GetUint64() != 0) { context.error_handler.NotMultipleOf(i, multipleOf_); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMultipleOf); } } else if (!CheckDoubleMultipleOf(context, static_cast(i))) return false; } return true; } bool CheckDoubleMinimum(Context& context, double d) const { if (exclusiveMinimum_ ? d <= minimum_.GetDouble() : d < minimum_.GetDouble()) { context.error_handler.BelowMinimum(d, minimum_, exclusiveMinimum_); RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMinimum_ ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum); } return true; } bool CheckDoubleMaximum(Context& context, double d) const { if (exclusiveMaximum_ ? d >= maximum_.GetDouble() : d > maximum_.GetDouble()) { context.error_handler.AboveMaximum(d, maximum_, exclusiveMaximum_); RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMaximum_ ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum); } return true; } bool CheckDoubleMultipleOf(Context& context, double d) const { double a = std::abs(d), b = std::abs(multipleOf_.GetDouble()); double q = std::floor(a / b); double r = a - q * b; if (r > 0.0) { context.error_handler.NotMultipleOf(d, multipleOf_); RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMultipleOf); } return true; } void DisallowedType(Context& context, const ValueType& actualType) const { ErrorHandler& eh = context.error_handler; eh.StartDisallowedType(); if (type_ & (1 << kNullSchemaType)) eh.AddExpectedType(GetNullString()); if (type_ & (1 << kBooleanSchemaType)) eh.AddExpectedType(GetBooleanString()); if (type_ & (1 << kObjectSchemaType)) eh.AddExpectedType(GetObjectString()); if (type_ & (1 << kArraySchemaType)) eh.AddExpectedType(GetArrayString()); if (type_ & (1 << kStringSchemaType)) eh.AddExpectedType(GetStringString()); if (type_ & (1 << kNumberSchemaType)) eh.AddExpectedType(GetNumberString()); else if (type_ & (1 << kIntegerSchemaType)) eh.AddExpectedType(GetIntegerString()); eh.EndDisallowedType(actualType); } struct Property { Property() : schema(), dependenciesSchema(), dependenciesValidatorIndex(), dependencies(), required(false) {} ~Property() { AllocatorType::Free(dependencies); } SValue name; const SchemaType* schema; const SchemaType* dependenciesSchema; SizeType dependenciesValidatorIndex; bool* dependencies; bool required; }; struct PatternProperty { PatternProperty() : schema(), pattern() {} ~PatternProperty() { if (pattern) { pattern->~RegexType(); AllocatorType::Free(pattern); } } const SchemaType* schema; RegexType* pattern; }; AllocatorType* allocator_; SValue uri_; UriType id_; Specification spec_; PointerType pointer_; const SchemaType* typeless_; uint64_t* enum_; SizeType enumCount_; SchemaArray allOf_; SchemaArray anyOf_; SchemaArray oneOf_; const SchemaType* not_; unsigned type_; // bitmask of kSchemaType SizeType validatorCount_; SizeType notValidatorIndex_; Property* properties_; const SchemaType* additionalPropertiesSchema_; PatternProperty* patternProperties_; SizeType patternPropertyCount_; SizeType propertyCount_; SizeType minProperties_; SizeType maxProperties_; bool additionalProperties_; bool hasDependencies_; bool hasRequired_; bool hasSchemaDependencies_; const SchemaType* additionalItemsSchema_; const SchemaType* itemsList_; const SchemaType** itemsTuple_; SizeType itemsTupleCount_; SizeType minItems_; SizeType maxItems_; bool additionalItems_; bool uniqueItems_; RegexType* pattern_; SizeType minLength_; SizeType maxLength_; SValue minimum_; SValue maximum_; SValue multipleOf_; bool exclusiveMinimum_; bool exclusiveMaximum_; SizeType defaultValueLength_; bool readOnly_; bool writeOnly_; bool nullable_; }; template struct TokenHelper { RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { *documentStack.template Push() = '/'; char buffer[21]; size_t length = static_cast((sizeof(SizeType) == 4 ? u32toa(index, buffer) : u64toa(index, buffer)) - buffer); for (size_t i = 0; i < length; i++) *documentStack.template Push() = static_cast(buffer[i]); } }; // Partial specialized version for char to prevent buffer copying. template struct TokenHelper { RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { if (sizeof(SizeType) == 4) { char *buffer = documentStack.template Push(1 + 10); // '/' + uint *buffer++ = '/'; const char* end = internal::u32toa(index, buffer); documentStack.template Pop(static_cast(10 - (end - buffer))); } else { char *buffer = documentStack.template Push(1 + 20); // '/' + uint64 *buffer++ = '/'; const char* end = internal::u64toa(index, buffer); documentStack.template Pop(static_cast(20 - (end - buffer))); } } }; } // namespace internal /////////////////////////////////////////////////////////////////////////////// // IGenericRemoteSchemaDocumentProvider template class IGenericRemoteSchemaDocumentProvider { public: typedef typename SchemaDocumentType::Ch Ch; typedef typename SchemaDocumentType::ValueType ValueType; typedef typename SchemaDocumentType::AllocatorType AllocatorType; virtual ~IGenericRemoteSchemaDocumentProvider() {} virtual const SchemaDocumentType* GetRemoteDocument(const Ch* uri, SizeType length) = 0; virtual const SchemaDocumentType* GetRemoteDocument(const GenericUri uri, Specification& spec) { // Default implementation just calls through for compatibility // Following line suppresses unused parameter warning (void)spec; // printf("GetRemoteDocument: %d %d\n", spec.draft, spec.oapi); return GetRemoteDocument(uri.GetBaseString(), uri.GetBaseStringLength()); } }; /////////////////////////////////////////////////////////////////////////////// // GenericSchemaDocument //! JSON schema document. /*! A JSON schema document is a compiled version of a JSON schema. It is basically a tree of internal::Schema. \note This is an immutable class (i.e. its instance cannot be modified after construction). \tparam ValueT Type of JSON value (e.g. \c Value ), which also determine the encoding. \tparam Allocator Allocator type for allocating memory of this document. */ template class GenericSchemaDocument { public: typedef ValueT ValueType; typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProviderType; typedef Allocator AllocatorType; typedef typename ValueType::EncodingType EncodingType; typedef typename EncodingType::Ch Ch; typedef internal::Schema SchemaType; typedef GenericPointer PointerType; typedef GenericValue GValue; typedef GenericUri UriType; typedef GenericStringRef StringRefType; friend class internal::Schema; template friend class GenericSchemaValidator; //! Constructor. /*! Compile a JSON document into schema document. \param document A JSON document as source. \param uri The base URI of this schema document for purposes of violation reporting. \param uriLength Length of \c name, in code points. \param remoteProvider An optional remote schema document provider for resolving remote reference. Can be null. \param allocator An optional allocator instance for allocating memory. Can be null. \param pointer An optional JSON pointer to the start of the schema document \param spec Optional schema draft or OpenAPI version. Used if no specification in document. Defaults to draft-04. */ explicit GenericSchemaDocument(const ValueType& document, const Ch* uri = 0, SizeType uriLength = 0, IRemoteSchemaDocumentProviderType* remoteProvider = 0, Allocator* allocator = 0, const PointerType& pointer = PointerType(), // PR #1393 const Specification& spec = Specification(kDraft04)) : remoteProvider_(remoteProvider), allocator_(allocator), ownAllocator_(), root_(), typeless_(), schemaMap_(allocator, kInitialSchemaMapSize), schemaRef_(allocator, kInitialSchemaRefSize), spec_(spec), error_(kObjectType), currentError_() { RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaDocument::GenericSchemaDocument"); if (!allocator_) ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); Ch noUri[1] = {0}; uri_.SetString(uri ? uri : noUri, uriLength, *allocator_); docId_ = UriType(uri_, allocator_); typeless_ = static_cast(allocator_->Malloc(sizeof(SchemaType))); new (typeless_) SchemaType(this, PointerType(), ValueType(kObjectType).Move(), ValueType(kObjectType).Move(), allocator_, docId_); // Establish the schema draft or open api version. // We only ever look for '$schema' or 'swagger' or 'openapi' at the root of the document. SetSchemaSpecification(document); // Generate root schema, it will call CreateSchema() to create sub-schemas, // And call HandleRefSchema() if there are $ref. // PR #1393 use input pointer if supplied root_ = typeless_; if (pointer.GetTokenCount() == 0) { CreateSchemaRecursive(&root_, pointer, document, document, docId_); } else if (const ValueType* v = pointer.Get(document)) { CreateSchema(&root_, pointer, *v, document, docId_); } else { GenericStringBuffer sb; pointer.StringifyUriFragment(sb); SchemaErrorValue(kSchemaErrorStartUnknown, PointerType(), sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch))); } RAPIDJSON_ASSERT(root_ != 0); schemaRef_.ShrinkToFit(); // Deallocate all memory for ref } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS //! Move constructor in C++11 GenericSchemaDocument(GenericSchemaDocument&& rhs) RAPIDJSON_NOEXCEPT : remoteProvider_(rhs.remoteProvider_), allocator_(rhs.allocator_), ownAllocator_(rhs.ownAllocator_), root_(rhs.root_), typeless_(rhs.typeless_), schemaMap_(std::move(rhs.schemaMap_)), schemaRef_(std::move(rhs.schemaRef_)), uri_(std::move(rhs.uri_)), docId_(std::move(rhs.docId_)), spec_(rhs.spec_), error_(std::move(rhs.error_)), currentError_(std::move(rhs.currentError_)) { rhs.remoteProvider_ = 0; rhs.allocator_ = 0; rhs.ownAllocator_ = 0; rhs.typeless_ = 0; } #endif //! Destructor ~GenericSchemaDocument() { while (!schemaMap_.Empty()) schemaMap_.template Pop(1)->~SchemaEntry(); if (typeless_) { typeless_->~SchemaType(); Allocator::Free(typeless_); } // these may contain some allocator data so clear before deleting ownAllocator_ uri_.SetNull(); error_.SetNull(); currentError_.SetNull(); RAPIDJSON_DELETE(ownAllocator_); } const GValue& GetURI() const { return uri_; } const Specification& GetSpecification() const { return spec_; } bool IsSupportedSpecification() const { return spec_.IsSupported(); } //! Static method to get the specification of any schema document // Returns kDraftNone if document is silent static const Specification GetSpecification(const ValueType& document) { SchemaDraft draft = GetSchemaDraft(document); if (draft != kDraftNone) return Specification(draft); else { OpenApiVersion oapi = GetOpenApiVersion(document); if (oapi != kVersionNone) return Specification(oapi); } return Specification(kDraftNone); } //! Get the root schema. const SchemaType& GetRoot() const { return *root_; } //! Gets the error object. GValue& GetError() { return error_; } const GValue& GetError() const { return error_; } static const StringRefType& GetSchemaErrorKeyword(SchemaErrorCode schemaErrorCode) { switch (schemaErrorCode) { case kSchemaErrorStartUnknown: return GetStartUnknownString(); case kSchemaErrorRefPlainName: return GetRefPlainNameString(); case kSchemaErrorRefInvalid: return GetRefInvalidString(); case kSchemaErrorRefPointerInvalid: return GetRefPointerInvalidString(); case kSchemaErrorRefUnknown: return GetRefUnknownString(); case kSchemaErrorRefCyclical: return GetRefCyclicalString(); case kSchemaErrorRefNoRemoteProvider: return GetRefNoRemoteProviderString(); case kSchemaErrorRefNoRemoteSchema: return GetRefNoRemoteSchemaString(); case kSchemaErrorRegexInvalid: return GetRegexInvalidString(); case kSchemaErrorSpecUnknown: return GetSpecUnknownString(); case kSchemaErrorSpecUnsupported: return GetSpecUnsupportedString(); case kSchemaErrorSpecIllegal: return GetSpecIllegalString(); case kSchemaErrorReadOnlyAndWriteOnly: return GetReadOnlyAndWriteOnlyString(); default: return GetNullString(); } } //! Default error method void SchemaError(const SchemaErrorCode code, const PointerType& location) { currentError_ = GValue(kObjectType); AddCurrentError(code, location); } //! Method for error with single string value insert void SchemaErrorValue(const SchemaErrorCode code, const PointerType& location, const Ch* value, SizeType length) { currentError_ = GValue(kObjectType); currentError_.AddMember(GetValueString(), GValue(value, length, *allocator_).Move(), *allocator_); AddCurrentError(code, location); } //! Method for error with invalid pointer void SchemaErrorPointer(const SchemaErrorCode code, const PointerType& location, const Ch* value, SizeType length, const PointerType& pointer) { currentError_ = GValue(kObjectType); currentError_.AddMember(GetValueString(), GValue(value, length, *allocator_).Move(), *allocator_); currentError_.AddMember(GetOffsetString(), static_cast(pointer.GetParseErrorOffset() / sizeof(Ch)), *allocator_); AddCurrentError(code, location); } private: //! Prohibit copying GenericSchemaDocument(const GenericSchemaDocument&); //! Prohibit assignment GenericSchemaDocument& operator=(const GenericSchemaDocument&); typedef const PointerType* SchemaRefPtr; // PR #1393 struct SchemaEntry { SchemaEntry(const PointerType& p, SchemaType* s, bool o, Allocator* allocator) : pointer(p, allocator), schema(s), owned(o) {} ~SchemaEntry() { if (owned) { schema->~SchemaType(); Allocator::Free(schema); } } PointerType pointer; SchemaType* schema; bool owned; }; void AddErrorInstanceLocation(GValue& result, const PointerType& location) { GenericStringBuffer sb; location.StringifyUriFragment(sb); GValue instanceRef(sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch)), *allocator_); result.AddMember(GetInstanceRefString(), instanceRef, *allocator_); } void AddError(GValue& keyword, GValue& error) { typename GValue::MemberIterator member = error_.FindMember(keyword); if (member == error_.MemberEnd()) error_.AddMember(keyword, error, *allocator_); else { if (member->value.IsObject()) { GValue errors(kArrayType); errors.PushBack(member->value, *allocator_); member->value = errors; } member->value.PushBack(error, *allocator_); } } void AddCurrentError(const SchemaErrorCode code, const PointerType& location) { RAPIDJSON_SCHEMA_PRINT(InvalidKeyword, GetSchemaErrorKeyword(code)); currentError_.AddMember(GetErrorCodeString(), code, *allocator_); AddErrorInstanceLocation(currentError_, location); AddError(GValue(GetSchemaErrorKeyword(code)).Move(), currentError_); } #define RAPIDJSON_STRING_(name, ...) \ static const StringRefType& Get##name##String() {\ static const Ch s[] = { __VA_ARGS__, '\0' };\ static const StringRefType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1)); \ return v;\ } RAPIDJSON_STRING_(InstanceRef, 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', 'R', 'e', 'f') RAPIDJSON_STRING_(ErrorCode, 'e', 'r', 'r', 'o', 'r', 'C', 'o', 'd', 'e') RAPIDJSON_STRING_(Value, 'v', 'a', 'l', 'u', 'e') RAPIDJSON_STRING_(Offset, 'o', 'f', 'f', 's', 'e', 't') RAPIDJSON_STRING_(Null, 'n', 'u', 'l', 'l') RAPIDJSON_STRING_(SpecUnknown, 'S', 'p', 'e', 'c', 'U', 'n', 'k', 'n', 'o', 'w', 'n') RAPIDJSON_STRING_(SpecUnsupported, 'S', 'p', 'e', 'c', 'U', 'n', 's', 'u', 'p', 'p', 'o', 'r', 't', 'e', 'd') RAPIDJSON_STRING_(SpecIllegal, 'S', 'p', 'e', 'c', 'I', 'l', 'l', 'e', 'g', 'a', 'l') RAPIDJSON_STRING_(StartUnknown, 'S', 't', 'a', 'r', 't', 'U', 'n', 'k', 'n', 'o', 'w', 'n') RAPIDJSON_STRING_(RefPlainName, 'R', 'e', 'f', 'P', 'l', 'a', 'i', 'n', 'N', 'a', 'm', 'e') RAPIDJSON_STRING_(RefInvalid, 'R', 'e', 'f', 'I', 'n', 'v', 'a', 'l', 'i', 'd') RAPIDJSON_STRING_(RefPointerInvalid, 'R', 'e', 'f', 'P', 'o', 'i', 'n', 't', 'e', 'r', 'I', 'n', 'v', 'a', 'l', 'i', 'd') RAPIDJSON_STRING_(RefUnknown, 'R', 'e', 'f', 'U', 'n', 'k', 'n', 'o', 'w', 'n') RAPIDJSON_STRING_(RefCyclical, 'R', 'e', 'f', 'C', 'y', 'c', 'l', 'i', 'c', 'a', 'l') RAPIDJSON_STRING_(RefNoRemoteProvider, 'R', 'e', 'f', 'N', 'o', 'R', 'e', 'm', 'o', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r') RAPIDJSON_STRING_(RefNoRemoteSchema, 'R', 'e', 'f', 'N', 'o', 'R', 'e', 'm', 'o', 't', 'e', 'S', 'c', 'h', 'e', 'm', 'a') RAPIDJSON_STRING_(ReadOnlyAndWriteOnly, 'R', 'e', 'a', 'd', 'O', 'n', 'l', 'y', 'A', 'n', 'd', 'W', 'r', 'i', 't', 'e', 'O', 'n', 'l', 'y') RAPIDJSON_STRING_(RegexInvalid, 'R', 'e', 'g', 'e', 'x', 'I', 'n', 'v', 'a', 'l', 'i', 'd') #undef RAPIDJSON_STRING_ // Static method to get schema draft of any schema document static SchemaDraft GetSchemaDraft(const ValueType& document) { static const Ch kDraft03String[] = { 'h', 't', 't', 'p', ':', '/', '/', 'j', 's', 'o', 'n', '-', 's', 'c', 'h', 'e', 'm', 'a', '.', 'o', 'r', 'g', '/', 'd', 'r', 'a', 'f', 't', '-', '0', '3', '/', 's', 'c', 'h', 'e', 'm', 'a', '#', '\0' }; static const Ch kDraft04String[] = { 'h', 't', 't', 'p', ':', '/', '/', 'j', 's', 'o', 'n', '-', 's', 'c', 'h', 'e', 'm', 'a', '.', 'o', 'r', 'g', '/', 'd', 'r', 'a', 'f', 't', '-', '0', '4', '/', 's', 'c', 'h', 'e', 'm', 'a', '#', '\0' }; static const Ch kDraft05String[] = { 'h', 't', 't', 'p', ':', '/', '/', 'j', 's', 'o', 'n', '-', 's', 'c', 'h', 'e', 'm', 'a', '.', 'o', 'r', 'g', '/', 'd', 'r', 'a', 'f', 't', '-', '0', '5', '/', 's', 'c', 'h', 'e', 'm', 'a', '#', '\0' }; static const Ch kDraft06String[] = { 'h', 't', 't', 'p', ':', '/', '/', 'j', 's', 'o', 'n', '-', 's', 'c', 'h', 'e', 'm', 'a', '.', 'o', 'r', 'g', '/', 'd', 'r', 'a', 'f', 't', '-', '0', '6', '/', 's', 'c', 'h', 'e', 'm', 'a', '#', '\0' }; static const Ch kDraft07String[] = { 'h', 't', 't', 'p', ':', '/', '/', 'j', 's', 'o', 'n', '-', 's', 'c', 'h', 'e', 'm', 'a', '.', 'o', 'r', 'g', '/', 'd', 'r', 'a', 'f', 't', '-', '0', '7', '/', 's', 'c', 'h', 'e', 'm', 'a', '#', '\0' }; static const Ch kDraft2019_09String[] = { 'h', 't', 't', 'p', 's', ':', '/', '/', 'j', 's', 'o', 'n', '-', 's', 'c', 'h', 'e', 'm', 'a', '.', 'o', 'r', 'g', '/', 'd', 'r', 'a', 'f', 't', '/', '2', '0', '1', '9', '-', '0', '9', '/', 's', 'c', 'h', 'e', 'm', 'a', '\0' }; static const Ch kDraft2020_12String[] = { 'h', 't', 't', 'p', 's', ':', '/', '/', 'j', 's', 'o', 'n', '-', 's', 'c', 'h', 'e', 'm', 'a', '.', 'o', 'r', 'g', '/', 'd', 'r', 'a', 'f', 't', '/', '2', '0', '2', '0', '-', '1', '2', '/', 's', 'c', 'h', 'e', 'm', 'a', '\0' }; if (!document.IsObject()) { return kDraftNone; } // Get the schema draft from the $schema keyword at the supplied location typename ValueType::ConstMemberIterator itr = document.FindMember(SchemaType::GetSchemaString()); if (itr != document.MemberEnd()) { if (!itr->value.IsString()) return kDraftUnknown; const UriType draftUri(itr->value); // Check base uri for match if (draftUri.Match(UriType(kDraft04String), false)) return kDraft04; if (draftUri.Match(UriType(kDraft05String), false)) return kDraft05; if (draftUri.Match(UriType(kDraft06String), false)) return kDraft06; if (draftUri.Match(UriType(kDraft07String), false)) return kDraft07; if (draftUri.Match(UriType(kDraft03String), false)) return kDraft03; if (draftUri.Match(UriType(kDraft2019_09String), false)) return kDraft2019_09; if (draftUri.Match(UriType(kDraft2020_12String), false)) return kDraft2020_12; return kDraftUnknown; } // $schema not found return kDraftNone; } // Get open api version of any schema document static OpenApiVersion GetOpenApiVersion(const ValueType& document) { static const Ch kVersion20String[] = { '2', '.', '0', '\0' }; static const Ch kVersion30String[] = { '3', '.', '0', '.', '\0' }; // ignore patch level static const Ch kVersion31String[] = { '3', '.', '1', '.', '\0' }; // ignore patch level static SizeType len = internal::StrLen(kVersion30String); if (!document.IsObject()) { return kVersionNone; } // Get the open api version from the swagger / openapi keyword at the supplied location typename ValueType::ConstMemberIterator itr = document.FindMember(SchemaType::GetSwaggerString()); if (itr == document.MemberEnd()) itr = document.FindMember(SchemaType::GetOpenApiString()); if (itr != document.MemberEnd()) { if (!itr->value.IsString()) return kVersionUnknown; const ValueType kVersion20Value(kVersion20String); if (kVersion20Value == itr->value) return kVersion20; // must match 2.0 exactly const ValueType kVersion30Value(kVersion30String); if (itr->value.GetStringLength() > len && kVersion30Value == ValueType(itr->value.GetString(), len)) return kVersion30; // must match 3.0.x const ValueType kVersion31Value(kVersion31String); if (itr->value.GetStringLength() > len && kVersion31Value == ValueType(itr->value.GetString(), len)) return kVersion31; // must match 3.1.x return kVersionUnknown; } // swagger or openapi not found return kVersionNone; } // Get the draft of the schema or the open api version (which implies the draft). // Report an error if schema draft or open api version not supported or not recognized, or both in document, and carry on. void SetSchemaSpecification(const ValueType& document) { // Look for '$schema', 'swagger' or 'openapi' keyword at document root SchemaDraft docDraft = GetSchemaDraft(document); OpenApiVersion docOapi = GetOpenApiVersion(document); // Error if both in document if (docDraft != kDraftNone && docOapi != kVersionNone) SchemaError(kSchemaErrorSpecIllegal, PointerType()); // Use document draft or open api version if present or use spec from constructor if (docDraft != kDraftNone) spec_ = Specification(docDraft); else if (docOapi != kVersionNone) spec_ = Specification(docOapi); // Error if draft or version unknown if (spec_.draft == kDraftUnknown || spec_.oapi == kVersionUnknown) SchemaError(kSchemaErrorSpecUnknown, PointerType()); else if (!spec_.IsSupported()) SchemaError(kSchemaErrorSpecUnsupported, PointerType()); } // Changed by PR #1393 void CreateSchemaRecursive(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document, const UriType& id) { if (v.GetType() == kObjectType) { UriType newid = UriType(CreateSchema(schema, pointer, v, document, id), allocator_); for (typename ValueType::ConstMemberIterator itr = v.MemberBegin(); itr != v.MemberEnd(); ++itr) CreateSchemaRecursive(0, pointer.Append(itr->name, allocator_), itr->value, document, newid); } else if (v.GetType() == kArrayType) for (SizeType i = 0; i < v.Size(); i++) CreateSchemaRecursive(0, pointer.Append(i, allocator_), v[i], document, id); } // Changed by PR #1393 const UriType& CreateSchema(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document, const UriType& id) { RAPIDJSON_ASSERT(pointer.IsValid()); GenericStringBuffer sb; pointer.StringifyUriFragment(sb); RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaDocument::CreateSchema", sb.GetString(), id.GetString()); if (v.IsObject()) { if (const SchemaType* sc = GetSchema(pointer)) { if (schema) *schema = sc; AddSchemaRefs(const_cast(sc)); } else if (!HandleRefSchema(pointer, schema, v, document, id)) { // The new schema constructor adds itself and its $ref(s) to schemaMap_ SchemaType* s = new (allocator_->Malloc(sizeof(SchemaType))) SchemaType(this, pointer, v, document, allocator_, id); if (schema) *schema = s; return s->GetId(); } } else { if (schema) *schema = typeless_; AddSchemaRefs(typeless_); } return id; } // Changed by PR #1393 // TODO should this return a UriType& ? bool HandleRefSchema(const PointerType& source, const SchemaType** schema, const ValueType& v, const ValueType& document, const UriType& id) { typename ValueType::ConstMemberIterator itr = v.FindMember(SchemaType::GetRefString()); if (itr == v.MemberEnd()) return false; GenericStringBuffer sb; source.StringifyUriFragment(sb); RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaDocument::HandleRefSchema", sb.GetString(), id.GetString()); // Resolve the source pointer to the $ref'ed schema (finally) new (schemaRef_.template Push()) SchemaRefPtr(&source); if (itr->value.IsString()) { SizeType len = itr->value.GetStringLength(); if (len == 0) SchemaError(kSchemaErrorRefInvalid, source); else { // First resolve $ref against the in-scope id UriType scopeId = UriType(id, allocator_); UriType ref = UriType(itr->value, allocator_).Resolve(scopeId, allocator_); RAPIDJSON_SCHEMA_PRINT(SchemaIds, id.GetString(), itr->value.GetString(), ref.GetString()); // See if the resolved $ref minus the fragment matches a resolved id in this document // Search from the root. Returns the subschema in the document and its absolute JSON pointer. PointerType basePointer = PointerType(); const ValueType *base = FindId(document, ref, basePointer, docId_, false); if (!base) { // Remote reference - call the remote document provider if (!remoteProvider_) SchemaError(kSchemaErrorRefNoRemoteProvider, source); else { if (const GenericSchemaDocument* remoteDocument = remoteProvider_->GetRemoteDocument(ref, spec_)) { const Ch* s = ref.GetFragString(); len = ref.GetFragStringLength(); if (len <= 1 || s[1] == '/') { // JSON pointer fragment, absolute in the remote schema const PointerType pointer(s, len, allocator_); if (!pointer.IsValid()) SchemaErrorPointer(kSchemaErrorRefPointerInvalid, source, s, len, pointer); else { // Get the subschema if (const SchemaType *sc = remoteDocument->GetSchema(pointer)) { if (schema) *schema = sc; AddSchemaRefs(const_cast(sc)); return true; } else SchemaErrorValue(kSchemaErrorRefUnknown, source, ref.GetString(), ref.GetStringLength()); } } else // Plain name fragment, not allowed in remote schema SchemaErrorValue(kSchemaErrorRefPlainName, source, s, len); } else SchemaErrorValue(kSchemaErrorRefNoRemoteSchema, source, ref.GetString(), ref.GetStringLength()); } } else { // Local reference const Ch* s = ref.GetFragString(); len = ref.GetFragStringLength(); if (len <= 1 || s[1] == '/') { // JSON pointer fragment, relative to the resolved URI const PointerType relPointer(s, len, allocator_); if (!relPointer.IsValid()) SchemaErrorPointer(kSchemaErrorRefPointerInvalid, source, s, len, relPointer); else { // Get the subschema if (const ValueType *pv = relPointer.Get(*base)) { // Now get the absolute JSON pointer by adding relative to base PointerType pointer(basePointer, allocator_); for (SizeType i = 0; i < relPointer.GetTokenCount(); i++) pointer = pointer.Append(relPointer.GetTokens()[i], allocator_); if (IsCyclicRef(pointer)) SchemaErrorValue(kSchemaErrorRefCyclical, source, ref.GetString(), ref.GetStringLength()); else { // Call CreateSchema recursively, but first compute the in-scope id for the $ref target as we have jumped there // TODO: cache pointer <-> id mapping size_t unresolvedTokenIndex; scopeId = pointer.GetUri(document, docId_, &unresolvedTokenIndex, allocator_); CreateSchema(schema, pointer, *pv, document, scopeId); return true; } } else SchemaErrorValue(kSchemaErrorRefUnknown, source, ref.GetString(), ref.GetStringLength()); } } else { // Plain name fragment, relative to the resolved URI // Not supported in open api 2.0 and 3.0 PointerType pointer(allocator_); if (spec_.oapi == kVersion20 || spec_.oapi == kVersion30) SchemaErrorValue(kSchemaErrorRefPlainName, source, s, len); // See if the fragment matches an id in this document. // Search from the base we just established. Returns the subschema in the document and its absolute JSON pointer. else if (const ValueType *pv = FindId(*base, ref, pointer, UriType(ref.GetBaseString(), ref.GetBaseStringLength(), allocator_), true, basePointer)) { if (IsCyclicRef(pointer)) SchemaErrorValue(kSchemaErrorRefCyclical, source, ref.GetString(), ref.GetStringLength()); else { // Call CreateSchema recursively, but first compute the in-scope id for the $ref target as we have jumped there // TODO: cache pointer <-> id mapping size_t unresolvedTokenIndex; scopeId = pointer.GetUri(document, docId_, &unresolvedTokenIndex, allocator_); CreateSchema(schema, pointer, *pv, document, scopeId); return true; } } else SchemaErrorValue(kSchemaErrorRefUnknown, source, ref.GetString(), ref.GetStringLength()); } } } } // Invalid/Unknown $ref if (schema) *schema = typeless_; AddSchemaRefs(typeless_); return true; } //! Find the first subschema with a resolved 'id' that matches the specified URI. // If full specified use all URI else ignore fragment. // If found, return a pointer to the subschema and its JSON pointer. // TODO cache pointer <-> id mapping ValueType* FindId(const ValueType& doc, const UriType& finduri, PointerType& resptr, const UriType& baseuri, bool full, const PointerType& here = PointerType()) const { SizeType i = 0; ValueType* resval = 0; UriType tempuri = UriType(finduri, allocator_); UriType localuri = UriType(baseuri, allocator_); if (doc.GetType() == kObjectType) { // Establish the base URI of this object typename ValueType::ConstMemberIterator m = doc.FindMember(SchemaType::GetIdString()); if (m != doc.MemberEnd() && m->value.GetType() == kStringType) { localuri = UriType(m->value, allocator_).Resolve(baseuri, allocator_); } // See if it matches if (localuri.Match(finduri, full)) { RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaDocument::FindId (match)", full ? localuri.GetString() : localuri.GetBaseString()); resval = const_cast(&doc); resptr = here; return resval; } // No match, continue looking for (m = doc.MemberBegin(); m != doc.MemberEnd(); ++m) { if (m->value.GetType() == kObjectType || m->value.GetType() == kArrayType) { resval = FindId(m->value, finduri, resptr, localuri, full, here.Append(m->name.GetString(), m->name.GetStringLength(), allocator_)); } if (resval) break; } } else if (doc.GetType() == kArrayType) { // Continue looking for (typename ValueType::ConstValueIterator v = doc.Begin(); v != doc.End(); ++v) { if (v->GetType() == kObjectType || v->GetType() == kArrayType) { resval = FindId(*v, finduri, resptr, localuri, full, here.Append(i, allocator_)); } if (resval) break; i++; } } return resval; } // Added by PR #1393 void AddSchemaRefs(SchemaType* schema) { RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaDocument::AddSchemaRefs"); while (!schemaRef_.Empty()) { SchemaRefPtr *ref = schemaRef_.template Pop(1); SchemaEntry *entry = schemaMap_.template Push(); new (entry) SchemaEntry(**ref, schema, false, allocator_); } } // Added by PR #1393 bool IsCyclicRef(const PointerType& pointer) const { for (const SchemaRefPtr* ref = schemaRef_.template Bottom(); ref != schemaRef_.template End(); ++ref) if (pointer == **ref) return true; return false; } const SchemaType* GetSchema(const PointerType& pointer) const { for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) if (pointer == target->pointer) return target->schema; return 0; } PointerType GetPointer(const SchemaType* schema) const { for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) if (schema == target->schema) return target->pointer; return PointerType(); } const SchemaType* GetTypeless() const { return typeless_; } static const size_t kInitialSchemaMapSize = 64; static const size_t kInitialSchemaRefSize = 64; IRemoteSchemaDocumentProviderType* remoteProvider_; Allocator *allocator_; Allocator *ownAllocator_; const SchemaType* root_; //!< Root schema. SchemaType* typeless_; internal::Stack schemaMap_; // Stores created Pointer -> Schemas internal::Stack schemaRef_; // Stores Pointer(s) from $ref(s) until resolved GValue uri_; // Schema document URI UriType docId_; Specification spec_; GValue error_; GValue currentError_; }; //! GenericSchemaDocument using Value type. typedef GenericSchemaDocument SchemaDocument; //! IGenericRemoteSchemaDocumentProvider using SchemaDocument. typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; /////////////////////////////////////////////////////////////////////////////// // GenericSchemaValidator //! JSON Schema Validator. /*! A SAX style JSON schema validator. It uses a \c GenericSchemaDocument to validate SAX events. It delegates the incoming SAX events to an output handler. The default output handler does nothing. It can be reused multiple times by calling \c Reset(). \tparam SchemaDocumentType Type of schema document. \tparam OutputHandler Type of output handler. Default handler does nothing. \tparam StateAllocator Allocator for storing the internal validation states. */ template < typename SchemaDocumentType, typename OutputHandler = BaseReaderHandler, typename StateAllocator = CrtAllocator> class GenericSchemaValidator : public internal::ISchemaStateFactory, public internal::ISchemaValidator, public internal::IValidationErrorHandler { public: typedef typename SchemaDocumentType::SchemaType SchemaType; typedef typename SchemaDocumentType::PointerType PointerType; typedef typename SchemaType::EncodingType EncodingType; typedef typename SchemaType::SValue SValue; typedef typename EncodingType::Ch Ch; typedef GenericStringRef StringRefType; typedef GenericValue ValueType; //! Constructor without output handler. /*! \param schemaDocument The schema document to conform to. \param allocator Optional allocator for storing internal validation states. \param schemaStackCapacity Optional initial capacity of schema path stack. \param documentStackCapacity Optional initial capacity of document path stack. */ GenericSchemaValidator( const SchemaDocumentType& schemaDocument, StateAllocator* allocator = 0, size_t schemaStackCapacity = kDefaultSchemaStackCapacity, size_t documentStackCapacity = kDefaultDocumentStackCapacity) : schemaDocument_(&schemaDocument), root_(schemaDocument.GetRoot()), stateAllocator_(allocator), ownStateAllocator_(0), schemaStack_(allocator, schemaStackCapacity), documentStack_(allocator, documentStackCapacity), outputHandler_(0), error_(kObjectType), currentError_(), missingDependents_(), valid_(true), flags_(kValidateDefaultFlags), depth_(0) { RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::GenericSchemaValidator"); } //! Constructor with output handler. /*! \param schemaDocument The schema document to conform to. \param allocator Optional allocator for storing internal validation states. \param schemaStackCapacity Optional initial capacity of schema path stack. \param documentStackCapacity Optional initial capacity of document path stack. */ GenericSchemaValidator( const SchemaDocumentType& schemaDocument, OutputHandler& outputHandler, StateAllocator* allocator = 0, size_t schemaStackCapacity = kDefaultSchemaStackCapacity, size_t documentStackCapacity = kDefaultDocumentStackCapacity) : schemaDocument_(&schemaDocument), root_(schemaDocument.GetRoot()), stateAllocator_(allocator), ownStateAllocator_(0), schemaStack_(allocator, schemaStackCapacity), documentStack_(allocator, documentStackCapacity), outputHandler_(&outputHandler), error_(kObjectType), currentError_(), missingDependents_(), valid_(true), flags_(kValidateDefaultFlags), depth_(0) { RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::GenericSchemaValidator (output handler)"); } //! Destructor. ~GenericSchemaValidator() { Reset(); RAPIDJSON_DELETE(ownStateAllocator_); } //! Reset the internal states. void Reset() { while (!schemaStack_.Empty()) PopSchema(); documentStack_.Clear(); ResetError(); } //! Reset the error state. void ResetError() { error_.SetObject(); currentError_.SetNull(); missingDependents_.SetNull(); valid_ = true; } //! Implementation of ISchemaValidator void SetValidateFlags(unsigned flags) { flags_ = flags; } virtual unsigned GetValidateFlags() const { return flags_; } virtual bool IsValid() const { if (!valid_) return false; if (GetContinueOnErrors() && !error_.ObjectEmpty()) return false; return true; } //! End of Implementation of ISchemaValidator //! Gets the error object. ValueType& GetError() { return error_; } const ValueType& GetError() const { return error_; } //! Gets the JSON pointer pointed to the invalid schema. // If reporting all errors, the stack will be empty. PointerType GetInvalidSchemaPointer() const { return schemaStack_.Empty() ? PointerType() : CurrentSchema().GetPointer(); } //! Gets the keyword of invalid schema. // If reporting all errors, the stack will be empty, so return "errors". const Ch* GetInvalidSchemaKeyword() const { if (!schemaStack_.Empty()) return CurrentContext().invalidKeyword; if (GetContinueOnErrors() && !error_.ObjectEmpty()) return (const Ch*)GetErrorsString(); return 0; } //! Gets the error code of invalid schema. // If reporting all errors, the stack will be empty, so return kValidateErrors. ValidateErrorCode GetInvalidSchemaCode() const { if (!schemaStack_.Empty()) return CurrentContext().invalidCode; if (GetContinueOnErrors() && !error_.ObjectEmpty()) return kValidateErrors; return kValidateErrorNone; } //! Gets the JSON pointer pointed to the invalid value. // If reporting all errors, the stack will be empty. PointerType GetInvalidDocumentPointer() const { if (documentStack_.Empty()) { return PointerType(); } else { return PointerType(documentStack_.template Bottom(), documentStack_.GetSize() / sizeof(Ch)); } } void NotMultipleOf(int64_t actual, const SValue& expected) { AddNumberError(kValidateErrorMultipleOf, ValueType(actual).Move(), expected); } void NotMultipleOf(uint64_t actual, const SValue& expected) { AddNumberError(kValidateErrorMultipleOf, ValueType(actual).Move(), expected); } void NotMultipleOf(double actual, const SValue& expected) { AddNumberError(kValidateErrorMultipleOf, ValueType(actual).Move(), expected); } void AboveMaximum(int64_t actual, const SValue& expected, bool exclusive) { AddNumberError(exclusive ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum, ValueType(actual).Move(), expected, exclusive ? &SchemaType::GetExclusiveMaximumString : 0); } void AboveMaximum(uint64_t actual, const SValue& expected, bool exclusive) { AddNumberError(exclusive ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum, ValueType(actual).Move(), expected, exclusive ? &SchemaType::GetExclusiveMaximumString : 0); } void AboveMaximum(double actual, const SValue& expected, bool exclusive) { AddNumberError(exclusive ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum, ValueType(actual).Move(), expected, exclusive ? &SchemaType::GetExclusiveMaximumString : 0); } void BelowMinimum(int64_t actual, const SValue& expected, bool exclusive) { AddNumberError(exclusive ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum, ValueType(actual).Move(), expected, exclusive ? &SchemaType::GetExclusiveMinimumString : 0); } void BelowMinimum(uint64_t actual, const SValue& expected, bool exclusive) { AddNumberError(exclusive ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum, ValueType(actual).Move(), expected, exclusive ? &SchemaType::GetExclusiveMinimumString : 0); } void BelowMinimum(double actual, const SValue& expected, bool exclusive) { AddNumberError(exclusive ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum, ValueType(actual).Move(), expected, exclusive ? &SchemaType::GetExclusiveMinimumString : 0); } void TooLong(const Ch* str, SizeType length, SizeType expected) { AddNumberError(kValidateErrorMaxLength, ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move()); } void TooShort(const Ch* str, SizeType length, SizeType expected) { AddNumberError(kValidateErrorMinLength, ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move()); } void DoesNotMatch(const Ch* str, SizeType length) { currentError_.SetObject(); currentError_.AddMember(GetActualString(), ValueType(str, length, GetStateAllocator()).Move(), GetStateAllocator()); AddCurrentError(kValidateErrorPattern); } void DisallowedItem(SizeType index) { currentError_.SetObject(); currentError_.AddMember(GetDisallowedString(), ValueType(index).Move(), GetStateAllocator()); AddCurrentError(kValidateErrorAdditionalItems, true); } void TooFewItems(SizeType actualCount, SizeType expectedCount) { AddNumberError(kValidateErrorMinItems, ValueType(actualCount).Move(), SValue(expectedCount).Move()); } void TooManyItems(SizeType actualCount, SizeType expectedCount) { AddNumberError(kValidateErrorMaxItems, ValueType(actualCount).Move(), SValue(expectedCount).Move()); } void DuplicateItems(SizeType index1, SizeType index2) { ValueType duplicates(kArrayType); duplicates.PushBack(index1, GetStateAllocator()); duplicates.PushBack(index2, GetStateAllocator()); currentError_.SetObject(); currentError_.AddMember(GetDuplicatesString(), duplicates, GetStateAllocator()); AddCurrentError(kValidateErrorUniqueItems, true); } void TooManyProperties(SizeType actualCount, SizeType expectedCount) { AddNumberError(kValidateErrorMaxProperties, ValueType(actualCount).Move(), SValue(expectedCount).Move()); } void TooFewProperties(SizeType actualCount, SizeType expectedCount) { AddNumberError(kValidateErrorMinProperties, ValueType(actualCount).Move(), SValue(expectedCount).Move()); } void StartMissingProperties() { currentError_.SetArray(); } void AddMissingProperty(const SValue& name) { currentError_.PushBack(ValueType(name, GetStateAllocator()).Move(), GetStateAllocator()); } bool EndMissingProperties() { if (currentError_.Empty()) return false; ValueType error(kObjectType); error.AddMember(GetMissingString(), currentError_, GetStateAllocator()); currentError_ = error; AddCurrentError(kValidateErrorRequired); return true; } void PropertyViolations(ISchemaValidator** subvalidators, SizeType count) { for (SizeType i = 0; i < count; ++i) MergeError(static_cast(subvalidators[i])->GetError()); } void DisallowedProperty(const Ch* name, SizeType length) { currentError_.SetObject(); currentError_.AddMember(GetDisallowedString(), ValueType(name, length, GetStateAllocator()).Move(), GetStateAllocator()); AddCurrentError(kValidateErrorAdditionalProperties, true); } void StartDependencyErrors() { currentError_.SetObject(); } void StartMissingDependentProperties() { missingDependents_.SetArray(); } void AddMissingDependentProperty(const SValue& targetName) { missingDependents_.PushBack(ValueType(targetName, GetStateAllocator()).Move(), GetStateAllocator()); } void EndMissingDependentProperties(const SValue& sourceName) { if (!missingDependents_.Empty()) { // Create equivalent 'required' error ValueType error(kObjectType); ValidateErrorCode code = kValidateErrorRequired; error.AddMember(GetMissingString(), missingDependents_.Move(), GetStateAllocator()); AddErrorCode(error, code); AddErrorInstanceLocation(error, false); // When appending to a pointer ensure its allocator is used PointerType schemaRef = GetInvalidSchemaPointer().Append(SchemaType::GetValidateErrorKeyword(kValidateErrorDependencies), &GetInvalidSchemaPointer().GetAllocator()); AddErrorSchemaLocation(error, schemaRef.Append(sourceName.GetString(), sourceName.GetStringLength(), &GetInvalidSchemaPointer().GetAllocator())); ValueType wrapper(kObjectType); wrapper.AddMember(ValueType(SchemaType::GetValidateErrorKeyword(code), GetStateAllocator()).Move(), error, GetStateAllocator()); currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(), wrapper, GetStateAllocator()); } } void AddDependencySchemaError(const SValue& sourceName, ISchemaValidator* subvalidator) { currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(), static_cast(subvalidator)->GetError(), GetStateAllocator()); } bool EndDependencyErrors() { if (currentError_.ObjectEmpty()) return false; ValueType error(kObjectType); error.AddMember(GetErrorsString(), currentError_, GetStateAllocator()); currentError_ = error; AddCurrentError(kValidateErrorDependencies); return true; } void DisallowedValue(const ValidateErrorCode code = kValidateErrorEnum) { currentError_.SetObject(); AddCurrentError(code); } void StartDisallowedType() { currentError_.SetArray(); } void AddExpectedType(const typename SchemaType::ValueType& expectedType) { currentError_.PushBack(ValueType(expectedType, GetStateAllocator()).Move(), GetStateAllocator()); } void EndDisallowedType(const typename SchemaType::ValueType& actualType) { ValueType error(kObjectType); error.AddMember(GetExpectedString(), currentError_, GetStateAllocator()); error.AddMember(GetActualString(), ValueType(actualType, GetStateAllocator()).Move(), GetStateAllocator()); currentError_ = error; AddCurrentError(kValidateErrorType); } void NotAllOf(ISchemaValidator** subvalidators, SizeType count) { // Treat allOf like oneOf and anyOf to match https://rapidjson.org/md_doc_schema.html#allOf-anyOf-oneOf AddErrorArray(kValidateErrorAllOf, subvalidators, count); //for (SizeType i = 0; i < count; ++i) { // MergeError(static_cast(subvalidators[i])->GetError()); //} } void NoneOf(ISchemaValidator** subvalidators, SizeType count) { AddErrorArray(kValidateErrorAnyOf, subvalidators, count); } void NotOneOf(ISchemaValidator** subvalidators, SizeType count) { AddErrorArray(kValidateErrorOneOf, subvalidators, count); } void MultipleOneOf(SizeType index1, SizeType index2) { ValueType matches(kArrayType); matches.PushBack(index1, GetStateAllocator()); matches.PushBack(index2, GetStateAllocator()); currentError_.SetObject(); currentError_.AddMember(GetMatchesString(), matches, GetStateAllocator()); AddCurrentError(kValidateErrorOneOfMatch); } void Disallowed() { currentError_.SetObject(); AddCurrentError(kValidateErrorNot); } void DisallowedWhenWriting() { currentError_.SetObject(); AddCurrentError(kValidateErrorReadOnly); } void DisallowedWhenReading() { currentError_.SetObject(); AddCurrentError(kValidateErrorWriteOnly); } #define RAPIDJSON_STRING_(name, ...) \ static const StringRefType& Get##name##String() {\ static const Ch s[] = { __VA_ARGS__, '\0' };\ static const StringRefType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1)); \ return v;\ } RAPIDJSON_STRING_(InstanceRef, 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', 'R', 'e', 'f') RAPIDJSON_STRING_(SchemaRef, 's', 'c', 'h', 'e', 'm', 'a', 'R', 'e', 'f') RAPIDJSON_STRING_(Expected, 'e', 'x', 'p', 'e', 'c', 't', 'e', 'd') RAPIDJSON_STRING_(Actual, 'a', 'c', 't', 'u', 'a', 'l') RAPIDJSON_STRING_(Disallowed, 'd', 'i', 's', 'a', 'l', 'l', 'o', 'w', 'e', 'd') RAPIDJSON_STRING_(Missing, 'm', 'i', 's', 's', 'i', 'n', 'g') RAPIDJSON_STRING_(Errors, 'e', 'r', 'r', 'o', 'r', 's') RAPIDJSON_STRING_(ErrorCode, 'e', 'r', 'r', 'o', 'r', 'C', 'o', 'd', 'e') RAPIDJSON_STRING_(ErrorMessage, 'e', 'r', 'r', 'o', 'r', 'M', 'e', 's', 's', 'a', 'g', 'e') RAPIDJSON_STRING_(Duplicates, 'd', 'u', 'p', 'l', 'i', 'c', 'a', 't', 'e', 's') RAPIDJSON_STRING_(Matches, 'm', 'a', 't', 'c', 'h', 'e', 's') #undef RAPIDJSON_STRING_ #define RAPIDJSON_SCHEMA_HANDLE_BEGIN_(method, arg1)\ if (!valid_) return false; \ if ((!BeginValue() && !GetContinueOnErrors()) || (!CurrentSchema().method arg1 && !GetContinueOnErrors())) {\ *documentStack_.template Push() = '\0';\ documentStack_.template Pop(1);\ RAPIDJSON_SCHEMA_PRINT(InvalidDocument, documentStack_.template Bottom());\ valid_ = false;\ return valid_;\ } #define RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2)\ for (Context* context = schemaStack_.template Bottom(); context != schemaStack_.template End(); context++) {\ if (context->hasher)\ static_cast(context->hasher)->method arg2;\ if (context->validators)\ for (SizeType i_ = 0; i_ < context->validatorCount; i_++)\ static_cast(context->validators[i_])->method arg2;\ if (context->patternPropertiesValidators)\ for (SizeType i_ = 0; i_ < context->patternPropertiesValidatorCount; i_++)\ static_cast(context->patternPropertiesValidators[i_])->method arg2;\ } #define RAPIDJSON_SCHEMA_HANDLE_END_(method, arg2)\ valid_ = (EndValue() || GetContinueOnErrors()) && (!outputHandler_ || outputHandler_->method arg2);\ return valid_; #define RAPIDJSON_SCHEMA_HANDLE_VALUE_(method, arg1, arg2) \ RAPIDJSON_SCHEMA_HANDLE_BEGIN_ (method, arg1);\ RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2);\ RAPIDJSON_SCHEMA_HANDLE_END_ (method, arg2) bool Null() { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Null, (CurrentContext()), ( )); } bool Bool(bool b) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Bool, (CurrentContext(), b), (b)); } bool Int(int i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int, (CurrentContext(), i), (i)); } bool Uint(unsigned u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint, (CurrentContext(), u), (u)); } bool Int64(int64_t i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int64, (CurrentContext(), i), (i)); } bool Uint64(uint64_t u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint64, (CurrentContext(), u), (u)); } bool Double(double d) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Double, (CurrentContext(), d), (d)); } bool RawNumber(const Ch* str, SizeType length, bool copy) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } bool String(const Ch* str, SizeType length, bool copy) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } bool StartObject() { RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::StartObject"); RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartObject, (CurrentContext())); RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartObject, ()); valid_ = !outputHandler_ || outputHandler_->StartObject(); return valid_; } bool Key(const Ch* str, SizeType len, bool copy) { RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::Key", str); if (!valid_) return false; AppendToken(str, len); if (!CurrentSchema().Key(CurrentContext(), str, len, copy) && !GetContinueOnErrors()) { valid_ = false; return valid_; } RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(Key, (str, len, copy)); valid_ = !outputHandler_ || outputHandler_->Key(str, len, copy); return valid_; } bool EndObject(SizeType memberCount) { RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::EndObject"); if (!valid_) return false; RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndObject, (memberCount)); if (!CurrentSchema().EndObject(CurrentContext(), memberCount) && !GetContinueOnErrors()) { valid_ = false; return valid_; } RAPIDJSON_SCHEMA_HANDLE_END_(EndObject, (memberCount)); } bool StartArray() { RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::StartArray"); RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartArray, (CurrentContext())); RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartArray, ()); valid_ = !outputHandler_ || outputHandler_->StartArray(); return valid_; } bool EndArray(SizeType elementCount) { RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::EndArray"); if (!valid_) return false; RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndArray, (elementCount)); if (!CurrentSchema().EndArray(CurrentContext(), elementCount) && !GetContinueOnErrors()) { valid_ = false; return valid_; } RAPIDJSON_SCHEMA_HANDLE_END_(EndArray, (elementCount)); } #undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_ #undef RAPIDJSON_SCHEMA_HANDLE_PARALLEL_ #undef RAPIDJSON_SCHEMA_HANDLE_VALUE_ // Implementation of ISchemaStateFactory virtual ISchemaValidator* CreateSchemaValidator(const SchemaType& root, const bool inheritContinueOnErrors) { *documentStack_.template Push() = '\0'; documentStack_.template Pop(1); ISchemaValidator* sv = new (GetStateAllocator().Malloc(sizeof(GenericSchemaValidator))) GenericSchemaValidator(*schemaDocument_, root, documentStack_.template Bottom(), documentStack_.GetSize(), depth_ + 1, &GetStateAllocator()); sv->SetValidateFlags(inheritContinueOnErrors ? GetValidateFlags() : GetValidateFlags() & ~(unsigned)kValidateContinueOnErrorFlag); return sv; } virtual void DestroySchemaValidator(ISchemaValidator* validator) { GenericSchemaValidator* v = static_cast(validator); v->~GenericSchemaValidator(); StateAllocator::Free(v); } virtual void* CreateHasher() { return new (GetStateAllocator().Malloc(sizeof(HasherType))) HasherType(&GetStateAllocator()); } virtual uint64_t GetHashCode(void* hasher) { return static_cast(hasher)->GetHashCode(); } virtual void DestroryHasher(void* hasher) { HasherType* h = static_cast(hasher); h->~HasherType(); StateAllocator::Free(h); } virtual void* MallocState(size_t size) { return GetStateAllocator().Malloc(size); } virtual void FreeState(void* p) { StateAllocator::Free(p); } // End of implementation of ISchemaStateFactory private: typedef typename SchemaType::Context Context; typedef GenericValue, StateAllocator> HashCodeArray; typedef internal::Hasher HasherType; GenericSchemaValidator( const SchemaDocumentType& schemaDocument, const SchemaType& root, const char* basePath, size_t basePathSize, unsigned depth, StateAllocator* allocator = 0, size_t schemaStackCapacity = kDefaultSchemaStackCapacity, size_t documentStackCapacity = kDefaultDocumentStackCapacity) : schemaDocument_(&schemaDocument), root_(root), stateAllocator_(allocator), ownStateAllocator_(0), schemaStack_(allocator, schemaStackCapacity), documentStack_(allocator, documentStackCapacity), outputHandler_(0), error_(kObjectType), currentError_(), missingDependents_(), valid_(true), flags_(kValidateDefaultFlags), depth_(depth) { RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::GenericSchemaValidator (internal)", basePath && basePathSize ? basePath : ""); if (basePath && basePathSize) memcpy(documentStack_.template Push(basePathSize), basePath, basePathSize); } StateAllocator& GetStateAllocator() { if (!stateAllocator_) stateAllocator_ = ownStateAllocator_ = RAPIDJSON_NEW(StateAllocator)(); return *stateAllocator_; } bool GetContinueOnErrors() const { return flags_ & kValidateContinueOnErrorFlag; } bool BeginValue() { RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::BeginValue"); if (schemaStack_.Empty()) PushSchema(root_); else { if (CurrentContext().inArray) internal::TokenHelper, Ch>::AppendIndexToken(documentStack_, CurrentContext().arrayElementIndex); if (!CurrentSchema().BeginValue(CurrentContext()) && !GetContinueOnErrors()) return false; SizeType count = CurrentContext().patternPropertiesSchemaCount; const SchemaType** sa = CurrentContext().patternPropertiesSchemas; typename Context::PatternValidatorType patternValidatorType = CurrentContext().valuePatternValidatorType; bool valueUniqueness = CurrentContext().valueUniqueness; RAPIDJSON_ASSERT(CurrentContext().valueSchema); PushSchema(*CurrentContext().valueSchema); if (count > 0) { CurrentContext().objectPatternValidatorType = patternValidatorType; ISchemaValidator**& va = CurrentContext().patternPropertiesValidators; SizeType& validatorCount = CurrentContext().patternPropertiesValidatorCount; va = static_cast(MallocState(sizeof(ISchemaValidator*) * count)); std::memset(va, 0, sizeof(ISchemaValidator*) * count); for (SizeType i = 0; i < count; i++) va[validatorCount++] = CreateSchemaValidator(*sa[i], true); // Inherit continueOnError } CurrentContext().arrayUniqueness = valueUniqueness; } return true; } bool EndValue() { RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::EndValue"); if (!CurrentSchema().EndValue(CurrentContext()) && !GetContinueOnErrors()) return false; GenericStringBuffer sb; schemaDocument_->GetPointer(&CurrentSchema()).StringifyUriFragment(sb); *documentStack_.template Push() = '\0'; documentStack_.template Pop(1); RAPIDJSON_SCHEMA_PRINT(ValidatorPointers, sb.GetString(), documentStack_.template Bottom(), depth_); void* hasher = CurrentContext().hasher; uint64_t h = hasher && CurrentContext().arrayUniqueness ? static_cast(hasher)->GetHashCode() : 0; PopSchema(); if (!schemaStack_.Empty()) { Context& context = CurrentContext(); // Only check uniqueness if there is a hasher if (hasher && context.valueUniqueness) { HashCodeArray* a = static_cast(context.arrayElementHashCodes); if (!a) CurrentContext().arrayElementHashCodes = a = new (GetStateAllocator().Malloc(sizeof(HashCodeArray))) HashCodeArray(kArrayType); for (typename HashCodeArray::ConstValueIterator itr = a->Begin(); itr != a->End(); ++itr) if (itr->GetUint64() == h) { DuplicateItems(static_cast(itr - a->Begin()), a->Size()); // Cleanup before returning if continuing if (GetContinueOnErrors()) { a->PushBack(h, GetStateAllocator()); while (!documentStack_.Empty() && *documentStack_.template Pop(1) != '/'); } RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorUniqueItems); } a->PushBack(h, GetStateAllocator()); } } // Remove the last token of document pointer while (!documentStack_.Empty() && *documentStack_.template Pop(1) != '/') ; return true; } void AppendToken(const Ch* str, SizeType len) { documentStack_.template Reserve(1 + len * 2); // worst case all characters are escaped as two characters *documentStack_.template PushUnsafe() = '/'; for (SizeType i = 0; i < len; i++) { if (str[i] == '~') { *documentStack_.template PushUnsafe() = '~'; *documentStack_.template PushUnsafe() = '0'; } else if (str[i] == '/') { *documentStack_.template PushUnsafe() = '~'; *documentStack_.template PushUnsafe() = '1'; } else *documentStack_.template PushUnsafe() = str[i]; } } RAPIDJSON_FORCEINLINE void PushSchema(const SchemaType& schema) { new (schemaStack_.template Push()) Context(*this, *this, &schema, flags_); } RAPIDJSON_FORCEINLINE void PopSchema() { Context* c = schemaStack_.template Pop(1); if (HashCodeArray* a = static_cast(c->arrayElementHashCodes)) { a->~HashCodeArray(); StateAllocator::Free(a); } c->~Context(); } void AddErrorInstanceLocation(ValueType& result, bool parent) { GenericStringBuffer sb; PointerType instancePointer = GetInvalidDocumentPointer(); ((parent && instancePointer.GetTokenCount() > 0) ? PointerType(instancePointer.GetTokens(), instancePointer.GetTokenCount() - 1) : instancePointer).StringifyUriFragment(sb); ValueType instanceRef(sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch)), GetStateAllocator()); result.AddMember(GetInstanceRefString(), instanceRef, GetStateAllocator()); } void AddErrorSchemaLocation(ValueType& result, PointerType schema = PointerType()) { GenericStringBuffer sb; SizeType len = CurrentSchema().GetURI().GetStringLength(); if (len) memcpy(sb.Push(len), CurrentSchema().GetURI().GetString(), len * sizeof(Ch)); if (schema.GetTokenCount()) schema.StringifyUriFragment(sb); else GetInvalidSchemaPointer().StringifyUriFragment(sb); ValueType schemaRef(sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch)), GetStateAllocator()); result.AddMember(GetSchemaRefString(), schemaRef, GetStateAllocator()); } void AddErrorCode(ValueType& result, const ValidateErrorCode code) { result.AddMember(GetErrorCodeString(), code, GetStateAllocator()); } void AddError(ValueType& keyword, ValueType& error) { typename ValueType::MemberIterator member = error_.FindMember(keyword); if (member == error_.MemberEnd()) error_.AddMember(keyword, error, GetStateAllocator()); else { if (member->value.IsObject()) { ValueType errors(kArrayType); errors.PushBack(member->value, GetStateAllocator()); member->value = errors; } member->value.PushBack(error, GetStateAllocator()); } } void AddCurrentError(const ValidateErrorCode code, bool parent = false) { AddErrorCode(currentError_, code); AddErrorInstanceLocation(currentError_, parent); AddErrorSchemaLocation(currentError_); AddError(ValueType(SchemaType::GetValidateErrorKeyword(code), GetStateAllocator(), false).Move(), currentError_); } void MergeError(ValueType& other) { for (typename ValueType::MemberIterator it = other.MemberBegin(), end = other.MemberEnd(); it != end; ++it) { AddError(it->name, it->value); } } void AddNumberError(const ValidateErrorCode code, ValueType& actual, const SValue& expected, const typename SchemaType::ValueType& (*exclusive)() = 0) { currentError_.SetObject(); currentError_.AddMember(GetActualString(), actual, GetStateAllocator()); currentError_.AddMember(GetExpectedString(), ValueType(expected, GetStateAllocator()).Move(), GetStateAllocator()); if (exclusive) currentError_.AddMember(ValueType(exclusive(), GetStateAllocator()).Move(), true, GetStateAllocator()); AddCurrentError(code); } void AddErrorArray(const ValidateErrorCode code, ISchemaValidator** subvalidators, SizeType count) { ValueType errors(kArrayType); for (SizeType i = 0; i < count; ++i) errors.PushBack(static_cast(subvalidators[i])->GetError(), GetStateAllocator()); currentError_.SetObject(); currentError_.AddMember(GetErrorsString(), errors, GetStateAllocator()); AddCurrentError(code); } const SchemaType& CurrentSchema() const { return *schemaStack_.template Top()->schema; } Context& CurrentContext() { return *schemaStack_.template Top(); } const Context& CurrentContext() const { return *schemaStack_.template Top(); } static const size_t kDefaultSchemaStackCapacity = 1024; static const size_t kDefaultDocumentStackCapacity = 256; const SchemaDocumentType* schemaDocument_; const SchemaType& root_; StateAllocator* stateAllocator_; StateAllocator* ownStateAllocator_; internal::Stack schemaStack_; //!< stack to store the current path of schema (BaseSchemaType *) internal::Stack documentStack_; //!< stack to store the current path of validating document (Ch) OutputHandler* outputHandler_; ValueType error_; ValueType currentError_; ValueType missingDependents_; bool valid_; unsigned flags_; unsigned depth_; }; typedef GenericSchemaValidator SchemaValidator; /////////////////////////////////////////////////////////////////////////////// // SchemaValidatingReader //! A helper class for parsing with validation. /*! This helper class is a functor, designed as a parameter of \ref GenericDocument::Populate(). \tparam parseFlags Combination of \ref ParseFlag. \tparam InputStream Type of input stream, implementing Stream concept. \tparam SourceEncoding Encoding of the input stream. \tparam SchemaDocumentType Type of schema document. \tparam StackAllocator Allocator type for stack. */ template < unsigned parseFlags, typename InputStream, typename SourceEncoding, typename SchemaDocumentType = SchemaDocument, typename StackAllocator = CrtAllocator> class SchemaValidatingReader { public: typedef typename SchemaDocumentType::PointerType PointerType; typedef typename InputStream::Ch Ch; typedef GenericValue ValueType; //! Constructor /*! \param is Input stream. \param sd Schema document. */ SchemaValidatingReader(InputStream& is, const SchemaDocumentType& sd) : is_(is), sd_(sd), invalidSchemaKeyword_(), invalidSchemaCode_(kValidateErrorNone), error_(kObjectType), isValid_(true) {} template bool operator()(Handler& handler) { GenericReader reader; GenericSchemaValidator validator(sd_, handler); parseResult_ = reader.template Parse(is_, validator); isValid_ = validator.IsValid(); if (isValid_) { invalidSchemaPointer_ = PointerType(); invalidSchemaKeyword_ = 0; invalidDocumentPointer_ = PointerType(); error_.SetObject(); } else { invalidSchemaPointer_ = validator.GetInvalidSchemaPointer(); invalidSchemaKeyword_ = validator.GetInvalidSchemaKeyword(); invalidSchemaCode_ = validator.GetInvalidSchemaCode(); invalidDocumentPointer_ = validator.GetInvalidDocumentPointer(); error_.CopyFrom(validator.GetError(), allocator_); } return parseResult_; } const ParseResult& GetParseResult() const { return parseResult_; } bool IsValid() const { return isValid_; } const PointerType& GetInvalidSchemaPointer() const { return invalidSchemaPointer_; } const Ch* GetInvalidSchemaKeyword() const { return invalidSchemaKeyword_; } const PointerType& GetInvalidDocumentPointer() const { return invalidDocumentPointer_; } const ValueType& GetError() const { return error_; } ValidateErrorCode GetInvalidSchemaCode() const { return invalidSchemaCode_; } private: InputStream& is_; const SchemaDocumentType& sd_; ParseResult parseResult_; PointerType invalidSchemaPointer_; const Ch* invalidSchemaKeyword_; PointerType invalidDocumentPointer_; ValidateErrorCode invalidSchemaCode_; StackAllocator allocator_; ValueType error_; bool isValid_; }; RAPIDJSON_NAMESPACE_END RAPIDJSON_DIAG_POP #endif // RAPIDJSON_SCHEMA_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/pointer.h0000644000000000000000000017412615031566105025171 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_POINTER_H_ #define RAPIDJSON_POINTER_H_ #include "document.h" #include "uri.h" #include "internal/itoa.h" #include "error/error.h" // PointerParseErrorCode #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(switch-enum) #elif defined(_MSC_VER) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated #endif RAPIDJSON_NAMESPACE_BEGIN static const SizeType kPointerInvalidIndex = ~SizeType(0); //!< Represents an invalid index in GenericPointer::Token /////////////////////////////////////////////////////////////////////////////// // GenericPointer //! Represents a JSON Pointer. Use Pointer for UTF8 encoding and default allocator. /*! This class implements RFC 6901 "JavaScript Object Notation (JSON) Pointer" (https://tools.ietf.org/html/rfc6901). A JSON pointer is for identifying a specific value in a JSON document (GenericDocument). It can simplify coding of DOM tree manipulation, because it can access multiple-level depth of DOM tree with single API call. After it parses a string representation (e.g. "/foo/0" or URI fragment representation (e.g. "#/foo/0") into its internal representation (tokens), it can be used to resolve a specific value in multiple documents, or sub-tree of documents. Contrary to GenericValue, Pointer can be copy constructed and copy assigned. Apart from assignment, a Pointer cannot be modified after construction. Although Pointer is very convenient, please aware that constructing Pointer involves parsing and dynamic memory allocation. A special constructor with user- supplied tokens eliminates these. GenericPointer depends on GenericDocument and GenericValue. \tparam ValueType The value type of the DOM tree. E.g. GenericValue > \tparam Allocator The allocator type for allocating memory for internal representation. \note GenericPointer uses same encoding of ValueType. However, Allocator of GenericPointer is independent of Allocator of Value. */ template class GenericPointer { public: typedef typename ValueType::EncodingType EncodingType; //!< Encoding type from Value typedef typename ValueType::Ch Ch; //!< Character type from Value typedef GenericUri UriType; //! A token is the basic units of internal representation. /*! A JSON pointer string representation "/foo/123" is parsed to two tokens: "foo" and 123. 123 will be represented in both numeric form and string form. They are resolved according to the actual value type (object or array). For token that are not numbers, or the numeric value is out of bound (greater than limits of SizeType), they are only treated as string form (i.e. the token's index will be equal to kPointerInvalidIndex). This struct is public so that user can create a Pointer without parsing and allocation, using a special constructor. */ struct Token { const Ch* name; //!< Name of the token. It has null character at the end but it can contain null character. SizeType length; //!< Length of the name. SizeType index; //!< A valid array index, if it is not equal to kPointerInvalidIndex. }; //!@name Constructors and destructor. //@{ //! Default constructor. GenericPointer(Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} //! Constructor that parses a string or URI fragment representation. /*! \param source A null-terminated, string or URI fragment representation of JSON pointer. \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. */ explicit GenericPointer(const Ch* source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { Parse(source, internal::StrLen(source)); } #if RAPIDJSON_HAS_STDSTRING //! Constructor that parses a string or URI fragment representation. /*! \param source A string or URI fragment representation of JSON pointer. \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. */ explicit GenericPointer(const std::basic_string& source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { Parse(source.c_str(), source.size()); } #endif //! Constructor that parses a string or URI fragment representation, with length of the source string. /*! \param source A string or URI fragment representation of JSON pointer. \param length Length of source. \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. \note Slightly faster than the overload without length. */ GenericPointer(const Ch* source, size_t length, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { Parse(source, length); } //! Constructor with user-supplied tokens. /*! This constructor let user supplies const array of tokens. This prevents the parsing process and eliminates allocation. This is preferred for memory constrained environments. \param tokens An constant array of tokens representing the JSON pointer. \param tokenCount Number of tokens. \b Example \code #define NAME(s) { s, sizeof(s) / sizeof(s[0]) - 1, kPointerInvalidIndex } #define INDEX(i) { #i, sizeof(#i) - 1, i } static const Pointer::Token kTokens[] = { NAME("foo"), INDEX(123) }; static const Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); // Equivalent to static const Pointer p("/foo/123"); #undef NAME #undef INDEX \endcode */ GenericPointer(const Token* tokens, size_t tokenCount) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(const_cast(tokens)), tokenCount_(tokenCount), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} //! Copy constructor. GenericPointer(const GenericPointer& rhs) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { *this = rhs; } //! Copy constructor. GenericPointer(const GenericPointer& rhs, Allocator* allocator) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { *this = rhs; } //! Destructor. ~GenericPointer() { if (nameBuffer_) // If user-supplied tokens constructor is used, nameBuffer_ is nullptr and tokens_ are not deallocated. Allocator::Free(tokens_); RAPIDJSON_DELETE(ownAllocator_); } //! Assignment operator. GenericPointer& operator=(const GenericPointer& rhs) { if (this != &rhs) { // Do not delete ownAllcator if (nameBuffer_) Allocator::Free(tokens_); tokenCount_ = rhs.tokenCount_; parseErrorOffset_ = rhs.parseErrorOffset_; parseErrorCode_ = rhs.parseErrorCode_; if (rhs.nameBuffer_) CopyFromRaw(rhs); // Normally parsed tokens. else { tokens_ = rhs.tokens_; // User supplied const tokens. nameBuffer_ = 0; } } return *this; } //! Swap the content of this pointer with an other. /*! \param other The pointer to swap with. \note Constant complexity. */ GenericPointer& Swap(GenericPointer& other) RAPIDJSON_NOEXCEPT { internal::Swap(allocator_, other.allocator_); internal::Swap(ownAllocator_, other.ownAllocator_); internal::Swap(nameBuffer_, other.nameBuffer_); internal::Swap(tokens_, other.tokens_); internal::Swap(tokenCount_, other.tokenCount_); internal::Swap(parseErrorOffset_, other.parseErrorOffset_); internal::Swap(parseErrorCode_, other.parseErrorCode_); return *this; } //! free-standing swap function helper /*! Helper function to enable support for common swap implementation pattern based on \c std::swap: \code void swap(MyClass& a, MyClass& b) { using std::swap; swap(a.pointer, b.pointer); // ... } \endcode \see Swap() */ friend inline void swap(GenericPointer& a, GenericPointer& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } //@} //!@name Append token //@{ //! Append a token and return a new Pointer /*! \param token Token to be appended. \param allocator Allocator for the newly return Pointer. \return A new Pointer with appended token. */ GenericPointer Append(const Token& token, Allocator* allocator = 0) const { GenericPointer r; r.allocator_ = allocator; Ch *p = r.CopyFromRaw(*this, 1, token.length + 1); std::memcpy(p, token.name, (token.length + 1) * sizeof(Ch)); r.tokens_[tokenCount_].name = p; r.tokens_[tokenCount_].length = token.length; r.tokens_[tokenCount_].index = token.index; return r; } //! Append a name token with length, and return a new Pointer /*! \param name Name to be appended. \param length Length of name. \param allocator Allocator for the newly return Pointer. \return A new Pointer with appended token. */ GenericPointer Append(const Ch* name, SizeType length, Allocator* allocator = 0) const { Token token = { name, length, kPointerInvalidIndex }; return Append(token, allocator); } //! Append a name token without length, and return a new Pointer /*! \param name Name (const Ch*) to be appended. \param allocator Allocator for the newly return Pointer. \return A new Pointer with appended token. */ template RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >), (GenericPointer)) Append(T* name, Allocator* allocator = 0) const { return Append(name, internal::StrLen(name), allocator); } #if RAPIDJSON_HAS_STDSTRING //! Append a name token, and return a new Pointer /*! \param name Name to be appended. \param allocator Allocator for the newly return Pointer. \return A new Pointer with appended token. */ GenericPointer Append(const std::basic_string& name, Allocator* allocator = 0) const { return Append(name.c_str(), static_cast(name.size()), allocator); } #endif //! Append a index token, and return a new Pointer /*! \param index Index to be appended. \param allocator Allocator for the newly return Pointer. \return A new Pointer with appended token. */ GenericPointer Append(SizeType index, Allocator* allocator = 0) const { char buffer[21]; char* end = sizeof(SizeType) == 4 ? internal::u32toa(index, buffer) : internal::u64toa(index, buffer); SizeType length = static_cast(end - buffer); buffer[length] = '\0'; if (sizeof(Ch) == 1) { Token token = { reinterpret_cast(buffer), length, index }; return Append(token, allocator); } else { Ch name[21]; for (size_t i = 0; i <= length; i++) name[i] = static_cast(buffer[i]); Token token = { name, length, index }; return Append(token, allocator); } } //! Append a token by value, and return a new Pointer /*! \param token token to be appended. \param allocator Allocator for the newly return Pointer. \return A new Pointer with appended token. */ GenericPointer Append(const ValueType& token, Allocator* allocator = 0) const { if (token.IsString()) return Append(token.GetString(), token.GetStringLength(), allocator); else { RAPIDJSON_ASSERT(token.IsUint64()); RAPIDJSON_ASSERT(token.GetUint64() <= SizeType(~0)); return Append(static_cast(token.GetUint64()), allocator); } } //!@name Handling Parse Error //@{ //! Check whether this is a valid pointer. bool IsValid() const { return parseErrorCode_ == kPointerParseErrorNone; } //! Get the parsing error offset in code unit. size_t GetParseErrorOffset() const { return parseErrorOffset_; } //! Get the parsing error code. PointerParseErrorCode GetParseErrorCode() const { return parseErrorCode_; } //@} //! Get the allocator of this pointer. Allocator& GetAllocator() { return *allocator_; } //!@name Tokens //@{ //! Get the token array (const version only). const Token* GetTokens() const { return tokens_; } //! Get the number of tokens. size_t GetTokenCount() const { return tokenCount_; } //@} //!@name Equality/inequality operators //@{ //! Equality operator. /*! \note When any pointers are invalid, always returns false. */ bool operator==(const GenericPointer& rhs) const { if (!IsValid() || !rhs.IsValid() || tokenCount_ != rhs.tokenCount_) return false; for (size_t i = 0; i < tokenCount_; i++) { if (tokens_[i].index != rhs.tokens_[i].index || tokens_[i].length != rhs.tokens_[i].length || (tokens_[i].length != 0 && std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch)* tokens_[i].length) != 0)) { return false; } } return true; } //! Inequality operator. /*! \note When any pointers are invalid, always returns true. */ bool operator!=(const GenericPointer& rhs) const { return !(*this == rhs); } //! Less than operator. /*! \note Invalid pointers are always greater than valid ones. */ bool operator<(const GenericPointer& rhs) const { if (!IsValid()) return false; if (!rhs.IsValid()) return true; if (tokenCount_ != rhs.tokenCount_) return tokenCount_ < rhs.tokenCount_; for (size_t i = 0; i < tokenCount_; i++) { if (tokens_[i].index != rhs.tokens_[i].index) return tokens_[i].index < rhs.tokens_[i].index; if (tokens_[i].length != rhs.tokens_[i].length) return tokens_[i].length < rhs.tokens_[i].length; if (int cmp = std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch) * tokens_[i].length)) return cmp < 0; } return false; } //@} //!@name Stringify //@{ //! Stringify the pointer into string representation. /*! \tparam OutputStream Type of output stream. \param os The output stream. */ template bool Stringify(OutputStream& os) const { return Stringify(os); } //! Stringify the pointer into URI fragment representation. /*! \tparam OutputStream Type of output stream. \param os The output stream. */ template bool StringifyUriFragment(OutputStream& os) const { return Stringify(os); } //@} //!@name Create value //@{ //! Create a value in a subtree. /*! If the value is not exist, it creates all parent values and a JSON Null value. So it always succeed and return the newly created or existing value. Remind that it may change types of parents according to tokens, so it potentially removes previously stored values. For example, if a document was an array, and "/foo" is used to create a value, then the document will be changed to an object, and all existing array elements are lost. \param root Root value of a DOM subtree to be resolved. It can be any value other than document root. \param allocator Allocator for creating the values if the specified value or its parents are not exist. \param alreadyExist If non-null, it stores whether the resolved value is already exist. \return The resolved newly created (a JSON Null value), or already exists value. */ ValueType& Create(ValueType& root, typename ValueType::AllocatorType& allocator, bool* alreadyExist = 0) const { RAPIDJSON_ASSERT(IsValid()); ValueType* v = &root; bool exist = true; for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { if (v->IsArray() && t->name[0] == '-' && t->length == 1) { v->PushBack(ValueType().Move(), allocator); v = &((*v)[v->Size() - 1]); exist = false; } else { if (t->index == kPointerInvalidIndex) { // must be object name if (!v->IsObject()) v->SetObject(); // Change to Object } else { // object name or array index if (!v->IsArray() && !v->IsObject()) v->SetArray(); // Change to Array } if (v->IsArray()) { if (t->index >= v->Size()) { v->Reserve(t->index + 1, allocator); while (t->index >= v->Size()) v->PushBack(ValueType().Move(), allocator); exist = false; } v = &((*v)[t->index]); } else { typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); if (m == v->MemberEnd()) { v->AddMember(ValueType(t->name, t->length, allocator).Move(), ValueType().Move(), allocator); m = v->MemberEnd(); v = &(--m)->value; // Assumes AddMember() appends at the end exist = false; } else v = &m->value; } } } if (alreadyExist) *alreadyExist = exist; return *v; } //! Creates a value in a document. /*! \param document A document to be resolved. \param alreadyExist If non-null, it stores whether the resolved value is already exist. \return The resolved newly created, or already exists value. */ template ValueType& Create(GenericDocument& document, bool* alreadyExist = 0) const { return Create(document, document.GetAllocator(), alreadyExist); } //@} //!@name Compute URI //@{ //! Compute the in-scope URI for a subtree. // For use with JSON pointers into JSON schema documents. /*! \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. \param rootUri Root URI \param unresolvedTokenIndex If the pointer cannot resolve a token in the pointer, this parameter can obtain the index of unresolved token. \param allocator Allocator for Uris \return Uri if it can be resolved. Otherwise null. \note There are only 3 situations when a URI cannot be resolved: 1. A value in the path is not an array nor object. 2. An object value does not contain the token. 3. A token is out of range of an array value. Use unresolvedTokenIndex to retrieve the token index. */ UriType GetUri(ValueType& root, const UriType& rootUri, size_t* unresolvedTokenIndex = 0, Allocator* allocator = 0) const { static const Ch kIdString[] = { 'i', 'd', '\0' }; static const ValueType kIdValue(kIdString, 2); UriType base = UriType(rootUri, allocator); RAPIDJSON_ASSERT(IsValid()); ValueType* v = &root; for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { switch (v->GetType()) { case kObjectType: { // See if we have an id, and if so resolve with the current base typename ValueType::MemberIterator m = v->FindMember(kIdValue); if (m != v->MemberEnd() && (m->value).IsString()) { UriType here = UriType(m->value, allocator).Resolve(base, allocator); base = here; } m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); if (m == v->MemberEnd()) break; v = &m->value; } continue; case kArrayType: if (t->index == kPointerInvalidIndex || t->index >= v->Size()) break; v = &((*v)[t->index]); continue; default: break; } // Error: unresolved token if (unresolvedTokenIndex) *unresolvedTokenIndex = static_cast(t - tokens_); return UriType(allocator); } return base; } UriType GetUri(const ValueType& root, const UriType& rootUri, size_t* unresolvedTokenIndex = 0, Allocator* allocator = 0) const { return GetUri(const_cast(root), rootUri, unresolvedTokenIndex, allocator); } //!@name Query value //@{ //! Query a value in a subtree. /*! \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. \param unresolvedTokenIndex If the pointer cannot resolve a token in the pointer, this parameter can obtain the index of unresolved token. \return Pointer to the value if it can be resolved. Otherwise null. \note There are only 3 situations when a value cannot be resolved: 1. A value in the path is not an array nor object. 2. An object value does not contain the token. 3. A token is out of range of an array value. Use unresolvedTokenIndex to retrieve the token index. */ ValueType* Get(ValueType& root, size_t* unresolvedTokenIndex = 0) const { RAPIDJSON_ASSERT(IsValid()); ValueType* v = &root; for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { switch (v->GetType()) { case kObjectType: { typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); if (m == v->MemberEnd()) break; v = &m->value; } continue; case kArrayType: if (t->index == kPointerInvalidIndex || t->index >= v->Size()) break; v = &((*v)[t->index]); continue; default: break; } // Error: unresolved token if (unresolvedTokenIndex) *unresolvedTokenIndex = static_cast(t - tokens_); return 0; } return v; } //! Query a const value in a const subtree. /*! \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. \return Pointer to the value if it can be resolved. Otherwise null. */ const ValueType* Get(const ValueType& root, size_t* unresolvedTokenIndex = 0) const { return Get(const_cast(root), unresolvedTokenIndex); } //@} //!@name Query a value with default //@{ //! Query a value in a subtree with default value. /*! Similar to Get(), but if the specified value do not exists, it creates all parents and clone the default value. So that this function always succeed. \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. \param defaultValue Default value to be cloned if the value was not exists. \param allocator Allocator for creating the values if the specified value or its parents are not exist. \see Create() */ ValueType& GetWithDefault(ValueType& root, const ValueType& defaultValue, typename ValueType::AllocatorType& allocator) const { bool alreadyExist; ValueType& v = Create(root, allocator, &alreadyExist); return alreadyExist ? v : v.CopyFrom(defaultValue, allocator); } //! Query a value in a subtree with default null-terminated string. ValueType& GetWithDefault(ValueType& root, const Ch* defaultValue, typename ValueType::AllocatorType& allocator) const { bool alreadyExist; ValueType& v = Create(root, allocator, &alreadyExist); return alreadyExist ? v : v.SetString(defaultValue, allocator); } #if RAPIDJSON_HAS_STDSTRING //! Query a value in a subtree with default std::basic_string. ValueType& GetWithDefault(ValueType& root, const std::basic_string& defaultValue, typename ValueType::AllocatorType& allocator) const { bool alreadyExist; ValueType& v = Create(root, allocator, &alreadyExist); return alreadyExist ? v : v.SetString(defaultValue, allocator); } #endif //! Query a value in a subtree with default primitive value. /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool */ template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) GetWithDefault(ValueType& root, T defaultValue, typename ValueType::AllocatorType& allocator) const { return GetWithDefault(root, ValueType(defaultValue).Move(), allocator); } //! Query a value in a document with default value. template ValueType& GetWithDefault(GenericDocument& document, const ValueType& defaultValue) const { return GetWithDefault(document, defaultValue, document.GetAllocator()); } //! Query a value in a document with default null-terminated string. template ValueType& GetWithDefault(GenericDocument& document, const Ch* defaultValue) const { return GetWithDefault(document, defaultValue, document.GetAllocator()); } #if RAPIDJSON_HAS_STDSTRING //! Query a value in a document with default std::basic_string. template ValueType& GetWithDefault(GenericDocument& document, const std::basic_string& defaultValue) const { return GetWithDefault(document, defaultValue, document.GetAllocator()); } #endif //! Query a value in a document with default primitive value. /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool */ template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) GetWithDefault(GenericDocument& document, T defaultValue) const { return GetWithDefault(document, defaultValue, document.GetAllocator()); } //@} //!@name Set a value //@{ //! Set a value in a subtree, with move semantics. /*! It creates all parents if they are not exist or types are different to the tokens. So this function always succeeds but potentially remove existing values. \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. \param value Value to be set. \param allocator Allocator for creating the values if the specified value or its parents are not exist. \see Create() */ ValueType& Set(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { return Create(root, allocator) = value; } //! Set a value in a subtree, with copy semantics. ValueType& Set(ValueType& root, const ValueType& value, typename ValueType::AllocatorType& allocator) const { return Create(root, allocator).CopyFrom(value, allocator); } //! Set a null-terminated string in a subtree. ValueType& Set(ValueType& root, const Ch* value, typename ValueType::AllocatorType& allocator) const { return Create(root, allocator) = ValueType(value, allocator).Move(); } #if RAPIDJSON_HAS_STDSTRING //! Set a std::basic_string in a subtree. ValueType& Set(ValueType& root, const std::basic_string& value, typename ValueType::AllocatorType& allocator) const { return Create(root, allocator) = ValueType(value, allocator).Move(); } #endif //! Set a primitive value in a subtree. /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool */ template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) Set(ValueType& root, T value, typename ValueType::AllocatorType& allocator) const { return Create(root, allocator) = ValueType(value).Move(); } //! Set a value in a document, with move semantics. template ValueType& Set(GenericDocument& document, ValueType& value) const { return Create(document) = value; } //! Set a value in a document, with copy semantics. template ValueType& Set(GenericDocument& document, const ValueType& value) const { return Create(document).CopyFrom(value, document.GetAllocator()); } //! Set a null-terminated string in a document. template ValueType& Set(GenericDocument& document, const Ch* value) const { return Create(document) = ValueType(value, document.GetAllocator()).Move(); } #if RAPIDJSON_HAS_STDSTRING //! Sets a std::basic_string in a document. template ValueType& Set(GenericDocument& document, const std::basic_string& value) const { return Create(document) = ValueType(value, document.GetAllocator()).Move(); } #endif //! Set a primitive value in a document. /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool */ template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) Set(GenericDocument& document, T value) const { return Create(document) = value; } //@} //!@name Swap a value //@{ //! Swap a value with a value in a subtree. /*! It creates all parents if they are not exist or types are different to the tokens. So this function always succeeds but potentially remove existing values. \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. \param value Value to be swapped. \param allocator Allocator for creating the values if the specified value or its parents are not exist. \see Create() */ ValueType& Swap(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { return Create(root, allocator).Swap(value); } //! Swap a value with a value in a document. template ValueType& Swap(GenericDocument& document, ValueType& value) const { return Create(document).Swap(value); } //@} //! Erase a value in a subtree. /*! \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. \return Whether the resolved value is found and erased. \note Erasing with an empty pointer \c Pointer(""), i.e. the root, always fail and return false. */ bool Erase(ValueType& root) const { RAPIDJSON_ASSERT(IsValid()); if (tokenCount_ == 0) // Cannot erase the root return false; ValueType* v = &root; const Token* last = tokens_ + (tokenCount_ - 1); for (const Token *t = tokens_; t != last; ++t) { switch (v->GetType()) { case kObjectType: { typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); if (m == v->MemberEnd()) return false; v = &m->value; } break; case kArrayType: if (t->index == kPointerInvalidIndex || t->index >= v->Size()) return false; v = &((*v)[t->index]); break; default: return false; } } switch (v->GetType()) { case kObjectType: return v->EraseMember(GenericStringRef(last->name, last->length)); case kArrayType: if (last->index == kPointerInvalidIndex || last->index >= v->Size()) return false; v->Erase(v->Begin() + last->index); return true; default: return false; } } private: //! Clone the content from rhs to this. /*! \param rhs Source pointer. \param extraToken Extra tokens to be allocated. \param extraNameBufferSize Extra name buffer size (in number of Ch) to be allocated. \return Start of non-occupied name buffer, for storing extra names. */ Ch* CopyFromRaw(const GenericPointer& rhs, size_t extraToken = 0, size_t extraNameBufferSize = 0) { if (!allocator_) // allocator is independently owned. ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); size_t nameBufferSize = rhs.tokenCount_; // null terminators for tokens for (Token *t = rhs.tokens_; t != rhs.tokens_ + rhs.tokenCount_; ++t) nameBufferSize += t->length; tokenCount_ = rhs.tokenCount_ + extraToken; tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + (nameBufferSize + extraNameBufferSize) * sizeof(Ch))); nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); if (rhs.tokenCount_ > 0) { std::memcpy(tokens_, rhs.tokens_, rhs.tokenCount_ * sizeof(Token)); } if (nameBufferSize > 0) { std::memcpy(nameBuffer_, rhs.nameBuffer_, nameBufferSize * sizeof(Ch)); } // The names of each token point to a string in the nameBuffer_. The // previous memcpy copied over string pointers into the rhs.nameBuffer_, // but they should point to the strings in the new nameBuffer_. for (size_t i = 0; i < rhs.tokenCount_; ++i) { // The offset between the string address and the name buffer should // still be constant, so we can just get this offset and set each new // token name according the new buffer start + the known offset. std::ptrdiff_t name_offset = rhs.tokens_[i].name - rhs.nameBuffer_; tokens_[i].name = nameBuffer_ + name_offset; } return nameBuffer_ + nameBufferSize; } //! Check whether a character should be percent-encoded. /*! According to RFC 3986 2.3 Unreserved Characters. \param c The character (code unit) to be tested. */ bool NeedPercentEncode(Ch c) const { return !((c >= '0' && c <= '9') || (c >= 'A' && c <='Z') || (c >= 'a' && c <= 'z') || c == '-' || c == '.' || c == '_' || c =='~'); } //! Parse a JSON String or its URI fragment representation into tokens. #ifndef __clang__ // -Wdocumentation /*! \param source Either a JSON Pointer string, or its URI fragment representation. Not need to be null terminated. \param length Length of the source string. \note Source cannot be JSON String Representation of JSON Pointer, e.g. In "/\u0000", \u0000 will not be unescaped. */ #endif void Parse(const Ch* source, size_t length) { RAPIDJSON_ASSERT(source != NULL); RAPIDJSON_ASSERT(nameBuffer_ == 0); RAPIDJSON_ASSERT(tokens_ == 0); // Create own allocator if user did not supply. if (!allocator_) ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); // Count number of '/' as tokenCount tokenCount_ = 0; for (const Ch* s = source; s != source + length; s++) if (*s == '/') tokenCount_++; Token* token = tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + length * sizeof(Ch))); Ch* name = nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); size_t i = 0; // Detect if it is a URI fragment bool uriFragment = false; if (source[i] == '#') { uriFragment = true; i++; } if (i != length && source[i] != '/') { parseErrorCode_ = kPointerParseErrorTokenMustBeginWithSolidus; goto error; } while (i < length) { RAPIDJSON_ASSERT(source[i] == '/'); i++; // consumes '/' token->name = name; bool isNumber = true; while (i < length && source[i] != '/') { Ch c = source[i]; if (uriFragment) { // Decoding percent-encoding for URI fragment if (c == '%') { PercentDecodeStream is(&source[i], source + length); GenericInsituStringStream os(name); Ch* begin = os.PutBegin(); if (!Transcoder, EncodingType>().Validate(is, os) || !is.IsValid()) { parseErrorCode_ = kPointerParseErrorInvalidPercentEncoding; goto error; } size_t len = os.PutEnd(begin); i += is.Tell() - 1; if (len == 1) c = *name; else { name += len; isNumber = false; i++; continue; } } else if (NeedPercentEncode(c)) { parseErrorCode_ = kPointerParseErrorCharacterMustPercentEncode; goto error; } } i++; // Escaping "~0" -> '~', "~1" -> '/' if (c == '~') { if (i < length) { c = source[i]; if (c == '0') c = '~'; else if (c == '1') c = '/'; else { parseErrorCode_ = kPointerParseErrorInvalidEscape; goto error; } i++; } else { parseErrorCode_ = kPointerParseErrorInvalidEscape; goto error; } } // First check for index: all of characters are digit if (c < '0' || c > '9') isNumber = false; *name++ = c; } token->length = static_cast(name - token->name); if (token->length == 0) isNumber = false; *name++ = '\0'; // Null terminator // Second check for index: more than one digit cannot have leading zero if (isNumber && token->length > 1 && token->name[0] == '0') isNumber = false; // String to SizeType conversion SizeType n = 0; if (isNumber) { for (size_t j = 0; j < token->length; j++) { SizeType m = n * 10 + static_cast(token->name[j] - '0'); if (m < n) { // overflow detection isNumber = false; break; } n = m; } } token->index = isNumber ? n : kPointerInvalidIndex; token++; } RAPIDJSON_ASSERT(name <= nameBuffer_ + length); // Should not overflow buffer parseErrorCode_ = kPointerParseErrorNone; return; error: Allocator::Free(tokens_); nameBuffer_ = 0; tokens_ = 0; tokenCount_ = 0; parseErrorOffset_ = i; return; } //! Stringify to string or URI fragment representation. /*! \tparam uriFragment True for stringifying to URI fragment representation. False for string representation. \tparam OutputStream type of output stream. \param os The output stream. */ template bool Stringify(OutputStream& os) const { RAPIDJSON_ASSERT(IsValid()); if (uriFragment) os.Put('#'); for (Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { os.Put('/'); for (size_t j = 0; j < t->length; j++) { Ch c = t->name[j]; if (c == '~') { os.Put('~'); os.Put('0'); } else if (c == '/') { os.Put('~'); os.Put('1'); } else if (uriFragment && NeedPercentEncode(c)) { // Transcode to UTF8 sequence GenericStringStream source(&t->name[j]); PercentEncodeStream target(os); if (!Transcoder >().Validate(source, target)) return false; j += source.Tell() - 1; } else os.Put(c); } } return true; } //! A helper stream for decoding a percent-encoded sequence into code unit. /*! This stream decodes %XY triplet into code unit (0-255). If it encounters invalid characters, it sets output code unit as 0 and mark invalid, and to be checked by IsValid(). */ class PercentDecodeStream { public: typedef typename ValueType::Ch Ch; //! Constructor /*! \param source Start of the stream \param end Past-the-end of the stream. */ PercentDecodeStream(const Ch* source, const Ch* end) : src_(source), head_(source), end_(end), valid_(true) {} Ch Take() { if (*src_ != '%' || src_ + 3 > end_) { // %XY triplet valid_ = false; return 0; } src_++; Ch c = 0; for (int j = 0; j < 2; j++) { c = static_cast(c << 4); Ch h = *src_; if (h >= '0' && h <= '9') c = static_cast(c + h - '0'); else if (h >= 'A' && h <= 'F') c = static_cast(c + h - 'A' + 10); else if (h >= 'a' && h <= 'f') c = static_cast(c + h - 'a' + 10); else { valid_ = false; return 0; } src_++; } return c; } size_t Tell() const { return static_cast(src_ - head_); } bool IsValid() const { return valid_; } private: const Ch* src_; //!< Current read position. const Ch* head_; //!< Original head of the string. const Ch* end_; //!< Past-the-end position. bool valid_; //!< Whether the parsing is valid. }; //! A helper stream to encode character (UTF-8 code unit) into percent-encoded sequence. template class PercentEncodeStream { public: PercentEncodeStream(OutputStream& os) : os_(os) {} void Put(char c) { // UTF-8 must be byte unsigned char u = static_cast(c); static const char hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; os_.Put('%'); os_.Put(static_cast(hexDigits[u >> 4])); os_.Put(static_cast(hexDigits[u & 15])); } private: OutputStream& os_; }; Allocator* allocator_; //!< The current allocator. It is either user-supplied or equal to ownAllocator_. Allocator* ownAllocator_; //!< Allocator owned by this Pointer. Ch* nameBuffer_; //!< A buffer containing all names in tokens. Token* tokens_; //!< A list of tokens. size_t tokenCount_; //!< Number of tokens in tokens_. size_t parseErrorOffset_; //!< Offset in code unit when parsing fail. PointerParseErrorCode parseErrorCode_; //!< Parsing error code. }; //! GenericPointer for Value (UTF-8, default allocator). typedef GenericPointer Pointer; //!@name Helper functions for GenericPointer //@{ ////////////////////////////////////////////////////////////////////////////// template typename T::ValueType& CreateValueByPointer(T& root, const GenericPointer& pointer, typename T::AllocatorType& a) { return pointer.Create(root, a); } template typename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N], typename T::AllocatorType& a) { return GenericPointer(source, N - 1).Create(root, a); } // No allocator parameter template typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const GenericPointer& pointer) { return pointer.Create(document); } template typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const CharType(&source)[N]) { return GenericPointer(source, N - 1).Create(document); } ////////////////////////////////////////////////////////////////////////////// template typename T::ValueType* GetValueByPointer(T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { return pointer.Get(root, unresolvedTokenIndex); } template const typename T::ValueType* GetValueByPointer(const T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { return pointer.Get(root, unresolvedTokenIndex); } template typename T::ValueType* GetValueByPointer(T& root, const CharType (&source)[N], size_t* unresolvedTokenIndex = 0) { return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); } template const typename T::ValueType* GetValueByPointer(const T& root, const CharType(&source)[N], size_t* unresolvedTokenIndex = 0) { return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); } ////////////////////////////////////////////////////////////////////////////// template typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { return pointer.GetWithDefault(root, defaultValue, a); } template typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::Ch* defaultValue, typename T::AllocatorType& a) { return pointer.GetWithDefault(root, defaultValue, a); } #if RAPIDJSON_HAS_STDSTRING template typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const std::basic_string& defaultValue, typename T::AllocatorType& a) { return pointer.GetWithDefault(root, defaultValue, a); } #endif template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, T2 defaultValue, typename T::AllocatorType& a) { return pointer.GetWithDefault(root, defaultValue, a); } template typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); } template typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue, typename T::AllocatorType& a) { return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); } #if RAPIDJSON_HAS_STDSTRING template typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const std::basic_string& defaultValue, typename T::AllocatorType& a) { return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); } #endif template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) GetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue, typename T::AllocatorType& a) { return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); } // No allocator parameter template typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& defaultValue) { return pointer.GetWithDefault(document, defaultValue); } template typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* defaultValue) { return pointer.GetWithDefault(document, defaultValue); } #if RAPIDJSON_HAS_STDSTRING template typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const std::basic_string& defaultValue) { return pointer.GetWithDefault(document, defaultValue); } #endif template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, T2 defaultValue) { return pointer.GetWithDefault(document, defaultValue); } template typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& defaultValue) { return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); } template typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* defaultValue) { return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); } #if RAPIDJSON_HAS_STDSTRING template typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const std::basic_string& defaultValue) { return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); } #endif template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], T2 defaultValue) { return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); } ////////////////////////////////////////////////////////////////////////////// template typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { return pointer.Set(root, value, a); } template typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::ValueType& value, typename T::AllocatorType& a) { return pointer.Set(root, value, a); } template typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::Ch* value, typename T::AllocatorType& a) { return pointer.Set(root, value, a); } #if RAPIDJSON_HAS_STDSTRING template typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const std::basic_string& value, typename T::AllocatorType& a) { return pointer.Set(root, value, a); } #endif template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) SetValueByPointer(T& root, const GenericPointer& pointer, T2 value, typename T::AllocatorType& a) { return pointer.Set(root, value, a); } template typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { return GenericPointer(source, N - 1).Set(root, value, a); } template typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::ValueType& value, typename T::AllocatorType& a) { return GenericPointer(source, N - 1).Set(root, value, a); } template typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value, typename T::AllocatorType& a) { return GenericPointer(source, N - 1).Set(root, value, a); } #if RAPIDJSON_HAS_STDSTRING template typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const std::basic_string& value, typename T::AllocatorType& a) { return GenericPointer(source, N - 1).Set(root, value, a); } #endif template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) SetValueByPointer(T& root, const CharType(&source)[N], T2 value, typename T::AllocatorType& a) { return GenericPointer(source, N - 1).Set(root, value, a); } // No allocator parameter template typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { return pointer.Set(document, value); } template typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& value) { return pointer.Set(document, value); } template typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* value) { return pointer.Set(document, value); } #if RAPIDJSON_HAS_STDSTRING template typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const std::basic_string& value) { return pointer.Set(document, value); } #endif template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) SetValueByPointer(DocumentType& document, const GenericPointer& pointer, T2 value) { return pointer.Set(document, value); } template typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { return GenericPointer(source, N - 1).Set(document, value); } template typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& value) { return GenericPointer(source, N - 1).Set(document, value); } template typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* value) { return GenericPointer(source, N - 1).Set(document, value); } #if RAPIDJSON_HAS_STDSTRING template typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const std::basic_string& value) { return GenericPointer(source, N - 1).Set(document, value); } #endif template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) SetValueByPointer(DocumentType& document, const CharType(&source)[N], T2 value) { return GenericPointer(source, N - 1).Set(document, value); } ////////////////////////////////////////////////////////////////////////////// template typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { return pointer.Swap(root, value, a); } template typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { return GenericPointer(source, N - 1).Swap(root, value, a); } template typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { return pointer.Swap(document, value); } template typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { return GenericPointer(source, N - 1).Swap(document, value); } ////////////////////////////////////////////////////////////////////////////// template bool EraseValueByPointer(T& root, const GenericPointer& pointer) { return pointer.Erase(root); } template bool EraseValueByPointer(T& root, const CharType(&source)[N]) { return GenericPointer(source, N - 1).Erase(root); } //@} RAPIDJSON_NAMESPACE_END #if defined(__clang__) || defined(_MSC_VER) RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_POINTER_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/encodedstream.h0000644000000000000000000002462115031566105026320 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_ENCODEDSTREAM_H_ #define RAPIDJSON_ENCODEDSTREAM_H_ #include "stream.h" #include "memorystream.h" #ifdef __GNUC__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) #endif #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(padded) #endif RAPIDJSON_NAMESPACE_BEGIN //! Input byte stream wrapper with a statically bound encoding. /*! \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. \tparam InputByteStream Type of input byte stream. For example, FileReadStream. */ template class EncodedInputStream { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); public: typedef typename Encoding::Ch Ch; EncodedInputStream(InputByteStream& is) : is_(is) { current_ = Encoding::TakeBOM(is_); } Ch Peek() const { return current_; } Ch Take() { Ch c = current_; current_ = Encoding::Take(is_); return c; } size_t Tell() const { return is_.Tell(); } // Not implemented void Put(Ch) { RAPIDJSON_ASSERT(false); } void Flush() { RAPIDJSON_ASSERT(false); } Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } private: EncodedInputStream(const EncodedInputStream&); EncodedInputStream& operator=(const EncodedInputStream&); InputByteStream& is_; Ch current_; }; //! Specialized for UTF8 MemoryStream. template <> class EncodedInputStream, MemoryStream> { public: typedef UTF8<>::Ch Ch; EncodedInputStream(MemoryStream& is) : is_(is) { if (static_cast(is_.Peek()) == 0xEFu) is_.Take(); if (static_cast(is_.Peek()) == 0xBBu) is_.Take(); if (static_cast(is_.Peek()) == 0xBFu) is_.Take(); } Ch Peek() const { return is_.Peek(); } Ch Take() { return is_.Take(); } size_t Tell() const { return is_.Tell(); } // Not implemented void Put(Ch) {} void Flush() {} Ch* PutBegin() { return 0; } size_t PutEnd(Ch*) { return 0; } MemoryStream& is_; private: EncodedInputStream(const EncodedInputStream&); EncodedInputStream& operator=(const EncodedInputStream&); }; //! Output byte stream wrapper with statically bound encoding. /*! \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. \tparam OutputByteStream Type of input byte stream. For example, FileWriteStream. */ template class EncodedOutputStream { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); public: typedef typename Encoding::Ch Ch; EncodedOutputStream(OutputByteStream& os, bool putBOM = true) : os_(os) { if (putBOM) Encoding::PutBOM(os_); } void Put(Ch c) { Encoding::Put(os_, c); } void Flush() { os_.Flush(); } // Not implemented Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} Ch Take() { RAPIDJSON_ASSERT(false); return 0;} size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } private: EncodedOutputStream(const EncodedOutputStream&); EncodedOutputStream& operator=(const EncodedOutputStream&); OutputByteStream& os_; }; #define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x //! Input stream wrapper with dynamically bound encoding and automatic encoding detection. /*! \tparam CharType Type of character for reading. \tparam InputByteStream type of input byte stream to be wrapped. */ template class AutoUTFInputStream { RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); public: typedef CharType Ch; //! Constructor. /*! \param is input stream to be wrapped. \param type UTF encoding type if it is not detected from the stream. */ AutoUTFInputStream(InputByteStream& is, UTFType type = kUTF8) : is_(&is), type_(type), hasBOM_(false) { RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); DetectType(); static const TakeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Take) }; takeFunc_ = f[type_]; current_ = takeFunc_(*is_); } UTFType GetType() const { return type_; } bool HasBOM() const { return hasBOM_; } Ch Peek() const { return current_; } Ch Take() { Ch c = current_; current_ = takeFunc_(*is_); return c; } size_t Tell() const { return is_->Tell(); } // Not implemented void Put(Ch) { RAPIDJSON_ASSERT(false); } void Flush() { RAPIDJSON_ASSERT(false); } Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } private: AutoUTFInputStream(const AutoUTFInputStream&); AutoUTFInputStream& operator=(const AutoUTFInputStream&); // Detect encoding type with BOM or RFC 4627 void DetectType() { // BOM (Byte Order Mark): // 00 00 FE FF UTF-32BE // FF FE 00 00 UTF-32LE // FE FF UTF-16BE // FF FE UTF-16LE // EF BB BF UTF-8 const unsigned char* c = reinterpret_cast(is_->Peek4()); if (!c) return; unsigned bom = static_cast(c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24)); hasBOM_ = false; if (bom == 0xFFFE0000) { type_ = kUTF32BE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } else if (bom == 0x0000FEFF) { type_ = kUTF32LE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } else if ((bom & 0xFFFF) == 0xFFFE) { type_ = kUTF16BE; hasBOM_ = true; is_->Take(); is_->Take(); } else if ((bom & 0xFFFF) == 0xFEFF) { type_ = kUTF16LE; hasBOM_ = true; is_->Take(); is_->Take(); } else if ((bom & 0xFFFFFF) == 0xBFBBEF) { type_ = kUTF8; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); } // RFC 4627: Section 3 // "Since the first two characters of a JSON text will always be ASCII // characters [RFC0020], it is possible to determine whether an octet // stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking // at the pattern of nulls in the first four octets." // 00 00 00 xx UTF-32BE // 00 xx 00 xx UTF-16BE // xx 00 00 00 UTF-32LE // xx 00 xx 00 UTF-16LE // xx xx xx xx UTF-8 if (!hasBOM_) { int pattern = (c[0] ? 1 : 0) | (c[1] ? 2 : 0) | (c[2] ? 4 : 0) | (c[3] ? 8 : 0); switch (pattern) { case 0x08: type_ = kUTF32BE; break; case 0x0A: type_ = kUTF16BE; break; case 0x01: type_ = kUTF32LE; break; case 0x05: type_ = kUTF16LE; break; case 0x0F: type_ = kUTF8; break; default: break; // Use type defined by user. } } // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); } typedef Ch (*TakeFunc)(InputByteStream& is); InputByteStream* is_; UTFType type_; Ch current_; TakeFunc takeFunc_; bool hasBOM_; }; //! Output stream wrapper with dynamically bound encoding and automatic encoding detection. /*! \tparam CharType Type of character for writing. \tparam OutputByteStream type of output byte stream to be wrapped. */ template class AutoUTFOutputStream { RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); public: typedef CharType Ch; //! Constructor. /*! \param os output stream to be wrapped. \param type UTF encoding type. \param putBOM Whether to write BOM at the beginning of the stream. */ AutoUTFOutputStream(OutputByteStream& os, UTFType type, bool putBOM) : os_(&os), type_(type) { RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); static const PutFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Put) }; putFunc_ = f[type_]; if (putBOM) PutBOM(); } UTFType GetType() const { return type_; } void Put(Ch c) { putFunc_(*os_, c); } void Flush() { os_->Flush(); } // Not implemented Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} Ch Take() { RAPIDJSON_ASSERT(false); return 0;} size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } private: AutoUTFOutputStream(const AutoUTFOutputStream&); AutoUTFOutputStream& operator=(const AutoUTFOutputStream&); void PutBOM() { typedef void (*PutBOMFunc)(OutputByteStream&); static const PutBOMFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(PutBOM) }; f[type_](*os_); } typedef void (*PutFunc)(OutputByteStream&, Ch); OutputByteStream* os_; UTFType type_; PutFunc putFunc_; }; #undef RAPIDJSON_ENCODINGS_FUNC RAPIDJSON_NAMESPACE_END #ifdef __clang__ RAPIDJSON_DIAG_POP #endif #ifdef __GNUC__ RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_FILESTREAM_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/internal/0000755000000000000000000000000015031566105025141 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/internal/dtoa.h0000644000000000000000000002042515031566105026244 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. // This is a C++ header-only implementation of Grisu2 algorithm from the publication: // Loitsch, Florian. "Printing floating-point numbers quickly and accurately with // integers." ACM Sigplan Notices 45.6 (2010): 233-243. #ifndef RAPIDJSON_DTOA_ #define RAPIDJSON_DTOA_ #include "itoa.h" // GetDigitsLut() #include "diyfp.h" #include "ieee754.h" RAPIDJSON_NAMESPACE_BEGIN namespace internal { #ifdef __GNUC__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) RAPIDJSON_DIAG_OFF(array-bounds) // some gcc versions generate wrong warnings https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59124 #endif inline void GrisuRound(char* buffer, int len, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w) { while (rest < wp_w && delta - rest >= ten_kappa && (rest + ten_kappa < wp_w || /// closer wp_w - rest > rest + ten_kappa - wp_w)) { buffer[len - 1]--; rest += ten_kappa; } } inline int CountDecimalDigit32(uint32_t n) { // Simple pure C++ implementation was faster than __builtin_clz version in this situation. if (n < 10) return 1; if (n < 100) return 2; if (n < 1000) return 3; if (n < 10000) return 4; if (n < 100000) return 5; if (n < 1000000) return 6; if (n < 10000000) return 7; if (n < 100000000) return 8; // Will not reach 10 digits in DigitGen() //if (n < 1000000000) return 9; //return 10; return 9; } inline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buffer, int* len, int* K) { static const uint64_t kPow10[] = { 1ULL, 10ULL, 100ULL, 1000ULL, 10000ULL, 100000ULL, 1000000ULL, 10000000ULL, 100000000ULL, 1000000000ULL, 10000000000ULL, 100000000000ULL, 1000000000000ULL, 10000000000000ULL, 100000000000000ULL, 1000000000000000ULL, 10000000000000000ULL, 100000000000000000ULL, 1000000000000000000ULL, 10000000000000000000ULL }; const DiyFp one(uint64_t(1) << -Mp.e, Mp.e); const DiyFp wp_w = Mp - W; uint32_t p1 = static_cast(Mp.f >> -one.e); uint64_t p2 = Mp.f & (one.f - 1); int kappa = CountDecimalDigit32(p1); // kappa in [0, 9] *len = 0; while (kappa > 0) { uint32_t d = 0; switch (kappa) { case 9: d = p1 / 100000000; p1 %= 100000000; break; case 8: d = p1 / 10000000; p1 %= 10000000; break; case 7: d = p1 / 1000000; p1 %= 1000000; break; case 6: d = p1 / 100000; p1 %= 100000; break; case 5: d = p1 / 10000; p1 %= 10000; break; case 4: d = p1 / 1000; p1 %= 1000; break; case 3: d = p1 / 100; p1 %= 100; break; case 2: d = p1 / 10; p1 %= 10; break; case 1: d = p1; p1 = 0; break; default:; } if (d || *len) buffer[(*len)++] = static_cast('0' + static_cast(d)); kappa--; uint64_t tmp = (static_cast(p1) << -one.e) + p2; if (tmp <= delta) { *K += kappa; GrisuRound(buffer, *len, delta, tmp, kPow10[kappa] << -one.e, wp_w.f); return; } } // kappa = 0 for (;;) { p2 *= 10; delta *= 10; char d = static_cast(p2 >> -one.e); if (d || *len) buffer[(*len)++] = static_cast('0' + d); p2 &= one.f - 1; kappa--; if (p2 < delta) { *K += kappa; int index = -kappa; GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * (index < 20 ? kPow10[index] : 0)); return; } } } inline void Grisu2(double value, char* buffer, int* length, int* K) { const DiyFp v(value); DiyFp w_m, w_p; v.NormalizedBoundaries(&w_m, &w_p); const DiyFp c_mk = GetCachedPower(w_p.e, K); const DiyFp W = v.Normalize() * c_mk; DiyFp Wp = w_p * c_mk; DiyFp Wm = w_m * c_mk; Wm.f++; Wp.f--; DigitGen(W, Wp, Wp.f - Wm.f, buffer, length, K); } inline char* WriteExponent(int K, char* buffer) { if (K < 0) { *buffer++ = '-'; K = -K; } if (K >= 100) { *buffer++ = static_cast('0' + static_cast(K / 100)); K %= 100; const char* d = GetDigitsLut() + K * 2; *buffer++ = d[0]; *buffer++ = d[1]; } else if (K >= 10) { const char* d = GetDigitsLut() + K * 2; *buffer++ = d[0]; *buffer++ = d[1]; } else *buffer++ = static_cast('0' + static_cast(K)); return buffer; } inline char* Prettify(char* buffer, int length, int k, int maxDecimalPlaces) { const int kk = length + k; // 10^(kk-1) <= v < 10^kk if (0 <= k && kk <= 21) { // 1234e7 -> 12340000000 for (int i = length; i < kk; i++) buffer[i] = '0'; buffer[kk] = '.'; buffer[kk + 1] = '0'; return &buffer[kk + 2]; } else if (0 < kk && kk <= 21) { // 1234e-2 -> 12.34 std::memmove(&buffer[kk + 1], &buffer[kk], static_cast(length - kk)); buffer[kk] = '.'; if (0 > k + maxDecimalPlaces) { // When maxDecimalPlaces = 2, 1.2345 -> 1.23, 1.102 -> 1.1 // Remove extra trailing zeros (at least one) after truncation. for (int i = kk + maxDecimalPlaces; i > kk + 1; i--) if (buffer[i] != '0') return &buffer[i + 1]; return &buffer[kk + 2]; // Reserve one zero } else return &buffer[length + 1]; } else if (-6 < kk && kk <= 0) { // 1234e-6 -> 0.001234 const int offset = 2 - kk; std::memmove(&buffer[offset], &buffer[0], static_cast(length)); buffer[0] = '0'; buffer[1] = '.'; for (int i = 2; i < offset; i++) buffer[i] = '0'; if (length - kk > maxDecimalPlaces) { // When maxDecimalPlaces = 2, 0.123 -> 0.12, 0.102 -> 0.1 // Remove extra trailing zeros (at least one) after truncation. for (int i = maxDecimalPlaces + 1; i > 2; i--) if (buffer[i] != '0') return &buffer[i + 1]; return &buffer[3]; // Reserve one zero } else return &buffer[length + offset]; } else if (kk < -maxDecimalPlaces) { // Truncate to zero buffer[0] = '0'; buffer[1] = '.'; buffer[2] = '0'; return &buffer[3]; } else if (length == 1) { // 1e30 buffer[1] = 'e'; return WriteExponent(kk - 1, &buffer[2]); } else { // 1234e30 -> 1.234e33 std::memmove(&buffer[2], &buffer[1], static_cast(length - 1)); buffer[1] = '.'; buffer[length + 1] = 'e'; return WriteExponent(kk - 1, &buffer[0 + length + 2]); } } inline char* dtoa(double value, char* buffer, int maxDecimalPlaces = 324) { RAPIDJSON_ASSERT(maxDecimalPlaces >= 1); Double d(value); if (d.IsZero()) { if (d.Sign()) *buffer++ = '-'; // -0.0, Issue #289 buffer[0] = '0'; buffer[1] = '.'; buffer[2] = '0'; return &buffer[3]; } else { if (value < 0) { *buffer++ = '-'; value = -value; } int length, K; Grisu2(value, buffer, &length, &K); return Prettify(buffer, length, K, maxDecimalPlaces); } } #ifdef __GNUC__ RAPIDJSON_DIAG_POP #endif } // namespace internal RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_DTOA_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/internal/stack.h0000644000000000000000000001576515031566105026435 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_INTERNAL_STACK_H_ #define RAPIDJSON_INTERNAL_STACK_H_ #include "../allocators.h" #include "swap.h" #include #if defined(__clang__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(c++98-compat) #endif RAPIDJSON_NAMESPACE_BEGIN namespace internal { /////////////////////////////////////////////////////////////////////////////// // Stack //! A type-unsafe stack for storing different types of data. /*! \tparam Allocator Allocator for allocating stack memory. */ template class Stack { public: // Optimization note: Do not allocate memory for stack_ in constructor. // Do it lazily when first Push() -> Expand() -> Resize(). Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS Stack(Stack&& rhs) : allocator_(rhs.allocator_), ownAllocator_(rhs.ownAllocator_), stack_(rhs.stack_), stackTop_(rhs.stackTop_), stackEnd_(rhs.stackEnd_), initialCapacity_(rhs.initialCapacity_) { rhs.allocator_ = 0; rhs.ownAllocator_ = 0; rhs.stack_ = 0; rhs.stackTop_ = 0; rhs.stackEnd_ = 0; rhs.initialCapacity_ = 0; } #endif ~Stack() { Destroy(); } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS Stack& operator=(Stack&& rhs) { if (&rhs != this) { Destroy(); allocator_ = rhs.allocator_; ownAllocator_ = rhs.ownAllocator_; stack_ = rhs.stack_; stackTop_ = rhs.stackTop_; stackEnd_ = rhs.stackEnd_; initialCapacity_ = rhs.initialCapacity_; rhs.allocator_ = 0; rhs.ownAllocator_ = 0; rhs.stack_ = 0; rhs.stackTop_ = 0; rhs.stackEnd_ = 0; rhs.initialCapacity_ = 0; } return *this; } #endif void Swap(Stack& rhs) RAPIDJSON_NOEXCEPT { internal::Swap(allocator_, rhs.allocator_); internal::Swap(ownAllocator_, rhs.ownAllocator_); internal::Swap(stack_, rhs.stack_); internal::Swap(stackTop_, rhs.stackTop_); internal::Swap(stackEnd_, rhs.stackEnd_); internal::Swap(initialCapacity_, rhs.initialCapacity_); } void Clear() { stackTop_ = stack_; } void ShrinkToFit() { if (Empty()) { // If the stack is empty, completely deallocate the memory. Allocator::Free(stack_); // NOLINT (+clang-analyzer-unix.Malloc) stack_ = 0; stackTop_ = 0; stackEnd_ = 0; } else Resize(GetSize()); } // Optimization note: try to minimize the size of this function for force inline. // Expansion is run very infrequently, so it is moved to another (probably non-inline) function. template RAPIDJSON_FORCEINLINE void Reserve(size_t count = 1) { // Expand the stack if needed if (RAPIDJSON_UNLIKELY(static_cast(sizeof(T) * count) > (stackEnd_ - stackTop_))) Expand(count); } template RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) { Reserve(count); return PushUnsafe(count); } template RAPIDJSON_FORCEINLINE T* PushUnsafe(size_t count = 1) { RAPIDJSON_ASSERT(stackTop_); RAPIDJSON_ASSERT(static_cast(sizeof(T) * count) <= (stackEnd_ - stackTop_)); T* ret = reinterpret_cast(stackTop_); stackTop_ += sizeof(T) * count; return ret; } template T* Pop(size_t count) { RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T)); stackTop_ -= count * sizeof(T); return reinterpret_cast(stackTop_); } template T* Top() { RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); return reinterpret_cast(stackTop_ - sizeof(T)); } template const T* Top() const { RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); return reinterpret_cast(stackTop_ - sizeof(T)); } template T* End() { return reinterpret_cast(stackTop_); } template const T* End() const { return reinterpret_cast(stackTop_); } template T* Bottom() { return reinterpret_cast(stack_); } template const T* Bottom() const { return reinterpret_cast(stack_); } bool HasAllocator() const { return allocator_ != 0; } Allocator& GetAllocator() { RAPIDJSON_ASSERT(allocator_); return *allocator_; } bool Empty() const { return stackTop_ == stack_; } size_t GetSize() const { return static_cast(stackTop_ - stack_); } size_t GetCapacity() const { return static_cast(stackEnd_ - stack_); } private: template void Expand(size_t count) { // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity. size_t newCapacity; if (stack_ == 0) { if (!allocator_) ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); newCapacity = initialCapacity_; } else { newCapacity = GetCapacity(); newCapacity += (newCapacity + 1) / 2; } size_t newSize = GetSize() + sizeof(T) * count; if (newCapacity < newSize) newCapacity = newSize; Resize(newCapacity); } void Resize(size_t newCapacity) { const size_t size = GetSize(); // Backup the current size stack_ = static_cast(allocator_->Realloc(stack_, GetCapacity(), newCapacity)); stackTop_ = stack_ + size; stackEnd_ = stack_ + newCapacity; } void Destroy() { Allocator::Free(stack_); RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack } // Prohibit copy constructor & assignment operator. Stack(const Stack&); Stack& operator=(const Stack&); Allocator* allocator_; Allocator* ownAllocator_; char *stack_; char *stackTop_; char *stackEnd_; size_t initialCapacity_; }; } // namespace internal RAPIDJSON_NAMESPACE_END #if defined(__clang__) RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_STACK_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/internal/ieee754.h0000644000000000000000000000563115031566105026466 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_IEEE754_ #define RAPIDJSON_IEEE754_ #include "../rapidjson.h" RAPIDJSON_NAMESPACE_BEGIN namespace internal { class Double { public: Double() {} Double(double d) : d_(d) {} Double(uint64_t u) : u_(u) {} double Value() const { return d_; } uint64_t Uint64Value() const { return u_; } double NextPositiveDouble() const { RAPIDJSON_ASSERT(!Sign()); return Double(u_ + 1).Value(); } bool Sign() const { return (u_ & kSignMask) != 0; } uint64_t Significand() const { return u_ & kSignificandMask; } int Exponent() const { return static_cast(((u_ & kExponentMask) >> kSignificandSize) - kExponentBias); } bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; } bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; } bool IsNanOrInf() const { return (u_ & kExponentMask) == kExponentMask; } bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; } bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; } uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); } int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; } uint64_t ToBias() const { return (u_ & kSignMask) ? ~u_ + 1 : u_ | kSignMask; } static int EffectiveSignificandSize(int order) { if (order >= -1021) return 53; else if (order <= -1074) return 0; else return order + 1074; } private: static const int kSignificandSize = 52; static const int kExponentBias = 0x3FF; static const int kDenormalExponent = 1 - kExponentBias; static const uint64_t kSignMask = RAPIDJSON_UINT64_C2(0x80000000, 0x00000000); static const uint64_t kExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); static const uint64_t kSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); static const uint64_t kHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); union { double d_; uint64_t u_; }; }; } // namespace internal RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_IEEE754_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/internal/pow10.h0000644000000000000000000000675715031566105026277 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_POW10_ #define RAPIDJSON_POW10_ #include "../rapidjson.h" RAPIDJSON_NAMESPACE_BEGIN namespace internal { //! Computes integer powers of 10 in double (10.0^n). /*! This function uses lookup table for fast and accurate results. \param n non-negative exponent. Must <= 308. \return 10.0^n */ inline double Pow10(int n) { static const double e[] = { // 1e-0...1e308: 309 * 8 bytes = 2472 bytes 1e+0, 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, 1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, 1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120, 1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140, 1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160, 1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180, 1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200, 1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220, 1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240, 1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260, 1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280, 1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300, 1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308 }; RAPIDJSON_ASSERT(n >= 0 && n <= 308); return e[n]; } } // namespace internal RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_POW10_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/internal/swap.h0000644000000000000000000000256615031566105026275 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_INTERNAL_SWAP_H_ #define RAPIDJSON_INTERNAL_SWAP_H_ #include "../rapidjson.h" #if defined(__clang__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(c++98-compat) #endif RAPIDJSON_NAMESPACE_BEGIN namespace internal { //! Custom swap() to avoid dependency on C++ header /*! \tparam T Type of the arguments to swap, should be instantiated with primitive C++ types only. \note This has the same semantics as std::swap(). */ template inline void Swap(T& a, T& b) RAPIDJSON_NOEXCEPT { T tmp = a; a = b; b = tmp; } } // namespace internal RAPIDJSON_NAMESPACE_END #if defined(__clang__) RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_INTERNAL_SWAP_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/internal/strtod.h0000644000000000000000000002151015031566105026630 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_STRTOD_ #define RAPIDJSON_STRTOD_ #include "ieee754.h" #include "biginteger.h" #include "diyfp.h" #include "pow10.h" #include #include RAPIDJSON_NAMESPACE_BEGIN namespace internal { inline double FastPath(double significand, int exp) { if (exp < -308) return 0.0; else if (exp >= 0) return significand * internal::Pow10(exp); else return significand / internal::Pow10(-exp); } inline double StrtodNormalPrecision(double d, int p) { if (p < -308) { // Prevent expSum < -308, making Pow10(p) = 0 d = FastPath(d, -308); d = FastPath(d, p + 308); } else d = FastPath(d, p); return d; } template inline T Min3(T a, T b, T c) { T m = a; if (m > b) m = b; if (m > c) m = c; return m; } inline int CheckWithinHalfULP(double b, const BigInteger& d, int dExp) { const Double db(b); const uint64_t bInt = db.IntegerSignificand(); const int bExp = db.IntegerExponent(); const int hExp = bExp - 1; int dS_Exp2 = 0, dS_Exp5 = 0, bS_Exp2 = 0, bS_Exp5 = 0, hS_Exp2 = 0, hS_Exp5 = 0; // Adjust for decimal exponent if (dExp >= 0) { dS_Exp2 += dExp; dS_Exp5 += dExp; } else { bS_Exp2 -= dExp; bS_Exp5 -= dExp; hS_Exp2 -= dExp; hS_Exp5 -= dExp; } // Adjust for binary exponent if (bExp >= 0) bS_Exp2 += bExp; else { dS_Exp2 -= bExp; hS_Exp2 -= bExp; } // Adjust for half ulp exponent if (hExp >= 0) hS_Exp2 += hExp; else { dS_Exp2 -= hExp; bS_Exp2 -= hExp; } // Remove common power of two factor from all three scaled values int common_Exp2 = Min3(dS_Exp2, bS_Exp2, hS_Exp2); dS_Exp2 -= common_Exp2; bS_Exp2 -= common_Exp2; hS_Exp2 -= common_Exp2; BigInteger dS = d; dS.MultiplyPow5(static_cast(dS_Exp5)) <<= static_cast(dS_Exp2); BigInteger bS(bInt); bS.MultiplyPow5(static_cast(bS_Exp5)) <<= static_cast(bS_Exp2); BigInteger hS(1); hS.MultiplyPow5(static_cast(hS_Exp5)) <<= static_cast(hS_Exp2); BigInteger delta(0); dS.Difference(bS, &delta); return delta.Compare(hS); } inline bool StrtodFast(double d, int p, double* result) { // Use fast path for string-to-double conversion if possible // see http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/ if (p > 22 && p < 22 + 16) { // Fast Path Cases In Disguise d *= internal::Pow10(p - 22); p = 22; } if (p >= -22 && p <= 22 && d <= 9007199254740991.0) { // 2^53 - 1 *result = FastPath(d, p); return true; } else return false; } // Compute an approximation and see if it is within 1/2 ULP template inline bool StrtodDiyFp(const Ch* decimals, int dLen, int dExp, double* result) { uint64_t significand = 0; int i = 0; // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999 for (; i < dLen; i++) { if (significand > RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || (significand == RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] > Ch('5'))) break; significand = significand * 10u + static_cast(decimals[i] - Ch('0')); } if (i < dLen && decimals[i] >= Ch('5')) // Rounding significand++; int remaining = dLen - i; const int kUlpShift = 3; const int kUlp = 1 << kUlpShift; int64_t error = (remaining == 0) ? 0 : kUlp / 2; DiyFp v(significand, 0); v = v.Normalize(); error <<= -v.e; dExp += remaining; int actualExp; DiyFp cachedPower = GetCachedPower10(dExp, &actualExp); if (actualExp != dExp) { static const DiyFp kPow10[] = { DiyFp(RAPIDJSON_UINT64_C2(0xa0000000, 0x00000000), -60), // 10^1 DiyFp(RAPIDJSON_UINT64_C2(0xc8000000, 0x00000000), -57), // 10^2 DiyFp(RAPIDJSON_UINT64_C2(0xfa000000, 0x00000000), -54), // 10^3 DiyFp(RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), -50), // 10^4 DiyFp(RAPIDJSON_UINT64_C2(0xc3500000, 0x00000000), -47), // 10^5 DiyFp(RAPIDJSON_UINT64_C2(0xf4240000, 0x00000000), -44), // 10^6 DiyFp(RAPIDJSON_UINT64_C2(0x98968000, 0x00000000), -40) // 10^7 }; int adjustment = dExp - actualExp; RAPIDJSON_ASSERT(adjustment >= 1 && adjustment < 8); v = v * kPow10[adjustment - 1]; if (dLen + adjustment > 19) // has more digits than decimal digits in 64-bit error += kUlp / 2; } v = v * cachedPower; error += kUlp + (error == 0 ? 0 : 1); const int oldExp = v.e; v = v.Normalize(); error <<= oldExp - v.e; const int effectiveSignificandSize = Double::EffectiveSignificandSize(64 + v.e); int precisionSize = 64 - effectiveSignificandSize; if (precisionSize + kUlpShift >= 64) { int scaleExp = (precisionSize + kUlpShift) - 63; v.f >>= scaleExp; v.e += scaleExp; error = (error >> scaleExp) + 1 + kUlp; precisionSize -= scaleExp; } DiyFp rounded(v.f >> precisionSize, v.e + precisionSize); const uint64_t precisionBits = (v.f & ((uint64_t(1) << precisionSize) - 1)) * kUlp; const uint64_t halfWay = (uint64_t(1) << (precisionSize - 1)) * kUlp; if (precisionBits >= halfWay + static_cast(error)) { rounded.f++; if (rounded.f & (DiyFp::kDpHiddenBit << 1)) { // rounding overflows mantissa (issue #340) rounded.f >>= 1; rounded.e++; } } *result = rounded.ToDouble(); return halfWay - static_cast(error) >= precisionBits || precisionBits >= halfWay + static_cast(error); } template inline double StrtodBigInteger(double approx, const Ch* decimals, int dLen, int dExp) { RAPIDJSON_ASSERT(dLen >= 0); const BigInteger dInt(decimals, static_cast(dLen)); Double a(approx); int cmp = CheckWithinHalfULP(a.Value(), dInt, dExp); if (cmp < 0) return a.Value(); // within half ULP else if (cmp == 0) { // Round towards even if (a.Significand() & 1) return a.NextPositiveDouble(); else return a.Value(); } else // adjustment return a.NextPositiveDouble(); } template inline double StrtodFullPrecision(double d, int p, const Ch* decimals, size_t length, size_t decimalPosition, int exp) { RAPIDJSON_ASSERT(d >= 0.0); RAPIDJSON_ASSERT(length >= 1); double result = 0.0; if (StrtodFast(d, p, &result)) return result; RAPIDJSON_ASSERT(length <= INT_MAX); int dLen = static_cast(length); RAPIDJSON_ASSERT(length >= decimalPosition); RAPIDJSON_ASSERT(length - decimalPosition <= INT_MAX); int dExpAdjust = static_cast(length - decimalPosition); RAPIDJSON_ASSERT(exp >= INT_MIN + dExpAdjust); int dExp = exp - dExpAdjust; // Make sure length+dExp does not overflow RAPIDJSON_ASSERT(dExp <= INT_MAX - dLen); // Trim leading zeros while (dLen > 0 && *decimals == '0') { dLen--; decimals++; } // Trim trailing zeros while (dLen > 0 && decimals[dLen - 1] == '0') { dLen--; dExp++; } if (dLen == 0) { // Buffer only contains zeros. return 0.0; } // Trim right-most digits const int kMaxDecimalDigit = 767 + 1; if (dLen > kMaxDecimalDigit) { dExp += dLen - kMaxDecimalDigit; dLen = kMaxDecimalDigit; } // If too small, underflow to zero. // Any x <= 10^-324 is interpreted as zero. if (dLen + dExp <= -324) return 0.0; // If too large, overflow to infinity. // Any x >= 10^309 is interpreted as +infinity. if (dLen + dExp > 309) return std::numeric_limits::infinity(); if (StrtodDiyFp(decimals, dLen, dExp, &result)) return result; // Use approximation from StrtodDiyFp and make adjustment with BigInteger comparison return StrtodBigInteger(result, decimals, dLen, dExp); } } // namespace internal RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_STRTOD_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/internal/itoa.h0000644000000000000000000002357615031566105026263 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_ITOA_ #define RAPIDJSON_ITOA_ #include "../rapidjson.h" RAPIDJSON_NAMESPACE_BEGIN namespace internal { inline const char* GetDigitsLut() { static const char cDigitsLut[200] = { '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9', '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9', '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9', '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9', '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9', '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9', '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9', '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9', '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9' }; return cDigitsLut; } inline char* u32toa(uint32_t value, char* buffer) { RAPIDJSON_ASSERT(buffer != 0); const char* cDigitsLut = GetDigitsLut(); if (value < 10000) { const uint32_t d1 = (value / 100) << 1; const uint32_t d2 = (value % 100) << 1; if (value >= 1000) *buffer++ = cDigitsLut[d1]; if (value >= 100) *buffer++ = cDigitsLut[d1 + 1]; if (value >= 10) *buffer++ = cDigitsLut[d2]; *buffer++ = cDigitsLut[d2 + 1]; } else if (value < 100000000) { // value = bbbbcccc const uint32_t b = value / 10000; const uint32_t c = value % 10000; const uint32_t d1 = (b / 100) << 1; const uint32_t d2 = (b % 100) << 1; const uint32_t d3 = (c / 100) << 1; const uint32_t d4 = (c % 100) << 1; if (value >= 10000000) *buffer++ = cDigitsLut[d1]; if (value >= 1000000) *buffer++ = cDigitsLut[d1 + 1]; if (value >= 100000) *buffer++ = cDigitsLut[d2]; *buffer++ = cDigitsLut[d2 + 1]; *buffer++ = cDigitsLut[d3]; *buffer++ = cDigitsLut[d3 + 1]; *buffer++ = cDigitsLut[d4]; *buffer++ = cDigitsLut[d4 + 1]; } else { // value = aabbbbcccc in decimal const uint32_t a = value / 100000000; // 1 to 42 value %= 100000000; if (a >= 10) { const unsigned i = a << 1; *buffer++ = cDigitsLut[i]; *buffer++ = cDigitsLut[i + 1]; } else *buffer++ = static_cast('0' + static_cast(a)); const uint32_t b = value / 10000; // 0 to 9999 const uint32_t c = value % 10000; // 0 to 9999 const uint32_t d1 = (b / 100) << 1; const uint32_t d2 = (b % 100) << 1; const uint32_t d3 = (c / 100) << 1; const uint32_t d4 = (c % 100) << 1; *buffer++ = cDigitsLut[d1]; *buffer++ = cDigitsLut[d1 + 1]; *buffer++ = cDigitsLut[d2]; *buffer++ = cDigitsLut[d2 + 1]; *buffer++ = cDigitsLut[d3]; *buffer++ = cDigitsLut[d3 + 1]; *buffer++ = cDigitsLut[d4]; *buffer++ = cDigitsLut[d4 + 1]; } return buffer; } inline char* i32toa(int32_t value, char* buffer) { RAPIDJSON_ASSERT(buffer != 0); uint32_t u = static_cast(value); if (value < 0) { *buffer++ = '-'; u = ~u + 1; } return u32toa(u, buffer); } inline char* u64toa(uint64_t value, char* buffer) { RAPIDJSON_ASSERT(buffer != 0); const char* cDigitsLut = GetDigitsLut(); const uint64_t kTen8 = 100000000; const uint64_t kTen9 = kTen8 * 10; const uint64_t kTen10 = kTen8 * 100; const uint64_t kTen11 = kTen8 * 1000; const uint64_t kTen12 = kTen8 * 10000; const uint64_t kTen13 = kTen8 * 100000; const uint64_t kTen14 = kTen8 * 1000000; const uint64_t kTen15 = kTen8 * 10000000; const uint64_t kTen16 = kTen8 * kTen8; if (value < kTen8) { uint32_t v = static_cast(value); if (v < 10000) { const uint32_t d1 = (v / 100) << 1; const uint32_t d2 = (v % 100) << 1; if (v >= 1000) *buffer++ = cDigitsLut[d1]; if (v >= 100) *buffer++ = cDigitsLut[d1 + 1]; if (v >= 10) *buffer++ = cDigitsLut[d2]; *buffer++ = cDigitsLut[d2 + 1]; } else { // value = bbbbcccc const uint32_t b = v / 10000; const uint32_t c = v % 10000; const uint32_t d1 = (b / 100) << 1; const uint32_t d2 = (b % 100) << 1; const uint32_t d3 = (c / 100) << 1; const uint32_t d4 = (c % 100) << 1; if (value >= 10000000) *buffer++ = cDigitsLut[d1]; if (value >= 1000000) *buffer++ = cDigitsLut[d1 + 1]; if (value >= 100000) *buffer++ = cDigitsLut[d2]; *buffer++ = cDigitsLut[d2 + 1]; *buffer++ = cDigitsLut[d3]; *buffer++ = cDigitsLut[d3 + 1]; *buffer++ = cDigitsLut[d4]; *buffer++ = cDigitsLut[d4 + 1]; } } else if (value < kTen16) { const uint32_t v0 = static_cast(value / kTen8); const uint32_t v1 = static_cast(value % kTen8); const uint32_t b0 = v0 / 10000; const uint32_t c0 = v0 % 10000; const uint32_t d1 = (b0 / 100) << 1; const uint32_t d2 = (b0 % 100) << 1; const uint32_t d3 = (c0 / 100) << 1; const uint32_t d4 = (c0 % 100) << 1; const uint32_t b1 = v1 / 10000; const uint32_t c1 = v1 % 10000; const uint32_t d5 = (b1 / 100) << 1; const uint32_t d6 = (b1 % 100) << 1; const uint32_t d7 = (c1 / 100) << 1; const uint32_t d8 = (c1 % 100) << 1; if (value >= kTen15) *buffer++ = cDigitsLut[d1]; if (value >= kTen14) *buffer++ = cDigitsLut[d1 + 1]; if (value >= kTen13) *buffer++ = cDigitsLut[d2]; if (value >= kTen12) *buffer++ = cDigitsLut[d2 + 1]; if (value >= kTen11) *buffer++ = cDigitsLut[d3]; if (value >= kTen10) *buffer++ = cDigitsLut[d3 + 1]; if (value >= kTen9) *buffer++ = cDigitsLut[d4]; *buffer++ = cDigitsLut[d4 + 1]; *buffer++ = cDigitsLut[d5]; *buffer++ = cDigitsLut[d5 + 1]; *buffer++ = cDigitsLut[d6]; *buffer++ = cDigitsLut[d6 + 1]; *buffer++ = cDigitsLut[d7]; *buffer++ = cDigitsLut[d7 + 1]; *buffer++ = cDigitsLut[d8]; *buffer++ = cDigitsLut[d8 + 1]; } else { const uint32_t a = static_cast(value / kTen16); // 1 to 1844 value %= kTen16; if (a < 10) *buffer++ = static_cast('0' + static_cast(a)); else if (a < 100) { const uint32_t i = a << 1; *buffer++ = cDigitsLut[i]; *buffer++ = cDigitsLut[i + 1]; } else if (a < 1000) { *buffer++ = static_cast('0' + static_cast(a / 100)); const uint32_t i = (a % 100) << 1; *buffer++ = cDigitsLut[i]; *buffer++ = cDigitsLut[i + 1]; } else { const uint32_t i = (a / 100) << 1; const uint32_t j = (a % 100) << 1; *buffer++ = cDigitsLut[i]; *buffer++ = cDigitsLut[i + 1]; *buffer++ = cDigitsLut[j]; *buffer++ = cDigitsLut[j + 1]; } const uint32_t v0 = static_cast(value / kTen8); const uint32_t v1 = static_cast(value % kTen8); const uint32_t b0 = v0 / 10000; const uint32_t c0 = v0 % 10000; const uint32_t d1 = (b0 / 100) << 1; const uint32_t d2 = (b0 % 100) << 1; const uint32_t d3 = (c0 / 100) << 1; const uint32_t d4 = (c0 % 100) << 1; const uint32_t b1 = v1 / 10000; const uint32_t c1 = v1 % 10000; const uint32_t d5 = (b1 / 100) << 1; const uint32_t d6 = (b1 % 100) << 1; const uint32_t d7 = (c1 / 100) << 1; const uint32_t d8 = (c1 % 100) << 1; *buffer++ = cDigitsLut[d1]; *buffer++ = cDigitsLut[d1 + 1]; *buffer++ = cDigitsLut[d2]; *buffer++ = cDigitsLut[d2 + 1]; *buffer++ = cDigitsLut[d3]; *buffer++ = cDigitsLut[d3 + 1]; *buffer++ = cDigitsLut[d4]; *buffer++ = cDigitsLut[d4 + 1]; *buffer++ = cDigitsLut[d5]; *buffer++ = cDigitsLut[d5 + 1]; *buffer++ = cDigitsLut[d6]; *buffer++ = cDigitsLut[d6 + 1]; *buffer++ = cDigitsLut[d7]; *buffer++ = cDigitsLut[d7 + 1]; *buffer++ = cDigitsLut[d8]; *buffer++ = cDigitsLut[d8 + 1]; } return buffer; } inline char* i64toa(int64_t value, char* buffer) { RAPIDJSON_ASSERT(buffer != 0); uint64_t u = static_cast(value); if (value < 0) { *buffer++ = '-'; u = ~u + 1; } return u64toa(u, buffer); } } // namespace internal RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_ITOA_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/internal/strfunc.h0000644000000000000000000000524115031566105027000 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_INTERNAL_STRFUNC_H_ #define RAPIDJSON_INTERNAL_STRFUNC_H_ #include "../stream.h" #include RAPIDJSON_NAMESPACE_BEGIN namespace internal { //! Custom strlen() which works on different character types. /*! \tparam Ch Character type (e.g. char, wchar_t, short) \param s Null-terminated input string. \return Number of characters in the string. \note This has the same semantics as strlen(), the return value is not number of Unicode codepoints. */ template inline SizeType StrLen(const Ch* s) { RAPIDJSON_ASSERT(s != 0); const Ch* p = s; while (*p) ++p; return SizeType(p - s); } template <> inline SizeType StrLen(const char* s) { return SizeType(std::strlen(s)); } template <> inline SizeType StrLen(const wchar_t* s) { return SizeType(std::wcslen(s)); } //! Custom strcmpn() which works on different character types. /*! \tparam Ch Character type (e.g. char, wchar_t, short) \param s1 Null-terminated input string. \param s2 Null-terminated input string. \return 0 if equal */ template inline int StrCmp(const Ch* s1, const Ch* s2) { RAPIDJSON_ASSERT(s1 != 0); RAPIDJSON_ASSERT(s2 != 0); while(*s1 && (*s1 == *s2)) { s1++; s2++; } return static_cast(*s1) < static_cast(*s2) ? -1 : static_cast(*s1) > static_cast(*s2); } //! Returns number of code points in a encoded string. template bool CountStringCodePoint(const typename Encoding::Ch* s, SizeType length, SizeType* outCount) { RAPIDJSON_ASSERT(s != 0); RAPIDJSON_ASSERT(outCount != 0); GenericStringStream is(s); const typename Encoding::Ch* end = s + length; SizeType count = 0; while (is.src_ < end) { unsigned codepoint; if (!Encoding::Decode(is, &codepoint)) return false; count++; } *outCount = count; return true; } } // namespace internal RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_INTERNAL_STRFUNC_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/internal/clzll.h0000644000000000000000000000377515031566105026446 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_CLZLL_H_ #define RAPIDJSON_CLZLL_H_ #include "../rapidjson.h" #if defined(_MSC_VER) && !defined(UNDER_CE) #include #if defined(_WIN64) #pragma intrinsic(_BitScanReverse64) #else #pragma intrinsic(_BitScanReverse) #endif #endif RAPIDJSON_NAMESPACE_BEGIN namespace internal { inline uint32_t clzll(uint64_t x) { // Passing 0 to __builtin_clzll is UB in GCC and results in an // infinite loop in the software implementation. RAPIDJSON_ASSERT(x != 0); #if defined(_MSC_VER) && !defined(UNDER_CE) unsigned long r = 0; #if defined(_WIN64) _BitScanReverse64(&r, x); #else // Scan the high 32 bits. if (_BitScanReverse(&r, static_cast(x >> 32))) return 63 - (r + 32); // Scan the low 32 bits. _BitScanReverse(&r, static_cast(x & 0xFFFFFFFF)); #endif // _WIN64 return 63 - r; #elif (defined(__GNUC__) && __GNUC__ >= 4) || RAPIDJSON_HAS_BUILTIN(__builtin_clzll) // __builtin_clzll wrapper return static_cast(__builtin_clzll(x)); #else // naive version uint32_t r = 0; while (!(x & (static_cast(1) << 63))) { x <<= 1; ++r; } return r; #endif // _MSC_VER } #define RAPIDJSON_CLZLL RAPIDJSON_NAMESPACE::internal::clzll } // namespace internal RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_CLZLL_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/internal/meta.h0000644000000000000000000001473015031566105026245 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_INTERNAL_META_H_ #define RAPIDJSON_INTERNAL_META_H_ #include "../rapidjson.h" #ifdef __GNUC__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) #endif #if defined(_MSC_VER) && !defined(__clang__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(6334) #endif #if RAPIDJSON_HAS_CXX11_TYPETRAITS #include #endif //@cond RAPIDJSON_INTERNAL RAPIDJSON_NAMESPACE_BEGIN namespace internal { // Helper to wrap/convert arbitrary types to void, useful for arbitrary type matching template struct Void { typedef void Type; }; /////////////////////////////////////////////////////////////////////////////// // BoolType, TrueType, FalseType // template struct BoolType { static const bool Value = Cond; typedef BoolType Type; }; typedef BoolType TrueType; typedef BoolType FalseType; /////////////////////////////////////////////////////////////////////////////// // SelectIf, BoolExpr, NotExpr, AndExpr, OrExpr // template struct SelectIfImpl { template struct Apply { typedef T1 Type; }; }; template <> struct SelectIfImpl { template struct Apply { typedef T2 Type; }; }; template struct SelectIfCond : SelectIfImpl::template Apply {}; template struct SelectIf : SelectIfCond {}; template struct AndExprCond : FalseType {}; template <> struct AndExprCond : TrueType {}; template struct OrExprCond : TrueType {}; template <> struct OrExprCond : FalseType {}; template struct BoolExpr : SelectIf::Type {}; template struct NotExpr : SelectIf::Type {}; template struct AndExpr : AndExprCond::Type {}; template struct OrExpr : OrExprCond::Type {}; /////////////////////////////////////////////////////////////////////////////// // AddConst, MaybeAddConst, RemoveConst template struct AddConst { typedef const T Type; }; template struct MaybeAddConst : SelectIfCond {}; template struct RemoveConst { typedef T Type; }; template struct RemoveConst { typedef T Type; }; /////////////////////////////////////////////////////////////////////////////// // IsSame, IsConst, IsMoreConst, IsPointer // template struct IsSame : FalseType {}; template struct IsSame : TrueType {}; template struct IsConst : FalseType {}; template struct IsConst : TrueType {}; template struct IsMoreConst : AndExpr::Type, typename RemoveConst::Type>, BoolType::Value >= IsConst::Value> >::Type {}; template struct IsPointer : FalseType {}; template struct IsPointer : TrueType {}; /////////////////////////////////////////////////////////////////////////////// // IsBaseOf // #if RAPIDJSON_HAS_CXX11_TYPETRAITS template struct IsBaseOf : BoolType< ::std::is_base_of::value> {}; #else // simplified version adopted from Boost template struct IsBaseOfImpl { RAPIDJSON_STATIC_ASSERT(sizeof(B) != 0); RAPIDJSON_STATIC_ASSERT(sizeof(D) != 0); typedef char (&Yes)[1]; typedef char (&No) [2]; template static Yes Check(const D*, T); static No Check(const B*, int); struct Host { operator const B*() const; operator const D*(); }; enum { Value = (sizeof(Check(Host(), 0)) == sizeof(Yes)) }; }; template struct IsBaseOf : OrExpr, BoolExpr > >::Type {}; #endif // RAPIDJSON_HAS_CXX11_TYPETRAITS ////////////////////////////////////////////////////////////////////////// // EnableIf / DisableIf // template struct EnableIfCond { typedef T Type; }; template struct EnableIfCond { /* empty */ }; template struct DisableIfCond { typedef T Type; }; template struct DisableIfCond { /* empty */ }; template struct EnableIf : EnableIfCond {}; template struct DisableIf : DisableIfCond {}; // SFINAE helpers struct SfinaeTag {}; template struct RemoveSfinaeTag; template struct RemoveSfinaeTag { typedef T Type; }; #define RAPIDJSON_REMOVEFPTR_(type) \ typename ::RAPIDJSON_NAMESPACE::internal::RemoveSfinaeTag \ < ::RAPIDJSON_NAMESPACE::internal::SfinaeTag&(*) type>::Type #define RAPIDJSON_ENABLEIF(cond) \ typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ ::Type * = NULL #define RAPIDJSON_DISABLEIF(cond) \ typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ ::Type * = NULL #define RAPIDJSON_ENABLEIF_RETURN(cond,returntype) \ typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ ::Type #define RAPIDJSON_DISABLEIF_RETURN(cond,returntype) \ typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ ::Type } // namespace internal RAPIDJSON_NAMESPACE_END //@endcond #if defined(_MSC_VER) && !defined(__clang__) RAPIDJSON_DIAG_POP #endif #ifdef __GNUC__ RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_INTERNAL_META_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/internal/diyfp.h0000644000000000000000000002647415031566105026442 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. // This is a C++ header-only implementation of Grisu2 algorithm from the publication: // Loitsch, Florian. "Printing floating-point numbers quickly and accurately with // integers." ACM Sigplan Notices 45.6 (2010): 233-243. #ifndef RAPIDJSON_DIYFP_H_ #define RAPIDJSON_DIYFP_H_ #include "../rapidjson.h" #include "clzll.h" #include #if defined(_MSC_VER) && defined(_M_AMD64) && !defined(__INTEL_COMPILER) #include #if !defined(_ARM64EC_) #pragma intrinsic(_umul128) #else #pragma comment(lib,"softintrin") #endif #endif RAPIDJSON_NAMESPACE_BEGIN namespace internal { #ifdef __GNUC__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) #endif #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(padded) #endif struct DiyFp { DiyFp() : f(), e() {} DiyFp(uint64_t fp, int exp) : f(fp), e(exp) {} explicit DiyFp(double d) { union { double d; uint64_t u64; } u = { d }; int biased_e = static_cast((u.u64 & kDpExponentMask) >> kDpSignificandSize); uint64_t significand = (u.u64 & kDpSignificandMask); if (biased_e != 0) { f = significand + kDpHiddenBit; e = biased_e - kDpExponentBias; } else { f = significand; e = kDpMinExponent + 1; } } DiyFp operator-(const DiyFp& rhs) const { return DiyFp(f - rhs.f, e); } DiyFp operator*(const DiyFp& rhs) const { #if defined(_MSC_VER) && defined(_M_AMD64) uint64_t h; uint64_t l = _umul128(f, rhs.f, &h); if (l & (uint64_t(1) << 63)) // rounding h++; return DiyFp(h, e + rhs.e + 64); #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) __extension__ typedef unsigned __int128 uint128; uint128 p = static_cast(f) * static_cast(rhs.f); uint64_t h = static_cast(p >> 64); uint64_t l = static_cast(p); if (l & (uint64_t(1) << 63)) // rounding h++; return DiyFp(h, e + rhs.e + 64); #else const uint64_t M32 = 0xFFFFFFFF; const uint64_t a = f >> 32; const uint64_t b = f & M32; const uint64_t c = rhs.f >> 32; const uint64_t d = rhs.f & M32; const uint64_t ac = a * c; const uint64_t bc = b * c; const uint64_t ad = a * d; const uint64_t bd = b * d; uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32); tmp += 1U << 31; /// mult_round return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), e + rhs.e + 64); #endif } DiyFp Normalize() const { int s = static_cast(clzll(f)); return DiyFp(f << s, e - s); } DiyFp NormalizeBoundary() const { DiyFp res = *this; while (!(res.f & (kDpHiddenBit << 1))) { res.f <<= 1; res.e--; } res.f <<= (kDiySignificandSize - kDpSignificandSize - 2); res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 2); return res; } void NormalizedBoundaries(DiyFp* minus, DiyFp* plus) const { DiyFp pl = DiyFp((f << 1) + 1, e - 1).NormalizeBoundary(); DiyFp mi = (f == kDpHiddenBit) ? DiyFp((f << 2) - 1, e - 2) : DiyFp((f << 1) - 1, e - 1); mi.f <<= mi.e - pl.e; mi.e = pl.e; *plus = pl; *minus = mi; } double ToDouble() const { union { double d; uint64_t u64; }u; RAPIDJSON_ASSERT(f <= kDpHiddenBit + kDpSignificandMask); if (e < kDpDenormalExponent) { // Underflow. return 0.0; } if (e >= kDpMaxExponent) { // Overflow. return std::numeric_limits::infinity(); } const uint64_t be = (e == kDpDenormalExponent && (f & kDpHiddenBit) == 0) ? 0 : static_cast(e + kDpExponentBias); u.u64 = (f & kDpSignificandMask) | (be << kDpSignificandSize); return u.d; } static const int kDiySignificandSize = 64; static const int kDpSignificandSize = 52; static const int kDpExponentBias = 0x3FF + kDpSignificandSize; static const int kDpMaxExponent = 0x7FF - kDpExponentBias; static const int kDpMinExponent = -kDpExponentBias; static const int kDpDenormalExponent = -kDpExponentBias + 1; static const uint64_t kDpExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); static const uint64_t kDpSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); static const uint64_t kDpHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); uint64_t f; int e; }; inline DiyFp GetCachedPowerByIndex(size_t index) { // 10^-348, 10^-340, ..., 10^340 static const uint64_t kCachedPowers_F[] = { RAPIDJSON_UINT64_C2(0xfa8fd5a0, 0x081c0288), RAPIDJSON_UINT64_C2(0xbaaee17f, 0xa23ebf76), RAPIDJSON_UINT64_C2(0x8b16fb20, 0x3055ac76), RAPIDJSON_UINT64_C2(0xcf42894a, 0x5dce35ea), RAPIDJSON_UINT64_C2(0x9a6bb0aa, 0x55653b2d), RAPIDJSON_UINT64_C2(0xe61acf03, 0x3d1a45df), RAPIDJSON_UINT64_C2(0xab70fe17, 0xc79ac6ca), RAPIDJSON_UINT64_C2(0xff77b1fc, 0xbebcdc4f), RAPIDJSON_UINT64_C2(0xbe5691ef, 0x416bd60c), RAPIDJSON_UINT64_C2(0x8dd01fad, 0x907ffc3c), RAPIDJSON_UINT64_C2(0xd3515c28, 0x31559a83), RAPIDJSON_UINT64_C2(0x9d71ac8f, 0xada6c9b5), RAPIDJSON_UINT64_C2(0xea9c2277, 0x23ee8bcb), RAPIDJSON_UINT64_C2(0xaecc4991, 0x4078536d), RAPIDJSON_UINT64_C2(0x823c1279, 0x5db6ce57), RAPIDJSON_UINT64_C2(0xc2109436, 0x4dfb5637), RAPIDJSON_UINT64_C2(0x9096ea6f, 0x3848984f), RAPIDJSON_UINT64_C2(0xd77485cb, 0x25823ac7), RAPIDJSON_UINT64_C2(0xa086cfcd, 0x97bf97f4), RAPIDJSON_UINT64_C2(0xef340a98, 0x172aace5), RAPIDJSON_UINT64_C2(0xb23867fb, 0x2a35b28e), RAPIDJSON_UINT64_C2(0x84c8d4df, 0xd2c63f3b), RAPIDJSON_UINT64_C2(0xc5dd4427, 0x1ad3cdba), RAPIDJSON_UINT64_C2(0x936b9fce, 0xbb25c996), RAPIDJSON_UINT64_C2(0xdbac6c24, 0x7d62a584), RAPIDJSON_UINT64_C2(0xa3ab6658, 0x0d5fdaf6), RAPIDJSON_UINT64_C2(0xf3e2f893, 0xdec3f126), RAPIDJSON_UINT64_C2(0xb5b5ada8, 0xaaff80b8), RAPIDJSON_UINT64_C2(0x87625f05, 0x6c7c4a8b), RAPIDJSON_UINT64_C2(0xc9bcff60, 0x34c13053), RAPIDJSON_UINT64_C2(0x964e858c, 0x91ba2655), RAPIDJSON_UINT64_C2(0xdff97724, 0x70297ebd), RAPIDJSON_UINT64_C2(0xa6dfbd9f, 0xb8e5b88f), RAPIDJSON_UINT64_C2(0xf8a95fcf, 0x88747d94), RAPIDJSON_UINT64_C2(0xb9447093, 0x8fa89bcf), RAPIDJSON_UINT64_C2(0x8a08f0f8, 0xbf0f156b), RAPIDJSON_UINT64_C2(0xcdb02555, 0x653131b6), RAPIDJSON_UINT64_C2(0x993fe2c6, 0xd07b7fac), RAPIDJSON_UINT64_C2(0xe45c10c4, 0x2a2b3b06), RAPIDJSON_UINT64_C2(0xaa242499, 0x697392d3), RAPIDJSON_UINT64_C2(0xfd87b5f2, 0x8300ca0e), RAPIDJSON_UINT64_C2(0xbce50864, 0x92111aeb), RAPIDJSON_UINT64_C2(0x8cbccc09, 0x6f5088cc), RAPIDJSON_UINT64_C2(0xd1b71758, 0xe219652c), RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), RAPIDJSON_UINT64_C2(0xe8d4a510, 0x00000000), RAPIDJSON_UINT64_C2(0xad78ebc5, 0xac620000), RAPIDJSON_UINT64_C2(0x813f3978, 0xf8940984), RAPIDJSON_UINT64_C2(0xc097ce7b, 0xc90715b3), RAPIDJSON_UINT64_C2(0x8f7e32ce, 0x7bea5c70), RAPIDJSON_UINT64_C2(0xd5d238a4, 0xabe98068), RAPIDJSON_UINT64_C2(0x9f4f2726, 0x179a2245), RAPIDJSON_UINT64_C2(0xed63a231, 0xd4c4fb27), RAPIDJSON_UINT64_C2(0xb0de6538, 0x8cc8ada8), RAPIDJSON_UINT64_C2(0x83c7088e, 0x1aab65db), RAPIDJSON_UINT64_C2(0xc45d1df9, 0x42711d9a), RAPIDJSON_UINT64_C2(0x924d692c, 0xa61be758), RAPIDJSON_UINT64_C2(0xda01ee64, 0x1a708dea), RAPIDJSON_UINT64_C2(0xa26da399, 0x9aef774a), RAPIDJSON_UINT64_C2(0xf209787b, 0xb47d6b85), RAPIDJSON_UINT64_C2(0xb454e4a1, 0x79dd1877), RAPIDJSON_UINT64_C2(0x865b8692, 0x5b9bc5c2), RAPIDJSON_UINT64_C2(0xc83553c5, 0xc8965d3d), RAPIDJSON_UINT64_C2(0x952ab45c, 0xfa97a0b3), RAPIDJSON_UINT64_C2(0xde469fbd, 0x99a05fe3), RAPIDJSON_UINT64_C2(0xa59bc234, 0xdb398c25), RAPIDJSON_UINT64_C2(0xf6c69a72, 0xa3989f5c), RAPIDJSON_UINT64_C2(0xb7dcbf53, 0x54e9bece), RAPIDJSON_UINT64_C2(0x88fcf317, 0xf22241e2), RAPIDJSON_UINT64_C2(0xcc20ce9b, 0xd35c78a5), RAPIDJSON_UINT64_C2(0x98165af3, 0x7b2153df), RAPIDJSON_UINT64_C2(0xe2a0b5dc, 0x971f303a), RAPIDJSON_UINT64_C2(0xa8d9d153, 0x5ce3b396), RAPIDJSON_UINT64_C2(0xfb9b7cd9, 0xa4a7443c), RAPIDJSON_UINT64_C2(0xbb764c4c, 0xa7a44410), RAPIDJSON_UINT64_C2(0x8bab8eef, 0xb6409c1a), RAPIDJSON_UINT64_C2(0xd01fef10, 0xa657842c), RAPIDJSON_UINT64_C2(0x9b10a4e5, 0xe9913129), RAPIDJSON_UINT64_C2(0xe7109bfb, 0xa19c0c9d), RAPIDJSON_UINT64_C2(0xac2820d9, 0x623bf429), RAPIDJSON_UINT64_C2(0x80444b5e, 0x7aa7cf85), RAPIDJSON_UINT64_C2(0xbf21e440, 0x03acdd2d), RAPIDJSON_UINT64_C2(0x8e679c2f, 0x5e44ff8f), RAPIDJSON_UINT64_C2(0xd433179d, 0x9c8cb841), RAPIDJSON_UINT64_C2(0x9e19db92, 0xb4e31ba9), RAPIDJSON_UINT64_C2(0xeb96bf6e, 0xbadf77d9), RAPIDJSON_UINT64_C2(0xaf87023b, 0x9bf0ee6b) }; static const int16_t kCachedPowers_E[] = { -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, -954, -927, -901, -874, -847, -821, -794, -768, -741, -715, -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, -422, -396, -369, -343, -316, -289, -263, -236, -210, -183, -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, 109, 136, 162, 189, 216, 242, 269, 295, 322, 348, 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, 641, 667, 694, 720, 747, 774, 800, 827, 853, 880, 907, 933, 960, 986, 1013, 1039, 1066 }; RAPIDJSON_ASSERT(index < 87); return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]); } inline DiyFp GetCachedPower(int e, int* K) { //int k = static_cast(ceil((-61 - e) * 0.30102999566398114)) + 374; double dk = (-61 - e) * 0.30102999566398114 + 347; // dk must be positive, so can do ceiling in positive int k = static_cast(dk); if (dk - k > 0.0) k++; unsigned index = static_cast((k >> 3) + 1); *K = -(-348 + static_cast(index << 3)); // decimal exponent no need lookup table return GetCachedPowerByIndex(index); } inline DiyFp GetCachedPower10(int exp, int *outExp) { RAPIDJSON_ASSERT(exp >= -348); unsigned index = static_cast(exp + 348) / 8u; *outExp = -348 + static_cast(index) * 8; return GetCachedPowerByIndex(index); } #ifdef __GNUC__ RAPIDJSON_DIAG_POP #endif #ifdef __clang__ RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_OFF(padded) #endif } // namespace internal RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_DIYFP_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/internal/regex.h0000644000000000000000000006276615031566105026445 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_INTERNAL_REGEX_H_ #define RAPIDJSON_INTERNAL_REGEX_H_ #include "../allocators.h" #include "../stream.h" #include "stack.h" #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(padded) RAPIDJSON_DIAG_OFF(switch-enum) #elif defined(_MSC_VER) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated #endif #ifdef __GNUC__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) #endif #ifndef RAPIDJSON_REGEX_VERBOSE #define RAPIDJSON_REGEX_VERBOSE 0 #endif RAPIDJSON_NAMESPACE_BEGIN namespace internal { /////////////////////////////////////////////////////////////////////////////// // DecodedStream template class DecodedStream { public: DecodedStream(SourceStream& ss) : ss_(ss), codepoint_() { Decode(); } unsigned Peek() { return codepoint_; } unsigned Take() { unsigned c = codepoint_; if (c) // No further decoding when '\0' Decode(); return c; } private: void Decode() { if (!Encoding::Decode(ss_, &codepoint_)) codepoint_ = 0; } SourceStream& ss_; unsigned codepoint_; }; /////////////////////////////////////////////////////////////////////////////// // GenericRegex static const SizeType kRegexInvalidState = ~SizeType(0); //!< Represents an invalid index in GenericRegex::State::out, out1 static const SizeType kRegexInvalidRange = ~SizeType(0); template class GenericRegexSearch; //! Regular expression engine with subset of ECMAscript grammar. /*! Supported regular expression syntax: - \c ab Concatenation - \c a|b Alternation - \c a? Zero or one - \c a* Zero or more - \c a+ One or more - \c a{3} Exactly 3 times - \c a{3,} At least 3 times - \c a{3,5} 3 to 5 times - \c (ab) Grouping - \c ^a At the beginning - \c a$ At the end - \c . Any character - \c [abc] Character classes - \c [a-c] Character class range - \c [a-z0-9_] Character class combination - \c [^abc] Negated character classes - \c [^a-c] Negated character class range - \c [\b] Backspace (U+0008) - \c \\| \\\\ ... Escape characters - \c \\f Form feed (U+000C) - \c \\n Line feed (U+000A) - \c \\r Carriage return (U+000D) - \c \\t Tab (U+0009) - \c \\v Vertical tab (U+000B) \note This is a Thompson NFA engine, implemented with reference to Cox, Russ. "Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby,...).", https://swtch.com/~rsc/regexp/regexp1.html */ template class GenericRegex { public: typedef Encoding EncodingType; typedef typename Encoding::Ch Ch; template friend class GenericRegexSearch; GenericRegex(const Ch* source, Allocator* allocator = 0) : ownAllocator_(allocator ? 0 : RAPIDJSON_NEW(Allocator)()), allocator_(allocator ? allocator : ownAllocator_), states_(allocator_, 256), ranges_(allocator_, 256), root_(kRegexInvalidState), stateCount_(), rangeCount_(), anchorBegin_(), anchorEnd_() { GenericStringStream ss(source); DecodedStream, Encoding> ds(ss); Parse(ds); } ~GenericRegex() { RAPIDJSON_DELETE(ownAllocator_); } bool IsValid() const { return root_ != kRegexInvalidState; } private: enum Operator { kZeroOrOne, kZeroOrMore, kOneOrMore, kConcatenation, kAlternation, kLeftParenthesis }; static const unsigned kAnyCharacterClass = 0xFFFFFFFF; //!< For '.' static const unsigned kRangeCharacterClass = 0xFFFFFFFE; static const unsigned kRangeNegationFlag = 0x80000000; struct Range { unsigned start; // unsigned end; SizeType next; }; struct State { SizeType out; //!< Equals to kInvalid for matching state SizeType out1; //!< Equals to non-kInvalid for split SizeType rangeStart; unsigned codepoint; }; struct Frag { Frag(SizeType s, SizeType o, SizeType m) : start(s), out(o), minIndex(m) {} SizeType start; SizeType out; //!< link-list of all output states SizeType minIndex; }; State& GetState(SizeType index) { RAPIDJSON_ASSERT(index < stateCount_); return states_.template Bottom()[index]; } const State& GetState(SizeType index) const { RAPIDJSON_ASSERT(index < stateCount_); return states_.template Bottom()[index]; } Range& GetRange(SizeType index) { RAPIDJSON_ASSERT(index < rangeCount_); return ranges_.template Bottom()[index]; } const Range& GetRange(SizeType index) const { RAPIDJSON_ASSERT(index < rangeCount_); return ranges_.template Bottom()[index]; } template void Parse(DecodedStream& ds) { Stack operandStack(allocator_, 256); // Frag Stack operatorStack(allocator_, 256); // Operator Stack atomCountStack(allocator_, 256); // unsigned (Atom per parenthesis) *atomCountStack.template Push() = 0; unsigned codepoint; while (ds.Peek() != 0) { switch (codepoint = ds.Take()) { case '^': anchorBegin_ = true; break; case '$': anchorEnd_ = true; break; case '|': while (!operatorStack.Empty() && *operatorStack.template Top() < kAlternation) if (!Eval(operandStack, *operatorStack.template Pop(1))) return; *operatorStack.template Push() = kAlternation; *atomCountStack.template Top() = 0; break; case '(': *operatorStack.template Push() = kLeftParenthesis; *atomCountStack.template Push() = 0; break; case ')': while (!operatorStack.Empty() && *operatorStack.template Top() != kLeftParenthesis) if (!Eval(operandStack, *operatorStack.template Pop(1))) return; if (operatorStack.Empty()) return; operatorStack.template Pop(1); atomCountStack.template Pop(1); ImplicitConcatenation(atomCountStack, operatorStack); break; case '?': if (!Eval(operandStack, kZeroOrOne)) return; break; case '*': if (!Eval(operandStack, kZeroOrMore)) return; break; case '+': if (!Eval(operandStack, kOneOrMore)) return; break; case '{': { unsigned n, m; if (!ParseUnsigned(ds, &n)) return; if (ds.Peek() == ',') { ds.Take(); if (ds.Peek() == '}') m = kInfinityQuantifier; else if (!ParseUnsigned(ds, &m) || m < n) return; } else m = n; if (!EvalQuantifier(operandStack, n, m) || ds.Peek() != '}') return; ds.Take(); } break; case '.': PushOperand(operandStack, kAnyCharacterClass); ImplicitConcatenation(atomCountStack, operatorStack); break; case '[': { SizeType range; if (!ParseRange(ds, &range)) return; SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, kRangeCharacterClass); GetState(s).rangeStart = range; *operandStack.template Push() = Frag(s, s, s); } ImplicitConcatenation(atomCountStack, operatorStack); break; case '\\': // Escape character if (!CharacterEscape(ds, &codepoint)) return; // Unsupported escape character // fall through to default RAPIDJSON_DELIBERATE_FALLTHROUGH; default: // Pattern character PushOperand(operandStack, codepoint); ImplicitConcatenation(atomCountStack, operatorStack); } } while (!operatorStack.Empty()) if (!Eval(operandStack, *operatorStack.template Pop(1))) return; // Link the operand to matching state. if (operandStack.GetSize() == sizeof(Frag)) { Frag* e = operandStack.template Pop(1); Patch(e->out, NewState(kRegexInvalidState, kRegexInvalidState, 0)); root_ = e->start; #if RAPIDJSON_REGEX_VERBOSE printf("root: %d\n", root_); for (SizeType i = 0; i < stateCount_ ; i++) { State& s = GetState(i); printf("[%2d] out: %2d out1: %2d c: '%c'\n", i, s.out, s.out1, (char)s.codepoint); } printf("\n"); #endif } } SizeType NewState(SizeType out, SizeType out1, unsigned codepoint) { State* s = states_.template Push(); s->out = out; s->out1 = out1; s->codepoint = codepoint; s->rangeStart = kRegexInvalidRange; return stateCount_++; } void PushOperand(Stack& operandStack, unsigned codepoint) { SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, codepoint); *operandStack.template Push() = Frag(s, s, s); } void ImplicitConcatenation(Stack& atomCountStack, Stack& operatorStack) { if (*atomCountStack.template Top()) *operatorStack.template Push() = kConcatenation; (*atomCountStack.template Top())++; } SizeType Append(SizeType l1, SizeType l2) { SizeType old = l1; while (GetState(l1).out != kRegexInvalidState) l1 = GetState(l1).out; GetState(l1).out = l2; return old; } void Patch(SizeType l, SizeType s) { for (SizeType next; l != kRegexInvalidState; l = next) { next = GetState(l).out; GetState(l).out = s; } } bool Eval(Stack& operandStack, Operator op) { switch (op) { case kConcatenation: RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag) * 2); { Frag e2 = *operandStack.template Pop(1); Frag e1 = *operandStack.template Pop(1); Patch(e1.out, e2.start); *operandStack.template Push() = Frag(e1.start, e2.out, Min(e1.minIndex, e2.minIndex)); } return true; case kAlternation: if (operandStack.GetSize() >= sizeof(Frag) * 2) { Frag e2 = *operandStack.template Pop(1); Frag e1 = *operandStack.template Pop(1); SizeType s = NewState(e1.start, e2.start, 0); *operandStack.template Push() = Frag(s, Append(e1.out, e2.out), Min(e1.minIndex, e2.minIndex)); return true; } return false; case kZeroOrOne: if (operandStack.GetSize() >= sizeof(Frag)) { Frag e = *operandStack.template Pop(1); SizeType s = NewState(kRegexInvalidState, e.start, 0); *operandStack.template Push() = Frag(s, Append(e.out, s), e.minIndex); return true; } return false; case kZeroOrMore: if (operandStack.GetSize() >= sizeof(Frag)) { Frag e = *operandStack.template Pop(1); SizeType s = NewState(kRegexInvalidState, e.start, 0); Patch(e.out, s); *operandStack.template Push() = Frag(s, s, e.minIndex); return true; } return false; case kOneOrMore: if (operandStack.GetSize() >= sizeof(Frag)) { Frag e = *operandStack.template Pop(1); SizeType s = NewState(kRegexInvalidState, e.start, 0); Patch(e.out, s); *operandStack.template Push() = Frag(e.start, s, e.minIndex); return true; } return false; default: // syntax error (e.g. unclosed kLeftParenthesis) return false; } } bool EvalQuantifier(Stack& operandStack, unsigned n, unsigned m) { RAPIDJSON_ASSERT(n <= m); RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag)); if (n == 0) { if (m == 0) // a{0} not support return false; else if (m == kInfinityQuantifier) Eval(operandStack, kZeroOrMore); // a{0,} -> a* else { Eval(operandStack, kZeroOrOne); // a{0,5} -> a? for (unsigned i = 0; i < m - 1; i++) CloneTopOperand(operandStack); // a{0,5} -> a? a? a? a? a? for (unsigned i = 0; i < m - 1; i++) Eval(operandStack, kConcatenation); // a{0,5} -> a?a?a?a?a? } return true; } for (unsigned i = 0; i < n - 1; i++) // a{3} -> a a a CloneTopOperand(operandStack); if (m == kInfinityQuantifier) Eval(operandStack, kOneOrMore); // a{3,} -> a a a+ else if (m > n) { CloneTopOperand(operandStack); // a{3,5} -> a a a a Eval(operandStack, kZeroOrOne); // a{3,5} -> a a a a? for (unsigned i = n; i < m - 1; i++) CloneTopOperand(operandStack); // a{3,5} -> a a a a? a? for (unsigned i = n; i < m; i++) Eval(operandStack, kConcatenation); // a{3,5} -> a a aa?a? } for (unsigned i = 0; i < n - 1; i++) Eval(operandStack, kConcatenation); // a{3} -> aaa, a{3,} -> aaa+, a{3.5} -> aaaa?a? return true; } static SizeType Min(SizeType a, SizeType b) { return a < b ? a : b; } void CloneTopOperand(Stack& operandStack) { const Frag src = *operandStack.template Top(); // Copy constructor to prevent invalidation SizeType count = stateCount_ - src.minIndex; // Assumes top operand contains states in [src->minIndex, stateCount_) State* s = states_.template Push(count); memcpy(s, &GetState(src.minIndex), count * sizeof(State)); for (SizeType j = 0; j < count; j++) { if (s[j].out != kRegexInvalidState) s[j].out += count; if (s[j].out1 != kRegexInvalidState) s[j].out1 += count; } *operandStack.template Push() = Frag(src.start + count, src.out + count, src.minIndex + count); stateCount_ += count; } template bool ParseUnsigned(DecodedStream& ds, unsigned* u) { unsigned r = 0; if (ds.Peek() < '0' || ds.Peek() > '9') return false; while (ds.Peek() >= '0' && ds.Peek() <= '9') { if (r >= 429496729 && ds.Peek() > '5') // 2^32 - 1 = 4294967295 return false; // overflow r = r * 10 + (ds.Take() - '0'); } *u = r; return true; } template bool ParseRange(DecodedStream& ds, SizeType* range) { bool isBegin = true; bool negate = false; int step = 0; SizeType start = kRegexInvalidRange; SizeType current = kRegexInvalidRange; unsigned codepoint; while ((codepoint = ds.Take()) != 0) { if (isBegin) { isBegin = false; if (codepoint == '^') { negate = true; continue; } } switch (codepoint) { case ']': if (start == kRegexInvalidRange) return false; // Error: nothing inside [] if (step == 2) { // Add trailing '-' SizeType r = NewRange('-'); RAPIDJSON_ASSERT(current != kRegexInvalidRange); GetRange(current).next = r; } if (negate) GetRange(start).start |= kRangeNegationFlag; *range = start; return true; case '\\': if (ds.Peek() == 'b') { ds.Take(); codepoint = 0x0008; // Escape backspace character } else if (!CharacterEscape(ds, &codepoint)) return false; // fall through to default RAPIDJSON_DELIBERATE_FALLTHROUGH; default: switch (step) { case 1: if (codepoint == '-') { step++; break; } // fall through to step 0 for other characters RAPIDJSON_DELIBERATE_FALLTHROUGH; case 0: { SizeType r = NewRange(codepoint); if (current != kRegexInvalidRange) GetRange(current).next = r; if (start == kRegexInvalidRange) start = r; current = r; } step = 1; break; default: RAPIDJSON_ASSERT(step == 2); GetRange(current).end = codepoint; step = 0; } } } return false; } SizeType NewRange(unsigned codepoint) { Range* r = ranges_.template Push(); r->start = r->end = codepoint; r->next = kRegexInvalidRange; return rangeCount_++; } template bool CharacterEscape(DecodedStream& ds, unsigned* escapedCodepoint) { unsigned codepoint; switch (codepoint = ds.Take()) { case '^': case '$': case '|': case '(': case ')': case '?': case '*': case '+': case '.': case '[': case ']': case '{': case '}': case '\\': *escapedCodepoint = codepoint; return true; case 'f': *escapedCodepoint = 0x000C; return true; case 'n': *escapedCodepoint = 0x000A; return true; case 'r': *escapedCodepoint = 0x000D; return true; case 't': *escapedCodepoint = 0x0009; return true; case 'v': *escapedCodepoint = 0x000B; return true; default: return false; // Unsupported escape character } } Allocator* ownAllocator_; Allocator* allocator_; Stack states_; Stack ranges_; SizeType root_; SizeType stateCount_; SizeType rangeCount_; static const unsigned kInfinityQuantifier = ~0u; // For SearchWithAnchoring() bool anchorBegin_; bool anchorEnd_; }; template class GenericRegexSearch { public: typedef typename RegexType::EncodingType Encoding; typedef typename Encoding::Ch Ch; GenericRegexSearch(const RegexType& regex, Allocator* allocator = 0) : regex_(regex), allocator_(allocator), ownAllocator_(0), state0_(allocator, 0), state1_(allocator, 0), stateSet_() { RAPIDJSON_ASSERT(regex_.IsValid()); if (!allocator_) ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); stateSet_ = static_cast(allocator_->Malloc(GetStateSetSize())); state0_.template Reserve(regex_.stateCount_); state1_.template Reserve(regex_.stateCount_); } ~GenericRegexSearch() { Allocator::Free(stateSet_); RAPIDJSON_DELETE(ownAllocator_); } template bool Match(InputStream& is) { return SearchWithAnchoring(is, true, true); } bool Match(const Ch* s) { GenericStringStream is(s); return Match(is); } template bool Search(InputStream& is) { return SearchWithAnchoring(is, regex_.anchorBegin_, regex_.anchorEnd_); } bool Search(const Ch* s) { GenericStringStream is(s); return Search(is); } private: typedef typename RegexType::State State; typedef typename RegexType::Range Range; template bool SearchWithAnchoring(InputStream& is, bool anchorBegin, bool anchorEnd) { DecodedStream ds(is); state0_.Clear(); Stack *current = &state0_, *next = &state1_; const size_t stateSetSize = GetStateSetSize(); std::memset(stateSet_, 0, stateSetSize); bool matched = AddState(*current, regex_.root_); unsigned codepoint; while (!current->Empty() && (codepoint = ds.Take()) != 0) { std::memset(stateSet_, 0, stateSetSize); next->Clear(); matched = false; for (const SizeType* s = current->template Bottom(); s != current->template End(); ++s) { const State& sr = regex_.GetState(*s); if (sr.codepoint == codepoint || sr.codepoint == RegexType::kAnyCharacterClass || (sr.codepoint == RegexType::kRangeCharacterClass && MatchRange(sr.rangeStart, codepoint))) { matched = AddState(*next, sr.out) || matched; if (!anchorEnd && matched) return true; } if (!anchorBegin) AddState(*next, regex_.root_); } internal::Swap(current, next); } return matched; } size_t GetStateSetSize() const { return (regex_.stateCount_ + 31) / 32 * 4; } // Return whether the added states is a match state bool AddState(Stack& l, SizeType index) { RAPIDJSON_ASSERT(index != kRegexInvalidState); const State& s = regex_.GetState(index); if (s.out1 != kRegexInvalidState) { // Split bool matched = AddState(l, s.out); return AddState(l, s.out1) || matched; } else if (!(stateSet_[index >> 5] & (1u << (index & 31)))) { stateSet_[index >> 5] |= (1u << (index & 31)); *l.template PushUnsafe() = index; } return s.out == kRegexInvalidState; // by using PushUnsafe() above, we can ensure s is not validated due to reallocation. } bool MatchRange(SizeType rangeIndex, unsigned codepoint) const { bool yes = (regex_.GetRange(rangeIndex).start & RegexType::kRangeNegationFlag) == 0; while (rangeIndex != kRegexInvalidRange) { const Range& r = regex_.GetRange(rangeIndex); if (codepoint >= (r.start & ~RegexType::kRangeNegationFlag) && codepoint <= r.end) return yes; rangeIndex = r.next; } return !yes; } const RegexType& regex_; Allocator* allocator_; Allocator* ownAllocator_; Stack state0_; Stack state1_; uint32_t* stateSet_; }; typedef GenericRegex > Regex; typedef GenericRegexSearch RegexSearch; } // namespace internal RAPIDJSON_NAMESPACE_END #ifdef __GNUC__ RAPIDJSON_DIAG_POP #endif #if defined(__clang__) || defined(_MSC_VER) RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_INTERNAL_REGEX_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/internal/biginteger.h0000644000000000000000000002204415031566105027433 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_BIGINTEGER_H_ #define RAPIDJSON_BIGINTEGER_H_ #include "../rapidjson.h" #if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_M_AMD64) #include // for _umul128 #if !defined(_ARM64EC_) #pragma intrinsic(_umul128) #else #pragma comment(lib,"softintrin") #endif #endif RAPIDJSON_NAMESPACE_BEGIN namespace internal { class BigInteger { public: typedef uint64_t Type; BigInteger(const BigInteger& rhs) : count_(rhs.count_) { std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); } explicit BigInteger(uint64_t u) : count_(1) { digits_[0] = u; } template BigInteger(const Ch* decimals, size_t length) : count_(1) { RAPIDJSON_ASSERT(length > 0); digits_[0] = 0; size_t i = 0; const size_t kMaxDigitPerIteration = 19; // 2^64 = 18446744073709551616 > 10^19 while (length >= kMaxDigitPerIteration) { AppendDecimal64(decimals + i, decimals + i + kMaxDigitPerIteration); length -= kMaxDigitPerIteration; i += kMaxDigitPerIteration; } if (length > 0) AppendDecimal64(decimals + i, decimals + i + length); } BigInteger& operator=(const BigInteger &rhs) { if (this != &rhs) { count_ = rhs.count_; std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); } return *this; } BigInteger& operator=(uint64_t u) { digits_[0] = u; count_ = 1; return *this; } BigInteger& operator+=(uint64_t u) { Type backup = digits_[0]; digits_[0] += u; for (size_t i = 0; i < count_ - 1; i++) { if (digits_[i] >= backup) return *this; // no carry backup = digits_[i + 1]; digits_[i + 1] += 1; } // Last carry if (digits_[count_ - 1] < backup) PushBack(1); return *this; } BigInteger& operator*=(uint64_t u) { if (u == 0) return *this = 0; if (u == 1) return *this; if (*this == 1) return *this = u; uint64_t k = 0; for (size_t i = 0; i < count_; i++) { uint64_t hi; digits_[i] = MulAdd64(digits_[i], u, k, &hi); k = hi; } if (k > 0) PushBack(k); return *this; } BigInteger& operator*=(uint32_t u) { if (u == 0) return *this = 0; if (u == 1) return *this; if (*this == 1) return *this = u; uint64_t k = 0; for (size_t i = 0; i < count_; i++) { const uint64_t c = digits_[i] >> 32; const uint64_t d = digits_[i] & 0xFFFFFFFF; const uint64_t uc = u * c; const uint64_t ud = u * d; const uint64_t p0 = ud + k; const uint64_t p1 = uc + (p0 >> 32); digits_[i] = (p0 & 0xFFFFFFFF) | (p1 << 32); k = p1 >> 32; } if (k > 0) PushBack(k); return *this; } BigInteger& operator<<=(size_t shift) { if (IsZero() || shift == 0) return *this; size_t offset = shift / kTypeBit; size_t interShift = shift % kTypeBit; RAPIDJSON_ASSERT(count_ + offset <= kCapacity); if (interShift == 0) { std::memmove(digits_ + offset, digits_, count_ * sizeof(Type)); count_ += offset; } else { digits_[count_] = 0; for (size_t i = count_; i > 0; i--) digits_[i + offset] = (digits_[i] << interShift) | (digits_[i - 1] >> (kTypeBit - interShift)); digits_[offset] = digits_[0] << interShift; count_ += offset; if (digits_[count_]) count_++; } std::memset(digits_, 0, offset * sizeof(Type)); return *this; } bool operator==(const BigInteger& rhs) const { return count_ == rhs.count_ && std::memcmp(digits_, rhs.digits_, count_ * sizeof(Type)) == 0; } bool operator==(const Type rhs) const { return count_ == 1 && digits_[0] == rhs; } BigInteger& MultiplyPow5(unsigned exp) { static const uint32_t kPow5[12] = { 5, 5 * 5, 5 * 5 * 5, 5 * 5 * 5 * 5, 5 * 5 * 5 * 5 * 5, 5 * 5 * 5 * 5 * 5 * 5, 5 * 5 * 5 * 5 * 5 * 5 * 5, 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 }; if (exp == 0) return *this; for (; exp >= 27; exp -= 27) *this *= RAPIDJSON_UINT64_C2(0X6765C793, 0XFA10079D); // 5^27 for (; exp >= 13; exp -= 13) *this *= static_cast(1220703125u); // 5^13 if (exp > 0) *this *= kPow5[exp - 1]; return *this; } // Compute absolute difference of this and rhs. // Assume this != rhs bool Difference(const BigInteger& rhs, BigInteger* out) const { int cmp = Compare(rhs); RAPIDJSON_ASSERT(cmp != 0); const BigInteger *a, *b; // Makes a > b bool ret; if (cmp < 0) { a = &rhs; b = this; ret = true; } else { a = this; b = &rhs; ret = false; } Type borrow = 0; for (size_t i = 0; i < a->count_; i++) { Type d = a->digits_[i] - borrow; if (i < b->count_) d -= b->digits_[i]; borrow = (d > a->digits_[i]) ? 1 : 0; out->digits_[i] = d; if (d != 0) out->count_ = i + 1; } return ret; } int Compare(const BigInteger& rhs) const { if (count_ != rhs.count_) return count_ < rhs.count_ ? -1 : 1; for (size_t i = count_; i-- > 0;) if (digits_[i] != rhs.digits_[i]) return digits_[i] < rhs.digits_[i] ? -1 : 1; return 0; } size_t GetCount() const { return count_; } Type GetDigit(size_t index) const { RAPIDJSON_ASSERT(index < count_); return digits_[index]; } bool IsZero() const { return count_ == 1 && digits_[0] == 0; } private: template void AppendDecimal64(const Ch* begin, const Ch* end) { uint64_t u = ParseUint64(begin, end); if (IsZero()) *this = u; else { unsigned exp = static_cast(end - begin); (MultiplyPow5(exp) <<= exp) += u; // *this = *this * 10^exp + u } } void PushBack(Type digit) { RAPIDJSON_ASSERT(count_ < kCapacity); digits_[count_++] = digit; } template static uint64_t ParseUint64(const Ch* begin, const Ch* end) { uint64_t r = 0; for (const Ch* p = begin; p != end; ++p) { RAPIDJSON_ASSERT(*p >= Ch('0') && *p <= Ch('9')); r = r * 10u + static_cast(*p - Ch('0')); } return r; } // Assume a * b + k < 2^128 static uint64_t MulAdd64(uint64_t a, uint64_t b, uint64_t k, uint64_t* outHigh) { #if defined(_MSC_VER) && defined(_M_AMD64) uint64_t low = _umul128(a, b, outHigh) + k; if (low < k) (*outHigh)++; return low; #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) __extension__ typedef unsigned __int128 uint128; uint128 p = static_cast(a) * static_cast(b); p += k; *outHigh = static_cast(p >> 64); return static_cast(p); #else const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32; uint64_t x0 = a0 * b0, x1 = a0 * b1, x2 = a1 * b0, x3 = a1 * b1; x1 += (x0 >> 32); // can't give carry x1 += x2; if (x1 < x2) x3 += (static_cast(1) << 32); uint64_t lo = (x1 << 32) + (x0 & 0xFFFFFFFF); uint64_t hi = x3 + (x1 >> 32); lo += k; if (lo < k) hi++; *outHigh = hi; return lo; #endif } static const size_t kBitCount = 3328; // 64bit * 54 > 10^1000 static const size_t kCapacity = kBitCount / sizeof(Type); static const size_t kTypeBit = sizeof(Type) * 8; Type digits_[kCapacity]; size_t count_; }; } // namespace internal RAPIDJSON_NAMESPACE_END #endif // RAPIDJSON_BIGINTEGER_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/document.h0000644000000000000000000040506515031566105025326 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_DOCUMENT_H_ #define RAPIDJSON_DOCUMENT_H_ /*! \file document.h */ #include "reader.h" #include "internal/meta.h" #include "internal/strfunc.h" #include "memorystream.h" #include "encodedstream.h" #include // placement new #include #ifdef __cpp_lib_three_way_comparison #include #endif RAPIDJSON_DIAG_PUSH #ifdef __clang__ RAPIDJSON_DIAG_OFF(padded) RAPIDJSON_DIAG_OFF(switch-enum) RAPIDJSON_DIAG_OFF(c++98-compat) #elif defined(_MSC_VER) RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data #endif #ifdef __GNUC__ RAPIDJSON_DIAG_OFF(effc++) #endif // __GNUC__ #ifdef GetObject // see https://github.com/Tencent/rapidjson/issues/1448 // a former included windows.h might have defined a macro called GetObject, which affects // GetObject defined here. This ensures the macro does not get applied #pragma push_macro("GetObject") #define RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED #undef GetObject #endif #ifndef RAPIDJSON_NOMEMBERITERATORCLASS #include // std::random_access_iterator_tag #endif #if RAPIDJSON_USE_MEMBERSMAP #include // std::multimap #endif RAPIDJSON_NAMESPACE_BEGIN // Forward declaration. template class GenericValue; template class GenericDocument; /*! \def RAPIDJSON_DEFAULT_ALLOCATOR \ingroup RAPIDJSON_CONFIG \brief Allows to choose default allocator. User can define this to use CrtAllocator or MemoryPoolAllocator. */ #ifndef RAPIDJSON_DEFAULT_ALLOCATOR #define RAPIDJSON_DEFAULT_ALLOCATOR ::RAPIDJSON_NAMESPACE::MemoryPoolAllocator<::RAPIDJSON_NAMESPACE::CrtAllocator> #endif /*! \def RAPIDJSON_DEFAULT_STACK_ALLOCATOR \ingroup RAPIDJSON_CONFIG \brief Allows to choose default stack allocator for Document. User can define this to use CrtAllocator or MemoryPoolAllocator. */ #ifndef RAPIDJSON_DEFAULT_STACK_ALLOCATOR #define RAPIDJSON_DEFAULT_STACK_ALLOCATOR ::RAPIDJSON_NAMESPACE::CrtAllocator #endif /*! \def RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY \ingroup RAPIDJSON_CONFIG \brief User defined kDefaultObjectCapacity value. User can define this as any natural number. */ #ifndef RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY // number of objects that rapidjson::Value allocates memory for by default #define RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY 16 #endif /*! \def RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY \ingroup RAPIDJSON_CONFIG \brief User defined kDefaultArrayCapacity value. User can define this as any natural number. */ #ifndef RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY // number of array elements that rapidjson::Value allocates memory for by default #define RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY 16 #endif //! Name-value pair in a JSON object value. /*! This class was internal to GenericValue. It used to be a inner struct. But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct. https://code.google.com/p/rapidjson/issues/detail?id=64 */ template class GenericMember { public: GenericValue name; //!< name of member (must be a string) GenericValue value; //!< value of member. #if RAPIDJSON_HAS_CXX11_RVALUE_REFS //! Move constructor in C++11 GenericMember(GenericMember&& rhs) RAPIDJSON_NOEXCEPT : name(std::move(rhs.name)), value(std::move(rhs.value)) { } //! Move assignment in C++11 GenericMember& operator=(GenericMember&& rhs) RAPIDJSON_NOEXCEPT { return *this = static_cast(rhs); } #endif //! Assignment with move semantics. /*! \param rhs Source of the assignment. Its name and value will become a null value after assignment. */ GenericMember& operator=(GenericMember& rhs) RAPIDJSON_NOEXCEPT { if (RAPIDJSON_LIKELY(this != &rhs)) { name = rhs.name; value = rhs.value; } return *this; } // swap() for std::sort() and other potential use in STL. friend inline void swap(GenericMember& a, GenericMember& b) RAPIDJSON_NOEXCEPT { a.name.Swap(b.name); a.value.Swap(b.value); } private: //! Copy constructor is not permitted. GenericMember(const GenericMember& rhs); }; /////////////////////////////////////////////////////////////////////////////// // GenericMemberIterator #ifndef RAPIDJSON_NOMEMBERITERATORCLASS //! (Constant) member iterator for a JSON object value /*! \tparam Const Is this a constant iterator? \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) \tparam Allocator Allocator type for allocating memory of object, array and string. This class implements a Random Access Iterator for GenericMember elements of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements]. \note This iterator implementation is mainly intended to avoid implicit conversions from iterator values to \c NULL, e.g. from GenericValue::FindMember. \note Define \c RAPIDJSON_NOMEMBERITERATORCLASS to fall back to a pointer-based implementation, if your platform doesn't provide the C++ header. \see GenericMember, GenericValue::MemberIterator, GenericValue::ConstMemberIterator */ template class GenericMemberIterator { friend class GenericValue; template friend class GenericMemberIterator; typedef GenericMember PlainType; typedef typename internal::MaybeAddConst::Type ValueType; public: //! Iterator type itself typedef GenericMemberIterator Iterator; //! Constant iterator type typedef GenericMemberIterator ConstIterator; //! Non-constant iterator type typedef GenericMemberIterator NonConstIterator; /** \name std::iterator_traits support */ //@{ typedef ValueType value_type; typedef ValueType * pointer; typedef ValueType & reference; typedef std::ptrdiff_t difference_type; typedef std::random_access_iterator_tag iterator_category; //@} //! Pointer to (const) GenericMember typedef pointer Pointer; //! Reference to (const) GenericMember typedef reference Reference; //! Signed integer type (e.g. \c ptrdiff_t) typedef difference_type DifferenceType; //! Default constructor (singular value) /*! Creates an iterator pointing to no element. \note All operations, except for comparisons, are undefined on such values. */ GenericMemberIterator() : ptr_() {} //! Iterator conversions to more const /*! \param it (Non-const) iterator to copy from Allows the creation of an iterator from another GenericMemberIterator that is "less const". Especially, creating a non-constant iterator from a constant iterator are disabled: \li const -> non-const (not ok) \li const -> const (ok) \li non-const -> const (ok) \li non-const -> non-const (ok) \note If the \c Const template parameter is already \c false, this constructor effectively defines a regular copy-constructor. Otherwise, the copy constructor is implicitly defined. */ GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {} Iterator& operator=(const NonConstIterator & it) { ptr_ = it.ptr_; return *this; } //! @name stepping //@{ Iterator& operator++(){ ++ptr_; return *this; } Iterator& operator--(){ --ptr_; return *this; } Iterator operator++(int){ Iterator old(*this); ++ptr_; return old; } Iterator operator--(int){ Iterator old(*this); --ptr_; return old; } //@} //! @name increment/decrement //@{ Iterator operator+(DifferenceType n) const { return Iterator(ptr_+n); } Iterator operator-(DifferenceType n) const { return Iterator(ptr_-n); } Iterator& operator+=(DifferenceType n) { ptr_+=n; return *this; } Iterator& operator-=(DifferenceType n) { ptr_-=n; return *this; } //@} //! @name relations //@{ template bool operator==(const GenericMemberIterator& that) const { return ptr_ == that.ptr_; } template bool operator!=(const GenericMemberIterator& that) const { return ptr_ != that.ptr_; } template bool operator<=(const GenericMemberIterator& that) const { return ptr_ <= that.ptr_; } template bool operator>=(const GenericMemberIterator& that) const { return ptr_ >= that.ptr_; } template bool operator< (const GenericMemberIterator& that) const { return ptr_ < that.ptr_; } template bool operator> (const GenericMemberIterator& that) const { return ptr_ > that.ptr_; } #ifdef __cpp_lib_three_way_comparison template std::strong_ordering operator<=>(const GenericMemberIterator& that) const { return ptr_ <=> that.ptr_; } #endif //@} //! @name dereference //@{ Reference operator*() const { return *ptr_; } Pointer operator->() const { return ptr_; } Reference operator[](DifferenceType n) const { return ptr_[n]; } //@} //! Distance DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; } private: //! Internal constructor from plain pointer explicit GenericMemberIterator(Pointer p) : ptr_(p) {} Pointer ptr_; //!< raw pointer }; #else // RAPIDJSON_NOMEMBERITERATORCLASS // class-based member iterator implementation disabled, use plain pointers template class GenericMemberIterator; //! non-const GenericMemberIterator template class GenericMemberIterator { public: //! use plain pointer as iterator type typedef GenericMember* Iterator; }; //! const GenericMemberIterator template class GenericMemberIterator { public: //! use plain const pointer as iterator type typedef const GenericMember* Iterator; }; #endif // RAPIDJSON_NOMEMBERITERATORCLASS /////////////////////////////////////////////////////////////////////////////// // GenericStringRef //! Reference to a constant string (not taking a copy) /*! \tparam CharType character type of the string This helper class is used to automatically infer constant string references for string literals, especially from \c const \b (!) character arrays. The main use is for creating JSON string values without copying the source string via an \ref Allocator. This requires that the referenced string pointers have a sufficient lifetime, which exceeds the lifetime of the associated GenericValue. \b Example \code Value v("foo"); // ok, no need to copy & calculate length const char foo[] = "foo"; v.SetString(foo); // ok const char* bar = foo; // Value x(bar); // not ok, can't rely on bar's lifetime Value x(StringRef(bar)); // lifetime explicitly guaranteed by user Value y(StringRef(bar, 3)); // ok, explicitly pass length \endcode \see StringRef, GenericValue::SetString */ template struct GenericStringRef { typedef CharType Ch; //!< character type of the string //! Create string reference from \c const character array #ifndef __clang__ // -Wdocumentation /*! This constructor implicitly creates a constant string reference from a \c const character array. It has better performance than \ref StringRef(const CharType*) by inferring the string \ref length from the array length, and also supports strings containing null characters. \tparam N length of the string, automatically inferred \param str Constant character array, lifetime assumed to be longer than the use of the string in e.g. a GenericValue \post \ref s == str \note Constant complexity. \note There is a hidden, private overload to disallow references to non-const character arrays to be created via this constructor. By this, e.g. function-scope arrays used to be filled via \c snprintf are excluded from consideration. In such cases, the referenced string should be \b copied to the GenericValue instead. */ #endif template GenericStringRef(const CharType (&str)[N]) RAPIDJSON_NOEXCEPT : s(str), length(N-1) {} //! Explicitly create string reference from \c const character pointer #ifndef __clang__ // -Wdocumentation /*! This constructor can be used to \b explicitly create a reference to a constant string pointer. \see StringRef(const CharType*) \param str Constant character pointer, lifetime assumed to be longer than the use of the string in e.g. a GenericValue \post \ref s == str \note There is a hidden, private overload to disallow references to non-const character arrays to be created via this constructor. By this, e.g. function-scope arrays used to be filled via \c snprintf are excluded from consideration. In such cases, the referenced string should be \b copied to the GenericValue instead. */ #endif explicit GenericStringRef(const CharType* str) : s(str), length(NotNullStrLen(str)) {} //! Create constant string reference from pointer and length #ifndef __clang__ // -Wdocumentation /*! \param str constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue \param len length of the string, excluding the trailing NULL terminator \post \ref s == str && \ref length == len \note Constant complexity. */ #endif GenericStringRef(const CharType* str, SizeType len) : s(RAPIDJSON_LIKELY(str) ? str : emptyString), length(len) { RAPIDJSON_ASSERT(str != 0 || len == 0u); } GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {} //! implicit conversion to plain CharType pointer operator const Ch *() const { return s; } const Ch* const s; //!< plain CharType pointer const SizeType length; //!< length of the string (excluding the trailing NULL terminator) private: SizeType NotNullStrLen(const CharType* str) { RAPIDJSON_ASSERT(str != 0); return internal::StrLen(str); } /// Empty string - used when passing in a NULL pointer static const Ch emptyString[]; //! Disallow construction from non-const array template GenericStringRef(CharType (&str)[N]) /* = delete */; //! Copy assignment operator not permitted - immutable type GenericStringRef& operator=(const GenericStringRef& rhs) /* = delete */; }; template const CharType GenericStringRef::emptyString[] = { CharType() }; //! Mark a character pointer as constant string /*! Mark a plain character pointer as a "string literal". This function can be used to avoid copying a character string to be referenced as a value in a JSON GenericValue object, if the string's lifetime is known to be valid long enough. \tparam CharType Character type of the string \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue \return GenericStringRef string reference object \relatesalso GenericStringRef \see GenericValue::GenericValue(StringRefType), GenericValue::operator=(StringRefType), GenericValue::SetString(StringRefType), GenericValue::PushBack(StringRefType, Allocator&), GenericValue::AddMember */ template inline GenericStringRef StringRef(const CharType* str) { return GenericStringRef(str); } //! Mark a character pointer as constant string /*! Mark a plain character pointer as a "string literal". This function can be used to avoid copying a character string to be referenced as a value in a JSON GenericValue object, if the string's lifetime is known to be valid long enough. This version has better performance with supplied length, and also supports string containing null characters. \tparam CharType character type of the string \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue \param length The length of source string. \return GenericStringRef string reference object \relatesalso GenericStringRef */ template inline GenericStringRef StringRef(const CharType* str, size_t length) { return GenericStringRef(str, SizeType(length)); } #if RAPIDJSON_HAS_STDSTRING //! Mark a string object as constant string /*! Mark a string object (e.g. \c std::string) as a "string literal". This function can be used to avoid copying a string to be referenced as a value in a JSON GenericValue object, if the string's lifetime is known to be valid long enough. \tparam CharType character type of the string \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue \return GenericStringRef string reference object \relatesalso GenericStringRef \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. */ template inline GenericStringRef StringRef(const std::basic_string& str) { return GenericStringRef(str.data(), SizeType(str.size())); } #endif /////////////////////////////////////////////////////////////////////////////// // GenericValue type traits namespace internal { template struct IsGenericValueImpl : FalseType {}; // select candidates according to nested encoding and allocator types template struct IsGenericValueImpl::Type, typename Void::Type> : IsBaseOf, T>::Type {}; // helper to match arbitrary GenericValue instantiations, including derived classes template struct IsGenericValue : IsGenericValueImpl::Type {}; } // namespace internal /////////////////////////////////////////////////////////////////////////////// // TypeHelper namespace internal { template struct TypeHelper {}; template struct TypeHelper { static bool Is(const ValueType& v) { return v.IsBool(); } static bool Get(const ValueType& v) { return v.GetBool(); } static ValueType& Set(ValueType& v, bool data) { return v.SetBool(data); } static ValueType& Set(ValueType& v, bool data, typename ValueType::AllocatorType&) { return v.SetBool(data); } }; template struct TypeHelper { static bool Is(const ValueType& v) { return v.IsInt(); } static int Get(const ValueType& v) { return v.GetInt(); } static ValueType& Set(ValueType& v, int data) { return v.SetInt(data); } static ValueType& Set(ValueType& v, int data, typename ValueType::AllocatorType&) { return v.SetInt(data); } }; template struct TypeHelper { static bool Is(const ValueType& v) { return v.IsUint(); } static unsigned Get(const ValueType& v) { return v.GetUint(); } static ValueType& Set(ValueType& v, unsigned data) { return v.SetUint(data); } static ValueType& Set(ValueType& v, unsigned data, typename ValueType::AllocatorType&) { return v.SetUint(data); } }; #ifdef _MSC_VER RAPIDJSON_STATIC_ASSERT(sizeof(long) == sizeof(int)); template struct TypeHelper { static bool Is(const ValueType& v) { return v.IsInt(); } static long Get(const ValueType& v) { return v.GetInt(); } static ValueType& Set(ValueType& v, long data) { return v.SetInt(data); } static ValueType& Set(ValueType& v, long data, typename ValueType::AllocatorType&) { return v.SetInt(data); } }; RAPIDJSON_STATIC_ASSERT(sizeof(unsigned long) == sizeof(unsigned)); template struct TypeHelper { static bool Is(const ValueType& v) { return v.IsUint(); } static unsigned long Get(const ValueType& v) { return v.GetUint(); } static ValueType& Set(ValueType& v, unsigned long data) { return v.SetUint(data); } static ValueType& Set(ValueType& v, unsigned long data, typename ValueType::AllocatorType&) { return v.SetUint(data); } }; #endif template struct TypeHelper { static bool Is(const ValueType& v) { return v.IsInt64(); } static int64_t Get(const ValueType& v) { return v.GetInt64(); } static ValueType& Set(ValueType& v, int64_t data) { return v.SetInt64(data); } static ValueType& Set(ValueType& v, int64_t data, typename ValueType::AllocatorType&) { return v.SetInt64(data); } }; template struct TypeHelper { static bool Is(const ValueType& v) { return v.IsUint64(); } static uint64_t Get(const ValueType& v) { return v.GetUint64(); } static ValueType& Set(ValueType& v, uint64_t data) { return v.SetUint64(data); } static ValueType& Set(ValueType& v, uint64_t data, typename ValueType::AllocatorType&) { return v.SetUint64(data); } }; template struct TypeHelper { static bool Is(const ValueType& v) { return v.IsDouble(); } static double Get(const ValueType& v) { return v.GetDouble(); } static ValueType& Set(ValueType& v, double data) { return v.SetDouble(data); } static ValueType& Set(ValueType& v, double data, typename ValueType::AllocatorType&) { return v.SetDouble(data); } }; template struct TypeHelper { static bool Is(const ValueType& v) { return v.IsFloat(); } static float Get(const ValueType& v) { return v.GetFloat(); } static ValueType& Set(ValueType& v, float data) { return v.SetFloat(data); } static ValueType& Set(ValueType& v, float data, typename ValueType::AllocatorType&) { return v.SetFloat(data); } }; template struct TypeHelper { typedef const typename ValueType::Ch* StringType; static bool Is(const ValueType& v) { return v.IsString(); } static StringType Get(const ValueType& v) { return v.GetString(); } static ValueType& Set(ValueType& v, const StringType data) { return v.SetString(typename ValueType::StringRefType(data)); } static ValueType& Set(ValueType& v, const StringType data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } }; #if RAPIDJSON_HAS_STDSTRING template struct TypeHelper > { typedef std::basic_string StringType; static bool Is(const ValueType& v) { return v.IsString(); } static StringType Get(const ValueType& v) { return StringType(v.GetString(), v.GetStringLength()); } static ValueType& Set(ValueType& v, const StringType& data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } }; #endif template struct TypeHelper { typedef typename ValueType::Array ArrayType; static bool Is(const ValueType& v) { return v.IsArray(); } static ArrayType Get(ValueType& v) { return v.GetArray(); } static ValueType& Set(ValueType& v, ArrayType data) { return v = data; } static ValueType& Set(ValueType& v, ArrayType data, typename ValueType::AllocatorType&) { return v = data; } }; template struct TypeHelper { typedef typename ValueType::ConstArray ArrayType; static bool Is(const ValueType& v) { return v.IsArray(); } static ArrayType Get(const ValueType& v) { return v.GetArray(); } }; template struct TypeHelper { typedef typename ValueType::Object ObjectType; static bool Is(const ValueType& v) { return v.IsObject(); } static ObjectType Get(ValueType& v) { return v.GetObject(); } static ValueType& Set(ValueType& v, ObjectType data) { return v = data; } static ValueType& Set(ValueType& v, ObjectType data, typename ValueType::AllocatorType&) { return v = data; } }; template struct TypeHelper { typedef typename ValueType::ConstObject ObjectType; static bool Is(const ValueType& v) { return v.IsObject(); } static ObjectType Get(const ValueType& v) { return v.GetObject(); } }; } // namespace internal // Forward declarations template class GenericArray; template class GenericObject; /////////////////////////////////////////////////////////////////////////////// // GenericValue //! Represents a JSON value. Use Value for UTF8 encoding and default allocator. /*! A JSON value can be one of 7 types. This class is a variant type supporting these types. Use the Value if UTF8 and default allocator \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) \tparam Allocator Allocator type for allocating memory of object, array and string. */ template class GenericValue { public: //! Name-value pair in an object. typedef GenericMember Member; typedef Encoding EncodingType; //!< Encoding type from template parameter. typedef Allocator AllocatorType; //!< Allocator type from template parameter. typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. typedef GenericStringRef StringRefType; //!< Reference to a constant string typedef typename GenericMemberIterator::Iterator MemberIterator; //!< Member iterator for iterating in object. typedef typename GenericMemberIterator::Iterator ConstMemberIterator; //!< Constant member iterator for iterating in object. typedef GenericValue* ValueIterator; //!< Value iterator for iterating in array. typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array. typedef GenericValue ValueType; //!< Value type of itself. typedef GenericArray Array; typedef GenericArray ConstArray; typedef GenericObject Object; typedef GenericObject ConstObject; //!@name Constructors and destructor. //@{ //! Default constructor creates a null value. GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS //! Move constructor in C++11 GenericValue(GenericValue&& rhs) RAPIDJSON_NOEXCEPT : data_(rhs.data_) { rhs.data_.f.flags = kNullFlag; // give up contents } #endif private: //! Copy constructor is not permitted. GenericValue(const GenericValue& rhs); #if RAPIDJSON_HAS_CXX11_RVALUE_REFS //! Moving from a GenericDocument is not permitted. template GenericValue(GenericDocument&& rhs); //! Move assignment from a GenericDocument is not permitted. template GenericValue& operator=(GenericDocument&& rhs); #endif public: //! Constructor with JSON value type. /*! This creates a Value of specified type with default content. \param type Type of the value. \note Default content for number is zero. */ explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_() { static const uint16_t defaultFlags[] = { kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag, kNumberAnyFlag }; RAPIDJSON_NOEXCEPT_ASSERT(type >= kNullType && type <= kNumberType); data_.f.flags = defaultFlags[type]; // Use ShortString to store empty string. if (type == kStringType) data_.ss.SetLength(0); } //! Explicit copy constructor (with allocator) /*! Creates a copy of a Value by using the given Allocator \tparam SourceAllocator allocator of \c rhs \param rhs Value to copy from (read-only) \param allocator Allocator for allocating copied elements and buffers. Commonly use GenericDocument::GetAllocator(). \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer) \see CopyFrom() */ template GenericValue(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings = false) { switch (rhs.GetType()) { case kObjectType: DoCopyMembers(rhs, allocator, copyConstStrings); break; case kArrayType: { SizeType count = rhs.data_.a.size; GenericValue* le = reinterpret_cast(allocator.Malloc(count * sizeof(GenericValue))); const GenericValue* re = rhs.GetElementsPointer(); for (SizeType i = 0; i < count; i++) new (&le[i]) GenericValue(re[i], allocator, copyConstStrings); data_.f.flags = kArrayFlag; data_.a.size = data_.a.capacity = count; SetElementsPointer(le); } break; case kStringType: if (rhs.data_.f.flags == kConstStringFlag && !copyConstStrings) { data_.f.flags = rhs.data_.f.flags; data_ = *reinterpret_cast(&rhs.data_); } else SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator); break; default: data_.f.flags = rhs.data_.f.flags; data_ = *reinterpret_cast(&rhs.data_); break; } } //! Constructor for boolean value. /*! \param b Boolean value \note This constructor is limited to \em real boolean values and rejects implicitly converted types like arbitrary pointers. Use an explicit cast to \c bool, if you want to construct a boolean JSON value in such cases. */ #ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen template explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame))) RAPIDJSON_NOEXCEPT // See #472 #else explicit GenericValue(bool b) RAPIDJSON_NOEXCEPT #endif : data_() { // safe-guard against failing SFINAE RAPIDJSON_STATIC_ASSERT((internal::IsSame::Value)); data_.f.flags = b ? kTrueFlag : kFalseFlag; } //! Constructor for int value. explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_() { data_.n.i64 = i; data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag; } //! Constructor for unsigned value. explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_() { data_.n.u64 = u; data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag); } //! Constructor for int64_t value. explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_() { data_.n.i64 = i64; data_.f.flags = kNumberInt64Flag; if (i64 >= 0) { data_.f.flags |= kNumberUint64Flag; if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) data_.f.flags |= kUintFlag; if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) data_.f.flags |= kIntFlag; } else if (i64 >= static_cast(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) data_.f.flags |= kIntFlag; } //! Constructor for uint64_t value. explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_() { data_.n.u64 = u64; data_.f.flags = kNumberUint64Flag; if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))) data_.f.flags |= kInt64Flag; if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) data_.f.flags |= kUintFlag; if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) data_.f.flags |= kIntFlag; } //! Constructor for double value. explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; } //! Constructor for float value. explicit GenericValue(float f) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = static_cast(f); data_.f.flags = kNumberDoubleFlag; } //! Constructor for constant string (i.e. do not make a copy of string) GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(StringRef(s, length)); } //! Constructor for constant string (i.e. do not make a copy of string) explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); } //! Constructor for copy-string (i.e. do make a copy of string) GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_() { SetStringRaw(StringRef(s, length), allocator); } //! Constructor for copy-string (i.e. do make a copy of string) GenericValue(const Ch*s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } #if RAPIDJSON_HAS_STDSTRING //! Constructor for copy-string from a string object (i.e. do make a copy of string) /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. */ GenericValue(const std::basic_string& s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } #endif //! Constructor for Array. /*! \param a An array obtained by \c GetArray(). \note \c Array is always pass-by-value. \note the source array is moved into this value and the sourec array becomes empty. */ GenericValue(Array a) RAPIDJSON_NOEXCEPT : data_(a.value_.data_) { a.value_.data_ = Data(); a.value_.data_.f.flags = kArrayFlag; } //! Constructor for Object. /*! \param o An object obtained by \c GetObject(). \note \c Object is always pass-by-value. \note the source object is moved into this value and the sourec object becomes empty. */ GenericValue(Object o) RAPIDJSON_NOEXCEPT : data_(o.value_.data_) { o.value_.data_ = Data(); o.value_.data_.f.flags = kObjectFlag; } //! Destructor. /*! Need to destruct elements of array, members of object, or copy-string. */ ~GenericValue() { // With RAPIDJSON_USE_MEMBERSMAP, the maps need to be destroyed to release // their Allocator if it's refcounted (e.g. MemoryPoolAllocator). if (Allocator::kNeedFree || (RAPIDJSON_USE_MEMBERSMAP+0 && internal::IsRefCounted::Value)) { switch(data_.f.flags) { case kArrayFlag: { GenericValue* e = GetElementsPointer(); for (GenericValue* v = e; v != e + data_.a.size; ++v) v->~GenericValue(); if (Allocator::kNeedFree) { // Shortcut by Allocator's trait Allocator::Free(e); } } break; case kObjectFlag: DoFreeMembers(); break; case kCopyStringFlag: if (Allocator::kNeedFree) { // Shortcut by Allocator's trait Allocator::Free(const_cast(GetStringPointer())); } break; default: break; // Do nothing for other types. } } } //@} //!@name Assignment operators //@{ //! Assignment with move semantics. /*! \param rhs Source of the assignment. It will become a null value after assignment. */ GenericValue& operator=(GenericValue& rhs) RAPIDJSON_NOEXCEPT { if (RAPIDJSON_LIKELY(this != &rhs)) { // Can't destroy "this" before assigning "rhs", otherwise "rhs" // could be used after free if it's an sub-Value of "this", // hence the temporary danse. GenericValue temp; temp.RawAssign(rhs); this->~GenericValue(); RawAssign(temp); } return *this; } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS //! Move assignment in C++11 GenericValue& operator=(GenericValue&& rhs) RAPIDJSON_NOEXCEPT { return *this = rhs.Move(); } #endif //! Assignment of constant string reference (no copy) /*! \param str Constant string reference to be assigned \note This overload is needed to avoid clashes with the generic primitive type assignment overload below. \see GenericStringRef, operator=(T) */ GenericValue& operator=(StringRefType str) RAPIDJSON_NOEXCEPT { GenericValue s(str); return *this = s; } //! Assignment with primitive types. /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t \param value The value to be assigned. \note The source type \c T explicitly disallows all pointer types, especially (\c const) \ref Ch*. This helps avoiding implicitly referencing character strings with insufficient lifetime, use \ref SetString(const Ch*, Allocator&) (for copying) or \ref StringRef() (to explicitly mark the pointer as constant) instead. All other pointer types would implicitly convert to \c bool, use \ref SetBool() instead. */ template RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer), (GenericValue&)) operator=(T value) { GenericValue v(value); return *this = v; } //! Deep-copy assignment from Value /*! Assigns a \b copy of the Value to the current Value object \tparam SourceAllocator Allocator type of \c rhs \param rhs Value to copy from (read-only) \param allocator Allocator to use for copying \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer) */ template GenericValue& CopyFrom(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings = false) { RAPIDJSON_ASSERT(static_cast(this) != static_cast(&rhs)); this->~GenericValue(); new (this) GenericValue(rhs, allocator, copyConstStrings); return *this; } //! Exchange the contents of this value with those of other. /*! \param other Another value. \note Constant complexity. */ GenericValue& Swap(GenericValue& other) RAPIDJSON_NOEXCEPT { GenericValue temp; temp.RawAssign(*this); RawAssign(other); other.RawAssign(temp); return *this; } //! free-standing swap function helper /*! Helper function to enable support for common swap implementation pattern based on \c std::swap: \code void swap(MyClass& a, MyClass& b) { using std::swap; swap(a.value, b.value); // ... } \endcode \see Swap() */ friend inline void swap(GenericValue& a, GenericValue& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } //! Prepare Value for move semantics /*! \return *this */ GenericValue& Move() RAPIDJSON_NOEXCEPT { return *this; } //@} //!@name Equal-to and not-equal-to operators //@{ //! Equal-to operator /*! \note If an object contains duplicated named member, comparing equality with any object is always \c false. \note Complexity is quadratic in Object's member number and linear for the rest (number of all values in the subtree and total lengths of all strings). */ template bool operator==(const GenericValue& rhs) const { typedef GenericValue RhsType; if (GetType() != rhs.GetType()) return false; switch (GetType()) { case kObjectType: // Warning: O(n^2) inner-loop if (data_.o.size != rhs.data_.o.size) return false; for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) { typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name); if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value) return false; } return true; case kArrayType: if (data_.a.size != rhs.data_.a.size) return false; for (SizeType i = 0; i < data_.a.size; i++) if ((*this)[i] != rhs[i]) return false; return true; case kStringType: return StringEqual(rhs); case kNumberType: if (IsDouble() || rhs.IsDouble()) { double a = GetDouble(); // May convert from integer to double. double b = rhs.GetDouble(); // Ditto return a >= b && a <= b; // Prevent -Wfloat-equal } else return data_.n.u64 == rhs.data_.n.u64; default: return true; } } //! Equal-to operator with const C-string pointer bool operator==(const Ch* rhs) const { return *this == GenericValue(StringRef(rhs)); } #if RAPIDJSON_HAS_STDSTRING //! Equal-to operator with string object /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. */ bool operator==(const std::basic_string& rhs) const { return *this == GenericValue(StringRef(rhs)); } #endif //! Equal-to operator with primitive types /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c true, \c false */ template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr,internal::IsGenericValue >), (bool)) operator==(const T& rhs) const { return *this == GenericValue(rhs); } #ifndef __cpp_impl_three_way_comparison //! Not-equal-to operator /*! \return !(*this == rhs) */ template bool operator!=(const GenericValue& rhs) const { return !(*this == rhs); } //! Not-equal-to operator with const C-string pointer bool operator!=(const Ch* rhs) const { return !(*this == rhs); } //! Not-equal-to operator with arbitrary types /*! \return !(*this == rhs) */ template RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& rhs) const { return !(*this == rhs); } //! Equal-to operator with arbitrary types (symmetric version) /*! \return (rhs == lhs) */ template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator==(const T& lhs, const GenericValue& rhs) { return rhs == lhs; } //! Not-Equal-to operator with arbitrary types (symmetric version) /*! \return !(rhs == lhs) */ template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& lhs, const GenericValue& rhs) { return !(rhs == lhs); } //@} #endif //!@name Type //@{ Type GetType() const { return static_cast(data_.f.flags & kTypeMask); } bool IsNull() const { return data_.f.flags == kNullFlag; } bool IsFalse() const { return data_.f.flags == kFalseFlag; } bool IsTrue() const { return data_.f.flags == kTrueFlag; } bool IsBool() const { return (data_.f.flags & kBoolFlag) != 0; } bool IsObject() const { return data_.f.flags == kObjectFlag; } bool IsArray() const { return data_.f.flags == kArrayFlag; } bool IsNumber() const { return (data_.f.flags & kNumberFlag) != 0; } bool IsInt() const { return (data_.f.flags & kIntFlag) != 0; } bool IsUint() const { return (data_.f.flags & kUintFlag) != 0; } bool IsInt64() const { return (data_.f.flags & kInt64Flag) != 0; } bool IsUint64() const { return (data_.f.flags & kUint64Flag) != 0; } bool IsDouble() const { return (data_.f.flags & kDoubleFlag) != 0; } bool IsString() const { return (data_.f.flags & kStringFlag) != 0; } // Checks whether a number can be losslessly converted to a double. bool IsLosslessDouble() const { if (!IsNumber()) return false; if (IsUint64()) { uint64_t u = GetUint64(); volatile double d = static_cast(u); return (d >= 0.0) && (d < static_cast((std::numeric_limits::max)())) && (u == static_cast(d)); } if (IsInt64()) { int64_t i = GetInt64(); volatile double d = static_cast(i); return (d >= static_cast((std::numeric_limits::min)())) && (d < static_cast((std::numeric_limits::max)())) && (i == static_cast(d)); } return true; // double, int, uint are always lossless } // Checks whether a number is a float (possible lossy). bool IsFloat() const { if ((data_.f.flags & kDoubleFlag) == 0) return false; double d = GetDouble(); return d >= -3.4028234e38 && d <= 3.4028234e38; } // Checks whether a number can be losslessly converted to a float. bool IsLosslessFloat() const { if (!IsNumber()) return false; double a = GetDouble(); if (a < static_cast(-(std::numeric_limits::max)()) || a > static_cast((std::numeric_limits::max)())) return false; double b = static_cast(static_cast(a)); return a >= b && a <= b; // Prevent -Wfloat-equal } //@} //!@name Null //@{ GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; } //@} //!@name Bool //@{ bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return data_.f.flags == kTrueFlag; } //!< Set boolean value /*! \post IsBool() == true */ GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; } //@} //!@name Object //@{ //! Set this value as an empty object. /*! \post IsObject() == true */ GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; } //! Get the number of members in the object. SizeType MemberCount() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size; } //! Get the capacity of object. SizeType MemberCapacity() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.capacity; } //! Check whether the object is empty. bool ObjectEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; } //! Get a value from an object associated with the name. /*! \pre IsObject() == true \tparam T Either \c Ch or \c const \c Ch (template used for disambiguation with \ref operator[](SizeType)) \note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7. Since 0.2, if the name is not correct, it will assert. If user is unsure whether a member exists, user should use HasMember() first. A better approach is to use FindMember(). \note Linear time complexity. */ template RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(GenericValue&)) operator[](T* name) { GenericValue n(StringRef(name)); return (*this)[n]; } template RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(const GenericValue&)) operator[](T* name) const { return const_cast(*this)[name]; } //! Get a value from an object associated with the name. /*! \pre IsObject() == true \tparam SourceAllocator Allocator of the \c name value \note Compared to \ref operator[](T*), this version is faster because it does not need a StrLen(). And it can also handle strings with embedded null characters. \note Linear time complexity. */ template GenericValue& operator[](const GenericValue& name) { MemberIterator member = FindMember(name); if (member != MemberEnd()) return member->value; else { RAPIDJSON_ASSERT(false); // see above note #if RAPIDJSON_HAS_CXX11 // Use thread-local storage to prevent races between threads. // Use static buffer and placement-new to prevent destruction, with // alignas() to ensure proper alignment. alignas(GenericValue) thread_local static char buffer[sizeof(GenericValue)]; return *new (buffer) GenericValue(); #elif defined(_MSC_VER) && _MSC_VER < 1900 // There's no way to solve both thread locality and proper alignment // simultaneously. __declspec(thread) static char buffer[sizeof(GenericValue)]; return *new (buffer) GenericValue(); #elif defined(__GNUC__) || defined(__clang__) // This will generate -Wexit-time-destructors in clang, but that's // better than having under-alignment. __thread static GenericValue buffer; return buffer; #else // Don't know what compiler this is, so don't know how to ensure // thread-locality. static GenericValue buffer; return buffer; #endif } } template const GenericValue& operator[](const GenericValue& name) const { return const_cast(*this)[name]; } #if RAPIDJSON_HAS_STDSTRING //! Get a value from an object associated with name (string object). GenericValue& operator[](const std::basic_string& name) { return (*this)[GenericValue(StringRef(name))]; } const GenericValue& operator[](const std::basic_string& name) const { return (*this)[GenericValue(StringRef(name))]; } #endif //! Const member iterator /*! \pre IsObject() == true */ ConstMemberIterator MemberBegin() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer()); } //! Const \em past-the-end member iterator /*! \pre IsObject() == true */ ConstMemberIterator MemberEnd() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer() + data_.o.size); } //! Member iterator /*! \pre IsObject() == true */ MemberIterator MemberBegin() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer()); } //! \em Past-the-end member iterator /*! \pre IsObject() == true */ MemberIterator MemberEnd() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer() + data_.o.size); } //! Request the object to have enough capacity to store members. /*! \param newCapacity The capacity that the object at least need to have. \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). \return The value itself for fluent API. \note Linear time complexity. */ GenericValue& MemberReserve(SizeType newCapacity, Allocator &allocator) { RAPIDJSON_ASSERT(IsObject()); DoReserveMembers(newCapacity, allocator); return *this; } //! Check whether a member exists in the object. /*! \param name Member name to be searched. \pre IsObject() == true \return Whether a member with that name exists. \note It is better to use FindMember() directly if you need the obtain the value as well. \note Linear time complexity. */ bool HasMember(const Ch* name) const { return FindMember(name) != MemberEnd(); } #if RAPIDJSON_HAS_STDSTRING //! Check whether a member exists in the object with string object. /*! \param name Member name to be searched. \pre IsObject() == true \return Whether a member with that name exists. \note It is better to use FindMember() directly if you need the obtain the value as well. \note Linear time complexity. */ bool HasMember(const std::basic_string& name) const { return FindMember(name) != MemberEnd(); } #endif //! Check whether a member exists in the object with GenericValue name. /*! This version is faster because it does not need a StrLen(). It can also handle string with null character. \param name Member name to be searched. \pre IsObject() == true \return Whether a member with that name exists. \note It is better to use FindMember() directly if you need the obtain the value as well. \note Linear time complexity. */ template bool HasMember(const GenericValue& name) const { return FindMember(name) != MemberEnd(); } //! Find member by name. /*! \param name Member name to be searched. \pre IsObject() == true \return Iterator to member, if it exists. Otherwise returns \ref MemberEnd(). \note Earlier versions of Rapidjson returned a \c NULL pointer, in case the requested member doesn't exist. For consistency with e.g. \c std::map, this has been changed to MemberEnd() now. \note Linear time complexity. */ MemberIterator FindMember(const Ch* name) { GenericValue n(StringRef(name)); return FindMember(n); } ConstMemberIterator FindMember(const Ch* name) const { return const_cast(*this).FindMember(name); } //! Find member by name. /*! This version is faster because it does not need a StrLen(). It can also handle string with null character. \param name Member name to be searched. \pre IsObject() == true \return Iterator to member, if it exists. Otherwise returns \ref MemberEnd(). \note Earlier versions of Rapidjson returned a \c NULL pointer, in case the requested member doesn't exist. For consistency with e.g. \c std::map, this has been changed to MemberEnd() now. \note Linear time complexity. */ template MemberIterator FindMember(const GenericValue& name) { RAPIDJSON_ASSERT(IsObject()); RAPIDJSON_ASSERT(name.IsString()); return DoFindMember(name); } template ConstMemberIterator FindMember(const GenericValue& name) const { return const_cast(*this).FindMember(name); } #if RAPIDJSON_HAS_STDSTRING //! Find member by string object name. /*! \param name Member name to be searched. \pre IsObject() == true \return Iterator to member, if it exists. Otherwise returns \ref MemberEnd(). */ MemberIterator FindMember(const std::basic_string& name) { return FindMember(GenericValue(StringRef(name))); } ConstMemberIterator FindMember(const std::basic_string& name) const { return FindMember(GenericValue(StringRef(name))); } #endif //! Add a member (name-value pair) to the object. /*! \param name A string value as name of member. \param value Value of any type. \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). \return The value itself for fluent API. \note The ownership of \c name and \c value will be transferred to this object on success. \pre IsObject() && name.IsString() \post name.IsNull() && value.IsNull() \note Amortized Constant time complexity. */ GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { RAPIDJSON_ASSERT(IsObject()); RAPIDJSON_ASSERT(name.IsString()); DoAddMember(name, value, allocator); return *this; } //! Add a constant string value as member (name-value pair) to the object. /*! \param name A string value as name of member. \param value constant string reference as value of member. \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). \return The value itself for fluent API. \pre IsObject() \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. \note Amortized Constant time complexity. */ GenericValue& AddMember(GenericValue& name, StringRefType value, Allocator& allocator) { GenericValue v(value); return AddMember(name, v, allocator); } #if RAPIDJSON_HAS_STDSTRING //! Add a string object as member (name-value pair) to the object. /*! \param name A string value as name of member. \param value constant string reference as value of member. \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). \return The value itself for fluent API. \pre IsObject() \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. \note Amortized Constant time complexity. */ GenericValue& AddMember(GenericValue& name, std::basic_string& value, Allocator& allocator) { GenericValue v(value, allocator); return AddMember(name, v, allocator); } #endif //! Add any primitive value as member (name-value pair) to the object. /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t \param name A string value as name of member. \param value Value of primitive type \c T as value of member \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). \return The value itself for fluent API. \pre IsObject() \note The source type \c T explicitly disallows all pointer types, especially (\c const) \ref Ch*. This helps avoiding implicitly referencing character strings with insufficient lifetime, use \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref AddMember(StringRefType, StringRefType, Allocator&). All other pointer types would implicitly convert to \c bool, use an explicit cast instead, if needed. \note Amortized Constant time complexity. */ template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) AddMember(GenericValue& name, T value, Allocator& allocator) { GenericValue v(value); return AddMember(name, v, allocator); } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS GenericValue& AddMember(GenericValue&& name, GenericValue&& value, Allocator& allocator) { return AddMember(name, value, allocator); } GenericValue& AddMember(GenericValue&& name, GenericValue& value, Allocator& allocator) { return AddMember(name, value, allocator); } GenericValue& AddMember(GenericValue& name, GenericValue&& value, Allocator& allocator) { return AddMember(name, value, allocator); } GenericValue& AddMember(StringRefType name, GenericValue&& value, Allocator& allocator) { GenericValue n(name); return AddMember(n, value, allocator); } #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS //! Add a member (name-value pair) to the object. /*! \param name A constant string reference as name of member. \param value Value of any type. \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). \return The value itself for fluent API. \note The ownership of \c value will be transferred to this object on success. \pre IsObject() \post value.IsNull() \note Amortized Constant time complexity. */ GenericValue& AddMember(StringRefType name, GenericValue& value, Allocator& allocator) { GenericValue n(name); return AddMember(n, value, allocator); } //! Add a constant string value as member (name-value pair) to the object. /*! \param name A constant string reference as name of member. \param value constant string reference as value of member. \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). \return The value itself for fluent API. \pre IsObject() \note This overload is needed to avoid clashes with the generic primitive type AddMember(StringRefType,T,Allocator&) overload below. \note Amortized Constant time complexity. */ GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) { GenericValue v(value); return AddMember(name, v, allocator); } //! Add any primitive value as member (name-value pair) to the object. /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t \param name A constant string reference as name of member. \param value Value of primitive type \c T as value of member \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). \return The value itself for fluent API. \pre IsObject() \note The source type \c T explicitly disallows all pointer types, especially (\c const) \ref Ch*. This helps avoiding implicitly referencing character strings with insufficient lifetime, use \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref AddMember(StringRefType, StringRefType, Allocator&). All other pointer types would implicitly convert to \c bool, use an explicit cast instead, if needed. \note Amortized Constant time complexity. */ template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) AddMember(StringRefType name, T value, Allocator& allocator) { GenericValue n(name); return AddMember(n, value, allocator); } //! Remove all members in the object. /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged. \note Linear time complexity. */ void RemoveAllMembers() { RAPIDJSON_ASSERT(IsObject()); DoClearMembers(); } //! Remove a member in object by its name. /*! \param name Name of member to be removed. \return Whether the member existed. \note This function may reorder the object members. Use \ref EraseMember(ConstMemberIterator) if you need to preserve the relative order of the remaining members. \note Linear time complexity. */ bool RemoveMember(const Ch* name) { GenericValue n(StringRef(name)); return RemoveMember(n); } #if RAPIDJSON_HAS_STDSTRING bool RemoveMember(const std::basic_string& name) { return RemoveMember(GenericValue(StringRef(name))); } #endif template bool RemoveMember(const GenericValue& name) { MemberIterator m = FindMember(name); if (m != MemberEnd()) { RemoveMember(m); return true; } else return false; } //! Remove a member in object by iterator. /*! \param m member iterator (obtained by FindMember() or MemberBegin()). \return the new iterator after removal. \note This function may reorder the object members. Use \ref EraseMember(ConstMemberIterator) if you need to preserve the relative order of the remaining members. \note Constant time complexity. */ MemberIterator RemoveMember(MemberIterator m) { RAPIDJSON_ASSERT(IsObject()); RAPIDJSON_ASSERT(data_.o.size > 0); RAPIDJSON_ASSERT(GetMembersPointer() != 0); RAPIDJSON_ASSERT(m >= MemberBegin() && m < MemberEnd()); return DoRemoveMember(m); } //! Remove a member from an object by iterator. /*! \param pos iterator to the member to remove \pre IsObject() == true && \ref MemberBegin() <= \c pos < \ref MemberEnd() \return Iterator following the removed element. If the iterator \c pos refers to the last element, the \ref MemberEnd() iterator is returned. \note This function preserves the relative order of the remaining object members. If you do not need this, use the more efficient \ref RemoveMember(MemberIterator). \note Linear time complexity. */ MemberIterator EraseMember(ConstMemberIterator pos) { return EraseMember(pos, pos +1); } //! Remove members in the range [first, last) from an object. /*! \param first iterator to the first member to remove \param last iterator following the last member to remove \pre IsObject() == true && \ref MemberBegin() <= \c first <= \c last <= \ref MemberEnd() \return Iterator following the last removed element. \note This function preserves the relative order of the remaining object members. \note Linear time complexity. */ MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) { RAPIDJSON_ASSERT(IsObject()); RAPIDJSON_ASSERT(data_.o.size > 0); RAPIDJSON_ASSERT(GetMembersPointer() != 0); RAPIDJSON_ASSERT(first >= MemberBegin()); RAPIDJSON_ASSERT(first <= last); RAPIDJSON_ASSERT(last <= MemberEnd()); return DoEraseMembers(first, last); } //! Erase a member in object by its name. /*! \param name Name of member to be removed. \return Whether the member existed. \note Linear time complexity. */ bool EraseMember(const Ch* name) { GenericValue n(StringRef(name)); return EraseMember(n); } #if RAPIDJSON_HAS_STDSTRING bool EraseMember(const std::basic_string& name) { return EraseMember(GenericValue(StringRef(name))); } #endif template bool EraseMember(const GenericValue& name) { MemberIterator m = FindMember(name); if (m != MemberEnd()) { EraseMember(m); return true; } else return false; } Object GetObject() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); } Object GetObj() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); } ConstObject GetObject() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } ConstObject GetObj() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } //@} //!@name Array //@{ //! Set this value as an empty array. /*! \post IsArray == true */ GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; } //! Get the number of elements in array. SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; } //! Get the capacity of array. SizeType Capacity() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; } //! Check whether the array is empty. bool Empty() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; } //! Remove all elements in the array. /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged. \note Linear time complexity. */ void Clear() { RAPIDJSON_ASSERT(IsArray()); GenericValue* e = GetElementsPointer(); for (GenericValue* v = e; v != e + data_.a.size; ++v) v->~GenericValue(); data_.a.size = 0; } //! Get an element from array by index. /*! \pre IsArray() == true \param index Zero-based index of element. \see operator[](T*) */ GenericValue& operator[](SizeType index) { RAPIDJSON_ASSERT(IsArray()); RAPIDJSON_ASSERT(index < data_.a.size); return GetElementsPointer()[index]; } const GenericValue& operator[](SizeType index) const { return const_cast(*this)[index]; } //! Element iterator /*! \pre IsArray() == true */ ValueIterator Begin() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer(); } //! \em Past-the-end element iterator /*! \pre IsArray() == true */ ValueIterator End() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer() + data_.a.size; } //! Constant element iterator /*! \pre IsArray() == true */ ConstValueIterator Begin() const { return const_cast(*this).Begin(); } //! Constant \em past-the-end element iterator /*! \pre IsArray() == true */ ConstValueIterator End() const { return const_cast(*this).End(); } //! Request the array to have enough capacity to store elements. /*! \param newCapacity The capacity that the array at least need to have. \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). \return The value itself for fluent API. \note Linear time complexity. */ GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) { RAPIDJSON_ASSERT(IsArray()); if (newCapacity > data_.a.capacity) { SetElementsPointer(reinterpret_cast(allocator.Realloc(GetElementsPointer(), data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue)))); data_.a.capacity = newCapacity; } return *this; } //! Append a GenericValue at the end of the array. /*! \param value Value to be appended. \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). \pre IsArray() == true \post value.IsNull() == true \return The value itself for fluent API. \note The ownership of \c value will be transferred to this array on success. \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. \note Amortized constant time complexity. */ GenericValue& PushBack(GenericValue& value, Allocator& allocator) { RAPIDJSON_ASSERT(IsArray()); if (data_.a.size >= data_.a.capacity) Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator); GetElementsPointer()[data_.a.size++].RawAssign(value); return *this; } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS GenericValue& PushBack(GenericValue&& value, Allocator& allocator) { return PushBack(value, allocator); } #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS //! Append a constant string reference at the end of the array. /*! \param value Constant string reference to be appended. \param allocator Allocator for reallocating memory. It must be the same one used previously. Commonly use GenericDocument::GetAllocator(). \pre IsArray() == true \return The value itself for fluent API. \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. \note Amortized constant time complexity. \see GenericStringRef */ GenericValue& PushBack(StringRefType value, Allocator& allocator) { return (*this).template PushBack(value, allocator); } //! Append a primitive value at the end of the array. /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t \param value Value of primitive type T to be appended. \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). \pre IsArray() == true \return The value itself for fluent API. \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. \note The source type \c T explicitly disallows all pointer types, especially (\c const) \ref Ch*. This helps avoiding implicitly referencing character strings with insufficient lifetime, use \ref PushBack(GenericValue&, Allocator&) or \ref PushBack(StringRefType, Allocator&). All other pointer types would implicitly convert to \c bool, use an explicit cast instead, if needed. \note Amortized constant time complexity. */ template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) PushBack(T value, Allocator& allocator) { GenericValue v(value); return PushBack(v, allocator); } //! Remove the last element in the array. /*! \note Constant time complexity. */ GenericValue& PopBack() { RAPIDJSON_ASSERT(IsArray()); RAPIDJSON_ASSERT(!Empty()); GetElementsPointer()[--data_.a.size].~GenericValue(); return *this; } //! Remove an element of array by iterator. /*! \param pos iterator to the element to remove \pre IsArray() == true && \ref Begin() <= \c pos < \ref End() \return Iterator following the removed element. If the iterator pos refers to the last element, the End() iterator is returned. \note Linear time complexity. */ ValueIterator Erase(ConstValueIterator pos) { return Erase(pos, pos + 1); } //! Remove elements in the range [first, last) of the array. /*! \param first iterator to the first element to remove \param last iterator following the last element to remove \pre IsArray() == true && \ref Begin() <= \c first <= \c last <= \ref End() \return Iterator following the last removed element. \note Linear time complexity. */ ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) { RAPIDJSON_ASSERT(IsArray()); RAPIDJSON_ASSERT(data_.a.size > 0); RAPIDJSON_ASSERT(GetElementsPointer() != 0); RAPIDJSON_ASSERT(first >= Begin()); RAPIDJSON_ASSERT(first <= last); RAPIDJSON_ASSERT(last <= End()); ValueIterator pos = Begin() + (first - Begin()); for (ValueIterator itr = pos; itr != last; ++itr) itr->~GenericValue(); std::memmove(static_cast(pos), last, static_cast(End() - last) * sizeof(GenericValue)); data_.a.size -= static_cast(last - first); return pos; } Array GetArray() { RAPIDJSON_ASSERT(IsArray()); return Array(*this); } ConstArray GetArray() const { RAPIDJSON_ASSERT(IsArray()); return ConstArray(*this); } //@} //!@name Number //@{ int GetInt() const { RAPIDJSON_ASSERT(data_.f.flags & kIntFlag); return data_.n.i.i; } unsigned GetUint() const { RAPIDJSON_ASSERT(data_.f.flags & kUintFlag); return data_.n.u.u; } int64_t GetInt64() const { RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag); return data_.n.i64; } uint64_t GetUint64() const { RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag); return data_.n.u64; } //! Get the value as double type. /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessDouble() to check whether the converison is lossless. */ double GetDouble() const { RAPIDJSON_ASSERT(IsNumber()); if ((data_.f.flags & kDoubleFlag) != 0) return data_.n.d; // exact type, no conversion. if ((data_.f.flags & kIntFlag) != 0) return data_.n.i.i; // int -> double if ((data_.f.flags & kUintFlag) != 0) return data_.n.u.u; // unsigned -> double if ((data_.f.flags & kInt64Flag) != 0) return static_cast(data_.n.i64); // int64_t -> double (may lose precision) RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0); return static_cast(data_.n.u64); // uint64_t -> double (may lose precision) } //! Get the value as float type. /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessFloat() to check whether the converison is lossless. */ float GetFloat() const { return static_cast(GetDouble()); } GenericValue& SetInt(int i) { this->~GenericValue(); new (this) GenericValue(i); return *this; } GenericValue& SetUint(unsigned u) { this->~GenericValue(); new (this) GenericValue(u); return *this; } GenericValue& SetInt64(int64_t i64) { this->~GenericValue(); new (this) GenericValue(i64); return *this; } GenericValue& SetUint64(uint64_t u64) { this->~GenericValue(); new (this) GenericValue(u64); return *this; } GenericValue& SetDouble(double d) { this->~GenericValue(); new (this) GenericValue(d); return *this; } GenericValue& SetFloat(float f) { this->~GenericValue(); new (this) GenericValue(static_cast(f)); return *this; } //@} //!@name String //@{ const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return DataString(data_); } //! Get the length of string. /*! Since rapidjson permits "\\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength(). */ SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return DataStringLength(data_); } //! Set this value as a string without copying source string. /*! This version has better performance with supplied length, and also support string containing null character. \param s source string pointer. \param length The length of source string, excluding the trailing null terminator. \return The value itself for fluent API. \post IsString() == true && GetString() == s && GetStringLength() == length \see SetString(StringRefType) */ GenericValue& SetString(const Ch* s, SizeType length) { return SetString(StringRef(s, length)); } //! Set this value as a string without copying source string. /*! \param s source string reference \return The value itself for fluent API. \post IsString() == true && GetString() == s && GetStringLength() == s.length */ GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s); return *this; } //! Set this value as a string by copying from source string. /*! This version has better performance with supplied length, and also support string containing null character. \param s source string. \param length The length of source string, excluding the trailing null terminator. \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). \return The value itself for fluent API. \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length */ GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { return SetString(StringRef(s, length), allocator); } //! Set this value as a string by copying from source string. /*! \param s source string. \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). \return The value itself for fluent API. \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length */ GenericValue& SetString(const Ch* s, Allocator& allocator) { return SetString(StringRef(s), allocator); } //! Set this value as a string by copying from source string. /*! \param s source string reference \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). \return The value itself for fluent API. \post IsString() == true && GetString() != s.s && strcmp(GetString(),s) == 0 && GetStringLength() == length */ GenericValue& SetString(StringRefType s, Allocator& allocator) { this->~GenericValue(); SetStringRaw(s, allocator); return *this; } #if RAPIDJSON_HAS_STDSTRING //! Set this value as a string by copying from source string. /*! \param s source string. \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). \return The value itself for fluent API. \post IsString() == true && GetString() != s.data() && strcmp(GetString(),s.data() == 0 && GetStringLength() == s.size() \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. */ GenericValue& SetString(const std::basic_string& s, Allocator& allocator) { return SetString(StringRef(s), allocator); } #endif //@} //!@name Array //@{ //! Templated version for checking whether this value is type T. /*! \tparam T Either \c bool, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c float, \c const \c char*, \c std::basic_string */ template bool Is() const { return internal::TypeHelper::Is(*this); } template T Get() const { return internal::TypeHelper::Get(*this); } template T Get() { return internal::TypeHelper::Get(*this); } template ValueType& Set(const T& data) { return internal::TypeHelper::Set(*this, data); } template ValueType& Set(const T& data, AllocatorType& allocator) { return internal::TypeHelper::Set(*this, data, allocator); } //@} //! Generate events of this value to a Handler. /*! This function adopts the GoF visitor pattern. Typical usage is to output this JSON value as JSON text via Writer, which is a Handler. It can also be used to deep clone this value via GenericDocument, which is also a Handler. \tparam Handler type of handler. \param handler An object implementing concept Handler. */ template bool Accept(Handler& handler) const { switch(GetType()) { case kNullType: return handler.Null(); case kFalseType: return handler.Bool(false); case kTrueType: return handler.Bool(true); case kObjectType: if (RAPIDJSON_UNLIKELY(!handler.StartObject())) return false; for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) { RAPIDJSON_ASSERT(m->name.IsString()); // User may change the type of name by MemberIterator. if (RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0))) return false; if (RAPIDJSON_UNLIKELY(!m->value.Accept(handler))) return false; } return handler.EndObject(data_.o.size); case kArrayType: if (RAPIDJSON_UNLIKELY(!handler.StartArray())) return false; for (ConstValueIterator v = Begin(); v != End(); ++v) if (RAPIDJSON_UNLIKELY(!v->Accept(handler))) return false; return handler.EndArray(data_.a.size); case kStringType: return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0); default: RAPIDJSON_ASSERT(GetType() == kNumberType); if (IsDouble()) return handler.Double(data_.n.d); else if (IsInt()) return handler.Int(data_.n.i.i); else if (IsUint()) return handler.Uint(data_.n.u.u); else if (IsInt64()) return handler.Int64(data_.n.i64); else return handler.Uint64(data_.n.u64); } } private: template friend class GenericValue; template friend class GenericDocument; enum { kBoolFlag = 0x0008, kNumberFlag = 0x0010, kIntFlag = 0x0020, kUintFlag = 0x0040, kInt64Flag = 0x0080, kUint64Flag = 0x0100, kDoubleFlag = 0x0200, kStringFlag = 0x0400, kCopyFlag = 0x0800, kInlineStrFlag = 0x1000, // Initial flags of different types. kNullFlag = kNullType, // These casts are added to suppress the warning on MSVC about bitwise operations between enums of different types. kTrueFlag = static_cast(kTrueType) | static_cast(kBoolFlag), kFalseFlag = static_cast(kFalseType) | static_cast(kBoolFlag), kNumberIntFlag = static_cast(kNumberType) | static_cast(kNumberFlag | kIntFlag | kInt64Flag), kNumberUintFlag = static_cast(kNumberType) | static_cast(kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag), kNumberInt64Flag = static_cast(kNumberType) | static_cast(kNumberFlag | kInt64Flag), kNumberUint64Flag = static_cast(kNumberType) | static_cast(kNumberFlag | kUint64Flag), kNumberDoubleFlag = static_cast(kNumberType) | static_cast(kNumberFlag | kDoubleFlag), kNumberAnyFlag = static_cast(kNumberType) | static_cast(kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag), kConstStringFlag = static_cast(kStringType) | static_cast(kStringFlag), kCopyStringFlag = static_cast(kStringType) | static_cast(kStringFlag | kCopyFlag), kShortStringFlag = static_cast(kStringType) | static_cast(kStringFlag | kCopyFlag | kInlineStrFlag), kObjectFlag = kObjectType, kArrayFlag = kArrayType, kTypeMask = 0x07 }; static const SizeType kDefaultArrayCapacity = RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY; static const SizeType kDefaultObjectCapacity = RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY; struct Flag { #if RAPIDJSON_48BITPOINTER_OPTIMIZATION char payload[sizeof(SizeType) * 2 + 6]; // 2 x SizeType + lower 48-bit pointer #elif RAPIDJSON_64BIT char payload[sizeof(SizeType) * 2 + sizeof(void*) + 6]; // 6 padding bytes #else char payload[sizeof(SizeType) * 2 + sizeof(void*) + 2]; // 2 padding bytes #endif uint16_t flags; }; struct String { SizeType length; SizeType hashcode; //!< reserved const Ch* str; }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode // implementation detail: ShortString can represent zero-terminated strings up to MaxSize chars // (excluding the terminating zero) and store a value to determine the length of the contained // string in the last character str[LenPos] by storing "MaxSize - length" there. If the string // to store has the maximal length of MaxSize then str[LenPos] will be 0 and therefore act as // the string terminator as well. For getting the string length back from that value just use // "MaxSize - str[LenPos]". // This allows to store 13-chars strings in 32-bit mode, 21-chars strings in 64-bit mode, // 13-chars strings for RAPIDJSON_48BITPOINTER_OPTIMIZATION=1 inline (for `UTF8`-encoded strings). struct ShortString { enum { MaxChars = sizeof(static_cast(0)->payload) / sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize }; Ch str[MaxChars]; inline static bool Usable(SizeType len) { return (MaxSize >= len); } inline void SetLength(SizeType len) { str[LenPos] = static_cast(MaxSize - len); } inline SizeType GetLength() const { return static_cast(MaxSize - str[LenPos]); } }; // at most as many bytes as "String" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode // By using proper binary layout, retrieval of different integer types do not need conversions. union Number { #if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN struct I { int i; char padding[4]; }i; struct U { unsigned u; char padding2[4]; }u; #else struct I { char padding[4]; int i; }i; struct U { char padding2[4]; unsigned u; }u; #endif int64_t i64; uint64_t u64; double d; }; // 8 bytes struct ObjectData { SizeType size; SizeType capacity; Member* members; }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode struct ArrayData { SizeType size; SizeType capacity; GenericValue* elements; }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode union Data { String s; ShortString ss; Number n; ObjectData o; ArrayData a; Flag f; }; // 16 bytes in 32-bit mode, 24 bytes in 64-bit mode, 16 bytes in 64-bit with RAPIDJSON_48BITPOINTER_OPTIMIZATION static RAPIDJSON_FORCEINLINE const Ch* DataString(const Data& data) { return (data.f.flags & kInlineStrFlag) ? data.ss.str : RAPIDJSON_GETPOINTER(Ch, data.s.str); } static RAPIDJSON_FORCEINLINE SizeType DataStringLength(const Data& data) { return (data.f.flags & kInlineStrFlag) ? data.ss.GetLength() : data.s.length; } RAPIDJSON_FORCEINLINE const Ch* GetStringPointer() const { return RAPIDJSON_GETPOINTER(Ch, data_.s.str); } RAPIDJSON_FORCEINLINE const Ch* SetStringPointer(const Ch* str) { return RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); } RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer() const { return RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); } RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) { return RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); } RAPIDJSON_FORCEINLINE Member* GetMembersPointer() const { return RAPIDJSON_GETPOINTER(Member, data_.o.members); } RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) { return RAPIDJSON_SETPOINTER(Member, data_.o.members, members); } #if RAPIDJSON_USE_MEMBERSMAP struct MapTraits { struct Less { bool operator()(const Data& s1, const Data& s2) const { SizeType n1 = DataStringLength(s1), n2 = DataStringLength(s2); int cmp = std::memcmp(DataString(s1), DataString(s2), sizeof(Ch) * (n1 < n2 ? n1 : n2)); return cmp < 0 || (cmp == 0 && n1 < n2); } }; typedef std::pair Pair; typedef std::multimap > Map; typedef typename Map::iterator Iterator; }; typedef typename MapTraits::Map Map; typedef typename MapTraits::Less MapLess; typedef typename MapTraits::Pair MapPair; typedef typename MapTraits::Iterator MapIterator; // // Layout of the members' map/array, re(al)located according to the needed capacity: // // {Map*}<>{capacity}<>{Member[capacity]}<>{MapIterator[capacity]} // // (where <> stands for the RAPIDJSON_ALIGN-ment, if needed) // static RAPIDJSON_FORCEINLINE size_t GetMapLayoutSize(SizeType capacity) { return RAPIDJSON_ALIGN(sizeof(Map*)) + RAPIDJSON_ALIGN(sizeof(SizeType)) + RAPIDJSON_ALIGN(capacity * sizeof(Member)) + capacity * sizeof(MapIterator); } static RAPIDJSON_FORCEINLINE SizeType &GetMapCapacity(Map* &map) { return *reinterpret_cast(reinterpret_cast(&map) + RAPIDJSON_ALIGN(sizeof(Map*))); } static RAPIDJSON_FORCEINLINE Member* GetMapMembers(Map* &map) { return reinterpret_cast(reinterpret_cast(&map) + RAPIDJSON_ALIGN(sizeof(Map*)) + RAPIDJSON_ALIGN(sizeof(SizeType))); } static RAPIDJSON_FORCEINLINE MapIterator* GetMapIterators(Map* &map) { return reinterpret_cast(reinterpret_cast(&map) + RAPIDJSON_ALIGN(sizeof(Map*)) + RAPIDJSON_ALIGN(sizeof(SizeType)) + RAPIDJSON_ALIGN(GetMapCapacity(map) * sizeof(Member))); } static RAPIDJSON_FORCEINLINE Map* &GetMap(Member* members) { RAPIDJSON_ASSERT(members != 0); return *reinterpret_cast(reinterpret_cast(members) - RAPIDJSON_ALIGN(sizeof(SizeType)) - RAPIDJSON_ALIGN(sizeof(Map*))); } // Some compilers' debug mechanisms want all iterators to be destroyed, for their accounting.. RAPIDJSON_FORCEINLINE MapIterator DropMapIterator(MapIterator& rhs) { #if RAPIDJSON_HAS_CXX11 MapIterator ret = std::move(rhs); #else MapIterator ret = rhs; #endif rhs.~MapIterator(); return ret; } Map* &DoReallocMap(Map** oldMap, SizeType newCapacity, Allocator& allocator) { Map **newMap = static_cast(allocator.Malloc(GetMapLayoutSize(newCapacity))); GetMapCapacity(*newMap) = newCapacity; if (!oldMap) { *newMap = new (allocator.Malloc(sizeof(Map))) Map(MapLess(), allocator); } else { *newMap = *oldMap; size_t count = (*oldMap)->size(); std::memcpy(static_cast(GetMapMembers(*newMap)), static_cast(GetMapMembers(*oldMap)), count * sizeof(Member)); MapIterator *oldIt = GetMapIterators(*oldMap), *newIt = GetMapIterators(*newMap); while (count--) { new (&newIt[count]) MapIterator(DropMapIterator(oldIt[count])); } Allocator::Free(oldMap); } return *newMap; } RAPIDJSON_FORCEINLINE Member* DoAllocMembers(SizeType capacity, Allocator& allocator) { return GetMapMembers(DoReallocMap(0, capacity, allocator)); } void DoReserveMembers(SizeType newCapacity, Allocator& allocator) { ObjectData& o = data_.o; if (newCapacity > o.capacity) { Member* oldMembers = GetMembersPointer(); Map **oldMap = oldMembers ? &GetMap(oldMembers) : 0, *&newMap = DoReallocMap(oldMap, newCapacity, allocator); RAPIDJSON_SETPOINTER(Member, o.members, GetMapMembers(newMap)); o.capacity = newCapacity; } } template MemberIterator DoFindMember(const GenericValue& name) { if (Member* members = GetMembersPointer()) { Map* &map = GetMap(members); MapIterator mit = map->find(reinterpret_cast(name.data_)); if (mit != map->end()) { return MemberIterator(&members[mit->second]); } } return MemberEnd(); } void DoClearMembers() { if (Member* members = GetMembersPointer()) { Map* &map = GetMap(members); MapIterator* mit = GetMapIterators(map); for (SizeType i = 0; i < data_.o.size; i++) { map->erase(DropMapIterator(mit[i])); members[i].~Member(); } data_.o.size = 0; } } void DoFreeMembers() { if (Member* members = GetMembersPointer()) { GetMap(members)->~Map(); for (SizeType i = 0; i < data_.o.size; i++) { members[i].~Member(); } if (Allocator::kNeedFree) { // Shortcut by Allocator's trait Map** map = &GetMap(members); Allocator::Free(*map); Allocator::Free(map); } } } #else // !RAPIDJSON_USE_MEMBERSMAP RAPIDJSON_FORCEINLINE Member* DoAllocMembers(SizeType capacity, Allocator& allocator) { return Malloc(allocator, capacity); } void DoReserveMembers(SizeType newCapacity, Allocator& allocator) { ObjectData& o = data_.o; if (newCapacity > o.capacity) { Member* newMembers = Realloc(allocator, GetMembersPointer(), o.capacity, newCapacity); RAPIDJSON_SETPOINTER(Member, o.members, newMembers); o.capacity = newCapacity; } } template MemberIterator DoFindMember(const GenericValue& name) { MemberIterator member = MemberBegin(); for ( ; member != MemberEnd(); ++member) if (name.StringEqual(member->name)) break; return member; } void DoClearMembers() { for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) m->~Member(); data_.o.size = 0; } void DoFreeMembers() { for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) m->~Member(); Allocator::Free(GetMembersPointer()); } #endif // !RAPIDJSON_USE_MEMBERSMAP void DoAddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { ObjectData& o = data_.o; if (o.size >= o.capacity) DoReserveMembers(o.capacity ? (o.capacity + (o.capacity + 1) / 2) : kDefaultObjectCapacity, allocator); Member* members = GetMembersPointer(); Member* m = members + o.size; m->name.RawAssign(name); m->value.RawAssign(value); #if RAPIDJSON_USE_MEMBERSMAP Map* &map = GetMap(members); MapIterator* mit = GetMapIterators(map); new (&mit[o.size]) MapIterator(map->insert(MapPair(m->name.data_, o.size))); #endif ++o.size; } MemberIterator DoRemoveMember(MemberIterator m) { ObjectData& o = data_.o; Member* members = GetMembersPointer(); #if RAPIDJSON_USE_MEMBERSMAP Map* &map = GetMap(members); MapIterator* mit = GetMapIterators(map); SizeType mpos = static_cast(&*m - members); map->erase(DropMapIterator(mit[mpos])); #endif MemberIterator last(members + (o.size - 1)); if (o.size > 1 && m != last) { #if RAPIDJSON_USE_MEMBERSMAP new (&mit[mpos]) MapIterator(DropMapIterator(mit[&*last - members])); mit[mpos]->second = mpos; #endif *m = *last; // Move the last one to this place } else { m->~Member(); // Only one left, just destroy } --o.size; return m; } MemberIterator DoEraseMembers(ConstMemberIterator first, ConstMemberIterator last) { ObjectData& o = data_.o; MemberIterator beg = MemberBegin(), pos = beg + (first - beg), end = MemberEnd(); #if RAPIDJSON_USE_MEMBERSMAP Map* &map = GetMap(GetMembersPointer()); MapIterator* mit = GetMapIterators(map); #endif for (MemberIterator itr = pos; itr != last; ++itr) { #if RAPIDJSON_USE_MEMBERSMAP map->erase(DropMapIterator(mit[itr - beg])); #endif itr->~Member(); } #if RAPIDJSON_USE_MEMBERSMAP if (first != last) { // Move remaining members/iterators MemberIterator next = pos + (last - first); for (MemberIterator itr = pos; next != end; ++itr, ++next) { std::memcpy(static_cast(&*itr), &*next, sizeof(Member)); SizeType mpos = static_cast(itr - beg); new (&mit[mpos]) MapIterator(DropMapIterator(mit[next - beg])); mit[mpos]->second = mpos; } } #else std::memmove(static_cast(&*pos), &*last, static_cast(end - last) * sizeof(Member)); #endif o.size -= static_cast(last - first); return pos; } template void DoCopyMembers(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings) { RAPIDJSON_ASSERT(rhs.GetType() == kObjectType); data_.f.flags = kObjectFlag; SizeType count = rhs.data_.o.size; Member* lm = DoAllocMembers(count, allocator); const typename GenericValue::Member* rm = rhs.GetMembersPointer(); #if RAPIDJSON_USE_MEMBERSMAP Map* &map = GetMap(lm); MapIterator* mit = GetMapIterators(map); #endif for (SizeType i = 0; i < count; i++) { new (&lm[i].name) GenericValue(rm[i].name, allocator, copyConstStrings); new (&lm[i].value) GenericValue(rm[i].value, allocator, copyConstStrings); #if RAPIDJSON_USE_MEMBERSMAP new (&mit[i]) MapIterator(map->insert(MapPair(lm[i].name.data_, i))); #endif } data_.o.size = data_.o.capacity = count; SetMembersPointer(lm); } // Initialize this value as array with initial data, without calling destructor. void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) { data_.f.flags = kArrayFlag; if (count) { GenericValue* e = static_cast(allocator.Malloc(count * sizeof(GenericValue))); SetElementsPointer(e); std::memcpy(static_cast(e), values, count * sizeof(GenericValue)); } else SetElementsPointer(0); data_.a.size = data_.a.capacity = count; } //! Initialize this value as object with initial data, without calling destructor. void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) { data_.f.flags = kObjectFlag; if (count) { Member* m = DoAllocMembers(count, allocator); SetMembersPointer(m); std::memcpy(static_cast(m), members, count * sizeof(Member)); #if RAPIDJSON_USE_MEMBERSMAP Map* &map = GetMap(m); MapIterator* mit = GetMapIterators(map); for (SizeType i = 0; i < count; i++) { new (&mit[i]) MapIterator(map->insert(MapPair(m[i].name.data_, i))); } #endif } else SetMembersPointer(0); data_.o.size = data_.o.capacity = count; } //! Initialize this value as constant string, without calling destructor. void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT { data_.f.flags = kConstStringFlag; SetStringPointer(s); data_.s.length = s.length; } //! Initialize this value as copy string with initial data, without calling destructor. void SetStringRaw(StringRefType s, Allocator& allocator) { Ch* str = 0; if (ShortString::Usable(s.length)) { data_.f.flags = kShortStringFlag; data_.ss.SetLength(s.length); str = data_.ss.str; } else { data_.f.flags = kCopyStringFlag; data_.s.length = s.length; str = static_cast(allocator.Malloc((s.length + 1) * sizeof(Ch))); SetStringPointer(str); } std::memcpy(str, s, s.length * sizeof(Ch)); str[s.length] = '\0'; } //! Assignment without calling destructor void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT { data_ = rhs.data_; // data_.f.flags = rhs.data_.f.flags; rhs.data_.f.flags = kNullFlag; } template bool StringEqual(const GenericValue& rhs) const { RAPIDJSON_ASSERT(IsString()); RAPIDJSON_ASSERT(rhs.IsString()); const SizeType len1 = GetStringLength(); const SizeType len2 = rhs.GetStringLength(); if(len1 != len2) { return false; } const Ch* const str1 = GetString(); const Ch* const str2 = rhs.GetString(); if(str1 == str2) { return true; } // fast path for constant string return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0); } Data data_; }; //! GenericValue with UTF8 encoding typedef GenericValue > Value; /////////////////////////////////////////////////////////////////////////////// // GenericDocument //! A document for parsing JSON text as DOM. /*! \note implements Handler concept \tparam Encoding Encoding for both parsing and string storage. \tparam Allocator Allocator for allocating memory for the DOM \tparam StackAllocator Allocator for allocating memory for stack during parsing. \warning Although GenericDocument inherits from GenericValue, the API does \b not provide any virtual functions, especially no virtual destructor. To avoid memory leaks, do not \c delete a GenericDocument object via a pointer to a GenericValue. */ template class GenericDocument : public GenericValue { public: typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. typedef GenericValue ValueType; //!< Value type of the document. typedef Allocator AllocatorType; //!< Allocator type from template parameter. typedef StackAllocator StackAllocatorType; //!< StackAllocator type from template parameter. //! Constructor /*! Creates an empty document of specified type. \param type Mandatory type of object to create. \param allocator Optional allocator for allocating memory. \param stackCapacity Optional initial capacity of stack in bytes. \param stackAllocator Optional allocator for allocating memory for stack. */ explicit GenericDocument(Type type, Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : GenericValue(type), allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() { if (!allocator_) ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); } //! Constructor /*! Creates an empty document which type is Null. \param allocator Optional allocator for allocating memory. \param stackCapacity Optional initial capacity of stack in bytes. \param stackAllocator Optional allocator for allocating memory for stack. */ GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() { if (!allocator_) ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS //! Move constructor in C++11 GenericDocument(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT : ValueType(std::forward(rhs)), // explicit cast to avoid prohibited move from Document allocator_(rhs.allocator_), ownAllocator_(rhs.ownAllocator_), stack_(std::move(rhs.stack_)), parseResult_(rhs.parseResult_) { rhs.allocator_ = 0; rhs.ownAllocator_ = 0; rhs.parseResult_ = ParseResult(); } #endif ~GenericDocument() { // Clear the ::ValueType before ownAllocator is destroyed, ~ValueType() // runs last and may access its elements or members which would be freed // with an allocator like MemoryPoolAllocator (CrtAllocator does not // free its data when destroyed, but MemoryPoolAllocator does). if (ownAllocator_) { ValueType::SetNull(); } Destroy(); } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS //! Move assignment in C++11 GenericDocument& operator=(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT { // The cast to ValueType is necessary here, because otherwise it would // attempt to call GenericValue's templated assignment operator. ValueType::operator=(std::forward(rhs)); // Calling the destructor here would prematurely call stack_'s destructor Destroy(); allocator_ = rhs.allocator_; ownAllocator_ = rhs.ownAllocator_; stack_ = std::move(rhs.stack_); parseResult_ = rhs.parseResult_; rhs.allocator_ = 0; rhs.ownAllocator_ = 0; rhs.parseResult_ = ParseResult(); return *this; } #endif //! Exchange the contents of this document with those of another. /*! \param rhs Another document. \note Constant complexity. \see GenericValue::Swap */ GenericDocument& Swap(GenericDocument& rhs) RAPIDJSON_NOEXCEPT { ValueType::Swap(rhs); stack_.Swap(rhs.stack_); internal::Swap(allocator_, rhs.allocator_); internal::Swap(ownAllocator_, rhs.ownAllocator_); internal::Swap(parseResult_, rhs.parseResult_); return *this; } // Allow Swap with ValueType. // Refer to Effective C++ 3rd Edition/Item 33: Avoid hiding inherited names. using ValueType::Swap; //! free-standing swap function helper /*! Helper function to enable support for common swap implementation pattern based on \c std::swap: \code void swap(MyClass& a, MyClass& b) { using std::swap; swap(a.doc, b.doc); // ... } \endcode \see Swap() */ friend inline void swap(GenericDocument& a, GenericDocument& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } //! Populate this document by a generator which produces SAX events. /*! \tparam Generator A functor with bool f(Handler) prototype. \param g Generator functor which sends SAX events to the parameter. \return The document itself for fluent API. */ template GenericDocument& Populate(Generator& g) { ClearStackOnExit scope(*this); if (g(*this)) { RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document } return *this; } //!@name Parse from stream //!@{ //! Parse JSON text from an input stream (with Encoding conversion) /*! \tparam parseFlags Combination of \ref ParseFlag. \tparam SourceEncoding Encoding of input stream \tparam InputStream Type of input stream, implementing Stream concept \param is Input stream to be parsed. \return The document itself for fluent API. */ template GenericDocument& ParseStream(InputStream& is) { GenericReader reader( stack_.HasAllocator() ? &stack_.GetAllocator() : 0); ClearStackOnExit scope(*this); parseResult_ = reader.template Parse(is, *this); if (parseResult_) { RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document } return *this; } //! Parse JSON text from an input stream /*! \tparam parseFlags Combination of \ref ParseFlag. \tparam InputStream Type of input stream, implementing Stream concept \param is Input stream to be parsed. \return The document itself for fluent API. */ template GenericDocument& ParseStream(InputStream& is) { return ParseStream(is); } //! Parse JSON text from an input stream (with \ref kParseDefaultFlags) /*! \tparam InputStream Type of input stream, implementing Stream concept \param is Input stream to be parsed. \return The document itself for fluent API. */ template GenericDocument& ParseStream(InputStream& is) { return ParseStream(is); } //!@} //!@name Parse in-place from mutable string //!@{ //! Parse JSON text from a mutable string /*! \tparam parseFlags Combination of \ref ParseFlag. \param str Mutable zero-terminated string to be parsed. \return The document itself for fluent API. */ template GenericDocument& ParseInsitu(Ch* str) { GenericInsituStringStream s(str); return ParseStream(s); } //! Parse JSON text from a mutable string (with \ref kParseDefaultFlags) /*! \param str Mutable zero-terminated string to be parsed. \return The document itself for fluent API. */ GenericDocument& ParseInsitu(Ch* str) { return ParseInsitu(str); } //!@} //!@name Parse from read-only string //!@{ //! Parse JSON text from a read-only string (with Encoding conversion) /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). \tparam SourceEncoding Transcoding from input Encoding \param str Read-only zero-terminated string to be parsed. */ template GenericDocument& Parse(const typename SourceEncoding::Ch* str) { RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); GenericStringStream s(str); return ParseStream(s); } //! Parse JSON text from a read-only string /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). \param str Read-only zero-terminated string to be parsed. */ template GenericDocument& Parse(const Ch* str) { return Parse(str); } //! Parse JSON text from a read-only string (with \ref kParseDefaultFlags) /*! \param str Read-only zero-terminated string to be parsed. */ GenericDocument& Parse(const Ch* str) { return Parse(str); } template GenericDocument& Parse(const typename SourceEncoding::Ch* str, size_t length) { RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); MemoryStream ms(reinterpret_cast(str), length * sizeof(typename SourceEncoding::Ch)); EncodedInputStream is(ms); ParseStream(is); return *this; } template GenericDocument& Parse(const Ch* str, size_t length) { return Parse(str, length); } GenericDocument& Parse(const Ch* str, size_t length) { return Parse(str, length); } #if RAPIDJSON_HAS_STDSTRING template GenericDocument& Parse(const std::basic_string& str) { // c_str() is constant complexity according to standard. Should be faster than Parse(const char*, size_t) return Parse(str.c_str()); } template GenericDocument& Parse(const std::basic_string& str) { return Parse(str.c_str()); } GenericDocument& Parse(const std::basic_string& str) { return Parse(str); } #endif // RAPIDJSON_HAS_STDSTRING //!@} //!@name Handling parse errors //!@{ //! Whether a parse error has occurred in the last parsing. bool HasParseError() const { return parseResult_.IsError(); } //! Get the \ref ParseErrorCode of last parsing. ParseErrorCode GetParseError() const { return parseResult_.Code(); } //! Get the position of last parsing error in input, 0 otherwise. size_t GetErrorOffset() const { return parseResult_.Offset(); } //! Implicit conversion to get the last parse result #ifndef __clang // -Wdocumentation /*! \return \ref ParseResult of the last parse operation \code Document doc; ParseResult ok = doc.Parse(json); if (!ok) printf( "JSON parse error: %s (%u)\n", GetParseError_En(ok.Code()), ok.Offset()); \endcode */ #endif operator ParseResult() const { return parseResult_; } //!@} //! Get the allocator of this document. Allocator& GetAllocator() { RAPIDJSON_ASSERT(allocator_); return *allocator_; } //! Get the capacity of stack in bytes. size_t GetStackCapacity() const { return stack_.GetCapacity(); } private: // clear stack on any exit from ParseStream, e.g. due to exception struct ClearStackOnExit { explicit ClearStackOnExit(GenericDocument& d) : d_(d) {} ~ClearStackOnExit() { d_.ClearStack(); } private: ClearStackOnExit(const ClearStackOnExit&); ClearStackOnExit& operator=(const ClearStackOnExit&); GenericDocument& d_; }; // callers of the following private Handler functions // template friend class GenericReader; // for parsing template friend class GenericValue; // for deep copying public: // Implementation of Handler bool Null() { new (stack_.template Push()) ValueType(); return true; } bool Bool(bool b) { new (stack_.template Push()) ValueType(b); return true; } bool Int(int i) { new (stack_.template Push()) ValueType(i); return true; } bool Uint(unsigned i) { new (stack_.template Push()) ValueType(i); return true; } bool Int64(int64_t i) { new (stack_.template Push()) ValueType(i); return true; } bool Uint64(uint64_t i) { new (stack_.template Push()) ValueType(i); return true; } bool Double(double d) { new (stack_.template Push()) ValueType(d); return true; } bool RawNumber(const Ch* str, SizeType length, bool copy) { if (copy) new (stack_.template Push()) ValueType(str, length, GetAllocator()); else new (stack_.template Push()) ValueType(str, length); return true; } bool String(const Ch* str, SizeType length, bool copy) { if (copy) new (stack_.template Push()) ValueType(str, length, GetAllocator()); else new (stack_.template Push()) ValueType(str, length); return true; } bool StartObject() { new (stack_.template Push()) ValueType(kObjectType); return true; } bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); } bool EndObject(SizeType memberCount) { typename ValueType::Member* members = stack_.template Pop(memberCount); stack_.template Top()->SetObjectRaw(members, memberCount, GetAllocator()); return true; } bool StartArray() { new (stack_.template Push()) ValueType(kArrayType); return true; } bool EndArray(SizeType elementCount) { ValueType* elements = stack_.template Pop(elementCount); stack_.template Top()->SetArrayRaw(elements, elementCount, GetAllocator()); return true; } private: //! Prohibit copying GenericDocument(const GenericDocument&); //! Prohibit assignment GenericDocument& operator=(const GenericDocument&); void ClearStack() { if (Allocator::kNeedFree) while (stack_.GetSize() > 0) // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects) (stack_.template Pop(1))->~ValueType(); else stack_.Clear(); stack_.ShrinkToFit(); } void Destroy() { RAPIDJSON_DELETE(ownAllocator_); } static const size_t kDefaultStackCapacity = 1024; Allocator* allocator_; Allocator* ownAllocator_; internal::Stack stack_; ParseResult parseResult_; }; //! GenericDocument with UTF8 encoding typedef GenericDocument > Document; //! Helper class for accessing Value of array type. /*! Instance of this helper class is obtained by \c GenericValue::GetArray(). In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. */ template class GenericArray { public: typedef GenericArray ConstArray; typedef GenericArray Array; typedef ValueT PlainType; typedef typename internal::MaybeAddConst::Type ValueType; typedef ValueType* ValueIterator; // This may be const or non-const iterator typedef const ValueT* ConstValueIterator; typedef typename ValueType::AllocatorType AllocatorType; typedef typename ValueType::StringRefType StringRefType; template friend class GenericValue; GenericArray(const GenericArray& rhs) : value_(rhs.value_) {} GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; } ~GenericArray() {} operator ValueType&() const { return value_; } SizeType Size() const { return value_.Size(); } SizeType Capacity() const { return value_.Capacity(); } bool Empty() const { return value_.Empty(); } void Clear() const { value_.Clear(); } ValueType& operator[](SizeType index) const { return value_[index]; } ValueIterator Begin() const { return value_.Begin(); } ValueIterator End() const { return value_.End(); } GenericArray Reserve(SizeType newCapacity, AllocatorType &allocator) const { value_.Reserve(newCapacity, allocator); return *this; } GenericArray PushBack(ValueType& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS GenericArray PushBack(ValueType&& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS GenericArray PushBack(StringRefType value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (const GenericArray&)) PushBack(T value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } GenericArray PopBack() const { value_.PopBack(); return *this; } ValueIterator Erase(ConstValueIterator pos) const { return value_.Erase(pos); } ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) const { return value_.Erase(first, last); } #if RAPIDJSON_HAS_CXX11_RANGE_FOR ValueIterator begin() const { return value_.Begin(); } ValueIterator end() const { return value_.End(); } #endif private: GenericArray(); GenericArray(ValueType& value) : value_(value) {} ValueType& value_; }; //! Helper class for accessing Value of object type. /*! Instance of this helper class is obtained by \c GenericValue::GetObject(). In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. */ template class GenericObject { public: typedef GenericObject ConstObject; typedef GenericObject Object; typedef ValueT PlainType; typedef typename internal::MaybeAddConst::Type ValueType; typedef GenericMemberIterator MemberIterator; // This may be const or non-const iterator typedef GenericMemberIterator ConstMemberIterator; typedef typename ValueType::AllocatorType AllocatorType; typedef typename ValueType::StringRefType StringRefType; typedef typename ValueType::EncodingType EncodingType; typedef typename ValueType::Ch Ch; template friend class GenericValue; GenericObject(const GenericObject& rhs) : value_(rhs.value_) {} GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; } ~GenericObject() {} operator ValueType&() const { return value_; } SizeType MemberCount() const { return value_.MemberCount(); } SizeType MemberCapacity() const { return value_.MemberCapacity(); } bool ObjectEmpty() const { return value_.ObjectEmpty(); } template ValueType& operator[](T* name) const { return value_[name]; } template ValueType& operator[](const GenericValue& name) const { return value_[name]; } #if RAPIDJSON_HAS_STDSTRING ValueType& operator[](const std::basic_string& name) const { return value_[name]; } #endif MemberIterator MemberBegin() const { return value_.MemberBegin(); } MemberIterator MemberEnd() const { return value_.MemberEnd(); } GenericObject MemberReserve(SizeType newCapacity, AllocatorType &allocator) const { value_.MemberReserve(newCapacity, allocator); return *this; } bool HasMember(const Ch* name) const { return value_.HasMember(name); } #if RAPIDJSON_HAS_STDSTRING bool HasMember(const std::basic_string& name) const { return value_.HasMember(name); } #endif template bool HasMember(const GenericValue& name) const { return value_.HasMember(name); } MemberIterator FindMember(const Ch* name) const { return value_.FindMember(name); } template MemberIterator FindMember(const GenericValue& name) const { return value_.FindMember(name); } #if RAPIDJSON_HAS_STDSTRING MemberIterator FindMember(const std::basic_string& name) const { return value_.FindMember(name); } #endif GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } #if RAPIDJSON_HAS_STDSTRING GenericObject AddMember(ValueType& name, std::basic_string& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } #endif template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } void RemoveAllMembers() { value_.RemoveAllMembers(); } bool RemoveMember(const Ch* name) const { return value_.RemoveMember(name); } #if RAPIDJSON_HAS_STDSTRING bool RemoveMember(const std::basic_string& name) const { return value_.RemoveMember(name); } #endif template bool RemoveMember(const GenericValue& name) const { return value_.RemoveMember(name); } MemberIterator RemoveMember(MemberIterator m) const { return value_.RemoveMember(m); } MemberIterator EraseMember(ConstMemberIterator pos) const { return value_.EraseMember(pos); } MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) const { return value_.EraseMember(first, last); } bool EraseMember(const Ch* name) const { return value_.EraseMember(name); } #if RAPIDJSON_HAS_STDSTRING bool EraseMember(const std::basic_string& name) const { return EraseMember(ValueType(StringRef(name))); } #endif template bool EraseMember(const GenericValue& name) const { return value_.EraseMember(name); } #if RAPIDJSON_HAS_CXX11_RANGE_FOR MemberIterator begin() const { return value_.MemberBegin(); } MemberIterator end() const { return value_.MemberEnd(); } #endif private: GenericObject(); GenericObject(ValueType& value) : value_(value) {} ValueType& value_; }; RAPIDJSON_NAMESPACE_END RAPIDJSON_DIAG_POP #ifdef RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED #pragma pop_macro("GetObject") #undef RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED #endif #endif // RAPIDJSON_DOCUMENT_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/stringbuffer.h0000644000000000000000000000760015031566105026201 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef RAPIDJSON_STRINGBUFFER_H_ #define RAPIDJSON_STRINGBUFFER_H_ #include "stream.h" #include "internal/stack.h" #if RAPIDJSON_HAS_CXX11_RVALUE_REFS #include // std::move #endif #include "internal/stack.h" #if defined(__clang__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(c++98-compat) #endif RAPIDJSON_NAMESPACE_BEGIN //! Represents an in-memory output stream. /*! \tparam Encoding Encoding of the stream. \tparam Allocator type for allocating memory buffer. \note implements Stream concept */ template class GenericStringBuffer { public: typedef typename Encoding::Ch Ch; GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} #if RAPIDJSON_HAS_CXX11_RVALUE_REFS GenericStringBuffer(GenericStringBuffer&& rhs) : stack_(std::move(rhs.stack_)) {} GenericStringBuffer& operator=(GenericStringBuffer&& rhs) { if (&rhs != this) stack_ = std::move(rhs.stack_); return *this; } #endif void Put(Ch c) { *stack_.template Push() = c; } void PutUnsafe(Ch c) { *stack_.template PushUnsafe() = c; } void Flush() {} void Clear() { stack_.Clear(); } void ShrinkToFit() { // Push and pop a null terminator. This is safe. *stack_.template Push() = '\0'; stack_.ShrinkToFit(); stack_.template Pop(1); } void Reserve(size_t count) { stack_.template Reserve(count); } Ch* Push(size_t count) { return stack_.template Push(count); } Ch* PushUnsafe(size_t count) { return stack_.template PushUnsafe(count); } void Pop(size_t count) { stack_.template Pop(count); } const Ch* GetString() const { // Push and pop a null terminator. This is safe. *stack_.template Push() = '\0'; stack_.template Pop(1); return stack_.template Bottom(); } //! Get the size of string in bytes in the string buffer. size_t GetSize() const { return stack_.GetSize(); } //! Get the length of string in Ch in the string buffer. size_t GetLength() const { return stack_.GetSize() / sizeof(Ch); } static const size_t kDefaultCapacity = 256; mutable internal::Stack stack_; private: // Prohibit copy constructor & assignment operator. GenericStringBuffer(const GenericStringBuffer&); GenericStringBuffer& operator=(const GenericStringBuffer&); }; //! String buffer with UTF8 encoding typedef GenericStringBuffer > StringBuffer; template inline void PutReserve(GenericStringBuffer& stream, size_t count) { stream.Reserve(count); } template inline void PutUnsafe(GenericStringBuffer& stream, typename Encoding::Ch c) { stream.PutUnsafe(c); } //! Implement specialized version of PutN() with memset() for better performance. template<> inline void PutN(GenericStringBuffer >& stream, char c, size_t n) { std::memset(stream.stack_.Push(n), c, n * sizeof(c)); } RAPIDJSON_NAMESPACE_END #if defined(__clang__) RAPIDJSON_DIAG_POP #endif #endif // RAPIDJSON_STRINGBUFFER_H_ asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/msinttypes/0000755000000000000000000000000015031566105025544 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/msinttypes/inttypes.h0000644000000000000000000002025115031566105027574 0ustar rootroot// ISO C9x compliant inttypes.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // // Copyright (c) 2006-2013 Alexander Chemeris // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. Neither the name of the product nor the names of its contributors may // be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// // The above software in this distribution may have been modified by // THL A29 Limited ("Tencent Modifications"). // All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. #ifndef _MSC_VER // [ #error "Use this header only with Microsoft Visual C++ compilers!" #endif // _MSC_VER ] #ifndef _MSC_INTTYPES_H_ // [ #define _MSC_INTTYPES_H_ #if _MSC_VER > 1000 #pragma once #endif #include "stdint.h" // miloyip: VC supports inttypes.h since VC2013 #if _MSC_VER >= 1800 #include #else // 7.8 Format conversion of integer types typedef struct { intmax_t quot; intmax_t rem; } imaxdiv_t; // 7.8.1 Macros for format specifiers #if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 // The fprintf macros for signed integers are: #define PRId8 "d" #define PRIi8 "i" #define PRIdLEAST8 "d" #define PRIiLEAST8 "i" #define PRIdFAST8 "d" #define PRIiFAST8 "i" #define PRId16 "hd" #define PRIi16 "hi" #define PRIdLEAST16 "hd" #define PRIiLEAST16 "hi" #define PRIdFAST16 "hd" #define PRIiFAST16 "hi" #define PRId32 "I32d" #define PRIi32 "I32i" #define PRIdLEAST32 "I32d" #define PRIiLEAST32 "I32i" #define PRIdFAST32 "I32d" #define PRIiFAST32 "I32i" #define PRId64 "I64d" #define PRIi64 "I64i" #define PRIdLEAST64 "I64d" #define PRIiLEAST64 "I64i" #define PRIdFAST64 "I64d" #define PRIiFAST64 "I64i" #define PRIdMAX "I64d" #define PRIiMAX "I64i" #define PRIdPTR "Id" #define PRIiPTR "Ii" // The fprintf macros for unsigned integers are: #define PRIo8 "o" #define PRIu8 "u" #define PRIx8 "x" #define PRIX8 "X" #define PRIoLEAST8 "o" #define PRIuLEAST8 "u" #define PRIxLEAST8 "x" #define PRIXLEAST8 "X" #define PRIoFAST8 "o" #define PRIuFAST8 "u" #define PRIxFAST8 "x" #define PRIXFAST8 "X" #define PRIo16 "ho" #define PRIu16 "hu" #define PRIx16 "hx" #define PRIX16 "hX" #define PRIoLEAST16 "ho" #define PRIuLEAST16 "hu" #define PRIxLEAST16 "hx" #define PRIXLEAST16 "hX" #define PRIoFAST16 "ho" #define PRIuFAST16 "hu" #define PRIxFAST16 "hx" #define PRIXFAST16 "hX" #define PRIo32 "I32o" #define PRIu32 "I32u" #define PRIx32 "I32x" #define PRIX32 "I32X" #define PRIoLEAST32 "I32o" #define PRIuLEAST32 "I32u" #define PRIxLEAST32 "I32x" #define PRIXLEAST32 "I32X" #define PRIoFAST32 "I32o" #define PRIuFAST32 "I32u" #define PRIxFAST32 "I32x" #define PRIXFAST32 "I32X" #define PRIo64 "I64o" #define PRIu64 "I64u" #define PRIx64 "I64x" #define PRIX64 "I64X" #define PRIoLEAST64 "I64o" #define PRIuLEAST64 "I64u" #define PRIxLEAST64 "I64x" #define PRIXLEAST64 "I64X" #define PRIoFAST64 "I64o" #define PRIuFAST64 "I64u" #define PRIxFAST64 "I64x" #define PRIXFAST64 "I64X" #define PRIoMAX "I64o" #define PRIuMAX "I64u" #define PRIxMAX "I64x" #define PRIXMAX "I64X" #define PRIoPTR "Io" #define PRIuPTR "Iu" #define PRIxPTR "Ix" #define PRIXPTR "IX" // The fscanf macros for signed integers are: #define SCNd8 "d" #define SCNi8 "i" #define SCNdLEAST8 "d" #define SCNiLEAST8 "i" #define SCNdFAST8 "d" #define SCNiFAST8 "i" #define SCNd16 "hd" #define SCNi16 "hi" #define SCNdLEAST16 "hd" #define SCNiLEAST16 "hi" #define SCNdFAST16 "hd" #define SCNiFAST16 "hi" #define SCNd32 "ld" #define SCNi32 "li" #define SCNdLEAST32 "ld" #define SCNiLEAST32 "li" #define SCNdFAST32 "ld" #define SCNiFAST32 "li" #define SCNd64 "I64d" #define SCNi64 "I64i" #define SCNdLEAST64 "I64d" #define SCNiLEAST64 "I64i" #define SCNdFAST64 "I64d" #define SCNiFAST64 "I64i" #define SCNdMAX "I64d" #define SCNiMAX "I64i" #ifdef _WIN64 // [ # define SCNdPTR "I64d" # define SCNiPTR "I64i" #else // _WIN64 ][ # define SCNdPTR "ld" # define SCNiPTR "li" #endif // _WIN64 ] // The fscanf macros for unsigned integers are: #define SCNo8 "o" #define SCNu8 "u" #define SCNx8 "x" #define SCNX8 "X" #define SCNoLEAST8 "o" #define SCNuLEAST8 "u" #define SCNxLEAST8 "x" #define SCNXLEAST8 "X" #define SCNoFAST8 "o" #define SCNuFAST8 "u" #define SCNxFAST8 "x" #define SCNXFAST8 "X" #define SCNo16 "ho" #define SCNu16 "hu" #define SCNx16 "hx" #define SCNX16 "hX" #define SCNoLEAST16 "ho" #define SCNuLEAST16 "hu" #define SCNxLEAST16 "hx" #define SCNXLEAST16 "hX" #define SCNoFAST16 "ho" #define SCNuFAST16 "hu" #define SCNxFAST16 "hx" #define SCNXFAST16 "hX" #define SCNo32 "lo" #define SCNu32 "lu" #define SCNx32 "lx" #define SCNX32 "lX" #define SCNoLEAST32 "lo" #define SCNuLEAST32 "lu" #define SCNxLEAST32 "lx" #define SCNXLEAST32 "lX" #define SCNoFAST32 "lo" #define SCNuFAST32 "lu" #define SCNxFAST32 "lx" #define SCNXFAST32 "lX" #define SCNo64 "I64o" #define SCNu64 "I64u" #define SCNx64 "I64x" #define SCNX64 "I64X" #define SCNoLEAST64 "I64o" #define SCNuLEAST64 "I64u" #define SCNxLEAST64 "I64x" #define SCNXLEAST64 "I64X" #define SCNoFAST64 "I64o" #define SCNuFAST64 "I64u" #define SCNxFAST64 "I64x" #define SCNXFAST64 "I64X" #define SCNoMAX "I64o" #define SCNuMAX "I64u" #define SCNxMAX "I64x" #define SCNXMAX "I64X" #ifdef _WIN64 // [ # define SCNoPTR "I64o" # define SCNuPTR "I64u" # define SCNxPTR "I64x" # define SCNXPTR "I64X" #else // _WIN64 ][ # define SCNoPTR "lo" # define SCNuPTR "lu" # define SCNxPTR "lx" # define SCNXPTR "lX" #endif // _WIN64 ] #endif // __STDC_FORMAT_MACROS ] // 7.8.2 Functions for greatest-width integer types // 7.8.2.1 The imaxabs function #define imaxabs _abs64 // 7.8.2.2 The imaxdiv function // This is modified version of div() function from Microsoft's div.c found // in %MSVC.NET%\crt\src\div.c #ifdef STATIC_IMAXDIV // [ static #else // STATIC_IMAXDIV ][ _inline #endif // STATIC_IMAXDIV ] imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) { imaxdiv_t result; result.quot = numer / denom; result.rem = numer % denom; if (numer < 0 && result.rem > 0) { // did division wrong; must fix up ++result.quot; result.rem -= denom; } return result; } // 7.8.2.3 The strtoimax and strtoumax functions #define strtoimax _strtoi64 #define strtoumax _strtoui64 // 7.8.2.4 The wcstoimax and wcstoumax functions #define wcstoimax _wcstoi64 #define wcstoumax _wcstoui64 #endif // _MSC_VER >= 1800 #endif // _MSC_INTTYPES_H_ ] asymptote-3.05/LspCpp/third_party/rapidjson/include/rapidjson/msinttypes/stdint.h0000644000000000000000000002223715031566105027230 0ustar rootroot// ISO C9x compliant stdint.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // // Copyright (c) 2006-2013 Alexander Chemeris // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. Neither the name of the product nor the names of its contributors may // be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// // The above software in this distribution may have been modified by // THL A29 Limited ("Tencent Modifications"). // All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. #ifndef _MSC_VER // [ #error "Use this header only with Microsoft Visual C++ compilers!" #endif // _MSC_VER ] #ifndef _MSC_STDINT_H_ // [ #define _MSC_STDINT_H_ #if _MSC_VER > 1000 #pragma once #endif // miloyip: Originally Visual Studio 2010 uses its own stdint.h. However it generates warning with INT64_C(), so change to use this file for vs2010. #if _MSC_VER >= 1600 // [ #include #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 #undef INT8_C #undef INT16_C #undef INT32_C #undef INT64_C #undef UINT8_C #undef UINT16_C #undef UINT32_C #undef UINT64_C // 7.18.4.1 Macros for minimum-width integer constants #define INT8_C(val) val##i8 #define INT16_C(val) val##i16 #define INT32_C(val) val##i32 #define INT64_C(val) val##i64 #define UINT8_C(val) val##ui8 #define UINT16_C(val) val##ui16 #define UINT32_C(val) val##ui32 #define UINT64_C(val) val##ui64 // 7.18.4.2 Macros for greatest-width integer constants // These #ifndef's are needed to prevent collisions with . // Check out Issue 9 for the details. #ifndef INTMAX_C // [ # define INTMAX_C INT64_C #endif // INTMAX_C ] #ifndef UINTMAX_C // [ # define UINTMAX_C UINT64_C #endif // UINTMAX_C ] #endif // __STDC_CONSTANT_MACROS ] #else // ] _MSC_VER >= 1700 [ #include // For Visual Studio 6 in C++ mode and for many Visual Studio versions when // compiling for ARM we have to wrap include with 'extern "C++" {}' // or compiler would give many errors like this: // error C2733: second C linkage of overloaded function 'wmemchr' not allowed #if defined(__cplusplus) && !defined(_M_ARM) extern "C" { #endif # include #if defined(__cplusplus) && !defined(_M_ARM) } #endif // Define _W64 macros to mark types changing their size, like intptr_t. #ifndef _W64 # if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 # define _W64 __w64 # else # define _W64 # endif #endif // 7.18.1 Integer types // 7.18.1.1 Exact-width integer types // Visual Studio 6 and Embedded Visual C++ 4 doesn't // realize that, e.g. char has the same size as __int8 // so we give up on __intX for them. #if (_MSC_VER < 1300) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #endif typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; // 7.18.1.2 Minimum-width integer types typedef int8_t int_least8_t; typedef int16_t int_least16_t; typedef int32_t int_least32_t; typedef int64_t int_least64_t; typedef uint8_t uint_least8_t; typedef uint16_t uint_least16_t; typedef uint32_t uint_least32_t; typedef uint64_t uint_least64_t; // 7.18.1.3 Fastest minimum-width integer types typedef int8_t int_fast8_t; typedef int16_t int_fast16_t; typedef int32_t int_fast32_t; typedef int64_t int_fast64_t; typedef uint8_t uint_fast8_t; typedef uint16_t uint_fast16_t; typedef uint32_t uint_fast32_t; typedef uint64_t uint_fast64_t; // 7.18.1.4 Integer types capable of holding object pointers #ifdef _WIN64 // [ typedef signed __int64 intptr_t; typedef unsigned __int64 uintptr_t; #else // _WIN64 ][ typedef _W64 signed int intptr_t; typedef _W64 unsigned int uintptr_t; #endif // _WIN64 ] // 7.18.1.5 Greatest-width integer types typedef int64_t intmax_t; typedef uint64_t uintmax_t; // 7.18.2 Limits of specified-width integer types #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 // 7.18.2.1 Limits of exact-width integer types #define INT8_MIN ((int8_t)_I8_MIN) #define INT8_MAX _I8_MAX #define INT16_MIN ((int16_t)_I16_MIN) #define INT16_MAX _I16_MAX #define INT32_MIN ((int32_t)_I32_MIN) #define INT32_MAX _I32_MAX #define INT64_MIN ((int64_t)_I64_MIN) #define INT64_MAX _I64_MAX #define UINT8_MAX _UI8_MAX #define UINT16_MAX _UI16_MAX #define UINT32_MAX _UI32_MAX #define UINT64_MAX _UI64_MAX // 7.18.2.2 Limits of minimum-width integer types #define INT_LEAST8_MIN INT8_MIN #define INT_LEAST8_MAX INT8_MAX #define INT_LEAST16_MIN INT16_MIN #define INT_LEAST16_MAX INT16_MAX #define INT_LEAST32_MIN INT32_MIN #define INT_LEAST32_MAX INT32_MAX #define INT_LEAST64_MIN INT64_MIN #define INT_LEAST64_MAX INT64_MAX #define UINT_LEAST8_MAX UINT8_MAX #define UINT_LEAST16_MAX UINT16_MAX #define UINT_LEAST32_MAX UINT32_MAX #define UINT_LEAST64_MAX UINT64_MAX // 7.18.2.3 Limits of fastest minimum-width integer types #define INT_FAST8_MIN INT8_MIN #define INT_FAST8_MAX INT8_MAX #define INT_FAST16_MIN INT16_MIN #define INT_FAST16_MAX INT16_MAX #define INT_FAST32_MIN INT32_MIN #define INT_FAST32_MAX INT32_MAX #define INT_FAST64_MIN INT64_MIN #define INT_FAST64_MAX INT64_MAX #define UINT_FAST8_MAX UINT8_MAX #define UINT_FAST16_MAX UINT16_MAX #define UINT_FAST32_MAX UINT32_MAX #define UINT_FAST64_MAX UINT64_MAX // 7.18.2.4 Limits of integer types capable of holding object pointers #ifdef _WIN64 // [ # define INTPTR_MIN INT64_MIN # define INTPTR_MAX INT64_MAX # define UINTPTR_MAX UINT64_MAX #else // _WIN64 ][ # define INTPTR_MIN INT32_MIN # define INTPTR_MAX INT32_MAX # define UINTPTR_MAX UINT32_MAX #endif // _WIN64 ] // 7.18.2.5 Limits of greatest-width integer types #define INTMAX_MIN INT64_MIN #define INTMAX_MAX INT64_MAX #define UINTMAX_MAX UINT64_MAX // 7.18.3 Limits of other integer types #ifdef _WIN64 // [ # define PTRDIFF_MIN _I64_MIN # define PTRDIFF_MAX _I64_MAX #else // _WIN64 ][ # define PTRDIFF_MIN _I32_MIN # define PTRDIFF_MAX _I32_MAX #endif // _WIN64 ] #define SIG_ATOMIC_MIN INT_MIN #define SIG_ATOMIC_MAX INT_MAX #ifndef SIZE_MAX // [ # ifdef _WIN64 // [ # define SIZE_MAX _UI64_MAX # else // _WIN64 ][ # define SIZE_MAX _UI32_MAX # endif // _WIN64 ] #endif // SIZE_MAX ] // WCHAR_MIN and WCHAR_MAX are also defined in #ifndef WCHAR_MIN // [ # define WCHAR_MIN 0 #endif // WCHAR_MIN ] #ifndef WCHAR_MAX // [ # define WCHAR_MAX _UI16_MAX #endif // WCHAR_MAX ] #define WINT_MIN 0 #define WINT_MAX _UI16_MAX #endif // __STDC_LIMIT_MACROS ] // 7.18.4 Limits of other integer types #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 // 7.18.4.1 Macros for minimum-width integer constants #define INT8_C(val) val##i8 #define INT16_C(val) val##i16 #define INT32_C(val) val##i32 #define INT64_C(val) val##i64 #define UINT8_C(val) val##ui8 #define UINT16_C(val) val##ui16 #define UINT32_C(val) val##ui32 #define UINT64_C(val) val##ui64 // 7.18.4.2 Macros for greatest-width integer constants // These #ifndef's are needed to prevent collisions with . // Check out Issue 9 for the details. #ifndef INTMAX_C // [ # define INTMAX_C INT64_C #endif // INTMAX_C ] #ifndef UINTMAX_C // [ # define UINTMAX_C UINT64_C #endif // UINTMAX_C ] #endif // __STDC_CONSTANT_MACROS ] #endif // _MSC_VER >= 1600 ] #endif // _MSC_STDINT_H_ ] asymptote-3.05/LspCpp/third_party/rapidjson/readme.md0000644000000000000000000002561215031566105021476 0ustar rootroot![RapidJSON logo](doc/logo/rapidjson.png) ![Release version](https://img.shields.io/badge/release-v1.1.0-blue.svg) ## A fast JSON parser/generator for C++ with both SAX/DOM style API Tencent is pleased to support the open source community by making RapidJSON available. Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. * [RapidJSON GitHub](https://github.com/Tencent/rapidjson/) * RapidJSON Documentation * [English](http://rapidjson.org/) * [简体中文](http://rapidjson.org/zh-cn/) * [GitBook](https://www.gitbook.com/book/miloyip/rapidjson/) with downloadable PDF/EPUB/MOBI, without API reference. ## Build status | [Linux][lin-link] | [Windows][win-link] | [Coveralls][cov-link] | | :---------------: | :-----------------: | :-------------------: | | ![lin-badge] | ![win-badge] | ![cov-badge] | [lin-badge]: https://travis-ci.org/Tencent/rapidjson.svg?branch=master "Travis build status" [lin-link]: https://travis-ci.org/Tencent/rapidjson "Travis build status" [win-badge]: https://ci.appveyor.com/api/projects/status/l6qulgqahcayidrf/branch/master?svg=true "AppVeyor build status" [win-link]: https://ci.appveyor.com/project/miloyip/rapidjson-0fdqj/branch/master "AppVeyor build status" [cov-badge]: https://coveralls.io/repos/Tencent/rapidjson/badge.svg?branch=master "Coveralls coverage" [cov-link]: https://coveralls.io/r/Tencent/rapidjson?branch=master "Coveralls coverage" ## Introduction RapidJSON is a JSON parser and generator for C++. It was inspired by [RapidXml](http://rapidxml.sourceforge.net/). * RapidJSON is **small** but **complete**. It supports both SAX and DOM style API. The SAX parser is only a half thousand lines of code. * RapidJSON is **fast**. Its performance can be comparable to `strlen()`. It also optionally supports SSE2/SSE4.2 for acceleration. * RapidJSON is **self-contained** and **header-only**. It does not depend on external libraries such as BOOST. It even does not depend on STL. * RapidJSON is **memory-friendly**. Each JSON value occupies exactly 16 bytes for most 32/64-bit machines (excluding text string). By default it uses a fast memory allocator, and the parser allocates memory compactly during parsing. * RapidJSON is **Unicode-friendly**. It supports UTF-8, UTF-16, UTF-32 (LE & BE), and their detection, validation and transcoding internally. For example, you can read a UTF-8 file and let RapidJSON transcode the JSON strings into UTF-16 in the DOM. It also supports surrogates and "\u0000" (null character). More features can be read [here](doc/features.md). JSON(JavaScript Object Notation) is a light-weight data exchange format. RapidJSON should be in full compliance with RFC7159/ECMA-404, with optional support of relaxed syntax. More information about JSON can be obtained at * [Introducing JSON](http://json.org/) * [RFC7159: The JavaScript Object Notation (JSON) Data Interchange Format](https://tools.ietf.org/html/rfc7159) * [Standard ECMA-404: The JSON Data Interchange Format](https://www.ecma-international.org/publications/standards/Ecma-404.htm) ## Highlights in v1.1 (2016-8-25) * Added [JSON Pointer](doc/pointer.md) * Added [JSON Schema](doc/schema.md) * Added [relaxed JSON syntax](doc/dom.md) (comment, trailing comma, NaN/Infinity) * Iterating array/object with [C++11 Range-based for loop](doc/tutorial.md) * Reduce memory overhead of each `Value` from 24 bytes to 16 bytes in x86-64 architecture. For other changes please refer to [change log](CHANGELOG.md). ## Compatibility RapidJSON is cross-platform. Some platform/compiler combinations which have been tested are shown as follows. * Visual C++ 2008/2010/2013 on Windows (32/64-bit) * GNU C++ 3.8.x on Cygwin * Clang 3.4 on Mac OS X (32/64-bit) and iOS * Clang 3.4 on Android NDK Users can build and run the unit tests on their platform/compiler. ## Installation RapidJSON is a header-only C++ library. Just copy the `include/rapidjson` folder to system or project's include path. Alternatively, if you are using the [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager you can download and install rapidjson with CMake integration in a single command: * vcpkg install rapidjson RapidJSON uses following software as its dependencies: * [CMake](https://cmake.org/) as a general build tool * (optional) [Doxygen](http://www.doxygen.org) to build documentation * (optional) [googletest](https://github.com/google/googletest) for unit and performance testing To generate user documentation and run tests please proceed with the steps below: 1. Execute `git submodule update --init` to get the files of thirdparty submodules (google test). 2. Create directory called `build` in rapidjson source directory. 3. Change to `build` directory and run `cmake ..` command to configure your build. Windows users can do the same with cmake-gui application. 4. On Windows, build the solution found in the build directory. On Linux, run `make` from the build directory. On successful build you will find compiled test and example binaries in `bin` directory. The generated documentation will be available in `doc/html` directory of the build tree. To run tests after finished build please run `make test` or `ctest` from your build tree. You can get detailed output using `ctest -V` command. It is possible to install library system-wide by running `make install` command from the build tree with administrative privileges. This will install all files according to system preferences. Once RapidJSON is installed, it is possible to use it from other CMake projects by adding `find_package(RapidJSON)` line to your CMakeLists.txt. ## Usage at a glance This simple example parses a JSON string into a document (DOM), make a simple modification of the DOM, and finally stringify the DOM to a JSON string. ~~~~~~~~~~cpp // rapidjson/example/simpledom/simpledom.cpp` #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" #include using namespace rapidjson; int main() { // 1. Parse a JSON string into DOM. const char* json = "{\"project\":\"rapidjson\",\"stars\":10}"; Document d; d.Parse(json); // 2. Modify it by DOM. Value& s = d["stars"]; s.SetInt(s.GetInt() + 1); // 3. Stringify the DOM StringBuffer buffer; Writer writer(buffer); d.Accept(writer); // Output {"project":"rapidjson","stars":11} std::cout << buffer.GetString() << std::endl; return 0; } ~~~~~~~~~~ Note that this example did not handle potential errors. The following diagram shows the process. ![simpledom](doc/diagram/simpledom.png) More [examples](https://github.com/Tencent/rapidjson/tree/master/example) are available: * DOM API * [tutorial](https://github.com/Tencent/rapidjson/blob/master/example/tutorial/tutorial.cpp): Basic usage of DOM API. * SAX API * [simplereader](https://github.com/Tencent/rapidjson/blob/master/example/simplereader/simplereader.cpp): Dumps all SAX events while parsing a JSON by `Reader`. * [condense](https://github.com/Tencent/rapidjson/blob/master/example/condense/condense.cpp): A command line tool to rewrite a JSON, with all whitespaces removed. * [pretty](https://github.com/Tencent/rapidjson/blob/master/example/pretty/pretty.cpp): A command line tool to rewrite a JSON with indents and newlines by `PrettyWriter`. * [capitalize](https://github.com/Tencent/rapidjson/blob/master/example/capitalize/capitalize.cpp): A command line tool to capitalize strings in JSON. * [messagereader](https://github.com/Tencent/rapidjson/blob/master/example/messagereader/messagereader.cpp): Parse a JSON message with SAX API. * [serialize](https://github.com/Tencent/rapidjson/blob/master/example/serialize/serialize.cpp): Serialize a C++ object into JSON with SAX API. * [jsonx](https://github.com/Tencent/rapidjson/blob/master/example/jsonx/jsonx.cpp): Implements a `JsonxWriter` which stringify SAX events into [JSONx](https://www-01.ibm.com/support/knowledgecenter/SS9H2Y_7.1.0/com.ibm.dp.doc/json_jsonx.html) (a kind of XML) format. The example is a command line tool which converts input JSON into JSONx format. * Schema * [schemavalidator](https://github.com/Tencent/rapidjson/blob/master/example/schemavalidator/schemavalidator.cpp) : A command line tool to validate a JSON with a JSON schema. * Advanced * [prettyauto](https://github.com/Tencent/rapidjson/blob/master/example/prettyauto/prettyauto.cpp): A modified version of [pretty](https://github.com/Tencent/rapidjson/blob/master/example/pretty/pretty.cpp) to automatically handle JSON with any UTF encodings. * [parsebyparts](https://github.com/Tencent/rapidjson/blob/master/example/parsebyparts/parsebyparts.cpp): Implements an `AsyncDocumentParser` which can parse JSON in parts, using C++11 thread. * [filterkey](https://github.com/Tencent/rapidjson/blob/master/example/filterkey/filterkey.cpp): A command line tool to remove all values with user-specified key. * [filterkeydom](https://github.com/Tencent/rapidjson/blob/master/example/filterkeydom/filterkeydom.cpp): Same tool as above, but it demonstrates how to use a generator to populate a `Document`. ## Contributing RapidJSON welcomes contributions. When contributing, please follow the code below. ### Issues Feel free to submit issues and enhancement requests. Please help us by providing **minimal reproducible examples**, because source code is easier to let other people understand what happens. For crash problems on certain platforms, please bring stack dump content with the detail of the OS, compiler, etc. Please try breakpoint debugging first, tell us what you found, see if we can start exploring based on more information been prepared. ### Workflow In general, we follow the "fork-and-pull" Git workflow. 1. **Fork** the repo on GitHub 2. **Clone** the project to your own machine 3. **Checkout** a new branch on your fork, start developing on the branch 4. **Test** the change before commit, Make sure the changes pass all the tests, including `unittest` and `preftest`, please add test case for each new feature or bug-fix if needed. 5. **Commit** changes to your own branch 6. **Push** your work back up to your fork 7. Submit a **Pull request** so that we can review your changes NOTE: Be sure to merge the latest from "upstream" before making a pull request! ### Copyright and Licensing You can copy and paste the license summary from below. ``` Tencent is pleased to support the open source community by making RapidJSON available. Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://opensource.org/licenses/MIT Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ``` asymptote-3.05/LspCpp/third_party/rapidjson/package.json0000644000000000000000000000106115031566105022175 0ustar rootroot{ "name": "rapidjson", "version": "1.0.4", "description": "![](doc/logo/rapidjson.png)", "main": "include_dirs.js", "directories": { "doc": "doc", "example": "example", "test": "test" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { "type": "git", "url": "git+https://github.com/Tencent/rapidjson.git" }, "author": "", "license": "ISC", "bugs": { "url": "https://github.com/Tencent/rapidjson/issues" }, "homepage": "https://github.com/Tencent/rapidjson#readme" } asymptote-3.05/LspCpp/third_party/rapidjson/bin/0000755000000000000000000000000015031566105020461 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/unittestschema/0000755000000000000000000000000015031566105023521 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/unittestschema/idandref.json0000644000000000000000000000244315031566105026173 0ustar rootroot{ "id": "http://example.com/root.json", "definitions": { "A": { "id": "#foo", "type": "integer" }, "B": { "id": "other.json", "definitions": { "X": { "id": "#bar", "type": "boolean" }, "Y": { "$ref": "#/definitions/X" }, "W": { "$ref": "#/definitions/Y" }, "Z": { "$ref": "#bar" }, "N": { "properties": { "NX": { "$ref": "#/definitions/X" } } } } } }, "properties": { "PA1": { "$ref": "http://example.com/root.json#/definitions/A" }, "PA2": { "$ref": "#/definitions/A" }, "PA3": { "$ref": "#foo" }, "PX1": { "$ref": "#/definitions/B/definitions/X" }, "PX2Y": { "$ref": "#/definitions/B/definitions/Y" }, "PX3Z": { "$ref": "#/definitions/B/definitions/Z" }, "PX4": { "$ref": "http://example.com/other.json#/definitions/X" }, "PX5": { "$ref": "other.json#/definitions/X" }, "PX6": { "$ref": "other.json#bar" }, "PX7W": { "$ref": "#/definitions/B/definitions/W" }, "PX8N": { "$ref": "#/definitions/B/definitions/N" } } }asymptote-3.05/LspCpp/third_party/rapidjson/bin/unittestschema/address.json0000644000000000000000000000611615031566105026045 0ustar rootroot{ "type": "object", "properties": { "version": { "$ref": "#/definitions/decimal_type" }, "address": { "$ref": "#/definitions/address_type" }, "phones": { "type": "array", "minItems": 1, "maxItems": 2, "uniqueItems": true, "items": { "$ref": "#/definitions/phone_type" } }, "names": { "type": "array", "items": [ { "type": "string" }, { "type": "string" } ], "additionalItems": false }, "extra": { "type": "object", "patternProperties": { "^S_": { "type": "string" } } }, "gender": { "type": "string", "enum": ["M", "F"] } }, "additionalProperties": false, "dependencies": { "address": [ "version" ], "names": { "properties": { "version": { "$ref": "#/definitions/decimal_type" } }, "required": ["version"] } }, "definitions": { "address_type": { "type": "object", "properties": { "number": { "$ref": "#/definitions/positiveInt_type" }, "street1": { "type": "string" }, "street2": { "type": ["string", "null"] }, "street3": { "not": { "type": ["boolean", "number", ",integer", "object", "null"] } }, "city": { "type": "string", "maxLength": 10, "minLength": 4 }, "area": { "oneOf": [ { "$ref": "#/definitions/county_type" }, { "$ref": "#/definitions/province_type" } ] }, "country": { "allOf": [ { "$ref": "#/definitions/country_type" } ] }, "postcode": { "anyOf": [ { "type": "string", "pattern": "^[A-Z]{2}[0-9]{1,2} [0-9][A-Z]{2}$" }, { "type": "string", "pattern": "^[0-9]{5}$" } ] } }, "minProperties": 7, "required": [ "number", "street1", "city" ] }, "country_type": { "type": "string", "enum": ["UK", "Canada"] }, "county_type": { "type": "string", "enum": ["Sussex", "Surrey", "Kent", "Narnia"] }, "province_type": { "type": "string", "enum": ["Quebec", "Narnia", "BC", "Alberta"] }, "date_type": { "pattern": "^([0-9]([0-9]([0-9][1-9]|[1-9]0)|[1-9]00)|[1-9]000)(-(0[1-9]|1[0-2])(-(0[1-9]|[1-2][0-9]|3[0-1]))?)?$", "type": "string" }, "positiveInt_type": { "minimum": 0, "exclusiveMinimum": true, "maximum": 100, "exclusiveMaximum": true, "type": "integer" }, "decimal_type": { "multipleOf": 1.0, "type": "number" }, "time_type": { "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)(\\.[0-9]+)?$", "type": "string" }, "unsignedInt_type": { "type": "integer", "minimum": 0, "maximum": 99999 }, "phone_type": { "pattern": "^[0-9]*-[0-9]*", "type": "string" }, "url_type": { "type": "string" } } }asymptote-3.05/LspCpp/third_party/rapidjson/bin/unittestschema/oneOf_address.json0000644000000000000000000000012415031566105027164 0ustar rootroot{ "oneOf": [ { "$ref": "http://localhost:1234/address.json#" } ] }asymptote-3.05/LspCpp/third_party/rapidjson/bin/unittestschema/anyOf_address.json0000644000000000000000000000012415031566105027172 0ustar rootroot{ "anyOf": [ { "$ref": "http://localhost:1234/address.json#" } ] }asymptote-3.05/LspCpp/third_party/rapidjson/bin/unittestschema/allOf_address.json0000644000000000000000000000012415031566105027153 0ustar rootroot{ "allOf": [ { "$ref": "http://localhost:1234/address.json#" } ] }asymptote-3.05/LspCpp/third_party/rapidjson/bin/data/0000755000000000000000000000000015031566105021372 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/data/webapp.json0000644000000000000000000000661315031566105023551 0ustar rootroot{"web-app": { "servlet": [ { "servlet-name": "cofaxCDS", "servlet-class": "org.cofax.cds.CDSServlet", "init-param": { "configGlossary:installationAt": "Philadelphia, PA", "configGlossary:adminEmail": "ksm@pobox.com", "configGlossary:poweredBy": "Cofax", "configGlossary:poweredByIcon": "/images/cofax.gif", "configGlossary:staticPath": "/content/static", "templateProcessorClass": "org.cofax.WysiwygTemplate", "templateLoaderClass": "org.cofax.FilesTemplateLoader", "templatePath": "templates", "templateOverridePath": "", "defaultListTemplate": "listTemplate.htm", "defaultFileTemplate": "articleTemplate.htm", "useJSP": false, "jspListTemplate": "listTemplate.jsp", "jspFileTemplate": "articleTemplate.jsp", "cachePackageTagsTrack": 200, "cachePackageTagsStore": 200, "cachePackageTagsRefresh": 60, "cacheTemplatesTrack": 100, "cacheTemplatesStore": 50, "cacheTemplatesRefresh": 15, "cachePagesTrack": 200, "cachePagesStore": 100, "cachePagesRefresh": 10, "cachePagesDirtyRead": 10, "searchEngineListTemplate": "forSearchEnginesList.htm", "searchEngineFileTemplate": "forSearchEngines.htm", "searchEngineRobotsDb": "WEB-INF/robots.db", "useDataStore": true, "dataStoreClass": "org.cofax.SqlDataStore", "redirectionClass": "org.cofax.SqlRedirection", "dataStoreName": "cofax", "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver", "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon", "dataStoreUser": "sa", "dataStorePassword": "dataStoreTestQuery", "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';", "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log", "dataStoreInitConns": 10, "dataStoreMaxConns": 100, "dataStoreConnUsageLimit": 100, "dataStoreLogLevel": "debug", "maxUrlLength": 500}}, { "servlet-name": "cofaxEmail", "servlet-class": "org.cofax.cds.EmailServlet", "init-param": { "mailHost": "mail1", "mailHostOverride": "mail2"}}, { "servlet-name": "cofaxAdmin", "servlet-class": "org.cofax.cds.AdminServlet"}, { "servlet-name": "fileServlet", "servlet-class": "org.cofax.cds.FileServlet"}, { "servlet-name": "cofaxTools", "servlet-class": "org.cofax.cms.CofaxToolsServlet", "init-param": { "templatePath": "toolstemplates/", "log": 1, "logLocation": "/usr/local/tomcat/logs/CofaxTools.log", "logMaxSize": "", "dataLog": 1, "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log", "dataLogMaxSize": "", "removePageCache": "/content/admin/remove?cache=pages&id=", "removeTemplateCache": "/content/admin/remove?cache=templates&id=", "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder", "lookInContext": 1, "adminGroupID": 4, "betaServer": true}}], "servlet-mapping": { "cofaxCDS": "/", "cofaxEmail": "/cofaxutil/aemail/*", "cofaxAdmin": "/admin/*", "fileServlet": "/static/*", "cofaxTools": "/tools/*"}, "taglib": { "taglib-uri": "cofax.tld", "taglib-location": "/WEB-INF/tlds/cofax.tld"}}}asymptote-3.05/LspCpp/third_party/rapidjson/bin/data/abcde.txt0000644000000000000000000000000515031566105023164 0ustar rootrootabcdeasymptote-3.05/LspCpp/third_party/rapidjson/bin/data/menu.json0000644000000000000000000000155015031566105023232 0ustar rootroot{"menu": { "header": "SVG Viewer", "items": [ {"id": "Open"}, {"id": "OpenNew", "label": "Open New"}, null, {"id": "ZoomIn", "label": "Zoom In"}, {"id": "ZoomOut", "label": "Zoom Out"}, {"id": "OriginalView", "label": "Original View"}, null, {"id": "Quality"}, {"id": "Pause"}, {"id": "Mute"}, null, {"id": "Find", "label": "Find..."}, {"id": "FindAgain", "label": "Find Again"}, {"id": "Copy"}, {"id": "CopyAgain", "label": "Copy Again"}, {"id": "CopySVG", "label": "Copy SVG"}, {"id": "ViewSVG", "label": "View SVG"}, {"id": "ViewSource", "label": "View Source"}, {"id": "SaveAs", "label": "Save As"}, null, {"id": "Help"}, {"id": "About", "label": "About Adobe CVG Viewer..."} ] }}asymptote-3.05/LspCpp/third_party/rapidjson/bin/data/sample.json0000644000000000000000000247660315031566105023570 0ustar rootroot{ "a": { "6U閆崬밺뀫颒myj츥휘:$è–ˆmYí–š#rzé£+玭V㭢뾿愴Yî°‘ê–šX亥ᮉ푊\u0006åž¡ã­ë£\"厓ᔧḅ^Sqpv媫\"⤽걒\"˽Ἆ?ꇆ䬔未tv{DV鯀Tἆl凸g\\㈭ĭ즿UH㽤": null, "b茤z\\î¨.N": [[ "ZL:ᅣዎ*Y|çŒ«åŠæ«•è¾Oj为1糕쪥æ³S룂w࡛á²â¸¥èš™)", { "\"䬰á»wDæ¾V`邀⠕VDãºsH6[칑.:醥葹*뻵倻aD\"": true, "e浱uî¿£p蔽Crà· JK軵xCʨ<뜡癙Yç©ï½¹é½ˆX/螗唻?<蘡+뷄㩤쳖3å‘犾&\\첊xzå崦ݻé´\"åµ¥B3㰃詤豺嚼aqJ⑆∥韼@\u000b㢊\u0015L臯.샥": false, "l?Ǩ喳e6㔡$M꼄I,(3á縢,䊀疅뉲B㴔傳䂴\u0088㮰钘ꜵ!ᅛ韽>": -5514085325291784739, "o㮚?\"춛㵉<\/﬊ࠃ䃪ä£wp6ἀ䱄[s*S嬈貒pᛥ㰉'ë€": [{ "(QP윤懊FI<ꃣ『䕷[\"ç’å¶®?%Ḭå£à²»ä‡Ÿ0è¤!è—²ë¹bdæµ¶tl\u2049#쯀@僞": {"î—i妾8홫": { ",Mï£ë§ƒäž›K5nAㆴVNã’Ší–¬$n꩑&êŽæ¤žî·é˜«?/á¹ì„¸ë‰ª1x쥼㻤㪙`\"$쟒薟B煌܀ì¨à­2掳7㙟鴙Xå©¢\u0002": "Vዉèˆï ’᧷⦌kîŒï®žà°ˆnz*ï·œFM\"è­7ê€-VR<\/';ä™E9$䩉\f @s?íªo3^è¡´cî˜à¶Žä§ªaK鼟q䆨c{ä³ 5mᒲՙ蘹ᮩ": { "Fã²·JGoâ¯Pëµxë’³p䘧☔\"+ꨲå¿JfR㔹)4nç´¬G练Qáž!C|": true, "p^㫮솎ocî’£.೚A㤠??r\u000f)⾽⌲們M2.䴘䩳:⫭胃\\á¾@Fá­Œ\\K": false, "蟌Tk愙潦伩": { "aï‘<\/@ᾛ慂侇瘎": -7271305752851720826, "艓藬/>á„ṯ,XW~㲆w": {"Eç—§î–郶)㜓ha朗!N赻瞉駠uC\u20adè¾ x퓮⣫P1à «LMMX'M刼唳ë¤": null, "P쓫晥%k覛ዩIUᇸ滨:å™í˜²lMR5䋈V梗>%å¹½ué –\\)쟟": null, "eg+昉~矠䧞难\b?gQì­·ç­\\eê® Nl{ಢ哭|]Mn銌╥zê–˜zⱷ⭤ᮜ^": [ -1.30142114406914976E17, -1.7555215491128452E-19, null, "渾ã¨ß牄귛r?ëŒ?w[âšžÓ»~廩輫㼧/", -4.5737191805302129E18, null, "xyà¿‘M[ocì…’ç«“â’ºx?뜓y䊦>-Dì¼(&&?XKkc꩖ﺸá‹ëµžK伕6à§€)딀PæœyWæ™îž¢?훻魢傎EG碸9類៌g踲C⟌aEX舲:z꒸许", 3808159498143417627, null, {"m試\u20df1{G8&뚈h홯J<\/": { "3ஸ厠zs#1K7:rᥞoꅔꯧ&ë‡éµ¼éž«6è·œ#赿5l'8{7㕳(b/j\"厢aqç±€êš\u0015厼稥": [ -2226135764510113982, true, null, { "h%'ë§žï–±Sì‹…Hs&dï”l슾W0jé¿M×D놯L~S-㇡Rì­¬%": null, "⟓咔謡칲\u0000孺ꛭx旑檉㶆?": null, "æ‡I転;￸B2Y`z\\ç“w,ë†æ¿æ’埵䂄)!ä¶¢D=à´­ã´ŸjyY": { "$ࡘt厛毣ൢIèŠ<겿骫⫦6tr惺a": [ 6.385779736989334E-20, false, true, true, [ -6.891946211462334E-19, null, { "]-\\êŸ1/è–“â§á½Š\\l牑\u0007A郃)阜ᇒᓌ-塯`W峬G}SDb㬨Q臉⮻빌O鞟톴첂B㺱<ƈmu챑J㴹㷳픷Oㆩs": { "\"â—‰B\"pᶉt骔J꩸ᄇá›iâ•°æ ›K쉷㉯é©!ãˆnì¹äŸ…難>盥yé“¿eà­”è’M貹ヅ8å˜‹í€¯ä‰¶áŒ¥ã¢æ®Šë»³\"絧╿ꉑ䠥?∃蓊{}㣣Gk긔H1哵峱": false, "6.瀫cN䇮F㧺?\\椯=ÚˆT䘆4â˜ïšŒ8qv": -3.5687501019676885E-19, "Q?yऴr혴{஀䳘p惭f1ﹸ䅷䕋贲<ྃᄊ繲hq\\b|#QSTî“¶s1c-7(äµ¢\u2069åŒçµ˜ê¯‰:læ¯´ï›æ±žt戀oà·Ÿáµ¶ë®±á£-醇Jx䙬äí–¢0࣫á¡grã„›": "\u0011_xM/蘇Chv;dhA5.嗀绱V爤ﰦiëµ²M", "â‘[\"ugoy^儣횎~U\\섯겜ï¥l2jw஌yD腅̂\u0019": true, "ⵯɇä²á«¿à¢š!㯢l샅笶戮1꣖0Xe": null, "劅fë„€ï‹ï§¼bå®ç„ŠE찓橵G!ʱç“뭔雩괛": [{"p⹣켙[q>燣äƒãž½î›œá©²x:쓤삘7玑퇼0<\/qç’‚á‘[ï ™Z\\3䅵䧳\u0011㤧|妱緒C['ì·“Yꞟ3Z鳱雼P錻BUì”§U`ᢶg蓱>.1Ó§è­«'L_5VäµÐ¦": [ false, false, {"22ä‚盥N霂얢躰îe9â‘©_뵜斌n@B}$ê´»Yá±@ä§‹î´½V\"☒-諯cVë¯Ê ": true, "Ű螧ᔼæªéŽë•’딜qꄃH뜣<ç§à¥‚CYå“â¸>XQ㵡趌oë¬k픀빯a(ܵç”ë†à­¯/6Nᪧ}æšá†šì§ŒP牰泱鈷^d꣟#Lì‚€\"㕹襻;k㸊\\f+": true, "쎣\",|⫝̸阊x庿k잣v庅$éˆê´Žç‚”k쬪O_": [ "ìž©AzZGz3v愠ꉈⵎ?㊱}Så°³à¯p\r2>ì·IP䘈M)w|\u000eE", -9222726055990423201, null, [ false, {"´킮'뮤쯽Wxè®V,6ᩪ1ç´²aႈ\u205czD": [ -930994432421097536, 3157232031581030121, "l貚PY䃛5@ä­„ê·»m㎮ç¸fî§¡": 1.0318894506812084E-19, "࢜⩢Ш䧔1肽씮+༎ᣰ闺馺窃䕨8Mƶqè…½xc(៯å¤J5굄ä•Qj_훨/~価.䢵慯틠퇱豠㼇Qﵘ$DuSp(8Uà¸<\/ಟ룴𥳐ݩ$": 8350772684161555590, "ㆎQ䄾\u001bpá©­${[諟^^骴᤮b^ã…¥Iâ”§T㉇⾞\"绦rä°‚f矩'-î½7ä¡­æ¡¥Dz兔V9è°¶å±…ãºá”Šä©¯ë².\u001eL0ὅㅷ釣": [{ "<쯬Jå·^숞u࠯䌗艞R9닪gã¾ë³Ža䂈歖æ„:%é”|ﵤ|y}î¡»>;2,覂⶚啵tb*ä»›8ä¹’ã“¶B࿠㯉戩oX 貘5V嗆렽ë‚߼4hä§›êºM空\\b꿋貼": 8478577078537189402, "VD*|ï§­z~hè­ºaᯒ": { "YIì·¢K<\/濳xNne玗rJo쾘3í•°é´Š\"↱AR:ࢷ\"9?\"è‡ï¦¡)?誚êŠe)_D翾W?&F6J@뺾ê°NZ醊Z쾈വHï±å¶¿?炫㷱鬰M겈᭨b,â»éˆµP䕡䀠८ⱄ홎鄣": { "@?k2é¶–ã‹®\"Oರ K㨇廪儲\u0017ä¾î¿‚J?);\b*묀㗠섳햭1MC V": null, "UIICP!BUA`î€á¢ˆã‹¸~袩㗪⾒=fBï®´l1ꡛ죘R辂여ҳ7쮡<䩲`熕8é ": 4481809488267626463, "Y?+8먙ᚔ鋳蜩ï–럶1㥔y璜౩`": [ null, 1.2850335807501874E-19, "~V2", 2035406654801997866, { "<숻1>\"": -8062468865199390827, "Mã¿£ï€E]}qwG莎Gná¶(ê”™\\D⬲iꇲs寢t駇S뀡ꢜ": false, "pê¤ãŽ9W%>M;-Uç’fî£(^j1?&RBéš§ å¿“b똊îƒE": "#G?C8.躬ꥯ'?냪#< 渟&헿란zpo왓Kj}é·§XﻘMツbä•–;㪻", "vE풤幉xz뱕쫥Ug㦲aH} ᣟp:鬼Yá°ŸH3镔ᴚ斦\\é‘r*2橱Gâ¼”F/.j": true, "RK좬뎂aí™ f*f㱉á®â¦‹æ½™ã¨‹Gu곌SGI3Ië¿\\F',)t`è蘯囯ﮉ裲뇟쥼_ገ驪▵æ’ᕤV": 1.52738225997956557E18, "^k굲䪿꠹B逤%F㱢漥O披M㽯镞竇霒i꼂焅륓\u00059=皫之눃\u2047娤é–銤唫á•b<\/w踲䔼u솆맚,ä’á³'/it": "B餹饴is権ꖪ怯ꦂẉဎt\"!凢谵⧿ï™0\\<=(uLä·åˆ¨ì‘ª>俆æ“Cy襸Q힆䆭涷<\/á±0î É§îŠ‹䗾䚹\\ኜ?ꄢᇘ`ä´¢{囇}᠈䴥X4퓪檄]ꥷ/3謒ሴn+gé¨X", "GgG꽬[(å«“ëª6\u0004ê¶宩㙻/>\u0011^è¾dTè…ªhxÇ‘%ꊇk,8(Wâ§‚çµP鬜O": [{ "Mã´¾c>\\ᓲ\u0019V{>ꤩ혙넪㭪躂TS-痴໸闓âµ/徯O.Mã¥Ê·D囎⧔ì³íœ¤T??鉬뇙=#ꢫ숣BXä­¼<\/d똬졬g榿)eꨋﯪ좇첻\u001a\u0011\";~쓆BH4勿”Š7힪", "iT:L闞椕윚*æ»›gI≀Wਟඊ'ꢆ縺뱹鮚Nê©á§¬è•¼21줧\\䋯``â\\ã±é³¨": 1927052677739832894, "ì®ç¼¦è…ƒg]礿Y㬙 fî¼ãƒºSɪ꾾N㞈": [ null, null, { "!t,çY 1䗉罵?c饃호䉂Cá­ì’˜z(즽sZG㬣sഖE4ï‚뢜㓕äžä¸®Qpç°6EZឪ겛fx'ꩱQ0ç½£i{k锩*㤴㯞r迎jTⲤ渔m炅肳": [ -3.3325685522591933E18, [{"ã“5]A䢕1룥Bï²C?Ꙍ`r룔Ⳛ䙡uä¼²+\u0001àµo": [ null, 4975309147809803991, null, null, {"T팘8Dﯲ稟MM☻㧚䥧/8ﻥ⥯aXLaH\"顾S☟耲ît7fSà·‰ë†ë®”/ꕼ䓈ìº4\\霶䠴ᩢ<\/t4?죵>uDï›5➶༆쉌럮⢀秙䘥\u20972ETR3æ¿¡æ†vB? ~鸆\u0005": { "`é––mç’㥉b뜴?Wf;?DV콜\u2020í‰à±“æ“å®ZMj3mJ먡-å‚·ë±™yח㸷꥿ ໘u=Mì!5å­L4v\\?ÇŽ7C홫": null, "|": false, "~Ztᛋ䚘\\æ“­ã—傪Wé™–+ã—¶qᵿ蘥ᙄp%䫎)}=â ”6ᮢS湟-èž¾-mXH?cp": 448751162044282216, "\u209fad놹j檋䇌ᶾ梕ã‰bוּ": {"?è‹´ê© D䋓帘5騱qï±–PF?☸ç—é¡’yU á¡«cb䫎 S@㥚gꮒ쎘泴멖\\:Ié®±TZ듒ᶨQ3+f7캙\"?\fí’¾\\oæžç´Ÿï»½M.âŽï˜¸é‘OP": [ -2.6990368911551596E18, [{"ä’–@<á°¿<\/⽬tTrè…ž&G%᳊秩蜰擻f㎳?Sãµ§\r*k뎾-乢겹隷j軛겷0ë£é®ï µ": {")DO0è…¦:ì¶é€¿:1㥨่!è›æ¨‹2": [{ ",ꌣf侴笾m๫ꆽ?1?U?\u0011ꌈꂇ": { "xæ—ç” nVqä…¦w`CD⦂惺嘴0I#vỵ} \\ê·‚Së´Dì–¾?Ô’j溯\"v餄a": { "@ç¿™c⢃趚痋i\u0015OQâlqë†Y0pࢥ3쉨䜩^<8g懥0w)]䊑næ´ºo5ì­QL댊랖L镈Qnt⪟㒅십q헎鳒⮤眉ᔹ梠@O縠u泌ㄘb榚癸Xî©­Þ”Ftj;iC": false, "I&뱋゘|ï£è“”䔕측瓯%6á—»HW\\N1貇#?åƒá—œghá­ªo'䗈꽹Rcìš/蔳迄à¼!0邔䨷푪8ç–©)[쭶緄㇈୧á": { "B+:ꉰ`sì¾­)ë¹¼Cç¾A䫊pMgjdxäHf9᥸W0!C樃'ï¤f䫤סи\u0017Jve? è¦f둀⬣퓉Whk\"஼=չï³î•¤çš†ç¬BIW虨쫓F廰饞": -642906201042308791, "sb,XcZ<\/m㉹ ;ä‘·@cäµ€s奤⬷7`ꘖ蕘戚?Feb#輜}p4nH⬮eKL트}": [ "RKé³—z=袤Pf|[,u욺", "Ẏá»ç½¯ë‰‹âº–锅젯㷻{H䰞쬙-ì©“D]~\u0013Oã³¢gb@æ¶è”‰|kᦂâ—!\u001ebMè¤sca쨜襒y⺉룓", null, null, true, -1.650777344339075E-19, false, "☑lꄆs힨꤇]'uTന⌳ë†].1â‹”ê´æ²°\"IWà´©\u0019æ°œ8쟇䔻;3衲æ‹,窌zíŽå–íš—?4?Cë„é—®?ᥙ橭{稻Ⴗ_ì”", "n?]讇빽å—}1å­…9#ê­¨é¶v\u0014å–ˆ)vw祔}룼쮿I", -2.7033457331882025E18, { ";⚃^㱋x:饬ኡj'ê§µT☽O㔬RO婎?향ᒭæ©$渣y4i;(Q>꿘e8q": "j~錘}0g;Lèº*;á•­ê„®0l潛烢5H▄쳂ê’ï­‹ê™¶T犘≫x閦웧v", "~î¢æ¯\u2018c4è·ë E~ᑅቚꈂ?nq뎤.:æ…¹`F햘+%鉎Oç€œìŸæ•›è®âŒæµ¢<\/㮺紿P鳆ࠉ8I-o?#jﮨîŸ7v3Dt赻J9": null, "à£W䌈0êŽqC逖,íš…î·Žcáƒswj;jJSæ«5æ§—OaB>D踾Y": {"ã’°äµF%î©®?59.î„„ãˆcᕨï†í•틎á¸ã‹©B=9IÛⓌ{:9.ywï½å‘°ã†®è‚’᎒tIã¾´62\"ዃ抡C﹬B<\/ì´‹jo朣", [ -7675533242647793366, {"ᙧ呃ï£:[㒺쳀쌡ì‚H稈㢤\u001dá¶—GG-{GHྻຊꡃ哸䵬;$?&d\\⥬ã“Nåœ´ë¤æŒ¨-'ê•®$î“‹PU%?冕눖ié­q騎Q": [ false, [[ 7929823049157504248, [[ true, "Zè™\u0017'eꕤ᱕l,0\\X\u001c[=雿8è ¬L<\/낲긯W99g톉4ퟋbãº\u0007åŠ'!麕Q궈oW:@XáŽïœ¬z蘻m絙璩귓죉+3柚怫tSæ‡è’£ä -æ“¶D[0=퉿8)q0ÙŸ", "唉\nFA椭穒巯\\䥴䅺鿤S#bè¿…ç˜ ï¶—ê¬˜\\?q1qN犠pX꜅^䤊⛤㢌[⬛휖岺q唻ⳡí‹\"ã™™Eh@oA賑㗠yå¿…Nꊑᗘ", -2154220236962890773, -3.2442003245397908E18, "Wá„¿ç­ :瘫퀩?o貸q⊻(᎞KWf宛尨h^残3[U(='æ©„", -7857990034281549164, 1.44283696979059942E18, null, {"ꫯAwè·­å–€ ?_ï““9\"Aty背F=9缉ྦྷ@;?^鞀w:uN㘢Rá»": [ 7.393662029337442E15, 3564680942654233068, [ false, -5253931502642112194, "ç…‰\\îš¶î¶è¾Žî›¢à³†ç½5â’­1äªäƒ‘s䎢:[e5}峳ﴱn騎3?è…³Hyêƒè†¼N潭錖,Yá‹ËœYAá“㬠bG렣䰣:", true, null, { "â’›'P&%죮|:â«¶ì¶ž": -3818336746965687085, "钖m<\/0ÝŽMtF2Pk=瓰୮洽겎.": [[ -8757574841556350607, -3045234949333270161, null, { "áœî…½rè¼³>⫇9hU#î¦#w@ê·ªA\\Cî’¢ é‹ºã˜“ê–æ¢’뒬묹㹻+郸å¬ìœ¤'+g<\/碴,}ꙫ>ì†;情d齆Jä¬àº©æ’›ì±íƒ¹/R澡7剌tꤼ?ặ!`â²ç¤\u00002똥଴âŸ": null, "\u20f2ܹe\\tAê¥Æ°\\x当뿖ï»ë ‰ç¦›;G檳ﯪï…Sà«°3~㘠#[J<}{奲 5箉⨔{ë†<\/釿抋,åš /曳m&WaOvT赋皺璑ï“í…": [[ false, null, true, -5.7131445659795661E18, "è­m䓪D5|3å©à°ž>î‰è ‡æ™¼6nï´ºPp禽羱î¤DS<ç“닫屚ì‚å§¿", true, [ -8759747687917306831, { ">ⓛ\t,odKr{䘠?b퓸C嶈=DyEᙬï¿@ᴔ쨺芛髿UT퓻春<\/yê¸>豚W釺N뜨^?꽴﨟5殺ᗃç¿%>í‚ဿ䄸沂Ea;A_\u0005閹殀W+窊?Ꭼd\u0013Pæ±´G5ì“æ˜": 4.342729067882445E-18, "Q^즾眆@AN\u0011Kb榰냎Y#ä€ê€’ᳺ'q暇çµs\"!3#I⊆畼寤@HxJ9": false, "⿾D[)袨㇩i]웪䀤ᛰMvR<èŸã£¨": {"v퇓L㪱ꖣ豛톤î£\\ê³±#ï–©kDTN": [{ "(ì¾´ä¡£,寴ph(C\"ã³¶w\"憳2s馆E!n!&柄<\/0Pꈗſ?㿳Qdéµ”": {"娇堰孹L錮h嵅⛤èºé¡’?CglNæŸ+쨣ﺜ\\MrH": {"çžäŽ‡ë‘ƒá‰²å¼­íŒ­^ꄞ踦涟XK錆쳞ឌ`;੶S炥騞ଋ褂B៎{Ú’ä­·á¶¼éœpIè—è™¶K$": [{"â—–S~躘蒉꫿輜è­Qã½™é—@ᢗ¥Eæ¦iØ¡5┄^B[絮跉ᰥé™PWi3wㄾⵀDJ9!w㞣ᄎ{ë“’ê““b6\\篴??c⼰鶹⟧\\鮇ꮇ": [[ 654120831325413520, -1.9562073916357608E-19, { "DC(æ˜è¡µá¼¡ê¸™ê°µå§­|Ö›[t": 7.6979110359897907E18, "Jâ…))嫼â³9Xfd飉j7猬ᩉ+⤻î®çœ—벎Eé°‰Zï¾¶63zá69}Zá¶L崭ᦥ⡦éšâ‹›êŽ¨î´µ~i㨃咊ꧭo䰠阀3C(": -3.5844809362512589E17, "p꣑팱쒬ꎑ뛡Ꙩ挴æèƒ”&7ᔈ묒4Hdç¡¶í›ãŽ–zꢼè±ã¿¢aሃ=<\/湉鵲Eî„¡Ó…%$F!í¶æ£Œå­¼{Oé§à¨ºgeu+": ")\u001bìž“kÅ€Xì©«Aë°Â®Ú£ç™¦ç‹¢)扔弒p}k縕ꩋ,䃉tࣼi", "ã‚¡F肿輸<솄G-䢹䛸êŠl`Tqê•—îŠè’ža氷⸅ᴉ蠰]S/{J왲m5{9.uá½³~㕚㣹u>x8Uè®Bëºè¥ªç›ŽQhVS맅킃i识{벂磄Ià·„ä™…xZy/æŠà«­Zï–Šé²î¦š-霳Væ®æŒ¦â„’": null, "㯛|Nî½™ê¸b7âµb?æ‹ O\u0014Þ†?-(EꞨ4ꕷᄤYᯕï‘OW瞺~螸\"욿ќe㺰\"'㌢ÆW\u0004çž•>0?V鷵엳": true, "뤥G\\î¡‹è¿‹ä ¿[庩'꼡\u001aiá©®Vì¯á³ªä¦ªÃ”î²…;倱ନë›èªˆ": null, "쥹䄆䚟Qæ¦äŽá¢­<\/2ã•£p}HW蟔|äƒî‚꿈ꚉ锳2Pb7㙑Tⅹᵅ": { "Y?Ö­$>#cVBꩨ:>ï†eLè’å‹™": { "86柡0po äš&-æ‘Ћ祌<\/휃-G*㶢הּì©s㶟餇c걺yu꽎還5*í„§ç°•Ogå©¥Sê": null, "a+葞h٥ࠆ裈嗫ﵢ5輙퀟ᛜ,QDﹼ⟶Y騠锪E_|x죗jä¾µ;m蜫轘趥?븅w5+miì½›L": { ";⯭ﱢ!ä¹°Fâ½æŸ¤é¶‚näµ£V㫚墱2ë ¾ELEl⣆": [ true, -3.6479311868339015E-18, -7270785619461995400, 3.334081886177621E18, 2.581457786298155E18, -6.605252412954115E-20, -3.9232347037744167E-20, { "B6㊕.k1": null, "ZAê„®Jé®·á³±o갘硥鈠䠒츼": { "á•…}럡}.@y陪é¶r業'æ´î‰°í€‰x䉴ﵴlí˜):씭脴ᥞhiꃰblﲂ䡲엕8߇Mã¶­0燋標æŒ-?PCwe⾕J碻Ᾱ䬈䈥뷰憵賣뵓痬+": {"aì·©v礗X⋈耓áŠfç½…é®!㔽YYᣓwæ¾33⎔芲F|\"äœT↮輦挑6ᓘL侘?ᅥ]ë†1R௯✎餘6ê½<\/௨\\?qå–·ê«j~@ulq": {"嗫欆뾔Xꆹ4H㌋Fåµ§]à Ž]ã –1ꞤT<$më«O i댳0ä²iï—Œ": {"?à·©?\u20cd슮|ꯆjs{?îž…d7?eNs⢚嫥氂䡮쎱:鑵롟2hJꎒﯭ鱢3춲亄:ë¼£v䊭諱Yj択cVmR䩃㘬T\"Ní™*ै%x^F\\_s9ë³´zz4æ·—?q": [ null, "?", 2941869570821073737, "{5{殇0ä¾ïž¢g6ë°–í‹è‡©ç¶¹R$ä–­j紋釰7î‹‘sXI繳漪행y", false, "aH磂?뛡#惇då©…?Fe,ì˜+늵ä˜\"3r瘆唊å‹ï¢Šj⳧࠴ꇓ<\/唕윈x⬌讣䋵%拗ᛆⰿ妴á”M2ã³—å¿…ê§‚æ·²?ゥ젯檢<8ë’ï¶MidXä’3á³»Qî”â–®ä½UT|⤪봦éâŠ", [[{ "颉(&뜸귙{yîš’^\"P퟉ì¶á²Ÿä®­î‹ºDé¡¡9=?}Y誱<$bë±£RvO8cH煉@tk~4ǂ⤧â©å±‹Sî›ïž¢S;J{vV#剤餓ᯅc?#a6D,s": [ -7.8781018564821536E16, true, [ -2.28770899315832371E18, false, -1.0863912140143876E-20, -6282721572097446995, 6767121921199223078, -2545487755405567831, false, null, -9065970397975641765, [ -5.928721243413937E-20, {"6ì´Š\u001a홯kB0w撨燠룉{绎6⳹!í„è´‘y▾鱧ժ[;7ᨷ∀*땒䪮1x霆Hᩭ☔\"rî¹›ä7毟á°r惃3ꉭE+>僒æ¾": [ "Ta쎩aÆt쵯ⰪVb", [ -5222472249213580702, null, -2851641861541559595, null, 4808804630502809099, 5657671602244269874, "5犲﨣4mᥣ?yf젫꾯|䋬ìž$`Iⳉﴷ扳å…,'î±c", false, [ null, { "DyUIN쎾M仼惀⮥裎岶泭lh扠\u001e礼.tEC癯튻@_Qd4cï…«5S熯A<\/ï¼¼6U윲蹴Q=%푫汹\\\u20614b[௒Câ’¥Xe⊇囙b,ï®æœ3ss땊ë¢i~逇PA쇸1": -2.63273619193485312E17, "Mq꺋貘k휕=nKç¡ë«žè¼©>㾆~á¼žà¡¹ê¸æ¦µlâ‹™Hw뮢帋M엳뢯î¹…vâ…ƒ^": 1877913476688465125, "á¶´ë»—`~ç­—å…⚽টW˃â½b犳䓺Iz篤p;乨A\u20efì©?ç–Šmã€ì»©ë«¡b탔鄃ᾈV(é¢ç³=뎲ିeF仢䆡谨8t0醄7㭧瘵⻰컆r厡궥d)a阄á·Ed&c﯄伮1p": null, "â¯w4曢\"(欷輡": "\"Má­«]䣒頳B\\燧ࠃN㡇j姈g⊸⺌忉ꡥF矉স%^", "㣡Oᄦ昵⫮Y祎Sì級㭻撥>{I$": -378474210562741663, "䛒掷留Q%ì“—1*1J*ë“헩ᦢ﫫哉쩧EↅIcê…¡\\?â´Šl귛顮4": false, "寔愆샠5]ä—„IHï©¥=d﯊/å¶?ॊn%晥D視Nò—˜ˆ'᫂⚦|X쵩넽z질tsî¦kxDQ莮Aoﱻ뛓": true, "é’£xp?&\u001e侉/yä´¼~?U篔蘚缣/î”›I畚ï—?Q绊": -3034854258736382234, "꺲໣眀)â¿·J暘î©pИfAVì‚•ì³­Nꯗ4々'唄ⶑ伻㷯騑倭D*Okï¯ê§3bâ½_ï„¡<\/ì±£Xm톰á•䆄`*fl㭀暮滠毡?": [ "Dç”·p`V뙸擨å¿ë¸ª9c麺`淂⢦Yw⡢+kzÜ–\fY1䬡Hæ­)ë²¾Z♤溊-혰셢?1ï”<-\u0005;æ¢Tále\\ᛵߓﭩ榩è¨-xJ;å·¡8깊è ï»“U$K": { "Vê•¡è«…æ“W=斸s︪vﲜ츧$)iꡟ싉eî®å¯³?ጭムVથ嵬iæ¥Fg<\/Z|៪ꩆ-5'@ꃱ80!燱R쇤tç³³]罛逇dṌ֣XHiͦ{": true, "Ya矲Cë©—Q9膲墅æºíœ»c\\ë”¶Gç””<\/.齵휴": -1.1456247877031811E-19, "z#.OOï¿J": -8263224695871959017, "å´_3夼ᮟ1Fë¸ë½¯á¦“é´­V豈Ь": [{ "Nè’¬74": null, "yuB?厅vK笗!ᔸcXQ旦컶P-ë…«mᄉ麟_": "1R@ 톘xa_|﩯é˜î¥§sæ§žd!d껀筤⬫è–焵먑D{\\ïƒïŽ¿6k共倌☀G~AS_D\"딟쬚뮥馲렓쓠攥WTMÜ­8nX㩴䕅檹E\u0007ï­¨N 2 ℆æ¶ê¥ê µï“3▙玽|ë¨_\u2048", "æA Cä§©G": {":Mí£5e들\\ê€æ¼á”„é¸|Iï¨$)n": { "|U䬫㟯SKV6ꛤ㗮\bn봻䲄fXT:㾯쳤'笓0b/à³¢Cì³–?2浓uO.ä°´": "à½ê¼‹e?``,ᚇæ…^8ꜙNM䂱\u0001Iá–™ê§M'vKdꌊH牮r\\O@䊷ᓵ쀆(fî »yè»i툺\"?<\/峧ࣞ⓺ᤤ쵒߯ꎺ騬?)刦\u2072læ…ªy꺜ﲖTjî’•+u", "뽫hh䈵î”w>1â²ì­V[â…Ž\\헑벑F_ã–⠗㫇hæ½;á¿æ±°á±¼ç€–J옆9RRì…vsZ柺鶶툤r뢱橾/ꉇ囦FGm\"謗ꉦ⨶쒿⥡%]鵩#ᖣ_蹎 u5|祥?O", null, 2.0150326776036215E-19, null, true, false, true, {"\faá­¶Pæ¤WWcá Ÿf뚉á¬í“—â³€Wç¹5:HXH=q7xì°™X$)모r뚥ᆟ!Jﳸf": [ -2995806398034583407, [ 6441377066589744683, "Mﶒ醹i)Gἦ廃s6몞 KJ౹礎VZ螺费힀\u0000冺업{è°¥'꡾뱻:.ꘘ굄奉攼Diá·‘Ké¶²y繈욊阓v㻘}枭캗e矮1c?íœ\"4\u0005厑莔뀾墓ë‚⽴洗ṹ䇃糞@b1\u0016즽Yè½¹", { "1⽕⌰鉟í”M㤭n⧴ỼD#%é˜âŠ¯ì¿¼ç¨ë¸£ëªç´§á…‡ã“•ᛖcw嬀~ഌ㖓(0r⧦Qä‘•é«à´°é“‚㓻Rå„®\"@ꇱmâˆà¯¿á¦¯é Œ8}㿹犴?xn잆꥽R": 2.07321075750427366E18, "˳b18㗈䃟柵Z曆VTAu7+㛂cb0﯑Wp執<\/臋뭡뚋刼틮è‹ë²²î·´TLP预庰܈G\\O@VD'鱃#ä¹–ëº*鑪ꬳ?MÞždï­¹{â‡åœ¯ì‡œã¼ž顄︖Y홡g": [{ "0a,FZ": true, "2z̬è£î’®ê§¦é©¸\u0006L↛Ḣ4๚뿀'?lcwá„§ã®!蓚䃦-|7.飑挴.樵*+1ﮊ\u0010ꛌ%貨啺/JdM:ë˜ïˆ!FBe?鰴㨗0Oè´¢I藻ʔWAá«“Gì³›u`<\/I": [{ "$Ï„5Vé´a뾆両環iZp頻යn븃v": -4869131188151215571, "*즢[⦃b礞Râ—šnΰꕢH=귰燙[yc誘g䆌?ଜ臛": { "洤湌鲒)⟻\\䥳va}PeAMnï¼®[": "ã³Éª/(軆lZR,Cpæ®È®Nå•·\"3Bå©´?i=r$펽á¤ì€¸", "阄R4㒿㯔ڀ69ZᲦ2ç™í•Œå™—På´œîž#\\-ì­è¢›îˆµ&é‘/$4ç«¥Vê©‘_ZHAæ¾¢fZ3": {"x;P{긳:Gé–‰:9?æ´»H": [ "繺漮6?z犞焃슳\">á»[Ⳛ䌜ë…䂹>èµâ¼¶ç…œï’˜Yæ¡¥[泥뚩MvK$4ï‰jtï¾›", "E#갶霠좭㦻ୗ먵F+䪀oè’ba쮎4X㣵 h", -335836610224228782, null, null, [ "r1á«©0>danjYì§¿bs{", [ -9.594464059325631E-23, 1.0456894622831624E-20, null, 5.803973284253454E-20, -8141787905188892123, true, -4735305442504973382, 9.513150514479281E-20, "7넳$螔忷㶪}䪪lì§´\u0007é¹Pé°šHFéŠZJﳴ/âŽ1ᷓ忉ç‡áœ‹ì“ˆxëµ mä·çª¥á”^\u0019á¶Œå­#ヂt☆áƒpáŽè‡¶äŸ±5ï‰$ä°µ&๵分ìˆ]äˆë‰â™‚åŽ\u0011<>", "C蒑貑è—lï°°}X喇몛;të°¿O7/᯹f\u0015îµ¼kI嘦<ዴ㟮ᗎZ`GWퟩ瑹࡮ᅴB꿊칈??Ræ ¡s脚", { "9çµæˆ¬+AU^洘拻ቒy柭床'ç²™XG鞕᠜繀伪%]hï ¾C,$è¼™?Utä¹–Qmë–šWï¶8઼}~qâ ªrU䤶CQ痗ig@#≲t샌f㈥酧l;yé—¥ZHæ–¦e⸬]j⸗?ঢ拻퀆滌": null, "畯}ã§¢J罚å¸VX㨑>1ꢶkT⿄蘥ã‘o|<嗸層沈挄GEOM@-äžšä§°$만峬è¼ä ±V✩5宸-æ‚î¡§D'ã—ªyP掶7bâ ŸJã•»SfP?d}v㼂á…'猘": { "陓y잀v>╪": null, "鬿L+7:ë‘Y=ç„ U;킻䯌잫!韎ஔ\f": { "é§«WmGጶ": { "\\~m6ç‹©K": -2586304199791962143, "ႜࠀ%Í‘lâ¿…D.ç‘¢Dk%0ç´ªdḨTI픸%뗜☓s榗኉\"?V籄7w髄♲쟗翛歂E䤓皹t ?)ᄟ鬲éœ6Cî³´": { "_ì·¤a圷1\u000eB-XOy缿請∎$`쳌eZ~æï€§íŠ»/蜞`塣৙\"⪰\"æ²’l}蕌\\ë¡ƒè«æ°Œ.望wZ|o!)Hnçqg}": null, "kOSܧ䖨钨:಼é‰ê­O醧Sî…¨`ì‹­`ꓭì­ï¯¢N&Et㺪馻ã¢â…³ã¢ºå´¡àºŠèœšé”«\\%ahx켨|ż劻ꎄ㢄ìŸA躊᰹p譞綨Ir쿯\u0016ﵚOd럂*僨郀N*bã•·63z": { ":Lï œ5r+T㡲": [{ "VK泓ë²á®™Ry㓤➙Ⱗ38oi}LJቨ7Ó㹡৘*q)1豢⛃e᫛뙪壥镇æž7Gè—¯g㨛oI䄽 孂L缊ꋕ'EN`": -2148138481412096818, "`â›á˜‘$(खꊲ⤖á„ꤒ䦦3=)]Y㢌跨NĴ驳줟秠++då­³>8ᎊ떩Eê¡£Sv룃 쯫أ?#Eî·°|á­™ãŽ?zv:5ï©^â‹‘V": [ -1.4691944435285607E-19, 3.4128661569395795E17, "ãƒì´—^G9ä½­é¾¶n募8R厞eEw⺡_ㆱ%⼨D뉄퉠2ê©µá›…â³æ¿L팹Là·€n=\"æ…‰ë…á›®y>!`g!í’²î¦ï¨’[/;?[vï®ê²è»‡}⤳â¤í•∌Tã½²R홓é‰ã“¥", "æ„°_⮹T䓒妒閤둥?0î°šaB@㈧gç„»-#~è·¬x<\/èˆPÝ„ê¡=\\׳P\u0015jᳪá¢qï‹¶;ã¯l%á­—;砢觨â–,è¬ê°Gy?躤O黩í‹Yã’a擯\n7覌똟_䔡]fJ晋IAS", 4367930106786121250, -4.9421193149720582E17, null, { ";ᄌ똾柉곟ⰺKpá‡ä±»à¸ºä–{o~h!ï½…ê¿àª»ìš„Úš\u0002y?xUd\u207c悜ꌭ": [ 1.6010824122815255E-19, [ "宨︩9앉檥pr쇷?WxLb", "æ°‡9】J玚\u000f옛呲~ è¼ 1D嬛,î•*mW3?n휂糊γ虻*á´«ê¾ ?qîžå‡è¶—Ko↦GTé“®", "ã¶¢ážmOã”k'诔栀Z蛟}GZé’¹D", false, -6.366995517736813E-20, -4894479530745302899, null, "V%᫡IIç’…ï»ä…›ä“Ží’¹ï±¢/pU9seë˜ë›žx梔~C)䨧䩻蜺(g㘚R?/á»°[å¿“C뾠ࢤc왈邠买?嫥挤풜隊枕", ",vç¢å–”㌲쟚蔚톬៓ꭶ", 3.9625444752577524E-19, null, [ "kO8란뿒䱕馔b臻âŸéš¨\"㜮鲣Yq5mí”K#ꢘug㼈á¦=P^6탲@ä§”%$CqSw铜랊0&m⟭<\/a逎ym\u0013îš¡vᯗ": true, "æ´«`|XN뤮\u0018詞=ç´©é´˜_sX)㯅鿻á»ì‹¹": 7.168252736947373E-20, "ꛊ饤ï´è¢(逊+~⽫얢鈮ï«è‰¬O힉7Dç­—S곯wæ“I斞᠈븘蓷x": [[[[ -7.3136069426336952E18, -2.13572396712722688E18, { "ç¡¢3㇩R:o칢行E<=\u0018á¬YuH!\u00044U%å炼2>\u001eSi$â“·ê’ˆ'ï‘¿ë ¢gᙫ番ꯒ㛹럥嶀澈v;è‘·é„•x蓎\\惩+稘Uî“´Eᖸﳊ㊈壋Nå«¿â¾æŒŽ,袯苷ኢ\\x|3c": 7540762493381776411, "?!*^á¢çª¯?\u0001ڔꙃw虜ë³îšFgJ?&⨫*uo籤:?}ꃹ=ٴ惨瓜Z媊@ત戹ã”똩Ԛ耦Wtè½\\æž’^\\ꩵ}}}ꀣD\\]6M_⌫)Hè±£:36섘㑜": { ";í™—á°°U஋㙛`D왔ཿЃS회çˆ\u001b-㢈`ë´†?盂㛣듿ᦾ蒽_AD~EEຆ㊋(eNwk=RÉ å³­qï’«\"5Ἠ婾^>'ls\n8QAK)- Q䲌mo펹L_îŽ¦ì¹æ¨–庫9ê©ìª¹á˜¹ä‘–ç€aK îž?*趤fë­“å»p=磕", "î“å“‘z懅á¤-ê¹ux쀭", [ true, 3998739591332339511, "ጻ㙙?᳸aK<\/囩U`B3袗ﱱ?\"/ké”ä§2ï…¤l@쿎VZ쨎/6ꃭ脥|B?31+on颼-ê®§,O嫚m à¡­`KH葦:粘i]aSUì“™$ì‚f+詛頖b", [{"^<9<ç®&絡;%iï«¡2攑紴\\켉hì“™-柂äšven\u20f7浯-Ꮏ\r^í›ä“ší—¬\u000e?\\ã…¡ÖºJë–·VOt": [{ "-௄å¶k㘆í˜à®½y⎱㢬sS઄+^瞥h;á¾·jî­;抭\u0003ë°«f<\/5â°§ï§§ï¡™_朻ï—%*[-撵䷮彈-芈": { "㩩p3篊G|å®®hz䑊oê³¥j^Co0": [ 653239109285256503, {"ê¶²?|\":N1Û¿æ°ƒNZ#깩:쇡o8킗ࡊ[\"ë¸Po핇1(6é°$膓}â½*)渽J'DN<ì™ê¸˜æ¯¦ë²Ysì¹–": { "2Pr?Xjㆠ?æ®/?㓦柖馃5뚣Nᦼ|é“¢rè¡´ã©–\"ç”æ¹—Üæ†": "\"뾯ië‡ç­ç‰»$ç²/4ka $åŒíœ´ï‹è¯‘zbAá©ê‡¸ç‘…&뵲衯ꎀᆿ7@ꈋ'ᶨH@á ´l+", "7뢽ëšv?4^ꊥ_⪛.>pởr渲<\/⢕疻c\"g䇘vU剺dஔ鮥꒚(dïŸv祴Xâ¼¹\\îºa8y5å†": true, "o뼄Bìšžç¾hrï·”í˜ë’šâ¿›U5pꪴfg!6\\\"爑ì䢱W<ï¶•î\\í…£ç‡oI/BK뺡'谑♟[Ut븷亮g(\"t⡎有?ꬊ躺ç¿è‰©nl F⤿蠜": 1695826030502619742, "ÛŠê¹–>ࡹ햹^ⵕ쌾BnN〳2C䌕tʬ]ì° ?ݾ2饺蹳ã¶êŒ­è¨\"â—¹á¬D鯎4e滨T輀ﵣ੃3\u20f3í‚™D瘮g\\擦+泙᧠鬹ﯨַ肋7놷郟lPå†{ß’hà§œr5,ê“‹": null, "á¿‹N$y{}2\\N﹯ⱙK'8ɜͣwt,.钟廣䎘ꆚk媄_î­®": null, "䎥eᾆá¦î‘§ì‰,JÞªn岪ã¥sî­•æ–謽䚔5tã¯ï–µï£šã°³ã±ŠZhD䃭f絕s鋡篟îža`Q鬃┦鸳n_é‚(E4è¿ _è§…ë·_宪D(NLî²ç–¶hL追V熑%]vè‚«=惂!㇫5⬒\u001fï²å–º4랪옑": { "2aè¼85먙R㮧㚪Sm}E2yîŠê†£ê«¨rRymã±è†¶á”¨\\tç¶¾A☰.ç„„ë™—9<쫷챻䒵셴᭛䮜.<\/慌꽒9å»Okä°ŠZ㥪幸k": [ null, true, {"쌞ì": { "â–ŸGL K2ië›±iï¼±\"Ì .옛1X$}涺]éŽæ‡ Ú¦ëŠ·?tfçŸÝžã‚Ÿ{": 1.227740268699265E-19, "ê’¶]퓚%ฬKâ…": [{ "(à·›@Ç®ã£ä§¼äµ¤[aテൖvEnAdUë –ë—ˆ@볓yꈪ,mÔ´|꟢ìº(而첸죕CX4Y믅": "2⯩㳿ꢚ훀~迯?᪑\\啚;4X\u20c2è¥B箹)ä¿£eá»»w䇄", "75༂f詳䅫ê§é¿ }3\u20b5'∓ä±è™€fè¼î‘”Iq鈆﨤gí©)BFa왢d0뮪痮Mé‹¡nw∵謊;ê§f美箈ḋ*\u001cî±ïœŸ`퇚í‹ä³«$!V#N㹲抗ⱉçŽ(V嵟ï«_bã³…\u0019": null, "e_m@(i㜀3ꦗ䕯䭰Oc+-ë ¨0뭦⢹苿蟰ê‚SVä°­å‹¢ë¥.ྈ爑Vd,á•¥=í€)vz뱊ꈊB_6듯\"?{ã’²&㵞뵫ç–ë¡ë¯ˆ%Qwé™,?\ræž®\"? N~癃ruà¡—dn&": null, "㉹&'Pfs䑜공j<\/?|8oc᧨L7\\pXá­ 9᪘": -2.423073789014103E18, "ä„瑄䢸穊f盈᥸,Bî§§ë¾§í‘—íšµB1쟢f\u001f凄": "é­–âš2儉j꼂긾껢嗎0ࢇ纬xI4]ï„(à©“`蕞;픬\fC\"æ–’\")2æ«·I﹥迧", "ퟯ詔xæ‚ë ¹+T?Bg⥄섅kOeQí¼ã»´*{Eé¼6æ°¿L缋\u001c둌๶-㥂2==-츫I즃ã ï–˜Lg踞ꙂEG貨鞠\"\u0014d'.ç¼—ï¡gI-lIb䋱ᎂDy缦?": null, "î’¢ç´Mã¦çŠ¿w浴詟棓쵫G:äœ?V2íž½7N*n&ã–ŠNd-'ຊ?-樹DIv⊜)g䑜9뉂ㄹí‘阉~ê…쵃#R^\u000bïž®B䌎䦾]p.䀳": [{"ϒ爛\"ꄱ︗竒G䃓-î†ã¾å¸³ã‚.j)qguæ‰å¾£à¨Zé¼—A9A鸦甈!kè”å–™:3Tî†%&ã ˜+,ä·ž|ì±½v䚞문H<\/醯rì…“ã¶¾\\a볜åºzEä·_죤ဵ뿰᎟CB": [ 6233512720017661219, null, -1638543730522713294, false, -8901187771615024724, [ 3891351109509829590, true, false, -1.03836679125188032E18, { "j랎:g曞ѕᘼ}链N", -1.1103819473845426E-19, true, [ true, null, -7.9091791735309888E17, true, {"}蔰鋈+ê¨å•µ0?g*사%`J?*": [{ "\"2wG?yn,ç™·BK\\龞䑞x?è ¢": -3.7220345009853505E-19, ";饹়â€)çš‹`噿焒j(3â¿w>å5Xè–™å©è¿3aFÆÃ": "2,ê“´g?_섦_>Y쪥션钺;=趘F~?D㨫\bX?㹤+>/믟kᠪ멅쬂Uzỵ]$ç§`mé›ç‘Šî’ඖ鯬cꙉ梢f묛bB", "♽n$YjKiXX*GOè´©éƒè±®ç¥´éžK醞眡}ê—¨v嵎꼷0à­¸+Mè‹eH徸Jîžê£†:â¼æ‚¥B켽迚㯃bè«‚\u000bjꠜ碱逮m8": [ "푷᣺ﻯd8ﱖ嬇ភHîªé¹Žâ¡±á±…0g:æžœ6$GQ췎{vá·§Yy-è„•xå¹ç ¡ï¨¬â®¸Cï§‚êš=軄H犠Gè°–ES詤Zè ‚3î§™lë´Ÿhï¿’7䦹1GPQG癸숟~[#é§¥8zQ뛣J소obg,", null, 1513751096373485652, null, -6.851466660824754E-19, {"ä©‚-â´®2Ù°K솖풄꾚ႻP앳1Hî³é·›wmR䗂皎칄?醜<\/&à §ã¬X濬䵈K`vJ륒Q/IC묛!;$vÏ‘": { "@-êš—xྐྵ@m瘬\u0010U絨ﮌé©\\켑寛넆T=tQã­¤Lì—°@脸삯e-ï–…î–‘:⩼u㎳VQ㋱襗ຓ<Ⅶ䌸cML3+\u001e_C)r\\9+Jn\\Pﺔ8蠱檾è…Pqé³è¯î¦§Tä„I": -1.80683891195530061E18, "á·­á‹»U~ཷsgSJ`᪅'%ã–”n5픆桪砳峣3ç®æž¾äŒ·âа呀ïŒ": { "Ş੉䓰邟自~X耤pl7间懑徛s첦5ਕXexh⬖鎥á€nNr(J컗|ૃF\"Q겮葲놔엞^겄+㈆è¯ã€¾í¬ç´G'E?飕1fâ¼í…¬æ‚šï•¦æ³¬ë¨Uç¬í›¶Qs": false, "î³…(\u20dag8í½íŠ£>^Y{뤋.袊䂓î†;_ïg]S\u202a꽬L;^'#î—™ë•bႌ?Cç·¡<ä²ä²æ–­ê6\u001asD7IK5Wxo8\u0006på¼Šâ¼‚ê¯æ‰µ\u0003`뵂픋%ꄰ⫙ë¶lå›å°›ïˆ®+ä—…E쟇\\": [ true, { "\n鱿aKã¡â’ã¼™2ì´¹f;`ì¾qIà¡”G}ã·äç“°w늮*ç²…9뒪ㄊCj倡翑閳R渚MiUO~仨䜶RꙀA僈㉋⦋n{ã–¥0딿벑î§é€¦â¥»0î¾®h薓쯴ê»": [ 5188716534221998369, 2579413015347802508, 9.010794400256652E-21, -6.5327297761238093E17, 1.11635352494065523E18, -6656281618760253655, { "": ")?", "TWKLꑙ裑꺔UE俸塑炌Ũ᜕-ï’‚o\"徚#": {"M/癟6!oI51niíš=댡>xê¨\u0004 ?": { "çš­": {"⢫䋖>u%wî²´ìž¼<ä•ê˜P䋵$é­‹æ‹U䮎緧皇Y훂&|羋ꋕ잿cJ䨈跓齳5\u001a삱籷I꿾뤔S8㌷繖_Yឯ䲱B턼Oæ­µF\\l醴o_欬6ç±=D": [ false, true, {"Mt|êžD|Fê¶£MQ뵕T,ëºk+?ãµi": [ 7828094884540988137, false, { "!༦鯠,&aﳑ>[euJê½ç¶·æB.h": -7648546591767075632, "-n켧嘰{7æŒæ¯„Y,>â螵煫乌pv醑Qå¶š!|âŒè²¬0왾ë¢ê…蛨S\\)ç«°'舓Q}A釡5#v": 3344849660672723988, "8é–ªéºV=鈢1녈幬6棉⪮둌\u207d᚛驉ꛃ'r䆉æƒà¥ˆ|bἧﺢᒙ<=穊强s혧eꮿ慩⌡ \\æ§³W븧J檀C,ᘉì˜0俯퀉M;筷ࣴ瓿{늊埂鄧_4æ¸Nn阼Jੵ˥(社": true, "oë¼€vwï…®)4A뢵(î¼±a䵢)p姃뛸\u000fK#KiQp\u0005ê…芅ì…îª": null, "ç ¥$ꥸ┇耽uæ–®Gc{z빔깎밇\\숰\u001eê´·å„㶇쵿_á´„+hç©¢p촀Ნ䃬zäé…³Ó‚31xꔄ1_ç šWë ˜G#2葊P ": [ -3709692921720865059, null, [ 6669892810652602379, -135535375466621127, "뎴iO}Z? 馢녱稹ᄾä©rSt帤넆&7ié¨ë©—ç•–ï”9誧鄜'w{Ͻ^2窭외b㑎粖i矪ꦨ탪跣)KEㆹ\u0015V8[W?⽉>'kc$䨘ᮛ뉻٬M5", 1.10439588726055846E18, false, -4349729830749729097, null, [ false, "_è ¢ã ^䟪/D녒㡋ỎCä’ˆíŒïŒ¢\u0006àªq@O펢%;é¹ìŒo戥~A[ꡉ濽ỳ&虃᩾è£å”™ï¤£èŒ¨Ig楡꒻M窓冉?", true, 2.17220752996421728E17, -5079714907315156164, -9.960375974658589E-20, "ᾎ戞༒", true, false, [[ "ⶉᖌX⧕홇)g엃⹪xëšç™Ÿ\u0002", -5185853871623955469, { "L㜤9ợㇶKé°â‹“V뽋˖!æ–«as|9"á¬ä†ª?î¾¶7胜&n薑~": -2.11545634977136992E17, "O8뀩D}캖qè‚6༣ã—䈓煮å½à¨†á޼Dᣘí›;": false, "YTá¡…^ï—Lã—ŽcbY$pᣞ縿#fh!ꘂb삵玊颟샞ဢ$ä—é¼’ëª~rkH^:닮먖츸륈⪺쒉砉?㙓扫㆕꣒`R䢱Bé…‚?C뇞<5Iޚ讳騕S瞦z": null, "\\RB?`mG댵鉡å¹ç‰©äµŽæœ‰5*e骄T㌓ᛪç¾é§’Ku\u001a[柆jUq8⋈5鿋츿myï»—?é›ux঴?": 5828963951918205428, "n0æ™…:黯 î¶·xu씪^퓞cB㎊á¬âº˜Ù¤Öƒ~B岚3㥕擄vᲂ~F?Cä¶–@$mï›~å¿”S왖㲚?챴⊟W#벌{'ã°Iä ç¸s樘\\X뢻9í•¡I6èㄛî‚î«8쯶]wॽ0L\"q": null, "x增줖j⦦tä¢áŽ™ïŠ­ã›¿Yf鼘~ê«“æ„4惊\u209c": "oOhbᤃ᛽z&Bi犑\\3B㩬劇䄑oÅ쨅孥ë©àº–acA㖫借ãžvg싰샂ãœ#譞⢤@k]鋰嘘䜾L熶塥_<\/â¾å±ˆï®Š_mYè¹t뙺}Ox=wé®®4S1ê©ï¬¾'å·‘", "㗓蟵ꂾe蠅匳(JPä—à·¸\u0089耀왲": [{ "ᤃ㵥韎뤽\r?挥O쯡⇔㞚3ä¼–\u0005Pî•⋪\"Dê¶£QLn(⚘罩䩢Ŏv䤘尗뼤ë›O淽鋋î¡é—šrå´©a{4ç®™{煷m6〈": { "l곺1L": { "T'ਤ?ç …|੬Km]ä„©\"(à¿¶<\/6U爢䫈倔郴l2ã´±^줣k'Læµ–Lé°„Rp今鎗⒗Cì–¨Mí›ã¡§Î˜X粜뫈N꤇輊㌻켑#㮮샶-ä—룲è ç™œã±V>=\\I尬癤t=": 7648082845323511446, "鋞EP:<\/_`á§e混ㇹBd⯢㮂驋\\q碽饩跓྿ᴜ+j箿ë ã—‘yK毢宸p謹h䦹乕U媣\\炤": [[ "3", [ true, 3.4058271399411134E-20, true, "æ€+憱f逮@먻BpW曉\u001aã£âŽŠ$n劈D枤㡞좾\u001aá›ïŒƒè‹”౩é—1B䷒Ṋ݋âžê€žêƒç£$t੤_:蘺⮼(#N", 697483894874368636, [ "vᘯ锴)0訶}䳅⩚0O壱韈ߜ\u0018*Ué¾ä–=䧉뽑å•휻ID쿇嘗?ꌸῬ07", -5.4858784319382006E18, 7.5467775182251151E18, -8911128589670029195, -7531052386005780140, null, [ null, true, [[{ "1欯twG<\/ï†Q:0怯押殃탷è«ì‚¬<ỗꕧ蚨ä¡ï¨î³‰nDꌕ\u001cë…¬~蓩鲃g儊>ê¡l㻿/â‘·*ì±³6㻜W毤緛ﹺᨪ4\u0013뺚J髬e3쳸䘦伧?æª&{L掾p+꬜MäŠd娘6": { "2p첼양棜h䜢﮶aQ*c扦v︥뮓kC寵횂S銩&Ç{O*य़iH`Uí…à¡“rä©•5ꄸ?`\\á§«?ᮼ?t〟崾훈kè–ì/iy꤃뵰z1<\/AQ#ë¿©8jJ1z@u䕥": 1.82135747285215155E18, "ZdN &=dë…„á…†'ì‘â…‰:烋5&áŸï”‹á„‚汎æ¥L㯄固{é’§u\\ãŠíŠšeæ‘‘&tå—„ê–„UbâŒ?m䴘熚9EW": [{ "ଛ{i*a(": -8.0314147546006822E17, "⫾ꃆY\u000e+W`௸ \"Më’¶+\\ë·lKE}(NTí‚¶Yjé¸ç¯’î©¥ì¶'jNQ硾(똡\\\"逌â´y? IRꜘ὞鄬﨧:M\\fâ ‹Cꚜ쫊ᚴNV^Dä•—ã…–á¼”Iao꿬Câ8": [ 287156137829026547, { "H丞N逕⯲": {"": { "7-;枮阕梒9á‘„Z": [[[[ null, { "": [[[[ -7.365909561486078E-19, 2948694324944243408, null, [ true, "荒\"并孷䂡쵼9o䀘F\u0002龬7⮹Wz%厖/*? a*R枈㌦ë¾g뒠䤈q딄㺿$쮸tᶎ릑弣^éŽ<\/Y鷇驜L鿽<\/ì¶‹9Mᲆឨ^<\/庲3'lë‚¢", "c鮦\u001bë‘\\~?眾ಢu݆綑෪蘛轋◜gȃ<\/â´ƒcpkDt誩܅\"Y", [[ null, null, [ 3113744396744005402, true, "v(y", { "AQ幆h쾜O+꺷铀ꛉ練A蚗⼺螔jãŒ3꽂楎䥯뎸먩?": null, "蠗渗izé±–w]擪E": 1.2927828494783804E-17, "튷|䀭n*曎b✿~æ¤U]î­¡Gz鄭kW|ã´š#㟗ഠ8u擨": [[ true, null, null, {"⾪壯톽g7?㥜ώQê‘㦀æƒã§½î“¡ä¼“\\î¦*᧰閖樧뢇赸N휶䎈pIæ°‡ï®é•Šmaᬠ탷#X?î³A+kÐM ༑᩟Ø?5꧎鰜ṚY즫궔 =ঈî³;ﳈ?*s|켦蜌wM笙莔": [ null, -3808207793125626469, [ -469910450345251234, 7852761921290328872, -2.7979740127017492E18, 1.4458504352519893E-20, true, "㽙깹?ë¨ä†¢:ä´ŽÛ»gæ® JBTU⇞}ꄹꗣi#Iî’¡ëµ£é‰r혯~脀ìƒ#釯:场:ä”>ä°®o'ã¼½HZ擓௧nd", [ 974441101787238751, null, -2.1647718292441327E-19, 1.03602824249831488E18, [ null, 1.0311977941822604E-17, false, true, { "": -3.7019778830816707E18, "Eå³¾æ†èŒ6xLIm縂0n2视֯J-ᤜz+ᨣè·mYDè±ç¹¹â¹ºäŠ“ëª“ï´€E(@è©®(!ï’Y膽#᎙2䟓섣A䈀㟎,囪QbKæ’wcG湎ꤧtGì—xâ¥ä¿Žj'A一ᯥ뛙6ㅑ鬀": 8999803005418087004, "よ殳\\zDâ§…%Y泥簳Uꈩ*wîRL{3#3FYHା[d岀䉯T稉駅䞘礄P:é—ˆWæ€ElBã¤å–¬èµ”bGä ¼U଄Nw鰯闀楈ePsDꥷ꭬⊊": [ 6.77723657904486E-20, null, [ "ཚ_뷎꾑è¹q'㾱ꂓ钚蘞慵렜떆`ⴹ⎼櫯]J?[t9Ⓢ !컶躔I᮸uz>3aã •i,錃L$æ°°í…°@7ë…«W㸮?ç¾§W뇧ꃞ,î—‘N鋮숪2ɼì½â”ä²6", "&y?뢶=킕올Za惻HZk>c\u20b58i?ꦶcfBv잉ETî…9jä¡¡", "imçŠÕƒbì¹§æ ¡\\뼾쯀", 9.555715121193197E-20, true, { "<㫚v6腓㨭e1ã•”&&V∌ᗈT奄5Lጥ>탤?튣瑦㳆ꉰ!(ᙪ㿬擇_n쌯IMá¿‹î£ã•¨â°æ«ˆá±·5풔蟹&L.ì²½e鰷쯃劼﫭b#ï­¶í“€7ë·„Wr㢈๧Tʴશ㶑澕é%": -1810142373373748101, "fg晌o?߲ꗄ;>C>?=鑰監侯Ktêµ…": true, "䫡蓺ꑷ]C蒹㦘\"1à°ƒ@å‘«\u0014NLä¾egå‘®á³,r$裢k>/\\?ㄤᇰﻛ쉕1஥'ÄŠ\" \\_?쨔\"ʾr: 9Sä˜ç¦ºáª§ê„‚㲄", [[{ "*ç¡™^+E쌺I1䀖ju?:⦈Ꞓl๴竣迃xKC/饉:\fl\"XTFᄄ蟭,芢<\/骡軺ëœhê˜\u001f銿<棔햳▨(궆*=ä¹¥b8\\媦ä·€ë«}닶ꇭ(Kej䤑M": [{ "1á¬?>옿Iâ•…C<ÞŽ?ꊌ冉SV5A㢊㶆z-๎玶绢2F뵨@㉌뀌oå¶”f9-庒茪ç“ë·³4": null, ";lá°³": "CbB+è‚»aä„·è‹*/볳+/4fq=ã°h6瘉샴4é“¢Yéª.⌖@哼猎㦞+'gꋸ㒕ߤï—ãž‘(ä¶’è·²tiâ‘´aî¥ç¡‚#Noë³”", "t?/jE幸YHT셵⩎Kî¹!Eq糦ꗣv刴w\"l$ο:=6:ç§»": { "z]鑪醊嫗J-Xm銌ç¿çµ¨c里ëç‚™Ep㣋é£ë˜¼åšŒä€“GPï¹–cmf4é¹­T䅿꣭姧â¸wy6ꦶ;S&(}ᎧKxᾂQ|tï¹ë»³k\"d6\"|Mlì·†hwLtê¼¼4$&8Պ褵婶鯀9": {"嵃닢ᒯ'î–›dá§«ä³³#Nî‡Xe3-붋鸿î¢à¬¢ë–“î§ž%dK\u0013䲎ê–YV.裸Râ‰rR3蟛\\:ì ¯:å—ĺLʆ넕>|텩鴷矔ꋅⒹ{tå­¶ã“‘4_": [ true, null, [ false, "l怨콈lá’", { "0wä²å¬§-:`䉅쉇漧\\Ü‚yㄨb%㽄j7ᦶ涶<": 3.7899452730383747E-19, "ꯛTẀq纤qå¶Vâ¿£?\"g}ი艹(쥯B î­T騠I=仵ë°X": {"KX6颠+&á…ƒ^fç•’y[": { "H?뱜^?꤂-⦲1a㋞&î‘®êƒç²¾Ii᤾챪咽쬘唂쫷<땡劈훫놡o㥂\\ Kâ´™Dç§¼Fæ°®[{'좴:례晰Iq+Iì­¥_T綺砸GOç…䟪ᚪ`î‘↹l羉qì¼Dê½áœ…훦: vUV": true, "u^yï³0㱓#[y뜌앸ꊬLã·©?蕶蘾â»KӼ": -7931695755102841701, "䤬轉車>\u001c鴵惋\"$쯃྆⇻në½€Gæ° Såª]à²²ê¨æ‡Qxኻ椕駔\\9ࣼ﫻ìœç£¡ï©ˆëºªá¶šë³l㕆t+sζ": [[[ true, false, [ null, 3363739578828074923, true, { "\"鸣詩 î›ë³°ã‘µgLã¯¦á¿…ì¶æ—«}ED辗ﮈI쀤-ꧤ|ã ¦Z\"娑ᕸ4çˆé¨ã£\"]ì³Af]茛⬻싦oèšk䢯ä©è½3廇喑ޅ": 4.5017999150704666E17, "TYႇ7ʠ值4챳唤~Zo&Ý›": false, "`å¡„J袛㭆ëºã³€N㺣`ê½å¶¥Kï¯SVᶔ∲퀠ç¾N딂X\"á¤hNﬨvI": {"\u20bbã­˜I䖵䰼?sw䂷쇪]î(泒f\"~;꼪FÔsá¦": {"p,'ꉂ軿=Aèš¶?bƉãµä…°è«¬'LYKL6B깯⋩겦뎙(ᜭ\u0006噣d꾆㗼Z;ä„äš”cd<情@äž‚3苼㸲U{)<6&ꩻ钛\u001au〷N숨囖愙j=BXWìš•^x芜å á¿™çˆ‚ë›·ê’»t✘Q\b": [[ "ç±›&ଃ䩹.ꃩ㦔\\C颫#暪&!勹ꇶ놽攺J堬镙~軌C'꾖䣹㮅ï¶å²ƒá™´éµ£", 4.317829988264744E15, 6.013585322002147E-20, false, true, null, null, -3.084633632357326E-20, false, null, { "\"짫愔昻 Xï«\"è—£j\"\"ë¨à½…ѻ㘤㬯0晲DU꟒㸃dë²€î¢ìœ’l䦾cà©»*3": null, "è°ˆWm陧阦咟ฯ歖擓Nå–´ã‹éŠ­rCCnVࢥ^♼Ⅾ젲씗刊Sà¼+_tèµ”\\bäšë‰¨ê¬«6펛cL䊘᜼<\/澤pF懽&H": [ null, { "W\"HDUuΌ퀟M'P4à¿°H똆ⰱﮯ<\/å‡è˜²\"C鴫ﭒж}ꭩ쥾t5yd诪ﮡí‰â´°@?æ°é†³rj4I6Qt": 6.9090159359219891E17, "絛ﳛ⺂": {"è«°Pã—®î˜è¦`ZQ?ꫦh*à´±cbâ§±}埌茥h{棩렛툽o3é’›5é®l7Q榛6_g)ὄ\u0013kj뤬^爖eO4Ⱈ槞鉨ͺ订%qX0Tì—å«·$?\\\"봅늆'%": [ -2.348150870600346E-19, [[ true, -6619392047819511778, false, [[ -1.2929189982356161E-20, 1.7417192219309838E-19, {"?åµ²2à¿2\u0001啑㷳c縯": [ null, [ false, true, 2578060295690793218, { "?\"殃呎ïˆ#ã‘‘F": true, "}F炊_æ®›oU헢兔êˆ,èµ­9703.Bæ•°gTz3â¬": { "5&t3,í–“Mݸᵣ㴵;꣫ä©â†³#ï¢@ë«·ä …ï¦+W-ࣇzᓃ鿕ಔ梭?T䮑ꥬ旴]u뫵막bBè®:왳둛lEh=숾鱠på’î›î­ˆ$ì§#?gâ¹·á—Švã·µ.æ–ˆu頻\u0018-G.": "ë½™m-ouࣤ஫牷\"`Ksꕞ筼3HlȨvCï¢î›¦å ˆ\"I]㖡玎r먞#'W賜鴇k'c룼髋䆿飉㗆xgå·¤9;芔cáŒ/ax䊨♢í“rå“㸫೼䢗da᩾\"]å±£`", ":M딪<䢥喠\u0013ã–…x9è•ã‘‚XO]f*Q呰瞊å­VP@9,㨣 D\\穎vˤƩs㜂-曱唅L걬/롬j㈹EB8g<\/ì„©o渀\"u0y&룣": ">æ°ç·©L/ä•‘ë¯êŸ˜îŸ”蕞^aBë’£+0jK⪄瑨痜LXK^힦1qK{æ·št츔X:Vm{2rçB뾄H첚7æ°¥?쉟䨗ꠂv팳圎è¸é½€\\", "D彤5㢷Gꪻ[lㄆ@὜⓰絳[ଃç½ì®¹â˜’[*0ꑚ㜳": 9022717159376231865, "Ò–aV銣tW+$é­¿\u20c3ïœäºœ~ë«¡ᙰ禿쨽ã¡fá¹¼zE/h": "5è‡ï’Œã‹‡á²¯ì®º? 昨탰Wム밎#'\"崲钅U?幫뺀â¾@4kh>騧\\0Ò¾EV=çˆî©®ÍŒUæ€%ꉼ 㮋<{j]{R>:gÔ©L\u001c瀈锌ﯲﳡꚒ'â«¿E4æšãŒ—뵉X\"Háœ", "ᱚגּ;s醒}çŠSἿ㦣&{T$jkB\\\tḮ앾䤹o<é¿(tW": "vb⯽䴪䮢@|)", "⥒í껉%惀뗌+녣迺顀qæ¢g⚯i⤭ë£Mç¹j̈́⽜A": -8385214638503106917, "逨ꊶZ<\/W⫟솪㎮ᘇb?ê ”i\"H㧺x෷韒Xꫨฟ|]窽\u001a熑}Agn?Má¶–a9韲4$3á»´^=ì煤áë·2䣃%ï…Žé· /eQ9頸쥎", 2398360204813891033, false, 3.2658897259932633E-19, null, "?ꚃ8Nnãž·å¹µd䲳䱲뀙ꪛQ瑓鎴]î’¶ä©‹-é°¾æ¡ï¾ä³¡??掊", false, -1309779089385483661, "ᦲxu_/yecR.6èŠ.áœ‡éŽ ~", -5658779764160586501, "ì’Œ:æ› =lìœä¢œwk#s蕚\"互㮉m䉤~0ë“䋙#Gîš¿;h숄옥顇෤勹(C7㢅雚ã¯Lâ …VVç°…<", null, -4.664877097240962E18, -4.1931322262828017E18, { ",": { "v㮟麑䄠뤵g{Më®.\u001bzt뢜뵡0Ǥ龍떟Ᾰ怷ϓRT@Lꀌ樂Uã â¾•e扉|bJg(뵒㠶唺~ꂿ(땉x⻫싉ìŠ;%0鎻V(o\f,NéŠ%nk郼螺": -1.73631993428376141E18, "쟧摑繮Q@Rᕾ㭚㾣4隅待㓎3è’Ÿ": [ 4971487283312058201, 8973067552274458613, { "`aæ™á£—î\u0015iBo¸": 4.3236479112537999E18, "HW&퉡ãåœïŸ†Y?ç‘¡Qyí›q!帰ï©s舠㫸zêš—aSæ­²v`G株巷Jp6킼 (ê·¶é”â¾î‹¥â¡ˆ>Mæ±ãžá‰´ê™²dv@i㳓ᇆ?é»": [ null, 4997607199327183467, "E㻎蠫á¾é«˜ä™Ÿè˜¬æ´¼æ—¾ï« í…›ã‡›?'M$㣒蔸=A_亀绉앭rN帮", null, [{ "Eᑞ)8餧A5u&ã—¾q?": [ -1.969987519306507E-19, null, [ 3.42437673373841E-20, true, "eê±·Må¢\"割Pâ›í§åŽ€R䱜3ï»´Oí“«r﹉⹊", [ -8164221302779285367, [ true, null, "爘y^-î¬?蘞Ⲽꪓaâ…ê¨}I", 1.4645984996724427E-19, [{ "tY좗⧑mrzïºã¿¥â´–᥷jè«…\u0000q賋è­êž„â®±S\nà¡£B/íƒêµª3ZÉ‘å¤o<\/;ë¡‹": null, "彟hæµ _|V4䦭Dᙣ♞uì¿»=ì‚®ã¦\u001e哀鬌": [{"6횣楠,qʎꗇ鎆빙]ã±­R굋鈌%æ ²j分僅ペ䇰wí¦î¼‹p蛃N溈ê¡ê€?@(GI뉬$ﮄ9èªê“š2e甸ڋ[äº,\u0011\u001cࢃ=\\+衪䷨ᯕ鬸K": [[ "ㅩ拏鈩勥\u000etgWVî–¨Xs陂è¦p狵w퓼{뮵_i\u0002ퟑႢâ¬d6é‹«F~챿æŸ\u0096äš¼1ۼ칥0꣯å„=鋷牋ⅈêžé¾", -7283717290969427831, true, [ 4911644391234541055, { "Iî¹éˆ’ì²½P릜朸W徨觘-HᎄíŸâ“º>8kr1{ê²µäƒã€›á¬¡Ì¨Oê·‘oä•'쿡鉕p5": "fvç²–RNçž–è›a?q꤄\u001d⸥}'ꣴ犿ꦼ?뤋?鵆쥴ë‹ä¡«s矷̄?à¶£/;괱絢oWfV<\/\u202cC,ã–¦0䑾%nè³¹g&T;|lj_欂N4w", "짨䠗;䌕u i+rà¹0": [{"9ä¥\\à°©8\"馇z䇔<\/á‚¡Y3e狚ì¡\"ุ6ï°†Zé–c\"Ll:ïŠê®¾ç–£<\/᭙O◌납୕湞9⡳Und㫜\u0018^4pj1;ä§å„‚ä—·à­—>@e톬": { "aâ‘‚Fé‹»Qèž°'<퇽Qè´ç€§{ᘪ,cP&~䮃Z?gI彃": [ -1.69158726118025933E18, [ "ê¶‚z簽㔛㮨瘥⤜䛖Gℤ逆Y⪾j08î±²Sn昞ꘔ캻禀鴚P謦b{ê“®mNéMᥙ5\"ç2냑I\u0011.L&=?6á„ ë»·X鸌t刑\"#z)o꫚n쳟줋", null, 7517598198523963704, "ኑQp襟`uá©„ræ–¹]*F48ꔵn俺ሙ9뇒", null, null, 6645782462773449868, 1219168146640438184, null, { ")ယ넌竀Sdä°¾zqâ«£âŒÊ¥\u0010á¿“' |磪&p牢蔑mï³V蘸૰짬꺵;K": [ -7.539062290108008E-20, [ true, false, null, true, 6574577753576444630, [[ 1.2760162530699766E-19, [ null, [ "顊\\憎zXB,", [{ "㇆{CVC9ï¼MN㜋ઘR눽#{h@ퟨ!鼚׼XOvXS\u0017á£=cS+梽៲綆16së½íœy屬?ᇳG2á´­\u00054쫖y룇nKcW̭炦s/鰘ᬽ?J|퓀髣n勌\u0010í™ P>j": false, "ç®´": [ false, "éžj\"ꮾ*엇칬瘫xṬ⭽ì©äƒ³\"-⋵?ᦽ댎Ĝ": true, "Pg帯佃籛n㔠⭹࠳ë·â‰»à¿Ÿ3ãž±ï“!î—-ì’¾!}쭪䃕!籿næ¶»J5ਲ਼yî˜vy;Rኂ%ᔡጀ裃;M⣼)쵂쑈": 1.80447711803435366E18, "ꈑC⡂ᑆ㤉壂뎃Xub<\/쀆༈憓قì¨×§\\": [ 7706977185172797197, {"": {"K╥踮砆NWࡆFy韣7ä밥{|紒︧䃀榫rᩛꦡTSy잺iH8}ퟴ,M?Ʂ勺ᴹ@T@~꾂=I㙕뾰_涀쑜嫴曣8IY?Ò¿o줫fऒ}\\S\"ᦨ뵼#nDX": { "♘k6?଱癫d68?㽚乳䬳-Vé¡·\u0005è•?\u0018䞊V{邾zã˜l]é›k臤~ൖHë’iꢥ]g?.G碄懺䔛pR$ä…’X觨lë´œA刊8R梒',}u邩퉕?;91Eî¦a䈈ë¯G⊶芔h袪&廣㺄j;ã¡ç¶½\u001bN頸쳘橆": -2272208444812560733, "æ‹‘Wﵚî²j鵼駳Oࣿ)#ã¾…é¡‚N傓çºy僱栜'Bê-!KF*ꭇK¦?䈴^:啤wG逭w᧯": "xᣱmYe1Û@霄F$ě꧘푫O䤕í€Pq52憬ꀜ兴㑗ᡚ?ï—ƒLé·íŸî—¼ë­zJê‘™}╆ᅨJB]\"袌㺲u8䯆f", "꿽á…㔂긱Ǧ?SI": -1669030251960539193, "ì‡É¨`!葎>瞺瘡驷錶â¤ï»®é…œ=": -6961311505642101651, "?f7♄꫄Jᡔ훮eì‡îª¼í¾á£ä­´KhखT;Qty}O\\|ë«Iá¿’Ne(5æƒê¥¶ã†·Y9ﮡ\\ oyâ­–-䆩å©m#xë´‰>Y鈕Eç–£s驇↙ᙰm<": {"퉻:dê‚&efᅫ쫢[ï„™\"ëˆëŠ–êº™|Ôå‰1Í–-K:Êšá­•/;ì–㷛]Iç—èŒ4gZ4âœkเꛘZ⥺\\Bʫᇩ鄨魢弞&幟ᓮ2̊盜", -9006004849098116748, -3118404930403695681, { "_彃Y艘-\"Xx㤩㳷瑃?%2ä¡éµ›o귵옔夘v*탋èŒ&㳈챗|Oé’§": [ false, "daꧺdᗹ羞쯧Hã¤é„³é ³<型孒ン냆㹀f4ã¹°\u000f|C*ሟ鰠(O<ꨭ峹ipຠ*yà³§4VQè””hVæ·¬{?ᵌEfrI_", "j;ꗣ밷é‚副]á—“", -4299029053086432759, -5610837526958786727, [ null, [ -1.3958390678662759E-19, { "lh좈T_ë¯Y\"伨\u001cꔌG爔겕ꫳ晚è¸â¿»ìT䯎]~e#฽燇\"5hٔ嶰`泯r;ᗜ쮪Q):/tç­‘,榄&5ï¤ëŽ«ç‹(": [{ "2áâ“›]r3C攟וּ9è³µsâ›”6'ஂ|\"ⵈ鶆ä¹ç¦3\"痰ࢤéœäµ©ì˜†äŒ€?æ •r7Oç°‚Isd?K᫜`^è®¶}zî°’8?zì–°î§T:X倫⨎ꑹ": -6731128077618251511, "|︦僰~m漿햭\\Y1'Vvخ굇á‰ì±¢cè¶–": [null] }], "虌魿閆5⛔煊뎰㞤ᗴꥰF䮥蘦䂪樳-Ká·-(^\u20dd_": 2.11318679791770592E17 } ] ] ]}, "묗E䀳㧯᳀逞GMc\bï•¹å¢¹ã“„ë–Æ &U??íŽŒé‘ åª‹k))ᄊ": null, "묥7콽벼諌J_DɯﮪMæ®´ä£,煚ྼ`Y:ì”§<\/â©«%yf䦀!1á²¶kì¶ŽQç±³W∠WC跉鬽*á›±iã´•L꘻ê€ì“ª\"_gé¿„'#tâ½™?,Wg㥖|D鑆eâ¥ìª¸åƒ¬h鯔咼ඡ;4TKèŽî¾‘졠嫞" } ] ] } ] ] ]}} } ]} }, "뿋뀾淣截䔲踀&XJ펖꙯^Xb訅ꫥgá¬>棟S\"혧騾밫ê²7-": "擹8C憎W\"ìµ®yR뢩浗絆䠣簿9äˆå¼•Wcy䤶孖ꯥïž;íŒ]輩ä3@{å 뽸0ï€á¡ˆìµ¡î›„Ⲇ\u001dLåŒê§2F~ݕ㪂@W^é½L襒ᦘî¢~沦zZ棸!꒲栬R" } ] ], "Z:ëƒàµ›5Iz찇䅄駠㭧蓡K1": "e8᧤좱U%?ⵇ䯿é¿\u0013縮R∱骒EO\u000fg?幤îš@֗퉙vU`", "äƒìªˆï‘’埽້=Ij,쭗쓇చ": false }]}} ] } ]} } ] ] ], "咰긖VM]á¼6䓑쇎çºetDÒŒ?ãžê©„퇫밉gj8è ƒ\"â©5䛹1ࣚ㵪": "ക蹊?⎲⧘⾚̀I#\"䈈⦞ë·`wo窭戕෱휾䃼)앷嵃꾞稧,Ⴆ윧9S?೗EMk3Მ3+e{â¹”Te驨7äµ’?타Ulg悳o43ï“¢" } ], "zQᤚ纂땺6#ٽ﹧vï¿¿#ࠫ휊冟蹧텈ꃊʆ?&a䥯Deæ½|ì¿“pt瓞㭻啹^盚2êŠf醪,ì–T窧\\Di䕎谄nn父ꋊE": -2914269627845628872, "䉩è·|㨻ᷢã‰B{蓧瞸`î°²I!℄욃힕#ೲᙾ竛ᔺCjk췒늕貭è¯\u0017署?W딚%(pê⤼ë³^=on뺲l䆼bzrﳨ[&j狸䠠=ᜑꦦ\u2061Õµnj=牲攑)Mî»\\é¾": false, "뎕y絬᫡⥮Ϙᯑ㌔/NF*Ë“.ïž¿,QEzvK!Iwz?|쥾\"ê©»Lê¼—Bê”§è³´ç·œs뉣隤茛>ロ?(?^îµ­`>冺飒=噸泥⺭Ᲊ婓鎔븜z^å·è£®Ãªâ“…à»—jM7ﶕ找\\O": 1.376745434746303E-19 }, "ä›ræ»–wã¤,|Nዜ": false } ]], "@ê¿™?è–•å°¬ gd晆(ë„5躕ﻫS蔺4)떒錸ç“?~": 1665108992286702624, "wë¯ná =`঺ᅥC>'從ë槷ä¤çœ·èž„ãŽ»æ°æ‰°XᅧCè´½uáƒë‚ŸjKD03T!lDV쀉Ӊy뢖,袛!终캨G?鉮Q)â‘—1쾅庅O4ê‰H7?d\u0010蠈줘월Þ粯Q!낇껉6í…|{": null, "~Ë·jg쿤촖쉯y": -5.5527605669177098E18, "펅Wᶺzê†ã¨í‘­e?4j仪열[D<鈑皶婆䵽ehS?袪;Hê¨Më—Žã°[(å—M3qíŸg4y╸鰧茀[Bi盤~ï«å”Žé‹†å½ºî½«â¦Šq?î–³B4쉓癚O洙킋툈䶯_?ퟲ": null } ] ]] ]], "꟱Ԕã¤7æ›ï¦—ಃéŒVä·°?v㪃૦~K\"$%请|ꇹn\"kä«›ã¨é²¨\u2023ä„¢\u0004[︊Vï‹•J?䶟ាꮈ䗱=깘U빩": -4863152493797013264 } ]}]} ] }}} ], "ì·ì²Û¹í‰ƒ~aEå”™a챑,9㮹gLHd'ä”|í‚—ãžäŽ¥&KZYTë§µ7䥺Nâ±³åŒèŽžé¿§w\\༌疣n/+ꎥU\"å°ëž¾â—‹íŸ™AJá­Œ?9ä›$?é©”9è®ì§˜é­¡TÖ¯cè—³`虉Cì‡ì¦T" } ], "è°¶ê°œgTRï¿>áµÍšdtæ™‘ä‰‡é™æ»º}9㉸P漄": -3350307268584339381 }] ] ] ]] ] ], "0y꟭馋X뱔瑇:䌚ï¿å»¿jîžg-懲鸭䷭垤㒬茭u賚찶ಽ+\\mT땱\u20821殑ã„J쩩䭛ꬿNSæ½”*d\\X,壠뒦e殟%LxG9:摸": 3737064585881894882, "í’µO^-â§§â…¶vѪ8廸鉵㈉רâ†Q㿴뺟EႳvNM:磇>wî·/៻唎뷭୥!냹D䯙iëµ±è²C#⼉NH6`柴ʗ#\\!2ä‚—â±§f?諳.Pëˆ-è¿”I꘶6?8î“ê˜": -8934657287877777844, "溎-è˜å¯ƒi诖ര\"æ±µ\"\ftl,?d⼡쾪⺋h匱[,à·©I8MÒ§F{kç“¿PAî…§'橸ꩯ綷퉲翓": null } ] ], "ោ係Øî½<å…ƒ": 1.7926963090826924E-18 }}] } ] ]]}] }] ] ] ] ], "ጩV<\"Ú¸sOᤘ": 2.0527167903723048E-19 }] ]} ] ]], "∳㙰3ì ´pá§—ä±™?`yZA8Ez0,^á™›4_0븢\u001ft:~䎼s.bb룦明yNP8弆Cå¯;⪾ì§'蕴뮛": -6976654157771105701, "íµê¦€\\㇑:nî‹™v+뒤燻䀪ﴣï·9ᚈ኷K㚊誦撪䚛,ꮪxሲ쳊\u0005HSf?asg昱dqꬌVꙇ㼺'k*'㈈": -5.937042203633044E-20 } ] }], "?}\u20e0],så¶³è‹@#2uì’´sQSä©—=ꥮ;烌,|ꘔ䘆": "á…©ì˜Nç’ kZ먕眻?2ቲ芋眑D륟渂⸑ﴃIRE]å•—`K'" }}, "쨀jmV賂ﰊå§ä‚¦çŽžã¬™áªM᪟ïՎ씜~`uOn*ॠ8\u000ef6??\\@/?9見d筜ﳋB|Sä¬è‘«ã½o": true }, "즛ꄤ酳艚â‚㺘봿㎨iGà§•à¡¿?1\"䘓您\u001fSáŠâº¿æºzៀ뻤B\u0019?ìœa䳵᭱䉺膷d:<\/": 3935553551038864272 } ] ]} ]] ]] ]} } ] } ]]}}, "᥺3h↛!ê‹°y\"攜(ெl䪕oUkc1A㘞ᡲî촾ᣫ<\/ä’ŒEã›æ½¨i{ï  v?Wà±¾H\\RჅpzè¬R脾;v:碽✘↯삞鷱o㸧瑠jcmK7㶧뾥찲n": true, "ⶸ?x䊺â¬-ä°…â‰!e쩆2ꎿ准G踌XXᩯ1ß}0?.í—€Z馟;稄\baDꟹ{-寪⚈ꉷ鮸_L7ƽᾚ<\u001bጨA䧆송뇵⨔\\ç¤ë—”d设룱㶉cq{Hyã±R㥽å¢ï¬…p": -7985372423148569301, "ç·«#ì½®IB6<\/=5Eh礹\t8럭@饹韠r㰛斣$ç”LVì·a갵îŸ'请o0g:^": "䔨(.", "ë³â„¡åœ¤pï¾à¯„Ä倧訜BìŸGä™”\"Sbâ“®;$$â–S1J뢙SF|赡gï„€*\"Vu䲌y": "䪈&í‹),\\kT鬜1í’¥;ë·´'Zေ䩹@Jéž½Nã¼M?å¥eWb6榀ƩZڮ淽⺞삳煳xჿ絯8eâ¶ç¾·V}ჿ쎱䄫R뱃9Z>'\u20f1â“•äœé½®" } ] ]]] }} } ] ]}, "펮b.hç²”í¯2npXè©«g錰鷇㇒<ì™S値bBi@?镬矉`剔}c2壧ଭfhY깨R()痩⺃a\\â”?M&ﯟ<劜꺄ï‘멊ᄟA\"_=": null }, "~æ½¹Rqn榢㆓aR鬨侅?䜑亡V_ç¿…ã­”(ä“·w劸á³Dp䀅<\/ï°Žé¶Šm䵱팱긽ꆘ긓准D3掱;o:_Ñœ)껚콥8곤d矦8nP倥ꃸI": null, "뾎/Q㣩㫸벯➡㠦◕挮aé¶§â‹“å¼\u00001뱓fm覞n?㛅\"": 2.8515592202045408E17 }], ",": -5426918750465854828, "2æ««@0柡g䢻/gꆑ6演&D稒肩Y?艘/놘p{f투`飷ᒉ챻ëŽîª–<늛ä˜ï´¡ì¤°ì«„": false, "8î™–(鸑嵀⵹ퟡ<9㣎Tߗ┘d슒ل蘯&㠦뮮eà kç g ì—»": false, "d-\u208b?0ﳮ嵙'(J`蔿d^踅⤔榥\\Jâµ²v7": 6.8002426206715341E17, "ཎ耰í“ê•ï’ã±·\u0013y=詽I\"盈xm{0쾽倻䉚ષso#é°‘/8㸴짯%ꀄ떸b츟*\\鲷礬ZQå…©?np㋄椂榨kc᡹醅3": false, "싊j20": false }]] ]], "ä¿›\u0017nç·½Tu뫉èœé¼Ÿçƒ¬.ï‘ꭠIâ°“\"Ἀ᜾uC쎆J@å¤%ê›m뻨ᾀ画è›íœƒT:錖㑸ዚ9죡$": true } ] ], "ãµâ‡˜ê¦–辈s}㱮慀밒s`\"㞟j:`ií”»Zì„«^諎0Ok{켿æ­à·£èƒ°a2﨤[탳뚬쎼嫭뉮m": 409440660915023105, "w墄#*ᢄ峠밮jLa`ㆪ꺊漓Lã§ëŽ!Agkï¹ï¾'ê›ë¢ƒã¯å²¬D#ã’¦": false, "ଦPGI䕺L몥罭ꃑ궩﮶#⮈ᢓӢ䚬p7웼臧%ï‘¥~Sè âŒíž€6îž’&t䳙y㪘ëƒ\\*;é‰ï¿Šé¿µ'å—•pa\"oL쇿꬈Cgî“": "ã¶½1ç¸D⟸䴅ᆤ뉎﷛渤csî¸x ä”цꬃ锚æ¬?ຽ+x~꘩uI࡞\u0007æ ²5呚ẓem?è¢\")=㥴䨃pac!/æŽY", "á·±o\\||뎂몷r篙|#X䦜I#딌媸픕åžRDæ–³X4t⯩夬=[ï‹ë­²r=绥jhë·±ì¸âª˜%]⚋܈㖴スHí…¹m(WOæ›åЉ0~K3c柢Õã‰ïªªé€³~": false, "ç…½_qb[첑\\륌wEâ½Ztï”´CNï­+餌ᕜOê›­": "{ﳾ쉌&s惧á­âµ†3䢫;䨞팑ï›ê’ªí˜è¤€à¢–Qä ¿V5뭀䎂澻%ë°›u5í…¸oA⮥U㎦;B䳌wzä•™$áž¿\\௅婺ëµâª¾í†\\`Kyौꋟ._\u0006L챯l뇠Hi䧈å’5", "艊ä½à£ƒë¡‡ä± çˆ¬ï˜‚!*;⨣æŽïžæ…“qé“|儑ᨋL+è¿¥=6㒺딉6弄3è¾…J-㕎뛄듘SG㆛(\noAzQê±ä°©X*ã¢O퀌%펠낌moí‹®a^<\/F&_눊ᾉ㨦ы4\"8H": 2974648459619059400, "鬙@뎣䫳á®ë¡?){y?5K;î§„TA*k溱䫜J汃ꂯ싔ì\u001dA}룖(<\/^,": false, "ëª@QꋦFꊩá’뎶î‡lXl垨4î¤^郣|ꮇ;ä´á“}ìµ²zç–": null } ]]]], ":_=ë‹§å¼—D䙋暨é›. 㱻붘ä‚Jå„’&ZK/녩䪜rå›â½¯D喠죥7ï“⹌䪥c\u001a\u2076￞妈朹oLkè®F౟覛ì§ã®7T;}è›™2{9\"å´“bB<\/⡷룀;즮鿹)丒툃୤뷠5W⊢嶜(fb뭳갣": "E{å“1WM" }}, "䘨tjJ驳豨?y輊M*᳑梵瞻઻ofQGç‘®e": 2.222802939724948E-19, "ä®´=â‘âž¶Tà·‹wäžœ\"垦ꃼUt\u001dx;B$뵣䙶E↌艣ᡥ!á§Ÿ;ä±€[䔯k쬃`à©8饙른ç†î‹”'2_'袻tGfè’­J땟as꯳╖&å•’zWࡇᒫYSá¬\u0014ℑ첥鈤|cG~Pá“®\">\"": "ႆl\f7V儊㦬nHꄬꨧC{ì¢~C⮃⛓嶦vꄎ1w鰠嘩뿠魄&\"_qMâµ–é‡”ë…®îœ¡ê‡ ãš{ç³Jå“‹ cî°¸v?-jkﻯྌ鹑L舟r", "龧葆yB✱H盋夔ﶉ?n*0(": "ꧣኆ㢓氥î³qZZ酒ຜ)鮢樛)X䣆gTSî»»Ò‘Gí…žï’˜k.J圬ç–ë¡«ïœì¯­z L:\\ྤ@w炋塜쿖ᾳy뢀䶃ë±N䥨㚔勇ê²#p", "ë„畎Q娡\"@S/뼋:äµ!Pè¡…ì´šfVHQs✜á«i㻑殡B䜇%믚k*U#濨낄~": "êŸá‹•ì³¸êˆæ•‹&lå¦\u0005憡멗瘌uPgá…ªm<\/To쯬锩h뒓k" } ] }], "墥홞r绚<\/⸹ⰃB}<躅\\Y;๑@䔸>韫䜲뱀X뗩鿥쩗SI%ﴞ㳕䛇?<\/\u00018x\\&侂9é‹™a[LRã‹­W胕)â¡¿8ãž™0JF,}?í—ˆd1cDMáƒâ›é„ⱕ%X)!XQ": "â³ê—³=橇a;3t⦾꼑仈î¥á€°aᚯ⯋ꕃAsé´·Nâ•_䎃ꙎAz\u0016䯷\\<à¿«>8q{}ï½·?ᣰ}'0ᴕ펓B┦lF#趤厃T?㕊#撹圂䆲" }, "Ü‹ë‹é¾«ï¥c웑": false, "ㇿ/q\"6-co髨íœCí¦#\u001b4~?3ä¹E삇<<": 7.600917488140322E-20, "äE6?㣖êƒé—´t祗*é‘ {ḣV(æµ¾h逇íž=W?ૉ?nꇽ8ꅉຉj으쮺@Ꚅ㰤u]Oyr": "vâ‰á«¸_*όAඤԆl)ۓᦇQ}í zà¼q滚", "ソ᥊/넺I": true }]] ] ] ] ]] }, "ä­‘Ik攑\u0002QV烄:芩.麑㟴㘨≕": true, "å„꿕C쇻풉~å´%碼\\8\"䬦꣙": null, "欌L圬䅘Y8c(♺2?ON}o椳s宥2䉀eJ%é—¹rå†O^K諭%凞⺉⡻,掜?$ꥉ?略焕찳㯊艼誜4?\"﯎<ï±ã‚›XáˆINT:è©“ +": -1.0750456770694562E-19, "ç’àc뜭싼ﺳ뎤K`ïŸ]p隨LtE": null, "ç”™8䵊神EIꩤé¯á¢€,ïµ®Uä‘u疒ử驺䚿≚ഋ梶秓F`覤è­#짾蔀묊4<åªì¬¦éª_Yzgcà¡¶î²§4kç´¥`kc[Lï®—î°£ç°*I瀑[â¾°L殽鑥_mGÈ <\/|囹ç gæ¡°iri": true, "챓ꖙꟻì¢è‡ou,å— 0\\jK핻뜠qwQ?ഩ㼕3Y彦b\u009bJ榶N棨f?ë¦é–綃6é³µM[OEë´¨uí–.Ꮁ癜蟳뽲ꩌ뻾rM豈Rï¨ç¾« uDꎚ%": null }, "V傜2<": 7175127699521359521 }], "é“«aG切<\/\"ী⊆e<^g࢛)Dé¡ï½Žï¬®é¥¼\u008c猪繩嵿ﱚCꡬ㻊g엺Aì—¦\u000fæš¿_f꿤ë³ã¦•桦`蒦䎔j甬%å²rj ç³": "䚢åŽëˆ´Au<4箞7礦Iï±”å eȧ䪸uï„€äµp|逹$嗫쨘ꖾï·!胠z寓팢^㨔|u8Nሇe텔ꅦ抷]،鹎ã³#༔繁 ", "낂乕ꃻ볨ϱ-ꇋã–fsâ¿«)zꜦ/K?솞♞ꑌ宭hJ᤭瑥Fu": false, "쟰ãœé­›G\u0003u?`㾕ℾ㣭5螠烶這趩ꖢ:@å’•ê¶xë’˜ëŠmä°¨bç—ƒë 0鳊喵熬딃$摉_~7*ⱦ녯1錾GKhJ惎秴6'H妈Tᧅ窹㺒疄矤铟wላ": null, "쯆q4!3錕ã²âµ†ã‡›ê˜·Zç‘©ë­†\\â—ªNH\u001d\\ã½°U~㯶<\"쑣낞3ᵤ'峉eꢬ;鬹o꣒木X*é•·PXᘱu\"ä ¹n惞": null, "ᅸ祊\"&ꥴCjࢼ﴿?䡉`U效5殼㮞V昽êª#ﺸ\\&t6x꠹盥꣰a[\u001aêªSpe鎿蠹": -1.1564713893659811E-19 } ]] ] ] ], "羵䥳H,6ⱎ겾|@t\"#í–Šî¦1|稃 ì„­)ëœ=뻔ꡜ???櫎~*ῡ꫌/繣ﻠq": null } ]} ]}, "츤": false }}, "s": 3.7339341963399598E18 } ], "N,I?1+㢓|ࣱ嶃쩥V2\u0012(4EE虪朶$|w颇væ­¥": "~ì¢~_,Mzrã«YB溓Eæ·š\"â…¹äˆ”áºæŠ™ b,nt5Vã’J檶ê¨â»”?", "Q껑ꡡ}$넎qHç…”æƒ/ez^!ẳF댙äŒé¦»å‰8": "梲;yté’°$i冄}Aî‘”L%a jëœå¥·ê±³ëš¾d꿽*ሬuDY3î…—?뮟鼯뮟wãªí‹±îŸ‚V", "o{Q/K O胟ãzUdê€m&⨺J舕â¾é­¸è¨ŸãŒ¥[T籨櫉å”í‚ aṭ뱫촙莛>碶覆⧬짙쭰ׯdAiH໥벤í¥_æ¸[ 0î­¬e:죃TCå¼¼èŽëµDA:w唵ê£": null, "á½æ¨Žäµ®è»§|?à±—aWH쩃1 ê…­su": null } ] }, "å‹‚\\&mé°ˆJ釮=Ⲽ鳋+䂡郑": null, "殣b綊倶5㥗惢⳷è¢á‘€ä¬„é•§M^ï±´3⣢翣næ«»1㨵}ኯ뗙顖Z.Q➷ꮨ뗇\u0004": "ê”™ä¼>n^[GीA䨟AMç¢á’ŠS쨲w?d㶣젊嘶çºéº“+æ„£a%気ྞScë“ᔘ:8bM7Xd8㶑臌]Ꙥ0ê­ì’™ä«£æŒµCè–½î€Dfⵃ떼᷸", "?ç´¡.ì…ª_à·¨j\u0013Oxâ” $Xᶨ-á…‡oè–¹-}軫;yæ¯ãªœKã£?.EVì®±4둽⛻䤜'2盡\u001f60(|eì°ã¼Žá¦€ã’§-$l@ﻑå³\u0003ä­±å“å·—WFo5c㧆Tí„Y맸♤(": -2.50917882560589088E17 }} ], "侸\\릩.᳠뎠狣살cs项䭩畳H1s瀉븇19?.w骴崖㤊h痠볭㞳㞳ä®Ql怠㦵": "@䟴-=7f", "鹟1x௢+d ;viä­´FSDS\u0004hꎹãš?â’â¦Ñž6u,扩@ë·Su)Pag휛Tá’—Vç—©!çžé‡€ê–žè˜¥&ೞè˜ê­°êž‡áŽ": "ah懱Ժ&\u20f7䵅♎඀䞧鿪굛ౕ湚粎蚵ᯋ幌YOE)५襦ãŠY*^\"R+ඈî¶å’·è¶9î—ꥂ榨艦멎헦é–ë¶v좛咊E)K㓷ྭr", "æ†q쮦4綱켙ì….f4<\/g<籽늷?#蚴픘:fF\u00051㹉뀭.á°–í’ŽfÖ¦Hv蔎㧤.!ä­½=éž½]ìŒH:?\"-4": 8.740133984938656E-20 }]} } ], "tVKn딩꘥⊾蹓᤹{\u0003lR꼽ᄲQFá…傅ﱋ猢⤊á”,E㓒秤nTà¶­v`â™›I\u0000]꫔ṞD\"麵cè¸î“²æ°X&æ¿¿ë˜ê£¹ê¹³à±¥è‘‚鿎\\aꡨ?": 3900062609292104525 } ], "ਉ샒⊩Lu@Sä§°^g": -1.1487677090371648E18, "⎢k⑊꬗yá«7^err糎Dt\u000bJç¤¯í™•ã†æ²‘サꋽeèµ”ã¢^J\u0004笲㿋idra剰-᪉C錇/Ĝ䂾ညSì§€?~ì½®gR敉⬹'ä§­": 1901472137232418266, "ç—kä¶¥:?ì´½è´ì“‰ê“ˆã’¸gç˜[뵎\\胕?\u0014_榙p.j稶,$`糉妋0>Fá¡°ly㘽$?": "]ê™›O赎&#ã ƒë±å‰³î°·\"<â—†>0誉é½_|z|裵씪>áŒã¼\"Z[ç•}O?G뚇諦cs⠜撺5cuç—‘U圲\u001c?鴴計lì¶¥/╓哼䄗èŒîšªê®…뫈댽AëŒë¡–뤫V窗讬sHd&\nOi;_î´–u" } ], "Uﺗ\\Y\\梷䄬~\u0002": null, "k\"Y磓ᗔ휎@U冈<\/w컑)[": false, "æ›Jè·âŒ»ë¦\u001f㙳s꥓âŸé‚«P늮쥄c∬ྡྷ舆렮칤Zè¶£5콡넛A쳨\\뀙骫(棻.*&è¼›LiIfi{@EA婳KᬰTXT": -4.3088230431977587E17 }]} ] ], "곃㲧<\/dఓꂟså…¶à¡§&Nè‘¶=?c㠤Ჴ'횠숄臼#\u001a~": false } ] ]}] }] }} ], "2f`â½°E쵟>Jî•笂裭!〛觬囀ۺ쟰#桊l鹛ⲋ|RA_Vxá­gEë“h﵀mfá»|?juTUæ¡£[d⢼⺻p濚7E峿": 5613688852456817133 }, "濘ë¶gå¿®7ãµæ®¬W팕Qæ› ë«°)惃廊5%-î«è¹šzYZ樭ﴷQ锘쯤崫îŸgg": true, "絥ᇑâ¦ì’“븣爚H.ã—Šß„o蘵貆ꂚ(쎔O᥉î¼ï®“]姨Wê“!RMA|o퉢THxè½®7Mê»U즨'i뾘舯o": "è·¥f꜃?" }} ], "é·°é¹®K-9k;ï°°?_ݦѷ-ꅣ䩨Zꥱ\"mꠟ屎/콑Y╘2&鸞脇ã¢ê€‡à ºâ°¼æ‹¾å–­í‹®îL꽩bt俸墶 [l/웄\"꾦\u20d3iও-&+\u000fQ+໱뵞": -1.296494662286671E-19 }, "HX੹/⨇୕붷Uﮘ旧\\쾜͔3l鄈磣糂̖䟎Eá³wæ©–bá¿€_딕huè‘°î¤çª³é—¹Ð²U颵|染H죶.fPä—®:jä«¢\\b뎖i燕ꜚGâ® W-≚뉗lè¶•": "ଊ칭Oa᡺$IVã·§L\u0019脴셀붿餲햪$迳å‘ì¯ì¼‚PqfT\" ?î¹€I屉鴼쿕@ç¡™z^é•㊵M}ãš›T젣쓌-Wâ©-g%⺵<ë®±~빅╴瑿浂脬\u0005왦燲4áƒb|Då § <\/oEQh", "䘶#㥘à©îººìº”ï” f巋ἡAJ䢚쭈ࣨ뫒*mᇊK,ࣺAꑱ\u000bR<\/A\"1a6鵌㯀bh곿w(\"$ê˜*rà²è¶£.dà¿©k/抶면䒎9W⊃9": "漩b挋Swè—Ž\u0000", "ç•€e㨼mK꙼HglKb,\"'䤜": null }]}] ] ] }] ]} ] ]} ], "æ­™>駿ꣂ숰Q`J΋方樛(d鱾뼣(ë«–í„­\u20f9lচ9æ­Œ8o]8윶lì–¶?é•–G摄탗6í‹íµ+g:䱫홊<멀뀿/س|ê­ºsê±è·¶ç¨šW々c㫣⎖": "㣮蔊깚Cꓔ舊|XRfé»ã†šï¸†'쾉ì·\\&言", "æ®­\"cÞɨê™äž˜:嬮eæ½½Y펪㳅/\"O@à —ê²´]ì·–YÇž(t>R\"N?梳LDæ­=næ°¯Tè±°2R諸#N}*ç§ï¡§4}ã¶ŠGä£bì–š": null, "襞<\/å•§ B|싞W瓇)6簭鼡艆lNì©`|펭佡\\é–“é‚[z릶&쭟愱ꅅ\\Tá°½1靝忠ˆ4̸s윜R7â’/똽?치X": "âŠèº–Cﱰ2Qẫè„&இ?%ëƒæ‚Š", ",é°§åµì…£îˆ›ì‹¹xᎹ힨᯳EṬHïŽã¹–9": -4604276727380542356 } } ]]]], "웺㚑xs}q䭵䪠馯8?LB犯zK'osäš›HZ\"L?ì…Žs^ã¿§ã´˜Cv2": null }] ] ] ], "Kdî©´2Kv+|z": 7367845130646124107, "ᦂⶨ?ᢠ祂些ഷ牢㋇æ“\"腭䙾㖪\\(y4cE뽺ㆷ쫺ᔖ%zfÛ»$Ñž1柦,ã¶¢9r漢": -3.133230960444846E-20, "ç˜Mç„€q%㢟f鸯Oâ£è“‘맕鯊$Oå™·|)z褫^㢦⠮ꚯ꫞`毕1qꢚ{ĭ䎀বώT\"뱘3G൴?ï¢ï¢^^oï…¯f": null } ], "aî¶¹8V᯺?:ﺃ/8ꉿBq|9啓댚;*i2": null, "cpT瀇Hç°á»ªpೃi鎪Rrâ£ìˆ¬-鹸ҩ䠚z脚цGoN8å…¥y%è¶ŒI┽2ឪЀiJNcN)æ§£/â–Ÿ6S숆牟\"箑X僛G殱娇葱T%æ»:J諹昰qV쨰": 8331037591040855245 }], "G5ᩜ䄗巢껳": true } }, "Ồ巢ゕ@_è­™A`碫é„㡥砄㠓(^K": "?܃B혢▦@犑ὺD~Tâ§|é†;o=J牌9냚⢽㨘{4è§èš”9#$∺\u0016p囅\\3Xk阖⪚\"UzA穕롬✎âžã­’춺C㣌ဉ\"2瓑员ᅽê¶ë«}꽚ꞇ鶂舟彺]ê½JCè§éЉ", "â†Äšè†\"b-í‰ACR言J謈53~V튥x䜢?ꃽɄY뮩ꚜ": "K/↾eèƒ}]Bs⾿q룅鷦-膋?m+æ­»^魊镲6", "粡霦cæž‹AHíŸo礼Ke?qWcA趸㡔ê‚?\u000eì¶‚8iতᦜ婪\u0015㢼nﵿê»!á´é–¢\u001d5j㨻gfá¿©UK5Juä¸tã‹TI'?ã“t>⼟o a>i}á°—;뤕Ü": false, "ꄮ匴껢ꂰ涽+䜨B蛹H䛓-k蕞fu7kLè°–,'涃V~챳逋穞cT\"vQ쓕ObaCRQã“¡â²®?轭⫦輢墳?vA餽=h䮇킵ní²í‰…喙?\"'1ç–¬V嬗Qdç—'Lự": "6v!së¯ã­Ÿî€µî¦˜ã£¯çƒ!磸餠ቂh0C뿯봗Fé·­gê–¶~コkK<ᦈTtïŽ\\è·“w㭣횋钘ᆹ듡䑚W䟾X'ê…”4ï€FL勉Vܴ邨y)2'〚쭉⽵-鞣E,Q.?å—", "?(˧쩯@å´Ÿå‹æ­„K": null }, "Gc럃녧>?2DYIé´¿\\륨)æ¾”0ᔬlx'è§”7젘⤡縷螩%Sv׫묈/]↱&S ï…h\u0006æ­‹á‘›xi̘}ã²Y蔯_醨鯘煑橾8?䵎쨋z儬ê*@츾:": null } } } ] ] ]} }, "HO츧G": 3.694949578823609E17, "QC\u0012(翻曇Tfã·ŸbGBJ옉53\\嚇ᛎDï–/\u001b夾á‰4\"í•€@祎)쫆yD\"i먎Vnî¿ã¿¿V1Wá¨ä¶€": -6150931500380982286, "Zã“®P翸é±é‰¼K䋞꘺튿â­Y": -7704503411315138850, "]모开ꬖP븣c霤<[3aΠ\"é»ä––䰑뮋ꤦ秽∼㑷冹T+YUt\"싳F↭ä–&鋌": -2.7231911483181824E18, "tꎖ": -4.9517948741799555E-19, "䋘즊îŽ.⬅IꬃۣQ챢ꄑé»|f?C⾺|å…•ì¯sC鬸섾整腨솷V": "旆柩l쪦sá–¸My㦅울ì‰ç˜—㎜檵9ï……ê‚駓ૉᚿ/u3ì”…å¾ï¤¥[Z䞸ࡗ1ꆱ&Q풘?Ç‚8\u0011BCDY2볨;é¸": null, "幫 nç…¥sì‡íއ 왊-$C\"è¡:\u0014㣯舼.3ë™—Yl⋇\"K迎멎[ê½µs}9鉳UK8ì¥\"掄㹖h㙈!얄સ?Ꜳ봺R伕UTD媚I䜘Wé¨è”®": -4.150842714188901E-17, "ﺯ^ã„„\b죵@fྉkf颡팋î¤êž¦{/Pm0V둳⻿/è½éŸ’ꊔᚬ@5螺G\\å’¸a谆⊪ቧ慷绖?è´¢(é·‡uéŒF=ráæ©¢áž³n:^iá´µtD볠覅Nèµ´": null }] }] } ] ]} ]}, "謯?w厓奰Tï§¡í——èážè²–o⪇弒L!캶$ᆅ": -4299324168507841322, "뺊奉_åžæµ¸å»¶ëªå­„Z舰2i$q붿좾껇d▵é¤\"v暜Ҭì„mï¿´g>": -1.60911932510533427E18 } ] } ] ]], "í‰êº”㠦楶Pê…±": 7517896876489142899, "ï™°": false } ]}, "是u&I狻餼|è°–j\"7cë®sï­-踳鉷`䣷쉄_A艣鳞凃*m⯾☦椿q㎭Nîœæº”铉tlㆈ^": 1.93547720203604352E18, "ï…µkⲨ\\%vr#\u000bâ’ºY\\t<\/3﬌R訤='﹠8è¤êž´ë ´æ›”r": false } ]}, "阨{c?C\u001d~K?鎌Ԭ8烫#뙣Pì´ˆé—tã­±E­ë’䆺}ç”—[R*1!\\~hã•…á°º@<9JêષIä³–æ ­6綘걹ᅩM\"▯是∔v鬽顭⋊譬": "ìš´ï¶Kæ•‚(欖C취پ℄爦賾" } }} }], "鷨赼鸙+\\ä­£t圙ڹx᜾ČN<\/踘\"S_ë§¶a鷺漇T彚⎲i㈥LT-xA캔$\u001cUH=a0츺l릦": "溣㣂0æ¿•=鉵氬駘>Pꌢpb솇쬤h힊줎çªãª¬CrQ矠a&è„꼬爼M茴/á¿®\u0017å¼è½¼y#êž c6ë‘´=?Rå´ë· éº–w?" }, "閕ᘜ]CT)䵞l9z'xZF{:ØI/躅匽ì¡:䟇AGF૸\u001cퟗ9)駬慟ꡒꆒRS״툋A<>\u0010\"ꂔ炃7gëšEà§îˆbꅰ輤]oã±_뷕ܘ暂\"u": "芢+U^+㢩^鱆8*1鈶鮀\u0002뺰9⬳ꪮlL䃣괟,G8\u20a8DF㉪錖0ㄤ瓶8Nଷd?眡GLc陓\\_죌Vì°à¤²äºŒ?cë¦æ± \u0019JC\u0011b⤉zẒT볕\"绣蘨뚋cꡉkî« I\u001eé³´", "ꃣI'{6u^㡃#཰Kq4逹y൒䧠䵮!㱙ï®/n??{Lí’“ZETã™ í¿X2᩟綳跠葿㚙w཮x캽扳B唕S|å°¾}ì´•%N?o䪨": null, "ⰴFjà·Ÿì…ˆ[\u0018è¾·px?椯\\1<ﲻ栘á£ë´¢æ† ë‰´p": -5263694954586507640 } ] ]] ]} ]}] ] ], "?#癘82禩鋆êŠty?&": -1.9419029518535086E-19 } ] ] ]} ] ] ], "훊榲.|῕戄&.ãšZꛦ2\"䢥ሆ⤢fV_æ‘•å©”?â‰Fji冀탆꜕iã¬_ẑKᅢ꫄蔻XWc|饡Siẘ^㲦?羡2ã´1ç¸á™…?ì‰Ou": false }]] ]}}}, "æ…‚ë—„å“è“”á“åŒåš–/颹蘯/翻ㆼL?뇊,í…µ<\\ç·ã”Cボ": null }, "p溉ᑟi짣z:䒤棇r^Ù«%G9缑r砌롧.물农g?0׼ሩ4ƸO㣥㯄쩞ጩ": null, "껎繥YxK\"F젷쨹뤤1wq轫o?鱑뜀瘊?뎃hç‘\\ꛣ}Kå³^ኖâ¤ï§´ê‰“hy": null } ], "á±€nè‚“ã„›\"å »2>mæ®®'1橌%êž´êµ°=Ӳ鯨9耛<\/n據0u彘8㬇៩fá¿è¯™]嚊": "䋯쪦S럶åŒã…›#î½)O`ሀX_éªæ¸²â›€ã¨»å®…闩➈ꢙஶDRâª" }, "tAì“龇 â‹¥bj왎录r땽✒롰;羋^\\?툳*┎?ì€ma䵳넅U䳆૘〹䆀LQ0\bç–€U~u$M}(鵸gï­â³¾i抦뛹?䤈땚검.鹆?ê©¡tâ¶¥GÄ’;!ቹHïš©Så³»B츪ì¼f5≺": 2366175040075384032, "ì „pJjleb]áž½": -7.5418493141528422E18, "n.鎖ጲ\n?,$䪘": true }, "欈Ar㉣螵᪚茩?O)": null }, "쫸M#x}Dç§±æ¬K=侫们ä¸ï‡ª.KꕾxẠ\u001e㿯䣛FÜ캗ï¬qq8꟞ṢFD훎⵳簕꭛^鳜\u205cÙ«~⑟~冫ऊ2ì«°<\/戲윱o<\"": true }, "ã·è¥/T뱂\u0010锕|内䞇xä¾â‰¦ã­–:M?iM᣿IJeç…œdG࣯尃⚩gPt*辂.{磼럾äª@a\\袛?}ᓺBç¼": true } } ]]}]}}, "tn\"6î´ê«¤ìƒ¾ä„„;銞^%VBPwu묪`Y僑N.↺Ws?3C⤻9唩Sä ®á´m;sᇷ냞඘B/;툥B?lB∤)G+O9m裢0kC햪䪤": -4.5941249382502277E18, "áš”t'\\æ„«?éµ€@\\ã³ê‚•Pí <<]ç…¹G-b!S?\nꖽ鼫,Ý›&é ºy踦?Eæ†î¬–릱H}햧캡b@手.p탻>췽㣬ꒅ`qeä½­P>á“‚&?u}毚ᜉ蟶頳졪áŽzl2wO": -2.53561440423275936E17 }]} } ] ]], "潈촒⿂å¡": 5495738871964062986 } ]] } ] ]} ]] ]] ]} ] ]}, "á‚qí‚è“…R`謈èŸá¦î’³å„‚æ§åƒ»ï¹¶9å©Œî¬æ«žé‡ˆ~\"%匹躾ɢ뤥>࢟瀴愅?殕节/냔O✬H鲽엢?ᮈà©î“Žâ‹§dâ½ã«zCe*": 2.15062231586689536E17, "ã¶µUi曚ç°é‹ªá¾¼è‡§P{ä䷪쨑̟A뼿T渠誈äšD1!ìž¶<\/ã¡7?)2l≣穷᛾ç¨{:;㡹nemיּ訊`Gî¹²": null, "䀕\"飕辭påœf#뫆䶷뛮;â›´á©3çšëá°ìŽ“â¦·è©µ%᜖Մfs⇫(\u001e~P|ï­—CⲾផv湟W첋(텪બTî¾·<บSê‰à©—⋲X婵i ӵ⇮?L䬇|êˆ?졸": 1.548341247351782E-19 } ] }, "t;:N\u0015qé¦Rt缆{ê®C?஛㷱敪\\+鲊㉫㓪몗릙ç«(æ°µkYS": "Xá°‚T?൮ô", "碕飦幑|+ 㚦é¶`é•¥ê© B<\/加륙": -4314053432419755959, "秌孳(p!G?Vå‚«%8ሽ8w;5鲗㦙LI檸\u2098": "zG N볞䆭éŽí˜\\ONK3íš™<\/樚立圌Q튅k쩎Ffì‹aׂJK銆ઘì¦ç‹©6༥✙䩜篥CzP(è»é§‡HHퟲ讃%,ά{ë p而刲vy䦅ክ^톺M楒é¢ã¹³]Mdg2>䤉洞", "踛Mì §>忔芿㌜Zk": 2215369545966507819, "ì”A`$æ§­é °í»^U覒\bG毲aᣴU;8!팲f꜇E⸃_åµ{å«ç¾ƒX쀳C7ë—®m(åš¼u NÜè°ŸD劯9]#": true, "ﻩ!뵸-ç­šPá­›}á¼°å±¥lPh?౮ⶹꆛ穉뎃gè‘㑓溢CX뾇Gã–¬A錟]RKï’î´²aꄘ]Yo+@ä˜'s섎襠$^í™°}F": null }, "粘ꪒ4HXᕘ蹵.$å€\r\u001dë¬77pPc^yî¶ç¬²Q<\/ê–¶ è¨äƒá¨•G?*": 1.73773035935040224E17 }, "婅拳?bkU;#D矠â´vVN쩆t㜷A풃갮娪a%é®çµª3dAv룒#tm쑬⌛qYwc4|L8KZ;xU⓭㳔밆拓EZ7襨eD|隰ऌ䧼u9Ô¢+]è´´Pè¿": 2.9628516456987075E18 }]}}] ]} }} ]}] ], "|g翉F*湹̶\u0005â1脉̀eI쩓ᖂ㫱0碞l䴨ꑅ㵽7AtἈ턧yq䳥塑:z:é€ï¾¼X눔擉)`N3昛oQì…–y-ڨ⾶æ¢êˆµq^<\/": null, "è¹\\ëž“G^璬x৴뭸ゆUSê²§ï®·Bꮤ ┉銜᯻0%N7}~fæ´‹å„Xꔼ<\/4妟Vꄟ9:౟곡t킅冩䧉笭裟炂4ë´‹â±³åºæ€Št+怯涗\"0ã–ˆHq": false, "졬믟'ﺇফ圪쓬멤m邸QLà¦¬ä—æ„4jvsç¿™ à¾ê§€è‰³H-|": null, "컮襱⣱뗠 R毪/鹙꾀%í—³8&": -5770986448525107020 } ], "î½­B䔚bê»ë™å§“展槰T-똌鷺tcï§ç¿á«½^㓟ä€o3o$꘭趙è¬Ié¡©)뇭Ἑä“\f@{ᣨ`x3è”›": null } ] ] }], "⦖扚vWꃱ꥙㾠壢輓{-⎳鹷è´ç’¿äœ‘bG倛â‹ç£Žc皇皩7a~ﳫUâ•£Q࠭ꎉS摅姽OW.홌ೞ.": null, "蚪eVlH献r}á®ë¯ ï°©ê”„@ç‘„â²±": null, "퀭$JWoê©¢gì—­ì䖔㑺h&à­¢tXX愰㱇?㾫I_6 OaB瑈q裿": null, "꽦ﲼLyr纛ZduçB絟쬴糔?ã•‚ì§¹äµe": "ḱ\u2009cX9ë©€i䶛簆㳀k" } ]]]], "(_ê®g່澮?ᩑyM<艷\u001aꪽ\\庼뙭Zë§·ã°©Vm\\lYç­º]3㋲2㌩㄀Eਟäµâ¨„ì¨á”ŸgङHné–⤇놋瓇Q탚單oY\"♆臾jHᶈå¾îž«á‰„??uㇰA?#1侓": null }, "è§“^~ሢ&iIë†g륎ḱ캀.ᓡꀮ胙鈉": 1.0664523593012836E-19, "yè©­GbᔶऽsëŒU:æœî „⤎ϲì—⮼D醄诿që™°I#즧v蔎xHᵿt᡽[**?崮耖p缫쿃Lè,ë´¬ï–ꤦC쯵#=X1çž»@OZc鱗CQTï‹„x": null } ] }}], "剘ç´\u0004\\Xn⊠6,á€×±;嵣崇}讃iႽ)d1\\䔓": null }, "脨z\"{X,1uì°œ<'k&@?1}Yn$\u0015Rd輲ーa쮂굄+B$l": true, "諳>*ì­®ê´äµŸÒ+<ç®}빀䅱⡔æªï€è‡’hIH脟ꩪCí•ଗP좕\"0i<\/C褻DÛžæ—+^5?'ꂱ䚫^7}ã¡ cq6\\쨪ꔞꥢ?纖䫀氮蒫侲빦敶q{Aç…²G": -6880961710038544266 }}] }, "5s⨲JvಽῶꭂᄢI.aà§Š": null, "?1qê½ì¿»ê›‹DR%Uå¨>DgNä¹­G": -1.2105047302732358E-19 } ] ]}, "qZz`撋뙹둣j碇ì\\ꆥ\u0018@ïœè—´ç–°Wz)O{Fä¶›l᷂绘訥$]ë®å¤»ä¢‹ä©‡è¿ç°æ¨§çŒµâ£­jè¶q)$꬚⵷0馢W:â°!Qoe": -1666634370862219540, "t": "=î¹›wp|~碎Q鬳Ó\\l-<\/^ﳊhní–}ä”t碵ḛ혷?é»äŠ—", "邙쇡㯇%#=,î‰E4勃驆V繚q[Y댻XV㡸[逹á°è‘¢B@u=JS5?bLRnì–®ã‰â…ï°³?a6[&íŸ!è—ˆ": 1.2722786745736667E-19 }, "X블땨4{ph鵋ꉯ웸 5p簂䦭s_E徔濧dç¨~No穔噕뽲)뉈c5M윅>âš‹[岦䲟懷æ?éŽê“†à¸¬çˆ‹ç äœ”s{\u001bméšå„¸ç…›%bﯿXT>ê—˜@8G": 1157841540507770724, "媤娪Qæ¸ï‡\u0011SAyᡈ쿯": true, "çš^ಸ%ê±<\/蛯?\"祴å“\\\\'í": -3.4614808555942579E18, "釴U:O湛㴑䀣렑縓\ta)(j:숾å´ä—ŒgCiB뽬Oyuqè¼¥åŽ/7)?今hY︺Q": null } ] ]]]}] ], "I笔趠Ph!<ཛྷ㸞诘X$畉F\u0005笷èŸ.Esr릙!W☆ï›ä²–뗷莾뒭U\"䀸犜Uo3ï¯Gꯌx4r蔇᡹㧪쨢準<ä‚€%ࡡꟼç‘8ç‚Xs0ä€é”€?fi쥱ê†àª²BB": -8571484181158525797, "Lâ¦o#J|\"⽩-ã±¢d㌛8d\\㶤傩儻E[Y熯)r噤὘勇 }": "e(濨쓌K䧚僒ã˜è ¤Vᛸ\"络QJL2,嬓ì™î¿‰ä¼¢ã‹’䴿考澰@(ã¾`kX$ë‘ÑE斡,èœ&~y", "vj.|统圪ᵮPL?2oŶ`ë°§\"勃+0ue%⿥绬췈체$6:qaë Q;~晘3㙘鹑": true, "à·Ø™4ç„â¶¿c︋iâš…:ã‚“é–Ⳙ苆籦kw{䙞셕pCì·ƒê¬âœêŸ¯êš“é…„bížhwkê­­M鬋8B耳쑘WQ\\å™ac'唀x᪌\u2048*hì§Ž#á‡é® ë¾áž¿ë€Œ": false, "⎀jꄒ牺3Ⓝ컴~?親ꕽã¼Ü“å–瘘!@<튋ãŒê¿±â©¦{a?Yv%⪧笯Uܱ栅Eæši뚬:ꄃx7䙳ꦋ&䓹vq☶Iä˜á¾˜æ¶œ\\ì‰ëºŒLr%Bcãœ3?î¤ï…¨ê­ç ¿è£ž]": null, "⭤뙓z(ã¡‚%亳K䌽꫿AԾ岺㦦㼴輞낚Vꦴw냟鬓㹈뽈+o3è­»K1ìžž": 2091209026076965894, "ㇲ\t⋇轑ꠤ룫X긒\"zoYì‡í¬wjæ¢ì‘l侸`e%s": -9.9240075473576563E17, "啸ꮑ㉰!áš“}éŠ": -4.0694813896301194E18, "ï‰>]囋੽EK뇜>_ꀣ緳碖{ì裔[<ನ\"䇅\"5L?#îµ³xTwv#ç½\u0005래t应\\N?빗;": "v쮽瞭pë­ƒ" } ]], "æ–´æ§¾?Zç¿\"~æ…弞ﻆ=꜡o5é‹ï’½dw\"?Kè ¡i샾ogDï²°_C*⬟iㇷ4nયèŸ[㟉U꽌娛苸 à§æ“贻洞펻)쿗૊許X⨪VY츚Zä¾ã¶­~튃ᵦ<\/E臭tve猑x嚢": null, "锡⛩<\/칥ꈙᬙè€&êšç±¬â– 865?_>Lè©ì¿¨äˆŒæµ¿å¼¥ï©‰Ì«î¾½ï‘lj&zx<\/C쉾?覯n?": null, "꾳鑤/꼩ï¨d=ᘈn挫ᑩ䰬ZC": "3錢爋6Ƹ䴗v⪿Wr益G韠[\u0010å±—9ì¡é’u?殢c䳀蓃樄욂NAq赟c튒ç˜ë ¶î‚³Aà«¡Éšæ" } ] ] ]} ] ] }]]]}} ]}], "ï‚’Ejä—³U<\/Q=ç’샎䞦,å °é  @褙g_\u0003ꤾfâ¶½?퇋!łB〙ד3CC䌴鈌U:뭔咎(Qો臃䡬è‹BO7î¼§ã¢äŸ¸\"Yb": 2.36010731779814E-20, "逸'0å²”j\u000e눘먷翌C츊秦=ꭣ棭ှ;鳸=麱$XP⩉駚橄A\\좱⛌jqvä°ž3Ь踌v㳆¹gT┌gvLBè³–ïžçƒ¡m?@E঳i": null }, "曺vì°˜×?&绫OáŸ": 9107241066550187880 } ] ], "(e屄\u0019昜훕ç–b蓘ᬄ0/۲묇Z蘮á€â¨è›˜èƒ¯ë¢ƒ@㘉8ሪWᨮ⦬ᅳ䅴HIá‡ì¨³z囕陻엣1赳o": true, ",b刈Z,á æ™Tì†Å•B⩆ou'í¼â‰ƒç»—é›—dè­Š": null, "a唥KB\"ï³è‚•$u\n^â…„P䟼냉䞸⩪u윗瀱ꔨ#yÅŸsî««ê’¬=ï‹•1ïš–|ﲤ爢`tà±íмî£ì³«_Az(Ṋ擬㦷좕耈6": 2099309172767331582, "?ã´¸U<\/䢔ꯡ阽扆ã¤qé‹?f㔫wM嬙-;UV죫嚔픞G&\"Cá—äªí’ŠQ": "VM7ç–¹+陕枡툩窲}ç¿¡ä–¶8欞ÄsTë®}ç’¤:jﺋ鎴}HfAàµâ§»Zd#Qï¬u茅J髒皣Y-︴[?-~쉜vë”璮㹚䅊﩯<-#\u000eê±€h\u0004u抱﵊㼃U<㱷⊱IC進" }, "숌dee節é½é‚ºp넱蹓+e罕U": true } ], "b⧴ë£??á” 3ã±>%郿劃ç¿ê¬ê ›Wï¡°çž³á«ëˆ„躨狀ໄy੽\"ីuS=㨞馸k乆E": "トz݈^9R䬑<ﮛGRꨳ\u000fTT泠纷꽀MRᴱ纊:ã ­ë³®?%N56%鈕1ä—äœaä²—j陇=ë¿»å‚衋࿘ᓸ?ᕵZ+<\/}H耢bä€z^f$&ã’LkꢳI脚뙛u": 5.694374481577558E-20 }] } ]], "obj": {"key": "wrong value"}, "퓲꽪m{ã¶©/뇿#â¼¢&᭙硞㪔E嚉c樱㬇1aç¶‘á–DḾä©": null }, "key": "6.908319653520691E8", "z": { "6U閆崬밺뀫颒myj츥휘:$è–ˆmYí–š#rzé£+玭V㭢뾿愴Yî°‘ê–šX亥ᮉ푊\u0006åž¡ã­ë£\"厓ᔧḅ^Sqpv媫\"⤽걒\"˽Ἆ?ꇆ䬔未tv{DV鯀Tἆl凸g\\㈭ĭ즿UH㽤": null, "b茤z\\î¨.N": [[ "ZL:ᅣዎ*Y|çŒ«åŠæ«•è¾Oj为1糕쪥æ³S룂w࡛á²â¸¥èš™)", { "\"䬰á»wDæ¾V`邀⠕VDãºsH6[칑.:醥葹*뻵倻aD\"": true, "e浱uî¿£p蔽Crà· JK軵xCʨ<뜡癙Yç©ï½¹é½ˆX/螗唻?<蘡+뷄㩤쳖3å‘犾&\\첊xzå崦ݻé´\"åµ¥B3㰃詤豺嚼aqJ⑆∥韼@\u000b㢊\u0015L臯.샥": false, "l?Ǩ喳e6㔡$M꼄I,(3á縢,䊀疅뉲B㴔傳䂴\u0088㮰钘ꜵ!ᅛ韽>": -5514085325291784739, "o㮚?\"춛㵉<\/﬊ࠃ䃪ä£wp6ἀ䱄[s*S嬈貒pᛥ㰉'ë€": [{ "(QP윤懊FI<ꃣ『䕷[\"ç’å¶®?%Ḭå£à²»ä‡Ÿ0è¤!è—²ë¹bdæµ¶tl\u2049#쯀@僞": {"î—i妾8홫": { ",Mï£ë§ƒäž›K5nAㆴVNã’Ší–¬$n꩑&êŽæ¤žî·é˜«?/á¹ì„¸ë‰ª1x쥼㻤㪙`\"$쟒薟B煌܀ì¨à­2掳7㙟鴙Xå©¢\u0002": "Vዉèˆï ’᧷⦌kîŒï®žà°ˆnz*ï·œFM\"è­7ê€-VR<\/';ä™E9$䩉\f @s?íªo3^è¡´cî˜à¶Žä§ªaK鼟q䆨c{ä³ 5mᒲՙ蘹ᮩ": { "Fã²·JGoâ¯Pëµxë’³p䘧☔\"+ꨲå¿JfR㔹)4nç´¬G练Qáž!C|": true, "p^㫮솎ocî’£.೚A㤠??r\u000f)⾽⌲們M2.䴘䩳:⫭胃\\á¾@Fá­Œ\\K": false, "蟌Tk愙潦伩": { "aï‘<\/@ᾛ慂侇瘎": -7271305752851720826, "艓藬/>á„ṯ,XW~㲆w": {"Eç—§î–郶)㜓ha朗!N赻瞉駠uC\u20adè¾ x퓮⣫P1à «LMMX'M刼唳ë¤": null, "P쓫晥%k覛ዩIUᇸ滨:å™í˜²lMR5䋈V梗>%å¹½ué –\\)쟟": null, "eg+昉~矠䧞难\b?gQì­·ç­\\eê® Nl{ಢ哭|]Mn銌╥zê–˜zⱷ⭤ᮜ^": [ -1.30142114406914976E17, -1.7555215491128452E-19, null, "渾ã¨ß牄귛r?ëŒ?w[âšžÓ»~廩輫㼧/", -4.5737191805302129E18, null, "xyà¿‘M[ocì…’ç«“â’ºx?뜓y䊦>-Dì¼(&&?XKkc꩖ﺸá‹ëµžK伕6à§€)딀PæœyWæ™îž¢?훻魢傎EG碸9類៌g踲C⟌aEX舲:z꒸许", 3808159498143417627, null, {"m試\u20df1{G8&뚈h홯J<\/": { "3ஸ厠zs#1K7:rᥞoꅔꯧ&ë‡éµ¼éž«6è·œ#赿5l'8{7㕳(b/j\"厢aqç±€êš\u0015厼稥": [ -2226135764510113982, true, null, { "h%'ë§žï–±Sì‹…Hs&dï”l슾W0jé¿M×D놯L~S-㇡Rì­¬%": null, "⟓咔謡칲\u0000孺ꛭx旑檉㶆?": null, "æ‡I転;￸B2Y`z\\ç“w,ë†æ¿æ’埵䂄)!ä¶¢D=à´­ã´ŸjyY": { "$ࡘt厛毣ൢIèŠ<겿骫⫦6tr惺a": [ 6.385779736989334E-20, false, true, true, [ -6.891946211462334E-19, null, { "]-\\êŸ1/è–“â§á½Š\\l牑\u0007A郃)阜ᇒᓌ-塯`W峬G}SDb㬨Q臉⮻빌O鞟톴첂B㺱<ƈmu챑J㴹㷳픷Oㆩs": { "\"â—‰B\"pᶉt骔J꩸ᄇá›iâ•°æ ›K쉷㉯é©!ãˆnì¹äŸ…難>盥yé“¿eà­”è’M貹ヅ8å˜‹í€¯ä‰¶áŒ¥ã¢æ®Šë»³\"絧╿ꉑ䠥?∃蓊{}㣣Gk긔H1哵峱": false, "6.瀫cN䇮F㧺?\\椯=ÚˆT䘆4â˜ïšŒ8qv": -3.5687501019676885E-19, "Q?yऴr혴{஀䳘p惭f1ﹸ䅷䕋贲<ྃᄊ繲hq\\b|#QSTî“¶s1c-7(äµ¢\u2069åŒçµ˜ê¯‰:læ¯´ï›æ±žt戀oà·Ÿáµ¶ë®±á£-醇Jx䙬äí–¢0࣫á¡grã„›": "\u0011_xM/蘇Chv;dhA5.嗀绱V爤ﰦiëµ²M", "â‘[\"ugoy^儣횎~U\\섯겜ï¥l2jw஌yD腅̂\u0019": true, "ⵯɇä²á«¿à¢š!㯢l샅笶戮1꣖0Xe": null, "劅fë„€ï‹ï§¼bå®ç„ŠE찓橵G!ʱç“뭔雩괛": [{"p⹣켙[q>燣äƒãž½î›œá©²x:쓤삘7玑퇼0<\/qç’‚á‘[ï ™Z\\3䅵䧳\u0011㤧|妱緒C['ì·“Yꞟ3Z鳱雼P錻BUì”§U`ᢶg蓱>.1Ó§è­«'L_5VäµÐ¦": [ false, false, {"22ä‚盥N霂얢躰îe9â‘©_뵜斌n@B}$ê´»Yá±@ä§‹î´½V\"☒-諯cVë¯Ê ": true, "Ű螧ᔼæªéŽë•’딜qꄃH뜣<ç§à¥‚CYå“â¸>XQ㵡趌oë¬k픀빯a(ܵç”ë†à­¯/6Nᪧ}æšá†šì§ŒP牰泱鈷^d꣟#Lì‚€\"㕹襻;k㸊\\f+": true, "쎣\",|⫝̸阊x庿k잣v庅$éˆê´Žç‚”k쬪O_": [ "ìž©AzZGz3v愠ꉈⵎ?㊱}Så°³à¯p\r2>ì·IP䘈M)w|\u000eE", -9222726055990423201, null, [ false, {"´킮'뮤쯽Wxè®V,6ᩪ1ç´²aႈ\u205czD": [ -930994432421097536, 3157232031581030121, "l貚PY䃛5@ä­„ê·»m㎮ç¸fî§¡": 1.0318894506812084E-19, "࢜⩢Ш䧔1肽씮+༎ᣰ闺馺窃䕨8Mƶqè…½xc(៯å¤J5굄ä•Qj_훨/~価.䢵慯틠퇱豠㼇Qﵘ$DuSp(8Uà¸<\/ಟ룴𥳐ݩ$": 8350772684161555590, "ㆎQ䄾\u001bpá©­${[諟^^骴᤮b^ã…¥Iâ”§T㉇⾞\"绦rä°‚f矩'-î½7ä¡­æ¡¥Dz兔V9è°¶å±…ãºá”Šä©¯ë².\u001eL0ὅㅷ釣": [{ "<쯬Jå·^숞u࠯䌗艞R9닪gã¾ë³Ža䂈歖æ„:%é”|ﵤ|y}î¡»>;2,覂⶚啵tb*ä»›8ä¹’ã“¶B࿠㯉戩oX 貘5V嗆렽ë‚߼4hä§›êºM空\\b꿋貼": 8478577078537189402, "VD*|ï§­z~hè­ºaᯒ": { "YIì·¢K<\/濳xNne玗rJo쾘3í•°é´Š\"↱AR:ࢷ\"9?\"è‡ï¦¡)?誚êŠe)_D翾W?&F6J@뺾ê°NZ醊Z쾈വHï±å¶¿?炫㷱鬰M겈᭨b,â»éˆµP䕡䀠८ⱄ홎鄣": { "@?k2é¶–ã‹®\"Oರ K㨇廪儲\u0017ä¾î¿‚J?);\b*묀㗠섳햭1MC V": null, "UIICP!BUA`î€á¢ˆã‹¸~袩㗪⾒=fBï®´l1ꡛ죘R辂여ҳ7쮡<䩲`熕8é ": 4481809488267626463, "Y?+8먙ᚔ鋳蜩ï–럶1㥔y璜౩`": [ null, 1.2850335807501874E-19, "~V2", 2035406654801997866, { "<숻1>\"": -8062468865199390827, "Mã¿£ï€E]}qwG莎Gná¶(ê”™\\D⬲iꇲs寢t駇S뀡ꢜ": false, "pê¤ãŽ9W%>M;-Uç’fî£(^j1?&RBéš§ å¿“b똊îƒE": "#G?C8.躬ꥯ'?냪#< 渟&헿란zpo왓Kj}é·§XﻘMツbä•–;㪻", "vE풤幉xz뱕쫥Ug㦲aH} ᣟp:鬼Yá°ŸH3镔ᴚ斦\\é‘r*2橱Gâ¼”F/.j": true, "RK좬뎂aí™ f*f㱉á®â¦‹æ½™ã¨‹Gu곌SGI3Ië¿\\F',)t`è蘯囯ﮉ裲뇟쥼_ገ驪▵æ’ᕤV": 1.52738225997956557E18, "^k굲䪿꠹B逤%F㱢漥O披M㽯镞竇霒i꼂焅륓\u00059=皫之눃\u2047娤é–銤唫á•b<\/w踲䔼u솆맚,ä’á³'/it": "B餹饴is権ꖪ怯ꦂẉဎt\"!凢谵⧿ï™0\\<=(uLä·åˆ¨ì‘ª>俆æ“Cy襸Q힆䆭涷<\/á±0î É§îŠ‹䗾䚹\\ኜ?ꄢᇘ`ä´¢{囇}᠈䴥X4퓪檄]ꥷ/3謒ሴn+gé¨X", "GgG꽬[(å«“ëª6\u0004ê¶宩㙻/>\u0011^è¾dTè…ªhxÇ‘%ꊇk,8(Wâ§‚çµP鬜O": [{ "Mã´¾c>\\ᓲ\u0019V{>ꤩ혙넪㭪躂TS-痴໸闓âµ/徯O.Mã¥Ê·D囎⧔ì³íœ¤T??鉬뇙=#ꢫ숣BXä­¼<\/d똬졬g榿)eꨋﯪ좇첻\u001a\u0011\";~쓆BH4勿”Š7힪", "iT:L闞椕윚*æ»›gI≀Wਟඊ'ꢆ縺뱹鮚Nê©á§¬è•¼21줧\\䋯``â\\ã±é³¨": 1927052677739832894, "ì®ç¼¦è…ƒg]礿Y㬙 fî¼ãƒºSɪ꾾N㞈": [ null, null, { "!t,çY 1䗉罵?c饃호䉂Cá­ì’˜z(즽sZG㬣sഖE4ï‚뢜㓕äžä¸®Qpç°6EZឪ겛fx'ꩱQ0ç½£i{k锩*㤴㯞r迎jTⲤ渔m炅肳": [ -3.3325685522591933E18, [{"ã“5]A䢕1룥Bï²C?Ꙍ`r룔Ⳛ䙡uä¼²+\u0001àµo": [ null, 4975309147809803991, null, null, {"T팘8Dﯲ稟MM☻㧚䥧/8ﻥ⥯aXLaH\"顾S☟耲ît7fSà·‰ë†ë®”/ꕼ䓈ìº4\\霶䠴ᩢ<\/t4?죵>uDï›5➶༆쉌럮⢀秙䘥\u20972ETR3æ¿¡æ†vB? ~鸆\u0005": { "`é––mç’㥉b뜴?Wf;?DV콜\u2020í‰à±“æ“å®ZMj3mJ먡-å‚·ë±™yח㸷꥿ ໘u=Mì!5å­L4v\\?ÇŽ7C홫": null, "|": false, "~Ztᛋ䚘\\æ“­ã—傪Wé™–+ã—¶qᵿ蘥ᙄp%䫎)}=â ”6ᮢS湟-èž¾-mXH?cp": 448751162044282216, "\u209fad놹j檋䇌ᶾ梕ã‰bוּ": {"?è‹´ê© D䋓帘5騱qï±–PF?☸ç—é¡’yU á¡«cb䫎 S@㥚gꮒ쎘泴멖\\:Ié®±TZ듒ᶨQ3+f7캙\"?\fí’¾\\oæžç´Ÿï»½M.âŽï˜¸é‘OP": [ -2.6990368911551596E18, [{"ä’–@<á°¿<\/⽬tTrè…ž&G%᳊秩蜰擻f㎳?Sãµ§\r*k뎾-乢겹隷j軛겷0ë£é®ï µ": {")DO0è…¦:ì¶é€¿:1㥨่!è›æ¨‹2": [{ ",ꌣf侴笾m๫ꆽ?1?U?\u0011ꌈꂇ": { "xæ—ç” nVqä…¦w`CD⦂惺嘴0I#vỵ} \\ê·‚Së´Dì–¾?Ô’j溯\"v餄a": { "@ç¿™c⢃趚痋i\u0015OQâlqë†Y0pࢥ3쉨䜩^<8g懥0w)]䊑næ´ºo5ì­QL댊랖L镈Qnt⪟㒅십q헎鳒⮤眉ᔹ梠@O縠u泌ㄘb榚癸Xî©­Þ”Ftj;iC": false, "I&뱋゘|ï£è“”䔕측瓯%6á—»HW\\N1貇#?åƒá—œghá­ªo'䗈꽹Rcìš/蔳迄à¼!0邔䨷푪8ç–©)[쭶緄㇈୧á": { "B+:ꉰ`sì¾­)ë¹¼Cç¾A䫊pMgjdxäHf9᥸W0!C樃'ï¤f䫤סи\u0017Jve? è¦f둀⬣퓉Whk\"஼=չï³î•¤çš†ç¬BIW虨쫓F廰饞": -642906201042308791, "sb,XcZ<\/m㉹ ;ä‘·@cäµ€s奤⬷7`ꘖ蕘戚?Feb#輜}p4nH⬮eKL트}": [ "RKé³—z=袤Pf|[,u욺", "Ẏá»ç½¯ë‰‹âº–锅젯㷻{H䰞쬙-ì©“D]~\u0013Oã³¢gb@æ¶è”‰|kᦂâ—!\u001ebMè¤sca쨜襒y⺉룓", null, null, true, -1.650777344339075E-19, false, "☑lꄆs힨꤇]'uTന⌳ë†].1â‹”ê´æ²°\"IWà´©\u0019æ°œ8쟇䔻;3衲æ‹,窌zíŽå–íš—?4?Cë„é—®?ᥙ橭{稻Ⴗ_ì”", "n?]讇빽å—}1å­…9#ê­¨é¶v\u0014å–ˆ)vw祔}룼쮿I", -2.7033457331882025E18, { ";⚃^㱋x:饬ኡj'ê§µT☽O㔬RO婎?향ᒭæ©$渣y4i;(Q>꿘e8q": "j~錘}0g;Lèº*;á•­ê„®0l潛烢5H▄쳂ê’ï­‹ê™¶T犘≫x閦웧v", "~î¢æ¯\u2018c4è·ë E~ᑅቚꈂ?nq뎤.:æ…¹`F햘+%鉎Oç€œìŸæ•›è®âŒæµ¢<\/㮺紿P鳆ࠉ8I-o?#jﮨîŸ7v3Dt赻J9": null, "à£W䌈0êŽqC逖,íš…î·Žcáƒswj;jJSæ«5æ§—OaB>D踾Y": {"ã’°äµF%î©®?59.î„„ãˆcᕨï†í•틎á¸ã‹©B=9IÛⓌ{:9.ywï½å‘°ã†®è‚’᎒tIã¾´62\"ዃ抡C﹬B<\/ì´‹jo朣", [ -7675533242647793366, {"ᙧ呃ï£:[㒺쳀쌡ì‚H稈㢤\u001dá¶—GG-{GHྻຊꡃ哸䵬;$?&d\\⥬ã“Nåœ´ë¤æŒ¨-'ê•®$î“‹PU%?冕눖ié­q騎Q": [ false, [[ 7929823049157504248, [[ true, "Zè™\u0017'eꕤ᱕l,0\\X\u001c[=雿8è ¬L<\/낲긯W99g톉4ퟋbãº\u0007åŠ'!麕Q궈oW:@XáŽïœ¬z蘻m絙璩귓죉+3柚怫tSæ‡è’£ä -æ“¶D[0=퉿8)q0ÙŸ", "唉\nFA椭穒巯\\䥴䅺鿤S#bè¿…ç˜ ï¶—ê¬˜\\?q1qN犠pX꜅^䤊⛤㢌[⬛휖岺q唻ⳡí‹\"ã™™Eh@oA賑㗠yå¿…Nꊑᗘ", -2154220236962890773, -3.2442003245397908E18, "Wá„¿ç­ :瘫퀩?o貸q⊻(᎞KWf宛尨h^残3[U(='æ©„", -7857990034281549164, 1.44283696979059942E18, null, {"ꫯAwè·­å–€ ?_ï““9\"Aty背F=9缉ྦྷ@;?^鞀w:uN㘢Rá»": [ 7.393662029337442E15, 3564680942654233068, [ false, -5253931502642112194, "ç…‰\\îš¶î¶è¾Žî›¢à³†ç½5â’­1äªäƒ‘s䎢:[e5}峳ﴱn騎3?è…³Hyêƒè†¼N潭錖,Yá‹ËœYAá“㬠bG렣䰣:", true, null, { "â’›'P&%죮|:â«¶ì¶ž": -3818336746965687085, "钖m<\/0ÝŽMtF2Pk=瓰୮洽겎.": [[ -8757574841556350607, -3045234949333270161, null, { "áœî…½rè¼³>⫇9hU#î¦#w@ê·ªA\\Cî’¢ é‹ºã˜“ê–æ¢’뒬묹㹻+郸å¬ìœ¤'+g<\/碴,}ꙫ>ì†;情d齆Jä¬àº©æ’›ì±íƒ¹/R澡7剌tꤼ?ặ!`â²ç¤\u00002똥଴âŸ": null, "\u20f2ܹe\\tAê¥Æ°\\x当뿖ï»ë ‰ç¦›;G檳ﯪï…Sà«°3~㘠#[J<}{奲 5箉⨔{ë†<\/釿抋,åš /曳m&WaOvT赋皺璑ï“í…": [[ false, null, true, -5.7131445659795661E18, "è­m䓪D5|3å©à°ž>î‰è ‡æ™¼6nï´ºPp禽羱î¤DS<ç“닫屚ì‚å§¿", true, [ -8759747687917306831, { ">ⓛ\t,odKr{䘠?b퓸C嶈=DyEᙬï¿@ᴔ쨺芛髿UT퓻春<\/yê¸>豚W釺N뜨^?꽴﨟5殺ᗃç¿%>í‚ဿ䄸沂Ea;A_\u0005閹殀W+窊?Ꭼd\u0013Pæ±´G5ì“æ˜": 4.342729067882445E-18, "Q^즾眆@AN\u0011Kb榰냎Y#ä€ê€’ᳺ'q暇çµs\"!3#I⊆畼寤@HxJ9": false, "⿾D[)袨㇩i]웪䀤ᛰMvR<èŸã£¨": {"v퇓L㪱ꖣ豛톤î£\\ê³±#ï–©kDTN": [{ "(ì¾´ä¡£,寴ph(C\"ã³¶w\"憳2s馆E!n!&柄<\/0Pꈗſ?㿳Qdéµ”": {"娇堰孹L錮h嵅⛤èºé¡’?CglNæŸ+쨣ﺜ\\MrH": {"çžäŽ‡ë‘ƒá‰²å¼­íŒ­^ꄞ踦涟XK錆쳞ឌ`;੶S炥騞ଋ褂B៎{Ú’ä­·á¶¼éœpIè—è™¶K$": [{"â—–S~躘蒉꫿輜è­Qã½™é—@ᢗ¥Eæ¦iØ¡5┄^B[絮跉ᰥé™PWi3wㄾⵀDJ9!w㞣ᄎ{ë“’ê““b6\\篴??c⼰鶹⟧\\鮇ꮇ": [[ 654120831325413520, -1.9562073916357608E-19, { "DC(æ˜è¡µá¼¡ê¸™ê°µå§­|Ö›[t": 7.6979110359897907E18, "Jâ…))嫼â³9Xfd飉j7猬ᩉ+⤻î®çœ—벎Eé°‰Zï¾¶63zá69}Zá¶L崭ᦥ⡦éšâ‹›êŽ¨î´µ~i㨃咊ꧭo䰠阀3C(": -3.5844809362512589E17, "p꣑팱쒬ꎑ뛡Ꙩ挴æèƒ”&7ᔈ묒4Hdç¡¶í›ãŽ–zꢼè±ã¿¢aሃ=<\/湉鵲Eî„¡Ó…%$F!í¶æ£Œå­¼{Oé§à¨ºgeu+": ")\u001bìž“kÅ€Xì©«Aë°Â®Ú£ç™¦ç‹¢)扔弒p}k縕ꩋ,䃉tࣼi", "ã‚¡F肿輸<솄G-䢹䛸êŠl`Tqê•—îŠè’ža氷⸅ᴉ蠰]S/{J왲m5{9.uá½³~㕚㣹u>x8Uè®Bëºè¥ªç›ŽQhVS맅킃i识{벂磄Ià·„ä™…xZy/æŠà«­Zï–Šé²î¦š-霳Væ®æŒ¦â„’": null, "㯛|Nî½™ê¸b7âµb?æ‹ O\u0014Þ†?-(EꞨ4ꕷᄤYᯕï‘OW瞺~螸\"욿ќe㺰\"'㌢ÆW\u0004çž•>0?V鷵엳": true, "뤥G\\î¡‹è¿‹ä ¿[庩'꼡\u001aiá©®Vì¯á³ªä¦ªÃ”î²…;倱ନë›èªˆ": null, "쥹䄆䚟Qæ¦äŽá¢­<\/2ã•£p}HW蟔|äƒî‚꿈ꚉ锳2Pb7㙑Tⅹᵅ": { "Y?Ö­$>#cVBꩨ:>ï†eLè’å‹™": { "86柡0po äš&-æ‘Ћ祌<\/휃-G*㶢הּì©s㶟餇c걺yu꽎還5*í„§ç°•Ogå©¥Sê": null, "a+葞h٥ࠆ裈嗫ﵢ5輙퀟ᛜ,QDﹼ⟶Y騠锪E_|x죗jä¾µ;m蜫轘趥?븅w5+miì½›L": { ";⯭ﱢ!ä¹°Fâ½æŸ¤é¶‚näµ£V㫚墱2ë ¾ELEl⣆": [ true, -3.6479311868339015E-18, -7270785619461995400, 3.334081886177621E18, 2.581457786298155E18, -6.605252412954115E-20, -3.9232347037744167E-20, { "B6㊕.k1": null, "ZAê„®Jé®·á³±o갘硥鈠䠒츼": { "á•…}럡}.@y陪é¶r業'æ´î‰°í€‰x䉴ﵴlí˜):씭脴ᥞhiꃰblﲂ䡲엕8߇Mã¶­0燋標æŒ-?PCwe⾕J碻Ᾱ䬈䈥뷰憵賣뵓痬+": {"aì·©v礗X⋈耓áŠfç½…é®!㔽YYᣓwæ¾33⎔芲F|\"äœT↮輦挑6ᓘL侘?ᅥ]ë†1R௯✎餘6ê½<\/௨\\?qå–·ê«j~@ulq": {"嗫欆뾔Xꆹ4H㌋Fåµ§]à Ž]ã –1ꞤT<$më«O i댳0ä²iï—Œ": {"?à·©?\u20cd슮|ꯆjs{?îž…d7?eNs⢚嫥氂䡮쎱:鑵롟2hJꎒﯭ鱢3춲亄:ë¼£v䊭諱Yj択cVmR䩃㘬T\"Ní™*ै%x^F\\_s9ë³´zz4æ·—?q": [ null, "?", 2941869570821073737, "{5{殇0ä¾ïž¢g6ë°–í‹è‡©ç¶¹R$ä–­j紋釰7î‹‘sXI繳漪행y", false, "aH磂?뛡#惇då©…?Fe,ì˜+늵ä˜\"3r瘆唊å‹ï¢Šj⳧࠴ꇓ<\/唕윈x⬌讣䋵%拗ᛆⰿ妴á”M2ã³—å¿…ê§‚æ·²?ゥ젯檢<8ë’ï¶MidXä’3á³»Qî”â–®ä½UT|⤪봦éâŠ", [[{ "颉(&뜸귙{yîš’^\"P퟉ì¶á²Ÿä®­î‹ºDé¡¡9=?}Y誱<$bë±£RvO8cH煉@tk~4ǂ⤧â©å±‹Sî›ïž¢S;J{vV#剤餓ᯅc?#a6D,s": [ -7.8781018564821536E16, true, [ -2.28770899315832371E18, false, -1.0863912140143876E-20, -6282721572097446995, 6767121921199223078, -2545487755405567831, false, null, -9065970397975641765, [ -5.928721243413937E-20, {"6ì´Š\u001a홯kB0w撨燠룉{绎6⳹!í„è´‘y▾鱧ժ[;7ᨷ∀*땒䪮1x霆Hᩭ☔\"rî¹›ä7毟á°r惃3ꉭE+>僒æ¾": [ "Ta쎩aÆt쵯ⰪVb", [ -5222472249213580702, null, -2851641861541559595, null, 4808804630502809099, 5657671602244269874, "5犲﨣4mᥣ?yf젫꾯|䋬ìž$`Iⳉﴷ扳å…,'î±c", false, [ null, { "DyUIN쎾M仼惀⮥裎岶泭lh扠\u001e礼.tEC癯튻@_Qd4cï…«5S熯A<\/ï¼¼6U윲蹴Q=%푫汹\\\u20614b[௒Câ’¥Xe⊇囙b,ï®æœ3ss땊ë¢i~逇PA쇸1": -2.63273619193485312E17, "Mq꺋貘k휕=nKç¡ë«žè¼©>㾆~á¼žà¡¹ê¸æ¦µlâ‹™Hw뮢帋M엳뢯î¹…vâ…ƒ^": 1877913476688465125, "á¶´ë»—`~ç­—å…⚽টW˃â½b犳䓺Iz篤p;乨A\u20efì©?ç–Šmã€ì»©ë«¡b탔鄃ᾈV(é¢ç³=뎲ିeF仢䆡谨8t0醄7㭧瘵⻰컆r厡궥d)a阄á·Ed&c﯄伮1p": null, "â¯w4曢\"(欷輡": "\"Má­«]䣒頳B\\燧ࠃN㡇j姈g⊸⺌忉ꡥF矉স%^", "㣡Oᄦ昵⫮Y祎Sì級㭻撥>{I$": -378474210562741663, "䛒掷留Q%ì“—1*1J*ë“헩ᦢ﫫哉쩧EↅIcê…¡\\?â´Šl귛顮4": false, "寔愆샠5]ä—„IHï©¥=d﯊/å¶?ॊn%晥D視Nò—˜ˆ'᫂⚦|X쵩넽z질tsî¦kxDQ莮Aoﱻ뛓": true, "é’£xp?&\u001e侉/yä´¼~?U篔蘚缣/î”›I畚ï—?Q绊": -3034854258736382234, "꺲໣眀)â¿·J暘î©pИfAVì‚•ì³­Nꯗ4々'唄ⶑ伻㷯騑倭D*Okï¯ê§3bâ½_ï„¡<\/ì±£Xm톰á•䆄`*fl㭀暮滠毡?": [ "Dç”·p`V뙸擨å¿ë¸ª9c麺`淂⢦Yw⡢+kzÜ–\fY1䬡Hæ­)ë²¾Z♤溊-혰셢?1ï”<-\u0005;æ¢Tále\\ᛵߓﭩ榩è¨-xJ;å·¡8깊è ï»“U$K": { "Vê•¡è«…æ“W=斸s︪vﲜ츧$)iꡟ싉eî®å¯³?ጭムVથ嵬iæ¥Fg<\/Z|៪ꩆ-5'@ꃱ80!燱R쇤tç³³]罛逇dṌ֣XHiͦ{": true, "Ya矲Cë©—Q9膲墅æºíœ»c\\ë”¶Gç””<\/.齵휴": -1.1456247877031811E-19, "z#.OOï¿J": -8263224695871959017, "å´_3夼ᮟ1Fë¸ë½¯á¦“é´­V豈Ь": [{ "Nè’¬74": null, "yuB?厅vK笗!ᔸcXQ旦컶P-ë…«mᄉ麟_": "1R@ 톘xa_|﩯é˜î¥§sæ§žd!d껀筤⬫è–焵먑D{\\ïƒïŽ¿6k共倌☀G~AS_D\"딟쬚뮥馲렓쓠攥WTMÜ­8nX㩴䕅檹E\u0007ï­¨N 2 ℆æ¶ê¥ê µï“3▙玽|ë¨_\u2048", "æA Cä§©G": {":Mí£5e들\\ê€æ¼á”„é¸|Iï¨$)n": { "|U䬫㟯SKV6ꛤ㗮\bn봻䲄fXT:㾯쳤'笓0b/à³¢Cì³–?2浓uO.ä°´": "à½ê¼‹e?``,ᚇæ…^8ꜙNM䂱\u0001Iá–™ê§M'vKdꌊH牮r\\O@䊷ᓵ쀆(fî »yè»i툺\"?<\/峧ࣞ⓺ᤤ쵒߯ꎺ騬?)刦\u2072læ…ªy꺜ﲖTjî’•+u", "뽫hh䈵î”w>1â²ì­V[â…Ž\\헑벑F_ã–⠗㫇hæ½;á¿æ±°á±¼ç€–J옆9RRì…vsZ柺鶶툤r뢱橾/ꉇ囦FGm\"謗ꉦ⨶쒿⥡%]鵩#ᖣ_蹎 u5|祥?O", null, 2.0150326776036215E-19, null, true, false, true, {"\faá­¶Pæ¤WWcá Ÿf뚉á¬í“—â³€Wç¹5:HXH=q7xì°™X$)모r뚥ᆟ!Jﳸf": [ -2995806398034583407, [ 6441377066589744683, "Mﶒ醹i)Gἦ廃s6몞 KJ౹礎VZ螺费힀\u0000冺업{è°¥'꡾뱻:.ꘘ굄奉攼Diá·‘Ké¶²y繈욊阓v㻘}枭캗e矮1c?íœ\"4\u0005厑莔뀾墓ë‚⽴洗ṹ䇃糞@b1\u0016즽Yè½¹", { "1⽕⌰鉟í”M㤭n⧴ỼD#%é˜âŠ¯ì¿¼ç¨ë¸£ëªç´§á…‡ã“•ᛖcw嬀~ഌ㖓(0r⧦Qä‘•é«à´°é“‚㓻Rå„®\"@ꇱmâˆà¯¿á¦¯é Œ8}㿹犴?xn잆꥽R": 2.07321075750427366E18, "˳b18㗈䃟柵Z曆VTAu7+㛂cb0﯑Wp執<\/臋뭡뚋刼틮è‹ë²²î·´TLP预庰܈G\\O@VD'鱃#ä¹–ëº*鑪ꬳ?MÞždï­¹{â‡åœ¯ì‡œã¼ž顄︖Y홡g": [{ "0a,FZ": true, "2z̬è£î’®ê§¦é©¸\u0006L↛Ḣ4๚뿀'?lcwá„§ã®!蓚䃦-|7.飑挴.樵*+1ﮊ\u0010ꛌ%貨啺/JdM:ë˜ïˆ!FBe?鰴㨗0Oè´¢I藻ʔWAá«“Gì³›u`<\/I": [{ "$Ï„5Vé´a뾆両環iZp頻යn븃v": -4869131188151215571, "*즢[⦃b礞Râ—šnΰꕢH=귰燙[yc誘g䆌?ଜ臛": { "洤湌鲒)⟻\\䥳va}PeAMnï¼®[": "ã³Éª/(軆lZR,Cpæ®È®Nå•·\"3Bå©´?i=r$펽á¤ì€¸", "阄R4㒿㯔ڀ69ZᲦ2ç™í•Œå™—På´œîž#\\-ì­è¢›îˆµ&é‘/$4ç«¥Vê©‘_ZHAæ¾¢fZ3": {"x;P{긳:Gé–‰:9?æ´»H": [ "繺漮6?z犞焃슳\">á»[Ⳛ䌜ë…䂹>èµâ¼¶ç…œï’˜Yæ¡¥[泥뚩MvK$4ï‰jtï¾›", "E#갶霠좭㦻ୗ먵F+䪀oè’ba쮎4X㣵 h", -335836610224228782, null, null, [ "r1á«©0>danjYì§¿bs{", [ -9.594464059325631E-23, 1.0456894622831624E-20, null, 5.803973284253454E-20, -8141787905188892123, true, -4735305442504973382, 9.513150514479281E-20, "7넳$螔忷㶪}䪪lì§´\u0007é¹Pé°šHFéŠZJﳴ/âŽ1ᷓ忉ç‡áœ‹ì“ˆxëµ mä·çª¥á”^\u0019á¶Œå­#ヂt☆áƒpáŽè‡¶äŸ±5ï‰$ä°µ&๵分ìˆ]äˆë‰â™‚åŽ\u0011<>", "C蒑貑è—lï°°}X喇몛;të°¿O7/᯹f\u0015îµ¼kI嘦<ዴ㟮ᗎZ`GWퟩ瑹࡮ᅴB꿊칈??Ræ ¡s脚", { "9çµæˆ¬+AU^洘拻ቒy柭床'ç²™XG鞕᠜繀伪%]hï ¾C,$è¼™?Utä¹–Qmë–šWï¶8઼}~qâ ªrU䤶CQ痗ig@#≲t샌f㈥酧l;yé—¥ZHæ–¦e⸬]j⸗?ঢ拻퀆滌": null, "畯}ã§¢J罚å¸VX㨑>1ꢶkT⿄蘥ã‘o|<嗸層沈挄GEOM@-äžšä§°$만峬è¼ä ±V✩5宸-æ‚î¡§D'ã—ªyP掶7bâ ŸJã•»SfP?d}v㼂á…'猘": { "陓y잀v>╪": null, "鬿L+7:ë‘Y=ç„ U;킻䯌잫!韎ஔ\f": { "é§«WmGጶ": { "\\~m6ç‹©K": -2586304199791962143, "ႜࠀ%Í‘lâ¿…D.ç‘¢Dk%0ç´ªdḨTI픸%뗜☓s榗኉\"?V籄7w髄♲쟗翛歂E䤓皹t ?)ᄟ鬲éœ6Cî³´": { "_ì·¤a圷1\u000eB-XOy缿請∎$`쳌eZ~æï€§íŠ»/蜞`塣৙\"⪰\"æ²’l}蕌\\ë¡ƒè«æ°Œ.望wZ|o!)Hnçqg}": null, "kOSܧ䖨钨:಼é‰ê­O醧Sî…¨`ì‹­`ꓭì­ï¯¢N&Et㺪馻ã¢â…³ã¢ºå´¡àºŠèœšé”«\\%ahx켨|ż劻ꎄ㢄ìŸA躊᰹p譞綨Ir쿯\u0016ﵚOd럂*僨郀N*bã•·63z": { ":Lï œ5r+T㡲": [{ "VK泓ë²á®™Ry㓤➙Ⱗ38oi}LJቨ7Ó㹡৘*q)1豢⛃e᫛뙪壥镇æž7Gè—¯g㨛oI䄽 孂L缊ꋕ'EN`": -2148138481412096818, "`â›á˜‘$(खꊲ⤖á„ꤒ䦦3=)]Y㢌跨NĴ驳줟秠++då­³>8ᎊ떩Eê¡£Sv룃 쯫أ?#Eî·°|á­™ãŽ?zv:5ï©^â‹‘V": [ -1.4691944435285607E-19, 3.4128661569395795E17, "ãƒì´—^G9ä½­é¾¶n募8R厞eEw⺡_ㆱ%⼨D뉄퉠2ê©µá›…â³æ¿L팹Là·€n=\"æ…‰ë…á›®y>!`g!í’²î¦ï¨’[/;?[vï®ê²è»‡}⤳â¤í•∌Tã½²R홓é‰ã“¥", "æ„°_⮹T䓒妒閤둥?0î°šaB@㈧gç„»-#~è·¬x<\/èˆPÝ„ê¡=\\׳P\u0015jᳪá¢qï‹¶;ã¯l%á­—;砢觨â–,è¬ê°Gy?躤O黩í‹Yã’a擯\n7覌똟_䔡]fJ晋IAS", 4367930106786121250, -4.9421193149720582E17, null, { ";ᄌ똾柉곟ⰺKpá‡ä±»à¸ºä–{o~h!ï½…ê¿àª»ìš„Úš\u0002y?xUd\u207c悜ꌭ": [ 1.6010824122815255E-19, [ "宨︩9앉檥pr쇷?WxLb", "æ°‡9】J玚\u000f옛呲~ è¼ 1D嬛,î•*mW3?n휂糊γ虻*á´«ê¾ ?qîžå‡è¶—Ko↦GTé“®", "ã¶¢ážmOã”k'诔栀Z蛟}GZé’¹D", false, -6.366995517736813E-20, -4894479530745302899, null, "V%᫡IIç’…ï»ä…›ä“Ží’¹ï±¢/pU9seë˜ë›žx梔~C)䨧䩻蜺(g㘚R?/á»°[å¿“C뾠ࢤc왈邠买?嫥挤풜隊枕", ",vç¢å–”㌲쟚蔚톬៓ꭶ", 3.9625444752577524E-19, null, [ "kO8란뿒䱕馔b臻âŸéš¨\"㜮鲣Yq5mí”K#ꢘug㼈á¦=P^6탲@ä§”%$CqSw铜랊0&m⟭<\/a逎ym\u0013îš¡vᯗ": true, "æ´«`|XN뤮\u0018詞=ç´©é´˜_sX)㯅鿻á»ì‹¹": 7.168252736947373E-20, "ꛊ饤ï´è¢(逊+~⽫얢鈮ï«è‰¬O힉7Dç­—S곯wæ“I斞᠈븘蓷x": [[[[ -7.3136069426336952E18, -2.13572396712722688E18, { "ç¡¢3㇩R:o칢行E<=\u0018á¬YuH!\u00044U%å炼2>\u001eSi$â“·ê’ˆ'ï‘¿ë ¢gᙫ番ꯒ㛹럥嶀澈v;è‘·é„•x蓎\\惩+稘Uî“´Eᖸﳊ㊈壋Nå«¿â¾æŒŽ,袯苷ኢ\\x|3c": 7540762493381776411, "?!*^á¢çª¯?\u0001ڔꙃw虜ë³îšFgJ?&⨫*uo籤:?}ꃹ=ٴ惨瓜Z媊@ત戹ã”똩Ԛ耦Wtè½\\æž’^\\ꩵ}}}ꀣD\\]6M_⌫)Hè±£:36섘㑜": { ";í™—á°°U஋㙛`D왔ཿЃS회çˆ\u001b-㢈`ë´†?盂㛣듿ᦾ蒽_AD~EEຆ㊋(eNwk=RÉ å³­qï’«\"5Ἠ婾^>'ls\n8QAK)- Q䲌mo펹L_îŽ¦ì¹æ¨–庫9ê©ìª¹á˜¹ä‘–ç€aK îž?*趤fë­“å»p=磕", "î“å“‘z懅á¤-ê¹ux쀭", [ true, 3998739591332339511, "ጻ㙙?᳸aK<\/囩U`B3袗ﱱ?\"/ké”ä§2ï…¤l@쿎VZ쨎/6ꃭ脥|B?31+on颼-ê®§,O嫚m à¡­`KH葦:粘i]aSUì“™$ì‚f+詛頖b", [{"^<9<ç®&絡;%iï«¡2攑紴\\켉hì“™-柂äšven\u20f7浯-Ꮏ\r^í›ä“ší—¬\u000e?\\ã…¡ÖºJë–·VOt": [{ "-௄å¶k㘆í˜à®½y⎱㢬sS઄+^瞥h;á¾·jî­;抭\u0003ë°«f<\/5â°§ï§§ï¡™_朻ï—%*[-撵䷮彈-芈": { "㩩p3篊G|å®®hz䑊oê³¥j^Co0": [ 653239109285256503, {"ê¶²?|\":N1Û¿æ°ƒNZ#깩:쇡o8킗ࡊ[\"ë¸Po핇1(6é°$膓}â½*)渽J'DN<ì™ê¸˜æ¯¦ë²Ysì¹–": { "2Pr?Xjㆠ?æ®/?㓦柖馃5뚣Nᦼ|é“¢rè¡´ã©–\"ç”æ¹—Üæ†": "\"뾯ië‡ç­ç‰»$ç²/4ka $åŒíœ´ï‹è¯‘zbAá©ê‡¸ç‘…&뵲衯ꎀᆿ7@ꈋ'ᶨH@á ´l+", "7뢽ëšv?4^ꊥ_⪛.>pởr渲<\/⢕疻c\"g䇘vU剺dஔ鮥꒚(dïŸv祴Xâ¼¹\\îºa8y5å†": true, "o뼄Bìšžç¾hrï·”í˜ë’šâ¿›U5pꪴfg!6\\\"爑ì䢱W<ï¶•î\\í…£ç‡oI/BK뺡'谑♟[Ut븷亮g(\"t⡎有?ꬊ躺ç¿è‰©nl F⤿蠜": 1695826030502619742, "ÛŠê¹–>ࡹ햹^ⵕ쌾BnN〳2C䌕tʬ]ì° ?ݾ2饺蹳ã¶êŒ­è¨\"â—¹á¬D鯎4e滨T輀ﵣ੃3\u20f3í‚™D瘮g\\擦+泙᧠鬹ﯨַ肋7놷郟lPå†{ß’hà§œr5,ê“‹": null, "á¿‹N$y{}2\\N﹯ⱙK'8ɜͣwt,.钟廣䎘ꆚk媄_î­®": null, "䎥eᾆá¦î‘§ì‰,JÞªn岪ã¥sî­•æ–謽䚔5tã¯ï–µï£šã°³ã±ŠZhD䃭f絕s鋡篟îža`Q鬃┦鸳n_é‚(E4è¿ _è§…ë·_宪D(NLî²ç–¶hL追V熑%]vè‚«=惂!㇫5⬒\u001fï²å–º4랪옑": { "2aè¼85먙R㮧㚪Sm}E2yîŠê†£ê«¨rRymã±è†¶á”¨\\tç¶¾A☰.ç„„ë™—9<쫷챻䒵셴᭛䮜.<\/慌꽒9å»Okä°ŠZ㥪幸k": [ null, true, {"쌞ì": { "â–ŸGL K2ië›±iï¼±\"Ì .옛1X$}涺]éŽæ‡ Ú¦ëŠ·?tfçŸÝžã‚Ÿ{": 1.227740268699265E-19, "ê’¶]퓚%ฬKâ…": [{ "(à·›@Ç®ã£ä§¼äµ¤[aテൖvEnAdUë –ë—ˆ@볓yꈪ,mÔ´|꟢ìº(而첸죕CX4Y믅": "2⯩㳿ꢚ훀~迯?᪑\\啚;4X\u20c2è¥B箹)ä¿£eá»»w䇄", "75༂f詳䅫ê§é¿ }3\u20b5'∓ä±è™€fè¼î‘”Iq鈆﨤gí©)BFa왢d0뮪痮Mé‹¡nw∵謊;ê§f美箈ḋ*\u001cî±ïœŸ`퇚í‹ä³«$!V#N㹲抗ⱉçŽ(V嵟ï«_bã³…\u0019": null, "e_m@(i㜀3ꦗ䕯䭰Oc+-ë ¨0뭦⢹苿蟰ê‚SVä°­å‹¢ë¥.ྈ爑Vd,á•¥=í€)vz뱊ꈊB_6듯\"?{ã’²&㵞뵫ç–ë¡ë¯ˆ%Qwé™,?\ræž®\"? N~癃ruà¡—dn&": null, "㉹&'Pfs䑜공j<\/?|8oc᧨L7\\pXá­ 9᪘": -2.423073789014103E18, "ä„瑄䢸穊f盈᥸,Bî§§ë¾§í‘—íšµB1쟢f\u001f凄": "é­–âš2儉j꼂긾껢嗎0ࢇ纬xI4]ï„(à©“`蕞;픬\fC\"æ–’\")2æ«·I﹥迧", "ퟯ詔xæ‚ë ¹+T?Bg⥄섅kOeQí¼ã»´*{Eé¼6æ°¿L缋\u001c둌๶-㥂2==-츫I즃ã ï–˜Lg踞ꙂEG貨鞠\"\u0014d'.ç¼—ï¡gI-lIb䋱ᎂDy缦?": null, "î’¢ç´Mã¦çŠ¿w浴詟棓쵫G:äœ?V2íž½7N*n&ã–ŠNd-'ຊ?-樹DIv⊜)g䑜9뉂ㄹí‘阉~ê…쵃#R^\u000bïž®B䌎䦾]p.䀳": [{"ϒ爛\"ꄱ︗竒G䃓-î†ã¾å¸³ã‚.j)qguæ‰å¾£à¨Zé¼—A9A鸦甈!kè”å–™:3Tî†%&ã ˜+,ä·ž|ì±½v䚞문H<\/醯rì…“ã¶¾\\a볜åºzEä·_죤ဵ뿰᎟CB": [ 6233512720017661219, null, -1638543730522713294, false, -8901187771615024724, [ 3891351109509829590, true, false, -1.03836679125188032E18, { "j랎:g曞ѕᘼ}链N", -1.1103819473845426E-19, true, [ true, null, -7.9091791735309888E17, true, {"}蔰鋈+ê¨å•µ0?g*사%`J?*": [{ "\"2wG?yn,ç™·BK\\龞䑞x?è ¢": -3.7220345009853505E-19, ";饹়â€)çš‹`噿焒j(3â¿w>å5Xè–™å©è¿3aFÆÃ": "2,ê“´g?_섦_>Y쪥션钺;=趘F~?D㨫\bX?㹤+>/믟kᠪ멅쬂Uzỵ]$ç§`mé›ç‘Šî’ඖ鯬cꙉ梢f묛bB", "♽n$YjKiXX*GOè´©éƒè±®ç¥´éžK醞眡}ê—¨v嵎꼷0à­¸+Mè‹eH徸Jîžê£†:â¼æ‚¥B켽迚㯃bè«‚\u000bjꠜ碱逮m8": [ "푷᣺ﻯd8ﱖ嬇ភHîªé¹Žâ¡±á±…0g:æžœ6$GQ췎{vá·§Yy-è„•xå¹ç ¡ï¨¬â®¸Cï§‚êš=軄H犠Gè°–ES詤Zè ‚3î§™lë´Ÿhï¿’7䦹1GPQG癸숟~[#é§¥8zQ뛣J소obg,", null, 1513751096373485652, null, -6.851466660824754E-19, {"ä©‚-â´®2Ù°K솖풄꾚ႻP앳1Hî³é·›wmR䗂皎칄?醜<\/&à §ã¬X濬䵈K`vJ륒Q/IC묛!;$vÏ‘": { "@-êš—xྐྵ@m瘬\u0010U絨ﮌé©\\켑寛넆T=tQã­¤Lì—°@脸삯e-ï–…î–‘:⩼u㎳VQ㋱襗ຓ<Ⅶ䌸cML3+\u001e_C)r\\9+Jn\\Pﺔ8蠱檾è…Pqé³è¯î¦§Tä„I": -1.80683891195530061E18, "á·­á‹»U~ཷsgSJ`᪅'%ã–”n5픆桪砳峣3ç®æž¾äŒ·âа呀ïŒ": { "Ş੉䓰邟自~X耤pl7间懑徛s첦5ਕXexh⬖鎥á€nNr(J컗|ૃF\"Q겮葲놔엞^겄+㈆è¯ã€¾í¬ç´G'E?飕1fâ¼í…¬æ‚šï•¦æ³¬ë¨Uç¬í›¶Qs": false, "î³…(\u20dag8í½íŠ£>^Y{뤋.袊䂓î†;_ïg]S\u202a꽬L;^'#î—™ë•bႌ?Cç·¡<ä²ä²æ–­ê6\u001asD7IK5Wxo8\u0006på¼Šâ¼‚ê¯æ‰µ\u0003`뵂픋%ꄰ⫙ë¶lå›å°›ïˆ®+ä—…E쟇\\": [ true, { "\n鱿aKã¡â’ã¼™2ì´¹f;`ì¾qIà¡”G}ã·äç“°w늮*ç²…9뒪ㄊCj倡翑閳R渚MiUO~仨䜶RꙀA僈㉋⦋n{ã–¥0딿벑î§é€¦â¥»0î¾®h薓쯴ê»": [ 5188716534221998369, 2579413015347802508, 9.010794400256652E-21, -6.5327297761238093E17, 1.11635352494065523E18, -6656281618760253655, { "": ")?", "TWKLꑙ裑꺔UE俸塑炌Ũ᜕-ï’‚o\"徚#": {"M/癟6!oI51niíš=댡>xê¨\u0004 ?": { "çš­": {"⢫䋖>u%wî²´ìž¼<ä•ê˜P䋵$é­‹æ‹U䮎緧皇Y훂&|羋ꋕ잿cJ䨈跓齳5\u001a삱籷I꿾뤔S8㌷繖_Yឯ䲱B턼Oæ­µF\\l醴o_欬6ç±=D": [ false, true, {"Mt|êžD|Fê¶£MQ뵕T,ëºk+?ãµi": [ 7828094884540988137, false, { "!༦鯠,&aﳑ>[euJê½ç¶·æB.h": -7648546591767075632, "-n켧嘰{7æŒæ¯„Y,>â螵煫乌pv醑Qå¶š!|âŒè²¬0왾ë¢ê…蛨S\\)ç«°'舓Q}A釡5#v": 3344849660672723988, "8é–ªéºV=鈢1녈幬6棉⪮둌\u207d᚛驉ꛃ'r䆉æƒà¥ˆ|bἧﺢᒙ<=穊强s혧eꮿ慩⌡ \\æ§³W븧J檀C,ᘉì˜0俯퀉M;筷ࣴ瓿{늊埂鄧_4æ¸Nn阼Jੵ˥(社": true, "oë¼€vwï…®)4A뢵(î¼±a䵢)p姃뛸\u000fK#KiQp\u0005ê…芅ì…îª": null, "ç ¥$ꥸ┇耽uæ–®Gc{z빔깎밇\\숰\u001eê´·å„㶇쵿_á´„+hç©¢p촀Ნ䃬zäé…³Ó‚31xꔄ1_ç šWë ˜G#2葊P ": [ -3709692921720865059, null, [ 6669892810652602379, -135535375466621127, "뎴iO}Z? 馢녱稹ᄾä©rSt帤넆&7ié¨ë©—ç•–ï”9誧鄜'w{Ͻ^2窭외b㑎粖i矪ꦨ탪跣)KEㆹ\u0015V8[W?⽉>'kc$䨘ᮛ뉻٬M5", 1.10439588726055846E18, false, -4349729830749729097, null, [ false, "_è ¢ã ^䟪/D녒㡋ỎCä’ˆíŒïŒ¢\u0006àªq@O펢%;é¹ìŒo戥~A[ꡉ濽ỳ&虃᩾è£å”™ï¤£èŒ¨Ig楡꒻M窓冉?", true, 2.17220752996421728E17, -5079714907315156164, -9.960375974658589E-20, "ᾎ戞༒", true, false, [[ "ⶉᖌX⧕홇)g엃⹪xëšç™Ÿ\u0002", -5185853871623955469, { "L㜤9ợㇶKé°â‹“V뽋˖!æ–«as|9"á¬ä†ª?î¾¶7胜&n薑~": -2.11545634977136992E17, "O8뀩D}캖qè‚6༣ã—䈓煮å½à¨†á޼Dᣘí›;": false, "YTá¡…^ï—Lã—ŽcbY$pᣞ縿#fh!ꘂb삵玊颟샞ဢ$ä—é¼’ëª~rkH^:닮먖츸륈⪺쒉砉?㙓扫㆕꣒`R䢱Bé…‚?C뇞<5Iޚ讳騕S瞦z": null, "\\RB?`mG댵鉡å¹ç‰©äµŽæœ‰5*e骄T㌓ᛪç¾é§’Ku\u001a[柆jUq8⋈5鿋츿myï»—?é›ux঴?": 5828963951918205428, "n0æ™…:黯 î¶·xu씪^퓞cB㎊á¬âº˜Ù¤Öƒ~B岚3㥕擄vᲂ~F?Cä¶–@$mï›~å¿”S왖㲚?챴⊟W#벌{'ã°Iä ç¸s樘\\X뢻9í•¡I6èㄛî‚î«8쯶]wॽ0L\"q": null, "x增줖j⦦tä¢áŽ™ïŠ­ã›¿Yf鼘~ê«“æ„4惊\u209c": "oOhbᤃ᛽z&Bi犑\\3B㩬劇䄑oÅ쨅孥ë©àº–acA㖫借ãžvg싰샂ãœ#譞⢤@k]鋰嘘䜾L熶塥_<\/â¾å±ˆï®Š_mYè¹t뙺}Ox=wé®®4S1ê©ï¬¾'å·‘", "㗓蟵ꂾe蠅匳(JPä—à·¸\u0089耀왲": [{ "ᤃ㵥韎뤽\r?挥O쯡⇔㞚3ä¼–\u0005Pî•⋪\"Dê¶£QLn(⚘罩䩢Ŏv䤘尗뼤ë›O淽鋋î¡é—šrå´©a{4ç®™{煷m6〈": { "l곺1L": { "T'ਤ?ç …|੬Km]ä„©\"(à¿¶<\/6U爢䫈倔郴l2ã´±^줣k'Læµ–Lé°„Rp今鎗⒗Cì–¨Mí›ã¡§Î˜X粜뫈N꤇輊㌻켑#㮮샶-ä—룲è ç™œã±V>=\\I尬癤t=": 7648082845323511446, "鋞EP:<\/_`á§e混ㇹBd⯢㮂驋\\q碽饩跓྿ᴜ+j箿ë ã—‘yK毢宸p謹h䦹乕U媣\\炤": [[ "3", [ true, 3.4058271399411134E-20, true, "æ€+憱f逮@먻BpW曉\u001aã£âŽŠ$n劈D枤㡞좾\u001aá›ïŒƒè‹”౩é—1B䷒Ṋ݋âžê€žêƒç£$t੤_:蘺⮼(#N", 697483894874368636, [ "vᘯ锴)0訶}䳅⩚0O壱韈ߜ\u0018*Ué¾ä–=䧉뽑å•휻ID쿇嘗?ꌸῬ07", -5.4858784319382006E18, 7.5467775182251151E18, -8911128589670029195, -7531052386005780140, null, [ null, true, [[{ "1欯twG<\/ï†Q:0怯押殃탷è«ì‚¬<ỗꕧ蚨ä¡ï¨î³‰nDꌕ\u001cë…¬~蓩鲃g儊>ê¡l㻿/â‘·*ì±³6㻜W毤緛ﹺᨪ4\u0013뺚J髬e3쳸䘦伧?æª&{L掾p+꬜MäŠd娘6": { "2p첼양棜h䜢﮶aQ*c扦v︥뮓kC寵횂S銩&Ç{O*य़iH`Uí…à¡“rä©•5ꄸ?`\\á§«?ᮼ?t〟崾훈kè–ì/iy꤃뵰z1<\/AQ#ë¿©8jJ1z@u䕥": 1.82135747285215155E18, "ZdN &=dë…„á…†'ì‘â…‰:烋5&áŸï”‹á„‚汎æ¥L㯄固{é’§u\\ãŠíŠšeæ‘‘&tå—„ê–„UbâŒ?m䴘熚9EW": [{ "ଛ{i*a(": -8.0314147546006822E17, "⫾ꃆY\u000e+W`௸ \"Më’¶+\\ë·lKE}(NTí‚¶Yjé¸ç¯’î©¥ì¶'jNQ硾(똡\\\"逌â´y? IRꜘ὞鄬﨧:M\\fâ ‹Cꚜ쫊ᚴNV^Dä•—ã…–á¼”Iao꿬Câ8": [ 287156137829026547, { "H丞N逕⯲": {"": { "7-;枮阕梒9á‘„Z": [[[[ null, { "": [[[[ -7.365909561486078E-19, 2948694324944243408, null, [ true, "荒\"并孷䂡쵼9o䀘F\u0002龬7⮹Wz%厖/*? a*R枈㌦ë¾g뒠䤈q딄㺿$쮸tᶎ릑弣^éŽ<\/Y鷇驜L鿽<\/ì¶‹9Mᲆឨ^<\/庲3'lë‚¢", "c鮦\u001bë‘\\~?眾ಢu݆綑෪蘛轋◜gȃ<\/â´ƒcpkDt誩܅\"Y", [[ null, null, [ 3113744396744005402, true, "v(y", { "AQ幆h쾜O+꺷铀ꛉ練A蚗⼺螔jãŒ3꽂楎䥯뎸먩?": null, "蠗渗izé±–w]擪E": 1.2927828494783804E-17, "튷|䀭n*曎b✿~æ¤U]î­¡Gz鄭kW|ã´š#㟗ഠ8u擨": [[ true, null, null, {"⾪壯톽g7?㥜ώQê‘㦀æƒã§½î“¡ä¼“\\î¦*᧰閖樧뢇赸N휶䎈pIæ°‡ï®é•Šmaᬠ탷#X?î³A+kÐM ༑᩟Ø?5꧎鰜ṚY즫궔 =ঈî³;ﳈ?*s|켦蜌wM笙莔": [ null, -3808207793125626469, [ -469910450345251234, 7852761921290328872, -2.7979740127017492E18, 1.4458504352519893E-20, true, "㽙깹?ë¨ä†¢:ä´ŽÛ»gæ® JBTU⇞}ꄹꗣi#Iî’¡ëµ£é‰r혯~脀ìƒ#釯:场:ä”>ä°®o'ã¼½HZ擓௧nd", [ 974441101787238751, null, -2.1647718292441327E-19, 1.03602824249831488E18, [ null, 1.0311977941822604E-17, false, true, { "": -3.7019778830816707E18, "Eå³¾æ†èŒ6xLIm縂0n2视֯J-ᤜz+ᨣè·mYDè±ç¹¹â¹ºäŠ“ëª“ï´€E(@è©®(!ï’Y膽#᎙2䟓섣A䈀㟎,囪QbKæ’wcG湎ꤧtGì—xâ¥ä¿Žj'A一ᯥ뛙6ㅑ鬀": 8999803005418087004, "よ殳\\zDâ§…%Y泥簳Uꈩ*wîRL{3#3FYHା[d岀䉯T稉駅䞘礄P:é—ˆWæ€ElBã¤å–¬èµ”bGä ¼U଄Nw鰯闀楈ePsDꥷ꭬⊊": [ 6.77723657904486E-20, null, [ "ཚ_뷎꾑è¹q'㾱ꂓ钚蘞慵렜떆`ⴹ⎼櫯]J?[t9Ⓢ !컶躔I᮸uz>3aã •i,錃L$æ°°í…°@7ë…«W㸮?ç¾§W뇧ꃞ,î—‘N鋮숪2ɼì½â”ä²6", "&y?뢶=킕올Za惻HZk>c\u20b58i?ꦶcfBv잉ETî…9jä¡¡", "imçŠÕƒbì¹§æ ¡\\뼾쯀", 9.555715121193197E-20, true, { "<㫚v6腓㨭e1ã•”&&V∌ᗈT奄5Lጥ>탤?튣瑦㳆ꉰ!(ᙪ㿬擇_n쌯IMá¿‹î£ã•¨â°æ«ˆá±·5풔蟹&L.ì²½e鰷쯃劼﫭b#ï­¶í“€7ë·„Wr㢈๧Tʴશ㶑澕é%": -1810142373373748101, "fg晌o?߲ꗄ;>C>?=鑰監侯Ktêµ…": true, "䫡蓺ꑷ]C蒹㦘\"1à°ƒ@å‘«\u0014NLä¾egå‘®á³,r$裢k>/\\?ㄤᇰﻛ쉕1஥'ÄŠ\" \\_?쨔\"ʾr: 9Sä˜ç¦ºáª§ê„‚㲄", [[{ "*ç¡™^+E쌺I1䀖ju?:⦈Ꞓl๴竣迃xKC/饉:\fl\"XTFᄄ蟭,芢<\/骡軺ëœhê˜\u001f銿<棔햳▨(궆*=ä¹¥b8\\媦ä·€ë«}닶ꇭ(Kej䤑M": [{ "1á¬?>옿Iâ•…C<ÞŽ?ꊌ冉SV5A㢊㶆z-๎玶绢2F뵨@㉌뀌oå¶”f9-庒茪ç“ë·³4": null, ";lá°³": "CbB+è‚»aä„·è‹*/볳+/4fq=ã°h6瘉샴4é“¢Yéª.⌖@哼猎㦞+'gꋸ㒕ߤï—ãž‘(ä¶’è·²tiâ‘´aî¥ç¡‚#Noë³”", "t?/jE幸YHT셵⩎Kî¹!Eq糦ꗣv刴w\"l$ο:=6:ç§»": { "z]鑪醊嫗J-Xm銌ç¿çµ¨c里ëç‚™Ep㣋é£ë˜¼åšŒä€“GPï¹–cmf4é¹­T䅿꣭姧â¸wy6ꦶ;S&(}ᎧKxᾂQ|tï¹ë»³k\"d6\"|Mlì·†hwLtê¼¼4$&8Պ褵婶鯀9": {"嵃닢ᒯ'î–›dá§«ä³³#Nî‡Xe3-붋鸿î¢à¬¢ë–“î§ž%dK\u0013䲎ê–YV.裸Râ‰rR3蟛\\:ì ¯:å—ĺLʆ넕>|텩鴷矔ꋅⒹ{tå­¶ã“‘4_": [ true, null, [ false, "l怨콈lá’", { "0wä²å¬§-:`䉅쉇漧\\Ü‚yㄨb%㽄j7ᦶ涶<": 3.7899452730383747E-19, "ꯛTẀq纤qå¶Vâ¿£?\"g}ი艹(쥯B î­T騠I=仵ë°X": {"KX6颠+&á…ƒ^fç•’y[": { "H?뱜^?꤂-⦲1a㋞&î‘®êƒç²¾Ii᤾챪咽쬘唂쫷<땡劈훫놡o㥂\\ Kâ´™Dç§¼Fæ°®[{'좴:례晰Iq+Iì­¥_T綺砸GOç…䟪ᚪ`î‘↹l羉qì¼Dê½áœ…훦: vUV": true, "u^yï³0㱓#[y뜌앸ꊬLã·©?蕶蘾â»KӼ": -7931695755102841701, "䤬轉車>\u001c鴵惋\"$쯃྆⇻në½€Gæ° Såª]à²²ê¨æ‡Qxኻ椕駔\\9ࣼ﫻ìœç£¡ï©ˆëºªá¶šë³l㕆t+sζ": [[[ true, false, [ null, 3363739578828074923, true, { "\"鸣詩 î›ë³°ã‘µgLã¯¦á¿…ì¶æ—«}ED辗ﮈI쀤-ꧤ|ã ¦Z\"娑ᕸ4çˆé¨ã£\"]ì³Af]茛⬻싦oèšk䢯ä©è½3廇喑ޅ": 4.5017999150704666E17, "TYႇ7ʠ值4챳唤~Zo&Ý›": false, "`å¡„J袛㭆ëºã³€N㺣`ê½å¶¥Kï¯SVᶔ∲퀠ç¾N딂X\"á¤hNﬨvI": {"\u20bbã­˜I䖵䰼?sw䂷쇪]î(泒f\"~;꼪FÔsá¦": {"p,'ꉂ軿=Aèš¶?bƉãµä…°è«¬'LYKL6B깯⋩겦뎙(ᜭ\u0006噣d꾆㗼Z;ä„äš”cd<情@äž‚3苼㸲U{)<6&ꩻ钛\u001au〷N숨囖愙j=BXWìš•^x芜å á¿™çˆ‚ë›·ê’»t✘Q\b": [[ "ç±›&ଃ䩹.ꃩ㦔\\C颫#暪&!勹ꇶ놽攺J堬镙~軌C'꾖䣹㮅ï¶å²ƒá™´éµ£", 4.317829988264744E15, 6.013585322002147E-20, false, true, null, null, -3.084633632357326E-20, false, null, { "\"짫愔昻 Xï«\"è—£j\"\"ë¨à½…ѻ㘤㬯0晲DU꟒㸃dë²€î¢ìœ’l䦾cà©»*3": null, "è°ˆWm陧阦咟ฯ歖擓Nå–´ã‹éŠ­rCCnVࢥ^♼Ⅾ젲씗刊Sà¼+_tèµ”\\bäšë‰¨ê¬«6펛cL䊘᜼<\/澤pF懽&H": [ null, { "W\"HDUuΌ퀟M'P4à¿°H똆ⰱﮯ<\/å‡è˜²\"C鴫ﭒж}ꭩ쥾t5yd诪ﮡí‰â´°@?æ°é†³rj4I6Qt": 6.9090159359219891E17, "絛ﳛ⺂": {"è«°Pã—®î˜è¦`ZQ?ꫦh*à´±cbâ§±}埌茥h{棩렛툽o3é’›5é®l7Q榛6_g)ὄ\u0013kj뤬^爖eO4Ⱈ槞鉨ͺ订%qX0Tì—å«·$?\\\"봅늆'%": [ -2.348150870600346E-19, [[ true, -6619392047819511778, false, [[ -1.2929189982356161E-20, 1.7417192219309838E-19, {"?åµ²2à¿2\u0001啑㷳c縯": [ null, [ false, true, 2578060295690793218, { "?\"殃呎ïˆ#ã‘‘F": true, "}F炊_æ®›oU헢兔êˆ,èµ­9703.Bæ•°gTz3â¬": { "5&t3,í–“Mݸᵣ㴵;꣫ä©â†³#ï¢@ë«·ä …ï¦+W-ࣇzᓃ鿕ಔ梭?T䮑ꥬ旴]u뫵막bBè®:왳둛lEh=숾鱠på’î›î­ˆ$ì§#?gâ¹·á—Švã·µ.æ–ˆu頻\u0018-G.": "ë½™m-ouࣤ஫牷\"`Ksꕞ筼3HlȨvCï¢î›¦å ˆ\"I]㖡玎r먞#'W賜鴇k'c룼髋䆿飉㗆xgå·¤9;芔cáŒ/ax䊨♢í“rå“㸫೼䢗da᩾\"]å±£`", ":M딪<䢥喠\u0013ã–…x9è•ã‘‚XO]f*Q呰瞊å­VP@9,㨣 D\\穎vˤƩs㜂-曱唅L걬/롬j㈹EB8g<\/ì„©o渀\"u0y&룣": ">æ°ç·©L/ä•‘ë¯êŸ˜îŸ”蕞^aBë’£+0jK⪄瑨痜LXK^힦1qK{æ·št츔X:Vm{2rçB뾄H첚7æ°¥?쉟䨗ꠂv팳圎è¸é½€\\", "D彤5㢷Gꪻ[lㄆ@὜⓰絳[ଃç½ì®¹â˜’[*0ꑚ㜳": 9022717159376231865, "Ò–aV銣tW+$é­¿\u20c3ïœäºœ~ë«¡ᙰ禿쨽ã¡fá¹¼zE/h": "5è‡ï’Œã‹‡á²¯ì®º? 昨탰Wム밎#'\"崲钅U?幫뺀â¾@4kh>騧\\0Ò¾EV=çˆî©®ÍŒUæ€%ꉼ 㮋<{j]{R>:gÔ©L\u001c瀈锌ﯲﳡꚒ'â«¿E4æšãŒ—뵉X\"Háœ", "ᱚגּ;s醒}çŠSἿ㦣&{T$jkB\\\tḮ앾䤹o<é¿(tW": "vb⯽䴪䮢@|)", "⥒í껉%惀뗌+녣迺顀qæ¢g⚯i⤭ë£Mç¹j̈́⽜A": -8385214638503106917, "逨ꊶZ<\/W⫟솪㎮ᘇb?ê ”i\"H㧺x෷韒Xꫨฟ|]窽\u001a熑}Agn?Má¶–a9韲4$3á»´^=ì煤áë·2䣃%ï…Žé· /eQ9頸쥎", 2398360204813891033, false, 3.2658897259932633E-19, null, "?ꚃ8Nnãž·å¹µd䲳䱲뀙ꪛQ瑓鎴]î’¶ä©‹-é°¾æ¡ï¾ä³¡??掊", false, -1309779089385483661, "ᦲxu_/yecR.6èŠ.áœ‡éŽ ~", -5658779764160586501, "ì’Œ:æ› =lìœä¢œwk#s蕚\"互㮉m䉤~0ë“䋙#Gîš¿;h숄옥顇෤勹(C7㢅雚ã¯Lâ …VVç°…<", null, -4.664877097240962E18, -4.1931322262828017E18, { ",": { "v㮟麑䄠뤵g{Më®.\u001bzt뢜뵡0Ǥ龍떟Ᾰ怷ϓRT@Lꀌ樂Uã â¾•e扉|bJg(뵒㠶唺~ꂿ(땉x⻫싉ìŠ;%0鎻V(o\f,NéŠ%nk郼螺": -1.73631993428376141E18, "쟧摑繮Q@Rᕾ㭚㾣4隅待㓎3è’Ÿ": [ 4971487283312058201, 8973067552274458613, { "`aæ™á£—î\u0015iBo¸": 4.3236479112537999E18, "HW&퉡ãåœïŸ†Y?ç‘¡Qyí›q!帰ï©s舠㫸zêš—aSæ­²v`G株巷Jp6킼 (ê·¶é”â¾î‹¥â¡ˆ>Mæ±ãžá‰´ê™²dv@i㳓ᇆ?é»": [ null, 4997607199327183467, "E㻎蠫á¾é«˜ä™Ÿè˜¬æ´¼æ—¾ï« í…›ã‡›?'M$㣒蔸=A_亀绉앭rN帮", null, [{ "Eᑞ)8餧A5u&ã—¾q?": [ -1.969987519306507E-19, null, [ 3.42437673373841E-20, true, "eê±·Må¢\"割Pâ›í§åŽ€R䱜3ï»´Oí“«r﹉⹊", [ -8164221302779285367, [ true, null, "爘y^-î¬?蘞Ⲽꪓaâ…ê¨}I", 1.4645984996724427E-19, [{ "tY좗⧑mrzïºã¿¥â´–᥷jè«…\u0000q賋è­êž„â®±S\nà¡£B/íƒêµª3ZÉ‘å¤o<\/;ë¡‹": null, "彟hæµ _|V4䦭Dᙣ♞uì¿»=ì‚®ã¦\u001e哀鬌": [{"6횣楠,qʎꗇ鎆빙]ã±­R굋鈌%æ ²j分僅ペ䇰wí¦î¼‹p蛃N溈ê¡ê€?@(GI뉬$ﮄ9èªê“š2e甸ڋ[äº,\u0011\u001cࢃ=\\+衪䷨ᯕ鬸K": [[ "ㅩ拏鈩勥\u000etgWVî–¨Xs陂è¦p狵w퓼{뮵_i\u0002ퟑႢâ¬d6é‹«F~챿æŸ\u0096äš¼1ۼ칥0꣯å„=鋷牋ⅈêžé¾", -7283717290969427831, true, [ 4911644391234541055, { "Iî¹éˆ’ì²½P릜朸W徨觘-HᎄíŸâ“º>8kr1{ê²µäƒã€›á¬¡Ì¨Oê·‘oä•'쿡鉕p5": "fvç²–RNçž–è›a?q꤄\u001d⸥}'ꣴ犿ꦼ?뤋?鵆쥴ë‹ä¡«s矷̄?à¶£/;괱絢oWfV<\/\u202cC,ã–¦0䑾%nè³¹g&T;|lj_欂N4w", "짨䠗;䌕u i+rà¹0": [{"9ä¥\\à°©8\"馇z䇔<\/á‚¡Y3e狚ì¡\"ุ6ï°†Zé–c\"Ll:ïŠê®¾ç–£<\/᭙O◌납୕湞9⡳Und㫜\u0018^4pj1;ä§å„‚ä—·à­—>@e톬": { "aâ‘‚Fé‹»Qèž°'<퇽Qè´ç€§{ᘪ,cP&~䮃Z?gI彃": [ -1.69158726118025933E18, [ "ê¶‚z簽㔛㮨瘥⤜䛖Gℤ逆Y⪾j08î±²Sn昞ꘔ캻禀鴚P謦b{ê“®mNéMᥙ5\"ç2냑I\u0011.L&=?6á„ ë»·X鸌t刑\"#z)o꫚n쳟줋", null, 7517598198523963704, "ኑQp襟`uá©„ræ–¹]*F48ꔵn俺ሙ9뇒", null, null, 6645782462773449868, 1219168146640438184, null, { ")ယ넌竀Sdä°¾zqâ«£âŒÊ¥\u0010á¿“' |磪&p牢蔑mï³V蘸૰짬꺵;K": [ -7.539062290108008E-20, [ true, false, null, true, 6574577753576444630, [[ 1.2760162530699766E-19, [ null, [ "顊\\憎zXB,", [{ "㇆{CVC9ï¼MN㜋ઘR눽#{h@ퟨ!鼚׼XOvXS\u0017á£=cS+梽៲綆16së½íœy屬?ᇳG2á´­\u00054쫖y룇nKcW̭炦s/鰘ᬽ?J|퓀髣n勌\u0010í™ P>j": false, "ç®´": [ false, "éžj\"ꮾ*엇칬瘫xṬ⭽ì©äƒ³\"-⋵?ᦽ댎Ĝ": true, "Pg帯佃籛n㔠⭹࠳ë·â‰»à¿Ÿ3ãž±ï“!î—-ì’¾!}쭪䃕!籿næ¶»J5ਲ਼yî˜vy;Rኂ%ᔡጀ裃;M⣼)쵂쑈": 1.80447711803435366E18, "ꈑC⡂ᑆ㤉壂뎃Xub<\/쀆༈憓قì¨×§\\": [ 7706977185172797197, {"": {"K╥踮砆NWࡆFy韣7ä밥{|紒︧䃀榫rᩛꦡTSy잺iH8}ퟴ,M?Ʂ勺ᴹ@T@~꾂=I㙕뾰_涀쑜嫴曣8IY?Ò¿o줫fऒ}\\S\"ᦨ뵼#nDX": { "♘k6?଱癫d68?㽚乳䬳-Vé¡·\u0005è•?\u0018䞊V{邾zã˜l]é›k臤~ൖHë’iꢥ]g?.G碄懺䔛pR$ä…’X觨lë´œA刊8R梒',}u邩퉕?;91Eî¦a䈈ë¯G⊶芔h袪&廣㺄j;ã¡ç¶½\u001bN頸쳘橆": -2272208444812560733, "æ‹‘Wﵚî²j鵼駳Oࣿ)#ã¾…é¡‚N傓çºy僱栜'Bê-!KF*ꭇK¦?䈴^:啤wG逭w᧯": "xᣱmYe1Û@霄F$ě꧘푫O䤕í€Pq52憬ꀜ兴㑗ᡚ?ï—ƒLé·íŸî—¼ë­zJê‘™}╆ᅨJB]\"袌㺲u8䯆f", "꿽á…㔂긱Ǧ?SI": -1669030251960539193, "ì‡É¨`!葎>瞺瘡驷錶â¤ï»®é…œ=": -6961311505642101651, "?f7♄꫄Jᡔ훮eì‡îª¼í¾á£ä­´KhखT;Qty}O\\|ë«Iá¿’Ne(5æƒê¥¶ã†·Y9ﮡ\\ oyâ­–-䆩å©m#xë´‰>Y鈕Eç–£s驇↙ᙰm<": {"퉻:dê‚&efᅫ쫢[ï„™\"ëˆëŠ–êº™|Ôå‰1Í–-K:Êšá­•/;ì–㷛]Iç—èŒ4gZ4âœkเꛘZ⥺\\Bʫᇩ鄨魢弞&幟ᓮ2̊盜", -9006004849098116748, -3118404930403695681, { "_彃Y艘-\"Xx㤩㳷瑃?%2ä¡éµ›o귵옔夘v*탋èŒ&㳈챗|Oé’§": [ false, "daꧺdᗹ羞쯧Hã¤é„³é ³<型孒ン냆㹀f4ã¹°\u000f|C*ሟ鰠(O<ꨭ峹ipຠ*yà³§4VQè””hVæ·¬{?ᵌEfrI_", "j;ꗣ밷é‚副]á—“", -4299029053086432759, -5610837526958786727, [ null, [ -1.3958390678662759E-19, { "lh좈T_ë¯Y\"伨\u001cꔌG爔겕ꫳ晚è¸â¿»ìT䯎]~e#฽燇\"5hٔ嶰`泯r;ᗜ쮪Q):/tç­‘,榄&5ï¤ëŽ«ç‹(": [{ "2áâ“›]r3C攟וּ9è³µsâ›”6'ஂ|\"ⵈ鶆ä¹ç¦3\"痰ࢤéœäµ©ì˜†äŒ€?æ •r7Oç°‚Isd?K᫜`^è®¶}zî°’8?zì–°î§T:X倫⨎ꑹ": -6731128077618251511, "|︦僰~m漿햭\\Y1'Vvخ굇á‰ì±¢cè¶–": [null] }], "虌魿閆5⛔煊뎰㞤ᗴꥰF䮥蘦䂪樳-Ká·-(^\u20dd_": 2.11318679791770592E17 } ] ] ]}, "묗E䀳㧯᳀逞GMc\bï•¹å¢¹ã“„ë–Æ &U??íŽŒé‘ åª‹k))ᄊ": null, "묥7콽벼諌J_DɯﮪMæ®´ä£,煚ྼ`Y:ì”§<\/â©«%yf䦀!1á²¶kì¶ŽQç±³W∠WC跉鬽*á›±iã´•L꘻ê€ì“ª\"_gé¿„'#tâ½™?,Wg㥖|D鑆eâ¥ìª¸åƒ¬h鯔咼ඡ;4TKèŽî¾‘졠嫞" } ] ] } ] ] ]}} } ]} }, "뿋뀾淣截䔲踀&XJ펖꙯^Xb訅ꫥgá¬>棟S\"혧騾밫ê²7-": "擹8C憎W\"ìµ®yR뢩浗絆䠣簿9äˆå¼•Wcy䤶孖ꯥïž;íŒ]輩ä3@{å 뽸0ï€á¡ˆìµ¡î›„Ⲇ\u001dLåŒê§2F~ݕ㪂@W^é½L襒ᦘî¢~沦zZ棸!꒲栬R" } ] ], "Z:ëƒàµ›5Iz찇䅄駠㭧蓡K1": "e8᧤좱U%?ⵇ䯿é¿\u0013縮R∱骒EO\u000fg?幤îš@֗퉙vU`", "äƒìªˆï‘’埽້=Ij,쭗쓇చ": false }]}} ] } ]} } ] ] ], "咰긖VM]á¼6䓑쇎çºetDÒŒ?ãžê©„퇫밉gj8è ƒ\"â©5䛹1ࣚ㵪": "ക蹊?⎲⧘⾚̀I#\"䈈⦞ë·`wo窭戕෱휾䃼)앷嵃꾞稧,Ⴆ윧9S?೗EMk3Მ3+e{â¹”Te驨7äµ’?타Ulg悳o43ï“¢" } ], "zQᤚ纂땺6#ٽ﹧vï¿¿#ࠫ휊冟蹧텈ꃊʆ?&a䥯Deæ½|ì¿“pt瓞㭻啹^盚2êŠf醪,ì–T窧\\Di䕎谄nn父ꋊE": -2914269627845628872, "䉩è·|㨻ᷢã‰B{蓧瞸`î°²I!℄욃힕#ೲᙾ竛ᔺCjk췒늕貭è¯\u0017署?W딚%(pê⤼ë³^=on뺲l䆼bzrﳨ[&j狸䠠=ᜑꦦ\u2061Õµnj=牲攑)Mî»\\é¾": false, "뎕y絬᫡⥮Ϙᯑ㌔/NF*Ë“.ïž¿,QEzvK!Iwz?|쥾\"ê©»Lê¼—Bê”§è³´ç·œs뉣隤茛>ロ?(?^îµ­`>冺飒=噸泥⺭Ᲊ婓鎔븜z^å·è£®Ãªâ“…à»—jM7ﶕ找\\O": 1.376745434746303E-19 }, "ä›ræ»–wã¤,|Nዜ": false } ]], "@ê¿™?è–•å°¬ gd晆(ë„5躕ﻫS蔺4)떒錸ç“?~": 1665108992286702624, "wë¯ná =`঺ᅥC>'從ë槷ä¤çœ·èž„ãŽ»æ°æ‰°XᅧCè´½uáƒë‚ŸjKD03T!lDV쀉Ӊy뢖,袛!终캨G?鉮Q)â‘—1쾅庅O4ê‰H7?d\u0010蠈줘월Þ粯Q!낇껉6í…|{": null, "~Ë·jg쿤촖쉯y": -5.5527605669177098E18, "펅Wᶺzê†ã¨í‘­e?4j仪열[D<鈑皶婆䵽ehS?袪;Hê¨Më—Žã°[(å—M3qíŸg4y╸鰧茀[Bi盤~ï«å”Žé‹†å½ºî½«â¦Šq?î–³B4쉓癚O洙킋툈䶯_?ퟲ": null } ] ]] ]], "꟱Ԕã¤7æ›ï¦—ಃéŒVä·°?v㪃૦~K\"$%请|ꇹn\"kä«›ã¨é²¨\u2023ä„¢\u0004[︊Vï‹•J?䶟ាꮈ䗱=깘U빩": -4863152493797013264 } ]}]} ] }}} ], "ì·ì²Û¹í‰ƒ~aEå”™a챑,9㮹gLHd'ä”|í‚—ãžäŽ¥&KZYTë§µ7䥺Nâ±³åŒèŽžé¿§w\\༌疣n/+ꎥU\"å°ëž¾â—‹íŸ™AJá­Œ?9ä›$?é©”9è®ì§˜é­¡TÖ¯cè—³`虉Cì‡ì¦T" } ], "è°¶ê°œgTRï¿>áµÍšdtæ™‘ä‰‡é™æ»º}9㉸P漄": -3350307268584339381 }] ] ] ]] ] ], "0y꟭馋X뱔瑇:䌚ï¿å»¿jîžg-懲鸭䷭垤㒬茭u賚찶ಽ+\\mT땱\u20821殑ã„J쩩䭛ꬿNSæ½”*d\\X,壠뒦e殟%LxG9:摸": 3737064585881894882, "í’µO^-â§§â…¶vѪ8廸鉵㈉רâ†Q㿴뺟EႳvNM:磇>wî·/៻唎뷭୥!냹D䯙iëµ±è²C#⼉NH6`柴ʗ#\\!2ä‚—â±§f?諳.Pëˆ-è¿”I꘶6?8î“ê˜": -8934657287877777844, "溎-è˜å¯ƒi诖ര\"æ±µ\"\ftl,?d⼡쾪⺋h匱[,à·©I8MÒ§F{kç“¿PAî…§'橸ꩯ綷퉲翓": null } ] ], "ោ係Øî½<å…ƒ": 1.7926963090826924E-18 }}] } ] ]]}] }] ] ] ] ], "ጩV<\"Ú¸sOᤘ": 2.0527167903723048E-19 }] ]} ] ]], "∳㙰3ì ´pá§—ä±™?`yZA8Ez0,^á™›4_0븢\u001ft:~䎼s.bb룦明yNP8弆Cå¯;⪾ì§'蕴뮛": -6976654157771105701, "íµê¦€\\㇑:nî‹™v+뒤燻䀪ﴣï·9ᚈ኷K㚊誦撪䚛,ꮪxሲ쳊\u0005HSf?asg昱dqꬌVꙇ㼺'k*'㈈": -5.937042203633044E-20 } ] }], "?}\u20e0],så¶³è‹@#2uì’´sQSä©—=ꥮ;烌,|ꘔ䘆": "á…©ì˜Nç’ kZ먕眻?2ቲ芋眑D륟渂⸑ﴃIRE]å•—`K'" }}, "쨀jmV賂ﰊå§ä‚¦çŽžã¬™áªM᪟ïՎ씜~`uOn*ॠ8\u000ef6??\\@/?9見d筜ﳋB|Sä¬è‘«ã½o": true }, "즛ꄤ酳艚â‚㺘봿㎨iGà§•à¡¿?1\"䘓您\u001fSáŠâº¿æºzៀ뻤B\u0019?ìœa䳵᭱䉺膷d:<\/": 3935553551038864272 } ] ]} ]] ]] ]} } ] } ]]}}, "᥺3h↛!ê‹°y\"攜(ெl䪕oUkc1A㘞ᡲî촾ᣫ<\/ä’ŒEã›æ½¨i{ï  v?Wà±¾H\\RჅpzè¬R脾;v:碽✘↯삞鷱o㸧瑠jcmK7㶧뾥찲n": true, "ⶸ?x䊺â¬-ä°…â‰!e쩆2ꎿ准G踌XXᩯ1ß}0?.í—€Z馟;稄\baDꟹ{-寪⚈ꉷ鮸_L7ƽᾚ<\u001bጨA䧆송뇵⨔\\ç¤ë—”d设룱㶉cq{Hyã±R㥽å¢ï¬…p": -7985372423148569301, "ç·«#ì½®IB6<\/=5Eh礹\t8럭@饹韠r㰛斣$ç”LVì·a갵îŸ'请o0g:^": "䔨(.", "ë³â„¡åœ¤pï¾à¯„Ä倧訜BìŸGä™”\"Sbâ“®;$$â–S1J뢙SF|赡gï„€*\"Vu䲌y": "䪈&í‹),\\kT鬜1í’¥;ë·´'Zေ䩹@Jéž½Nã¼M?å¥eWb6榀ƩZڮ淽⺞삳煳xჿ絯8eâ¶ç¾·V}ჿ쎱䄫R뱃9Z>'\u20f1â“•äœé½®" } ] ]]] }} } ] ]}, "펮b.hç²”í¯2npXè©«g錰鷇㇒<ì™S値bBi@?镬矉`剔}c2壧ଭfhY깨R()痩⺃a\\â”?M&ﯟ<劜꺄ï‘멊ᄟA\"_=": null }, "~æ½¹Rqn榢㆓aR鬨侅?䜑亡V_ç¿…ã­”(ä“·w劸á³Dp䀅<\/ï°Žé¶Šm䵱팱긽ꆘ긓准D3掱;o:_Ñœ)껚콥8곤d矦8nP倥ꃸI": null, "뾎/Q㣩㫸벯➡㠦◕挮aé¶§â‹“å¼\u00001뱓fm覞n?㛅\"": 2.8515592202045408E17 }], ",": -5426918750465854828, "2æ««@0柡g䢻/gꆑ6演&D稒肩Y?艘/놘p{f투`飷ᒉ챻ëŽîª–<늛ä˜ï´¡ì¤°ì«„": false, "8î™–(鸑嵀⵹ퟡ<9㣎Tߗ┘d슒ل蘯&㠦뮮eà kç g ì—»": false, "d-\u208b?0ﳮ嵙'(J`蔿d^踅⤔榥\\Jâµ²v7": 6.8002426206715341E17, "ཎ耰í“ê•ï’ã±·\u0013y=詽I\"盈xm{0쾽倻䉚ષso#é°‘/8㸴짯%ꀄ떸b츟*\\鲷礬ZQå…©?np㋄椂榨kc᡹醅3": false, "싊j20": false }]] ]], "ä¿›\u0017nç·½Tu뫉èœé¼Ÿçƒ¬.ï‘ꭠIâ°“\"Ἀ᜾uC쎆J@å¤%ê›m뻨ᾀ画è›íœƒT:錖㑸ዚ9죡$": true } ] ], "ãµâ‡˜ê¦–辈s}㱮慀밒s`\"㞟j:`ií”»Zì„«^諎0Ok{켿æ­à·£èƒ°a2﨤[탳뚬쎼嫭뉮m": 409440660915023105, "w墄#*ᢄ峠밮jLa`ㆪ꺊漓Lã§ëŽ!Agkï¹ï¾'ê›ë¢ƒã¯å²¬D#ã’¦": false, "ଦPGI䕺L몥罭ꃑ궩﮶#⮈ᢓӢ䚬p7웼臧%ï‘¥~Sè âŒíž€6îž’&t䳙y㪘ëƒ\\*;é‰ï¿Šé¿µ'å—•pa\"oL쇿꬈Cgî“": "ã¶½1ç¸D⟸䴅ᆤ뉎﷛渤csî¸x ä”цꬃ锚æ¬?ຽ+x~꘩uI࡞\u0007æ ²5呚ẓem?è¢\")=㥴䨃pac!/æŽY", "á·±o\\||뎂몷r篙|#X䦜I#딌媸픕åžRDæ–³X4t⯩夬=[ï‹ë­²r=绥jhë·±ì¸âª˜%]⚋܈㖴スHí…¹m(WOæ›åЉ0~K3c柢Õã‰ïªªé€³~": false, "ç…½_qb[첑\\륌wEâ½Ztï”´CNï­+餌ᕜOê›­": "{ﳾ쉌&s惧á­âµ†3䢫;䨞팑ï›ê’ªí˜è¤€à¢–Qä ¿V5뭀䎂澻%ë°›u5í…¸oA⮥U㎦;B䳌wzä•™$áž¿\\௅婺ëµâª¾í†\\`Kyौꋟ._\u0006L챯l뇠Hi䧈å’5", "艊ä½à£ƒë¡‡ä± çˆ¬ï˜‚!*;⨣æŽïžæ…“qé“|儑ᨋL+è¿¥=6㒺딉6弄3è¾…J-㕎뛄듘SG㆛(\noAzQê±ä°©X*ã¢O퀌%펠낌moí‹®a^<\/F&_눊ᾉ㨦ы4\"8H": 2974648459619059400, "鬙@뎣䫳á®ë¡?){y?5K;î§„TA*k溱䫜J汃ꂯ싔ì\u001dA}룖(<\/^,": false, "ëª@QꋦFꊩá’뎶î‡lXl垨4î¤^郣|ꮇ;ä´á“}ìµ²zç–": null } ]]]], ":_=ë‹§å¼—D䙋暨é›. 㱻붘ä‚Jå„’&ZK/녩䪜rå›â½¯D喠죥7ï“⹌䪥c\u001a\u2076￞妈朹oLkè®F౟覛ì§ã®7T;}è›™2{9\"å´“bB<\/⡷룀;즮鿹)丒툃୤뷠5W⊢嶜(fb뭳갣": "E{å“1WM" }}, "䘨tjJ驳豨?y輊M*᳑梵瞻઻ofQGç‘®e": 2.222802939724948E-19, "ä®´=â‘âž¶Tà·‹wäžœ\"垦ꃼUt\u001dx;B$뵣䙶E↌艣ᡥ!á§Ÿ;ä±€[䔯k쬃`à©8饙른ç†î‹”'2_'袻tGfè’­J땟as꯳╖&å•’zWࡇᒫYSá¬\u0014ℑ첥鈤|cG~Pá“®\">\"": "ႆl\f7V儊㦬nHꄬꨧC{ì¢~C⮃⛓嶦vꄎ1w鰠嘩뿠魄&\"_qMâµ–é‡”ë…®îœ¡ê‡ ãš{ç³Jå“‹ cî°¸v?-jkﻯྌ鹑L舟r", "龧葆yB✱H盋夔ﶉ?n*0(": "ꧣኆ㢓氥î³qZZ酒ຜ)鮢樛)X䣆gTSî»»Ò‘Gí…žï’˜k.J圬ç–ë¡«ïœì¯­z L:\\ྤ@w炋塜쿖ᾳy뢀䶃ë±N䥨㚔勇ê²#p", "ë„畎Q娡\"@S/뼋:äµ!Pè¡…ì´šfVHQs✜á«i㻑殡B䜇%믚k*U#濨낄~": "êŸá‹•ì³¸êˆæ•‹&lå¦\u0005憡멗瘌uPgá…ªm<\/To쯬锩h뒓k" } ] }], "墥홞r绚<\/⸹ⰃB}<躅\\Y;๑@䔸>韫䜲뱀X뗩鿥쩗SI%ﴞ㳕䛇?<\/\u00018x\\&侂9é‹™a[LRã‹­W胕)â¡¿8ãž™0JF,}?í—ˆd1cDMáƒâ›é„ⱕ%X)!XQ": "â³ê—³=橇a;3t⦾꼑仈î¥á€°aᚯ⯋ꕃAsé´·Nâ•_䎃ꙎAz\u0016䯷\\<à¿«>8q{}ï½·?ᣰ}'0ᴕ펓B┦lF#趤厃T?㕊#撹圂䆲" }, "Ü‹ë‹é¾«ï¥c웑": false, "ㇿ/q\"6-co髨íœCí¦#\u001b4~?3ä¹E삇<<": 7.600917488140322E-20, "äE6?㣖êƒé—´t祗*é‘ {ḣV(æµ¾h逇íž=W?ૉ?nꇽ8ꅉຉj으쮺@Ꚅ㰤u]Oyr": "vâ‰á«¸_*όAඤԆl)ۓᦇQ}í zà¼q滚", "ソ᥊/넺I": true }]] ] ] ] ]] }, "ä­‘Ik攑\u0002QV烄:芩.麑㟴㘨≕": true, "å„꿕C쇻풉~å´%碼\\8\"䬦꣙": null, "欌L圬䅘Y8c(♺2?ON}o椳s宥2䉀eJ%é—¹rå†O^K諭%凞⺉⡻,掜?$ꥉ?略焕찳㯊艼誜4?\"﯎<ï±ã‚›XáˆINT:è©“ +": -1.0750456770694562E-19, "ç’àc뜭싼ﺳ뎤K`ïŸ]p隨LtE": null, "ç”™8䵊神EIꩤé¯á¢€,ïµ®Uä‘u疒ử驺䚿≚ഋ梶秓F`覤è­#짾蔀묊4<åªì¬¦éª_Yzgcà¡¶î²§4kç´¥`kc[Lï®—î°£ç°*I瀑[â¾°L殽鑥_mGÈ <\/|囹ç gæ¡°iri": true, "챓ꖙꟻì¢è‡ou,å— 0\\jK핻뜠qwQ?ഩ㼕3Y彦b\u009bJ榶N棨f?ë¦é–綃6é³µM[OEë´¨uí–.Ꮁ癜蟳뽲ꩌ뻾rM豈Rï¨ç¾« uDꎚ%": null }, "V傜2<": 7175127699521359521 }], "é“«aG切<\/\"ী⊆e<^g࢛)Dé¡ï½Žï¬®é¥¼\u008c猪繩嵿ﱚCꡬ㻊g엺Aì—¦\u000fæš¿_f꿤ë³ã¦•桦`蒦䎔j甬%å²rj ç³": "䚢åŽëˆ´Au<4箞7礦Iï±”å eȧ䪸uï„€äµp|逹$嗫쨘ꖾï·!胠z寓팢^㨔|u8Nሇe텔ꅦ抷]،鹎ã³#༔繁 ", "낂乕ꃻ볨ϱ-ꇋã–fsâ¿«)zꜦ/K?솞♞ꑌ宭hJ᤭瑥Fu": false, "쟰ãœé­›G\u0003u?`㾕ℾ㣭5螠烶這趩ꖢ:@å’•ê¶xë’˜ëŠmä°¨bç—ƒë 0鳊喵熬딃$摉_~7*ⱦ녯1錾GKhJ惎秴6'H妈Tᧅ窹㺒疄矤铟wላ": null, "쯆q4!3錕ã²âµ†ã‡›ê˜·Zç‘©ë­†\\â—ªNH\u001d\\ã½°U~㯶<\"쑣낞3ᵤ'峉eꢬ;鬹o꣒木X*é•·PXᘱu\"ä ¹n惞": null, "ᅸ祊\"&ꥴCjࢼ﴿?䡉`U效5殼㮞V昽êª#ﺸ\\&t6x꠹盥꣰a[\u001aêªSpe鎿蠹": -1.1564713893659811E-19 } ]] ] ] ], "羵䥳H,6ⱎ겾|@t\"#í–Šî¦1|稃 ì„­)ëœ=뻔ꡜ???櫎~*ῡ꫌/繣ﻠq": null } ]} ]}, "츤": false }}, "s": 3.7339341963399598E18 } ], "N,I?1+㢓|ࣱ嶃쩥V2\u0012(4EE虪朶$|w颇væ­¥": "~ì¢~_,Mzrã«YB溓Eæ·š\"â…¹äˆ”áºæŠ™ b,nt5Vã’J檶ê¨â»”?", "Q껑ꡡ}$넎qHç…”æƒ/ez^!ẳF댙äŒé¦»å‰8": "梲;yté’°$i冄}Aî‘”L%a jëœå¥·ê±³ëš¾d꿽*ሬuDY3î…—?뮟鼯뮟wãªí‹±îŸ‚V", "o{Q/K O胟ãzUdê€m&⨺J舕â¾é­¸è¨ŸãŒ¥[T籨櫉å”í‚ aṭ뱫촙莛>碶覆⧬짙쭰ׯdAiH໥벤í¥_æ¸[ 0î­¬e:죃TCå¼¼èŽëµDA:w唵ê£": null, "á½æ¨Žäµ®è»§|?à±—aWH쩃1 ê…­su": null } ] }, "å‹‚\\&mé°ˆJ釮=Ⲽ鳋+䂡郑": null, "殣b綊倶5㥗惢⳷è¢á‘€ä¬„é•§M^ï±´3⣢翣næ«»1㨵}ኯ뗙顖Z.Q➷ꮨ뗇\u0004": "ê”™ä¼>n^[GीA䨟AMç¢á’ŠS쨲w?d㶣젊嘶çºéº“+æ„£a%気ྞScë“ᔘ:8bM7Xd8㶑臌]Ꙥ0ê­ì’™ä«£æŒµCè–½î€Dfⵃ떼᷸", "?ç´¡.ì…ª_à·¨j\u0013Oxâ” $Xᶨ-á…‡oè–¹-}軫;yæ¯ãªœKã£?.EVì®±4둽⛻䤜'2盡\u001f60(|eì°ã¼Žá¦€ã’§-$l@ﻑå³\u0003ä­±å“å·—WFo5c㧆Tí„Y맸♤(": -2.50917882560589088E17 }} ], "侸\\릩.᳠뎠狣살cs项䭩畳H1s瀉븇19?.w骴崖㤊h痠볭㞳㞳ä®Ql怠㦵": "@䟴-=7f", "鹟1x௢+d ;viä­´FSDS\u0004hꎹãš?â’â¦Ñž6u,扩@ë·Su)Pag휛Tá’—Vç—©!çžé‡€ê–žè˜¥&ೞè˜ê­°êž‡áŽ": "ah懱Ժ&\u20f7䵅♎඀䞧鿪굛ౕ湚粎蚵ᯋ幌YOE)५襦ãŠY*^\"R+ඈî¶å’·è¶9î—ꥂ榨艦멎헦é–ë¶v좛咊E)K㓷ྭr", "æ†q쮦4綱켙ì….f4<\/g<籽늷?#蚴픘:fF\u00051㹉뀭.á°–í’ŽfÖ¦Hv蔎㧤.!ä­½=éž½]ìŒH:?\"-4": 8.740133984938656E-20 }]} } ], "tVKn딩꘥⊾蹓᤹{\u0003lR꼽ᄲQFá…傅ﱋ猢⤊á”,E㓒秤nTà¶­v`â™›I\u0000]꫔ṞD\"麵cè¸î“²æ°X&æ¿¿ë˜ê£¹ê¹³à±¥è‘‚鿎\\aꡨ?": 3900062609292104525 } ], "ਉ샒⊩Lu@Sä§°^g": -1.1487677090371648E18, "⎢k⑊꬗yá«7^err糎Dt\u000bJç¤¯í™•ã†æ²‘サꋽeèµ”ã¢^J\u0004笲㿋idra剰-᪉C錇/Ĝ䂾ညSì§€?~ì½®gR敉⬹'ä§­": 1901472137232418266, "ç—kä¶¥:?ì´½è´ì“‰ê“ˆã’¸gç˜[뵎\\胕?\u0014_榙p.j稶,$`糉妋0>Fá¡°ly㘽$?": "]ê™›O赎&#ã ƒë±å‰³î°·\"<â—†>0誉é½_|z|裵씪>áŒã¼\"Z[ç•}O?G뚇諦cs⠜撺5cuç—‘U圲\u001c?鴴計lì¶¥/╓哼䄗èŒîšªê®…뫈댽AëŒë¡–뤫V窗讬sHd&\nOi;_î´–u" } ], "Uﺗ\\Y\\梷䄬~\u0002": null, "k\"Y磓ᗔ휎@U冈<\/w컑)[": false, "æ›Jè·âŒ»ë¦\u001f㙳s꥓âŸé‚«P늮쥄c∬ྡྷ舆렮칤Zè¶£5콡넛A쳨\\뀙骫(棻.*&è¼›LiIfi{@EA婳KᬰTXT": -4.3088230431977587E17 }]} ] ], "곃㲧<\/dఓꂟså…¶à¡§&Nè‘¶=?c㠤Ჴ'횠숄臼#\u001a~": false } ] ]}] }] }} ], "2f`â½°E쵟>Jî•笂裭!〛觬囀ۺ쟰#桊l鹛ⲋ|RA_Vxá­gEë“h﵀mfá»|?juTUæ¡£[d⢼⺻p濚7E峿": 5613688852456817133 }, "濘ë¶gå¿®7ãµæ®¬W팕Qæ› ë«°)惃廊5%-î«è¹šzYZ樭ﴷQ锘쯤崫îŸgg": true, "絥ᇑâ¦ì’“븣爚H.ã—Šß„o蘵貆ꂚ(쎔O᥉î¼ï®“]姨Wê“!RMA|o퉢THxè½®7Mê»U즨'i뾘舯o": "è·¥f꜃?" }} ], "é·°é¹®K-9k;ï°°?_ݦѷ-ꅣ䩨Zꥱ\"mꠟ屎/콑Y╘2&鸞脇ã¢ê€‡à ºâ°¼æ‹¾å–­í‹®îL꽩bt俸墶 [l/웄\"꾦\u20d3iও-&+\u000fQ+໱뵞": -1.296494662286671E-19 }, "HX੹/⨇୕붷Uﮘ旧\\쾜͔3l鄈磣糂̖䟎Eá³wæ©–bá¿€_딕huè‘°î¤çª³é—¹Ð²U颵|染H죶.fPä—®:jä«¢\\b뎖i燕ꜚGâ® W-≚뉗lè¶•": "ଊ칭Oa᡺$IVã·§L\u0019脴셀붿餲햪$迳å‘ì¯ì¼‚PqfT\" ?î¹€I屉鴼쿕@ç¡™z^é•㊵M}ãš›T젣쓌-Wâ©-g%⺵<ë®±~빅╴瑿浂脬\u0005왦燲4áƒb|Då § <\/oEQh", "䘶#㥘à©îººìº”ï” f巋ἡAJ䢚쭈ࣨ뫒*mᇊK,ࣺAꑱ\u000bR<\/A\"1a6鵌㯀bh곿w(\"$ê˜*rà²è¶£.dà¿©k/抶면䒎9W⊃9": "漩b挋Swè—Ž\u0000", "ç•€e㨼mK꙼HglKb,\"'䤜": null }]}] ] ] }] ]} ] ]} ], "æ­™>駿ꣂ숰Q`J΋方樛(d鱾뼣(ë«–í„­\u20f9lচ9æ­Œ8o]8윶lì–¶?é•–G摄탗6í‹íµ+g:䱫홊<멀뀿/س|ê­ºsê±è·¶ç¨šW々c㫣⎖": "㣮蔊깚Cꓔ舊|XRfé»ã†šï¸†'쾉ì·\\&言", "æ®­\"cÞɨê™äž˜:嬮eæ½½Y펪㳅/\"O@à —ê²´]ì·–YÇž(t>R\"N?梳LDæ­=næ°¯Tè±°2R諸#N}*ç§ï¡§4}ã¶ŠGä£bì–š": null, "襞<\/å•§ B|싞W瓇)6簭鼡艆lNì©`|펭佡\\é–“é‚[z릶&쭟愱ꅅ\\Tá°½1靝忠ˆ4̸s윜R7â’/똽?치X": "âŠèº–Cﱰ2Qẫè„&இ?%ëƒæ‚Š", ",é°§åµì…£îˆ›ì‹¹xᎹ힨᯳EṬHïŽã¹–9": -4604276727380542356 } } ]]]], "웺㚑xs}q䭵䪠馯8?LB犯zK'osäš›HZ\"L?ì…Žs^ã¿§ã´˜Cv2": null }] ] ] ], "Kdî©´2Kv+|z": 7367845130646124107, "ᦂⶨ?ᢠ祂些ഷ牢㋇æ“\"腭䙾㖪\\(y4cE뽺ㆷ쫺ᔖ%zfÛ»$Ñž1柦,ã¶¢9r漢": -3.133230960444846E-20, "ç˜Mç„€q%㢟f鸯Oâ£è“‘맕鯊$Oå™·|)z褫^㢦⠮ꚯ꫞`毕1qꢚ{ĭ䎀বώT\"뱘3G൴?ï¢ï¢^^oï…¯f": null } ], "aî¶¹8V᯺?:ﺃ/8ꉿBq|9啓댚;*i2": null, "cpT瀇Hç°á»ªpೃi鎪Rrâ£ìˆ¬-鹸ҩ䠚z脚цGoN8å…¥y%è¶ŒI┽2ឪЀiJNcN)æ§£/â–Ÿ6S숆牟\"箑X僛G殱娇葱T%æ»:J諹昰qV쨰": 8331037591040855245 }], "G5ᩜ䄗巢껳": true } }, "Ồ巢ゕ@_è­™A`碫é„㡥砄㠓(^K": "?܃B혢▦@犑ὺD~Tâ§|é†;o=J牌9냚⢽㨘{4è§èš”9#$∺\u0016p囅\\3Xk阖⪚\"UzA穕롬✎âžã­’춺C㣌ဉ\"2瓑员ᅽê¶ë«}꽚ꞇ鶂舟彺]ê½JCè§éЉ", "â†Äšè†\"b-í‰ACR言J謈53~V튥x䜢?ꃽɄY뮩ꚜ": "K/↾eèƒ}]Bs⾿q룅鷦-膋?m+æ­»^魊镲6", "粡霦cæž‹AHíŸo礼Ke?qWcA趸㡔ê‚?\u000eì¶‚8iতᦜ婪\u0015㢼nﵿê»!á´é–¢\u001d5j㨻gfá¿©UK5Juä¸tã‹TI'?ã“t>⼟o a>i}á°—;뤕Ü": false, "ꄮ匴껢ꂰ涽+䜨B蛹H䛓-k蕞fu7kLè°–,'涃V~챳逋穞cT\"vQ쓕ObaCRQã“¡â²®?轭⫦輢墳?vA餽=h䮇킵ní²í‰…喙?\"'1ç–¬V嬗Qdç—'Lự": "6v!së¯ã­Ÿî€µî¦˜ã£¯çƒ!磸餠ቂh0C뿯봗Fé·­gê–¶~コkK<ᦈTtïŽ\\è·“w㭣횋钘ᆹ듡䑚W䟾X'ê…”4ï€FL勉Vܴ邨y)2'〚쭉⽵-鞣E,Q.?å—", "?(˧쩯@å´Ÿå‹æ­„K": null }, "Gc럃녧>?2DYIé´¿\\륨)æ¾”0ᔬlx'è§”7젘⤡縷螩%Sv׫묈/]↱&S ï…h\u0006æ­‹á‘›xi̘}ã²Y蔯_醨鯘煑橾8?䵎쨋z儬ê*@츾:": null } } } ] ] ]} }, "HO츧G": 3.694949578823609E17, "QC\u0012(翻曇Tfã·ŸbGBJ옉53\\嚇ᛎDï–/\u001b夾á‰4\"í•€@祎)쫆yD\"i먎Vnî¿ã¿¿V1Wá¨ä¶€": -6150931500380982286, "Zã“®P翸é±é‰¼K䋞꘺튿â­Y": -7704503411315138850, "]모开ꬖP븣c霤<[3aΠ\"é»ä––䰑뮋ꤦ秽∼㑷冹T+YUt\"싳F↭ä–&鋌": -2.7231911483181824E18, "tꎖ": -4.9517948741799555E-19, "䋘즊îŽ.⬅IꬃۣQ챢ꄑé»|f?C⾺|å…•ì¯sC鬸섾整腨솷V": "旆柩l쪦sá–¸My㦅울ì‰ç˜—㎜檵9ï……ê‚駓ૉᚿ/u3ì”…å¾ï¤¥[Z䞸ࡗ1ꆱ&Q풘?Ç‚8\u0011BCDY2볨;é¸": null, "幫 nç…¥sì‡íއ 왊-$C\"è¡:\u0014㣯舼.3ë™—Yl⋇\"K迎멎[ê½µs}9鉳UK8ì¥\"掄㹖h㙈!얄સ?Ꜳ봺R伕UTD媚I䜘Wé¨è”®": -4.150842714188901E-17, "ﺯ^ã„„\b죵@fྉkf颡팋î¤êž¦{/Pm0V둳⻿/è½éŸ’ꊔᚬ@5螺G\\å’¸a谆⊪ቧ慷绖?è´¢(é·‡uéŒF=ráæ©¢áž³n:^iá´µtD볠覅Nèµ´": null }] }] } ] ]} ]}, "謯?w厓奰Tï§¡í——èážè²–o⪇弒L!캶$ᆅ": -4299324168507841322, "뺊奉_åžæµ¸å»¶ëªå­„Z舰2i$q붿좾껇d▵é¤\"v暜Ҭì„mï¿´g>": -1.60911932510533427E18 } ] } ] ]], "í‰êº”㠦楶Pê…±": 7517896876489142899, "ï™°": false } ]}, "是u&I狻餼|è°–j\"7cë®sï­-踳鉷`䣷쉄_A艣鳞凃*m⯾☦椿q㎭Nîœæº”铉tlㆈ^": 1.93547720203604352E18, "ï…µkⲨ\\%vr#\u000bâ’ºY\\t<\/3﬌R訤='﹠8è¤êž´ë ´æ›”r": false } ]}, "阨{c?C\u001d~K?鎌Ԭ8烫#뙣Pì´ˆé—tã­±E­ë’䆺}ç”—[R*1!\\~hã•…á°º@<9JêષIä³–æ ­6綘걹ᅩM\"▯是∔v鬽顭⋊譬": "ìš´ï¶Kæ•‚(欖C취پ℄爦賾" } }} }], "鷨赼鸙+\\ä­£t圙ڹx᜾ČN<\/踘\"S_ë§¶a鷺漇T彚⎲i㈥LT-xA캔$\u001cUH=a0츺l릦": "溣㣂0æ¿•=鉵氬駘>Pꌢpb솇쬤h힊줎çªãª¬CrQ矠a&è„꼬爼M茴/á¿®\u0017å¼è½¼y#êž c6ë‘´=?Rå´ë· éº–w?" }, "閕ᘜ]CT)䵞l9z'xZF{:ØI/躅匽ì¡:䟇AGF૸\u001cퟗ9)駬慟ꡒꆒRS״툋A<>\u0010\"ꂔ炃7gëšEà§îˆbꅰ輤]oã±_뷕ܘ暂\"u": "芢+U^+㢩^鱆8*1鈶鮀\u0002뺰9⬳ꪮlL䃣괟,G8\u20a8DF㉪錖0ㄤ瓶8Nଷd?眡GLc陓\\_죌Vì°à¤²äºŒ?cë¦æ± \u0019JC\u0011b⤉zẒT볕\"绣蘨뚋cꡉkî« I\u001eé³´", "ꃣI'{6u^㡃#཰Kq4逹y൒䧠䵮!㱙ï®/n??{Lí’“ZETã™ í¿X2᩟綳跠葿㚙w཮x캽扳B唕S|å°¾}ì´•%N?o䪨": null, "ⰴFjà·Ÿì…ˆ[\u0018è¾·px?椯\\1<ﲻ栘á£ë´¢æ† ë‰´p": -5263694954586507640 } ] ]] ]} ]}] ] ], "?#癘82禩鋆êŠty?&": -1.9419029518535086E-19 } ] ] ]} ] ] ], "훊榲.|῕戄&.ãšZꛦ2\"䢥ሆ⤢fV_æ‘•å©”?â‰Fji冀탆꜕iã¬_ẑKᅢ꫄蔻XWc|饡Siẘ^㲦?羡2ã´1ç¸á™…?ì‰Ou": false }]] ]}}}, "æ…‚ë—„å“è“”á“åŒåš–/颹蘯/翻ㆼL?뇊,í…µ<\\ç·ã”Cボ": null }, "p溉ᑟi짣z:䒤棇r^Ù«%G9缑r砌롧.물农g?0׼ሩ4ƸO㣥㯄쩞ጩ": null, "껎繥YxK\"F젷쨹뤤1wq轫o?鱑뜀瘊?뎃hç‘\\ꛣ}Kå³^ኖâ¤ï§´ê‰“hy": null } ], "á±€nè‚“ã„›\"å »2>mæ®®'1橌%êž´êµ°=Ӳ鯨9耛<\/n據0u彘8㬇៩fá¿è¯™]嚊": "䋯쪦S럶åŒã…›#î½)O`ሀX_éªæ¸²â›€ã¨»å®…闩➈ꢙஶDRâª" }, "tAì“龇 â‹¥bj왎录r땽✒롰;羋^\\?툳*┎?ì€ma䵳넅U䳆૘〹䆀LQ0\bç–€U~u$M}(鵸gï­â³¾i抦뛹?䤈땚검.鹆?ê©¡tâ¶¥GÄ’;!ቹHïš©Så³»B츪ì¼f5≺": 2366175040075384032, "ì „pJjleb]áž½": -7.5418493141528422E18, "n.鎖ጲ\n?,$䪘": true }, "欈Ar㉣螵᪚茩?O)": null }, "쫸M#x}Dç§±æ¬K=侫们ä¸ï‡ª.KꕾxẠ\u001e㿯䣛FÜ캗ï¬qq8꟞ṢFD훎⵳簕꭛^鳜\u205cÙ«~⑟~冫ऊ2ì«°<\/戲윱o<\"": true }, "ã·è¥/T뱂\u0010锕|内䞇xä¾â‰¦ã­–:M?iM᣿IJeç…œdG࣯尃⚩gPt*辂.{磼럾äª@a\\袛?}ᓺBç¼": true } } ]]}]}}, "tn\"6î´ê«¤ìƒ¾ä„„;銞^%VBPwu묪`Y僑N.↺Ws?3C⤻9唩Sä ®á´m;sᇷ냞඘B/;툥B?lB∤)G+O9m裢0kC햪䪤": -4.5941249382502277E18, "áš”t'\\æ„«?éµ€@\\ã³ê‚•Pí <<]ç…¹G-b!S?\nꖽ鼫,Ý›&é ºy踦?Eæ†î¬–릱H}햧캡b@手.p탻>췽㣬ꒅ`qeä½­P>á“‚&?u}毚ᜉ蟶頳졪áŽzl2wO": -2.53561440423275936E17 }]} } ] ]], "潈촒⿂å¡": 5495738871964062986 } ]] } ] ]} ]] ]] ]} ] ]}, "á‚qí‚è“…R`謈èŸá¦î’³å„‚æ§åƒ»ï¹¶9å©Œî¬æ«žé‡ˆ~\"%匹躾ɢ뤥>࢟瀴愅?殕节/냔O✬H鲽엢?ᮈà©î“Žâ‹§dâ½ã«zCe*": 2.15062231586689536E17, "ã¶µUi曚ç°é‹ªá¾¼è‡§P{ä䷪쨑̟A뼿T渠誈äšD1!ìž¶<\/ã¡7?)2l≣穷᛾ç¨{:;㡹nemיּ訊`Gî¹²": null, "䀕\"飕辭påœf#뫆䶷뛮;â›´á©3çšëá°ìŽ“â¦·è©µ%᜖Մfs⇫(\u001e~P|ï­—CⲾផv湟W첋(텪બTî¾·<บSê‰à©—⋲X婵i ӵ⇮?L䬇|êˆ?졸": 1.548341247351782E-19 } ] }, "t;:N\u0015qé¦Rt缆{ê®C?஛㷱敪\\+鲊㉫㓪몗릙ç«(æ°µkYS": "Xá°‚T?൮ô", "碕飦幑|+ 㚦é¶`é•¥ê© B<\/加륙": -4314053432419755959, "秌孳(p!G?Vå‚«%8ሽ8w;5鲗㦙LI檸\u2098": "zG N볞䆭éŽí˜\\ONK3íš™<\/樚立圌Q튅k쩎Ffì‹aׂJK銆ઘì¦ç‹©6༥✙䩜篥CzP(è»é§‡HHퟲ讃%,ά{ë p而刲vy䦅ክ^톺M楒é¢ã¹³]Mdg2>䤉洞", "踛Mì §>忔芿㌜Zk": 2215369545966507819, "ì”A`$æ§­é °í»^U覒\bG毲aᣴU;8!팲f꜇E⸃_åµ{å«ç¾ƒX쀳C7ë—®m(åš¼u NÜè°ŸD劯9]#": true, "ﻩ!뵸-ç­šPá­›}á¼°å±¥lPh?౮ⶹꆛ穉뎃gè‘㑓溢CX뾇Gã–¬A錟]RKï’î´²aꄘ]Yo+@ä˜'s섎襠$^í™°}F": null }, "粘ꪒ4HXᕘ蹵.$å€\r\u001dë¬77pPc^yî¶ç¬²Q<\/ê–¶ è¨äƒá¨•G?*": 1.73773035935040224E17 }, "婅拳?bkU;#D矠â´vVN쩆t㜷A풃갮娪a%é®çµª3dAv룒#tm쑬⌛qYwc4|L8KZ;xU⓭㳔밆拓EZ7襨eD|隰ऌ䧼u9Ô¢+]è´´Pè¿": 2.9628516456987075E18 }]}}] ]} }} ]}] ], "|g翉F*湹̶\u0005â1脉̀eI쩓ᖂ㫱0碞l䴨ꑅ㵽7AtἈ턧yq䳥塑:z:é€ï¾¼X눔擉)`N3昛oQì…–y-ڨ⾶æ¢êˆµq^<\/": null, "è¹\\ëž“G^璬x৴뭸ゆUSê²§ï®·Bꮤ ┉銜᯻0%N7}~fæ´‹å„Xꔼ<\/4妟Vꄟ9:౟곡t킅冩䧉笭裟炂4ë´‹â±³åºæ€Št+怯涗\"0ã–ˆHq": false, "졬믟'ﺇফ圪쓬멤m邸QLà¦¬ä—æ„4jvsç¿™ à¾ê§€è‰³H-|": null, "컮襱⣱뗠 R毪/鹙꾀%í—³8&": -5770986448525107020 } ], "î½­B䔚bê»ë™å§“展槰T-똌鷺tcï§ç¿á«½^㓟ä€o3o$꘭趙è¬Ié¡©)뇭Ἑä“\f@{ᣨ`x3è”›": null } ] ] }], "⦖扚vWꃱ꥙㾠壢輓{-⎳鹷è´ç’¿äœ‘bG倛â‹ç£Žc皇皩7a~ﳫUâ•£Q࠭ꎉS摅姽OW.홌ೞ.": null, "蚪eVlH献r}á®ë¯ ï°©ê”„@ç‘„â²±": null, "퀭$JWoê©¢gì—­ì䖔㑺h&à­¢tXX愰㱇?㾫I_6 OaB瑈q裿": null, "꽦ﲼLyr纛ZduçB絟쬴糔?ã•‚ì§¹äµe": "ḱ\u2009cX9ë©€i䶛簆㳀k" } ]]]], "(_ê®g່澮?ᩑyM<艷\u001aꪽ\\庼뙭Zë§·ã°©Vm\\lYç­º]3㋲2㌩㄀Eਟäµâ¨„ì¨á”ŸgङHné–⤇놋瓇Q탚單oY\"♆臾jHᶈå¾îž«á‰„??uㇰA?#1侓": null }, "è§“^~ሢ&iIë†g륎ḱ캀.ᓡꀮ胙鈉": 1.0664523593012836E-19, "yè©­GbᔶऽsëŒU:æœî „⤎ϲì—⮼D醄诿që™°I#즧v蔎xHᵿt᡽[**?崮耖p缫쿃Lè,ë´¬ï–ꤦC쯵#=X1çž»@OZc鱗CQTï‹„x": null } ] }}], "剘ç´\u0004\\Xn⊠6,á€×±;嵣崇}讃iႽ)d1\\䔓": null }, "脨z\"{X,1uì°œ<'k&@?1}Yn$\u0015Rd輲ーa쮂굄+B$l": true, "諳>*ì­®ê´äµŸÒ+<ç®}빀䅱⡔æªï€è‡’hIH脟ꩪCí•ଗP좕\"0i<\/C褻DÛžæ—+^5?'ꂱ䚫^7}ã¡ cq6\\쨪ꔞꥢ?纖䫀氮蒫侲빦敶q{Aç…²G": -6880961710038544266 }}] }, "5s⨲JvಽῶꭂᄢI.aà§Š": null, "?1qê½ì¿»ê›‹DR%Uå¨>DgNä¹­G": -1.2105047302732358E-19 } ] ]}, "qZz`撋뙹둣j碇ì\\ꆥ\u0018@ïœè—´ç–°Wz)O{Fä¶›l᷂绘訥$]ë®å¤»ä¢‹ä©‡è¿ç°æ¨§çŒµâ£­jè¶q)$꬚⵷0馢W:â°!Qoe": -1666634370862219540, "t": "=î¹›wp|~碎Q鬳Ó\\l-<\/^ﳊhní–}ä”t碵ḛ혷?é»äŠ—", "邙쇡㯇%#=,î‰E4勃驆V繚q[Y댻XV㡸[逹á°è‘¢B@u=JS5?bLRnì–®ã‰â…ï°³?a6[&íŸ!è—ˆ": 1.2722786745736667E-19 }, "X블땨4{ph鵋ꉯ웸 5p簂䦭s_E徔濧dç¨~No穔噕뽲)뉈c5M윅>âš‹[岦䲟懷æ?éŽê“†à¸¬çˆ‹ç äœ”s{\u001bméšå„¸ç…›%bﯿXT>ê—˜@8G": 1157841540507770724, "媤娪Qæ¸ï‡\u0011SAyᡈ쿯": true, "çš^ಸ%ê±<\/蛯?\"祴å“\\\\'í": -3.4614808555942579E18, "釴U:O湛㴑䀣렑縓\ta)(j:숾å´ä—ŒgCiB뽬Oyuqè¼¥åŽ/7)?今hY︺Q": null } ] ]]]}] ], "I笔趠Ph!<ཛྷ㸞诘X$畉F\u0005笷èŸ.Esr릙!W☆ï›ä²–뗷莾뒭U\"䀸犜Uo3ï¯Gꯌx4r蔇᡹㧪쨢準<ä‚€%ࡡꟼç‘8ç‚Xs0ä€é”€?fi쥱ê†àª²BB": -8571484181158525797, "Lâ¦o#J|\"⽩-ã±¢d㌛8d\\㶤傩儻E[Y熯)r噤὘勇 }": "e(濨쓌K䧚僒ã˜è ¤Vᛸ\"络QJL2,嬓ì™î¿‰ä¼¢ã‹’䴿考澰@(ã¾`kX$ë‘ÑE斡,èœ&~y", "vj.|统圪ᵮPL?2oŶ`ë°§\"勃+0ue%⿥绬췈체$6:qaë Q;~晘3㙘鹑": true, "à·Ø™4ç„â¶¿c︋iâš…:ã‚“é–Ⳙ苆籦kw{䙞셕pCì·ƒê¬âœêŸ¯êš“é…„bížhwkê­­M鬋8B耳쑘WQ\\å™ac'唀x᪌\u2048*hì§Ž#á‡é® ë¾áž¿ë€Œ": false, "⎀jꄒ牺3Ⓝ컴~?親ꕽã¼Ü“å–瘘!@<튋ãŒê¿±â©¦{a?Yv%⪧笯Uܱ栅Eæši뚬:ꄃx7䙳ꦋ&䓹vq☶Iä˜á¾˜æ¶œ\\ì‰ëºŒLr%Bcãœ3?î¤ï…¨ê­ç ¿è£ž]": null, "⭤뙓z(ã¡‚%亳K䌽꫿AԾ岺㦦㼴輞낚Vꦴw냟鬓㹈뽈+o3è­»K1ìžž": 2091209026076965894, "ㇲ\t⋇轑ꠤ룫X긒\"zoYì‡í¬wjæ¢ì‘l侸`e%s": -9.9240075473576563E17, "啸ꮑ㉰!áš“}éŠ": -4.0694813896301194E18, "ï‰>]囋੽EK뇜>_ꀣ緳碖{ì裔[<ನ\"䇅\"5L?#îµ³xTwv#ç½\u0005래t应\\N?빗;": "v쮽瞭pë­ƒ" } ]], "æ–´æ§¾?Zç¿\"~æ…弞ﻆ=꜡o5é‹ï’½dw\"?Kè ¡i샾ogDï²°_C*⬟iㇷ4nયèŸ[㟉U꽌娛苸 à§æ“贻洞펻)쿗૊許X⨪VY츚Zä¾ã¶­~튃ᵦ<\/E臭tve猑x嚢": null, "锡⛩<\/칥ꈙᬙè€&êšç±¬â– 865?_>Lè©ì¿¨äˆŒæµ¿å¼¥ï©‰Ì«î¾½ï‘lj&zx<\/C쉾?覯n?": null, "꾳鑤/꼩ï¨d=ᘈn挫ᑩ䰬ZC": "3錢爋6Ƹ䴗v⪿Wr益G韠[\u0010å±—9ì¡é’u?殢c䳀蓃樄욂NAq赟c튒ç˜ë ¶î‚³Aà«¡Éšæ" } ] ] ]} ] ] }]]]}} ]}], "ï‚’Ejä—³U<\/Q=ç’샎䞦,å °é  @褙g_\u0003ꤾfâ¶½?퇋!łB〙ד3CC䌴鈌U:뭔咎(Qો臃䡬è‹BO7î¼§ã¢äŸ¸\"Yb": 2.36010731779814E-20, "逸'0å²”j\u000e눘먷翌C츊秦=ꭣ棭ှ;鳸=麱$XP⩉駚橄A\\좱⛌jqvä°ž3Ь踌v㳆¹gT┌gvLBè³–ïžçƒ¡m?@E঳i": null }, "曺vì°˜×?&绫OáŸ": 9107241066550187880 } ] ], "(e屄\u0019昜훕ç–b蓘ᬄ0/۲묇Z蘮á€â¨è›˜èƒ¯ë¢ƒ@㘉8ሪWᨮ⦬ᅳ䅴HIá‡ì¨³z囕陻엣1赳o": true, ",b刈Z,á æ™Tì†Å•B⩆ou'í¼â‰ƒç»—é›—dè­Š": null, "a唥KB\"ï³è‚•$u\n^â…„P䟼냉䞸⩪u윗瀱ꔨ#yÅŸsî««ê’¬=ï‹•1ïš–|ﲤ爢`tà±íмî£ì³«_Az(Ṋ擬㦷좕耈6": 2099309172767331582, "?ã´¸U<\/䢔ꯡ阽扆ã¤qé‹?f㔫wM嬙-;UV죫嚔픞G&\"Cá—äªí’ŠQ": "VM7ç–¹+陕枡툩窲}ç¿¡ä–¶8欞ÄsTë®}ç’¤:jﺋ鎴}HfAàµâ§»Zd#Qï¬u茅J髒皣Y-︴[?-~쉜vë”璮㹚䅊﩯<-#\u000eê±€h\u0004u抱﵊㼃U<㱷⊱IC進" }, "숌dee節é½é‚ºp넱蹓+e罕U": true } ], "b⧴ë£??á” 3ã±>%郿劃ç¿ê¬ê ›Wï¡°çž³á«ëˆ„躨狀ໄy੽\"ីuS=㨞馸k乆E": "トz݈^9R䬑<ﮛGRꨳ\u000fTT泠纷꽀MRᴱ纊:ã ­ë³®?%N56%鈕1ä—äœaä²—j陇=ë¿»å‚衋࿘ᓸ?ᕵZ+<\/}H耢bä€z^f$&ã’LkꢳI脚뙛u": 5.694374481577558E-20 }] } ]], "obj": {"key": "wrong value"}, "퓲꽪m{ã¶©/뇿#â¼¢&᭙硞㪔E嚉c樱㬇1aç¶‘á–DḾä©": null } }asymptote-3.05/LspCpp/third_party/rapidjson/bin/data/glossary.json0000644000000000000000000000110615031566105024126 0ustar rootroot{ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } }asymptote-3.05/LspCpp/third_party/rapidjson/bin/data/readme.txt0000644000000000000000000000014715031566105023372 0ustar rootrootsample.json is obtained from http://code.google.com/p/json-test-suite/downloads/detail?name=sample.zip asymptote-3.05/LspCpp/third_party/rapidjson/bin/data/widget.json0000644000000000000000000000113115031566105023544 0ustar rootroot{"widget": { "debug": "on", "window": { "title": "Sample Konfabulator Widget", "name": "main_window", "width": 500, "height": 500 }, "image": { "src": "Images/Sun.png", "name": "sun1", "hOffset": 250, "vOffset": 250, "alignment": "center" }, "text": { "data": "Click Here", "size": 36, "style": "bold", "name": "text1", "hOffset": 250, "vOffset": 100, "alignment": "center", "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;" } }}asymptote-3.05/LspCpp/third_party/rapidjson/bin/draft-04/0000755000000000000000000000000015031566105022002 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/draft-04/schema0000644000000000000000000001042715031566105023171 0ustar rootroot{ "id": "http://json-schema.org/draft-04/schema#", "$schema": "http://json-schema.org/draft-04/schema#", "description": "Core schema meta-schema", "definitions": { "schemaArray": { "type": "array", "minItems": 1, "items": { "$ref": "#" } }, "positiveInteger": { "type": "integer", "minimum": 0 }, "positiveIntegerDefault0": { "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ] }, "simpleTypes": { "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ] }, "stringArray": { "type": "array", "items": { "type": "string" }, "minItems": 1, "uniqueItems": true } }, "type": "object", "properties": { "id": { "type": "string", "format": "uri" }, "$schema": { "type": "string", "format": "uri" }, "title": { "type": "string" }, "description": { "type": "string" }, "default": {}, "multipleOf": { "type": "number", "minimum": 0, "exclusiveMinimum": true }, "maximum": { "type": "number" }, "exclusiveMaximum": { "type": "boolean", "default": false }, "minimum": { "type": "number" }, "exclusiveMinimum": { "type": "boolean", "default": false }, "maxLength": { "$ref": "#/definitions/positiveInteger" }, "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" }, "pattern": { "type": "string", "format": "regex" }, "additionalItems": { "anyOf": [ { "type": "boolean" }, { "$ref": "#" } ], "default": {} }, "items": { "anyOf": [ { "$ref": "#" }, { "$ref": "#/definitions/schemaArray" } ], "default": {} }, "maxItems": { "$ref": "#/definitions/positiveInteger" }, "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" }, "uniqueItems": { "type": "boolean", "default": false }, "maxProperties": { "$ref": "#/definitions/positiveInteger" }, "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" }, "required": { "$ref": "#/definitions/stringArray" }, "additionalProperties": { "anyOf": [ { "type": "boolean" }, { "$ref": "#" } ], "default": {} }, "definitions": { "type": "object", "additionalProperties": { "$ref": "#" }, "default": {} }, "properties": { "type": "object", "additionalProperties": { "$ref": "#" }, "default": {} }, "patternProperties": { "type": "object", "additionalProperties": { "$ref": "#" }, "default": {} }, "dependencies": { "type": "object", "additionalProperties": { "anyOf": [ { "$ref": "#" }, { "$ref": "#/definitions/stringArray" } ] } }, "enum": { "type": "array", "minItems": 1, "uniqueItems": true }, "type": { "anyOf": [ { "$ref": "#/definitions/simpleTypes" }, { "type": "array", "items": { "$ref": "#/definitions/simpleTypes" }, "minItems": 1, "uniqueItems": true } ] }, "allOf": { "$ref": "#/definitions/schemaArray" }, "anyOf": { "$ref": "#/definitions/schemaArray" }, "oneOf": { "$ref": "#/definitions/schemaArray" }, "not": { "$ref": "#" } }, "dependencies": { "exclusiveMaximum": [ "maximum" ], "exclusiveMinimum": [ "minimum" ] }, "default": {} } asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/0000755000000000000000000000000015031566105022613 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/bin/0000755000000000000000000000000015031566105023363 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/bin/jsonschema_suite0000755000000000000000000002154315031566105026661 0ustar rootroot#! /usr/bin/env python from __future__ import print_function import sys import textwrap try: import argparse except ImportError: print(textwrap.dedent(""" The argparse library could not be imported. jsonschema_suite requires either Python 2.7 or for you to install argparse. You can do so by running `pip install argparse`, `easy_install argparse` or by downloading argparse and running `python2.6 setup.py install`. See https://pypi.python.org/pypi/argparse for details. """.strip("\n"))) sys.exit(1) import errno import fnmatch import json import os import random import shutil import unittest import warnings if getattr(unittest, "skipIf", None) is None: unittest.skipIf = lambda cond, msg : lambda fn : fn try: import jsonschema except ImportError: jsonschema = None else: validators = getattr( jsonschema.validators, "validators", jsonschema.validators ) ROOT_DIR = os.path.join( os.path.dirname(__file__), os.pardir).rstrip("__pycache__") SUITE_ROOT_DIR = os.path.join(ROOT_DIR, "tests") REMOTES = { "integer.json": {"type": "integer"}, "subSchemas.json": { "integer": {"type": "integer"}, "refToInteger": {"$ref": "#/integer"}, }, "folder/folderInteger.json": {"type": "integer"} } REMOTES_DIR = os.path.join(ROOT_DIR, "remotes") TESTSUITE_SCHEMA = { "$schema": "http://json-schema.org/draft-03/schema#", "type": "array", "items": { "type": "object", "properties": { "description": {"type": "string", "required": True}, "schema": {"required": True}, "tests": { "type": "array", "items": { "type": "object", "properties": { "description": {"type": "string", "required": True}, "data": {"required": True}, "valid": {"type": "boolean", "required": True} }, "additionalProperties": False }, "minItems": 1 } }, "additionalProperties": False, "minItems": 1 } } def files(paths): for path in paths: with open(path) as test_file: yield json.load(test_file) def groups(paths): for test_file in files(paths): for group in test_file: yield group def cases(paths): for test_group in groups(paths): for test in test_group["tests"]: test["schema"] = test_group["schema"] yield test def collect(root_dir): for root, dirs, files in os.walk(root_dir): for filename in fnmatch.filter(files, "*.json"): yield os.path.join(root, filename) class SanityTests(unittest.TestCase): @classmethod def setUpClass(cls): print("Looking for tests in %s" % SUITE_ROOT_DIR) cls.test_files = list(collect(SUITE_ROOT_DIR)) print("Found %s test files" % len(cls.test_files)) assert cls.test_files, "Didn't find the test files!" def test_all_files_are_valid_json(self): for path in self.test_files: with open(path) as test_file: try: json.load(test_file) except ValueError as error: self.fail("%s contains invalid JSON (%s)" % (path, error)) def test_all_descriptions_have_reasonable_length(self): for case in cases(self.test_files): descript = case["description"] self.assertLess( len(descript), 60, "%r is too long! (keep it to less than 60 chars)" % (descript,) ) def test_all_descriptions_are_unique(self): for group in groups(self.test_files): descriptions = set(test["description"] for test in group["tests"]) self.assertEqual( len(descriptions), len(group["tests"]), "%r contains a duplicate description" % (group,) ) @unittest.skipIf(jsonschema is None, "Validation library not present!") def test_all_schemas_are_valid(self): for schema in os.listdir(SUITE_ROOT_DIR): schema_validator = validators.get(schema) if schema_validator is not None: test_files = collect(os.path.join(SUITE_ROOT_DIR, schema)) for case in cases(test_files): try: schema_validator.check_schema(case["schema"]) except jsonschema.SchemaError as error: self.fail("%s contains an invalid schema (%s)" % (case, error)) else: warnings.warn("No schema validator for %s" % schema) @unittest.skipIf(jsonschema is None, "Validation library not present!") def test_suites_are_valid(self): validator = jsonschema.Draft3Validator(TESTSUITE_SCHEMA) for tests in files(self.test_files): try: validator.validate(tests) except jsonschema.ValidationError as error: self.fail(str(error)) def test_remote_schemas_are_updated(self): for url, schema in REMOTES.items(): filepath = os.path.join(REMOTES_DIR, url) with open(filepath) as schema_file: self.assertEqual(json.load(schema_file), schema) def main(arguments): if arguments.command == "check": suite = unittest.TestLoader().loadTestsFromTestCase(SanityTests) result = unittest.TextTestRunner(verbosity=2).run(suite) sys.exit(not result.wasSuccessful()) elif arguments.command == "flatten": selected_cases = [case for case in cases(collect(arguments.version))] if arguments.randomize: random.shuffle(selected_cases) json.dump(selected_cases, sys.stdout, indent=4, sort_keys=True) elif arguments.command == "remotes": json.dump(REMOTES, sys.stdout, indent=4, sort_keys=True) elif arguments.command == "dump_remotes": if arguments.update: shutil.rmtree(arguments.out_dir, ignore_errors=True) try: os.makedirs(arguments.out_dir) except OSError as e: if e.errno == errno.EEXIST: print("%s already exists. Aborting." % arguments.out_dir) sys.exit(1) raise for url, schema in REMOTES.items(): filepath = os.path.join(arguments.out_dir, url) try: os.makedirs(os.path.dirname(filepath)) except OSError as e: if e.errno != errno.EEXIST: raise with open(filepath, "wb") as out_file: json.dump(schema, out_file, indent=4, sort_keys=True) elif arguments.command == "serve": try: from flask import Flask, jsonify except ImportError: print(textwrap.dedent(""" The Flask library is required to serve the remote schemas. You can install it by running `pip install Flask`. Alternatively, see the `jsonschema_suite remotes` or `jsonschema_suite dump_remotes` commands to create static files that can be served with your own web server. """.strip("\n"))) sys.exit(1) app = Flask(__name__) @app.route("/") def serve_path(path): if path in REMOTES: return jsonify(REMOTES[path]) return "Document does not exist.", 404 app.run(port=1234) parser = argparse.ArgumentParser( description="JSON Schema Test Suite utilities", ) subparsers = parser.add_subparsers(help="utility commands", dest="command") check = subparsers.add_parser("check", help="Sanity check the test suite.") flatten = subparsers.add_parser( "flatten", help="Output a flattened file containing a selected version's test cases." ) flatten.add_argument( "--randomize", action="store_true", help="Randomize the order of the outputted cases.", ) flatten.add_argument( "version", help="The directory containing the version to output", ) remotes = subparsers.add_parser( "remotes", help="Output the expected URLs and their associated schemas for remote " "ref tests as a JSON object." ) dump_remotes = subparsers.add_parser( "dump_remotes", help="Dump the remote ref schemas into a file tree", ) dump_remotes.add_argument( "--update", action="store_true", help="Update the remotes in an existing directory.", ) dump_remotes.add_argument( "--out-dir", default=REMOTES_DIR, type=os.path.abspath, help="The output directory to create as the root of the file tree", ) serve = subparsers.add_parser( "serve", help="Start a webserver to serve schemas used by remote ref tests." ) if __name__ == "__main__": main(parser.parse_args()) asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/README.md0000644000000000000000000001126315031566105024075 0ustar rootrootJSON Schema Test Suite [![Build Status](https://travis-ci.org/json-schema/JSON-Schema-Test-Suite.png?branch=develop)](https://travis-ci.org/json-schema/JSON-Schema-Test-Suite) ====================== This repository contains a set of JSON objects that implementors of JSON Schema validation libraries can use to test their validators. It is meant to be language agnostic and should require only a JSON parser. The conversion of the JSON objects into tests within your test framework of choice is still the job of the validator implementor. Structure of a Test ------------------- If you're going to use this suite, you need to know how tests are laid out. The tests are contained in the `tests` directory at the root of this repository. Inside that directory is a subdirectory for each draft or version of the schema. We'll use `draft3` as an example. If you look inside the draft directory, there are a number of `.json` files, which logically group a set of test cases together. Often the grouping is by property under test, but not always, especially within optional test files (discussed below). Inside each `.json` file is a single array containing objects. It's easiest to illustrate the structure of these with an example: ```json { "description": "the description of the test case", "schema": {"the schema that should" : "be validated against"}, "tests": [ { "description": "a specific test of a valid instance", "data": "the instance", "valid": true }, { "description": "another specific test this time, invalid", "data": 15, "valid": false } ] } ``` So a description, a schema, and some tests, where tests is an array containing one or more objects with descriptions, data, and a boolean indicating whether they should be valid or invalid. Coverage -------- Draft 3 and 4 should have full coverage. If you see anything missing or think there is a useful test missing, please send a pull request or open an issue. Who Uses the Test Suite ----------------------- This suite is being used by: ### Coffeescript ### * [jsck](https://github.com/pandastrike/jsck) ### Dart ### * [json_schema](https://github.com/patefacio/json_schema) ### Erlang ### * [jesse](https://github.com/klarna/jesse) ### Go ### * [gojsonschema](https://github.com/sigu-399/gojsonschema) * [validate-json](https://github.com/cesanta/validate-json) ### Haskell ### * [aeson-schema](https://github.com/timjb/aeson-schema) * [hjsonschema](https://github.com/seagreen/hjsonschema) ### Java ### * [json-schema-validator](https://github.com/fge/json-schema-validator) ### JavaScript ### * [json-schema-benchmark](https://github.com/Muscula/json-schema-benchmark) * [direct-schema](https://github.com/IreneKnapp/direct-schema) * [is-my-json-valid](https://github.com/mafintosh/is-my-json-valid) * [jassi](https://github.com/iclanzan/jassi) * [JaySchema](https://github.com/natesilva/jayschema) * [json-schema-valid](https://github.com/ericgj/json-schema-valid) * [Jsonary](https://github.com/jsonary-js/jsonary) * [jsonschema](https://github.com/tdegrunt/jsonschema) * [request-validator](https://github.com/bugventure/request-validator) * [skeemas](https://github.com/Prestaul/skeemas) * [tv4](https://github.com/geraintluff/tv4) * [z-schema](https://github.com/zaggino/z-schema) * [jsen](https://github.com/bugventure/jsen) * [ajv](https://github.com/epoberezkin/ajv) ### Node.js ### The JSON Schema Test Suite is also available as an [npm](https://www.npmjs.com/package/json-schema-test-suite) package. Node-specific support is maintained on the [node branch](https://github.com/json-schema/JSON-Schema-Test-Suite/tree/node). See [NODE-README.md](https://github.com/json-schema/JSON-Schema-Test-Suite/blob/node/NODE-README.md) for more information. ### .NET ### * [Newtonsoft.Json.Schema](https://github.com/JamesNK/Newtonsoft.Json.Schema) ### PHP ### * [json-schema](https://github.com/justinrainbow/json-schema) ### Python ### * [jsonschema](https://github.com/Julian/jsonschema) ### Ruby ### * [json-schema](https://github.com/hoxworth/json-schema) ### Rust ### * [valico](https://github.com/rustless/valico) ### Swift ### * [JSONSchema](https://github.com/kylef/JSONSchema.swift) If you use it as well, please fork and send a pull request adding yourself to the list :). Contributing ------------ If you see something missing or incorrect, a pull request is most welcome! There are some sanity checks in place for testing the test suite. You can run them with `bin/jsonschema_suite check` or `tox`. They will be run automatically by [Travis CI](https://travis-ci.org/) as well. asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/remotes/0000755000000000000000000000000015031566105024271 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/remotes/integer.json0000644000000000000000000000003115031566105026613 0ustar rootroot{ "type": "integer" }asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/remotes/folder/0000755000000000000000000000000015031566105025544 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/remotes/folder/folderInteger.json0000644000000000000000000000003115031566105031222 0ustar rootroot{ "type": "integer" }asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/remotes/subSchemas.json0000644000000000000000000000015615031566105027263 0ustar rootroot{ "integer": { "type": "integer" }, "refToInteger": { "$ref": "#/integer" } }asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tox.ini0000644000000000000000000000020615031566105024124 0ustar rootroot[tox] minversion = 1.6 envlist = py27 skipsdist = True [testenv] deps = jsonschema commands = {envpython} bin/jsonschema_suite check asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/0000755000000000000000000000000015031566105023755 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/0000755000000000000000000000000015031566105025140 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/divisibleBy.json0000644000000000000000000000301015031566105030272 0ustar rootroot[ { "description": "by int", "schema": {"divisibleBy": 2}, "tests": [ { "description": "int by int", "data": 10, "valid": true }, { "description": "int by int fail", "data": 7, "valid": false }, { "description": "ignores non-numbers", "data": "foo", "valid": true } ] }, { "description": "by number", "schema": {"divisibleBy": 1.5}, "tests": [ { "description": "zero is divisible by anything (except 0)", "data": 0, "valid": true }, { "description": "4.5 is divisible by 1.5", "data": 4.5, "valid": true }, { "description": "35 is not divisible by 1.5", "data": 35, "valid": false } ] }, { "description": "by small number", "schema": {"divisibleBy": 0.0001}, "tests": [ { "description": "0.0075 is divisible by 0.0001", "data": 0.0075, "valid": true }, { "description": "0.00751 is not divisible by 0.0001", "data": 0.00751, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/disallow.json0000644000000000000000000000362015031566105027652 0ustar rootroot[ { "description": "disallow", "schema": { "disallow": "integer" }, "tests": [ { "description": "allowed", "data": "foo", "valid": true }, { "description": "disallowed", "data": 1, "valid": false } ] }, { "description": "multiple disallow", "schema": { "disallow": ["integer", "boolean"] }, "tests": [ { "description": "valid", "data": "foo", "valid": true }, { "description": "mismatch", "data": 1, "valid": false }, { "description": "other mismatch", "data": true, "valid": false } ] }, { "description": "multiple disallow subschema", "schema": { "disallow": ["string", { "type": "object", "properties": { "foo": { "type": "string" } } }] }, "tests": [ { "description": "match", "data": 1, "valid": true }, { "description": "other match", "data": {"foo": 1}, "valid": true }, { "description": "mismatch", "data": "foo", "valid": false }, { "description": "other mismatch", "data": {"foo": "bar"}, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/extends.json0000644000000000000000000000503715031566105027512 0ustar rootroot[ { "description": "extends", "schema": { "properties": {"bar": {"type": "integer", "required": true}}, "extends": { "properties": { "foo": {"type": "string", "required": true} } } }, "tests": [ { "description": "extends", "data": {"foo": "baz", "bar": 2}, "valid": true }, { "description": "mismatch extends", "data": {"foo": "baz"}, "valid": false }, { "description": "mismatch extended", "data": {"bar": 2}, "valid": false }, { "description": "wrong type", "data": {"foo": "baz", "bar": "quux"}, "valid": false } ] }, { "description": "multiple extends", "schema": { "properties": {"bar": {"type": "integer", "required": true}}, "extends" : [ { "properties": { "foo": {"type": "string", "required": true} } }, { "properties": { "baz": {"type": "null", "required": true} } } ] }, "tests": [ { "description": "valid", "data": {"foo": "quux", "bar": 2, "baz": null}, "valid": true }, { "description": "mismatch first extends", "data": {"bar": 2, "baz": null}, "valid": false }, { "description": "mismatch second extends", "data": {"foo": "quux", "bar": 2}, "valid": false }, { "description": "mismatch both", "data": {"bar": 2}, "valid": false } ] }, { "description": "extends simple types", "schema": { "minimum": 20, "extends": {"maximum": 30} }, "tests": [ { "description": "valid", "data": 25, "valid": true }, { "description": "mismatch extends", "data": 35, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/ref.json0000644000000000000000000001044115031566105026607 0ustar rootroot[ { "description": "root pointer ref", "schema": { "properties": { "foo": {"$ref": "#"} }, "additionalProperties": false }, "tests": [ { "description": "match", "data": {"foo": false}, "valid": true }, { "description": "recursive match", "data": {"foo": {"foo": false}}, "valid": true }, { "description": "mismatch", "data": {"bar": false}, "valid": false }, { "description": "recursive mismatch", "data": {"foo": {"bar": false}}, "valid": false } ] }, { "description": "relative pointer ref to object", "schema": { "properties": { "foo": {"type": "integer"}, "bar": {"$ref": "#/properties/foo"} } }, "tests": [ { "description": "match", "data": {"bar": 3}, "valid": true }, { "description": "mismatch", "data": {"bar": true}, "valid": false } ] }, { "description": "relative pointer ref to array", "schema": { "items": [ {"type": "integer"}, {"$ref": "#/items/0"} ] }, "tests": [ { "description": "match array", "data": [1, 2], "valid": true }, { "description": "mismatch array", "data": [1, "foo"], "valid": false } ] }, { "description": "escaped pointer ref", "schema": { "tilda~field": {"type": "integer"}, "slash/field": {"type": "integer"}, "percent%field": {"type": "integer"}, "properties": { "tilda": {"$ref": "#/tilda~0field"}, "slash": {"$ref": "#/slash~1field"}, "percent": {"$ref": "#/percent%25field"} } }, "tests": [ { "description": "slash invalid", "data": {"slash": "aoeu"}, "valid": false }, { "description": "tilda invalid", "data": {"tilda": "aoeu"}, "valid": false }, { "description": "percent invalid", "data": {"percent": "aoeu"}, "valid": false }, { "description": "slash valid", "data": {"slash": 123}, "valid": true }, { "description": "tilda valid", "data": {"tilda": 123}, "valid": true }, { "description": "percent valid", "data": {"percent": 123}, "valid": true } ] }, { "description": "nested refs", "schema": { "definitions": { "a": {"type": "integer"}, "b": {"$ref": "#/definitions/a"}, "c": {"$ref": "#/definitions/b"} }, "$ref": "#/definitions/c" }, "tests": [ { "description": "nested ref valid", "data": 5, "valid": true }, { "description": "nested ref invalid", "data": "a", "valid": false } ] }, { "description": "remote ref, containing refs itself", "schema": {"$ref": "http://json-schema.org/draft-03/schema#"}, "tests": [ { "description": "remote ref valid", "data": {"items": {"type": "integer"}}, "valid": true }, { "description": "remote ref invalid", "data": {"items": {"type": 1}}, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/minLength.json0000644000000000000000000000156615031566105027770 0ustar rootroot[ { "description": "minLength validation", "schema": {"minLength": 2}, "tests": [ { "description": "longer is valid", "data": "foo", "valid": true }, { "description": "exact length is valid", "data": "fo", "valid": true }, { "description": "too short is invalid", "data": "f", "valid": false }, { "description": "ignores non-strings", "data": 1, "valid": true }, { "description": "one supplementary Unicode code point is not long enough", "data": "\uD83D\uDCA9", "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/pattern.json0000644000000000000000000000153115031566105027510 0ustar rootroot[ { "description": "pattern validation", "schema": {"pattern": "^a*$"}, "tests": [ { "description": "a matching pattern is valid", "data": "aaa", "valid": true }, { "description": "a non-matching pattern is invalid", "data": "abc", "valid": false }, { "description": "ignores non-strings", "data": true, "valid": true } ] }, { "description": "pattern is not anchored", "schema": {"pattern": "a+"}, "tests": [ { "description": "matches a substring", "data": "xxaayy", "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/items.json0000644000000000000000000000216015031566105027153 0ustar rootroot[ { "description": "a schema given for items", "schema": { "items": {"type": "integer"} }, "tests": [ { "description": "valid items", "data": [ 1, 2, 3 ], "valid": true }, { "description": "wrong type of items", "data": [1, "x"], "valid": false }, { "description": "ignores non-arrays", "data": {"foo" : "bar"}, "valid": true } ] }, { "description": "an array of schemas for items", "schema": { "items": [ {"type": "integer"}, {"type": "string"} ] }, "tests": [ { "description": "correct types", "data": [ 1, "foo" ], "valid": true }, { "description": "wrong types", "data": [ "foo", 1 ], "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/maxLength.json0000644000000000000000000000157715031566105027774 0ustar rootroot[ { "description": "maxLength validation", "schema": {"maxLength": 2}, "tests": [ { "description": "shorter is valid", "data": "f", "valid": true }, { "description": "exact length is valid", "data": "fo", "valid": true }, { "description": "too long is invalid", "data": "foo", "valid": false }, { "description": "ignores non-strings", "data": 10, "valid": true }, { "description": "two supplementary Unicode code points is long enough", "data": "\uD83D\uDCA9\uD83D\uDCA9", "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/maxItems.json0000644000000000000000000000130215031566105027616 0ustar rootroot[ { "description": "maxItems validation", "schema": {"maxItems": 2}, "tests": [ { "description": "shorter is valid", "data": [1], "valid": true }, { "description": "exact length is valid", "data": [1, 2], "valid": true }, { "description": "too long is invalid", "data": [1, 2, 3], "valid": false }, { "description": "ignores non-arrays", "data": "foobar", "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/additionalProperties.json0000644000000000000000000000527115031566105032225 0ustar rootroot[ { "description": "additionalProperties being false does not allow other properties", "schema": { "properties": {"foo": {}, "bar": {}}, "patternProperties": { "^v": {} }, "additionalProperties": false }, "tests": [ { "description": "no additional properties is valid", "data": {"foo": 1}, "valid": true }, { "description": "an additional property is invalid", "data": {"foo" : 1, "bar" : 2, "quux" : "boom"}, "valid": false }, { "description": "ignores non-objects", "data": [1, 2, 3], "valid": true }, { "description": "patternProperties are not additional properties", "data": {"foo":1, "vroom": 2}, "valid": true } ] }, { "description": "additionalProperties allows a schema which should validate", "schema": { "properties": {"foo": {}, "bar": {}}, "additionalProperties": {"type": "boolean"} }, "tests": [ { "description": "no additional properties is valid", "data": {"foo": 1}, "valid": true }, { "description": "an additional valid property is valid", "data": {"foo" : 1, "bar" : 2, "quux" : true}, "valid": true }, { "description": "an additional invalid property is invalid", "data": {"foo" : 1, "bar" : 2, "quux" : 12}, "valid": false } ] }, { "description": "additionalProperties can exist by itself", "schema": { "additionalProperties": {"type": "boolean"} }, "tests": [ { "description": "an additional valid property is valid", "data": {"foo" : true}, "valid": true }, { "description": "an additional invalid property is invalid", "data": {"foo" : 1}, "valid": false } ] }, { "description": "additionalProperties are allowed by default", "schema": {"properties": {"foo": {}, "bar": {}}}, "tests": [ { "description": "additional properties are allowed", "data": {"foo": 1, "bar": 2, "quux": true}, "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/uniqueItems.json0000644000000000000000000000506515031566105030351 0ustar rootroot[ { "description": "uniqueItems validation", "schema": {"uniqueItems": true}, "tests": [ { "description": "unique array of integers is valid", "data": [1, 2], "valid": true }, { "description": "non-unique array of integers is invalid", "data": [1, 1], "valid": false }, { "description": "numbers are unique if mathematically unequal", "data": [1.0, 1.00, 1], "valid": false }, { "description": "unique array of objects is valid", "data": [{"foo": "bar"}, {"foo": "baz"}], "valid": true }, { "description": "non-unique array of objects is invalid", "data": [{"foo": "bar"}, {"foo": "bar"}], "valid": false }, { "description": "unique array of nested objects is valid", "data": [ {"foo": {"bar" : {"baz" : true}}}, {"foo": {"bar" : {"baz" : false}}} ], "valid": true }, { "description": "non-unique array of nested objects is invalid", "data": [ {"foo": {"bar" : {"baz" : true}}}, {"foo": {"bar" : {"baz" : true}}} ], "valid": false }, { "description": "unique array of arrays is valid", "data": [["foo"], ["bar"]], "valid": true }, { "description": "non-unique array of arrays is invalid", "data": [["foo"], ["foo"]], "valid": false }, { "description": "1 and true are unique", "data": [1, true], "valid": true }, { "description": "0 and false are unique", "data": [0, false], "valid": true }, { "description": "unique heterogeneous types are valid", "data": [{}, [1], true, null, 1], "valid": true }, { "description": "non-unique heterogeneous types are invalid", "data": [{}, [1], true, null, {}, 1], "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/type.json0000644000000000000000000003164115031566105027021 0ustar rootroot[ { "description": "integer type matches integers", "schema": {"type": "integer"}, "tests": [ { "description": "an integer is an integer", "data": 1, "valid": true }, { "description": "a float is not an integer", "data": 1.1, "valid": false }, { "description": "a string is not an integer", "data": "foo", "valid": false }, { "description": "an object is not an integer", "data": {}, "valid": false }, { "description": "an array is not an integer", "data": [], "valid": false }, { "description": "a boolean is not an integer", "data": true, "valid": false }, { "description": "null is not an integer", "data": null, "valid": false } ] }, { "description": "number type matches numbers", "schema": {"type": "number"}, "tests": [ { "description": "an integer is a number", "data": 1, "valid": true }, { "description": "a float is a number", "data": 1.1, "valid": true }, { "description": "a string is not a number", "data": "foo", "valid": false }, { "description": "an object is not a number", "data": {}, "valid": false }, { "description": "an array is not a number", "data": [], "valid": false }, { "description": "a boolean is not a number", "data": true, "valid": false }, { "description": "null is not a number", "data": null, "valid": false } ] }, { "description": "string type matches strings", "schema": {"type": "string"}, "tests": [ { "description": "1 is not a string", "data": 1, "valid": false }, { "description": "a float is not a string", "data": 1.1, "valid": false }, { "description": "a string is a string", "data": "foo", "valid": true }, { "description": "an object is not a string", "data": {}, "valid": false }, { "description": "an array is not a string", "data": [], "valid": false }, { "description": "a boolean is not a string", "data": true, "valid": false }, { "description": "null is not a string", "data": null, "valid": false } ] }, { "description": "object type matches objects", "schema": {"type": "object"}, "tests": [ { "description": "an integer is not an object", "data": 1, "valid": false }, { "description": "a float is not an object", "data": 1.1, "valid": false }, { "description": "a string is not an object", "data": "foo", "valid": false }, { "description": "an object is an object", "data": {}, "valid": true }, { "description": "an array is not an object", "data": [], "valid": false }, { "description": "a boolean is not an object", "data": true, "valid": false }, { "description": "null is not an object", "data": null, "valid": false } ] }, { "description": "array type matches arrays", "schema": {"type": "array"}, "tests": [ { "description": "an integer is not an array", "data": 1, "valid": false }, { "description": "a float is not an array", "data": 1.1, "valid": false }, { "description": "a string is not an array", "data": "foo", "valid": false }, { "description": "an object is not an array", "data": {}, "valid": false }, { "description": "an array is an array", "data": [], "valid": true }, { "description": "a boolean is not an array", "data": true, "valid": false }, { "description": "null is not an array", "data": null, "valid": false } ] }, { "description": "boolean type matches booleans", "schema": {"type": "boolean"}, "tests": [ { "description": "an integer is not a boolean", "data": 1, "valid": false }, { "description": "a float is not a boolean", "data": 1.1, "valid": false }, { "description": "a string is not a boolean", "data": "foo", "valid": false }, { "description": "an object is not a boolean", "data": {}, "valid": false }, { "description": "an array is not a boolean", "data": [], "valid": false }, { "description": "a boolean is a boolean", "data": true, "valid": true }, { "description": "null is not a boolean", "data": null, "valid": false } ] }, { "description": "null type matches only the null object", "schema": {"type": "null"}, "tests": [ { "description": "an integer is not null", "data": 1, "valid": false }, { "description": "a float is not null", "data": 1.1, "valid": false }, { "description": "a string is not null", "data": "foo", "valid": false }, { "description": "an object is not null", "data": {}, "valid": false }, { "description": "an array is not null", "data": [], "valid": false }, { "description": "a boolean is not null", "data": true, "valid": false }, { "description": "null is null", "data": null, "valid": true } ] }, { "description": "any type matches any type", "schema": {"type": "any"}, "tests": [ { "description": "any type includes integers", "data": 1, "valid": true }, { "description": "any type includes float", "data": 1.1, "valid": true }, { "description": "any type includes string", "data": "foo", "valid": true }, { "description": "any type includes object", "data": {}, "valid": true }, { "description": "any type includes array", "data": [], "valid": true }, { "description": "any type includes boolean", "data": true, "valid": true }, { "description": "any type includes null", "data": null, "valid": true } ] }, { "description": "multiple types can be specified in an array", "schema": {"type": ["integer", "string"]}, "tests": [ { "description": "an integer is valid", "data": 1, "valid": true }, { "description": "a string is valid", "data": "foo", "valid": true }, { "description": "a float is invalid", "data": 1.1, "valid": false }, { "description": "an object is invalid", "data": {}, "valid": false }, { "description": "an array is invalid", "data": [], "valid": false }, { "description": "a boolean is invalid", "data": true, "valid": false }, { "description": "null is invalid", "data": null, "valid": false } ] }, { "description": "types can include schemas", "schema": { "type": [ "array", {"type": "object"} ] }, "tests": [ { "description": "an integer is invalid", "data": 1, "valid": false }, { "description": "a string is invalid", "data": "foo", "valid": false }, { "description": "a float is invalid", "data": 1.1, "valid": false }, { "description": "an object is valid", "data": {}, "valid": true }, { "description": "an array is valid", "data": [], "valid": true }, { "description": "a boolean is invalid", "data": true, "valid": false }, { "description": "null is invalid", "data": null, "valid": false } ] }, { "description": "when types includes a schema it should fully validate the schema", "schema": { "type": [ "integer", { "properties": { "foo": {"type": "null"} } } ] }, "tests": [ { "description": "an integer is valid", "data": 1, "valid": true }, { "description": "an object is valid only if it is fully valid", "data": {"foo": null}, "valid": true }, { "description": "an object is invalid otherwise", "data": {"foo": "bar"}, "valid": false } ] }, { "description": "types from separate schemas are merged", "schema": { "type": [ {"type": ["string"]}, {"type": ["array", "null"]} ] }, "tests": [ { "description": "an integer is invalid", "data": 1, "valid": false }, { "description": "a string is valid", "data": "foo", "valid": true }, { "description": "an array is valid", "data": [1, 2, 3], "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/additionalItems.json0000644000000000000000000000432115031566105031145 0ustar rootroot[ { "description": "additionalItems as schema", "schema": { "items": [], "additionalItems": {"type": "integer"} }, "tests": [ { "description": "additional items match schema", "data": [ 1, 2, 3, 4 ], "valid": true }, { "description": "additional items do not match schema", "data": [ 1, 2, 3, "foo" ], "valid": false } ] }, { "description": "items is schema, no additionalItems", "schema": { "items": {}, "additionalItems": false }, "tests": [ { "description": "all items match schema", "data": [ 1, 2, 3, 4, 5 ], "valid": true } ] }, { "description": "array of items with no additionalItems", "schema": { "items": [{}, {}, {}], "additionalItems": false }, "tests": [ { "description": "no additional items present", "data": [ 1, 2, 3 ], "valid": true }, { "description": "additional items are not permitted", "data": [ 1, 2, 3, 4 ], "valid": false } ] }, { "description": "additionalItems as false without items", "schema": {"additionalItems": false}, "tests": [ { "description": "items defaults to empty schema so everything is valid", "data": [ 1, 2, 3, 4, 5 ], "valid": true }, { "description": "ignores non-arrays", "data": {"foo" : "bar"}, "valid": true } ] }, { "description": "additionalItems are allowed by default", "schema": {"items": []}, "tests": [ { "description": "only the first items are validated", "data": [1, "foo", false], "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/patternProperties.json0000644000000000000000000000644515031566105031576 0ustar rootroot[ { "description": "patternProperties validates properties matching a regex", "schema": { "patternProperties": { "f.*o": {"type": "integer"} } }, "tests": [ { "description": "a single valid match is valid", "data": {"foo": 1}, "valid": true }, { "description": "multiple valid matches is valid", "data": {"foo": 1, "foooooo" : 2}, "valid": true }, { "description": "a single invalid match is invalid", "data": {"foo": "bar", "fooooo": 2}, "valid": false }, { "description": "multiple invalid matches is invalid", "data": {"foo": "bar", "foooooo" : "baz"}, "valid": false }, { "description": "ignores non-objects", "data": 12, "valid": true } ] }, { "description": "multiple simultaneous patternProperties are validated", "schema": { "patternProperties": { "a*": {"type": "integer"}, "aaa*": {"maximum": 20} } }, "tests": [ { "description": "a single valid match is valid", "data": {"a": 21}, "valid": true }, { "description": "a simultaneous match is valid", "data": {"aaaa": 18}, "valid": true }, { "description": "multiple matches is valid", "data": {"a": 21, "aaaa": 18}, "valid": true }, { "description": "an invalid due to one is invalid", "data": {"a": "bar"}, "valid": false }, { "description": "an invalid due to the other is invalid", "data": {"aaaa": 31}, "valid": false }, { "description": "an invalid due to both is invalid", "data": {"aaa": "foo", "aaaa": 31}, "valid": false } ] }, { "description": "regexes are not anchored by default and are case sensitive", "schema": { "patternProperties": { "[0-9]{2,}": { "type": "boolean" }, "X_": { "type": "string" } } }, "tests": [ { "description": "non recognized members are ignored", "data": { "answer 1": "42" }, "valid": true }, { "description": "recognized members are accounted for", "data": { "a31b": null }, "valid": false }, { "description": "regexes are case sensitive", "data": { "a_x_3": 3 }, "valid": true }, { "description": "regexes are case sensitive, 2", "data": { "a_X_3": 3 }, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/default.json0000644000000000000000000000237115031566105027462 0ustar rootroot[ { "description": "invalid type for default", "schema": { "properties": { "foo": { "type": "integer", "default": [] } } }, "tests": [ { "description": "valid when property is specified", "data": {"foo": 13}, "valid": true }, { "description": "still valid when the invalid default is used", "data": {}, "valid": true } ] }, { "description": "invalid string value for default", "schema": { "properties": { "bar": { "type": "string", "minLength": 4, "default": "bad" } } }, "tests": [ { "description": "valid when property is specified", "data": {"bar": "good"}, "valid": true }, { "description": "still valid when the invalid default is used", "data": {}, "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/enum.json0000644000000000000000000000365415031566105027007 0ustar rootroot[ { "description": "simple enum validation", "schema": {"enum": [1, 2, 3]}, "tests": [ { "description": "one of the enum is valid", "data": 1, "valid": true }, { "description": "something else is invalid", "data": 4, "valid": false } ] }, { "description": "heterogeneous enum validation", "schema": {"enum": [6, "foo", [], true, {"foo": 12}]}, "tests": [ { "description": "one of the enum is valid", "data": [], "valid": true }, { "description": "something else is invalid", "data": null, "valid": false }, { "description": "objects are deep compared", "data": {"foo": false}, "valid": false } ] }, { "description": "enums in properties", "schema": { "type":"object", "properties": { "foo": {"enum":["foo"]}, "bar": {"enum":["bar"], "required":true} } }, "tests": [ { "description": "both properties are valid", "data": {"foo":"foo", "bar":"bar"}, "valid": true }, { "description": "missing optional property is valid", "data": {"bar":"bar"}, "valid": true }, { "description": "missing required property is invalid", "data": {"foo":"foo"}, "valid": false }, { "description": "missing all properties is invalid", "data": {}, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/refRemote.json0000644000000000000000000000365115031566105027770 0ustar rootroot[ { "description": "remote ref", "schema": {"$ref": "http://localhost:1234/integer.json"}, "tests": [ { "description": "remote ref valid", "data": 1, "valid": true }, { "description": "remote ref invalid", "data": "a", "valid": false } ] }, { "description": "fragment within remote ref", "schema": {"$ref": "http://localhost:1234/subSchemas.json#/integer"}, "tests": [ { "description": "remote fragment valid", "data": 1, "valid": true }, { "description": "remote fragment invalid", "data": "a", "valid": false } ] }, { "description": "ref within remote ref", "schema": { "$ref": "http://localhost:1234/subSchemas.json#/refToInteger" }, "tests": [ { "description": "ref within ref valid", "data": 1, "valid": true }, { "description": "ref within ref invalid", "data": "a", "valid": false } ] }, { "description": "change resolution scope", "schema": { "id": "http://localhost:1234/", "items": { "id": "folder/", "items": {"$ref": "folderInteger.json"} } }, "tests": [ { "description": "changed scope ref valid", "data": [[1]], "valid": true }, { "description": "changed scope ref invalid", "data": [["a"]], "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/maximum.json0000644000000000000000000000204715031566105027513 0ustar rootroot[ { "description": "maximum validation", "schema": {"maximum": 3.0}, "tests": [ { "description": "below the maximum is valid", "data": 2.6, "valid": true }, { "description": "above the maximum is invalid", "data": 3.5, "valid": false }, { "description": "ignores non-numbers", "data": "x", "valid": true } ] }, { "description": "exclusiveMaximum validation", "schema": { "maximum": 3.0, "exclusiveMaximum": true }, "tests": [ { "description": "below the maximum is still valid", "data": 2.2, "valid": true }, { "description": "boundary point is invalid", "data": 3.0, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/minItems.json0000644000000000000000000000126515031566105027624 0ustar rootroot[ { "description": "minItems validation", "schema": {"minItems": 1}, "tests": [ { "description": "longer is valid", "data": [1, 2], "valid": true }, { "description": "exact length is valid", "data": [1], "valid": true }, { "description": "too short is invalid", "data": [], "valid": false }, { "description": "ignores non-arrays", "data": "", "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/dependencies.json0000644000000000000000000000565515031566105030474 0ustar rootroot[ { "description": "dependencies", "schema": { "dependencies": {"bar": "foo"} }, "tests": [ { "description": "neither", "data": {}, "valid": true }, { "description": "nondependant", "data": {"foo": 1}, "valid": true }, { "description": "with dependency", "data": {"foo": 1, "bar": 2}, "valid": true }, { "description": "missing dependency", "data": {"bar": 2}, "valid": false }, { "description": "ignores non-objects", "data": "foo", "valid": true } ] }, { "description": "multiple dependencies", "schema": { "dependencies": {"quux": ["foo", "bar"]} }, "tests": [ { "description": "neither", "data": {}, "valid": true }, { "description": "nondependants", "data": {"foo": 1, "bar": 2}, "valid": true }, { "description": "with dependencies", "data": {"foo": 1, "bar": 2, "quux": 3}, "valid": true }, { "description": "missing dependency", "data": {"foo": 1, "quux": 2}, "valid": false }, { "description": "missing other dependency", "data": {"bar": 1, "quux": 2}, "valid": false }, { "description": "missing both dependencies", "data": {"quux": 1}, "valid": false } ] }, { "description": "multiple dependencies subschema", "schema": { "dependencies": { "bar": { "properties": { "foo": {"type": "integer"}, "bar": {"type": "integer"} } } } }, "tests": [ { "description": "valid", "data": {"foo": 1, "bar": 2}, "valid": true }, { "description": "wrong type", "data": {"foo": "quux", "bar": 2}, "valid": false }, { "description": "wrong type other", "data": {"foo": 2, "bar": "quux"}, "valid": false }, { "description": "wrong type both", "data": {"foo": "quux", "bar": "quux"}, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/required.json0000644000000000000000000000240215031566105027651 0ustar rootroot[ { "description": "required validation", "schema": { "properties": { "foo": {"required" : true}, "bar": {} } }, "tests": [ { "description": "present required property is valid", "data": {"foo": 1}, "valid": true }, { "description": "non-present required property is invalid", "data": {"bar": 1}, "valid": false } ] }, { "description": "required default validation", "schema": { "properties": { "foo": {} } }, "tests": [ { "description": "not required by default", "data": {}, "valid": true } ] }, { "description": "required explicitly false validation", "schema": { "properties": { "foo": {"required": false} } }, "tests": [ { "description": "not required if required is false", "data": {}, "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/minimum.json0000644000000000000000000000204715031566105027511 0ustar rootroot[ { "description": "minimum validation", "schema": {"minimum": 1.1}, "tests": [ { "description": "above the minimum is valid", "data": 2.6, "valid": true }, { "description": "below the minimum is invalid", "data": 0.6, "valid": false }, { "description": "ignores non-numbers", "data": "x", "valid": true } ] }, { "description": "exclusiveMinimum validation", "schema": { "minimum": 1.1, "exclusiveMinimum": true }, "tests": [ { "description": "above the minimum is still valid", "data": 1.2, "valid": true }, { "description": "boundary point is invalid", "data": 1.1, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/properties.json0000644000000000000000000000550115031566105030230 0ustar rootroot[ { "description": "object properties validation", "schema": { "properties": { "foo": {"type": "integer"}, "bar": {"type": "string"} } }, "tests": [ { "description": "both properties present and valid is valid", "data": {"foo": 1, "bar": "baz"}, "valid": true }, { "description": "one property invalid is invalid", "data": {"foo": 1, "bar": {}}, "valid": false }, { "description": "both properties invalid is invalid", "data": {"foo": [], "bar": {}}, "valid": false }, { "description": "doesn't invalidate other properties", "data": {"quux": []}, "valid": true }, { "description": "ignores non-objects", "data": [], "valid": true } ] }, { "description": "properties, patternProperties, additionalProperties interaction", "schema": { "properties": { "foo": {"type": "array", "maxItems": 3}, "bar": {"type": "array"} }, "patternProperties": {"f.o": {"minItems": 2}}, "additionalProperties": {"type": "integer"} }, "tests": [ { "description": "property validates property", "data": {"foo": [1, 2]}, "valid": true }, { "description": "property invalidates property", "data": {"foo": [1, 2, 3, 4]}, "valid": false }, { "description": "patternProperty invalidates property", "data": {"foo": []}, "valid": false }, { "description": "patternProperty validates nonproperty", "data": {"fxo": [1, 2]}, "valid": true }, { "description": "patternProperty invalidates nonproperty", "data": {"fxo": []}, "valid": false }, { "description": "additionalProperty ignores property", "data": {"bar": []}, "valid": true }, { "description": "additionalProperty validates others", "data": {"quux": 3}, "valid": true }, { "description": "additionalProperty invalidates others", "data": {"quux": "foo"}, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/optional/0000755000000000000000000000000015031566105026765 5ustar rootroot././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/optional/zeroTerminatedFloats.jsonasymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/optional/zeroTerminatedFloat0000644000000000000000000000060015031566105032666 0ustar rootroot[ { "description": "some languages do not distinguish between different types of numeric value", "schema": { "type": "integer" }, "tests": [ { "description": "a float is not an integer even without fractional part", "data": 1.0, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/optional/jsregex.json0000644000000000000000000000071715031566105031334 0ustar rootroot[ { "description": "ECMA 262 regex dialect recognition", "schema": { "format": "regex" }, "tests": [ { "description": "[^] is a valid regex", "data": "[^]", "valid": true }, { "description": "ECMA 262 has no support for lookbehind", "data": "(?<=foo)bar", "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/optional/format.json0000644000000000000000000001513715031566105031157 0ustar rootroot[ { "description": "validation of regular expressions", "schema": {"format": "regex"}, "tests": [ { "description": "a valid regular expression", "data": "([abc])+\\s+$", "valid": true }, { "description": "a regular expression with unclosed parens is invalid", "data": "^(abc]", "valid": false } ] }, { "description": "validation of date-time strings", "schema": {"format": "date-time"}, "tests": [ { "description": "a valid date-time string", "data": "1963-06-19T08:30:06.283185Z", "valid": true }, { "description": "an invalid date-time string", "data": "06/19/1963 08:30:06 PST", "valid": false }, { "description": "only RFC3339 not all of ISO 8601 are valid", "data": "2013-350T01:01:01", "valid": false } ] }, { "description": "validation of date strings", "schema": {"format": "date"}, "tests": [ { "description": "a valid date string", "data": "1963-06-19", "valid": true }, { "description": "an invalid date string", "data": "06/19/1963", "valid": false } ] }, { "description": "validation of time strings", "schema": {"format": "time"}, "tests": [ { "description": "a valid time string", "data": "08:30:06", "valid": true }, { "description": "an invalid time string", "data": "8:30 AM", "valid": false } ] }, { "description": "validation of URIs", "schema": {"format": "uri"}, "tests": [ { "description": "a valid URI", "data": "http://foo.bar/?baz=qux#quux", "valid": true }, { "description": "a valid protocol-relative URI", "data": "//foo.bar/?baz=qux#quux", "valid": true }, { "description": "an invalid URI", "data": "\\\\WINDOWS\\fileshare", "valid": false }, { "description": "an invalid URI though valid URI reference", "data": "abc", "valid": false } ] }, { "description": "validation of e-mail addresses", "schema": {"format": "email"}, "tests": [ { "description": "a valid e-mail address", "data": "joe.bloggs@example.com", "valid": true }, { "description": "an invalid e-mail address", "data": "2962", "valid": false } ] }, { "description": "validation of IP addresses", "schema": {"format": "ip-address"}, "tests": [ { "description": "a valid IP address", "data": "192.168.0.1", "valid": true }, { "description": "an IP address with too many components", "data": "127.0.0.0.1", "valid": false }, { "description": "an IP address with out-of-range values", "data": "256.256.256.256", "valid": false } ] }, { "description": "validation of IPv6 addresses", "schema": {"format": "ipv6"}, "tests": [ { "description": "a valid IPv6 address", "data": "::1", "valid": true }, { "description": "an IPv6 address with out-of-range values", "data": "12345::", "valid": false }, { "description": "an IPv6 address with too many components", "data": "1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1", "valid": false }, { "description": "an IPv6 address containing illegal characters", "data": "::laptop", "valid": false } ] }, { "description": "validation of host names", "schema": {"format": "host-name"}, "tests": [ { "description": "a valid host name", "data": "www.example.com", "valid": true }, { "description": "a host name starting with an illegal character", "data": "-a-host-name-that-starts-with--", "valid": false }, { "description": "a host name containing illegal characters", "data": "not_a_valid_host_name", "valid": false }, { "description": "a host name with a component too long", "data": "a-vvvvvvvvvvvvvvvveeeeeeeeeeeeeeeerrrrrrrrrrrrrrrryyyyyyyyyyyyyyyy-long-host-name-component", "valid": false } ] }, { "description": "validation of CSS colors", "schema": {"format": "color"}, "tests": [ { "description": "a valid CSS color name", "data": "fuchsia", "valid": true }, { "description": "a valid six-digit CSS color code", "data": "#CC8899", "valid": true }, { "description": "a valid three-digit CSS color code", "data": "#C89", "valid": true }, { "description": "an invalid CSS color code", "data": "#00332520", "valid": false }, { "description": "an invalid CSS color name", "data": "puce", "valid": false }, { "description": "a CSS color name containing invalid characters", "data": "light_grayish_red-violet", "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/optional/bignum.json0000644000000000000000000000600315031566105031140 0ustar rootroot[ { "description": "integer", "schema": {"type": "integer"}, "tests": [ { "description": "a bignum is an integer", "data": 12345678910111213141516171819202122232425262728293031, "valid": true } ] }, { "description": "number", "schema": {"type": "number"}, "tests": [ { "description": "a bignum is a number", "data": 98249283749234923498293171823948729348710298301928331, "valid": true } ] }, { "description": "integer", "schema": {"type": "integer"}, "tests": [ { "description": "a negative bignum is an integer", "data": -12345678910111213141516171819202122232425262728293031, "valid": true } ] }, { "description": "number", "schema": {"type": "number"}, "tests": [ { "description": "a negative bignum is a number", "data": -98249283749234923498293171823948729348710298301928331, "valid": true } ] }, { "description": "string", "schema": {"type": "string"}, "tests": [ { "description": "a bignum is not a string", "data": 98249283749234923498293171823948729348710298301928331, "valid": false } ] }, { "description": "integer comparison", "schema": {"maximum": 18446744073709551615}, "tests": [ { "description": "comparison works for high numbers", "data": 18446744073709551600, "valid": true } ] }, { "description": "float comparison with high precision", "schema": { "maximum": 972783798187987123879878123.18878137, "exclusiveMaximum": true }, "tests": [ { "description": "comparison works for high numbers", "data": 972783798187987123879878123.188781371, "valid": false } ] }, { "description": "integer comparison", "schema": {"minimum": -18446744073709551615}, "tests": [ { "description": "comparison works for very negative numbers", "data": -18446744073709551600, "valid": true } ] }, { "description": "float comparison with high precision on negative numbers", "schema": { "minimum": -972783798187987123879878123.18878137, "exclusiveMinimum": true }, "tests": [ { "description": "comparison works for very negative numbers", "data": -972783798187987123879878123.188781371, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/0000755000000000000000000000000015031566105025141 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/definitions.json0000644000000000000000000000152615031566105030353 0ustar rootroot[ { "description": "valid definition", "schema": {"$ref": "http://json-schema.org/draft-04/schema#"}, "tests": [ { "description": "valid definition schema", "data": { "definitions": { "foo": {"type": "integer"} } }, "valid": true } ] }, { "description": "invalid definition", "schema": {"$ref": "http://json-schema.org/draft-04/schema#"}, "tests": [ { "description": "invalid definition schema", "data": { "definitions": { "foo": {"type": 1} } }, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/ref.json0000644000000000000000000001041615031566105026612 0ustar rootroot[ { "description": "root pointer ref", "schema": { "properties": { "foo": {"$ref": "#"} }, "additionalProperties": false }, "tests": [ { "description": "match", "data": {"foo": false}, "valid": true }, { "description": "recursive match", "data": {"foo": {"foo": false}}, "valid": true }, { "description": "mismatch", "data": {"bar": false}, "valid": false }, { "description": "recursive mismatch", "data": {"foo": {"bar": false}}, "valid": false } ] }, { "description": "relative pointer ref to object", "schema": { "properties": { "foo": {"type": "integer"}, "bar": {"$ref": "#/properties/foo"} } }, "tests": [ { "description": "match", "data": {"bar": 3}, "valid": true }, { "description": "mismatch", "data": {"bar": true}, "valid": false } ] }, { "description": "relative pointer ref to array", "schema": { "items": [ {"type": "integer"}, {"$ref": "#/items/0"} ] }, "tests": [ { "description": "match array", "data": [1, 2], "valid": true }, { "description": "mismatch array", "data": [1, "foo"], "valid": false } ] }, { "description": "escaped pointer ref", "schema": { "tilda~field": {"type": "integer"}, "slash/field": {"type": "integer"}, "percent%field": {"type": "integer"}, "properties": { "tilda": {"$ref": "#/tilda~0field"}, "slash": {"$ref": "#/slash~1field"}, "percent": {"$ref": "#/percent%25field"} } }, "tests": [ { "description": "slash invalid", "data": {"slash": "aoeu"}, "valid": false }, { "description": "tilda invalid", "data": {"tilda": "aoeu"}, "valid": false }, { "description": "percent invalid", "data": {"percent": "aoeu"}, "valid": false }, { "description": "slash valid", "data": {"slash": 123}, "valid": true }, { "description": "tilda valid", "data": {"tilda": 123}, "valid": true }, { "description": "percent valid", "data": {"percent": 123}, "valid": true } ] }, { "description": "nested refs", "schema": { "definitions": { "a": {"type": "integer"}, "b": {"$ref": "#/definitions/a"}, "c": {"$ref": "#/definitions/b"} }, "$ref": "#/definitions/c" }, "tests": [ { "description": "nested ref valid", "data": 5, "valid": true }, { "description": "nested ref invalid", "data": "a", "valid": false } ] }, { "description": "remote ref, containing refs itself", "schema": {"$ref": "http://json-schema.org/draft-04/schema#"}, "tests": [ { "description": "remote ref valid", "data": {"minLength": 1}, "valid": true }, { "description": "remote ref invalid", "data": {"minLength": -1}, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/oneOf.json0000644000000000000000000000310715031566105027103 0ustar rootroot[ { "description": "oneOf", "schema": { "oneOf": [ { "type": "integer" }, { "minimum": 2 } ] }, "tests": [ { "description": "first oneOf valid", "data": 1, "valid": true }, { "description": "second oneOf valid", "data": 2.5, "valid": true }, { "description": "both oneOf valid", "data": 3, "valid": false }, { "description": "neither oneOf valid", "data": 1.5, "valid": false } ] }, { "description": "oneOf with base schema", "schema": { "type": "string", "oneOf" : [ { "minLength": 2 }, { "maxLength": 4 } ] }, "tests": [ { "description": "mismatch base schema", "data": 3, "valid": false }, { "description": "one oneOf valid", "data": "foobar", "valid": true }, { "description": "both oneOf valid", "data": "foo", "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/multipleOf.json0000644000000000000000000000276515031566105030166 0ustar rootroot[ { "description": "by int", "schema": {"multipleOf": 2}, "tests": [ { "description": "int by int", "data": 10, "valid": true }, { "description": "int by int fail", "data": 7, "valid": false }, { "description": "ignores non-numbers", "data": "foo", "valid": true } ] }, { "description": "by number", "schema": {"multipleOf": 1.5}, "tests": [ { "description": "zero is multiple of anything", "data": 0, "valid": true }, { "description": "4.5 is multiple of 1.5", "data": 4.5, "valid": true }, { "description": "35 is not multiple of 1.5", "data": 35, "valid": false } ] }, { "description": "by small number", "schema": {"multipleOf": 0.0001}, "tests": [ { "description": "0.0075 is multiple of 0.0001", "data": 0.0075, "valid": true }, { "description": "0.00751 is not multiple of 0.0001", "data": 0.00751, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/minLength.json0000644000000000000000000000156615031566105027771 0ustar rootroot[ { "description": "minLength validation", "schema": {"minLength": 2}, "tests": [ { "description": "longer is valid", "data": "foo", "valid": true }, { "description": "exact length is valid", "data": "fo", "valid": true }, { "description": "too short is invalid", "data": "f", "valid": false }, { "description": "ignores non-strings", "data": 1, "valid": true }, { "description": "one supplementary Unicode code point is not long enough", "data": "\uD83D\uDCA9", "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/pattern.json0000644000000000000000000000153115031566105027511 0ustar rootroot[ { "description": "pattern validation", "schema": {"pattern": "^a*$"}, "tests": [ { "description": "a matching pattern is valid", "data": "aaa", "valid": true }, { "description": "a non-matching pattern is invalid", "data": "abc", "valid": false }, { "description": "ignores non-strings", "data": true, "valid": true } ] }, { "description": "pattern is not anchored", "schema": {"pattern": "a+"}, "tests": [ { "description": "matches a substring", "data": "xxaayy", "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/minProperties.json0000644000000000000000000000132515031566105030675 0ustar rootroot[ { "description": "minProperties validation", "schema": {"minProperties": 1}, "tests": [ { "description": "longer is valid", "data": {"foo": 1, "bar": 2}, "valid": true }, { "description": "exact length is valid", "data": {"foo": 1}, "valid": true }, { "description": "too short is invalid", "data": {}, "valid": false }, { "description": "ignores non-objects", "data": "", "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/items.json0000644000000000000000000000216015031566105027154 0ustar rootroot[ { "description": "a schema given for items", "schema": { "items": {"type": "integer"} }, "tests": [ { "description": "valid items", "data": [ 1, 2, 3 ], "valid": true }, { "description": "wrong type of items", "data": [1, "x"], "valid": false }, { "description": "ignores non-arrays", "data": {"foo" : "bar"}, "valid": true } ] }, { "description": "an array of schemas for items", "schema": { "items": [ {"type": "integer"}, {"type": "string"} ] }, "tests": [ { "description": "correct types", "data": [ 1, "foo" ], "valid": true }, { "description": "wrong types", "data": [ "foo", 1 ], "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/anyOf.json0000644000000000000000000000311015031566105027103 0ustar rootroot[ { "description": "anyOf", "schema": { "anyOf": [ { "type": "integer" }, { "minimum": 2 } ] }, "tests": [ { "description": "first anyOf valid", "data": 1, "valid": true }, { "description": "second anyOf valid", "data": 2.5, "valid": true }, { "description": "both anyOf valid", "data": 3, "valid": true }, { "description": "neither anyOf valid", "data": 1.5, "valid": false } ] }, { "description": "anyOf with base schema", "schema": { "type": "string", "anyOf" : [ { "maxLength": 2 }, { "minLength": 4 } ] }, "tests": [ { "description": "mismatch base schema", "data": 3, "valid": false }, { "description": "one anyOf valid", "data": "foobar", "valid": true }, { "description": "both anyOf invalid", "data": "foo", "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/maxLength.json0000644000000000000000000000160015031566105027760 0ustar rootroot[ { "description": "maxLength validation", "schema": {"maxLength": 2}, "tests": [ { "description": "shorter is valid", "data": "f", "valid": true }, { "description": "exact length is valid", "data": "fo", "valid": true }, { "description": "too long is invalid", "data": "foo", "valid": false }, { "description": "ignores non-strings", "data": 100, "valid": true }, { "description": "two supplementary Unicode code points is long enough", "data": "\uD83D\uDCA9\uD83D\uDCA9", "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/maxItems.json0000644000000000000000000000130215031566105027617 0ustar rootroot[ { "description": "maxItems validation", "schema": {"maxItems": 2}, "tests": [ { "description": "shorter is valid", "data": [1], "valid": true }, { "description": "exact length is valid", "data": [1, 2], "valid": true }, { "description": "too long is invalid", "data": [1, 2, 3], "valid": false }, { "description": "ignores non-arrays", "data": "foobar", "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/additionalProperties.json0000644000000000000000000000527115031566105032226 0ustar rootroot[ { "description": "additionalProperties being false does not allow other properties", "schema": { "properties": {"foo": {}, "bar": {}}, "patternProperties": { "^v": {} }, "additionalProperties": false }, "tests": [ { "description": "no additional properties is valid", "data": {"foo": 1}, "valid": true }, { "description": "an additional property is invalid", "data": {"foo" : 1, "bar" : 2, "quux" : "boom"}, "valid": false }, { "description": "ignores non-objects", "data": [1, 2, 3], "valid": true }, { "description": "patternProperties are not additional properties", "data": {"foo":1, "vroom": 2}, "valid": true } ] }, { "description": "additionalProperties allows a schema which should validate", "schema": { "properties": {"foo": {}, "bar": {}}, "additionalProperties": {"type": "boolean"} }, "tests": [ { "description": "no additional properties is valid", "data": {"foo": 1}, "valid": true }, { "description": "an additional valid property is valid", "data": {"foo" : 1, "bar" : 2, "quux" : true}, "valid": true }, { "description": "an additional invalid property is invalid", "data": {"foo" : 1, "bar" : 2, "quux" : 12}, "valid": false } ] }, { "description": "additionalProperties can exist by itself", "schema": { "additionalProperties": {"type": "boolean"} }, "tests": [ { "description": "an additional valid property is valid", "data": {"foo" : true}, "valid": true }, { "description": "an additional invalid property is invalid", "data": {"foo" : 1}, "valid": false } ] }, { "description": "additionalProperties are allowed by default", "schema": {"properties": {"foo": {}, "bar": {}}}, "tests": [ { "description": "additional properties are allowed", "data": {"foo": 1, "bar": 2, "quux": true}, "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/uniqueItems.json0000644000000000000000000000506515031566105030352 0ustar rootroot[ { "description": "uniqueItems validation", "schema": {"uniqueItems": true}, "tests": [ { "description": "unique array of integers is valid", "data": [1, 2], "valid": true }, { "description": "non-unique array of integers is invalid", "data": [1, 1], "valid": false }, { "description": "numbers are unique if mathematically unequal", "data": [1.0, 1.00, 1], "valid": false }, { "description": "unique array of objects is valid", "data": [{"foo": "bar"}, {"foo": "baz"}], "valid": true }, { "description": "non-unique array of objects is invalid", "data": [{"foo": "bar"}, {"foo": "bar"}], "valid": false }, { "description": "unique array of nested objects is valid", "data": [ {"foo": {"bar" : {"baz" : true}}}, {"foo": {"bar" : {"baz" : false}}} ], "valid": true }, { "description": "non-unique array of nested objects is invalid", "data": [ {"foo": {"bar" : {"baz" : true}}}, {"foo": {"bar" : {"baz" : true}}} ], "valid": false }, { "description": "unique array of arrays is valid", "data": [["foo"], ["bar"]], "valid": true }, { "description": "non-unique array of arrays is invalid", "data": [["foo"], ["foo"]], "valid": false }, { "description": "1 and true are unique", "data": [1, true], "valid": true }, { "description": "0 and false are unique", "data": [0, false], "valid": true }, { "description": "unique heterogeneous types are valid", "data": [{}, [1], true, null, 1], "valid": true }, { "description": "non-unique heterogeneous types are invalid", "data": [{}, [1], true, null, {}, 1], "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/type.json0000644000000000000000000002212215031566105027014 0ustar rootroot[ { "description": "integer type matches integers", "schema": {"type": "integer"}, "tests": [ { "description": "an integer is an integer", "data": 1, "valid": true }, { "description": "a float is not an integer", "data": 1.1, "valid": false }, { "description": "a string is not an integer", "data": "foo", "valid": false }, { "description": "an object is not an integer", "data": {}, "valid": false }, { "description": "an array is not an integer", "data": [], "valid": false }, { "description": "a boolean is not an integer", "data": true, "valid": false }, { "description": "null is not an integer", "data": null, "valid": false } ] }, { "description": "number type matches numbers", "schema": {"type": "number"}, "tests": [ { "description": "an integer is a number", "data": 1, "valid": true }, { "description": "a float is a number", "data": 1.1, "valid": true }, { "description": "a string is not a number", "data": "foo", "valid": false }, { "description": "an object is not a number", "data": {}, "valid": false }, { "description": "an array is not a number", "data": [], "valid": false }, { "description": "a boolean is not a number", "data": true, "valid": false }, { "description": "null is not a number", "data": null, "valid": false } ] }, { "description": "string type matches strings", "schema": {"type": "string"}, "tests": [ { "description": "1 is not a string", "data": 1, "valid": false }, { "description": "a float is not a string", "data": 1.1, "valid": false }, { "description": "a string is a string", "data": "foo", "valid": true }, { "description": "an object is not a string", "data": {}, "valid": false }, { "description": "an array is not a string", "data": [], "valid": false }, { "description": "a boolean is not a string", "data": true, "valid": false }, { "description": "null is not a string", "data": null, "valid": false } ] }, { "description": "object type matches objects", "schema": {"type": "object"}, "tests": [ { "description": "an integer is not an object", "data": 1, "valid": false }, { "description": "a float is not an object", "data": 1.1, "valid": false }, { "description": "a string is not an object", "data": "foo", "valid": false }, { "description": "an object is an object", "data": {}, "valid": true }, { "description": "an array is not an object", "data": [], "valid": false }, { "description": "a boolean is not an object", "data": true, "valid": false }, { "description": "null is not an object", "data": null, "valid": false } ] }, { "description": "array type matches arrays", "schema": {"type": "array"}, "tests": [ { "description": "an integer is not an array", "data": 1, "valid": false }, { "description": "a float is not an array", "data": 1.1, "valid": false }, { "description": "a string is not an array", "data": "foo", "valid": false }, { "description": "an object is not an array", "data": {}, "valid": false }, { "description": "an array is an array", "data": [], "valid": true }, { "description": "a boolean is not an array", "data": true, "valid": false }, { "description": "null is not an array", "data": null, "valid": false } ] }, { "description": "boolean type matches booleans", "schema": {"type": "boolean"}, "tests": [ { "description": "an integer is not a boolean", "data": 1, "valid": false }, { "description": "a float is not a boolean", "data": 1.1, "valid": false }, { "description": "a string is not a boolean", "data": "foo", "valid": false }, { "description": "an object is not a boolean", "data": {}, "valid": false }, { "description": "an array is not a boolean", "data": [], "valid": false }, { "description": "a boolean is a boolean", "data": true, "valid": true }, { "description": "null is not a boolean", "data": null, "valid": false } ] }, { "description": "null type matches only the null object", "schema": {"type": "null"}, "tests": [ { "description": "an integer is not null", "data": 1, "valid": false }, { "description": "a float is not null", "data": 1.1, "valid": false }, { "description": "a string is not null", "data": "foo", "valid": false }, { "description": "an object is not null", "data": {}, "valid": false }, { "description": "an array is not null", "data": [], "valid": false }, { "description": "a boolean is not null", "data": true, "valid": false }, { "description": "null is null", "data": null, "valid": true } ] }, { "description": "multiple types can be specified in an array", "schema": {"type": ["integer", "string"]}, "tests": [ { "description": "an integer is valid", "data": 1, "valid": true }, { "description": "a string is valid", "data": "foo", "valid": true }, { "description": "a float is invalid", "data": 1.1, "valid": false }, { "description": "an object is invalid", "data": {}, "valid": false }, { "description": "an array is invalid", "data": [], "valid": false }, { "description": "a boolean is invalid", "data": true, "valid": false }, { "description": "null is invalid", "data": null, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/additionalItems.json0000644000000000000000000000435215031566105031152 0ustar rootroot[ { "description": "additionalItems as schema", "schema": { "items": [{}], "additionalItems": {"type": "integer"} }, "tests": [ { "description": "additional items match schema", "data": [ null, 2, 3, 4 ], "valid": true }, { "description": "additional items do not match schema", "data": [ null, 2, 3, "foo" ], "valid": false } ] }, { "description": "items is schema, no additionalItems", "schema": { "items": {}, "additionalItems": false }, "tests": [ { "description": "all items match schema", "data": [ 1, 2, 3, 4, 5 ], "valid": true } ] }, { "description": "array of items with no additionalItems", "schema": { "items": [{}, {}, {}], "additionalItems": false }, "tests": [ { "description": "no additional items present", "data": [ 1, 2, 3 ], "valid": true }, { "description": "additional items are not permitted", "data": [ 1, 2, 3, 4 ], "valid": false } ] }, { "description": "additionalItems as false without items", "schema": {"additionalItems": false}, "tests": [ { "description": "items defaults to empty schema so everything is valid", "data": [ 1, 2, 3, 4, 5 ], "valid": true }, { "description": "ignores non-arrays", "data": {"foo" : "bar"}, "valid": true } ] }, { "description": "additionalItems are allowed by default", "schema": {"items": [{"type": "integer"}]}, "tests": [ { "description": "only the first item is validated", "data": [1, "foo", false], "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/patternProperties.json0000644000000000000000000000644515031566105031577 0ustar rootroot[ { "description": "patternProperties validates properties matching a regex", "schema": { "patternProperties": { "f.*o": {"type": "integer"} } }, "tests": [ { "description": "a single valid match is valid", "data": {"foo": 1}, "valid": true }, { "description": "multiple valid matches is valid", "data": {"foo": 1, "foooooo" : 2}, "valid": true }, { "description": "a single invalid match is invalid", "data": {"foo": "bar", "fooooo": 2}, "valid": false }, { "description": "multiple invalid matches is invalid", "data": {"foo": "bar", "foooooo" : "baz"}, "valid": false }, { "description": "ignores non-objects", "data": 12, "valid": true } ] }, { "description": "multiple simultaneous patternProperties are validated", "schema": { "patternProperties": { "a*": {"type": "integer"}, "aaa*": {"maximum": 20} } }, "tests": [ { "description": "a single valid match is valid", "data": {"a": 21}, "valid": true }, { "description": "a simultaneous match is valid", "data": {"aaaa": 18}, "valid": true }, { "description": "multiple matches is valid", "data": {"a": 21, "aaaa": 18}, "valid": true }, { "description": "an invalid due to one is invalid", "data": {"a": "bar"}, "valid": false }, { "description": "an invalid due to the other is invalid", "data": {"aaaa": 31}, "valid": false }, { "description": "an invalid due to both is invalid", "data": {"aaa": "foo", "aaaa": 31}, "valid": false } ] }, { "description": "regexes are not anchored by default and are case sensitive", "schema": { "patternProperties": { "[0-9]{2,}": { "type": "boolean" }, "X_": { "type": "string" } } }, "tests": [ { "description": "non recognized members are ignored", "data": { "answer 1": "42" }, "valid": true }, { "description": "recognized members are accounted for", "data": { "a31b": null }, "valid": false }, { "description": "regexes are case sensitive", "data": { "a_x_3": 3 }, "valid": true }, { "description": "regexes are case sensitive, 2", "data": { "a_X_3": 3 }, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/default.json0000644000000000000000000000237115031566105027463 0ustar rootroot[ { "description": "invalid type for default", "schema": { "properties": { "foo": { "type": "integer", "default": [] } } }, "tests": [ { "description": "valid when property is specified", "data": {"foo": 13}, "valid": true }, { "description": "still valid when the invalid default is used", "data": {}, "valid": true } ] }, { "description": "invalid string value for default", "schema": { "properties": { "bar": { "type": "string", "minLength": 4, "default": "bad" } } }, "tests": [ { "description": "valid when property is specified", "data": {"bar": "good"}, "valid": true }, { "description": "still valid when the invalid default is used", "data": {}, "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/enum.json0000644000000000000000000000366715031566105027014 0ustar rootroot[ { "description": "simple enum validation", "schema": {"enum": [1, 2, 3]}, "tests": [ { "description": "one of the enum is valid", "data": 1, "valid": true }, { "description": "something else is invalid", "data": 4, "valid": false } ] }, { "description": "heterogeneous enum validation", "schema": {"enum": [6, "foo", [], true, {"foo": 12}]}, "tests": [ { "description": "one of the enum is valid", "data": [], "valid": true }, { "description": "something else is invalid", "data": null, "valid": false }, { "description": "objects are deep compared", "data": {"foo": false}, "valid": false } ] }, { "description": "enums in properties", "schema": { "type":"object", "properties": { "foo": {"enum":["foo"]}, "bar": {"enum":["bar"]} }, "required": ["bar"] }, "tests": [ { "description": "both properties are valid", "data": {"foo":"foo", "bar":"bar"}, "valid": true }, { "description": "missing optional property is valid", "data": {"bar":"bar"}, "valid": true }, { "description": "missing required property is invalid", "data": {"foo":"foo"}, "valid": false }, { "description": "missing all properties is invalid", "data": {}, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/refRemote.json0000644000000000000000000000365115031566105027771 0ustar rootroot[ { "description": "remote ref", "schema": {"$ref": "http://localhost:1234/integer.json"}, "tests": [ { "description": "remote ref valid", "data": 1, "valid": true }, { "description": "remote ref invalid", "data": "a", "valid": false } ] }, { "description": "fragment within remote ref", "schema": {"$ref": "http://localhost:1234/subSchemas.json#/integer"}, "tests": [ { "description": "remote fragment valid", "data": 1, "valid": true }, { "description": "remote fragment invalid", "data": "a", "valid": false } ] }, { "description": "ref within remote ref", "schema": { "$ref": "http://localhost:1234/subSchemas.json#/refToInteger" }, "tests": [ { "description": "ref within ref valid", "data": 1, "valid": true }, { "description": "ref within ref invalid", "data": "a", "valid": false } ] }, { "description": "change resolution scope", "schema": { "id": "http://localhost:1234/", "items": { "id": "folder/", "items": {"$ref": "folderInteger.json"} } }, "tests": [ { "description": "changed scope ref valid", "data": [[1]], "valid": true }, { "description": "changed scope ref invalid", "data": [["a"]], "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/maximum.json0000644000000000000000000000204715031566105027514 0ustar rootroot[ { "description": "maximum validation", "schema": {"maximum": 3.0}, "tests": [ { "description": "below the maximum is valid", "data": 2.6, "valid": true }, { "description": "above the maximum is invalid", "data": 3.5, "valid": false }, { "description": "ignores non-numbers", "data": "x", "valid": true } ] }, { "description": "exclusiveMaximum validation", "schema": { "maximum": 3.0, "exclusiveMaximum": true }, "tests": [ { "description": "below the maximum is still valid", "data": 2.2, "valid": true }, { "description": "boundary point is invalid", "data": 3.0, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/minItems.json0000644000000000000000000000126515031566105027625 0ustar rootroot[ { "description": "minItems validation", "schema": {"minItems": 1}, "tests": [ { "description": "longer is valid", "data": [1, 2], "valid": true }, { "description": "exact length is valid", "data": [1], "valid": true }, { "description": "too short is invalid", "data": [], "valid": false }, { "description": "ignores non-arrays", "data": "", "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/allOf.json0000644000000000000000000000572115031566105027076 0ustar rootroot[ { "description": "allOf", "schema": { "allOf": [ { "properties": { "bar": {"type": "integer"} }, "required": ["bar"] }, { "properties": { "foo": {"type": "string"} }, "required": ["foo"] } ] }, "tests": [ { "description": "allOf", "data": {"foo": "baz", "bar": 2}, "valid": true }, { "description": "mismatch second", "data": {"foo": "baz"}, "valid": false }, { "description": "mismatch first", "data": {"bar": 2}, "valid": false }, { "description": "wrong type", "data": {"foo": "baz", "bar": "quux"}, "valid": false } ] }, { "description": "allOf with base schema", "schema": { "properties": {"bar": {"type": "integer"}}, "required": ["bar"], "allOf" : [ { "properties": { "foo": {"type": "string"} }, "required": ["foo"] }, { "properties": { "baz": {"type": "null"} }, "required": ["baz"] } ] }, "tests": [ { "description": "valid", "data": {"foo": "quux", "bar": 2, "baz": null}, "valid": true }, { "description": "mismatch base schema", "data": {"foo": "quux", "baz": null}, "valid": false }, { "description": "mismatch first allOf", "data": {"bar": 2, "baz": null}, "valid": false }, { "description": "mismatch second allOf", "data": {"foo": "quux", "bar": 2}, "valid": false }, { "description": "mismatch both", "data": {"bar": 2}, "valid": false } ] }, { "description": "allOf simple types", "schema": { "allOf": [ {"maximum": 30}, {"minimum": 20} ] }, "tests": [ { "description": "valid", "data": 25, "valid": true }, { "description": "mismatch one", "data": 35, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/dependencies.json0000644000000000000000000000610315031566105030462 0ustar rootroot[ { "description": "dependencies", "schema": { "dependencies": {"bar": ["foo"]} }, "tests": [ { "description": "neither", "data": {}, "valid": true }, { "description": "nondependant", "data": {"foo": 1}, "valid": true }, { "description": "with dependency", "data": {"foo": 1, "bar": 2}, "valid": true }, { "description": "missing dependency", "data": {"bar": 2}, "valid": false }, { "description": "ignores non-objects", "data": "foo", "valid": true } ] }, { "description": "multiple dependencies", "schema": { "dependencies": {"quux": ["foo", "bar"]} }, "tests": [ { "description": "neither", "data": {}, "valid": true }, { "description": "nondependants", "data": {"foo": 1, "bar": 2}, "valid": true }, { "description": "with dependencies", "data": {"foo": 1, "bar": 2, "quux": 3}, "valid": true }, { "description": "missing dependency", "data": {"foo": 1, "quux": 2}, "valid": false }, { "description": "missing other dependency", "data": {"bar": 1, "quux": 2}, "valid": false }, { "description": "missing both dependencies", "data": {"quux": 1}, "valid": false } ] }, { "description": "multiple dependencies subschema", "schema": { "dependencies": { "bar": { "properties": { "foo": {"type": "integer"}, "bar": {"type": "integer"} } } } }, "tests": [ { "description": "valid", "data": {"foo": 1, "bar": 2}, "valid": true }, { "description": "no dependency", "data": {"foo": "quux"}, "valid": true }, { "description": "wrong type", "data": {"foo": "quux", "bar": 2}, "valid": false }, { "description": "wrong type other", "data": {"foo": 2, "bar": "quux"}, "valid": false }, { "description": "wrong type both", "data": {"foo": "quux", "bar": "quux"}, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/required.json0000644000000000000000000000163315031566105027657 0ustar rootroot[ { "description": "required validation", "schema": { "properties": { "foo": {}, "bar": {} }, "required": ["foo"] }, "tests": [ { "description": "present required property is valid", "data": {"foo": 1}, "valid": true }, { "description": "non-present required property is invalid", "data": {"bar": 1}, "valid": false } ] }, { "description": "required default validation", "schema": { "properties": { "foo": {} } }, "tests": [ { "description": "not required by default", "data": {}, "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/not.json0000644000000000000000000000433215031566105026636 0ustar rootroot[ { "description": "not", "schema": { "not": {"type": "integer"} }, "tests": [ { "description": "allowed", "data": "foo", "valid": true }, { "description": "disallowed", "data": 1, "valid": false } ] }, { "description": "not multiple types", "schema": { "not": {"type": ["integer", "boolean"]} }, "tests": [ { "description": "valid", "data": "foo", "valid": true }, { "description": "mismatch", "data": 1, "valid": false }, { "description": "other mismatch", "data": true, "valid": false } ] }, { "description": "not more complex schema", "schema": { "not": { "type": "object", "properties": { "foo": { "type": "string" } } } }, "tests": [ { "description": "match", "data": 1, "valid": true }, { "description": "other match", "data": {"foo": 1}, "valid": true }, { "description": "mismatch", "data": {"foo": "bar"}, "valid": false } ] }, { "description": "forbidden property", "schema": { "properties": { "foo": { "not": {} } } }, "tests": [ { "description": "property present", "data": {"foo": 1, "bar": 2}, "valid": false }, { "description": "property absent", "data": {"bar": 1, "baz": 2}, "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/maxProperties.json0000644000000000000000000000136715031566105030705 0ustar rootroot[ { "description": "maxProperties validation", "schema": {"maxProperties": 2}, "tests": [ { "description": "shorter is valid", "data": {"foo": 1}, "valid": true }, { "description": "exact length is valid", "data": {"foo": 1, "bar": 2}, "valid": true }, { "description": "too long is invalid", "data": {"foo": 1, "bar": 2, "baz": 3}, "valid": false }, { "description": "ignores non-objects", "data": "foobar", "valid": true } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/minimum.json0000644000000000000000000000204715031566105027512 0ustar rootroot[ { "description": "minimum validation", "schema": {"minimum": 1.1}, "tests": [ { "description": "above the minimum is valid", "data": 2.6, "valid": true }, { "description": "below the minimum is invalid", "data": 0.6, "valid": false }, { "description": "ignores non-numbers", "data": "x", "valid": true } ] }, { "description": "exclusiveMinimum validation", "schema": { "minimum": 1.1, "exclusiveMinimum": true }, "tests": [ { "description": "above the minimum is still valid", "data": 1.2, "valid": true }, { "description": "boundary point is invalid", "data": 1.1, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/properties.json0000644000000000000000000000550115031566105030231 0ustar rootroot[ { "description": "object properties validation", "schema": { "properties": { "foo": {"type": "integer"}, "bar": {"type": "string"} } }, "tests": [ { "description": "both properties present and valid is valid", "data": {"foo": 1, "bar": "baz"}, "valid": true }, { "description": "one property invalid is invalid", "data": {"foo": 1, "bar": {}}, "valid": false }, { "description": "both properties invalid is invalid", "data": {"foo": [], "bar": {}}, "valid": false }, { "description": "doesn't invalidate other properties", "data": {"quux": []}, "valid": true }, { "description": "ignores non-objects", "data": [], "valid": true } ] }, { "description": "properties, patternProperties, additionalProperties interaction", "schema": { "properties": { "foo": {"type": "array", "maxItems": 3}, "bar": {"type": "array"} }, "patternProperties": {"f.o": {"minItems": 2}}, "additionalProperties": {"type": "integer"} }, "tests": [ { "description": "property validates property", "data": {"foo": [1, 2]}, "valid": true }, { "description": "property invalidates property", "data": {"foo": [1, 2, 3, 4]}, "valid": false }, { "description": "patternProperty invalidates property", "data": {"foo": []}, "valid": false }, { "description": "patternProperty validates nonproperty", "data": {"fxo": [1, 2]}, "valid": true }, { "description": "patternProperty invalidates nonproperty", "data": {"fxo": []}, "valid": false }, { "description": "additionalProperty ignores property", "data": {"bar": []}, "valid": true }, { "description": "additionalProperty validates others", "data": {"quux": 3}, "valid": true }, { "description": "additionalProperty invalidates others", "data": {"quux": "foo"}, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/optional/0000755000000000000000000000000015031566105026766 5ustar rootroot././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/optional/zeroTerminatedFloats.jsonasymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/optional/zeroTerminatedFloat0000644000000000000000000000060015031566105032667 0ustar rootroot[ { "description": "some languages do not distinguish between different types of numeric value", "schema": { "type": "integer" }, "tests": [ { "description": "a float is not an integer even without fractional part", "data": 1.0, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/optional/format.json0000644000000000000000000001100015031566105031141 0ustar rootroot[ { "description": "validation of date-time strings", "schema": {"format": "date-time"}, "tests": [ { "description": "a valid date-time string", "data": "1963-06-19T08:30:06.283185Z", "valid": true }, { "description": "an invalid date-time string", "data": "06/19/1963 08:30:06 PST", "valid": false }, { "description": "only RFC3339 not all of ISO 8601 are valid", "data": "2013-350T01:01:01", "valid": false } ] }, { "description": "validation of URIs", "schema": {"format": "uri"}, "tests": [ { "description": "a valid URI", "data": "http://foo.bar/?baz=qux#quux", "valid": true }, { "description": "a valid protocol-relative URI", "data": "//foo.bar/?baz=qux#quux", "valid": true }, { "description": "an invalid URI", "data": "\\\\WINDOWS\\fileshare", "valid": false }, { "description": "an invalid URI though valid URI reference", "data": "abc", "valid": false } ] }, { "description": "validation of e-mail addresses", "schema": {"format": "email"}, "tests": [ { "description": "a valid e-mail address", "data": "joe.bloggs@example.com", "valid": true }, { "description": "an invalid e-mail address", "data": "2962", "valid": false } ] }, { "description": "validation of IP addresses", "schema": {"format": "ipv4"}, "tests": [ { "description": "a valid IP address", "data": "192.168.0.1", "valid": true }, { "description": "an IP address with too many components", "data": "127.0.0.0.1", "valid": false }, { "description": "an IP address with out-of-range values", "data": "256.256.256.256", "valid": false }, { "description": "an IP address without 4 components", "data": "127.0", "valid": false }, { "description": "an IP address as an integer", "data": "0x7f000001", "valid": false } ] }, { "description": "validation of IPv6 addresses", "schema": {"format": "ipv6"}, "tests": [ { "description": "a valid IPv6 address", "data": "::1", "valid": true }, { "description": "an IPv6 address with out-of-range values", "data": "12345::", "valid": false }, { "description": "an IPv6 address with too many components", "data": "1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1", "valid": false }, { "description": "an IPv6 address containing illegal characters", "data": "::laptop", "valid": false } ] }, { "description": "validation of host names", "schema": {"format": "hostname"}, "tests": [ { "description": "a valid host name", "data": "www.example.com", "valid": true }, { "description": "a host name starting with an illegal character", "data": "-a-host-name-that-starts-with--", "valid": false }, { "description": "a host name containing illegal characters", "data": "not_a_valid_host_name", "valid": false }, { "description": "a host name with a component too long", "data": "a-vvvvvvvvvvvvvvvveeeeeeeeeeeeeeeerrrrrrrrrrrrrrrryyyyyyyyyyyyyyyy-long-host-name-component", "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/optional/bignum.json0000644000000000000000000000600315031566105031141 0ustar rootroot[ { "description": "integer", "schema": {"type": "integer"}, "tests": [ { "description": "a bignum is an integer", "data": 12345678910111213141516171819202122232425262728293031, "valid": true } ] }, { "description": "number", "schema": {"type": "number"}, "tests": [ { "description": "a bignum is a number", "data": 98249283749234923498293171823948729348710298301928331, "valid": true } ] }, { "description": "integer", "schema": {"type": "integer"}, "tests": [ { "description": "a negative bignum is an integer", "data": -12345678910111213141516171819202122232425262728293031, "valid": true } ] }, { "description": "number", "schema": {"type": "number"}, "tests": [ { "description": "a negative bignum is a number", "data": -98249283749234923498293171823948729348710298301928331, "valid": true } ] }, { "description": "string", "schema": {"type": "string"}, "tests": [ { "description": "a bignum is not a string", "data": 98249283749234923498293171823948729348710298301928331, "valid": false } ] }, { "description": "integer comparison", "schema": {"maximum": 18446744073709551615}, "tests": [ { "description": "comparison works for high numbers", "data": 18446744073709551600, "valid": true } ] }, { "description": "float comparison with high precision", "schema": { "maximum": 972783798187987123879878123.18878137, "exclusiveMaximum": true }, "tests": [ { "description": "comparison works for high numbers", "data": 972783798187987123879878123.188781371, "valid": false } ] }, { "description": "integer comparison", "schema": {"minimum": -18446744073709551615}, "tests": [ { "description": "comparison works for very negative numbers", "data": -18446744073709551600, "valid": true } ] }, { "description": "float comparison with high precision on negative numbers", "schema": { "minimum": -972783798187987123879878123.18878137, "exclusiveMinimum": true }, "tests": [ { "description": "comparison works for very negative numbers", "data": -972783798187987123879878123.188781371, "valid": false } ] } ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/jsonschema/LICENSE0000644000000000000000000000204115031566105023615 0ustar rootrootCopyright (c) 2012 Julian Berman Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. asymptote-3.05/LspCpp/third_party/rapidjson/bin/encodings/0000755000000000000000000000000015031566105022432 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/encodings/utf16lebom.json0000644000000000000000000000056215031566105025314 0ustar rootrootÿþ{ "en":"I can eat glass and it doesn't hurt me.", "zh-Hant":"bý€T N»sƒt € N·P«ŽÔš0", "zh-Hans":"bý€T N»sƒt € N$O«ŽSO0", "ja":"Áyo0¬0é0¹0’0ߘy0‰0Œ0~0Y00]0Œ0o0Áy’0·Pd0Q0~0[0“00", "ko":"˜°”² Ǭ¹|¹ 9ºDÇ  ˆÇ´Å”Æ. ø­˜·Ä³ DÅÕÀÉ JÅDÅ”Æ" }asymptote-3.05/LspCpp/third_party/rapidjson/bin/encodings/utf8.json0000644000000000000000000000047415031566105024220 0ustar rootroot{ "en":"I can eat glass and it doesn't hurt me.", "zh-Hant":"我能åžä¸‹çŽ»ç’ƒè€Œä¸å‚·èº«é«”。", "zh-Hans":"我能åžä¸‹çŽ»ç’ƒè€Œä¸ä¼¤èº«ä½“。", "ja":"ç§ã¯ã‚¬ãƒ©ã‚¹ã‚’食ã¹ã‚‰ã‚Œã¾ã™ã€‚ãれã¯ç§ã‚’å‚·ã¤ã‘ã¾ã›ã‚“。", "ko":"나는 유리를 ë¨¹ì„ ìˆ˜ 있어요. ê·¸ëž˜ë„ ì•„í”„ì§€ 않아요" }asymptote-3.05/LspCpp/third_party/rapidjson/bin/encodings/utf8bom.json0000644000000000000000000000047715031566105024721 0ustar rootroot{ "en":"I can eat glass and it doesn't hurt me.", "zh-Hant":"我能åžä¸‹çŽ»ç’ƒè€Œä¸å‚·èº«é«”。", "zh-Hans":"我能åžä¸‹çŽ»ç’ƒè€Œä¸ä¼¤èº«ä½“。", "ja":"ç§ã¯ã‚¬ãƒ©ã‚¹ã‚’食ã¹ã‚‰ã‚Œã¾ã™ã€‚ãれã¯ç§ã‚’å‚·ã¤ã‘ã¾ã›ã‚“。", "ko":"나는 유리를 ë¨¹ì„ ìˆ˜ 있어요. ê·¸ëž˜ë„ ì•„í”„ì§€ 않아요" }asymptote-3.05/LspCpp/third_party/rapidjson/bin/encodings/utf16le.json0000644000000000000000000000056015031566105024614 0ustar rootroot{ "en":"I can eat glass and it doesn't hurt me.", "zh-Hant":"bý€T N»sƒt € N·P«ŽÔš0", "zh-Hans":"bý€T N»sƒt € N$O«ŽSO0", "ja":"Áyo0¬0é0¹0’0ߘy0‰0Œ0~0Y00]0Œ0o0Áy’0·Pd0Q0~0[0“00", "ko":"˜°”² Ǭ¹|¹ 9ºDÇ  ˆÇ´Å”Æ. ø­˜·Ä³ DÅÕÀÉ JÅDÅ”Æ" }asymptote-3.05/LspCpp/third_party/rapidjson/bin/encodings/utf16be.json0000644000000000000000000000056015031566105024602 0ustar rootroot{ "en":"I can eat glass and it doesn't hurt me.", "zh-Hant":"b€ýTN s»tƒ€ N P·Ž«šÔ0", "zh-Hans":"b€ýTN s»tƒ€ N O$Ž«OS0", "ja":"yÁ0o0¬0é0¹0’˜ß0y0‰0Œ0~0Y00]0Œ0oyÁ0’P·0d0Q0~0[0“0", "ko":"°˜²” Ç ¹¬¹| º9ÇD  LjŴƔ. ­ø·˜³Ä ÅDÕÉÀ ÅJÅDÆ”" }asymptote-3.05/LspCpp/third_party/rapidjson/bin/encodings/utf32lebom.json0000644000000000000000000000134415031566105025311 0ustar rootrootÿþ{ "en":"I can eat glass and it doesn't hurt me.", "zh-Hant":"bý€T N»sƒt € N·P«ŽÔš0", "zh-Hans":"bý€T N»sƒt € N$O«ŽSO0", "ja":"Áyo0¬0é0¹0’0ߘy0‰0Œ0~0Y00]0Œ0o0Áy’0·Pd0Q0~0[0“00", "ko":"˜°”² Ǭ¹|¹ 9ºDÇ  ˆÇ´Å”Æ. ø­˜·Ä³ DÅÕÀÉ JÅDÅ”Æ" }asymptote-3.05/LspCpp/third_party/rapidjson/bin/encodings/utf32le.json0000644000000000000000000000134015031566105024607 0ustar rootroot{ "en":"I can eat glass and it doesn't hurt me.", "zh-Hant":"bý€T N»sƒt € N·P«ŽÔš0", "zh-Hans":"bý€T N»sƒt € N$O«ŽSO0", "ja":"Áyo0¬0é0¹0’0ߘy0‰0Œ0~0Y00]0Œ0o0Áy’0·Pd0Q0~0[0“00", "ko":"˜°”² Ǭ¹|¹ 9ºDÇ  ˆÇ´Å”Æ. ø­˜·Ä³ DÅÕÀÉ JÅDÅ”Æ" }asymptote-3.05/LspCpp/third_party/rapidjson/bin/encodings/utf32bebom.json0000644000000000000000000000134415031566105025277 0ustar rootrootþÿ{ "en":"I can eat glass and it doesn't hurt me.", "zh-Hant":"b€ýTN s»tƒ€ N P·Ž«šÔ0", "zh-Hans":"b€ýTN s»tƒ€ N O$Ž«OS0", "ja":"yÁ0o0¬0é0¹0’˜ß0y0‰0Œ0~0Y00]0Œ0oyÁ0’P·0d0Q0~0[0“0", "ko":"°˜²” Ç ¹¬¹| º9ÇD  LjŴƔ. ­ø·˜³Ä ÅDÕÉÀ ÅJÅDÆ”" }asymptote-3.05/LspCpp/third_party/rapidjson/bin/encodings/utf16bebom.json0000644000000000000000000000056215031566105025302 0ustar rootrootþÿ{ "en":"I can eat glass and it doesn't hurt me.", "zh-Hant":"b€ýTN s»tƒ€ N P·Ž«šÔ0", "zh-Hans":"b€ýTN s»tƒ€ N O$Ž«OS0", "ja":"yÁ0o0¬0é0¹0’˜ß0y0‰0Œ0~0Y00]0Œ0oyÁ0’P·0d0Q0~0[0“0", "ko":"°˜²” Ç ¹¬¹| º9ÇD  LjŴƔ. ­ø·˜³Ä ÅDÕÉÀ ÅJÅDÆ”" }asymptote-3.05/LspCpp/third_party/rapidjson/bin/encodings/utf32be.json0000644000000000000000000000134015031566105024575 0ustar rootroot{ "en":"I can eat glass and it doesn't hurt me.", "zh-Hant":"b€ýTN s»tƒ€ N P·Ž«šÔ0", "zh-Hans":"b€ýTN s»tƒ€ N O$Ž«OS0", "ja":"yÁ0o0¬0é0¹0’˜ß0y0‰0Œ0~0Y00]0Œ0oyÁ0’P·0d0Q0~0[0“0", "ko":"°˜²” Ç ¹¬¹| º9ÇD  LjŴƔ. ­ø·˜³Ä ÅDÕÉÀ ÅJÅDÆ”" }asymptote-3.05/LspCpp/third_party/rapidjson/bin/types/0000755000000000000000000000000015031566105021625 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/bin/types/integers.json0000644000000000000000000000211215031566105024334 0ustar rootroot[ 8125686, 8958709, 5976222, 1889524, 7968493, 1357486, 118415, 7081097, 4635968, 7555332, 2270233, 3428352, 8699968, 2087333, 7861337, 7554440, 2017031, 7981692, 6060687, 1877715, 3297474, 8373177, 6158629, 7853641, 3004441, 9650406, 2695251, 1180761, 4988426, 6043805, 8063373, 6103218, 2848339, 8188690, 9235573, 5949816, 6116081, 6471138, 3354531, 4787414, 9660600, 942529, 7278535, 7967399, 554292, 1436493, 267319, 2606657, 7900601, 4276634, 7996757, 8544466, 7266469, 3301373, 4005350, 6437652, 7717672, 7126292, 8588394, 2127902, 7410190, 1517806, 4583602, 3123440, 7747613, 5029464, 9834390, 3087227, 4913822, 7550487, 4518144, 5862588, 1778599, 9493290, 5588455, 3638706, 7394293, 4294719, 3837830, 6381878, 7175866, 8575492, 1415229, 1453733, 6972404, 9782571, 4234063, 7117418, 7293130, 8057071, 9345285, 7626648, 3358911, 4574537, 9371826, 7627107, 6154093, 5392367, 5398105, 6956377 ]asymptote-3.05/LspCpp/third_party/rapidjson/bin/types/mixed.json0000644000000000000000000003544615031566105023642 0ustar rootroot[ { "favoriteFruit": "banana", "greeting": "Hello, Kim! You have 10 unread messages.", "friends": [ { "name": "Higgins Rodriquez", "id": 0 }, { "name": "James Floyd", "id": 1 }, { "name": "Gay Stewart", "id": 2 } ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "tags": [ "pariatur", "ad", "eiusmod", "sit", "et", "velit", "culpa" ], "longitude": -57.919246, "latitude": -36.022812, "registered": "Friday, March 21, 2014 9:13 PM", "about": "Laborum nulla aliquip ullamco proident excepteur est officia ipsum. Eiusmod exercitation minim ex do labore reprehenderit aliqua minim qui excepteur reprehenderit cupidatat. Sint enim exercitation duis id consequat nisi enim magna. Commodo aliqua id ipsum sit magna enim. Veniam officia in labore fugiat veniam ea laboris ex veniam duis.\r\n", "address": "323 Pulaski Street, Ronco, North Carolina, 7701", "phone": "+1 (919) 438-2678", "email": "kim.griffith@cipromox.biz", "company": "CIPROMOX", "name": { "last": "Griffith", "first": "Kim" }, "eyeColor": "green", "age": 26, "picture": "http://placehold.it/32x32", "balance": "$1,283.55", "isActive": false, "guid": "10ab0392-c5e2-48a3-9473-aa725bad892d", "index": 0, "_id": "551b91198238a0bcf9a41133" }, { "favoriteFruit": "banana", "greeting": "Hello, Skinner! You have 9 unread messages.", "friends": [ { "name": "Rhonda Justice", "id": 0 }, { "name": "Audra Castaneda", "id": 1 }, { "name": "Vicky Chavez", "id": 2 } ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "tags": [ "dolore", "enim", "sit", "non", "exercitation", "fugiat", "adipisicing" ], "longitude": -60.291407, "latitude": -84.619318, "registered": "Friday, February 7, 2014 3:17 AM", "about": "Consectetur eiusmod laboris dolore est ullamco nulla in velit quis esse Lorem. Amet aliqua sunt aute occaecat veniam officia in duis proident aliqua cupidatat mollit. Sint eu qui anim duis ut anim duis eu cillum. Cillum nostrud adipisicing tempor Lorem commodo sit in ad qui non et irure qui. Labore eu aliquip id duis eiusmod veniam.\r\n", "address": "347 Autumn Avenue, Fidelis, Puerto Rico, 543", "phone": "+1 (889) 457-2319", "email": "skinner.maddox@moltonic.co.uk", "company": "MOLTONIC", "name": { "last": "Maddox", "first": "Skinner" }, "eyeColor": "green", "age": 22, "picture": "http://placehold.it/32x32", "balance": "$3,553.10", "isActive": false, "guid": "cfbc2fb6-2641-4388-b06d-ec0212cfac1e", "index": 1, "_id": "551b91197e0abe92d6642700" }, { "favoriteFruit": "strawberry", "greeting": "Hello, Reynolds! You have 5 unread messages.", "friends": [ { "name": "Brady Valdez", "id": 0 }, { "name": "Boyer Golden", "id": 1 }, { "name": "Gladys Knapp", "id": 2 } ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "tags": [ "commodo", "eiusmod", "cupidatat", "et", "occaecat", "proident", "Lorem" ], "longitude": 140.866287, "latitude": 1.401032, "registered": "Monday, October 20, 2014 8:01 AM", "about": "Deserunt elit consequat ea dolor pariatur aute consectetur et nulla ipsum ad. Laboris occaecat ipsum ad duis et esse ea ut voluptate. Ex magna consequat pariatur amet. Quis excepteur non mollit dolore cillum dolor ex esse veniam esse deserunt non occaecat veniam. Sit amet proident proident amet. Nisi est id ut ut adipisicing esse fugiat non dolor aute.\r\n", "address": "872 Montague Terrace, Haena, Montana, 3106", "phone": "+1 (974) 410-2655", "email": "reynolds.sanford@combot.biz", "company": "COMBOT", "name": { "last": "Sanford", "first": "Reynolds" }, "eyeColor": "green", "age": 21, "picture": "http://placehold.it/32x32", "balance": "$3,664.47", "isActive": true, "guid": "f9933a9c-c41a-412f-a18d-e727c569870b", "index": 2, "_id": "551b91197f170b65413a06e3" }, { "favoriteFruit": "banana", "greeting": "Hello, Neva! You have 7 unread messages.", "friends": [ { "name": "Clara Cotton", "id": 0 }, { "name": "Ray Gates", "id": 1 }, { "name": "Jacobs Reese", "id": 2 } ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "tags": [ "magna", "labore", "incididunt", "velit", "ea", "et", "eiusmod" ], "longitude": -133.058479, "latitude": 87.803677, "registered": "Friday, May 9, 2014 5:41 PM", "about": "Do duis occaecat ut officia occaecat officia nostrud reprehenderit ex excepteur aute anim in reprehenderit. Cupidatat nulla eiusmod nulla non minim veniam aute nulla deserunt adipisicing consectetur veniam. Sit consequat ex laboris aliqua labore consectetur tempor proident consequat est. Fugiat quis esse culpa aliquip. Excepteur laborum aliquip sunt eu cupidatat magna eiusmod amet nisi labore aliquip. Ut consectetur esse aliquip exercitation nulla ex occaecat elit do ex eiusmod deserunt. Ex eu voluptate minim deserunt fugiat minim est occaecat ad Lorem nisi.\r\n", "address": "480 Eagle Street, Fostoria, Oklahoma, 2614", "phone": "+1 (983) 439-3000", "email": "neva.barker@pushcart.us", "company": "PUSHCART", "name": { "last": "Barker", "first": "Neva" }, "eyeColor": "brown", "age": 36, "picture": "http://placehold.it/32x32", "balance": "$3,182.24", "isActive": true, "guid": "52489849-78e1-4b27-8b86-e3e5ab2b7dc8", "index": 3, "_id": "551b9119a13061c083c878d5" }, { "favoriteFruit": "banana", "greeting": "Hello, Rodgers! You have 6 unread messages.", "friends": [ { "name": "Marguerite Conway", "id": 0 }, { "name": "Margarita Cunningham", "id": 1 }, { "name": "Carmela Gallagher", "id": 2 } ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "tags": [ "ipsum", "magna", "amet", "elit", "sit", "occaecat", "elit" ], "longitude": -125.436981, "latitude": 19.868524, "registered": "Tuesday, July 8, 2014 8:09 PM", "about": "In cillum esse tempor do magna id ad excepteur ex nostrud mollit deserunt aliqua. Minim aliqua commodo commodo consectetur exercitation nulla nisi dolore aliqua in. Incididunt deserunt mollit nostrud excepteur. Ipsum fugiat anim deserunt Lorem aliquip nisi consequat eu minim in ex duis.\r\n", "address": "989 Varanda Place, Duryea, Palau, 3972", "phone": "+1 (968) 578-2974", "email": "rodgers.conner@frenex.net", "company": "FRENEX", "name": { "last": "Conner", "first": "Rodgers" }, "eyeColor": "blue", "age": 23, "picture": "http://placehold.it/32x32", "balance": "$1,665.17", "isActive": true, "guid": "ed3b2374-5afe-4fca-9325-8a7bbc9f81a0", "index": 4, "_id": "551b91197bcedb1b56a241ce" }, { "favoriteFruit": "strawberry", "greeting": "Hello, Mari! You have 10 unread messages.", "friends": [ { "name": "Irwin Boyd", "id": 0 }, { "name": "Dejesus Flores", "id": 1 }, { "name": "Lane Mcmahon", "id": 2 } ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "tags": [ "esse", "aliquip", "excepteur", "dolor", "ex", "commodo", "anim" ], "longitude": -17.038176, "latitude": 17.154663, "registered": "Sunday, April 6, 2014 4:46 AM", "about": "Excepteur veniam occaecat sint nulla magna in in officia elit. Eiusmod qui dolor fugiat tempor in minim esse officia minim consequat. Lorem ullamco labore proident ipsum id pariatur fugiat consectetur anim cupidatat qui proident non ipsum.\r\n", "address": "563 Hendrickson Street, Westwood, South Dakota, 4959", "phone": "+1 (980) 434-3976", "email": "mari.fleming@beadzza.org", "company": "BEADZZA", "name": { "last": "Fleming", "first": "Mari" }, "eyeColor": "blue", "age": 21, "picture": "http://placehold.it/32x32", "balance": "$1,948.04", "isActive": true, "guid": "6bd02166-3b1f-4ed8-84c9-ed96cbf12abc", "index": 5, "_id": "551b9119b359ff6d24846f77" }, { "favoriteFruit": "strawberry", "greeting": "Hello, Maxine! You have 7 unread messages.", "friends": [ { "name": "Sullivan Stark", "id": 0 }, { "name": "Underwood Mclaughlin", "id": 1 }, { "name": "Kristy Carlson", "id": 2 } ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "tags": [ "commodo", "ipsum", "quis", "non", "est", "mollit", "exercitation" ], "longitude": -105.40635, "latitude": 37.197993, "registered": "Tuesday, January 20, 2015 12:30 AM", "about": "Proident ullamco Lorem est consequat consectetur non eiusmod esse nostrud pariatur eiusmod enim exercitation eiusmod. Consequat duis elit elit minim ullamco et dolor eu minim do tempor esse consequat excepteur. Mollit dolor do voluptate nostrud quis anim cillum velit tempor eiusmod adipisicing tempor do culpa. Eu magna dolor sit amet nisi do laborum dolore nisi. Deserunt ipsum et deserunt non nisi.\r\n", "address": "252 Boulevard Court, Brenton, Tennessee, 9444", "phone": "+1 (950) 466-3377", "email": "maxine.moreno@zentia.tv", "company": "ZENTIA", "name": { "last": "Moreno", "first": "Maxine" }, "eyeColor": "brown", "age": 24, "picture": "http://placehold.it/32x32", "balance": "$1,200.24", "isActive": false, "guid": "ce307a37-ca1f-43f5-b637-dca2605712be", "index": 6, "_id": "551b91195a6164b2e35f6dc8" }, { "favoriteFruit": "strawberry", "greeting": "Hello, Helga! You have 5 unread messages.", "friends": [ { "name": "Alicia Vance", "id": 0 }, { "name": "Vinson Phelps", "id": 1 }, { "name": "Francisca Kelley", "id": 2 } ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "tags": [ "nostrud", "eiusmod", "dolore", "officia", "sint", "non", "qui" ], "longitude": -7.275151, "latitude": 75.54202, "registered": "Wednesday, October 1, 2014 6:35 PM", "about": "Quis duis ullamco velit qui. Consectetur non adipisicing id magna anim. Deserunt est officia qui esse. Et do pariatur incididunt anim ad mollit non. Et eiusmod sunt fugiat elit mollit ad excepteur anim nisi laboris eiusmod aliquip aliquip.\r\n", "address": "981 Bush Street, Beaulieu, Vermont, 3775", "phone": "+1 (956) 506-3807", "email": "helga.burch@synkgen.name", "company": "SYNKGEN", "name": { "last": "Burch", "first": "Helga" }, "eyeColor": "blue", "age": 22, "picture": "http://placehold.it/32x32", "balance": "$3,827.89", "isActive": false, "guid": "ff5dfea0-1052-4ef2-8b66-4dc1aad0a4fb", "index": 7, "_id": "551b911946be8358ae40e90e" }, { "favoriteFruit": "banana", "greeting": "Hello, Shaw! You have 5 unread messages.", "friends": [ { "name": "Christian Cardenas", "id": 0 }, { "name": "Cohen Pennington", "id": 1 }, { "name": "Mary Lindsay", "id": 2 } ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "tags": [ "occaecat", "ut", "occaecat", "magna", "exercitation", "incididunt", "irure" ], "longitude": -89.102972, "latitude": 89.489596, "registered": "Thursday, August 21, 2014 5:00 PM", "about": "Amet cupidatat quis velit aute Lorem consequat pariatur mollit deserunt et sint culpa excepteur duis. Enim proident duis qui ex tempor sunt nostrud occaecat. Officia sit veniam mollit eiusmod minim do aute eiusmod fugiat qui anim adipisicing in laboris. Do tempor reprehenderit sunt laborum esse irure dolor ad consectetur aute sit id ipsum. Commodo et voluptate anim consequat do. Minim laborum ad veniam ad minim incididunt excepteur excepteur aliqua.\r\n", "address": "237 Pierrepont Street, Herbster, New York, 3490", "phone": "+1 (976) 455-2880", "email": "shaw.zamora@shadease.me", "company": "SHADEASE", "name": { "last": "Zamora", "first": "Shaw" }, "eyeColor": "blue", "age": 38, "picture": "http://placehold.it/32x32", "balance": "$3,440.82", "isActive": false, "guid": "ac5fdb0e-e1fb-427e-881d-da461be0d1ca", "index": 8, "_id": "551b9119af0077bc28a2de25" }, { "favoriteFruit": "apple", "greeting": "Hello, Melissa! You have 5 unread messages.", "friends": [ { "name": "Marion Villarreal", "id": 0 }, { "name": "Kate Rose", "id": 1 }, { "name": "Hines Simon", "id": 2 } ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "tags": [ "amet", "veniam", "mollit", "ad", "cupidatat", "deserunt", "Lorem" ], "longitude": -52.735052, "latitude": 16.258838, "registered": "Wednesday, April 16, 2014 7:56 PM", "about": "Aute ut culpa eiusmod tempor duis dolor tempor incididunt. Nisi non proident excepteur eiusmod incididunt nisi minim irure sit. In veniam commodo deserunt proident reprehenderit et consectetur ullamco quis nulla cupidatat.\r\n", "address": "642 Halsey Street, Blandburg, Kansas, 6761", "phone": "+1 (941) 539-3851", "email": "melissa.vaughn@memora.io", "company": "MEMORA", "name": { "last": "Vaughn", "first": "Melissa" }, "eyeColor": "brown", "age": 24, "picture": "http://placehold.it/32x32", "balance": "$2,399.44", "isActive": true, "guid": "1769f022-a7f1-4a69-bf4c-f5a5ebeab2d1", "index": 9, "_id": "551b9119b607c09c7ffc3b8a" } ]asymptote-3.05/LspCpp/third_party/rapidjson/bin/types/guids.json0000644000000000000000000001015215031566105023632 0ustar rootroot[ "d35bf0d4-8d8f-4e17-a5c3-ad9bfd675266", "db402774-eeb6-463b-9986-c458c44d8b5a", "2a2e4101-b5f2-40b8-8750-e03f01661e60", "76787cfa-f4eb-4d62-aaad-e1d588d00ad5", "fd73894b-b500-4a7c-888c-06b5bd9cec65", "cce1862a-cf31-4ef2-9e23-f1d23b4e6163", "00a98bb0-2b6e-4368-8512-71c21aa87db7", "ab9a8d69-cec7-4550-bd35-3ed678e22782", "f18b48e1-5114-4fbe-9652-579e8d66950e", "4efe3baa-7ac5-4d6a-a839-6b9cfe825764", "b4aec119-5b0a-434c-b388-109816c482a5", "e0ef0cbb-127a-4a28-9831-5741b4295275", "d50286a5-cb7b-4c9e-be99-f214439bae8c", "a981094c-f1ac-42ed-a9fa-86404c7210ff", "2a34ee57-5815-4829-b77b-eeebaa8fe340", "a0530d44-48f8-4eff-b9ea-8810c4308351", "c6f91509-83e1-4ea1-9680-e667fbfd56ee", "cab11402-dcdd-4454-b190-6da124947395", "283d159c-2b18-4856-b4c7-5059252eaa15", "146157c6-72a8-4051-9991-cb6ea6743d81", "aef6f269-7306-4bd2-83f7-6d5605b5dc9a", "37fe6027-d638-4017-80a9-e7b0567b278e", "5003d731-33fb-4159-af61-d76348a44079", "e0e06979-5f80-4713-9fe0-8a4d60dc89f8", "7e85bdc3-0345-4cb6-9398-ccab06e79976", "f2ebf5af-6568-4ffe-a46d-403863fd4b66", "e0b5bb1c-b4dd-4535-9a9e-3c73f1167d46", "c852d20b-6bcb-4b12-bd57-308296c64c5a", "7ac3ae82-1818-49cd-a8a4-5ac77dfafd46", "138004a9-76e2-4ad7-bd42-e74dabdbb803", "ab25b5be-96be-45b0-b765-947b40ec36a6", "08404734-fd57-499e-a4cf-71e9ec782ede", "8dfdeb16-248b-4a21-bf89-2e22b11a4101", "a0e44ef0-3b09-41e8-ad5d-ed8e6a1a2a67", "a7981e49-188d-414a-9779-b1ad91e599d1", "329186c0-bf27-4208-baf7-c0a0a5a2d5b7", "cb5f3381-d33e-4b30-b1a9-f482623cad33", "15031262-ca73-4e3c-bd0a-fcf89bdf0caf", "6d7333d1-2e8c-4d78-bfde-5be47e70eb13", "acaa160c-670a-4e8f-ac45-49416e77d5f9", "228f87eb-cde4-4106-808b-2dbf3c7b6d2e", "2ff830a3-5445-4d8e-b161-bddd30666697", "f488bedd-ff6e-4108-b9a7-07f6da62f476", "2e12b846-0a34-478e-adf7-a438493803e6", "6686b8ef-7446-4d86-bd8c-df24119e3bfe", "e474a5c5-5793-4d41-b4ab-5423acc56ef1", "ac046573-e718-44dc-a0dc-9037eeaba6a9", "6b0e9099-cf53-4d5a-8a71-977528628fcf", "d51a3f22-0ff9-4087-ba9b-fcee2a2d8ade", "bdc01286-3511-4d22-bfb8-76d01203d366", "ca44eb84-17ff-4f27-8f1e-1bd25f4e8725", "4e9a8c2f-be0b-4913-92d2-c801b9a50d04", "7685d231-dadd-4041-9165-898397438ab7", "86f0bf26-d66a-44d8-99f5-d6768addae3b", "2ca1167c-72ba-45a0-aa42-faf033db0d0b", "199a1182-ea55-49ff-ba51-71c29cdd0aac", "be6a4dd2-c821-4aa0-8b83-d64d6644b5b2", "4c5f4781-7f80-4daa-9c20-76b183000514", "513b31bd-54fb-4d12-a427-42a7c13ff8e1", "8e211bcb-d76c-4012-83ad-74dd7d23b687", "44d5807e-0501-4f66-8779-e244d4fdca0a", "db8cd555-0563-4b7b-b00c-eada300a7065", "cb14d0c9-46cc-4797-bd3a-752b05629f07", "4f68b3ef-ac9b-47a0-b6d7-57f398a5c6a5", "77221aae-1bcf-471c-be45-7f31f733f9d6", "42a7cac8-9e80-4c45-8c71-511d863c98ea", "f9018d22-b82c-468c-bdb5-8864d5964801", "75f4e9b8-62a2-4f21-ad8a-e19eff0419bc", "9b7385c8-8653-4184-951c-b0ac1b36b42e", "571018aa-ffbf-4b42-a16d-07b57a7f5f0e", "35de4a2f-6bf1-45aa-b820-2a27ea833e44", "0b8edb20-3bb4-4cb4-b089-31957466dbab", "97da4778-9a7b-4140-a545-968148c81fb7", "969f326c-8f2a-47c5-b41c-d9c2f06c9b9d", "ae211037-8b53-4b17-bfc8-c06fc7774409", "12c5c3c4-0bd5-45d3-bc1d-d04a3c65d3e6", "ec02024f-ce43-4dd3-8169-a59f7baee043", "5b6afe77-ce48-47ca-90a0-25cd10ca5ffd", "2e3a61d4-6b8f-4d2f-ba86-878b4012efd8", "19a88a67-a5d3-4647-898f-1cde07bce040", "6db6f420-b5c8-48b9-bbb2-8864fe6fed65", "5a45dbde-7b53-4f6b-b864-e3b63be3708a", "c878321b-8a02-4239-9981-15760c2e7d15", "4e36687f-8bf6-4b12-b496-3a8e382d067e", "a59a63cd-43c0-4c6e-b208-6dbca86f8176", "303308c4-2e4a-45b5-8bf3-3e66e9ad05a1", "8b58fdf1-43a6-4c98-9547-6361b50791af", "a3563591-72ed-42b5-8e41-bac1d76d70cf", "38db8c78-3739-4f6e-8313-de4138082114", "86615bea-7e73-4daf-95da-ae6b9eee1bbb", "35d38e3e-076e-40dd-9aa8-05be2603bd59", "9f84c62d-b454-4ba3-8c19-a01878985cdc", "6721bbae-d765-4a06-8289-6fe46a1bf943", "0837796f-d0dd-4e50-9b7c-1983e6cc7c48", "021eb7d7-e869-49b9-80c3-9dd16ce2d981", "819c56f8-e040-475d-aad5-c6d5e98b20aa", "3a61ef02-735e-4229-937d-b3777a3f4e1f", "79dfab84-12e6-4ec8-bfc8-460ae71e4eca", "a106fabf-e149-476c-8053-b62388b6eb57", "9a3900a5-bfb4-4de0-baa5-253a8bd0b634" ]asymptote-3.05/LspCpp/third_party/rapidjson/bin/types/nulls.json0000644000000000000000000000144215031566105023656 0ustar rootroot[ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null ]asymptote-3.05/LspCpp/third_party/rapidjson/bin/types/readme.txt0000644000000000000000000000012615031566105023622 0ustar rootrootTest data obtained from https://github.com/xpol/lua-rapidjson/tree/master/performance asymptote-3.05/LspCpp/third_party/rapidjson/bin/types/alotofkeys.json0000644000000000000000000007246315031566105024714 0ustar rootroot{ "4BABQZ5SZJSO3KFKBOG36EIXXTOF34HVFCELHA2DWOMIL44K": null, "RSZNOTRIJFCHRKG4IKNOW4ZEBMVXPDBYBXBGDGNWTSVLMJ2U": null, "AOGQPY32FQ7T7WZWQPON3X6GU74GOYI6HHVNPATDTBXRUQ4G": null, "3PMTZEGLZNHSOWWJ23BE6PWOXD2VZRDN7MMLUMQ4EIRERVCG": null, "PD2FMQGI5HTGK6MT76OYS2ER2LXFBON44WOMELDY5MRKQI6I": null, "6L6QMMVSE4UQLB4OGX3LVDRNGAL6MOJ6S3RBBUSQ3F5PPHYR": null, "LYVVXT7U7WN7PGGUHCLFXVOBJBSSR6ES2P7AY7XGBXEBLTDD": null, "G5RWOLHDDZOXYEFGGSVWG3C2UHYDW6UOFVBQQLQJVZNCF4TB": null, "3QPIK2M3ZPICZQFQTX22A7VDCAFIGAX2PXIXKDOZX7XUM32R": null, "JR75L2BXOA5LVLNKT4EEZO2P45OHWRPMMWMFENTFFIY7A2V3": null, "TESL546MN7IR7AT3C5HRSESIFHZ5NW6TNRWZXZ43OSRYOZKP": null, "62EJKIAFWGFGPUS6YP2X6E26AV2TZCTCAJMZNWBBNFRPCCRN": null, "5ZDD3KPTPGE2CAWR3MTFUSBMGQAS4ZP5WZKXJTXUNFSYABD6": null, "XQ7TMN5YMQLAND54B4VIVWJAHU3TNZKT2S4SVRW6WKHNJBX2": null, "O456GV3HBAWFDQRCECX6HY3PBTP6WNQIDSKVP2MZIPV3TCBL": null, "WXCN25EBQH5WWN2JBHWNFNDUTYSFDLIAOWO5AE6D5HDO7VNE": null, "THO3I3KDRIMTD6DKNIETIOWDY7FXQ5GJ3P2KUQJWYAEL3LXV": null, "7OMI7VIOKFRZATMNLGIWH7ZBDARZ6ARXIAH5S3GPG5KV52IC": null, "ESUPY3ELKCEGFRSYFGPGFBJOAUGXMYZ6XCWXDFOKHBJHNGVR": null, "TNXSJIEFJLUFUDTR2S5LV73PD6ACFYNHOCRZPUSDPXDD3B7M": null, "T6TISG6P4W66F37634QU4BNJY4RZ77QXXNPGTYH5LCCRDSX6": null, "QTVAA56JKNDYTMV7DXAIL4QVLZPW3UHGLTKDI2BED6S3MGDQ": null, "DTJREAQBCS6I2AJ6MOGTPIXK3ADB4BPNDIHI2YSQP6Y2BMH7": null, "XDGH2OYCTAJ75IEMZ32O644YLT73PRYDORFKBLYEMCHOQ7Q6": null, "4KDDQZRBLNS33DRHZHDMENCWGMNFEJGBZJXSGIQW7VBWOTHT": null, "5KSH3GKWFNXV55KI2FPUDSD57O25N52UTZAAYDFVMFUSEE6O": null, "7AGEUBM5FQZ2JCMUSKTEI6COA3Q5CE5WYB7TP2F5OX3ETMTK": null, "HFHZ5ZE5TC45W4WIF6H7ONTHXKAVWRY2LXN2GN2TXZPIP6PQ": null, "S3U2JJBPKZHZNOM3SWVFQ7OMS7F5M2KDJHHHZKXHZXQRNUSE": null, "YHJBGJ6T6A7PMK5AYXDITDV37BJJIM4TP7I2XHSVYN76724O": null, "TH42A7M3645OUKC54JQMDB5BTGS3URFUCYJ2VOEM6IAGZ5QQ": null, "OYBKULFLWL2MER745QTDL2X2HJNR77QGH2M2P6TSCHVGUJLV": null, "JDU37GHQUOCYA5I5LFS3WAEKKR6C55XJCCLJCCCQJEGUJEP6": null, "CB5HEJZNJ2SWZM426TWIWLHTWAPWPT2AVVHBILEVGFD6NPHI": null, "D4A5SJA2VRB4JGJFC7PHT35S7XAMHPZZ2PZC5YYVV7RLKSUQ": null, "BBVT6NRRU55KNRK5G745FNMZVIFHVZJICEMODF4ZBJFQ3EGL": null, "XBV57OEMT4GYPTTH56A6XKF2ZPMXSMHY7L3LUIS5ZZWRP2OB": null, "GTFJ3NP4VJR6HG2DRNTDKVIWTMIALYUQIQTBJMKVM2I3QKGE": null, "77BMBFMRGASXE5XXT6BRH2DRBNJMIAUDDMEXIJT3RMHTUPI4": null, "FWZZMG7I2JWAHX4LBYAK2G4L4TZYLHXMJWIDGT6JC5TEBCPJ": null, "J3324OXU2BG2NGFMSOYMVKXE6OEJNGENI7EESHDSEWSUVDVV": null, "C636AVNC5C5EKILXT2AQPXYLSNH7LCAJKVDHP67MVHULFSQN": null, "OXTDOQG2VIEVYFC23SKOBSSPGE55AVZZADK6PIHP3APVPHND": null, "JLQVKV4Q2BQHK355NQXZVX4WJBPFOWSD7WIJX2P433KYO4SO": null, "E4XHPOPWH3PRCV5MGQHR3BCTKZMOK46OH4Q6STZDPF2FG6SD": null, "J5IP4A3DV3BHGGU3J72JVVTWNIQOLNC6GQES22MVATK5H7BZ": null, "HHCCDMLNGOU2ABP57ION5TC33UF3NUHL2L3WUYCGZDWLDNTL": null, "54Q67RURG4THOANPT3RAVF72TGKJE425GC5GD3EOKPY6MKVW": null, "TG3BH3HBKFEXAUM5O67VVDTXZA6MHWSVNNLXLXIL2SE2ZEDO": null, "Q5KJ25G2A4CWNGPPYXBZM6QVYA466MQX3HCUMUO5Z24D5JX3": null, "QQZET7VFHGJROUQZSWSRDI5ADXVH26KEPDVL6PZ36ISHOKMQ": null, "KWNJME4V365ZIC7SA7BYCVQUAG6URC2T6MHSO3OVDBJAUPFB": null, "XHQYKGYVLE2PFNXQPD4OUWBASZO5OFVZISCVEFTU6K6KDKHS": null, "Z4SPXMJIAMYD2H4U4F23FALBDZP6NRLUBDFU4PRGZ4SXGTI2": null, "HSCK3PEXH3I3XMMEMIHTM7SDJD3GOKXUMCGOL6UXJXLCSCGN": null, "BIUYMIDY4EVGRLZ6OLJK2CE2FS5TTELIWSEA6UHKUDUYX5LM": null, "IJJDLN5ANXTMX54P6GW2J2EJGGWG257YEAOZMXUSWK7D76LH": null, "CLMTO3VSAOBAOBSA5IGOO4W7KEMLOFUOIR564IBKMJA7RWEY": null, "JU5DNSHLUW34DT3IQ36JBV6M7EPILLMBALURDAB2KJXF6HQB": null, "VXZXWLNQZFJPNQVPTOFWUPLORZD2XRAFXRVRNLUYTPBO22U5": null, "HNACM55ZSGJ2FGRMOTXLVVLA32BC333QGC4HFCDSZ335YA4N": null, "6J5GIOVKU4PKHHU35DWL3D7GTJFF75FF4FKSP2HPGJ7SQ2DP": null, "O3NJM537IQSKKWM3K7EOQSNQDTR6XKUA7ZR7CWYHYYLHKH63": null, "B4QMXK2EAR5E7KGHLODCP56DX5HW7IQVXWHFFCZ4SPSSNGJK": null, "A5AUZBXKF67OXO34ZSEGVXI5PAIG6W2VG3U5C2Q72SNWYNEI": null, "ZGDQ2AA2IFBSU3APKAFL5AO4C4DXY2YBEHXE5UPPVCTFZ36K": null, "N3XZ5FYZEO3ZX37OMUJX3PIWEEV7TVEXX64KKEZEJICKXMTB": null, "3EVOEEWTD7OABLQJIJYLOSVHBS4SB6QGX7GPDFGWI2DGAWKR": null, "HNAEL3D7E2S7IYLKLIK4CGI56DRGAXA5S6KG3RX75PMJ6BVI": null, "VGVW32CIRX3M45J2CPCUPPHNRGNG55MKAU7YF3CDNMGONW2T": null, "QV5MW2W6WQSHNC6OYMWJAWEQM7LHXRMGWCJ7RI5WQ3JGHARW": null, "IND2PUTLFWXTEUY4MMEXCFJA7JN7DODE5HVWC5CL5ED5IEUB": null, "W2IA75XHJRBRKXLHGB7LXD7ECYEZI4V5N5I37UFXJMFWQMYR": null, "AWTZO6OG6TCOUVYYJCWVP2JYEXRXZ7S7F7QKUKZS7JLPKN3H": null, "TCARJATK42Y66SPMGOZ2LHLT2ZPZW7MHGXL5IVTS272FJV4U": null, "XVHBOY5WQDOTWXVFZYQKZ6GNRWMITJDDLXSJ2T3UWF6PFOHL": null, "CY5FGDYLB4UFR4AJRGLGPQT3W3OERGCXC4JHYKJ4HKSFTGK6": null, "B3SJGD67GKIEAOZISX7HWENPDBYJHNJ47JCREGXQ6G2RXPUZ": null, "LWVJYH7M5KXMLPFAHTMF6FKT3PSIW2GRC37AHF65PQY7OUE4": null, "UUFKWC2DOV4ZQHPDPQPRCBEYNAX6OFZ7ZVJNYGW5YZCMSQIS": null, "K5EC26CUN365DZ3LE2NHOINGZHXQ752A3VTPN5IMSRYSTOMT": null, "22RV6RSSZIAFXOZIRAWJAIMMVHYWGL2TY42U3TG2SPFN3I6P": null, "Q7VEOUC52OLXL53CR4XQSGGR5QZ2QXZTRCBACHQFP2HKN4SZ": null, "OZ2ZBCTBC32VOHHBDABY2U462OHUEUS724RUS7Z6TW5K5ZFQ": null, "EYXYWTX2UYI6MUK5L65WSTX2FDOJASIMG6ER22NLABNGAEMI": null, "U4FJU7RQMXXDMHG7B5WFLXCZBNE5PMV43CE5X4RJSJUABT3U": null, "K3T56AL7IXTAGTVIWZHYRKVPHLLD7UVHV4UNU76F764VGY75": null, "U2BRKWY2RBYV5S3XVZTUZXT55CXMB45KDMNFMVY6LENW2DH5": null, "YKLPZ7SDAG2O6NSJFLVGFVCYMY4WZKXQGHH7OO2BKGGVLQNP": null, "WSC2BHA7H6Q62HJIIGQFX2OU64QX4AEU2RZQVIC7LSIO2JSJ": null, "QIFNFKPJJCYPITMAYDAOEXBVEDAKBBR3DV5ZB7DAVBIAWI5K": null, "NMBGIDIK3BMS5ZPZS6ATTID5BOAXZAH2VUED52JSC5XGI42P": null, "LTSG7BGZVBLLXM5U2QDW5LNNPM3B5EQZPHES7JXU2EAQG266": null, "5MZMVLLM7YHR4PTQCGDGWFQQLNN532WMTFGX5CFTDURBYEOH": null, "UOMT2ERDBVXC3LRYKCVVUNROBWPGFHFWKFCW65HAPXN2H4FD": null, "RFYZPAIVYHTITTR5AKOBAMYKOA3VSKRTK4P4ZOS7JFSVEY53": null, "QQJGQV6BSW6PL4DZGQDWWVTF7U5MEVPQABOA4IRP7NOD4V4V": null, "EFOSJBHVPSGTB3O374JFJW6MVW47ODOZQNKYSWHR5W6UZECP": null, "YTL42MLIGIUD6Q3AMVMJ6ZMWNSXSUWCKV4ZUQWSGTEOATQC4": null, "F5IL5OV3Y6E4QEE7JMQTKV6ULJ5AQQKQPZ23VXK72AV2P7XG": null, "AZEV37T65EWVWQJSISCHTYHLWRXWCR6XD4LJ4KFLJ6RAOPF5": null, "T5TAAFPNZLVDYHSNNHIJW4KBZWNFT5CMIPIWW3EFKPU4REYG": null, "W326OLSKXRLU6MEIVUTKFFHFGXEH3VM43F353L3NHQP6HE2Q": null, "MIIUZQ4KGTLA66VIE7WPN4T43SR6Q42YUKWEP6467AYWKU62": null, "AXSJHLTL4FXCMLLJTQS4HIBRGUY6ATR3GZPV4MGXLWNFHDYU": null, "MC2CMWSKD2HMTVIWCMSPZWHEGW73RWEZKU3IFZJM33IW3VI6": null, "ZGOZHC22WZN6LSY3KK4HK6RF6F73VWSB7U47KZSLTYOQZAVH": null, "HU26VJYM5YNEXCOCWCVEQNNZ2WAPFEVYK67JZOHMSZIOUWJN": null, "6ZA46O27SWCAX5MQUHZYFV5UNQUDLZG4LDA6VILK6YRQMMZ5": null, "LMGGW3CAN4T6DSVJZB46LOBI6KTZN7CKHNZ6BMWRBL5PVYXX": null, "RZKIP3F5SY2P4NWANAQZJHPH34CU3GMQ4VCN4QXMP7ZBSQ43": null, "CMUAX53FME5Y62VC7T7ZOUZMOPHBDFVLMVVMHYDDBZEHMOOA": null, "ORTA47K5MLIHEUXQTFFTQNW2RMYQSTVDJXUNIF334SAJJYMC": null, "XEGLAWIOOPE25FDXHN65P4FYJVB46M4NGGXFAWZ5VDWBBMU4": null, "WZGXOCCN6GENKYYAYCH6UQD45BIPSYMQOZYAYRU3S2JNJLU3": null, "MXDDSZA6VTTYU56ONDE4QZMB3L2D7A5SCRCIVBYYVIKFDFLU": null, "JJMW475CTRXRR4R3GEZ77STHMKHTQZYFZHFUFXEB77SV2W3H": null, "J3TNJVNF7QSTIJDEEZMLTQECNOES4PXQALSR5ZPYDTIVVKUB": null, "Q5EHPI6GHPPZBATKHYYEXNDSYMW6QVAVKKHC2XO7RU7XXKQ3": null, "B6WGKJEZH7XBZ4VFFRCBFYKC2Z2ZQXMY2HJQUH4LVI3EDMMU": null, "NZ737IT3LUIMH56R66WFETEHFDOZSNVPTHMQTW3JHVTN562C": null, "B52PWLRNPFN73AA63O6JFLEYSPFQEIHQ6AI6YC7KWOYFE5OW": null, "7UTTRFE2I5WB2XZA37L6F7RWCII6S6HLXZRTLSJYFOENAYPI": null, "TJJDGG7R4RNVAOXWRZRZB5K7W2Y6XB7LUYBDOY6H5IDRM3ML": null, "TOG35JU7ULNRY3DE2XYDZ25WZETRSO5WSFFYSZT5IIALO3ZP": null, "2QZKK4CMZNIKUWZZB22ASDR2BYNRAMTNS7MVLBA7Z7RDKZDV": null, "US4C6FXHKR4GCRU6IJQHSAJXLNQGUDCDEPEQDU5C5D76I6XX": null, "QOPUXM3ZKXTPVGMVVDMUZZ75KH2S7DKYXSFCQ3R5RYO5WP2J": null, "GZ2T37SKRE3ZX7FARFWWF3WG443LVP5X6ENDLDHO7GBWYHHM": null, "VSOOUSBMGIPEVAPYAGWZOLDUW5HSTRMTBRTUYLQNHKVUBLJ7": null, "45HJFJQ3YKDBFDZPNDO46YT7DLG754XZWMGJQ7YPJXQ4G4N4": null, "4KY77KV2OWWFEVIBSUZRGZF2V47BEFFHIHNMAQVK65E34ZF3": null, "NB334WI2DNPLWHGXBNHSU4436ZYDQ4D2S3JMLDOM35QINZTR": null, "7K23M4FJGIQFWUMPRDZIK32MF7HZULYYSS5Z7N7QTEJGET3D": null, "ZBMNFKSEG2PXKJZIXIK2MHJQ2ONRJUJVCDBOCHNERPGMN2NQ": null, "YMCOX2NMBDL4J6Z7JBEWHFSCWON4ZSBSBU2WONEYYOYRA75K": null, "GDOVKPAWZFHLAPQ5YHCFWL4NAMC5G2DDXFWUTR27XQ7LEOOQ": null, "CYBYK7ESXTUUHYQVPMDI7VWAZO5TVGLIB3GB7NYRYVDLMYKG": null, "4IYLX3IDNUJ2DWT4RM3QJ3IMVE22X67EW5KWSMZHIU4W2W5B": null, "EBWXJZ3PX7LE4JNB2XWJJNXL5QBVSJQSXAUJMJ34YJKR3JJU": null, "LEKOXMXHU57JTRZUKMCW4WDCAKEOXPHJ34ULXN5P6DIEOYLL": null, "BESPMR4LBE3G4MTWR22CVBYH6NW43HO4ILTSV3P543JZUBD7": null, "5SYIBXIHGJGE4WHL2HYUNK3X4JUGOJOUMKVJMMXSQDKJZHFJ": null, "XN42HP3QOV34GMJA5VINVW3O7KWW2GV7VDKAZDFBCC6SSHNQ": null, "326BDEDWGYW3IMEHP63I6LVGSRMS6DUUNMPY3YVWXCH3YA67": null, "FYNTVFBPC37FYGOXFIXJP57FNX5MYDGUWIMUYMFOJSOXRRDS": null, "7DRCBIQP4EXAVNEMWOZHAEZ2W2EIMKD77PH6JJWP2BDN6NFN": null, "7Z7LWVFB2Z26EVYZPLQAOQ7LXLADTHUA7QGKDRFLXRQ3ZJUX": null, "EOZ2S4T75U62LD4QUZNTOHP7SNVJUNNSE7WWGHCMC75O4XPW": null, "TVG4ZY3YVNQV7WPZ2CEW26QTGWUBVJV7FTRF4TE54446J5SI": null, "MQ62OHPXMGGASRXKOH5MEVGLYHKNWBT3DC7XSXPXFHFXFO5C": null, "MBRTEJLOZ6U43EOO2IS3AHNDCT7WUEK4XN5ZRMTPBKUFXUWU": null, "24WJGDPNT4E7SQT2IBSTHJGYBMEBKS7VPGJYBRRAT5YXNBC4": null, "3KD7I6FOTRB4U2JBT7CIJOPD5XHFWHESYJJQTQVUQ3IGIPVZ": null, "25XHQ7A3DWKVDBX2ZFNIHKOGJCXY73N4Q6PUBEWGH2I55XVP": null, "GE3YTUBPOT5CFJU2LQVMZVC67NFNLXVWNTV4ERN6BHVGCGYL": null, "VXE2WHW6UWRE4WYTAVFAQ75IBYUPNZVMHJC44DGDPIAEOVVE": null, "5JRWFOAEX5TNCAMYGF44C72EWF5NTXIRSVST5J3N6N5SLGFF": null, "TYNIMWTDY2D565BJUNMFXTJHBUMWOTD4YSAFILKXPKX6FKRO": null, "RDUDIY6N4RRUA6YEBBBFPBNYFZQUWRVURNYGJPEU6EHJA64H": null, "MMRLX63PFJLWBJUTXCSLALIGK5YOHTLAY64WFQIYQJCX4QID": null, "P4T7UPQNUAFMAJ3G4KBRHOQP5GCJP46XXYKPTTENUI36YQEP": null, "VNAKVK3A4TN7WEZAJBJVMUVIKIUWCNH7B373DP7WAM7ZXYDD": null, "VAPNA5BJL7OF7VRVSUEFAG6RZWENO5VOGMFVN6AB4A7H4VU3": null, "TLVHDKN7326OHNXMBBJIVQW5FFFGPXSUR2IVTMPLOLPPJQW2": null, "LD4OK3CY7MQGHUMQOMPAJY2NZUASJLSLWVSIIKIYYYAFYHIK": null, "DXHC3XJCJJG2SMU4O2HDPMJHO4PNNYGIMLB5KSCQPNLBAJER": null, "SANGKO55HOXMBC627JYHVBE3FH6KJL74ITOVF5GYODRRMEMP": null, "TOQW7HYYWSFH3NKL7SITPX5H4HLAH7BKL35ECCAILLJ5B4TA": null, "WUKAWAQHSBKAUAYEQ4UA5PKFB4676VQNQFLXUIX6UCDFZ472": null, "BDU5VYNLNHR6HOLMZI4XSDERPTMVJ4LBUX5XP6W2BQWH3NLR": null, "R6BT3RGKODHZN2AEX26XHNSLCHGPGMQ7IS2ONRTZEPJECW7A": null, "E7Z4FLW3UW2ALRLPSMHQWJWBK7VWS63H3AUZZL6LHCIG3Q5B": null, "FUZAITDO5EH4BU3ZAN55R2RQZ75LRAYI4X3MEJKJD44VHOT7": null, "7SZ7VZ5O2OFPJL3K5JJKH3C2ZYAJCWW5GYXSLVFHRRATZDFA": null, "6H7VKVPSP4MHB6P7H5KLQQN3Q6ZSS65OMK6GJ3JIUMHQINMC": null, "QNCN75MNVAVH2OQR3JE53SGCKLXPSB2XBTZ55J3AX37AV5HT": null, "JCSYRKMHDGVUVZO65VQVAV5SGQS5IRS4UGFNFKMYP6CXMHXN": null, "JXX5VCQU2Q73TK5ICSFX3QIGA6E4IFRTGKPZZY32UTB2RY2Z": null, "BMUAPYFGRJO7ZQAMMSSEADU2RC3LPAAXTORXLSIUCXCSSC2P": null, "3SPFCAR2V2PQA3RWOY5ZZXI2V6UEUCZWL6SNCGEAGNR2JQZV": null, "KUW7Z4ZHRUX6DI6Y3ME7A33SXUAQPXFAHRG4IEU32ETMGTLC": null, "64F67UZGQHZUXLN6HCATAAX2FUQNK2WVOEJGBQ27H5DVZFC3": null, "GHMJSW2TE6E3JLFDD7T6FI67HBDHNDVLGEKATAO5G33TID57": null, "6BZEOJR372ZLNXUMEQQUKHHDCAOE5W4YDT3VWGI3YYPYDC5R": null, "62JOKD5O25I7DBDFMM2BRQP4HI2VJTUHMEF3G3C7JFJF2VNL": null, "NEF5ANHSBNEXLOP7FFH7ZVHPDOCHQQ6EYOG64JDZNIHBT44L": null, "ZKLJACJIQT6M7KUY3VWTMQ4WD7RETAWN7LDUB7UQA3NZHZLC": null, "VBZVHDFHE464JTYWCLYNAA65RDMVURJHVZHWRL3IKTNT6AH6": null, "FHBYZO5SUBQ56J72DWYOUZSDKXE3SKDRWBEGLQPHWUGVSW5B": null, "HHWRIAY52UXIOIKQOL3PBERZFDCQXAAUIDT4RTZF2VETEY3Q": null, "JALKMRCQEIXX3JPLOACUZ2DKA5I2RWSSSIYDVSURW475XHR7": null, "IMQUFG6JBGWA7R3D3NRMJNOF5MKE2NU4H2LAI6UPIHUEY2ZD": null, "GWSUUFLKG23Z4BXTLB2HJHYVRWAWHKV5MA5RVOEE77Z65ILK": null, "ILKEEWZSHVZSQ5M5VAZH6MJPBVQVV63SCQSX73YGTOQZBFKB": null, "TBU3SS7AG7QISWIK2KKNE77ISJUEVH3ZV7QZJAEHLMAOUCEZ": null, "EPN2PRVPXZGZ6WRX5ZMG6UPIM2V2NEA4BBC7ZDAIVCEKMHR5": null, "Z7GJAUSWDAH2JUMVX6IZB2PRSIUHYUKXGKJDM7FXVFDJNDUU": null, "APOEQP3DLJGKFU7424CJJBFDTWODGF45H7HSXT3GO2UC3VCI": null, "LCYBWI4HYCSVGBSWWDJYDCWQZGJP2KVSXUUJBO3XFUWOS4SA": null, "KOTWM653HSOQ2JHNAZGZZA5FGBBJCCBYPDVDE7WDXXIHTULF": null, "TIPJO4GHBUJQKWKVHK5RF2NI5Z6FAIEBGFPR5L4SSCLS6IE6": null, "QJZMGE4B6UPJ35KTTNIAHWTFV7DFQZ2QMF6DLHB2AHZQ45CD": null, "SDV2RDMAXCYWHJJRPTEIZVE6SJST7KQJB57AXCWFVO54E2GX": null, "4NW6WJDWXCXG2TS24H4I7WF2IGROPO4UBN2HJ64M3CWBU2M7": null, "GJPMFWNBHZ63VB5XWIM52UO22ANEXDYLHTF24LGBC7XXI4SH": null, "I3TPFLVZ47TOOMM2G35JFQAYHLAIU3OXV4SXZEP67DNGYXN3": null, "QMPKHHYWWSV32R2LHCWFKBFDXUDUXTZ7FRZK3TCF25CSFNWD": null, "J3C6XZSMIXH2SQMBUEVWEI6UZVX2GJZCAYSPD74BBUUK45RS": null, "WHK5HZ42VH6IJ4U4EUKKVLRAID2FH2YISR7IV6FMNHQPPSH7": null, "C62NUQB2FUJTY5VRNI6ND26FXCUVACSUTTR6NZMNQPYK6357": null, "2JXXJE7WN7QWO6X3ESQCSDDBTZXOY43L5AODQUIR5P6Y4PZB": null, "FQVJ4Y4GES3RGRABQCJIDIYEUNTIGETQ5EOXW25SZSYNJENT": null, "IH2YJNGRU5Y3ODZHMWNV3TIU2MGCNLIPV75QL3JL4I7PH5ZI": null, "RYUBMVYE4PL6JJOSBM57NE2RFKCY2EB3EQR3QU45MJHEX5IN": null, "KRVCQJ6VSHM52MLDNS65PKDYHNBJAHCONQCNLXBD76LDCOFY": null, "W7MB2FYKYWXDXNOKVWJW7TSUANZIGE25NABNIAK7VLPLKQQH": null, "QUJNQSAHDXMNHKHHIRBEFONX6NRV4NA7NKFRDI72ZKVZXR32": null, "SRQAJHTEQYVNHCJDTYHA72VSYS4FPTHXGPFYP6CQRTEUIWVN": null, "GYQMORZKT4JGWGOD4KBEMUB3XZNUM7H4G5IRA6SYDZOGAPVF": null, "73P37OKSAJ5SWM5NJ2QWCTKPTFNLORRRGBNJWR7BTCRLKNCO": null, "D7YVGR63MRZ5YS3UTCUZ7REPWGB6EMGNI3LXZUDAYBSZVGHZ": null, "JNUZON5EE4CF5UIPXIAU5HKQSBN6O2C3OXJ5IT6HPZMUBXRK": null, "3UMKRHCWRV2WNUWPF4WKESLI6EOHPFC6FOXF2MGP6E7GPKF7": null, "ZPWCDBHEOCZRBAVIQNGRQ4WNKSE4XCXWH3PQSBJWVTMLP6AD": null, "RCOP6UXD6CG5XYUXFXT7HDAWQA2LRA52R2NVABFBB574N62D": null, "6EHQW3VGWSY5MQKBQ4PWU2YD4KKXPBUFJCBEEY6GKOGGGT4P": null, "V72EUDLMYSS47DCO7XIEYQO4S6KK7ME4C6VN6IWLZALPDIR2": null, "EX6JHHNN4R7BQVBTVXYRD54J6BLOJTRHM64QBK3DHUWW37KF": null, "6GGFMOEZN5PBE67AJM6XJKDL7V6X26X3TH2WVOO4X2MEQJKO": null, "LYM2NDKVFTJ2IJV2G5HTDDXFDAAHVHVMVTNGBAOABW4JLB7V": null, "5GPR3EHGCAFLKH4CTOZK3JBHCJSEEFD2Y5GS5Y3B5FPXAK6H": null, "3TVZ6BP47YPHI4HKRIK43AJPRVM5UO736FF7WEXI6FJMTKY7": null, "XDL7LZWG4CIO574WINYHCXMGRRZV5BMZQH6GPTTVPBWGV4MD": null, "OHDX42IVKOGGQVXFE7Q3DKX2HNXGIZRAZ5TVVKQ34BO7UKPB": null, "QHSOVA5SCRL5AK65IALQZWLHPSMLOOHHS6JN3LHDCN7DEHJ7": null, "EI2J32TUZKPKSWOYH7EPPKHISCJ5SPTUFJXENKZJFAPEFQJL": null, "3FFPGZBSH57RTBR326VUSL4G3DELAIPWCCHB77LFG5CBS2YU": null, "VOLJPHGJOQKGKQ3PQGRLYJBZCIF3T355GXCQQKV34USNOXNX": null, "ZASYP4G3K3DX6MMU2CK2P6GJ2PKRQFQGFVEZGTMIRAZBDMOC": null, "MSLOXTCY6MPU6XRGIJ7ZGFBB5J4RTGTEC2UW2LO5MIKPXFJO": null, "DM3ZAC4JV4IDN7ZZ2OLHAUCUEWYTMLZSQQEARJF4JVBUTE2D": null, "KWIXQOXXGHTUPBDCHXV6ET4YZXIDCYZEQTFIRHD7DTMSGZ3X": null, "SOF4BRIWEU5XLSXVFE6IHVVDYG73RK5HJACKPUNFRNEDHRWS": null, "4FECMJE2AGQGN54LFXTIQFZC6ZVJN3LY62YCS4E65PMW2K5J": null, "VDCWL2B5OEDDB2YGM7Y23WLJPJBFESITFU5AWDPUKDUMFPBO": null, "W6VC6MV4GBWJ7IDAX4DQHWJSBUJHJN7ADFJ53NBVND3TXUCZ": null, "Z3TTBMVW3FCTJPLHXITOVK4LPLUFJJY3CIYKJ4QY2DANJ53R": null, "O6N3PZGXI5B6NBTOFPB5WWIRJ66O4FYLSGHDIJLVPT25YPWK": null, "RXCNDGG7CDEMAOGCALTPXWLUL7A67D3JSKOZSZEQBLDW2F3S": null, "XVKBWW7HRXDBW3YXSBMO7WVEUPVQ7LRZ44RVFI27PYZO3NTS": null, "XUSRB4YQDOYJALL7CK2OYFPL7GKI6XOFYHP7HTW5H3PF333V": null, "PCCHIGPV6SWW2O4YRPMFMNF5YVW6QY5IF7JPYAULF5WPTYKB": null, "MHRU7JFEPHHUAULYL34RAEAGBU2ARZG63TGIIS7MHEQUKWPY": null, "Y6EDYRAB7V6NAP57DRIKQ3SB57XBPN7MAWD7F3DM4DKWIAMA": null, "JQXEFOTP5HPBTKL4VAXYCMJFZVGSAM3JVLFJPQ6KHVLCRXFI": null, "U53PDNGH4IKMP4PW6AJV6K5Q43PYB6VUZ3IJVEKZK32IR5WJ": null, "52CB2E7VQJ3JJ2SXPHQZZMER64TM2JQBSW3JMX7XITCNSWDT": null, "3JLBHZFBPZQTO3MLCW6S5N3RIR42N6RGDHMP4U6IO6STOOVT": null, "YTFVKDUY6LHHBY5JBBTT75RYI73Y2Y2DFT5PBMOLEVBJEN4Y": null, "TAHMINQIUDTCEBCJ4UH2PUXO5TYMIIZTH4BX26S4NRMPFD6Q": null, "4VJIQ6FLWV6ONBHRWDR34KXCTHL7HIXSQAF3FAKOMZ2C7QV7": null, "IQWFFVGP6CPSAQWMKA3SWYOXAUL2YCD3EJYRQ56S3VXWAMUF": null, "J2FABCRQ7HZFV4FKZKY2UOXRUO4FYXANTTWL27ANRYY6XZC2": null, "G3TOY5CIOYIELRC2S35CGAS2E36TDLTO5XYXHFVKZNDFQC6F": null, "SDKQB4B47LL6CAFDDYJWDS4X7COKTZOCQ6ELJBL2YF6RHZJC": null, "L76D3LKKTUAWNPDXKTWE7JCFCRFVI4UX6NKQS3CAA2OWVF4K": null, "QVYYK2GQF7DHSJACSOZPOQUCWWIYTRGEWMBIR5RRCV2EPQ5X": null, "UM3PJVMZNDU2GJ6KVY5VQ2HPGMSJKVAQBDRKZKHBPBRCU5SO": null, "RDIJQSPXHAUB7XSQQPOL3CNUR5AJAJEWAFYFSDO5G4QWZQCV": null, "3CAVVDQOCSMOPC54JWKI5ITUIHAOV6SKAIIAAPAAJLBDTXEM": null, "JHLSLTDSRVKDHWRGT55OZ5NC6YHGD35WHW4GPK77VZWPNVKN": null, "6K266T5MHDGFA2XECSFBMTQDEE2C4S45S53XBODESR4ERZQ2": null, "VJVWAFFKWR2KSTFIWGAKDUG5VQTO3BPTI7YFYZWZSBMMQOIN": null, "LBSXWCQNCHYUG5M255T3W72NBPR5MBEPO7DFBCD277HSH4DU": null, "WHJGXILLMK23VGXI2OY76SYJQOQHQOM6OSLT4BWU2KSD3OAD": null, "DVNEV7ANOMDRQDHTEMD6CXCTO7NOY2MQQOLI47U4DDOJ2A2M": null, "TV752NASHG7FG2JOGS5P6QLJ7E4W5NX7F3OYYRPOEFZ2NREE": null, "S4DHHYVQ4RQ7HBAXW5ZKISZMULMLCFTSBFICXNLI2OD7YNF6": null, "HSRHOS56TX6EEDHUZX7K4K6Y3R2UNHRINXWVK5WBWHDPE5HF": null, "I67YQZJ4PXHFWHNHMK5SKUEFIL4EEP5B4BH3TJNHZPQOUXDM": null, "5AJTMUDFBWW3EGM2TH2YAJYXIR6GKM7RPBYBRV6KEQPDDLM6": null, "6V3SAQQC44I3CSDERRKA2533GYIWWHUZVR67JAWIBPJJBDBI": null, "5I6EFWIWLDNJQAZNZN326TUHCUY5YOD4ITIT6NL7LWIK6RP4": null, "NVT5LE35FIT6LKWBI5XZO2Q7CTQBFJ3IOIAFNXI7PGVHEE5W": null, "E5I534XUV7GRNCMHBVFI7FMTSPYBGXKOFVXXSEQYYLVGCASL": null, "3XDVU325YQTEXC7HFJKKKH7CTCCNNJZMV6VRT5GVED7HFKMZ": null, "3UJYDR6QUVSSCRHJT6WWNEHC5OMYXOPL3EF26PU2A5HESFG5": null, "UPRVTQXNXYCZG4JZIR7GZCCYTXR5VTUR2OKAJXEWGATCSIOH": null, "2QLXXZPU57ZXMLJHEYDS6IHFLQHOKANOE5URI2TRNFNSIFUG": null, "JFL3SN7LZ7M4RUZXRTYFQTUMYWYHO4P3ZKBGFDC2GGWZBPEA": null, "SBLHOHHAOCNEVQI3UPBY5S4UKTTIH3DEJEDJHWMJ6VEWWTCL": null, "TIE3GNWA2BE2WGFA7Y3KEHF4IF77M5XHZB3DIQLOE3GG4VQM": null, "BB7XBWIYV33TZGTKHTBL4PDPH5ZQ6X7ZCMHS3KIQEJOLOXVH": null, "6WO2JPOCRLCUSXS7BHNKFBDGFSEXCWYUFPK5SDZJTFJAEJRV": null, "RCJUMHWKL3IBJ4ZVWHK4RCZ4RCVVTMG5ZO2KWZOIVZLJTSMT": null, "YIXCNMIMZBA7NK2A5QOCLE77QFF6QDS7NGIHKMILIUB37EMH": null, "ZSI25IY4L2U7CRPBLOYY5TCSAVG22XHHZFC7JZCRAVY46BWH": null, "HUSGTJENHNIBJ7VSWZPOWFHHKKYH7H2YSP32LLQ2N7CWKRME": null, "WTIJK6LZPBOCIJFBZEG26BETKTY5PJKQK5D3M5WVPWVSV7LN": null, "ITSWONDXALFBD4WMGSMRKQXCVTL7JRKVFEHOAOODRQEFFSWC": null, "IY3RQGYC2ME2TEUBYAQG5WJ7WOAJV5GTO6P3FKXWOLSJWGCD": null, "MDSHVZ5WHCTCYB34ZABEUJJRXHQDKO5MSC5YVTGPMNJRXQK7": null, "KHNSXQTOSCRSTX63S7OVO2LGMD7OVR6PZIGEKL5ZDYPCEKK6": null, "LECVNJKLFT6P2HWX3H7ZC5DKJSSRZ7PWZVBN735K7I45SOX4": null, "HFEO55KM3XH34UWCRYM5CFNQ6OFRAKM3U6TABNQDP74DT4JQ": null, "QZOWC3TAAU67PVSBRJOOVZCBSRIOZCMLPB3FH4GS37WOSTEZ": null, "TSB72AJ4HHOBEYK4CGFX3W4RW3SIECQYJMYISHTPPCGQNLFD": null, "6AB4YKYVMU2PXRABAUBBBF4BJ3IOFKYWBJ2IMFMRVLCBI4S4": null, "E3TI3V725PEP7U2CYZUUKJEBPAHOEI5SYCR3YZCMGD5EGYHF": null, "APKJUBCO5NHY6QBYNA2ADB5TTPLCNZMHG7HGXXOLRBOZD46Y": null, "QKL26OQG6L54OCKFPLMXI6M3EG2HI4EG34D7BNI5SBZG6OF7": null, "W4KKIH4RPYXL4JZY24JWLHOATFNENBMSEQQ3DI7WW4PQIJQ3": null, "4XJPWCDQXS6MSKI4EMFPENOX5FV7KMKKZ77LV6GJ6S7ZBVB2": null, "LWMCTL5CEAVQDT5PEXFKRK7Q264CNVV6AU657OQ3SSPCDGSQ": null, "CBMCT6STEYDOVXT6OW34OXGZBN2A77OGBPDRN5AZK4RXNEV5": null, "OUGRMVL7PTQ3GJNWQ5WP7XXNYBIMVWKSNQ2QZH5RZRDEGUND": null, "XKVAYVNQL7KW5EHGEWYRPSWDXNUEKP3YC3OXGEHKG7PGNZHL": null, "ZLO6BOTXUEEW7UOENY2NVIFLSG37YPUETQBYYCQBJM5VXNG4": null, "QMZJWAJYYE6WZQX3OKY34BPU7ZZN6ECDNIZOIXREE6AP3WJF": null, "B5FU7VNVUSA3ODDEUDVTKE7GWPU3JQXWHRWYGLT6VFKSFYAA": null, "HLHSAJUSHU5EY26UTR2UDJAM3BIHYYHF46MNLTQZJWDAUCDO": null, "N73SLU2EDTPQ54MY5NWT7KPSVTO3TOGPO3DGX4HQYPZMFYJV": null, "7B47MDGTJA3P2WX3KWLLESWTC7RJUSVUSBI42SATEYZVPL5K": null, "YYLWTHMS5POBP3WVX5Q4NXQ77STWJTAHE6QK7GYMBIJU3TSX": null, "JI7Q6GUWUTSJPHKUII5IVOUZ2QQ53EWNWCUM4PKECXWSVSEK": null, "XR4W6GZYNYIDAFU7MWMIGFGF63OLKU4FWQZ4RAN3HWNXUINB": null, "3KX2TVZZAQSYQHLDSWMVZVF4UAXYONTXXFWSGI6CJ56DXU6O": null, "UR6JGWK36D4CU63DYI722UFUKLB2S52ZI4OAVZM7CVGGY3SW": null, "VGQOGZH3H5IAFESOYWHOQGU5FHP4BJAUUK2B7AKDCJX3PUE5": null, "Y5GO3VITRDTHWTMUULEA44BVX3GHVLIWFMTNUY2APWRL3JLD": null, "F7U4AV4VU7YAEDK6SI64JJUNEHG2MEFLKNOI77IVDQS7BGJK": null, "D77762UIMSS52GNAPWFCEEFPWGYLBPKWMBN75S3HCOI2SYCL": null, "NNRBK2PM7FI7MVFBSUUCZVFTDOKXLNVK6I4MMUXU4AKDPTCK": null, "YSGZXEZQRGZ3DSMNCNH6GSWGCRWQSIRD3IOR5E3XEUH5RORJ": null, "P6KRZXZTESTNZHYLZFTDLZMIGIN5H74H2KYUTNRIC3JWCNJ2": null, "QK36OWDC6RHQIASJXU2HZVIBARNIESSCWKICTRQ4B3OFUB6D": null, "JQBWWRLDDMH3HACHKR7EKXFCAAR5E62DX3ALK22Y5AFA4JDZ": null, "WWOLYDEZIQARIEC65MFSVB5RH3236B3E2YSGNEN2QY6A2G54": null, "QT5UVU5QUPEY7VCTTW26JTO2FBUUBCRBYZORWGTYQZ2JZSCH": null, "PJQFD75BGF35X4N33WD423KSDLIAWJNAZUBXQTUGHOW4PTXJ": null, "A5VRG2DRN3CKKTP2DN5YNILXVCZRTKFXWILKWLZ6PNVKJTM5": null, "TY4YPLWS4MDSKPG2HHIRSAWK37LFVB357RGGBRFP2P332HJL": null, "SUC7ZGB6YKDYNAP6NTUZVEVNDL22KBCRZIGAWSOBUAL55LDE": null, "Z5I7WKVA6754S4G7QWWXYTRZ3SGEG4B3KG5MLHP3GJDI3H7M": null, "VLGCWOT665AT2R6EMOAVHNKVM2NKPSV4KI4CMNEUZ2YMI3UP": null, "YJMQW3C2NIIZKTJY34XRL4HQ5A7EUMLMXTJFHHRE3NR3QGZF": null, "TOEB56GVW7OQ7QLL25ZY3ABP4ZQS2ZZMIJRNTILE5CWA2IZB": null, "5RGLCKE6D2MM5YH74OJBDHTOZIM7LN3EIYBLXVF4PGNBZON4": null, "QMQPPFLB6NCEBYCQ5U2YWVYWRKZSFJLCDAAPYSPURDLXAU6G": null, "UTAFBURT6XHHZV3Y5OZJBJJQT4342SSCOLWT35GZIJUPWTTM": null, "XCIXTAB5SB5EMQLZW7GCBUS2N3XU44YELMLSYIFAJHHGP3VS": null, "LWL5AM7Q4JPEDEORTLNDWUF5X4AIUI4QC5S4CWUXKXIWP6FP": null, "M4RONO5HAPE25Q46SSRBVQLEXPCVQLKOKX2NYQWX2SNNGEVB": null, "UVSHBLSXOHEF3AGG5PDTTDFVXNQPRHCNUTXYDEXJVXI7JCPL": null, "C3PB24XOHCI52DU64XQL2V2OKZZYG5B4T6PUU44DZCH4DMSS": null, "VGACAPDUB2J7KLW5PA474JQZWZ6QCDYYB2I32ZFYGXR64M2Y": null, "NNDVFWEC2OE56D5PLJWEEVG25TMXCXISOUOYDOUEMUZRMZK4": null, "57TIZBR3DXRX74YXCSJ2RXLZRXKX3K7H6WPS7DVONX7DOJY3": null, "RFSCST6ITGG53EAZEBXD2VFQTJ53ATEOORQV6SQG5OSDR3FM": null, "YLIXTKYNMODZNBM3L2EL435GD2LRJ5XAJBDZSYCU3OPZ4N4V": null, "FBEPPECF3L4RB6QBQLGL44JDBCQCTQ5MOFYFCUQVNL4DCQYV": null, "PAJST32KEXY6I2Y57OASSUFLF2BLPQQ7NZMVN6EVR7JS5LY3": null, "76MHL43MEQWH6R552TULI3TLBOR22YDMJC5ZYQVWCNI4BWF2": null, "A6KZM4OXBKW2NJ7X545F4LIDSC7LIAFYJ4CJSWW2BWSIRWUY": null, "VND76C7TCKQT6R4X56OD4UYSOBZGC5BQ3LR6RXOX6LA3I5F6": null, "CE2NODHXCRS4ML26HTI77Q57R7ZXKZO433LHHA66I5U3Y5GP": null, "3DGAXWQDLZBPUYZPBGMRZG5DOBPTIHKAXFSCBLMEQHZ2A4W2": null, "NAOTRV3ZNB2PK6RZJZ4UEQVF5M3YISGJNFZQQWPV2S5RL7XM": null, "HLCSR65OBO7BJQPOA65Q6BRDVFPOL7FJII2LOANRJNUM2DDU": null, "YCBI6X4JLTHKGAFR7XYKELWE7JW6VHLMFJIWF2ZC7BPCQFFR": null, "QEF3LB5GFEMHAUDKPPNYGRKUUV6PAWU5XXYCFIHXI7PLGVGW": null, "ABBQK5JKJZLMX4KGFODWSEHOPDTRHGDZCBO3ULBVOGUIAAGI": null, "HZLWUQNBAZJSDZEB6IPXQIUMVWUPYVMVP2N72NJ4MOZFUKGT": null, "7SQCYMGSMYW47TXUWC2J5674L4CRDIAO34D342D7IJ6OE23F": null, "YAQCDYBXIOY3KZGFJCPS5VD7YQBPBFFFYEA4DPWFWJCWCJXA": null, "HCZ7SSO422NW6O3ARCBUGNBCMUVEAHXMVKAJSDBHAQSFXIMV": null, "DPX2FNJNMFQT34DLAOEIN4KMWJYLOEGV7U4VDH635AG6UA5T": null, "QUO6FPOFFXUUKAZXYRN7N2MMT7IOJEG6NLFIH7B5JI5V2Y44": null, "UJ6G5JMOINYVRLVISHWTGQDDDWA6X3QDFICKY4QQIHG3QMF4": null, "ZR3VRUOZMQE4EMVT2WDB45TJ7KB5AGU5UBBPNL2A2D255MOL": null, "2AFEUH4R6YAJZEODKJBMLDM4ANLCKRU2C33HFSVU2LLXZW5Y": null, "3S4PV2VOBFB6GFRPG5SB3EHMZE5M7VAAFRJ3JQYHZEFTEKFX": null, "6EFK4THSCBEG4LDSVE5N5FXSQJTYB5SQ7LKJRBL6IYIREWTN": null, "HHYCWLKLIII7MJ4MYU7CJZ4YPOOUVWOKLXHZV5NT6LU7WWGX": null, "XYRSXFI6XRY3YACAIVIZJAVKFTZPRH5FXD7E4P4LYUGX6I5U": null, "6W72FMK5AP56TNCZ3LE5OTYZ3WYPARBB5AOXDVHGCBOTWZTO": null, "7YNUW4DUCHUDJSSAWSYOYM2QXWTVSJWGDPIG2EAABTU4QLU5": null, "HNVXP5XULHDT666ND2M3X2APGXOBCB7SCQB2D7MFQKKNVOS4": null, "MLCMV4777C55OEVW3SFO4VHH56O7BSIDLZFYYTY3JXNN4DWG": null, "MSNRSOCYC3HQCUXRLCBYFYQOMJFBDOSHJ3HYYYOHEPODETEE": null, "BJB2U3W5ZF7WQVTL6R2F542WSS6FQDSVDMXNYWIC5PHED4HH": null, "E26RFAVZYOV5WZ6WQDVINCGNG6ZYU2XCV4FPEKR45IASGARQ": null, "4BK33GLSBFLRZHOHECAVVYT3LJHSQ5RFBSMKLMGTK4Z5RGZO": null, "5I3526BP3QPLNDBEIPVQL2GOAMRBAYWOMILMQK5IT7RES3EV": null, "IBHOZ4VNFYMLMUNOZIGK743IVASI3DXHCY2RH6SO4EKNGR4A": null, "CCZT4EOMTISCMIVGMB2ZRUGFIR3R6WKU3ISSJ3VZVA6SBLFC": null, "OGJUH7B3WKG3W2UFEBL63KLQGPSPRNIHUUKWTKQMBN5QG42E": null, "Y6JCIA2AYVA3RDOUQFYWI4EMF64H5FIFNAHSKZ6LXCRXCFGW": null, "VX3OCLLJZPGXWTLGERIMK5IS4OXKU65SMC4YS5JZND6VEPO7": null, "UXWF26BRES53JKXYXEG5DWJXCR6USGPBWQBDJEVEBA2PPUAI": null, "IB5SSNMYSFCNB4ODT5OQ2GAGPIVDWOBEI3P3EBWI7AUGC7BR": null, "ASIAQKC3VSFJE7ZW472ZOAXX2T7JTCLZBN5BYEOAE7E67F5Z": null, "BKQ3GY255BDDVZ52IIR5K3NFIEKV6GXBVTX3ROY3IN7XDAHA": null, "JTV5ULWFJJOSFTX32FA6DJWADX5UL3NV4RZZS3Z64IPXDZNK": null, "GSZ7MZXCFKAWFBXKRVYUDULPJEH3WSI2K634LAAA36M2FRF3": null, "HSPTZMNCONTGJGIUWP7ZR277AYWTDIKPAWO4RODOIHQGEUF3": null, "4ABCWRBBUAO5TVOSOZDF3KMCUCKIUCRJSBGH4WGKDHWH3LLN": null, "K3BK4XFUTDJLS7KY4WJBS7RTZ65HY4N5NJ6AMKNKGO3K6DXG": null, "S4VZEKYRNOXUITHJENCBKJN6CC6QV7Y4MIHQ6NLN24OJFMBP": null, "MRM4HMHS2KAISLXU2XYFQCQH7XRVVC3EXSP6JU7FIM2DJHVV": null, "QMNCR2JQYOST5MD3HI2I4MCTSJDFCAGUTEE6XKM2THC4WXI3": null, "ANIF4DT5IA4IY7M5OISD4IW4J2TDVHHFIPEONUU4CV75LOFZ": null, "TQHJIX3NKO5CMVRNOG4WP3YDSGPLTTCRBA3RDBPECWO6EN5U": null, "6KI4L4RRXZ6WL3TRMCZLAA2W7AQRXDCC43O6AGYJ75NUEQO6": null, "VL57QTQMHQOAX5MFQTX7GUWOECHVTLYJHIBRKMWIRF4QMN6M": null, "JFTGBEP2LSZGDDFGV6IV2JAS3J3HB7BDRB6WEYHSC5EIFNA3": null, "WLEZIN5PPCJE4W2LGEPW4N6AWQ4RLE2AOGFBTETY5HNRSZCY": null, "LUJRHNRDNK7YOKST7KRVQGVE2ERU3LUVPZLC5YYLCUAX2EEU": null, "F2OOXAP3FFVMQMJP5IVDLRVV6IP2NUTGT5MGZCJMR2IFNA55": null, "SVL525L4TVBTLMH22DTXVCNECAZVUTMMYDTA3UQGV7U6P3YU": null, "546BD77L33PUPQ7TW3GJJVVJTYKHIIKF7YOO4SSGIIIOIJ2Z": null, "FCZRNOURTDJI2BE7HJ3P4MMY4WYAPFFBCTVFXVTYSK4UB4JK": null, "S2U5XQEC7I4HOUUR6HFXUF2PR2CLNF5UEIPJHTNF2JM5BZUJ": null, "JTQGSOTIPVYKGYJBUQC3Y44RWE372S7MPMFDETMH6OEGUJWA": null, "W3DTWDN6YOEPVUJVUDNPWCLQMXXCLXQPVYU27675LZM4ONDF": null, "LJ7P7AJNNHJE24PNWQDK7J4VGGNZKKR3OPVRFV5A4U6LRFRW": null, "I4QO3SZC4455G5PQIJPUUNI4A2BPJKTH5MBA7LN3HRIW6EFZ": null, "NNR3EXDDDPBTOKTRBPR5SO4OFPXU376ZIEHA6YHEJK57ZRGH": null, "4MBIV5HD4ZMXY5NIKZQIFKFO7S642PC7CWVX7ATXAXWQWNGU": null, "A6S5KTN66UWYBWG5CZXJVCJ2F2EA22BCZDFQMM523DU7VFBG": null, "AOAPML4IEVJZSZUOONTTDYSEN465IHW7MZXHSQ55E47TJ2NW": null, "ZIW5DXTPGQLTTRHPRQB7SADQPCSTXQRMKHZIXA6T6YW2BMRS": null, "OUHF6P7JPB5Z2C2E5MEPNQ5R3NY56KNQFHG3RYGWXBYKRRI7": null, "M3JXOC3CTIEMVHTQW7HB2WQ7L7Q54AWFY6F2UBTSZMDXHTDI": null, "WQQA7JW5NTSAI73WVQMMAJ4IO6OKZR32GTQTMUWE2HLC7DRH": null, "WGDVRLD5YWTXFOFTGBBEFCG455EK3BZCZEE2POAX56O3EOQW": null, "6KAR3LTBYTJ6WRGOUQ2TEPZKWVVBPGCO4OVAN2ADNDNLTOSM": null, "VEWL2DORBATRWF5HJ7LG66NYWMXH37JJU6XWVGJNDVL3OSAM": null, "B4HXCGMG5S3VEOZR5IUYOZAEFL6WPRLXB26SLWZHRY3WL3ZU": null, "REKI5EIO6TNXBWJIENJDQ5CAYEYZC2GXVPAOIWGVXKN2K3OE": null, "RBOY2SVFDRIKJZWTWVEGSJLHGIMAZXIF5HNBZAKPVRTEFR3A": null, "SIOSHIHS52CHIB73RFONJOM2HJBTRLGGDFW6JAWTR6UPJBVB": null, "ZGHKTW43CXC3CBOLSENIMDQUIR22VNXSE6HFBT6ZUA3TPODL": null, "XA576OGJNZK3AXE3FJLSSGN5MGRK4FJJ2XX3UHHFI6NO7P25": null, "22VL7B7ZI53VMYEYHKBI7XYNKRQW634B6RLBRXRJN4CQJA6G": null, "YVHEMU6OLF3FI2MTMZ25QKT5F2OUO3H6CX4WRNEXVH4BO3WZ": null, "3VJOBPUJI5DUFHNRM456UWSAHIZYXICY7ZFYMECCUHDTG444": null, "BXLYOEBYW7R4MWPNTOZ2ZJPDDXBHV7JMH75NCD26VGS2VRH7": null, "GCZOZTTLMHTAKVUQ4TSDOOPHEGK6PH4JQ3ULKZCUIEDW2HLX": null, "TE6B4JOPAY2CEQ46KJV7N6MY7OAI4VA3UBBXGPOELN7KY5T7": null, "62BPAKDHZ7ZRJOMVZ2SX2WAKFQATUQLKDQ7YGACJPL2NP4UR": null, "6U3MTBST24MIPS3HSZJPTBSZJ54T63GMZGZQPGFBS7JGBUVX": null, "SXBYC5BKXYT4DFNVSS4OVRYLNA5JY4TXMVTIFSCRT6Q5C265": null, "TAMMZOCU5GDDOIRG6U53NW3UUEUGI3QWW6YY6GWNE7WIHRNE": null, "O37BSKPNGDUUN24XFSCR2IQHWFYUZJBPWSNC4L43MH5HV272": null, "AZFWV3I3DANXV3HJB66QMCFJ3UTVJGS3R3IP7VROF2D5JF6U": null, "W2BLY5MU4PA7HSENYW4MO6VHHPBXUFCFMSBWTCL5F3BIPBFT": null, "ILFL3JG2XQGZCFBJHZFQRZMLGHZWVRBX3M5Z3HXW2A4GDMNK": null, "O7VDC3EDG5I567RK5BKXMKA2R6XPHQQPDXQTCZP7BHKV5BK6": null, "5ZMIJOTL3NPRKBEPS7542ICCNHHUJ2BNOZ7LSL2ICTCUFGSC": null, "FCTKLPX7PYRSVVBH4KN46HEYLJEYSRTQ3PCUU5RY3BROUZKU": null, "7EAMJ4C7NUA3XMDDOF3YRJA7Q2BFXFCI4J24ZXSVE7REBRFU": null, "NOQ6OL6G7QD4ILQ3FAEMEMROBCK4OK3LX3CRMHMA6GG5YIYK": null, "N3XXFRDRYPWGZ3LDGLIXGLLJYKEHPW4565BUUL67OLMXP554": null, "GFHEEY3HHESZDI2YHTDDCBKGE3ZPWPXW2WE5AKNL2Y2TJCNJ": null, "JTUQIEPPBM2QC6XBY3KP2NSDM6WUCJMORCBXNU6ZPXPOHEIW": null, "V5VTVJ36JZDDO5FIOEZNAKYWPRQSUSTEZAKARDOHQEIFLACE": null, "KUTOUNOS2QL4O6HF266ANCBNYUSIT66TANXCGYALCPZXULQH": null, "CJILUW3VUBZCSO5DXTSE4HSVW5UJAJHHCSHGHADKCQE5OTBU": null, "HD72YVUCR4IY5MG3E73UM35ARFCUIHEPIMUSQXOKLVTT2V67": null, "ELVTZXW3ZAKR76K6IV6ZHX7WTMKPKIFRPHIU3LK67WQR6IQG": null, "NIZTNRLCIS4JDLMOTEAKPA6B2JOE76ZBQDEUUGXENEJBYJFV": null, "FE743ELPJYDYWTJ374PZVE4TNGZPDZWSNUO5PATNYUYBDTBJ": null, "FIT3JHSZMFJ7N2E7BL6PHEUUHSBHU55YBIH763TGSZQTIAZY": null, "AP7SXAQ6HW373QPCHKKA4R7NFFUCD7CFB7EERZBNXRGM2Z7R": null, "BAW6TALQRWXK2OWS2O2UV72BKZGBZCUPR6AXKFZ7WHZXZXWX": null, "SM3FE7H4NI76AS5YCH6O34LTROZKJ7FEP4IKL33JUBI7FWZJ": null, "BNO2EJXVMAPFDVF34NBTPSIYKI3UPFI5G2K6KGVU35TIHOQL": null, "INHCLRC6WPTE2U7OQRSSRGCN4B5K4BUVSGFHEKG5DWJWICOF": null, "OEHWM7QZ3H67QC4ZQY2USKQA62NLMESA543KWPBUKV7N65TQ": null, "BN3U5KDJP3QGOSBX3TH5R2DR6PZA5Z7BEGVG6MYRW5GWUCGT": null, "ID7S7JEGBCI7ES3ZN7PIW5NEP67WTL5H5IB6WVRYS47EEEJ2": null, "BG4MHZNCCLZQN563CZ2D72CPT5TASZZ6N6L4JOW2XPR7GIDQ": null, "IAQKAEEUCCT3ZZY5LCO4AZW6F6ZNGUAF56UCD43OPOKSMBHR": null, "LFCSYYMAFZ5IAB5O4QIEN5GERYIGTH4JH266LORQ36SB2A26": null, "J7W62H5B42N3YUEFS5F2MECESYBUVHXSIGRMZL6ZNQMCYQMQ": null, "J24FG5J3MUQOCDAVVCHM6BJWZW4Y7VCSC73DW32TMKIUOXPB": null, "DGJE6OPBSV3JW45P5WC3EGUMIETVT7MIZX4EA5SCY2F3JKFL": null, "KWTJYJJT2LMBHE6WH4LNJEHNMNJVOEQ7SLLXGJKWPGOFDYHQ": null, "7XZDDO3CCV34UECRKEM344EDKKUFD6YDUJ7EW4OAETABTYWV": null, "BPS2OSY2SOAFFPRY24IEXGZVBEUNVIWZYTVVZRUWT7XM727T": null, "6GRVGHI3FMCQ5MQ4JR7ORANBXK6GMSI4XRQVE35LPH44XROO": null, "MZHRR2BS6HII6JD3H32DPSYTTHCVXE4WSC7NUURU43Z5SD56": null, "QJBSWHFQKABG4CALELT62JWLMW2JVZP35RDYHWHQPZYTIX5M": null, "K2Y3YRBFB7F5PJJUFJDH5Z5NL2MYOQWGT5T5VI5SP7TVM5NW": null, "QLONNH4NMZX5WLEJPQEWJECL5JTLTWDSK234NU5H55GA6PFG": null, "NSSRUR3GI6B7NBK77ZQIIHOA4TEEA5UXVVMRWVLMRIP6SN3T": null, "WB2TXRE7EPSBGACXUA4YE23M4WLMG3PVRMD2OOCIHNGQVDRY": null, "3MDCQC5BPGFGGFDO4C4IY53NPTWZMRK5MWLJG2KX7OWVQNFO": null } asymptote-3.05/LspCpp/third_party/rapidjson/bin/types/floats.json0000644000000000000000000000324215031566105024011 0ustar rootroot[ 135.747111636, 123.377054008, 140.527504552, -72.299143906, -23.851678949, 73.586193519, -158.299382442, 177.477876032, 32.268518982, -139.560009969, 115.203105183, -106.025823607, 167.224138231, 103.378383732, -97.498486285, 18.184723416, 69.137075711, 33.849002681, -120.185228215, -20.841408615, -172.659492727, -2.691464061, 22.426164066, -98.416909437, -31.603082708, -85.072296561, 108.620987395, -43.127078238, -126.473562057, -158.595489097, -57.890678254, -13.254016573, -85.024504709, 171.663552644, -146.495558248, -10.606748276, -118.786969354, 153.352057804, -45.215545083, 37.038725288, 106.344071897, -64.607402031, 85.148030911, 28.897784566, 39.51082061, 20.450382102, -113.174943618, 71.60785784, -168.202648062, -157.338200017, 10.879588527, -114.261694831, -5.622927072, -173.330830616, -29.47002003, -39.829034201, 50.031545162, 82.815735508, -119.188760828, -48.455928081, 163.964263034, 46.30378861, -26.248889762, -47.354615322, 155.388677633, -166.710356904, 42.987233558, 144.275297374, 37.394383186, -122.550388725, 177.469945914, 101.104677413, 109.429869885, -104.919625624, 147.522756541, -81.294703727, 122.744731363, 81.803603684, 26.321556167, 147.045441354, 147.256895816, -174.211095908, 52.518769316, -78.58250334, -173.356685435, -107.728209264, -69.982325771, -113.776095893, -35.785267074, -105.748545976, -30.206523864, -76.185311723, -126.400112781, -26.864958639, 56.840053629, 93.781553535, -116.002949803, -46.617140948, 176.846840093, -144.24821335 ] asymptote-3.05/LspCpp/third_party/rapidjson/bin/types/paragraphs.json0000644000000000000000000010174415031566105024657 0ustar rootroot[ "Commodo ullamco cupidatat nisi sit proident ex. Cillum pariatur occaecat in officia do commodo nisi cillum tempor minim. Ad dolor ut et aliquip fugiat eu officia cupidatat occaecat consectetur eiusmod veniam enim officia.\r\n", "Adipisicing cillum laborum nisi irure. Cillum dolor proident duis nulla qui mollit dolore reprehenderit mollit. Irure nulla dolor ipsum irure nulla quis laboris do.\r\n", "Est adipisicing consectetur incididunt in. Occaecat ea magna ex consequat irure sit laborum cillum officia magna sunt do exercitation aliquip. Laboris id aute in dolore reprehenderit voluptate non deserunt laborum.\r\n", "Consectetur eu aute est est occaecat adipisicing sint enim dolor eu. Tempor amet id non mollit eu consectetur cillum duis. Eu labore velit nulla ipsum commodo consequat aliquip. Cupidatat commodo dolore mollit enim sit excepteur nisi duis laboris deserunt esse.\r\n", "Incididunt ullamco est fugiat enim fugiat. Do sit mollit anim ad excepteur eu laboris exercitation officia labore nulla ut. Voluptate non voluptate cillum sit et voluptate anim duis velit consequat aliquip dolor. Elit et et esse laboris consectetur officia eiusmod aliquip nisi est. Qui labore dolore ad dolor.\r\n", "Anim adipisicing est irure proident sit officia ullamco voluptate sunt consectetur duis mollit excepteur veniam. Nostrud ut duis aute exercitation officia et quis elit commodo elit tempor aute aliquip enim. Est officia non cillum consequat voluptate ipsum sit voluptate nulla id.\r\n", "Ipsum enim consectetur aliquip nulla commodo ut ex aliqua elit duis do. Officia et sunt aliqua dolor minim voluptate veniam esse elit enim. Adipisicing reprehenderit duis ex magna non in fugiat sunt ipsum nostrud fugiat aliquip. Labore voluptate id officia voluptate eu. Magna do nostrud excepteur sunt aliqua adipisicing qui.\r\n", "Est occaecat non non cupidatat laborum qui. Veniam sit est voluptate labore sit irure consectetur fugiat. Anim enim enim fugiat exercitation anim ad proident esse in aliqua. Laboris ut aute culpa ullamco.\r\n", "Sit et aliquip cupidatat deserunt eiusmod sint aliquip occaecat nostrud aliqua elit commodo ut magna. Amet sit est deserunt id duis in officia pariatur cupidatat ex. Mollit duis est consequat nulla aute velit ipsum sit consectetur pariatur ut non ex ipsum. Tempor esse velit pariatur reprehenderit et nostrud commodo laborum mollit labore.\r\n", "Aliquip irure quis esse aliquip. Ex non deserunt culpa aliqua ad anim occaecat ad. Lorem consectetur mollit eu consectetur est non nisi non ipsum. Qui veniam ullamco officia est ut excepteur. Nulla elit dolore cupidatat aliqua enim Lorem elit consequat eiusmod non aliqua eu in. Pariatur in culpa labore sint ipsum consectetur occaecat ad ex ipsum laboris aliquip officia. Non officia eiusmod nisi officia id id laboris deserunt sunt enim magna mollit sit.\r\n", "Mollit velit laboris laborum nulla aliquip consequat Lorem non incididunt irure. Eu voluptate sint do consectetur tempor sit Lorem in. Laborum eiusmod nisi Lorem ipsum dolore do aute laborum occaecat aute sunt. Sit laborum in ea do ipsum officia irure cillum irure nisi laboris. Ad anim deserunt excepteur ea veniam eiusmod culpa velit veniam. Commodo incididunt ea Lorem eu enim esse nisi incididunt mollit.\r\n", "Velit proident sunt aute dolore reprehenderit culpa. Pariatur reprehenderit commodo ad ea voluptate anim nulla ipsum eu irure fugiat aliqua et. Adipisicing incididunt anim excepteur voluptate minim qui culpa. Sunt veniam enim reprehenderit magna magna. Sit ad amet deserunt ut aute dolore ad minim.\r\n", "Esse ullamco sunt mollit mollit. Eu enim dolore laboris cupidatat. Cupidatat adipisicing non aute exercitation fugiat. Non ut cillum labore fugiat aliquip ex duis quis consectetur ut nisi Lorem amet qui. Proident veniam amet qui reprehenderit duis qui. Nisi culpa sit occaecat ullamco occaecat laborum fugiat ut. Non duis deserunt culpa duis.\r\n", "Id ipsum eiusmod laboris non est ipsum deserunt labore duis reprehenderit deserunt. Sint tempor fugiat eiusmod nostrud in ut laborum esse in nostrud sit deserunt nostrud reprehenderit. Cupidatat aliqua qui anim consequat eu quis consequat consequat elit ipsum pariatur. Cupidatat in dolore velit quis. Exercitation cillum ullamco ex consectetur commodo tempor incididunt exercitation labore ad dolore. Minim incididunt consequat adipisicing esse eu eu voluptate.\r\n", "Anim sint eiusmod nisi anim do deserunt voluptate ut cillum eiusmod esse ex reprehenderit laborum. Dolore nulla excepteur duis excepteur. Magna nisi nostrud duis non commodo velit esse ipsum Lorem incididunt. Nulla enim consequat ad aliqua. Incididunt irure culpa nostrud ea aute ex sit non ad esse.\r\n", "Ullamco nostrud cupidatat adipisicing anim fugiat mollit eu. Et ut eu in nulla consequat. Sunt do pariatur culpa non est.\r\n", "Pariatur incididunt reprehenderit non qui excepteur cillum exercitation nisi occaecat ad. Lorem aliquip laborum commodo reprehenderit sint. Laboris qui ut veniam magna quis et et ullamco voluptate. Tempor reprehenderit deserunt consequat nisi. Esse duis sint in tempor. Amet aute cupidatat in sint et.\r\n", "Est officia nisi dolore consequat irure et excepteur. Sit qui elit tempor magna qui cillum anim amet proident exercitation proident. Eu cupidatat laborum consectetur duis ullamco irure nulla. Adipisicing culpa non reprehenderit anim aute.\r\n", "Eu est laborum culpa velit dolore non sunt. Tempor magna veniam ea sit non qui Lorem qui exercitation aliqua aliqua et excepteur eiusmod. Culpa aute anim proident culpa adipisicing duis tempor elit aliquip elit nulla laboris esse dolore. Sit adipisicing non dolor eiusmod occaecat cupidatat.\r\n", "Culpa velit eu esse sunt. Laborum irure aliqua reprehenderit velit ipsum fugiat officia dolor ut aute officia deserunt. Ipsum sit quis fugiat nostrud aliqua cupidatat ex pariatur et. Cillum proident est irure nisi dolor aliqua deserunt esse occaecat velit dolor.\r\n", "Exercitation nulla officia sit eiusmod cillum eu incididunt officia exercitation qui Lorem deserunt. Voluptate Lorem minim commodo laborum esse in duis excepteur do duis aliquip nisi voluptate consectetur. Amet tempor officia enim ex esse minim reprehenderit.\r\n", "Laboris sint deserunt ad aute incididunt. Anim officia sunt elit qui laborum labore commodo irure non. Mollit adipisicing ullamco do aute nulla eu laborum et quis sint aute adipisicing amet. Aliqua officia irure nostrud duis ex.\r\n", "Eiusmod ipsum aliqua reprehenderit esse est non aute id veniam eiusmod. Elit consequat ad sit tempor elit eu incididunt quis irure ad. Eu incididunt veniam consequat Lorem nostrud cillum officia ea consequat ad cillum. Non nisi irure cupidatat incididunt pariatur incididunt. Duis velit officia ad cillum qui. Aliquip consequat sint aute nisi cillum. Officia commodo nisi incididunt laborum nisi voluptate aliquip Lorem cupidatat anim consequat sit laboris.\r\n", "Veniam cupidatat et incididunt mollit do ex voluptate veniam nostrud labore esse. Eiusmod irure sint fugiat esse. Aute irure consectetur ut mollit nulla sint esse. Lorem ut quis ex proident nostrud mollit nostrud ea duis duis in magna anim consectetur.\r\n", "Irure culpa esse qui do dolor fugiat veniam ad. Elit commodo aute elit magna incididunt tempor pariatur velit irure pariatur cillum et ea ad. Ad consequat ea et ad minim ut sunt qui commodo voluptate. Laboris est aliquip anim reprehenderit eu officia et exercitation. Occaecat laboris cupidatat Lorem ullamco in nostrud commodo ipsum in quis esse ex.\r\n", "Incididunt officia quis voluptate eiusmod esse nisi ipsum quis commodo. Eiusmod dolore tempor occaecat sit exercitation aliqua minim consequat minim mollit qui ad nisi. Aute quis irure adipisicing veniam nisi nisi velit deserunt incididunt anim nostrud.\r\n", "Voluptate exercitation exercitation id minim excepteur excepteur mollit. Fugiat aute proident nulla ullamco ea. Nisi ea culpa duis dolore veniam anim tempor officia in dolore exercitation exercitation. Dolore quis cillum adipisicing sunt do nulla esse proident ad sint.\r\n", "Laborum ut mollit sint commodo nulla laborum deserunt Lorem magna commodo mollit tempor deserunt ut. Qui aliquip commodo ea id. Consectetur dolor fugiat dolor excepteur eiusmod. Eu excepteur ex aute ex ex elit ex esse officia cillum exercitation. Duis ut labore ea nostrud excepteur. Reprehenderit labore aute sunt nisi quis Lorem officia. Ad aliquip cupidatat voluptate exercitation voluptate ad irure magna quis.\r\n", "Tempor velit veniam sit labore elit minim do elit cillum eiusmod sunt excepteur nisi. Aliquip est deserunt excepteur duis fugiat incididunt veniam fugiat. Pariatur sit irure labore et minim non. Cillum quis aute anim sint laboris laboris ullamco exercitation nostrud. Nulla pariatur id laborum minim nisi est adipisicing irure.\r\n", "Irure exercitation laboris nostrud in do consectetur ad. Magna aliqua Lorem culpa exercitation sint do culpa incididunt mollit eu exercitation. Elit tempor Lorem dolore enim deserunt. Anim et ullamco sint ullamco mollit cillum officia et. Proident incididunt laboris aliquip laborum sint veniam deserunt eu consequat deserunt voluptate laboris. Anim Lorem non laborum exercitation voluptate. Cupidatat reprehenderit culpa Lorem fugiat enim minim consectetur tempor quis ad reprehenderit laboris irure.\r\n", "Deserunt elit mollit nostrud occaecat labore reprehenderit laboris ex. Esse reprehenderit adipisicing cillum minim in esse aliquip excepteur ex et nisi cillum quis. Cillum labore ut ex sunt. Occaecat proident et mollit magna consequat irure esse. Dolor do enim esse nisi ad.\r\n", "Pariatur est anim cillum minim elit magna adipisicing quis tempor proident nisi laboris incididunt cupidatat. Nulla est adipisicing sit adipisicing id nostrud amet qui consequat eiusmod tempor voluptate ad. Adipisicing non magna sit occaecat magna mollit ad ex nulla velit ea pariatur. Irure labore ad ea exercitation ex cillum.\r\n", "Lorem fugiat eu eu cillum nulla tempor sint. Lorem id officia nulla velit labore ut duis ad tempor non. Excepteur quis aute adipisicing nisi nisi consectetur aliquip enim Lorem id ullamco cillum sint voluptate. Qui aliquip incididunt tempor aliqua voluptate labore reprehenderit. Veniam eiusmod elit occaecat voluptate tempor culpa consectetur ea ut exercitation eiusmod exercitation qui.\r\n", "Aliqua esse pariatur nulla veniam velit ea. Aliquip consectetur tempor ex magna sit aliquip exercitation veniam. Dolor ullamco minim commodo pariatur. Et amet reprehenderit dolore proident elit tempor eiusmod eu incididunt enim ullamco. Adipisicing id officia incididunt esse dolor sunt cupidatat do deserunt mollit do non. Magna ut officia fugiat adipisicing quis ea cillum laborum dolore ad nostrud magna minim est. Dolor voluptate officia proident enim ea deserunt eu voluptate dolore proident laborum officia ea.\r\n", "Culpa aute consequat esse fugiat cupidatat minim voluptate voluptate eiusmod irure anim elit. Do eiusmod culpa laboris consequat incididunt minim nostrud eiusmod commodo velit ea ullamco proident. Culpa pariatur magna ut mollit nisi. Ea officia do magna deserunt minim nisi tempor ea deserunt veniam cillum exercitation esse.\r\n", "Anim ullamco nostrud commodo Lorem. Do sunt laborum exercitation proident proident magna. Lorem officia laborum laborum dolor sunt duis commodo Lorem. Officia aute adipisicing ea cupidatat ea dolore. Aliquip adipisicing pariatur consectetur aliqua sit amet officia reprehenderit laborum culpa. Occaecat Lorem eu nisi do Lorem occaecat enim eiusmod laboris id quis. Ad mollit adipisicing sunt adipisicing esse.\r\n", "Laborum quis sit adipisicing cupidatat. Veniam Lorem eiusmod esse esse sint nisi labore elit et. Deserunt aliqua mollit ut commodo aliqua non incididunt ipsum reprehenderit consectetur. Eiusmod nulla minim laboris Lorem ea Lorem aute tempor pariatur in sit. Incididunt culpa ut do irure amet irure cupidatat est anim anim culpa occaecat. Est velit consectetur eiusmod veniam reprehenderit officia sunt occaecat eiusmod ut sunt occaecat amet.\r\n", "Elit minim aute fugiat nulla ex quis. Labore fugiat sint nostrud amet quis culpa excepteur in. Consectetur exercitation cupidatat laborum sit. Aute nisi eu aliqua est deserunt eiusmod commodo dolor id. Mollit laborum esse sint ipsum voluptate reprehenderit velit et. Veniam aliquip enim in veniam Lorem voluptate quis deserunt consequat qui commodo ut excepteur aute.\r\n", "Dolore deserunt veniam aute nisi labore sunt et voluptate irure nisi anim ea. Magna nisi quis anim mollit nisi est dolor do ex aliquip elit aliquip ipsum minim. Dolore est officia nostrud eiusmod ex laborum ea amet est. Officia culpa non est et tempor consectetur exercitation tempor eiusmod enim. Ea tempor laboris qui amet ex nisi culpa dolore consectetur incididunt sunt sunt. Lorem aliquip incididunt magna do et ullamco ex elit aliqua eiusmod qui. Commodo amet dolor sint incididunt ex veniam non Lorem fugiat.\r\n", "Officia culpa enim voluptate dolore commodo. Minim commodo aliqua minim ex sint excepteur cupidatat adipisicing eu irure. Anim magna deserunt anim Lorem non.\r\n", "Cupidatat aliquip nulla excepteur sunt cupidatat cupidatat laborum cupidatat exercitation. Laboris minim ex cupidatat culpa elit. Amet enim reprehenderit aliqua laborum est tempor exercitation cupidatat ex dolore do. Do incididunt labore fugiat commodo consectetur nisi incididunt irure sit culpa sit. Elit aute occaecat qui excepteur velit proident cillum qui aliqua ex do ex. Dolore irure ex excepteur veniam id proident mollit Lorem.\r\n", "Ad commodo cillum duis deserunt elit officia consectetur veniam eiusmod. Reprehenderit et veniam ad commodo reprehenderit magna elit laboris sunt non quis. Adipisicing dolor aute proident ea magna sunt et proident in consectetur.\r\n", "Veniam exercitation esse esse veniam est nisi. Minim velit incididunt sint aute dolor anim. Fugiat cupidatat id ad nisi in voluptate dolor culpa eiusmod magna eiusmod amet id. Duis aliquip labore et ex amet amet aliquip laborum eiusmod ipsum. Quis qui ut duis duis. Minim in voluptate reprehenderit aliqua.\r\n", "Elit ut pariatur dolor veniam ipsum consequat. Voluptate Lorem mollit et esse dolore mollit Lorem ad. Elit nostrud eu Lorem labore mollit minim cupidatat officia quis minim dolore incididunt. In cillum aute cillum ut.\r\n", "Commodo laborum deserunt ut cupidatat pariatur ullamco in esse anim exercitation cillum duis. Consectetur incididunt sit esse Lorem in aute. Eiusmod mollit Lorem consequat minim reprehenderit laborum enim excepteur irure nisi elit. Laborum esse proident aute aute proident adipisicing laborum. Pariatur tempor duis incididunt qui velit pariatur ut officia ea mollit labore dolore. Cillum pariatur minim ullamco sunt incididunt culpa id ullamco exercitation consectetur. Ea exercitation consequat reprehenderit ut ullamco velit eu ad velit magna excepteur eiusmod.\r\n", "Eu deserunt magna laboris laborum laborum in consequat dolore. Officia proident consectetur proident do occaecat minim pariatur officia ipsum sit non velit officia cillum. Laborum excepteur labore eu minim eiusmod. Sit anim dolore cillum ad do minim culpa sit est ad.\r\n", "Cupidatat dolor nostrud Lorem sint consequat quis. Quis labore sint incididunt officia tempor. Fugiat nostrud in elit reprehenderit dolor. Nisi sit enim officia minim est adipisicing nulla aute labore nulla nostrud cupidatat est. Deserunt dolore qui irure Lorem esse voluptate velit qui nostrud.\r\n", "Fugiat Lorem amet nulla nisi qui amet laboris enim cillum. Dolore occaecat exercitation id labore velit do commodo ut cupidatat laborum velit fugiat mollit. Ut et aliqua pariatur occaecat. Lorem occaecat dolore quis esse enim cupidatat exercitation ut tempor sit laboris fugiat adipisicing. Est tempor ex irure consectetur ipsum magna labore. Lorem non quis qui minim nisi magna amet aliquip ex cillum fugiat tempor.\r\n", "Aliquip eiusmod laborum ipsum deserunt velit esse do magna excepteur consectetur exercitation sit. Minim ullamco reprehenderit commodo nostrud exercitation id irure ex qui ullamco sit esse laboris. Nulla cillum non minim qui cillum nisi aute proident. Dolor anim culpa elit quis excepteur aliqua eiusmod. Elit ea est excepteur consectetur sunt eiusmod enim id commodo irure amet et pariatur laboris. Voluptate magna ad magna dolore cillum cillum irure laboris ipsum officia id Lorem veniam.\r\n", "Esse sunt elit est aliquip cupidatat commodo deserunt. Deserunt pariatur ipsum qui ad esse esse magna qui cillum laborum. Exercitation veniam pariatur elit amet enim.\r\n", "Esse quis in id elit nulla occaecat incididunt. Et amet Lorem mollit in veniam do. Velit mollit Lorem consequat commodo Lorem aliquip cupidatat. Minim consequat nostrud nulla in nostrud.\r\n", "Cillum nulla et eu est nostrud quis elit cupidatat dolor enim excepteur exercitation nisi voluptate. Nulla dolore non ex velit et qui tempor proident id deserunt nisi eu. Tempor ad Lorem ipsum reprehenderit in anim. Anim dolore ullamco enim deserunt quis ex id exercitation velit. Magna exercitation fugiat mollit pariatur ipsum ex consectetur nostrud. Id dolore officia nostrud excepteur laborum. Magna incididunt elit ipsum pariatur adipisicing enim duis est qui commodo velit aute.\r\n", "Quis esse ex qui nisi dolor. Ullamco laborum dolor esse laboris eiusmod ea magna laboris ea esse ut. Dolore ipsum pariatur veniam sint mollit. Lorem ea proident fugiat ullamco ut nisi culpa eu exercitation exercitation aliquip veniam laborum consectetur.\r\n", "Pariatur veniam laboris sit aliquip pariatur tempor aute sunt id et ut. Laboris excepteur eiusmod nisi qui quis elit enim ut cupidatat. Et et laborum in fugiat veniam consectetur ipsum laboris duis excepteur ullamco aliqua dolor Lorem. Aliqua ex amet sint anim cupidatat nisi ipsum anim et sunt deserunt. Occaecat culpa ut tempor cillum pariatur ex tempor.\r\n", "Dolor deserunt eiusmod magna do officia voluptate excepteur est cupidatat. Veniam qui cupidatat amet anim est qui consectetur sit commodo commodo ea ad. Enim ad adipisicing qui nostrud. Non nulla esse ullamco nulla et ex.\r\n", "Id ullamco ea consectetur est incididunt deserunt et esse. Elit nostrud voluptate eiusmod ut. Excepteur adipisicing qui cupidatat consequat labore id. Qui dolor aliqua do dolore do cupidatat labore ex consectetur ea sit cillum. Sint veniam eiusmod in consectetur consequat fugiat et mollit ut fugiat esse dolor adipisicing.\r\n", "Ea magna proident labore duis pariatur. Esse cillum aliquip dolor duis fugiat ea ex officia ea irure. Sint elit nisi pariatur sunt nostrud exercitation ullamco culpa magna do.\r\n", "Minim aliqua voluptate dolor consequat sint tempor deserunt amet magna excepteur. Irure do voluptate magna velit. Nostrud in reprehenderit magna officia nostrud. Cupidatat nulla irure laboris non fugiat ex ex est cupidatat excepteur officia aute velit duis. Sit voluptate id ea exercitation deserunt culpa voluptate nostrud est adipisicing incididunt. Amet proident laborum commodo magna ipsum quis.\r\n", "Ipsum consectetur consectetur excepteur tempor eiusmod ea fugiat aute velit magna in officia sunt. Sit ut sunt dolore cupidatat dolor adipisicing. Veniam nisi adipisicing esse reprehenderit amet aliqua voluptate ex commodo occaecat est voluptate mollit sunt. Pariatur aliqua qui qui in dolor. Fugiat reprehenderit sit nostrud do sint esse. Tempor sit irure adipisicing ea pariatur duis est sit est incididunt laboris quis do. Et voluptate anim minim aliquip excepteur consequat nisi anim pariatur aliquip ut ipsum dolor magna.\r\n", "Cillum sit labore excepteur magna id aliqua exercitation consequat laborum Lorem id pariatur nostrud. Lorem qui est labore sint cupidatat sint excepteur nulla in eu aliqua et. Adipisicing velit do enim occaecat laboris quis excepteur ipsum dolor occaecat Lorem dolore id exercitation.\r\n", "Incididunt in laborum reprehenderit eiusmod irure ex. Elit duis consequat minim magna. Esse consectetur aliquip cillum excepteur excepteur fugiat. Sint tempor consequat minim reprehenderit consectetur adipisicing dolor id Lorem elit non. Occaecat esse quis mollit ea et sint aute fugiat qui tempor. Adipisicing tempor duis non dolore irure elit deserunt qui do.\r\n", "Labore fugiat eiusmod sint laborum sit duis occaecat. Magna in laborum non cillum excepteur nostrud sit proident pariatur voluptate voluptate adipisicing exercitation occaecat. Ad non dolor aute ex sint do do minim exercitation veniam laborum irure magna ea. Magna do non quis sit consequat Lorem aliquip.\r\n", "Velit anim do laborum laboris laborum Lorem. Sunt do Lorem amet ipsum est sint velit sit do voluptate mollit veniam enim. Commodo do deserunt in pariatur ut elit sint elit deserunt ea. Ad dolor anim consequat aliquip ut mollit nostrud tempor sunt mollit elit. Reprehenderit laboris labore excepteur occaecat veniam adipisicing cupidatat esse. Ad enim aliquip ea minim excepteur magna. Sint velit veniam pariatur qui dolor est adipisicing ex laboris.\r\n", "Ea cupidatat ex nulla in sunt est sit dolor enim ad. Eu tempor consequat cupidatat consequat ex incididunt sint culpa. Est Lorem Lorem non cupidatat sunt ut aliqua non nostrud do ullamco. Reprehenderit ad ad nulla nostrud do nulla in. Ipsum adipisicing commodo mollit ipsum exercitation. Aliqua ea anim anim est elit. Ea incididunt consequat minim ad sunt eu cillum.\r\n", "Tempor quis excepteur eiusmod cupidatat ipsum occaecat id et occaecat. Eiusmod magna aliquip excepteur id amet elit. Ullamco dolore amet anim dolor enim ea magna magna elit. Occaecat magna pariatur in deserunt consectetur officia aliquip ullamco ex aute anim. Minim laborum eu sit elit officia esse do irure pariatur tempor et reprehenderit ullamco labore.\r\n", "Sit tempor eu minim dolore velit pariatur magna duis reprehenderit ea nulla in. Amet est do consectetur commodo do adipisicing adipisicing in amet. Cillum id ut commodo do pariatur duis aliqua nisi sint ad irure officia reprehenderit. Mollit labore id enim fugiat ullamco irure mollit cupidatat. Quis nisi amet labore eu dolor occaecat commodo aliqua laboris deserunt excepteur deserunt officia. Aliqua non ut sit ad. Laborum veniam ad velit minim dolore ea id magna dolor qui in.\r\n", "Dolore nostrud ipsum aliqua pariatur id reprehenderit enim ad eiusmod qui. Deserunt anim commodo pariatur excepteur velit eu irure nulla ex labore ipsum aliqua minim aute. Id consequat amet tempor aliquip ex elit adipisicing est do. Eu enim Lorem consectetur minim id irure nulla culpa. Consectetur do consequat aute tempor anim. Qui ad non elit dolor est adipisicing nisi amet cillum sunt quis anim laboris incididunt. Incididunt proident adipisicing labore Lorem.\r\n", "Et reprehenderit ea officia veniam. Aliquip ullamco consequat elit nisi magna mollit id elit. Amet amet sint velit labore ad nisi. Consectetur tempor id dolor aliqua esse deserunt amet. Qui laborum enim proident voluptate aute eu aute aute sit sit incididunt eu. Sunt ullamco nisi nostrud labore commodo non consectetur quis do duis minim irure. Tempor sint dolor sint aliquip dolore nostrud fugiat.\r\n", "Aute ullamco quis nisi ut excepteur nostrud duis elit. Veniam ex ad incididunt veniam voluptate. Commodo dolore ullamco sit sint adipisicing proident amet aute duis deserunt.\r\n", "Labore velit eu cillum nisi. Laboris do cupidatat et non duis cillum. Ullamco dolor tempor cupidatat voluptate laborum ullamco ea duis.\r\n", "Deserunt consequat aliqua duis aliquip nostrud nostrud dolore nisi. Culpa do sint laborum consectetur ipsum quis laborum laborum pariatur eiusmod. Consectetur laboris ad ad ut quis. Ullamco laboris qui velit id laborum voluptate qui aute nostrud aliquip ea.\r\n", "Ad cillum anim ex est consectetur mollit id in. Non enim aliquip consequat qui deserunt commodo cillum ad laborum fugiat. Dolor deserunt amet laborum tempor adipisicing voluptate dolor pariatur dolor cillum. Eu mollit ex sunt officia veniam qui est sunt proident. Non aliqua qui elit eu cupidatat ex enim ex proident. Lorem sit minim ullamco officia cupidatat duis minim. Exercitation laborum deserunt voluptate culpa tempor quis nulla id pariatur.\r\n", "Nostrud quis consectetur ut aliqua excepteur elit consectetur occaecat. Occaecat voluptate Lorem pariatur consequat ullamco fugiat minim. Anim voluptate eu eu cillum tempor dolore aliquip aliqua. Fugiat incididunt ut tempor amet minim. Voluptate nostrud minim pariatur non excepteur ullamco.\r\n", "Dolore nulla velit officia exercitation irure laboris incididunt anim in laborum in fugiat ut proident. Fugiat aute id consequat fugiat officia ut. Labore sint amet proident amet sint nisi laboris amet id ullamco culpa quis consequat proident. Magna do fugiat veniam dolore elit irure minim. Esse ullamco excepteur labore tempor labore fugiat dolore nisi cupidatat irure dolor pariatur. Magna excepteur laboris nisi eiusmod sit pariatur mollit.\r\n", "In enim aliquip officia ea ad exercitation cillum culpa occaecat dolore Lorem. Irure cillum commodo adipisicing sunt pariatur ea duis fugiat exercitation laboris culpa ullamco aute. Ut voluptate exercitation qui dolor. Irure et duis elit consequat deserunt proident.\r\n", "Officia ea Lorem sunt culpa id et tempor excepteur enim deserunt proident. Dolore aliquip dolor laboris cillum proident velit. Et culpa occaecat exercitation cupidatat irure sint adipisicing excepteur pariatur incididunt ad occaecat. Qui proident ipsum cillum minim. Quis ut culpa irure aliqua minim fugiat. In voluptate cupidatat fugiat est laborum dolor esse in pariatur voluptate.\r\n", "Voluptate enim ipsum officia aute ea adipisicing nisi ut ex do aliquip amet. Reprehenderit enim voluptate tempor ex adipisicing culpa. Culpa occaecat voluptate dolor mollit ipsum exercitation labore et tempor sit ea consectetur aliqua. Elit elit sit minim ea ea commodo do tempor cupidatat irure dolore. Occaecat esse adipisicing anim eiusmod commodo fugiat mollit amet. Incididunt tempor tempor qui occaecat cupidatat in.\r\n", "Ut qui anim velit enim aliquip do ut nulla labore. Mollit ut commodo ut eiusmod consectetur laboris aliqua qui voluptate culpa fugiat incididunt elit. Lorem ullamco esse elit elit. Labore amet incididunt ea nulla aliquip eiusmod. Sit nulla est voluptate officia ipsum aute aute cillum tempor deserunt. Laboris commodo eiusmod labore sunt aute excepteur ea consectetur reprehenderit veniam nisi. Culpa nisi sint sunt sint tempor laboris dolore cupidatat.\r\n", "Duis cillum qui nisi duis amet velit ad cillum ut elit aute sint ad. Amet laboris pariatur excepteur ipsum Lorem aliqua veniam Lorem quis mollit cupidatat aliqua exercitation. Pariatur ex ullamco sit commodo cillum eiusmod ut proident elit cillum. Commodo ut ipsum excepteur occaecat sint elit consequat ex dolor adipisicing consectetur id ut ad. Velit sit eiusmod est esse tempor incididunt consectetur eiusmod duis commodo veniam.\r\n", "Ut sunt qui officia anim laboris exercitation Lorem quis laborum do eiusmod officia. Enim consectetur occaecat fugiat cillum cillum. Dolore dolore nostrud in commodo fugiat mollit consequat occaecat non et et elit ullamco. Sit voluptate minim ut est culpa velit nulla fugiat reprehenderit eu aliquip adipisicing labore. Sit minim minim do dolor dolor. Lorem Lorem labore exercitation magna veniam eiusmod do.\r\n", "Fugiat dolor adipisicing quis aliquip aute dolore. Qui proident anim elit veniam ex aliquip eiusmod ipsum sunt pariatur est. Non fugiat duis do est officia adipisicing.\r\n", "Nulla deserunt do laboris cupidatat veniam do consectetur ipsum elit veniam in mollit eu. Ea in consequat cupidatat laboris sint fugiat irure. In commodo esse reprehenderit deserunt minim velit ullamco enim eu cupidatat tempor ex. Ullamco in non id culpa amet occaecat culpa nostrud id. Non occaecat culpa magna incididunt.\r\n", "Enim laboris ex mollit reprehenderit eiusmod exercitation magna. Exercitation Lorem ex mollit non non culpa labore enim. Adipisicing labore dolore incididunt do amet aliquip excepteur ad et nostrud officia aute veniam voluptate. Fugiat enim eiusmod Lorem esse. Minim ullamco commodo consequat ex commodo aliqua eu nulla eu. Veniam non enim nulla ut Lorem nostrud minim sint duis.\r\n", "Enim duis consectetur in ullamco cillum veniam nulla amet. Exercitation nisi sunt sunt duis in culpa nisi magna ex id ipsum laboris reprehenderit qui. Officia pariatur qui ex fugiat veniam et sunt sit nostrud. Veniam ullamco tempor fugiat minim Lorem proident velit in eiusmod elit. Enim minim excepteur aute aliquip ex magna commodo dolore qui et labore. Proident eu aliquip cillum dolor. Nostrud ipsum ut irure consequat fugiat nulla proident occaecat laborum.\r\n", "Amet duis eiusmod sunt adipisicing esse ex nostrud consectetur voluptate cillum. Ipsum occaecat sit et anim velit irure ea incididunt cupidatat ullamco in nisi quis. Esse officia ipsum commodo qui quis qui do. Commodo aliquip amet aute sit sit ut cupidatat elit nostrud.\r\n", "Laboris laboris sit mollit cillum nulla deserunt commodo culpa est commodo anim id anim sit. Officia id consectetur velit incididunt est dolor sunt ipsum magna aliqua consectetur. Eiusmod pariatur minim deserunt cupidatat veniam Lorem aliquip sunt proident eu Lorem sit dolor fugiat. Proident qui ut ex in incididunt nulla nulla dolor ex laboris ea ad.\r\n", "Ex incididunt enim labore nulla cupidatat elit. Quis ut incididunt incididunt non irure commodo do mollit cillum anim excepteur. Qui consequat laborum dolore elit tempor aute ut nulla pariatur eu ullamco veniam. Nisi non velit labore in commodo excepteur culpa nulla tempor cillum. Ipsum qui sit sint reprehenderit ut labore incididunt dolor aliquip sunt. Reprehenderit occaecat tempor nisi laborum.\r\n", "Lorem officia ullamco eu occaecat in magna eiusmod consectetur nisi aliqua mollit esse. Ullamco ex aute nostrud pariatur do enim cillum sint do fugiat nostrud culpa tempor. Do aliquip excepteur nostrud culpa eu pariatur eiusmod cillum excepteur do. Est sunt non quis cillum voluptate ex.\r\n", "Deserunt consectetur tempor irure mollit qui tempor et. Labore enim eu irure laboris in. Nisi in tempor ex occaecat amet cupidatat laboris occaecat amet minim ut magna incididunt id. Consequat cillum laborum commodo mollit. Et magna culpa sunt dolore consequat laboris et sit. Deserunt qui voluptate excepteur dolor. Eu qui amet est proident.\r\n", "Eu elit minim eiusmod occaecat eu nostrud dolor qui ut elit. Sunt dolore proident ea eu do eiusmod fugiat incididunt pariatur duis amet Lorem nisi ut. Adipisicing quis veniam cupidatat Lorem sint culpa sunt veniam sint. Excepteur eu exercitation est magna pariatur veniam dolore qui fugiat labore proident eiusmod cillum. Commodo reprehenderit elit proident duis sint magna.\r\n", "Ut aliquip pariatur deserunt nostrud commodo ad proident est exercitation. Sit minim do ea enim sint officia nisi incididunt laborum. Ex amet duis commodo fugiat. Ut aute tempor deserunt irure occaecat aliquip voluptate cillum aute elit qui nostrud.\r\n", "Irure et quis consectetur sit est do sunt aliquip eu. Cupidatat pariatur consequat dolore consectetur. Adipisicing magna velit mollit occaecat do id. Nisi pariatur cupidatat cillum incididunt excepteur consectetur excepteur do laborum deserunt irure pariatur cillum.\r\n", "Adipisicing esse incididunt cillum est irure consequat irure ad aute voluptate. Incididunt do occaecat nostrud do ipsum pariatur Lorem qui laboris et pariatur. Est exercitation dolor culpa ad velit ut et.\r\n", "Sit eiusmod id enim ad ex dolor pariatur do. Ullamco occaecat quis dolor minim non elit labore amet est. Commodo velit eu nulla eiusmod ullamco. Incididunt anim pariatur aute eiusmod veniam tempor enim officia elit id. Elit Lorem est commodo dolore nostrud. Labore et consectetur do exercitation veniam laboris incididunt aliqua proident dolore ea officia cupidatat. Velit laboris aliquip deserunt labore commodo.\r\n", "Proident nostrud labore eu nostrud. Excepteur ut in velit labore ea proident labore ea sint cillum. Incididunt ipsum consectetur officia irure sit pariatur veniam id velit officia mollit. Adipisicing magna voluptate velit excepteur enim consectetur incididunt voluptate tempor occaecat fugiat velit excepteur labore. Do do incididunt qui nisi voluptate enim. Laboris aute sit voluptate cillum pariatur minim excepteur ullamco mollit deserunt.\r\n", "Excepteur laborum adipisicing nisi elit fugiat tempor. Elit laboris qui enim labore duis. Proident tempor in consectetur proident excepteur do ex laboris sit.\r\n", "Dolore do ea incididunt do duis dolore eu labore nisi cupidatat voluptate amet incididunt minim. Nulla pariatur mollit cupidatat adipisicing nulla et. Dolor aliquip in ex magna excepteur. Nulla consequat minim consequat ullamco dolor laboris ullamco eu reprehenderit duis nostrud pariatur.\r\n", "Id nisi labore duis qui. Incididunt laboris tempor aute do sit. Occaecat excepteur est mollit ea in mollit ullamco est amet reprehenderit.\r\n", "Aute labore ipsum velit non voluptate eiusmod et reprehenderit cupidatat occaecat. Lorem tempor tempor consectetur exercitation qui nostrud sunt cillum quis ut non dolore. Reprehenderit consequat reprehenderit laborum qui pariatur anim et officia est cupidatat enim velit velit.\r\n", "Commodo ex et fugiat cupidatat non adipisicing commodo. Minim ad dolore fugiat mollit cupidatat aliqua sunt dolor sit. Labore esse labore velit aute enim. Nulla duis incididunt est aliquip consectetur elit qui incididunt minim minim labore amet sit cillum.\r\n" ]asymptote-3.05/LspCpp/third_party/rapidjson/bin/types/booleans.json0000644000000000000000000000152115031566105024321 0ustar rootroot[ true, true, false, false, true, true, true, false, false, true, false, false, true, false, false, false, true, false, false, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, true, true, true, true, true, false, false, true, false, false, false, true, true, false, true, true, false, true, false, true, true, true, false, false, false, true, false, false, false, true, true, false, true, true, true, true, true, true, true, true, false, false, false, false, false, true, true, true, true, true, true, true, false, false, false, true, false, false, false, true, true, true, false, false, true, false ]asymptote-3.05/LspCpp/third_party/rapidjson/doc/0000755000000000000000000000000015031566105020456 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/doc/stream.md0000644000000000000000000003430315031566105022276 0ustar rootroot# Stream In RapidJSON, `rapidjson::Stream` is a concept for reading/writing JSON. Here we'll first show you how to use provided streams. And then see how to create a custom stream. [TOC] # Memory Streams {#MemoryStreams} Memory streams store JSON in memory. ## StringStream (Input) {#StringStream} `StringStream` is the most basic input stream. It represents a complete, read-only JSON stored in memory. It is defined in `rapidjson/rapidjson.h`. ~~~~~~~~~~cpp #include "rapidjson/document.h" // will include "rapidjson/rapidjson.h" using namespace rapidjson; // ... const char json[] = "[1, 2, 3, 4]"; StringStream s(json); Document d; d.ParseStream(s); ~~~~~~~~~~ Since this is very common usage, `Document::Parse(const char*)` is provided to do exactly the same as above: ~~~~~~~~~~cpp // ... const char json[] = "[1, 2, 3, 4]"; Document d; d.Parse(json); ~~~~~~~~~~ Note that, `StringStream` is a typedef of `GenericStringStream >`, user may use another encodings to represent the character set of the stream. ## StringBuffer (Output) {#StringBuffer} `StringBuffer` is a simple output stream. It allocates a memory buffer for writing the whole JSON. Use `GetString()` to obtain the buffer. ~~~~~~~~~~cpp #include "rapidjson/stringbuffer.h" #include StringBuffer buffer; Writer writer(buffer); d.Accept(writer); const char* output = buffer.GetString(); ~~~~~~~~~~ When the buffer is full, it will increases the capacity automatically. The default capacity is 256 characters (256 bytes for UTF8, 512 bytes for UTF16, etc.). User can provide an allocator and an initial capacity. ~~~~~~~~~~cpp StringBuffer buffer1(0, 1024); // Use its allocator, initial size = 1024 StringBuffer buffer2(allocator, 1024); ~~~~~~~~~~ By default, `StringBuffer` will instantiate an internal allocator. Similarly, `StringBuffer` is a typedef of `GenericStringBuffer >`. # File Streams {#FileStreams} When parsing a JSON from file, you may read the whole JSON into memory and use ``StringStream`` above. However, if the JSON is big, or memory is limited, you can use `FileReadStream`. It only read a part of JSON from file into buffer, and then let the part be parsed. If it runs out of characters in the buffer, it will read the next part from file. ## FileReadStream (Input) {#FileReadStream} `FileReadStream` reads the file via a `FILE` pointer. And user need to provide a buffer. ~~~~~~~~~~cpp #include "rapidjson/filereadstream.h" #include using namespace rapidjson; FILE* fp = fopen("big.json", "rb"); // non-Windows use "r" char readBuffer[65536]; FileReadStream is(fp, readBuffer, sizeof(readBuffer)); Document d; d.ParseStream(is); fclose(fp); ~~~~~~~~~~ Different from string streams, `FileReadStream` is byte stream. It does not handle encodings. If the file is not UTF-8, the byte stream can be wrapped in a `EncodedInputStream`. We will discuss more about this later in this tutorial. Apart from reading file, user can also use `FileReadStream` to read `stdin`. ## FileWriteStream (Output) {#FileWriteStream} `FileWriteStream` is buffered output stream. Its usage is very similar to `FileReadStream`. ~~~~~~~~~~cpp #include "rapidjson/filewritestream.h" #include #include using namespace rapidjson; Document d; d.Parse(json); // ... FILE* fp = fopen("output.json", "wb"); // non-Windows use "w" char writeBuffer[65536]; FileWriteStream os(fp, writeBuffer, sizeof(writeBuffer)); Writer writer(os); d.Accept(writer); fclose(fp); ~~~~~~~~~~ It can also redirect the output to `stdout`. # iostream Wrapper {#iostreamWrapper} Due to users' requests, RapidJSON also provides official wrappers for `std::basic_istream` and `std::basic_ostream`. However, please note that the performance will be much lower than the other streams above. ## IStreamWrapper {#IStreamWrapper} `IStreamWrapper` wraps any class derived from `std::istream`, such as `std::istringstream`, `std::stringstream`, `std::ifstream`, `std::fstream`, into RapidJSON's input stream. ~~~cpp #include #include #include using namespace rapidjson; using namespace std; ifstream ifs("test.json"); IStreamWrapper isw(ifs); Document d; d.ParseStream(isw); ~~~ For classes derived from `std::wistream`, use `WIStreamWrapper`. ## OStreamWrapper {#OStreamWrapper} Similarly, `OStreamWrapper` wraps any class derived from `std::ostream`, such as `std::ostringstream`, `std::stringstream`, `std::ofstream`, `std::fstream`, into RapidJSON's input stream. ~~~cpp #include #include #include #include using namespace rapidjson; using namespace std; Document d; d.Parse(json); // ... ofstream ofs("output.json"); OStreamWrapper osw(ofs); Writer writer(osw); d.Accept(writer); ~~~ For classes derived from `std::wostream`, use `WOStreamWrapper`. # Encoded Streams {#EncodedStreams} Encoded streams do not contain JSON itself, but they wrap byte streams to provide basic encoding/decoding function. As mentioned above, UTF-8 byte streams can be read directly. However, UTF-16 and UTF-32 have endian issue. To handle endian correctly, it needs to convert bytes into characters (e.g. `wchar_t` for UTF-16) while reading, and characters into bytes while writing. Besides, it also need to handle [byte order mark (BOM)](http://en.wikipedia.org/wiki/Byte_order_mark). When reading from a byte stream, it is needed to detect or just consume the BOM if exists. When writing to a byte stream, it can optionally write BOM. If the encoding of stream is known during compile-time, you may use `EncodedInputStream` and `EncodedOutputStream`. If the stream can be UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE JSON, and it is only known in runtime, you may use `AutoUTFInputStream` and `AutoUTFOutputStream`. These streams are defined in `rapidjson/encodedstream.h`. Note that, these encoded streams can be applied to streams other than file. For example, you may have a file in memory, or a custom byte stream, be wrapped in encoded streams. ## EncodedInputStream {#EncodedInputStream} `EncodedInputStream` has two template parameters. The first one is a `Encoding` class, such as `UTF8`, `UTF16LE`, defined in `rapidjson/encodings.h`. The second one is the class of stream to be wrapped. ~~~~~~~~~~cpp #include "rapidjson/document.h" #include "rapidjson/filereadstream.h" // FileReadStream #include "rapidjson/encodedstream.h" // EncodedInputStream #include using namespace rapidjson; FILE* fp = fopen("utf16le.json", "rb"); // non-Windows use "r" char readBuffer[256]; FileReadStream bis(fp, readBuffer, sizeof(readBuffer)); EncodedInputStream, FileReadStream> eis(bis); // wraps bis into eis Document d; // Document is GenericDocument > d.ParseStream<0, UTF16LE<> >(eis); // Parses UTF-16LE file into UTF-8 in memory fclose(fp); ~~~~~~~~~~ ## EncodedOutputStream {#EncodedOutputStream} `EncodedOutputStream` is similar but it has a `bool putBOM` parameter in the constructor, controlling whether to write BOM into output byte stream. ~~~~~~~~~~cpp #include "rapidjson/filewritestream.h" // FileWriteStream #include "rapidjson/encodedstream.h" // EncodedOutputStream #include #include Document d; // Document is GenericDocument > // ... FILE* fp = fopen("output_utf32le.json", "wb"); // non-Windows use "w" char writeBuffer[256]; FileWriteStream bos(fp, writeBuffer, sizeof(writeBuffer)); typedef EncodedOutputStream, FileWriteStream> OutputStream; OutputStream eos(bos, true); // Write BOM Writer, UTF32LE<>> writer(eos); d.Accept(writer); // This generates UTF32-LE file from UTF-8 in memory fclose(fp); ~~~~~~~~~~ ## AutoUTFInputStream {#AutoUTFInputStream} Sometimes an application may want to handle all supported JSON encoding. `AutoUTFInputStream` will detection encoding by BOM first. If BOM is unavailable, it will use characteristics of valid JSON to make detection. If neither method success, it falls back to the UTF type provided in constructor. Since the characters (code units) may be 8-bit, 16-bit or 32-bit. `AutoUTFInputStream` requires a character type which can hold at least 32-bit. We may use `unsigned`, as in the template parameter: ~~~~~~~~~~cpp #include "rapidjson/document.h" #include "rapidjson/filereadstream.h" // FileReadStream #include "rapidjson/encodedstream.h" // AutoUTFInputStream #include using namespace rapidjson; FILE* fp = fopen("any.json", "rb"); // non-Windows use "r" char readBuffer[256]; FileReadStream bis(fp, readBuffer, sizeof(readBuffer)); AutoUTFInputStream eis(bis); // wraps bis into eis Document d; // Document is GenericDocument > d.ParseStream<0, AutoUTF >(eis); // This parses any UTF file into UTF-8 in memory fclose(fp); ~~~~~~~~~~ When specifying the encoding of stream, uses `AutoUTF` as in `ParseStream()` above. You can obtain the type of UTF via `UTFType GetType()`. And check whether a BOM is found by `HasBOM()` ## AutoUTFOutputStream {#AutoUTFOutputStream} Similarly, to choose encoding for output during runtime, we can use `AutoUTFOutputStream`. This class is not automatic *per se*. You need to specify the UTF type and whether to write BOM in runtime. ~~~~~~~~~~cpp using namespace rapidjson; void WriteJSONFile(FILE* fp, UTFType type, bool putBOM, const Document& d) { char writeBuffer[256]; FileWriteStream bos(fp, writeBuffer, sizeof(writeBuffer)); typedef AutoUTFOutputStream OutputStream; OutputStream eos(bos, type, putBOM); Writer, AutoUTF<> > writer; d.Accept(writer); } ~~~~~~~~~~ `AutoUTFInputStream` and `AutoUTFOutputStream` is more convenient than `EncodedInputStream` and `EncodedOutputStream`. They just incur a little bit runtime overheads. # Custom Stream {#CustomStream} In addition to memory/file streams, user can create their own stream classes which fits RapidJSON's API. For example, you may create network stream, stream from compressed file, etc. RapidJSON combines different types using templates. A class containing all required interface can be a stream. The Stream interface is defined in comments of `rapidjson/rapidjson.h`: ~~~~~~~~~~cpp concept Stream { typename Ch; //!< Character type of the stream. //! Read the current character from stream without moving the read cursor. Ch Peek() const; //! Read the current character from stream and moving the read cursor to next character. Ch Take(); //! Get the current read cursor. //! \return Number of characters read from start. size_t Tell(); //! Begin writing operation at the current read pointer. //! \return The begin writer pointer. Ch* PutBegin(); //! Write a character. void Put(Ch c); //! Flush the buffer. void Flush(); //! End the writing operation. //! \param begin The begin write pointer returned by PutBegin(). //! \return Number of characters written. size_t PutEnd(Ch* begin); } ~~~~~~~~~~ For input stream, they must implement `Peek()`, `Take()` and `Tell()`. For output stream, they must implement `Put()` and `Flush()`. There are two special interface, `PutBegin()` and `PutEnd()`, which are only for *in situ* parsing. Normal streams do not implement them. However, if the interface is not needed for a particular stream, it is still need to a dummy implementation, otherwise will generate compilation error. ## Example: istream wrapper {#ExampleIStreamWrapper} The following example is a simple wrapper of `std::istream`, which only implements 3 functions. ~~~~~~~~~~cpp class MyIStreamWrapper { public: typedef char Ch; MyIStreamWrapper(std::istream& is) : is_(is) { } Ch Peek() const { // 1 int c = is_.peek(); return c == std::char_traits::eof() ? '\0' : (Ch)c; } Ch Take() { // 2 int c = is_.get(); return c == std::char_traits::eof() ? '\0' : (Ch)c; } size_t Tell() const { return (size_t)is_.tellg(); } // 3 Ch* PutBegin() { assert(false); return 0; } void Put(Ch) { assert(false); } void Flush() { assert(false); } size_t PutEnd(Ch*) { assert(false); return 0; } private: MyIStreamWrapper(const MyIStreamWrapper&); MyIStreamWrapper& operator=(const MyIStreamWrapper&); std::istream& is_; }; ~~~~~~~~~~ User can use it to wrap instances of `std::stringstream`, `std::ifstream`. ~~~~~~~~~~cpp const char* json = "[1,2,3,4]"; std::stringstream ss(json); MyIStreamWrapper is(ss); Document d; d.ParseStream(is); ~~~~~~~~~~ Note that, this implementation may not be as efficient as RapidJSON's memory or file streams, due to internal overheads of the standard library. ## Example: ostream wrapper {#ExampleOStreamWrapper} The following example is a simple wrapper of `std::istream`, which only implements 2 functions. ~~~~~~~~~~cpp class MyOStreamWrapper { public: typedef char Ch; MyOStreamWrapper(std::ostream& os) : os_(os) { } Ch Peek() const { assert(false); return '\0'; } Ch Take() { assert(false); return '\0'; } size_t Tell() const { } Ch* PutBegin() { assert(false); return 0; } void Put(Ch c) { os_.put(c); } // 1 void Flush() { os_.flush(); } // 2 size_t PutEnd(Ch*) { assert(false); return 0; } private: MyOStreamWrapper(const MyOStreamWrapper&); MyOStreamWrapper& operator=(const MyOStreamWrapper&); std::ostream& os_; }; ~~~~~~~~~~ User can use it to wrap instances of `std::stringstream`, `std::ofstream`. ~~~~~~~~~~cpp Document d; // ... std::stringstream ss; MyOStreamWrapper os(ss); Writer writer(os); d.Accept(writer); ~~~~~~~~~~ Note that, this implementation may not be as efficient as RapidJSON's memory or file streams, due to internal overheads of the standard library. # Summary {#Summary} This section describes stream classes available in RapidJSON. Memory streams are simple. File stream can reduce the memory required during JSON parsing and generation, if the JSON is stored in file system. Encoded streams converts between byte streams and character streams. Finally, user may create custom streams using a simple interface. asymptote-3.05/LspCpp/third_party/rapidjson/doc/performance.md0000644000000000000000000000236415031566105023306 0ustar rootroot# Performance There is a [native JSON benchmark collection] [1] which evaluates speed, memory usage and code size of various operations among 37 JSON libraries. [1]: https://github.com/miloyip/nativejson-benchmark The old performance article for RapidJSON 0.1 is provided [here](https://code.google.com/p/rapidjson/wiki/Performance). Additionally, you may refer to the following third-party benchmarks. ## Third-party benchmarks * [Basic benchmarks for miscellaneous C++ JSON parsers and generators](https://github.com/mloskot/json_benchmark) by Mateusz Loskot (Jun 2013) * [casablanca](https://casablanca.codeplex.com/) * [json_spirit](https://github.com/cierelabs/json_spirit) * [jsoncpp](http://jsoncpp.sourceforge.net/) * [libjson](http://sourceforge.net/projects/libjson/) * [rapidjson](https://github.com/Tencent/rapidjson/) * [QJsonDocument](http://qt-project.org/doc/qt-5.0/qtcore/qjsondocument.html) * [JSON Parser Benchmarking](http://chadaustin.me/2013/01/json-parser-benchmarking/) by Chad Austin (Jan 2013) * [sajson](https://github.com/chadaustin/sajson) * [rapidjson](https://github.com/Tencent/rapidjson/) * [vjson](https://code.google.com/p/vjson/) * [YAJL](http://lloyd.github.com/yajl/) * [Jansson](http://www.digip.org/jansson/) asymptote-3.05/LspCpp/third_party/rapidjson/doc/internals.md0000644000000000000000000005363215031566105023010 0ustar rootroot# Internals This section records some design and implementation details. [TOC] # Architecture {#Architecture} ## SAX and DOM The basic relationships of SAX and DOM is shown in the following UML diagram. ![Architecture UML class diagram](diagram/architecture.png) The core of the relationship is the `Handler` concept. From the SAX side, `Reader` parses a JSON from a stream and publish events to a `Handler`. `Writer` implements the `Handler` concept to handle the same set of events. From the DOM side, `Document` implements the `Handler` concept to build a DOM according to the events. `Value` supports a `Value::Accept(Handler&)` function, which traverses the DOM to publish events. With this design, SAX is not dependent on DOM. Even `Reader` and `Writer` have no dependencies between them. This provides flexibility to chain event publisher and handlers. Besides, `Value` does not depends on SAX as well. So, in addition to stringify a DOM to JSON, user may also stringify it to a XML writer, or do anything else. ## Utility Classes Both SAX and DOM APIs depends on 3 additional concepts: `Allocator`, `Encoding` and `Stream`. Their inheritance hierarchy is shown as below. ![Utility classes UML class diagram](diagram/utilityclass.png) # Value {#Value} `Value` (actually a typedef of `GenericValue>`) is the core of DOM API. This section describes the design of it. ## Data Layout {#DataLayout} `Value` is a [variant type](http://en.wikipedia.org/wiki/Variant_type). In RapidJSON's context, an instance of `Value` can contain 1 of 6 JSON value types. This is possible by using `union`. Each `Value` contains two members: `union Data data_` and a`unsigned flags_`. The `flags_` indicates the JSON type, and also additional information. The following tables show the data layout of each type. The 32-bit/64-bit columns indicates the size of the field in bytes. | Null | |32-bit|64-bit| |-------------------|----------------------------------|:----:|:----:| | (unused) | |4 |8 | | (unused) | |4 |4 | | (unused) | |4 |4 | | `unsigned flags_` | `kNullType kNullFlag` |4 |4 | | Bool | |32-bit|64-bit| |-------------------|----------------------------------------------------|:----:|:----:| | (unused) | |4 |8 | | (unused) | |4 |4 | | (unused) | |4 |4 | | `unsigned flags_` | `kBoolType` (either `kTrueFlag` or `kFalseFlag`) |4 |4 | | String | |32-bit|64-bit| |---------------------|-------------------------------------|:----:|:----:| | `Ch* str` | Pointer to the string (may own) |4 |8 | | `SizeType length` | Length of string |4 |4 | | (unused) | |4 |4 | | `unsigned flags_` | `kStringType kStringFlag ...` |4 |4 | | Object | |32-bit|64-bit| |---------------------|-------------------------------------|:----:|:----:| | `Member* members` | Pointer to array of members (owned) |4 |8 | | `SizeType size` | Number of members |4 |4 | | `SizeType capacity` | Capacity of members |4 |4 | | `unsigned flags_` | `kObjectType kObjectFlag` |4 |4 | | Array | |32-bit|64-bit| |---------------------|-------------------------------------|:----:|:----:| | `Value* values` | Pointer to array of values (owned) |4 |8 | | `SizeType size` | Number of values |4 |4 | | `SizeType capacity` | Capacity of values |4 |4 | | `unsigned flags_` | `kArrayType kArrayFlag` |4 |4 | | Number (Int) | |32-bit|64-bit| |---------------------|-------------------------------------|:----:|:----:| | `int i` | 32-bit signed integer |4 |4 | | (zero padding) | 0 |4 |4 | | (unused) | |4 |8 | | `unsigned flags_` | `kNumberType kNumberFlag kIntFlag kInt64Flag ...` |4 |4 | | Number (UInt) | |32-bit|64-bit| |---------------------|-------------------------------------|:----:|:----:| | `unsigned u` | 32-bit unsigned integer |4 |4 | | (zero padding) | 0 |4 |4 | | (unused) | |4 |8 | | `unsigned flags_` | `kNumberType kNumberFlag kUintFlag kUint64Flag ...` |4 |4 | | Number (Int64) | |32-bit|64-bit| |---------------------|-------------------------------------|:----:|:----:| | `int64_t i64` | 64-bit signed integer |8 |8 | | (unused) | |4 |8 | | `unsigned flags_` | `kNumberType kNumberFlag kInt64Flag ...` |4 |4 | | Number (Uint64) | |32-bit|64-bit| |---------------------|-------------------------------------|:----:|:----:| | `uint64_t i64` | 64-bit unsigned integer |8 |8 | | (unused) | |4 |8 | | `unsigned flags_` | `kNumberType kNumberFlag kInt64Flag ...` |4 |4 | | Number (Double) | |32-bit|64-bit| |---------------------|-------------------------------------|:----:|:----:| | `uint64_t i64` | Double precision floating-point |8 |8 | | (unused) | |4 |8 | | `unsigned flags_` | `kNumberType kNumberFlag kDoubleFlag` |4 |4 | Here are some notes: * To reduce memory consumption for 64-bit architecture, `SizeType` is typedef as `unsigned` instead of `size_t`. * Zero padding for 32-bit number may be placed after or before the actual type, according to the endianness. This makes possible for interpreting a 32-bit integer as a 64-bit integer, without any conversion. * An `Int` is always an `Int64`, but the converse is not always true. ## Flags {#Flags} The 32-bit `flags_` contains both JSON type and other additional information. As shown in the above tables, each JSON type contains redundant `kXXXType` and `kXXXFlag`. This design is for optimizing the operation of testing bit-flags (`IsNumber()`) and obtaining a sequential number for each type (`GetType()`). String has two optional flags. `kCopyFlag` means that the string owns a copy of the string. `kInlineStrFlag` means using [Short-String Optimization](#ShortString). Number is a bit more complicated. For normal integer values, it can contains `kIntFlag`, `kUintFlag`, `kInt64Flag` and/or `kUint64Flag`, according to the range of the integer. For numbers with fraction, and integers larger than 64-bit range, they will be stored as `double` with `kDoubleFlag`. ## Short-String Optimization {#ShortString} [Kosta](https://github.com/Kosta-Github) provided a very neat short-string optimization. The optimization idea is given as follow. Excluding the `flags_`, a `Value` has 12 or 16 bytes (32-bit or 64-bit) for storing actual data. Instead of storing a pointer to a string, it is possible to store short strings in these space internally. For encoding with 1-byte character type (e.g. `char`), it can store maximum 11 or 15 characters string inside the `Value` type. | ShortString (Ch=char) | |32-bit|64-bit| |---------------------|-------------------------------------|:----:|:----:| | `Ch str[MaxChars]` | String buffer |11 |15 | | `Ch invLength` | MaxChars - Length |1 |1 | | `unsigned flags_` | `kStringType kStringFlag ...` |4 |4 | A special technique is applied. Instead of storing the length of string directly, it stores (MaxChars - length). This make it possible to store 11 characters with trailing `\0`. This optimization can reduce memory usage for copy-string. It can also improve cache-coherence thus improve runtime performance. # Allocator {#InternalAllocator} `Allocator` is a concept in RapidJSON: ~~~cpp concept Allocator { static const bool kNeedFree; //!< Whether this allocator needs to call Free(). // Allocate a memory block. // \param size of the memory block in bytes. // \returns pointer to the memory block. void* Malloc(size_t size); // Resize a memory block. // \param originalPtr The pointer to current memory block. Null pointer is permitted. // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.) // \param newSize the new size in bytes. void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); // Free a memory block. // \param pointer to the memory block. Null pointer is permitted. static void Free(void *ptr); }; ~~~ Note that `Malloc()` and `Realloc()` are member functions but `Free()` is static member function. ## MemoryPoolAllocator {#MemoryPoolAllocator} `MemoryPoolAllocator` is the default allocator for DOM. It allocate but do not free memory. This is suitable for building a DOM tree. Internally, it allocates chunks of memory from the base allocator (by default `CrtAllocator`) and stores the chunks as a singly linked list. When user requests an allocation, it allocates memory from the following order: 1. User supplied buffer if it is available. (See [User Buffer section in DOM](doc/dom.md)) 2. If user supplied buffer is full, use the current memory chunk. 3. If the current block is full, allocate a new block of memory. # Parsing Optimization {#ParsingOptimization} ## Skip Whitespaces with SIMD {#SkipwhitespaceWithSIMD} When parsing JSON from a stream, the parser need to skip 4 whitespace characters: 1. Space (`U+0020`) 2. Character Tabulation (`U+000B`) 3. Line Feed (`U+000A`) 4. Carriage Return (`U+000D`) A simple implementation will be simply: ~~~cpp void SkipWhitespace(InputStream& s) { while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t') s.Take(); } ~~~ However, this requires 4 comparisons and a few branching for each character. This was found to be a hot spot. To accelerate this process, SIMD was applied to compare 16 characters with 4 white spaces for each iteration. Currently RapidJSON supports SSE2, SSE4.2 and ARM Neon instructions for this. And it is only activated for UTF-8 memory streams, including string stream or *in situ* parsing. To enable this optimization, need to define `RAPIDJSON_SSE2`, `RAPIDJSON_SSE42` or `RAPIDJSON_NEON` before including `rapidjson.h`. Some compilers can detect the setting, as in `perftest.h`: ~~~cpp // __SSE2__ and __SSE4_2__ are recognized by gcc, clang, and the Intel compiler. // We use -march=native with gmake to enable -msse2 and -msse4.2, if supported. // Likewise, __ARM_NEON is used to detect Neon. #if defined(__SSE4_2__) # define RAPIDJSON_SSE42 #elif defined(__SSE2__) # define RAPIDJSON_SSE2 #elif defined(__ARM_NEON) # define RAPIDJSON_NEON #endif ~~~ Note that, these are compile-time settings. Running the executable on a machine without such instruction set support will make it crash. ### Page boundary issue In an early version of RapidJSON, [an issue](https://code.google.com/archive/p/rapidjson/issues/104) reported that the `SkipWhitespace_SIMD()` causes crash very rarely (around 1 in 500,000). After investigation, it is suspected that `_mm_loadu_si128()` accessed bytes after `'\0'`, and across a protected page boundary. In [Intel® 64 and IA-32 Architectures Optimization Reference Manual ](http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html), section 10.2.1: > To support algorithms requiring unaligned 128-bit SIMD memory accesses, memory buffer allocation by a caller function should consider adding some pad space so that a callee function can safely use the address pointer safely with unaligned 128-bit SIMD memory operations. > The minimal padding size should be the width of the SIMD register that might be used in conjunction with unaligned SIMD memory access. This is not feasible as RapidJSON should not enforce such requirement. To fix this issue, currently the routine process bytes up to the next aligned address. After tha, use aligned read to perform SIMD processing. Also see [#85](https://github.com/Tencent/rapidjson/issues/85). ## Local Stream Copy {#LocalStreamCopy} During optimization, it is found that some compilers cannot localize some member data access of streams into local variables or registers. Experimental results show that for some stream types, making a copy of the stream and used it in inner-loop can improve performance. For example, the actual (non-SIMD) implementation of `SkipWhitespace()` is implemented as: ~~~cpp template void SkipWhitespace(InputStream& is) { internal::StreamLocalCopy copy(is); InputStream& s(copy.s); while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t') s.Take(); } ~~~ Depending on the traits of stream, `StreamLocalCopy` will make (or not make) a copy of the stream object, use it locally and copy the states of stream back to the original stream. ## Parsing to Double {#ParsingDouble} Parsing string into `double` is difficult. The standard library function `strtod()` can do the job but it is slow. By default, the parsers use normal precision setting. This has has maximum 3 [ULP](http://en.wikipedia.org/wiki/Unit_in_the_last_place) error and implemented in `internal::StrtodNormalPrecision()`. When using `kParseFullPrecisionFlag`, the parsers calls `internal::StrtodFullPrecision()` instead, and this function actually implemented 3 versions of conversion methods. 1. [Fast-Path](http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/). 2. Custom DIY-FP implementation as in [double-conversion](https://github.com/floitsch/double-conversion). 3. Big Integer Method as in (Clinger, William D. How to read floating point numbers accurately. Vol. 25. No. 6. ACM, 1990). If the first conversion methods fail, it will try the second, and so on. # Generation Optimization {#GenerationOptimization} ## Integer-to-String conversion {#itoa} The naive algorithm for integer-to-string conversion involves division per each decimal digit. We have implemented various implementations and evaluated them in [itoa-benchmark](https://github.com/miloyip/itoa-benchmark). Although SSE2 version is the fastest but the difference is minor by comparing to the first running-up `branchlut`. And `branchlut` is pure C++ implementation so we adopt `branchlut` in RapidJSON. ## Double-to-String conversion {#dtoa} Originally RapidJSON uses `snprintf(..., ..., "%g")` to achieve double-to-string conversion. This is not accurate as the default precision is 6. Later we also find that this is slow and there is an alternative. Google's V8 [double-conversion](https://github.com/floitsch/double-conversion ) implemented a newer, fast algorithm called Grisu3 (Loitsch, Florian. "Printing floating-point numbers quickly and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.). However, since it is not header-only so that we implemented a header-only version of Grisu2. This algorithm guarantees that the result is always accurate. And in most of cases it produces the shortest (optimal) string representation. The header-only conversion function has been evaluated in [dtoa-benchmark](https://github.com/miloyip/dtoa-benchmark). # Parser {#Parser} ## Iterative Parser {#IterativeParser} The iterative parser is a recursive descent LL(1) parser implemented in a non-recursive manner. ### Grammar {#IterativeParserGrammar} The grammar used for this parser is based on strict JSON syntax: ~~~~~~~~~~ S -> array | object array -> [ values ] object -> { members } values -> non-empty-values | ε non-empty-values -> value addition-values addition-values -> ε | , non-empty-values members -> non-empty-members | ε non-empty-members -> member addition-members addition-members -> ε | , non-empty-members member -> STRING : value value -> STRING | NUMBER | NULL | BOOLEAN | object | array ~~~~~~~~~~ Note that left factoring is applied to non-terminals `values` and `members` to make the grammar be LL(1). ### Parsing Table {#IterativeParserParsingTable} Based on the grammar, we can construct the FIRST and FOLLOW set. The FIRST set of non-terminals is listed below: | NON-TERMINAL | FIRST | |:-----------------:|:--------------------------------:| | array | [ | | object | { | | values | ε STRING NUMBER NULL BOOLEAN { [ | | addition-values | ε COMMA | | members | ε STRING | | addition-members | ε COMMA | | member | STRING | | value | STRING NUMBER NULL BOOLEAN { [ | | S | [ { | | non-empty-members | STRING | | non-empty-values | STRING NUMBER NULL BOOLEAN { [ | The FOLLOW set is listed below: | NON-TERMINAL | FOLLOW | |:-----------------:|:-------:| | S | $ | | array | , $ } ] | | object | , $ } ] | | values | ] | | non-empty-values | ] | | addition-values | ] | | members | } | | non-empty-members | } | | addition-members | } | | member | , } | | value | , } ] | Finally the parsing table can be constructed from FIRST and FOLLOW set: | NON-TERMINAL | [ | { | , | : | ] | } | STRING | NUMBER | NULL | BOOLEAN | |:-----------------:|:---------------------:|:---------------------:|:-------------------:|:-:|:-:|:-:|:-----------------------:|:---------------------:|:---------------------:|:---------------------:| | S | array | object | | | | | | | | | | array | [ values ] | | | | | | | | | | | object | | { members } | | | | | | | | | | values | non-empty-values | non-empty-values | | | ε | | non-empty-values | non-empty-values | non-empty-values | non-empty-values | | non-empty-values | value addition-values | value addition-values | | | | | value addition-values | value addition-values | value addition-values | value addition-values | | addition-values | | | , non-empty-values | | ε | | | | | | | members | | | | | | ε | non-empty-members | | | | | non-empty-members | | | | | | | member addition-members | | | | | addition-members | | | , non-empty-members | | | ε | | | | | | member | | | | | | | STRING : value | | | | | value | array | object | | | | | STRING | NUMBER | NULL | BOOLEAN | There is a great [tool](http://hackingoff.com/compilers/predict-first-follow-set) for above grammar analysis. ### Implementation {#IterativeParserImplementation} Based on the parsing table, a direct(or conventional) implementation that pushes the production body in reverse order while generating a production could work. In RapidJSON, several modifications(or adaptations to current design) are made to a direct implementation. First, the parsing table is encoded in a state machine in RapidJSON. States are constructed by the head and body of production. State transitions are constructed by production rules. Besides, extra states are added for productions involved with `array` and `object`. In this way the generation of array values or object members would be a single state transition, rather than several pop/push operations in the direct implementation. This also makes the estimation of stack size more easier. The state diagram is shown as follows: ![State Diagram](diagram/iterative-parser-states-diagram.png) Second, the iterative parser also keeps track of array's value count and object's member count in its internal stack, which may be different from a conventional implementation. asymptote-3.05/LspCpp/third_party/rapidjson/doc/encoding.zh-cn.md0000644000000000000000000001531415031566105023610 0ustar rootroot# ç¼–ç  æ ¹æ® [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf): > (in Introduction) JSON text is a sequence of Unicode code points. > > 翻译:JSON 文本是 Unicode ç ç‚¹çš„åºåˆ—。 较早的 [RFC4627](http://www.ietf.org/rfc/rfc4627.txt) 申明: > (in §3) JSON text SHALL be encoded in Unicode. The default encoding is UTF-8. > > 翻译:JSON 文本应该以 Unicode ç¼–ç ã€‚缺çœçš„ç¼–ç ä¸º UTF-8。 > (in §6) JSON may be represented using UTF-8, UTF-16, or UTF-32. When JSON is written in UTF-8, JSON is 8bit compatible. When JSON is written in UTF-16 or UTF-32, the binary content-transfer-encoding must be used. > > 翻译:JSON å¯ä½¿ç”¨ UTF-8ã€UTF-16 或 UTF-32 表示。当 JSON 以 UTF-8 写入,该 JSON 是 8 ä½å…¼å®¹çš„。当 JSON 以 UTF-16 或 UTF-32 写入,就必须使用二进制的内容传é€ç¼–ç ã€‚ RapidJSON 支æŒå¤šç§ç¼–ç ã€‚它也能检查 JSON 的编ç ï¼Œä»¥åŠåœ¨ä¸åŒç¼–ç ä¸­è¿›è¡Œè½¬ç ã€‚所有这些功能都是在内部实现,无需使用外部的程åºåº“(如 [ICU](http://site.icu-project.org/))。 [TOC] # Unicode {#Unicode} æ ¹æ® [Unicode 的官方网站](http://www.unicode.org/standard/translations/t-chinese.html): >Unicode ç»™æ¯ä¸ªå­—符æä¾›äº†ä¸€ä¸ªå”¯ä¸€çš„æ•°å­—, ä¸è®ºæ˜¯ä»€ä¹ˆå¹³å°ã€ ä¸è®ºæ˜¯ä»€ä¹ˆç¨‹åºã€ ä¸è®ºæ˜¯ä»€ä¹ˆè¯­è¨€ã€‚ 这些唯一数字称为ç ç‚¹ï¼ˆcode point),其范围介乎 `0x0` 至 `0x10FFFF` 之间。 ## Unicode è½¬æ¢æ ¼å¼ {#UTF} 存储 Unicode ç ç‚¹æœ‰å¤šç§ç¼–ç æ–¹å¼ã€‚这些称为 Unicode è½¬æ¢æ ¼å¼ï¼ˆUnicode Transformation Format, UTF)。RapidJSON æ”¯æŒæœ€å¸¸ç”¨çš„ UTF,包括: * UTF-8:8 ä½å¯å˜é•¿åº¦ç¼–ç ã€‚它把一个ç ç‚¹æ˜ å°„至 1 至 4 个字节。 * UTF-16:16 ä½å¯å˜é•¿åº¦ç¼–ç ã€‚它把一个ç ç‚¹æ˜ å°„至 1 至 2 个 16 ä½ç¼–ç å•å…ƒï¼ˆå³ 2 至 4 个字节)。 * UTF-32:32 ä½å›ºå®šé•¿åº¦ç¼–ç ã€‚它直接把ç ç‚¹æ˜ å°„至å•个 32 ä½ç¼–ç å•å…ƒï¼ˆå³ 4 字节)。 对于 UTF-16 åŠ UTF-32 æ¥è¯´ï¼Œå­—节åºï¼ˆendianness)是有影å“çš„ã€‚åœ¨å†…å­˜ä¸­ï¼Œå®ƒä»¬é€šå¸¸éƒ½æ˜¯ä»¥è¯¥è®¡ç®—æœºçš„å­—èŠ‚åºæ¥å­˜å‚¨ã€‚然而,当è¦å‚¨å­˜åœ¨æ–‡ä»¶ä¸­æˆ–åœ¨ç½‘ä¸Šä¼ è¾“ï¼Œæˆ‘ä»¬éœ€è¦æŒ‡æ˜Žå­—节åºåˆ—的字节åºï¼Œæ˜¯å°ç«¯ï¼ˆlittle endian, LE)还是大端(big-endian, BE)。 RapidJSON 通过 `rapidjson/encodings.h` 中的 struct 去æä¾›å„ç§ç¼–ç ï¼š ~~~~~~~~~~cpp namespace rapidjson { template struct UTF8; template struct UTF16; template struct UTF16LE; template struct UTF16BE; template struct UTF32; template struct UTF32LE; template struct UTF32BE; } // namespace rapidjson ~~~~~~~~~~ 对于在内存中的文本,我们正常会使用 `UTF8`ã€`UTF16` 或 `UTF32`。对于处ç†ç»è¿‡ I/O 的文本,我们å¯ä½¿ç”¨ `UTF8`ã€`UTF16LE`ã€`UTF16BE`ã€`UTF32LE` 或 `UTF32BE`。 当使用 DOM 风格的 API,`GenericValue` åŠ `GenericDocument` 里的 `Encoding` 模æ¿å‚数是用于指明内存中存储的 JSON 字符串使用哪ç§ç¼–ç ã€‚å› æ­¤é€šå¸¸æˆ‘ä»¬ä¼šåœ¨æ­¤å‚æ•°ä¸­ä½¿ç”¨ `UTF8`ã€`UTF16` 或 `UTF32`。如何选择,视乎应用软件所使用的æ“作系统åŠå…¶ä»–程åºåº“。例如,Windows API 使用 UTF-16 表示 Unicode 字符,而多数的 Linux å‘行版本åŠåº”用软件则更喜欢 UTF-8。 使用 UTF-16 çš„ DOM 声明例å­ï¼š ~~~~~~~~~~cpp typedef GenericDocument > WDocument; typedef GenericValue > WValue; ~~~~~~~~~~ å¯ä»¥åœ¨ [DOM's Encoding](doc/stream.zh-cn.md) 一节看到更详细的使用例å­ã€‚ ## 字符类型 {#CharacterType} 从之å‰çš„声明中å¯ä»¥çœ‹åˆ°ï¼Œæ¯ä¸ªç¼–ç éƒ½æœ‰ä¸€ä¸ª `CharType` 模æ¿å‚数。这å¯èƒ½æ¯”较容易混淆,实际上,æ¯ä¸ª `CharType` 存储一个编ç å•å…ƒï¼Œè€Œä¸æ˜¯ä¸€ä¸ªå­—符(ç ç‚¹ï¼‰ã€‚如之剿‰€è°ˆåŠï¼Œåœ¨ UTF-8 中一个ç ç‚¹å¯èƒ½ä¼šç¼–ç æˆ 1 至 4 个编ç å•元。 对于 `UTF16(LE|BE)` åŠ `UTF32(LE|BE)` æ¥è¯´ï¼Œ`CharType` 必须分别是一个至少 2 åŠ 4 字节的整数类型。 æ³¨æ„ C++11 新添了 `char16_t` åŠ `char32_t` 类型,也å¯åˆ†åˆ«ç”¨äºŽ `UTF16` åŠ `UTF32`。 ## AutoUTF {#AutoUTF} 上述所介ç»çš„ç¼–ç éƒ½æ˜¯åœ¨ç¼–è¯‘æœŸé™æ€æŒ·å®šçš„。æ¢å¥è¯è¯´ï¼Œä½¿ç”¨è€…必须知é“内存或æµä¹‹ä¸­ä½¿ç”¨äº†å“ªç§ç¼–ç ã€‚然而,有时候我们å¯èƒ½éœ€è¦è¯»å†™ä¸åŒç¼–ç çš„æ–‡ä»¶ï¼Œè€Œä¸”这些编ç éœ€è¦åœ¨è¿è¡Œæ—¶æ‰èƒ½å†³å®šã€‚ `AutoUTF` 是为此而设计的编ç ã€‚它根æ®è¾“å…¥æˆ–è¾“å‡ºæµæ¥é€‰æ‹©ä½¿ç”¨å“ªç§ç¼–ç ã€‚ç›®å‰å®ƒåº”该与 `EncodedInputStream` åŠ `EncodedOutputStream` 结åˆä½¿ç”¨ã€‚ ## ASCII {#ASCII} 虽然 JSON 标准并未æåŠ [ASCII](http://en.wikipedia.org/wiki/ASCII),有时候我们希望写入 7 ä½çš„ ASCII JSONï¼Œä»¥ä¾›æœªèƒ½å¤„ç† UTF-8 的应用程åºä½¿ç”¨ã€‚由于任 JSON 都å¯ä»¥æŠŠ Unicode 字符表示为 `\uXXXX` 转义åºåˆ—,JSON 总是å¯ç”¨ ASCII æ¥ç¼–ç ã€‚ ä»¥ä¸‹çš„ä¾‹å­æŠŠ UTF-8 çš„ DOM å†™æˆ ASCII çš„ JSON: ~~~~~~~~~~cpp using namespace rapidjson; Document d; // UTF8<> // ... StringBuffer buffer; Writer > writer(buffer); d.Accept(writer); std::cout << buffer.GetString(); ~~~~~~~~~~ ASCII å¯ç”¨äºŽè¾“å…¥æµã€‚当输入æµåŒ…å«å¤§äºŽ 127 的字节,就会导致 `kParseErrorStringInvalidEncoding` 错误。 ASCII * ä¸èƒ½ * 用于内存(`Document` 的编ç ï¼Œæˆ– `Reader` 的目标编ç ),因为它ä¸èƒ½è¡¨ç¤º Unicode ç ç‚¹ã€‚ # 校验åŠè½¬ç  {#ValidationTranscoding} 当 RapidJSON è§£æžä¸€ä¸ª JSON 时,它能校验输入 JSONï¼Œåˆ¤æ–­å®ƒæ˜¯å¦æ‰€æ ‡æ˜Žç¼–ç çš„åˆæ³•åºåˆ—。è¦å¼€å¯æ­¤é€‰é¡¹ï¼Œè¯·æŠŠ `kParseValidateEncodingFlag` 加入 `parseFlags` 模æ¿å‚数。 若输入编ç å’Œè¾“出编ç å¹¶ä¸ç›¸åŒï¼Œ`Reader` åŠ `Writer` 会算把文本转ç ã€‚åœ¨è¿™ç§æƒ…况下,并ä¸éœ€è¦ `kParseValidateEncodingFlag`,因为它必须解ç è¾“å…¥åºåˆ—。若åºåˆ—ä¸èƒ½è¢«è§£ç ï¼Œå®ƒå¿…然是ä¸åˆæ³•的。 ## 转ç å™¨ {#Transcoder} 虽然 RapidJSON 的编ç åŠŸèƒ½æ˜¯ä¸º JSON è§£æžï¼ç”Ÿæˆè€Œè®¾è®¡ï¼Œä½¿ç”¨è€…也å¯ä»¥â€œæ»¥ç”¨â€å®ƒä»¬æ¥ä¸ºéž JSON 字符串转ç ã€‚ ä»¥ä¸‹çš„ä¾‹å­æŠŠ UTF-8 å­—ç¬¦ä¸²è½¬ç æˆ UTF-16: ~~~~~~~~~~cpp #include "rapidjson/encodings.h" using namespace rapidjson; const char* s = "..."; // UTF-8 string StringStream source(s); GenericStringBuffer > target; bool hasError = false; while (source.Peek() != '\0') if (!Transcoder, UTF16<> >::Transcode(source, target)) { hasError = true; break; } if (!hasError) { const wchar_t* t = target.GetString(); // ... } ~~~~~~~~~~ 你也å¯ä»¥ç”¨ `AutoUTF` åŠå¯¹åº”çš„æµæ¥åœ¨è¿è¡Œæ—¶è®¾ç½®å†…æºï¼ç›®çš„之编ç ã€‚ asymptote-3.05/LspCpp/third_party/rapidjson/doc/features.zh-cn.md0000644000000000000000000001130515031566105023634 0ustar rootroot# 特点 ## 总体 * è·¨å¹³å° * 编译器:Visual Studioã€gccã€clang ç­‰ * 架构:x86ã€x64ã€ARM ç­‰ * æ“作系统:Windowsã€Mac OS Xã€Linuxã€iOSã€Android ç­‰ * 容易安装 * åªæœ‰å¤´æ–‡ä»¶çš„库。åªéœ€æŠŠå¤´æ–‡ä»¶å¤åˆ¶è‡³ä½ çš„项目中。 * ç‹¬ç«‹ã€æœ€å°ä¾èµ– * ä¸éœ€ä¾èµ– STLã€BOOST 等。 * åªåŒ…å« ``, ``, ``, ``, ``, ``。 * 没使用 C++ 异常ã€RTTI * 高性能 * 使用模版åŠå†…è”函数去é™ä½Žå‡½æ•°è°ƒç”¨å¼€é”€ã€‚ * 内部ç»ä¼˜åŒ–çš„ Grisu2 åŠæµ®ç‚¹æ•°è§£æžå®žçŽ°ã€‚ * å¯é€‰çš„ SSE2/SSE4.2 支æŒã€‚ ## ç¬¦åˆæ ‡å‡† * RapidJSON åº”å®Œå…¨ç¬¦åˆ RFC4627/ECMA-404 标准。 * æ”¯æŒ JSON Pointer (RFC6901). * æ”¯æŒ JSON Schema Draft v4. * æ”¯æŒ Unicode 代ç†å¯¹ï¼ˆsurrogate pair)。 * 支æŒç©ºå­—符(`"\u0000"`)。 * 例如,å¯ä»¥ä¼˜é›…地解æžåŠå¤„ç† `["Hello\u0000World"]`。å«è¯»å†™å­—符串长度的 API。 * 支æŒå¯é€‰çš„æ”¾å®½è¯­æ³• * å•行(`// ...`)åŠå¤šè¡Œï¼ˆ`/* ... */`) 注释 (`kParseCommentsFlag`)。 * 在对象和数组结æŸå‰å«é€—å· (`kParseTrailingCommasFlag`)。 * `NaN`ã€`Inf`ã€`Infinity`ã€`-Inf` åŠ `-Infinity` 作为 `double` 值 (`kParseNanAndInfFlag`) * [NPM 兼容](https://github.com/Tencent/rapidjson/blob/master/doc/npm.md). ## Unicode * æ”¯æŒ UTF-8ã€UTF-16ã€UTF-32 ç¼–ç ï¼ŒåŒ…括å°ç«¯åºå’Œå¤§ç«¯åºã€‚ * 这些编ç ç”¨äºŽè¾“入输出æµï¼Œä»¥åŠå†…存中的表示。 * 支æŒä»Žè¾“å…¥æµè‡ªåŠ¨æ£€æµ‹ç¼–ç ã€‚ * 内部支æŒç¼–ç çš„转æ¢ã€‚ * 例如,你å¯ä»¥è¯»å–一个 UTF-8 文件,让 RapidJSON 把 JSON 字符串转æ¢è‡³ UTF-16 çš„ DOM。 * 内部支æŒç¼–ç æ ¡éªŒã€‚ * 例如,你å¯ä»¥è¯»å–一个 UTF-8 文件,让 RapidJSON æ£€æŸ¥æ˜¯å¦æ‰€æœ‰ JSON å­—ç¬¦ä¸²æ˜¯åˆæ³•çš„ UTF-8 字节åºåˆ—。 * 支æŒè‡ªå®šä¹‰çš„字符类型。 * 预设的字符类型是:UTF-8 为 `char`,UTF-16 为 `wchar_t`,UTF32 为 `uint32_t`。 * 支æŒè‡ªå®šä¹‰çš„ç¼–ç ã€‚ ## API 风格 * SAX(Simple API for XML)风格 API * 类似于 [SAX](http://en.wikipedia.org/wiki/Simple_API_for_XML), RapidJSON æä¾›ä¸€ä¸ªäº‹ä»¶å¾ªåºè®¿é—®çš„è§£æžå™¨ API(`rapidjson::GenericReader`)。RapidJSON 也æä¾›ä¸€ä¸ªç”Ÿæˆå™¨ API(`rapidjson::Writer`),å¯ä»¥å¤„ç†ç›¸åŒçš„事件集åˆã€‚ * DOM(Document Object Model)风格 API * 类似于 HTMLï¼XML çš„ [DOM](http://en.wikipedia.org/wiki/Document_Object_Model),RapidJSON å¯æŠŠ JSON è§£æžè‡³ä¸€ä¸ª DOM 表示方å¼ï¼ˆ`rapidjson::GenericDocument`),以方便æ“作。如有需è¦ï¼Œå¯æŠŠ DOM 转æ¢ï¼ˆstringify)回 JSON。 * DOM 风格 API(`rapidjson::GenericDocument`)实际上是由 SAX 风格 API(`rapidjson::GenericReader`)实现的。SAX 更快,但有时 DOM æ›´æ˜“ç”¨ã€‚ç”¨æˆ·å¯æ ¹æ®æƒ…况作出选择。 ## è§£æž * 递归å¼ï¼ˆé¢„设)åŠè¿­ä»£å¼è§£æžå™¨ * 递归å¼è§£æžå™¨è¾ƒå¿«ï¼Œä½†åœ¨æžç«¯æƒ…况下å¯å‡ºçŽ°å †æ ˆæº¢å‡ºã€‚ * 迭代å¼è§£æžå™¨ä½¿ç”¨è‡ªå®šä¹‰çš„堆栈去维æŒè§£æžçжæ€ã€‚ * 支æŒåŽŸä½ï¼ˆ*in situ*)解æžã€‚ * 把 JSON 字符串的值解æžè‡³åŽŸ JSON 之中,然åŽè®© DOM 指å‘那些字符串。 * æ¯”å¸¸è§„åˆ†æžæ›´å¿«ï¼šä¸éœ€å­—符串的内存分é…ã€ä¸éœ€å¤åˆ¶ï¼ˆå¦‚字符串ä¸å«è½¬ä¹‰ç¬¦ï¼‰ã€ç¼“å­˜å‹å¥½ã€‚ * 对于 JSON æ•°å­—ç±»åž‹ï¼Œæ”¯æŒ 32-bit/64-bit 的有å·ï¼æ— å·æ•´æ•°ï¼Œä»¥åŠ `double`。 * é”™è¯¯å¤„ç† * 支æŒè¯¦å°½çš„è§£æžé”™è¯¯ä»£å·ã€‚ * æ”¯æŒæœ¬åœ°åŒ–错误信æ¯ã€‚ ## DOM (Document) * RapidJSON åœ¨ç±»åž‹è½¬æ¢æ—¶ä¼šæ£€æŸ¥æ•°å€¼çš„范围。 * 字符串字é¢é‡çš„优化 * åªå‚¨å­˜æŒ‡é’ˆï¼Œä¸ä½œå¤åˆ¶ * 优化“短â€å­—符串 * 在 `Value` 内储存短字符串,无需é¢å¤–分é…。 * 对 UTF-8 字符串æ¥è¯´ï¼Œ32 使ž¶æž„下å¯å­˜å‚¨æœ€å¤š 11 字符,64 ä½ä¸‹ 21 字符(x86-64 下 13 字符)。 * å¯é€‰åœ°æ”¯æŒ `std::string`(定义 `RAPIDJSON_HAS_STDSTRING=1`) ## ç”Ÿæˆ * æ”¯æŒ `rapidjson::PrettyWriter` 去加入æ¢è¡ŒåŠç¼©è¿›ã€‚ ## è¾“å…¥è¾“å‡ºæµ * æ”¯æŒ `rapidjson::GenericStringBuffer`,把输出的 JSON 储存于字符串内。 * æ”¯æŒ `rapidjson::FileReadStream` åŠ `rapidjson::FileWriteStream`,使用 `FILE` 对象作输入输出。 * 支æŒè‡ªå®šä¹‰è¾“入输出æµã€‚ ## 内存 * 最å°åŒ– DOM 的内存开销。 * 对大部分 32ï¼64 使œºå™¨è€Œè¨€ï¼Œæ¯ä¸ª JSON 值åªå  16 或 20 字节(ä¸åŒ…å«å­—符串)。 * 支æŒå¿«é€Ÿçš„预设分é…器。 * 它是一个堆栈形å¼çš„分é…器(顺åºåˆ†é…,ä¸å®¹è®¸å•独释放,适åˆè§£æžè¿‡ç¨‹ä¹‹ç”¨ï¼‰ã€‚ * ä½¿ç”¨è€…ä¹Ÿå¯æä¾›ä¸€ä¸ªé¢„åˆ†é…的缓冲区。(有å¯èƒ½è¾¾è‡³æ— éœ€ CRT 分é…就能解æžå¤šä¸ª JSON) * æ”¯æŒæ ‡å‡† CRT(C-runtime)分é…器。 * 支æŒè‡ªå®šä¹‰åˆ†é…器。 ## å…¶ä»– * 一些 C++11 的支æŒï¼ˆå¯é€‰ï¼‰ * å³å€¼å¼•用(rvalue reference) * `noexcept` 修饰符 * 范围 for 循环 asymptote-3.05/LspCpp/third_party/rapidjson/doc/logo/0000755000000000000000000000000015031566105021416 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/doc/logo/rapidjson.png0000644000000000000000000001221315031566105024114 0ustar rootroot‰PNG  IHDRú4£%ùsBIT|dˆ pHYs+©™tEXtSoftwarewww.inkscape.org›î<IDATxœíyØ_ÓµÇ?+ƒˆ¢1ÅTІ˜¯¡´4b,U }´1—jÓV«(ÚRn«†‹âª^SQSÂÕº¨‹håÞª bŒ"iˆ±’ DbÝ?ÖùÅy÷Ùgï}Îï—W’÷÷}žý¼Ï{Î^kíß9{íaíµÖU¥O"Ò@UßìD™'‡ä.ݪª'u–üº‘>ÀzÀªÀJÀ?W€×Tuáb–½°vVægr_QÕ¹‹Sn+Ðã“n@W†ˆ| ¸ ØP¹8LUßïñ{Csÿ¿ª,";ë´Hö\UýCjål üW¬ÍÛ==ÕŠÈàZàUÓŠ†ŠÈêÀáÀ‘Àú%rï®ƫ껉|{_‰T›¨ª3*´uGlr1_B3ºˆ¬œŸ(g>ð0 ø+0AUßJmdW„ˆ\†u <SÕ«³ÜîÀ;À ¹ËÛ«ê_4·_nQ^TÕuc•D¤7pp,ÛÃ{À9À™ªúAfŠø3à8ü‹¯ßRÕ[ø÷Ãt%„+UõðDÙˆÈmÀ—<·AUK ð5@k–À5ÀÐŒ®\€‰žçvK'ÈÝÌ‘ù!Ð;BsK}Á-ÓÚ¸ ðd“r¦;Õx>CIMȽX."£_Ÿ÷Ú}[ Ÿ3»t¿#¶‰Ü¡;6PLwÖjÃð„çZt6hÜ÷ú¤ª¾× r“ "÷Ÿi’ÕPà>]Aö§€-š;¸QDšÝ÷¾Ù$€×§¢7Ð ¸LDŽn¯e '¿feps'ÈußëC 3 "Ò¸X­E,»׊ˆoIëÊÜÕ"Ùû—·€Ï1"Ò«Y&¥#N¶Gî\¾¸ÉS}y``0°3þ‘ø|¹_U§Ôlë2Uì+"ƒì_}©“Doëüÿ·N’›‚ÓÐþ}*¶êy膟¶FbJíCOà¹CUx߀õãÞzcVÿƈÈ8­`xô`p0pE<‚V÷M±Ù8›Uõ®ÃÌÐs4p°JîV/à'ÀWk´s™†ª¾ØY²²ã©MœË)Šþ+lõáÃÑ~¸¿Ïk™‘µ€oÚp)pœo›!"k?¾á¡S਒‹È¾À²ÿœ üYUÿžM„;dò¾ »PDîUÕy:1|&=´±?†â¦¾ÃÀúùÀ Ÿ¤¬«`'ç̺7ÉówžwÝ(›Wàs|€ÏD [0ãbžöšžÀ³ÙúèOÐ*p²‡&Å—/#~{™1nlhîîã¦i‡U½¸Þ¹ÜØ.•G‹î{}T³£Iì¸w±ª~c ªã°Fÿ œ!lXrï%`U}' ó,̾R†#ED"mˆá{ÍWQô:›;<×|Nmt–äýùZ{O¦2QÕËG€™ÀAÞ—Cxé}šªÎLû}ìHÙ‡u]x„°»ˆlT—ث虫ŸË´N‡xÚs­_ >m´î¾$)z¨oT öшgYfiQrûàêajv–UKá“á~Ï5¾[G”ã¶¢8´êfv]B |³´öÇüçb#÷¬ìïTà m¡WžˆtÃN†ag³Ëa`榛1;Ddl[´9f©í|„ù‚¿ º¯ƒÒ%æh {Jî¤ÜX€ªNN¬º?åzp{Åw{f!÷a· |Î>ï¹>FDNN\atD¢qaЧ†‘æPІ½+ò”ýð=¼Be:p;08À{}Ýιû=°‘xJ@ÎsÀn“k¨\@ #%6ïýίø|˜UUfI;ZeŒ+3&)6hE R5Ú~U@æ>yõæøm«2Æõ.¹W0ì%<¿RcÜÖÎÿOk½Mÿ?Âü࣑UEäJàÌQ5 b°æ_†•=×ffòûÀŽ5†zê50¸CDªÐ6ŸgZ¥ãÙ˜œµq$éþØy<\ƒfqâ¾À=Á¼ÍFµXfÈnRFjÇ~¡­P´óJ®+"ËUà”ãš6Äe ®ëáCªúÏÚݧ°A3n„S5¼Ìñy@½˜EKM lΣ;peæ>™w MÞ'‹á,ì¸é³©t%X’–í``¡ ¥p“ˆü6 i "²<°qÉí·Uõ•l}v©Ê| |¸ðÙÖ¬Ô"<Š.")Ξu:Äé­¨ĈD䫨,5йõ&p!¶ì]èƒE4­…ÙŇßyº1E[1Aöcíq‘ú®ƒÆcØ1Iãÿ;€5Jh7¦9ô €™ëÕ}¾˜ï´K;3(Åž­Oîš-Úç¶džñê <àç–°íÕ&5Úý…ß»j>‹¯xNÈÕ îѳ:«`¯ÎÎÙ¥{t_CÏp*ÍzTxp”tÆu"´ƒ±ýtžîM`»DÙ½)zD}.Bs‘Sÿ¹¬ã( “y°ç·¡åÔ/åùbG+®¬‰Àj‰ÏÇ•ûrŽ\»eŠžñ[[¡¤*»b«•;€]+ÈÙ/ÀïÖšÏbd€ç#¹zQEÏê]XRç6ìJÆ8wYù<0DD6rÊ"²‹ˆ,"‰È3˜1eG‡~0RãWÑÑ8¶sv(M†à`s:.ÃbN!¸K©!ØÑÙŸ±Œ&1Œ§x\¸e„Æç™<‘!À¿9—§ûi‚Í£Dî’¶?_U};^º·™`Ûº{Dänqýù}ðc¨¶²1„ä•á|Š[.€½³~‘„Šž¹émåÔ†í;Ü2 {×b@|^;〭TÕÝ;w@¶/wˆTõž´Ÿ;ò3?)ðµy6p€ªÎ TKùä&ƒ#du qb+–ÞÔ¼J޹ÚÀOj‘}»?ÂVYU0˃pbÄõ4}V×7"4@ô­ÊLU§b3µ‹nÀwRù¸3úš÷\›‡)ø6ª:*{a¥È^ÄiÎåûTõÜŠr+udYÛ·ºøi…YŠF¹U2»QœñcíÜ›©òø‘ª>–ÚÀ:r—¨êGªúsÌ2^5N¿ðsàÖ@æ”Ñ(S±½¯‹­ÕUõN­ž’Èu|øcÙ¨æîWbÙÎí—=pW@¡lªîó}3z‘Åöïã\¾X«Ç6»¿õy] wªêãªz(¶; {~)Ø 8Ñs=DïÈ©)z3i¡Ëfõo§¤¬Š)úDUž+ƒ±‘î@ÌÔ@wàû"â{˜1|Ñùÿך™+`k:ž+€YmCpëlÌz\îy(ˆÂU¸‡#¿uŠ[KS–ƒ¼ÔÌæ>¨ê«ªz"æïq<‘TÕNõœ¹‡}½šÍ m}›ÉÛ?žb°gp@Œx‘¢—¤Ž*,Tu¾ªÞ„)Šë9tŠˆ¬š“9Œ¢¢LH¥ÏÁ,&«9„à*úµ5fJ0O¥<^® 3¦pû:ÿOQÕ”NíÂÎZª½U£ªç`sbƒôr³Ï<¨¿vÍ\m!Kø´üÈVš–ÜŽ:ÐägôM1ï®á\~ª†Á4†Ð¾4Õ`Ö*ü2poÝÌÀ™GhÐ %‹, ³”)5Vd\€ðü2»BHÑS—w>§–Ô´9¾À•dd/ÍÝ*Ì!Ðt–•lÙî~¢ÈçØPWæšžkU9»RœÅ‡G\HÑ+%‘"òPöͳÊÈü6Êì$=):­„’Yì!"¥~¾ú{Oh„Tõø?òÑâ yºÁ¢ÔQî^3)n[Nºçš»$Òº¤êLóuŠr“4žD°ê™»ÇÑ1õì³E­’éë`U=Ä|IS#庉ÈÙY\~°Å»ùHªX‚3°gUÇ—¢1ø÷/¹½çì\U'Qn”ëMâ9u†ÐGJ’³ã$ ª3 gøÏSt„OþfÅ@–¤€ ìÌï]†Í(Z¦cÙ]|-IG—Ù,ìÛ«.$œ¡A?øAöïw"ÇL¡OMŒÉrðïtÜNž/"?¨˜*9”@±Ìàz9åÞvý€+²ãg/²$¡,LTÕºñíeH‰ÛÿÙè0ŽŽ#À䊣芣È7èÜøê7ˆ|…2£Mq†l”áÚóœú•âŽ)†¶*pR„æX§~êŠg–CwM`ξgólý¿`Wžîz §§î–Øç—Ëf’Ý+<ײˆb'Cxľþ;ºB¿pËíx>`‚­ Ü<n)„ÎÒüŒÞb>„Ò½A4ݹqYÅÎ߇b,øøº#=:0B³#¶—WlßãÒTPüTñ鉿q9>^ÎæËDâɱàŠŠN$QDFw—C77Ö €_dußÅöãyúÿŽÐ®…Yö}åal€Ý‹p<Ë0[Ö¹ž#áË*™Üž˜ÿA¨³~„…A{ >……'ÆŸ!_ž'ðEl;æ¬ny›¹¿‹­˜&QL”R¤Jä5¥è_Ž¿¢cG\îoTQôL¨›dfìEcFwöx Ø¢d;…³þÅL6¯Eäõ ˜¥óЄßöEüŸì™NÂ÷«ñÁ¤ÝÝ}ÀJžº1§ŸF½#0ƒjžö¢ˆ¼K;NJ9¶Bßé ÜÙBÙ¾rPB;l±ÌÙÀÚ‹QÑW¢˜¬¥TÑ÷ñÜVCÑÏòð)(¬‡Î—iðkàÌç,\ãþ«XǾԡû[DÖð’1¸ø6vd6"{é§R\4Êó$ñð¯\æaËÁcÉv,Q€Ú)ØÌ½?öýìëè8ݚѿîÐig_âËД2‘ŠßsÃá«[ ÛWίЎŸ´Hæ|`¯€œ¦=ãsNB[Æ‚‘\%KZr9÷ô8>®?¶7O}€³M3Zwéþû W§ÜCÂLž“»Å•‹[†–ІÒùÊýØVª—çÞ˜„¶Ä–ÝuŸÍëÀºUû£hurÔ—•K¨>è¸HÕò>ö½¶ŒV)ú ŠÛf·Œ3tä/N¨ù‚úbç”y^I†.̨33áζÏѹ{ÐË#r~Óä |8Š„ýµGö|ß ñÄVeÆÇ|¹›ìCYpïï‘ØÖ•°˜÷ªÏçYr)hBÙ7òô˪epXmƒíɫʊeUŠño‰¢g¼nˆ´ilÌÀ“? }²ªúŽˆ\CÇŠ¤ØnU$"›aF«Q“7ÌÅ"wÎԎ類¡cŒȯÛ=F¼ 3¦ìLyüñûØRôwÀušbÊUý¥ˆ<ŠeÓ–“÷9§Ú_‰È$l¯ï ^xÛŒÏñéNñØ3ø²œ¼9ÀQ"2 v!¸2³ZŸÑ6UŒ‘½±/åìI1ઠ3±Yü\5ßðºmø­ˆ<ˆÅ±H<Åã˜#ËõœÓ ÷ýäïUÁÙ„¦gH }"ÈRf™ï‡)Ô ,¬øÞª¿£¢ü±óú-ùøõÇì3³ò¶¥z¬Ù¾â‘¿2¦ìŸÅVJë`[ܲòWU­’ȲӱÄ)ú₈ìHÇ VÕ¥0ÓJmTEèûèË i¬ÛJÞFWAWVô%6¯ym´]YÑ—‰tJm´‘‚.¡èÙ×Qw:¥6ÚXbÑ%bÄÚ̬6ººŠ¢»Ëö'´õé”Úhc‰EWUôöþ¼.…®¢è­HÕFK-–yE‘õÕœËí½.…e^Ñ)Îæó0wÉ6Úè2øæcFOŸ¦IEND®B`‚asymptote-3.05/LspCpp/third_party/rapidjson/doc/logo/rapidjson.svg0000644000000000000000000001020615031566105024127 0ustar rootroot image/svg+xml RapidJSON asymptote-3.05/LspCpp/third_party/rapidjson/doc/npm.md0000644000000000000000000000055315031566105021575 0ustar rootroot## NPM # package.json {#package} ~~~~~~~~~~js { ... "dependencies": { ... "rapidjson": "git@github.com:Tencent/rapidjson.git" }, ... "gypfile": true } ~~~~~~~~~~ # binding.gyp {#binding} ~~~~~~~~~~js { ... 'targets': [ { ... 'include_dirs': [ '`, ``, ``, ``, ``, ``. * Without C++ exception, RTTI * High performance * Use template and inline functions to reduce function call overheads. * Internal optimized Grisu2 and floating point parsing implementations. * Optional SSE2/SSE4.2 support. ## Standard compliance * RapidJSON should be fully RFC4627/ECMA-404 compliance. * Support JSON Pointer (RFC6901). * Support JSON Schema Draft v4. * Support Swagger v2 schema. * Support OpenAPI v3.0.x schema. * Support Unicode surrogate. * Support null character (`"\u0000"`) * For example, `["Hello\u0000World"]` can be parsed and handled gracefully. There is API for getting/setting lengths of string. * Support optional relaxed syntax. * Single line (`// ...`) and multiple line (`/* ... */`) comments (`kParseCommentsFlag`). * Trailing commas at the end of objects and arrays (`kParseTrailingCommasFlag`). * `NaN`, `Inf`, `Infinity`, `-Inf` and `-Infinity` as `double` values (`kParseNanAndInfFlag`) * [NPM compliant](http://github.com/Tencent/rapidjson/blob/master/doc/npm.md). ## Unicode * Support UTF-8, UTF-16, UTF-32 encodings, including little endian and big endian. * These encodings are used in input/output streams and in-memory representation. * Support automatic detection of encodings in input stream. * Support transcoding between encodings internally. * For example, you can read a UTF-8 file and let RapidJSON transcode the JSON strings into UTF-16 in the DOM. * Support encoding validation internally. * For example, you can read a UTF-8 file, and let RapidJSON check whether all JSON strings are valid UTF-8 byte sequence. * Support custom character types. * By default the character types are `char` for UTF8, `wchar_t` for UTF16, `uint32_t` for UTF32. * Support custom encodings. ## API styles * SAX (Simple API for XML) style API * Similar to [SAX](http://en.wikipedia.org/wiki/Simple_API_for_XML), RapidJSON provides a event sequential access parser API (`rapidjson::GenericReader`). It also provides a generator API (`rapidjson::Writer`) which consumes the same set of events. * DOM (Document Object Model) style API * Similar to [DOM](http://en.wikipedia.org/wiki/Document_Object_Model) for HTML/XML, RapidJSON can parse JSON into a DOM representation (`rapidjson::GenericDocument`), for easy manipulation, and finally stringify back to JSON if needed. * The DOM style API (`rapidjson::GenericDocument`) is actually implemented with SAX style API (`rapidjson::GenericReader`). SAX is faster but sometimes DOM is easier. Users can pick their choices according to scenarios. ## Parsing * Recursive (default) and iterative parser * Recursive parser is faster but prone to stack overflow in extreme cases. * Iterative parser use custom stack to keep parsing state. * Support *in situ* parsing. * Parse JSON string values in-place at the source JSON, and then the DOM points to addresses of those strings. * Faster than convention parsing: no allocation for strings, no copy (if string does not contain escapes), cache-friendly. * Support 32-bit/64-bit signed/unsigned integer and `double` for JSON number type. * Support parsing multiple JSONs in input stream (`kParseStopWhenDoneFlag`). * Error Handling * Support comprehensive error code if parsing failed. * Support error message localization. ## DOM (Document) * RapidJSON checks range of numerical values for conversions. * Optimization for string literal * Only store pointer instead of copying * Optimization for "short" strings * Store short string in `Value` internally without additional allocation. * For UTF-8 string: maximum 11 characters in 32-bit, 21 characters in 64-bit (13 characters in x86-64). * Optionally support `std::string` (define `RAPIDJSON_HAS_STDSTRING=1`) ## Generation * Support `rapidjson::PrettyWriter` for adding newlines and indentations. ## Stream * Support `rapidjson::GenericStringBuffer` for storing the output JSON as string. * Support `rapidjson::FileReadStream` and `rapidjson::FileWriteStream` for input/output `FILE` object. * Support custom streams. ## Memory * Minimize memory overheads for DOM. * Each JSON value occupies exactly 16/20 bytes for most 32/64-bit machines (excluding text string). * Support fast default allocator. * A stack-based allocator (allocate sequentially, prohibit to free individual allocations, suitable for parsing). * User can provide a pre-allocated buffer. (Possible to parse a number of JSONs without any CRT allocation) * Support standard CRT(C-runtime) allocator. * Support custom allocators. ## Miscellaneous * Some C++11 support (optional) * Rvalue reference * `noexcept` specifier * Range-based for loop asymptote-3.05/LspCpp/third_party/rapidjson/doc/internals.zh-cn.md0000644000000000000000000005270415031566105024025 0ustar rootroot# 内部架构 本部分记录了一些设计和实现细节。 [TOC] # æž¶æž„ {#Architecture} ## SAX å’Œ DOM 下é¢çš„ UML 图显示了 SAX å’Œ DOM 的基本关系。 ![æž¶æž„ UML 类图](diagram/architecture.png) 关系的核心是 `Handler` 概念。在 SAX 一边,`Reader` 从æµè§£æž JSON 并将事件å‘é€åˆ° `Handler`。`Writer` 实现了 `Handler` 概念,用于处ç†ç›¸åŒçš„事件。在 DOM 一边,`Document` 实现了 `Handler` æ¦‚å¿µï¼Œç”¨äºŽé€šè¿‡è¿™äº›æ—¶é—´æ¥æž„建 DOM。`Value` 支æŒäº† `Value::Accept(Handler&)` 函数,它å¯ä»¥å°† DOM 转æ¢ä¸ºäº‹ä»¶è¿›è¡Œå‘é€ã€‚ 在这个设计,SAX 是ä¸ä¾èµ–于 DOM 的。甚至 `Reader` å’Œ `Writer` 之间也没有ä¾èµ–。这æä¾›äº†è¿žæŽ¥äº‹ä»¶å‘é€å™¨å’Œå¤„ç†å™¨çš„çµæ´»æ€§ã€‚除此之外,`Value` 也是ä¸ä¾èµ–于 SAX 的。所以,除了将 DOM åºåˆ—化为 JSON 之外,用户也å¯ä»¥å°†å…¶åºåˆ—化为 XML,或者åšä»»ä½•其他事情。 ## 工具类 SAX å’Œ DOM API 都ä¾èµ–于3个é¢å¤–的概念:`Allocator`ã€`Encoding` å’Œ `Stream`。它们的继承层次结构如下图所示。 ![工具类 UML 类图](diagram/utilityclass.png) # 值(Value) {#Value} `Value` (实际上被定义为 `GenericValue>`)是 DOM API 的核心。本部分æè¿°äº†å®ƒçš„设计。 ## æ•°æ®å¸ƒå±€ {#DataLayout} `Value` 是[å¯å˜ç±»åž‹](http://en.wikipedia.org/wiki/Variant_type)。在 RapidJSON 的上下文中,一个 `Value` 的实例å¯ä»¥åŒ…å«6ç§ JSON æ•°æ®ç±»åž‹ä¹‹ä¸€ã€‚通过使用 `union` ,这是å¯èƒ½å®žçŽ°çš„ã€‚æ¯ä¸€ä¸ª `Value` 包å«ä¸¤ä¸ªæˆå‘˜ï¼š`union Data data_` å’Œ `unsigned flags_`。`flags_` 表明了 JSON 类型,以åŠé™„加的信æ¯ã€‚ 下表显示了所有类型的数æ®å¸ƒå±€ã€‚32ä½/64ä½åˆ—表明了字段所å ç”¨çš„字节数。 | Null | | 32ä½ | 64ä½ | |-------------------|----------------------------------|:----:|:----:| | (未使用) | |4 |8 | | (未使用) | |4 |4 | | (未使用) | |4 |4 | | `unsigned flags_` | `kNullType kNullFlag` |4 |4 | | Bool | | 32ä½ | 64ä½ | |-------------------|----------------------------------------------------|:----:|:----:| | (未使用) | |4 |8 | | (未使用) | |4 |4 | | (未使用) | |4 |4 | | `unsigned flags_` | `kBoolType` (either `kTrueFlag` or `kFalseFlag`) |4 |4 | | String | | 32ä½ | 64ä½ | |---------------------|-------------------------------------|:----:|:----:| | `Ch* str` | 指å‘字符串的指针(å¯èƒ½æ‹¥æœ‰æ‰€æœ‰æƒï¼‰ |4 |8 | | `SizeType length` | 字符串长度 |4 |4 | | (未使用) | |4 |4 | | `unsigned flags_` | `kStringType kStringFlag ...` |4 |4 | | Object | | 32ä½ | 64ä½ | |---------------------|-------------------------------------|:----:|:----:| | `Member* members` | æŒ‡å‘æˆå‘˜æ•°ç»„的指针(拥有所有æƒï¼‰ |4 |8 | | `SizeType size` | æˆå‘˜æ•°é‡ |4 |4 | | `SizeType capacity` | æˆå‘˜å®¹é‡ |4 |4 | | `unsigned flags_` | `kObjectType kObjectFlag` |4 |4 | | Array | | 32ä½ | 64ä½ | |---------------------|-------------------------------------|:----:|:----:| | `Value* values` | 指å‘值数组的指针(拥有所有æƒï¼‰ |4 |8 | | `SizeType size` | å€¼æ•°é‡ |4 |4 | | `SizeType capacity` | å€¼å®¹é‡ |4 |4 | | `unsigned flags_` | `kArrayType kArrayFlag` |4 |4 | | Number (Int) | | 32ä½ | 64ä½ | |---------------------|-------------------------------------|:----:|:----:| | `int i` | 32使œ‰ç¬¦å·æ•´æ•° |4 |4 | | (零填充) | 0 |4 |4 | | (未使用) | |4 |8 | | `unsigned flags_` | `kNumberType kNumberFlag kIntFlag kInt64Flag ...` |4 |4 | | Number (UInt) | | 32ä½ | 64ä½ | |---------------------|-------------------------------------|:----:|:----:| | `unsigned u` | 32使— ç¬¦å·æ•´æ•° |4 |4 | | (零填充) | 0 |4 |4 | | (未使用) | |4 |8 | | `unsigned flags_` | `kNumberType kNumberFlag kUintFlag kUint64Flag ...` |4 |4 | | Number (Int64) | | 32ä½ | 64ä½ | |---------------------|-------------------------------------|:----:|:----:| | `int64_t i64` | 64使œ‰ç¬¦å·æ•´æ•° |8 |8 | | (未使用) | |4 |8 | | `unsigned flags_` | `kNumberType kNumberFlag kInt64Flag ...` |4 |4 | | Number (Uint64) | | 32ä½ | 64ä½ | |---------------------|-------------------------------------|:----:|:----:| | `uint64_t i64` | 64使— ç¬¦å·æ•´æ•° |8 |8 | | (未使用) | |4 |8 | | `unsigned flags_` | `kNumberType kNumberFlag kInt64Flag ...` |4 |4 | | Number (Double) | | 32ä½ | 64ä½ | |---------------------|-------------------------------------|:----:|:----:| | `uint64_t i64` | åŒç²¾åº¦æµ®ç‚¹æ•° |8 |8 | | (未使用) | |4 |8 | | `unsigned flags_` |`kNumberType kNumberFlag kDoubleFlag`|4 |4 | è¿™é‡Œæœ‰ä¸€äº›éœ€è¦æ³¨æ„的地方: * 为了å‡å°‘在64使ž¶æž„上的内存消耗,`SizeType` 被定义为 `unsigned` è€Œä¸æ˜¯ `size_t`。 * 32使•´æ•°çš„é›¶å¡«å……å¯èƒ½è¢«æ”¾åœ¨å®žé™…类型的å‰é¢æˆ–åŽé¢ï¼Œè¿™ä¾èµ–于字节åºã€‚这使得它å¯ä»¥å°†32使•´æ•°ä¸ç»è¿‡ä»»ä½•转æ¢å°±å¯ä»¥è§£é‡Šä¸º64使•´æ•°ã€‚ * `Int` 永远是 `Int64`,å之ä¸ç„¶ã€‚ ## 标志 {#Flags} 32ä½çš„ `flags_` 包å«äº† JSON 类型和其他信æ¯ã€‚如剿–‡ä¸­çš„表所述,æ¯ä¸€ç§ JSON 类型包å«äº†å†—余的 `kXXXType` å’Œ `kXXXFlag`ã€‚è¿™ä¸ªè®¾è®¡æ˜¯ä¸ºäº†ä¼˜åŒ–æµ‹è¯•ä½æ ‡å¿—(`IsNumber()`ï¼‰å’ŒèŽ·å–æ¯ä¸€ç§ç±»åž‹çš„åºåˆ—å·ï¼ˆ`GetType()`)。 字符串有两个å¯é€‰çš„æ ‡å¿—。`kCopyFlag` 表明这个字符串拥有字符串拷è´çš„æ‰€æœ‰æƒã€‚而 `kInlineStrFlag` æ„味ç€ä½¿ç”¨äº†[短字符串优化](#ShortString)。 æ•°å­—æ›´åŠ å¤æ‚一些。对于普通的整数值,它å¯ä»¥åŒ…å« `kIntFlag`ã€`kUintFlag`〠`kInt64Flag` å’Œ/或 `kUint64Flag`ï¼Œè¿™ç”±æ•´æ•°çš„èŒƒå›´å†³å®šã€‚å¸¦æœ‰å°æ•°æˆ–者超过64使‰€èƒ½è¡¨è¾¾çš„范围的整数的数字会被存储为带有 `kDoubleFlag` çš„ `double`。 ## 短字符串优化 {#ShortString} [Kosta](https://github.com/Kosta-Github) æä¾›äº†å¾ˆæ£’的短字符串优化。这个优化的xxx如下所述。除去 `flags_` ,`Value` 有12或16字节(对于32使ˆ–64ä½ï¼‰æ¥å­˜å‚¨å®žé™…的数æ®ã€‚è¿™ä¸ºåœ¨å…¶å†…éƒ¨ç›´æŽ¥å­˜å‚¨çŸ­å­—ç¬¦ä¸²è€Œä¸æ˜¯å­˜å‚¨å­—符串的指针创造了å¯èƒ½ã€‚对于1字节的字符类型(例如 `char`),它å¯ä»¥åœ¨ `Value` 类型内部存储至多11或15个字符的字符串。 |ShortString (Ch=char)| | 32ä½ | 64ä½ | |---------------------|-------------------------------------|:----:|:----:| | `Ch str[MaxChars]` | 字符串缓冲区 |11 |15 | | `Ch invLength` | MaxChars - Length |1 |1 | | `unsigned flags_` | `kStringType kStringFlag ...` |4 |4 | 这里使用了一项特殊的技术。它存储了 (MaxChars - length) 而ä¸ç›´æŽ¥å­˜å‚¨å­—符串的长度。这使得存储11个字符并且带有åŽç¼€ `\0` æˆä¸ºå¯èƒ½ã€‚ 这个优化å¯ä»¥å‡å°‘字符串拷è´å†…å­˜å ç”¨ã€‚它也改善了缓存一致性,并进一步æé«˜äº†è¿è¡Œæ—¶æ€§èƒ½ã€‚ # 分é…器(Allocator) {#InternalAllocator} `Allocator` 是 RapidJSON 中的概念: ~~~cpp concept Allocator { static const bool kNeedFree; //!< 表明这个分é…器是å¦éœ€è¦è°ƒç”¨ Free()。 // 申请内存å—。 // \param size 内存å—的大å°ï¼Œä»¥å­—节记。 // \returns 指å‘内存å—的指针。 void* Malloc(size_t size); // 调整内存å—的大å°ã€‚ // \param originalPtr 当å‰å†…å­˜å—的指针。空指针是被å…许的。 // \param originalSize 当å‰å¤§å°ï¼Œä»¥å­—节记。(设计问题:因为有些分é…器å¯èƒ½ä¸ä¼šè®°å½•它,显示的传递它å¯ä»¥èŠ‚çº¦å†…å­˜ã€‚ï¼‰ // \param newSize 新大å°ï¼Œä»¥å­—节记。 void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); // 释放内存å—。 // \param ptr 指å‘内存å—的指针。空指针是被å…许的。 static void Free(void *ptr); }; ~~~ éœ€è¦æ³¨æ„的是 `Malloc()` å’Œ `Realloc()` 是æˆå‘˜å‡½æ•°è€Œ `Free()` æ˜¯é™æ€æˆå‘˜å‡½æ•°ã€‚ ## MemoryPoolAllocator {#MemoryPoolAllocator} `MemoryPoolAllocator` 是 DOM 的默认内存分é…器。它åªç”³è¯·å†…存而ä¸é‡Šæ”¾å†…存。这对于构建 DOM æ ‘éžå¸¸åˆé€‚。 在它的内部,它从基础的内存分é…器申请内存å—(默认为 `CrtAllocator`)并将这些内存å—存储为å•å‘链表。当用户请求申请内存,它会éµå¾ªä¸‹åˆ—步骤æ¥ç”³è¯·å†…存: 1. 如果å¯ç”¨ï¼Œä½¿ç”¨ç”¨æˆ·æä¾›çš„ç¼“å†²åŒºã€‚ï¼ˆè§ [User Buffer section in DOM](doc/dom.md)) 2. 如果用户æä¾›çš„缓冲区已满,使用当å‰å†…å­˜å—。 3. 如果当å‰å†…å­˜å—已满,申请新的内存å—。 # è§£æžä¼˜åŒ– {#ParsingOptimization} ## 使用 SIMD 跳过空格 {#SkipwhitespaceWithSIMD} 当从æµä¸­è§£æž JSON 时,解æžå™¨éœ€è¦è·³è¿‡4ç§ç©ºæ ¼å­—符: 1. 空格 (`U+0020`) 2. 制表符 (`U+000B`) 3. æ¢è¡Œ (`U+000A`) 4. 回车 (`U+000D`) 这是一份简å•的实现: ~~~cpp void SkipWhitespace(InputStream& s) { while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t') s.Take(); } ~~~ 但是,这需è¦å¯¹æ¯ä¸ªå­—符进行4次比较以åŠä¸€äº›åˆ†æ”¯ã€‚这被å‘现是一个热点。 为了加速这一处ç†ï¼ŒRapidJSON 使用 SIMD æ¥åœ¨ä¸€æ¬¡è¿­ä»£ä¸­æ¯”较16个字符和4ä¸ªç©ºæ ¼ã€‚ç›®å‰ RapidJSON æ”¯æŒ SSE2 , SSE4.2 å’Œ ARM Neon æŒ‡ä»¤ã€‚åŒæ—¶å®ƒä¹Ÿåªä¼šå¯¹ UTF-8 内存æµå¯ç”¨ï¼ŒåŒ…æ‹¬å­—ç¬¦ä¸²æµæˆ– *原ä½* è§£æžã€‚ ä½ å¯ä»¥é€šè¿‡åœ¨åŒ…å« `rapidjson.h` 之å‰å®šä¹‰ `RAPIDJSON_SSE2` , `RAPIDJSON_SSE42` 或 `RAPIDJSON_NEON` æ¥å¯ç”¨è¿™ä¸ªä¼˜åŒ–。一些编译器å¯ä»¥æ£€æµ‹è¿™ä¸ªè®¾ç½®ï¼Œå¦‚ `perftest.h`: ~~~cpp // __SSE2__ å’Œ __SSE4_2__ å¯è¢« gccã€clang å’Œ Intel 编译器识别: // 如果支æŒçš„è¯ï¼Œæˆ‘们在 gmake 中使用了 -march=native æ¥å¯ç”¨ -msse2 å’Œ -msse4.2 // åŒæ ·çš„, __ARM_NEON 被用于识别Neon #if defined(__SSE4_2__) # define RAPIDJSON_SSE42 #elif defined(__SSE2__) # define RAPIDJSON_SSE2 #elif defined(__ARM_NEON) # define RAPIDJSON_NEON #endif ~~~ éœ€è¦æ³¨æ„çš„æ˜¯ï¼Œè¿™æ˜¯ç¼–è¯‘æœŸçš„è®¾ç½®ã€‚åœ¨ä¸æ”¯æŒè¿™äº›æŒ‡ä»¤çš„æœºå™¨ä¸Šè¿è¡Œå¯æ‰§è¡Œæ–‡ä»¶ä¼šä½¿å®ƒå´©æºƒã€‚ ### 页é¢å¯¹é½é—®é¢˜ 在 RapidJSON 的早期版本中,被报告了[一个问题](https://code.google.com/archive/p/rapidjson/issues/104):`SkipWhitespace_SIMD()` 会罕è§åœ°å¯¼è‡´å´©æºƒï¼ˆçº¦äº”å万分之一的几率)。在调查之åŽï¼Œæ€€ç–‘是 `_mm_loadu_si128()` 访问了 `'\0'` 之åŽçš„å†…å­˜ï¼Œå¹¶è¶Šè¿‡è¢«ä¿æŠ¤çš„é¡µé¢è¾¹ç•Œã€‚ 在 [Intel® 64 and IA-32 Architectures Optimization Reference Manual ](http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html) 中,章节 10.2.1: > 为了支æŒéœ€è¦è´¹å¯¹é½çš„128ä½ SIMD 内存访问的算法,调用者的内存缓冲区申请应当考虑添加一些填充空间,这样被调用的函数å¯ä»¥å®‰å…¨åœ°å°†åœ°å€æŒ‡é’ˆç”¨äºŽæœªå¯¹é½çš„128ä½ SIMD 内存æ“作。 > 在结åˆéžå¯¹é½çš„ SIMD 内存æ“作中,最å°çš„对é½å¤§å°åº”该等于 SIMD 寄存器的大å°ã€‚ 对于 RapidJSON æ¥è¯´ï¼Œè¿™æ˜¾ç„¶æ˜¯ä¸å¯è¡Œçš„,因为 RapidJSON ä¸åº”当强迫用户进行内存对é½ã€‚ 为了修å¤è¿™ä¸ªé—®é¢˜ï¼Œå½“å‰çš„代ç ä¼šå…ˆæŒ‰å­—节处ç†ç›´åˆ°ä¸‹ä¸€ä¸ªå¯¹é½çš„地å€ã€‚在这之åŽï¼Œä½¿ç”¨å¯¹é½è¯»å–æ¥è¿›è¡Œ SIMD 处ç†ã€‚è§ [#85](https://github.com/Tencent/rapidjson/issues/85)。 ## å±€éƒ¨æµæ‹·è´ {#LocalStreamCopy} 在优化的过程中,我们å‘现一些编译器ä¸èƒ½å°†è®¿é—®æµçš„一些æˆå‘˜æ•°æ®æ”¾å…¥å±€éƒ¨å˜é‡æˆ–者寄存器中。测试结果显示,对于一些æµç±»åž‹ï¼Œåˆ›å»ºæµçš„æ‹·è´å¹¶å°†å…¶ç”¨äºŽå†…层循环中å¯ä»¥æ”¹å–„æ€§èƒ½ã€‚ä¾‹å¦‚ï¼Œå®žé™…ï¼ˆéž SIMD)的 `SkipWhitespace()` 被实现为: ~~~cpp template void SkipWhitespace(InputStream& is) { internal::StreamLocalCopy copy(is); InputStream& s(copy.s); while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t') s.Take(); } ~~~ 基于æµçš„特å¾ï¼Œ`StreamLocalCopy` 会创建(或ä¸åˆ›å»ºï¼‰æµå¯¹è±¡çš„æ‹·è´ï¼Œåœ¨å±€éƒ¨ä½¿ç”¨å®ƒå¹¶å°†æµçš„çŠ¶æ€æ‹·è´å›žåŽŸæ¥çš„æµã€‚ ## è§£æžä¸ºåŒç²¾åº¦æµ®ç‚¹æ•° {#ParsingDouble} 将字符串解æžä¸º `double` å¹¶ä¸ç®€å•。标准库函数 `strtod()` å¯ä»¥èƒœä»»è¿™é¡¹å·¥ä½œï¼Œä½†å®ƒæ¯”较缓慢。默认情况下,解æžå™¨ä½¿ç”¨é»˜è®¤çš„精度设置。这最多有 3[ULP](http://en.wikipedia.org/wiki/Unit_in_the_last_place) 的误差,并实现在 `internal::StrtodNormalPrecision()` 中。 当使用 `kParseFullPrecisionFlag` 时,编译器会改为调用 `internal::StrtodFullPrecision()` ,这个函数会自动调用三个版本的转æ¢ã€‚ 1. [Fast-Path](http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/)。 2. [double-conversion](https://github.com/floitsch/double-conversion) 中的自定义 DIY-FP 实现。 3. (Clinger, William D. How to read floating point numbers accurately. Vol. 25. No. 6. ACM, 1990) 中的大整数算法。 å¦‚æžœç¬¬ä¸€ä¸ªè½¬æ¢æ–¹æ³•失败,则å°è¯•ä½¿ç”¨ç¬¬äºŒç§æ–¹æ³•,以此类推。 # 生æˆä¼˜åŒ– {#GenerationOptimization} ## æ•´æ•°åˆ°å­—ç¬¦ä¸²çš„è½¬æ¢ {#itoa} 整数到字符串转æ¢çš„æœ´ç´ ç®—法需è¦å¯¹æ¯ä¸€ä¸ªå进制ä½è¿›è¡Œä¸€æ¬¡é™¤æ³•。我们实现了若干版本并在 [itoa-benchmark](https://github.com/miloyip/itoa-benchmark) 中对它们进行了评估。 虽然 SSE2 版本是最快的,但它和第二快的 `branchlut` å·®è·ä¸å¤§ã€‚而且 `branchlut` 是纯C++实现,所以我们在 RapidJSON 中使用了 `branchlut`。 ## åŒç²¾åº¦æµ®ç‚¹æ•°åˆ°å­—ç¬¦ä¸²çš„è½¬æ¢ {#dtoa} åŽŸæ¥ RapidJSON 使用 `snprintf(..., ..., "%g")` æ¥è¿›è¡ŒåŒç²¾åº¦æµ®ç‚¹æ•°åˆ°å­—符串的转æ¢ã€‚这是ä¸å‡†ç¡®çš„,因为默认的精度是6。éšåŽæˆ‘们å‘现它很缓慢,而且有其它的替代å“。 Google çš„ V8 [double-conversion](https://github.com/floitsch/double-conversion ) 实现了更新的ã€å¿«é€Ÿçš„被称为 Grisu3 的算法(Loitsch, Florian. "Printing floating-point numbers quickly and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.)。 ç„¶è€Œï¼Œè¿™ä¸ªå®žçŽ°ä¸æ˜¯ä»…头文件的,所以我们实现了一个仅头文件的 Grisu2 版本。这个算法ä¿è¯äº†ç»“æžœæ°¸è¿œç²¾ç¡®ã€‚è€Œä¸”åœ¨å¤§å¤šæ•°æƒ…å†µä¸‹ï¼Œå®ƒä¼šç”Ÿæˆæœ€çŸ­çš„(å¯é€‰ï¼‰å­—符串表示。 这个仅头文件的转æ¢å‡½æ•°åœ¨ [dtoa-benchmark](https://github.com/miloyip/dtoa-benchmark) 中进行评估。 # è§£æžå™¨ {#Parser} ## è¿­ä»£è§£æž {#IterativeParser} 迭代解æžå™¨æ˜¯ä¸€ä¸ªä»¥éžé€’å½’æ–¹å¼å®žçŽ°çš„é€’å½’ä¸‹é™çš„ LL(1) è§£æžå™¨ã€‚ ### 语法 {#IterativeParserGrammar} è§£æžå™¨ä½¿ç”¨çš„语法是基于严格 JSON 语法的: ~~~~~~~~~~ S -> array | object array -> [ values ] object -> { members } values -> non-empty-values | ε non-empty-values -> value addition-values addition-values -> ε | , non-empty-values members -> non-empty-members | ε non-empty-members -> member addition-members addition-members -> ε | , non-empty-members member -> STRING : value value -> STRING | NUMBER | NULL | BOOLEAN | object | array ~~~~~~~~~~ 注æ„到左因å­è¢«åŠ å…¥äº†éžç»ˆç»“符的 `values` å’Œ `members` æ¥ä¿è¯è¯­æ³•是 LL(1) 的。 ### è§£æžè¡¨ {#IterativeParserParsingTable} 基于这份语法,我们å¯ä»¥æž„造 FIRST å’Œ FOLLOW 集åˆã€‚ éžç»ˆç»“符的 FIRST 集åˆå¦‚下所示: | NON-TERMINAL | FIRST | |:-----------------:|:--------------------------------:| | array | [ | | object | { | | values | ε STRING NUMBER NULL BOOLEAN { [ | | addition-values | ε COMMA | | members | ε STRING | | addition-members | ε COMMA | | member | STRING | | value | STRING NUMBER NULL BOOLEAN { [ | | S | [ { | | non-empty-members | STRING | | non-empty-values | STRING NUMBER NULL BOOLEAN { [ | FOLLOW 集åˆå¦‚下所示: | NON-TERMINAL | FOLLOW | |:-----------------:|:-------:| | S | $ | | array | , $ } ] | | object | , $ } ] | | values | ] | | non-empty-values | ] | | addition-values | ] | | members | } | | non-empty-members | } | | addition-members | } | | member | , } | | value | , } ] | 最终å¯ä»¥ä»Ž FIRST å’Œ FOLLOW 集åˆç”Ÿæˆè§£æžè¡¨ï¼š | NON-TERMINAL | [ | { | , | : | ] | } | STRING | NUMBER | NULL | BOOLEAN | |:-----------------:|:---------------------:|:---------------------:|:-------------------:|:-:|:-:|:-:|:-----------------------:|:---------------------:|:---------------------:|:---------------------:| | S | array | object | | | | | | | | | | array | [ values ] | | | | | | | | | | | object | | { members } | | | | | | | | | | values | non-empty-values | non-empty-values | | | ε | | non-empty-values | non-empty-values | non-empty-values | non-empty-values | | non-empty-values | value addition-values | value addition-values | | | | | value addition-values | value addition-values | value addition-values | value addition-values | | addition-values | | | , non-empty-values | | ε | | | | | | | members | | | | | | ε | non-empty-members | | | | | non-empty-members | | | | | | | member addition-members | | | | | addition-members | | | , non-empty-members | | | ε | | | | | | member | | | | | | | STRING : value | | | | | value | array | object | | | | | STRING | NUMBER | NULL | BOOLEAN | 对于上é¢çš„语法分æžï¼Œè¿™é‡Œæœ‰ä¸€ä¸ªå¾ˆæ£’çš„[工具](http://hackingoff.com/compilers/predict-first-follow-set)。 ### 实现 {#IterativeParserImplementation} 基于这份解æžè¡¨ï¼Œä¸€ä¸ªç›´æŽ¥çš„(常规的)将规则åå‘入栈的实现å¯ä»¥æ­£å¸¸å·¥ä½œã€‚ 在 RapidJSON 中,对直接的实现进行了一些修改: 首先,在 RapidJSON 中,这份解æžè¡¨è¢«ç¼–ç ä¸ºçŠ¶æ€æœºã€‚ 规则由头部和主体组æˆã€‚ 状æ€è½¬æ¢ç”±è§„则构造。 除此之外,é¢å¤–的状æ€è¢«æ·»åŠ åˆ°ä¸Ž `array` å’Œ `object` 有关的规则。 é€šè¿‡è¿™ç§æ–¹å¼ï¼Œç”Ÿæˆæ•°ç»„值或对象æˆå‘˜å¯ä»¥åªç”¨ä¸€æ¬¡çжæ€è½¬ç§»ä¾¿å¯å®Œæˆï¼Œ 而ä¸éœ€è¦åœ¨ç›´æŽ¥çš„实现中的多次出栈/入栈æ“作。 è¿™ä¹Ÿä½¿å¾—ä¼°è®¡æ ˆçš„å¤§å°æ›´åŠ å®¹æ˜“ã€‚ 状æ€å›¾å¦‚如下所示: ![状æ€å›¾](diagram/iterative-parser-states-diagram.png) 第二,迭代解æžå™¨ä¹Ÿåœ¨å†…部栈ä¿å­˜äº†æ•°ç»„的值个数和对象æˆå‘˜çš„æ•°é‡ï¼Œè¿™ä¹Ÿä¸Žä¼ ç»Ÿçš„实现ä¸åŒã€‚ asymptote-3.05/LspCpp/third_party/rapidjson/doc/CMakeLists.txt0000644000000000000000000000203415031566105023215 0ustar rootrootfind_package(Doxygen) IF(NOT DOXYGEN_FOUND) MESSAGE(STATUS "No Doxygen found. Documentation won't be built") ELSE() file(GLOB SOURCES ${CMAKE_CURRENT_LIST_DIR}/../include/*) file(GLOB MARKDOWN_DOC ${CMAKE_CURRENT_LIST_DIR}/../doc/*.md) list(APPEND MARKDOWN_DOC ${CMAKE_CURRENT_LIST_DIR}/../readme.md) CONFIGURE_FILE(Doxyfile.in Doxyfile @ONLY) CONFIGURE_FILE(Doxyfile.zh-cn.in Doxyfile.zh-cn @ONLY) file(GLOB DOXYFILES ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile*) add_custom_command(OUTPUT html COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile.zh-cn COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/html DEPENDS ${MARKDOWN_DOC} ${SOURCES} ${DOXYFILES} WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../ ) add_custom_target(doc ALL DEPENDS html) install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html DESTINATION ${DOC_INSTALL_DIR} COMPONENT doc) ENDIF() asymptote-3.05/LspCpp/third_party/rapidjson/doc/stream.zh-cn.md0000644000000000000000000003376515031566105023327 0ustar rootroot# æµ åœ¨ RapidJSON 中,`rapidjson::Stream` 是用於读写 JSON 的概念(概念是指 C++ çš„ concept)。在这里我们先介ç»å¦‚何使用 RapidJSON æä¾›çš„å„ç§æµã€‚ç„¶åŽå†çœ‹çœ‹å¦‚何自行定义æµã€‚ [TOC] # å†…å­˜æµ {#MemoryStreams} å†…å­˜æµæŠŠ JSON 存储在内存之中。 ## StringStream(输入){#StringStream} `StringStream` 是最基本的输入æµï¼Œå®ƒè¡¨ç¤ºä¸€ä¸ªå®Œæ•´çš„ã€åªè¯»çš„ã€å­˜å‚¨äºŽå†…存的 JSON。它在 `rapidjson/rapidjson.h` 中定义。 ~~~~~~~~~~cpp #include "rapidjson/document.h" // ä¼šåŒ…å« "rapidjson/rapidjson.h" using namespace rapidjson; // ... const char json[] = "[1, 2, 3, 4]"; StringStream s(json); Document d; d.ParseStream(s); ~~~~~~~~~~ 由于这是éžå¸¸å¸¸ç”¨çš„用法,RapidJSON æä¾› `Document::Parse(const char*)` 去åšå®Œå…¨ç›¸åŒçš„事情: ~~~~~~~~~~cpp // ... const char json[] = "[1, 2, 3, 4]"; Document d; d.Parse(json); ~~~~~~~~~~ éœ€è¦æ³¨æ„,`StringStream` 是 `GenericStringStream >` çš„ typedef,使用者å¯ç”¨å…¶ä»–ç¼–ç ç±»åŽ»ä»£è¡¨æµæ‰€ä½¿ç”¨çš„字符集。 ## StringBuffer(输出){#StringBuffer} `StringBuffer` 是一个简å•的输出æµã€‚它分é…一个内存缓冲区,供写入整个 JSON。å¯ä½¿ç”¨ `GetString()` æ¥èŽ·å–该缓冲区。 ~~~~~~~~~~cpp #include "rapidjson/stringbuffer.h" #include StringBuffer buffer; Writer writer(buffer); d.Accept(writer); const char* output = buffer.GetString(); ~~~~~~~~~~ 当缓冲区满溢,它将自动增加容é‡ã€‚缺çœå®¹é‡æ˜¯ 256 个字符(UTF8 是 256 字节,UTF16 是 512 字节等)。使用者能自行æä¾›åˆ†é…器åŠåˆå§‹å®¹é‡ã€‚ ~~~~~~~~~~cpp StringBuffer buffer1(0, 1024); // 使用它的分é…器,åˆå§‹å¤§å° = 1024 StringBuffer buffer2(allocator, 1024); ~~~~~~~~~~ 如无设置分é…器,`StringBuffer` 会自行实例化一个内部分é…器。 相似地,`StringBuffer` 是 `GenericStringBuffer >` çš„ typedef。 # æ–‡ä»¶æµ {#FileStreams} 当è¦ä»Žæ–‡ä»¶è§£æžä¸€ä¸ª JSON,你å¯ä»¥æŠŠæ•´ä¸ª JSON 读入内存并使用上述的 `StringStream`。 然而,若 JSON 很大,或是内存有é™ï¼Œä½ å¯ä»¥æ”¹ç”¨ `FileReadStream`。它åªä¼šä»Žæ–‡ä»¶è¯»å–一部分至缓冲区,然åŽè®©é‚£éƒ¨åˆ†è¢«è§£æžã€‚若缓冲区的字符都被读完,它会å†ä»Žæ–‡ä»¶è¯»å–下一部分。 ## FileReadStream(输入) {#FileReadStream} `FileReadStream` 通过 `FILE` æŒ‡é’ˆè¯»å–æ–‡ä»¶ã€‚ä½¿ç”¨è€…éœ€è¦æä¾›ä¸€ä¸ªç¼“å†²åŒºã€‚ ~~~~~~~~~~cpp #include "rapidjson/filereadstream.h" #include using namespace rapidjson; FILE* fp = fopen("big.json", "rb"); // éž Windows å¹³å°ä½¿ç”¨ "r" char readBuffer[65536]; FileReadStream is(fp, readBuffer, sizeof(readBuffer)); Document d; d.ParseStream(is); fclose(fp); ~~~~~~~~~~ 与 `StringStreams` ä¸ä¸€æ ·ï¼Œ`FileReadStream` 是一个字节æµã€‚它ä¸å¤„ç†ç¼–ç ã€‚è‹¥æ–‡ä»¶å¹¶éž UTF-8 ç¼–ç ï¼Œå¯ä»¥æŠŠå­—节æµç”¨ `EncodedInputStream` 包装。我们很快会讨论这个问题。 é™¤äº†è¯»å–æ–‡ä»¶ï¼Œä½¿ç”¨è€…也å¯ä»¥ä½¿ç”¨ `FileReadStream` æ¥è¯»å– `stdin`。 ## FileWriteStream(输出){#FileWriteStream} `FileWriteStream` 是一个å«ç¼“冲功能的输出æµã€‚它的用法与 `FileReadStream` éžå¸¸ç›¸ä¼¼ã€‚ ~~~~~~~~~~cpp #include "rapidjson/filewritestream.h" #include #include using namespace rapidjson; Document d; d.Parse(json); // ... FILE* fp = fopen("output.json", "wb"); // éž Windows å¹³å°ä½¿ç”¨ "w" char writeBuffer[65536]; FileWriteStream os(fp, writeBuffer, sizeof(writeBuffer)); Writer writer(os); d.Accept(writer); fclose(fp); ~~~~~~~~~~ 它也å¯ä»¥æŠŠè¾“å‡ºå¯¼å‘ `stdout`。 # iostream 包装类 {#iostreamWrapper} åŸºäºŽç”¨æˆ·çš„è¦æ±‚,RapidJSON æä¾›äº†æ­£å¼çš„ `std::basic_istream` å’Œ `std::basic_ostream` 包装类。然而,请注æ„其性能会大大低于以上的其他æµã€‚ ## IStreamWrapper {#IStreamWrapper} `IStreamWrapper` 把任何继承自 `std::istream` 的类(如 `std::istringstream`ã€`std::stringstream`ã€`std::ifstream`ã€`std::fstream`ï¼‰åŒ…è£…æˆ RapidJSON 的输入æµã€‚ ~~~cpp #include #include #include using namespace rapidjson; using namespace std; ifstream ifs("test.json"); IStreamWrapper isw(ifs); Document d; d.ParseStream(isw); ~~~ 对于继承自 `std::wistream` 的类,则使用 `WIStreamWrapper`。 ## OStreamWrapper {#OStreamWrapper} 相似地,`OStreamWrapper` 把任何继承自 `std::ostream` 的类(如 `std::ostringstream`ã€`std::stringstream`ã€`std::ofstream`ã€`std::fstream`ï¼‰åŒ…è£…æˆ RapidJSON 的输出æµã€‚ ~~~cpp #include #include #include #include using namespace rapidjson; using namespace std; Document d; d.Parse(json); // ... ofstream ofs("output.json"); OStreamWrapper osw(ofs); Writer writer(osw); d.Accept(writer); ~~~ 对于继承自 `std::wistream` 的类,则使用 `WIStreamWrapper`。 # ç¼–ç æµ {#EncodedStreams} ç¼–ç æµï¼ˆencoded streams)本身ä¸å­˜å‚¨ JSONï¼Œå®ƒä»¬æ˜¯é€šè¿‡åŒ…è£…å­—èŠ‚æµæ¥æä¾›åŸºæœ¬çš„ç¼–ç ï¼è§£ç åŠŸèƒ½ã€‚ 如上所述,我们å¯ä»¥ç›´æŽ¥è¯»å…¥ UTF-8 字节æµã€‚然而,UTF-16 åŠ UTF-32 有字节åºï¼ˆendianï¼‰é—®é¢˜ã€‚è¦æ­£ç¡®åœ°å¤„ç†å­—节åºï¼Œéœ€è¦åœ¨è¯»å–æ—¶æŠŠå­—èŠ‚è½¬æ¢æˆå­—符(如对 UTF-16 使用 `wchar_t`),以åŠåœ¨å†™å…¥æ—¶æŠŠå­—符转æ¢ä¸ºå­—节。 除此以外,我们也需è¦å¤„ç† [å­—èŠ‚é¡ºåºæ ‡è®°ï¼ˆbyte order mark, BOM)](http://en.wikipedia.org/wiki/Byte_order_mark)。当从一个字节æµè¯»å–æ—¶ï¼Œéœ€è¦æ£€æµ‹ BOM,或者仅仅是把存在的 BOM 消去。当把 JSON å†™å…¥å­—èŠ‚æµæ—¶ï¼Œä¹Ÿå¯é€‰æ‹©å†™å…¥ BOM。 若一个æµçš„ç¼–ç åœ¨ç¼–译期已知,你å¯ä½¿ç”¨ `EncodedInputStream` åŠ `EncodedOutputStream`。若一个æµå¯èƒ½å­˜å‚¨ UTF-8ã€UTF-16LEã€UTF-16BEã€UTF-32LEã€UTF-32BE çš„ JSON,并且编ç åªèƒ½åœ¨è¿è¡Œæ—¶å¾—知,你便å¯ä»¥ä½¿ç”¨ `AutoUTFInputStream` åŠ `AutoUTFOutputStream`。这些æµå®šä¹‰åœ¨ `rapidjson/encodedstream.h`。 注æ„åˆ°ï¼Œè¿™äº›ç¼–ç æµå¯ä»¥æ–½äºŽæ–‡ä»¶ä»¥å¤–çš„æµã€‚例如,你å¯ä»¥ç”¨ç¼–ç æµåŒ…装内存中的文件或自定义的字节æµã€‚ ## EncodedInputStream {#EncodedInputStream} `EncodedInputStream` å«ä¸¤ä¸ªæ¨¡æ¿å‚数。第一个是 `Encoding` 类型,例如定义于 `rapidjson/encodings.h` çš„ `UTF8`ã€`UTF16LE`ã€‚ç¬¬äºŒä¸ªå‚æ•°æ˜¯è¢«åŒ…装的æµçš„类型。 ~~~~~~~~~~cpp #include "rapidjson/document.h" #include "rapidjson/filereadstream.h" // FileReadStream #include "rapidjson/encodedstream.h" // EncodedInputStream #include using namespace rapidjson; FILE* fp = fopen("utf16le.json", "rb"); // éž Windows å¹³å°ä½¿ç”¨ "r" char readBuffer[256]; FileReadStream bis(fp, readBuffer, sizeof(readBuffer)); EncodedInputStream, FileReadStream> eis(bis); // 用 eis 包装 bis Document d; // Document 为 GenericDocument > d.ParseStream<0, UTF16LE<> >(eis); // 把 UTF-16LE 文件解æžè‡³å†…存中的 UTF-8 fclose(fp); ~~~~~~~~~~ ## EncodedOutputStream {#EncodedOutputStream} `EncodedOutputStream` 也是相似的,但它的构造函数有一个 `bool putBOM` 傿•°ï¼Œç”¨äºŽæŽ§åˆ¶æ˜¯å¦åœ¨è¾“出字节æµå†™å…¥ BOM。 ~~~~~~~~~~cpp #include "rapidjson/filewritestream.h" // FileWriteStream #include "rapidjson/encodedstream.h" // EncodedOutputStream #include #include Document d; // Document 为 GenericDocument > // ... FILE* fp = fopen("output_utf32le.json", "wb"); // éž Windows å¹³å°ä½¿ç”¨ "w" char writeBuffer[256]; FileWriteStream bos(fp, writeBuffer, sizeof(writeBuffer)); typedef EncodedOutputStream, FileWriteStream> OutputStream; OutputStream eos(bos, true); // 写入 BOM Writer, UTF32LE<>> writer(eos); d.Accept(writer); // 这里从内存的 UTF-8 ç”Ÿæˆ UTF32-LE 文件 fclose(fp); ~~~~~~~~~~ ## AutoUTFInputStream {#AutoUTFInputStream} 有时候,应用软件å¯èƒ½éœ€è¦ã²ƒç†æ‰€æœ‰å¯æ”¯æŒçš„ JSON ç¼–ç ã€‚`AutoUTFInputStream` 会先使用 BOM æ¥æ£€æµ‹ç¼–ç ã€‚è‹¥ BOM ä¸å­˜åœ¨ï¼Œå®ƒä¾¿ä¼šä½¿ç”¨åˆæ³• JSON çš„ç‰¹æ€§æ¥æ£€æµ‹ã€‚è‹¥ä¸¤ç§æ–¹æ³•都失败,它就会倒退至构造函数æä¾›çš„ UTF 类型。 由于字符(编ç å•å…ƒï¼code unit)å¯èƒ½æ˜¯ 8 ä½ã€16 使ˆ– 32 ä½ï¼Œ`AutoUTFInputStream` 需è¦ä¸€ä¸ªèƒ½è‡³å°‘储存 32 ä½çš„字符类型。我们å¯ä»¥ä½¿ç”¨ `unsigned` 作为模æ¿å‚数: ~~~~~~~~~~cpp #include "rapidjson/document.h" #include "rapidjson/filereadstream.h" // FileReadStream #include "rapidjson/encodedstream.h" // AutoUTFInputStream #include using namespace rapidjson; FILE* fp = fopen("any.json", "rb"); // éž Windows å¹³å°ä½¿ç”¨ "r" char readBuffer[256]; FileReadStream bis(fp, readBuffer, sizeof(readBuffer)); AutoUTFInputStream eis(bis); // 用 eis 包装 bis Document d; // Document 为 GenericDocument > d.ParseStream<0, AutoUTF >(eis); // 把任何 UTF ç¼–ç çš„æ–‡ä»¶è§£æžè‡³å†…存中的 UTF-8 fclose(fp); ~~~~~~~~~~ å½“è¦æŒ‡å®šæµçš„ç¼–ç ï¼Œå¯ä½¿ç”¨ä¸Šé¢ä¾‹å­ä¸­ `ParseStream()` çš„å‚æ•° `AutoUTF`。 ä½ å¯ä»¥ä½¿ç”¨ `UTFType GetType()` åŽ»èŽ·å– UTF 类型,并且用 `HasBOM()` æ£€æµ‹è¾“å…¥æµæ˜¯å¦å«æœ‰ BOM。 ## AutoUTFOutputStream {#AutoUTFOutputStream} 相似地,è¦åœ¨è¿è¡Œæ—¶é€‰æ‹©è¾“出的编ç ï¼Œæˆ‘们å¯ä½¿ç”¨ `AutoUTFOutputStream`。这个类本身并éžã€Œè‡ªåЍã€ã€‚你需è¦åœ¨è¿è¡Œæ—¶æŒ‡å®š UTF ç±»åž‹ï¼Œä»¥åŠæ˜¯å¦å†™å…¥ BOM。 ~~~~~~~~~~cpp using namespace rapidjson; void WriteJSONFile(FILE* fp, UTFType type, bool putBOM, const Document& d) { char writeBuffer[256]; FileWriteStream bos(fp, writeBuffer, sizeof(writeBuffer)); typedef AutoUTFOutputStream OutputStream; OutputStream eos(bos, type, putBOM); Writer, AutoUTF<> > writer; d.Accept(writer); } ~~~~~~~~~~ `AutoUTFInputStream`ï¼`AutoUTFOutputStream` 是比 `EncodedInputStream`ï¼`EncodedOutputStream` 方便。但å‰è€…会产生一点è¿è¡ŒæœŸé¢å¤–开销。 # è‡ªå®šä¹‰æµ {#CustomStream} é™¤äº†å†…å­˜ï¼æ–‡ä»¶æµï¼Œä½¿ç”¨è€…å¯åˆ›å»ºè‡ªè¡Œå®šä¹‰é€‚é… RapidJSON API çš„æµç±»ã€‚例如,你å¯ä»¥åˆ›å»ºç½‘络æµã€ä»ŽåŽ‹ç¼©æ–‡ä»¶è¯»å–çš„æµç­‰ç­‰ã€‚ RapidJSON 利用模æ¿ç»“åˆä¸åŒçš„类型。åªè¦ä¸€ä¸ªç±»åŒ…嫿‰€æœ‰æ‰€éœ€çš„æŽ¥å£ï¼Œå°±å¯ä»¥ä½œä¸ºä¸€ä¸ªæµã€‚æµçš„æŽ¥åˆå®šä¹‰åœ¨ `rapidjson/rapidjson.h` 的注释里: ~~~~~~~~~~cpp concept Stream { typename Ch; //!< æµçš„字符类型 //! 从æµè¯»å–当å‰å­—符,ä¸ç§»åŠ¨è¯»å–æŒ‡é’ˆï¼ˆread cursor) Ch Peek() const; //! 从æµè¯»å–当å‰å­—ç¬¦ï¼Œç§»åŠ¨è¯»å–æŒ‡é’ˆè‡³ä¸‹ä¸€å­—符。 Ch Take(); //! 获å–è¯»å–æŒ‡é’ˆã€‚ //! \return ä»Žå¼€å§‹ä»¥æ¥æ‰€è¯»è¿‡çš„字符数é‡ã€‚ size_t Tell(); //! 从当å‰è¯»å–指针开始写入æ“作。 //! \return 返回开始写入的指针。 Ch* PutBegin(); //! 写入一个字符。 void Put(Ch c); //! 清空缓冲区。 void Flush(); //! 完æˆå†™ä½œæ“作。 //! \param begin PutBegin() 返回的开始写入指针。 //! \return 已写入的字符数é‡ã€‚ size_t PutEnd(Ch* begin); } ~~~~~~~~~~ 输入æµå¿…须实现 `Peek()`ã€`Take()` åŠ `Tell()`。 输出æµå¿…须实现 `Put()` åŠ `Flush()`。 `PutBegin()` åŠ `PutEnd()` 是特殊的接å£ï¼Œä»…用于原ä½ï¼ˆ*in situ*)解æžã€‚一般的æµä¸éœ€å®žçŽ°å®ƒä»¬ã€‚ç„¶è€Œï¼Œå³ä½¿æŽ¥å£ä¸éœ€ç”¨äºŽæŸäº›æµï¼Œä»ç„¶éœ€è¦æä¾›ç©ºå®žçŽ°ï¼Œå¦åˆ™ä¼šäº§ç”Ÿç¼–译错误。 ## 例å­ï¼šistream 的包装类 {#ExampleIStreamWrapper} 以下的简å•例孿˜¯ `std::istream` 的包装类,它åªéœ€çް 3 个函数。 ~~~~~~~~~~cpp class MyIStreamWrapper { public: typedef char Ch; MyIStreamWrapper(std::istream& is) : is_(is) { } Ch Peek() const { // 1 int c = is_.peek(); return c == std::char_traits::eof() ? '\0' : (Ch)c; } Ch Take() { // 2 int c = is_.get(); return c == std::char_traits::eof() ? '\0' : (Ch)c; } size_t Tell() const { return (size_t)is_.tellg(); } // 3 Ch* PutBegin() { assert(false); return 0; } void Put(Ch) { assert(false); } void Flush() { assert(false); } size_t PutEnd(Ch*) { assert(false); return 0; } private: MyIStreamWrapper(const MyIStreamWrapper&); MyIStreamWrapper& operator=(const MyIStreamWrapper&); std::istream& is_; }; ~~~~~~~~~~ 使用者能用它æ¥åŒ…装 `std::stringstream`ã€`std::ifstream` 的实例。 ~~~~~~~~~~cpp const char* json = "[1,2,3,4]"; std::stringstream ss(json); MyIStreamWrapper is(ss); Document d; d.ParseStream(is); ~~~~~~~~~~ ä½†è¦æ³¨æ„,由于标准库的内部开销问,此实现的性能å¯èƒ½ä¸å¦‚ RapidJSON çš„å†…å­˜ï¼æ–‡ä»¶æµã€‚ ## 例å­ï¼šostream 的包装类 {#ExampleOStreamWrapper} ä»¥ä¸‹çš„ä¾‹å­æ˜¯ `std::istream` 的包装类,它åªéœ€å®žçް 2 个函数。 ~~~~~~~~~~cpp class MyOStreamWrapper { public: typedef char Ch; OStreamWrapper(std::ostream& os) : os_(os) { } Ch Peek() const { assert(false); return '\0'; } Ch Take() { assert(false); return '\0'; } size_t Tell() const { } Ch* PutBegin() { assert(false); return 0; } void Put(Ch c) { os_.put(c); } // 1 void Flush() { os_.flush(); } // 2 size_t PutEnd(Ch*) { assert(false); return 0; } private: MyOStreamWrapper(const MyOStreamWrapper&); MyOStreamWrapper& operator=(const MyOStreamWrapper&); std::ostream& os_; }; ~~~~~~~~~~ 使用者能用它æ¥åŒ…装 `std::stringstream`ã€`std::ofstream` 的实例。 ~~~~~~~~~~cpp Document d; // ... std::stringstream ss; MyOStreamWrapper os(ss); Writer writer(os); d.Accept(writer); ~~~~~~~~~~ ä½†è¦æ³¨æ„,由于标准库的内部开销问,此实现的性能å¯èƒ½ä¸å¦‚ RapidJSON çš„å†…å­˜ï¼æ–‡ä»¶æµã€‚ # 总结 {#Summary} 本节æè¿°äº† RapidJSON æä¾›çš„å„ç§æµçš„类。内存æµå¾ˆç®€å•。若 JSON 存储在文件中,文件æµå¯å‡å°‘ JSON è§£æžåŠç”Ÿæˆæ‰€éœ€çš„内存é‡ã€‚ç¼–ç æµåœ¨å­—节æµå’Œå­—符æµä¹‹é—´ä½œè½¬æ¢ã€‚最åŽï¼Œä½¿ç”¨è€…å¯ä½¿ç”¨ä¸€ä¸ªç®€å•接å£åˆ›å»ºè‡ªå®šä¹‰çš„æµã€‚ asymptote-3.05/LspCpp/third_party/rapidjson/doc/pointer.zh-cn.md0000644000000000000000000002052415031566105023501 0ustar rootroot# Pointer (本功能于 v1.1.0 å‘布) JSON Pointer 是一个标准化([RFC6901])的方å¼å޻选å–一个 JSON Document(DOM)中的值。这类似于 XML çš„ XPath。然而,JSON Pointer 简å•得多,而且æ¯ä¸ª JSON Pointer 仅指å‘å•个值。 使用 RapidJSON çš„ JSON Pointer 实现能简化一些 DOM çš„æ“作。 [TOC] # JSON Pointer {#JsonPointer} 一个 JSON Pointer 由一串(零至多个)token 所组æˆï¼Œæ¯ä¸ª token 都有 `/` å‰ç¼€ã€‚æ¯ä¸ª token å¯ä»¥æ˜¯ä¸€ä¸ªå­—符串或数字。例如,给定一个 JSON: ~~~javascript { "foo" : ["bar", "baz"], "pi" : 3.1416 } ~~~ 以下的 JSON Pointer è§£æžä¸ºï¼š 1. `"/foo"` → `[ "bar", "baz" ]` 2. `"/foo/0"` → `"bar"` 3. `"/foo/1"` → `"baz"` 4. `"/pi"` → `3.1416` è¦æ³¨æ„,一个空 JSON Pointer `""` (零个 token)解æžä¸ºæ•´ä¸ª JSON。 # 基本使用方法 {#BasicUsage} 以下的代ç èŒƒä¾‹ä¸è§£è‡ªæ˜Žã€‚ ~~~cpp #include "rapidjson/pointer.h" // ... Document d; // 使用 Set() 创建 DOM Pointer("/project").Set(d, "RapidJSON"); Pointer("/stars").Set(d, 10); // { "project" : "RapidJSON", "stars" : 10 } // 使用 Get() 访问 DOM。若该值ä¸å­˜åœ¨åˆ™è¿”回 nullptr。 if (Value* stars = Pointer("/stars").Get(d)) stars->SetInt(stars->GetInt() + 1); // { "project" : "RapidJSON", "stars" : 11 } // Set() å’Œ Create() 自动生æˆçˆ¶å€¼ï¼ˆå¦‚果它们ä¸å­˜åœ¨ï¼‰ã€‚ Pointer("/a/b/0").Create(d); // { "project" : "RapidJSON", "stars" : 11, "a" : { "b" : [ null ] } } // GetWithDefault() 返回引用。若该值ä¸å­˜åœ¨åˆ™ä¼šæ·±æ‹·è´ç¼ºçœå€¼ã€‚ Value& hello = Pointer("/hello").GetWithDefault(d, "world"); // { "project" : "RapidJSON", "stars" : 11, "a" : { "b" : [ null ] }, "hello" : "world" } // Swap() å’Œ Set() 相似 Value x("C++"); Pointer("/hello").Swap(d, x); // { "project" : "RapidJSON", "stars" : 11, "a" : { "b" : [ null ] }, "hello" : "C++" } // x å˜æˆ "world" // 删去一个æˆå‘˜æˆ–元素,若值存在返回 true bool success = Pointer("/a").Erase(d); assert(success); // { "project" : "RapidJSON", "stars" : 10 } ~~~ # 辅助函数 {#HelperFunctions} 由于é¢å‘对象的调用习惯å¯èƒ½ä¸ç¬¦ç›´è§‰ï¼ŒRapidJSON 也æä¾›äº†ä¸€äº›è¾…助函数,它们把æˆå‘˜å‡½æ•°åŒ…装æˆè‡ªç”±å‡½æ•°ã€‚ 以下的例å­ä¸Žä¸Šé¢ä¾‹å­æ‰€åšçš„事情完全相åŒã€‚ ~~~cpp Document d; SetValueByPointer(d, "/project", "RapidJSON"); SetValueByPointer(d, "/stars", 10); if (Value* stars = GetValueByPointer(d, "/stars")) stars->SetInt(stars->GetInt() + 1); CreateValueByPointer(d, "/a/b/0"); Value& hello = GetValueByPointerWithDefault(d, "/hello", "world"); Value x("C++"); SwapValueByPointer(d, "/hello", x); bool success = EraseValueByPointer(d, "/a"); assert(success); ~~~ 以下对比 3 ç§è°ƒç”¨æ–¹å¼ï¼š 1. `Pointer(source).(root, ...)` 2. `ValueByPointer(root, Pointer(source), ...)` 3. `ValueByPointer(root, source, ...)` # è§£æž Pointer {#ResolvingPointer} `Pointer::Get()` 或 `GetValueByPointer()` 函数并ä¸ä¿®æ”¹ DOM。若那些 token ä¸èƒ½åŒ¹é… DOM 里的值,这些函数便返回 `nullptr`。使用者å¯åˆ©ç”¨è¿™ä¸ªæ–¹æ³•æ¥æ£€æŸ¥ä¸€ä¸ªå€¼æ˜¯å¦å­˜åœ¨ã€‚ 注æ„,数值 token å¯è¡¨ç¤ºæ•°ç»„索引或æˆå‘˜å字。解æžè¿‡ç¨‹ä¸­ä¼šæŒ‰å€¼çš„类型æ¥åŒ¹é…。 ~~~javascript { "0" : 123, "1" : [456] } ~~~ 1. `"/0"` → `123` 2. `"/1/0"` → `456` Token `"0"` 在第一个 pointer 中被当作æˆå‘˜å字。它在第二个 pointer ä¸­è¢«å½“ä½œæˆæ•°ç»„索引。 å…¶ä»–å‡½æ•°ä¼šæ”¹å˜ DOM,包括 `Create()`ã€`GetWithDefault()`ã€`Set()`ã€`Swap()`。这些函数总是æˆåŠŸçš„ã€‚è‹¥ä¸€äº›çˆ¶å€¼ä¸å­˜åœ¨ï¼Œå°±ä¼šåˆ›å»ºå®ƒä»¬ã€‚若父值类型ä¸åŒ¹é… token,也会强行改å˜å…¶ç±»åž‹ã€‚改å˜ç±»åž‹ä¹Ÿæ„味ç€å®Œå…¨ç§»é™¤å…¶ DOM å­æ ‘的内容。 例如,把上é¢çš„ JSON 解译至 `d` 之åŽï¼Œ ~~~cpp SetValueByPointer(d, "1/a", 789); // { "0" : 123, "1" : { "a" : 789 } } ~~~ ## è§£æžè´Ÿå· token å¦å¤–,[RFC6901] 定义了一个特殊 token `-` (å•个负å·ï¼‰ï¼Œç”¨äºŽè¡¨ç¤ºæ•°ç»„最åŽå…ƒç´ çš„下一个元素。 `Get()` åªä¼šæŠŠæ­¤ token 当作æˆå‘˜åå­— '"-"'ã€‚è€Œå…¶ä»–å‡½æ•°åˆ™ä¼šä»¥æ­¤è§£æžæ•°ç»„,等åŒäºŽå¯¹æ•°ç»„调用 `Value::PushBack()` 。 ~~~cpp Document d; d.Parse("{\"foo\":[123]}"); SetValueByPointer(d, "/foo/-", 456); // { "foo" : [123, 456] } SetValueByPointer(d, "/-", 789); // { "foo" : [123, 456], "-" : 789 } ~~~ ## è§£æž Document åŠ Value 当使用 `p.Get(root)` 或 `GetValueByPointer(root, p)`,`root` 是一个(常数) `Value&`。这æ„味ç€ï¼Œå®ƒä¹Ÿå¯ä»¥æ˜¯ DOM é‡Œçš„ä¸€ä¸ªå­æ ‘。 其他函数有两组签å。一组使用 `Document& document` ä½œä¸ºå‚æ•°ï¼Œå¦ä¸€ç»„使用 `Value& root`。第一组使用 `document.GetAllocator()` 去创建值,而第二组则需è¦ä½¿ç”¨è€…æä¾›ä¸€ä¸ª allocatorï¼Œå¦‚åŒ DOM 里的函数。 以上例å­éƒ½ä¸éœ€è¦ allocator 傿•°ï¼Œå› ä¸ºå®ƒçš„ç¬¬ä¸€ä¸ªå‚æ•°æ˜¯ `Document&`。但如果你需è¦å¯¹ä¸€ä¸ªå­æ ‘进行解æžï¼Œå°±éœ€è¦å¦‚下é¢çš„例å­èˆ¬æä¾› allocator: ~~~cpp class Person { public: Person() { document_ = new Document(); // CreateValueByPointer() here no need allocator SetLocation(CreateValueByPointer(*document_, "/residence"), ...); SetLocation(CreateValueByPointer(*document_, "/office"), ...); }; private: void SetLocation(Value& location, const char* country, const char* addresses[2]) { Value::Allocator& a = document_->GetAllocator(); // SetValueByPointer() here need allocator SetValueByPointer(location, "/country", country, a); SetValueByPointer(location, "/address/0", address[0], a); SetValueByPointer(location, "/address/1", address[1], a); } // ... Document* document_; }; ~~~ `Erase()` 或 `EraseValueByPointer()` ä¸éœ€è¦ allocator。而且它们æˆåŠŸåˆ é™¤å€¼ä¹‹åŽä¼šè¿”回 `true`。 # é”™è¯¯å¤„ç† {#ErrorHandling} `Pointer` 在其建构函数里会解译æºå­—符串。若有解æžé”™è¯¯ï¼Œ`Pointer::IsValid()` 返回 `false`。你å¯ä½¿ç”¨ `Pointer::GetParseErrorCode()` å’Œ `GetParseErrorOffset()` 去获å–错信æ¯ã€‚ è¦æ³¨æ„的是,所有解æžå‡½æ•°éƒ½å‡è®¾ pointer æ˜¯åˆæ³•çš„ã€‚å¯¹ä¸€ä¸ªéžæ³• pointer è§£æžä¼šé€ æˆæ–­è¨€å¤±è´¥ã€‚ # URI ç‰‡æ®µè¡¨ç¤ºæ–¹å¼ {#URIFragment} 除了我们一直在使用的字符串方å¼è¡¨ç¤º JSON pointer,[RFC6901] 也定义了一个 JSON Pointer çš„ URI 片段(fragment)表示方å¼ã€‚URI 片段是定义于 [RFC3986] "Uniform Resource Identifier (URI): Generic Syntax"。 URI 片段的主è¦åˆ†åˆ«æ˜¯å¿…然以 `#` (pound signï¼‰å¼€å¤´ï¼Œè€Œä¸€äº›å­—ç¬¦ä¹Ÿä¼šä»¥ç™¾åˆ†æ¯”ç¼–ç æˆ UTF-8 åºåˆ—。例如,以下的表展示了ä¸åŒè¡¨ç¤ºæ³•下的 C/C++ 字符串常数。 å­—ç¬¦ä¸²è¡¨ç¤ºæ–¹å¼ | URI ç‰‡æ®µè¡¨ç¤ºæ–¹å¼ | Pointer Tokens (UTF-8) ----------------------|-----------------------------|------------------------ `"/foo/0"` | `"#/foo/0"` | `{"foo", 0}` `"/a~1b"` | `"#/a~1b"` | `{"a/b"}` `"/m~0n"` | `"#/m~0n"` | `{"m~n"}` `"/ "` | `"#/%20"` | `{" "}` `"/\0"` | `"#/%00"` | `{"\0"}` `"/€"` | `"#/%E2%82%AC"` | `{"€"}` RapidJSON å®Œå…¨æ”¯æŒ URI 片段表示方å¼ã€‚它在解译时会自动检测 `#` å·ã€‚ # 字符串化 你也å¯ä»¥æŠŠä¸€ä¸ª `Pointer` 字符串化,储存于字符串或其他输出æµã€‚例如: ~~~ Pointer p(...); StringBuffer sb; p.Stringify(sb); std::cout << sb.GetString() << std::endl; ~~~ 使用 `StringifyUriFragment()` å¯ä»¥æŠŠ pointer 字符串化为 URI 片段表示法。 # 使用者æä¾›çš„ tokens {#UserSuppliedTokens} 若一个 pointer 会用于多次解æžï¼Œå®ƒåº”该åªè¢«åˆ›å»ºä¸€æ¬¡ï¼Œç„¶åŽå†æ–½äºŽä¸åŒçš„ DOM ,或在ä¸åŒæ—¶é—´åšè§£æžã€‚这样å¯ä»¥é¿å…多次创键 `Pointer`ï¼ŒèŠ‚çœæ—¶é—´å’Œå†…存分é…。 我们甚至å¯ä»¥å†æ›´è¿›ä¸€æ­¥ï¼Œå®Œå…¨æ¶ˆåŽ»è§£æžè¿‡ç¨‹åŠåЍæ€å†…存分é…。我们å¯ä»¥ç›´æŽ¥ç”Ÿæˆ token 数组: ~~~cpp #define NAME(s) { s, sizeof(s) / sizeof(s[0]) - 1, kPointerInvalidIndex } #define INDEX(i) { #i, sizeof(#i) - 1, i } static const Pointer::Token kTokens[] = { NAME("foo"), INDEX(123) }; static const Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); // Equivalent to static const Pointer p("/foo/123"); ~~~ è¿™ç§å𿳕å¯èƒ½é€‚åˆå†…å­˜å—é™çš„系统。 [RFC3986]: https://tools.ietf.org/html/rfc3986 [RFC6901]: https://tools.ietf.org/html/rfc6901 asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/0000755000000000000000000000000015031566105022062 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/move3.dot0000644000000000000000000000265615031566105023634 0ustar rootrootdigraph { compound=true fontname="Inconsolata, Consolas" fontsize=10 margin="0,0" ranksep=0.2 penwidth=0.5 forcelabels=true node [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] edge [fontname="Inconsolata, Consolas", fontsize=10, arrowhead=normal] subgraph cluster1 { margin="10,10" labeljust="left" label = "Before Moving" style=filled fillcolor=gray95 node [shape=Mrecord, style=filled, colorscheme=spectral7] c1 [label="{contacts:array|}", fillcolor=4] c11 [label="{|}"] c12 [label="{|}"] c13 [shape=none, label="...", style="solid"] o1 [label="{o:object|}", fillcolor=3] ghost [label="{o:object|}", style=invis] c1 -> o1 [style="dashed", constraint=false, label="AddMember"] edge [arrowhead=vee] c1 -> { c11; c12; c13 } o1 -> ghost [style=invis] } subgraph cluster2 { margin="10,10" labeljust="left" label = "After Moving" style=filled fillcolor=gray95 node [shape=Mrecord, style=filled, colorscheme=spectral7] c2 [label="{contacts:null|}", fillcolor=1] c3 [label="{array|}", fillcolor=4] c21 [label="{|}"] c22 [label="{|}"] c23 [shape="none", label="...", style="solid"] o2 [label="{o:object|}", fillcolor=3] cs [label="{string|\"contacts\"}", fillcolor=5] c2 -> o2 [style="dashed", constraint=false, label="AddMember", style=invis] edge [arrowhead=vee] c3 -> { c21; c22; c23 } o2 -> cs cs -> c3 [arrowhead=none] } ghost -> o2 [style=invis] } asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/utilityclass.dot0000644000000000000000000000335715031566105025333 0ustar rootrootdigraph { rankdir=LR compound=true fontname="Inconsolata, Consolas" fontsize=10 margin="0,0" ranksep=0.3 nodesep=0.15 penwidth=0.5 colorscheme=spectral7 node [shape=box, fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5, style=filled, fillcolor=white] edge [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] subgraph cluster0 { style=filled fillcolor=4 Encoding [label="<>\nEncoding"] edge [arrowtail=onormal, dir=back] Encoding -> { UTF8; UTF16; UTF32; ASCII; AutoUTF } UTF16 -> { UTF16LE; UTF16BE } UTF32 -> { UTF32LE; UTF32BE } } subgraph cluster1 { style=filled fillcolor=5 Stream [label="<>\nStream"] InputByteStream [label="<>\nInputByteStream"] OutputByteStream [label="<>\nOutputByteStream"] edge [arrowtail=onormal, dir=back] Stream -> { StringStream; InsituStringStream; StringBuffer; EncodedInputStream; EncodedOutputStream; AutoUTFInputStream; AutoUTFOutputStream InputByteStream; OutputByteStream } InputByteStream -> { MemoryStream; FlieReadStream } OutputByteStream -> { MemoryBuffer; FileWriteStream } } subgraph cluster2 { style=filled fillcolor=3 Allocator [label="<>\nAllocator"] edge [arrowtail=onormal, dir=back] Allocator -> { CrtAllocator; MemoryPoolAllocator } } { edge [arrowtail=odiamond, arrowhead=vee, dir=both] EncodedInputStream -> InputByteStream EncodedOutputStream -> OutputByteStream AutoUTFInputStream -> InputByteStream AutoUTFOutputStream -> OutputByteStream MemoryPoolAllocator -> Allocator [label="base", tailport=s] } { edge [arrowhead=vee, style=dashed] AutoUTFInputStream -> AutoUTF AutoUTFOutputStream -> AutoUTF } //UTF32LE -> Stream [style=invis] }asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/iterative-parser-states-diagram.png0000644000000000000000000026433215031566105030773 0ustar rootroot‰PNG  IHDRa§h3‘VsRGB®Îé@IDATxì ÜcûÇïlÊ*•„(mRJ¤B"QJ¶´ð eß_û¾“l‰¨ìBѢȾ¤H) I¶(Kd—ýß÷þ¿ó˜ç<çùÄüòË/¦iÓ¦¦Y³f¦]»vö¸Š=jB ;R²c¤=„€ˆ Xµ^zé%û·|ùrÓ¡CÓ¤IÓ¸q㢧¯¿þÚÌŸ?ß*tsæÌ1-Z´0;v4­ZµŠ J²¥D@JX)ÑWßB@xŽÀ?þh¦L™b¦M›f£]wÝÕ4oÞÜT©RÅ󾰊͘1üøâ‹ÖzvÀ˜öíÛ›ÕVSΓç`«A!C¤„Åð¤jJB ‰üùçŸf„ VÃMسgO³É&›Å[o½eÆoV¬XahvØa‡ÀúVGB@D)aÑq_¸/ Îÿý÷ßËó×_}S»vm?V³fÍô ¥¬}÷Ýw͈#L½zõ¬2–ëq)Íè« @@JXN²¦(⊊Ô=÷ÜcæÍ›gŽ<òHŸUÙ\?øàóæ›oÚ˜®>úÈl¼ñÆVÁ"8­µÖ²±bdF:ù|.Y²Ä*jdMOFP~›6mlÖd¦¾ÈÀÄ*7uêT«¶mÛ6Ó®Z/„@‚–à“¯© (#ðÅ_˜aÆ™Í6ÛÌüñfÍ5×L;ï¿ÿÞ<ýôÓ6@ŸÌGèQ¤Ò_}õÕÓ“n%í]ùÎ;ïØLË ˜ÝvÛÍs–©Ï>ûÌ\}õÕ6p÷èkˆ(¶Z'’Š€”°¤žyÍ[D,Z×^{­éÕ«—éÚµkÚ™|óÍ7æñÇ7¯¼òŠéÔ©“ÍŽlذaÚ}ó]‰nöìÙæ…^0ü±?Û}÷ÝÓ*‚¸9o¿ývƒwæ™g•™™ï8µ¿áF@JX¸ÏF'„@ Ÿþ¹¹à‚ Ì)§œb-Z)›-ÙêĉÍ“O>iPŒºwïnˆíòK>üðC«ìáÞüÏþcZ¶l™¶«Ñ£GâÅ.¼ðB³îºë¦ÝG+…€HRÂ’u¾5[!iÀ¿è¢‹Ìå—_n¶ß~û sY¼x±¹é¦›LýúõÍ Aƒ, k…|Z«òÎ;ï´ÉÇ{¬eÛOíê0÷Þ{¯#M"„@²–ìó¯Ù È € òª«®2§Ÿ~ºÙn»í*Œ{òäÉV¹9î¸ã2Z£*äñ Ü”?ü°™>}º9餓L£F*ôpî¹çš¿ÿþÛ*“ĨI„€H.RÂ’{î5s! ’Àv 'TpAþóÏ?æ¶Ûn³Œ(>Arƒeð7Þ0#GŽ4Gq„-m”ºt(`‡rHÆ þÔcô]ø! %,~çT3±BjˆsÎ9Çì½÷Þf=ö(77°;î¸ÃÆZÝpà ¾°â—ë0/doÿÕ§O³çž{V8ò²Ë.3Ûl³9øàƒ+lÓ ! ’€”°dœgÍRD,J”ÂÊå\zÐ?@®zþù燲T$° Ÿ5kV…Ú’?üðƒÍ–Ä}J1p‰ÉC@Î’wÎ5c!pëÁË…¢’*¸ ©ÑH¦dXk5Âa¶páBKQ"æ–êÕ«›ÓN;Í >ܒú·iYd %,çY³‘C7$´”!J%9…+Ógœ*d:·Þzkë–Äm û¾[pGBK0¿Dä! %,yç\3‘@€bØd¦RQ,Z´È ‰{2¬°T€qIöíÛ×2üã>uËa‡f^}õUKúê^¯e! —°øŸcÍPD+VØRCŸºææ›o¶Y’Ô}Œ’ÀÚRyß}÷•6Ä­‡~x…õåvÒ! b‰€”°XžVMJD'žxÂÖd\o½õÊMä±Ç3[mµ•iÞ¼y¹õQù‚²5cÆ óÉ'Ÿ”r‡,Åd³! ’ƒ€”°äœkÍTDŸþÙ<û쳦GåÆûÕW_ÙõpoEU°z 0À2ë»ç€[•ßãÆs¯Ö²1G@JXÌO°¦'¢† Xûöí͆nXnèXÁºtéh)¢rðèË®»îj)7Þzë­r-27,a_ýu¹õú"„@|ßs«™ H"ðòË/[W¤{ðß|óyíµ×L·nÝÜ«#»Ü«W¯ V¯*UªXvý—^z)²óÒÀ…€È)aù᥽…€ðb¥ fmܸq¹^žzê)kÃÙe—] É}ôQ¹éì¶ÛnFJX9HôEÄ)a±>½šœˆ3gÎ4d¦ Ö1‚×ã$Ì'Uá"é`õÕW¯¸§yk.B@ü‹€”°±Ð’%F`þüù¦I“&åFc>ñauëÖ-·>ê_:wîlùÁ¨éxÑÀA"„@üÿs¬ H ðÛo¿YÂÒm·Ý¶ÜxgÏžmZ·n]n]¾Ô¬YÓ&¤ÒRH ‹ÃÙÕ„@nH Ë 'í%„€Ï¼÷Þ{f»í¶«P¢hÁ‚Xó}J`Í7mÚ´‚Õ 4°!¤„Åÿk†B |öÙg†ò>nùõ×_mH˜æã(-Z´°ÊÝs«V­šYk­µÌ·ß~ë^­e! bˆÀ1œ“¦$„@Xºt©©_¿~¹‘£˜ÕªU«¨"Ý>ø yôÑGÍwß}gˆÃÚgŸ}ÌŽ;îX®ŸR}Ù|óÍ+õf,(£à±ÑF•jhêW%,Õ…ÙX¶l™©W¯^¹QDR­cåvÈòåòË/·…¾Qîh1ˆ`‡^v$1XÏ?ÿ|Ù÷|Èælذa>‡”Ûw“M61?üðƒI-êMxH„€ˆ7²„ÅûüjvB 2`©ªQ£F¹ñ~ùå—EeEÞxãæª«®2Gy¤m·_¿~6þ¦›n2C† ±ëpû¥*Aÿý·UØ2Y¢V®\iýã? D²Å ×_|QÎ X½zuÛ1íêX! €,aá?G¡HÄ­½öÚåæ qkêºr;TòꔥE‹•ÛëÄO4wÝu—]ײeKsFÝÆ1cÆØugŸ}¶Ùl³Í YšüMž<Ù®Ç*WµjU3zôhƒ‘ý÷Úk/kÉ‚D‹V!B›ÌÝ-묳Ž»{–…€ˆRÂâwN5#!IP˜P>Ü’N1so¯l™2@§žzªµ„µjÕÊœyæ™fâĉV‘‚±™;w®U¸üqë®Da;v¬yýõ×m dzÎ:˶BÇ3¸xÀî?mÚ4kY£è8Ö«B„9§SÂR×Ò¶ŽB ÜH ÷ùÑè„@b@ÁIUÂp÷¥®Ë‹.ºÈ,\¸Ð`éš5k–éÓ§µb1"m3ÄhÁÎOl%…p‘¢˜ýùçŸeû_y啦k×®[èÊúßóKu‡¦[—zœ¾ !}¤„EÿjB àvÄ¢ä\u©ëÜÛ+[†ü•x-è-.¸à|O°{ß¾}ÍqÇ—6ðkÜùçŸo RíÑ£‡e´Oí£Y³f©«ŠúÎüR]®éÖÕ‰B ”H åiÑ „@ò@IuÁar‚àóEäÕW_5µk×6?þøcÙ¡ÚŸwÞy†À{è/R…@þwß}×|þùçæ­·Þ2çœsNê.žgΩ־të<ïX !Pr¤„•ühB@€$¥X¯Ü²Þzël £Ô-âºpk"ýõ—¹õÖ[Íúë¯o`«GÖ\sͲ úO>ùÄ`é"Ðä°aÃì>©õíÊUÿ UÅ•X¨¢H;$0O·Ðfªu̽]ËB@Ä)añ8š…ˆ<X© ¤p –¬%K–¸W弌¢5~üxë†d·$1_/½ô’™2eJ™õéÀ4 0÷ß¿9ùä“ÍÔ©SmV$ÜbíÚµ3[n¹¥9ì°ÃÒö ã=ûA(붸¥Ý9ÍJ”Bæ¼é¦›–Ûʺ7Þ¸Ü:}B ~ˆ',~çT3‘DÀa‰w³Ù;ë JÔüùó͇~h–/_n ¤Huý :ÔÆŒaZc5 Ö0‚ù·Ùfûý¨£Ž²ú(J©1¬UìKìŠ^¾?ÖºÕW_½Ü¡ÐatéÒ¥Ü:}B ~H ‹ß9ÕŒ„@$@áBYr D¦(8¸çpý"(8(Tüe’ 6Ø lÓj«­f7n\ö~S-Ueÿ·P¨Õ …¯Aƒ©ÍÙ˜4¸È$B@Ĺ#ã}~5;!¶Øb‹ ®G(Üï¼óNdæ‘Ï@çÍ›g(›ä”N,lÄ¥I„€ˆ7RÂâ}~5;!¶Új+«„¨îå㪄‘‰é$8s&+3U1s¶éSx! %,^çS³‘E«e‚,XPnmÚ´1¯¼òJ¹uqøòÁ\Ÿ©ʉaKUÌâ0_ÍAŠH «ˆ‰Ö!P"°z½ýöÛåz‡½ž ù¸YÃ^|ñEÓ±cÇrså J¨”° °h…ˆ%RÂbyZ5)!MÚ·oo¦OŸnù¼Ü3@YZ".ÙÌ™3Í®»îZnJo¾ù¦¥Ñ€JC"„@üÿs¬ È @–!Ù‚o¼ñF¹1ï±Ç¶öc*X¹"ô.2¬]©ÊŠæn»í¡™h¨B@ƒ€”°bÐÓ±B@xŽJE´ÝB¶à>ûìc&Mšä^Ée¬`O<ñ„$Ö-”*"(çwv¯Ö²1F@JXŒO®¦&¢ˆ.ºE‹YÒT÷øQÂ^{í5óñÇ»WGnyܸq–‡,•l„ VK-a¹ jÀB@䌀”°œ¡ÒŽB@Y’ûï¿¿-9äîÞ¬¾}ûš‘#GºWGjyÙ²efÚ´i¶L’{àXÁž~úiÓ£G÷j- !s¤„ÅükzB ŠöÞ{ï™Ï>û¬Üð Ч´1UQJÝ~ûí¦wïÞÆÍÐÏ<˜O«V­*ĈEmޝù! %,?¼´· @ Ø¡‡jn»í¶r½U©RÅœtÒIÖJ†Ë2JBpêVvë֭ܰ©IŒX¦"áåvÖ! b…€”°XNMFÄN:Y2ÓgŸ}¶Ü¤6Úh#sÌ1ǘaÆ™ü±Ü¶°~!ÛsÆŒfðàÁ†xçwZëØ†nXa›V!o¤„ÅûüjvB ÒuÔQfìØ±æÛo¿-7Ö­[›îÝ»›3Î8#ôŠÜ_¸!Ï>ûlS½zõró€°E²k×®åÖë‹É@@JX2γf)"‰E½8àsíµ×V p%[×Þ©§žj~øá‡PÎïõ×_7—^z©9ýôÓMݺuËñÓO?5÷Üs9å”S É! ’‡€”°äsÍXD ”-H\xà ã&‹r¯½ö2çž{®ùî»ï*l/åŠÙ³g›áÇÛlNjbºå÷ß·îÔ#<ÒÔªU˽IËB@$)a :Ùšªˆ*C† 1óæÍ3?þx…)ôéÓÇRZü÷¿ÿµûTØ!àdA>øàƒæ®»î²V0H·üñÇæ²Ë.3;ì°ƒÙe—]Ü›´,„@¨²ê†ñOÂæ¬é !AV¬Xa]w0Í–*ø¾ùæ›Mçέ sÍ5×LÝÅ÷ï_}õ•1b„¥Ñ8î¸ãL5ÊõÉíöŠ+®°±a'œpB¹mú"„@ò–¼s® È"°råJC°~¿~ýÒ³ÿôÓOæŽ;î0}ô‘9úè£M³fÍ™ëßÿm{ì13eÊÓ³gO³ß~ûUè %™Ž=öX;þÕV“#¢HZ!†€”°„pMWDŠxãÎ#,²ÃüÞ~ûmë„örTŠeû!(_0àSÓ²aÆfàÀ6~-µ/bÀ°€A¯qâ‰'¦nÖw! Š€”°„žxM[Dï¿ÿÞ\y啦^½zÖ2VµjÕ ÓAAš>}º%v¥ä5);tè`X.VÈl„^‚ö·Þzk«èm¹å–i›]²d‰ ÂoÞ¼y…rEiÐJ! ƒ€”°ÄœjMTÄ ß~ûÍŒ=Ú–7"(¿²,C‚ú_~ùe3gÎí–±-ZŠhÃbŸMà)ÃÅùÖ[o™wß}×üüóÏÖµˆ{±víÚå•W̘1cLÿþýíþwÔ! ‰€”°DžvMZÄ,R¡Â'F|üñÇ6K…‡¬C·û5nÜ8»E@>±[›nº©{O–,X`^zé%CnܘԴ$CR"„€È)a¹ ¤}„€¸ Ï<óLsÐA™wÞ9ãØpO¢$‘ÅH\nK‚ò›4ib­ḛ€ü¹sç”/¬nÄŠ¡àÁ|Ûú‰n¸Ál°ÁZÐj! „À¿H û - !È8D!‚•>®‚€|”'‚ò?ùäë.D1ƒæ¢zõêÖ’Eì—˜1,üË–-3K—.µ¸QàÐÇí˜Z”ûÞ{ï5ô5`À€\†¥}„€H8RÂ~húB j`‰9r¤¹îºë¬ÂTÈøÿüóÏ2劀~Š;ùlsóQÈjÖ¬i­h(l,W&ð—rÊ)Ö–Z²¨²ã´Md" %,™ç]³‘DàÇ4§Ÿ~º¥}ÀµF¹çž{¬k²oß¾ažÆ$„@ˆPñ² EÊ€Œ¬°*`Œ~ÿý÷7Ï<óŒAa”! *C@JXeèh›¡ARÖåË—‡Ž"4KAù”G‚+L"„€¨ )a•¡£mB@„¯¾úÊàæ;á„ Êj z°÷c ƒy_"„€È„€”°LÈh½¡@Vüo¼ÑôéÓÇ– Å ² òW¬aO<ñD–=µY$# %,Ég_s@`üøñ–kï½÷ŽÀhÿb=ÌSO=e©4þ]«%! „À¿H û - !2/^lk1æÊ¦áo¼ñƦ]»v¶œQ˜Æ¥±!¤„…ç\h$B@¸€(õæ›o6G}tdè‰ Ã™D!Š€”°TDô]P @!îm·ÝÖ´iÓ&ã)d›l²‰¿bà AOÇø# %,þçX3‘C€ÜóæÍ3GqDäÆž:àÞ½{[ke$B@7RÂÜhhY’#ðÃ?˜#FØbØ”Šºlºé¦¦eË–fÊ”)QŸŠÆ/„€ÇH óP5'„@qÜvÛmf=ö05*®¡Ý«W/«„Q\"„€pæ ¡O! JŽÀ³Ï>k°„tÐA%‹—¨]»¶iÑ¢…Íôô²]µ%„@´íó§Ñ Ø °lÙ2óÀ˜ã?ÞT©R%6ór&‚5lòäÉFÖ0} ! %L×€%Gàï¿ÿ67Ýt“9äC V£8Êæ›onš5kfž~úé8NOsB ¤„šBÀ[yäS£F Ó¥KoYkXÃ&L˜`þøãLÃB H +êêS2-ZdˆÖóÔ䄀Ȏ€”°ìi! |@`Ö¬YæÝwß5 ð¡õp7‰5lüøñæÏ?ÿ ÷@5:! |E@J˜¯ðªq! Ò!ðÝwß™‘#GZVüªU«¦Û%Öë4h`¶ÜrKóÜsÏÅzžšœ•# %¬r|´U>|¸Ùk¯½ÌÖ[oíCëÑhòÀ4?þ¸ù믿¢1`RÏæ9¤jPÊ 3ð×_5(!I–­¶ÚÊÔ«WÏ(6,ÉWæžt¤„%ý Ðü…@€|þùçæá‡¶¬øvÚ®úôécyÃþùçŸÐŽQBÀ?¤„ù‡­ZBÀ…n7Xñ;ì0³Ùf›¹¶üÿâŒ3,WاŸ~Za[\WàŽ­U«VNÖ°sÎ9Ç&1Üzë­q…Có‰C@JXâN¹&,JƒÀرcMÍš5Íî»ï^a_}õ•éÚµ«¥n€Ð4I‚5ŒLIJ7U&0íCoѺuëÊvÓ6! "„€”°, UD÷Þ{ϼøâ‹RÖtB=Ånݺ™SN9Ŭ¶Z²nK5²–Á—_~94åÖuèÐÁ´mÛ¶Ü:}B º$ënÝó¤‘ È"@þÍ7ßl]믿~Úy,\¸Ð$Íæ‚$…qãÆņ¹QѲˆ?RÂâŽ5C!PR`Ň¿eË–ÇñÍ7ߘڵkgÜ÷ Ô“ÜxãÍ+¯¼÷©j~B@¸æC‹B@x‹Áö|ðéß¿ƆáÊšà€²¶¾ï¾ûšîÝ»«Žâ*¤š7onÖYg3sæÌ¬¸i! ¢€”°èŸCÍ@„ %K–ØL¿ã?>çqm´ÑFæË/¿Ìyÿ8ïxÐA™Ç{,ÎSÔÜ„€øRÂt)!à°âßxã6Îk“M6ɹ]ê(.X° çýã¼c‹-,WÚ믿çijnB@¬B@J˜.! Š\҅ذGy¤ $2ÈUY­‘E@JXdO.Â…–¬éÓ§›cŽ9&ïõÚk¯Y:‹¥K—æ}|Ü€WʳgÏ.›ñu@WC$Z‘G Ê*†æ"? M@’"ðË/¿˜ÓN;Í 2Ä4kÖ¬¤c‰Kç³fͲ±uW]uU\¦¤y!‚€,a)€è«ù#0räHÓ®];)`ùC—ñˆ6mÚX×ì›o¾™qmB ÚH ‹öùÓè…@É ÔΧŸ~j;ì°’%n€E_¼aq;«šø)aÿb¡%! òD€šcÆŒ1'žxbFVü<›Ôî.Ú¶mkV®\iæÍ›çZ«E! â‚€”°¸œIÍCŒá¤7ß|³éÑ£‡Ùb‹-î=9ÝÉ–œs­™&)aÉ;çš±ðI“&™*UªX¶{OT#i Öî§Ÿ~2óçÏO»]+…€ˆ.R¢{î4r!P2ˆ›ûìR ¾…€øÅÞÏÖ(É?ÿü³Ø&t¼@àöÛo7ðV5jÔÈó»_sÍ5#0ÛôC,fÞé[Ìo-™’·¾÷Þ{fë­·Îï`í-„€ç{?“;ÒóS¢…@ü€ÿ«¯¾²Yzñ›]tfDQïý÷ßß<þøãÑ´F*„@F¤„e„F„€â|ðAsì±ÇFÖ§3IlØçŸn>üðÃ8MKs‰D@JX"O»&-rCVüÛn»ÍZ_êÖ­›ÛAÚËWˆ§Ûo¿ýÌ„ |íG !à?RÂüÇX=È"!+§]»vìâ8ðŽ;š?þØþÅq~š“H RÂ’r¦5O!'Ÿ|ò‰yúé§Í1Ç“ç‘ÚÝo°†&k˜ßH«}!à/RÂüÅ7²­CÈ9dȳçž{š£>ÚÜqÇå2âÆoÆ—v~ß|ó9묳ÊíŸvG­ -¿ÿþ»>|¸9üðÃÍlÚq&y`»í¶›Y¼x±¡„”¤8ˆy„öƒë^"‚D@JXhG /nBGu”9ãŒ3ÌÆolhÙѯºê*‡‚‚…¼öÚkfæÌ™ig´råJ»ýï¿ÿN»=וmÚ´1ð"I‚Gࡇ2[mµ•Ùi§‚ï\=æ„©ñû2%sB+óN”á:çœsÌ­·Þj¦M›–yGm> %ÌP£Ü$\PO<ñ„U~.½ôRk 9÷ÜsÍ«¯¾j-Zd®¾úê ÓûòË/ 72G6ß|só /ØX"gŸß}÷ɤ˜A€òæjåéÍÔH0˰âÏ;×ôë×/˜ÕKÁì¾ûîöwùÙgŸÜFÒ|ê©§ì½êÀ´YÀ™ðøþûïËmâ~å¾gAfìþ^ng}–˜¤®F ƒŠ •²V­Zæ”SN1÷Üs!c!0˜Â°§×©SÇŒ1¢l=™t¿ýö›ý΋ $Ÿ[l±…A¹sÚÀ•Ò¹sgÓ¬Y3Ó°aCûàçfÖ¾}{ËKu衇šûî»Ï¶£þ#ðã?š;ï¼Ó^묳Žÿª‡¢ÀÖ­[7YÊ@‘ûËAdÿPÈxùsdŸ}ö1×_½%)Æ]¹lÙ2ë!¸÷Þ{ͶÛnk^~ùeƒrÆ~Ûm·Ùf›mL—.]Ì·ß~kø-q$®Ò‘çž{ÎÔ¯_ßp“¦ë  n (E­[·.[ç^ØqÇÍ/¿üb¾øâ »šnK8‹.¿ür6þ|kíúá‡ì>?ýô“%øìÑ£‡UÚ°¨=üðÃf̘1v; ÊýΞ=Û¼ûî»fäÈ‘Öò¶é¦›Ú7Sâ’$Á 0zôhC¬ ³$ðÐÿý÷­‚‡g”_ýµá>ÆËÞ{ìaªU«VN¡ÅÂË-·ØK.¹Ä¾<²Ž—Ñ»îºËÀÙÆ'Š÷®>úÈl¸á†æ¦›n2믿¾ÁRé&Ö%––óµîºë†¤¤H +)üáêÜQœˆK'Nݼ¿þúËnnÙ²¥éÕ«—Y{íµmð>V®gžy¦Ü¡¸6¹iwÜqö¶ÑFÌþ'N4¸P`b?ùä“MÕªUMíÚµ­†Ò8’àÀ…ÌC逾sõX0k¬±†¥yì±Ç n#©Ž;ÖZò±æcU$ã” }·ôîÝÛ¬¯Y³fÙê‹/¾Ø&-qïÊvÝu×Ùm(Ä\PV 9øàƒ 4/”»âeÖI„€ƒ@ѵ#†ô}p9rSš€u©‚)Î(b¾\‘nÙ~ûí¸ï¬Çe‰5,µ=nzNV—Ûê‚b' bòyäsÞyç‰?xø‹î‘,æSO=ÕZ©ùKrC€,ð>øÀ4hÐÀ@LÖ~î[κ¦M›VhÌ]ÀžÊxP¼œ{™ó"»×^{Ùc_|ñECÉ)¨E°ŽI„€ƒ€,aú4UªT±®¨L1XÏ>û¬éÞ½»Ý¸pCº…€îTVõM6ÙÄšç1Õs“â8Š¡C‡¬b70í‘(¤„%êtgŸl‹-ì›! 7&â¼øã ‘7EÇÜNKÜÀP¨È¤<餓,ÏY’nÁ¤ÿq_˜ði·å 'œ`MóµòöÈ6\–¼5:ÜT={ö´JY®7Dw¿ZÎ ÞÞ±>BÈ+‰6„` ã/©¨op¿§SЏᢜ5kVå¬ÚJñé§Ÿnú÷ïoà5ä~ÉõôéÓ JÂ} }¬Ì ·°èŸ *«4öÿçp­ÌgQ–Š|Њ־¤c†âå¸SgÀåX½zõì ‰í°xï°Ã6È7 ‚¥káÂ…f³Í6+‹)³VýÆK’ £TS=V´õÖ[¯ÂzçX}Ž"Ä€ñ âM>(áÁ•zžƒê»Ø~Â~¿#y¥€Àqw y±óÖñ•#M^:(*PŠÉ¶DPŽIH‚[/нŸI ‹×õPòÙ 4A1AZ7 œ$¼Œ5ʺMþóŸÿ:ÈboZ6¥³°+a —Ø#‚#<2eôú4XšçÌ™c‡JI¼(ö~&wd¼®‡’ÏÅ ¾¯1ÿã+ù€4€´¼ùæ›6(Yliá‰ôJ2òø ¦f*GzR<ñ–P^àš”Ñ“èó°e ó`5/†®JQ§—Z!ˆ±ûæÄ3õKc‡jb•$B@ø‡@±÷3YÂü;7jY„Xña/…J@b8¨®]»š™3gÊÃs«)Å )añ:Ÿš¨²^‰Û£Œ”$¾@9Ò©S'CÅŠTq×FLݦïB@‹€”°`ñVoB  ) ‘[¨ù‰›jðàÁ–ÓȽMËñC€¢ÒXÃ¥‹2a—^z©åƒ#{O"„@éuoéÏF Øì¶Ûn¾(AÎÉë¾,X`&Nœh(mÓ¿«¤zÙG±7-/Ç’o[A*a(È(_d½¢£„l¼ñÆù9òû“tòÒK/™‡zÈl±ÅÖåžD""c:bïgRÂbzahZ °5Ù‚={ö4Ý»w—òU¢rkp}Ý|óÍ6ûÐCõ¬èw±7­rƒ øKPJ™‹0Þ£l 2Äl¸á†Ï4|Ý¡”òr0iÒ$[Œ‹ D”bïgRÂJ}Õ <þøã†àõ³Ï>Ûºté4üñÇfذa¦V­Zfï½÷6k¯½vѳ*ö¦UôŠh % ìŠ+®0‡rˆéÒ¥K£ç¡¸ÎÁ§}ûö¦Gñœ¤fнŸI ‹Ì©Ö@ E€7ç#<ÒPÖgýõ×/´™DwõÕW›Ù³g[ÒÏbK{Ó*å‰ð[ £ìTçέëM Xæ3ýÓO?Y¼N:™}÷Ý7óŽÚ"|F Øû™(*|>Aj¾´<ñĆÌA¬ RÀ ?gu–ÍP›öØc²€ew½õÖ3×_½Å‹‰ˆ*R¢zæ4î¬Óôì³ÏZ¤Rܳ•uˆ>—.]jxà¬ûj‡ü C•ø»Úd‘üŽNæÞPYð’5uêTY±DD)aQËà÷|ä‘G ŒödëJrG€Ä…SO=ÕÜu×]†øE‰ˆR¢vÆ4Þœ˜0a‚}¨m¿ýö9í¯rCµãŽ;ÎÜ}÷Ýe¤°¹ü^¸ )`Þ¨Q#C-Ͱ |X¸Ì8∰1Ôã‚çBW~óV±7ß|Ó¼÷Þ{––:™!VÖëÀ4.!P(O¿üòËæ¦›n*´ W <ôj×®m¦OŸnvÝu×Jö,í&øµºuëfN9å”Ò$Kï(x Yk­µ²ì©Í™€B«7\jÔÄDÃ2†Æ–q¬fdùR²[”s‚ª%B ”H +%úêÛ vÜi§TêÄtÿ¿ÑýöÛÏ’Þ†Y ãAf H._¾Ü–Ì"ñAR8l°-\ÏoÅ›?·Lòå—_Ú?*C+ %Ÿ(xÏý‚ò]!4R‚F\ýùŽ|`Ǽïý$¹â—n»í6ûP ëËê 6 õiš9s¦Ù}÷Ý=# õd}ùÄÆ{„iLq V& Ã&/¾ø¢}°Þpà eV°Ñ®W o>©- ¦êç+¼TðGÑpOˆ4h!E"üB@–0¿U»%AVüzõꕤï¤uJ¼.¿°IÇŽ-ãüe—]fæÌ™¶á•øjÕª•[§/…#À5Iœ]1‚«ýª«®²ÁüÔ˜ýù矋iNÇ JV)<Ú5pGJ‚Aâ‹/¾¦³<{¡” Ðçž{.Ï#ƒÝ]Õ¼Å{µÕV3ß~ûmÑCvÚi§Ù?Ü“a½Î‹ž¨(9RÂJ~ 4/ å\iç^"š¹-bjÂ\ j£6²‰™gPú-5jÔ(ý b4~û^™w !ØŸBêC‡5T5¯æ5¢j¯¤üóÏ?¦J•*%ƒ:$g,X° ƒÑ(A€ß>÷/eçw6-[¶´”,^¶«¶„H Óu V!ðúë¯[×C§NÌþûïoÎ?ÿ|˶í€ä™gžé|­ðyÝu×™7Þx£ÂúbVÌž=ÛäÊEÿPs¤ ñ1XBV™Mȣ̟Bæ*M^?(Óù ƒ²çdìØ±:‚8 Y•œW¯¯¹lQèÁ̶›ËÊtÝ‘xûí·gmƒLGÚøõ×_³îëìà×KX¯^½lÆ$µSɺ=æ˜cìŸÓ¯>…@¡H +9J y¾ÿþûM‡¬Òó6´ÄAù#BLÈ=÷Ü“qÎdT‘PŒÀWäæµ¢ìÊðáÃsj’ZŽN@21,<¼”/”¹¿ÿþ;k;(+<ܽ¢¯¼òŠ­ñ×¥Ksä‘GÄ~ ®)Ó>øÀ÷»¿BÚ/TEa¦" AʤI“r:w©×åÞþy;T~K‹-Ê:ìŸ~úÉRGäò‘µ±"wÀÅÉ}è+PÆR a‹ìB‡'QT$ôÄÇuÚù¾ S·oàÀæúë¯7'žxb,,÷íÛ×Rðw ÖúqÇóÜ{ï½î]ì2¯×]wÝ ÛPŠ>ÿüór™œ”YÉ%Û«¥™` w …#<¼~ùåûrJJ8¥ ý3å—ë–¹À!†Õ…kÙ²eeJbqd”§9÷ÜsS§šï’ç+(µ?ü°9ýôÓ-ë;ç{½õÖ«ÐŒÃ䎑ºä\·\ƒß}÷½*œç ưæšk–Ñ9¤^wËÿþûï¶ÕÃ?Üðç/Çân×ËeŠ«_|ñŶdT=zôð²yµ•Pò¿$(M; åbõqfÃ6±C© ûãâûôÓOÍ´iÓìî(TGu”eÖÞpà . >7h,IJ5v°pSDšbÒŽ@$ºÉ&›˜&MšX%  Ô^{íeEi£ ·à­^½º¹å–[ì±ÔÁ£d³ýßwß}æ’K.±¬áðñøè£¬²æŒó©§ž2Ûm·ÙvÛmíØN=õTw7y-§bÍwænX¼xÐb©ÁràXéòê ;â&?~¼­ƒx饗Úz“ãÆ+C Y«£G¶ìð/¼ð‚ÁÅ~å•WšfÍš•ÕÑ<ûì³íùç:àey衇ìz”hGŽ=öXsØa‡9_Ë>¯½öZÓ§O[÷rÓM7µI\pÝî¾îˆ§¢dPÏž=͘1cl;µ2É4g{>Ÿ©×d>ÇfÛ—ß÷ç'ÛþÚ.rA@JX.(iŸØ"€Òкuk“Î"ç…ªKÖ#,GŸ}ö™µ.ATzÍ5×XlPrœ7} FcùÁEˆ€6œ‡Ø’%Kì2uë°fÝyçæŒ3ΰ\Q({(Zðñ™*NarÚpÜl'N,×?ÁÁƒ› C£býpW%oó¸N±Tѱ\ZàCŒ™d|°Ui $Þ#€‚Ë;ÊÖP.`%„ëËè<`0¾£ s]\}õÕÖÈ q\Ä¢Œs,5A¹þp»!¼x<úè£ö¼¦ÎÄÙÆ1\ÿ(e—_~¹ár_w\g¼ŒðòÕ ±Ã½…[2ÓXRû Ãw^ž¤„…áLÄg rGÆç\j&«@IJ§Pe…Ò%é„  ·µ%†7â]vÙÅ>˜ž|òI«t8ÇãâmkÖ, 'œp‚eâ¦/ÜHÉ’öŽ`%ã!‡+'AéÃR†âؾ}{CÜX®Â|x07jÔÈ>|ßÿ}û § §ž^®m±8¿úê«EÅÔS¶v8%1“Ð6ã­LrÙ§²ãÙ–-†0u»£h;ífC¶íù>бÌ[5bÄ;®#j%âÚÆè–/âA92dˆýʵ†‹Å‹.I”!ÇuŽÅŠk¥š¾PÎÒÕc¤1 _£ð#´2Çu•Î=jwJù‡R“i,)»æô5ßßNºv•®—  Z,)aEC¨„@¾îáy¥¬9X²œ:”uêÔ)W‰Ò(Ž Ò9ž3”H<€áÉÃŽí7vVÛOÜšÛ² Š#ž§*ζtŸŒÅ+Ë0ƒã^)T˜'®&ö(—(sXéÜ®¬Lm£@Ⲍš`ôRpÅå#$‡pC›€pøC¹Æ¢ê®G·¸Ëøð¢@ö// õë×·J¹{_'f Eï‘G1d™®µÖZî]Ê–Ý×#Ê×U>×d¶±”u”ãB¾¿ÿ›-ÛóaH(”"À¿O‰HOCƒ…!°ûî»Û˜/biR÷ ±_VÅÔ Äu¹ Ü,<ÄÜâ<”ˆ­A!áx.²ÊØ·fÍšeîMç8”",I¹ˆ[±Ëe÷>(•<| Š'î¡tIîc²-Sr%’ùbÃíEÙ «êî3Ölý&u;VVbÁpGó7kÖ,sÜqÇ•sIfÆÌJ\åXÏÞzë-[°Ú} Ê1Œñ$T<öØcÖõéÞî^ÆòTŒdK1mûq,–ËL ©ý©Íø# %,þç8Q3Ì×Al –.JÜ@Λ4oò;_qÅ6~ÊÉ&Ã]3lØ0‹'”X·¢2‡ÌcEà­™L6\˜Ð206‚åy:®8!ókÕªeoîôídµ9mæû‰E ØwKac”J±°~ø¡³{¿\—Q²ÜŠJfÿþý­’‡; üÚ¶m[ÎM–kÛIÙ/K$n;ÎáÑGm©L°âòǵŵË5™‹Ð–2p÷5͵0&®kÊöpícµ,V*»&+K¾ýò+V1ÌÔ'áXƃÌîÍ4­RÂâs.5“Upv&¹Â.0¨ pÏÏ:)â¹!-l3&b¨Úµkg³%íÎç¨Q£ì‘À~ÜÄÕ¹ˆà¾C‘#«ŒvpGa=Âò@ÿ(2¬/ÆíE,V<ÜHn!€šÌHbÒ˜/®&æ‰ «ˆ—BÜ.Y²1qUžwÞyvîÄ!ås~¼SÛ•˜«`#†8*·p-n½õÖ9[Ãà›:uªUÆ¹Þ¸Ž¹œäÚÆ%ùÎ;ï˜#Ž8ÂÝUÁËdC;'Ÿ[r‹{ÿ\–ýRÂHâá÷ãWû¹ÌMûÄ*«nˆÿÿúSàÜŠyXØ¥ÀÂÄ[7Èù ^”¹ÁeèÄ¥k……>×#ûð $+ËÂÕ), ¼é§Þ¸±‘¶ß`•Û.UÈÂ$ø¿ÁšF |:w#±gpŒ9$Þ!€u– àÊÄ©½I•ˆe‰›„¬6U £¢5a TЦ²öµM䃀”°|ÐÒ¾¡G€0Ü\ÿX±bEÆ8ÿ{G(’çCU™û3 ®ÉÔ˜G§'pÆ…èÔ3u^ÖHJ€ËÏ '€Šê’tN<ñÄŒ5œvõ)ŠA@1aÅ §cC‡ô ¹0χnàɲ„wâ†×KCqºæ·ŸN¡æºø@IDAT…Ôî3hSfΜYÁZi-¡ (_ðú‘¨)n¦’fî>µ,ŠA@–°bÐÓ±¡C€L?X­‰åHu/„n°67·TħS’á“AûÆod´Þ”dPíª\äX°î¾ûnK2ËýàÁ´\}•qáq  3$/2”# £†0RÂ\ÝùÀŽ;îh‹Cˆ*ñh°òC*)6mÚ˜1«HX!3•‡øíóbññUW]eêÓUHí‰}໣â…D‰€Ü‘A¢­¾A sçÎæé§Ÿ¶±6t˜ÀNàM"†&_:€BUé”Qb &‡]R8"Së’ß>) U}òÉ'Ó–ïJ× •”$’ 4âêÏw S…ñþ‰'žð½¯$vÓÿ«¯¾jöÚk¯$Nßó9Ãîò¼ñ„4Èoø-*?éHp>ĪÜ(ó”ÓŽ€~*@H„@ÐÈ4âê/¨›xñÅÛ‡ <ŽÐ ä´Ô¡½‚7'»uëÖÖŠƒ"•$?x)€½þ /´Þzë­ö“lHbCQ®`¸§Àù»ï¾k¿S¢ ÅËÉ$#òƒ>0:uʯsí-ŠD@µ#‹P‡‡çÎkm³½ ‡wáÄ´d—ý÷¿ÿ-ØYl­µR"âuíHg.¶“DP¸2NT²¢hþù†Øº=÷Ü3û«öÀuI?ÊV3\ëæ7mÚÔÖ‡¤tYº Ëœ×N‰C Øû™”°Ä]2É™0Ew±Úð€#NDR°†C^yÞyçÀ\ìM«¸Yw´_J£B¹5j”­Û˜©Îbq£ßÑX½8'”*V°”Wöé§Ÿš®]»šÝwß½Ò¬Åö§ãã@±÷3)añ¸4‹ ð¦ŒÕ¦Q£FæÔSOͰ—VgC€°¡C‡Zoýúõ³í^éöboZ•6îóF?•0†>cÆ ›-I©b™$™Àj%Åi§f(ï• „aƒ;Œ@²êÕ«{Õ¼Ú‰ÅÞϤ„Åì‚Ðt*"€"vÝu×Yë Øk¬¡PÈŠ(e^3uêT3räHsóÍ7{ò0*ö¦•y¤þoñ[ cdõ=ÿüó–· òaIyp'Ž1ÂÆpA¨ê—P[’s1}út› Ü­[7S£F ¿ºS»E Øû™”°ˆžx ;?PÄp¥Qžäøã¿UðAzKÖÞ;ï¼c1Ûl³Ír8*û.ÅÞ´²÷àßA(aŒžº…–>à€L÷îÝý›PÄZ&xž—¨=úõëHìLú$M¼òÊ+Vã|È2± ÇÇá{?“æãÉQÓáC–w´ Â…ÔQ.ŸŠç|¸2dˆ­qHìJ©ëÖ¸>úÈ…ZvnÉU #5Þ ^¶l™m“ºy!P\w¼¬üïq]Ž L9…­¹Þ`•Ï&(#d&Qˆ§;öØcm¸Ùœ£±ÐœsC@JXn8i¯ À<1)¸V`Óæ­<,2yòd›u茇 ^·äª(²Ÿ›£ˆv(#÷Dä‹t-\›ðè!|:Áñ|‡¬tÉ’%,Úz‹¼àd“wÞÙ¾l œ‘ £FÒí¢u EËnûÔøD7(`ì7nÜ8X:!©„Œ\òVÈ^%å ˹W¯^¶÷3År–Ç'IßÖHÒd5×h#€BC–! ÕÄW„YN=õTCÂ@eâp†±O>.(*P>ÝYm(e¼Y~øá¦wïÞ¡µV†‡¶ù‹/¼Äl±Åj¬^©‚†’•M)ÀÆ~Ù²Û´icàË‚k¬nݺ©Ý%þ;ø^À ñwüv%ÉB@JX²ÎwdgK¡âË.»Ììºë®ÖÕö‰P’ø²q=Âpïd9cw»#óQÂ(]ä¸#á!ÂâÕ¸qc[ä¸_¿~Nóúå¨_¿¾Ñ¢rÃÌ™3-?/ …w¨¸fß|óÍ2‚Ör ¸¾ T½ð æ€p­­¸è0ÉSòè?ÿùOÅ´ÆÖšÄ-IŒq¢ƒ ]†·N“¨€·تeÀÖ³gOký:æ˜c}"­€a5 Šl1bÛ¶mË0Öå˜ÏþéâkPT)3“k“¶$ÉD€ Èwܱlòë®»®¡ä–T^  ¼È÷:/\‚ˆw…Ê‚—OÂ0$ñF@JX¼Ïodg‡vå•W0âÀ¢,¸}°dz¸¡4japã‚’‡‚— }€û8-'¬±<àƒÊ å¥?\ž’ì`5‡û—/nJI|ßsÙ™9YqPÀ8 Ä„m³Í6χWJ߃5L"*Cþ:ÜŽAÊ{ì¡k3À‰íÛ·¯-.‹XÀElW)a;aq.q) S‚ˆàó8ñ_[n¹eÆ©xé>¤T ’'™ÀÙºuëL›+¬÷¢+J $¼”HrCà ƒ2íÛ··Ô<$ùH⇀”°øÓÈÎ Ò´‰‡ ¾).‚‡W&ÁéÅCÎiï½÷6S¦Lq¾êS”C~/Xï›4iRn}e_ˆå*öeëÜ)eTY_ÚV2ÃqM^ýõhnÊï©oQD@JXÏZLÇL)"Þ–áØŠ‹`•½ZY½G/pn¼ ¬@ñ#®N"R€l‡v0px-dÏ›7ÏZÄ‚î;Êýá–ä2qâÄ(OCcOƒ@ð¿Â4ƒÐ*!@AaÌíq²€qVQ†˜¯,ð¾X CêÕ³æškZw.™!Šñ`ù¸"㽸NIç'S¥ŒTsÿìß¿¿Y´h‘yøá‡s?H{†)a¡?Eñ D¦dMx≞ºå€$—•å3Fn^[%öÜsO3cÆ ËÖ4†p @€7ٺ͚5+Ù€p—öY±$wYà9kÖ,óÊ+¯ä~ ö 5RÂB}zâ?8çÍîÌ3Ï4ðÅM˜_eAùÌ× C*nÔ—„‹ìùçŸOݤï F€€üæÍ››5Öȯb—1‹ÐµÀ¾ÿꫯ&øL6uî‘gœq†Ás°xñâÂÑQ¡B@JX¨NG²ûø­·ÞjŽ:ê(³É&›ÄròÜ(·Þzë¬s«Ì]™õà ;8AÐé 5g8D«cŽJÊy¾â5ɪsmæ;ío,çà‘GiïÄœJ¢€”°hŸ¿ÈŽë AäÐ*ÄQ(ÐMÙ‘\JxíŽÏ:uêX‹nI‰ेÅB\‘¼$xi±e .\¸0ò'âÛ³Î:ËüöÛoÍ…Ä âúFŽXŸêȤ„ùƒ«ZÍ‚Àøñãm°z¯^½²ìÝÍð!åbó:;Òñ7"ou#’Üeâ.qE’¸Qˆx©„Ñ?Ö°($P¢2Å勌S¯­…ÙÎYäð®é÷ ©po—îóËÑ‘¢N0þ!C*ÍŒú䉫ŒÌ=??Ü‘´¿ýöÛ[ Æ;ï¼ãîNË De¢W¤_PQŽì½÷Þ³íýê#ßvQ¤R©]pçûí·i›B Ââ³@öá\\|ñÅv{¡ó§V,1µ·Ür‹­”Qh;:®tH +ö‰ì™›SçÎsRN¢ ÐÊ•+ÍW_}eêׯŸu~+a”âA‘ú†Ÿu`Ú!6À †+²Ð,G?b—$VñR©Fy‚,Å‹ßÊàÁƒÍ\`« L˜0Á¾0òû!ë ×äÉ“m67îT¬gîÚŽ(cd~¾ûî»6;™¶ G}´A1£”9Â22YÙr½ø–+RáÜOJX8ÏK,G…Éþ—_~1”ሻI~./¿•0¼ÔâŒBüMܯ‹RÍoæÌ™¦]»vwÏ5êGÌ–œm·ÝÖ*b΃™™†cÆŒ±îÑ“O>Ù*Z™š®Y³¦:thÆÒO—^z©UÒ¨‚ ˜Z®XÁà÷B¹«Q£†=}úôÉÔE^ë=ôP«Š’&/ØB±³”°Pœ†ø‚o”qsÎ$o¿¸4r\=~¸{Ü}£„ñ–,IÔŠüüóÏ+ .φˆŸ×g×®]mLU¶1ø¹ØM¬ô=ö˜ýÝ¢°òÒ˜I7n\é –›r‡X1,}Üág«[·nY³…T.(;صÀùÁÊö裚åË—»¶h1ìH ûŠÁøxƒæׯ_¿Øò¥ž&Þ|)W”‹€oâ~ oÞ¸-`*—$ ²"yØêŠ-ò~]£XÂPNæÏŸ_²óÅ_ØrJü>xêÝ»·9餓l)µB•ξÑF‚üiß*jx%µjÕ2ûí·Ÿ½×zÕ¦Úñ)aþcœø°€áv(Æ5s%ie^<Üü´48ØC´_S§}† â“vÚi§¢åçuƒ5¬”îr(& | > W#¿Çý ¥Çï¿ÿnˆó,Fx)ãØ3\ŸX'YöRHÂá<•K/ç“„¶¤„%á,—pŽK–,1Ï<óŒ8p` Gl×Ë–-3ÕªU³q¹ôìçÃÍÝ?1j”Œ™3gŽ{µ–cŒÀ×_møƒª¤ñû%¢ÞX…°H•BPºpRçµcÇŽfÀ€梋.²ëà«W¯žM&"K²PÁÚGÌqa¸?÷ØcÓ­[7SµjÕB›L{Ü1Çc&NœX2,ÓJ+3"_±ŒÍhƒ¨ˆo’wÜq‡!htƒ 6¨¸CL×äJMáž¾ß9§/nü¼%ï¸ãŽÎ*}Æâ /öú*Æ•™ ¼((\›¼°~øá¹âé>Ì0¸ý°x¡x9˜­½öÚöÅf|ª_wÜqöÏÖ-';r½õÖ+[v¶CÉãa(a¸%Qúî¾ûnÏc¸ˆGƒ›’œy8cÐg¸%,\ç#V£!å RÆ$I¾JÊjP7Jbƒ ÎÀB)‰?(aX™Š¬µŽ{®Ø¶2uÍôéÓ ŽÃÊÔn®ëù ’L•Gºß#!Å Å·Ï=÷\ëöœ;w®6l˜U>‹m7õxZ”G‡#u»¾‡)aá9± œ:¼YB$˜4ÉW ã†ï·¥Á9 sƒ A¦3.}z1GdååBœ­w®Q¿Ýæ¼°QGöÅ_Ì6œÈn‡öûï¿7ÄÀzê©×áa‡æË|È–„¤™—.IxÞsé‘û°ÿþûçéɺO9bpr!iuÃÂà÷Îé‹ÏN:™Y³f‰aÛ J —!Aõ2&ˆk”Ø,^Þ‚è+Ó)‡Æåž{î1çw^¦]ÊÖXn®‚BŒ›LÐçž{Î{ì±¹š÷~n¸¡éÞ½»uyæ}° )aAœŽpÀM¹Ž¤ éç r$iu° úC\ nÉ8[l“úÉ5EV$Õ¢$ÄWa+eòÈC=d.¿ürKé’ ;ïaÆ«`q£~e>ŠbXç×qI ‹ë™-Ѽ°=ðÀæˆ#ŽHWQ¢aÖm>$­îA¥‹Aqo÷zÙ ‚Zôzj/=((3µk×N¿Cžk¹>ýŽ s†äXÜïAâÆmÓ¦å s÷M`~.¿,á™Ê0¡…#c缑™Î=¹XŠ 7Zö)aÞa©–V!ðÈ#Øo´I”|HZÝø­„a­#S‹à`IüÀ Ö¾}{Ï&FöbP§4/0Ì-7ß|³áX*8·26É&æûÚÙgŸvXX–IBB£Ø÷5×\S¶¿3æEà?µ#)k”‹BWÖ@ Ðnk7nܸ"ZÑ¡~! %Ì/dØ.w³gÏ6^ÕC‹"„åsÓËG‚º§Ž w1I¼À ÃïЋ¬H¬7AYpHÁVŠä‘N8ÁðwÀ˜'Ÿ|ÒNÿâ‹/6çœsŽå1C¹…V"ÝË t§vš-Î óþõ×_o Y ÍàžØ£G»6~øaËæàë÷'D´ôûé§ŸúÝ•ÚÏ)ay¦Ý3#pï½÷Ú›ü7I”¥K—x‚ˆ¹ÊGPÂÒ•9ɧBö…?ê“O>1d²JâƒñTXl°tz%\ŸA¾,<òú믛bÈQ½˜;Š'<_ðnQ“‘—¬µÖZËäNmŸ ç±cÇš·ÞzËòŒñRŠ;ø‰'ž°îIøÅÀòEx %TMmïïë®»®­0zôh¿ºP»" %¬@àtXy¸aÛtR¢Ç|­``…+²J ¸™ÈÒ’Ä,~ä©„ñ2ƒ[‹R)…ß%\[Tà·rë­·f¤“¹í¶Û %ŽöÜsOˈá…ÚßõÇl•ÈTuÜš>ø`à1³»í¶›d±’ð %,<ç"²#ÁýAFL×AÇ6… 4”°B8™xÛòçÆ ‹7ejãI¢–£… z^¡/ ŽK2(7hº³Û‘ø-܇ÐJpŸÃª”*¼€þõ×_o±lÐP K{è"H–xï½÷ìô!C‡MmÆ÷ï¸%}ôÑŒ‰¾@T@@JXH´"_(ƒC-´m·Ý6ßCcµ!ñ`€V*åp¬w3gΌչHêd "hÕª•çõë4H\ëÖ­kÝyXÙK%¸É2u,Ü“&M²q]©/Mü~÷ÙgË¿‡»«…ÀQ wß}wK«’ãh³wïÞ% ”ç>Mr‰’p %,ç!²£àÍs=oXI‚oI?çÁ‘¯¤ÞÐó=¾Øý¡«xöÙg‹mFLJ—^zÉWdPR!,5]ŠJËvÛmgš6mj{ì1Kù‘+1 ŽP"|\‘ÄZ¶lÙÒ–?büd"ãÆ<ùä“M“&Ml¦"îMJ!t­ëÔ»,ÅÔç¿—wüoŸZŠÜ”ˆ?á­/É‚Œ·ÌB-Z…çæ+&ã Ž³¤R‹xc©ÛÀ ƃ•¼R · V½ûï¿?ÐkóüóÏ/ƒj¬F$°è€U B£V­Z岋O:é$sÈ!‡Ø}QتU«V֊Ͼûîk]ÅÐWl¾ùæeÛ‚^à^ •÷îݽúKA@–°@ô5w¨I†ûƒÔë¤K¡ñ`àVJw¤sÞ°†•:Ú‹> C+X‡ ;8ËQ¼$”B £_øºJAWá†n/Gc=Yé^œP°às+`N;Ä’¡T–RsÆBI9ܼ(“’Ò" %¬´øGºw‚U1דɔtY¼x±u[‚C”0ÞŒ©'Iݲ=ÿD,Ÿ7}ÀA1Iesç&üí·ß¦Åîûï¿·±—_~y…íd/þöÛoÖ³ŽŸb<È *FÒÅ—Ó^!ÇB1‚µCoÆ… WºcÈP~çwlVž_£(¥;’9¿å–[š3fø5Å´í®X±"-‡^>®Q~S™îYi; p%F晤4H + î‘î•B°¼AùéB»êª«lJ8¬(8Ü|yÐ`}ã¡C,™`ĤQ£´p ëR|ÒXdذa¦_¿~ö;YÓ^vÙeeØSNrUh%È\2dˆ=¦l‡P¡)·[bœ)@ßA":Ÿü6üâsP(Y«Ó·ó4]ÐI>:ôÐCÍ}÷ÝgFŒaú÷ïo d­ñâ³ç~¹£F$ÌùŽÜqǦ^½z¦qãÆÖݶä^þzöìiÆï YŸ# %,`À£ÞoLß|óMqök.ÄW >Ü*^¸úl(Ž Ç΄ lmF,dÕ«W·ÌÏ·Ür‹9ꨣÌ%—\bßZàr¬ÙEí‹/¾° ص×^k-_¤óqÄæŠ+®°ä‰ÔrãF‹Å,_ÁrT¬–oŸ~íσ‡Úƒ?ÿü³_]¨] â%iü~O¥Â¨Îò„è@˜%†x±cþ“'O¶ŒùTóòÄxÜÂw'2:/ºè"{_qî?´¢Ø…Id +íÙVZü#×;oLÜHütŸqsC 3fŒUø 9äæ—Io§é¸Ê¨ÕÖ·o_[Ã}8½àÈO þÒÉQÈ Q¤(ê éúÎ4ÞÔõa²„‘5µÃ;(@?õ$…ôûG}d3Z!õS¸ÆÃ·ˆ5 ¨TÂïœrC¼f CA\/†X™q©>ùä“Ù t»¬aÂ]¡3)a ÑŠLPûŒ¸+\~ ¤§Ô^CQÂIáÛiÓ¦eìbÄLBÝ6GH"À­BDJ‡pCt 7Ë|¥X+ý¡„…I(¹6·I˜ð ÓX^|ñEÓ±cG߇Tê˜0g‚P©8Öxg]Ÿ¸+sͺk°bÅ'äÁ)ÚÍ'–ö•+W9äœú’5,'˜|ÙIJ˜/°Æ³Ñ‰'Zn?­` ‡éž›Š®I,]°Q@Ÿi¬¼Ñ¦º5è+_)´^¤»Æèg|»¯\–$æ& /Ä"A–ìw‚ p†áeºŒ¸^+{) êŒ9÷ÇýH¿X&œx„Aß)ÚÍ'µ'‰ ›0ņ•æ¬H + î‘ë•2qXÄ ù-o¾ù¦­EIFÊ.Ç‚5‹·Íbß&¡c˜?¾-IÂM“Z¾â…%Œ¹97î|û÷kt¢«ð ]oÚåz%£ÕÍäîMË[Áúãü+n vM—.] ”n«“_#à~C"P:EŸ—''¨Ë=¼[ŽtëÖ͆Q¸ƒ<÷Üsöþùõ×_;»„ê“{;™’zù ö´H ïÈöÆ\÷îÝ+5Å{59”.8·ˆÑÂÕB}3\YGp.ÙFd5fº9æ2ŽÖ­[‚ô>úhÛMÄlT­Z5—Ãí>X"ˆ KukæÜÀÿv ›ưpûÌž=» ëc¾ó×þ…!€¥¸S§N…œçQa±„1l2‰#!ÁoÁ:tÌ1Ǥe–§h7E¸Éªn°ªH÷½÷Þk x;c"•óƒ’2âNo¸á†¢élœöýø„|ª$8ª¬zR̃0¸iª§bøôÓO- T´ B¸,yƒÄâ…âå˜þ¾ÉÐäf\¨›A|[:ulŠ97Tè/PÊ «ÈEÞ~ûmû¦ 5F1‚ôž{f1íx},Y§<<°z)(ÓA]G^Ž›¶Âr¿ÃârÍ5×XJ•Ô߆×s¦½«¯¾Úº«°¼…A%=z´ÊÆoÁ:Di¶L×,÷ø 3ݯà|áæ§2E˜…ìN¡.¼ðB›汆elÅÞÏd Ë™ ñ8¦Nji2Ý„ü:nZ”ÒI÷ÉtÃËu,d+wFÖ% iè”~ÁB–«àŠtâ§r=&Ý~(œéæ˜nß × Oà·$|`ÃeäuãŽ}*5"(ƒÄ‡-X°À÷¡àî­ìÞW£FŒ ƒƒhkXØ0ÆŠû•—®°ep2¶¸Š”°¸žYæ…Å å$(·‡GÃÎÚ ü?»ò6ëÒ<òˆ%Ízðÿvˆ»…–,¡’ð €Õ« “aŠ sαaR4¼ûÜsÏ=-Gc!œ‰Þ"9-I Kι.h¦ÜäˆËÂ]7ÁýHP-YKTȇ¢«)èĦ+aµ„1/¬-²†{†½=þ7Þ°1HÅZƒó·"#Wòé.§}±d“ˆ»OâXö¸ª`ºw˜VÖ’”°ÊÐIø6\v¿(/) X1E»Ý­ñ€«Œ{ȽoÐËÐÌœ9³3xÐãPÿ"€+Òë8½[O¿FK.B\æa «H‡±bgu–Mnq/§Û7lëöÞ{oãÐÓÆCã‘Êíƒ7!b6ÜpÈÎÀ¿a{åŠd„a¤¨pÃÚÒ`Uæ™’’Ò#°téRÃU ‚”0*aÌŸŒfjgÂ!è7~Tý ëš,j÷²ßýzÑ> KXùq{KüE@J˜¿øF¶uƒgžyÆÀu#©ˆ€—J­`]q6•¯!ö襗^ª|'m ^Œ°þ”Ârž07ÐÍ·hÑ"—9!dJ&Eˆ¹Ã&ñ)aþâÙÖ!‚ämˆ?IE¼TÂÂk“:ÛV­Z™O>ùÄÖñLݦïÁ!€E«OùÎì*Ëtö)Õ'á¸$ýøAÃ=2jðBЊròÃ?Øéî²Ë.æá‡.›:\a¸òâ $æ@´xñâ8L'´sÚSSÚqŸ¤"“¨à•›–‡G),g–~ ¬àAË–Ÿ Ö¢€ARêÕu—ï¸ÃÔ°aC³ÑF*mø!d â–£v.U$P̦L™b»‚µßMݵ®­¸VW˜þ%þ! %Ì?l#Û2e+ˆahÙ²edçàçÀ!‘õ’´Ò7x¯çO–¤”0¯Qͯ=\‘Ä@•BxIóu ­ÂSO=å4—^z©YwÝu Vá¶mÛ,áI~÷sæÌ±Ïƒ$Ì·s”V ÔCÞ'¦}eDf>IPZPRÉK sLó¬_¿¾©^½ºµx9oµ•¼áŽÄET k`¾ƒÅN;íd–-[f>ûì3g•§Ÿãv†ôLÖ® êY:ãâ“JÄÜQ"*ˆù„±)aa<+%©Ô°Pà &I%S¼¶„…]  HmÅ–þšð{-V° i)Üs »ÆøˆÕòËFûé„õnw$Ô5q®;¹$ý;«é¯,ÿúSË!G"Þ*ó)dò)y:¼+VØtx¯2Ýä=|‘µoßÞVO#@‘S õáT-˜;w®³­TÂõÆìH7:u2ÙÉô¾ÕV[YÅð ¨C¨¼7¡4‰ÄÄI¼G@J˜÷˜F¶Eb><-UÜI€Ã æE½H÷\Á=Ìñ6ÎX‰‰ÁFæ¬$8ˆÅƒ¯üK%QP¨ÍHíWîaAÉ!C,•÷„ý÷ßßì·ß~Auh?Xe óò5üiV­F0kÖ¬iêÖ­Åá2fr½tE2h°(¸#+Ö˜ &¬ÿàÚÀyÒI'ùßY%=` ‰Â‹Ý×\sÙwß}=É8&óÒ¡£pà¹ë®»œE뢧¶*ÓõêÕ+[ÏÖrçXøÌœår;Eä Þ‘±cǪ¨T«V-"£ŽÆ0e ‹Æy d”¼ée$ÉŒ€—ü`N/QRš7on–/_nƒ ñëÓ?p¯A¿?U©ÅûTê±dêŸÈÍ7ßܺ%3íãõú5×\³‚æu¥nÅ +øë¯¿^ê¡Ä®)a±;¥…Mè믿6¼ÑñÆ#Iqài£—%% ‹ú¢«ðò ÈÜVX2•£àŽtPäEžC‰·ð»W–¤·˜Òš”0ï1d‹äx…ñRŒŒzj^»£àæqcw7ã¨Û=‡(,óR„ÒߦM›’ÂÞ(X ./Ê AªZ*?~¼7n\©º÷¥_¬à¸]¹&%Þ! %Ì;,#ÛS,Šó©üúáŠtzôZ±sÚõã³V­Z¦víÚæí·ßö£yµù? [ : ×F”,aàå”2*ÕÅDòÊÌ™3KÕ½/ýr P9CÖ0oá•æ-ž‘lr›m¶™}°Fr ¦|ÊÆx-QrG:sÇj*Î0 ï?¡¥˜={vh^Œ¢¤„q6à9œ7o^¥·±ìZ ·%˜v2Qx|ùå—É]!à%Ì!“:¾Lí»žZ™Ó§O/¶ïB@J˜ Œ¤.ò0•¬ò³6E¬É–òCÂ`íÈg^íÚµ³¤¾Ar2å3¾¨ïK’ åqJIKáÆ0jJ¬öXmÈ,uK1¹‡ f<ð@sØa‡™ Ø,i\Žûì³ýNRÀÓO?]ÖÄ­Œ¡I“&6SrĈeÛÈ”<âˆ#l\c={ö,só±_ÿþýÍ AƒL³fÍÊŽ Ãó^k­µS¶)Ì¥„rˆû€!Ÿ’(Üð%™À Æ ˆL(¯ÅýFíuÛ~µGóvØÁ6ö«¤¶‹…å!L¥Ã¢BQá¾fÀΰÔÂã…äæ¼(ѽ{wo†‚…"?%“:è sà 7” wògœa>ÿüssùå—›³Î:ËÌŸ?ßn?ûì³m|Ù¯Äþáâ?òÈ#í6ú™/Å|C‡µV4§½°|’AÏ5ŗǰ`臔07 \æ!J걤rüTÂè9jîHÆÜ¸qcÏ›¼Ä;°¶àâ “DÍé`Gõtt…äF±s„ŒQ Ûc%Dø cÅrK™[àÙúæ›o¬å æ”SN±/À¼zè¡Öeé(aü¶À<Œ²ñÆ[åQeŒ¼9;á<ËÞÌM­dA€øÞn½.Ó¥ÛÈmæM•øŽm¶ÙÆ—±sCŽ¢¸&d óî² —@í°Å¥*ÞÍØß–À‘ß/åÆÜ’IÁa½[‘J-ÈÏï7¤[Þzë-[+2fÌÃËl{øá‡#Cú mʬY³ÜÓÓrH +¸8Fªq)‹GÃŋۛ#©~H”Íú¸$IŪKÕóYL›S¦L±V°|öÅô—ë±X}¢zމ Ë5¶ÊË‚ÜÄõ-X°Àºíî¿ÿ~C–$µ%©€@b åÈ‚ýõ×_ÍÅ_l¨C¶óžéú †%,Ê÷®Ls z½”° IÜPñëK Ë~BüvE2‚¨Ü|SÑÂ5AVÆ’â ¸›˜¢0†D‰¬5õ,@«€% W`6ñ² 74½{÷¶qiÔþ¼õÖ[­Ë‘1 >ÜòìgJ-Zxï¼óÎlà Ív¬y(“©ÆÐ 0B©²J“ý§˜ñ¢ÉK¢‡Ü`S§N5çœsNôðˆ¯¾új³÷Þ{›-ZøÒ3Ê0êFQÈ”zõÕWÍi§–Óð bvâhr: D;ùy¿5j”A©íÑ£GˆfüÿC2cÉ’%fÀ€¡[.zðÁí‹Î!‡’uwÜ—é rg=0Í<^ɬ¦¸7×½[xÆýLHñbQ{{â‰'¬b F’¥Øû™,a ½zÈŠ„pSR9ćàŽô;nKCT¥uëÖÖ‚³bÅŠ¨N¡äã& ÷va”樺#Á³k×®6v+›xYÅŠ{GªÆˆ?ÃÖ´iÓÈ)`Œß‰ +ÒŽCS‰)a <ýÄ «†šta‡ß!wLwõjì<Ü¢|#ã¡EŒ‹Ê™~EÉKQXÈYSg‚Â5Š ÷páöS‰•â–7ÝtSk¹ÅÒ'))a…cÙ#çÌ™cÍßa½á‡ XÒ°¹yK*G€ØB•1ª£L[)]ó /„Ž–Â=ÞÔ¬A÷¶¨,c CÙ•x‡!„¶H G@JXáØEöHâw Ü“dG% ο%jñ ©xPΉìQê¦"“ý; ¥mê‚ìG¿JX”Ý‘ ÆËnU‡µ>xã×#JØÜ¹sã7±g$%,@°ÃÐÅÄ8QrFR9N<˜ß–0\‘QWÂ@º YÃ*¿¦R·¢Ø@ŸÐ­[·ÔM¡úåìH7XÃr¥«p§åôðòÅ3eùòåéwÐÚ¬H Ë Q¼v ø—·•)Ê~^QVk×®6¨6ûѹïåx0÷,qIòVLYIn»Ùf›™-·Ü2·J´WÜ‘@‹ýG}d³Ke캥<“\’…ŸV)a…cÉ#©£Fµ$;A¹"I,aÄ’jOæ­$7&Mšz+3Á‡—Ü‘”2zúé§s;AÚ++(arIf…)ãRÂ2B¿ ¤ÁÃõãßU܃¤5ˆx°¸¸#9ÿ:u²Aæq»ü˜ 2(7a+Q”n®Œ3ÊÙ‘î9uîÜÙòÚ‘%.)®_2$I0‘䀔°ü1‹ì¸"ykÁµ ©âÁ`/÷;̹8–°_~ùÅÖÚŒÃ|üœÃ„ BIÌšn΄/ÄÁÆÜ6Ø`û"ªøÅtg:ÿuU«VµU”ð?v¡§qa¸Eò(”0qƒåvꈫS§ŽY{íµs; ˆ½¢Î–:uYÃR©øÄ¡;î¸cÅ!\ƒ»<¢Ó=í¨' ]E\Ë´“ pe«V­þ½3ÛrÊÿyÿãyŒ1–± ÙJf†J(ËÑ¢d/i‘B©´(!QTR‰” •Š,IIi£EIÖT"¼4”’f^Û0¯y?ÿç{ê<Ïy®®û¾¯}=¿Ïçyîk9×Y~gûß*ƒGXdfŠ2DXfº²rCpƪÇJûæ›oÄÆS!ú¨Ü’xîÐÃm@µ}tÿõ¯E¾T–1gÎÌ9-•Ï‚‹ ×XõÁC$¬€yȽ«)Œ8ÿ…þÎ;ï8ÿÀ¤,Ç€!ÂÊQ‘­ âÏqÚ»üòËÅã?.P>þøãS³/êÞ#¤HTÅ|…+67ĸ¯¾úªzd~5 /pûöí©2É’N˜ê Å C7lþüù2ØvË–-Ř1cTóëX‘ÃÑߺu«Ã/L2…ÝÔ…ùÍ~ûÛßJÇ™(LâÑÚïÿ{Á‚S¯^=¯ Y¾]1€2ኢÒãž%" Œ¢ü áï0•1 ¸`iêsˆ°´;k­Ü BT©RE`|C¼N¤.&ªSÎî‘ !œ‘ç0œ0ç¸JUJ}G—ã³Ï>“"¢Jî›ä3Ï<“ª6EUÙ(õÁhSÖÄ‘´ ®+âp67ÀGÕçŸ.N?ýôЇ)¸‚ÃX% ¡pÓM7‰¦M›Šçž{NŠÑFûàRp‘ƒ[î0`ˆ0wøJMêbÖv›7o– >s ìŠBï ã%èDs”å†Uí9묳ÄÒ¥KÃ*"•ùbÙ¬Y3éš"M `­È6`ÀÑ¢E 1nÜ8éVÁÎØÀp¼L8aï½÷ž·sü•!Â2ÚùÅD{챇èСCªƒ£ì&NsQêƒ!æÉF!ŠDAßøcÚ1zá€ÁeE mùGuTI±ªÎK[?ÅY_tAó›ß÷4.;Áa.––äÅ\+`½Ö½{÷´4%Òzr2F¬jÕª‘•Ë—Eßm,Ȉ(ŒýC ."°4† ƒ–±y»víDÿþýe¨¨BKrÞ0`¸aîñfˆ0÷8KŻᄏm=áð 6,ÿW¶HøC ;ì0QŒ“t² æ)„BÄ‘¤ºqˆ¹ÁGC‚è.miݺµèÑ£‡Øwß}m«O;{[Ô”|ˆ÷|Œ 8Ç€!œã*U)9Z«NøÈ1`t¢ò¦jƒj‹õ¢q+nò ³fÍ’âÿ4rÁè·,)æÓž®]»Š«¯¾ZŠÏ¸×ñúÝwßé̵C Aà°‘5KZ‡Í÷”ÌažÐ–ü¬DØ/ùKé§yóæÉ¯|Œ5ŒÒIkŒÍŒ´è¼sÃoúé§ÒmG¤ˆ°°¬(æ+” ƒ‰…d«V­çuÀE!ÂtŒ8¿fßÙÿý¥5¾ó¯òÒaí+F¸¢~ýúe´µÁ4 OÙ8?ú裃ÉÐa.Yô¦7w o¿ývný/ÁÃyrš­‘³Æ c|Ò¦Aƒ‰ /¼°’úâÈï¿ÿ^ÂæÚà†åóí]&v¤d¥)íž{îY^Ý#Ž8B >Ü–õ^žÈ\H6:¸ŠZd”u" ýĺuëæR7 ÃM›6¥Þi-$¢¬ºŸ#FŒ7.'’9ŒN˜÷ž6D˜;ÜN˜;|¥&µb±c6ܳgO3ÒAÏÅ¡Fµ²N„ÑÆsÎ9G,[¶,“9í+3gΔœ–b~û }›¤ç(ægUχµrôèÑR\Œ˜òÇ4œ0ƒï˜cŽ1œ0ø3D˜ d¥)é^{í%}OqÂÃ,Û@i  V½zõÒ N‘eÅ|…*BfÁeÌSÁwÖBÓ¦M“ºwQ‡…Š·ï¼óŽÜôëÔ©uÑ¡•§ˆ°(}èym QX£!¦ˆRÀa‘?æõç—µ Ð×4®/¸à¹¦=öØc•Ò‘VÿŽ{¬ïô{uÍ/ —©Þ¡‹ÆsêÎÂN8Arç¨{š@aYᇉ{C„¹À. ¶X:±acv˜Ÿ[iX”\4ÓSR¼L¯]»V¼þúëbúôé2n D`1Ïýž é£8]S@À²øæÐ [°`Aä±9£ÆíŒ3Ä%—\"7í¨Ë«Ø$ÿñŒF²è½A°œx≙j^ÒuÂ0ü˜={¶ccÇŽº…xÚ:¢‰Xj"Ú¾õÖ[%—îÌ3ÏL|s9äNÜ=ä(Þ]†+ŽIP`9C(›1cÆ«ÿ­Ÿçò5Š™×]wÀ<œ}õÕW¢Q£F‰%4П۶m›¨R¥J.û+ÊF#¾V„XÛ¶m£,:’²àj¢÷Ö¹sçHÊ‹²¤alô'NpÁî¼óNH–b²}ûör e/Ú¼y³t¼dâ†C%{&ê:pÅ Æ@öQ ·½äXÂ:u¼ÆÍƒ!ÀJ¢¬RtÄî¾ûn9G•X‘®)X(”¾F¥FDtgÙ5±¼ÄÔp-0fɼð róA'&kwO7>JBûгåÀqŸELÇñA$Û3tèÐÄÇò<¢Ì}<Å1`ˆ°øÁR®wïÞy<"HÞ0ÀâØ·o_ùñàÁƒIˆÅåLaTWÒUϲü §…ã%K–dª™(S#jmÑ¢E¦Ú¥“4‡­à{àÀRqýúë¯õ¥pö/‡5b^BäÃmMrPuô¥á„(ŽC„ÙàñÔÈ‘#¥ŽÐÙgŸm“ÂüðC‘TåbUOë/ŽY±ðTºmÖ÷Y»›Û¸q£ÔÃ3ëæ’@IDATÏœÊ'ûî»oâD² Ä 7¬réw†Û‰ ”k.˜>4¿ÆMAœ“3ΠÝ:vó,ŽXÝwÞy©²”$`=ºlpÁòqaéXÛ°Çëi2ˆ$Ù_ ØcÀa;ñ¢ú›ßüÆKæi(ßq¹ª€øã䘔>Ï«8R ,­W¯^-ƒþªgIþE½Æ¬Å),†ó¸‰°,}/†w§ïp’c'k}‰!‰?3ö0DØN¼ ãDn :  S×¢Bõ±Ç]c‹”„udÞ‰0, 7n,žyæ™"˜JÆ+¬ÐÖ¬Y#-"“Q£hj7ö÷¿ÿ=š†¦´Ö$âÈpŠ(C„íÄ\Ña`¯½öŠ-(z’”òÁxÞ‰0p€÷ó×^{M*òrŸTxôÑGÅ¥—^*°òͰ>ÆÀû׿þµàÏ€=öØc±çž{Ú¿Œñ)bR#Ž,܆+Œó&d @xÄ¡ÅFòÑG%Ê6ÎZ­Ã‹ ŸG³g϶¾JÌ=5°ôúË_þ’˜:EU‘¸9aQµÓ”,á—êI°­ >7C„íÄ)"!7ÁÃ?,zöì)­º¬Ý‚ÓWÞa=$àK©oß¾eyýõ׋õë×WÊ1 u_¾|y¥çaܸÅyPu€#ȲSNãbêÔ©âÖ[o ª •ò‰ •*‘ô_yå•@Ä*¸éß¿¿ “Dóˆ›øÄOˆvíÚ9Î_t[æ·4C!",ª62™+nà¹çž“ëkšõu¸ï¾û䘓7)þç?Q5—õ–qbãÆ“ócÈ!v¯3ÿÌa;»Ø-'‚ÉÍä…³ÂðáÃå;‚U xE~ä‘GËr̘1•&!ÀÎ>ûl©,ÆgVN¡Œà„Å!†Ã‰›x‘ô1}mùêÉàž#NÁñiºaÄݰaC`ŽTáÐwÜqâè£vÜ`Nÿ|‡¨Sý4D˜¿§¨Úèe½Xµj•˜1c† "M iýOµeúôé‚5!)·Õ‹¥¾üDÕfÆ>Ní V­ZâÀ ,°{ùgF jgsŠpKÔ¨QCÆìºë®»ÊÊöíÛe@Õ?ÿùÏåÏÔÅO?ý$à*ö¬z®~¿ûî;©ó êÒúÞ{ïmÇkNêlgÝWª;+#E€¡ë2~üø]pQ¬.ªþ^~U[½|ëõüƒ]rÉ%Ž?‡£9pà@Q§NÇ߸Ièeì¹É?miqÞÚ£Gqá…zŽÈfË!ˆq‹§w¿€éÿóÏ?/ÇÛ¼0ø!XyÚ¡'ŒvEÑF¯k> 'L˜à ý¥ÖP§k5seytŽ {1 Uû qpêÔ÷n¿‹"=œ°BDë*í]ºtiUI\†¶³K˜,ü¹úõëK®‘ÎñâÔK(œ8*€`"È*£FÊMñGŒ!9,]t‘Øo¿ýÄ¡‡*Å'äÍ=fÇ .TYI"®’ù0qùŽ(V\¯-Zˆ¶mÛîâkG`¼{àÊòÄ óŸþô')¾Ã! "9ðôä“OÊ:¨Ó$i;wî,.¿ür.ù¸/8ʸH¢üQú&#F¨S€›Â"¸waÕ#)ùb°Ñ A_ܰÿþïÿ–_xy衇œ5»CORðv= ÂâTÌBl_l u»V;VWXÈzÉ’%å]tÊ)§ˆÁƒ‹jÕªI)¡Ó^~ùeÉ‘Ã] õà°Î¯Sˆ?NëbM'¬8Òš6o÷†óÑãˆ0 F ;[×;:qÑ«W/9qÊ©‡©ˆ•ŸþY²a ¼uëVé{è²Ë.“ÄÕ·ß~+A6Le/O œx°6!ö"âO X9,žˆˆ{ô˜Yˆ  îš5k&Ûˆ~ͺuëÄc=&O•èîÀmP íÀwU’>@œÄ†âè3ˆç°"Ì­8<¬º$%_8GlJp²¼ã5(^œÐß ä~ùË_ÆJ„yÅ=ù Aƒvù³;ü[CݬÕœo¾ùf1sæLyH†€C$+$€Ãë¤I“äš qÂÁuœ/W$ ¬¯üfŠé„e¡}~Ú`ˆ°ØcôÂÎ…è@ç€ ÍÂB;„™šàp^¦L™" $¸cL¾ë®»N²^•µ2q”}™ppàpuéÒE*ŽÃ5#¤‹ýúõp¥ˆ¿HùLx'åpÚâtÆDWpË-·ˆŽ; ØîÝ»«Çò÷ÙgŸ(#³0ÑÊ„£Gœ?NiŽ^uIC Y§¾£&>E:Õc„0¥Ýp(Ã5VÂÊ?ùrXàpÀÜr Ìú ¿c~ƒÊø(Öç8¸ ¦‹ ¼®Ñÿüç?„˜õÏ:¡N×j$ H)µýðÃRú7 ]b]»v•Úˆ*9”[¤T:§¿^ñã4?éê°ßé’?ùeé[çì€,µÚ¦-^Y¹ˆ Y˜PeƒÇ‹¶.ŠÄ±#yCTéÇ!‡R~Ê×vY誔ùUQœ]À‰BÝqüñÇKNœ“r >ô:€¬Çî¸ã©¼ÌI " ½0à“O>‘§8«~›"âÚ´i#øcÁa³„1çXuŽ¡Óïü¤Ã?ØÕW_í( D¯+V¬Æ^tG…ìLvþnê’”´è†q0€Øçᘃf8`ø¬b™ãxýÎ; ÚsõºFcLag@eíO'k¨Óµšµ“¨JR Ê‚ÐS ïXjû%p½âGÕ'Ì_Ö7p‡^Øá‡fQ©ËÛa>»Œ… %oÄaVqœšhèP)‹C¸K¤U »› ‘% ¡òî¿víZ™“rìš 7 €øºöÚkÅ5×\#Ooè1'§4çª:R>"ñ ÄââÅ‹¥þœ³$'1”d!r&Ó£G–zto¾ùf9œ|ë& Ĩ¯›ï²žn+Ü,¸­ŒM§€uéá†qÀð 숯ï½÷^¯Ydê;Öý@˜©Æ•5ÆÉêtž’Ä;ë‡8´úaÂi^êû´ÿB„!Ž5DXåžü•oó{燕 á…ÈXÐ:@Äp2‡[„hÖ8âÄ:xÚxÑK5j”,-DƒèQÎÝwß-"¸[œªP…hA Bb n%JÙ½{÷– ˧žzª|îô‹•3çô[/éØP±”rºøq:½ñÆ% 4¢ÄƒÜÅõ :‰ø×Â=‹SÀ¼Ÿ9¶hÑ"§Ÿì’Žyöàƒ Œ`ÜpwwÉ(C Â8@Æ^×hÖ\|,Zÿ¬ˆA¬¡ 7pqÑÁUª$XXŸp åY*Ý/ã <ë\3»tÖg^ñcÍ'¬{D’_}õUXÙ§6_C„íì:?Ü8\LœzõêIý!ëh€Á„^bHô§¦M›fMæèžSÄ‹eNQ:F?6 Ào9„½ $ ¢Õ¡C‡J±'Ê£X=R. íˆ&!º@°ÁÕ»òÊ+Õ£ÄþRO%JuSItôà†pvÅ„0ÚSO=µëË"OÐãSJÐE’|Åá±Íš5 ¦ÉÛ ˆ0ˆÓ¸ÀëÍzÆÚeýÓ žT›ü®¡*ÔO‰Ÿ–µ“Ã*®°†,kHIXã9¸;¯øqš¿ßtpýÌI¿å'õûÿ(ë8_«¿›A’T$P/œqrêÆ÷Wg ÅK1§Ü˜BuÁo‹¢b¡«tA—C¾ˆá"±(XÔáP°È|öÙg®­ÑX” Â)Œ00€³åÖjq3zIœaxÑõSVªa”‘¤Uá§øÏõ@„|òÉžŠ‚K…È4,±©OOmJÛG(˜8ª>¾ÆˆáàT!òB2(€1˜@„lG„EÕFT9Ü*«gïNÛnâÔÙ+UO8Œ¨À™Ö¥8n,ŸK•‘Æ÷†¶³×=˜ í†s«'᥆9è´!N*qdéžÁ†0.œœƒÆÈý÷ß/ën‚.'Íùâ„EÕ&œYÛQ•ŸôrÀMÒ=ìI&·aÖÏa;±ËàÓ A˜˜Ö¼qy¡ŸˆÂj ۓº@q¤³ž‡Pų¸r™âì+g©à€¡ûˆE›{ À ‹“ÓBè0Ö ö`ÿŠb=µ/ÝÙSú£0DØN\`I…Ñ`Q$qà Œ­Z‚k ¯ú`*08Ò9vO<ñD+7z^¥rgóÂj+ïb‘Rx*¦˜_êÛ ÞcKè!3_vÅ&8á°É>–d@â„þ— "l'.pâ¹aÃß¡#*Pk®ŠaËJ7ŽS‹åUêݻロh" :Oœa=/Á•A$޲uëÖ™³Fs†Mç© ÂâtÖŠ:E¬Ó*cœ€p”d@"áÖZ9Éí ¢n†Û‰Å_ýêWÒ‘§_eó :%ytÜ­‡}/xaÓ &œ'‰^òâã¬Õ9æA0ä ¬UqÁéüÌ3ÏtW‰¦æ°€rµÕº-JT°f,X° Ê"SQ8‰b=õ‹ \Çqde,"LÃfé8‹ÊbO+:W—}ô‘< Eáüƒ>Îd!²“ F1ß]ï´jÕJàœ±¶WÀ‘+›! 8Ã@Ü"IŒ3࢛¼¢¿À8Q±‰+Þ$ïÊa»ö‰!Â4œpºF±ÑOÌ9-;sYS§N•Ž49U‡ ˆ"½„* »^zþF1_dž³kt Ù!æ8h;V´oßÞµG}/åeå3Aˆ½â}@|Æy ûæµÜ$.À ¸I:qä®=þ.¸k™‰~Ò®];1cÆ h4¤^‚Àeĉf€R~’]S€£hìm$´hÑBÆQõ˜ƒQ'Âòýæ­EÉÿ ÝŸ]ù4mÚTÀáÃUIò{ r Á¸'i8©8øvþ+ móZGC„Y0G¤wââ°Ñø¤± Çç-bHª;vìè3'gŸ÷ÝwRì ‡3é`Ä‘î{%d¼l» gD)k×®o¾ù¦¸úê«Ýšó/!'' ô³‘ÓwcÆŒÄfÌ+pø=z´Ä8I ’4Êù½eˆ° \”_¡¤Kû+®¸"V%Ôò eàg©Ã† “XTÎ0EV­Z5XavGzÇnóæÍÜNŒ/œÎ^ñ`Ýu×¥B|ã¤MQ¦‹ÓBRµ•ƒ‡eôx …“7 Ö AƒÄ…^(TÒÔ~ÿûßÓTåPëjˆ°è…[ƒkÈ!†#VGNÃ.ÿóŸÿ,‰ÚN8Áég¾Ó¥AŒF"Ì{Wà œÑäÉ“e†CÖc=ÖQz“¨2 ….ªœ*š;ËH,z÷î-}FSjü¥lݺUúWlذa*­zá`"¬b"¬»\uïÞ]zYïׯŸ4»`ÇÙƒÕ«WËà×Ë—/Q`Ô" â/é`ˆ0=T¿~}i%ùÆo͈à܈¨/¹ä’¢éÌË€–$5 ú¾I“&¢oß¾u‡¬m¼í¶Û¤Þr½zõRÙ\ˆ°M‹(@,Å|ƒ7$‡z¨À °¾ÿþ{1jÔ(é yÞ1D"ŒÖÐÿèHmÙ²Eö3·rÞ1ì—´¶àËŽ¶ÑƤ»Ü)…8a„¬3°»D8ÃÀA$ 1”€ñÔ=eÊQ£F ÷n”ø þ«û½‚»¡ÄLN~©ß+âN¿V5´{Æ;6p;nŠÝsý™ÊOýêy©tê¿õãxÎæTÌ&GL7¬Î¾øâ qÊ)§ˆÛo¿=Ö00ýë_Eݺue“þ/NäIÇ›úÎQMýúõå|Tßâ ŸbÄ4àIGê­Ùk¯½¤¥à¦M›¤^brD%áˆ#ކÔ_Ö1}MS×j=Uë úÆz¯žók}§ß«kÖQòæO]«JÞ¡¬ÏìT¸-ýFÅîÔ¥OhEÌè“‘÷ê9«wLÆÅ‹Ëp*'tRyÔûò;/ônà`Å:ôöÛoWª ~²™Ã±Í#ÀMå/‹^úÓa^°Ò7LÊ{î¹Gžä8Å!NôUªT‘lp/ßfá›4)å+|N˜Â„ÿ_8ÀpEÐ×L1î¿åáç$NâEˆí‹/¾XFâÀÖoû[é7.|L8+·<ëÖ­Û%1ªgyö6ºhGÏ",!3?Z(³«0a^9aøÃÄçŸ^®äŸ&FRþóŸR”[­ZµHÊ ¢Ä† “;òÀ”ÿŒ3ÎÜà¸Cìתdä# .*V®\).ºè"i-ˆûèRa”€Ø‹9®ñ!«yôˆ ¶£ç –€ÀIéú믯$BäÄé•ã[üc¡ Ÿ7 <<{§¬ tZêÄz.[¶LZébÊG…lÁa nNk~ñ߸jÕ*©h¯·®Q£Fž×M=Ÿ ®ÑKE?U'UÞùË_d0ôRN†Uú,ýB„a¸` Ì+‚AB¼@‰åMë$ÅÂý¯7,zaœ:Ó(‚2œ0¯#½â;朼§#îh×®ÀK¾ñIT#¿WqqÂÐÂàˆX‰S§N-—èí F,ѤÁÿøGžª˜óXp>õÔS [¿ÉÊ=D–ª ë@ôˆ/üÁX^uÂÈ åü<ê gÁ¢—&`1¦¿ xÇîRî¾ûné$Ÿ~<çUäã›…¿„µˆ—u â«ÿþÒõL!Î1Îz£ŽÌQSo a¤@m×*/¼ðBÅ9¸2âÈŠN6+."½bÓ€öÚk¯Ù–ËÆìUI†UÊD1yã„ašŽ².î9ÒXGðŽˆ‚#FHw.8PÖ½!¸£pœ øÇºLQ»¨@Ï×b:D¨4n…v®Zµª4”*d Hz8¶v¾&íòËÂ3#ެèEC„Uà"²+&1ìPÆ/°ý9uzæ à(¦QióýÒ|PF¯8ÿüówɈy„È×/…8(»|dÄÄDQ”P½zuÉÍ$âA!±=êp=“¬ãè©â@Úà„Õ®][bvï³øÌa½jˆ° \DvuÕUWɰÅØú~ôÁhßó‡Ùv^ ®)èCx¡³fÍ’(ˆ« á«P^´hQ¡$æ¹C `µ5'Œªzè‰'žÜN;5c=6–µÑ&#‰À‘-pl9”ÃÍÏ0óÄù+Ö§†+†Þ9Rpj?¢,žY!] ¿DUÏ“HB&­JùôU¡>ï ØcàÕW_•þÀn¼ñÆ’\c>3fÌamìs3O`Îb!±š“ïý¤ùýï/.¿üréŒUwÀËZyÙe—ùÉ:ôoÑýúàƒ –ƒy8yŒÑ<ª6Æ:rGO",†âð„ dH”M9ÅÁžÕ°H~!OÊù¼%HÀq¤û‘þÉ'ŸÈ9¦‡„)”s'®>úh¡$æ¹ ÄeIÕ>üðC©ÀN²n¢ˆð‹»‡$Äq¯QŒ€mÖ¬™ÀÅúoY¸™†¶£— ãh‡F€V,zð”ÖYgIKª–'½°´…*Ò‡GêØ(}­,!™;nŒ0pŽ‰ÈºG¢téùNñ‚î1!YálŽ?^}ôÑ2~ïï~÷»Dw ºt¬÷VWDz¥ÑÓ>.+²aQë&§†‹¹g^~ùe`vú3Ï<#õXhðøíòÄ C)½‘´‚G:ë9îÁƒËͪV­ZÎ>Ú™ }¦öíÛKš!|]¡®<18ŒÃcþ“O>)ð>¯[¿Ö«WO,¨w¤J‰$iÙgž)9apý² †«è]C„Uà"–«¥K—J1 …³׬YSŒ5J´hÑÂw}ЛÀýAÖUrJþ´Ì—bÝ4‚G:ëµÿûßbøðá’sܤIgYRÒ†ø‚ ,°¼1·N0‡NÜ£Õ«WËÀìÖ: KKt ˆ°?þØÚ„J÷¸Ø€c›uÝ0t 'lG×"¬Òˆö†Å É0‰‡<(ç£GqÔQG•TÎŽ¶w—fˆ0g¸"X3º“xÂ÷ˆ²fÏž-þçþÇO6¹ü",JëHï‡~X´mÛÖ—óê$tâHtKqaO=õT©´Žãé¬þæ~üñǬ6ÏU» æ ]Á&~ñÅÅÙgŸl¦–Ü Âþö·¿Yžfë6­®)ô^(d%«§ÉóõôéÓÅ–-[dÜ@¿¢[âªb‰6iÒ¤<£ÔSÛ£æ„ÍŸ?_êÉžtÒIžê›¤°âDŸH)Å€ñãÙ,sÃh#¢mà 3a‹ŠÍ…Pßa‹ý´ÓN µ—9}e ÂÒªHïDÆ¥NÇzú¼]/^¼X¼òÊ+⦛n ŒÛ‰_1"J¬Y³&oèôÕ^6OÄQpÃP£X¸p¡hÕª•¯:'éc¬$¬Ç8¦…à}ýõדTý@ë‚HÒpà è r“ ù(šá¬X¹(çgÙs>–rø›©RÆñK3øåíÅêñ5sæLqË-·ìâÆ¥Øw¥ÞAH\sÍ5bâĉ±(š—ª_’ßG¥œÿôÓO‹úõë‹ýöÛ/ÉèpU7ˆ°Rza*C|I"6Ï*0Ž fˆ°ØÆ7¢H,aÂ~óÍ7™eûb™f.ýotÂìg:1èõë×Oã¶Oåý)ã†8YûxÇNá/q¥¶…$G8ÜÍ›7/\‘¾ÁŸ†N×EpÃÞxã 'ÉS—†qTÌoZêä±ÂF'Ì#âü|F0aØùa*äëõC$™Õ`ÞiwMA?Q¤>Zw\3GF-úöí+ˆ \qÅbÙ²e™×› QpÂà~â¼”²²Œeœ±¢‚àg„ë¢,Bã( x3DX ½DŒ0|ÜDYõñB¨"à ‹j$ESžÅ‡ &ºuë&‡Y*1ì…óÀ„YL¦ò[9w3üE!)ˆºcàþàX¶”r¾ªW–¹aa†fÄ‘j¬Gö …ü(Ãl`E IØú„¬ÁïSšÁpÂ*zÆC† p¨tÇœ)‚¿:«,Rþ™^xá…à3Ï`ŽaaŠ#áüà9ž>É"À s³cD’Eݰ°ÇQZÆŽá„EÜS(#†ä0é9Yf ÒªÈÚF1_ˆo¿ýVÜqÇRèôÓO·¢(ÔûÎ;KïëèO(Ž|<áß0 € Š>q>³ H&ܨ‡`À×(k–¼F¹c„",♵(’æàKQ˜•G‰N·ÓªHáÊ(æ )–€†Ë–Æ+ÔDö{ðÁKßa&Lˆ¬Ì´#,ÿN‹-’bȰ%èÿaì'¸å„QצM›ŠgŸ}6Îj^vØbíÀ+R†† ±vÙnÚ´IlÛ¶M†]±{Ö3Øút+xXu *_L›91GeÜT½íòÉ»8%å#FˆªU«®ËÇNž.¥é,ûfr‚‡RiÂÚbo·zuèÉÍ;×ZõÔÞ3ßÜâ µ-RqC„AN¯ØlpÐ¥U¤^·zú·I¼Æ5ÅŸþô§$VÍuÂÒ¯q]‘ˆ?`NÜ}÷ÝÒa1–qN¬M†wòÉ'‹GyÄúÊÜïÄ@œ0¸¡F4jÔ¨$žñ¤ß¢E i¸“f|‰á´ù®»î’ÎwüqIl‘ÞGŽ)Ü~óÍ7‹1cƈ6mÚÈ2F%cRrU¤ƒ./Þ¼y¿^¨s ìÒ¥‹à› ÿ_~ù¥«¬êÖ­+9hYÑïÅar^×>½ã ¦c#ÄëuëÖÉÉ|À„XJᬱ̒çü,Ä‹Ô{+ ˆ^Ÿ°¯Ùtï½÷^§{÷î‰ ÀT›[·n-Ö®]+ÝŸ¨gæ·apÂÞ|óM#Q])˜2eŠ æ½aÃÁc ‹°VgÇåÈ“O>)³AÜuÿý÷Ëç}Ày!dÀ!=+5"0Äâp¾KÙ½óÎ;¥±§M›VË&3tñ"Ì©› •-œ£sÏ=73Ü0C„íèYC„©òïŠ+BY¬ ,naYÐ? )Nh³y޽÷ÝwŸÜ{öì™8Q,DÆÕW_-}‡•]gVmA‡›qc°„èþµ×^Ï?ÿ¼ þ îAUÐõ£?íÂ!þ„è&OÒ8 ÆMþá¸QÙ1ÇS¨×ϽpÂ(¤~ýúbýúõ®¹h®+Á†ÛdC„E0Ø0½gâ æˆ X8÷Ýw_× ¡qÕ·X¹XEâÄ0+ÂØi_ÐÖ±cÇÊM¼wïÞ‰õU«V-qÔQG™F6ËZRHÊ&yÉGÛ·o—¡|j×®]2- p'r饗 8¨ÄZ¶lY”«TLmaÿý÷//GªcpËðã…ô@‡“N:I¿õuèsëÖ­®ó@ܰaC¨4ígψ#³ÖHÆñªU«‹:‹Wœ½0üƒe‰cLäEIÀltzúôé#E‘q·RewèÐA ,ž%1~©6;yÏ:¤B5º²èlÁq8iÆòƒ>H+¢æ Í;¸fä¯Ã'Ÿ|¢ßúº†øs«¦ <ûì³â[ôàÒ ô7}—w0œ°FÀK/½©‡üBMÊ'"ì¸ãŽ+ÔÌT>/´¤²1*=yòd颅xp’XéµmÛV*s›Í¢¢· ‚G²>b5îî¹ç©»…ug¦Š›Ì¸Bòàˆ¢€Þé‚ dÞsæÌ‘"P¿ùªï±„è~ýë_K/|ª¥Œ8rGï",äQÌ)ý¥$ø³Ê†¾§Ô½÷Þ;äž‹.{µDWbô%=øàƒoè×_½@¤’€8`¼e1lŒ×>’öá‡J‘4Ö‰N+Å©S§ŠjÕªI¸a=zôŸÃ%Zºt©h×®ÓìlÓ!EI]3ôiÇ/½ø%Í Ô.3¼Î}¬Hi·22°mD²`T‘wpÆÿÍ;–|´åÊ•±¹¥°V; ’œN³à%ßÚ7Yæ„¡Ô 1,M˜ê#6bħètî³Ï>êqn1\І(Òm]8_pÃ!à°6?äCÊû5Ź\¼xqù;.ÐCäO]Ë íŸñá7 ·(ë£ÿF›Ï?ÿüÀ8ðèžq„WÌ-@Ä[•Ô3­`tÂŒNX¨c—Sú`øwIÀÆfÄkZ!+¡ŠtüsÌ"Æø'D îäN#F?±ááK ƒ¯œ ½¿Ó~M?¡˜.Ñmòb°ÄZV³fÍJ˜Â+ïý&Öíçž{Nº¥xâ‰'n†œ8)C)¯"Iòǵ¢ŠàtRf’Ò@ˆšùdˆ°PÇ$Ã(Ok¡ä"ó4‹$Y ÷CÍ,–BYׇzHÆ,½á†Rß>Bé #6þü,u“§¶ ’ ‚ÃbQ¯N§Š»øŽ]Ñc$˜üÓO?--eYσ”óçÍKžˆIáâ®#­`ˆ0C„…:vaµ8If" DõêÕS¿¡[Çœ°,-FœÌáš1^Pz4V¼E}kˆ0·N6£®gØåÁi ‚#N¤.XØíSù#~œ5k–t/4sæL¤‹ ÊØsÏ=¥¥°*ÏË/Ü0ŒÒ>N˜!ÂB»èLÀ Ãô:If"ŒPE8PÌdƒƒ€®Jøi°‚t:žàØàøs„ ™"š¶_¥ Bɘ'Pº_"ì³Ï>ƒ ’ÎUUýì~Q‚Ç­EÐq íÊrú 0tÏüú±zÞ{ï=?ÙÄò­Gî@»±Ž iø±À`>íW7!è꥙Ë¢>˜êß,è„á]žØzˆV¯»îºÌq,髳Ê¿áì¥Ý=€w^~ƒà„¡T®î,ÕK]ˆ9úÖ[oÉž'°7ŽApðŠ•ãæ{ƒ_"ŒòÒÊ cÍËÒÔMßëi ¦c#ÀëW_}Uê˜e Y¡ƒÁB„/@*ä0tÁØÜ ÷‘5È‚b>Î;ñßÄÆÂÆ˜57}ÌŸpîܹ¹K ókÕ†B~:ut´zºf]ÀhB·˜f>9Qx'Ý–-[lË…8p’‡íÇ"Ž ‚;õÔSA\À¤ Œ8rGo",„Q‹²å§Ÿ~šX¯î¸ª ,Gš Ë\0ú!Íœ0ˆz|*!®ëÔ©SªÛâdNÐN:ãû,¯'y¸~D{ÌçbᄜôCãÆÅÇ,¹®ˆÀ|Ž¡„¿BúRxا|Ò`èóÊ+¯”‰A Jï蟙ãŲ¨ a†AaxÎ9眂m £îAäI½Ó¼îò0DXP˜ÔòÁZ…À°NÃphŸFrÉCè4AVýƒÑläi]ŒØDF-­´à¥µnçÖ’pýpaG€óê+ 9ˆQð .”îOÐÑCü0é!š8¾_¿~»Ê„7nœ$¼Hwíµ×ŠÛn»MVå…^Ó¦M“a…,õ½Äy,Õ¶ tÂT8©]³f4†QÏ’þ‹.[^1zß"LÇF@×øƒEœTH›^¢X¿'ç¤öGZ¢¯¿þZ*EÃYmß¾}RÑZ½:vì( >ÿüóÐÊHjƻᄏg"líÚµÒÑhÐmCÕ]½C=Ta(ãÃ)³ŠN™oS¦LŒaˆ5ELOš4I4oÞ\ZBâ§Aƒ27ý4øå&êõ¡?0³:§ÕÓ$íš~@9?ï`0ð (+Š“¦¨PÓÒF„áOî‹VV!m$Æ9\ÕÍåp¶ÙªU+)–L«ÃL¯ý懀ÀÊY×áòZëwˆÅ“UªT—]vYAÿY8F”üÌ3ÏHQ$ºi8=àŒÍ›7OJ2fð·×+×ÏZGýI Æ,AAÆ eÈ&+ÑTþAç“ÖÃgÐx0DXÀE·€IäMõàƒ–J§I²*Ö a-ÚÅÊŒò‹Q’Ç‹ˆ²Ùì.½ôRA »<ŽFá£Î8@à ±%¢IÜŽ{7¬5!ਣúñ4à¾%H" £%¸Ò´= `8a;zÉaÖ¤ZEêÍdÇeEM",«¢HðŸ¦áûï¿/î¾ûnþW’EîQŽkbc.Y²$5ó)Üà¦Â whÆ Rl=ö¢•òÀØH¹‚؃(¬ó Ý©–-[ʃ("L8HÊiè¹çž+E“Ô 8ãü«¯¾’÷AþÃʫ⠶¤Å}е_‚ÄCšò2DX€½+›uØa‡˜k8Y!’ܸqc8™˜+–¦èvpÂË2¤†[ûï¿_r l`êݶm[¦)/bI¯DNE«U«ÊÐéÒ¥‹@±‹G,ñpÏ:סC‡JåA¨ÀÉ;æ˜cD½zõd\S”ñyFÀîúõëK1$ö½÷ÞJ¨´0ˆ08ŒvøaK:°W0!vKzG¥©~XE&ÍC~!üAÔ ´štP^òÓ@¤xÅ¥:…{ý>ŠïV¬X!ãçáu< ‡Œ(p¢—Á¼' ÏSO=%õÄôwY¼†óâ¢ß\JV¯^]žÁµ!òàb¡÷…Îã9Ä!f$Œ–tÀH7ÂE­/|ƒSW\]àw ÷¸’(3 zˆL ’cÌaÆEE s QdZˆ°´¸© ^d¸.jt@”¾–fÏž-ú÷ïo°"8…k‚N(zIY/œ0ôŸP8úè£CC›:œ6EÜÀm²óÊÏ|ƒHÁ˜ÝÜC¿ ¥ü°°ÐP–1zŠŒA,?“ ŒC„",°1Š &t­Òp3Dœdñ ìj8aˆ² ´Ón#ˆ»ÍÔë±Ç¢ÇÒw•]>~ÃЕÃò΋¾T¢g©k[Å|8ï¬Y¶r¶ ©ämë/ø…C4›d íYެá÷F'Ì)¦J¤K“(’¦pR<ðÀíãˆEË3tn² ;IN©è¡7,ë}þá¬ð‡³Ï,ƒq$¢È$»î‰£¿Âšûˆ$Q!ðªøaÑ/ø+uÀ/¾(Ãa†æw•D,´ò #¸Hº¿°,{É·vo’8aøE"¬ „zß¾}%‡×Z_s_øƒàÀ /«àE‰ óaÀ믿ŠÛ‹0êªò„–8ŽÐZHp¢›aNجNX£ Qäo~ó›Ô—F$™d7Ä—ƒ«uH’8Sü;î¸Cr,çbNªîGâ Î; ¼¯ûí·î3HÁ^ˆ0ÖIâ:†pU ÜF1ß) bÅ›~€AN˜ó‹PFÊ ­Ûö@„þù¡ê€"lG¯"Ìíè´I Ëœ´ž¥a£FÍš5‹´y,„Ê:)Ò‚c(,,‘„Û¦à„uРA¢I“&¡8§t[Ÿ4§Gùœø’“'ONs3 ÖÝ­NئM›±Ñ› °ˆ„`€àEÅ+HÆðÈ‘#¥¡ÔÍ7ß,†.Z·n]^4iàQ/€{ +9äiY‰g¾ÁÊ+Pv6¢D¿pe“a·?‰m¶«“!Âì°âò¦éø¤I8õ†£Tt ¢VDaž£lO©²ÂK”*W½_·ntŠO%ˆþ1 6rts²øÔrã¢Ïô¸»=ûì³Ò’qË–-’ØS:JÀÙeÇ[¦€ƒiÔB OúøÂCëH«1õmP¿pÝ føaIUÐ÷X¯æ æs°¸0‘”6`!åtÊâS ˜ÈÝ»w/–$ðwˆ"³ì%_G˜ÚôgQ^/[¶LLœ8QôîÝ;î@¢Â-DºÓ§O[·nªØHÊq;’u2,Qd¡Žç«xÅ/X²bHÑ­[7éÎâ …ôåË—Kcžõón?kp˜pÚi§I.œ^' Bã>|&'†óÙ iå‚©f'U/,/ú`ªâRÌŸ5k–´~ÂEÔ›¤j{–9œÁÃhÜÄvxF¬èÆòKç¨ÇW±C„–8_ôM¯^½Êwc\Aß¹Ñ'Sù9ýÅ& ñ¬^>Ä2q29h% èâgæ æs¤sªæM®>ÿüóÏåäÌ‹_*6€¨‰0À±cÇÊS2˜CKWfÄÀ9çœ#ˆ•ˆÈ,+ÀæîTtt¯¢&Ât\3¿I*@ÿQâ”M™2¥Î,j §û!C†È±{ÓM7E²¸éÿ,¦E,¶xñâT„ s‚ˆJ§:aÖæ@¦è Ž ›z!'¹è£±®à&ƒÈè8ˆãg·Xß!–tëi>Žú–*S…Ò•Ý }&G‰rY/(«T;· p#Q¶?ùä“eZÒéÖ¸qãdt, {„1z’aDÄ,—tĈ¡7ŒC@’¢Ùa&€·¯1 F€Ø4Ãoû[Iüãÿ(è`¶üE,Ꟗ9üãÿEq‰(#*NÎCÙXÚ·oŸJkÞDt–J@ø®]»V†‚ ÛòÎG5ŠR9"5Œ{Š„ØDÆQo½õ–Œ—H¼G+Á a…ª\9Ä`XD*€(#öï‡~(­(Yt"M¥ ò·*®aœr½Ô¡V­ZâÑG•–ŸI‘Ü"lGO0/#ºì|È Öaò¦Iê:q¶‡€ÝÔ'oºa/øóçÏS§N}úô1XŒ¼mÛ¶™ñ¦VHü§£NXT?¾¿Š±+ ­-p£á„¡Ðö|¤ŽXÌ*}4,h1 hܰ¥K—:*=¾gžyFmŽ>ðˆ2Ð-Ì;"Ì〠Æé"ŠÉ걊Ž?cä´š@o#O¢Hp¦b>ʸ?ü°@çü#Ž8" ÝœÛ:@(oúItà¦c'¬Ô7QpÂJÕ!‰ï9È+"¬M›6¡‡½«W¯žÀ±¸ŽÞö1¦À[@=Œ8Òè„y[ŠóœA‚>„ó„0 €>XBé¸KÉ"‡§pÄáFÙ@ü`ckÔ¨‘xðÁ㯌8QÎgìÁaRb7Å…úéÊ•+ËuÀôë0 …‹Ò*1-\ÚW ÐùC‘¿Æ—Jîé=\Tà 3D˜§Áƒâ'§»b~hx]¿~}fD¼ú˜)u æ×O›Ë˜1c¤ M² H>ð[UµjUé¶"ùµ­\C'œ0âÒFW—5[Mš4‘ñp!Àð½¡ÈÓCÑîù&`­=äCâ(Zœ~úéÒq­?µ(+'̈# æz̽ÿþûÒûpá&\WÎÇpÂâtSÁI•EIyöÑ”Ô}ê—¶mÛ6Ÿ!6Å[n¹%r=“Ô!ú(qhÅmî2âÖ ð„ß´¸@­yÊéo\õHB¹Fé²зI»—|»&Ç-ŽÌ[¨"kxUÌçP€~ýúõEÇŽ3£§hÅO–ïq[qíµ×ʰ9_ýujšZŠ— _Šx`dmÒ­ q‡±—zn—6ègaqº‹A$gPo : ùk ×IÏÏa.{×YTçT†u¢•eï=ž“ç-T‘Ž(N…^ˆ0üø OÔ­[7éˆQÏÓ\§ X(7mÚTö§â$½¥ü„¡|NDŽ(¡ÐþøãÐâh-<¢—q¸©@‡Ë¼Å‹tÛ¥˜ÞOš4ItïÞÝ`n‘—²ôDâ¨S§Ž˜0aB¢kŽ8 §¨…"LÅF,”&êçx¨“{Œ1bÐcŽ9&ê¦Û–‡Aœ×¨Á¸§¨À¸!Â*pQô ¶-ÊŒYv.G¸ ¬vð¨ÀšÇ¢ @"]•BÀ‰ñž{î‘ ´øÿ§”ìcG¢pq/^œØÆÂ¥+æ¢KÏ8•Ï“ˆ8áÑ}-6磬7¢YˆiÂQã&É\Þ(qaˆ0‡ØF™un &Ü1@ˆ X”²¬gW a…ó1’@ï‹Ø{7ß|³ñÿU ™zÏ&ÐÏ?ÿ<‘-c½ÀÚP·8Ô+ ulD½ü$^'ÑÏ™gž¹» 8¨F'lÇ5D˜Ã™ÊäÉš—|»¦cEôÙgŸÙ½ å.?²Ý ‚ `/¿ü²6l˜€#rùå—ûö¨ï¥næ›x1€(Ç££GNlX£B"I¸é¸aØgŸ}âE¢ƒÒo½õV©jâ ©ï$IÔ%¼œ°o¾ùÆwûœff8a;°eˆ0£ÿYœö²èšÂÚ|ˆ°¨ ãȽ‘¤èGXqÕ½n‰Òð´iÓ1 ñ~â¬übÝ0\L:5‘H r"s+ J… ¦mkš¤ÜOŸ>]Ë1l@§u–8 ì¢\ååhíÚµ¥‚¾«}$fÌd-êŒWt"Ìæ™å%°4DXT¾ÂÀëqÇ—Š…ÚÁ0ñ”ŽÚ¨ H±à‚8Eÿ+ª˜{ž*n>Š ¥Æ±èÊ•+#+ÓiApÂì,$!‚tÔ çD¾í´~¤³ÆHܾ}»íç´‰uYpåPL_–y[ ^ýõĪêÕ«'–/_^¬ú¾3œ° t"¬¯òD„¡¨k>"Þ‚kç ˆ°Õ«WKÂë/ù‹4‘7mKa-?ï ¿CT„'žx¢(‘F)â„ù%ÂF% @Û´i#¢ˆAIPn€X›è¯ê„¢ûñãÇË÷è9!f$F"GçœsŽxî¹ç¤R¼ÐQ%ø7\/86w矾œ§«V­O=õ”˜2eŠDåÐ'W]u•äbÛáˆg¬u¬­ôcRx’Q¹«0âÈŠQ`ˆ° \Ø^±A¢\š'+Ÿ(ôÂ>úè#)®È^­ ë±;ï¼Sžæ9]ÇÐ×Z7sŸ< 2BD G,)aa'Ž„ÈÙk¯½|WNÆ „Uƒ0X;œÀW\!Ž?þxw¿zõê26'‡>ÖstíÐÑR€ñ Ä–È}úô‘œ6¬RçÍ›'‰=¸Bøí»ï¾â’K.‘:›êÛ‹/¾XÖ­˜O4BŒÑI†ºuëJ‚Õ®?ƒ®7F†¶«†+1º8åEL¡" ½°<ìÏkÖ¬ â 68  Ja cÇŽÒg¢­$@!NzXAaøT€¸ b ‡§v`}®û(ã[=6-*ŠkF^ Ôz¸’C8Ü0ˆ6Bþ ‚•'ß”²îÆ'ë^†*+I¿ôe5ܾ°œ1>®gù"¬–a#çEo@3˜@IDAT©P¶›Š$úËQíóÇŒ3dìº^½zI]}A³l“wú1€ub5ÄaXmÇ lÜvœ8aA8`.47ÔsBä¨tµÀ‹JãGz0o&kxˆ@tÛpÖZ „ùÁ²SXºt© Ë–ÎO úxËßm·ÝäŸSf9!Šô.ú:D¼W'£"I3õ*lq$§äÍ›7çÎû;'kÄŽ,øür2×7L "Ó˜Ð0€ùE]$ÆŒ#ã †VƒŒ!,ìtÂ7…Éé`¡-:^ú]:!å ê•’“â ÈqãÆ‰3Î8Cº’@OŠg¸±`®QñãÌ™3+}_è†CQÒs®1РAƒŽ8¡'ŒƒV˜úžQ K—.RçëÑG~ŒZðUHH0Ö¥·ÞzK:ȯè“;VÎYe9IÊvˆñ áœÀ²n_X6V½ÃÊw·°2ÎB¾°žq”˜G@IœS_ )&ßY¥Æ ÖS=ö˜´Žºá†䢮ÞñËIÙa:F̵S  FX+|\(Ä…8aˆ(ýŠ#{÷î½K“ð?¦Ÿz¤AbaµÄ´úTS3õíĉÕ¥øðÃåõðáÃeÈ6Ü5ès«Ô¦M›Je}ôÌt ÇR±=áÐáf#M€ûŽ~ýú‰V­ZI·A×=(}Á ëW~†Vóy&Âð­K ¬–²XW±IÂÞǼžSµè ¾Ý{óÌ`ÀÄÞC? oúqé‡ò˜…¯;‰VÌWNžAP³›¼«U«V%¬Tžo¾ù¦äx§M8ð–ñD˜_½îÓôÞaz qú`°¨óa)çƒSNL½³ Ë–-C‡Íš5;w–áJìÚ‹ž‰Ý¢o—Ö<3°b€yŠŽ"3]IÝš.¬{Ä‘lª:@€A æy\ÓøCw/€Óè°<èe´‘F¼ÚÕÙavX){Y~^#½‡E„eÝ5\/.cì´ÓN+0Âv<6ŠùEÑc^:ÀÊãXñs4j@ùEkpÉq–gxþùç¥>qÚ¸`ªÏàúmÚ´©RTõÎï¯!Â*cÐa•ñQ~GXŒ¼êƒœbQ$@„Õ¬Y3È,“º%ÝF<2pà@©8˜Ê™ŠdxlÇàåÕW_´¸Ì€ëƒî£ˆ²<ap ‘„NUZl膅áAÅü0tS‹ë´V<ìzC„åÍ?˜ŽSD Xôé/ 1Êþèd P®Çdð%xéÆÃ·SËO#ŽÌÒHˆ¯-ÊZ+AÜ¿D pÃt‘$œ°0ÝSDÙ6/e¡Œœƒlš‘$V’Asë!ÂŒNXÅÈ0œ° \TºÚ°aƒÀJ&Ï€"9DSP ?4N ” Ê 3¢o¿ývéYå{·A/pa¶Õäl `LÓ²eKé?Ìê=>Ìš[E’ø Ë›[…_œºâââ‚ .PRû‹(Júï¾ûn m€`'t”0D˜ÍH@ŽÕOžOs NX’Yó’O<80;b*ïõt—gf›égùÀÜ OXLFŒ{¸Ü ~úé§H,#UyIù…8aÂÌ;+âXÆë\°}ûvÏkeõHJ^†³é Äæ Z‚VÎ_·n €nÚ å{”oÑóã$\ÂÀÁ@Phß¾½<<½yªVôG GšGƒ&ü²¾•Š%©ð”†_ôÂÐ5´‹Šà¥þ蒗׫—2“þ!ÂlzQdÖô–lšYòâ/¿ü2Ð( ҧOÉʇ”]AbìàƒöUúdü0 ˆ{ôè!c”©NP¨~Ìk+†Â~ž.?~%g Ð5„¨|å•WiãÄ(åWF¥!Â*ãCÞNؤ »…r)NGý\°4{ÉÇ+÷Oz¾p²B„q€„‹Ø¿ɽQ8[´h‘ä õìÙ3U‡KUÿR¿¬ÙX}·mÛVLžèò0æ‚å'LmÈ„0ÊžÐÅ0 +Ón¸A@œ`)ˆŠBß¾}¥ˆ-H\&%/\ŒÀÑ,vwB„¡‚R,rÜÙ´9ª¯ ¦a’Ó§8tžò ,žø¾*äzñ†›pNˆwWÀrN2sÂ먣Ž (ºpÙŽ 7Ä ëfòÊÎ?ÿ|É•˜>}zà cŽ+7¸\Ɇޒ‹ÚÕW_-KÄ ‡1«ñ„ÁA1©‡" †º`v€ª¼y·–4D˜6:ðeuÄGhOòyyòÉ' dùvÀÂsÐAÙ½²}; ­¤Æ8^3gŽ<é²Q¡ë%qd”ØÎwYÔ`åÌ_€È«rNXšô?íð€Õãˆ#vá¡”g?¾ý°®U>ípV ˆ" é!ràÍš_5;<•zínSª61¿Ï»>˜Ž~ÂðØMd÷ÅØËz\¯Y³&±ú`o¼ñ†\d * TôÔgmWP÷,d† ›&ŸRÀ’­k×®âá‡–Ž˜K¥wú" q>€X2ꃌÓz:M7cÆ ©,n—îX·nÝ*-·K—…gX×¶k×Ζ›¦DÐÅÚŠ×}+À)%ï¤KH¬õãÞaV1»Í³>˜† é'íÊ+¯Ü%ü,d§œ0µnÞ¼Ù–˜ÓËŠúšz¡¤ŒÏ³^½z‰K/½4¶“»GFÝû¦< à@àÈ ¸ ‘’.ŽL3' €ãÇpÉíâãt¢ ”nW—(žÝtÓMƒ-kŸ:GR?$!ûí·_¥ª²Ï^~ù啞åõÆaZÏC„á~ÁÀ à®×: Žt’³côǬ“WÏ/êë·ÞzKr¿8áz" âgà ‹z˜òðk… ± €M6+œ°‰'JkÀbxøzá…¤çbé²ðŽõÑ,âIœrÂgº…9ûß<ë^ëx4DØNlp"D1Ÿpv`Ñ#Aú)Æ Ñ–}0¸_X†!f ®Þe—]–åa2C„™3áHw ~M’‚$¼Tœü¢’‚áB!×^{í%¦7ß|³t]áT*à¤ì$§áÐ:fÌQ½zõòj:Ñ #1û‡Np¡ †ë ;0`ˆ°#d,͆Xyj4jÔHúËRO=öXuYô— ŠkâE2ƒE“…Ý/Ì¢“fÌ%©7òS¼Úãçjîܹ%9?¥°‡\aè ¥UÌ~ï½÷Êð:Öözè¡¢Aƒò ÷üóÏËõÄNgÖú]–îáh >¼<¤HÜX8ÚµkËdè bü”âÕ n ¶Kø‚1ñ"w2L,d0U†-íÔGñÅ8ëlè]s÷ œÍûï¿_Ìž=[\ýõR&iáTج î80¹ÆO£¥;\-ü…ýòQÖ‘ö)’ÿ‹QDŒ ð•Å¡³{÷îâÉ'Ÿ”®) à†åêÕ«'0Ú‚è†ãÏ  œcVtÁÚ·oïä“ܤ1a‹vv5ú`†³÷è…²6½ÓLÜZW®\)NN¯˜å'U<’VŽýH1OÓˆô6™'(êãÿÊË\á°¥qi;XÀ½»ë®»dhÖ8ˆĵ 64|–AÁÖ† ÄÌ™3YGò9ÒÄ’Ä/5ûle„"l'>ÐÀ?V˜À©ç¥pÝX°à§’ç,Zú†¬®õçp¥ÔÉCNõ{ýšwúwÜÖ4¥îÑ#lÞ¢ aQ Þÿ}9Ù ÜJåm}OÞÖ:ëiôkÒê÷|·nÝ:dáèv`I*=i?ûì3¹@àl‘‹/Ï£½nQ–kÊJ&ð³Å:Šz\£*q¤Ö~õq¬Ö}Þè×*­j±þŽgÜ£XÃbô8U9*½õ{ë=é~øáyPc-]¼x±Œ;¨¾·ûµæaW'Õ.¾·¦×ï ]ëßÙ¥¡Lÿ_èÆa°@¤ŒÓO?]:nN»#QÆû }‚ï3ÖCÚ¬ÆøU8P×ü*\©_+‰ÀðÒK/Iî ãTO'jù‘ËþÁK,ÊBãKÏG]«_5>¬õÕÛ‚_28nÌtÏÒé?Êà+† ÏY|çÜyçÒ»{ÐíáÔðâ‹/JŸYX_BШ ·ÊS $ÕêW <ê¤#×úsë}±w¤J¥±¾ßñ•·ÿÖ¼JÝ—ª_±ïÁž­Á1¢GµˆóP8T÷_|ñEy_ ”Ë}Íš5Eýúõ‹^eÆÿ±€=øàƒÒRÓc©û 1OÒÄÂN‘æzGHœ+V0Œß*e®$}Q&ŠÍŒY5ní6LÚ Æ·õÚ:gôt¤Õß[ßYßÛÝóL=?ý¹~mMc-×z_,½þ®Ðwús•žgD:m„`ÂH‹Ã™ŠöAÆã6 ¡…,c Ap¡Ox®‡§Í jß¡]\+¼Xyo÷Œç€ÊoÇ]ñÿviíò¶>S÷|¨º«ü¸WÄk9û\Mk,;‹Å°,^ãâoý®g†V†_(t !Œ‚Dœp‚🃟•Ž;^Fõ5y É¡\µj•˜2eŠ §?%¸•a ‡|cà½÷Þ“¢sNðM›6•ú‹iÙð³ÜsÌM¸þðÆx#%Öqˆ$õ%ÔÒsÏ='uÙ „¨9©õ ‡T˜[ ,¢ÓfÍšI±»"âÂ.ßiþ†V†)(æiÓ¦‰:Å[Ñttþ¬Y³$»SÜ3Ï<³hzó2™X¶l™xôÑGÅgœ!ƒÌ†±˜Á ›0a‚¸ãŽ;’‰„jå÷äB•g$' ñã qÊÊ't’ãz˜„Ñb`Ë–-²¯˜¯;w–bµhkP¼´¯¾úJ<ðÀRü†Çb1‹ç”Í·p6§N*ÅûôŸî2Ão‹ý®g¿(#<ú©D!*~òŒú[¨åþóŸB™Ñú)Vö=÷Ü#9kèW8uéà§Lóm8€…½|ùr©SBiÐ,môpp {V™þZ^€%a´Qà/¨õŽ~:t¨Ü,ñHn”•£è=ïe [„…Òüeaˆ~SŒU`¹Ù¡C‡ÜĶëtû°ì°F ((Ÿ ~׳dòUí°â3äæN­þŠU ‘#b…o¼QêKoÞ%èˆÐ—L4t•ŽY5O{<ȶ™¼vÅÀ7ß|#­ÄêÖ­+®ºêªD8 Þµ–æ‰ Äð5ˆš àqzkÍ›7—þÞ0(0Pà—KHÐK"¬¬ ÂÜ¥¶ë88iC† ‘§‘þýûÛ%1ÏRŒ<ì£_Ñ©S'É5 ª)èq",(l&?”¿>Ü}÷Ý&v^ò»Ë¶†pÀúôé#¹×óŽ à€!uA ? N±ãƒÛr±šdæãC„•õÀ—_~é›eM§Â6M  K€•§à À(æ…Éäçƒñ¢¬‹/¾X4nÜ8ù65,ˆjÕª‰õë×˵àÓO?-˜.¬è¨ãrÀ€ÒCXåd5_1ˆWp.ã„Üal‚t‚N)pÂJj ÛÀ• ã…>iÕ ¢ýyʯëè,½N_² c”® ̰fP&F_ø54à ø:‡à2ÎÃpî‰0¬JP¶DçÇ àtõÙgŸ×]w+yA`ʾAtH_Ó纇p¯Íˆsò{­³ùÎ=Ð?Á0ÙÁ>QS˜3gNd"v%†ÆêÞ?ÊÁ!¸§qAî‰0¸Êaª—N`òau”¥…—:˜o¢Å}3× ^£mÿÅQ!^à”c´c [hݺµtÆ?Ȱã/ü€áÒÄ@0—àÜÆ¹'Âà„|Ö ¦¹²CzÁ^º¿¹ä’Kdß3üœ0C„ùÁ`ò¿%Lz§Æz-ù}奆ÄÍÄÅ ~ÃBVÊã ì:¦-p GÜÆ†+#¼:n#Ž" a _ Ïé{Æ€0âH?ØKÇ·„,CÌÛéè//µ¤ ö|†P ¶`1@$C„‹SǹùᄽûývÜ“0r ð1àÌæìƒÉþž1b¼á'»üÖâ|âQ?,ÀÁ/"ϪU«†UDnó§àG ¹ç„mÛ¶Mì·ß~žðþÁˆêÕ«{úÖ|”~ Ð÷Œ¿`ˆ0¿Lî÷„9â/)ÞÕ“‹©ô׌è(Äš 6lØ`"°„…ܲ|YÏÃì¿BUÏ='Ì‹8ª%[N?ò‰ú~=öðuz [|‘ÏžIN«¿øâ é–"9525 øž¢¿Ã‚M›6™±rËò­R¥Š Ob¶YçšÃ‚?\T¸ü‚OÌ@¾1F f¯fü„yÅ^ò¿ÃpÃÔ’ßOAÔµ L ;3–‚è¥Ây0OÙ×£†\a^¹`tÒÿþïÿFÝW¦¼bQ¢G†–ÀN °Jf™ Ïj·Ývóu +Õ<Ös`+…%ïïñ‹_„JDªY®‰0?ú`l¾¿üå/ áÕ<Ï pòëwa4:aÙ,ô-›³ìc€uÀïZP K üô]s5׫ƒN 7\ŒG}Tzå'´ØËƒ–!“ºwï®»ú%nÙ¨Q£d@Y«ò/èðc6hР‚y._¾\¼÷Þ{âÚk¯-˜ÆÉ ”FÇŽ[ž”ÁŒ¢#¾‘;ì°òçÅ.ôº,^¼X|üñÇ2`v±o¬ï¼~gÍÇÍýÿýßÿ¹I^)-cÈJ„”Ö8qHÍ¢[ ]™¿Á§Á½í•ž={ }žØ¥‹ûYž×‚°qïfÏQuÁ:—‰mÚ´µk×VCÿeoƒÑaÂ=áà–÷Æ ¿úÕ¯¬I*Ý;YÓÙËo½õVqÿý÷û"¤¼à·Re=Ü䚆r½WËHëÆY ÷ , &`M›6O?ý´¸è¢‹Ôc׿8š{ì±ÇÄã?¾Ë·_7nÜå¹þ`Íš5â™gžÑyºÆ4û¾ûî“„)í{衇ñ¹ €^œ[²˜»ý»W_}5ôØjŒ·cAo“ݤÇg A Îk _`3amß¾]|ÿý÷•þ”¾Š>O’‚?þñåÎJóºØÍå$ôãiôèÑâÞ{ï´:S¦L‘L»qŒîÜêÕ«…“¬¾¦jÀ7ß|#|ðAñïÿ»P’’Ïý¬ã%3/’ ל°¯¿þÚ³ça×I§°­[·ÊSíAT©‹ ?ÿü³#'°ˆÃà®=õÔS¢oß¾åùÀ!{ýõ×ÅwÞYþŒÉgÅoè”bõ:t¨´T…ÞtÓMòÔC}ð,­ X¤áÔÆŸ¾ûî;‰5a ¤÷Þ{ïr1€þú8ô±J•Mžûì³õ3Û{&½“…ÄöãU[T8ˆwÝu—ŒQÉiÑ@z1Àáe|°qêó¥(GÄÁ³ÖæÃî»ï._›Ö9eÍ9Ⱥ£s0 ­º‘y[ è¯{‚Çv÷^öwö†>}úHI}ggP¦Œ‹ô½Ø¸ºÑk)ã˺^ÙÕU=coêÑ£‡º­ôkç•õ—.úú«¯é*öNæ‡]ÌgÆ:DY¡¹ ò°þ±–[ótrŸkN‹–›…NG(Ñ‹ü_`,ZxÒÖ 0N«V­äÀÇù_£FƒM Ê… –Wá…^ƒ ŠHðœ*ß)€Ã†x’¥L&brOy§Ÿ~º&Ož,™ìG¬©ÏþóŸE¯^½dÒE‹IÿdÕªU“1’¯¿þzùüÉ'Ÿ”÷ºñIçÎÅå—_®Š(øK@{ÖmˆBÆ)iD‰¸‹bì±G±^jMçzéÒ¥¢V­ZÎ+ëºõ Ó½“}˜ÎìNÜÆ¡þ‘k"Ì ÇÃÚ‘,NnO¸Lˆ ìwÜqÇ.þÉô›7oï¿ÿ¾$’ ˜ÐèAP̘1£¼œn[1ñÜÎá™Òò-wüøñâð×ޜw°`ÛépÐ'mät«âBõSeÚýyä‘R'L95uš'uðp²AœË"QÊå„QÆ$C¿Ý@}ÇfòüóÏËÉM>LòbeÓöÙ³gËS¢Ý Mfnó1àvèÙ(Üêϸf!¢-ê„j}oîÓ/ë-ƒèaãÔÿþú׿îÒh7ß|³Ü\ÙÐøŽ°6Eó—ÉúõëÅ< çÉÛo¿->-ãL3§ØøÐÛáÛfÍšÉC÷ëÖ­“j&Lù09ØwÞy2-å 2Dšô¯]»Vn|ÌŸöíÛËôvÿò°šÏvøpûÌ ' ‹C:ÄÖ…^(ÐMV@]“&M’ê,`Ü#¶DGX­©ýúõ·ß~»`ï ¯Ñ/ƒ`g,°¶*¢_‘–-[ª"ä¬a®Ùwi ̬㬻ˆ²Ñcþè£Äœ9säkµ¦ssã7ÊñN]ô@0¢G©‚gƯž‡z_ì|°D ¹&¢æ„Á½aÃm⪇H`³å ¡ÀIbˆ4Pþ VX²,r tþÐãÒÅuL4E„}öÙgr€¶k×NŽ'ˆ[€Å˜ À@u¥êW,/N-è‰ùɃÓí˜jР$$»té"Å+p Ky:vR6§0¸ pNÁ/'ŒÓ—E‹fݺuå‚×Ô@:1@ÿ2Fܺœp ô?%+@Xq©S§ŽÔÃd.À Óõ0Ù@á °i]»v•k F3ˆs˜;Ï>û¬\›XØŒ8À•‡“¢€ÃÞW\!ÛÃÜJÍ;õ­úÍúZà–S¥ðâä×íXb Tœ½ààʽ’l¨2!d7J Eÿ²²W oŒ”‡þfmbÀÁâ oÆÌèsÁTÐÿôƒ¾JÇ/[òÄxàÔSO•eè﹆S5mÚ4I žp r…s«æœ08yäC¹N¼Ãì¿BõÈ­N²r®^!zÎ`c€º ¸3 BI§NÊ 'N¦äÇà×mï99¨ QÆ{6nQZˆ˜$œ ˆ Ï‚p"@É›“4úFÔÝI”F¥ê§ÒÙýR'(?yèb[Ú^¥ÌRL/ôc©Œ“²Á—Ž{»¶XŸÑgnÇžõ.ôý¸qãäʘ€õo }ð²NÐJÄãNT%>ùäÉ=PÜ…! ~ÿûßËK5_Ž9æõJ®ŒAòÈc]ÒA?p8TñÆ\Ñ×õ®ØoÖ×ú;,p;–yä¹Ös˜ÔZQuà 7”WÓÚçÇ|ù;úÃ)×>ºÈNékq@ú±¦»nbÝ·Ó S¢Æò‚Ê.ôñ…î¢ÝØ‚³‡" ûâJú>ÁÞn—‡Jkýe„ÙÖòÔ}n‰0?¢H…<·¿èN@ép½ ¢~øaéŠ@ @6Û3Î8C¦aÁ±ÂÅ„'N\sJU‹*‰«”%|7lîܹ’èá9ƒ ] ĈA™Hè…(ñ iX‰f¥ê§ë£©oø]±b…”ùsŠVÊ–…Ú¨g½¦n~ Týýäí÷ÛBmC$@àçþýûû-Â|ŸQ 0®ë—‰‘°~S¡Ã!KqP™ó¥€|Pd†{¢Æ#¢¥À÷êy©¼ ½7kA!Ì„óœ=ñ{…D’:¦ÞÙý"väpÿÆoEœÁiUÀÆ>„å?Ò6¯PjœÂ8P‚Øco„!†ªŽ:X”ÊÃkÝÂü®ôì ³ôóö#ФÚ,H~%DjøüÁ?®XÑuâD|œ‡,_Qª?ÅbÖQÈ3Ìt™8jâq"F?"ˆÊ"Ë ¶ã¾0‘ù³ˆÃ­Óv'õ£.°ºùƒ€ÃuFóæÍåÉ}§yèmòs͉ŒÉ Â*›¾ñ3ñ!’UÿêmE,¢º…’žÆ\'^ÇbH6újV`~¡¦Àœ0Ø[åØÈX™³ŒIÖ tËœr`áŒY¹f-pÓ¥Ó²ÎØ­v_¢_ÅxáÎÚ«þØOÞyç©3e÷õyÀ‘Eç`ïamW#¸bˆ9{÷î-×)8TamGÙ1Öö³Ï>»\dD™à×ÏZîµ¹%Âür„j zE>–UÊ8X(ÐCôÀC¡ë?ÄÈØ‘+8í´Ó$ 8¢M+`½„R-§äâl]ˆ9Þ!nca…øãT:uêÔJY ò„K:&mÕªU+ ÊRõ#3¾¡þÇ{¬4@ixàÀåå8É£<±Ï 6#¸ˆˆc lÃ(›1`GÐ:­:ßÛ-¬p1нð*.wZ¾I.¼ŽOè²ýŽ»1„h â>ì“e!|™çÁaÀ®ƒË½"'6D])¹â»+eæî«©½¬§AÏÇRõs-€ ‰ª¿Kµ3è÷HltP‰"á¼¢¯F('Œ²è?+ÓCosX×¹%Â8Ñzå^¨Îˆ²ÃPÈ'fÎöì<«:™ßh1ÄĵŽ#NÓpN3000I$ðKÂ4@w5í~sM„ùaÛ3àð~’HKU¹¦œâÀ€‘ŠW`â[‰0·¢f¯e›ïÂÇcCw~‰¦„¸0€åž—nëIÞ”‘$°ºFIRÝÜÖ…¹ŠATÔ[Å|Ä‘~ˆ0ô¬›gÔgÊ‹QvºsNk×éËiýL:`l˜uÂÓò5ÆUÊQuF÷]aá`€þ RÇÌi-sK„!ŽÄûºW`²EÉ óZOó]¸` ø]xÍ&nÅ™;cC÷µg]LÙáb€µB),€i`5!¬òò–/ó4UŸ\a~8a(¹Ã¶úÆÉÛÀÍs{!ä9™ênña'Žt›‡IŸ\ `ahçß+¹565óŠ|»3jòš¯úޱ„U p0nÝZQ“\aJnïGŒòñ·‚ã;ùÄ®”§f¯0D˜WÌ¥ã;8apÜÙ  døxô»Ãžê =çGµXþy~N tÏž5ä’ƒƒá‡ ¦: g ¸0O Ð÷Œ?`ˆ0?ØKÇ·ø3zóÍ7ÓQYSKOÀq)’‘09)pÜñßè&(µ§Æäð#p nýH5¼¢-—D˜_¥|…ìSN9E¬Y³FàÕ@¾0@ŸÓ÷ŒÅ0P¿~}ñüóÏF1$¥üÝüùóeH°›³î „]Lîò§v)¢@D.‰0”ƒ xñ8OÐl§ñÕ¢èPSF4PAȃ+dó£é³¸JÁ±$Î.Ù¨ d_}õ•Œlqæ™g†Þ8BöÀµ1âíàP .Ái˜q/‹Õ6—DVAlž ¶Y³fâõ×_„ú1 Ð×ô9}ïŒ8Ò/Óñ=± ~l¬ÛÒÑ_nj©â4FaYG ô .¸@P¦`00yòd‰Spä’Ô8( (Þ^|ñÅb̘1‰s¤Ç€Êz™è}Œ=Z°©úuM®  d„y9ýôÓeˆ—ì·6?-$¶+1;ƒ "ísˆÍ0.3œU'Ø*ž†Òø‹KIírI„áåùäÑ¡CU½Ìÿú]´âDPD˜j‡5D”è²>ÀƒC†H±\vµ.ð«cµ.èã_¿ViUYú;žé÷Ö´¼·>³Þ“F=?ý¹~mÍÃúõÞš^¿/tMyêúÕŸQ†t…Á+Äׯ¥ë‰*eNv±~‡0ÿiÆÑ<ø0¦”³`ÆíåOÒ*¨k~®Ô/íÖ¯­x(öÎIZõ½úÕËSϨ§ª#ïÕµÞžá‹uýË/¿”iúbTµÓZ¿÷~׳ÝüV ß3ÙÂÐ +„ 6óÖ­[Ë?~eW¢›ÆÄV‹«läÃÀÔÀãš÷j éϭ銽#-P*õýޝ*ÿ'˜,õüÓŸþTù…åΚW©{>/–¦Ø»B8â9 p¬î™@°îQrÅê1 µ,¸È?U—"IÌ«`Î+Ì)np_ØPX¯y0NÔXQ¿¶Ô½zq÷õ T~ú³B×viU9ê—oÕµõW¯/×*?Ò1O8T£BrØa‡jDU¨=~Ÿç’ƒÛAgÅlòqlôa´• Í"Ø´iÓ0²ÏEžàO-*¹h°idI 0à|Åáú dåL‚Ta€}î¨£Ž’AT|ذa¢[·nâ´ÓN ";“G*x±9B²â4žp’ÖEœ< á¯WÔIÞ_.ækƒƒƒp1€ˆvË–-±ÅX ·uñåž;"ŒMï矎_W_2lkCDøÇ«!dýãÐä`0`0.ž{î9ѰaCsð͹#Â~úé§ÜZ‹¼J$`¯¾úJ.½ôR)]º´u°æˆ§„ÑñYpí…/¾øB&MšäÚþ¥Ò1.G¦B÷’ ¤J`æÌ™Ò±cÇT«áýIœN´<$ù´XtÛÊ•+¥jÕªkGÁíÛ·G¼îå \Žôòì±ï$àmk×®U‘ñ«U«æíx¸÷SÂh söi(UzAì¶£GêO…ŽOœ8!=zô'Ÿ|2tN;@\ìê1’Ó§Ovå9þ(på´°S$à{ÎJ_0g§9p¹#ayÀ®>JêÀJU¼2jÔ(yë­·ŠUŽ9dÊ”)’'Oe ‡2U¸paÙºu«tïÞ]š7o.Ó¦M“š5kJÅŠåÛo¿•©S§ÊرceõêÕjC¶TC»ûî»å¡‡RÝ€ƒéСC娱cR·n])Uª”\~ùå2lذx»ik9þ(°7#ø‹Vöïß/×\s ™8H pÚ¬TÂÌyâ @Ä»œ¶cÇyå•Wä›o¾‘;wÊÀå‘G‘J•*É'Ÿ|"¹råR²Ü¹sËùóçeܸqÒ·o_yüñÇåܹsrêÔ)ÕiÄyCù6mÚÈä‰'žÑ£G ,_{öì‘Ûn»MFŽ)»wï–.]º(Å 37 -anžöüIŸ£HÔÍÏgç7pJ”†D¬7ÎNZ÷?þøC&Ož,GŽQ–©9sæD`çÎ¥_¿~R @te`ëÙ³§R¦Q²mÛ6ùøã¥råÊÒ­[7Éž=»RÈÊ—/Ÿî~7~ºiFØð?ü€Ý¸q£4kÖÌÿƒuù§„%º„æòùóL÷.»ì2yíµ×”¢„åA,b91’ p`$)X°`èR¦L™”2k¬_eÊ” ]ÃA­ZµÒ¼wÛ›x-‰në7ûC$à]pÛÀjBæÌ™½;Ÿô’åV³-[¶¤Ú¢ ü|r¬eË–DâSÂ` £õÁþ'oÍš5Êá» ¡,á@S†aÍ‚%ëÌ™3)u¬iÓ¦²aÙ7ožšãY³f)‡þ”*µøf.GZ ˜Õ“ ¤!€ÏÇúõë+?Ü4øÆÛI%Ì‘çL)]Ï=÷œÀG KÇ—Ç{L²e˦b„•(QBÊ•+'›6mJºƒW_}µrÒïß¿¿RÂ{ >Y²dIºN«oä« ³~ v¡/\¸P°SâTÂ4 Œ;¦À»½HÄ¿.C† Ê !(`ñ‚‚¤-+fÍšU¾ÿþ{å°]’‹-Jåž{îüA´W}„£€`d»ví”C?>lP/"Ac¦[ À†B$@V@¢îêÕ«‹Þ¯Öê6Yt[ŽÄ—­ÑŠx¯B™M„%ØÃ)Ñ™5LßVþüùõo>F øa×%²÷Þ{O~øá…Ì­‚‰0të8Ø/ wÀg ‚³vèÐÁÝ Xï§„%b½ سàùá*TH^zé%yóÍ7•ÏÃôéÓåÃ?TA`Ý<8#…ÔÍýeßH€¼GÎøÅŠ“ÒLÔíªÉ Ür$¾ðð‹€â_~ùEE·oX¬”ðЏ`uêÔ‰«ÃX~ôR2ZXÁ¨„Å5µ,D$lTºõÖ[S¨·ZA p–°Œ3òKÏŠ'):¬|ÀàˆKf̘‘’³~¬ú¾Î¥H§g€í“€ÿ `w:¾ûà‹KqÀ)a°:DJú쮩ñooöíÛ'½zõJóÿ²HI¼õ$P.<¸v Mú¨”-[VjÔ¨¡þÇÆH°­K˜(ä¡Ôd„ ‚0Hö Ç…õ‚p9Ò ³Ä>’€w ¥Û¯¿þª²”xwþíy •0ú„™ó@ƒ‰ÈgŸ}&Ha4qâD¥ˆáKŽPšØ{ذaòàƒ¦Û1)8ÚFÜ›Ç.Æ›:uj(©7"òãƒÇ BK˜f‰}$o@¢nìˆäçŒ;ç/±oPwŽ!¡^!:;-a !‹XVœTc®!zþüùó¥xñâJ CJ XÊÂçmEJþÆo¨ä‰D˜ hEI(|nZÂÜ>Cì x—Àþýû•O-²‰PÜI pJ—#Ýõ Â?ï‰'žÒ·M÷èÑ#bš¡h ÀaACBZì¢Ôþ',Õ4HvJÆšhG¿Ø €÷ fbÛ¶mÆŠ; .D¢“‡[YÜ95ÁèBP é6þräÈ!k×®8‘†‹–¼K—.røða™4i’JÞ¼ysý¹Aƒ*e‘v"óÃÊævI4à­ÛÇÃþ‘ ¸ƒV–/_.ãÆsG‡Ø C³„q9Òð9pìäîÝ»UZ!(`PŽ¡”A°L§—h ÀñK¿ø xA/^,õêÕ“C‡é«på1—#]9-ì xžÀ§Ÿ~* 6T?n=? pJ—#Ýõ4ßqÇʱ;±³~]¥J•’>}ú¤éhË–-U²o$oÔ¨‘ÜrË-Ê Àûõë'7VK‘ÈyÛm·ÉóÏ?¯vP¦©Ä…o•Mv‘]"ð¸b`ÃRûöí=Öóàu7pË‘PÂΟ?¼™¶`ÄÉî¶Y½zu¨7Èë¸qãFeł߿ Lé}2ï ¨rá ÀqÏøñãU¨‹½{÷*å ‰À½ PÂÝaê…q±$@Î@¢nü°õ‚K†s”ÜÑrà”0,GÒú`ÎÃŽf°„R¡B…P§2gάü¼B'þ:€Ò‡ø`‘äÒK/üyIÌàç¥ñ²¯$@Ö@&øÕ"ÔÅý· %ìôéÓîŸö00’µ(J$7eË–IÉ’%•[GÜ7± c§„eÉ’EÎ;çp6Lz°„Q Óá1 @*œ•)ŠR!hï½SÂ` ³*wä /¼ ß}÷½3ÈÖvž\Eþ¶04T®\ÙUýbg"œ†4YÇüÇ.¦Æ¹ï¾û"Òüé§ŸäÈ‘#¯óBZ+W®L“Ä;íÕ༣%,8sÍ‘’€•fÏž-×_½•M°n“ Î1JX<–0D\‡ƒcž\¿0kÖ¬éÊ ’;â_åË—Oºví*ðƒ@18p ”+WN)ÿú׿ÒÝÔ;wVðcÄðÔ©SeðàÁ*¦”ÞÛo¿]–,Y ôꆚBé…¾²$@î$€´XIÀJÅ[ç†é¦Y¬Â§kÀ€jIëÎ;ïTëëH‘ƒ8ˆ»b$°èD’‚ †.!½Ž¦ø!_"–'5ÁN\§ˆT©R%"ý22,_P`îºë®4ç±Ä›ˆ?YÄÆxH€<@.400Q·&Ë ‹´„AáÑ¡ë¹üüóÏj$L»K—.UKbðKF"-3Áʃú5ÁrÈj4þ~?øÏi‚¹ÑD³”aùxóæÍêoݺu2mÚ4)Q¢„VÌõ¯\Žtý±ƒ$àjsçÎUùt½º1ÉÕpmè\ •0XÂà¿e$Ï=÷œŒ=Zí¶ƒ•«zõê¡Ô<0õ‘s˜”E9½‚õÊ+¯ÈúõëåŠ+®P1WØÁê5ÑÉk}gI€œ#°páB¹êª«Ôwˆs½`Ë©øÇÅ_âÿM¥£/ÏTê³ãÞ_|Q®¹æ©U«–as°’Á‰¾P¡B*ü¾”7,‘¥búýõ×_•%êȘÌq•i@IDAT1£ Ï€ÄÔØá⥘Qp… ÔD*‚Ø6PD#Éž={Ô\@Q ì^Å\a%|뼦ÐÄzÃÇë‡÷pÀsO!Hž¾‡ $ÿ÷ÿç)ŒäGìÏ;ùI͆i†r„_Fb´ Ò¨\´sØy9aÂÁ0|›FŽ)7ö”†ñAOQ‡W˜¢)`(P¼xqUÎèìf…%Ì«¥c  @"`ù/Uª°D ¹°l •0,û9éXcÛ¶mSáV9Ä£,y H”V"¢…OJ´>–w†@ •°X–0«§–ä¡Ä%y_}õ•Ú‰à®úãäk´ÿN3,‰ö÷š-’ 8Iª±¬-D’“ýcÛñä:–´„Å?=,À?ü HX ÑG»Ç×¼æÇæF†ì ‰¬`HÓFñ>@*aøiw¤÷§Ô»#@Òt- ­wG‘xÏ©„%ÎŒw@P Æ$R3Q·?ž€@*a´„¹çáE>Í›o¾Yzõê%eË–•"EŠÈO<êàµ×^«°j'0½uëÖÚ[Ï¿r9ÒóSÈ€­`C\0þx³»eR ÃîGZÂR¦àÛ–ê¶YãCyÏŒ ‚åjËÅ檚GöHÙR‘ý5@ ãîHû¹³Eð"½{÷ªàÕ7öb÷ÙgT°‰¥/Jj ™aÉ©Y³¦ôìÙS)#HzÁîÑ ˆü‚À‰c$™5k–´mÛ–‰º}ô0R ƒ% ¡!(î  OtŽTF° EJ°é¼;F’\/Rµ&&×*ï"ðcÇŽÉÊ•+¥U«V^ê6ûƒ@ •0„¨ %,Æ“aãåhJ2ýräÎ;mì™õMÁmüÖ÷€- xÀ¼yó¤Y³f‚ï/ŠR Ë™3'-ay†‘Ä{þüù*áú¾}ûdúôééy|Ý4ï.¾–XŠHÀ«à#»hÑ"å;ëÕ1°ßÆ©„aÉ ä¤¸›ªãù5;tè v¹»Ç‰õNoåKìN–& ¤ºƒïl¬oAáá§q2b>&~aX’¼ä’Kü4Ÿ¶ŽVœTËï¹çžt}†ïƒ&õë×—]»v©“%J”ÐN«W$¯ÅD¬Nxälnàr¤G&‹Ý$ÀX0wî\yä‘GhMZM –0@¥s~êüY-°\†+`V·igýTÂì¤Í¶HÀ[¨»L™2R¼xqouœ½‹@`•087þñÇqAb!°Šó­"ËzIÀûðùÀEÞŸÇh#¬–+W®P@Ðh€xÍ~øaÙ¾}»;;—@¯R]ÎM )%ð$êÆF²Š+z¬çìn¼«„ÁöÛo¿Åˉå\Fàƒ>ƒº¬WÉu‡Ë‘Éqã]$àw3gΔŽ;ú}˜_`•0XÂNž<èÉ·zð©$䟛£Gv» ‘î(’?~<ªßá:)\Žt’>Û&÷Ø´i“Ú|8tïŒ3¤dÉ’R©R%©^½º¬]»6t ǵk×V¡-J•*%#FŒíäDžÊ1cÆH:uäÝãÄ—# Î6IÀý¢ayh)wÿ\¥ÒÃÀ*aXg·¶¤2ˆ÷"DþôËT¤„ÜP8“oã½+ dzgÏ–7ß|S)T?ÿü³ }ú8ßöÀrU¸iݳI©ÐÎë),9ê-AZ™xz·wïÞP±õë׫c4„˜7o^c«Vß¡C‡\c×ú H€KÑñ›6m*Ù²e ,ƒ œË‘Ašm‡Ç y˜×áãÉ]¯H%Ú½×^{MΜ9#ØùÊ+¯Hƒ ¤P¡Bê çÆJÎîÝ»Ë}ôQ¢MX^^¯€ZÞ p5S§NÉâÅ‹åºë®su?Ù9óV ƒ% <¿Í{˜bÕ”5kV2dˆ )7|¾Þ~ûmiÞ¼y¬Û"^/_¾¼Úýˆ¥Èï¿ÿ^^|ñEUu¿üòË2lذÐÎI”AÛnZÂÜ8+ì ØO`þüù‚°äS‚Aà•ÿ¦2T/ï0ÄλQ£F©ˆÄ©0ê½ØB çüN:%„»‘”6þü ÝgT©§°“¨\¹ré–õp Îúð3+V¬˜Ñ펟{ì±Ç¤wïÞR¶lYÇûbW°Ì’1c`=!ìÂÌvù.5¬` Öê’É`7HÀ!+W®TF *8Ô6ë@+aXÃ.: 8E Ù%]§úËvI€Ì'+u›ÏÕ 5^ ãr¤S÷‘>aþž_ŽŽ¢@ €eÈòåËKÑ¢E}0!UT¨„Åý !­F¡B…"–Ç5¦ÞˆˆÇð•0C,‡Ø2gÎ,mÚ´‰X°uëÖ’%K–ˆ×yÁ˜ã„sáYðgíÔ©“߆Åñ¤@ ðJ|°;’¶mÛJ±bÅÒÆ9\£$F€Ë‘‰ñbið*üQ%ê®Y³¦W‡À~[@ ðJX¾|ù˜º( á'ŒJq®Zµj ÔÄ¢ ÀåH>$ °‚uèÐ!ƒå(ã&x% ñÁº¡(± ¦Ìéˆo¥ ŽqŽñ®4"‰½r921^,M^#°k×.ùå—_¤aÆ^ë:ûk1¿¿I-nÈÍÕsI2±ÙiÑ¢…”(Q"tŽqŽ’8(`TÂçÆ;HÀK`»îºëøCÕK“fS_©„]?~A2UJ|*T¨ %K– Æ1ÎQ'@ lâÌx x‰ÀáÇeÍš5ü¡ê¥I³±¯TÂ.ÂæÉÄž8Xnºté"3fT8¦5'1†Zi:æk$øJþ$ %êΚ5«?ÈQ¥D€JØE|´„%þ 5iÒD-Ib)Ç”äÐ1?9n¼‹¼@™E–,YÂDÝ^˜,‡úøÜ‘àK˜>1µCsá©fK—.-¥J•R}Æ1%y´"&ÏŽw’€› |öÙgR·n]•ÏÍýdßœ#@%ì"{XÂ6nÜèÜ,Di»jÖ­[';wîø¬]»6ÿÕþóµSQÿŠ/uXX°kç!FÇús‘Ê„ŸÇ{M¼òïÿ[;zÕ×é…µkÚ«þœþ8|LZy¼j²e˹òÊ+¥@Å!3ô¾kZ97½r9ÒM³Á¾€y.\¸ óçÏ—#F˜W)kò*a§±ÂŽ=êšÉÅÞ¥K—Ê矮úT»vmiÔ¨‘ ’ Å'S¦LÊ _àÚ—x´WT¢)1úcý9Õîý5ý±®HÔCý=úãð›´kÚ+®kçŒ^µsçΓóçÏËÞ½{eÇŽòÚk¯©æš5k¦¶†Ã‡Ím‚y£ øÀâÅ‹U¢îÂ… ûop‘iÜ÷­dÚÐ⯖“ãÇǃ…%ׯ_/o½õ–²ä 8P*V¬hakþ¬ˤõêÕ“^½zɦM›ÛÃçÍ›'½{÷›u›@‰¤ ø‡~\Íš5K†êŸAq$– vk®\¹äÔ©SKжÄf í(•‚óöÛoËÖ­[å®»îJ³äå6^ŠAJ,þ°TùÒK/©_¦7ß|³²&ƸՖ˚Ó–ÆØ €-¨n.LÔm nO7ò·C§‡‘zçÜ!‰XQO=õ”òßzþùç©€¥>éj@3°…XCévƒÀ ¦÷ksCŸØ ÔÌœ9S:vì˜Z%¼;¨„ý5ÍX’„ã»ÝeàÖ[o•ßÿ]YÀàïE±†ØÂʈ<—·ß~»+RUi'¬1k%°›À† ”oj5ìnšíy•°¿&Í % KÏ>û¬4mÚTÆïÁÇÇ›]†"V¼xq9r¤ú°trtÌw’>Û&ó À•V0ó¹úµF*aͬJØÔ©S¥H‘"rçwúõùrí¸Æ'—^z©`œ:æ;=lŸÌ!€$Ý»wï–úõë›S!kñ=*aM±Ý>aØùÓO?É!C|ÿ¹u€`9À\8%tÌwŠ<Û%ó À Ö®];&ê6­ok¤ö×ÔÚi ƒ#>,0ƒ rÍ.=ß>áQ±Áƒ«¹p*‘6•°(ÄK$à!‡’~ø‰º=4gnè*•°¿f–0»ó—-[¦ò.2˜óÿ®¸â UÁq*aNPg›$`>$ênÞ¼¹0Q·ùlý\#•°¿fJv(ÚaY´h‘tèÐÁÏÏ•§ÆÖ¾}{Atk'„ŽùNPg›$`.ìrÇëë®»ÎÜŠY›ï P ÓM1ÒÁ¤l¥ìÙ³GŪª\¹²•Ͱî`. |cnìÄË!ƒÝͲ=  Ì;W%êFào $B€J˜ŽVÁ‚å×_Õ1ÿ>µjÕ2¿bÖ˜Ì æÆnòGk˜ÝÔÙ ˜G™V¨›«æ1 RMTÂt³ %ÌjKØ®]»¤L™2ºVyè˜ÌÝBÌnâlÌ%ðÅ_¨ÔhyC!D P Ó³ÃçÿbÅŠéZå¡`NìÚ˜>^Æ 'Â÷$à ø…DÝ:uòF‡ÙK× ¦›;,a”,Y²èZå¡dÏž]öïßo{W¶ˆJ˜íØÙ ˜B`ùòå‚ïË.»Ì”úXIðP ÓÍy¡B…,_ŽÌ;·d̘Q×*Ý@ŠÐ%—\âHW¨„9‚’@ʘ¢(e„¯€J˜î°Ã¦kއ."EÈ ÿ,´I%ÌE»Bq@¦ l¬¹êª«â¼ƒÅH =*a:&9rä„ øã?tg;üþûïeذa2mÚ´t8~ü¸º6zôèt×R=qß}÷ɶmÛR­FÝÿØc ‚† ÂA`lÛ·o¿zâÄ UæôéÓ¡sV8¥ 9¡øYÅõ’@Ìœ9“‰ºƒ4á•JXXXÃà·e•$òe¿eËyá…äH×|àÚ;3îZª'RÉ,ÿ¨½{÷ÊðáÃÓuéý÷ß—)S¦HñâÅÓ]ÓN x.ÆxöìYí”e¯NY ôÓfÙ´²b°„ÀÏ?ÿ,ûöíc¢nKè«R*aaó]¸paKc…áKÎØñJÉ’%娱c²jÕª4·|ðÁR½zuÃ%4XÉ¢µqòäÉ4u=z4Í{í LíÑ”±XíÀ’uóÍ7«¾ïرC«V½~øá‡Ò­[·Ð&ô7R?ÒÜã ¶d,™‰(Ç1º÷å?þ˜±…â¦Å‚$àØ‰èøø<§@*ø…уf¥%,ÑàœøO~à 7”.M ¬ 6Íõ×_ŸÆŠ‚åË*UªHÑ¢Ei˜~øá’V§N¹÷Þ{¹óæÍ+×^{­Àš†Ø6°þ]yå•i6%` J•*%åʕԭI´v7n,O=õ”T­ZUîºë.iР”.]:Í’êÎ;eåʕһwoU%,}à^¡Bõg´|¹iÓ&¥°é­bø|ñÅU¿ýö›Üxã’'OUW«V­R¦¡„ES\µ±›ùŠmí˜ €w –ä† TžHïôš=u+*aa3cµÖ\Ì·PÚºwﮔ͔zõê vsj‚¥;(%;wVñ®ýK•'NTEΟ?/¸Ë€[·nX¦úöí+óæÍ“#GެZ°Ni‚\ŠÈ…öË/¿(‹,ZPRbµƒèÑÏ?ÿ¼ 8Pž~úi¥$öêÕ+6}út)[¶¬RÑ(˜PÊðá´»ï¾;¤\ȨYWŒ\冷×î‰ö «—&XÚ„ÂkU<íh÷é_±œ‰¥Qd ¨[·®ò3Ãuì~Ä"vQ"DüÍ>úè#ý­êXë»^QDx ô }‚`©US¡ ÁzÅÎÍ¢ËÍ}dßH€D­4 Q÷È‘#‰ƒL#ÀåH”pV?pà€Á•ÔOÁª¥·ÖÄ[#/(÷€]…áÒ²eKµ‹~`(e &s(&Éȸqã”" KÒØ±c¥I“&Êá=Ùvzôè¡”-8Òkùè|Î`iƒ†%H´Áô‚%TdÐb¦aISS¡|Ö¯__^}õUÁr–n±„Ú§OŸBª¯Ëèsb·B„1ÚÝ¦ÑØyŽH 6Ï?ÿ\¹q`µ„Bf f@J–Þ¬D—"µ>@IèÚµ«r:ÇnÉp’òÆoÈ€B;¡ÜÜsÏ=áEãzeAì²ÄîH,N˜0AÝ—l; 6mÚ(;½‰€­0ñcÉV+XÉÐF¸S=¬’ +ø‘Mš4IZ·n ÞÃb‡¸cX†ÄîQÄ;s»@)§ ¸›>·±k~´0“À?.þOkrH°öð˜S ÞîÊâ°²`Ù¬C‡¦÷ïþûï—‡zH9¼›^ùÅ ±üˆå=(’Ñ¡ÆÓ6êÂ2!üÐÂ-6f¶ƒ8¦E;°va)8m™QßW8ÚÃñJ]¸ žÍ›7+‹šæÇ^&Ò{X>GŒ!£FŠTÄôóç AƒB;XMoÀ¥fË–ùS]:7ì–18ãÃöè£àYH’} ÀÁþDV,ZÉ,GÆÛ,ë]}õÕñZuEr”7³ð¨X±b¨/™3g6TÀP š“=ê©T©R¨žD dZ9/F}Iñ÷Q•¬HÑ"ÅÜ÷©p‹RÜ7² ¥œš§Úµ&+'Ð6&!C …Ì&@%Ì€¨•ŽùXöÒïð3hž§ €¥L«6cDó#‘áypXÁè æžùð[O¨„ÌhΜ9ÕÒ”þnó O½cÐÅSŠÕÅu;¬`ü…*"Û À †àÔWD!«P ‹@Q‘÷ìÙájò§”`­Pð’ïU°ïÄ\`N07v 7hØI›m‘@üàüõ×_3QwüÈX2ITÂ"€ƒ%ÌŠ0°| ì§Ÿ~¡ež¶›æsb·UŠŽùvÏ4Û#øà3Îø¹råŠï–"$ P ‹–°Ã‡[N9¿üòK9räH„ÖyÚ.˜Ìæ„B$@ؽ¾`ÁK2¦. „ Nä¯÷Èé‡Ô8pÎ4[my‘$›â,Ì0̉ÝBÇ|»‰³=ˆMé‰àj”6-öÝ,A‰ …Ò!w¢‚äÓ§N’¹sçZQ=댃ØcZµjGió‹p9Ò|¦¬‘R!€ ÍpÈïÔ©S*Õð^ˆ›•°(¨àfUuø 8Pf̘AE,ÊXué›o¾Qì1vû‚éÇÄ8az<&g ÀŸûeÊ”q¶#l=0¨„E™jüg´Ê†fóçÏ/=ôôíÛW-Z¥'¼d&ï¾ûNÆŒ#C‡Us`f݉ԅ_ÝTÂ!Ʋ$`-™3g2E‘µˆY{*aa@ôo±iÅI}ð;ƒ»ï¾KELÆ¢ãùóçËÈ‘#å¹çžsü×.0øRH€œ'°víZe¯V­šóaC€JX”©.^¼¸eË‘úf‘OòY³f)gý3gÎè/óØ`:aµôûÌ3Ï8’¢(|°„Ñ/,œ ß“€3¨›¾`ΰr«T¢Ì>"%gÏž]…ªˆRÌ”KH“ôè£JæÌ™åŽ;îPqĘè;u´`ˆ˜?ƒ R•1X»A¨€¹aØÙ¾}»Ú x°“@F;ób[Èõ¿0,Z-PÀn¼ñFiذ¡À7áƒ> H­Zµ¤lÙ² ç ÚõŽ;¾_Ë–-“Š+Ê¿ÿýoÁ\ºMèæ¶a‚HV°öíÛÓG3ˆ“ï𘩄Ř|q#}QõêÕc”4ï2Ú„åæØ±c‚]|Ó§OWI¿±‹o×®]R©R¥PcXÒÂyý+¾ØaeÑΣ°Ñ±þ\¤2áçñ>Ñ×éõh×´Wý9ýqø˜´òxÕdãÆR²dIÅ¢téÒ*Öψ#\±ô¨õ1ü•JX8¾'{ `<>;loÃl. ã1€B´eË–¥¬¹œ7o^HÔ®hîëÖ­S›îºë.k¡V,ÞtÓM¶çnŒÐÛNs9Ò6Ôlˆ"@\0Ä ÄJ…ì&ð·Áî–=ÒÂTX‘ÈÛÃÇògÓ¦MmïZÏž=套^R–?Ûw°AÍZé`Ø4 šÀ‰'dùòå‚àÙp‚•°Ôa ³:LEŒ.ØrþS3f´uÙUØå—_®Ò8?>P»±©_NÕxð•HÀØ´¿[&궇7[IO€JXz&iÎdË–MræÌéûdÛØpà 7¤»oÚµk'™2eRþov¶ëd[ Qá$}¶tØ9½páBåt¿s¨„ÅÁÖ°Ý»wÇQÒ›Eœ´‚é‰ 0@¾úê+Y¿~½þ´o±IÇ|ßN/ærÈR‚ W tyOÙ=? ÇìB ³2}Q]°´‚ÄvéÒÅÒ6â©KØ¡4qâD9~üx<·xº ó==}켇 üùçŸ2gΦ(òðú¥ëTÂâ˜ID´÷«% V0ø%U­Z5Ö)_¾¼Ú©Gý ()´„YÿL±'‹;~\#” …œ$@%,úH_ä×’Nû‚á‡|ñÍÏŸ0*a~žaŽÍ­`cŠ"·ÎN°úE%,ŽùF˜ ôצŸÄ-¾`FLo¿ývùúë¯}ïF%Ìhöyެ#°fÍeý¯R¥Šu°fˆ“•°8@a×Òù-T…­`ÚtÀ? 94_{í5_Çcˆ mÆùJö@Š¢:ØÓ[!¨„Ť]†ÿ€Ÿ–$ÝlÓ˜#~‚(¾üò˾ôcˆ m¦ùJöضm›:tH˜¨ÛÞl%6*a±©¥J•’}ûöÅYÚýÅܲ#2©ë®»Nù‡Í˜1#VQO^çr¤'§ö(Í Æÿw@v›JXœ“ KØÎ;ã,íîbnÛ‹VÿþýeÙ²e¾ócœ°X3Ïë$`¸“lÚ´É‘Ôlæ‚5ù•°8g´dÉ’²k×®8K»»˜›}ÁŒÈùÕ?,!8Œæ“çHÀ °þý>¾p *aq΢*Ÿ:uJýÅy‹+‹yÁÌœ–_rܸq¾ñ£%Ìh¦yŽÌ'€DÝ+V¬P9jͯ5’@ò¨„%Àñ¼´ÕkV0ýôø-~-aúÙå1 XG‰º6l(9rä°®ÖLI –4¯/IzÕ ¦Ÿ"ÄóK~I8gÈA?<“ ˜LàÌ™3LÔm2SVg*a °ôzú"øDtíÚ5»¯(üà 䋸a Qá¾ç‹=ò… Ê•W^©b=úot‘× P K`¦Â«±Â´‘~ˆ ÿ°¶mÛÊ+¯¼âiÿ0.G&ðŸEI LÔ4Þb+*a àÖ|¼øåée_0£)‚–%KÏç—d¼"£Ùå90‡BÛÀ? )$àFT˜|éçÍ›×sé‹üà f4M^Ï/ÉÝ‘F³Ês$`ge¢nóx²&ó P K)~QýòË/ Þålq¿YÁ4š^F%L›I¾’€ùV¯^­¬å•+W6¿rÖH& – H¯)a~µ‚iÓæåü’T´Yä+ ˜OV°Ž;š_1k$ P K¦×”0?숌5EÈ/éEÿ0øƒýóŸü/k~y%°uëV9zô¨Ô­[7Ñ[Yžl%Ào€q{)V˜ŸvDÆš¦;î¸C¾ùæùñÇcuÍu†¨pÍT°#>#Œ:7¾ølb}8*a NjžŸg? JX³YºtiW[‚jÓ¦2Þøa… R;¨´ûì~…ÆÞvSg{~%ƒÏ?ÿ\Ú·oï×!r\>$@%,‰I-P €œ={VNž<™ÄÝÖÞt+˜F7ÿ°æÍ›Ë¸qãdíÚµÚm¶¾rw¤­¸Ù˜Ï @«Y³¦äÏŸßç#åðüD€JX’³Y¦Lùù矓¼ÛºÛ‚nÓ“åÖ§O¹úê«¥Y³frêÔ)ý­¶Ó1ßÌl$¨{öìÙ*,E†Ë!úˆ•°$'J˜“þDFݦ,=•hþa“&M’ï¿ÿ^–,Y"Ù³gO³ gèfd6á{K—.¸‰”(QÂ÷cåýE€JX’ó‰’Û·oOònkn‹fC Ó?üК†]\k4ÿ°E‹É Aƒ¤J•*ŽŒ€i‹ÁÎF}H€)Š|8©•°$'±ÂÜ´Ë †©Ñ£G'9ZoßÉ?ìСC’7o^ÇÇåHÇгaXµj•dË–M*Uªä£Qq(A!@%,É™.X° rÎÿí·ß’¬ÁÜÛ¢YÁÐÒˆ#äšk®1·QÕÿ°¬Y³ÊôéÓU¯áCK&Â8)Üé$}¶íøÙ©S'? …c *a)Lº[¬aø%˜9sf©^½zÄÑ|ðÁrã7F¼„ HkôÕW_ÉŠ+”RŠ_ÎåÊ•slèÜéz6ìHOtâÄ ©]»¶OFÄa•°fŽ nX’üøãcþìÕ«—Ô­[7…ÑzÿVø‡ ¿äC=dIðGøâŠþvïÞ­â•}ùå—ª8—3gNµÔêH€XŽ–™/($àTÂL˜Iü2ƒV¿~}jû»Š'Ÿ|R-“Õ©SG† "x…¬[·nâ‘i?lÓ¦M*¿d×®]Cõ®Y³F† &ð+P @è|¢ÈZ€ šõK{}íµ×TUÿüçÿ ÓK—.•Ò³1PH€þ&€ôlø‘R±bÅ¿Oòˆ­>ÄC~Iø‡!É÷믿.·Ür‹¬[·NfÏžÔ}îÜ9ùý÷ßÕßÉ“'H?Dñ¯Y³&°”(óf¿ÀPú‚ùuvƒ;.ZÂL˜{X-8 çÏŸ7-z3,EjŸ3ümÞ¼YYS4ËBh­,_“'ÿ°AƒÉ3Ï<£ÂG`+<”#”áÛn»-éÊ‘^¾,‘òfÉ’…VΤéòF?€…?^jÕªåçarl$@K˜ “Ž€›%K–”;wšPÛÿª8r䈊Æ^!1Í2Ö£GåW^†ïS#ðÇ(Ë&£k j„ò?®d¥T©Rß³H Š…H -|æuèÐ!´”Ÿö*ß‘€w P 3iîàöÓO?™T›È¡C‡äÌ™3ëƒ2öÃ?*joâ…¨àø«-?~ÿý÷j9Rûí·úS Ã×,kÖ¬†÷U­ZÕô͆ ñ$ xˆÀž={”Ïm£F<Ôkv•â#@%,>N1KÁ/ Îùf ”0ø E,¾ð ‚v)æèÙ³§<þøã-šgÏžU#Ri­aÆR¬X±tUÀá¸{÷îéÎó |1±i&cFzÏýYðãø©„™4«åË—75}Ѿ}û"*a°º½ôÒKÒ²eK“zÏj@˱üë6nܘÆW/Qr—^z©T®\9ÝmPÌêÕ«—î[ˆÖ¹sgC¥;´>ùä“8j‹\ WÑ¢EC À£= ÀßN:%‹/äw¥€_ P 3qf¡$™å'p½ @áĉ¹E[Å¢ã%J(ý§Ÿ~ÚÐ*§ýhþz±º…€¯5jÔƒBÆ­÷!< E`þüùêÿ-Ä| üL€J˜‰³ 'y3vH"ÞØ±cÇB=ƒví]uÕU¡s<°–ÂŽ ȇ~(×_½ÊªµˆºPÄR‘.]ºHîܹUÍ›7çrK*0y¯ï Q÷§Ÿ~Êା›Y(œ•°p")¼‡Ÿ!|€¤"Ø©ÕQ­Z5yã7á (ö@l¯I“&ɨQ£B1¾  Ï™3'¥Î râñ($@@¢îråÊî$þ»HÀû¨„™8‡ØY‡€›©¦0‚†z°|A¨T©’‰½dU‰€U즛nR9%;u꤬b_|ñ…œ>}:ѪBå/¹ä¹úê«þ`LCÂÂÄëƒß%þ¯QHÀï<xËs;vìíC®=Ã_Žø ‡j-}^ñç!ñ£(Ü«I¤ûŒ®ãœv?|…¦NšÎr¥]×î7zÕÚܲe‹`k6R!y4þ ÚuíÞð:õ×#ëëÑ߯•Ç«vŒ¸X` …„ÆÈ“'Ö¼g_þc×®]‚¬Px³gÏ Æ®†4ÚkÛ¶mƒ)S¦¨0!°”i×ôlCþu /£]CX Ì6èŨ,®ëÏkÇ‘æPû¡EYíÿꃢ_¨P!¥"ãƒ~³®SHÀ +W®TKõ*Tp¢y¶I¶øÇÅåÿi+I6 ¥È*AÒä/¿üR7¬L™2‚/<øÑ •LáÂ…C1ð…¤ÿâ4úbBõçõǸ¦}©á¢¿®?þßÕèåµ2úW£:ô×q¬/¿#(>zÅPåãís¤ûôçµc¼j% 9,¡c·&,|°Ü`wfýúõ#F~×îwÓ+òpb§ÂKdÊ”IJ_ v % ¡„áU0×ó0zùAÌ/ü÷ÑÊâþð9ÑêÔ—ÑÎEzTV_·VÆèœvÍèUkýÆî3¼bæóŒ M/†Àæ«áxÓ*ºÞ¯÷ÁT~˜Ü¬âý¹äbp¥¥ëý÷ß$4nÓ¦úb`œ˜Ø“iu |acãfׯ_¯‚Åb~ðeïVÁ8×C¡Glµ-Z(åÖ­ýu²_°"a9üqà‹ˆpHhn¶P 3›¨êC0ä &ÈØ±cý3(Ž„¢p•ËËÛo¿­,.·Ür‹Ô®];J×yÉIÈ]‰¹‚åŽ;îpåR–5°4ŒhÛØá)g£“ÝØ6r–"yù‚ äæ›o6=|•07κ;ú„ 0uëÖ•Æ»£Cì XLÀ5J–Ÿ}öY•ÒåÖ[o•Ì™3[Iço“&áܹs*ôÊÿýßÿIŸ>}R®•–°”ú®|üë_ÿ’W^y…‹}7»P4ŽZÂtܸqTÀ¢ÍG®!¼ÁæÍ›å½÷Þ“_~ùÅ‘^Ç ¾jPê¹ûμ)€k[°c ˜MÁ›5kFÌl°¬ÏõU¦M›&ÈÓG ˜ëŸ“¸:KØ€T’q„;°SàO‚]›÷ß?—3,¥lÁ¬)$`Ä«C(",ERH hSÂ,sÕªUÒ¯_¿ 1÷õxÛ‰Ìá—e§LžUL?pD ûñÇMÂí‡ÉðÓ÷ê‘tÝJùá‡ø,Y 8B݈éöH–À·ß~«|8áCJ! °] ÃN˜£GªdÜA…”qW¬XQåš´r¼H*Žv(ö¨T©’J/fo«lÍO`C:1 ™€íJ|ÁÊ–-dæûe—]¦|ÿ¬0bW1*¾•„ëF8°§@2°rúôiº$÷øŠ€íJþãåÈ‘ÃW9cÙ³g$ƒ¶Rð<¡нÀüÔ©Sö6ÊÖ|C)Š:tèà›ñp $,Û•°³gÏÒ!?ÙÙòØ}ÈgµE€ÉÞí02eʤ,ö·Ì½N1"‘Uƒ!e¼>“ì¿lWÂðÅÌ”2fLûëøç?ÿiyôz(gðÿ±3ܽÞ*¬`×]wåŸ ^çÄþƒ@F»‡‰mÉø‹W¾ÿþ{yë­·¤^½zÒ­[·4·?~\{ì1)V¬˜üûßÿNs-Õ7÷ÝwŸŠæ_®\¹T«’­[·ÊË/¿ª_^p&oÑ¢…”,Y2t>ÚÂzlܸQ(‹-’íÛ·Ëí·ßí–t×’½/]Eqž@7†!Y¹r¥|ðÁ*àhîܹ¥zõêÒ¿•B CÛ×^{MžyæÑ‚ãÎ;¥oß¾†×“9‰Üy¨×H†.'N” ÄLŽ~øðayâ‰'äé§Ÿ–,Y²U§Î!ÁyóæÍcÖ±^ $àù\³f 3¥$ÁŽ·ø“€í–0`Lä‹yË–-ò /Ȳ|çjÔðb h‰º¾†B$ âˆ%,ÖDøÄÀZtìØ1•kñ‰45V £/aXÉ`åÀ’˜‘œüK`ø’ï½÷Ô%Ã:ƒ/ËÂ… «´NPÃå¹çž“.]º¨Ó£G–víÚ)>ø"-^¼¸â„>à=&-ÅŒv߆ TÆ´‡ªxÖöK/½¤–‚¡¤ 4A¼’Ì\Ç[·V.‘6ƯæjðàÁÚíê~ŠÏ>û¬ÀaxÁ‚ê”`,7b0Ïxþ Ì@ÀQŸ&)Ú³€ç ÏâjáYhÄ_Uå81Ã: ÁsŒ%Ç *¨¨ÿ믿V×~þùg5çè+æöíÛ«´0x°ü šhÖ8(n'ÞÇ+ø?§ÿï},\øª[·nÜ?â‚KŠ#Û•°D,ÚDàW|÷îÝJ‘öëKsð+T¨VL}IÂá‰Á±tƒˆÞX~Ò¬ °>à>,ûÀOkÇŽê‹ da—և~ªËT°*`',nPBÐ|˜`yK:ø²ƒ"Ô¶m[9xð º÷ܹsê×ü·à›I/ V>,¹B °!ö–ž dÂúvÓM7¥»Ö*üª„@Y@ÿ‘ú [ýúõ¥GJi€µ­Ú}PR¡lÀRˆzð­mð‡2‘3gÎtV–tÓHf®u·Çu˜HP~`I…â.P^ÁÁ_!x d â?ž,k>bG”‹ö,`Éó% sñúë¯+ßE„wçºP~Ĉiþ¾ùæ\RÏž+žcXÆ0'x^®¹æšPßÀC³¾â¹G[H/„?\›2eŠªÿ ïxÞñÜ@É5jTèZ¬ZÂbâu=<³øœbX =“€Húo#‹©à‹ÍèK0V³M›6U[âµ_ëXŠ„b¦ìºÁ |IÀ‹ÅŒ3BÅ`݀ŠÊ•+KÇŽ媫®R¿Î`ƒr¦IïÞ½¥ZµjêËùÁTŽñø¢|õÕW•’ƒ_uðïB"rXÃôþ]èÛwÜ¡¬ Z}F¯èüÄÊaòäɪïP,ñ¡5dÈ寤}©ÝsÈ凾B™jÖ¬™²Ü ílÙ²©¾ýôÓO‘nUçãiÖ(Pàâ•D¬TñÖ^.‘6À!#‚å §&˜s}ºDÚщg ¸þ/’Ø AƒÔæ,…CÑÛ¼ysx×Ôÿ3øšáËÏùóç îÓ¤_¿~ÊÖR(ñh7^¡%,^R,X†Ä „‘[ ‘@ xÂ' „%#X¸ |•/_^9QÃÊ…/5M`Ù‚e Ë€zÑ+ú|¢.MðÅ¢ÿ†·&¨×±\‰v Œé— QN Ê[< ü• @yÒ+©X*‚….šèÇ…®téÒ¡0 ác2ª'ž¶¡,êûeTOø9ŒG³\†_3ë}"mÀòˆå:#ÁR3¬P¦!XÎÖ/½b>ñì…K´g\ÃS*aY‚ká‚åÅwß}7ü´á{½Ê6Èpë,–½¡Ìᇠ–d±¼Á5‰T‡v=ü•–°p"|‰žXm‡©Ï“@` Øn K…4¬X>Á–O`Ñ ¾˜`€o”$üa§Ø+¯¼*¥$^Áýš`i&°l ,Mjmà ™ÑÒ¡v¿ÑëÒ¥KU8„Úµk‡–U±TªÕ‹P ³gÏŽÆ"‘1õCûBO¦m£úÜzJ–±4.8ß/øÒA°Dk¤&k×®5œ‡hϬnÚò¦V¬‰f$5gÎñü<òÈ#ª½U«V©w¡I6‚èùëë3ó>^ˆ†±ÀŒekü¿0C0·TâÌ éÿ:ðÜãÿ…H =Ï,G¢ëø²íÚµ«ZRÑ–uôCÂò–±üñžà˜~Ï=÷è‹Å}|ùå—«%,QBùúôÓOÕ½X2„£6|`Ã(–y°œMPË °~Á¹»55™4i’Úí 'q,¿b<ÚŽ8­ŒY¯Øh€MP`y³¢m|ác¹ÐJAýñ¶¦°> ㇟¬]x…ò«û%»/¿üR)MX‚†o¡QpÖXÏ9<³PtaiÃö|,‡ó·‚ѰaÃÔ“7ß|SùÂaœ86C0·f)tfô‡u¸“~ìàG~PH€ÒøÇÅÒ”~Ãj“ˆ`Yþ7É*Fñ´…°@@Á€B“Š .X¯`JÿåiXZ‚2¦9–J{P(àd.Í-•úbÝ‹]€X*€˜Ý}'o(XIDAT6"ÓC‘Á.Q«á& @Á§)âüã?*åDó3ºs¥Y[²E„Á®ÅY³f…n‰ö,Àª ߬Ò}õÂEÏ?üšïñüâyˆTÿ/èûƒ1!c–WÌQŠÿ À £Fü?XŽ’ àËOBüâ×uM‚KèÔ¥Y°B'ÿ:€C¼Þ)>üz2ïaíCL)»DSÀОÝmÛ5F£vnñ¶b 6FèÊ=¬išs»v-Ú³¥ÃHýzþZ]f¾âùE6 ØM¡}`e‡F!0&`»nM2îÏú@ŠFÖ¸ØÕ:„XvŽ„7 ø˜|!Hn c¶+að¯2ÚNoÜ=žõ2;æËmñ:æ›ÁRïÃgF}^­?¦׌BFàG‰ -ðÏ¥ D&`ûîHì £5,ò„øé üÚ°f¥`7£>>›•m±î¿ à‡‚SHÀˆW7oÞ\˜¨ÛˆÏ‘ÀßlWÂð¥Ì_ÐO€Ÿ0ÏH›c¥ðy²’näºa„_… `Ó ü&ˆB$€íJvhE ÞM^õ"D§7sGž>OFT¬?§ëðM ַʼ@é±êK‹¹ç…>³$àÛ•0ìC¼$Dó¦ø›|B¬Ž’ðh‡b/d(W®œ½²5×@ðcä*E@d @l¶+aèU~÷Ýw±{Çž%€lðýÓç'´b0HÆŽ¸svî´b^ª¬Áì)$ 'ðÅ_¨|©ˆÑH!ˆMÀ% û-Z”&Yv쮲„— »€Dø K±‡Xƒ¹>€­=-³7€rŽÆ:urs7Ù7pG”0DïÆ2Òܹs]ƒ1‡¢Ã#¢|ãÆÍ©0F-mÚ´‘wß}—Ö°œÌ¸Œ/Z°s è ,_¾\ ,¨>ÛõçyL$™€#JºÓ¹sg•Øø·ß~‹Ü;^ñ$)S¦¨/i«ÃShpÞ i£,X â«EÀ¡)ÀœBzÎÊDÝz"<&ØSÂæ¥aÆ*ñuìn²„W`k:ò(¶jÕÊÖ.ßzë­òÁȯ¿þjk»Aj lÁø–[n Ò°9Ö8¬[·N¹—\uÕUq”f €cJ:ß'NÈ„ ´þðÕÃvìØ!°‚!a·Ý š±ÄÝ¥K9r¤ ¹4Å\ΊÄå` ÖРLOƒÇ$?G•0¤›ɇ~X¾þúkyþùç)Q(Þ ðÙgŸÉرcåý÷ßwÍ®¨o¼Q*Uª$H¶ýã?z¤ { v÷ÝwŸÀß®I“&.ì!»ä4$êÆs‚<‘ Ä üãâ–óÿ&~ÛßwœjÒLÈša·Ï ™ýg]xã7» ñyM!Hœ€«”0­ûÈK‡]XX iݺµÔ­[ו_òZƒòzþüyÁ.(ÄwÛ³gtèÐÁ–€¬©ð=sæŒ ¹lÙ2©U«–`YÍêTJ©ô×É{·nݪÂ|àG|¿0¿Y³f5½KTÂLGêH…PÖï¼óNyá…TØG:ÁFIÀã\©„iLáì½dÉ•±‰Ê”)£¬0#yp† T€N¤ÇùÏþ£|ðŠ÷š/žc´Ü«I¤ûŒ®ã\øýZ9í5Öu”Ó·Ïûð:õ÷G:Ö׫¿_+WíV.X'/\¸ PŒ÷îÝ«æ_ÐPhÀß+‚/ „Ï@´w(÷¥J•RðœäÌ™34 Œ]ÿ i,Â_qƒÆO»†súc¼×$Òyíºþ5RYýyíXëî×ÎEzEYíÿʃ Î!¤æ9]1¯_M«„J˜Udí­wÚ´iÊï²_¿~ö6ÌÖHÀG\­„iœñÅÝ7»wï–ßÿ]—ÛäñeÁ«þ‹Óè‹ åôçõÇZú/(ýuý1ÊB´/ºÿ½K[·vNÿjT‡þ:ŽÃËÄz­ú{õÇhG»O^;Æ«&HÆ E+Ož<*M øïy]ÏБ#GäèÑ£ÊÚ&šàYÒó0z²FµsZ]Ú«VŸö>Úk¤²úºµ2Fç´kF¯P¼.\ŠxŸ/_>ee.Y²¤šçhý2ë•0³H:W>Š!a²Ä¹y`ËÞ'Ñ CÀ ,_ø£@ª T9â;¬›H13lØ0)^¼xª8y |þùçÊW X'ŸC6•ÀßfS«ee$@n%€Ý£åà««V­rk7Ù/—€exΜ9LQäÒùa·¼EÀ–0o!eoIÀý°Ù¥hÑ¢òâ‹/ ‚mB)ƒÅ™B±ÀŠZ¨P!ׄ¤‰Õ_^'7 %Ìͳþ‘€…à6|øpA¸‘1cÆ0>Ÿ…¬ýT5‚j#å…H uTÂRgÈHÀ³ã Amáo‰´SØC!HS§3cDêÏ“€×P óÚŒ±¿$`2|©êýÄ'ŒBF>þøciß¾½Ñ%ž#H‚}Â’€Æ[HÀà'‹R‡íܹ“~b~œäÆ„eëȵ×^›B-¼•H@O€–0= “@À ”(QBüqÙ¾}»ò;}útÀ‰pøø‚1Q·Fƒ¯$`*aæpd-$àÈ €ÄÝšŸRTQ‚MààÁƒ²aÃiÖ¬Y°Apô$`2*a&eu$àšŸXçÎU<1ú‰ùaV“òŶjÕJ²dÉ’|%¼“H ú„¥CÂ$@:uꨛcÇŽU~b]»vÕ.ñ5 êjÙ²e*¦\@†Ìa’€mh ³ 5"o@<1ÍOì¹çž“S§Nys ìuR>ýôS©_¿¾¥IÝ“êo"H97òÐQH€üO îß}÷]ùöÛoUl±dóN"±8£ó{ãy9{ö¬ÜqÇjIQò)$@æHY 3·;¬HÀí¾þúkyóÍ7¥_¿~‚åJŠ |öÙg²eË:t¨É‘‘€ƒèæ |6M^$€8QØ99zôh•ò¨G´lyq"cô‰º–($@Ö O˜5\Y+ øš@éÒ¥åé§Ÿ–­[·Ê¨Q£è'æÃÙ†ÅIÞË”)ãÃÑqH$àTÂÜ1ì xŽâ‰=üðÃÊ*†¸bŒ'æ¹)ŒÚá™3gJÇŽ£–áE ÔP Kï&@€ƒ}ïÞ½K’=ö˜0ž˜?‡µk× 6PT«VÍâ(HÀ¥èæÒ‰a·HÀK4?±gŸ}V¥<êÞ½;ýļ4a}5k–Üpà agù–HÀl´„™M”õ‘@@ h~bØMG?1ï>ÈŠDÝHèN!°–•0kù²v9rÈ#<¢ºï¿ÿ~ú‰ypö±#²}ûö´dzpîØeï æ½9cIÀÕà'vË-·H·nÝ”Ÿ‚»R¼A°72Q·7¦‹½ôú„ù`9p#¤ºAT}Äûù矅~bnœ¥´}š3gŽ´nÝZ2gΜöß‘ XB€–0K°²R €ŸüÃè'æþçáĉ‚Ø`­ZµrgÙCð *a>™HƒÜJ W®\iüÄöíÛçÖ®º_HÔÝ A&êôSÀÁÛM€J˜ÝÄÙ @¸ŸØÊ•+HÁ½CF¢î… *‡|÷ö’=#ÿ O˜ÿæ”#"×€ŸX‰%ä™gžQ~bpÞ‡‚Fq–À¢E‹¤zõêR°`Ag;ÂÖI `h Ø„s¸$à4R¥J)?±Í›7«ü“§NrºKn‰º±yýõךON æu¶I'?1ä,R¤ˆ žØÞ½{NĹá/[¶LÍCÉ’%ë[&€ Љç°IÀiÈM¨ÅC€Wú‰93#HQÄDÝΰg«$@Ÿ0>$@Ž'F?1û¦cÍš5’1cF©Zµª}²% ZÂB(x@$à-ž˜æ'væÌ§º¨vgÏž-:u Ô˜9Xp*anš ö…L@ï'öÀÐOÌâgaÛ¶mrðàA&궘3«'h¨„E£Ãk$@¶Ðüĺví*>ú¨|÷Ýw¶¶¤Æ¨»C‡ ¤IçX]G€>a®›vˆH ^½zjÇÞ³Ï>+;vìPÉÀO̼çbÿþý²iÓ&¹óÎ;Í«”5‘ $Làÿ½( ßÅH€HÀ'Ož”çž{N²dÉ"C‡•lÙ²ÙЪÿ›˜8q¢äË—O:wîìÿÁr„$àb\Žtñä°k$tz?±ûî»~b&<HÔ½|ùriݺµ µ±  TP K…ï%°œýÄ’GTÂÜ7'ì €Eào‡},ý :TY½úõ맬dðÁjÑ¢…Ìž=[²dÉ’RvîÜ©r5nÚ´IZ·n­”"»ÂA`É·!C†ÈÿûÿOý•.]:¥ñðf kP ³†+k%p)ÍOlóæÍR°`AyòÉ'UL-tÎïü:`À€¤zÿ믿ʛo¾©¢÷wèÐAš7o.™3gNª®To‚R +¬{h{Ûm· ³¦J•÷“€¹¨„™Ë“µ‘ x„,bp\ß³gOšW¬XQæÍ›'¥J•Js>Ú›sçÎɬY³Ô}ˆSß² 2D»E]ÃÒ!”A8çãïᄯ³gϪ2°ÊÁ_ ÎúXÒ„ÿþ®¸âЏb}!uÑ‚ äÃ?”6mÚHÇŽS ca*a›p—H@»o¸áÃäÖHéÓ«W/µ«DZ¾fPæ ´!Xl´PˆV­Z%+W®8Õg̘Qùˆ!Ò?«âÅ‹«¥R(]Ú’(”1(eØ …Êڔ؅ ”Ã}:uÔ†ƒhŠÒMž] $W]uUIJI1þ|Y¾|¹R~P¶R¥J)/bù93—-[¦–@ëÕ«'­Zµ2 Y¡unÍš5òòË/«ÌðW£ 8G€J˜sìÙ2 €n¼ñFùè£"&·ÖºtõÕW«e¼¼yój§B¯ð·zñÅåðáÃr÷Ýw+ß²ÐEÝ"öϘ1Cí¼¼îºë”ƒ~4K™îÖ„èùsæÌ‘råÊ)K^äСC‚`®#|׬ËaÔ.Ï‘ ¤%᱋’öß‘ € ú<”#vKF(XfÍš¥)Ÿ-8óÃZ†ˆô9sæLso`m{õÕW•¥ ɲ,ð5‹7Xº ã8ºŒ~_X¾D~È-[¶(ß±ðvá_†P°ÌÁ— Ë™Nm ˆch,B¾%@K˜o§–#ˆD¾Y?üðƒÚ9ˆð³Bh‡pŸ¬f5kÖT—pvB±Bø#%êã?V¡)°ì©E¾7*kå9ìEß±dŠ8h°ÄÉÔ©SÉΟxâ åfT†çH€¬!@%Ì®¬•HÀ#àøgyøv!¤¬Â’¥ ÂL@±ÂÈ{ï½WàwuóÍ7k—C¯H–ý /¨÷ˆ=fW\°P"@¹œ8q¢ºŠØh¹råJWrÚ´iòÚk¯ÉܹsUžÊtx‚HÀTÂ,ÁÊJI€¼HI¿±D‡D×+V¬P»±CV"XËM¿[·n醆 ¬ðkܸ±tïÞ=Ýu7œ@ £/¿üR©Ex‹p9r¤@‘|ôÑG©ˆ…Ãá{°ˆ•0‹À²Z o@* 䜄o,dÇWNøá£úî»ïd„ J¹A.H7 Âb œÆí·ß.µjÕJ×Õ×_]Å*{ðÁãŠs–®ž Hˆ•°„p±0 @ÐÀg ñ¹î¿ÿþtC_·nôéÓG%ʾì²ËÒ]wã Ä {ê©§T¿á.Ï>û¬Šy¦Ï¯^†ïI€Ì!ðOsªa-$@$à?pXÇò$ò0†Ë×_­‚Ïœ9S¼¢€a ¥/æ‘|ä‘GäÚk¯Uùáã8p Z¶\½zuø%¾'0™•0“²: Àräøñãå®»îR)ƒô£‚ ÑçaQB”{¯I±bÅT¶ŒcÑ ÂW ¢>Bl€…HÀ:T¬cËšI€`HÕ`D!0•0óX²& øé§Ÿ$sæÌÊê£ÆçŸ.çàÅx`úqÄsŒ1b¬³^` 0¢ ˜G€J˜y,Y €‡ ,Y²D5j”f°üÌž=Û0iwš‚>zÉê6`D!0•0óX²& €Óù7ß|# 4H3$¼Î;· áæ‚ß \Ež«BbÔ©S']ý‰E‹ÉöíÛåöÛoןNwüä“OJóæÍ%V}énŒp~a`ú]£TÂ"ãiH‚-aI@ã-$@þ!°ÿþtÑð³DGú(#}ºB ž0R¸UÌ($@© %,u†¬HÀÃ~ûí7É•+Wš?~\ *”æ\2o‹V/#yã7ÒþóÏ?åäÉ“rÉ%—„®õêÕKð§—ßÿ]PAUäСCR @ùÇ?þat9îs`z+0£ ¤N€–°Ô² €¥*\ ;uê”ZгrXˆ:uêTµÔˆ¨üãÆ“‚ Jþüù¥~ýú!Eç¹çž“.]º¨®@!jß¾½”/_^)Y-Z´PË…Z?W¬X!eË–Uá% .,xŸŠ`9,ô‚¾B ¤ ¤N€JXê Y €‡ œ;wN2fL»(€%C3âƒ-X°@FŒ‘æO³,A‘AÛX¿–-[&»wïVK˜Û¶m“Y³f©kE2qâDÉž=»rŒÇ’éþó™2eŠº†>ûì3ùðÃå×_U‘þGº–Ìh˧Úý`¥õ[;ÇW ä¤ýäI®ÞE$@ž%E&S¦LiúÅÊNª®ð4?áQèµ6žyæÉ‘#‡\}õÕR¯^=A*¥pAˆˆå˗˼yó¤qãÆ2þ|A’qMúõë'5kÖTo;uꤔ?íZ2¯` ¬ÀŒB$:*a©3d $@&Å&\1Â2¬S©JïÞ½#ú„…×­÷AƒÊÈÚ4dÈ9xð ôïß_9õ7mÚTÆ/'#½&¨#\Ò®ÅûŠ¥Èð¥Zô+C† ñVÁr$@Qp92 ^"ð?Ì™3+'wýH–áô×­8kÔBU<òÈ#*XêªU«T¿‡*šª#~¨¢¿Œ–e±! Ür~ß“ ÄG€JX|œXŠHÀ§°¾ÛÏ +’¸àã…x`.\P¹.kÔ¨‘f9Òì6aõ ½œ8q"uLÇ$@ñàrdü¬X’HÀ‡æ!\ ÃE,û¹M† &-[¶”7ß|S펄‰c« òåË—¦zl(ÀI @êþqÑ©óo¯ÎÔëc $@$à)Ó¦MSñ´ºvíê7¬=÷Üs¼þúë¡sn9ÀNI8í#§Z)}ûö•1cƤ‰G†Ý—pÌïÞ½»•M³n.Gbš9H HŒ¢ÂÃ:g}-4D¤{8ëv@Z­€aì`ÖŒlNpc›$àFTÂÜ8+ì €mŒ”04Ž; XÛÖ1‡ÂØÁ \¨„…á{Hž•°äÙñN €E ñ¼°ëO/•+W–uëÖéOêc½€X•(QBšÇ$@I –$8ÞF$àQQ²dÉtÁQ«T©"6lðÇ “Æ®„Á ˜QH€R'@%,u†¬HÀ㌮Ë/¿\öïßÈ<‰Ø‰±W¨P!ÍÌB1+ €9¨„™Ã‘µ x˜,>7nL3D…¯U«–,Y²$Íù ¼ùÿíkˆM]ÇŸWîBr¿~q‰‘[$Ê%r 1Í—ˆð!å ù€¹%ñÁ%QL‘KŒ¢”;_ˆ0îær¿¼ïû_utöÙg˜3öž™½ÏoÕiÎ^{µöó;§éß³žõ<²Y¶§fÆ#DX6ü°±¼ ÂÊ‹4ë@•–@§N\úââbÏ380+EØ… \ðdbSTTdbEƒ‚!€ †#³@& ŠfK|$7 ÕO|øðarw¬ßëT¤ÒSäääxì,,,´¾}ûú¼cžA\@@„e„‹Á€@\ 0À'ÂT‹177×”Ð5[ÚþýûÍ©u(µE)Ï Ž",8–ÌD˜@ûöí]Æû÷ï{¬4h=xðÀ=zäéã…l”­²9¹‰‰Š«ˆ Ž",8–ÌDœ€¼^ò%·ªU«Z^^žíÛ·/¹;–ïe£l•ÍÉ-áKîã= ð÷aÏ ˜Ж¤‚ÏScÀ†n L¿téRL,õ›!Ûd£lMnb!&bCƒ‚%€ –'³A& ý1cÆXAAÇ ÅGÍœ9ÓvïÞm_¾|ñ܋ÅlÚ³g³15L,Ä$5]EìÆT4DXE¬T*C‡uñ_ׯ_÷<—â¡”;kóæÍžþ8\Ȧ^½zùb¾Ä@qbbBƒ‚'€ ž)3B& x¨éÓ§ÛŽ;ìÛ·oKòóóíåË—vòäIO”/dË«W¯lòäÉ3d»ˆEjŒ˜g €@™ ÂÊŒŽBq%Ð¥KkÛ¶­9rÄc¢¶äæÍ›g‡²ÔS”ž¹ ´¹sçú„–l± Aá@„…ÕY!ˆ˜2eŠóx©hurkÞ¼¹b+W®´›7o&ߊÔ{%e]µj•³E6%7Ù,™Ð ð ÂÂcËÌ€@„ 4hÐÀfÏžm6l°÷ïß{,Q&}yÄGÅüa`‹-²3fø2ãËVÙ6iÒ$'d|ƒ*°Cÿæ•ìòåË6þ|k×®ïit_^²%K–XõêÕ}÷适'€ ž)3B1$ „¦cÇŽu¯Ôt2÷ãǶqãFûôé“‹µjÙ²e¥ ðôéSçùªU«–Í™3Çj×®í{.yÆnܸáõëÔ©ã»O DX8\™ˆ! ¬¥K—ZÇŽmêÔ©i-ԩ¸"Ø&Lð¥~Hû¡:¿ÿîê`ž;wÎ ÇÔrD‰%·mÛfW¯^5m·V©B„J‚ !PaåA™5 Ø[½zµ5nÜØy¼ªU«æ³M' UâH),FeÆ ³5jøÆ…Ñ!Ý©S§ìرc.Ç—¼võêÕó-¥d¬#ØÂ… Mž2 P¾aåË›Õ øñã‡éá“'OlÁ‚–šg+aâãÇ]Ê[·nÙˆ#¬_¿~Ö´iÓÄí@ÿ*“ÿÅ‹íĉN|åååY›6mÒ®ñüùs[»v­µnÝÚ, .dZLtB tˆ°Ð³ WgÏžµ½{÷:˜‚òKj=òNI$5kÖÌú÷ïïòsµjÕª¤”ª¿¨¨ÈîÞ½k………öâÅ 'òäu+IjRç+lâĉ6xðàR­Ã @ ˆ°p¸2+ %ä [¿~½Ûžœ6mš5iÒ¤DËuJQE±¯\¹bòŽ}þüÙy­$ÌZ´hae œ×Ö`Íš5Ý<£-PþKt={öÌ .}^cTVH…Å»wïþÛS™ª¹sçN{ýúµK4+/ ¨Xˆ°ŠåÏê€@ (þøñãvøða=z´‹K+–jjqq±K !a¥—|p¢KÂKM‚L/Z”‡KbM/hذaꔾëDì×Ñ£G-77×FŽYa‡|G²œ",˘G@¢j×®]n‹Pù:‘XQïq:©©àûœœËÏÏ/•h Ž3A"€û!îCÈ€rs¸,úC† q1`ÿUÚGЖ¥bÄNŸ>m=zô0èW–œe¥µqȈ°lù¦±(wŠ¿:sæŒ?Þ¥‰P ¼êQþ.p¾,©mL¥ÃÐAwïÞ¹ÚZëwñieY‡Ï@Á@„˓٠¤%pçÎç¡R@½bÈT¼sçοâ¼êׯŸös©oß¾ý?¦9oß¾íb¼ ¯S—š“Dƒ",ßO Ĉ€N*J<Ý»wÏ´u© |ÐËC¦|½Ùëþüé‚õ°/—þÁù:tpbWŒ~˜’UaYõuc, PY Hd½yóÆ”m_i)$ÊÔ$º”Š¢nݺ֨Q#'Ð*« < DXf¼ @€!@µÖ@02  @ÈŒ",3^Œ† @@„‚‘I @€@fþ¨Ó?ÅçÝ''IEND®B`‚asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/insituparsing.png0000644000000000000000000011064115031566105025472 0ustar rootroot‰PNG  IHDRŠqôɉËsRGB®Îé@IDATxìœTUÆ_º»wéî)é’’R$‘’DZi%¥SDB)¥CJéî…¥Yb¿û¾;Î.3;wf§çy¿Ù¹qòîÎ<󞊮™ÐH€H€H€H€H ˜‘ÎyJ$@$@$@$@Š…"    ‹(-báE     E>$@$@$@$@ P(ZÄ‹$@$@$@$@±­!hÛ¶­„……©Û &”Ê•+K«V­¬W×7mÚ$S¦L‘E‹Iܸq£ kôæ?ü 6lPÁcĈ!eË–•æÍ›Kš4iŒ&a1Ü'Ÿ|"={ö”téÒY¼Ï‹$@$@$@$è¬ Å%K–ȯ¿þ*‰%’k×®I»ví$~üøòÖ[oYeñ…Wœ8q¬†±÷ÆÞ½{%eÊ”J>}úT,X ¿üò‹¬]»ÖÞ¤"„/^¼¸$H Â5ž üGÀªPD’%KJ’$ITèúõëË™3gÔñÍ›7eìØ±J@B8âÞ?þ(§NRâ²nݺráÂ=z´`™ÆöíÛËk¯½&z£F’%JÈ¿ÿþ+}ô‘,[¶L~þùgÉœ9³ôîÝ[‰B•‰ÙŸìÙ³K… ÔÄM›6­<|øPàéœ1c†lÞ¼Yæý÷ß—Œ3ÊŠ+”üí·ß¤k×®rîÜ9™7ožäÌ™SÞ{ï=åDùPžC‡É?ÿü#/^”¿þúK6l(M›6UymݺUyGk×®-Ç—>}ú˜•Ї$@$@$@$àߢ£8}útùúë¯eàÀ²mÛ6yûí·&Mš(A†.àÈÊ•+U—pòäÉ•ç/vìØÒ¨Q#)\¸° ,ÄDسgÏd̘1‚îdGtUñÅÒ±cGyþü¹Ô¨QÃ"í;wî(!wòäIùꫯ¤X±bJ$BÈÁë‰2¤NZúöí«âoß¾]ºté"AAA+V,éÖ­›¥9räjÕª©0sçΤ ñÛ©S'É!ƒò–Bl†„„ÈüùóeüøñÒ²eKY¼x± >ÜbÙx‘H€H€H€ü•@”BÞ@¼ÐEûâÅ Y¿~½\ºtIyÑu›4iR%áM„'á ( GŽQ ޼ZµjÉ!CT—1 "Ù³g+a‰±Œ 4˜1cJ½zõäúõëÊ+6¼lèþƸI7„èÔ©SåÊ•+JÜÁ;¨ÂÃc™8qb]ÕEŠteG¶7ÞxCÞyç%nQ¯'NÈO?ý¤¼ŸðdŽ7N•;r<ž“ €?ˆ²ëÞ5½ëÝÐü±òÒé¢Q1hn‡–¬Y³š.A@BÂR¤H¡ÄŽi=xð§‚ 4–Æ BpöêÕK…1ÿá %ººÑumn™2eR§ðr¢kÄ-ZHpp°êš6›,Y2Ó)&áÀó©Ä LxÁøL (=Š:ˆG ºsÑu‹ÙÏð2¢;ݱ¸¦ÏŽÖã ]Տް«W¯–:uêè·Mïð&*TH¥Ó¿å‰L•*•é¾­ta1BŇ×Ð’¡Ëc QVˆ?x;oܸ!(fSG¶¼yó**®oܸQÀ€F$@$@$@D Jb¾|ùT·0&} Kù»ï¾“xñâ)ïÆÂÛ1ˆ1Šæ†ñ‚èú-Uª”`¼"¼q‹ÙZ·n-:tU«V ÆB,"}£†îbx9§M›¦<…?VcÍã£{º_¿~JôaòKÍš5 -­ƒñ‰˜¼‚´Ñ­N¢9U“ šÇ/Ü‘ŠB ž={VrçÎm5:¼pèrÎ’%‹Õ0¸Èè&¶×îÞ½«º¯ùÁ;hIÔ¡¸Žq•FlÏž=’-[6U&ŒlÖ¬™ìرÃHT†!   ¿ ¥G1ªb,_T"q1ÞЖHD8}_sÀ oŒqD·;¼‹yûömµäŽèrïÞ=Ód [ááØÅÚXàÜQÃ$ ˆJ0[Jûþýû¦ F–î[»fOý°üÑ“'OÔ²FÖÒÓ¯#,<ÖFët1sÞÑ…Þ]]{ÊçHYìyvìi½=ðîè³ežŽÝ•¿Ñgÿ/(“¥^ˆÈe7?G›¢÷ÂÈTƒeºŒ>Ÿxð9`iì´yplïób”‹#iëe³·Lz<{ʦÇÁdHô$Ùû¹çÿ Fž<[(Ÿ=éP/}l¿ÑxŽðÆ3‰aax1{ÚÆž°æy;RÄ·'ÂÂ1…Iµ4; ë™fŒÀåË—Ã5¡h,°êï¿ÿ6Vûp×–å1ÞR@­>\ëÆ·t+Êkö”Ó0Á–az,ü]§œi˜Ø]¬°ëÕ×_eÒ˜Ð&î0LÙ´i“Ú!ËÈÿ¯^&GâíÛ·O°­¬ù “˜6ŽZ¦OŸ®6Y0ÒŽHeÄ*¾n®z&͹lÙ²E´ñçæ—lckÞï¿ÿ^´ñ¸6Ã"ÂwîÜY´±ˆ†Â3mжÙ …¹{÷îms†3fLcg,.î±+ëwüøqµ&'Ä¢6¾Öf›`¿îÈë^j“8ÔŽA6#G#¶•´õƒÉCDá9p…a·$ˆdWDÉÒ¥KMYLš4Ið‚`‚ýú믢 7Ý÷ôѶ‰\Î]»vªžKü€p°eüñ‡š/NgfaC¼c}Y|aFe˜‰ÿüo¹Úºwï®ì¹sçÔî^F?ÿ‰‡ÏX´µþúôÓOeíÚµ6«ˆÿÇòåËËÁƒeÁ‚‚ÆŒVǰ´ó˜‘¸ÞÆUÏ$êÑÝÚš6mjèG—ÎeÉ’%R­Z5Ñ&©µŒÍ˜êa"¿c“*Uª¨ 3"ßã¹cŒÍw,퀈…/KL¹/Q¢„ÍúbÍG,,®¿ÛŠ€z ,Æ| ¶!ܺu«4jÔHÞzë-[I¨ûØçú·ß~S|øG5²ìÂ;w”GË(”)SF•¹B… Qæ§×K2ðÿoBÐàâ&*ÓÓÔߣ ëŒ{ø²‡èw¢lÙ²jMM,Áã ƒÀ…÷B¤}ûö‚]‘¢2|¸®[·ÎО3mV£òŠÀóÒ°aCõU¸‡5FñEƒG|Š)¢žÑÒ¥K«/ìždÄà†×Ïêˆå¨lʬÿäÊ•Kíùn+ŽÑû`¶òÄ2'Î6ý9 rjÒh{¬«§o+q°÷±cÇÚ ª>çà16l˜ ‹¹R¦L)¯¿þz”q±¡¾ð!± ~<¬Y³FÞ{ï=—ÄkÓ¦àƒwâ´oß¾Qæ…›øa/½úìµµïĉ•Ág>£m¶„]´h‘Z* h|¾Ú2{Ÿuˆ^´+>¿;uꤞc[yèÏŒÑg>üpÇ3dË–-[&³gÏ6ýˆ´^¿¶Àÿb±bÅ=%¶¬I“&j{_[áxßÏ|ó+›O„‚ÍèþÔø„À×xÑ¢EmÖÝ ø'ÇþIðk÷Ô©SÒ±cGi×®!Ï~a¯kìÍMtK1ˆB”7þü*¿;wÚŒfoý ~)âÃÌ–Õ®][­gÙ¥KCk1"= Ï>ûÌôÂV‘F {ƒãÃùAdù¢1š¶½áðÌ ýñá‡/W#Ýhx>°ºÓŸ³ 2¨ï¿ÿ¾h˹، Á  ï¼7سV­Zêƒ^Ext!&mD&ºŠ *ƒƒƒÕ#â ‹â#>Ö:u–á _øðAü}n Ò'NlhýÏ>úH­­èŠç ib£ì&eËÐ>øáiÄ ŠÅsæÌ1%‰öÕ–B1[;Àÿ>Gô5û°5,~€Ù2Gãééâ„`Äö±zÞú=Kï=zôP"ŸÃø<³%‘NݺuÕº|xþmþW ~ ®7n,ØÆÖÏ:¶Æ­^½ºúÆç‡®½Ï$ÖýÅ®eF¬E‹êÇ‡Šžž7üÈÐÿ·>7ˆö6Òó¤çÅ÷¨ У5Ÿ(ïâ!† À—œïo¼ì1xhða‚îLìY0,D^|Iã~T†t¥ û¬[·n†¶IÄ%ÒoÞ¼¹JÚèxJGê!gÄ ,¨‚áW¾QƒçÔœ7å5ò¡ŒôáMÂ~ß0|¨ÃÓà‰Ýy0Ö NËO/ºÅð ;*מx£|Ù½ñÆJ¨!Í)S¦¨.I[žts–+WN BüêÇì‹‘ ¯$DŸ‘öÂ|±Õ«WOU Ï+„'¾€mž KûÈÛŠÕ}ömÛª/r„›9s¦á/ùÄfPoeüˆÃÄ üàG¼3 žPüÿàócáÅ42ŒÃÞ2àÇ&GºÒðC=# §‡=Ë9ás)a„®,^भy)h h¿ž^ÙëY{õ¿pì·ÙìÙóRó¹t¯gm‚Õýc#—Só„k¿âÂQ7˜6æ,\ûe¹zvíéiÏÞªÚØ:¯Ùëûîj_¯Ô"s³H»hé¹±VóJXÝëüΞ=k)šzö´YŽïE¾¨yo½v¯gìo«uýE.²:·÷™Ð&BXL'òEMÐZÝëYó°Yü¿F(«æå‹œœÅsgìõ¬ý@×z^Iß{=£-4QüJYô Öþ/°·0þ,YTÏ~TñýÜŒêóHgµÝQÍ øJÀCó°E¸®yP-ÖWû!Žg †xÚÅñð\áù2jÖx£‘ÓBP£fôÿ éY+­¼¬ÅÃw«6ßjtKñð¹­‰ãWâp¯çWº;p$±kjŠq&˜h€_äXŽ@CèšÜOÕ|œ›­TÐõе!ñ+Ë,`À5–Š DC÷7ž+_+j”Ÿ‘ýFÓrF8£Ë„8#/[ih_êÊ;d+œ;îcf·#†1ÖxÙkŽÆ³7=<&PØk˜dÔ{O©þl!žùø`{ó*<Êc´LQ¥ãé{Òbd¹,½œ˜$„ìðbÓœC€BÑ ÑE ¡ˆ0|xa\fÿi?7T·§· `àÍ:€-è§‘ Ø&þË/¿¨¥­l‡f#üCÙ©©‹ÃYÄÚÅEpjò“ˆ±b4  ðtj8¿¥8™ÅùL™" øzíhF,€¥\ŒÎjÄLN£Ëª`†Ò6ÞR±³5íMÞršçkO<,ï‚匔 3±´…‘°(–FYŒ¶‹yplO=Ìãg´|èæGÝÖ[/ ž£íŽv0VOïö¶‰y\ócwåo”#ž3ðÃXc{L_CmfËÐþøßD>F a±žŸ‘2éõ4º¼‘Ñgå´'¬y½‰gß‘ÏM{>Ìë†ÿ¹ùuKÇø¼C>öIÒŸ-KiZºæoý¹G\#f´ÎHË‘ò¸+žÑÿA#L)L íÔö'] ‰¢®@…}Ji$@þGkïa ©Å‹‹=‹û Öˆü—¶Ü5úÃÊ)ØW3zíà…‡ËèÚav$Ë $@^@‹C,bV/ÿϽ AX ¯ À1Š^Ñ , x Eïk–ˆH€H€H€¼‚…¢W4 A$@$@$@ÞG€BÑûÚ„%"   ¯ @¡èÍÀB €÷ Pô¾6a‰H€H€H€HÀ+P(zE3°$@$@$@$à}(½¯MX"   ð Š^Ñ , x Eïk–ˆH€H€H€¼‚·ðóŠf`!H€¼•ÀçŸ.7oÞ4/iÒ¤Ò¨Q#)V¬˜éš»¾ÿþ{I˜0¡´lÙÒá,7lØ §N’N:9”ƪU«äùóç’(Q"¹{÷®4iÒÄ¡t‰HÀ7УèíÄR’ xˆÀ¬Y³äСC;vlõ:wîœT­ZUÞÿ}·—" B/:võêUµ§5ÒØ¹s§dÏžÝpr÷ïß—~ýúI¥J•äõ×_—¡C‡JHHˆáø H$à{(}¯ÍXb 7hР|ñÅê5{öl=z´ÌŸ?_BCC#”äÖ­[ášù‰yxˆ.ósópOž<‘˜_Šòi!Nd{ñâ…@š[«V­T=píéÓ§‚2µI“&IõêÕ%EŠ’ AåM9r¤Ñè G$àƒ(}°ÑXd Ï(W®œ<|øÐ$ÂÖ­['yóæ•úHîܹ#õë×—\¹rIêÔ©•ðº}û¶ ®\t+'K–L¥S³fM¹~ýº)-óƒqãÆIÓ¦Må­·Þ’´iÓJ’$IdðàÁ¦ Ç—lÙ²©2ËŸþ©î?^Å9räˆÔ¨QCuëÝÈèN_°`)™3g*ï¡~ç7ÖO¥^½z‚îðgÏž™®ñ€HÀ¿P(úW{²6$@. €1Šׇׯåã?Vc! a aÆÉ7äÀ2cÆ Ù¿¿º&&L>ø@ÆŒ#Ó§OWã /_¾,xÁë/% BòÊ•+rôèQÕ¥›!Cyûí·Õ½È Ζ.]ªD'<ŠŽ#FŒG©rNœ8Qu™£ìÝ»wW]ÆHC÷V,XPÖ¯_/s ï%ÞQVŒ?Ô Ç¸C§OŸVW¿Ÿ;wn%|wìØ¡_â; €Ÿ Pô³euH€œO`ìØ±R¤Hõ‚¢ b¡/\³fÍ”Pü÷ß%^¼xrìØ1SAš7o.]ºt‘4iÒH̘1eûöí²fÍ5!ÞÈ?üP?~, ±!º…»uë&›6m²ÚE]ºtiiÓ¦JéÃ?º¿!þ J!!l‘Nt Ht7™’¸„˜…°¥‘ ø' EÿlWÖŠHÀ‰ !ñÂä­[·JñâÅU~+V¬¬Y³J™2ež¼X±bEȽpá¦sˆ?t/c2LÊ”)åÍ7ßTžÅ³gÏ*Ñ Á‡nl¼6l(è6Fwµ%ƒ Ô-Nœ8J0˜3gNå¥\²d‰ŠüW¯^­5ü®{áøñãD¢žHæÌ™ýœï$@þE€Bѿړµ!p3t14H0#ùÌ™3²|ùrå)´V t_c,áÅ‹eïÞ½ª«ÝÖºè[´h‘\¸pA½éBŒY²1bXº¬º¯1+y÷îÝríÚ5G³sçΪ[Úb„ÿ_„è5ïzFW³nð&¢Ìð šÛ¥K—”¨5¿Æc ÿ!@¡è?mÉš x€–ËÁ,`}¼âÏ?ÿ¬ÆòY›ýŒÓKˆ1†'Ï$»q7mÚ4¹wïžuûØ®];±&­Uwß¾}ÊS ï'º»ëÔ©óŠÀCܸqãª1ˆèö†a‚ͯ¿þªº­!!Zu+Uª”ê?þ¼~I#&êÐH€ü“ÜöÏve­H€lÀ²1˜L¢ºVaÿý·júus›~Íü3˜±lL¦L™”'±lÙ²ª[¹oß¾R¹reó ê¸gÏžj¶1fcÖ3fãöÃ?¨Å¼3f̨º¯1kyÞ¼yêž=j×®­–ðÁøAt;cV5–±WÐÜ0îÞÊôéÓ+f=ÔLfŒCD—7‡×†² {œðƒÇ3yòäªîêÿ øÚ/Yë‹~ù]uY! xI dÉ’Ï›-ÃâÒ›7o¶L0Æ¢ /D(„š%o &š`² –Ò(47tíâ<ŽðÔYŠoÞÚ1>Ú!êà-„ Œ*¬¥˜*U*•&Ñ`æµ¥înˆMÜ›˜ýq™ð.¾óÎ;RuÖ“’…b@6;+M$˜¼qòäI«0Š-*ýõ—Õû¼A$@þN€³žý½…Y? «Ú¶m+±c[žÓ‡ëXÌšF$@L€Å@n}ÖœÖ Ì‘#‡E ˜ü¥_0!…F$@J€Å@myÖ›H@²gÏ®Ö1Œ<# OcMCŠD>$$@N€B1П֟œ€¾Wrd ­[·Ž|‰ç$@$pØõpMÎ “ ˜ÀÂÛX`Ú|IYŒO¼~ýºšÙk–Ç$@$hèQ ´g}I€"À®$XTÝÍ0¬X«V-ŠÄ”xB$¨(µåYo wß}×tŒQZµje:ç 2v=rë³î$@Š@hh¨ÚwÛæÅ_°¥]„ I‡H€ž=Šÿ @²dɤvíÚ D£F(ùH Àÿ X^i–xH€ÜJàøñãÒ¡CµT‹[3ff&ð&°Ÿq=L×yà^Ø gæÌ™V×·toi˜ …"Ÿð7oÞ”7ß|S:wîì¥ Ì"@(.\¸Pí]¬Ol Lž­õäÉ“%$$„BѳÍÀÜIÀD€BÑ„‚$@LKâ˜Oj d¬; è8FQ'Áw    (#àà €N€BQ'Áw    (#àà €N€“Yt|'"pòäI™>}º©Ä˜ˆ‘'O©R¥ŠdÊ”ÉtÝ_NŸ>­–Pùì³Ï¢]Å9sæH‚ ¤iÓ¦ÑNKO`Ò¤IR®\9)Uª”~É¡÷5kÖÈæÍ›Mq1ûõ×_—êÕ«KܸqM×qðûï¿Ë™3g¤]»vÎHŽi ø zý¤!YÀ"péÒ%ùæ›o$<<\ >|¨„S™2eâÂl÷îÝR¨P!‹U¹~ýº,X°Àâ={/®^½:‚³7¾¥ðÿþû¯ÚÝ÷†*ýúõ³Ìæµ]»vÉÏ?ÿ¬ÚíüäÉ6l˜äÏŸ_?~l3¾=®]»&§N²' Ã’ z ‘YEÿ%b¾ÕÜàÁƒÕÂÝGŽ‘)R˜*Ž-é *S§Nmº¦@dâeéžÆÚûýû÷%Q¢D#F äÎ;’4iR±´aT÷kç¡ÌzZX××lÙÝ»wUݰ»Š3 u‹'ŽÄ‹/ÊdîùóçbžÿÔ©SMq°€7ø:jY²d‘#F˜¢_¾|YŠ-*+W®”fÍš™®£S¦LiâgºñÿlS¨—ûY߸qCÒ¥Kg Ö¢E Á+²EÅáÑ£GÊ9ÏI€ü‡=ŠþÓ–¬ È{ï½'÷îÝ“¥K—*/^TÝ”… –‚ ªãsçΩ{b}ûö•Œ3*Ï]åÊ•^üðCµ03ºÛQˆÔ?r6mÚ$™3gV»®DNÇüuÃZŠ­Zµ’ìÙ³K† äóÏ?7b:†ð…PƒhC½±`úíÛ·Õýš5kÊ¢E‹dôèÑ2cÆ åý„Ã<©R¥RžA=!tyÃ;lÔ‚‚‚Ôð‚³gϪ(6l%J¨ÊüÉ'Ÿ˜’¶„_~ù¥ÀÓ¬_G™ð,/^\µÉŽ;Tx,tzÃlqøõ×_%gΜŠsݺu¥K—.*ŽŠÌ?$@~E€BÑ¯š“• tZI'NœP(>øàõ…~áÂhÄ—{ÇŽÕ½Y³f)¯Ô¡C‡ÔØ´’%K*ማaaaÊK¦jàzúô©:…@[¿~½Ô«WO0V°lÙ²J B(]¹rE‰§ &¨°nB}6Û·oWyÃ&ÆbG”‚"]«+V¬$I’ºD᥌lð6ÂûxìØ1UÔqç7ÞåË—›¢,[¶L‰dx?£2Ô ùB`]½zU‰ÄqãÆ #^:܇@Ó ]¢–ƨá>¼Mæ–>}zÓi¬X±T·.„( ^>ÝC¯¼Šræ¡niҤѕ‡4#†2 ËW7t§Âs«Q£†z‡P† Cáe4bæå?Ä\¤ƒ}¹1ί{÷îJtUªTIàIE·=f)móøð²šwå›ßCÙ0ç»ï¾SåÔÕÜpM7ˆËo¿ýVy ¤~T 8Pêׯ¯1½[ã/"<׿ÝÙÝæiñ˜HÀ»Уè]íÁÒ@´lÛ¶MuA¼yXòD·Ã‡«Ãàà`å‰Cw¦n˜$ƒÑÅÎ!øÌMŸpb~ÍÒ1Ä&¨=zTu£›ø?þñãÇ›‚MËáÿi¨Ÿn¨ºÝaxð0ÂË<•ºÕÃ[{7ZpÅlfŒ;ܺu«â…ñQ™ž¶9[¤£ÙŒ*®¥{èbƘOŒ'Å&toGÕ½Žît ؼy³ê††·±G»Öõ²FÎÏêlnæÏ‘ùu“ ø> EßoCÖ € @Üá±±xñbÕ½ ñ¼G“ˆ¸ðêÁ $Ð5Œ®bŒ1„ˆÂ’(\æ BÄ]·nê¦Dúúä{QˇI(ļQ'è>µe{ð¶Y[bKŸ] ‘ˆîltk놮æU«V©—5O©Ö‘wˆ]Œ_D×6<¤ðÜZ|¨&ØÀ0™?Ýó þXêÈQO´¥Þõ‹ú¢ -•yüõ×_êÁøN>x^1¶ÒC›B”b&äîè‚§‘ ø' EÿlWÖ*@`æjÞ¼yÕŒWÌ®íÝ»·šØ€êÆ.ItMbL^û÷ïWÝ£¸°˜%‹I,H‚Þ%Æ2b¼f*c’Š¥®IÐÆt CÌa,œ.¦PŽnݺو)j&6ºÊ!vu¡e ÷þüóO%ˆ±5º?Û´ic ‚înLlÁÌeŒ©t¶&Ž ûÝÃð*êüÌó‚0ǬëÖ­[ Æ‚¢îˆ 6˜MŽûŽ&Ý Ð~èb†ðlÛ¶­ ;?²Ab)„%ºÊÁkèСv-qƒçã1ј±]µjU›ËE. ÏI€|ƒ@ íáËu*|£¼,% ø%tcÆ*ƽ9Ûà-D—oâĉ•8‰Ü¥ˆÅ«!*1™ÄÜ]•ú¸Fó{öcº+±Ô º½í1LºÀøIkA¯ù˜:=,&ÀËØ¡Cý’SßQ/LI›6m”õ‚WP½[kÂU½ì)(Æ›bDxa˜}Ž1œ‘Û÷ð‘YÚ(4·á¬¼Ó(?–éÁxRˆ_Ìj‡pÄR9Ñ5,Óƒg8î1º$ŸœCàåèsç¤ÅTH€¼D”µNP\ˆK†xΉH ÞOGÌ–˜‚`‰l芇÷ÙÝÎz~¨W±bÅôS«ïSæ¦/|m~-:ÇèÒ67xQ­„!¼Ž–ÐÁ8GxŠñ/&ffÃÓH#ð?Šþצ¬ <¬…ˆnéùóç+OjÀq"ü°€×oæÌ™jÝM %øñÇ#ìòâÄì˜ €‡ P(z¸˜= €ó `L$^4×@W3^4 ÿ'ÀÉ,þ߯¬! 8D€BÑ!lŒD$@$@$@þO€BÑÿÛ˜5$   ‡P(:„‘H€H€H€HÀÿ P(ú³†$@$@$@$à E‡°1 ø? EÿocÖH€H€H€"@¡è6F"   ÿ'@¡èÿmÌ’ €C(ÂÆH$@$@$@$àÿ(ý¿YC   pˆ…¢C؉H€H€H€üŸ…¢ÿ·1kH$@$@$@ Pt#‘ €ÿ Pôÿ6f I€H€H€HÀ!Šac$   ðŠþ߯¬! 8D ¶C±‰H€ÜLàìÙ³²g÷N9|`»\¿zY%Œ%!!¡’)8µ*IŒ"áá"x‡½x.1c¾<Á±n¸¦ŸÇЇ#Òÿ-ªsóxŽsDE|ý×õràøÊµI–,‰Ü½ÿT‚‚³H¡¢e¥Ìkå$cÆŒ¸M# ¯'@¡èõMÄ’@`8|ø°ü¼t®Ü 9+Uˤ“n̓$S†¼;v,Ÿóôés¹påŽì=¼U&ŒþQR¦Í)ÞzWòçÏï3u`AI€“…b`¶;kM^O $$DæÌúNn]: ­ÞÌ%Å ¾¡yëþï.ôúÒG,`œ8±${æTêÕ´NAÙsð‚Ì›>\‚³—’V­;h^Çd#ðŒH€¼„Ç(zIC°$@ÿ€ñ³ÁI¾t—eü€ÊR¢PFŸ‰ÿÕêåÄn颙eÒÀÊ’%é>è#9vìXä`<' ¯ @¡èÍÀB è šÆ~ÞGú´É)Mjð¨×O‡`lQ¿t;‹|ûÕÙ³g~‹ï$@$à5(½¦)X ;vÈØÏ>’©C«JžiHÜé¥Ï{¥V­šrúô逨3+I$à;(}§­XRðkG•%s'ʸ~•$(]`Ùƒ(Þ½¢›|5n€œ8q¯ۙ•#ð-оÕ^,- ø%{÷îÉwSÇH¯6$KÆN¯ã’_ÊâU,¦{3äô¶Bž={nñ¾».É$ÝÞÉ#ßj>|è®l™ DI€B1J<¼I$à æÍ”JÅJ¾\é\’Ýö}geÛÞ³Ó~üä©à¾¾¶¢Å@.»Z NA­X,•7–,^4ÏjÞ  w Pt'mæE$ð 3gÎÈÉ£Û´‰_¹çÈ…[·È[÷­F½zý®`]CÝ2fH.»Wö¸q#®v'ô‘&_èÁ"¼?|öJ÷„ÉýO"„sä¤UƒÂrxß¹té’#чH€œJ€BÑ©8™ €½–/[ -je‰öÚ.ߑכL•ìFI¶×GJùÆSäì…SqNŸ¿%Ej—,åGJÒ‚eò¬?Õ½3Z˜ä…É“'ÏÔùþ#¥`õ/$¨ôpIUtˆ úb­i÷tOw²\…G>¥ßœ$;÷Ÿ“á“~“oæíÙ?í“fšòtä ^¼ØòVõL²|Ù"G¢3 8•…¢Sq21 {`Qí3'Hù’Yí‰f1ì{}K®l©åö¡árçðg’;{y÷£…¦°«?&Ÿv­*¡Ú½/>­§u¯”CG/+¯áÝ{U8xë½÷ƒ¶,O!¹y`˜\ÓKæ/ß/ÓîR÷ñ¾lía9µõ¹±¨”ÑÖCì¦ ÇÁ=ªË­ÊJ›&%dÅŒ÷Ly:zP©Lv9vd§Ü½{×Ñ$H€œB€BÑ)™ €#öîÝ+¥ ¦pŠ7qÓö“òaërÚ¾Ë1Uz=ÛUPãõnè⃥Y½"?~-\yɪMšY·õßÅ^ñÛߦuKÔ¾¢ÚÇ9UŠDÒ²A1%pöO{¥mÓR’)(¹JgèG5¤G»×#¤áŒx‹äI&Xž€ãŒ<˜ !qPŽ‘ C$@N"pôÈ^©Y<úë%¢ûÛä+l*Y–à—³§¯Þ¸§®½^*›é çË ˜ñlnèž¾ÿð‰ªù¥ùe)˜'½:?{ñ¶äËù_y!$[5*!¬³NJL-;+:+I¦C$@v P´# 8‹ÀÅó§$뛢\š”‰Ô½\ÙÒ¨ôüsY½gÒ&«À.^ UïúŸ¿þ¾$UËçÒOÕ{ÚT‰%e²„r~ǧ¦a®ß¼/´É+°Ôš0Šöñbh 'H›&•„…=sbŠþ“ÔÃGa”Î*Äš ø$ EŸl6šüƒ@ê4éäâÕPÿ¨Œ“kqéê]IšBÑÉX™ €(íÆà$@Î#9[^9s!Äy úQJg/†Hælùü¨F¬ €/ PôÅVc™IÀO.RRö¡P´Ôœ;‡H‘¢%,Ýâ5 p E·¡fF$@‘ +VLþ9ûPnÝæ¤ s6W¯ß•ó×^HÁ‚Í/ó˜H€ÜN€BÑíÈ™! €N Nœ8òz庲zóIýß5«6”ÊUß”X±b‘ x”…¢Gñ3s ºuÈÆÝ!r3„^E< W4oâοHÍZuøp €Ç P(z¼ XlI“&•7›´“©óþ lZí±mß”¹¥Ió÷%Q¢DσH€_'V€HÀ P(úoÛ²f$àóÊ•+'%K–”7Ê„yË%^¬¤dþä’%8‰¤I™XâÅ-qâÄÔ–•yµªXj“d`8Ö ×ôsócÜ|3f ­ûûeÜÈ÷pŽäqáÌ ÙáÆZ> {&WoÜ“ó—ïËž¿o˳ÉäͤM·*ZÙã˜Gã1 x E¯kˆHÀœ@ܸq¥víÚêuöìY9|øì8qRnݼ*'Nœ’ŒÓ«à!!¡²qó©W»²$L˜@oŒóåè󱎸¦Ÿ[ºˆD¢æ÷ÍãáÎ/ß½w_Ö®ÿCjT-¯5L‚ råê É™#›$O‘N2g«(ïW+$™3gV÷ø‡H€|…¢/´ËH$ dÍšUðŠlOŸ>•Ê•+K¦ÌÙdìøï<²õʰW+ÃÑ—eݺu)Cd.<' èàd–èd| 1b„œ:uJ¾ýö[ 4t#Ϙ1C8 ãÇ÷8€H€œA€BÑ™ €ÇìܹS&Nœ(#GŽ”9rx¬È8_¾|2dÈ5j”Œ- 3' ' PtD&A$à÷ïß—N:IµjÕ¤]»vž)D¤\»ví*¯½öštìØQ?~é.OI€HÀ·P(úV{±´$@f>ùä •©S§š]õì!&À  üòåË2tèPφ¹“ @4 P(F £“ x†ÀÚµkeöìÙªÛ9]ºtž)„•\3eÊ$ãÆ“¯¿þZ¶lÙb%/“ €÷ Pôþ6b I€"¸uë–|øá‡Ò¢E iذa¤»ÞqúöÛoKýúõ¥sçÎÊëé¥b)H€HÀ>Šöñbh / н{wÁúŠðÚy³}õÕW‚esúöíëÍÅdÙH€HÀ* E«hxƒHÀS ¤&ƒXÊÁ‚²jÕ*™6mš¶°u2KA¼æZªT©dÊ”)²hÑ"Y¾|¹År½óÎ;2zôh‹÷x‘H€sÜ AÁøËnݺ)±ˆ:™fy›wE›ßã1 xŠ…¢§È3_ W`B–A8Á*V¬({÷î•O?ýÔçÚV0ûƒñ‡Ã‡—]»vI™2eÔ½žð0rB‹,’ x E¯h‚H»±œ>}Z@7,f /X°@–/_®f<û¡Ü¹sËš5kdæÌ™’:ujåaDý°°xdª?Õ›u!ð=о×f,1 ø%ìï o"DbÏž=U7s½zõü²®z¥š4i¢º£±4fH?yòDΜ9£ßæ; xœ@ÄA2/ @$à*Øo÷žrðÐN¹ví²$H[n‡„Jp¦4*Ktô†k¯—¾"/´ 1ÿßý‹cÝpM?G·)&fèÕ¹y<„Ç9b">Ž<|,ù f“¢ÅrÊçgdØÈ.rõÊ-I–,©Ü¿&ÁA™¤há²Z—mYɘ1£ž¥Ï¼Ûâ߬årèw¨EÜ@IDATà)™üÍ ­‹=®Ûùë­¨?ëOü}æAaAIÀËP(zYƒ°8$àl˜ ñÓ²yrûî)[)XÞy?»e,¡M‰¸Ë‰³óu,½7-F{úô¹\¾"÷ï’1_.“´©²K“ÆïHþüù-†÷¦‹¾Åß29_æo¹F¼J$`”…¢QR G>F $$DfÍ™.W®–F- H¡¢…MD|¬*Ú^ȱ$K¶4êU¿q19°ï¬|?g¤dÍX\Z¿Û^ó:&óº*‘¿×5 D$àŽQt£€·€kÈðޜ㖠][ Ëâ³"12kto+™M†Ž­-)ƒ.Ëàa½åرc‘ƒyôœü=ŠŸ™“ 8‘…¢a2)ðM#F,í»’º ‹ú@ŒÌ‚±ASÍ£Ø)¯Lùf¸Ú%rOœ“¿'¨3O W PtY¦K °cÇù|toù|B}É™;½Jàþ,óä’ÝKJ­Z5MË븿/s$ÿ—ËyŠ?ó%p> Eç3eŠ$àXƒoþ¢É2pD-IŸ!¹GÊà©L!ŠWoí'_N('NœðH1Èß³ü=ÒèÌ”€…b42«èÿîÝ»'_;NÚw-!3§òH…¿™¸^öï9㑼‘i™´nè"2uÚ8yøð¡[ËAþžåïÖÆff$`(¬ÁY]ÿ$0oþ,)Y.¹äÊ›Áe5d¹ î»Äjú'Ž_•›÷­ÞwÇ ˆÅEÈ¢ÅóÝ‘)ò‰ÂSüM Á § Pt:R&Hî%€<ŽØ¡Mì(æ´ŒÜ,wCEH×yú”*›Ã)¹ÎŸù§$HWœ£^/^„Ë’ù;¥×€zÒ¦cEiÖª¬Ìú±‹òb·Ž…³·ÉÔ™í¥lÅÜÊÛöL•ãÙ³ç²@»7sñràôX)Q&»|=~½ºwIÛaåƒÖ3dȨ·äèå Ò°i)YvœXrïnęЎd\©Z>ùçð%ùmõ!5ÖqõŠ¿dÏNçïè‘“ª¥?“5«ȃ{eé‚räày)®yi`ã >æetEúäoN˜Ç$@ž&àܾO׆ù“@€×Ö9ô5K“.©|1µ•ÌûáÔ{±ä-,s~ê*iÓ'sjUÐWòâÅ §¦91òLä¿swðÿ/7‘ ¸Š…¢«È2]pÚº‡¾hu¼\i˜t3¦k;MÈßz ºƒ¿õÜy‡HÀY\û)ê¬R2 ‹¬-Ac1p€]Wóquú¾ÜdîàïË|XvðоÒR,' X €‰%4˰ýàóçÏ-ßtÒUò·Òü­çÎ;$@Î"@¡è,’L‡H€H€H€üŒÇ(úYƒ²:EàâÅkj]ÃÀªµ±ÚæÎ—ÁåcÉßz[¸ƒ¿õÜy‡HÀY(E’é€d̘N¦Îq|ñkÙmY>׺廷[æÒüÈß:^wð·ž;ï 8‹»žE’é €Ÿ Pô³eu‹€¯.ÏâŽVŠ©-ÄåqÜAÚrîào9g^%p& EgÒdZ$@$@$@$àG(ý¨1Y ÿ¸b{½ÿRç‘-äo‹ï“€o Pôvb)I€H€H€HÀí(ÝŽœ’ ¸ƒwMqeëy¿u6¼C¾D€BÑ—Z‹e%HBïÜt…§:ì r7Ôµ|È_§ýê»;ø¿š+¯ 8›…¢³‰2=p#ÔiRJXØ37æè;Y=z&‚Ò»´Àäo¯;ø[ÏwH€œE€ n;‹$Ó!H›&½\¹t[²dKãöÜ1Yá‡i›åÇù;äÉã§R·QqéÚ»–ÄÇíe±”á•Ëw$Mêt–n9íš'ù[ªÄÓ§ÏeÎŒ­²eÃß’4YBiÙ¦¼”¯”ÇRP—_s—W‚ …"ðaY³ä‘óg¯xD(ì³Xf}»EôÙ­'ÿ]#{w–E+{xÑ‹çnI6+Í“ü#× íðnãÉòçæã‚nߘ±bȲŻe´ÖÒüÝr‘ƒ»üÜü]^ f@$ ìzæC@>L Hárø¯ën¯Áµ+¡šHÜl‰(¶lÛºñ¨ìÞqÒíå±”á½×¥H‘–n9íš§ø[ªÀƵGdë¦cJ$âþ‹çá*Ø ¾KžFw›;ø»»NÌ‘…b ¶:ëì7Š+&§ß“[®´ØÙ374‘ùªfºž>á~á¹$ׯ†ÊÕ‹aR°`ÁÈ·œzî)þ–*ñ÷¡ 'N¬WnÝ¿÷X Oxå† /¸‹¿ «À¤I€þO€B‘ ø08qâH¥ µdÓºcn«ÅÛä×åû•(Œœ)º?såuí’ÈyZ:ß°æ˜T­RObÅzU8Y ïè5Oð·VÖŒ™Sɳg/^¹+VL ½ýð•뮼à.þ®¬Ó&xI€B‘O ø8ºuÈέWåÖM×z>x"“Æ®‘× ”e‹vIƒ¦%5±ø<ìí[½Na)Q:û=p„nñƒ{ïHÍšuÜ’»»øÛª &eΚJb›yááÍž+­Ô©4Zk]Ðù®6wówu}˜> : Å@XŸ'4iRiÜ ­Ìùn§Kê‚åw~˜ö»¼Vp Lùr­tøð Ùù÷ùzf{;¹•”)ŸSŠ•Ì*ý‡6” :¹¤ F…Gsöw»¤ù[í%Q¢DF£E+œ«ù-f›¯ØÐWÞlRBR¦J¬‰ÆÔ2hDcÙ´{ŒšØR~þq”/íâíßsFêU#=ÞŸ%ªä•m‡‡Ë°1M½Z$.š³CŽ|&:vvýíMÀÙüíÍßHø¤ÉÈÐÑMå÷½C$8SJiZg‚txû[¹¬­Ãé ó$g”Ÿi X&@¡h™ ¯’€Ï@èè‘_ɪ%gdͪƒ•ã˺wœ¥Dbüqeݶòå×ïJpÆ”¥ç®HS¾\/‹g’O?ùÜm]Î‘ëæ þ‘ÓtÅyŽ\édîO]eþÏÝäŸÃ¥b±¡2mÒoÚDÇ—Ðñþ®`Å4I€„ë(ò! "/^<;fŠìÞò@~Z¸W[SïÕY°–êûäÉSùjÜ)_d°ìüó„|7¯£ü´¶—(œÉRp¯¹†µÎÞ%¡7’˪•ë$Y²d-›£ü=Qè*5 hÞÅÁÒ¹G5=t…Ô,?Röì­/›ö ’4i“Jƒªã¤w—¹†ÖåôVþQטwI€ì%ÀÉ,öcxpèNf±V$LYôã É•?T®žK²åHk ŠEº‡ö_*Kì”: ŠÉðqÍ$(8…é¾·œü÷ªlù픜ù÷‰´lÞQÊ”)ã­EU”¬ñ÷ÆB¯XºW†ô["Ï´\|Kšµ*ûJ1]ÍŸ“Y^AÎ $àQŠÅÏÌIà%W E¤&7n” ›VJìx¥`ÑTròÄ™©-y'NlmY›šˆÌÿJS`=}DóµpM?7?F‘ϱ¶"ö¶ta1 DíK¬…37Ì"Æ=, ¦u‹_¿vW._Õ¶+¼©í˜DªWm UªTÑÊÇ<šW[âœ9¹61(‰Ä‹[­{ˆúF6\#˜ùm\ÓÏÍ.ò¹#ü±“ËÔñëdɼjé£>ëI̘1ÝÆŸB-I#ï!@¡è=mÁ’0W Es¬ð0öë÷±ùh³Ð~L ¶×U#0#0gÎM$ö“   Y·n”-ûj·¢Yp»:$sg¿. ü(9sæ´;~ DÈš5«àå sÿ'OžÈèÑ£eâĉrãÆm™2eŠ+ŠÎ4I€¼˜'³xqã°h$à !!!ÒªU+éÚµ«´oß^›s¶HtF9™†÷À,î!C†È–-[äÁƒR®\9%Ÿ?w|)ï«%KD$ Ũèð ø8Í›7+Ïáž={dÕªUòùçŸkãââùx­X|w@—3ž¥þýû«g;§œüðCéÓ§4nÜX®\¹â×ufåH P(rë³î~G`íÚµR¡Båñùã?äÝwßõ»:²Bž'€e‰,ëׯ—Ó§OËk¯½&Ë–-ó|ÁX § Pt:R&Hî'€%fF%Íš5“:uê(g»¿-G kÀÒN5’¶mÛJ‡$444Ð0°¾$à×(ýºyY¹@ €Ù¨ðŽ7NÆ/Ó¦M“ ^®cõg=K Q¢Dj&ôÒ¥KÕ„—×_]0yŠF$à(ý£Y‹%pùòeÁ TL0X¹r¥òè( VÛÃjÔ¨¡&MÁ“]³fM%á馑 ø6 Eßn?–>€ 9rDmc‡¨Xçž x’@š4iÔXEŒ_>|¸4iÒDnÞÔ¶]¤‘ ø, EŸm:< üþûïÊk“#Gùí·ß$K–,Œƒu÷"Ø‚°gÏžj÷ŸÿýW­ã‰24 ß$@¡è›íÆR0t17mÚT ÅåË—Kòäɘ«î­J•*¥&º`F4Öóüì³Ï„;ºxkk±\$`…¢u6¼C^G`Þ¼yÒºukõÂ:‰qãÆõº2²@$ H–,™ZÇs„ òÕW_IÆ åÖ­[úm¾“ ø Eh$‘@`Μ9Ò¥Kùè£ÔìftñÑHÀ´k×N6lØ gΜQci÷íÛç ÅfI€4Š| HÀ@$víÚUúõë'C† ñ³ˆ$‘@‘"EdëÖ­‚]0+zÖ¬YðŒHÀ+ P(ze³°P$ð%K–˜Dâ§Ÿ~úß ‘€ÀV’?ýô“ôèÑCºwï®¶|òä‰Õ‚Å%À"@¡XíÍÚúuëÖIçÎÕ—*E¢5‹k‘@̘1eРA²páBY±b…`ýÅ .X Ë‹$@ž'@¡èù6` HÀ"Ý»w«I+-Z´Ï?ÿÜb^$_%P·n]µ“ËãÇÕþäÛ·o÷Õª°Ü$à×(ýºyY9_%pîÜ9@¬T©’Lž<ÙW«Ár“@”°‹Ë¦M›¤|ùòR¿~}Á¬~ €w Pô®ö`iH@îÞ½«ÖILŸ>½üðÃ+V,R!¿%€½¢!»uë¦fõ¯]»V^¼xá·õeÅHÀ×P(úZ‹±¼~OcCBB“X'Nì÷õeIK= :T¾ýö[Atß¾}åþýûC$à(½ XÐ Lœ8QÖ¬Y#³gÏ–Œ3ê—ùNA eË–Ò¾}{Á>æØ»œ“\¢ÙYI/'@¡èå ÄâÓ§O+¯Ê°aÃÔ˜­À©9kJÿÀ¾å3gÎTÛýaÀ]»výw“G$@n'#\3·çÊ I€"€Þ ê_´hQ„{Î:9{ö¬ìÞ³SÚ)×®]–‰bËíP ΔFe}^ða ï÷òBûhˆùÿÝ_p¬®éçè2Œê#Äü¾y<¤…s¤Šøú1®ëåÀñÕ+·$Y²¤rÿ^˜e’¢…ËJ™2e}ÒÛ þ;wï”ûwÊåk—$vüØz;TÒ¥FU5Ókþ²ÀEß}Çœ±9S4YÓhi˜· –¢Ù}óx*7ÜÔÂ#þË|ô6~yan] ‘¤ÿ°a’9cfy­XY)ûškùcòVõêÕÕÂܘеyófY¼x±Ô«WE¢‘ ¸™…¢›3;°D B… røða9xð `QbgÒýiÙ<¹}÷‚”­,…‹e’ Œ)$vlß™$óôés¹|1Dî¿ ;¶\’´©²K“ÆïHþüù‰Ê%iÿ¼çÉ…›ç$¸DdΟQR¤O!±|ˆÿsÈÕÛráï‹rqßeÉž!»¼Ó´•KøëBÞÄçÏŸ«uDáaüî»ï[ÒH€ÜK ¶{³cn$@‘ L™2E àÿý÷*1!fÖœéråúaiÔ¢€*ZØä¡Š\o?'–dÉ–F½ê7.&ö•ï猔¬‹KëwÛk^Çd^WðŸ>sº¹pH ÔÊ'Eò×öYþ±4þi2¥V¯b5‹ÈÙÃçdä´RCrŸ)‘ ›4CP ©\=§œ¿pBæÍ])Ù²ä–Ô©õ.ÜÈ1ÜþÃÆ •˜ÙÃåõwÊIò´þÅ?Eºä’«\ù÷ì Y¹h¥äΞÇiü±Ð|Ž9$88ØÔpUªT,…ÙÐ×®]“Úµ}Wt›*ÅðœÌâ# ÅbúG©Eµ!Û´iã´ ;vLFŒþXÚw+$uõcƒ¦šG±S^™òÍpÙ³gOä 9ÿ~Ã?–ÂÍ HÑêEüš‰ÚE%_ãÜ2\ûQâjþX6jéÒ¥j¢KÓ¦M;ºÐH€\O€BÑõŒ™ X$ЫW/¹råŠÌŸ?ßi‹jïØ±C>Ý[>ŸP_ræNo1_»˜'tè^RjÕª)˜9îIÿ>ÃzIýþµ%}¶tž,ŠÛòÊ™AJ½]\jº£Fdýúõj7—š5kJhh¨ÛêÉŒH P P(j˳Þ%°råJ™6mšZ`8sæÌN)ËÑ£Geþ¢É2pD-ÕÕì”D}$ˆâÕ[ûiÝíåĉ)5øOžý•ÔêYCu5{¤Ê¢¸ÿ¢>2p̧.ç‰_þù§œ:uJªV­*·nÝòP­™-  ÅÀhgÖÒ‹\½zU:tè mÛ¶U[õ9£h÷îÝ“¯¿'í»–Œ™S9#I»ÓøfâzÙ¿çŒÝñœ¡@áLZ7t™:mœ<|øÐYÉJüÇM+%[“TAεn¨Ví]»_ö¬Ùgå®s/gÊ›QоUHÆMv=ÿ ÈÖ­[•H¬\¹²·èÜÚ05 …¢N‚ï$à&ï½÷ž$MšT° ˆ³lÞüYR²œ6Á og%ùJ:£†,—Á}—¼r]¿pâøU ¹éÙm×  M ‹Ï׋å–÷YsgJò‚I%Cïêî?õ×iÁË]±˜ g\ͳízþÙ³g—?þøC¤bÅŠrñâEwU“ù@@ P ¨æfe=M`êÔ©òÛo¿É¼yóœ¶ó™3g䨉ÚÄŽbN«Þƒûånè£éáÚƒO"\ÃÉãÇOÕkü7­¥ZíB¯Ü¿òÀê¢Ü…½>º·,.ûn’K—.E7)CñÁÇ‘R¼VQCá#z¬1}ö4òeCçDœÐñàΫñBoܬ‡hÉÞ}(/^¼°tK]{t/â³`5 v£DÝb²i÷F·ðÇ6—[¶l‘¸qã º¤==F5*.¼G¾J€ë(új˱Ü>GàøñãjyÈk¯½æ´ò/ûy¡Ôk’Û) h‡Þy(Ý:ÌÔ¶>§¼ƒå*æ–oçv”¾ù]fOߪÊ|ëÆ=ýÕÛR&ß§2æ«wdø€¥2õ‡öòÕ¸5Òª]iÒ²ŒÔ©8ZjÔ),Kî” çnIâ$ñeæ’¤tÙœ*u¿”»Í—;šˆ,U6‡dÊ’JM¾ù°WÍhs‰/ŽÔjS–ý¼Xºuííôl%°ð§…’§ZN»Ð^÷Ãm-³jW”#[ÿ–ÚÂÒµ:Ô7»Õ“+§®ÊgMFɤÝ_Hœ¸qTöS>øFò—Ï'o´ª,£ZŒ“Ü%sÊÁßËõó7$[á¬R³]5™7l‘ܹ/Á¹ƒ¤çŒ®’$e÷æ…›2¼ÑH¹z暚ݤwC•nžÿç¼üЎܼxKbÇ-UÞ®¨Ê€å_´™(´o¥Ò³õeÎY9»,þi±ôêîzþX6g³¶{K5¤R¥JJ8ÂÛH#pzÑ©@”°ÃÖJÄØªÁƒGÖž›XÔùäéCJlÙÏZØù3ÿ” âÊScÔëÅ‹pY2§ôPOÚt¬(ÍZ••Y?vQBì–²pö6™:³½”Õ%¼aaÏTÒÏž=—Ú½™‹?§ÇJ‰2ÙåëñëÕ½KÚ+´ž!CF½%G/O†MKÉâ¹;,z+­•ÓÖõ²rÊßGwËÝ»wmÖ}ð?tü€ä(fŸ0y¡ñÙ¿þ€©\P¾Úû¥4éÓHV»N‡)¶‘=ϵð/ž¿ôøáÞ_JÇ/ÚÉçk†h"ï¦Ì´@ºÛEÆo#ðî[÷—©^‡5!Z§S-™´ë y«o#Y2ú'¹xü’À“9åƒiR¼F1¿mŒ ^ö‰ìúe¯üñã6ùl˜ó»TjQA÷j`JÏÈA®R9d÷¡].篗%UªT²qãFI—.`ÍEl—H#p Eçpd*$%Q£F©-úæÎ«yþœçÈß»w¯.‘Æ)ÞDT f̲wç)ٴtMðY³Ôi^v}â~|ÍKùäÉKoãÅó·$kö4¢/-¹3N O/GöíWœ‘ž¥4öÞ+Aù›À¢w #]l‘CéðâYÚ‚ÎÜ’¥If:EÜtYÒšÎ%†DoáhnsËýÛ÷åÙ“§òäáÖp¤ùm Îõß„(„uÔÒçK'û»–ä²¥H‘B6lØ o¼ñ†‹¿ˆqŒÿkïJàl¬Þÿc_‡±%ûR”Jˆð/[H„ÈšJ)‘dM‰~‘, ¡hµF¶ì[²e_³'‘Ý0c3Äà¾çöŽ{gæÞ÷Üå½÷}ï}žÏgæ¾Ë9ÏyÎ÷¼Ëó>ç9ÏÃÄ0ž#ÀEϱ㚌€.·oß–apªU«F=zôÐ-ïn3gŽ;UâÜå…ò§ŽÇP¯~h÷?Ãé×Mýät稡K=aå4#Iž¼atôïó<Ñ®¯ a‚NŸ9æk¶üŽŸ:Nyð,‘pL•àºwç^Òù˜31Òê§ÐÊhû®~/GÇ9œ>ý×Ê] —´fË™•†¯LŸ¯ýLþõŸûµû¸µCyOw&èØ©<­îq=LCCYÌ’%‹TŽŠ‰`[Žˆ¤UË÷Kågù¢=´sÛqgÅ=>ž•ââ.y\_¥âå¸Ë”%Ìwø£Í¼…óPÚti 1A¬ÜM—£•=yBñߡ͇(òH¤ÄzëÂmt%ö*Uxöq±8¦,%ÆíKwÊs—Î]¢¯:O Ë}wÓà—.‹¿3òåË'³·`Z‹\ââ<ÇÏY|œxê9TFšûéw8@C† ¡/¾ø‚J•rœþó•0Ñçc|柙ÞêZ‡Ú6K³~ÚB¹ód>„™hÌw¯Jqá‹Ø©ý÷òoЈ–wá‰Ê%è³Q­åêê{B EìC(™Äª[_RáÿxêT¤/Y¦à›êTqŠ‚n€/a½uiê€é4oä*V¾(=òåÜààX´lÕ‡h\ço bnEÿÕÁ/S®üá²Ðkbû§3iá˜ÅB¼BU?)ÛväàÙ^FányÚXü]I!ÓýÕ¨Qƒ5j$ý³fÍêª ŸcTH#Ô÷ç7R)À‡FÀ}“®zõêÒŠ¸yóf¹`Á”Ù²e uîÜÙU±ç^³}5¹EŠãÞ¸.VÃbáIÞˆTè\¬3«o³Š….žâ1Æ‹ …K¿E,„ióÂXê ¿<׸‚§lSÔã­{Ç…4釹)Îùê@‹×šÓKŸ5ó;>ˆ]å.{®ìÇ=ÙX(“»`.ʘ9£ ø)ž?E9óæ \bJÚW„6|¼„æNýÅ-–D_¯^=zòÉ'ݪç¬0R+"Æb•*UhÑ¢E”!CÊ…WÎêòqF€‹F€ð=&L Ý»wÓ?ü «$zÓºßyP{¢X %rB©óFIë ·¨n•Á´bÉ^J¸z“~ùyÜwš* K£/ ؽŒ¢ ÃSÚ¾P! |‘9¹’ˆs™„Õ¸xùb>UÁ×ø£=*W®­X±Bfqyíµ× ¿&ôäáóŒ€Õ`EÑj#Æòš¤CPí¾}ûRùòå •÷žˆsh5Ê—?ßž¦OÚHõ«¡swÒ´yïRDû+y}Ñ'(q®²ø¤ ÙL|ÁßÒ<þ÷L‚¬“ .¤ùóçSïÞ½- + Ïøß:ù[zn0!]»v¥‚ Ò€ —!U¬HšU$üIX<ŒÅ FRƒù)»á¼þf§nݺ4yòdzùå—¥Ï0îS&F€ÐG€E}Œ¸# Œ¬‹/¦uëÖ‰iÚÌÊõ<-èN˜OÛ°j=`c4>ÿE²±*D†ÊíüÝí@Û¶m ¹¹»wïNÅ‹—‹\ÜåÁåPCÀØÏíPC“ûÒܼy“zöìIíÛ·§Zµjù -­›_³X#H?ˆÔ‰Fãï]¸E ‡µÙn!ðUlÓ¦ íÙs?Õ¡Ùädy³ ÀŠ¢YF‚å°<#FŒ ØØX™Åòá0AŒÀ·ß~KO=õ5nܘ"#Â'ˆ!æ®<õDƒÉ] È+;|øp8p *ä»”zz=:{6ZÆ5Ô+Šç,WÐpÅèsèû^C^Ý>c1QºétË¢BäüòË/„ŒI/¾ø¢\)“ç!ŸÑn“ð¬(ú in'¨èÓ§)RÄ4}®€+\8?ŸæyðkW¼­~÷øÞó íFþBÔjXsCÛ°*sLËϰȴâçÌ™S®„F|EÄ/ÅB&F€H‰+Š)1á#Œ€[ XöܹsiÙ²e”1£c0c·qaF€ð+>ø ͘1ƒš4iB+V¤nݺùµ}nŒ°ì£h…QbMÀ‡~HµkצçŸÞïrZ5<Ž?€J+Bqx z¸6Í'u)I®|þôÓO©W¯^´~ýzgÅø8#²°E1d‡ž;î –.]J›6m¢íÛ·û‚ó` €•ÐXݪU+Ú»w¯Œƒ1¸IFÀ”°EÑ”ÃÂBYdýÀ ¦E‹2¬d%NßJXzÒW+á˜ðQ„ßb»ví Ïèã ž\‡¬( yn×òÀ·éСC4dÈË÷…;À„:aaa4gÎÚºu+a*š‰`l°¢ÈW#à°&BA|å•W衇ò€W1£³²-¿ ÿk—¯ÑɃ§R-zæðY:ó×Ù€YǬˆ… hôèÑ4xð`™])U`ù #b°bˆ 8w×7ÌŸ?ŸŽ=*Ãkø†£g\âã®yV1j!3Ë•xcñ¹w5 HÎù|]½tº?oñõ+×éó—GÑí›·Åb’4”>czê3µ…åó«¬ÈÌ’p5Á¯mú¢±wÞy‡Ö®]+sBÃ_1""Âl™#`YØ¢hÙ¡cÁ‰À°aÃd Þ²eËR Ê›/7ݺ•PÌÚøë·¨`¡†Š—'_J þëf¬§am¾ íKv¦èßœáó(±òÛ ²r(Q€f~6'E9£ܺy‹òÌot3†ðŸ8q"!w§N áÏL+!ÀŠ¢•F‹e5+W®¤Ý»wË…,("_:y9Ðb˜²ýóçâ(_^c•üùòÓåè8¿÷?_Ѽô-ªÓ#ÿW.EÛ{Vï£:ík‘6õûD½ÇiÿïéÎmÿæ]ޏä7ÿ÷Ñ,jÁâ–Å‹ÓÔ©S}Ä•Ù0ÖD€EkŽK@FŽIõë×—z(†lºx±‡èôÉ‹C¶ôðyZ¹l;m yΞºH%>FÒC%ËRl¤ÿñ/ÿô#ôtËT¤la‡îÅÇ\¡› 7©`©‚IÇa]¼ýïmºrñJÒ1lÄF^¢‡JÖâîM?kÕªEÝ»w—gΜñ†×e,+Š–>Þß9r„Ö¬Ycš ?V‰ì¹àoÚKL¼C]:üH5+ ¢×[}COWø„zuž°Ešp{w] Ç¯¤íò[©B%Š9koO˜^:IVËœí~ÞâðüáòX¢Ÿ-ŠÅð±2 :TÆT|ã7ÈJá~¬Œ9Ën>XQ4ߘ°D&FàÛo¿¥¢E‹$ Kj°<ñÄtüï«t颱‹6Rk[;ö͘U´dÞÚ®ü=}+Mþ.pY..DÅSÔÙ[T¾|y¹|½ü¯œ¾J×L²¨(Kö̲‹°,jtóÚMʘ9åy ·vÈð_´+ö¶áøÝ‘,Y²È©çuëÖî}&F `E1Gûì7nÜ )S¦ÐÛo¿mxj8U3dÈ@5Ÿ~ŽÖ®<¬ZÅçåý²SXï9ð…õeÑÜ” - ¸³zÅaª[»1¥K—ÎÀVˆ€ÿsµÒáG mG•y®¹(}†ôs&&©JÔ‰(*Xº _¯Ù¿6¦Æõ^0ÿ¤N¸Q¥JêÓ§!Uçùóç l‰Y3æD€EsŽ KeBfÏžM Ô±cGSIרQSÚ¶!Š.ÆΪh&@¢ÏÇÓ¾]qÔ ro7mÜ”¢Äô?bš2eÍD×y”~›¼F®ÆÆÊãÕS×ÒÃÕüç+Oq_¡çŸóþþÀüÿûåÉ“‡zôèáæ¸ FÀT°¢hªá`aÌŒÀôéÓé…^0]\µ9rPó¦hÚ÷Û_Ó—žÖª4mcÅmÓ–O:óÇ,™S¿ßN­_êHÙ²eóG“ü_kÙ¶Í œÕ¾£/ÿ¯ %Ä%PŸgúQßšQ¦¬™é…®ì‹¶ ü·ÏÙEÛ¾é7ü ëŒã¬Y³Òøñãeæ–_ýÕî o2ÁÜþ1æú¨¨(™©)¾ÌHõêÕ£Ý{¶‰éÞÝBA«èW»ô¨G‡žmïJj·uûjôúÛ5“öýµ1wÆ. Ï^Žžyæ5)ÛþÛþØJ¬ØK•Vð[Û/ölš¢­láÙhÀ¼)úÔÊ,,Œ9óåLQƨ;ÿAeó=ìwüê=߆ RË–-©k×®tðàA‚ÿ"# °E1F™ûè5Pa¡jÔÈ?–w†ï.=h׿«´jùw«{U>}útôÍ”7éÇŸß–|~^ÔFûª_}âÐð¬i[éð¾Dzû­w½ê'•®=éÚŸ t@Ä,4!,Ž?•Ä­ó·QâÉ{ôngÿãï/¼ÇŒC±±±4|øp5Éí0G€Å€ `fΜ)3±dÎl[UjF™1:|è8Z2ç­X²Ïï"-žW¶©ýúS€¯GýF³§î§þý> Ø”'ð;b_}Šö®ÙïÏî¼­•WÓ¾ÅÒg€P¨P!êß¿?!–jdd¤?šä6€#ÀŠbÀ‡€0;x!lÛ¶Z·nmvQeÚ±ŸM;Ö'м™»ËÐhÀîܹK3§n§ø˜pZ²x%!£F iß¾5žÜ ]Kw=þwþÛì¤ð¹E°õÀãï±Gnä†ÂÈÄ„¬(†Â(s½BÎëðGªS§ŽW|üU9oÞ¼ôÉÇÃéòù‚4tÀJ:{Úÿ™CüÑ×S'bhHÿ_éö•’ôqÿ¡dk/ð>ès*p³ý:v5]¹[³ ðWìÝ»·\äæn}.ÏX V­4Z,«ßHLL¤Õ«WÓàÁƒýÞ¶/¬^½:U®\Y¦œ2~1¥Ï´‡ÊWÈC §¸;¨ PµÁÁ®Àÿž =Ù9”•‡Äy”³'­é»ÿÛ·éJ슺"Ò^¤°taÔ´AsªÝÛüøÛ÷É×Û£F¢5jЪU««Þ™`E€Å`Yî—Oغu+ÅÇÇBcX•2fÌ(åGNž½þ4xù'#ñ÷µ¬ÌOO>ù„ 0²UQ+.a]x1‹uÇŽ%÷ðñË€‰`äT«VêׯOƒ J~Š÷ A€Å JÀ”¦žYQô5²Ì0õ¼yófé<½âž0÷`Eñ>¼Å8 ð÷ßÓ¥K—XQt@…wFÀXk×®-ƒpÛçmF X`E1XF’ûás¶oß.CâT¨à¿Ü½>ï3dÃèÑ£­\¹’>lx[Ü#àoXQô7âÜže8xð •+WÎô!X,( Ê)7¦R¥JѸqã‚´‡Ü­PF€ÅP}î»K (–/_Þe>É0ŒÂ;uëÖ¦NJ—/_f@ B€Å NîŒ/8pà+о”y1AŒÀ믿NéÓ§§‰'q/¹k¡ˆ+Š¡8êÜg]âââ(22’E]¤¸#À°°0j×®Mž<™a‚ Vƒj8¹3¾B@sJøá‡}Å’ù0Œ@#СC:tèíØ±#È{ÊÝ %XQ ¥Ñæ¾*#€Tw˜F*R¤ˆr.È0¡@ÕªUå¸)S¦„6Üû B€Å N8qâ„TÓ¥Kç+–̇`BXgÍšEÿþûoô–» p®çPeî£ÛÀ¢hTNdgÂ\¸pAúE:;oöãMY²d1»¸,ŸIˆ‰‰1©djbµoßžúõëGË—/§_|Q­—bLŒ+Š&-pø[Q,[¶,]¼x‘¾ûî»ÀuÚË–5EÖ”\¹ryÉ«‡*×®]£Ò¥K[¶û… ’Ùœ,XÀŠ¢eG‘·G Èg{Ïþo3ŒI?£Ö­[ò¸2©!°wï^zâ‰'èÈ‘#T¦LµJ\ŠBFEC† !|<Á×™‰°2ì£håÑcÙ Cø ÆŸ3Œ@ð"ЬY3x{Æ ÁÛIîYÈ ÀŠbÈ 5wTÄÄDùˆˆP­ÂåF€HBéüÕiáÂ…IÇxƒ°*¬(ZuäXnÀ3=<2XQ4 bfÌ=Mš4‘ Z‚¾£ÜÁ G€Å bî »h‹2XQt9.Ï0uêÔ¡cÇŽÑÙ³gµCüËXV-9l,´‘°¢h$ºÌ› ªU«F3f¤ßÿ=4:̽ ZXQ Ú¡åŽyŠÀåË—)mÚ´”3gNOYp=F€q²fÍJUªTaE1įƒ`è>+ŠÁ0ŠÜŸ"G9rä 4iÒø”/3cÐB V­Z¬(†ÖeoYQ ÊaåNyƒÅððpoXp]F€`¨FÒOÁô™«"ÀŠ¢UGŽå6 d† 3Œ?3fÐ@èAFÏÄXV­:r,·a\½z•²gÏnfÌ0¡@þüù ¬(†Æxk/YQ Ö‘å~yŒ@BB+Š£ÇFÀ *°¢ho[VM>dñññÔ®];Ú±c‡ƒ¤k×®¥æÍ›Óõë×½ŠÓ5iÒ$Ém¼üòËôõ×_N{Kýúõ£èèhoÙ¤>0Í’%K@ÚæFF ¸€¢¸oß¾àê÷&¤`EÑäÃ=gÎZ·nM˜0ÁAR(b¯¾úªL:ÿüóÏ;œsgg×®]”;wnêÒ¥ uìØQ~ù¾òÊ+î°HµlÅŠ-«lݸqò²§:|`†@¹råèèÑ£2ÛSÀ„à†/HïE]®ê&OžL?þø#µoß^Z›kîܹr%ݲeË–ÅsçÎÑ7ß|#•=øÂ@©Ì!uîÜ™}ôQ:tèTHºL™2Ô¨Q#ÉK–,IO?ý´#àwØ¢èwÈÕ„ò„P-Pìž|òɤóˆøð-­[·¦^xråÊE 4 ,ÂhÑ¢…,ÿØcQãÆ¥yêÔ)êÚµ«œ¢~ä‘GR€6fêŸþ¡qãÆVêAI„"eô£>¢¼yóÒûï¿/ëBQýàƒè©§ž’ÖÎ ЀèÈ‘#Ô«W/YÊ#ønÚ´‰ºuëFÈ{Z¶lYzã7äù3fÐèÑ£©mÛ¶RáüôÓOSȨ·nÝ’Ên ÚçvF x(V¬˜ì žÃLŒ€`‹¢‰GmêÔ©T¯^=:~ü¸´øMŸ>]úª:(}Pj° ‹ßÏ?ÿ,ÊXLÚ0xÀb¹~ýz9ålÏ@ãåÓãPaéüòË/í‹Ém-Òâi¤ùFbá#2gά È/¦ÐçÏŸ/Û†5 1cÆÐæÍ›å6ÿK‰¬Ø¸~bccåG ¦ìéüùóò8¦ñ™PD`áÂ…Òå'}úôT´hQúóÏ? Ïõ·Þz‹àŠÃÄXûon«H"rÂç¯D‰ò‚é_üaÑÊÌ™3S €‡¨iÓ¦2¬ ¦qñ‡ÀÑÞ¬ÞÅŠhXÁ Š@j%þ7X-½fÍš6mZŠb©¥ÂÃ44QêZ¡ÀªDLåÃ²Š¾Þ»wFŒA={ö”Sê):Å$wîÜ!\'p}€Oê•+W¤/-,Ḁ##Šà¾xæ™gh÷îÝÒ=÷\và÷û†‰° ¬(št¤¦L™"°Ø‹×ªU+ie´?öÀHE « 1­!š`Z/mL?{J—Ó·o_jÖ¬™\œ… «=!EÕ‡~(Cõ¼öÚkÔ»woûÓN·áŸ?EÔǃ3ÐÅîÝ»KK,¨‘‘‘´dÉùP‡o&B1¥Ž\ àwŠ—¡æ ¿SXOÞyç$Ëlêµù(#¼ôïß_ú#ß3BŽÁ· óåË'?úƒ·çܳ`C øâçO~‹*,ŠPâ´éRøÂB%Ò[‚² þPÀÖÁÔ”:øßÀÓ,*´sçNi1_LSB Þºu«JUÃÊ`‹oìiøðáRa´?ÆÛŽ;vL®¦·”À' Îû¾¸[ã=FÀ:ÀҮ͜hRcá\|˜« ÀE«Œ” 9áû§)‰(†¸ˆ¾zAÃçL[ ‚iìÔ”D´‰ªJ"Êc•5¦Ò?þøcª\¹²\•ã$mU·6UŽþ"Ä“kJ•*%Wµ£”†]›6m|v ºnÏ2æEà³Ï>s÷âÕ21VB€-ŠV­ “S¼{öì‘«·áh‚årœ>}Z*½=zô /¾ø"ÐbY¢ý-[¶H7MXÄóÄb*&F ÔÀ1|ÎaqÇ4ôêÕ«Cî¿Å`EÑbÆâ‹ÀW_}%ƒ‚óÔ©û8#Ö'V³#Ä‚´31ŒIÿ]$2ýòË/2Ö-ãÂX žz¶Òh±¬†#ðúë¯Ë•ãXÈã«é{Ã…6IXÔÒ~M"‹Ád¢Â"9ĶEâ&FÀj°EÑj#Bò"„²Å¨„’@è ÄïS „E9ð§DšÃÔq ,è4Ÿ^ýÔxº#ŸVSU ”-[¶$ß?íœÊ¯;õÝ‘ÏUÿaQ„ÏijäŽ<öõ]µ§•S‘ßÈö59RûU‘?µzöÇTúg_ÛîôW…¿;üìeQí¿§üµ¶T;CIDATÜ©¯Ò_¯/ä¿|ù²Œq‹äÉÉü“ó´ß7 {™ì·Í"Ÿ;×å·—Éë~³XˆfÏÂa[m‰ªCÞaüƒVrGEEÉÅ9˜ vEP¨TE”…¢¨-ÒIÎ÷¡‡J~Èa_¯¾CáÿvÜ‘O«›Ñ,YÖ‹Ì×µÃÊ¿·oçõËÉ,3z™fÜ‘ÏUÿ)‰ZëdѓǾ“®ÚÓÊ©Èïiûׯlj18#>,é‘]cº½XÊÛ›6­ôª>Ú»w¼PDÂÄ5;P¹]müU®þîð³Rµÿžò×ÚÒê«\_*׋ÆWåúCYíúRÁ[ã_£ñ1 û>ÛooܸFéy¬á«2¾ŽüÕž÷Vçoßgw®o„ªÓ#öQÔCˆÏ3Œ#À0Œ#¢°¢¢ÏÝfF€`F@VõâóŒ#À0Œ#À„(¬(†èÀ[¹ÛÑÑÑ2cʶmÛœv‹@zõêE  &8-g¥Gމà$b–ÓäÉDë×;özÇ]üºtéB.\ph·[·ntîÜ9‡c¾Ø¹uë–Ì#­Ç YÒ—$â‹lBÞq\¼˜hüøû¬/íÁƒú8úâzÿè£džåwß}W_(ÅÈkŽüô³gÏ6,^¨H -a( d¢b©Ý"­]KôÓODâÑ­DÈE(¡BxÞ"Ʀ;´ÿ~š8q"ýõ×_ºÕPYư8ÔbEÑÔ¸N@@¶dýxê©§œÊ•këÖ­/Û+„›$HdÊ£o¾!.ÈÖ›ãlj}”/Ý!Cl¾ê§»øÍŸ?Ÿ®]»æÐü¢E‹äb‡ƒ>ØA¸¤… êrBŽ],pò%añýÑ£D"‚’Ç„(öß.?ÿL4s&‰ëÔÆRD"|‰ì™%ŸÀÏ=¶o'F¿†•+]—óÅõŽ…(ƒµÞ‡_RusPÜtÝåé‹×uωúöÕÇGG Χv¼÷‰v¹ßId¦!™¾d}+õ.}6–(t¶ýúõ£Ñ£G+Ë;gÎzöÙgå‡x«V­ä»ÎUåÇ{Œj×®M}úôqUÌé9VBÃ'ÌŠÀæÍ›…ÅE˜\\ÂéDDDÈXˆ®–ýƒ¾æ DPv:tè ¿ìÖ¬YC¯¼ò 6LÆ£sÑ”<…ÕÉ£„9å aZ+>Ÿ“K…6lØ ­cK–,¡‘#Gº¬‚‡°x6$½`‡µYe`ÅÏ úá—Õ“N®X±‚Ð?Wä~®ø¨œÃ ½N:É|ß°û›R­mÛ¶4`À:qâ„nóHÕ+>ä%‰K‡0 ‰íâz!ÆÆ5‹êÕ‰Nž$ºtÉVNdwـ¼©n]×ð¡ Œ–R¹Ò«[ù­·ˆºw'‚¢®G£O?µÿ—_ê•&rW~ûûãÌÛ³ ?âö¢çž#—„™"üÁj{ Ú¥áYö– »`»³ó©`™¸¾TÏh<ŸFˆ„¥S…`僵O…`és5;–XÊ¡HcÖùħL™’Z1‡c-Z´ðØhŠ¢”¼c0%¡§ü¡ï¿ÿ¾ ƒ/.W„©Ì!Â$·iÓ&jݺµ|èŒ7N>æÍ›'l:O6Á_ƒàƒéî±cÇ*M#̘1CÖƒ’‚i,<¼ôS”“&ÙJýù' ˪m;<œDûÑ¡Ç Ê%Š‹‹Ó-¨ŠŸÆéœôk®Áâ‡X£F_½76dºÚ™øšÇƒZËÄS¿~}ÏYy‡‡—'¦Ô€¹øÆ ;H(üD³fajÙeÊDeSΰ çÌIÔ¾½ûŠ"¬ø@èÝÛÆ§CW­ÚÎá½Ûµ+‘è¶È±®_^¯f½„׉tÆ”V¼MÄ÷ŽÁª*"Té’·×{Ïž=E ÒtòY Û˜bRÂÔùâ‹/J‹N… \Ö‚ò.<0HˆA°âCO|¸Îòås]·˜ÐÊYóæD¯¾ª¯¬ãºýüsÛsÄŤŒlØùíï|˜ b™[+©\9¢?þpݧEçñWW0ʧž1Pš: š ^@tEˆ/ø¹`’xºš•àBƒëã+ž ]¿~]ÙíeéÒ¥J «Ö. g„þÈ7p9êz ŠÊˆ¬jÀÐÚÒ~ÿ>m—ó"€ÓÎÍš5/%ñVÒ!í¦Fb8p ´@–,YR>ž~úiù`8йFÂM˦ÄgŠ7x&h:%KÜ舩2Š— ¦áˆé»âÅï7R €mZ'oÞûÇRÛ‚R¤Bîâ‡æ¹sçNb­2F°¤b|Þ xñB1ǃß´@˜ßæ0(¨ }ûö¦¬¡¸:#\zPŒ Õ©C"X­Íª(HëžÊ´4^¦°Ââ+ \ 4bö~ëV5ë°¸|¤5/ûjÕH(ÚDbVô¿ÀÎΤ'*_Þfýs^Bý 0èÐÁ¦¤ üeUŒéxÿë]§àçíõ®]ÃÚ/xzK¸Æí¯sWü€>Þ~ý•D?¹Ð]•¶Ã-„¿%ˆ²fu]^xØÈ“cLjðŸR|êèWÒê=uª¾²î‰üö÷žUÉŸQpipE¾%Yu€‹ÌbñevLtðIÆG°ž‚yW˜ý§ O×A±B|Å_Å" #2O©r{kù½UÊ»SVÍüùó'%-( üª.0Jôïß_¦YU1¶hré¿mµ’üË,–€‰þ%̵ù˜×SI X p#‚Þ=B~cLOLŸ>Ê–-KðÒ#VéÁ·F…`AÄT5¦7à[£·èÆž§ö,„5 uñ¯9ŒÛ—Km‹m|Mˆm™œ0-¤Gø:þN̷ <à G°8ª|­«¬€/Œ¬ð©„Ÿ¤*Á€œD|´©»¼=¡i-ô‘ýqgÛ -ãÓføûé¸sI60–*LeY…¤òÅiOXV!ƒŠEÌ¡ «*Ä(ïÍõŽú*„{ø8E}Hø€Å>ÅPxUCa•4\‰õÆ E`¥,솗 \P\”5ûé`We=•هϩª’¨5ˆERè¯áÞ×¢ÿˆG\E¯WÇÝóžÈoßú®ª$jõ² ð!©GXH¨…?Â3þ¾&-Ôš¯ùzókªï,ôAø Oã(²EÑ›‘âºAÓ•) êÓ!Åg1'?|A«Þô ¬¹#À¸‰€?Q¹)g¼BŠ4Þ™*‘(RkˆÅÔPác¦G_šzÓ¦ï„V´@ZÒ¬€ËÈ0Œ#à9Þ.ä©gϱ皌#À0Œ#À5iD@I”‰0W²q_˜"&M¢"íùä‹·õØuŸ4êý×Ñh|¬Î_?>ï=H2øŒÎˆEgÈðqS €Õ°w–‚bÙ?Ê©dDAh 2ÈmžtÒ“úîÈg/”eo¦ØUë»#Ÿ'ý×ú¤*V¿*í©ÊoTûöò&ßV‘?yäûªýK^Oµ¿ªüUùÙËáNÿ=áoß–j}Õþ‚·Ñò‡û±Ò¶C©ÿª×§† ~ÝÁG«çÎõ 7.DÞÀ¢ gÄŠ¢3dø8#À0Œ#À0!Žû(†øÀÝgF€`FÀ¬(:C†3Œ#À0Œ#â°¢âwŸ`F€`g°¢è >Î0Œ#À0Œ@ˆ#ÀŠbˆ_Ü}F€`F€`œ!ÀŠ¢3dø8#À0Œ#À0!Ž+Š!~p÷F€`F€p†ÀÿñÔ›¯]‹IEND®B`‚asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/tutorial.png0000644000000000000000000012713215031566105024441 0ustar rootroot‰PNG  IHDRÃPZ–s2sRGB®Îé@IDATxì|ÅÇ„$”„^Cï½÷"½{Cì ý£ˆ 6D@¤#½‹  H•ªôÞ{ ÿþ&îq—Ü&w¹~÷æ“ÍîÎîÎÌ~goöí›7o2ÝÑ$! „€B@À#0;(ðîYîX! „€B@$aXž! „€B@€% ÂpÀV½Ü¸B@! „€Ãò ! „€B@,†¶ê寅€B@! D–g@! „€B ` ˆ0°U/7.„€B@! °<B@! „€K@„ိz¹q! „€B@†åB@! „€X" lÕË ! „€B@ˆ0,Ï€B@! „@Àa8`«^n\! „€B@„ay„€B@! –@°£w>{ölG“ë…€B@! „€ÝŠ+† Ø}ù ÃsæÌÁôéÓÑ£Gó4e[! „€B@¸œÀ«¯¾Š?þøÃ¡|†™s÷îÝÕâP)äb! „€B@!`'-[¶ØyEêÓÅf85‰B@! „€" HEËm ! „€B@¤& Âpj&#„€B@! DŠ–ÛB@! „€HMÀát©“4Ž9xð Æo:!88åË—GË–-Aׄ€B@! „€; ¸U3|êÔ)Œ3wîÜáØØXLœ8õë×DzeËÜyß.ËkóæÍ¨ZµªËÒ—„…€B@! œGÀ­ša½Øï½÷²gÏ®ïbÈ!xòÉ'±{÷näÎ[ÅS`>qâòåˇlÙ²™ÎÕ7(HsÉ›7¯eó:::aaaÈ”)“ºæêÕ«È™3'‚‚,¿ X†+W® OžÓûå—_L׎7N™nT¬XÕªUÃo¿ý¦Ž>|… ÆØ±cQ²dI”(QmÚ´Áõë×±wï^tëÖMÝKTœ)AÙB@! „€ð:^! S¨¤0zàÀœ>}?ü0¾ýö[:t{öìQ&N&Mš„… âï¿ÿÆ‘#GP§N%óX\\œIhæ~RRâã㹩âW®\‰Î;ƒmÆ A!¼k×®8sæ î»ï>|ñÅê\ ÅÔ^ÿôÓO8{ö,†Š^½záüùóê85Ëœídß¾}X³fJoéÒ¥¨T©,X€ððpœ;wNi›ÕòO! „€BÀ+ x…0L2ÔÀÒŽ˜Úáüùó+-ã *¤4º‹-â.¦M›†~ýú)á9kÖ¬4h  Ž¥÷¯FJ3L“j”iÞðÔSO)3ŒÖ­[ƒü&L˜ „äºuë*SŒ{î¹Gi©±ÖÇ~¨L-jÕª¥lžÿý÷_ý¬…€B@! |„€Gl†­±¡ Ú·o_lܸQi{ÍÏ¡)µÁ ÇŽS&úñÈÈHÜÿýú®ÅššbóP°`AÓnæÌ™Q¼xq%€3’öú)ÆÑ£GÁÁ~ºi„~Ñ­[·ôMeˬïЦY×@ëq²B@! „€ð~^! oذA™<Ô®][™JÐÁ<Ð$‚f ~iæ šUPkÜ¿5NhyœB­yÐÌ™ÇYÛæ ½¦M›âóÏ?7¦ ëq@CÊÁv¦eC! „€BÀgxÄL‚,ÚüΜ9}úôÁ›o¾©LÚµk§ì„iƒË@Ï +V¬P6»Ü§Íï¼yó”=1µ±|ðIè-]º´:7&&F¥¯Èãuö„Ž;bñâÅJ0çu«W¯F£FpáÂ…t“ Q¶ËæZät/’„€B@! ã’’’T<·¯‡”ûLG?—ç˜7ßÖ1Žçó:=è鳨~™ˆ•+—™’m! „@@a8 «]nZ  <ì“wQ¯ü|úf;¿0‹°¥f©ù~ë™zèÓ§¯f²Ð–Kä! „€ßaØo«VnLôLœ0UŠÝÀó4HïT»ÏZ¼3í°zÝÅË1xùýHHH´zÜ‘ˆÏo{kWLÅöíÛÝ‘¥ä!„€ðJ" {eµH¡„€p5õë×ãì‘?ð@—J.Éê­G±aËQ«iߺOJºëRÍê‰éDVný9Öüq0³ŒçΕoån„€°ÀRÍ…ZÝŠYQ¬°c³³8}Mz}ƒRM?AÉ&£qϯqôÄeS ¿„êíG¢D㑳Ê`|5i½:vD;'¢ê;¸};AíoÛ}UÚ Gáz ²Æ»xgørÓ¬uÇN^Aýn_ª<ò×~½üˆmbF‚r÷§'aÒì¿Lyfd£[› 8°gŽ=š‘Ëå! „€Oaا«O /„€½8]ñÚ_ OGÇÍ#{}&Ê–Ì‹+€«»>D¹RùðÐ+ÓMEZºf?Þ~þ\ÓŽ »³f'¼ï;­´¿×oÜRçEÇÜFçÇ~@¯UqqÇûعìUL¿ ã§oRÇ}}†ò|yçØ¿z ö8‡o~Ü€Úyò…cþ¸Gñhﺦ<3²’½ÚÇÒÅs3r¹\#„€ði" ûtõIá…€°—À¦M›P½lèwב@­ðjÍ^÷¹‡)S‹ààÌxùñ¦ÊNX7™¨U¥îë\Y³†hç5FTÑÜX±î_‹lü²G™:¼òD35m3¶õíVs—ïóX»ñ0ÞèßY²£p\øiT_4ªe‘†3vZ6,½ÿ šHB@Kƒµ@ºs¹W! ’ÀŽm¢I•H‡ï¦Ô¨Ö¬\Ä”V‰"¹ÕöYÍ|¡IÝ’j­ÿ«V±èIÂ<Д":ö6ª¶a*å âèÉd“‹ ¥ó›ŽÕªRÔ´íÌ Ú/W(™»wïFýúõ™´¤%„€ðj" {uõHá„€p6Ãö —'›/O˜Ga¶lÉ|*½{O«u1m€ÃÉ3×ÔZÿ·}Ï)ÜÓ¸¬¾«Öù#s æÕáøŸo›üŸ¿˜›q¸ù߀9æQ±luþ¯({âÖMœ?rµ²¹pàÀ>†-jHv„€ðwb&áï5,÷'„€Ä„Xä‰Èn—‘Ú sùbÂï Ý/Ôy[Ñ®yy“ ÆŠuÿ¨éïܹƒÉs¶€ãíªXd×¶Yy\¹~SÙ ó¼ã§® ã£ßcÆÂ(¯Ù W(“£'®Wƒæ8`î‘Wg Gö,*à \N¶=¶H4ƒ;%43ŽÓ'eðj¹L!à›D3ì›õ&¥B ƒ²eÉœÁ+-/£ð”/ú¢gÿÉjrðY+<ŒÔt"µÀ€xmr«šÀ;á³ûP¤`.:vÑtNI͵لa½ñô 9xë³eJ`î×½^{ª2gÂÔQ(³—ìD°&üòXƒZ%Ôõ÷v¬¦„cºWc¼£!{¶PÄDßõ†áhzr½BÀˆ0ì µ$eBÀ‰›è¼ õjÇ‘õoa¯æáÂ0ÛL™2©SF½ÛM­©íý÷ð×쉳ié´(‹ð€&Èvk[ûžCAÍCý롦6ïÈúA 2m’)„ëaä;]1äÅ6ȪG9´Îš7co:”†\,„€ð5" ûZIy…€pˆ@hˆs›=¢«^©°a™(—7lj58MsnÍ›=Dè!,{(êT+¦ïZ¬ƒ‚‚PºD^‹8}ÇQ¯z:ú:$ÅD z¼¬…€þJ@l†ýµf径€°J€šZOjxÿúû$f~ó '‹aœ·gñ—KŽ! \Dà®ZÂEH²B@o" ›1xªL4{˜ofWì©ræ›låaxX! ü€h†ý­Få~„€H“€§5ÃiÎÕÒ\4îÉ^waØÝÄ%?! }gΜQkn§\Ο?¤¤$Üߣi`@ÉÀ]R3¼uÇDEEiSEgAáÂ…-–B… ¡H‘"àšÇ ,ˆà`ydµ\"„€VÌ‹*CŠ"„@jqqqJ£{òäIœ8qBmsÍ}.€¯]»fº0$$Ä$¬Q`kÔ¨‘…@7oú¦se#5êU*àÝ÷?±ø˜ ãµk×*ö.\0]D““üùó+™Br±bÅP´hQÓÂ}Ó2ÙBÀ ˆ0ì…•"ED€]òÇŽS‚®¹« ¿Ôèê!44Ô$hQèªY³¦…¦’YdddšÂ×’9Òìé<­­s„gGË–-­Rqñññ8{ö¬ŒÍ5ñ¬»¿þú sçÎŹsç ûsæÇ ë%¥Ìý%J(:[¶l†ùÉ! „€« È[ÁÕ„%}!à®\¹‚ãÇ«…B/îëëèèh!juíbƒ pï½÷šö)<åË—/MA×”Pqñ i ìC´ŽK›…[Ö£@™öÙ\R~àìܹSÅ_¿~Ýt9ë‚qñâÅÕ¢oëÂrÖ¬YMçʆBÀÙDv6QIOš1P¸=räˆÅ¢ »7nÜ0)P €²G¥ÐÓ¡CµM¡Jz¨ùu}ù†ÇÅ'"[vǵ´˜£4»c.F¦-úGÒÑ£GMH¿üò‹Ú6–ùÜðáR²dI‹…vËb†aDYâ…€°…€öP’s„@€ à¢ »\>lÚ§9ƒÞ%ž'O%¨Pj×®…¶0ey"°|{÷îÅo¿ý†‹WbŠx>a ĺ€l.,sÀŸ˜^¤¤*ûBÀ ˆ0ì¿u+wÀ¨Éý÷ßMË?ÿü£¶©-ÕMèvŒ‚@¹rå”ý.….ÔúÒæÓÛžõë×›¶}ûö!sæÌ&ž[½zõRu“רÕ[6Ma8EÇiçö‰ÆcUª ,, mÛ¶U O»té’éCcÞ¼y1b„2yá Gr¦I={¿7„œ9s*²5­2Ÿ Çæ= þù'¦L™ÝN™B~Ù²eQ¾|yõûÐ×ü}xÊÔǸJ„€¿Ȥ½µñà sæÌAll,zô葱ä*! 2L€?]ŽÔ§Ð« »úš& Ù³gW/u ¼æ/tÚWò˜/Î ·uëV¬^½¿þú+¶lÙÆUÑ„7] kܸ1räÈ‘æmqÀß«/<‚Qÿ«ˆ\ŽK33:¸bí?Øyª(ž}þÕtKÍçN7?¡ {h"C¡˜¦3­ZµR½ é&äe'ðwC!™½&úÇ$Süˆä„-ÔS›¬ÿ–ø»Ò[4Á‘ „€û <£Gv$ãÙ" ;‚O®n"ÀAjFí§¾ìß¿7oÞT%È›7¯é­¿¨¹¦}¯/w÷ÒÔaÍš5Xµj•Òs 5ÚºÀEá‹÷no˜=kâ.¬Fÿ¾µí½Ô/Ï×¼H<÷þj¼øÆp%ìÙ{“|YOüPùý÷ß•’„½й4kÖ áááö&ë5çÓ¼ˆ¦E)?<)4ë¿Aºý«X±"*Uª¤ÖÜæâMvô^T "œH@„a'”¤„€7 †Mz¹¦AáWwOF7Ræ/\ÓJñ>)LQ¨âB-í~›6mª„* Áò œ¾ùí7àÝg*£XáG“óùëç,݃#×JbÀs¯8|/Ô¼oܸQiïY‡ô+Ló š¬è1´=¦mº¯óÞý·ª¬òcàÇ›þ›å€D Ë\ÓE‚ŽaØq†’‚ðj“(ìîÙ³»víR _¢œ ‚³¨é/P}ͨ¿uÅR˜Ø±c‡ÒüÒôaóæÍÊ‹AµjÕ”ðÛºukÐ.Õî±ho¼zÑ·øt`S¿Ì2ú =qŽÝƒ÷>úÊ%ÏMt­1…cÎZÇç˜Z}Ö/ Œþt!Yÿ Õ?pir¡»„ã`ÔÊ•++3šúp¡ù’?|$øS]ʽx?†½¿Ž¤„B4q À« ¾ÕN'_˜´Û¥¦ˆ/B®õ.Vv¹úk ÀO¡ˆ“+p¹pá¨ñֻԹΈéCFxûîkäHÚ…§ï¯•‘Ë}þšÑ·ðæð?Ð÷±ÿ©pî¸!~ôñÇÏ?H(R(lÓ¦òMM/þêòŒvÇôr¡kÙµl臙l8 P‚Ö ˆ0l‹Ä à´ì*¥¦S×öRæä œi/7] (š ýÿý·|W¬X¿þúKÙ1³Û\÷X@.ž¬³×^y! Ç1öãÀs¯²-;=ŽNºz¿„iâ•+W*ŸÁüZ¶l©„c>üPò÷ ÷é±þñLyNX£ ÇôÁ%­é°ý—ÜŸ0' °9 Ùn$@m_\´‡Ô ¾´—¤[&óîO]»Hiøg×8 :´…Ο?¿~©¤ö×[xPXÿàÝ7Q±È ùük4jÜÌÖË\~©é‚1…d\ãïGÿhâ”·¸os9 -zíÐc®u-2óæl4'¢`\£F µæ E_0릒‡ÿaØÿêTîÈ pf6¾ˆ¨ñ¥àË5mÿèÖ‹n¼ô’þRâ¯@zaëUÆ®ßeË–Ú_ÚþRȬ[·®I!'o}QSèú櫸½Ï?TÓ¯g§û{ßi|ùÓ^tìñ¤V7íôêóº5µ¥œDEŽéÞŒPüâTß\h[hÁ–öˆÂ1o\j{hÏE ߯Ã\ûrï.!@¡ˆ‚ï¶mÛ”O[úµ¥;%ÑÄX"§‰g)£Ì… m}©ÅÓµ¿¾4àÂû’%‹°bÑÜ×¶(Ú·(ïµÂ»eMضwõÚML_¼»á‰þ¯*ÿ¸¶]égÑ™ÞÓ@­1§‹¦¦¸S§NjÒgxñŽ;µ¿æ=UüX§Y’yO?Ôk×® zñàšd BÀ_ˆ0ì/5)÷áÌB_ ¼~¹PæK–(Ψ¥¿<ø2¡Ý^ ÎlGMÝÒ¥KÕ (ÎØEo:tP 5Á¾>þìÙ³˜5c2ŽÚŠö ¡qâÈ™öDÞü\£üH£ á±w‚Â1×¾ÔCáJþìù¢ÖXWpM;…aýã¿N:ª=ôå‰R\ÉQÒö." {W}Hi¼ˆ}jDø’¤÷®éß”‚Ý—±ÑgƒÏ5÷]‹d^uºp±hÑ"%`PH¢‰Í(\pâ_võD×VÏ<óŒryÇ"[êžR\èîôéÓ ë;>KÔ²™kÂÉŽ,ƒ.[hõc5cÆ :ÔTLé0˜oëû\ëùèy1Žñ´µ¥-mÔ”ÈÔ¦ø‘CÜ_||±dÉ’%½K¼ö8ëWÿx£YÓW5Í):w¨(¯-»' ÆÞ]{Ì)ÎÙCvêÔ)õ³m¤) {|¸.[¶¬éùöDY%O!`€ÃÖ¨H\@е¾z¹PÈa7!…ú-Õt ¿iiÇžvÓô‚±víZP^²d‰òýË_ÇŽ•L†þ0(p„ JØ£@4vìXÕ#àÉ:Ÿ7oyäP ñt˜Ú†ÓLFÞÙf¤Ô´ûÂ}¹£ŒdGƒ®làš òÒµÇ 6ά'A¸“€Ãî¤-yyŒ@ll¬2u ðûǨmÚú²ëžÝŸºàËo¢õM»š8Јv•‹/V3€ñ%רQ#%° ÙùOŸ>ìhÚðÝwß©ç%mJî;êmÂ0ïœfcÆŒÁ{ï½~QKìOFú=ò#š‚1 ôoL?Øü P8nÖ¬BBBÜ÷ ø`NT@è&hÔÓ¼‚í §Ö¦PÌv…k Ëæ¦D>x«Rd/' °—W/c(°Ñ†‘‚/º ¢O_ jl`õF–®”D““>cjE,X ^üäÉ—Võïß_õ¼óÎ;xá…üV¨Ù»w¯ú}P8f¯½ÉІºk×®jž·=7zyÓšîÝ8 m ÙÛD–TZè2•¾l“îMÌ¥,ÉD–'Á/°»’Ý—\Øê~}©QÐ_®‹)â÷뎛à À¶øR¢]_îÔzqt=' ñç°páB%gÏž]i9©éód iÝøqJ]ó0{öl<ñÄ©l†©a£0Ê߀'?BG…?þX 6¥µ¿›?~Ü$S¨£ ܾ}{ôèÑC "Áض'’ƒ99@T޹æL”¡¡¡ÊÖ˜îïš6mªÆtðw*Ad”€Ã%'×y”Äõë׫٥¸æKŸ#ú9C~©I°e¼GoÄË2§xþüù05¿Ý»wW |YCŸ²¸“ž z{ ë¬Y³ðÐCáÓO?õŠ>œÈ‘‰'¢W¯^¦'gÚ´iÊ–™»ô@3…‡~X h¤`æ BÍÓO?ÇãÃ?Ä“O>™n¯ }Ú²¢\¹rÞp *ÃùóçÁ«¹sçª fD0ÎFÓE|~ts7zúà>Ÿ¶ýü`¥pL³7ùà0!“ 8C¶!9E8D€ÝÕºæ—kj~9ØžØUÏF¯ØûÚ9¥˜Â"=@¼òÊ+>/ë4øò¤V޶¿î>÷ÜsÊæ•Wj½%P FWg"9K_óæÍUÑøÒ×ݨée¥}3µúðç-m ôŸ|ò‰úØ 9Á·ß~«Ç4u¡ßÙ@ t«Ç\ö=zT™ŒÐŒ‚‚1Mg$8N€1±§‚æGü˜¤™í)Ó$_ölâ8!ÿMA„aÿ­[›îŒ]F´“¤pàŒ.svKSð¥Ì‘ãÔø°¡¦f’ qy“\5ì~ýõ×U—Ü›o¾iS}¥<‰Z ÀÔq0µEºæˆZ¤@ 4¹á`KúŸÖ»ÚgΜi·k/oåÇIdØ£b-/^\Múà«3v™»¶£Ç…x@ùèå½RðôÑGU{eíÞ%޳¶ñwOwm4«à³® Æ ´#ôƒL“jæ%$`ûÁ÷{—¨=æÀnþ¾ø.ã;]œ1ˆ›í8?rÞÓlèñ–ú³Ÿ€Ãö3ó›+Ø öìÙSu›sÔ9¿€í ì–¥½¯.ÿóÏ?ªK‰/j½Á(Y²¤½Éúýù|ù¼øâ‹˜#ìÍ£ö?=_趤)çØG@„aûxùÍÙ+V¬PîŒ(Ìþøãv ç×òòåË•=*µ¿Ô±ëˆþ åëÖøQ¡ üòË/«É8PƒÓ¸¦÷!—Õ°û›ƒ>(Üqâ¾ô|a”1 çaw2_PºHá‰Ìù¡Às¥K—F”f›n àüR:ž"ƒ4ƒ1%Ï$_·q¤çºÁ£ðÁ€Ô둞%(t°;ÛWµßæuæ¬m2¢™ Û l|¾é²”m’_ZJ ÁüxdÞäc;­r{êǼp"²æúòåËj†S¾É‘ƒñìñmüàƒ*· *¨uF4üžbáùŠ0ìµhç=üôÓOxþùç•}!íwiÒ^ cqá1Z0Ð`Žø–`Nf1aÂuòèÑ£AûOköŸ´]㋉Л/(vs-î–¬Qƒú c·#mLõ ³"C=Ð~˜½åË—Wfø›HO`Яõ†5|šÅ9rD‡B Ÿ-_óÇK­/µõ~i×}ìØ15 7Åú`ÝñÃFÿ¸Ñã?ÿüseö¢n^þY  F3 ¶l»Ù>Ó~žKZ½Gâ(óYbï•Ò'À¶šî@)ó#ÕüI¦l¯ÓnibÈß3Û(z·  ´ê*ýRÉöaØZ~p.mƒßÓì’ø¢a÷Låʕվù?ú¥Ö—Â/ÜôÁ3»rô¯^_׬™ß¯»¶é‹#â)ȰÁ㵺 ¦—ƒ6hÁî²3gÎ(Í/µ;Ôâ@8‹-ks?»¶œÏsø;ào€Ú_{¦9I{ø2¦C­¸¯¹…âÝÞ]¼xÑÖ*SçQûMA³òI0&²=álllOh"—²=á€g*8Ø.± ¢ F ö0ï=¥Iß§4ëồ '˱8¸— {å~ÊÆÐ|ß|›×rŸAÏGÏKEþ¯åŒ³§bpòØuDä*ˆÆ Û(AÕžIèo–žØàé6wÌ‚×ô"AA›Â/ýѲÁsæà›@çÏ:}ë­·ðÍ7ߘžrg75ñ4?á`/6~ìâLöÌ;øSh¢ÀDÁ¨¤f œòwEîîàûvŽ< •ïºÒ3osÌ·yÿîl\Å›4š„Ðß.] Øu)Ûs=˜37ßÖÏåÚí¿^ž´ÖœØƒãH¨$¯úõë«A˜|wP{ÌßµòtãfäÎÏ(}áoD&9žJ9*B88š¶ÚJÁ˜šy*±ô-žÍ¤4³³'Ûiù­0Ìn†3Äác;дu1ÔkP ‘ùÂm'ãeg9tk=ˆ½Û¯àž–ÝÐ¥K÷t=¿6‡ ¢&4¹“¼EþäD ¿~ýÔG‰Ñ€Š”צ·/üÓ#äÚãÂßµ|ÓK]ø§GÈúqz0 »MÚ_Ó‡.•%ÖÞÔS‹I÷™Ö‚ð·FŶ8zQ¡Í?ë€õ¡÷äš_ÍwßëôFd­7Dø›Ó²oÛ¯„aþx¿üj8bâþÅ#ý OdûhøÐÙûvŸÂÄo·¢{—Ç4;£v%§½1í%iÿË/zþ@Œ\Êžyæôïßß¡‘èÂÿ.eÚo~úé§w# ¶øraÃG¿©QO¿±ô!œ‘ ü3BÍy×ç±ÌHJÂß~jô4A Ž[àX ÁÖ„0ó”é;wÉ’%©¼sJ¶os¢ºØä¸k!æ)éïsšÕÑŽØ<söo;CÎüžìÏ:ù ŒÐ…Œ¦Áë˜Æ /õGRæ8¤½¦éÌâHr^m¾ü9Q»AÌœ¾w²i ”5•™?(Æ¢j)ìR ¦¹]›nÁéì–áW)¿N)˜Ù+ ÿ»üY,ÇÑñäÎFÊ(èÏ¥J6päiÂß’¿oWÅ áïªgËZºiµÿÖÎOG;á.]º`èСjC¾Ø1)Oxœïø¢]>½èAžûŸº,¥Ù]©qæV¾»õw‚Ζ½¶%J”PSnÓf›šaz¡kN=ûùëìôõêÕ«ÕØ)}?ë½™´±ê1é¶….¼8x(£Â'ÃÞCî—ñØ3M3šŒO^wùR4ª—|Cûºÿ:uMóXMº(lÑpß|ÍÁGܧÝR§N”¶ ÍÄÌ ÿ´ùóäÆjá .FûŒçˆše[ƒðO›¿­3zžðþ}v½Îžößc0sʘ0f ž~pžâÔ¯ô6޽ˆò…^ÄG_@Ù/á‡ïÖ Jñ×Q©èkèvÏç¸q=Y¸£üî³PN;§ZÔ@¼÷¿ÙhY÷Ø&ƒ¥¶¼¬]çªØûÏFåˆÞòˆköœÉŸßû U‚ÊÅ^CŸÎ£À‘/Æäñë0ë§?ñhïoqöÌU”ˆx3~üµÊ¼‰?×ý‹m†ãçé›ÔMvlö©ª»&Õ‡ F©7T=lþó :&üŸáoÌÆèˆ<ÿ–d¤ý¤ý±|&lÝ“öÇVRwÏ“öç. n¹»ý±Ì=yÏ#Â0݇­þmºôrŽyÄÐÁsñÂëí±ûø,]7_ _†Ó§®`ÕÆÁÈW '~˜9}j¤4ºËíÐdÁü_^Wæ7®ß2q‰‰¾Mb뿟héüGŸÇÊ%«ãS&¬Ã’ùÛñëæw°zóœ;s ÿì=­ypŽ–8$$3Úu+ÅKæ™Ê㪠góŸ:q½Ò®ï84 \hv2kêF¼úVg<òT3Ü÷`CLšý¬ÒôR³;}ò|3ñ 4lVNiuÍ}‚6›à4íØD­¾vþ µë—·#W ÿt០‡åùODÛ•öZ[.íOê'#ýiÒgd~†´?æ4’·ÝÙþ¤Î=9Æ#Âð¦M›P¾rrEd7*—]ñ™3)íâî'P¹ZQì;ý Êe5 Nãüɨ¾Úô§E¬磞Ȯ ËÕk•@Ýú¥qàß³ê¼Ùšp÷äs­PªLÐÒ~q`«×;Ù¸yyìÚ³IcI&ÝkÍ?H›{ËÆCX½b7²iì¦/|õoaXŽAtGË6•‘5kêA‹õo޲ !wž0ô¸¯. CŽúᯓ°m-Ï¿uNÒþ@k·¤ý±þtÇJûcÌÆÚi¬QÜÕþXÏ]›ÐÌè€+ã·m߈ªµò;-‹QcAHh0º¶ú Õ4We½3Ïй|¥Â†ÇX óiŸ³fÓ&UøÏÞøÔÉË(^2¯©Ì«Ñ´¡©…9Ó ØÕî¡T¹\ؽ{w®¶ýgó|@Kt××ÏOE¥"¯âÍ$âœfa*|ˆðü¼fÓngÕl¹oßN¶÷þF4áoÌÆÚyþ­Q6E¼´?ÒþX6ÒŠ•ö'-:©Iû“š cÜÕþXÏÝCÂð¡Ã{Q¾ba£2Ùófœ2?õiì?ó¾÷(fOýkVî±+ýd~åZ Ô(ØŸ¬%æñóg¯iaÄ[;Õ¡¸ •óàÀý¥‘ÞÅÎäϼŽiöÖ¯ê„m?Åòõƒ¤ÙWÐì…3tçñ)¯þ)‰ÜÝþwYز%Ï¿1%i¤ý7~:¬‘öÇ:£XiŒÈ@ë±w½üc”»G4Ãñ 7U7¸Q¡ì‰§ðÔ³Ýlûëˆú²hÚª(8é³µ…gFô»vÁö¤m~n‹Ö•°ðç-j ÝíÛñøôý懶]´x$Nœ:ä´ô¬%äLþLÿ«+0ú³eÊæŽæ'Uk×샓sÖl¡õAˆÖÊbkœð7&%üÙX;"Ï¿5*ÉqÒþXg#íu.Œ•öǘµ#ÒþX£’çŽöÇ(wÃY³9o®Úrð\—–Ÿ)ïªA•êÅЪ]uÏzÔÂKOMÂÏ3’=H/žšÏ²å ¢¥æ±¢vÙÿiw%|gÉê¼{a²eÕ¼[ÜH¯8w&ä)Í–zÚ¤õ¨¥q¡Gõ¿ýƒg_n£ÊHÛൿîU^<)´ð7¦'üÙX;"Ï¿5*ÉqÒþXg#íu.Œ•öǘµ#ÒþX£’çŽöÇ(wLÇüÊÀ~øpd'£2e(žf 'Ž_BÅ*E‘](Í]¿„åÈ¢MH‘Ù<Ú®mºh ͬ×iÚÎ[¨YúM8?Z›“Üyßt?öíg;1røX»ÊgÏÉ®à«ùæ`·¼ùs¢p‘ÜÅ¡?ašNp`bFƒðO›œðO›ùQyþÍiXnKûcÉCß“öG'a}-íu.Öb¥ý±F%9.£í3¦cvžg|©Žp°›³Cþ‚¹P»^©T‚0ó¡× Ga¦±zånÜße4öï93§¯*?ÃMZVpª Ì|BC;0/9Õ»ÿ]ÁŸ‚nµš%R ÂÌ•Ú{Ga¦!üIÁ8c6)È󟒈徴?–<¸'íOj&æ1Òþ˜ÓH{[ÚŸ´ù¸ºý1ÊÝùR©QNfñwtƒR³8oßìݯ<ן›~×kTßj¾r]\ÍÇÕ黂‰ðwUÛÓþ¶³rÅ™ÂßTmOSøÛÎÊg WPµ=Mâot׆<Ò⃂‚0èýîjquy\ÍÇÕ黂ðwUÛÓþ¶³rÅ™ÂßTmOSøÛÎÊg WPµ=Mâot×1“ðEͤ@gÇ“«ù¸:}g3qgzÂß´Sç%üS3qgŒðw'íÔy ÿÔLÜ#üÝI;u^îàŸ:×äþ¨™4èìx²q5W§ïl&îLOø»“v꼄j&îŒþî¤:/៚‰;c„¿;i§ÎËüSçšãa˜Ò¿ëÜñe$ü­³g¬ð7fãŽ#Âß”óþÆlÜqDø»ƒ²qÂߘ;ޏƒ¿Ñ}xÄføÜÙËX4w«Q™:¾D©»S>» „ð7&K|®Âߘ°ð7fãŽ#Âß”óþÆlÜqDø»ƒ²qîào”»G4ÃF…‘x! „€B@!àNÑ (˜]zÖvç}úL^gN_qyY…¿1bòß°êšñ N8"ü! c6î8"üÝAÙ8áoÌÆG„¿;(çáþF¹{D3L#i Ö ¸Ã€\ø[gÏXáoÌÆG„¿;(ç!üÙ¸ãˆðweã<„¿1wq£ûðˆ0L#i Ö ¸Ã€\ø[gÏXáoÌÆG„¿;(ç!üÙ¸ãˆðweã<„¿1wq£ûðˆ0Lé_‚uîø2þÖÙ3Vø³qÇáïÊÆyc6î8"üÝAÙ8áoÌÆGÜÁßè><" Sú—`LÀÕ|\¾ñŽ@Œ#@IDATùÆWóquú¾AÙ¸”®æãêôïÌ7ޏš«Ó÷ ÊÆ¥t5W§o|g¾qÄÕ|\¾oP6.¥§øxD¦ôïhذöL¸'Ž]Ä'ïÎWÉ­Y¹“Æý–¡¤Çó+¶l:¬®5ßN+±q_­ÂÎmǰlÑ,üyKZ§ÚuÌ|ÒÊÐÕé[Ëûê• 8 ‰þÑ":p.Õi®â™*£t"\ÍÇÕé[»=#þüý û`ru(ü­‘s,Έ{Z©zº\ý|º:}#¶Ö¸ŽµÛþ:‚ŒÔ“Q>ŽÆ»š«Ó×ïßÚ;Z?fm}éb´zGܾ{¯µ–^Fã\ÍÇÕé›ßwFžkk¿ó4]½íN>æ÷âa8>.Á¼ Ú¦0õûš}¸qýfOÝ¨ÒØµó8(g$,œ³û÷œR—šo§•ÖÊ¥ãäñKJ ÞºùHZ§Ú|Œ_Eqqñ6ŸŸ‘ÁßÞ|“’î`˜5ÎŒù³þ•Ë1*‰æµßW w\ÁÓÞrÿמ‚[¡T™üÂßއņóžû´.õäïÀ_Ÿò¶ÆõÀ?gqYÂ2ROiÕaFùkïè´¸ð½÷÷öcª.ì½6­tí9æOüyßy®­ýNìaèȹîàoT>¸VÓ,3Êcs<3‡åÈŠá\RO”pãúM„f F–,!©Ò¼v5á9³"(ÈöoË—¢qGè"ó…›Ò ϦÊ®•!sfÛÓ2%`e#>.Ù³e·rÄ™QŽó··4¬'Ý¡¶ª³ÿ&·à—kÜG®àio9ÿ™SWñúà.¨\­„¿½OKúç=÷ú•‰‰Iˆ¾q ¹"îþæ=Yþúü“·5®#Ç<¬ª‚mµöI¯'w­ý‰zïh¾‡y$ … çÆüUÕvzת“\ðÏŸøOzíåšÜyÂÔX§µß‰~ÌÕk÷ð·~Αଧm{ë¦ãša] ¢@ÌE7´K¿_¡ZÔ@”ÍÿF~¼X?¤}uG‹:ï£fé7Q©èkª{˜_"i…S'/£Û=Ÿ£AåÁ¨Wémtmõ™2Íà5ašÎ­^–´Ò±õØÍØ8-Í»·­×Ùsž3øÛ“Ï FžÈê2ÅKŽ[7Š ç®ãñ>c0sÊ.áio9‰¶ÃqäÐy¼þÜŒýr•ð·÷a±á|kÏýÑÃP¶ÀKøá»5¨RüuÕ±á<ƒ+ÚŠªNñ×ç߈k6ÃñóôMVÛ'[™9ó<⯿Íßѽ3/<9l{ꔄò_ÆO?ü®?zå ½Œ˜è[¦wªùµÎäl”–?ñç=Zk¿æ—=hZã]µTÕd¥wßœÍhü½ýÑï3åÚ#šáÐìà‰.¥,”-ûõ–AùŠ…‘;;†}ù€é’ë€_û¦?ƒ9Ó6â/MÀWÚ"IÓÀ<|ï×è÷XS<÷j;•¯v#P¤h<øxSÓõ)7^é?%µ.äy¿¼¦º^î'¼ðÄDõûÒµ¯Ù/‘‰II)/ÍÐ>Í.Š©¡km½ÈümÍËü¼1“ŸP»ï}Úù æÂªƒQ½Ô5ö´lSµê•r:OóümÙ$þóV¾®÷‡ö@ûÎ5À.cg?϶07?Çù§|îOŸ¼¢½ðocÓ†ƒØúï'ŠûC½¾ÆÊ%£WßúpE»bÎ8­mä¯ß¯5®11·M=S)ëI¿Îkâoí}ûVæÎØŒŸæ>–m+«ñ6ý‡º J#KÖeöHÞÖ®uG=ø—µçúÓ÷æ«Á®½jãÜÙkê=Ðëþú¨V³¸ß·?:—”kh†K•¬ˆ÷ŸIY»ö©Ú*•O™'T«YÂtmÕÅpÿÃUûaõî×@ °‡5ûâå‹w‚*ø§Ÿ¿‡Îd‘G»¾Ç}u±tÁvÓµ)7¨^ÿÛ?x¬ eRÁžk…ÍÂ¥ 7P¶|Aõ[ P..’;ååÚß¿ç2Ê–u­0ì þ¹¹šuJªËªT/¦¾XS¦á ž)óHo_øg…3Ÿçôx§<îüžûw>ê‰ìaYP½V Ô­_þ=«pxòwàüõg,=®Fõ¤_?ñ7zG7hRV ÂäÙ¡K T©^«Wî¶Àkt­ÅI.Øñ'þ:ž”Ïu’¦¸ûfâ  L9†òQͤô`€´?:—”kõj6À®mçS–Å)ûÔ8êA·ŽOÄñ#•6¦UÝLÝjà]æ³'Ž^BHHfíÇZLOE‹GªíóZ÷¾³íÖÿ{ UªTqvÒé¹’¿EF>¶#ü=[aÆß|üAÖl!ÚǺãæcŽÔ` ñw„•+® þ%Kç³ÀW¨H„ꩵˆôÀN ðçX©šr°^…·Ð±ù0Œÿz5‚œ4æÉ‘js£2zD®_¿>þÙs4 wv2pÛ–78"òdÇ­[rëOÕ²bÃ[øtÔ]‹”e‰Ì›¤¹`:´çïj»pQçh‚M kt'Sµr}„……™G;}Û•ü^X7&(üÝÛJVÆ?((/q+|\hü]ÍÓÞô…ÿ¥ Ñh¶iž˜J”´-NpÓN ðçØ©Ï>XˆÉsžÃæ}aâ¬Èž=µ7a7eã.þ¦ SlxD E«]°èç)ŠãºÝæ÷Tµ+±Ê^‰ƒæNž¸Œ{~ù³ÿ2Ì”¶Ât95î«_•Q?Oœ£ ¶hѦ’ÅèoÃì8@¡{Å‚CèÜ©‡WeìTOð7*iˆfzÂÑôžÊßÓÜõü…¿NÂ3káïîz®ÄýÚýÊNž÷>oÖfåf³aÓr: ¬‰ÿÉ—KkUº\ÅzéÂíààÅôœ ¸²bÜÉßè><" ³0:vÁîí7@»\w„âQy1BX÷Æ‹SQ·ü[hTe0*T.‚g^jc˜=m„¿šð˜ØRWëRàÂI6†6Ö&&–΋w¡RùˆŠŠJçLçv7£RwêQ /=5 ?ÏØdtŠ[â•¿[àډ𷒠Oþ.„kCÒÄ¿R•¢èÛe4ꔄ!oÌÆG#ïGé²É‚™ ¨\rJ ño۱ʔ+ˆÚÿz߯â¹Û4'MðáÛ?ãÌé+.á›^¢îæo­<™´¯´}‹Y»ê¿¸9sæ 66=zdL›¹~ýz,Y9ƒ>lk—Ïß4Š”î¡Xmô0GÍç+ÓæAoüjùwßi5XŽBµ³gHá,`_¶Cßܹo~aÅü­•%¥¿Ikç¸2.Ðù»’­-i [(¹îáï:¶¶¤Hü9 ilìm|öU?mÒóªçÕY>úmamíœ@âo~ÿ¼ïœ¹²›z¹Ïž¹ŠÚ˜+gË7æyZÛvÿÁƒcôèÑÖ’·5n¶Ç4Ã,a“&MP¢h=LŸdlª`ëØzž>zÛïDÇI h×äì…&cGmÄ“½âVAØSü­Õ'Я[;îÊ8áïJºé§-üÓgäÊ3„¿+馟v òç .z÷ð´ ¨üùdÓ\šOöS°P„Óå›ô~žäŸ²l†Y˜'ëÝ[oᦧ,›ßïÓ¹øÐ·—¢MËûQ³fMܯðþyð´Låù÷ùä|…¿ðwwû_´D$Ø»ê AžÏÖ‚7ð7'àqa8$$_Žþù"*aÆ›=jÄmÆÕÛôï׳í—èÛûEtêÔÕÕÙ¦/ü…¿áÃáÂòü»® I  ¹ð”@åO?ÿ/ìàB²¶%¨üm£ãú³¼…¿ùzÔfؼ ·o߯×ߌDlü<Ò¿C³Ó™§ëÛ{wÄäï¶¡[çÇжm;¯(¢ð÷l5áï.Òþ¸‹´õ|„¿u.îŠþî"m=Wðw†Ípæ÷´`½ÈéÇîÝ»WóÊ+¦r:g£aƒ&¸q5Æ.DpH¢4çÜζÑM§.=Ìb³~Ú‚õ¿\ÆsÞB½zõ]šŸ=‰ {h9ÿ\áï|¦ö¤(üí¡åüs…¿ó™Ú“¢ð·‡–óÏþŽ1]½z5:tp¨Ça¯×h†ÍQœ={3fþˆÃÇv iëb¨× Ìgk2?×¶:µ¿ÄÞíWpOËnèÒ¥»6q¨×]ø{¶j„¿ðw&iœIÓþ´„¿ýÌœy…ðw&MûÓrgh†½RÖqŸ8qk֬Ŀ-¿#[Ž$‹Ê¥¹ Ö\³ÜÔÌ(”;¶ÄÄ$M{¬_ÍæjŸ夤d¯qg‚ÒÏeJæÇÍ·õczÚæ3Héêïàö­-`œ9“Ç®#wD!4nØÍ›7wùìrwI8¾%ügèH ÂßzŽ_+ügèH ÂßzŽ_+ügèH Âßvz~/ ›£8yò$¸\¹r§OŸF¾|ù”0œ`á£8)‰Âq²t¬ ¨Ü×·™¦ùþîÝ»1cÆ :Ô”ݾ0óm}Ÿk==/Æ10þæÍ›ˆŒŒDP¢D DDD$ôáÿÂß³•'ü…? °=böGÚõ ¸éŸ´?nmð7ó_´3„áà´³ðž£E‹g ÉÇG÷îÝ´_¥'ü=[Â_ø{–€gs—ç_ø{–€gs—çßõü=îZÍõ·(9! „€B@ëD¶ÎEb…€B@! €€ÃPÉr‹B@! „€Ö ˆ0l‹Ä ! „€B@† ’å…€B@! ¬aØ:‰B@! „€" @%Ë- ! „€B@X' °u.+„€B@!D€J–[B@! „€°N@„aë\$V! „€B ˆ0•,·(„€B@!`€ÃÖ¹H¬B@! „@a8*YnQ! „€BÀ:†­s‘X! „€B@ ÂpT²Ü¢B@! „€u" [ç"±B@! „€@@„á¨d¹E! „€B@ë‚­G{_ì‰'pòäI\½z§NBÞ¼y„ÄÄDdÊ”ÉTà;wî¨}Æ%%%©xn3^æûÿüóªV­Šyóæé‡ÕõúùæçòîsaÚÌ_úù,O\\"##‘?~DEE!""B?Íg×Âß³U'ü…? Hû#í¿'~ Òþx‚úÝ<…ÿ]®Úʤ qw¥D;s™3gbccÑ£G;¯´ít>k֬Ŀ-¿#{ø‹Ê‰ðœÁ¸yó&"ó†#SP&$&$Z¥RùÂ`Ðoûú6ãSîS¨Õg7ß7ßÖq­ç£çÅ8ÆÇÆÄkyã쩜¯W×ñ˜Ì÷Í·õc\ëùüW׌RA‹¿w YC2#Ë­+޹€R…ò¡Gûhéƒü׬\†­kW!gR,JæÈŒˆ ÄÞº…¼aY¤Ý{?ÊÌ$ý÷1Hú3ŸòyO¹ÏëyÌ÷Í·y\ÏKÏG¯iýZÆÇÆk¨!Ypâ&pôF"r*ŽíºhÏ Ÿ{þ]º ›V¬DÖë1(¬=êaqÿ›·'4AÚsœ =o:2P\þ{þïü÷ÌkŸÏÚÖ]¾)÷­1ÖëÃÚ1ó|̪^U¯»É2eÉ‚ !A8t¹K–@³n]Ѽ¥ïñ_ùëJü¾iîd½ƒ\…æµÿ±7‘#O­fû¯µ÷ÚZw’¨ IÞÓiîëÛ<’j_»ž×éééûæÛêÚÿò2å£gößÅŒ»‡ `D_ˆÅõ37P0wA´iÖÖ'Ûá¯?î_'Ë?«°uëŸÈ©É=¥Jå×kÙ´÷o,òå‹PrJ‚’î>ÿIxþù;âuz0ß7ßæqî3èù¤–î :ú¦’Nœ¸Œ#GÎkeχ Z¸ôù{ö,fÌü‡í@ÓÖÅP¯A)Dæ Ïà=zþ²#‡Îcí¯±wûÜÓ²ºtéŽPíeê­üÇOžŠU[÷!º@d-V!9|W»}ëâ)$ێȘx¤gGôìÞÕëùÏš<Ç·m@ÛB™Ñ¸DäË‘Õ[—tËuðâ ¬~ü¶õnÝAMíÃ/Oh–tïÓ[O8v3oGãß\ÙÐö¡~èÚÓûùÿ8ýGì8°ÅëA©š%žÇwÛÿóÇ.àÀƃ¸òï5tkÛÝ»zû/ü=÷kæûwÖ¬©8~|Ú·¯Š&Mª(á×s%r,çƒOaùòmšP\ˆ;jòóß¿~' S“µdÉ",^6 º—B«v••öѱªðž«¯]Å‚9;qxož~ê”+WÎ{ §•„üç/Z„¯§ÌÅÕÂu£\=¿âŸ  qû×¢\Ðe yíy¯ä¿dÑ,ÿi<î-š*ô+þW5ÙŒ=ç±'S~<ñê ¯ä¿xþ,3-c“Ð4W>¿â=!Ëc.ãdTa xç-¯ä¿hñ"L[0¥[F¡rÓJ~Å?öz,v,ÿ 'ïà•ÞÙþ Ͻ’uùgÅŠ¹èÝ»:vô¯÷ïիј6m-vト'žxΩí3„áÌïi!£Õ¿wï^ÄÇÇ£bÅŠMÂt]BBFù9ŽŸÝ€ÞhŠÊÕŠúUCÈÍš5ÕkC"Áøî›i GéÒeL <¹Aþ~6?þ¶Iµ{![¡Ò~Ç?($!…Êá±|ÆDÈ•eË”ö$vSÞäÿågãºùx»^~T/œl†b:Á6hºR§pNËt_O_€Ì¹ò¢tïyþ¿úM›ƒ'B"P>,§ß=ÿY‚2£rÖˆ¼t ã—,D–üÿ²e½âÉâóÿùŸãCëÑì‰F(ZÞÿÚÿ,!(V¹(‚#ƒ0uü4„gɉ2^Ôþ ÏýTûÿåH\¼¸ï¼ÓÕ«ûßû7kÖPÔ­[Å‹‡ãË/'"sæìšüãœ÷ïêÕ«Ñ¡CG*p¯Wè_x©?’2ŸÀÀ!í‘=»ïvIÚRùòçDíE0sú"ÜIȦ=ž}!‘ÿ£O?‹5‡®!¼ùCÈê»]ò¶ðÉ‘ ùËcÝ’¹È¯Ù –/ëYŒü_êÿ²ÙŠZ•FöÐ`[nÃgÏ)ž fÅ´%¿ >,&y¶‡„üŸôqÜþ}žË[Ù2û7ÿHÍä£:B1{ͯȔ/e<ÜCEþÏ<ß'nC‡çÚ"K6ÿnÿsFæDÑê…±höbdËÄrÏ·ÿÂßsÍ©jÿ_zVS–]ÃСkò¿ È­™~”ÇÔ©s5ejf§(! ›|òÌÃÀá“aï¡rÍ,x{hW¿ÓÆQÍ™Ï½Þ }úôÕLCæòxòóݱ7©ò¶y"`ø‡åB¦:½ðà}1á"—s6Ê€ü‡½û6êâ,>iï_ÝÂF÷ÌøHmà ú…ЧïX²pAZ§ºôùü¿·PêÐI¼R¤lÀ<ÿZ/ÉãÙ"q¿@ÓOòïã÷Z*Ý^é0üsDä@³Ç£ïý}±p±gÛáïYþÆ E½z1lØ“óüGFæÂÛoßûŸüã¹÷¯y»çqaxÂıˆ*‡Çžij^.·m¯[½S&¬s[~æQ Þuìsü²f¶oßn~ÈmÛ_7¯å@®úÝÜ–§·dD¸êàŸ1ò§ã?qì·¨ó/žkXÒ)XÖ<‡'gnÂék±i¦·VÔù݆ižãꃈϾßk§Žñÿ _ƒ[÷â¼E]}»v¥?åÔ!ì¸~Y]c¾mW"éœLø÷í±lô7ã?vÂXĸ‰f4I§´î;üóˆùà 7W ÄÃÿ3–Mþf°‰ÿĉãQ¥J8^x¡»Àؤ@|áÂ<¬]»ÐcÏ¿9i ÃëׯDZ“›Ñ½Ouó29u{ëæÃ¨_émÃ4/œ»ŽÃÏwõˆÜaèÿr|?ñ \¹rÅÕÙY¤Oþs6ìAHÅæñÎØ9µü{œXô3’riÁÙÃ_­†ŒøÖ#üÏü± }+åwÊ=^й6cV£pÎlÈ¡Ù'¦vœºŒù»O¦uŠ[ŽåΊ×kEbÒÈ<ÂÿÀü%è–Û-÷jO&ËϘëêóm{Ò°åÜ\š@üPæpŒ{ÿCðß|`jt¨fKQÝvΦEáÚÅknÉ/L·Ðð¡z5Î3í¿ð÷,ÿ³g÷¢_?ç¿Ýòð:!“ܹÃñæ›Ý1i’ûß¿)‹ï1a8&&3fGÔSþòR,#ûôñ{þ¬e#¯ù<½r9ÆjrׯÝD¯¾õñî'÷¦:} ·oǧŠgÄMmT¼3C±y5r1}údg&›fZä?|ì¸S­£æ§ÓùARÜM$ÝÖͦIñqàbKàèÚ„ØdÀ–ó3zN–<q6¢"ÆMú)£IØ}ùÏ÷%ž¯ÁÉc’}7ÚHŠ Ný§ ~¯]UäÔkê!ævni¿ƒôB´ö¼_3x¶okþ,™Ž+B”æ3¶]ÍÓĤ ®HÞjšä?mä(ô Éeá'ØêÉNˆŒIL@}r{a(’5;ê\ŠÕu}ï¶Ò‘ÿ÷ÓÆ£~Ÿ:jÿoi~ñqÖÛçônâVÌ-‹Sb®Z?$%&áÚË÷‰ù…ôaîŸÞü·oÞHÝþ¥<‡ûy‹D¢`ü˜<Õ½í¿ðO® OñŸ3çG¼øb§ =ÿÖž#ÆÅÄÜÄ­[ÆïWKyüÚµhSr|ž/_vý;×”¡¶UPüV3f¸ïýkž¿¾í±‘"K–.B•šá(R4^‡Ö#?^Œé“7àš&à†iݯßMy ¹4¿š}»ŒÖ„Ú”Îûvþ ôþ-ZW¼Y¡Fí¨P©þÚxHk˜ûãÛ/Vbû–£ÊÅØê»A‡ÖÏ¿Þo¼ÓU•mÅ’xã…©¸ª ×u–F±|RϽÚΡ²óâv«âW–àèÑ£ÚÃåpzé%0ÑbœÊRaÎÑJšçwfÕ¸°q¡ŠJˆ¹Šb=^Æžaý´õ+8µä;DÝÿNkšãÍû O{Ôy·,Çå­ËQ®ÿ(µáù8µòÜÑ„ˆð<(ÞóUä,SË<§ng/ßKÖŽCŸîá¿Ts¡V'[4Šå.æ”û8¤ùòmñͯ*­‚ïÎÅŸ/µUsôøavž¾ªâ+Ì…ùO4CžTéòì‘ib‹æ$ý¢&d´(3njm¯ßÒ7ÍÞŒù»N"8s&4ŽÊ‡É4D~mœ3C·Šðü¯«p´Ç½nyþ—hv²eÏ]C!mBW…NÀ®WÕ„ë.ŸC¢öq÷d±²x!ª"ÅÞ@¯­k°¹q'„j^ìވƹóáÁ"ÎamÏ}µ İe+qô¾Þná¿Hs¡™³lä)d»V~ÅÚó±‹í3°{Ý$i³}¶²-º¾ÐgŇ½>ÁèÍÚü!øõ€1¨Ô¸"Z=ØŸÜÿ9ÊÕ)ƒkváüñ (Y- íoŸÞŸèËÑ(R®0^þþy“?ã-š_Ô¯|‡øÛqZóàé‘£x¥â éñ½ÇñÃÿ~ÄÅ“—¬ vmù@3UN@0ü‘Q¨¬å¹yÉDU-G†>hS5TmY‹‡-×ÚÿîÂ_#æïü—.]¬yV(†bÅœóþ¥@Û­Û`ìÜyP=o•+—ÄÂ…!Ožœ8}ú"J–ì‹ï¾{¯¿>F¸6Ÿ~: íÚÕÕ\­ÒÊQ?üð& ‡ï¿_¢®çu#F<‹ÎjnÞÞÕ&ûÈñãªc”‹Š믿~ ½z9G«Ý½{C<ûìX·É?êFRüs¾J0EÖv9]ñêß¡K/ç˜G=|ã¿Y_7Áž#ðij­ðÑ๨P¹¦/z 9´÷¡‹_i³×eÓ´ ÷õ¯xä©füaO¥ý½­ŠÉJ^2Úv¬†ƒFã{aô°eJ|êäe xø{¥EÞwú tï]3§ü©}‰%_kí>í‰ ÑÜNµëV‹—Ì³ç² KþSç/G–ŠÍ2t}zjý0ò5èŠÈZíPú‘¡jú' µ—þZŠ’}ßFx©JȽ£}…š‚¦5KÒÜ+1\ûg3hfQêÁ÷Pãƒ%(Ò±?M„øÉ6”¦kœ¸‘Ió ]´.fÌ]àÄT­'EþkÌÂ}• X?!±¥µ{îkZæóöÒ>þÂñÝQ\3Ã96¤Î}ÐS ·#ÖìO•ú÷ÚÇ`¶`œ|·»Z8Ñ[«ó^]° g¯ßÄž7;ᢖnAí7ôàÔ?R¥áhDHæ ô,Š¥sg;šTº×“ÿªé3ÑV]4©måÅÓh¡õÔܼQÂ/µfÔHSH®Õ¶&Fn†!saÓâ-ø}öS>«~\ƒæ÷7EÏW»™ÒKo#³Öþ—iQóÍMïT‡ ÿÔÝÍíÚ¸ÿ~ç½ÇŒYˆ% àĉٚîäέ٣Ÿ©n”¿8Mî™0a©&üF‹5´ýx|ñÅl ÐM¸×œÄÌ™ÚÇùæïÔõo¾Ù¯¾úú]Ýw_Küüó:ÍóCòûyõêmÚÌ÷ѩSÃÔ 3¢½zõª‹¥K“•hLÆ¡Ë<" oÚ´ å+G WDv‡ ¯_ÌÊŽÕ©©Çå‹Ñš¦¶-f/{E?œjÝ­WÍ•X «³ÚÕ¨…ûl¨º.xÃáç°xî6%\÷ìSOs}Šoª¹„rž0Ã|7/]{6i¶õn;žãŒ@þWÊ 8[g$gsEÚ?‰œåê‚þ~Ó 7-BD•¦+^Q3©¸¥]SYòƵýÓºÌác94!}ÕŸÛÜ¿ZŽDDdK›ƒ£7ô@­øªg•Ìþó×Õšû4mhÊ@+?^À²ýg¦iº–iÏý³Ë)ÓŠÉÆKÍ+ ¿6^|â<ߤVk¿#sŠ”i۳߲L~ìÙ¸Ö-üKFßFÎ໦$ö”Óžs«†G {ÁâÊãþB%Õ¥GµÉ_¼1ÔÓü>ï\ý›[øG”̉ì9íoÿ©mmؽjŸ[ü'Lœ;jÛ˜&½¡XÅ¢È[4/ —.„ê­ª¢xÅbªej•¶4× k=%çÊ— žn§4ÏWÎ^Õøh“fh‚uë‡[*A!," õ:ÖÆöU;MUZ§C-´èṲ̂e6Hg£|½rØ´Ó=í¿ðO]îä_½z¥mM]ŠŒÅôë×ZijyõþýÇU[¿wï1‹Ä>ùä)M\Osá–üÞéÓ§¥¦í®f·ãôοÿþ¥ÒT9rœ ãÀSªw¼K—FHÔ>*)3Ì™³V\›™Ò±ÈÄV­jbï^׿ŠltÀ•ñÛ¶oDUmbg…’Z·îèñbì—«ðáÛsQ¾Ra |§ :v­i5‹ŠUŠXgdÞüw§ý¤¶–öœ´;>yü¢J峸®V½ä—›E¤;¡š Rª\.m†–ݨ_¿¾)¥}éš?6#.OIÍÓ¨{CÖ‚¥ 3¤æX·/ŸAüÕó¸q0ùǧÇß±ÑÖX?ßÞu&ņt9ÿ®C£¼®ÿé¼÷—ïÂÍŽ¾bœZwýÿÛ;ø(Šöÿ)„„$$ô@M¤7é]颢â_,XQ±¢€R-(*("ð¾ €м4©Ò”Þ%ôj ôÀž‰›Ü%Ùäîrs%÷ Ÿåvgf§|w²ûì³Ï<”&D¹ ¸‘ )xé×½ÒLâ~ñ’÷xKOãž•#–íÂ\ÎYÁÂü(69þVæ=ÝKâ^ß»ÊùË,×Ë´ Ð#‡7i_Ý î'Bì^"Ë4"‡*nø¥Ä0ÁFûž¢}!I™Êùï>° ëYvÿ7\–™´y%ÄÀ$­oI1vrZ  ¶Z s+V7hƒ߆ö¿uZÔÖ²"¸N¹Ÿ 5Ê©B+6aÀ'Ùé´\§röqÕ{ôŸ/Ù™òÙ!“ ÿ?æ/Øgþ‡ïCÇŽúÏÂ|†F¡Q´äñ¸q?àøñ‹b´êòE\ÃШ‘qç˜c‘ñ‡ÎÃÿþ·C,ŠQA¬—c¾GÂóàÁ¥Ü­[ ,_¾Ch‘Çm•}OaÞt¯XuUµü£×XõOä|j>w> ƒžn—OŠeQ‘×ãЪ]miºpëF‚p•¶£^_„®40»@ƒg¾Ñ¹Aâ³óî\®¨Â…yFpµ@£|E=¸·A x#;©T>tü4J5~´¨M-Úù¾N|ÃÌ.ƒ`-xøSŠ&¨Öï5- )7.Ã]Ä«É~ÕðωSJùŸ?~Ûç<˜Uô‰¾–pûtËšØòJ7ùR÷Áï‡qúF|žêÎ ¡ùà 1¥o3üs=ï®:„‰á‹_&=Õkf iâÓs˜ðÀRÖ|­^žŠó‰hà†3'Ž+åæðat^Dlôî'd_JÁÐ,ârÊmùÂb‹véÕQ+í.Nÿ£–Ø™0´ïfÙËþ¿Øò4_ãyW|½ÐÂË7¤P ky´ã‚~£#b ‰ WN]•Y+••Ú^òñÙæIÙ>aão% -Ù:ærAµqò´Úû?ó׿ò¶àþü)¼ôÒýF˜™B÷ú^˜ŠaÃzbÛ¶iò«ÉûïÏÁ©S—L.iúôßpâD8®^]*æ\yãàÁÓÒ4B+`èÐðè£ã¥0 Çdj¡"4iRMÈ?jŸ¿zí¶z$WíéÉ(è“+Öòã‡Â1LLŒ#¯AåËàþB³G%m+Ù §ˆ‰@E »×Cر«øcíQyƒ]»ò˜x—eWY”rsŸ[5$—…Q•!NܸÝKû©¬BhlÜ‘™š¤[‡—ðëwr2…׉´¸ˆ9²5;¯ývˆ=þ—€)2þÌ~œ˜>4Ouð,[aç•V“™œg›µ+LBk¤ðˆÒ2$P —b„÷Š#âóYެ]å”ÍaødÓqdˆOa + YÕ²R(£‰vík”Ãla{œ þ~’…ÍØ1þɱ9‚EvE&ìTBöµs§LÈiy–´¸]{†ªÂƒƒÐkbýk²n\EDjŠ=›$ë®âåK'N*mG²ø›'ók†rUƒà&ìÎiâ…‚Ì, Ûý)&Ï¥K[âÍ ·¢n«:ð+ç'&ä݋۾xÏïûäs úZ4¾}i&ö­=`iUFçU ÄùKjïÿÌß¹Ñ-øgfŠI™b‚šµiu##cÄÂõ¤ |éR$–.Ý&M%L­#<<¤9&A˜æNM›ö›<•m ;7‘fo¿=$»‰¯H*Ù=_»¦öù«×n»h†Ky[·Z~g|¹Mk¾2ˆ‹MÂûãÀ[|ƭߨªÔÞ6©ñ.œþLC¡ñÍî«É_>†×žÿAÞ4®½„°mÍà-ì‘o'&X³Èž%1wH™å¿µÁÃÂ?dâ ”Ÿ¤k7h „7 U¡´h÷mÅ>^s Tõ¢ðr½„‰aUkaìéC˜zþ8 Ûâe >Û^„’¥D»c-"Mi”»—uï™T§‡ð«ýÀ°n˜?ö',›ºÕ† A‡z¦4'ß<„ Å{]F‹Wwá$E˜õŠÌGöÆOOz Ç/ÆŠi«3­ú´”uç[™‘žÂ%b|bÞ¯7fS`væ¯Çü½½­;WÁ[,_>zôPáõa<‚ƒËIEÅÈ‘ƒñÑGó0þztïÞB¿Ãÿ¦Pþ‡þuë>…„„$Œûvî<†'ž˜,Ì#&Há÷‰'ºãóÏ—3‰I…–giZŠúömµÏ_½¶•’>º"½ìÆñ¿ýö›˜U˜„'rôæ»ObÒW’˼dêÆÙÓ‘H¬«æÑ\E‹OÁ´â›¥ü“Û¶ÊU¤«¶Râ¦5D¸möbgôìc½Oâ3õÌÏà«©³-mj¡çuzt8ܺ¼Ph¾¢f Âwï {>Oï|‹";áô„[ð È"bzü-©5.U!%½Ô|–Ïݰ´ø›¨~n ÿgFî$«z¬¾íbµò *ˆ&ºE'¥¡Æ¿c?ZØ;–ö•¥s½Ä‘ašdWQx^©škbë¡N¦´ aÓÚHhŽUi…©´rÞǧKà‹9 êV‘ÒFtíQ>ù¹"lÁÉ é /e l‹-(Æj§D‰Ï…¼1íç…V+3wAOŽx}FõÊm•còíK^$|Ålú¢² ŽŠ ƹÇ<¥]?¡-.+Ì'¬¨¾Ã cö4u÷毵lÁÔ¨0sæ‹ú°0…Ü«E »ö5*ËÈ_0™4€iJ ›ùS§.£NªpÏò8Aé*TÈß3f,6ÅÛÅDº¯M)΢<änҤ߅Ðý­Yç;Ó§O7ëœ\™—Zÿ=W ùzäzç—ÇÜ8ºYÕ©[I÷´¢ÂThÒí4tk5 _~ÿZ·­-¼KÀ?â³ss¡1¶v Cr•&ŠÙ"æ5‚Ü™é ÂÔ>¿ ¹Ù¢­†u¸+þ„î‘ÏdÃú­¹O“Ü 'ºåö1¬Õå#´u-tìßii}á£ØVÁSñøô(YÒV])´ž2ŠûZhòÉࡸMîêî?ÞeòñΧ›…Fy 3¡Š¡ù¿4QZhÃê…–aI…|¨=̿ૢš?™nªþþ¾bm…œ—@sM1Èô&ßiä„I &{âo¾Y&}kéª~Uó×k·š«¢WÛ¿ñEPFR²ºäòb6þÔï†â§y;ðáÛ¿à^aޱ`ÙTP $(çcùÇu€¨dÕü-þã@ŒT6å®âidªËWÉÆe+ÿ|ÿ)ð22ÿñ(OTÏ_y¬ZÙ ¿þºX-uÄ@›5õÁ>OH»ù?9©‡kд©ÊùèMÉVÝ1')_5õÃNZ§™d߬2¨._eÛmQ¶òñÏ÷Ÿ/#ó/òDõü•wÁª ¶}ûÔ™íäm¬ÚûÞú²bÔL Ô«íßxÕo^…TïÐÉÄF9ÖÌèð·Ï{¯~—)…بÖܪ.ß‘xšÛÉ_ñýAùýÍÜN;P~B¯šêò§ÙM± ³›å2'dMûS]¾sο•’¿âûƒòû[þ]sŠXB¯šêò´N#mÃ_§rŽþwìÛç ia˜ßLõG=±QÎG±æG¿wNbþöyïuö¢‰R3)ÿW×^Ö ë³•üß”ßßô»çð)„^5Õå;<ähþ4ÀÅ“²Æ¦}žv†ùʹ௜bÍOÁ½süTÕüíóÞëøÜµªÖܪ._뇳þ*ÿ|ÿ)ph0ÿñ(OTÏ_yœ¼ûŒUËö+»ð»vœÆüÿü©[þÄÑËp9ü&þúó~þa§ÜÿtÜ Ýü¦&•O¡õ(ÖüZ¿ƒgPÍß>ï½Ý yª5·ªË7èŠSî*ÿ6¾ÿ$Æ$ââ?áy®EZJÎ:cÛ#6*Ö(=3#—Â.áìÁs¸“©ÖÕ™QÅâÀø[ÂGï:hýOŠOÂÁ‡´C£ß«g®!&"ïÌæ;wîÈkö÷ $'&cézþ–¶¬ðónÞŒÃÈ‘3šj;בkÖìBddtá39‡}žvñ&‘ž–a2–ü2n\{ÁÕqìÈe$'¥¡ßÃ÷å—­ÈqTþ– ÿàéáó-ëןw‰º[àÜ™Hü½ýšÝŠ¥?ïÆä›ß”Hz+MKK7%«Åyîd¤Ã.oA·Ø†' þéjo$éâAË!¤HãSeHÏdþz|‰ºbþéj¯oî¾ý:e¢ñÆœW³“"ÎGà«g¿…§·ði-:‹aŸ>…–½Z 16_‹´kg¯£bhÄ݈Ã#ï=ŒvÛdŸ¯j‡”æéŠù•¿¥|ò»†Ž[„“»O¡yf†ÑH¹"®Ç70²:<Ü.;-2< SÿïkU ­k·àææ†Ñ¿¾ÿòä«Ü²` þiE” ê ÁœÂ;ô—¬>üúëV<öØDüñÇTT¬Xä IþQ=þõia8Ë2P¯I…Ç—)ã ßR(S¦J–4_¬#àW/G#¨|x{{æ[a|\þo™B¡?’ÙçùøzÉöøŠöø–ñÊŽ·d'=-¥½K[rªÉ縹ÙçÍËäÚ1ãÝÌ ”.­–¿¸kÛ±‡Ž]uZÆ1þÕ.ú îŽMÍz­Kš6oooë˜OI%lô*¾õç?±{õ^\<Žúíëµdù׫РC=<=y¨Œ_1}5Ö|¿N Ã.Þ/LZ7傃°ý—X3kÚôo%.£‚¬|™.î?Îß\>] ßÎeãÜÁóÚ¡üMJ¡ŸÆ-Æé}gäËŒa"=Ãçù 툾¯öåñò,ì^µ>÷€aV³ömÁ߬’9**eË–òH–(\;v|[ÈY9É$<“Lããcþß|xxFšR¥¬·H½(¨¾ÿäôÞxÏ.Oå”ä¢i†}„ÀI¨>ÅïOóv Ë}²{öÂÐ9èÐä£ìãßùãF-•Ç›ÖC£ÐwÑ»óg¨[i$(-óßÏ`ƒüß|±][NùÍ>Ÿv(ÏØ·—àžŠ#Ñ ÚÛxÿEÙŸÏ´v€N[Qiº}„T•Á-S­æSeÛU—}'=~jù'gÚæ­]5+å' aÀÇÏrÍŽ)mR»¾£)-pÜ<)w2á ´©E»ÿ›Ú¸ò!å¤&‘„ÞÜá‚[õi™ݬ{\?!´Àñ €nÿ×U ”¡\µ ÄFÆ!-Y½F;-%~¾~ÙíR±STþæò)è:Pÿ".DÊ‘Áï4ê®[ 7Ôn^ ½_ì ß²¾Fæ#‘£¤‰KÛ­å9žxiúóh?¨­QæØ‚²ÆÑ–-Ѽùp4h0L²=1yòBÙÕ ®#  XÅ6Yø2/¯Œ¶þýÇÈ|ññ·ñøãáïßGhtáÁß Ö¦†LñumèÐñÉ'Ã¥ m-˧¤¤QžÚç¯^í¢öô(è[‰ òÕkWño¼×•« ¤z9d Mýq¾÷ÚÏˆŠˆCùŠ~Òd!év®íoUaNñçæ0ŒÿìЂ$(Ï^8ônŒˆë±èßí T¯YÏ¿r¿x»ÌÀœ›ñΘ>è;°–ý²7»ëVš‡0wñKhÜ,„½plLÖ­ÚÖFÝzUP¶4¦|óDö9–ì\¹t Õ‚ïµäT“Ïñ/] 7nÇÁÝG­Ðarƒ(cZL$ê7¯®´Eî¥ýpëv*‚|ŠöAi#íTx¸ø›ªÒ¸®ÒÚ½üý›˜†ü¿ )­ÜÁ ¿&Ý©§öþSÚ«´4Eð °ìþo*†Ȭ7¯ÜÄ¥WŒNû|ÛÇFÇ»Vî‘‚—y?ô{­L‹¼)ìQÏcã¼Mèøh{”²Áßë­kѨRߨmÖ>(*sùt2Ä3÷¿ïü€ÇF?‚R¥ï‡%Å×׎´—Ýß0÷# QÂD"°rYìY½ýoü‚Ê mÿÖFfF'˜x` þîî^¸u+AA–?I#ûÁOÊÅ;>‹öíG`ذžÂ<ââânËÞΛ7*ÛärçÎc"ïx ž5¶ß|ó;\¿'æ#8¸^xáK<ñÄdlÚô%Ξ½Š½{OäK¬uëz¨U+X ßÕ«Wu7¼öÚ7ùæµ$2<<Uª¨}þêµË.šáš5êáôÉëzm*4¾NÝJR+\±²?ª—E5!×q»ÿ:ƒ“ǯ Øí:×Å.aÇK/™DÐñÊ¥ûQ®‚Ÿ„©’J•0ðÑ–X·êpvý…ýñ°ºHŠìH±ó‡Ð(?4 ºöh ÓÞx¯WvrÙ@„ šL67+Ú…U°Ï¡OŸ¶HGüq=Þ|s0*T6ºB Ò6ÇÅ%âäÉK˜;wm¾ÛéÓWð×_ǰpáøî»7Œê³ÆÁ1O«NµÏ_½vÚE3ܼYì?¸mÚ×Ñk—ÙñÝlˆÝ;Ïàæ´ïtÿÞ hf( Âd×r9üš· 5*»jHÔøj‘õk»F¿Û7ŸÀ„ÏÉŽ«U§"Êø•Ê>¶ÆÙËœ?‡ÃZ£8Ý2º¶k…õ?nj˜wÒ-°˜$ÐÄÂÒ·#а¡ZþMÛv»ѱf1g¥n¤‰/<'KàYÅü[té„›w€„7¾piB«tÉ«¤òñߦE[,Ùù3ê´¨mÜíXú–M]Žf4Ÿ•cààcÔ‚æ"ž6òd0qÀ'hб>4-§QF+–4îR¼Óð/*Ÿ G/bÇÒxjÂ8²õ®ž¾*¿òÒ~ ! û•Ó7¡Érû„@W³I á$N”sýFÕëLàtÅ+±õl´élþ Å\ƒxñòãçn½ÉÎ~ÍöÆÝD“~ÝlÂÖÂïA®´JûYçþo.û?~ÜŒ ÂüaÄ÷/KóÃó§>= ½†÷ì²Ì‚ëT q>R©0|jïi´nb›ûQø[‹iÚk5«…¿Wì‘øi<¤ {rÒÆ— ì] 0(®‡‡§;J AP ÞEœ¯cKþ¿üòƒ<,0JNN•s˜–. Í ¶l9$„áÉèÑ£¥Ðªæ(óh’áSO},&„{aΜ·5LRLK–|”-“ JÚêŠB°=ò‘_ !¸^½©‘&­4…ÔÔt¬\¹žâzE¦~Ô¯¯þù›_¿(Î.fžžž¸¿K_¬^vD¯]fÇ·Zf2‡ ’4ÎõUÅma—I¶¾š0ܽW#œøç*È5…˜èÛØ´þú.Ü5[‡cÕÿøº€BÐÞ&˰ÖéâÆ°aå9ôyÈxµÊ7,‡ø?9 'ROl7Œvé}ò"á{e† 2þTª ñïÜÿQüz@ŽUCf~8Ojl.#L!2å¤:š FÜbÖ¬UHHH ×£GÿÏ>;E~I§òIóžßFå¯[÷9Ö¯ÏÙËà³Ï^ÈÖ<¶ÁÔ}2ÕX¶lz÷îgê)VÏgÍ0õâ¡Þ}1jôz\½àªEî¹:ëØå^\ÐȆ—BaqBØ“M1…&bbÔØÉñÜY¨ˆ[71à‘–xäÉÂýGŽÕG]^+& ›a_YWõYåÊ‹øß†ß¡~Ý6 -bI¦> o]™Ê-üIDAT,]³Q±Qð ¨`ÚIÅ8WÒ©]ܾ¹Íø÷îÛcÖ®@¯˜Û¨VVí—g¸l+ODâžvÝmÆÿ¡ýñî²ÿáz|2*—òvDJÛ¸U¼4êÛÃfüû>Ôëß]‡èë1r"”ÒÎå*œ&ÔÑ'õ%/•›aòÄ5¢ËŽøöåïña¯ ðñ/ Zœã±#´aÑæƒÖ“{ÿØÖãhÓ¨­Sð/ŒÏïß­6¼­¤-pî~ZëØKh;Ÿ›2 ÿ}ïGl^°IB¨kÚ­ zZèVÍÖü{÷îƒ1cÞÄCE¡Z5óž¿¥JyÊÉsíÚšÔêRÈmÓ¦¾4…8þZ6âO>ùI~¯SghviuÃÂæƒ&× ø!ªV}DÎuªQ£²°A#óQY´Ù2¬X±Khµ›Ùlüç×·B•~7¿Sâ~ûí7$%% ¨–i3wîþ7ÎÁ“z(÷ßhØ2ϸp. !¡åÌòhA¨h ïÒžVàµ6‘ÉÅŒÏ÷cò„éÂg`Y-Zù/ñ5c1Ü;üJ¸°ïÛÔè”;¹ ¾ýÜæü7ÏœŒO;‡Ùn)¿ðVÁE± ÂÇÿ¤bü7ÿ±9ÿåc&àuߊp+‘c;ç`x”7çjJæûÞÅ'?̵9ÿ9ËgãÁ×»Ùôþo PZuŽ&i¥ ­Y…ê•z’¸yõöÏ?„iŸØþþo)[ò)èz‘F÷ºX@¥L ¯Å‹mØ“ÿ–-K0eÊÓÿˆˆhýoãÆ5…)„ùó—ÈóM–#?ÃÕ4r]Wsk§Q&N\ñã-þŽ;Ó§O/JÓ–ÚÅLBkq‡P½j+,þqŸe“_²SnÚ"Ô,A˜FŸjßSɪ‚pbB fOÛçŸyÓ¦"êñܾRŽn¤C— ™©Ið8ºß~Å.ü+·ë…¹‡sÞæ]í"$¿ªSÞ°·ÆØ…ayü WÞÝßÛÂnzaf^÷¡]ø·ªÓ{—ïÏn£ì¸ Ï@•jTDHý¥‚0­®¶ká^Œ|Á>÷KùÛŠOaãܯU­l± loþ•*ÕÇþ#&³[*U ”\KaªŽÌ ê×Ât-» Âd¦1eÊ áÎöÏßÜÈí* Scž{æEüs Eø ^œ»mÅþøvb &Y‹º†çÍìÒß/ ǽ¸†k+¾¶Kýö¬4SøTMÙ6o ío7þϼø ödVÀKËÚ…]êN/ÞÛrŸ|ÙnüŸñ*ÎÔª‚ þ± {Vz[ØÉ{ ½ÞxÕnü_|îE¤œIÇ¢ ¿Ø…]êNsZÖ|½Cz=Îüípÿ3Ï ÇîÝׄŸß¯ì@À¾U’§‹wÞ™+ìŸûÙmü°»0ìááo¦ÏBù€úX²`¯°q±Øjð_¿K¸€Ôã<þÈëÂnÈ~FãÄÿÇÙ3ѳi $Ùè2üÓcqeÞÛ˜òÖóЯ¯ÝÆ ñŸ>{.üwįº ÿâE°Ëœ¿ðð›ãñP?õ“õ.0ñŸñÃŽ¾:<ÿÅÿ™‹3Û¶£UÊ]4ó @ §—JDJË/»SqÚß=žzý9>ÿ‹àð™CiŒšÍjoÆÂƒR`V.<*üÎì>‹±ºhÿ„Y–ãßÿ™¿eƒàرcÂçîgØ´i“ðß›,_æš6mŠ‘#GŠUÝú€Ì" ôüýõןqéÒ ôìÙHú&?ÂÎΞ½*üÄ—„}po!ÿXÿùk o) kýòåËØºu#öîßoß;¨ê?wáÎ-Yx‚ð‘³!3… Cå™Ó1itîÜɲ?¦cCSäÜÇ´$¡–—ê6L7Ü×Ò´² —2Ôl33ï"5%C”áŽëWq%<e*£}ÛÄ@P¿º–ÆÎ¿ÄÍÆMX¿íoÄfº#ݧRÜJ!%9 î>þ”°²oÀ0T^rylŽ MÁó䥆¦îki”A»Ð'CVw©=i(%f{¥DÃ=ñjV)=»¢«òߺqü¹ e2“PÃ× e…Æìvr ‚„szrvÇp`k(Ä/QmLDç»kN^*@ËO¿ZÐꢿ£ú›ôðÂ¥$àbB&ü«„ Íƒ}Åøï¢|u3­=Öø¥ñ¿yí:ìÙ°^ñ·Q%ðþé!àáY01Fï zý•0#/•¢å§_-huÑ-/wàæå…(w7\w»ƒÀ¡è$^; “Õ«[jí±Æ/ñ߸y#vìÙŽ»^wàWÅOÜwÜÿ$øŠ•»Jˆû¶ü{7àu£dä-B»é'mŸZf|¬çœ6¦îg«•m<þ³Î&`†XEÍÃ͉Q·w=•+ãN=œòþÏüsF…ÞÞ?ÿüƒ/¿ü›7o«ÊÅÊlU«V«¿=%4 /ŠE.ò®£@ã$<<5jÔÐ+YòÏ&!DîK.»£fÍòÂãKiéζ\9!ÿ”+ÑûòþLcT“irïÜÇy埜gGî¼t¬•m,ÿduƒì¢“Å@’.‰5.\¸ÿòÂëE¥ã¿Ø Æ£äÊ•+¦æ bbbpíÚ5±âJy) gddÈ_-/ 2º`´t~TK£|äb„ÎÓ‚á±á¾–—~µz´º´s)ž–AAA¨X±"ªW¯Ž€ç}«ÓúÅü5öùeþöá®ÕÊü5öùeþöá®ÕÊü5+ЦaõêÕ˜?>öíÛ'Vº½-«T©‚~ýúá­·ÞB¥J•rNȵwá¼ôÒKRž9räÈD¢° Š? òK–,ÁäÉ“³›`(óîS:¦àhò5„ᯂìºýÿ£7-Ú8؇ó·w­V毑°Ï/ó·w­V毑°Ï¯+ó'ÅÙ‰'ðË/¿H!øÜ¹sRÑF‚aÍš5Ñ¿¼öÚkùj€s_­¹sç‚·ÐÐP,^,¼2A¦2Tñ§¾]ºt  ÈÝT—;vaØå® w˜ 0&À˜°9Ó§OK³‡+VàСCHII‘m ¹>mÛ¶Åÿýßÿá‘G1ɘN¤¯Ù¯¼ò ¶mÛ&í‡GíÐó&lÜ*daØ.7 0&À˜°=²s¥‰oÿý·˜èµÞÈôZS¹retïÞ] À-[¶Ì60µ¥¤~ï½÷¤içÆ­êEÁÔ6p¾Â °0\8#ÎÁ˜`L€ 7nÜ®ÎÈÞ—4µG•vÀÚÜ¢Ò¥KËÉ^ƒ ’îº ²ÿ-ÕóÆoà÷ß—6Â&L€··wA§pš °0lGø\5`L€ 0& †À­[·¤°KÕvíÚ%…`R)hÂ/ ¨íÛ·+¡=$…à† fO·´Uäc˜a¬IîÔ©“¥EYå‡s/°at‚þúë/¹úÝ?ü€‡~8»Vz5Z$Mª{öÙgåÒÑ4¹ÎU îr¥¹ŸL€ 0&Àœ” i4¼9œ?^j:ÉÖ—4˜‘‘‘y\©’€Kö¾Í›7 ½Íš5CãÆ…¯Þ²f òÀ¥÷Òë…?þø¯¾úªlÇÒ¥Kñàƒêeµy4hÐ@j{ëÖ­[d]2#1b„¬“êüBbb"È;Ä?þˆÁƒcêÔ©&¹Y˯,UqäÂíõ×_ǘ1cð裂wz1ȾþúkÌž=[ò}ùå—s'ëc†‹õååÎ1&À˜€ ôiž!Zt\oiÅÓ> R$¼Ñ§hmŸ„>CM u´Ñ§jm+Y²¤ô?KÇ$Äh-åKiäÞ‹öi£4:¦ÍpŸÒ¨\[ê#-6Eý¦_Úâãã‘`´‘ ½´EEEIá—„\Š7ä’»ÝÔox«U«rIà%¿µjÕ’«¸QÿU„3fHÍs¨ð Lõç;wî ÔÏ 8´¿ÞaÆÉÅ5èÚÐâ ÛÄäAðhÑ"Œ7NFQ:-æJ…aWºÚÜW&À˜0"@‚ f7oÞ”ÚGí—„4Úh‰Ý¸¸8¹Ñ>å'!Xoò‘Qáÿ`KýæRIÔ„dMó™_æÆQ}†B³v¬ ×tœ[׎µ6iíÒ~IèÕ6ê?í“\X»µvPÿ©lZÅÍM4£Ïø´¸„&ä’àK e*TÈÃÍ\ææ§å?þøcyÚý÷ßot: ”äbæÌ™èÝ»7¾ùæÙF£Lv@¶ËÇ ø4žûôé#'ùQ3ÉåùAÖMþsµÀ°«]qî/`LÀEÐ.7š DŸÛé¼áFy  f¤¤-((þþþryÝ€€¹O“¨|}}áãã“ýKçxyy¡T©RrÓ´·šàiX¾)ûš&™~ 7M¥_Š'¡R‹Óösÿ’ JyµshŸâh#ÁT|µ}j Åšà®í“ðLýÑ[ú¥@`zi —z© ¶šYƒÌ þ#†¤]%Á6$$Äh#˜X:Zxûí·³ö:d7&ç=÷ÜsR›ýý÷ßãÉ'ŸÌNsôZš„aºöth5< Ôzá¡kN6Ödnâj…aW»âÜ_&À˜@1"@‚M¢Ò6²1%Á—„`ú¯lƒƒƒå¤*Ò>Ò¤¢*UªHA—< P: À$ÐÚ;hB4 ØŽHP¦‰kaaaÒ[yl %Ši"¥‘ÀLB-™-mm5¤†—~I¦—g k×®• phm¦±B/Ÿ~ú)¾úê+é*mݺu²ÏZgø¥kD“i‚½iúFÂ0môàŠ…aW¼êÜg&À˜€üüóÏèØ±£ÔôY¡¸‹¸zõj¶0F«Hø={öl¶û,bI£4y¤í"-$ côëlY0D" üß}÷&MšdÕ¥}IkxêÔ)8p”Ë“Læ$ôÒ‹ùŸ¥Ébd¿K[íÚµâ%¢0f¦¤'%%áÍ7ß”}%áHzá"—d$üñÅÒ+±pÆ@&Ë–-“M×bz¡¡@'½zõ’û®ö îvŹ¿L€ 0" Áˆ&ÑC•&ÞÐCÔZÊ&±´PýjZH²s¤@Z\ÆZ´hÇ{Lz aŒ„gPÌeGLúöí+ûK¶«E ¤=ß½{·\”bÏž=r‘ éå‚<´jÕJšh^Šû*jS¦L‘æ$“†ž&DvîÜYšÐ’Íô2àÌ¡iÓ¦hÛ¶­ôÅL/>Z ‰‘#GJS -Ε~Yv¥«Í}eL€ ‘Ù„>òÈ#Rh¢‰E4ÇÒ@B-‡K‚ïáÇåFZ_zHÓ„ÀHð¥úè—6sýÄZÚ6G=2ÒR’ rƒe®Y¹.Û¾};h!ò¡K¼)Ü{ï½hÓ¦Ô¨“Ý(-FA +bA“á4!‘~iÅ:rÛFUŒiòœ³¿æ›\¬²Û~â‰' £\jßµFºK]Zî,`LÀºöïß/SúlLBØ·ß~kVdÖ°oß>¹ÑD$Òp’ÀA“Óš4i‚îÝ»ãwÞ‘ûdîà*š^S!®^½Ä‹,²ñ$ ß!C =•&¸íر[¶l‘î´È¼„„\xiaˆñãÇK!800°Ð²Š{†×^{ÍhÌ‘v˜& ^¼xÑHP$ûr²‡&zA#_ÄÎ4VéºSûɾžš\WÜL‰Ì¯, ›C‹ó2&À\”À’%Kä [š!Ùª’ë+½@Z4²9% $}~'!˜>É“§|É®—4Tdî@v½ &0oÞ<É‹4 4‘+?ŒÒIÓN +ÐFÜé…ƒ„grFŸüi9bW|ò#Mæ>4NszñÈèe6²«¦¯´²›3i‹iÜÐß™EhöÂ/¾øbînºÔ1 Ã.u¹¹³L€ 0óÐÃ’œñOŸ>]žH.¶H˜%Ÿ¥†>Û“0AÂ/m$(@LKâ’â»ï¾‹–-[J¡LÕ" †í)NûäÅ€6 ¤Å£Ék†î¯È÷1i~7lØ 7ú´O~{xàÓ¥Ké-£81±f_hÑ÷ßߨHÍDD{ù£¯5’cŸ´Á$“i‰3 Á†¤¯ }ô‘ô£MûäËÙ• î|õ¹ïL€ ˜D€ð_¹rE>8È«¹à¢ '¤q3ÔΑVŽŽiÓ4.´¯ió¨²ÜÇTŽ–7wzî¼tLå§ó´ •Oí!?³ô—n¡BãJqK}búé§±uëV£"ÈV•ꢉW$„‘¹Ãúõëe}~%WTC‡•¿t\Ôàªüé:“ïG±Ô¯HH#­<ùõ]³ft“EöÖ¤©¤Én´x Áù-·«•aîoqçO‹gЂ*ÈÝ=÷Ü#_ÚH७aÆv}™PÅŸ^’V¬X!M=–/_.ûoxÏ1ܧD[ßdƒlô_ qÍúæbA…¿ýöhù­ãÀ˜(Nè´qóFìØ³wKÝ…•2p÷qGrR2|}…0Z™ÂǪøÕÂÝ;$ giwV:Öö)%ϱ8ŸÎÓ•§îËsÿ­+»­²O¦ø´ä4x¸¹#ñFâ¯' RÙJx SùyܜŠȯ,MÔ"^švŒpšXEÞ#È•¬ …èó; b$“·kWçOZu²&¶ÚËñ'í$M.¤‰t¤aïÖ­›´ý%ïôd­àJüÉv–^èHãK/o$ôÙ;Ø‚FZ"ã\§Jvw ï9†û”Ž)Øâþ#+2ñ?ZfLÀ¥ Ðlû‹àð™CiŒšÍj L`§e~gv ¼§ãÐ¿Ç è7 P¿´¤ &?½äæL„5d&ѳgO)„uíÚUúõÕÒ¬ñËü!µ”d A¦&¤7 $“ªÿþRlÎ Ža9zûÌ_Œm♿ùœ­! ³™„ùÜù &ÀŠ!úH¶ú÷ÕX´ògÔêŠ>÷t QQQW¨^´%Å'aÇúmØ:j+Þ|ùMù)8¿²gÍš…Q£FɤÜI&áŒlRÉ^’<>X+0ÿ,’于´¼´ÀCnAXãìØ1)kK"[ã0kP´¼ æo9;kœYR¸UoiA´* Í´¤Ïf˜`ÎJ€´Ÿ_|ýþ>·žk‡ªu‹ß^¨Ö *܃Üð󡌗jתmtÉHÈíׯŸ´q&ÛTÒBjŸè)£&“öê§Ÿ~’®ºH .È«„Q:Ì? ¿4Ù>Ûr×°iüÉ+Ù Ï;W ÌEÈÅü5ÂöùeþEãNóЏr^ ÃE»|6`NN€^è_ñ".§†£×«=àåíåä=*¸ù~A~¨Ú¤ V/ýÞ%J£Ní:Ù'Ð'÷gžy´˜yŒ–ŠÈ6˜lX)€LJÖhR! Åd?LB1­gn`þ9ü‰-ÙGš¤I/$4!’6-PÒ“`LsvþüóOаÈÈH©˜ò÷÷ײšôËüsø›ÌÊ™˜Ñù[Cf›a+l.Ž 0ç!@¢ñŸŒGt©èôDçi¸Zš›ˆw;Æ‚… ЯO¿BK$mäéÓ§åvêÔ)œ8qôu>ëkKrÿõꫯZ––ù›ÆŸV=#/&¹7šd.¯¹WëÑ£hb»©ù›ÆßTžææcþÖáÏ6ÃæŽ<ÎϘ0 0{îl¤ULF§‡G^öå tÜ^Úù4Õ껾¾˜ºã3,ù~1ªWC³fÍ ¬ƒV(£åzi3 4ÉŽV5#A™v0'0Óø“/ÛÚµkËM/ Ìææos¹ššŸùÛ—¿áuÊqTiËûL€ 0bN`çÎØ{fšöjìP=ݳzânÆÙ¤M>þ¥Ñö©V˜6çkЖZ–™Ü}‘6s&Ô1ÀüµkF³9 @0ëò×®ƒ©¿Ìß¾üs_'†sác&ÀŠ=Z-í¿‹þƒÖÝg´x…©O¹Šô´¼Ë´šr~Êí£l·cokw2ï PLÞ!ò›d¥Ÿœ`š¦°\p*ÝW󞯪ü—ùç fþ<þsFƒi{|ÿ1“9¹Øµš9´8/`Å‚Àê5«áWÇ•˚ܟ ó6áⱋÂ>øgûqÜ3ÿ{>ßý^ëƒëç"0éáO1}ïTxxzÈ2g¼ü=ê·¯‡û‡vÁ§C¾À=÷ÕÆ‘­Çuéj4ŃÏvÇO– 1:Á÷TÁÈÿŽÈög¼ýAÌxyÒSÓDñÂWÏ"¤~ˆ,÷RØ%Ì{n^¹wOwt}¢“l-0õéih êÜ»f?BUÇÓ“‡šÔ¿F]à÷)ëqñ℆†štNQ21czÌŸÇ¿ñˆÈ{Ä÷Ÿ¼L¬ÚakÒ䲘px43õ¦UhÒ£‘Ym½“‘‰ƒ£I—†øfÿ—xøX;{ÒRÒä²ÌtãÅ2E~ÒîR ´C›`øÔg1yÝ8!ÈÞÄ‚áõٯ૿§HÀ6ÊnÏ©=§ñîÂ7ñé¦IÂÍ[°~I L!’›÷h†¯þš‚þ÷öü¾;–þ•]Ϧ[ÑyHG z«vy…í”ô(‰Ú]j`ùêÿ–µÈéÌ?/BæŸÿyÇ…a ß iXŸ…aë3å™p`{öìA@ ?”ö+mv+IÛÚv@iZÑeH'y~äÅ(“Êéðp;T«'\fU-‡*µ*£ÉýR¯šlGíæµ@+Åi¡M¿VRö/ï^/<(5Ï1±8²å(2„`ÝýÿºJÜ'À­z·À¡MG´Sq_¯æèòx§l-svB!;u[݃=Gö€LTæŸ?]æÏã?ÿ‘‘Ë÷ŸÖÞc3 kåò˜ph»ìBÅz,j£á²Ì¤Í+áVBj}Kº—ÌS ­†[-й«´¡Œìë´ÈY #¸NyZBt‚Ô(§&¥b€O´¢äopÊÙÇUï ÎÞ7g‡L.üCüðÏ?ÿ uëÖæœjV^æŸ?.æŸõ…èðøÏŒðý'.Öˆeaع &Àœ†@Ø™0´ïf™°'Ìró d¯Kán¦0(þ7ܸ|#Ûÿ.Eiy´ô‚~£#b -t|åÔU™5°RY©í%Ÿmž”]^ü­¤%g-ˆQP™¦¤Õ ÄÉÓ'• ÃÌ_ÿJ0ÿ,6<þó#|ÿÉŸ‹5bÙL¹ &Àœ†@rZ2ȼÀš¡\Õ ¸•tM|£p`ÃAYƒ¥aÛ¢?Åä¹tiK¼yáVÔmU~åüÄ„¼{q[x‘Øóû>)hG_‹Æ·/Íľµ,­Êè¼ *8éœQœµ˜¿>QæŸÅ†Ç¿þÉ/…ï?ùQ1/Ž5ÃæñâÜL€ 89w/ëßö<¼<ðÀ°n˜?ö',›ºÕ† A‡z“ª L(Þë2ZLÀ» ¿ 2xmÖ+²,²7~zÒ“X8~1VL[…ø›ñhÕ§¥¬ÛâÊ Nô,åøÄxƒëï2}¦Ì?‹ ý1’_ ßò£b^/Çl/Î͘€“xrÄãè3ª—’^o_ò"á[Ö·Èå“mplT¬X‰®B¶I„V(¥]?¡-.+Ì'¬¨¾Ã cö´ÙÖ*2O9Ì?’ìæŸ<þsX˜ºçª÷^ŽÙÔÂù˜`ÿp÷Èò¬ˆwo«ëUÚ C+æ[¥…6¬žoZQ#=ò¡¶1ÿ‚¯óÏâÃã¿àq’_*ßò£bZÛ ›Æ‰s1&PLÜ¥U38èPÍGuùºs’Õ|T—ï$˜u›©šêòu;æ$ öâð“ n&`Ö!`ŽWëÔè\¥¨æ£º|碷µªù¨.?oœ+F5Õå;í¼­µ†ó^ ŽaL °—æÁ’Ò\5Õå;g½62=2¶‰gþ¶á¬W‹-øëÕͰŽgL X°—æÁ`’SÕ|T—ï œõÚÈüõÈØ&žùÛ†³^-¶à¯W7 Ãzd8ž 0bI€5“ú—ÕšæÏüõ Ø7…Çñç¯×Cë;ÜÔ«‰ã™`@ :*Z.ŠáMq¸&$Æ&!#5gY\ dþúT™¿>[¤0[PÖ¯ÃüõjgͰŽgL€ 0&À˜(öX3\ì/1w 0CÑâÁæ†Q¼ÿ/˜ÈX_rJ)毗ùë³±E ó·eý:lÁ_¯vÖ ë‘áx&ÀŠ%žÀ¥Ym1…ù3}öMáñ_üùëõ…a=2Ϙ@±$À¸ô/+O Ògc‹æo Êúu0}6¶H±½~°0¬G†ã™(–X3©YY3¦ÏÆ)Ìß”õë`þúll‘b þzý`aX Ç3&P, °f¸à˪šêò î㧪棺|Ç'\p UóQ]~Á½süT{ñaaØñÇ· 0+p4Íð‰]'q'S­;3sð©æ£º|Sûš–’†s‡ÎãØö㈊5õ4åùTóQ]¾©€’’qr÷)D…ß0õ›äSÍGuùæBJŠOÂÁ‡Ì=MY~{ñaoÊ.)̘€#ÈHOw˜fÝv ß½:Ó÷NE)ŸRvoÙì¥+æãü#ÎGà«g¿…§·‡Xˆ‰ˆÅ°OŸBË^-ìz \…ÿ !÷Ê,1æ½P­J•.…7þ;傃˜¿ ,·H¾”4ïÑÌÆ5ç­Îã?o­Y1, ë‘áx&ÀŠ%°ÿ± G/â÷™kqæÀ9‡bœ™žÒÞÞJÛäü—½ :ÔÃÓ“‡Ê¾®˜¾k¾_gwaØUø/ýlîÚ}^éwOw|óÂLü¹x;~g Ò±WXá®Â_ã°sÙß8wð¼vh÷_[ð×ë¤ýŸ z-ãx&À˜€© J5¯Hï2ÞhÚ­‰Ì;Smî´”tøùú)­Äø_8ŽV}Zf÷³Y÷&¸~.q7â³ãì±ã ü3Ò2àWÎÝžê ÏRžpssCPp C˜K¸m\G\ˆ”/€ƒßµï ˆÖúµÃú ÷Y6¤ÁûL€ {¥½J#16Ñ®ý¬T£":>ÒÍhb×vä®üÖµhÔ ©•;ڪǎÀÿóm£^›ºÙýÚµrj7¯ÿòj_²+ÔÙqþ¤ )L"ˆõ©=§±aîØ·v?:é¨CÅvÑ®ÀŸhÒ Éßù~D¾˜ØŽpÁ5Ù‚¿^ XÖ#ÃñL€ KõjדZÀbÙ¹"vêÖ¹hÜ{ϽE,¥àÓ‰?i‚ç¼57 ·ûÜp¤ºÿ#[a›0(é᎔Û)6 \p®Âù´UmTMïo\0§Ú‚¿^—XÖ#ÃñL€ KmZ´E䉨bÙ·¢tŠ´Eq—âѰaâS蹎ÂÇÒ¿0®ÏDx•ö¸•cP«iÍBÛ®2ƒ«ñ'–¾ÿ0>Ý4 ÷?Ù >Z„ÌŒL•ˆ ,ÛUøÓ|…Kw¢n«: —‘óG.Hî´Ó~fB¶â¯7XÖ#ÃñL€ K­[·Fì…xK!9Ní=ÖMZÃÇÇ''RÁž#ðÿãÇÍXùíïñýËrO€Ú>›‚ÑUø_=s ãûM6|unrµ+ÁTJò¸ ÿÌôLÔjV ¯Ø#µò$§‹y¤¡¿yõ–¶¦j+þzmaaX Ç3&P, xzz¢o÷~8²ñX±ìŸ%¢äÙm0°ï KN7ëGà¿iþ<ôRO1q+1‘±Ù›½4“®Ä¿JíÊÒ$‚l…S“R‘œ˜Œ-?mCùjåP¶b€YcÉZ™]‰íµðÆœW³7š@G.î(®f“ÖBjV9¶ä¯×0†õÈp<`Å–@߇ú"þL"¢¯ÇÛ>šÓ±c[£M£¶ 5ç4‹óÚ“ÿÍ+7Å"qXòñR¼ÿX£Òì\‰?-ª0èÍþX;{Fuƒw:|€ G.âù©Ïؽ¬Ó•øÛ rÛš~M)!–¾.Ç- ¿ýö’’’0p ã¸æ°¬'|`®F`çΘ³|6|½›tïäjý×úKŸF÷Ï?„iŸLGÙ²eµhå¿Ì? ±«òO¹ŠÈ‹‘R+Y¾Zy¸•´nÎUù+ÿ7±kð;v,¦OŸnbùf[jŸÑ—o[8’ 0&`;:t@«:­±wù~ÛUê`5Ñ þ] ÷bä oÚT& ÌÒ\ÀUùÓ§ùê BP1´¢Ýaÿö½!Ù“îž³0œ›3&à2^|îE¤œIÇ¢ ¿¸LŸµŽ’fnÍ×0¤×ãhÖ¬™mÓ_æÏüm:à *ãñoûŽÀß°Û, Òà}&À\Š€‡‡f͘…•bÏŠý(‚Õ˜SqKˆNÀôgfàõ§Þ@¿>ýìÖvæÏüí1øxüÛƒzNŽÂ?§E Æ4xŸ 0—#@z&ŒˆŠ©•±yÎ6»¯N§ú\9u[fnÇ” Ÿ£S‡Nª«+´|æ_("¥˜¿R¼…Îü Ed“ %Ç‹`iMaaaHOOG½zõ,-‚ÏcL€ Ø€»»;:´í€InX552Jf |H9Ѓª¸ò«¼oåÜ:‡Ñ¯FëV­¦kÌß¾—‚ù3ÕTÞ¶lÙ‚^½z¥ aìM¢(øø\&ÀŠˆˆ,X¼‡ÏBH«`ÔlVeË8m?£ÂoàÌ9‡þ=`@¿ _¿Ž˜¿}¯ ógþÖ$`‹û5¼I°0lÍ«Îe1&Pl\¾|7oÄŽ=Ûq×ëüªøÁÝÇÉÉIð ðE ·¸{çŽè¯¡ö˜Û*¦îÚœ² µÖšƒÌ;¢=b5)7w$FÝFÜõT¬Œ:õ@çΕ¯.G-´V`þÖ"iY9Ìß2nÖ:‹ù›N’…aÓYqN&À˜€Å®\¹ÚbbbpíÚ5”//ü¢º¹!##ÃÈG1 £šª ¸¹…ÝÜÇT§ÃcÃ}J§c Z=Z]2òßøääd¡bÅŠ¨^½:쳪—Ö&kü2kP´¼ æo9;kœÉü ¦h aؽà*8• 0&ÀªV­ Ú8؇ó·w­V毑°Ï/óWϽI¨gÌ50&À˜`L€ 8(†ôÂp³˜`L€ 0&ÀÔ`aX=c® 0&À˜`LÀA °0ì †›Å˜`L€ 0& ž Ãês L€ 0&À˜`J€…a½0Ü,&À˜`L€ 0õXVϘk`L€ 0&À˜pP, ;è…áf1&À˜`L€ ¨'À°zÆ\`L€ 0&À˜€ƒ`aØA/ 7‹ 0&À˜`L@=†Õ3æ˜`L€ 0&À”€{QÛµ|ùò¢Áç3&À˜`L€ 0³ ìÝ»×ìsrŸP$axðàÁ¹Ëãc&À˜`L€ 0&`Ó¦M+r=%îŠPäR¸&À˜`L€ 0&à|–²Í°ó]4n1`L€ 0&À˜€•°0l%\ `L€ 0&À˜€ó`aØù®·˜ 0&À˜`LÀJX¶H.† 0&À˜`LÀù°0ì|׌[̘`L€ 0&`%, [ $Ø`L€ 0&à|Xv¾kÆ-fL€ 0&À˜°†­’‹aL€ 0&À˜p>, ;ß5ã3&À˜`L€ X‰ ÃVÉÅ0&À˜`L€ 8†ïšq‹™`L€ 0&À¬D€…a+äb˜`L€ 0&Àœ ÃÎw͸ÅL€ 0&À˜`V"À°•@r1L€ 0&À˜`ÎGàÿaÖטæÜÂeIEND®B`‚asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/makefile0000644000000000000000000000026015031566105023560 0ustar rootroot%.pdf: %.dot dot $< -Tpdf -o $@ %.png: %.dot dot $< -Tpng -o $@ DOTFILES = $(basename $(wildcard *.dot)) all: $(addsuffix .png, $(DOTFILES)) $(addsuffix .pdf, $(DOTFILES)) asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/architecture.dot0000644000000000000000000000162015031566105025253 0ustar rootrootdigraph { compound=true fontname="Inconsolata, Consolas" fontsize=10 margin="0,0" ranksep=0.2 nodesep=0.5 penwidth=0.5 colorscheme=spectral7 node [shape=box, fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5, style=filled, fillcolor=white] edge [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] subgraph cluster1 { margin="10,10" labeljust="left" label = "SAX" style=filled fillcolor=6 Reader -> Writer [style=invis] } subgraph cluster2 { margin="10,10" labeljust="left" label = "DOM" style=filled fillcolor=7 Value Document } Handler [label="<>\nHandler"] { edge [arrowtail=onormal, dir=back] Value -> Document Handler -> Document Handler -> Writer } { edge [arrowhead=vee, style=dashed, constraint=false] Reader -> Handler [label="calls"] Value -> Handler [label="calls"] Document -> Reader [label="uses"] } }asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/normalparsing.dot0000644000000000000000000000262315031566105025451 0ustar rootrootdigraph { compound=true fontname="Inconsolata, Consolas" fontsize=10 margin="0,0" ranksep=0.2 penwidth=0.5 node [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] edge [fontname="Inconsolata, Consolas", fontsize=10, arrowhead=normal] { node [shape=record, fontsize="8", margin="0.04", height=0.2, color=gray] normaljson [label="\{|\"|m|s|g|\"|:|\"|H|e|l|l|o|\\|n|W|o|r|l|d|!|\"|,|\"|\\|u|0|0|7|3|t|a|r|s\"|:|1|0|\}"] { rank = same msgstring [label="m|s|g|\\0"] helloworldstring [label="H|e|l|l|o|\\n|W|o|r|l|d|!|\\0"] starsstring [label="s|t|a|r|s\\0"] } } subgraph cluster1 { margin="10,10" labeljust="left" label = "Document by Normal Parsing" style=filled fillcolor=gray95 node [shape=Mrecord, style=filled, colorscheme=spectral7] root [label="{object|}", fillcolor=3] { msg [label="{string|}", fillcolor=5] helloworld [label="{string|}", fillcolor=5] stars [label="{string|}", fillcolor=5] ten [label="{number|10}", fillcolor=6] } } normaljson -> root [label=" Parse()" lhead="cluster1"] edge [arrowhead=vee] root -> { msg; stars } edge [arrowhead="none"] msg -> helloworld stars -> ten edge [arrowhead=vee, arrowtail=dot, arrowsize=0.5, dir=both, tailclip=false] msg:a:c -> msgstring:w helloworld:a:c -> helloworldstring:w stars:a:c -> starsstring:w msgstring -> helloworldstring -> starsstring [style=invis] }asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/iterative-parser-states-diagram.dot0000644000000000000000000000357315031566105030773 0ustar rootrootdigraph { fontname="Inconsolata, Consolas" fontsize=10 margin="0,0" penwidth=0.0 node [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] edge [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] node [shape = doublecircle]; Start; Finish; node [shape = box; style = "rounded, filled"; fillcolor=white ]; Start -> ArrayInitial [label=" ["]; Start -> ObjectInitial [label=" {"]; subgraph clusterArray { margin="10,10" style=filled fillcolor=gray95 label = "Array" ArrayInitial; Element; ElementDelimiter; ArrayFinish; } subgraph clusterObject { margin="10,10" style=filled fillcolor=gray95 label = "Object" ObjectInitial; MemberKey; KeyValueDelimiter; MemberValue; MemberDelimiter; ObjectFinish; } ArrayInitial -> ArrayInitial [label="["]; ArrayInitial -> ArrayFinish [label=" ]"]; ArrayInitial -> ObjectInitial [label="{", constraint=false]; ArrayInitial -> Element [label="string\nfalse\ntrue\nnull\nnumber"]; Element -> ArrayFinish [label="]"]; Element -> ElementDelimiter [label=","]; ElementDelimiter -> ArrayInitial [label=" ["]; ElementDelimiter -> ObjectInitial [label="{"]; ElementDelimiter -> Element [label="string\nfalse\ntrue\nnull\nnumber"]; ObjectInitial -> ObjectFinish [label=" }"]; ObjectInitial -> MemberKey [label=" string "]; MemberKey -> KeyValueDelimiter [label=":"]; KeyValueDelimiter -> ArrayInitial [label="["]; KeyValueDelimiter -> ObjectInitial [label=" {"]; KeyValueDelimiter -> MemberValue [label=" string\n false\n true\n null\n number"]; MemberValue -> ObjectFinish [label="}"]; MemberValue -> MemberDelimiter [label=","]; MemberDelimiter -> MemberKey [label=" string "]; ArrayFinish -> Finish; ObjectFinish -> Finish; } asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/tutorial.dot0000644000000000000000000000266015031566105024441 0ustar rootrootdigraph { compound=true fontname="Inconsolata, Consolas" fontsize=10 margin="0,0" ranksep=0.2 penwidth=0.5 node [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] edge [fontname="Inconsolata, Consolas", fontsize=10] subgraph cluster1 { margin="10,10" labeljust="left" label = "Document" style=filled fillcolor=gray95 node [shape=Mrecord, style=filled, colorscheme=spectral7] root [label="{object|}", fillcolor=3] { hello [label="{string|\"hello\"}", fillcolor=5] t [label="{string|\"t\"}", fillcolor=5] f [label="{string|\"f\"}", fillcolor=5] n [label="{string|\"n\"}", fillcolor=5] i [label="{string|\"i\"}", fillcolor=5] pi [label="{string|\"pi\"}", fillcolor=5] a [label="{string|\"a\"}", fillcolor=5] world [label="{string|\"world\"}", fillcolor=5] true [label="{true|}", fillcolor=7] false [label="{false|}", fillcolor=2] null [label="{null|}", fillcolor=1] i1 [label="{number|123}", fillcolor=6] pi1 [label="{number|3.1416}", fillcolor=6] array [label="{array|size=4}", fillcolor=4] a1 [label="{number|1}", fillcolor=6] a2 [label="{number|2}", fillcolor=6] a3 [label="{number|3}", fillcolor=6] a4 [label="{number|4}", fillcolor=6] } edge [arrowhead=vee] root -> { hello; t; f; n; i; pi; a } array -> { a1; a2; a3; a4 } edge [arrowhead=none] hello -> world t -> true f -> false n -> null i -> i1 pi -> pi1 a -> array } }asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/architecture.png0000644000000000000000000004027115031566105025256 0ustar rootroot‰PNG  IHDRðÕ¨º¢×sRGB®Îé@IDATxíœÕöÇ}é½)J‘.   X±=+ØyvÄÞ}Ö÷ìX±÷Þ»(Š ¢T¥*¨ J¯R—ûÏ÷úŸ˜]’ì.É&™äw>„ÌN¹sç;“9÷žsî¹ÅºvíšsõÕW›DD@D@DÀ d%6lh}ûöõGUK{ÿý÷­¸8ˆ€ˆ€ˆ€ø€¸ÿî™j," " êë?PÜwMuÈxRàÿ€ˆ€ˆ€ Hûñ®©Î" " O@ <ãð#)p?Þ5ÕYD@D ã Hgü# " " ~$ îÇ»¦:‹€ˆ€d<)ðŒ@D@DÀ¤Àýx×TgŒ' žñ€ˆ€ˆ€ø‘@ÉX*½hÑ"ëY«]·v,ÅèØ8È*YÆžzôé8”¤"D@üFàÉç^²‘ã&Z±bê“ùåÞ­Z¶ÄÞ|á)«_¿þnW9&>aÂ+ß<ËZôn¶ÛÐñ!0ñõIñ)H¥ˆ€øŽÀðÑcì÷‡X±’¥|W÷L­ð†ÍÓlüøñ1Mç“|ÕÚUÜ'SoBª\w‰’%R¥*ª‡ˆ@‚ ”.“å”wéÊ5|fnw Ä£±%{ËîÒ×q" " "DRàI„¯S‹€ˆ€ˆÀîß]r:ND@D@’H@ <‰ðujØ]1±öÄ›6l²/_eó¦Í³2峬M÷VÖæÀÖV¥V•\EíܹÓúÄj7®eÝûܶcÛûäñϬþ^õl¿u ®gá³§>·êõ«[·ãö˵^ˆ€ˆ€üC`õôolß3ƒ+J”)keëíe•[ìkÅK• ®g!{Á,[=m´m\ô«•È*oeë6µûc¥«Ô î·rÒ¶iéïV³ë±–U³ap= ëçNµ5?³Ê-÷³J{uεMÄF ¡=p”ïÃç>n3FÏ´–][8å=å«ivÛ±wÛ²?—纒Ù±/´÷ïl[7o n+Qª„U¬VÁ^½õ [ôë¢àúoßkÃ^øÒš´k\§] ¬Ÿ;ÅÖþ<ÞŠ/á>[W/³…Cž°_ž¾Â¶®]<à¯)_Ù¯Ï\éÖUíp°UhÚÁÖÏ™b³`ëŸÜoí쉶bÜG¶jò°à:oaÙ7ïºmÙ f{«ô' Uàs§þn‹~[l—?w±õ>ï0׳¾ì™‹Ý0´‰Ÿ|—ë’Æžh=úþÝóžöõŒ\Û=ë`kÚ¾‰½rÓ¶cûûkÉjûðÁíÄ«³:M”T&,ý!" adÕjd Žà>O¹Ñö¾ú¥À^9N‘³û–¿–ÚïßgõºÐšžñ_«¹ß¿¬v>Ö|À#V±YGûã½–³c{°ä²u›Ùê飃³°}ãº@|ŠeÕi’k½þˆ„*pzÒÛ·n·U‹ÿÊUû]0‡ï\·iý&›:rz@Áïoigß ù>¸…bÅŠÙ9ÿmË篰aϰ×ÿ÷–5n»‡tFÏ\ûé‚À<^µ]/[óÓXÛ¶aµ­œ8ÄÊT«g5»Ÿ«zíõŠÛšå¶î·ÉÁmôÎwlÎv&wo嚟ÆYù=ö¶Rås»H½íúŽ@BxóÎ{Ù­Ùg>lxʆ¿ø¥Í›þ‡ÕÞ£V®žó¤/~ø²«Yã6{X—£:ÙOãfÙºUës]iõzÕìäN²!O ueœu×™N±çÚIˆ€ˆ€˜@Åfܾ[V.²MËæY¹-&ö]Õ cJV¬fìç «*mz8¹·nõô¯]£ ''Ç[¥ï8ØõÎıð¼E•.[ÚnxçZ»ô™‹ ð»rù³1Ÿwýÿy«n-­l…²69 Ôó e å*–µr•Êåݬ¿E@D@ A «vc·7J›ÞtÉò•Ã2ÎÙ¾ÍrrvæÚ^µýA¶zÆ7õ9¶={­møÉQê˜æ%ñ'Ð(t"ЋŒV6>Èâ9KìÅë_±·ïzÏ®}í*[:o™ëQ/™»Ô¾zu”Ûgsö&›0£|f/÷7ÿm\·Ñ^¹ùu·nÆ·3ÁnZ¿ÛOnׂˆ€ˆ@álY±À/é@¤ùžóy]Ûú×’°l\ü›íØ´Þ™ØCw¨Ø´½SìÙþd›—ÿi·±Rª†î¢å8H¨gXØêekì’'/¡Þžu퀻†–të&|<ÑšvhbçÞ{Vp”ú=mK_jušÖqëQøôÌOºæxëxh{{èìGþòöÖ60$M"" "Px+QäåÊ»x©Ò.PmþÇØÖu+­t¥¹ [ÿëd+Q¶B`Ÿö¹Öã¯ÒöÀ@0Û×¶yÙŸF\RtjBowP[ûyül›6êŸáø¶'ûÑšulj;wìt=mÆq×lX#øA)ó÷ÄOÿžqkÒç“Ý1ç ìg%K—´æ]ö²ž§t·×o}Ó²×d-•," iB`çö­nxÃÆ6-ûÃ|ú”­ Œçnxüî «ís˜ëaÏ}åf7ƳøÎ€Ù|õŒomé×oYÝCÏŒ ¯° ªí²¿¦ŽrãÌ«´î¾Ëv­ˆ„öÀÛôhm'\y¬½øŸWŒÙ³ÊV,çÆxcN?í–“rß°:Û:±Ï.WØ)°î»O¿·O>ÀÞºó];²ok´w£à~'zâ3¾ýÉÞ¼ãë?è¼àz-ˆ€ˆ€ìJ`C ÁȨ̂º ô¦‰"ovÖV¾aK·ŽÞ4CÆæøÍzä+^:+0ll‡ûnx•V= àÃI…&m­x‰RV®Ióˆ>ôpÇi]á ëÛ·oÎ{ï½Wø#G|ðÁöå‚/¬Sï]n´·lÜâ· Ä1¡½(‰ÀˆGFÙÏ}[!:ZDÀ—úœs‘ýR·—Õt¢;¶l ˜Äÿp ¹Lõz¾d”j•&Øï¾ãÚìö|à'Ÿ|²%´î,S®Œ5j•;Ýž·Mß" " ©E€T«åµJ­J©6–P¸x‹€ˆ€ˆ€ć€x|8ªH()ð„âÖÉD@D@D >¤ÀãÃQ¥ˆ€ˆ€ˆ@B H'·N&" " ñ! Ž*ED@D@J@ <¡¸u2ˆ)ðøpT)" " "PRà Å­“‰€ˆ€ˆ@|HLJ£J„O(nLD@D@âC@ <>UŠˆ€ˆ€$”€xBqëd" " "Ràñá¨RD@D@D ¡¤ÀŠ['øG•"" "  % žPÜ:™ˆ€ˆ€ć€x|8ªH(’ =ÛÿŸì÷iólõÒÕÉ8µ/ÎÙ´CS«Z»Š/êšn•\»v­1"Ý.˷׳÷Þ{[ëÖ­}[¿W|õôoü~ EZÿªíziùùžþå#£ìÆënʯn¹}Ñ¢E6xЇvú}§däõ'û¢ d7n´ýöÛ/ÙUÑùN?ýt›6mšX$ÀêßX—í³­oß¾I8{êŸòƒ>°ï§›%S‰'E·ïÜÁúôé“úw( 5D;S­Þ$ w§¬T©’uÔQRàɺyÎûá‡æY£?I€÷´ÞÕ‘‰?xFä Ø"x ë" " "oRàñ&ªòD@D@D ¤ÀY§x7Q•'" "  žÈ:…ˆ€ˆ€Ä›€x¼‰ª<H)ð@ÎÄS|óÍ7öôÓO»K]ÎDºæÌ&úü‡.g6]}<Hǃ¢ÊØ…À”)SlðàÁn}èò.;j…¤9Ðç?t9Í/[——Rà €œ§ ;ÙŠ+Â^Jvv¶mÞ¼9ì¶H+7lØ`¤-•ˆ€ßè·à·;–¾õ•Oß{—+Û¾}»]~ùåV¥JkÚ´©í»ï¾6qâDW6 ¸W¯^Ö A«[·®uïÞÝþú믨ç]³fýë_ÿ²½öÚËjÔ¨a‡v˜­^­¼øQ¡icJÐo!%nƒ*B@ <†w%ðüóÏÛG}dsçÎu=pr„_vÙenG|Ü{챇-X°Àm«Zµª=øàƒ»²†òÊ•+g‹/vŸ;wÚ«¯¾²‡E 5 è·š÷%“k•”\è™ Üo׎r=ûì³­aÆ®ê·Ýv›}ñÅnùŒ3Îp=sþ˜={¶¡Œþùg·-ÒÅ‹·ñãÇ»2è½>Ürrr"í®õ)D€YÁžxâ ;è ƒR¨V‰«Š~ ‰c­3Œ€zàã”±{ýñÇÖªU«àõW¯^ÝÎ<óL÷÷œ9sìè£v½ðæñü„Þûi§fýû÷·jÕªÙ±Çëzâù—ÎÛiø`Å'[¶l±?ÿüÓ5ŽÂmgn‹p h¾ZÊ%v!’p/1‡ çÙºuk誌ZÖo!£n·/.V Ü·)y•ÄO¢ö„ÙÒè…¡0P½{÷væó±cÇZ=¬X±bÞ®a¿1Åÿ÷¿ÿµ… ÚäÉ“mÇŽvûí·‡Ýׯ+gÍše×\s½ôÒK»\ÊúóÏ?·O<Ñ)í?þØjÖ¬iÌ{•㡇rÇÀåÚk¯uŽ.]ºX:u‚Qýì€+ã®»î²-Z¸øÊ7nœ;6š¯vݺu®U¹re«]»¶»Ë—/wÇÝpà öïÿÛzöìi52öÁlŒtèÐÁ–-[fǼ½òÊ+Î*ƒ %\ âï¿ÿîf°ÂºÂõ¦‹è·.w2}®C <}îe‘\ /ì÷ßß)ñmÛ¶ÙÍ7ßl¼ ‰:ç…NPfñùóç»ýò{aß{ï½v÷Ýw»Þ]›6mlŸ}ö Û{,’‹)ÂBéí¢ØäëÚµ«¡(8à€àéEÿïÿ³ÆÛW\a:ur ™ïúÉ'Ÿ´õë×Û /¼`×]wãË2±óæÍ3,ŠËìîÅ‹/¾h4–,Ybݺu³ûï¿ßm‹æ«½êª«Üþ42èQ|Hîé›o¾i7Þx£«?Ë—\r‰ýôÓO6uêT§ð9.y.êׯïþ¦ç öíÛÛÅ_lMš4q ´Hï?|ë·à‡»”Yu”Ϭû]è«åeÞ¬Y3gF§‡HÏ%S¶lY»é¦›¬oß¾†o”9´¯¼òJûöÛo£¥±ʉÈuø¨Q£\y…®X .¿þúköÜý]~øá»è¢‹œ"{ýõ× W %JÔþ|`Gq„Sh°{ë­·ì·ß~s ¡!C†¸^÷©§žê*€5ƒýK•*e/¿ü²c‹2DŽ;î8wŽaƹ¿ùåŠ{WJ˜8$ÔW›••eÄ-Ðh@AÓÈ@‰×ªUË5pip¼žôèêK9(¬Ž;cXçÉI'䎛9s¦SÒýúõsuÁ‚€iþÖ[ou¾×^{Í0=s¯yFh”Ðø(J3fL‘˜úýü[(JÞ*;y|ĆYÎ ¢ò°Õ«WÏõh9äoU\¿QX¼,é=eš”/_Þ>ùä×ÛF± ,<ÁäŠò¢'GO !° ¥A¤9ÊáÛ[F!ðBGÙ`ÂE‘• ¤úôéã”CáèõÆSPÄ;wv=îI“&Ùž{øxÀ)jÌé~ø¡Á2Tà_À6LëÛ®¿þz·ìýGÄÿÒ¥K½?öþ A…_É[®·àÒ3Æjâ ½h/~!ï5pV®\éíºË7¿ , ¸Eè‘ãVyï½÷ì»ï¾sîÌñ|üq×àCñÃ÷@<…F Êæy¤aoñóo!Þ,v§<žËGyÄÝû¼¿ûÏ>ûÌ=3wÞygÄ¢ÉbG,ïÉßþùû„/†wÞyÇJ–,üL›6͵îÿóŸÿÉUУ‰”ĤHN˜‚…¢lC•·WEü¤žòfû ¼£ /B”iÞq´cvg[Ë–-¿ž¨w‚åŽ9æõ¯ •ž6ñ˜ÎQJ˜›=ÁŸŒ•‚^7J S9ÊÅ“¼>UÖ³=u¶y=jožso4ë"Åä-׋[ AƒðûÁ¤Í‡˜„O?ýÔù¼Ù–÷9gÌ?–„H‚¿K óÎ;ÏŽ<òÈ\C W­Ze=ö˜‹ÀºÏâ©Ì¬ÇUñÆo#h<âÊ ±‰MaÊŽ´¯ ‘®%‘ëi(â–á÷WPܸᢉ²ØíJÇw œKàÅÏxcïÃCqá…Ú3Ï<ã‚¢B/“žE$¿l´ b¼˜¢½è ÅZ-'‡&a̶øz‡êüȼìyé{fãÝ­YéÒ¥íüóÏw‰m¾üòK÷¼p>âðªX±¢ó÷ób¢‡Šù|Ê)§¸eüÈø¢±p ø—1Ac6§±¢¥—p,Ï+¦ôü$’¯–Æ ~'øÜ7mÚäê¹çžTxôb½†ÃÛo¿m(`x!X`P˜=!,ü‰‹`üüƒïÖX?†ûꫯ‚~pââÑp£QBoÞ¸-ˆ$€ô½¡ JWYý—x~h¼a¡ zæßÿ½  ôÖG{7{ûä;Úû¿ ǧú>¾Tàá %:”æÇt~7Ìë˜ñÉyÛ£e#úsk¥J•\/s#ë<‰Å‹™ðä“O6üz‰xÄ’ÿݶm[gÞåeO˜9f8zÅ(”A¬Â9}ôQWî^RôάEXèéâ“g_ž+*&EâPÚøX~øa·?J‘ VüÇ ½ÃŸìõ¢£Õ7’¯–cˆŒ§'¥ü¯¿þÚ5f¼òÚµkg‡~¸S¼\#š7oî6£Ï:ë,׋ÂTÎïˆÆÇŒ3œÝ³Ð0jߊ4@è¡sý%J”ðN³ÛßX8ðáã.£7ϵ üîhÈÓ;–¤.Þ¸7°üx‚e†ç‘üÑÞÍÞþ|3wŒ'¼—Ë”)ü-G{ÿ{Ǥ÷/8f²éÓ§»ѱô¦xcÂã%Ažmz0Ü`üwüÈùq{/ÔhÄhÁc‚£×Æ‹ˆ–`¨Ù3Z/Šž^T… Œ@Iê A…RÅÄKÏ™g„ç%€2¸úê«s™¿w·æøÿ (C18–WPš·Ür‹{Ñ'ˆŒ—¦jzã^›Þ;±Dó|ãû}añ‚âeè ½nz2ˆç«ÅOO™0„¶üv&L˜`£Gv=W†°y‚OžrFŒáÆçcaðdРAnŽå÷Äp¶¼BÐ#¿ØÒ€ŽUø]ñ{¢÷ÆïšFÏ/¿üâF2â—ß=‘4º%©MëCC{áÄNð›!.#Ú»9ôÊx&B-¤tÎÈQÀw~ïÿÐrü¾ì» 6€óràEŒ`ÇoÇKëœsÎqëèp3Q¶ÜPzàô`PÊô¢e#˜‚%‘Ã=!z>ˆÅK9¡Q¼ŒÓå%Œ0?fhÛPˆÿ²×eÛà 9¢X`ùŸle5Ö°F{7 Ùž{‘—~´ ^°ôŽ"‰ßgè&Us¡A_\/½Kd(@Ü ¸JP|h¼á¿Æ&³pë1F|´^”´H’øÙùìŽDêòl†*í¼e³ž8Aaæ'Þuå·_A¶óÛ¦gFO>d!/~, © *4ô½Qè6o@ƒ;’ÐÐóËñ ÿ˜kk×dYÉrÿ4bŠ•(iUZÿ3”1ïuæìØnk~÷ÏêܯË^Ȩ†6ÿlÓ O8–"Ü.˜Ï½œ ÑÞÍ=}~ïÿ‚–ã‡ý|©À1óñ‚ö„1/]zQô6P@´Â0U† ¦H„‘³˜ãèq äQ¼¾L̘žðr P ¡gBƒ!Z/CªbQÞîDüÌý÷÷ŸÅ‹YNh>ŒÀ‹+šðb‹ÄmåúýøÐkÈ{­ü©§æíë}GcœŽÛ7nìüâ~º6|ùܯ¼÷,ܺpו÷¸Ð}¢móö‹¶O´mEr<¯…ÐWC€K¾’k—ÀÅþé( æ{øî쀒ƥ‰; ÷ #Sxo"ÑÞÍÑΚ!0¿÷´rü¶Í— Û™Q¶ ‡¢†`ºÄ”é JÛë]{þG‚‹È:†ðà`¦$X'^R¾b J»wÇÝ.®IÀ\Ìgw%]'ñ æVÌÛÞÿ4QÖŒQÆ\L°=âD #'ðßæâöJ`¼6uóÒÖÆ³>Þ°H&Ÿ¡!;pà@wÍÞP¿xž+Ö²hXãB n<½5~“¿eâ ø­ßwß}Îê6ð?,$øõwWRéøw†Ž´ìº]­tå¿;"¹&zèUÛö,È®q݇†"ïOzáÜ?Fk ù½›C+Á{=46 ¥íI´÷¿·Oº|ûÒ>Cgh#˜I™¢¿7Šœ4Š7¿ bÛð`¡ÄyÉóÒð„E~Q¼Þ¾úN-˜ÕQ”ø•¹¯Ä)-ìž{îq «‹× HdÍŸzê©`Ôwèy‰â&çAQˆ7,+wÞøñ¢8W<ÊÄ$Ï ÿÝwß5\\44°ŒÑÀ!Êÿ7//B>çTEK3ú³Ï>ë\Y¸7‘üÞÍ¡5ÂEBü½x\! Uô$ÚûßÛ']¾ÓFÓRÇçE° =H|b /ÁHr Ìé$ÔÈ/ƒFDcn§WMV-|ÆžäÅëí§ïÔ!@БÞdf£Æ0'‚eø›Þh<­qµ¸oB*Óí4ZóJ~Ã"C÷Ïoèg‘ =&QË4²hlaE¡ñE# ¡Ñi+‹$õ ð{$Àø°Ã ŽÈïÝzUÄ@˜Éó€續öþ-#–}gBg<-Ÿ¼Â ÐÁ- Ð“F!‡Ž=Í/ƒ~tZv4…&Îàœ^/cey)Ò0ðÌôô RÑ ™—U&ý’ÆlN㎙Ópµ|ðÁnL³Ÿ8ðCO¡Âxq"²"ÁSN*WÌ˸ä¡¡‚™‘`NŽÅä‹’ 5=ºþÿ?û0gbŽÄ-u饗ÚwÜážï^½z¹‰OHÂAЦtz|"—itÑø"ÿ~TdDÖŸp Îò‹ )‘ב©ç"®ˆ<y%¿w³÷~%˜’8(’¬IÀ!î O¢½ÿ½}ÒáÛw ¼0ЉL'Õe8áò‚ÓØÎKÑ2C" -½hQ¼‘ŽÓúÄ ‘…ÚÿýâŽô,$¶V»žáXô(C…—î„lÌÇøQL(O6ið¬bBÄâÄ,g¼Ì«ÍÄ&(ñÐa‘øÙI¾®ï ½¹à‚ ¿<½#”6 XbFp;Ðó½-gBï)U„€DâÚæ¥Re £0¼†uªÔUõ(hïæ¼%äí`…nöþÝÏÏËi­Àý|cò«ûÎ;mÕ¢U¶|þ ûcæ|›0ôïÜÓ¡VˆüÊH÷í.’$óZ* JÈ ôêÉxrOpáB9ãËÇÄRÇä Uó&6áz(Z$Ú°H·ÃÿÿW¡7(IF`¤¢ÀÉ`øÀŠF ½2‰¤3)pÜ]”òê¥klE@Y/øe¡ý>už-·Ì¶lÚjëW­·²²¬jÀ‚0ý‡é>¸šÄU‘Ìk~#¦íPAA{BpÃnÈ?@\F¸Ih_¢˜mX¤W>ßzÃðM?ˆ7BÄuUE Rà±Ð+¢c³×gÛœçÚâ9Klî”ßmÑoKlËÆÍ¶au¶m\·1xÖ U+X«n-ì苎´ÙÃs¾þàF-¤ "ʼnå å+fA|Õd •HæâhÃ"CϤ¡7¡×­eð3´‰B÷óMÈ[÷Ÿ˜eÏ^õ¢½yû;6qÈ÷¶`Ö[þ犠ò.S®Œ5íÐÄξ§Ÿ xôkÔªaÞ"ôw [Á’(oÌæ¤E â.‰6,2Q& ½ ½n-‹€Ÿ H§àÝÛ§GGëtxG«X­BØÚÙÿp;ÿs¬í­¨–Pz­$ò–ñëVbBïÚµ« fÃןä7,Ò;>“†Þx׬oð;™ÐSð’¸â”›úzÙí³§¾°e,ÏU˵+ÖÙk·¼aÛ¶n·-ê[Ö lÕÒUÎïÉð‰xɇòÖ˜ Ü7ÏR´a‘¡ÇdÂЛÐëÕ²ø™€Lè)~÷ê6«c?Þß<¥Çß&õ@’­™c~¶ñƒ'Al{ïßÊ?çPëÒ«‹½ÈŸÍ8^2…F1§ø%ªz" " »A@=ðÝ€–èC²ÊgÙ)7ô±fšÚ'†Ú²À²á/~éÙêíù÷<ÏÔ Ó;icùä'3fÌp&Xz둦̯ mH)ðä±/ô™;±óy¿}×{n˜Ù»ßôÎ/4¢Ò +Læ1räH{ûí·ïEî}hÈ—^X¢Ú_D@K@ <±¼c>[&µí¢ÇúÛ§Oµï‡N¶¡Ï ³¯>®Ðåuìå&Š)ò¿3cù´I¹éMQèÂu€ˆ€ˆ@‘/rÄñ?AVù2Ö÷ú­iûÆEþ¹µØ/¶T¡L @ЄÉ.ÈþMHUé¥ñŒ¶Ÿ¶‰€ˆ€ )ð¢ášR;õÞÇê7¯o[7o-PR‚V _:ÑÈÑ„ñňgvgx³¾ID@D@C@ <1œ‹ì,˜ÔR©&Rèògcvgæ'LïôÚQèÌÔÆô–¢# ^tlÓºdÆ%{ïGu”»VÏ—ÎÄ¢% ^´|3ªô¼¾ôH¿dÉ›8q¢ë­+â=%­è¤À£óÑÖ" @zÏ 6#Þ½ìqøÑ1ÁË—^ÐU¤ˆ@ÚHŠŸ:iŠ…æzN;ª1\SF®Zº2†RÿPäúõëç*JÄû¼yóܶ)S¦Ø»ï¾kûï¿ÿ.óc'êªÖ®]k3gδùóçÙ)—/_^à4¨EV ŸÌ$.×\sÕ¬YÓåu¯\¹²û¦è-{ßÿ›ª÷td¦|ðYÉ–‘wHÀ–¤(ðÞWj_-ž€Ëóç)޼º·?+¾µ—=nÓ¦MQKbæ¹. aüûˆ#â^ô²eËlöìÙöóÏ?Û˜1c졇r)oã~¢4+ôÀ}ô‘õéÓǶnÝj4°øÐÀZ·nûð7ËíÚµ³SN9%Íh$örª¶íi“g˜MþdfbOælëçNµU“¾°Æ§Þfk’V•ji0J¦$E7iרøHD ²eˆ[\÷ÙgŸ¹¶¼!l|ÇË—ÎËeAÉŒ7Θɋ ¿=z8Årâ‰'Ú%—\SdDäöá…ìú믷ž=#¿0"'Mð¨Q£¤Àãðt$[Ay—°aÞt«¾ïQV¶NS˪ÙÐ[ñßIQàO]b"pÚi§ÙGáÌî¡Ùãð¥ãG?õÔST±É\ (l>ô8àgnܸ±vwï½÷Ú Aƒ’Q5ßž“CYYYvß}÷ÙUW]e­[·{-ìÇéSûöív­ôMËÿ´b%JY…†-mãÂ_¤ÀCn¡x -ú‡@ÕªUwɇ/YØ6nܘPŽyÜSÚçuëÖÍ.½ôRkÖ¬YèÎ;íé§Ÿ¶³Î:+¡u VÀç ¤õŽëᢋ.²}öÙ'ìÍš5ËpÁDÚö ­LiæL±ŠÍ:ZV­F¶|ì‡V­ã¡)]ßDVN <‘´u®"#Ηéd/½ô’ë©czu&¶§žzÊ&OžìÌãçŸ~Äy·‡ bÕªUs=òHõÒúèZ¶li7Þx£‘DèÜsÏu ¥¼G¼÷Þ{QÍìy÷×ß©M`ç¶-–èuWëÔÛJ”)k9;¶ÛÖµ+¬tåš©]ñÕN ûl+V¬XØ‹\ºt©}úé§vÿý÷‡Ý®•'дiSûßÿþgwÞy§ËüwÐAÆ‚†DB‹/¶cŽ9ÆÝ›àZð ̰²u›9åMåËaF_0[ üÿïdqßÝQUXb$pä‘Gº™Øè=c’íÕ«Wp\úí·ß^¨ÒO?ýt§ðß|ó͈Ç=óÌ3.0®zõê÷ц‚hРÝqÇÆ0ž¡C‡$¸ñØcu®Š† ñ(z†'JüI`ýÜ€ù|ÏŽÁÊ—(pzä’¿ ¨®'!£ ä͇¯:š0d‰@)o¾tzÝW\q…ýç?ÿq‘ð]»vÍu8ÑÐÌÜFÐ$~p} œipáó¦Q6vìX{ä‘G¬\¹rN‘}ôÑ6a—0èµ×^s=ò<°P–øÕX%–ÀÖ5ËlÇælyî›U³‘mß°Ú¶o\o%ËÍPRï\~ø–÷Ã]RF€á^Ñ„¹Ò|ðAó²ÇargnuL»=ö˜Ñó«_¿¾+eÿÖ[o9“o$óz´si[tÄÜu×]®7Nn¢ÕqixB\D÷îÝ݇ñ÷¸1˜tçðÃw ?Y#¼úé;:u¯5í˜Ë5U,ðû,Wo/^©yçèdÀÖèo«  K šä"\pKÄ2räH7óŠä27ÝtSp.õ_|Ñ;ì0§Ô sí[p0§Nö<â" 3äa%ÁôΤ;XMž{î9cØŸ$õä24füß›uØ¥røÁ³~p‰™¸ž($/â`· ¸qÝdo#2šqèO<ñ„‹L'‘ËI'TÈÒµ{a `2'–×F~B#¯G}ÔˆI@ùã+ÿé§Ÿò;TÛH {Á,+]­®•,ÿEÅ;=Am[V-4"Ô3]dBÏô'@×_hŒ3òÉ'måÊ•v÷Ýw'_Á„Û¹sg»å–[œR`[É’¹bäz/]º´fb+4õø€ùœÆÕqÇçRÛb-á^1=¹øi¤I’Gàïàµðcý‹—,eek7±‹~µ Û&¯’)pæÜo—¨ª ©L`Ú´iöì³ÏºñÜW_}õ./z^ü^`U¸|íäèfÜ8&wüéž/]3±%箣´ŠÆ‡{‹Ÿü7Þ0æ¸ÇýAï^’XÛ6¬±u¿M¶*mzzÚ‹YØJ†|J–KX¹-fô_¤À{kt6ð'"ñ}cj%Ë>ÕHB›O8iÕª•ñAÂÍÄF€\~¹àÕ«u± ¾nùe—]æàˆf¯U«Vì'P "P¬x`Rš½:Ûê飉[¶>;ÑèÇæþítÉ\vnÛjʼn]2]ÔÏô'@ן/Æð„y_«7„,ßóÙÁó¥3KAdË–-.+Öìq9W¬û0e*énÃ%Å!ˆŒIcÂEüG;.Ö:ôxF\|ñÅnÖ³Ï?ÿÜe£Á†yQ’¢%À𰺇ü=ݰw¦%#_·*­»†”5ñVé;@@Alz D f·"Ù ©WéwÞyqSÞNu5“£`ž§Lì1xð`g@±'JÈ5N&ôœdU>¤Ñ|àÜð° /¼Ð™wÓUyà Êøæ+¯¼ÒùÒóÎĆ_:?!ï;c§™wAY3ì A1÷ìÙÓ¾ûî;× ?ôÐC­fÍš®‡JþqÌéø½1¡£È© ãá£ç öÁÄJ0ÜŒüåÌ”F«ÖIlvÄV\ýͼE$/ýö0å’mâĉv '¸`5ÌЙ&ygbËïú™k»Q£FvÍ5׸´±×]wZçõ’IeJæszópfv6f CIcåÀßM¾xæH§wNY‰E:.¿:¥Úv®³[·nî3{ölcŠSž5’ÂÀás’Âø; ]&ô¼ä¤ÀóÑßiKï!C\¯ˆi%™z’¡N’‚€ÝÔ©SÝ00r‰7nÜØtáëö_0&e²Ì‘u.4“s§“º”¡hüޞD;ÎÛÇoßž¯Ÿx"Ö±|‡y=ôÚýv]ɨ/É\ÈÀ&ÉM@ <7ý•†PÜL6‚Úwß}ŸRÃ…¿Ñô–ñU¨õ믿ºCªJÕ¡C7VžRQΡJ=ôL4˜HˆN¢n¿¬Ã'ÎD7§žzª >ÜÍcŽ%EN#GÀÎíÛþoõ¾ÃQ’GEëÒ‚Rô|xi’\äž{îqFiqqIº/âìqø°2«e.‰Nk.›c=ÖÆŽk¯¿þº‹@‘÷èÑc—¼úÑKË ­ô©Š@¿¥ÀÃsÑZ`<ô'Ÿ|â›à8p rYáýÄ—N)šC0©HùЈWJÚhçMÅm4‚öã3cÆ Ç…à>|äû1Sšää='?ºdWRà»2ÑŸX²d‰K®A°îÝ»»yºÓ9ªÜO·‰1õµaz7 €LT\Œ‹çÈ8¤ì%>eÉ á§ûº*jdŠRà‘Ùh‹O…{Μ9.#V NK­›ÇÐ3æK烄úÒ‡Ï3Ü2Uêׯo e$;ñÌ)O£‡ô³Þìu™Ê&Ç%q‘ª wÿE%­KyÛ¹‘ÇïüÛ7nt/:r—‡›ý*å/&+êK/ÈåÿòË/†©Þ3±äz"íÃ0³>}ú¸ÆÌ7ß|ãæžgŒ9ŠwP¸Ü"••.ëW—°·S <,­LU«V­r=²^‘Î’—]~)DSõZT¯‚ ò+ ³ y~ôtö¥Ó%fq#ï:¹â d]&ÍŸ³“!d¥ þ°dОRàt³ý|©A1déçŸv>B¦©L÷Þ˜ŸïW¼ëN²>˜Ú½!l¡¾t’Ã0ýg: ñ|["¿ä’Kìàƒvôor‘æ™Þ™êÔÏÞ4bv;ñÄ]wРAöÓ”ïm›5´R•j'‹ eàçeåA|÷¤À#³Ñ–`BŒÑ£G»©.y¹tÐAvùå—«·À{®§ÂŸ|Á8Ó;3±az'{œ§ÐÉ"Ç$-~ÆÑ3Ü ×Â!ÿ:Éfþöƒ­ûe’UnÕÕ*4mÈ^–~c‚ØŠ—ª ÷|&…ÊÐAìd1¥Æ wC¶mÙjõÚÔµ}ŽénsZ­#áʸqãì믿¶uëֹķß~»Õ­[7­®S“|$ŽÉ›=ŽÈvüé_}õ•SðɯåîÕ€ TªÕ¬mµÛõ²Û¶ØÚYlõôÑVq¯NV©ù¾V²läÄ0[~øÄÊl\•ÒÑíå·n±²(ñq¯ì ">jãºÕVbŸã­TíÄ7“¢À«”¬j÷Ü:°ˆ±ú³x¢l¯½ûj³cüYÿüjMχé&I%ÉìVŒ îׯŸµiÓ&¿Cµ]âF 03±Z“bx~C#Þ=Ó{*ûÒKU¨bÕ;nUÛhëæühËF¿ðW˜×÷·rõš 3®¼zõêJ|$Rø¦ þÀ8‘”xê­"RœÀÖ­[ [&LpÊ›—i È5ÅdŠ_†ª'Ƴ{çwæÊêK¿âŠ+RvV±â¥³¬ÊÞû[å–ûYöüŸ¦õQö×íRË®V±‰fBóûã-î÷;˜BõgÚNzÚ'NtßôTÈuþùçgdžëº5ªJxïy}éôÐS]˜ ¤Bã¶î³iÙûɧ}m Ê¥zÍU¿h¤À£ÑѶ| 0•ä¤I“Œ DjݺµuéÒÅú÷ï/³\¾ô´ƒß àKÏOH:D$¼gzO¶/½líÆÆgÛºU–3ö¥üª¯í)L@ <…oNªV¹Ÿ1óÁgß©S'—ÞñÚk¯Õ°¯T½iªWÒ`b'§A¤™Ø˜},‚O¼xVÙdœZçŒ)ð8Lçb˜,„HKOiW¬XÑå?ýôÓ­eË–)=%ï‹®Íø½D›‰-Y ÜôTËh¤À£ÑÉàmþùgPa3Œfï½÷vJ»oß¾V³fÍ &£KØ„úÒó+‰´©3gÎtæwåþÏVæm—ϼ{öŠ7lØ`3fÌp"l³²²œÂ&]#~íLÈ5ŒVŠ@ ð»ã÷øöÛogÌLlIÄí»SKûî–ŧÂDÎ2~qúôéî³lÙ2×Ënß¾½›‹X­ýøpV)" ÌïW^y¥+‚€Q/{œ7.‰LN>ùäXN¡c}L@ ÜÇ7¯0Uß¾}» ¢aZNLr¢1AH»víì¼óÎsY¦Hê HMy³ÇíØ±Ãþú믨•usik*ΨŒü¼Q ÜÏw/JÝI¤BÔë¬Y³\O›åF¹”¥'t’ >+]:=&;ˆ‚A›D m àKÏ/…œè›ϵ25)ViVËÔ ÌXV¡jÚ2É´ “O“;¾më6ç+ÃÄF/{þüùn†¥V­Z9“x‹-4Ä+Mîµ.C J jûƒ­\ƒ–¶eåBÛ¸èWû+ Ðsž”!gzàS%Ћ—ø—€¸OïÝꥫmùü¶tÞ2[6o¹Íùn® o>ÜPØgžy¦3‰“ÅGý’̪èÜ1`QNÀÙŒofº6½ì-Ž¢®Ù¨¦µé±·|æA–U¾L®SÓÒ–ˆ€ˆ€d)ð¼×›7n¶u«Ö[£½Zç#ö±Ê5+§`-U%dO&ýç®P©‚pb·[µZD@D@Ì|­À15_ýõvê©§Ú¾û=ô›ýçòË/®;v¬ <Øxà]rw?øàƒÖ£G—¯8x€D@D@‚~ûí7{òÉ'ƒ“%Ž ÙÃ;Ì Q nÐBÂø:sШQ£\šAXvv¶ æ" ‹±Ðž¼ñÆ6f̘]”7Û+½råJ·+Çy™¼cõ-" ™N`Á‚öè£ZNNŽK­Ì$GÏ=÷œË-ñÙgŸ¥ RGýõ×¾¸_÷À!|È!‡8ÅìÑ=z´Õ¯_ßHJ¯ûàƒv›X>öØc½ÝÜ÷æÍ›Ý÷‹/¾\ONp̼BÃJ•*…m°ïÚµk­reùªórÓß" éE`àÀV®\¹àEÝpà vÆg“U­úO’˜U«VÙÎ;Ã&›áKg+¿D4Á“„,`yåý^¶ìßS¡nÙ²ÅXW¾|ù½þ^Ìï½M&;ê̺ÐÎß.…¦Ð _÷ÀáˆgšKOé>ÜŽ8â;üðÃe„}˜—}/^ìš¼üòËNÑ£ð™ÎúwÜaO?ý´½úê«.ù Çþøã®…Y¯^=«^½ºÝzë­®ʶ^½zsÛ¶míª«®b•DD@2Š@ÿþýmݺuAK(=õîÝ»»TÍMš4±8À)w  hqm’–Tθ>'NœèxuìØÑÞzë­ ;ÞÑ={ötÏÈ&W¦ŒÝÿýV§N÷.¦ápóÍ7;Lçé²Ë. í½ÍÔ®wÝu—‘ܪnݺ®1nÜ8wl‡Œy!Ž?þx{å•W‚å¥ê‚ï¸7—îwß}ç{ %î)ð &¸›Ïƒ„ù‡Ö½n”0½nÖý÷¿ÿµ‹.ºÈÎ:ë,ûä“OÜúcŽ9ÆH=Љ9±ß|óM{þùçݹ8æá‡vÇÜwß}©zU/(2(bÒ4“9çœsl¯½ör'zÀÍ›7·~ýú¹m¼;?úè#C!¯X±ÂÅyŠ—÷)ùÝ=a™už°Ì<LÂôÌ3Ïï\&c¢çÿÅ_ØO<áÞӼϣ½·é½óþÿøãmÉ’%Ö­[7×0àpXbçÁŸB/¥ŽtîÜÙFŒa(wzä¡‚Ù;?aÆ.Zsy÷mÓ¦MðPf󒈀ˆ@&@qþûßÿv(&IÂîÉ{ìáéLÑ[FqzB§ˆÔÏá$´÷ímÇ|ŽÐ0@èé{‚›^{AÞÛ(}Oð¥ãG÷£¤…§ÇMt$>’PEMûÓO?µI“&¹ác…½AÜdZhL â9,_¾Ü_¶,í/" éHàÛo¿u&qüÙ(B/JÔS®˜¥zÝôžçÌ™İhÑ"7¼÷ÒK/u=öP:eä•‚Ly\÷¶÷>Ï[¾ßþö½ àø0ðk :ԙŽ›€2gì7нS§NÞê¨ß˜aÈ@„#¿7&tùQGeï¼óNÔ2´QD@Ò•J— –w#£{ˆÂŽÒÆçMlÖKäõ×_w+×{ÿý÷çMš§¨9–w8Ñ锿»ïÙXßÛ¡: ÕïaZ(pL6D=bBoß¾}y—.]ÜÐ/"™;· ‚ÒÇì~òÉ'»é8 v0`€aÚsÏ=9ýšk®)HQÚGD@ÒŽ ºAƒÖ²eK7jçÆo4|Ù¦mö!CÜ;³qãÆ6yòd·ÛÙ·Y³fÎŒN|áÂ…vÝu×±Éù‡ fŒø!9Ì 'œàÖö?"ßcyo÷éÓÇ2Ó8IuI :½ˆóPà(mÆô… cÄéM‡ C<áÁÁWã™rp8î¸ã\²ü/<¸žŒ?Þ[Ô·ˆ€¤5\•yßá.S:Å Ý­X±¢ëy&kÆjdÆP-zº¸(=¡£ÅûšÈp¢ÚC¥znÊ ý›}CýØÑÞÛ¡ï{ŽÃ*ÀÇ“Aƒ9‹‚Kå­OÅï´Qàñ„›•••«8:â$" " ù@9‡ZCóÁP­pÂqy•w¸ý ².–÷6æ~?HZ˜ÐýZux'M•%" "  " ž Ð:ˆ€ˆ€Ä“€x}b:¹ŽsŸì¿ÂT’ˆ€¯¼ùü“6aÂ_Õ9ã+{B[‹U‡Æ¤À¹±V ão¢ˆ€ˆ@Œêׯ¯wqŒ ýx¸|à~¼kª³ˆ€ˆ@ÆÏøG@D@D@üH@ ÜwMuÈxRàÿ€ˆ€ˆ€ Hûñ®©Î" " O@ <ãð#)p?Þ5ÕYD@D ã Hgü# " " ~$ îÇ»¦ƒÐIØgIDAT:‹€ˆ€d<)ðŒ@D@DÀ¤Àýx×TgŒ' žñ€ˆ€ˆ€ø‘€¸ïšê," "ñŠ5hÐ §[·nBD@D@DÀ/˜>öÿäÖœcÿ  IEND®B`‚asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/move2.png0000644000000000000000000012105515031566105023624 0ustar rootroot‰PNG  IHDR¥Ðkà sRGB®Îé@IDATxì]|Ç÷8(Np‚»»»C‘âÅZ¬P¬(RZ(ÐöOiÅ)P ¸Kpw‡â!hÐIÿ|'¿=ö.wÉ]NvïòÞçs¹½Ý‘7ßÙÌwß›7³q>|ø°œXF€` GÒèÁ*0Œ#À0—1`F€`ô‚“’^z‚õ`F€`K‰ïF€`ý À–’~ú‚5aF Ö#À¤ëo€`ý À¤¤Ÿ¾`MF€ˆõ0)Åú[€`F@?0)é§/XF€`b=LJ±þ`F€ÐLJúé Ö„`X“R¬¿F€`ôƒ“’~ú‚5aF Ö#À¤ëo€`ý À¤¤Ÿ¾`MF€ˆõÄwµjբ… ;¢(.ƒ`FÀ 8~ü8ýñÇT¾|y»´w)*TˆÆŽk—"œ™`FÀ}X»v-Ý»wÏnRb÷ûÞ¬9#À0‡“’Çu)7ˆ`÷E€IÉ}ûŽ5gFÀã`Rò¸.å1Œ#à¾0)¹oß±æŒ#Àx‰¾³•÷ïßÓ°aÃŒ²¤Nš*V¬HUªT1:oéÇ;wháÂ…2 ½yóæ–’9ìüÑ£GiéÒ¥ôßÿQŠ)¨råÊÔ«W/J”(‘Ãê0-( €ÆO?ýô“Sê9r$ 0€Ò¤IC8nÑ¢•(QÂHE‹Qüøñ©mÛ¶FçõcûöítûömêÞ½»ÝULž|ø@ÏŸ?'XRjñ÷÷§áÇ BH‹ùtéÒQ’$IÔÉ Ç/_¾”–NX*ÛXܽ{—† Bxê†~Š@ÇÒ¥K, •"QnÚ´i•SFß ±7oÞÐ'Ÿ|btÞÜL™2ѶmÛ"]z÷î|ºO™2e¤k!!!Û®$†~ßÿ=ýþûïÊ)‡~?}úÔlûA²=¢,Y²PܸŸ…пæÈýÕ«WÒB4g¾xñBb¨.çíÛ·Fä2mÚ´Hízüø±Ì‡!îXIÀbܸq‘Òó F€p=G××mT#ùY³fQÖ¬Y©@T´hQÚ³g¼V¿~}ù”ß·o_š2eŠ<çëëK9sæ¤5jPæÌ™%‘`ð†4hÐ@:åÊ•3¸ -•-3¨þ€$¡CûöíUg‰²gÏN›7o&Å5äççGuêÔ‘zbg ÃÅÁ*çâŋӈ#(_¾|”-[6êÒ¥ @V®\)õ7”ß¿Itpca ¤›7oHjæÌ™”#GY?êÀÀ AýuëÖ•iP×èÑ£¥†BUgÏž¥‡¬k..è÷š"°¶Ð–   *Uª3†°ˆ–$~_¸pA&E? íÈ_­Z5Ê•+mذA^ƒËDÑ®];Ið8‰6}öÙg2]ÆŒé×_•iñçÌ™3T¶lYÊ›7¯Äu‚d/^¼(Ézz{{Ë2êÕ«']®È‡‡ ܰ¤pŸtìØQêk¸Ÿà ÆýÇÂ0Ú# )-X°@ž?üðƒœ³8qâ „$OžœjÖ¬IX±­ê1 2X³f A/eE7ÚÂ@?¯_¿^ºhoݺeè £=éÓ§§ÿý—:tè ‹>xð 5kÖL–ƒ-K@J p´¿U«V’|ÐNä]¾|9Ao!pƒž°Æ`‰‚, 쫯¾’dröèÜ?ô,h¸ÿXF@{4#% Xø`ÀGðsKŸ~ú©´D0hco=X $Sµ O×-[¶4<ã ƒ$Üj¶” —“%W Ê…€„öîÝ+ˇ; ½{÷¦#GŽ\YŠÀݘ0aB©mÁ€Þ¸qcÃ`¹`‚ÁÞœÀ2@ž’%K,?Ì› þÈ8bß) Þ–V…9RÂ@×§ú£vµiÓ†6nÜ(- 'ŽqN´ý€µÀ½¦¬Ô›ÅÚRvž 6êó8F^ER„Ń~ƒµdºÙ#¬¤¨÷.?EàâT ôAÙ,Œ# =š‘’iÓ•nƒ°~ûí7C2 ¦æ0ØÃ•£Dq©iõ5[ÊÆÜȤI“ó0ê –ÂÀ¥Ë: · xþüyY%ÈçòåËÒ½¥B€«R™?ƒ[ <\_˜kAè¹%QOì+i`1@¸ ºXX 2[Ä â‚ Ö-¬1¡"j«.2X3h#úÇ4²ø ,sb®H‡~K•*•t½)îÔ'Ožæ†Ì•…sJ H sz={öHý0Ï XMZò$ÿaMÐÌ}‡A ƒ>=ƼÜ(˜€G¸5ÜC "&Õ1)ŽAÈT0¡y$e~¡æ(.;sbKÙp!V­Z•|  ¬(¿gÏž„è7¸Ù@ #D{)OÛ –ÚµkË4Ð4BË!h\QpIB@HpCÁ½§¸ßä+ÿ`âÌ©a&Ž- ˆVÁÕRKçaI8ñ1]»„¹30€‹õ€DH+,aæôà’…²ÃœTtòFÔݲeË$žp ¢W­Z%³¢%ºQ]¬]Ž‚æ%ÑpƒB`}ã4g=ªËácF€p u]SŸ¡–Î;Žñ4‹A Ä‚'e¸³`íà, ¶'N4û4‹ù,0EÈ6¢Á@väM#æ”Êl)O䘀û .±dÉ’ÉAóqÖ‚*P?&ÿ‘î:µÅãåå%‰Äýš4iBXk¥{¬ÝÂ"V[õƒ0Ђ A–sÞ¿¿Ù¢L-P³‰,œ„ë Áø¨-G$G½ 0úL!a¯ ¸} KåÁƒ/Å2Æ|tW‚,T-­.àׯ_? ÷pC° A'pÃá Š€ôA’˜Ÿ‚•‡ßȇ(>¬JènɲVÊáoF€p qÄ òÁÞª0P8c"ïðä'] „Q ž¢1âó?—QTiqÍ–²‘^™Á|•z~× °àª)AÅÅ„€$\føà „Z0ÀbnAJ@€úztÇX1¨Â‡¹&Œ hƒ±9©T©’Ü-ß¶ ,´ÁŠ õ‡Ö¬z~IIƒ¹ôˆI™+R®áæ}g­(ч–Ò[ê#XàÀH-ÊZ1sQêt|Ì0®C@³9%×5QÛš0HÃÅhI°»ž.îSQžö1¿† ¸Ã,¹/Q±Â237GgI¬Âz¢Å‹G"¸òà²t7ÁÚ$·¹wk ëËx ºvßy ÈÜF€`<G¹ïØRòô;…ÛÇ0Œ€!À¤äFŪ2Œ#àé0)yzsûF€p#˜”ܨ³XUF€`<&%Oïan#À0n„“’u«Ê0Œ€§#À¤äé=ÌícFÀ`Rr£ÎbUF€ðt˜”<½‡¹}Œ#À¸LJnÔY¬*#À0žŽ“’§÷0·`7B€IÉ:‹UeFÀÓ`Ròôæö1Œ#àF0)¹Qg±ªŒ#Àx:LJžÞÃÜ>F€`Ü&%7ê,V•`OG€IÉÓ{˜ÛÇ0Œ€!ßt}úô)>|ˆÎŸ>Dwn_§d^ñ(ôÍñ n/J?žQ>| ú þĉGžÇ±"8§üŽ7½ÿñšéouZäW_DZRŽAyñâÅ•åÞ¸ý€2fHKAá”*uz*X´,•)[‘òçϯ$çïXˆÀíÛ·éØ±£tþüqzüø¡xµ|b ¯dOe¸gËû÷ïåoå^Æwܸ¸·ÞKÔ”ûS}ÎÒ±fukÎ+õ¨ÓâX}^]¦¹óÊ9%ò­œÇ7>¯^R‚ )(è %I’Œòæ-LÅ‹—¦Ò¥K˶›êÀ¿=]“Ò;whͪ%tãÊ ªU6u¬çM>Y«S’Ä Ü¦70˜ø?zE'ΡówQÐÛäÔ¬eg*W®œÑ ä6 bEc„À¹sçhÍš¥ø˜j×.DÔ ¬YÓ‰‡㇪î™^ÒéÓ×éȑմdÉ\ªSçSª[·® -÷ùß÷ÀnqI“âˆAó£¹Ã*ûõëGãÆ‹aîÈÙBCCiù²Åtú¨/µª›ª—Ï)nFÏøç½zó ý³î2…ÆÍL_vïKY²d‰ Ÿñž={F Ì¡/nS‡U¨dɼÓ6W5äáÃg´xñ^º~ý%uêÔ“ .쪪¹X»v-%Nœ˜ZµjeC®ÈIu7§äïïO£F~Kq_¡©#«Q*y<†ÞœéhÌ7U¨^é÷4áçA´o߾ȽÂg<XG?ý4” JHüÑ• )†½š!CjúöÛæÔ·ouZ¸p2íØ±Íà†a‘œMÇ芔h`¿®Ô¬JbêÙ®%L¨kï¢]ÝZ«Rnúy@Ú¶ö/Z»f•]eqfý!pñâE?þúôÙgUô§ jT° Mœø%]¸°¦M›ÌÄä†}hʺ!¥›7oÒà_Òè¾¥©V¥<ÖèîöiÒ§MF£û•§íæÒNñôÇâ­X4‰]y޼³5*ëÂ… ´jÕ<ñDß2fL£‘ž_í˜1Éßÿ?Ú¼y£ç76–µPsRBˆëô©¨eÍtT¶x6—ÀãÎSò³å›y¬="ZîžKtA%É’&¢?†×¢ÕKÿ"???—ÕË9—/_Òœ9Ò AEK:ÇÎ¥!€òiÓúˆ¥"›èèÑ£F×ø‡{# 9)ùún¡äñPýꮋJzøä5-\}ÒbϽø€žY¼nÍ…áã7Ó€Ñë¬I*ÓÀ•×®AVš7{ŠÓ|åÿþû/ 6ŒÂ¢ÔëÚµk4zôh‹iV¬XAëׯ—×.\(æM¾#ä1•ýû÷Ëk»ví2½d×o¸zGŽiWÎȼdÉBªQ#7åË皇+u†Ÿ-Â̧ªOÅèØQåĨr3%L˜@?4!ãsD¨} ¹9¹^Д”p#mY¿ˆzµ/n>¡¡oéŽßsÃB¨2G—öÕë7ôòUˆQÿLjG j/rE9AÁæóà0AbÆÿAabál¨Q¹Ñý@ðC¢÷÷òäNÇO—ÓhÛ¶¨ç¯=zDË—/·¨îáÇéøñãòº¯¯/MŸ>þùçŸHé'Mš$¯{,wTð;ò=í_Ù›N_¸Oãgì‘yƒC),ü<þfÌzzðø5]Ú9„žý‰2¦ONíû-–×fÿ+ô¤xcß0z"ô)'æÄú ’ú¡êÕ¡uþ¬­›ó…Lkí¬cJÿ5]¾|ÙÚ,V¥[´h‘ ZËêùóç†|÷ïß» Ô¦L™2‰Á"aœZ6mÚD¹sçƒMf1@Õ"¤WK•*UÄà(v­8qÂpzãÆb°++Ðs+HóÅ_ÈrråÊEÍš5OêOd¸äÒ¤IC°®PWöìÙé‡~nĬY³Ê<ƒ 2”ü믿OʹÄÀžU ^í .œ¨ê™1c†X€Ù‰ºwïN SG¶ÁºwïŠø£_Ô ëí´iÄ ºEÌA ¦Áƒg+Ë_o¢Õ«÷Ñ­[KÅDkiöìAbÁí8y z¾~Bû÷Ÿu-Öôt±˜ô¾° œ:S¯^M©sçú´n]Ä"öéÓ× ½EÚãu”*U2A~³goõì§7–ÈkåÊn°ÉfË)Z4'5lXNÂtíš-[¶[l“4Cæûî»vRÁÿ2>aaoiîÜÍŠý^bqƒ!8Y²$Bï)²ŒáÃçˆ>í"ò¯¥3gæÈ6Ÿ:u•š4© ·Ú¹ó”Lâ\¹r/µiSCþŽêOÒ¤IĽæ#êˆ ð¨Òò5ý# )]½z•Ò$GÒb5J¯8N­3äiZ·0e΂|÷\‘eÔ«–¾íá>‰.-2 ïS‹Ò¤JJ•Jç 6‹‘ï^c"xó&œæ¯8Aßt­BéÓ$£pa]õíR™vº.]~ V .­ÊPÖL)ÅJæ4꛺ÔÿËÊV·ÇRŠÅSÓñc‡,]¶ù<~Q»ví$©xyyæ™R¦LIp³-]º”vïÞm¨ ˆ¤wïÞb°¼E]»v¥-[¶¹^°—Ù§Ÿ~*ºÕ†|8nÑ¢…‘ õ<|øP’×Ý»w…%¾üòKC¸±¾z€œðA4>(oÖ¬Y„µlXb˜ìyÉ…ªH‰ª3iÒ¤™ÁÎ? ã²esZe%-_¾[hzáæ«)k­W¯¬|G‹âñ…•!v0iU]à’Z^kÚ´² ã´äë{Ì áøñ=…îIÄ~pù¨bÅB¢ýw ×ÔŸ^[XUýå)¤Á¾Œ/Þ‘¿,ØJ]ºÔ—z ÄzÔ¨.Ô¿KuvÃ1ôûöÛ6òwºt)ÅÀÿ§ÌwëÖéB¼ví>@ùå—î„<(‚< àÂ…sÈ{„Õºu AJ/èêU?a]%m@›š5«,‰ùvï>-ï± "碒*U Ò©SŽûŸ‰ª.¾æ\4#¥ þ£Ò…RÙÔºÛb ÖˆZ²gNE\0•èÒfd˜#kÄ??òÂÊzòÌØ¥„2ðØûû5”¿æxùiÖ}¾$¯ޮÈÞP5®CóR†ß1=(]4 ]<÷q Ši9J¾eË–I7\iØ; ¢¸ð@DøöÛo)gΜT¢D ñt1!?\p)R¤OÄå7,’B… )E¾?ûì3éÂ^ ŽWRSy½èÂZëÓ§´žPoÏž=eùj÷æ½`15hÐ@– ‹ÖVÍš5)~üøF°œ¶|ùò’wìØ!æ2¢¯'mÚ´b‡…?̺ ²áàÒ¥3ÂÝ–Ûª·o?¤²¥mÑ¢ªèq V‹Z`í`›EÒ§ÿø?“$I"a„+—Œ¾aE5j4TXKmn0õœN„ÿÒ¤I!,²:FùÍýÀ<ÑÈ‘óÄæ±M¥›ðС ‘’)’Óè\¡B>†ÍTñð²nÝAòñi+ÚÙK+ÎÅä “÷'ôü™q;cRŽ’gñâÅÂÕs] >òîàà`ÂŽÕ°\0¿ƒ˜Áñ‚ äOXMôÕ¢N«œ‡ s8Ï…õR¡B#×,#Ö7ß|c¤.C5)y{{Ë"A@¸çe„Iv n°²”öà:öCƒ5eM= 0ÒA)?¦ß~~w„.Ö=ѧM›BXgŒªš6mä+‹Á>E$ËçìÙÒ²P2¨w¥WΙ~ç=&HkhÏžI²­C‡Î¢+W"¬*ÔÒRäþý'ââ€x`h®œ2û=yòJºtéŽpß®ÖÜn«Ví3›ÖÜI¤©?>ƒŠè×\¹Ú’Ö©SJÍ›7—¤„÷;Ám7uêT¬€ qA,ŠÀAðL&ƒèÌ ˆk˜Ž9"&®›%I:µ´¸æÎ+£¤0W…µP˜« Û* R„·C@HX7…ÈBG×c^Ï­¶¼ŠÏ-ó>bîh” ¢bþk–Øýáki!ŒÑAÎ!!:­pá/ÄàObÒa¤vÙYÒ§~ý²bní„°ªF‰w%áÿd… u CŦ–bdz2BoذöÂÍ$܈ÄAk±`û‰¶ˆˆŽS—ƒº6l8DcÆ,”Õ¢Œ-[ŽÊ¨»lÙZ‹þ,(î§ "pc¬%µŒÎ7i‚÷‰e“u".º=Ë@Xk¸ð0÷õÅõòZóãíÛp£kòpý! Ù«+~Þ—uÌJ™¼msáB¬Qzþ2XÌçx‹‰Ò7%h£K —^¨Ê)Ùh¢n¨J[DÌÁetùÆéë."æžLÑGbN –,+µ Pâ˜`Nê1髾Ýñ ÿ;@£þ/f„¦”E²yóæ¥ŸþYF§)çñ}öìY‚ËmçÎ’lôì{ôè!ÉÌ¿€@Ò§O/Dô]ñâÅÅøѧ‰$q!ÚÒ„`þhÆ ’p7ÜéÓ§ ÑoØ.ë¥0gW¥¥z”uZëÖ­“e:âO¯^Ä|Ù76*­Ÿ ‘òaÒóç¢}ÙÖß;°Ð€ ,üٳׂ82Êß G‚—W„‡âÑ£g¯ø‚ȃLË‘™ÿ÷ÿ W®Ü£°¢p“Ú,Ú# <h¯IìÖÿÜîhFJîs[ð@¬3ÁŽ˜È"€|Á%n‡?»]—±Â:F@3R áÍ6š:ÒѪ½zìè"¹<'!ðüù+'•ÌÅÚ‚@pp¨Ñ‹mÉËiõƒ€f¤äí^¾ÉU?PèK“xñyQ±¾zIJ6©R¥ïÚ²œ‚¯¸lÖž"…íïgs…n\‡õhFJi½3“ŸxÁKdðÚõÀ`Þ×.22ú<“&Mzñâˆ7§êSÃØ¡Õ½{òE”±£µžÛJÍH)»O>ºåè¹ÈÚѲÛ÷ÄÛ7}rÛQgu%>>¹èÖ­‡®¬’ë2AoË}ùò|#²É%þéfhFJÅŠ£ãž¹\®Q÷ä¨H ~{¦kж¿–"EJÒ±c7í/ˆKˆ1'O^¯/Ê‹gcŒ ~2jFJÞÞÞ”"u6:ýß}ý ¡MÂÃßÑÎc©B&%t‡U*”(Q‚Ο¿OÏŸ¿¶*='r<¾¾gÅÿLUÇÌ%ºÍH -­Y·mØsÇåÖs…{ŽÜ¤\ùJó"X=w’‰nx•|¥JµhÓ¦c&Wø§+¸yÓŸ?£’%Kº¢:®ÃÉhJJ+V¤§AÉéìE'7Ó=Š {K+¶Ý¥æŸµw…YK5¡]»®P@ï@qÑÁ‚»éÓOÛ°ëÎEx;»MI ‹;Ù—f,»$^ÍÀ¯óþ{ÕY*Q®>eÏžÝÙýÎå;”)SRÆ­iÚ4Ëï­rp•\œ@`ûö“bìHNU«²ëÎSnMI æË—JThLçÇn×ÇÞ#7è¿; ©u›Ï=åÞŠuí¨[·® SˆW×ï‰um×¢Á·n= Å‹P·n½µ¨žëtš“ÚÕF Äï³S§ËÔL}»ëÐuúg“?õ0œ0?ÁâžÀòïÝ»¿xz¿.æ—Ž¸g#ÜDëk×üè×_×Ò_ô!M±xº %¼fȰQô!QVúuú>ÏA׊–øî¹Líû/§o†Œ£L™2Y‘ƒ“èO>ùD –“háÂô~ýa=«ê¶º!°!_¾Nâa¶'7¸m/ZV\¤õðr®ÉSfQ å¢_gŠsL¾{®ÒÊ]tèðqžG²|ºÝX»?ÿümÙr-ÚÉïøq`ž?“~ùeíÙ³‡Ê”)ãÀ’¹(½  R &¤ÁC¤ÔÙkÑ€Ÿ÷zlTÞÓgA4fêAÚu6>øñwÞE/ÿ Ô#}úôôÃãèæÍ84dÈßäçÇÛÙoPPÍžíKS¦ì¡¯¾BXÆâ™hö>%Kp•׾}'*UªÍ7…ÒîºMMªg§…3[Êâ6ç>~E¾ûnÒÞS/¨Á§¨~ýÆê6½g»¢É’%£o¾L Q£þ¡bÅ2н’”+—ûß˶£³x›"ìÖ­;-,£êâMËß——WÌ ã\n@ñ²=»ßѯ_?7nœÃ Õ:D»¶­¥—ÏîR™B©)G–d”%C Jœ(>ÅW¸FH¼mÒ¸ê÷ï?¾RÝ ž?þøƒvîÜO5jÔ ?ÿœAéÒ“‚«Z9eÊ'4lØ÷Ô¼ysWUi¨8d̘Cz[R¤HC3gÎÔ ƒR| ó5S+fbþÂÒoܸ±ˆ$ûEÌ“Œ¡U«VÅÚ–Ó AƒhëÖ­tíÚ5*_¾<íØ±#öÝÜb‰“ߌ€‹ظq£ØÑºÁ%½k×.êÓ§»uE”-[–á™0)yf¿r«t„&îá’J•*•\â E0Žà°Z•\¹rÉ0úîÝ»Kg§NèÅ‹Vçç„’{ökíPëÖ­é»ï¾£Šm‡¶PÖ¬YÝ@sý¨˜ A²~ýz:|ø°x™b%>Ï›Ý꧇¯ “’ã1å¹7¢Èà¶óõõáÖÃä6†&fÀÒaÝRýúõeÔâ»wïbVçÒ5LJºîVÎݧ‘#GŠ7¡~*#ìMrb±4iÒÐòåËéÿþïÿäú® н{÷ì/˜KÐLJºêVF\¼x‘^¾Œþ5ç7nÜ :uêˆCgÓÔ©SÅë+ÞH«'A´ß¼yó"©„Åé*P ¢Þ (@GUŸÖü¸gÏžÒ}þü9U¬X‘Ö¬Yc•N°´Ô;¼X•‰¹&%—Cκ÷ïß—A +V¬ˆRí%K–Påʕއoiß¾}„Iy= ¶ºúæ›ohÆ FêaÍtWäáÇԤI¼Xž=eÉ’E¾Öƒ8sº›À"ÂËôÖ®]kX8ëååE;vt·¦H}ÎŽÈ;ìD ,~ýúµ¡-˜O¯ )áÖ ;–&NœhHÇÚ"À–’¶øsí:AæQÔs+P éÆŸ8‡0j„NŸ>}Ú­c‚P•y¸òzôèAI“&ÕI¯Ø¦Ö^a}Õ¡C‡dÈ·šP,`¤Q÷'ÚŽm—°•‹>`KIýÀZhŒ^¼‡'lµë…2hgÏž]F¤•*UŠJ–,IE‹%ì*à΂EÁx5;Ÿ¢íØ™Â]dºnÝ:Ù¬C:uê”ü`ôÿý' É´OÑVD!bMÚæÍ›Ýµé¥7“’Gu'7&&`)æÔ„”1cFI@ PñâÅ Áž(Ø ¤„°~ÉÝn:lõ„OÛ¶mesð`P~X¶'Ož”›Ì"V®á-·[·n• ¢Ý½ýî®?“’»÷  ôúô©´ðäyóæMi Š ƒ´½¥¨ õ@¯¬Áy<±ª}û¦¿ÕiMÓ#­RŽAyxêÅ7&´±í &º±wHëW°;ƒ© ,ìõ–-[6ia= öJÓ‹8´a¹3Wâï œqŸbÿB|”ÍrqÂÂ}}öìYJ‘"…+Tá:¢A ޏ!?D“&ÚËXˆ7nܸhÓq÷B;ö~Ã&,¼ÆÛ¹$NœØm‚ÛûñãÇòe{xá~Ã"ÀÂP…8õÚÆ_¯=Ãz™C3ðÿe0)Ùƒž‡æÅä²eËä„qµjÕ¨L™22jÉš‹µ)x-9"è0©:½ 㯷a}¬AÀQ¤o”k*Œ* þÉkÕªU¾æ&`o7X½p‹}ùå—2ä.1O¼t$‹:7Àeƒ½㯗ž`=lE‘p“Ú»<‚ç”lEÞƒÓcaß¾}©uëÖÿ o¼¢[Îà¥ohwóæÍ5ïYÆ_ó.`t€ÀÇYb(Ã*h‡07ˆW`ÀŽ ‚`¸ðàvÐzsNÆGl¸å¸V À¤dHžžïÁûÚµkg·éínX!‚pèСҕ‡×kk!Œ¿¶økÑç\§e˜”,c+® |zÊ”)T¹re·ßù:¦†­u°VgñâņÞÅ´,[ó1þDZâokqzç#À¤ä|Œu]ƒ¯¯¯\׃×dÇf+ïß™5k–ÑÚ*gcÂøG ¬þÎî_.ßv˜”lÇÌcràev˜OiÙ²¥Ç´Éž†`. QyØ–ÆÂø£ìjükç_zA€II/=¡åÇ ÷T©RiP»>«lР­X±Â%Ê1þ‘av%þ‘kç3z@€II½ ØÙ`÷îÝT±bE j×o•>>>r§¬¹p¦0þæÑuþækç³z@€II½ Ø»*§M›VƒÚõ]%ÿáµÎÆß2º®Àßrí|Ek˜”´îêÇ>pùòåÓ¨v}W‹AñÌ™3NU’ñ· ¯+ð·\;_Ñ&%­{@£ú±Ù'^ÏÀ¼UöÙ³g‘/8ð ãoLWào¹v¾¢5LJZ÷€FõcÐõÔ÷Ù )vwöËû˽ä ü-×ÎW´F€IIëШþû÷ï˲5ª^÷ÕâÅÎÆ?jtÔµóU-`RÒ} 놋ēvÿv4”Îaü£î1gãuí|UK˜”´D_ú’Œ‹yœ ãow嬳ñWêáoý!À¤¤¿>q‰FØsÿñ-C |œ)ŒÔè:ÿ¨kç«Z"À¤¤%úÖÉd¼ÈÅ<Î~U:ãow嬳ñWêáoý!À£’þú„5bF Ö"À¤K»®;v‘Xî|g»6ËØãŠ³ñºv¾ª%LJZ¢Ïu3Œ#À!ßèÿˆ5<~ü˜ÆŒC‰'Ž5m¶¥¡ $°%¹Íiÿ¨!s6þQ×ÎWµD€IIKô5¬ëdz÷îM2dÐP ýV=qâD§*ÇøG ¯³ñºv¾ª%ì¾Ó}®›`FÀ&%#8bÏ„ƒsØ­åþvv¸<ão{\q6þQ×îü«K—.¥“'OÊŠhÖ¬Yôüùsù¯MqÕ‹&ßRÛk`R²3ÎÁ0Œ€]üòË/´mÛ6Y†ŸŸ 4ˆ=z$oÞ¼™ÆoWùç”ܹ÷XwF€pKΞ=kлX±bôêÕ+ÃïQ£F>±UØRŠ¥=u ì¾³ÜùÎ^'Ãø[ÆWœÔµóU-`RÒ}®›`FÀ&%#8bÏ   ÞÑ!Šî Œâªý—ÿ¨1t6þQ×ÎWµD€IIKô5¬ëdÞ¼y£¡ú®ÚÙïšbü£îgãuí|UK˜”´D_ú±hV‰öÑP ]V ² qªnŒ¿ex]¿åÚùŠÖ0)iÝÕŸ#GzðàFµë»ZÊ™3§S•dü-Ãë ü-×ÎW´F€IIëШ~„¡^¾|Y£Úõ]í¥K—¨dÉ’NU’ñ· ¯+ð·\;_Ñ&%­{@£ú½½½)]ºt„€å#ááátêÔ)ªP¡ÂÇ“N8bü̓ê*üÍ×Îgõ€“’zA#êÕ«GШv}V{üøq*P ¥M›Öé 2þ‘!v%þ‘kç3z@€II½ ‘+V¤ÐÐPºråŠFè«Z<¥ïÝ»—Z¶léÅc˜]¿qíüK/0)é¥'4Ð;:tëÖÖ®]Kaaah ¯*×­[G ŠìÙ³»D1ÆßfWão\;ÿÒ LJzé ôÈ—/UªT‰–,Y¢‘ú¨n#D#¶iÓÆ¥ 1þpk…¿K;›+³ &%«`òìDmÛ¶%,V1b„g7ÔBëŽ=J;wî¤R¢D‰,¤rÞiÆ_[ü׳\rL`RŠ j–„4|øpòòò¢yóæyXë¢n=†*?™2eŠ:±“®2þÚâï¤nåbcˆ“R ó´lx©ÚÔ©S)A‚4þüX1ÇtðàAÂçÈ‘#.›G²tß0þ®™Ç³„?Ÿ×LJúé Í5I˜0! 6ŒrçÎM'Nôب<¼ásöìÙrñðèÑ£ ûÐéA=ôë 5ü’?­{@gõÕôùçŸSéÒ¥iΜ9´oß>ª\¹²\»£3UmVçéÓ§tèÐ!:þ<5kÖŒêׯ¯»×n3þ6w+gð0∗i}°·Mýúõ£qãÆÙ[ ç׸50ˆoݺ•žÎÌ0Œ#àH˜”‰&—Å0Œ#`LJvÁÇ™F€`‰“’#Ñä²F€`ìB@3Rú÷ßiذafÔ€àà`Z¸p!}ÿý÷FçõÁ†óçϧ/¾ø‚jÖ¬I]ºt¡íÛ·;ªx‹åLž<™Ž?nñº=häÈ‘²D½?S9wî1Âô´SÿöÛoióîÝ»iÞ¼yQêèòöE©_d!  )…‡‡ÓðáÃiÚ´i´mÛ6#Å—.]JãÆ£%JÈóeÊ”¡}ûö¥‰éÔÛ¦Múé§Ÿ¨P¡BÔµkWJ˜0!uìØ‘ãrP¤@IDATþøã˜kU¾«W¯ÈÃ2jÔ(*Z´¨,øæÍ›#UsãÆ š9sf¤óŽûLž~þüy$k ÖγgÏÔÙ"¿|ù2Ò9|˜Ø!ƒß¡C‡(}úôҚ „¹¸ª@P>¤±cÇJ‹ Ä{nêÔ©’‹N- •›7o¹—”ëÐ1ø§I“†°ø«S§Nô×_I—$‰òY³f ÁMvïÞ=*_¾Â•Ò¤]½z5Õ©S‡’&M*‰I™?ƒž˜÷•xíÚ5*[¶¬tüüüä|×Ï?ÿ,ˇ5‰öbÎÄœ@¿\¹r]ÂüÑ×_mô™3gŽ! ¬ªõë×K¼prïÞ½Ò"q†††Ò²eËèÛo¿•XÌ;—H—.]ŠH-yòäwÛ'Ÿ|"ëÛ±c‡l+°¯T©’ÁMU_šö;pƒeABw´ñÖ­[TºtiIRò¢ø’wÅ¡R3Œ€cp9)aÀÆO‚ èÓO?ä³ÔD H÷)¬ ˜"pû$Ò¦M«œ’ßxÂ1%NœØè¼él"„ÕUbPÏUÀrAšD‰ÑСCé¿ÿþ“‚ùª7J—êÃ1Ιè˜/_>J:5µjÕŠà†ƒ€ð0ßK„€ ´–¤«N-Ð+]ºtF…$m #ˆVŽ‚ Èd iܸ1+VLÎýYƒÌ¤úƒ@̦L™R–¥´Óš¾Tc8ĶVp»Â*…¾–éÕ«—á:°º|ù²á70Œ€{!`÷6C¶6î&L~ûøøÈ¬oÞ¼‘sûömÃ9Ke" æœÔ.;¤EŠ.\X94úÆ@ W,XEjÁ¼Üi° 0„§oµdÏž]>+ç@„ŠdÈAºýÄP·n]yƒ}ܸq¥K Ö“9i(’$Ii¡à7¬/uù86' fàaêŽÙÁ¢T ÈN± 0˜ck(Ü_ Ü ’›’\¦L™dê‹C!ÿ;>ЍÛiM_*ùÔßwîÜ‘d®œƒu‹9'E@V'OžT~ò7#À¸.µ”Μ9C˜{€ûä€@P° ¢ ä€ð$¬|0 ÂÒ°F0‡£ Ìêôû÷ï§éӧ˹* rÊÓ¼’®" vЍ'Ø1‚ÔÐX~ 6 ö è?¾yÞW比2•oXxW®\Q~Êo¸¾Ì "A~pùÙ*ŠU‡>IU©RÅP„º}8‰y!¥5Ø ùߥvÆ´/¡ƒ¸[ÕQ…pëFeYšêÇ¿F@_¸””`%U«VMNðcS>˜C²DJè1iذ¡t‰a‚@LŠcžÊA€æŸàòQ¢óΟ?/ç±0…Áó*p‰)aÕˆ ‰*Ñ€¨g¾˜×À¼æyà†B°CªT©¤ ìA”ø¨Ÿà­Ñi`YÁˆy,æOŽ=j6;®5³‰,œ¬\¹²l/Bó¡3ÈM„à+ÄŒuOÀé£Ã}…ùµåª”iú]_ªû]îD>BÄј;„Õ¥ îOF€pOÌ?Æ;¡-¬0ÀaßT`]Lœ8ÑìBK¸™zöì);ÌÃÀj ÀrATò!²ËûÁýû÷—k¤œ—æ$"5…óH«sJíÛ·7Tù<ƒ4 ‡za'0ÙOñâÅ y¬=€{ ‹N‡òa†¹3¸ÍIÕªUcDJ !XrXÔ‹yµ`PLjhT¬¨°®ˆŒD$#¢’èúRÝïêr€k8a>s“jW%\ø_XFÀ=°û}JÔý>%¬—(®0¸h0—2Âào«`°ÇÜ–Q,$SAx‡[.#E~ÆŒ2bšéüÒ!DDëËVõ+ó8 è‚I™Î…¡lX4¸‹OÁÇÚ:áö‚%†tE¾ûî;Iöþù§œûCdŸi¸¹%l”20¿¦ÆL9oî;ª¾4íwu~X¼h/ˆI¸=ûéÓ§mÆB)ƒ¿F æÀŽ©KKX¬)Ùe–’5ÊXJËD-˜jAˆò©S§ä|WL\w( $_¡BiÉ᮪³gÏF 0PêI­†ðsDìY#ì1€ƒ\±{†9%…²ÍItØXKH(;ª¾4íwµ.ˆ~4¬gÂ:+[ÉÙ´þÍ0Ú!ðq"A;ܪf¸äÔáÕjå±NîAÌ™–:]TÇl1¸þý÷ßraØp{bAª%Áް”¬F`A0¬/Ìí¨.KsÖŸ:Aæˆî³6èEm`F€È-ÜwÜQŒ#À0úGÀî;¶”ôßϬ!#À0±&¥XÓÕÜPF€`ô“’þûˆ5dF Ö À¤kºšÊ0Œ€þ`RÒ±†Œ#ÀĘ”bMWsCF€Ð?LJúï#Ö`Xƒ“R¬éjn(#À0úG€IIÿ}Ä2Œ#k`RŠ5]Í eF@ÿ0)é¿XCF€`b LJ±¦«¹¡Œ#Àè&%ý÷kÈ0Œ@¬A€I)Öt57”`ý#À¤¤ÿ>b F€ˆ50)Åš®æ†2Œ# ˜”ôßG¬!#À0±øîÔÒ/^ÐíÛ·éñãÇ@‰%¢¸q#x5Nœ8†¦¼ÿ^žÿðáá£Ò(¿ÕǸŽrOÓëêßH«”óŠàœríéÓ§”9sfJ™2%eÉ’…²fͪ$ãoF@"(ïç‡Ò›7oèíÛ·dÔ÷’r¬ÜŸÊ½¨|#“rÿªÏ© «ÒªÏEw¬”ošN]‡r¬N«œS¾‘_¹Žsø ]øV$^¼xòÕö2d J–,™r‰¿cº'¥   Ú»w/9°•^=@92'¥¬’PÂ÷á”ämŠ÷?RRúJÐ qãÿï&¯"%œS~«‘×ô7²«²Šš¿ÿW´Q=(eÇrû@IBéÍý$tùÊ{Ú²:ˆ^Ç¥Re«Qšu™ V,•ÐÐP:|ø08°ƒ=ò£ìÙÓ’OZ1ð&YsÄÉ{.bÐþ`tÿŋܸœr*ׯúX ·¥óê4¦Ç–ò¨Ï+ÇŠ.(C9V®™ž3m+®¿{÷^¼£3gžÒ;OÉÛ; U®\›*T¨ D‘†ÅsÐ-)………цõkiïŽ5Tª`2êÝÒ‡rûtÛžxHOœ£Éã·R¶\¥¨uÛ΄'A–ج­[·’¯ïj*P =uìX‚ l*­†Ø@ÌZ Ü.^¼C[¶l§5kSýú-¨^½zŒ[Ìàt‹\qÄ“ÊGÿ–*¯\¹’‚ƒƒ©yóæ6æŒ:ùÕ«WiîÌ?¨°Ï{j׸ ¥L‘$ê ntpoÙ}…Vl÷£zM:R£FMÄÓdIJ5ƒUµš9óOñć:uªA3¦±!7'Uxð €.Ü-,ÌÔ³g?Ê”)“r‰¿u‚îõéÓ§Ó¤I“b¬‘î,¥­[}ióš94 Sa*’?cŒ¦×Œ  †5óS¹Yiê?+è]xÕoØ‚Ýzí0;õ:~ü8ýóÏtúâ‹*TµjQ;K‹ÝÙAæß}×’öí;G¿ü2‚:wþšJ—.»AñÀÖë*únË–ôËOßѯßVðHBRß?iR%¥úV¢ÐÇûè×q#eà„ú:»?çÎ¥nÝ:Óˆ͘Ø ÷1cZÓÒ¥3èüùs,™‹Òº!¥×Ó®siÏÒ®”.M숶Õôe«âäíõ€ôûŠÂÃÃõpO°@àÈ‘#4{ö:xpåÎÙ%rj²fMOß|ÓH@T!`Íâ9è‚”NŸ>Mû¶-¦ñßU§dI9Ý"¢gÈÏ-Ö3aÖ:qîžÅ뎾0¨GeÊ—9„Ö­Yî袹< ¸uë–xŠŸE?ÿÜ眈þüÙèúõEk`ÎâhNJÏŸ?§ù³§!]‹Sòd‰]‚êÃ'¯iáê“ë:{ñ= ²xÝš ÃÇo¦£×Y“T¦Ô­]8±Q}õêU[Lħu©‚GŽ\¤œ9ÛÙ]§£Ê±[+ È™3õî]GbìYÜÍIéßÅSÃJiÈ'kj«Ñ }Kwüž-vµ”9º´¯^¿¡—¯BŒ²ÿ3©5¨‘ßèÊ 3:§ü $¨ü”ßAadý? öëTœVü;“°6‹Å=X·n *”ZLÀ糪= g#ßWˆÒ¼sç!…„X¾‡ž={e4þV,*©^„U#­9Áµ{÷]²TŽQ"ñ# à¥Qý¦×_¾4þŸ@;Õm 1úmšßÚߥJ啘{÷G@SRÂî ×/¢Ok[÷üîÝ{4n¥,:’Ê|:™2”þ‰Öøž7ôÂo3÷P­v3äïèÒ¾}ûžº YNÞ¥GSª¢?P‹ž $RµÕ_´lÃYH«]ßE”¢È÷ä]jÕë8›?øg{ûöõûq-¥,2’rVù…Ê ŽœºC?MÞNÓ¦«NRÓnô‹î k¦”T¶@bÚ$æ×XÜì8²oŸ/}þyµh•á”+×KX6í)}úfÔªÕâa$âáhÓ¦Ã"|¼¹¸Þ›R¤hDýûO JßÉ2‘gìØ(_¾ŽÂ5ø¥K×LX×çé¿ÿnQݺƒèÕ«`Jš´¾øŽx°6l–, éñÙ¸ñ°A·µkÈü v º[Ñï¿/3[ÎÅ‹·Å"ß6tõj„K{ëÖc”?'Q^'YöÀÓ eV¯>@DÆ-¦"E¾s>ÓÈßÿ©ˆ,­Cÿ½EìpÒ’öì9C +¤Ë’¥•hC 1/ÔW’æë×Áb”Æb-×1CyÛ·Ÿ Ô©›°1\09èСºXd¿E,º}ar…ºš’Òæ«é³:Ù(A‚xVá6géQZ½å<ÝÚ?ŒŸE³mIüK7ïÈüEEyÃäqtiŸ½–ëƒüŽ|OûWö¦ÓîÓø{dÞÀàP ¾³ž<~M—v¡gg¢Œé“Sû~‹eºÙÿ })ÞØ7Œž}ÊÏF}IýпõêP:VŠÖÍùB¦µöOë†iß®õ„ÅÃ,î…ÀŽÛ©¦÷O•*y´Šwéò« €xöl=]¾¼.\¸MÓ¦­¥û÷Ÿ‚Eóæ}G®Û-¥ Ék(VÌܹ›híÚ±ôàÁ*±ËAA?~).œƒ¶m›@Ÿ|â%p_ñ”®]ó£eËvÓ±c3èÉ“u"œº@`…Á:jß~Œ(w½~½…æÌLƒÏ /¯D‘ÊA{Ú¶­)2©l×ðáshôè.¢Ìµb×…9"ï&:uꪼN'®î˦ôÿ×SÖ7Ó’%ß 2*.\mëÉy VH½R¥JF&,£äɽ±–¦+öȲðgùòÝÔ A9A´Q¯UL™2ÕªU€Ð,î€f¤„E·Ï¦rYàß+ŽS«FÅ(CúOdž¦u Sæ )ÈwÏù»^µ|ômˆ§ÔèÒ"Ãð>µ¡Ù•Jç 6‹‘ïÞ˲åÏ›7á4Å ú¦kJ/"Ã…uÕ·KeÚuèºtù-Xu‚º´*C°p'N@£¾©Ký¿¬¬dÑ7 Ë“”Ž=£üœI0Ð<¸C  ¥£U„°gÏY2¤­°"ʹ§E‹FPÅŠ…Ťý.a}¤¢Æ+Èr0/Õ®]-±›Á~C¹_Ý\ì ‘]XŸb©-Hí®ášú ]º”´ÿŸÂ JO·n=VD  ªûb½wr°Çy ¤^½²´råhñ€yé"Ö`¼½SK—9È¥uë‚P^ëÉO´!‘mÚÔó<Í„–Ò Î/¿t—u$NœPX’µiêÔþòtÇ–IصÒ¡CA¸¤ŽÐsÍšòœ¼ÍŸ† ˈön‹Ò¥M|YD¾]¤Ôùóç)Žd”0¡õ*ÜóHCzf3Ò0{æT„ÀS‰*m1Ê(,žO(‡j VÖ²gŠAlz¿Fî#¦\¾xõ†p½@îôÊiIpš—2üŽéAéÂièÀ©ÃT¥J•˜Áù\Œ¢¿’%‹'\q©¢­ùöí‡rO8D)R²d^y¸lÙ.á¶+¨œ–ß>>hÕª}†séÓì“$ID¡¡æ—`þfäÈy´zõ~Ê–-=åÍûqS`èbSK‹UåO\³$˜û\·î ´Ü°Ÿ]±b¹ ¨ª¥hÑÈšEŠä4$¹~ý>ýøãßÒ:„øS Vd×®Sr+¡øñãQ:Ñ=ò ŒO>I ø–p‹~¬×XÜëÁÁmº~ý2ɓ¦RÓ «æòÇFyÎ^ò§Ö#¯”.íc˜.\tŠëðÌEÊ&,µ¤O±^jéÔÏ©JÙˆ›®ˆ‹×Q¶Ì) u\¿ýÔåþ×´fëÔ§s%ù˜Ηn<“¬œG#®]»FE‹f±ªö4i>1ÑÍ› İsçIy.mÚâiÿã<) ã¥"áÚ­'ò´ïžË2"®iÂò7‚ þ]wZG—“æí—iÏ BZíûµmR\þVþ¤Né%\{>4cñzø†B„;oøo[èK ¡Y½Â´bÓ9IL ¸âš2¿²{h9rJ©ÃÜwª^ôîm°¹K|N§Ü¿—räøh5G¥f¾|Ye£É“WÉ |Dàuîü«°´’ˆ½+ˆ] nÊy$”¨¹M›ŽÜlQ• ¯æt”·;w‰€ƒœ’à ›4i¥Ìbù€°Ö­; ÏÁeöûïËÅ&Á©¥÷B]ÎÓ§/…e´Fê‚21Ç„6@àV¹¢Lkº=zôœÊ–- éîÝGr .2¨é¥7qâ×Ò*1-ÇÏï õé󧬠&M*ŠÈ»lbžªµÐ­­$”=Ë iD'p7ÞAÖ[¨PjØp¨Ôsß¾³´`¯Ì^©Rô€ù4Å­]¹Êuj /XÜÍv òMÑ=·$[áÃ¥ç/ƒÅ|Ž·˜dÚ]Z¸Ü÷€BlÐ¥d£‰"¸¡*ul1?„µ—o<‘“¯Ø$ÖÔ}òHÌiÁ2‚e¥J¼O€I½l#_”ñõè]ô“—©‹ãc#0aÂÏÂúÈaÓ Šû Ù³gˆä¢ŠJðn¨Œ”&mnn¬Rò Ž+WîQžÆÆ26z¼‚þbKIûžáqEû>°WÍæ”ƒhãÎKbkã0j{ä ùËû¸ýŒ'´'6´!$$DlzR.$ íÕk±7$äcTŸ^õd½,# ™¥dY%¾Â0Œ#[ÐÌRJ–,)5®•²d4Þo.¶v·Û½H’$ Õ®—J•²îÝ`îÝZýjų›6ÝÕ¯‚¬Y´hf)ñ„dÔ}ÃQ㣷«è áqEý`š‘OHFÝmè5>z»ÊúèWôÑöh¡)E}‡÷׃J­ƒ¿ÿSúë¯ís`ÏâþhNJ€°D‰Tµîçä]ê' xäþ¨ÚØ‚)óßËôÔâ³v6æääzDÑ_mÛö Ü¹;ÐåËwõ¨¢GèôàA ¾HbÍwÑ¥²º %hÒXÌ£,]º„~žq,Öv–ž0û ¿‡† E $ðœ;+–·¤|ùòtàÀ~š8qݽû(–£áøæ_¿~Ÿ*VìOÝ»"`Íâ9膔iݺÂ}Uç únÂa:wɳ]°šr‚ãå§?§ÎbBòœÿ)CKŠ)*žâ¿¢\Iû÷Ÿ7œçû–ãÆ­¥yóþ¡¢E‹ÙWçÖñõ¦QݺõÈÇ'Íœù;öy@í¤”)’èMÍëëÈwÏZ¾Íê5éH5áu1FSÿK—.M™2÷óŸtðàeêܹ&e̘FÿŠëPC¸ë,Ø%( :VàšI‡Z²Jö"G ’1~«ÑÊ•+Å&”ÁÔ¼¹ã£^ÂÂÂhÃúµ´wÇ*U0Õ«,ÂÇ}ÒÚÛ^Íò? ¤ƒ'î’ï¡”-W)jݶ3eÈA3}¸b×"€èÊmÛ¶‰Åµ«¨@ôÔ A *X0;¿­6šnn/Þ¸¦K— Ü>•ºŒ[4¸iuÙßß_ùL§I“&ÅXÝ’’Ò¢   Ú»w/9°•^>ó§Y’Q¶ IèÃûpJ’8¸9#^ñ Ôäýûò<èV͹Xu¯üV##ÊA>EL¯«#­R6Î+‚²•kOŸQR¯$ôüõ;ºéD¯ßÄ£Re«Qšu)kÖ¬JþŽe„††ÒáÇÅ|ÓzôȲeKC>âa+yòDôâÅk±UQˆ¸?ÒËûT¹—”ûJ¹?•{Qù„Êý«>§>Vì¤UŸ‹îØRuʱ:­rNùF=ÊuœÃ¿Ú…ã{÷S²dI(EŠäôúõºs'@ÌÇ·wª\¹6U¨P8Â.ºžÒöº#HIwî;SH±f§aÆòóâÅ q£ÞÿÌ( €â&NLñâÅ3Ê‚àˆâˆé2;3Ï<ó¸¶KjÍ*o4oÞÜ!%³¿`&`F`E TJ¡ÓÖ¬©œ={V Ó½ñÆÒµkWY¸p¡DFF: dÎ*˜€ †6ÁŽü¨”‚¿YC‡X½zµšÀß¼y³Ì;WÞ}÷]eãâ9®0#°3?€!%¸ P)wû²v pëÖ-4h¶PúI©X±¢²´«^½ºJE+X'‚‚%˜R‚“•Rp¶+k凒úõë˘1c4?x£Ô~¶lÙRºÀ)˜Áø ÁLÁ–|¨”‚¯MY#‡˜6mšÚŠ^OV®\)/½ô’CJ¸ÅC°SlóÆ”à"rJiãÆrýúõD­ݱ±±‰Â7lØ pyD!o `Q,bcA6&è—/_.%J”ðövÓã;v̰—#ø¸ z$¸Ç)–` ¶ú¢w0§SJÏ<óŒ´mÛ6‘ÂuÚ´i´ê?ü uêÔ‘uëÖ%çI耫«ñãÇßµâ˜Ç,ǦL™"#FŒpÜP,Э]»¶òžàZ¡ôš‡|\jÕª¥´º†Û} Ï` Æ` æ`7A¢-)Î%rJéÅ_T?ânݺ%h¸;qí)鿍ùóçW?ø‘yR0TÔ¡CY°`Çzã÷'”x‰)P €òo×°aCñí¼€—²3gÎH“&MÔ·^üþ]ÿô8pé…{œ(` _‚`öh´…'A¢-Ѧg9¥„aøáúî»ï´=Y¶ †øÚ´i£|ŽAy!>%t àA‹UªT1„pâÄ iÚ´©² ƒ ó¬Y³í¾R¥JÊÇã‘#G”[-8=v„ÁÝâÀ$îqªÀÛ>˜ƒ=,óÐh#A¢-SâÅÚ(]†ù@È=mÑóÁdذaÊ¥‰+ν{÷ª?Fxs†Û§¾!º–™ÇæÀ\ÊÈ‘#Uðè.óçÏW;Ÿâá½dÉéÞ½»rBêÏiç=zôPEúóÏ?¥U«V æ’0¯„0\ƒèqÕ‰CÿƒCW°G -àQmã.z¢M4Oæ^ÎP>9¥„ÆvºÃÜìÙ³ÕooW7¼%¢wÔ©S'—rJèèÛ·oüëdtÁK ¼y·lÙR4h uº^×ã9õÃ^ò‚¬ZµJy×=vÃK8 ˆãÔaHU@·ÿÐX` “q´ Úm¥‹ÞFP¼h[Šó„¤R*W®œz“¶øCl×®j™þýûËéÓ§Õ¸:Þ¼0ÔG ]0p™1c†·7º‡z8 Eo{æÌ™ëH/]èYàóH0­Æ| >8F®ÁžI\»¢ÐVºcW´!Ú‚¶¥“Bá¨ÿë׿GtøcÓ'uõoì[+<¸7SHî ëGà–^VЋƋ >‚èŽT±¬½‰@v¤Úºuëø‘Ô= |p ÁÃf×*h´ÚÊÕ±+ÚRoW´±^ß@­g°•;d•º÷… Rí©oü§».Á·ë_°5:ëswX°cÇŽøì{„´«#Õ@i WÃvx s„a¤qYÐFº%­îØm ÁË(ÚmMqÇo‡n&ªo¿ýV^ýõoJxƒÂJñ9s昙5Óv0K—.I™2ex¥Æâêœ9sªµJÁä·îÔ©Sja¯þB¦7 ”†¼råÊ¥ü7æš`Ž!z×EÂpa´mÛ6mKúL_G»+àíÐC¶§„ÆÃDhæÌ™´#ÞžðFE ]X”yáÂ…ðƒ'̹|öÙgj>iýúõÊ‚ËýžàF‡Ÿ@é<÷Üs ¼•C!!,ÚÖuh#Ì+¡ÍÐvhCW…„æA[£Í)Î Ò=%4ÁСC•i8”Œеߴi“3Z‡¥°œÀfÃFŠ¿<°1ázᘿðÆãƒåò"CôˆÜ×`Á½–“\#yQø(è ÁXÃu®í†vB»¹†ë7á:þîõ!}=œß¾`OÉ7^†±;vì˜Àºˆ½$CL!Ø»wouÕfú$\òàaŽèð Tòyâ‰'â'ÿq¨ m€¶@› mt·Iz›émhÔVIµ½Q|†™C ñ §9ù86ÕìÙ³+ï 'NŒ-·hѱeeÁÌ%Ÿh® .õ^zјS*Y²¤T­ZU*T¨ <+V,Á ¹¥37u˜‡/]ºTe‚ã@–‡~X-hF ŒöìÙ£zAüñ‡ÎÛ¹s§ÂÃü±Þ{BjÞ¼yÊ/^5¹ú_ö€QJ˜|†·b¸Á0~Lîë'ð„p|ðcÄ·þfäzŒVs=Ç[!Îáx»\B¶þv…s×øú5ý×ðèùáÛ7çË—O)»ûï¿_òæÍ‹à€xLG;`¼þÚµkꃇ·«$·\ÓÀ±+s÷sýÚùéyº¦e‚7eXEDDH¤¶>ÅÝé®küáÇ«S¤Y´hQõ`ƒ{(!($(&»ÅLþðvÁïkxtÆz]Ïõcò×óñç7ʇ¿o|`Áœ”†ì°V ž\ð÷޹%*%¶€ïi9zN k&Ö¬Y#+VÍ—“§ŽJDÁL’ïþ{%öl K¥ 7$´ÓÐþ`ôc]IèD:"÷óûNÉý³ké¦VQܯãÇ­+)ýš¦ÿaâF\Óålôeí!˜N.ž‹‘cG.É­˜tòp•ZR«æ’;wn=šã¿Á˜ýõWõÇ 3[”žšQwýS¯ˆÎ,ôcoÛAOß:g=Ìõ\?ÖÙ#}ë‚s(%äß^fà±Ê²±²i¸ ,° hË–-?ìãzÝ®c«øÃñ*£±:q;ׯù“¿žßXË·Jxå%%yü1§äH¥„‡É‚óeÞÂiR¤D©Q§°-‘7ÑC$yØì»ëïãçdýê²vÅq)SêQiÙ¢µdÍšÕ¾y‘3œÓbÇOô80,R¼xqG=°½¨B|}d̘1‰SZ]+óƒñ6´Ãfvvö˜Èß^þVþ昗g¶+¥ýû÷Ëäicåu%gîû<—ÔÄ+Ñg.Ë»½¦jVZ1&æ’tÒý7•ë·÷ió’ŽhÒUÌa|ôÑGêá\ºti“rqn²¥J•˜„ƒXX-äo/«Û›ùy&`«R‚ÔgŸ—¶Ê™®jT(kVì6$qófŒüùÇaÍ|8Îe¿a$ »¼QC.¤<[]‚,`ÔSXôBUà ÀÂj!Q½s»ø[ÝÞÌÏ3[•ҌӤxÙtR²L„ç&ãÊ™Sµr± î<îŠÜ¼y+AN.œ¿*˜Û™¹¤—¶F!m‚ë±±·Õõÿž\»vÓ(8EaÈ¿M‡ò2á›1–>ÀìVvuêÔIQùƒáf0 0±JÈÿi;øßÉGN `›R„îòUsä©ÿ+ç7«—ï’z –š•Já¯Éè¡qCau~_NŸ¼(/µ+S¾ÿM¾»L:µ']_ž UKö•#‡ÎHñ¼ÝåÊåërèÀi)š»›Løb™”.ÐSJF¼)MŸ!—.^SåŒ:vVž®3BŠåî.”é/CÌT×ýU‰¥òK®ü±ÚBÕ8—/þJ×S:X˜‰uHØòÚ}1©§{‚9 ÀLÀÆl!ÿ„„­æŸ0wž9€mJiÑ¢ùòØ’é>ÿm"ö~¿ÿÉk=Èö##eÞÊÞòé‡óåxÔ9Y²®Ÿœ0¥‹´lûˆÖ ¹- foÑvÝL'3÷TÃv—.^o+—oÈú5ûdÓž!Z:ïÈÁ§dÑÜ?Õõ×;|£y–È.;ŽŽ”¿j'³¦oxnð§4m^Fæ.˜îÏ$=¦O XŒfß+}— `&`c¶bÂVòOœ;Cì&`‹RÂÛá굋5O %üZ¸úù§õ²}ëQ)U6Bþ:>Jòä5^|›=G&2º• gb$ý?#4¥U®bAy¨jaٻ焠—´vÕygÀÓr_æpeºÞ¬e£ÛSQ »dÉv[¶oßž¢t¼¹®ƒô­¾½‰*qà½lÌò7&lãÜj'[”œfÎrd͖ѯuýå‹–6×N¦ý¸V–-Ú‘¬äS¥J謉dË~¯¶IØm5ï¤'zèàiýЯß%Jæ•=û·ù5M÷ÄàíŽU1TEIHLàxŒÌò÷LÖ þžsç; Ø¢”ŽEÔæe²øµÞ˜ }¦þHÙüûAÍ3wy¬v ÁîÙ;,Mj¹|éμQr2| §àóÕ˜¥rõÊ 5_…c3ËG5#éø4ae†/Ř6|1š%äŸ4Y³ù';¯ÚE áF8•âÊÕ‹’!CBóë”f>}˜2rhRk¸{0¯fIwC*U)$µëÇ-}²YEéÖñC³poóN£)¶/¾ë(Ý:}#e"{I–,äɧ+ÊoÚ<“¿yÝŠ5w1ïÕ«WÕöþ.{°¤‡­9°•…YBþI“5›Ò¹óª]lQJ×´‡aX˜±BJ@té^Ož}®ª=-–ŽH øk.=z?)ïM§Í ¥–N]ŸˆÏ ½ŸãW¾PçïM¬GølâËú¡6.‹~ë« ãŪuM?N\-ÑgÌò`®I2ö¢x|Ó&:À^Af*%òO„Îo#3Jh‹RbOÉ»¦4»ÃvHºÌæcvúI×ÎùWÉÇùmdF m™Sºzõš¬XzHöï=iF‚&Ísç.š^—­[·šžG fpðàAÉ‘ÃÜÉßó¯Ã þžsç»ØÒS²«²Ì—H€HÀÙlé)eÈ.5ž(é÷ÍýœÚ÷Ò-[pÔ÷›|¼£\¹rR¿~}ï è‹-2½¢äï±ü=çÎ+v°¥§Ä L̶CÒtÍæcvúI×ÎùWƒÏ† dÚ´iñ 1yòdÙ´)ngl‚:nÜ89wî\üõP9°E)qÓ»Ÿ8™)l‡¤éšÍÇìô“®ó¯;ŸyóæÉðáÃãbÈ!¢÷á¸gÏžròdèÍ»Û2|ìo@ñ¿²€“™ßbfçafùÍNÛl>f§o6³Óv> |tq5zÁ°îÅ‹æ:éy;éÛ–žà-ˆB$@$@®lSJF›è¹L?>ÛkªòÊýáàÙgF¾fÅn'ñ£‡ÏÈÿÎÔ«Åo  ¶(¥˜›1ZOÉ 4ApÜúõØej»‰™S—sg¯ÄòOЦ ¤jɾ)N ÊŠ‚µX«–ý%—.^×vÂ]çSÚ7n˜·7 rëÖ-m·ÞXŸÊJ‘Á³„ü“&k6ÿ¤sçU»Ø¢”Â3d˜ïþØïÍ”^í@8¾WÛIøÆŠ:vV?Mð}ãFŒÓöUB#ÁÖéÎ_Mp)&&ÖPéa—Ùë×7Ü»zõ¦DŸN¸ŸÒ•Ë×åŠvû7a&UöLwÊž c'æÎ)a5£z„¯~;áááž#¤ð ù' »fòO:w^µ‹€-†3Ü'W¯F{Uglmž-û½*n܃=½:ž?{‹¼Ùå;m'ÙXÉœ9\:j›öý§[]íÍÿ¶¼ßïòÍ—Ë%£¦Ä Ã?m-žª ‡œ–ºÕÞ—ÞŸ–ïÍ–‹®IåªÈ3ºJÔѳҪÉÇrãÆ-)œã5Ùr`¸ê͵kñ¹ìÜvL¥SüÁ|òÍ´W$k¶Œj8qÀÛÓä»ñ+%mº0)Z<¼?²¥¬X²S¾ýj¥ŠeժݣJ‘B1áã­`Á4©Ã¼ž¬x´—l4G1&6f>Éߘ»j6=~;‹€-=¥ˆü…äØáó^“ûmÜί†6Wø¡wôj»¯åƒQ­dß©åÃÏÛÊ >?ËყeÒ7«eÞ¬?dýÎÁ²ýð‡òágmäµ—&¨kÈÛ¤¯_³O6í"óV¾#œ’Esÿ”¥òËO³»©Íþ3ŸJ¦ûÂ5å²B" dWq·ùP2gÍ _|¼X•óDófm‘µ;Þ\«øP!éÛc²ôèÓX^ìø¸´hSM)°*ÕŠHûÿÔ’,Ú½Ã>yÞë:=-ùòßïuüäDÌŸ?¿œ8q"9·†Ä=0Ljˆ0­®äŸ4Z³ù';¯ÚEÀ–žRÑ¢EeÍwÝ­ò*RQJ—‹{HÏþy“ä‹È*O7H…ת[JÆOê,iÂRËäï~“&ÏTŠß}¶Aãò’'_VY¶x‡Ô¬SJÅï?øÉ1”«XPªZXöî1~0?ó\­·[í¾Ý'ÔÆ„{þú[¥1õ‡µÒ¢m5É‘M¿Ù·±,[´C»þ‡^>² º^Jòx·–OÑJ''¥###Õ:ˆëׯKúôÞ÷âRšo Ü&PØ`d–¿g²Vð÷œ;¯ØIÀ–ž”Ò…óÿÎßx½ˆ¢Åó&ˆÚ¨i¥ ŽjóH赸JDlrêä›ÿì93Å_N&17ç·í?-mŸ#•è#o¿>I.ºÌA! Ùé‚!Æg[UÕOSü½}s´T¨P9Åé$•@Ú´i¥dÉ’²gÏž¤¢…äµÝ»w+6`d–¿g²Vð÷œ;¯ØIÀ¥„›Õ«ÕÕæ_v%«îPvs•‰ÚÒñ¨sjþi¯Ö«q•ÚœP¾üYー1G‡@¯®?h½«’jxnÖÒ^RõÑ"ÚbÓ¸dP(-]þ>~N&|±L?MÑ7 4ΟM%¥K›ÛSB!k×®-k×®MQyƒñæuëÖ)6f×ü [Åß8w†ÚIÀ¥„ ׫×PV-=¦™J_ó¹þõ—“½»NÈ‚9[Ô½0zÀ\O®Ü÷I݆edÖôßåÀ¾8÷R»¦YÂ5Ðî¹›À¨½&XÚásúÔE)_9R°²ü˜f1û›ÕÒiФ¼Ìž±Iî?¥YÆÊг´y«3* #&§^zùfNýS7l®Ÿšú]±bE­®×Ù[r¡Œž#˜€ÙBþ‰ [É?qî ±›€mJ){öìR£zcùeºïûù`niЈÒ©õ8)[¨— yw† Þ\­eêöV#m)‹]3í¾*Íš5KVxíÝ÷uiõr‘dmcqíÚM9£õfî/˜x#65vîª-‘GÒi&Û¾ÈÙèËñfè0‡W‰‘qy`ñnºôa’!CÜ\Ãim® =#ݘAÏ=­Ûšy: *¼ÔgpŸÅÒ±})U*Î(ÃÛ{SoäÈ‘šQGf©[·nJ“ èû/^,.\7ß|ÓÒzn»ø[ÚØAœÙñãÇeìØ±2zôèd×Ò¶žJ ‹¯®¯¼-ßÛª†Ç|­ExxZC…„t`Ê•¯ ÷êë¢p|Ÿ¶JWH8‡òÑÎsjC†î á顸|PH¸gü˜5R­JËòîÔ©“lÛ¶MàN?TeçΊXX-ä/b'«Û›ùy&`«RB± .,Ï5ï"U4 7ÌÏ„ª|ôÁB O]LZ4oi ‚L™2I=ä­·Þ’íÛ·ÛR;3Eg̘¡€…ÕBþöò·º½™Ÿg¶+%íÑG«ËòåËäë1”çâßIŒxo¾‹¬-Ý^ïiÉ<†'Š ”7Ê/¿ü¢ÞZ=Å ¶pô_{í5ùàƒ ìò·—¿]íÎ|p„RB‘*V¬$Ïýßë2êý5òûºý K¤g0#>`±äÍQUZ¶xÁV…¤#†JŸ>}dÁ‚‚ñýL9êI:öuCW¯^-Ë–-“9ÏMZ]xò·š8ós[ Œ``Çű_~$Ys]‘gž+ï™Á(n †¡w´hî6Y¶à˜´jÑIjԨ鸪\ºtImÇ% 6”bÅŠ9®Œ))ÌŽaeW?˜Ï±cÈ.©ò“RtxÍ©üaèà8¥ØØNaáÂ2wÁT)R"ƒÔ¨SX³¢Ë눞DJ~ è­_}@Ö®8.eJ=ªõŽZKÖ¬wõ¦$m³îÅpÞ¤I“”QJµjÕ”r T—Dúz,,Æ1̾+W®l:¿¤Kþ~ÁÈD,"´JIç/ÁkÖ¬‘«æËÉSG%LÚç^Iæ K¥-jý׽¿7À¸°öû0áX7xw=Ft÷s¤…{tq?w¯_Ó¿q röŒfJž#Σ9ÎÏk&éiÓ¦“ gojÛh\ÒÖ>¥—‡«Ô’Z5ŸÜ¹s#J@†¹6oÞ,¿þú«škBÙóä©}:Å:uêÔ êøhƒ¸v¸­¾õa@„éǸÉýÜ5!É5!ÏIDAT÷k®çú16#==O×û±õ>øÁ|­¼(`Ñ*ÒAÝÈ?ZŠe z¥äÚÄÎ8|ø°z¸`ïz·oßVßÿüó*.Âôc¸Ÿ»ÖÉýšë¹~œ*U*•ÒD˜«Às_ááá!‘‘‘—I 0‹•’Yd]ÒÅ +W.‘={¶k÷œR°`vÉ!LûÜ£)¥ÔR½zyôÑç5Å¥)"(ˆ8…£ÿ«“T¸~Œ,ÏõÜ%ÛD×\ãêÇ©RÅ)9¤c]Pæ[·bµÏ?rêTŒ6ç­)ÓÓR¬Xiyüñ:R±bE-ý;ñõûøM$@)!@¥”z^Ü»qãF™6í{É‘#¶mymˆî1­ç‘΋;åÚµ²uë~™7o’Ö£ûNš7o+•+Wv^AY" €%@¥dRÓ]ºtI¾þúK¹pá téRSÊ”yÀ¤œ¬KÊôá‡KªÏ¶mäÛo'ÊêÕËåå—;K¦L™¬+s"Z4t0¡i>¬™z÷–âÅSk^ÁÛ…BrÇ%‹º¡Ž¨+êL! ” RJ)A·û£££¥víÒ²eyiÑâñ žwÁœêةӣòá‡åÌ™3n4xJ$@¾ RòW’±Ñ[8ð-mÎå©U«B’qƒébÅŠÅäµ×êHÕª•Ùc ¦†e]HÀTJ~‚Ž9¤1cF¨‡såÊÅý”jà$S©Rq™2¥Ÿb H*¥äP3¸F µkÖL¥‹\ ôÁ,($@$TJÉ¡æv̾ae×¼ùcnWRvŠ…³gÏzÞ¡öúõ›‚«\¸pÇUÑÝîw½Ï_Ç``B! _ P)ùJÌ->™bÒ‹/Öô«QCïÞã$wîfšu[[õ™3g­Êùøñ3’.]]™8q¾¶õÅÿÉòå[4ßyÝ5§®?jV~íå7>Sñ<Ý?yò¯*ݘ˜[ñ5ùÏ>’çŸ/þ<%0~ 0 øB€JÉZqá© cý¹iïÞcÚüÌ2Ù°á 9}z–¼ýv+mCÀÏâÝݼyK"›'“&õÓRy¹y3FF𦭇j*Æu–¤îoÒ¤š\¹r]–.ݬj¯ Ó§¯Ð¬kÔ.yA`&`C! _P)ùBË .\=ùdyƒ+ÉÊ™3‹¬Zõ‰Ü.9xðo9þ²¦h¢”Û=Õ!C:JýúU4ßtq¾è T^yåiÁ½IÝŸ1c¸<ýtu¥ˆÖ²e(e×°aU=i¿|Ã{ØPH€HÀTJ¾Ðr‹ çªðeW¶la·+);Å£GOWñ¼5¸Ûý©S§–çž«-o¾ù¹dÎ|¯<òHiÃr¤4žÐ±E…H€¼%@¥ä-)ƒxW¯^Õz2þöB6Ý»ÿŸÌŸ¿^YÝ(ÐB9@-T(f!÷¾A)ys?†ðvî<,íÛ7Hœ€ŸB°5ö‹¢ €·8|ç-)ƒx7nÜÐ̳ý¿§P•*jîz¦ÈîÝG¥hÑ5Ô֡ÓÊà!W®¬ša²¥ùí·83p=0©ûõ89µy¤4š‡ï'õ ¿‡…¥Ò,ý¨”ü– ’@ RJAãbÇXlÐg†`GØ,Ÿ4  ¼•¤îÇÕØ±³”xž<Ù¼MÒçx`F ð–‡ï¼%DñzõúB™’þŸ ª«B$ ø ­èc–.ýÈÇ;H€¬!ÀžR 8÷œ·q)È&`o½}ûò ØÖcÁIÀTJ)à?oøPŒ ù³a( €1*%c.^…¢—Äž’gTðÇJ>žùð @bœSJÌħµk»ò) ޼k×mqq¡ ®!«F$àoì)ù›(Ó# H6ö”’.îÆjÕJi›ûÕLa*Áy;¶ÄМ^PH€HÀkì)y*qD:$fâBCW<&ð†•’7”<Ä¡¡ƒ0ÿÓÐ!i>¼J$˜•Rb&^‡À•Mž=ãJ•Š&óžéð €*%#* # °…•’-Ø™) €ZßQñ2ìÖ­[’:u¬—±C/6(# xK€=%oIÄK—.ÄÆjn (†bbnk[Ň^c  R2¢âeX† ´Mìb¼ŒzÑ®^¡R ½fgI E¨”R€/þüÚ±gRBpßzøp´DDDw%Y; ¿ RJÎÈÈH¥”®]»‘‚T‚óV09tè´€…H€¼%@¥ä-)ƒxiÓ¦•bÅJËŸî7¸ÚA[·îWlÀˆB$@Þ Rò–”‡x?^GæÎÝâájèÏ›·EÀ†B$@¾ Rò…–AÜŠ+Ê™3·dÛ¶WC3,Àl($@$à *%_hÄ…›¡æÍÛÊ·ß.ç†vø 0¡ &ƒ ƒH€’$@¥”$ï.V®\Y2g.$Ó¦­òî† Ž`& ð••’¯Ä<ÄùåÎòë¯ûeÙ²?<ÄþàÍ›÷(`A! ä RJ5ƒ{2eÊ$]»ö’–-ß—wÄî Ôù“O+`¡Ë?þ(çÎÓOùM$@I RJo ,(6l’Ï>[*è5„Š wøä“}å¿ÿ.` ËéÓ§¥OŸ>Rºti8p DGGë—øM$@†¨” ±$?0{öìòæ›ïʸqkdêÔ•Amü£ÔqÊ”-²térÉ‘#Gp9sæ”íÛ·k<Þ”‰'J©R¥¤ÿþeE! #TJFTR†Þ»ï‘Ý»c¥W¯‰Ai.³oÔ uD]]{H®ø0”×£GÙ±c‡ôîÝ[&Mš¤”Ó;ï¼#'NœpÊc {´·Ýd»¹ž>}º\½zUš5kF”lܸQ³Êû^ëE¤Ñ†¸ÊKÙ²…5'¥é<Ävv0\Á{ c̾}µ²»víšê5=ZÍ5½ð òÆoÐGž³›ž¥#¯?~\ÆŽ+øûN®P)%—œ÷AïoÞ¼YV®\"{öl×z9Ô'cÆ0m?¦{$MšÔráÂeI›6L),ÄÇíŸÜ¾w¬¿; \?FÜÏ]‹å~Íõ\?Æ–åx-AšÑÑ5å™9>‰ØXì‡ôò„dzøÀ­<5`a,ÒH®Ü¸qC¾ûî;ùè£äÔ©SÒºuk5Ìç©Ç•Ü|x €uü¡”¸ÉŸí…‡w¥J•ÔçæÍ›š£ÒC¥z™×¯_—T©RÉÈ‘Cû3õìÙSSD·ÿUJ÷ÄëŠHW&z±ÝÏõp|»_s=ב7Òþå—_´y¡¥2tèPÁ–Ã}éÓ§—øàyï½÷lSH( ¬?üðC5ß³råJË©¤I“F ˜0÷å—_ʦM›ä¡‡’öíÛË_ýeyy˜! €=¨”ìá®rÅ¢Ò—^zIêÕ«'¯¼òŠ%‰ËúÙgŸ•Fi `»ª¡E; ”:ujmrKùý÷ße„ ²sçN©ZµªRXÛ¶m³£HÌ“HÀBTJÂvÏ ÌÛÀZÅ)¢[Å 4ÈÖ"a® J=É~øA<(>ú¨<÷ÜsÊhÄÖÂ1s ÓP)™†6é„¿þúk™3gŽàCgN‘|X^{í5yùå—ÕÄ}¢ €‘ÁgŸ}&{÷î•Q£F%*!æÆÐ[rŠ<üðÃò¿ÿýOÛhq™äÊ•K-ÀÅœ JtN)+ËA$`L€JɘK²Bá+ÃY˜7ºråJ|èe@EDDÈ!CâÃá H‘"jO$Ì-a ]bbb䨱cröìYet ‡;á.¦L™"«V­R=R¸.zä‘G=U¸p¢ 8—•’ÛÛ3À·äï¿ÿŽOCzX(ûÍ7ß(_rñä=< ‘uëÖ-þ¡ŽuCú~Ïgnh—MØ*®“நæg q§N_öi“B†•’›®q0äÑ÷ ‚ 3zGx —(Q¹Y—ŒP‡-[¶È矮2ÆõuªRRÔþÃæ‚˜Ëú&(ªN:)?ð±g4W¦ßÇo ë P)ù‘9ü¶áŽ5zJgΜQž°±–û²”,YR­«‚¾(Egªø8])éÜ‹/.ãÇWþõÐc‚G lÁ-40I!°Ÿ•’ÛÃDxó†sQlMѹsgµŧŸ~š Lº£§¹'' ¶‘¨_¿¾À{9z˜+ƒ`[sl)‡ùîݻՆ+dìà OÌ“ÁcÅü!5jÔîÝ»«uc𮡿z“ã øŸ7ùóS6äË—OYy¡÷×A§OŸ–… * í¡'…‡<†Ø±ÜuèÐÁO%ð_2° „wn}2<<\ÛØïqyâ‰'$sæÌÒ¥KÕ#Ô{XÓäjá¿’X“ÒÑ£G•u!zLh7ì„‹ù'ì%å‹`Þ0kÖ¬¾Ü¸$Tü±É•’Ÿ~x7lØP¥†á;ô†°f j®rß}÷É€ԃߩ h¡dá”õ‹/¾PuAà$Uï5¹ÖáPÀ¨k †\aúþf‚6Â< ¬&±éáÝäâÅ‹ÚnÂÕýPhEþPJ¾óÓ/½ ÛA ð€¾|ùr¼B‚òÁC_èU ‡äT…„:d̘Q† ¦¼#Àr JÉH!!.¬ð0Ïè’7o^5d‰öÁöƒVFPThˤJ¬lÙ²ª—… @òP)%[¢» ”ti\ÄДz¸¿Alè—%KÿU®\Y™T÷íÛW)Z]ñº—=PŒÜËmtŽ…·PHPN0P1b„”.]Z),ôˆ< ¬ú ¸¡Ð°å=…HÀwTJ¾33¼ûþ¸*%DBï¢hÑ¢Ê£ÖÆ.\Øð^§¢×æ¨#¬ÕP/WÁïÁ¤”ôºåÈ‘CùÿÓ{¶pR ór¼X`þÈ]žyæÕÄâÂñ¥K—Ü£ðœHà.¨”îț˘O“U]0,‡ o<İ'Œ‚A `/^,pÒŠy½×‹Ã@³Àó¥=²eË&ýúõ,ŽÆð+¶kGÏiàÀŸ B°¥;”6zJí´¹%÷•øÈ< 0$@¥dˆÅ·@ ËA Œð ~ýõ×Õж¨Ð‡ï|Kѹ±ñÀ…eÒÂl‚/ØÁ.°<|ûí·UÛÂ<~âĉFýû÷W†¨?¶·Ç°-5¼•ÿ÷¿ÿ v,¬ ø•@Ü̼_“4'1˜íÂ×ÚùóçÕ ­èÖ`®ÃIx àý-Ç×ÅýéèqÇõºë±~ aˆ¯+œ_~ùE%]¡B5Ÿ€Io¬YÂÜDddd@Í!©ŠügÄ¿U«VjHg:Ìœ9Sq‘ÎÌLþÈCOs:XkÓn³øÃª²Gj|ìaþ ½'($¬y‚ï½Í›7«ßÈÇ,>ø R^XD$àFÀÑ&áxâmC`éÒ¥Së€`†5>RÁƒ!]9 nP‡è*œëÇw?wWJ®ç®Ç¸WÏKÏiaîÊÛQ ‹bÑk:uê”ò쀲b 5Qþ@oùc£= _Fj Xç‚:êÌÝy»Ÿ1F:£k×óAZ®b´73†51ׄu[ûö틯?zÏóçÏW~÷\ËÊc6þ0 w¤R¢͟~úIMžc?ìÒŠ{  ¶²€‘¼8Ô«WOm]ã§ ù'¯e œ{÷î­\¹¦ÅŠ¡?˜ŠÃS<…‚•€?”’£†ïðf½ofÍš¥zجÍýM8oÎøÀ* 0/¯Xÿã$!ß[½dlÃŽ ÑB=#ôàõž"zoˆ÷ì³Ïª½ž¼YŒë{Ix Ç(%L ëÃØ*!ÖòxûSÀ\SóæÍUk_pŒž“„ü½o(øÉÃ6ì¿ÿþ{¢EÅ`é.CO‹¦á<^¶ÜëÈsðGXßa¡é«¯¾ª °w0*$ׯB ¦Åx¨¡çd·¿o-kK7`H="oCxˆ‹‘¸1¢ °½§„"þÀ *$°æ â…iuÍš5åûï¿—ÆÛRuò÷­Zµ” 8†ç®_¿® [0Ÿƒ÷o\wÿ˺5[~°Ì4è Ø®”°¿Mîܹ¥Q£FAÛ½‚PL˜€ÓÓüùó LÊ­òO> ÁaÁ,> ÿ°uønõêÕÊt¶Aƒþ©M¦«,xÀ:#×5fV‰üEYÅÙÅß̶eÚ$¨lSJØaÒ¤IÒ¢E‹øµ? 1¥åF/ ŽO1n•ÿÒvð¿“;H€\ ئ”æÎ«¼äɓǵW3…ü=Óµ‚¿çÜy…HÀ¥„m((ÆÒ§O/—/_6¾è§Pò÷ Ò þžsç [”’î=™øÀ–pWc¦¿gºVð÷œ;¯ Ø¢”0¡LñLÀl>f§ï¹fq…|£XÊà$`‹Râ›zÒ?&³ù˜~ÒµsþUòq~±„ÁKÀ¥Ä½d’þA™ÍÇìô“®ó¯’óÛˆ% ^¶(%¾‰zþAÙ|ÌNßsíœÅ þΧÀ’€}lQJ|õÜà`c6³Ó÷\;ç_±‚¿ó)°„$`[”ßÔ=7¸oêäo/Ϲó €-›ü:uÊÛ€;±ù/\¸ ·oß6µhäï¯ü=çÎ+$@¶ô”ˆH€H€ŒØÒSÊ•+—Ô¯_ߨÕc ÍgÏž•öíÛË /¼ 7¶íÇFþöò·­á™1 8”€íJ \à‹­_¿~róæMùꫯ‚ÞÛÃîÝ»eìØ±ªwˆ!4»…üínæO$ °e“?=s×ïtéÒ©1çÌ™#Ÿ~ú©Ô¬YSÍ9“óPl®¶páBÁÄ:vÿ4Ûsƒ+ß»“ÿÝñ: €îцËþInFÓ§OÌ‹4kÖ,¹IÞ3ñŸ~úIöìÙ#UªTQ J³eËf7á¥aݺu²wï^©W¯ž<õÔS‚µBNòwj˰\$àlð‰Q Ì•'W©”ôÊ=zT–.]*ëׯWqÌ;Áƒ6,¦`©–*U*‰UÃú=бè]ᣛšãØU÷ºŸ#=.Òq½îz¬_Câã>]ôô/Ü©S§–“'OÊßÿ-Ù³g—Ç\jÔ¨aº·½<þø&Pd$:‚^)¹6å±cÇŸsçÎ *ž3gN¥nݺ•@9@)@i@tEa¤Xôkˆç®”\Ï]õ¸øÖóÑóBá×®]SŠ(wîÜR°`AÉ’%KÜÅþŸü¸ñXt°ˆ€?”’cæ”îÆ,""Bð¡ØC€üíáÎ\I ÔÜ µš³¾$@$@Ž#@¥ä¸&aH€H t P)…nÛ³æ$@$à8TJŽkˆH€B—•Rè¶=kN$@Ž#@¥ä¸&aH€H t P)…nÛ³æ$@$à8TJŽkˆH€B—•Rè¶=kN$@Ž#@¥ä¸&aH€H t P)…nÛ³æ$@$à8)ö}7cÆ ÇUŠ" °žvHÀ~q)‘m]Œ±§…H€H€@ Zµj’?þdÃH±RJvμ‘H€H€ÜpNÉ OI€H€ì#@¥d{æL$@$àF€JÉ OI€H€ì#@¥d{æL$@$àF€JÉ OI€H€ì#@¥d{æL$@$àF€JÉ OI€H€ì#@¥d{æL$@$àF€JÉ OI€H€ì#@¥d{æL$@$àF€JÉ OI€H€ì#@¥d{æL$@$àF€JÉ OI€H€ì#@¥d{æL$@$àFàÿg©åþÄsIEND®B`‚asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/simpledom.dot0000644000000000000000000000263315031566105024567 0ustar rootrootdigraph { compound=true fontname="Inconsolata, Consolas" fontsize=10 margin="0,0" ranksep=0.2 penwidth=0.5 node [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] edge [fontname="Inconsolata, Consolas", fontsize=10, arrowhead=normal] { node [shape=record, fontsize="8", margin="0.04", height=0.2, color=gray] srcjson [label="\{|\"|p|r|o|j|e|c|t|\"|:|\"|r|a|p|i|d|j|s|o|n|\"|,|\"|s|t|a|r|s|\"|:|1|0|\}"] dstjson [label="\{|\"|p|r|o|j|e|c|t|\"|:|\"|r|a|p|i|d|j|s|o|n|\"|,|\"|s|t|a|r|s|\"|:|1|1|\}"] } { node [shape="box", style="filled", fillcolor="gray95"] Document2 [label="(Modified) Document"] Writer } subgraph cluster1 { margin="10,10" labeljust="left" label = "Document" style=filled fillcolor=gray95 node [shape=Mrecord, style=filled, colorscheme=spectral7] root [label="{object|}", fillcolor=3] { project [label="{string|\"project\"}", fillcolor=5] rapidjson [label="{string|\"rapidjson\"}", fillcolor=5] stars [label="{string|\"stars\"}", fillcolor=5] ten [label="{number|10}", fillcolor=6] } edge [arrowhead=vee] root -> { project; stars } edge [arrowhead="none"] project -> rapidjson stars -> ten } srcjson -> root [label=" Parse()", lhead="cluster1"] ten -> Document2 [label=" Increase \"stars\"", ltail="cluster1" ] Document2 -> Writer [label=" Traverse DOM by Accept()"] Writer -> dstjson [label=" Output to StringBuffer"] }asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/move1.dot0000644000000000000000000000164715031566105023631 0ustar rootrootdigraph { compound=true fontname="Inconsolata, Consolas" fontsize=10 margin="0,0" ranksep=0.2 penwidth=0.5 node [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] edge [fontname="Inconsolata, Consolas", fontsize=10, arrowhead=normal] subgraph cluster1 { margin="10,10" labeljust="left" label = "Before" style=filled fillcolor=gray95 node [shape=Mrecord, style=filled, colorscheme=spectral7] { rank = same b1 [label="{b:number|456}", fillcolor=6] a1 [label="{a:number|123}", fillcolor=6] } a1 -> b1 [style="dashed", label="Move", dir=back] } subgraph cluster2 { margin="10,10" labeljust="left" label = "After" style=filled fillcolor=gray95 node [shape=Mrecord, style=filled, colorscheme=spectral7] { rank = same b2 [label="{b:null|}", fillcolor=1] a2 [label="{a:number|456}", fillcolor=6] } a2 -> b2 [style=invis, dir=back] } b1 -> b2 [style=invis] }asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/move2.dot0000644000000000000000000000273615031566105023632 0ustar rootrootdigraph { compound=true fontname="Inconsolata, Consolas" fontsize=10 margin="0,0" ranksep=0.2 penwidth=0.5 node [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] edge [fontname="Inconsolata, Consolas", fontsize=10, arrowhead=normal] subgraph cluster1 { margin="10,10" labeljust="left" label = "Before Copying (Hypothetic)" style=filled fillcolor=gray95 node [shape=Mrecord, style=filled, colorscheme=spectral7] c1 [label="{contacts:array|}", fillcolor=4] c11 [label="{|}"] c12 [label="{|}"] c13 [shape="none", label="...", style="solid"] o1 [label="{o:object|}", fillcolor=3] ghost [label="{o:object|}", style=invis] c1 -> o1 [style="dashed", label="AddMember", constraint=false] edge [arrowhead=vee] c1 -> { c11; c12; c13 } o1 -> ghost [style=invis] } subgraph cluster2 { margin="10,10" labeljust="left" label = "After Copying (Hypothetic)" style=filled fillcolor=gray95 node [shape=Mrecord, style=filled, colorscheme=spectral7] c2 [label="{contacts:array|}", fillcolor=4] c3 [label="{array|}", fillcolor=4] c21 [label="{|}"] c22 [label="{|}"] c23 [shape=none, label="...", style="solid"] o2 [label="{o:object|}", fillcolor=3] cs [label="{string|\"contacts\"}", fillcolor=5] c31 [label="{|}"] c32 [label="{|}"] c33 [shape="none", label="...", style="solid"] edge [arrowhead=vee] c2 -> { c21; c22; c23 } o2 -> cs cs -> c3 [arrowhead=none] c3 -> { c31; c32; c33 } } ghost -> o2 [style=invis] } asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/move1.png0000644000000000000000000003732115031566105023625 0ustar rootroot‰PNG  IHDR ÿë?ƒ®sRGB®Îé>‹IDATxí]xTE=¤‘ ZBï½Iï½AAQ@ATPAPTP^~E@Þ{‘&MšÒ{I€Ò+üs'¼ev“ÝÍî¾Ýͽ|á•égÞž7sgÞ½Ùž={¶,Œ#Àˆ@6AÏ ŒËÑF€€cÀ0Œ€10iƒÇeið3À0Æ!À# ãðâØŒ@–G€I#Ë? #`LÆáű,“F–FÀ8˜4ŒÃ‹c3Y&,ÿ0Œ€q0i‡Çf²<LYþ`ã`Ò0/ŽÍdy˜4²ü#À0Æ!À¤a^›Èò¸d£GbèС¨]»vf²á´Œ#`%?~Œ|ùòaòäÉ&—˜)Ò¸sç „®]»š\NÈ0ÖC ((sæÌÉT<=É|œ˜Èz0id½>ç3™B€I#SðqbF ë!À¤‘õúœ[Ìd &LÁlj¬‡@¦VOŒ…ëôéÓX¶l™&Y¶lÙ€öíÛ#00Ps?½“ýû÷cùòå=z4 (^Tc `Õ‘Æ•+W°páBxzzÊ?j‘Hƒ pýúõ ›÷èÑ#tèÐþþþšô&âŒ#`V¬:Ò š{xx૯¾Ò4‚ˆ ZµjذaƒÜ(¦ÄÇÇ#)))9Ü¿_ùå—przÁw7$$… Nu_É+..Nžº»»Ë£®¼•¸|dôxñËK?žÅBÉWSrr2Š/.ˈˆˆ@¿~ýP¨P!”(Q]ºtÁƒäH¤M›62Å¥‘ ¥#!²hܸ±Œ¿qãF‡Æ×׋/F™2epàÀèËÛbãŒDÀ꤃±cÇÊ¿Ï?ÿ;vD­ZµÐºuk ïÈ‘#ŒãÇãöíÛr*Ò¿I*Û¶mƒ‹‹ nÞ¼)¯ÿýw9B9{ö,nܸ™3gbÀ€òœÈ(11‹-‚ аaCèËÛû•›ÄX «“µ„~Ðôçêê*¡'OžÄÞ½{AÓˆ%K–`È!r<ýèˆ}ûöáÉ“'/@qi$âçç'ÃH¡Z°`AìÚµK—ªE‹òÚ˜¼5ð #À¤BÀê:9rà›o¾IU‰I“&ÉhŠ+&Édذa©tDºHãÖ­[©ô ”i‘"E¤~C) |ùòò”F-DTúòΕ+—’„Œ#V' ]u¡‘µk×7o^L+,õêÕ“ç ¸xñ¢$ƒsçÎ¥JN:‹Ë—/§ºwæÌtëÖ-Õ=ºÈ(ï—ð F€Љ€Õ§'ô¶§/íèÞþsçÎÅ„ äÝÇÇuêÔ‘:ˆÈÈHÄÆÆJÝÇàÁƒA{:Ò )FW­Z…«W¯Ê ;w‚t&4MI+Ææ6=_3Œ@ ViÐ÷üeË–•¥-Z:uÒLYfÏžÞ½{Ë8ÎÎÎrÓ×üùóuö×ðáÃAJÐ5jÈZ1™7ožÔ‡)¥còN›–¯F lâÍÿÌT0è-OovsÛÓxúô©œvÐ> *èeh×™F,ááá’8²gÏ®ôÒ¹±y¿”ß`ìÅžÆÔ©SMn…ÕG†Ô”6n)£CâÓVtú3DŒÍÛ<9#•°ºN#+Ëme& GìUn#`A˜4,.gÍ8"LŽØ«Ü&FÀ‚0iX\ΚpD˜4±W¹MŒ€`Ò° ¸œ5#àˆ0i8b¯r› "À¤aAp9kFÀ`ÒpÄ^å61D€IÂàrÖŒ€#"À¤áˆ½Êmb,ˆ“†Áå¬GD€IÃ{•ÛÄX& ‚ËY3Žˆ“†#ö*·‰° L—³f& GìUn#`A˜4,.gÍ8"6i#TšŒ“÷µc'ŽâÔ¹Sˆˆ~wWD„GÀ×ÏW‰öüH^Û ŒÓe6é‰Î•{)Ç”ûJB²†ž‘]å´q”k]y‹Ò4åQ´åQÈ#xçöFR\"¼=s¡Z…j¨]ãT¯^=•c(í4|®2$}èÈ!;} wî݆kWDGE#O¾<"ÙÉ&ìS÷õ³vßQκž º¯Ä£s’—¯SÒ¦„Rxê¼”ø/Žš˜òy£øJ““ž"9!Hʆ²¥Ê¢nõºÒ‡———’ÈæŽ6IäŽq÷îÝX±q9\ò:ï\>Ôì_ Þ¾¶ ¤1=ñ(w/Þż§ô[2zv| Í›7—n*É'«Å%w¬ú7ƒ¯£H­Â(Ö±0ªûU‚³«³ÝC‡Ð[¡Øxfæÿ9Íê5ë]^•NÌm­q6GçÏŸÇÌù3‘œ'µQäΟÛÖ0Ët}ˆüÊ×/'ÿÂCñvËjlرC âF2Ó…8Pä’ó—ß~Á¿7N¡|ë²èX±|û;Páî鎀òª¾øKè€sû/àÑCðzÇ^èØ¡£Mµ×¦Hcåê•X»{ ªv­„"e ;Ò3¡·-DŠMú6Ä1ò?sú¿úZ4k¡7~V  —ÈO3D¾j>hûi+›úñXª/Ü<ÜP­u”©[ W¬Ç©3§0ôƒ¡°Ã6£¥7Éê½+ÑêãfY†0´:"IjûÒÝK0cö í ,{N~z?ýêTêYÕÚTÍ„¡ÝÙ9¼s Ù€Æˆñ‹À_@DD„v°j窓)¨¦Íœ†Ý§w¢ÓðöÈž#}iª!e…‚©í-6Å¡+1u¦é°¬PU‹qôèQ|òÕ0tÑJø[¼<[. j«*È]Ým;µETT”êUU4þXöå EÇOožjJï’Æ½ã°vØsb76oÝlJvŸ†FÓ›†Ö7GZa©Ü´"*µ+1ãF#>>^U@T%Ó§OcÛá-(Q¿˜]-;ßvÿl=a±Ž#âè>ª3–mù„QV’èèh¡Ãø ÕzVFÞÂyu6ýÁíX=i­Î0µnZ£N{5ÄÓIX¿y½ZÍ”åªF±±±˜þËtÔxµ*ÜÜÝTÁØÂ¯ºú³¤&„ aDX™"‹-ˆ#påÊ•—’8p@†íÙ³ç¥05o,Zº9K{ P©‚z«ñäao8¦7\kÕ©V§X·g þûï?5š)ËT46nÞˆœ%=à_ܰù*môŠ6¨¸èx$&$_;"¥ÕÞô*_—KNJFB\‚æ&=[ñ1º§ éÕ)½t”yb|¢üÓ”æ„ö¤TïZó—ÌOõŒ¦‰fÑKU–\cbbľ„õh6´‘A[;e=®:$ãæÈ剟wEå&•äõö_wáÜÁóøä×@ç7ÏÜ`g÷ŸÃÓäd´Ð >ì ãŽëþZ÷kÚjÉë¿×ÆáuGðÙ¢a2íåc—áâæ*ÓzæåŒè†}ÀÕ“×äh轟ßAņåeÚ‡wâÛ®ß#øFˆÔêwÿ´ š½ÙD†Ý>¿~±ï>ù¹ iïF²4íØ³d¯ÌÏÅÕÿí;‹©G~’iôýWµuelœºÛwDŽ9ôEÓ{¿R¥JX»v-¾ýö[Mœ°°0ìÛ·OçžGɇ1o^ÝSM&iNhž””OOÏ4!†_®X»¥š7h³ÖS±“rј?ptÓ?HJHBÕæUÐÄ~‡ìºz3ÞŸ¡ó‡Èiï¸îÐuh'l˜¹ILŠW-†ç‚GNlž» w.ÜÁûÓÞ•¥ü§ ¾ÀwÛÇ"Iü€¿î4Åó³}Á.IÔÇNNÙ°kÑ_HJLBã×¢×—=eÚôêDù.ùæOœÞõ/œ\œP²Zqô›ð¶Ü°H{uFµúo|õ:V‰i×;ûjž3]è*]—ö^)‹ëÔ©£+ŠEï©2Ò8|ø0r•ô†‡—G† »äþÙz#—Çä¿' h‰•×hX¶p邨԰‚Ìç©xœÜqUšTÄôã“Ñý³®Øò¿íš7ž>¥mÆ)òLŒ’ž(íÙçÅÃW“þ€’Õ‹cþg¿¡zK1Eøg2^D³}ÁN%)ÎRj7° ¦„W‡wÅŠ «q÷Ò=Ð(eæ ¹¨Þª~õýjÍHñ`Ǖ˴4b9½û_¹J4|ñ0M~úN£\%s03E6l(—êŽ?®I¾iÓ&Ô®]ùòåÓÜ»{÷.Z¶l‰Ê•+£bÅŠòœÞü¡¡¡ðóóMg¡ó€€©É§eÀ~ýú¡P¡B(Q¢ºté‚(Q >Ò®çN T’¥‰~-Ézâ_ãA8Òǯ)ýã™+j¶­!I2£Á•W1a÷x|ñçg:‘ÿ:#Ë¡Ñ"4"9r¤7:¿w%ßnƒ7¾~]>w/áûßâ£ÿ ÆÞ¥ûõ8eE#½:ÑóñäÁŒÝ4Sýˆ\ùraÁðßdT•C/±?öE™Ú¥äýôþ+^¯(6ïRGQ® iì;¼U ¥‡‰&Ì+ONùPýá݇rxIN¬NR¡Ay´ì×\¿h¥@ÔíRG¾aš¼ž2’ ¹ª Oï$ |ÔíüŠ|ØÊÖ)ƒÞòMBú… ÊA;Š[³Mu¸fw#‰Æð-äƒs_À¿{þ“DÔâ­¦’ØhÄR»] œoEræñB¯1=Ó·+qéX¤r!ì?²Oû–ÁçNNNèÔ©Ö¬Y£ICçݺuK5å4hJ–,‰;wÎß}÷]äÏŸõë×—£%ƒ•+W¢M›6È™3'Fމàà`)Ñ7!þþþèß¿¿Õà#M“ò–ö1h”¡dÚö½VÈ™;§ ø’$Ί' ý iäç×[‰*_ ´¤]´b JT-Žàë!š°ŒN: iœâ9TF·Mz5’#„òõÊÁYŒ´Ÿ ]u¢)ÇáuGÑâífðòñ’$ÕôƸxôrª©U×aäóLÏTFP®.ݸˆÈÈÈŒ¢š=ÜêÓ“d1e¸xý:÷igPcã“°aÆ&œÚy>|¿hþtÓQ§(Bó¿lb()ßÊM­£2ÊPnÑæˆ³‹3| úЇâùw bj¡­× U[ ‹!#½qhHKo¶±]¾×Q@s]°d£V‹Š”+Œõ+¶€°sv~^MnŸtïÞD ß}÷hjrðàAüòË/"!’ éÊÞ½{e½ˆh,ÉâáÇèÕ«F…I“&I 6lØR²ÆÅÅaÉ’%Xºt©µÐ7CDãÆA#cv0ž{—ïÉz25âa$ª¶¨">B+‹h±*B :ªc˜¨?)å2Sµ)»Wvv¦NH×°zõjùG#m!¥'nܸ¡¹}æLÊœŸt2ýºuëdúÞ½{KBT”¥ .”dD„DK+V¬0šÜ‡‡ —»¦üŒN臾kqʳ@„AÓ¿ZíjÊd4âûké>ƒVÛ虸sñž˜b„H"Eµ©¢¯N4E%Ùþå…Î+NêØÖMÛ€ßG/ѼXL)Ó#§;>Nýâ3%cÓX}¤As0cv´5ïÓs‡Îǘvß"^Þîý6bõá:æ¾ïO€ÿ„Bë”P,ÖnŸòÀ¤@ó>M0sð|ÞäKäöË%ä·ÎÞN/‰Þ°²¯”Áô÷çH"‹ˆÅ[ãÞ@1Ü$y[œ/þfÖMÝ È$B®Ö´ìûBï¢7ÓtââåÛ;(éQ¼ñÆ ÍSô#×R`’cÖ¬Y7nœIüùçŸhÑ¢rçNié*håKQŠúøøÈ¡ñ‚ @«4...?~¼œêÐÈ ºdÔ~zCÓj×Î…»…Zík A÷z²ÈÇÁáøó»•B¡X®bõ*=¡Õ0Êã›NßIåA#RS$½:½5þMÌùpF4-¦#Ù·P^ôŸø¶)ÅhÒdS”à`͵µN²‰·á3S [µj•|ˆºvíjpdTç×óQ¿·áC*Ò%„ÜE~1—¤á? íh.hŠ} ÒoÛ§ ÁuÖ‘ #%=,i7¨‘^ãþõ`äÊ8sl…þ{éôo9@íÑWŸ´÷é‡^´hQ|ÿý÷rÔS¦LT¨PA£Ôl×®š6mŠáÇKE&‘ é)húáíí "ŽÀÀ@™-µ•VVhÚ²eËMQW¯^•sïÞ=©o¡ø¤/)[¶¬&Ž!'Ýûtëßw1$jª84b¤g”gA;£°ûe´DžYÑW'zŽIK#=›JNJýnž½…ì×<ñÉO”[iŠKûshŸŽ©’y„Œ,™¾gZËž†$§9½öGKÔ±¦>$46aP½©Óý‹éVÞ)šzCÚgP›¶"Ö4¤ T„êJßth‹ö¿fÍš #74Å Ò ²Ñ~¨é\™²hçA#”#GŽÈ¼iŸ‘’v:í¸éÛ6%/et§\›z$â7—è«=Ǥ7—Ðï(ï|“«auÒ ‡C†šŒ$œa0iÐ> ZV%Ò © ý¨ R†Ò4ÃX¡ƒ±#‹´eð3‘‘Œ¯å ˜ +‹ÕIƒÞB´£ŽÅ8HƒO?N}B›¬6n܈eË–IÅ¥%Z[¶5©Ý–ôÚ¦Ï_ ò[ÒÿL¼ˆiÞ3«“†y«Ÿµs#ýÃŽ;¤îaûöír7=Hô"Â`a,€ÕIƒhí­Ü–h”#æIóWšÚÐ&,ZÖ¤%Pú––T’°×a¾©: GìkCÛ”ò[z±ïÈÐt™guÒÈl…³jú'ž`ÆŒr9“ökÐò&)IÂÐ… …Ñkú„VDhÉUŸÐ¾‹k×®é –+*–L¯·`P «“Í]Oî9‰ §.¨Öh{,øÚ‰ëøbç Bµ…6m½ýöÛz£Mœ8Qn1×¶‰Ï;W_0Ì•þAðÌûdÞr8àeÈTDÛÆí_°ð«“ C«7«Ž†}R6âX¸}“ýŇP=ʲ(}0F›ä´GúêîîúÜÝTùñÇA¦Š¡éóùçÃkSïT5µÌ¬’ŽvCg¿nº)Sq²¾êÕÔšfñt¤à¤©mʹyó&ˆ8hk8‘…™ò![‡”›o"V'”e"^r5¶¿/h–\i?EëÖ­ñ믿J¡#mù&â éalobuVcÂL ܬNjíhå“5/ú®„Fׯ_Ç´iÓäW¬j z$УV|.MþY«!dæ!.6ÎZÅiʱ:iÐT.NÖ-–|M,ùz.ÿs‘Â`‹¶$Ä&`é¸åø`ÖûÒl<ù¶˜Ø{2®>„Ž´Ç¾e¤ñàq[¿†S|¥õ¥Ís·¢NçÚšÕ íü,uîâìj7Ÿ™‚A~¿|Â$bBªž)ù›†¦Ë¿ZüR_’Ç´úÝê¢Ï·½_Ê’Òüþå4êÙP<#í¤²@D8pjýNË—â[êF¢°gÏxó™­ÕWOÈl~DhdfëmTz§lÂÏ„0L.Ȫ´öÊÂ-1%!ïÜŠ?2¦S¾~9\<’b{‚¦&Í…eq" ’¼E|òD<à‰FÕ!³‘#B"¤eðÌæc«éýóvW[½z»…ùHêó*Í*§*›,ÞûK1bM$¡-dx‰<ìÕíòмí*|å¼?m€$íx–>¿£7k‹u_ù¢u¾¾ÂÂ÷SgórVc !Ã; {Ô—Eiû.¡ägcòÁ šjÅ-2\LfIGKdC’Ì î™ö¬/òhYø„°"Ì;G•2ÅËàö½ëð+ªÛ¨‘%ÚMÆ É&訕Ÿcý´M©ŠÓÿÝÄöù;‘ ôÄ‹¤×èžrúAad´çèÆ¤¯2E®/´§¼©2³ÐEÔýkZÌB¹ëÏÖê# zË׬\S(ï试J!äPg¼ðÆE–½”·ˆR•{Wîcï²ýÒÑmÒçA‰oÎãíswP«J­T#$sæo yU¯R¡S+-Y/š -ø|!ÞÛKúNI[)E+àË•#0döû ×d«–„F!dÒžá?õÅ+kaã¬ÍØü¿mi³±Ø5½Ü¢C¢A&­-ViP›6l†ŸO’†_­Ý`]å‘‚tÙø8³ïœY´—’´§0”†<­ÑŸô¶%|šTi+ar_W¹†Þ»yô6ºõéiht»ŒGîbæÅ‚V±L5åhLÃéGî)\|’_ò¶FÊLš…ç¼J*`˜pó©½D: j‹ÙÂ00¹PT õݹóç–+jä†àß¿þ9V²†Ðô¹a­Fª|>`õ‘J&å<Ÿz #«ÁÖÀ7Ý2ÈÈ+¹ :¹Ì#ïYÚ„1éí©ÒW¬’ 9´ñ‘1º”´¦ #ÂÊ3|¦”§Vúø®}ó¸pà’Uªà!ôXdÇ•FôG>HÈ,ùȡµG¤bV© éÂHȈ1‘Y9Ïá•C Smw͹¥O虽sìÚµ6Ìá˜¹ë£ iвO>øwóYs·ÇèühÞz÷RtÛG×hØIôÆ# {6vý¾G®ÙÓr1ùX¡¡jÉúmP]‰tF„•6‘¥Ý®ƒ:´ë€°sŲv„ÅÛÑî½ÖøxÞš?R„Òƒ¦"îžîÒo 9'¡ é²Èq49>*'œb¹ ’Ø)ž šÆÐó@ú*MS+S-Õˆó/ jÉjKñ–*G_¾ªLO¨2äízûží8·ÿ<*4*¯¯~¿OáéÍ2®Û©Ê¢=_­…&Â+ø ±^?¦íXé9–d_ùªô š*.›b¹KXÝížšbP–d½ïký°dÕ"´ÔÌ 4–ŠDN½iÊ:ªåW{s ÷ÇÀ)dq4B!Ïîä{‡V_b"cä6VXn¥—ÙÍýw0ý‡Ï-Õô óµºß푇a_E•×*šÕ´»væ8§á )¿Èµbþ@?«¬œÐjÍÉ?þÃÏã§@ñdf޶ØCßÿøz…¢V‡ªW—ökËŒ´;ˆ©b¤ 'ß6´PÛ°¥*Mû¶Oß÷º ¹›TŒ9üž¨2=QZKKˆŸ Ž•c×àq°õ×è•zdt¤mãäß$ |€Uƒôÿ,=)±Éj„A}ñÑà‘p5 ›çXo5Bß3/ ŸN ø´”_¸L!«ÔöY;Ñ´j3“ C_½¯*iPeɰ̢y‹%ƒ’ßÓ¬.Däq~øÀ›¬ˆMS~þa n¾“ÛOgERµ™6Žï>Í«µÂ;}ßI¦Æ…ê¤A.]º4F4‡~=Úp“U…Ú~|éiü}ðoT­Z5«Â Ûíææ†õ«Ö#öBþY"•g÷¬ ÙÝ9k>ôú÷éo q› zjÕª…q#Æãæ–;8´ò¨jµ©ñ@ÒÇhÔfj;a@® YRvÿ8îGL*‚mÓwâá=ÓmÚ#ž—ÅGs{fìÛmÞ ÷ÛLT[=Ñ…@ñâÅ1eÂT¬\½›&mBÑz…Q¶žXÞK`Ž(´jsñÐ%ÜäPˆÜÊï‹è?yóù=r:ýüZÓi¯5Z'iãèËSÜ—AÚuxž Ýš,¼ž‰¯ãÄöß° Çxt% 1¡±hZ·†O™åVH´6è”–èkÔ¨={ö`ýšu8ùô4ò—Ëo?/¹ƒ”>Sž ›D:×ê¥ÿu=#))Rþ—áô¼(";Vÿµ&þóxʵr¤r5Y(ϥțîÑsA«r´×ãÉÝ<ÏE…0bÀ¨X±¢R›:ªºäjä·ãüùó¸pñ®Üº‚ð'q÷Î]øHýaõ±4m‚’A?^q¢Ü£#ùÕöî–öZW}ÒÆQ®uå¶Úù…ÜAá"…‘;W” ,…reË¡|ùò #Á,Æ#pëÖ-éÅþòËxö·„…ö¼ùóÊõÚ¾ ~×î;*Q×3A÷•xtN’öZéû”Púñ§JÊ0lš4hjÒ«W/YÙfÍš!W®\Xµj•¦òúNhºAiIç‘/_>Iľ}û@£EÆŽ‹-ZÀÝÝ]¹ÅGF€È«m#Ï /_¾|ÿüó.^¼ˆ3fÈpšvÐeРA/Å×¾A# M 6 NN/x±`Á‚’4\\Rš]¾|yíd|Î0 `³¤ñÇà•W^Á¼yó4Í "éÑ£èXºtiÍý´'yóæ•·.\ˆzõêÉó„„I@ôµé4XFÀ4^¼†MKo‘TÉÉÉrDÑ»wo+VLó׺uky®­U*àêê "ššøøøÈÏ€I_AÊQZª¥©ÈàÁƒ‘-[6% FÀl’4öìÙƒG¡k×®/5‰î-_¾\N?´i"hÏÅìÙ³qæÌ”-[V®ìß¿óçÏ×NÂçŒ#`V³§AúRFZúÓx"ZN%¡Ý¤4•¡=*TàQ† 'q h[m’4‡Ø¬NÃÔÆ)„AéI J# F€069=1_ó8'F€07LæF”óc& ï`n#`n˜4Ì(çÇ88LÞÁÜ!w þiñ¦þ&Q°—:®Óö­v|ís%/ºGyS:E¨ÏI¨>äjƒlÙæÏŸE‹Eîܹ•hvqtÒ ¿¬‡Æö½Ûqåæeä*èœ~žpvwF6gñƒ¥ùì© §—¯•ûºŽJ/R: W$£kЧÄEK‘Õxž¬‡¸«”™CV1±ptC\X¢B¢à忯u› E³KëJü¬|$¢Ø½e+Žnß÷ˆhL<’'778!’ž‰¯Ò¬§¢ÄkCÂ&^#òH×Ê9ÝH{Mé)"Ú×Úç®”¥”£U´LN÷cE²gÇ!W'Üwz†<ÅѨs'4nÚžžžJ16{´kÒ öÞ¹k'–­] 7W”¬Wßj'ç o³ÈQ±°ûqäØßX7r-šÕiŽ×^}M:¹6" ‡ŠJ޽—ý²WöîGí¸gxß37|ÜS¼ê~sy쫹·®‡âÈ„©X7çhÕç têÖn‚ôlUì–4BCC1yÆd„9=D;ÕàSÀΞ#žj[íÎ5‘Ø6gvŸÃÏ?Àý†H·•Fdc÷Qé%±iÝz¬?®¦1OÑ=W>dóx>Œ³ãÖzäýE$%bÛ¬±y+•®ëQ5›k—¯äS§Ná“1ÃàQÙÍ4vhÂÐ~8\Ý\Q½mUÔîW3–NÇŠÕ˵ƒúœ^MþvŽN™…³y£Qîü©tŽÐxoWôÌå‡wcÒûC°cëV›l–Ý‘ÆÅKñêëÝQ½W”©£ß ´M¢m¦JùôA«ša癘:sŠ™rµÝlHgõÁÛý´n ÞóòCnWÛº›ÅÒžÞøÐ5¶þ0Û7m6G–fÍîHãĉ=ñK [ô ”ð7+ö–:¿Ý?ý4 ³þ7ËÞªop}‰0¾ÿbŠ_»‹a…J9ÜèBDŒý=|ñú½å”L_<5îÛ iÐrÚ”_~F“ AoZ{‘Õ“×!ôÖ‹T×ÙÅ?îÿÇoÞ¿öX¤ µ3]0süNœGï¼…3U•É×ÏáVlT¦òÈ(q¤ÐIüpõ âIJªöyFéô…q¨Ó[§ÍMÉmEì‚4h>ûÓôQ¶})»" êä£ÿÁ“‡O,Öß´ á[õ0ù<\»vÍb娑ñÁƒqeÝf´õ̼’{cè]&‰ñ‰Å¥HÑáÑrã•Á ´"ÆEÇi]¥ä•êÆó‹§ÉOñänò UªCz«7Ø#§*t(‡Ùóg™Ü½™«¥?OÅk®¹4{ÌQ•dõƒøÔ}–^¾á‰ ªcZÈ=j>ŠÁ¿ÌO¯ªV ³ù%ר¨(¬Ú²M†4ÈúaÍò?ܽtOÆ-X²>˜9ž¹S6ÌLzk ª4«Œ–}›ã‡×Bå&•pdÃ1< z÷î<ó=”¬^÷¯c\÷0íØ$î€dæ 9(_¿š½ÙD¦-]³$þýë Bo?@±ÊEѺ ,û'¢Â¢P¨tA ?^>^2íñm'Eú¹‚ÈÄJÞû¹?ÊȰ¿–îÃúi‘œ” ï¼Þxslo”«SF†Mz{**ˆ2m>Ž¢•ñöø7å}]ÿ¯R WîÆ‘#GP·n]]QìêÞf±´Z*ä ä1ŸîjÛƒ{töâŸ&£@vü\®Ê{¥ìÆ|ë߃hæë¾…KâõSûÐÄÇBï (.9œ]0³Â+¨žËso]Â…¨'˜V¡¶Ä3JLIÞŠíµ[Zߦ^¾˜¸unöì¢E‹Z´¬Œ2·ù‘Æ®=»¯¢¯æ˜^ƒöýy@N_&ìÉ' ‡wìX¸[“¤’ úA“$'&ãïÕ‡0xÆ{øiï÷(^µ¶ÿºK†Ñ›ŸÂµ…~Ô4Z ¡°S»ÿÅ»“úcüÖ¯ñðîC,³ýo0~>4QìèŒÁ‰í/æ —Ž^ÆðÅÃðîq(\¦~ýb‘Üf|öÀy¬²§½‹éÇF÷ϺbÆû³ñ0BSήE¡ñë Ñí“Îò^zÿUl]+6¬H/Š]„Ñ6ë]Ë–£•ø¡˜Sކ?Äâ* °«v+”ñÌ…/.ÔìôlâãZµ I;Wß A{…N¡ª·~½sU†%‹½£´ËTÚ'š(ž—ûE•ó]Å4´I‚6.W¿mž4¶ìÚŒ2õ [Z­Ý¡zî){+øFˆØ¢ý÷¯Þ×ôÊ×+§¹nÒ»‘\…¡‘Híö5|=D–ÑIƒîõP¤\aä-œK#˜J(WDV´•Ÿu:Õ–d‘+_.´}¯µÉ<ÇþåP½eU#•„Ø9ªÈW$/þÛwVS|ͶÕѤW#ƒH“FVaqqýúuMz{<9zô(ŠEŃö-˜S:ùA™œ¹/»;Þ (k1‘ŽO™öõ/R õòä××»`q”Èá%—wÛç/Œë±‘š0µNjçÊ‹÷ìMÝÔ›žžÐŠIôÓhäñ3샞bª°aæf]»Åýå\Ô+ON½ø*ÓŠàæîФýz¤4#"Eœ]áøâ£O”¡(N©%•¨(T*e¤)F(|Ž\Ò„Ó‰¶>¦péB©Â2ºð-íƒÓ§O£xqÃô?å§Fø ±=¼\²ùßg5¼_Œ\J=U„%Æ£ Ð¤­mÜîNÎHxþq[Úx‰zî§gŽk71ÚˆIÆÙ³gUÝ lÓ¤A«>ŠӜӔbñ7KQ¯K|úûÇò Ã5?¯GˆqèúQ—(÷Ÿ%¿t>¸ó •BL‰£+}Ú{aÁQâùMEßâãŸGŒr¢tíRx}TM’›!È™'E¢¹iÄIRþøïØ¿è&þÙ«\¤×\¼åÍ-ʨ‚ò½¢”öº ]¢|Ô–6ŒžR¦*r7κoý Ïpùì9UIÃüt® i†ãÍÛ7á]À°‡‡ÞÎ#¥Â–!„^áÅœ•ªCËŸ7þ»™aÍòö•½‘“„ò¡é„©²W(;©~¤ëؽø/”DAJORÊžº" ’ó‡.àÛ®?€F!¦ ía¹u÷–©Ém"]“H‹ìú\*–CI Jßx,¾{ 4ÜÏëæ.Û¼1äþ‹xœaû鑋Ѹ%tO±äžu§‚Éݾp1ÃzZ2‚M4"ÄÛÀÍϰ-Ãnînh'ôó†-@îçÓ™æ}šÊéÊáubEAŒ@6ÍÞ‚ZBwA«é‰kvW¹Âòûè%X=i-+ Bƒré%I7,¿˜º|Þd”P¤>ƒ·¯>œ;XÆ'çí wðUûqòû™8±TüÆW¯Ã¿˜éö3‡H±âdÏ’ÝB•§|“#ÛåHÁ×5;æVª£)i¶X!ÝEeïôG¶ …ÂtáÝ«èt| œìè^ f£Vš*E ›!jJ61¬1Ö²`M† †¢P!Ãçè?N™ˆ„’±ïÏ êÓ²kô“h© ¤kÚÿ@$àæaùPE(/Z5É™Ž^D‰›Ñ‘öŽ„‡†ƒ$íÔ†öoÐHÆ¿¸Ü=SÞ|å—^ø¢—bëšméE±é°!M[a„§éÄ™^ãhÓU¨Ø§èáùR?¤—.mØý¸Xø Ò =ƒ5%T(nç÷ÀÔ?UìèÑ£1mÚ4£Òè‹lÓ# WW$f‹ÓWw÷=¼<@Š({4”kcŽÚù“NWÜì9²Ã¯¨î)Uµ«ºÒs/»»¥ÞÕÆÔÂô¸®ÎΦ'Î %í¹(šC¿r<ƒäšàî/ž1ÍM+¸šyUÉØj[—&¬]Ú7²‘É9º"`ù]v Ìój[ir $›& ½µæ‡F@ßÊ…C7ڈƩý2µiÒ ½j³ª}ÉQÍ„4ôI Hµ6MĨj³ªþîãK!À# ýÈÒJÚ¿ ›& bTµYU÷qˆ¥à‘†~dma¤aÓ«'ñññ¸(>ö Qw]ZÚfHt¤uw)š…ШHlL0w¶‘}ªï«îê˜M4¢—¹Œ€ƒ!`Ó#ì¡LÙWJµ¹ËÁúǤæ\Ýsät¶’(N/´vÏg+Õ±©z„ˆÍ]j}L§Fålz¤ÁŠP5 õËdE¨þ>`E¨~ld+B3ÈAƒYª¿cmAjÓ# úZUíå%ýÝÇ!–B€Gú‘呆~l8$ #À#ô;_ím6­U²qQXÕªÞªš¦Cn…¾d?”Ììi Ù ½w9HÚ#%s€,Æ!À#ôñR{ômÓ¤‘,ü¨I‹¿^úi|÷êDù¹¼Ò­ä¡~†0 LBÛÞÉêø}an0g{ùúO|µÚÖP¢[ågYÿ–nD¢p6Ä¢Òi$ #BjŠM“†»»;b’Ô1(sPX*¿v2µU&²îä” ÓOMÕÙg{–ì•V·Æn#lŽº®w çÖ$ ²”î™3óŸ~ël µn "fÑY óðPï³|ª•M÷Ž·03OVº­-dÉ|óœ­xux×TE“¿çVµt€­9‚šbTA„AB–¹ ÷Ö”„¸xÙ9iØ÷8ɲ½'ÌæÌÛ²…d»M4ŠÅñãÇ2h‚yƒ“’0ÿ³ßðš0öë. çh Y;'«`_µÿVú:) \¼úy7é܈H„Œ“|×c¢´FÒD‡5å‘°X8КEš½¬ì¹¼•`;¡f¯¬•3 ›»Ê•µr©©‹³é‘F‰%v#cc¯©›”¹«µS7HãÄU…Ñß´-£äöàûâ› c@^Íf ž+}œ„‡>AB\"®:$}›¼ñõë¸zò¦ çGÚî ÒæiîëûW‚Q¹lsgkÕüJV­"}’XµP;)ìš[6”®XAÕÚÚ4i.\žNžxl¥ÖÈRù•¥µpr¹xýßRéIç¤ÏhñV3ŒøãSV¶>ó¡ÇˆnpqsÁ™ýg¥ËêÉfo4–*4(׿ì!#=¼óÈjüèrªV­jµò,QP&pÁù…3K”ay’ï•ÛÙQ±bEU«oÓ¤AÈ´kÑ—þ¾lH‰X¢Z Zw{—í—¾Zã“äùÃ{äu–Ç62XL¶?]œ…K/¸¸ºÈ£RYrÌlM¡ºù¸çµkGI„×+¯¼‚9³KWÖÄÏÖË:öä¡p{Ñžž)¾‰Õª¯Í“F‹f-ðàì£Lù1Ü’5JàãyhþHêî™]^ÓT„–Rg Ó¤œ%‚!b!%–—;Wkw¨)îÞá#ÄTEø#]´Gº}Ì[ä…g/CëbJ¼³ÛÏ£g§·”¦¤·•4n⃬½^ÃŽHëÐl¥íúêA«&{Ýž¢ãkê÷¯M+B Àœb%àÕv=°kË4|³ž>L­r¿I¯Æ gÎ#[~%HR‡Ñïû>w ]‡uƼO`d‹ÑrB¨ß«'´ÞÒBS)Ÿl¾¨Sç…/K—iÉüÛwéŒá«×à~D,Ô´ümÉ6“÷_‚@+ul…¢E‹“Ì"qmž4¨Õ:v¾Ã{qíôu«~&O>X§þI¼uü2DzJ#Å'ùo%?®Š#¤Ï~*WVh†|œÐæ/KKlT,Îmº€qÿs˜ouhÞû“¡XþåX|$6;KgQ¹ƒã¾9ðý»lË?Ñfh¦‹‹ †ô9.n¾"<»›!ÇÌeA#Ú:®MÚ9ÒÖqá€Ú„A+3B¯o€V›I4h€R]ÚcmDÊR¶#µÍжD“ ÉäH¼÷õäÉ“¾÷7CóÌl<» j$­¤ {÷Œíü=h/‹Ø¶žü[gì@Í¢µÑ±CG‡„ä!àJ‰‚{ã¬C¶/½FE opSƒÐöãP­Ú‹ïŸÒKc0»! £F8rô.8$§ÖÈVËHLHÄ–ÛÑ©~g ~/Å7¬­Ö53õr^öfþö+ ´h‚uOBTý)3í06mXB<ú]>Ž>?|‹B¿cKbW¤AÀ•-S#ÄÑ…'péˆu–bm©Ã¨.4ÒÚ1}ZTn‰ž]_s=†>œé«ÎÑ?N@|óú˜2®ëÈr)ê f'?ÁØ™ÓÑ i›kªÝ‘!HCµŸÇMAì‰Ø3Âî[wרZ½H£‹“[OãØo'ðaïÐïíþjUÅêå’½ØO¿þ ¯ ûÓžEà@x¨Ã:"„þb…Mm.âƒOçÌ@«¶m­Ž³!ÚÅꉮ†äÏŸ¾€»vbÙÂ¥pówEÉzÅ¥‚Ò H]u²Ô="ūǮ!ø¿P4«Óc~üÞÞÞ–*Îfó¥GÇ®]P«n,ûe&ìÝÚqÏPÍ37|„w{•[±Q8…˹<Ðêƒwða·® ½*¶*vK(=D­Z¶BÓ&Mqøðalß»ÿ,Ý ïÞðò÷D67'±[3e©N|O&„þ&^ž¯Þ¥|©JÏd^Ú×/%¾8HI}Mekéšö:ušç>/_©GJœu¢:RÝb£âàê↸°8DGÁ;»7×m‚?´€¯¯u6Š¥ÔÍ6ÿ÷÷÷ǰ1_âNß·°{ËVÌݾÙ#¢ 0Ãá)–ºcccåÇn´Lû4¥ã_jú1ÔB˜1q© %>QÊz*ú8Oá$FN¡.N¸ïô>ÅŠ¢Q—$¦"jïöTê›ÞÑ®ICi)Ë5j$ÿbbbpóæMÜ¿_><Š?XúQÓ9m´¢»öµr_×Q)ƒÒQ¸"]S<%•EBå*÷èH¢”)/Ä7Ü-~~~r‰- @ž+á||@‘"EÐwà{òïîÝ» ¿Ç#((ùòå“X' CN Ö”’ðÖîºG×é½”>£¸$Ú×ÚçJ•r”²è Ý'R#òo ú800¹UþÔ=¥f†ÿ嵐ÝÜ9r |ùòòOû>Ÿ;6´$O,–GÀ.¡–‡…K`}0ièC†ï3Œ€N˜4tÂÂ7F@LúáûŒ# & °ðMF€Ї“†>dø>#ÀèD€IC',|“`ô!À¤¡¾Ï0:`ÒÐ ßd}0ièC†ï3Œ€N˜4tÂÂ7F@VûöäÞ½{8pàÈ. #ÀXcÇÌçÞ4›øº¾Í¶¸iÐçë,Œ#`}è‹`rBe±i˜£²œ#À¨ë4Ôï®#`W0iØUwqeõ`ÒP¿¸Œ€]!À¤aWÝÅ•eÔG€ICý>à0v…“†]uW–P& õû€kÀØLvÕ]\YF@}˜4Ôï®#`W0iØUwqeõ`ÒP¿¸Œ€]!À¤aWÝÅ•eÔG€ICý>à0v…“†]uW–PÿÆ ÀšgŠãIEND®B`‚asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/normalparsing.png0000644000000000000000000010016715031566105025451 0ustar rootroot‰PNG  IHDR÷`¦0ÜsRGB®Îé@IDATxì`E†_%¡÷¡÷*½H)‚‚å±@©"DEE± ‚€éUQTŠôzï!þï;¸çår—ÛKn¯~—Û>Ïìí7å›™t‰š! „€B `¤˜’HA„€B@E@„»<B@! Œ€÷«P)ŽB@îò ! „€0ì•çæÍ›¸sçŽ='±B@! ¼H k֬Ȓ%KŠ9°Ûs?räÒ¥KgèsåÊܾ}Û_ÆyúôiÃ~åáÔ©S.Çáj>õ´/^¼ˆ˜˜Ãé¹’7Wü2?®ú×ËÀ﨨(\»vÍp9ô°lèݸqÃP8£ù;{ö, Å©çƒß®<;Fób?¯SÎ]ñ¸’>à|®mÓ¶wïJ¼Öá] çŠßØØXð·e–£k–óòåˆü2>ç|ÞÅgmŸ–÷Ë`—‘ësçÎ!>>Þåp|öiŒ¤aíÇ•:Im8O¤ÁwÑ÷u9¬¯]ù½ðù¹zõªË¼]y_ZçÏì­[· §·oß¾;íöܳgÏŽ|ùò9 LÑÑÑ ÿ9ròϴѸExá—ãp5ŸzÚž;wn§­$Ý¿+ysÅ/ãwÕ¿ž'~gÈA5ÂRÞ«%„3š?þhòæÍ«òdGg×®<;Fób›fjù+WÒç‹„/wÖMZÊáJÞÙ!`£ÙHÞ###U¶Œø¥G ݰ°0äʕ˶8ÉîSû^`žø^`:®¾Äùìg̘ѕ`¸té’bÅúvŸR'ÖñºÎ¿©MC_±mô°NG¿vå÷Âúá»?5é}_êùâw\\2gάž)k{G×|:3v{îΉ»B@!à»D¸ûnÝH΄€B@¤Š€÷Ta“@B@! |—€aáÎy¬‘#GâóÏ?wZšÁƒ+e™—_~Ù©_ô`Vù8Ù¿ìÞ½Ÿ|ò‰!4/¼ð‚š‹·öüÊ+¯àÌ™3ÖVn½Þ¹s'¦Nê4NΩ¾øâ‹Ný¥Öøqã”’Mjà wøðaX?Çœ3}üñÇqôèQKðaÆá×_µÜ{óÂhÝØæqÅŠøá‡l­íÞÿý÷øúë¯íºY[þùçŸê}ñí·ßbýúõÖNi¾ž;w.¶nÝŠ·ß~çÏŸO1¾E‹aûöí)úq—#ßfÍš… 6¸¥«áø®`=Ø~ø›sf¨ÌºtéRÌœ9ÇwæÝâÎy^ÎCû²1ó™ÓËMö ,Ðo }s¾Ÿuµxñb¥ûä,çà{öì‰ß~ûÍ™W‡î†…ûÊ•+ÁÝ“O>é02ÝaÓ¦MJaÄÕ\ïëßf•/S¦LX·nX»ví2„aáÂ…ÐŽô|€®_¿®ßºý› ¾XjóÅj–¡ÂÔ7ß|cVô*Þ¢E‹ª— •†hV¯^üK–,Q÷lôNž<EŠQ÷Þþc´nlóÉÆÊþýûm­íÞóÙüûï¿íºY[RqrÏž=ê½A-qwš¨F-ŸC]ÙÊQü*TÀ”)S9»Íž «U«¦Êû¬S¿Ž<î[¶lA—.]@äÌPsžôF_xãÇÇÚµkUA&L˜ ^|PÙcâR#† BïׯŸá—ãݸq£ê]òeýÞ{ïIJ­ p¥|\¶ÀV²3‚ Xâwæßî|Ióz饗Ԉ;âLMìða~ì±ÇÀ [®Î {ÐFzz<|Î( z÷î ¾à¸¼Ê™¡6tÆ -¾ÜúöíkyÉýõ×_ê9/Q¢„³¨T¯ÇÕ22R>—Ì÷k¯½æ4 Wâh†³µÏl±ñÏ‘Œ!C†¨÷%ËëÌpdŠŽÜéí³sÁrñ7JpÎŒ>:¼lÙ2¼ÿþûμ+÷¯¾úJu8Yv®|ПýÛH$Ÿ~ú)¸üÛˆyþùç]¥ãÈUxx¸ê¹sD–# ÇŽsšŸÛœ9sª•N=Ûñ`X¸óE˜?~;Q$·¢€¥ 0`@rG;6,<€îÝ»ƒ×lÙtíÚU _ð…lÄ<óÌ3¸ÿþûU¸‡~ØÐËjÞ¼yª¦§Ëi#ÆÕòqÍ$×v1dÆá‘G1â]ùùè£0jÔ(ˇëA±ÁÖ¾}{T¯^:t0u8?¥<‘)_œl±LÎ | UNc1|¶ØxäT‡rÉ̈aïfóæÍÊëš5kÀÌ?ÿü£^&lôÒ݈IM/‡ó(€4h`$C~ø’o׮ʗ/ºuëj|êSdË–M¿uø]¦Lð·ØªU+Ô¬YÓ¡¿Ô80ïUªTQ sgñ?ñÄàï݈ሣ>ŠÁÑ'³1|&jÔ¨¡¼rT‰Cä\ÂæÌ¤6œ/;&üí<ðÀº•Ão.¥;yò¤Ú¤ŒCólð÷ïÌð9á‡Ïº9ðÁ¨ò¿óÎ;àHÏ_|á, Õ çï“~<ëåä(ÚСCqðàA5¥™šgŽ£] 1bÈÌhÃCϺ~iG¡½cÇÝ9ÅovöŒ6Jm#²»ÎÝÖÓœ9sÔ‹LpmÝmïùc¦Ñ¿mÝíÝsž¸E‹ê×5XŸ}ö™=ïÉìØ˜à<§ ø0qXÙáPçm »lÙ²†‡õréßÎÒ©]»6ø1bô8ùÂ5jø"É“'Å{úôÆÚl|)0®»å‡/àåË—«ž­%2\°ž9ÜÍ(ëÂýÁT½ gɳQÇÞ_&F p|ŽÙceÏÂˆá ‚™#0ÅŠSkQ7n NÏPè³qè̤¥ŒŒ{Ĉ†ÎòB÷ßÿ%K–T#¼§@s6¼M4|¹sÞÑ™á3iý\:óïŠ{ÕªU•÷B…  ö裢M›6à{Æ,Ã#™ê†yãз³µÒ© ÇtXgnr®êŽð}É3##Xz]–*UÊéèóÁÑ@ L 6>+F§©0{ölCG¾+¨cÂQÖ+߃\Ÿîê3g´‘ï _k¿¬ß&MšX¬ôçÂb‘ÂGùž>|8J—.‚ÏäN†¤… {ÓÜòÎ,CKC!]°`AuÍV&+Ûˆaï†qð%È=ç^œ™?þøÃò 0ÍÐÐPgA|ÒŠV×?FzU,{¼üaëswzz=x² |ø¹ƒÞ c=èsÜÎòÑ´iS5ÄÈ!9#†½}N/ú§ß:uꨩ"êP@Ðð›CôÛ¶mS Re™ÂŸ´”‘Ñ/^<…Ø]wbÏ”½ݰÑbÔP¸;XFãò”?¾»øló7ïŠ1: Æ89ßn­ÈÊ‘1öv™Ô†c¼ìIòÙ0úâgyøÌ2Ì—_~©>|gºÛLœ8}úôQúÖ gépºÁèû‹óØU¡pçÔ™«=jgyq—»mý²'Neİ\”ƒF{úÖqáƒ`dË;ëÈ=uÍ;µÌÙz£Ö/{UœÃwf*V¬¨ýq¸ÕHoÄYœöÜÙ:¶þÑÛóã ;6ØøCbo–*湺ã–;òMÝ t}.ïçŸ64Ĩ§Ý©S'Ã=Wwøbltp˜/¶mÛªd[·n Žh±ÎQg&­et¿«î,GØ»bïï—_~1E½zõÀF•» G7¬W!¸;~}”ÇY¼0úï•:9FG4ȅpÒˆŽRjÃ1*”rÊÁ¨a~8ÒÄž; ¿]™21ÒÙb=rôº3œN2Úk7ZÝ;Ÿ_®Ü!wþSc¨$gÖ»Ÿù±®_v:9JÆiP#æ7Þ@¯^½Ð­[7#Þ“øq>vý¯w[óåëž]’Û¹a¯/Yö°˜O*,™G¢–3áM›6M ·šÕsgϘJQœŸõ%S¿~}¥ÀרQ#5gÇV¢+?tw–… ÎÏòÅJE/N5O=õþ÷¿ÿ)e<£a\õÇ¡yöî¹ç´páÂàÇè|;¥¥Œ®æ×™Îåñ%Ï— …QåWÆK}¾äjƒ;Ë‹îNÊÑ£ÂTgô›Ï;;ÔIižžJ`Tèå3ÈüÐ̇¢9ÈŽÅÞ½{-+*œå/µáȉBíÝwßu–„Åï¸×_dÁ:§›Ñ/ßT.ä”;FŽ G_Ùàà;˜éÑ/G¹¨DÆa}wv⨀Ë÷7{Ã,Wj óÉ÷3ëÎ ÃŽG†)äOœ8¡t˜ú/W®\ê²¥= ÉŒ¦yžÌNÓ(LÔ†Z’Ùk­žDM™#™½# í¡wädØ^›Ç±ëWë!'jëEíºÙ˧¦1š¨5µö ùhCäöœ’ÙÍŸ6·®˜ÛF  ŒD>{¬{Æ•gÇh^lÓIm8£ñ8+£+ékC¬‰šr”mÒvïÅ«½µÞ›Ý0´tÎ^Wüj6Q{Ù'‹Fëé%³Ó†·Õï3™ƒ >ç|Þ{ï=\Jï5æe°5¬_MóÚá3|èСDMÑÎ6X¢³pÚ¨©ò“,  Gu¢MI9|W2JGá´Ñ½dùpäWS"NÔzÖ*‡|Æ´}’Ü: —ÄÓ¿7|9z±.½3¬ãrå÷Âü:’%ÖqÚ^§ô¾d|̃=CVü-Z>ZãÛÂÐÚÍÈ»ÐpÏ-1*¥°åE k_4l§Ô"·Í³öÃVóÔì}QC“ûÁh\U@1‹‡Ì­çÍJÇ›ñúZ9Râ+†óÁ|ÇøŠár*W ë×èü·uÜ© g‡+×ì]»2Z£ÇíŠÞGSu£ëºè÷îüveNß麗+¼9µAåpŽJrd:5ưpçÐçB9(†ÃÀ*áZe¹sÈ(PI9„€§P˜ÖªUËSÉI:BÀg pÅ—)ºÒYµ-Œaá®t¥å¦‡ñåoî@Æ! „€¾@€#9iì,ƒ!my_(¬äA! „€0F 'ém½ré‚Ñ:—"p©¾FÙ6.Û{.·2ºŽÑ6¬~Ÿš8\ͧž—HP[–sTFŒ+ysÅ/ÓvÕ¿u~¹¦›ó8®Îßp—->"FÂq]/§oœNí°UÊÖ©+Æ•òÍ‹mú®¤aÖúÞé³N©íìlù"uKX©™ v…‡+eæ³È%¬Fz'ôËü;+§ÎŸñò÷jä”Ú÷5îù›0ú^ÐóÆgŸå0ºÑ”ΕzÐÃðÛá\©÷ÔæõOctå‚u:ú5/üYÅߟ;#~õøùÚ|ò9ä³ÄMxŒÊ%}#'Gþí wGžÅ^ÿ#вeKµÉèIƒþWBɱ¶dXÞ–ˆÜ ! „€ðs"Üý¼%ûB@! l ˆp·%"÷B@! üœ€w?¯@ɾB@["Üm‰È½B@?' ÂÝÏ+P²/„€BÀ–€w["r/„€BÀÏ ˆp÷ó ”ì ! „€°% ÂÝ–ˆÜ ! „€ðs"Üý¼%ûB@! l ˆp·%"÷B@! üœ€ËG¾úyy%ûB@h–.]ŠÕ«W[Xð “fÍš¡]»vi:œÃa*.ˆ`êÔ©xþùçQ¨P¡TÄ"A„€ é¹Ës ‚ÀÖ­[ñý÷ß[NtäIjC† Axx8xB•§Í/¿ü‚C‡!_¾|hРúõëçé,HzB  ˆp¨ê”ÂãJ•*…÷Þ{O}>þøc¬\¹ׯ_ÇÂ… “DÂcJSø×®]KâÿÂ… ê(Ú$–ÿÞÐoBBB')Ì{ÿþý•}Û¶mÁc§ûí·$þäFãD¸g%>…@@(Z´¨ê¹=zT•“‚¾yóæ(V¬ .Œ&MšàÊ•+Êí£>Â#<‚ž={‚šµk×âž{îA•*U5kVŒ=ZÙóÏŸþ©ÎŸ.R¤òæÍ‹aÆB毿þÂÙ³gUüÊBûÓ¾}{L›6M¿•o! \$ ÂÝE`â] öÆ9¢>°ï¼óöïßÇ{LñÓO?UÂþäÉ“¸xñ"rçέzùtŒÇ¢E‹-[6lÚ´Iùçœù Aƒ”ßíÛ·cܸq8uê"##Ñ¡CtéÒ—.]ÂÎ;1oÞ<̘1C…c/½\¹rêZÿS¡B¬X±B¿•o! \$ u.ïB PP ×¨QC']ºt(^¼88<_¶lYe÷ÄO W®\êšBŸÃé{÷îµ?þüÊ?•ñhBBB0wî\%¨ïÕ«WÕœþüùó£æÑÙ[gϽ{÷îjøÿÙgŸÅîÝ»-iê‘W¬XçÎSq°Q!F׈pw—øC aÆؼy³Ãò>|o¿ý6þùçTªTI £S ë†Ãïº`§Ý¬Y³0|øp4jÔÙ³g“'O‡ùÙ{¯V­šT}W­ZU}8pÕ«WOâÆ† çûE¸'A#7BÀî†0‰'!\ØÃf¯ºW¯^X¿~½âo½õ(ˆí™Û·o«¡zjà³—Îùw ÷Ö­[£@È“'Nœ8ŽÐP鎂›&,,L¹©›ÿœ9sF ùS@Œ®9w×™I!ð8þüyÔ«WO v f n[Mw…6×ÉSÃ=S¦LhÕªØË§ xÑsžÆõÀà›o¾QÁëÖ­›¬Ñ@]öìõÆ€žŽ| !`Œ€ôÜq_BÀ/Pp~öÙgI„ðñãÇqóæM¥ì¦‚Jpqqqúm²oö¦Œnݺ½g Ù¾}ûªa÷Ù³g'óªâç|åÊ•Õ0<׫sS†9s¦ `œœKg¯þõ×_Wñ´hÑcÆŒIçÁƒ“ Õ'ñ 7B@¤H Ö’¾»%Eoâ(„€?øé§ŸÐ±cGd̘Ña¯—½i v±—/_>Åbq9—¿éËÝxMAž%K»á(¸#""”`¶õÃaø}ûö©ç¸¼ÎÚÔªU |ðš6mª¬9??}útP/@Œ®áî:3 !|–‡Ó©•b© g­ùž¢g8rŽžkçüñG¬ZµJ­q·ÝLÇÙ$„@À9÷€©J)ˆ€êUwíÚU-AsÄ#C† xê©§9{žeË–jŽŠvÛ¶mÔ)S¼’IT é¹JMJ9„À¿¸O;•ØR2:ç>òb„€L"ܳ^¥TAL€»Çqù™¾U¬5 *·Q;]öm·¦"×B ðȰ|àÕ©”(È p§8j£S©ÎÖpÓ_’·Í£Ü !vÒsO;C‰AøÎ[sYš­¡p§F»õNs¶~ä^ÿ' =wÿ¯C)HF€KÈlww£`§âšöd¸ÄBîW¥R !p—À“O>™lhžvb„€|2,øu,% R{öìIrX ·…å‘«<ÔEŒM@zî]¿Rº &À½Ùy.: ×¶?øàƒ"؃øy¢îÁUßRÚ #@ÍxjÏs»YjЋB 8ÈÁ1ÁQÏ^+%ÏòÞ±c‡×Òö„säÈ¡ŽbÍœ93x,+OvãÍ›7eFï ÊTE¸eµ{®Ð½{÷•¸8,,Æó(ÜË–- ÔÂÍmøãy<¤gÍš5jÏ|ϧ.)#yãc­{°Ì¥K—Æý÷ßœ9sz0UIÊš·¢å†6ö6µ±ö'׿ p_¼x±y HÌBÀ†€w r+€íÑ«V>)É ˆB]r&b#„€BÀ¯ ˆp÷ëê“Ì ! „€HN@„{r&b#„€BÀ¯ Èœ»_W_àeþwÞATT”¥`EŠAýúõÑ A‹] _,\¸‰‰‰èÒ¥KšŠ9þ|ìÞ½C‡…õœ;»¾þúk³7Í'Ÿ|‚Úµk«ºµÍǻヒ˗/[¬¹£7à©Q£†ÅÎ]|ð:`‡ÇàŠD@zîT›P–Y³fáàÁƒjéÏߺu«z±0 PB¨óÔ7nÜh·,üðCåÆá^ë-Xoܸ¼yóªF=´hÑÆ SÃÅÅ‹Wëóãg|<¯Ð0ìÿþ÷?u¬*Ý;uê„‹/*·)S¦ gÏžªÂuþ… VB‰ŽŒãÂ… èÞ½;æÎ«üÛþaïšG¶V®\œ–˜6mšòÂ8_~ùe‹w6*¸A£õÓMš4Á#<‚×^{Íá¨ÇŠ+À<²ì<"öÍ7ß´ltÓ®];Lš4I 4,W×®]ñøã£dÉ’jßú~øôÇ{n”Ãݬ^½Z±dý1 Æ‘Zéî°ÇMJqÛæ› r¨Y³¦ÊçC=6°hÚ´iƒo¾ùF]“Ÿ‘{î¹åÊ•Su®¢ð™cã‚õÁú|XÙÏž=?ýô“º=vì˜~~æ™gÀëS§Náé§ŸVBéìÙ³ÊóÎtã šQ7ì±²'Æo^³‘À^âßÿ­ÂP˜rùøñã`/ðÇT~)¨Î;‡?þø'Nœ@¡B…Tºtd:¸2ôÃÞæÄ‰•pâ4CÀ9qëÑ é¿V®\ NCœ>}cÆŒÁÀUY;wî¬ÊÍ|ÒlذAÅIåÈ0ü‘#GðÅ_$ó‘ îÈùoúù矰|ùrLŸ>]ùe:Ú'Û‘#Gªr­Zµ :t·f„  K²¦}ÿý÷-ép^ŸBìYnÖ¹1ì‘3 ~Ö¯_¯]là•/_^O)nÛ|ùå—jDâСCà‡£:Ô; ¹uë–e…áæÌ™£ê†þêÕ«§4ôG~¬ÓmÛ¶©i–—Ó ÖÏý‰¾B@„»¯Ô„ä#EìëC¡ìñ²§\°`A†C¸ìQ±7GAÌ${˜4­ZµR=d£CÛ‹ððpU66Øp P§Y´h:vì¨ü9ŠŽ#ãÇLj#,½^Ýï‚ TCƒñÒp„ܬGA8 ÂüçË—OùaÞØsç<÷J'ºs8Ÿ¬õ2R€rnŸåàhíyä,縎p”ƒ6@8¤Î†‘¸­óÍ: .&T.$7rµgXž¤Çi„nݺYòËÆØ /¼ FJØ{ã7ì;!à3dÎÝgªB2’ —Ò°Ý·oß$Þ9ŒÎ![Áê½;Ý{–ö …²­Ñ ´gƒ€C°ºáœ1…+{êìí÷ë×/É3ºp§Ð× ã¡€12ÏÎ0ì[›*Uª¨yk {6j(œ(X)„Ùvf{ì1Õå§tÃrÔ©SG¿UßlHpTD7¶sõlºac«D‰–st>tgyþùg5 ÀkÆ£7Îôð)}5*Éœ»µ_#q[çûùçŸWS&¯¾úªâÈ©Ž00ï¶ÆºÞØ`¡N u85£Ö‰#ýÝ| ož»7éKÚ†ðËÓÌ8LJÃÞ¨m˾Øc§‡r­ ‡™9Äm-|èÎáb[cDéKïÅr¸wÿþýê³k×.|÷Ýw`#ƒÆH<¶ië÷Ì«µaÜ, •㨰nÝ:Õc¿÷Þ{­½:¼fO˜CîÖsâö8Z§e/2£åâð;4™PóóÚŽ”í¥“’«q³žÙ°áü8W)°ÆÑ {ÆQùXçÖóëlHR@ŒðU"Ü}µf‚8_ì}s>˜BŽ MœSæËUJmÛ¶-8¤¬S`qm<‡ÐùáKxÙ²eŠ áG}¤†ðÙ §ðâ|*{íº¢š«¨9dKÍ};S«ž/yÎS»Û‘p°Nƒ=y†sdxzç¿9:Àea$\çMC%9öà9—MAÏ^¬Ã^'õf̘añN®L‡=ljˆs¾ßzE‚ų‹ìérÈžŠi4e ¢ ®ßàbtI¼»÷äÉ“•ÎçÇ©¤ÈiWóÁ)*²áÈÆ&uÄ_& Ãò¾\;Aš7 .~h(©LGMe}3*›±7ÈymÎR¹‰½s©ò3aÂ¥­Î¥L0ì¥q½4O§£ ç‡ß9¿nDÛ«*¡qîY×àp¶®ÍoÏ¿µ‡Ö9GÏaz h[Ãac X6@8ÌÏåZò§¡0ç\07_Ñ•ÂlÃ;º§Ž{Òާá4…u8D͹q]ÞQFí9OFäÃ;™÷êÕKmªct´ÁQZ®ÆÍFu¨«ÁÑ æçÓO?u½]{öüÙ¨ Ö>ÃS€:ÖKíK!à%é´ì]Ua/e@’ l<ϽZëµÅî*1…{ùð¶/Yö¦¹äŒB×ÖP£žë|9§ÅP±‹ÓìrÖ•†ó-[6Ë|µm>ø³ä‡ùmçv?ûì35/®N؆uõžy¡¢ •)üÜi¨Áºg#‹† 1ÎÛ»ÂÊQ~\‰›Zñ¬+Ö;—ü¹jø,qÄ…‚ E.…¤nËcD—€£IÔ¶çT…!à Òs÷eIÃìmÚSŠbbˆö;Ýôùk^§Å°ÍžijŒ.ì…¥ð³U ¤¦àt—¸¹Ë0/1ÃØÖ5òÝe\‰›B¹V­Z©Nššöâž œ";v,š7onH°§:Q (Ò@@„{àIP!àIqà&3Ô=xà<™tЧÅ)êxpjƒú\Ñà Ûø}ŇD¸;D#BÀ·py—¾ÆÝ·rø¹á( ÷ àGŒðÆTmý¡$’G! „€B@á.‚B@# Â=À*TŠ#„€B@„»<B@! Œ€÷«P)ŽB@îò ! „€0"ܬB¥8B@! D¸Ë3 „€B Àˆp° •â! „€á.Ï€B@# Â=À*TŠ#„€B@„»<B@! Œ€÷«P)ŽB@îò ! „€0"ܬB¥8B@! D¸Ë3 „€B Àˆp° •â! „€È „€ð>;wî ""gΜATTbbb>}Ò¶wbb"Ò¥K§> ê›v4´×¯mïSrsä—ahô4ÕÍ¿˜¿œ9s"kÖ¬(^¼8ÂÃÑ!ƒ¼J¬ɵð6ùEz»$ý %ßÿ×ýŒãG÷¡Dá,(Y4 ²‡¥GM®§×,4¡®ýKÐ9íùO“étþW¶'¹&Pú£ÛkÞ[‡³u×ÃÑ £ÐÓd”ÝíÄÝ ÁÙh`Ûê(œ8…ÊÕê¢ió6¨Q£†ò#„€ð.îÞå/©)Í›7cÑ‚/Q,o,:6-êO·@ÆŒ!~IãVT þÜs ˾›ˆßæÃ#Ý{£Zµj~YÉ´"Ü¥&¥~AàêÕ«øì“÷ÛGÑ¿GE”/ß/òR&³fÉ„{ë•VŸ»OáË™£Q¢\Cü¯÷ó M)¨¸ !`¤“z&%"Ñ !8p#‡õEà ‘ÝÿÞ€ì¶õZ»Z1¼?¸ d:ˆ·‡öùsçl½È½ ÂÝ% !púôitx 5žëZí[Vh 2„à©.5Ðýþ\?úMܼy3 Ë+…¾H@†å}±V$OE€=ö& ÁÚ¯{£R¹‚U¶” Ó¤nIÄÆÆ¡é½ °båZ,wû_°ëfÔò×?£t“±F½Ûõ×±uÔ,‡9³gÚuK! ÜO@„»û™JŒB@X¿~BãO¢M³òi&‡ã§®‚›×Ø3ññ É„üS]ë`ÒГxgƒãʵ¨$vú ã>yæš~«¾cãâqÙÿ$ÜôìT GönÄþýûøg! ÜA@„»;(JBÀ†@ll,ÿ0½:W¶qqí–Bû1K«ú0Ô}èª3?®Ø$’ï–îDžÃÞh Ê6¯ÖœÓÃäÐý•¹¿ÏÙ‚ÜÕ‡£xƒÑ(sï8¬ÙrÈâ¶håä¯5•[MToÀžçкç ÜŒŒFÖŠƒqãæ‹W/¸†ÿñö¥ðÝü/\ *þ…€Hî©€&A„€3[¶lA¥ð (Y<3¯)ºsÎ|áòÝ8¶i.ü93ÆwE¾óqôÄeK¸µ[cÓ÷/âøÖ!¨Q¹0zjîì…GÇăÌЬX¿ƒ&,ÇÓžDä¾1˜8¸è5ç/ÞT½õÇ_‡GuÆÍ½cðù„n0v)²„eΝú {¶Ì¸µ,rdOÛšõFµ5»È“8xð %ïr!„€9D¸›ÃUb r×.EÛ{K¤™Â¬ïG·ö5P¨@WÇÖUQ´PNMX°Äýd—:¨^© k~¿tŸšg?yæºÅÓæýŠÎm«¢A­pDÝŽÕ¦ * Lx^,]»ìù/’ =TS…¡Û‚OŸDFmI›»ÍM‹`úUîŽVâBÀ†€,…³"·B ­®_¿Žóg¡RÙVi Ú<û›Ï%m$„ÍsZ[7÷Ö+¥_¢Z…Bêúâ•H‹/ØÓ?yöš68‰ýèX-+Z^“.SëÜîîö±ts§á&7ó–oÕö¬Ivãθ%.! þ# Âý?r%ÜBàèÑ£¨\:W²SÝRy¾ÜY±ÿHR÷ûÎà‘Õ-Ñ)%¸Úwowî;«.ŠÎeqçE¼ÙмA|øN'‹ýÁ£‘?oV|8k3Öm;b±ççç;Þ_%‰;nòäÊ‚Y v®+\¸°;¢”8„€°C@†åí@+!§NBÉ"i›ŸÖÓïp_%|³äo:vQYqîœóèﯪ{ÁÔÙ[pçN,®]¿)_lBó†eP0v‹;/Òõ¢U{@Nó˦ƒ¨Ñn2.\ŠTBœKækî4T®£B]!-ŽL3 &6^ůÝð§TÑl #1B@˜G@zîæ±•˜ƒ”@däu sÏOkÈË÷½ñŠ-'jCçpúüuÌyÿ1È—ÍB—‡Ï©7 ñš]Á|Ùñó—½-núÅ‹=â¯Nkñ¼«æ×#oEãÓÑQ¡ÌÝõ÷SÞ~Ý^ü ìYçΆ÷‡?¤Ñ‚• £„6_¨îHœÜ6DS®K{£%,s:uf½ž7ùBÀýÜór¾$F!à·b¢ï Cv÷ ŠQ˜.ŸýŒZã~õz”šÏœù¿ŸíéíçGtÂés×Q®T>»sÙÔ³Þ{cßl‡Sg¯£b™üIõ+½šà™Çê+íyk ÿÐÐŒ8°n ._½•ÄZ*‡zz²[]ZJX!àœÀo ç~ŇP†„¤3àÓ¸—ðb¹Á#ÃcW­Ýwè<6n? *ßYjÔócÏ„i‚ÜZ°[ûÉ«Íý»ËdI¯ñq¿&¾»ò'ñ@ Â=jQÊ l,Y³´áú~½›Ú¸È­Á@@„{0Ô²”Ñã´]^½jÞ|¾…WÓw–8·Á#„€yÜ31h^þ$f!àw(¸Dx9®6Šuá㘸wá°".]:m»{çÜ­¢÷ûK’IŸ^^=~_‘RŸ& ¿0Ÿ®Éœ?`¯4!A†ÕÉ8:ÝÎQ±BÀ52çî/ñ-œˆ‹‹Ã¦íÇpS[K.&93Ú’½\¥’Û‹î# =w÷±”˜„€B@øé¹ûD5H&‰@† ÀÃ\Ú6¯HÅr[Yf-øÛmqIDB@Ø' =wû\ÄV¤š€(Ô¥ŒNêRæ#®BÀD¸»ƒ¢Ä!¬ˆB ;—¢PgŠX 7áîf `Ï1ö Œð±ÏFl…€»ˆpwI‰GXÙnÃÎ¥w;PÄJ¸‘€w7”¨„€B@øî¾P ’‡€"¸¸„€*“; Ÿ ñ‰sg”—6D¸Û‘[!V™2‡"^v¨sˆQkû 44Ô¡»8!v"ÜÓÎPbIdË–Q·¥gšŠÕÍíèDdÉ’ÅÊF.…€p7îî&*ñ=bÅŠ!âÌ çàÀ±Ó‘ #1B@˜G@„»yl%æ %Pºtiì=zMG±SÿW®EáFP¨P!;®b%„€»ˆpwI‰GüK gΜ(X¸ö¾ LlìØ} 5j5’uî6\äV¸›€ww•ø„€F iËX±é„°°!ðóÆ3hÖ¢µ­Ü !àn"ÜÝMTâÆcßñ8Dœ¼"<þ%°uG2f+ŽòåË ! L& ÂÝdÀ}pȘ1#:vy _.ÜœlJ¯—Ã#ÝŸ¶q‘[! Ì ÂÝ ª§Ð4oÞwBŠc冃AÏã«E»Q¦rST¬(Çàýà šO>Õ;hHÁ…€§ ˆp÷4qI/¨ä͛Ͽ2Í›Ž}‡ÎUÙYØõÛŽ`β³x­ÿPdΜ9èÊ/Þ" ÂÝ[ä%Ý !P¡BüñÇŸxoÖ?A%à­ü}†,ÈÑ¢`Á‚ASßRP!à D¸ûB-Hžwd{±ßHLþê–­=ÐååÁ9³؉_vÄbåªuÈ•+W@—W '|‘€w_¬ÉS@`~ø¨)Øv †NÞ„ƒG/\9¹IM¿±p!¦<Þý> (pe”  Á2)yB wîÜxkÈHlÞ¼“ç~‰by¡]Ó¨^±02f ñËbÞŠŠÁŸ{Naù¦Ó¸˜÷ŠjÕªùeY$ÓB Pˆp”š”rø&Mš aÆøý÷ß±xÝÏøpî:/†RE³"kh:¤×ÆÔÒ§O§ÊtéÊ-äÉ•EÛ²jÛV~'hGÊR?11Qù±¾¦…õ½õµ­›í½î—ß4Œ?V;›>êv råSv·ïÄjy Á-ílœˆÓ·pòümT®Víy5jÔP~äÞ% ÂÝ»ü%õ &‚ ¨Ï;wpüøqœ9sQQQˆ‰¥MÛ·ocø”A`c sçÎÊŽ—]¡õ5ï6!!—I®yoįµpŸ:u*®]»†¡C‡ÞÍSúHpÿü¢Ù²¡~›bG† ò*![1BÀWÈ/ÒWjBòÔBCCÁ9y~¬Í‹/¾¨ù¤I“?~k']—)SFÛ§9"""зo_¥+ !z¢P—zvR˜J`éÒ¥˜;w.Øsö–`g9Î^û¨Q£°gÏSË,‘ !à"ÜÝÃQbn%pñâE¼òÊ+èÙ³'Ú·oïÖ¸SÙk¯½†Úµkã™gžALLLj¢0B@x€w–¤„€Q/¿ü2²fÍŠñãÇ bª?ÎáOŸ>]é°/Fß& ÂÝ·ëGr„æÌ™ƒ+V(aš={vŸ!P²dIL˜0~ø!¶nÝê3ù’Œ!œ€÷äLÄFx•ÖˆW_}5òZ>%üä“O¢mÛ¶xöÙgqóæMGÞÄ^/áîå ä…€N€K×(4¹´lذaºµÏ}SÁïÖ­[ªâs™“ ! ˆp—AxÀš5k¦öÁ`ÇŽøüóÏ‘)S&‡þ¼í@Íý>úHiò/[¶Ìnv¸nŸ»ð‰BÀ;D¸{‡»¤„¸ÝÃ?ŒÝ»w'+=íF­zìU«VMæîk:t@=@Å?jöÛ }jù_½zÕÖIî…€ðî€,Iصk—qìØ±$@¢££Ñ§OÔ©SG͵'qôá*×Q£ŸKöl ËÈ]ôd]¼-¹ž! ÂÝ3œ%!`é±s›YkÃ¥e'NœÀgŸ}¦¶wµvóåkjò3ÏË—/5ü­^F{£ÖþäZsˆp7‡«Ä*’à|:.øxÍ%e_|ñFŽ .5ó7Ó¸qcôêÕKí`GMÝ9rD]JÏ]'"ßBÀ³D¸{–·¤¤8D½ÿ~Uú£Gªo.%£v|Ó¦MÕÎoþŠfâĉ(R¤ž{î9Ëa5zÿøã-–ä[ø5î~]}’y!Àž,çÖiô^-׳sI5ÏýÙP³ŸþäÜà†KúΟ?¯ŠtøðaÄÅÅùsñ$ïBÀ/ È©p~Ym’i#`=<}úôiè‡ÂÌŸ??É¡0§NRCõ—.]O„ó5à #+VTçÑçÍ›We‘þúá2<Ù.>>^ÙS°sæ ¢¢¢,ÛÖqpž›ŠlüpN˜ßúÜ·õ5ÃXß[_ÛºÙÞë~ùMÃø¹Å,—ÁuéÒmÚ´ÁÉ“'•€go·xñâêüv½g¯ùá[þ,ÿرc±páB¬\¹«W¯FImÙíùñ$½.t¬|>ræÌ©½ þzÙä[èD¸ë$äÛïP1Ǩ®Û°Ç"ö£H±l(žY²… }†DË!,ºP§@aï™÷‰éî zGÂþt¥0ëkB¢°ÐÃñÞÚ]¿Ö ý=ù\mdËÖ¹ódE<~EL\4.E…àôåD¬ÝtgOE¢j•:hÞ¬5jÔ¨Á(ýÂ8åŸ)=º>ŽÆ­ºiS!ˆÙìþ¬Öƒ^'1!Áß/ɤ׈p÷zI8-6oÞŒ?ÎA‰hÞ®4ž¯ÚAëûîò±”Êu+»þ>‹§àÛïs¡û£O£Zµj)ñº›ð÷zH„@ŠD¸§ˆG}—•}:m ¢Nà/UG™r}-‹.ç'KÖÌhиœúìúë8fͲáõðôÓÏ!44ÔåøÌ üͤ+q ÷…:÷±”˜L&pàÀ¼ýNT®‹ÃïÁn‹¬z­p ß¡¹#0løë8w¯Ý ¯¡—„…€ËD¸»ŒLxƒ[iß¾ ý_y´jWÕYðXšœŸ~¤G]´íRcƽ ëm#ü½]’¾p€ Ë»ÆK|{{Œ“?Žï—¿‚r {!ÞI²~£2ˆ‹Ã½MbåŠ5(XÐ;SÂß»ü½óôIªþN@zîþ^ƒžÿË—/cê§ãð|ÿú^ì—/Ebø€ï´³Øc½Bºq³ :¶=&Oc9Þ“þÞåïɺ–´‹€÷ÀªÏ€* —/}üéd´~¨8ÊU0g×Û¢~å!¹ÅÄÄ‚Jn wwqèÑD‡¶j |Õô˜=g¦‰©$Zøßeâ-þÉkDl„€q"ܳŸ&°~ý: ÃY´¸¿’[Ræºõ ç®'‰+66W¯ÜJb§ßܸ~…‹äÆ¢Õ´}à3éÖê;>>ׯE%±ÓonߎÑ/Ýöݹ{mì?´û÷ïw[œÎ"þÿòÿÿR—+!à:î®3“ À£BXôºõ¨é–Ô&]Šú•† IÍ·Q«Ì@ü¶õ0öÿsÝü‘7ï L¾WpóÆmtn3 N\ŽuGâíßáDÄ%T(Ü·"µðŽ^D¹‚¯á‹iëPµÄ¨\ìut¼o¢ ÇLž>uZMDù‚}ѨÚ0Œ±H¹»£\Ãÿ`·ŠøæÛ/ÝÓ8„RDžæŸ4u¹®áî:3 á[¶lAéò¡(ž/Í©Q(Ïøx-ÖlŽNNBï[bÌÐ…¨X¥(æ/y Ù²‡âÈ¥=Gbcâ0}ê<Õ§)†Žê¬†ãoÞ¸cÉíÈhü¶å0v‡Ÿ7¾…cG/`Õ²]ÊýÕg¾ÔvÈË«Òø`F/,^ð®\Ž´„MëEÝep+ú4<˜Ö¨œ†þÉy’òÔÅF¸F@„»k¼Ä·‡¬Û° ÍZ•qKjœ;æ.pófmÂMAî¥þ­5Íû~ãîØ¥z=Ûyóg·ëgؘÎàÆ35î GÝúepèà9Õkß¶é ÞÑ 9r†‚àáGëÙ ŸËæ­Ã±ný/i‰ÂPXáo“§øÛO]l…€q"ܳŸ"Àó¿Ïž‹Ð´ãÝ£DWªL°'ýÓ;P«ì@´¬7 kVîqXšJU‹:t£ƒµÐ ˨zû§O^ÑöOO¢År[ÂÞS§”åÚ]ÜäæïÛ’ìm﮸õx„¿N"ù·'ø'OUl„€ëD¸»ÎLB˜LàèÑ£([1¯åà—´&wþìuÔkTË7 Â`Ï|à«_#µŠoéÓß=ñÍ:_yòfC\\‚š—×í#Ž]Ô/ÝöÍÃg²dOgêÎuÂßquy‚¿ãÔÅE' ÂÝ8+ñé!§NBÑYÝ–—²õêö‰ÒŠg¯»e›ªHÔ4çi2eÊ zÞwî¤m{ÉÒùÁÏ m¾žSgN_U×n+„UDÅKä™e„ÊdÍæŸrêâ*ŒánŒ“øò ÈÈË’Ñm)R˜s)[ÍÒo¢m“±x®çt57N»ÊÕŠ¡hñ<¨Qj€ÒšOm¢Ü2vÚœ>ضùª•€›O@›ö59Ô}åÐó–9K:uf½~ïîoáŸ2Q³ù§œº¸ cdûYcœÄ— ÄÄÜFÖ÷µ;C´¸­~‡žG´ÖC¯R½˜ålïPMønÞ9RiµSk~ɺIJÊÞø™[Ó”]Öl¡–kÝÓdzzë—È™+ «¶цçãUcbެ͸|Éýû‡hÓÑÑÑ–tÝ}!üS&j6ÿ”SW!`Œ€wcœÄ— „dÈ€ônîÌzºtéRÜåŽsæi5C^ÿ¥´ÆÀ ýZãÐ…søäýUè;°]Z£Mž£!!æ]/ü“!Oba6ÿ$‰ÉH%î©'Á„€-‘ïvÔ ˵lÞCþÙñô -Ð퉆¶ÞäÞ$Âß$°­_áî—Õø™æÚt3¥Ëćڒ;O³ù˜¿Œ‰¿|$Îà"ྉÍàâ&¥5‘€,þ'ÛM$’4jò1Sø ÿ¤¼mïÌæo›žÜ ÔážjÆTœOgg-¹©‰úQää“>½y?]áŸòÃ`6ÿ”SW!`Œ€yocé‹/!Œ€êyñˆÕdò1 òá wfáŸ2Y³ù§œº¸ cdÎÝ'ñåAqqqÚá,‡©Ä&&9ÛQæ-ƒcjÂ?9sk³ù[§%×B µ¤çžZrN! „€ž»VL0g+ƒ¶Î½~ãrhѺJ0cpXöoçlwèæáŸ2E³ù§œº¸ c¤çnŒ“øò QèJ¶Ù ]Âß»üSN]\…€1"Üq_$ ])Ã6[¡Kø{—Ê©‹«0F@„»1Nâ˃ØsDòSU=˜ßNJõ¬ÉÈ$#üSk6ÿ”SW!`Œ€wcœÄ—‡ (ãá4ý)9³ù˜¿?±¶—WácŠØùî¾T’! „€n ÂÝ % ÷ˆ×Ö¹ÇkÇ¦Š±O€GÊr-ºYFø§LÖlþ)§.®BÀîÆ8‰/È”) ñ²CCâdêÐ=­Â?e‚fóO9uqƈp7ÆI|y@¶l9p;*Öƒ)úWRÑQ‰È’%‹i™þ)£5›Ê©‹«0F@„»1Nâ˃Š+†Ó'ny0ŤI0@IDAT9}ýžŸ†U‡âáÖïaÕÏ»’zðòÝÉ×AFfoó·-—æMŸºª CÕoàå§¿Àù³×m½yìÞlþ+ˆ$Ðd‡º€®^ÿ,\éÒ¥qxúeu8Š™§ŸÙ£sõÊ-÷‡1õ‹§ÑùÑzö‚xÔŽù‹º™ˆB… ™–®7ùÛ+Ô»£~‡W ñß©šŸ~ø¿ÿzëw¼°°Lö‚˜fç þ¦e^"*ÒsªêöÂæÌ™… •Ä¡ýç<žá¹_lÒ{¤ìL\ë4*3vøw/¼üw×_ÇQ³FC˜¹Ë›ümñÞ¹‹OÞ_eìt‹KÀé“WðÓ‚?l½›~ï þ¦B "܃¢šý¯-šµÇ†ÕG<žñˆ£‘ Kt«ÔÏœºjê1«VI¥x¹~Õq´h~Š~Üáè-þ¶y¿|é&bc’¯œ IS'®Øz7ýÞSüM/ˆ$ðD¸|ûg7nŒ£ïàäñK-@hXÆd›ã±—^*<=E`[pEgÍ\åË—·urû½·øÛ¤Pá\È™+ÌÖ±±ñ¸s;&™½™žäof9$îà Â=8êÙïJ™1cFtéÔßÏýÛ#yçðïÈÁ?`Ö´õÈ’52Üýi¤OÏm^ñöø®ɇ£D(Ì–|¿=ÚË‘·Ú{š¿£Ì³‡>jâ£Ê9}ÈÝ-wY'eÊÄÇÚpýÓ~Šsg¯9 î6{Oów[Æ%¢ % Â=h«Þ÷ Þ¼y m‚µ0Öý²ÏÔÌþõÇ1´n4œoŸ8µ¶î…§_hê÷”ÀýTÇ‚åýѶCMSóà,ò…ów b¹Æ¨X±¢3¯ns÷gîúxü°¢?:u­‹ûÚTÅðq]±æ·aønY_ìûç4šÝ3BÕµêÍ2ÞàoVY$Þà ÚòÁQÏ~YJ‡¿ôBŒõ:òäÍ‚÷„»µÑѱ˜4f©RØjÒ¼"¾^ü*ŠÏ£Ò1¾›[ÓJKd¿n>„ƒ{0rDï´DãrX³ù»’¡†÷–?Ö†u¶ö÷áxoô¼õÚ×XøívÕ8+S® µ·4_{‹š3.5é¹uõû~áóæÍ‹—_„.mÞ×´çϺ-ÃÔznÓx,¾Ð†áÇMéŽo–¼fìnKÄ mÝx‹¾9†þ}‡ sæÌnˆÑµ(ÌâïZ.ûæR¸acºàçƒpóÆm´ª?J5ÖâãrÁÅÛü]ȪxIˆpO‚Cn|‘@… ðÇbƇ;Ò,àcbâ0aäb´o6ùògǺ߇¡g料Xl,_²o¾üF¿3 º·7êJÝÉß•t]ñ[½V ,ß4ýµÇ»#ÂC-ßÅ¡i[Jé+ü]á ~…€N@„»NB¾}šwM{íå·1ëã=X½|Oªòºûïh§mP3ý£59ñ|ÿs?Ï—ª¸Ì ÄÍs¾›û;¶¯Äª•k‘+W.3“3·;øJ( ž2dÁ«Úaå–Á`ϽuÃÑ©êÅû"ÿ4`‘ AJ@„{V¼?›=ÈwÞžŒ½;2bâÈ_päÐyCÅ ¦ó{c–h½õñÈ‘3 k·ÃÿžknêF0†2fǧ F¾µw®–Ĩ‘“P @;¾¼c•ZþžÎm…ÊE°lÃ[ª?áÅèxßDýx_æïiŽ’žH§i˜š§bêßl$÷n лwo¼óÎ;à®gî4›7oÆ‚ç @áD4o]•ªCÆŒ!É’Ø·ç4^í3 Gµ†À ‘£·¦oæînÉ2`À"êV4vi£ VE >&º?ú4ªU«f ¤÷¼åï½ÞMùÀÞ3xíÙ/ÁoÖŸ—Z&«Oð?pà/^ŒQ£Fy‰¤$D¸IE{«˜f w–'>>¿ÿþ;ÖmXŽcûQ¸h6/™¡Y8 •ˆÕ+v«-J¹ {êù æÔ^ìP/÷mŸr^ëM[ëkÆm}o}mëf{¯ûå7 ãׯïÚ@Û|%éÒ‡àNTNĹӑ¨Z¥š7k5jèÞ|þ;%þéµ*¸»GÀÅÐY°qåIþ‰‰ øyñßX¶èO”­P?Õyòåð(îÿ=rå²Î3œ%„„„ AƒêsçÎ?~gΜÁ±cÇðñÇãèÑ£èÒ¥+Ú·oúMHH@útéÕ>å°J§ýÓ®¬¯™UúKЄÍ{ßS m={öT÷)ùÕÃÑ ãWi2½¥|B|$rfˉl²¡U“b×6Íñ¿Ÿ¢#þQQQÚr±H¯ýÓ(®ñô ­¥Ñ­SsÔ­O>ùãG,ÅÓO?¶mÛú5Wþüïâ  bÜBCCÁ9á-[¶`ðàÁàÉf›6mBÕªUÓ fÆŒ(Q¢:uê”æ¸5?ëÀÝÆüŸ}öY >\5þØ|ÿý÷ý²aånÆ_à…ºÀ«Ó ,ÑÙ³gѹsgôïßÏ?ÿ<Ö¯_ïÁ”0¸Ðaaa˜8q"-Z„_ýUúlܸ1€K,E V"܃µæ¨Ü ,@ýúõÕ0üÊ•+1bÄdÊäÙs¾gP¥eË–J¸×«W>ø RúŒ‹‹ вK!ƒƒ€÷à¨ç€,å•+WðÔSO©ùÓ®]»bëÖ­JÈda¥Pn';wnÌ;S¦LQsñmÚ´ADD„ÛÓ‘…€7ˆp÷uI3ÍØCgoý·ß~Ã?þˆÉ“'#K–,iŽW">ÿûßÿÀ¡y*ò¨Ûï¿ÿ>ø H‰Ž€÷€«ÒÀ.Pdd$^yåtëÖ Íš5SC«÷Ýw_`ZJg:*ROãñÇ—o¾ôÒK¸}û¶ééJBÀ,"ÜÍ"+ñºÀöíÛUÏjÉ’%øê«¯ðùçŸûÄÖ¬n/¨Dè<˜‡ÊvóçÏŸ1ÎË>|Ø+y‘D…@Z ˆpO+A o:*:;­[·F™2eTo½cÇŽ¦§+ 'î‹Àe”TÊlÚ´©šö NRj& ÂÝŸk/òΞÓý÷߯”ž&L˜€… ¢P¡BAPr)¢7 pc¡_~ùÝ»wWJ› @LLŒ7³$i —ˆpw —xö$Y³f¡I“&`Ï=©çž{ΓÉKZAN€=÷I“&Ïá¼yó@múÓ§O9)¾¿áî/5Dù¼xñ"}ôQôíÛW ôµkתÝç‚Õ‡téÒE)ÛݼyS Óo۶͇r'Yö ˆp·ÏEl½D`ùòåj‰Û?ÿü^óD¹Œ3z)7’¬¸K |ùòX·n¸é çä¹%®!àËD¸ûríQ޸Ƙ=uöØ[µj¥6¤iÔ¨Q¢ú:ìÙ³ã믿ƛo¾‰×_]-—‹ŽŽöõlKþ‚”€¤ïKÅÞ±cúôéƒË—/cöìÙxøá‡}){’!`!ÀÓíÞzë-u4ï3Ï<ƒ}ûö©¥s ´ø‘ !à ¤çî µ¤yà¬ï½÷žê©+V œËÁ¤ƒŸ»]»vj˜þÚµkhÞ¼9öìÙãg%ì:î^Ã>Z>jsîrܸq5j/^Œ"EŠøhn%[B 9ÎïY³¥J•R{0pKd1BÀWˆp÷•š¢|üôÓOà|ú… Tïçå—_‡;Å#ÀÃgØ0íÔ©“Ò™6mš¿Aò D¸hÅúb±¨4Ç}á{ôè‡zH­]¯^½º/fUò$ àjŽO>ùÇWÊvo¼ñ8å$Fx“€(Ôy“~¥½sçNu4ë¥K—Ô1›îb„@ èß¿¿Ú™ŠvçÎÃÌ™3ÁýêÅož»7¨Qš‰‰‰˜>}º:„ƒÅÉŠ+pðàA<ðÀJ·ä?W¹ž! ÂÝ3œƒ.•eË–óéì¹üøãàoÞ¼Ê?)¶n¶÷z<ü¦ÑÓT7ÿþaþræÌ‰¬Y³¢xñâà d2ø÷OQø[×ðÝë’%K*ϽxèQ×®]“{!`tÚËçîÛͤ$Úà!ÀaHn{ôèQ|úé§xüñÇÑ»woµ?<…™»M||<~ÿýw¬Û°Ç"ö£H±l(žY²…h‚=Ñ"ÜuKNÏ{ÝNüu¡¬ç‘þtgëkºñk-Üõ4u»¨[ÑH—>Ñ·qêøMœ=‰ªUê y³Öjç3=¾þ­ó_±v9öÙì²"{ál Ñ iÿÓÿ»¼‘¯6¤´ÆíeÅKeØÒ¯iAôo{­î øý·m¥âÔÓdhbnÇ D㟓ˆ›ç"yþjW¯ƒÖ-ÌáÏnÚ¶m‹“'OâÏ?ÿDÙ²eU>ä0“€w3éQÜ_}õ^|ñET¬Xß~û-J—.­Jo–pß¼y3ü8 '¢yëÒ¨Tµ˜vÀŒ&TüÐPØïúû6¬Š@|L.tôiT«VͧKBþs¾› äJ@éF¥P¬|Q„ø)ÿè¨hœØwǶ@®t¹ñôîçÏ-–ÙØeCÊv"à}úñˆÌ‰pˆjô^!8§ÈMh¾üòKôë×ãÇÏÁÖ»…ûÕ«Wñé´)ˆN8ÎÝ«£L¹ÀÚÓ{×_DZ`Þ” ¯§-|¡¡¡:JŸø&ÿ)OÁÉÈã¨Þ¾ – ,þÇÿ9ÝËö¢^…úxî÷ñ?pà€jônذgÏžU«F8%#F˜E@4œÌ"ñîÚµ uêÔÁ’%KÔgòäÉI»»ðùö;ýQ¹v, ¿?à;yU¯ŽáãÛ"4w† ]­—v7ÇÔÆGþý‡öG\©;¸ÿ¥–'ØÉ%¼J ´ë?ާ;Š×»—?j\=’+W.5Lφ’!`îf‘ ðx¹ÍfýúõQ @pƒš:˜Zâ»{Ñ·Á£ÿ+Víªšš–·#Ï!ô¨‹¶] a̸·póæMog äßæÖ(ß¡4ª6­âõü˜™݇j£PÓ|xk¤{ùS°s™ëôÁÅ3ˆp7ƒjÇyýúutëÖMeM­øµkך¾v=Æ‘cúãû寠Æ=áL7iÑê7*ƒÝÂqoÓ†8þ|RGÞ©ûð~xuæK(Y5xø—­]%[CÃ& ÜÊŸ{=ðÛ½{w‹â¦«T’ "܃ ’ÝUÄß~û 5kÖÄ–-[°zõjŒ9!!æ*±ñŒ÷©ŸŽÃóýë£\ÅÂî*Šáx._ŠÄðß!::Öpwzlܬ†ŽmÉSÆhyˆvgÔ†â"ÿñŒCƒ'ë p™B†Â˜íé≋øá½»ËÍN«Býòèпƾç^þ•*UPZ¾|9†jv1$þ $ Â=+ÝÕ"s¹Ï]¿÷Þ{•6<‡á[´háj4.ûgº:­*ŽrÌ,;¶EýÊCæ-&&TrKøwY–C&:´íP嫦Çì93ML%yÔä?yê$»· •6‡òTÛ\¿tÛ~ÚîÜ£›|ÔhYéK3g»—ãÆÕ3<öxÁ‚nÊ­D#îá.OBŠxÐ Ï]çö±£GÆÏ?ÿŒüùó§Æ]Žëׯ2œE‹û+¹%J®[¿pîz’¸bcãqõÊ­$vúÍë·Q¸Hn,Z=aaÿ­ {||®_‹Ò½&ù¾­­£v·éܽ6öÚ‚ýû÷»;j‡ñ­ÓøŸ‹9‹ÊM*:ôãÈ!AãuÃ>Gatûø¸xÄÜùa¬ÖÀâr5{ævämܾyÛžR DZÚh ?FLíöµ°u÷f·óúé§ÕW¯^½°{÷n#Y?BÀî†0§'¿sw¹½{÷ªãYß|óMµ‹'hÄÆÆâ‡E_¡[šnInòØ¥¨_išÔ|µÊ Äo[cÿ?§ÑýÁyóÊä{7oÜFç6“ðáÄåhQw$ÞøND\B…Â}q+RÛïèE”+ø¾˜¶UK¼ÊÅ^GÇû&ªpÌäéSWЩÕD”/ت Ãø‹”»; À5üv«ˆo¾ýÒÑ9ƒü¿ú~j>hüH^—¿Z÷u¬›·¯7ˆþâÝ“AL³lÚ L{m†%mÚ¿Xó5\= Ëë•3Á€¦ƒUØ…“cÑ”ŸÐ¯Á›x­þ˜?æ;KØ„¸Ì6oÜ;} À§¯ÎÀm¿Æ;ãYè[oÞh:ô™Š—ï*%^»pM¥³eá6¼Ùbl?d‰3¥ ®á¯xy|ùõ¬”¼¥Êíý÷ßGíÚµÕ™ðrÐLªJ ;D¸ÛìVŽ8q"š7o®„û_ý… x ¥Ë‡¢xx¾4§K¡<ããµX³}8þ99 ½_l‰1C¢b•¢˜¿ä5dËŠ#—>BöaZo/Ó§®ÁS}šbè¨Îj8þæ;–<ÜŠŒÆo[cÇÁqøyã[8vôV-Û¥Ü_}æKm‡¼¼*fôÂâàÊåHKØ´^ÔmP·¢O«IÒ—³ðäV,3òÍëÌkwö°í8ŒñkFã­oÞÀMhï\w·GÊÞ<{哨€h#'úÖt¼>}è F.†'Þ~L úSÏ`ì/#ñêg/bý×yõ.Ï[×o©†æ„u£1à«~8©mB³ê‹_TÔßÿ×/^Ç;K‡âý­ï"gþœ˜9à®PÖm•&…û3ïöB…zå,ÙqvQ¦Viœ¾qÊíüyü÷ßîñ /8ˆ¸ CD¸Â<ž¸ö–ÇVâ‚%Ív϶F¶\ÙPöž2¨Ó®6ölÞ«†Ù·-ú ­žj‰ìy²«ÆD‹'šaÿo“ ß?Üï!TiR3g´Ägä¢dÃøeí*#^]òÃ%¥³gÏÆüùó1gΗŠg!`€w{T‚ÔŽÚð†gO[dr©›¾º'‘p¹ÝÙsšv|!·$[ªL°'ýÓ;P«ì@´¬7 kVîqw¥ªEºÑÁZ臆eT½ýÓ'¯h‡¿¤GÑbÿ5„î©S*ÅxRãÈMnþÞ¹Mëìj]P“ ùGœ‰Ð”èR·û\ö<Ù,9ËšQë)ÇYî­/âìØçÈ—Cy¡ §)n¥ß¡í ¯ï÷ÏÞx¾bÿê+_‘W"qùôeÅæë‘ßbx‡QêóÉ+Ó‘«`.DYÍÍ-WDÅïêŸðÊ%°íÏ_MáߦMµËãK/½„Ç»š5ñ/’ð’EnÒB€§¸ñXÖ–-[‚ûÄçË÷ß‹3-ñ¦&,ž)[1¯åà—ÔÄaæüÙë¨×¨,:u«‹Ëoâ«™›0ðÕ¯5E½ÔmÆ’^?Å*‘Õ)°‘°ú«u*<û_«w¢îu@á[öžÒØøífMÁîŽÒº_ôÁO˜=t®ÛF¡rÎažËÀayž÷ᇦšÒsâgàŸþQgLs£îy}ß}÷ùÈÈËãÚ\hJ§0Ÿ:i%j–~S;=®¨ZÂÆ¹q.o«\­Šσ¥hJrãSŠ&E7n;mN¼öì—¨Vr€¶x´ït¶jóðî6™³¤SgÖ»;^=¾‘בANw·©zoeüòåŒxh 8üÞ¤K£T \öÒn?¨âãp|ÝöµU|Ìó“£{àSm(~`‹¡H’NS ̇§'<å¶â¤Ï”ÞTþU«VUKO¹¹ õ_J•rÿôŽÛ`HD>K@N…óÙª17cóæÍÃsÏ=§vœã­ÜÓ “šSáfÏþ¹‹U=lwå‰sÔ‡žG´ÖC¯R½X2¡B­v­§Å׆á‹Ë£ ÏÇ«†Ã¼Y›±uã|<«wZ¢MöëY¿¢d¡hݺu27wX|>ësË|UïMÝ´…³<\9{U)ÉeÐFMÒj¸ŒŽ{ÁSéÎÚpnžŠ|ìáÕæãÝ©;òëÂíh_é!—øs _*§Ž5Ê:›¯cbbpÏ=÷€S/¿üb¾¥ÃŒˆƒßay¿­ºÔeœ/ ž»Þ£G<ûì³JqÎ,ÁžºB{YgÐz\î}4ùrç.wUk·û¢O«`gY‡¼þ-FZ †ÿwýuŸ¼¿ Í[UN-‡á8J`æ¶¿ÈßĹ^öºÝ!Ø (·¦(g+ØiÏü)[Å*µ[ßô“ZÃgÓLþ̇ç?ÿüsuvu`ÄW ¸÷ êjêâߣ8—Ú´iSÌ;WmwÉ#Zù"ã#ßí†ëÚ®vZ½‡A}¿ÆÓ/´@·'º'r‰%èpo‰>}ú`àÀ nŒ!à y³»BËýòô6*ÎqëØßÿ*TðéÒ˜¹Ôˬ‚—.[jKî}:žyæ?Éyòlr²~ãrhÑÚœMT’§è_6ßÎÙnj†ÉŸû²sG91É Äßþoü䮿Ù4nÜíÛ·Ç!C\Ú@ǼI̾L@zî¾\;ó¶wï^Ô­[;wîÄÆýZ°³È¢P—rÅ‹B]Ê|Lwõ°Buy¸4nÇŽX²d‰µµ\ dD¸'Câ_?ýô¸Ùσþã?P¿~}ÿ*€ÜŠB(VV¢Pg×V¨³.bÍš5Ñ¡Cpˆ^ŒH‰€÷”èø°_ðܧºS§Njs*Ù*TȇslsæLuT+—ÂðȬY³úIÎ]Ïf¦Laˆ—ê‚#›ÐÐP‡îiuÓâNˆõ¼p?¶+K?ù‡v$ßC}÷†=øcù¼½xˆ:æuû²?0½ÿ瘸a2gÉœÖ"»>QkwšÉßhfú÷ï¯6«:~ü8ÂÃÃAB@zî>^ÑñññèׯŸZÞöæ›oâ‡~hÁÎêÈ–-nGÅúxÍx/{ÑQ‰È’%‹iÈ‘-'âîxžXö0Ô¼¯Zöhž¬l­Þ‰Z­k*ÁNÇZ­jhCó1Ø»u_2¿f[$Ä$˜Êßhþyä.\}ô‘Ñ â/ˆˆp÷áʾ~ýºÚ´â³Ï>Ãüùó•v¼7y<…ªX±b8}â–§’ó»tNž¸22Ë0î[ço›½Ãx •*ˆ{»5Æ=÷×Hæç|Äy)SØbŸ1sFä)œ—O_±ØyêâÆÙ¦ò7Zn6D›/¾øQQQFƒ‰¿ ! ÂÝG+úرchÔ¨vïÞ­6¦áYìÁbJ—.Ãû/{ôp[¶×¯Eap¿ù¨Wi0ZÔ‰/¦­óØ1Ÿ¶y±¾¿zå¢n&šºì‘ü/E\ñ*ë2óúò™+Íšt*"WÁ\ˆ‹1O÷À6¼¿uí´v¯,;íÓ§ìóæÍ³—]± b"Ü}°ò·lÙ¢6£Éœ93¶oߎ:uêø`.ÍËRΜ9Q¸PIÚμDRˆ™ kÛLÂÜ/6áÔ‰+8°÷ †½ñÆXœB(Ï8íúë8jÖhhê:kò/Y¤$Î=ï™BH%,[®]¼žÄçí›·Q¸ì½ù$Ž&Ýß{ ïi`*W²ÎóÞÙðç’X1BÀš€wk>pÍø}÷ݧzíÔŽ/Z´¨äÊóYhѬ=6¬N®X剜¬úyöí9­iDÿ§TÆMƒ>y"oz÷¤´õ«Ž£EóûMÇÐþ¾ö8²í¨ééM @x\jβ'AÑr¬'t’Üp]yeâš„—¡JÕrΪýÄsöùòå•òJ$¼*ܳa¶RàªÖÆËÌ™3åõ×_—®]»f+½TŠ\¯^}‘ßÊÈ¢ù‰=îTR§îyÎë˜ÿv÷„BßA­ä”SrÆÍïôÉ+¥Ê¹WJ•*UÖÄõüO?¹Œl\º)ay’Ñ™UÏ”g7{õåå–ÛêØ1.áæÌ^+÷u{U8RN;í´¸äa“(ø¯Z¹J>š´*­üšëdÚ 2rHÎâoÓF„ᶸªU«§6¶q4\ê" Â=ÁmËžX³fͤU«Vòæ›oJ‘"E\f‡×´ÝÈØ§×ËÛsÖǵ³_ýH~9xXÚÞ\;®ù„Kc¾©WÈòÅdÞÜ…R´hÑpAöüÜ;P>~åY¿dCÂò͉Œ¸´hŬ•r`ÝAY8QRào‹CçÎ7Ë_~ÉÙ#›¶åÕpñC@…{ü°=!åGyÄXÅã+þÅ_,’•ì`9pÀpÙ¸ò$ytÐ|Ùº9>NVp^Ó´ÅÅR¢TaûÂÅ($NjõyK~ÙWQ&¥K—ŽQÊÙOü‡?4\ònÏ/óž^(¸„M5ú|ÃN™3|¾TȨ$Æ$þ6XwèÐA~úé'™1c†Mp “Âè­p h\ ôêÕKFŒ!#GŽ”îÝ»' ×ÔÌ¢X±bÒ¯ï@c€8öéñRºÌF©×¨’œayg²tâÙt¯(lÚ°[V.ß.½´ô5êð?ÿtHÖ­Ù)ïÌÛ!G~-*oé“´6à?ðþcøŸú¢l,ºI*]q–”¯\NòÄÿ¨AÌFDî†ßùɲÝqPS4W1és{ߤÅ?R5Ù¾iÚ´©Œ;V° WJ_T¸Ç¹í¹÷¹K—.FU†÷9p±¼N:R»vmc<´hÎ7êu)S®œQ±°ä/Û9Æ&Dz¹9:s,Çm(¹¿éæ;Ï žó}Ê„eRê´"²ïû2{úÊLïÌ€°¡~»éð ¹yûuì?*ÿ\¹óÈ/?•]Ÿ¯v /¸TZ·¼[.ºè¢À Iû=ÿ·ÎqÎà¿%…J"e Kî|€ çÌì\¿c}컃ÐïAÌýΣÀß߃ßÿvÃò ¹ùûżÛåqð?z(Cöµ_~Úû³Ô¬~©Ü}Ó=¾ÁÿÚœø­S§NÒ¦MÙµkWR\psb õI"PáG”Ù÷b-Z´HfÏž­GÝbŒ5çz1"⬹×úË/¿4i>|Ø‘/ÇvМžqTrçÊ-Ž`7ÏÂ'äˆÇqÍo²âý—¥Q£FR0W½ã§ç¨×%ºñxøÞýNˆp&ÏßËÀ³£Gȩεª…J’†uÊ›»¸95á7Šˆ?3,‡ ÖfBåàï<ã·ûŒOˆöq¿ó›pGÃ<ð»mX÷¨iºyºÏpðwüç*TÈ?îB÷#þ`аé)^¼¸Œ?^úõë*ˆ>KüÇQ|Ò(û÷ï—-ZÈÚµkåí·ß6È'E÷e1óçÏ/ì ó-Í;Wh·HÅŠ£M&-ãÅÿ´.•>ù䓆pܸq*Ü〯_’<6µöKi}RÎï¿ÿÞ\þ²iÓ&yçwT°û¤ÝpßY«V-ì>i/-fx°šß¼y³,[¶,| }“Ò¨pqó~ýõ×R·n]Ù»w¯9îÎib pœ’ÃÂø7Þ0^¾â”…&«$ .’÷°zWJOT¸Ç°ÝwïÞmû¡C‡Œ`?çœsb˜º&OðëÏ>øPRR ë¦L™"L…êh<" ÂÝ#`á‚cÌuõÕW›ËPÅŸqÆá‚êó$D•|Æ w«JŠ@* ÀõÑ?ÿü³žyO…ÆŒ¢*Ü£-8 ‚½^½zÆúvñâÅR¦L™à ú;‰øî»ïdáÂ…Ò¶mÛ$.¥Mð†Ü3ïÞbjèT@@…{6[qÇŽF°s´QªT©l¦¨Ñ{í…‚*)©„Àm·Ýfø7P*¥*ܳÑÞ Vìøþ^°`ªt³eNF5k–9ÝP°`Áœ,†æ­Äk¯½VJ–,©†u1G6ùTáeá,åÏþ³q†Á9vݫȎöã?'Cø$PRR î¯èر£¹)Îu ”juÔú„F@…{h\²|Êq7;Î"T°g UÒ¿¤ýŽ9"Mš4Iú²jhÀý5vAóçÏ&ºÆñ)*Ü=6Ü?ü`ÜÈ"PÅë»G“,8^ép\ƒ»N%E ¨R¥Š\uÕUòÜsÏ¥bõ´NaPá˜P9VÂÖÕ¬øÔ*>Jþy†š’ÕŒ®ÚýÓfZÒèèÚµ«`[²gÏžèÐX¾C@}Ë[6—Š´nÝÚ¸t\²d‰¹ìÃ2jZÛ¶m›Ì›7/)/æ lß~û­)›ÞÖÝ4î•gaðÍ7ßÄ=ŸpÀ»zôè!cÆŒ‘x \0}žBärnM ¼g1…ªÛªàíiÚ´iÆøê²Ë.‹mâ)œtÕªUIYÃéÓ§ËçºØÑ£G'eù´P©…n©sr¯wïÞ2iÒ$Ù¾}{RN¶S«µs¾6*Ü-Ú ÿþòÈ#˜k[U…k˜O‚4hÐ@Ê–-+&LðI‰µ˜Š@ô Ôq‰KZVòJ©€î¹Ghß±cÇÊ!CŒ1Š ö`ùè5÷¿¿÷Þ{Æå¬Š­EU¢FଳΒæÍ›Ëã?uÑ?¨pÏ¢­-Z$¢°rç E¥ÔA`ùòåÂ?8!RRÒöÝ—.]*+V¬H—*§m=U¸‡izTXmÚ´‘ë®»N&”>ö+¬ÚË•+§†‘~m@-wTÔ¯__¸vذaQÅ×HþA@…{ˆ¶ânï–-[š›Ý¸9W®\!Bé#?#€p¿òÊ+ý\-»"ÿüç?qðÖ­[£Š¯‘ü€ ÷í„*žó 3gΔ „¡üŽjùÚµkû½Z~EÀ3Ü~X¡B:t¨ç¸Á?¨pj«Q£FÉäɓ套^’3Ï<3è­þL¸€3Ç_|q*TGë xB Ož<Ò·o_s™ŒÞç :_VáÐ\ëׯ—ž={Êý÷ß/5 x£_S 5kÖ˜ê¨pO¥VÕºxAàÖ[o56'ôMÃúî¿7G£Ú·o/5kÖ”|ÐGM¨EõŠÂ½bÅŠæª^¯q5¼" p[†Â/¾ø¢lܸ1ª¤uB@…ûï€ 0ÀÜœ„:µ•Rê"°nÝ:©^½zêVPk¦X póÍ7KµjÕ¤OŸ>¡5ˆßPáî´g>9òØcéÑ(¿õà(Ê‹KܳÏ>;Š˜EH8„QÝìÙ³õ:ØÔiÖã5I{÷³Ü Æ•Ÿ… 2~ã#£_RÒ¥K»ŠîÝ»§lµbŠ€-×_½`oôñÇK¾|ùl£i¸$G íWîÏ?ÿ¼°ûôÓO'ySiñb€{;®8•E@Œ;ZN<üðà G !ÖÂýàÁƒÆxU«¦P³jUÂ!ðÅ_˜WzÌ1Bú<Ý8ãŒ3dРAòïÿ[V¯^nÕOÙú¦µpgµ~àÀã;>e[X+– ÿýïæ÷©§žšé¹þPÒ»ï¾ÛxlÄÈŽE’ÿH[á~øða>|¸tëÖ-GïXöòW öïßo \¤H\K«Äܹs›cq¨çï¹çž8æ¤I' ´îÓ§O—o¿ýVþñ$ kÍ' @S.\8 J£EP’¶ª^xás½õ˜1c’§`Z’¨H[á>aÂiÖ¬™”-[6*à4’?@c±RQRÌ`9߯_?Áéý÷ßÏüRù ´äp¨fß~ûmi×®¯K ›} ,háæ?%E@8Œëš4ib?Sò'i)Ü?üðC9tè4lØÐŸ­¦¥ŽWÏ‘8%E@8´ZS¦L1^¹cC¯†=#?ù$~™hÊŠ@ €–kΜ9rúé§KíÚµeÙ²e)P«ô©BÞô©ê5E%ËËa¾ÿþ{ùî»ïb–&ݸÖ²£3ÜòÆÊ%6Uw¿;ÚzÅ"Þ)§œb´6^nÂbß1Ú²9rD~ýõW!_/ôÛo¿ í`|Ý톬òàüòÉ'Ÿì¹ŸbŸ@9²c„˜Ý>éÖ‹th ü¢{!/ùÓ÷Áʦͽ¤X^/ñlÛ70ýÀïôAèÜsÏ |lõíæÂ… 妛n2+xn‘kÛ¶­UÜXІ¿ziCÂr+h<\‘%¶ñ¼´¹—‚„ã¯i)ÜK•*e:¬³ .Y²¤+V,«`Öï<•*U²0»ñøáÃÜÊ”)œtT¿¿þúk#àl˜eTxŒÄ=î|ðu,®ÇŒ¶=\w·*T°Î€?þø£0hË•+1žm{þùçÆ§ƒ-3r3fÏõ,ƒhɶŒ‘ÒG= –yózc]^ò‡aï޽۪ͽ¤X7/ñ¼„ ÌÃýÎDqûöíîOÏŸôŽsþ#ä !‰ÏL޽òWx2ýÝfÜziï@ð˜ô²¨³õv¹iÓ&Áíµ×‰i`ž¡¾Ã_©Cp{¤¥ZþòË/—O?ýTöìÙ +}–â4nÜX/^,®·º¯®VOÈ6hmüqyõÕWeÚ´irÉ%—Èòå˳®&?ÒR¸×¯_ßÌé¬Jé‡gy¡‰'¦_嵯Š@6`ì°MÅj•}øÎ; ^í”’´îìöíÛר–ÔQCòuÊx—ˆí“N:™»¬Ý#q“&M’:¨_íxƒ¯éûÍŸ?_3hÀØËðÁÇOßW.…*–Âöã¢Îp6mÚÔì!eÕ¦Ü$öî»ïf$åßa<òÀdª'{yÛàí}?̈=í{ï½×›==VòuêÔ‘o¾ù&bUî¼óNÙ»wo¦p¸2Žç*fíÚµòÔSOeÊ3Ôö(ÿþ÷¿‡z“g¯½öZ¶U²[¶l1÷:¸ÂΣ­mÛ¶¹LóbqaÄ6'ûð¬Ö¬YÓ\!ksäô™gž‘óÏ?_Z·n-Æ“àáL$“•Î>ûl5j”0†!&»ÕªU&~\ÉËŸ-¥­p :æË/¿lVžo¼ñ†±d¼ñÆ “aPºÔ£G騱£,Y²Äì3ýå/‘uëÖ¹¯Ã~rœ†Y;‚50†(Xš¢þE ddd„ê`Æ 3³cVÌ^ã“&u`U}ì±ÇBeöY—.] C&ƒyêÔ©òÑGÉý÷ßo&Iœ‰õµiÓFž|òIyï½÷Œ58§V¶x<Ƌ֬Y#·ß~»ñá“.>éC0W+W ÛˆDQ‚~øa3é 0áÂ8±5xv¡†6ÍnÜ+Ž`·±DÆjèŒ]Æ%¢ÿ3Yb|Ç’Ð1&X00>bMÉ8±¨§?#„àMŒ´LU«V•*UªH×®]ÍŠ”ÅA0ßb‹ *‹¨ /¼PÚ·oŸi ¿hx!Fú&mcCðê¿ýío¦Øò&'lW0ùE¦D"ÔŸ“h/˜¼á9ÕC† 1Úø>üvôèÑ‘’<þ>­…»‹w2«8T­0ºâÅ‹›Ù'j¦þýûÀÝs¢±‹.ºÈœ÷ÌÊsêQfZÌÜQaÑQžxâ 3èÈ^…!+ÒdµÌ,™É‚z饗ÌjˆÁƒ{I|H{!œ-^ȪŒá‘ˆ±Ì„‘‰F„,îÐ&E"ð¶c.¸à‚HÁå¯ý«Ñ#sZµje´ŸÈnçƒÈ¨hÑ¢†ÿÛz×ôvXÔd‘šÿ8à cãðb0f¢‹-2Õm\Ž…àøæÀJ°tÆpô¯ýK¸?œ3—0¢«®ºÊL²š„J AŠú’Ɔ){u2ÄeÅ©ŒWÕ-õFkÁªU±bÅãÅċռyóŽÿöÓT‡¤KÔ•‰Ž8L)˜lL]"Ž +˜¨1™èÁHMô V8nõêÕeß¾}}60YåH¡{e2Eúe·nÝLz6õ@H1À‘:^yå•F 0öl˜0êKÆ{•Œ„{óæÍMº6e`lÚN"lÒƒG°rݱc‡à•IjVÂÿ¶‘È/ãrbÃÂ6h¬PÝÃûðŸÀ…‰m ÆˆxðW&zöšYHR4¼-|ÞFè÷»”‘?ŽM£Î§"Ú[­(+u0`ò€6˜z±e e¡Éd9˜Ï²ýiÓOT¸‡h)€c¶æ™"ê5TG~:#d6¾yð½E;DCžvÚiæ; è¦cXüëÓ§T®\Ù~ÝqÇ2~üx©W¯žEÌcA¨ƒ+Œ(ÌÇ+1ù³Ý@þ.¡¢µ4nødùD-Ë ÂY ª`VL~hW>é†Ù^ t’ÁêÕ†Pãt'CŬ&‡6iF†²PO—è£6‡”ÙU;»>ûaжjñK/½Ô¬Ì˜d2Q€øD%É)l""ÌI.L¢O:f•F`±$„«Cwlyqsm+Ü)¯Ç!ã‹I-ÁD?B“EÛ¹|‘þÅä1°ºñ²Ë ÝtÂ}bx‡æ9“o&ò¶ä¥O±@dÃ$ͤðh„=ü•ýv&?.ŸAè#lÈn©a“R ‡ÁŠúŠ+®0‚&†úYV¡Yb"¨W¯^‚Ê‹=TŸ^Õò¬>]‚›¯„ cðÑÙ#BÀÌaÐ8¶ðÕªUË(˜2ê`V\`ƒ:•½0öåcݾ¨)Q¿²ÚåÃ<7³ñÀMŒÛ'`h´¥ËH"å‡Jq̘1&X4^·Èh FŒal6Hˆ,054Ah5"“1)êPèÍ7ß4Ú¥HñâõžñA[²ÚƒÜ½S›ü˜¤¸šHáSi‚‹;mI¿buÏÖ‹§Pã/;¼Ð_5ks¿eDz7‘Ä„¢téÒfˆ:u8«ƒœ &§X"P±™øïÿk] ês²a–á¥?c¬äN 9ÅÀŸU9$¶OPëc°åÕ–%\Ù¢}Ny˜4ÙNPÜ|ØÞãˆ&[D6”*ãð¡‡N` È1Š´±;ˆ–Éu$ŒáehnÙ> 3ù€ßÚk´i?&sô4Xh9‚Ë„‚73&ÐêaˆÐg²ãž&±I¥l"àìd8jél¦òGtLjâAßœ=Æ G}ô4óÏpñÙp†Ó2œ½¯ g•–ᬚ2Güý—³ÏpTA!ß?t„SݱÆ'¸ ñþíì G…cÉáhBÆwTóΊ ä;p ÷.8B¸öG9(O(rV¾aß9FMÎ*#T4ëg¶eŒ” ³·núop8‡gPNúv(ò’¿s‰H†³ò•Ì ÏÂ¥ ^ŽAÙ áÝáâ¹ï?mÂf5ÁÜüJŽV-$ÍŠ:ö2Ž`YeGµéy¸ö7· ÉËÙsÏÏѸe0nl >B? &Ƥ›Oð;~‡þ®oÃ_á%Á¤+w«)PòÂØ„Ë¢!TKXr²*“ãÙ%ì \›‚즕nñ]û‡d¨w8»‚d(›MØÀV"YÕi"Ïè§ã8Œ–ÚhèGl¹mH^®]I¬ûdzºÌ‰¾m»UX6îh¤øwT—¨Ñ9CÌѯh' )“VOPß# ÂÝ÷Mè­XïÛ\#ê-U ­(Š€"L¨µ|2µ†–EPE@ˆºrˆXS:FVŽØdÇ ›ËKÂ¥•Ýø¸óÄ‹{v8\>¶Ïñ àî]ÙÆI¦pàm{ÐÑÄç¶:Û>eÛÞ”ƒÓ|z!ʹüìôÛ2F*Ç7éO¡ŽGe×KþŽá’Pg›6÷’n`ù¼Äó60÷»cheŽyº¿ýöIùmÇ‚[7ŽtÒWlÚÐK{»éóI™¼Œm·Ñ Ì7ø;ã&Á” »à‡úÛ@óS ÙæÌrèØ9ÿFÏŸ’"àWp¬ãÕ£e²ÔUùkÖ-Ž¿ªpÏ7}«(Š€" øÝs÷]“iE@P¬Páž5>úVPE@ð*Ü}×dZ`E@PE k~üIDATT¸g¾UE@P|‡Àÿ1™¬Z~z*WIEND®B`‚asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/move3.png0000644000000000000000000010702315031566105023624 0ustar rootroot‰PNG  IHDR«΢ó“sRGB®Îé@IDATxì`EÇÿ@ $@€Ð!ôÞ;„Þ{¯@ñTEŠ ‚)"‚‚€ôÒ¤÷*½w:I éðÍ›¸Ç^r—zeïî^nwÊ›™ß,ûnfÞ̤yóæÍJ°cL€ 0& ]GœDÙºh·|\2&À˜`@Z†À˜`L@ëXYi½…¸|L€ 0&À=+~˜`L@û¸g¥ý6â2&Àž++‡`L@ûXYi¿¸„L€ 0‡'ÀÊÊáÀ˜Ð>VVÚo#.!`LÀá °²røG€0&À´O€••öÛˆKȘpx¬¬þ`L€ 0í`e¥ý6â2&Àž++‡`L@ûXYi¿¸„L€ 0‡'@G„˜Í;v C‡EµjÕÌ– fL€ 0m¸xñ"þùçŸTÒ¬Êêþýû8p :tèªBrb&À˜°]£GNuáy0ÕY`L€ ˜›++sfùL€ 0&j¬¬R0&À˜€¹ °²27a–Ϙ`©&ÀÊ*ÕY`L€ ˜›€Y­“[ø3gÎ`Ù²eºdiÒ¤AþüùѪU+(P@çŸÐÅþýû±bÅ õI®\¹Ššª°?ÿüdŽÙ¯_?-ZTOÖ°yóf4kÖ 6Ô KÎÍž={pûöm|ðÁÉIÆq™`vG@S=«ëׯcáÂ…pww—¢MÊË××·nÝJþóçÏѺukäÌ™S—>ÑD)Œ°mÛ6üòË/X¼xq< Ó§O—a§NŠ–ÇãæÍ›ÉIÂq™`vI@S=+"œ!C|óÍ7:ؤ€*V¬ˆ7ÊÆJ@DD¢££õ”ÒÇeðW_}…´ißêaŠK/þ¼yóêù+²ÂÃÃåeúôéå·!ÙJ\õwÙ²e±nÝ:Œ7Nç€}ûö¡T©R:?å"±r(ñ”ïîÝ»ƒ>q]HHœáêê7aaa’a¼ö`L€ Ø0·otVâÍ›7ˆ‰‰A¡B…d _¾|‰>}ú Ož<(\¸0Ú·o§OŸÊžWóæÍeŠK=1JGŠ‹”T½zõdüM›6É8¤Ø<==eϨxñâ ¡;c²¡©S§ŽLsòäI]þ£;¼¼¼t~ •£]»v>|¸^Ü%J`ýúõ˜9s&Þ}÷]F½µ÷Þ{OÞSýhˆs„ ºt[¶lA‘"Ed]iØtРA 4ì˜`ö@@sÊêÕ«W;v¬ü|þùçhÓ¦ ªV­*çøÈ‘#ñèÑ#‚¸wïžò£9zÓМ““îܹ#ï-Z${d.\s?³fÍ’sL4DJ0** 4÷´`Áâ1&ÛXCSï­mÛ¶X»v­. ]wìØ¯_¿Öù%TŽN:IŤÄ'¥ R¼‘‘‘ äHámذ-Z´õ'E5yòdÙ“òóó“ |âĉ ]C:wîŒ%K–€z`ì˜`ö@@sÊŠ ’"¡ u‘ÅéÓ§±wï^Ðp½„,{.¤l  ‡Ý^¼x¯=(.õ¼räÈ!èǑ;wn½=ªH16nÜX†'G¶’) ¤òÒåÁƒA½%ºW\Bå òQîÈ‘#2úêÕ«A2•!IE}W®\ï¼óŽÊüðÃeÐ7dþ¥K—F×®]áææ&W\£µ¾fL€ ØÍÍYÑËöÛo¿Õã8eÊüôÓO(X° TŸ~ú©ÞÜ) CÊêîÝ»zó\$4_¾|rþJÉ@™[¢^)c²=<<”$zßÔ#£¹(Ú´÷Ê•+¨Y³¦Þ EN¨™3g–½Gö£áC¦\³f^Êzh‘9õì¨÷E½)b£vÔeǘ°šSV†ÀRψ¬â²gÏ.ƒÉb°V­Zòš^Ö¤$H ‘)¹ÚќԵk×Ô^8þ¼¦Óó7‰ÉŽ_¹O—.콑‚¡rP¯(®K¬=zôÀÇ,Íܽ½½Q¥J•¸"ä=™òrTöC‡éÑœÍÕ±cL€ ØÍ RïæÁƒòC½¹sçâûï¿— &[¶l¨Q£†œc –ó54ŒGƆ^ä4ïCÃj4TFnçÎrˆ†ãºäÊV§'µjÕ*=zTö’ÔatX94h ç¸È ’†ù’ëh-ÍËmݺUöÉr’zzì˜`öB@s=«ÀÀ@59R@>>>ÒˆAœ3gzöì)ãP¯† ÏŸ?ß`{Œ1B¾Äi®‡,þÈpÞ¼yr˜Žb\—Ùê´ÔËsqq‘&öÔ‹Šë*Å¥z‰:YÿQ/+¹ŽzbdlÑ¿©¬È¤¾Q£FMÛ“+›ã3&À´@ èɼµ0q‰¨WCÖl¦>ÏŠ,çhxÖY‘a¡^•º*ÔC ’ ËÐÚ$uÜäÊV§Mì:9åHL–:œ¬þhÎŽæîhþŒŒ3Èȃ”—¡^¤:-_3&ÀÌM€vš1cFj²Y¥¹žURjC†Jï+)ñÉ¢>IqÉ•™Jœä”CI“”oúA@†³gÏ–ßdxöìY£s_I‘Éq˜`Z" ¹9+-Á±•²Q !þñÇrk*êÑÒšb²o+õàr2&ÀŒ°Éž•±Ê8²? ûч`LÀ pÏÊ[•ëʰ3¬¬ì¬A¹:L€ 0{$ÀÊÊ[•ëʰ3¬¬ì¬A¹:L€ 0{$ÀÊÊ[•ëʰ3¬¬ì¬A¹:L€ 0{$ÀÊÊ[•ëʰ3¬¬ì¬A¹:L€ 0{$ÀÊÊ[•ëʰ3¬¬ì¬A¹:L€ 0{$ÀÊÊ[•ëʰ3¬¬ì¬A¹:L€ 0{$ÀÊÊ[•ëʰ3¬¬ì¬A¹:L€ 0{$ÀÊÊ[•ëʰ3¬¬ì¬A¹:L€ 0{$ÀÊÊ[•ëʰ36Rð•+WpüØa\>OÑÝ=CaŸ\H›6 bb^Ëo¥Ý^¿~ƒ4iÒˆ@×ä(žrM÷þæMl˜¡puü¸q鞥Wò‘ÿý‰Ž‰APÐ+¤Ï!¯bPÀ§ÊV¬…š5k!{öìê¨|í@^¿~“'OâÌ™“¸víÂÂBàîžQQ‘Èœ9£|ž”gоӦM+žYz¶c¿•çP¹'tŠ]ó§0Å©ã+~ô­N›\uZåZO\?%ŒüGõ}ö,2¸!$$ÞÞ9Q¶lUT­Z  T¢ñ·°IeEï±cǰ~õ"¸;£vEO´û rç¨ ÿÚJ›……GáÎýœº°c¿Z„ÂÅ« C§ž(P €­TË™JQQQرcvî܈B…²¢zõBèÕ«³øáâ‘JÉö™: ¹sç¶«zreb ¬X±L¼h÷à“Oš¡T)Æ’B•*}Ö¬9€qã¾Ä æ^V Yj=ÙÛa—t×?;ð×ïßcâЪBQÑxiS^<' èQë»áÇï>ÇÝ»wS.ŒSj’ÀüùsqõêLÚ‡•‰Z¨S§:øòËVX¸p8`"©,FKl¢gµníjü³ùwÌß\P8ÆÐX½…# @5¬‹ÃGNˆIeo-=7\– ¹ÖŸž*Œnbòä¾)ÀI"P´h^ŒÝC†ü$•J–,™Pt³1šïYÑÐß©ƒ«ñó7MFQ)ÏPÃZE°prGL7OŸ>U¼ùÛF ,^¼%J¤Ç¤IØh ´_ìrbîÜ…ñÅ 9AvöC@ÓÊŠŒ)hŽjÔGUá‘9ƒE¨¯Ü|+61˜×³€P »ÑÑ1ÃÍáÙ¼~ tnè…_fM‘¦ÊæÈƒešŸY¯^¿~mÛV¶)‹Uó“1}d¨òå—í°`ÁL¼xñÂô°D«Ь²¢!²ú#c ïì-çð©;8tòŽÁüÂ#¢@áê5Y#&âYºñdì9|#‘Xoƒ›×/†Œi`Û¶­o=MxEëu¾þúk,Z´(Q©«V­ÂÆÆ=z´œg#™_|ñ¾ýö[ƒqgÏž-ß={f0<¥žk×®“íkRšÜ,éBBBð×_ó…1E ¸¸8›%„„–.Ý{öü›P”$…™JN’2Ke¤âÅó£Aƒ"‚ûŸ©”ÄɵB@³ÊŠ~‰’yzr)ž†âéó$ñM,î£'/Ţ̷½¨¼¹²àøÆ!â…£?Õô"Ìh¯çñÓ`„‹õTj âGªäªÃŒ]z§"¶n\"æ;’V7cr ùïÝ»3fÌÀ¨Q£ÄbÔ0CQt~GŽÁ‰'t÷q/–.]*p>“<~ùåaD0ÿþ«ÿ¢ ”Ê‘ÂéÚ”Žž›£GšRdªemÚ´uëFáÂy’$ëÕ«p1ìd0îóç/Œ†Q‚0DDDê¥ x‰ÈHýg",úQhÈ=~ žÛ¤ÉQ§ ‹—Nÿù}ñâ­ýÈ¡òšÂuï^·oŸÃIÿahŠ|Y†yhVYÑ‚ß÷Ú•Hr­ï?‚o§Ù(Tg úND펳ä‚[E@½®s0õ·}ò6±¸·î=GùæSQ öDd.33”én‹¼YÊ~-^Ñòþô?”i2¹«ƒg…1øzÊ6Ý?þ»~¨ÞîgYïÊcÑeàŸ}‰ -¦‚Xûþ ±p•ñ—¾Rnå;{6wÔ«”Û¶nQ¼Lö½dÉôîÝ[Êûûï¿ ÊMH‰EGG ¥ÿeH‚Ê–- êí¨Ý¦M›ÄÜá¶ 2ªøI)kõ 6¡ø?6Z®„ÒQ>¦> Æ‘#»Ð¥‹/‰MÐÑðòÿþ÷3²di-÷@µj Å{I¦¹ÿ |}?þ=Å® =P»ö`ܹóH†Mž¼\ȃÎÇCœöÈ”©%¾ùæwV¡B?<~ˆöíG K¹mÒoûöã‚ÿû(^ü}äÈÑÆ͖þôçîÝGbaò@™É"¹¤€ É©Woˆø1²R¦%…S¿þPäÍÛ¹ru”eU”ÎÌ™kѵë·xï½ïDÙ»ËøwÒ¤¥âùèƒO?ÍäÈy²<Å‹¿'Êö6o>"ãR>üp²¼¦?ĉòX³&öß³. έÉêÞ½&6lX'„om‘€&•ÕåË—åÎÉYðÛgø -˜çÆ!èüx¹Xø½O—éÚ¤u£R(["—¼O,îß{®à«ÁðBÈ™òUk1Oµç.?/Ñ—ÁáRFHhZ÷ùZ”ų3cqvë0,]¿-;&Ã{_Ž">Ùpv®ì‹×cöŸ‡pFÄËá• ëçõFï.UuåKÊEóº…phßß ¾Ì“"G‡^Ê›7o–ʪuëÖX¾|¹:[¶l‹V‹ Ož]¼ˆ;£gÏžb1¨x‘—C}-Z´÷yóæ;@ìÔÉ»sçŽØ¾ª¦0 /%Ë6wî\]XBù¼Ÿ~úI¼¬«cäÈ‘º4©¹ 3êjÕ|ÄÖI‰Ï¹þöÛfÁênÞüKôž6ˆr”C‡3dö}úü€¢Eóˆžè&±]×fÁ)¯|ùS ½¼W¯Þ6mj e¾UX~$/½äÁu¾PY±~ýÑÆÍ¥¬Q£æcìØÞ"õ2|þü-rq-öîý½hï<¢w³W®ü‰‹ï`öìØxqå´n]S(›BRæ/¿lí–Cì.±J–=kÖŒ˜2e… £-ÏÖ¯?ˆŒ3³ò™ÒzzÓ¦­ÂÀíðÃÄ|žV¬ØƒãÇçÊô_|ÑC*QúaÒµkÑÞûÅØ‰»wŸÆ«WhÕª¦”•Ð_ß2¢LWeo?¡x¦}šTV'Ž‘[(%õ”v‹9 ß¯%÷1srJ‡¡Ô‘sOÊàˆõÅ¢ÛbHJÜJeò këòH/v˜øøýÚðÉ›Û÷_Ó+ΆåPÞ§}늗*à™Õ=ÚUÄÚmçeûÄnŸ‹<]]Ä6PX2½jUöÑ“‘Ü›œÞ™á™)FüþžÜ¤FãS¯'þübae%têÔ ÿüóxY<•ñ©7Õ§O 4H §ÜFß¾}±uëV¡Ò† @CgÏž/Wñ†õêÔ©#~™‡Š—Ðq)óùóçrL›6mte¢ÞR—.]@ŠÍáDZråJÑX(ãR¤-‰H™ÞºuK*"*WÛ¶mñðáCñ2ë*^|Ótò¶oß.•()Öï¾ûNΑeXbùPïpÖ¬YèׯŸX`:N'/5§OF:¥’$bÑ¢íR¡äËç-ž=1ß×[˜aw/Û'b‡†ÓøøãoŸï¡qðàÑV±Ã…Õª•;84—áƒÅþ¸ví~¼|i˜í¯¿FK@i¯]óϨ³PL÷d>{÷žÅçŸw~.BÑg»C|…ZµÊÄ“C#FtG“&UdØ;ï4ì†Èk’Eóº—.Ý•÷ôÇË+‹PzCQ¦LA_·n ijÕ^†Qø?ƒê~ûöC¡CÄsî/q›6µäŸ¤¤È­^½O<«u%#0#Ô»ªV­ÜwÑHö¶šTVW.œ@¥2Iß¹†çhˆŠ¥óè°È“U^?Cnj—”¸¾Ußþƒ¢´åJæYª †ˆ_we›ý„ ”Ÿ?ל’–^wüdÔ…ß®ªT&/âÊUËKêu•ÒYÅ¯Ý Ižh<ìÑ£‡Œ×°aCxxxˆ—Aì°É¾}ûäý°aÃä7õlJ—.­“¹mÛ6©`š4i"×µ >\¦\ÐË‚”Š2H½¸5jè­£Þ)Š?þX*BÚ2‡zRjCŽ *ÈžUæÌ™ÅpS}1T–E }(67Í€ÆëÍKPÜŽ;Š—Yzôïß_öÔH '%RØ$×› GDDàÁƒ{z/h…‹¡oÖ+Y2¿.ÈÓÓï¾ÛD¾¼iž´bÅ"º02Ñ&÷èQì³æíEæìì$”V1OÛш Ú vÆC¢GÚ]÷MŸ¾ÔFä(ÿ4i †ß–v‡ðõ-+Ãúsㆿèé|)XwÃGM•ÊF¿ti™·Ú¯\¹Âº[šûúëß÷vâ™úJü`¹¨ #Åݹs=©¤¨¹nÝÉE!‘‹jÕŠ Å©?ošHÖ }K0àùcäÉY>É¥ñó9dA ¤hA/™îÌ¥ò;Ÿ0ŠP»¤Äõ{¨oîúïE2ô(ªoÏŒÈæá†{G¾Ò™"?y‚аHеä¨<´÷¹]‡®Ëqcßbò>¥|òz`çÓô¬®]»&%hçú™3c‡g^¾|)‡(,ÈöHÅ¢.k•*±¿¤Éo÷îÝøþûïuÁE‹;„gÖÝ+¤xHLš4Iß‘BP;êMQ¯‡”˜ÚÑ0žâræŒ}9Ó=½\©7èäûøÒNÝÔûR ª)XêÑ‘òH,Ÿ2e ÷"Ôò’z}ÿþ}QÎìI.^ÔBéúëâûû?/æƒbøµ’T<·n=Cyeø™37ä7õDȃ¤8ÚK”‰sŶD±Ê¢páž2©§gf9J@ù”,»™ò®]§¤_ãÆ•Š§¡ºþý§€†÷î.•Ò—_λtÜ3š&nÀŒ«qùò]1̼J™R9ièOq¤´iÞ«S§z²GU¿~%(ÑoÚKÐÏoo¢ñ8‚¶ ¤ÕbñÜÝœ“üÊOsUô™¶àh.‰Üâu§Ð¬^qdñˆ+ ù¤ãgî%)îöýWqþÊC©\­> êuh¦ÿkZ·8_†Éy*úÇzÏ?-{ÏÇògP\l®[¢ˆ7füqPUAE¯aË‘ÑÍU–ÍÙ)-^Š£Râ<2¥GP`ì0]JÒ«ÓÐðÍÏ›#{Uê#Dd„þxx¸›Ì`&l8ÈÌ4©¬Â^%l>— ÍQ-žÖÅcÇ.C«GÅP¬«Xöð®˜wüV ÷FË–_b¨˜SÛ¿ÿ¬X»·ÍP‘âùQ|Ê—¬óçï*ó,X0§x>'ȸô õìÙX΃õéÓ"^ú„<(íóç Eá0  Éa@¯ì™“®Z…ü¸}p. «»L]¥2Qÿ¿¶÷ Ì„âNÓNÆ£_t×n=E~1÷EGyûïGž¼¦?=ÛWB»¦epùÆcä~´Kq…‘Æíƒ#Asd4F/ÅMýº-¾ù_±}”‹â•äo'Ñ+óöÒÙ'9±*" áÑÐX‡T¾±—äGŠƒ Ó¢Þ^½zÉ9&š"CÅ‘% ­¡"+>šã©_¿¾TtJ¸ú›”)3šKŠë|||Ääûla¶ý?ñ+•K·nÝ„%Ü'q£&é¾^½zRÙÑ<õnH¶²{½)óI¬0nnn¢“ôg™z6|'êOs°N⸋·i©×rûö2ñ²¾#LÓÝç\ºÑ‡‘#߉W”¨¨]:¿©S?¦ì½d‰žCª£ù)ê•)=³1cz spOaõé%ó!#šÓ{nUrHøµkKty|ùeOaÙ×VX˲Q]PoÈÍ-½T^ºÈââðáÙê[Ù+»{w…è©ß—=IÊ·_¿Vzs_4äÙ Aa Û+ÔÈMîÜoç‰ÊÁ%F¼”cûÙf( MÔ“…˜¡bBÙ}=üLU7¡(£…¿dz>uþ~<æèÖrÅBåïÿ¸ï~˜c±"Ð"_êÐÚ(e2^Éœ²N¤3 µ¥Æ‘Õ õÒräÈ!MåS#K)W¾|ù¤†Z–)óQË{MCž×®íÀàÁ­ãñ}2e ÍgQï𧟉^r­d¤Žúî»ÓDOô­rM¶N*´³ m< ·J“ÀfÔŸ)fE=¤bhqÅìwS,à åVOIüyAÉ |èСÒ"N±òKn9¨×DF qÉ¡Þ+­J­¢"YîîîÒ„žÖt¥Ö)å¢Þ`\gÊ|âÊVß“™¸ŸeumášæÀh±ôàÁR¤¨¨Ž©Ý"Í8Ù{59 ˜œÉSK5 ë­ÿ­·¥²3š}¥fÉ 92( =üÈXâÉ“'ÒjŽ^œ´&‰åÂÔâ³l9¦É‰¬Oœø5UÂÈ”ŸmФ²²m¤Ö)ýÍ›7åú(2( SpgggÝVC´’‹KòçǬSΕ 0&Ÿ€&•õØ&@3ŒoÄîä=z$-æþúë/œ?^ö H1‘3¶WŸ ä?!@C€ü,[u¢™ð0`¢ˆ4A“ÊJóÔ¬X@¹Í•›bMs¹f‰†™”±Š¢2Tx¯#JW¨-6$ýKn—DVzIUZêÊÓ<–¡'Ôqº&e’šô©ÍßÚé«ÿ¡C‡„YÿN±^¬MB9Ìzöœj\8 sФéº9+l²3dH/w@§.]º„1cÆÈ5PT7e¿<{¨'× 0& Ф²bs_¥yâÇ5]§õM´ŽŠŽà8yò¤8h˜nÍýògg=lºn=öqsfÓõ¸Dlï^“ÊÊö0j£Ä´8—VŠSo‹6¥¥Îé¸ r´w;&à¨ÈŠ–mÐ䜕!Ë5ÛÆlºÒÓ¯õ¤ð©\¹2è3qâDyØ! U·®¶¶°2mJJj[i³ôöU*‘`gÛ4©¬ Y®Ù6fÓ•žUrøÐ*mìJv–%ܶ²lé87&`[xжڋKkC¸g¥Æâa@í´EJK¢Ieõ28ö ¸”VÊžÓÑ¢`å>{®§=Ôæ ÃÄÉÑì¬O 0ð¥õ Á%HM*«tNlÅf¬U_…E‰]ølc|´äïáá!Ö¿ñ̾µÛ„NΚUÿðTk—‰óO>M*«W1 Oú «É¯¶í¦ EÁÙ½S„†í°’{{{‹Ó~ïb;5±í’úû?§Só<ÛnE@“ʪ€OÜçG±‹Oà¶ ,?€}4G gΜâ¤â„‡óP 5çöíGðñ)lÍ"pÞ&  IeU¦BMœºðØÕ³?Ç/ |ùòöW1;¬Yb–,Y§N]µÃÚÙN•Ž¿…²e+ÙN¹¤ hRYÕªU»Ž?Ç\Ä,´£zþ{ÁÙòËcß•­Õ»fÍºØ¶í¬­ÛnÊ,ŽÏñGÅŠí¦NŽZM*+:F½pñ*Ø{ô–£¶‹ÁzoÚ{ ›¶7ÆžÚ$P©R%qZs$nÝz ÍÚy©¶l9ŽÚµÁÕÕÕÎkjÿÕÓ¤²"ì:õĪ÷Ä6A±‡ ÚS$\ó—àYh&ÔªU+ሪ)4ئMWüùç^M•Ë óüù ìÞ}­Zñ®÷öÐÞšUV @ÅêÍñÇB‰ˆˆÆÜ—ÑëƒO’µ{…=< öPÚ=$<<#vîäs­,Ùž³gÿ–-»"K–,–Ì–ó2Í*+ªo×nïàÂ]ì:tÝLÕ· ±ÓGÅšmP¼8[ÚF‹Å/e¿~ƒ°téQq¾•_ü@ö19•+÷!"ÂM›65¹lhšVV4ÎüÉÐQ˜¶è"NwÌ䓿ìÇ+D·n=­ó„p®&!Cœoß§Ï`ôèñ=>äµW&jDÈ_íÂÞ½w0pàÿx$Â#[ôÖ´²" ¹sçÆì_—à‡ùçpüÌ=[dœâ2w´—ý\0ô³Q Ó€ÙÙ62¶øùç_1|ø¬°ÌÔ”sçnÂ÷߯ÁçŸí ÂÎ~h^YjOOOŒ; óÖÞǶ½×쇾‘šÐÕ÷¿Fñ²õ1kÎÐñíììƒ@Ù²åл÷|ýõ aRÍÖ®¦jUÚá~É’]8{6;vì–ï SÉf9Ú `ÊŠP*T_ù »Ï:aü¬Cxª ‚&.Yý ¸Ù 4ˆ/Ç€OM61` ˆ«Q£†¢ú3gîÅo¿mChh˜Je»Eðó{*zRˆåiðÍ7ßÁÝÝÝv+Ã%7J@“çY+­——F™$Ynň)KP¯R4¯[9½3Kb3þ´à—ÖQ‘yz¿ÁãÙ˜ÂfZ.e¥SÇŸŒÕ«Wâãç£]»ŠhÒ¤22fÌ2˜êæMüý÷iÑ›zˆNÞƒ¯¯¯Rpœ*Û”²¢f¡žFË–­Ä©·õ°më|=ëoxfŠA•ÒYá“×™ÒÃÅÙ NNiÅä*@Gj¨+¤á‚´ié´]èNÜ{î…S:ÅÅ Wß«¯)>Ý“Sò‘7ÿý¡<)8:ú5ÂÅPmJ{Ë/'. sÖ|hÔ¬¿\G¥ÈP§åkû#àææ†÷ßïæÍ[bË–<øw,˜ *äß9E!½XÌê"vr‰CÁNò™UžMzŽ”ç‰¾ãú-Å®•øqýé^qêøŠ}«Ó&×_V¹V¾I–’§â§þVò¢µ–éÒ¥•{,>{öwî<ʼn·Å=,Ú?üЄ‡ÊXvüF¼Tß¾•M\ÑÕ«WãÕ«WèСƒ‰%¿GÅ¿ví.^¼ÿ{×ø—._CáBùÅ?„´âˆ†ù­¤xýúµT(¤èšÅS®é>®Š®¾WQ4T.ºVîI.¹q\Á‹àäÍ“Gìžž[lJ[BîõGÖbì›uñâE\½zþþ·üÅ•+×ѽ{¤Oïª{6•gPùVžCåžH*~tmÌŸÂ§Ž¯ø=~üçÎ]½¾zŠ—î[-Sç).Ôþ†®Õù(ኟòMþänܸ-Ô¨QYl™TNõá…¼y ¢\¹rðññ‘qøö Œ=3fÌHMAWÙ\Ï*nméá¦õG¼).¾·5dHC{ØÑçéÓ§0`NŸ>‡¯¾ú Æ ÓûÑe©º­[·+WnÀñãÖYЬpصkjÔ¨‹>úÄ*,Å›ó1NÀf ,ŒWC˜€}øçŸÄ‹¹†X@|Û·o¦îÃöMóÔkÖ¬ó{ã1iÒ$´nÝð>‹öõÄ'­6¬¬’Ɖc1³ aÀQ£F¡cÇŽ¨_¿>:„jÕª™=_­g@£'ƒûüíÆãÇQ³fMlÞ¼YëÅæò™˜++eqL %hÞµaÆøã?0wî\,X°™3Û¾•kJXKCç¸8p@ö®zö쉡C‡",ŒÍþñ²7VVöÖ¢\›#ðçŸ ëÖºÂ‚Õ ½ˆÙ&@”³gÏÆ¢E‹äð mLF)ììŸ++ûoc®¡F  Óõ÷åׇ~(ve߉…ùøõ¤4Y>|Xî¨NC¦¿þúkR’q&ÀÊʆ‹n»Ž=*×Ô9r7n”ÎÎζ[!+”<_¾|غu«´”üâ‹/ÄfÏÝðü9ol…¦°H–¬¬,‚™3a±hÝYµ5oÞeË–)-ê°KÚàyäÈ‘Ri?^ZQîÝ»7eÂ8•¦ °²Òtópáì‰Àýû÷Ñ¢E L:UìºðV¬XÁ®š¨ÉB†é»mÛ¶b£à¯ÅÎQ&’Îb´@€••ZË`“h—ê%ÅÑâÚZµjæ©è—?-øÕ’;vìJ–,)×v©ËE=C»«üþûïb[¨ ê¨V¿¦ÉXeÖ¬YbƒàßÄ®MpóæÍDËõâÅ \ºt)ÑxÁºXYY—?çnÃ.\(O¢Mhž„¶£5B½zõ›­v¾}ûPºtiÍÕºhÑ¢r¾‡Ý>zôHW>¶¤µMj·iÓ&|úé§ 4Ztd´²ÿ~±g´ÜÜö¯¿þJ°˜«V­’C±þþþ Æã@ë`ee]þœ» _ãß|ó ²gÏnt(ïìÙ³¨S§èåN/ÌéÓ§#Cm-[6i™øðáC9ŒöòåKƒ-CCm½{÷–5Ó:'­:ÚÕž÷éÓGlÑôúöí cu¢¹Ãððp9t¨Õúp¹Äž“ 0äøþûïA «zõêñÓð EÑ"_B#‹?ê±hÝ 4Hn~{åÊtéÒ´£†Ú]¾|Yöi.¨L™2¨]»¶:Xs×´×âĉåz,z¥ò?~<^9i±1 wÒÆÛ†Âã%`«`ee윩- =ûh— rq•m¼JÃ}4ÁOVj´-Pîܹm¢ºtÀiË–-¥Â¢—6õF”Óüüü¤Â¥aMrŸ}ö™MÔ‰ IsW4·HÖ͚5Ô)Stõ¢ðôéÓ£D‰t)ëE?6Øi++íµ —HãhMò¯Zµª®´4OB&é¶¼í!CäÍUÑð%õ ɵiÓ2,gΜhß¾½®Þ¶pwCÜ~ýúémˆKÆ/´á¹sç°lÙ2[¨’Õ‘••Ã59W85hGtúЯoz¹‘Eœ²- õÑП-o@K»½Ó%Ê9SW¯^•¸îÞ½+ h¸ìÿûŸ6K Gk¤U6Ä¥!AÒToˆ[¥JY$jW:’%$$ÄEä< ÀÊ*8ÄÔȺL}\ +‘™zÚÉ“'Ûü´tv–Òs¤ú“⢺“suu•–òÆFÿAÅ®]»ô6Ä¥98eø–üôÓO6Z;û-6++ûm[®™‰ ÐÚ;wîÈ9m:a—ÐÒ_q’µâÅEu¦á³L™2)A6ûwC\²TN'¦!ПþY¶µÍVÐ ÎÊÊ•«dz´–ŠT^ÜôMCc´?ݘ1cd†ör\½´iîJyy+4©ÎTnmþ›æàÈÄ}ìØ±¸wïž®m©bÔË¢³ÅØi‡€Ík¯”\{&0a¹G©#ÍÐÆ³tU»víoÙë „üùóË!)82¡¶5÷Þ{ïaܸqº¹êU‘Q…ºÇeKu¢cDf̘!{KdÙøäÉ=Ó|š‹£vRÌõiØ“,9éü,Z+ÇÎú¸geý6àhœmÅCÛ )ó6T\*¢õFÊ<‡R…àà`i H‹gi½’­îOçîîŽþýûË3¶¨nTwêmÙª£5qÿþû¯\GEÊJQJJ}¨=ãú‘‹;§ÄçoËàž•å™sŽ6F€Œ*èÅ¥VVÔÓ a1úP‹&èiÍU¥J•䇌/¨÷eËŽö/¤Þ9²œ£Å³¶êÈ4ýĉòda2O?}ú4N:Ú‘†sɩ۔îIQÏ™z¤9-vÖ%ÀÊʺü9wؾ}»<½W)&)­âÅ‹KÅT¹reiæMÀÒ‹ÎÞ\®\¹äNË—/—{ÚCýh»+úQ¡^ÌM½á3gÎHåEJŒm;EŽzÎ4'Ige‘Q;ë°¿aÖcé9ÓPýã¦}ðäÞw´ñiä=ý:UOÔSO„zô¡kr®\Ó=…©‡×↫ïãÆ¥{r”ž®•{é)þPyhHˆv- ƒÚµzCÔs }þâ:¹gõ*(õ È|[+ÎÜü©7Iu¦C·mÛ&«mIþ–àLÖ4/¥ž›"ƒ6$åEÆêçÑeâ<â`eŸ û$B€þá’‚¢ÝªIÐˬ{÷îðööާeÕ`Ú¼ôÁƒrè† ä;w–ŠV)-’¥–œ#ñ·wOOO4nÜX~¬UÎWŸ++}|—šœž7ožœŒ¦Cî|||I¡Ý`ê]QÏŠ>M›6•stŠ/Íoа–zP Eæ¯àoG#ÀÖ€ŽÖ⩨/í}G¦Øt­·±eEI’"c ÚŒ–¶Ü¡^—–ó×RkpY,M€••¥‰Ûh~´íà@bZ3%RRZ4Hu$ŬXŠ™2”Èbþ)¡Æiì‰ÚSkš©.k×®ÍéЊ~G±ˆ¢ÝÔÉè£Aƒòx š³–cþGå|¨µøs¾Ú À=+m´ƒfKACO´Kõˆ#FQ)AæÍÔ»úöÛoåРâoÉoæo]þ–lkÎ+a¬¬æãС4™¿téRôǘÛÃæ¥)iL___ÐgæÌ™zæõ)‘•Ü4Ì’½µø'·½8¾y °²2/_›•NæÑdõGÇ_¯#;:†•uF–`ÁüßR¶ÿ·¹ó•V°²ÒJKh¬´ŽŠöJ³gcŠä '£‹õë×ë6vMNÚ”ÄeþúÔ,Í_?w¾ÓVVZh –aåÊ•hÑ¢…Kf"eÍšthíä` Çüõ)[š¿~î|§¬¬´Ð +ùM[êØÓ:*S ¦uX{öì1ûÜó7ÜZ–âo8wöµ6VVÖn æüøq¹…’‹fÕ"ÑÞttÆõë×ÍZæo¯¥øÎ}­M€••µ[@ƒùÓ ´“8»øhÇu:ÈÏœŽù§k þÆsçk`eeMúÍ›vœÎ‘#‡FKgÝbѱæÞÕ‚ùocKð7ž;‡X“++kÒ×hÞ´ÁkÜ£54ZT‹‹Ö›ÑQ(ætÌß8]Kð7ž;‡X“++kÒ×hÞtÎ;Ãh'vÃ&òeþÆAZ‚¿ñÜ9ÄšXYY“¾FóvôEÀ 5 ìåå•P”T‡1ã-ÁßxîbM¬¬¬I_£y«OíÕh­Z,só1·|«Â3AæÌÇmP++l4s™¶úag˜½(ÍÍÇÜò ×Ì6|-Áß6H8^)YY9^›'ZcZÌÎ02<17sË7\3ÛðµÛ áx¥ä·’ãµ9ט 0&`sXYÙ\“™¿À<'`œ1 Ñ™›¹å¯öC,Á_û³„¬¬³Ý¹ÖL€ 0›"ÀÇÚÛTsY¦°´ÐgŸ}f™Ìl,—ˆˆ-ZÔ¬¥fþÆñZ‚¿ñÜ9ÄšXYY“¾Fó.]º4† ¦ÑÒY·X?ßaNÇüÓµã¹sˆ5 ð0 5ésÞL€ 0&$¬¬’„ɱ"±é´ñö¶„é4ó·.ã¹›?„61ž7oeft\̪U«t/_¾§NÒÝ;Ò++Gjm®+`š&àçç‡áǃ†;Éýý÷ßøñÇuež4ivìØ¡»w¤ ž³r¤ÖNb]yã ¨gen>æ–o¼vÚ±kR(_¾<^¾|©+·ß~ ú(îìٳʥÃ}sÏÊáš<ñ Ó a¤HÌÍÇÜò ×Ì6|-Áß6H8^)YY9^›s™`6G€••Í5™ù bþLl4Ú]"44Ô¬¥gþÆñZ‚¿ñÜ9ÄšXYY“¾Fó¦3ƒØ&oooÃ&òeþÆAZ‚¿ñÜ9ÄšXYY“¾Fó¦“jé¥À.>'Ož GŽñLèÃüôã¹sˆ5 °²²&}æ]¨P!|ˆ£Gj°t–+Ò_ý…Úµk£xñâ–ËTäÄücq[‹¿E›3K”+«D9nWWWy#6H§×:¢[°`œÑ½{w‹WŸùÖäoñç $ÀÊ*A<˜;wny¾ÎÒ¥Kqþüy‡òÙgŸÉ£èÈkí*ÁüË#3¬Åß¡xW–••ÆH ÅóôôÄøñãåÙ:‡ÒB‘ÌZš#Y¸p!*T¨€_~ù...fÍ/1áÌߺük· VV–áló¹Ð® cÇŽ-Êüí·ßt'™Ú|ÅâT€¬Î¦M›†"EŠ`äÈ‘ÐÊ©½Ì?NCñ­ÃàîÉS^aZKÁmÛ¶ sæÌAÙ²e¥Å ­ ²uG Ni™§2ÄâÆIáÇü“B‰ãØ+VVöÚ²fªõ4Z¶l‰ºuëbëÖ­rÜÝÝ]¾ÜsåÊ…L™2Iƒšc CéHõa‚txÉ oú£påšî)œÒ).n¸ú^}Mñéžœ’¼ùïùQxLLŒTJ´)*í5G½ER¸-Z´ÊW‘¡N«•k毕–àrXš@ñ8öa†œW¯^W¯^¡C‡fÎ"µ@€Ÿk×®IkÁ»wï" @î+HÃVôb%Å@ߊS”)E!%¦œâ†«ïIŽúV ùѵr¯äàà`äÉ“Gn›D夽þ̽“º’¿©¿™¿©‰²–)cæÏOƒ#xû“×jËudL€ 0›$ÀÊÊ&› ͘p,¬¬«½¹¶L€ 0›$ÀÊÊ&› ͘p,¬¬«½¹¶L€ 0›$ÀÊÊ&› ͘p,¬¬«½¹¶L€ 0›$ÀÊÊ&› ͘p,¬¬«½¹¶L€ 0›$ÀÊÊ&› ͘p,¬¬«½¹¶L€ 0›$`ö½ýýýAvL€ 0&à˜hƒëÔ:³*«š5kbåÊ• £Ø1&À˜€c0Å©f="Ä1›…k͘`&&°Šç¬LL”Å1&À˜€é °²2=S–Ș`&&ÀÊÊÄ@Y`L€ ˜ž++Ó3e‰L€ 0&`b¬¬L ”Å1&À˜€é °²2=S–Ș`&&ÀÊÊÄ@Y`L€ ˜ž++Ó3e‰L€ 0&`b¬¬L ”Å1&À˜€é °²2=S–Ș`&&ÀÊÊÄ@Y`L€ ˜ž++Ó3e‰L€ 0&`b¬¬L ”Å1&À˜€é °²2=S–Ș`&&ÀÊÊÄ@Y`L€ ˜ž++Ó3e‰L€ 0&`b¬¬L ”Å1&À˜€é °²2=S–Ș`&&ÀÊÊÄ@Y`L€ ˜ž++Ó3e‰L€ 0&`bN©•·jÕªÔŠàôL€ 0TÈ—/jÔ¨‘*œXÛR¥¬V¯^eË–¡C‡Ú®%—Ž 0»&0lØ0>|Ø®ëèè•K•²"xíÛ·—GÉõgLÀzNž\7&&%J”Àúõëeùß}÷]F½µ÷Þ{t_¨P!äÊ• &LÐ¥Û²e Š)‚¼yó¢U«V4h( ;&À˜Ð'`qeõôéS‚"Ô¨Q#¸¹¹É—<ë“O>‘Úƒ†ìhEº···ì}Ñ çÎøöÛo¥âzôè‘|ñSŒ9^œ5kúõë‡qãÆI¿¸Ò¦M‹¶mÛbíÚµº ºîر#^¿~­ó8p T$÷ïß).R*~ø¡ §˜8q"(êe’B¦;&À˜Ð'`qeµbÅ 9ÜFCnÎÎÎRq±ERÜ‚ d|&$…@Ê®`Á‚R±)éI‘RÉž=»âï›âÐP 'Ò0ßÁƒA½%º'GŠ„†I)7'''Ùë9zô¨¤];¨wväÈŸ¶"™éÓ§—÷ê?•+WÆ;ï¼#å(ÊîÆ2ÿÒ¥KËÞ%)lR\E‹U'åk&À˜ø@ª·[J.É¥K—‚^Ö>>>2ixx¸TR¤å˗׉¢¡Grd@AJ¦M›6²wEÇ›6mš5ktqÕê¡E’IÊz_Ô›"E«v¤„Ù1&À˜@|UVgΜÁ¥K—@æÝY³fÕ•†z5Ôã"³ò„½øIÑÐPšâÈ =¡^”Oý.]:¹Ÿ!)RVÔ+R;’GCŠ·oß–Ãvþüy%Ož<ò›†1?þøc4lØPUV©REúÇý“&Mš¸^òžò8tè^Ø­[·äü•ž'ß0&À˜,: H½ªzõê¡R¥J²WA= úÐ)+CŽz#ÁÁÁ2¨eË– ce­‰"# šK®#EÇ›ÐÐõ’Ô®páÂRI‘i½2‡D&õ7F–,YdÔ È9«o¾ùFó©Ó'嚔܅ @Æ$4ü¸qãFÙÓKJZŽÃ˜p4ëYÑÐ)2(ˆëȸaÚ´i8qâDÜ Ù0`€:£9ŸsçÎæÈ‚ŽŒ(]±bÅâ¥K̃”™ÏÓz.OOO½è4GEV‡4×DÆ3fDæÌ™A KqÔ;#3u²`¤^VrõĨ‡Ø¿©¬È¤žæà\]]“+Šã3&Àìž@ñ«>Öª mýÏ@IDATU%Ã2t0÷yVAAARa!G–u4wEJ*S¦L)(yÒ’ÐP ’²¢96cCzI“¦‹zl´,wîÜrþŒŒ3h8””™±³cL éhÇ›3f$=Ç´5«,Ö³J eèM‘‘3gNÐÇÜŽ† ©ÇcGJž ;h¨‘¾É:ñìÙ³06÷eŽ2°L&À˜€­°èœ•­@±D9iý !þñÇðõõõRi˜4GŽ–Èžó`L€ Ø›èYÙÑd–†ýèÃŽ 0&À&À=«„ùp(`L€ h€++ 4 0&À&ÀÊ*a>ʘ` ÀÊJÀE`L€ 0„ °²J˜‡2&À˜€°²Ò@#p˜`L a¬¬æÃ¡L€ 0& ¬¬4Ð\&À˜H˜+«„ùp(`L€ h€++ 4 0&À&ÀÊ*a>ʘ` ÀÊJÀE`L€ 0„ °²J˜‡2&À˜€°²Ò@#p˜`L a¬¬æÃ¡L€ 0& ¬¬4Ð\&À˜H˜+«„ùp(`L€ h€€Ýœ|ÿþ}øùù!((þþþÈž=;Ò¦M‹˜˜¤I“F‡úÍ›7òžü^¿~-ýéšü÷žä(q)Ž:\}­„‘ŧtŠSäSy"##áéé :ÚÞÇÇY²dQ¢ñ·ˆˆˆÀ;wäsº§gCyv”g’ª®\«¿É_‰«<‹Ê=…©ž˜Ÿ¡ôê´J¸ò­„û¦ü(.¹—/_Êô\çÍ›ùòåÓ…Éü‡ ¤€€M++RP{vïÀ©ãû9C å͈,Ó"ƒx!¸…f/„4ˆŽJã¿DÄçµTV±¤ýDÁÊ5…Ľ§ô”Nqê{õ5…+y)ù¤Á[EIáRΫH„„:ãòñ0,ôE欹P÷êÕ«wwwŠÆÎÆ Ð’“'Ob÷ºõ¸qú ¼c€\Qo>*iÄ™tqžI½çF<3oÄôìÐ79å9Sü”︘ ù+iÕq‹§„+iãÞ«ýI.•“üèŸIØëh»¸ ÌÅ Ò 8ƒ+ª7mŒ-[ P¡Bêbð5H2›TV=ÂÊå‹pïæ)4¯• ]†–‡—gÆ$WZkoÜy†í×aäÆÅ¨×¸Ú´mñm8|ø0–Ïšƒ¬ž¢ÆgtuÏ&ÚSô²3Øf}R[ê ˆHœY¶ÓÖmDÚ5ѽ?ÙãJ­\NïXlJYÑÐÈ–-›°}Óbti’#ßkhà E|²ƒ>A/°ló?øzänô0 ÅŠs¬§ÑÆkKCÐs'OAàÁcèœÎ3zÛxLSü,Î.¨ŸÕõ…¸£»bìá£hþatèÒEo¨Ü4¹±{%`3Ê*::3gLÆëàK˜òyMxfµ¿á²,0ðÊ8å!¦O…V?DÓ¦ÍìõÙ³«z]»v ?úÕ¿DÏÌ9ìâG”9¨F/”ŽŽÂÊYóó"­ßí 777sdÅ2íŒÀ[ W,** ÿÜ¡ONà›OjÛ¥¢Rã/["~Q ‡vþ;¶ªƒøZƒ>|ˆæ ¢ù“4ðÈΊ*‘6Êä䌾9´x5Æ . IÂÁLšWV¤¨~˜4ÕŠ¿Á÷_4s˜õG}T ݺõCŸùQÕ(êQ}ÝëÌ/Vå3gÓh)µY¬^È~úzwî ²’dÇ" yeõÇ‚_Q&_0÷ª‘P=L¶róY¬ØtÆ ¼g¡:v¢£…i—)¬'§Ç`ßö¥ø÷ß-#g‘˜1r4Þ‰rAQ÷ÌÉIj×qƒÅ0ߤç.,"Õ׆*ÝÍ;Ê< ÄŠ f?& # ieuðàA<º}=Û”ÒØÜ‡OÝÁ¡“w f ýú­»Áˆ‰x–n<{ßH$VlpV7|Þ·þö“”†#™ŸûÌùáGÔzŒ"VPTmOîÆ± §©ªèÙ—hz|gªdJü*&KÜBä›×P_ŠK~=IRÓ&÷Ñ“—ˆŠzÛ‹Ê›+ Žo"ÌõíRÈŠO½hXùcñ2 R{!@ÄTÉÕ 4pã“/ZÔʆå-4Ê^Ö p`ÿ~„=…º™³')ûg‘áˆxýöYR‘Ò{þJöB¿¸ß¡âå'틨HDÅùÑDkø‚„¿!GaÃõ‡Ú¢ˆ¯–#â½½%s9ZLÜ-}6¬™9G.ê7W>,×¶ h¶gõ·0Q¯Z2=òåNÚî÷Á·Ólª3 }'¢vÇY¸s?@×:õºÎÁÔßöÉûÄâÞº÷å›OkB&"s™Ñ˜¹ð Lw[ÈËRök±A´¼?}ÁešLAîjãàYa ¾ž²M·Æ]¿@To÷³,wå±è2ðO„ŠÅÀZL)°öýb᪺ò%vÑ®I \¿xHî„X\7/²L]9{.Z;eJ4#RDÝÿ݇fÇÿï‘møôÒ ÙÛ „ûž?B£ÛDø~T?¼ÅÐ)r¿ß¿.ã½tuŽlEÕC[0óÎeÖñÔ<‹ŠÀ'aÝ£{ÒoÚíK"Þ6´:± -Oüƒ½B¶âv={(òÞŠ¶'w¡áÑíøÃﮇ¾D¿s‡AаòÁÍÊè†ðk|lî¼ Á½°P™çRÿ[2m­ÃãÝ3d<’;÷îU ¹x\ÉBúW8°#ô¢.B"ž.®(ô ëW¬L$&;*M*+ÚŽhß® èÖ²T’Û¥Ïð(Z0;ÏCÐùñ(VÈ ï}ºL—¾u£R +;r‰Åý{Ï|5¸^9S¾j-æ©6âÜå²÷ô28\Ê @ë>¿£S‹²xvf,În†¥ëOã·eÇdxïáËåÚ©€³ãpe÷\¼þ³ÿ<„3"^¯LX?¯7zw©*ã&å³s:tj’o^›”èÇŒŽ9ïGÏ‘?CâË'F]=üéÝq¤V l©ÒP*„enË—ú§—O`B±ŠØ_³9vVk‚½°L Ÿ‘£^ÏŽgP?[Nœ¬Ýà •Ư÷®ÉØÚÊ ÝÙ3KWG‡œùq7,[ŸúcEź8$òé—¯(~¸yAþp¢ÞÔˆ+'1ºH9œðmq"¿)·."}Út˜_®ÜÓ9á”ðÏ(,ô<œ\ÐÂ+¸Ž9 !¼S/žcWõ¦X.d“ÛóŸŒ;VD‹a>Å‘ŠeNÍy£Lž8¸v=hT…ˆK@“ÊêØ±c(_Ô´î()ŽzJ»ÅÐÇï×’C†NNé0ôƒ:rîI1 >šÔ)†¤Ä­T&º¶.ôé…ÌÚðÉ›Û÷_Ó+ʆåPÞ§}ëÊ-fÈ¢G»ŠX»í¼ÌcßÑ[ø\äéêê„Ü9<°dzÔªì£'#¹7 jÆ¥sGøsrÁ™8þî5ëP+múD¥’¢8!^öåá"”ƒ·küP¢2*«Á¿…rñ §¾gN)‡ÂZ Eñè)®l¦,h/”mcÔ=WAé}G(¦¸.«³¸¼/r¦Ï?¡PhÈî^x¨TxÛžù#'ÉöÎ+“ùfóÆôRUá”&þ?}/×ôøL(Åì.oëFJÒM(´2™²Êrß½.s¹ "ŸRa18tè¹²`¹6L@òE#9sú|Ëx&¹44Cy ªP†ŒXâSUEàH1‡EÃjõ²åÀ5aР̑߾€Çb¸îíè€!™ŠŸ“Ð"¡1±zÔ{*&^ò$—æ‘þù‘£ù£†ž¹pK(²ÝÿõØÈØb¡Ï. œÅð"õˆ+Å@a´AŠÌ˜E¡úߟ¢^WDùɃdÂ4…sÃ¥î1oð왾‚5…l–aÛ4Ù³Êàš.YTiŽjñ´è8`‘\Л)£+<2eÀ†ßzë䌾=ÚV@µ ùK½¨–½ J,þ  iÁ]‘'§nÞ}û¨ 0'_ðCô¹£~Ü*Ú;í+á³ë"]º´X:½§´ø[µå,œ„r¢°• ÈòtnYN*/2_'ÿä8· . yk嘜´7õ^Ã5:þPœ!Ét È%+ «½ãØþt‡ìµ‹`•.>+XZZÔåsMBYµŠªmŽ|†DÅókš=T|‘BQ¼—§0Èj¬Éºï£üÅqZ¬¡ú\VL/U _. 2æ ŠÌ¢·÷e¡2rΪxFäy×V„»…Å£ˆp|wó<ªeÉ.çØâeªò¨#”íBaUHë½HñuÊU@ RšÆ¹Š4ÜJgÒ±c 4¢WbžÕ«WãÕ«WèСƒ"Ï$ß_ é†Ùc&[­‰º$¬îHY‘2Qƒ3$(±¸„åÚ­§È/æ¾2C rt”G±ú? ìê$i8A~dŽ~ùÆcä~´KíhíÍ‘Ñü)Tµ£µYÝ]âù«ãº~ðø&Ì»§Í3Ì~f&ðç‚ßùËÐà?ȤdGkœüDR\Ã2† k¾|Âb†ì’ã(­[ºtR&åq[È) ,)Rb´{™„“£Ý$ž‹žÍ‹ÅuÔ“JnÞŠ 2"¡<\T*a)ýþ9ô ü6EŠI²ˆÑ£GcÆŒIŽÏmŽÀ*Mö¬\œSV,2²(_*vò8±¦H,.)ºâ* R.´ SVa¡H~ŠswsA•r† Ó©ª… þu˜TKG%õ·sœEÉê0¾6/'aÖýF<ÉqdÍgÌÌz:e…¥]J¥Uå¡Ì‹‘)EQÑ}z¡Ôò¤‹¯¨(,¥ŠŠÒRÏÌÔÎY”5¡š¦ÎåÙMÎY¥¢³g6êÔC:qÎ+f¿k¶<’,8Å}á$çÀÐâ³i¤¨6ímlG›®>UÞvR%Æ´‰µø«ª¢X{µ^5fÚ'SZò~Ø'S8GOˆ=›ü[!!B¦ Óâ;À45c))%À=«”’³R:9ÃÈoK+Ñv¢¸we^üôŒ3có2¶Eéܳ²±V“Ó%ܳ²Z«É_ü²¬V»Ï˜ðÒ|/;& & É'‚U©›Hÿš{Vú<,}Ç=+ó§gœç¬ÌÏÙÖrÐdÏêáã@Ðú$vñ Ô¨X ¾'ûXŒ@Œ0?#vžsd‡Å à=x»°ßªÊULMö¬’Q~ŽÊ˜`@@“=«\9²¢K«ò€?ùUôô"ù‰8…ɤk€*yx¢^2›,st3LÏD©6W3šTVl¶j¼ÕØÀÂ8K„°…ù)³…ùÛbšd ãXgc‰6°0?e6°0?c[Ì{V6Öjܳ²nƒqÏÊüüéçÑós¶µ¸gek-FååEÁVk5îõ[=s¶ g[ÊE“ÊŠU%òñ¢àD™/˜ŸMó±UKæEÁj|M49 Í­c„çGE2#xÌî-ØË‰C³gå°D‰µl¼(Øa›ßhÅ5Ù³#ÖF ìèt`c7ÓËàè\“Zÿ în ³£Ø™Àqx©³óÛãOÌ—K¶%šTVaI;6Ü–@›ª¬¯Â"áž1³©Ä±œdpË” áâeÊÎ|"„…Eƌ͗K¶IšüWçäìŽç¡6 ÔÜ…¾ëˆÜù ›;–o„@þüùñÈUÿÔg#QÙ;"Ä6V¡éÒð‘ö)`gïI4©¬ )%§·wø)©ß¹ë/P´hÉ”$å4& P°`AÜKó1<hšñE\}‰¢åÊÆ`‡' IeU¡RMœ¼À[®Ä}:#…aÅ•Û!(S¦LÜ ¾·ž*P¶4nˆ—*;Ó¸ü& •74½`–hó4©¬ªW¯Ž³×Cô"Ìæ›²{ŽÜD©r5áîînJ±,+™vê€Ã¯Ã“™Š£'F ,&—2¤CíÚµ‹ÊáH@“ÊÊÅÅõµÃŠ¿/9`“®r”°\³óZ¶îh8ûZŒ@Íš5ñ$§'î…ñ¼ª)¡ï ~ߎíùǘ)¡Ú‘,M*+âÛ²Uœ¸Žû‚ìwÊ«²aç-]>>>)Â)MBÀÉÉ ]?þ›£ƒM"…Ï##p6‹ÚwëÊ8˜€AšUV4ÔÕ¹{Ì\|ÖáÞ¹€­‡нgoƒÈž–'P§n]¸×¨Œý/ŸY>s;Ë‘¶VZ€NŸ B–,Yì¬v\SЬ²¢ úúú"gÁZ˜¿òŒ©êksr‚CÂñã‚3èýágÈš5«Í•ß^ LÛ. úâsöÊ„³/쵚©×Æ—OáÕ´š4kj‘ü8Û$ ieEHûô€£—Þ`À¨u¶I8¥ Àˆï÷ ^³wP±bÅTHâ¤æ -[6 ™4ý¯œ™\³K>µÏüñ \Q ülXòs ‡" yeEۮ̘ù+2{—Ãï«ÎˆmÙc«›§ÏCP¯Û|t|gZµjëP¥-U¶X±b8yæ –»D³9{2nÙ3?óÎŒ1SB† ¼…X2ñ9\tÍ++jrùò«ñð ·q3Ùýîç.?ÀÈ©GñÕ·“Q«v]‡{(m­Â¹sçÆˆYÓ±Æ3=ö¼xæ0?¨RÚNÁÑQXðâ¢Ô«VÀÕÕ5¥¢8° eEíAô§ŸDñ*]0üÇ#غçŠÝ½h]Ù/KOá×µ1èÓïдi3zm»ªE‹Å„ù¿Â¿NeÌ y‚Û¯ØRÐP‹ zŠiÑA(;¸¾ün<+*CØÏ Mb°¤Â“zX­[·E•*Õ°rù"løv7š×Ê…ÚUòÃËÓv7¾¼qç¶¼ƒS—ÄÐ_ã? =h­;Û"@–l#'NÀ¡C‡°bö/Èúà j¼qF1w¸¤µ™ß…&‡‰3!A8&:P>jȧ}‘7o^“çÃ훀M)+¥)ræÌ‰ÿ ý÷ïßÇžÝ;ðåô}È”>…òº#k¦t}†ìÙÜ‘V(·˜×¯õŽÈ¦9/Rzâa;ÿE÷ê¹°¸÷iÓ¦ÑÅ¥2¨ÃÕ×J˜"û8Ò÷ep8²z¸ ù±¥‰yðˆh¤IëŒ{ÂpÛ/Ùr£†oLê[DÆb²é¿´C5pòäIì^·«OŸWôäGa¹Š³ÚÒÒ3)j(žBñ„$o6±4†Â ùœP<%ÌØ·Z^¨Ø‰ÂIŒ„„¹8á¡S„¸¥Gµ6m1¬e *TH•¯™@’ ؤ²Rj—/_>¼ß«¯üøùù>xð‘™½@§ÒayêSGéP7R0äeHá(aÒ«ƒSß«¯•¸ôMñ-Z„ëׯcüøñH—.v§nò ƒ§§'TÍÞ ðÚfgŽÚ›¶ £ODDîܹ„‰¶§{ZX¬8z&”g”®•çQù¦xÊs¦ø)ߊ åÛ¿’V‰C߉ÅS•´qïÕþ$þ½}§YJÒR‹ °²²@»Ò${¿~ý0räH<·JZ9gÁ˜€`ee¡3fŒ\9jÔ( åÈÙ0&Àì‡++ µeæÌ™1uêT9¸gÏ åÊÙ0&Àìƒ++ ¶c«V­Ð¦M 2D®·1”õúõëñò%ïàmˆ û1&à¸XYY¸í§L™‚€€Lœ81^ÎAAAxÿý÷±aÆxaìÁ˜pd¬¬,Üú¹råÂØ±c1kÖ,œ;wN/÷+W®Èû›7oêùó `LÀÑ °²²ÂðÁˆÍx«`À€º-Ÿ¨—/_–¥¹qã†JÅY2&À´K€••Ú†öI›>}ºÜ7pΜ9º(ÊêêÕ«:?¾`L€ 0±?&C°Ú7v· MnïÝ»' ¡ Ò^‚ì˜`Là-VVoY˜õJ½‹»’ÑðáÃå®ÔÆ “^—.]’ßáááxôè‘¿™`O€••/^€ +|}}1aÂ=z111r‘0mÅ´cÇÌ›7d ¨86²PHð7`L€‡-ò xxxà»ï¾Ãµk×ðã?Šãê›ÊãLÞyç9oE÷_|ñ…®,t.++¾`L€ 𜕥ž¾}ûâÔ©S¨[·®Ì244[¶l‘ „©gE=-å€F:˜••¥Z†óaLÀð0 [‰NLݼy³\cåææ¦;ýU)),r‘‘‘`óu… 3&ÀxÐ*ÏíRqúôiÔ¯_ßhþÊa£8€ 0&à@¸ge¥ÆÎ;7Ö®]‹_ý™2e ý©bήöãk&À˜€£`eeå–ïÑ£þý÷_it¡.JDD>|¨öâk&À˜€Ã`e¥¦÷ööÆòå˱páBå Y’c# 4 0MÐ{ÒD‘ì¿Ôcºÿ¾Ü}ýÁƒÈ–-›¬4)©I“&I¥uüøqÐq!t²ðëׯõŒ1h»&õ"cJGq÷>n|õ½rMiH&}ÈOíH6ù“"Í‘#|||äÐ¥:_3&ÀÌI€••9éªd?~ü{öîÂÑã{àä¼ù3!sVgD9E"ÒÉ]ÓÙã >R®çB®<ˆHw¯Ó¼– äMš72žAeô_Eá"â…dè^ S++ºV»˜˜×ÂB1/ž¦ÁÑÓ!ð»ŒÞùP¯N Ô®][.nVÇçk&À˜€© °²25Ñ8ò±båRœ¿x5ëåÆÇŸW@®ÜYãIJ­[êe]¿òûþY…5ë¡e³.hÞ¼…n˜mÕ†K˘€-`eeÆVÚ·o/–­œ‡†-òa‡-áìœÎŒ¹YN4õÆŠ•Ì-?O½Àº›qøÛÝ8`˜Ü™Ãr%᜘púã=ŽRk3דzë7¬Â¶]¿ã³oj£e»òv£¨â¢óÎéCê¢qÛ¬˜0i„Ü÷0n¾gL€ ¤–÷¬RK0NzRTKÿú{¬Á”9=ìVIÅ©6ªÖ(,æá²aöäŸáââŒJ•*ÇÂ÷L€ 0àžUŠÑÅOHŠjúŒ)¸å·3~{×a•B‚æâú®†úõàСƒŠ73&ÀRM€•Uª¾°rÕ ¸föǰQÍÞzZøjÿîËX¼`¿…s}›]ÁÂÞ8~e¢˜«›ÃëÄÞbá+&ÀRI€•U**É/^¼ˆ#Ç7¡Ë»/³|Ÿ:~ ÕK}eTöÓÇ/qëÆ£á–È›/ÞP³æü:H’`L µXY¥– HO»¥ÿ¾pÞíW2¸˜@b¬ZŒKÖvjƒÀ€Pµ—îúå‹0têQc&uÖù)¡!ለˆRnõ¾ÃÂ"õîMqSªl^”(—ëÖ­2…8–Á˜€ƒ` <{öì†Wîh”(ÇÒbEL¸Ë ¡€ÜÝ]1wñ‡b‰ èÑf†P:Ñ(œýœ¹õ#zu™ƒúKaÝʨP¹J”ʃGobþ_0gÚü{òŽÜ}b÷ö ˆŽŽÁàáÍñù×me&Û·œÅçŸ,EP~UkF¾ž(R,'>fša̶Ëcìç[ľ‡-áééi26,ˆ 0Ç#À=+´ù歫оk9HŠqçÖSü6{7vÿïÿ„¾ƒâ»Ñk¥2\¶i2fJ›Ïf"Sæ ˆŠŒÆ¼Y»Ðëú=¾£ì=½z!‘rÚ²þ4š¶,‡Ogàë‰0㇭ ž”¿_¾?_öÂ.?˜†ö]ªbÅâ# MkŠÊPù|æÁÎÛL!Že0&àÀXY¥²ñ/\¸€,Ù^ ³mÓõȪð•PKÿ8€€g!¢§Ó«¶~j´¤í:UAïþõáé•)^œ •}ÐõÝšr &ŠCîÖõÇØ¼ö´T~»Uƒ›› Þý  Í!ÃMù§^ã8px‡ìÝ™R.ËbLÀ±°²Je{ÿûïI”©d:EEÅ!‹º¿õÆÆ5§P±ÈhXmí=õI¶K_·Aš<½; }u‘«êµÄ–BÀò1Ô:ð˜XBâ-­Í€€ÐþÍäEðÒ5})-Û×ׇVÿñ9u…î‹TõZe36D̛ן¶œDq×ïH¯À5[F˜eýæûÏ8(ߦ ¢n}%OyÞUëöµ…cF˜t…g»=„[|µê¥M“krìïïGwÍç‹ibF@¼†ºsXÕyòh7 Ø´(¼ G•j%©FírBe_¤hÓS‡’èá¸ñëš”pû…/ÝIGFR=ÑâÒ:ˆGNâw‘Ö\a¼‰Þ ÞTÛ&ÏZ<¸ }6§-ùv{÷ÿèÑݸxåâ-?œX|@@ » VÙ%ç÷µëTøƒ F'€nÀ֯߇`€˜ãLàdbA¬€XYçc3ÖÇmAâ@tÚ¢„xkð¦µFÇŽ8´lCâ–/!… Ù%€1«ì’û÷¾øø[´æ§½9´âÙ·ÇDÅQb¢ùÒNžýÄx:­  e¥5QØМZV9DT:<_?‡V<ûöãGbhÓš;žýx:§@Ë*‡xá`a ,l3B ë VÖùØŒ…ƒ…MD¹¶)!€€5+ktìˆCËÊ6$nY“mNH  Nb¥Î1  !±raEüqRlU¿¢.þCSƯvaÎÚd5oÖtpßE¹øí/+ÿvÈ(æY9„ ‰A²€XeâèéýûIvßröôÚ¶å8ݾuVü°Óîû²“Åðƒ÷—gçV³{ÂêO$YÅFёץ`íÝ}Þ,µ³JIN±–q  `•ÄÊ*{"í_M< @ (WîCU 0™ñÄÄ$º~í¶Ù5å„÷®R‹ã4¼7Õýûæ;󵄄ûЉŒo¶¥ÖʹvåeÝøF|%%¥ M``>YþÀÀôgÈ0jã YU¾|ùl¤B4€¨À<+u6vÅøùúSJJª]»à—ü¿‚Å¢Åï0b-^ð?ÊÇ_îaÅ;øÖoT‘b¢ãhðK éøÑJMM£êb—à9‹^¡r!Åè«/6Òþ¿/Háټሴ3ä½64|\GúüãµôýüÿIû,rß­L[~?*[Z,V¹|rÑ =ÓÄ©]en-½Ög><C>bãÇæÿ©N3ç½DŸù”XÀ^éþ5}2³eÁåçð6ì ,ÄEíMŽt  ð´¬BâØ…2eËSä…캩Q“ÊÔoP *”Ÿ¦~ÙKÞÃcXë>@;ŽN¦#‘ŸQ½†hÌ;ËdÜÛ¿§ •KЉKŸÓÉË_PÅ*Á4´ÿ"Ç"·nõ>jÕ¶¹6“Æ}üÍœú+ݽ›DïŒnO/ hFÝú4‘BÅ7|2a5½7¶ƒÌãciéwÛéÐþHië­×D>•ŠÓ±˜ÏiÛ‰tòø%ZôÍVât¼ïÕ·ÿ÷:uñ zkx[z´zjÓ¾=×µ¡¼×žb"oPÙ2ìIŠ4  `‘ÄÊ"û/V®PNˆµë† "Z±8ñ¶õµê†È{–/ÙAÝ^lBeÊ!ÞZþÝ1íiÀÏÈVÕö­'©ßÀæÒíÛÏÏW\švï8›Ñ%X§~¨$v ùµæÒÞ91.–5ð\°9‹úSÇêË{9Mž<~tæT¬ÌgǶS4øíVâš?•,U˜f/|…<^)«ÙêãVUp©BTºLÐCñjN‰§*Uª¨Eã:€Ø$€n@›ˆ¬'¨[·…ÿ¼]´6¬§S‹]p¼}½x»úz6¦ÛO“¿¿¯ÜÖ^‰+[>½+íªèšãP¬D %Ór×\rrjÆ5å€ÅlÃÚƒôh-åÇÜÈÝ}¢.^—ß•MÊP«nyyM‹âãèæ+-`Âx1´¬rXù5jÔ ›q>ÒK.;¦Xœ.œ½–qëåKñôíÜ-T´X)<ÏgÆ=%Ó•.›Þª±wÔˆ»û¦Mú…¾ƒvÿˆ-òçOwð("Z{"ÏgvenÛr‚þ·ù¸¼žÓ"þ8AO=Ñ ûYå$î/'±Òà Ý³]iõòCÙ²Ô¦CZ³j/?{UŠÓ'~¦‹B8x¬ª¢øÌ›µIzû±ñðwQó–Q¡Âùmæå'Ze·oݕ颣®S!1NV©j°<_ÿË~9ÎÆ^•ª–$nUÍŸ³™…÷ ;T¼5à;éHÁ‰ýE÷ãÛ÷ä}ŽþÃùoßC-[¶qôV¤3+3Ù;iÑâiºvÉN¯=Gۃ/´BqjVwÕ¯:’.ÇÄÓàa­¤wᬅýhãºCÔð‘ÑòÃr§ ¯<{B‹–Õ)bÓ1áå7O:aT¢T¿ê(jôèZûÓ>êóJSúpÌJºzå&ÍùöÚ²ñ5¨6Šžnü!uc[ìÈ¡]çzR¼V.ÛeO¶fi~ ?HaMÛQÑ¢ð4ƒ‡ ä¿®8|׿7„‡‡‹Mõ©sçÎÙ5á1÷=z”æ/ú˜Æ|ÜRÌ)Êíðsq‹†[Cì„ax ê”ðÎcdžò¡ÅêNã9SiÂå=@z—¯œQ°PþŒ–Yìå\²´ÉN‘®SÙòErÿy#Q¶´ØÉÃÞpìp4ý¸ð MùèKá8’î¦oï½HŽ;v,Íœ9ÓÑÛÞ}¬@ËJ£Êª^½:5iÔÌþ3[ÙE<«P±!v²¨^«…ˆÖW.^ÖÀÞ…ŠPñmæ`·gÏš;w.-\¸0=’ãÅÿL§Ó™ž+ÇœOºX aöMCêƒTÊã“F…Š¢F5KRHHf®KhšÇ  à +gPµa³dÉ’ÄgœäädêÔ©“3ÌÃ&€èBÀü'´.E@¦   `ÄÊ:Ä‚€€ÄÊ•€"€€X'±²Î±   ±2@%   Ö @¬¬óA,€€€@¬ P (€€€u+ë|   `+TŠ  `ÄÊ:Ä‚€€ÄÊ•€"€€X'±²Î±   ±2@%   Ö @¬¬óA,€€€@¬ P (€€€u+ë|   `+TŠ  `ÄÊ:Ä‚€€ÄÊ•€"€€X'±²Î±   ±2@%   Ö øYF¬³DEEQtt4ݸqƒbbb¨X±bäããC©©©”+W®Œlý&ñ/Ûc;L•sþVòaá2 |ýλâIÇÇÑwß]e/N?ÞœÂÂÂD¹L“ã@œBb嬿Fccciùò(2ò8µiS“ºuëNÅ‹»oëäÌ™úí·Ý4jT¸¬¶Ô¡CGÊ;·ùCã @4$±ÒfVSÜ•¶nÝÚ°á'êÚµ=Hv¹eMçnç•+—¡!Cʈ.Ì;´ti·ú÷ƒªV­ên‚ò‚¸ ˆ•“**%%…fÍúBt¯ÅÒôé}ŘO!'够ÙÂ… ÐàÁíèðásôÅS¨]»žÔªU+ý „œA<–@戺Ç>¢ë,99™Þ|óuJH8GãÇ÷ôH¡2¥Z³fEúôÓéÏ?WÓÆ¿™Fá@4!±Òc¦ª©S'S£F%Å÷«Ñí—ùtêGÜr3¦ uïÞSv}ª§D €8Nbå83«w,Z4ŸjÔ¤¡C;YM牑,X×®­¢ˆˆ_hÿþýžøˆx&@¬4¿}ûvŠ=F½{‡ihÕ½LÒˆ„‹ûWï^…GiA Kb¥QÕ$$$Pxøb1VÕNΗÒȬ4sýúM³IÀYmß¼yÇì{é™[÷›¦Õâ84´$=ûluZ¶l‰æ`@b¥ÑÁúõk©aÃrT®\ ,’pyßM<Ò—ªUëKÁÁéwædØnÞ|M™òÕ¬ÙÞ~{Žð<üIÌßš@/¾øU¨ÐC¦S»ÿöíD1¹½œ+¥üý÷¿©H‘Â)ä®r)Gß:5¡Ó§÷Ó… rd7ƒ€€XiðwÀËEDl =ši`-ÓÄèÑ hâÄ—Å8Ðj:p`-X°Žöí;%$%% wñôúëÏ GŽb™¦4Z½z;(¶m›%Өݘ_¸˜7 +¶fd¶|ùÑj,V¤È—q-'þþ~ô iýú_rb÷‚€€$±Òàa×®]T»vÑZ) µt¼VßÒ¥cEk©…«têT4åÉãO'NDfäѽ{ 1Ï©SÆj¼*Æœ9ăG1¿Ëúý}ú´”âÆË;ñgÕªíÄ×´ O?]—ŽÛ'Zk Zš…-/$€IÁTú{è©§*j`)Ó/*ûóÏ ñY-×ó«]»2ùúúf&GµjU2;¯^=4c¼ÌÖýÜŠâ°yó>yŸŸ/µlÙÀÌ^NOrçöݘ%éÈ‘#Ô¸qz~9µ‰ûA¼“ÄJƒz?wî$ ”>N¤9i‚»ûÆû–öì™›!J•*õ²Û¼­û¹›Ž[fáár.XÏžO –Ö¡vírbìê$ÄJk°°^Fb¥A…§¦& ç„‚XÊ4qñâb7ðjÕÊÉ‹«Vm£sç.[õ ̼›Èžû{÷þuê4VŠÕo¿M3½]³ã`Ú±ã¸fö`@À; `ÌJƒzÏ—Ï_+æ&:txBt¡•ޅݤw;C¼öZ{zÿý¹bÿ«kæ‰-œÙsÿ“OÖ$v¶(]ºÕ«çœEhóçÏ+Ƭn[(!.€€ýв²Ÿ•KSr—ÜÖ­3„ëw¬tÜPœ7ƉJ•*Jý•éÆÎ6¬‹ü(…´u¿’Ž]í{ôxZ9Õü›BîÞÕÆ^óÂÁ €€Û€XiPU¹s;#O°5 Ü r$¨ÝîÜ%1vBxë]s³œ»Rº¿¿ö-OG -€€ûpÞ[ÖýÙØý¦»öÚ}“Î Ù±""â ­\9IÎÍrnqÒw)vn° àÉ VÔn–à5°è|Ç÷$þ¸&ärM6È@Àc ÀÁBƒªuÇ–•m— Þ-™-+»`!€€*ˆ•*û#ܱeeÿÓå,e. -«œQÄÝ + þвR‡ˆ–•:Ä€ØOcVö³RMyùò5³EaUzaD\Ü-¹N¡>:@@ChYi¦@@œC-+ ¸–*Uœºvm®%Ï3Á«m=ºÁó O àRhYi€êá`¡Î1 ö€XÙÏJ5%,TÑü»ð.\×Õ !@À+{(ÙHƒ–•: ´¬ÔÙ @À~+ûY©¦DËJÍ¿hYÙ"„xë VÖùØ‹–•-L˜l‹âA¬€XYçcWlRRŠ]é¼1O NNNöÆGÇ3ƒhHb¥!L˜z˜ y¾|ùŽÀp€ÄÊXjIïÞEËAMbâ= T‹Æu°‹ÄÊ.LÖùùå¡ë×oZO䥱/^¡Ò¥C¼ôéñØ Z€Xi@²B…ªbÇÝ‹Xò<FQ•*Õ<ïÁðD .%±Òw: Åñç4°äY&’’’éĉXªQ£†g=ž@Àå V oܸ1<C7nÜÑÀšç˜Ø¼y?=öX=1fà9…'Ð…ÄJì¹s禰°Ö´lÙÿ4°æ&’“ShåÊ=Ô¶mGÏx <€€® VáoÛ¶½è Œ¢¨¨«Yto3«WïcUu)44Ô½¥0ˆ•FÕÀ]]]ºô¥/¿\çõ› ^¸K¿þz”zôè£]˜ðv+ ÿš6mJ%K>Fóç{ïþM·o'ÒÔ©«éå—SPP†ta @À› @¬4®ý~ýÐΗèµ×>ר²ñÍݹs—Þ{o¡¿ëHuëÖÍ(ð™3g„óÉŒs€€€£ V޳‘ÞßߟfΜC †ÒÂ…þÝÏÉÆM}íÚ jÖìzþùþÔ®]³'9r¤t_Ÿ-ZJ’¯¯/_–×ïÞ½KE‹¥àà` ¡Â… Ë8­þá< .”/›[·nQÿþýiذa2?­ò€Ï&±òìúO·"ó'¼Ç?«±°lÙ²Ä% 4H¶°fÏžmv]‰wÅ7wÉ5iÒ„.^¼(ÅÂyrùóç§¡C‡Ê–Õ¢E‹è‹/¾-.m­R¥J¹ª(È@À 0fe€ŠY²d -]º”¾ùæÝ„Š1T©R…†NS¦LÝ}ç]N†w|X¶îV¯^MµjÕs·Þ#n}"€x/ˆ•ÎuâÄ étÀ®Ýmڴѹ4$œ&Þ–]}Ü¢Ñ+äÍ›W8£ ¢C‡ÑÇLëÖ­“¢Åž„ÜuŠ à} V:Ö9Õ¼øâ‹òEÌnÜF<©yÖ¬Y´uëVúñÇu-»ÿ0@l¿rP,á4•~ûí7ª]»¶tˆŒŒÔµlÈ@Àµ V®åm–·®^½J6mÚDuêÔ‘ã\<¾† àù V:Õ±QƩԟ[zܲ=z´Z—_çVßË/¿,æ¬í§3fPDD„­7ÞxC—16—@† àÅ V:T¾ÑÆ©,!`WúÏ?ÿ\vnÙ²ÅRÝ®±hõíÛ—öíÛ'¶dù’þüóOªW¯½þúëtöìYÝÊ…ŒAœGbå¶.\ {÷îY´lÄq*‹ÛµkG:tcD<×ÊR`=ž¥Gà®SóÛ»w/Í™3G¬v¿“êׯ/V¼MÎÓ£LÈ@À9 VNàÚ¢E 9eÉ´QÇ©,••¯}öÙgrÑYöÊËxÛnáüüóÏY£\zΘ{õêEÿý·X§p®¯† Êq·S§N¹´,È @À9 Vså—#/Îóe£S=T`q'äNœ8Q¬8[º’›¦áîLFézcÑêÑ£íÙ³G®ð~àÀbÑâÉÅJYMËc÷!±Ò¸®vïÞ--²—Ÿip‡q*Óòšó˾Aƒ4pàÀŒ%Ÿ8þøñã2o®h¤ÀKJuíÚ•¸.x…w^í=_zé%:vì˜‘ŠŠ²€ØIbe'({“íÚµK&5]qÇ©øåùØcÉm1ìµe”t¼!{ßñº_}õUF±±:yòdÆ5#°h½ð ÄuÂër9üq9Îņ à> V×ÕöíÛ¥ÅØØØ ËžlË-¼“/‹-·¹eÅ--eƒF‡sW±RøóŠ÷¼RÇÊ•+冘Ï<ó =ÿüóÒ9CIc훜ðê!C†XK†8l€Xe\ÖÛøeÅ“R•À­ ne±ÇœiwYPPÜ\…€[(FåÊ•£µk×Ê9V¼A"??§X°8pkÂhîëJýnÙ²¥\(wÕªUtûömâóçž{Nv…?ÂXä µIDATZ³Ål:wî,»y (m @¬4âÉnÑ좮~©+­,nyðÊá¼±áÑ£Gå âJ«DIoäoe>î"S ž6é–[VÜþå—_äÒYüÂ[NÜzV ýúõ“QãÆ“÷ª¥ÃuÇ @¬gfñ¯à_צEŠó»wï.w¿;v,(PÀ4‰Û—.]š~úé'¹›q``àC[š(îìnó@v”zÆ ²…™’’BÏ>û¬çb猬çpUªTI:Ùðš…Xê)+!œƒ@ö ˜¿]³oÇëï4+E´Ø›î¯¿þ¢¯¿þZz×y$wã-:²vaÞ¿_zÕyÂ3Zz»ûõ×_å‡ë—½ yœ‹·)1 ¼ˆ.ÿ@aìHcÚlšÇ Ž€X9ÆK55Oæ_Þü¢ªR¥ ñjäÜ…Ä“i=-”(QBŽÍ|÷ÝwÄžƒŠ8»»“…=õôä“OÊV·¶¸k—7©lݺ5mÞ¼YÞÎkr‹šÇóx}Hna)c{öØGËŒ³=­åòe\å œÑÑÑò—*¿Š+&_’ü"`PÏsâsþ(Î|¬ÌâtYÏùe«¤ÍŸ5-Ÿó‡Ó+/iv0àUx(^V‰×Ñcá≦¡¡¡T¸pa¥xnûm‰?¿”ÙÅ}ñâÅr>hvÿ6e”•§¥óœòg›Jýòß×GÑ¢E‰EÕYü›4i"Œp‹š=}ä2F<^çÊþ$E/þ®¬käîN@7±â-'–.]*÷|Ræ.¹;Ìì–Ÿwßå‰Ä?üðCvM8|øg"Óƒfî8°‡€nbÅ{#ñ¢Ÿ<‘äØÕálj'׺"€¿9e;t%óÜq `‹€.bÅмý‚QܶmArE<ï}ÅsËÖ¬YãôìÀÿaÄ®äÿpî¸ `‹€.bÅË'±÷Ï;BÈ$À«uðÄRî¢sfËt]Åßrî¸  `€.bųþy›wsüëžWº8räˆy„Ægào¨«ø[ÎWA¬ÐE¬x‡Ê•+[+—ׯU¬XÑé›ö¿úŸ—+ø«çŽ5ºˆODÅËUÂ+Ë;{×]ð·Ìž¯º‚¿zîˆP# ‹Xñv– ð’=–Ö›³œ:{WÁ_›+ø«çŽ5ºˆ•²Ï‘Z¡¼ù:¯|ÀËô83€¿:]WðWÏ1 jt+ÈFP'àl>ζ¯þdî>îQO(¥wÐE¬ðËÞú™³ù8Û¾õ§3~,ø¿ŽPBï# ‹Xy†ŠÎüSq6gÛw&WØWPF à]Ä ¿\Õ+‰Ù8›³í«?ñc\ÁßøPB0]Ä ¿\Õÿ˜³ù8Û¾úÓ?ÆüO%ãÐE¬ðË^ýÁ¿ìÁ__þê¹#@@€.›/^½zÕÛ¹«AÑóúÍ›7)--Í©Eu¼®à¯ž;b@ÔèÒ²R+ ®ƒ€€€%º´¬J”(A­[·¶T¯¿våÊZ¾|¹S9€¿:^WðWÏ1 jtiYa€_­:H:W8›³í«?ñc<ÝÁâúõë4oÞ<Š—•±{÷nZ±bEFÅ,[¶ŒxU~0]Ä üêp°PgãŠWðwÅs¨åMï½÷q ’ÃúõëiÚ´iɧL™B7nÌ8Ç…€.Ý€øe¯^ý®øeþúòWÏÝù1µkצ[·ned4aÂâ<¨â E-+CUGzaœÝòt¶}"u¨Hàã.$—ÐE¬ðËÞzÝ:›³í[:ãÇ‚ñë%ô>ºˆoþ‡`™ÿªw6gÛ·üdîqÕü݃J Æ" ‹Xá—«ú I¾|ùÔhþê]Á_=wÄ€¨ÐE¬îß¿¯V¯¿~ïÞ=*P €S9€¿:^WðWÏ1 jt+ÞõÆjeòêë—.]¢òåË;•ø«ãuõÜ  F@±ªR¥ ={V­L^}ýܹsTµjU§2u¼®à¯ž;b@Ôè"Võë×§'N¨•Ék¯óxIdd$Õ¨Qé Àß2^Wñ·œ;®‚X# ‹X5nܘΟ?o69ÑZ!½%Ž—¾©S§8õ‘Áß2^Wñ·œ;®‚X# ‹Xñ˜IË–-±¬‹IÍð¯úˆˆêСƒÉUç‚ÿÃ\]ÉÿáÜq@À]ÄŠ Õ®];9nk«Œ^¿uëVªY³&…††ºäyÁß³«ù›çŽ3[t+îêêÕ«—ÜÃÙ› Ú‚ w|LL ýý÷ßÔ»wo—ü3QëÁ?3wØC@7±âÂ5mÚ”*W®L«W¯¶§¬™&!!–,YB¤   —>#øéÉߥ•Ì@ÀÍ è*VÌîÕW_¥3gÎФI“Ü¥ãÅOLL¤3fPÛ¶m©nݺŽÐàð×—¿U àt+š={6•.]Z¶°¼eÅ븸8êׯõíÛ—Ú·o¯ÛøëË_·ŠGÆ àft+æÅkÕ;–’’’hþüù¿ºÅÉ“'é믿–­IîŠÓ;€¿Þ5€üAlÐeóEK…Ê“'ÜÁtíÚµ4kÖ,jÞ¼¹Óò¤EWyÓ» 6èón­Î^©Âgµkà¯F×AŒ@ —èv{Ý‚„‡‡»tîÜ9»&,ÞÇîì?þø#:uŠ5j$'Ê)RÄbZw¸È«Rìܹ“NŸ>M­Zµ¢Ž;Ïu2j£Ö Ê¥F€{ffΜ©ëîO`…!ÅJáE›6m¢]»vÉ—;kñŠäìÁÅžs>>>”šš*»•{X{¹5ÆÅ%žM59ë9ÛQÒ²ÓxÓc%ޝqz¾O Š}¾Î«šûúúÒ•+WèòåËT´hQjÖ¬………9}u ¥À_îÈ@ @f?ˆ€€€€A @¬ Z1(€€@&ˆU& €”ÄÊ ƒb€d€Xe²À€€€A @¬ Z1(€€@&ˆU& €”ÄÊ ƒb€d€Xe²À€€€A @¬ Z1(€€@&ˆU& €”@Ž×\µj•A Åð»wïö–GõÚçÌ‘XuéÒÅkÁáÁAŒC`ÆŒÆ) Jâ9ÚÏÊ)%‚Q0'°cVæ@p  `@+V Š  `NbeÎg  $±2`¥ H  æ VæA$@$@$@nO€"Òí¿@$@$@$@¶ ˆ´Ÿ    ·'@éö_    Û PDÚÎŒO €Û ˆtû¯ €íbÛþHà'/^ø?‘@48qâ„<{ö,Zf“®H uëÖR¨P!WÇD$@v#!¹dÉY € ("m€Å¢®Câ£qãÆ²hÑ"“ „È‚K•*•i ÏŸ?—ZµjÉçŸ®× z{{ ¬}S¦LÑe òðDŸ\¼xQÚ·o/ëÖ­Xà`U\¼x±.Û¦MÉ™3§`¸Ÿ+W.hDB >&L(;wî”Úµk ,q[¶lÑù]K–,Ñ}Ö7Ô?XyáÂ} Ä,ÖDæÎ[þúë/Y¶l™\ºtIîÞ½«ûÛ¼ysÝ?–’µqbÌH?ýô“T¬XÑÒã¼G$@$‘«V­’âÅ«IÌTy#Ð>j˜ÆlóÝϲsa+{TçuÄŠK "ˆGXwìØ¡­ŒnF‚eÖÈ‚ ·ôÙTø€)W#ʼnG×e|Æ´8¬Œ°Bèâù›H˜~F‚…¸4,‡8&Ož¬-ð$7÷Іˆüæ›oŒâΘ&‡eÒ<¡=´–¾˜?‡iãsçÎééy܇ðÆ÷ õ`ZÞR ­ ô/oÞÿþ¿qޱ"?^,'OžÔe ž!°-%kã4Ê}wÆ}žI€H€"F B"Ö‚ úc±îðéðÀõÖÏ ïãnû,°|a øƒ>&V0µc§±Ne0 á‹)^[ú+$¦ýK”(¡‚àƒb"2¤Z˜ªÇZQI¬+íß¿¿Øð †ã m ÁåÌ—ÀÚûôéSÝ´µq†Ô7Þ' °Y"íÓÖ ÊÆOß%#¿¯)‰Æ‹Ò.¼y ž¼4;|]?yöJp<}þJ<ãőĪúHäaºN™«ëäIãK¢J0*Ñh¾F0¤~xŸº)«÷Ç‘ƒG†T$Â÷aÅ;}ú´vTAè™ð&XÝà$ ÚT8Ö0b-#b="l­ ÏÁ’ !‰p7æÉÖ¾˜?ÖëÐÚ€Õ–E,0OpÚCXcÍ%®ãÅ‹§=ÃQÞíðd‡XE²6N]À†PW—Ndͺ6<Å¢$@$à^°«-‘nòÎ!îVl:)ë¶‘+å–.-Êɶ½äâÕ6x¥àÝÏõqïŠÿ/ï=|®„£¯¼xé'^Éâ‹—²z%K )S$”|9SKÒÄñ´hÄ9ª-Ÿ6 0„ $ÐSº!d‡ù6‚™‡%a=",¤X·‰6 @ ž mÚÒ— Ï†õshm ¦¥„é{F *2ƒ.°6N£žI€H€ìK€"Ò¾<²¶]–9–\YSʨ¾ŸJ %î²dH&ÿìùϹÁè<,…7ï<‘Û÷ž©óS¹sÿ¹¾¾£>¿zýFÒ¥N¬êˆ/)“'Ôb1‡šV†X„hLª,‰Lö!€_yùòå“aÆ٧BÖB$@$@v$@iG˜ŽVÕ•ëdÚ¢ýZøukUAòäø/ˆ6úš%Cr¹vó±¬Ú|J;¯@0âxõÚ_ Å i“J*% æN#Õ*ä”4)Õ:>5ýÌ5Œ@ãQÓ[!  ÛPDÚÆË)J?S) V•ýG¯I“:E¤J¹×ÞʼnKYÈ…+÷ÕÚÈ4R¾D-±V‘‰H€H€H€¬ ˆ´FÇ óÖþsZ–o8!Ke• CëjïfkÃȦ¦¢ åI+•Êd·VŒy$@$@$@$ˆEd Îýá°÷9‰û©„Ù$kÆäzŠ:mªÄV…$¦´/«iïJÎ=töžH€H€H Š PDF1ðÈl.{ÖôÒ´N!½®ñà±ëúŒ@Ýñ<âHÚT‰ôT5D%cpÆG8×>q=2»ÅºI€H€H€\E¤ ½Ô$‰H…’Á÷2~ôÄWY%Ÿ™œgNŸ¿«¯ÃÑÓ#¶\»õÄ…(p($@$@$@QA€"2’(çÏŸ_~ûí7ùðÃ#©…°W«ƒz+gÄk4OØJî® ßZÀkógxM$@$@$@ àt{gCø\»vÍâÛ{ýúµÞ¹Â|Ÿ]ó‚z§ ó{Æ5v|¹wïžñ1ÐõbÇ’vÏxóæM lì°mÙ9a7˜4jZ;µšÖf"   [D»ˆÄVr؇xÚ´iÁú 1¸víZ½ß0„ãßÿ-)S¦Ô˜3fÌ(¿üò‹~â°W¯^‚],J–,©w÷X¾|¹Î»pá‚$NœX[ñ,öé­P¡‚<}úTçCü}ýõ×úÙlÙ²I©R¥dïÞ½:eš6mªwÎÀÎ5jÔ»wïê¼ï¿ÿ^Z¶l)•*U’L™2é2S¦LÑyEŠlçV·n]5j”ÞëwÆ bIÜ^¼xÑj¾®ÿ €ƒˆ «ßŒ3´˜+S¦ŒtåË—7¡ÁÞµƒ–,Y²È7ß|#Å‹—W¯^I³fÍdâĉòìÙ3ù믿;z@„ázÙ²eréÒ%-ò æš7o®óP)ÊïܹS[0÷íÛ'çÏŸ—•+WêöPÏBlÂYºtiéÖ­›ÎëÑ£‡ÜºuKï™ ËbÚ´iu‰þÌ;Wúöí«ûë®]»ÊÉ“'åèÑ£Ñ ÑûÕW_émîºté¢÷:th K*¶³Ã6x!åëŽDÁ?‹V{ËB[’‰H€H€H€ÂB JEä¡C‡¤sçÎ’>}z™={¶têÔI‹49X—,Y"ü±Uׯ_—yóæ‰ôïß_‹>X›4i¢Ç« ÊcoÞéÓ§KÆ Mû öÙgºõë×›À"hì\®\99sæŒÎ›9s¦´nÝZPw¼xñdÈ!Z¸B$BèBH¦J•Jüýýµ¸üçŸäÉ“÷Ž(|ðî/*‚Õ±hÑ¢²nÝ:S›¸ˆ?¾ 8P ×Y³fÉåË—¥@R³fM-^Ñkùh7*Òµ5â£¢)¶A$@$@$à¢LDB –(QB[é8 ØÒ ÖBˆ,¤ŸþY A¬7nÈÔ©Sµ¥Ò` ñ•7o^ã£>ׯ__‹?äÁ‚hž2gÎ,·oß6Ý‚4’§§§i½bÐz1Ý~á>¦Ÿa!Ì“'> !€±)GŽF•úœ!C¹ÿ~ {Æ8¯`ê‚ãóŸþ¹Œ?^ -ߨ'*ηUX ÿ‹M=xôBÞ½{g1ïù‹×òäéK‹y¯_¿‘¾Ž½FÔbÇy“H€H€HÀ"(‘u°8B€`M"Ö0bê×HX_د_?m}„ØÂ´5¦äå奭yÆgœQKä–E#ßÛÛ[ Lã3œH,¥ õBàÁ«Ú ,ÐÓÏX“‰)ïU«Vé5¨+¨#ÖR¢RzðàL˜0A*V¬¨­¨¯aYÅ3¡å‡T¯½î_¼ú@ ð)ßÔ˜/nÜ~"gî–2u'Èý‡ÏuíÅ ¤—Fµ «µ¡q¤kËòz7› ;Îi!D$@$@6ˆmCY»…# <®qXr p0`€¶º¯iX3>žÛF‚-ðê~ôè‘„:1è>xR Î6°n¢NX!V”3gN9v옶6"­y`n¬Ñܱc‡@좬! ñ<Ä#,ªX‰FæÏõãŒþAH†”o^6¢×~~o´Ø›±ä€ì>pYüüßH?ey,Y8“ÌýûH°Ýn åM«æ ÁR€›NÊÄY{Ôu )œ7ë¿?ºµ./wî?“Ž}—È}µf²J¹2iøçòR‰H°ï2`¹~Îèú4IäñÓW’$±§q‹ç€£þ;A„D5€uAîË–-+ƨž’ €EÑ*"Í{R‚À2D™¹€4ë.q„'!$¥•/_>KYúòaµ”·2´dŒ+´rÉ¿¬¦«ÿÞxBæ¯8"—o<X!§ m$Ke3U}=Èö‡GNÞªåsêië¿l+¿VÏ¥Óå³WüÉôÜ…+dÐ7ÕdT¿Zrâìmùvø*:~£š¯­Ë,øí S;²§|îH¦ô¡³15†‹¶í–Üù‡¡¤kAXòñÄwé£>Ò¡®à˜†eø‘‚Ý“"{Y„+QÅÑÇÿÁ•ÆÅ± €½ 8Œˆ´÷À"»>Y¬“tÔ„©ä.ÉôÅäà±krùú#µ«Î[‰;¦|¤„á#HÖŒÿY]1Ž ;ÎÊñ3·¤@î42ké!¹}ï™Ô«Q@ö½*É’xJîlï=Ü—¯?®×Q>Ú#&m•t©˰okèg1-Žg“'/åKd‘És÷J‘|éÔÒƒX2ð—õz:ûðšvCWXÕ= cyp•Ýêt†Š°žuÙoÉ–>™”ÊvGDöáìIÔQ.†²§‘Ó>eëÚµ·}¾\©¥d¡Œ¬ÈÎ0ΨïS)^Äòèî Û# G&à4"ÓÙØ%k1¥mž&:˜¾3¿6/cïk¬t´„©ãó—ï˲uÇe‘Ž¿÷’F_“$Š'õ?)(cÔ¶8• «cÍÖSÕÚEµ=¤ Õ3uT#ÁÔsíòÉøé»$cÙázÍcÙb™¥CÓÒÒû‡ÕR¹LvéÞ¶¢Toñ§¬^Éè2ÓG7Öx¦ýÜHêuœ)Ê —XÊj á:g\3»£ûPM¡»S‚€üá·-R³J^iߤt¨C‡óÔßNÈÙ‹÷´Õ8ÔܸÀ…+÷åÖê§nL€C' °p‰¸’£GÖ^Ü_|ñ…^kh qáÂ…:Þ$D¤ùµ‘oÏ3Âø` '<¸-8}I>j¶_®+§™·o ;á½lÓ°¤”(”A¶í½ ¼©ãjê'jmb eêÛ¥Šr–‰-q•ÃÌU5å9CrñT6H° n[ØY0-žT­cLª¬’Hƒ»?QÞÖ‰µÐ¼¼»¿œ¹pWR{%” iÿ›ªÎ™5¥ÛÐSåÝS–Ð)˜'m”¬ÿÔtÑÞÊè?·KŠdñÃ$ aß‘«zÝêàîÕ]” ‡E$@$ÕœFD"Hw‡t(x8#ôOXâ/Â’‰½³ƒ&lÁˆp@–òpëÌàd$8¡¾ éõë×:¸9<¼-ŤÄÚ5$óº‚ÖÑÏÙ³¦—+d”%k‰²H C9ÅÀ"嫦º}_âð“ù+ʘµU(Ÿ[òZ­W|¥‚‚¿zí¯¦½c)§ŒØ_ É8qÔµ˜ÆO݇،/®˜1ÿÿ~,‰'¶¶`Â÷ÿŸÑgU>qB]q#㪺PGT8E”©£=kóe÷®-Ë…©{+ÔzØýÞWå=k˜~„éA"  +œBDÂûq!á 1†-Ã"" á~Ž?.z;Exfc=#¼­{öì)ˆ VxZ#8öòF{ˆ1‰ð>HpL€pEø„ôAàÕ}µqþî»ïtàsx‰#ýñÇR¯^=]>kÖ¬º WGÛØÖ1²R|OÞû#5Õ\F~Ÿ½G–«éKLÍb{cÿO­[lÛ¨”© üÔÀtm~éRˆI?}~/,ýüpF¼¼±Í#ÿ—:÷QeŒr¸‡]kŒÏ˜2‡ ‚ð„ЄPÅzM|Ž'¦±Æý@gˆ[%B!¢ t-‘°Cȃyl¸VÓé¿Èƒ—9îáep }[äE¶À…5Öâ7ê Ö¸6ØàÖ´‚Ä>˜ƒñ3µ#К-§Å+yù±Ï'¬˜¿C\oÚyN>2¼×Ç’0ÁûˆAËð3 „‡€SˆHLQgQÂÛ&b‡ÄY¼{÷n¨q Û´i£CïìØ±C["aÉlÑ¢…ìܹSÇ¥\¶l™Þ…VHĆD!lɈàçðò^½zµ¶Bb*ýÇ”7êàæÆþÙŒ¨çÒ¥K:ð9ÂaºÂâÔÏÏOoáˆ}À±OT¤Ì’ÉȾŸJçæeå7 áyàA}óÎS8zƒ¼ x'íÕšFkI‹:%ì"3AHA@A`B0é³q­D(î!¶$<º2þþoµð‚ÀE!C„¡,®á<„zQŸq{FÞ[%\Ñf€²L(ZÌ©{(Q‹rt¸6%Äg¬X1´WSß7Îȃ•)èUÔ¬>´²ê¤ê“¨Eà ±‹3–àÖZbœ±üçÖjI„!Â&U*“M¯IźUKiçþ‹²L9AÁi,A°TŽ÷H€H€H <œBDb*â©Zµj’$I=­ Ý!%X!±Ž¢ÓË8à S¤H½]áÌ™3¥uëÖ¦­‡ ¢cM¢>¬¹4Âó`Güá?uê”Ŧз† j‰°`"¾%?;æüôÓOz«C‹DâÍ,ʉe´r¢éÜ⽘\µù´`kÃAc7hõåe#±õЫ6,€nÎv”Φvz*Ûþ½ ÿ¿I[&áàT¡dVÓt5<òáa?´guI©½3‘ €½ ü1ÚÞ5Û©¾³gÏê­GŒ¡×-¦M›Vo'ˆ)mk –AlµX´hQS1#†äíÛ·åòåËz ÛÈL‘"…4oÞ\DðïO?ýT[#;uê$?6Š;£žÒ¥[õÐÚ0‚”GgÊžÙKÆúLÖÍl']Ô:ºxqdИ 2IMy39'845ý¬¨LþñsiX³œ‰ÃêK5µ½p•·Œü™ÀÍD$@$@‘EÀ¡§³á ‹#¶Ì–í¿Up8°õðáÃ-²Á6„ˆ)‰ýµG% &ÔuÁ±SÕuëÖ•Å‹ë©kX±ÿ6¶<„Ó ¶@DÜIL_½zU—ÞÜH°nBœ¢<­kÕª¥§Ö1¥61 ¯nLe[ÚÊÑbgítóêõ;²hµ·Ü}ð\îÞ®CºÀ#¥rÄHí•HR©ð;8#Vd'5Å- » ^n÷Ýcì4Vc#ì[Žw‹ƒ‰H€H€"›€C‹ÈM›6Éýû÷¥Q£FÁ8àDä°aÂåáFìØ±µh¬_¿¾Ž Ïi¬¥„ã Rß¾}µó ¼²1• ‘ˆµ‹ØV±_¿~z#Ö6ÂÒƒµ”²XG ¯ðL™2é5Xw ñ Ë#¶C]°hΚ5K;ýà:*ÓYŸkj‹Â¤òQ…œRUßN2‘Þ5&¤> ð÷çÊ*™CMw3‘ €-b( Ú;콞DŽ·xrÔk œb "n'è´4¬ŽØ·VHóïë‡êgp×°<Æ_C¬HˆO#a¿ÝGiðÊŽê„x—ÚÖ“:•SËÚ­g¤vÕ|z§8¯XK_ö]"?ôþD;gX+Ç<p‹5MíXóã¨ßÝeÈ' ØLQmÚióˆ,<X¸pa 9ïo¥NÚb¬–8ŒTdš H”Á”¸á¸c<ÕgÄ7„eñƒRÙô„=‡­Ô1#±¶¥ô良 ø÷éów$G/½NÒR9Þ#    \^D°;|FH—>>TSÛ×eÒœ=’S ÄV JH²$ï­¨ƒó—HöÌ)äÐñëz-ås0Ÿ1½3žc|AƒÏ$@$@$@æ("Íi¸Øu±¤`î´zçš^?¬–z5 HÍó˜v:9¯¶F,Z ½¶^bèÏž¿Ëój:oËn™<÷_½› Deάï…e¶L)L±] —MÃùsÁQ9îóHírÃÿ„lŽÂ>•Q}>Ðk|Ãñ8! ˆ$ü I`¥Zì€Ò¨Va©¤TO]¸_¶ªÕí—’¼9Sk±Xç£ü¦®&JO‹JK#ÝSžÞ›ÕžÛðüÆÞÛ)’%PÓßï-–8gÉ\oh<ãçC§J¿¡¿ëõ´î0Þè㊿ËÑS'¥F¥ÜÑÙ ¶M$@$„Ed ®úžÚý¾ª*û^• 3vI>%"}.Ý×k!­Sã8ÊÏ¢‹!Žæµ›•UK%.ÿÙs^o§˜1]= ž+[JÉ–)¹¸zklUg­ kc­±d^ø ¬ €ã ˆt¼w©=*¥‚É—Nf.=(y²§Ä´%Á»=Súdú¨¢Â!a/jl§ayôÔMìú¨<}þÚÌZ饯ƒ®É´¥]–%  p,‘Žõ>¢¤7qãÆÖ^Ûöj S湕 Åa¤ÊI–J¬¯„µòÏy{ÕZÌÚò™C9í¼·Xr}¥Á‹g  p6‘ÎöÆœ¤¿°pVOFÂ9†°\ºî¸¾Nž4¾IX"ÌP– ÉT øXÆ#<“ 8(ŠH}1®Ø-/µý"Ž2Å2ëáa}åõ[OLÂN?7ï<• iÕúJ%(a±„WxÚT‰ƒ‰wE> 8ŠHgz[.ÖW¬¯Ì˜.©>>4[_yùúC%,ȱ3·tx¢GO^jg÷ÂòýúJxˆ3‘ DŠÈècÏ–-ÀúÊœYSêÃÈÆúJlEa¹}ߪyF˜!FÇKÏxqŒGx&  ˆd‘?–ýû÷ˉ'"¹›¬>4Ø;ûüÅ¡sÊ|¬¯,”7>ŒMÁQ©Lv]Ó›7rùú#í¸sÒ玬Ü|J=ñÕ;ìSápÜáúÊ‚çã$@$@nI B"Ò-‰qÐNC¡‚´3޲@éÕ+ñAüJuì $û*Ç÷Û8®Ü|Rí¾óPªu˜†E¨!8ï0~¥AŒg  ¡ˆä·Àí à9Ž’…3šXܼƒõ•ï…åäÆí§’Ú+¡IX¾|åg*Ë   pG‘îøÖ9æP ¤KDp|P:›.ûöí[íayúü¹ríN¨u° ¸2ŠHW~»›ÝÄŒSMi{飆䖓ýíV7+"  g$Ó;Í>“ D/ŠÈèåÏÖI€H€H€HÀ) PD:åkc§‘À»wïdÊ”)Ò´iS)S¦Œ4iÒDÖ¯_®¡`—¨îÝ»ËÁƒ=ÿäÉ}ÿåË—b~¨? €PDÚ"« ÐøûûK:udÀ€R°`Aéܹ³ÄW4h #FŒññ~ýúiQ´Àøñãe„ 2vìØ@YÏŸ?ä½~ýZ̯²ã‡úgÇ&X €ƒ cƒ¾v˵üñDzk×.9yò¤¤K—N®U«VRªT)-Ûµk')S¦4 úÕ«WúBû¢›'X-Z$½zõ’‰'j±˜0aBó"!^ÃzõêUI•*•xzz+wçÎÁNTñâÅ –÷àÁIž<¹ÄˆÔg©¡µ‡a%E;L$@$@ÎK€–Hç}wì¹øý÷ßµõÑF×a‘\¶l™f7oÞ™>}º¤OŸ^:tè “&M’™3gÊgŸ}f<¢Ë§H‘B† ¦­™K—.5åY»X³f¤NZJ—.­Ü7ß|£vë Ð\¹rEßÏ–-›˜ 6”/^è¼ 6Hž”3gÎh‹)¬œH˜²:t¨Ü»wOŽ=*ýõ—>|X ¤…±Ñ¿ÐÚÀØ0ýŽ19R×ÍH€H€œ—E¤ó¾;öÜI¼yóF[ü,M[¬u5jÔ°8¥Œ©è­[·j‰gᜃÏpÖÒ‚ ´±V­Zº,¢pðY¾|¹\»vM¶mÛ&}úôÑÂysæÌ‘råÊ ‚¬CÐ6jÔH‹ÈsçÎé2šA“µ6Œ²7–.]ºšº7òx& p.‘Îõ¾Ø['$€)êÌ™3ËæÍ›ƒõÖGLKCœ Ž7!¥Y³fi‹eÙ²eµƒ4„^HÏà>,˜Æ6OY²d‘[·né<¬sÄ”µ‘Š+&*TY‡eñü¸qãÖSKÉZFùB… —<“ 89ŠH'ì¾s(Y²¤¬[·.Xga„—u¦L™‚åYº1cÆ -:÷íÛ'88 ]»v uJÓåA­‡˜šF»X_ 1{ñâES“[¶lÑ¢ÓÖÔSß—.]’¿ÿþ[$H`*g~a­ ór¼& p ‘®ñ9 '0jÔ(ç3œRà™Œäíí­g°F0¤©î8qâÈÓ§Ouù;w `:vì(p€1޶mÛÊñãÇu}º …>ýôS]ë ‘°öN0˜‡ÃLÞ¼yuh 8Ó ŸXço´—,Y2]Ïaúb¢ɼÖÚÐ…ù €K ˆt©×ÉÁ8*LgÊ·råJIš4©$NœXŠ/®jà¸RúøãeãÆzM"¬X+i ÏaêN1ÖlJ”(¡Yêׯ¯ËfÍšUPwË–-õôôܹsµ¥–IL9c $¢×®][Osg̘QðÌâÅ‹µˆíÝ»·^‡iÞ?km„4>Þ' p^Œé¼ïŽ=w2U«V½ÖH¬A4·@"¬aá3†V­Z5íM 撚QõɨbÕ¸FâJ¶oß^—…ÓØF*Z´¨`ºoìØïÿ×€3¦Ü±Þõá@ƹ8»âde$@$@$@$à("Ýã=s”$@$@$@$`W‘vÅÉÊH€H€H€HÀ=PDºÇ{æ(I€H€H€HÀ®("튓•‘ €{ ˆt÷ÌQ’ €] PDÚ'+#   ÷ @é$   » ˆ´+NVF$@$@$@îA€"Ò=Þ3GI$@$@$@v%@iWœ¬ŒH€H€H€܃E¤{¼gŽ’H€H€H€ìJ€"Ò®8Y ¸ŠH÷xÏ% Ø•E¤]q²2   p‘îñž9J   °+Øv­•‘ €"pùòe7nœ >\&LhbòîÝ;éÑ£‡´oß^îÝ»'+V¬0å½@™¤I“ÊèÑ£ƒféÏõêÕ“J•*™òNœ8¡ËgÈÁtoß¾•ÿýW|}}¥téÒ’8qâ@ùQñÁ×÷•9â#åËŒŠæ\ª!C†ÈG}$*T4®éÓ§Kœ8q$}úôQò=Bã—.]’ãÇKÁ‚%kÖ¬º?‡–Y³f™ú#F É’%‹|öÙgúŒŒÕ«WËæÍ›MeÌ/êÖ­+•+W6¿å4×´D:Í«bGI€HÀyܺuKƯ…›y¯!"qÿâÅ‹‚뀀}\¿~]ßþü¹éò!4Qç/^:üýýMU?{öLªV­*6l0ÝÃ…½zõ’–-[J¾|ù}‹ŠäïÿFöì9!?ÿ¼@:w«DÄ!Ù²åPT4íRmüõ×_âíílLkÖ¬Ñï;*¾Gø!R³fMùðÃeèС’+W.Y¸p¡îÓÙ³geÊ”)úÇ’ñƒ ¢²hÑ¢ráÂ]fÏž=²xñâ@ß_ãûlþ=6H¿AK¤ƒ¿ vH€\•@•*UþÈ.]ºT~úé'I™2¥iÈGŽÑ×°F¦M›Öt߸xýúµtìØQ¶oß.wïÞ5në3ÄE›6m¤S§N2xð`AÙZµjÉìÙ³¥OŸ>ÊÚëĆ·÷Ùµë¸:tNrçΨ¬¤[·úÊZXàÚ«Mw¯'²¿Gà;aÂýý:}ú´xzzʯ¿þª~ü,7Öøãǯ­îÆ»¸ÿ¾šË–-“Þ½{ëÛyóæÕbÓ(ã gŠHWx‹ ¸)˜1cêiNLuöïß_0•h¤sçÎÉîÝ»eΜ9ú–‡‡‡ª~~~F»OŸ¾¢…ãÞ½§”åÓK ÇÖ­?–D‰âÛ­ Vy¬}Ðê´iÓ¤E‹Z@âsçÎõt5®-%Ã:š={vKÙ.s"Òe^%B$@®K`ìØ±J%2 0]ºtÒ®];½&®C‡úþÈ‘#Mù¸ÀTv¦L™´ˆ„H:µžÒÆZK{¤+WnËÎÇ•P=®¦2=•˜-(£F}))R$±Gõ¬#„ç{AhLK—(QBSDFy¶K$@.LÀ°Âá%UªT¦‘ÂCÉÈ7e„rñûï¿[\ií±X±béìß~ûM`¹„e¢råÊ•‘… ç’²esè)l¬„GªTɬuIy“V@Å­–qõÌví&Û4D|Wð= š`ý3ÿnÍ·ô9"ߣnݺIýúõuµh·X±bÚA 7 ,üñÇ@Mâ3D'ràÔ‹¸+%ŠHWz› 8„ÙˆÛ¿¿˜¯ 3¼la©‰ì„©l¬ƒD˜ #%IbŸ©æD‰HÓ¦Uõáãs]‹ÉþýÿÒ"Ž48’$ù/´‘Ñ>϶@¸|‚&|—à-Ù Ë ð=ÂÙHaùÁ –OWN‘®üv96 ˆ&nuêÔÑ–˜Š+ D%Âø Ôœ`Œ{‘Ù=ÄDLÈ1cÆhol„ö“aM²WÛ9sfp¤9~ü¢Z#yB…sÙ&Ù²¥ÓÖÉÒ¥óJüøñìÕœÛÕƒÐLmÛ¶UËÖh«¦…aá{úô©Ýߥ%¸˜jþâ‹/VL|—! ±¶2þüêg“è%°r#½yóF[»ùåiÔ¨‘©JôÛX[iº©.ðßJŠ)Ìo9Í5E¤Ó¼*v”H€œ‹Bé4hÐ@`I‚˜{üø±ÖŒÛs„˜bœ;w®4kÖL>GûìüÝwßÙ³S]… e×G‡µÔZÌsÚB9cÆz)P «Z‹øŸç¸é!^„J iÓ¦ríÚ5iÒ¤‰^ωil„šÄ9r„ú¼= @´BºXÉ’%„ïÁzO¤‡êJ¸Æ=üHÂÇŽKJ•Ê«W¯üdß¾SjW•ÝÊ;¼†=ªw»:×Vl¼G¬‘„˜³”"ë{„5𸆇5œºð]6ÖÜBäâ°–°>2èšIkå%"ÒYÞûI$@NJb²xñès&·l¡B…¢^¼xq•CM}D['\ aXø0…)*–aDçølm›ÛÚJŒåI€H€H€H€„"’_    › PDÚŒŒ PDò;@$@$@$@$`3ŠH›‘ñ    ŠH~H€H€H€H€l&@i32>@$@$@$@$À8‘ü €nÞ¼'7ÐÛzzÆýÿ³‡àÚÓg‰‡bmÄÊâNF€ßp'{aì. D67î‹¿ÿ›ÈnÆ©ëüø™Þ;þ¬j?yùÇkÓáëûZï§Œ=³ß‹Ê÷â2mÚÒªU î¥íÔoŸ7PD$x& 7'pýú=Y´h«ìßFíw]ÐÍiX~¾|Ù$oÞÔzìþý›KŠI‚=H\>~ü\~ùe‘|ùeí`eyƒœ‘×D:ã[cŸI€HÀŽnÝz ãÇ/‘¡CgH®\eР–¦}íØŒËUÕ¼y5©V­„ 0U®^½l|Ø[9aBOµgwRµ×sj9tèœ|úiÁö}L$à h‰t…·È1 @8ܹóP–,Ù.GŽœ—ÚµËJ§NuÄÃ#®øø\GmîùÈ'Ÿ”–äÉÉÿþ7Kzôh övÎj„ŸŸ¿ìÜyLFîl1Ÿ7IÀ PD:ã[cŸI€H =zfš¶®Y³´üöÛ7/^ÜÔèÞ–.O’$I¨¦ªJëÖKùòÁ—@@fÉ’V ÎÄî ‹£w)´©»Ôëä`H€H d¾¾¯dÞ¼Íòí·¿K²d‰´xüüóJ!# sNž<™dðàÖ2wîfYµjO°ç6n<¨¼µcª2Óe÷îã‚õ’L$àì("ý ²ÿ$@$ 7odõêå믕gÏ|•Ŭ‹4jô¡öåQfÛ@ C†”òÃíeûvo™9s½¼{÷N?}þü íµÝ·os©U«¬lÛvT-#óço‘{÷ÛЋ’€càt¶c½ö†H€ìJÓ¨+Y³¦UëöÚHºt^v­Ÿ•& ï°ameÔ¨ù2nÜéÖ­¾Ž' ¤’%óèëQaüþû?%gÎ R£FI)Z4gàÊø‰œE¤ƒ¿ vH€ÂCàĉK2gÎ&5…Kºwo ½®ÃSŸ±âBÐB-X.C†Ì7î騿5¥N\Z´¨.MšT‘={Nh§iÓÖÊG—*UŠI¢DñÍ‹óš’E¤C¾vŠH€ÂGÓ£3gn+Wnk'âÅsÛ\̾}û¤gÏN6?ëܾ}WòäIiu¨ïóÍ7 ”Ur–´m[S$ð´X»ÚTªTDxgë×ïWË&h«dõê%U;™,>çÌ7oܸÎïV8_àÉ“çÄËËúw/œU‡ë1ŠÈpaãC$@$àX°kÊòå»ôÔi:åµõ1vìXáêdš4ÉeóæÂõ, L`àÀ–oXù”9sˆ¼Ž´lYC¯›üã•:^gõê%äƒ »ŒÔúõíP`–5ÞÞçÕúæ+ÖŠDiEd”âfc$@$`ðö={“(UÆŒé*I“&´#¬1Ê`:ñ'qœ&hÓ¦CÒ¯ß_’={:ÁÚÉð8REõØžë ˆtwÉ‘ ¸0lUøçŸ«äþý'ʳµ!Cö¸ð»ëÐ&¨yój¦0Ap¬ÂŒªU‹©0AEõVŒa­‹åH <("ÃCÏ @زåÚ®p‹`Ÿë>}š ¬QL$`ÀºHxoã¸zõŽÔ½ûoR¤He,)yóf6ŠòLv%@iWœ¬ŒH€ìG1 œço@IDAT'O^)¯^ùéÝfÒ§wœøpö%k²'L™RKÇŽµu ó;¼eÊ”ÕúG‡&žßL$`/‘ö"ÉzH€HÀŽ ëcýú•² ­vdëUA,ƒÇéÓWtüP8c1L;¼ý¨#EdÔ±fK$@$*¬}œ4i…<{æKëc¨´X ,0a‚þùçˆ)L¦ºË–ÍÏ0AaÈ2 PDZÄ›$@$õ4ŽŸ|RJ‡r‰3fÔw‚-º,„ Bˆ ÷a‚Îê æ3f¬×!¢ªU+.pÔa"[PDÚB‹eI€H ¼xñR­][#7nÜ“[¶¿c"È$€P@8°îvãÆ2`ÀTÉš5­vÄ)^<—OD&|ª›"Ò…^&‡B$à|Nœ¸$'.×»tëVOï•ì|£`•@Ê”Iå‹/ª© õUäßOÊŠ´N‡ B¨ X/™H $‘!‘á} ˆD2wîfý‡»k×zzßëHlŽU“€UT±b!}\»v×&¨P¡ìÊ9§¤äË—ÅêóÌtO‘îùÞ9j h$€iëqã–Hºt^2ztgIÀ3{¼éÛ·ª Ö¿HáÂ…‚gòŽÜ¾}Wrçö’Aƒšº$ŒSI‡µLa‚¦N]+oß¾ÕSÝØf1¢a‚ R[µ+E‹qI~‘5¨ÇŸH@ÀsÉ™³pd5as½‘6#ã$@$~›7’ùó·¨?¢5tpèð×yOÂ3¼téÒòÃc"¯'®ÙÇÇGfÌéÄ#[×ãÅ‹«…#¼¸Ïœ¹ª×N.Z´U/½øä“Ò‚˜”áI?W;êTUë0‡‡çq·}æÖ­[Ò¿ÿW5~ŠH‡zì €«€ó̤I+µ#Ãðáí$mÚ®:TŽË äÉ“IpàÆ–-‡eÔ¨j½d%2KèØ“qâPN¸àkuH|ë¡"b ˆ³g¯êékzîÑ£g"†“OG#D‰âKݺôqøð9&hÖ¬‚inJ† ŠÆ— MSDFt6I$àÞ½{'Ë–íM›I—.Ÿ œ˜HÀU+–KpÜ¿ÿD}Çê0AY²¤ÑSà%Jäf˜ WyÑVÆAi³H€H ¼°;È„ Ë´C¨Q_JâÄ Â[Ÿ#‡&àå•Dš6­*U–½{OÉêÕÿš… *.I“2LC¿ÀtŽ"2ðø( X"püøEùõ×eR­Z iР-2– ñžËˆ+–”/_Pׯߓ ö«å¿i <ùÜëÖ¢ˆtÍ÷ÊQ‘ DL_/]ºCàݽ{ÆÖ‹†wÀ&ƒ@† )¥]»OU¨¨j²cÇ1å;^üüÞ蘓°\2¹ŠH×x @4€×ê„ KÕôõ;å¹Êéëh~lÞAxxÄÕyXåá`¶qãA™6m­ŠAZÑAzÈnD„EdDèñY P.\¸!¿ü²HïöѤIN_ó[AäÎIiÏ$¥JåQŽ87-”à-g#@éloŒý%p(7E‹¶IçÎu¤xñÜÕ7v†‘@üøñ±[ìS8PD†! ??ùóÏÕråÊmùñÇö’*U2B! ·"Ó­FËÁ’ €ܺõ@úö"1cÆP²¤˜²  ç#@K¤ó½3ö˜H  ìÛwJ¦LY#ÍšUUûÿ‹Æž°i ˆ^‘ÑËŸ­“ 8 ·oßʼy[t0åþý›KÖ¬i¤çì& DŠÈÈáÊZI€\ˆÂ÷Œ³H<==däÈŽ’ § ŽC! ð ˆ 7>E$à&à83jÔSø76‡I$@¡ ˆ  ¸+ÿ=)S§®•>•Ò¥ó¹+Ž›H€, ˆ´ˆ…7I€Ü™¶/œ?‹ìÞ}B j)™2¥vg; X$@i o’ ¸+_ßW2nÜyó&@o_Èõöù&üý÷ßrýúuùꫯUxäÈ™;w®Œ=ZÆŽ«ân^ ”o|ˆ;¶.³zõjµ7ùfãv óСC%I’÷û2?~\ç,X0P~p>—/_VÿMŽ“áÇK„ MÀ½=zHûöíåÞ½{²bÅ S^Ð ”A=aùîàÙ'NHÒ¤I%C† ª‚ƒÝ¿ÿþ+¾¾¾jv¢´$NœXçÏž=[Ÿ[´h¨<>à{ï·¥”%KéÞ½»¥,§¸Ç8‘NñšØI ¨ pãÆ=ùþû?%}z/8°%hì}ûöí²xñâ`5ž;wN~ûí7} ô±mÛ6]ÞøŒ3Òž={dÁ‚òâÅ‹`Dþø(P@êÔ©#}ô‘äÍ›WíÙ|V?Ëœ“À­[·düøñZ¸™ï÷/^¼(¸6¾+m¸ÿüùsÓ=ä‡öÝ1ê~öì™T­ZU6lØ`ÜÒgõÿ†ôÒ«W/iÙ²¥äË—OÐ7¤uëÖ+¯3Ô?¸èÏǃ}g_¾|isÊ3-‘NùÚØi {8xð¬Lš´BZ·þX;ÑØ»~Ö:o¿ýÖT&X)ýõWÓ=ã"GŽ*Vçãc sÏž=¥|ùò2yòd(mذ¡²(Rk[§*Ç®E J•**nk=(ˆÅ¥K—ÊO?ý$)S¦4 tþüùbí»óúõk騱£àÏÝ»wMÏá"´M›6Ò©S'}ú*ÒÉdÉ\kg+ŠÈÞ6ï“ ¸ eËvȦMñ³eKç6ãvÅž>}Zÿq#†ÄŠK2gÎ,.\pÅ¡rLv&3fL©P¡‚>ú÷ï/ø óÝ»wËœ9sô--TýüüŒ"ny¦ˆtË×ÎA“ €€¿ÿùý÷¿åÁƒ§2bDGµžî¿õV$丮]»&Æ ÔAL]—-[Vz÷î-;wÖSˆ˜ÎÄ:9L3‘XûîĉGEbè A920LegÊ”I‹ÈiÓ¦IêÔ©õ”6ÖZ†5ýüóÏ*Ölà³õë×—üùó‡µ ‡+Gép¯„"ˆ Ožùäí½ +“s@˜ˆ¸ýû÷€···þŒïVd'Lec$ÂþÉ'e|vÇ3E¤;¾uޙܔÀŠ»dÚ´µÚ†;ÐDí—àÓO?Õ£ï¿ÿ^^½z¥=§³ëËZµje—ÎäÌ™SÇíûý÷ßµXÅ´6ꇀõˆÉ9 @¸!d¼­¾ g„Ú#LÖ¬Y#}`Xs‹˜cÆŒÑË$ÏN6è—‘`)…—ùa¾”âÒ¥KòP.¤¸¨FŽ~¦ˆtô7Äþ‘ D˜âÇÁfÏž“òãÔ´®“ØFŽ7nÇcøŒiçnݺÙVY¥á´°hÑ" :Mš4Úù¡^°†Í–us!TÏÛÑH¡t£Á¹“'O®ÀÓÉQ‘$H ƒâÓÙÙ³gLc©„‘Є2?&NœhdKñâÅå¡\¥J•LùÎxÁ5‘ÎøÖØg 0xþü¥Œ9OMC%T;^´“8qø¿½0ósAü…ååæÍ›rÿþ}¬Ž0–v¯±”~üñGK·M÷jÔ¨!80} Ï6ŽiH&ç&‡€ÞXC{æÌ1¬Î–FU®\9×1h^hßóòp¤ š‡ÞÝpêBüÉ´iÿû1Š*8BJˆ3éŠÉò½®8RމHÀí`š‘#ç«àÓ¤qã*n7~G0¦–#{zV+L®Eb?F¢+ÁúY¨P¡èjÞáÚ¥ˆt¸W‘ ؃À‰—ôØmÛ~"åʰG•¬ƒH€HÀŒE¤ ^’ ¸mÛŽªõK›ÔÂûÆ’'O&×GA$@F€"ÒÁ^»C$1 ü£¶';®Âø´“4i’G¬2>M$@$"ŠÈÑ0ƒHÀ™¼y ¶oŸë*HGI˜0ðöbÎ4ö•H€œE¤3¼%ö‘HÀ*/^ª]J¨Ð‰dðàÖ;öûÝ%¬>ÄL   ˆŒ>>L$ÝîÝ{¬b?Α%rË_T‹îî8}ûˆ©yêÔe§@$ù("#Ÿ1[ ˆ$—.ÝÒ{`7hPIªU+I­¸GµçÏßíÛê€ìˆ©/^÷8GI$n‘áFÇI€¢“ÀáÃçdòä•Ò©S)V,WtvÅiÛ†wÇoÙ¹ó¸C¥J…U\Í/åÑ£g2cÆa§;N$5("£†3[!°#-[ÉÂ…[¥_¿æj´4v¬Ùõ«òõ}%{÷ž„AºyóÄþÍ7ŸÚ "’‰H€B#@!æ“ 8… ÿ‘]»Žë- S¥JæP}sÔÎ`ã‘#çµÕñر‹R´h©[·‚)’CbÆŒé¨Ýf¿H€œE¤ƒ¿ vHà=·oßÊ”)«ÕÞËw”#MI”(>Ñ„Bë!¸wî<&3¦’>($;&žžÜK:tÌ&ŠÈ0@b è%ðúµŸüòË"‰'¶ ÚFŸ£·GŽÛúýûO´ƒÌŽÇ$FŒR¹r½ÎÑË+‰ãvš=#pJ‘NùÚØipÏžùê>Xûرcm-ŒÜgôa)Ö9îÙsROWß¾ýPÊ–Í/_]_²gO¶ XŠH€ÂA€"2Ðø @Ô¸{÷‘Ú¾p–š†-, VŽšF¤¬s,óxŽ™3§–  r£íù €PDÚ"« °/“'/ÉøñKõô5v¢q÷„xŽpŽÕëxŽ\çèîß ŽŸ¢—Edôògë$@A †á_­‘>}šH®\ƒäºÏGóuŽˆçX±bÁ(]çøàÁC¹~ýºû·a¤¯_¿D ` ?{÷îóûe#>???‡ûÞQDÚøYœH òlÚtP–.Ý!ƒ·Ò!i"¯%Ǭ9h}@HýðC{· "nì[xޱbÅTÓÕ…ÏÑô­à €3 ˆt†·Ä>’€ X²d» ×ÓNÆŒY$]»ÖÓ!i0};qâßòðá3=…íá×Fò‚®s,_¾@”®s ¹gÌ! Û PDÚÎŒO ØHàìÙ«jý=í,“'O&1bžôêÕX–-Û¡wŸ0 …ÄŽËÆZ£8„òáÃ>fûVçä¾ÕÎñêØK PPD†ˆÙ$@'0oÞiÜøC5mKräH/=z4Ñ£ Ø÷íÛØ%ƒcczay°wu¦LØ·º°téR—ûVGüëÄH€„E¤ƒ¼vƒ\•À±cäéÓzÍŸ1Æüù³ªÙudòä•róæ}IŸ>¥‘åÔgóuŽÜ·Ú©_%;O$‘a€Ä"$@á'0þiÒ¤J0kcñâ¹¥uëÕ:ÉÙêp^l®s ÿwƒO’ 87ŠHç~ì= 84Ψà¸ï¤té|ûY¾|Añõ}-ßÿ§üòKIš4¡ÅrŽvåžå:GG{1ì @” ˆŒRÜlŒ܇„Ö‚ÿHóæÕ,úÍ›½fpýúýzÍ ÚÍÏáÂíØá-ûöVSð^\çèðoŒ$ˆL‘‘I—u“€ؽû„Äï!E‹æ DáÙ3_Ù°á€:öKöìé¥M›O¤@¬Ê8ÒóuŽ1cÆÐÂqÄˆŽ’Ï$@$àn("Ýís¼$ɰÖqñâíR»vYùöÛßSÀµj••  ê8‘‘ܼ®þÒ¥[2jÔ|iÖì#ùóÏUR¢Dî`ÞáF?ŒuŽ{öœÔq+±ý ã9tx& PD†Ì†9$`"pç¦b÷Š—WÓ=^X&pâÄ%ùãU‚µÅŠåÒN3wï>V»Óì´ü@8îB”zzzX|rÏž2mÚ:=•ñxòäeñö¾ -ŠÆ–Ö9Žù%߯H(ýöí‡fwxiNàƒ IêÔÉÍoñšÜŽE¤Û½r8<öí;*uê4 Ï£n÷L¾|y•õ¯‚$K–,RƾuëV¹qctï^7Pý†78zn%3¦Òùøcê\¹2¬¸¾yópßê@ø}€uvÀ€Ò­[Ï@÷ùá=å6[þúë"!·&@éÖ¯Ÿƒ+œ9sHƒ ÂZœå"‘@Š)äìÙuZxùòµL˜°T^½òSûrw ´æbqòäU²ÿ=­ÍuŽÐ…ø¡B…2ü·@"rÆŒ !äò6 ¸ŠH÷y×) ¸$;w*á8O ̦wÀ ê“ §*”My„ç—êÕKº$ŠH€¢ƒ]£ƒ:Û$° ãÇ/ªiשÚq§mۚʉÇòÿÒ>ù¤”n—FY €&`ùÿ¸„C$@N`íÚ½*\Ð2éÕ«±T­ZÜjoá`sñâMyôè™ÕrÌ$ ;Ng‡K’ 8±U¢—²B¶PaƒbʵkwÕÝoõ>ÝÆ9 Ÿÿ»W¨Pv²^½Š2 vƒH€œ›E¤s¿?öžÜ’ÀÚµ{¤}ûOe̘Å:%¦±Òü qi~Ïß?@²dIã–¼8h ˆ ‘‘A•u’ D*q㺫85#µ VN$@$`×DZçÃ\     ("-@á-    ë("­óa. €‘ ð €u‘Öù0—H€H€H€HÀŠH Px‹H löîÝ+Ù²e [a–" p)‘.õ:9W"àëë+÷îݳ8¤„˜‡ž?.¯_¿¶øì;wäÕ«Wó?~¬t[ÌT7ƒöÇßß_Ð&  ÷#@é~ïœ#ŽØ9eíÚµR¿~}µ»Êµ`=€x›8q¢  Ý^Þ¼y#_ýµ$MšT[ùJ•*%°ø!áÙ *èûY³f•òåËËåË—uÞÏ?ÿ, 6” HªT©$Q¢D2hÐ ‡®\¹"¥K—ÖÏ"e_¼x¡ó>, téÒIŠ)dàÀòîÝ;—'Oý9K–,’9sfÁçãÇˉ'¤zõêòôéSI Œ7Núôé#gÏžÕÏýç?þ°š´”3gÎÈÉ“'µp…Õí~þùçrÿþ}ñöö–¹sçê~àÁgϞɢE‹dß¾}º]ˆXô9þü²qãFIœ8±£5jÔÐVÉ’%KJ¥J•döìÙ¦¶QÏ|`5e˜H€H€œ‡E¤ó¼+öÔI`Šbîã?–Â… Ëõë×eÞ¼yâãã#ýû÷—'OžÈ¨Q£$wîÜÒ¶m[-O:%›6m’ºuëÊÌ™3‚/cÆŒ/^<2dˆ °BnÙ²Eºvíª·÷‹;¶tïÞ]víÚešf†Õ²U«V:¿K—.šØ¹sç´sÛ¶mÚèáá¡-ŽsæÌ‘råÊÉŠ+ÄÏÏOzôè¡­°D6mÚT Y9ÚI:µàYX7!4¯^½jdësÞ¼yeêÔ©rëÖ-=.\§OŸ^÷÷èÑ£Z~ ÊøH€HÀá PD:ü+b€1­Œéá7nhaë‘`±9r¤üôÓOZXbê8S¦LF¶žž†à2D]óæÍåÒ¥K7n\)Z´¨‘¥§—ñáöíÛú¦©'N-&!/«)ï1bè©h#¿X±bzjüâÅ‹ÚrY°`AéêY³féòFÙìÙ³—’6mZ]/¬––¦¶!d!Zÿý÷_Ù¿¿î3¬²H¡å[ªÓ÷žÖ[)´|£\DÏW¯ÞQSó›¤M›òí·“"ZŸ Xé¿ýö[½~k„ÍòªV­*«W¯ÖgXò—/_®—MÀŠ„2uêÔ‘~ôtîÜYÿ°‚à1b„©ºU«Véï6nà¿­ñãÇëR¦¼ ° ŠH»`d%$ð¬oÄZDL÷bêVˆ¼Æëk8ÃÀJË",”ß}÷ÎÇÖLi/^¼X IüÑÄ8ÄÖBb 䨱cµå-ªƒ?¶p±–0uë&þ˜Â™Ú°&L˜P Z¬±Ä:HMô»fÍš²`ÁS•°ü /X?9iÒ$Á´y²dÉôp[x{£æ%JHåÊ•µÐü矴S†ð¬µ|XNí‘îÝ{¬¦âw(±ò»²øÎ×VÓAƒZ)1ËÿÝÙƒoDêÀ&XÓa=Äw×<íÙ³G;ká¿8há;ƒòøï –q$8gaùÆ‘#Gô5|‡‘ aiþcǼn^“ DØ‘S-k%ÀšEXMp`Z{úôé‚uŠVp´uk q`ÚSw°¬ÀKDÊ`ZSߨxáá½páBí}$I½¦14Ú°B$u}ñÅz:Ïbú¯cÇŽú3¦Æ‘‹‘‘ aI„—9¦Þ±Æ k>ñ9Mš4zÝ&þÀ÷êÕKêÕ«§×OÏã ñ ëgHùæem½ÆTõž='•À8®ò#åµ^@¾ü²¶Ýï-´s*ÛV¦‘Qÿ à»'+8rᇾ[Hi…°TXö`î|'3|ï`Ç#æVmÜÇ=|C²Ä£  €ý PDÚŸ)k$`à`K ¬ŠÆDóBeË–ð°†Àƒ³ ¬…°ÎaªÙH°Â‚ G„ðA˜ãgß¾}b¦3¬‡FÂZJ<‹¡zÐŽ‘š5k&Ÿ}ö™œ>}Z BXÌÄ/ìÝ»w‡ãBú V$­yæÏãÖ%LóÛ+½|ùZY9OiáxñâM)Y24jTY Ênbb¯¶XOÄ à»ƒ)lXéa?¾¶¸ãÇ –~ z¬ó˜ÖÆgX´ñG´4–yà‡KЄIø±ÆD$µþû+µí²5pK|øƒR2að†¶” ,-ý!µT6轘1cй“Œy>^0RÂÔ7K ÓÐ’ùØB+ZþÔ©«d÷î#R¤H5_BŠË¥·õÿaš{ñâm¡U­¨#3¤Â1cÆP?ÞÇÑ © îã}‡VÊ…·>Kõ[ª+è½Ð>ƒ•êºf·K8¬ê8`‰ÄCDBT"ŒÔÖ­[eéÒ¥zšK<òå˧—V`)„$~¸0‘ 8ûþ_Â1ÆÄ^ Ø‘¼¸aetöÁ–+´r`Z™÷ùa+þú‚×–ºÂZåì•f̘¡×übªÖïÞ½[[ÆÑ<³ÓVHL[#˜=ühúꫯôòXÐá 4A¨6LΊ‰H êXÿéuý`K$à¶°ÒÒFÁFLéEUêÝ»·Žë‹ãðáÃu("xº:Zj×®¶r ªª,W§U|ÍC2yòJeEÍ­¦B †8íå•D…©ähCqÈþøø\—3Û­oØ ‚–FóåÕªUÄ+E˜«ï¿ÿ^ÇT]¹r¥©]´o×®üòË/úÙ¯[·Î”o\ œÔ„ ß_& ¨#@KdÔ±fK$`‘¼Rá ¯é ‡ùšF‹Ûù&ÃÃóciý¦› wužžJ`QkM[¨1_©µšéÔÎ:Û¤C‡Ñ2mÚZe•ºîºù } À Y¥J½\¡¡Œ£Q£FZD¢5ì´„€ûæ"ë(áD† øHÿÇÞY€YQ½ü%é®eé”Néîî•¥E,ø!!Š *‚‚´ˆ„HHw-»4,l‘ÿó=üçºq·ïÝ™û=Ïs¹sgΜyÏç\vß}ÏHÒ_a¤BÒ~4$¾饗tp ·º5þC‰F€–ÈDCÍ‘@Ô‰4:±iÈ9‰ˆVl—†mˆn…6²Õ¸ŽÀ(„ή!˜ÛaSì hëÖ­ÆíŽwø¤¡ ¢³”BØŠL“&£obdÊ”^Z´¨¦_ðçC”öÌ™¿ªÔC÷t¤v¥S>+ ¤€B4ÿ”)Sœ}r%éy`¡lÑ¢…¼ÿþû:zßE|ÇðÆö6RC¡a;åA_~ùeê ÁeèƒZó® Úz"ÿ%ˆ‰-‘1âu0ÔÏÆö2¢ZQ1Ê üÉРâ—(~éƒhÖ;vèkHŽhWœ/¤"¹‘£ÕkРâ>Ô¾F‚sD`ã"¸1r;¢†7ú ÏDƒ1áÆ†g ©8ú —%"Ðq=©ZŽ™UŠ¡:j t ÊÁÙ]+ÛãÆÍSs{’&&©äòÔç"/$ª! ĆŒøßo4”ÞDŠ)¤‚‚E%4ö(•H>ŽÜ©¨=ï(Ô°VH(šH[…†çãȧÊF$àZ´Dº–'G#x€Ò†À€ˆ i`qĶ6~)"E ¢¶‘d[{H &réAÙƒr ¿°!C†*˼øâ‹Z±Ã/[X"±í×£GmeD5DÁâ^¤VAþF£²úÛ… ÖGX&¡0" PëÖ­õ/y”c„rPP彄oç¡C‡ôgWFbGd—ÏùóçRùs©yârû&!d [ÚÓ™(ø??ŠØH€’–•Ȥåϧ“€&€­`(’,(ƶõ AƒtrôA^DZcÇêîðcìÝ»·£ô!Î#ø ,:P&‘Ú/$6¯P¡‚ö{„Ò‡4+†…D£2ˆ8Â?PZ4@ðQCu<A Hnœ‡l‹/Žp7?’ Àï¾;_¹!< Žx8wÎ_íFˆÇî¹…J¤{¸rTˆä›3gN´÷äÌ™Óq¾‡~AÃö4|*†ífXa}ÄV^X«|Êаeˆ ”P4òðE—Ê'âóá놉ð_3jwc,lMR‰4¨òH " î(ÿ×iOós, ÕŒŸÆ¢gât¡™8œùH0Ã"q ø3¢’‡ÑPb[Õðƒ¢gÔÝÆõ}ûöénPú”€­i£A »…mœ7ÞaÉŒØðllµc+½hÑ¢ú2ŽÙH€H *)S¦ï±Åv}Tvظßè¦;"ÿVpÓƒ8, @Ô° å+â QÕ15£6I(tØ–6GXamDð*„`û (‹!I(›œ‰kCõ(Ó¦MÓ‘á/^ÔÇq‡ýI€H€¬G€J¤õÖŒÛrEB‹øúðÃcœ-jfC™Ã–6,ŒPä\ƒà(ˆrÅ66‚_þþûoùòË/õ˜ÚÉ;·.C—?~ UIĨ„À3Çï?þÐ?¨ÿ å4l¤lT÷ò< €µ p;ÛÚëGém@¹ñðŠ®¡âGØë#^hvA”6’0Ã?1lE¤ûAÀÎáÇõö5"Zmq¤äA¥øØ nqX¿FŒ‹ 4T¯1Žõ õÒ® VMȇTCðÕœ={¶Ü1®óH€HÀž¨DÚs]9+$€Ô?ÎËòåË;»¤JäžLHC:!XPaýD…DqÃÊÉF$@$`oÜζ÷úrv$àvð‡¼uë–N8Ž„åP*%–v» | @¢ %2Qqóa$`?¨Rƒ\•l$@$@žE€–HÏZoΖH€H€H€\B€J¤K0r   ð,ÜÎö¬õælIÀFš!žPiŒR¨rŽÉþ¿¬côï÷ï?PíµUŸb¶`ÀI @R ™Ô+Àç“ Ä™@£F•U:£òê«]$EŠäòèÑcõzíû† {T‰H*‘q¦ÍH€HÀ9*‘ιð, €‰ 4mZMåµÌ"'~/#Ft‘%òG+íÇeÊ”ÅÒ»wóhûñ" @ì Ð'2ö¬Ø“HÀDZµª!ƒwÉ“Éï¿ï‰V²¿ÿ>&… ç‘,Y2DÛI€H€bO€JdìY±' €É”-[X&Lè++Wþ%sæ¬Ö[ÚÎD\³f—T«VÒÙ%ž# ˆ'*‘ñÇÛH€ÌA W®¬ªläKªÔâ-?~¾Ü½N°ÀÀ`9pà´ÌŸ¿^¦MûI•h<¥²îF~  ˆ–}"£ÅË$ð„Àñã'dÉ’%Ä ¨^ƒzÚîj›6m’bż Ÿ&ÍSòÆÝeáÂòæ›_˨QÝ•ÏdNÝçÏ?Jýúå¥_¿V²}û!ùå—m2cÆr©U«ŒÔ«W^os‡Œ4­[ÿâw>Šï‰'T­úëQ\åiðT"=g­9Ó¨Q£’\»¶]räpŸr”ñLuëûï¥juÑÛÇE‹úèúÜ®°aÃ\ÒºuHC&K–Lºwo$ ä’±cçÊ+¯´•gžyZþøc¿tíZ_Ò¦M-WÖ/X-·lÙ¯-“ˆî®[·¼*ÛXN²gÏi\OúèG9yÒWËQ®\‘pÈñÇ@§Nõôëĉ‹Z¡5j¦V@¡LV¯^J`ÝôäV»vYOž>çn"cÇŽUü5–Úµk‡“êÛo¿U?W¼ÄÇÇG–/_îZØýúõÓ»#“'O{ÚqÜ¡Cµ+QO]ý¬¹ë8‡ëW¯^Õçñîuÿþ}¹~ýºT©REí TS?3ú«]§2wî\Ç3=*E‹•^½zÉСC•LaY´h‘¾~ìØ1™5k–¤OŸ^¿pJeÅŠåÔ©SºÏöíÛµ{HÄgã3žoÕ–8¦«Ò¡Ü$@q&!CZiÔ¨’,[¶E+g#Gæ?¿ë²bÅŸ2dÈt½m 뤻]2eJ/¿þ:)ÖòÃêP¹r ý ‰ä?Y·n9)RÄ'Öã±# @âhذ¡à…eméÒ¥2iÒ$­À‚ˆk¤···qÚñ>~üxµûFàï +âÌ™3U ÞxéÙ³§®ˆõÖ[oIóæÍå›o¾Ñ÷¼ûî»2nÜ8éÖ­›þœ6mZ•)b‚c¼k×®Iqå÷°lÙ29r¤>_²dI­l::Ùà€–H,"§@f#жm-­„]¿~[‹†íå—_n«¬{ƒµo"‚_¦N]"§O_2›èZÃrܸ>ê—ÑK’1cZùôÓeªBÎçòóÏ[åÆSÊM¡H€âGÖÀáÇ;¶Ÿaiôõõ•   =à®]»ä¹çžs Ž-ðÇ+¿aǹ°†u´H‘ð®4aûØá˜–H;¬"ç@&#k$‚X~þy›ŽŠ6ăuðÙgJ‡µeãÆ½òÉ'‹%gÎÌê/õgµriô3Ó»3ÿI(Á>>Ùu@ý'Í´Z”…¢'0uêTÉá¿¢ðkìÛ·¯¶*âÎãÇ˶mÛäã?ÖÛÚØ¢FƒB¶Í›7OíªÔ‘ܹsëÓØ–~çwô1¶Ò7oÞ¬ý*[µjå¸íÌ™3Úºé8ñÿ°jÂÒŠJ¤W2“€´m[Sm_ªÆlÙÂG=?õT*iÑ¢š4hPQ^xa¢òG\©¬M?+øOâÕ§OKADxÏ›·N9ÙU e9ýž<97xL¿Ðc `»ÛÖF 5õûÁƒU °*(ï¤4mÚTû+"xÇh°<6L¶nݪ·Íóx‡õ ý ( •Ñßÿ]Z¶l©Ï#0ŠdĆû¨DF¤ÂÏ$@M ]º4Ò¬Ù3êíÜÆýûäèÔUœ^ØßLŸñéƒð¢ÿ¤™V†²Ø‘,‡wî܉45Xÿræ|’6ÒÅ(N@AtæitïØ±£àe²lÙ²Ú²E‹ú2‚gàßh\Ïš5«q›¤K—N¥Åzßñø ßLC‰,Uª”ª¬5'\«àŸÌV_AÊO&&€|Ž;wÑivЉ(J¤àA^FDO[¹Eç?‰Äæ×®=ñ µò); $%ºÀ'1bCÄ6®¹¢!Å"½V¦L=6¢²Ñ¦L™"£GD„C «@÷D|‡² ˧·³í¼ºœ $1X#›7¯ª­‘HþöèÑ#í yçN°®,“Ä"ºôñý'‘'ù'óçÏIÿI—’æ`žDÒ}úôÑ ¬z؆…/ @[]Á¢råÊZQ,V¬˜V‘¾çܹsÚïãJ$”Ö°þ‘¹r=ÉŒŸkÆyä›\±b…ú9÷‰*tÐÕ!ä6Rþ8NªTøÊ–-[ØS–9¦i™¥¢ $`M°F<]ý°¯£ÓúLŸ¾TûÿÀòƒ~TÛCÝ>’vk†ÿd¯^ÍT½îôŸ´Ûs>‰F {÷îrá”÷¬N·ƒmläqDoäntE8p ÊÛJù<ÓVFDeO›6M玄#ÄÁƒëWØç!G$Ú7$oÞ¼ú~Ñ… Ò .”]£!ý3y±EþÑGÝ,õž¬K—./^l)¡), $6‘#© ‘º¬XOð?ýô‡ÞÒÆ_ë·nÝUÖ¹ç$eÊòÕW+Ôç«òÖ[Ï›6:;žSvz›á?‰€œK—®ëúÝÌ?éOÚ˜@ß¾_©|‹ ãujS©zõj.°TŽý¼ûnå>Ó›lp2¬ÿ$j|ÿñÇ>í?™/ü'ËI¥=¾~· –™S [ iëååäHÀ:w®§¶¨Ò(%ò¥Lö”ÆF¨DÚh19°+XÚÆŒé©‚m–”IÞØ±Þ¶«×ÏðŸìÑ£I¸ü“+Õ9*¥?›«¡'ñxðcĆÒxþüeè…±D‰|Ò¦MMUã9ýf“xìòx*‘vYI΃lNÖG¤ýùúë_u™ÄwÞéaû2‰®ZÒˆù'wì8,ðŸDþÉZµÊHýú´eÊUÏã8á Àˆ$ò®Î4p󿇲ø$øå’J¥“Ö‘^§fÍÒz]S¥ò /?‘€‹P‰tHC$à~ˆ:~ùå¶²dÉf]ÝÜHÃ{°ê6lXI¿ŒúÝÓ§/U–)q䟌ýhìƒÏȬY+eçÎ#òÍ7#UíçB1Ýâô:r/ÂwÑH¯¥ñÁƒ‡?FXam´{ýy§px2ÉP‰L2ô|0 @| téR_²fÍ É7ß|ŽV´x‚ [¿;lþIø¡¦N7ž£ò6€•pÞ¼uzk¹_¿V‚ŠÈ­%–Ë3güÿ\¿ ¿çH¯ëq¯^Íø¿jIN€Jd’/ ˆTs²3aÂw2thGUgºh|†á=ÿOÀðŸDþÉ•+ÿ’]»nM< !÷êÕ;å矷ªúÚÏÈ AíuÉ?D?oÝzÀ鈾¾Wõ¶4,Pæ/\¸ªªe×–ÅR¥ JÛ¶µèÇè”O&5*‘I½|> @¼ G",‘¼Pž¾±ÊX!ÞcñÆ'à? Å…JdÜ¿GŽœ“Ù³WI¶låý÷û…‹xFÀ¹s×ÊáêJCqÄC¸^¼x>Ž ‘Ó¨5ÍFf'Ào©ÙWˆò‘ DK´÷Þ{QW·¹yó®´oϤäÑãE—@¢îùó×ËáÃgåÅ[HÕª%#=®è7|øçR¦L!­4¶kWK[Ó¥K©?O€P‰´Â*QF h x{gSJd_þ9ð^z©5S×DKŒ]AàñãDznÝnèÕ¸qe™>}ˆD ”Jj‚$ Ø•H;¬"ç@$ ™2¥×É)SË,#ºªàT$Cn!pWFŽüJ§Ô™0¡¯à™˜Z‘">Ú÷ÑÓ•H_ß‹êÿç+1áâu':.Ù³çpr%iNQ‰Lî|* €Àì7º«T*«Urò9‚@P.ÙHÀÕ8¡|S«_è™äÓO—JΜYÔ+³ã%;säÈ®ºRðüúëvW‹b¹ñÖ®`9™Í"ðþý'UàÛ9³ˆ#T"M³„HÀK)UV¬øS)‘ߨ’Ý%_¾œ®šc€ƒ@ÍšåeÒ¤žrçN\¹rS½n©r‚7Uj?n¨cŽ (˜¹reÑ7ÈÉFv!@%Ò.+Éy „#€´(øåýÞ{ótš•Š‹…»Îî%pöìY™6mšJÁ4A%ÀþÏ ?ÂW_}U)úýäêÕ«²|ùò(AŸÌ™3ËäÉ“öéСƒŠÈ¯§’n?Hpp°T¯^=œõ7^¹rEöìÙ#éÒ¥SUcªHÚ´iŽ—“É“'×Ý3dH+xa«:bÃ\‘ßJ&L¼wëÖ b7~&Ëxò¿À²âSp ˆš@õê¥t  ¯¾Z!k×#¯¸œ€ŸŸŸ 4™.AAAáÆ†b…ó§OŸ#±6^/^ÔçïÞ½ë8‡ëP4Ñïá^÷ïßWJÚu­V«VMú÷ﯶs¨T:sÏœ5k–äÏŸ_¹7Œ‘Ö­[KÙ²eõ³Üx«8¶»‘2©AƒŠJl(;Öuã94 $.Z"—7ŸF$Èà‡6qb?µõøƒ\ºtM§`Á/w¶¤'аaC­ÜP ²}ûvYºt©Z§IZ4¤Û»w¯>„5ÒÛÛÛ8íx?~¼¤I“Få^|¸V ѯpáÂâëë«- ØÂÎ’%‹V q Êf³fÍdãÆøÈF$@´D& o'°¤ûyë­çeΜÕ*àf¶>†rÉf S§NU¾‡ÂæÉ“Gúöí+ãÆÓçŽ?.Û¶mSÕ‹>ÖÛÚðìS§Žö‡4nÂv8¬P:ÙH€N€–È„3ä$@!€mì¾}[ CC‘-Z´P)xîÈàÁƒeÕªUÚj9`À­d÷ñH þh‰Œ?;ÞI$`a(A÷¿ÿõ’ï¾[¯ÒÌl³ðLÌ)zÞ¼yuª]»ÂGÅïß¿_ ‹ +ZýúõUéÁuŽ¡Ê”)£ý#=ª£¼[¶l©|aýµA6qµ€:æ @$T"#!á  O!€$ä“&½$»w“©S—Ƚ{á·@=…ƒ;æ‰üŽmÛ¶ÕÑÖH߃†÷×_]j×®-… rÉc+W®,S¦LÑ)ƒ=z$?þø£œ;wNûCîܹS焟ä½{÷tÀ ‚n7’H á¨D&œ!G °0”E7îEyê)/y÷Ýot• OÇT¢÷Ýwâãã£-ƒY³fÕù½¼¼T5¡.“ÖE(ÅŠSUaré$æHrޤâ´ òåË ,£Æ«I“&.{>"O&@ŸHO^}ÎH@@õ‘ÛËêÕ;äí·g©Š*]¤dI×l·z2bTˆY³fNŽíe(z3ftФfÍš:ùxÄ‹†AÒñ¨Z‘"EäСC: Ñ×Å‹wTÈyã7T-õ7¢ºÕíçCCïé´R¨VƒôRxðà¡ ÐÎíÏæH 1P‰L Ê| €%´lY]YËr©íÑÅÒµkiÒ¤Š%ä6»P&±íì®–"E )Q¢„»†w:®¡ØkJ¢ñ2”Æ  PÉ;«®›÷¼ys¨íöß©D:%Ê“V$@%ÒŠ«F™I€ÜF L™BªÞs_ùðCøÖ]VnšGªÅ춇s`Ëؾ}¿têtBYVÓþ¿¢˜U¿—.]HUᩤ³dù/¯%&¶gÏ1Z¸‡ ®¨4KSUÊ¥ –Yo3zëÖm,vWYôË›A-•HÓ,!0 \¹²ê€›éÓ—*Éù*¤›JtÖ,âQ(]ºˆxy=Ôµ±ûôi!yòdQªÓ§ýTEÈ¥c¼Ñfnݺ«íFÊy‚ÍfæÞé ý;ï vïCâ8:kâŒÝI€<ƒÀSO¥RþtÝ¥té‚2jÔLm=ñŒ™s–±!9sÑ?HmÓ—1c¾•ï¿ÿMÕꎾœæ©S—”™'6ó X‚-‘ÀŽ+@IDAT–X& I$TàY @.?~¾ôîÝ\jÖ,“T¢ð¹&#€œ“H\_«Vùᇠ2lØgò MTz¡rN%=uÊWþùç¸V$a‘,R$>Ο?']&œãI³ iö¢|$@IN ZµRz»ò£~”ãÇ/JMøK?ÉWÅ<d̘NË@Iœ={•üöÛߺR¹BÞ¸ ,-gÎø©¼–—ôwiíÚ]âçwCòåË¡ÊbÅòª”H¹õg ±‘€™ P‰4óêP6 Ó@bò>zE>ûl™Œ;WFŒè*'L#,IEŠøÈûï¿$7þ£‚³¾“êÕKɳÏ6”téÒ(¥þy$eÊ*0"¯~BÞ¿ÿ@Ξõlw=z^~ýu»Jˆ~S)’9ÖJX.ñ鍨HÀ,¨Dše%( €é ¤Ió”ö“üå—mÚOrذNÊgÒ5•WL?y +ØânÔ¨²V -Ú$Ç®Ék×nk…ÐÙ ^^)#)–¨žôÄbé'‡ŸÕŠåÕ«·´•–J(¬†bÉRŽÎ¨ò\b ™”ù  [hß¾¶ú¥ï#ˆÞnݺ†*ïWËVóãdNÖÇ>}Z*…²’|óÍj•È~§Ì™ûÄç©Ry©Ü—ùõËÉË‘vêäI_ù÷ßÓºæ;”Sl›?ñ¯ô–¢E}´ëKƒßÝI€J¤;érl Û€òÃ_–É“ɱcdðàK% „%oܸ>Ò­[ƒ[­‘1 xñ|úe<Š%¶ÊácyàË?uéNƒÖJ(˜HADÅÒ ÆwW é*’‡HÀãÀ'u·çÍ[§··GŽ|Vû­yN8Fîr{€b‰aËt‡ê­pøXîÝ{B–.Ý"7oÞ‘B…¼õ8¬•Ø÷ñÉ£Üì@Ñ ^#  ‚Û–þù¯¸éׯ•Ô¨Q:†»x™ÜGñR¥ ê—ñ(–°VÂj¹gÏq¿&’~C±4R áÝÛ;›q ßI FT"cDÄ$@$3ZµÊjß4loÉeé£K8ša”Á|øÎ|kB‰H€,J oÞ* ÐËòå—Ëåí·gé4@´ìXt1=@ì´iS jÅãe´ÀÀ`nèÄ _Ù¹óˆ,Xð»†h…)ŠŒ”e#*‘ü € ªvذÎòûï{Tmào´E2ª &.|,‡"—@TyD‹åÝ»Á*‡¥¯¶Znß~P—xÄö¸áci(—9sfq‰ Ä:¨DZg­() €… W "i§LY,GŽœÓÊ$L6°ôéÓHùòEõËK¤BðΟ”ùó×éÚáFD8‚w dæÈ‘Ù¸…ï6$@%Ò†‹Ê)‘ ˜ƒ*Œ|ðA'pÔ¨™*ñtgí7ié( ÄŸ,–Ë€€@­T"€gË–*/æA5øVJ%¶ÃÙìC€J¤}Ö’3!0!¤`8°½ŽÞ7n¾tî\OZ´¨fBI) $ŒjˆW¬XL¿Œ‘nß¾«K”uÜ´i¯þƒêöí@å‡YÓèÂw  iáÅ£è$@Ö!€èmloO›ö“ìÛwR† é(Ø&4cË!­ ªØ©ƒ^1£xI.“¿ÿyúiæXŒÍBdÊ”^*U*®_FøUnÜèo|ä»… P‰´ðâQt k€Øøñ}dÉ’Í2rä—òòËm¥B…¢¦›DîÜYeƉ¦“‹ÙƒþHa³*‘öXG΂HÀ"’'O®Jà5ÔþdŸ}¶LYhŠIM…A7Y@Š™èΞ=«,øÓd„ ÊzŸÞñüÇË«¯¾*ýúõ“«W¯ª’Ë×" ÆÙ°aCÄKúó{ï½'™2e’¨ò‘$88XªW¯.(&¶]¹rE%kß#éÒ¥“*UªHÚ´Oâï¾ûNwëÑ£GØîúøâÅ‹ª<êäHçq¢`Á‚ÊWz¸ÓkV8™Ü BRF °§ŸÎ¯~± Э#G~¥S¨ØmŽœ ¸‚€ŸŸŸLŸ>]‚‚‚ %çOŸ>-8~øð¡~AiÃù»wï:ÎáúöíÛeáÂ…*ïe`¤®_¿~]+†ÕªU“þýû«Èò2wî\Ç3gÍš%ùóç—1cÆHëÖ­¥lÙ²‚g¡­Y³FÖ­[çèö .ä¹qãF¤çBYµr£%ÒÊ«GÙI€,MUD ê ü«(îÒªU i×®–$K–ÌÒó¢ð$Ø6l(x¡AY\ºt©Lš4I+‚†,?þø£Š/*PµñãÇKš4iäĉÚB8sæLå~2^zöì©þØ Qrå×_•æÍ›kKe5döìÙªÜéXgÃE:E2K{åÒ¤%2Ò2ó $.jÕJÉÇÇÏêJ7¾¾WW>H@¥#º¯·–±ÅŒV¸pañõõÕPlaC„‰e³Y³f*@h£þì©ÿÐé©+Ïy“ ˜Š@æÌé•ù‚®t3fÌ·Ú"Ù¦MMZ%MµJÆê.\¸ ­‹açѸqcUqܸqúôñãÇeÛ¶mê»õ¶6ü0ëÔ©#ð‡4¶Äa팋?#ƃò¶uìØQU*ö”¥Ž©DZj¹(, €Ý  Ò "¶gÌX®kÚQX§Øî«Îù%„@\Ü?àWyäÈ‘p«P¡B¸ÏTÿÿf¨Š<'¥iÓ¦ÚBéåõ_µ©­[·Jß¾}Uá€Ò«W¯p÷F÷áüùó*€.U¸.ðÛ´r£iåÕ£ì$@¶$-[&=º§üöÛߺþvÛ¶µ”# Z%m¹ÚœTL2dÈ »Ü¹sGræÌéènÚ×¢9(Q¢„,X° š"°âeÁ3ØÂnÑ¢…àùƒ–U«Vi«å€âôò³Ï>£Od´äy‘H€HÀeš4©¢‚úËþý§äÍ7¿V)J˜ Ùep9eäÍ›W§ÚÙµkW8™÷ï߯?Ã"èŠV¿~ýpÖeÊ”Ñ6GÕQÞ-[¶mÉDM\, ®ÏŒcÐiÆU¡L$@$ðÿ²gϤ¬‘=T-âý2qâwÒ AEéÔ©® œ" xÌ™3KÛ¶mu´5|¡T"µÎ믿.µk×–B… ¹CåÊ•eÊ”)R¬X1­<.Z´HÎ;§ý!QÁ ù#±•}ïÞ=pƒ‡b›Û°ŽÂRyêÔ©p²dÍšÕñùÌ™3:Íã„:H™2¥Þ{ÎJnjζÒjQV %P·nyõ n îððáŸË®]áýº< 'îÌÛÇÇG+wP̯ ÜŠ+\6X¡4B‰Ì•+—NbŽ$çH*Ž@›€€U$ ¼Vb¡ÈâÕ¤IÇó! R…}}ñÅŽëPRÃ^Ãq½zõ×­x@K¤W2“ x$”‹0 =z^åº[)›7ïÓÕn¼½³y$NÚs B z#*ÛËPô2fÌè@Íš5uòñˆßÿýˆ§Â}.R¤ˆ:tHÔà9Å‹wTÈyã7¯¨ü,£óµD2s;6*‘v\UΉHÀÖPíæã_‘µkwéÀ›ºuËI—.õU ¶Ô¶ž7'GP&aÑsWC™Cß°ÅŽ·³clj½H€HÀTPƒ»eËꪦð`•‚ä¡ ö™ ØåÔc*Á) €mÐi›¥äDH€<‘¶¸ûõk¥ªg<#óæ­SŠänéÝ»¹”+W$^8֮ݭ¬œ+T®Ê2ñºß“nú÷ß²~ýDOš2çJáP‰ ‡ƒH€HÀšòåË©£¸÷ì9&ß|³Z9ýçgŸm(8—æïSE½¾­óâÅå>Oì;xð‹ž8mΙ¨D:Pð€H€¬O råºâÍo¿íQ ‘çi‹d·n T’,ÖŸg@$`*ô‰4ÕrP H84o^U>ÿ|˜äÉ“MÞzk–²N®Ré¬]b-ád8 €+ P‰t%MŽE$@&"€„ä:Õ“éÓ‡¨š½^òê«_È?þ.!!÷L$%E!°**‘V]9ÊM$@±$>}Oò“Oªú¿A2dÈtYºô åìF$@‘ P‰ŒÌ„gH€HÀ–²dÉ ýû·QåûÉ•+·dðàé²dÉf ±å|9) ÷ é^¾H€LGA6¨|3iÒKª–o€V&-Ú¨ª›NV D$`^T"Í»6”ŒH€ÜJÊäË/·•>zEÕÆ6÷§rìØ·>“ƒ“ ؇•Hû¬%gB$@ñ"={&yé¥Öº”âýûâ5o"ð<T"=oÍ9c pJ [¶LR¦L!§×x’H€" ‘?“ ÄH€JdŒˆØH€H€H€H "*‘‰ð3 @Œ¨DƈˆH€H€H€H€"Hñ?“ €; \½zM.^¼èÎGØnì{÷îÉ£GL5/*‘¦Z C$@$@ö&P @.yðà¦Lú޽'êâÙ…†Þ“âÅsËãÇ.8ÃQ‰L<ÞJ$@$@$73¦“/¾·›Ø[Ø¿ÿ¤¬\yÎ44èi𥠠$@$@$@$`´DZg­() ˜–|µÞ|óMµÝV\úõëç69ÇŽ+7–Úµk‡{Æ·ß~+^^^âãã#Ë—/w-ìÈ–9sf™ô÷÷×~°Þ¹sǸìxG€ŒaùtœŒá`ÆŒô‰Œ/“@tè^# ˆ–Àܹs¥fÍš‚`•;wêü#ÿþûo9zô¨¾VŰÛÙ§OŸv:&,P0Ã^ß·oŸî›/_>ýŽmó]»vEºÛ¸ÆF$x¨D&k>‰H€lEŠ!,޽zõÒiz ƒWË–-¥H‘"òý÷ßëùÂÇ)x`-ôõõÕ[ÝX¡8†„„h_H䙄¯"Òò aüæÍ›ëÜŽøÜ³gOY³féz‚‚‚dôèÑ:(þ”l$@‰G€ÛىǚO" [øí·ßäÚµkÒµk×HóÂ9(‘ãÇ—aÆéà® 8zÃR‰V¾|yÉŸ?¿äÎ[à ¥Ê ‚u°u ÿʰÉûwï®û!€N(¦°`®\¹RŠ-Iž p*‘îcË‘I€HÀÖ`!„ÑY{ÿý÷/4¤ó¹qã†øùùi…1lÿÔ©S ü*‘JcÕªU¾‘ð±Äg¤ùI–,YØ[ä7Þ×_]Ž9¢û@ uÖ°ÍkeĆ”CÎÎGìÇÏ$@Ñ =^% p”$ŒJÙÃðÙ²es<}a¡Œ®Á Yºtéèºð €› Ð'ÒÍ€9< Ø‘•H;®*çD$@$@$@n&@%ÒÍ€9< Ø‘}"í¸ªœ €ÇX°`ƒäÊ•E¾ÜSipBUYÁ»rëV zÝUépUÂî õ V©t‚ÕõÝ' H¥Ûy _~YÇãù @̨DÆÌˆ=H€HÀr š®RßdVJbøûßPÑÈ1OÁÛ;«tîÜ æŽìA$@Š•H~ H€HÀ††ï¤Êf‘S§|åСsªzÌ9m‰ ‘û÷DšqòäÉ$4ô¾,Y²Ižy¦]¤ë>Ù•er ”(‘ß“£”$@¦"@%ÒTËAaH€H a®]»-Ï=×XñĵU«v¨ó)$mÚÔ2bDWe©¬š°òn %Àíl]zNœHÀnPyfãÆ½²hÑ&Á65ZªT^Ži®^½CW«Aâñ®]ë˰a×x@$@q%@%2®ÄØŸH€LH`ÇŽÃʲ8Ci=uê µU#œ”>”W^™*©S§’úõËËÇ¿¢ú¦ׇH€H .¸ZìK$@&!ðX™‘Â'00XfÏ^%gÏú˨QÝ¥P!o§Baœ-C‡vÒ>Q}GCBîɸqó”9$Ú~7nܑ̙Cåâŋ昬‰¥À:DÅÛÄbS4 @iRgeK“jJɺtéòxñâÅñzþÎ;eèð>R¥ZÉxÝÏ›HÀ*6oøWÊ•-'’Ì*ÛWΓ'NIÆ,"Ùr¤³ï$£™~9xA Í-É“'lSgȘ6š;âv)ðn¨Ü¾ùXRr«;Fp!¡Á’¿S#ÅŠ\FþÌéÓ¥—´éþóïøÑóÒ¯ÏPéÖõ…xÉ7räHI%òÂ… ÒwP-iÓ±r¼àM$`ׯË?,±Š¸¶–síÚµrôìéÖÓó¢ŠoÞ”©“VɈ·[ꟻƖ¶­œ“#p ¿¶—K'ÈëƒXWbìO$@I@){Þ{ë'©Y¯¸ãwøD²‘ @R ™Täù\ ˆ%À»!2úõÅR¯QIiÞºB,ïb7 p/*‘îåËÑI€H A‚ƒCå ¥jÍ"Ò¡«çmá'o&p+*‘nÅËÁI€H þQýÚ€ïåéÒ>T ã‘w’ ¸‰@‚kÜ$‡% '*Ó?Z#µê•ç_¬íñ<€HÀ|¨DšoM( €‡@Í…]¶B~i׹ЇÓàôI€ÌJ€J¤YW†r‘ x$û÷Êןm¼ù³RôÈo'MÖ!@ŸHë¬%%°9‡Éç“×JÀí`éÝ¿¾ÍgËé‘ X-‘V_AÊO$`¿­9 õ—’Jϲ͜8 û ißµåÌH€,F€9 -¶`—<œ·³=ü Àé“ ˜‡À£Gdó†Ã|Ï·ó HtT"9H$@‘ üµõ¸ÔW‘Ùl$@$`T"­²R”“HÀVþÞyZ~]¶GÏ 5{v‘JU ÛjŽœ €½ P‰´÷úrv$@&$tOÌÝ&UkÕÒ9è+9sg”lÙÓ›PZŠD$@Î P‰tÎ…gI Á:$}ûö•zõêÉàÁƒeåÊ•ëq'Ož,;wîŒuÿè:þøãÒ©S'iÔ¨‘L˜0Aöìyb‹î^sëþÕ ÅsygÒÙ½ã”Ô€J—.-›6mŠÖ‘#GäÚµkQ^í…‰'ʰaÃ$þüÒ»wo¹uë–Ô¬YSf̘á"&Yy`¡¡÷u.Èm*8ÆêÑ·®4lVÆñ™$@$`¬Xc…U¢Œ–#ðÕW_IýúõeáÂ…Ù[´h!¥J•X(Ë•+'7nÜ{÷"'•†’—9sfùæ›o÷†=À}Y²d‘dÉ’…=-÷ïß—äÉ“KŠ)Ÿ>}º|ðÁÒ§O}¾G’1cFùôÓOeàÀú\L²B6Ü‹çDlP˜ñìÔ©SG¼¤??xð@˘&Mý944Tp.]ºtNûÛõäŽm'¤hñÜ’-GÇS¤ˆÌÓq‘$@$`RüÉeÒ…¡XÖ&,gÏžÕJ“1“’%KÊŸþ)yóæ• *ÈåË—¥}ûö2wî\ùì³Ï¤k×®¯P¡'u“ëÖ­+ßÿ½¾½ZµjzºD‰âíí-9räÐcá",›¯¾úªVîråÊ%¯½öš”-[V`É|üø±ÞB?qâ„!†~:t¨CI,ÿüó”)SFòäÉ#Ù²e“Ñ£Gë±1ØíÛ·µÂŒyA¶Úµkk×N:%O=õ”|ôÑG’;·RœÔ½o¾ù¦¼óÎ;ZΔ)“ 2]=¦mú ¹ K{Ì|9Q û ißµåÌ’À+¯¼".\ È‹/¾(sæÌ‘‹/êmä¬Y³Ê¾}û ß/¿ü¢·˜¡â8}úô²uëV-ùÝ»w–JXa™D???©Q£†VÌÐqæÌ™²téR9pà€`ýÒ¥KrðàAm僵rĈÚY©R%yã7dÅŠZ±«U«–~NL²@lÃçÛëû÷ï—~øAfÍš¥ïÿòË/õ<1ß«W¯jåþœFƒµò=zT`¡ýðõ¬P²×¬Y#Ÿþ¹K¶íç™ùýÄ1yüè±”(•ÇÌbR6 ˆ*‘±ÂÄN$7U«V___?"”0Xß ,(ݺus(†G„uñ‹/¾Ð¿ˆ×ðyРAk&”Ðçž{N+e8?þ|íóX¬X1m |ûí·qÚÑÆŽ+ÇŽÓVÏÝ»wK—.]ÄÇÇG+tŽNÂʲ|ùr-3¬°lšؽ{wY¶l™¾ëùçŸ×Š >@QDºšÃ‡‡ñ½÷Þ“ìÙ³K›6môyÌ%gΜҤIñòò’ãLJëo×·ƒ¤WÿzvçE$àa¨DzØ‚sº‰CàÊ•+Ú×VÈ%K–hëàO?ý¤-†_ýµS!ÜâÌ×Ðè ¥Ëhð+„O!ÚùóçuàŽq [ÙiÓ¦ÕÑçúõëR¼xq3fŒä%Š9;kae9}ú´V„1îÓO?­_P\ ŸÌ“'OJ«V­´5XøMFlØÊFK™ò‰6^£a#ØÈ8g×÷Ê*dᢹì:=΋HÀÃP‰ô°çt‡hVÇhPžàÿˆ¨h(}ñi†Òñ^X áÿh4 Ò·oß®­“wîÜ1.kKæ»ï¾«-†Øb©Ay…õrcË/¤Bt7,“ýû÷—fÍšé­ìmÛ¶I:u ¦1vtʱчï$@$@Ö"@%ÒZëEi-B mÛ¶òñLJS¡`íÝ»W+’˜¶q<#(p‹-ÒA,°<"hÅhH3„mäQ£F9‚|`õöy† [çÑÉÒ´iS¹yó¦öƒ„Òe²eË–:òy/ „í{(ЏË+¶´Ùb&pþì5å*ð æŽìA$@&$@%Ò„‹B‘¬O`êÔ©‚HjøAâ… Xì°¥ ‹$ZçÎ¥W¯^Z9KÈŒ1&|%=iX&T;PỈ|”8ƶ6®oÙ²EV¯^-FºèdA´8‚z°U@¡¢E‹êèoDã~ø`ÂÏ[àP.‡®ÇŸ7o^B¦eû{ï†È'ï¯TL„OÉdû‰s‚$@¶!Lýð¼xñâxM>^7BÖK›Ž•ãu?o"«xõ¥²ð‡Uq[ËHsS¤Hâ&âðDD¶á+ñzl>Ø*U*탉q`ÝD*la9#a}„o#¢«‘ÒÇPÃŽ“,ȉmsø7BY Ûæ¹&ôD8†køf†í›Ðãµk×ÊѳK¤[Ϫ *Iï?°÷¼lZP†j™¤rðá$@žI௭ÇåÒI”lÑ8uÂ_ cMô”x•HÀ̸mæÕ¡l$ («¿Å~ýúIãÆuPË‚ bq'»$%³§®J±O¢Ö“R>›H€âK€–Èø’ã}$`hyÿý÷õË$"QŒ0öí9+{v‘¾„9+rúÔÉ_(G¸sü@$@V"@K¤•V‹²’ XŽüŽJ•ñ '·¿j§Q>£©Âç °*‘VZ-ÊJ$`)!!÷åÈ¡KR¡JÁprŸ=}U ¦2~ °*‘–[2 L$`öž“’¥ó¨høðÇT©RJúO[e”“H€œ O¤S,v/IeâíGàÁý‡ê»SÎz‚Sb ˆ%*‘±Ånö'åqçö“²ú—½’1siÝ¡’”«X@Oü§ïÙgèRºWséxŒH€ÌF€J¤ÙV„ò$:­<þyR~]¶G²fK/Ï¿X[J”Ê“èrð$@$@$`%T"­´Z”ÕåöÿsN–-Ú¥ê>§‘Þ/×g:—æ€$@$@v%@%Ò®+ËyEKàԉ˲dÁ¹ú@:«mDzòGÛŸIÀ`õþeÉnißå]ãÜcr  H*T"“Š<Ÿ›$n\¿+Kî”3'¯H;õ‹ѳl$X®øÈž§¥Cת‰õH>‡H€ÜF€J¤ÛÐr`3¸¯"eׯÚ/¿¯;( š”–Þýë‹—W 3‰HY<€€ß¥›’;O˜)§H$à ¨DzÂ*{øò•ïçl•‚ErÊ»:êàGÂé»Àù³×$¥úÃ$OÔJ¢¿ß-ñΓ٠Oç$@$ø¨D&>s>1‘Þ ‘Å?ìãGütÄu™òùâýä€ÛwåâÅ‹ñ¾Ÿ7ºŽ@hh¨ësÑH»þ:)«Tj(ü‘]óó½%ÅŸöŽ® ¯‘ €eP‰´ÌRQиØ·ç¬,˜»MªÖ(*c?ì,O=å—Û#õ-]>§Lúxx¤ó<‘ø®\¹)CÞ¨—øŽâ‰×¯Ý•%ê•¡#›Çè"áé–ÔsRK;Š¡yšH€LM€J¤©—‡ÂÅ•@ˆª0³pþŸrò˜¿ ~­¹ä/˜=®C8í?âÆNÏó¤g€¯íWÓ×ëÄôù Äü]óSJ$}"=û;ÃÙ“€P‰´Ójzø\N÷—o¿Ú,¥Êæ•1“:KªTüz{øW­ÓGºž¯?Û ÿP©×¨TŒÏºu3PYÄSJÚ´©bìË$@$`ü-k…U¢Œ1X¿ú€Ž¾~Q% /].þ¾1>ˆHàÿ ` ûþ½‡ò\ïÚ±b’#·oIƒ&¥]2! 3 i†U  N Ü»÷@ÿ2÷J•B^ÖX¬™ÜIàè!_ùî›­R±JAõ‹}Șd¸Þ>YbêÆë$@$`)T"-µ\ž#lhè}ùlòZÉ™+“ôìW×s&Ι& XºZ°Söþ}Fz½TO—Ît¥ Wü¤|¥®’c‘ @’ ™äK@" y¢@æöÎ$=úÆNܹý¤\ñ¿q(~&Xøã÷ÃòèÑc©U¯„œ:qYryg–lÙÓÇêÞØtº¬¾›¹˜M 6¨Ø‡HÀB¨DZh±y³Ê }êÄjÊgO_•OÆm‘aCGƪ?;‘@DÕ+•ooo}úСC2}û&7¹MÄnñú +'ÊrfË‘!^÷ó& 0+*‘f]”ëñãÇÊmKœHSšU¤sçÎÆG¾“@¼ ”,YRæÿx4Þ÷G¼ñê•É®ÈdÉ’E¼ÄÏ$@$`iT"-½|ö>Ó>\-»ÿ:%?­aŸ‰q&Oþ9”o/ ØÃ]í¶¢œÒø|>yäQÑ«T -¸€9ZOü!3FÛ‡I€HÀŠh‰´âªÙHæ‡ÉŒ©ë%K¶t±ö´Ñô9 P­fQæ7õ€uæIÀ P‰ôÄU7ÉœQ‰fæ§$uj/yñåúô3ɺP ×È”9­käh$@$`T"M²ž(ƼY[T*•LÒ±[U*žøàœI€H€,M€>‘–^>ë ÿÓ‚råòmiÛ© Hë.#%' ð`T"=xñ“jêëWƒ.ÈךÓW,©Ï%   ™@€¼=nvl;!×”á£ZJÚtOÅífö&  0 *‘¦Y û rpÿY¶h—Œx«•dÎ’Îþæ I€H€HÀƨDÚxqÍ4µóg¯Éܯ7ËÀW›JNÖ6ÓÒP  ˆ*‘ñÂÆ›âBàÆõ»òù'ëtÈ‚…sÄåVö%K˜®ª0]¼pÃÒs ð$@$*‘Q‘áy—¾'Ÿ~¼Fšµ*'*tɘ„¬@µàO󗜹X­Æ ëEI€âN€JdÜ™ñŽX@2ñ¯¦ý&%KûH£æecy»‘€=\»rG2fJ#©R1¯=V”³ ˆH€?Ý"ág—ø~Î6)Q*´lWÑecr ° ¿K7Å[Õƒg# » %Ò®+›ÄóBŸ³§¯* d™$–„'¤!pÉ÷¦ä¡™4ðùT D!@%2Q0{ÖCŽô•Õ+öÊàךÉSOyyÖä9[ø~¾·”%23y €m p;Û¶K›4»ìw[fÏØ(†7‘¬ÙÒ'qxêÁƒeöìÙò /H•*Uâpg컞={V¦M›&&Lôéÿc‚À‹W_}Uúõë'W¯^•åË—G9(ú`œ 68íóÞ{ïÉÉ“'eñâÅòá‡:íãΓ?þø£üôÓOrëÖ-iР´hÑB*W®ìÎGš~l?e‰¬ß¸”é夀$@$_´DÆ—ï‹D (èžJå³V:v«*E‹çŽtÝŒ'¦OŸ.Ÿ~ú©L:5Nâ½ýöÛ2|øðXÝãçç'xNPPP¸þP"qþôéÓ‚ã‡ê×Å‹õù»wï:ÎáúöíÛeáÂ…é…ëG•3f„{†;>Dœûĉeذa’?~éÝ»·V$kÖ¬N–Ò¥K˦M›Ü!ŽiÇô»tKòä¥O¤iˆ‚‘ $˜-‘ FÈ ³¿ø]*T)(µê•0N™ú=88X[î^ýuùâ‹/J[XKat£¯3¥ðüùó’3gNI“&Mt·GºÖ°aCÁ ÊâÒ¥KeÒ¤I’#Çy5aí+Z´¨Ìš5+ÒýÑ€rzçÎÉœÙùÖ*¬‡˜wÊ”±ûqqîP„?øàéÓ§£G’1cF­œ8PŸ»qã†Ü»w/’˜xvX¹ð÷&Oùï[DûãzÖ¬Y#ƒ<û÷ï;؇††êséÒ%Mu¤Ïf¿èTNž$ »ˆü“Ú.3ã<•ÀòŸþ–û÷j+d¢>8[¶l™dË–MƯҰ¤ÒŠ›1Ü‘#G”?çSEÄh­[·ÖŠÑ¸qãäË/¿”yóæI»víôåU«VI®\¹¤Zµj’)S&m™ƒò–TíÔ©SZûüóϵ"ŠyÖ®][´Ho¾ù¦ôìÙSêÕ«§-ˆÙPNã2wX@CBBäĉá¦:tèPùæ›oô¹ *ÈåË—¥}ûö2wî\ùì³Ï¤k×®e³P¡BºÏ?ÿü#eÊ”‘’ܹsë{1·wÞyG²dÉ¢×bÈ!Æ0|' p!*‘.„é©CØ{N¶o9&/m,É’%³ †o¿ýV+2PB:tè ß}÷Cv(G-g°rA13fŒ 0@zõê¥ý}}}¥K—.2gÎñ÷÷—³Êwñ×_ÕÖMÇ€.:¸pá‚Vz¡ø¯¿þúËéè°>nݺUpÏÎ;µÏäŠ+t_(~?üðƒ@9ƒb‰ãAƒÉ¡C‡´òÛ¹c½GŒ¡-‘•*U’7ÞxCð 0­U«–~Ö¾}û´øË/¿èín0Ä1¬Ÿ–M(è:u’k×®Éþýûµ<†R uÑ¢E²k×.í;:jÔ(ýL¬d…o+¶ó¿úê+ízàÀ½kÖ¬(Ò—H€HÀµ¨Dº–§ÇvÅÿ¶Ì›µEÒ4•ôR[fþØv†¬ahÏ>û¬þ …0® ~аBBBƒ5­{÷îòóÏ?Çj¨¸(ÞØB‡¥0ì+: :lç"h~ŠP´ŒV·n]iÞ¼¹þ+aÅŠJW\ÛØ±c娱cÚÒ¸{÷n­Pûøøh….ª±°MXPEAFP a5?XŠÑÐÊf¾|ùäÌ™3zKŠ%¶¯†À¢ìÙ³K›6mô)(Äp+hÒ¤‰xyyÉñãÇ®|' pØ9A¹èaÆ^BCïËS×Kû.ψÕjbÏŸ?_+,5jÔЋ;¼,X #GŽtºP­sF'X±¶,Xб=ž!C} –A(6F3|*ëÆùèÞ±• cÛÂ>~šaçÿʰ-oÞ¼QZìÂÞöl÷Ã’X¼xqm¡…•þÿûßÿ´eÛýÞÞÞaoÑÇ´1üX„1Ê– _Õ &¬¦ØÞ†R‰à<+bÃV6šá×Y¬X1G(éIéZà„$@$`3´DÚlAs:ógoÑA4u<˜uÉ³à›‡í`lóâ ¬WÆ–¶a «|ÀÿÎØB +,`a-|¸†-\(`ÕBÞE´%K–håÆ˜,¶H •V­Zéûà‰Km°Eކèã¶mÛêhkC©Â;¢Âìb—èΉøÏÆÊ/"¿¯_¿.õë××òÄvîØ&‡ ?EøŒ¢AùÄV5,¬†51,¯ˆSlÚ´©Ü¼ySûABI‡2Ù²eKÎ}±V°Rb[[ØÈ¹‰æL¡×ø @¢ ™(˜íõ‹ç¯ËŠ¥{äå!•¿Y ËMVÈfÍš…KŸƒI 0[¼°F¦NZ^{í5­XÂ'A3†ÿ úâxýúõ:ÊŠ|wìØQߥ×ýl4Œ ?AlsÃê+%+#ÐÅè—˜ïåÊ•(p9/€‚­â¸ÌŠ"¶™á_ŠcÜ^[¶l‘Õ«W;ÒítîÜY"!€'b/Dr¿òÊ+Ú*‹5€Òþh ¾šØÊ‡¬Õ«W׊îsÏ=q(S| •€ÛÁ¦…B €; $SQ¥ kK\„ 7BÖK›Žž]™"®Ü¬Ü?8øžL|w™´ïZUªT+lŠ© F÷ÏßûÉG|árynß¾­-l°¶ElðÕƒÕÍÈCˆ†ø€UÁ!Î…cë>{ȇ˜T Šd™9s¦:<ØrÛâ2wp€o#‚|ÒÇYžLð‰.%äÁ¶5üá¶Á_Á;VRøhb¼°>Ÿaû'äêóœ Ãß®¯a¾šþ›TVÿ7ž©^$^÷ó& H m=.—NúÈàA#âõ8Ä0°&^è<÷¦ï”d©²yM£@º{%?1ª‹]؆mëgžy&ì©HÇP8ÍT¾„O?íܧ5.s‡ ¯¨ZؤâÎúQäήAÎ’%K:.!¯§;HÇppúäeéòü“€­ Ã[I€HÀô¨Dš~‰Ì# ü ¯_»+ý54P”$^°­ŽŠ=l®%pãú]å«)’-û5Ò]ûŽF$@æ!@%ÒV™’¿ùj“´n_I¼ód‰ímìG$@$@$àa¨DzØ‚Ç4Ýu«öKêÔ©¤a³21uåu   &@%Òƒ?âÔ/ûÝ–õ«H¾Lç‘ ?“ „'@%2<ý„mì¹³6K»ÎU$k6ÖýõØ/'N$@$@±$@%2– ìÞmÓúC’"Er©×¨”ݧÊù‘€K ¬úå9uâ²KÇä`$@$`T"­°Jn–ñºª²±Rý"ìÕ¯ž›ŸÄáIÀ^nÝ ” kÿ•ü™Ò^+Ë٠Ć•ÈØP²yŸù³·Hó6$G®Œ6Ÿ)§G®%°sûI©R­ˆxy¥píÀH€,@€J¤É"nÛ|TBBîK“eÝùŽM¶#?âÍ¿–º Ÿ¶ÝÜ8! ˆ –=Œ %›öÁVܲE»äõwÛX¾Þïö?wË’%K"­ÔÇ% @²daÎËHp<ôÄ­[·äìÙ³áfŸ,Y2ÇçsçÎÉÕ›§dßž‚R¡rAÇùˆÿî» ™²¤e©Ãˆ`ø™HÀcP‰ô˜¥Ž<Ñïçl“F*dk+X ç‘cëÉÿßÂMòâùë‚ò••5Y:nÕ‡ƒãÁ-ûKB‚ïK‘bÎkÂ'O-R­V~ôâÙ¼çQnU¯_½_š¶,çÁ$9u O'@%ÒC¿»þ:)7®ß•Û؂@ÕEó¸}+H}ÿ—\8wCÞ×AJ—Ëç¸Æ(P(‡¬üùyë½öÑÂÀvõŽm'¤NƒÈÛÕ'ŽúÉ­R±JÁhÇàE °3úDÚyu£˜ÛÝ;!²X)Y½û×Ói}¢èf¹Óø¥TEï½õ“äÊIÆ~Ø… ¤åVÑý—)ŸOnËù³×¢}XýÆ¥eÓo‡œö9|ÐWz½TÏòn N'Ç“$@$K´DÆ”º-Y°CjÖ-a«´$Î]D™£dã¨1í$—w&;-çâBð¬×¸¤V¡FÕJ–ñ‘û÷èEŠå × IùÙH€HÀÓ Ðéa߀Çüåè!_iÕ¾¢-fëãÊŸ÷È´×HÓVååµwZS´Åʺwuê?-ÿì>#A¡Ñ>¨A“¨­‘ÑÞÈ‹$@$à¨DzÀ"S|ôè‘üðíVy¶gMyê)/ã´eßýýnɤÿý"§O^‘1ïw’gª±ì\(xâH—>µŽ¼þócÑ>¸FÝârpÿ¹m?^$ O$@%ÒƒV}ÃÚƒº.vÅ*…,?kD]4n…Ôo\J†Žl!™2§µüœ8Ä%€ïÎæ ‡£}hš4©¤rÕB²UåSe# O€Jdx¶ý„œkÝ'Ý{Ö²ôƒƒïÉÌO7¨_þ‡´ï#|;ÙH > É)iÒ¦’C.D{;¶´ÿPÊ&\'ØH€H€þ#ÀÀšÿXØúÑØøehåÒ†—|oÊŒ)ë¤\ÅÒw`I™’¥ælý¥M„ÉU«YT~Y²[޾åÓî¨lÛ·—Õ+öJ«v•¢ìÇ $@$ài¨DzÀŠQéHι&/¾ÒÀ²³Ý½ã”ü8ïOéÖ£¦à? ¸‚@­z%äQ4Æ€ÛAòÛªý2zB'ùwßy ¼*Ÿ­Ê?`\Ÿc Xž•HË/aôxøð‘,˜»MÓxyYÏr‡` Ÿì”ýÿœ“o·–¼ù²F?a^%8H›î)i¦¢úµë×îÊÇãWÈ+Úê„ãuTìïT©‰£–~ƒŠO^~qã9 Ï!@ŸH›¯õº•û%OÞ,R¶B~ËÍ ¡'O\)—ýoË»;R´Ü ZW`Dþ2ñWiÓ±²£b ‚lúi¬K~¢¾—×´î)9 ¸€-‘.€hÖ!®_½#Öþ+ïNèhV£”ëäqùú³ß¥^£’*§%ýТÅ .'€’†3?Û Ÿ«.Õk‹4~:Å¥X‰Ü2{ÆF9¨‚r^|¹¾dȘ&R?ž  » %ÒÆ+¼ð»íÒ¬uyÖÇJÓD½â¯Õ/ñ^/Õ¥i¥…³¬ð{„ùÒ FNHcŠÙsf”Qÿk'…‹æ”ñï,Õ ük|' O!@K¤MWUi.]¼©ü¹šXj†?/Þ%ï8-¯¿ÓFrªú×ê~8v½¤òJñ?“@‚ ìÙ}TJ”, ‹çc«ú¿íê  ©Û¨ˆ´hWÚñ ”OlÝ¡²²JzË7_nR¥D‹KÛN•%yrþmî€Ä [ iÃåE>;X!»<_]R¤°Æ/´û÷Êõ‹8@Uy{\{AEgÍO¥ùÉ–¹ˆ <ÊÙež#·¸yó¦Ìž÷^8%ÒxP‰RytŤ9_m’'ü*ý7–,YÓ—ùN$@¶%@%Ò†K»mó1É!.ëf…éݾ$Ÿ²Ve•oµŠQñõòò+L2Ú„@PP$‹ÆÂ˜>Cj]9iýêòþ˜Ÿ¥Gß::Ÿ©M¦Ïi €ST"b±îÉû²ü§Ý2|TKKLâ¹kJ\'õU"ôm*XBf IQhÚ²œÚ÷–¯¦oÇü¥C×g¸½,ž'°<kìuZsâM`ªªt>yógK¼‡ÆóI÷_O?^«sXRŒ'DÞf: åÑ*%•ï…:EJ޲‘ € P‰´Ñª"9ò–G¤}—gL?+D`Ïýz³ y½¹T¬RÈôòR@ˆ $1:²…þƒÛÛ¨ÅF$@v#Àíl­èÒ…;¥qó²’)sZSÏ ~c›Ö’‘ï¶•\Þ‘#°M-<…#8€…½h±\:z»nÃ’Ò²]Å8ÜÍ®$@$`n´Dš{}b-Ý©—å”JÐÝ4Šn±ÈÍZ°C¶o9¦rìQt3joÅžö–wÆwЉɿ˜²N‚ƒï™D2ŠA$@ #@%2aüLs÷âïÿ’ŽÜßnU@IDATÏV³ÖÇF oäÒ;}ꊼ1¦dÎÂ(¦ùòP·@E›×Tí÷lÙ3ÈÄw—‰ïÅn&@$@î&@%ÒÝ„aüÛOê§T«Y4ž÷G„†Þר¡*rüÕ7[IÚ´©â>ï ‹@ÎÖg{Ö”¶«¨ºÜ+åï§->#ŠO$àéèiñoÀƒå—Å»¥ÿF¦œIPÐ=Ò;Ofy¡OA•6ðdUkŸ|YåË©ëåÜ™«Ò±[Uþ¿ðä/çN&@K¤…¢oþí°ä/˜M Éiº™Þ ‘©“VJa%[¾uù‹Òt+D’Š€J¬ÿîÄNrþÌ5ùô£5‚?¶ØH€HÀjh‰´ÚŠ…‘‰Å×®Ü'¯½Ó:ÌYsÜ–)J,_©€J¸\ÕBQ 0Ô©½dø›-Áf“T #šŠwž,&’¢ÀA¡òáØõ’2ÅSDb#~¾7Ä;×͈Jd‚ð%íÍ¿©T9eÊç3Ý/ž›7eÊû+¥FÝâÒ²-Sš$í·„O73¸wty¾†ä+]ûIöz©žÎ-if™)›ç¸r9@Ò¥ö‘×GŒñ¼ÉÛxÆ·oß–ÑcÞIÐ ©D&_ÒÝ|÷NˆlúíJÒ1é„pòäëWïÈ'JlØ´Œ4nQÖIž"ˆH zíb’[ù 5ý7iجŒ |" ˜‰€—WJñññ1“H”%BBB”›Y¼vw'ÀÛãO`õò½‚hìlÙÓÇ߉òn_!ÍZ—§éb¶Îþ Î!oë »T¶…y³þ¤Åb# 3 iæÕ‰B¶×ïÊ_ÛŽK«ö•¢è‘ø§áÙ­õ4iÞº‚ÔkT*ñàIÀ2fJ£ò¨¶•`h3eÒ*/ ˜••H³®L4rýºl4hRZÒgHM¯Ä»tUùËL½Lž±Ž4hZ:ñÌ'‘€ ¤J•R^ÖDŠ«J7¨»íwé¦ gÉ)‘ Ø•H‹­"~¡ü»ï¼41‰Ï”áÙ¦ceéÙ¯®ÅhR\0/v*)y».ÏÈä +åØáKæ”’‘ x,ÖXlé—/ù[š©úØiÒ$}Õl«#ˆ¦EÛ R»þÓ¦'yðàA™={¶¼ð R¥J·ÈûË/¿ÈÅ‹eðàÁáÆß»w¯üðÃ2yòd™:uªœ;w.ÜuãCÊ”)uŸÿcï<à£(Ú0þ~ôÞ{ ½w¤wéÒ‘¦€EDEéHGņÁ®(Ri Ò;Ò{ï½ã7ÿ‰6—»ä’Ü%wɼ?–ÝÛyörûì[ß~ûm¹pႵ;h+W.yíµ×‚>Oš4IþüóOùçŸ$oÞ¼R¾|yyñÅ…~¢[víÚ%ü±8p@Š+&õë×—ÚµkK¢D¾¡An|ܹþòHªTIäëqˤ¥*kZ±j~wN3m ƒ@” `4‘Q³g.räÐy9¬jO×P¦ìèÒøPº ¨¿ø@~úé§2vìXMâƒߠAƒäõ×_wëÝŒ3B´Ý·oŸ|öÙgzÿ£GTÐÄC½¬X±B··>³F&Nœ(ÿý·Ü¼y3Ørûöm}üÞ½{š ¿úê«’>}zéÖ­›@0ß|óMMÔ.^¼¨Û…õ_‘"Edùòåa5 óøºuë$wîÜAívìØ¡‰:ãïØ±£>±nÔ¨‘ž7 ÃkPDZp#Ÿ2k÷ÒD~³YæÍÚ 0S6|èWWø*2>8.ÊbâŠ?n´Žîê•[Š@Î×~™øfúƒ@¾¦OŸ.}ûö•Ï?ÿ\nܸ!É’¹ÙNÛ[·n›æ¿ÿþ+ÇŽ“ 2(­pâ`ÇÂúЧOŸ &½zõ´”ãÆ Úgm´mÛ6˜ÖÑÚÏB:wî\Ù¼y³äË—/èP÷îÝ¥téÒšLBšÃ’K—. „ÔQ®\¹¢ñqW£yÿþ}±ׯ¾úJjÔ¨!Ó¦M êºAƒR¸paACY¼xq}q¥1i'Kcy÷î]yðà$MšTï·ÿ!g¬iÒ¤±ïÚæ<ÆfÝ£Ðú :É72fN)oŒl¦Kˆ’Þ«M‡JB-n#ƒ€A :0¿Bщ~8®}èÀY9{æªO.:…R†DÖ¨]Ä¯ÒøÌž=[Ò¦M+o½õ–$H@fÍš#¦ã–-[}¾víš$L˜PNž<©ÉØ—_~)˜›6mªÛ,X°@2f̨MÇ)S¦ÔDÏÒ uâå HgÏž=ƒH.™9sf0`€Œ?^ º¡Í­dÉ’röìYiÖ¬™Ö|8Pk «W¯.9räæöí·ßͤT©RòÓO?}ž0a‚Ð7ºuë ¸AôXCÚ9¢ œuB¡B…䯿þ’lÙ²…ÀõÔ©Ssú$Zúi×®x׫WOÎ;gu'o¼ñ†¾ –_ýU;xð îëƒ>L™2éûÎÜ,©S§Öý¡Áõ7!®ÏàÆrýÚ]*ñöíäßßædÆk0ø7†DúÉý›?k“JéSJâĉ¾[ÆCë“÷J™r¹üŠ@r‹!':tÐä¢yóæòã?Ýy Ú*K _hçX6L^zé%yî¹ç´æbÙªU+ùþûïåÌ™3š(ÍŸ?_k7­ó=µ^²d‰&½_kA놉‚V®œór’O<ñ„nsúôim:v5·­[·j†g§N´¿MÈŽí—_~Yk™˜ØÉ2Ûì+Z´¨0Ö)Rèë²F#züøqÉ™3§tîÜYã…¯h¥J•´ÖÐW sÈ/D-&ZZæ°gÏAc A~æ™g4¼û÷ï—ŸþYÖ¯_/çÏŸ×ĹwïÞúžYc…Üâ+ŠVôý÷ß—íÛ·kÜ~ûí7­Éuæsª;÷áÿ°B¼Ø³¶ ™ýÖ|!7«ƒ€AÀ ]D#‰®ûáuÑBž9}5ZêïߨLi‹%oþLÒ¤¥w‚R¼uk0;ã÷‰D0óB^Á<‹V ß>$K–,Z[6gÎý™2vžH*ʾ@)U…¤K—Îé¥,¿I;ásÚÐÉÎjժ顡Dûé ¯@pÁwÔ¨QÚl&0 @Ú´iãÔ|nõÿî»ïj#Ÿñ …Hâ2À¼ÑþñÇzþø®ZµJ²gÏ.‡Ö&mˆ%ækKFŽ©1jܸ±Þ!¦¯:uê(—ø‚Ÿª¿Ê3ªH¹Jyäý‘óÔoÆ·AÀ àçŸH?¸ógo–†MKE›~g”cK“6™´íXÉ >Ä~øAk¨*V¬¨04^ýúõ ÞX}ræ#h5BH´] G–yyY*U ùŒª¡ÿr¹zÿO:¿X=ª.éÑë ÑÂL´3ˆ ´™Ö2i;ŠC‡¹¼>Ú?L¤vÁ, ‘A0ß™li­v˜R9æ a¼5kÖÔ&zgý-^¼Xkiž¹Ñ¦a»Ø£®q¥°¯Ðp"€fêÔ©A]AäÐlbÎF3– 1DÐübgÁ××°&h -ÚN°%ÒÛQ¢ÓõÃq,ÞúLéÓÎ/ÖÔV‚ÛŽ{ë2¦_ƒ€AÀ àC"Ââ;;IéZÈ)V˵+·¥Û«µƒi„|¡ÐG‚É“œŒ¤À!µtéÒE“½mÛ¶éàˆ æM̦¤² ¦O|‘§žzJŸ™AðÕ#Ð9Âq4Ž˜o‰2F›¶lÙ2íˆ_¥§„€Ò ‘6ÇŠŠ¾|ù²¶A‹‡)AûæîÜh¹Ø"É@úÆ?¡/æŠVòf¼&X ͤYݤI=zt0¸zõj‰‘Dì¸ê¶ÿÐbV©REû3^¿~]“rˆ"÷ bÌ=EkI ZÎ1cÆè³ÑÒÆ6)T4«ôì×@&~³BÖýµ?¶MßÌ× `ˆF ‰ŒFðú4ZÈ“Ç/IåêÂjê•ãØcG.È«ýêG{Z¡ˆN-$Q½øÐÙ…48˜nÑF’z†  r&B21ÚµX$É&p¤uëÖ:÷!A-Z´Ðç“›‘㘞ü%iK° &,*üñ<Œ¯"­#ÚQ"ÏY j›­Œ„57ÌË[‚hRïi¶Ü˜¤²LŘÖ-Z¤ý@ñ+$@É’%Jès0!CúH¨Î”©Ÿ\ òÔ ‘Dì¸ZýØ×/Aò1©cÆÆuòäɺ cÃW“k0Ö *è<™Vཟذ;½ôÒXHöÇâ±aÊfŽƒ€ ð?iú/ùó""3gΔKw–%ïŒxq.’â¥rDK2ï•ì‘¥ ·Ë€áM}¦F7ïÿç´,ù庼ýæG“)d­š£ aÔkå*Ä/@H'äÍ™¶BL»–_ž³v‘ÝÇu.!…Ž«|‰¡Í¹3“šh¿þúk­•Eó7nðœ¤hj‰˜¶Ì÷ŽcGsiǃà ÌÐyòäÑévÛ;âêxM.šQ´hÑBZ±½{÷j )ø¢ e.–)Üjç‰5÷ú‹ï†Hÿáµ<Ñ×ú À˜÷JÙò¹Íï²×PŽ}£Ð˜3ù´|ðÞç±oò1xÆü6Ø_fΘ¡YS`k"÷OBxâØEéÑ«®÷/æp…í[Žªê›dÀ0ß"ÃôøG"}]‰•øÚ:ž*U*!•NhBä6‹·Åë„67æb´° :/c‰ Ú¤;ä3šI+À…ώ∫ãqÆ w&ƒ8[ù÷´ú÷‡uê4IÕßmËõö­{Òº}`0™?ŒÝŒÑ `ð? ‰ôÑ{6Oå…lÐ$ê#²I'4éÛ•òZÿ’6}ø¢‰}J3,7Àììäæ©¦™!$iB•”¼‘Œý›ú[þS:>_-˜ׇ†j†ƒÀoÛYf\€ÈK;|øp!¥ÖÚâ&DÖ…Ð÷Ç”c¼D—)SFž|òÉÐNð1|Ã.L·>þøc9pà€¶Žà–S»ví  [¾Ÿžh|"}ðÆÿC¾³Tº¿V[=xƒû¸:9Íì2x ²V8Ëuk/ô@ÐA‚Ž‚3‰ö GÚh÷á‡kŽ •©Þyç`~Ü®úàdˆ->ß®\j »ä㵠ר¡²UØ3S¼ˆË J!È·nݲŸ¦·­ÌÖõ Ïøz[~ööð÷fì®|ÜiK£=÷0™BBkoïß“ÛFéI4=Ð×Åó×e÷ŽR­Öc_/tjw華6ÊôU¥FÁh­Šê ÍAƒ€A ÜÄG¥çzR&Š'Ÿ}¸X¥°zî>Ì o"@P ~Ù/dóæÍº”*fjÈ!EÂJÝU²dÉ`mB냊_AÈ(Y9H%³dîܹzÊ”)…%Z±$…†–à—ý×_éþÞ|óMùòË/eÒ¤IÒ´iS!èS8ew!Ë+V¬ÐéâÚµk'ôO 'ÙC(Î` Ö ö“y‚…" –Pè¢ÿþÚg=uêԺؙ@ð;' 88æúµÎõÖÚHo!Á~/ئ£±%ŠÁÂÚ7ã~—Òª6ù( 1 "ÚŸïQKR¥I"_]¦ry>~Ƭ™šÙø¤;£Ðƒ}AÃf´nV)Wˆ$¦á–-[jJLÕ¤ûöÛoƒNAËGrà’ö‹œ´]»v՚Űú€äQørႌYšMH"í)Ç^zé%]àÀ"±Ý»w×çq>•¸HCvâÄ ]D- )Ì8‡´iQÎ#kÄøñãu…4È+¥\ÉpA±È+DÖJMFˆŸþY§iãú Þ½{dÈ+%vфҖ‚Ï?ÿ¼ö%3ØÎ˜1#«¨Ø0$2*PvóׯݖõkʓʔUòókäáƒGR¿Q‰¨º¤¹ŽAÀ Å@$;u«¡J—&Õn+·oß‹â˜ËÅFHñY²/v-ž#&/HD †&RGySKhÁ„l-é ñƒÔ!aõñì³Ïêü·´%}$v÷îÝ|ÔÅЊR,M!~˜¨-)W®œ.´0jÔ(­9¥‰mÚ´Ñã¶Ú9® Bãˆà+ÊüÈ$ä¦ÈDm"¦}²i ¡…B1{[iDãH€¹Ñx’7˜qS—öQ)Æ'2*ÑãZËíʘ%Kž(Œ–ž9¼|é.Ù½ó¤ Ñ4„߉g®`z1| g:U‘Ÿ&®–OU.É×4T>_!s¢úÒxÍXüHXX>‘ö¢YC“HNX»-úX±©Û¸qcÐa| )ÆŽê`aõ %2FLÑU«ÅÒ¥K5 ê\m`B¶³3G+ äs3EªV­ªƒl¬¶öµ5LáÖ=z{æbê†0búÆ|i&•šUèÁÞšKKH¹F>_KxY´|¬}Þ^M¤·v³LL«–ÿ#u>~ëqóÔ5Ûµý¸,œ»Ez*Ç{ó ‰„æ$ƒ€_"‘ ÈAƼ·P=¤_ÞÄ:h´s´cÇŽi³1&g"·¿øâ —3†x¡ÍÛ¹3°RSh}@©œ…Vs1‘×?«ˆ*hMí²eË– ÐòÇ"Ä©ÀE)WÆ–Xyl1G37~SFÒHÄ:×'ðs=‘ÞŽbÕqt}6$2ºw¸.bˆŠŽŠÜŒ¤ÿåryéõ:Qr=‡©šƒ@4#жc%¹xẠ|í'e†{l*‹æa™ËÇr(¹zùòeí ი‘¾Ç í "J¿­Œ„ÖÒgÏžÌÒD}Ó?>„h‘ÆkÓ6Õø¸>0éXB [ü/í„" Ñ„H"h¯]»fl A&‡(oÆ‹&D±K—.šÈ=zTka‰ØFË9fÌ}>cñU1$Òî Ú€e¿m—ú½ï—H*Ÿq£ ÚˆÜy3úÀìÍ è@àÃÏ;H±’9ä£Q¿ª‡™ñ‘ŒŽ{`®üüB!€…à•¼yójRÕ§OŸà >aŽ&àÂÐú e¤M•{Öþ„Tr:®\¹RGTC.I„#&f‚uðÉ´ä“O>ÑÓøA²Ef“€4’ÉÇ (jݺµuZ°5Á8 Î5–/_®ƒƒhÄXH¦NT6šÉ *èùX7Á:ò‘¦v¶ÜÌØ[7‘W•iÙ›YýðíùR¢L€4h\Ò›—òZßÞ¬íµA›ŽýœÕý¡vvD€&¸îðÁsÆG2"àÅ’s¢ºv691ë’º² ­‚XˆŒ†p"l“¿1I’$ú3¦n‚‚0_“KÒQ8†:OžY$$ætƒ€A Šh÷\eÉž#­Ìùy½IHÅØ›ËüC"£ùî-]¸Cž¬ÿ8}7†C$6>—=zÕSN¿!UóÞ¸¦éÓ `ð/ð“&ÈæóLeÿºsf´èCÀÈèÃ^N»(çÎ^•²ås{mgO_• _¯{Ö‘Ôi’zí:¦cƒ€AÀÿèø|5Iš<¡|õéRåÓ±êÿ³230¼…€!‘ÞBÖ~—þ¶Cj©ê4ŽæÝ8Õ­&D\~þñbiÞºœ×Íån È42|ü)‘˜ A<™?{SP¹5Ÿ´œAÀ mMÐ_½rK¶m>*Uk>v õäPÈ+õíg¿«Ü“Ù¤rõžìÚôe0Ä`4‘|¹–=t^&~óg ž©™šAÀ YLÙÃÈ"Áó)9X¡r>•RÀ;eÇæÎܨ´"­ÛWŒà}ó´d)©œ^¿JÏ×»„{€ëÓ§Ïé*9rd ÷ù愘‡Àí[wT¢à*ú1¤L•BÕŸM®“;ÎôÌ™ó’+_`úÇc1ñsܸq¤Gïz2F•G$r›À#ƒ€AÀC"‰‚Ï÷ï?*Ô¼1"09©§/IÎÉ¿ÿ: ƒßj,ÿ”§¯ýeÎ’Z~^øB¸.oך•ûdÑü­’3_Réô“:ÕQ¸:1c$»wœøÓ.HÑÙåðsräðE$“H®¼TiÀô’+OÉž3­ÊûŒ6áõìW_>~gü2cƒ4kõ„ÓïÀKÏ}' š””&-#—’Åiçf§AÀ àÓ ·gíª}’7&IŸ1…ǯN ÍãWéÿdÉy¼êðî]UüdÉÂmФ“./Õ4¾¡þt£`¬ÄKoh¿a.‡¶úÔÉËräày€{õŠ„¿©»wÈ·SºEÁˆ|ë Æ—×ú7÷GÎU‰“J†ÅC 0i²„òûâ†D†@Æì0Ä| ‰Œ†{¼LÔtèZÕãW†4}1f‰´hSNræJïñþý¥CŠþP5\ò̬uɦrà18"vëÒ‰‰{Ç=Ç×01ã10$2Š¿ ;·×ÉÅó)rãi™øõŸ’¯@¦ ‡Ÿ§û÷õþnݼ«´ŽÛµ«@‰Ò9¥ß&’1ó㪾>~3¾èA kö´*ÝÖ%M"€HåšuŠÈq•’ËÖg×ôµ}©R'•^ʇ£æ ¤²¤*úXþ•Ë—oÊö-Ǥ|¥¼w›-ƒ€A Æ#û}¢ù–böáäi<¡M‰ð·n݉÷™&7®ß‘aï´Ô•y ôô·,fö—-G9qüb¨“Óm‰ŒÍ’!SJUžµ†tiû•lXw0 ¿'—.ÜP&íAû̆AÀ ;0$2 ïó¹3WåøÑ R¶Bn^ußžSª"ÍU‘¦n¬ ¸sç¾Îe7´ïÏrýÚmòvKiߥª 51bpü"O Òæxmܽž?·+R,›|÷Ó‹òÎÐ9rôðy=•A#EVþ¾Ç”LÔH˜ÿ ±C"£ð^ã£W¥FA‰Ïs¥¯]½-ß}ñ‡tUA#)UTil¢ÛѼî=M.^¸®£Ð!iÓ%‹ Ó7sô0îÄlÿ™¼=|i¿ì®ô¹ä•>õd@ÏŸäâùëòè?yáÜuÙ³ó„_ÎÉ Ú5+Tôú‚¹[¤b•|òÖèÖª:Fì.Ûè³7+– ?æResé…ºô¼9O¥“jc­aÝ^|H˔˭,hÁ¨KD¥ü¹ï¡;|A™ý/¿å°€ŒÄq´À_~ºDW&{cd3ý¢]¶|n­=oÔ¼ŒîâˆÆq“"ü§NšªÃCíÃ#°ìç…±¯ì§ƒ˜¸KÜ©Y#55C"#_Ø'S{·\Å<Â[|de×öã²~Íþ®ç"¼#;&Oœ¿cë1ý â‡jÀ°¦¦ÊŒ'@5}x*µ/ò»Ïÿ×U—Ø.yòeHL·Wž”y³7Ê´Öj¹F=œZ+f#žG`ËÆÃ2ùûÕÒ¬ÕRµfÁ  ”Q$ò‡ïVjßȵ«÷iS5Á1%ŽA› ƒ@( 8‘=DJüU^Uµ›#+ø±LúöOyá•ÚºìXdûó…ó1½Lÿq­6¶íXIGFt\D¾=h™”+_2¢]˜ó ]»¶Ëä_žw‰F£æ¥åãwè`ü(£C†öž'î%UV‰À ŸèCÈk&•*Uj(ä Y±è¬ܽ>d³Çm6mÜ&#G×ú]$OãìiëUêÃòZÿ*:>]°¾rçÍ(·U *ru6lRJ Íj|ƒ!d>xC"½ê}îØz\R§I*DuFF £ãUBqòARÛßE—)Tfy¢©‡põÚ…”_FäòÞãÐß§×@iÕ*lÇrÇό߻´y&t #æÜ{Ö–·Ï’‚E²êœ¥ÞQÈÞãÄI ï¿;N2fÌò Ù#ÿý7rîÌNE"E§ úæ³ßUÓx*#G —ŠÜ ’&Kh²XĈo€L"rOnÿ˜c´rå{¤Z­B‘¾þoÊßHñH¿Ï ¦jϰ~?ëHkükÖ-ii€Mp"@V„g;WÕ/wDt1x ²{Œ:[(9ÙSYµ’¨ WBI]{]sWíÌ~ƒ€§0šHO!éÐixî?£5‡ÂõñÀ¾3²\å˜üVs¿NqÃ<¦NúK’©`™~Cš¿Çp} Lc_D x©‚?ïŒ)ëtÍv_£“#@üÂy[¤‹ÊRy:,±LÚgN_1Õ¼ÂË÷†DzƬY¹WEçTzšÛ·ï)MÇréÔ­ºG+Ý„­÷ö>sê:Ù»û”Î3G¡ƒ@LA e»ò2¼ÿtýýŽ ¥GcÊ}ó‡yܹsG–¨ @”‘œüý*íß'îÿ´å&®Z“Óñqþû¬ÖÖg~kw©b¦$¬?Üeÿ£!‘^¸‡˜mWª²¯ ˆ\@Í*Ò®TÙ€ Çj/ Õk]âþÇâ]ú-šÂ7•éÚU]b¯ Âtlð2d]xNåDüqüJùAkÈàe¼cS÷ñãÇ—Wz×—JÕ È#•íÑ£å¡ú] ÚþoŸý3©ÒÈIL©B#¨@ÀH/ LIBª[dÍñ€¿éäeéòRM/ŒÐ»]âÃ3Y%ÁM›.™ ÞT2dJéÝ šÞ ш•>²åH«s%FW´v4Nß\ÚKÄW+ß[~G|C"½pgÈ Y¥Æãü]á½%ÿ¨Ý{ÐS/^Üðžmí1]OŸ²V8'­ÛWr”1ÄÚ=WYÞ4K—çŒÕlbÃ=6s4B"`¢³Cb©=©½{NË*ÁxD3ðø/ÿЩo"£ÉŒÈµ#zŽu=ò™ú­yä­ Œ(˜æ<¿D eª$ÚŒ8gú¿¿´AÀ `ˆFÔB9gÝ_û…à‘ˆúÿý:g³$N’P§¾ å2>s蘪›‹Ów•¿¬ïFNë¶úÌ`Í@ ^D A“’2¨×49¡jG67¬‡iº6 CÀh"=e`G«TnÈJÕòG¨WêЮ^±Wºú$‘ãÓ~X#cGÿ&5둾ƒ¡»nNŠ)àzRï©âòëìM1eJfƒ€A T ‰ žð$b•v\]áS•¦}—ªB"c_J ’ÖäÁƒ‡ò¦ŠH­X5b¤Ù—çhÆfˆÕTU)^Ož¸‘ÓÍ9ƒ€AÀ¯0ælÞ®¿þÜ+•U:†ˆÈôÉku2Yûª\¼pC¦LX¥Kpu­N„Ȳ¯ÎÍŒË à âÇGYBi#7GºÐ€'Æcú0xi?l”ßV¿ÿ&pÒÓØFUÛ¶n—O¾mé‘ËéEîÝ{ [7‘§UòáðÊö-ÇdÏΓ2ü½§Ã{j”´'pæ÷E;uÎǺÊ\ÇC’úÁF Ô¨SX'‰¾pË"d³Ç'X·n<óÌ3rèÐ!Ÿ¿ âúÕ»2tÈ()_>üÏ:™cLçÐá}äº ö„s¶'PT}lúûä+Y’ª²~á‘×ï¨À”•:dDƒqÂs½ð¶=q좼3lŽlßrTÞÑLê7*idxA4ícøFVªV@~_¼3VÍÛ>Ù[·nÉùóçí»‚¶/^¼èò>|(W®\ joß8{ö¬PÉÅ™pÙ-\‰ãxîß¿/ŒÅˆAÀ q ‰Œ8vÁÎ\³r_„j¨tQA•GÌ›?S°þ¢ûšÕY*Wå˜÷J­ºEUÎÊF’>£ÑªD÷}1×÷¨²võ~Á×Ùßb¶páBiÑ¢…?~<Ät oŸþ¹<ÿüóÊOúôìÙSR¥J%¹sç–råÊ ?„s«T©¢÷çÊ•K*W®,GŽÑÇ<()R¤Ï>ûLÒ§O/iÓ¦Õm¯]»¦=zTk¾è3C† ÒªU+¹yó¦>¶yóf)Z´¨dÉ’EŸ7tèPÁz‚,XPø 9sæÔŸwìØ!;wuë ý'MšTÆŒ#ýû÷—½{÷êóÿûúë¯C=îØÞ|6Ä ‰ôÀ¾xþºœRÕeŠ• Ÿ?#UiΟ».MŸ.ëQx®‹v”‘g*mÀ-ñ^+8ã9hMO±T©“JÑÙeíªý~;cˆÛðáÃ5{íµ×¤L™2šàYZ¹r¥tèÐA²eË&¿üò‹4jÔH¾ýö[™={¶@ Ñüaò|õÕWõ);w–|ùòÉåË—µ¦1þüú|«¿ëׯ˪U«4Ùüûï¿åÀ2oÞ<}¸S§N’7o^¹té’üóÏ?²k×.M\oܸ¡¯Û²eK¹pá‚lÛ¶M¦L™¢ÇÁ‰ô9}út¡?® ‰eÌEŠ‘%K–hâ ­W¯žÖJ>ñÄR½º*cùãrûöcs_µjÕB=nÍÁ¬ ± C"=pÇ×(2XN%«"³Ý•+—oʬiK×5Ãuž»ýG¤Ý­›weâ7+tÞÇg:UÖ©†|=R<"ó4碪ªjÕ«Â’ý{Ï„Õ$ÊŽcâ9s¦Ô¯__J”(!'NœŸ~úIöïß/ƒ–«W¯Ê|  .]ºDp÷îݲtéRiÖ¬™Lš4I |Ù³g—D‰Ɉ#Šò÷ß——_~Yâĉ£*qÅ“×_]V¯^Ì´MßhË–-+•*UÒ„‘sW¬X¡5 &ÔÇÉ“'ëãsçÎUþè÷¤W¯^Zûˆ³]»všÈZ qŒ3ªÜ½ eذašh;vÌ:¬×… ’ñãÇËéÓ§õ¼ØÎš5«ïÖ­[%¬ãÁ:3 ±÷YO,%¼Sý[%oTö¤oþ”ZõŠFª¾vxÇZû-ˈ3$qâ*À§•)ž=´ææ˜A V"€™7Ko„9ÿ…³>Ï$Mz<÷ |]5Us>ºeôèÑÚTŒyøäÉ“šX¡½³Ýûï¿/ï¾û®&–˜ŠsäxlÁ< á²R×¾}{9|ø°$H@J•*eÒæe>œ9ó˜Dcª¶$qâÄš Ò'|˜¦-)]º´Ö*ƒ6²X±bú8m~øá‡`~Ûyò<®–9sfMbÑZ:ìsÏ=§IëÚµkeýúõzÌhe‘°Ž;ëÓì3ÄdLtv$ï.Z„ø âI¶iÝîiÕò”?Ï]iи¤Ûçx«!e§NúKN©¼v±)mϯ¿þ*Ë–-s +•5j8=æS§NÕZ|ÎÂ+ýúõÓÚ|¾Ðž$I’DkbÂÛOdÚãWöÑGiß·äÉ“k-VÆ µÆ(2ýúÚ¹§O]– _­LYRÉÛCfK‹6夊Ò6†&äP]»r¯´z¶¢ËfS~yU:µþBÚ5+å+å•N/Ö2åri²ãò$/èØ±£ö5œ0a‚&R˜ Ñì¥I“F_qܸqòÅ_hm#JŽ£µŒ7®>ž.]:m†¶†3gŽ<ù䓚Bú0i#hø´–V€ ZJGˆBÞ9×"¨h5Ùédlh­ŒçÎ ò—¤/{@͆ t𠾕øE:|&™?ÚNÚa¢ÇßÒ’°Ž[íÌÚ ùfíÁ9¢…¬P%ðGÑnÑ`Ì™¾^:w¯ô£çÎyÞh³N9þ¿9h¦dÌœR†¾Ó2Vå}\³f̘1C?lð‰²/˜ô¢R0éYÁá½.æCë!9þ|—Ä8¼ý†Ö²åË—ë&`A€”³†P@hƒ an<ŒýU +¿Íß*£ßš/Uk’.ÝkJ¿¡e¥ªNõ© < M+YEå]¿ö`P ‡3 2dJ)?Ì|YŠË&”=íöì7Ò®ÉXY¼`›òË»çì¯íÿqÔ¨Qš”aú]´h‘&ymÚ´ÑÛÃðÒƒf å€ôqÖø*òÆßþŒ|70[ÄÓ÷'Ÿ|¢5‡L¿C¾/á„&˜Î!Ÿ~ú©þ;%Bma²dÉtp ¾ŽøArŸ “¼ÀL›6-¨KH cAcùå—_ê`ŸÔ©SkÍ(¦p¢½éƒà Ìè¼@LôÇèï.CœÚñøñã]ÏlbF‰»}ÿþCÑÕ[Þ}Úí^0c×kT"ZKâ9éÛ•rýÚmy}@ÃpiQÝž¨4äÁÄÆÁ¡Ÿ¥í°Î!• ”ˆRGA»ÂÃÈÙ1Úâ¸ÉΙܽ{WGºb>s"`y`ºûàâH[|œ $ÔÕµ ¾do«º˜1+¾õÖ[únišûÃÇ.eÊ”z7sâani½Û‚3/|íœ ó/ë5Lį3í–³óí³´I“&”!o·4i“éf™³¤–7F6“E¿n U+™6}rI&©ìÝ}J Éêìzù$?ŸÐUõž& çn¬Û7•\ªúU»ç*ÉSÍJ]Ûe'<€Ïb“&Mô‚6Í\=4±Bëv_C̾ß}÷¼ôÒKúeM[´Á,Žé›þ hÛþùgAcÍ}ǧ1,ážC-‚J_Ï>û¬T¨PAŸŠ¾[·n2hÐ mçXŸ>}‚ºåïM"‹˜ÞÑ "ø|ò9S¦LÚo“—¹¾}ûJóæÍCü­@>Ñ~º:t1³aˆeMd$nøŽ­Ç$ w!ÓAsq÷Þ¬ÛöÞhÃà S\þB™eЛÍb-t["Kß~ûmD€/$鯿þÒ§F4• 'óà¤?¢+V –6Ó0æCŽ €æ9„üy¤Oa6ä¡Î>gbù¶=ýôÓÚäÇCÍ’%®RŸpœ9íj c‚€B&J–,)h‚x Oœ8Q Ñ^ËgÌ:‡]|áS©ÐšˆD“€-{L›ø°ñÀ¶¢É9hÉÀ DažO=õ”&'`BH íùŒ– mZxÅQûøšzÙ²¤Õd—”°´’eÊç–*lXBÛèÏž•g:U‘”©’¨ –Ûº€Á°þ3¤eýåãw•cGœûò…ÕwdŽ`2dÈqÍýq¾Ã9‚k ñ|¿ È!à—îBº4˜høX0gCHî9˜Û_t ŽÚ øRr.>Š|?þøc½ŸÿHÎw’ïZO/þ—–ðw¹˜²·lÙdçe„”>D’ãÛÉw®mÛ¶ÁÆ`õAúŸÐŽ[íÌÚ Û0$2ws0>Lî%™±A:w«áNs·áúŸ¼»@G‹öÒD?ü"£¡ñø£¡C,hÊf&0ޤ/!j“‡¥õP‹h*´D"VÑ¢½Á m]RŵöìÙ£‰`’fâY³fé‡%æB4s™Ò lÿAr‰²mܸ±6ÅA¶0SZiK\¥>aSæn ûÐ<²æÁ¹“N* —t(¤~ØAæÀ‡=~o˜!ÑDÙS©@€é ³&s'H’÷Æo蹡Md¬˜$!Z rü¥ fÍ?üPcž¿ýö›&µmÆ@ãÅÑJqðÈí[wäÝá¿È>¥=DûXµfè~–V2¿ ¤áÔ]v)[.·lÙx$èÛ±}øà99rè¼^NŸ¼"_¬!í;W‘Ôi_NïÞ¹¯5™¿³@™¹?•þ¯NQélœ'ãvìÛ“Ÿ!͖~ÑZÂwÄ™F8@Ü,±uNXk~¯ ›öëXç@^1EóáL0}»r©@cê¬O{?a··5ÛØ„Àã¿úØ4kÌ•t8{÷œÒ)zÜéîÇïV %ñ?ŒjAû­Ó°˜)YhB‘tÈ’õ€#%‰åÌ™1b„nnOeÂöCf¬T&h=xè±`òCƒ‚`¡8p î‡@‚R|³Ðî¡Q!`"GŽ=rסÃï !~dþf˜Œ] š|Ç´1½{÷–}ûöé‡8û¬Ô'l£¥„¨9¦>áXhB 9øð‘„à2üã .¬ýÒÐ6:|ìòÕW_iÒ‡yÍ&ÚWÈóíÚµ«&‚–ß~w˜%ÑrYB¤.8"øe¢£oüôeå´Ú‡µ>þ’dÉ™^:<_-„öÑÕ¹|_ê+7•{wÈð3”…"¸{¹WŸQ3ÉS„t_ ©V«P°³·)Gøõ>’åKv™®b™ýóz¶ÃÒn;ÉKHrLÍëBŲÊÀM Œ ήT&VÉ6HÄÈ{*|1UÛ?-Ä"}D–BªXð×ÂÜM€ã¹N4”®ÄÕØ­öhF-±§>q$^ö¹Xí­5UÌóv!2 ¢£Ÿ¤½}›ySEÄš³E(ÑüB š@£Èx ~€„Øçfß¶÷ÑmÈ´;¾ŽôÏøì‘ÛøN:HÚ•, ü²ª`ÚîÖþY±t· ¬z¤æ)’3W:\3~jwÅ]£vEøÕp\Róx[nAÃ@"‰¨&¨ s2AdÛ·o—š5kjísXc OT?Z{^bbr– ¯‡ ©åæÏÞ$¼5Oú¾}+R4¼©LðQÄ‹¿"d…ªÄAí_2|ú0ïâÏÇøx(S¢D´,%Ü ¡UHkdÄUêü!¾˜¾y8;6ØeÐj¢õA˜R»ÉßD‚[¨8‚ ™e¼–fQï´ýǼð±äzýá7G?œƒo$¦yÈævRÈð÷æmqôuÄ-Ä.hÝõÌ’5µ¶`„–xœß$VŽ ãIþ‚™õoÎÔy¯ÉG_tÔDÔÓ„--ZnWÂ1üNÝ|ZYì ÁZSqïðW ËÀù|÷œý-b ÀØ.V–ük ‚!CÀ‚ ´¤åòáª?ú±¿ŒñwéÊט¶\ÛÕw™ãÌŸ>,ÃÈ~_O»¨‰âØÑ¿I¯î?ÈŒ)k>¥qó2òñ—¥×OéÜ¥øî1DæÛæÒüpã„$M–Hk ÑBbº&Åi>Æ}¸H™ÐâHËv¤a“R‚ û­A³´ä ¯šùܸT¨Mx¸à´ÿJŸzúêØ˜@Ÿ?­“'ëÕ?(ž~à8^Ïß?ó࡯£ÀÛ  qiР6 ¢Q$ý dœ%D|ãk 1ÄlÍ|XC.ñ]ᑱqØS© etÌ÷hc‰'ú—‡0Á4æ éV­Zé2t|§ÑtáÉ_ª·…ë¡•,Y&§N4¾Yý½?ÿr-Y©åÒ…Û¥yëraÞXc,^*‡lÙpX²eùB‰å`@O0sîºr™É!m;VV¡´"ÈÓÂKÑÎÜ7p„@4¶páBùvùÔ©SZ“Ì}hŽ3F^xáýƒ//V$55³ëÖ­«É(÷ AkŒ¬3ÌYA.ÜW¾3Vª-+߈ ÷²FÐ ÁfÈ‹/¾¨ÌpWÀ-„´Ah²íYì®øCà¬,öþxyAÃMÊüŽùÛã;‹¯1cä»ÿÍ7ß¹i€SÓ¦MuÙDÆÂß/O¼ü Æ !˜€#f{"ÈÁí9¾Ã¼ZþÌœ–0†ÅÊ—}Jù”$IB•"*‹þ®=ߣ–$Q)§œÉkw”Ö×y ,gíÍ>ƒ@døŸú#þ—/wDmÊ¥;K¤q‹29ÝoÎY§4Œø™dØ™`Ææ 1eÊ$òñWþ´£äÙÏ“×ÊÁ}g¤}—ªÚŸÉÙùîì;öš¼;âMJ‹•È! ›>.F¾Çǯ’ ç¯Kå/åì!åÎ5ü¹ ¦Ô ëh²•ó@KyrŒD倯4DБÐó¥Ü~™Ž¯<ô0?ò@%0Å~.4v<”œ¥[qwîøYNTA<4~ÖCÝ~>„¢kO—bG»‚‰Òò=D;øÀ‚‡«}ÌÖ9h•x¸ºˆ©a “àfàh‡Àa›-ààiióLCó]ÓÝ‚=/Œ«Tª®Œ*Axxoèì€ú :ÔÐQÓ'±Ž" ¾=_‘¡ gMå{MùÑÐdxßEòÖð¯ôý ­uŒt9Ý»w×nH$/O­[·ÖÄ Í6Dˆwüz!éT¦A“éAKL[%÷•û ³H$DŒvd „޼‘|ù>ð‚AÐd”ï5fj´Í|·ÑLB ­¿#"ù!–|ÆÅ‚qYZB4šŒ>|qsàûB!®I¦^ìxa»†ò»ä¥Í’U«VëM9–„#Fèkò‚Æ<É‚P«V-½æí7ï½÷ž&ÑM¾{¼ì1È8ZVÈ'SX) ÜR»I2!nâÔ¬òÊ˽#46.¡##ÔmÌ;‰N›u"ØϹ*?¨Èkˆ4Ûvá'xèäïWI@ž ò‚Òb8{ÀÚÏs܆Tà‡É5J• ·ÏÖA=9ÒÉf¥Ùøiâj]~íÅžµ!y¬1rìÇ|ö<<\œ O4p®m‰]cbo‡ÖréLøîX:gÇû"ÈâLB#©V´´uÚ"{]dk¿}¤2ö û¹ÙƒˆI»½­·¶Á­$KD$O¾Œ:²š 7öœ“3§¬“ƪäÙªòUTþý¢m·Rã@¨ 9–T«V-Hk)âÞ‹"S@IDAT’}€ÔKáÈ7 øY÷’ ÁÂM7y#!£(&È@à˜PÒ As•¹€~cZ–~CP\dË™V~_´CæÍÚ¨çkÖ)âÒïÅæl7¯ßUZý;º¨ûã¨gZÊä)i‹ϧä,Ê—’dúÖç¤ÿíçsxŸUáýn˜öþ€!‘nÜC|"ù´÷Ř%Ò¬Õ: pÞü™œöFD%ò‰ ¯ü2c£ŠøN"üx Ïtª,ß~ö»äS>S”ƒõ+}ê‡H)Þk˜ö± “ú$êï7d^·n<"µê µ³£C¬@.®[î –8ºyà^á,rŸööó¬óík4qh-¡&Qö˜¬Ñ(âyDƒˆZG +sØÆ´,ù d–‹ÊÒôûâºTm‘âÙ¥výb!~÷!‹ÙéìÔ­†uzКçænˆ%í®«å&‹JWwLõÍ>ëÛ7oÜÕfó$IH2E<5›‰dÛ–£JÔm˜ø|ã—Ê‹ š^»`Ñ@Ì÷­–¯Š³È^¨bzä¿;÷ÃH7Pâêßÿ|"íÍ)ˆvdÄo*ÿÇ*5}¸ìmض|ñe ï›åÒ8˜ªmmI•¼˜HO¢Æßþ¨­ÇÌVÿfó âÛHÔ#@”6&q;‰ŒúQ^Ñîçê8{ä>Ç0A£)´~¿ìi“01£itW,òÊyLè Ki'œVŸÖ9d. :¼â2Bæò¹bÚ¶xavÇnåaµúrµæ\ÛH†‹æ‡ùœûø>‚¾£T¼±ÄÂÆúìé5þ±­ÛW”&O—Õ™B¾»LR¥I"u×/'\bèÊ'’tt ÓÇ—Ÿ-ù¯Ûˆ'ärÛÆSáš¡uæ7Ç‘Dâ*Á1¬6¾J"qMâE¾ìXAxÙa¼Vaþ>È&Z&‹pæGíÓ›…&Òñ7óæëvÏUVQ´÷ä¼JÌ ]øÒMûa,øe³Ž”湩ÞÇ+ÿ–.ÝkhSƒý\´‘ÈþÎíÇ̶AÀ à›`•8©²6”çË‚yÙ2oO:UGIC°ðIÅÖò£Ç§Ñ,… ÖŠÜ·æ!¥T! A'ø<´B&ÿEÌ×Ô»†PZäÖÕσ;´Ì19K€…£µN”(¾Ôn |1U¦º ‹kíä ^Ótôöuõ½Bkè)!€‡ˆo”%%Jç”ÊÕ ¨Ÿ¥/úDÿòå˲qãÆ`MÑ:C _BøZ„<þ¶Võ-:t±o]_lÇ—"ëk´¡¡ITFþ3VG,ìcóF俽ÿˆléjê/Ø%G¹á^z½®úA+‡öŸ•\ªB…õãG—<$>õ«r\½.ƒÞj¡<¾þSûI,’5Ä(q¼Çßrâ7+„·E#ƒ€ï#€Ï#‘Þ[6öéÁ’ žˆkþÚNŠäöÙ#í:"šíÇlc×8±9œ…¨~H¨¥Í~7Ñâ Uìܹs.ö¨~R^q­mÛ¶é~Ð`¤2yòdÝžŒV–'bÌ€+?¦cAúoƒ,hœìâ<ÊgZY0÷[YÐpbÊŠ DE–DZòÍc©²¹¤ßÆêYTGŽªºêŸ²XräLç¬y´îã“ÚÉîªIä d×â¸Dæ|²É>AÍrÍ5Á\øòò‚5Ú`šh_,¾,á冾 ¼üÍ[BàßKòÓrŒÜ.,¤âŸM†{ä¿uœ5þ¹¼ôX‘ÿ¼<ácÌš.‚­¼"à q5/Ž-^¼XïðwÇÏÞž¤ŸÈJÊ‚ù‰ù;G®ÁgüÓIm]bÌÙn Ï€•âçê•[Êq™"pµ$mºÀ€„ûÎJ›?ä¡gSi€žjVÚ+„l²|é.íÝôé:!þ·'¿ÊWY¶|­­|µo`)<—̓€AÀ'àoöWe¨þ¤óà)o ’i„³£¶ƒèm»à³AœKÞP{¢”Iq…™‡˜]êÔ©£³`î†,:^ÇÞÖ¾ a 9DÕ+¦P´3D볬 ©³Ì<¬19»ÊàØ&»0^"¿!£Î²@X¨÷nϦôë˜%’Íb ©X¼%Y¢Thýl§¥5½u]wûåû€)˜ *H ¤“0~’–«}A†ønÙ#ä!ìV9V\ m|ÐjóRB?ä ^|¨nÅ÷’¾»|± B!Dé3Lé¸;ð™ d à…m:šxÈ#äsË”)£ )/Î"ÿyq²g`œT¡ü=!¨¡Í ÒÈ ÊÈ‘#5±%K/2T|×ù®Ô6qâD½0^pp`?„“JTö—9wï‹'ÚM¤(¢‰„D>|øH¾»Tj¨—BEkIá“7`”. ‰¿ød‰NéQyòÄ%]€|`΢5IX¼Då¨ûäÝ:©x:/ä’sÓÄ `ˆEŠgRvQ3Û—…—gfvi­#´ŽAªÐȸ#˜×®]«ý-ãyö¨~ÆDæ´Œví•uŽ•%€\ªÎŽÓÎÞŸuž}м‘Ži¦hüÑ\Y‚ÖÓ‘@ZÇ¢cí¬6{tŒÃÙ5I›„ ÿAmÄÒ.Z@ãV¡BMâðÃ奇JD–@¶øîá€à åÈKZH4˜ã;à šcrvZ¦m4éhù®ÐÄòˆØ³p‰ü'åj‚„Ho„Fš”R®„¹¡Ýæ:¡Í ’J®R4£Œñ£qµÜIè2Ù±cGÇ"‹æ•¾ÑƒçD—M¤ÈócÄõ •Чe’‰[ÂàÈá ’+oFƇ\pý‡6‘ *\D„*ߌû];P§Ï˜Bw¹z—JDª ‚ipÆ·Š¤â gÑŸ#r-sŽAÀ õð{R®b!ÿl#UqÄ×$ ˜¿™7LJ†‰Ü’ÔY·H7¯gúŽ>x!x òhiÑ€CØ,!0Å"€Ö>Ö¤x²S61DèËþ¶ ƒ‡ÖùmíiÇ €ùyH áÅÇU–ÌÓÞŒüg sçÎÕ„–mÜ._Üì©Ï˜7£Öü­9ë‰DÆDº:7éÚÕ[röôüv‹`gPS;uê$2öƒ…*wW2ycd³H‘:ÊYašH¯“@Òxêä)¨È"Äñ)•d<:fÄ `ð_HË‹/’H46Q%hI*n$v €v|ÿÈEŠ–Î.¡EÈ[6ñ³Ÿç¸M¿˜”!¥ɤ”+â*ÿ­«,¸1x3òŸHC‡Õü= Ž•Èà ¾*ÆœíÆ¡" •&zök¢’ÄAåyäÐy)©ò¿‘ -aDeë¦#:ÂŽD±\­d‹6åäU§G¯ºº·!ÁÑÅÅ€* Ç^~À|2ø0ÙUðÉœ©—mÄ [€8bÕ³üÿçM)J|-ó,•ÐÌQU+<qÄ¿¿D«–;%2ñt,”`õë*K€·#ÿ=ªÍÓV üA!¿îú[ã®u¤4‘8¶ž;Bvnz]ã²ë>Û¡Œ÷8'˜uaœËÓ¦Î-[ÖÞSËzkw„Ö¢$‰²Jš”i$î¿ dïvQË ÕKèrÿÞ}9wá˜|6¡]è ýü( wªÀ¥#Ï Lø‡fÊœJ™#"NÞý3|?E€Àš?ß#ÅJæðÓ˜a‡ZDMˆzÇ÷ÑQðó£¼&¾¸h !€V„<ÑÙî ¦^H£Ž+þ¬˜] c#K?9Kì‘ÿø\BB ºÁ7ŸJÄù9ÞQB›ZG‚d˜/>½”¢%@Œ<”5jÔpìÊç>Gªv6‰W  «øÜÌbÙ€øR¿Ðýiùð+ïEF5¤TX8|àœRšFÖhÉÙ™[ùŸæÊ›Ar«2’9Uj%êÉFWíì¨ÆÄ\Ïû¸ªíé+cixãõŸdЛ̓•Atç:á­íNŸ¦o!0þûo$qšº–º/,*jg¡ì,B>¼8 ä!u$’€¨°Ì¤²"u`c¿ÞÍ›7µ†"‰?¥³¾È$ZàVhó"‚jiJO:¥Ó 9»Ž}\Ù6µ³#‚š9ǧ@uêäå ²ˆ‹ÀY•Ì=g®ô:gŪùU¹Ç*.kÆúôäÌà Nˆ?®N¶pîÍÁI³Ë + ÄLQ |h òæ‡jE®*Y‘ÿ¡õä¼ÐæE°Œ]ü¥¤b¤ÌÙö ›mƒ@x |æèChYiL™2±äV•r) cÚ…%kö4AÑsáéÛ´5ø Ô?Ô{š °)-©R»—Ç_æfÆiðL–€ˆß)C"#Ž9ÓMt$EñcÄŸÒxëÖ=Ms+³tUº‹5%¶Œb|竨RrKl×i½bÓÜÍ\ ¾‚€Éñ;aHdı3gº@À1ø…ETÎK4ŒE‹g—&-Êêz¬.N7» ± ºO•gHýÆ%%…ÒÆ1 þ‚€!‘þr§<8NJ7~óÙï_Õý~}`ÃHõVðK˶åuL°÷ŒöO¤Ž3±‚_îÌËHð Õy”YÓ4yî²åðà—²rË͵~q6³Ï à6¹òF}E(òœ6kUV¦þ°F—Me°”;ݱí¸"ŽGUåª*jJ)^:§ôè]WŠ•8$£?ékÏܾ«þ×ðâÅ+2è­zþ7p3âX…€!‘1üvÀ2ççõB5œ§Ÿ© å+å šq@žôZ£‰DÓqôðãà—£Š0Þ¸q×o‚_2gI-o}9Ó|0fà  TªV@H÷óÑ»¿JùŸÎX@¹ÓŠ8¶i_)˜¿dÛçÒDÃÍ% ƒ@p ‰ ŽGŒú´î¯ý2kêßRJ•d|stëfë<*ÎÏ?®Õ¥×¬Ê/VðKÓ–e%C¦”1 3ƒ€¯!píêmÙ½ã„ìRËž'äßG"»—ï•þÚÈ+}ë ¹$ _EÀH_½3‘×ÙÓWµéÇWúÔÓ>‹Îºƒ0žS ½»t¯TùÅY;³Ï `ð T©9¸ïŒìTfêÝ;OÊ¥‹7¤pѬR¨h6eÎ~BÒ¦K&¿Íß*kWí“ Uòy梦ƒ€AÀ à% ‰ô°ÑÑí£GÿÊ/36ÈÊ?öHãæe¤FÂNK3YcK™*‰¤W©wHrLé@#ƒ€gàEnÿ?gdÿÞÓj9#'Ž]”Uª³P‘¬Ò¡kU½íXÖ¬~£Ú:°|é.©Y§ˆgdz3 DÀ0‚iïŠÚšÔá¬Y³¦}·W·Wü¾A2dM 3dJ¡Ë¦M—EmÇsg¯IUë=_ÁLÒ¢õ*ÝUÆPÿ¹:¤²ëKµäast~²1 ¾ˆ€ß‘HªŸœ”ëׯ8·7¸uë–N™‘>}Èlú}ðàP;Ó™Pw3Y²d/Þc8/]º$¤hˆJ)P(@Gož}TdñC0`€|þùç’yYûd±­IejÄ `pévNž¸,d-8®LÒÇ^” ç¯ë´;˜§‹¨ ԿΔ9•ëNÂy¤d™‹õ«1KuQG³w8»3Í ƒ€Çˆ‰ÖoúôéšîرCZ·n-4K fßÿ½L˜0A»N:É;wä™gžÑûÛ¶m+‹/– h¢¸téR™={¶>|X2eÊ$sçÎÕméAû¸jÕ*9~ü¸@Z5j$óæÍ“öíÛË·ß~«Ï…l¢…ìׯŸ¼úꫲaÃéÕ«—œ>}ZŸ“5kVéÖ­›îwÙ²ezß½û@‘ÄT’YEÈb‘âÙôvš´ÉÂì7ªPͦg¿òÞˆ_$múäRú‰\Q=s=ƒ€AÀ à(#‘:LÇh"Ñ.bJîܹsÖ®cÇŽ:°öŠ+ô±víÚIš4•Ò¥K'Ë—/6 | Ñ:rÌÒ,Z ¶mÛ¦ÍËÖg;´ö±æÜí"hHLçZSLÒ2»wï–9rèÏçÏŸ×kë?4¨–æÓÚg__¼xQ03G|&!’–f•va·÷e¶ Q‚‡Ê7¢xMg#€0’Å«rSU\J—!¹dTIóIœOÀK¥ªùƒÒZù~hB_UÉÇǼ¿PHÍÅ\Œ¢jËljê¶Gúž¹æýû<Ó‘ê%ÊHd‚ ó- ¾ŠIÌÁyòäÑ„Ò6jÔ(ˆBÐ „í"þ‹M̾o¾ù¦öw„8⃈‰›ÀÚ@ö0içË—O›±oÞ¼© &þ¡ fè3fȳÏ>+]´¡WÈ.7ÊyYú?þÍ›7ë.Ù†¼,XP¦NªI`5ô1LÐæ ÍÄÄ qdýä“Oê9>õÔS7n\}¿JWÇC»9fˆéX$ñâùÀ 0‚YtÖÆömåÃHzªtéSè üË–Ï­I£/j#s¿²)Ì.ÝkÊ×c—I¯7 ¥>¢2åsÈ”Ÿ?QÏDSM)ª±÷ÔõîÝ¿£ÜtêèßÒÈöe$Ò>ÐbÅŠ ÑÖï¿ÿ¾ö9„0Bú0ëBÖš4i¢´‚+LÊ6¢Ÿ!Š¼Ô©SË'ŸðEާ‰šGÈÑÕœ÷Ã?h_ưHäo¼¡I-çaÊÆ_ñÝwßÕÃ%¸‡oÌÔ¾\¹rÉäÉ“ƒ¦R¼xq©[·®þÌ›y!óçϯ??ýôÓòÜsÏéèí/¿üRG•;V²dQ‰m‚´gÏž.ÛššMƒ@ŒC€ÌW.ßÔËåK751t$‰Aé©”)s.D1Û*]Z¹Ø$Ô¹oÛ±’|òîé3¨±dÌlJ“Ʀûï s-W)@XŒ@àŠ”ýK¤tD„€Rë@À"+®¸ ù÷ßµÆ"wûömm qI¢º/_¾¬ÇCºžðæe®o™Ï­sÑ$¢m$O$ä×J³Az!ˆ/©„öíÛ§5 ŒÏ.øNâ‰Ö:Ï~œmÒajwuܱ½«ÏD¼¿Ðýiù𫦮š„ØQirÖ¯;(Uªä)‡8nv"Š9/©”RÄËš$Þ’+Š$}¾¤>«ýI“%Ô“¨š”&­ZT~D4ˆ±•$º‹÷ºÕûeÎôõÒ³ɪ‚€Œ ð"@yÕS²Ê+/÷喙=Ùl¢Eél´®$m!XAƒ”9#´ÃÍɘѹ¯páÂ.»ä8PgB.˰ĚWXíÕ"‹VÔ×M*%؉ã]r­dÙy¶s]RmÁ/›E)zÄ2ÐÞ¸~Gnܸ#¼D°¾q=p}Sí¿©’ksœ¼‰W•Æðš"•C}Š”I9L¬5×ùG“èÛThI©r‘&''©Òj'I>K@,ƒß#Ó­þda™ðóKòþ›ódàˆ¦š¤{¤cÓ‰AÀ `p¿%‘²W“1õ©I<^¦L7§ùf˜³}UÐPìÚ~BiÈŽ­Ç$CÆ”R¢LNym@ƒÎø÷î=Tü¾:3.àâAP •T zlSrÏÚÇö­›Á÷‘Ö­!Ma²ä 5ÙK–<‘*Û™H›–ÙN¡4ˆY²¥VÇÙ—HUR‹"‡‰›ï‰‹Ûm»Ë”Ë­´Ã·eô[ó•äS*=E´Å\Ø `ˆ}ø%‰$Š›À"ª‰®&¨†âÚ„Cª¢½))›äü¹Ëòé¿ÉÁýg%OÞ ‚ƱE›rÚçÌ÷U.½±,8ÁžÞÑ#Wá}EÔYn³~¨ö~~ðà‘&~wUòë;Šü³¾«ª£ð"ÀöíÛj´_µQû8ÿžÚ—8I•¨?¡^Cðx°ïÃ|lßÇ6í“*RHîA#1šu‹H¼øqeôÛó¥ïàÆ:Z=fÌÌÌ `ðuü’DB ß{ï½ ZÛ:tÐu°‰~†D¤CÎEg‚æÒî«Ègjh;Ë#Ià >‹‰%rÖ•2ÞÐIÑ­ ˜ÐúrÚ‡wÞ¸qK¶o>*e+ä–jµ ‘œÖØ\] ?·Iß­”%ªF|õ Š/Ž^ÇOOâ*Ïxês\•Ê5ûâÄùŸÞ/üÙâ'ˆûŸÏ*Ÿÿ'qÔ>½ÿ¿ôÿSí9‡}z­öC®Ø¦åîªú ÜÇXù¬¼`õÚÕØé s,ý¨J×|F=r\ÓVíWçpÇõùÿ­*“?ûqÑä|h«×Êœ é#OÚCµ¾o­i£¶¹Æ;÷‚H"m$Œ§«âiLªm0³ñ·%Žÿß±ø’0Q1a£$y89Y¨pƒ–¡Š e ÑFvïÞ]G€ÛûÌœù±™ˆŠ9ÊtHÄèͧ/ fÕ'*ä‘×6”Áo6W~wñe¬ ÀyoÄ/:á3¾F ˜ƒ% k"T1έ¿ rÿ –8ÁW‡œ“i?®‰9631¢¿#‘kÖ¬Hœ½œ!¾ŠC† Ñþsî…Ï!ƒöoŽÀ¹3Wuª®;*Qýe‘ A=Û$¯¿tñ†¼;ü]ßü¦*wIzª¾CšHÏ~QŸ’ÌÇa4Ã3ÄxÖ®Ú'§d•W^öë×OüNiÍ”$àùòåÓ‹µÏq¤-y$1;“”)SªZÀ)ƒáwéëR `€¼öFeùqü*Y»z¿´ïR%D™CûȵxäðÉ•'ƒ}·Ù6üzUÞ‘ôªüáUóm#Iô«=ЄÒʱÊÉå:{Ú:i×Ñh#ýø–GÉÐßè9GâH*eÅ2>ôQx\díêR³V­H]ÉoId¤fƒOΞ3¼1²™üùû]Od£æ¥V89uò²ª #2wæFmêέÈd†L‰s †ÉLÍ cؼÿ=]útç¶ã²|é.Ù±õ˜\½rK®_»¥mŸ<‘Ú?MZ-¯õohßm¶ Áˆ/‘¼÷ög:&!ØóÁo˜4i‚¬Y»:Rã7$2RðùæÉøqÖ¨]XÊ”Ë%Ó§¬“áýgH»ç*IñR9ƒ ÇúÂųi­åçÎØ¨ë4£™Ì“?£äJ¯É%u™ þÿyógÒK³VOè¿é}{N뜑˗ûÎÈåK7傪Zƒj#×+mdeóé·ØŒÒ à3é3·ÂóIž"±t}©¦ìÝ}J¦LX-«Wì•¶ÊleU§9|ðœ(”EN‘bzh,ØäÐyùmÞVeî>¯Ò!%•Üù2JµåIŠTF ßG ¡ª¹^¬d½tèZM§úٳ뤬_s@V*‹…ν&ã>Z$onãû2#4|C"}æVxo T°þÞÓ²xÁ6y{ÈlHS»~1mòªþdá`N™*‰”, à?uR¥ Âä±\úÛ휖2 OzM,Ñ\r^TÉ_î“Oß[-¥JªKšëÄrvíÚ.“y>ZPè×c–$JV’$õôßXj”XIòç»-.^’‹gDÞ¼>Zæh.ê7l“áï× aUrïlÓÊ ày ‰ô<¦>Ù#õ²6)%å+æ•)WËš?÷Êùs×%[ŽÐ†Ð8Rý‚ÅrPb Gc¹J•RüổÚç2·J!¡$•PNE2½U çÌékÒ¯Ï`iÒ¤‰5$³6xšyµÿÐ:¯|ÑF¿ÿ….¯Z;s,æ#0yò$9}êoC"cþ­ö›é7·Ê3%_dÏ~ dÍʽrûÖ½ RáéÉÂŲéÅ:ï¼2‡R¤r¹ñïCÚD–M™½!“J´c!eÖƒ€AÀ `ˆ3îc¸gQ©ZpŸÚ é3¦Ð ‹ËWÊ«›‘Z䨑 šTZA;wîÜÓšJ|+-¥ Ú UsÌ `0 ¾‹€!‘¾{oüzd˜²!‹,VÐε«·•oåYí_iÚAS™'_&E,MÐŽ_ßt3xƒ€AÀ `ˆU«nwôN6EÊÄNƒv<¯‚vÎɲEA;9s¥ ¦±ŒÊ èEÈ\Ý `0 þƒ€!‘þs¯bÜHíA;Uk–i$hçˆ"•h,]í)§*Èü{ÔGm%Wî 2ö&éÿê™>y­Î³V_æ¸AÀ `0 è@ÀÈ ž&m2]?š2‚Y²¤–Oß_(-Ú”—’edÔÐÙºÆtXݶïREæÎÜ(äND’%O$5ë‘#šI¿!%q’òõØe2¼ÿtY8o‹[Zΰ®iŽ ƒ€AÀ `ð†DFI‹D¨äØhë4,.h!ËUÈ#í»T“q.’¿×µçÌŠ|’ÖfÆOëB´Ë)¥ö3õq[y®[uY­êSðæÜí̃€AÀ `ˆëÖ­“ܹsGìds–AÀ  0$2_„4i“Ê¥ 7$SæTrSÊ<¡ÈcýÆ%䃷æI–¬©¤ÏàF2Oigÿ¼>TÿÆFÍËȽgä`ãJîܾÿÿöÎLŠâéÃ¥9çœsÎ9 ’ƒDEý«`B0˜@‚ŠHPA#*ˆdTDE‰’$'É’“dðë·ùæÜ[v/îîíÞU?ÏÞ†™éîygnæ7ÕUÕríÚuéÑ«©·Uôw% ”@P¸pá‚;vÌcŸNœ8áuiâôéÓ·ýûï¿åÒ¥K—±Md9dÝûsõêU¡/Z”€ˆ=‘±`—)ËÍál6-P0«ìÙuTê7*%ˆÂÆ"™4,‰ô{½7úý‘ß ´=¦¼÷¡Ú2é³_¬Pt_‡üˆì<öTcɘ)µûbý®”€ð;„ÙüùÆe§}{Ù¿ÿ-í!ÞÞÿ}yä‘GÌuìš<ýôÓ’!Ckå«V­š`ñ£°m:uìï ”ÚµkËÞ½{í²]»vIºtéd̘1’5kVÉœ9³]÷ìÙ³vù_ý%Õ«W·ÛfË–M:uêdàÿ±ËÖ®]+eÊ”1®E¹ìvýû÷x/Q¢„ðttùóç¾oܸQ6mÚ$Mš4êO:µ¼ûî»ò /ȶmÛlîÆér÷õõ»È¼yóäÙgŸõø:sæŒ,Z´HàJYºt©|ðÁQbûôÓOåÃ?Œ°Þ?þhÛpÎrnÐöúõë#¬Ë×voYÅ´1pà@iÚ´©tìØQ>þøc9tèP[%ìÅ*"cq|Î>qâ¼Ý’!í½»o>q3<ݦC+$ÏŸ»$½^n!X-ß0ÛkÀMÙ ù$wÞL²pîº=¹téª 3CØm:T–"ÅrDX¦_”€Pþ&€pㆉ{æ™g¤re“×<§üüóÏò¿ÿýOòäÉ#³gÏ–V­ZÉG}$3gÎD!–?„ßSO=e7éÚµ«-ZTN:e-ÅŠ³Û;õ;wN–-[fÅæŠ+dçÎòÍ7ߨÅ=ô)RDNž<)[·n•?ÿüÓ ×óçÏÛv;tè Ç·¢aÒ¤I¶lHS§Nê£]D,}.]º´|ÿý÷V¸"8X%«V­*õë×—/¿üÒ<üßôW§žzõêEºœu´D$°|ùrùú믭 ƒ±ëëßÿ•#GŽÈŽ;ìFüñ‡Ìš5+b¾±Ík¯½a £F’Å‹‡ÿ΃ ¿ñ0ã^\Û‰K–ëFYqÌ{³fÍlŸ9—œýˆI}îý Õï*"cqä’'Oj’„‡ B±P‘lÖéTS»~qi×¹ª¼õÆ\³ü²T®VÈ\0/ÈყœUny¿çZ²øû?Ë£S>»Xò+çŠå»¼ Pg]}WJ ø `Ñó6*,½çF9}út{ƒ,_¾¼ì«¯¾²7É~ýú ¤áÇKñâÅ¥[·n‚ܼy³üðÃr×]wÉçŸ.¾¼yóJŠ)dРAV€b…ÄbÔ³gO¹ýöÛ%,,ÌZŠ~ùå—CÛÔe°J•*R«V-+ÙvÉ’%Ö˜gιråŠôêÕËZ±`véÒÅ Y‡)©ìÙ³ Û0À Í}ûö9‹í{É’%å“O>‘ÇÛýâsîܹm×­['Q-PY}9xà¤|5áüÝBøó`áþBÜÝÿýòÖ[oyíB“‡×rÇwÈÁƒÃ-ØX¾uëÖ•ï¾û.|Õ_ýU .l­Ïá?šœ¿®ízsi`&>D¯kAcÁ^¸p¡=±¼ûí·ö!ê‹/¾°«z«…´íZ"s¿ monÔÁÃ|œY]Î:þzWK²áÁ5&-ÃÙ®…>u–4IÅGÊ„—Ê#=î0‰É³»®ás†Œ©…HoþÙ)Dms³éÑ«‰”.›ÇF|oß’¸Mæ€é%D¸˜Ïøz…ÍØY·._¾&íî|K&ñkxV†ÈÖe#FŒ°CÅ s³FLa½s »aÆɛo¾i…%CÅùòåsÛ›;‚Ë)ˆ:nÚ{öì1ÞɤbŊ΢ð<–!§0Tí””)SZ¸× yßvÛmv(ÚYV©R%ۯݻwÛjÙ²eír†«¹¡³¾SNÉ™3§±X-=ìƒ>hEëo¿ý&+W®´}Æ*K‰j¹§:ýZüôß2dÀ,=b¡›xÇöÿº?ÞÚ9r¤ö´÷ˆŒ3Ú‡Ž ,Ÿ= )#V^~ùå"’‡“ÆÛu4h`ÏWÎ6œvÝ]ªæÅCHúôéíƒçûÑ£7ïïøù".sÁVnþ`yç÷TŸ{Ûl™ûB“m°îs®ò¿çiþ7[¶liÝJ²dÉb×™2eŠ]Ÿïsn ‹ŠÈXwDdºô)ÍIœ,ÜŠ¸nÍ^yìþeä›ßJÃ;ËÈk#:K¹Šù¬å2²¦5+cžT.ÊOÆ"IòñîOß)I’Ü.-ÚV”nÝÊGï/–æoˆ¬ ]æ…@d¾9X8Yžþùð§è˜¶ë¾-Ãoo¼ñ†µ1‡/þ>ÁR&Ož, 32ô3xð`Y³fM°tÍgý8|è” 4GNŸº ƒ_™)ËL&o…yá|´¾Œ|cž´i4\Ƽ½PE2Bá­þþÀHß¾}ë#ç7sç&F»£G¶¾„XñKÄC ŒS¸™1 턨ãçˆÅÑç,|¬–NÁJé^¢u×mœëˆÎL™2 –E,–¼8ÏÆŽ^k@ͪU«lðMdQÙøLöîÝÛZ·’$Ib­hø[:%ªåÎz|‡U|8æGy¹×dÙµão3"VMÞ|·‹ÍôqãúV«@ö‹ãñúë¯Gx!ü(ž¬}üŽBΘ1Ã> žZ´h!Uq<8/‰õñÎ;ï´B +2ÃÊœ +sÝ¡pÞ½óÎ;òÄOØ §]”\]§ˆLêÙ²e‹=ïr÷Þ{¯­‡vqé@Ø!æ°šó‹–yOõ¹·•û~¡øîÂó!íXk±º.X°À^ï¶ôãž{î±¢·ûî»ÏîŸílÿÜúÀÆC¹)+"M„6¥@¡¬²pÞ:éýÄÒ×üS­V“;²ª<“ó}]ëÈ'&¦×K-lÞHg»¥sÛ@õüe“›3Œ®%ú†˜6mZŸÇ?‡á‡@†û\oj1iÛu[nÔ5jÔžDöãæÏ>á§ÃbtŠ/ýw :q‹V*Ã-ôÓõæŽ/ÑO?ýälRïÜ´ùŸkð<©Ó „<üDCy¾kùeÉVywè|¯VÉ.Ö–ïß/W¯\—a¯Î‘Î-ß‘þ}¦È–MÞ34 Ž¢Œ¡_n舼»ï¾Û~&†‡,‹ÜÄ^|ñE»œw|Òæó“ÿ-†ÀÜhúæfΔ‚ß!ç«'¿5×}æu7ÎqÄÖÂ4iÒXA‹¯#~úàÀÏ) ¥ÒÚå&M°7g,£Üä6¤3Ãè Œ%׆IùaØ’m#[ž4iR§¹€¾=rFfO[%/>ý•¨¢xÉœ2tÔ½vô«d™ÜÖ"‹1âúõí—ÓÖ;™ëË›ØÙfܸqVq}c{¬X#1P‡X)ˆHÎ!¬Öø­ò‘Ïñjذ¡]‡?œ¿=zôˆàÓ¾ðÿ?pL˜0Á IN8gðçå<ÀB˜*U*ë[˃B‹7>¿\ÇhÓ[qm;*÷ „ ]þŸ8qq x®õ^8p³_ì?œ¶oß÷°€µ”À"BûÄñs6äo¿l—[˜¡Ždò„‚æ ›Â§ã–È aŒ¥2zæÑž8óI¤ò~®o+™5u•¼Þo†<úd# ¸ñHÊóÜ„¸™D§`yáŸÓuHŒí¸ qs .pêÃ*È?¼§e}úH»víÂÿ§œJŸX?½-wÖ Ä;)ß~]ºM–›Ï‘ÕÁ‚ NÎ?o%,ìvÙB*9cd{D%Óô^ãuí†ýí†ùíò•krýÿ¿³ŒuX—uŽõî×ï­]ÞÞÖqÿ‡,qζ³ÜñDz}Çm‚sQæz-Æ7–ë×ÎEÚçE!À‹óíÉ'Ÿ´æž*wm›}ãšÄкkáÿ„Â>ÌF½üqßp½cu ÿü/òN¡®£Îzþ~WK¹ód´–„æm*XqÇÍ8wÖ¹«SUá)°Lù¼2Ý$¿¿[ÝX¶q3N’öwWž6™Í¦qó²ÒÄ$:wn×Öo1!Àeë֭펋 79npX^r\´xBF°ñÏâ&ÆÅnœüsñâ†Ç?7ßá‹€äbãúOŽo O•\X¨— ‘‡ÎÅÀÛ¶«W¯¶. Ž€töµsçÎ6] m""ñAcÜ’A ð´U…‹/fDC8Xh¢äfÏp 7X¬J\ðަ=†˜(øqq£ïÜÄôˆO"u©×‰XtúÆp»sñ­P¡‚µ(! ØÖ‰Ìe"X†"ãƒe mÛ¶á)<°ÉËÐ&Ã_¸)P©i3øAÑB‹»X0bR¸ #˜¿Ñþ{ˆ»f­*HùJù­Ð\ýû.;a€#4öX>þËG¥×ã_Èš•»åÀ¾“öµâ×R´xNéÚ½q‡)mýÙœmâë›è+¯¼b­ŠÜdÝKÍš5…ÿ'ÜÐø¿ÁZÈ9Ïñp çL,+ü‘æÇ¹vai‚¯káÿÈ)œÇlË‹‡'çÆÉrÎmά]B¬©®QàœÓ®ÃØ#Ê)øÃ1 o.šÔÏg†(Ióa }‡.\¸h}·l¾»ܽ¹_ðàÍÃ[œë¸fðïéÁÍ½Þøü®–È8ÐÏ“/ó-[c…$yx#(q¤à‘zòùG?›aíŽæ&šô–õcûƒÞ63ãÌŸó‡ÞÆa1«Å3.I÷‚rnf¬óÐÏC>VR„$×,×åîõ¹·M?"s¿`øšQ®—N ¢•zqÃq-XHy9…ë*¯@—›Wì@·šÀÛkÛ©Š|3c¢»é?ÄP7VåzÄsàÐŽf¸ô²:ÛÿWäC ¬wÏõbàZIlÓ–pAÂOË)ˆQ¬ˆWßž€y¹¦&‰l[|1¹¨xz:e›v`  Ê\‡³g‘×Èq×t(°‰n=\8‰ 9Ë)~uXH¹1DU"ãƒå– 9Vú‹Ÿ#–×ãçú9ª¶¢³Žø:F'›þ¹Fn3„èI@NþüWé×ûëð¯R§Mný¨_y£½ÌXøœ¼2¸½µ(Åt_ø<äYŠuVÜð!ÃWÌ[0•;n¾ˆžwÏ€•cÆ3/n˜ î¢SbÒ¯„ž%À•Ê–wU’C:È ýÛHÖìédÎŒÕò\/e•ñͽOi~\û“Ï\CpÍáZèï‚aÀ)ü¯óPC@Œ§ÿ=FT0àäi9õ¸ÖçÔëú™û†G@² ×NwéZW|Vé‡#À4…¹Là ~Pœ™ñ=ùxìOB"X†ÎÉ'Ùò®Š2jø{óG;¡Z'ÃÙLÅæþŠÎ Õ‰ Åú…_`tÓ–àÛCB’»“º†‘ùư<²mÜt ˜a¸Ø±˜òôÌP©.ˆ0¥Z…nü1‰²uM}âÉÇ[:êÁ‘'p¸:½ÓOåÛPðMCx“öÅñ£D€2äà Á‰DtÝÆnèò'2>ñé;äø:–(“Ëc^H¬äŒÌw!ýÞˆf½ÙrèÀ)Éœ5­T¯]DÞs¿Ìþ¡õUCĶpžá.ÁC 8|N_}õU{ü$qŸ6Î[;ˆ;Og,zXi¢[8ÜÿϰЬŋ¹É?Iä7@QOýB¸ó»{q²0"@†rîñÿëzþzªzØO×Âwon"üq^z+ðrFÑÉUèmý¸þÎùCÐåKÛÊÀ7;Ê;ãì9Ö°~\éö¾! "Ò7o©¥mÇ*2ÏDj_1)( 9“Šá‹¾e]_þP­féûZ;ùsý;õâñ£7oì¾l#ëÂ:Æžû‹›lT…á†yÒÆGKŽa¢>ñ¯Ãw°€‰È&rÿ –7¢EMøÝ°ã ;¾1ø²-ýbèÄIMÙ¶Ô(àÅOµøçðäÌ0i.œ'dr5’ë'$åuÄ%u¸úï8VC' }"€g„ ¬j­DX°1œÎPµ3ôÌr|“F':¡H0V,>³.—ᢥq tìØÑã¸FáÚæOd|ØÞñ¢?äd8Œú=Yg:}õ[W«$Ámänu·>ºGdÓþåËWåµ¾3dì;ßK²äaÒ¬uyù`ÂÃ2}AoiÛ±ªO¢±dDÂ#ü] ÇaO¢ ‡Ï®Sx ø‰‡ ×èyΆÙÈ$@ÂeÎe¬%®)³°Ì¸¦ra8’u=Íâá´çúŽÐÄ*I@:¼; ¬Çÿ Àîýb'œ·üoòÿ夆avNëR`Š{}°ãFp:Ö ØÎ0Â+< Ðã:€u ŽˆXú Cg^qÛ?ýÁ½Š`L-JÀn3–‹±–Ħ0ÇêÉKßÛh®ØlŸÐ·aö€¼ù3ÛH7ö•ám¦¢º£IaŽm. ‹¿Û$ßšÀmýF¥üÙ\@ëžñõjÉ—¥µµÖ²aOiKhŸ›§´%,ã8`½c8‚›œ{Á‚á-5ITÛR>¬KX9«Ü´Ü ýCÀró÷T°qƒÃ™Á@d:Q‡ž¢YvçïÉw6ýAÔRøÌð9É…¹Y;âѵXwrO%2>¸`Ernö|öä;ä©Þ˜þö¿‡î’áconåá×øó[$k¶tÓù¸¶õp—qff‘Ò q)K°¨Jß§¿•‘#>·Â#ªuáO¢[=ùG1Ó¨ED ÖJ'Èž<ŒpŒ ,@tr>à6€HG`aÕæú[@ äy!_üÒjä$ÚžLŽ+®LçEpn⻈Ï,i®ØÎ1go¬xˆ0êsüi~ñ€D?Èf@Ä.ï¨ Fƒ ²[ˆ\'w*S®ç¢ë~¾ûî»6›gøïò`ÈCУ>j8çrƒ ì¾â&@þ²œ{<¤ñ0ˆ?"’‡C˜bŠ(2À‚}Y¿~½‘À%Ã5§adÇxâÄÏåZò6°&²õü±¬oc=üq´ûê>h¾%ðùçŸÉòß~‘ñã>‰UÅSÔ+tÑÛ¨‰ÔfªBg›¹GzÞaçÙ=ö·-„XK5++/h+ËÞngÑÐT@Ñ;nÞÖ⦄Š{aX«¢Ë±:ëð¨BO’u"ó‰j[¶'‚ÿ,ž$ëÐ?o’åîþ;ˆO’uÙO’eÜDÉwú†5 QêzÓf™S-Þ$ëDÆ'|‡8FX%‡¼ÓŦOñd}tökeÁÂÙdúB“þÈÌ*élÝwG¨y%Î*?¦7 Gøáâ0#KAl œXˆVD-4sêGDR°h³ž'ŸÉ¨f7ADòE}øø:‘¯lç­8Yx(‹,‹ÛôษxÊÀ:Œp³DÖ»Ï4Â6k]»vp`\ûÅì&ÌÂP3CÊOgv“„ž% ý¢≀Fgü¢eëæCòäsM#´Hdçf–çÍP37.+–ï4³éü.å*淳ݤJåÛ#ü±?ñí}Ñ:Cƒ€·èì@ô>&ÑÙîý9tèî“ôTž‚ÂX?²ˆ{'z¾OŸ>6jzüøñvÈË#ÖB×Ý,®ÛDöùÈ‘#VÉíø:ë;ýrü ñoô6»IBÊ0q¢Fg;瀾ǀFgÇaÀjhؤ´I,|R¶!éZ˜[7Mš2óë®?ì3¹+_ÞÙ ØÏO±Ó5¬qmH (¿ ?(S`z4YĽ{ô<þ}XýÜ$õÄ4 Ûx+äfìß¿¿Ü}÷Ý·H¶qïUo³›ÐWDoBÎà£þ®üM ð¦/ïQÖ•±ã½5dÚW¿ßâ‡Øí‰†²vÕ^;¼Ýg¶›.Ö–§Ÿo.‹¿ß$#ÏfÞТ”€€@“/Ñ[Ú'"ÿ)£HÔ­E (à%¼]Kx=«Tµ ü°`ƒµöÕ¬{Ó—ˆ½dù‰gï”w‡Íæ?Ë”gq¡–¯@yÙøJ.5‰“ßEŠ¤Ò®sUùêó_å¥mo©%g®ŒòÐcõåƒw¿·ÃÉ2¦¾eøúÉ{ª#w6/g‡ÝûõþZ˜•§Þ%ã%az|qÐv•€P‰…@¥j¹eøÈçt.ðtÀwn? õê6‹Ó©ˆŒ¾¸m\«^qY²h³¶&é·{)[!Ÿ™¢°œŒ}ç{ya@› ³ö‘Šè±§Ëý'eöÔU²pî:ÁÂZ·a ½Ð¸Lý®”€a÷u«½׮{"ðÛ²írhg:O‹¢ý›úDF•V¼çZfÚÁrùòU 4iQNòæÏ,ï¿ý\¿~Ãã:ñýcž¼™ìtŽO<ÛDÖ¯ýË ÓO•Ÿo ÚþÆ7/m_ (% ”@B  –Èx>Š…Šd—¥sÉ‚oÖÉ]ªzìÍýÝêšaíäÓq?É£=y\'~$}³Þ èÛÙX¿I†¼ë5*)øSú²àËÁ\¹Z”@ ÄgîÖþ¹(gΜ‘óçÏ y\µ$^\÷’$O¼û¯{|TDÁ1iw5y­ï ©Û „¹í^¸q<öT#ygè|™:ñ7é|M÷U‚ê;@O>×Tì;! Ì÷‚g×Ùà|&Ó¤Mç¾V©^@>y¢,ùeJœëÒ ”@täÌ?wîóç.I¦,IåþÚ!ùÔkP!:ÝÕu ±ïÍürH¹J¹å›é«Í¤7Œ‹Óí’4Y˜™·<‰uwJ–,‰$1A޼‡™ßX§Ã=Õ¥hñ ˆîR0PG ¢œ§›aíÇŸnì±GD?#ÌF¼>× ³æ&%ØKž|™­åôØßgå;“\hîÊÕ J#Í+wÆXw?Á,òÚ[-b½½n¨‚™ÀÞÝÇdãº}²iý~9rø´”*“G·h$å*æ“´éRs×µo~$PûF¬þ0Sä6 ÏØÁÌg¼®ñ~åš\5³ÙÏÿÿÛ¼Ykå ñYWéǓȫV$'þƒ^œfoÔx*)S&“g_lagIgn&µë÷´ZÐýFCòD£/5¾’ïýÖÎŽ˜,].ÑÝÓ’Éû·m>$Û¶2ÿÿûPL!\:ÜSMŠ Òí·«ëz G°¶ÕðÎÒ’ÅŒT½?ò;aRŠÊÕ Y $VHO+ö_&…\÷gïô´XS>! "Ò'ã^ IÆI›3ñÓeÆG2·½8xª•ô:½^j)#c‡†ËWÊïiµ üü—-ÚT”¦-Ë˪ßwɼÙkíþ2Ì]Ç å³oZ”@B'ÀÍ}«[ÿj×3Û º%S*"cJ,@ë#œ0™7s­tèR=ÊVÚ&ýÏ(#°ÈV­f‘(· µ¸0òêt_Mc:)þØ'ßÌ\mnø§lB…Ê,3õ£ µ#øþ2Í(b¡xS4"OÚÿ¹2Ø<¦9se´¹sáè~C|µE%9â ýÛÈ OM’7Guñº2ÑÚdÄàÅÒ¯fèûÍAsì9_»Aq©jFz~Ô¢¢C@Edt(ÅÓ:xôÒt©R£‰ÚÎe/HîÝ»oKm¢¶Ïž¾(›—r›P]!wžL6ªÿQR¦˜yƒIÐüõ—Ëí9\|ÒTÒ<{¡z”ãÞo]ð[D(Þ|±h@Λ@—ÆÇ˜ËœKœ/¼gÌ”:îj J žà 4aZh·Î¤<”·7³Ú¬_û—àKɬhUª²i×òÈ­ºg‚njˇ–à$Àõ‘þ ê£:ñìxo ;äÐïõvÑCXOž7O£ï›/gL„st¬˜>ên¼Uƒ“x:&eyýûï¿vØûÏ dÚW¿ËQ3[ÝâfÈ›™?H¤%a i7цÂãI9~ìœdÎ’ÖC3ü\ÇXZxÑó ažºW±#€å‘Œ ¼Îž¹hÅäx“ùƒ(p‚q¸¶¦Jí9[Qà“>Þ.ݺ>»Æu+¿¸xñ¢ôzl¸ÌYü¤_ÚQ鬾«´ºIÂ?é÷ó7H³VÑ›êkÊ‹ÚÈhã#9ÅXæ’L›˜ ù%?J‚sνhsómÙt@æÏùà ñResÛ„î8—#Ôµ„|ºˆ„ƲˆhĵáàþS’*U2kYD,â/‹•K£Z¢Cëøjoã—î@-Úš`ób&%‚<çÌXmÿ§j1é)o³fwJÇŽã·ãÚºGˆÈùß}åq™/~Té Š~®ƒ ›7úÏ´in¢kAᩱ÷Ë­ä³ñKLdó<éÙ«i¢LëÀ\Ãq^æ"Þb>“_m²I£Ä“|›ÅL®SÞÕŸÒÏ's ª'…³r .p$È¿E’.#9¶¼{³”Ä I]U (ÅKå^N0Μé«]‚qŠÛì.«ëÇDH@EdôÌYÒØ L‰Øëå–Ñî1‘£=ÙHøÇ2`– ¼Iì9ëH Ä‹yh)ûLÊ–í[ËÊå;eÒgËlR^rüÙ ãO‰{€ÿÀ„ȇŠ0}̸"p¾’¤ÁØ ±‰ˆ6CѤÕÑ¢”@à¸ã`ùÿuÉ6yÃÜSò?ü fä+MXŽÀuF[ **"ƒêpxï ¹#Wþ¶S~3‰cIç“°.‰ºG žkSŬå&Çy9AHD+’OmǶ#vúI0/P(‹ n*X8[¢´èúâ|q‹L׆ï¢M¥c_˜u‰À0,ŒÌ`ÄP4âQ£D}A^ëP¾#Àƒ\çûkZ7©uköÚ*å£çjå»^hMÁB@Ed°‰(ú¯s¤0S¦|^a˜6&…¹ªsšô¸Q‹„)±îêT5&›'šu‰VäE@ >•vÞc3É 7ÉžÝGï]r;eM2m„âG£zÿ;EìL.FŒ1Bñoã>À;ùq%H›6¥‡ìð3îX„ùU.Ôÿj×OJ@ ð*W+$W¯\—ýÛ‡Ï}0p¶>¨ˆ ¶#I+µM¤Üä/–ÛaêHVõ¸ˆ4ADy“Äü½ ¤[÷†jUóHê¿ë$4çå†Yÿ2Ãàí9&¤¶À¢víÚuÉ_ «µ¤aMC°cIK¨>–ä"=ú÷9q켦’ÏGœµ>Œï,ÙÒZW,à<ô46–t¸¨XtÎ"}WJ@ „>‘!v [·¯,¯÷›i§µ"—WL épž}©…|3c™*qºt}¼¡”4QÊZ¢O€à&^®üND 3Ÿ:ùœ>õ}?uâæç“æ7ÒF1·9Ó²Oì û‡`Fhãoª>‹Ñ?—tM% ”@(PbGT=ݺ7Ño-´¹c:¬Íî24ŽŸd u÷É?™9T‹ âTýÏb2pãiôÒ=vô¬ aêFæ?qüœ×‰9öˆÎ¤É’‹^˜=ŽK÷Âpòÿš× ¹tñª\1ÑÌW®^³ÃNˆ]’_0¾ž¼“¨÷Ì;˜ˆÇsg/w‰vˆ>c¦4öçùüfV$úJ —ÎàâN]¿+% ‘!xÌ–®Ó „­ýijMb½¤nøfùü£Ÿmôv×ÇXÿ¾XW¨ÞB€Ü…ãðòTq§uú3ŸÏwÖ=¢•±ö]4"qwñÿÅàU#¯¤ëføüÚµáUÞ~ûmVT" ùÌA˜œÉŒàLš4L’Ñ™"åMQJnÌ4i’›™Éí3ïˆT¬Ôˆá SinÅp²úA (% ¼PéLÿ~sX{†ØŽË<ÙŠ½šØ„æï oÓ¨dV­’9n¼Ha£E (% ”@(ÐYÖCéh¹ô‘G` óœ2MU\ ÓZ ÒÁ‹7‰ÍgÙ`‘¸Ö©Û+% ”€P —€ŠÈ>¶ä7¬Û°¤ÖöÅn¤ÏJž|®©4iYNF™TBÔK—®ú¢j­C (% ”€H`TD†ømݾ’ Ò ¹¯ 9%_ÖÉL/wUúÈÌú•ƾ袲bÅŠ²k×®hõó‘G‘U«VYýå—_ÊÀ¥J•*ÑÚ6ØVRlGÄýÁ¹yãÙðÇ_>¨-ê*ŠË!Ïõk%÷u­#¿.Ù&ýzm‡¹¯™©ù´(% ”€p%P¡B™:uªëOròäIY¼x±”-[6Âï|¹|ù²üóÏ?·üîüpíÚ535ìŸÞÖ'ðô¯¿þа®S‡ó~æÌç£×÷T©RÉàÁƒíëwÞ‘ï¾ûÎŽÂÍœ9Óë6® 8 ]»v•òåË ŸkÔ¨!wß}·ë*f:ÜÓrã†wW±èô3B…~úâŸñN?uV«‚_éy‡ŒµÈÌB“ÝN«½-ã¶V±’¹Œ˜Ì%»wþ-ó笓og¯•¦-ËKm3Ï7}JHeü¨e²qÍIÉ7gBÚ­ Ü—ul‘¶—ÜytjÈ <@Ú)%C 4°Ö;,ŽÕªU³[3Œ]³fM3ån’ðÚΞ=+?þ¸Ìš5K¤víÚ‚å.[¶lÖêWªT)yýõ× æ… äé§Ÿ¶Û#ì®\¹"O<ñ„Œ=ÚÖ÷í·ßZáFZ<+ËFŽi×§?M›6•¯¾úJªV­*çΓ 2X‹##RóæÍ+cÆŒ ï›ëÄéõë×¥páÂög¬’Ï?ÿ¼Ü{ï½öûgŸ}&&L¥K—JýúõeçÎòè£Ê¤I“dÑ¢Ev[~g9Ãå<ð€ìÞ½[’'O.O>ù¤¼öÚkV¤º÷Ó“5×µ_ø¬"2”ã¡ RóÔoTRÆ¿·Hz÷mP_EÚf曃NÊw&Z|î3_I­ºÅ¤QÓ2‚?eB(—.ÞW —2eÊ$„Ý ê}ôÚ‹röôE#"ƒº›Ú9% ¢I!סC™2eJ¸ˆäsçÎeÚ´iáµôêÕK>,[¶l‘ܹsËc=f…‹‚PÜ´i“õ'œ?¾<øàƒÒªU+ÁçpýúõÒ¤I;TŒe²S§NÖúÉòC‡I:u¬èCxRÂsРAv=|3¯cÇŽ•¤I“Z )"_M-VÑ~ýúÙ>œ?^Xk"Ë~!*ÂgÚ  K”(!Æ ³~”ýû÷—={öÈĉ…ºèóÅ_”ãÇ Â˾»÷Ó©?>ßu8;>éû¹ím+Êí·ß&óf­õsKž«ÇrÄüÞƒ†v”°¤I䳌uôÙµãoÏè¯J@ (%(0|‹`ÄŠ‡XB\!,\Ç—.]²Ö;„$–Ç«W¯ÊSO=eëP¾*Y²d‘Ö­[[n={ö´ë˜ƒÜ¾}»|ýõ×’={v+ÐX)W®\Ò¥K+Øô‡`Ÿ¬Y³Úº~ ¯S¦OŸnû–"E guÛOúJùóç·>Ž?þøcøòØ|˜3gŽŠì3ugΜÙöÓu˜ÜµŸ±iÃ×Û¨%Ò×Dƒ¨>¢ÆÖ~½ß )Z<‡”(;^z—!cjiw5iÕ®’ü¶l»|ñÑRI–DêÝQÒFt'´¡îx¬*% Bˆ6,„Ë—/—Í›7[Ë bÑ)Xñ DØa¹t Iü’#Gû‘ánJÑ¢Eí;¸"©«zõêá¿ó¡€‰¨ž1cFøoDJ;±Ø±cG+5jdÅ&–R§¤NZ† â|µï|óÍ7¥E‹~ç‹c…¼eÛ act÷ uñrí§ÛæñòUEd¼`\£iÓ¥”‡Ÿ¸C>ù`±™y¦ƒ¤KŸ2p»µDÊ¡úJÙ׶͇lðÍìi«¤JõBÒ°Iiõysã¥_•€P •¾5Ä"Ò=°Ä”XëÖ­k1 ÆX7_¾|Ög]¦7VX*—-[añºuël=~tùrÿý÷Ûáu¬£ˆJDod%gΜ²cÇ» }rÎFF§°Ï™2e’}ûö…» =z4Ò ¢èÔëÏuþ“÷þlEëŽWÅKå²V¿ßÿ1|¨ ^;d§Oäš|mxgÉ”%¼ÿöw2ø•™òÓ÷Ê?ç/Åw÷´}% ”€ð3„#9ýõWiß¾}„ÖSø-Ž7κ}Ý·o_éÖ­[¸ÀаA$_ðUܸq£Ì;×®E` 6÷Üs×­tA<>÷Üs‚ t«XH¬¡Ôï$ë!„£SðáIÇãZ¡ô‰W¡B…lnKêv’…?óÌ3²páBë{‰of»ví\7÷ú™~‘„¼{÷îÖÏ’¾2´ Ö¢ÃÙÁzd|Ü/|Cîq‡±öÍb%rZK ›ˆsuølòºxñЬþ}·|;çùtÜ©\­ T«UDÈG©E (% B—€k÷%,u®¡è,zÌnÃl.¤ÙAP± …t:NßÓ¦Má;¿ásé”>}úI¾rFø¹ŠVü2=¢¢6lafrxEV°b"4‰,gèݽ°?N!E‘kA¸2û éø{"Tâ­ŸÎòøxWÔã©M¬~!ùñØŸŒdûxõŒ AʔɤnÃöuâØ9Yùû.™øé2¹|éš Ä©X¥€ä+%²*t™PJ@ $XÉé‹BîGò@FUÜAĽ÷Þ{òöÛoGµºÇåDm{Wvû‘ÀP™ÁFE¤ÛÁKè_I~GÓÒòþÈïä…mL¢Õàöh ¯dóÖ싼“«~Ûeç¿~ý†±P’JÆJY°ð} ýøéþ)% ”€ à‹HþH};©ƒüÛbèÖ®"2t]¬{Þ¬UÙ»ë˜LþüW¹¿Ûͨ·XWÀ É;™»S&¹«SU9°ÿ¤¬]¹[&|¸T®\¾&å*æ“ò•òÛaú`ÆD¦M)% ”@ F‡¹­µDM@EdÔŒä]»77ΖŸo±‘Û¡¶“yòf^m:T‘¿Ÿ‘?Ö쑹³ÖÈøÑ‹¤tÙ†?í¯PJ@ (¸PW‚!º}òäI¥g¯¦2ôÕ9’'_&aªÂP-Ùs¦¬«¼ÎŸ»$×í“?Ví•IŸý"Ùs¤—2åóÚW(ïc¨í·PJ@ $\*"î±rϲfO'=VßLE¸(¨m¢Ü—Ò¤M!5Í<ݼð›Üm¦Xܸ~¿ ÌùEΜ¾`#ÓK”Îe­”ì¿% ”€PJ vTDÆŽ[‚Ùªl…|Ò q)ù`Ô÷Ò§_ë ´‰ x|#‹štF¼˜vñÜÙ‹òçÆ²õσ2ߤ²Qes›)!sJ±’9%Sæ41©^×UJ@ (%¨ ¨ˆLÔ‡ÿæÎ·h[Qöî>&S¾\.÷>T'Áa ȵ‹Ú;‰/åÖÍeƒþž>ùw“ô6ÌŠÉâ&‚¡o†Éµ(% ”€Pž ¨ˆôÌ%Ñýúp†!h›†HäÅ|Þ”#‡OËö-‡eÛ–C2wæ¹téªMp^´x)`Òå/˜Å ÍØ´¥Û(% ”€HhTD&´#Ëý!Ðæ©çšÙ@›Ìf.ëÒåòƲ¦ÐÝ,GΠ«Þ%íNàC¹sûÙ³ó¨Ì0–JÒ ±¼@¡¬Æ¿ò|èî¨ö\ (% ”€¨ˆôÄ„R‰½ŸxöNóöwò\¿VB^ÆÄ\ÒgHeš“ÔœB Îþ¿NÈ3¿÷Æ?Ž%f4ºïJ@ (% DE¤žà ˆ_äè ¥ïkí‚vjÄÐu°BòÚ°æxŒ[]˜R‹ùX›7o.•+WŽV=Ç—Áƒ˰aÃ$yòäÑÚÆÓJ7nÜÞ½{GXIJuëÖ• DøÝÛ—½{÷Ê'Ÿ|"$äíÔ©“0×íĉ…9`såÊåm3ý] (% àžó.Á•Ý©R½·š©¯^½*Ýê~¾ñÆòÌ3ÏØ¹Tzè!+$kÕª%cÇŽ ïwéÒ¥­ ÿÁåÃåË—eÍš5‚ŒKaûQ£Fɉ'$Mš4’2eJÙ°aƒµãÆ‹VÕ<òˆÍ¡X±b¶žFYñH}Z”€PJ ñPKdâ9Ö1ÚÓ–wU2&gä³q?ÉcO5ŽÑ¶ºò­nC‡•nݺمÿûßÿ$]ºtòÞ{ïI=ìo'Ož”+W®Ü²1–Ëܹs˲eËnYvýúu9wîœdÈá–e/^´"ñ–懇~8‚å±C‡òé§ŸJ÷îÝ=­á·È«¯¾*åË—·ôßÿµßI™äDïµk×$uêÔÎOÞÙ'O}ް’~QJ@ ( &ðßU?¨»©‹$"?m‚KfM]Í'˜6Y—.]’;vDا§Ÿ~Ú óc… äï¿ÿ–»îºK&L˜ £G–Î; b³`Á‚²gÏ+ºÎŸ?/»ví²t̘1’5kVa8ºN:röìY[ÿþýûíð4"µhÑ¢Ò¯_?»v6Ä$QÜäkŒi!8Ç}<:u`µ,Uª”ÿJ-J@ (%0 ¨ˆL˜Ç5 {u÷ÿjɉãçeÔ°Æu- mj#QÀ’hhæÃ&RQIîH-J@ (% |I n&_öDë I>Z_>¿DÞû;y²O3“^Æxñj‰WX;I2®E (% ”€? ¨%ÒŸtIÝL˜!Sjc¢¶¯^Õ¡íDrØu7•€PJ ‘P™ÈO_ì>~oÉtRÉØ‘ß©ôT­C (% ”@Pä(Tº‡ìÖ½¤J“\>x÷{ ¶ •§ýTJ@ (%K*"c N7»•Bò‘wH “ò‡`Ú¾•‘þ¢”€PJ ¡P™PŽdìBòÑžw˜¡í”2âõ¹µ$ÇE»¡”€PJÀ×TDúš¨Ög“K?Ú³‘dË‘^Þ±@.^¼¢T”€PJ@ (F@Ed; Á´;?ÑPòäÍ,o ž+çÌ 7Z”€PJ@ („C@EdÂ9–A¹'÷}úØí¤ÿLšô¥„%I"›—õ_#Z³PJ P™rbÝÅb%sÉ€!dÙO[eÅ/¤cÇŽ*"ëÉà²ßçΟ6ßÖ¹ü¢•€PJ 6Ô'26Ôt›!ÀÜõî()…‹ä ™>kG•€PJ@ „‘¡p”´J@ (% ”€2*"ƒì€hw”€PJ@ (% TD†ÂQÒ>*% ”€PJ Ȩˆ ²¢ÝQJ@ (% ”@(P GIû¨”€PJ@ ( # "2ȈvG (% ”€P¡@@Ed(%í£PJ@ (% ‚Œ€ŠÈ ; Ú% ”€PJ@ „‘¡p”´J@ (% ”€2*"ƒì€hw”€PJ@ (% TD†ÂQÒ>*% ”€PJ Ȩˆ ²¢ÝQJ@ (% ”@(P GIû¨”€PJ@ ( # "2ȈvG (% ”€P¡@@Ed(%í£PJ@ (% ‚Œ€ŠÈ ; Úà °fÍyñÅãÔ™ãÇ˳Ï>+—/_ŽU=“'O–:H£FdðàÁBŸbRÞzë-Y±bEL6ñºn\ûâµb] ”€P!K@EdÈ:í¸? lݺUÆŽ§&¿7nØzJ—.-?ýôS´ê|ã7ä™gž‘|ùòÉC=$§OŸ–ZµjEèSTõmÙ²E²q-¾èK\û Û+% ”@ð ¾.i”@ð¸~ýºœ;wN2dÈpK'=*3f”¤I“Úe¹sç–eË–…¯wòäI¹råJø÷È>Œ5J†*ݺu³«ýïÿ“téÒÉ{ï½'=zô°¿y«ÁIÿ>ùä“[šˆ¬ÿW¯^•Ûo¿]’$Ia;_ôÅ©¾±´ã^þùçÛvŠ)ÜÙïçÏŸ—Ô©SËm·Ýf¿GV—Ç ôG% ”€ð)[¯ä>­^+S¡O`×®]VøŒ3F²fÍ*™3g–:uêÈÙ³gíÎ-^¼X*Uª$X9 =SöìÙcÅâ§B… ò÷ßË]wÝ%&L°ë0TíêJž<¹øàÉŸ?¿e C¬¹øsRè ¬øÆÒ‹x¿çž{¬¨dŸî»ï>6l˜]Wÿ(% ”@` ¨ˆ ,om-„ >ÜZ«T©býñ›¤0ü‹ÅaW¾|y9uꔵ¸ÅeW $Û¶m³âiÕªUÒ©S'ax|ܸq^«ÅJúþûï[‹Ÿ§•¼õÿ‹/¾°þ—E‹µ–À¾}ûFØ<®}™3g޳X;ÉXr»té"3gδí ±òR`ŠéæÍ›íwþ ¤xàk)%È‘É~Ê”)¥iÓ¦²}ûöðuõƒPJ@ Ž€ŠÈÀ±Ö–Bœ@¶lÙÂ÷ãXù>ûì3I–,™–9rä—^zÉ£Ï_øÆ>8u±ˆ€œ'NH±bÅdÀ€6çðáÃÖêÖ³gOá³§Âpº'_Cg]oýß·oŸ*TÈYÍe§J•Ê~÷E_vïÞ-X#"/Q¢„}!\ßF¬º YcìÞ½» " ïŒùÀ·S¤@Â;…:°êjQJ@ Cæ8ÿ IDAT(ÀPxæÚbˆð$Ð.^¼hEÌ´iÓ¬øùüóÏ…WT~zîâ¡å”åË—[áÄp­S2eÊ$¯¼òеÒ1T›â©ÿÔƒÿG§9rD.\¸`¿ú¢/ˆWúXÅ€QëD¿c™|ì±Ç¬E‘¡ì_~ùEêÖ­.0é„#6þé»PJ@ ‘Áq´!JS¿~}ë'‰5²qãÆV”9i}\w‹¨m'‡¡c†¿ŠÅ7’¨k§0\Nо–Žß$Ö6†ªÓ¦M>\íZŸ³mlÞ&X…,ýúõ ¯Æ}iÒ¤‰âÇш˜lÑ¢…|ýõ×6€ˆ€£jÕªY+*Ëäžø…wJ?(% ”@PP‡A;ªHGCP 9®EV¬XQš7o~Ë.uìØQ|ðATÂr†i‚f(™¡kÇRˆPÄ_œ’|fÖŸþYæÏŸo}©Üµ¾[‹Á ™—,YÒŠS"¤i‹ öÍ}!ZœtC U3d]¤HËŠ(pÜðÁÄçˆK´³¯Xtµ(% ”@ð¸Í\¼ÿ:uj¬z8}út9yé{iݾr¬¶×”@ ¼üÔ<5r¢¤OŸÞ/M2¼wï^)W®œ8þ„ž"·!ÔŽOC»DmcÅt/Xæ&¢™”>.÷â^Ÿûòè|ÇHû¤'¢_XKIÅÃpº“3Ò}!$Ãæø"V] Qì¤õqÒñK×ícòù³ KXÚuÒ¸yÙ˜l¦ë*% ß–m—C;sË“={Çj¿žþy¹é«Íu#% #^Q÷$åyóæõº Ë&/oŽ>oëEö;)tˆŽþðíràÀvªEG@²­/ú‚HexÜSAÜ» ||(µ(% ”@pPÜÇG{§üN€ô9øf>òÈ#‚µ\Œ_}õ•ßÛÕ”€PJ ´ ¨ˆ íã§½Wq&€/æ!Cì+ΕiJ@ (%hh`M¢9Ôº£J@ (% ”€ð‘¾c©5)% ”€PJ ÑP™hµî¨PJ@ (% |G@E¤ïXjMJ@ (% ”€H4TD&šC­;ª”€PJ@ (ßPé;–Z“PJ@ (%  ‘‰æPëŽ*% ”€PJÀwTDúŽ¥Ö¤”€PJ@ (DC@Ed¢9Ôº£J@ (% ”€ð‘¾c©5)% ”€PJ ÑP™hµî¨PJ@ (% |G@E¤ïXjMJ@ (% ”€H4TD&šC­;ª”€PJ@ (ßPé;–Z“PJ@ (%  ‘‰æPëŽ*% ”€PJÀwÂâZÕÜ™kâZ…n¯üN`ã†Ý2þ| ‹ó)ï÷¾jþ%0gö7’·È¹xñŠÒÚ•€PALàÌé "—2Ç©‡qº£vìØ1NëÆJ Pº=T^V¯^¨æ´ &P¼xI©Zµj÷P»¦”€ð?L9DZ¶l§†â$"iY…dœøëÆJ@ (% ”€Iê’‡M;­”€PJ@ (ø% "2~ùkëJ@ (% ”€I*"Cò°i§•€PJ@ (%¿TDÆ/m] (% ”€P!I@EdH6í´PJ@ (% â—€ŠÈøå¯­+% ”€PJ $ ¨ˆ ÉæVJ@ (% ”@üP¿üµu% ”€PJ@ „$‘!yØ´ÓJ@ (% ”€ˆ_*"ã—¿¶®”€PJ@ ($ "2$›vZ (% ”€PñK@Edüò×Ö•€PJ@ (%’TD†äaÓN+% ”€PJ ~ Ü–'OžkÖ¬¿½ÐÖ•€PJ@ (% B†Àúõëåÿ¼³c·Ì- IEND®B`‚asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/insituparsing.dot0000644000000000000000000000427715031566105025503 0ustar rootrootdigraph { compound=true fontname="Inconsolata, Consolas" fontsize=10 margin="0,0" ranksep=0.2 penwidth=0.5 node [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] edge [fontname="Inconsolata, Consolas", fontsize=10, arrowhead=normal] { node [shape=record, fontsize="8", margin="0.04", height=0.2, color=gray] oldjson [label="\{|\"|m|s|g|\"|:|\"|H|e|l|l|o|\\|n|W|o|r|l|d|!|\"|,|\"|\\|u|0|0|7|3|t|a|r|s|\"|:|1|0|\}", xlabel="Before Parsing"] //newjson [label="\{|\"|m|s|g|\\0|:|\"|H|e|l|l|o|\\n|W|o|r|l|d|!|\\0|\"|,|\"|s|t|a|r|s|\\0|t|a|r|s|:|1|0|\}", xlabel="After Parsing"] newjson [shape=plaintext, label=<
    { "msg\\0 : "Hello\\nWorld!\\0" , "stars\\0tars : 10 }
    >, xlabel="After Parsing"] } subgraph cluster1 { margin="10,10" labeljust="left" label = "Document by In situ Parsing" style=filled fillcolor=gray95 node [shape=Mrecord, style=filled, colorscheme=spectral7] root [label="{object|}", fillcolor=3] { msg [label="{string|
    }", fillcolor=5] helloworld [label="{string|}", fillcolor=5] stars [label="{string|}", fillcolor=5] ten [label="{number|10}", fillcolor=6] } } oldjson -> root [label=" ParseInsitu()" lhead="cluster1"] edge [arrowhead=vee] root -> { msg; stars } edge [arrowhead="none"] msg -> helloworld stars -> ten { edge [arrowhead=vee, arrowtail=dot, arrowsize=0.5, dir=both, tailclip=false] msg:a:c -> newjson:a helloworld:a:c -> newjson:b stars:a:c -> newjson:c } //oldjson -> newjson [style=invis] }asymptote-3.05/LspCpp/third_party/rapidjson/doc/diagram/simpledom.png0000644000000000000000000012522615031566105024571 0ustar rootroot‰PNG  IHDRåtÛ¥ðsRGB®Îé@IDATxì|ÅÇ’@ %)ôÞkèR¥‰`DAPÞDE¥I¥iÒ{‘Þ;¡Hi$øïþ/år»×²·yÃ'ÜÞÎÌ›7ßÙÛ·3óf6Ë )€`L€ 0&áœ2\V€ 0&À˜Ø(ó…À˜`L@#Ø(k¤!X &À˜`l”ù`L€ 0& ÙÒÒãÚµkPêÿõìÙ3899‰¿´d¥<÷ôéS¸¸¸¤eôS­|5õP+›ôVÚjêhXy5eæSZºŽ(dÍšÕ0»ÉcÊGíE¿ SA©.†rÔ´›a>sÊ¢üjó)MO÷º‡(½NÔüF ë­†—RÝ åÓ±šk‘ÒÒ5¥äúËQ{_Ss RÐõªö:§|”GɽI®‡ÌŠî³JòÑ5âéé‰ ŠÐíqšÖ‡.˜¢E‹*ªtHH<<<4%.]º„€€%I“¥Q“/66áááªË‰ŽŽFLL ,˜¬ì´¾¨ÑÇ0¿9ùè!É××WÑÃÂåË—áïï¯èb'½Ôè£&-ÝØîÞ½«¸ nܸ!~tjt®^½*ب½™(­ËÇÅƒš···a3š< í•'O“i•êb(Èœ<”ßùè&zåÊEmO†#88XQZÒ?""B< äÏŸŸ¾*jê­&­¬Lú*½·Ýºu tMåÈ‘Caò“îkt=Òï[IPs Þ¿Ù³gG®\¹”ˆNJsûömxyyÁÍÍ-霒5¿wbKådj£LO0J{³”–žr•¦§›§Ò´†KO”JóÑÓ›š:ÈåP=”æS£,Ÿ>ÍÉ'3#ÝL9­’'Pµú¨Õ]ÖÅ”Î/§UÚÆ²L9}ª JëB×µz©ù]Èu°…þ)e*­·%ùÈ(+­±Uš–t¢ö ›´ÚöPSo5ieN¤“šz¨¹>ä2ä^©Òº«)CMZYú47ŸÌJI]è_éýÌP7G=6=¶æ¨5c½™`L€ 86ÊÖ`¬.`L€ è—eý¶-׌ 0&ÀŒ€b£LÎ__ý5æÌ™c²ŠÃ‡9ôíÛ×dZ­'8räfΜ©95‰ïãÇMê‡àôéÓ˜>}ºÉôj;vL\ýõvîÜ©&«&Ó6 äð¢6Lš4 .\0™má…ؽ{·ÉtŽ@×ÕÍ›7Åü´#ð6¦ã¢E‹°ÿ~|ùå—f]»Æäž'§½ž2y|çÎÌ›7»ví2™–Ð|ù»ï¾‹C‡)J¯çDŠòæÍ›…Gå{ï½g’Çž={„C†Ò1)0gañâÅ3Pƒ´‹”ä?~¼øÑõ÷ÙgŸ)zÀ0çºR¢ ¥‘¯'ùSI>… õiM²©@ééAŠîJ¿Aƒáý÷ßÇÒ¥K•d×.ÒµþÓO?™Ì u¡{Ý•Y™‘üiªøøxÑ«&oqSáüùó8p ¨×«&|ûí·5j”¨ ±š={¶¢ìeË–K²è>š™ƒb£L°Ò§üþýû‹åt+ Ôh¿ýöúõë‡ÿýW “+É·lÙ2 2µk×6™œÖ¹}ôÑGxçwàçç‡æÍ›+º™Ò:X%=RR€Zh a§NÄÍqíÚµ&õ¢o¼ñÚ¶m+n*}úô1yã.Uªè¯I“&ŠÚ„Úzio½õ–"}h-$­5htoÚ´)ªT©b*¹x€øä“O„q-_¾¼Éôd˜è†F††ÖtÚúz¢µ’zÓÍêã?F«V­Ä7¥½â§ž‡©@7çO?ýô;"ÆÄWI ô”—~GsçÎÅ/¿ü¢$húáûï¿u¢á{z¨QÔ^WJdRµ×­ZµJXZcLÓ5¦õ’iC zHWèa¥^½zÂH}÷Ýw kÀT !YâJ÷6%÷¨üQtHHÿ)S¦`ùò妊Àk¯½ú-Ñ}CÉZa2Æ´.\‰Á/W®èDÔºÆ+W®,²äÎ[ÔI©¡¥Ý2s0½ðU¢óûï¿‹§O´)`òMDþ4•žâ©'D††.âZµjá›o¾Q’ cÆŒÆÉTbúÑRϦM›6"éÉ“'ñÏ?ÿ uëÖ¦²*Ч§Iº¡Ñ(2ÐôÐЮ]»tóÓðo¡B…„q£„Ô“¤ù:www£ùhHþhƒ%?D¹jÖ¬iT¦a=¸( ²JÒÊi*T¨ z—ò÷ô>+Uª„iÓ¦‰ ýPÕ ¿›{=¥§GF¸{÷îèСƒ8EsgJnrr~SŸ$‹nb›6mkä×`*Ðz_ "£DCd”éA µ’@=:ú}“õt”µ×•™”FíuEõ¥ß3M#Ðà S~s4¯äád‘a¥‘ò Öô»¥ž©@FpÁ‚bƒ%Si©Ô†ÔK–,Q´c ýž(øøø˜/âé~AúØ2Ð}°H‘"IEn4½¥d­¡ë~¿ÅŠK’‘™õ”W¬X×_=]Ca)4ù¢¢…ûj†K”î CŽN† í¤Cs1Ö ô#¥ zú£ã–-[šO7¹î”˜zœJ.^“‚5š@i{‘úÄ‘ ù&(ÝÅH®¶ÌTíõ$çOï“n̆~juKO6Å‘Q¡^5Š~óÍ7Me„´ÝØ)ÐîLj®oy''2TÔÃs¤Ð AáTDF¹N:ІŠÕÔŒpPPx˜¤]êhÔIi ÝhÇC%aèСbÊ‚†àË”)òÍqÄ@óÉÄI´S"u¸”j?Ú(äèÑ£J’ë2"£¼fÍ1׫dÈÆ\JäAHaË–-Šž@Õ–CC$›ÍÓM†~¬5j$zK4GE½ºiÓN4¦ £Óü°<FCd4·©$á·E © - !QDˆ§Òá/™‡-¯']¡ 4KþÖ ÇñToê%Óyۧȃ ±ìc°aÃ1¼ž^Ã8{ì˜D×5ÍiZ;ÐHÉ:uªð… ‘=¥AÉoˆ¦Ô(ù»‡0}·E ùÛÆ‹Ñ2šBP2|­Vª9bÙ2&ù¤+š& ‡=%Ð(=eÖ høšà”(QBüà• Ù˜“!Ȉ†ßhèÆÚ¡E‹â"¯[·.h) =ʽ)k”E½š ¢¹#ºÉ +™S¦yz²!½H *éMÒ%͵Òð=U[31 §{%^“Ö,7¥,F'Ç9Z’F~tã¥9f%S¶¼žèïÏ?ÿDõêÕE¯’zÖ 4lO¾døi¸‘®]%þÔn4ÇO½3rL¢ù@-zp¥-šÏµf YQ ë„&¿øâ E⩇M#€¦ª¨©·Liio|z˜§ikÒ‡üDè7M0ôaí@>r‡¶,µE ÅfÍš g5rîTêsAºÐ½¹dÉ’¶PËqdJóW©‚´.-Õ¹3f¼˜8qbªó’Õ ©¡S7vBj¤TQ’z!-Ùy!]ˆ/¤'¹TñtBrHó|Z'¥ÞË É™!­¨ÒÞ ©×•fÕƒêc¤¡ûÒ“›á)qlL©ÇûBº!¦J/Ÿ0–O꽿æ’ådÉ>¥•’‡o²sôEºA¤â%f¤:—*£Á cú$I:T“–8¤u% Kq 9Ô½Œnг/ĵ% ãŠói1"ÖÒpk²|Ö¼žèZ‘æÈ’É—¿HÓ,/¨žiií…4â,Jšï|!õ¶’£/iý&è<•kì·e¬-è÷CÜÓº^H¦±|—^P“t ë0eŒÌ 馛ì4µ]z¿—d‰¥/’Ñ}!½'åiñ]ZQ¡ºÞÒÐj*YÆêJºË÷§”m+íÒ´F*YÆNÐý‰îS)É‘z²)O‹ïéÝ×ÒÊÖ5˜V::' 7¿gÆÒ¤u^™÷¡”qĉ~ÓÆ®Ã´~ï”Gz MuP{/I©‹£}W4|MÔk!7}š_¶U ¹9[£Q#oÞ¼Šª@Om´\„†c”¦Q:b(“æ¸iøQM g0[óR£-ÒÒRÙqG-#[_O4d¬tXŽ<ø©ç«¦W-/eSÕ®ê ÉsËjòÚ:-õ•Œ™«ùŒ¨­·Òù^Ò‰t—oäŒf‹@>JßÐg‹ò­%“8‘£–Òö ‘ZúHËIÕ¾)ÎZ:kEŽâák’¥y*šC³vX½zµMÈÌÕ—Œ7Íë§&Ç! Åë‰ 9"ÉUŽCÓzšZ{ØÚzš±¤Œ&@#´4VÉj’ŒÖÕÖå+6ʲ"é-Õ‘Ó¨ý”—©ÍgëôTW[Ô×ÖzgvùZ¼žhNœ`i ž5ä—lÒ4Ê´$B‰ç0‰ ´´£‘Òô4L¡4­aóIó Šó‘|5uË¡z(ͧFY>}š“OfFyM9­<Ìf*½}Ô¤¥6u1¥ÅËi•ê-Ë”óÑSj‚ÒºÐ5¡4­aùtQPr­Ëu0ÌoêØH¦=òIsxIíiªTw5õWó5,[M½Õ¤•Ë ÔÔC®?塺(¹€ÕÊWSµ²éÚPÚ”–¸+©£Ì…>Õê$çUšnÔ}Ê·xñbáIJžò饺ÊPÓn†ùÌ)‹ò«Í§4=Ý~¨í•ÞÔüF ë­†—RÝ å«e¤ö¾IòÕÞ×è¤ß“’{3WJ«ö:§|”GíïVÍﮚû/P @Jäºüž¦QÖeM¹RLÀÎÈ©‹–(ÑR%L€ 0%”uo•Hâ4L€ 0&À˜€EØ([„33&À˜°6ÊÖcÉ’˜`L€ XD€²Eø83`L€ 0ë`£l=–,‰ 0&À˜€EØ([„33&À˜°6ÊÖcÉ’˜`L€ XD€²Eø83`L€ 0ë`£l=–,‰ 0&À˜€EØ([„33&À˜°6ÊÖcÉ’˜`L€ XD Í·DY$‘33&`”Àßÿ­[·&ÅÓËè=ï½öšâ—2$e¶ÒÁ!C0hÐ L:}ô|||¬$™Å0& –÷”ÕãôLÀû÷ïDzeËıè­Xôö¢#F pሷ@²yY·lÙ‚Ë—/ÃÛÛµk×FÿþýÍĹ˜° 6ÊVÁÈB˜€rE‹Å?ü þ¦M›†Í›7#22+W®L&äñãÇéꈈˆ¤ôôZ¿{÷î%}7< Wß=|øÐð”8¦óÔC0`€øÞ²eKœ:u ‡J•–O0&`l”íÙKaF øùù‰ž²üs2Ð5‚¿¿? ,ˆúõë'Õ_~ùo½õÞ}÷]q§@¯†¤ãÒ¥KƒdíÝ»7©,2úyòäA@@Š/ŽmÛ¶%Å?~!!!B¾|²uëÖ˜9s¦ü•?™°36ÊvÎÅ1¦¾zõªø#ÃøÕW_áÂ… xûí·œ3f#}ëÖ-„†† £J=k ôâúÕ«W‹—¾ïÙ³GȘÍSØ´i† †+V &&'ND«V­pÿþ}O½â’%KŠcù?2ì”`C€½2†;—š‰ !®\¹² %KÑ‹¥m‰%ĹwÞy¹sçÇd¬ihúܹsIÄòåËJONbW®\ sÏž=”oðàÁèׯŸHK=Þ:ˆ¹âØØX´hÑBô–ÉÙ¬gÏž8}útR™²ð2eʈaðG‰‡ù<2&`ÜS¶g.… $¨S§Žè¹Rï5::ZÜ>}ú$Å“¡¥adrþ"ohùcJT¾|yaé˜ ù‚ °téR1t]©R%lذ¢@ÃákÖ¬ZùÊ“Ê.^¼___‘Vþ†¹)¡çÀ˜€ý °Q¶?s.‘ %@ÎW½{÷½Zº¦ùá €zÔiyNøðáÃbXºS§NÂÇÅÅ!þübÁå?šSîÒ¥‹•#Gܼy3™Ø»wqš›æÀ˜€ý °Q¶?s.‘ %@½Xšó ½a2š´„Š†°Ó GE»ví„# kÓœ±œ–ÎÓüó¥K—DVZþDÃæ<ßkÖ¬ ê-šë®P¡‚чô|̘€õ ðœ²õ™²ÄLH€Œß矞d yQOŸ>óæÍK"Bs»òÜqÒIƒê½>AAAb8šzÈ4Gâ à§Ÿ~JÇ_2ž@îܹ1f̘ŒW„5`)°QNÄQ¾ò–ˆÚo©§OŸ¢V­ZhÒ¤‰ö•ÍdÒ›¸80-`£¬ÅVQ “‡‡‡x]_Ê7)ÈÊIìD`êÔ©v*‰‹QKÀɉgîÔ2ãôö!ÀW¦}8s)L€ 0&ÀL`£l'`L€ 0&`l”íÙKaL€ 0&`’e“ˆ8`L€ 0û`G/ûpÎðR¾úê+ÄÆÆ&éáëë+<ƒk×®tŽ˜`L c pO9cùÛ­ôyóæáÒ¥Kb‡)òØÞ¿?Ú¶m‹AƒáùóçvÓÖÕ¬Y»wï¶e,› 0&`SÜS¶)^m ïØ±#ºv횤ÔÑ£Gñꫯ‚zË'‡'Ožàþýûð÷÷GÊ¥#dÀïÞ½+âäôJ?iw+z9CŽ9D*‡Î¹»»§‘^%މ‰ï-vuuMÊûèÑ#ÐÚ`L€ 0G%À=eGm9+è]½zuTªT sæÌÒ1bÄap_yåñ ÂuëÖ%•ô÷ߣhÑ¢ )½dáçŸq&LÀ;3”.** yóæÆûÚµkâxòäÉâ% … ÆèÑ£AÃé ÷ 80YÞ÷ß_œ§=¤Û·oÐÐPO2Þ}÷]ñ`Q¬X1±Nû›o¾quëÖŃÄ––‹-J’ÇL€ 0G"ÀFÙ‘Z˺6lØW®\’,X€µk×âÌ™3¸~ý:hó‹>ø@ß¾}=zôÀ¤I“"âFŽ)âȘSW´ç3õˆé“Ÿ;wÔ3'ÃJgÏž+W®Ä¬Y³.Ò6 ÷îÝÑ#GpóæMøøøˆr)’ÊY³f ^{í5‘† òĉ'†ãóçÏ%K–$ Bù?&À˜€ƒ`£ì e+5©Ç›5kV!žz˜Ô3¥ýš)´nÝä¶uëVñ¤áì7ß|SÄ5mÚ”ÞÙÙY|7õmkH½g2¨zõê…|ùò‰ász“ÒåË—/döíÛWÄ‘1ÿðñk×.DFFŠ|Ô»§^9 «“ òC…øÂÿ1&À˜Ï);pãYCu2hÕªU¢nܸ~ýú%KCÌ4¿R¥J%‹k×®]²ïò2¦)ƒlèÉS ¡i9ãÍUSϘz×ýû÷O6—M²Q&C.z ãÌóÈ2þdLÀÑ pOÙÑ[ÐýÉ™jÙ²e R¨'KÚ†áôéÓ¢‡Lq4?lhØùÎ;â½Á4´,úNR:Œ¥Œ§ïÞÞÞâôüùóqáÂñwêÔ),]ºTÌ?S$ïõ-ñL€ è”e6lZÕ¢Þ.yN“!=xð Z´h! aïÞ½Eò–-[bùòåIÃÁ[¶lk›i›þ.^¼ˆõë׋´äôõË/¿ˆ¡nêõ’ñ¤!hê%Ïœ93­âMžóòòžàsçÎEtt´˜+&‡°>}ú(2ÆÔs¦|˜`ŽJ€‡¯µåÌЛæuåWÖ‘!%'¯¡C‡ÂÍÍMH£5ËääEó¶¥K—]Ô¦!cúûþûï…÷sž½ïr}ÊÁ°Ü,Rijg…ð4áÇ>Å;±eÕ&Ìžþ5k7Eë¶íáíí-gåO&À”em8V[=;wî`áü™ˆ}to4-„ú=šH†ÒÀ ª™a9*•õEÛ¦@tL<¶ì=1Ã7¡NöèÐñ-äÈ‘#Ãôâ‚™°ŒÏ)[Æs;íÛ·aâ7_ Iå'øqx#4,æ°Ù¹§GvthYÓF¿Dî×#úáêÕ«†Iø˜ 0"À=ej,VÕ<sçÌÀÝ+»1aP-xåv3OˆÆs¹»¹àÃÎÕqâìL4»@`` Æµfõ˜HI€{Ê)‰ðw]Xôû̘ú#Æ h [ƒlØ`UÊûatŸª˜;ýkœ?Î0Š™pl” ‘XEó,˜?Ï#âÔ¦~È–-«yB0W€onLÜ}?z'OžtÀ°ÊL ó`£œyÛ^×5ß»w.Ÿú=߬ -²î,ÍÕaüíßFùmÝ{ sþ¹0B;Ì9aaaö(’Ë`LÀ Ø(["‹Ðððp,[<C{ׄ««u 2Õô^h4~_yÔh¥ïÜ‹Âù+ŒÆ+‰8xìŠÕÿVIR£iÊ–,€·šù`î¬_Œ¦á&À´E€²¶Úƒµ±?ý†×å‡OþœK{òänÜ~$­K~ž¦¬¨èxDFÅ%‹ëöf LÙ6Ù9’Cë‹Ó $ûÖ݈dQ Ï›ìœ9_Z6*…±W±ÿ~s²s&ÀìL€²sq¶%póæMܸr­—²¨ ÄÄç8nrW…ší¦À§Æ×Xµét’ÌgÏžãƒÁKQ ÆWÈSi4:|¸1ŸˆøgïBçO‰c2Útœ«âH¨>-Þa1IrVo>ƒ|UÇ \Ó‰¨ý &ÍÚ…3”.:æ ÜË ɰ$t{£ Ö¬ø]ÚäÄ`—Kr^&ÀlF€²ÍÐ²àŒ °åŸõx­žÅŽ]4'¼rãi\ß3 ŽÁìño¢k¿%¸v3\Të¡Ô‹¥Gn‰=ËûิiÂÌ"îÉÓĤ^qÿ±kò ç· ÆÃ“_£`~Otùl±HG½c:ž6¶¢ÏÜïƒ0Hš«vËáŒö‚§‡+_ø9=³‹ôæþW²h>äÊÃN_æä|LÀŽØ(Û6e[4 |ìß]hZ¿„ÅÍ[ö/‚ZWN½yóÔ¦“dïÛyó¸£^¢èÔ¦26íºGññ ˜¿ìú÷l€üy= õ®?í^Û÷_CÞKÿ> ò”~»]‘¯Å+¥±|Æ{p¶§x‹z¾8¸oG2ýø `Ú#`}/íÕ‘5Ê$.\¸€"³K{X[þ‚†`iyð‡…’‘+ì—G8yUFA©Ç›E¼’â+•)ˆ¿$#kH ÷¹Jì—-Ç‘qˆŠGðí‡([¢€|Z|vx­¢ø¤8k†êýñÛšBGÝZÔšGhh(òçÏo™,„ 0ëàákë3e‰D ,ô.ü}^BKUhÓ¤,þ\w—¯‡ Q›v^óį7« ¾“#Øäßöˆã“’A^¹é ÞnûrZ.›¶ô¬W£f.>(^' gŸ¸=$1ê­’ñ¥¥Skþ9#²Ó9zùäó„‹s6éP‰b\–gé§a”-•Ãù™°î)ÛŽ-K¶3ð°P8ç·ÎÎ]#¤ùâ“çCPæÕ‰Òs~ܹ‰ßzÔû½*zº;^Å$ÉÓ:4ü1:Kó¼]+U›øÞè½þ’guV''1ä½hr‘Ž¶Äœüe;õY(¶Í“+~ÝN8©U.[Pô¼}j~[FHN_–dA"¢¢¢RéÈ'˜Ð6ÊÚi ÖÄB9r¸J=Lëe2‚| Ö(?ŠŒs¿òF$䨼o„ÐöνHá˜%U§¬y>ŸÚ<@ •Þ‡œˆŠÒܳáœ.9~‘1¿/mHRÄ`Ž:{vg\Ü1á[Å “^î9\¤÷E[‡OÊzòw&À¬C€²u8²(ìŸôg,Ó–a8/Íï>| ä&'©‡\NÚ]ËXÈ!`Cƒl˜Ž¼»90&y°QÎBb"a§¤yò\ + ggç”Qü 0 `£¬¡Æ`U,#àéé)žr8væŽe‚t˜{ßñTl¤Ãšq•˜€¾°QÖW{fúÚ4jÒvßÊô DÇÄãè¹hÔ­[×ð43& Al”5Ø(¬’ùjÕª…‡±9qêü]ó…è,矟CÃ&íáîšqu˜€þ°QÖ_›fú½Ýµ7fþuOŸ>Ëô,.^}€Ãçž u›v™ž`Ž@€²#´먊@ÅŠQ²BcÌ_qJU>½%~òä¦.>ƒw{|777½UëÃtI€².›•+õ^·ž8w;;¦ÿ~ S %P?Ì9„ŠmP­ZµLÉ€+Í‘eGl5ÖÙ$WWW ù-~_{k·œ3™^O È ¿Îyª¢sç®zª×… èžeÝ7qæ­ 96­Z³ÅcÙ†³™DlÜSL[t%«´AŸ¾ýù­P™¢Õ¹’z"ÀFYO­ÉuIE€Ö.ürÎÜ΋ogìGD¤~_ÈpúB¾ø~/<ý£K×÷S±àL€ hŸ@6í«È2ËÐKõë×aÀ÷‹Ñ²^~´n\ în.– ÖHî»÷#±xíy\¿ï‚÷?ú´³&À“eÇl7ÖZ%z—piYP:õ°vÍrôùj+jWʃZ•  doxzdW)1c“?‹ÁIi-ö¡ÓqãÞs´hÓ4iÂÛhfl³péLÀbl”-Fȉ@Þ¼yñ~ñfPƒ‡g”,Sõ[vÆg’wµa>ÊË 0Ç$ÀFÙ1Ûµ¶Í57kÖLü¥%jïÞ½˜2«5¦M›†®]3ƃ911M¤Þïí¡Ø¾ý/G9&ÀôM€½ôݾ\;3DEEáÃ?Äk¯½–a™ÔΚ5+æÍ›‡àà`Œ9ÒŒšp&ÀeGk1Ö׿† ‚¸¸8L:Õæe™* hÑ¢˜¸{—_´a&FÎÆ‚e‡h&VÒû ï¾û.Z·nm"—1qâD“ZÏž=“Égæ„L€ 8 6ÊÓT¬¨­ ôíÛ?~¼­‹R-Ÿv'›?>þý÷_L˜0Au~ÎÀ˜€c`£ìíÄZÚ˜À‚ °yóf1wKžÙZ ôö«o¾ùF<489_´¡Åva˜€5 °Q¶&M–å®_¿Ž¡C‡Š¡ëºuëjº}ôZ¶l‰=zàáÇšÖ••cL@=6Êê™q#ŠÏ?ÿ´î7e  :z÷î"EŠ`Ô¨Q)£5ùÖNÓæ%Ÿ|ò‰QýhúÖ­[Fã9‚ 0m`£¬Íva­¬H`ëÖ­b½ïÕ«WSI¥åFÇŽÜ9sàââ{a“ÃéKK¤fÏžªNñññ;v,V¬X‘*ŽO0& ml”µÝ>¬œ9sFH¹qãF2i§OŸÆ¸qãD¹|ùòÉâ´þ¥~ýúœtŽ˜p l”£XK P˜‚¡Q¦á]škž5k–þ̶áœ;w®x3ÔÀ“ÉŒPýdÉL€ hšeM7+g)Ê¥½¬)ÐÒèe´…æ÷ßÂ… ‹sŽúŸ¿¿¿~§%]ò2Õ™ 6…£G:jÕXo&) °QΔ͞y*-÷’©ÆW®\Z~ÙíÜ¥‡Ð¦MôêÕKx˜ÓƒõŽÉ(;K¯ ~ü¸0`Tß9rhr‹Mö¸xñ"F- n–,YP¬X1Ô®][8¬õë×ôÒ ²&ƒLêGÇ”–`Ú'ÀFYûmÄZ@€<¯iƒà ;GQoR;vÄwß}ù”&?i£ÚulРAØ·ohí5íHöçŸ&=|*þøñc\¾|¥J•2<ÍÇL€ h”Ï)k´aX-Ë Ð;‘iÈ:­@ÙÉÉ Å‹ÇúõëÅæ"Z7Èr=*T¨€7bÉ’%(T¨8ÖneA=dvö’Éñ'Ð>6ÊÚo#ÖÐLgÏžMÆ5‘-[6dÏž_}õh-oƒ £æ˜^/IÃÓô’ z‹Õ+e sl”SRáïL@»Ø(k·mX3 ÐNWòÒ E=c dÌÈYŠöÃ&'0G¤?½r’êÚ½{wQGCãL#üF)GnaÖ=³`£œÙZ<Õ—<¯e'2È´&yíÚµX¸p!|}}uE‚öÃþñÇqðàAМä‡sçμÌ90& }l”µßF¬¡™hh÷Ù³gpuuË´f·Q£FfJsŒleʔ˗/GéÍWh¾Ùp½¶8Éÿ1& I©'¡4©&+¥EâfåêÜ ¹˜˜(Ñ#sqI>$LÞÏr¯Ž©÷*/Ù1<¦:R:Ù[Úð˜â”¤•Ë¡ôÁ7®¡h±BhÐ0¡á×Ñóƒ.(R´´¶7 ”D™2åP¶lY‡y;ÕÉX ×4Òü›—†K¯ y˺8{Æÿ>‰Ÿ¦|‡€€‚"{Êöeò5<¦øôÚ"eZúNr[ÓqÊpûö=”,Yy½ò£Ô•*UrøÝÕRÖ‘¿3s°Q6‡Z&ÏCó—›6¯ÆÕëgP¾J>.–Uêç…›»4‡›zðÅp,;e‘ ˔Һ¡3ØJÒ€Ÿ•I¾–Ìž%–FÂÓDÄ>~‚Û·NbÍÆm˜1+µ£Mëöðööv¨–¥ùâmÛ¶aÛöµ@¶T¬ê²5r#_þüpÍî÷ÿ¶¨ Õ©C²z¥l9Ò¯á1ŧ÷=­8ÊcX}7 Ïž•Æ“ø„‡EãÎ͘6k^$xàÕÆmÑ´iS‡Ÿë7¬+35²H?œ—» ¨ÉÅi3œ@PPxÝíîܹƒ¿ÏBDÌ54o[µê–H2zöÒÁÚåÄDÇc÷ö‹Ø¶! ëµF‡Abk—cmy´S×â?g¡xiW4j^ÅK°vv—wíÊ}ìÜrWÎÇ£K§^bS[)Ñ£Ghyç6[Õ›åjŸ÷”µßFšÐpûömX±z.Ú½U õ^yM:YC Ïìhõze4jZ+ÿ<‚‘£ ÏÇÅúekÈ·¶ŒØØXÌým&n…ÃGQ¨ˆcõîÓãQ¬DÐß­a˜?sÞ‹z~,–{¥—㘀ž¤kÔSí¸.V!0gî¯Øºk†Žm,d}î åæîŠ®=k#¨{üôóh±~Ù*ð¬(„6Cóõ¸å¹‰ãZêÊ b (ì-Õ¯r濃¯ÆExx¸a43]`£¬ëæµ¼r ÎÅ´é?bð˜fÈãån¹@K¨P9Ÿ­ƒ³¿Åùóç4£-9ÕµiÛÞ¾1èô^`šs÷šQÖ ŠcYÐ;5Q£ éËKº¬À”E86ÊŽÑN¢å‚sp Ûv‹zù~Þ QÄÎ…úù{aø7Íðñ'ÝqòäI;—žº¸˜˜|ûÝHtéQ}ú7K@ÇgZµ«ŒV aøÈþ Šp`z'ÀFYï-lfýöî݃ÓvH½²jÒ’!û»ìÞ~ çî6S{˳ô̓Ÿ~í„_çü€°°0ËZ aæ¯?£\5tz·¶RÌÏšÑmѲMeTÌŽ3§$-¥3¿6œ“ h›em·O†hGsxüõ+ú ¨/m¼‘|ͱµúîËÕ=h©Qq¡÷£píÊ£ñöˆ(Y¦ ^k_³çLµGqi–±sçDÇ_Æ›]j¤o“G_C­r#ŒŠÒB[¼Ñ©:b®90=`£¬çÖ5³n‹ÏC“ÖÈï“ËL ɳ=މGTd\²“tî±´^8eˆ—Ö®Ò_Çεðåwo¦Œå{òä¿W.&ˆ‹³þV’›—C|âMì߿߰(»Ók—­œ‡n½­Vmèñà^d2y ‰xôðq²sòj7­´E÷±rÍïˆŠŠ’ÕãO& ;ö—ÔB}Uˆ^ux5øº}jù²§ÈˆX|úÁ<œÄôŸþÁñ#Ábèrûæ3ÒÖ™‰è;°%j'ào^ƒ?]ŒɰԬS…ó¢D)|2 …U§c—Šø}úBÔ©SÇ®ë²7lüUóXíáèÇoÿÆ’û)ZwÉÛ|¦Ô¹rå@ç¶S¤g(îý)N\›€nAÓ¥%bå°j鿨R½0Ê”óÓD[xçωu½±aÃ:¼ýö;Vi[´F€{ÊZk‘ ÖçŸ-аY!«8v-ž·WÚˆÃ'®~/þž?¥‹bÀð6èÖ«!ÞêZó—õÆ–zkd0¦Íë‰:’ñ¦ÞplìËž4áõ«¡y«J¸:£¾íˆ)ßoõŒïÜ~ˆß›#zÕçïþ„öA5ñ×ÂiöÂÍEKkgsxÆÛÕé‹ö«Þ±óo4iYÖ\µ“å ¾ŠÙÓ¶KN{£qöÖ$ôìó*Æ\‰2åý°dÝç õÚWÃ~gÎÒ®gÏ0kê6ÑF#ÇvÐT[¼Ú¼4víÙÚÍŒÐ#6ÊzlU3ëDC›ÿ݆K›)!y6'§,8"õv©w›Cê™-YûÞÿ°QòD߆}Ý›•—Þuœz»Jõ"ˆÓR™î½_ʸvù>þ^yL–áææ‚®=Ødw«†M cÿÚÚöðÔ©Sð/â†|rZ¥ Ú¸¶])ñáÀôH€²[ÕÌ:K½3ëmrC20¬5Ž]M{‡áyâsL’æ5Í ÆvøÎëí‰ËC’‰¤r­Ü=²Ã5j}ÙiézýÆE17žVœ9çî‡D"PÚ«|ãža8<ÔòÙb @­¼Œn‹ÂEóázðµjsz&àØ(;D3ÙGÉаô³Îp)iüˤ͘2a£pÌ¢¹ËŠU I=Í—uÉ&õv££’{d›SËWš–ŹÓw°eÃ)ыݰæ¸ä”tÍQ&óøøyÚÍ(?xp¾~yLê¤4Á©ã7Ð]rà"/k~µE¼¦+(Ð:tšG&¯wK‚½ÚÂÇ7·´vrHsäÖ d„§JIUŠ  M“güÐ1í…#^¹ŠþÒ´…*„£—Æ›]¤½Ú‚|î߷ψ…Ù08#0“¿ºÑLpͯnœ1ó'”«ùÕ‹Y­zä\tåÒ=Ðr–”=?ê™Ñ¶%sØ´n™–ø”zO´¬‡nØoKK|ºø Z¶©bµz ¹Óö£Nµ÷h½uÃÆìÞ³#¦Îïh,Ú¬óôÐråÒ}ñãò•üS-ïz#žÌ.e²g[ôí¶ó[i®ªàW7šŽ3Ú˜_ÛpfO·RÕ© 2q!j‰A&±Ÿ¢‰ä´´qÝ <–Þ¼üƒ8sò&ªI=hGÖ~Õ9½{»diÐK7Òz7fXôÜ–pá¼L@ ¾VCKïi¥›¶<çë(U¥%C?LëŠE¿íÁ¨/þBihö÷}­¶á†!2dÖ6”†òýØžmáè¬X&`Œecd2ãyÉ"KvÇáBëöÕ@¶dÓêaÚª\{–e­:Ø«-¬¥/ËaZ#ÀÃ×ZkÖ‡ üŸ÷ÊùR`™åÌ׿FkLF€¶Âä6—|^.#J;…õÎÒîjŒ`>ÆÙpŒc`£ìØíÇÚ3&À˜€Ž𜲎ÓÒªDGÇ`Â×ëÇËz»zYª“Vòר]ÙœÜì6§r7¾;[+Õל qÙ5§+ĬA€²5(êD†§§n‡š’âšÀœ©ûìæ}]Ð7¦-xÓn©k«í3}Þ]ªmY;&`&¾6gcL€ 0&`ml”­MÔåÑzû‡´ ¼äcŸŸ ½¢Ò—D¥MÎúg‰& G|eë±U¹Nº ÀK¢tÑŒ\ & ŠeU¸ô˜—D¥ß¾¼$*}>öŒå%Qö¤ÍeÙ“e{ÒÖxYYxÈ4ݲç2ϦÛÒ4 ߺÒ'ıŽJ€¯lGm9è­fN9âÑcŒ´T¼+ù‡qëpõò}«k4cò?8yì†ÕäîÛu‹çíÅ­aøîËÕªåÒ¤ö2T–¥sÊ–ÖW5 #fý²U´#½4díŠ#FR©;m)u¥qj&`?l”íÇZó%= „ø¸§Šô¤¿æÎØlÙ²bõÒñèácEùÔ$:{ú6ÂC£ÕdI•–Œ/=}&?ã,Jz²h®–nÚq)¦ÎíW[T“‰Ï'O¤×5>IvNþû4•§wü>þzÒ×ÝCÒ•ôõ|©»œWɧ³³ råÊ¥$©Åi òKÅC­ÐôêK\ Û€d²2,‹Þ³œžÓYdDlRršë}p/2é;xzæÜ=wË7ý kÀÏÏ'Yü… è…o¢—–´B=¼òä—nÔWIrqÉùý»/\vû÷:úöø -ÚTÆ2齯Rï¹ÍÕðÓ¯Ý#‡ :´˜„FMËa•Ô³®R½0~šÙ [7žF¿ˆ¥X”¾[¯W0æû dÍê„7šý€î6ÂëoÖ~ð§‹±qí dÍæ„À:ÅñËœ÷á?§B3d~Ÿ³.®ÎâÁßLê„][ÏaÁìÝ¢>Ôãîܽžxx ÃLjCTdrçέ6›Yéóäñ;âfn– ëK2?ý`žèµ> ‹A݆¥ðëÂ^øMõ0d5YìØrVŒ2QÎ"-•ëøv-|%µ %9´ï²Ä;›hà wÂßþ% ö!Rzàr—Þ£=S’[«n ¸K@ô€@úXcÉ]´$?wî<æbá|L@ÓØ(kºy쫜¯¯öý«|zÆ‚žBÁ1ãƒÄû‹ïÞy„àk¡xŸ€c—ǃnæ¯7™ˆ™“· ÿ°ÖHzϳ¦nÃÀmÐöê¹û½»ÎF¡Y«J¸!Ò.–ôyUôp)…/%£{_êí>>>¾¹1¨ï"ôy.–®ï/æ‰7¬9g¿A^oOŒ¾#ü‰M{‡ ââ0iú»bˆ½tY_äÎã†ïî"ä*ýïe0¾¾¾J³X”Î߯¨4zð>ͬS)ëKsêdèO\ýd”?ê6K¥¡üÃÛ$cEÊL©Ko@IDAT³G¶E»ŽÕûU¾†¹RÕBÒˆÊsl’æˆ;w«‡Õ[ŠvŸ=m;‡n.øõç­7r%ÖnŒÏ·BA©Í öF¢^´qóF8ŠYÄ—33­àák­¶LèU®\9œ?*n¸JНZ£¨HV¡r¨ç,‡/F´ßÉ tïý ¶H½a9¼Þ±†t®òæóÄšeGDO— 2JÿÆ[5EoXNOŸñ’‘ÿkáôþ´ ¼¥|ÏÑóãÆØ»ó¢‚]ºèÞz·üü½=»3¾Œ~¯OšŠÇ´§wÉàS/¼RÕ©âÓ;qöÔm+RÎÎÎé%³Z\…òÕqúxˆEòÒª/õT¼Ší›Ï ‡Ô›]²ö3¼/F¤ ô2m^Oai”áš4ï*õН\º—””€¾›ÜeÊû‰ámšVX`z"ðßTOµâº˜EÀÓÓE‹”Åé7¥áå"æÉÈ™]ê­z$å-(Ý„©Ç,‡²üäCÉ :ÕjIúNþ…òbýêãÉÎQ:šÓöù’dßÔûŠŠŒÅ-i>šnür aõŽkÉ_­òyôÐmÔ¬ñºUd)R­Z5,]1 47oøÀ£$ozizH3¡¢¤‘†Å¢]ê5*ï§tÜ ó‘—ùæ¿Obþ¯;¥¡k'”¯è'éaÆ0”.ç›ä^´x~L™Ý]ôÇŽX Š4ª-Zµ«j˜Åâãéì̱0¼Ó¡†Å²XÐ"ä¿2-jÈ:Ù•@“Æ­±có5³ËŒ‰~’ÌAé¸4Ï\¸¨wšòÈx^¹”|)õHý¼’¥§Þ1…¿€£Ò°8ýÑPõ‚埈´$'øêÞ¸4,þÛÌÉdXò%&:g?Dݺu-£*/9”•)Uö\V•ÏTâÒôÂi*áØ•ñÒðþ0<—†¡'IsÁ)éã7¥7†­ŒŸ‡yK?†››qç¸û!‘”æ7î†ÓÁA#"C>û#Ùµ² s¾ÓØEŠæCêcP½ÔP„Hg}ú5q$ô!‡2sÍ¡ž>ƒ6­Û™“Ý¢<þþþ¨Rñ¬\rÔ"9†™{}ò*þ˜¿WplTã+1/ß§_3‘ÄUsiž¿D)‰ç0–¿WC×õ1vÄ á g(“ŽÉ“Y•bƒÑ²þ·Ò» gaè˜öy§,cÕ_Ǥ¹äú(R¤HÊ(þÎtC ‹Ô³ùÿs²nê”)*„¹sçZ¼ë“1X³fOÇ — x§Gji,ÏáWðn‡©¸2wn?Ëbrç1Ý»¤e:ÔË-TÄ;i™•Ѽî8ôîÛovy©9]¹xOêå=ÍM§ÜÕ)ô~¨·G=kÃ@Žb4Lë&96© ´v܈еÓ 9ÞŒ±±±>ªºô,rÒ¼®59dÑÃ-'Kéx•’í~–3—råvE“‡|Ÿ\©ØS$ÝJh:‚¼ïËWòO3¹ú_nø?ðñª‡wÞ鮹j’g|ŸÞ#ðÛ´3X»ü˜QOhÍ)®R!š›^'=Îýù$Fø¥K—V)“3Ç%ÀŽ^Úv¶vôJ‰…n”ëׯÃúM¢aS?4iYNõb¶$ÀFÙ–tY¶ÙxøÚlt6Éèââ"Ö'sOÙ&xY(H"ÀF9 h‰_k©5^êB½ežSÖ^»°Fú"ÀFY_í©›Ú°QÖ^SÒ¼2eíµ k¤/l”õÕžº© Í)³÷µ¶š“²¶ÚƒµÑ'6ÊúlW‡¯÷”µ×„d”yNY{íÂé‹e}µ§njÃŽ^ÚkJžSÖ^›°Fú#ÀFYmª‹qOY{ÍÈ=eíµ k¤?l”õצº¨¯SÖ^3rOY{mÂéeýµ©.jÄÃ×ÚkFvôÒ^›°Fú#ÀFYmª‹qOY{ÍÈ=eíµ k¤?l”õצº¨Ï)k¯éMQì}­½vaôE€²¾ÚS7µáž²öš’{ÊÚkÖHØ(ë¯MuQ#žSÖ^3²÷µöÚ„5Ò6ÊúkS]Ôˆ‡¯µ×ŒÜSÖ^›°Fú#ÀFYmª‹±QÖ^3²÷µöÚ„5Ò6ÊúkS]Ԉ电׌ÜSÖ^›°Fú#MUâY‹½èÌ™3¸|ùnÞ¾ŠÇ£ðèÑ#xzzˆ"^¼x,Y²àùóçâ]»j> u$$Ë0äpž<}„!Ã>I:íää$ÊJ:!ÈçL}ÊeP:Çœ9sÂÝ='üŠ¡T©²¨P¡¨WèˆFÎ;‡sçÏáÊÍ+ˆˆ|„àë7PЯ h+ª“ÜNrýäïôIAf)ÇËߣ£¢Q±zE|:øÓ¤v¹¦Lk(Gf.—#§¥O1"’-råÌ…B~…Q¦DÁßËËË03LC€r¦ijå½}û6ÖoXƒc'ö¢H O”­M«yÁÍÝ .®%’edLéßÿ³šÏ$!ÒAÊ;Å©='§wÊ"îÏ“ò§u^Èÿ¿îT‡'Oû·nœÇÖ={1û·(T«R­[µG@@%×| Ú¿×`Û¾mp/yKzÁ«jvóCq—ÂpÊê”ôàCÏ?ÒsPR ïNNôpõòÁˆâ Ÿ‘Òûn˜¦•é“‚a¹r»Ðùç‰/ð4^â÷:N:é‹¢\±rèЦƒ0Д†È,Ø(g––VPÏèèh,ùs!ŽŸÚ…–íŠãÛ-áêê¬ §>’”.狦¯ññ ؿ뾛8•Ê7@—Îï‰Þ´ke+—áïmëP¸nš}ÑÙݳkQU“:ù- ÒÐÃÝÕc×0aîxö*‚ßÿþþþ&ós& Y¤@òqC=Ô*Ô!((sçÎ=BkT÷ìÙ³˜1k"j5ðF«ö3•16ÆzЛ֞ÆÁ]aèÕs*Uªd,i†œ¿~ý:&ü<Yý³ z몒1vÍ=lYè¥Ã—qñŸ«èÖ±Z4oaµ¢zôèeË–YM bÖ"À=ek‘t`9;wnÇŠ5sðaÿ@-žßkb]Õi”àõ j¨R#³¦ŒGëÝÐÜŠ†ÁmiÞxÜ”oP©C9*WÈQšÎ[*°$üJûañ¼…8uæöhµQMWœ•Ë´’{½dZ ™·â»ví@ûö0`DC6ÈF.ƒÂEóað˜W±jÝ,ìÚµÝH*û>yò$êÕ¯‡ê«èÚ ËDÝs¹¡yß&Øsv7~˜üƒ|š?™€. °QÖe³*«ÔîÝ»°fýôòÈ©,S&M•+·F}× #GÄÎ;2ŒÂéÓ§1aæxŒZ9 ‹ûd˜ö.8k¶¬è4ª#–¯_†9󿨻x. Øe»¡ÖVAÁÁÁX²t>ù¢> Ì¥)åÂÃb0zÐRá­%ÅræÊyË>À_Ëŵk×ì®Zxx8&N›€«iÊ ¯˜´n„Úœy÷ýõ#ì<¹;2ðÁÈæå256Ê™°ùñëìÉèÜ£b†䣇¯¡V¹FÉ?}š€SÇo$-Ñ1š0"| æÆ»½+ ~ÄÑžaúìi(ÔÀ²—²=ËN¯¬CëþEdXdzI¬—Í%t¯‡¹Kfƒ–q`z#ÀFYo-ª >›6m@~¿'¨V³¨‚Ô–%¡ #ÜK~ÃNHHÄ£‡Ó‡‚¾y°zë i—diÇÄí=ÇÅ=M–Ö–_*U- ß"‰X¿~-‹I&ûàÁƒ¸öè*Ê7,—ì¼Ò/#'­SVšGNÿ8^>Ÿ$+­ð<ñ9"C“·µœŽyËGi$OwúSræõD‘†…0wÁ\%É9 p(ì}íPÍe¹²´®uý¦eôe]Ë…™ðã·cÉ‚}ˆ” ­»´\gæÂ^È% wn;E2®ÏPÜûSœ¸6Ý‚¦£QÓrXµô_T©^ý‡¶F³:ßàØåñX0{7Ž eûæ3xö,}¶ÄàQíDéwn?Ä'Ýçâèáë(œí:VÇ=—±fÛ ÚYÝ>¨¾ÿr…äÝôža[2h‹–/DÅ6åUóÝÛQ©QE\{áwÑÝ-;úLíÕŠcýÌM¸uþ>šÒKÈŒ‹‰Ãõ‡bÜæ¯§@nPÞR5JàäŽÓxp3E+A‹M±è«?ó0~¥|ÑoN_xzyŠüG6ÃÔgJ†õ)¼ z¡÷=’œÐvü!ù.LY‡D©írzçDׯº líÒˆxáÍ¿Ä;£ßÆòV¡ç÷ÝQ¡²‡Ž²õÊ`ÃÄ@ËŠµýÃ¥*𜘠X@€{ÊÀsĬÔã*^ÚÍæŽ]Á×B1{Úvl;<goMBÏ>¯bÜÈ•(SÞKÖ}Ïì¸ö ¿ôÆÄߢX•¢ØüÛV¡/õjÉH&i·J/oåEÇÇ·D¯zà›_"ìv~õ>ûµ~Üÿ=b£bqtóñ¤ì] …ýñÝÖ±ð—–0ý6ôw±ç™=ç°ê§µøP2þ?ù¾_>šŽ¨°(Q”Ðqå|0¡;JKËŸ”š_.\Û6oPš…Ó1‡ ÀFÙ!šÉzJî;° ›·ž@#’¨wûø‰´¾tJŽ[Ÿ hŽeûI ¼Þ±º÷n2v)C•êEðV×:bOfJCáÚåû ^ò=—0tL{VÍÚÅñF§@oÿˆã¾[l^Ôν;Q80À¬rui(Œ¹{nw¶®{×î+–S¿c]”õ‡·¿7|‹DåW+¢PÙ¸åt½mCç®Úí…1Ε/^ëÝ!Wïáѽìþkª5«‚bROû©4ÅP¾^Yä ðÆ©]g’ôx£;”¯_Î*w+]»öÙ#žÍ4/}çÖCdËæ?ÿ¨&ÂC£±pî ùì4n¦n^”ÄK÷ÿ4ƒW^©—ô4T.ïD|ÝöKsdeè¥ ýÜqóæM”-[V>mÕOZõÌérxä0K.é˜V Ó4„-2ž)ƒ±¼)ÓÑ÷‡÷A¹}ñŽHâå“GšsöíÊõöð ¤l÷ƒïÃ#§x EÒI3<|Ü@ËûèÍ^˜€pOY­¨°<€oÀ½N…ÙÌJFKšºK\äeMCÒ¯¶¨€ÿ5 ‹´¬…æ‘éÅ–„"ÅòþfKóÑ4T~÷Î#ql‰Lµy ú{"4Ôv$;gë·Y~©×{ë¤yÝí‹vª­z²ô;%g.êýÒ\ó¶…;Äü09uU~µNHsÓT…sûÏãë7¾õ¢­ˆÍí{·­!Še0Màž²&šÁ>JDFFJûÿ×;²e©d„§NÚŒ*ÅK¯~ôCdD¬˜û¥eNå*úÃ/À •‹’vo¶Ù¤]žfþÞ Ÿ÷žŠE!·´ëVëöÕ°_šg¶W žôŽi[j³ÄçYV*ˆ¼œ·Ì߆1íÆ hš?VÓ3N©ùÁ†‹×0Ò’¥OgöI^y»nJ^Þ£[•¼²ó >ö‰ð¶¦µÖîG¤£ú;íôö×+«Ç4K€ß¥Ù¦I_1sÞµyóf܋܌Žk¤/ÜJ±äìuåÒ}<‘zÄå+ù§ºé“—4 A[nHÃÕ¾þ^b©üÅóöbÿ6¯§%bç]µôòæhŠV­Z)Σ&á‘#G0ë\Ô{§ŽšlŠÓ> y2¢´)‡¥á‰dpi™è”žÖ/“ã—O±V}µäõSÁp½ê†/>¨J}~K”*\œØŽ,ÿ%ÚQY.ʱйdi£J[jIðˆ/þBQiûãþÍqùÁ=LÿéôòšÑ29"9ê½Z+¸º¹¢@‘—ïDN)“œÆ ÇRÆów&À^`£œ‰®2’Ô{ÕSøzB&Kë–Û7ýù$/í7Fz•Áíe›eDÉŽQ¦¯iÇ ÏZÚŠe[‘e¹v!P¬Dü,-½âÀ˜Ðö¾ÖC+r2Œ÷Ô2 =ÌtI€².›5íJÑË!t6zvEíx6Ñ`­¯-Šmö\_SÖäDÓ1Ïù¢¶&R–•ÁØ(gppñL€ 0&Àd<§,“ÈŸNNNX4o¶lüïE™ Ú6­âý{Qøâóf6+ƒÚìØÎã8â¼ÍÊpdÁ#cѱEGG®ëÎ’`£œ ‡¾¿ÐPh×÷_‘¼“k껢v¬ÝŠ?ÿµ©G;µYµFUÑà=Û¿jӎجV­SÎr™ü¬”e8¾š3¼ X&À˜`/ °QÎDWy Ó‹8X€“1µT¾6úFëUÃa%ñ5í°MÇŠ!ÀFÙ=ž~y³Ñ#3%u²õ†,¶4úJê§õ4Òc‘ÖUdý˜€bl”£rü„4?ùœ—×Xµ!mÍ“—D¥ß\¼$*}>ëxØ(;^›™­1 …Úp¤Õl½9£=†¯³HCäÒ&@£N|Q§ ‡Ï:$6ÊÙlæ+MFDi˜õËVœzøºâ|J†Þµ+Œ&_ºø€0ÈOž$à߃Wm6ôNCÐsg콟yõÒñèác£:¥Œˆ‰ŽqµUˆ‹‹CÌ#ÛÉ7¥wüãxüÔãgœÝ—|ô™=g1¨áp,¿_½>|ý§)Q6‰O®‡ÚD6 eA€×)gõ *ÓËË ÷£”7¹§g¸{d‡§gvdÍšúù-*29s嵡¹ÏȈ8äñrO³vOŸ>ïUöÌù2=%êØ¹–ø3ÌðìY¢Ø ÔÙ9kÒi_¿<ظgXÒw: òÂD#¿O®dçé q2ø¾þyÒìEÑÖ˜dLsåvy=¤ú¹{¸&{üÿXœ0ñŸS–¬È›7¯‰TæGçÊ• ®®/u3_ŠúœÔ ^ôåÑŽ~˜ü¡ .:¿\Œ·G¡vÛ@D…EaL»q(]«4ª·¨ª¾0 r¼¨|| Z ³2mH}§Õ–~¬ äÎÑÏKt÷tÆŠŒ–l¨:´˜„Ÿ'nDãš_ãË!K…¬oG¯B¥"ƒÐ ÊhÔ¯<[¤6…cÿ^GÝŠ£ðÕ°å¨Vr(Êú ÀGïÍF\ÜSÿëÏ[ñA—_Å1Ê‘_ü‰Rú¡|Àúùxþÿ}¥o‡¡tÁ~ÂØRâ¿ýµÊŽ@ý*_¢jñ!8´ÿJ’ *«LÁþhÙà;T*:־ܽ,øZ(Jø¿ÍÜ …¢œÿx½ÉDDK#..Ù ¿ÛYÔUª¯Òù 9sæTš\u:2ÊO¢Ÿ¨Îgi§,N(Q­8Z}Øy<’-ûºvò:¥‡§ÀÖ5D19½s¢xµb8¶å„¥ÅªÎOÞ¹½Uçã L@«Ø(kµel —¿¿?îÜŠR,ùóÁ­P¶¼Z¶©‚׃^î– õxgM݆n½bäØÒðó}¬Y~vÙ›“ðÉ€3t¹ØåŠz½d ŸÄ'àØåñ8ré;?Œ™“·¨GûÒàl”ŒçúÕÇ1wÉG8pz¬tþ)"ÅŠt4¼/ŽIÞìiÛ±íðhœ½5 =û¼Šq#WЏ?æïņ5ÇqèÜ8œ¹ñ~˜ÖŸöø 7®‡ŠøÇ1Ophß•ôذ{(®_{€Ö¿|€˜± §H3f|Pš½o™Æ·oF! ëœòõõE\D|ÒŠu¤š–’U©hTOüåFK Ãýàð)V Ù(DÂùñð®ý‡‘cBbQ¤pCõø˜ 846ÊÝ|ê”÷öö†sÖœbžXIÎ’¥}@=Çs†åðzÇèÞ»òæóD^oO¬Þ:P S–†´¯_} 9e=—“ã‹mEoÔ§`n)ß+ÒÞÛ§“âä:׺}U4n^^Èý|ðkrT²OZûø ÏÛƒ‡’Ø'šcÙÆþ"ÍŸ¿ïGÛÕ“Œ*=LøøæÁŽ-g“dŒ×n\­0jÖú_{çîDÑõñCïUzï½HoR¤ˆ"MAEDTE}»è "`Á‚`AT,ø‚ ET¤W)Ri"HG÷›ÿøMÜän’Mnro’û?ÏsïîÎNýífÏœ33»åeÇöCú\úeõ¶Fí’º®žvP“ŸþÎ.… +y§2dÈ UÊW‘}Ûö'/£¦>ª”oÖÞŠ:oáj6ø©Sa˜´nø_YøÕúì>5)­nƒ”«IW¢T~9¬Æ— #a$k¶LË?\YýÃni¤xF[Z5½Römˆ¥ ËùÄ‘“^ÍþSÑ-_Ä+,ÚûUG¥béJ?……•r¢\I—íhÕ²µ,_z0bË‹Þ|u‘ìØvHÖí-‹”KùÞ¡Þî5jÆQÅujœ¹tÙ¤c€°È‘,…2.k†ío¿žÔÊ¿6í+°Ú‡Ýû¾.ãÂ;~ú7Äß¼i¿—•Ê’0¤÷'pÍ/[r@Zµjã/JÄÂ7n,'wŒŸÆ‚.SH~ßwÔëC‡vÿ&Å+ÿÛYK‰zîúa\ÛöÚ”(Še@Š RN1Ô±QP¡B…¤fõfj,õë2¹µÚ¿÷˜Àr†KŠê‰ u–æÕ“ؾ;å[†õ¿óælVm«%)öªkkÉ矬QŠùWÁLí·&/I×ý"}nxU/[‚ÕÛº} ±”Òîššj|{•çÆñâù›åOå꾺cmFTÌýQªWm¢fþFß:Ì–-›tißUÖÍûgü;¢ #³š-kj…¼äý¥:5Ö1ÿ¸t³TiT)ŒÜÂKrp篒ùLiÒ¤Ix0 Ä(*å½0ѬV÷n=dñÜ}ÚêLn9ýµ–EÊ}ŒY×õ+?"õ–•’¥/“}¦è¬³eÏ,ß,Ü" Ô¹vGHýFådÀà¶IŠ2¬ƒ*œ[ZÕFçsøÐIG‹J8[¶Ìry¹‡äê+ž•;{½.ïªÃ01­H±¼jøp•ÏÓrwŸ7åå7o—…";;Ë­~¹Onè~K’vD+ c‡Žröçsòë.oO@´Ê ”oVÕ»û•2{Üg2ìÊÇdô-ÏK—{;Jéê¥%‹Ø¹K]’5¯—þ½xÍ ẌR‘@:eÉX©X>‹“À 7Ü S¦L û¡ôõ× dɲé2ôɶŽkC©&ÜìÚþ›”­PH¿€–î©gåg5á«×õä§_ÇÉýÇ$‡z˜çÍ缎åáV„5 E^¼D~O0q¬Y­'e÷±WÔšÝL:ÞNUƳ«×*‘„^x‚™Û«Ññ=E`K·^¹Pš5è!W]Õ>9ºÏbÆ 2úõç¤ý6’9kf÷ £Êñà®_î씬ϊ٫¤|ÆJ2xàà°[Ö·o_™5kVØé™¢E€–r´ÈÆx¾mÛ¶“¢—].“^Zœìšâ5‡«Õ ™aݯ¯u %H!#^)Y¡R/…|R)÷ÏÕ’«¼ù²{,âaf8fJcßWJ”ºLŸƒ´¼?u…È]SÚµ»*ÒYͯvíÚÒ¡Ùµòõk‹õËS‚&ˆr,›*Y¥DŠ*äMK6‹u ½ô»½_”[ÇìI uP)§÷˜(õî»ï•c‡r©uÃÉWÌN Ê©fé^^¯ŒÓ)×aXfµ~Í/2ùþ®ÓD+â„ç¿–£¿æ•»îìØˆV¹ö|{ÞÒSê•i ó'/Œ Ål¯[´÷×/Ü(¾;$O>ô¤®ø÷ÍpÑ.—ù“@J û:%iG°¬äº¯MUàz3v„dÉuPn¿»™ÇÚ5ç¹=múÔ•²w{&ynÔ ©¦í×â•W_‘õ×Jó^M%Kö” §½.)±¿jÎÙûíyÚûÊ“|×=Ý×)qÕXF8h)‡C-ÒÀõ<ô?Ižlõdäc_é7p%Pó’Ý,ÍõÄ|É*5åÙ‘ccB!£QO½ºNYðòâ˜z±H²ûd€e`‹¦|#¹ŽæQ ™…ìSI ¦dŒ©Ú°2©Boê{{Y¹²¶¼>n²TªžM:u«íõÒT©X*Š/E}þÑÙºñŒôºe4jÔ(kã\ô ÝnÕjÈ„7'Ȯ廥¶Z–¯p^çÈqzA½}óÒ­²åAéÑéféÔ±SÌtˆâ %«g¨”ãì‚E³º 6”Zµjɼyÿ“ÑO~*å*åZu IõþkóÁ†h–ŸÚyãMc?m9(›Ö–ÛNIÛÖ]¤ïsczü¯˜?z¼,Z´H>œödÈŸ^ W+(%Ԭܗýûö²Ôfë¦||&òð/‡åàÖCrhÓaiÝ´µ õhT¿Âå¦^ŒC)I€cÊ)I;‚eEjLÙ_•.^¼(«V­’5k?oQoÌ:­^’I½Øã‚zö?Ÿ<Ä&Ì~Ƹ4Üà¡líå"ß•y&?{¼@a朿­)çírV)‚Œ3ʹ?/J–Ì9¤|¹jR·NcA%S¦ÈÏÞ¶—é}ð_·N}cõrY¿eƒœ}:ú…°ƒ?Ý4&!´Jà™gž‘3fÈÖ­[Ó*¶›¢J€îë¨âeæ$@$@$àž•²{VŒI$@$@Q%@¥U¼ÌœH€H€Ü RvÏŠ1I€H€H ª¨”£Š—™“ €{TÊîY1& D••rTñ2s  pO€JÙ=+Æ$  ¨ RŽ*^fN$@$@î P)»gŘ$@$@$UTÊQÅËÌI ñ \ºtI† "Û¶mK¸Æ¾ôÒK²zõjùôÓOeæÌ™©Ò¾ãÇk¾/^”áÇËöíÛS¥,4eP)§ g–B KJyüøñ²gÏž„kã_|!¿üò‹VÌË—/Ú¾êÕ«ËâÅ‹ƒÆ %Âßÿ-¯¼òŠd̘Q¿wüèÑ£¡$gÜ8#@¥gŒÕ%x"pìØ1±,+I•Ïž=+GŽInNžù¤¥,ZK¹‘­²eËZ¯½öšŽ¯¸Õ»woOY¬º¥õ¹1cÆX7Þx£¥¬TWëÖ­-5>¬ÏõíÛ×jÙ²¥õóÏ?[¨ûm·ÝfµiÓFŸóý§>Qi)%n)%j©ïHëÓ¨¯_ÖûëÖ­³²gÏî9W¤HkÞ¼yúœûÕõE9)S¦Xª“ ë´ÿ~ͬY³f:>XªóŠ+t(u¦$.Œ‰Ó½`KH€b…À=÷Ü#U«VÕÕ¹å–[ô%¼ýöÛÒ§O)Y²¤>‡‰KJ™ë}ü»é¦›dàÀúxúôéÚ «Y=‚µ¥ ÷“O>‘È­·Þª-nDÆ$3¸‰UG@§MŸ>½,[¶Lç kú«¯¾ÒyÀM +y*TH»Ÿ, 4ÐnnXÏvQ}hwgÈAÞ{ï=m…×®][[àïõx¾ýö[m)ïÞ½[[Â;vìx ŒÀ3мys}è¯Î8 Ö8%± $½“»½l @ €Â3’-[6Áø-“ÁŒ²Æ1\Ò={öÄ®–Zµj™]Q¦†;Û.pgCvîÜ)O=õ”lÞ¼Yç Å E¢…+Êû÷ße)ˤI“DY¤ZyCñC  îc_¥lÎÛ·p9+ë]š6mªÇwÑ9xñÅíQô>:p·£PªT)©T©R’8ö¶ù«séÒ¥“¤c@âø÷®LÜ6²e$@)L ]ºtŽ%b|ÊÔÈd„ æÐk Åž?~Q®nQ®cý·fÍQ.pmõBá¶oß^Oûî»ï´ÅiÊݵk—VœÊM¬gNc†¸r½kë…|ðÁž<³¬¡8ƒ ”:òš5k–Vâ°üñ§\ÖI’bFºr Ú¸qãFyôÑG“ıø«³=÷Ÿ•râ_c¶Â&ðÓO? &[™?LP‚hޱ]¿~½ëü1 Š3—{ì1m;epÕUWi×0ÜØ°‚¡œ;tè *êKn]X¼8‡|Í íçž{NFŽ©]۬11 y@ÉcBØäÉ“EYkËÊR3‹QèNu1aˆ£Æ£Eñ &`µmÛV[ç¦ÜL™2é‰dˆ¥T°„1 .ëqãÆélP'ñWg§¸ K`ê¡ @‡Ò“‘ÔãÏÕÖ>ÑëwÞñä7{ölK¹`õ±Zî£'}©1XKÍ|Ö¬0‰ ‚‰^¯¿þºÞ7ÿ”B¶”R³Ô´¥ž¥Æ£=0ÑK¹›­jÕªYj&´õòË/[jV·¥ÆŒ-ÕY°”U®ËÀ9¥¼-åæÖÙbÂÔLf+_¾|–RØžs¦Ü@Û±cÇZª#`)e¯'´õèÑCOÞB5þm)w½¥Æœ-LÎR3Ã-å¶ÖÖ0 Õºuëf™‰^jF¸§¨@uöDâNÂH‡&pŸƒM#H *ܪÁÖ2&=¹X¹°*a¹¬%†XÍlÖËŸìñ±, k€•²ÓÁØÏš5«¨Ñz 2&€aÙ–MÙ–-ÎÁ‚…5ëÆJ¶§W=>Ž1p”eŒMc]1&¡x°4 ÇXÃŒóö1w{Z´Õ_íñ¸Ÿ¸¨”÷Ú²e$lXoŒ±XûŒaßL¡¸1«˜B$|SN>Cæ@ KK)dXjo¶Ÿ #”&@K9¥‰³<ˆ3˜$÷´¿‘.LÚ*_¾|œµŠÕ%Ø$@K96¯ kE1C–°}M¯©Æa¡°© nI ù¨”“Ï9@BP¯«ô,5²7ŠZ½æÒÄ} d RN&@&'D'€J´hÑ"‰µŒ™Åx-&…H r¨”#Ç’9‘@ÂèÕ«—WÛ`%CQc™…H r¨”#Ç’9‘@ÂP/¼Hb)Óu°—› KETÊ©ŸE“@¼À÷¯¹æÁ’ °”¯¿þúx©>ëIqC€J9n.+J©K_sÂ82245…H ²¨”#Ë“¹‘@ÂèÔ©“dÉ’E+fûç¶Ál ¤*åT€Î"I  à»ÈpYã]ÏPÐ Èà½"Ï”9Æ11cÆÈÊ•+½§$%pêÔ)ý9EõÕ§¤'¢ lÙ²E,X@$Œa¥b"HPgÏž•‡zHªV­š -d³¢M`È!Ñ.‚ù'0º¯øâ²i$@$@ñE€J9¾®kK$@$À¨”øâ²i$@$@ñE€J9¾®kK$@$À¨”øâ²i$@$@ñE€J9¾®kK$@$À¨”øâ²i$@$@ñE€J9¾®kK$@$À¨”øâ²i$@$@ñE€J9¾®kK$@$À¨”øâ²i$@$@ñE€J9¾®kK$@$À¨”øâ²i$@$@ñE€J9¾®kK$@$À¨”øâ²i$@$@ñE€J9¾®kK$@$À¨”øâ²i$@$@ñE€J9¾®kƒŽ=*O<ñ„®ÙúõëeذaòÉ'Ÿ$©é‰'ô¹qãÆ%9ç&`Ö¬YòùçŸë¨‹/–·ÞzKïŸ={VÞyçyüñÇåܹsº ”Ž _~ùE-Z$Ÿ}öYÀ,ž~úi]Ú‹¿ñãÇËòå˦áI À¨”óáYJ`øðáR«V-oÇŽ2iÒ$A˜¯Ì™3GŸ›9s¦ï)WÇ?üðƒ¬ZµJÇýí·ßd×®]zÿƒ>‘#GJ:uäÒ¥K²nÝ:ù믿\åéiúôéòûï¿K“&MäÙgŸ•cÇŽùFñO:U¶oß.3f”téÒɲeˤS§N2tèPùûï¿=ñây× ¤*å”"Ír’”¬Ê믿ÞÓ¾%J,Õµk×z°ë¹FbY–WøùóçeïÞ½~ÙŸþé=zôЊû H·nÝ$GŽ2þ|)X° Nyõñ§(/^¼˜D‰gË–Mºté"/¼ð‚'§”‰ÁsÏ='~ø¡Ì›7O^ýu™={¶Wô@mD½öïßï?”ƒÓ§O{E÷ב@þøã¯¸öƒ3gÎâØñN!”"@¥œR¤YNB€eyõÕWK† <íKŸ>½¶í.l(Š¥K—êpX•Xµ=ö˜@‰·lÙRÊ—//_|ñ…'Ÿ/¿üR*T¨ Å‹—6mÚhåkN¾òÊ+Ò³gOÁsçÎÕõ€‚B~ÔQáNoذ¡TªTIJ—.-ÿýï=”«¶X±bR¦L¹ÿþû½7Ú·8”¶[©W¯žö¼ùæ›:I°6Â{P¶lYÝ©¨R¥Š¼üòË:ݘ1cäÖ[oõ{êÔ)¹ì²Ë<íºòÊ+õÊ+Y²¤´k×N"¿¦M›j‹ íí·ß®9â|×®]åÈ‘#:o %ôêÕK³,W®œ-ZTFŒ¡Ï¡£v¼ÿþûº¤ù¢L€J9Ê€™}bؼy³VöVBÁ‚„R6V1F£F¼,Ø·ß~[ÿøã²{÷n™0a‚ôë×OïÃ:†"8p >¾ãŽ;´â5ù]¸pA0–à?HAS°,E E–*Æsáòô(%(<(Xœßÿ½L™2E>ýôSOTXtC† ñc®XLâ‚R€b±Kýúõí‡A÷aÃZöͧZµj:-ÆÂá¢5R±bE"¶ êê˜*ê^·n]M 6bœnu»tîÜÙ~èÙ‡2õÓ™A89\ÓF0D+cõ°®áš‡Ò5—½QÊöñwäƒxðDPH 5P)§u–™2gάàpÃÂBó¸°áv†²kÖ¬™¶Fíq0FЉbvÙ´i“ž4¶oß¾$êÆ¥yóæöè÷¡lòåË'[·nÕ³£c©f²S®\¹¼Ê€…ëÛ.›öUœöó¾û˜(…¥[ ЧµŒ³Û“Ä`ñ¥jÎÁ=í+flÞ7Ü~ dšrÙcœ…»mÛ6ݱ›|B)Aàß®cJ”Æ2H `)”1–A9 1¬´Q£FyÍÎ6q1‘ê£>òŒ¿.X°@ëB)aŒŠ–5òøöÛoõØ©IëfÛºuk= ³¢‘=: p¥C:tè -y¸§¡¨ í×/”r ·9¬]ÄÇk”Û·o¯;F)j#Ú‰²áf‡`Ü“Ö`ÃêE'la%Ož<Ù^5×ûpÙÃS/&ÁaHë«1VïFÃröÝíºpF$0P)‡IHÀÀ¤&JnPLÀÂä)¬ßõ3ócš˜!IOPŒ°páªÆYŒ›ÂRŸ0&m…"k8q¢v‘Ãe,&‡AP> ÊÆ˜,&Caæ²X§ŸÅ¸¯?yôÑGcÈH÷Ýwë2Ð Èž=»N¨XÛ=zôh=ûJø©§žÒîttv0Î Y¨[Íš5õ€%êTÏW_}Uà@=+W®¬­s3;Ü)¾= ãÜpó÷îÝÛÌ}ˆtªí½h2jE1cˆ}P„° ¡dÜÜÏ;ÆCÊ$Á¸',N(Œ,Y²xey`ŒÙ>yÊ+‚‹¸«a‘Bcy•]ðóG§JÔWùb¼ã®°ô“+ÚëõðáÃzÉ–o9(T¨`¨ 9‚Ùè¸V˜ÑŽI( ŒOc ¸Á<Xæ‡@xO‘pJbH@°bá²Å„®o¼1¬–*UJðç$5ã¢NçÝ„A™˜‰W¾ñ¡œœÆŒ¡(áZÇ íHH 6âE%XCí$¾§8nÂàµ@Ç&Éš5k8ɘ†Â"@÷uXؘˆþ%€1JXʉ$XÊ×sr;‰Ä„m!” @K9%(³Œ„&€õÄxSV" ÖYSH€Rž-å”gÎI€H€HÀ‘•²#’ @Ê RNyæ,‘H€H€ P);ba ¤<*å”gÎI€H€HÀ‘•²#’ @Ê RNyæ,‘H€H€ P);ba ¤<*å”gÎI€H€HÀ‘•²#’ @Ê RNyæ,‘H€H€ P);ba ¤<*å”gÎI€H€HÀ‘•²#’ @Êà§Sž9KŒa.\óçÏËb¸–¬Z,¸xñb,Wu‹qTÊ1~X½”%ЬY3™5k–dÈ!e Ž“ÒvíÚ%‡p¢8(V¬˜ó †’€ é,%.â1 È3Ï<#3fÌ­[·’ @pL9 P™% „C€J9jLC$@$@Q @¥¨Ì’H€H€Â!@¥5¦!  ( RŽTfI$@$@á R‡Ó @P)G*³$  pP)‡CiH€H€H ¨”£•Y’ @8¨”áÆ4$@$@$|÷u 2KH+/^,Ÿ}ö™ßæöë×OjÔ¨á÷|<œÀ»Ð¿ÿþ{OUsåÊ%uêÔ‘k®¹F²eËæ ÇÎÑ£GeòäɲjÕ*9~ü¸Ô®][:wî,mÛ¶õÄ{ë­·dãÆ2pà@©T©’';K–,‘O?ýT®½öZi×®×9¼wüµ×^“1cÆx…‡{ð÷ßËÃ?¬ë€ëk–£G–'Ÿ|R†.Ï?ÿ|¬U1*õ¡¥¬Ì”Ò¼:ÿÒ¥Kúoÿþý2~üx9sæŒ',^­¿hÑ"ùüóÏ%cÆŒúoÏž=rß}÷ÉW\áõ5±;wJãÆåÃ?”¦M›JïÞ½å?þ«¯¾Z+sGÌ™3Gs‚rö(\0\¹r¥ï)ý!wÞy'Ix¸ .ÔŠîÁ”?ÿü3Ül"’îÑG•!C†xåõÈ#èÎOΜ9ugöìÙ^çö¤  €O?ý´U¥JǨʚÄÇm¬Ã‡;žW~ F”2·”5d]o•…0o9§OŸ¶Nœ8á˜ÿ¹sç,Õ‰púè#6qâDÉ—/Ÿ+_¾¼ÀÚƒ8•£”–têÔI*V¬( Ðî`¸”!§N¥”$Ož<ºíÛ·Õ™ÐçÜüSŠLn¼ñFõ†t«W¯–åË—kËíµ â5iÒDÞ|óMOp«V­D)V/‹nkÄ+T¨'žï¾Õ W3؃êhÏ„êxHÞ¼yeÞ¼yž$ ,üùókkÝøÿ;(åõïß_ºví*ï¾û®Wœ+X° T«VM³~á…ôy”ï½÷ê²”’”† êvãd ¦p“ÃsвeK)Uª”æþÆoè<ñå±I“&ÉÛo¿-]ºtÑaØïر£çªÕ«W¸ÛçÏŸ¯Ï'ò?*åD¾ºl ¤2eÈÈ… dÊ”)òþûï ”ÑŽ;´‹.Ú#GŽÈ°aÃäÄíÑ£‡VÀxC0Æ w8ÐP8Pæü±;v¬( V~ûí7Ö·<ô³gÏ®6”6òÄÃrÿý÷˯¿þª?AyìØ1)Z´¨ÜrË-úœÛ­[·Öå¢=Ê’ÓŒ!;Iƒ t»Í¹ôéÓK·nÝ4·7¸i» ·o1Κ.]:ÁP²¼eݺuzŒãÜèÐ`üÛÈÌ™3õ¸wŽ9Lg‹²Ê”)#õë××Ì¿úê+O§dß¾}š:@PöèL :T~þùgÓO>ùD0¾kרQ#O'*Se=ËôéÓõõƒòÆþ=÷Ü#›7oÖcÆwß}·ÜvÛmžù sGgÊ.èÀÍ;×”ûTÊ yYÙ(ˆ-£FX£Y³fÕ ,àÝ»w ,Z(6XaÝ»wפrÕê(·ªVH‡ T° 1n{öìY¬ece#½(¾eË–é9Ä´iÓ´b†Uª\©Z±`ì¤[õÉ!ƒN« ÓIP¦¯²½é¦›´Egä÷ß—o¾ùF+jŒ¿^vÙeÒ¬Y3AÆ:îÙ³§¶~Á°âæ$ð\ôêÕKŸÂ„2x ÀeŽkƒ× žŠL™2éNMŸ>}ôy\LÀÂøº¦-Z´ÐãëÈÖ9&ËùS²›6m’ * ªG ”·lÙâ9NÔŒ‰Ú0¶‹H v¨qROeðâ‰'´ÅW¦}2ÜÂjÌU+¸ra•™7,5XqÆem2D~FìåÀ +Z›j¥ËnRLj‚‚Äìg(n#p¯£ƒåF~úé'=ñKk«e¡.PV¾·+”¨]à58þ¼î8@Ù`âX ×5Ò+VLÔX´'›Zµjy¬ṁ svabšï nœG½ájG™/¾ø"‚´ë.l¸¦1‘­jÕª:ÜüCgâ{(þmÛ¶dŠ´¾J¶D‰úºàœ]ÐáÂuF[í‚{Åiœ=N"ìÿ{G&BkØ ˜'€ÙÅj"ž¹ 7%,?»`ìÊ–m‘"Eô¸%ÎCaÁºÃÛüAAûs;ÃÅŠå4põbÌãÓj¢šGñÁ24ù î_|¡Ç;íu ´ÙÓPÈP°ޱ5îq{:x ÌŒb3ç`aÃ3W2þ`õŒ_ò7²~ýzOaÉ"XµpccÌŠÙWà%Àìp¸¾W¬X¡ÿ0† FP®ÇLr»À• ޾ç8 &LpÅîn» c€qi_Éœ9³ö>àÚØC°–]¨”ý ³}$&¸QñpÇCÜüA¹`üÒ›í¡C‡\—òË/¿,Z¸”áf7nœNkܶXÓ KcÍp•Áz_(íÛ·ë Ld®¿ ZÏ=÷œŒ9R—µÒuëÖÕcÀp3Ã*…;c¦°œÑ1èÛ·o@÷3þ`abüJùÕW_ÕuÁ¤(,-ÂØ+”=,`”Ü 7Ü pÝÂà+P¢3fÌÐë }•¶o\ÛymذAw^Œ›ço½õVí¶†ëÚ¸§nXÄ¿…B4›ÇPÀ{ï½§'[¡ÓdÖŸƒ9&z¡ƒ·3î (mt{ì1=Öì†),xð€ Í‡·‚Æš!èHÀµmâê@õeÂ3ð¢~ HB@¹cõR5Nj)«ÎñO¹IueýZNK¢”u¥ÏcŒeYÊui)·µ¥&XYÊ Ó˃ÔÄ'ÅRÊM—§&cy°ŒF)i õQ®LK)KêóNå¬]»ÖR–^F¤Æ-5SØR‹t|¥Ø-„a9šÅl)…í9ç)ðÿw°$J)ÏâcY“rI{EU K¹ƒ-5¹L×]¹Á-¥l,¥ì½–‚!­šØ¦Ó"rÓZjÜÖ“—RT~—Da™–gaiØ+%l© nž´ØÁR+ÕYñ 3j(À²+ûõ0çÔ$:½ uzùå—uÝQ–À)Ŭ£aù˜êYJqê:` ˜²`õ¹@LÕ¸³¥Ü÷–«ÖÊëa©Ic¦hͼTF‡áúƒ›]”KÝR1{PBî§C«¾çÁ’ „EK^àÖ ö˜À„-Ìæu+°„1¶‰¶°Œ0sã¹ÁÆT‘?fMÕª”…¶Ú•‰—wÀâÂ"ŒaÚuÀ9XŸ°ÜýMÒ²§q³kmƒ Ýw‰”›<‚ÅÅëÒ‰–ÁzÆŒæäêqr§ëŠp” Ù.þ˜âÅ ¸x#<¸îpßÛãñ` øa<ópÀrÇ[Îlj,Tʉ|uÙ6H&Œ⊇¥“@‘aYMZ˜€ãÔþX ƒÃë= ¤gµãMX±"F)›µÉnê…NEóæÍõœ¬§ÆD=Œ“'ºpL9ѯ0ÛGÉ lÝ,fùb|’’ú0Á ¯áÄ:îXRÈ kÛiRW j˜€‰l˜wŒ§… ´”ÝþøãâïNi¢†à{øÀC,>–‘7o^ýäX¨ë@É%@K9¹™ž¢LoÍÂwl)I /^\Ö¬Y“ôCH N pL9N/«M$@$x¨”ïš²E$@$@qJ€J9N/«M$@$x¨”ïš²E$@$@qJ€J9N/«M$@$x¨”ïš²E$@$@qJ€J9N/«M$@$x¨”ïš²E$@$@qJ€J9N/«M$@$x¨”ïš²E$@$@qJ€J9N/«M$@$x¨”ïš²E$@$@qJ€J9N/«M$@$x¨”ïš²E$@$@qJ€J9N/«M$@$x¨”ïš²E$@$@qJ€J9N/«M¡X¿~½ 6L.\¸àIzôèQöý÷ß{°óÚk¯ÉôéÓ½Âp`âŸ?>É9 $Ÿ•rò2ˆ 9sæ”I“&ÉÚµk=õ]´h‘{ë­·+¿ÿþ»'Ìì@¯[·NþþûoÔ AYºt©9Í- @2 P)' ““@¼¨P¡‚/^\–/_î©òÂ… ¥I“&å e Ù¾}»?~\Zµj¥Í¿'NH±bÅdþüù’-[6ŒxvËÈçØ±c&™ãöäÉ“Žá $´N€J9­ßlš"EkWÊ_ýµ<üðÃrñâE{‚óùóç—ZµjÉäÉ“¥wïÞÒ¿©Y³¦ìÙ³GJ”(!gΜ‘¦M›ÊáÃ‡åæ›o–÷Þ{O§}ýõ×¥dÉ’RµjU~É’%:ÿ®¹æyá…¤Q£FòÈ#x¹C$ð/*åYpž@‹-xÿ®íˆÝe<Î;g²’5jxö¹C$”•rR& !„&+V2ÜÔ¯¼òŠn+Ɖ˗//cÆŒÑcÆØU ,(Í›7—±cÇz’îØ±ƒV±‡wH 8àÝßày0 @€Rþì³Ï¤T©RÚ½lªÞ¶m[™9s¦\yå•&(è6S¦Lrúôi¯C‡züŠ‚ݘ väÈ}Ì$@Á ÐRΈ1H ¡\qÅzÙÆ|í¥I—.×é¿þúKÒ§O/2dð ÇÁwÜ¡ëcNtëÖMÞzë-¹ë®»Lßíþýû¥qãÆrÓM7é88~úé§µ‡Ã$—ãÇKþüùM×Ö´É­—À+1œ àÓ pC@=´­*UªxE}衇¬Ê•+[ÊRô DzœñiXkΜ9–ú”•9sfK=È=ñ®½öZKY|ò͘1£þëܹ³><üq«téÒ–²uÊÔçþûßÿZ×_½'õiK·R,–r›[J±YJQXS§NõÄÁŽS9¨›RøVáÂ…-Õq°Tgºxñ¢W:spûí·ëö+…o‚ôöûï¿·”Õš¤ìèz)Ei)ÅfÍ;×R®kKY©:]Æ -´EY§:žrA[ß}÷>‡:(Ïn•»ÚªQ£†æ¨µæª¼:®ùשS'K)Y}ˆ·ê@i¦¸-Z´ÐJé[ê˜ÎA&L˜`åÉ“ÇÊž=»¥<Ö×_­ÃÚ¤Oð_DHDra&$@i‚€“RîСƒ¥,b¿í/Z´¨5nÜ8KY’Z‘Ø•òUW]e©ñYvðàÁ–²ü<ù+VL+«C‡iEŽsP¸Êuk >Ü‚2râÄ 7:"EŠXóæÍ3§½¶ör Ä¡ð¿øâ  §lÙ²º£à•èÿV¬XaåÈ‘ÃB›”wÀRV¯îxØãÚËFþè”4kÖL×çÏ?ÿ´êÔ©£Ó! öË”)£-”ºrƒ[¦S2qâDKÇ[Û·o·ù¤lذA»™$ éÜÐÈcÂÕÐcâ³gÏvÌGY¶¢·Œ9Ràøá‡E)Uíöç.GF£F’öíÛ;N»çž{¤jÕªÚE|Ë-·è‰WHóÎ;ïÈ}÷Ý'+VÕ Œ…ûŠzüðÒ.oeÕêÓo¾ù¦o´á¦WžíÞÆê^¾|yQ^O^Úä‰Ä pL9ddL@$`'€ÉN»wï¶yö×®]«ÇXñ@w’@Š ñíé ˜0¶ê4I*X>Ne# ãá¾³ ¡d•eè˜äðáÃZy*7¶àO¹˜µ¢êÞ½»žè†I_N‚YÚþãØF0a ƸÁÖòP®ds¨·ýû÷÷SÞ±c‡VðjHÁ+ž9pËéçŸLÚ[¸p¡Iª·f Ú䕈! ¥.F&ð%кuk™?¾(«ï)ŽÉK­Ôä(3ÉÌRFä]»viK/IÂÿÀ/#˜ ËŠ yÙó G`ácI]Ö¯_/¥J•²yö1¡ ˈŒ¨qpéÚµ«4mÚ4l Þp1yš-&¶a¦¶å:ö;ÎÄ1 \M¾vNÁxÛóÁ=(fó Kž]TÊÑåËÜI á àá ‹.`,‚;¬ÍgŸ}VÏè…kUÕ ”ØÌ™35“Y³f龄ÙÙ§N2‡zûÆofÃU/Þ0‚}¼´âÆoô(n(`ŒóÂB†õúþûïëèX†„%XX %„5¶pm;ù¶ÛnÓ,˲‹o9¨;ÆOÕ,o’Ã:k¬Av’—^zI—7ê£&n ^ÚñnXÌ{Ùð„+ÈÊ_͸Ök‘±ü cëöåG`eVƒ dÉ’%šE0Þ&ÓvàÀº£¡fÚë—¿˜N‘š ¦;Nié0O,2Y1 D"€1Ž›qH¼ˆÊi°^ Â>l炉a°~&‡aÌîV(ôâŋ˴iÓ¤I“& Í>¾jòƒkµÔÒäÙªÙZ™Á:÷{98‡¸Ehs0+´_ T¶o\Ç¿ýö›nX  ð" ƒrúôiÇ5Ëþò ÄÛ_þë¯¿Ššm-PÎj6¶ æ6Ѝ”£—Y“@¼€Õ÷ÙgŸé MþÚ…ˆÉW‘~h¥Ü®];E't8:$j­°¼þúëúÅ)xû,yãjOèÆ§áÆýëïIÃØt gpýb†±?§Ö G\!£¼ºuëŠYæã¯üD‡ ]­ãÖîr¼[·Œû>‘ÛÖÛFK9­ßl?  € Fpçb|ÙŸ`M¯Oõ‡á$@îÐRvlj±H MÀÄ"L¾ÂŒb'Áx'&]QH€"C€J92™ $,¸°11ËW ¨1ûŠ›B$TÊ‘áÈ\H a à3ŒN_ ‚¢æË$ö²³a©D€J9•À³Xˆød –;ùº°1Ö …M!ˆ*åȱdN$°`Û]ØPÐpk;}ã7a!°a$8û: ³Hê3‚úE¦-Ë—/Oò1sŽ[ ðÐRS‘@š#€×Vv‰%¨ÓÜÀ§*å” Ì2H àÐpaã%PÐ È û:òL™# $,ªU«êOâýÖøŒ!…H ²’¾©=²ùÇLnøÞ*¾4cÿ’Œ¿Ê!¾þ‚#¸¼°ßõu½&^Љ2Æ%¬,¼ˆ>œ÷ ã#9sæ –½þV+ÚêääVæû­A R`q³f¡ò={ö¬Î×M;ð¦*|XÞÍ}v¹e‰¸x=%þì_õAx0|”!Ôtxû®ÓÇ|Ë ¥&-îñnݺéo$£n¾aνJýM° õwdÒ†rŸ M(m •o(y›ú‡ò» '”J;pÏâfÏžÝTÑÕ6”2pâ7ëæy†¸¸ÆnŸã¦²x.áž µ¡þÞÑtr“|0EUÒüôÓO–RØ *[·nµ”² Ï7B(õRJÆÚ³goAC)#”{Ï$<›B<;ð UBý½û{öpLÙt¸%  T&@¥œÊ€Å“ €!@¥lHpK$@$@©L Í+åéӧ˃>ô2¼÷Þ{²lÙ2Á‡ÆÕøfÐø±“î»ï¾˜«"&Jìß¿ßU½¢y=}ôQý1ùAƒ¹ªK,Gz÷ÝweñâÅ!WqÞ¼yòñÇM«÷RЊû‰­k‰£<ð€lÚ´I^}õU?¥'?XÍ)ø™Íä—ýRоMI]¡êöÑG¹NòÄOžU¡HšVÊ'Nœ_|Q†”™šT!j"ŠVÌj@Ðø±³ýêÔ©sU¾Q’7NÔLZ}ß}÷ÝIÎÛÌu0[û9§},q5j”öt[þdò,V¬˜SVIžþyiÚ´©|øá‡2~üø$ç}.\(|ð^rwJ7jÔÈ7J’ãpï'5s=èý` CGç•W^ÑKH°TÍÍrµPî%<˜¦L™¢—›Üyç®~è¿öÚkòõ×_ë_àÃyòä1Uö»…•Ÿ7o^ùßÿþ'G•{ï½WêÖ­ë7¾9êµ7é‚m±<¯P¡Bbòç—.]ª­¬ *Èí·ß.  ˜ ¯=ŹYžêýˆçÙUW]¥¿Íì¾ ‡ÕܹsõRÀ6mÚd„“£G–uëÖ…´„éîºë.Áï)ØóqäË—OP§õë× ®£IÓ–2~¬Ántr¯^½º 8ÐÕú5Üè}ûöÕ|$7$Öã¸ÈQ‚åwÿý÷ ~\C† Ñ<åË——¶mÛK¢¯®”€›ç:xÀÓO?­­÷·Þz+hˆÊýï:ô?þ¸¨åIÚ…ï¦PX!?µŒPàùt#Ï>û¬@‰»é€Øó›3g޼ôÒKö Wû茡~n%ÍZÊPŸþ¹¶œÜÀªQ£†ŽŠ+J¦cÇŽ:ÝM7ݤ{ín~x!~ŒÁ‹õaAàf‡VH§N\¥ –·9‹®K—.ºwˆ¶`F­¯Ó Çw k–z•è)cì1˜T¬XQ{ àr &¡^tÞ~ûí`Ùêóæh¶n >\? ƒÅ…k÷âO­GÖ7Ñpï§`uÂùU«VI™2e´E‰c¸îÝt`×­ £ƒñ8tDàÂMòÒ‡Œ`ñâ!ŠO“&M¤V­Z¢Ö$ëΛCt¯ Xã-[¶”æÍ›ko’×I?æš›­Ÿha›<Ñé &`« cûøM¯^½:X݉GG¾lÙ²® ‡h¯¼y+ Å­îö~Ç5Þ°aƒÀ+‰N¼n$VÈ®èX ÉÁíS«V­‚V3ÍZÊóçÏ×oSqëRJÒ!‚]£WKÍàk‘0¾ƒ/,Z(´ÚµkûÄHÞ!\ÜPÄêÍD:#ŒŸ¹(å¶dXÉ5kÖ”gžyF»¢ñÆÇíIñâÅ5[õVí?ÿùvAJcÎÁÊŽ† ß@¯…ŒF™Nyb|/Nð ¸m޼¢y?]}õÕÚ勱wܳŒ¤ÀÍ! XK°þš5k& &¸ŸñÛ Cƒ‰9n<)ˆÊk_?Álg·„Pòǘ'ܾøÝÁJÆïe¹7¿!<“àYÃýˆ¡—P¬d7u0q qOM˜0A{ÏÞyçs*¢[ E†â"ŽháA2à <蹑4ë¾XÉÖÀe ÷nLæq3Vj]ð£ÅøÆb1Qc%‘¸1øÅ_hw4ƈƒMÔ@ù˜L>ÜÆxO-Žƒ ”9~Àpõ`RV$ct°1†êXR$ë‰xK†÷O¸³ðÀ¸^0‰æý„q/ ›À=ŒÎªÛInÁêlÎ㞥_¿~}ý»ƒ‚Aç$˜`r æXàa¾fÍš¨.' V§óø=`$:ù‘\(KtHð³ÃͬQÌYÀðN ‰¥ð8Àå‹k€Ž=âbÖ6:ÒpGJÐùÂs`òäÉZiºY~NÙxâ9ƒI¯±&èL¢îZT¯8MÞ3ŠwZÛeË–-–'µé}ÄKU/ÔR–…÷ÁâÝÍN©w_«‡»®¯¿÷Oû¾[Vu,å®JR¥@ï¾V7–ß÷ û{÷5ꥬˆ$å áNï¾Æ»mÁÌ.à—Hï¾ÆuR³ßuÑ^5AÅÞ\ý>tßw_»¹ŸByw´ï=a*€÷nûÖÇœC]}ß}íï^ò—?®­i»É×lÕï©ö½/LºÔ|÷µ²`-Õa0UñlýµßÁgÇ_|Ü÷ªCéûŸCÕ w|÷5Þçßž]ü½û÷™êë¨¸î¸ÆvñW/{³ë£†èÌ¡×V){¿ïÇ¥ §{Ы ÛA¬¼ûZu~,µzÂV³v¡“ {ûÉ4ë¾F¯ã[°ÎÐËŠ– —ÌݛܲᦃhÆ–ƒå‡ 0nf ÛóÁR(ãŸH‹z…šã`–È‚ëd,Q´×Œ}ºis´ï'x\B©O¨÷êoÚ&¬ÑX¼/à%-1˨BÉ?”/¶Á{a<_¸îÑǘµÛçS(mõ¸Ï=÷œfêfrŸiKšv_Ü*ª‡gxDl‹™ÊnÖÌE¬À2‚«”ß X DÕû)­ßKXŸN!0‡"ÔOG¦y¥ ˜¡BówìáèáÆªP!Çê•ñ_¯X½Ÿx/ù¿fT“FpPBi‡É׳ãÝ܃áäJýM°ÅýòÔÄ{pÐ}Ü'¸§pÜH(m %.Ê5>Ҙߛq`sÝÜþ†?$”z!.˜º¹?þÉýŸÿ¡”Ê=¨&…iF¡ÖÏ¥pÚêï÷;æ4ùJ:Ìúò LÄc€6?úDlÛD$@$?`4à]è¾’f”²oÃyL$@$@±F€cʱvEX  4K€J9Í^z6œH€H ÖP)ÇÚa}H€H€Ò,*å4{éÙp  X#ð[€†¬º&IEND®B`‚asymptote-3.05/LspCpp/third_party/rapidjson/doc/encoding.md0000644000000000000000000001506415031566105022574 0ustar rootroot# Encoding According to [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf), > (in Introduction) JSON text is a sequence of Unicode code points. The earlier [RFC4627](http://www.ietf.org/rfc/rfc4627.txt) stated that, > (in §3) JSON text SHALL be encoded in Unicode. The default encoding is UTF-8. > (in §6) JSON may be represented using UTF-8, UTF-16, or UTF-32. When JSON is written in UTF-8, JSON is 8bit compatible. When JSON is written in UTF-16 or UTF-32, the binary content-transfer-encoding must be used. RapidJSON supports various encodings. It can also validate the encodings of JSON, and transcoding JSON among encodings. All these features are implemented internally, without the need for external libraries (e.g. [ICU](http://site.icu-project.org/)). [TOC] # Unicode {#Unicode} From [Unicode's official website](http://www.unicode.org/standard/WhatIsUnicode.html): > Unicode provides a unique number for every character, > no matter what the platform, > no matter what the program, > no matter what the language. Those unique numbers are called code points, which is in the range `0x0` to `0x10FFFF`. ## Unicode Transformation Format {#UTF} There are various encodings for storing Unicode code points. These are called Unicode Transformation Format (UTF). RapidJSON supports the most commonly used UTFs, including * UTF-8: 8-bit variable-width encoding. It maps a code point to 1–4 bytes. * UTF-16: 16-bit variable-width encoding. It maps a code point to 1–2 16-bit code units (i.e., 2–4 bytes). * UTF-32: 32-bit fixed-width encoding. It directly maps a code point to a single 32-bit code unit (i.e. 4 bytes). For UTF-16 and UTF-32, the byte order (endianness) does matter. Within computer memory, they are often stored in the computer's endianness. However, when it is stored in file or transferred over network, we need to state the byte order of the byte sequence, either little-endian (LE) or big-endian (BE). RapidJSON provide these encodings via the structs in `rapidjson/encodings.h`: ~~~~~~~~~~cpp namespace rapidjson { template struct UTF8; template struct UTF16; template struct UTF16LE; template struct UTF16BE; template struct UTF32; template struct UTF32LE; template struct UTF32BE; } // namespace rapidjson ~~~~~~~~~~ For processing text in memory, we normally use `UTF8`, `UTF16` or `UTF32`. For processing text via I/O, we may use `UTF8`, `UTF16LE`, `UTF16BE`, `UTF32LE` or `UTF32BE`. When using the DOM-style API, the `Encoding` template parameter in `GenericValue` and `GenericDocument` indicates the encoding to be used to represent JSON string in memory. So normally we will use `UTF8`, `UTF16` or `UTF32` for this template parameter. The choice depends on operating systems and other libraries that the application is using. For example, Windows API represents Unicode characters in UTF-16, while most Linux distributions and applications prefer UTF-8. Example of UTF-16 DOM declaration: ~~~~~~~~~~cpp typedef GenericDocument > WDocument; typedef GenericValue > WValue; ~~~~~~~~~~ For a detail example, please check the example in [DOM's Encoding](doc/stream.md) section. ## Character Type {#CharacterType} As shown in the declaration, each encoding has a `CharType` template parameter. Actually, it may be a little bit confusing, but each `CharType` stores a code unit, not a character (code point). As mentioned in previous section, a code point may be encoded to 1–4 code units for UTF-8. For `UTF16(LE|BE)`, `UTF32(LE|BE)`, the `CharType` must be integer type of at least 2 and 4 bytes respectively. Note that C++11 introduces `char16_t` and `char32_t`, which can be used for `UTF16` and `UTF32` respectively. ## AutoUTF {#AutoUTF} Previous encodings are statically bound in compile-time. In other words, user must know exactly which encodings will be used in the memory or streams. However, sometimes we may need to read/write files of different encodings. The encoding needed to be decided in runtime. `AutoUTF` is an encoding designed for this purpose. It chooses which encoding to be used according to the input or output stream. Currently, it should be used with `EncodedInputStream` and `EncodedOutputStream`. ## ASCII {#ASCII} Although the JSON standards did not mention about [ASCII](http://en.wikipedia.org/wiki/ASCII), sometimes we would like to write 7-bit ASCII JSON for applications that cannot handle UTF-8. Since any JSON can represent unicode characters in escaped sequence `\uXXXX`, JSON can always be encoded in ASCII. Here is an example for writing a UTF-8 DOM into ASCII: ~~~~~~~~~~cpp using namespace rapidjson; Document d; // UTF8<> // ... StringBuffer buffer; Writer > writer(buffer); d.Accept(writer); std::cout << buffer.GetString(); ~~~~~~~~~~ ASCII can be used in input stream. If the input stream contains bytes with values above 127, it will cause `kParseErrorStringInvalidEncoding` error. ASCII *cannot* be used in memory (encoding of `Document` or target encoding of `Reader`), as it cannot represent Unicode code points. # Validation & Transcoding {#ValidationTranscoding} When RapidJSON parses a JSON, it can validate the input JSON, whether it is a valid sequence of a specified encoding. This option can be turned on by adding `kParseValidateEncodingFlag` in `parseFlags` template parameter. If the input encoding and output encoding is different, `Reader` and `Writer` will automatically transcode (convert) the text. In this case, `kParseValidateEncodingFlag` is not necessary, as it must decode the input sequence. And if the sequence was unable to be decoded, it must be invalid. ## Transcoder {#Transcoder} Although the encoding functions in RapidJSON are designed for JSON parsing/generation, user may abuse them for transcoding of non-JSON strings. Here is an example for transcoding a string from UTF-8 to UTF-16: ~~~~~~~~~~cpp #include "rapidjson/encodings.h" using namespace rapidjson; const char* s = "..."; // UTF-8 string StringStream source(s); GenericStringBuffer > target; bool hasError = false; while (source.Peek() != '\0') if (!Transcoder, UTF16<> >::Transcode(source, target)) { hasError = true; break; } if (!hasError) { const wchar_t* t = target.GetString(); // ... } ~~~~~~~~~~ You may also use `AutoUTF` and the associated streams for setting source/target encoding in runtime. asymptote-3.05/LspCpp/third_party/rapidjson/doc/pointer.md0000644000000000000000000002126315031566105022464 0ustar rootroot# Pointer (This feature was released in v1.1.0) JSON Pointer is a standardized ([RFC6901]) way to select a value inside a JSON Document (DOM). This can be analogous to XPath for XML document. However, JSON Pointer is much simpler, and a single JSON Pointer only pointed to a single value. Using RapidJSON's implementation of JSON Pointer can simplify some manipulations of the DOM. [TOC] # JSON Pointer {#JsonPointer} A JSON Pointer is a list of zero-to-many tokens, each prefixed by `/`. Each token can be a string or a number. For example, given a JSON: ~~~javascript { "foo" : ["bar", "baz"], "pi" : 3.1416 } ~~~ The following JSON Pointers resolve this JSON as: 1. `"/foo"` → `[ "bar", "baz" ]` 2. `"/foo/0"` → `"bar"` 3. `"/foo/1"` → `"baz"` 4. `"/pi"` → `3.1416` Note that, an empty JSON Pointer `""` (zero token) resolves to the whole JSON. # Basic Usage {#BasicUsage} The following example code is self-explanatory. ~~~cpp #include "rapidjson/pointer.h" // ... Document d; // Create DOM by Set() Pointer("/project").Set(d, "RapidJSON"); Pointer("/stars").Set(d, 10); // { "project" : "RapidJSON", "stars" : 10 } // Access DOM by Get(). It return nullptr if the value does not exist. if (Value* stars = Pointer("/stars").Get(d)) stars->SetInt(stars->GetInt() + 1); // { "project" : "RapidJSON", "stars" : 11 } // Set() and Create() automatically generate parents if not exist. Pointer("/a/b/0").Create(d); // { "project" : "RapidJSON", "stars" : 11, "a" : { "b" : [ null ] } } // GetWithDefault() returns reference. And it deep clones the default value. Value& hello = Pointer("/hello").GetWithDefault(d, "world"); // { "project" : "RapidJSON", "stars" : 11, "a" : { "b" : [ null ] }, "hello" : "world" } // Swap() is similar to Set() Value x("C++"); Pointer("/hello").Swap(d, x); // { "project" : "RapidJSON", "stars" : 11, "a" : { "b" : [ null ] }, "hello" : "C++" } // x becomes "world" // Erase a member or element, return true if the value exists bool success = Pointer("/a").Erase(d); assert(success); // { "project" : "RapidJSON", "stars" : 10 } ~~~ # Helper Functions {#HelperFunctions} Since object-oriented calling convention may be non-intuitive, RapidJSON also provides helper functions, which just wrap the member functions with free-functions. The following example does exactly the same as the above one. ~~~cpp Document d; SetValueByPointer(d, "/project", "RapidJSON"); SetValueByPointer(d, "/stars", 10); if (Value* stars = GetValueByPointer(d, "/stars")) stars->SetInt(stars->GetInt() + 1); CreateValueByPointer(d, "/a/b/0"); Value& hello = GetValueByPointerWithDefault(d, "/hello", "world"); Value x("C++"); SwapValueByPointer(d, "/hello", x); bool success = EraseValueByPointer(d, "/a"); assert(success); ~~~ The conventions are shown here for comparison: 1. `Pointer(source).(root, ...)` 2. `ValueByPointer(root, Pointer(source), ...)` 3. `ValueByPointer(root, source, ...)` # Resolving Pointer {#ResolvingPointer} `Pointer::Get()` or `GetValueByPointer()` function does not modify the DOM. If the tokens cannot match a value in the DOM, it returns `nullptr`. User can use this to check whether a value exists. Note that, numerical tokens can represent an array index or member name. The resolving process will match the values according to the types of value. ~~~javascript { "0" : 123, "1" : [456] } ~~~ 1. `"/0"` → `123` 2. `"/1/0"` → `456` The token `"0"` is treated as member name in the first pointer. It is treated as an array index in the second pointer. The other functions, including `Create()`, `GetWithDefault()`, `Set()` and `Swap()`, will change the DOM. These functions will always succeed. They will create the parent values if they do not exist. If the parent values do not match the tokens, they will also be forced to change their type. Changing the type also mean fully removal of that DOM subtree. Parsing the above JSON into `d`, ~~~cpp SetValueByPointer(d, "1/a", 789); // { "0" : 123, "1" : { "a" : 789 } } ~~~ ## Resolving Minus Sign Token Besides, [RFC6901] defines a special token `-` (single minus sign), which represents the pass-the-end element of an array. `Get()` only treats this token as a member name '"-"'. Yet the other functions can resolve this for array, equivalent to calling `Value::PushBack()` to the array. ~~~cpp Document d; d.Parse("{\"foo\":[123]}"); SetValueByPointer(d, "/foo/-", 456); // { "foo" : [123, 456] } SetValueByPointer(d, "/-", 789); // { "foo" : [123, 456], "-" : 789 } ~~~ ## Resolving Document and Value When using `p.Get(root)` or `GetValueByPointer(root, p)`, `root` is a (const) `Value&`. That means, it can be a subtree of the DOM. The other functions have two groups of signature. One group uses `Document& document` as parameter, another one uses `Value& root`. The first group uses `document.GetAllocator()` for creating values. And the second group needs user to supply an allocator, like the functions in DOM. All examples above do not require an allocator parameter, because the first parameter is a `Document&`. But if you want to resolve a pointer to a subtree, you need to supply the allocator as in the following example: ~~~cpp class Person { public: Person() { document_ = new Document(); // CreateValueByPointer() here no need allocator SetLocation(CreateValueByPointer(*document_, "/residence"), ...); SetLocation(CreateValueByPointer(*document_, "/office"), ...); }; private: void SetLocation(Value& location, const char* country, const char* addresses[2]) { Value::Allocator& a = document_->GetAllocator(); // SetValueByPointer() here need allocator SetValueByPointer(location, "/country", country, a); SetValueByPointer(location, "/address/0", address[0], a); SetValueByPointer(location, "/address/1", address[1], a); } // ... Document* document_; }; ~~~ `Erase()` or `EraseValueByPointer()` does not need allocator. And they return `true` if the value is erased successfully. # Error Handling {#ErrorHandling} A `Pointer` parses a source string in its constructor. If there is parsing error, `Pointer::IsValid()` returns `false`. And you can use `Pointer::GetParseErrorCode()` and `GetParseErrorOffset()` to retrieve the error information. Note that, all resolving functions assumes valid pointer. Resolving with an invalid pointer causes assertion failure. # URI Fragment Representation {#URIFragment} In addition to the string representation of JSON pointer that we are using till now, [RFC6901] also defines the URI fragment representation of JSON pointer. URI fragment is specified in [RFC3986] "Uniform Resource Identifier (URI): Generic Syntax". The main differences are that a the URI fragment always has a `#` (pound sign) in the beginning, and some characters are encoded by percent-encoding in UTF-8 sequence. For example, the following table shows different C/C++ string literals of different representations. String Representation | URI Fragment Representation | Pointer Tokens (UTF-8) ----------------------|-----------------------------|------------------------ `"/foo/0"` | `"#/foo/0"` | `{"foo", 0}` `"/a~1b"` | `"#/a~1b"` | `{"a/b"}` `"/m~0n"` | `"#/m~0n"` | `{"m~n"}` `"/ "` | `"#/%20"` | `{" "}` `"/\0"` | `"#/%00"` | `{"\0"}` `"/€"` | `"#/%E2%82%AC"` | `{"€"}` RapidJSON fully support URI fragment representation. It automatically detects the pound sign during parsing. # Stringify You may also stringify a `Pointer` to a string or other output streams. This can be done by: ~~~ Pointer p(...); StringBuffer sb; p.Stringify(sb); std::cout << sb.GetString() << std::endl; ~~~ It can also stringify to URI fragment representation by `StringifyUriFragment()`. # User-Supplied Tokens {#UserSuppliedTokens} If a pointer will be resolved multiple times, it should be constructed once, and then apply it to different DOMs or in different times. This reduce time and memory allocation for constructing `Pointer` multiple times. We can go one step further, to completely eliminate the parsing process and dynamic memory allocation, we can establish the token array directly: ~~~cpp #define NAME(s) { s, sizeof(s) / sizeof(s[0]) - 1, kPointerInvalidIndex } #define INDEX(i) { #i, sizeof(#i) - 1, i } static const Pointer::Token kTokens[] = { NAME("foo"), INDEX(123) }; static const Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); // Equivalent to static const Pointer p("/foo/123"); ~~~ This may be useful for memory constrained systems. [RFC3986]: https://tools.ietf.org/html/rfc3986 [RFC6901]: https://tools.ietf.org/html/rfc6901 asymptote-3.05/LspCpp/third_party/rapidjson/doc/tutorial.zh-cn.md0000644000000000000000000005205215031566105023665 0ustar rootroot# 教程 本教程简介文件对象模型(Document Object Model, DOM)API。 如 [用法一览](../readme.zh-cn.md#用法一览) 中所示,å¯ä»¥è§£æžä¸€ä¸ª JSON 至 DOM,然åŽå°±å¯ä»¥è½»æ¾æŸ¥è¯¢åŠä¿®æ”¹ DOM,并最终转æ¢å›ž JSON。 [TOC] # Value åŠ Document {#ValueDocument} æ¯ä¸ª JSON 值都储存为 `Value` 类,而 `Document` 类则表示整个 DOM,它存储了一个 DOM 树的根 `Value`。RapidJSON 的所有公开类型åŠå‡½æ•°éƒ½åœ¨ `rapidjson` 命å空间中。 # 查询 Value {#QueryValue} 在本节中,我们会使用到 `example/tutorial/tutorial.cpp` 中的代ç ç‰‡æ®µã€‚ å‡è®¾æˆ‘们用 C 语言的字符串储存一个 JSON(`const char* json`): ~~~~~~~~~~js { "hello": "world", "t": true , "f": false, "n": null, "i": 123, "pi": 3.1416, "a": [1, 2, 3, 4] } ~~~~~~~~~~ 把它解æžè‡³ä¸€ä¸ª `Document`: ~~~~~~~~~~cpp #include "rapidjson/document.h" using namespace rapidjson; // ... Document document; document.Parse(json); ~~~~~~~~~~ 那么现在该 JSON 就会被解æžè‡³ `document` 中,æˆä¸ºä¸€æ£µ *DOM æ ‘ *: ![教程中的 DOM](diagram/tutorial.png) 自从 RFC 7159 ä½œå‡ºæ›´æ–°ï¼Œåˆæ³• JSON 文件的根å¯ä»¥æ˜¯ä»»ä½•类型的 JSON 值。而在较早的 RFC 4627 中,根值åªå…许是 Object 或 Array。而在上述例å­ä¸­ï¼Œæ ¹æ˜¯ä¸€ä¸ª Object。 ~~~~~~~~~~cpp assert(document.IsObject()); ~~~~~~~~~~ 让我们查询一下根 Object 中有没有 `"hello"` æˆå‘˜ã€‚由于一个 `Value` å¯åŒ…å«ä¸åŒç±»åž‹çš„值,我们å¯èƒ½éœ€è¦éªŒè¯å®ƒçš„类型,并使用åˆé€‚çš„ API 去获å–其值。在此例中,`"hello"` æˆå‘˜å…³è”到一个 JSON String。 ~~~~~~~~~~cpp assert(document.HasMember("hello")); assert(document["hello"].IsString()); printf("hello = %s\n", document["hello"].GetString()); ~~~~~~~~~~ ~~~~~~~~~~ world ~~~~~~~~~~ JSON True/False 值是以 `bool` 表示的。 ~~~~~~~~~~cpp assert(document["t"].IsBool()); printf("t = %s\n", document["t"].GetBool() ? "true" : "false"); ~~~~~~~~~~ ~~~~~~~~~~ true ~~~~~~~~~~ JSON Null 值å¯ç”¨ `IsNull()` 查询。 ~~~~~~~~~~cpp printf("n = %s\n", document["n"].IsNull() ? "null" : "?"); ~~~~~~~~~~ ~~~~~~~~~~ null ~~~~~~~~~~ JSON Number 类型表示所有数值。然而,C++ 需è¦ä½¿ç”¨æ›´ä¸“门的类型。 ~~~~~~~~~~cpp assert(document["i"].IsNumber()); // 在此情况下,IsUint()/IsInt64()/IsUint64() 也会返回 true assert(document["i"].IsInt()); printf("i = %d\n", document["i"].GetInt()); // å¦ä¸€ç§ç”¨æ³•: (int)document["i"] assert(document["pi"].IsNumber()); assert(document["pi"].IsDouble()); printf("pi = %g\n", document["pi"].GetDouble()); ~~~~~~~~~~ ~~~~~~~~~~ i = 123 pi = 3.1416 ~~~~~~~~~~ JSON Array 包å«ä¸€äº›å…ƒç´ ã€‚ ~~~~~~~~~~cpp // 使用引用æ¥è¿žç»­è®¿é—®ï¼Œæ–¹ä¾¿ä¹‹ä½™è¿˜æ›´é«˜æ•ˆã€‚ const Value& a = document["a"]; assert(a.IsArray()); for (SizeType i = 0; i < a.Size(); i++) // 使用 SizeType è€Œä¸æ˜¯ size_t printf("a[%d] = %d\n", i, a[i].GetInt()); ~~~~~~~~~~ ~~~~~~~~~~ a[0] = 1 a[1] = 2 a[2] = 3 a[3] = 4 ~~~~~~~~~~ 注æ„,RapidJSON å¹¶ä¸è‡ªåŠ¨è½¬æ¢å„ç§ JSON 类型。例如,对一个 String çš„ Value 调用 `GetInt()` æ˜¯éžæ³•的。在调试模å¼ä¸‹ï¼Œå®ƒä¼šè¢«æ–­è¨€å¤±è´¥ã€‚在å‘布模å¼ä¸‹ï¼Œå…¶è¡Œä¸ºæ˜¯æœªå®šä¹‰çš„。 以下将会讨论有关查询å„类型的细节。 ## 查询 Array {#QueryArray} ç¼ºçœæƒ…况下,`SizeType` 是 `unsigned` çš„ typedef。在多数系统中,Array 最多能存储 2^32-1 个元素。 ä½ å¯ä»¥ç”¨æ•´æ•°å­—é¢é‡è®¿é—®å…ƒç´ ï¼Œå¦‚ `a[0]`ã€`a[1]`ã€`a[2]`。 Array 与 `std::vector` 相似,除了使用索引,也å¯ä½¿ç”¨è¿­ä»£å™¨æ¥è®¿é—®æ‰€æœ‰å…ƒç´ ã€‚ ~~~~~~~~~~cpp for (Value::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) printf("%d ", itr->GetInt()); ~~~~~~~~~~ 还有一些熟悉的查询函数: * `SizeType Capacity() const` * `bool Empty() const` ### 范围 for 循环 (v1.1.0 中的新功能) 当使用 C++11 功能时,你å¯ä½¿ç”¨èŒƒå›´ for 循环去访问 Array 内的所有元素。 ~~~~~~~~~~cpp for (auto& v : a.GetArray()) printf("%d ", v.GetInt()); ~~~~~~~~~~ ## 查询 Object {#QueryObject} å’Œ Array 相似,我们å¯ä»¥ç”¨è¿­ä»£å™¨åŽ»è®¿é—®æ‰€æœ‰ Object æˆå‘˜ï¼š ~~~~~~~~~~cpp static const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" }; for (Value::ConstMemberIterator itr = document.MemberBegin(); itr != document.MemberEnd(); ++itr) { printf("Type of member %s is %s\n", itr->name.GetString(), kTypeNames[itr->value.GetType()]); } ~~~~~~~~~~ ~~~~~~~~~~ Type of member hello is String Type of member t is True Type of member f is False Type of member n is Null Type of member i is Number Type of member pi is Number Type of member a is Array ~~~~~~~~~~ 注æ„,当 `operator[](const char*)` 找ä¸åˆ°æˆå‘˜ï¼Œå®ƒä¼šæ–­è¨€å¤±è´¥ã€‚ 若我们ä¸ç¡®å®šä¸€ä¸ªæˆå‘˜æ˜¯å¦å­˜åœ¨ï¼Œä¾¿éœ€è¦åœ¨è°ƒç”¨ `operator[](const char*)` å‰å…ˆè°ƒç”¨ `HasMember()`ã€‚ç„¶è€Œï¼Œè¿™ä¼šå¯¼è‡´ä¸¤æ¬¡æŸ¥æ‰¾ã€‚æ›´å¥½çš„åšæ³•是调用 `FindMember()`ï¼Œå®ƒèƒ½åŒæ—¶æ£€æŸ¥æˆå‘˜æ˜¯å¦å­˜åœ¨å¹¶è¿”回它的 Value: ~~~~~~~~~~cpp Value::ConstMemberIterator itr = document.FindMember("hello"); if (itr != document.MemberEnd()) printf("%s\n", itr->value.GetString()); ~~~~~~~~~~ ### 范围 for 循环 (v1.1.0 中的新功能) 当使用 C++11 功能时,你å¯ä½¿ç”¨èŒƒå›´ for 循环去访问 Object 内的所有æˆå‘˜ã€‚ ~~~~~~~~~~cpp for (auto& m : document.GetObject()) printf("Type of member %s is %s\n", m.name.GetString(), kTypeNames[m.value.GetType()]); ~~~~~~~~~~ ## 查询 Number {#QueryNumber} JSON åªæä¾›ä¸€ç§æ•°å€¼ç±»åž‹â”€â”€Number。数字å¯ä»¥æ˜¯æ•´æ•°æˆ–实数。RFC 4627 规定数字的范围由解æžå™¨æŒ‡å®šã€‚ 由于 C++ æä¾›å¤šç§æ•´æ•°åŠæµ®ç‚¹æ•°ç±»åž‹ï¼ŒDOM å°è¯•å°½é‡æä¾›æœ€å¹¿çš„èŒƒå›´åŠè‰¯å¥½æ€§èƒ½ã€‚ 当解æžä¸€ä¸ª Number æ—¶, 它会被存储在 DOM 之中,æˆä¸ºä¸‹åˆ—其中一个类型: 类型 | æè¿° -----------|--------------------------------------- `unsigned` | 32 使— å·æ•´æ•° `int` | 32 使œ‰å·æ•´æ•° `uint64_t` | 64 使— å·æ•´æ•° `int64_t` | 64 使œ‰å·æ•´æ•° `double` | 64 ä½åŒç²¾åº¦æµ®ç‚¹æ•° 当查询一个 Number æ—¶, ä½ å¯ä»¥æ£€æŸ¥è¯¥æ•°å­—是å¦èƒ½ä»¥ç›®æ ‡ç±»åž‹æ¥æå–: 查检 | æå– ------------------|--------------------- `bool IsNumber()` | ä¸é€‚用 `bool IsUint()` | `unsigned GetUint()` `bool IsInt()` | `int GetInt()` `bool IsUint64()` | `uint64_t GetUint64()` `bool IsInt64()` | `int64_t GetInt64()` `bool IsDouble()` | `double GetDouble()` 注æ„,一个整数å¯èƒ½ç”¨å‡ ç§ç±»åž‹æ¥æå–,而无需转æ¢ã€‚例如,一个å为 `x` çš„ Value åŒ…å« 123,那么 `x.IsInt() == x.IsUint() == x.IsInt64() == x.IsUint64() == true`。但如果一个å为 `y` çš„ Value åŒ…å« -3000000000,那么仅会令 `x.IsInt64() == true`。 å½“è¦æå– Number 类型,`GetDouble()` æ˜¯ä¼šæŠŠå†…éƒ¨æ•´æ•°çš„è¡¨ç¤ºè½¬æ¢æˆ `double`ã€‚æ³¨æ„ `int` å’Œ `unsigned` å¯ä»¥å®‰å…¨åœ°è½¬æ¢è‡³ `double`,但 `int64_t` åŠ `uint64_t` å¯èƒ½ä¼šä¸§å¤±ç²¾åº¦ï¼ˆå› ä¸º `double` çš„å°¾æ•°åªæœ‰ 52 ä½ï¼‰ã€‚ ## 查询 String {#QueryString} 除了 `GetString()`,`Value` 类也有一个 `GetStringLength()`。这里会解释个中原因。 æ ¹æ® RFC 4627,JSON String å¯åŒ…å« Unicode 字符 `U+0000`,在 JSON 中会表示为 `"\u0000"`。问题是,C/C++ 通常使用空字符结尾字符串(null-terminated string),这ç§å­—符串把 ``\0'` 作为结æŸç¬¦å·ã€‚ ä¸ºäº†ç¬¦åˆ RFC 4627,RapidJSON 支æŒåŒ…å« `U+0000` çš„ String。若你需è¦å¤„ç†è¿™äº› String,便å¯ä½¿ç”¨ `GetStringLength()` 去获得正确的字符串长度。 例如,当解æžä»¥ä¸‹çš„ JSON 至 `Document d` 之åŽï¼š ~~~~~~~~~~js { "s" : "a\u0000b" } ~~~~~~~~~~ `"a\u0000b"` 值的正确长度应该是 3。但 `strlen()` 会返回 1。 `GetStringLength()` 也å¯ä»¥æé«˜æ€§èƒ½ï¼Œå› ä¸ºç”¨æˆ·å¯èƒ½éœ€è¦è°ƒç”¨ `strlen()` 去分é…缓冲。 此外,`std::string` 也支æŒè¿™ä¸ªæž„造函数: ~~~~~~~~~~cpp string(const char* s, size_t count); ~~~~~~~~~~ 此构造函数接å—å­—ç¬¦ä¸²é•¿åº¦ä½œä¸ºå‚æ•°ã€‚它支æŒåœ¨å­—符串中存储空字符,也应该会有更好的性能。 ## 比较两个 Value ä½ å¯ä½¿ç”¨ `==` åŠ `!=` 去比较两个 Value。当且仅当两个 Value 的类型åŠå†…容相åŒï¼Œå®ƒä»¬æ‰å½“作相等。你也å¯ä»¥æ¯”较 Value 和它的原生类型值。以下是一个例å­ã€‚ ~~~~~~~~~~cpp if (document["hello"] == document["n"]) /*...*/; // 比较两个值 if (document["hello"] == "world") /*...*/; // 与字符串字é¢é‡ä½œæ¯”较 if (document["i"] != 123) /*...*/; // 与整数作比较 if (document["pi"] != 3.14) /*...*/; // 与 double 作比较 ~~~~~~~~~~ Arrayï¼Object 顺åºä»¥å®ƒä»¬çš„å…ƒç´ ï¼æˆå‘˜ä½œæ¯”è¾ƒã€‚å½“ä¸”ä»…å½“å®ƒä»¬çš„æ•´ä¸ªå­æ ‘相等,它们æ‰å½“作相等。 注æ„,现时若一个 Object 嫿œ‰é‡å¤å‘½åçš„æˆå‘˜ï¼Œå®ƒä¸Žä»»ä½• Object 作比较都总会返回 `false`。 # 创建ï¼ä¿®æ”¹å€¼ {#CreateModifyValues} æœ‰å¤šç§æ–¹æ³•去创建值。 当一个 DOM 树被创建或修改åŽï¼Œå¯ä½¿ç”¨ `Writer` 冿¬¡å­˜å‚¨ä¸º JSON。 ## æ”¹å˜ Value 类型 {#ChangeValueType} 当使用默认构造函数创建一个 Value 或 Document,它的类型便会是 Nullã€‚è¦æ”¹å˜å…¶ç±»åž‹ï¼Œéœ€è°ƒç”¨ `SetXXX()` 或赋值æ“作,例如: ~~~~~~~~~~cpp Document d; // Null d.SetObject(); Value v; // Null v.SetInt(10); v = 10; // 简写,和上é¢çš„ç›¸åŒ ~~~~~~~~~~ ### 构造函数的å„个é‡è½½ 几个类型也有é‡è½½æž„造函数: ~~~~~~~~~~cpp Value b(true); // 调用 Value(bool) Value i(-123); // 调用 Value(int) Value u(123u); // 调用 Value(unsigned) Value d(1.5); // 调用 Value(double) ~~~~~~~~~~ è¦é‡å»ºç©º Object 或 Array,å¯åœ¨é»˜è®¤æž„造函数åŽä½¿ç”¨ `SetObject()`/`SetArray()`,或一次性使用 `Value(Type)`: ~~~~~~~~~~cpp Value o(kObjectType); Value a(kArrayType); ~~~~~~~~~~ ## 转移语义(Move Semantics) {#MoveSemantics} 在设计 RapidJSON 时有一个éžå¸¸ç‰¹åˆ«çš„决定,就是 Value èµ‹å€¼å¹¶ä¸æ˜¯æŠŠæ¥æº Value å¤åˆ¶è‡³ç›®çš„ Valueï¼Œè€Œæ˜¯æŠŠæ¥æº Value 转移(move)至目的 Value。例如: ~~~~~~~~~~cpp Value a(123); Value b(456); b = a; // a å˜æˆ Null,b å˜æˆæ•°å­— 123。 ~~~~~~~~~~ ![使用移动语义赋值。](diagram/move1.png) 为什么?此语义有何优点? 最简å•的答案就是性能。对于固定大å°çš„ JSON 类型(Numberã€Trueã€Falseã€Null),å¤åˆ¶å®ƒä»¬æ˜¯ç®€å•å¿«æ·ã€‚然而,对于å¯å˜å¤§å°çš„ JSON 类型(Stringã€Arrayã€Object),å¤åˆ¶å®ƒä»¬ä¼šäº§ç”Ÿå¤§é‡å¼€é”€ï¼Œè€Œä¸”这些开销常常ä¸è¢«å¯Ÿè§‰ã€‚尤其是当我们需è¦åˆ›å»ºä¸´æ—¶ Object,把它å¤åˆ¶è‡³å¦ä¸€å˜é‡ï¼Œç„¶åŽå†æžæž„它。 例如,若使用正常 * å¤åˆ¶ * 语义: ~~~~~~~~~~cpp Value o(kObjectType); { Value contacts(kArrayType); // 把元素加进 contacts 数组。 // ... o.AddMember("contacts", contacts, d.GetAllocator()); // 深度å¤åˆ¶ contacts (å¯èƒ½æœ‰å¤§é‡å†…存分é…) // æžæž„ contacts。 } ~~~~~~~~~~ ![å¤åˆ¶è¯­ä¹‰äº§ç”Ÿå¤§é‡çš„å¤åˆ¶æ“作。](diagram/move2.png) 那个 `o` Object 需è¦åˆ†é…一个和 contacts 相åŒå¤§å°çš„缓冲区,对 conacts åšæ·±åº¦å¤åˆ¶ï¼Œå¹¶æœ€ç»ˆè¦æžæž„ contactsã€‚è¿™æ ·ä¼šäº§ç”Ÿå¤§é‡æ— å¿…è¦çš„内存分é…ï¼é‡Šæ”¾ï¼Œä»¥åŠå†…å­˜å¤åˆ¶ã€‚ 有一些方案å¯é¿å…实质地å¤åˆ¶è¿™äº›æ•°æ®ï¼Œä¾‹å¦‚引用计数(reference counting)ã€åžƒåœ¾å›žæ”¶ï¼ˆgarbage collection, GC)。 为了使 RapidJSON 简å•åŠå¿«é€Ÿï¼Œæˆ‘们选择了对赋值采用 * 转移 * 语义。这方法与 `std::auto_ptr` 相似,都是在赋值时转移拥有æƒã€‚转移快得多简å•得多,åªéœ€è¦æžæž„原æ¥çš„ Valueï¼ŒæŠŠæ¥æº `memcpy()` è‡³ç›®æ ‡ï¼Œæœ€åŽæŠŠæ¥æºè®¾ç½®ä¸º Null 类型。 因此,使用转移语义åŽï¼Œä¸Šé¢çš„例å­å˜æˆï¼š ~~~~~~~~~~cpp Value o(kObjectType); { Value contacts(kArrayType); // adding elements to contacts array. o.AddMember("contacts", contacts, d.GetAllocator()); // åªéœ€ memcpy() contacts 本身至新æˆå‘˜çš„ Value(16 字节) // contacts åœ¨è¿™é‡Œå˜æˆ Nullã€‚å®ƒçš„æžæž„是平凡的。 } ~~~~~~~~~~ ![转移语义ä¸éœ€å¤åˆ¶ã€‚](diagram/move3.png) 在 C++11 中这称为转移赋值æ“作(move assignment operator)。由于 RapidJSON æ”¯æŒ C++03,它在赋值æ“作采用转移语义,其它修改型函数如 `AddMember()`, `PushBack()` 也采用转移语义。 ### 转移语义åŠä¸´æ—¶å€¼ {#TemporaryValues} 有时候,我们想直接构造一个 Value 并传递给一个“转移â€å‡½æ•°ï¼ˆå¦‚ `PushBack()`ã€`AddMember()`)。由于临时对象是ä¸èƒ½è½¬æ¢ä¸ºæ­£å¸¸çš„ Value 引用,我们加入了一个方便的 `Move()` 函数: ~~~~~~~~~~cpp Value a(kArrayType); Document::AllocatorType& allocator = document.GetAllocator(); // a.PushBack(Value(42), allocator); // ä¸èƒ½é€šè¿‡ç¼–译 a.PushBack(Value().SetInt(42), allocator); // fluent API a.PushBack(Value(42).Move(), allocator); // å’Œä¸Šä¸€è¡Œç›¸åŒ ~~~~~~~~~~ ## 创建 String {#CreateString} RapidJSON æä¾›ä¸¤ä¸ª String 的存储策略。 1. copy-string: 分é…ç¼“å†²åŒºï¼Œç„¶åŽæŠŠæ¥æºæ•°æ®å¤åˆ¶è‡³å®ƒã€‚ 2. const-string: 简å•地储存字符串的指针。 Copy-string 总是安全的,因为它拥有数æ®çš„克隆。Const-string å¯ç”¨äºŽå­˜å‚¨å­—符串字é¢é‡ï¼Œä»¥åŠç”¨äºŽåœ¨ DOM 一节中将会æåˆ°çš„ in-situ è§£æžä¸­ã€‚ ä¸ºäº†è®©ç”¨æˆ·è‡ªå®šä¹‰å†…å­˜åˆ†é…æ–¹å¼ï¼Œå½“一个æ“作å¯èƒ½éœ€è¦å†…å­˜åˆ†é…æ—¶ï¼ŒRapidJSON è¦æ±‚用户传递一个 allocator 实例作为 API 傿•°ã€‚此设计é¿å…了在æ¯ä¸ª Value 存储 allocator(或 document)的指针。 因此,当我们把一个 copy-string 赋值时, è°ƒç”¨å«æœ‰ allocator çš„ `SetString()` é‡è½½å‡½æ•°ï¼š ~~~~~~~~~~cpp Document document; Value author; char buffer[10]; int len = sprintf(buffer, "%s %s", "Milo", "Yip"); // 动æ€åˆ›å»ºçš„字符串。 author.SetString(buffer, len, document.GetAllocator()); memset(buffer, 0, sizeof(buffer)); // 清空 buffer åŽ author.GetString() ä»ç„¶åŒ…å« "Milo Yip" ~~~~~~~~~~ 在此例å­ä¸­ï¼Œæˆ‘们使用 `Document` 实例的 allocator。这是使用 RapidJSON 时常用的惯用法。但你也å¯ä»¥ç”¨å…¶ä»– allocator 实例。 å¦å¤–,上é¢çš„ `SetString()` 需è¦é•¿åº¦å‚数。这个 API 能处ç†å«æœ‰ç©ºå­—符的字符串。å¦ä¸€ä¸ª `SetString()` é‡è½½å‡½æ•°æ²¡æœ‰é•¿åº¦å‚数,它å‡è®¾è¾“入是空字符结尾的,并会调用类似 `strlen()` 的函数去获å–长度。 最åŽï¼Œå¯¹äºŽå­—符串字é¢é‡æˆ–有安全生命周期的字符串,å¯ä»¥ä½¿ç”¨ const-string 版本的 `SetString()`,它没有 allocator 傿•°ã€‚对于字符串字é¢é‡ï¼ˆæˆ–字符数组常é‡ï¼‰ï¼Œåªéœ€ç®€å•地传递字é¢é‡ï¼Œåˆå®‰å…¨åˆé«˜æ•ˆï¼š ~~~~~~~~~~cpp Value s; s.SetString("rapidjson"); // å¯åŒ…å«ç©ºå­—符,长度在编译期推导 s = "rapidjson"; // 上行的缩写 ~~~~~~~~~~ 对于字符指针,RapidJSON 需è¦ä½œä¸€ä¸ªæ ‡è®°ï¼Œä»£è¡¨å®ƒä¸å¤åˆ¶ä¹Ÿæ˜¯å®‰å…¨çš„。å¯ä»¥ä½¿ç”¨ `StringRef` 函数: ~~~~~~~~~cpp const char * cstr = getenv("USER"); size_t cstr_len = ...; // 如果有长度 Value s; // s.SetString(cstr); // è¿™ä¸èƒ½é€šè¿‡ç¼–译 s.SetString(StringRef(cstr)); // å¯ä»¥ï¼Œå‡è®¾å®ƒçš„生命周期安全,并且是以空字符结尾的 s = StringRef(cstr); // 上行的缩写 s.SetString(StringRef(cstr, cstr_len));// 更快,å¯å¤„ç†ç©ºå­—符 s = StringRef(cstr, cstr_len); // 上行的缩写 ~~~~~~~~~ ## 修改 Array {#ModifyArray} Array 类型的 Value æä¾›ä¸Ž `std::vector` 相似的 API。 * `Clear()` * `Reserve(SizeType, Allocator&)` * `Value& PushBack(Value&, Allocator&)` * `template GenericValue& PushBack(T, Allocator&)` * `Value& PopBack()` * `ValueIterator Erase(ConstValueIterator pos)` * `ValueIterator Erase(ConstValueIterator first, ConstValueIterator last)` 注æ„,`Reserve(...)` åŠ `PushBack(...)` å¯èƒ½ä¼šä¸ºæ•°ç»„元素分é…内存,所以需è¦ä¸€ä¸ª allocator。 以下是 `PushBack()` 的例å­ï¼š ~~~~~~~~~~cpp Value a(kArrayType); Document::AllocatorType& allocator = document.GetAllocator(); for (int i = 5; i <= 10; i++) a.PushBack(i, allocator); // å¯èƒ½éœ€è¦è°ƒç”¨ realloc() æ‰€ä»¥éœ€è¦ allocator // æµç•…接å£ï¼ˆFluent interface) a.PushBack("Lua", allocator).PushBack("Mio", allocator); ~~~~~~~~~~ 与 STL ä¸ä¸€æ ·çš„æ˜¯ï¼Œ`PushBack()`/`PopBack()` 返回 Array 本身的引用。这称为æµç•…接å£ï¼ˆ_fluent interface_)。 如果你想在 Array 中加入一个éžå¸¸é‡å­—ç¬¦ä¸²ï¼Œæˆ–æ˜¯ä¸€ä¸ªæ²¡æœ‰è¶³å¤Ÿç”Ÿå‘½å‘¨æœŸçš„å­—ç¬¦ä¸²ï¼ˆè§ [Create String](#CreateString)),你需è¦ä½¿ç”¨ copy-string API 去创建一个 String。为了é¿å…加入中间å˜é‡ï¼Œå¯ä»¥å°±åœ°ä½¿ç”¨ä¸€ä¸ª [临时值](#TemporaryValues): ~~~~~~~~~~cpp // 就地 Value 傿•° contact.PushBack(Value("copy", document.GetAllocator()).Move(), // copy string document.GetAllocator()); // æ˜¾å¼ Value 傿•° Value val("key", document.GetAllocator()); // copy string contact.PushBack(val, document.GetAllocator()); ~~~~~~~~~~ ## 修改 Object {#ModifyObject} Object 是键值对的集åˆã€‚æ¯ä¸ªé”®å¿…须为 String。è¦ä¿®æ”¹ Object,方法是增加或移除æˆå‘˜ã€‚以下的 API 用æ¥å¢žåŠ æˆå‘˜ï¼š * `Value& AddMember(Value&, Value&, Allocator& allocator)` * `Value& AddMember(StringRefType, Value&, Allocator&)` * `template Value& AddMember(StringRefType, T value, Allocator&)` 以下是一个例å­ã€‚ ~~~~~~~~~~cpp Value contact(kObject); contact.AddMember("name", "Milo", document.GetAllocator()); contact.AddMember("married", true, document.GetAllocator()); ~~~~~~~~~~ 使用 `StringRefType` 作为 name 傿•°çš„é‡è½½ç‰ˆæœ¬ä¸Žå­—符串的 `SetString` 的接å£ç›¸ä¼¼ã€‚ 这些é‡è½½æ˜¯ä¸ºäº†é¿å…å¤åˆ¶ `name` 字符串,因为 JSON object 中ç»å¸¸ä¼šä½¿ç”¨å¸¸æ•°é”®å。 如果你需è¦ä»Žéžå¸¸æ•°å­—符串或生命周期ä¸è¶³çš„字符串创建键åï¼ˆè§ [创建 String](#CreateString)),你需è¦ä½¿ç”¨ copy-string API。为了é¿å…中间å˜é‡ï¼Œå¯ä»¥å°±åœ°ä½¿ç”¨ [临时值](#TemporaryValues): ~~~~~~~~~~cpp // 就地 Value 傿•° contact.AddMember(Value("copy", document.GetAllocator()).Move(), // copy string Value().Move(), // null value document.GetAllocator()); // 显å¼å‚æ•° Value key("key", document.GetAllocator()); // copy string name Value val(42); // æŸ Value contact.AddMember(key, val, document.GetAllocator()); ~~~~~~~~~~ 移除æˆå‘˜æœ‰å‡ ä¸ªé€‰æ‹©ï¼š * `bool RemoveMember(const Ch* name)`ï¼šä½¿ç”¨é”®åæ¥ç§»é™¤æˆå‘˜ï¼ˆçº¿æ€§æ—¶é—´å¤æ‚度)。 * `bool RemoveMember(const Value& name)`:除了 `name` 是一个 Value,和上一行相åŒã€‚ * `MemberIterator RemoveMember(MemberIterator)`:使用迭代器移除æˆå‘˜ï¼ˆ_ 常数 _ æ—¶é—´å¤æ‚度)。 * `MemberIterator EraseMember(MemberIterator)`ï¼šå’Œä¸Šè¡Œç›¸ä¼¼ä½†ç»´æŒæˆå‘˜æ¬¡åºï¼ˆçº¿æ€§æ—¶é—´å¤æ‚度)。 * `MemberIterator EraseMember(MemberIterator first, MemberIterator last)`:移除一个范围内的æˆå‘˜ï¼Œç»´æŒæ¬¡åºï¼ˆçº¿æ€§æ—¶é—´å¤æ‚度)。 `MemberIterator RemoveMember(MemberIterator)` 使用了“转移最åŽâ€æ‰‹æ³•æ¥è¾¾æˆå¸¸æ•°æ—¶é—´å¤æ‚åº¦ã€‚åŸºæœ¬ä¸Šå°±æ˜¯æžæž„迭代器ä½ç½®çš„æˆå‘˜ï¼Œç„¶åŽæŠŠæœ€åŽçš„æˆå‘˜è½¬ç§»è‡³è¿­ä»£å™¨ä½ç½®ã€‚因此,æˆå‘˜çš„æ¬¡åºä¼šè¢«æ”¹å˜ã€‚ ## æ·±å¤åˆ¶ Value {#DeepCopyValue} 若我们真的è¦å¤åˆ¶ä¸€ä¸ª DOM 树,我们å¯ä½¿ç”¨ä¸¤ä¸ª APIs 作深å¤åˆ¶ï¼šå« allocator çš„æž„é€ å‡½æ•°åŠ `CopyFrom()`。 ~~~~~~~~~~cpp Document d; Document::AllocatorType& a = d.GetAllocator(); Value v1("foo"); // Value v2(v1); // ä¸å®¹è®¸ Value v2(v1, a); // 制造一个克隆 assert(v1.IsString()); // v1 ä¸å˜ d.SetArray().PushBack(v1, a).PushBack(v2, a); assert(v1.IsNull() && v2.IsNull()); // 两个都转移动 d v2.CopyFrom(d, a); // 把整个 document å¤åˆ¶è‡³ v2 assert(d.IsArray() && d.Size() == 2); // d ä¸å˜ v1.SetObject().AddMember("array", v2, a); d.PushBack(v1, a); ~~~~~~~~~~ ## äº¤æ¢ Value {#SwapValues} RapidJSON 也æä¾› `Swap()`。 ~~~~~~~~~~cpp Value a(123); Value b("Hello"); a.Swap(b); assert(a.IsString()); assert(b.IsInt()); ~~~~~~~~~~ 无论两棵 DOM æ ‘æœ‰å¤šå¤æ‚ï¼Œäº¤æ¢æ˜¯å¾ˆå¿«çš„(常数时间)。 # 下一部分 {#WhatsNext} 本教程展示了如何询查åŠä¿®æ”¹ DOM 树。RapidJSON 还有一个é‡è¦æ¦‚念: 1. [æµ](doc/stream.zh-cn.md) 是读写 JSON 的通é“。æµå¯ä»¥æ˜¯å†…å­˜å­—ç¬¦ä¸²ã€æ–‡ä»¶æµç­‰ã€‚用户也å¯ä»¥è‡ªå®šä¹‰æµã€‚ 2. [ç¼–ç ](doc/encoding.zh-cn.md) å®šä¹‰åœ¨æµæˆ–内存中使用的字符编ç ã€‚RapidJSON 也在内部æä¾› Unicode 转æ¢åŠæ ¡éªŒåŠŸèƒ½ã€‚ 3. [DOM](doc/dom.zh-cn.md) 的基本功能已在本教程里介ç»ã€‚还有更高级的功能,如原ä½ï¼ˆ*in situ*)解æžã€å…¶ä»–è§£æžé€‰é¡¹åŠé«˜çº§ç”¨æ³•。 4. [SAX](doc/sax.zh-cn.md) 是 RapidJSON è§£æžï¼ç”ŸæˆåŠŸèƒ½çš„åŸºç¡€ã€‚å­¦ä¹ ä½¿ç”¨ `Reader`/`Writer` 去实现更高性能的应用程åºã€‚也å¯ä»¥ä½¿ç”¨ `PrettyWriter` 去格å¼åŒ– JSON。 5. [性能](doc/performance.zh-cn.md) 展示一些我们åšçš„åŠç¬¬ä¸‰æ–¹çš„æ€§èƒ½æµ‹è¯•。 6. [技术内幕](doc/internals.md) 讲述一些 RapidJSON å†…éƒ¨çš„è®¾è®¡åŠæŠ€æœ¯ã€‚ 你也å¯ä»¥å‚考 [常è§é—®é¢˜](doc/faq.zh-cn.md)ã€API 文档ã€ä¾‹å­åŠå•元测试。 asymptote-3.05/LspCpp/third_party/rapidjson/doc/sax.zh-cn.md0000644000000000000000000004677715031566105022636 0ustar rootroot# SAX "SAX" 此术语æºäºŽ [Simple API for XML](http://en.wikipedia.org/wiki/Simple_API_for_XML)。我们借了此术语去套用在 JSON 的解æžåŠç”Ÿæˆã€‚ 在 RapidJSON 中,`Reader`(`GenericReader<...>` çš„ typedef)是 JSON çš„ SAX 风格解æžå™¨ï¼Œè€Œ `Writer`(`GenericWriter<...>` çš„ typedef)则是 JSON çš„ SAX 风格生æˆå™¨ã€‚ [TOC] # Reader {#Reader} `Reader` 从输入æµè§£æžä¸€ä¸ª JSON。当它从æµä¸­è¯»å–字符时,它会基于 JSON 的语法去分æžå­—符,并å‘处ç†å™¨å‘é€äº‹ä»¶ã€‚ 例如,以下是一个 JSON。 ~~~~~~~~~~js { "hello": "world", "t": true , "f": false, "n": null, "i": 123, "pi": 3.1416, "a": [1, 2, 3, 4] } ~~~~~~~~~~ 当一个 `Reader` è§£æžæ­¤ JSON 时,它会顺åºåœ°å‘处ç†å™¨å‘é€ä»¥ä¸‹çš„事件: ~~~~~~~~~~ StartObject() Key("hello", 5, true) String("world", 5, true) Key("t", 1, true) Bool(true) Key("f", 1, true) Bool(false) Key("n", 1, true) Null() Key("i") Uint(123) Key("pi") Double(3.1416) Key("a") StartArray() Uint(1) Uint(2) Uint(3) Uint(4) EndArray(4) EndObject(7) ~~~~~~~~~~ é™¤äº†ä¸€äº›äº‹ä»¶å‚æ•°éœ€è¦å†ä½œè§£é‡Šï¼Œè¿™äº›äº‹ä»¶å¯ä»¥è½»æ¾åœ°ä¸Ž JSON 对上。我们å¯ä»¥çœ‹çœ‹ `simplereader` 例孿€Žæ ·äº§ç”Ÿå’Œä»¥ä¸Šå®Œå…¨ç›¸åŒçš„结果: ~~~~~~~~~~cpp #include "rapidjson/reader.h" #include using namespace rapidjson; using namespace std; struct MyHandler : public BaseReaderHandler, MyHandler> { bool Null() { cout << "Null()" << endl; return true; } bool Bool(bool b) { cout << "Bool(" << boolalpha << b << ")" << endl; return true; } bool Int(int i) { cout << "Int(" << i << ")" << endl; return true; } bool Uint(unsigned u) { cout << "Uint(" << u << ")" << endl; return true; } bool Int64(int64_t i) { cout << "Int64(" << i << ")" << endl; return true; } bool Uint64(uint64_t u) { cout << "Uint64(" << u << ")" << endl; return true; } bool Double(double d) { cout << "Double(" << d << ")" << endl; return true; } bool String(const char* str, SizeType length, bool copy) { cout << "String(" << str << ", " << length << ", " << boolalpha << copy << ")" << endl; return true; } bool StartObject() { cout << "StartObject()" << endl; return true; } bool Key(const char* str, SizeType length, bool copy) { cout << "Key(" << str << ", " << length << ", " << boolalpha << copy << ")" << endl; return true; } bool EndObject(SizeType memberCount) { cout << "EndObject(" << memberCount << ")" << endl; return true; } bool StartArray() { cout << "StartArray()" << endl; return true; } bool EndArray(SizeType elementCount) { cout << "EndArray(" << elementCount << ")" << endl; return true; } }; void main() { const char json[] = " { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } "; MyHandler handler; Reader reader; StringStream ss(json); reader.Parse(ss, handler); } ~~~~~~~~~~ æ³¨æ„ RapidJSON 使用模æ¿å޻陿€æŒ·å®š `Reader` 类型åŠå¤„ç†å™¨çš„ç±»åž‹ï¼Œè€Œä¸æ˜¯ä½¿ç”¨å«è™šå‡½æ•°çš„类。这个范å¼å¯ä»¥é€šè¿‡æŠŠå‡½æ•°å†…è”而改善性能。 ## 处ç†å™¨ {#Handler} 如å‰ä¾‹æ‰€ç¤ºï¼Œä½¿ç”¨è€…需è¦å®žçŽ°ä¸€ä¸ªå¤„ç†å™¨ï¼ˆhandlerï¼‰ï¼Œç”¨äºŽå¤„ç†æ¥è‡ª `Reader` 的事件(函数调用)。处ç†å™¨å¿…须包å«ä»¥ä¸‹çš„æˆå‘˜å‡½æ•°ã€‚ ~~~~~~~~~~cpp class Handler { bool Null(); bool Bool(bool b); bool Int(int i); bool Uint(unsigned i); bool Int64(int64_t i); bool Uint64(uint64_t i); bool Double(double d); bool RawNumber(const Ch* str, SizeType length, bool copy); bool String(const Ch* str, SizeType length, bool copy); bool StartObject(); bool Key(const Ch* str, SizeType length, bool copy); bool EndObject(SizeType memberCount); bool StartArray(); bool EndArray(SizeType elementCount); }; ~~~~~~~~~~ 当 `Reader` é‡åˆ° JSON null 值时会调用 `Null()`。 当 `Reader` é‡åˆ° JSON true 或 false 值时会调用 `Bool(bool)`。 当 `Reader` é‡åˆ° JSON number,它会选择一个åˆé€‚çš„ C++ 类型映射,然åŽè°ƒç”¨ `Int(int)`ã€`Uint(unsigned)`ã€`Int64(int64_t)`ã€`Uint64(uint64_t)` åŠ `Double(double)` çš„ * 其中之一个 *。 若开å¯äº† `kParseNumbersAsStrings` 选项,`Reader` 便会改为调用 `RawNumber()`。 当 `Reader` é‡åˆ° JSON string,它会调用 `String(const char* str, SizeType length, bool copy)`ã€‚ç¬¬ä¸€ä¸ªå‚æ•°æ˜¯å­—ç¬¦ä¸²çš„æŒ‡é’ˆã€‚ç¬¬äºŒä¸ªå‚æ•°æ˜¯å­—符串的长度(ä¸åŒ…å«ç©ºç»ˆæ­¢ç¬¦å·ï¼‰ã€‚æ³¨æ„ RapidJSON 支æŒå­—䏲䏭嫿œ‰ç©ºå­—符 `\0`ã€‚è‹¥å‡ºçŽ°è¿™ç§æƒ…况,便会有 `strlen(str) < length`。最åŽçš„ `copy` 傿•°è¡¨ç¤ºå¤„ç†å™¨æ˜¯å¦éœ€è¦å¤åˆ¶è¯¥å­—ç¬¦ä¸²ã€‚åœ¨æ­£å¸¸è§£æžæ—¶ï¼Œ`copy = true`。仅当使用原ä½è§£æžæ—¶ï¼Œ`copy = false`ã€‚æ­¤å¤–ï¼Œè¿˜è¦æ³¨æ„字符的类型与目标编ç ç›¸å…³ï¼Œæˆ‘们ç¨åŽä¼šå†è°ˆè¿™ä¸€ç‚¹ã€‚ 当 `Reader` é‡åˆ° JSON object 的开始之时,它会调用 `StartObject()`。JSON çš„ object 是一个键值对(æˆå‘˜ï¼‰çš„集åˆã€‚è‹¥ object åŒ…å«æˆå‘˜ï¼Œå®ƒä¼šå…ˆä¸ºæˆå‘˜çš„å字调用 `Key()`,然åŽå†æŒ‰å€¼çš„ç±»åž‹è°ƒç”¨å‡½æ•°ã€‚å®ƒä¸æ–­è°ƒç”¨è¿™äº›é”®å€¼å¯¹ï¼Œç›´è‡³æœ€ç»ˆè°ƒç”¨ `EndObject(SizeType memberCount)`ã€‚æ³¨æ„ `memberCount` 傿•°å¯¹å¤„ç†å™¨æ¥è¯´åªæ˜¯å助性质,使用者å¯èƒ½ä¸éœ€è¦æ­¤å‚数。 JSON array 与 object 相似,但更简å•。在 array 开始时,`Reader` 会调用 `BeginArary()`。若 array 嫿œ‰å…ƒç´ ï¼Œå®ƒä¼šæŒ‰å…ƒç´ çš„类型æ¥è¯»ç”¨å‡½æ•°ã€‚相似地,最åŽå®ƒä¼šè°ƒç”¨ `EndArray(SizeType elementCount)`,其中 `elementCount` 傿•°å¯¹å¤„ç†å™¨æ¥è¯´åªæ˜¯å助性质。 æ¯ä¸ªå¤„ç†å™¨å‡½æ•°éƒ½è¿”回一个 `bool`。正常它们应返回 `true`。若处ç†å™¨é‡åˆ°é”™è¯¯ï¼Œå®ƒå¯ä»¥è¿”回 `false` 去通知事件å‘逿–¹åœæ­¢ç»§ç»­å¤„ç†ã€‚ 例如,当我们用 `Reader` è§£æžä¸€ä¸ª JSON 时,处ç†å™¨æ£€æµ‹åˆ°è¯¥ JSON å¹¶ä¸ç¬¦åˆæ‰€éœ€çš„ schema,那么处ç†å™¨å¯ä»¥è¿”回 `false`,令 `Reader` åœæ­¢ä¹‹åŽçš„è§£æžå·¥ä½œã€‚而 `Reader` 会进入一个错误状æ€ï¼Œå¹¶ä»¥ `kParseErrorTermination` é”™è¯¯ç æ ‡è¯†ã€‚ ## GenericReader {#GenericReader} å‰é¢æåŠï¼Œ`Reader` 是 `GenericReader` 模æ¿ç±»çš„ typedef: ~~~~~~~~~~cpp namespace rapidjson { template > class GenericReader { // ... }; typedef GenericReader, UTF8<> > Reader; } // namespace rapidjson ~~~~~~~~~~ `Reader` 使用 UTF-8 ä½œä¸ºæ¥æºåŠç›®æ ‡ç¼–ç ã€‚æ¥æºç¼–ç æ˜¯æŒ‡ JSON æµçš„ç¼–ç ã€‚ç›®æ ‡ç¼–ç æ˜¯æŒ‡ `String()` çš„ `str` 傿•°æ‰€ç”¨çš„ç¼–ç ã€‚例如,è¦è§£æžä¸€ä¸ª UTF-8 æµå¹¶è¾“出至 UTF-16 string 事件,你需è¦è¿™ä¹ˆå®šä¹‰ä¸€ä¸ª reader: ~~~~~~~~~~cpp GenericReader, UTF16<> > reader; ~~~~~~~~~~ 注æ„到 `UTF16` 的缺çœç±»åž‹æ˜¯ `wchar_t`。因此这个 `reader` 需è¦è°ƒç”¨å¤„ç†å™¨çš„ `String(const wchar_t*, SizeType, bool)`。 第三个模æ¿å‚æ•° `Allocator` 是内部数æ®ç»“构(实际上是一个堆栈)的分é…器类型。 ## è§£æž {#SaxParsing} `Reader` çš„å”¯ä¸€åŠŸèƒ½å°±æ˜¯è§£æž JSON。 ~~~~~~~~~~cpp template bool Parse(InputStream& is, Handler& handler); // 使用 parseFlags = kDefaultParseFlags template bool Parse(InputStream& is, Handler& handler); ~~~~~~~~~~ 若在解æžä¸­å‡ºçŽ°é”™è¯¯ï¼Œå®ƒä¼šè¿”å›ž `false`。使用者å¯è°ƒç”¨ `bool HasParseEror()`, `ParseErrorCode GetParseErrorCode()` åŠ `size_t GetErrorOffset()` 获å–错误状æ€ã€‚实际上 `Document` 使用这些 `Reader` 函数去获å–è§£æžé”™è¯¯ã€‚请å‚考 [DOM](doc/dom.zh-cn.md) 去了解有关解æžé”™è¯¯çš„细节。 # Writer {#Writer} `Reader` 把 JSON 转æ¢ï¼ˆè§£æžï¼‰æˆä¸ºäº‹ä»¶ã€‚`Writer` åšå®Œå…¨ç›¸åçš„äº‹æƒ…ã€‚å®ƒæŠŠäº‹ä»¶è½¬æ¢æˆ JSON。 `Writer` 是éžå¸¸å®¹æ˜“使用的。若你的应用程åºåªéœ€æŠŠä¸€äº›æ•°æ®è½¬æ¢æˆ JSON,å¯èƒ½ç›´æŽ¥ä½¿ç”¨ `Writer`,会比建立一个 `Document` ç„¶åŽç”¨ `Writer` æŠŠå®ƒè½¬æ¢æˆ JSON 更加方便。 在 `simplewriter` 例å­é‡Œï¼Œæˆ‘ä»¬åš `simplereader` 完全相å的事情。 ~~~~~~~~~~cpp #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" #include using namespace rapidjson; using namespace std; void main() { StringBuffer s; Writer writer(s); writer.StartObject(); writer.Key("hello"); writer.String("world"); writer.Key("t"); writer.Bool(true); writer.Key("f"); writer.Bool(false); writer.Key("n"); writer.Null(); writer.Key("i"); writer.Uint(123); writer.Key("pi"); writer.Double(3.1416); writer.Key("a"); writer.StartArray(); for (unsigned i = 0; i < 4; i++) writer.Uint(i); writer.EndArray(); writer.EndObject(); cout << s.GetString() << endl; } ~~~~~~~~~~ ~~~~~~~~~~ {"hello":"world","t":true,"f":false,"n":null,"i":123,"pi":3.1416,"a":[0,1,2,3]} ~~~~~~~~~~ `String()` åŠ `Key()` 儿œ‰ä¸¤ä¸ªé‡è½½ã€‚一个是如处ç†å™¨ concept 般,有 3 ä¸ªå‚æ•°ã€‚它能处ç†å«ç©ºå­—符的字符串。å¦ä¸€ä¸ªæ˜¯å¦‚上中使用的较简å•版本。 注æ„到,例å­ä»£ç ä¸­çš„ `EndArray()` åŠ `EndObject()` å¹¶æ²¡æœ‰å‚æ•°ã€‚å¯ä»¥ä¼ é€’一个 `SizeType` çš„å‚æ•°ï¼Œä½†å®ƒä¼šè¢« `Writer` 忽略。 ä½ å¯èƒ½ä¼šæ€€ç–‘,为什么ä¸ä½¿ç”¨ `sprintf()` 或 `std::stringstream` 去建立一个 JSON? 这有几个原因: 1. `Writer` 必然会输出一个结构良好(well-formed)的 JSON。若然有错误的事件次åºï¼ˆå¦‚ `Int()` ç´§éš `StartObject()` 出现),它会在调试模å¼ä¸­äº§ç”Ÿæ–­è¨€å¤±è´¥ã€‚ 2. `Writer::String()` å¯å¤„ç†å­—符串转义(如把ç ç‚¹ `U+000A` è½¬æ¢æˆ `\n`)åŠè¿›è¡Œ Unicode 转ç ã€‚ 3. `Writer` ä¸€è‡´åœ°å¤„ç† number 的输出。 4. `Writer` 实现了事件处ç†å™¨ concept。å¯ç”¨äºŽå¤„ç†æ¥è‡ª `Reader`ã€`Document` 或其他事件å‘生器。 5. `Writer` å¯å¯¹ä¸åŒå¹³å°è¿›è¡Œä¼˜åŒ–。 无论如何,使用 `Writer` API åŽ»ç”Ÿæˆ JSON 甚至乎比这些临时方法更简å•。 ## æ¨¡æ¿ {#WriterTemplate} `Writer` 与 `Reader` 有少许设计区别。`Writer` 是一个模æ¿ç±»ï¼Œè€Œä¸æ˜¯ä¸€ä¸ª typedef。 并没有 `GenericWriter`。以下是 `Writer` 的声明。 ~~~~~~~~~~cpp namespace rapidjson { template, typename TargetEncoding = UTF8<>, typename Allocator = CrtAllocator<> > class Writer { public: Writer(OutputStream& os, Allocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) // ... }; } // namespace rapidjson ~~~~~~~~~~ `OutputStream` 模æ¿å‚数是输出æµçš„类型。它的类型ä¸å¯ä»¥è¢«è‡ªåŠ¨æŽ¨æ–­ï¼Œå¿…é¡»ç”±ä½¿ç”¨è€…æä¾›ã€‚ `SourceEncoding` 模æ¿å‚数指定了 `String(const Ch*, ...)` 的编ç ã€‚ `TargetEncoding` 模æ¿å‚数指定输出æµçš„ç¼–ç ã€‚ `Allocator` 是分é…器的类型,用于分é…内部数æ®ç»“构(一个堆栈)。 `writeFlags` æ˜¯ä»¥ä¸‹ä½æ ‡å¿—的组åˆï¼š 写入使 ‡å¿— | æ„义 ------------------------------|----------------------------------- `kWriteNoFlags` | 没有任何标志。 `kWriteDefaultFlags` | 缺çœçš„è§£æžé€‰é¡¹ã€‚它等于 `RAPIDJSON_WRITE_DEFAULT_FLAGS` å®ï¼Œæ­¤å®å®šä¹‰ä¸º `kWriteNoFlags`。 `kWriteValidateEncodingFlag` | 校验 JSON 字符串的编ç ã€‚ `kWriteNanAndInfFlag` | 容许写入 `Infinity`, `-Infinity` åŠ `NaN`。 此外,`Writer` 的构造函数有一 `levelDepth` 傿•°ã€‚存储æ¯å±‚阶信æ¯çš„åˆå§‹å†…存分é…é‡å—æ­¤å‚æ•°å½±å“。 ## PrettyWriter {#PrettyWriter} `Writer` 所输出的是没有空格字符的最紧凑 JSON,适åˆç½‘络传输或储存,但ä¸é€‚åˆäººç±»é˜…读。 因此,RapidJSON æä¾›äº†ä¸€ä¸ª `PrettyWriter`ï¼Œå®ƒåœ¨è¾“å‡ºä¸­åŠ å…¥ç¼©è¿›åŠæ¢è¡Œã€‚ `PrettyWriter` 的用法与 `Writer` 几乎一样,ä¸åŒä¹‹å¤„是 `PrettyWriter` æä¾›äº†ä¸€ä¸ª `SetIndent(Ch indentChar, unsigned indentCharCount)` 函数。缺çœçš„缩进是 4 个空格。 ## 完整性åŠé‡ç½® {#CompletenessReset} 一个 `Writer` åªå¯è¾“出å•个 JSON,其根节点å¯ä»¥æ˜¯ä»»ä½• JSON 类型。当处ç†å®Œå•个根节点事件(如 `String()`),或匹é…çš„æœ€åŽ `EndObject()` 或 `EndArray()` 事件,输出的 JSON 是结构完整(well-formed)åŠå®Œæ•´çš„。使用者å¯è°ƒç”¨ `Writer::IsComplete()` 去检测完整性。 当 JSON 完整时,`Writer` ä¸èƒ½å†æŽ¥å—新的事件。ä¸ç„¶å…¶è¾“出便会是ä¸åˆæ³•çš„ï¼ˆä¾‹å¦‚æœ‰è¶…è¿‡ä¸€ä¸ªæ ¹èŠ‚ç‚¹ï¼‰ã€‚ä¸ºäº†é‡æ–°åˆ©ç”¨ `Writer` 对象,使用者å¯è°ƒç”¨ `Writer::Reset(OutputStream& os)` 去é‡ç½®å…¶æ‰€æœ‰å†…部状æ€åŠè®¾ç½®æ–°çš„输出æµã€‚ # 技巧 {#SaxTechniques} ## è§£æž JSON 至自定义结构 {#CustomDataStructure} `Document` 的解æžåŠŸèƒ½å®Œå…¨ä¾é  `Reader`。实际上 `Document` 是一个处ç†å™¨ï¼Œåœ¨è§£æž JSON 时接收事件去建立一个 DOM。 使用者å¯ä»¥ç›´æŽ¥ä½¿ç”¨ `Reader` 去建立其他数æ®ç»“构。这消除了建立 DOM 的步骤,从而å‡å°‘了内存开销并改善性能。 在以下的 `messagereader` 例å­ä¸­ï¼Œ`ParseMessages()` è§£æžä¸€ä¸ª JSON,该 JSON 应该是一个å«é”®å€¼å¯¹çš„ object。 ~~~~~~~~~~cpp #include "rapidjson/reader.h" #include "rapidjson/error/en.h" #include #include #include using namespace std; using namespace rapidjson; typedef map MessageMap; struct MessageHandler : public BaseReaderHandler, MessageHandler> { MessageHandler() : state_(kExpectObjectStart) { } bool StartObject() { switch (state_) { case kExpectObjectStart: state_ = kExpectNameOrObjectEnd; return true; default: return false; } } bool String(const char* str, SizeType length, bool) { switch (state_) { case kExpectNameOrObjectEnd: name_ = string(str, length); state_ = kExpectValue; return true; case kExpectValue: messages_.insert(MessageMap::value_type(name_, string(str, length))); state_ = kExpectNameOrObjectEnd; return true; default: return false; } } bool EndObject(SizeType) { return state_ == kExpectNameOrObjectEnd; } bool Default() { return false; } // All other events are invalid. MessageMap messages_; enum State { kExpectObjectStart, kExpectNameOrObjectEnd, kExpectValue, }state_; std::string name_; }; void ParseMessages(const char* json, MessageMap& messages) { Reader reader; MessageHandler handler; StringStream ss(json); if (reader.Parse(ss, handler)) messages.swap(handler.messages_); // Only change it if success. else { ParseErrorCode e = reader.GetParseErrorCode(); size_t o = reader.GetErrorOffset(); cout << "Error: " << GetParseError_En(e) << endl;; cout << " at offset " << o << " near '" << string(json).substr(o, 10) << "...'" << endl; } } int main() { MessageMap messages; const char* json1 = "{ \"greeting\" : \"Hello!\", \"farewell\" : \"bye-bye!\" }"; cout << json1 << endl; ParseMessages(json1, messages); for (MessageMap::const_iterator itr = messages.begin(); itr != messages.end(); ++itr) cout << itr->first << ": " << itr->second << endl; cout << endl << "Parse a JSON with invalid schema." << endl; const char* json2 = "{ \"greeting\" : \"Hello!\", \"farewell\" : \"bye-bye!\", \"foo\" : {} }"; cout << json2 << endl; ParseMessages(json2, messages); return 0; } ~~~~~~~~~~ ~~~~~~~~~~ { "greeting" : "Hello!", "farewell" : "bye-bye!" } farewell: bye-bye! greeting: Hello! Parse a JSON with invalid schema. { "greeting" : "Hello!", "farewell" : "bye-bye!", "foo" : {} } Error: Terminate parsing due to Handler error. at offset 59 near '} }...' ~~~~~~~~~~ 第一个 JSON(`json1`)被æˆåŠŸåœ°è§£æžè‡³ `MessageMap`。由于 `MessageMap` 是一个 `std::map`ï¼Œæ‰“å°æ¬¡åºæŒ‰é”®å€¼æŽ’åºã€‚此次åºä¸Ž JSON 中的次åºä¸åŒã€‚ 在第二个 JSON(`json2`)中,`foo` 的值是一个空 object。由于它是一个 object,`MessageHandler::StartObject()` 会被调用。然而,在 `state_ = kExpectValue` 的情况下,该函数会返回 `false`,并导致解æžè¿‡ç¨‹ç»ˆæ­¢ã€‚é”™è¯¯ä»£ç æ˜¯ `kParseErrorTermination`。 ## 过滤 JSON {#Filtering} 如å‰é¢æåŠè¿‡ï¼Œ`Writer` å¯å¤„ç† `Reader` å‘出的事件。`example/condense/condense.cpp` 例å­ç®€å•地设置 `Writer` 作为一个 `Reader` 的处ç†å™¨ï¼Œå› æ­¤å®ƒèƒ½ç§»é™¤ JSON 中的所有空白字符。`example/pretty/pretty.cpp` 例å­ä½¿ç”¨åŒæ ·çš„å…³ç³»ï¼Œåªæ˜¯ä»¥ `PrettyWriter` å–代 `Writer`。因此 `pretty` èƒ½å¤Ÿé‡æ–°æ ¼å¼åŒ– JSONï¼ŒåŠ å…¥ç¼©è¿›åŠæ¢è¡Œã€‚ 实际上,我们å¯ä»¥ä½¿ç”¨ SAX 风格 API 去加入(多个)中间层去过滤 JSON 的内容。例如 `capitalize` 例å­å¯ä»¥æŠŠæ‰€æœ‰ JSON string 改为大写。 ~~~~~~~~~~cpp #include "rapidjson/reader.h" #include "rapidjson/writer.h" #include "rapidjson/filereadstream.h" #include "rapidjson/filewritestream.h" #include "rapidjson/error/en.h" #include #include using namespace rapidjson; template struct CapitalizeFilter { CapitalizeFilter(OutputHandler& out) : out_(out), buffer_() { } bool Null() { return out_.Null(); } bool Bool(bool b) { return out_.Bool(b); } bool Int(int i) { return out_.Int(i); } bool Uint(unsigned u) { return out_.Uint(u); } bool Int64(int64_t i) { return out_.Int64(i); } bool Uint64(uint64_t u) { return out_.Uint64(u); } bool Double(double d) { return out_.Double(d); } bool RawNumber(const char* str, SizeType length, bool copy) { return out_.RawNumber(str, length, copy); } bool String(const char* str, SizeType length, bool) { buffer_.clear(); for (SizeType i = 0; i < length; i++) buffer_.push_back(std::toupper(str[i])); return out_.String(&buffer_.front(), length, true); // true = output handler need to copy the string } bool StartObject() { return out_.StartObject(); } bool Key(const char* str, SizeType length, bool copy) { return String(str, length, copy); } bool EndObject(SizeType memberCount) { return out_.EndObject(memberCount); } bool StartArray() { return out_.StartArray(); } bool EndArray(SizeType elementCount) { return out_.EndArray(elementCount); } OutputHandler& out_; std::vector buffer_; }; int main(int, char*[]) { // Prepare JSON reader and input stream. Reader reader; char readBuffer[65536]; FileReadStream is(stdin, readBuffer, sizeof(readBuffer)); // Prepare JSON writer and output stream. char writeBuffer[65536]; FileWriteStream os(stdout, writeBuffer, sizeof(writeBuffer)); Writer writer(os); // JSON reader parse from the input stream and let writer generate the output. CapitalizeFilter > filter(writer); if (!reader.Parse(is, filter)) { fprintf(stderr, "\nError(%u): %s\n", (unsigned)reader.GetErrorOffset(), GetParseError_En(reader.GetParseErrorCode())); return 1; } return 0; } ~~~~~~~~~~ 注æ„到,ä¸å¯ç®€å•地把 JSON 当作字符串去改为大写。例如: ~~~~~~~~~~ ["Hello\nWorld"] ~~~~~~~~~~ 简å•地把整个 JSON 转为大写的è¯ä¼šäº§ç”Ÿé”™è¯¯çš„转义符: ~~~~~~~~~~ ["HELLO\NWORLD"] ~~~~~~~~~~ 而 `capitalize` 就会产生正确的结果: ~~~~~~~~~~ ["HELLO\nWORLD"] ~~~~~~~~~~ 我们还å¯ä»¥å¼€å‘æ›´å¤æ‚的过滤器。然而,由于 SAX 风格 API 在æŸä¸€æ—¶é—´ç‚¹åªèƒ½æä¾›å•一事件的信æ¯ï¼Œä½¿ç”¨è€…需è¦è‡ªè¡Œè®°å½•一些上下文信æ¯ï¼ˆä¾‹å¦‚从根节点起的路径ã€å‚¨å­˜å…¶ä»–ç›¸å…³å€¼ï¼‰ã€‚å¯¹äºŽå¤„ç†æŸäº›æƒ…况,用 DOM 会比 SAX 更容易实现。 asymptote-3.05/LspCpp/third_party/rapidjson/doc/faq.zh-cn.md0000644000000000000000000003526615031566105022601 0ustar rootroot# 常è§é—®é¢˜ [TOC] ## 一般问题 1. RapidJSON 是什么? RapidJSON 是一个 C++ 库,用于解æžåŠç”Ÿæˆ JSON。读者å¯å‚考它的所有 [特点](doc/features.zh-cn.md)。 2. 为什么称作 RapidJSON? å®ƒçš„çµæ„Ÿæ¥è‡ªäºŽ [RapidXML](http://rapidxml.sourceforge.net/),RapidXML 是一个高速的 XML DOM è§£æžå™¨ã€‚ 3. RapidJSON 与 RapidXML 相似么? RapidJSON 借镜了 RapidXML 的一些设计, 包括原ä½ï¼ˆ*in situ*)解æžã€åªæœ‰å¤´æ–‡ä»¶çš„库。但两者的 API 是完全ä¸åŒçš„。此外 RapidJSON 也æä¾›è®¸å¤š RapidXML 没有的特点。 4. RapidJSON 是å…费的么? 是的,它在 MIT å议下å…费。它å¯ç”¨äºŽå•†ä¸šè½¯ä»¶ã€‚详情请å‚看 [license.txt](https://github.com/Tencent/rapidjson/blob/master/license.txt)。 5. RapidJSON 很å°ä¹ˆï¼Ÿå®ƒæœ‰ä½•ä¾èµ–? 是的。在 Windows ä¸Šï¼Œä¸€ä¸ªè§£æž JSON 并打å°å‡ºç»Ÿè®¡çš„坿‰§è¡Œæ–‡ä»¶å°‘于 30KB。 RapidJSON ä»…ä¾èµ–于 C++ 标准库。 6. 怎样安装 RapidJSON? è§ [安装一节](../readme.zh-cn.md#安装)。 7. RapidJSON 能å¦è¿è¡ŒäºŽæˆ‘的平å°ï¼Ÿ 社区已在多个æ“作系统ï¼ç¼–译器ï¼CPU 架构的组åˆä¸Šæµ‹è¯• RapidJSON。但我们无法确ä¿å®ƒèƒ½è¿è¡ŒäºŽä½ ç‰¹å®šçš„å¹³å°ä¸Šã€‚åªéœ€è¦ç”ŸæˆåŠæ‰§è¡Œå•元测试便能获å–答案。 8. RapidJSON æ”¯æŒ C++03 么?C++11 呢? RapidJSON 开始时在 C++03 ä¸Šå®žçŽ°ã€‚åŽæ¥åŠ å…¥äº†å¯é€‰çš„ C++11 特性支æŒï¼ˆå¦‚转移构造函数ã€`noexcept`)。RapidJSON 应该兼容所有éµä»Ž C++03 或 C++11 的编译器。 9. RapidJSON 是å¦çœŸçš„用于实际应用? 是的。它被é…置于å‰å°åŠåŽå°çš„真实应用中。一个社区æˆå‘˜è¯´ RapidJSON åœ¨ä»–ä»¬çš„ç³»ç»Ÿä¸­æ¯æ—¥è§£æž 5 åƒä¸‡ä¸ª JSON。 10. RapidJSON 是如何被测试的? RapidJSON 包å«ä¸€ç»„å•元测试去执行自动测试。[Travis](https://travis-ci.org/Tencent/rapidjson/)(供 Linux å¹³å°ï¼‰åŠ [AppVeyor](https://ci.appveyor.com/project/Tencent/rapidjson/)(供 Windows å¹³å°ï¼‰ä¼šå¯¹æ‰€æœ‰ä¿®æ”¹è¿›è¡Œç¼–è¯‘åŠæ‰§è¡Œå•元测试。在 Linux 下还会使用 Valgrind 去检测内存泄æ¼ã€‚ 11. RapidJSON æ˜¯å¦æœ‰å®Œæ•´çš„æ–‡æ¡£ï¼Ÿ RapidJSON æä¾›äº†ä½¿ç”¨æ‰‹å†ŒåŠ API 说明文档。 12. 有没有其他替代å“? 有许多替代å“。例如 [nativejson-benchmark](https://github.com/miloyip/nativejson-benchmark) 列出了一些开æºçš„ C/C++ JSON 库。[json.org](http://www.json.org/) 也有一个列表。 ## JSON 1. 什么是 JSON? JSON (JavaScript Object Notation) 是一个轻é‡çš„æ•°æ®äº¤æ¢æ ¼å¼ã€‚它使用人类å¯è¯»çš„æ–‡æœ¬æ ¼å¼ã€‚更多关于 JSON 的细节å¯è€ƒ [RFC7159](http://www.ietf.org/rfc/rfc7159.txt) åŠ [ECMA-404](http://www.ecma-international.org/publications/standards/Ecma-404.htm)。 2. JSON 有什么应用场åˆï¼Ÿ JSON 常用于网页应用程åºï¼Œä»¥ä¼ é€ç»“构化数æ®ã€‚它也å¯ä½œä¸ºæ–‡ä»¶æ ¼å¼ç”¨äºŽæ•°æ®æŒä¹…化。 3. RapidJSON 是å¦ç¬¦åˆ JSON 标准? 是。RapidJSON å®Œå…¨ç¬¦åˆ [RFC7159](http://www.ietf.org/rfc/rfc7159.txt) åŠ [ECMA-404](http://www.ecma-international.org/publications/standards/Ecma-404.htm)。它能处ç†ä¸€äº›ç‰¹æ®Šæƒ…å†µï¼Œä¾‹å¦‚æ”¯æŒ JSON å­—ç¬¦ä¸²ä¸­å«æœ‰ç©ºå­—符åŠä»£ç†å¯¹ï¼ˆsurrogate pair)。 4. RapidJSON æ˜¯å¦æ”¯æŒå®½æ¾çš„语法? ç›®å‰ä¸æ”¯æŒã€‚RapidJSON åªæ”¯æŒä¸¥æ ¼çš„æ ‡å‡†æ ¼å¼ã€‚宽æ¾è¯­æ³•å¯ä»¥åœ¨è¿™ä¸ª [issue](https://github.com/Tencent/rapidjson/issues/36) 中进行讨论。 ## DOM 与 SAX 1. 什么是 DOM 风格 API? Document Object Model(DOM)是一个储存于内存的 JSON 表示方å¼ï¼Œç”¨äºŽæŸ¥è¯¢åŠä¿®æ”¹ JSON。 2. 什么是 SAX 风格 API? SAX 是一个事件驱动的 API,用于解æžåŠç”Ÿæˆ JSON。 3. 我应用 DOM 还是 SAX? DOM 易于查询åŠä¿®æ”¹ã€‚SAX 则是éžå¸¸å¿«åŠçœå†…存的,但通常较难使用。 4. 什么是原ä½ï¼ˆ*in situ*)解æžï¼Ÿ 原ä½è§£æžä¼šæŠŠ JSON 字符串直接解ç è‡³è¾“入的 JSON 中。这是一个优化,å¯å‡å°‘å†…å­˜æ¶ˆè€—åŠæå‡æ€§èƒ½ï¼Œä½†è¾“入的 JSON 会被更改。进一步细节请å‚考 [原ä½è§£æž](doc/dom.zh-cn.md) 。 5. 什么时候会产生解æžé”™è¯¯ï¼Ÿ 当输入的 JSON 包å«éžæ³•语法,或ä¸èƒ½è¡¨ç¤ºä¸€ä¸ªå€¼ï¼ˆå¦‚ Number 太大),或解æžå™¨çš„处ç†å™¨ä¸­æ–­è§£æžè¿‡ç¨‹ï¼Œè§£æžå™¨éƒ½ä¼šäº§ç”Ÿä¸€ä¸ªé”™è¯¯ã€‚详情请å‚考 [è§£æžé”™è¯¯](doc/dom.zh-cn.md)。 6. 有什么错误信æ¯ï¼Ÿ 错误信æ¯å­˜å‚¨åœ¨ `ParseResult`,它包å«é”™è¯¯ä»£å·åŠå移值(从 JSON 开始至错误处的字符数目)。å¯ä»¥æŠŠé”™è¯¯ä»£å·ç¿»è¯‘为人类å¯è¯»çš„错误讯æ¯ã€‚ 7. 为何ä¸åªä½¿ç”¨ `double` 去表示 JSON number? 一些应用需è¦ä½¿ç”¨ 64 使— å·ï¼æœ‰å·æ•´æ•°ã€‚这些整数ä¸èƒ½æ— æŸåœ°è½¬æ¢æˆ `double`。因此解æžå™¨ä¼šæ£€æµ‹ä¸€ä¸ª JSON number 是å¦èƒ½è½¬æ¢è‡³å„ç§æ•´æ•°ç±»åž‹åŠ `double`。 8. 如何清空并最å°åŒ– `document` 或 `value` 的容é‡ï¼Ÿ 调用 `SetXXX()` 方法 - è¿™äº›æ–¹æ³•ä¼šè°ƒç”¨æžæž„函数,并é‡å»ºç©ºçš„ Object 或 Array: ~~~~~~~~~~cpp Document d; ... d.SetObject(); // clear and minimize ~~~~~~~~~~ å¦å¤–,也å¯ä»¥å‚考在 [C++ swap with temporary idiom](https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Clear-and-minimize) 中的一ç§ç­‰ä»·çš„æ–¹æ³•: ~~~~~~~~~~cpp Value(kObjectType).Swap(d); ~~~~~~~~~~ 或者,使用这个ç¨å¾®é•¿ä¸€ç‚¹çš„代ç ä¹Ÿèƒ½å®ŒæˆåŒæ ·çš„事情: ~~~~~~~~~~cpp d.Swap(Value(kObjectType).Move()); ~~~~~~~~~~ 9. 如何将一个 `document` 节点æ’入到å¦ä¸€ä¸ª `document` 中? 比如有以下两个 document(DOM): ~~~~~~~~~~cpp Document person; person.Parse("{\"person\":{\"name\":{\"first\":\"Adam\",\"last\":\"Thomas\"}}}"); Document address; address.Parse("{\"address\":{\"city\":\"Moscow\",\"street\":\"Quiet\"}}"); ~~~~~~~~~~ å‡è®¾æˆ‘们希望将整个 `address` æ’入到 `person` 中,作为其的一个å­èŠ‚ç‚¹: ~~~~~~~~~~js { "person": { "name": { "first": "Adam", "last": "Thomas" }, "address": { "city": "Moscow", "street": "Quiet" } } } ~~~~~~~~~~ 在æ’å…¥èŠ‚ç‚¹çš„è¿‡ç¨‹ä¸­éœ€è¦æ³¨æ„ `document` å’Œ `value` 的生命周期并且正确地使用 allocator 进行内存分é…和管ç†ã€‚ ä¸€ä¸ªç®€å•æœ‰æ•ˆçš„æ–¹æ³•就是修改上述 `address` å˜é‡çš„定义,让其使用 `person` çš„ allocator åˆå§‹åŒ–,然åŽå°†å…¶æ·»åŠ åˆ°æ ¹èŠ‚ç‚¹ã€‚ ~~~~~~~~~~cpp Documnet address(&person.GetAllocator()); ... person["person"].AddMember("address", address["address"], person.GetAllocator()); ~~~~~~~~~~ å½“ç„¶ï¼Œå¦‚æžœä½ ä¸æƒ³é€šè¿‡æ˜¾å¼åœ°å†™å‡º `address` çš„ key æ¥å¾—到其值,å¯ä»¥ä½¿ç”¨è¿­ä»£å™¨æ¥å®žçް: ~~~~~~~~~~cpp auto addressRoot = address.MemberBegin(); person["person"].AddMember(addressRoot->name, addressRoot->value, person.GetAllocator()); ~~~~~~~~~~ 此外,还å¯ä»¥é€šè¿‡æ·±æ‹·è´ address document æ¥å®žçް: ~~~~~~~~~~cpp Value addressValue = Value(address["address"], person.GetAllocator()); person["person"].AddMember("address", addressValue, person.GetAllocator()); ~~~~~~~~~~ ## Document/Value (DOM) 1. 什么是转移语义?为什么? `Value` ä¸ç”¨å¤åˆ¶è¯­ä¹‰ï¼Œè€Œä½¿ç”¨äº†è½¬ç§»è¯­ä¹‰ã€‚è¿™æ˜¯æŒ‡ï¼Œå½“æŠŠæ¥æºå€¼èµ‹å€¼äºŽç›®æ ‡å€¼æ—¶ï¼Œæ¥æºå€¼çš„æ‰€æœ‰æƒä¼šè½¬ç§»è‡³ç›®æ ‡å€¼ã€‚ 由于转移快于å¤åˆ¶ï¼Œæ­¤è®¾è®¡å†³å®šå¼ºè¿«ä½¿ç”¨è€…注æ„到å¤åˆ¶çš„æ¶ˆè€—。 2. 怎样去å¤åˆ¶ä¸€ä¸ªå€¼ï¼Ÿ 有两个 API å¯ç”¨ï¼šå« allocator çš„æž„é€ å‡½æ•°ï¼Œä»¥åŠ `CopyFrom()`。å¯å‚考 [æ·±å¤åˆ¶ Value](doc/tutorial.zh-cn.md) 里的用例。 3. ä¸ºä»€ä¹ˆæˆ‘éœ€è¦æä¾›å­—ç¬¦ä¸²çš„é•¿åº¦ï¼Ÿ 由于 C 字符串是空字符结尾的,需è¦ä½¿ç”¨ `strlen()` åŽ»è®¡ç®—å…¶é•¿åº¦ï¼Œè¿™æ˜¯çº¿æ€§å¤æ‚度的æ“作。若使用者已知字符串的长度,对很多æ“作æ¥è¯´ä¼šé€ æˆä¸å¿…è¦çš„æ¶ˆè€—。 此外,RapidJSON å¯å¤„ç†å«æœ‰ `\u0000`ï¼ˆç©ºå­—ç¬¦ï¼‰çš„å­—ç¬¦ä¸²ã€‚è‹¥ä¸€ä¸ªå­—ç¬¦ä¸²å«æœ‰ç©ºå­—符,`strlen()` 便ä¸èƒ½è¿”å›žçœŸæ­£çš„å­—ç¬¦ä¸²é•¿åº¦ã€‚åœ¨è¿™ç§æƒ…况下使用者必须明确地æä¾›å­—符串长度。 4. 为什么在许多 DOM æ“作 API ä¸­è¦æä¾›åˆ†é…å™¨ä½œä¸ºå‚æ•°ï¼Ÿ 由于这些 API 是 `Value` çš„æˆå‘˜å‡½æ•°ï¼Œæˆ‘们ä¸å¸Œæœ›ä¸ºæ¯ä¸ª `Value` 储存一个分é…器指针。 5. 它会转æ¢å„ç§æ•°å€¼ç±»åž‹ä¹ˆï¼Ÿ 当使用 `GetInt()`ã€`GetUint()` ç­‰ API 时,å¯èƒ½ä¼šå‘生转æ¢ã€‚对于整数至整数转æ¢ï¼Œä»…当ä¿è¯è½¬æ¢å®‰å…¨æ‰ä¼šè½¬æ¢ï¼ˆå¦åˆ™ä¼šæ–­è¨€å¤±è´¥ï¼‰ã€‚然而,当把一个 64 使œ‰å·ï¼æ— å·æ•´æ•°è½¬æ¢è‡³ double 时,它会转æ¢ï¼Œä½†æœ‰å¯èƒ½ä¼šæŸå¤±ç²¾åº¦ã€‚嫿œ‰å°æ•°çš„æ•°å­—ã€æˆ–大于 64 ä½çš„æ•´æ•°ï¼Œéƒ½åªèƒ½ä½¿ç”¨ `GetDouble()` 获å–其值。 ## Reader/Writer (SAX) 1. 为什么ä¸ä»…仅用 `printf` 输出一个 JSONï¼Ÿä¸ºä»€ä¹ˆéœ€è¦ `Writer`? 最é‡è¦çš„æ˜¯ï¼Œ`Writer` 能确ä¿è¾“出的 JSON æ˜¯æ ¼å¼æ­£ç¡®çš„。错误地调用 SAX 事件(如 `StartObject()` é”™é… `EndArray()`ï¼‰ä¼šé€ æˆæ–­è¨€å¤±è´¥ã€‚此外,`Writer` 会把字符串进行转义(如 `\n`)。最åŽï¼Œ`printf()` 的数值输出å¯èƒ½å¹¶ä¸æ˜¯ä¸€ä¸ªåˆæ³•çš„ JSON number,特别是æŸäº› locale 会有数字分隔符。而且 `Writer` çš„æ•°å€¼å­—ç¬¦ä¸²è½¬æ¢æ˜¯ä½¿ç”¨éžå¸¸å¿«çš„算法æ¥å®žçŽ°çš„ï¼Œèƒœè¿‡ `printf()` åŠ `iostream`。 2. æˆ‘èƒ½å¦æš‚åœè§£æžè¿‡ç¨‹ï¼Œå¹¶åœ¨ç¨åŽç»§ç»­ï¼Ÿ 基于性能考虑,目å‰ç‰ˆæœ¬å¹¶ä¸ç›´æŽ¥æ”¯æŒæ­¤åŠŸèƒ½ã€‚ç„¶è€Œï¼Œè‹¥æ‰§è¡ŒçŽ¯å¢ƒæ”¯æŒå¤šçº¿ç¨‹ï¼Œä½¿ç”¨è€…å¯ä»¥åœ¨å¦ä¸€çº¿ç¨‹è§£æž JSON,并通过阻塞输入æµåŽ»æš‚åœã€‚ ## Unicode 1. å®ƒæ˜¯å¦æ”¯æŒ UTF-8ã€UTF-16 åŠå…¶ä»–æ ¼å¼ï¼Ÿ æ˜¯ã€‚å®ƒå®Œå…¨æ”¯æŒ UTF-8ã€UTF-16(大端ï¼å°ç«¯ï¼‰ã€UTF-32(大端ï¼å°ç«¯ï¼‰åŠ ASCII。 2. å®ƒèƒ½å¦æ£€æµ‹ç¼–ç çš„åˆæ³•性? 能。åªéœ€æŠŠ `kParseValidateEncodingFlag` å‚考传给 `Parse()`。若å‘现在输入æµä¸­æœ‰éžæ³•的编ç ï¼Œå®ƒå°±ä¼šäº§ç”Ÿ `kParseErrorStringInvalidEncoding` 错误。 3. 什么是代ç†å¯¹ï¼ˆsurrogate pair)?RapidJSON æ˜¯å¦æ”¯æŒï¼Ÿ JSON 使用 UTF-16 ç¼–ç åŽ»è½¬ä¹‰ Unicode 字符,例如 `\u5927` 表示中文字“大â€ã€‚è¦å¤„ç†åŸºæœ¬å¤šæ–‡ç§å¹³é¢ï¼ˆbasic multilingual plane,BMP)以外的字符时,UTF-16 ä¼šæŠŠé‚£äº›å­—ç¬¦ç¼–ç æˆä¸¤ä¸ª 16 ä½å€¼ï¼Œè¿™ç§°ä¸º UTF-16 代ç†å¯¹ã€‚例如,绘文字字符 U+1F602 在 JSON 中å¯è¢«ç¼–ç æˆ `\uD83D\uDE02`。 RapidJSON 完全支æŒè§£æžåŠç”Ÿæˆ UTF-16 代ç†å¯¹ã€‚ 4. 它能å¦å¤„ç† JSON 字符串中的 `\u0000`(空字符)? 能。RapidJSON å®Œå…¨æ”¯æŒ JSON å­—ç¬¦ä¸²ä¸­çš„ç©ºå­—ç¬¦ã€‚ç„¶è€Œï¼Œä½¿ç”¨è€…éœ€è¦æ³¨æ„到这件事,并使用 `GetStringLength()` åŠç›¸å…³ API 去å–得字符串真正长度。 5. 能å¦å¯¹æ‰€æœ‰éž ASCII å­—ç¬¦è¾“å‡ºæˆ `\uxxxx` å½¢å¼ï¼Ÿ å¯ä»¥ã€‚åªè¦åœ¨ `Writer` 中使用 `ASCII<>` 作为输出编ç å‚数,就å¯ä»¥å¼ºé€¼è½¬ä¹‰é‚£äº›å­—符。 ## æµ 1. 我有一个很大的 JSON æ–‡ä»¶ã€‚æˆ‘åº”å¦æŠŠå®ƒæ•´ä¸ªè½½å…¥å†…å­˜ä¸­ï¼Ÿ 使用者å¯ä½¿ç”¨ `FileReadStream` 去é€å—读入文件。但若使用于原ä½è§£æžï¼Œå¿…须载入整个文件。 2. 我能å¦è§£æžä¸€ä¸ªä»Žç½‘络上串æµè¿›æ¥çš„ JSON? å¯ä»¥ã€‚ä½¿ç”¨è€…å¯æ ¹æ® `FileReadStream` 的实现,去实现一个自定义的æµã€‚ 3. 我ä¸çŸ¥é“一些 JSON 将会使用哪ç§ç¼–ç ã€‚怎样处ç†å®ƒä»¬ï¼Ÿ ä½ å¯ä»¥ä½¿ç”¨ `AutoUTFInputStream`,它能自动检测输入æµçš„ç¼–ç ã€‚然而,它会带æ¥ä¸€äº›æ€§èƒ½å¼€é”€ã€‚ 4. 什么是 BOM?RapidJSON 怎样处ç†å®ƒï¼Ÿ [å­—èŠ‚é¡ºåºæ ‡è®°ï¼ˆbyte order mark, BOM)](http://en.wikipedia.org/wiki/Byte_order_mark) æœ‰æ—¶ä¼šå‡ºçŽ°äºŽæ–‡ä»¶ï¼æµçš„开始,以表示其 UTF ç¼–ç ç±»åž‹ã€‚ RapidJSON çš„ `EncodedInputStream` 坿£€æµ‹ï¼è·³è¿‡ BOM。`EncodedOutputStream` å¯é€‰æ‹©æ˜¯å¦å†™å…¥ BOM。å¯å‚考 [ç¼–ç æµ](doc/stream.zh-cn.md) 中的例å­ã€‚ 5. 为什么会涉åŠå¤§ç«¯ï¼å°ç«¯ï¼Ÿ æµçš„大端ï¼å°ç«¯æ˜¯ UTF-16 åŠ UTF-32 æµè¦å¤„ç†çš„问题,而 UTF-8 ä¸éœ€è¦å¤„ç†ã€‚ ## 性能 1. RapidJSON 是å¦çœŸçš„快? 是。它å¯èƒ½æ˜¯æœ€å¿«çš„å¼€æº JSON 库。有一个 [评测](https://github.com/miloyip/nativejson-benchmark) 评估 C/C++ JSON 库的性能。 2. 为什么它会快? RapidJSON 的许多设计是针对时间ï¼ç©ºé—´æ€§èƒ½æ¥è®¾è®¡çš„,这些决定å¯èƒ½ä¼šå½±å“ API 的易用性。此外,它也使用了许多底层优化(内部函数ï¼intrinsicã€SIMD)åŠç‰¹åˆ«çš„算法(自定义的 double 至字符串转æ¢ã€å­—符串至 double 的转æ¢ï¼‰ã€‚ 3. 什是是 SIMD?它如何用于 RapidJSON? [SIMD](http://en.wikipedia.org/wiki/SIMD) 指令å¯ä»¥åœ¨çް代 CPU 中执行并行è¿ç®—。RapidJSON 支æŒä½¿ç”¨ Intel çš„ SSE2/SSE4.2 å’Œ ARM çš„ Neon æ¥åŠ é€Ÿå¯¹ç©ºç™½ç¬¦ã€åˆ¶è¡¨ç¬¦ã€å›žè½¦ç¬¦å’Œæ¢è¡Œç¬¦çš„过滤处ç†ã€‚在解æžå«ç¼©è¿›çš„ JSON 时,这能æå‡æ€§èƒ½ã€‚åªè¦å®šä¹‰å为 `RAPIDJSON_SSE2` ,`RAPIDJSON_SSE42` 或 `RAPIDJSON_NEON` çš„å®ï¼Œå°±èƒ½å¯åŠ¨è¿™ä¸ªåŠŸèƒ½ã€‚ç„¶è€Œï¼Œè‹¥åœ¨ä¸æ”¯æŒè¿™äº›æŒ‡ä»¤é›†çš„æœºå™¨ä¸Šæ‰§è¡Œè¿™äº›å¯æ‰§è¡Œæ–‡ä»¶ï¼Œä¼šå¯¼è‡´å´©æºƒã€‚ 4. 它会消耗许多内存么? RapidJSON 的设计目标是å‡ä½Žå†…å­˜å ç”¨ã€‚ 在 SAX API 中,`Reader` 消耗的内存与 JSON 树深度加上最长 JSON å­—ç¬¦æˆæ­£æ¯”。 在 DOM API 中,æ¯ä¸ª `Value` 在 32/64 使ž¶æž„下分别消耗 16/24 字节。RapidJSON 也使用一个特殊的内存分é…器去å‡å°‘分é…çš„é¢å¤–开销。 5. 高性能的æ„义何在? 有些应用程åºéœ€è¦å¤„ç†éžå¸¸å¤§çš„ JSON 文件。而有些åŽå°åº”用程åºéœ€è¦å¤„ç†å¤§é‡çš„ JSONã€‚è¾¾åˆ°é«˜æ€§èƒ½åŒæ—¶æ”¹å–„å»¶æ—¶åŠåžåé‡ã€‚更广义æ¥è¯´ï¼Œè¿™ä¹Ÿå¯ä»¥èŠ‚çœèƒ½æºã€‚ ## å…«å¦ 1. è°æ˜¯ RapidJSON 的开å‘者? å¶åŠ²å³°ï¼ˆMilo Yip,[miloyip](https://github.com/miloyip))是 RapidJSON 的原作者。全世界许多贡献者一直在改善 RapidJSON。Philipp A. Hartmann([pah](https://github.com/pah))实现了许多改进,也设置了自动化测试,而且还å‚ä¸Žè®¸å¤šç¤¾åŒºè®¨è®ºã€‚ä¸æ¬§å—(Don Ding,[thebusytypist](https://github.com/thebusytypist))实现了迭代å¼è§£æžå™¨ã€‚Andrii Senkovych([jollyroger](https://github.com/jollyroger))完æˆäº†å‘ CMake çš„è¿ç§»ã€‚Kosta([Kosta-Github](https://github.com/Kosta-Github))æä¾›äº†ä¸€ä¸ªéžå¸¸çµå·§çš„çŸ­å­—ç¬¦ä¸²ä¼˜åŒ–ã€‚ä¹Ÿéœ€è¦æ„Ÿè°¢å…¶ä»–献者åŠç¤¾åŒºæˆå‘˜ã€‚ 2. 为何你è¦å¼€å‘ RapidJSON? 在 2011 å¹´å¼€å§‹è¿™é¡¹ç›®æ—¶ï¼Œå®ƒåªæ˜¯ä¸€ä¸ªå…´è¶£é¡¹ç›®ã€‚Milo Yip 是一个游æˆç¨‹åºå‘˜ï¼Œä»–在那时候认识到 JSON 并希望在未æ¥çš„项目中使用。由于 JSON 好åƒå¾ˆç®€å•,他希望写一个快速的仅有头文件的程åºåº“。 3. 为什么开å‘中段有一段长期空档? ä¸»è¦æ˜¯ä¸ªäººå› ç´ ï¼Œä¾‹å¦‚加入新家庭æˆå‘˜ã€‚å¦å¤–,Milo Yip 也花了许多业余时间去翻译 Jason Gregory 的《Game Engine Architecture》至中文版《游æˆå¼•擎架构》。 4. 为什么这个项目从 Google Code æ¬åˆ° GitHub? 这是大势所趋,而且 GitHub æ›´ä¸ºå¼ºå¤§åŠæ–¹ä¾¿ã€‚ asymptote-3.05/LspCpp/third_party/rapidjson/doc/dom.zh-cn.md0000644000000000000000000003604115031566105022601 0ustar rootroot# DOM 文档对象模型(Document Object Model, DOM)是一ç§ç½äºŽå†…存中的 JSON 表示方å¼ï¼Œä»¥ä¾›æŸ¥è¯¢åŠæ“作。我们已于 [教程](doc/tutorial.zh-cn.md) 中介ç»äº† DOM 的基本用法,本节将讲述一些细节åŠé«˜çº§ç”¨æ³•。 [TOC] # æ¨¡æ¿ {#Template} 教程中使用了 `Value` å’Œ `Document` 类型。与 `std::string` 相似,这些类型其实是两个模æ¿ç±»çš„ `typedef`: ~~~~~~~~~~cpp namespace rapidjson { template > class GenericValue { // ... }; template > class GenericDocument : public GenericValue { // ... }; typedef GenericValue > Value; typedef GenericDocument > Document; } // namespace rapidjson ~~~~~~~~~~ 使用者å¯ä»¥è‡ªå®šä¹‰è¿™äº›æ¨¡æ¿å‚数。 ## ç¼–ç  {#Encoding} `Encoding` 傿•°æŒ‡æ˜Žåœ¨å†…存中的 JSON String 使用哪ç§ç¼–ç ã€‚å¯è¡Œçš„选项有 `UTF8`ã€`UTF16`ã€`UTF32`ã€‚è¦æ³¨æ„è¿™ 3 个类型其实也是模æ¿ç±»ã€‚`UTF8<>` ç­‰åŒ `UTF8`,这代表它使用 `char` æ¥å­˜å‚¨å­—符串。更多细节å¯ä»¥å‚考 [ç¼–ç ](doc/encoding.zh-cn.md)。 这里是一个例å­ã€‚å‡è®¾ä¸€ä¸ª Windows 应用软件希望查询存储于 JSON 中的本地化字符串。Windows ä¸­å« Unicode 的函数使用 UTF-16(宽字符)编ç ã€‚无论 JSON 文件使用哪ç§ç¼–ç ï¼Œæˆ‘们都å¯ä»¥æŠŠå­—符串以 UTF-16 å½¢å¼å­˜å‚¨åœ¨å†…存。 ~~~~~~~~~~cpp using namespace rapidjson; typedef GenericDocument > WDocument; typedef GenericValue > WValue; FILE* fp = fopen("localization.json", "rb"); // éž Windows å¹³å°ä½¿ç”¨ "r" char readBuffer[256]; FileReadStream bis(fp, readBuffer, sizeof(readBuffer)); AutoUTFInputStream eis(bis); // 包装 bis æˆ eis WDocument d; d.ParseStream<0, AutoUTF >(eis); const WValue locale(L"ja"); // Japanese MessageBoxW(hWnd, d[locale].GetString(), L"Test", MB_OK); ~~~~~~~~~~ ## 分é…器 {#Allocator} `Allocator` 定义当 `Document`/`Value` åˆ†é…æˆ–释放内存时使用那个分é…类。`Document` 拥有或引用到一个 `Allocator` 实例。而为了节çœå†…存,`Value` 没有这么åšã€‚ `GenericDocument` 的缺çœåˆ†é…器是 `MemoryPoolAllocator`。此分é…器实际上会顺åºåœ°åˆ†é…内存,并且ä¸èƒ½é€ä¸€é‡Šæ”¾ã€‚当è¦è§£æžä¸€ä¸ª JSON å¹¶ç”Ÿæˆ DOM,这ç§åˆ†é…器是éžå¸¸åˆé€‚的。 RapidJSON 还æä¾›å¦ä¸€ä¸ªåˆ†é…器 `CrtAllocator`,当中 CRT 是 C è¿è¡Œåº“(C RunTime library)的缩写。此分é…器简å•地读用标准的 `malloc()`/`realloc()`/`free()`。当我们需è¦è®¸å¤šå¢žå‡æ“作,这ç§åˆ†é…器会更为适åˆã€‚然而这ç§åˆ†é…器远远比 `MemoryPoolAllocator` 低效。 # è§£æž {#Parsing} `Document` æä¾›å‡ ä¸ªè§£æžå‡½æ•°ã€‚以下的 (1) 是根本的函数,其他都是调用 (1) çš„å助函数。 ~~~~~~~~~~cpp using namespace rapidjson; // (1) 根本 template GenericDocument& GenericDocument::ParseStream(InputStream& is); // (2) 使用æµçš„ç¼–ç  template GenericDocument& GenericDocument::ParseStream(InputStream& is); // (3) ä½¿ç”¨ç¼ºçœæ ‡å¿— template GenericDocument& GenericDocument::ParseStream(InputStream& is); // (4) 原ä½è§£æž template GenericDocument& GenericDocument::ParseInsitu(Ch* str); // (5) 原ä½è§£æžï¼Œä½¿ç”¨ç¼ºçœæ ‡å¿— GenericDocument& GenericDocument::ParseInsitu(Ch* str); // (6) 正常解æžä¸€ä¸ªå­—符串 template GenericDocument& GenericDocument::Parse(const Ch* str); // (7) 正常解æžä¸€ä¸ªå­—符串,使用 Document çš„ç¼–ç  template GenericDocument& GenericDocument::Parse(const Ch* str); // (8) 正常解æžä¸€ä¸ªå­—ç¬¦ä¸²ï¼Œä½¿ç”¨ç¼ºçœæ ‡å¿— GenericDocument& GenericDocument::Parse(const Ch* str); ~~~~~~~~~~ [教程](doc/tutorial.zh-cn.md) 中的例使用 (8) 去正常解æžå­—符串。而 [æµ](doc/stream.zh-cn.md) 的例å­ä½¿ç”¨å‰ 3 个函数。我们将ç¨åŽä»‹ç»åŽŸä½ï¼ˆ*In situ*) è§£æžã€‚ `parseFlags` æ˜¯ä»¥ä¸‹ä½æ ‡ç½®çš„组åˆï¼š è§£æžä½æ ‡å¿— | æ„义 ------------------------------|----------------------------------- `kParseNoFlags` | 没有任何标志。 `kParseDefaultFlags` | 缺çœçš„è§£æžé€‰é¡¹ã€‚它等于 `RAPIDJSON_PARSE_DEFAULT_FLAGS` å®ï¼Œæ­¤å®å®šä¹‰ä¸º `kParseNoFlags`。 `kParseInsituFlag` | 原ä½ï¼ˆç ´å性)解æžã€‚ `kParseValidateEncodingFlag` | 校验 JSON 字符串的编ç ã€‚ `kParseIterativeFlag` | 迭代å¼ï¼ˆè°ƒç”¨å †æ ˆå¤§å°ä¸ºå¸¸æ•°å¤æ‚度)解æžã€‚ `kParseStopWhenDoneFlag` | 当从æµè§£æžäº†ä¸€ä¸ªå®Œæ•´çš„ JSON 根节点之åŽï¼Œåœæ­¢ç»§ç»­å¤„ç†ä½™ä¸‹çš„æµã€‚å½“ä½¿ç”¨äº†æ­¤æ ‡å¿—ï¼Œè§£æžå™¨ä¾¿ä¸ä¼šäº§ç”Ÿ `kParseErrorDocumentRootNotSingular` 错误。å¯ä½¿ç”¨æœ¬æ ‡å¿—去解æžåŒä¸€ä¸ªæµé‡Œçš„多个 JSON。 `kParseFullPrecisionFlag` | ä½¿ç”¨å®Œæ•´çš„ç²¾ç¡®åº¦åŽ»è§£æžæ•°å­—(较慢)。如ä¸è®¾ç½®æ­¤æ ‡èŠ‚ï¼Œåˆ™ä¼šä½¿ç”¨æ­£å¸¸çš„ç²¾ç¡®åº¦ï¼ˆè¾ƒå¿«ï¼‰ã€‚æ­£å¸¸ç²¾ç¡®åº¦ä¼šæœ‰æœ€å¤š 3 个 [ULP](http://en.wikipedia.org/wiki/Unit_in_the_last_place) 的误差。 `kParseCommentsFlag` | 容许å•行 `// ...` åŠå¤šè¡Œ `/* ... */` 注释(放宽的 JSON 语法)。 `kParseNumbersAsStringsFlag` | æŠŠæ•°å­—ç±»åž‹è§£æžæˆå­—符串。 `kParseTrailingCommasFlag` | 容许在对象和数组结æŸå‰å«æœ‰é€—å·ï¼ˆæ”¾å®½çš„ JSON 语法)。 `kParseNanAndInfFlag` | 容许 `NaN`ã€`Inf`ã€`Infinity`ã€`-Inf` åŠ `-Infinity` 作为 `double` 值(放宽的 JSON 语法)。 `kParseEscapedApostropheFlag` | 容许字符串中转义å•å¼•å· `\'` (放宽的 JSON 语法)。 由于使用了éžç±»åž‹æ¨¡æ¿å‚æ•°ï¼Œè€Œä¸æ˜¯å‡½æ•°å‚数,C++ 编译器能为个别组åˆç”Ÿæˆä»£ç ï¼Œä»¥æ”¹å–„性能åŠå‡å°‘代ç å°ºå¯¸ï¼ˆå½“åªç”¨å•ç§ç‰¹åŒ–)。缺点是需è¦åœ¨ç¼–译期决定标志。 `SourceEncoding` 傿•°å®šä¹‰æµä½¿ç”¨äº†ä»€ä¹ˆç¼–ç ã€‚这与 `Document` çš„ `Encoding` ä¸ç›¸åŒã€‚细节å¯å‚考 [转ç å’Œæ ¡éªŒ](#TranscodingAndValidation) 一节。 此外 `InputStream` 是输入æµçš„类型。 ## è§£æžé”™è¯¯ {#ParseError} 当解æžè¿‡ç¨‹é¡ºåˆ©å®Œæˆï¼Œ`Document` ä¾¿ä¼šå«æœ‰è§£æžç»“果。当过程出现错误,原æ¥çš„ DOM 会*ç»´æŒä¸å˜*。å¯ä½¿ç”¨ `bool HasParseError()`ã€`ParseErrorCode GetParseError()` åŠ `size_t GetErrorOffset()` 获å–è§£æžçš„错误状æ€ã€‚ è§£æžé”™è¯¯ä»£å· | æè¿° --------------------------------------------|--------------------------------------------------- `kParseErrorNone` | 无错误。 `kParseErrorDocumentEmpty` | 文档是空的。 `kParseErrorDocumentRootNotSingular` | 文档的根åŽé¢ä¸èƒ½æœ‰å…¶å®ƒå€¼ã€‚ `kParseErrorValueInvalid` | ä¸åˆæ³•的值。 `kParseErrorObjectMissName` | Object æˆå‘˜ç¼ºå°‘å字。 `kParseErrorObjectMissColon` | Object æˆå‘˜åå­—åŽç¼ºå°‘冒å·ã€‚ `kParseErrorObjectMissCommaOrCurlyBracket` | Object æˆå‘˜åŽç¼ºå°‘逗巿ˆ– `}`。 `kParseErrorArrayMissCommaOrSquareBracket` | Array 元素åŽç¼ºå°‘逗巿ˆ– `]` 。 `kParseErrorStringUnicodeEscapeInvalidHex` | String 中的 `\\u` 转义符åŽå«éžåå…­è¿›ä½æ•°å­—。 `kParseErrorStringUnicodeSurrogateInvalid` | String 中的代ç†å¯¹ï¼ˆsurrogate pair)ä¸åˆæ³•。 `kParseErrorStringEscapeInvalid` | String å«éžæ³•转义字符。 `kParseErrorStringMissQuotationMark` | String 缺少关闭引å·ã€‚ `kParseErrorStringInvalidEncoding` | String å«éžæ³•ç¼–ç ã€‚ `kParseErrorNumberTooBig` | Number 的值太大,ä¸èƒ½å­˜å‚¨äºŽ `double`。 `kParseErrorNumberMissFraction` | Number ç¼ºå°‘äº†å°æ•°éƒ¨åˆ†ã€‚ `kParseErrorNumberMissExponent` | Number 缺少了指数。 错误的åç§»é‡å®šä¹‰ä¸ºä»Žæµå¼€å§‹è‡³é”™è¯¯å¤„的字符数é‡ã€‚ç›®å‰ RapidJSON ä¸è®°å½•错误行å·ã€‚ è¦å–得错误讯æ¯ï¼ŒRapidJSON 在 `rapidjson/error/en.h` 中æä¾›äº†è‹±æ–‡é”™è¯¯è®¯æ¯ã€‚使用者å¯ä»¥ä¿®æ”¹å®ƒç”¨äºŽå…¶ä»–语言环境,或使用一个自定义的本地化系统。 以下是一个处ç†é”™è¯¯çš„例å­ã€‚ ~~~~~~~~~~cpp #include "rapidjson/document.h" #include "rapidjson/error/en.h" // ... Document d; if (d.Parse(json).HasParseError()) { fprintf(stderr, "\nError(offset %u): %s\n", (unsigned)d.GetErrorOffset(), GetParseError_En(d.GetParseErrorCode())); // ... } ~~~~~~~~~~ ## 原ä½è§£æž {#InSituParsing} æ ¹æ® [维基百科](http://en.wikipedia.org/wiki/In_situ): > *In situ* ... is a Latin phrase that translates literally to "on site" or "in position". It means "locally", "on site", "on the premises" or "in place" to describe an event where it takes place, and is used in many different contexts. > ... > (In computer science) An algorithm is said to be an in situ algorithm, or in-place algorithm, if the extra amount of memory required to execute the algorithm is O(1), that is, does not exceed a constant no matter how large the input. For example, heapsort is an in situ sorting algorithm. > 翻译:*In situ*â€¦â€¦æ˜¯ä¸€ä¸ªæ‹‰ä¸æ–‡ç‰‡è¯­ï¼Œå­—é¢ä¸Šçš„æ„æ€æ˜¯æŒ‡ã€ŒçŽ°åœºã€ã€ã€Œåœ¨ä½ç½®ã€ã€‚在许多ä¸åŒè¯­å¢ƒä¸­ï¼Œå®ƒæè¿°ä¸€ä¸ªäº‹ä»¶å‘生的ä½ç½®ï¼Œæ„指「本地ã€ã€ã€ŒçŽ°åœºã€ã€ã€Œåœ¨å¤„所ã€ã€ã€Œå°±ä½ã€ã€‚ > …… > (在计算机科学中)一个算法若称为原ä½ç®—法,或在ä½ç®—法,是指执行该算法所需的é¢å¤–内存空间是 O(1) 的,æ¢å¥è¯è¯´ï¼Œæ— è®ºè¾“入大å°éƒ½åªéœ€è¦å¸¸æ•°ç©ºé—´ã€‚ä¾‹å¦‚ï¼Œå †æŽ’åºæ˜¯ä¸€ä¸ªåŽŸä½æŽ’åºç®—法。 在正常的解æžè¿‡ç¨‹ä¸­ï¼Œå¯¹ JSON string è§£ç å¹¶å¤åˆ¶è‡³å…¶ä»–缓冲区是一个很大的开销。原ä½è§£æžï¼ˆ*in situ* parsing)把这些 JSON string 直接解ç äºŽå®ƒåŽŸæ¥å­˜å‚¨çš„地方。由于解ç åŽçš„ string 长度总是短于或等于原æ¥å‚¨å­˜äºŽ JSON çš„ string,所以这是å¯è¡Œçš„。在这个语境下,对 JSON string è¿›è¡Œè§£ç æ˜¯æŒ‡å¤„ç†è½¬ä¹‰ç¬¦ï¼Œå¦‚ `"\n"`ã€`"\u1234"` 等,以åŠåœ¨ string æœ«ç«¯åŠ å…¥ç©ºç»ˆæ­¢ç¬¦å· (`'\0'`)。 以下的图比较正常åŠåŽŸä½è§£æžã€‚JSON string å€¼åŒ…å«æŒ‡å‘è§£ç åŽçš„字符串。 ![正常解æž](diagram/normalparsing.png) 在正常解æžä¸­ï¼Œè§£ç åŽçš„字符串被å¤åˆ¶è‡³å…¨æ–°åˆ†é…的缓冲区中。`"\\n"`(2 ä¸ªå­—ç¬¦ï¼‰è¢«è§£ç æˆ `"\n"`(1 个字符)。`"\\u0073"`(6 ä¸ªå­—ç¬¦ï¼‰è¢«è§£ç æˆ `"s"`(1 个字符)。 ![原ä½è§£æž](diagram/insituparsing.png) 原ä½è§£æžç›´æŽ¥ä¿®æ”¹äº†åŽŸæ¥çš„ JSON。图中高亮了被更新的字符。若 JSON string ä¸å«è½¬ä¹‰ç¬¦ï¼Œä¾‹å¦‚ `"msg"`,那么解æžè¿‡ç¨‹ä»…仅是以空字符代替结æŸåŒå¼•å·ã€‚ 由于原ä½è§£æžä¿®æ”¹äº†è¾“å…¥ï¼Œå…¶è§£æž API éœ€è¦ `char*` è€Œéž `const char*`。 ~~~~~~~~~~cpp // 把整个文件读入 buffer FILE* fp = fopen("test.json", "r"); fseek(fp, 0, SEEK_END); size_t filesize = (size_t)ftell(fp); fseek(fp, 0, SEEK_SET); char* buffer = (char*)malloc(filesize + 1); size_t readLength = fread(buffer, 1, filesize, fp); buffer[readLength] = '\0'; fclose(fp); // 原ä½è§£æž buffer 至 d,buffer 内容会被修改。 Document d; d.ParseInsitu(buffer); // 在此查询ã€ä¿®æ”¹ DOM…… free(buffer); // 注æ„:在这个ä½ç½®ï¼Œd å¯èƒ½å«æœ‰æŒ‡å‘已被释放的 buffer 的悬空指针 ~~~~~~~~~~ JSON string 会被打上 const-string 的标志。但它们å¯èƒ½å¹¶éžçœŸæ­£çš„「常数ã€ã€‚它的生命周期å–决于存储 JSON 的缓冲区。 原ä½è§£æžæŠŠåˆ†é…开销åŠå†…å­˜å¤åˆ¶å‡è‡³æœ€å°ã€‚通常这样åšèƒ½æ”¹å–„缓存一致性,而这对现代计算机æ¥è¯´æ˜¯ä¸€ä¸ªé‡è¦çš„æ€§èƒ½å› ç´ ã€‚ 原ä½è§£æžæœ‰ä»¥ä¸‹é™åˆ¶ï¼š 1. 整个 JSON 须存储在内存之中。 2. æµçš„æ¥æºç¼“ç ä¸Žæ–‡æ¡£çš„目标编ç å¿…须相åŒã€‚ 3. 需è¦ä¿ç•™ç¼“冲区,直至文档ä¸å†è¢«ä½¿ç”¨ã€‚ 4. è‹¥ DOM 需è¦åœ¨è§£æžåŽè¢«é•¿æœŸä½¿ç”¨ï¼Œè€Œ DOM å†…åªæœ‰å¾ˆå°‘ JSON string,ä¿ç•™ç¼“冲区å¯èƒ½é€ æˆå†…存浪费。 原ä½è§£æžæœ€é€‚åˆç”¨äºŽçŸ­æœŸçš„ã€ç”¨å®Œå³å¼ƒçš„ JSONã€‚å®žé™…åº”ç”¨ä¸­ï¼Œè¿™äº›åœºåˆæ˜¯éžå¸¸æ™®é的,例如ååºåˆ—化 JSON 至 C++ 对象ã€å¤„ç†ä»¥ JSON 表示的 web 请求等。 ## 转ç ä¸Žæ ¡éªŒ {#TranscodingAndValidation} RapidJSON 内部支æŒä¸åŒ Unicode æ ¼å¼ï¼ˆæ­£å¼çš„æœ¯è¯­æ˜¯ UCS å˜æ¢æ ¼å¼ï¼‰é—´çš„转æ¢ã€‚在 DOM è§£æžæ—¶ï¼Œæµçš„æ¥æºç¼–ç ä¸Ž DOM 的编ç å¯ä»¥ä¸åŒã€‚ä¾‹å¦‚ï¼Œæ¥æºæµå¯èƒ½å«æœ‰ UTF-8 çš„ JSON,而 DOM 则使用 UTF-16 ç¼–ç ã€‚在 [EncodedInputStream](doc/stream.zh-cn.md) 一节里有一个例å­ã€‚ 当从 DOM 输出一个 JSON 至输出æµä¹‹æ—¶ï¼Œä¹Ÿå¯ä»¥ä½¿ç”¨è½¬ç åŠŸèƒ½ã€‚åœ¨ [EncodedOutputStream](doc/stream.zh-cn.md) 一节里有一个例å­ã€‚ 在转ç è¿‡ç¨‹ä¸­ï¼Œä¼šæŠŠæ¥æº string è§£ç æˆ Unicode ç ç‚¹ï¼Œç„¶åŽæŠŠç ç‚¹ç¼–ç æˆç›®æ ‡æ ¼å¼ã€‚åœ¨è§£ç æ—¶ï¼Œå®ƒä¼šæ ¡éªŒæ¥æº string 的字节åºåˆ—是å¦åˆæ³•。若é‡ä¸Šéžåˆæ³•åºåˆ—,解æžå™¨ä¼šåœæ­¢å¹¶è¿”回 `kParseErrorStringInvalidEncoding` 错误。 å½“æ¥æºç¼–ç ä¸Ž DOM 的编ç ç›¸åŒï¼Œè§£æžå™¨ç¼ºçœåœ° * ä¸ä¼š * 校验åºåˆ—。使用者å¯å¼€å¯ `kParseValidateEncodingFlag` 去强制校验。 # 技巧 {#Techniques} 这里讨论一些 DOM API 的使用技巧。 ## 把 DOM 作为 SAX 事件å‘表者 在 RapidJSON 中,利用 `Writer` 把 DOM ç”Ÿæˆ JSON çš„åšæ³•ï¼Œçœ‹æ¥æœ‰ç‚¹å¥‡æ€ªã€‚ ~~~~~~~~~~cpp // ... Writer writer(buffer); d.Accept(writer); ~~~~~~~~~~ 实际上,`Value::Accept()` 是负责å‘布该值相关的 SAX 事件至处ç†å™¨çš„。通过这个设计,`Value` åŠ `Writer` 解除了å¶åˆã€‚`Value` å¯ç”Ÿæˆ SAX 事件,而 `Writer` 则å¯ä»¥å¤„ç†è¿™äº›äº‹ä»¶ã€‚ 使用者å¯ä»¥åˆ›å»ºè‡ªå®šä¹‰çš„处ç†å™¨ï¼ŒåŽ»æŠŠ DOM è½¬æ¢æˆå…¶å®ƒæ ¼å¼ã€‚例如,一个把 DOM è½¬æ¢æˆ XML 的处ç†å™¨ã€‚ è¦çŸ¥é“更多关于 SAX 事件与处ç†å™¨ï¼Œå¯å‚阅 [SAX](doc/sax.zh-cn.md)。 ## 使用者缓冲区 {#UserBuffer} 许多应用软件å¯èƒ½éœ€è¦å°½é‡å‡å°‘内存分é…。 `MemoryPoolAllocator` å¯ä»¥å¸®åŠ©è¿™æ–¹é¢ï¼Œå®ƒå®¹è®¸ä½¿ç”¨è€…æä¾›ä¸€ä¸ªç¼“冲区。该缓冲区å¯èƒ½ç½®äºŽç¨‹åºå †æ ˆï¼Œæˆ–æ˜¯ä¸€ä¸ªé™æ€åˆ†é…的「è‰ç¨¿ç¼“冲区(scratch buffer)ã€ï¼ˆä¸€ä¸ªé™æ€ï¼å…¨å±€çš„æ•°ç»„),用于储存临时数æ®ã€‚ `MemoryPoolAllocator` 会先用使用者缓冲区去解决分é…请求。当使用者缓冲区用完,就会从基础分é…器(缺çœä¸º `CrtAllocator`)分é…一å—内存。 以下是使用堆栈内存的例å­ï¼Œç¬¬ä¸€ä¸ªåˆ†é…å™¨ç”¨äºŽå­˜å‚¨å€¼ï¼Œç¬¬äºŒä¸ªç”¨äºŽè§£æžæ—¶çš„临时缓冲。 ~~~~~~~~~~cpp typedef GenericDocument, MemoryPoolAllocator<>, MemoryPoolAllocator<>> DocumentType; char valueBuffer[4096]; char parseBuffer[1024]; MemoryPoolAllocator<> valueAllocator(valueBuffer, sizeof(valueBuffer)); MemoryPoolAllocator<> parseAllocator(parseBuffer, sizeof(parseBuffer)); DocumentType d(&valueAllocator, sizeof(parseBuffer), &parseAllocator); d.Parse(json); ~~~~~~~~~~ è‹¥è§£æžæ—¶åˆ†é…总é‡å°‘于 4096+1024 字节时,这段代ç ä¸ä¼šé€ æˆä»»ä½•堆内存分é…ï¼ˆç» `new` 或 `malloc()`)。 使用者å¯ä»¥é€šè¿‡ `MemoryPoolAllocator::Size()` 查询当å‰å·²åˆ†çš„内存大å°ã€‚那么使用者å¯ä»¥æ‹Ÿå®šä½¿ç”¨è€…缓冲区的åˆé€‚大å°ã€‚ asymptote-3.05/LspCpp/third_party/rapidjson/doc/sax.md0000644000000000000000000005143415031566105021602 0ustar rootroot# SAX The term "SAX" originated from [Simple API for XML](http://en.wikipedia.org/wiki/Simple_API_for_XML). We borrowed this term for JSON parsing and generation. In RapidJSON, `Reader` (typedef of `GenericReader<...>`) is the SAX-style parser for JSON, and `Writer` (typedef of `GenericWriter<...>`) is the SAX-style generator for JSON. [TOC] # Reader {#Reader} `Reader` parses a JSON from a stream. While it reads characters from the stream, it analyzes the characters according to the syntax of JSON, and publishes events to a handler. For example, here is a JSON. ~~~~~~~~~~js { "hello": "world", "t": true , "f": false, "n": null, "i": 123, "pi": 3.1416, "a": [1, 2, 3, 4] } ~~~~~~~~~~ When a `Reader` parses this JSON, it publishes the following events to the handler sequentially: ~~~~~~~~~~ StartObject() Key("hello", 5, true) String("world", 5, true) Key("t", 1, true) Bool(true) Key("f", 1, true) Bool(false) Key("n", 1, true) Null() Key("i") Uint(123) Key("pi") Double(3.1416) Key("a") StartArray() Uint(1) Uint(2) Uint(3) Uint(4) EndArray(4) EndObject(7) ~~~~~~~~~~ These events can be easily matched with the JSON, but some event parameters need further explanation. Let's see the `simplereader` example which produces exactly the same output as above: ~~~~~~~~~~cpp #include "rapidjson/reader.h" #include using namespace rapidjson; using namespace std; struct MyHandler : public BaseReaderHandler, MyHandler> { bool Null() { cout << "Null()" << endl; return true; } bool Bool(bool b) { cout << "Bool(" << boolalpha << b << ")" << endl; return true; } bool Int(int i) { cout << "Int(" << i << ")" << endl; return true; } bool Uint(unsigned u) { cout << "Uint(" << u << ")" << endl; return true; } bool Int64(int64_t i) { cout << "Int64(" << i << ")" << endl; return true; } bool Uint64(uint64_t u) { cout << "Uint64(" << u << ")" << endl; return true; } bool Double(double d) { cout << "Double(" << d << ")" << endl; return true; } bool String(const char* str, SizeType length, bool copy) { cout << "String(" << str << ", " << length << ", " << boolalpha << copy << ")" << endl; return true; } bool StartObject() { cout << "StartObject()" << endl; return true; } bool Key(const char* str, SizeType length, bool copy) { cout << "Key(" << str << ", " << length << ", " << boolalpha << copy << ")" << endl; return true; } bool EndObject(SizeType memberCount) { cout << "EndObject(" << memberCount << ")" << endl; return true; } bool StartArray() { cout << "StartArray()" << endl; return true; } bool EndArray(SizeType elementCount) { cout << "EndArray(" << elementCount << ")" << endl; return true; } }; void main() { const char json[] = " { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } "; MyHandler handler; Reader reader; StringStream ss(json); reader.Parse(ss, handler); } ~~~~~~~~~~ Note that RapidJSON uses templates to statically bind the `Reader` type and the handler type, instead of using classes with virtual functions. This paradigm can improve performance by inlining functions. ## Handler {#Handler} As shown in the previous example, the user needs to implement a handler which consumes the events (via function calls) from the `Reader`. The handler must contain the following member functions. ~~~~~~~~~~cpp class Handler { bool Null(); bool Bool(bool b); bool Int(int i); bool Uint(unsigned i); bool Int64(int64_t i); bool Uint64(uint64_t i); bool Double(double d); bool RawNumber(const Ch* str, SizeType length, bool copy); bool String(const Ch* str, SizeType length, bool copy); bool StartObject(); bool Key(const Ch* str, SizeType length, bool copy); bool EndObject(SizeType memberCount); bool StartArray(); bool EndArray(SizeType elementCount); }; ~~~~~~~~~~ `Null()` is called when the `Reader` encounters a JSON null value. `Bool(bool)` is called when the `Reader` encounters a JSON true or false value. When the `Reader` encounters a JSON number, it chooses a suitable C++ type mapping. And then it calls *one* function out of `Int(int)`, `Uint(unsigned)`, `Int64(int64_t)`, `Uint64(uint64_t)` and `Double(double)`. If `kParseNumbersAsStrings` is enabled, `Reader` will always calls `RawNumber()` instead. `String(const char* str, SizeType length, bool copy)` is called when the `Reader` encounters a string. The first parameter is pointer to the string. The second parameter is the length of the string (excluding the null terminator). Note that RapidJSON supports null character `\0` inside a string. If such situation happens, `strlen(str) < length`. The last `copy` indicates whether the handler needs to make a copy of the string. For normal parsing, `copy = true`. Only when *insitu* parsing is used, `copy = false`. And be aware that the character type depends on the target encoding, which will be explained later. When the `Reader` encounters the beginning of an object, it calls `StartObject()`. An object in JSON is a set of name-value pairs. If the object contains members it first calls `Key()` for the name of member, and then calls functions depending on the type of the value. These calls of name-value pairs repeat until calling `EndObject(SizeType memberCount)`. Note that the `memberCount` parameter is just an aid for the handler; users who do not need this parameter may ignore it. Arrays are similar to objects, but simpler. At the beginning of an array, the `Reader` calls `BeginArray()`. If there is elements, it calls functions according to the types of element. Similarly, in the last call `EndArray(SizeType elementCount)`, the parameter `elementCount` is just an aid for the handler. Every handler function returns a `bool`. Normally it should return `true`. If the handler encounters an error, it can return `false` to notify the event publisher to stop further processing. For example, when we parse a JSON with `Reader` and the handler detects that the JSON does not conform to the required schema, the handler can return `false` and let the `Reader` stop further parsing. This will place the `Reader` in an error state, with error code `kParseErrorTermination`. ## GenericReader {#GenericReader} As mentioned before, `Reader` is a typedef of a template class `GenericReader`: ~~~~~~~~~~cpp namespace rapidjson { template > class GenericReader { // ... }; typedef GenericReader, UTF8<> > Reader; } // namespace rapidjson ~~~~~~~~~~ The `Reader` uses UTF-8 as both source and target encoding. The source encoding means the encoding in the JSON stream. The target encoding means the encoding of the `str` parameter in `String()` calls. For example, to parse a UTF-8 stream and output UTF-16 string events, you can define a reader by: ~~~~~~~~~~cpp GenericReader, UTF16<> > reader; ~~~~~~~~~~ Note that, the default character type of `UTF16` is `wchar_t`. So this `reader` needs to call `String(const wchar_t*, SizeType, bool)` of the handler. The third template parameter `Allocator` is the allocator type for internal data structure (actually a stack). ## Parsing {#SaxParsing} The main function of `Reader` is used to parse JSON. ~~~~~~~~~~cpp template bool Parse(InputStream& is, Handler& handler); // with parseFlags = kDefaultParseFlags template bool Parse(InputStream& is, Handler& handler); ~~~~~~~~~~ If an error occurs during parsing, it will return `false`. User can also call `bool HasParseError()`, `ParseErrorCode GetParseErrorCode()` and `size_t GetErrorOffset()` to obtain the error states. In fact, `Document` uses these `Reader` functions to obtain parse errors. Please refer to [DOM](doc/dom.md) for details about parse errors. ## Token-by-Token Parsing {#TokenByTokenParsing} Some users may wish to parse a JSON input stream a single token at a time, instead of immediately parsing an entire document without stopping. To parse JSON this way, instead of calling `Parse`, you can use the `IterativeParse` set of functions: ~~~~~~~~~~cpp void IterativeParseInit(); template bool IterativeParseNext(InputStream& is, Handler& handler); bool IterativeParseComplete(); ~~~~~~~~~~ Here is an example of iteratively parsing JSON, token by token: ~~~~~~~~~~cpp reader.IterativeParseInit(); while (!reader.IterativeParseComplete()) { reader.IterativeParseNext(is, handler); // Your handler has been called once. } ~~~~~~~~~~ # Writer {#Writer} `Reader` converts (parses) JSON into events. `Writer` does exactly the opposite. It converts events into JSON. `Writer` is very easy to use. If your application only need to converts some data into JSON, it may be a good choice to use `Writer` directly, instead of building a `Document` and then stringifying it with a `Writer`. In `simplewriter` example, we do exactly the reverse of `simplereader`. ~~~~~~~~~~cpp #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" #include using namespace rapidjson; using namespace std; void main() { StringBuffer s; Writer writer(s); writer.StartObject(); writer.Key("hello"); writer.String("world"); writer.Key("t"); writer.Bool(true); writer.Key("f"); writer.Bool(false); writer.Key("n"); writer.Null(); writer.Key("i"); writer.Uint(123); writer.Key("pi"); writer.Double(3.1416); writer.Key("a"); writer.StartArray(); for (unsigned i = 0; i < 4; i++) writer.Uint(i); writer.EndArray(); writer.EndObject(); cout << s.GetString() << endl; } ~~~~~~~~~~ ~~~~~~~~~~ {"hello":"world","t":true,"f":false,"n":null,"i":123,"pi":3.1416,"a":[0,1,2,3]} ~~~~~~~~~~ There are two `String()` and `Key()` overloads. One is the same as defined in handler concept with 3 parameters. It can handle string with null characters. Another one is the simpler version used in the above example. Note that, the example code does not pass any parameters in `EndArray()` and `EndObject()`. An `SizeType` can be passed but it will be simply ignored by `Writer`. You may doubt that, why not just using `sprintf()` or `std::stringstream` to build a JSON? There are various reasons: 1. `Writer` must output a well-formed JSON. If there is incorrect event sequence (e.g. `Int()` just after `StartObject()`), it generates assertion fail in debug mode. 2. `Writer::String()` can handle string escaping (e.g. converting code point `U+000A` to `\n`) and Unicode transcoding. 3. `Writer` handles number output consistently. 4. `Writer` implements the event handler concept. It can be used to handle events from `Reader`, `Document` or other event publisher. 5. `Writer` can be optimized for different platforms. Anyway, using `Writer` API is even simpler than generating a JSON by ad hoc methods. ## Template {#WriterTemplate} `Writer` has a minor design difference to `Reader`. `Writer` is a template class, not a typedef. There is no `GenericWriter`. The following is the declaration. ~~~~~~~~~~cpp namespace rapidjson { template, typename TargetEncoding = UTF8<>, typename Allocator = CrtAllocator<>, unsigned writeFlags = kWriteDefaultFlags> class Writer { public: Writer(OutputStream& os, Allocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) // ... }; } // namespace rapidjson ~~~~~~~~~~ The `OutputStream` template parameter is the type of output stream. It cannot be deduced and must be specified by user. The `SourceEncoding` template parameter specifies the encoding to be used in `String(const Ch*, ...)`. The `TargetEncoding` template parameter specifies the encoding in the output stream. The `Allocator` is the type of allocator, which is used for allocating internal data structure (a stack). The `writeFlags` are combination of the following bit-flags: Parse flags | Meaning ------------------------------|----------------------------------- `kWriteNoFlags` | No flag is set. `kWriteDefaultFlags` | Default write flags. It is equal to macro `RAPIDJSON_WRITE_DEFAULT_FLAGS`, which is defined as `kWriteNoFlags`. `kWriteValidateEncodingFlag` | Validate encoding of JSON strings. `kWriteNanAndInfFlag` | Allow writing of `Infinity`, `-Infinity` and `NaN`. Besides, the constructor of `Writer` has a `levelDepth` parameter. This parameter affects the initial memory allocated for storing information per hierarchy level. ## PrettyWriter {#PrettyWriter} While the output of `Writer` is the most condensed JSON without white-spaces, suitable for network transfer or storage, it is not easily readable by human. Therefore, RapidJSON provides a `PrettyWriter`, which adds indentation and line feeds in the output. The usage of `PrettyWriter` is exactly the same as `Writer`, expect that `PrettyWriter` provides a `SetIndent(Ch indentChar, unsigned indentCharCount)` function. The default is 4 spaces. ## Completeness and Reset {#CompletenessReset} A `Writer` can only output a single JSON, which can be any JSON type at the root. Once the singular event for root (e.g. `String()`), or the last matching `EndObject()` or `EndArray()` event, is handled, the output JSON is well-formed and complete. User can detect this state by calling `Writer::IsComplete()`. When a JSON is complete, the `Writer` cannot accept any new events. Otherwise the output will be invalid (i.e. having more than one root). To reuse the `Writer` object, user can call `Writer::Reset(OutputStream& os)` to reset all internal states of the `Writer` with a new output stream. # Techniques {#SaxTechniques} ## Parsing JSON to Custom Data Structure {#CustomDataStructure} `Document`'s parsing capability is completely based on `Reader`. Actually `Document` is a handler which receives events from a reader to build a DOM during parsing. User may uses `Reader` to build other data structures directly. This eliminates building of DOM, thus reducing memory and improving performance. In the following `messagereader` example, `ParseMessages()` parses a JSON which should be an object with key-string pairs. ~~~~~~~~~~cpp #include "rapidjson/reader.h" #include "rapidjson/error/en.h" #include #include #include using namespace std; using namespace rapidjson; typedef map MessageMap; struct MessageHandler : public BaseReaderHandler, MessageHandler> { MessageHandler() : state_(kExpectObjectStart) { } bool StartObject() { switch (state_) { case kExpectObjectStart: state_ = kExpectNameOrObjectEnd; return true; default: return false; } } bool String(const char* str, SizeType length, bool) { switch (state_) { case kExpectNameOrObjectEnd: name_ = string(str, length); state_ = kExpectValue; return true; case kExpectValue: messages_.insert(MessageMap::value_type(name_, string(str, length))); state_ = kExpectNameOrObjectEnd; return true; default: return false; } } bool EndObject(SizeType) { return state_ == kExpectNameOrObjectEnd; } bool Default() { return false; } // All other events are invalid. MessageMap messages_; enum State { kExpectObjectStart, kExpectNameOrObjectEnd, kExpectValue, }state_; std::string name_; }; void ParseMessages(const char* json, MessageMap& messages) { Reader reader; MessageHandler handler; StringStream ss(json); if (reader.Parse(ss, handler)) messages.swap(handler.messages_); // Only change it if success. else { ParseErrorCode e = reader.GetParseErrorCode(); size_t o = reader.GetErrorOffset(); cout << "Error: " << GetParseError_En(e) << endl;; cout << " at offset " << o << " near '" << string(json).substr(o, 10) << "...'" << endl; } } int main() { MessageMap messages; const char* json1 = "{ \"greeting\" : \"Hello!\", \"farewell\" : \"bye-bye!\" }"; cout << json1 << endl; ParseMessages(json1, messages); for (MessageMap::const_iterator itr = messages.begin(); itr != messages.end(); ++itr) cout << itr->first << ": " << itr->second << endl; cout << endl << "Parse a JSON with invalid schema." << endl; const char* json2 = "{ \"greeting\" : \"Hello!\", \"farewell\" : \"bye-bye!\", \"foo\" : {} }"; cout << json2 << endl; ParseMessages(json2, messages); return 0; } ~~~~~~~~~~ ~~~~~~~~~~ { "greeting" : "Hello!", "farewell" : "bye-bye!" } farewell: bye-bye! greeting: Hello! Parse a JSON with invalid schema. { "greeting" : "Hello!", "farewell" : "bye-bye!", "foo" : {} } Error: Terminate parsing due to Handler error. at offset 59 near '} }...' ~~~~~~~~~~ The first JSON (`json1`) was successfully parsed into `MessageMap`. Since `MessageMap` is a `std::map`, the printing order are sorted by the key. This order is different from the JSON's order. In the second JSON (`json2`), `foo`'s value is an empty object. As it is an object, `MessageHandler::StartObject()` will be called. However, at that moment `state_ = kExpectValue`, so that function returns `false` and cause the parsing process be terminated. The error code is `kParseErrorTermination`. ## Filtering of JSON {#Filtering} As mentioned earlier, `Writer` can handle the events published by `Reader`. `condense` example simply set a `Writer` as handler of a `Reader`, so it can remove all white-spaces in JSON. `pretty` example uses the same relationship, but replacing `Writer` by `PrettyWriter`. So `pretty` can be used to reformat a JSON with indentation and line feed. Actually, we can add intermediate layer(s) to filter the contents of JSON via these SAX-style API. For example, `capitalize` example capitalize all strings in a JSON. ~~~~~~~~~~cpp #include "rapidjson/reader.h" #include "rapidjson/writer.h" #include "rapidjson/filereadstream.h" #include "rapidjson/filewritestream.h" #include "rapidjson/error/en.h" #include #include using namespace rapidjson; template struct CapitalizeFilter { CapitalizeFilter(OutputHandler& out) : out_(out), buffer_() { } bool Null() { return out_.Null(); } bool Bool(bool b) { return out_.Bool(b); } bool Int(int i) { return out_.Int(i); } bool Uint(unsigned u) { return out_.Uint(u); } bool Int64(int64_t i) { return out_.Int64(i); } bool Uint64(uint64_t u) { return out_.Uint64(u); } bool Double(double d) { return out_.Double(d); } bool RawNumber(const char* str, SizeType length, bool copy) { return out_.RawNumber(str, length, copy); } bool String(const char* str, SizeType length, bool) { buffer_.clear(); for (SizeType i = 0; i < length; i++) buffer_.push_back(std::toupper(str[i])); return out_.String(&buffer_.front(), length, true); // true = output handler need to copy the string } bool StartObject() { return out_.StartObject(); } bool Key(const char* str, SizeType length, bool copy) { return String(str, length, copy); } bool EndObject(SizeType memberCount) { return out_.EndObject(memberCount); } bool StartArray() { return out_.StartArray(); } bool EndArray(SizeType elementCount) { return out_.EndArray(elementCount); } OutputHandler& out_; std::vector buffer_; }; int main(int, char*[]) { // Prepare JSON reader and input stream. Reader reader; char readBuffer[65536]; FileReadStream is(stdin, readBuffer, sizeof(readBuffer)); // Prepare JSON writer and output stream. char writeBuffer[65536]; FileWriteStream os(stdout, writeBuffer, sizeof(writeBuffer)); Writer writer(os); // JSON reader parse from the input stream and let writer generate the output. CapitalizeFilter > filter(writer); if (!reader.Parse(is, filter)) { fprintf(stderr, "\nError(%u): %s\n", (unsigned)reader.GetErrorOffset(), GetParseError_En(reader.GetParseErrorCode())); return 1; } return 0; } ~~~~~~~~~~ Note that, it is incorrect to simply capitalize the JSON as a string. For example: ~~~~~~~~~~ ["Hello\nWorld"] ~~~~~~~~~~ Simply capitalizing the whole JSON would contain incorrect escape character: ~~~~~~~~~~ ["HELLO\NWORLD"] ~~~~~~~~~~ The correct result by `capitalize`: ~~~~~~~~~~ ["HELLO\nWORLD"] ~~~~~~~~~~ More complicated filters can be developed. However, since SAX-style API can only provide information about a single event at a time, user may need to book-keeping the contextual information (e.g. the path from root value, storage of other related values). Some processing may be easier to be implemented in DOM than SAX. asymptote-3.05/LspCpp/third_party/rapidjson/doc/faq.md0000644000000000000000000003600415031566105021552 0ustar rootroot# FAQ [TOC] ## General 1. What is RapidJSON? RapidJSON is a C++ library for parsing and generating JSON. You may check all [features](doc/features.md) of it. 2. Why is RapidJSON named so? It is inspired by [RapidXML](http://rapidxml.sourceforge.net/), which is a fast XML DOM parser. 3. Is RapidJSON similar to RapidXML? RapidJSON borrowed some designs of RapidXML, including *in situ* parsing, header-only library. But the two APIs are completely different. Also RapidJSON provide many features that are not in RapidXML. 4. Is RapidJSON free? Yes, it is free under MIT license. It can be used in commercial applications. Please check the details in [license.txt](https://github.com/Tencent/rapidjson/blob/master/license.txt). 5. Is RapidJSON small? What are its dependencies? Yes. A simple executable which parses a JSON and prints its statistics is less than 30KB on Windows. RapidJSON depends on C++ standard library only. 6. How to install RapidJSON? Check [Installation section](https://miloyip.github.io/rapidjson/). 7. Can RapidJSON run on my platform? RapidJSON has been tested in many combinations of operating systems, compilers and CPU architecture by the community. But we cannot ensure that it can be run on your particular platform. Building and running the unit test suite will give you the answer. 8. Does RapidJSON support C++03? C++11? RapidJSON was firstly implemented for C++03. Later it added optional support of some C++11 features (e.g., move constructor, `noexcept`). RapidJSON shall be compatible with C++03 or C++11 compliant compilers. 9. Does RapidJSON really work in real applications? Yes. It is deployed in both client and server real applications. A community member reported that RapidJSON in their system parses 50 million JSONs daily. 10. How RapidJSON is tested? RapidJSON contains a unit test suite for automatic testing. [Travis](https://travis-ci.org/Tencent/rapidjson/)(for Linux) and [AppVeyor](https://ci.appveyor.com/project/Tencent/rapidjson/)(for Windows) will compile and run the unit test suite for all modifications. The test process also uses Valgrind (in Linux) to detect memory leaks. 11. Is RapidJSON well documented? RapidJSON provides user guide and API documentationn. 12. Are there alternatives? Yes, there are a lot alternatives. For example, [nativejson-benchmark](https://github.com/miloyip/nativejson-benchmark) has a listing of open-source C/C++ JSON libraries. [json.org](http://www.json.org/) also has a list. ## JSON 1. What is JSON? JSON (JavaScript Object Notation) is a lightweight data-interchange format. It uses human readable text format. More details of JSON can be referred to [RFC7159](http://www.ietf.org/rfc/rfc7159.txt) and [ECMA-404](http://www.ecma-international.org/publications/standards/Ecma-404.htm). 2. What are applications of JSON? JSON are commonly used in web applications for transferring structured data. It is also used as a file format for data persistence. 3. Does RapidJSON conform to the JSON standard? Yes. RapidJSON is fully compliance with [RFC7159](http://www.ietf.org/rfc/rfc7159.txt) and [ECMA-404](http://www.ecma-international.org/publications/standards/Ecma-404.htm). It can handle corner cases, such as supporting null character and surrogate pairs in JSON strings. 4. Does RapidJSON support relaxed syntax? Currently no. RapidJSON only support the strict standardized format. Support on related syntax is under discussion in this [issue](https://github.com/Tencent/rapidjson/issues/36). ## DOM and SAX 1. What is DOM style API? Document Object Model (DOM) is an in-memory representation of JSON for query and manipulation. 2. What is SAX style API? SAX is an event-driven API for parsing and generation. 3. Should I choose DOM or SAX? DOM is easy for query and manipulation. SAX is very fast and memory-saving but often more difficult to be applied. 4. What is *in situ* parsing? *in situ* parsing decodes the JSON strings directly into the input JSON. This is an optimization which can reduce memory consumption and improve performance, but the input JSON will be modified. Check [in-situ parsing](doc/dom.md) for details. 5. When does parsing generate an error? The parser generates an error when the input JSON contains invalid syntax, or a value can not be represented (a number is too big), or the handler of parsers terminate the parsing. Check [parse error](doc/dom.md) for details. 6. What error information is provided? The error is stored in `ParseResult`, which includes the error code and offset (number of characters from the beginning of JSON). The error code can be translated into human-readable error message. 7. Why not just using `double` to represent JSON number? Some applications use 64-bit unsigned/signed integers. And these integers cannot be converted into `double` without loss of precision. So the parsers detects whether a JSON number is convertible to different types of integers and/or `double`. 8. How to clear-and-minimize a document or value? Call one of the `SetXXX()` methods - they call destructor which deallocates DOM data: ~~~~~~~~~~cpp Document d; ... d.SetObject(); // clear and minimize ~~~~~~~~~~ Alternatively, use equivalent of the [C++ swap with temporary idiom](https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Clear-and-minimize): ~~~~~~~~~~cpp Value(kObjectType).Swap(d); ~~~~~~~~~~ or equivalent, but slightly longer to type: ~~~~~~~~~~cpp d.Swap(Value(kObjectType).Move()); ~~~~~~~~~~ 9. How to insert a document node into another document? Let's take the following two DOM trees represented as JSON documents: ~~~~~~~~~~cpp Document person; person.Parse("{\"person\":{\"name\":{\"first\":\"Adam\",\"last\":\"Thomas\"}}}"); Document address; address.Parse("{\"address\":{\"city\":\"Moscow\",\"street\":\"Quiet\"}}"); ~~~~~~~~~~ Let's assume we want to merge them in such way that the whole `address` document becomes a node of the `person`: ~~~~~~~~~~js { "person": { "name": { "first": "Adam", "last": "Thomas" }, "address": { "city": "Moscow", "street": "Quiet" } } } ~~~~~~~~~~ The most important requirement to take care of document and value life-cycle as well as consistent memory management using the right allocator during the value transfer. Simple yet most efficient way to achieve that is to modify the `address` definition above to initialize it with allocator of the `person` document, then we just add the root member of the value: ~~~~~~~~~~cpp Document address(&person.GetAllocator()); ... person["person"].AddMember("address", address["address"], person.GetAllocator()); ~~~~~~~~~~ Alternatively, if we don't want to explicitly refer to the root value of `address` by name, we can refer to it via iterator: ~~~~~~~~~~cpp auto addressRoot = address.MemberBegin(); person["person"].AddMember(addressRoot->name, addressRoot->value, person.GetAllocator()); ~~~~~~~~~~ Second way is to deep-clone the value from the address document: ~~~~~~~~~~cpp Value addressValue = Value(address["address"], person.GetAllocator()); person["person"].AddMember("address", addressValue, person.GetAllocator()); ~~~~~~~~~~ ## Document/Value (DOM) 1. What is move semantics? Why? Instead of copy semantics, move semantics is used in `Value`. That means, when assigning a source value to a target value, the ownership of source value is moved to the target value. Since moving is faster than copying, this design decision forces user to aware of the copying overhead. 2. How to copy a value? There are two APIs: constructor with allocator, and `CopyFrom()`. See [Deep Copy Value](doc/tutorial.md) for an example. 3. Why do I need to provide the length of string? Since C string is null-terminated, the length of string needs to be computed via `strlen()`, with linear runtime complexity. This incurs an unnecessary overhead of many operations, if the user already knows the length of string. Also, RapidJSON can handle `\u0000` (null character) within a string. If a string contains null characters, `strlen()` cannot return the true length of it. In such case user must provide the length of string explicitly. 4. Why do I need to provide allocator parameter in many DOM manipulation API? Since the APIs are member functions of `Value`, we do not want to save an allocator pointer in every `Value`. 5. Does it convert between numerical types? When using `GetInt()`, `GetUint()`, ... conversion may occur. For integer-to-integer conversion, it only convert when it is safe (otherwise it will assert). However, when converting a 64-bit signed/unsigned integer to double, it will convert but be aware that it may lose precision. A number with fraction, or an integer larger than 64-bit, can only be obtained by `GetDouble()`. ## Reader/Writer (SAX) 1. Why don't we just `printf` a JSON? Why do we need a `Writer`? Most importantly, `Writer` will ensure the output JSON is well-formed. Calling SAX events incorrectly (e.g. `StartObject()` pairing with `EndArray()`) will assert. Besides, `Writer` will escapes strings (e.g., `\n`). Finally, the numeric output of `printf()` may not be a valid JSON number, especially in some locale with digit delimiters. And the number-to-string conversion in `Writer` is implemented with very fast algorithms, which outperforms than `printf()` or `iostream`. 2. Can I pause the parsing process and resume it later? This is not directly supported in the current version due to performance consideration. However, if the execution environment supports multi-threading, user can parse a JSON in a separate thread, and pause it by blocking in the input stream. ## Unicode 1. Does it support UTF-8, UTF-16 and other format? Yes. It fully support UTF-8, UTF-16 (LE/BE), UTF-32 (LE/BE) and ASCII. 2. Can it validate the encoding? Yes, just pass `kParseValidateEncodingFlag` to `Parse()`. If there is invalid encoding in the stream, it will generate `kParseErrorStringInvalidEncoding` error. 3. What is surrogate pair? Does RapidJSON support it? JSON uses UTF-16 encoding when escaping unicode character, e.g. `\u5927` representing Chinese character "big". To handle characters other than those in basic multilingual plane (BMP), UTF-16 encodes those characters with two 16-bit values, which is called UTF-16 surrogate pair. For example, the Emoji character U+1F602 can be encoded as `\uD83D\uDE02` in JSON. RapidJSON fully support parsing/generating UTF-16 surrogates. 4. Can it handle `\u0000` (null character) in JSON string? Yes. RapidJSON fully support null character in JSON string. However, user need to be aware of it and using `GetStringLength()` and related APIs to obtain the true length of string. 5. Can I output `\uxxxx` for all non-ASCII character? Yes, use `ASCII<>` as output encoding template parameter in `Writer` can enforce escaping those characters. ## Stream 1. I have a big JSON file. Should I load the whole file to memory? User can use `FileReadStream` to read the file chunk-by-chunk. But for *in situ* parsing, the whole file must be loaded. 2. Can I parse JSON while it is streamed from network? Yes. User can implement a custom stream for this. Please refer to the implementation of `FileReadStream`. 3. I don't know what encoding will the JSON be. How to handle them? You may use `AutoUTFInputStream` which detects the encoding of input stream automatically. However, it will incur some performance overhead. 4. What is BOM? How RapidJSON handle it? [Byte order mark (BOM)](http://en.wikipedia.org/wiki/Byte_order_mark) sometimes reside at the beginning of file/stream to indicate the UTF encoding type of it. RapidJSON's `EncodedInputStream` can detect/consume BOM. `EncodedOutputStream` can optionally write a BOM. See [Encoded Streams](doc/stream.md) for example. 5. Why little/big endian is related? little/big endian of stream is an issue for UTF-16 and UTF-32 streams, but not UTF-8 stream. ## Performance 1. Is RapidJSON really fast? Yes. It may be the fastest open source JSON library. There is a [benchmark](https://github.com/miloyip/nativejson-benchmark) for evaluating performance of C/C++ JSON libraries. 2. Why is it fast? Many design decisions of RapidJSON is aimed at time/space performance. These may reduce user-friendliness of APIs. Besides, it also employs low-level optimizations (intrinsics, SIMD) and special algorithms (custom double-to-string, string-to-double conversions). 3. What is SIMD? How it is applied in RapidJSON? [SIMD](http://en.wikipedia.org/wiki/SIMD) instructions can perform parallel computation in modern CPUs. RapidJSON support Intel's SSE2/SSE4.2 and ARM's Neon to accelerate whitespace/tabspace/carriage-return/line-feed skipping. This improves performance of parsing indent formatted JSON. Define `RAPIDJSON_SSE2`, `RAPIDJSON_SSE42` or `RAPIDJSON_NEON` macro to enable this feature. However, running the executable on a machine without such instruction set support will make it crash. 4. Does it consume a lot of memory? The design of RapidJSON aims at reducing memory footprint. In the SAX API, `Reader` consumes memory proportional to maximum depth of JSON tree, plus maximum length of JSON string. In the DOM API, each `Value` consumes exactly 16/24 bytes for 32/64-bit architecture respectively. RapidJSON also uses a special memory allocator to minimize overhead of allocations. 5. What is the purpose of being high performance? Some applications need to process very large JSON files. Some server-side applications need to process huge amount of JSONs. Being high performance can improve both latency and throughput. In a broad sense, it will also save energy. ## Gossip 1. Who are the developers of RapidJSON? Milo Yip ([miloyip](https://github.com/miloyip)) is the original author of RapidJSON. Many contributors from the world have improved RapidJSON. Philipp A. Hartmann ([pah](https://github.com/pah)) has implemented a lot of improvements, setting up automatic testing and also involves in a lot of discussions for the community. Don Ding ([thebusytypist](https://github.com/thebusytypist)) implemented the iterative parser. Andrii Senkovych ([jollyroger](https://github.com/jollyroger)) completed the CMake migration. Kosta ([Kosta-Github](https://github.com/Kosta-Github)) provided a very neat short-string optimization. Thank you for all other contributors and community members as well. 2. Why do you develop RapidJSON? It was just a hobby project initially in 2011. Milo Yip is a game programmer and he just knew about JSON at that time and would like to apply JSON in future projects. As JSON seems very simple he would like to write a header-only and fast library. 3. Why there is a long empty period of development? It is basically due to personal issues, such as getting new family members. Also, Milo Yip has spent a lot of spare time on translating "Game Engine Architecture" by Jason Gregory into Chinese. 4. Why did the repository move from Google Code to GitHub? This is the trend. And GitHub is much more powerful and convenient. asymptote-3.05/LspCpp/third_party/rapidjson/doc/schema.md0000644000000000000000000004345615031566105022254 0ustar rootroot# Schema (This feature was released in v1.1.0) JSON Schema is a draft standard for describing the format of JSON data. The schema itself is also JSON data. By validating a JSON structure with JSON Schema, your code can safely access the DOM without manually checking types, or whether a key exists, etc. It can also ensure that the serialized JSON conform to a specified schema. RapidJSON implemented a JSON Schema validator for [JSON Schema Draft v4](http://json-schema.org/documentation.html). If you are not familiar with JSON Schema, you may refer to [Understanding JSON Schema](http://spacetelescope.github.io/understanding-json-schema/). [TOC] # Basic Usage {#Basic} First of all, you need to parse a JSON Schema into `Document`, and then compile the `Document` into a `SchemaDocument`. Secondly, construct a `SchemaValidator` with the `SchemaDocument`. It is similar to a `Writer` in the sense of handling SAX events. So, you can use `document.Accept(validator)` to validate a document, and then check the validity. ~~~cpp #include "rapidjson/schema.h" // ... Document sd; if (sd.Parse(schemaJson).HasParseError()) { // the schema is not a valid JSON. // ... } SchemaDocument schema(sd); // Compile a Document to SchemaDocument if (!schema.GetError().ObjectEmpty()) { // there was a problem compiling the schema StringBuffer sb; Writer w(sb); schema.GetError().Accept(w); printf("Invalid schema: %s\n", sb.GetString()); } // sd is no longer needed here. Document d; if (d.Parse(inputJson).HasParseError()) { // the input is not a valid JSON. // ... } SchemaValidator validator(schema); if (!d.Accept(validator)) { // Input JSON is invalid according to the schema // Output diagnostic information StringBuffer sb; validator.GetInvalidSchemaPointer().StringifyUriFragment(sb); printf("Invalid schema: %s\n", sb.GetString()); printf("Invalid keyword: %s\n", validator.GetInvalidSchemaKeyword()); sb.Clear(); validator.GetInvalidDocumentPointer().StringifyUriFragment(sb); printf("Invalid document: %s\n", sb.GetString()); } ~~~ Some notes: * One `SchemaDocument` can be referenced by multiple `SchemaValidator`s. It will not be modified by `SchemaValidator`s. * A `SchemaValidator` may be reused to validate multiple documents. To run it for other documents, call `validator.Reset()` first. # Validation during parsing/serialization {#Fused} Unlike most JSON Schema validator implementations, RapidJSON provides a SAX-based schema validator. Therefore, you can parse a JSON from a stream while validating it on the fly. If the validator encounters a JSON value that invalidates the supplied schema, the parsing will be terminated immediately. This design is especially useful for parsing large JSON files. ## DOM parsing {#DOM} For using DOM in parsing, `Document` needs some preparation and finalizing tasks, in addition to receiving SAX events, thus it needs some work to route the reader, validator and the document. `SchemaValidatingReader` is a helper class that doing such work. ~~~cpp #include "rapidjson/filereadstream.h" // ... SchemaDocument schema(sd); // Compile a Document to SchemaDocument // Use reader to parse the JSON FILE* fp = fopen("big.json", "r"); FileReadStream is(fp, buffer, sizeof(buffer)); // Parse JSON from reader, validate the SAX events, and store in d. Document d; SchemaValidatingReader > reader(is, schema); d.Populate(reader); if (!reader.GetParseResult()) { // Not a valid JSON // When reader.GetParseResult().Code() == kParseErrorTermination, // it may be terminated by: // (1) the validator found that the JSON is invalid according to schema; or // (2) the input stream has I/O error. // Check the validation result if (!reader.IsValid()) { // Input JSON is invalid according to the schema // Output diagnostic information StringBuffer sb; reader.GetInvalidSchemaPointer().StringifyUriFragment(sb); printf("Invalid schema: %s\n", sb.GetString()); printf("Invalid keyword: %s\n", reader.GetInvalidSchemaKeyword()); sb.Clear(); reader.GetInvalidDocumentPointer().StringifyUriFragment(sb); printf("Invalid document: %s\n", sb.GetString()); } } ~~~ ## SAX parsing {#SAX} For using SAX in parsing, it is much simpler. If it only need to validate the JSON without further processing, it is simply: ~~~ SchemaValidator validator(schema); Reader reader; if (!reader.Parse(stream, validator)) { if (!validator.IsValid()) { // ... } } ~~~ This is exactly the method used in the [schemavalidator](example/schemavalidator/schemavalidator.cpp) example. The distinct advantage is low memory usage, no matter how big the JSON was (the memory usage depends on the complexity of the schema). If you need to handle the SAX events further, then you need to use the template class `GenericSchemaValidator` to set the output handler of the validator: ~~~ MyHandler handler; GenericSchemaValidator validator(schema, handler); Reader reader; if (!reader.Parse(ss, validator)) { if (!validator.IsValid()) { // ... } } ~~~ ## Serialization {#Serialization} It is also possible to do validation during serializing. This can ensure the result JSON is valid according to the JSON schema. ~~~ StringBuffer sb; Writer writer(sb); GenericSchemaValidator > validator(s, writer); if (!d.Accept(validator)) { // Some problem during Accept(), it may be validation or encoding issues. if (!validator.IsValid()) { // ... } } ~~~ Of course, if your application only needs SAX-style serialization, it can simply send SAX events to `SchemaValidator` instead of `Writer`. # Remote Schema {#Remote} JSON Schema supports [`$ref` keyword](http://spacetelescope.github.io/understanding-json-schema/structuring.html), which is a [JSON pointer](doc/pointer.md) referencing to a local or remote schema. Local pointer is prefixed with `#`, while remote pointer is an relative or absolute URI. For example: ~~~js { "$ref": "definitions.json#/address" } ~~~ As `SchemaDocument` does not know how to resolve such URI, it needs a user-provided `IRemoteSchemaDocumentProvider` instance to do so. ~~~ class MyRemoteSchemaDocumentProvider : public IRemoteSchemaDocumentProvider { public: virtual const SchemaDocument* GetRemoteDocument(const char* uri, SizeType length) { // Resolve the uri and returns a pointer to that schema. } }; // ... MyRemoteSchemaDocumentProvider provider; SchemaDocument schema(sd, &provider); ~~~ # Conformance {#Conformance} RapidJSON passed 262 out of 263 tests in [JSON Schema Test Suite](https://github.com/json-schema/JSON-Schema-Test-Suite) (Json Schema draft 4). The failed test is "changed scope ref invalid" of "change resolution scope" in `refRemote.json`. It is due to that `id` schema keyword and URI combining function are not implemented. Besides, the `format` schema keyword for string values is ignored, since it is not required by the specification. ## Regular Expression {#Regex} The schema keyword `pattern` and `patternProperties` uses regular expression to match the required pattern. RapidJSON implemented a simple NFA regular expression engine, which is used by default. It supports the following syntax. |Syntax|Description| |------|-----------| |`ab` | Concatenation | |a|b | Alternation | |`a?` | Zero or one | |`a*` | Zero or more | |`a+` | One or more | |`a{3}` | Exactly 3 times | |`a{3,}` | At least 3 times | |`a{3,5}`| 3 to 5 times | |`(ab)` | Grouping | |`^a` | At the beginning | |`a$` | At the end | |`.` | Any character | |`[abc]` | Character classes | |`[a-c]` | Character class range | |`[a-z0-9_]` | Character class combination | |`[^abc]` | Negated character classes | |`[^a-c]` | Negated character class range | |`[\b]` | Backspace (U+0008) | |\\|, `\\`, ... | Escape characters | |`\f` | Form feed (U+000C) | |`\n` | Line feed (U+000A) | |`\r` | Carriage return (U+000D) | |`\t` | Tab (U+0009) | |`\v` | Vertical tab (U+000B) | For C++11 compiler, it is also possible to use the `std::regex` by defining `RAPIDJSON_SCHEMA_USE_INTERNALREGEX=0` and `RAPIDJSON_SCHEMA_USE_STDREGEX=1`. If your schemas do not need `pattern` and `patternProperties`, you can set both macros to zero to disable this feature, which will reduce some code size. # Performance {#Performance} Most C++ JSON libraries do not yet support JSON Schema. So we tried to evaluate the performance of RapidJSON's JSON Schema validator according to [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark), which tests 11 JavaScript libraries running on Node.js. That benchmark runs validations on [JSON Schema Test Suite](https://github.com/json-schema/JSON-Schema-Test-Suite), in which some test suites and tests are excluded. We made the same benchmarking procedure in [`schematest.cpp`](test/perftest/schematest.cpp). On a Mac Book Pro (2.8 GHz Intel Core i7), the following results are collected. |Validator|Relative speed|Number of test runs per second| |---------|:------------:|:----------------------------:| |RapidJSON|155%|30682| |[`ajv`](https://github.com/epoberezkin/ajv)|100%|19770 (± 1.31%)| |[`is-my-json-valid`](https://github.com/mafintosh/is-my-json-valid)|70%|13835 (± 2.84%)| |[`jsen`](https://github.com/bugventure/jsen)|57.7%|11411 (± 1.27%)| |[`schemasaurus`](https://github.com/AlexeyGrishin/schemasaurus)|26%|5145 (± 1.62%)| |[`themis`](https://github.com/playlyfe/themis)|19.9%|3935 (± 2.69%)| |[`z-schema`](https://github.com/zaggino/z-schema)|7%|1388 (± 0.84%)| |[`jsck`](https://github.com/pandastrike/jsck#readme)|3.1%|606 (± 2.84%)| |[`jsonschema`](https://github.com/tdegrunt/jsonschema#readme)|0.9%|185 (± 1.01%)| |[`skeemas`](https://github.com/Prestaul/skeemas#readme)|0.8%|154 (± 0.79%)| |tv4|0.5%|93 (± 0.94%)| |[`jayschema`](https://github.com/natesilva/jayschema)|0.1%|21 (± 1.14%)| That is, RapidJSON is about 1.5x faster than the fastest JavaScript library (ajv). And 1400x faster than the slowest one. # Schema violation reporting {#Reporting} (Unreleased as of 2017-09-20) When validating an instance against a JSON Schema, it is often desirable to report not only whether the instance is valid, but also the ways in which it violates the schema. The `SchemaValidator` class collects errors encountered during validation into a JSON `Value`. This error object can then be accessed as `validator.GetError()`. The structure of the error object is subject to change in future versions of RapidJSON, as there is no standard schema for violations. The details below this point are provisional only. ## General provisions {#ReportingGeneral} Validation of an instance value against a schema produces an error value. The error value is always an object. An empty object `{}` indicates the instance is valid. * The name of each member corresponds to the JSON Schema keyword that is violated. * The value is either an object describing a single violation, or an array of such objects. Each violation object contains two string-valued members named `instanceRef` and `schemaRef`. `instanceRef` contains the URI fragment serialization of a JSON Pointer to the instance subobject in which the violation was detected. `schemaRef` contains the URI of the schema and the fragment serialization of a JSON Pointer to the subschema that was violated. Individual violation objects can contain other keyword-specific members. These are detailed further. For example, validating this instance: ~~~json {"numbers": [1, 2, "3", 4, 5]} ~~~ against this schema: ~~~json { "type": "object", "properties": { "numbers": {"$ref": "numbers.schema.json"} } } ~~~ where `numbers.schema.json` refers (via a suitable `IRemoteSchemaDocumentProvider`) to this schema: ~~~json { "type": "array", "items": {"type": "number"} } ~~~ produces the following error object: ~~~json { "type": { "instanceRef": "#/numbers/2", "schemaRef": "numbers.schema.json#/items", "expected": ["number"], "actual": "string" } } ~~~ ## Validation keywords for numbers {#Numbers} ### multipleOf {#multipleof} * `expected`: required number strictly greater than 0. The value of the `multipleOf` keyword specified in the schema. * `actual`: required number. The instance value. ### maximum {#maximum} * `expected`: required number. The value of the `maximum` keyword specified in the schema. * `exclusiveMaximum`: optional boolean. This will be true if the schema specified `"exclusiveMaximum": true`, and will be omitted otherwise. * `actual`: required number. The instance value. ### minimum {#minimum} * `expected`: required number. The value of the `minimum` keyword specified in the schema. * `exclusiveMinimum`: optional boolean. This will be true if the schema specified `"exclusiveMinimum": true`, and will be omitted otherwise. * `actual`: required number. The instance value. ## Validation keywords for strings {#Strings} ### maxLength {#maxLength} * `expected`: required number greater than or equal to 0. The value of the `maxLength` keyword specified in the schema. * `actual`: required string. The instance value. ### minLength {#minLength} * `expected`: required number greater than or equal to 0. The value of the `minLength` keyword specified in the schema. * `actual`: required string. The instance value. ### pattern {#pattern} * `actual`: required string. The instance value. (The expected pattern is not reported because the internal representation in `SchemaDocument` does not store the pattern in original string form.) ## Validation keywords for arrays {#Arrays} ### additionalItems {#additionalItems} This keyword is reported when the value of `items` schema keyword is an array, the value of `additionalItems` is `false`, and the instance is an array with more items than specified in the `items` array. * `disallowed`: required integer greater than or equal to 0. The index of the first item that has no corresponding schema. ### maxItems and minItems {#maxItems-minItems} * `expected`: required integer greater than or equal to 0. The value of `maxItems` (respectively, `minItems`) specified in the schema. * `actual`: required integer greater than or equal to 0. Number of items in the instance array. ### uniqueItems {#uniqueItems} * `duplicates`: required array whose items are integers greater than or equal to 0. Indices of items of the instance that are equal. (RapidJSON only reports the first two equal items, for performance reasons.) ## Validation keywords for objects ### maxProperties and minProperties {#maxProperties-minProperties} * `expected`: required integer greater than or equal to 0. The value of `maxProperties` (respectively, `minProperties`) specified in the schema. * `actual`: required integer greater than or equal to 0. Number of properties in the instance object. ### required {#required} * `missing`: required array of one or more unique strings. The names of properties that are listed in the value of the `required` schema keyword but not present in the instance object. ### additionalProperties {#additionalProperties} This keyword is reported when the schema specifies `additionalProperties: false` and the name of a property of the instance is neither listed in the `properties` keyword nor matches any regular expression in the `patternProperties` keyword. * `disallowed`: required string. Name of the offending property of the instance. (For performance reasons, RapidJSON only reports the first such property encountered.) ### dependencies {#dependencies} * `errors`: required object with one or more properties. Names and values of its properties are described below. Recall that JSON Schema Draft 04 supports *schema dependencies*, where presence of a named *controlling* property requires the instance object to be valid against a subschema, and *property dependencies*, where presence of a controlling property requires other *dependent* properties to be also present. For a violated schema dependency, `errors` will contain a property with the name of the controlling property and its value will be the error object produced by validating the instance object against the dependent schema. For a violated property dependency, `errors` will contain a property with the name of the controlling property and its value will be an array of one or more unique strings listing the missing dependent properties. ## Validation keywords for any instance type {#AnyTypes} ### enum {#enum} This keyword has no additional properties beyond `instanceRef` and `schemaRef`. * The allowed values are not listed because `SchemaDocument` does not store them in original form. * The violating value is not reported because it might be unwieldy. If you need to report these details to your users, you can access the necessary information by following `instanceRef` and `schemaRef`. ### type {#type} * `expected`: required array of one or more unique strings, each of which is one of the seven primitive types defined by the JSON Schema Draft 04 Core specification. Lists the types allowed by the `type` schema keyword. * `actual`: required string, also one of seven primitive types. The primitive type of the instance. ### allOf, anyOf, and oneOf {#allOf-anyOf-oneOf} * `errors`: required array of at least one object. There will be as many items as there are subschemas in the `allOf`, `anyOf` or `oneOf` schema keyword, respectively. Each item will be the error value produced by validating the instance against the corresponding subschema. For `allOf`, at least one error value will be non-empty. For `anyOf`, all error values will be non-empty. For `oneOf`, either all error values will be non-empty, or more than one will be empty. ### not {#not} This keyword has no additional properties apart from `instanceRef` and `schemaRef`. asymptote-3.05/LspCpp/third_party/rapidjson/doc/performance.zh-cn.md0000644000000000000000000000232415031566105024320 0ustar rootroot# 性能 有一个 [native JSON benchmark collection][1] 项目,能评估 37 个 JSON 库在ä¸åŒæ“作下的速度ã€å…§å­˜ç”¨é‡åŠä»£ç å¤§å°ã€‚ [1]: https://github.com/miloyip/nativejson-benchmark RapidJSON 0.1 版本的性能测试文章ä½äºŽ [这里](https://code.google.com/p/rapidjson/wiki/Performance). 此外,你也å¯ä»¥å‚考以下这些第三方的评测。 ## 第三方评测 * [Basic benchmarks for miscellaneous C++ JSON parsers and generators](https://github.com/mloskot/json_benchmark) by Mateusz Loskot (Jun 2013) * [casablanca](https://casablanca.codeplex.com/) * [json_spirit](https://github.com/cierelabs/json_spirit) * [jsoncpp](http://jsoncpp.sourceforge.net/) * [libjson](http://sourceforge.net/projects/libjson/) * [rapidjson](https://github.com/Tencent/rapidjson/) * [QJsonDocument](http://qt-project.org/doc/qt-5.0/qtcore/qjsondocument.html) * [JSON Parser Benchmarking](http://chadaustin.me/2013/01/json-parser-benchmarking/) by Chad Austin (Jan 2013) * [sajson](https://github.com/chadaustin/sajson) * [rapidjson](https://github.com/Tencent/rapidjson/) * [vjson](https://code.google.com/p/vjson/) * [YAJL](http://lloyd.github.com/yajl/) * [Jansson](http://www.digip.org/jansson/) asymptote-3.05/LspCpp/third_party/rapidjson/doc/Doxyfile.in0000644000000000000000000031174115031566105022600 0ustar rootroot# Doxyfile 1.8.7 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all text # before the first occurrence of this tag. Doxygen uses libiconv (or the iconv # built into libc) for the transcoding. See http://www.gnu.org/software/libiconv # for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = RapidJSON # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = "A fast JSON parser/generator for C++ with both SAX/DOM style API" # With the PROJECT_LOGO tag one can specify an logo or icon that is included in # the documentation. The maximum height of the logo should not exceed 55 pixels # and the maximum width should not exceed 200 pixels. Doxygen will copy the logo # to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = @CMAKE_CURRENT_BINARY_DIR@ # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. # The default value is: NO. CREATE_SUBDIRS = NO # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. # The default value is: NO. ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, # Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), # Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, # Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, # Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, # Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, # Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a # new page for each member. If set to NO, the documentation of a member will be # part of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:\n" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" # will allow you to use the command class in the itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, Javascript, # C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: # FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: # Fortran. In the later case the parser tries to guess whether the code is fixed # or free formatted code, this is the default for Fortran type files), VHDL. For # instance to make doxygen treat .inc files as Fortran files (default is PHP), # and .f files as C (default is Fortran), use: inc=Fortran f=C. # # Note For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by by putting a % sign in front of the word # or globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = YES # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO # If the EXTRACT_PACKAGE tag is set to YES all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined # locally in source files will be included in the documentation. If set to NO # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO these classes will be included in the various overviews. This option has # no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # (class|struct|union) declarations. If set to NO these declarations will be # included in the documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the # todo list. This list is created by putting \todo commands in the # documentation. # The default value is: YES. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the # test list. This list is created by putting \test commands in the # documentation. # The default value is: YES. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = $(RAPIDJSON_SECTIONS) # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES the list # will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = NO # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. Do not use file names with spaces, bibtex cannot handle them. See # also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters # in a documented function, or documenting parameters that don't exist or using # markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO doxygen will only warn about wrong or incomplete parameter # documentation, but not about the absence of documentation. # The default value is: NO. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. # Note: If this tag is empty the current directory is searched. INPUT = readme.md \ CHANGELOG.md \ include/rapidjson/rapidjson.h \ include/ \ doc/features.md \ doc/tutorial.md \ doc/pointer.md \ doc/stream.md \ doc/encoding.md \ doc/dom.md \ doc/sax.md \ doc/schema.md \ doc/performance.md \ doc/internals.md \ doc/faq.md # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: http://www.gnu.org/software/libiconv) for the list of # possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank the # following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, # *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, # *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, # *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, # *.qsf, *.as and *.js. FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.h \ *.hh \ *.hxx \ *.hpp \ *.inc \ *.md # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = ./include/rapidjson/msinttypes/ # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = internal # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = ./doc # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER ) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = readme.md #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # function all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES, then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see http://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the config file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES # If the CLANG_ASSISTED_PARSING tag is set to YES, then doxygen will use the # clang parser (see: http://clang.llvm.org/) for more accurate parsing at the # cost of reduced performance. This can be particularly helpful with template # rich C++ code for which doxygen's built-in parser lacks the necessary type # information. # Note: The availability of this option depends on whether or not doxygen was # compiled with the --with-libclang option. # The default value is: NO. CLANG_ASSISTED_PARSING = NO # If clang assisted parsing is enabled you can provide the compiler with command # line options that you would normally use when invoking the compiler. Note that # the include paths will already be set by doxygen for the files and directories # specified with INPUT and INCLUDE_PATH. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. CLANG_OPTIONS = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = NO # The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in # which the alphabetical index list will be split. # Minimum value: 1, maximum value: 20, default value: 5. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = ./doc/misc/header.html # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = ./doc/misc/footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- # defined cascading style sheet that is included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet file to the output directory. For an example # see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = ./doc/misc/doxygenextra.css # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the stylesheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # http://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to NO can help when comparing the output of multiple runs. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: http://developer.apple.com/tools/xcode/), introduced with # OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a # Makefile in the HTML output directory. Running make will produce the docset in # that directory and running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler ( hhc.exe). If non-empty # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated ( # YES) or that it should be included in the master .chm file ( NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated ( # YES) or a normal table of contents ( NO) in the .chm file. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = YES # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has # the same information as the tab index, you could consider setting # DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = YES # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # # Note that when changing this option you need to delete any form_*.png files in # the HTML output directory before the changes have effect. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # http://www.mathjax.org) which uses client side Javascript for the rendering # instead of using prerendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: # http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from http://www.mathjax.org before deployment. # The default value is: http://cdn.mathjax.org/mathjax/latest. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /

    $searchbox asymptote-3.05/LspCpp/third_party/rapidjson/doc/misc/doxygenextra.css0000644000000000000000000001465415031566105024656 0ustar rootrootbody code { margin: 0; border: 1px solid #ddd; background-color: #f8f8f8; border-radius: 3px; padding: 0; } a { color: #4183c4; } a.el { font-weight: normal; } body, table, div, p, dl { color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; line-height: 25.5px; } body { background-color: #eee; } div.header { background-image: none; background-color: white; margin: 0px; border: 0px; } div.headertitle { width: 858px; margin: 30px; padding: 0px; } div.toc { background-color: #f8f8f8; border-color: #ddd; margin-right: 10px; margin-left: 20px; } div.toc h3 { color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 18px; font-style: normal; font-variant: normal; font-weight: normal; } div.toc li { color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; } .title { font-size: 2.5em; line-height: 63.75px; border-bottom: 1px solid #ddd; margin-bottom: 15px; margin-left: 0px; margin-right: 0px; margin-top: 0px; } .summary { float: none !important; width: auto !important; padding-top: 10px; padding-right: 10px !important; } .summary + .headertitle .title { font-size: 1.5em; line-height: 2.0em; } body h1 { font-size: 2em; line-height: 1.7; border-bottom: 1px solid #eee; margin: 1em 0 15px; padding: 0; overflow: hidden; } body h2 { font-size: 1.5em; line-height: 1.7; margin: 1em 0 15px; padding: 0; } pre.fragment { font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; line-height: 19px; } table.doxtable th { background-color: #f8f8f8; color: #333333; font-size: 15px; } table.doxtable td, table.doxtable th { border: 1px solid #ddd; } #doc-content { background-color: #fff; width: 918px; height: auto !important; margin-left: 270px !important; } div.contents { width: 858px; margin: 30px; } div.line { font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; line-height: 19px; } tt, code, pre { font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; } div.fragment { background-color: #f8f8f8; border: 1px solid #ddd; font-size: 13px; line-height: 19px; overflow: auto; padding: 6px 10px; border-radius: 3px; } #topbanner { position: fixed; margin: 15px; z-index: 101; } #projectname { font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 38px; font-weight: bold; line-height: 63.75px; margin: 0px; padding: 2px 0px; } #projectbrief { font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 22.4px; margin: 0px 0px 13px 0px; padding: 2px; } /* side bar and search */ #side-nav { padding: 10px 0px 20px 20px; border-top: 60px solid #2980b9; background-color: #343131; width: 250px !important; height: 100% !important; position: fixed; } #nav-tree { background-color: transparent; background-image: none; height: 100% !important; } #nav-tree .label { font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; line-height: 25.5px; font-size: 15px; } #nav-tree { color: #b3b3b3; } #nav-tree .selected { background-image: none; } #nav-tree a { color: #b3b3b3; } #github { position: fixed; left: auto; right: auto; width: 250px; } #MSearchBox { margin: 20px; left: 40px; right: auto; position: fixed; width: 180px; } #MSearchField { width: 121px; } #MSearchResultsWindow { left: 45px !important; } #nav-sync { display: none; } .ui-resizable .ui-resizable-handle { width: 0px; } #nav-path { display: none; } /* external link icon */ div.contents a[href ^= "http"]:after { content: " " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=); } .githublogo { content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RERCMUIwOUY4NkNFMTFFM0FBNTJFRTMzNTJEMUJDNDYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RERCMUIwOUU4NkNFMTFFM0FBNTJFRTMzNTJEMUJDNDYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkU1MTc4QTJBOTlBMDExRTI5QTE1QkMxMDQ2QTg5MDREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkU1MTc4QTJCOTlBMDExRTI5QTE1QkMxMDQ2QTg5MDREIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+jUqS1wAAApVJREFUeNq0l89rE1EQx3e3gVJoSPzZeNEWPKgHoa0HBak0iHiy/4C3WvDmoZ56qJ7txVsPQu8qlqqHIhRKJZceesmhioQEfxTEtsoSpdJg1u/ABJ7Pmc1m8zLwgWTmzcw3L+/te+tHUeQltONgCkyCi2AEDHLsJ6iBMlgHL8FeoqokoA2j4CloRMmtwTmj7erHBXPgCWhG6a3JNXKdCiDl1cidVbXZkJoXQRi5t5BrxwoY71FzU8S4JuAIqFkJ2+BFSlEh525b/hr3+k/AklDkNsf6wTT4yv46KIMNpsy+iMdMc47HNWxbsgVcUn7FmLAzzoFAWDsBx+wVP6bUpp5ewI+DOeUx0Wd9D8F70BTGNjkWtqnhmT1JQAHcUgZd8Lo3rQb1LAT8eJVUfgGvHQigGp+V2Z0iAUUl8QH47kAA1XioxIo+bRN8OG8F/oBjwv+Z1nJgX5jpdzQDw0LCjsPmrcW7I/iHScCAEDj03FtD8A0EyuChHgg4KTlJQF3wZ7WELppnBX+dBFSVpJsOBWi1qiRgSwnOgoyD5hmuJdkWCVhTgnTvW3AgYIFrSbZGh0UW/Io5Vp+DQoK7o80pztWMemZbgxeNwCNwDbw1fIfgGZjhU6xPaJgBV8BdsMw5cbZoHsenwYFxkZzl83xTSKTiviCAfCsJLysH3POfC8m8NegyGAGfLP/VmGmfSChgXroR0RSWjEFv2J/nG84cuKFMf4sTCZqXuJd4KaXFVjEG3+tw4eXbNK/YC9oXXs3O8NY8y99L4BXY5cvLY/Bb2VZ58EOJVcB18DHJq9lRsKr8inyKGVjlmh29mtHs3AHfuhCwy1vXT/Nu2GKQt+UHsGdctyX6eQyNvc+5sfX9Dl7Pe2J/BRgAl2CpwmrsHR0AAAAASUVORK5CYII=); }asymptote-3.05/LspCpp/third_party/rapidjson/doc/misc/footer.html0000644000000000000000000000040015031566105023567 0ustar rootroot asymptote-3.05/LspCpp/third_party/rapidjson/doc/dom.md0000644000000000000000000003615015031566105021564 0ustar rootroot# DOM Document Object Model(DOM) is an in-memory representation of JSON for query and manipulation. The basic usage of DOM is described in [Tutorial](doc/tutorial.md). This section will describe some details and more advanced usages. [TOC] # Template {#Template} In the tutorial, `Value` and `Document` was used. Similarly to `std::string`, these are actually `typedef` of template classes: ~~~~~~~~~~cpp namespace rapidjson { template > class GenericValue { // ... }; template > class GenericDocument : public GenericValue { // ... }; typedef GenericValue > Value; typedef GenericDocument > Document; } // namespace rapidjson ~~~~~~~~~~ User can customize these template parameters. ## Encoding {#Encoding} The `Encoding` parameter specifies the encoding of JSON String value in memory. Possible options are `UTF8`, `UTF16`, `UTF32`. Note that, these 3 types are also template class. `UTF8<>` is `UTF8`, which means using char to store the characters. You may refer to [Encoding](doc/encoding.md) for details. Suppose a Windows application would query localization strings stored in JSON files. Unicode-enabled functions in Windows use UTF-16 (wide character) encoding. No matter what encoding was used in JSON files, we can store the strings in UTF-16 in memory. ~~~~~~~~~~cpp using namespace rapidjson; typedef GenericDocument > WDocument; typedef GenericValue > WValue; FILE* fp = fopen("localization.json", "rb"); // non-Windows use "r" char readBuffer[256]; FileReadStream bis(fp, readBuffer, sizeof(readBuffer)); AutoUTFInputStream eis(bis); // wraps bis into eis WDocument d; d.ParseStream<0, AutoUTF >(eis); const WValue locale(L"ja"); // Japanese MessageBoxW(hWnd, d[locale].GetString(), L"Test", MB_OK); ~~~~~~~~~~ ## Allocator {#Allocator} The `Allocator` defines which allocator class is used when allocating/deallocating memory for `Document`/`Value`. `Document` owns, or references to an `Allocator` instance. On the other hand, `Value` does not do so, in order to reduce memory consumption. The default allocator used in `GenericDocument` is `MemoryPoolAllocator`. This allocator actually allocate memory sequentially, and cannot deallocate one by one. This is very suitable when parsing a JSON into a DOM tree. Another allocator is `CrtAllocator`, of which CRT is short for C RunTime library. This allocator simply calls the standard `malloc()`/`realloc()`/`free()`. When there is a lot of add and remove operations, this allocator may be preferred. But this allocator is far less efficient than `MemoryPoolAllocator`. # Parsing {#Parsing} `Document` provides several functions for parsing. In below, (1) is the fundamental function, while the others are helpers which call (1). ~~~~~~~~~~cpp using namespace rapidjson; // (1) Fundamental template GenericDocument& GenericDocument::ParseStream(InputStream& is); // (2) Using the same Encoding for stream template GenericDocument& GenericDocument::ParseStream(InputStream& is); // (3) Using default parse flags template GenericDocument& GenericDocument::ParseStream(InputStream& is); // (4) In situ parsing template GenericDocument& GenericDocument::ParseInsitu(Ch* str); // (5) In situ parsing, using default parse flags GenericDocument& GenericDocument::ParseInsitu(Ch* str); // (6) Normal parsing of a string template GenericDocument& GenericDocument::Parse(const Ch* str); // (7) Normal parsing of a string, using same Encoding of Document template GenericDocument& GenericDocument::Parse(const Ch* str); // (8) Normal parsing of a string, using default parse flags GenericDocument& GenericDocument::Parse(const Ch* str); ~~~~~~~~~~ The examples of [tutorial](doc/tutorial.md) uses (8) for normal parsing of string. The examples of [stream](doc/stream.md) uses the first three. *In situ* parsing will be described soon. The `parseFlags` are combination of the following bit-flags: Parse flags | Meaning ------------------------------|----------------------------------- `kParseNoFlags` | No flag is set. `kParseDefaultFlags` | Default parse flags. It is equal to macro `RAPIDJSON_PARSE_DEFAULT_FLAGS`, which is defined as `kParseNoFlags`. `kParseInsituFlag` | In-situ(destructive) parsing. `kParseValidateEncodingFlag` | Validate encoding of JSON strings. `kParseIterativeFlag` | Iterative(constant complexity in terms of function call stack size) parsing. `kParseStopWhenDoneFlag` | After parsing a complete JSON root from stream, stop further processing the rest of stream. When this flag is used, parser will not generate `kParseErrorDocumentRootNotSingular` error. Using this flag for parsing multiple JSONs in the same stream. `kParseFullPrecisionFlag` | Parse number in full precision (slower). If this flag is not set, the normal precision (faster) is used. Normal precision has maximum 3 [ULP](http://en.wikipedia.org/wiki/Unit_in_the_last_place) error. `kParseCommentsFlag` | Allow one-line `// ...` and multi-line `/* ... */` comments (relaxed JSON syntax). `kParseNumbersAsStringsFlag` | Parse numerical type values as strings. `kParseTrailingCommasFlag` | Allow trailing commas at the end of objects and arrays (relaxed JSON syntax). `kParseNanAndInfFlag` | Allow parsing `NaN`, `Inf`, `Infinity`, `-Inf` and `-Infinity` as `double` values (relaxed JSON syntax). `kParseEscapedApostropheFlag` | Allow escaped apostrophe `\'` in strings (relaxed JSON syntax). By using a non-type template parameter, instead of a function parameter, C++ compiler can generate code which is optimized for specified combinations, improving speed, and reducing code size (if only using a single specialization). The downside is the flags needed to be determined in compile-time. The `SourceEncoding` parameter defines what encoding is in the stream. This can be differed to the `Encoding` of the `Document`. See [Transcoding and Validation](#TranscodingAndValidation) section for details. And the `InputStream` is type of input stream. ## Parse Error {#ParseError} When the parse processing succeeded, the `Document` contains the parse results. When there is an error, the original DOM is *unchanged*. And the error state of parsing can be obtained by `bool HasParseError()`, `ParseErrorCode GetParseError()` and `size_t GetErrorOffset()`. Parse Error Code | Description --------------------------------------------|--------------------------------------------------- `kParseErrorNone` | No error. `kParseErrorDocumentEmpty` | The document is empty. `kParseErrorDocumentRootNotSingular` | The document root must not follow by other values. `kParseErrorValueInvalid` | Invalid value. `kParseErrorObjectMissName` | Missing a name for object member. `kParseErrorObjectMissColon` | Missing a colon after a name of object member. `kParseErrorObjectMissCommaOrCurlyBracket` | Missing a comma or `}` after an object member. `kParseErrorArrayMissCommaOrSquareBracket` | Missing a comma or `]` after an array element. `kParseErrorStringUnicodeEscapeInvalidHex` | Incorrect hex digit after `\\u` escape in string. `kParseErrorStringUnicodeSurrogateInvalid` | The surrogate pair in string is invalid. `kParseErrorStringEscapeInvalid` | Invalid escape character in string. `kParseErrorStringMissQuotationMark` | Missing a closing quotation mark in string. `kParseErrorStringInvalidEncoding` | Invalid encoding in string. `kParseErrorNumberTooBig` | Number too big to be stored in `double`. `kParseErrorNumberMissFraction` | Miss fraction part in number. `kParseErrorNumberMissExponent` | Miss exponent in number. The offset of error is defined as the character number from beginning of stream. Currently RapidJSON does not keep track of line number. To get an error message, RapidJSON provided a English messages in `rapidjson/error/en.h`. User can customize it for other locales, or use a custom localization system. Here shows an example of parse error handling. ~~~~~~~~~~cpp #include "rapidjson/document.h" #include "rapidjson/error/en.h" // ... Document d; if (d.Parse(json).HasParseError()) { fprintf(stderr, "\nError(offset %u): %s\n", (unsigned)d.GetErrorOffset(), GetParseError_En(d.GetParseError())); // ... } ~~~~~~~~~~ ## In Situ Parsing {#InSituParsing} From [Wikipedia](http://en.wikipedia.org/wiki/In_situ): > *In situ* ... is a Latin phrase that translates literally to "on site" or "in position". It means "locally", "on site", "on the premises" or "in place" to describe an event where it takes place, and is used in many different contexts. > ... > (In computer science) An algorithm is said to be an in situ algorithm, or in-place algorithm, if the extra amount of memory required to execute the algorithm is O(1), that is, does not exceed a constant no matter how large the input. For example, heapsort is an in situ sorting algorithm. In normal parsing process, a large overhead is to decode JSON strings and copy them to other buffers. *In situ* parsing decodes those JSON string at the place where it is stored. It is possible in JSON because the length of decoded string is always shorter than or equal to the one in JSON. In this context, decoding a JSON string means to process the escapes, such as `"\n"`, `"\u1234"`, etc., and add a null terminator (`'\0'`)at the end of string. The following diagrams compare normal and *in situ* parsing. The JSON string values contain pointers to the decoded string. ![normal parsing](diagram/normalparsing.png) In normal parsing, the decoded string are copied to freshly allocated buffers. `"\\n"` (2 characters) is decoded as `"\n"` (1 character). `"\\u0073"` (6 characters) is decoded as `"s"` (1 character). ![instiu parsing](diagram/insituparsing.png) *In situ* parsing just modified the original JSON. Updated characters are highlighted in the diagram. If the JSON string does not contain escape character, such as `"msg"`, the parsing process merely replace the closing double quotation mark with a null character. Since *in situ* parsing modify the input, the parsing API needs `char*` instead of `const char*`. ~~~~~~~~~~cpp // Read whole file into a buffer FILE* fp = fopen("test.json", "r"); fseek(fp, 0, SEEK_END); size_t filesize = (size_t)ftell(fp); fseek(fp, 0, SEEK_SET); char* buffer = (char*)malloc(filesize + 1); size_t readLength = fread(buffer, 1, filesize, fp); buffer[readLength] = '\0'; fclose(fp); // In situ parsing the buffer into d, buffer will also be modified Document d; d.ParseInsitu(buffer); // Query/manipulate the DOM here... free(buffer); // Note: At this point, d may have dangling pointers pointed to the deallocated buffer. ~~~~~~~~~~ The JSON strings are marked as const-string. But they may not be really "constant". The life cycle of it depends on the JSON buffer. In situ parsing minimizes allocation overheads and memory copying. Generally this improves cache coherence, which is an important factor of performance in modern computer. There are some limitations of *in situ* parsing: 1. The whole JSON is in memory. 2. The source encoding in stream and target encoding in document must be the same. 3. The buffer need to be retained until the document is no longer used. 4. If the DOM need to be used for long period after parsing, and there are few JSON strings in the DOM, retaining the buffer may be a memory waste. *In situ* parsing is mostly suitable for short-term JSON that only need to be processed once, and then be released from memory. In practice, these situation is very common, for example, deserializing JSON to C++ objects, processing web requests represented in JSON, etc. ## Transcoding and Validation {#TranscodingAndValidation} RapidJSON supports conversion between Unicode formats (officially termed UCS Transformation Format) internally. During DOM parsing, the source encoding of the stream can be different from the encoding of the DOM. For example, the source stream contains a UTF-8 JSON, while the DOM is using UTF-16 encoding. There is an example code in [EncodedInputStream](doc/stream.md). When writing a JSON from DOM to output stream, transcoding can also be used. An example is in [EncodedOutputStream](doc/stream.md). During transcoding, the source string is decoded to into Unicode code points, and then the code points are encoded in the target format. During decoding, it will validate the byte sequence in the source string. If it is not a valid sequence, the parser will be stopped with `kParseErrorStringInvalidEncoding` error. When the source encoding of stream is the same as encoding of DOM, by default, the parser will *not* validate the sequence. User may use `kParseValidateEncodingFlag` to force validation. # Techniques {#Techniques} Some techniques about using DOM API is discussed here. ## DOM as SAX Event Publisher In RapidJSON, stringifying a DOM with `Writer` may be look a little bit weird. ~~~~~~~~~~cpp // ... Writer writer(buffer); d.Accept(writer); ~~~~~~~~~~ Actually, `Value::Accept()` is responsible for publishing SAX events about the value to the handler. With this design, `Value` and `Writer` are decoupled. `Value` can generate SAX events, and `Writer` can handle those events. User may create custom handlers for transforming the DOM into other formats. For example, a handler which converts the DOM into XML. For more about SAX events and handler, please refer to [SAX](doc/sax.md). ## User Buffer {#UserBuffer} Some applications may try to avoid memory allocations whenever possible. `MemoryPoolAllocator` can support this by letting user to provide a buffer. The buffer can be on the program stack, or a "scratch buffer" which is statically allocated (a static/global array) for storing temporary data. `MemoryPoolAllocator` will use the user buffer to satisfy allocations. When the user buffer is used up, it will allocate a chunk of memory from the base allocator (by default the `CrtAllocator`). Here is an example of using stack memory. The first allocator is for storing values, while the second allocator is for storing temporary data during parsing. ~~~~~~~~~~cpp typedef GenericDocument, MemoryPoolAllocator<>, MemoryPoolAllocator<>> DocumentType; char valueBuffer[4096]; char parseBuffer[1024]; MemoryPoolAllocator<> valueAllocator(valueBuffer, sizeof(valueBuffer)); MemoryPoolAllocator<> parseAllocator(parseBuffer, sizeof(parseBuffer)); DocumentType d(&valueAllocator, sizeof(parseBuffer), &parseAllocator); d.Parse(json); ~~~~~~~~~~ If the total size of allocation is less than 4096+1024 bytes during parsing, this code does not invoke any heap allocation (via `new` or `malloc()`) at all. User can query the current memory consumption in bytes via `MemoryPoolAllocator::Size()`. And then user can determine a suitable size of user buffer. asymptote-3.05/LspCpp/third_party/rapidjson/library.json0000644000000000000000000000054315031566105022252 0ustar rootroot{ "name": "RapidJSON", "version": "1.1.0", "keywords": "json, sax, dom, parser, generator", "description": "A fast JSON parser/generator for C++ with both SAX/DOM style API", "export": { "include": "include" }, "examples": "example/*/*.cpp", "repository": { "type": "git", "url": "https://github.com/Tencent/rapidjson" } } asymptote-3.05/LspCpp/third_party/rapidjson/RapidJSON.pc.in0000644000000000000000000000034515031566105022375 0ustar rootrootincludedir=@INCLUDE_INSTALL_DIR@ Name: @PROJECT_NAME@ Description: A fast JSON parser/generator for C++ with both SAX/DOM style API Version: @LIB_VERSION_STRING@ URL: https://github.com/Tencent/rapidjson Cflags: -I${includedir} asymptote-3.05/LspCpp/third_party/rapidjson/CMakeLists.txt0000644000000000000000000002427515031566105022463 0ustar rootrootCMAKE_MINIMUM_REQUIRED(VERSION 2.8.12) if(POLICY CMP0025) # detect Apple's Clang cmake_policy(SET CMP0025 NEW) endif() if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif() SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules) set(LIB_MAJOR_VERSION "1") set(LIB_MINOR_VERSION "1") set(LIB_PATCH_VERSION "0") set(LIB_VERSION_STRING "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_PATCH_VERSION}") if (CMAKE_VERSION VERSION_LESS 3.0) PROJECT(RapidJSON CXX) else() cmake_policy(SET CMP0048 NEW) PROJECT(RapidJSON VERSION "${LIB_VERSION_STRING}" LANGUAGES CXX) endif() # compile in release with debug info mode by default if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) endif() # Build all binaries in a separate directory SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) option(RAPIDJSON_BUILD_DOC "Build rapidjson documentation." ON) option(RAPIDJSON_BUILD_EXAMPLES "Build rapidjson examples." ON) option(RAPIDJSON_BUILD_TESTS "Build rapidjson perftests and unittests." ON) option(RAPIDJSON_BUILD_THIRDPARTY_GTEST "Use gtest installation in `thirdparty/gtest` by default if available" OFF) option(RAPIDJSON_BUILD_CXX11 "Build rapidjson with C++11" ON) option(RAPIDJSON_BUILD_CXX17 "Build rapidjson with C++17" OFF) if(RAPIDJSON_BUILD_CXX11) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED TRUE) endif() option(RAPIDJSON_BUILD_ASAN "Build rapidjson with address sanitizer (gcc/clang)" OFF) option(RAPIDJSON_BUILD_UBSAN "Build rapidjson with undefined behavior sanitizer (gcc/clang)" OFF) option(RAPIDJSON_ENABLE_INSTRUMENTATION_OPT "Build rapidjson with -march or -mcpu options" ON) option(RAPIDJSON_HAS_STDSTRING "" OFF) if(RAPIDJSON_HAS_STDSTRING) add_definitions(-DRAPIDJSON_HAS_STDSTRING) endif() option(RAPIDJSON_USE_MEMBERSMAP "" OFF) if(RAPIDJSON_USE_MEMBERSMAP) add_definitions(-DRAPIDJSON_USE_MEMBERSMAP=1) endif() find_program(CCACHE_FOUND ccache) if(CCACHE_FOUND) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments -fcolor-diagnostics") endif() endif(CCACHE_FOUND) if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") if(RAPIDJSON_ENABLE_INSTRUMENTATION_OPT AND NOT CMAKE_CROSSCOMPILING) if(CMAKE_SYSTEM_PROCESSOR STREQUAL "powerpc" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=native") else() #FIXME: x86 is -march=native, but doesn't mean every arch is this option. To keep original project's compatibility, I leave this except POWER. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native") endif() endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror") set(EXTRA_CXX_FLAGS -Weffc++ -Wswitch-default -Wfloat-equal -Wconversion -Wsign-conversion) if (RAPIDJSON_BUILD_CXX11 AND CMAKE_VERSION VERSION_LESS 3.1) if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7.0") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") endif() elseif (RAPIDJSON_BUILD_CXX17 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") endif() if (RAPIDJSON_BUILD_ASAN) if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.8.0") message(FATAL_ERROR "GCC < 4.8 doesn't support the address sanitizer") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") endif() endif() if (RAPIDJSON_BUILD_UBSAN) if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9.0") message(FATAL_ERROR "GCC < 4.9 doesn't support the undefined behavior sanitizer") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined") endif() endif() elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(NOT CMAKE_CROSSCOMPILING) if(CMAKE_SYSTEM_PROCESSOR STREQUAL "powerpc" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=native") else() #FIXME: x86 is -march=native, but doesn't mean every arch is this option. To keep original project's compatibility, I leave this except POWER. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native") endif() endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror -Wno-missing-field-initializers") set(EXTRA_CXX_FLAGS -Weffc++ -Wswitch-default -Wfloat-equal -Wconversion -Wimplicit-fallthrough) if (RAPIDJSON_BUILD_CXX11 AND CMAKE_VERSION VERSION_LESS 3.1) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") elseif (RAPIDJSON_BUILD_CXX17 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.0") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") endif() if (RAPIDJSON_BUILD_ASAN) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") endif() if (RAPIDJSON_BUILD_UBSAN) if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined") endif() endif() elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") add_definitions(-D_CRT_SECURE_NO_WARNINGS=1) add_definitions(-DNOMINMAX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") # CMake >= 3.10 should handle the above CMAKE_CXX_STANDARD fine, otherwise use /std:c++XX with MSVC >= 19.10 if (RAPIDJSON_BUILD_CXX11 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.10") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++11") elseif (RAPIDJSON_BUILD_CXX17 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.14") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17") endif() # Always compile with /WX if(CMAKE_CXX_FLAGS MATCHES "/WX-") string(REGEX REPLACE "/WX-" "/WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX") endif() elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -qarch=auto") endif() #add extra search paths for libraries and includes SET(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "The directory the headers are installed in") SET(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE STRING "Directory where lib will install") SET(DOC_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/doc/${PROJECT_NAME}" CACHE PATH "Path to the documentation") IF(UNIX OR CYGWIN) SET(_CMAKE_INSTALL_DIR "${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME}") ELSEIF(WIN32) SET(_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/cmake") ENDIF() SET(CMAKE_INSTALL_DIR "${_CMAKE_INSTALL_DIR}" CACHE PATH "The directory cmake files are installed in") include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) if(RAPIDJSON_BUILD_DOC) add_subdirectory(doc) endif() add_custom_target(travis_doc) add_custom_command(TARGET travis_doc COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/travis-doxygen.sh) if(RAPIDJSON_BUILD_EXAMPLES) add_subdirectory(example) endif() if(RAPIDJSON_BUILD_TESTS) if(MSVC11) # required for VS2012 due to missing support for variadic templates add_definitions(-D_VARIADIC_MAX=10) endif(MSVC11) add_subdirectory(test) include(CTest) endif() # pkg-config IF (UNIX OR CYGWIN) CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc @ONLY) INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION "${LIB_INSTALL_DIR}/pkgconfig" COMPONENT pkgconfig) ENDIF() install(FILES readme.md DESTINATION "${DOC_INSTALL_DIR}" COMPONENT doc) install(DIRECTORY include/rapidjson DESTINATION "${INCLUDE_INSTALL_DIR}" COMPONENT dev) install(DIRECTORY example/ DESTINATION "${DOC_INSTALL_DIR}/examples" COMPONENT examples # Following patterns are for excluding the intermediate/object files # from an install of in-source CMake build. PATTERN "CMakeFiles" EXCLUDE PATTERN "Makefile" EXCLUDE PATTERN "cmake_install.cmake" EXCLUDE) # Provide config and version files to be used by other applications # =============================== ################################################################################ # Export package for use from the build tree EXPORT( PACKAGE ${PROJECT_NAME} ) # Create the RapidJSONConfig.cmake file for other cmake projects. # ... for the build tree SET( CONFIG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) SET( CONFIG_DIR ${CMAKE_CURRENT_BINARY_DIR}) SET( ${PROJECT_NAME}_INCLUDE_DIR "\${${PROJECT_NAME}_SOURCE_DIR}/include" ) CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake @ONLY ) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}ConfigVersion.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake @ONLY) # ... for the install tree SET( CMAKECONFIG_INSTALL_DIR ${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME} ) FILE( RELATIVE_PATH REL_INCLUDE_DIR "${CMAKECONFIG_INSTALL_DIR}" "${CMAKE_INSTALL_PREFIX}/include" ) SET( ${PROJECT_NAME}_INCLUDE_DIR "\${${PROJECT_NAME}_CMAKE_DIR}/${REL_INCLUDE_DIR}" ) SET( CONFIG_SOURCE_DIR ) SET( CONFIG_DIR ) CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake @ONLY ) INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake" DESTINATION ${CMAKECONFIG_INSTALL_DIR} ) # Install files IF(CMAKE_INSTALL_DIR) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake DESTINATION "${CMAKE_INSTALL_DIR}" COMPONENT dev) ENDIF() asymptote-3.05/LspCpp/third_party/rapidjson/appveyor.yml0000644000000000000000000000514615031566105022307 0ustar rootrootversion: 1.1.0.{build} configuration: - Debug - Release environment: matrix: # - VS_VERSION: 9 2008 # VS_PLATFORM: win32 # - VS_VERSION: 9 2008 # VS_PLATFORM: x64 - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 VS_VERSION: 10 2010 VS_PLATFORM: win32 CXX11: OFF CXX17: OFF MEMBERSMAP: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 VS_VERSION: 10 2010 VS_PLATFORM: x64 CXX11: OFF CXX17: OFF MEMBERSMAP: ON - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 VS_VERSION: 11 2012 VS_PLATFORM: win32 CXX11: OFF CXX17: OFF MEMBERSMAP: ON - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 VS_VERSION: 11 2012 VS_PLATFORM: x64 CXX11: OFF CXX17: OFF MEMBERSMAP: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 VS_VERSION: 12 2013 VS_PLATFORM: win32 CXX11: OFF CXX17: OFF MEMBERSMAP: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 VS_VERSION: 12 2013 VS_PLATFORM: x64 CXX11: OFF CXX17: OFF MEMBERSMAP: ON - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 VS_VERSION: 14 2015 VS_PLATFORM: win32 CXX11: OFF CXX17: OFF MEMBERSMAP: ON - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 VS_VERSION: 14 2015 VS_PLATFORM: x64 CXX11: OFF CXX17: OFF MEMBERSMAP: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 VS_VERSION: 15 2017 VS_PLATFORM: win32 CXX11: OFF CXX17: OFF MEMBERSMAP: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 VS_VERSION: 15 2017 VS_PLATFORM: x64 CXX11: OFF CXX17: OFF MEMBERSMAP: ON - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 VS_VERSION: 15 2017 VS_PLATFORM: x64 CXX11: ON CXX17: OFF MEMBERSMAP: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 VS_VERSION: 15 2017 VS_PLATFORM: x64 CXX11: OFF CXX17: ON MEMBERSMAP: OFF - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 VS_VERSION: 16 2019 VS_PLATFORM: x64 CXX11: OFF CXX17: ON MEMBERSMAP: ON before_build: - git submodule update --init --recursive - cmake -H. -BBuild/VS -G "Visual Studio %VS_VERSION%" -DCMAKE_GENERATOR_PLATFORM=%VS_PLATFORM% -DCMAKE_VERBOSE_MAKEFILE=ON -DBUILD_SHARED_LIBS=true -DRAPIDJSON_BUILD_CXX11=%CXX11% -DRAPIDJSON_BUILD_CXX17=%CXX17% -DRAPIDJSON_USE_MEMBERSMAP=%MEMBERSMAP% -Wno-dev build: project: Build\VS\RapidJSON.sln parallel: true verbosity: minimal test_script: - cd Build\VS && if %CONFIGURATION%==Debug (ctest --verbose -E perftest --build-config %CONFIGURATION%) else (ctest --verbose --build-config %CONFIGURATION%) asymptote-3.05/LspCpp/third_party/rapidjson/rapidjson.autopkg0000644000000000000000000000651715031566105023307 0ustar rootrootnuget { //Usage: Write-NuGetPackage rapidjson.autopkg -defines:MYVERSION=1.1.0 //Be sure you are running Powershell 3.0 and have the CoApp powershell extensions installed properly. nuspec { id = rapidjson; version : ${MYVERSION}; title: "rapidjson"; authors: {"https://github.com/Tencent/rapidjson/releases/tag/v1.1.0"}; owners: {"@lsantos (github)"}; licenseUrl: "https://github.com/Tencent/rapidjson/blob/master/license.txt"; projectUrl: "https://github.com/Tencent/rapidjson/"; iconUrl: "https://cdn1.iconfinder.com/data/icons/fatcow/32x32/json.png"; requireLicenseAcceptance:false; summary: @"A fast JSON parser/generator for C++ with both SAX/DOM style API"; // if you need to span several lines you can prefix a string with an @ symbol (exactly like c# does). description: @"Rapidjson is an attempt to create the fastest JSON parser and generator. - Small but complete. Supports both SAX and DOM style API. SAX parser only a few hundred lines of code. - Fast. In the order of magnitude of strlen(). Optionally supports SSE2/SSE4.2 for acceleration. - Self-contained. Minimal dependency on standard libraries. No BOOST, not even STL. - Compact. Each JSON value is 16 or 20 bytes for 32 or 64-bit machines respectively (excluding text string storage). With the custom memory allocator, parser allocates memory compactly during parsing. - Full RFC4627 compliance. Supports UTF-8, UTF-16 and UTF-32. - Support both in-situ parsing (directly decode strings into the source JSON text) and non-destructive parsing (decode strings into new buffers). - Parse number to int/unsigned/int64_t/uint64_t/double depending on input - Support custom memory allocation. Also, the default memory pool allocator can also be supplied with a user buffer (such as a buffer allocated on user's heap or - programme stack) to minimize allocation. As the name implies, rapidjson is inspired by rapidxml."; releaseNotes: @" Added Add Value::XXXMember(...) overloads for std::string (#335) Fixed Include rapidjson.h for all internal/error headers. Parsing some numbers incorrectly in full-precision mode (kFullPrecisionParseFlag) (#342) Fix alignment of 64bit platforms (#328) Fix MemoryPoolAllocator::Clear() to clear user-buffer (0691502) Changed CMakeLists for include as a thirdparty in projects (#334, #337) Change Document::ParseStream() to use stack allocator for Reader (ffbe386)"; copyright: "Copyright 2015"; tags: { native, coapp, JSON, nativepackage }; language: en-US; }; dependencies { packages : { //TODO: Add dependencies here in [pkg.name]/[version] form per newline //zlib/[1.2.8], }; } // the files that go into the content folders files { #defines { SDK_ROOT = .\; } // grab all the files in the include folder // the folder that contains all the .h files will // automatically get added to the Includes path. nestedinclude += { #destination = ${d_include}rapidjson; "${SDK_ROOT}include\rapidjson\**\*.h" }; }; targets { // We're trying to be standard about these sorts of thing. (Will help with config.h later :D) //Defines += HAS_EQCORE; // Fix creating the package with Raggles' fork of CoApp Includes += "$(MSBuildThisFileDirectory)../..${d_include}"; }; }asymptote-3.05/LspCpp/third_party/rapidjson/CMakeModules/0000755000000000000000000000000015031566105022222 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/CMakeModules/FindGTestSrc.cmake0000644000000000000000000000147415031566105025531 0ustar rootroot SET(GTEST_SEARCH_PATH "${GTEST_SOURCE_DIR}" "${CMAKE_CURRENT_LIST_DIR}/../thirdparty/gtest/googletest") IF(UNIX) IF(RAPIDJSON_BUILD_THIRDPARTY_GTEST) LIST(APPEND GTEST_SEARCH_PATH "/usr/src/gtest") ELSE() LIST(INSERT GTEST_SEARCH_PATH 1 "/usr/src/gtest") ENDIF() ENDIF() FIND_PATH(GTEST_SOURCE_DIR NAMES CMakeLists.txt src/gtest_main.cc PATHS ${GTEST_SEARCH_PATH}) # Debian installs gtest include directory in /usr/include, thus need to look # for include directory separately from source directory. FIND_PATH(GTEST_INCLUDE_DIR NAMES gtest/gtest.h PATH_SUFFIXES include HINTS ${GTEST_SOURCE_DIR} PATHS ${GTEST_SEARCH_PATH}) INCLUDE(FindPackageHandleStandardArgs) find_package_handle_standard_args(GTestSrc DEFAULT_MSG GTEST_SOURCE_DIR GTEST_INCLUDE_DIR) asymptote-3.05/LspCpp/third_party/rapidjson/include_dirs.js0000644000000000000000000000013615031566105022713 0ustar rootrootvar path = require('path'); console.log(path.join(path.relative('.', __dirname), 'include')); asymptote-3.05/LspCpp/third_party/rapidjson/docker/0000755000000000000000000000000015031566105021160 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/docker/debian/0000755000000000000000000000000015031566105022402 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/docker/debian/Dockerfile0000644000000000000000000000034515031566105024376 0ustar rootroot# BUILD: docker build -t rapidjson-debian . # RUN: docker run -it -v "$PWD"/../..:/rapidjson rapidjson-debian FROM debian:jessie RUN apt-get update && apt-get install -y g++ cmake doxygen valgrind ENTRYPOINT ["/bin/bash"] asymptote-3.05/LspCpp/third_party/rapidjson/test/0000755000000000000000000000000015031566105020670 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/test/CMakeLists.txt0000644000000000000000000000075315031566105023435 0ustar rootrootfind_package(GTestSrc) IF(GTESTSRC_FOUND) enable_testing() if (WIN32 AND (NOT CYGWIN) AND (NOT MINGW)) set(gtest_disable_pthreads ON) set(gtest_force_shared_crt ON) endif() add_subdirectory(${GTEST_SOURCE_DIR} ${CMAKE_BINARY_DIR}/googletest) include_directories(SYSTEM ${GTEST_INCLUDE_DIR}) set(TEST_LIBRARIES gtest gtest_main) add_custom_target(tests ALL) add_subdirectory(perftest) add_subdirectory(unittest) ENDIF(GTESTSRC_FOUND) asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/0000755000000000000000000000000015031566105022547 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/encodedstreamtest.cpp0000644000000000000000000002733415031566105027001 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/filereadstream.h" #include "rapidjson/filewritestream.h" #include "rapidjson/encodedstream.h" #include "rapidjson/stringbuffer.h" #include "rapidjson/memorystream.h" #include "rapidjson/memorybuffer.h" using namespace rapidjson; class EncodedStreamTest : public ::testing::Test { public: EncodedStreamTest() : json_(), length_() {} virtual ~EncodedStreamTest(); virtual void SetUp() { json_ = ReadFile("utf8.json", true, &length_); } virtual void TearDown() { free(json_); json_ = 0; } private: EncodedStreamTest(const EncodedStreamTest&); EncodedStreamTest& operator=(const EncodedStreamTest&); protected: static FILE* Open(const char* filename) { const char *paths[] = { "encodings", "bin/encodings", "../bin/encodings", "../../bin/encodings", "../../../bin/encodings" }; char buffer[1024]; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { sprintf(buffer, "%s/%s", paths[i], filename); FILE *fp = fopen(buffer, "rb"); if (fp) return fp; } return 0; } static char *ReadFile(const char* filename, bool appendPath, size_t* outLength) { FILE *fp = appendPath ? Open(filename) : fopen(filename, "rb"); if (!fp) { *outLength = 0; return 0; } fseek(fp, 0, SEEK_END); *outLength = static_cast(ftell(fp)); fseek(fp, 0, SEEK_SET); char* buffer = static_cast(malloc(*outLength + 1)); size_t readLength = fread(buffer, 1, *outLength, fp); buffer[readLength] = '\0'; fclose(fp); return buffer; } template void TestEncodedInputStream(const char* filename) { // Test FileReadStream { char buffer[16]; FILE *fp = Open(filename); ASSERT_TRUE(fp != 0); FileReadStream fs(fp, buffer, sizeof(buffer)); EncodedInputStream eis(fs); StringStream s(json_); while (eis.Peek() != '\0') { unsigned expected, actual; EXPECT_TRUE(UTF8<>::Decode(s, &expected)); EXPECT_TRUE(MemoryEncoding::Decode(eis, &actual)); EXPECT_EQ(expected, actual); } EXPECT_EQ('\0', s.Peek()); fclose(fp); } // Test MemoryStream { size_t size; char* data = ReadFile(filename, true, &size); MemoryStream ms(data, size); EncodedInputStream eis(ms); StringStream s(json_); while (eis.Peek() != '\0') { unsigned expected, actual; EXPECT_TRUE(UTF8<>::Decode(s, &expected)); EXPECT_TRUE(MemoryEncoding::Decode(eis, &actual)); EXPECT_EQ(expected, actual); } EXPECT_EQ('\0', s.Peek()); EXPECT_EQ(size, eis.Tell()); free(data); } } void TestAutoUTFInputStream(const char *filename, bool expectHasBOM) { // Test FileReadStream { char buffer[16]; FILE *fp = Open(filename); ASSERT_TRUE(fp != 0); FileReadStream fs(fp, buffer, sizeof(buffer)); AutoUTFInputStream eis(fs); EXPECT_EQ(expectHasBOM, eis.HasBOM()); StringStream s(json_); while (eis.Peek() != '\0') { unsigned expected, actual; EXPECT_TRUE(UTF8<>::Decode(s, &expected)); EXPECT_TRUE(AutoUTF::Decode(eis, &actual)); EXPECT_EQ(expected, actual); } EXPECT_EQ('\0', s.Peek()); fclose(fp); } // Test MemoryStream { size_t size; char* data = ReadFile(filename, true, &size); MemoryStream ms(data, size); AutoUTFInputStream eis(ms); EXPECT_EQ(expectHasBOM, eis.HasBOM()); StringStream s(json_); while (eis.Peek() != '\0') { unsigned expected, actual; EXPECT_TRUE(UTF8<>::Decode(s, &expected)); EXPECT_TRUE(AutoUTF::Decode(eis, &actual)); EXPECT_EQ(expected, actual); } EXPECT_EQ('\0', s.Peek()); free(data); EXPECT_EQ(size, eis.Tell()); } } template void TestEncodedOutputStream(const char* expectedFilename, bool putBOM) { // Test FileWriteStream { char filename[L_tmpnam]; FILE* fp = TempFile(filename); char buffer[16]; FileWriteStream os(fp, buffer, sizeof(buffer)); EncodedOutputStream eos(os, putBOM); StringStream s(json_); while (s.Peek() != '\0') { bool success = Transcoder, MemoryEncoding>::Transcode(s, eos); EXPECT_TRUE(success); } eos.Flush(); fclose(fp); EXPECT_TRUE(CompareFile(filename, expectedFilename)); remove(filename); } // Test MemoryBuffer { MemoryBuffer mb; EncodedOutputStream eos(mb, putBOM); StringStream s(json_); while (s.Peek() != '\0') { bool success = Transcoder, MemoryEncoding>::Transcode(s, eos); EXPECT_TRUE(success); } eos.Flush(); EXPECT_TRUE(CompareBufferFile(mb.GetBuffer(), mb.GetSize(), expectedFilename)); } } void TestAutoUTFOutputStream(UTFType type, bool putBOM, const char *expectedFilename) { // Test FileWriteStream { char filename[L_tmpnam]; FILE* fp = TempFile(filename); char buffer[16]; FileWriteStream os(fp, buffer, sizeof(buffer)); AutoUTFOutputStream eos(os, type, putBOM); StringStream s(json_); while (s.Peek() != '\0') { bool success = Transcoder, AutoUTF >::Transcode(s, eos); EXPECT_TRUE(success); } eos.Flush(); fclose(fp); EXPECT_TRUE(CompareFile(filename, expectedFilename)); remove(filename); } // Test MemoryBuffer { MemoryBuffer mb; AutoUTFOutputStream eos(mb, type, putBOM); StringStream s(json_); while (s.Peek() != '\0') { bool success = Transcoder, AutoUTF >::Transcode(s, eos); EXPECT_TRUE(success); } eos.Flush(); EXPECT_TRUE(CompareBufferFile(mb.GetBuffer(), mb.GetSize(), expectedFilename)); } } bool CompareFile(const char* filename, const char* expectedFilename) { size_t actualLength, expectedLength; char* actualBuffer = ReadFile(filename, false, &actualLength); char* expectedBuffer = ReadFile(expectedFilename, true, &expectedLength); bool ret = (expectedLength == actualLength) && memcmp(expectedBuffer, actualBuffer, actualLength) == 0; free(actualBuffer); free(expectedBuffer); return ret; } bool CompareBufferFile(const char* actualBuffer, size_t actualLength, const char* expectedFilename) { size_t expectedLength; char* expectedBuffer = ReadFile(expectedFilename, true, &expectedLength); bool ret = (expectedLength == actualLength) && memcmp(expectedBuffer, actualBuffer, actualLength) == 0; free(expectedBuffer); return ret; } char *json_; size_t length_; }; EncodedStreamTest::~EncodedStreamTest() {} TEST_F(EncodedStreamTest, EncodedInputStream) { TestEncodedInputStream, UTF8<> >("utf8.json"); TestEncodedInputStream, UTF8<> >("utf8bom.json"); TestEncodedInputStream, UTF16<> >("utf16le.json"); TestEncodedInputStream, UTF16<> >("utf16lebom.json"); TestEncodedInputStream, UTF16<> >("utf16be.json"); TestEncodedInputStream, UTF16<> >("utf16bebom.json"); TestEncodedInputStream, UTF32<> >("utf32le.json"); TestEncodedInputStream, UTF32<> >("utf32lebom.json"); TestEncodedInputStream, UTF32<> >("utf32be.json"); TestEncodedInputStream, UTF32<> >("utf32bebom.json"); } TEST_F(EncodedStreamTest, AutoUTFInputStream) { TestAutoUTFInputStream("utf8.json", false); TestAutoUTFInputStream("utf8bom.json", true); TestAutoUTFInputStream("utf16le.json", false); TestAutoUTFInputStream("utf16lebom.json",true); TestAutoUTFInputStream("utf16be.json", false); TestAutoUTFInputStream("utf16bebom.json",true); TestAutoUTFInputStream("utf32le.json", false); TestAutoUTFInputStream("utf32lebom.json",true); TestAutoUTFInputStream("utf32be.json", false); TestAutoUTFInputStream("utf32bebom.json", true); { // Auto detection fail, use user defined UTF type const char json[] = "{ }"; MemoryStream ms(json, sizeof(json)); AutoUTFInputStream eis(ms, kUTF8); EXPECT_FALSE(eis.HasBOM()); EXPECT_EQ(kUTF8, eis.GetType()); } } TEST_F(EncodedStreamTest, EncodedOutputStream) { TestEncodedOutputStream, UTF8<> >("utf8.json", false); TestEncodedOutputStream, UTF8<> >("utf8bom.json", true); TestEncodedOutputStream, UTF16<> >("utf16le.json", false); TestEncodedOutputStream, UTF16<> >("utf16lebom.json",true); TestEncodedOutputStream, UTF16<> >("utf16be.json", false); TestEncodedOutputStream, UTF16<> >("utf16bebom.json",true); TestEncodedOutputStream, UTF32<> >("utf32le.json", false); TestEncodedOutputStream, UTF32<> >("utf32lebom.json",true); TestEncodedOutputStream, UTF32<> >("utf32be.json", false); TestEncodedOutputStream, UTF32<> >("utf32bebom.json",true); } TEST_F(EncodedStreamTest, AutoUTFOutputStream) { TestAutoUTFOutputStream(kUTF8, false, "utf8.json"); TestAutoUTFOutputStream(kUTF8, true, "utf8bom.json"); TestAutoUTFOutputStream(kUTF16LE, false, "utf16le.json"); TestAutoUTFOutputStream(kUTF16LE, true, "utf16lebom.json"); TestAutoUTFOutputStream(kUTF16BE, false, "utf16be.json"); TestAutoUTFOutputStream(kUTF16BE, true, "utf16bebom.json"); TestAutoUTFOutputStream(kUTF32LE, false, "utf32le.json"); TestAutoUTFOutputStream(kUTF32LE, true, "utf32lebom.json"); TestAutoUTFOutputStream(kUTF32BE, false, "utf32be.json"); TestAutoUTFOutputStream(kUTF32BE, true, "utf32bebom.json"); } asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/strtodtest.cpp0000644000000000000000000001023015031566105025466 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/internal/strtod.h" #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(unreachable-code) #endif #define BIGINTEGER_LITERAL(s) BigInteger(s, sizeof(s) - 1) using namespace rapidjson::internal; TEST(Strtod, CheckApproximationCase) { static const int kSignificandSize = 52; static const int kExponentBias = 0x3FF; static const uint64_t kExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); static const uint64_t kSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); static const uint64_t kHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); // http://www.exploringbinary.com/using-integers-to-check-a-floating-point-approximation/ // Let b = 0x1.465a72e467d88p-149 // = 5741268244528520 x 2^-201 union { double d; uint64_t u; }u; u.u = 0x465a72e467d88 | ((static_cast(-149 + kExponentBias)) << kSignificandSize); const double b = u.d; const uint64_t bInt = (u.u & kSignificandMask) | kHiddenBit; const int bExp = static_cast(((u.u & kExponentMask) >> kSignificandSize) - kExponentBias - kSignificandSize); EXPECT_DOUBLE_EQ(1.7864e-45, b); EXPECT_EQ(RAPIDJSON_UINT64_C2(0x001465a7, 0x2e467d88), bInt); EXPECT_EQ(-201, bExp); // Let d = 17864 x 10-49 const char dInt[] = "17864"; const int dExp = -49; // Let h = 2^(bExp-1) const int hExp = bExp - 1; EXPECT_EQ(-202, hExp); int dS_Exp2 = 0; int dS_Exp5 = 0; int bS_Exp2 = 0; int bS_Exp5 = 0; int hS_Exp2 = 0; int hS_Exp5 = 0; // Adjust for decimal exponent if (dExp >= 0) { dS_Exp2 += dExp; dS_Exp5 += dExp; } else { bS_Exp2 -= dExp; bS_Exp5 -= dExp; hS_Exp2 -= dExp; hS_Exp5 -= dExp; } // Adjust for binary exponent if (bExp >= 0) bS_Exp2 += bExp; else { dS_Exp2 -= bExp; hS_Exp2 -= bExp; } // Adjust for half ulp exponent if (hExp >= 0) hS_Exp2 += hExp; else { dS_Exp2 -= hExp; bS_Exp2 -= hExp; } // Remove common power of two factor from all three scaled values int common_Exp2 = (std::min)(dS_Exp2, (std::min)(bS_Exp2, hS_Exp2)); dS_Exp2 -= common_Exp2; bS_Exp2 -= common_Exp2; hS_Exp2 -= common_Exp2; EXPECT_EQ(153, dS_Exp2); EXPECT_EQ(0, dS_Exp5); EXPECT_EQ(1, bS_Exp2); EXPECT_EQ(49, bS_Exp5); EXPECT_EQ(0, hS_Exp2); EXPECT_EQ(49, hS_Exp5); BigInteger dS = BIGINTEGER_LITERAL(dInt); dS.MultiplyPow5(static_cast(dS_Exp5)) <<= static_cast(dS_Exp2); BigInteger bS(bInt); bS.MultiplyPow5(static_cast(bS_Exp5)) <<= static_cast(bS_Exp2); BigInteger hS(1); hS.MultiplyPow5(static_cast(hS_Exp5)) <<= static_cast(hS_Exp2); EXPECT_TRUE(BIGINTEGER_LITERAL("203970822259994138521801764465966248930731085529088") == dS); EXPECT_TRUE(BIGINTEGER_LITERAL("203970822259994122305215569213032722473144531250000") == bS); EXPECT_TRUE(BIGINTEGER_LITERAL("17763568394002504646778106689453125") == hS); EXPECT_EQ(1, dS.Compare(bS)); BigInteger delta(0); EXPECT_FALSE(dS.Difference(bS, &delta)); EXPECT_TRUE(BIGINTEGER_LITERAL("16216586195252933526457586554279088") == delta); EXPECT_TRUE(bS.Difference(dS, &delta)); EXPECT_TRUE(BIGINTEGER_LITERAL("16216586195252933526457586554279088") == delta); EXPECT_EQ(-1, delta.Compare(hS)); } #ifdef __clang__ RAPIDJSON_DIAG_POP #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/ostreamwrappertest.cpp0000644000000000000000000000465515031566105027240 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/ostreamwrapper.h" #include "rapidjson/encodedstream.h" #include "rapidjson/document.h" #include #include using namespace rapidjson; using namespace std; template static void TestStringStream() { typedef typename StringStreamType::char_type Ch; Ch s[] = { 'A', 'B', 'C', '\0' }; StringStreamType oss(s); BasicOStreamWrapper os(oss); for (size_t i = 0; i < 3; i++) os.Put(s[i]); os.Flush(); for (size_t i = 0; i < 3; i++) EXPECT_EQ(s[i], oss.str()[i]); } TEST(OStreamWrapper, ostringstream) { TestStringStream(); } TEST(OStreamWrapper, stringstream) { TestStringStream(); } TEST(OStreamWrapper, wostringstream) { TestStringStream(); } TEST(OStreamWrapper, wstringstream) { TestStringStream(); } TEST(OStreamWrapper, cout) { OStreamWrapper os(cout); const char* s = "Hello World!\n"; while (*s) os.Put(*s++); os.Flush(); } template static void TestFileStream() { char filename[L_tmpnam]; FILE* fp = TempFile(filename); fclose(fp); const char* s = "Hello World!\n"; { FileStreamType ofs(filename, ios::out | ios::binary); BasicOStreamWrapper osw(ofs); for (const char* p = s; *p; p++) osw.Put(*p); osw.Flush(); } fp = fopen(filename, "r"); ASSERT_TRUE( fp != NULL ); for (const char* p = s; *p; p++) EXPECT_EQ(*p, static_cast(fgetc(fp))); fclose(fp); } TEST(OStreamWrapper, ofstream) { TestFileStream(); } TEST(OStreamWrapper, fstream) { TestFileStream(); } asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/allocatorstest.cpp0000644000000000000000000002151415031566105026321 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/allocators.h" #include #include #include #include using namespace rapidjson; template void TestAllocator(Allocator& a) { EXPECT_TRUE(a.Malloc(0) == 0); uint8_t* p = static_cast(a.Malloc(100)); EXPECT_TRUE(p != 0); for (size_t i = 0; i < 100; i++) p[i] = static_cast(i); // Expand uint8_t* q = static_cast(a.Realloc(p, 100, 200)); EXPECT_TRUE(q != 0); for (size_t i = 0; i < 100; i++) EXPECT_EQ(i, q[i]); for (size_t i = 100; i < 200; i++) q[i] = static_cast(i); // Shrink uint8_t *r = static_cast(a.Realloc(q, 200, 150)); EXPECT_TRUE(r != 0); for (size_t i = 0; i < 150; i++) EXPECT_EQ(i, r[i]); Allocator::Free(r); // Realloc to zero size EXPECT_TRUE(a.Realloc(a.Malloc(1), 1, 0) == 0); } struct TestStdAllocatorData { TestStdAllocatorData(int &constructions, int &destructions) : constructions_(&constructions), destructions_(&destructions) { ++*constructions_; } TestStdAllocatorData(const TestStdAllocatorData& rhs) : constructions_(rhs.constructions_), destructions_(rhs.destructions_) { ++*constructions_; } TestStdAllocatorData& operator=(const TestStdAllocatorData& rhs) { this->~TestStdAllocatorData(); constructions_ = rhs.constructions_; destructions_ = rhs.destructions_; ++*constructions_; return *this; } ~TestStdAllocatorData() { ++*destructions_; } private: TestStdAllocatorData(); int *constructions_, *destructions_; }; template void TestStdAllocator(const Allocator& a) { #if RAPIDJSON_HAS_CXX17 typedef StdAllocator BoolAllocator; #else typedef StdAllocator VoidAllocator; typedef typename VoidAllocator::template rebind::other BoolAllocator; #endif BoolAllocator ba(a), ba2(a); EXPECT_TRUE(ba == ba2); EXPECT_FALSE(ba!= ba2); ba.deallocate(ba.allocate()); EXPECT_TRUE(ba == ba2); EXPECT_FALSE(ba != ba2); unsigned long long ll = 0, *llp = ≪ const unsigned long long cll = 0, *cllp = &cll; StdAllocator lla(a); EXPECT_EQ(lla.address(ll), llp); EXPECT_EQ(lla.address(cll), cllp); EXPECT_TRUE(lla.max_size() > 0 && lla.max_size() <= SIZE_MAX / sizeof(unsigned long long)); int *arr; StdAllocator ia(a); arr = ia.allocate(10 * sizeof(int)); EXPECT_TRUE(arr != 0); for (int i = 0; i < 10; ++i) { arr[i] = 0x0f0f0f0f; } ia.deallocate(arr, 10); arr = Malloc(ia, 10); EXPECT_TRUE(arr != 0); for (int i = 0; i < 10; ++i) { arr[i] = 0x0f0f0f0f; } arr = Realloc(ia, arr, 10, 20); EXPECT_TRUE(arr != 0); for (int i = 0; i < 10; ++i) { EXPECT_EQ(arr[i], 0x0f0f0f0f); } for (int i = 10; i < 20; i++) { arr[i] = 0x0f0f0f0f; } Free(ia, arr, 20); int cons = 0, dest = 0; StdAllocator da(a); for (int i = 1; i < 10; i++) { TestStdAllocatorData *d = da.allocate(); EXPECT_TRUE(d != 0); da.destroy(new(d) TestStdAllocatorData(cons, dest)); EXPECT_EQ(cons, i); EXPECT_EQ(dest, i); da.deallocate(d); } typedef StdAllocator CharAllocator; typedef std::basic_string, CharAllocator> String; #if RAPIDJSON_HAS_CXX11 String s(CharAllocator{a}); #else CharAllocator ca(a); String s(ca); #endif for (int i = 0; i < 26; i++) { s.push_back(static_cast('A' + i)); } EXPECT_TRUE(s == "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); typedef StdAllocator, Allocator> MapAllocator; typedef std::map, MapAllocator> Map; #if RAPIDJSON_HAS_CXX11 Map map(std::less(), MapAllocator{a}); #else MapAllocator ma(a); Map map(std::less(), ma); #endif for (int i = 0; i < 10; i++) { map.insert(std::make_pair(i, (i % 2) == 0)); } EXPECT_TRUE(map.size() == 10); for (int i = 0; i < 10; i++) { typename Map::iterator it = map.find(i); EXPECT_TRUE(it != map.end()); EXPECT_TRUE(it->second == ((i % 2) == 0)); } } TEST(Allocator, CrtAllocator) { CrtAllocator a; TestAllocator(a); TestStdAllocator(a); CrtAllocator a2; EXPECT_TRUE(a == a2); EXPECT_FALSE(a != a2); a2.Free(a2.Malloc(1)); EXPECT_TRUE(a == a2); EXPECT_FALSE(a != a2); } TEST(Allocator, MemoryPoolAllocator) { const size_t capacity = RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY; MemoryPoolAllocator<> a(capacity); a.Clear(); // noop EXPECT_EQ(a.Size(), 0u); EXPECT_EQ(a.Capacity(), 0u); EXPECT_EQ(a.Shared(), false); { MemoryPoolAllocator<> a2(a); EXPECT_EQ(a2.Shared(), true); EXPECT_EQ(a.Shared(), true); EXPECT_TRUE(a == a2); EXPECT_FALSE(a != a2); a2.Free(a2.Malloc(1)); EXPECT_TRUE(a == a2); EXPECT_FALSE(a != a2); } EXPECT_EQ(a.Shared(), false); EXPECT_EQ(a.Capacity(), capacity); EXPECT_EQ(a.Size(), 8u); // aligned a.Clear(); EXPECT_EQ(a.Capacity(), 0u); EXPECT_EQ(a.Size(), 0u); TestAllocator(a); TestStdAllocator(a); for (size_t i = 1; i < 1000; i++) { EXPECT_TRUE(a.Malloc(i) != 0); EXPECT_LE(a.Size(), a.Capacity()); } CrtAllocator baseAllocator; a = MemoryPoolAllocator<>(capacity, &baseAllocator); EXPECT_EQ(a.Capacity(), 0u); EXPECT_EQ(a.Size(), 0u); a.Free(a.Malloc(1)); EXPECT_EQ(a.Capacity(), capacity); EXPECT_EQ(a.Size(), 8u); // aligned { a.Clear(); const size_t bufSize = 1024; char *buffer = (char *)a.Malloc(bufSize); MemoryPoolAllocator<> aligned_a(buffer, bufSize); EXPECT_TRUE(aligned_a.Capacity() > 0 && aligned_a.Capacity() <= bufSize); EXPECT_EQ(aligned_a.Size(), 0u); aligned_a.Free(aligned_a.Malloc(1)); EXPECT_TRUE(aligned_a.Capacity() > 0 && aligned_a.Capacity() <= bufSize); EXPECT_EQ(aligned_a.Size(), 8u); // aligned } { a.Clear(); const size_t bufSize = 1024; char *buffer = (char *)a.Malloc(bufSize); RAPIDJSON_ASSERT(bufSize % sizeof(void*) == 0); MemoryPoolAllocator<> unaligned_a(buffer + 1, bufSize - 1); EXPECT_TRUE(unaligned_a.Capacity() > 0 && unaligned_a.Capacity() <= bufSize - sizeof(void*)); EXPECT_EQ(unaligned_a.Size(), 0u); unaligned_a.Free(unaligned_a.Malloc(1)); EXPECT_TRUE(unaligned_a.Capacity() > 0 && unaligned_a.Capacity() <= bufSize - sizeof(void*)); EXPECT_EQ(unaligned_a.Size(), 8u); // aligned } } TEST(Allocator, Alignment) { if (sizeof(size_t) >= 8) { EXPECT_EQ(RAPIDJSON_UINT64_C2(0x00000000, 0x00000000), RAPIDJSON_ALIGN(0)); for (uint64_t i = 1; i < 8; i++) { EXPECT_EQ(RAPIDJSON_UINT64_C2(0x00000000, 0x00000008), RAPIDJSON_ALIGN(i)); EXPECT_EQ(RAPIDJSON_UINT64_C2(0x00000000, 0x00000010), RAPIDJSON_ALIGN(RAPIDJSON_UINT64_C2(0x00000000, 0x00000008) + i)); EXPECT_EQ(RAPIDJSON_UINT64_C2(0x00000001, 0x00000000), RAPIDJSON_ALIGN(RAPIDJSON_UINT64_C2(0x00000000, 0xFFFFFFF8) + i)); EXPECT_EQ(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFF8), RAPIDJSON_ALIGN(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFF0) + i)); } } EXPECT_EQ(0u, RAPIDJSON_ALIGN(0u)); for (uint32_t i = 1; i < 8; i++) { EXPECT_EQ(8u, RAPIDJSON_ALIGN(i)); EXPECT_EQ(0xFFFFFFF8u, RAPIDJSON_ALIGN(0xFFFFFFF0u + i)); } } TEST(Allocator, Issue399) { MemoryPoolAllocator<> a; void* p = a.Malloc(100); void* q = a.Realloc(p, 100, 200); EXPECT_EQ(p, q); // exhuasive testing for (size_t j = 1; j < 32; j++) { a.Clear(); a.Malloc(j); // some unaligned size p = a.Malloc(1); for (size_t i = 1; i < 1024; i++) { q = a.Realloc(p, i, i + 1); EXPECT_EQ(p, q); p = q; } } } asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/fwdtest.cpp0000644000000000000000000001331015031566105024731 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" // Using forward declared types here. #include "rapidjson/fwd.h" #ifdef __GNUC__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) #endif using namespace rapidjson; struct Foo { Foo(); ~Foo(); // encodings.h UTF8* utf8; UTF16* utf16; UTF16BE* utf16be; UTF16LE* utf16le; UTF32* utf32; UTF32BE* utf32be; UTF32LE* utf32le; ASCII* ascii; AutoUTF* autoutf; Transcoder, UTF8 >* transcoder; // allocators.h CrtAllocator* crtallocator; MemoryPoolAllocator* memorypoolallocator; // stream.h StringStream* stringstream; InsituStringStream* insitustringstream; // stringbuffer.h StringBuffer* stringbuffer; // // filereadstream.h // FileReadStream* filereadstream; // // filewritestream.h // FileWriteStream* filewritestream; // memorybuffer.h MemoryBuffer* memorybuffer; // memorystream.h MemoryStream* memorystream; // reader.h BaseReaderHandler, void>* basereaderhandler; Reader* reader; // writer.h Writer, UTF8, CrtAllocator, 0>* writer; // prettywriter.h PrettyWriter, UTF8, CrtAllocator, 0>* prettywriter; // document.h Value* value; Document* document; // pointer.h Pointer* pointer; // schema.h SchemaDocument* schemadocument; SchemaValidator* schemavalidator; // char buffer[16]; }; // Using type definitions here. #include "rapidjson/stringbuffer.h" #include "rapidjson/filereadstream.h" #include "rapidjson/filewritestream.h" #include "rapidjson/memorybuffer.h" #include "rapidjson/memorystream.h" #include "rapidjson/document.h" // -> reader.h #include "rapidjson/writer.h" #include "rapidjson/prettywriter.h" #include "rapidjson/schema.h" // -> pointer.h typedef Transcoder, UTF8<> > TranscoderUtf8ToUtf8; typedef BaseReaderHandler, void> BaseReaderHandlerUtf8Void; Foo::Foo() : // encodings.h utf8(RAPIDJSON_NEW(UTF8<>)), utf16(RAPIDJSON_NEW(UTF16<>)), utf16be(RAPIDJSON_NEW(UTF16BE<>)), utf16le(RAPIDJSON_NEW(UTF16LE<>)), utf32(RAPIDJSON_NEW(UTF32<>)), utf32be(RAPIDJSON_NEW(UTF32BE<>)), utf32le(RAPIDJSON_NEW(UTF32LE<>)), ascii(RAPIDJSON_NEW(ASCII<>)), autoutf(RAPIDJSON_NEW(AutoUTF)), transcoder(RAPIDJSON_NEW(TranscoderUtf8ToUtf8)), // allocators.h crtallocator(RAPIDJSON_NEW(CrtAllocator)), memorypoolallocator(RAPIDJSON_NEW(MemoryPoolAllocator<>)), // stream.h stringstream(RAPIDJSON_NEW(StringStream)(NULL)), insitustringstream(RAPIDJSON_NEW(InsituStringStream)(NULL)), // stringbuffer.h stringbuffer(RAPIDJSON_NEW(StringBuffer)), // // filereadstream.h // filereadstream(RAPIDJSON_NEW(FileReadStream)(stdout, buffer, sizeof(buffer))), // // filewritestream.h // filewritestream(RAPIDJSON_NEW(FileWriteStream)(stdout, buffer, sizeof(buffer))), // memorybuffer.h memorybuffer(RAPIDJSON_NEW(MemoryBuffer)), // memorystream.h memorystream(RAPIDJSON_NEW(MemoryStream)(NULL, 0)), // reader.h basereaderhandler(RAPIDJSON_NEW(BaseReaderHandlerUtf8Void)), reader(RAPIDJSON_NEW(Reader)), // writer.h writer(RAPIDJSON_NEW(Writer)), // prettywriter.h prettywriter(RAPIDJSON_NEW(PrettyWriter)), // document.h value(RAPIDJSON_NEW(Value)), document(RAPIDJSON_NEW(Document)), // pointer.h pointer(RAPIDJSON_NEW(Pointer)), // schema.h schemadocument(RAPIDJSON_NEW(SchemaDocument)(*document)), schemavalidator(RAPIDJSON_NEW(SchemaValidator)(*schemadocument)) { } Foo::~Foo() { // encodings.h RAPIDJSON_DELETE(utf8); RAPIDJSON_DELETE(utf16); RAPIDJSON_DELETE(utf16be); RAPIDJSON_DELETE(utf16le); RAPIDJSON_DELETE(utf32); RAPIDJSON_DELETE(utf32be); RAPIDJSON_DELETE(utf32le); RAPIDJSON_DELETE(ascii); RAPIDJSON_DELETE(autoutf); RAPIDJSON_DELETE(transcoder); // allocators.h RAPIDJSON_DELETE(crtallocator); RAPIDJSON_DELETE(memorypoolallocator); // stream.h RAPIDJSON_DELETE(stringstream); RAPIDJSON_DELETE(insitustringstream); // stringbuffer.h RAPIDJSON_DELETE(stringbuffer); // // filereadstream.h // RAPIDJSON_DELETE(filereadstream); // // filewritestream.h // RAPIDJSON_DELETE(filewritestream); // memorybuffer.h RAPIDJSON_DELETE(memorybuffer); // memorystream.h RAPIDJSON_DELETE(memorystream); // reader.h RAPIDJSON_DELETE(basereaderhandler); RAPIDJSON_DELETE(reader); // writer.h RAPIDJSON_DELETE(writer); // prettywriter.h RAPIDJSON_DELETE(prettywriter); // document.h RAPIDJSON_DELETE(value); RAPIDJSON_DELETE(document); // pointer.h RAPIDJSON_DELETE(pointer); // schema.h RAPIDJSON_DELETE(schemadocument); RAPIDJSON_DELETE(schemavalidator); } TEST(Fwd, Fwd) { Foo f; } #ifdef __GNUC__ RAPIDJSON_DIAG_POP #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/CMakeLists.txt0000644000000000000000000000576415031566105025323 0ustar rootrootinclude(CheckCXXCompilerFlag) set(UNITTEST_SOURCES allocatorstest.cpp bigintegertest.cpp clzlltest.cpp cursorstreamwrappertest.cpp documenttest.cpp dtoatest.cpp encodedstreamtest.cpp encodingstest.cpp fwdtest.cpp filestreamtest.cpp itoatest.cpp istreamwrappertest.cpp jsoncheckertest.cpp namespacetest.cpp pointertest.cpp platformtest.cpp prettywritertest.cpp ostreamwrappertest.cpp readertest.cpp regextest.cpp schematest.cpp simdtest.cpp strfunctest.cpp stringbuffertest.cpp strtodtest.cpp unittest.cpp uritest.cpp valuetest.cpp writertest.cpp) find_program(CCACHE_FOUND ccache) if(CCACHE_FOUND) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments -fcolor-diagnostics") endif() endif(CCACHE_FOUND) set_property(DIRECTORY PROPERTY COMPILE_OPTIONS ${EXTRA_CXX_FLAGS}) if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") # If the user is running a newer version of Clang that includes the # -Wdouble-promotion, we will ignore that warning. if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 3.7) CHECK_CXX_COMPILER_FLAG("-Wno-double-promotion" HAS_NO_DOUBLE_PROMOTION) if (HAS_NO_DOUBLE_PROMOTION) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-double-promotion") endif() endif() elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") # Force to always compile with /W4 if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") endif() # Force to always compile with /WX if(CMAKE_CXX_FLAGS MATCHES "/WX-") string(REGEX REPLACE "/WX-" "/WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX") endif() endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRAPIDJSON_HAS_STDSTRING=1") add_library(namespacetest STATIC namespacetest.cpp) add_executable(unittest ${UNITTEST_SOURCES}) target_link_libraries(unittest ${TEST_LIBRARIES} namespacetest) add_dependencies(tests unittest) add_test(NAME unittest COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) if(NOT MSVC) # Not running SIMD.* unit test cases for Valgrind add_test(NAME valgrind_unittest COMMAND valgrind --suppressions=${CMAKE_SOURCE_DIR}/test/valgrind.supp --leak-check=full --error-exitcode=1 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest --gtest_filter=-SIMD.* WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) if(CMAKE_BUILD_TYPE STREQUAL "Debug") add_test(NAME symbol_check COMMAND sh -c "objdump -t -C libnamespacetest.a | grep rapidjson ; test $? -ne 0" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) endif(CMAKE_BUILD_TYPE STREQUAL "Debug") endif(NOT MSVC) asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/clzlltest.cpp0000644000000000000000000000210015031566105025264 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/internal/clzll.h" #ifdef __GNUC__ RAPIDJSON_DIAG_PUSH #endif using namespace rapidjson::internal; TEST(clzll, normal) { EXPECT_EQ(clzll(1), 63U); EXPECT_EQ(clzll(2), 62U); EXPECT_EQ(clzll(12), 60U); EXPECT_EQ(clzll(0x0000000080000001UL), 32U); EXPECT_EQ(clzll(0x8000000000000001UL), 0U); } #ifdef __GNUC__ RAPIDJSON_DIAG_POP #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/encodingstest.cpp0000644000000000000000000004557115031566105026140 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/filereadstream.h" #include "rapidjson/filewritestream.h" #include "rapidjson/encodedstream.h" #include "rapidjson/stringbuffer.h" using namespace rapidjson; // Verification of encoders/decoders with Hoehrmann's UTF8 decoder // http://www.unicode.org/Public/UNIDATA/Blocks.txt static const unsigned kCodepointRanges[] = { 0x0000, 0x007F, // Basic Latin 0x0080, 0x00FF, // Latin-1 Supplement 0x0100, 0x017F, // Latin Extended-A 0x0180, 0x024F, // Latin Extended-B 0x0250, 0x02AF, // IPA Extensions 0x02B0, 0x02FF, // Spacing Modifier Letters 0x0300, 0x036F, // Combining Diacritical Marks 0x0370, 0x03FF, // Greek and Coptic 0x0400, 0x04FF, // Cyrillic 0x0500, 0x052F, // Cyrillic Supplement 0x0530, 0x058F, // Armenian 0x0590, 0x05FF, // Hebrew 0x0600, 0x06FF, // Arabic 0x0700, 0x074F, // Syriac 0x0750, 0x077F, // Arabic Supplement 0x0780, 0x07BF, // Thaana 0x07C0, 0x07FF, // NKo 0x0800, 0x083F, // Samaritan 0x0840, 0x085F, // Mandaic 0x0900, 0x097F, // Devanagari 0x0980, 0x09FF, // Bengali 0x0A00, 0x0A7F, // Gurmukhi 0x0A80, 0x0AFF, // Gujarati 0x0B00, 0x0B7F, // Oriya 0x0B80, 0x0BFF, // Tamil 0x0C00, 0x0C7F, // Telugu 0x0C80, 0x0CFF, // Kannada 0x0D00, 0x0D7F, // Malayalam 0x0D80, 0x0DFF, // Sinhala 0x0E00, 0x0E7F, // Thai 0x0E80, 0x0EFF, // Lao 0x0F00, 0x0FFF, // Tibetan 0x1000, 0x109F, // Myanmar 0x10A0, 0x10FF, // Georgian 0x1100, 0x11FF, // Hangul Jamo 0x1200, 0x137F, // Ethiopic 0x1380, 0x139F, // Ethiopic Supplement 0x13A0, 0x13FF, // Cherokee 0x1400, 0x167F, // Unified Canadian Aboriginal Syllabics 0x1680, 0x169F, // Ogham 0x16A0, 0x16FF, // Runic 0x1700, 0x171F, // Tagalog 0x1720, 0x173F, // Hanunoo 0x1740, 0x175F, // Buhid 0x1760, 0x177F, // Tagbanwa 0x1780, 0x17FF, // Khmer 0x1800, 0x18AF, // Mongolian 0x18B0, 0x18FF, // Unified Canadian Aboriginal Syllabics Extended 0x1900, 0x194F, // Limbu 0x1950, 0x197F, // Tai Le 0x1980, 0x19DF, // New Tai Lue 0x19E0, 0x19FF, // Khmer Symbols 0x1A00, 0x1A1F, // Buginese 0x1A20, 0x1AAF, // Tai Tham 0x1B00, 0x1B7F, // Balinese 0x1B80, 0x1BBF, // Sundanese 0x1BC0, 0x1BFF, // Batak 0x1C00, 0x1C4F, // Lepcha 0x1C50, 0x1C7F, // Ol Chiki 0x1CD0, 0x1CFF, // Vedic Extensions 0x1D00, 0x1D7F, // Phonetic Extensions 0x1D80, 0x1DBF, // Phonetic Extensions Supplement 0x1DC0, 0x1DFF, // Combining Diacritical Marks Supplement 0x1E00, 0x1EFF, // Latin Extended Additional 0x1F00, 0x1FFF, // Greek Extended 0x2000, 0x206F, // General Punctuation 0x2070, 0x209F, // Superscripts and Subscripts 0x20A0, 0x20CF, // Currency Symbols 0x20D0, 0x20FF, // Combining Diacritical Marks for Symbols 0x2100, 0x214F, // Letterlike Symbols 0x2150, 0x218F, // Number Forms 0x2190, 0x21FF, // Arrows 0x2200, 0x22FF, // Mathematical Operators 0x2300, 0x23FF, // Miscellaneous Technical 0x2400, 0x243F, // Control Pictures 0x2440, 0x245F, // Optical Character Recognition 0x2460, 0x24FF, // Enclosed Alphanumerics 0x2500, 0x257F, // Box Drawing 0x2580, 0x259F, // Block Elements 0x25A0, 0x25FF, // Geometric Shapes 0x2600, 0x26FF, // Miscellaneous Symbols 0x2700, 0x27BF, // Dingbats 0x27C0, 0x27EF, // Miscellaneous Mathematical Symbols-A 0x27F0, 0x27FF, // Supplemental Arrows-A 0x2800, 0x28FF, // Braille Patterns 0x2900, 0x297F, // Supplemental Arrows-B 0x2980, 0x29FF, // Miscellaneous Mathematical Symbols-B 0x2A00, 0x2AFF, // Supplemental Mathematical Operators 0x2B00, 0x2BFF, // Miscellaneous Symbols and Arrows 0x2C00, 0x2C5F, // Glagolitic 0x2C60, 0x2C7F, // Latin Extended-C 0x2C80, 0x2CFF, // Coptic 0x2D00, 0x2D2F, // Georgian Supplement 0x2D30, 0x2D7F, // Tifinagh 0x2D80, 0x2DDF, // Ethiopic Extended 0x2DE0, 0x2DFF, // Cyrillic Extended-A 0x2E00, 0x2E7F, // Supplemental Punctuation 0x2E80, 0x2EFF, // CJK Radicals Supplement 0x2F00, 0x2FDF, // Kangxi Radicals 0x2FF0, 0x2FFF, // Ideographic Description Characters 0x3000, 0x303F, // CJK Symbols and Punctuation 0x3040, 0x309F, // Hiragana 0x30A0, 0x30FF, // Katakana 0x3100, 0x312F, // Bopomofo 0x3130, 0x318F, // Hangul Compatibility Jamo 0x3190, 0x319F, // Kanbun 0x31A0, 0x31BF, // Bopomofo Extended 0x31C0, 0x31EF, // CJK Strokes 0x31F0, 0x31FF, // Katakana Phonetic Extensions 0x3200, 0x32FF, // Enclosed CJK Letters and Months 0x3300, 0x33FF, // CJK Compatibility 0x3400, 0x4DBF, // CJK Unified Ideographs Extension A 0x4DC0, 0x4DFF, // Yijing Hexagram Symbols 0x4E00, 0x9FFF, // CJK Unified Ideographs 0xA000, 0xA48F, // Yi Syllables 0xA490, 0xA4CF, // Yi Radicals 0xA4D0, 0xA4FF, // Lisu 0xA500, 0xA63F, // Vai 0xA640, 0xA69F, // Cyrillic Extended-B 0xA6A0, 0xA6FF, // Bamum 0xA700, 0xA71F, // Modifier Tone Letters 0xA720, 0xA7FF, // Latin Extended-D 0xA800, 0xA82F, // Syloti Nagri 0xA830, 0xA83F, // Common Indic Number Forms 0xA840, 0xA87F, // Phags-pa 0xA880, 0xA8DF, // Saurashtra 0xA8E0, 0xA8FF, // Devanagari Extended 0xA900, 0xA92F, // Kayah Li 0xA930, 0xA95F, // Rejang 0xA960, 0xA97F, // Hangul Jamo Extended-A 0xA980, 0xA9DF, // Javanese 0xAA00, 0xAA5F, // Cham 0xAA60, 0xAA7F, // Myanmar Extended-A 0xAA80, 0xAADF, // Tai Viet 0xAB00, 0xAB2F, // Ethiopic Extended-A 0xABC0, 0xABFF, // Meetei Mayek 0xAC00, 0xD7AF, // Hangul Syllables 0xD7B0, 0xD7FF, // Hangul Jamo Extended-B //0xD800, 0xDB7F, // High Surrogates //0xDB80, 0xDBFF, // High Private Use Surrogates //0xDC00, 0xDFFF, // Low Surrogates 0xE000, 0xF8FF, // Private Use Area 0xF900, 0xFAFF, // CJK Compatibility Ideographs 0xFB00, 0xFB4F, // Alphabetic Presentation Forms 0xFB50, 0xFDFF, // Arabic Presentation Forms-A 0xFE00, 0xFE0F, // Variation Selectors 0xFE10, 0xFE1F, // Vertical Forms 0xFE20, 0xFE2F, // Combining Half Marks 0xFE30, 0xFE4F, // CJK Compatibility Forms 0xFE50, 0xFE6F, // Small Form Variants 0xFE70, 0xFEFF, // Arabic Presentation Forms-B 0xFF00, 0xFFEF, // Halfwidth and Fullwidth Forms 0xFFF0, 0xFFFF, // Specials 0x10000, 0x1007F, // Linear B Syllabary 0x10080, 0x100FF, // Linear B Ideograms 0x10100, 0x1013F, // Aegean Numbers 0x10140, 0x1018F, // Ancient Greek Numbers 0x10190, 0x101CF, // Ancient Symbols 0x101D0, 0x101FF, // Phaistos Disc 0x10280, 0x1029F, // Lycian 0x102A0, 0x102DF, // Carian 0x10300, 0x1032F, // Old Italic 0x10330, 0x1034F, // Gothic 0x10380, 0x1039F, // Ugaritic 0x103A0, 0x103DF, // Old Persian 0x10400, 0x1044F, // Deseret 0x10450, 0x1047F, // Shavian 0x10480, 0x104AF, // Osmanya 0x10800, 0x1083F, // Cypriot Syllabary 0x10840, 0x1085F, // Imperial Aramaic 0x10900, 0x1091F, // Phoenician 0x10920, 0x1093F, // Lydian 0x10A00, 0x10A5F, // Kharoshthi 0x10A60, 0x10A7F, // Old South Arabian 0x10B00, 0x10B3F, // Avestan 0x10B40, 0x10B5F, // Inscriptional Parthian 0x10B60, 0x10B7F, // Inscriptional Pahlavi 0x10C00, 0x10C4F, // Old Turkic 0x10E60, 0x10E7F, // Rumi Numeral Symbols 0x11000, 0x1107F, // Brahmi 0x11080, 0x110CF, // Kaithi 0x12000, 0x123FF, // Cuneiform 0x12400, 0x1247F, // Cuneiform Numbers and Punctuation 0x13000, 0x1342F, // Egyptian Hieroglyphs 0x16800, 0x16A3F, // Bamum Supplement 0x1B000, 0x1B0FF, // Kana Supplement 0x1D000, 0x1D0FF, // Byzantine Musical Symbols 0x1D100, 0x1D1FF, // Musical Symbols 0x1D200, 0x1D24F, // Ancient Greek Musical Notation 0x1D300, 0x1D35F, // Tai Xuan Jing Symbols 0x1D360, 0x1D37F, // Counting Rod Numerals 0x1D400, 0x1D7FF, // Mathematical Alphanumeric Symbols 0x1F000, 0x1F02F, // Mahjong Tiles 0x1F030, 0x1F09F, // Domino Tiles 0x1F0A0, 0x1F0FF, // Playing Cards 0x1F100, 0x1F1FF, // Enclosed Alphanumeric Supplement 0x1F200, 0x1F2FF, // Enclosed Ideographic Supplement 0x1F300, 0x1F5FF, // Miscellaneous Symbols And Pictographs 0x1F600, 0x1F64F, // Emoticons 0x1F680, 0x1F6FF, // Transport And Map Symbols 0x1F700, 0x1F77F, // Alchemical Symbols 0x20000, 0x2A6DF, // CJK Unified Ideographs Extension B 0x2A700, 0x2B73F, // CJK Unified Ideographs Extension C 0x2B740, 0x2B81F, // CJK Unified Ideographs Extension D 0x2F800, 0x2FA1F, // CJK Compatibility Ideographs Supplement 0xE0000, 0xE007F, // Tags 0xE0100, 0xE01EF, // Variation Selectors Supplement 0xF0000, 0xFFFFF, // Supplementary Private Use Area-A 0x100000, 0x10FFFF, // Supplementary Private Use Area-B 0xFFFFFFFF }; // Copyright (c) 2008-2010 Bjoern Hoehrmann // See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. #define UTF8_ACCEPT 0u static const unsigned char utf8d[] = { // The first part of the table maps bytes to character classes that // to reduce the size of the transition table and create bitmasks. 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,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,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,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, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, // The second part is a transition table that maps a combination // of a state of the automaton and a character class to a state. 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,12,12,12,12,12, }; static unsigned inline decode(unsigned* state, unsigned* codep, unsigned byte) { unsigned type = utf8d[byte]; *codep = (*state != UTF8_ACCEPT) ? (byte & 0x3fu) | (*codep << 6) : (0xffu >> type) & (byte); *state = utf8d[256 + *state + type]; return *state; } //static bool IsUTF8(unsigned char* s) { // unsigned codepoint, state = 0; // // while (*s) // decode(&state, &codepoint, *s++); // // return state == UTF8_ACCEPT; //} TEST(EncodingsTest, UTF8) { StringBuffer os, os2; for (const unsigned* range = kCodepointRanges; *range != 0xFFFFFFFF; range += 2) { for (unsigned codepoint = range[0]; codepoint <= range[1]; ++codepoint) { os.Clear(); UTF8<>::Encode(os, codepoint); const char* encodedStr = os.GetString(); // Decode with Hoehrmann { unsigned decodedCodepoint = 0; unsigned state = 0; unsigned decodedCount = 0; for (const char* s = encodedStr; *s; ++s) if (!decode(&state, &decodedCodepoint, static_cast(*s))) { EXPECT_EQ(codepoint, decodedCodepoint); decodedCount++; } if (*encodedStr) { // This decoder cannot handle U+0000 EXPECT_EQ(1u, decodedCount); // Should only contain one code point } EXPECT_EQ(UTF8_ACCEPT, state); if (UTF8_ACCEPT != state) std::cout << std::hex << codepoint << " " << decodedCodepoint << std::endl; } // Decode { StringStream is(encodedStr); unsigned decodedCodepoint; bool result = UTF8<>::Decode(is, &decodedCodepoint); EXPECT_TRUE(result); EXPECT_EQ(codepoint, decodedCodepoint); if (!result || codepoint != decodedCodepoint) std::cout << std::hex << codepoint << " " << decodedCodepoint << std::endl; } // Validate { StringStream is(encodedStr); os2.Clear(); bool result = UTF8<>::Validate(is, os2); EXPECT_TRUE(result); EXPECT_EQ(0, StrCmp(encodedStr, os2.GetString())); } } } } TEST(EncodingsTest, UTF16) { GenericStringBuffer > os, os2; GenericStringBuffer > utf8os; for (const unsigned* range = kCodepointRanges; *range != 0xFFFFFFFF; range += 2) { for (unsigned codepoint = range[0]; codepoint <= range[1]; ++codepoint) { os.Clear(); UTF16<>::Encode(os, codepoint); const UTF16<>::Ch* encodedStr = os.GetString(); // Encode with Hoehrmann's code if (codepoint != 0) // cannot handle U+0000 { // encode with UTF8<> first utf8os.Clear(); UTF8<>::Encode(utf8os, codepoint); // transcode from UTF8 to UTF16 with Hoehrmann's code unsigned decodedCodepoint = 0; unsigned state = 0; UTF16<>::Ch buffer[3], *p = &buffer[0]; for (const char* s = utf8os.GetString(); *s; ++s) { if (!decode(&state, &decodedCodepoint, static_cast(*s))) break; } if (codepoint <= 0xFFFF) *p++ = static_cast::Ch>(decodedCodepoint); else { // Encode code points above U+FFFF as surrogate pair. *p++ = static_cast::Ch>(0xD7C0 + (decodedCodepoint >> 10)); *p++ = static_cast::Ch>(0xDC00 + (decodedCodepoint & 0x3FF)); } *p++ = '\0'; EXPECT_EQ(0, StrCmp(buffer, encodedStr)); } // Decode { GenericStringStream > is(encodedStr); unsigned decodedCodepoint; bool result = UTF16<>::Decode(is, &decodedCodepoint); EXPECT_TRUE(result); EXPECT_EQ(codepoint, decodedCodepoint); if (!result || codepoint != decodedCodepoint) std::cout << std::hex << codepoint << " " << decodedCodepoint << std::endl; } // Validate { GenericStringStream > is(encodedStr); os2.Clear(); bool result = UTF16<>::Validate(is, os2); EXPECT_TRUE(result); EXPECT_EQ(0, StrCmp(encodedStr, os2.GetString())); } } } } TEST(EncodingsTest, UTF32) { GenericStringBuffer > os, os2; for (const unsigned* range = kCodepointRanges; *range != 0xFFFFFFFF; range += 2) { for (unsigned codepoint = range[0]; codepoint <= range[1]; ++codepoint) { os.Clear(); UTF32<>::Encode(os, codepoint); const UTF32<>::Ch* encodedStr = os.GetString(); // Decode { GenericStringStream > is(encodedStr); unsigned decodedCodepoint; bool result = UTF32<>::Decode(is, &decodedCodepoint); EXPECT_TRUE(result); EXPECT_EQ(codepoint, decodedCodepoint); if (!result || codepoint != decodedCodepoint) std::cout << std::hex << codepoint << " " << decodedCodepoint << std::endl; } // Validate { GenericStringStream > is(encodedStr); os2.Clear(); bool result = UTF32<>::Validate(is, os2); EXPECT_TRUE(result); EXPECT_EQ(0, StrCmp(encodedStr, os2.GetString())); } } } } TEST(EncodingsTest, ASCII) { StringBuffer os, os2; for (unsigned codepoint = 0; codepoint < 128; codepoint++) { os.Clear(); ASCII<>::Encode(os, codepoint); const ASCII<>::Ch* encodedStr = os.GetString(); { StringStream is(encodedStr); unsigned decodedCodepoint; bool result = ASCII<>::Decode(is, &decodedCodepoint); if (!result || codepoint != decodedCodepoint) std::cout << std::hex << codepoint << " " << decodedCodepoint << std::endl; } // Validate { StringStream is(encodedStr); os2.Clear(); bool result = ASCII<>::Validate(is, os2); EXPECT_TRUE(result); EXPECT_EQ(0, StrCmp(encodedStr, os2.GetString())); } } } asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/prettywritertest.cpp0000644000000000000000000002410615031566105026742 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/reader.h" #include "rapidjson/prettywriter.h" #include "rapidjson/stringbuffer.h" #include "rapidjson/filewritestream.h" #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(c++98-compat) #endif using namespace rapidjson; static const char kJson[] = "{\"hello\":\"world\",\"t\":true,\"f\":false,\"n\":null,\"i\":123,\"pi\":3.1416,\"a\":[1,2,3,-1],\"u64\":1234567890123456789,\"i64\":-1234567890123456789}"; static const char kPrettyJson[] = "{\n" " \"hello\": \"world\",\n" " \"t\": true,\n" " \"f\": false,\n" " \"n\": null,\n" " \"i\": 123,\n" " \"pi\": 3.1416,\n" " \"a\": [\n" " 1,\n" " 2,\n" " 3,\n" " -1\n" " ],\n" " \"u64\": 1234567890123456789,\n" " \"i64\": -1234567890123456789\n" "}"; static const char kPrettyJson_FormatOptions_SLA[] = "{\n" " \"hello\": \"world\",\n" " \"t\": true,\n" " \"f\": false,\n" " \"n\": null,\n" " \"i\": 123,\n" " \"pi\": 3.1416,\n" " \"a\": [1, 2, 3, -1],\n" " \"u64\": 1234567890123456789,\n" " \"i64\": -1234567890123456789\n" "}"; TEST(PrettyWriter, Basic) { StringBuffer buffer; PrettyWriter writer(buffer); Reader reader; StringStream s(kJson); reader.Parse(s, writer); EXPECT_STREQ(kPrettyJson, buffer.GetString()); } TEST(PrettyWriter, FormatOptions) { StringBuffer buffer; PrettyWriter writer(buffer); writer.SetFormatOptions(kFormatSingleLineArray); Reader reader; StringStream s(kJson); reader.Parse(s, writer); EXPECT_STREQ(kPrettyJson_FormatOptions_SLA, buffer.GetString()); } TEST(PrettyWriter, SetIndent) { StringBuffer buffer; PrettyWriter writer(buffer); writer.SetIndent('\t', 1); Reader reader; StringStream s(kJson); reader.Parse(s, writer); EXPECT_STREQ( "{\n" "\t\"hello\": \"world\",\n" "\t\"t\": true,\n" "\t\"f\": false,\n" "\t\"n\": null,\n" "\t\"i\": 123,\n" "\t\"pi\": 3.1416,\n" "\t\"a\": [\n" "\t\t1,\n" "\t\t2,\n" "\t\t3,\n" "\t\t-1\n" "\t],\n" "\t\"u64\": 1234567890123456789,\n" "\t\"i64\": -1234567890123456789\n" "}", buffer.GetString()); } TEST(PrettyWriter, String) { StringBuffer buffer; PrettyWriter writer(buffer); EXPECT_TRUE(writer.StartArray()); EXPECT_TRUE(writer.String("Hello\n")); EXPECT_TRUE(writer.EndArray()); EXPECT_STREQ("[\n \"Hello\\n\"\n]", buffer.GetString()); } #if RAPIDJSON_HAS_STDSTRING TEST(PrettyWriter, String_STDSTRING) { StringBuffer buffer; PrettyWriter writer(buffer); EXPECT_TRUE(writer.StartArray()); EXPECT_TRUE(writer.String(std::string("Hello\n"))); EXPECT_TRUE(writer.EndArray()); EXPECT_STREQ("[\n \"Hello\\n\"\n]", buffer.GetString()); } #endif #include class OStreamWrapper { public: typedef char Ch; OStreamWrapper(std::ostream& os) : os_(os) {} Ch Peek() const { assert(false); return '\0'; } Ch Take() { assert(false); return '\0'; } size_t Tell() const { return 0; } Ch* PutBegin() { assert(false); return 0; } void Put(Ch c) { os_.put(c); } void Flush() { os_.flush(); } size_t PutEnd(Ch*) { assert(false); return 0; } private: OStreamWrapper(const OStreamWrapper&); OStreamWrapper& operator=(const OStreamWrapper&); std::ostream& os_; }; // For covering PutN() generic version TEST(PrettyWriter, OStreamWrapper) { StringStream s(kJson); std::stringstream ss; OStreamWrapper os(ss); PrettyWriter writer(os); Reader reader; reader.Parse(s, writer); std::string actual = ss.str(); EXPECT_STREQ(kPrettyJson, actual.c_str()); } // For covering FileWriteStream::PutN() TEST(PrettyWriter, FileWriteStream) { char filename[L_tmpnam]; FILE* fp = TempFile(filename); ASSERT_TRUE(fp!=NULL); char buffer[16]; FileWriteStream os(fp, buffer, sizeof(buffer)); PrettyWriter writer(os); Reader reader; StringStream s(kJson); reader.Parse(s, writer); fclose(fp); fp = fopen(filename, "rb"); fseek(fp, 0, SEEK_END); size_t size = static_cast(ftell(fp)); fseek(fp, 0, SEEK_SET); char* json = static_cast(malloc(size + 1)); size_t readLength = fread(json, 1, size, fp); json[readLength] = '\0'; fclose(fp); remove(filename); EXPECT_STREQ(kPrettyJson, json); free(json); } TEST(PrettyWriter, RawValue) { StringBuffer buffer; PrettyWriter writer(buffer); writer.StartObject(); writer.Key("a"); writer.Int(1); writer.Key("raw"); const char json[] = "[\"Hello\\nWorld\", 123.456]"; writer.RawValue(json, strlen(json), kArrayType); writer.EndObject(); EXPECT_TRUE(writer.IsComplete()); EXPECT_STREQ( "{\n" " \"a\": 1,\n" " \"raw\": [\"Hello\\nWorld\", 123.456]\n" // no indentation within raw value "}", buffer.GetString()); } TEST(PrettyWriter, InvalidEventSequence) { // {] { StringBuffer buffer; PrettyWriter writer(buffer); writer.StartObject(); EXPECT_THROW(writer.EndArray(), AssertException); EXPECT_FALSE(writer.IsComplete()); } // [} { StringBuffer buffer; PrettyWriter writer(buffer); writer.StartArray(); EXPECT_THROW(writer.EndObject(), AssertException); EXPECT_FALSE(writer.IsComplete()); } // { 1: { StringBuffer buffer; PrettyWriter writer(buffer); writer.StartObject(); EXPECT_THROW(writer.Int(1), AssertException); EXPECT_FALSE(writer.IsComplete()); } // { 'a' } { StringBuffer buffer; PrettyWriter writer(buffer); writer.StartObject(); writer.Key("a"); EXPECT_THROW(writer.EndObject(), AssertException); EXPECT_FALSE(writer.IsComplete()); } // { 'a':'b','c' } { StringBuffer buffer; PrettyWriter writer(buffer); writer.StartObject(); writer.Key("a"); writer.String("b"); writer.Key("c"); EXPECT_THROW(writer.EndObject(), AssertException); EXPECT_FALSE(writer.IsComplete()); } } TEST(PrettyWriter, NaN) { double nan = std::numeric_limits::quiet_NaN(); EXPECT_TRUE(internal::Double(nan).IsNan()); StringBuffer buffer; { PrettyWriter writer(buffer); EXPECT_FALSE(writer.Double(nan)); } { PrettyWriter, UTF8<>, CrtAllocator, kWriteNanAndInfFlag> writer(buffer); EXPECT_TRUE(writer.Double(nan)); EXPECT_STREQ("NaN", buffer.GetString()); } GenericStringBuffer > buffer2; PrettyWriter > > writer2(buffer2); EXPECT_FALSE(writer2.Double(nan)); } TEST(PrettyWriter, Inf) { double inf = std::numeric_limits::infinity(); EXPECT_TRUE(internal::Double(inf).IsInf()); StringBuffer buffer; { PrettyWriter writer(buffer); EXPECT_FALSE(writer.Double(inf)); } { PrettyWriter writer(buffer); EXPECT_FALSE(writer.Double(-inf)); } { PrettyWriter, UTF8<>, CrtAllocator, kWriteNanAndInfFlag> writer(buffer); EXPECT_TRUE(writer.Double(inf)); } { PrettyWriter, UTF8<>, CrtAllocator, kWriteNanAndInfFlag> writer(buffer); EXPECT_TRUE(writer.Double(-inf)); } EXPECT_STREQ("Infinity-Infinity", buffer.GetString()); } TEST(PrettyWriter, Issue_889) { char buf[100] = "Hello"; StringBuffer buffer; PrettyWriter writer(buffer); writer.StartArray(); writer.String(buf); writer.EndArray(); EXPECT_STREQ("[\n \"Hello\"\n]", buffer.GetString()); EXPECT_TRUE(writer.IsComplete()); \ } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS static PrettyWriter WriterGen(StringBuffer &target) { PrettyWriter writer(target); writer.StartObject(); writer.Key("a"); writer.Int(1); return writer; } TEST(PrettyWriter, MoveCtor) { StringBuffer buffer; PrettyWriter writer(WriterGen(buffer)); writer.EndObject(); EXPECT_TRUE(writer.IsComplete()); EXPECT_STREQ( "{\n" " \"a\": 1\n" "}", buffer.GetString()); } #endif TEST(PrettyWriter, Issue_1336) { #define T(meth, val, expected) \ { \ StringBuffer buffer; \ PrettyWriter writer(buffer); \ writer.meth(val); \ \ EXPECT_STREQ(expected, buffer.GetString()); \ EXPECT_TRUE(writer.IsComplete()); \ } T(Bool, false, "false"); T(Bool, true, "true"); T(Int, 0, "0"); T(Uint, 0, "0"); T(Int64, 0, "0"); T(Uint64, 0, "0"); T(Double, 0, "0.0"); T(String, "Hello", "\"Hello\""); #undef T StringBuffer buffer; PrettyWriter writer(buffer); writer.Null(); EXPECT_STREQ("null", buffer.GetString()); EXPECT_TRUE(writer.IsComplete()); } #ifdef __clang__ RAPIDJSON_DIAG_POP #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/platformtest.cpp0000644000000000000000000000265415031566105026006 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2021 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" // see https://github.com/Tencent/rapidjson/issues/1448 // including windows.h on purpose to provoke a compile time problem as GetObject is a // macro that gets defined when windows.h is included #ifdef _WIN32 #include #endif #include "rapidjson/document.h" #undef GetObject using namespace rapidjson; TEST(Platform, GetObject) { Document doc; doc.Parse(" { \"object\" : { \"pi\": 3.1416} } "); EXPECT_TRUE(doc.IsObject()); EXPECT_TRUE(doc.HasMember("object")); const Document::ValueType& o = doc["object"]; EXPECT_TRUE(o.IsObject()); Value::ConstObject sub = o.GetObject(); EXPECT_TRUE(sub.HasMember("pi")); Value::ConstObject sub2 = o.GetObj(); EXPECT_TRUE(sub2.HasMember("pi")); } asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/jsoncheckertest.cpp0000644000000000000000000001117515031566105026456 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/document.h" using namespace rapidjson; static char* ReadFile(const char* filename, size_t& length) { const char *paths[] = { "jsonchecker", "bin/jsonchecker", "../bin/jsonchecker", "../../bin/jsonchecker", "../../../bin/jsonchecker" }; char buffer[1024]; FILE *fp = 0; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { sprintf(buffer, "%s/%s", paths[i], filename); fp = fopen(buffer, "rb"); if (fp) break; } if (!fp) return 0; fseek(fp, 0, SEEK_END); length = static_cast(ftell(fp)); fseek(fp, 0, SEEK_SET); char* json = static_cast(malloc(length + 1)); size_t readLength = fread(json, 1, length, fp); json[readLength] = '\0'; fclose(fp); return json; } struct NoOpHandler { bool Null() { return true; } bool Bool(bool) { return true; } bool Int(int) { return true; } bool Uint(unsigned) { return true; } bool Int64(int64_t) { return true; } bool Uint64(uint64_t) { return true; } bool Double(double) { return true; } bool RawNumber(const char*, SizeType, bool) { return true; } bool String(const char*, SizeType, bool) { return true; } bool StartObject() { return true; } bool Key(const char*, SizeType, bool) { return true; } bool EndObject(SizeType) { return true; } bool StartArray() { return true; } bool EndArray(SizeType) { return true; } }; TEST(JsonChecker, Reader) { char filename[256]; // jsonchecker/failXX.json for (int i = 1; i <= 33; i++) { if (i == 1) // fail1.json is valid in rapidjson, which has no limitation on type of root element (RFC 7159). continue; if (i == 18) // fail18.json is valid in rapidjson, which has no limitation on depth of nesting. continue; sprintf(filename, "fail%d.json", i); size_t length; char* json = ReadFile(filename, length); if (!json) { printf("jsonchecker file %s not found", filename); ADD_FAILURE(); continue; } // Test stack-based parsing. GenericDocument, CrtAllocator> document; // Use Crt allocator to check exception-safety (no memory leak) document.Parse(json); EXPECT_TRUE(document.HasParseError()) << filename; // Test iterative parsing. document.Parse(json); EXPECT_TRUE(document.HasParseError()) << filename; // Test iterative pull-parsing. Reader reader; StringStream ss(json); NoOpHandler h; reader.IterativeParseInit(); while (!reader.IterativeParseComplete()) { if (!reader.IterativeParseNext(ss, h)) break; } EXPECT_TRUE(reader.HasParseError()) << filename; free(json); } // passX.json for (int i = 1; i <= 3; i++) { sprintf(filename, "pass%d.json", i); size_t length; char* json = ReadFile(filename, length); if (!json) { printf("jsonchecker file %s not found", filename); continue; } // Test stack-based parsing. GenericDocument, CrtAllocator> document; // Use Crt allocator to check exception-safety (no memory leak) document.Parse(json); EXPECT_FALSE(document.HasParseError()) << filename; // Test iterative parsing. document.Parse(json); EXPECT_FALSE(document.HasParseError()) << filename; // Test iterative pull-parsing. Reader reader; StringStream ss(json); NoOpHandler h; reader.IterativeParseInit(); while (!reader.IterativeParseComplete()) { if (!reader.IterativeParseNext(ss, h)) break; } EXPECT_FALSE(reader.HasParseError()) << filename; free(json); } } asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/stringbuffertest.cpp0000644000000000000000000001264415031566105026662 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/stringbuffer.h" #include "rapidjson/writer.h" #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(c++98-compat) #endif using namespace rapidjson; TEST(StringBuffer, InitialSize) { StringBuffer buffer; EXPECT_EQ(0u, buffer.GetSize()); EXPECT_EQ(0u, buffer.GetLength()); EXPECT_STREQ("", buffer.GetString()); } TEST(StringBuffer, Put) { StringBuffer buffer; buffer.Put('A'); EXPECT_EQ(1u, buffer.GetSize()); EXPECT_EQ(1u, buffer.GetLength()); EXPECT_STREQ("A", buffer.GetString()); } TEST(StringBuffer, PutN_Issue672) { GenericStringBuffer, MemoryPoolAllocator<> > buffer; EXPECT_EQ(0u, buffer.GetSize()); EXPECT_EQ(0u, buffer.GetLength()); rapidjson::PutN(buffer, ' ', 1); EXPECT_EQ(1u, buffer.GetSize()); EXPECT_EQ(1u, buffer.GetLength()); } TEST(StringBuffer, Clear) { StringBuffer buffer; buffer.Put('A'); buffer.Put('B'); buffer.Put('C'); buffer.Clear(); EXPECT_EQ(0u, buffer.GetSize()); EXPECT_EQ(0u, buffer.GetLength()); EXPECT_STREQ("", buffer.GetString()); } TEST(StringBuffer, Push) { StringBuffer buffer; buffer.Push(5); EXPECT_EQ(5u, buffer.GetSize()); EXPECT_EQ(5u, buffer.GetLength()); // Causes sudden expansion to make the stack's capacity equal to size buffer.Push(65536u); EXPECT_EQ(5u + 65536u, buffer.GetSize()); } TEST(StringBuffer, Pop) { StringBuffer buffer; buffer.Put('A'); buffer.Put('B'); buffer.Put('C'); buffer.Put('D'); buffer.Put('E'); buffer.Pop(3); EXPECT_EQ(2u, buffer.GetSize()); EXPECT_EQ(2u, buffer.GetLength()); EXPECT_STREQ("AB", buffer.GetString()); } TEST(StringBuffer, GetLength_Issue744) { GenericStringBuffer > buffer; buffer.Put('A'); buffer.Put('B'); buffer.Put('C'); EXPECT_EQ(3u * sizeof(wchar_t), buffer.GetSize()); EXPECT_EQ(3u, buffer.GetLength()); } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS #if 0 // Many old compiler does not support these. Turn it off temporaily. #include TEST(StringBuffer, Traits) { static_assert( std::is_constructible::value, ""); static_assert( std::is_default_constructible::value, ""); #ifndef _MSC_VER static_assert(!std::is_copy_constructible::value, ""); #endif static_assert( std::is_move_constructible::value, ""); static_assert(!std::is_nothrow_constructible::value, ""); static_assert(!std::is_nothrow_default_constructible::value, ""); #if !defined(_MSC_VER) || _MSC_VER >= 1800 static_assert(!std::is_nothrow_copy_constructible::value, ""); static_assert(!std::is_nothrow_move_constructible::value, ""); #endif static_assert( std::is_assignable::value, ""); #ifndef _MSC_VER static_assert(!std::is_copy_assignable::value, ""); #endif static_assert( std::is_move_assignable::value, ""); #if !defined(_MSC_VER) || _MSC_VER >= 1800 static_assert(!std::is_nothrow_assignable::value, ""); #endif static_assert(!std::is_nothrow_copy_assignable::value, ""); static_assert(!std::is_nothrow_move_assignable::value, ""); static_assert( std::is_destructible::value, ""); #ifndef _MSC_VER static_assert(std::is_nothrow_destructible::value, ""); #endif } #endif TEST(StringBuffer, MoveConstructor) { StringBuffer x; x.Put('A'); x.Put('B'); x.Put('C'); x.Put('D'); EXPECT_EQ(4u, x.GetSize()); EXPECT_EQ(4u, x.GetLength()); EXPECT_STREQ("ABCD", x.GetString()); // StringBuffer y(x); // does not compile (!is_copy_constructible) StringBuffer y(std::move(x)); EXPECT_EQ(0u, x.GetSize()); EXPECT_EQ(0u, x.GetLength()); EXPECT_EQ(4u, y.GetSize()); EXPECT_EQ(4u, y.GetLength()); EXPECT_STREQ("ABCD", y.GetString()); // StringBuffer z = y; // does not compile (!is_copy_assignable) StringBuffer z = std::move(y); EXPECT_EQ(0u, y.GetSize()); EXPECT_EQ(0u, y.GetLength()); EXPECT_EQ(4u, z.GetSize()); EXPECT_EQ(4u, z.GetLength()); EXPECT_STREQ("ABCD", z.GetString()); } TEST(StringBuffer, MoveAssignment) { StringBuffer x; x.Put('A'); x.Put('B'); x.Put('C'); x.Put('D'); EXPECT_EQ(4u, x.GetSize()); EXPECT_EQ(4u, x.GetLength()); EXPECT_STREQ("ABCD", x.GetString()); StringBuffer y; // y = x; // does not compile (!is_copy_assignable) y = std::move(x); EXPECT_EQ(0u, x.GetSize()); EXPECT_EQ(4u, y.GetLength()); EXPECT_STREQ("ABCD", y.GetString()); } #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS #ifdef __clang__ RAPIDJSON_DIAG_POP #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/documenttest.cpp0000644000000000000000000005142715031566105026002 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/filereadstream.h" #include "rapidjson/encodedstream.h" #include "rapidjson/stringbuffer.h" #include #include #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(c++98-compat) RAPIDJSON_DIAG_OFF(missing-variable-declarations) #endif using namespace rapidjson; template void ParseCheck(DocumentType& doc) { typedef typename DocumentType::ValueType ValueType; EXPECT_FALSE(doc.HasParseError()); if (doc.HasParseError()) printf("Error: %d at %zu\n", static_cast(doc.GetParseError()), doc.GetErrorOffset()); EXPECT_TRUE(static_cast(doc)); EXPECT_TRUE(doc.IsObject()); EXPECT_TRUE(doc.HasMember("hello")); const ValueType& hello = doc["hello"]; EXPECT_TRUE(hello.IsString()); EXPECT_STREQ("world", hello.GetString()); EXPECT_TRUE(doc.HasMember("t")); const ValueType& t = doc["t"]; EXPECT_TRUE(t.IsTrue()); EXPECT_TRUE(doc.HasMember("f")); const ValueType& f = doc["f"]; EXPECT_TRUE(f.IsFalse()); EXPECT_TRUE(doc.HasMember("n")); const ValueType& n = doc["n"]; EXPECT_TRUE(n.IsNull()); EXPECT_TRUE(doc.HasMember("i")); const ValueType& i = doc["i"]; EXPECT_TRUE(i.IsNumber()); EXPECT_EQ(123, i.GetInt()); EXPECT_TRUE(doc.HasMember("pi")); const ValueType& pi = doc["pi"]; EXPECT_TRUE(pi.IsNumber()); EXPECT_DOUBLE_EQ(3.1416, pi.GetDouble()); EXPECT_TRUE(doc.HasMember("a")); const ValueType& a = doc["a"]; EXPECT_TRUE(a.IsArray()); EXPECT_EQ(4u, a.Size()); for (SizeType j = 0; j < 4; j++) EXPECT_EQ(j + 1, a[j].GetUint()); } template void ParseTest() { typedef GenericDocument, Allocator, StackAllocator> DocumentType; DocumentType doc; const char* json = " { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } "; doc.Parse(json); ParseCheck(doc); doc.SetNull(); StringStream s(json); doc.template ParseStream<0>(s); ParseCheck(doc); doc.SetNull(); char *buffer = strdup(json); doc.ParseInsitu(buffer); ParseCheck(doc); free(buffer); // Parse(const Ch*, size_t) size_t length = strlen(json); buffer = reinterpret_cast(malloc(length * 2)); memcpy(buffer, json, length); memset(buffer + length, 'X', length); #if RAPIDJSON_HAS_STDSTRING std::string s2(buffer, length); // backup buffer #endif doc.SetNull(); doc.Parse(buffer, length); free(buffer); ParseCheck(doc); #if RAPIDJSON_HAS_STDSTRING // Parse(std::string) doc.SetNull(); doc.Parse(s2); ParseCheck(doc); #endif } TEST(Document, Parse) { ParseTest, CrtAllocator>(); ParseTest, MemoryPoolAllocator<> >(); ParseTest >(); ParseTest(); } TEST(Document, UnchangedOnParseError) { Document doc; doc.SetArray().PushBack(0, doc.GetAllocator()); ParseResult noError; EXPECT_TRUE(noError); ParseResult err = doc.Parse("{]"); EXPECT_TRUE(doc.HasParseError()); EXPECT_NE(err, noError); EXPECT_NE(err.Code(), noError); EXPECT_NE(noError, doc.GetParseError()); EXPECT_EQ(err.Code(), doc.GetParseError()); EXPECT_EQ(err.Offset(), doc.GetErrorOffset()); EXPECT_TRUE(doc.IsArray()); EXPECT_EQ(doc.Size(), 1u); err = doc.Parse("{}"); EXPECT_FALSE(doc.HasParseError()); EXPECT_FALSE(err.IsError()); EXPECT_TRUE(err); EXPECT_EQ(err, noError); EXPECT_EQ(err.Code(), noError); EXPECT_EQ(err.Code(), doc.GetParseError()); EXPECT_EQ(err.Offset(), doc.GetErrorOffset()); EXPECT_TRUE(doc.IsObject()); EXPECT_EQ(doc.MemberCount(), 0u); } static FILE* OpenEncodedFile(const char* filename) { const char *paths[] = { "encodings", "bin/encodings", "../bin/encodings", "../../bin/encodings", "../../../bin/encodings" }; char buffer[1024]; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { sprintf(buffer, "%s/%s", paths[i], filename); FILE *fp = fopen(buffer, "rb"); if (fp) return fp; } return 0; } TEST(Document, Parse_Encoding) { const char* json = " { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } "; typedef GenericDocument > DocumentType; DocumentType doc; // Parse(const SourceEncoding::Ch*) // doc.Parse >(json); // EXPECT_FALSE(doc.HasParseError()); // EXPECT_EQ(0, StrCmp(doc[L"hello"].GetString(), L"world")); // Parse(const SourceEncoding::Ch*, size_t) size_t length = strlen(json); char* buffer = reinterpret_cast(malloc(length * 2)); memcpy(buffer, json, length); memset(buffer + length, 'X', length); #if RAPIDJSON_HAS_STDSTRING std::string s2(buffer, length); // backup buffer #endif doc.SetNull(); doc.Parse >(buffer, length); free(buffer); EXPECT_FALSE(doc.HasParseError()); if (doc.HasParseError()) printf("Error: %d at %zu\n", static_cast(doc.GetParseError()), doc.GetErrorOffset()); EXPECT_EQ(0, StrCmp(doc[L"hello"].GetString(), L"world")); #if RAPIDJSON_HAS_STDSTRING // Parse(std::string) doc.SetNull(); #if defined(_MSC_VER) && _MSC_VER < 1800 doc.Parse >(s2.c_str()); // VS2010 or below cannot handle templated function overloading. Use const char* instead. #else doc.Parse >(s2); #endif EXPECT_FALSE(doc.HasParseError()); EXPECT_EQ(0, StrCmp(doc[L"hello"].GetString(), L"world")); #endif } TEST(Document, ParseStream_EncodedInputStream) { // UTF8 -> UTF16 FILE* fp = OpenEncodedFile("utf8.json"); char buffer[256]; FileReadStream bis(fp, buffer, sizeof(buffer)); EncodedInputStream, FileReadStream> eis(bis); GenericDocument > d; d.ParseStream<0, UTF8<> >(eis); EXPECT_FALSE(d.HasParseError()); fclose(fp); wchar_t expected[] = L"I can eat glass and it doesn't hurt me."; GenericValue >& v = d[L"en"]; EXPECT_TRUE(v.IsString()); EXPECT_EQ(sizeof(expected) / sizeof(wchar_t) - 1, v.GetStringLength()); EXPECT_EQ(0, StrCmp(expected, v.GetString())); // UTF16 -> UTF8 in memory StringBuffer bos; typedef EncodedOutputStream, StringBuffer> OutputStream; OutputStream eos(bos, false); // Not writing BOM { Writer, UTF8<> > writer(eos); d.Accept(writer); } // Condense the original file and compare. fp = OpenEncodedFile("utf8.json"); FileReadStream is(fp, buffer, sizeof(buffer)); Reader reader; StringBuffer bos2; Writer writer2(bos2); reader.Parse(is, writer2); fclose(fp); EXPECT_EQ(bos.GetSize(), bos2.GetSize()); EXPECT_EQ(0, memcmp(bos.GetString(), bos2.GetString(), bos2.GetSize())); } TEST(Document, ParseStream_AutoUTFInputStream) { // Any -> UTF8 FILE* fp = OpenEncodedFile("utf32be.json"); char buffer[256]; FileReadStream bis(fp, buffer, sizeof(buffer)); AutoUTFInputStream eis(bis); Document d; d.ParseStream<0, AutoUTF >(eis); EXPECT_FALSE(d.HasParseError()); fclose(fp); char expected[] = "I can eat glass and it doesn't hurt me."; Value& v = d["en"]; EXPECT_TRUE(v.IsString()); EXPECT_EQ(sizeof(expected) - 1, v.GetStringLength()); EXPECT_EQ(0, StrCmp(expected, v.GetString())); // UTF8 -> UTF8 in memory StringBuffer bos; Writer writer(bos); d.Accept(writer); // Condense the original file and compare. fp = OpenEncodedFile("utf8.json"); FileReadStream is(fp, buffer, sizeof(buffer)); Reader reader; StringBuffer bos2; Writer writer2(bos2); reader.Parse(is, writer2); fclose(fp); EXPECT_EQ(bos.GetSize(), bos2.GetSize()); EXPECT_EQ(0, memcmp(bos.GetString(), bos2.GetString(), bos2.GetSize())); } TEST(Document, Swap) { Document d1; Document::AllocatorType& a = d1.GetAllocator(); d1.SetArray().PushBack(1, a).PushBack(2, a); Value o; o.SetObject().AddMember("a", 1, a); // Swap between Document and Value d1.Swap(o); EXPECT_TRUE(d1.IsObject()); EXPECT_TRUE(o.IsArray()); d1.Swap(o); EXPECT_TRUE(d1.IsArray()); EXPECT_TRUE(o.IsObject()); o.Swap(d1); EXPECT_TRUE(d1.IsObject()); EXPECT_TRUE(o.IsArray()); // Swap between Document and Document Document d2; d2.SetArray().PushBack(3, a); d1.Swap(d2); EXPECT_TRUE(d1.IsArray()); EXPECT_TRUE(d2.IsObject()); EXPECT_EQ(&d2.GetAllocator(), &a); // reset value Value().Swap(d1); EXPECT_TRUE(d1.IsNull()); // reset document, including allocator // so clear o before so that it doesnt contain dangling elements o.Clear(); Document().Swap(d2); EXPECT_TRUE(d2.IsNull()); EXPECT_NE(&d2.GetAllocator(), &a); // testing std::swap compatibility d1.SetBool(true); using std::swap; swap(d1, d2); EXPECT_TRUE(d1.IsNull()); EXPECT_TRUE(d2.IsTrue()); swap(o, d2); EXPECT_TRUE(o.IsTrue()); EXPECT_TRUE(d2.IsArray()); } // This should be slow due to assignment in inner-loop. struct OutputStringStream : public std::ostringstream { typedef char Ch; virtual ~OutputStringStream(); void Put(char c) { put(c); } void Flush() {} }; OutputStringStream::~OutputStringStream() {} TEST(Document, AcceptWriter) { Document doc; doc.Parse(" { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } "); OutputStringStream os; Writer writer(os); doc.Accept(writer); EXPECT_EQ("{\"hello\":\"world\",\"t\":true,\"f\":false,\"n\":null,\"i\":123,\"pi\":3.1416,\"a\":[1,2,3,4]}", os.str()); } TEST(Document, UserBuffer) { typedef GenericDocument, MemoryPoolAllocator<>, MemoryPoolAllocator<> > DocumentType; char valueBuffer[4096]; char parseBuffer[1024]; MemoryPoolAllocator<> valueAllocator(valueBuffer, sizeof(valueBuffer)); MemoryPoolAllocator<> parseAllocator(parseBuffer, sizeof(parseBuffer)); DocumentType doc(&valueAllocator, sizeof(parseBuffer) / 2, &parseAllocator); doc.Parse(" { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } "); EXPECT_FALSE(doc.HasParseError()); EXPECT_LE(valueAllocator.Size(), sizeof(valueBuffer)); EXPECT_LE(parseAllocator.Size(), sizeof(parseBuffer)); // Cover MemoryPoolAllocator::Capacity() EXPECT_LE(valueAllocator.Size(), valueAllocator.Capacity()); EXPECT_LE(parseAllocator.Size(), parseAllocator.Capacity()); } // Issue 226: Value of string type should not point to NULL TEST(Document, AssertAcceptInvalidNameType) { Document doc; doc.SetObject(); doc.AddMember("a", 0, doc.GetAllocator()); doc.FindMember("a")->name.SetNull(); // Change name to non-string type. OutputStringStream os; Writer writer(os); ASSERT_THROW(doc.Accept(writer), AssertException); } // Issue 44: SetStringRaw doesn't work with wchar_t TEST(Document, UTF16_Document) { GenericDocument< UTF16<> > json; json.Parse(L"[{\"created_at\":\"Wed Oct 30 17:13:20 +0000 2012\"}]"); ASSERT_TRUE(json.IsArray()); GenericValue< UTF16<> >& v = json[0]; ASSERT_TRUE(v.IsObject()); GenericValue< UTF16<> >& s = v[L"created_at"]; ASSERT_TRUE(s.IsString()); EXPECT_EQ(0, memcmp(L"Wed Oct 30 17:13:20 +0000 2012", s.GetString(), (s.GetStringLength() + 1) * sizeof(wchar_t))); } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS #if 0 // Many old compiler does not support these. Turn it off temporaily. #include TEST(Document, Traits) { static_assert(std::is_constructible::value, ""); static_assert(std::is_default_constructible::value, ""); #ifndef _MSC_VER static_assert(!std::is_copy_constructible::value, ""); #endif static_assert(std::is_move_constructible::value, ""); static_assert(!std::is_nothrow_constructible::value, ""); static_assert(!std::is_nothrow_default_constructible::value, ""); #ifndef _MSC_VER static_assert(!std::is_nothrow_copy_constructible::value, ""); static_assert(std::is_nothrow_move_constructible::value, ""); #endif static_assert(std::is_assignable::value, ""); #ifndef _MSC_VER static_assert(!std::is_copy_assignable::value, ""); #endif static_assert(std::is_move_assignable::value, ""); #ifndef _MSC_VER static_assert(std::is_nothrow_assignable::value, ""); #endif static_assert(!std::is_nothrow_copy_assignable::value, ""); #ifndef _MSC_VER static_assert(std::is_nothrow_move_assignable::value, ""); #endif static_assert( std::is_destructible::value, ""); #ifndef _MSC_VER static_assert(std::is_nothrow_destructible::value, ""); #endif } #endif template struct DocumentMove: public ::testing::Test { }; typedef ::testing::Types< CrtAllocator, MemoryPoolAllocator<> > MoveAllocatorTypes; TYPED_TEST_CASE(DocumentMove, MoveAllocatorTypes); TYPED_TEST(DocumentMove, MoveConstructor) { typedef TypeParam Allocator; typedef GenericDocument, Allocator> D; Allocator allocator; D a(&allocator); a.Parse("[\"one\", \"two\", \"three\"]"); EXPECT_FALSE(a.HasParseError()); EXPECT_TRUE(a.IsArray()); EXPECT_EQ(3u, a.Size()); EXPECT_EQ(&a.GetAllocator(), &allocator); // Document b(a); // does not compile (!is_copy_constructible) D b(std::move(a)); EXPECT_TRUE(a.IsNull()); EXPECT_TRUE(b.IsArray()); EXPECT_EQ(3u, b.Size()); EXPECT_THROW(a.GetAllocator(), AssertException); EXPECT_EQ(&b.GetAllocator(), &allocator); b.Parse("{\"Foo\": \"Bar\", \"Baz\": 42}"); EXPECT_FALSE(b.HasParseError()); EXPECT_TRUE(b.IsObject()); EXPECT_EQ(2u, b.MemberCount()); // Document c = a; // does not compile (!is_copy_constructible) D c = std::move(b); EXPECT_TRUE(b.IsNull()); EXPECT_TRUE(c.IsObject()); EXPECT_EQ(2u, c.MemberCount()); EXPECT_THROW(b.GetAllocator(), AssertException); EXPECT_EQ(&c.GetAllocator(), &allocator); } TYPED_TEST(DocumentMove, MoveConstructorParseError) { typedef TypeParam Allocator; typedef GenericDocument, Allocator> D; ParseResult noError; D a; a.Parse("{ 4 = 4]"); ParseResult error(a.GetParseError(), a.GetErrorOffset()); EXPECT_TRUE(a.HasParseError()); EXPECT_NE(error, noError); EXPECT_NE(error.Code(), noError); EXPECT_NE(error.Code(), noError.Code()); EXPECT_NE(error.Offset(), noError.Offset()); D b(std::move(a)); EXPECT_FALSE(a.HasParseError()); EXPECT_TRUE(b.HasParseError()); EXPECT_EQ(a.GetParseError(), noError); EXPECT_EQ(a.GetParseError(), noError.Code()); EXPECT_EQ(a.GetErrorOffset(), noError.Offset()); EXPECT_EQ(b.GetParseError(), error); EXPECT_EQ(b.GetParseError(), error.Code()); EXPECT_EQ(b.GetErrorOffset(), error.Offset()); D c(std::move(b)); EXPECT_FALSE(b.HasParseError()); EXPECT_TRUE(c.HasParseError()); EXPECT_EQ(b.GetParseError(), noError.Code()); EXPECT_EQ(c.GetParseError(), error.Code()); EXPECT_EQ(b.GetErrorOffset(), noError.Offset()); EXPECT_EQ(c.GetErrorOffset(), error.Offset()); } // This test does not properly use parsing, just for testing. // It must call ClearStack() explicitly to prevent memory leak. // But here we cannot as ClearStack() is private. #if 0 TYPED_TEST(DocumentMove, MoveConstructorStack) { typedef TypeParam Allocator; typedef UTF8<> Encoding; typedef GenericDocument Document; Document a; size_t defaultCapacity = a.GetStackCapacity(); // Trick Document into getting GetStackCapacity() to return non-zero typedef GenericReader Reader; Reader reader(&a.GetAllocator()); GenericStringStream is("[\"one\", \"two\", \"three\"]"); reader.template Parse(is, a); size_t capacity = a.GetStackCapacity(); EXPECT_GT(capacity, 0u); Document b(std::move(a)); EXPECT_EQ(a.GetStackCapacity(), defaultCapacity); EXPECT_EQ(b.GetStackCapacity(), capacity); Document c = std::move(b); EXPECT_EQ(b.GetStackCapacity(), defaultCapacity); EXPECT_EQ(c.GetStackCapacity(), capacity); } #endif TYPED_TEST(DocumentMove, MoveAssignment) { typedef TypeParam Allocator; typedef GenericDocument, Allocator> D; Allocator allocator; D a(&allocator); a.Parse("[\"one\", \"two\", \"three\"]"); EXPECT_FALSE(a.HasParseError()); EXPECT_TRUE(a.IsArray()); EXPECT_EQ(3u, a.Size()); EXPECT_EQ(&a.GetAllocator(), &allocator); // Document b; b = a; // does not compile (!is_copy_assignable) D b; b = std::move(a); EXPECT_TRUE(a.IsNull()); EXPECT_TRUE(b.IsArray()); EXPECT_EQ(3u, b.Size()); EXPECT_THROW(a.GetAllocator(), AssertException); EXPECT_EQ(&b.GetAllocator(), &allocator); b.Parse("{\"Foo\": \"Bar\", \"Baz\": 42}"); EXPECT_FALSE(b.HasParseError()); EXPECT_TRUE(b.IsObject()); EXPECT_EQ(2u, b.MemberCount()); // Document c; c = a; // does not compile (see static_assert) D c; c = std::move(b); EXPECT_TRUE(b.IsNull()); EXPECT_TRUE(c.IsObject()); EXPECT_EQ(2u, c.MemberCount()); EXPECT_THROW(b.GetAllocator(), AssertException); EXPECT_EQ(&c.GetAllocator(), &allocator); } TYPED_TEST(DocumentMove, MoveAssignmentParseError) { typedef TypeParam Allocator; typedef GenericDocument, Allocator> D; ParseResult noError; D a; a.Parse("{ 4 = 4]"); ParseResult error(a.GetParseError(), a.GetErrorOffset()); EXPECT_TRUE(a.HasParseError()); EXPECT_NE(error.Code(), noError.Code()); EXPECT_NE(error.Offset(), noError.Offset()); D b; b = std::move(a); EXPECT_FALSE(a.HasParseError()); EXPECT_TRUE(b.HasParseError()); EXPECT_EQ(a.GetParseError(), noError.Code()); EXPECT_EQ(b.GetParseError(), error.Code()); EXPECT_EQ(a.GetErrorOffset(), noError.Offset()); EXPECT_EQ(b.GetErrorOffset(), error.Offset()); D c; c = std::move(b); EXPECT_FALSE(b.HasParseError()); EXPECT_TRUE(c.HasParseError()); EXPECT_EQ(b.GetParseError(), noError.Code()); EXPECT_EQ(c.GetParseError(), error.Code()); EXPECT_EQ(b.GetErrorOffset(), noError.Offset()); EXPECT_EQ(c.GetErrorOffset(), error.Offset()); } // This test does not properly use parsing, just for testing. // It must call ClearStack() explicitly to prevent memory leak. // But here we cannot as ClearStack() is private. #if 0 TYPED_TEST(DocumentMove, MoveAssignmentStack) { typedef TypeParam Allocator; typedef UTF8<> Encoding; typedef GenericDocument D; D a; size_t defaultCapacity = a.GetStackCapacity(); // Trick Document into getting GetStackCapacity() to return non-zero typedef GenericReader Reader; Reader reader(&a.GetAllocator()); GenericStringStream is("[\"one\", \"two\", \"three\"]"); reader.template Parse(is, a); size_t capacity = a.GetStackCapacity(); EXPECT_GT(capacity, 0u); D b; b = std::move(a); EXPECT_EQ(a.GetStackCapacity(), defaultCapacity); EXPECT_EQ(b.GetStackCapacity(), capacity); D c; c = std::move(b); EXPECT_EQ(b.GetStackCapacity(), defaultCapacity); EXPECT_EQ(c.GetStackCapacity(), capacity); } #endif #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS // Issue 22: Memory corruption via operator= // Fixed by making unimplemented assignment operator private. //TEST(Document, Assignment) { // Document d1; // Document d2; // d1 = d2; //} #ifdef __clang__ RAPIDJSON_DIAG_POP #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/namespacetest.cpp0000644000000000000000000000453415031566105026115 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" // test another instantiation of RapidJSON in a different namespace #define RAPIDJSON_NAMESPACE my::rapid::json #define RAPIDJSON_NAMESPACE_BEGIN namespace my { namespace rapid { namespace json { #define RAPIDJSON_NAMESPACE_END } } } // include lots of RapidJSON files #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/filereadstream.h" #include "rapidjson/filewritestream.h" #include "rapidjson/encodedstream.h" #include "rapidjson/stringbuffer.h" static const char json[] = "{\"hello\":\"world\",\"t\":true,\"f\":false,\"n\":null,\"i\":123,\"pi\":3.1416,\"a\":[1,2,3,4]}"; TEST(NamespaceTest,Using) { using namespace RAPIDJSON_NAMESPACE; typedef GenericDocument, CrtAllocator> DocumentType; DocumentType doc; doc.Parse(json); EXPECT_TRUE(!doc.HasParseError()); } TEST(NamespaceTest,Direct) { typedef RAPIDJSON_NAMESPACE::Document Document; typedef RAPIDJSON_NAMESPACE::Reader Reader; typedef RAPIDJSON_NAMESPACE::StringStream StringStream; typedef RAPIDJSON_NAMESPACE::StringBuffer StringBuffer; typedef RAPIDJSON_NAMESPACE::Writer WriterType; StringStream s(json); StringBuffer buffer; WriterType writer(buffer); buffer.ShrinkToFit(); Reader reader; reader.Parse(s, writer); EXPECT_STREQ(json, buffer.GetString()); EXPECT_EQ(sizeof(json)-1, buffer.GetSize()); EXPECT_TRUE(writer.IsComplete()); Document doc; doc.Parse(buffer.GetString()); EXPECT_TRUE(!doc.HasParseError()); buffer.Clear(); writer.Reset(buffer); doc.Accept(writer); EXPECT_STREQ(json, buffer.GetString()); EXPECT_TRUE(writer.IsComplete()); } asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/simdtest.cpp0000644000000000000000000001571515031566105025120 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. // Since Travis CI installs old Valgrind 3.7.0, which fails with some SSE4.2 // The unit tests prefix with SIMD should be skipped by Valgrind test // __SSE2__ and __SSE4_2__ are recognized by gcc, clang, and the Intel compiler. // We use -march=native with gmake to enable -msse2 and -msse4.2, if supported. #if defined(__SSE4_2__) # define RAPIDJSON_SSE42 #elif defined(__SSE2__) # define RAPIDJSON_SSE2 #elif defined(__ARM_NEON) # define RAPIDJSON_NEON #endif #define RAPIDJSON_NAMESPACE rapidjson_simd #include "unittest.h" #include "rapidjson/reader.h" #include "rapidjson/writer.h" #ifdef __GNUC__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) #endif using namespace rapidjson_simd; #ifdef RAPIDJSON_SSE2 #define SIMD_SUFFIX(name) name##_SSE2 #elif defined(RAPIDJSON_SSE42) #define SIMD_SUFFIX(name) name##_SSE42 #elif defined(RAPIDJSON_NEON) #define SIMD_SUFFIX(name) name##_NEON #else #define SIMD_SUFFIX(name) name #endif #define SIMD_SIZE_ALIGN(n) ((size_t(n) + 15) & ~size_t(15)) template void TestSkipWhitespace() { for (size_t step = 1; step < 32; step++) { char buffer[SIMD_SIZE_ALIGN(1025)]; for (size_t i = 0; i < 1024; i++) buffer[i] = " \t\r\n"[i % 4]; for (size_t i = 0; i < 1024; i += step) buffer[i] = 'X'; buffer[1024] = '\0'; StreamType s(buffer); size_t i = 0; for (;;) { SkipWhitespace(s); if (s.Peek() == '\0') break; EXPECT_EQ(i, s.Tell()); EXPECT_EQ('X', s.Take()); i += step; } } } TEST(SIMD, SIMD_SUFFIX(SkipWhitespace)) { TestSkipWhitespace(); TestSkipWhitespace(); } TEST(SIMD, SIMD_SUFFIX(SkipWhitespace_EncodedMemoryStream)) { for (size_t step = 1; step < 32; step++) { char buffer[SIMD_SIZE_ALIGN(1024)]; for (size_t i = 0; i < 1024; i++) buffer[i] = " \t\r\n"[i % 4]; for (size_t i = 0; i < 1024; i += step) buffer[i] = 'X'; MemoryStream ms(buffer, 1024); EncodedInputStream, MemoryStream> s(ms); for (;;) { SkipWhitespace(s); if (s.Peek() == '\0') break; //EXPECT_EQ(i, s.Tell()); EXPECT_EQ('X', s.Take()); } } } struct ScanCopyUnescapedStringHandler : BaseReaderHandler, ScanCopyUnescapedStringHandler> { bool String(const char* str, size_t length, bool) { memcpy(buffer, str, length + 1); return true; } char buffer[1024 + 5 + 32]; }; template void TestScanCopyUnescapedString() { char buffer[SIMD_SIZE_ALIGN(1024u + 5 + 32)]; char backup[SIMD_SIZE_ALIGN(1024u + 5 + 32)]; // Test "ABCDABCD...\\" for (size_t offset = 0; offset < 32; offset++) { for (size_t step = 0; step < 1024; step++) { char* json = buffer + offset; char *p = json; *p++ = '\"'; for (size_t i = 0; i < step; i++) *p++ = "ABCD"[i % 4]; *p++ = '\\'; *p++ = '\\'; *p++ = '\"'; *p++ = '\0'; strcpy(backup, json); // insitu parsing will overwrite buffer, so need to backup first StreamType s(json); Reader reader; ScanCopyUnescapedStringHandler h; reader.Parse(s, h); EXPECT_TRUE(memcmp(h.buffer, backup + 1, step) == 0); EXPECT_EQ('\\', h.buffer[step]); // escaped EXPECT_EQ('\0', h.buffer[step + 1]); } } // Test "\\ABCDABCD..." for (size_t offset = 0; offset < 32; offset++) { for (size_t step = 0; step < 1024; step++) { char* json = buffer + offset; char *p = json; *p++ = '\"'; *p++ = '\\'; *p++ = '\\'; for (size_t i = 0; i < step; i++) *p++ = "ABCD"[i % 4]; *p++ = '\"'; *p++ = '\0'; strcpy(backup, json); // insitu parsing will overwrite buffer, so need to backup first StreamType s(json); Reader reader; ScanCopyUnescapedStringHandler h; reader.Parse(s, h); EXPECT_TRUE(memcmp(h.buffer + 1, backup + 3, step) == 0); EXPECT_EQ('\\', h.buffer[0]); // escaped EXPECT_EQ('\0', h.buffer[step + 1]); } } } TEST(SIMD, SIMD_SUFFIX(ScanCopyUnescapedString)) { TestScanCopyUnescapedString(); TestScanCopyUnescapedString(); } TEST(SIMD, SIMD_SUFFIX(ScanWriteUnescapedString)) { char buffer[SIMD_SIZE_ALIGN(2048 + 1 + 32)]; for (size_t offset = 0; offset < 32; offset++) { for (size_t step = 0; step < 1024; step++) { char* s = buffer + offset; char* p = s; for (size_t i = 0; i < step; i++) *p++ = "ABCD"[i % 4]; char escape = "\0\n\\\""[step % 4]; *p++ = escape; for (size_t i = 0; i < step; i++) *p++ = "ABCD"[i % 4]; StringBuffer sb; Writer writer(sb); writer.String(s, SizeType(step * 2 + 1)); const char* q = sb.GetString(); EXPECT_EQ('\"', *q++); for (size_t i = 0; i < step; i++) EXPECT_EQ("ABCD"[i % 4], *q++); if (escape == '\0') { EXPECT_EQ('\\', *q++); EXPECT_EQ('u', *q++); EXPECT_EQ('0', *q++); EXPECT_EQ('0', *q++); EXPECT_EQ('0', *q++); EXPECT_EQ('0', *q++); } else if (escape == '\n') { EXPECT_EQ('\\', *q++); EXPECT_EQ('n', *q++); } else if (escape == '\\') { EXPECT_EQ('\\', *q++); EXPECT_EQ('\\', *q++); } else if (escape == '\"') { EXPECT_EQ('\\', *q++); EXPECT_EQ('\"', *q++); } for (size_t i = 0; i < step; i++) EXPECT_EQ("ABCD"[i % 4], *q++); EXPECT_EQ('\"', *q++); EXPECT_EQ('\0', *q++); } } } #ifdef __GNUC__ RAPIDJSON_DIAG_POP #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/unittest.cpp0000644000000000000000000000276315031566105025142 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/rapidjson.h" #ifdef __clang__ #pragma GCC diagnostic push #if __has_warning("-Wdeprecated") #pragma GCC diagnostic ignored "-Wdeprecated" #endif #endif AssertException::~AssertException() throw() {} #ifdef __clang__ #pragma GCC diagnostic pop #endif int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); std::cout << "RapidJSON v" << RAPIDJSON_VERSION_STRING << std::endl; #ifdef _MSC_VER _CrtMemState memoryState = { 0 }; (void)memoryState; _CrtMemCheckpoint(&memoryState); //_CrtSetBreakAlloc(X); //void *testWhetherMemoryLeakDetectionWorks = malloc(1); #endif int ret = RUN_ALL_TESTS(); #ifdef _MSC_VER // Current gtest constantly leak 2 blocks at exit _CrtMemDumpAllObjectsSince(&memoryState); #endif return ret; } asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/valuetest.cpp0000644000000000000000000016033615031566105025300 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/document.h" #include #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(c++98-compat) #endif using namespace rapidjson; TEST(Value, Size) { if (sizeof(SizeType) == 4) { #if RAPIDJSON_48BITPOINTER_OPTIMIZATION EXPECT_EQ(16u, sizeof(Value)); #elif RAPIDJSON_64BIT EXPECT_EQ(24u, sizeof(Value)); #else EXPECT_EQ(16u, sizeof(Value)); #endif } } TEST(Value, DefaultConstructor) { Value x; EXPECT_EQ(kNullType, x.GetType()); EXPECT_TRUE(x.IsNull()); //std::cout << "sizeof(Value): " << sizeof(x) << std::endl; } // Should not pass compilation //TEST(Value, copy_constructor) { // Value x(1234); // Value y = x; //} #if RAPIDJSON_HAS_CXX11_RVALUE_REFS #if 0 // Many old compiler does not support these. Turn it off temporaily. #include TEST(Value, Traits) { typedef GenericValue, CrtAllocator> Value; static_assert(std::is_constructible::value, ""); static_assert(std::is_default_constructible::value, ""); #ifndef _MSC_VER static_assert(!std::is_copy_constructible::value, ""); #endif static_assert(std::is_move_constructible::value, ""); #ifndef _MSC_VER static_assert(std::is_nothrow_constructible::value, ""); static_assert(std::is_nothrow_default_constructible::value, ""); static_assert(!std::is_nothrow_copy_constructible::value, ""); static_assert(std::is_nothrow_move_constructible::value, ""); #endif static_assert(std::is_assignable::value, ""); #ifndef _MSC_VER static_assert(!std::is_copy_assignable::value, ""); #endif static_assert(std::is_move_assignable::value, ""); #ifndef _MSC_VER static_assert(std::is_nothrow_assignable::value, ""); #endif static_assert(!std::is_nothrow_copy_assignable::value, ""); #ifndef _MSC_VER static_assert(std::is_nothrow_move_assignable::value, ""); #endif static_assert(std::is_destructible::value, ""); #ifndef _MSC_VER static_assert(std::is_nothrow_destructible::value, ""); #endif } #endif TEST(Value, MoveConstructor) { typedef GenericValue, CrtAllocator> V; V::AllocatorType allocator; V x((V(kArrayType))); x.Reserve(4u, allocator); x.PushBack(1, allocator).PushBack(2, allocator).PushBack(3, allocator).PushBack(4, allocator); EXPECT_TRUE(x.IsArray()); EXPECT_EQ(4u, x.Size()); // Value y(x); // does not compile (!is_copy_constructible) V y(std::move(x)); EXPECT_TRUE(x.IsNull()); EXPECT_TRUE(y.IsArray()); EXPECT_EQ(4u, y.Size()); // Value z = y; // does not compile (!is_copy_assignable) V z = std::move(y); EXPECT_TRUE(y.IsNull()); EXPECT_TRUE(z.IsArray()); EXPECT_EQ(4u, z.Size()); } #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS TEST(Value, AssignmentOperator) { Value x(1234); Value y; y = x; EXPECT_TRUE(x.IsNull()); // move semantic EXPECT_EQ(1234, y.GetInt()); y = 5678; EXPECT_TRUE(y.IsInt()); EXPECT_EQ(5678, y.GetInt()); x = "Hello"; EXPECT_TRUE(x.IsString()); EXPECT_STREQ(x.GetString(),"Hello"); y = StringRef(x.GetString(),x.GetStringLength()); EXPECT_TRUE(y.IsString()); EXPECT_EQ(y.GetString(),x.GetString()); EXPECT_EQ(y.GetStringLength(),x.GetStringLength()); static char mstr[] = "mutable"; // y = mstr; // should not compile y = StringRef(mstr); EXPECT_TRUE(y.IsString()); EXPECT_EQ(y.GetString(),mstr); #if RAPIDJSON_HAS_CXX11_RVALUE_REFS // C++11 move assignment x = Value("World"); EXPECT_TRUE(x.IsString()); EXPECT_STREQ("World", x.GetString()); x = std::move(y); EXPECT_TRUE(y.IsNull()); EXPECT_TRUE(x.IsString()); EXPECT_EQ(x.GetString(), mstr); y = std::move(Value().SetInt(1234)); EXPECT_TRUE(y.IsInt()); EXPECT_EQ(1234, y); #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS } template void TestEqual(const A& a, const B& b) { EXPECT_TRUE (a == b); EXPECT_FALSE(a != b); EXPECT_TRUE (b == a); EXPECT_FALSE(b != a); } template void TestUnequal(const A& a, const B& b) { EXPECT_FALSE(a == b); EXPECT_TRUE (a != b); EXPECT_FALSE(b == a); EXPECT_TRUE (b != a); } TEST(Value, EqualtoOperator) { Value::AllocatorType allocator; Value x(kObjectType); x.AddMember("hello", "world", allocator) .AddMember("t", Value(true).Move(), allocator) .AddMember("f", Value(false).Move(), allocator) .AddMember("n", Value(kNullType).Move(), allocator) .AddMember("i", 123, allocator) .AddMember("pi", 3.14, allocator) .AddMember("a", Value(kArrayType).Move().PushBack(1, allocator).PushBack(2, allocator).PushBack(3, allocator), allocator); // Test templated operator==() and operator!=() TestEqual(x["hello"], "world"); const char* cc = "world"; TestEqual(x["hello"], cc); char* c = strdup("world"); TestEqual(x["hello"], c); free(c); TestEqual(x["t"], true); TestEqual(x["f"], false); TestEqual(x["i"], 123); TestEqual(x["pi"], 3.14); // Test operator==() (including different allocators) CrtAllocator crtAllocator; GenericValue, CrtAllocator> y; GenericDocument, CrtAllocator> z(&crtAllocator); y.CopyFrom(x, crtAllocator); z.CopyFrom(y, z.GetAllocator()); TestEqual(x, y); TestEqual(y, z); TestEqual(z, x); // Swapping member order should be fine. EXPECT_TRUE(y.RemoveMember("t")); TestUnequal(x, y); TestUnequal(z, y); EXPECT_TRUE(z.RemoveMember("t")); TestUnequal(x, z); TestEqual(y, z); y.AddMember("t", false, crtAllocator); z.AddMember("t", false, z.GetAllocator()); TestUnequal(x, y); TestUnequal(z, x); y["t"] = true; z["t"] = true; TestEqual(x, y); TestEqual(y, z); TestEqual(z, x); // Swapping element order is not OK x["a"][0].Swap(x["a"][1]); TestUnequal(x, y); x["a"][0].Swap(x["a"][1]); TestEqual(x, y); // Array of different size x["a"].PushBack(4, allocator); TestUnequal(x, y); x["a"].PopBack(); TestEqual(x, y); // Issue #129: compare Uint64 x.SetUint64(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFF0)); y.SetUint64(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF)); TestUnequal(x, y); } template void TestCopyFrom() { typename Value::AllocatorType a; Value v1(1234); Value v2(v1, a); // deep copy constructor EXPECT_TRUE(v1.GetType() == v2.GetType()); EXPECT_EQ(v1.GetInt(), v2.GetInt()); v1.SetString("foo"); v2.CopyFrom(v1, a); EXPECT_TRUE(v1.GetType() == v2.GetType()); EXPECT_STREQ(v1.GetString(), v2.GetString()); EXPECT_EQ(v1.GetString(), v2.GetString()); // string NOT copied v1.SetString("bar", a); // copy string v2.CopyFrom(v1, a); EXPECT_TRUE(v1.GetType() == v2.GetType()); EXPECT_STREQ(v1.GetString(), v2.GetString()); EXPECT_NE(v1.GetString(), v2.GetString()); // string copied v1.SetArray().PushBack(1234, a); v2.CopyFrom(v1, a); EXPECT_TRUE(v2.IsArray()); EXPECT_EQ(v1.Size(), v2.Size()); v1.PushBack(Value().SetString("foo", a), a); // push string copy EXPECT_TRUE(v1.Size() != v2.Size()); v2.CopyFrom(v1, a); EXPECT_TRUE(v1.Size() == v2.Size()); EXPECT_STREQ(v1[1].GetString(), v2[1].GetString()); EXPECT_NE(v1[1].GetString(), v2[1].GetString()); // string got copied } TEST(Value, CopyFrom) { TestCopyFrom(); TestCopyFrom, CrtAllocator> >(); } TEST(Value, Swap) { Value v1(1234); Value v2(kObjectType); EXPECT_EQ(&v1, &v1.Swap(v2)); EXPECT_TRUE(v1.IsObject()); EXPECT_TRUE(v2.IsInt()); EXPECT_EQ(1234, v2.GetInt()); // testing std::swap compatibility using std::swap; swap(v1, v2); EXPECT_TRUE(v1.IsInt()); EXPECT_TRUE(v2.IsObject()); } TEST(Value, Null) { // Default constructor Value x; EXPECT_EQ(kNullType, x.GetType()); EXPECT_TRUE(x.IsNull()); EXPECT_FALSE(x.IsTrue()); EXPECT_FALSE(x.IsFalse()); EXPECT_FALSE(x.IsNumber()); EXPECT_FALSE(x.IsString()); EXPECT_FALSE(x.IsObject()); EXPECT_FALSE(x.IsArray()); // Constructor with type Value y(kNullType); EXPECT_TRUE(y.IsNull()); // SetNull(); Value z(true); z.SetNull(); EXPECT_TRUE(z.IsNull()); } TEST(Value, True) { // Constructor with bool Value x(true); EXPECT_EQ(kTrueType, x.GetType()); EXPECT_TRUE(x.GetBool()); EXPECT_TRUE(x.IsBool()); EXPECT_TRUE(x.IsTrue()); EXPECT_FALSE(x.IsNull()); EXPECT_FALSE(x.IsFalse()); EXPECT_FALSE(x.IsNumber()); EXPECT_FALSE(x.IsString()); EXPECT_FALSE(x.IsObject()); EXPECT_FALSE(x.IsArray()); // Constructor with type Value y(kTrueType); EXPECT_TRUE(y.IsTrue()); // SetBool() Value z; z.SetBool(true); EXPECT_TRUE(z.IsTrue()); // Templated functions EXPECT_TRUE(z.Is()); EXPECT_TRUE(z.Get()); EXPECT_FALSE(z.Set(false).Get()); EXPECT_TRUE(z.Set(true).Get()); } TEST(Value, False) { // Constructor with bool Value x(false); EXPECT_EQ(kFalseType, x.GetType()); EXPECT_TRUE(x.IsBool()); EXPECT_TRUE(x.IsFalse()); EXPECT_FALSE(x.IsNull()); EXPECT_FALSE(x.IsTrue()); EXPECT_FALSE(x.GetBool()); //EXPECT_FALSE((bool)x); EXPECT_FALSE(x.IsNumber()); EXPECT_FALSE(x.IsString()); EXPECT_FALSE(x.IsObject()); EXPECT_FALSE(x.IsArray()); // Constructor with type Value y(kFalseType); EXPECT_TRUE(y.IsFalse()); // SetBool() Value z; z.SetBool(false); EXPECT_TRUE(z.IsFalse()); } TEST(Value, Int) { // Constructor with int Value x(1234); EXPECT_EQ(kNumberType, x.GetType()); EXPECT_EQ(1234, x.GetInt()); EXPECT_EQ(1234u, x.GetUint()); EXPECT_EQ(1234, x.GetInt64()); EXPECT_EQ(1234u, x.GetUint64()); EXPECT_NEAR(1234.0, x.GetDouble(), 0.0); //EXPECT_EQ(1234, (int)x); //EXPECT_EQ(1234, (unsigned)x); //EXPECT_EQ(1234, (int64_t)x); //EXPECT_EQ(1234, (uint64_t)x); //EXPECT_EQ(1234, (double)x); EXPECT_TRUE(x.IsNumber()); EXPECT_TRUE(x.IsInt()); EXPECT_TRUE(x.IsUint()); EXPECT_TRUE(x.IsInt64()); EXPECT_TRUE(x.IsUint64()); EXPECT_FALSE(x.IsDouble()); EXPECT_FALSE(x.IsFloat()); EXPECT_FALSE(x.IsNull()); EXPECT_FALSE(x.IsBool()); EXPECT_FALSE(x.IsFalse()); EXPECT_FALSE(x.IsTrue()); EXPECT_FALSE(x.IsString()); EXPECT_FALSE(x.IsObject()); EXPECT_FALSE(x.IsArray()); Value nx(-1234); EXPECT_EQ(-1234, nx.GetInt()); EXPECT_EQ(-1234, nx.GetInt64()); EXPECT_TRUE(nx.IsInt()); EXPECT_TRUE(nx.IsInt64()); EXPECT_FALSE(nx.IsUint()); EXPECT_FALSE(nx.IsUint64()); // Constructor with type Value y(kNumberType); EXPECT_TRUE(y.IsNumber()); EXPECT_TRUE(y.IsInt()); EXPECT_EQ(0, y.GetInt()); // SetInt() Value z; z.SetInt(1234); EXPECT_EQ(1234, z.GetInt()); // operator=(int) z = 5678; EXPECT_EQ(5678, z.GetInt()); // Templated functions EXPECT_TRUE(z.Is()); EXPECT_EQ(5678, z.Get()); EXPECT_EQ(5679, z.Set(5679).Get()); EXPECT_EQ(5680, z.Set(5680).Get()); #ifdef _MSC_VER // long as int on MSC platforms RAPIDJSON_STATIC_ASSERT(sizeof(long) == sizeof(int)); z.SetInt(2222); EXPECT_TRUE(z.Is()); EXPECT_EQ(2222l, z.Get()); EXPECT_EQ(3333l, z.Set(3333l).Get()); EXPECT_EQ(4444l, z.Set(4444l).Get()); EXPECT_TRUE(z.IsInt()); #endif } TEST(Value, Uint) { // Constructor with int Value x(1234u); EXPECT_EQ(kNumberType, x.GetType()); EXPECT_EQ(1234, x.GetInt()); EXPECT_EQ(1234u, x.GetUint()); EXPECT_EQ(1234, x.GetInt64()); EXPECT_EQ(1234u, x.GetUint64()); EXPECT_TRUE(x.IsNumber()); EXPECT_TRUE(x.IsInt()); EXPECT_TRUE(x.IsUint()); EXPECT_TRUE(x.IsInt64()); EXPECT_TRUE(x.IsUint64()); EXPECT_NEAR(1234.0, x.GetDouble(), 0.0); // Number can always be cast as double but !IsDouble(). EXPECT_FALSE(x.IsDouble()); EXPECT_FALSE(x.IsFloat()); EXPECT_FALSE(x.IsNull()); EXPECT_FALSE(x.IsBool()); EXPECT_FALSE(x.IsFalse()); EXPECT_FALSE(x.IsTrue()); EXPECT_FALSE(x.IsString()); EXPECT_FALSE(x.IsObject()); EXPECT_FALSE(x.IsArray()); // SetUint() Value z; z.SetUint(1234); EXPECT_EQ(1234u, z.GetUint()); // operator=(unsigned) z = 5678u; EXPECT_EQ(5678u, z.GetUint()); z = 2147483648u; // 2^31, cannot cast as int EXPECT_EQ(2147483648u, z.GetUint()); EXPECT_FALSE(z.IsInt()); EXPECT_TRUE(z.IsInt64()); // Issue 41: Incorrect parsing of unsigned int number types // Templated functions EXPECT_TRUE(z.Is()); EXPECT_EQ(2147483648u, z.Get()); EXPECT_EQ(2147483649u, z.Set(2147483649u).Get()); EXPECT_EQ(2147483650u, z.Set(2147483650u).Get()); #ifdef _MSC_VER // unsigned long as unsigned on MSC platforms RAPIDJSON_STATIC_ASSERT(sizeof(unsigned long) == sizeof(unsigned)); z.SetUint(2222); EXPECT_TRUE(z.Is()); EXPECT_EQ(2222ul, z.Get()); EXPECT_EQ(3333ul, z.Set(3333ul).Get()); EXPECT_EQ(4444ul, z.Set(4444ul).Get()); EXPECT_TRUE(x.IsUint()); #endif } TEST(Value, Int64) { // Constructor with int Value x(int64_t(1234)); EXPECT_EQ(kNumberType, x.GetType()); EXPECT_EQ(1234, x.GetInt()); EXPECT_EQ(1234u, x.GetUint()); EXPECT_EQ(1234, x.GetInt64()); EXPECT_EQ(1234u, x.GetUint64()); EXPECT_TRUE(x.IsNumber()); EXPECT_TRUE(x.IsInt()); EXPECT_TRUE(x.IsUint()); EXPECT_TRUE(x.IsInt64()); EXPECT_TRUE(x.IsUint64()); EXPECT_FALSE(x.IsDouble()); EXPECT_FALSE(x.IsFloat()); EXPECT_FALSE(x.IsNull()); EXPECT_FALSE(x.IsBool()); EXPECT_FALSE(x.IsFalse()); EXPECT_FALSE(x.IsTrue()); EXPECT_FALSE(x.IsString()); EXPECT_FALSE(x.IsObject()); EXPECT_FALSE(x.IsArray()); Value nx(int64_t(-1234)); EXPECT_EQ(-1234, nx.GetInt()); EXPECT_EQ(-1234, nx.GetInt64()); EXPECT_TRUE(nx.IsInt()); EXPECT_TRUE(nx.IsInt64()); EXPECT_FALSE(nx.IsUint()); EXPECT_FALSE(nx.IsUint64()); // SetInt64() Value z; z.SetInt64(1234); EXPECT_EQ(1234, z.GetInt64()); z.SetInt64(2147483648u); // 2^31, cannot cast as int EXPECT_FALSE(z.IsInt()); EXPECT_TRUE(z.IsUint()); EXPECT_NEAR(2147483648.0, z.GetDouble(), 0.0); z.SetInt64(int64_t(4294967295u) + 1); // 2^32, cannot cast as uint EXPECT_FALSE(z.IsInt()); EXPECT_FALSE(z.IsUint()); EXPECT_NEAR(4294967296.0, z.GetDouble(), 0.0); z.SetInt64(-int64_t(2147483648u) - 1); // -2^31-1, cannot cast as int EXPECT_FALSE(z.IsInt()); EXPECT_NEAR(-2147483649.0, z.GetDouble(), 0.0); int64_t i = static_cast(RAPIDJSON_UINT64_C2(0x80000000, 00000000)); z.SetInt64(i); EXPECT_DOUBLE_EQ(-9223372036854775808.0, z.GetDouble()); // Templated functions EXPECT_TRUE(z.Is()); EXPECT_EQ(i, z.Get()); #if 0 // signed integer underflow is undefined behaviour EXPECT_EQ(i - 1, z.Set(i - 1).Get()); EXPECT_EQ(i - 2, z.Set(i - 2).Get()); #endif } TEST(Value, Uint64) { // Constructor with int Value x(uint64_t(1234)); EXPECT_EQ(kNumberType, x.GetType()); EXPECT_EQ(1234, x.GetInt()); EXPECT_EQ(1234u, x.GetUint()); EXPECT_EQ(1234, x.GetInt64()); EXPECT_EQ(1234u, x.GetUint64()); EXPECT_TRUE(x.IsNumber()); EXPECT_TRUE(x.IsInt()); EXPECT_TRUE(x.IsUint()); EXPECT_TRUE(x.IsInt64()); EXPECT_TRUE(x.IsUint64()); EXPECT_FALSE(x.IsDouble()); EXPECT_FALSE(x.IsFloat()); EXPECT_FALSE(x.IsNull()); EXPECT_FALSE(x.IsBool()); EXPECT_FALSE(x.IsFalse()); EXPECT_FALSE(x.IsTrue()); EXPECT_FALSE(x.IsString()); EXPECT_FALSE(x.IsObject()); EXPECT_FALSE(x.IsArray()); // SetUint64() Value z; z.SetUint64(1234); EXPECT_EQ(1234u, z.GetUint64()); z.SetUint64(uint64_t(2147483648u)); // 2^31, cannot cast as int EXPECT_FALSE(z.IsInt()); EXPECT_TRUE(z.IsUint()); EXPECT_TRUE(z.IsInt64()); z.SetUint64(uint64_t(4294967295u) + 1); // 2^32, cannot cast as uint EXPECT_FALSE(z.IsInt()); EXPECT_FALSE(z.IsUint()); EXPECT_TRUE(z.IsInt64()); uint64_t u = RAPIDJSON_UINT64_C2(0x80000000, 0x00000000); z.SetUint64(u); // 2^63 cannot cast as int64 EXPECT_FALSE(z.IsInt64()); EXPECT_EQ(u, z.GetUint64()); // Issue 48 EXPECT_DOUBLE_EQ(9223372036854775808.0, z.GetDouble()); // Templated functions EXPECT_TRUE(z.Is()); EXPECT_EQ(u, z.Get()); EXPECT_EQ(u + 1, z.Set(u + 1).Get()); EXPECT_EQ(u + 2, z.Set(u + 2).Get()); } TEST(Value, Double) { // Constructor with double Value x(12.34); EXPECT_EQ(kNumberType, x.GetType()); EXPECT_NEAR(12.34, x.GetDouble(), 0.0); EXPECT_TRUE(x.IsNumber()); EXPECT_TRUE(x.IsDouble()); EXPECT_FALSE(x.IsInt()); EXPECT_FALSE(x.IsNull()); EXPECT_FALSE(x.IsBool()); EXPECT_FALSE(x.IsFalse()); EXPECT_FALSE(x.IsTrue()); EXPECT_FALSE(x.IsString()); EXPECT_FALSE(x.IsObject()); EXPECT_FALSE(x.IsArray()); // SetDouble() Value z; z.SetDouble(12.34); EXPECT_NEAR(12.34, z.GetDouble(), 0.0); z = 56.78; EXPECT_NEAR(56.78, z.GetDouble(), 0.0); // Templated functions EXPECT_TRUE(z.Is()); EXPECT_EQ(56.78, z.Get()); EXPECT_EQ(57.78, z.Set(57.78).Get()); EXPECT_EQ(58.78, z.Set(58.78).Get()); } TEST(Value, Float) { // Constructor with double Value x(12.34f); EXPECT_EQ(kNumberType, x.GetType()); EXPECT_NEAR(12.34f, x.GetFloat(), 0.0); EXPECT_TRUE(x.IsNumber()); EXPECT_TRUE(x.IsDouble()); EXPECT_TRUE(x.IsFloat()); EXPECT_FALSE(x.IsInt()); EXPECT_FALSE(x.IsNull()); EXPECT_FALSE(x.IsBool()); EXPECT_FALSE(x.IsFalse()); EXPECT_FALSE(x.IsTrue()); EXPECT_FALSE(x.IsString()); EXPECT_FALSE(x.IsObject()); EXPECT_FALSE(x.IsArray()); // SetFloat() Value z; z.SetFloat(12.34f); EXPECT_NEAR(12.34f, z.GetFloat(), 0.0f); // Issue 573 z.SetInt(0); EXPECT_EQ(0.0f, z.GetFloat()); z = 56.78f; EXPECT_NEAR(56.78f, z.GetFloat(), 0.0f); // Templated functions EXPECT_TRUE(z.Is()); EXPECT_EQ(56.78f, z.Get()); EXPECT_EQ(57.78f, z.Set(57.78f).Get()); EXPECT_EQ(58.78f, z.Set(58.78f).Get()); } TEST(Value, IsLosslessDouble) { EXPECT_TRUE(Value(0.0).IsLosslessDouble()); EXPECT_TRUE(Value(12.34).IsLosslessDouble()); EXPECT_TRUE(Value(-123).IsLosslessDouble()); EXPECT_TRUE(Value(2147483648u).IsLosslessDouble()); EXPECT_TRUE(Value(-static_cast(RAPIDJSON_UINT64_C2(0x40000000, 0x00000000))).IsLosslessDouble()); #if !(defined(_MSC_VER) && _MSC_VER < 1800) // VC2010 has problem EXPECT_TRUE(Value(RAPIDJSON_UINT64_C2(0xA0000000, 0x00000000)).IsLosslessDouble()); #endif EXPECT_FALSE(Value(static_cast(RAPIDJSON_UINT64_C2(0x7FFFFFFF, 0xFFFFFFFF))).IsLosslessDouble()); // INT64_MAX EXPECT_FALSE(Value(-static_cast(RAPIDJSON_UINT64_C2(0x7FFFFFFF, 0xFFFFFFFF))).IsLosslessDouble()); // -INT64_MAX EXPECT_TRUE(Value(-static_cast(RAPIDJSON_UINT64_C2(0x7FFFFFFF, 0xFFFFFFFF)) - 1).IsLosslessDouble()); // INT64_MIN EXPECT_FALSE(Value(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF)).IsLosslessDouble()); // UINT64_MAX EXPECT_TRUE(Value(3.4028234e38f).IsLosslessDouble()); // FLT_MAX EXPECT_TRUE(Value(-3.4028234e38f).IsLosslessDouble()); // -FLT_MAX EXPECT_TRUE(Value(1.17549435e-38f).IsLosslessDouble()); // FLT_MIN EXPECT_TRUE(Value(-1.17549435e-38f).IsLosslessDouble()); // -FLT_MIN EXPECT_TRUE(Value(1.7976931348623157e+308).IsLosslessDouble()); // DBL_MAX EXPECT_TRUE(Value(-1.7976931348623157e+308).IsLosslessDouble()); // -DBL_MAX EXPECT_TRUE(Value(2.2250738585072014e-308).IsLosslessDouble()); // DBL_MIN EXPECT_TRUE(Value(-2.2250738585072014e-308).IsLosslessDouble()); // -DBL_MIN } TEST(Value, IsLosslessFloat) { EXPECT_TRUE(Value(12.25).IsLosslessFloat()); EXPECT_TRUE(Value(-123).IsLosslessFloat()); EXPECT_TRUE(Value(2147483648u).IsLosslessFloat()); EXPECT_TRUE(Value(3.4028234e38f).IsLosslessFloat()); EXPECT_TRUE(Value(-3.4028234e38f).IsLosslessFloat()); EXPECT_FALSE(Value(3.4028235e38).IsLosslessFloat()); EXPECT_FALSE(Value(0.3).IsLosslessFloat()); } TEST(Value, String) { // Construction with const string Value x("Hello", 5); // literal EXPECT_EQ(kStringType, x.GetType()); EXPECT_TRUE(x.IsString()); EXPECT_STREQ("Hello", x.GetString()); EXPECT_EQ(5u, x.GetStringLength()); EXPECT_FALSE(x.IsNumber()); EXPECT_FALSE(x.IsNull()); EXPECT_FALSE(x.IsBool()); EXPECT_FALSE(x.IsFalse()); EXPECT_FALSE(x.IsTrue()); EXPECT_FALSE(x.IsObject()); EXPECT_FALSE(x.IsArray()); static const char cstr[] = "World"; // const array Value(cstr).Swap(x); EXPECT_TRUE(x.IsString()); EXPECT_EQ(x.GetString(), cstr); EXPECT_EQ(x.GetStringLength(), sizeof(cstr)-1); static char mstr[] = "Howdy"; // non-const array // Value(mstr).Swap(x); // should not compile Value(StringRef(mstr)).Swap(x); EXPECT_TRUE(x.IsString()); EXPECT_EQ(x.GetString(), mstr); EXPECT_EQ(x.GetStringLength(), sizeof(mstr)-1); strncpy(mstr,"Hello", sizeof(mstr)); EXPECT_STREQ(x.GetString(), "Hello"); const char* pstr = cstr; //Value(pstr).Swap(x); // should not compile Value(StringRef(pstr)).Swap(x); EXPECT_TRUE(x.IsString()); EXPECT_EQ(x.GetString(), cstr); EXPECT_EQ(x.GetStringLength(), sizeof(cstr)-1); char* mpstr = mstr; Value(StringRef(mpstr,sizeof(mstr)-1)).Swap(x); EXPECT_TRUE(x.IsString()); EXPECT_EQ(x.GetString(), mstr); EXPECT_EQ(x.GetStringLength(), 5u); EXPECT_STREQ(x.GetString(), "Hello"); // Constructor with copy string MemoryPoolAllocator<> allocator; Value c(x.GetString(), x.GetStringLength(), allocator); EXPECT_NE(x.GetString(), c.GetString()); EXPECT_EQ(x.GetStringLength(), c.GetStringLength()); EXPECT_STREQ(x.GetString(), c.GetString()); //x.SetString("World"); x.SetString("World", 5); EXPECT_STREQ("Hello", c.GetString()); EXPECT_EQ(5u, c.GetStringLength()); // Constructor with type Value y(kStringType); EXPECT_TRUE(y.IsString()); EXPECT_STREQ("", y.GetString()); // Empty string should be "" instead of 0 (issue 226) EXPECT_EQ(0u, y.GetStringLength()); // SetConsttring() Value z; z.SetString("Hello"); EXPECT_TRUE(x.IsString()); z.SetString("Hello", 5); EXPECT_STREQ("Hello", z.GetString()); EXPECT_STREQ("Hello", z.GetString()); EXPECT_EQ(5u, z.GetStringLength()); z.SetString("Hello"); EXPECT_TRUE(z.IsString()); EXPECT_STREQ("Hello", z.GetString()); //z.SetString(mstr); // should not compile //z.SetString(pstr); // should not compile z.SetString(StringRef(mstr)); EXPECT_TRUE(z.IsString()); EXPECT_STREQ(z.GetString(), mstr); z.SetString(cstr); EXPECT_TRUE(z.IsString()); EXPECT_EQ(cstr, z.GetString()); z = cstr; EXPECT_TRUE(z.IsString()); EXPECT_EQ(cstr, z.GetString()); // SetString() char s[] = "World"; Value w; w.SetString(s, static_cast(strlen(s)), allocator); s[0] = '\0'; EXPECT_STREQ("World", w.GetString()); EXPECT_EQ(5u, w.GetStringLength()); // templated functions EXPECT_TRUE(z.Is()); EXPECT_STREQ(cstr, z.Get()); EXPECT_STREQ("Apple", z.Set("Apple").Get()); #if RAPIDJSON_HAS_STDSTRING { std::string str = "Hello World"; str[5] = '\0'; EXPECT_STREQ(str.data(),"Hello"); // embedded '\0' EXPECT_EQ(str.size(), 11u); // no copy Value vs0(StringRef(str)); EXPECT_TRUE(vs0.IsString()); EXPECT_EQ(vs0.GetString(), str.data()); EXPECT_EQ(vs0.GetStringLength(), str.size()); TestEqual(vs0, str); // do copy Value vs1(str, allocator); EXPECT_TRUE(vs1.IsString()); EXPECT_NE(vs1.GetString(), str.data()); EXPECT_NE(vs1.GetString(), str); // not equal due to embedded '\0' EXPECT_EQ(vs1.GetStringLength(), str.size()); TestEqual(vs1, str); // SetString str = "World"; vs0.SetNull().SetString(str, allocator); EXPECT_TRUE(vs0.IsString()); EXPECT_STREQ(vs0.GetString(), str.c_str()); EXPECT_EQ(vs0.GetStringLength(), str.size()); TestEqual(str, vs0); TestUnequal(str, vs1); // vs1 = str; // should not compile vs1 = StringRef(str); TestEqual(str, vs1); TestEqual(vs0, vs1); // Templated function. EXPECT_TRUE(vs0.Is()); EXPECT_EQ(str, vs0.Get()); vs0.Set(std::string("Apple"), allocator); EXPECT_EQ(std::string("Apple"), vs0.Get()); vs0.Set(std::string("Orange"), allocator); EXPECT_EQ(std::string("Orange"), vs0.Get()); } #endif // RAPIDJSON_HAS_STDSTRING } // Issue 226: Value of string type should not point to NULL TEST(Value, SetStringNull) { MemoryPoolAllocator<> allocator; const char* nullPtr = 0; { // Construction with string type creates empty string Value v(kStringType); EXPECT_NE(v.GetString(), nullPtr); // non-null string returned EXPECT_EQ(v.GetStringLength(), 0u); // Construction from/setting to null without length not allowed EXPECT_THROW(Value(StringRef(nullPtr)), AssertException); EXPECT_THROW(Value(StringRef(nullPtr), allocator), AssertException); EXPECT_THROW(v.SetString(nullPtr, allocator), AssertException); // Non-empty length with null string is not allowed EXPECT_THROW(v.SetString(nullPtr, 17u), AssertException); EXPECT_THROW(v.SetString(nullPtr, 42u, allocator), AssertException); // Setting to null string with empty length is allowed v.SetString(nullPtr, 0u); EXPECT_NE(v.GetString(), nullPtr); // non-null string returned EXPECT_EQ(v.GetStringLength(), 0u); v.SetNull(); v.SetString(nullPtr, 0u, allocator); EXPECT_NE(v.GetString(), nullPtr); // non-null string returned EXPECT_EQ(v.GetStringLength(), 0u); } // Construction with null string and empty length is allowed { Value v(nullPtr,0u); EXPECT_NE(v.GetString(), nullPtr); // non-null string returned EXPECT_EQ(v.GetStringLength(), 0u); } { Value v(nullPtr, 0u, allocator); EXPECT_NE(v.GetString(), nullPtr); // non-null string returned EXPECT_EQ(v.GetStringLength(), 0u); } } template static void TestArray(T& x, Allocator& allocator) { const T& y = x; // PushBack() Value v; x.PushBack(v, allocator); v.SetBool(true); x.PushBack(v, allocator); v.SetBool(false); x.PushBack(v, allocator); v.SetInt(123); x.PushBack(v, allocator); //x.PushBack((const char*)"foo", allocator); // should not compile x.PushBack("foo", allocator); EXPECT_FALSE(x.Empty()); EXPECT_EQ(5u, x.Size()); EXPECT_FALSE(y.Empty()); EXPECT_EQ(5u, y.Size()); EXPECT_TRUE(x[SizeType(0)].IsNull()); EXPECT_TRUE(x[1].IsTrue()); EXPECT_TRUE(x[2].IsFalse()); EXPECT_TRUE(x[3].IsInt()); EXPECT_EQ(123, x[3].GetInt()); EXPECT_TRUE(y[SizeType(0)].IsNull()); EXPECT_TRUE(y[1].IsTrue()); EXPECT_TRUE(y[2].IsFalse()); EXPECT_TRUE(y[3].IsInt()); EXPECT_EQ(123, y[3].GetInt()); EXPECT_TRUE(y[4].IsString()); EXPECT_STREQ("foo", y[4].GetString()); #if RAPIDJSON_HAS_CXX11_RVALUE_REFS // PushBack(GenericValue&&, Allocator&); { Value y2(kArrayType); y2.PushBack(Value(true), allocator); y2.PushBack(std::move(Value(kArrayType).PushBack(Value(1), allocator).PushBack("foo", allocator)), allocator); EXPECT_EQ(2u, y2.Size()); EXPECT_TRUE(y2[0].IsTrue()); EXPECT_TRUE(y2[1].IsArray()); EXPECT_EQ(2u, y2[1].Size()); EXPECT_TRUE(y2[1][0].IsInt()); EXPECT_TRUE(y2[1][1].IsString()); } #endif // iterator typename T::ValueIterator itr = x.Begin(); EXPECT_TRUE(itr != x.End()); EXPECT_TRUE(itr->IsNull()); ++itr; EXPECT_TRUE(itr != x.End()); EXPECT_TRUE(itr->IsTrue()); ++itr; EXPECT_TRUE(itr != x.End()); EXPECT_TRUE(itr->IsFalse()); ++itr; EXPECT_TRUE(itr != x.End()); EXPECT_TRUE(itr->IsInt()); EXPECT_EQ(123, itr->GetInt()); ++itr; EXPECT_TRUE(itr != x.End()); EXPECT_TRUE(itr->IsString()); EXPECT_STREQ("foo", itr->GetString()); // const iterator typename T::ConstValueIterator citr = y.Begin(); EXPECT_TRUE(citr != y.End()); EXPECT_TRUE(citr->IsNull()); ++citr; EXPECT_TRUE(citr != y.End()); EXPECT_TRUE(citr->IsTrue()); ++citr; EXPECT_TRUE(citr != y.End()); EXPECT_TRUE(citr->IsFalse()); ++citr; EXPECT_TRUE(citr != y.End()); EXPECT_TRUE(citr->IsInt()); EXPECT_EQ(123, citr->GetInt()); ++citr; EXPECT_TRUE(citr != y.End()); EXPECT_TRUE(citr->IsString()); EXPECT_STREQ("foo", citr->GetString()); // PopBack() x.PopBack(); EXPECT_EQ(4u, x.Size()); EXPECT_TRUE(y[SizeType(0)].IsNull()); EXPECT_TRUE(y[1].IsTrue()); EXPECT_TRUE(y[2].IsFalse()); EXPECT_TRUE(y[3].IsInt()); // Clear() x.Clear(); EXPECT_TRUE(x.Empty()); EXPECT_EQ(0u, x.Size()); EXPECT_TRUE(y.Empty()); EXPECT_EQ(0u, y.Size()); // Erase(ValueIterator) // Use array of array to ensure removed elements' destructor is called. // [[0],[1],[2],...] for (int i = 0; i < 10; i++) x.PushBack(Value(kArrayType).PushBack(i, allocator).Move(), allocator); // Erase the first itr = x.Erase(x.Begin()); EXPECT_EQ(x.Begin(), itr); EXPECT_EQ(9u, x.Size()); for (int i = 0; i < 9; i++) EXPECT_EQ(i + 1, x[static_cast(i)][0].GetInt()); // Ease the last itr = x.Erase(x.End() - 1); EXPECT_EQ(x.End(), itr); EXPECT_EQ(8u, x.Size()); for (int i = 0; i < 8; i++) EXPECT_EQ(i + 1, x[static_cast(i)][0].GetInt()); // Erase the middle itr = x.Erase(x.Begin() + 4); EXPECT_EQ(x.Begin() + 4, itr); EXPECT_EQ(7u, x.Size()); for (int i = 0; i < 4; i++) EXPECT_EQ(i + 1, x[static_cast(i)][0].GetInt()); for (int i = 4; i < 7; i++) EXPECT_EQ(i + 2, x[static_cast(i)][0].GetInt()); // Erase(ValueIterator, ValueIterator) // Exhaustive test with all 0 <= first < n, first <= last <= n cases const unsigned n = 10; for (unsigned first = 0; first < n; first++) { for (unsigned last = first; last <= n; last++) { x.Clear(); for (unsigned i = 0; i < n; i++) x.PushBack(Value(kArrayType).PushBack(i, allocator).Move(), allocator); itr = x.Erase(x.Begin() + first, x.Begin() + last); if (last == n) EXPECT_EQ(x.End(), itr); else EXPECT_EQ(x.Begin() + first, itr); size_t removeCount = last - first; EXPECT_EQ(n - removeCount, x.Size()); for (unsigned i = 0; i < first; i++) EXPECT_EQ(i, x[i][0].GetUint()); for (unsigned i = first; i < n - removeCount; i++) EXPECT_EQ(i + removeCount, x[static_cast(i)][0].GetUint()); } } } TEST(Value, Array) { Value::AllocatorType allocator; Value x(kArrayType); const Value& y = x; EXPECT_EQ(kArrayType, x.GetType()); EXPECT_TRUE(x.IsArray()); EXPECT_TRUE(x.Empty()); EXPECT_EQ(0u, x.Size()); EXPECT_TRUE(y.IsArray()); EXPECT_TRUE(y.Empty()); EXPECT_EQ(0u, y.Size()); EXPECT_FALSE(x.IsNull()); EXPECT_FALSE(x.IsBool()); EXPECT_FALSE(x.IsFalse()); EXPECT_FALSE(x.IsTrue()); EXPECT_FALSE(x.IsString()); EXPECT_FALSE(x.IsObject()); TestArray(x, allocator); // Working in gcc without C++11, but VS2013 cannot compile. To be diagnosed. // http://en.wikipedia.org/wiki/Erase-remove_idiom x.Clear(); for (int i = 0; i < 10; i++) if (i % 2 == 0) x.PushBack(i, allocator); else x.PushBack(Value(kNullType).Move(), allocator); const Value null(kNullType); x.Erase(std::remove(x.Begin(), x.End(), null), x.End()); EXPECT_EQ(5u, x.Size()); for (int i = 0; i < 5; i++) EXPECT_EQ(i * 2, x[static_cast(i)]); // SetArray() Value z; z.SetArray(); EXPECT_TRUE(z.IsArray()); EXPECT_TRUE(z.Empty()); // PR #1503: assign from inner Value { CrtAllocator a; // Free() is not a noop GenericValue, CrtAllocator> nullValue; GenericValue, CrtAllocator> arrayValue(kArrayType); arrayValue.PushBack(nullValue, a); arrayValue = arrayValue[0]; // shouldn't crash (use after free) EXPECT_TRUE(arrayValue.IsNull()); } } TEST(Value, ArrayHelper) { Value::AllocatorType allocator; { Value x(kArrayType); Value::Array a = x.GetArray(); TestArray(a, allocator); } { Value x(kArrayType); Value::Array a = x.GetArray(); a.PushBack(1, allocator); Value::Array a2(a); // copy constructor EXPECT_EQ(1u, a2.Size()); Value::Array a3 = a; EXPECT_EQ(1u, a3.Size()); Value::ConstArray y = static_cast(x).GetArray(); (void)y; // y.PushBack(1, allocator); // should not compile // Templated functions x.Clear(); EXPECT_TRUE(x.Is()); EXPECT_TRUE(x.Is()); a.PushBack(1, allocator); EXPECT_EQ(1, x.Get()[0].GetInt()); EXPECT_EQ(1, x.Get()[0].GetInt()); Value x2; x2.Set(a); EXPECT_TRUE(x.IsArray()); // IsArray() is invariant after moving. EXPECT_EQ(1, x2.Get()[0].GetInt()); } { Value y(kArrayType); y.PushBack(123, allocator); Value x(y.GetArray()); // Construct value form array. EXPECT_TRUE(x.IsArray()); EXPECT_EQ(123, x[0].GetInt()); EXPECT_TRUE(y.IsArray()); // Invariant EXPECT_TRUE(y.Empty()); } { Value x(kArrayType); Value y(kArrayType); y.PushBack(123, allocator); x.PushBack(y.GetArray(), allocator); // Implicit constructor to convert Array to GenericValue EXPECT_EQ(1u, x.Size()); EXPECT_EQ(123, x[0][0].GetInt()); EXPECT_TRUE(y.IsArray()); EXPECT_TRUE(y.Empty()); } } #if RAPIDJSON_HAS_CXX11_RANGE_FOR TEST(Value, ArrayHelperRangeFor) { Value::AllocatorType allocator; Value x(kArrayType); for (int i = 0; i < 10; i++) x.PushBack(i, allocator); { int i = 0; for (auto& v : x.GetArray()) { EXPECT_EQ(i, v.GetInt()); i++; } EXPECT_EQ(i, 10); } { int i = 0; for (const auto& v : const_cast(x).GetArray()) { EXPECT_EQ(i, v.GetInt()); i++; } EXPECT_EQ(i, 10); } // Array a = x.GetArray(); // Array ca = const_cast(x).GetArray(); } #endif template static void TestObject(T& x, Allocator& allocator) { const T& y = x; // const version // AddMember() x.AddMember("A", "Apple", allocator); EXPECT_FALSE(x.ObjectEmpty()); EXPECT_EQ(1u, x.MemberCount()); Value value("Banana", 6); x.AddMember("B", "Banana", allocator); EXPECT_EQ(2u, x.MemberCount()); // AddMember(StringRefType, T, Allocator) { Value o(kObjectType); o.AddMember("true", true, allocator); o.AddMember("false", false, allocator); o.AddMember("int", -1, allocator); o.AddMember("uint", 1u, allocator); o.AddMember("int64", int64_t(-4294967296), allocator); o.AddMember("uint64", uint64_t(4294967296), allocator); o.AddMember("double", 3.14, allocator); o.AddMember("string", "Jelly", allocator); EXPECT_TRUE(o["true"].GetBool()); EXPECT_FALSE(o["false"].GetBool()); EXPECT_EQ(-1, o["int"].GetInt()); EXPECT_EQ(1u, o["uint"].GetUint()); EXPECT_EQ(int64_t(-4294967296), o["int64"].GetInt64()); EXPECT_EQ(uint64_t(4294967296), o["uint64"].GetUint64()); EXPECT_STREQ("Jelly",o["string"].GetString()); EXPECT_EQ(8u, o.MemberCount()); } // AddMember(Value&, T, Allocator) { Value o(kObjectType); Value n("s"); o.AddMember(n, "string", allocator); EXPECT_EQ(1u, o.MemberCount()); Value count("#"); o.AddMember(count, o.MemberCount(), allocator); EXPECT_EQ(2u, o.MemberCount()); } #if RAPIDJSON_HAS_STDSTRING { // AddMember(StringRefType, const std::string&, Allocator) Value o(kObjectType); o.AddMember("b", std::string("Banana"), allocator); EXPECT_STREQ("Banana", o["b"].GetString()); // RemoveMember(const std::string&) o.RemoveMember(std::string("b")); EXPECT_TRUE(o.ObjectEmpty()); } #endif #if RAPIDJSON_HAS_CXX11_RVALUE_REFS // AddMember(GenericValue&&, ...) variants { Value o(kObjectType); o.AddMember(Value("true"), Value(true), allocator); o.AddMember(Value("false"), Value(false).Move(), allocator); // value is lvalue ref o.AddMember(Value("int").Move(), Value(-1), allocator); // name is lvalue ref o.AddMember("uint", std::move(Value().SetUint(1u)), allocator); // name is literal, value is rvalue EXPECT_TRUE(o["true"].GetBool()); EXPECT_FALSE(o["false"].GetBool()); EXPECT_EQ(-1, o["int"].GetInt()); EXPECT_EQ(1u, o["uint"].GetUint()); EXPECT_EQ(4u, o.MemberCount()); } #endif // Tests a member with null character Value name; const Value C0D("C\0D", 3); name.SetString(C0D.GetString(), 3); value.SetString("CherryD", 7); x.AddMember(name, value, allocator); // HasMember() EXPECT_TRUE(x.HasMember("A")); EXPECT_TRUE(x.HasMember("B")); EXPECT_TRUE(y.HasMember("A")); EXPECT_TRUE(y.HasMember("B")); #if RAPIDJSON_HAS_STDSTRING EXPECT_TRUE(x.HasMember(std::string("A"))); #endif name.SetString("C\0D"); EXPECT_TRUE(x.HasMember(name)); EXPECT_TRUE(y.HasMember(name)); GenericValue, CrtAllocator> othername("A"); EXPECT_TRUE(x.HasMember(othername)); EXPECT_TRUE(y.HasMember(othername)); othername.SetString("C\0D"); EXPECT_TRUE(x.HasMember(othername)); EXPECT_TRUE(y.HasMember(othername)); // operator[] EXPECT_STREQ("Apple", x["A"].GetString()); EXPECT_STREQ("Banana", x["B"].GetString()); EXPECT_STREQ("CherryD", x[C0D].GetString()); EXPECT_STREQ("CherryD", x[othername].GetString()); EXPECT_THROW(x["nonexist"], AssertException); // const operator[] EXPECT_STREQ("Apple", y["A"].GetString()); EXPECT_STREQ("Banana", y["B"].GetString()); EXPECT_STREQ("CherryD", y[C0D].GetString()); #if RAPIDJSON_HAS_STDSTRING EXPECT_STREQ("Apple", x["A"].GetString()); EXPECT_STREQ("Apple", y[std::string("A")].GetString()); #endif // member iterator Value::MemberIterator itr = x.MemberBegin(); EXPECT_TRUE(itr != x.MemberEnd()); EXPECT_STREQ("A", itr->name.GetString()); EXPECT_STREQ("Apple", itr->value.GetString()); ++itr; EXPECT_TRUE(itr != x.MemberEnd()); EXPECT_STREQ("B", itr->name.GetString()); EXPECT_STREQ("Banana", itr->value.GetString()); ++itr; EXPECT_TRUE(itr != x.MemberEnd()); EXPECT_TRUE(memcmp(itr->name.GetString(), "C\0D", 4) == 0); EXPECT_STREQ("CherryD", itr->value.GetString()); ++itr; EXPECT_FALSE(itr != x.MemberEnd()); // const member iterator Value::ConstMemberIterator citr = y.MemberBegin(); EXPECT_TRUE(citr != y.MemberEnd()); EXPECT_STREQ("A", citr->name.GetString()); EXPECT_STREQ("Apple", citr->value.GetString()); ++citr; EXPECT_TRUE(citr != y.MemberEnd()); EXPECT_STREQ("B", citr->name.GetString()); EXPECT_STREQ("Banana", citr->value.GetString()); ++citr; EXPECT_TRUE(citr != y.MemberEnd()); EXPECT_TRUE(memcmp(citr->name.GetString(), "C\0D", 4) == 0); EXPECT_STREQ("CherryD", citr->value.GetString()); ++citr; EXPECT_FALSE(citr != y.MemberEnd()); // member iterator conversions/relations itr = x.MemberBegin(); citr = x.MemberBegin(); // const conversion TestEqual(itr, citr); EXPECT_TRUE(itr < x.MemberEnd()); EXPECT_FALSE(itr > y.MemberEnd()); EXPECT_TRUE(citr < x.MemberEnd()); EXPECT_FALSE(citr > y.MemberEnd()); ++citr; TestUnequal(itr, citr); EXPECT_FALSE(itr < itr); EXPECT_TRUE(itr < citr); EXPECT_FALSE(itr > itr); EXPECT_TRUE(citr > itr); EXPECT_EQ(1, citr - x.MemberBegin()); EXPECT_EQ(0, itr - y.MemberBegin()); itr += citr - x.MemberBegin(); EXPECT_EQ(1, itr - y.MemberBegin()); TestEqual(citr, itr); EXPECT_TRUE(itr <= citr); EXPECT_TRUE(citr <= itr); itr++; EXPECT_TRUE(itr >= citr); EXPECT_FALSE(citr >= itr); // RemoveMember() EXPECT_TRUE(x.RemoveMember("A")); EXPECT_FALSE(x.HasMember("A")); EXPECT_TRUE(x.RemoveMember("B")); EXPECT_FALSE(x.HasMember("B")); EXPECT_FALSE(x.RemoveMember("nonexist")); EXPECT_TRUE(x.RemoveMember(othername)); EXPECT_FALSE(x.HasMember(name)); EXPECT_TRUE(x.MemberBegin() == x.MemberEnd()); // EraseMember(ConstMemberIterator) // Use array members to ensure removed elements' destructor is called. // { "a": [0], "b": [1],[2],...] const char keys[][2] = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" }; for (int i = 0; i < 10; i++) x.AddMember(keys[i], Value(kArrayType).PushBack(i, allocator), allocator); // MemberCount, iterator difference EXPECT_EQ(x.MemberCount(), SizeType(x.MemberEnd() - x.MemberBegin())); // Erase the first itr = x.EraseMember(x.MemberBegin()); EXPECT_FALSE(x.HasMember(keys[0])); EXPECT_EQ(x.MemberBegin(), itr); EXPECT_EQ(9u, x.MemberCount()); for (; itr != x.MemberEnd(); ++itr) { size_t i = static_cast((itr - x.MemberBegin())) + 1; EXPECT_STREQ(itr->name.GetString(), keys[i]); EXPECT_EQ(static_cast(i), itr->value[0].GetInt()); } // Erase the last itr = x.EraseMember(x.MemberEnd() - 1); EXPECT_FALSE(x.HasMember(keys[9])); EXPECT_EQ(x.MemberEnd(), itr); EXPECT_EQ(8u, x.MemberCount()); for (; itr != x.MemberEnd(); ++itr) { size_t i = static_cast(itr - x.MemberBegin()) + 1; EXPECT_STREQ(itr->name.GetString(), keys[i]); EXPECT_EQ(static_cast(i), itr->value[0].GetInt()); } // Erase the middle itr = x.EraseMember(x.MemberBegin() + 4); EXPECT_FALSE(x.HasMember(keys[5])); EXPECT_EQ(x.MemberBegin() + 4, itr); EXPECT_EQ(7u, x.MemberCount()); for (; itr != x.MemberEnd(); ++itr) { size_t i = static_cast(itr - x.MemberBegin()); i += (i < 4) ? 1 : 2; EXPECT_STREQ(itr->name.GetString(), keys[i]); EXPECT_EQ(static_cast(i), itr->value[0].GetInt()); } // EraseMember(ConstMemberIterator, ConstMemberIterator) // Exhaustive test with all 0 <= first < n, first <= last <= n cases const unsigned n = 10; for (unsigned first = 0; first < n; first++) { for (unsigned last = first; last <= n; last++) { x.RemoveAllMembers(); for (unsigned i = 0; i < n; i++) x.AddMember(keys[i], Value(kArrayType).PushBack(i, allocator), allocator); itr = x.EraseMember(x.MemberBegin() + static_cast(first), x.MemberBegin() + static_cast(last)); if (last == n) EXPECT_EQ(x.MemberEnd(), itr); else EXPECT_EQ(x.MemberBegin() + static_cast(first), itr); size_t removeCount = last - first; EXPECT_EQ(n - removeCount, x.MemberCount()); for (unsigned i = 0; i < first; i++) EXPECT_EQ(i, x[keys[i]][0].GetUint()); for (unsigned i = first; i < n - removeCount; i++) EXPECT_EQ(i + removeCount, x[keys[i+removeCount]][0].GetUint()); } } // RemoveAllMembers() x.RemoveAllMembers(); EXPECT_TRUE(x.ObjectEmpty()); EXPECT_EQ(0u, x.MemberCount()); } TEST(Value, Object) { Value::AllocatorType allocator; Value x(kObjectType); const Value& y = x; // const version EXPECT_EQ(kObjectType, x.GetType()); EXPECT_TRUE(x.IsObject()); EXPECT_TRUE(x.ObjectEmpty()); EXPECT_EQ(0u, x.MemberCount()); EXPECT_EQ(kObjectType, y.GetType()); EXPECT_TRUE(y.IsObject()); EXPECT_TRUE(y.ObjectEmpty()); EXPECT_EQ(0u, y.MemberCount()); TestObject(x, allocator); // SetObject() Value z; z.SetObject(); EXPECT_TRUE(z.IsObject()); } TEST(Value, ObjectHelper) { Value::AllocatorType allocator; { Value x(kObjectType); Value::Object o = x.GetObject(); TestObject(o, allocator); } { Value x(kObjectType); Value::Object o = x.GetObject(); o.AddMember("1", 1, allocator); Value::Object o2(o); // copy constructor EXPECT_EQ(1u, o2.MemberCount()); Value::Object o3 = o; EXPECT_EQ(1u, o3.MemberCount()); Value::ConstObject y = static_cast(x).GetObject(); (void)y; // y.AddMember("1", 1, allocator); // should not compile // Templated functions x.RemoveAllMembers(); EXPECT_TRUE(x.Is()); EXPECT_TRUE(x.Is()); o.AddMember("1", 1, allocator); EXPECT_EQ(1, x.Get()["1"].GetInt()); EXPECT_EQ(1, x.Get()["1"].GetInt()); Value x2; x2.Set(o); EXPECT_TRUE(x.IsObject()); // IsObject() is invariant after moving EXPECT_EQ(1, x2.Get()["1"].GetInt()); } { Value x(kObjectType); x.AddMember("a", "apple", allocator); Value y(x.GetObject()); EXPECT_STREQ("apple", y["a"].GetString()); EXPECT_TRUE(x.IsObject()); // Invariant } { Value x(kObjectType); x.AddMember("a", "apple", allocator); Value y(kObjectType); y.AddMember("fruits", x.GetObject(), allocator); EXPECT_STREQ("apple", y["fruits"]["a"].GetString()); EXPECT_TRUE(x.IsObject()); // Invariant } } #if RAPIDJSON_HAS_CXX11_RANGE_FOR TEST(Value, ObjectHelperRangeFor) { Value::AllocatorType allocator; Value x(kObjectType); for (int i = 0; i < 10; i++) { char name[10]; Value n(name, static_cast(sprintf(name, "%d", i)), allocator); x.AddMember(n, i, allocator); } { int i = 0; for (auto& m : x.GetObject()) { char name[11]; sprintf(name, "%d", i); EXPECT_STREQ(name, m.name.GetString()); EXPECT_EQ(i, m.value.GetInt()); i++; } EXPECT_EQ(i, 10); } { int i = 0; for (const auto& m : const_cast(x).GetObject()) { char name[11]; sprintf(name, "%d", i); EXPECT_STREQ(name, m.name.GetString()); EXPECT_EQ(i, m.value.GetInt()); i++; } EXPECT_EQ(i, 10); } // Object a = x.GetObject(); // Object ca = const_cast(x).GetObject(); } #endif TEST(Value, EraseMember_String) { Value::AllocatorType allocator; Value x(kObjectType); x.AddMember("A", "Apple", allocator); x.AddMember("B", "Banana", allocator); EXPECT_TRUE(x.EraseMember("B")); EXPECT_FALSE(x.HasMember("B")); EXPECT_FALSE(x.EraseMember("nonexist")); GenericValue, CrtAllocator> othername("A"); EXPECT_TRUE(x.EraseMember(othername)); EXPECT_FALSE(x.HasMember("A")); EXPECT_TRUE(x.MemberBegin() == x.MemberEnd()); } TEST(Value, BigNestedArray) { MemoryPoolAllocator<> allocator; Value x(kArrayType); static const SizeType n = 200; for (SizeType i = 0; i < n; i++) { Value y(kArrayType); for (SizeType j = 0; j < n; j++) { Value number(static_cast(i * n + j)); y.PushBack(number, allocator); } x.PushBack(y, allocator); } for (SizeType i = 0; i < n; i++) for (SizeType j = 0; j < n; j++) { EXPECT_TRUE(x[i][j].IsInt()); EXPECT_EQ(static_cast(i * n + j), x[i][j].GetInt()); } } TEST(Value, BigNestedObject) { MemoryPoolAllocator<> allocator; Value x(kObjectType); static const SizeType n = 200; for (SizeType i = 0; i < n; i++) { char name1[10]; sprintf(name1, "%d", i); // Value name(name1); // should not compile Value name(name1, static_cast(strlen(name1)), allocator); Value object(kObjectType); for (SizeType j = 0; j < n; j++) { char name2[10]; sprintf(name2, "%d", j); Value name3(name2, static_cast(strlen(name2)), allocator); Value number(static_cast(i * n + j)); object.AddMember(name3, number, allocator); } // x.AddMember(name1, object, allocator); // should not compile x.AddMember(name, object, allocator); } for (SizeType i = 0; i < n; i++) { char name1[10]; sprintf(name1, "%d", i); for (SizeType j = 0; j < n; j++) { char name2[10]; sprintf(name2, "%d", j); x[name1]; EXPECT_EQ(static_cast(i * n + j), x[name1][name2].GetInt()); } } } // Issue 18: Error removing last element of object // http://code.google.com/p/rapidjson/issues/detail?id=18 TEST(Value, RemoveLastElement) { rapidjson::Document doc; rapidjson::Document::AllocatorType& allocator = doc.GetAllocator(); rapidjson::Value objVal(rapidjson::kObjectType); objVal.AddMember("var1", 123, allocator); objVal.AddMember("var2", "444", allocator); objVal.AddMember("var3", 555, allocator); EXPECT_TRUE(objVal.HasMember("var3")); objVal.RemoveMember("var3"); // Assertion here in r61 EXPECT_FALSE(objVal.HasMember("var3")); } // Issue 38: Segmentation fault with CrtAllocator TEST(Document, CrtAllocator) { typedef GenericValue, CrtAllocator> V; V::AllocatorType allocator; V o(kObjectType); o.AddMember("x", 1, allocator); // Should not call destructor on uninitialized name/value of newly allocated members. V a(kArrayType); a.PushBack(1, allocator); // Should not call destructor on uninitialized Value of newly allocated elements. } static void TestShortStringOptimization(const char* str) { const rapidjson::SizeType len = static_cast(strlen(str)); rapidjson::Document doc; rapidjson::Value val; val.SetString(str, len, doc.GetAllocator()); EXPECT_EQ(val.GetStringLength(), len); EXPECT_STREQ(val.GetString(), str); } TEST(Value, AllocateShortString) { TestShortStringOptimization(""); // edge case: empty string TestShortStringOptimization("12345678"); // regular case for short strings: 8 chars TestShortStringOptimization("12345678901"); // edge case: 11 chars in 32-bit mode (=> short string) TestShortStringOptimization("123456789012"); // edge case: 12 chars in 32-bit mode (=> regular string) TestShortStringOptimization("123456789012345"); // edge case: 15 chars in 64-bit mode (=> short string) TestShortStringOptimization("1234567890123456"); // edge case: 16 chars in 64-bit mode (=> regular string) } template struct TerminateHandler { bool Null() { return e != 0; } bool Bool(bool) { return e != 1; } bool Int(int) { return e != 2; } bool Uint(unsigned) { return e != 3; } bool Int64(int64_t) { return e != 4; } bool Uint64(uint64_t) { return e != 5; } bool Double(double) { return e != 6; } bool RawNumber(const char*, SizeType, bool) { return e != 7; } bool String(const char*, SizeType, bool) { return e != 8; } bool StartObject() { return e != 9; } bool Key(const char*, SizeType, bool) { return e != 10; } bool EndObject(SizeType) { return e != 11; } bool StartArray() { return e != 12; } bool EndArray(SizeType) { return e != 13; } }; #define TEST_TERMINATION(e, json)\ {\ Document d; \ EXPECT_FALSE(d.Parse(json).HasParseError()); \ Reader reader; \ TerminateHandler h;\ EXPECT_FALSE(d.Accept(h));\ } TEST(Value, AcceptTerminationByHandler) { TEST_TERMINATION(0, "[null]"); TEST_TERMINATION(1, "[true]"); TEST_TERMINATION(1, "[false]"); TEST_TERMINATION(2, "[-1]"); TEST_TERMINATION(3, "[2147483648]"); TEST_TERMINATION(4, "[-1234567890123456789]"); TEST_TERMINATION(5, "[9223372036854775808]"); TEST_TERMINATION(6, "[0.5]"); // RawNumber() is never called TEST_TERMINATION(8, "[\"a\"]"); TEST_TERMINATION(9, "[{}]"); TEST_TERMINATION(10, "[{\"a\":1}]"); TEST_TERMINATION(11, "[{}]"); TEST_TERMINATION(12, "{\"a\":[]}"); TEST_TERMINATION(13, "{\"a\":[]}"); } struct ValueIntComparer { bool operator()(const Value& lhs, const Value& rhs) const { return lhs.GetInt() < rhs.GetInt(); } }; #if RAPIDJSON_HAS_CXX11_RVALUE_REFS TEST(Value, Sorting) { Value::AllocatorType allocator; Value a(kArrayType); a.PushBack(5, allocator); a.PushBack(1, allocator); a.PushBack(3, allocator); std::sort(a.Begin(), a.End(), ValueIntComparer()); EXPECT_EQ(1, a[0].GetInt()); EXPECT_EQ(3, a[1].GetInt()); EXPECT_EQ(5, a[2].GetInt()); } #endif // http://stackoverflow.com/questions/35222230/ static void MergeDuplicateKey(Value& v, Value::AllocatorType& a) { if (v.IsObject()) { // Convert all key:value into key:[value] for (Value::MemberIterator itr = v.MemberBegin(); itr != v.MemberEnd(); ++itr) itr->value = Value(kArrayType).Move().PushBack(itr->value, a); // Merge arrays if key is duplicated for (Value::MemberIterator itr = v.MemberBegin(); itr != v.MemberEnd();) { Value::MemberIterator itr2 = v.FindMember(itr->name); if (itr != itr2) { itr2->value.PushBack(itr->value[0], a); itr = v.EraseMember(itr); } else ++itr; } // Convert key:[values] back to key:value if there is only one value for (Value::MemberIterator itr = v.MemberBegin(); itr != v.MemberEnd(); ++itr) { if (itr->value.Size() == 1) itr->value = itr->value[0]; MergeDuplicateKey(itr->value, a); // Recursion on the value } } else if (v.IsArray()) for (Value::ValueIterator itr = v.Begin(); itr != v.End(); ++itr) MergeDuplicateKey(*itr, a); } TEST(Value, MergeDuplicateKey) { Document d; d.Parse( "{" " \"key1\": {" " \"a\": \"asdf\"," " \"b\": \"foo\"," " \"b\": \"bar\"," " \"c\": \"fdas\"" " }" "}"); Document d2; d2.Parse( "{" " \"key1\": {" " \"a\": \"asdf\"," " \"b\": [" " \"foo\"," " \"bar\"" " ]," " \"c\": \"fdas\"" " }" "}"); EXPECT_NE(d2, d); MergeDuplicateKey(d, d.GetAllocator()); EXPECT_EQ(d2, d); } #ifdef __clang__ RAPIDJSON_DIAG_POP #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/bigintegertest.cpp0000644000000000000000000001050015031566105026266 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/internal/biginteger.h" using namespace rapidjson::internal; #define BIGINTEGER_LITERAL(s) BigInteger(s, sizeof(s) - 1) static const BigInteger kZero(0); static const BigInteger kOne(1); static const BigInteger kUint64Max = BIGINTEGER_LITERAL("18446744073709551615"); static const BigInteger kTwo64 = BIGINTEGER_LITERAL("18446744073709551616"); TEST(BigInteger, Constructor) { EXPECT_TRUE(kZero.IsZero()); EXPECT_TRUE(kZero == kZero); EXPECT_TRUE(kZero == BIGINTEGER_LITERAL("0")); EXPECT_TRUE(kZero == BIGINTEGER_LITERAL("00")); const BigInteger a(123); EXPECT_TRUE(a == a); EXPECT_TRUE(a == BIGINTEGER_LITERAL("123")); EXPECT_TRUE(a == BIGINTEGER_LITERAL("0123")); EXPECT_EQ(2u, kTwo64.GetCount()); EXPECT_EQ(0u, kTwo64.GetDigit(0)); EXPECT_EQ(1u, kTwo64.GetDigit(1)); } TEST(BigInteger, AddUint64) { BigInteger a = kZero; a += 0u; EXPECT_TRUE(kZero == a); a += 1u; EXPECT_TRUE(kOne == a); a += 1u; EXPECT_TRUE(BigInteger(2) == a); EXPECT_TRUE(BigInteger(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF)) == kUint64Max); BigInteger b = kUint64Max; b += 1u; EXPECT_TRUE(kTwo64 == b); b += RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF); EXPECT_TRUE(BIGINTEGER_LITERAL("36893488147419103231") == b); } TEST(BigInteger, MultiplyUint64) { BigInteger a = kZero; a *= static_cast (0); EXPECT_TRUE(kZero == a); a *= static_cast (123); EXPECT_TRUE(kZero == a); BigInteger b = kOne; b *= static_cast(1); EXPECT_TRUE(kOne == b); b *= static_cast(0); EXPECT_TRUE(kZero == b); BigInteger c(123); c *= static_cast(456u); EXPECT_TRUE(BigInteger(123u * 456u) == c); c *= RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF); EXPECT_TRUE(BIGINTEGER_LITERAL("1034640981606221330982120") == c); c *= RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF); EXPECT_TRUE(BIGINTEGER_LITERAL("19085757395861596536664473018420572782123800") == c); } TEST(BigInteger, MultiplyUint32) { BigInteger a = kZero; a *= static_cast (0); EXPECT_TRUE(kZero == a); a *= static_cast (123); EXPECT_TRUE(kZero == a); BigInteger b = kOne; b *= static_cast(1); EXPECT_TRUE(kOne == b); b *= static_cast(0); EXPECT_TRUE(kZero == b); BigInteger c(123); c *= static_cast(456u); EXPECT_TRUE(BigInteger(123u * 456u) == c); c *= 0xFFFFFFFFu; EXPECT_TRUE(BIGINTEGER_LITERAL("240896125641960") == c); c *= 0xFFFFFFFFu; EXPECT_TRUE(BIGINTEGER_LITERAL("1034640981124429079698200") == c); } TEST(BigInteger, LeftShift) { BigInteger a = kZero; a <<= 1; EXPECT_TRUE(kZero == a); a <<= 64; EXPECT_TRUE(kZero == a); a = BigInteger(123); a <<= 0; EXPECT_TRUE(BigInteger(123) == a); a <<= 1; EXPECT_TRUE(BigInteger(246) == a); a <<= 64; EXPECT_TRUE(BIGINTEGER_LITERAL("4537899042132549697536") == a); a <<= 99; EXPECT_TRUE(BIGINTEGER_LITERAL("2876235222267216943024851750785644982682875244576768") == a); a = 1; a <<= 64; // a.count_ != 1 a <<= 256; // interShift == 0 EXPECT_TRUE(BIGINTEGER_LITERAL("2135987035920910082395021706169552114602704522356652769947041607822219725780640550022962086936576") == a); } TEST(BigInteger, Compare) { EXPECT_EQ(0, kZero.Compare(kZero)); EXPECT_EQ(1, kOne.Compare(kZero)); EXPECT_EQ(-1, kZero.Compare(kOne)); EXPECT_EQ(0, kUint64Max.Compare(kUint64Max)); EXPECT_EQ(0, kTwo64.Compare(kTwo64)); EXPECT_EQ(-1, kUint64Max.Compare(kTwo64)); EXPECT_EQ(1, kTwo64.Compare(kUint64Max)); } asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/unittest.h0000644000000000000000000000757715031566105024617 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef UNITTEST_H_ #define UNITTEST_H_ // gtest indirectly included inttypes.h, without __STDC_CONSTANT_MACROS. #ifndef __STDC_CONSTANT_MACROS #ifdef __clang__ #pragma GCC diagnostic push #if __has_warning("-Wreserved-id-macro") #pragma GCC diagnostic ignored "-Wreserved-id-macro" #endif #endif # define __STDC_CONSTANT_MACROS 1 // required by C++ standard #ifdef __clang__ #pragma GCC diagnostic pop #endif #endif #ifdef _MSC_VER #define _CRTDBG_MAP_ALLOC #include #pragma warning(disable : 4996) // 'function': was declared deprecated #endif #if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) #if defined(__clang__) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #pragma GCC diagnostic push #endif #pragma GCC diagnostic ignored "-Weffc++" #endif #include "gtest/gtest.h" #include #if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #pragma GCC diagnostic pop #endif #ifdef __clang__ // All TEST() macro generated this warning, disable globally #pragma GCC diagnostic ignored "-Wglobal-constructors" #endif template inline unsigned StrLen(const Ch* s) { const Ch* p = s; while (*p) p++; return unsigned(p - s); } template inline int StrCmp(const Ch* s1, const Ch* s2) { while(*s1 && (*s1 == *s2)) { s1++; s2++; } return static_cast(*s1) < static_cast(*s2) ? -1 : static_cast(*s1) > static_cast(*s2); } template inline Ch* StrDup(const Ch* str) { size_t bufferSize = sizeof(Ch) * (StrLen(str) + 1); Ch* buffer = static_cast(malloc(bufferSize)); memcpy(buffer, str, bufferSize); return buffer; } inline FILE* TempFile(char *filename) { #if defined(__WIN32__) || defined(_MSC_VER) filename = tmpnam(filename); // For Visual Studio, tmpnam() adds a backslash in front. Remove it. if (filename[0] == '\\') for (int i = 0; filename[i] != '\0'; i++) filename[i] = filename[i + 1]; return fopen(filename, "wb"); #else strcpy(filename, "/tmp/fileXXXXXX"); int fd = mkstemp(filename); return fdopen(fd, "w"); #endif } // Use exception for catching assert #ifdef _MSC_VER #pragma warning(disable : 4127) #endif #ifdef __clang__ #pragma GCC diagnostic push #if __has_warning("-Wdeprecated") #pragma GCC diagnostic ignored "-Wdeprecated" #endif #endif class AssertException : public std::logic_error { public: AssertException(const char* w) : std::logic_error(w) {} AssertException(const AssertException& rhs) : std::logic_error(rhs) {} virtual ~AssertException() throw(); }; #ifdef __clang__ #pragma GCC diagnostic pop #endif // Not using noexcept for testing RAPIDJSON_ASSERT() #define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 #ifndef RAPIDJSON_ASSERT #define RAPIDJSON_ASSERT(x) (!(x) ? throw AssertException(RAPIDJSON_STRINGIFY(x)) : (void)0u) #ifndef RAPIDJSON_ASSERT_THROWS #define RAPIDJSON_ASSERT_THROWS #endif #endif class Random { public: Random(unsigned seed = 0) : mSeed(seed) {} unsigned operator()() { mSeed = 214013 * mSeed + 2531011; return mSeed; } private: unsigned mSeed; }; #endif // UNITTEST_H_ asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/dtoatest.cpp0000644000000000000000000000655515031566105025115 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/internal/dtoa.h" #ifdef __GNUC__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(type-limits) #endif using namespace rapidjson::internal; TEST(dtoa, normal) { char buffer[30]; #define TEST_DTOA(d, a)\ *dtoa(d, buffer) = '\0';\ EXPECT_STREQ(a, buffer) TEST_DTOA(0.0, "0.0"); TEST_DTOA(-0.0, "-0.0"); TEST_DTOA(1.0, "1.0"); TEST_DTOA(-1.0, "-1.0"); TEST_DTOA(1.2345, "1.2345"); TEST_DTOA(1.2345678, "1.2345678"); TEST_DTOA(0.123456789012, "0.123456789012"); TEST_DTOA(1234567.8, "1234567.8"); TEST_DTOA(-79.39773355813419, "-79.39773355813419"); TEST_DTOA(-36.973846435546875, "-36.973846435546875"); TEST_DTOA(0.000001, "0.000001"); TEST_DTOA(0.0000001, "1e-7"); TEST_DTOA(1e30, "1e30"); TEST_DTOA(1.234567890123456e30, "1.234567890123456e30"); TEST_DTOA(5e-324, "5e-324"); // Min subnormal positive double TEST_DTOA(2.225073858507201e-308, "2.225073858507201e-308"); // Max subnormal positive double TEST_DTOA(2.2250738585072014e-308, "2.2250738585072014e-308"); // Min normal positive double TEST_DTOA(1.7976931348623157e308, "1.7976931348623157e308"); // Max double #undef TEST_DTOA } TEST(dtoa, maxDecimalPlaces) { char buffer[30]; #define TEST_DTOA(m, d, a)\ *dtoa(d, buffer, m) = '\0';\ EXPECT_STREQ(a, buffer) TEST_DTOA(3, 0.0, "0.0"); TEST_DTOA(1, 0.0, "0.0"); TEST_DTOA(3, -0.0, "-0.0"); TEST_DTOA(3, 1.0, "1.0"); TEST_DTOA(3, -1.0, "-1.0"); TEST_DTOA(3, 1.2345, "1.234"); TEST_DTOA(2, 1.2345, "1.23"); TEST_DTOA(1, 1.2345, "1.2"); TEST_DTOA(3, 1.2345678, "1.234"); TEST_DTOA(3, 1.0001, "1.0"); TEST_DTOA(2, 1.0001, "1.0"); TEST_DTOA(1, 1.0001, "1.0"); TEST_DTOA(3, 0.123456789012, "0.123"); TEST_DTOA(2, 0.123456789012, "0.12"); TEST_DTOA(1, 0.123456789012, "0.1"); TEST_DTOA(4, 0.0001, "0.0001"); TEST_DTOA(3, 0.0001, "0.0"); TEST_DTOA(2, 0.0001, "0.0"); TEST_DTOA(1, 0.0001, "0.0"); TEST_DTOA(3, 1234567.8, "1234567.8"); TEST_DTOA(3, 1e30, "1e30"); TEST_DTOA(3, 5e-324, "0.0"); // Min subnormal positive double TEST_DTOA(3, 2.225073858507201e-308, "0.0"); // Max subnormal positive double TEST_DTOA(3, 2.2250738585072014e-308, "0.0"); // Min normal positive double TEST_DTOA(3, 1.7976931348623157e308, "1.7976931348623157e308"); // Max double TEST_DTOA(5, -0.14000000000000001, "-0.14"); TEST_DTOA(4, -0.14000000000000001, "-0.14"); TEST_DTOA(3, -0.14000000000000001, "-0.14"); TEST_DTOA(3, -0.10000000000000001, "-0.1"); TEST_DTOA(2, -0.10000000000000001, "-0.1"); TEST_DTOA(1, -0.10000000000000001, "-0.1"); #undef TEST_DTOA } #ifdef __GNUC__ RAPIDJSON_DIAG_POP #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/pointertest.cpp0000644000000000000000000017245415031566105025650 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/pointer.h" #include "rapidjson/stringbuffer.h" #include "rapidjson/ostreamwrapper.h" #include #include #include using namespace rapidjson; static const char kJson[] = "{\n" " \"foo\":[\"bar\", \"baz\"],\n" " \"\" : 0,\n" " \"a/b\" : 1,\n" " \"c%d\" : 2,\n" " \"e^f\" : 3,\n" " \"g|h\" : 4,\n" " \"i\\\\j\" : 5,\n" " \"k\\\"l\" : 6,\n" " \" \" : 7,\n" " \"m~n\" : 8\n" "}"; TEST(Pointer, DefaultConstructor) { Pointer p; EXPECT_TRUE(p.IsValid()); EXPECT_EQ(0u, p.GetTokenCount()); } TEST(Pointer, Parse) { { Pointer p(""); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(0u, p.GetTokenCount()); } { Pointer p("/"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_EQ(0u, p.GetTokens()[0].length); EXPECT_STREQ("", p.GetTokens()[0].name); EXPECT_EQ(kPointerInvalidIndex, p.GetTokens()[0].index); } { Pointer p("/foo"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_EQ(3u, p.GetTokens()[0].length); EXPECT_STREQ("foo", p.GetTokens()[0].name); EXPECT_EQ(kPointerInvalidIndex, p.GetTokens()[0].index); } #if RAPIDJSON_HAS_STDSTRING { Pointer p(std::string("/foo")); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_EQ(3u, p.GetTokens()[0].length); EXPECT_STREQ("foo", p.GetTokens()[0].name); EXPECT_EQ(kPointerInvalidIndex, p.GetTokens()[0].index); } #endif { Pointer p("/foo/0"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(2u, p.GetTokenCount()); EXPECT_EQ(3u, p.GetTokens()[0].length); EXPECT_STREQ("foo", p.GetTokens()[0].name); EXPECT_EQ(kPointerInvalidIndex, p.GetTokens()[0].index); EXPECT_EQ(1u, p.GetTokens()[1].length); EXPECT_STREQ("0", p.GetTokens()[1].name); EXPECT_EQ(0u, p.GetTokens()[1].index); } { // Unescape ~1 Pointer p("/a~1b"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_EQ(3u, p.GetTokens()[0].length); EXPECT_STREQ("a/b", p.GetTokens()[0].name); } { // Unescape ~0 Pointer p("/m~0n"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_EQ(3u, p.GetTokens()[0].length); EXPECT_STREQ("m~n", p.GetTokens()[0].name); } { // empty name Pointer p("/"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_EQ(0u, p.GetTokens()[0].length); EXPECT_STREQ("", p.GetTokens()[0].name); } { // empty and non-empty name Pointer p("//a"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(2u, p.GetTokenCount()); EXPECT_EQ(0u, p.GetTokens()[0].length); EXPECT_STREQ("", p.GetTokens()[0].name); EXPECT_EQ(1u, p.GetTokens()[1].length); EXPECT_STREQ("a", p.GetTokens()[1].name); } { // Null characters Pointer p("/\0\0", 3); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_EQ(2u, p.GetTokens()[0].length); EXPECT_EQ('\0', p.GetTokens()[0].name[0]); EXPECT_EQ('\0', p.GetTokens()[0].name[1]); EXPECT_EQ('\0', p.GetTokens()[0].name[2]); } { // Valid index Pointer p("/123"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_STREQ("123", p.GetTokens()[0].name); EXPECT_EQ(123u, p.GetTokens()[0].index); } { // Invalid index (with leading zero) Pointer p("/01"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_STREQ("01", p.GetTokens()[0].name); EXPECT_EQ(kPointerInvalidIndex, p.GetTokens()[0].index); } if (sizeof(SizeType) == 4) { // Invalid index (overflow) Pointer p("/4294967296"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_STREQ("4294967296", p.GetTokens()[0].name); EXPECT_EQ(kPointerInvalidIndex, p.GetTokens()[0].index); } { // kPointerParseErrorTokenMustBeginWithSolidus Pointer p(" "); EXPECT_FALSE(p.IsValid()); EXPECT_EQ(kPointerParseErrorTokenMustBeginWithSolidus, p.GetParseErrorCode()); EXPECT_EQ(0u, p.GetParseErrorOffset()); } { // kPointerParseErrorInvalidEscape Pointer p("/~"); EXPECT_FALSE(p.IsValid()); EXPECT_EQ(kPointerParseErrorInvalidEscape, p.GetParseErrorCode()); EXPECT_EQ(2u, p.GetParseErrorOffset()); } { // kPointerParseErrorInvalidEscape Pointer p("/~2"); EXPECT_FALSE(p.IsValid()); EXPECT_EQ(kPointerParseErrorInvalidEscape, p.GetParseErrorCode()); EXPECT_EQ(2u, p.GetParseErrorOffset()); } } TEST(Pointer, Parse_URIFragment) { { Pointer p("#"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(0u, p.GetTokenCount()); } { Pointer p("#/foo"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_EQ(3u, p.GetTokens()[0].length); EXPECT_STREQ("foo", p.GetTokens()[0].name); } { Pointer p("#/foo/0"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(2u, p.GetTokenCount()); EXPECT_EQ(3u, p.GetTokens()[0].length); EXPECT_STREQ("foo", p.GetTokens()[0].name); EXPECT_EQ(1u, p.GetTokens()[1].length); EXPECT_STREQ("0", p.GetTokens()[1].name); EXPECT_EQ(0u, p.GetTokens()[1].index); } { // Unescape ~1 Pointer p("#/a~1b"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_EQ(3u, p.GetTokens()[0].length); EXPECT_STREQ("a/b", p.GetTokens()[0].name); } { // Unescape ~0 Pointer p("#/m~0n"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_EQ(3u, p.GetTokens()[0].length); EXPECT_STREQ("m~n", p.GetTokens()[0].name); } { // empty name Pointer p("#/"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_EQ(0u, p.GetTokens()[0].length); EXPECT_STREQ("", p.GetTokens()[0].name); } { // empty and non-empty name Pointer p("#//a"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(2u, p.GetTokenCount()); EXPECT_EQ(0u, p.GetTokens()[0].length); EXPECT_STREQ("", p.GetTokens()[0].name); EXPECT_EQ(1u, p.GetTokens()[1].length); EXPECT_STREQ("a", p.GetTokens()[1].name); } { // Null characters Pointer p("#/%00%00"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_EQ(2u, p.GetTokens()[0].length); EXPECT_EQ('\0', p.GetTokens()[0].name[0]); EXPECT_EQ('\0', p.GetTokens()[0].name[1]); EXPECT_EQ('\0', p.GetTokens()[0].name[2]); } { // Percentage Escapes EXPECT_STREQ("c%d", Pointer("#/c%25d").GetTokens()[0].name); EXPECT_STREQ("e^f", Pointer("#/e%5Ef").GetTokens()[0].name); EXPECT_STREQ("g|h", Pointer("#/g%7Ch").GetTokens()[0].name); EXPECT_STREQ("i\\j", Pointer("#/i%5Cj").GetTokens()[0].name); EXPECT_STREQ("k\"l", Pointer("#/k%22l").GetTokens()[0].name); EXPECT_STREQ(" ", Pointer("#/%20").GetTokens()[0].name); } { // Valid index Pointer p("#/123"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_STREQ("123", p.GetTokens()[0].name); EXPECT_EQ(123u, p.GetTokens()[0].index); } { // Invalid index (with leading zero) Pointer p("#/01"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_STREQ("01", p.GetTokens()[0].name); EXPECT_EQ(kPointerInvalidIndex, p.GetTokens()[0].index); } if (sizeof(SizeType) == 4) { // Invalid index (overflow) Pointer p("#/4294967296"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_STREQ("4294967296", p.GetTokens()[0].name); EXPECT_EQ(kPointerInvalidIndex, p.GetTokens()[0].index); } { // Decode UTF-8 percent encoding to UTF-8 Pointer p("#/%C2%A2"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_STREQ("\xC2\xA2", p.GetTokens()[0].name); } { // Decode UTF-8 percent encoding to UTF-16 GenericPointer > > p(L"#/%C2%A2"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_EQ(static_cast::Ch>(0x00A2), p.GetTokens()[0].name[0]); EXPECT_EQ(1u, p.GetTokens()[0].length); } { // Decode UTF-8 percent encoding to UTF-16 GenericPointer > > p(L"#/%E2%82%AC"); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(1u, p.GetTokenCount()); EXPECT_EQ(static_cast::Ch>(0x20AC), p.GetTokens()[0].name[0]); EXPECT_EQ(1u, p.GetTokens()[0].length); } { // kPointerParseErrorTokenMustBeginWithSolidus Pointer p("# "); EXPECT_FALSE(p.IsValid()); EXPECT_EQ(kPointerParseErrorTokenMustBeginWithSolidus, p.GetParseErrorCode()); EXPECT_EQ(1u, p.GetParseErrorOffset()); } { // kPointerParseErrorInvalidEscape Pointer p("#/~"); EXPECT_FALSE(p.IsValid()); EXPECT_EQ(kPointerParseErrorInvalidEscape, p.GetParseErrorCode()); EXPECT_EQ(3u, p.GetParseErrorOffset()); } { // kPointerParseErrorInvalidEscape Pointer p("#/~2"); EXPECT_FALSE(p.IsValid()); EXPECT_EQ(kPointerParseErrorInvalidEscape, p.GetParseErrorCode()); EXPECT_EQ(3u, p.GetParseErrorOffset()); } { // kPointerParseErrorInvalidPercentEncoding Pointer p("#/%"); EXPECT_FALSE(p.IsValid()); EXPECT_EQ(kPointerParseErrorInvalidPercentEncoding, p.GetParseErrorCode()); EXPECT_EQ(2u, p.GetParseErrorOffset()); } { // kPointerParseErrorInvalidPercentEncoding (invalid hex) Pointer p("#/%g0"); EXPECT_FALSE(p.IsValid()); EXPECT_EQ(kPointerParseErrorInvalidPercentEncoding, p.GetParseErrorCode()); EXPECT_EQ(2u, p.GetParseErrorOffset()); } { // kPointerParseErrorInvalidPercentEncoding (invalid hex) Pointer p("#/%0g"); EXPECT_FALSE(p.IsValid()); EXPECT_EQ(kPointerParseErrorInvalidPercentEncoding, p.GetParseErrorCode()); EXPECT_EQ(2u, p.GetParseErrorOffset()); } { // kPointerParseErrorInvalidPercentEncoding (incomplete UTF-8 sequence) Pointer p("#/%C2"); EXPECT_FALSE(p.IsValid()); EXPECT_EQ(kPointerParseErrorInvalidPercentEncoding, p.GetParseErrorCode()); EXPECT_EQ(2u, p.GetParseErrorOffset()); } { // kPointerParseErrorCharacterMustPercentEncode Pointer p("#/ "); EXPECT_FALSE(p.IsValid()); EXPECT_EQ(kPointerParseErrorCharacterMustPercentEncode, p.GetParseErrorCode()); EXPECT_EQ(2u, p.GetParseErrorOffset()); } { // kPointerParseErrorCharacterMustPercentEncode Pointer p("#/\n"); EXPECT_FALSE(p.IsValid()); EXPECT_EQ(kPointerParseErrorCharacterMustPercentEncode, p.GetParseErrorCode()); EXPECT_EQ(2u, p.GetParseErrorOffset()); } } TEST(Pointer, Stringify) { // Test by roundtrip const char* sources[] = { "", "/foo", "/foo/0", "/", "/a~1b", "/c%d", "/e^f", "/g|h", "/i\\j", "/k\"l", "/ ", "/m~0n", "/\xC2\xA2", "/\xE2\x82\xAC", "/\xF0\x9D\x84\x9E" }; for (size_t i = 0; i < sizeof(sources) / sizeof(sources[0]); i++) { Pointer p(sources[i]); StringBuffer s; EXPECT_TRUE(p.Stringify(s)); EXPECT_STREQ(sources[i], s.GetString()); // Stringify to URI fragment StringBuffer s2; EXPECT_TRUE(p.StringifyUriFragment(s2)); Pointer p2(s2.GetString(), s2.GetSize()); EXPECT_TRUE(p2.IsValid()); EXPECT_TRUE(p == p2); } { // Strigify to URI fragment with an invalid UTF-8 sequence Pointer p("/\xC2"); StringBuffer s; EXPECT_FALSE(p.StringifyUriFragment(s)); } } // Construct a Pointer with static tokens, no dynamic allocation involved. #define NAME(s) { s, static_cast(sizeof(s) / sizeof(s[0]) - 1), kPointerInvalidIndex } #define INDEX(i) { #i, static_cast(sizeof(#i) - 1), i } static const Pointer::Token kTokens[] = { NAME("foo"), INDEX(0) }; // equivalent to "/foo/0" #undef NAME #undef INDEX TEST(Pointer, ConstructorWithToken) { Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(2u, p.GetTokenCount()); EXPECT_EQ(3u, p.GetTokens()[0].length); EXPECT_STREQ("foo", p.GetTokens()[0].name); EXPECT_EQ(1u, p.GetTokens()[1].length); EXPECT_STREQ("0", p.GetTokens()[1].name); EXPECT_EQ(0u, p.GetTokens()[1].index); } TEST(Pointer, CopyConstructor) { { CrtAllocator allocator; Pointer p("/foo/0", &allocator); Pointer q(p); EXPECT_TRUE(q.IsValid()); EXPECT_EQ(2u, q.GetTokenCount()); EXPECT_EQ(3u, q.GetTokens()[0].length); EXPECT_STREQ("foo", q.GetTokens()[0].name); EXPECT_EQ(1u, q.GetTokens()[1].length); EXPECT_STREQ("0", q.GetTokens()[1].name); EXPECT_EQ(0u, q.GetTokens()[1].index); // Copied pointer needs to have its own allocator EXPECT_NE(&p.GetAllocator(), &q.GetAllocator()); } // Static tokens { Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); Pointer q(p); EXPECT_TRUE(q.IsValid()); EXPECT_EQ(2u, q.GetTokenCount()); EXPECT_EQ(3u, q.GetTokens()[0].length); EXPECT_STREQ("foo", q.GetTokens()[0].name); EXPECT_EQ(1u, q.GetTokens()[1].length); EXPECT_STREQ("0", q.GetTokens()[1].name); EXPECT_EQ(0u, q.GetTokens()[1].index); } } TEST(Pointer, Assignment) { { CrtAllocator allocator; Pointer p("/foo/0", &allocator); Pointer q; q = p; EXPECT_TRUE(q.IsValid()); EXPECT_EQ(2u, q.GetTokenCount()); EXPECT_EQ(3u, q.GetTokens()[0].length); EXPECT_STREQ("foo", q.GetTokens()[0].name); EXPECT_EQ(1u, q.GetTokens()[1].length); EXPECT_STREQ("0", q.GetTokens()[1].name); EXPECT_EQ(0u, q.GetTokens()[1].index); EXPECT_NE(&p.GetAllocator(), &q.GetAllocator()); q = static_cast(q); EXPECT_TRUE(q.IsValid()); EXPECT_EQ(2u, q.GetTokenCount()); EXPECT_EQ(3u, q.GetTokens()[0].length); EXPECT_STREQ("foo", q.GetTokens()[0].name); EXPECT_EQ(1u, q.GetTokens()[1].length); EXPECT_STREQ("0", q.GetTokens()[1].name); EXPECT_EQ(0u, q.GetTokens()[1].index); EXPECT_NE(&p.GetAllocator(), &q.GetAllocator()); } // Static tokens { Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); Pointer q; q = p; EXPECT_TRUE(q.IsValid()); EXPECT_EQ(2u, q.GetTokenCount()); EXPECT_EQ(3u, q.GetTokens()[0].length); EXPECT_STREQ("foo", q.GetTokens()[0].name); EXPECT_EQ(1u, q.GetTokens()[1].length); EXPECT_STREQ("0", q.GetTokens()[1].name); EXPECT_EQ(0u, q.GetTokens()[1].index); } } TEST(Pointer, Swap) { Pointer p("/foo/0"); Pointer q(&p.GetAllocator()); q.Swap(p); EXPECT_EQ(&q.GetAllocator(), &p.GetAllocator()); EXPECT_TRUE(p.IsValid()); EXPECT_TRUE(q.IsValid()); EXPECT_EQ(0u, p.GetTokenCount()); EXPECT_EQ(2u, q.GetTokenCount()); EXPECT_EQ(3u, q.GetTokens()[0].length); EXPECT_STREQ("foo", q.GetTokens()[0].name); EXPECT_EQ(1u, q.GetTokens()[1].length); EXPECT_STREQ("0", q.GetTokens()[1].name); EXPECT_EQ(0u, q.GetTokens()[1].index); // std::swap compatibility std::swap(p, q); EXPECT_EQ(&p.GetAllocator(), &q.GetAllocator()); EXPECT_TRUE(q.IsValid()); EXPECT_TRUE(p.IsValid()); EXPECT_EQ(0u, q.GetTokenCount()); EXPECT_EQ(2u, p.GetTokenCount()); EXPECT_EQ(3u, p.GetTokens()[0].length); EXPECT_STREQ("foo", p.GetTokens()[0].name); EXPECT_EQ(1u, p.GetTokens()[1].length); EXPECT_STREQ("0", p.GetTokens()[1].name); EXPECT_EQ(0u, p.GetTokens()[1].index); } TEST(Pointer, Append) { { Pointer p; Pointer q = p.Append("foo"); EXPECT_TRUE(Pointer("/foo") == q); q = q.Append(1234); EXPECT_TRUE(Pointer("/foo/1234") == q); q = q.Append(""); EXPECT_TRUE(Pointer("/foo/1234/") == q); } { Pointer p; Pointer q = p.Append(Value("foo").Move()); EXPECT_TRUE(Pointer("/foo") == q); q = q.Append(Value(1234).Move()); EXPECT_TRUE(Pointer("/foo/1234") == q); q = q.Append(Value(kStringType).Move()); EXPECT_TRUE(Pointer("/foo/1234/") == q); } #if RAPIDJSON_HAS_STDSTRING { Pointer p; Pointer q = p.Append(std::string("foo")); EXPECT_TRUE(Pointer("/foo") == q); } #endif } TEST(Pointer, Equality) { EXPECT_TRUE(Pointer("/foo/0") == Pointer("/foo/0")); EXPECT_FALSE(Pointer("/foo/0") == Pointer("/foo/1")); EXPECT_FALSE(Pointer("/foo/0") == Pointer("/foo/0/1")); EXPECT_FALSE(Pointer("/foo/0") == Pointer("a")); EXPECT_FALSE(Pointer("a") == Pointer("a")); // Invalid always not equal } TEST(Pointer, Inequality) { EXPECT_FALSE(Pointer("/foo/0") != Pointer("/foo/0")); EXPECT_TRUE(Pointer("/foo/0") != Pointer("/foo/1")); EXPECT_TRUE(Pointer("/foo/0") != Pointer("/foo/0/1")); EXPECT_TRUE(Pointer("/foo/0") != Pointer("a")); EXPECT_TRUE(Pointer("a") != Pointer("a")); // Invalid always not equal } TEST(Pointer, Create) { Document d; { Value* v = &Pointer("").Create(d, d.GetAllocator()); EXPECT_EQ(&d, v); } { Value* v = &Pointer("/foo").Create(d, d.GetAllocator()); EXPECT_EQ(&d["foo"], v); } { Value* v = &Pointer("/foo/0").Create(d, d.GetAllocator()); EXPECT_EQ(&d["foo"][0], v); } { Value* v = &Pointer("/foo/-").Create(d, d.GetAllocator()); EXPECT_EQ(&d["foo"][1], v); } { Value* v = &Pointer("/foo/-/-").Create(d, d.GetAllocator()); // "foo/-" is a newly created null value x. // "foo/-/-" finds that x is not an array, it converts x to empty object // and treats - as "-" member name EXPECT_EQ(&d["foo"][2]["-"], v); } { // Document with no allocator Value* v = &Pointer("/foo/-").Create(d); EXPECT_EQ(&d["foo"][3], v); } { // Value (not document) must give allocator Value* v = &Pointer("/-").Create(d["foo"], d.GetAllocator()); EXPECT_EQ(&d["foo"][4], v); } } static const char kJsonIds[] = "{\n" " \"id\": \"/root/\"," " \"foo\":[\"bar\", \"baz\", {\"id\": \"inarray\", \"child\": 1}],\n" " \"int\" : 2,\n" " \"str\" : \"val\",\n" " \"obj\": {\"id\": \"inobj\", \"child\": 3},\n" " \"jbo\": {\"id\": true, \"child\": 4}\n" "}"; TEST(Pointer, GetUri) { CrtAllocator allocator; Document d; d.Parse(kJsonIds); Pointer::UriType doc("http://doc"); Pointer::UriType root("http://doc/root/"); Pointer::UriType empty = Pointer::UriType(); EXPECT_TRUE(Pointer("").GetUri(d, doc) == doc); EXPECT_TRUE(Pointer("/foo").GetUri(d, doc) == root); EXPECT_TRUE(Pointer("/foo/0").GetUri(d, doc) == root); EXPECT_TRUE(Pointer("/foo/2").GetUri(d, doc) == root); EXPECT_TRUE(Pointer("/foo/2/child").GetUri(d, doc) == Pointer::UriType("http://doc/root/inarray")); EXPECT_TRUE(Pointer("/int").GetUri(d, doc) == root); EXPECT_TRUE(Pointer("/str").GetUri(d, doc) == root); EXPECT_TRUE(Pointer("/obj").GetUri(d, doc) == root); EXPECT_TRUE(Pointer("/obj/child").GetUri(d, doc) == Pointer::UriType("http://doc/root/inobj")); EXPECT_TRUE(Pointer("/jbo").GetUri(d, doc) == root); EXPECT_TRUE(Pointer("/jbo/child").GetUri(d, doc) == root); // id not string size_t unresolvedTokenIndex; EXPECT_TRUE(Pointer("/abc").GetUri(d, doc, &unresolvedTokenIndex, &allocator) == empty); // Out of boundary EXPECT_EQ(0u, unresolvedTokenIndex); EXPECT_TRUE(Pointer("/foo/3").GetUri(d, doc, &unresolvedTokenIndex, &allocator) == empty); // Out of boundary EXPECT_EQ(1u, unresolvedTokenIndex); EXPECT_TRUE(Pointer("/foo/a").GetUri(d, doc, &unresolvedTokenIndex, &allocator) == empty); // "/foo" is an array, cannot query by "a" EXPECT_EQ(1u, unresolvedTokenIndex); EXPECT_TRUE(Pointer("/foo/0/0").GetUri(d, doc, &unresolvedTokenIndex, &allocator) == empty); // "/foo/0" is an string, cannot further query EXPECT_EQ(2u, unresolvedTokenIndex); EXPECT_TRUE(Pointer("/foo/0/a").GetUri(d, doc, &unresolvedTokenIndex, &allocator) == empty); // "/foo/0" is an string, cannot further query EXPECT_EQ(2u, unresolvedTokenIndex); Pointer::Token tokens[] = { { "foo ...", 3, kPointerInvalidIndex } }; EXPECT_TRUE(Pointer(tokens, 1).GetUri(d, doc) == root); } TEST(Pointer, Get) { Document d; d.Parse(kJson); EXPECT_EQ(&d, Pointer("").Get(d)); EXPECT_EQ(&d["foo"], Pointer("/foo").Get(d)); EXPECT_EQ(&d["foo"][0], Pointer("/foo/0").Get(d)); EXPECT_EQ(&d[""], Pointer("/").Get(d)); EXPECT_EQ(&d["a/b"], Pointer("/a~1b").Get(d)); EXPECT_EQ(&d["c%d"], Pointer("/c%d").Get(d)); EXPECT_EQ(&d["e^f"], Pointer("/e^f").Get(d)); EXPECT_EQ(&d["g|h"], Pointer("/g|h").Get(d)); EXPECT_EQ(&d["i\\j"], Pointer("/i\\j").Get(d)); EXPECT_EQ(&d["k\"l"], Pointer("/k\"l").Get(d)); EXPECT_EQ(&d[" "], Pointer("/ ").Get(d)); EXPECT_EQ(&d["m~n"], Pointer("/m~0n").Get(d)); EXPECT_TRUE(Pointer("/abc").Get(d) == 0); // Out of boundary size_t unresolvedTokenIndex; EXPECT_TRUE(Pointer("/foo/2").Get(d, &unresolvedTokenIndex) == 0); // Out of boundary EXPECT_EQ(1u, unresolvedTokenIndex); EXPECT_TRUE(Pointer("/foo/a").Get(d, &unresolvedTokenIndex) == 0); // "/foo" is an array, cannot query by "a" EXPECT_EQ(1u, unresolvedTokenIndex); EXPECT_TRUE(Pointer("/foo/0/0").Get(d, &unresolvedTokenIndex) == 0); // "/foo/0" is an string, cannot further query EXPECT_EQ(2u, unresolvedTokenIndex); EXPECT_TRUE(Pointer("/foo/0/a").Get(d, &unresolvedTokenIndex) == 0); // "/foo/0" is an string, cannot further query EXPECT_EQ(2u, unresolvedTokenIndex); Pointer::Token tokens[] = { { "foo ...", 3, kPointerInvalidIndex } }; EXPECT_EQ(&d["foo"], Pointer(tokens, 1).Get(d)); } TEST(Pointer, GetWithDefault) { Document d; d.Parse(kJson); // Value version Document::AllocatorType& a = d.GetAllocator(); const Value v("qux"); EXPECT_TRUE(Value("bar") == Pointer("/foo/0").GetWithDefault(d, v, a)); EXPECT_TRUE(Value("baz") == Pointer("/foo/1").GetWithDefault(d, v, a)); EXPECT_TRUE(Value("qux") == Pointer("/foo/2").GetWithDefault(d, v, a)); EXPECT_TRUE(Value("last") == Pointer("/foo/-").GetWithDefault(d, Value("last").Move(), a)); EXPECT_STREQ("last", d["foo"][3].GetString()); EXPECT_TRUE(Pointer("/foo/null").GetWithDefault(d, Value().Move(), a).IsNull()); EXPECT_TRUE(Pointer("/foo/null").GetWithDefault(d, "x", a).IsNull()); // Generic version EXPECT_EQ(-1, Pointer("/foo/int").GetWithDefault(d, -1, a).GetInt()); EXPECT_EQ(-1, Pointer("/foo/int").GetWithDefault(d, -2, a).GetInt()); EXPECT_EQ(0x87654321, Pointer("/foo/uint").GetWithDefault(d, 0x87654321, a).GetUint()); EXPECT_EQ(0x87654321, Pointer("/foo/uint").GetWithDefault(d, 0x12345678, a).GetUint()); const int64_t i64 = static_cast(RAPIDJSON_UINT64_C2(0x80000000, 0)); EXPECT_EQ(i64, Pointer("/foo/int64").GetWithDefault(d, i64, a).GetInt64()); EXPECT_EQ(i64, Pointer("/foo/int64").GetWithDefault(d, i64 + 1, a).GetInt64()); const uint64_t u64 = RAPIDJSON_UINT64_C2(0xFFFFFFFFF, 0xFFFFFFFFF); EXPECT_EQ(u64, Pointer("/foo/uint64").GetWithDefault(d, u64, a).GetUint64()); EXPECT_EQ(u64, Pointer("/foo/uint64").GetWithDefault(d, u64 - 1, a).GetUint64()); EXPECT_TRUE(Pointer("/foo/true").GetWithDefault(d, true, a).IsTrue()); EXPECT_TRUE(Pointer("/foo/true").GetWithDefault(d, false, a).IsTrue()); EXPECT_TRUE(Pointer("/foo/false").GetWithDefault(d, false, a).IsFalse()); EXPECT_TRUE(Pointer("/foo/false").GetWithDefault(d, true, a).IsFalse()); // StringRef version EXPECT_STREQ("Hello", Pointer("/foo/hello").GetWithDefault(d, "Hello", a).GetString()); // Copy string version { char buffer[256]; strcpy(buffer, "World"); EXPECT_STREQ("World", Pointer("/foo/world").GetWithDefault(d, buffer, a).GetString()); memset(buffer, 0, sizeof(buffer)); } EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); #if RAPIDJSON_HAS_STDSTRING EXPECT_STREQ("C++", Pointer("/foo/C++").GetWithDefault(d, std::string("C++"), a).GetString()); #endif } TEST(Pointer, GetWithDefault_NoAllocator) { Document d; d.Parse(kJson); // Value version const Value v("qux"); EXPECT_TRUE(Value("bar") == Pointer("/foo/0").GetWithDefault(d, v)); EXPECT_TRUE(Value("baz") == Pointer("/foo/1").GetWithDefault(d, v)); EXPECT_TRUE(Value("qux") == Pointer("/foo/2").GetWithDefault(d, v)); EXPECT_TRUE(Value("last") == Pointer("/foo/-").GetWithDefault(d, Value("last").Move())); EXPECT_STREQ("last", d["foo"][3].GetString()); EXPECT_TRUE(Pointer("/foo/null").GetWithDefault(d, Value().Move()).IsNull()); EXPECT_TRUE(Pointer("/foo/null").GetWithDefault(d, "x").IsNull()); // Generic version EXPECT_EQ(-1, Pointer("/foo/int").GetWithDefault(d, -1).GetInt()); EXPECT_EQ(-1, Pointer("/foo/int").GetWithDefault(d, -2).GetInt()); EXPECT_EQ(0x87654321, Pointer("/foo/uint").GetWithDefault(d, 0x87654321).GetUint()); EXPECT_EQ(0x87654321, Pointer("/foo/uint").GetWithDefault(d, 0x12345678).GetUint()); const int64_t i64 = static_cast(RAPIDJSON_UINT64_C2(0x80000000, 0)); EXPECT_EQ(i64, Pointer("/foo/int64").GetWithDefault(d, i64).GetInt64()); EXPECT_EQ(i64, Pointer("/foo/int64").GetWithDefault(d, i64 + 1).GetInt64()); const uint64_t u64 = RAPIDJSON_UINT64_C2(0xFFFFFFFFF, 0xFFFFFFFFF); EXPECT_EQ(u64, Pointer("/foo/uint64").GetWithDefault(d, u64).GetUint64()); EXPECT_EQ(u64, Pointer("/foo/uint64").GetWithDefault(d, u64 - 1).GetUint64()); EXPECT_TRUE(Pointer("/foo/true").GetWithDefault(d, true).IsTrue()); EXPECT_TRUE(Pointer("/foo/true").GetWithDefault(d, false).IsTrue()); EXPECT_TRUE(Pointer("/foo/false").GetWithDefault(d, false).IsFalse()); EXPECT_TRUE(Pointer("/foo/false").GetWithDefault(d, true).IsFalse()); // StringRef version EXPECT_STREQ("Hello", Pointer("/foo/hello").GetWithDefault(d, "Hello").GetString()); // Copy string version { char buffer[256]; strcpy(buffer, "World"); EXPECT_STREQ("World", Pointer("/foo/world").GetWithDefault(d, buffer).GetString()); memset(buffer, 0, sizeof(buffer)); } EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); #if RAPIDJSON_HAS_STDSTRING EXPECT_STREQ("C++", Pointer("/foo/C++").GetWithDefault(d, std::string("C++")).GetString()); #endif } TEST(Pointer, Set) { Document d; d.Parse(kJson); Document::AllocatorType& a = d.GetAllocator(); // Value version Pointer("/foo/0").Set(d, Value(123).Move(), a); EXPECT_EQ(123, d["foo"][0].GetInt()); Pointer("/foo/-").Set(d, Value(456).Move(), a); EXPECT_EQ(456, d["foo"][2].GetInt()); Pointer("/foo/null").Set(d, Value().Move(), a); EXPECT_TRUE(GetValueByPointer(d, "/foo/null")->IsNull()); // Const Value version const Value foo(d["foo"], a); Pointer("/clone").Set(d, foo, a); EXPECT_EQ(foo, *GetValueByPointer(d, "/clone")); // Generic version Pointer("/foo/int").Set(d, -1, a); EXPECT_EQ(-1, GetValueByPointer(d, "/foo/int")->GetInt()); Pointer("/foo/uint").Set(d, 0x87654321, a); EXPECT_EQ(0x87654321, GetValueByPointer(d, "/foo/uint")->GetUint()); const int64_t i64 = static_cast(RAPIDJSON_UINT64_C2(0x80000000, 0)); Pointer("/foo/int64").Set(d, i64, a); EXPECT_EQ(i64, GetValueByPointer(d, "/foo/int64")->GetInt64()); const uint64_t u64 = RAPIDJSON_UINT64_C2(0xFFFFFFFFF, 0xFFFFFFFFF); Pointer("/foo/uint64").Set(d, u64, a); EXPECT_EQ(u64, GetValueByPointer(d, "/foo/uint64")->GetUint64()); Pointer("/foo/true").Set(d, true, a); EXPECT_TRUE(GetValueByPointer(d, "/foo/true")->IsTrue()); Pointer("/foo/false").Set(d, false, a); EXPECT_TRUE(GetValueByPointer(d, "/foo/false")->IsFalse()); // StringRef version Pointer("/foo/hello").Set(d, "Hello", a); EXPECT_STREQ("Hello", GetValueByPointer(d, "/foo/hello")->GetString()); // Copy string version { char buffer[256]; strcpy(buffer, "World"); Pointer("/foo/world").Set(d, buffer, a); memset(buffer, 0, sizeof(buffer)); } EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); #if RAPIDJSON_HAS_STDSTRING Pointer("/foo/c++").Set(d, std::string("C++"), a); EXPECT_STREQ("C++", GetValueByPointer(d, "/foo/c++")->GetString()); #endif } TEST(Pointer, Set_NoAllocator) { Document d; d.Parse(kJson); // Value version Pointer("/foo/0").Set(d, Value(123).Move()); EXPECT_EQ(123, d["foo"][0].GetInt()); Pointer("/foo/-").Set(d, Value(456).Move()); EXPECT_EQ(456, d["foo"][2].GetInt()); Pointer("/foo/null").Set(d, Value().Move()); EXPECT_TRUE(GetValueByPointer(d, "/foo/null")->IsNull()); // Const Value version const Value foo(d["foo"], d.GetAllocator()); Pointer("/clone").Set(d, foo); EXPECT_EQ(foo, *GetValueByPointer(d, "/clone")); // Generic version Pointer("/foo/int").Set(d, -1); EXPECT_EQ(-1, GetValueByPointer(d, "/foo/int")->GetInt()); Pointer("/foo/uint").Set(d, 0x87654321); EXPECT_EQ(0x87654321, GetValueByPointer(d, "/foo/uint")->GetUint()); const int64_t i64 = static_cast(RAPIDJSON_UINT64_C2(0x80000000, 0)); Pointer("/foo/int64").Set(d, i64); EXPECT_EQ(i64, GetValueByPointer(d, "/foo/int64")->GetInt64()); const uint64_t u64 = RAPIDJSON_UINT64_C2(0xFFFFFFFFF, 0xFFFFFFFFF); Pointer("/foo/uint64").Set(d, u64); EXPECT_EQ(u64, GetValueByPointer(d, "/foo/uint64")->GetUint64()); Pointer("/foo/true").Set(d, true); EXPECT_TRUE(GetValueByPointer(d, "/foo/true")->IsTrue()); Pointer("/foo/false").Set(d, false); EXPECT_TRUE(GetValueByPointer(d, "/foo/false")->IsFalse()); // StringRef version Pointer("/foo/hello").Set(d, "Hello"); EXPECT_STREQ("Hello", GetValueByPointer(d, "/foo/hello")->GetString()); // Copy string version { char buffer[256]; strcpy(buffer, "World"); Pointer("/foo/world").Set(d, buffer); memset(buffer, 0, sizeof(buffer)); } EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); #if RAPIDJSON_HAS_STDSTRING Pointer("/foo/c++").Set(d, std::string("C++")); EXPECT_STREQ("C++", GetValueByPointer(d, "/foo/c++")->GetString()); #endif } TEST(Pointer, Swap_Value) { Document d; d.Parse(kJson); Document::AllocatorType& a = d.GetAllocator(); Pointer("/foo/0").Swap(d, *Pointer("/foo/1").Get(d), a); EXPECT_STREQ("baz", d["foo"][0].GetString()); EXPECT_STREQ("bar", d["foo"][1].GetString()); } TEST(Pointer, Swap_Value_NoAllocator) { Document d; d.Parse(kJson); Pointer("/foo/0").Swap(d, *Pointer("/foo/1").Get(d)); EXPECT_STREQ("baz", d["foo"][0].GetString()); EXPECT_STREQ("bar", d["foo"][1].GetString()); } TEST(Pointer, Erase) { Document d; d.Parse(kJson); EXPECT_FALSE(Pointer("").Erase(d)); EXPECT_FALSE(Pointer("/nonexist").Erase(d)); EXPECT_FALSE(Pointer("/nonexist/nonexist").Erase(d)); EXPECT_FALSE(Pointer("/foo/nonexist").Erase(d)); EXPECT_FALSE(Pointer("/foo/nonexist/nonexist").Erase(d)); EXPECT_FALSE(Pointer("/foo/0/nonexist").Erase(d)); EXPECT_FALSE(Pointer("/foo/0/nonexist/nonexist").Erase(d)); EXPECT_FALSE(Pointer("/foo/2/nonexist").Erase(d)); EXPECT_TRUE(Pointer("/foo/0").Erase(d)); EXPECT_EQ(1u, d["foo"].Size()); EXPECT_STREQ("baz", d["foo"][0].GetString()); EXPECT_TRUE(Pointer("/foo/0").Erase(d)); EXPECT_TRUE(d["foo"].Empty()); EXPECT_TRUE(Pointer("/foo").Erase(d)); EXPECT_TRUE(Pointer("/foo").Get(d) == 0); Pointer("/a/0/b/0").Create(d); EXPECT_TRUE(Pointer("/a/0/b/0").Get(d) != 0); EXPECT_TRUE(Pointer("/a/0/b/0").Erase(d)); EXPECT_TRUE(Pointer("/a/0/b/0").Get(d) == 0); EXPECT_TRUE(Pointer("/a/0/b").Get(d) != 0); EXPECT_TRUE(Pointer("/a/0/b").Erase(d)); EXPECT_TRUE(Pointer("/a/0/b").Get(d) == 0); EXPECT_TRUE(Pointer("/a/0").Get(d) != 0); EXPECT_TRUE(Pointer("/a/0").Erase(d)); EXPECT_TRUE(Pointer("/a/0").Get(d) == 0); EXPECT_TRUE(Pointer("/a").Get(d) != 0); EXPECT_TRUE(Pointer("/a").Erase(d)); EXPECT_TRUE(Pointer("/a").Get(d) == 0); } TEST(Pointer, CreateValueByPointer) { Document d; Document::AllocatorType& a = d.GetAllocator(); { Value& v = CreateValueByPointer(d, Pointer("/foo/0"), a); EXPECT_EQ(&d["foo"][0], &v); } { Value& v = CreateValueByPointer(d, "/foo/1", a); EXPECT_EQ(&d["foo"][1], &v); } } TEST(Pointer, CreateValueByPointer_NoAllocator) { Document d; { Value& v = CreateValueByPointer(d, Pointer("/foo/0")); EXPECT_EQ(&d["foo"][0], &v); } { Value& v = CreateValueByPointer(d, "/foo/1"); EXPECT_EQ(&d["foo"][1], &v); } } TEST(Pointer, GetValueByPointer) { Document d; d.Parse(kJson); EXPECT_EQ(&d["foo"][0], GetValueByPointer(d, Pointer("/foo/0"))); EXPECT_EQ(&d["foo"][0], GetValueByPointer(d, "/foo/0")); size_t unresolvedTokenIndex; EXPECT_TRUE(GetValueByPointer(d, "/foo/2", &unresolvedTokenIndex) == 0); // Out of boundary EXPECT_EQ(1u, unresolvedTokenIndex); EXPECT_TRUE(GetValueByPointer(d, "/foo/a", &unresolvedTokenIndex) == 0); // "/foo" is an array, cannot query by "a" EXPECT_EQ(1u, unresolvedTokenIndex); EXPECT_TRUE(GetValueByPointer(d, "/foo/0/0", &unresolvedTokenIndex) == 0); // "/foo/0" is an string, cannot further query EXPECT_EQ(2u, unresolvedTokenIndex); EXPECT_TRUE(GetValueByPointer(d, "/foo/0/a", &unresolvedTokenIndex) == 0); // "/foo/0" is an string, cannot further query EXPECT_EQ(2u, unresolvedTokenIndex); // const version const Value& v = d; EXPECT_EQ(&d["foo"][0], GetValueByPointer(v, Pointer("/foo/0"))); EXPECT_EQ(&d["foo"][0], GetValueByPointer(v, "/foo/0")); EXPECT_TRUE(GetValueByPointer(v, "/foo/2", &unresolvedTokenIndex) == 0); // Out of boundary EXPECT_EQ(1u, unresolvedTokenIndex); EXPECT_TRUE(GetValueByPointer(v, "/foo/a", &unresolvedTokenIndex) == 0); // "/foo" is an array, cannot query by "a" EXPECT_EQ(1u, unresolvedTokenIndex); EXPECT_TRUE(GetValueByPointer(v, "/foo/0/0", &unresolvedTokenIndex) == 0); // "/foo/0" is an string, cannot further query EXPECT_EQ(2u, unresolvedTokenIndex); EXPECT_TRUE(GetValueByPointer(v, "/foo/0/a", &unresolvedTokenIndex) == 0); // "/foo/0" is an string, cannot further query EXPECT_EQ(2u, unresolvedTokenIndex); } TEST(Pointer, GetValueByPointerWithDefault_Pointer) { Document d; d.Parse(kJson); Document::AllocatorType& a = d.GetAllocator(); const Value v("qux"); EXPECT_TRUE(Value("bar") == GetValueByPointerWithDefault(d, Pointer("/foo/0"), v, a)); EXPECT_TRUE(Value("bar") == GetValueByPointerWithDefault(d, Pointer("/foo/0"), v, a)); EXPECT_TRUE(Value("baz") == GetValueByPointerWithDefault(d, Pointer("/foo/1"), v, a)); EXPECT_TRUE(Value("qux") == GetValueByPointerWithDefault(d, Pointer("/foo/2"), v, a)); EXPECT_TRUE(Value("last") == GetValueByPointerWithDefault(d, Pointer("/foo/-"), Value("last").Move(), a)); EXPECT_STREQ("last", d["foo"][3].GetString()); EXPECT_TRUE(GetValueByPointerWithDefault(d, Pointer("/foo/null"), Value().Move(), a).IsNull()); EXPECT_TRUE(GetValueByPointerWithDefault(d, Pointer("/foo/null"), "x", a).IsNull()); // Generic version EXPECT_EQ(-1, GetValueByPointerWithDefault(d, Pointer("/foo/int"), -1, a).GetInt()); EXPECT_EQ(-1, GetValueByPointerWithDefault(d, Pointer("/foo/int"), -2, a).GetInt()); EXPECT_EQ(0x87654321, GetValueByPointerWithDefault(d, Pointer("/foo/uint"), 0x87654321, a).GetUint()); EXPECT_EQ(0x87654321, GetValueByPointerWithDefault(d, Pointer("/foo/uint"), 0x12345678, a).GetUint()); const int64_t i64 = static_cast(RAPIDJSON_UINT64_C2(0x80000000, 0)); EXPECT_EQ(i64, GetValueByPointerWithDefault(d, Pointer("/foo/int64"), i64, a).GetInt64()); EXPECT_EQ(i64, GetValueByPointerWithDefault(d, Pointer("/foo/int64"), i64 + 1, a).GetInt64()); const uint64_t u64 = RAPIDJSON_UINT64_C2(0xFFFFFFFFF, 0xFFFFFFFFF); EXPECT_EQ(u64, GetValueByPointerWithDefault(d, Pointer("/foo/uint64"), u64, a).GetUint64()); EXPECT_EQ(u64, GetValueByPointerWithDefault(d, Pointer("/foo/uint64"), u64 - 1, a).GetUint64()); EXPECT_TRUE(GetValueByPointerWithDefault(d, Pointer("/foo/true"), true, a).IsTrue()); EXPECT_TRUE(GetValueByPointerWithDefault(d, Pointer("/foo/true"), false, a).IsTrue()); EXPECT_TRUE(GetValueByPointerWithDefault(d, Pointer("/foo/false"), false, a).IsFalse()); EXPECT_TRUE(GetValueByPointerWithDefault(d, Pointer("/foo/false"), true, a).IsFalse()); // StringRef version EXPECT_STREQ("Hello", GetValueByPointerWithDefault(d, Pointer("/foo/hello"), "Hello", a).GetString()); // Copy string version { char buffer[256]; strcpy(buffer, "World"); EXPECT_STREQ("World", GetValueByPointerWithDefault(d, Pointer("/foo/world"), buffer, a).GetString()); memset(buffer, 0, sizeof(buffer)); } EXPECT_STREQ("World", GetValueByPointer(d, Pointer("/foo/world"))->GetString()); #if RAPIDJSON_HAS_STDSTRING EXPECT_STREQ("C++", GetValueByPointerWithDefault(d, Pointer("/foo/C++"), std::string("C++"), a).GetString()); #endif } TEST(Pointer, GetValueByPointerWithDefault_String) { Document d; d.Parse(kJson); Document::AllocatorType& a = d.GetAllocator(); const Value v("qux"); EXPECT_TRUE(Value("bar") == GetValueByPointerWithDefault(d, "/foo/0", v, a)); EXPECT_TRUE(Value("bar") == GetValueByPointerWithDefault(d, "/foo/0", v, a)); EXPECT_TRUE(Value("baz") == GetValueByPointerWithDefault(d, "/foo/1", v, a)); EXPECT_TRUE(Value("qux") == GetValueByPointerWithDefault(d, "/foo/2", v, a)); EXPECT_TRUE(Value("last") == GetValueByPointerWithDefault(d, "/foo/-", Value("last").Move(), a)); EXPECT_STREQ("last", d["foo"][3].GetString()); EXPECT_TRUE(GetValueByPointerWithDefault(d, "/foo/null", Value().Move(), a).IsNull()); EXPECT_TRUE(GetValueByPointerWithDefault(d, "/foo/null", "x", a).IsNull()); // Generic version EXPECT_EQ(-1, GetValueByPointerWithDefault(d, "/foo/int", -1, a).GetInt()); EXPECT_EQ(-1, GetValueByPointerWithDefault(d, "/foo/int", -2, a).GetInt()); EXPECT_EQ(0x87654321, GetValueByPointerWithDefault(d, "/foo/uint", 0x87654321, a).GetUint()); EXPECT_EQ(0x87654321, GetValueByPointerWithDefault(d, "/foo/uint", 0x12345678, a).GetUint()); const int64_t i64 = static_cast(RAPIDJSON_UINT64_C2(0x80000000, 0)); EXPECT_EQ(i64, GetValueByPointerWithDefault(d, "/foo/int64", i64, a).GetInt64()); EXPECT_EQ(i64, GetValueByPointerWithDefault(d, "/foo/int64", i64 + 1, a).GetInt64()); const uint64_t u64 = RAPIDJSON_UINT64_C2(0xFFFFFFFFF, 0xFFFFFFFFF); EXPECT_EQ(u64, GetValueByPointerWithDefault(d, "/foo/uint64", u64, a).GetUint64()); EXPECT_EQ(u64, GetValueByPointerWithDefault(d, "/foo/uint64", u64 - 1, a).GetUint64()); EXPECT_TRUE(GetValueByPointerWithDefault(d, "/foo/true", true, a).IsTrue()); EXPECT_TRUE(GetValueByPointerWithDefault(d, "/foo/true", false, a).IsTrue()); EXPECT_TRUE(GetValueByPointerWithDefault(d, "/foo/false", false, a).IsFalse()); EXPECT_TRUE(GetValueByPointerWithDefault(d, "/foo/false", true, a).IsFalse()); // StringRef version EXPECT_STREQ("Hello", GetValueByPointerWithDefault(d, "/foo/hello", "Hello", a).GetString()); // Copy string version { char buffer[256]; strcpy(buffer, "World"); EXPECT_STREQ("World", GetValueByPointerWithDefault(d, "/foo/world", buffer, a).GetString()); memset(buffer, 0, sizeof(buffer)); } EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); #if RAPIDJSON_HAS_STDSTRING EXPECT_STREQ("C++", GetValueByPointerWithDefault(d, "/foo/C++", std::string("C++"), a).GetString()); #endif } TEST(Pointer, GetValueByPointerWithDefault_Pointer_NoAllocator) { Document d; d.Parse(kJson); const Value v("qux"); EXPECT_TRUE(Value("bar") == GetValueByPointerWithDefault(d, Pointer("/foo/0"), v)); EXPECT_TRUE(Value("bar") == GetValueByPointerWithDefault(d, Pointer("/foo/0"), v)); EXPECT_TRUE(Value("baz") == GetValueByPointerWithDefault(d, Pointer("/foo/1"), v)); EXPECT_TRUE(Value("qux") == GetValueByPointerWithDefault(d, Pointer("/foo/2"), v)); EXPECT_TRUE(Value("last") == GetValueByPointerWithDefault(d, Pointer("/foo/-"), Value("last").Move())); EXPECT_STREQ("last", d["foo"][3].GetString()); EXPECT_TRUE(GetValueByPointerWithDefault(d, Pointer("/foo/null"), Value().Move()).IsNull()); EXPECT_TRUE(GetValueByPointerWithDefault(d, Pointer("/foo/null"), "x").IsNull()); // Generic version EXPECT_EQ(-1, GetValueByPointerWithDefault(d, Pointer("/foo/int"), -1).GetInt()); EXPECT_EQ(-1, GetValueByPointerWithDefault(d, Pointer("/foo/int"), -2).GetInt()); EXPECT_EQ(0x87654321, GetValueByPointerWithDefault(d, Pointer("/foo/uint"), 0x87654321).GetUint()); EXPECT_EQ(0x87654321, GetValueByPointerWithDefault(d, Pointer("/foo/uint"), 0x12345678).GetUint()); const int64_t i64 = static_cast(RAPIDJSON_UINT64_C2(0x80000000, 0)); EXPECT_EQ(i64, GetValueByPointerWithDefault(d, Pointer("/foo/int64"), i64).GetInt64()); EXPECT_EQ(i64, GetValueByPointerWithDefault(d, Pointer("/foo/int64"), i64 + 1).GetInt64()); const uint64_t u64 = RAPIDJSON_UINT64_C2(0xFFFFFFFFF, 0xFFFFFFFFF); EXPECT_EQ(u64, GetValueByPointerWithDefault(d, Pointer("/foo/uint64"), u64).GetUint64()); EXPECT_EQ(u64, GetValueByPointerWithDefault(d, Pointer("/foo/uint64"), u64 - 1).GetUint64()); EXPECT_TRUE(GetValueByPointerWithDefault(d, Pointer("/foo/true"), true).IsTrue()); EXPECT_TRUE(GetValueByPointerWithDefault(d, Pointer("/foo/true"), false).IsTrue()); EXPECT_TRUE(GetValueByPointerWithDefault(d, Pointer("/foo/false"), false).IsFalse()); EXPECT_TRUE(GetValueByPointerWithDefault(d, Pointer("/foo/false"), true).IsFalse()); // StringRef version EXPECT_STREQ("Hello", GetValueByPointerWithDefault(d, Pointer("/foo/hello"), "Hello").GetString()); // Copy string version { char buffer[256]; strcpy(buffer, "World"); EXPECT_STREQ("World", GetValueByPointerWithDefault(d, Pointer("/foo/world"), buffer).GetString()); memset(buffer, 0, sizeof(buffer)); } EXPECT_STREQ("World", GetValueByPointer(d, Pointer("/foo/world"))->GetString()); #if RAPIDJSON_HAS_STDSTRING EXPECT_STREQ("C++", GetValueByPointerWithDefault(d, Pointer("/foo/C++"), std::string("C++")).GetString()); #endif } TEST(Pointer, GetValueByPointerWithDefault_String_NoAllocator) { Document d; d.Parse(kJson); const Value v("qux"); EXPECT_TRUE(Value("bar") == GetValueByPointerWithDefault(d, "/foo/0", v)); EXPECT_TRUE(Value("bar") == GetValueByPointerWithDefault(d, "/foo/0", v)); EXPECT_TRUE(Value("baz") == GetValueByPointerWithDefault(d, "/foo/1", v)); EXPECT_TRUE(Value("qux") == GetValueByPointerWithDefault(d, "/foo/2", v)); EXPECT_TRUE(Value("last") == GetValueByPointerWithDefault(d, "/foo/-", Value("last").Move())); EXPECT_STREQ("last", d["foo"][3].GetString()); EXPECT_TRUE(GetValueByPointerWithDefault(d, "/foo/null", Value().Move()).IsNull()); EXPECT_TRUE(GetValueByPointerWithDefault(d, "/foo/null", "x").IsNull()); // Generic version EXPECT_EQ(-1, GetValueByPointerWithDefault(d, "/foo/int", -1).GetInt()); EXPECT_EQ(-1, GetValueByPointerWithDefault(d, "/foo/int", -2).GetInt()); EXPECT_EQ(0x87654321, GetValueByPointerWithDefault(d, "/foo/uint", 0x87654321).GetUint()); EXPECT_EQ(0x87654321, GetValueByPointerWithDefault(d, "/foo/uint", 0x12345678).GetUint()); const int64_t i64 = static_cast(RAPIDJSON_UINT64_C2(0x80000000, 0)); EXPECT_EQ(i64, GetValueByPointerWithDefault(d, "/foo/int64", i64).GetInt64()); EXPECT_EQ(i64, GetValueByPointerWithDefault(d, "/foo/int64", i64 + 1).GetInt64()); const uint64_t u64 = RAPIDJSON_UINT64_C2(0xFFFFFFFFF, 0xFFFFFFFFF); EXPECT_EQ(u64, GetValueByPointerWithDefault(d, "/foo/uint64", u64).GetUint64()); EXPECT_EQ(u64, GetValueByPointerWithDefault(d, "/foo/uint64", u64 - 1).GetUint64()); EXPECT_TRUE(GetValueByPointerWithDefault(d, "/foo/true", true).IsTrue()); EXPECT_TRUE(GetValueByPointerWithDefault(d, "/foo/true", false).IsTrue()); EXPECT_TRUE(GetValueByPointerWithDefault(d, "/foo/false", false).IsFalse()); EXPECT_TRUE(GetValueByPointerWithDefault(d, "/foo/false", true).IsFalse()); // StringRef version EXPECT_STREQ("Hello", GetValueByPointerWithDefault(d, "/foo/hello", "Hello").GetString()); // Copy string version { char buffer[256]; strcpy(buffer, "World"); EXPECT_STREQ("World", GetValueByPointerWithDefault(d, "/foo/world", buffer).GetString()); memset(buffer, 0, sizeof(buffer)); } EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); #if RAPIDJSON_HAS_STDSTRING EXPECT_STREQ("C++", GetValueByPointerWithDefault(d, Pointer("/foo/C++"), std::string("C++")).GetString()); #endif } TEST(Pointer, SetValueByPointer_Pointer) { Document d; d.Parse(kJson); Document::AllocatorType& a = d.GetAllocator(); // Value version SetValueByPointer(d, Pointer("/foo/0"), Value(123).Move(), a); EXPECT_EQ(123, d["foo"][0].GetInt()); SetValueByPointer(d, Pointer("/foo/null"), Value().Move(), a); EXPECT_TRUE(GetValueByPointer(d, "/foo/null")->IsNull()); // Const Value version const Value foo(d["foo"], d.GetAllocator()); SetValueByPointer(d, Pointer("/clone"), foo, a); EXPECT_EQ(foo, *GetValueByPointer(d, "/clone")); // Generic version SetValueByPointer(d, Pointer("/foo/int"), -1, a); EXPECT_EQ(-1, GetValueByPointer(d, "/foo/int")->GetInt()); SetValueByPointer(d, Pointer("/foo/uint"), 0x87654321, a); EXPECT_EQ(0x87654321, GetValueByPointer(d, "/foo/uint")->GetUint()); const int64_t i64 = static_cast(RAPIDJSON_UINT64_C2(0x80000000, 0)); SetValueByPointer(d, Pointer("/foo/int64"), i64, a); EXPECT_EQ(i64, GetValueByPointer(d, "/foo/int64")->GetInt64()); const uint64_t u64 = RAPIDJSON_UINT64_C2(0xFFFFFFFFF, 0xFFFFFFFFF); SetValueByPointer(d, Pointer("/foo/uint64"), u64, a); EXPECT_EQ(u64, GetValueByPointer(d, "/foo/uint64")->GetUint64()); SetValueByPointer(d, Pointer("/foo/true"), true, a); EXPECT_TRUE(GetValueByPointer(d, "/foo/true")->IsTrue()); SetValueByPointer(d, Pointer("/foo/false"), false, a); EXPECT_TRUE(GetValueByPointer(d, "/foo/false")->IsFalse()); // StringRef version SetValueByPointer(d, Pointer("/foo/hello"), "Hello", a); EXPECT_STREQ("Hello", GetValueByPointer(d, "/foo/hello")->GetString()); // Copy string version { char buffer[256]; strcpy(buffer, "World"); SetValueByPointer(d, Pointer("/foo/world"), buffer, a); memset(buffer, 0, sizeof(buffer)); } EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); #if RAPIDJSON_HAS_STDSTRING SetValueByPointer(d, Pointer("/foo/c++"), std::string("C++"), a); EXPECT_STREQ("C++", GetValueByPointer(d, "/foo/c++")->GetString()); #endif } TEST(Pointer, SetValueByPointer_String) { Document d; d.Parse(kJson); Document::AllocatorType& a = d.GetAllocator(); // Value version SetValueByPointer(d, "/foo/0", Value(123).Move(), a); EXPECT_EQ(123, d["foo"][0].GetInt()); SetValueByPointer(d, "/foo/null", Value().Move(), a); EXPECT_TRUE(GetValueByPointer(d, "/foo/null")->IsNull()); // Const Value version const Value foo(d["foo"], d.GetAllocator()); SetValueByPointer(d, "/clone", foo, a); EXPECT_EQ(foo, *GetValueByPointer(d, "/clone")); // Generic version SetValueByPointer(d, "/foo/int", -1, a); EXPECT_EQ(-1, GetValueByPointer(d, "/foo/int")->GetInt()); SetValueByPointer(d, "/foo/uint", 0x87654321, a); EXPECT_EQ(0x87654321, GetValueByPointer(d, "/foo/uint")->GetUint()); const int64_t i64 = static_cast(RAPIDJSON_UINT64_C2(0x80000000, 0)); SetValueByPointer(d, "/foo/int64", i64, a); EXPECT_EQ(i64, GetValueByPointer(d, "/foo/int64")->GetInt64()); const uint64_t u64 = RAPIDJSON_UINT64_C2(0xFFFFFFFFF, 0xFFFFFFFFF); SetValueByPointer(d, "/foo/uint64", u64, a); EXPECT_EQ(u64, GetValueByPointer(d, "/foo/uint64")->GetUint64()); SetValueByPointer(d, "/foo/true", true, a); EXPECT_TRUE(GetValueByPointer(d, "/foo/true")->IsTrue()); SetValueByPointer(d, "/foo/false", false, a); EXPECT_TRUE(GetValueByPointer(d, "/foo/false")->IsFalse()); // StringRef version SetValueByPointer(d, "/foo/hello", "Hello", a); EXPECT_STREQ("Hello", GetValueByPointer(d, "/foo/hello")->GetString()); // Copy string version { char buffer[256]; strcpy(buffer, "World"); SetValueByPointer(d, "/foo/world", buffer, a); memset(buffer, 0, sizeof(buffer)); } EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); #if RAPIDJSON_HAS_STDSTRING SetValueByPointer(d, "/foo/c++", std::string("C++"), a); EXPECT_STREQ("C++", GetValueByPointer(d, "/foo/c++")->GetString()); #endif } TEST(Pointer, SetValueByPointer_Pointer_NoAllocator) { Document d; d.Parse(kJson); // Value version SetValueByPointer(d, Pointer("/foo/0"), Value(123).Move()); EXPECT_EQ(123, d["foo"][0].GetInt()); SetValueByPointer(d, Pointer("/foo/null"), Value().Move()); EXPECT_TRUE(GetValueByPointer(d, "/foo/null")->IsNull()); // Const Value version const Value foo(d["foo"], d.GetAllocator()); SetValueByPointer(d, Pointer("/clone"), foo); EXPECT_EQ(foo, *GetValueByPointer(d, "/clone")); // Generic version SetValueByPointer(d, Pointer("/foo/int"), -1); EXPECT_EQ(-1, GetValueByPointer(d, "/foo/int")->GetInt()); SetValueByPointer(d, Pointer("/foo/uint"), 0x87654321); EXPECT_EQ(0x87654321, GetValueByPointer(d, "/foo/uint")->GetUint()); const int64_t i64 = static_cast(RAPIDJSON_UINT64_C2(0x80000000, 0)); SetValueByPointer(d, Pointer("/foo/int64"), i64); EXPECT_EQ(i64, GetValueByPointer(d, "/foo/int64")->GetInt64()); const uint64_t u64 = RAPIDJSON_UINT64_C2(0xFFFFFFFFF, 0xFFFFFFFFF); SetValueByPointer(d, Pointer("/foo/uint64"), u64); EXPECT_EQ(u64, GetValueByPointer(d, "/foo/uint64")->GetUint64()); SetValueByPointer(d, Pointer("/foo/true"), true); EXPECT_TRUE(GetValueByPointer(d, "/foo/true")->IsTrue()); SetValueByPointer(d, Pointer("/foo/false"), false); EXPECT_TRUE(GetValueByPointer(d, "/foo/false")->IsFalse()); // StringRef version SetValueByPointer(d, Pointer("/foo/hello"), "Hello"); EXPECT_STREQ("Hello", GetValueByPointer(d, "/foo/hello")->GetString()); // Copy string version { char buffer[256]; strcpy(buffer, "World"); SetValueByPointer(d, Pointer("/foo/world"), buffer); memset(buffer, 0, sizeof(buffer)); } EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); #if RAPIDJSON_HAS_STDSTRING SetValueByPointer(d, Pointer("/foo/c++"), std::string("C++")); EXPECT_STREQ("C++", GetValueByPointer(d, "/foo/c++")->GetString()); #endif } TEST(Pointer, SetValueByPointer_String_NoAllocator) { Document d; d.Parse(kJson); // Value version SetValueByPointer(d, "/foo/0", Value(123).Move()); EXPECT_EQ(123, d["foo"][0].GetInt()); SetValueByPointer(d, "/foo/null", Value().Move()); EXPECT_TRUE(GetValueByPointer(d, "/foo/null")->IsNull()); // Const Value version const Value foo(d["foo"], d.GetAllocator()); SetValueByPointer(d, "/clone", foo); EXPECT_EQ(foo, *GetValueByPointer(d, "/clone")); // Generic version SetValueByPointer(d, "/foo/int", -1); EXPECT_EQ(-1, GetValueByPointer(d, "/foo/int")->GetInt()); SetValueByPointer(d, "/foo/uint", 0x87654321); EXPECT_EQ(0x87654321, GetValueByPointer(d, "/foo/uint")->GetUint()); const int64_t i64 = static_cast(RAPIDJSON_UINT64_C2(0x80000000, 0)); SetValueByPointer(d, "/foo/int64", i64); EXPECT_EQ(i64, GetValueByPointer(d, "/foo/int64")->GetInt64()); const uint64_t u64 = RAPIDJSON_UINT64_C2(0xFFFFFFFFF, 0xFFFFFFFFF); SetValueByPointer(d, "/foo/uint64", u64); EXPECT_EQ(u64, GetValueByPointer(d, "/foo/uint64")->GetUint64()); SetValueByPointer(d, "/foo/true", true); EXPECT_TRUE(GetValueByPointer(d, "/foo/true")->IsTrue()); SetValueByPointer(d, "/foo/false", false); EXPECT_TRUE(GetValueByPointer(d, "/foo/false")->IsFalse()); // StringRef version SetValueByPointer(d, "/foo/hello", "Hello"); EXPECT_STREQ("Hello", GetValueByPointer(d, "/foo/hello")->GetString()); // Copy string version { char buffer[256]; strcpy(buffer, "World"); SetValueByPointer(d, "/foo/world", buffer); memset(buffer, 0, sizeof(buffer)); } EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); #if RAPIDJSON_HAS_STDSTRING SetValueByPointer(d, "/foo/c++", std::string("C++")); EXPECT_STREQ("C++", GetValueByPointer(d, "/foo/c++")->GetString()); #endif } TEST(Pointer, SwapValueByPointer) { Document d; d.Parse(kJson); Document::AllocatorType& a = d.GetAllocator(); SwapValueByPointer(d, Pointer("/foo/0"), *GetValueByPointer(d, "/foo/1"), a); EXPECT_STREQ("baz", d["foo"][0].GetString()); EXPECT_STREQ("bar", d["foo"][1].GetString()); SwapValueByPointer(d, "/foo/0", *GetValueByPointer(d, "/foo/1"), a); EXPECT_STREQ("bar", d["foo"][0].GetString()); EXPECT_STREQ("baz", d["foo"][1].GetString()); } TEST(Pointer, SwapValueByPointer_NoAllocator) { Document d; d.Parse(kJson); SwapValueByPointer(d, Pointer("/foo/0"), *GetValueByPointer(d, "/foo/1")); EXPECT_STREQ("baz", d["foo"][0].GetString()); EXPECT_STREQ("bar", d["foo"][1].GetString()); SwapValueByPointer(d, "/foo/0", *GetValueByPointer(d, "/foo/1")); EXPECT_STREQ("bar", d["foo"][0].GetString()); EXPECT_STREQ("baz", d["foo"][1].GetString()); } TEST(Pointer, EraseValueByPointer_Pointer) { Document d; d.Parse(kJson); EXPECT_FALSE(EraseValueByPointer(d, Pointer(""))); EXPECT_FALSE(Pointer("/foo/nonexist").Erase(d)); EXPECT_TRUE(EraseValueByPointer(d, Pointer("/foo/0"))); EXPECT_EQ(1u, d["foo"].Size()); EXPECT_STREQ("baz", d["foo"][0].GetString()); EXPECT_TRUE(EraseValueByPointer(d, Pointer("/foo/0"))); EXPECT_TRUE(d["foo"].Empty()); EXPECT_TRUE(EraseValueByPointer(d, Pointer("/foo"))); EXPECT_TRUE(Pointer("/foo").Get(d) == 0); } TEST(Pointer, EraseValueByPointer_String) { Document d; d.Parse(kJson); EXPECT_FALSE(EraseValueByPointer(d, "")); EXPECT_FALSE(Pointer("/foo/nonexist").Erase(d)); EXPECT_TRUE(EraseValueByPointer(d, "/foo/0")); EXPECT_EQ(1u, d["foo"].Size()); EXPECT_STREQ("baz", d["foo"][0].GetString()); EXPECT_TRUE(EraseValueByPointer(d, "/foo/0")); EXPECT_TRUE(d["foo"].Empty()); EXPECT_TRUE(EraseValueByPointer(d, "/foo")); EXPECT_TRUE(Pointer("/foo").Get(d) == 0); } TEST(Pointer, Ambiguity) { { Document d; d.Parse("{\"0\" : [123]}"); EXPECT_EQ(123, Pointer("/0/0").Get(d)->GetInt()); Pointer("/0/a").Set(d, 456); // Change array [123] to object {456} EXPECT_EQ(456, Pointer("/0/a").Get(d)->GetInt()); } { Document d; EXPECT_FALSE(d.Parse("[{\"0\": 123}]").HasParseError()); EXPECT_EQ(123, Pointer("/0/0").Get(d)->GetInt()); Pointer("/0/1").Set(d, 456); // 1 is treated as "1" to index object EXPECT_EQ(123, Pointer("/0/0").Get(d)->GetInt()); EXPECT_EQ(456, Pointer("/0/1").Get(d)->GetInt()); } } TEST(Pointer, ResolveOnObject) { Document d; EXPECT_FALSE(d.Parse("{\"a\": 123}").HasParseError()); { Value::ConstObject o = static_cast(d).GetObject(); EXPECT_EQ(123, Pointer("/a").Get(o)->GetInt()); } { Value::Object o = d.GetObject(); Pointer("/a").Set(o, 456, d.GetAllocator()); EXPECT_EQ(456, Pointer("/a").Get(o)->GetInt()); } } TEST(Pointer, ResolveOnArray) { Document d; EXPECT_FALSE(d.Parse("[1, 2, 3]").HasParseError()); { Value::ConstArray a = static_cast(d).GetArray(); EXPECT_EQ(2, Pointer("/1").Get(a)->GetInt()); } { Value::Array a = d.GetArray(); Pointer("/1").Set(a, 123, d.GetAllocator()); EXPECT_EQ(123, Pointer("/1").Get(a)->GetInt()); } } TEST(Pointer, LessThan) { static const struct { const char *str; bool valid; } pointers[] = { { "/a/b", true }, { "/a", true }, { "/d/1", true }, { "/d/2/z", true }, { "/d/2/3", true }, { "/d/2", true }, { "/a/c", true }, { "/e/f~g", false }, { "/d/2/zz", true }, { "/d/1", true }, { "/d/2/z", true }, { "/e/f~~g", false }, { "/e/f~0g", true }, { "/e/f~1g", true }, { "/e/f.g", true }, { "", true } }; static const char *ordered_pointers[] = { "", "/a", "/a/b", "/a/c", "/d/1", "/d/1", "/d/2", "/e/f.g", "/e/f~1g", "/e/f~0g", "/d/2/3", "/d/2/z", "/d/2/z", "/d/2/zz", NULL, // was invalid "/e/f~g" NULL // was invalid "/e/f~~g" }; typedef MemoryPoolAllocator<> AllocatorType; typedef GenericPointer PointerType; typedef std::multimap PointerMap; PointerMap map; PointerMap::iterator it; AllocatorType allocator; size_t i; EXPECT_EQ(sizeof(pointers) / sizeof(pointers[0]), sizeof(ordered_pointers) / sizeof(ordered_pointers[0])); for (i = 0; i < sizeof(pointers) / sizeof(pointers[0]); ++i) { it = map.insert(PointerMap::value_type(PointerType(pointers[i].str, &allocator), i)); if (!it->first.IsValid()) { EXPECT_EQ(++it, map.end()); } } for (i = 0, it = map.begin(); it != map.end(); ++it, ++i) { EXPECT_TRUE(it->second < sizeof(pointers) / sizeof(pointers[0])); EXPECT_EQ(it->first.IsValid(), pointers[it->second].valid); EXPECT_TRUE(i < sizeof(ordered_pointers) / sizeof(ordered_pointers[0])); EXPECT_EQ(it->first.IsValid(), !!ordered_pointers[i]); if (it->first.IsValid()) { std::stringstream ss; OStreamWrapper os(ss); EXPECT_TRUE(it->first.Stringify(os)); EXPECT_EQ(ss.str(), pointers[it->second].str); EXPECT_EQ(ss.str(), ordered_pointers[i]); } } } // https://github.com/Tencent/rapidjson/issues/483 namespace myjson { class MyAllocator { public: static const bool kNeedFree = true; void * Malloc(size_t _size) { return malloc(_size); } void * Realloc(void *_org_p, size_t _org_size, size_t _new_size) { (void)_org_size; return realloc(_org_p, _new_size); } static void Free(void *_p) { return free(_p); } }; typedef rapidjson::GenericDocument< rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator< MyAllocator >, MyAllocator > Document; typedef rapidjson::GenericPointer< ::myjson::Document::ValueType, MyAllocator > Pointer; typedef ::myjson::Document::ValueType Value; } TEST(Pointer, Issue483) { std::string mystr, path; myjson::Document document; myjson::Value value(rapidjson::kStringType); value.SetString(mystr.c_str(), static_cast(mystr.length()), document.GetAllocator()); myjson::Pointer(path.c_str()).Set(document, value, document.GetAllocator()); } TEST(Pointer, Issue1899) { typedef GenericPointer > PointerType; PointerType p; PointerType q = p.Append("foo"); EXPECT_TRUE(PointerType("/foo") == q); q = q.Append(1234); EXPECT_TRUE(PointerType("/foo/1234") == q); q = q.Append(""); EXPECT_TRUE(PointerType("/foo/1234/") == q); } asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/regextest.cpp0000644000000000000000000004155215031566105025274 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/internal/regex.h" using namespace rapidjson::internal; TEST(Regex, Single) { Regex re("a"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("a")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("b")); } TEST(Regex, Concatenation) { Regex re("abc"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("abc")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("a")); EXPECT_FALSE(rs.Match("b")); EXPECT_FALSE(rs.Match("ab")); EXPECT_FALSE(rs.Match("abcd")); } TEST(Regex, Alternation1) { Regex re("abab|abbb"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("abab")); EXPECT_TRUE(rs.Match("abbb")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("ab")); EXPECT_FALSE(rs.Match("ababa")); EXPECT_FALSE(rs.Match("abb")); EXPECT_FALSE(rs.Match("abbbb")); } TEST(Regex, Alternation2) { Regex re("a|b|c"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("a")); EXPECT_TRUE(rs.Match("b")); EXPECT_TRUE(rs.Match("c")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("aa")); EXPECT_FALSE(rs.Match("ab")); } TEST(Regex, Parenthesis1) { Regex re("(ab)c"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("abc")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("a")); EXPECT_FALSE(rs.Match("b")); EXPECT_FALSE(rs.Match("ab")); EXPECT_FALSE(rs.Match("abcd")); } TEST(Regex, Parenthesis2) { Regex re("a(bc)"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("abc")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("a")); EXPECT_FALSE(rs.Match("b")); EXPECT_FALSE(rs.Match("ab")); EXPECT_FALSE(rs.Match("abcd")); } TEST(Regex, Parenthesis3) { Regex re("(a|b)(c|d)"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("ac")); EXPECT_TRUE(rs.Match("ad")); EXPECT_TRUE(rs.Match("bc")); EXPECT_TRUE(rs.Match("bd")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("ab")); EXPECT_FALSE(rs.Match("cd")); } TEST(Regex, ZeroOrOne1) { Regex re("a?"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("")); EXPECT_TRUE(rs.Match("a")); EXPECT_FALSE(rs.Match("aa")); } TEST(Regex, ZeroOrOne2) { Regex re("a?b"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("b")); EXPECT_TRUE(rs.Match("ab")); EXPECT_FALSE(rs.Match("a")); EXPECT_FALSE(rs.Match("aa")); EXPECT_FALSE(rs.Match("bb")); EXPECT_FALSE(rs.Match("ba")); } TEST(Regex, ZeroOrOne3) { Regex re("ab?"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("a")); EXPECT_TRUE(rs.Match("ab")); EXPECT_FALSE(rs.Match("b")); EXPECT_FALSE(rs.Match("aa")); EXPECT_FALSE(rs.Match("bb")); EXPECT_FALSE(rs.Match("ba")); } TEST(Regex, ZeroOrOne4) { Regex re("a?b?"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("")); EXPECT_TRUE(rs.Match("a")); EXPECT_TRUE(rs.Match("b")); EXPECT_TRUE(rs.Match("ab")); EXPECT_FALSE(rs.Match("aa")); EXPECT_FALSE(rs.Match("bb")); EXPECT_FALSE(rs.Match("ba")); EXPECT_FALSE(rs.Match("abc")); } TEST(Regex, ZeroOrOne5) { Regex re("a(ab)?b"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("ab")); EXPECT_TRUE(rs.Match("aabb")); EXPECT_FALSE(rs.Match("aab")); EXPECT_FALSE(rs.Match("abb")); } TEST(Regex, ZeroOrMore1) { Regex re("a*"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("")); EXPECT_TRUE(rs.Match("a")); EXPECT_TRUE(rs.Match("aa")); EXPECT_FALSE(rs.Match("b")); EXPECT_FALSE(rs.Match("ab")); } TEST(Regex, ZeroOrMore2) { Regex re("a*b"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("b")); EXPECT_TRUE(rs.Match("ab")); EXPECT_TRUE(rs.Match("aab")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("bb")); } TEST(Regex, ZeroOrMore3) { Regex re("a*b*"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("")); EXPECT_TRUE(rs.Match("a")); EXPECT_TRUE(rs.Match("aa")); EXPECT_TRUE(rs.Match("b")); EXPECT_TRUE(rs.Match("bb")); EXPECT_TRUE(rs.Match("ab")); EXPECT_TRUE(rs.Match("aabb")); EXPECT_FALSE(rs.Match("ba")); } TEST(Regex, ZeroOrMore4) { Regex re("a(ab)*b"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("ab")); EXPECT_TRUE(rs.Match("aabb")); EXPECT_TRUE(rs.Match("aababb")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("aa")); } TEST(Regex, OneOrMore1) { Regex re("a+"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("a")); EXPECT_TRUE(rs.Match("aa")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("b")); EXPECT_FALSE(rs.Match("ab")); } TEST(Regex, OneOrMore2) { Regex re("a+b"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("ab")); EXPECT_TRUE(rs.Match("aab")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("b")); } TEST(Regex, OneOrMore3) { Regex re("a+b+"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("ab")); EXPECT_TRUE(rs.Match("aab")); EXPECT_TRUE(rs.Match("abb")); EXPECT_TRUE(rs.Match("aabb")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("b")); EXPECT_FALSE(rs.Match("ba")); } TEST(Regex, OneOrMore4) { Regex re("a(ab)+b"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("aabb")); EXPECT_TRUE(rs.Match("aababb")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("ab")); } TEST(Regex, QuantifierExact1) { Regex re("ab{3}c"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("abbbc")); EXPECT_FALSE(rs.Match("ac")); EXPECT_FALSE(rs.Match("abc")); EXPECT_FALSE(rs.Match("abbc")); EXPECT_FALSE(rs.Match("abbbbc")); } TEST(Regex, QuantifierExact2) { Regex re("a(bc){3}d"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("abcbcbcd")); EXPECT_FALSE(rs.Match("ad")); EXPECT_FALSE(rs.Match("abcd")); EXPECT_FALSE(rs.Match("abcbcd")); EXPECT_FALSE(rs.Match("abcbcbcbcd")); } TEST(Regex, QuantifierExact3) { Regex re("a(b|c){3}d"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("abbbd")); EXPECT_TRUE(rs.Match("acccd")); EXPECT_TRUE(rs.Match("abcbd")); EXPECT_FALSE(rs.Match("ad")); EXPECT_FALSE(rs.Match("abbd")); EXPECT_FALSE(rs.Match("accccd")); EXPECT_FALSE(rs.Match("abbbbd")); } TEST(Regex, QuantifierMin1) { Regex re("ab{3,}c"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("abbbc")); EXPECT_TRUE(rs.Match("abbbbc")); EXPECT_TRUE(rs.Match("abbbbbc")); EXPECT_FALSE(rs.Match("ac")); EXPECT_FALSE(rs.Match("abc")); EXPECT_FALSE(rs.Match("abbc")); } TEST(Regex, QuantifierMin2) { Regex re("a(bc){3,}d"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("abcbcbcd")); EXPECT_TRUE(rs.Match("abcbcbcbcd")); EXPECT_FALSE(rs.Match("ad")); EXPECT_FALSE(rs.Match("abcd")); EXPECT_FALSE(rs.Match("abcbcd")); } TEST(Regex, QuantifierMin3) { Regex re("a(b|c){3,}d"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("abbbd")); EXPECT_TRUE(rs.Match("acccd")); EXPECT_TRUE(rs.Match("abcbd")); EXPECT_TRUE(rs.Match("accccd")); EXPECT_TRUE(rs.Match("abbbbd")); EXPECT_FALSE(rs.Match("ad")); EXPECT_FALSE(rs.Match("abbd")); } TEST(Regex, QuantifierMinMax1) { Regex re("ab{3,5}c"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("abbbc")); EXPECT_TRUE(rs.Match("abbbbc")); EXPECT_TRUE(rs.Match("abbbbbc")); EXPECT_FALSE(rs.Match("ac")); EXPECT_FALSE(rs.Match("abc")); EXPECT_FALSE(rs.Match("abbc")); EXPECT_FALSE(rs.Match("abbbbbbc")); } TEST(Regex, QuantifierMinMax2) { Regex re("a(bc){3,5}d"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("abcbcbcd")); EXPECT_TRUE(rs.Match("abcbcbcbcd")); EXPECT_TRUE(rs.Match("abcbcbcbcbcd")); EXPECT_FALSE(rs.Match("ad")); EXPECT_FALSE(rs.Match("abcd")); EXPECT_FALSE(rs.Match("abcbcd")); EXPECT_FALSE(rs.Match("abcbcbcbcbcbcd")); } TEST(Regex, QuantifierMinMax3) { Regex re("a(b|c){3,5}d"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("abbbd")); EXPECT_TRUE(rs.Match("acccd")); EXPECT_TRUE(rs.Match("abcbd")); EXPECT_TRUE(rs.Match("accccd")); EXPECT_TRUE(rs.Match("abbbbd")); EXPECT_TRUE(rs.Match("acccccd")); EXPECT_TRUE(rs.Match("abbbbbd")); EXPECT_FALSE(rs.Match("ad")); EXPECT_FALSE(rs.Match("abbd")); EXPECT_FALSE(rs.Match("accccccd")); EXPECT_FALSE(rs.Match("abbbbbbd")); } // Issue538 TEST(Regex, QuantifierMinMax4) { Regex re("a(b|c){0,3}d"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("ad")); EXPECT_TRUE(rs.Match("abd")); EXPECT_TRUE(rs.Match("acd")); EXPECT_TRUE(rs.Match("abbd")); EXPECT_TRUE(rs.Match("accd")); EXPECT_TRUE(rs.Match("abcd")); EXPECT_TRUE(rs.Match("abbbd")); EXPECT_TRUE(rs.Match("acccd")); EXPECT_FALSE(rs.Match("abbbbd")); EXPECT_FALSE(rs.Match("add")); EXPECT_FALSE(rs.Match("accccd")); EXPECT_FALSE(rs.Match("abcbcd")); } // Issue538 TEST(Regex, QuantifierMinMax5) { Regex re("a(b|c){0,}d"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("ad")); EXPECT_TRUE(rs.Match("abd")); EXPECT_TRUE(rs.Match("acd")); EXPECT_TRUE(rs.Match("abbd")); EXPECT_TRUE(rs.Match("accd")); EXPECT_TRUE(rs.Match("abcd")); EXPECT_TRUE(rs.Match("abbbd")); EXPECT_TRUE(rs.Match("acccd")); EXPECT_TRUE(rs.Match("abbbbd")); EXPECT_TRUE(rs.Match("accccd")); EXPECT_TRUE(rs.Match("abcbcd")); EXPECT_FALSE(rs.Match("add")); EXPECT_FALSE(rs.Match("aad")); } #define EURO "\xE2\x82\xAC" // "\xE2\x82\xAC" is UTF-8 rsquence of Euro sign U+20AC TEST(Regex, Unicode) { Regex re("a" EURO "+b"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("a" EURO "b")); EXPECT_TRUE(rs.Match("a" EURO EURO "b")); EXPECT_FALSE(rs.Match("a?b")); EXPECT_FALSE(rs.Match("a" EURO "\xAC" "b")); // unaware of UTF-8 will match } TEST(Regex, AnyCharacter) { Regex re("."); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("a")); EXPECT_TRUE(rs.Match("b")); EXPECT_TRUE(rs.Match(EURO)); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("aa")); } TEST(Regex, CharacterRange1) { Regex re("[abc]"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("a")); EXPECT_TRUE(rs.Match("b")); EXPECT_TRUE(rs.Match("c")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("`")); EXPECT_FALSE(rs.Match("d")); EXPECT_FALSE(rs.Match("aa")); } TEST(Regex, CharacterRange2) { Regex re("[^abc]"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("`")); EXPECT_TRUE(rs.Match("d")); EXPECT_FALSE(rs.Match("a")); EXPECT_FALSE(rs.Match("b")); EXPECT_FALSE(rs.Match("c")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("aa")); } TEST(Regex, CharacterRange3) { Regex re("[a-c]"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("a")); EXPECT_TRUE(rs.Match("b")); EXPECT_TRUE(rs.Match("c")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("`")); EXPECT_FALSE(rs.Match("d")); EXPECT_FALSE(rs.Match("aa")); } TEST(Regex, CharacterRange4) { Regex re("[^a-c]"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("`")); EXPECT_TRUE(rs.Match("d")); EXPECT_FALSE(rs.Match("a")); EXPECT_FALSE(rs.Match("b")); EXPECT_FALSE(rs.Match("c")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("aa")); } TEST(Regex, CharacterRange5) { Regex re("[-]"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("-")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("a")); } TEST(Regex, CharacterRange6) { Regex re("[a-]"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("a")); EXPECT_TRUE(rs.Match("-")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("`")); EXPECT_FALSE(rs.Match("b")); } TEST(Regex, CharacterRange7) { Regex re("[-a]"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("a")); EXPECT_TRUE(rs.Match("-")); EXPECT_FALSE(rs.Match("")); EXPECT_FALSE(rs.Match("`")); EXPECT_FALSE(rs.Match("b")); } TEST(Regex, CharacterRange8) { Regex re("[a-zA-Z0-9]*"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("Milo")); EXPECT_TRUE(rs.Match("MT19937")); EXPECT_TRUE(rs.Match("43")); EXPECT_FALSE(rs.Match("a_b")); EXPECT_FALSE(rs.Match("!")); } TEST(Regex, Search) { Regex re("abc"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Search("abc")); EXPECT_TRUE(rs.Search("_abc")); EXPECT_TRUE(rs.Search("abc_")); EXPECT_TRUE(rs.Search("_abc_")); EXPECT_TRUE(rs.Search("__abc__")); EXPECT_TRUE(rs.Search("abcabc")); EXPECT_FALSE(rs.Search("a")); EXPECT_FALSE(rs.Search("ab")); EXPECT_FALSE(rs.Search("bc")); EXPECT_FALSE(rs.Search("cba")); } TEST(Regex, Search_BeginAnchor) { Regex re("^abc"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Search("abc")); EXPECT_TRUE(rs.Search("abc_")); EXPECT_TRUE(rs.Search("abcabc")); EXPECT_FALSE(rs.Search("_abc")); EXPECT_FALSE(rs.Search("_abc_")); EXPECT_FALSE(rs.Search("a")); EXPECT_FALSE(rs.Search("ab")); EXPECT_FALSE(rs.Search("bc")); EXPECT_FALSE(rs.Search("cba")); } TEST(Regex, Search_EndAnchor) { Regex re("abc$"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Search("abc")); EXPECT_TRUE(rs.Search("_abc")); EXPECT_TRUE(rs.Search("abcabc")); EXPECT_FALSE(rs.Search("abc_")); EXPECT_FALSE(rs.Search("_abc_")); EXPECT_FALSE(rs.Search("a")); EXPECT_FALSE(rs.Search("ab")); EXPECT_FALSE(rs.Search("bc")); EXPECT_FALSE(rs.Search("cba")); } TEST(Regex, Search_BothAnchor) { Regex re("^abc$"); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Search("abc")); EXPECT_FALSE(rs.Search("")); EXPECT_FALSE(rs.Search("a")); EXPECT_FALSE(rs.Search("b")); EXPECT_FALSE(rs.Search("ab")); EXPECT_FALSE(rs.Search("abcd")); } TEST(Regex, Escape) { const char* s = "\\^\\$\\|\\(\\)\\?\\*\\+\\.\\[\\]\\{\\}\\\\\\f\\n\\r\\t\\v[\\b][\\[][\\]]"; Regex re(s); ASSERT_TRUE(re.IsValid()); RegexSearch rs(re); EXPECT_TRUE(rs.Match("^$|()?*+.[]{}\\\x0C\n\r\t\x0B\b[]")); EXPECT_FALSE(rs.Match(s)); // Not escaping } TEST(Regex, Invalid) { #define TEST_INVALID(s) \ {\ Regex re(s);\ EXPECT_FALSE(re.IsValid());\ } TEST_INVALID(""); TEST_INVALID("a|"); TEST_INVALID("()"); TEST_INVALID("("); TEST_INVALID(")"); TEST_INVALID("(a))"); TEST_INVALID("(a|)"); TEST_INVALID("(a||b)"); TEST_INVALID("(|b)"); TEST_INVALID("?"); TEST_INVALID("*"); TEST_INVALID("+"); TEST_INVALID("{"); TEST_INVALID("{}"); TEST_INVALID("a{a}"); TEST_INVALID("a{0}"); TEST_INVALID("a{-1}"); TEST_INVALID("a{}"); // TEST_INVALID("a{0,}"); // Support now TEST_INVALID("a{,0}"); TEST_INVALID("a{1,0}"); TEST_INVALID("a{-1,0}"); TEST_INVALID("a{-1,1}"); TEST_INVALID("a{4294967296}"); // overflow of unsigned TEST_INVALID("a{1a}"); TEST_INVALID("["); TEST_INVALID("[]"); TEST_INVALID("[^]"); TEST_INVALID("[\\a]"); TEST_INVALID("\\a"); #undef TEST_INVALID } TEST(Regex, Issue538) { Regex re("^[0-9]+(\\\\.[0-9]+){0,2}"); EXPECT_TRUE(re.IsValid()); } TEST(Regex, Issue583) { Regex re("[0-9]{99999}"); ASSERT_TRUE(re.IsValid()); } #undef EURO asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/strfunctest.cpp0000644000000000000000000000244015031566105025637 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/internal/strfunc.h" using namespace rapidjson; using namespace rapidjson::internal; TEST(StrFunc, CountStringCodePoint) { SizeType count; EXPECT_TRUE(CountStringCodePoint >("", 0, &count)); EXPECT_EQ(0u, count); EXPECT_TRUE(CountStringCodePoint >("Hello", 5, &count)); EXPECT_EQ(5u, count); EXPECT_TRUE(CountStringCodePoint >("\xC2\xA2\xE2\x82\xAC\xF0\x9D\x84\x9E", 9, &count)); // cents euro G-clef EXPECT_EQ(3u, count); EXPECT_FALSE(CountStringCodePoint >("\xC2\xA2\xE2\x82\xAC\xF0\x9D\x84\x9E\x80", 10, &count)); } asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/filestreamtest.cpp0000644000000000000000000001043515031566105026311 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/filereadstream.h" #include "rapidjson/filewritestream.h" #include "rapidjson/encodedstream.h" using namespace rapidjson; class FileStreamTest : public ::testing::Test { public: FileStreamTest() : filename_(), json_(), length_(), abcde_() {} virtual ~FileStreamTest(); virtual void SetUp() { const char *paths[] = { "data/sample.json", "bin/data/sample.json", "../bin/data/sample.json", "../../bin/data/sample.json", "../../../bin/data/sample.json" }; FILE* fp = 0; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { fp = fopen(paths[i], "rb"); if (fp) { filename_ = paths[i]; break; } } ASSERT_TRUE(fp != 0); fseek(fp, 0, SEEK_END); length_ = static_cast(ftell(fp)); fseek(fp, 0, SEEK_SET); json_ = static_cast(malloc(length_ + 1)); size_t readLength = fread(json_, 1, length_, fp); json_[readLength] = '\0'; fclose(fp); const char *abcde_paths[] = { "data/abcde.txt", "bin/data/abcde.txt", "../bin/data/abcde.txt", "../../bin/data/abcde.txt", "../../../bin/data/abcde.txt" }; fp = 0; for (size_t i = 0; i < sizeof(abcde_paths) / sizeof(abcde_paths[0]); i++) { fp = fopen(abcde_paths[i], "rb"); if (fp) { abcde_ = abcde_paths[i]; break; } } ASSERT_TRUE(fp != 0); fclose(fp); } virtual void TearDown() { free(json_); json_ = 0; } private: FileStreamTest(const FileStreamTest&); FileStreamTest& operator=(const FileStreamTest&); protected: const char* filename_; char *json_; size_t length_; const char* abcde_; }; FileStreamTest::~FileStreamTest() {} TEST_F(FileStreamTest, FileReadStream) { FILE *fp = fopen(filename_, "rb"); ASSERT_TRUE(fp != 0); char buffer[65536]; FileReadStream s(fp, buffer, sizeof(buffer)); for (size_t i = 0; i < length_; i++) { EXPECT_EQ(json_[i], s.Peek()); EXPECT_EQ(json_[i], s.Peek()); // 2nd time should be the same EXPECT_EQ(json_[i], s.Take()); } EXPECT_EQ(length_, s.Tell()); EXPECT_EQ('\0', s.Peek()); fclose(fp); } TEST_F(FileStreamTest, FileReadStream_Peek4) { FILE *fp = fopen(abcde_, "rb"); ASSERT_TRUE(fp != 0); char buffer[4]; FileReadStream s(fp, buffer, sizeof(buffer)); const char* c = s.Peek4(); for (int i = 0; i < 4; i++) EXPECT_EQ('a' + i, c[i]); EXPECT_EQ(0u, s.Tell()); for (int i = 0; i < 5; i++) { EXPECT_EQ(static_cast(i), s.Tell()); EXPECT_EQ('a' + i, s.Peek()); EXPECT_EQ('a' + i, s.Peek()); EXPECT_EQ('a' + i, s.Take()); } EXPECT_EQ(5u, s.Tell()); EXPECT_EQ(0, s.Peek()); EXPECT_EQ(0, s.Take()); fclose(fp); } TEST_F(FileStreamTest, FileWriteStream) { char filename[L_tmpnam]; FILE* fp = TempFile(filename); char buffer[65536]; FileWriteStream os(fp, buffer, sizeof(buffer)); for (size_t i = 0; i < length_; i++) os.Put(json_[i]); os.Flush(); fclose(fp); // Read it back to verify fp = fopen(filename, "rb"); FileReadStream is(fp, buffer, sizeof(buffer)); for (size_t i = 0; i < length_; i++) EXPECT_EQ(json_[i], is.Take()); EXPECT_EQ(length_, is.Tell()); fclose(fp); //std::cout << filename << std::endl; remove(filename); } asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/itoatest.cpp0000644000000000000000000000756415031566105025123 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/internal/itoa.h" #ifdef __GNUC__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(type-limits) #endif using namespace rapidjson::internal; template struct Traits { }; template <> struct Traits { enum { kBufferSize = 11 }; enum { kMaxDigit = 10 }; static uint32_t Negate(uint32_t x) { return x; } }; template <> struct Traits { enum { kBufferSize = 12 }; enum { kMaxDigit = 10 }; static int32_t Negate(int32_t x) { return -x; } }; template <> struct Traits { enum { kBufferSize = 21 }; enum { kMaxDigit = 20 }; static uint64_t Negate(uint64_t x) { return x; } }; template <> struct Traits { enum { kBufferSize = 22 }; enum { kMaxDigit = 20 }; static int64_t Negate(int64_t x) { return -x; } }; template static void VerifyValue(T value, void(*f)(T, char*), char* (*g)(T, char*)) { char buffer1[Traits::kBufferSize]; char buffer2[Traits::kBufferSize]; f(value, buffer1); *g(value, buffer2) = '\0'; EXPECT_STREQ(buffer1, buffer2); } template static void Verify(void(*f)(T, char*), char* (*g)(T, char*)) { // Boundary cases VerifyValue(0, f, g); VerifyValue((std::numeric_limits::min)(), f, g); VerifyValue((std::numeric_limits::max)(), f, g); // 2^n - 1, 2^n, 10^n - 1, 10^n until overflow for (int power = 2; power <= 10; power += 8) { T i = 1, last; do { VerifyValue(i - 1, f, g); VerifyValue(i, f, g); if ((std::numeric_limits::min)() < 0) { VerifyValue(Traits::Negate(i), f, g); VerifyValue(Traits::Negate(i + 1), f, g); } last = i; if (i > static_cast((std::numeric_limits::max)() / static_cast(power))) break; i *= static_cast(power); } while (last < i); } } static void u32toa_naive(uint32_t value, char* buffer) { char temp[10]; char *p = temp; do { *p++ = static_cast(char(value % 10) + '0'); value /= 10; } while (value > 0); do { *buffer++ = *--p; } while (p != temp); *buffer = '\0'; } static void i32toa_naive(int32_t value, char* buffer) { uint32_t u = static_cast(value); if (value < 0) { *buffer++ = '-'; u = ~u + 1; } u32toa_naive(u, buffer); } static void u64toa_naive(uint64_t value, char* buffer) { char temp[20]; char *p = temp; do { *p++ = static_cast(char(value % 10) + '0'); value /= 10; } while (value > 0); do { *buffer++ = *--p; } while (p != temp); *buffer = '\0'; } static void i64toa_naive(int64_t value, char* buffer) { uint64_t u = static_cast(value); if (value < 0) { *buffer++ = '-'; u = ~u + 1; } u64toa_naive(u, buffer); } TEST(itoa, u32toa) { Verify(u32toa_naive, u32toa); } TEST(itoa, i32toa) { Verify(i32toa_naive, i32toa); } TEST(itoa, u64toa) { Verify(u64toa_naive, u64toa); } TEST(itoa, i64toa) { Verify(i64toa_naive, i64toa); } #ifdef __GNUC__ RAPIDJSON_DIAG_POP #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/cursorstreamwrappertest.cpp0000644000000000000000000000723415031566105030313 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/document.h" #include "rapidjson/cursorstreamwrapper.h" using namespace rapidjson; // static const char json[] = "{\"string\"\n\n:\"my string\",\"array\"\n:[\"1\", \"2\", \"3\"]}"; static bool testJson(const char *json, size_t &line, size_t &col) { StringStream ss(json); CursorStreamWrapper csw(ss); Document document; document.ParseStream(csw); bool ret = document.HasParseError(); if (ret) { col = csw.GetColumn(); line = csw.GetLine(); } return ret; } TEST(CursorStreamWrapper, MissingFirstBracket) { const char json[] = "\"string\"\n\n:\"my string\",\"array\"\n:[\"1\", \"2\", \"3\"]}"; size_t col, line; bool ret = testJson(json, line, col); EXPECT_TRUE(ret); EXPECT_EQ(line, 3u); EXPECT_EQ(col, 0u); } TEST(CursorStreamWrapper, MissingQuotes) { const char json[] = "{\"string\n\n:\"my string\",\"array\"\n:[\"1\", \"2\", \"3\"]}"; size_t col, line; bool ret = testJson(json, line, col); EXPECT_TRUE(ret); EXPECT_EQ(line, 1u); EXPECT_EQ(col, 8u); } TEST(CursorStreamWrapper, MissingColon) { const char json[] = "{\"string\"\n\n\"my string\",\"array\"\n:[\"1\", \"2\", \"3\"]}"; size_t col, line; bool ret = testJson(json, line, col); EXPECT_TRUE(ret); EXPECT_EQ(line, 3u); EXPECT_EQ(col, 0u); } TEST(CursorStreamWrapper, MissingSecondQuotes) { const char json[] = "{\"string\"\n\n:my string\",\"array\"\n:[\"1\", \"2\", \"3\"]}"; size_t col, line; bool ret = testJson(json, line, col); EXPECT_TRUE(ret); EXPECT_EQ(line, 3u); EXPECT_EQ(col, 1u); } TEST(CursorStreamWrapper, MissingComma) { const char json[] = "{\"string\"\n\n:\"my string\"\"array\"\n:[\"1\", \"2\", \"3\"]}"; size_t col, line; bool ret = testJson(json, line, col); EXPECT_TRUE(ret); EXPECT_EQ(line, 3u); EXPECT_EQ(col, 12u); } TEST(CursorStreamWrapper, MissingArrayBracket) { const char json[] = "{\"string\"\n\n:\"my string\",\"array\"\n:\"1\", \"2\", \"3\"]}"; size_t col, line; bool ret = testJson(json, line, col); EXPECT_TRUE(ret); EXPECT_EQ(line, 4u); EXPECT_EQ(col, 9u); } TEST(CursorStreamWrapper, MissingArrayComma) { const char json[] = "{\"string\"\n\n:\"my string\",\"array\"\n:[\"1\" \"2\", \"3\"]}"; size_t col, line; bool ret = testJson(json, line, col); EXPECT_TRUE(ret); EXPECT_EQ(line, 4u); EXPECT_EQ(col, 6u); } TEST(CursorStreamWrapper, MissingLastArrayBracket) { const char json8[] = "{\"string\"\n\n:\"my string\",\"array\"\n:[\"1\", \"2\", \"3\"}"; size_t col, line; bool ret = testJson(json8, line, col); EXPECT_TRUE(ret); EXPECT_EQ(line, 4u); EXPECT_EQ(col, 15u); } TEST(CursorStreamWrapper, MissingLastBracket) { const char json9[] = "{\"string\"\n\n:\"my string\",\"array\"\n:[\"1\", \"2\", \"3\"]"; size_t col, line; bool ret = testJson(json9, line, col); EXPECT_TRUE(ret); EXPECT_EQ(line, 4u); EXPECT_EQ(col, 16u); } asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/writertest.cpp0000644000000000000000000004276315031566105025503 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/document.h" #include "rapidjson/reader.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" #include "rapidjson/memorybuffer.h" #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(c++98-compat) #endif using namespace rapidjson; TEST(Writer, Compact) { StringStream s("{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] } "); StringBuffer buffer; Writer writer(buffer); buffer.ShrinkToFit(); Reader reader; reader.Parse<0>(s, writer); EXPECT_STREQ("{\"hello\":\"world\",\"t\":true,\"f\":false,\"n\":null,\"i\":123,\"pi\":3.1416,\"a\":[1,2,3]}", buffer.GetString()); EXPECT_EQ(77u, buffer.GetSize()); EXPECT_TRUE(writer.IsComplete()); } // json -> parse -> writer -> json #define TEST_ROUNDTRIP(json) \ { \ StringStream s(json); \ StringBuffer buffer; \ Writer writer(buffer); \ Reader reader; \ reader.Parse(s, writer); \ EXPECT_STREQ(json, buffer.GetString()); \ EXPECT_TRUE(writer.IsComplete()); \ } TEST(Writer, Root) { TEST_ROUNDTRIP("null"); TEST_ROUNDTRIP("true"); TEST_ROUNDTRIP("false"); TEST_ROUNDTRIP("0"); TEST_ROUNDTRIP("\"foo\""); TEST_ROUNDTRIP("[]"); TEST_ROUNDTRIP("{}"); } TEST(Writer, Int) { TEST_ROUNDTRIP("[-1]"); TEST_ROUNDTRIP("[-123]"); TEST_ROUNDTRIP("[-2147483648]"); } TEST(Writer, UInt) { TEST_ROUNDTRIP("[0]"); TEST_ROUNDTRIP("[1]"); TEST_ROUNDTRIP("[123]"); TEST_ROUNDTRIP("[2147483647]"); TEST_ROUNDTRIP("[4294967295]"); } TEST(Writer, Int64) { TEST_ROUNDTRIP("[-1234567890123456789]"); TEST_ROUNDTRIP("[-9223372036854775808]"); } TEST(Writer, Uint64) { TEST_ROUNDTRIP("[1234567890123456789]"); TEST_ROUNDTRIP("[9223372036854775807]"); } TEST(Writer, String) { TEST_ROUNDTRIP("[\"Hello\"]"); TEST_ROUNDTRIP("[\"Hello\\u0000World\"]"); TEST_ROUNDTRIP("[\"\\\"\\\\/\\b\\f\\n\\r\\t\"]"); #if RAPIDJSON_HAS_STDSTRING { StringBuffer buffer; Writer writer(buffer); writer.String(std::string("Hello\n")); EXPECT_STREQ("\"Hello\\n\"", buffer.GetString()); } #endif } TEST(Writer, Issue_889) { char buf[100] = "Hello"; StringBuffer buffer; Writer writer(buffer); writer.StartArray(); writer.String(buf); writer.EndArray(); EXPECT_STREQ("[\"Hello\"]", buffer.GetString()); EXPECT_TRUE(writer.IsComplete()); \ } TEST(Writer, ScanWriteUnescapedString) { const char json[] = "[\" \\\"0123456789ABCDEF\"]"; // ^ scanning stops here. char buffer2[sizeof(json) + 32]; // Use different offset to test different alignments for (int i = 0; i < 32; i++) { char* p = buffer2 + i; memcpy(p, json, sizeof(json)); TEST_ROUNDTRIP(p); } } TEST(Writer, Double) { TEST_ROUNDTRIP("[1.2345,1.2345678,0.123456789012,1234567.8]"); TEST_ROUNDTRIP("0.0"); TEST_ROUNDTRIP("-0.0"); // Issue #289 TEST_ROUNDTRIP("1e30"); TEST_ROUNDTRIP("1.0"); TEST_ROUNDTRIP("5e-324"); // Min subnormal positive double TEST_ROUNDTRIP("2.225073858507201e-308"); // Max subnormal positive double TEST_ROUNDTRIP("2.2250738585072014e-308"); // Min normal positive double TEST_ROUNDTRIP("1.7976931348623157e308"); // Max double } // UTF8 -> TargetEncoding -> UTF8 template void TestTranscode(const char* json) { StringStream s(json); GenericStringBuffer buffer; Writer, UTF8<>, TargetEncoding> writer(buffer); Reader reader; reader.Parse(s, writer); StringBuffer buffer2; Writer writer2(buffer2); GenericReader > reader2; GenericStringStream s2(buffer.GetString()); reader2.Parse(s2, writer2); EXPECT_STREQ(json, buffer2.GetString()); } TEST(Writer, Transcode) { const char json[] = "{\"hello\":\"world\",\"t\":true,\"f\":false,\"n\":null,\"i\":123,\"pi\":3.1416,\"a\":[1,2,3],\"dollar\":\"\x24\",\"cents\":\"\xC2\xA2\",\"euro\":\"\xE2\x82\xAC\",\"gclef\":\"\xF0\x9D\x84\x9E\"}"; // UTF8 -> UTF16 -> UTF8 TestTranscode >(json); // UTF8 -> ASCII -> UTF8 TestTranscode >(json); // UTF8 -> UTF16 -> UTF8 TestTranscode >(json); // UTF8 -> UTF32 -> UTF8 TestTranscode >(json); // UTF8 -> AutoUTF -> UTF8 UTFType types[] = { kUTF8, kUTF16LE , kUTF16BE, kUTF32LE , kUTF32BE }; for (size_t i = 0; i < 5; i++) { StringStream s(json); MemoryBuffer buffer; AutoUTFOutputStream os(buffer, types[i], true); Writer, UTF8<>, AutoUTF > writer(os); Reader reader; reader.Parse(s, writer); StringBuffer buffer2; Writer writer2(buffer2); GenericReader, UTF8<> > reader2; MemoryStream s2(buffer.GetBuffer(), buffer.GetSize()); AutoUTFInputStream is(s2); reader2.Parse(is, writer2); EXPECT_STREQ(json, buffer2.GetString()); } } #include class OStreamWrapper { public: typedef char Ch; OStreamWrapper(std::ostream& os) : os_(os) {} Ch Peek() const { assert(false); return '\0'; } Ch Take() { assert(false); return '\0'; } size_t Tell() const { return 0; } Ch* PutBegin() { assert(false); return 0; } void Put(Ch c) { os_.put(c); } void Flush() { os_.flush(); } size_t PutEnd(Ch*) { assert(false); return 0; } private: OStreamWrapper(const OStreamWrapper&); OStreamWrapper& operator=(const OStreamWrapper&); std::ostream& os_; }; TEST(Writer, OStreamWrapper) { StringStream s("{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3], \"u64\": 1234567890123456789, \"i64\":-1234567890123456789 } "); std::stringstream ss; OStreamWrapper os(ss); Writer writer(os); Reader reader; reader.Parse<0>(s, writer); std::string actual = ss.str(); EXPECT_STREQ("{\"hello\":\"world\",\"t\":true,\"f\":false,\"n\":null,\"i\":123,\"pi\":3.1416,\"a\":[1,2,3],\"u64\":1234567890123456789,\"i64\":-1234567890123456789}", actual.c_str()); } TEST(Writer, AssertRootMayBeAnyValue) { #define T(x)\ {\ StringBuffer buffer;\ Writer writer(buffer);\ EXPECT_TRUE(x);\ } T(writer.Bool(false)); T(writer.Bool(true)); T(writer.Null()); T(writer.Int(0)); T(writer.Uint(0)); T(writer.Int64(0)); T(writer.Uint64(0)); T(writer.Double(0)); T(writer.String("foo")); #undef T } TEST(Writer, AssertIncorrectObjectLevel) { StringBuffer buffer; Writer writer(buffer); writer.StartObject(); writer.EndObject(); ASSERT_THROW(writer.EndObject(), AssertException); } TEST(Writer, AssertIncorrectArrayLevel) { StringBuffer buffer; Writer writer(buffer); writer.StartArray(); writer.EndArray(); ASSERT_THROW(writer.EndArray(), AssertException); } TEST(Writer, AssertIncorrectEndObject) { StringBuffer buffer; Writer writer(buffer); writer.StartObject(); ASSERT_THROW(writer.EndArray(), AssertException); } TEST(Writer, AssertIncorrectEndArray) { StringBuffer buffer; Writer writer(buffer); writer.StartObject(); ASSERT_THROW(writer.EndArray(), AssertException); } TEST(Writer, AssertObjectKeyNotString) { #define T(x)\ {\ StringBuffer buffer;\ Writer writer(buffer);\ writer.StartObject();\ ASSERT_THROW(x, AssertException); \ } T(writer.Bool(false)); T(writer.Bool(true)); T(writer.Null()); T(writer.Int(0)); T(writer.Uint(0)); T(writer.Int64(0)); T(writer.Uint64(0)); T(writer.Double(0)); T(writer.StartObject()); T(writer.StartArray()); #undef T } TEST(Writer, AssertMultipleRoot) { StringBuffer buffer; Writer writer(buffer); writer.StartObject(); writer.EndObject(); ASSERT_THROW(writer.StartObject(), AssertException); writer.Reset(buffer); writer.Null(); ASSERT_THROW(writer.Int(0), AssertException); writer.Reset(buffer); writer.String("foo"); ASSERT_THROW(writer.StartArray(), AssertException); writer.Reset(buffer); writer.StartArray(); writer.EndArray(); //ASSERT_THROW(writer.Double(3.14), AssertException); } TEST(Writer, RootObjectIsComplete) { StringBuffer buffer; Writer writer(buffer); EXPECT_FALSE(writer.IsComplete()); writer.StartObject(); EXPECT_FALSE(writer.IsComplete()); writer.String("foo"); EXPECT_FALSE(writer.IsComplete()); writer.Int(1); EXPECT_FALSE(writer.IsComplete()); writer.EndObject(); EXPECT_TRUE(writer.IsComplete()); } TEST(Writer, RootArrayIsComplete) { StringBuffer buffer; Writer writer(buffer); EXPECT_FALSE(writer.IsComplete()); writer.StartArray(); EXPECT_FALSE(writer.IsComplete()); writer.String("foo"); EXPECT_FALSE(writer.IsComplete()); writer.Int(1); EXPECT_FALSE(writer.IsComplete()); writer.EndArray(); EXPECT_TRUE(writer.IsComplete()); } TEST(Writer, RootValueIsComplete) { #define T(x)\ {\ StringBuffer buffer;\ Writer writer(buffer);\ EXPECT_FALSE(writer.IsComplete()); \ x; \ EXPECT_TRUE(writer.IsComplete()); \ } T(writer.Null()); T(writer.Bool(true)); T(writer.Bool(false)); T(writer.Int(0)); T(writer.Uint(0)); T(writer.Int64(0)); T(writer.Uint64(0)); T(writer.Double(0)); T(writer.String("")); #undef T } TEST(Writer, InvalidEncoding) { // Fail in decoding invalid UTF-8 sequence http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt { GenericStringBuffer > buffer; Writer >, UTF8<>, UTF16<> > writer(buffer); writer.StartArray(); EXPECT_FALSE(writer.String("\xfe")); EXPECT_FALSE(writer.String("\xff")); EXPECT_FALSE(writer.String("\xfe\xfe\xff\xff")); writer.EndArray(); } // Fail in encoding { StringBuffer buffer; Writer > writer(buffer); static const UTF32<>::Ch s[] = { 0x110000, 0 }; // Out of U+0000 to U+10FFFF EXPECT_FALSE(writer.String(s)); } // Fail in unicode escaping in ASCII output { StringBuffer buffer; Writer, ASCII<> > writer(buffer); static const UTF32<>::Ch s[] = { 0x110000, 0 }; // Out of U+0000 to U+10FFFF EXPECT_FALSE(writer.String(s)); } } TEST(Writer, ValidateEncoding) { { StringBuffer buffer; Writer, UTF8<>, CrtAllocator, kWriteValidateEncodingFlag> writer(buffer); writer.StartArray(); EXPECT_TRUE(writer.String("\x24")); // Dollar sign U+0024 EXPECT_TRUE(writer.String("\xC2\xA2")); // Cents sign U+00A2 EXPECT_TRUE(writer.String("\xE2\x82\xAC")); // Euro sign U+20AC EXPECT_TRUE(writer.String("\xF0\x9D\x84\x9E")); // G clef sign U+1D11E EXPECT_TRUE(writer.String("\x01")); // SOH control U+0001 EXPECT_TRUE(writer.String("\x1B")); // Escape control U+001B writer.EndArray(); EXPECT_STREQ("[\"\x24\",\"\xC2\xA2\",\"\xE2\x82\xAC\",\"\xF0\x9D\x84\x9E\",\"\\u0001\",\"\\u001B\"]", buffer.GetString()); } // Fail in decoding invalid UTF-8 sequence http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt { StringBuffer buffer; Writer, UTF8<>, CrtAllocator, kWriteValidateEncodingFlag> writer(buffer); writer.StartArray(); EXPECT_FALSE(writer.String("\xfe")); EXPECT_FALSE(writer.String("\xff")); EXPECT_FALSE(writer.String("\xfe\xfe\xff\xff")); writer.EndArray(); } } TEST(Writer, InvalidEventSequence) { // {] { StringBuffer buffer; Writer writer(buffer); writer.StartObject(); EXPECT_THROW(writer.EndArray(), AssertException); EXPECT_FALSE(writer.IsComplete()); } // [} { StringBuffer buffer; Writer writer(buffer); writer.StartArray(); EXPECT_THROW(writer.EndObject(), AssertException); EXPECT_FALSE(writer.IsComplete()); } // { 1: { StringBuffer buffer; Writer writer(buffer); writer.StartObject(); EXPECT_THROW(writer.Int(1), AssertException); EXPECT_FALSE(writer.IsComplete()); } // { 'a' } { StringBuffer buffer; Writer writer(buffer); writer.StartObject(); writer.Key("a"); EXPECT_THROW(writer.EndObject(), AssertException); EXPECT_FALSE(writer.IsComplete()); } // { 'a':'b','c' } { StringBuffer buffer; Writer writer(buffer); writer.StartObject(); writer.Key("a"); writer.String("b"); writer.Key("c"); EXPECT_THROW(writer.EndObject(), AssertException); EXPECT_FALSE(writer.IsComplete()); } } TEST(Writer, NaN) { double nan = std::numeric_limits::quiet_NaN(); EXPECT_TRUE(internal::Double(nan).IsNan()); StringBuffer buffer; { Writer writer(buffer); EXPECT_FALSE(writer.Double(nan)); } { Writer, UTF8<>, CrtAllocator, kWriteNanAndInfFlag> writer(buffer); EXPECT_TRUE(writer.Double(nan)); EXPECT_STREQ("NaN", buffer.GetString()); } GenericStringBuffer > buffer2; Writer > > writer2(buffer2); EXPECT_FALSE(writer2.Double(nan)); } TEST(Writer, Inf) { double inf = std::numeric_limits::infinity(); EXPECT_TRUE(internal::Double(inf).IsInf()); StringBuffer buffer; { Writer writer(buffer); EXPECT_FALSE(writer.Double(inf)); } { Writer writer(buffer); EXPECT_FALSE(writer.Double(-inf)); } { Writer, UTF8<>, CrtAllocator, kWriteNanAndInfFlag> writer(buffer); EXPECT_TRUE(writer.Double(inf)); } { Writer, UTF8<>, CrtAllocator, kWriteNanAndInfFlag> writer(buffer); EXPECT_TRUE(writer.Double(-inf)); } EXPECT_STREQ("Infinity-Infinity", buffer.GetString()); } TEST(Writer, RawValue) { StringBuffer buffer; Writer writer(buffer); writer.StartObject(); writer.Key("a"); writer.Int(1); writer.Key("raw"); const char json[] = "[\"Hello\\nWorld\", 123.456]"; writer.RawValue(json, strlen(json), kArrayType); writer.EndObject(); EXPECT_TRUE(writer.IsComplete()); EXPECT_STREQ("{\"a\":1,\"raw\":[\"Hello\\nWorld\", 123.456]}", buffer.GetString()); } TEST(Write, RawValue_Issue1152) { { GenericStringBuffer > sb; Writer >, UTF8<>, UTF32<> > writer(sb); writer.RawValue("null", 4, kNullType); EXPECT_TRUE(writer.IsComplete()); const unsigned *out = sb.GetString(); EXPECT_EQ(static_cast('n'), out[0]); EXPECT_EQ(static_cast('u'), out[1]); EXPECT_EQ(static_cast('l'), out[2]); EXPECT_EQ(static_cast('l'), out[3]); EXPECT_EQ(static_cast(0 ), out[4]); } { GenericStringBuffer > sb; Writer >, UTF16<>, UTF8<> > writer(sb); writer.RawValue(L"null", 4, kNullType); EXPECT_TRUE(writer.IsComplete()); EXPECT_STREQ("null", sb.GetString()); } { // Fail in transcoding GenericStringBuffer > buffer; Writer >, UTF8<>, UTF16<> > writer(buffer); EXPECT_FALSE(writer.RawValue("\"\xfe\"", 3, kStringType)); } { // Fail in encoding validation StringBuffer buffer; Writer, UTF8<>, CrtAllocator, kWriteValidateEncodingFlag> writer(buffer); EXPECT_FALSE(writer.RawValue("\"\xfe\"", 3, kStringType)); } } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS static Writer WriterGen(StringBuffer &target) { Writer writer(target); writer.StartObject(); writer.Key("a"); writer.Int(1); return writer; } TEST(Writer, MoveCtor) { StringBuffer buffer; Writer writer(WriterGen(buffer)); writer.EndObject(); EXPECT_TRUE(writer.IsComplete()); EXPECT_STREQ("{\"a\":1}", buffer.GetString()); } #endif #ifdef __clang__ RAPIDJSON_DIAG_POP #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/readertest.cpp0000644000000000000000000030035315031566105025421 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/reader.h" #include "rapidjson/internal/dtoa.h" #include "rapidjson/internal/itoa.h" #include "rapidjson/memorystream.h" #include using namespace rapidjson; RAPIDJSON_DIAG_PUSH #ifdef __GNUC__ RAPIDJSON_DIAG_OFF(effc++) RAPIDJSON_DIAG_OFF(float-equal) RAPIDJSON_DIAG_OFF(missing-noreturn) #if __GNUC__ >= 7 RAPIDJSON_DIAG_OFF(dangling-else) #endif #endif // __GNUC__ #ifdef __clang__ RAPIDJSON_DIAG_OFF(variadic-macros) RAPIDJSON_DIAG_OFF(c++98-compat-pedantic) #endif template struct ParseBoolHandler : BaseReaderHandler, ParseBoolHandler > { ParseBoolHandler() : step_(0) {} bool Default() { ADD_FAILURE(); return false; } // gcc 4.8.x generates warning in EXPECT_EQ(bool, bool) on this gtest version. // Workaround with EXPECT_TRUE(). bool Bool(bool b) { /*EXPECT_EQ(expect, b); */EXPECT_TRUE(expect == b); ++step_; return true; } unsigned step_; }; TEST(Reader, ParseTrue) { StringStream s("true"); ParseBoolHandler h; Reader reader; reader.Parse(s, h); EXPECT_EQ(1u, h.step_); } TEST(Reader, ParseFalse) { StringStream s("false"); ParseBoolHandler h; Reader reader; reader.Parse(s, h); EXPECT_EQ(1u, h.step_); } struct ParseIntHandler : BaseReaderHandler, ParseIntHandler> { ParseIntHandler() : step_(0), actual_() {} bool Default() { ADD_FAILURE(); return false; } bool Int(int i) { actual_ = i; step_++; return true; } unsigned step_; int actual_; }; struct ParseUintHandler : BaseReaderHandler, ParseUintHandler> { ParseUintHandler() : step_(0), actual_() {} bool Default() { ADD_FAILURE(); return false; } bool Uint(unsigned i) { actual_ = i; step_++; return true; } unsigned step_; unsigned actual_; }; struct ParseInt64Handler : BaseReaderHandler, ParseInt64Handler> { ParseInt64Handler() : step_(0), actual_() {} bool Default() { ADD_FAILURE(); return false; } bool Int64(int64_t i) { actual_ = i; step_++; return true; } unsigned step_; int64_t actual_; }; struct ParseUint64Handler : BaseReaderHandler, ParseUint64Handler> { ParseUint64Handler() : step_(0), actual_() {} bool Default() { ADD_FAILURE(); return false; } bool Uint64(uint64_t i) { actual_ = i; step_++; return true; } unsigned step_; uint64_t actual_; }; struct ParseDoubleHandler : BaseReaderHandler, ParseDoubleHandler> { ParseDoubleHandler() : step_(0), actual_() {} bool Default() { ADD_FAILURE(); return false; } bool Double(double d) { actual_ = d; step_++; return true; } unsigned step_; double actual_; }; TEST(Reader, ParseNumber_Integer) { #define TEST_INTEGER(Handler, str, x) \ { \ StringStream s(str); \ Handler h; \ Reader reader; \ reader.Parse(s, h); \ EXPECT_EQ(1u, h.step_); \ EXPECT_EQ(x, h.actual_); \ } TEST_INTEGER(ParseUintHandler, "0", 0u); TEST_INTEGER(ParseUintHandler, "123", 123u); TEST_INTEGER(ParseUintHandler, "2147483648", 2147483648u); // 2^31 - 1 (cannot be stored in int) TEST_INTEGER(ParseUintHandler, "4294967295", 4294967295u); TEST_INTEGER(ParseIntHandler, "-123", -123); TEST_INTEGER(ParseIntHandler, "-2147483648", static_cast(0x80000000)); // -2^31 (min of int) TEST_INTEGER(ParseUint64Handler, "4294967296", RAPIDJSON_UINT64_C2(1, 0)); // 2^32 (max of unsigned + 1, force to use uint64_t) TEST_INTEGER(ParseUint64Handler, "18446744073709551615", RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF)); // 2^64 - 1 (max of uint64_t) TEST_INTEGER(ParseInt64Handler, "-2147483649", static_cast(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x7FFFFFFF))); // -2^31 -1 (min of int - 1, force to use int64_t) TEST_INTEGER(ParseInt64Handler, "-9223372036854775808", static_cast(RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))); // -2^63 (min of int64_t) // Random test for uint32_t/int32_t { union { uint32_t u; int32_t i; }u; Random r; for (unsigned i = 0; i < 100000; i++) { u.u = r(); char buffer[32]; *internal::u32toa(u.u, buffer) = '\0'; TEST_INTEGER(ParseUintHandler, buffer, u.u); if (u.i < 0) { *internal::i32toa(u.i, buffer) = '\0'; TEST_INTEGER(ParseIntHandler, buffer, u.i); } } } // Random test for uint64_t/int64_t { union { uint64_t u; int64_t i; }u; Random r; for (unsigned i = 0; i < 100000; i++) { u.u = uint64_t(r()) << 32; u.u |= r(); char buffer[32]; if (u.u > uint64_t(4294967295u)) { *internal::u64toa(u.u, buffer) = '\0'; TEST_INTEGER(ParseUint64Handler, buffer, u.u); } if (u.i < -int64_t(2147483648u)) { *internal::i64toa(u.i, buffer) = '\0'; TEST_INTEGER(ParseInt64Handler, buffer, u.i); } } } #undef TEST_INTEGER } template static void TestParseDouble() { #define TEST_DOUBLE(fullPrecision, str, x) \ { \ StringStream s(str); \ ParseDoubleHandler h; \ Reader reader; \ ASSERT_EQ(kParseErrorNone, reader.Parse(s, h).Code()); \ EXPECT_EQ(1u, h.step_); \ internal::Double e(x), a(h.actual_); \ if (fullPrecision) { \ EXPECT_EQ(e.Uint64Value(), a.Uint64Value()); \ if (e.Uint64Value() != a.Uint64Value()) \ printf(" String: %s\n Actual: %.17g\nExpected: %.17g\n", str, h.actual_, x); \ } \ else { \ EXPECT_EQ(e.Sign(), a.Sign()); /* for 0.0 != -0.0 */ \ EXPECT_DOUBLE_EQ(x, h.actual_); \ } \ } TEST_DOUBLE(fullPrecision, "0.0", 0.0); TEST_DOUBLE(fullPrecision, "-0.0", -0.0); // For checking issue #289 TEST_DOUBLE(fullPrecision, "0e100", 0.0); // For checking issue #1249 TEST_DOUBLE(fullPrecision, "1.0", 1.0); TEST_DOUBLE(fullPrecision, "-1.0", -1.0); TEST_DOUBLE(fullPrecision, "1.5", 1.5); TEST_DOUBLE(fullPrecision, "-1.5", -1.5); TEST_DOUBLE(fullPrecision, "3.1416", 3.1416); TEST_DOUBLE(fullPrecision, "1E10", 1E10); TEST_DOUBLE(fullPrecision, "1e10", 1e10); TEST_DOUBLE(fullPrecision, "1E+10", 1E+10); TEST_DOUBLE(fullPrecision, "1E-10", 1E-10); TEST_DOUBLE(fullPrecision, "-1E10", -1E10); TEST_DOUBLE(fullPrecision, "-1e10", -1e10); TEST_DOUBLE(fullPrecision, "-1E+10", -1E+10); TEST_DOUBLE(fullPrecision, "-1E-10", -1E-10); TEST_DOUBLE(fullPrecision, "1.234E+10", 1.234E+10); TEST_DOUBLE(fullPrecision, "1.234E-10", 1.234E-10); TEST_DOUBLE(fullPrecision, "1.79769e+308", 1.79769e+308); TEST_DOUBLE(fullPrecision, "2.22507e-308", 2.22507e-308); TEST_DOUBLE(fullPrecision, "-1.79769e+308", -1.79769e+308); TEST_DOUBLE(fullPrecision, "-2.22507e-308", -2.22507e-308); TEST_DOUBLE(fullPrecision, "4.9406564584124654e-324", 4.9406564584124654e-324); // minimum denormal TEST_DOUBLE(fullPrecision, "2.2250738585072009e-308", 2.2250738585072009e-308); // Max subnormal double TEST_DOUBLE(fullPrecision, "2.2250738585072014e-308", 2.2250738585072014e-308); // Min normal positive double TEST_DOUBLE(fullPrecision, "1.7976931348623157e+308", 1.7976931348623157e+308); // Max double TEST_DOUBLE(fullPrecision, "1e-10000", 0.0); // must underflow TEST_DOUBLE(fullPrecision, "18446744073709551616", 18446744073709551616.0); // 2^64 (max of uint64_t + 1, force to use double) TEST_DOUBLE(fullPrecision, "-9223372036854775809", -9223372036854775809.0); // -2^63 - 1(min of int64_t + 1, force to use double) TEST_DOUBLE(fullPrecision, "0.9868011474609375", 0.9868011474609375); // https://github.com/Tencent/rapidjson/issues/120 TEST_DOUBLE(fullPrecision, "123e34", 123e34); // Fast Path Cases In Disguise TEST_DOUBLE(fullPrecision, "45913141877270640000.0", 45913141877270640000.0); TEST_DOUBLE(fullPrecision, "2.2250738585072011e-308", 2.2250738585072011e-308); // http://www.exploringbinary.com/php-hangs-on-numeric-value-2-2250738585072011e-308/ TEST_DOUBLE(fullPrecision, "1e-00011111111111", 0.0); // Issue #313 TEST_DOUBLE(fullPrecision, "-1e-00011111111111", -0.0); TEST_DOUBLE(fullPrecision, "1e-214748363", 0.0); // Maximum supported negative exponent TEST_DOUBLE(fullPrecision, "1e-214748364", 0.0); TEST_DOUBLE(fullPrecision, "1e-21474836311", 0.0); TEST_DOUBLE(fullPrecision, "1.00000000001e-2147483638", 0.0); TEST_DOUBLE(fullPrecision, "0.017976931348623157e+310", 1.7976931348623157e+308); // Max double in another form TEST_DOUBLE(fullPrecision, "128.74836467836484838364836483643636483648e-336", 0.0); // Issue #1251 // Since // abs((2^-1022 - 2^-1074) - 2.2250738585072012e-308) = 3.109754131239141401123495768877590405345064751974375599... x 10^-324 // abs((2^-1022) - 2.2250738585072012e-308) = 1.830902327173324040642192159804623318305533274168872044... x 10 ^ -324 // So 2.2250738585072012e-308 should round to 2^-1022 = 2.2250738585072014e-308 TEST_DOUBLE(fullPrecision, "2.2250738585072012e-308", 2.2250738585072014e-308); // http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/ // More closer to normal/subnormal boundary // boundary = 2^-1022 - 2^-1075 = 2.225073858507201136057409796709131975934819546351645648... x 10^-308 TEST_DOUBLE(fullPrecision, "2.22507385850720113605740979670913197593481954635164564e-308", 2.2250738585072009e-308); TEST_DOUBLE(fullPrecision, "2.22507385850720113605740979670913197593481954635164565e-308", 2.2250738585072014e-308); // 1.0 is in (1.0 - 2^-54, 1.0 + 2^-53) // 1.0 - 2^-54 = 0.999999999999999944488848768742172978818416595458984375 TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984375", 1.0); // round to even TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984374", 0.99999999999999989); // previous double TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984376", 1.0); // next double // 1.0 + 2^-53 = 1.00000000000000011102230246251565404236316680908203125 TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203125", 1.0); // round to even TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203124", 1.0); // previous double TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203126", 1.00000000000000022); // next double // Numbers from https://github.com/floitsch/double-conversion/blob/master/test/cctest/test-strtod.cc TEST_DOUBLE(fullPrecision, "72057594037927928.0", 72057594037927928.0); TEST_DOUBLE(fullPrecision, "72057594037927936.0", 72057594037927936.0); TEST_DOUBLE(fullPrecision, "72057594037927932.0", 72057594037927936.0); TEST_DOUBLE(fullPrecision, "7205759403792793199999e-5", 72057594037927928.0); TEST_DOUBLE(fullPrecision, "7205759403792793200001e-5", 72057594037927936.0); TEST_DOUBLE(fullPrecision, "9223372036854774784.0", 9223372036854774784.0); TEST_DOUBLE(fullPrecision, "9223372036854775808.0", 9223372036854775808.0); TEST_DOUBLE(fullPrecision, "9223372036854775296.0", 9223372036854775808.0); TEST_DOUBLE(fullPrecision, "922337203685477529599999e-5", 9223372036854774784.0); TEST_DOUBLE(fullPrecision, "922337203685477529600001e-5", 9223372036854775808.0); TEST_DOUBLE(fullPrecision, "10141204801825834086073718800384", 10141204801825834086073718800384.0); TEST_DOUBLE(fullPrecision, "10141204801825835211973625643008", 10141204801825835211973625643008.0); TEST_DOUBLE(fullPrecision, "10141204801825834649023672221696", 10141204801825835211973625643008.0); TEST_DOUBLE(fullPrecision, "1014120480182583464902367222169599999e-5", 10141204801825834086073718800384.0); TEST_DOUBLE(fullPrecision, "1014120480182583464902367222169600001e-5", 10141204801825835211973625643008.0); TEST_DOUBLE(fullPrecision, "5708990770823838890407843763683279797179383808", 5708990770823838890407843763683279797179383808.0); TEST_DOUBLE(fullPrecision, "5708990770823839524233143877797980545530986496", 5708990770823839524233143877797980545530986496.0); TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185152", 5708990770823839524233143877797980545530986496.0); TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185151999e-3", 5708990770823838890407843763683279797179383808.0); TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185152001e-3", 5708990770823839524233143877797980545530986496.0); { char n1e308[310]; // '1' followed by 308 '0' n1e308[0] = '1'; for (int i = 1; i < 309; i++) n1e308[i] = '0'; n1e308[309] = '\0'; TEST_DOUBLE(fullPrecision, n1e308, 1E308); } // Cover trimming TEST_DOUBLE(fullPrecision, "2.22507385850720113605740979670913197593481954635164564802342610972482222202107694551652952390813508" "7914149158913039621106870086438694594645527657207407820621743379988141063267329253552286881372149012" "9811224514518898490572223072852551331557550159143974763979834118019993239625482890171070818506906306" "6665599493827577257201576306269066333264756530000924588831643303777979186961204949739037782970490505" "1080609940730262937128958950003583799967207254304360284078895771796150945516748243471030702609144621" "5722898802581825451803257070188608721131280795122334262883686223215037756666225039825343359745688844" "2390026549819838548794829220689472168983109969836584681402285424333066033985088644580400103493397042" "7567186443383770486037861622771738545623065874679014086723327636718751234567890123456789012345678901" "e-308", 2.2250738585072014e-308); { static const unsigned count = 100; // Tested with 1000000 locally Random r; Reader reader; // Reusing reader to prevent heap allocation // Exhaustively test different exponents with random significant for (uint64_t exp = 0; exp < 2047; exp++) { ; for (unsigned i = 0; i < count; i++) { // Need to call r() in two statements for cross-platform coherent sequence. uint64_t u = (exp << 52) | uint64_t(r() & 0x000FFFFF) << 32; u |= uint64_t(r()); internal::Double d = internal::Double(u); char buffer[32]; *internal::dtoa(d.Value(), buffer) = '\0'; StringStream s(buffer); ParseDoubleHandler h; ASSERT_EQ(kParseErrorNone, reader.Parse(s, h).Code()); EXPECT_EQ(1u, h.step_); internal::Double a(h.actual_); if (fullPrecision) { EXPECT_EQ(d.Uint64Value(), a.Uint64Value()); if (d.Uint64Value() != a.Uint64Value()) printf(" String: %s\n Actual: %.17g\nExpected: %.17g\n", buffer, h.actual_, d.Value()); } else { EXPECT_EQ(d.Sign(), a.Sign()); // for 0.0 != -0.0 EXPECT_DOUBLE_EQ(d.Value(), h.actual_); } } } } // Issue #340 TEST_DOUBLE(fullPrecision, "7.450580596923828e-9", 7.450580596923828e-9); { internal::Double d(1.0); for (int i = 0; i < 324; i++) { char buffer[32]; *internal::dtoa(d.Value(), buffer) = '\0'; StringStream s(buffer); ParseDoubleHandler h; Reader reader; ASSERT_EQ(kParseErrorNone, reader.Parse(s, h).Code()); EXPECT_EQ(1u, h.step_); internal::Double a(h.actual_); if (fullPrecision) { EXPECT_EQ(d.Uint64Value(), a.Uint64Value()); if (d.Uint64Value() != a.Uint64Value()) printf(" String: %s\n Actual: %.17g\nExpected: %.17g\n", buffer, h.actual_, d.Value()); } else { EXPECT_EQ(d.Sign(), a.Sign()); // for 0.0 != -0.0 EXPECT_DOUBLE_EQ(d.Value(), h.actual_); } d = d.Value() * 0.5; } } // Issue 1249 TEST_DOUBLE(fullPrecision, "0e100", 0.0); // Issue 1251 TEST_DOUBLE(fullPrecision, "128.74836467836484838364836483643636483648e-336", 0.0); // Issue 1256 TEST_DOUBLE(fullPrecision, "6223372036854775296.1701512723685473547372536854755293372036854685477" "529752233737201701512337200972013723685473123372036872036854236854737" "247372368372367752975258547752975254729752547372368737201701512354737" "83723677529752585477247372368372368547354737253685475529752", 6223372036854775808.0); #if 0 // Test (length + exponent) overflow TEST_DOUBLE(fullPrecision, "0e+2147483647", 0.0); TEST_DOUBLE(fullPrecision, "0e-2147483648", 0.0); TEST_DOUBLE(fullPrecision, "1e-2147483648", 0.0); TEST_DOUBLE(fullPrecision, "0e+9223372036854775807", 0.0); TEST_DOUBLE(fullPrecision, "0e-9223372036854775808", 0.0); #endif if (fullPrecision) { TEST_DOUBLE(fullPrecision, "1e-325", 0.0); TEST_DOUBLE(fullPrecision, "1e-324", 0.0); TEST_DOUBLE(fullPrecision, "2e-324", 0.0); TEST_DOUBLE(fullPrecision, "2.4703282292062327e-324", 0.0); TEST_DOUBLE(fullPrecision, "2.4703282292062328e-324", 5e-324); TEST_DOUBLE(fullPrecision, "2.48e-324",5e-324); TEST_DOUBLE(fullPrecision, "2.5e-324", 5e-324); // Slightly above max-normal TEST_DOUBLE(fullPrecision, "1.7976931348623158e+308", 1.7976931348623158e+308); TEST_DOUBLE(fullPrecision, "17976931348623157081452742373170435679807056752584499659891747680315726" "07800285387605895586327668781715404589535143824642343213268894641827684" "67546703537516986049910576551282076245490090389328944075868508455133942" "30458323690322294816580855933212334827479782620414472316873817718091929" "9881250404026184124858368", (std::numeric_limits::max)()); TEST_DOUBLE(fullPrecision, "243546080556034731077856379609316893158278902575447060151047" "212703405344938119816206067372775299130836050315842578309818" "316450894337978612745889730079163798234256495613858256849283" "467066859489192118352020514036083287319232435355752493038825" "828481044358810649108367633313557305310641892225870327827273" "41408256.000000", 2.4354608055603473e+307); // 9007199254740991 * 2^971 (max normal) TEST_DOUBLE(fullPrecision, "1.797693134862315708145274237317043567980705675258449965989174768031572607800285" "38760589558632766878171540458953514382464234321326889464182768467546703537516986" "04991057655128207624549009038932894407586850845513394230458323690322294816580855" "9332123348274797826204144723168738177180919299881250404026184124858368e+308", 1.797693134862315708e+308 // 0x1.fffffffffffffp1023 ); #if 0 // TODO: // Should work at least in full-precision mode... TEST_DOUBLE(fullPrecision, "0.00000000000000000000000000000000000000000000000000000000000" "0000000000000000000000000000000000000000000000000000000000000" "0000000000000000000000000000000000000000000000000000000000000" "0000000000000000000000000000000000000000000000000000000000000" "0000000000000000000000000000000000000000000000000000000000000" "0000000000000000000024703282292062327208828439643411068618252" "9901307162382212792841250337753635104375932649918180817996189" "8982823477228588654633283551779698981993873980053909390631503" "5659515570226392290858392449105184435931802849936536152500319" "3704576782492193656236698636584807570015857692699037063119282" "7955855133292783433840935197801553124659726357957462276646527" "2827220056374006485499977096599470454020828166226237857393450" "7363390079677619305775067401763246736009689513405355374585166" "6113422376667860416215968046191446729184030053005753084904876" "5391711386591646239524912623653881879636239373280423891018672" "3484976682350898633885879256283027559956575244555072551893136" "9083625477918694866799496832404970582102851318545139621383772" "2826145437693412532098591327667236328125", 0.0); #endif // 9007199254740991 * 2^-1074 = (2^53 - 1) * 2^-1074 TEST_DOUBLE(fullPrecision, "4.450147717014402272114819593418263951869639092703291296046852219449644444042153" "89103305904781627017582829831782607924221374017287738918929105531441481564124348" "67599762821265346585071045737627442980259622449029037796981144446145705102663115" "10031828794952795966823603998647925096578034214163701381261333311989876551545144" "03152612538132666529513060001849177663286607555958373922409899478075565940981010" "21612198814605258742579179000071675999344145086087205681577915435923018910334964" "86942061405218289243144579760516365090360651414037721744226256159024466852576737" "24464300755133324500796506867194913776884780053099639677097589658441378944337966" "21993967316936280457084866613206797017728916080020698679408551343728867675409720" "757232455434770912461317493580281734466552734375e-308", 4.450147717014402272e-308 // 0x1.fffffffffffffp-1022 ); // 9007199254740990 * 2^-1074 TEST_DOUBLE(fullPrecision, "4.450147717014401778049173752171719775300846224481918930987049605124880018456471" "39035755177760751831052846195619008686241717547743167145836439860405887584484471" "19639655002484083577939142623582164522087943959208000909794783876158397872163051" "22622675229968408654350206725478309956546318828765627255022767720818849892988457" "26333908582101604036318532842699932130356061901518261174396928478121372742040102" "17446565569357687263889031732270082446958029584739170416643195242132750803227473" "16608838720742955671061336566907126801014814608027120593609275183716632624844904" "31985250929886016737037234388448352929102742708402644340627409931664203093081360" "70794835812045179006047003875039546061891526346421705014598610179523165038319441" "51446491086954182492263498716056346893310546875e-308", 4.450147717014401778e-308 // 0x1.ffffffffffffep-1022 ); // half way between the two numbers above. // round to nearest even. TEST_DOUBLE(fullPrecision, "4.450147717014402025081996672794991863585242658592605113516950912287262231249312" "64069530541271189424317838013700808305231545782515453032382772695923684574304409" "93619708911874715081505094180604803751173783204118519353387964161152051487413083" "16327252012460602310586905362063117526562176521464664318142050516404363222266800" "64743260560117135282915796422274554896821334728738317548403413978098469341510556" "19529382191981473003234105366170879223151087335413188049110555339027884856781219" "01775450062980622457102958163711745945687733011032421168917765671370549738710820" "78224775842509670618916870627821633352993761380751142008862499795052791018709663" "46394401564490729731565935244123171539810221213221201847003580761626016356864581" "1358486831521563686919762403704226016998291015625e-308", 4.450147717014401778e-308 // 0x1.ffffffffffffep-1022 ); TEST_DOUBLE(fullPrecision, "4.450147717014402025081996672794991863585242658592605113516950912287262231249312" "64069530541271189424317838013700808305231545782515453032382772695923684574304409" "93619708911874715081505094180604803751173783204118519353387964161152051487413083" "16327252012460602310586905362063117526562176521464664318142050516404363222266800" "64743260560117135282915796422274554896821334728738317548403413978098469341510556" "19529382191981473003234105366170879223151087335413188049110555339027884856781219" "01775450062980622457102958163711745945687733011032421168917765671370549738710820" "78224775842509670618916870627821633352993761380751142008862499795052791018709663" "46394401564490729731565935244123171539810221213221201847003580761626016356864581" "13584868315215636869197624037042260169982910156250000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000e-308", 4.450147717014401778e-308 // 0x1.ffffffffffffep-1022 ); #if 0 // ... round up // TODO: // Should work at least in full-precision mode... TEST_DOUBLE(fullPrecision, "4.450147717014402025081996672794991863585242658592605113516950912287262231249312" "64069530541271189424317838013700808305231545782515453032382772695923684574304409" "93619708911874715081505094180604803751173783204118519353387964161152051487413083" "16327252012460602310586905362063117526562176521464664318142050516404363222266800" "64743260560117135282915796422274554896821334728738317548403413978098469341510556" "19529382191981473003234105366170879223151087335413188049110555339027884856781219" "01775450062980622457102958163711745945687733011032421168917765671370549738710820" "78224775842509670618916870627821633352993761380751142008862499795052791018709663" "46394401564490729731565935244123171539810221213221201847003580761626016356864581" "13584868315215636869197624037042260169982910156250000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000001e-308", 4.450147717014402272e-308 // 0x1.fffffffffffffp-1022 ); #endif // ... round down TEST_DOUBLE(fullPrecision, "4.450147717014402025081996672794991863585242658592605113516950912287262231249312" "64069530541271189424317838013700808305231545782515453032382772695923684574304409" "93619708911874715081505094180604803751173783204118519353387964161152051487413083" "16327252012460602310586905362063117526562176521464664318142050516404363222266800" "64743260560117135282915796422274554896821334728738317548403413978098469341510556" "19529382191981473003234105366170879223151087335413188049110555339027884856781219" "01775450062980622457102958163711745945687733011032421168917765671370549738710820" "78224775842509670618916870627821633352993761380751142008862499795052791018709663" "46394401564490729731565935244123171539810221213221201847003580761626016356864581" "13584868315215636869197624037042260169982910156249999999999999999999999999999999" "99999999999999999999999999999999999999999999999999999999999999999999999999999999" "99999999999999999999999999999999999999999999999999999999999999999999999999999999e-308", 4.450147717014401778e-308 // 0x1.ffffffffffffep-1022 ); // Slightly below half way between max-normal and infinity. // Should round down. TEST_DOUBLE(fullPrecision, "1.797693134862315807937289714053034150799341327100378269361737789804449682927647" "50946649017977587207096330286416692887910946555547851940402630657488671505820681" "90890200070838367627385484581771153176447573027006985557136695962284291481986083" "49364752927190741684443655107043427115596995080930428801779041744977919999999999" "99999999999999999999999999999999999999999999999999999999999999999999999999999999" "99999999999999999999999999999999999999999999999999999999999999999999999999999999" "99999999999999999999999999999999999999999999999999999999999999999999999999999999" "99999999999999999999999999999999999999999999999999999999999999999999999999999999" "99999999999999999999999999999999999999999999999999999999999999999999999999999999" "99999999999999999999999999999999999999999999999999999999999999999999999999999999" "99999999999999999999999999999999999999999999999999999999999999999999999999999999" "99999999999999999999999999999999999999999999999999999999999999999999999999999999" "99999999999999999999999999999999999999999999999999999999999999999999999999999999" "99999999999999999999999999999999999999999999999999999999999999999999999999999999" "99999999999999999999999999999999999999999999999999999999999999999999999999999999" "99999999999999999999999999999999999999999999999999999999999999999999999999999999e+308", 1.797693134862315708e+308 // 0x1.fffffffffffffp1023 ); } #undef TEST_DOUBLE } TEST(Reader, ParseNumber_NormalPrecisionDouble) { TestParseDouble(); } TEST(Reader, ParseNumber_FullPrecisionDouble) { TestParseDouble(); } TEST(Reader, ParseNumber_NormalPrecisionError) { static unsigned count = 1000000; Random r; double ulpSum = 0.0; double ulpMax = 0.0; for (unsigned i = 0; i < count; i++) { internal::Double e, a; do { // Need to call r() in two statements for cross-platform coherent sequence. uint64_t u = uint64_t(r()) << 32; u |= uint64_t(r()); e = u; } while (e.IsNan() || e.IsInf() || !e.IsNormal()); char buffer[32]; *internal::dtoa(e.Value(), buffer) = '\0'; StringStream s(buffer); ParseDoubleHandler h; Reader reader; ASSERT_EQ(kParseErrorNone, reader.Parse(s, h).Code()); EXPECT_EQ(1u, h.step_); a = h.actual_; uint64_t bias1 = e.ToBias(); uint64_t bias2 = a.ToBias(); double ulp = static_cast(bias1 >= bias2 ? bias1 - bias2 : bias2 - bias1); ulpMax = (std::max)(ulpMax, ulp); ulpSum += ulp; } printf("ULP Average = %g, Max = %g \n", ulpSum / count, ulpMax); } template static void TestParseNumberError() { #define TEST_NUMBER_ERROR(errorCode, str, errorOffset, streamPos) \ { \ char buffer[2048]; \ ASSERT_LT(std::strlen(str), 2048u); \ sprintf(buffer, "%s", str); \ InsituStringStream s(buffer); \ BaseReaderHandler<> h; \ Reader reader; \ EXPECT_FALSE(reader.Parse(s, h)); \ EXPECT_EQ(errorCode, reader.GetParseErrorCode());\ EXPECT_EQ(errorOffset, reader.GetErrorOffset());\ EXPECT_EQ(streamPos, s.Tell());\ } // Number too big to be stored in double. { char n1e309[311]; // '1' followed by 309 '0' n1e309[0] = '1'; for (int i = 1; i < 310; i++) n1e309[i] = '0'; n1e309[310] = '\0'; TEST_NUMBER_ERROR(kParseErrorNumberTooBig, n1e309, 0u, 310u); } TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e309", 0u, 5u); // Miss fraction part in number. TEST_NUMBER_ERROR(kParseErrorNumberMissFraction, "1.", 2u, 2u); TEST_NUMBER_ERROR(kParseErrorNumberMissFraction, "1.a", 2u, 2u); // Miss exponent in number. TEST_NUMBER_ERROR(kParseErrorNumberMissExponent, "1e", 2u, 2u); TEST_NUMBER_ERROR(kParseErrorNumberMissExponent, "1e_", 2u, 2u); // Issue 849 TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.8e308", 0u, 7u); TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "5e308", 0u, 5u); TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e309", 0u, 5u); TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.0e310", 0u, 7u); TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.00e310", 0u, 8u); TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "-1.8e308", 0u, 8u); TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "-1e309", 0u, 6u); // Issue 1253 TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "2e308", 0u, 5u); // Issue 1259 TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "88474320368547737236837236775298547354737253685475547552933720368546854775297525" "29337203685468547770151233720097201372368547312337203687203685423685123372036872" "03685473724737236837236775297525854775297525472975254737236873720170151235473783" "7236737247372368772473723683723456789012E66", 0u, 283u); #if 0 // Test (length + exponent) overflow TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+2147483647", 0u, 13u); TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+9223372036854775807", 0u, 22u); TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+10000", 0u, 8u); TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+50000", 0u, 8u); #endif // 9007199254740992 * 2^971 ("infinity") TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.797693134862315907729305190789024733617976978942306572734300811577326758055009" "63132708477322407536021120113879871393357658789768814416622492847430639474124377" "76789342486548527630221960124609411945308295208500576883815068234246288147391311" "0540827237163350510684586298239947245938479716304835356329624224137216e+308", 0u, 315u); // TODO: // These tests (currently) fail in normal-precision mode if (fullPrecision) { // Half way between max-normal and infinity // Should round to infinity in nearest-even mode. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.797693134862315807937289714053034150799341327100378269361737789804449682927647" "50946649017977587207096330286416692887910946555547851940402630657488671505820681" "90890200070838367627385484581771153176447573027006985557136695962284291481986083" "49364752927190741684443655107043427115596995080930428801779041744977920000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000e+308", 0u, 1125u); // ...round up TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.797693134862315807937289714053034150799341327100378269361737789804449682927647" "50946649017977587207096330286416692887910946555547851940402630657488671505820681" "90890200070838367627385484581771153176447573027006985557136695962284291481986083" "49364752927190741684443655107043427115596995080930428801779041744977920000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000001e+308", 0u, 1205u); } TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "10000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000001", 0u, 310u); #undef TEST_NUMBER_ERROR } TEST(Reader, ParseNumberError_NormalPrecisionDouble) { TestParseNumberError(); } TEST(Reader, ParseNumberError_FullPrecisionDouble) { TestParseNumberError(); } template struct ParseStringHandler : BaseReaderHandler > { ParseStringHandler() : str_(0), length_(0), copy_() {} ~ParseStringHandler() { EXPECT_TRUE(str_ != 0); if (copy_) free(const_cast(str_)); } ParseStringHandler(const ParseStringHandler&); ParseStringHandler& operator=(const ParseStringHandler&); bool Default() { ADD_FAILURE(); return false; } bool String(const typename Encoding::Ch* str, size_t length, bool copy) { EXPECT_EQ(0, str_); if (copy) { str_ = static_cast(malloc((length + 1) * sizeof(typename Encoding::Ch))); memcpy(const_cast(str_), str, (length + 1) * sizeof(typename Encoding::Ch)); } else str_ = str; length_ = length; copy_ = copy; return true; } const typename Encoding::Ch* str_; size_t length_; bool copy_; }; TEST(Reader, ParseString) { #define TEST_STRING(Encoding, e, x) \ { \ Encoding::Ch* buffer = StrDup(x); \ GenericInsituStringStream is(buffer); \ ParseStringHandler h; \ GenericReader reader; \ reader.Parse(is, h); \ EXPECT_EQ(0, StrCmp(e, h.str_)); \ EXPECT_EQ(StrLen(e), h.length_); \ free(buffer); \ GenericStringStream s(x); \ ParseStringHandler h2; \ GenericReader reader2; \ reader2.Parse(s, h2); \ EXPECT_EQ(0, StrCmp(e, h2.str_)); \ EXPECT_EQ(StrLen(e), h2.length_); \ } // String constant L"\xXX" can only specify character code in bytes, which is not endianness-neutral. // And old compiler does not support u"" and U"" string literal. So here specify string literal by array of Ch. // In addition, GCC 4.8 generates -Wnarrowing warnings when character code >= 128 are assigned to signed integer types. // Therefore, utype is added for declaring unsigned array, and then cast it to Encoding::Ch. #define ARRAY(...) { __VA_ARGS__ } #define TEST_STRINGARRAY(Encoding, utype, array, x) \ { \ static const utype ue[] = array; \ static const Encoding::Ch* e = reinterpret_cast(&ue[0]); \ TEST_STRING(Encoding, e, x); \ } #define TEST_STRINGARRAY2(Encoding, utype, earray, xarray) \ { \ static const utype ue[] = earray; \ static const utype xe[] = xarray; \ static const Encoding::Ch* e = reinterpret_cast(&ue[0]); \ static const Encoding::Ch* x = reinterpret_cast(&xe[0]); \ TEST_STRING(Encoding, e, x); \ } TEST_STRING(UTF8<>, "", "\"\""); TEST_STRING(UTF8<>, "Hello", "\"Hello\""); TEST_STRING(UTF8<>, "Hello\nWorld", "\"Hello\\nWorld\""); TEST_STRING(UTF8<>, "\"\\/\b\f\n\r\t", "\"\\\"\\\\/\\b\\f\\n\\r\\t\""); TEST_STRING(UTF8<>, "\x24", "\"\\u0024\""); // Dollar sign U+0024 TEST_STRING(UTF8<>, "\xC2\xA2", "\"\\u00A2\""); // Cents sign U+00A2 TEST_STRING(UTF8<>, "\xE2\x82\xAC", "\"\\u20AC\""); // Euro sign U+20AC TEST_STRING(UTF8<>, "\xF0\x9D\x84\x9E", "\"\\uD834\\uDD1E\""); // G clef sign U+1D11E // UTF16 TEST_STRING(UTF16<>, L"", L"\"\""); TEST_STRING(UTF16<>, L"Hello", L"\"Hello\""); TEST_STRING(UTF16<>, L"Hello\nWorld", L"\"Hello\\nWorld\""); TEST_STRING(UTF16<>, L"\"\\/\b\f\n\r\t", L"\"\\\"\\\\/\\b\\f\\n\\r\\t\""); TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x0024, 0x0000), L"\"\\u0024\""); TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x00A2, 0x0000), L"\"\\u00A2\""); // Cents sign U+00A2 TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x20AC, 0x0000), L"\"\\u20AC\""); // Euro sign U+20AC TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0xD834, 0xDD1E, 0x0000), L"\"\\uD834\\uDD1E\""); // G clef sign U+1D11E // UTF32 TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('\0'), ARRAY('\"', '\"', '\0')); TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('H', 'e', 'l', 'l', 'o', '\0'), ARRAY('\"', 'H', 'e', 'l', 'l', 'o', '\"', '\0')); TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('H', 'e', 'l', 'l', 'o', '\n', 'W', 'o', 'r', 'l', 'd', '\0'), ARRAY('\"', 'H', 'e', 'l', 'l', 'o', '\\', 'n', 'W', 'o', 'r', 'l', 'd', '\"', '\0')); TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('\"', '\\', '/', '\b', '\f', '\n', '\r', '\t', '\0'), ARRAY('\"', '\\', '\"', '\\', '\\', '/', '\\', 'b', '\\', 'f', '\\', 'n', '\\', 'r', '\\', 't', '\"', '\0')); TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x00024, 0x0000), ARRAY('\"', '\\', 'u', '0', '0', '2', '4', '\"', '\0')); TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x000A2, 0x0000), ARRAY('\"', '\\', 'u', '0', '0', 'A', '2', '\"', '\0')); // Cents sign U+00A2 TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x020AC, 0x0000), ARRAY('\"', '\\', 'u', '2', '0', 'A', 'C', '\"', '\0')); // Euro sign U+20AC TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x1D11E, 0x0000), ARRAY('\"', '\\', 'u', 'D', '8', '3', '4', '\\', 'u', 'D', 'D', '1', 'E', '\"', '\0')); // G clef sign U+1D11E #undef TEST_STRINGARRAY #undef ARRAY #undef TEST_STRING // Support of null character in string { StringStream s("\"Hello\\u0000World\""); const char e[] = "Hello\0World"; ParseStringHandler > h; Reader reader; reader.Parse(s, h); EXPECT_EQ(0, memcmp(e, h.str_, h.length_ + 1)); EXPECT_EQ(11u, h.length_); } } TEST(Reader, ParseString_Transcoding) { const char* x = "\"Hello\""; const wchar_t* e = L"Hello"; GenericStringStream > is(x); GenericReader, UTF16<> > reader; ParseStringHandler > h; reader.Parse(is, h); EXPECT_EQ(0, StrCmp::Ch>(e, h.str_)); EXPECT_EQ(StrLen(e), h.length_); } TEST(Reader, ParseString_TranscodingWithValidation) { const char* x = "\"Hello\""; const wchar_t* e = L"Hello"; GenericStringStream > is(x); GenericReader, UTF16<> > reader; ParseStringHandler > h; reader.Parse(is, h); EXPECT_EQ(0, StrCmp::Ch>(e, h.str_)); EXPECT_EQ(StrLen(e), h.length_); } TEST(Reader, ParseString_NonDestructive) { StringStream s("\"Hello\\nWorld\""); ParseStringHandler > h; Reader reader; reader.Parse(s, h); EXPECT_EQ(0, StrCmp("Hello\nWorld", h.str_)); EXPECT_EQ(11u, h.length_); } template ParseErrorCode TestString(const typename Encoding::Ch* str) { GenericStringStream s(str); BaseReaderHandler h; GenericReader reader; reader.template Parse(s, h); return reader.GetParseErrorCode(); } TEST(Reader, ParseString_Error) { #define TEST_STRING_ERROR(errorCode, str, errorOffset, streamPos)\ {\ GenericStringStream > s(str);\ BaseReaderHandler > h;\ GenericReader , UTF8<> > reader;\ reader.Parse(s, h);\ EXPECT_EQ(errorCode, reader.GetParseErrorCode());\ EXPECT_EQ(errorOffset, reader.GetErrorOffset());\ EXPECT_EQ(streamPos, s.Tell());\ } #define ARRAY(...) { __VA_ARGS__ } #define TEST_STRINGENCODING_ERROR(Encoding, TargetEncoding, utype, array) \ { \ static const utype ue[] = array; \ static const Encoding::Ch* e = reinterpret_cast(&ue[0]); \ EXPECT_EQ(kParseErrorStringInvalidEncoding, TestString(e));\ /* decode error */\ GenericStringStream s(e);\ BaseReaderHandler h;\ GenericReader reader;\ reader.Parse(s, h);\ EXPECT_EQ(kParseErrorStringInvalidEncoding, reader.GetParseErrorCode());\ } // Invalid escape character in string. TEST_STRING_ERROR(kParseErrorStringEscapeInvalid, "[\"\\a\"]", 2u, 3u); // Incorrect hex digit after \\u escape in string. TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uABCG\"]", 2u, 7u); // Quotation in \\u escape in string (Issue #288) TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uaaa\"]", 2u, 7u); TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uD800\\uFFF\"]", 2u, 13u); // The surrogate pair in string is invalid. TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\uD800X\"]", 2u, 8u); TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\uD800\\uFFFF\"]", 2u, 14u); // Single low surrogate pair in string is invalid. TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\udc4d\"]", 2u, 8u); // Missing a closing quotation mark in string. TEST_STRING_ERROR(kParseErrorStringMissQuotationMark, "[\"Test]", 7u, 7u); // http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt // 3 Malformed sequences // 3.1 Unexpected continuation bytes { char e[] = { '[', '\"', 0, '\"', ']', '\0' }; for (unsigned char c = 0x80u; c <= 0xBFu; c++) { e[2] = static_cast(c); ParseErrorCode error = TestString >(e); EXPECT_EQ(kParseErrorStringInvalidEncoding, error); if (error != kParseErrorStringInvalidEncoding) std::cout << static_cast(c) << std::endl; } } // 3.2 Lonely start characters, 3.5 Impossible bytes { char e[] = { '[', '\"', 0, ' ', '\"', ']', '\0' }; for (unsigned c = 0xC0u; c <= 0xFFu; c++) { e[2] = static_cast(c); unsigned streamPos; if (c <= 0xC1u) streamPos = 3; // 0xC0 - 0xC1 else if (c <= 0xDFu) streamPos = 4; // 0xC2 - 0xDF else if (c <= 0xEFu) streamPos = 5; // 0xE0 - 0xEF else if (c <= 0xF4u) streamPos = 6; // 0xF0 - 0xF4 else streamPos = 3; // 0xF5 - 0xFF TEST_STRING_ERROR(kParseErrorStringInvalidEncoding, e, 2u, streamPos); } } // 4 Overlong sequences // 4.1 Examples of an overlong ASCII character TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC0u, 0xAFu, '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x80u, 0xAFu, '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x80u, 0x80u, 0xAFu, '\"', ']', '\0')); // 4.2 Maximum overlong sequences TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC1u, 0xBFu, '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x9Fu, 0xBFu, '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x8Fu, 0xBFu, 0xBFu, '\"', ']', '\0')); // 4.3 Overlong representation of the NUL character TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC0u, 0x80u, '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x80u, 0x80u, '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x80u, 0x80u, 0x80u, '\"', ']', '\0')); // 5 Illegal code positions // 5.1 Single UTF-16 surrogates TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xA0u, 0x80u, '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xADu, 0xBFu, '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xAEu, 0x80u, '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xAFu, 0xBFu, '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xB0u, 0x80u, '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xBEu, 0x80u, '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xBFu, 0xBFu, '\"', ']', '\0')); // Malform UTF-16 sequences TEST_STRINGENCODING_ERROR(UTF16<>, UTF8<>, wchar_t, ARRAY('[', '\"', 0xDC00, 0xDC00, '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(UTF16<>, UTF8<>, wchar_t, ARRAY('[', '\"', 0xD800, 0xD800, '\"', ']', '\0')); // Malform UTF-32 sequence TEST_STRINGENCODING_ERROR(UTF32<>, UTF8<>, unsigned, ARRAY('[', '\"', 0x110000, '\"', ']', '\0')); // Malform ASCII sequence TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x80u), '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x01u), '\"', ']', '\0')); TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x1Cu), '\"', ']', '\0')); #undef ARRAY #undef TEST_STRINGARRAY_ERROR } template struct ParseArrayHandler : BaseReaderHandler, ParseArrayHandler > { ParseArrayHandler() : step_(0) {} bool Default() { ADD_FAILURE(); return false; } bool Uint(unsigned i) { EXPECT_EQ(step_, i); step_++; return true; } bool StartArray() { EXPECT_EQ(0u, step_); step_++; return true; } bool EndArray(SizeType) { step_++; return true; } unsigned step_; }; TEST(Reader, ParseEmptyArray) { char *json = StrDup("[ ] "); InsituStringStream s(json); ParseArrayHandler<0> h; Reader reader; reader.Parse(s, h); EXPECT_EQ(2u, h.step_); free(json); } TEST(Reader, ParseArray) { char *json = StrDup("[1, 2, 3, 4]"); InsituStringStream s(json); ParseArrayHandler<4> h; Reader reader; reader.Parse(s, h); EXPECT_EQ(6u, h.step_); free(json); } TEST(Reader, ParseArray_Error) { #define TEST_ARRAY_ERROR(errorCode, str, errorOffset) \ { \ unsigned streamPos = errorOffset; \ char buffer[1001]; \ strncpy(buffer, str, 1000); \ InsituStringStream s(buffer); \ BaseReaderHandler<> h; \ GenericReader, UTF8<>, CrtAllocator> reader; \ EXPECT_FALSE(reader.Parse(s, h)); \ EXPECT_EQ(errorCode, reader.GetParseErrorCode());\ EXPECT_EQ(errorOffset, reader.GetErrorOffset());\ EXPECT_EQ(streamPos, s.Tell());\ } // Missing a comma or ']' after an array element. TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1", 2u); TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1}", 2u); TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1 2]", 3u); // Array cannot have a trailing comma (without kParseTrailingCommasFlag); // a value must follow a comma TEST_ARRAY_ERROR(kParseErrorValueInvalid, "[1,]", 3u); #undef TEST_ARRAY_ERROR } struct ParseObjectHandler : BaseReaderHandler, ParseObjectHandler> { ParseObjectHandler() : step_(0) {} bool Default() { ADD_FAILURE(); return false; } bool Null() { EXPECT_EQ(8u, step_); step_++; return true; } bool Bool(bool b) { switch(step_) { case 4: EXPECT_TRUE(b); step_++; return true; case 6: EXPECT_FALSE(b); step_++; return true; default: ADD_FAILURE(); return false; } } bool Int(int i) { switch(step_) { case 10: EXPECT_EQ(123, i); step_++; return true; case 15: EXPECT_EQ(1, i); step_++; return true; case 16: EXPECT_EQ(2, i); step_++; return true; case 17: EXPECT_EQ(3, i); step_++; return true; default: ADD_FAILURE(); return false; } } bool Uint(unsigned i) { return Int(static_cast(i)); } bool Double(double d) { EXPECT_EQ(12u, step_); EXPECT_DOUBLE_EQ(3.1416, d); step_++; return true; } bool String(const char* str, size_t, bool) { switch(step_) { case 1: EXPECT_STREQ("hello", str); step_++; return true; case 2: EXPECT_STREQ("world", str); step_++; return true; case 3: EXPECT_STREQ("t", str); step_++; return true; case 5: EXPECT_STREQ("f", str); step_++; return true; case 7: EXPECT_STREQ("n", str); step_++; return true; case 9: EXPECT_STREQ("i", str); step_++; return true; case 11: EXPECT_STREQ("pi", str); step_++; return true; case 13: EXPECT_STREQ("a", str); step_++; return true; default: ADD_FAILURE(); return false; } } bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; } bool EndObject(SizeType memberCount) { EXPECT_EQ(19u, step_); EXPECT_EQ(7u, memberCount); step_++; return true; } bool StartArray() { EXPECT_EQ(14u, step_); step_++; return true; } bool EndArray(SizeType elementCount) { EXPECT_EQ(18u, step_); EXPECT_EQ(3u, elementCount); step_++; return true; } unsigned step_; }; TEST(Reader, ParseObject) { const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] } "; // Insitu { char* json2 = StrDup(json); InsituStringStream s(json2); ParseObjectHandler h; Reader reader; reader.Parse(s, h); EXPECT_EQ(20u, h.step_); free(json2); } // Normal { StringStream s(json); ParseObjectHandler h; Reader reader; reader.Parse(s, h); EXPECT_EQ(20u, h.step_); } } struct ParseEmptyObjectHandler : BaseReaderHandler, ParseEmptyObjectHandler> { ParseEmptyObjectHandler() : step_(0) {} bool Default() { ADD_FAILURE(); return false; } bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; } bool EndObject(SizeType) { EXPECT_EQ(1u, step_); step_++; return true; } unsigned step_; }; TEST(Reader, Parse_EmptyObject) { StringStream s("{ } "); ParseEmptyObjectHandler h; Reader reader; reader.Parse(s, h); EXPECT_EQ(2u, h.step_); } struct ParseMultipleRootHandler : BaseReaderHandler, ParseMultipleRootHandler> { ParseMultipleRootHandler() : step_(0) {} bool Default() { ADD_FAILURE(); return false; } bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; } bool EndObject(SizeType) { EXPECT_EQ(1u, step_); step_++; return true; } bool StartArray() { EXPECT_EQ(2u, step_); step_++; return true; } bool EndArray(SizeType) { EXPECT_EQ(3u, step_); step_++; return true; } unsigned step_; }; template void TestMultipleRoot() { StringStream s("{}[] a"); ParseMultipleRootHandler h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); EXPECT_EQ(2u, h.step_); EXPECT_TRUE(reader.Parse(s, h)); EXPECT_EQ(4u, h.step_); EXPECT_EQ(' ', s.Take()); EXPECT_EQ('a', s.Take()); } TEST(Reader, Parse_MultipleRoot) { TestMultipleRoot(); } TEST(Reader, ParseIterative_MultipleRoot) { TestMultipleRoot(); } template void TestInsituMultipleRoot() { char* buffer = strdup("{}[] a"); InsituStringStream s(buffer); ParseMultipleRootHandler h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); EXPECT_EQ(2u, h.step_); EXPECT_TRUE(reader.Parse(s, h)); EXPECT_EQ(4u, h.step_); EXPECT_EQ(' ', s.Take()); EXPECT_EQ('a', s.Take()); free(buffer); } TEST(Reader, ParseInsitu_MultipleRoot) { TestInsituMultipleRoot(); } TEST(Reader, ParseInsituIterative_MultipleRoot) { TestInsituMultipleRoot(); } #define TEST_ERROR(errorCode, str, errorOffset) \ { \ unsigned streamPos = errorOffset; \ char buffer[1001]; \ strncpy(buffer, str, 1000); \ InsituStringStream s(buffer); \ BaseReaderHandler<> h; \ Reader reader; \ EXPECT_FALSE(reader.Parse(s, h)); \ EXPECT_EQ(errorCode, reader.GetParseErrorCode());\ EXPECT_EQ(errorOffset, reader.GetErrorOffset());\ EXPECT_EQ(streamPos, s.Tell());\ } TEST(Reader, ParseDocument_Error) { // The document is empty. TEST_ERROR(kParseErrorDocumentEmpty, "", 0u); TEST_ERROR(kParseErrorDocumentEmpty, " ", 1u); TEST_ERROR(kParseErrorDocumentEmpty, " \n", 2u); // The document root must not follow by other values. TEST_ERROR(kParseErrorDocumentRootNotSingular, "[] 0", 3u); TEST_ERROR(kParseErrorDocumentRootNotSingular, "{} 0", 3u); TEST_ERROR(kParseErrorDocumentRootNotSingular, "null []", 5u); TEST_ERROR(kParseErrorDocumentRootNotSingular, "0 {}", 2u); } TEST(Reader, ParseValue_Error) { // Invalid value. TEST_ERROR(kParseErrorValueInvalid, "nulL", 3u); TEST_ERROR(kParseErrorValueInvalid, "truE", 3u); TEST_ERROR(kParseErrorValueInvalid, "falsE", 4u); TEST_ERROR(kParseErrorValueInvalid, "a]", 0u); TEST_ERROR(kParseErrorValueInvalid, ".1", 0u); } TEST(Reader, ParseObject_Error) { // Missing a name for object member. TEST_ERROR(kParseErrorObjectMissName, "{1}", 1u); TEST_ERROR(kParseErrorObjectMissName, "{:1}", 1u); TEST_ERROR(kParseErrorObjectMissName, "{null:1}", 1u); TEST_ERROR(kParseErrorObjectMissName, "{true:1}", 1u); TEST_ERROR(kParseErrorObjectMissName, "{false:1}", 1u); TEST_ERROR(kParseErrorObjectMissName, "{1:1}", 1u); TEST_ERROR(kParseErrorObjectMissName, "{[]:1}", 1u); TEST_ERROR(kParseErrorObjectMissName, "{{}:1}", 1u); TEST_ERROR(kParseErrorObjectMissName, "{xyz:1}", 1u); // Missing a colon after a name of object member. TEST_ERROR(kParseErrorObjectMissColon, "{\"a\" 1}", 5u); TEST_ERROR(kParseErrorObjectMissColon, "{\"a\",1}", 4u); // Must be a comma or '}' after an object member TEST_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, "{\"a\":1]", 6u); // Object cannot have a trailing comma (without kParseTrailingCommasFlag); // an object member name must follow a comma TEST_ERROR(kParseErrorObjectMissName, "{\"a\":1,}", 7u); // This tests that MemoryStream is checking the length in Peek(). { MemoryStream ms("{\"a\"", 1); BaseReaderHandler<> h; Reader reader; EXPECT_FALSE(reader.Parse(ms, h)); EXPECT_EQ(kParseErrorObjectMissName, reader.GetParseErrorCode()); } } #undef TEST_ERROR TEST(Reader, SkipWhitespace) { StringStream ss(" A \t\tB\n \n\nC\r\r \rD \t\n\r E"); const char* expected = "ABCDE"; for (size_t i = 0; i < 5; i++) { SkipWhitespace(ss); EXPECT_EQ(expected[i], ss.Take()); } } // Test implementing a stream without copy stream optimization. // Clone from GenericStringStream except that copy constructor is disabled. template class CustomStringStream { public: typedef typename Encoding::Ch Ch; CustomStringStream(const Ch *src) : src_(src), head_(src) {} Ch Peek() const { return *src_; } Ch Take() { return *src_++; } size_t Tell() const { return static_cast(src_ - head_); } Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } void Put(Ch) { RAPIDJSON_ASSERT(false); } void Flush() { RAPIDJSON_ASSERT(false); } size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } private: // Prohibit copy constructor & assignment operator. CustomStringStream(const CustomStringStream&); CustomStringStream& operator=(const CustomStringStream&); const Ch* src_; //!< Current read position. const Ch* head_; //!< Original head of the string. }; // If the following code is compiled, it should generate compilation error as predicted. // Because CustomStringStream<> is not copyable via making copy constructor private. #if 0 namespace rapidjson { template struct StreamTraits > { enum { copyOptimization = 1 }; }; } // namespace rapidjson #endif TEST(Reader, CustomStringStream) { const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] } "; CustomStringStream > s(json); ParseObjectHandler h; Reader reader; reader.Parse(s, h); EXPECT_EQ(20u, h.step_); } #include class IStreamWrapper { public: typedef char Ch; IStreamWrapper(std::istream& is) : is_(is) {} Ch Peek() const { int c = is_.peek(); return c == std::char_traits::eof() ? '\0' : static_cast(c); } Ch Take() { int c = is_.get(); return c == std::char_traits::eof() ? '\0' : static_cast(c); } size_t Tell() const { return static_cast(is_.tellg()); } Ch* PutBegin() { assert(false); return 0; } void Put(Ch) { assert(false); } void Flush() { assert(false); } size_t PutEnd(Ch*) { assert(false); return 0; } private: IStreamWrapper(const IStreamWrapper&); IStreamWrapper& operator=(const IStreamWrapper&); std::istream& is_; }; class WIStreamWrapper { public: typedef wchar_t Ch; WIStreamWrapper(std::wistream& is) : is_(is) {} Ch Peek() const { unsigned c = is_.peek(); return c == std::char_traits::eof() ? Ch('\0') : static_cast(c); } Ch Take() { unsigned c = is_.get(); return c == std::char_traits::eof() ? Ch('\0') : static_cast(c); } size_t Tell() const { return static_cast(is_.tellg()); } Ch* PutBegin() { assert(false); return 0; } void Put(Ch) { assert(false); } void Flush() { assert(false); } size_t PutEnd(Ch*) { assert(false); return 0; } private: WIStreamWrapper(const WIStreamWrapper&); WIStreamWrapper& operator=(const WIStreamWrapper&); std::wistream& is_; }; TEST(Reader, Parse_IStreamWrapper_StringStream) { const char* json = "[1,2,3,4]"; std::stringstream ss(json); IStreamWrapper is(ss); Reader reader; ParseArrayHandler<4> h; reader.Parse(is, h); EXPECT_FALSE(reader.HasParseError()); } // Test iterative parsing. #define TESTERRORHANDLING(text, errorCode, offset)\ {\ unsigned streamPos = offset; \ StringStream json(text); \ BaseReaderHandler<> handler; \ Reader reader; \ reader.Parse(json, handler); \ EXPECT_TRUE(reader.HasParseError()); \ EXPECT_EQ(errorCode, reader.GetParseErrorCode()); \ EXPECT_EQ(offset, reader.GetErrorOffset()); \ EXPECT_EQ(streamPos, json.Tell()); \ } TEST(Reader, IterativeParsing_ErrorHandling) { TESTERRORHANDLING("{\"a\": a}", kParseErrorValueInvalid, 6u); TESTERRORHANDLING("", kParseErrorDocumentEmpty, 0u); TESTERRORHANDLING("{}{}", kParseErrorDocumentRootNotSingular, 2u); TESTERRORHANDLING("{1}", kParseErrorObjectMissName, 1u); TESTERRORHANDLING("{\"a\", 1}", kParseErrorObjectMissColon, 4u); TESTERRORHANDLING("{\"a\"}", kParseErrorObjectMissColon, 4u); TESTERRORHANDLING("{\"a\": 1", kParseErrorObjectMissCommaOrCurlyBracket, 7u); TESTERRORHANDLING("[1 2 3]", kParseErrorArrayMissCommaOrSquareBracket, 3u); TESTERRORHANDLING("{\"a: 1", kParseErrorStringMissQuotationMark, 6u); TESTERRORHANDLING("{\"a\":}", kParseErrorValueInvalid, 5u); TESTERRORHANDLING("{\"a\":]", kParseErrorValueInvalid, 5u); TESTERRORHANDLING("[1,2,}", kParseErrorValueInvalid, 5u); TESTERRORHANDLING("[}]", kParseErrorValueInvalid, 1u); TESTERRORHANDLING("[,]", kParseErrorValueInvalid, 1u); TESTERRORHANDLING("[1,,]", kParseErrorValueInvalid, 3u); // Trailing commas are not allowed without kParseTrailingCommasFlag TESTERRORHANDLING("{\"a\": 1,}", kParseErrorObjectMissName, 8u); TESTERRORHANDLING("[1,2,3,]", kParseErrorValueInvalid, 7u); // Any JSON value can be a valid root element in RFC7159. TESTERRORHANDLING("\"ab", kParseErrorStringMissQuotationMark, 3u); TESTERRORHANDLING("truE", kParseErrorValueInvalid, 3u); TESTERRORHANDLING("False", kParseErrorValueInvalid, 0u); TESTERRORHANDLING("true, false", kParseErrorDocumentRootNotSingular, 4u); TESTERRORHANDLING("false, false", kParseErrorDocumentRootNotSingular, 5u); TESTERRORHANDLING("nulL", kParseErrorValueInvalid, 3u); TESTERRORHANDLING("null , null", kParseErrorDocumentRootNotSingular, 5u); TESTERRORHANDLING("1a", kParseErrorDocumentRootNotSingular, 1u); } template > struct IterativeParsingReaderHandler { typedef typename Encoding::Ch Ch; const static uint32_t LOG_NULL = 0x10000000; const static uint32_t LOG_BOOL = 0x20000000; const static uint32_t LOG_INT = 0x30000000; const static uint32_t LOG_UINT = 0x40000000; const static uint32_t LOG_INT64 = 0x50000000; const static uint32_t LOG_UINT64 = 0x60000000; const static uint32_t LOG_DOUBLE = 0x70000000; const static uint32_t LOG_STRING = 0x80000000; const static uint32_t LOG_STARTOBJECT = 0x90000000; const static uint32_t LOG_KEY = 0xA0000000; const static uint32_t LOG_ENDOBJECT = 0xB0000000; const static uint32_t LOG_STARTARRAY = 0xC0000000; const static uint32_t LOG_ENDARRAY = 0xD0000000; const static size_t LogCapacity = 256; uint32_t Logs[LogCapacity]; size_t LogCount; IterativeParsingReaderHandler() : LogCount(0) { } bool Null() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_NULL; return true; } bool Bool(bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_BOOL; return true; } bool Int(int) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT; return true; } bool Uint(unsigned) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT; return true; } bool Int64(int64_t) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT64; return true; } bool Uint64(uint64_t) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_UINT64; return true; } bool Double(double) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_DOUBLE; return true; } bool RawNumber(const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STRING; return true; } bool String(const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STRING; return true; } bool StartObject() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTOBJECT; return true; } bool Key (const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_KEY; return true; } bool EndObject(SizeType c) { RAPIDJSON_ASSERT(LogCount < LogCapacity); RAPIDJSON_ASSERT((static_cast(c) & 0xF0000000) == 0); Logs[LogCount++] = LOG_ENDOBJECT | static_cast(c); return true; } bool StartArray() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTARRAY; return true; } bool EndArray(SizeType c) { RAPIDJSON_ASSERT(LogCount < LogCapacity); RAPIDJSON_ASSERT((static_cast(c) & 0xF0000000) == 0); Logs[LogCount++] = LOG_ENDARRAY | static_cast(c); return true; } }; TEST(Reader, IterativeParsing_General) { { StringStream is("[1, {\"k\": [1, 2]}, null, false, true, \"string\", 1.2]"); Reader reader; IterativeParsingReaderHandler<> handler; ParseResult r = reader.Parse(is, handler); EXPECT_FALSE(r.IsError()); EXPECT_FALSE(reader.HasParseError()); uint32_t e[] = { handler.LOG_STARTARRAY, handler.LOG_INT, handler.LOG_STARTOBJECT, handler.LOG_KEY, handler.LOG_STARTARRAY, handler.LOG_INT, handler.LOG_INT, handler.LOG_ENDARRAY | 2, handler.LOG_ENDOBJECT | 1, handler.LOG_NULL, handler.LOG_BOOL, handler.LOG_BOOL, handler.LOG_STRING, handler.LOG_DOUBLE, handler.LOG_ENDARRAY | 7 }; EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount); for (size_t i = 0; i < handler.LogCount; ++i) { EXPECT_EQ(e[i], handler.Logs[i]) << "i = " << i; } } } TEST(Reader, IterativeParsing_Count) { { StringStream is("[{}, {\"k\": 1}, [1], []]"); Reader reader; IterativeParsingReaderHandler<> handler; ParseResult r = reader.Parse(is, handler); EXPECT_FALSE(r.IsError()); EXPECT_FALSE(reader.HasParseError()); uint32_t e[] = { handler.LOG_STARTARRAY, handler.LOG_STARTOBJECT, handler.LOG_ENDOBJECT | 0, handler.LOG_STARTOBJECT, handler.LOG_KEY, handler.LOG_INT, handler.LOG_ENDOBJECT | 1, handler.LOG_STARTARRAY, handler.LOG_INT, handler.LOG_ENDARRAY | 1, handler.LOG_STARTARRAY, handler.LOG_ENDARRAY | 0, handler.LOG_ENDARRAY | 4 }; EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount); for (size_t i = 0; i < handler.LogCount; ++i) { EXPECT_EQ(e[i], handler.Logs[i]) << "i = " << i; } } } TEST(Reader, IterativePullParsing_General) { { IterativeParsingReaderHandler<> handler; uint32_t e[] = { handler.LOG_STARTARRAY, handler.LOG_INT, handler.LOG_STARTOBJECT, handler.LOG_KEY, handler.LOG_STARTARRAY, handler.LOG_INT, handler.LOG_INT, handler.LOG_ENDARRAY | 2, handler.LOG_ENDOBJECT | 1, handler.LOG_NULL, handler.LOG_BOOL, handler.LOG_BOOL, handler.LOG_STRING, handler.LOG_DOUBLE, handler.LOG_ENDARRAY | 7 }; StringStream is("[1, {\"k\": [1, 2]}, null, false, true, \"string\", 1.2]"); Reader reader; reader.IterativeParseInit(); while (!reader.IterativeParseComplete()) { size_t oldLogCount = handler.LogCount; EXPECT_TRUE(oldLogCount < sizeof(e) / sizeof(int)) << "overrun"; EXPECT_TRUE(reader.IterativeParseNext(is, handler)) << "parse fail"; EXPECT_EQ(handler.LogCount, oldLogCount + 1) << "handler should be invoked exactly once each time"; EXPECT_EQ(e[oldLogCount], handler.Logs[oldLogCount]) << "wrong event returned"; } EXPECT_FALSE(reader.HasParseError()); EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount) << "handler invoked wrong number of times"; // The handler should not be invoked when the JSON has been fully read, but it should not fail size_t oldLogCount = handler.LogCount; EXPECT_TRUE(reader.IterativeParseNext(is, handler)) << "parse-next past complete is allowed"; EXPECT_EQ(handler.LogCount, oldLogCount) << "parse-next past complete should not invoke handler"; EXPECT_FALSE(reader.HasParseError()) << "parse-next past complete should not generate parse error"; } } // Test iterative parsing on kParseErrorTermination. struct HandlerTerminateAtStartObject : public IterativeParsingReaderHandler<> { bool StartObject() { return false; } }; struct HandlerTerminateAtStartArray : public IterativeParsingReaderHandler<> { bool StartArray() { return false; } }; struct HandlerTerminateAtEndObject : public IterativeParsingReaderHandler<> { bool EndObject(SizeType) { return false; } }; struct HandlerTerminateAtEndArray : public IterativeParsingReaderHandler<> { bool EndArray(SizeType) { return false; } }; TEST(Reader, IterativeParsing_ShortCircuit) { { HandlerTerminateAtStartObject handler; Reader reader; StringStream is("[1, {}]"); ParseResult r = reader.Parse(is, handler); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorTermination, r.Code()); EXPECT_EQ(4u, r.Offset()); } { HandlerTerminateAtStartArray handler; Reader reader; StringStream is("{\"a\": []}"); ParseResult r = reader.Parse(is, handler); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorTermination, r.Code()); EXPECT_EQ(6u, r.Offset()); } { HandlerTerminateAtEndObject handler; Reader reader; StringStream is("[1, {}]"); ParseResult r = reader.Parse(is, handler); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorTermination, r.Code()); EXPECT_EQ(5u, r.Offset()); } { HandlerTerminateAtEndArray handler; Reader reader; StringStream is("{\"a\": []}"); ParseResult r = reader.Parse(is, handler); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorTermination, r.Code()); EXPECT_EQ(7u, r.Offset()); } } // For covering BaseReaderHandler default functions TEST(Reader, BaseReaderHandler_Default) { BaseReaderHandler<> h; Reader reader; StringStream is("[null, true, -1, 1, -1234567890123456789, 1234567890123456789, 3.14, \"s\", { \"a\" : 1 }]"); EXPECT_TRUE(reader.Parse(is, h)); } template struct TerminateHandler { bool Null() { return e != 0; } bool Bool(bool) { return e != 1; } bool Int(int) { return e != 2; } bool Uint(unsigned) { return e != 3; } bool Int64(int64_t) { return e != 4; } bool Uint64(uint64_t) { return e != 5; } bool Double(double) { return e != 6; } bool RawNumber(const char*, SizeType, bool) { return e != 7; } bool String(const char*, SizeType, bool) { return e != 8; } bool StartObject() { return e != 9; } bool Key(const char*, SizeType, bool) { return e != 10; } bool EndObject(SizeType) { return e != 11; } bool StartArray() { return e != 12; } bool EndArray(SizeType) { return e != 13; } }; #define TEST_TERMINATION(e, json)\ {\ Reader reader;\ TerminateHandler h;\ StringStream is(json);\ EXPECT_FALSE(reader.Parse(is, h));\ EXPECT_EQ(kParseErrorTermination, reader.GetParseErrorCode());\ } TEST(Reader, ParseTerminationByHandler) { TEST_TERMINATION(0, "[null"); TEST_TERMINATION(1, "[true"); TEST_TERMINATION(1, "[false"); TEST_TERMINATION(2, "[-1"); TEST_TERMINATION(3, "[1"); TEST_TERMINATION(4, "[-1234567890123456789"); TEST_TERMINATION(5, "[1234567890123456789"); TEST_TERMINATION(6, "[0.5]"); // RawNumber() is never called TEST_TERMINATION(8, "[\"a\""); TEST_TERMINATION(9, "[{"); TEST_TERMINATION(10, "[{\"a\""); TEST_TERMINATION(11, "[{}"); TEST_TERMINATION(11, "[{\"a\":1}"); // non-empty object TEST_TERMINATION(12, "{\"a\":["); TEST_TERMINATION(13, "{\"a\":[]"); TEST_TERMINATION(13, "{\"a\":[1]"); // non-empty array } TEST(Reader, ParseComments) { const char* json = "// Here is a one-line comment.\n" "{// And here's another one\n" " /*And here's an in-line one.*/\"hello\" : \"world\"," " \"t\" :/* And one with '*' symbol*/true ," "/* A multiline comment\n" " goes here*/" " \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3]" "}/*And the last one to be sure */"; StringStream s(json); ParseObjectHandler h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); EXPECT_EQ(20u, h.step_); } TEST(Reader, ParseEmptyInlineComment) { const char* json = "{/**/\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }"; StringStream s(json); ParseObjectHandler h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); EXPECT_EQ(20u, h.step_); } TEST(Reader, ParseEmptyOnelineComment) { const char* json = "{//\n\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }"; StringStream s(json); ParseObjectHandler h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); EXPECT_EQ(20u, h.step_); } TEST(Reader, ParseMultipleCommentsInARow) { const char* json = "{/* first comment *//* second */\n" "/* third */ /*fourth*/// last one\n" "\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }"; StringStream s(json); ParseObjectHandler h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); EXPECT_EQ(20u, h.step_); } TEST(Reader, InlineCommentsAreDisabledByDefault) { { const char* json = "{/* Inline comment. */\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }"; StringStream s(json); ParseObjectHandler h; Reader reader; EXPECT_FALSE(reader.Parse(s, h)); } { const char* json = "{\"hello\" : /* Multiline comment starts here\n" " continues here\n" " and ends here */\"world\", \"t\" :true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }"; StringStream s(json); ParseObjectHandler h; Reader reader; EXPECT_FALSE(reader.Parse(s, h)); } } TEST(Reader, OnelineCommentsAreDisabledByDefault) { const char* json = "{// One-line comment\n\"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }"; StringStream s(json); ParseObjectHandler h; Reader reader; EXPECT_FALSE(reader.Parse(s, h)); } TEST(Reader, EofAfterOneLineComment) { const char* json = "{\"hello\" : \"world\" // EOF is here -->\0 \n}"; StringStream s(json); ParseObjectHandler h; Reader reader; EXPECT_FALSE(reader.Parse(s, h)); EXPECT_EQ(kParseErrorObjectMissCommaOrCurlyBracket, reader.GetParseErrorCode()); } TEST(Reader, IncompleteMultilineComment) { const char* json = "{\"hello\" : \"world\" /* EOF is here -->\0 */}"; StringStream s(json); ParseObjectHandler h; Reader reader; EXPECT_FALSE(reader.Parse(s, h)); EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode()); } TEST(Reader, IncompleteMultilineComment2) { const char* json = "{\"hello\" : \"world\" /* *\0 */}"; StringStream s(json); ParseObjectHandler h; Reader reader; EXPECT_FALSE(reader.Parse(s, h)); EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode()); } TEST(Reader, UnrecognizedComment) { const char* json = "{\"hello\" : \"world\" /! }"; StringStream s(json); ParseObjectHandler h; Reader reader; EXPECT_FALSE(reader.Parse(s, h)); EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode()); } struct NumbersAsStringsHandler { bool Null() { return true; } bool Bool(bool) { return true; } bool Int(int) { return true; } bool Uint(unsigned) { return true; } bool Int64(int64_t) { return true; } bool Uint64(uint64_t) { return true; } bool Double(double) { return true; } // 'str' is not null-terminated bool RawNumber(const char* str, SizeType length, bool) { EXPECT_TRUE(str != 0); EXPECT_TRUE(expected_len_ == length); EXPECT_TRUE(strncmp(str, expected_, length) == 0); return true; } bool String(const char*, SizeType, bool) { return true; } bool StartObject() { return true; } bool Key(const char*, SizeType, bool) { return true; } bool EndObject(SizeType) { return true; } bool StartArray() { return true; } bool EndArray(SizeType) { return true; } NumbersAsStringsHandler(const char* expected) : expected_(expected) , expected_len_(strlen(expected)) {} const char* expected_; size_t expected_len_; }; TEST(Reader, NumbersAsStrings) { { const char* json = "{ \"pi\": 3.1416 } "; StringStream s(json); NumbersAsStringsHandler h("3.1416"); Reader reader; EXPECT_TRUE(reader.Parse(s, h)); } { char* json = StrDup("{ \"pi\": 3.1416 } "); InsituStringStream s(json); NumbersAsStringsHandler h("3.1416"); Reader reader; EXPECT_TRUE(reader.Parse(s, h)); free(json); } { const char* json = "{ \"gigabyte\": 1.0e9 } "; StringStream s(json); NumbersAsStringsHandler h("1.0e9"); Reader reader; EXPECT_TRUE(reader.Parse(s, h)); } { char* json = StrDup("{ \"gigabyte\": 1.0e9 } "); InsituStringStream s(json); NumbersAsStringsHandler h("1.0e9"); Reader reader; EXPECT_TRUE(reader.Parse(s, h)); free(json); } { const char* json = "{ \"pi\": 314.159e-2 } "; StringStream s(json); NumbersAsStringsHandler h("314.159e-2"); Reader reader; EXPECT_TRUE(reader.Parse(s, h)); } { char* json = StrDup("{ \"gigabyte\": 314.159e-2 } "); InsituStringStream s(json); NumbersAsStringsHandler h("314.159e-2"); Reader reader; EXPECT_TRUE(reader.Parse(s, h)); free(json); } { const char* json = "{ \"negative\": -1.54321 } "; StringStream s(json); NumbersAsStringsHandler h("-1.54321"); Reader reader; EXPECT_TRUE(reader.Parse(s, h)); } { char* json = StrDup("{ \"negative\": -1.54321 } "); InsituStringStream s(json); NumbersAsStringsHandler h("-1.54321"); Reader reader; EXPECT_TRUE(reader.Parse(s, h)); free(json); } { const char* json = "{ \"pi\": 314.159e-2 } "; std::stringstream ss(json); IStreamWrapper s(ss); NumbersAsStringsHandler h("314.159e-2"); Reader reader; EXPECT_TRUE(reader.Parse(s, h)); } { char n1e319[321]; // '1' followed by 319 '0' n1e319[0] = '1'; for (int i = 1; i < 320; i++) n1e319[i] = '0'; n1e319[320] = '\0'; StringStream s(n1e319); NumbersAsStringsHandler h(n1e319); Reader reader; EXPECT_TRUE(reader.Parse(s, h)); } } struct NumbersAsStringsHandlerWChar_t { bool Null() { return true; } bool Bool(bool) { return true; } bool Int(int) { return true; } bool Uint(unsigned) { return true; } bool Int64(int64_t) { return true; } bool Uint64(uint64_t) { return true; } bool Double(double) { return true; } // 'str' is not null-terminated bool RawNumber(const wchar_t* str, SizeType length, bool) { EXPECT_TRUE(str != 0); EXPECT_TRUE(expected_len_ == length); EXPECT_TRUE(wcsncmp(str, expected_, length) == 0); return true; } bool String(const wchar_t*, SizeType, bool) { return true; } bool StartObject() { return true; } bool Key(const wchar_t*, SizeType, bool) { return true; } bool EndObject(SizeType) { return true; } bool StartArray() { return true; } bool EndArray(SizeType) { return true; } NumbersAsStringsHandlerWChar_t(const wchar_t* expected) : expected_(expected) , expected_len_(wcslen(expected)) {} const wchar_t* expected_; size_t expected_len_; }; TEST(Reader, NumbersAsStringsWChar_t) { { const wchar_t* json = L"{ \"pi\": 3.1416 } "; GenericStringStream > s(json); NumbersAsStringsHandlerWChar_t h(L"3.1416"); GenericReader, UTF16<> > reader; EXPECT_TRUE(reader.Parse(s, h)); } { wchar_t* json = StrDup(L"{ \"pi\": 3.1416 } "); GenericInsituStringStream > s(json); NumbersAsStringsHandlerWChar_t h(L"3.1416"); GenericReader, UTF16<> > reader; EXPECT_TRUE(reader.Parse(s, h)); free(json); } { const wchar_t* json = L"{ \"gigabyte\": 1.0e9 } "; GenericStringStream > s(json); NumbersAsStringsHandlerWChar_t h(L"1.0e9"); GenericReader, UTF16<> > reader; EXPECT_TRUE(reader.Parse(s, h)); } { wchar_t* json = StrDup(L"{ \"gigabyte\": 1.0e9 } "); GenericInsituStringStream > s(json); NumbersAsStringsHandlerWChar_t h(L"1.0e9"); GenericReader, UTF16<> > reader; EXPECT_TRUE(reader.Parse(s, h)); free(json); } { const wchar_t* json = L"{ \"pi\": 314.159e-2 } "; GenericStringStream > s(json); NumbersAsStringsHandlerWChar_t h(L"314.159e-2"); GenericReader, UTF16<> > reader; EXPECT_TRUE(reader.Parse(s, h)); } { wchar_t* json = StrDup(L"{ \"gigabyte\": 314.159e-2 } "); GenericInsituStringStream > s(json); NumbersAsStringsHandlerWChar_t h(L"314.159e-2"); GenericReader, UTF16<> > reader; EXPECT_TRUE(reader.Parse(s, h)); free(json); } { const wchar_t* json = L"{ \"negative\": -1.54321 } "; GenericStringStream > s(json); NumbersAsStringsHandlerWChar_t h(L"-1.54321"); GenericReader, UTF16<> > reader; EXPECT_TRUE(reader.Parse(s, h)); } { wchar_t* json = StrDup(L"{ \"negative\": -1.54321 } "); GenericInsituStringStream > s(json); NumbersAsStringsHandlerWChar_t h(L"-1.54321"); GenericReader, UTF16<> > reader; EXPECT_TRUE(reader.Parse(s, h)); free(json); } { const wchar_t* json = L"{ \"pi\": 314.159e-2 } "; std::wstringstream ss(json); WIStreamWrapper s(ss); NumbersAsStringsHandlerWChar_t h(L"314.159e-2"); GenericReader, UTF16<> > reader; EXPECT_TRUE(reader.Parse(s, h)); } { wchar_t n1e319[321]; // '1' followed by 319 '0' n1e319[0] = L'1'; for(int i = 1; i < 320; i++) n1e319[i] = L'0'; n1e319[320] = L'\0'; GenericStringStream > s(n1e319); NumbersAsStringsHandlerWChar_t h(n1e319); GenericReader, UTF16<> > reader; EXPECT_TRUE(reader.Parse(s, h)); } } template void TestTrailingCommas() { { StringStream s("[1,2,3,]"); ParseArrayHandler<3> h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); EXPECT_EQ(5u, h.step_); } { const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false," "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3],}"; StringStream s(json); ParseObjectHandler h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); EXPECT_EQ(20u, h.step_); } { // whitespace around trailing commas const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false," "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3\n,\n]\n,\n} "; StringStream s(json); ParseObjectHandler h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); EXPECT_EQ(20u, h.step_); } { // comments around trailing commas const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null," "\"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3/*test*/,/*test*/]/*test*/,/*test*/}"; StringStream s(json); ParseObjectHandler h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); EXPECT_EQ(20u, h.step_); } } TEST(Reader, TrailingCommas) { TestTrailingCommas(); } TEST(Reader, TrailingCommasIterative) { TestTrailingCommas(); } template void TestMultipleTrailingCommaErrors() { // only a single trailing comma is allowed. { StringStream s("[1,2,3,,]"); ParseArrayHandler<3> h; Reader reader; ParseResult r = reader.Parse(s, h); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorValueInvalid, r.Code()); EXPECT_EQ(7u, r.Offset()); } { const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false," "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3,],,}"; StringStream s(json); ParseObjectHandler h; Reader reader; ParseResult r = reader.Parse(s, h); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorObjectMissName, r.Code()); EXPECT_EQ(95u, r.Offset()); } } TEST(Reader, MultipleTrailingCommaErrors) { TestMultipleTrailingCommaErrors(); } TEST(Reader, MultipleTrailingCommaErrorsIterative) { TestMultipleTrailingCommaErrors(); } template void TestEmptyExceptForCommaErrors() { // not allowed even with trailing commas enabled; the // trailing comma must follow a value. { StringStream s("[,]"); ParseArrayHandler<3> h; Reader reader; ParseResult r = reader.Parse(s, h); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorValueInvalid, r.Code()); EXPECT_EQ(1u, r.Offset()); } { StringStream s("{,}"); ParseObjectHandler h; Reader reader; ParseResult r = reader.Parse(s, h); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorObjectMissName, r.Code()); EXPECT_EQ(1u, r.Offset()); } } TEST(Reader, EmptyExceptForCommaErrors) { TestEmptyExceptForCommaErrors(); } TEST(Reader, EmptyExceptForCommaErrorsIterative) { TestEmptyExceptForCommaErrors(); } template void TestTrailingCommaHandlerTermination() { { HandlerTerminateAtEndArray h; Reader reader; StringStream s("[1,2,3,]"); ParseResult r = reader.Parse(s, h); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorTermination, r.Code()); EXPECT_EQ(7u, r.Offset()); } { HandlerTerminateAtEndObject h; Reader reader; StringStream s("{\"t\": true, \"f\": false,}"); ParseResult r = reader.Parse(s, h); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorTermination, r.Code()); EXPECT_EQ(23u, r.Offset()); } } TEST(Reader, TrailingCommaHandlerTermination) { TestTrailingCommaHandlerTermination(); } TEST(Reader, TrailingCommaHandlerTerminationIterative) { TestTrailingCommaHandlerTermination(); } TEST(Reader, ParseNanAndInfinity) { #define TEST_NAN_INF(str, x) \ { \ { \ StringStream s(str); \ ParseDoubleHandler h; \ Reader reader; \ ASSERT_EQ(kParseErrorNone, reader.Parse(s, h).Code()); \ EXPECT_EQ(1u, h.step_); \ internal::Double e(x), a(h.actual_); \ EXPECT_EQ(e.IsNan(), a.IsNan()); \ EXPECT_EQ(e.IsInf(), a.IsInf()); \ if (!e.IsNan()) \ EXPECT_EQ(e.Sign(), a.Sign()); \ } \ { \ const char* json = "{ \"naninfdouble\": " str " } "; \ StringStream s(json); \ NumbersAsStringsHandler h(str); \ Reader reader; \ EXPECT_TRUE(reader.Parse(s, h)); \ } \ { \ char* json = StrDup("{ \"naninfdouble\": " str " } "); \ InsituStringStream s(json); \ NumbersAsStringsHandler h(str); \ Reader reader; \ EXPECT_TRUE(reader.Parse(s, h)); \ free(json); \ } \ } #define TEST_NAN_INF_ERROR(errorCode, str, errorOffset) \ { \ unsigned streamPos = errorOffset; \ char buffer[1001]; \ strncpy(buffer, str, 1000); \ InsituStringStream s(buffer); \ BaseReaderHandler<> h; \ Reader reader; \ EXPECT_FALSE(reader.Parse(s, h)); \ EXPECT_EQ(errorCode, reader.GetParseErrorCode());\ EXPECT_EQ(errorOffset, reader.GetErrorOffset());\ EXPECT_EQ(streamPos, s.Tell());\ } double nan = std::numeric_limits::quiet_NaN(); double inf = std::numeric_limits::infinity(); TEST_NAN_INF("NaN", nan); TEST_NAN_INF("-NaN", nan); TEST_NAN_INF("Inf", inf); TEST_NAN_INF("Infinity", inf); TEST_NAN_INF("-Inf", -inf); TEST_NAN_INF("-Infinity", -inf); TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NInf", 1u); TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NaInf", 2u); TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "INan", 1u); TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "InNan", 2u); TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "nan", 1u); TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-nan", 1u); TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NAN", 1u); TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-Infinty", 6u); #undef TEST_NAN_INF_ERROR #undef TEST_NAN_INF } TEST(Reader, EscapedApostrophe) { const char json[] = " { \"foo\": \"bar\\'buzz\" } "; BaseReaderHandler<> h; { StringStream s(json); Reader reader; ParseResult r = reader.Parse(s, h); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorStringEscapeInvalid, r.Code()); EXPECT_EQ(14u, r.Offset()); } { StringStream s(json); Reader reader; ParseResult r = reader.Parse(s, h); EXPECT_FALSE(reader.HasParseError()); EXPECT_EQ(kParseErrorNone, r.Code()); EXPECT_EQ(0u, r.Offset()); } } RAPIDJSON_DIAG_POP asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/istreamwrappertest.cpp0000644000000000000000000001244715031566105027230 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/istreamwrapper.h" #include "rapidjson/encodedstream.h" #include "rapidjson/document.h" #include #include #if defined(_MSC_VER) && !defined(__clang__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(4702) // unreachable code #endif using namespace rapidjson; using namespace std; template static void TestStringStream() { typedef typename StringStreamType::char_type Ch; { StringStreamType iss; BasicIStreamWrapper is(iss); EXPECT_EQ(0u, is.Tell()); if (sizeof(Ch) == 1) { EXPECT_EQ(0, is.Peek4()); EXPECT_EQ(0u, is.Tell()); } EXPECT_EQ(0, is.Peek()); EXPECT_EQ(0, is.Take()); EXPECT_EQ(0u, is.Tell()); } { Ch s[] = { 'A', 'B', 'C', '\0' }; StringStreamType iss(s); BasicIStreamWrapper is(iss); EXPECT_EQ(0u, is.Tell()); if (sizeof(Ch) == 1) { EXPECT_EQ(0, is.Peek4()); // less than 4 bytes } for (int i = 0; i < 3; i++) { EXPECT_EQ(static_cast(i), is.Tell()); EXPECT_EQ('A' + i, is.Peek()); EXPECT_EQ('A' + i, is.Peek()); EXPECT_EQ('A' + i, is.Take()); } EXPECT_EQ(3u, is.Tell()); EXPECT_EQ(0, is.Peek()); EXPECT_EQ(0, is.Take()); } { Ch s[] = { 'A', 'B', 'C', 'D', 'E', '\0' }; StringStreamType iss(s); BasicIStreamWrapper is(iss); if (sizeof(Ch) == 1) { const Ch* c = is.Peek4(); for (int i = 0; i < 4; i++) EXPECT_EQ('A' + i, c[i]); EXPECT_EQ(0u, is.Tell()); } for (int i = 0; i < 5; i++) { EXPECT_EQ(static_cast(i), is.Tell()); EXPECT_EQ('A' + i, is.Peek()); EXPECT_EQ('A' + i, is.Peek()); EXPECT_EQ('A' + i, is.Take()); } EXPECT_EQ(5u, is.Tell()); EXPECT_EQ(0, is.Peek()); EXPECT_EQ(0, is.Take()); } } TEST(IStreamWrapper, istringstream) { TestStringStream(); } TEST(IStreamWrapper, stringstream) { TestStringStream(); } TEST(IStreamWrapper, wistringstream) { TestStringStream(); } TEST(IStreamWrapper, wstringstream) { TestStringStream(); } template static bool Open(FileStreamType& fs, const char* filename) { const char *paths[] = { "encodings", "bin/encodings", "../bin/encodings", "../../bin/encodings", "../../../bin/encodings" }; char buffer[1024]; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { sprintf(buffer, "%s/%s", paths[i], filename); fs.open(buffer, ios_base::in | ios_base::binary); if (fs.is_open()) return true; } return false; } TEST(IStreamWrapper, ifstream) { ifstream ifs; ASSERT_TRUE(Open(ifs, "utf8bom.json")); IStreamWrapper isw(ifs); EncodedInputStream, IStreamWrapper> eis(isw); Document d; EXPECT_TRUE(!d.ParseStream(eis).HasParseError()); EXPECT_TRUE(d.IsObject()); EXPECT_EQ(5u, d.MemberCount()); } TEST(IStreamWrapper, fstream) { fstream fs; ASSERT_TRUE(Open(fs, "utf8bom.json")); IStreamWrapper isw(fs); EncodedInputStream, IStreamWrapper> eis(isw); Document d; EXPECT_TRUE(!d.ParseStream(eis).HasParseError()); EXPECT_TRUE(d.IsObject()); EXPECT_EQ(5u, d.MemberCount()); } // wifstream/wfstream only works on C++11 with codecvt_utf16 // But many C++11 library still not have it. #if 0 #include TEST(IStreamWrapper, wifstream) { wifstream ifs; ASSERT_TRUE(Open(ifs, "utf16bebom.json")); ifs.imbue(std::locale(ifs.getloc(), new std::codecvt_utf16)); WIStreamWrapper isw(ifs); GenericDocument > d; d.ParseStream, WIStreamWrapper>(isw); EXPECT_TRUE(!d.HasParseError()); EXPECT_TRUE(d.IsObject()); EXPECT_EQ(5, d.MemberCount()); } TEST(IStreamWrapper, wfstream) { wfstream fs; ASSERT_TRUE(Open(fs, "utf16bebom.json")); fs.imbue(std::locale(fs.getloc(), new std::codecvt_utf16)); WIStreamWrapper isw(fs); GenericDocument > d; d.ParseStream, WIStreamWrapper>(isw); EXPECT_TRUE(!d.HasParseError()); EXPECT_TRUE(d.IsObject()); EXPECT_EQ(5, d.MemberCount()); } #endif #if defined(_MSC_VER) && !defined(__clang__) RAPIDJSON_DIAG_POP #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/uritest.cpp0000644000000000000000000006754015031566105024766 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // (C) Copyright IBM Corporation 2021 // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #define RAPIDJSON_SCHEMA_VERBOSE 0 #define RAPIDJSON_HAS_STDSTRING 1 #include "unittest.h" #include "rapidjson/document.h" #include "rapidjson/uri.h" #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(variadic-macros) #elif defined(_MSC_VER) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(4822) // local class member function does not have a body #endif using namespace rapidjson; TEST(Uri, DefaultConstructor) { typedef GenericUri UriType; UriType u; EXPECT_TRUE(u.GetSchemeString() == 0); EXPECT_TRUE(u.GetAuthString() == 0); EXPECT_TRUE(u.GetPathString() == 0); EXPECT_TRUE(u.GetBaseString() == 0); EXPECT_TRUE(u.GetQueryString() == 0); EXPECT_TRUE(u.GetFragString() == 0); EXPECT_TRUE(u.GetString() == 0); EXPECT_TRUE(u.GetSchemeStringLength() == 0); EXPECT_TRUE(u.GetAuthStringLength() == 0); EXPECT_TRUE(u.GetPathStringLength() == 0); EXPECT_TRUE(u.GetBaseStringLength() == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(u.GetFragStringLength() == 0); EXPECT_TRUE(u.GetStringLength() == 0); } TEST(Uri, Parse) { typedef GenericUri > UriType; MemoryPoolAllocator allocator; Value v; Value w; v.SetString("http://auth/path/xxx?query#frag", allocator); UriType u = UriType(v, &allocator); EXPECT_TRUE(StrCmp(u.GetSchemeString(), "http:") == 0); EXPECT_TRUE(StrCmp(u.GetAuthString(), "//auth") == 0); EXPECT_TRUE(StrCmp(u.GetPathString(), "/path/xxx") == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), "http://auth/path/xxx?query") == 0); EXPECT_TRUE(StrCmp(u.GetQueryString(), "?query") == 0); EXPECT_TRUE(StrCmp(u.GetFragString(), "#frag") == 0); u.Get(w, allocator); EXPECT_TRUE(*w.GetString() == *v.GetString()); v.SetString("urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f", allocator); u = UriType(v, &allocator); EXPECT_TRUE(StrCmp(u.GetSchemeString(), "urn:") == 0); EXPECT_TRUE(u.GetAuthStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetPathString(), "uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f") == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), "urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f") == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(u.GetFragStringLength() == 0); u.Get(w, allocator); EXPECT_TRUE(*w.GetString() == *v.GetString()); v.SetString("", allocator); u = UriType(v, &allocator); EXPECT_TRUE(u.GetSchemeStringLength() == 0); EXPECT_TRUE(u.GetAuthStringLength() == 0); EXPECT_TRUE(u.GetPathStringLength() == 0); EXPECT_TRUE(u.GetBaseStringLength() == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(u.GetFragStringLength() == 0); v.SetString("http://auth/", allocator); u = UriType(v, &allocator); EXPECT_TRUE(StrCmp(u.GetSchemeString(), "http:") == 0); EXPECT_TRUE(StrCmp(u.GetAuthString(), "//auth") == 0); EXPECT_TRUE(StrCmp(u.GetPathString(), "/") == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), "http://auth/") == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(u.GetFragStringLength() == 0); u = UriType("/path/sub"); EXPECT_TRUE(u.GetSchemeStringLength() == 0); EXPECT_TRUE(u.GetAuthStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetPathString(), "/path/sub") == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), "/path/sub") == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(u.GetFragStringLength() == 0); // absolute path gets normalized u = UriType("/path/../sub/"); EXPECT_TRUE(u.GetSchemeStringLength() == 0); EXPECT_TRUE(u.GetAuthStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetPathString(), "/sub/") == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), "/sub/") == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(u.GetFragStringLength() == 0); // relative path does not u = UriType("path/../sub"); EXPECT_TRUE(u.GetSchemeStringLength() == 0); EXPECT_TRUE(u.GetAuthStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetPathString(), "path/../sub") == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), "path/../sub") == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(u.GetFragStringLength() == 0); u = UriType("http://auth#frag/stuff"); EXPECT_TRUE(StrCmp(u.GetSchemeString(), "http:") == 0); EXPECT_TRUE(StrCmp(u.GetAuthString(), "//auth") == 0); EXPECT_TRUE(u.GetPathStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), "http://auth") == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetFragString(), "#frag/stuff") == 0); EXPECT_TRUE(StrCmp(u.GetString(), "http://auth#frag/stuff") == 0); const Value::Ch c[] = { '#', 'f', 'r', 'a', 'g', '/', 's', 't', 'u', 'f', 'f', '\0'}; SizeType len = internal::StrLen(c); u = UriType(c, len); EXPECT_TRUE(StrCmp(u.GetString(), "#frag/stuff") == 0); EXPECT_TRUE(u.GetStringLength() == len); EXPECT_TRUE(StrCmp(u.GetBaseString(), "") == 0); EXPECT_TRUE(u.GetBaseStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetFragString(), "#frag/stuff") == 0); EXPECT_TRUE(u.GetFragStringLength() == len); u = UriType(c); EXPECT_TRUE(StrCmp(u.GetString(), "#frag/stuff") == 0); EXPECT_TRUE(u.GetStringLength() == len); EXPECT_TRUE(StrCmp(u.GetBaseString(), "") == 0); EXPECT_TRUE(u.GetBaseStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetFragString(), "#frag/stuff") == 0); EXPECT_TRUE(u.GetFragStringLength() == len); // Incomplete auth treated as path u = UriType("http:/"); EXPECT_TRUE(StrCmp(u.GetSchemeString(), "http:") == 0); EXPECT_TRUE(u.GetAuthStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetPathString(), "/") == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), "http:/") == 0); } TEST(Uri, Parse_UTF16) { typedef GenericValue > Value16; typedef GenericUri > UriType; MemoryPoolAllocator allocator; Value16 v; Value16 w; v.SetString(L"http://auth/path/xxx?query#frag", allocator); UriType u = UriType(v, &allocator); EXPECT_TRUE(StrCmp(u.GetSchemeString(), L"http:") == 0); EXPECT_TRUE(StrCmp(u.GetAuthString(), L"//auth") == 0); EXPECT_TRUE(StrCmp(u.GetPathString(), L"/path/xxx") == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), L"http://auth/path/xxx?query") == 0); EXPECT_TRUE(StrCmp(u.GetQueryString(), L"?query") == 0); EXPECT_TRUE(StrCmp(u.GetFragString(), L"#frag") == 0); u.Get(w, allocator); EXPECT_TRUE(*w.GetString() == *v.GetString()); v.SetString(L"urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f", allocator); u = UriType(v, &allocator); EXPECT_TRUE(StrCmp(u.GetSchemeString(), L"urn:") == 0); EXPECT_TRUE(u.GetAuthStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetPathString(), L"uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f") == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), L"urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f") == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(u.GetFragStringLength() == 0); u.Get(w, allocator); EXPECT_TRUE(*w.GetString() == *v.GetString()); v.SetString(L"", allocator); u = UriType(v, &allocator); EXPECT_TRUE(u.GetSchemeStringLength() == 0); EXPECT_TRUE(u.GetAuthStringLength() == 0); EXPECT_TRUE(u.GetPathStringLength() == 0); EXPECT_TRUE(u.GetBaseStringLength() == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(u.GetFragStringLength() == 0); v.SetString(L"http://auth/", allocator); u = UriType(v, &allocator); EXPECT_TRUE(StrCmp(u.GetSchemeString(), L"http:") == 0); EXPECT_TRUE(StrCmp(u.GetAuthString(), L"//auth") == 0); EXPECT_TRUE(StrCmp(u.GetPathString(), L"/") == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), L"http://auth/") == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(u.GetFragStringLength() == 0); u = UriType(L"/path/sub"); EXPECT_TRUE(u.GetSchemeStringLength() == 0); EXPECT_TRUE(u.GetAuthStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetPathString(), L"/path/sub") == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), L"/path/sub") == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(u.GetFragStringLength() == 0); // absolute path gets normalized u = UriType(L"/path/../sub/"); EXPECT_TRUE(u.GetSchemeStringLength() == 0); EXPECT_TRUE(u.GetAuthStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetPathString(), L"/sub/") == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), L"/sub/") == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(u.GetFragStringLength() == 0); // relative path does not u = UriType(L"path/../sub"); EXPECT_TRUE(u.GetSchemeStringLength() == 0); EXPECT_TRUE(u.GetAuthStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetPathString(), L"path/../sub") == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), L"path/../sub") == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(u.GetFragStringLength() == 0); u = UriType(L"http://auth#frag/stuff"); EXPECT_TRUE(StrCmp(u.GetSchemeString(), L"http:") == 0); EXPECT_TRUE(StrCmp(u.GetAuthString(), L"//auth") == 0); EXPECT_TRUE(u.GetPathStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), L"http://auth") == 0); EXPECT_TRUE(u.GetQueryStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetFragString(), L"#frag/stuff") == 0); EXPECT_TRUE(StrCmp(u.GetString(), L"http://auth#frag/stuff") == 0); const Value16::Ch c[] = { '#', 'f', 'r', 'a', 'g', '/', 's', 't', 'u', 'f', 'f', '\0'}; SizeType len = internal::StrLen(c); u = UriType(c, len); EXPECT_TRUE(StrCmp(u.GetString(), L"#frag/stuff") == 0); EXPECT_TRUE(u.GetStringLength() == len); EXPECT_TRUE(StrCmp(u.GetBaseString(), L"") == 0); EXPECT_TRUE(u.GetBaseStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetFragString(), L"#frag/stuff") == 0); EXPECT_TRUE(u.GetFragStringLength() == len); u = UriType(c); EXPECT_TRUE(StrCmp(u.GetString(), L"#frag/stuff") == 0); EXPECT_TRUE(u.GetStringLength() == len); EXPECT_TRUE(StrCmp(u.GetBaseString(), L"") == 0); EXPECT_TRUE(u.GetBaseStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetFragString(), L"#frag/stuff") == 0); EXPECT_TRUE(u.GetFragStringLength() == len); // Incomplete auth treated as path u = UriType(L"http:/"); EXPECT_TRUE(StrCmp(u.GetSchemeString(), L"http:") == 0); EXPECT_TRUE(u.GetAuthStringLength() == 0); EXPECT_TRUE(StrCmp(u.GetPathString(), L"/") == 0); EXPECT_TRUE(StrCmp(u.GetBaseString(), L"http:/") == 0); } #if RAPIDJSON_HAS_STDSTRING TEST(Uri, Parse_Std) { typedef GenericUri > UriType; MemoryPoolAllocator allocator; typedef std::basic_string String; String str = "http://auth/path/xxx?query#frag"; const UriType uri = UriType(str, &allocator); EXPECT_TRUE(UriType::GetScheme(uri) == "http:"); EXPECT_TRUE(UriType::GetAuth(uri) == "//auth"); EXPECT_TRUE(UriType::GetPath(uri) == "/path/xxx"); EXPECT_TRUE(UriType::GetBase(uri) == "http://auth/path/xxx?query"); EXPECT_TRUE(UriType::GetQuery(uri) == "?query"); EXPECT_TRUE(UriType::GetFrag(uri) == "#frag"); EXPECT_TRUE(UriType::Get(uri) == str); } TEST(Uri, Parse_UTF16_Std) { typedef GenericValue > Value16; typedef GenericUri > UriType; MemoryPoolAllocator allocator; typedef std::basic_string String; String str = L"http://auth/path/xxx?query#frag"; const UriType uri = UriType(str, &allocator); EXPECT_TRUE(UriType::GetScheme(uri) == L"http:"); EXPECT_TRUE(UriType::GetAuth(uri) == L"//auth"); EXPECT_TRUE(UriType::GetPath(uri) == L"/path/xxx"); EXPECT_TRUE(UriType::GetBase(uri) == L"http://auth/path/xxx?query"); EXPECT_TRUE(UriType::GetQuery(uri) == L"?query"); EXPECT_TRUE(UriType::GetFrag(uri) == L"#frag"); EXPECT_TRUE(UriType::Get(uri) == str); } #endif TEST(Uri, CopyConstructor) { typedef GenericUri UriType; CrtAllocator allocator; UriType u("http://auth/path/xxx?query#frag", &allocator); UriType u2(u); EXPECT_TRUE(u == u2); EXPECT_NE(&u.GetAllocator(), &u2.GetAllocator()); } TEST(Uri, Assignment) { typedef GenericUri UriType; CrtAllocator allocator; UriType u("http://auth/path/xxx?query#frag", &allocator); UriType u2; u2 = u; EXPECT_TRUE(u == u2); EXPECT_NE(&u.GetAllocator(), &u2.GetAllocator()); } TEST(Uri, Resolve) { typedef GenericUri UriType; CrtAllocator allocator; // ref is full uri UriType base = UriType("http://auth/path/#frag"); UriType ref = UriType("http://newauth/newpath#newfrag"); UriType res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://newauth/newpath#newfrag") == 0); base = UriType("/path/#frag", &allocator); ref = UriType("http://newauth/newpath#newfrag", &allocator); res = ref.Resolve(base, &allocator); EXPECT_TRUE(StrCmp(res.GetString(), "http://newauth/newpath#newfrag") == 0); // ref is alternate uri base = UriType("http://auth/path/#frag"); ref = UriType("urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f") == 0); // ref is absolute path base = UriType("http://auth/path/#"); ref = UriType("/newpath#newfrag"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://auth/newpath#newfrag") == 0); // ref is relative path base = UriType("http://auth/path/file.json#frag"); ref = UriType("newfile.json#"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://auth/path/newfile.json#") == 0); base = UriType("http://auth/path/file.json#frag/stuff"); ref = UriType("newfile.json#newfrag/newstuff"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://auth/path/newfile.json#newfrag/newstuff") == 0); base = UriType("file.json", &allocator); ref = UriType("newfile.json", &base.GetAllocator()); res = ref.Resolve(base, &ref.GetAllocator()); EXPECT_TRUE(StrCmp(res.GetString(), "newfile.json") == 0); base = UriType("file.json", &allocator); ref = UriType("./newfile.json", &allocator); res = ref.Resolve(base, &allocator); EXPECT_TRUE(StrCmp(res.GetString(), "newfile.json") == 0); base = UriType("file.json"); ref = UriType("parent/../newfile.json"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "newfile.json") == 0); base = UriType("file.json"); ref = UriType("parent/./newfile.json"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "parent/newfile.json") == 0); base = UriType("file.json"); ref = UriType("../../parent/.././newfile.json"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "newfile.json") == 0); // This adds a joining slash so resolved length is base length + ref length + 1 base = UriType("http://auth"); ref = UriType("newfile.json"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://auth/newfile.json") == 0); // ref is fragment base = UriType("#frag/stuff"); ref = UriType("#newfrag/newstuff"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "#newfrag/newstuff") == 0); // test ref fragment always wins base = UriType("/path#frag"); ref = UriType(""); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "/path") == 0); // Examples from RFC3896 base = UriType("http://a/b/c/d;p?q"); ref = UriType("g:h"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "g:h") == 0); ref = UriType("g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g") == 0); ref = UriType("./g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g") == 0); ref = UriType("g/"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g/") == 0); ref = UriType("/g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/g") == 0); ref = UriType("//g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://g") == 0); ref = UriType("?y"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/d;p?y") == 0); ref = UriType("g?y"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g?y") == 0); ref = UriType("#s"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/d;p?q#s") == 0); ref = UriType("g#s"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g#s") == 0); ref = UriType("g?y#s"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g?y#s") == 0); ref = UriType(";x"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/;x") == 0); ref = UriType("g;x"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g;x") == 0); ref = UriType("g;x?y#s"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g;x?y#s") == 0); ref = UriType(""); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/d;p?q") == 0); ref = UriType("."); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/") == 0); ref = UriType("./"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/") == 0); ref = UriType(".."); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/") == 0); ref = UriType("../"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/") == 0); ref = UriType("../g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/g") == 0); ref = UriType("../.."); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/") == 0); ref = UriType("../../"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/") == 0); ref = UriType("../../g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/g") == 0); ref = UriType("../../../g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/g") == 0); ref = UriType("../../../../g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/g") == 0); ref = UriType("/./g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/g") == 0); ref = UriType("/../g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/g") == 0); ref = UriType("g."); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g.") == 0); ref = UriType(".g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/.g") == 0); ref = UriType("g.."); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g..") == 0); ref = UriType("..g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/..g") == 0); ref = UriType("g#s/../x"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g#s/../x") == 0); } TEST(Uri, Resolve_UTF16) { typedef GenericValue > Value16; typedef GenericUri UriType; CrtAllocator allocator; // ref is full uri UriType base = UriType(L"http://auth/path/#frag"); UriType ref = UriType(L"http://newauth/newpath#newfrag"); UriType res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://newauth/newpath#newfrag") == 0); base = UriType(L"/path/#frag"); ref = UriType(L"http://newauth/newpath#newfrag"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://newauth/newpath#newfrag") == 0); // ref is alternate uri base = UriType(L"http://auth/path/#frag"); ref = UriType(L"urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f") == 0); // ref is absolute path base = UriType(L"http://auth/path/#"); ref = UriType(L"/newpath#newfrag"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://auth/newpath#newfrag") == 0); // ref is relative path base = UriType(L"http://auth/path/file.json#frag"); ref = UriType(L"newfile.json#"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://auth/path/newfile.json#") == 0); base = UriType(L"http://auth/path/file.json#frag/stuff"); ref = UriType(L"newfile.json#newfrag/newstuff"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://auth/path/newfile.json#newfrag/newstuff") == 0); base = UriType(L"file.json", &allocator); ref = UriType(L"newfile.json", &base.GetAllocator()); res = ref.Resolve(base, &ref.GetAllocator()); EXPECT_TRUE(StrCmp(res.GetString(), L"newfile.json") == 0); base = UriType(L"file.json", &allocator); ref = UriType(L"./newfile.json", &allocator); res = ref.Resolve(base, &allocator); EXPECT_TRUE(StrCmp(res.GetString(), L"newfile.json") == 0); base = UriType(L"file.json"); ref = UriType(L"parent/../newfile.json"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"newfile.json") == 0); base = UriType(L"file.json"); ref = UriType(L"parent/./newfile.json"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"parent/newfile.json") == 0); base = UriType(L"file.json"); ref = UriType(L"../../parent/.././newfile.json"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"newfile.json") == 0); // This adds a joining slash so resolved length is base length + ref length + 1 base = UriType(L"http://auth"); ref = UriType(L"newfile.json"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://auth/newfile.json") == 0); // ref is fragment base = UriType(L"#frag/stuff"); ref = UriType(L"#newfrag/newstuff"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"#newfrag/newstuff") == 0); // test ref fragment always wins base = UriType(L"/path#frag"); ref = UriType(L""); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"/path") == 0); // Examples from RFC3896 base = UriType(L"http://a/b/c/d;p?q"); ref = UriType(L"g:h"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"g:h") == 0); ref = UriType(L"g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g") == 0); ref = UriType(L"./g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g") == 0); ref = UriType(L"g/"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g/") == 0); ref = UriType(L"/g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/g") == 0); ref = UriType(L"//g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://g") == 0); ref = UriType(L"?y"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/d;p?y") == 0); ref = UriType(L"g?y"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g?y") == 0); ref = UriType(L"#s"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/d;p?q#s") == 0); ref = UriType(L"g#s"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g#s") == 0); ref = UriType(L"g?y#s"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g?y#s") == 0); ref = UriType(L";x"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/;x") == 0); ref = UriType(L"g;x"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g;x") == 0); ref = UriType(L"g;x?y#s"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g;x?y#s") == 0); ref = UriType(L""); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/d;p?q") == 0); ref = UriType(L"."); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/") == 0); ref = UriType(L"./"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/") == 0); ref = UriType(L".."); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/") == 0); ref = UriType(L"../"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/") == 0); ref = UriType(L"../g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/g") == 0); ref = UriType(L"../.."); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/") == 0); ref = UriType(L"../../"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/") == 0); ref = UriType(L"../../g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/g") == 0); ref = UriType(L"../../../g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/g") == 0); ref = UriType(L"../../../../g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/g") == 0); ref = UriType(L"/./g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/g") == 0); ref = UriType(L"/../g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/g") == 0); ref = UriType(L"g."); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g.") == 0); ref = UriType(L".g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/.g") == 0); ref = UriType(L"g.."); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g..") == 0); ref = UriType(L"..g"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/..g") == 0); ref = UriType(L"g#s/../x"); res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g#s/../x") == 0); } TEST(Uri, Equals) { typedef GenericUri UriType; UriType a = UriType("http://a/a#a"); UriType b = UriType("http://a/a#b"); UriType c = a; EXPECT_TRUE(a == a); EXPECT_TRUE(a == c); EXPECT_TRUE(a != b); } TEST(Uri, Match) { typedef GenericUri UriType; UriType a = UriType("http://a/a#a"); UriType b = UriType("http://a/a#b"); UriType c = a; UriType d; EXPECT_TRUE(a.Match(a)); EXPECT_TRUE(a.Match(c)); EXPECT_FALSE(a.Match(b)); EXPECT_FALSE(a.Match(b, true)); EXPECT_TRUE(a.Match(b, false)); // Base Uri same EXPECT_FALSE(a.Match(d)); EXPECT_FALSE(d.Match(a)); } TEST(Uri, Issue1899) { typedef GenericUri > UriType; UriType base = UriType("http://auth/path/#frag"); UriType ref = UriType("http://newauth/newpath#newfrag"); UriType res = ref.Resolve(base); EXPECT_TRUE(StrCmp(res.GetString(), "http://newauth/newpath#newfrag") == 0); } #if defined(_MSC_VER) || defined(__clang__) RAPIDJSON_DIAG_POP #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/unittest/schematest.cpp0000644000000000000000000044641215031566105025426 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #define RAPIDJSON_SCHEMA_VERBOSE 0 #define RAPIDJSON_HAS_STDSTRING 1 #include "unittest.h" #include "rapidjson/schema.h" #include "rapidjson/stringbuffer.h" #include "rapidjson/writer.h" #include "rapidjson/error/error.h" #include "rapidjson/error/en.h" #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(variadic-macros) #elif defined(_MSC_VER) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(4822) // local class member function does not have a body #endif using namespace rapidjson; #define TEST_HASHER(json1, json2, expected) \ {\ Document d1, d2;\ d1.Parse(json1);\ ASSERT_FALSE(d1.HasParseError());\ d2.Parse(json2);\ ASSERT_FALSE(d2.HasParseError());\ internal::Hasher h1, h2;\ d1.Accept(h1);\ d2.Accept(h2);\ ASSERT_TRUE(h1.IsValid());\ ASSERT_TRUE(h2.IsValid());\ /*printf("%s: 0x%016llx\n%s: 0x%016llx\n\n", json1, h1.GetHashCode(), json2, h2.GetHashCode());*/\ EXPECT_TRUE(expected == (h1.GetHashCode() == h2.GetHashCode()));\ } TEST(SchemaValidator, Hasher) { TEST_HASHER("null", "null", true); TEST_HASHER("true", "true", true); TEST_HASHER("false", "false", true); TEST_HASHER("true", "false", false); TEST_HASHER("false", "true", false); TEST_HASHER("true", "null", false); TEST_HASHER("false", "null", false); TEST_HASHER("1", "1", true); TEST_HASHER("2147483648", "2147483648", true); // 2^31 can only be fit in unsigned TEST_HASHER("-2147483649", "-2147483649", true); // -2^31 - 1 can only be fit in int64_t TEST_HASHER("2147483648", "2147483648", true); // 2^31 can only be fit in unsigned TEST_HASHER("4294967296", "4294967296", true); // 2^32 can only be fit in int64_t TEST_HASHER("9223372036854775808", "9223372036854775808", true); // 2^63 can only be fit in uint64_t TEST_HASHER("1.5", "1.5", true); TEST_HASHER("1", "1.0", true); TEST_HASHER("1", "-1", false); TEST_HASHER("0.0", "-0.0", false); TEST_HASHER("1", "true", false); TEST_HASHER("0", "false", false); TEST_HASHER("0", "null", false); TEST_HASHER("\"\"", "\"\"", true); TEST_HASHER("\"\"", "\"\\u0000\"", false); TEST_HASHER("\"Hello\"", "\"Hello\"", true); TEST_HASHER("\"Hello\"", "\"World\"", false); TEST_HASHER("\"Hello\"", "null", false); TEST_HASHER("\"Hello\\u0000\"", "\"Hello\"", false); TEST_HASHER("\"\"", "null", false); TEST_HASHER("\"\"", "true", false); TEST_HASHER("\"\"", "false", false); TEST_HASHER("[]", "[ ]", true); TEST_HASHER("[1, true, false]", "[1, true, false]", true); TEST_HASHER("[1, true, false]", "[1, true]", false); TEST_HASHER("[1, 2]", "[2, 1]", false); TEST_HASHER("[[1], 2]", "[[1, 2]]", false); TEST_HASHER("[1, 2]", "[1, [2]]", false); TEST_HASHER("[]", "null", false); TEST_HASHER("[]", "true", false); TEST_HASHER("[]", "false", false); TEST_HASHER("[]", "0", false); TEST_HASHER("[]", "0.0", false); TEST_HASHER("[]", "\"\"", false); TEST_HASHER("{}", "{ }", true); TEST_HASHER("{\"a\":1}", "{\"a\":1}", true); TEST_HASHER("{\"a\":1}", "{\"b\":1}", false); TEST_HASHER("{\"a\":1}", "{\"a\":2}", false); TEST_HASHER("{\"a\":1, \"b\":2}", "{\"b\":2, \"a\":1}", true); // Member order insensitive TEST_HASHER("{}", "null", false); TEST_HASHER("{}", "false", false); TEST_HASHER("{}", "true", false); TEST_HASHER("{}", "0", false); TEST_HASHER("{}", "0.0", false); TEST_HASHER("{}", "\"\"", false); } // Test cases following http://spacetelescope.github.io/understanding-json-schema #define VALIDATE(schema, json, expected) \ {\ VALIDATE_(schema, json, expected, true) \ } #define VALIDATE_(schema, json, expected, expected2) \ {\ EXPECT_TRUE(expected2 == schema.GetError().ObjectEmpty());\ EXPECT_TRUE(schema.IsSupportedSpecification());\ SchemaValidator validator(schema);\ Document d;\ /*printf("\n%s\n", json);*/\ d.Parse(json);\ EXPECT_FALSE(d.HasParseError());\ EXPECT_TRUE(expected == d.Accept(validator));\ EXPECT_TRUE(expected == validator.IsValid());\ ValidateErrorCode code = validator.GetInvalidSchemaCode();\ if (expected) {\ EXPECT_TRUE(code == kValidateErrorNone);\ EXPECT_TRUE(validator.GetInvalidSchemaKeyword() == 0);\ }\ if ((expected) && !validator.IsValid()) {\ StringBuffer sb;\ validator.GetInvalidSchemaPointer().StringifyUriFragment(sb);\ printf("Invalid schema: %s\n", sb.GetString());\ printf("Invalid keyword: %s\n", validator.GetInvalidSchemaKeyword());\ printf("Invalid code: %d\n", code);\ printf("Invalid message: %s\n", GetValidateError_En(code));\ sb.Clear();\ validator.GetInvalidDocumentPointer().StringifyUriFragment(sb);\ printf("Invalid document: %s\n", sb.GetString());\ sb.Clear();\ Writer w(sb);\ validator.GetError().Accept(w);\ printf("Validation error: %s\n", sb.GetString());\ }\ } #define INVALIDATE(schema, json, invalidSchemaPointer, invalidSchemaKeyword, invalidDocumentPointer, error) \ {\ INVALIDATE_(schema, json, invalidSchemaPointer, invalidSchemaKeyword, invalidDocumentPointer, error, kValidateDefaultFlags, SchemaValidator, Pointer) \ } #define INVALIDATE_(schema, json, invalidSchemaPointer, invalidSchemaKeyword, invalidDocumentPointer, error, \ flags, SchemaValidatorType, PointerType) \ {\ EXPECT_TRUE(schema.GetError().ObjectEmpty());\ EXPECT_TRUE(schema.IsSupportedSpecification());\ SchemaValidatorType validator(schema);\ validator.SetValidateFlags(flags);\ Document d;\ /*printf("\n%s\n", json);*/\ d.Parse(json);\ EXPECT_FALSE(d.HasParseError());\ d.Accept(validator);\ EXPECT_FALSE(validator.IsValid());\ ValidateErrorCode code = validator.GetInvalidSchemaCode();\ ASSERT_TRUE(code != kValidateErrorNone);\ ASSERT_TRUE(strcmp(GetValidateError_En(code), "Unknown error.") != 0);\ if (validator.GetInvalidSchemaPointer() != PointerType(invalidSchemaPointer)) {\ StringBuffer sb;\ validator.GetInvalidSchemaPointer().Stringify(sb);\ printf("GetInvalidSchemaPointer() Expected: %s Actual: %s\n", invalidSchemaPointer, sb.GetString());\ ADD_FAILURE();\ }\ ASSERT_TRUE(validator.GetInvalidSchemaKeyword() != 0);\ if (strcmp(validator.GetInvalidSchemaKeyword(), invalidSchemaKeyword) != 0) {\ printf("GetInvalidSchemaKeyword() Expected: %s Actual %s\n", invalidSchemaKeyword, validator.GetInvalidSchemaKeyword());\ ADD_FAILURE();\ }\ if (validator.GetInvalidDocumentPointer() != PointerType(invalidDocumentPointer)) {\ StringBuffer sb;\ validator.GetInvalidDocumentPointer().Stringify(sb);\ printf("GetInvalidDocumentPointer() Expected: %s Actual: %s\n", invalidDocumentPointer, sb.GetString());\ ADD_FAILURE();\ }\ Document e;\ e.Parse(error);\ if (validator.GetError() != e) {\ StringBuffer sb;\ Writer w(sb);\ validator.GetError().Accept(w);\ printf("GetError() Expected: %s Actual: %s\n", error, sb.GetString());\ ADD_FAILURE();\ }\ } // Use for checking whether a compiled schema document contains errors #define SCHEMAERROR(schema, error) \ {\ Document e;\ e.Parse(error);\ if (schema.GetError() != e) {\ StringBuffer sb;\ Writer w(sb);\ schema.GetError().Accept(w);\ printf("GetError() Expected: %s Actual: %s\n", error, sb.GetString());\ ADD_FAILURE();\ }\ } TEST(SchemaValidator, Typeless) { Document sd; sd.Parse("{}"); SchemaDocument s(sd); VALIDATE(s, "42", true); VALIDATE(s, "\"I'm a string\"", true); VALIDATE(s, "{ \"an\": [ \"arbitrarily\", \"nested\" ], \"data\": \"structure\" }", true); } TEST(SchemaValidator, MultiType) { Document sd; sd.Parse("{ \"type\": [\"number\", \"string\"] }"); SchemaDocument s(sd); VALIDATE(s, "42", true); VALIDATE(s, "\"Life, the universe, and everything\"", true); INVALIDATE(s, "[\"Life\", \"the universe\", \"and everything\"]", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"string\", \"number\"], \"actual\": \"array\"" "}}"); } TEST(SchemaValidator, Enum_Typed) { Document sd; sd.Parse("{ \"type\": \"string\", \"enum\" : [\"red\", \"amber\", \"green\"] }"); SchemaDocument s(sd); VALIDATE(s, "\"red\"", true); INVALIDATE(s, "\"blue\"", "", "enum", "", "{ \"enum\": { \"errorCode\": 19, \"instanceRef\": \"#\", \"schemaRef\": \"#\" }}"); } TEST(SchemaValidator, Enum_Typeless) { Document sd; sd.Parse("{ \"enum\": [\"red\", \"amber\", \"green\", null, 42] }"); SchemaDocument s(sd); VALIDATE(s, "\"red\"", true); VALIDATE(s, "null", true); VALIDATE(s, "42", true); INVALIDATE(s, "0", "", "enum", "", "{ \"enum\": { \"errorCode\": 19, \"instanceRef\": \"#\", \"schemaRef\": \"#\" }}"); } TEST(SchemaValidator, Enum_InvalidType) { Document sd; sd.Parse("{ \"type\": \"string\", \"enum\": [\"red\", \"amber\", \"green\", null] }"); SchemaDocument s(sd); VALIDATE(s, "\"red\"", true); INVALIDATE(s, "null", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"string\"], \"actual\": \"null\"" "}}"); } TEST(SchemaValidator, AllOf) { { Document sd; sd.Parse("{\"allOf\": [{ \"type\": \"string\" }, { \"type\": \"string\", \"maxLength\": 5 }]}"); SchemaDocument s(sd); VALIDATE(s, "\"ok\"", true); INVALIDATE(s, "\"too long\"", "", "allOf", "", "{ \"allOf\": {" " \"errors\": [" " {}," " {\"maxLength\": {\"errorCode\": 6, \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/1\", \"expected\": 5, \"actual\": \"too long\"}}" " ]," " \"errorCode\": 23, \"instanceRef\": \"#\", \"schemaRef\": \"#\"" "}}"); } { Document sd; sd.Parse("{\"allOf\": [{ \"type\": \"string\" }, { \"type\": \"number\" } ] }"); SchemaDocument s(sd); VALIDATE(s, "\"No way\"", false); INVALIDATE(s, "-1", "", "allOf", "", "{ \"allOf\": {" " \"errors\": [" " {\"type\": { \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/0\", \"errorCode\": 20, \"expected\": [\"string\"], \"actual\": \"integer\"}}," " {}" " ]," " \"errorCode\": 23, \"instanceRef\": \"#\", \"schemaRef\": \"#\"" "}}"); } } TEST(SchemaValidator, AnyOf) { Document sd; sd.Parse("{\"anyOf\": [{ \"type\": \"string\" }, { \"type\": \"number\" } ] }"); SchemaDocument s(sd); VALIDATE(s, "\"Yes\"", true); VALIDATE(s, "42", true); INVALIDATE(s, "{ \"Not a\": \"string or number\" }", "", "anyOf", "", "{ \"anyOf\": {" " \"errorCode\": 24," " \"instanceRef\": \"#\", \"schemaRef\": \"#\", " " \"errors\": [" " { \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#/anyOf/0\"," " \"expected\": [\"string\"], \"actual\": \"object\"" " }}," " { \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#/anyOf/1\"," " \"expected\": [\"number\"], \"actual\": \"object\"" " }}" " ]" "}}"); } TEST(SchemaValidator, OneOf) { Document sd; sd.Parse("{\"oneOf\": [{ \"type\": \"number\", \"multipleOf\": 5 }, { \"type\": \"number\", \"multipleOf\": 3 } ] }"); SchemaDocument s(sd); VALIDATE(s, "10", true); VALIDATE(s, "9", true); INVALIDATE(s, "2", "", "oneOf", "", "{ \"oneOf\": {" " \"errorCode\": 21," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"errors\": [" " { \"multipleOf\": {" " \"errorCode\": 1," " \"instanceRef\": \"#\", \"schemaRef\": \"#/oneOf/0\"," " \"expected\": 5, \"actual\": 2" " }}," " { \"multipleOf\": {" " \"errorCode\": 1," " \"instanceRef\": \"#\", \"schemaRef\": \"#/oneOf/1\"," " \"expected\": 3, \"actual\": 2" " }}" " ]" "}}"); INVALIDATE(s, "15", "", "oneOf", "", "{ \"oneOf\": { \"errorCode\": 22, \"instanceRef\": \"#\", \"schemaRef\": \"#\", \"matches\": [0,1]}}"); } TEST(SchemaValidator, Not) { Document sd; sd.Parse("{\"not\":{ \"type\": \"string\"}}"); SchemaDocument s(sd); VALIDATE(s, "42", true); VALIDATE(s, "{ \"key\": \"value\" }", true); INVALIDATE(s, "\"I am a string\"", "", "not", "", "{ \"not\": { \"errorCode\": 25, \"instanceRef\": \"#\", \"schemaRef\": \"#\" }}"); } TEST(SchemaValidator, Ref) { Document sd; sd.Parse( "{" " \"$schema\": \"http://json-schema.org/draft-04/schema#\"," "" " \"definitions\": {" " \"address\": {" " \"type\": \"object\"," " \"properties\": {" " \"street_address\": { \"type\": \"string\" }," " \"city\": { \"type\": \"string\" }," " \"state\": { \"type\": \"string\" }" " }," " \"required\": [\"street_address\", \"city\", \"state\"]" " }" " }," " \"type\": \"object\"," " \"properties\": {" " \"billing_address\": { \"$ref\": \"#/definitions/address\" }," " \"shipping_address\": { \"$ref\": \"#/definitions/address\" }" " }" "}"); SchemaDocument s(sd); VALIDATE(s, "{\"shipping_address\": {\"street_address\": \"1600 Pennsylvania Avenue NW\", \"city\": \"Washington\", \"state\": \"DC\"}, \"billing_address\": {\"street_address\": \"1st Street SE\", \"city\": \"Washington\", \"state\": \"DC\"} }", true); } TEST(SchemaValidator, Ref_AllOf) { Document sd; sd.Parse( "{" " \"$schema\": \"http://json-schema.org/draft-04/schema#\"," "" " \"definitions\": {" " \"address\": {" " \"type\": \"object\"," " \"properties\": {" " \"street_address\": { \"type\": \"string\" }," " \"city\": { \"type\": \"string\" }," " \"state\": { \"type\": \"string\" }" " }," " \"required\": [\"street_address\", \"city\", \"state\"]" " }" " }," " \"type\": \"object\"," " \"properties\": {" " \"billing_address\": { \"$ref\": \"#/definitions/address\" }," " \"shipping_address\": {" " \"allOf\": [" " { \"$ref\": \"#/definitions/address\" }," " { \"properties\":" " { \"type\": { \"enum\": [ \"residential\", \"business\" ] } }," " \"required\": [\"type\"]" " }" " ]" " }" " }" "}"); SchemaDocument s(sd); INVALIDATE(s, "{\"shipping_address\": {\"street_address\": \"1600 Pennsylvania Avenue NW\", \"city\": \"Washington\", \"state\": \"DC\"} }", "/properties/shipping_address", "allOf", "/shipping_address", "{ \"allOf\": {" " \"errors\": [" " {}," " {\"required\": {\"errorCode\": 15, \"instanceRef\": \"#/shipping_address\", \"schemaRef\": \"#/properties/shipping_address/allOf/1\", \"missing\": [\"type\"]}}" " ]," " \"errorCode\":23,\"instanceRef\":\"#/shipping_address\",\"schemaRef\":\"#/properties/shipping_address\"" "}}"); VALIDATE(s, "{\"shipping_address\": {\"street_address\": \"1600 Pennsylvania Avenue NW\", \"city\": \"Washington\", \"state\": \"DC\", \"type\": \"business\"} }", true); } TEST(SchemaValidator, String) { Document sd; sd.Parse("{\"type\":\"string\"}"); SchemaDocument s(sd); VALIDATE(s, "\"I'm a string\"", true); INVALIDATE(s, "42", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"string\"], \"actual\": \"integer\"" "}}"); INVALIDATE(s, "2147483648", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"string\"], \"actual\": \"integer\"" "}}"); // 2^31 can only be fit in unsigned INVALIDATE(s, "-2147483649", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"string\"], \"actual\": \"integer\"" "}}"); // -2^31 - 1 can only be fit in int64_t INVALIDATE(s, "4294967296", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"string\"], \"actual\": \"integer\"" "}}"); // 2^32 can only be fit in int64_t INVALIDATE(s, "3.1415926", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"string\"], \"actual\": \"number\"" "}}"); } TEST(SchemaValidator, String_LengthRange) { Document sd; sd.Parse("{\"type\":\"string\",\"minLength\":2,\"maxLength\":3}"); SchemaDocument s(sd); INVALIDATE(s, "\"A\"", "", "minLength", "", "{ \"minLength\": {" " \"errorCode\": 7," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 2, \"actual\": \"A\"" "}}"); VALIDATE(s, "\"AB\"", true); VALIDATE(s, "\"ABC\"", true); INVALIDATE(s, "\"ABCD\"", "", "maxLength", "", "{ \"maxLength\": {" " \"errorCode\": 6," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 3, \"actual\": \"ABCD\"" "}}"); } #if RAPIDJSON_SCHEMA_HAS_REGEX TEST(SchemaValidator, String_Pattern) { Document sd; sd.Parse("{\"type\":\"string\",\"pattern\":\"^(\\\\([0-9]{3}\\\\))?[0-9]{3}-[0-9]{4}$\"}"); SchemaDocument s(sd); VALIDATE(s, "\"555-1212\"", true); VALIDATE(s, "\"(888)555-1212\"", true); INVALIDATE(s, "\"(888)555-1212 ext. 532\"", "", "pattern", "", "{ \"pattern\": {" " \"errorCode\": 8," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"actual\": \"(888)555-1212 ext. 532\"" "}}"); INVALIDATE(s, "\"(800)FLOWERS\"", "", "pattern", "", "{ \"pattern\": {" " \"errorCode\": 8," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"actual\": \"(800)FLOWERS\"" "}}"); } TEST(SchemaValidator, String_Pattern_Invalid) { Document sd; sd.Parse("{\"type\":\"string\",\"pattern\":\"a{0}\"}"); SchemaDocument s(sd); SCHEMAERROR(s, "{\"RegexInvalid\":{\"errorCode\":9,\"instanceRef\":\"#/pattern\",\"value\":\"a{0}\"}}"); VALIDATE_(s, "\"\"", true, false); VALIDATE_(s, "\"a\"", true, false); VALIDATE_(s, "\"aa\"", true, false); } #endif TEST(SchemaValidator, Integer) { Document sd; sd.Parse("{\"type\":\"integer\"}"); SchemaDocument s(sd); VALIDATE(s, "42", true); VALIDATE(s, "-1", true); VALIDATE(s, "2147483648", true); // 2^31 can only be fit in unsigned VALIDATE(s, "-2147483649", true); // -2^31 - 1 can only be fit in int64_t VALIDATE(s, "2147483648", true); // 2^31 can only be fit in unsigned VALIDATE(s, "4294967296", true); // 2^32 can only be fit in int64_t INVALIDATE(s, "3.1415926", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"integer\"], \"actual\": \"number\"" "}}"); INVALIDATE(s, "\"42\"", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"integer\"], \"actual\": \"string\"" "}}"); } TEST(SchemaValidator, Integer_Range) { Document sd; sd.Parse("{\"type\":\"integer\",\"minimum\":0,\"maximum\":100,\"exclusiveMaximum\":true}"); SchemaDocument s(sd); INVALIDATE(s, "-1", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 0, \"actual\": -1" "}}"); VALIDATE(s, "0", true); VALIDATE(s, "10", true); VALIDATE(s, "99", true); INVALIDATE(s, "100", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100, \"exclusiveMaximum\": true, \"actual\": 100" "}}"); INVALIDATE(s, "101", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100, \"exclusiveMaximum\": true, \"actual\": 101" "}}"); } TEST(SchemaValidator, Integer_Range64Boundary) { Document sd; sd.Parse("{\"type\":\"integer\",\"minimum\":-9223372036854775807,\"maximum\":9223372036854775806}"); SchemaDocument s(sd); INVALIDATE(s, "-9223372036854775808", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": -9223372036854775807, \"actual\": -9223372036854775808" "}}"); VALIDATE(s, "-9223372036854775807", true); VALIDATE(s, "-2147483648", true); // int min VALIDATE(s, "0", true); VALIDATE(s, "2147483647", true); // int max VALIDATE(s, "2147483648", true); // unsigned first VALIDATE(s, "4294967295", true); // unsigned max VALIDATE(s, "9223372036854775806", true); INVALIDATE(s, "9223372036854775807", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 2," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775806, \"actual\": 9223372036854775807" "}}"); INVALIDATE(s, "18446744073709551615", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 2," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775806, \"actual\": 18446744073709551615" "}}"); // uint64_t max } TEST(SchemaValidator, Integer_RangeU64Boundary) { Document sd; sd.Parse("{\"type\":\"integer\",\"minimum\":9223372036854775808,\"maximum\":18446744073709551614}"); SchemaDocument s(sd); INVALIDATE(s, "-9223372036854775808", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775808, \"actual\": -9223372036854775808" "}}"); INVALIDATE(s, "9223372036854775807", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775808, \"actual\": 9223372036854775807" "}}"); INVALIDATE(s, "-2147483648", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775808, \"actual\": -2147483648" "}}"); // int min INVALIDATE(s, "0", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775808, \"actual\": 0" "}}"); INVALIDATE(s, "2147483647", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775808, \"actual\": 2147483647" "}}"); // int max INVALIDATE(s, "2147483648", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775808, \"actual\": 2147483648" "}}"); // unsigned first INVALIDATE(s, "4294967295", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775808, \"actual\": 4294967295" "}}"); // unsigned max VALIDATE(s, "9223372036854775808", true); VALIDATE(s, "18446744073709551614", true); INVALIDATE(s, "18446744073709551615", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 2," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 18446744073709551614, \"actual\": 18446744073709551615" "}}"); } TEST(SchemaValidator, Integer_Range64BoundaryExclusive) { Document sd; sd.Parse("{\"type\":\"integer\",\"minimum\":-9223372036854775808,\"maximum\":18446744073709551615,\"exclusiveMinimum\":true,\"exclusiveMaximum\":true}"); SchemaDocument s(sd); INVALIDATE(s, "-9223372036854775808", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 5," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": -9223372036854775808, \"exclusiveMinimum\": true, " " \"actual\": -9223372036854775808" "}}"); VALIDATE(s, "-9223372036854775807", true); VALIDATE(s, "18446744073709551614", true); INVALIDATE(s, "18446744073709551615", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 18446744073709551615, \"exclusiveMaximum\": true, " " \"actual\": 18446744073709551615" "}}"); } TEST(SchemaValidator, Integer_MultipleOf) { Document sd; sd.Parse("{\"type\":\"integer\",\"multipleOf\":10}"); SchemaDocument s(sd); VALIDATE(s, "0", true); VALIDATE(s, "10", true); VALIDATE(s, "-10", true); VALIDATE(s, "20", true); INVALIDATE(s, "23", "", "multipleOf", "", "{ \"multipleOf\": {" " \"errorCode\": 1," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 10, \"actual\": 23" "}}"); INVALIDATE(s, "-23", "", "multipleOf", "", "{ \"multipleOf\": {" " \"errorCode\": 1," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 10, \"actual\": -23" "}}"); } TEST(SchemaValidator, Integer_MultipleOf64Boundary) { Document sd; sd.Parse("{\"type\":\"integer\",\"multipleOf\":18446744073709551615}"); SchemaDocument s(sd); VALIDATE(s, "0", true); VALIDATE(s, "18446744073709551615", true); INVALIDATE(s, "18446744073709551614", "", "multipleOf", "", "{ \"multipleOf\": {" " \"errorCode\": 1," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 18446744073709551615, \"actual\": 18446744073709551614" "}}"); } TEST(SchemaValidator, Number_Range) { Document sd; sd.Parse("{\"type\":\"number\",\"minimum\":0,\"maximum\":100,\"exclusiveMaximum\":true}"); SchemaDocument s(sd); INVALIDATE(s, "-1", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 0, \"actual\": -1" "}}"); VALIDATE(s, "0", true); VALIDATE(s, "0.1", true); VALIDATE(s, "10", true); VALIDATE(s, "99", true); VALIDATE(s, "99.9", true); INVALIDATE(s, "100", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100, \"exclusiveMaximum\": true, \"actual\": 100" "}}"); INVALIDATE(s, "100.0", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100, \"exclusiveMaximum\": true, \"actual\": 100.0" "}}"); INVALIDATE(s, "101.5", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100, \"exclusiveMaximum\": true, \"actual\": 101.5" "}}"); } TEST(SchemaValidator, Number_RangeInt) { Document sd; sd.Parse("{\"type\":\"number\",\"minimum\":-100,\"maximum\":-1,\"exclusiveMaximum\":true}"); SchemaDocument s(sd); INVALIDATE(s, "-101", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": -100, \"actual\": -101" "}}"); INVALIDATE(s, "-100.1", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": -100, \"actual\": -100.1" "}}"); VALIDATE(s, "-100", true); VALIDATE(s, "-2", true); INVALIDATE(s, "-1", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": -1, \"exclusiveMaximum\": true, \"actual\": -1" "}}"); INVALIDATE(s, "-0.9", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": -1, \"exclusiveMaximum\": true, \"actual\": -0.9" "}}"); INVALIDATE(s, "0", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": -1, \"exclusiveMaximum\": true, \"actual\": 0" "}}"); INVALIDATE(s, "2147483647", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": -1, \"exclusiveMaximum\": true, \"actual\": 2147483647" "}}"); // int max INVALIDATE(s, "2147483648", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": -1, \"exclusiveMaximum\": true, \"actual\": 2147483648" "}}"); // unsigned first INVALIDATE(s, "4294967295", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": -1, \"exclusiveMaximum\": true, \"actual\": 4294967295" "}}"); // unsigned max INVALIDATE(s, "9223372036854775808", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": -1, \"exclusiveMaximum\": true, \"actual\": 9223372036854775808" "}}"); INVALIDATE(s, "18446744073709551614", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": -1, \"exclusiveMaximum\": true, \"actual\": 18446744073709551614" "}}"); INVALIDATE(s, "18446744073709551615", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": -1, \"exclusiveMaximum\": true, \"actual\": 18446744073709551615" "}}"); } TEST(SchemaValidator, Number_RangeDouble) { Document sd; sd.Parse("{\"type\":\"number\",\"minimum\":0.1,\"maximum\":100.1,\"exclusiveMaximum\":true}"); SchemaDocument s(sd); INVALIDATE(s, "-9223372036854775808", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 0.1, \"actual\": -9223372036854775808" "}}"); INVALIDATE(s, "-2147483648", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 0.1, \"actual\": -2147483648" "}}"); // int min INVALIDATE(s, "-1", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 0.1, \"actual\": -1" "}}"); VALIDATE(s, "0.1", true); VALIDATE(s, "10", true); VALIDATE(s, "99", true); VALIDATE(s, "100", true); INVALIDATE(s, "101", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100.1, \"exclusiveMaximum\": true, \"actual\": 101" "}}"); INVALIDATE(s, "101.5", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100.1, \"exclusiveMaximum\": true, \"actual\": 101.5" "}}"); INVALIDATE(s, "18446744073709551614", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100.1, \"exclusiveMaximum\": true, \"actual\": 18446744073709551614" "}}"); INVALIDATE(s, "18446744073709551615", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100.1, \"exclusiveMaximum\": true, \"actual\": 18446744073709551615" "}}"); INVALIDATE(s, "2147483647", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100.1, \"exclusiveMaximum\": true, \"actual\": 2147483647" "}}"); // int max INVALIDATE(s, "2147483648", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100.1, \"exclusiveMaximum\": true, \"actual\": 2147483648" "}}"); // unsigned first INVALIDATE(s, "4294967295", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100.1, \"exclusiveMaximum\": true, \"actual\": 4294967295" "}}"); // unsigned max INVALIDATE(s, "9223372036854775808", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100.1, \"exclusiveMaximum\": true, \"actual\": 9223372036854775808" "}}"); INVALIDATE(s, "18446744073709551614", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100.1, \"exclusiveMaximum\": true, \"actual\": 18446744073709551614" "}}"); INVALIDATE(s, "18446744073709551615", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 3," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 100.1, \"exclusiveMaximum\": true, \"actual\": 18446744073709551615" "}}"); } TEST(SchemaValidator, Number_RangeDoubleU64Boundary) { Document sd; sd.Parse("{\"type\":\"number\",\"minimum\":9223372036854775808.0,\"maximum\":18446744073709550000.0}"); SchemaDocument s(sd); INVALIDATE(s, "-9223372036854775808", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775808.0, \"actual\": -9223372036854775808" "}}"); INVALIDATE(s, "-2147483648", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775808.0, \"actual\": -2147483648" "}}"); // int min INVALIDATE(s, "0", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775808.0, \"actual\": 0" "}}"); INVALIDATE(s, "2147483647", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775808.0, \"actual\": 2147483647" "}}"); // int max INVALIDATE(s, "2147483648", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775808.0, \"actual\": 2147483648" "}}"); // unsigned first INVALIDATE(s, "4294967295", "", "minimum", "", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 9223372036854775808.0, \"actual\": 4294967295" "}}"); // unsigned max VALIDATE(s, "9223372036854775808", true); VALIDATE(s, "18446744073709540000", true); INVALIDATE(s, "18446744073709551615", "", "maximum", "", "{ \"maximum\": {" " \"errorCode\": 2," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 18446744073709550000.0, \"actual\": 18446744073709551615" "}}"); } TEST(SchemaValidator, Number_MultipleOf) { Document sd; sd.Parse("{\"type\":\"number\",\"multipleOf\":10.0}"); SchemaDocument s(sd); VALIDATE(s, "0", true); VALIDATE(s, "10", true); VALIDATE(s, "-10", true); VALIDATE(s, "20", true); INVALIDATE(s, "23", "", "multipleOf", "", "{ \"multipleOf\": {" " \"errorCode\": 1," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 10.0, \"actual\": 23" "}}"); INVALIDATE(s, "-2147483648", "", "multipleOf", "", "{ \"multipleOf\": {" " \"errorCode\": 1," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 10.0, \"actual\": -2147483648" "}}"); // int min VALIDATE(s, "-2147483640", true); INVALIDATE(s, "2147483647", "", "multipleOf", "", "{ \"multipleOf\": {" " \"errorCode\": 1," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 10.0, \"actual\": 2147483647" "}}"); // int max INVALIDATE(s, "2147483648", "", "multipleOf", "", "{ \"multipleOf\": {" " \"errorCode\": 1," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 10.0, \"actual\": 2147483648" "}}"); // unsigned first VALIDATE(s, "2147483650", true); INVALIDATE(s, "4294967295", "", "multipleOf", "", "{ \"multipleOf\": {" " \"errorCode\": 1," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 10.0, \"actual\": 4294967295" "}}"); // unsigned max VALIDATE(s, "4294967300", true); } TEST(SchemaValidator, Number_MultipleOfOne) { Document sd; sd.Parse("{\"type\":\"number\",\"multipleOf\":1}"); SchemaDocument s(sd); VALIDATE(s, "42", true); VALIDATE(s, "42.0", true); INVALIDATE(s, "3.1415926", "", "multipleOf", "", "{ \"multipleOf\": {" " \"errorCode\": 1," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 1, \"actual\": 3.1415926" "}}"); } TEST(SchemaValidator, Object) { Document sd; sd.Parse("{\"type\":\"object\"}"); SchemaDocument s(sd); VALIDATE(s, "{\"key\":\"value\",\"another_key\":\"another_value\"}", true); VALIDATE(s, "{\"Sun\":1.9891e30,\"Jupiter\":1.8986e27,\"Saturn\":5.6846e26,\"Neptune\":10.243e25,\"Uranus\":8.6810e25,\"Earth\":5.9736e24,\"Venus\":4.8685e24,\"Mars\":6.4185e23,\"Mercury\":3.3022e23,\"Moon\":7.349e22,\"Pluto\":1.25e22}", true); INVALIDATE(s, "[\"An\", \"array\", \"not\", \"an\", \"object\"]", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"object\"], \"actual\": \"array\"" "}}"); INVALIDATE(s, "\"Not an object\"", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"object\"], \"actual\": \"string\"" "}}"); } TEST(SchemaValidator, Object_Properties) { Document sd; sd.Parse( "{" " \"type\": \"object\"," " \"properties\" : {" " \"number\": { \"type\": \"number\" }," " \"street_name\" : { \"type\": \"string\" }," " \"street_type\" : { \"type\": \"string\", \"enum\" : [\"Street\", \"Avenue\", \"Boulevard\"] }" " }" "}"); SchemaDocument s(sd); VALIDATE(s, "{ \"number\": 1600, \"street_name\": \"Pennsylvania\", \"street_type\": \"Avenue\" }", true); INVALIDATE(s, "{ \"number\": \"1600\", \"street_name\": \"Pennsylvania\", \"street_type\": \"Avenue\" }", "/properties/number", "type", "/number", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/number\", \"schemaRef\": \"#/properties/number\"," " \"expected\": [\"number\"], \"actual\": \"string\"" "}}"); INVALIDATE(s, "{ \"number\": \"One\", \"street_name\": \"Microsoft\", \"street_type\": \"Way\" }", "/properties/number", "type", "/number", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/number\", \"schemaRef\": \"#/properties/number\"," " \"expected\": [\"number\"], \"actual\": \"string\"" "}}"); // fail fast VALIDATE(s, "{ \"number\": 1600, \"street_name\": \"Pennsylvania\" }", true); VALIDATE(s, "{}", true); VALIDATE(s, "{ \"number\": 1600, \"street_name\": \"Pennsylvania\", \"street_type\": \"Avenue\", \"direction\": \"NW\" }", true); } TEST(SchemaValidator, Object_AdditionalPropertiesBoolean) { Document sd; sd.Parse( "{" " \"type\": \"object\"," " \"properties\" : {" " \"number\": { \"type\": \"number\" }," " \"street_name\" : { \"type\": \"string\" }," " \"street_type\" : { \"type\": \"string\"," " \"enum\" : [\"Street\", \"Avenue\", \"Boulevard\"]" " }" " }," " \"additionalProperties\": false" "}"); SchemaDocument s(sd); VALIDATE(s, "{ \"number\": 1600, \"street_name\": \"Pennsylvania\", \"street_type\": \"Avenue\" }", true); INVALIDATE(s, "{ \"number\": 1600, \"street_name\": \"Pennsylvania\", \"street_type\": \"Avenue\", \"direction\": \"NW\" }", "", "additionalProperties", "/direction", "{ \"additionalProperties\": {" " \"errorCode\": 16," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"disallowed\": \"direction\"" "}}"); } TEST(SchemaValidator, Object_AdditionalPropertiesObject) { Document sd; sd.Parse( "{" " \"type\": \"object\"," " \"properties\" : {" " \"number\": { \"type\": \"number\" }," " \"street_name\" : { \"type\": \"string\" }," " \"street_type\" : { \"type\": \"string\"," " \"enum\" : [\"Street\", \"Avenue\", \"Boulevard\"]" " }" " }," " \"additionalProperties\": { \"type\": \"string\" }" "}"); SchemaDocument s(sd); VALIDATE(s, "{ \"number\": 1600, \"street_name\": \"Pennsylvania\", \"street_type\": \"Avenue\" }", true); VALIDATE(s, "{ \"number\": 1600, \"street_name\": \"Pennsylvania\", \"street_type\": \"Avenue\", \"direction\": \"NW\" }", true); INVALIDATE(s, "{ \"number\": 1600, \"street_name\": \"Pennsylvania\", \"street_type\": \"Avenue\", \"office_number\": 201 }", "/additionalProperties", "type", "/office_number", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/office_number\", \"schemaRef\": \"#/additionalProperties\"," " \"expected\": [\"string\"], \"actual\": \"integer\"" "}}"); } TEST(SchemaValidator, Object_Required) { Document sd; sd.Parse( "{" " \"type\": \"object\"," " \"properties\" : {" " \"name\": { \"type\": \"string\" }," " \"email\" : { \"type\": \"string\" }," " \"address\" : { \"type\": \"string\" }," " \"telephone\" : { \"type\": \"string\" }" " }," " \"required\":[\"name\", \"email\"]" "}"); SchemaDocument s(sd); VALIDATE(s, "{ \"name\": \"William Shakespeare\", \"email\" : \"bill@stratford-upon-avon.co.uk\" }", true); VALIDATE(s, "{ \"name\": \"William Shakespeare\", \"email\" : \"bill@stratford-upon-avon.co.uk\", \"address\" : \"Henley Street, Stratford-upon-Avon, Warwickshire, England\", \"authorship\" : \"in question\"}", true); INVALIDATE(s, "{ \"name\": \"William Shakespeare\", \"address\" : \"Henley Street, Stratford-upon-Avon, Warwickshire, England\" }", "", "required", "", "{ \"required\": {" " \"errorCode\": 15," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"missing\": [\"email\"]" "}}"); INVALIDATE(s, "{}", "", "required", "", "{ \"required\": {" " \"errorCode\": 15," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"missing\": [\"name\", \"email\"]" "}}"); } TEST(SchemaValidator, Object_Required_PassWithDefault) { Document sd; sd.Parse( "{" " \"type\": \"object\"," " \"properties\" : {" " \"name\": { \"type\": \"string\", \"default\": \"William Shakespeare\" }," " \"email\" : { \"type\": \"string\", \"default\": \"\" }," " \"address\" : { \"type\": \"string\" }," " \"telephone\" : { \"type\": \"string\" }" " }," " \"required\":[\"name\", \"email\"]" "}"); SchemaDocument s(sd); VALIDATE(s, "{ \"email\" : \"bill@stratford-upon-avon.co.uk\", \"address\" : \"Henley Street, Stratford-upon-Avon, Warwickshire, England\", \"authorship\" : \"in question\"}", true); INVALIDATE(s, "{ \"name\": \"William Shakespeare\", \"address\" : \"Henley Street, Stratford-upon-Avon, Warwickshire, England\" }", "", "required", "", "{ \"required\": {" " \"errorCode\": 15," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"missing\": [\"email\"]" "}}"); INVALIDATE(s, "{}", "", "required", "", "{ \"required\": {" " \"errorCode\": 15," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"missing\": [\"email\"]" "}}"); } TEST(SchemaValidator, Object_PropertiesRange) { Document sd; sd.Parse("{\"type\":\"object\", \"minProperties\":2, \"maxProperties\":3}"); SchemaDocument s(sd); INVALIDATE(s, "{}", "", "minProperties", "", "{ \"minProperties\": {" " \"errorCode\": 14," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 2, \"actual\": 0" "}}"); INVALIDATE(s, "{\"a\":0}", "", "minProperties", "", "{ \"minProperties\": {" " \"errorCode\": 14," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 2, \"actual\": 1" "}}"); VALIDATE(s, "{\"a\":0,\"b\":1}", true); VALIDATE(s, "{\"a\":0,\"b\":1,\"c\":2}", true); INVALIDATE(s, "{\"a\":0,\"b\":1,\"c\":2,\"d\":3}", "", "maxProperties", "", "{ \"maxProperties\": {" " \"errorCode\": 13," " \"instanceRef\": \"#\", \"schemaRef\": \"#\", " " \"expected\": 3, \"actual\": 4" "}}"); } TEST(SchemaValidator, Object_PropertyDependencies) { Document sd; sd.Parse( "{" " \"type\": \"object\"," " \"properties\": {" " \"name\": { \"type\": \"string\" }," " \"credit_card\": { \"type\": \"number\" }," " \"cvv_code\": { \"type\": \"number\" }," " \"billing_address\": { \"type\": \"string\" }" " }," " \"required\": [\"name\"]," " \"dependencies\": {" " \"credit_card\": [\"cvv_code\", \"billing_address\"]" " }" "}"); SchemaDocument s(sd); VALIDATE(s, "{ \"name\": \"John Doe\", \"credit_card\": 5555555555555555, \"cvv_code\": 777, " "\"billing_address\": \"555 Debtor's Lane\" }", true); INVALIDATE(s, "{ \"name\": \"John Doe\", \"credit_card\": 5555555555555555 }", "", "dependencies", "", "{ \"dependencies\": {" " \"errorCode\": 18," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"errors\": {" " \"credit_card\": {" " \"required\": {" " \"errorCode\": 15," " \"instanceRef\": \"#\", \"schemaRef\": \"#/dependencies/credit_card\"," " \"missing\": [\"cvv_code\", \"billing_address\"]" " } } }" "}}"); VALIDATE(s, "{ \"name\": \"John Doe\"}", true); VALIDATE(s, "{ \"name\": \"John Doe\", \"cvv_code\": 777, \"billing_address\": \"555 Debtor's Lane\" }", true); } TEST(SchemaValidator, Object_SchemaDependencies) { Document sd; sd.Parse( "{" " \"type\": \"object\"," " \"properties\" : {" " \"name\": { \"type\": \"string\" }," " \"credit_card\" : { \"type\": \"number\" }" " }," " \"required\" : [\"name\"]," " \"dependencies\" : {" " \"credit_card\": {" " \"properties\": {" " \"billing_address\": { \"type\": \"string\" }" " }," " \"required\" : [\"billing_address\"]" " }" " }" "}"); SchemaDocument s(sd); VALIDATE(s, "{\"name\": \"John Doe\", \"credit_card\" : 5555555555555555,\"billing_address\" : \"555 Debtor's Lane\"}", true); INVALIDATE(s, "{\"name\": \"John Doe\", \"credit_card\" : 5555555555555555 }", "", "dependencies", "", "{ \"dependencies\": {" " \"errorCode\": 18," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"errors\": {" " \"credit_card\": {" " \"required\": {" " \"errorCode\": 15," " \"instanceRef\": \"#\", \"schemaRef\": \"#/dependencies/credit_card\"," " \"missing\": [\"billing_address\"]" " } } }" "}}"); VALIDATE(s, "{\"name\": \"John Doe\", \"billing_address\" : \"555 Debtor's Lane\"}", true); } #if RAPIDJSON_SCHEMA_HAS_REGEX TEST(SchemaValidator, Object_PatternProperties) { Document sd; sd.Parse( "{" " \"type\": \"object\"," " \"patternProperties\": {" " \"^S_\": { \"type\": \"string\" }," " \"^I_\": { \"type\": \"integer\" }" " }" "}"); SchemaDocument s(sd); VALIDATE(s, "{ \"S_25\": \"This is a string\" }", true); VALIDATE(s, "{ \"I_0\": 42 }", true); INVALIDATE(s, "{ \"S_0\": 42 }", "", "patternProperties", "/S_0", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/S_0\", \"schemaRef\": \"#/patternProperties/%5ES_\"," " \"expected\": [\"string\"], \"actual\": \"integer\"" "}}"); INVALIDATE(s, "{ \"I_42\": \"This is a string\" }", "", "patternProperties", "/I_42", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/I_42\", \"schemaRef\": \"#/patternProperties/%5EI_\"," " \"expected\": [\"integer\"], \"actual\": \"string\"" "}}"); VALIDATE(s, "{ \"keyword\": \"value\" }", true); } TEST(SchemaValidator, Object_PatternProperties_ErrorConflict) { Document sd; sd.Parse( "{" " \"type\": \"object\"," " \"patternProperties\": {" " \"^I_\": { \"multipleOf\": 5 }," " \"30$\": { \"multipleOf\": 6 }" " }" "}"); SchemaDocument s(sd); VALIDATE(s, "{ \"I_30\": 30 }", true); INVALIDATE(s, "{ \"I_30\": 7 }", "", "patternProperties", "/I_30", "{ \"multipleOf\": [" " {" " \"errorCode\": 1," " \"instanceRef\": \"#/I_30\", \"schemaRef\": \"#/patternProperties/%5EI_\"," " \"expected\": 5, \"actual\": 7" " }, {" " \"errorCode\": 1," " \"instanceRef\": \"#/I_30\", \"schemaRef\": \"#/patternProperties/30%24\"," " \"expected\": 6, \"actual\": 7" " }" "]}"); } TEST(SchemaValidator, Object_Properties_PatternProperties) { Document sd; sd.Parse( "{" " \"type\": \"object\"," " \"properties\": {" " \"I_42\": { \"type\": \"integer\", \"minimum\": 73 }" " }," " \"patternProperties\": {" " \"^I_\": { \"type\": \"integer\", \"multipleOf\": 6 }" " }" "}"); SchemaDocument s(sd); VALIDATE(s, "{ \"I_6\": 6 }", true); VALIDATE(s, "{ \"I_42\": 78 }", true); INVALIDATE(s, "{ \"I_42\": 42 }", "", "patternProperties", "/I_42", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#/I_42\", \"schemaRef\": \"#/properties/I_42\"," " \"expected\": 73, \"actual\": 42" "}}"); INVALIDATE(s, "{ \"I_42\": 7 }", "", "patternProperties", "/I_42", "{ \"minimum\": {" " \"errorCode\": 4," " \"instanceRef\": \"#/I_42\", \"schemaRef\": \"#/properties/I_42\"," " \"expected\": 73, \"actual\": 7" " }," " \"multipleOf\": {" " \"errorCode\": 1," " \"instanceRef\": \"#/I_42\", \"schemaRef\": \"#/patternProperties/%5EI_\"," " \"expected\": 6, \"actual\": 7" " }" "}"); } TEST(SchemaValidator, Object_PatternProperties_AdditionalPropertiesObject) { Document sd; sd.Parse( "{" " \"type\": \"object\"," " \"properties\": {" " \"builtin\": { \"type\": \"number\" }" " }," " \"patternProperties\": {" " \"^S_\": { \"type\": \"string\" }," " \"^I_\": { \"type\": \"integer\" }" " }," " \"additionalProperties\": { \"type\": \"string\" }" "}"); SchemaDocument s(sd); VALIDATE(s, "{ \"builtin\": 42 }", true); VALIDATE(s, "{ \"keyword\": \"value\" }", true); INVALIDATE(s, "{ \"keyword\": 42 }", "/additionalProperties", "type", "/keyword", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/keyword\", \"schemaRef\": \"#/additionalProperties\"," " \"expected\": [\"string\"], \"actual\": \"integer\"" "}}"); } // Replaces test Issue285 and tests failure as well as success TEST(SchemaValidator, Object_PatternProperties_AdditionalPropertiesBoolean) { Document sd; sd.Parse( "{" " \"type\": \"object\"," " \"patternProperties\": {" " \"^S_\": { \"type\": \"string\" }," " \"^I_\": { \"type\": \"integer\" }" " }," " \"additionalProperties\": false" "}"); SchemaDocument s(sd); VALIDATE(s, "{ \"S_25\": \"This is a string\" }", true); VALIDATE(s, "{ \"I_0\": 42 }", true); INVALIDATE(s, "{ \"keyword\": \"value\" }", "", "additionalProperties", "/keyword", "{ \"additionalProperties\": {" " \"errorCode\": 16," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"disallowed\": \"keyword\"" "}}"); } #endif TEST(SchemaValidator, Array) { Document sd; sd.Parse("{\"type\":\"array\"}"); SchemaDocument s(sd); VALIDATE(s, "[1, 2, 3, 4, 5]", true); VALIDATE(s, "[3, \"different\", { \"types\" : \"of values\" }]", true); INVALIDATE(s, "{\"Not\": \"an array\"}", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"array\"], \"actual\": \"object\"" "}}"); } TEST(SchemaValidator, Array_ItemsList) { Document sd; sd.Parse( "{" " \"type\": \"array\"," " \"items\" : {" " \"type\": \"number\"" " }" "}"); SchemaDocument s(sd); VALIDATE(s, "[1, 2, 3, 4, 5]", true); INVALIDATE(s, "[1, 2, \"3\", 4, 5]", "/items", "type", "/2", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/2\", \"schemaRef\": \"#/items\"," " \"expected\": [\"number\"], \"actual\": \"string\"" "}}"); VALIDATE(s, "[]", true); } TEST(SchemaValidator, Array_ItemsTuple) { Document sd; sd.Parse( "{" " \"type\": \"array\"," " \"items\": [" " {" " \"type\": \"number\"" " }," " {" " \"type\": \"string\"" " }," " {" " \"type\": \"string\"," " \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"]" " }," " {" " \"type\": \"string\"," " \"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"]" " }" " ]" "}"); SchemaDocument s(sd); VALIDATE(s, "[1600, \"Pennsylvania\", \"Avenue\", \"NW\"]", true); INVALIDATE(s, "[24, \"Sussex\", \"Drive\"]", "/items/2", "enum", "/2", "{ \"enum\": { \"errorCode\": 19, \"instanceRef\": \"#/2\", \"schemaRef\": \"#/items/2\" }}"); INVALIDATE(s, "[\"Palais de l'Elysee\"]", "/items/0", "type", "/0", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/0\", \"schemaRef\": \"#/items/0\"," " \"expected\": [\"number\"], \"actual\": \"string\"" "}}"); INVALIDATE(s, "[\"Twenty-four\", \"Sussex\", \"Drive\"]", "/items/0", "type", "/0", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/0\", \"schemaRef\": \"#/items/0\"," " \"expected\": [\"number\"], \"actual\": \"string\"" "}}"); // fail fast VALIDATE(s, "[10, \"Downing\", \"Street\"]", true); VALIDATE(s, "[1600, \"Pennsylvania\", \"Avenue\", \"NW\", \"Washington\"]", true); } TEST(SchemaValidator, Array_AdditionalItems) { Document sd; sd.Parse( "{" " \"type\": \"array\"," " \"items\": [" " {" " \"type\": \"number\"" " }," " {" " \"type\": \"string\"" " }," " {" " \"type\": \"string\"," " \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"]" " }," " {" " \"type\": \"string\"," " \"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"]" " }" " ]," " \"additionalItems\": false" "}"); SchemaDocument s(sd); VALIDATE(s, "[1600, \"Pennsylvania\", \"Avenue\", \"NW\"]", true); VALIDATE(s, "[1600, \"Pennsylvania\", \"Avenue\"]", true); INVALIDATE(s, "[1600, \"Pennsylvania\", \"Avenue\", \"NW\", \"Washington\"]", "", "additionalItems", "/4", "{ \"additionalItems\": {" " \"errorCode\": 12," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"disallowed\": 4" "}}"); } TEST(SchemaValidator, Array_ItemsRange) { Document sd; sd.Parse("{\"type\": \"array\",\"minItems\": 2,\"maxItems\" : 3}"); SchemaDocument s(sd); INVALIDATE(s, "[]", "", "minItems", "", "{ \"minItems\": {" " \"errorCode\": 10," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 2, \"actual\": 0" "}}"); INVALIDATE(s, "[1]", "", "minItems", "", "{ \"minItems\": {" " \"errorCode\": 10," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 2, \"actual\": 1" "}}"); VALIDATE(s, "[1, 2]", true); VALIDATE(s, "[1, 2, 3]", true); INVALIDATE(s, "[1, 2, 3, 4]", "", "maxItems", "", "{ \"maxItems\": {" " \"errorCode\": 9," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 3, \"actual\": 4" "}}"); } TEST(SchemaValidator, Array_UniqueItems) { Document sd; sd.Parse("{\"type\": \"array\", \"uniqueItems\": true}"); SchemaDocument s(sd); VALIDATE(s, "[1, 2, 3, 4, 5]", true); INVALIDATE(s, "[1, 2, 3, 3, 4]", "", "uniqueItems", "/3", "{ \"uniqueItems\": {" " \"errorCode\": 11," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"duplicates\": [2, 3]" "}}"); INVALIDATE(s, "[1, 2, 3, 3, 3]", "", "uniqueItems", "/3", "{ \"uniqueItems\": {" " \"errorCode\": 11," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"duplicates\": [2, 3]" "}}"); // fail fast VALIDATE(s, "[]", true); } TEST(SchemaValidator, Boolean) { Document sd; sd.Parse("{\"type\":\"boolean\"}"); SchemaDocument s(sd); VALIDATE(s, "true", true); VALIDATE(s, "false", true); INVALIDATE(s, "\"true\"", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"boolean\"], \"actual\": \"string\"" "}}"); INVALIDATE(s, "0", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"boolean\"], \"actual\": \"integer\"" "}}"); } TEST(SchemaValidator, Null) { Document sd; sd.Parse("{\"type\":\"null\"}"); SchemaDocument s(sd); VALIDATE(s, "null", true); INVALIDATE(s, "false", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"null\"], \"actual\": \"boolean\"" "}}"); INVALIDATE(s, "0", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"null\"], \"actual\": \"integer\"" "}}"); INVALIDATE(s, "\"\"", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"null\"], \"actual\": \"string\"" "}}"); } // Additional tests TEST(SchemaValidator, ObjectInArray) { Document sd; sd.Parse("{\"type\":\"array\", \"items\": { \"type\":\"string\" }}"); SchemaDocument s(sd); VALIDATE(s, "[\"a\"]", true); INVALIDATE(s, "[1]", "/items", "type", "/0", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/0\", \"schemaRef\": \"#/items\"," " \"expected\": [\"string\"], \"actual\": \"integer\"" "}}"); INVALIDATE(s, "[{}]", "/items", "type", "/0", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/0\", \"schemaRef\": \"#/items\"," " \"expected\": [\"string\"], \"actual\": \"object\"" "}}"); } TEST(SchemaValidator, MultiTypeInObject) { Document sd; sd.Parse( "{" " \"type\":\"object\"," " \"properties\": {" " \"tel\" : {" " \"type\":[\"integer\", \"string\"]" " }" " }" "}"); SchemaDocument s(sd); VALIDATE(s, "{ \"tel\": 999 }", true); VALIDATE(s, "{ \"tel\": \"123-456\" }", true); INVALIDATE(s, "{ \"tel\": true }", "/properties/tel", "type", "/tel", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/tel\", \"schemaRef\": \"#/properties/tel\"," " \"expected\": [\"string\", \"integer\"], \"actual\": \"boolean\"" "}}"); } TEST(SchemaValidator, MultiTypeWithObject) { Document sd; sd.Parse( "{" " \"type\": [\"object\",\"string\"]," " \"properties\": {" " \"tel\" : {" " \"type\": \"integer\"" " }" " }" "}"); SchemaDocument s(sd); VALIDATE(s, "\"Hello\"", true); VALIDATE(s, "{ \"tel\": 999 }", true); INVALIDATE(s, "{ \"tel\": \"fail\" }", "/properties/tel", "type", "/tel", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/tel\", \"schemaRef\": \"#/properties/tel\"," " \"expected\": [\"integer\"], \"actual\": \"string\"" "}}"); } TEST(SchemaValidator, AllOf_Nested) { Document sd; sd.Parse( "{" " \"allOf\": [" " { \"type\": \"string\", \"minLength\": 2 }," " { \"type\": \"string\", \"maxLength\": 5 }," " { \"allOf\": [ { \"enum\" : [\"ok\", \"okay\", \"OK\", \"o\"] }, { \"enum\" : [\"ok\", \"OK\", \"o\"]} ] }" " ]" "}"); SchemaDocument s(sd); VALIDATE(s, "\"ok\"", true); VALIDATE(s, "\"OK\"", true); INVALIDATE(s, "\"okay\"", "", "allOf", "", "{ \"allOf\": {" " \"errors\": [" " {},{}," " { \"allOf\": {" " \"errors\": [" " {}," " { \"enum\": {\"errorCode\": 19, \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/2/allOf/1\" }}" " ]," " \"errorCode\": 23, \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/2\"" " }}]," " \"errorCode\": 23, \"instanceRef\": \"#\", \"schemaRef\": \"#\"" "}}"); INVALIDATE(s, "\"o\"", "", "allOf", "", "{ \"allOf\": {" " \"errors\": [" " { \"minLength\": {\"actual\": \"o\", \"expected\": 2, \"errorCode\": 7, \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/0\" }}," " {},{}" " ]," " \"errorCode\": 23, \"instanceRef\": \"#\", \"schemaRef\": \"#\"" "}}"); INVALIDATE(s, "\"n\"", "", "allOf", "", "{ \"allOf\": {" " \"errors\": [" " { \"minLength\": {\"actual\": \"n\", \"expected\": 2, \"errorCode\": 7, \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/0\" }}," " {}," " { \"allOf\": {" " \"errors\": [" " { \"enum\": {\"errorCode\": 19 ,\"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/2/allOf/0\"}}," " { \"enum\": {\"errorCode\": 19, \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/2/allOf/1\"}}" " ]," " \"errorCode\": 23, \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/2\"" " }}" " ]," " \"errorCode\":23,\"instanceRef\":\"#\",\"schemaRef\":\"#\"" "}}"); INVALIDATE(s, "\"too long\"", "", "allOf", "", "{ \"allOf\": {" " \"errors\": [" " {}," " { \"maxLength\": {\"actual\": \"too long\", \"expected\": 5, \"errorCode\": 6, \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/1\" }}," " { \"allOf\": {" " \"errors\": [" " { \"enum\": {\"errorCode\": 19 ,\"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/2/allOf/0\"}}," " { \"enum\": {\"errorCode\": 19, \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/2/allOf/1\"}}" " ]," " \"errorCode\": 23, \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/2\"" " }}" " ]," " \"errorCode\":23,\"instanceRef\":\"#\",\"schemaRef\":\"#\"" "}}"); INVALIDATE(s, "123", "", "allOf", "", "{ \"allOf\": {" " \"errors\": [" " {\"type\": {\"expected\": [\"string\"], \"actual\": \"integer\", \"errorCode\": 20, \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/0\"}}," " {\"type\": {\"expected\": [\"string\"], \"actual\": \"integer\", \"errorCode\": 20, \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/1\"}}," " { \"allOf\": {" " \"errors\": [" " { \"enum\": {\"errorCode\": 19 ,\"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/2/allOf/0\"}}," " { \"enum\": {\"errorCode\": 19, \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/2/allOf/1\"}}" " ]," " \"errorCode\": 23, \"instanceRef\": \"#\", \"schemaRef\": \"#/allOf/2\"" " }}" " ]," " \"errorCode\":23,\"instanceRef\":\"#\",\"schemaRef\":\"#\"" "}}"); } TEST(SchemaValidator, EscapedPointer) { Document sd; sd.Parse( "{" " \"type\": \"object\"," " \"properties\": {" " \"~/\": { \"type\": \"number\" }" " }" "}"); SchemaDocument s(sd); INVALIDATE(s, "{\"~/\":true}", "/properties/~0~1", "type", "/~0~1", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/~0~1\", \"schemaRef\": \"#/properties/~0~1\"," " \"expected\": [\"number\"], \"actual\": \"boolean\"" "}}"); } TEST(SchemaValidator, SchemaPointer) { Document sd; sd.Parse( "{" " \"swagger\": \"2.0\"," " \"paths\": {" " \"/some/path\": {" " \"post\": {" " \"parameters\": [" " {" " \"in\": \"body\"," " \"name\": \"body\"," " \"schema\": {" " \"properties\": {" " \"a\": {" " \"$ref\": \"#/definitions/Prop_a\"" " }," " \"b\": {" " \"type\": \"integer\"" " }" " }," " \"type\": \"object\"" " }" " }" " ]," " \"responses\": {" " \"200\": {" " \"schema\": {" " \"$ref\": \"#/definitions/Resp_200\"" " }" " }" " }" " }" " }" " }," " \"definitions\": {" " \"Prop_a\": {" " \"properties\": {" " \"c\": {" " \"enum\": [" " \"C1\"," " \"C2\"," " \"C3\"" " ]," " \"type\": \"string\"" " }," " \"d\": {" " \"$ref\": \"#/definitions/Prop_d\"" " }," " \"s\": {" " \"type\": \"string\"" " }" " }," " \"required\": [\"c\"]," " \"type\": \"object\"" " }," " \"Prop_d\": {" " \"properties\": {" " \"a\": {" " \"$ref\": \"#/definitions/Prop_a\"" " }," " \"c\": {" " \"$ref\": \"#/definitions/Prop_a/properties/c\"" " }" " }," " \"type\": \"object\"" " }," " \"Resp_200\": {" " \"properties\": {" " \"e\": {" " \"type\": \"string\"" " }," " \"f\": {" " \"type\": \"boolean\"" " }" " }," " \"type\": \"object\"" " }" " }" "}"); SchemaDocument s1(sd, NULL, 0, NULL, NULL, Pointer("#/paths/~1some~1path/post/parameters/0/schema")); VALIDATE(s1, "{" " \"a\": {" " \"c\": \"C1\"," " \"d\": {" " \"a\": {" " \"c\": \"C2\"" " }," " \"c\": \"C3\"" " }" " }," " \"b\": 123" "}", true); INVALIDATE(s1, "{" " \"a\": {" " \"c\": \"C1\"," " \"d\": {" " \"a\": {" " \"c\": \"C2\"" " }," " \"c\": \"C3\"" " }" " }," " \"b\": \"should be an int\"" "}", "#/paths/~1some~1path/post/parameters/0/schema/properties/b", "type", "#/b", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\":\"#/b\"," " \"schemaRef\":\"#/paths/~1some~1path/post/parameters/0/schema/properties/b\"," " \"expected\": [\"integer\"], \"actual\":\"string\"" "}}"); INVALIDATE(s1, "{" " \"a\": {" " \"c\": \"C1\"," " \"d\": {" " \"a\": {" " \"c\": \"should be within enum\"" " }," " \"c\": \"C3\"" " }" " }," " \"b\": 123" "}", "#/definitions/Prop_a/properties/c", "enum", "#/a/d/a/c", "{ \"enum\": {" " \"errorCode\": 19," " \"instanceRef\":\"#/a/d/a/c\"," " \"schemaRef\":\"#/definitions/Prop_a/properties/c\"" "}}"); INVALIDATE(s1, "{" " \"a\": {" " \"c\": \"C1\"," " \"d\": {" " \"a\": {" " \"s\": \"required 'c' is missing\"" " }" " }" " }," " \"b\": 123" "}", "#/definitions/Prop_a", "required", "#/a/d/a", "{ \"required\": {" " \"errorCode\": 15," " \"missing\":[\"c\"]," " \"instanceRef\":\"#/a/d/a\"," " \"schemaRef\":\"#/definitions/Prop_a\"" "}}"); SchemaDocument s2(sd, NULL, 0, NULL, NULL, Pointer("#/paths/~1some~1path/post/responses/200/schema")); VALIDATE(s2, "{ \"e\": \"some string\", \"f\": false }", true); INVALIDATE(s2, "{ \"e\": true, \"f\": false }", "#/definitions/Resp_200/properties/e", "type", "#/e", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\":\"#/e\"," " \"schemaRef\":\"#/definitions/Resp_200/properties/e\"," " \"expected\": [\"string\"], \"actual\":\"boolean\"" "}}"); INVALIDATE(s2, "{ \"e\": \"some string\", \"f\": 123 }", "#/definitions/Resp_200/properties/f", "type", "#/f", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\":\"#/f\"," " \"schemaRef\":\"#/definitions/Resp_200/properties/f\"," " \"expected\": [\"boolean\"], \"actual\":\"integer\"" "}}"); } template static char* ReadFile(const char* filename, Allocator& allocator) { const char *paths[] = { "", "bin/", "../bin/", "../../bin/", "../../../bin/" }; char buffer[1024]; FILE *fp = 0; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { sprintf(buffer, "%s%s", paths[i], filename); fp = fopen(buffer, "rb"); if (fp) break; } if (!fp) return 0; fseek(fp, 0, SEEK_END); size_t length = static_cast(ftell(fp)); fseek(fp, 0, SEEK_SET); char* json = reinterpret_cast(allocator.Malloc(length + 1)); size_t readLength = fread(json, 1, length, fp); json[readLength] = '\0'; fclose(fp); return json; } TEST(SchemaValidator, ValidateMetaSchema) { CrtAllocator allocator; char* json = ReadFile("draft-04/schema", allocator); Document d; d.Parse(json); ASSERT_FALSE(d.HasParseError()); SchemaDocument sd(d); SchemaValidator validator(sd); d.Accept(validator); if (!validator.IsValid()) { StringBuffer sb; validator.GetInvalidSchemaPointer().StringifyUriFragment(sb); printf("Invalid schema: %s\n", sb.GetString()); printf("Invalid keyword: %s\n", validator.GetInvalidSchemaKeyword()); printf("Invalid code: %d\n", validator.GetInvalidSchemaCode()); printf("Invalid message: %s\n", GetValidateError_En(validator.GetInvalidSchemaCode())); sb.Clear(); validator.GetInvalidDocumentPointer().StringifyUriFragment(sb); printf("Invalid document: %s\n", sb.GetString()); sb.Clear(); Writer w(sb); validator.GetError().Accept(w); printf("Validation error: %s\n", sb.GetString()); ADD_FAILURE(); } CrtAllocator::Free(json); } TEST(SchemaValidator, ValidateMetaSchema_UTF16) { typedef GenericDocument > D; typedef GenericSchemaDocument SD; typedef GenericSchemaValidator SV; CrtAllocator allocator; char* json = ReadFile("draft-04/schema", allocator); D d; StringStream ss(json); d.ParseStream<0, UTF8<> >(ss); ASSERT_FALSE(d.HasParseError()); SD sd(d); SV validator(sd); d.Accept(validator); if (!validator.IsValid()) { GenericStringBuffer > sb; validator.GetInvalidSchemaPointer().StringifyUriFragment(sb); wprintf(L"Invalid schema: %ls\n", sb.GetString()); wprintf(L"Invalid keyword: %ls\n", validator.GetInvalidSchemaKeyword()); sb.Clear(); validator.GetInvalidDocumentPointer().StringifyUriFragment(sb); wprintf(L"Invalid document: %ls\n", sb.GetString()); sb.Clear(); Writer >, UTF16<> > w(sb); validator.GetError().Accept(w); printf("Validation error: %ls\n", sb.GetString()); ADD_FAILURE(); } CrtAllocator::Free(json); } template class RemoteSchemaDocumentProvider : public IGenericRemoteSchemaDocumentProvider { public: RemoteSchemaDocumentProvider() : documentAllocator_(documentBuffer_, sizeof(documentBuffer_)), schemaAllocator_(schemaBuffer_, sizeof(schemaBuffer_)) { const char* filenames[kCount] = { "jsonschema/remotes/integer.json", "jsonschema/remotes/subSchemas.json", "jsonschema/remotes/folder/folderInteger.json", "draft-04/schema", "unittestschema/address.json" }; const char* uris[kCount] = { "http://localhost:1234/integer.json", "http://localhost:1234/subSchemas.json", "http://localhost:1234/folder/folderInteger.json", "http://json-schema.org/draft-04/schema", "http://localhost:1234/address.json" }; for (size_t i = 0; i < kCount; i++) { sd_[i] = 0; char jsonBuffer[8192]; MemoryPoolAllocator<> jsonAllocator(jsonBuffer, sizeof(jsonBuffer)); char* json = ReadFile(filenames[i], jsonAllocator); if (!json) { printf("json remote file %s not found", filenames[i]); ADD_FAILURE(); } else { char stackBuffer[4096]; MemoryPoolAllocator<> stackAllocator(stackBuffer, sizeof(stackBuffer)); DocumentType d(&documentAllocator_, 1024, &stackAllocator); d.Parse(json); sd_[i] = new SchemaDocumentType(d, uris[i], static_cast(strlen(uris[i])), 0, &schemaAllocator_); MemoryPoolAllocator<>::Free(json); } }; } ~RemoteSchemaDocumentProvider() { for (size_t i = 0; i < kCount; i++) delete sd_[i]; } virtual const SchemaDocumentType* GetRemoteDocument(const char* uri, SizeType length) { //printf("GetRemoteDocument : %s\n", uri); for (size_t i = 0; i < kCount; i++) if (typename SchemaDocumentType::GValue(uri, length) == sd_[i]->GetURI()) { //printf("Matched document"); return sd_[i]; } //printf("No matched document"); return 0; } private: typedef GenericDocument, MemoryPoolAllocator<> > DocumentType; RemoteSchemaDocumentProvider(const RemoteSchemaDocumentProvider&); RemoteSchemaDocumentProvider& operator=(const RemoteSchemaDocumentProvider&); static const size_t kCount = 5; SchemaDocumentType* sd_[kCount]; typename DocumentType::AllocatorType documentAllocator_; typename SchemaDocumentType::AllocatorType schemaAllocator_; char documentBuffer_[16384]; char schemaBuffer_[128u * 1024]; }; TEST(SchemaValidator, TestSuite) { const char* filenames[] = { "additionalItems.json", "additionalProperties.json", "allOf.json", "anyOf.json", "default.json", "definitions.json", "dependencies.json", "enum.json", "items.json", "maximum.json", "maxItems.json", "maxLength.json", "maxProperties.json", "minimum.json", "minItems.json", "minLength.json", "minProperties.json", "multipleOf.json", "not.json", "oneOf.json", "pattern.json", "patternProperties.json", "properties.json", "ref.json", "refRemote.json", "required.json", "type.json", "uniqueItems.json" }; const char* onlyRunDescription = 0; //const char* onlyRunDescription = "a string is a string"; unsigned testCount = 0; unsigned passCount = 0; typedef GenericSchemaDocument > SchemaDocumentType; RemoteSchemaDocumentProvider provider; char jsonBuffer[65536]; char documentBuffer[65536]; char documentStackBuffer[65536]; char schemaBuffer[65536]; char validatorBuffer[65536]; MemoryPoolAllocator<> jsonAllocator(jsonBuffer, sizeof(jsonBuffer)); MemoryPoolAllocator<> documentAllocator(documentBuffer, sizeof(documentBuffer)); MemoryPoolAllocator<> documentStackAllocator(documentStackBuffer, sizeof(documentStackBuffer)); MemoryPoolAllocator<> schemaAllocator(schemaBuffer, sizeof(schemaBuffer)); MemoryPoolAllocator<> validatorAllocator(validatorBuffer, sizeof(validatorBuffer)); for (size_t i = 0; i < sizeof(filenames) / sizeof(filenames[0]); i++) { char filename[FILENAME_MAX]; sprintf(filename, "jsonschema/tests/draft4/%s", filenames[i]); char* json = ReadFile(filename, jsonAllocator); if (!json) { printf("json test suite file %s not found", filename); ADD_FAILURE(); } else { //printf("\njson test suite file %s parsed ok\n", filename); GenericDocument, MemoryPoolAllocator<>, MemoryPoolAllocator<> > d(&documentAllocator, 1024, &documentStackAllocator); d.Parse(json); if (d.HasParseError()) { printf("json test suite file %s has parse error", filename); ADD_FAILURE(); } else { for (Value::ConstValueIterator schemaItr = d.Begin(); schemaItr != d.End(); ++schemaItr) { { const char* description1 = (*schemaItr)["description"].GetString(); //printf("\ncompiling schema for json test %s \n", description1); SchemaDocumentType schema((*schemaItr)["schema"], filenames[i], static_cast(strlen(filenames[i])), &provider, &schemaAllocator); GenericSchemaValidator >, MemoryPoolAllocator<> > validator(schema, &validatorAllocator); const Value& tests = (*schemaItr)["tests"]; for (Value::ConstValueIterator testItr = tests.Begin(); testItr != tests.End(); ++testItr) { const char* description2 = (*testItr)["description"].GetString(); //printf("running json test %s \n", description2); if (!onlyRunDescription || strcmp(description2, onlyRunDescription) == 0) { const Value& data = (*testItr)["data"]; bool expected = (*testItr)["valid"].GetBool(); testCount++; validator.Reset(); data.Accept(validator); bool actual = validator.IsValid(); if (expected != actual) printf("Fail: %30s \"%s\" \"%s\"\n", filename, description1, description2); else { //printf("Passed: %30s \"%s\" \"%s\"\n", filename, description1, description2); passCount++; } } } //printf("%zu %zu %zu\n", documentAllocator.Size(), schemaAllocator.Size(), validatorAllocator.Size()); } schemaAllocator.Clear(); validatorAllocator.Clear(); } } } documentAllocator.Clear(); MemoryPoolAllocator<>::Free(json); jsonAllocator.Clear(); } printf("%d / %d passed (%2d%%)\n", passCount, testCount, passCount * 100 / testCount); if (passCount != testCount) ADD_FAILURE(); } TEST(SchemaValidatingReader, Simple) { Document sd; sd.Parse("{ \"type\": \"string\", \"enum\" : [\"red\", \"amber\", \"green\"] }"); SchemaDocument s(sd); Document d; StringStream ss("\"red\""); SchemaValidatingReader > reader(ss, s); d.Populate(reader); EXPECT_TRUE(reader.GetParseResult()); EXPECT_TRUE(reader.IsValid()); EXPECT_TRUE(d.IsString()); EXPECT_STREQ("red", d.GetString()); } TEST(SchemaValidatingReader, Invalid) { Document sd; sd.Parse("{\"type\":\"string\",\"minLength\":2,\"maxLength\":3}"); SchemaDocument s(sd); Document d; StringStream ss("\"ABCD\""); SchemaValidatingReader > reader(ss, s); d.Populate(reader); EXPECT_FALSE(reader.GetParseResult()); EXPECT_FALSE(reader.IsValid()); EXPECT_EQ(kParseErrorTermination, reader.GetParseResult().Code()); EXPECT_STREQ("maxLength", reader.GetInvalidSchemaKeyword()); EXPECT_TRUE(reader.GetInvalidSchemaCode() == kValidateErrorMaxLength); EXPECT_TRUE(reader.GetInvalidSchemaPointer() == SchemaDocument::PointerType("")); EXPECT_TRUE(reader.GetInvalidDocumentPointer() == SchemaDocument::PointerType("")); EXPECT_TRUE(d.IsNull()); Document e; e.Parse( "{ \"maxLength\": {" " \"errorCode\": 6," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 3, \"actual\": \"ABCD\"" "}}"); if (e != reader.GetError()) { ADD_FAILURE(); } } TEST(SchemaValidatingWriter, Simple) { Document sd; sd.Parse("{\"type\":\"string\",\"minLength\":2,\"maxLength\":3}"); SchemaDocument s(sd); Document d; StringBuffer sb; Writer writer(sb); GenericSchemaValidator > validator(s, writer); d.Parse("\"red\""); EXPECT_TRUE(d.Accept(validator)); EXPECT_TRUE(validator.IsValid()); EXPECT_STREQ("\"red\"", sb.GetString()); sb.Clear(); validator.Reset(); d.Parse("\"ABCD\""); EXPECT_FALSE(d.Accept(validator)); EXPECT_FALSE(validator.IsValid()); EXPECT_TRUE(validator.GetInvalidSchemaPointer() == SchemaDocument::PointerType("")); EXPECT_TRUE(validator.GetInvalidDocumentPointer() == SchemaDocument::PointerType("")); EXPECT_TRUE(validator.GetInvalidSchemaCode() == kValidateErrorMaxLength); Document e; e.Parse( "{ \"maxLength\": {" " \"errorCode\": 6," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": 3, \"actual\": \"ABCD\"" "}}"); EXPECT_EQ(e, validator.GetError()); } TEST(Schema, Issue848) { rapidjson::Document d; rapidjson::SchemaDocument s(d); rapidjson::GenericSchemaValidator v(s); } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS static SchemaDocument ReturnSchemaDocument() { Document sd; sd.Parse("{ \"type\": [\"number\", \"string\"] }"); SchemaDocument s(sd); return s; } TEST(Schema, Issue552) { SchemaDocument s = ReturnSchemaDocument(); VALIDATE(s, "42", true); VALIDATE(s, "\"Life, the universe, and everything\"", true); INVALIDATE(s, "[\"Life\", \"the universe\", \"and everything\"]", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"string\", \"number\"], \"actual\": \"array\"" "}}"); } #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS TEST(SchemaValidator, Issue608) { Document sd; sd.Parse("{\"required\": [\"a\", \"b\"] }"); SchemaDocument s(sd); VALIDATE(s, "{\"a\" : null, \"b\": null}", true); INVALIDATE(s, "{\"a\" : null, \"a\" : null}", "", "required", "", "{ \"required\": {" " \"errorCode\": 15," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"missing\": [\"b\"]" "}}"); } // Fail to resolve $ref in allOf causes crash in SchemaValidator::StartObject() TEST(SchemaValidator, Issue728_AllOfRef) { Document sd; sd.Parse("{\"allOf\": [{\"$ref\": \"#/abc\"}]}"); SchemaDocument s(sd); SCHEMAERROR(s, "{\"RefUnknown\":{\"errorCode\":5,\"instanceRef\":\"#/allOf/0\",\"value\":\"#/abc\"}}"); VALIDATE_(s, "{\"key1\": \"abc\", \"key2\": \"def\"}", true, false); } TEST(SchemaValidator, Issue1017_allOfHandler) { Document sd; sd.Parse("{\"allOf\": [{\"type\": \"object\",\"properties\": {\"cyanArray2\": {\"type\": \"array\",\"items\": { \"type\": \"string\" }}}},{\"type\": \"object\",\"properties\": {\"blackArray\": {\"type\": \"array\",\"items\": { \"type\": \"string\" }}},\"required\": [ \"blackArray\" ]}]}"); SchemaDocument s(sd); StringBuffer sb; Writer writer(sb); GenericSchemaValidator > validator(s, writer); EXPECT_TRUE(validator.StartObject()); EXPECT_TRUE(validator.Key("cyanArray2", 10, false)); EXPECT_TRUE(validator.StartArray()); EXPECT_TRUE(validator.EndArray(0)); EXPECT_TRUE(validator.Key("blackArray", 10, false)); EXPECT_TRUE(validator.StartArray()); EXPECT_TRUE(validator.EndArray(0)); EXPECT_TRUE(validator.EndObject(0)); EXPECT_TRUE(validator.IsValid()); EXPECT_STREQ("{\"cyanArray2\":[],\"blackArray\":[]}", sb.GetString()); } TEST(SchemaValidator, Ref_remote) { typedef GenericSchemaDocument > SchemaDocumentType; RemoteSchemaDocumentProvider provider; Document sd; sd.Parse("{\"$ref\": \"http://localhost:1234/subSchemas.json#/integer\"}"); SchemaDocumentType s(sd, 0, 0, &provider); typedef GenericSchemaValidator >, MemoryPoolAllocator<> > SchemaValidatorType; typedef GenericPointer > PointerType; INVALIDATE_(s, "null", "/integer", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\"," " \"schemaRef\": \"http://localhost:1234/subSchemas.json#/integer\"," " \"expected\": [\"integer\"], \"actual\": \"null\"" "}}", kValidateDefaultFlags, SchemaValidatorType, PointerType); } // Merge with id where $ref is full URI TEST(SchemaValidator, Ref_remote_change_resolution_scope_uri) { typedef GenericSchemaDocument > SchemaDocumentType; RemoteSchemaDocumentProvider provider; Document sd; sd.Parse("{\"id\": \"http://ignore/blah#/ref\", \"type\": \"object\", \"properties\": {\"myInt\": {\"$ref\": \"http://localhost:1234/subSchemas.json#/integer\"}}}"); SchemaDocumentType s(sd, 0, 0, &provider); typedef GenericSchemaValidator >, MemoryPoolAllocator<> > SchemaValidatorType; typedef GenericPointer > PointerType; INVALIDATE_(s, "{\"myInt\": null}", "/integer", "type", "/myInt", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/myInt\"," " \"schemaRef\": \"http://localhost:1234/subSchemas.json#/integer\"," " \"expected\": [\"integer\"], \"actual\": \"null\"" "}}", kValidateDefaultFlags, SchemaValidatorType, PointerType); } // Merge with id where $ref is a relative path TEST(SchemaValidator, Ref_remote_change_resolution_scope_relative_path) { typedef GenericSchemaDocument > SchemaDocumentType; RemoteSchemaDocumentProvider provider; Document sd; sd.Parse("{\"id\": \"http://localhost:1234/\", \"type\": \"object\", \"properties\": {\"myInt\": {\"$ref\": \"subSchemas.json#/integer\"}}}"); SchemaDocumentType s(sd, 0, 0, &provider); typedef GenericSchemaValidator >, MemoryPoolAllocator<> > SchemaValidatorType; typedef GenericPointer > PointerType; INVALIDATE_(s, "{\"myInt\": null}", "/integer", "type", "/myInt", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/myInt\"," " \"schemaRef\": \"http://localhost:1234/subSchemas.json#/integer\"," " \"expected\": [\"integer\"], \"actual\": \"null\"" "}}", kValidateDefaultFlags, SchemaValidatorType, PointerType); } // Merge with id where $ref is an absolute path TEST(SchemaValidator, Ref_remote_change_resolution_scope_absolute_path) { typedef GenericSchemaDocument > SchemaDocumentType; RemoteSchemaDocumentProvider provider; Document sd; sd.Parse("{\"id\": \"http://localhost:1234/xxxx\", \"type\": \"object\", \"properties\": {\"myInt\": {\"$ref\": \"/subSchemas.json#/integer\"}}}"); SchemaDocumentType s(sd, 0, 0, &provider); typedef GenericSchemaValidator >, MemoryPoolAllocator<> > SchemaValidatorType; typedef GenericPointer > PointerType; INVALIDATE_(s, "{\"myInt\": null}", "/integer", "type", "/myInt", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/myInt\"," " \"schemaRef\": \"http://localhost:1234/subSchemas.json#/integer\"," " \"expected\": [\"integer\"], \"actual\": \"null\"" "}}", kValidateDefaultFlags, SchemaValidatorType, PointerType); } // Merge with id where $ref is an absolute path, and the document has a base URI TEST(SchemaValidator, Ref_remote_change_resolution_scope_absolute_path_document) { typedef GenericSchemaDocument > SchemaDocumentType; RemoteSchemaDocumentProvider provider; Document sd; sd.Parse("{\"type\": \"object\", \"properties\": {\"myInt\": {\"$ref\": \"/subSchemas.json#/integer\"}}}"); SchemaDocumentType s(sd, "http://localhost:1234/xxxx", 26, &provider); typedef GenericSchemaValidator >, MemoryPoolAllocator<> > SchemaValidatorType; typedef GenericPointer > PointerType; INVALIDATE_(s, "{\"myInt\": null}", "/integer", "type", "/myInt", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/myInt\"," " \"schemaRef\": \"http://localhost:1234/subSchemas.json#/integer\"," " \"expected\": [\"integer\"], \"actual\": \"null\"" "}}", kValidateDefaultFlags, SchemaValidatorType, PointerType); } // $ref is a non-JSON pointer fragment and there a matching id TEST(SchemaValidator, Ref_internal_id_1) { typedef GenericSchemaDocument > SchemaDocumentType; Document sd; sd.Parse("{\"type\": \"object\", \"properties\": {\"myInt1\": {\"$ref\": \"#myId\"}, \"myStr\": {\"type\": \"string\", \"id\": \"#myStrId\"}, \"myInt2\": {\"type\": \"integer\", \"id\": \"#myId\"}}}"); SchemaDocumentType s(sd); typedef GenericSchemaValidator >, MemoryPoolAllocator<> > SchemaValidatorType; typedef GenericPointer > PointerType; INVALIDATE_(s, "{\"myInt1\": null}", "/properties/myInt2", "type", "/myInt1", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/myInt1\"," " \"schemaRef\": \"#/properties/myInt2\"," " \"expected\": [\"integer\"], \"actual\": \"null\"" "}}", kValidateDefaultFlags, SchemaValidatorType, PointerType); } // $ref is a non-JSON pointer fragment and there are two matching ids so we take the first TEST(SchemaValidator, Ref_internal_id_2) { typedef GenericSchemaDocument > SchemaDocumentType; Document sd; sd.Parse("{\"type\": \"object\", \"properties\": {\"myInt1\": {\"$ref\": \"#myId\"}, \"myInt2\": {\"type\": \"integer\", \"id\": \"#myId\"}, \"myStr\": {\"type\": \"string\", \"id\": \"#myId\"}}}"); SchemaDocumentType s(sd); typedef GenericSchemaValidator >, MemoryPoolAllocator<> > SchemaValidatorType; typedef GenericPointer > PointerType; INVALIDATE_(s, "{\"myInt1\": null}", "/properties/myInt2", "type", "/myInt1", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/myInt1\"," " \"schemaRef\": \"#/properties/myInt2\"," " \"expected\": [\"integer\"], \"actual\": \"null\"" "}}", kValidateDefaultFlags, SchemaValidatorType, PointerType); } // $ref is a non-JSON pointer fragment and there is a matching id within array TEST(SchemaValidator, Ref_internal_id_in_array) { typedef GenericSchemaDocument > SchemaDocumentType; Document sd; sd.Parse("{\"type\": \"object\", \"properties\": {\"myInt1\": {\"$ref\": \"#myId\"}, \"myInt2\": {\"anyOf\": [{\"type\": \"string\", \"id\": \"#myStrId\"}, {\"type\": \"integer\", \"id\": \"#myId\"}]}}}"); SchemaDocumentType s(sd); typedef GenericSchemaValidator >, MemoryPoolAllocator<> > SchemaValidatorType; typedef GenericPointer > PointerType; INVALIDATE_(s, "{\"myInt1\": null}", "/properties/myInt2/anyOf/1", "type", "/myInt1", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/myInt1\"," " \"schemaRef\": \"#/properties/myInt2/anyOf/1\"," " \"expected\": [\"integer\"], \"actual\": \"null\"" "}}", kValidateDefaultFlags, SchemaValidatorType, PointerType); } // $ref is a non-JSON pointer fragment and there is a matching id, and the schema is embedded in the document TEST(SchemaValidator, Ref_internal_id_and_schema_pointer) { typedef GenericSchemaDocument > SchemaDocumentType; Document sd; sd.Parse("{ \"schema\": {\"type\": \"object\", \"properties\": {\"myInt1\": {\"$ref\": \"#myId\"}, \"myInt2\": {\"anyOf\": [{\"type\": \"integer\", \"id\": \"#myId\"}]}}}}"); typedef GenericPointer > PointerType; SchemaDocumentType s(sd, 0, 0, 0, 0, PointerType("/schema")); typedef GenericSchemaValidator >, MemoryPoolAllocator<> > SchemaValidatorType; INVALIDATE_(s, "{\"myInt1\": null}", "/schema/properties/myInt2/anyOf/0", "type", "/myInt1", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#/myInt1\"," " \"schemaRef\": \"#/schema/properties/myInt2/anyOf/0\"," " \"expected\": [\"integer\"], \"actual\": \"null\"" "}}", kValidateDefaultFlags, SchemaValidatorType, PointerType); } // Test that $refs are correctly resolved when intermediate multiple ids are present // Includes $ref to a part of the document with a different in-scope id, which also contains $ref.. TEST(SchemaValidator, Ref_internal_multiple_ids) { typedef GenericSchemaDocument > SchemaDocumentType; //RemoteSchemaDocumentProvider provider; CrtAllocator allocator; char* schema = ReadFile("unittestschema/idandref.json", allocator); Document sd; sd.Parse(schema); ASSERT_FALSE(sd.HasParseError()); SchemaDocumentType s(sd, "http://xyz", 10/*, &provider*/); typedef GenericSchemaValidator >, MemoryPoolAllocator<> > SchemaValidatorType; typedef GenericPointer > PointerType; INVALIDATE_(s, "{\"PA1\": \"s\", \"PA2\": \"t\", \"PA3\": \"r\", \"PX1\": 1, \"PX2Y\": 2, \"PX3Z\": 3, \"PX4\": 4, \"PX5\": 5, \"PX6\": 6, \"PX7W\": 7, \"PX8N\": { \"NX\": 8}}", "#", "errors", "#", "{ \"type\": [" " {\"errorCode\": 20, \"instanceRef\": \"#/PA1\", \"schemaRef\": \"http://xyz#/definitions/A\", \"expected\": [\"integer\"], \"actual\": \"string\"}," " {\"errorCode\": 20, \"instanceRef\": \"#/PA2\", \"schemaRef\": \"http://xyz#/definitions/A\", \"expected\": [\"integer\"], \"actual\": \"string\"}," " {\"errorCode\": 20, \"instanceRef\": \"#/PA3\", \"schemaRef\": \"http://xyz#/definitions/A\", \"expected\": [\"integer\"], \"actual\": \"string\"}," " {\"errorCode\": 20, \"instanceRef\": \"#/PX1\", \"schemaRef\": \"http://xyz#/definitions/B/definitions/X\", \"expected\": [\"boolean\"], \"actual\": \"integer\"}," " {\"errorCode\": 20, \"instanceRef\": \"#/PX2Y\", \"schemaRef\": \"http://xyz#/definitions/B/definitions/X\", \"expected\": [\"boolean\"], \"actual\": \"integer\"}," " {\"errorCode\": 20, \"instanceRef\": \"#/PX3Z\", \"schemaRef\": \"http://xyz#/definitions/B/definitions/X\", \"expected\": [\"boolean\"], \"actual\": \"integer\"}," " {\"errorCode\": 20, \"instanceRef\": \"#/PX4\", \"schemaRef\": \"http://xyz#/definitions/B/definitions/X\", \"expected\": [\"boolean\"], \"actual\": \"integer\"}," " {\"errorCode\": 20, \"instanceRef\": \"#/PX5\", \"schemaRef\": \"http://xyz#/definitions/B/definitions/X\", \"expected\": [\"boolean\"], \"actual\": \"integer\"}," " {\"errorCode\": 20, \"instanceRef\": \"#/PX6\", \"schemaRef\": \"http://xyz#/definitions/B/definitions/X\", \"expected\": [\"boolean\"], \"actual\": \"integer\"}," " {\"errorCode\": 20, \"instanceRef\": \"#/PX7W\", \"schemaRef\": \"http://xyz#/definitions/B/definitions/X\", \"expected\": [\"boolean\"], \"actual\": \"integer\"}," " {\"errorCode\": 20, \"instanceRef\": \"#/PX8N/NX\", \"schemaRef\": \"http://xyz#/definitions/B/definitions/X\", \"expected\": [\"boolean\"], \"actual\": \"integer\"}" "]}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidatorType, PointerType); CrtAllocator::Free(schema); } TEST(SchemaValidator, Ref_remote_issue1210) { class SchemaDocumentProvider : public IRemoteSchemaDocumentProvider { SchemaDocument** collection; // Dummy private copy constructor & assignment operator. // Function bodies added so that they compile in MSVC 2019. SchemaDocumentProvider(const SchemaDocumentProvider&) : collection(NULL) { } SchemaDocumentProvider& operator=(const SchemaDocumentProvider&) { return *this; } public: SchemaDocumentProvider(SchemaDocument** collection) : collection(collection) { } virtual const SchemaDocument* GetRemoteDocument(const char* uri, SizeType length) { int i = 0; while (collection[i] && SchemaDocument::GValue(uri, length) != collection[i]->GetURI()) ++i; return collection[i]; } }; SchemaDocument* collection[] = { 0, 0, 0 }; SchemaDocumentProvider provider(collection); Document x, y, z; x.Parse("{\"properties\":{\"country\":{\"$ref\":\"y.json#/definitions/country_remote\"}},\"type\":\"object\"}"); y.Parse("{\"definitions\":{\"country_remote\":{\"$ref\":\"z.json#/definitions/country_list\"}}}"); z.Parse("{\"definitions\":{\"country_list\":{\"enum\":[\"US\"]}}}"); SchemaDocument sz(z, "z.json", 6, &provider); collection[0] = &sz; SchemaDocument sy(y, "y.json", 6, &provider); collection[1] = &sy; SchemaDocument sx(x, "x.json", 6, &provider); VALIDATE(sx, "{\"country\":\"UK\"}", false); VALIDATE(sx, "{\"country\":\"US\"}", true); } // Test that when kValidateContinueOnErrorFlag is set, all errors are reported. TEST(SchemaValidator, ContinueOnErrors) { CrtAllocator allocator; char* schema = ReadFile("unittestschema/address.json", allocator); Document sd; sd.Parse(schema); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); VALIDATE(s, "{\"version\": 1.0, \"address\": {\"number\": 24, \"street1\": \"The Woodlands\", \"street3\": \"Ham\", \"city\": \"Romsey\", \"area\": \"Kent\", \"country\": \"UK\", \"postcode\": \"SO51 0GP\"}, \"phones\": [\"0111-222333\", \"0777-666888\"], \"names\": [\"Fred\", \"Bloggs\"]}", true); INVALIDATE_(s, "{\"version\": 1.01, \"address\": {\"number\": 0, \"street2\": false, \"street3\": \"Ham\", \"city\": \"RomseyTownFC\", \"area\": \"Narnia\", \"country\": \"USA\", \"postcode\": \"999ABC\"}, \"phones\": [], \"planet\": \"Earth\", \"extra\": {\"S_xxx\": 123}}", "#", "errors", "#", "{ \"multipleOf\": {" " \"errorCode\": 1, \"instanceRef\": \"#/version\", \"schemaRef\": \"#/definitions/decimal_type\", \"expected\": 1.0, \"actual\": 1.01" " }," " \"minimum\": {" " \"errorCode\": 5, \"instanceRef\": \"#/address/number\", \"schemaRef\": \"#/definitions/positiveInt_type\", \"expected\": 0, \"actual\": 0, \"exclusiveMinimum\": true" " }," " \"type\": [" " {\"expected\": [\"null\", \"string\"], \"actual\": \"boolean\", \"errorCode\": 20, \"instanceRef\": \"#/address/street2\", \"schemaRef\": \"#/definitions/address_type/properties/street2\"}," " {\"expected\": [\"string\"], \"actual\": \"integer\", \"errorCode\": 20, \"instanceRef\": \"#/extra/S_xxx\", \"schemaRef\": \"#/properties/extra/patternProperties/%5ES_\"}" " ]," " \"maxLength\": {" " \"actual\": \"RomseyTownFC\", \"expected\": 10, \"errorCode\": 6, \"instanceRef\": \"#/address/city\", \"schemaRef\": \"#/definitions/address_type/properties/city\"" " }," " \"anyOf\": {" " \"errors\":[" " {\"pattern\": {\"actual\": \"999ABC\", \"errorCode\": 8, \"instanceRef\": \"#/address/postcode\", \"schemaRef\": \"#/definitions/address_type/properties/postcode/anyOf/0\"}}," " {\"pattern\": {\"actual\": \"999ABC\", \"errorCode\": 8, \"instanceRef\": \"#/address/postcode\", \"schemaRef\": \"#/definitions/address_type/properties/postcode/anyOf/1\"}}" " ]," " \"errorCode\": 24, \"instanceRef\": \"#/address/postcode\", \"schemaRef\": \"#/definitions/address_type/properties/postcode\"" " }," " \"allOf\": {" " \"errors\":[" " {\"enum\":{\"errorCode\":19,\"instanceRef\":\"#/address/country\",\"schemaRef\":\"#/definitions/country_type\"}}" " ]," " \"errorCode\":23,\"instanceRef\":\"#/address/country\",\"schemaRef\":\"#/definitions/address_type/properties/country\"" " }," " \"minItems\": {" " \"actual\": 0, \"expected\": 1, \"errorCode\": 10, \"instanceRef\": \"#/phones\", \"schemaRef\": \"#/properties/phones\"" " }," " \"additionalProperties\": {" " \"disallowed\": \"planet\", \"errorCode\": 16, \"instanceRef\": \"#\", \"schemaRef\": \"#\"" " }," " \"required\": {" " \"missing\": [\"street1\"], \"errorCode\": 15, \"instanceRef\": \"#/address\", \"schemaRef\": \"#/definitions/address_type\"" " }," " \"oneOf\": {" " \"matches\": [0, 1], \"errorCode\": 22, \"instanceRef\": \"#/address/area\", \"schemaRef\": \"#/definitions/address_type/properties/area\"" " }" "}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidator, Pointer); INVALIDATE_(s, "{\"address\": {\"number\": 200, \"street1\": {}, \"street3\": null, \"city\": \"Rom\", \"area\": \"Dorset\", \"postcode\": \"SO51 0GP\"}, \"phones\": [\"0111-222333\", \"0777-666888\", \"0777-666888\"], \"names\": [\"Fred\", \"S\", \"M\", \"Bloggs\"]}", "#", "errors", "#", "{ \"maximum\": {" " \"errorCode\": 3, \"instanceRef\": \"#/address/number\", \"schemaRef\": \"#/definitions/positiveInt_type\", \"expected\": 100, \"actual\": 200, \"exclusiveMaximum\": true" " }," " \"type\": {" " \"expected\": [\"string\"], \"actual\": \"object\", \"errorCode\": 20, \"instanceRef\": \"#/address/street1\", \"schemaRef\": \"#/definitions/address_type/properties/street1\"" " }," " \"not\": {" " \"errorCode\": 25, \"instanceRef\": \"#/address/street3\", \"schemaRef\": \"#/definitions/address_type/properties/street3\"" " }," " \"minLength\": {" " \"actual\": \"Rom\", \"expected\": 4, \"errorCode\": 7, \"instanceRef\": \"#/address/city\", \"schemaRef\": \"#/definitions/address_type/properties/city\"" " }," " \"maxItems\": {" " \"actual\": 3, \"expected\": 2, \"errorCode\": 9, \"instanceRef\": \"#/phones\", \"schemaRef\": \"#/properties/phones\"" " }," " \"uniqueItems\": {" " \"duplicates\": [1, 2], \"errorCode\": 11, \"instanceRef\": \"#/phones\", \"schemaRef\": \"#/properties/phones\"" " }," " \"minProperties\": {\"actual\": 6, \"expected\": 7, \"errorCode\": 14, \"instanceRef\": \"#/address\", \"schemaRef\": \"#/definitions/address_type\"" " }," " \"additionalItems\": [" " {\"disallowed\": 2, \"errorCode\": 12, \"instanceRef\": \"#/names\", \"schemaRef\": \"#/properties/names\"}," " {\"disallowed\": 3, \"errorCode\": 12, \"instanceRef\": \"#/names\", \"schemaRef\": \"#/properties/names\"}" " ]," " \"dependencies\": {" " \"errors\": {" " \"address\": {\"required\": {\"missing\": [\"version\"], \"errorCode\": 15, \"instanceRef\": \"#\", \"schemaRef\": \"#/dependencies/address\"}}," " \"names\": {\"required\": {\"missing\": [\"version\"], \"errorCode\": 15, \"instanceRef\": \"#\", \"schemaRef\": \"#/dependencies/names\"}}" " }," " \"errorCode\": 18, \"instanceRef\": \"#\", \"schemaRef\": \"#\"" " }," " \"oneOf\": {" " \"errors\": [" " {\"enum\": {\"errorCode\": 19, \"instanceRef\": \"#/address/area\", \"schemaRef\": \"#/definitions/county_type\"}}," " {\"enum\": {\"errorCode\": 19, \"instanceRef\": \"#/address/area\", \"schemaRef\": \"#/definitions/province_type\"}}" " ]," " \"errorCode\": 21, \"instanceRef\": \"#/address/area\", \"schemaRef\": \"#/definitions/address_type/properties/area\"" " }" "}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidator, Pointer); CrtAllocator::Free(schema); } // Test that when kValidateContinueOnErrorFlag is set, it is not propagated to oneOf sub-validator so we only get the first error. TEST(SchemaValidator, ContinueOnErrors_OneOf) { typedef GenericSchemaDocument > SchemaDocumentType; RemoteSchemaDocumentProvider provider; CrtAllocator allocator; char* schema = ReadFile("unittestschema/oneOf_address.json", allocator); Document sd; sd.Parse(schema); ASSERT_FALSE(sd.HasParseError()); SchemaDocumentType s(sd, 0, 0, &provider); typedef GenericSchemaValidator >, MemoryPoolAllocator<> > SchemaValidatorType; typedef GenericPointer > PointerType; INVALIDATE_(s, "{\"version\": 1.01, \"address\": {\"number\": 0, \"street2\": false, \"street3\": \"Ham\", \"city\": \"RomseyTownFC\", \"area\": \"BC\", \"country\": \"USA\", \"postcode\": \"999ABC\"}, \"phones\": [], \"planet\": \"Earth\", \"extra\": {\"S_xxx\": 123}}", "#", "errors", "#", "{ \"oneOf\": {" " \"errors\": [{" " \"multipleOf\": {" " \"errorCode\": 1, \"instanceRef\": \"#/version\", \"schemaRef\": \"http://localhost:1234/address.json#/definitions/decimal_type\", \"expected\": 1.0, \"actual\": 1.01" " }" " }]," " \"errorCode\": 21, \"instanceRef\": \"#\", \"schemaRef\": \"#\"" " }" "}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidatorType, PointerType); CrtAllocator::Free(schema); } // Test that when kValidateContinueOnErrorFlag is set, it is not propagated to allOf sub-validator so we only get the first error. TEST(SchemaValidator, ContinueOnErrors_AllOf) { typedef GenericSchemaDocument > SchemaDocumentType; RemoteSchemaDocumentProvider provider; CrtAllocator allocator; char* schema = ReadFile("unittestschema/allOf_address.json", allocator); Document sd; sd.Parse(schema); ASSERT_FALSE(sd.HasParseError()); SchemaDocumentType s(sd, 0, 0, &provider); typedef GenericSchemaValidator >, MemoryPoolAllocator<> > SchemaValidatorType; typedef GenericPointer > PointerType; INVALIDATE_(s, "{\"version\": 1.01, \"address\": {\"number\": 0, \"street2\": false, \"street3\": \"Ham\", \"city\": \"RomseyTownFC\", \"area\": \"BC\", \"country\": \"USA\", \"postcode\": \"999ABC\"}, \"phones\": [], \"planet\": \"Earth\", \"extra\": {\"S_xxx\": 123}}", "#", "errors", "#", "{ \"allOf\": {" " \"errors\": [{" " \"multipleOf\": {" " \"errorCode\": 1, \"instanceRef\": \"#/version\", \"schemaRef\": \"http://localhost:1234/address.json#/definitions/decimal_type\", \"expected\": 1.0, \"actual\": 1.01" " }" " }]," " \"errorCode\": 23, \"instanceRef\": \"#\", \"schemaRef\": \"#\"" " }" "}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidatorType, PointerType); CrtAllocator::Free(schema); } // Test that when kValidateContinueOnErrorFlag is set, it is not propagated to anyOf sub-validator so we only get the first error. TEST(SchemaValidator, ContinueOnErrors_AnyOf) { typedef GenericSchemaDocument > SchemaDocumentType; RemoteSchemaDocumentProvider provider; CrtAllocator allocator; char* schema = ReadFile("unittestschema/anyOf_address.json", allocator); Document sd; sd.Parse(schema); ASSERT_FALSE(sd.HasParseError()); SchemaDocumentType s(sd, 0, 0, &provider); typedef GenericSchemaValidator >, MemoryPoolAllocator<> > SchemaValidatorType; typedef GenericPointer > PointerType; INVALIDATE_(s, "{\"version\": 1.01, \"address\": {\"number\": 0, \"street2\": false, \"street3\": \"Ham\", \"city\": \"RomseyTownFC\", \"area\": \"BC\", \"country\": \"USA\", \"postcode\": \"999ABC\"}, \"phones\": [], \"planet\": \"Earth\", \"extra\": {\"S_xxx\": 123}}", "#", "errors", "#", "{ \"anyOf\": {" " \"errors\": [{" " \"multipleOf\": {" " \"errorCode\": 1, \"instanceRef\": \"#/version\", \"schemaRef\": \"http://localhost:1234/address.json#/definitions/decimal_type\", \"expected\": 1.0, \"actual\": 1.01" " }" " }]," " \"errorCode\": 24, \"instanceRef\": \"#\", \"schemaRef\": \"#\"" " }" "}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidatorType, PointerType); CrtAllocator::Free(schema); } // Test that when kValidateContinueOnErrorFlag is set, arrays with uniqueItems:true are correctly processed when an item is invalid. // This tests that we don't blow up if a hasher does not get created. TEST(SchemaValidator, ContinueOnErrors_UniqueItems) { CrtAllocator allocator; char* schema = ReadFile("unittestschema/address.json", allocator); Document sd; sd.Parse(schema); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); VALIDATE(s, "{\"phones\":[\"12-34\",\"56-78\"]}", true); INVALIDATE_(s, "{\"phones\":[\"12-34\",\"12-34\"]}", "#", "errors", "#", "{\"uniqueItems\": {\"duplicates\": [0,1], \"errorCode\": 11, \"instanceRef\": \"#/phones\", \"schemaRef\": \"#/properties/phones\"}}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidator, Pointer); INVALIDATE_(s, "{\"phones\":[\"ab-34\",\"cd-78\"]}", "#", "errors", "#", "{\"pattern\": [" " {\"actual\": \"ab-34\", \"errorCode\": 8, \"instanceRef\": \"#/phones/0\", \"schemaRef\": \"#/definitions/phone_type\"}," " {\"actual\": \"cd-78\", \"errorCode\": 8, \"instanceRef\": \"#/phones/1\", \"schemaRef\": \"#/definitions/phone_type\"}" "]}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidator, Pointer); CrtAllocator::Free(schema); } // Test that when kValidateContinueOnErrorFlag is set, an enum field is correctly processed when it has an invalid value. // This tests that we don't blow up if a hasher does not get created. TEST(SchemaValidator, ContinueOnErrors_Enum) { CrtAllocator allocator; char* schema = ReadFile("unittestschema/address.json", allocator); Document sd; sd.Parse(schema); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); VALIDATE(s, "{\"gender\":\"M\"}", true); INVALIDATE_(s, "{\"gender\":\"X\"}", "#", "errors", "#", "{\"enum\": {\"errorCode\": 19, \"instanceRef\": \"#/gender\", \"schemaRef\": \"#/properties/gender\"}}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidator, Pointer); INVALIDATE_(s, "{\"gender\":1}", "#", "errors", "#", "{\"type\": {\"expected\":[\"string\"], \"actual\": \"integer\", \"errorCode\": 20, \"instanceRef\": \"#/gender\", \"schemaRef\": \"#/properties/gender\"}}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidator, Pointer); CrtAllocator::Free(schema); } // Test that when kValidateContinueOnErrorFlag is set, an array appearing for an object property is handled // This tests that we don't blow up when there is a type mismatch. TEST(SchemaValidator, ContinueOnErrors_RogueArray) { CrtAllocator allocator; char* schema = ReadFile("unittestschema/address.json", allocator); Document sd; sd.Parse(schema); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); INVALIDATE_(s, "{\"address\":[{\"number\": 0}]}", "#", "errors", "#", "{\"type\": {\"expected\":[\"object\"], \"actual\": \"array\", \"errorCode\": 20, \"instanceRef\": \"#/address\", \"schemaRef\": \"#/definitions/address_type\"}," " \"dependencies\": {" " \"errors\": {" " \"address\": {\"required\": {\"missing\": [\"version\"], \"errorCode\": 15, \"instanceRef\": \"#\", \"schemaRef\": \"#/dependencies/address\"}}" " },\"errorCode\": 18, \"instanceRef\": \"#\", \"schemaRef\": \"#\"}}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidator, Pointer); CrtAllocator::Free(schema); } // Test that when kValidateContinueOnErrorFlag is set, an object appearing for an array property is handled // This tests that we don't blow up when there is a type mismatch. TEST(SchemaValidator, ContinueOnErrors_RogueObject) { CrtAllocator allocator; char* schema = ReadFile("unittestschema/address.json", allocator); Document sd; sd.Parse(schema); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); INVALIDATE_(s, "{\"phones\":{\"number\": 0}}", "#", "errors", "#", "{\"type\": {\"expected\":[\"array\"], \"actual\": \"object\", \"errorCode\": 20, \"instanceRef\": \"#/phones\", \"schemaRef\": \"#/properties/phones\"}}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidator, Pointer); CrtAllocator::Free(schema); } // Test that when kValidateContinueOnErrorFlag is set, a string appearing for an array or object property is handled // This tests that we don't blow up when there is a type mismatch. TEST(SchemaValidator, ContinueOnErrors_RogueString) { CrtAllocator allocator; char* schema = ReadFile("unittestschema/address.json", allocator); Document sd; sd.Parse(schema); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); INVALIDATE_(s, "{\"address\":\"number\"}", "#", "errors", "#", "{\"type\": {\"expected\":[\"object\"], \"actual\": \"string\", \"errorCode\": 20, \"instanceRef\": \"#/address\", \"schemaRef\": \"#/definitions/address_type\"}," " \"dependencies\": {" " \"errors\": {" " \"address\": {\"required\": {\"missing\": [\"version\"], \"errorCode\": 15, \"instanceRef\": \"#\", \"schemaRef\": \"#/dependencies/address\"}}" " },\"errorCode\": 18, \"instanceRef\": \"#\", \"schemaRef\": \"#\"}}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidator, Pointer); INVALIDATE_(s, "{\"phones\":\"number\"}", "#", "errors", "#", "{\"type\": {\"expected\":[\"array\"], \"actual\": \"string\", \"errorCode\": 20, \"instanceRef\": \"#/phones\", \"schemaRef\": \"#/properties/phones\"}}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidator, Pointer); CrtAllocator::Free(schema); } // Test that when kValidateContinueOnErrorFlag is set, an incorrect simple type with a sub-schema is handled correctly. // This tests that we don't blow up when there is a type mismatch but there is a sub-schema present TEST(SchemaValidator, ContinueOnErrors_BadSimpleType) { Document sd; sd.Parse("{\"type\":\"string\", \"anyOf\":[{\"maxLength\":2}]}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); VALIDATE(s, "\"AB\"", true); INVALIDATE_(s, "\"ABC\"", "#", "errors", "#", "{ \"anyOf\": {" " \"errors\": [{" " \"maxLength\": {" " \"errorCode\": 6, \"instanceRef\": \"#\", \"schemaRef\": \"#/anyOf/0\", \"expected\": 2, \"actual\": \"ABC\"" " }" " }]," " \"errorCode\": 24, \"instanceRef\": \"#\", \"schemaRef\": \"#\"" " }" "}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidator, Pointer); // Invalid type INVALIDATE_(s, "333", "#", "errors", "#", "{ \"type\": {" " \"errorCode\": 20, \"instanceRef\": \"#\", \"schemaRef\": \"#\", \"expected\": [\"string\"], \"actual\": \"integer\"" " }" "}", kValidateDefaultFlags | kValidateContinueOnErrorFlag, SchemaValidator, Pointer); } TEST(SchemaValidator, UnknownValidationError) { ASSERT_TRUE(SchemaValidator::SchemaType::GetValidateErrorKeyword(kValidateErrors).GetString() == std::string("null")); } // The first occurrence of a duplicate keyword is taken TEST(SchemaValidator, DuplicateKeyword) { Document sd; sd.Parse("{ \"title\": \"test\",\"type\": \"number\", \"type\": \"string\" }"); EXPECT_FALSE(sd.HasParseError()); SchemaDocument s(sd); VALIDATE(s, "42", true); INVALIDATE(s, "\"Life, the universe, and everything\"", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"number\"], \"actual\": \"string\"" "}}"); } // SchemaDocument tests // Specification (schema draft, open api version) TEST(SchemaValidator, Schema_SupportedNotObject) { Document sd; sd.Parse("true"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_TRUE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraft04); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); EXPECT_TRUE(s.GetError().ObjectEmpty()); } TEST(SchemaValidator, Schema_SupportedNoSpec) { Document sd; sd.Parse("{\"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_TRUE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraft04); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); EXPECT_TRUE(s.GetError().ObjectEmpty()); } TEST(SchemaValidator, Schema_SupportedNoSpecStatic) { typedef GenericSchemaDocument > SchemaDocumentType; Document sd; sd.Parse("{\"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); Specification spec = SchemaDocumentType::GetSpecification(sd); ASSERT_FALSE(spec.IsSupported()); ASSERT_TRUE(spec.draft == kDraftNone); ASSERT_TRUE(spec.oapi == kVersionNone); } TEST(SchemaValidator, Schema_SupportedDraft5Static) { typedef GenericSchemaDocument > SchemaDocumentType; Document sd; sd.Parse("{\"$schema\":\"http://json-schema.org/draft-05/schema#\", \"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); Specification spec = SchemaDocumentType::GetSpecification(sd); ASSERT_TRUE(spec.IsSupported()); ASSERT_TRUE(spec.draft == kDraft05); ASSERT_TRUE(spec.oapi == kVersionNone); } TEST(SchemaValidator, Schema_SupportedDraft4) { Document sd; sd.Parse("{\"$schema\":\"http://json-schema.org/draft-04/schema#\", \"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_TRUE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraft04); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); EXPECT_TRUE(s.GetError().ObjectEmpty()); } TEST(SchemaValidator, Schema_SupportedDraft4NoFrag) { Document sd; sd.Parse("{\"$schema\":\"http://json-schema.org/draft-04/schema\", \"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_TRUE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraft04); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); EXPECT_TRUE(s.GetError().ObjectEmpty()); } TEST(SchemaValidator, Schema_SupportedDraft5) { Document sd; sd.Parse("{\"$schema\":\"http://json-schema.org/draft-05/schema#\", \"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_TRUE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraft05); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); EXPECT_TRUE(s.GetError().ObjectEmpty()); } TEST(SchemaValidator, Schema_SupportedDraft5NoFrag) { Document sd; sd.Parse("{\"$schema\":\"http://json-schema.org/draft-05/schema\", \"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_TRUE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraft05); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); EXPECT_TRUE(s.GetError().ObjectEmpty()); } TEST(SchemaValidator, Schema_IgnoreDraftEmbedded) { Document sd; sd.Parse("{\"root\": {\"$schema\":\"http://json-schema.org/draft-05/schema#\", \"type\": \"integer\"}}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd, 0, 0, 0, 0, SchemaDocument::PointerType("/root")); ASSERT_TRUE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraft04); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); EXPECT_TRUE(s.GetError().ObjectEmpty()); } TEST(SchemaValidator, Schema_SupportedDraftOverride) { Document sd; sd.Parse("{\"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd, 0, 0, 0, 0, 0, Specification(kDraft04)); ASSERT_TRUE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraft04); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); EXPECT_TRUE(s.GetError().ObjectEmpty()); } TEST(SchemaValidator, Schema_UnknownDraftOverride) { Document sd; sd.Parse("{\"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd, 0, 0, 0, 0, 0, Specification(kDraftUnknown)); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraftUnknown); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); SCHEMAERROR(s, "{\"SpecUnknown\":{\"errorCode\":10,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_UnsupportedDraftOverride) { Document sd; sd.Parse("{\"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd, 0, 0, 0, 0, 0, Specification(kDraft03)); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraft03); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); SCHEMAERROR(s, "{\"SpecUnsupported\":{\"errorCode\":11,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_UnknownDraft) { Document sd; sd.Parse("{\"$schema\":\"http://json-schema.org/draft-xxx/schema#\", \"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraftUnknown); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); SCHEMAERROR(s, "{\"SpecUnknown\":{\"errorCode\":10,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_UnknownDraftNotString) { Document sd; sd.Parse("{\"$schema\": 4, \"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraftUnknown); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); SCHEMAERROR(s, "{\"SpecUnknown\":{\"errorCode\":10,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_UnsupportedDraft3) { Document sd; sd.Parse("{\"$schema\":\"http://json-schema.org/draft-03/schema#\", \"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraft03); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); SCHEMAERROR(s, "{\"SpecUnsupported\":{\"errorCode\":11,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_UnsupportedDraft6) { Document sd; sd.Parse("{\"$schema\":\"http://json-schema.org/draft-06/schema#\", \"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraft06); SCHEMAERROR(s, "{\"SpecUnsupported\":{\"errorCode\":11,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_UnsupportedDraft7) { Document sd; sd.Parse("{\"$schema\":\"http://json-schema.org/draft-07/schema#\", \"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraft07); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); SCHEMAERROR(s, "{\"SpecUnsupported\":{\"errorCode\":11,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_UnsupportedDraft2019_09) { Document sd; sd.Parse("{\"$schema\":\"https://json-schema.org/draft/2019-09/schema\", \"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraft2019_09); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); SCHEMAERROR(s, "{\"SpecUnsupported\":{\"errorCode\":11,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_UnsupportedDraft2020_12) { Document sd; sd.Parse("{\"$schema\":\"https://json-schema.org/draft/2020-12/schema\", \"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().draft == kDraft2020_12); ASSERT_TRUE(s.GetSpecification().oapi == kVersionNone); SCHEMAERROR(s, "{\"SpecUnsupported\":{\"errorCode\":11,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_SupportedVersion20Static) { typedef GenericSchemaDocument > SchemaDocumentType; Document sd; sd.Parse("{\"swagger\":\"2.0\"}"); ASSERT_FALSE(sd.HasParseError()); Specification spec = SchemaDocumentType::GetSpecification(sd); ASSERT_TRUE(spec.IsSupported()); ASSERT_TRUE(spec.draft == kDraft04); ASSERT_TRUE(spec.oapi == kVersion20); } TEST(SchemaValidator, Schema_SupportedVersion20) { Document sd; sd.Parse("{\"swagger\":\"2.0\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_TRUE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().oapi == kVersion20); ASSERT_TRUE(s.GetSpecification().draft == kDraft04); EXPECT_TRUE(s.GetError().ObjectEmpty()); } TEST(SchemaValidator, Schema_SupportedVersion30x) { Document sd; sd.Parse("{\"openapi\":\"3.0.0\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_TRUE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().oapi == kVersion30); ASSERT_TRUE(s.GetSpecification().draft == kDraft05); EXPECT_TRUE(s.GetError().ObjectEmpty()); } TEST(SchemaValidator, Schema_SupportedVersionOverride) { Document sd; sd.Parse("{\"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd, 0, 0, 0, 0, 0, Specification(kVersion20)); ASSERT_TRUE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().oapi == kVersion20); ASSERT_TRUE(s.GetSpecification().draft == kDraft04); EXPECT_TRUE(s.GetError().ObjectEmpty()); } TEST(SchemaValidator, Schema_UnknownVersionOverride) { Document sd; sd.Parse("{\"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd, 0, 0, 0, 0, 0, Specification(kVersionUnknown)); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().oapi == kVersionUnknown); ASSERT_TRUE(s.GetSpecification().draft == kDraft04); SCHEMAERROR(s, "{\"SpecUnknown\":{\"errorCode\":10,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_UnsupportedVersionOverride) { Document sd; sd.Parse("{\"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd, 0, 0, 0, 0, 0, Specification(kVersion31)); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().oapi == kVersion31); ASSERT_TRUE(s.GetSpecification().draft == kDraft2020_12); SCHEMAERROR(s, "{\"SpecUnsupported\":{\"errorCode\":11,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_UnknownVersion) { Document sd; sd.Parse("{\"openapi\":\"1.0\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().oapi == kVersionUnknown); ASSERT_TRUE(s.GetSpecification().draft == kDraft04); SCHEMAERROR(s, "{\"SpecUnknown\":{\"errorCode\":10,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_UnknownVersionShort) { Document sd; sd.Parse("{\"openapi\":\"3.0.\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().oapi == kVersionUnknown); ASSERT_TRUE(s.GetSpecification().draft == kDraft04); SCHEMAERROR(s, "{\"SpecUnknown\":{\"errorCode\":10,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_UnknownVersionNotString) { Document sd; sd.Parse("{\"swagger\": 2}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().oapi == kVersionUnknown); ASSERT_TRUE(s.GetSpecification().draft == kDraft04); SCHEMAERROR(s, "{\"SpecUnknown\":{\"errorCode\":10,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_UnsupportedVersion31) { Document sd; sd.Parse("{\"openapi\":\"3.1.0\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_FALSE(s.IsSupportedSpecification()); ASSERT_TRUE(s.GetSpecification().oapi == kVersion31); ASSERT_TRUE(s.GetSpecification().draft == kDraft2020_12); SCHEMAERROR(s, "{\"SpecUnsupported\":{\"errorCode\":11,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_DraftAndVersion) { Document sd; sd.Parse("{\"swagger\": \"2.0\", \"$schema\": \"http://json-schema.org/draft-04/schema#\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); ASSERT_TRUE(s.IsSupportedSpecification()); SCHEMAERROR(s, "{\"SpecIllegal\":{\"errorCode\":12,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, Schema_StartUnknown) { Document sd; sd.Parse("{\"type\": \"integer\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd, 0, 0, 0, 0, SchemaDocument::PointerType("/nowhere")); SCHEMAERROR(s, "{\"StartUnknown\":{\"errorCode\":1,\"instanceRef\":\"#\", \"value\":\"#/nowhere\"}}"); } TEST(SchemaValidator, Schema_MultipleErrors) { Document sd; sd.Parse("{\"swagger\": \"foo\", \"$schema\": \"bar\"}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s(sd); SCHEMAERROR(s, "{ \"SpecUnknown\": {\"errorCode\":10,\"instanceRef\":\"#\"}," " \"SpecIllegal\": {\"errorCode\":12,\"instanceRef\":\"#\"}" "}"); } // $ref is a non-JSON pointer fragment - not allowed when OpenAPI TEST(SchemaValidator, Schema_RefPlainNameOpenApi) { typedef GenericSchemaDocument > SchemaDocumentType; Document sd; sd.Parse("{\"swagger\": \"2.0\", \"type\": \"object\", \"properties\": {\"myInt1\": {\"$ref\": \"#myId\"}, \"myStr\": {\"type\": \"string\", \"id\": \"#myStrId\"}, \"myInt2\": {\"type\": \"integer\", \"id\": \"#myId\"}}}"); SchemaDocumentType s(sd); SCHEMAERROR(s, "{\"RefPlainName\":{\"errorCode\":2,\"instanceRef\":\"#/properties/myInt1\",\"value\":\"#myId\"}}"); } // $ref is a non-JSON pointer fragment - not allowed when remote document TEST(SchemaValidator, Schema_RefPlainNameRemote) { typedef GenericSchemaDocument > SchemaDocumentType; RemoteSchemaDocumentProvider provider; Document sd; sd.Parse("{\"type\": \"object\", \"properties\": {\"myInt\": {\"$ref\": \"/subSchemas.json#plainname\"}}}"); SchemaDocumentType s(sd, "http://localhost:1234/xxxx", 26, &provider); SCHEMAERROR(s, "{\"RefPlainName\":{\"errorCode\":2,\"instanceRef\":\"#/properties/myInt\",\"value\":\"#plainname\"}}"); } // $ref is an empty string TEST(SchemaValidator, Schema_RefEmptyString) { typedef GenericSchemaDocument > SchemaDocumentType; Document sd; sd.Parse("{\"type\": \"object\", \"properties\": {\"myInt1\": {\"$ref\": \"\"}}}"); SchemaDocumentType s(sd); SCHEMAERROR(s, "{\"RefInvalid\":{\"errorCode\":3,\"instanceRef\":\"#/properties/myInt1\"}}"); } // $ref is remote but no provider TEST(SchemaValidator, Schema_RefNoRemoteProvider) { typedef GenericSchemaDocument > SchemaDocumentType; Document sd; sd.Parse("{\"type\": \"object\", \"properties\": {\"myInt\": {\"$ref\": \"/subSchemas.json#plainname\"}}}"); SchemaDocumentType s(sd, "http://localhost:1234/xxxx", 26, 0); SCHEMAERROR(s, "{\"RefNoRemoteProvider\":{\"errorCode\":7,\"instanceRef\":\"#/properties/myInt\"}}"); } // $ref is remote but no schema returned TEST(SchemaValidator, Schema_RefNoRemoteSchema) { typedef GenericSchemaDocument > SchemaDocumentType; RemoteSchemaDocumentProvider provider; Document sd; sd.Parse("{\"type\": \"object\", \"properties\": {\"myInt\": {\"$ref\": \"/will-not-resolve.json\"}}}"); SchemaDocumentType s(sd, "http://localhost:1234/xxxx", 26, &provider); SCHEMAERROR(s, "{\"RefNoRemoteSchema\":{\"errorCode\":8,\"instanceRef\":\"#/properties/myInt\",\"value\":\"http://localhost:1234/will-not-resolve.json\"}}"); } // $ref pointer is invalid TEST(SchemaValidator, Schema_RefPointerInvalid) { typedef GenericSchemaDocument > SchemaDocumentType; Document sd; sd.Parse("{\"type\": \"object\", \"properties\": {\"myInt\": {\"$ref\": \"#/&&&&&\"}}}"); SchemaDocumentType s(sd); SCHEMAERROR(s, "{\"RefPointerInvalid\":{\"errorCode\":4,\"instanceRef\":\"#/properties/myInt\",\"value\":\"#/&&&&&\",\"offset\":2}}"); } // $ref is remote and pointer is invalid TEST(SchemaValidator, Schema_RefPointerInvalidRemote) { typedef GenericSchemaDocument > SchemaDocumentType; RemoteSchemaDocumentProvider provider; Document sd; sd.Parse("{\"type\": \"object\", \"properties\": {\"myInt\": {\"$ref\": \"/subSchemas.json#/abc&&&&&\"}}}"); SchemaDocumentType s(sd, "http://localhost:1234/xxxx", 26, &provider); SCHEMAERROR(s, "{\"RefPointerInvalid\":{\"errorCode\":4,\"instanceRef\":\"#/properties/myInt\",\"value\":\"#/abc&&&&&\",\"offset\":5}}"); } // $ref is unknown non-pointer TEST(SchemaValidator, Schema_RefUnknownPlainName) { typedef GenericSchemaDocument > SchemaDocumentType; Document sd; sd.Parse("{\"type\": \"object\", \"properties\": {\"myInt\": {\"$ref\": \"#plainname\"}}}"); SchemaDocumentType s(sd); SCHEMAERROR(s, "{\"RefUnknown\":{\"errorCode\":5,\"instanceRef\":\"#/properties/myInt\",\"value\":\"#plainname\"}}"); } /// $ref is unknown pointer TEST(SchemaValidator, Schema_RefUnknownPointer) { typedef GenericSchemaDocument > SchemaDocumentType; Document sd; sd.Parse("{\"type\": \"object\", \"properties\": {\"myInt\": {\"$ref\": \"#/a/b\"}}}"); SchemaDocumentType s(sd); SCHEMAERROR(s, "{\"RefUnknown\":{\"errorCode\":5,\"instanceRef\":\"#/properties/myInt\",\"value\":\"#/a/b\"}}"); } // $ref is remote and unknown pointer TEST(SchemaValidator, Schema_RefUnknownPointerRemote) { typedef GenericSchemaDocument > SchemaDocumentType; RemoteSchemaDocumentProvider provider; Document sd; sd.Parse("{\"type\": \"object\", \"properties\": {\"myInt\": {\"$ref\": \"/subSchemas.json#/a/b\"}}}"); SchemaDocumentType s(sd, "http://localhost:1234/xxxx", 26, &provider); SCHEMAERROR(s, "{\"RefUnknown\":{\"errorCode\":5,\"instanceRef\":\"#/properties/myInt\",\"value\":\"http://localhost:1234/subSchemas.json#/a/b\"}}"); } // $ref is cyclical TEST(SchemaValidator, Schema_RefCyclical) { typedef GenericSchemaDocument > SchemaDocumentType; Document sd; sd.Parse("{\"type\": \"object\", \"properties\": {" " \"cyclic_source\": {" " \"$ref\": \"#/properties/cyclic_target\"" " }," " \"cyclic_target\": {" " \"$ref\": \"#/properties/cyclic_source\"" " }" "}}"); SchemaDocumentType s(sd); SCHEMAERROR(s, "{\"RefCyclical\":{\"errorCode\":6,\"instanceRef\":\"#/properties/cyclic_target\",\"value\":\"#/properties/cyclic_source\"}}"); } TEST(SchemaValidator, Schema_ReadOnlyAndWriteOnly) { Document sd; sd.Parse("{\"type\": \"integer\", \"readOnly\": true, \"writeOnly\": true}"); ASSERT_FALSE(sd.HasParseError()); SchemaDocument s1(sd, 0, 0, 0, 0, 0, Specification(kDraft04)); EXPECT_TRUE(s1.GetError().ObjectEmpty()); SchemaDocument s2(sd, 0, 0, 0, 0, 0, Specification(kVersion30)); SCHEMAERROR(s2, "{\"ReadOnlyAndWriteOnly\":{\"errorCode\":13,\"instanceRef\":\"#\"}}"); } TEST(SchemaValidator, ReadOnlyWhenWriting) { Document sd; sd.Parse( "{" " \"type\":\"object\"," " \"properties\": {" " \"rprop\" : {" " \"type\": \"string\"," " \"readOnly\": true" " }" " }" "}"); SchemaDocument s(sd, 0, 0, 0, 0, 0, Specification(kVersion20)); VALIDATE(s, "{ \"rprop\": \"hello\" }", true); INVALIDATE_(s, "{ \"rprop\": \"hello\" }", "/properties/rprop", "readOnly", "/rprop", "{ \"readOnly\": {" " \"errorCode\": 26, \"instanceRef\": \"#/rprop\", \"schemaRef\": \"#/properties/rprop\"" " }" "}", kValidateDefaultFlags | kValidateWriteFlag, SchemaValidator, Pointer); } TEST(SchemaValidator, WriteOnlyWhenReading) { Document sd; sd.Parse( "{" " \"type\":\"object\"," " \"properties\": {" " \"wprop\" : {" " \"type\": \"boolean\"," " \"writeOnly\": true" " }" " }" "}"); SchemaDocument s(sd, 0, 0, 0, 0, 0, Specification(kVersion30)); VALIDATE(s, "{ \"wprop\": true }", true); INVALIDATE_(s, "{ \"wprop\": true }", "/properties/wprop", "writeOnly", "/wprop", "{ \"writeOnly\": {" " \"errorCode\": 27, \"instanceRef\": \"#/wprop\", \"schemaRef\": \"#/properties/wprop\"" " }" "}", kValidateDefaultFlags | kValidateReadFlag, SchemaValidator, Pointer); } TEST(SchemaValidator, NullableTrue) { Document sd; sd.Parse("{\"type\": \"string\", \"nullable\": true}"); SchemaDocument s(sd, 0, 0, 0, 0, 0, kVersion20); VALIDATE(s, "\"hello\"", true); INVALIDATE(s, "null", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"string\"], \"actual\": \"null\"" "}}"); INVALIDATE(s, "false", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"string\"], \"actual\": \"boolean\"" "}}"); SchemaDocument s30(sd, 0, 0, 0, 0, 0, kVersion30); VALIDATE(s30, "\"hello\"", true); VALIDATE(s30, "null", true); INVALIDATE(s30, "false", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"null\", \"string\"], \"actual\": \"boolean\"" "}}"); } TEST(SchemaValidator, NullableFalse) { Document sd; sd.Parse("{\"type\": \"string\", \"nullable\": false}"); SchemaDocument s(sd, 0, 0, 0, 0, 0, kVersion20); VALIDATE(s, "\"hello\"", true); INVALIDATE(s, "null", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"string\"], \"actual\": \"null\"" "}}"); INVALIDATE(s, "false", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"string\"], \"actual\": \"boolean\"" "}}"); SchemaDocument s30(sd, 0, 0, 0, 0, 0, kVersion30); VALIDATE(s30, "\"hello\"", true); INVALIDATE(s, "null", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"string\"], \"actual\": \"null\"" "}}"); INVALIDATE(s30, "false", "", "type", "", "{ \"type\": {" " \"errorCode\": 20," " \"instanceRef\": \"#\", \"schemaRef\": \"#\"," " \"expected\": [\"string\"], \"actual\": \"boolean\"" "}}"); } #if defined(_MSC_VER) || defined(__clang__) RAPIDJSON_DIAG_POP #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/perftest/0000755000000000000000000000000015031566105022524 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/test/perftest/perftest.cpp0000644000000000000000000000171315031566105025066 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "perftest.h" int main(int argc, char **argv) { #if _MSC_VER _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); //void *testWhetherMemoryLeakDetectionWorks = malloc(1); #endif ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } asymptote-3.05/LspCpp/third_party/rapidjson/test/perftest/misctest.cpp0000644000000000000000000010520515031566105025066 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "perftest.h" #if TEST_MISC #define __STDC_FORMAT_MACROS #include "rapidjson/stringbuffer.h" #define protected public #include "rapidjson/writer.h" #undef private class Misc : public PerfTest { }; // Copyright (c) 2008-2010 Bjoern Hoehrmann // See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. #define UTF8_ACCEPT 0 #define UTF8_REJECT 12 static const unsigned char utf8d[] = { // The first part of the table maps bytes to character classes that // to reduce the size of the transition table and create bitmasks. 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,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,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,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, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, // The second part is a transition table that maps a combination // of a state of the automaton and a character class to a state. 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,12,12,12,12,12, }; static unsigned inline decode(unsigned* state, unsigned* codep, unsigned byte) { unsigned type = utf8d[byte]; *codep = (*state != UTF8_ACCEPT) ? (byte & 0x3fu) | (*codep << 6) : (0xff >> type) & (byte); *state = utf8d[256 + *state + type]; return *state; } static bool IsUTF8(unsigned char* s) { unsigned codepoint, state = 0; while (*s) decode(&state, &codepoint, *s++); return state == UTF8_ACCEPT; } TEST_F(Misc, Hoehrmann_IsUTF8) { for (size_t i = 0; i < kTrialCount; i++) { EXPECT_TRUE(IsUTF8((unsigned char*)json_)); } } //////////////////////////////////////////////////////////////////////////////// // CountDecimalDigit: Count number of decimal places inline unsigned CountDecimalDigit_naive(unsigned n) { unsigned count = 1; while (n >= 10) { n /= 10; count++; } return count; } inline unsigned CountDecimalDigit_enroll4(unsigned n) { unsigned count = 1; while (n >= 10000) { n /= 10000u; count += 4; } if (n < 10) return count; if (n < 100) return count + 1; if (n < 1000) return count + 2; return count + 3; } inline unsigned CountDecimalDigit64_enroll4(uint64_t n) { unsigned count = 1; while (n >= 10000) { n /= 10000u; count += 4; } if (n < 10) return count; if (n < 100) return count + 1; if (n < 1000) return count + 2; return count + 3; } inline unsigned CountDecimalDigit_fast(unsigned n) { static const uint32_t powers_of_10[] = { 0, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; #if defined(_M_IX86) || defined(_M_X64) unsigned long i = 0; _BitScanReverse(&i, n | 1); uint32_t t = (i + 1) * 1233 >> 12; #elif defined(__GNUC__) uint32_t t = (32 - __builtin_clz(n | 1)) * 1233 >> 12; #else #error #endif return t - (n < powers_of_10[t]) + 1; } inline unsigned CountDecimalDigit64_fast(uint64_t n) { static const uint64_t powers_of_10[] = { 0, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000, 100000000000, 1000000000000, 10000000000000, 100000000000000, 1000000000000000, 10000000000000000, 100000000000000000, 1000000000000000000, 10000000000000000000U }; #if defined(_M_IX86) uint64_t m = n | 1; unsigned long i = 0; if (_BitScanReverse(&i, m >> 32)) i += 32; else _BitScanReverse(&i, m & 0xFFFFFFFF); uint32_t t = (i + 1) * 1233 >> 12; #elif defined(_M_X64) unsigned long i = 0; _BitScanReverse64(&i, n | 1); uint32_t t = (i + 1) * 1233 >> 12; #elif defined(__GNUC__) uint32_t t = (64 - __builtin_clzll(n | 1)) * 1233 >> 12; #else #error #endif return t - (n < powers_of_10[t]) + 1; } #if 0 // Exhaustive, very slow TEST_F(Misc, CountDecimalDigit_Verify) { unsigned i = 0; do { if (i % (65536 * 256) == 0) printf("%u\n", i); ASSERT_EQ(CountDecimalDigit_enroll4(i), CountDecimalDigit_fast(i)); i++; } while (i != 0); } static const unsigned kDigits10Trial = 1000000000u; TEST_F(Misc, CountDecimalDigit_naive) { unsigned sum = 0; for (unsigned i = 0; i < kDigits10Trial; i++) sum += CountDecimalDigit_naive(i); printf("%u\n", sum); } TEST_F(Misc, CountDecimalDigit_enroll4) { unsigned sum = 0; for (unsigned i = 0; i < kDigits10Trial; i++) sum += CountDecimalDigit_enroll4(i); printf("%u\n", sum); } TEST_F(Misc, CountDecimalDigit_fast) { unsigned sum = 0; for (unsigned i = 0; i < kDigits10Trial; i++) sum += CountDecimalDigit_fast(i); printf("%u\n", sum); } #endif TEST_F(Misc, CountDecimalDigit64_VerifyFast) { uint64_t i = 1, j; do { //printf("%" PRIu64 "\n", i); ASSERT_EQ(CountDecimalDigit64_enroll4(i), CountDecimalDigit64_fast(i)); j = i; i *= 3; } while (j < i); } //////////////////////////////////////////////////////////////////////////////// // integer-to-string conversion // https://gist.github.com/anonymous/7179097 static const int randval[] ={ 936116, 369532, 453755, -72860, 209713, 268347, 435278, -360266, -416287, -182064, -644712, 944969, 640463, -366588, 471577, -69401, -744294, -505829, 923883, 831785, -601136, -636767, -437054, 591718, 100758, 231907, -719038, 973540, -605220, 506659, -871653, 462533, 764843, -919138, 404305, -630931, -288711, -751454, -173726, -718208, 432689, -281157, 360737, 659827, 19174, -376450, 769984, -858198, 439127, 734703, -683426, 7, 386135, 186997, -643900, -744422, -604708, -629545, 42313, -933592, -635566, 182308, 439024, -367219, -73924, -516649, 421935, -470515, 413507, -78952, -427917, -561158, 737176, 94538, 572322, 405217, 709266, -357278, -908099, -425447, 601119, 750712, -862285, -177869, 900102, 384877, 157859, -641680, 503738, -702558, 278225, 463290, 268378, -212840, 580090, 347346, -473985, -950968, -114547, -839893, -738032, -789424, 409540, 493495, 432099, 119755, 905004, -174834, 338266, 234298, 74641, -965136, -754593, 685273, 466924, 920560, 385062, 796402, -67229, 994864, 376974, 299869, -647540, -128724, 469890, -163167, -547803, -743363, 486463, -621028, 612288, 27459, -514224, 126342, -66612, 803409, -777155, -336453, -284002, 472451, 342390, -163630, 908356, -456147, -825607, 268092, -974715, 287227, 227890, -524101, 616370, -782456, 922098, -624001, -813690, 171605, -192962, 796151, 707183, -95696, -23163, -721260, 508892, 430715, 791331, 482048, -996102, 863274, 275406, -8279, -556239, -902076, 268647, -818565, 260069, -798232, -172924, -566311, -806503, -885992, 813969, -78468, 956632, 304288, 494867, -508784, 381751, 151264, 762953, 76352, 594902, 375424, 271700, -743062, 390176, 924237, 772574, 676610, 435752, -153847, 3959, -971937, -294181, -538049, -344620, -170136, 19120, -703157, 868152, -657961, -818631, 219015, -872729, -940001, -956570, 880727, -345910, 942913, -942271, -788115, 225294, 701108, -517736, -416071, 281940, 488730, 942698, 711494, 838382, -892302, -533028, 103052, 528823, 901515, 949577, 159364, 718227, -241814, -733661, -462928, -495829, 165170, 513580, -629188, -509571, -459083, 198437, 77198, -644612, 811276, -422298, -860842, -52584, 920369, 686424, -530667, -243476, 49763, 345866, -411960, -114863, 470810, -302860, 683007, -509080, 2, -174981, -772163, -48697, 447770, -268246, 213268, 269215, 78810, -236340, -639140, -864323, 505113, -986569, -325215, 541859, 163070, -819998, -645161, -583336, 573414, 696417, -132375, 3, -294501, 320435, 682591, 840008, 351740, 426951, 609354, 898154, -943254, 227321, -859793, -727993, 44137, -497965, -782239, 14955, -746080, -243366, 9837, -233083, 606507, -995864, -615287, -994307, 602715, 770771, -315040, 610860, 446102, -307120, 710728, -590392, -230474, -762625, -637525, 134963, -202700, -766902, -985541, 218163, 682009, 926051, 525156, -61195, 403211, -810098, 245539, -431733, 179998, -806533, 745943, 447597, 131973, -187130, 826019, 286107, -937230, -577419, 20254, 681802, -340500, 323080, 266283, -667617, 309656, 416386, 611863, 759991, -534257, 523112, -634892, -169913, -204905, -909867, -882185, -944908, 741811, -717675, 967007, -317396, 407230, -412805, 792905, 994873, 744793, -456797, 713493, 355232, 116900, -945199, 880539, 342505, -580824, -262273, 982968, -349497, -735488, 311767, -455191, 570918, 389734, -958386, 10262, -99267, 155481, 304210, 204724, 704367, -144893, -233664, -671441, 896849, 408613, 762236, 322697, 981321, 688476, 13663, -970704, -379507, 896412, 977084, 348869, 875948, 341348, 318710, 512081, 6163, 669044, 833295, 811883, 708756, -802534, -536057, 608413, -389625, -694603, 541106, -110037, 720322, -540581, 645420, 32980, 62442, 510157, -981870, -87093, -325960, -500494, -718291, -67889, 991501, 374804, 769026, -978869, 294747, 714623, 413327, -199164, 671368, 804789, -362507, 798196, -170790, -568895, -869379, 62020, -316693, -837793, 644994, -39341, -417504, -243068, -957756, 99072, 622234, -739992, 225668, 8863, -505910, 82483, -559244, 241572, 1315, -36175, -54990, 376813, -11, 162647, -688204, -486163, -54934, -197470, 744223, -762707, 732540, 996618, 351561, -445933, -898491, 486531, 456151, 15276, 290186, -817110, -52995, 313046, -452533, -96267, 94470, -500176, -818026, -398071, -810548, -143325, -819741, 1338, -897676, -101577, -855445, 37309, 285742, 953804, -777927, -926962, -811217, -936744, -952245, -802300, -490188, -964953, -552279, 329142, -570048, -505756, 682898, -381089, -14352, 175138, 152390, -582268, -485137, 717035, 805329, 239572, -730409, 209643, -184403, -385864, 675086, 819648, 629058, -527109, -488666, -171981, 532788, 552441, 174666, 984921, 766514, 758787, 716309, 338801, -978004, -412163, 876079, -734212, 789557, -160491, -522719, 56644, -991, -286038, -53983, 663740, 809812, 919889, -717502, -137704, 220511, 184396, -825740, -588447, 430870, 124309, 135956, 558662, -307087, -788055, -451328, 812260, 931601, 324347, -482989, -117858, -278861, 189068, -172774, 929057, 293787, 198161, -342386, -47173, 906555, -759955, -12779, 777604, -97869, 899320, 927486, -25284, -848550, 259450, -485856, -17820, 88, 171400, 235492, -326783, -340793, 886886, 112428, -246280, 5979, 648444, -114982, 991013, -56489, -9497, 419706, 632820, -341664, 393926, -848977, -22538, 257307, 773731, -905319, 491153, 734883, -868212, -951053, 644458, -580758, 764735, 584316, 297077, 28852, -397710, -953669, 201772, 879050, -198237, -588468, 448102, -116837, 770007, -231812, 642906, -582166, -885828, 9, 305082, -996577, 303559, 75008, -772956, -447960, 599825, -295552, 870739, -386278, -950300, 485359, -457081, 629461, -850276, 550496, -451755, -620841, -11766, -950137, 832337, 28711, -273398, -507197, 91921, -271360, -705991, -753220, -388968, 967945, 340434, -320883, -662793, -554617, -574568, 477946, -6148, -129519, 689217, 920020, -656315, -974523, -212525, 80921, -612532, 645096, 545655, 655713, -591631, -307385, -816688, -618823, -113713, 526430, 673063, 735916, -809095, -850417, 639004, 432281, -388185, 270708, 860146, -39902, -786157, -258180, -246169, -966720, -264957, 548072, -306010, -57367, -635665, 933824, 70553, -989936, -488741, 72411, -452509, 529831, 956277, 449019, -577850, -360986, -803418, 48833, 296073, 203430, 609591, 715483, 470964, 658106, -718254, -96424, 790163, 334739, 181070, -373578, 5, -435088, 329841, 330939, -256602, 394355, 912412, 231910, 927278, -661933, 788539, -769664, -893274, -96856, 298205, 901043, -608122, -527430, 183618, -553963, -35246, -393924, 948832, -483198, 594501, 35460, -407007, 93494, -336881, -634072, 984205, -812161, 944664, -31062, 753872, 823933, -69566, 50445, 290147, 85134, 34706, 551902, 405202, -991246, -84642, 154341, 316432, -695101, -651588, -5030, 137564, -294665, 332541, 528307, -90572, -344923, 523766, -758498, -968047, 339028, 494578, 593129, -725773, 31834, -718406, -208638, 159665, -2043, 673344, -442767, 75816, 755442, 769257, -158730, -410272, 691688, 589550, -878398, -184121, 460679, 346312, 294163, -544602, 653308, 254167, -276979, 52073, -892684, 887653, -41222, 983065, -68258, -408799, -99069, -674069, -863635, -32890, 622757, -743862, 40872, -4837, -967228, 522370, -903951, -818669, 524459, 514702, 925801, 20007, -299229, 579348, 626021, 430089, 348139, -562692, -607728, -130606, -928451, -424793, -458647, -448892, -312230, 143337, 109746, 880042, -339658, -785614, 938995, 540916, 118429, 661351, -402967, 404729, -40918, -976535, 743230, 713110, 440182, -381314, -499252, 74613, 193652, 912717, 491323, 583633, 324691, 459397, 281253, 195540, -2764, -888651, 892449, 132663, -478373, -430002, -314551, 527826, 247165, 557966, 554778, 481531, -946634, 431685, -769059, -348371, 174046, 184597, -354867, 584422, 227390, -850397, -542924, -849093, -737769, 325359, 736314, 269101, 767940, 674809, 81413, -447458, 445076, 189072, 906218, 502688, -718476, -863827, -731381, 100660, 623249, 710008, 572060, 922203, 685740, 55096, 263394, -243695, -353910, -516788, 388471, 455165, 844103, -643772, 363976, 268875, -899450, 104470, 104029, -238874, -274659, 732969, -676443, 953291, -916289, -861849, -242344, 958083, -479593, -970395, 799831, 277841, -243236, -283462, -201510, 166263, -259105, -575706, 878926, 891064, 895297, 655262, -34807, -809833, -89281, 342585, 554920, 1, 902141, -333425, 139703, 852318, -618438, 329498, -932596, -692836, -513372, 733656, -523411, 85779, 500478, -682697, -502836, 138776, 156341, -420037, -557964, -556378, 710993, -50383, -877159, 916334, 132996, 583516, -603392, -111615, -12288, -780214, 476780, 123327, 137607, 519956, 745837, 17358, -158581, -53490 }; static const size_t randvalCount = sizeof(randval) / sizeof(randval[0]); static const size_t kItoaTrialCount = 10000; static const char digits[201] = "0001020304050607080910111213141516171819" "2021222324252627282930313233343536373839" "4041424344454647484950515253545556575859" "6061626364656667686970717273747576777879" "8081828384858687888990919293949596979899"; // Prevent code being optimized out //#define OUTPUT_LENGTH(length) printf("", length) #define OUTPUT_LENGTH(length) printf("%u\n", (unsigned)length) template class Writer1 { public: Writer1() : os_() {} Writer1(OutputStream& os) : os_(&os) {} void Reset(OutputStream& os) { os_ = &os; } bool WriteInt(int i) { if (i < 0) { os_->Put('-'); i = -i; } return WriteUint((unsigned)i); } bool WriteUint(unsigned u) { char buffer[10]; char *p = buffer; do { *p++ = char(u % 10) + '0'; u /= 10; } while (u > 0); do { --p; os_->Put(*p); } while (p != buffer); return true; } bool WriteInt64(int64_t i64) { if (i64 < 0) { os_->Put('-'); i64 = -i64; } WriteUint64((uint64_t)i64); return true; } bool WriteUint64(uint64_t u64) { char buffer[20]; char *p = buffer; do { *p++ = char(u64 % 10) + '0'; u64 /= 10; } while (u64 > 0); do { --p; os_->Put(*p); } while (p != buffer); return true; } private: OutputStream* os_; }; template<> bool Writer1::WriteUint(unsigned u) { char buffer[10]; char* p = buffer; do { *p++ = char(u % 10) + '0'; u /= 10; } while (u > 0); char* d = os_->Push(p - buffer); do { --p; *d++ = *p; } while (p != buffer); return true; } // Using digits LUT to reduce division/modulo template class Writer2 { public: Writer2() : os_() {} Writer2(OutputStream& os) : os_(&os) {} void Reset(OutputStream& os) { os_ = &os; } bool WriteInt(int i) { if (i < 0) { os_->Put('-'); i = -i; } return WriteUint((unsigned)i); } bool WriteUint(unsigned u) { char buffer[10]; char* p = buffer; while (u >= 100) { const unsigned i = (u % 100) << 1; u /= 100; *p++ = digits[i + 1]; *p++ = digits[i]; } if (u < 10) *p++ = char(u) + '0'; else { const unsigned i = u << 1; *p++ = digits[i + 1]; *p++ = digits[i]; } do { --p; os_->Put(*p); } while (p != buffer); return true; } bool WriteInt64(int64_t i64) { if (i64 < 0) { os_->Put('-'); i64 = -i64; } WriteUint64((uint64_t)i64); return true; } bool WriteUint64(uint64_t u64) { char buffer[20]; char* p = buffer; while (u64 >= 100) { const unsigned i = static_cast(u64 % 100) << 1; u64 /= 100; *p++ = digits[i + 1]; *p++ = digits[i]; } if (u64 < 10) *p++ = char(u64) + '0'; else { const unsigned i = static_cast(u64) << 1; *p++ = digits[i + 1]; *p++ = digits[i]; } do { --p; os_->Put(*p); } while (p != buffer); return true; } private: OutputStream* os_; }; // First pass to count digits template class Writer3 { public: Writer3() : os_() {} Writer3(OutputStream& os) : os_(&os) {} void Reset(OutputStream& os) { os_ = &os; } bool WriteInt(int i) { if (i < 0) { os_->Put('-'); i = -i; } return WriteUint((unsigned)i); } bool WriteUint(unsigned u) { char buffer[10]; char *p = buffer; do { *p++ = char(u % 10) + '0'; u /= 10; } while (u > 0); do { --p; os_->Put(*p); } while (p != buffer); return true; } bool WriteInt64(int64_t i64) { if (i64 < 0) { os_->Put('-'); i64 = -i64; } WriteUint64((uint64_t)i64); return true; } bool WriteUint64(uint64_t u64) { char buffer[20]; char *p = buffer; do { *p++ = char(u64 % 10) + '0'; u64 /= 10; } while (u64 > 0); do { --p; os_->Put(*p); } while (p != buffer); return true; } private: void WriteUintReverse(char* d, unsigned u) { do { *--d = char(u % 10) + '0'; u /= 10; } while (u > 0); } void WriteUint64Reverse(char* d, uint64_t u) { do { *--d = char(u % 10) + '0'; u /= 10; } while (u > 0); } OutputStream* os_; }; template<> inline bool Writer3::WriteUint(unsigned u) { unsigned digit = CountDecimalDigit_fast(u); WriteUintReverse(os_->Push(digit) + digit, u); return true; } template<> inline bool Writer3::WriteUint(unsigned u) { unsigned digit = CountDecimalDigit_fast(u); WriteUintReverse(os_->Push(digit) + digit, u); return true; } template<> inline bool Writer3::WriteUint64(uint64_t u) { unsigned digit = CountDecimalDigit64_fast(u); WriteUint64Reverse(os_->Push(digit) + digit, u); return true; } template<> inline bool Writer3::WriteUint64(uint64_t u) { unsigned digit = CountDecimalDigit64_fast(u); WriteUint64Reverse(os_->Push(digit) + digit, u); return true; } // Using digits LUT to reduce division/modulo, two passes template class Writer4 { public: Writer4() : os_() {} Writer4(OutputStream& os) : os_(&os) {} void Reset(OutputStream& os) { os_ = &os; } bool WriteInt(int i) { if (i < 0) { os_->Put('-'); i = -i; } return WriteUint((unsigned)i); } bool WriteUint(unsigned u) { char buffer[10]; char* p = buffer; while (u >= 100) { const unsigned i = (u % 100) << 1; u /= 100; *p++ = digits[i + 1]; *p++ = digits[i]; } if (u < 10) *p++ = char(u) + '0'; else { const unsigned i = u << 1; *p++ = digits[i + 1]; *p++ = digits[i]; } do { --p; os_->Put(*p); } while (p != buffer); return true; } bool WriteInt64(int64_t i64) { if (i64 < 0) { os_->Put('-'); i64 = -i64; } WriteUint64((uint64_t)i64); return true; } bool WriteUint64(uint64_t u64) { char buffer[20]; char* p = buffer; while (u64 >= 100) { const unsigned i = static_cast(u64 % 100) << 1; u64 /= 100; *p++ = digits[i + 1]; *p++ = digits[i]; } if (u64 < 10) *p++ = char(u64) + '0'; else { const unsigned i = static_cast(u64) << 1; *p++ = digits[i + 1]; *p++ = digits[i]; } do { --p; os_->Put(*p); } while (p != buffer); return true; } private: void WriteUintReverse(char* d, unsigned u) { while (u >= 100) { const unsigned i = (u % 100) << 1; u /= 100; *--d = digits[i + 1]; *--d = digits[i]; } if (u < 10) { *--d = char(u) + '0'; } else { const unsigned i = u << 1; *--d = digits[i + 1]; *--d = digits[i]; } } void WriteUint64Reverse(char* d, uint64_t u) { while (u >= 100) { const unsigned i = (u % 100) << 1; u /= 100; *--d = digits[i + 1]; *--d = digits[i]; } if (u < 10) { *--d = char(u) + '0'; } else { const unsigned i = u << 1; *--d = digits[i + 1]; *--d = digits[i]; } } OutputStream* os_; }; template<> inline bool Writer4::WriteUint(unsigned u) { unsigned digit = CountDecimalDigit_fast(u); WriteUintReverse(os_->Push(digit) + digit, u); return true; } template<> inline bool Writer4::WriteUint(unsigned u) { unsigned digit = CountDecimalDigit_fast(u); WriteUintReverse(os_->Push(digit) + digit, u); return true; } template<> inline bool Writer4::WriteUint64(uint64_t u) { unsigned digit = CountDecimalDigit64_fast(u); WriteUint64Reverse(os_->Push(digit) + digit, u); return true; } template<> inline bool Writer4::WriteUint64(uint64_t u) { unsigned digit = CountDecimalDigit64_fast(u); WriteUint64Reverse(os_->Push(digit) + digit, u); return true; } template void itoa_Writer_StringBufferVerify() { rapidjson::StringBuffer sb; Writer writer(sb); for (size_t j = 0; j < randvalCount; j++) { char buffer[32]; sprintf(buffer, "%d", randval[j]); writer.WriteInt(randval[j]); ASSERT_STREQ(buffer, sb.GetString()); sb.Clear(); } } template void itoa_Writer_InsituStringStreamVerify() { Writer writer; for (size_t j = 0; j < randvalCount; j++) { char buffer[32]; sprintf(buffer, "%d", randval[j]); char buffer2[32]; rapidjson::InsituStringStream ss(buffer2); writer.Reset(ss); char* begin = ss.PutBegin(); writer.WriteInt(randval[j]); ss.Put('\0'); ss.PutEnd(begin); ASSERT_STREQ(buffer, buffer2); } } template void itoa_Writer_StringBuffer() { size_t length = 0; rapidjson::StringBuffer sb; Writer writer(sb); for (size_t i = 0; i < kItoaTrialCount; i++) { for (size_t j = 0; j < randvalCount; j++) { writer.WriteInt(randval[j]); length += sb.GetSize(); sb.Clear(); } } OUTPUT_LENGTH(length); } template void itoa_Writer_InsituStringStream() { size_t length = 0; char buffer[32]; Writer writer; for (size_t i = 0; i < kItoaTrialCount; i++) { for (size_t j = 0; j < randvalCount; j++) { rapidjson::InsituStringStream ss(buffer); writer.Reset(ss); char* begin = ss.PutBegin(); writer.WriteInt(randval[j]); length += ss.PutEnd(begin); } } OUTPUT_LENGTH(length); }; template void itoa64_Writer_StringBufferVerify() { rapidjson::StringBuffer sb; Writer writer(sb); for (size_t j = 0; j < randvalCount; j++) { char buffer[32]; int64_t x = randval[j] * randval[j]; sprintf(buffer, "%" PRIi64, x); writer.WriteInt64(x); ASSERT_STREQ(buffer, sb.GetString()); sb.Clear(); } } template void itoa64_Writer_InsituStringStreamVerify() { Writer writer; for (size_t j = 0; j < randvalCount; j++) { char buffer[32]; int64_t x = randval[j] * randval[j]; sprintf(buffer, "%" PRIi64, x); char buffer2[32]; rapidjson::InsituStringStream ss(buffer2); writer.Reset(ss); char* begin = ss.PutBegin(); writer.WriteInt64(x); ss.Put('\0'); ss.PutEnd(begin); ASSERT_STREQ(buffer, buffer2); } } template void itoa64_Writer_StringBuffer() { size_t length = 0; rapidjson::StringBuffer sb; Writer writer(sb); for (size_t i = 0; i < kItoaTrialCount; i++) { for (size_t j = 0; j < randvalCount; j++) { writer.WriteInt64(randval[j] * randval[j]); length += sb.GetSize(); sb.Clear(); } } OUTPUT_LENGTH(length); } template void itoa64_Writer_InsituStringStream() { size_t length = 0; char buffer[32]; Writer writer; for (size_t i = 0; i < kItoaTrialCount; i++) { for (size_t j = 0; j < randvalCount; j++) { rapidjson::InsituStringStream ss(buffer); writer.Reset(ss); char* begin = ss.PutBegin(); writer.WriteInt64(randval[j] * randval[j]); length += ss.PutEnd(begin); } } OUTPUT_LENGTH(length); }; // Full specialization for InsituStringStream to prevent memory copying // (normally we will not use InsituStringStream for writing, just for testing) namespace rapidjson { template<> bool rapidjson::Writer::WriteInt(int i) { char *buffer = os_->Push(11); const char* end = internal::i32toa(i, buffer); os_->Pop(11 - (end - buffer)); return true; } template<> bool Writer::WriteUint(unsigned u) { char *buffer = os_->Push(10); const char* end = internal::u32toa(u, buffer); os_->Pop(10 - (end - buffer)); return true; } template<> bool Writer::WriteInt64(int64_t i64) { char *buffer = os_->Push(21); const char* end = internal::i64toa(i64, buffer); os_->Pop(21 - (end - buffer)); return true; } template<> bool Writer::WriteUint64(uint64_t u) { char *buffer = os_->Push(20); const char* end = internal::u64toa(u, buffer); os_->Pop(20 - (end - buffer)); return true; } } // namespace rapidjson TEST_F(Misc, itoa_Writer_StringBufferVerify) { itoa_Writer_StringBufferVerify >(); } TEST_F(Misc, itoa_Writer1_StringBufferVerify) { itoa_Writer_StringBufferVerify >(); } TEST_F(Misc, itoa_Writer2_StringBufferVerify) { itoa_Writer_StringBufferVerify >(); } TEST_F(Misc, itoa_Writer3_StringBufferVerify) { itoa_Writer_StringBufferVerify >(); } TEST_F(Misc, itoa_Writer4_StringBufferVerify) { itoa_Writer_StringBufferVerify >(); } TEST_F(Misc, itoa_Writer_InsituStringStreamVerify) { itoa_Writer_InsituStringStreamVerify >(); } TEST_F(Misc, itoa_Writer1_InsituStringStreamVerify) { itoa_Writer_InsituStringStreamVerify >(); } TEST_F(Misc, itoa_Writer2_InsituStringStreamVerify) { itoa_Writer_InsituStringStreamVerify >(); } TEST_F(Misc, itoa_Writer3_InsituStringStreamVerify) { itoa_Writer_InsituStringStreamVerify >(); } TEST_F(Misc, itoa_Writer4_InsituStringStreamVerify) { itoa_Writer_InsituStringStreamVerify >(); } TEST_F(Misc, itoa_Writer_StringBuffer) { itoa_Writer_StringBuffer >(); } TEST_F(Misc, itoa_Writer1_StringBuffer) { itoa_Writer_StringBuffer >(); } TEST_F(Misc, itoa_Writer2_StringBuffer) { itoa_Writer_StringBuffer >(); } TEST_F(Misc, itoa_Writer3_StringBuffer) { itoa_Writer_StringBuffer >(); } TEST_F(Misc, itoa_Writer4_StringBuffer) { itoa_Writer_StringBuffer >(); } TEST_F(Misc, itoa_Writer_InsituStringStream) { itoa_Writer_InsituStringStream >(); } TEST_F(Misc, itoa_Writer1_InsituStringStream) { itoa_Writer_InsituStringStream >(); } TEST_F(Misc, itoa_Writer2_InsituStringStream) { itoa_Writer_InsituStringStream >(); } TEST_F(Misc, itoa_Writer3_InsituStringStream) { itoa_Writer_InsituStringStream >(); } TEST_F(Misc, itoa_Writer4_InsituStringStream) { itoa_Writer_InsituStringStream >(); } TEST_F(Misc, itoa64_Writer_StringBufferVerify) { itoa64_Writer_StringBufferVerify >(); } TEST_F(Misc, itoa64_Writer1_StringBufferVerify) { itoa64_Writer_StringBufferVerify >(); } TEST_F(Misc, itoa64_Writer2_StringBufferVerify) { itoa64_Writer_StringBufferVerify >(); } TEST_F(Misc, itoa64_Writer3_StringBufferVerify) { itoa64_Writer_StringBufferVerify >(); } TEST_F(Misc, itoa64_Writer4_StringBufferVerify) { itoa64_Writer_StringBufferVerify >(); } TEST_F(Misc, itoa64_Writer_InsituStringStreamVerify) { itoa64_Writer_InsituStringStreamVerify >(); } TEST_F(Misc, itoa64_Writer1_InsituStringStreamVerify) { itoa64_Writer_InsituStringStreamVerify >(); } TEST_F(Misc, itoa64_Writer2_InsituStringStreamVerify) { itoa64_Writer_InsituStringStreamVerify >(); } TEST_F(Misc, itoa64_Writer3_InsituStringStreamVerify) { itoa64_Writer_InsituStringStreamVerify >(); } TEST_F(Misc, itoa64_Writer4_InsituStringStreamVerify) { itoa64_Writer_InsituStringStreamVerify >(); } TEST_F(Misc, itoa64_Writer_StringBuffer) { itoa64_Writer_StringBuffer >(); } TEST_F(Misc, itoa64_Writer1_StringBuffer) { itoa64_Writer_StringBuffer >(); } TEST_F(Misc, itoa64_Writer2_StringBuffer) { itoa64_Writer_StringBuffer >(); } TEST_F(Misc, itoa64_Writer3_StringBuffer) { itoa64_Writer_StringBuffer >(); } TEST_F(Misc, itoa64_Writer4_StringBuffer) { itoa64_Writer_StringBuffer >(); } TEST_F(Misc, itoa64_Writer_InsituStringStream) { itoa64_Writer_InsituStringStream >(); } TEST_F(Misc, itoa64_Writer1_InsituStringStream) { itoa64_Writer_InsituStringStream >(); } TEST_F(Misc, itoa64_Writer2_InsituStringStream) { itoa64_Writer_InsituStringStream >(); } TEST_F(Misc, itoa64_Writer3_InsituStringStream) { itoa64_Writer_InsituStringStream >(); } TEST_F(Misc, itoa64_Writer4_InsituStringStream) { itoa64_Writer_InsituStringStream >(); } #endif // TEST_MISC asymptote-3.05/LspCpp/third_party/rapidjson/test/perftest/CMakeLists.txt0000644000000000000000000000150215031566105025262 0ustar rootrootset(PERFTEST_SOURCES misctest.cpp perftest.cpp platformtest.cpp rapidjsontest.cpp schematest.cpp) add_executable(perftest ${PERFTEST_SOURCES}) target_link_libraries(perftest ${TEST_LIBRARIES}) add_dependencies(tests perftest) find_program(CCACHE_FOUND ccache) if(CCACHE_FOUND) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments -fcolor-diagnostics") endif() endif(CCACHE_FOUND) set_property(DIRECTORY PROPERTY COMPILE_OPTIONS ${EXTRA_CXX_FLAGS}) IF(NOT (CMAKE_BUILD_TYPE STREQUAL "Debug")) add_test(NAME perftest COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/perftest WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) ENDIF() asymptote-3.05/LspCpp/third_party/rapidjson/test/perftest/perftest.h0000644000000000000000000001317015031566105024533 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef PERFTEST_H_ #define PERFTEST_H_ #define TEST_RAPIDJSON 1 #define TEST_PLATFORM 0 #define TEST_MISC 0 #define TEST_VERSION_CODE(x,y,z) \ (((x)*100000) + ((y)*100) + (z)) // __SSE2__ and __SSE4_2__ are recognized by gcc, clang, and the Intel compiler. // We use -march=native with gmake to enable -msse2 and -msse4.2, if supported. // Likewise, __ARM_NEON is used to detect Neon. #if defined(__SSE4_2__) # define RAPIDJSON_SSE42 #elif defined(__SSE2__) # define RAPIDJSON_SSE2 #elif defined(__ARM_NEON) # define RAPIDJSON_NEON #endif #define RAPIDJSON_HAS_STDSTRING 1 //////////////////////////////////////////////////////////////////////////////// // Google Test #ifdef __cplusplus // gtest indirectly included inttypes.h, without __STDC_CONSTANT_MACROS. #ifndef __STDC_CONSTANT_MACROS # define __STDC_CONSTANT_MACROS 1 // required by C++ standard #endif #if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) #if defined(__clang__) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #pragma GCC diagnostic push #endif #pragma GCC diagnostic ignored "-Weffc++" #endif #include "gtest/gtest.h" #if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #pragma GCC diagnostic pop #endif #ifdef _MSC_VER #define _CRTDBG_MAP_ALLOC #include #pragma warning(disable : 4996) // 'function': was declared deprecated #endif //! Base class for all performance tests class PerfTest : public ::testing::Test { public: PerfTest() : filename_(), json_(), length_(), whitespace_(), whitespace_length_() {} virtual void SetUp() { { const char *paths[] = { "data/sample.json", "bin/data/sample.json", "../bin/data/sample.json", "../../bin/data/sample.json", "../../../bin/data/sample.json" }; FILE *fp = 0; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { fp = fopen(filename_ = paths[i], "rb"); if (fp) break; } ASSERT_TRUE(fp != 0); fseek(fp, 0, SEEK_END); length_ = (size_t)ftell(fp); fseek(fp, 0, SEEK_SET); json_ = (char*)malloc(length_ + 1); ASSERT_EQ(length_, fread(json_, 1, length_, fp)); json_[length_] = '\0'; fclose(fp); } // whitespace test { whitespace_length_ = 1024 * 1024; whitespace_ = (char *)malloc(whitespace_length_ + 4); char *p = whitespace_; for (size_t i = 0; i < whitespace_length_; i += 4) { *p++ = ' '; *p++ = '\n'; *p++ = '\r'; *p++ = '\t'; } *p++ = '['; *p++ = '0'; *p++ = ']'; *p++ = '\0'; } // types test { const char *typespaths[] = { "data/types", "bin/types", "../bin/types", "../../bin/types/", "../../../bin/types" }; const char* typesfilenames[] = { "booleans.json", "floats.json", "guids.json", "integers.json", "mixed.json", "nulls.json", "paragraphs.json", "alotofkeys.json" }; for (size_t j = 0; j < sizeof(typesfilenames) / sizeof(typesfilenames[0]); j++) { types_[j] = 0; for (size_t i = 0; i < sizeof(typespaths) / sizeof(typespaths[0]); i++) { char filename[256]; sprintf(filename, "%s/%s", typespaths[i], typesfilenames[j]); if (FILE* fp = fopen(filename, "rb")) { fseek(fp, 0, SEEK_END); typesLength_[j] = (size_t)ftell(fp); fseek(fp, 0, SEEK_SET); types_[j] = (char*)malloc(typesLength_[j] + 1); ASSERT_EQ(typesLength_[j], fread(types_[j], 1, typesLength_[j], fp)); types_[j][typesLength_[j]] = '\0'; fclose(fp); break; } } } } } virtual void TearDown() { free(json_); free(whitespace_); json_ = 0; whitespace_ = 0; for (size_t i = 0; i < 8; i++) { free(types_[i]); types_[i] = 0; } } private: PerfTest(const PerfTest&); PerfTest& operator=(const PerfTest&); protected: const char* filename_; char *json_; size_t length_; char *whitespace_; size_t whitespace_length_; char *types_[8]; size_t typesLength_[8]; static const size_t kTrialCount = 1000; }; #endif // __cplusplus #endif // PERFTEST_H_ asymptote-3.05/LspCpp/third_party/rapidjson/test/perftest/platformtest.cpp0000644000000000000000000001052615031566105025760 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "perftest.h" // This file is for giving the performance characteristics of the platform (compiler/OS/CPU). #if TEST_PLATFORM #include #include // Windows #ifdef _WIN32 #include #endif // UNIX #if defined(unix) || defined(__unix__) || defined(__unix) #include #ifdef _POSIX_MAPPED_FILES #include #endif #endif class Platform : public PerfTest { public: virtual void SetUp() { PerfTest::SetUp(); // temp buffer for testing temp_ = (char *)malloc(length_ + 1); memcpy(temp_, json_, length_); checkSum_ = CheckSum(); } char CheckSum() { char c = 0; for (size_t i = 0; i < length_; ++i) c += temp_[i]; return c; } virtual void TearDown() { PerfTest::TearDown(); free(temp_); } protected: char *temp_; char checkSum_; }; TEST_F(Platform, CheckSum) { for (int i = 0; i < kTrialCount; i++) EXPECT_EQ(checkSum_, CheckSum()); } TEST_F(Platform, strlen) { for (int i = 0; i < kTrialCount; i++) { size_t l = strlen(json_); EXPECT_EQ(length_, l); } } TEST_F(Platform, memcmp) { for (int i = 0; i < kTrialCount; i++) { EXPECT_EQ(0u, memcmp(temp_, json_, length_)); } } TEST_F(Platform, pow) { double sum = 0; for (int i = 0; i < kTrialCount * kTrialCount; i++) sum += pow(10.0, i & 255); EXPECT_GT(sum, 0.0); } TEST_F(Platform, Whitespace_strlen) { for (int i = 0; i < kTrialCount; i++) { size_t l = strlen(whitespace_); EXPECT_GT(l, whitespace_length_); } } TEST_F(Platform, Whitespace_strspn) { for (int i = 0; i < kTrialCount; i++) { size_t l = strspn(whitespace_, " \n\r\t"); EXPECT_EQ(whitespace_length_, l); } } TEST_F(Platform, fread) { for (int i = 0; i < kTrialCount; i++) { FILE *fp = fopen(filename_, "rb"); ASSERT_EQ(length_, fread(temp_, 1, length_, fp)); EXPECT_EQ(checkSum_, CheckSum()); fclose(fp); } } #ifdef _MSC_VER TEST_F(Platform, read) { for (int i = 0; i < kTrialCount; i++) { int fd = _open(filename_, _O_BINARY | _O_RDONLY); ASSERT_NE(-1, fd); ASSERT_EQ(length_, _read(fd, temp_, length_)); EXPECT_EQ(checkSum_, CheckSum()); _close(fd); } } #else TEST_F(Platform, read) { for (int i = 0; i < kTrialCount; i++) { int fd = open(filename_, O_RDONLY); ASSERT_NE(-1, fd); ASSERT_EQ(length_, read(fd, temp_, length_)); EXPECT_EQ(checkSum_, CheckSum()); close(fd); } } #endif #ifdef _WIN32 TEST_F(Platform, MapViewOfFile) { for (int i = 0; i < kTrialCount; i++) { HANDLE file = CreateFile(filename_, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ASSERT_NE(INVALID_HANDLE_VALUE, file); HANDLE mapObject = CreateFileMapping(file, NULL, PAGE_READONLY, 0, length_, NULL); ASSERT_NE(INVALID_HANDLE_VALUE, mapObject); void *p = MapViewOfFile(mapObject, FILE_MAP_READ, 0, 0, length_); ASSERT_TRUE(p != NULL); EXPECT_EQ(checkSum_, CheckSum()); ASSERT_TRUE(UnmapViewOfFile(p) == TRUE); ASSERT_TRUE(CloseHandle(mapObject) == TRUE); ASSERT_TRUE(CloseHandle(file) == TRUE); } } #endif #ifdef _POSIX_MAPPED_FILES TEST_F(Platform, mmap) { for (int i = 0; i < kTrialCount; i++) { int fd = open(filename_, O_RDONLY); ASSERT_NE(-1, fd); void *p = mmap(NULL, length_, PROT_READ, MAP_PRIVATE, fd, 0); ASSERT_TRUE(p != NULL); EXPECT_EQ(checkSum_, CheckSum()); munmap(p, length_); close(fd); } } #endif #endif // TEST_PLATFORM asymptote-3.05/LspCpp/third_party/rapidjson/test/perftest/rapidjsontest.cpp0000644000000000000000000003765215031566105026136 0ustar rootroot// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "perftest.h" #if TEST_RAPIDJSON #include "rapidjson/rapidjson.h" #include "rapidjson/document.h" #include "rapidjson/prettywriter.h" #include "rapidjson/stringbuffer.h" #include "rapidjson/filereadstream.h" #include "rapidjson/istreamwrapper.h" #include "rapidjson/encodedstream.h" #include "rapidjson/memorystream.h" #include #include #ifdef RAPIDJSON_SSE2 #define SIMD_SUFFIX(name) name##_SSE2 #elif defined(RAPIDJSON_SSE42) #define SIMD_SUFFIX(name) name##_SSE42 #elif defined(RAPIDJSON_NEON) #define SIMD_SUFFIX(name) name##_NEON #else #define SIMD_SUFFIX(name) name #endif using namespace rapidjson; class RapidJson : public PerfTest { public: RapidJson() : temp_(), doc_() {} virtual void SetUp() { PerfTest::SetUp(); // temp buffer for insitu parsing. temp_ = (char *)malloc(length_ + 1); // Parse as a document EXPECT_FALSE(doc_.Parse(json_).HasParseError()); for (size_t i = 0; i < 8; i++) EXPECT_FALSE(typesDoc_[i].Parse(types_[i]).HasParseError()); } virtual void TearDown() { PerfTest::TearDown(); free(temp_); } private: RapidJson(const RapidJson&); RapidJson& operator=(const RapidJson&); protected: char *temp_; Document doc_; Document typesDoc_[8]; }; TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseInsitu_DummyHandler)) { for (size_t i = 0; i < kTrialCount; i++) { memcpy(temp_, json_, length_ + 1); InsituStringStream s(temp_); BaseReaderHandler<> h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); } } TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseInsitu_DummyHandler_ValidateEncoding)) { for (size_t i = 0; i < kTrialCount; i++) { memcpy(temp_, json_, length_ + 1); InsituStringStream s(temp_); BaseReaderHandler<> h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); } } TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler)) { for (size_t i = 0; i < kTrialCount; i++) { StringStream s(json_); BaseReaderHandler<> h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); } } #define TEST_TYPED(index, Name)\ TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_##Name)) {\ for (size_t i = 0; i < kTrialCount * 10; i++) {\ StringStream s(types_[index]);\ BaseReaderHandler<> h;\ Reader reader;\ EXPECT_TRUE(reader.Parse(s, h));\ }\ }\ TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseInsitu_DummyHandler_##Name)) {\ for (size_t i = 0; i < kTrialCount * 10; i++) {\ memcpy(temp_, types_[index], typesLength_[index] + 1);\ InsituStringStream s(temp_);\ BaseReaderHandler<> h;\ Reader reader;\ EXPECT_TRUE(reader.Parse(s, h));\ }\ } TEST_TYPED(0, Booleans) TEST_TYPED(1, Floats) TEST_TYPED(2, Guids) TEST_TYPED(3, Integers) TEST_TYPED(4, Mixed) TEST_TYPED(5, Nulls) TEST_TYPED(6, Paragraphs) #undef TEST_TYPED TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_FullPrecision)) { for (size_t i = 0; i < kTrialCount; i++) { StringStream s(json_); BaseReaderHandler<> h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); } } TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseIterative_DummyHandler)) { for (size_t i = 0; i < kTrialCount; i++) { StringStream s(json_); BaseReaderHandler<> h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); } } TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseIterativeInsitu_DummyHandler)) { for (size_t i = 0; i < kTrialCount; i++) { memcpy(temp_, json_, length_ + 1); InsituStringStream s(temp_); BaseReaderHandler<> h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); } } TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseIterativePull_DummyHandler)) { for (size_t i = 0; i < kTrialCount; i++) { StringStream s(json_); BaseReaderHandler<> h; Reader reader; reader.IterativeParseInit(); while (!reader.IterativeParseComplete()) { if (!reader.IterativeParseNext(s, h)) break; } EXPECT_FALSE(reader.HasParseError()); } } TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseIterativePullInsitu_DummyHandler)) { for (size_t i = 0; i < kTrialCount; i++) { memcpy(temp_, json_, length_ + 1); InsituStringStream s(temp_); BaseReaderHandler<> h; Reader reader; reader.IterativeParseInit(); while (!reader.IterativeParseComplete()) { if (!reader.IterativeParseNext(s, h)) break; } EXPECT_FALSE(reader.HasParseError()); } } TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_ValidateEncoding)) { for (size_t i = 0; i < kTrialCount; i++) { StringStream s(json_); BaseReaderHandler<> h; Reader reader; EXPECT_TRUE(reader.Parse(s, h)); } } TEST_F(RapidJson, SIMD_SUFFIX(DocumentParseInsitu_MemoryPoolAllocator)) { for (size_t i = 0; i < kTrialCount; i++) { memcpy(temp_, json_, length_ + 1); Document doc; doc.ParseInsitu(temp_); ASSERT_TRUE(doc.IsObject()); } } TEST_F(RapidJson, SIMD_SUFFIX(DocumentParseIterativeInsitu_MemoryPoolAllocator)) { for (size_t i = 0; i < kTrialCount; i++) { memcpy(temp_, json_, length_ + 1); Document doc; doc.ParseInsitu(temp_); ASSERT_TRUE(doc.IsObject()); } } TEST_F(RapidJson, SIMD_SUFFIX(DocumentParse_MemoryPoolAllocator)) { for (size_t i = 0; i < kTrialCount; i++) { Document doc; doc.Parse(json_); ASSERT_TRUE(doc.IsObject()); } } TEST_F(RapidJson, SIMD_SUFFIX(DocumentParseLength_MemoryPoolAllocator)) { for (size_t i = 0; i < kTrialCount; i++) { Document doc; doc.Parse(json_, length_); ASSERT_TRUE(doc.IsObject()); } } #if RAPIDJSON_HAS_STDSTRING TEST_F(RapidJson, SIMD_SUFFIX(DocumentParseStdString_MemoryPoolAllocator)) { const std::string s(json_, length_); for (size_t i = 0; i < kTrialCount; i++) { Document doc; doc.Parse(s); ASSERT_TRUE(doc.IsObject()); } } #endif TEST_F(RapidJson, SIMD_SUFFIX(DocumentParseIterative_MemoryPoolAllocator)) { for (size_t i = 0; i < kTrialCount; i++) { Document doc; doc.Parse(json_); ASSERT_TRUE(doc.IsObject()); } } TEST_F(RapidJson, SIMD_SUFFIX(DocumentParse_CrtAllocator)) { for (size_t i = 0; i < kTrialCount; i++) { memcpy(temp_, json_, length_ + 1); GenericDocument, CrtAllocator> doc; doc.Parse(temp_); ASSERT_TRUE(doc.IsObject()); } } TEST_F(RapidJson, SIMD_SUFFIX(DocumentParseEncodedInputStream_MemoryStream)) { for (size_t i = 0; i < kTrialCount; i++) { MemoryStream ms(json_, length_); EncodedInputStream, MemoryStream> is(ms); Document doc; doc.ParseStream<0, UTF8<> >(is); ASSERT_TRUE(doc.IsObject()); } } TEST_F(RapidJson, SIMD_SUFFIX(DocumentParseAutoUTFInputStream_MemoryStream)) { for (size_t i = 0; i < kTrialCount; i++) { MemoryStream ms(json_, length_); AutoUTFInputStream is(ms); Document doc; doc.ParseStream<0, AutoUTF >(is); ASSERT_TRUE(doc.IsObject()); } } template size_t Traverse(const T& value) { size_t count = 1; switch(value.GetType()) { case kObjectType: for (typename T::ConstMemberIterator itr = value.MemberBegin(); itr != value.MemberEnd(); ++itr) { count++; // name count += Traverse(itr->value); } break; case kArrayType: for (typename T::ConstValueIterator itr = value.Begin(); itr != value.End(); ++itr) count += Traverse(*itr); break; default: // Do nothing. break; } return count; } TEST_F(RapidJson, DocumentTraverse) { for (size_t i = 0; i < kTrialCount; i++) { size_t count = Traverse(doc_); EXPECT_EQ(4339u, count); //if (i == 0) // std::cout << count << std::endl; } } #ifdef __GNUC__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) #endif struct ValueCounter : public BaseReaderHandler<> { ValueCounter() : count_(1) {} // root bool EndObject(SizeType memberCount) { count_ += memberCount * 2; return true; } bool EndArray(SizeType elementCount) { count_ += elementCount; return true; } SizeType count_; }; #ifdef __GNUC__ RAPIDJSON_DIAG_POP #endif TEST_F(RapidJson, DocumentAccept) { for (size_t i = 0; i < kTrialCount; i++) { ValueCounter counter; doc_.Accept(counter); EXPECT_EQ(4339u, counter.count_); } } TEST_F(RapidJson, DocumentFind) { typedef Document::ValueType ValueType; typedef ValueType::ConstMemberIterator ConstMemberIterator; const Document &doc = typesDoc_[7]; // alotofkeys.json if (doc.IsObject()) { std::vector keys; for (ConstMemberIterator it = doc.MemberBegin(); it != doc.MemberEnd(); ++it) { keys.push_back(&it->name); } for (size_t i = 0; i < kTrialCount; i++) { for (size_t j = 0; j < keys.size(); j++) { EXPECT_TRUE(doc.FindMember(*keys[j]) != doc.MemberEnd()); } } } } struct NullStream { typedef char Ch; NullStream() /*: length_(0)*/ {} void Put(Ch) { /*++length_;*/ } void Flush() {} //size_t length_; }; TEST_F(RapidJson, Writer_NullStream) { for (size_t i = 0; i < kTrialCount; i++) { NullStream s; Writer writer(s); doc_.Accept(writer); //if (i == 0) // std::cout << s.length_ << std::endl; } } TEST_F(RapidJson, SIMD_SUFFIX(Writer_StringBuffer)) { for (size_t i = 0; i < kTrialCount; i++) { StringBuffer s(0, 1024 * 1024); Writer writer(s); doc_.Accept(writer); const char* str = s.GetString(); (void)str; //if (i == 0) // std::cout << strlen(str) << std::endl; } } #define TEST_TYPED(index, Name)\ TEST_F(RapidJson, SIMD_SUFFIX(Writer_StringBuffer_##Name)) {\ for (size_t i = 0; i < kTrialCount * 10; i++) {\ StringBuffer s(0, 1024 * 1024);\ Writer writer(s);\ typesDoc_[index].Accept(writer);\ const char* str = s.GetString();\ (void)str;\ }\ } TEST_TYPED(0, Booleans) TEST_TYPED(1, Floats) TEST_TYPED(2, Guids) TEST_TYPED(3, Integers) TEST_TYPED(4, Mixed) TEST_TYPED(5, Nulls) TEST_TYPED(6, Paragraphs) #undef TEST_TYPED TEST_F(RapidJson, SIMD_SUFFIX(PrettyWriter_StringBuffer)) { for (size_t i = 0; i < kTrialCount; i++) { StringBuffer s(0, 2048 * 1024); PrettyWriter writer(s); writer.SetIndent(' ', 1); doc_.Accept(writer); const char* str = s.GetString(); (void)str; //if (i == 0) // std::cout << strlen(str) << std::endl; } } TEST_F(RapidJson, internal_Pow10) { double sum = 0; for (size_t i = 0; i < kTrialCount * kTrialCount; i++) sum += internal::Pow10(int(i & 255)); EXPECT_GT(sum, 0.0); } TEST_F(RapidJson, SkipWhitespace_Basic) { for (size_t i = 0; i < kTrialCount; i++) { rapidjson::StringStream s(whitespace_); while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t') s.Take(); ASSERT_EQ('[', s.Peek()); } } TEST_F(RapidJson, SIMD_SUFFIX(SkipWhitespace)) { for (size_t i = 0; i < kTrialCount; i++) { rapidjson::StringStream s(whitespace_); rapidjson::SkipWhitespace(s); ASSERT_EQ('[', s.Peek()); } } TEST_F(RapidJson, SkipWhitespace_strspn) { for (size_t i = 0; i < kTrialCount; i++) { const char* s = whitespace_ + std::strspn(whitespace_, " \t\r\n"); ASSERT_EQ('[', *s); } } TEST_F(RapidJson, UTF8_Validate) { NullStream os; for (size_t i = 0; i < kTrialCount; i++) { StringStream is(json_); bool result = true; while (is.Peek() != '\0') result &= UTF8<>::Validate(is, os); EXPECT_TRUE(result); } } TEST_F(RapidJson, FileReadStream) { for (size_t i = 0; i < kTrialCount; i++) { FILE *fp = fopen(filename_, "rb"); char buffer[65536]; FileReadStream s(fp, buffer, sizeof(buffer)); while (s.Take() != '\0') ; fclose(fp); } } TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_FileReadStream)) { for (size_t i = 0; i < kTrialCount; i++) { FILE *fp = fopen(filename_, "rb"); char buffer[65536]; FileReadStream s(fp, buffer, sizeof(buffer)); BaseReaderHandler<> h; Reader reader; reader.Parse(s, h); fclose(fp); } } TEST_F(RapidJson, IStreamWrapper) { for (size_t i = 0; i < kTrialCount; i++) { std::ifstream is(filename_, std::ios::in | std::ios::binary); char buffer[65536]; IStreamWrapper isw(is, buffer, sizeof(buffer)); while (isw.Take() != '\0') ; is.close(); } } TEST_F(RapidJson, IStreamWrapper_Unbuffered) { for (size_t i = 0; i < kTrialCount; i++) { std::ifstream is(filename_, std::ios::in | std::ios::binary); IStreamWrapper isw(is); while (isw.Take() != '\0') ; is.close(); } } TEST_F(RapidJson, IStreamWrapper_Setbuffered) { for (size_t i = 0; i < kTrialCount; i++) { std::ifstream is; char buffer[65536]; is.rdbuf()->pubsetbuf(buffer, sizeof(buffer)); is.open(filename_, std::ios::in | std::ios::binary); IStreamWrapper isw(is); while (isw.Take() != '\0') ; is.close(); } } TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_IStreamWrapper)) { for (size_t i = 0; i < kTrialCount; i++) { std::ifstream is(filename_, std::ios::in | std::ios::binary); char buffer[65536]; IStreamWrapper isw(is, buffer, sizeof(buffer)); BaseReaderHandler<> h; Reader reader; reader.Parse(isw, h); is.close(); } } TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_IStreamWrapper_Unbuffered)) { for (size_t i = 0; i < kTrialCount; i++) { std::ifstream is(filename_, std::ios::in | std::ios::binary); IStreamWrapper isw(is); BaseReaderHandler<> h; Reader reader; reader.Parse(isw, h); is.close(); } } TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_IStreamWrapper_Setbuffered)) { for (size_t i = 0; i < kTrialCount; i++) { std::ifstream is; char buffer[65536]; is.rdbuf()->pubsetbuf(buffer, sizeof(buffer)); is.open(filename_, std::ios::in | std::ios::binary); IStreamWrapper isw(is); BaseReaderHandler<> h; Reader reader; reader.Parse(isw, h); is.close(); } } TEST_F(RapidJson, StringBuffer) { StringBuffer sb; for (int i = 0; i < 32 * 1024 * 1024; i++) sb.Put(i & 0x7f); } #endif // TEST_RAPIDJSON asymptote-3.05/LspCpp/third_party/rapidjson/test/perftest/schematest.cpp0000644000000000000000000001606215031566105025375 0ustar rootroot#include "perftest.h" #if TEST_RAPIDJSON #include "rapidjson/schema.h" #include #include #include #define ARRAY_SIZE(a) sizeof(a) / sizeof(a[0]) using namespace rapidjson; RAPIDJSON_DIAG_PUSH #if defined(__GNUC__) && __GNUC__ >= 7 RAPIDJSON_DIAG_OFF(format-overflow) #endif template static char* ReadFile(const char* filename, Allocator& allocator) { const char *paths[] = { "", "bin/", "../bin/", "../../bin/", "../../../bin/" }; char buffer[1024]; FILE *fp = 0; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { sprintf(buffer, "%s%s", paths[i], filename); fp = fopen(buffer, "rb"); if (fp) break; } if (!fp) return 0; fseek(fp, 0, SEEK_END); size_t length = static_cast(ftell(fp)); fseek(fp, 0, SEEK_SET); char* json = reinterpret_cast(allocator.Malloc(length + 1)); size_t readLength = fread(json, 1, length, fp); json[readLength] = '\0'; fclose(fp); return json; } RAPIDJSON_DIAG_POP class Schema : public PerfTest { public: Schema() {} virtual void SetUp() { PerfTest::SetUp(); const char* filenames[] = { "additionalItems.json", "additionalProperties.json", "allOf.json", "anyOf.json", "default.json", "definitions.json", "dependencies.json", "enum.json", "items.json", "maximum.json", "maxItems.json", "maxLength.json", "maxProperties.json", "minimum.json", "minItems.json", "minLength.json", "minProperties.json", "multipleOf.json", "not.json", "oneOf.json", "pattern.json", "patternProperties.json", "properties.json", "ref.json", "refRemote.json", "required.json", "type.json", "uniqueItems.json" }; char jsonBuffer[65536]; MemoryPoolAllocator<> jsonAllocator(jsonBuffer, sizeof(jsonBuffer)); for (size_t i = 0; i < ARRAY_SIZE(filenames); i++) { char filename[FILENAME_MAX]; sprintf(filename, "jsonschema/tests/draft4/%s", filenames[i]); char* json = ReadFile(filename, jsonAllocator); if (!json) { printf("json test suite file %s not found", filename); return; } Document d; d.Parse(json); if (d.HasParseError()) { printf("json test suite file %s has parse error", filename); return; } for (Value::ConstValueIterator schemaItr = d.Begin(); schemaItr != d.End(); ++schemaItr) { std::string schemaDescription = (*schemaItr)["description"].GetString(); if (IsExcludeTestSuite(schemaDescription)) continue; TestSuite* ts = new TestSuite; ts->schema = new SchemaDocument((*schemaItr)["schema"]); const Value& tests = (*schemaItr)["tests"]; for (Value::ConstValueIterator testItr = tests.Begin(); testItr != tests.End(); ++testItr) { if (IsExcludeTest(schemaDescription + ", " + (*testItr)["description"].GetString())) continue; Document* d2 = new Document; d2->CopyFrom((*testItr)["data"], d2->GetAllocator()); ts->tests.push_back(d2); } testSuites.push_back(ts); } } } virtual void TearDown() { PerfTest::TearDown(); for (TestSuiteList::const_iterator itr = testSuites.begin(); itr != testSuites.end(); ++itr) delete *itr; testSuites.clear(); } private: // Using the same exclusion in https://github.com/json-schema/JSON-Schema-Test-Suite static bool IsExcludeTestSuite(const std::string& description) { const char* excludeTestSuites[] = { //lost failing these tests "remote ref", "remote ref, containing refs itself", "fragment within remote ref", "ref within remote ref", "change resolution scope", // these below were added to get jsck in the benchmarks) "uniqueItems validation", "valid definition", "invalid definition" }; for (size_t i = 0; i < ARRAY_SIZE(excludeTestSuites); i++) if (excludeTestSuites[i] == description) return true; return false; } // Using the same exclusion in https://github.com/json-schema/JSON-Schema-Test-Suite static bool IsExcludeTest(const std::string& description) { const char* excludeTests[] = { //lots of validators fail these "invalid definition, invalid definition schema", "maxLength validation, two supplementary Unicode code points is long enough", "minLength validation, one supplementary Unicode code point is not long enough", //this is to get tv4 in the benchmarks "heterogeneous enum validation, something else is invalid" }; for (size_t i = 0; i < ARRAY_SIZE(excludeTests); i++) if (excludeTests[i] == description) return true; return false; } Schema(const Schema&); Schema& operator=(const Schema&); protected: typedef std::vector DocumentList; struct TestSuite { TestSuite() : schema() {} ~TestSuite() { delete schema; for (DocumentList::iterator itr = tests.begin(); itr != tests.end(); ++itr) delete *itr; } SchemaDocument* schema; DocumentList tests; }; typedef std::vector TestSuiteList; TestSuiteList testSuites; }; TEST_F(Schema, TestSuite) { char validatorBuffer[65536]; MemoryPoolAllocator<> validatorAllocator(validatorBuffer, sizeof(validatorBuffer)); const int trialCount = 100000; int testCount = 0; clock_t start = clock(); for (int i = 0; i < trialCount; i++) { for (TestSuiteList::const_iterator itr = testSuites.begin(); itr != testSuites.end(); ++itr) { const TestSuite& ts = **itr; GenericSchemaValidator >, MemoryPoolAllocator<> > validator(*ts.schema, &validatorAllocator); for (DocumentList::const_iterator testItr = ts.tests.begin(); testItr != ts.tests.end(); ++testItr) { validator.Reset(); (*testItr)->Accept(validator); testCount++; } validatorAllocator.Clear(); } } clock_t end = clock(); double duration = double(end - start) / CLOCKS_PER_SEC; printf("%d trials in %f s -> %f trials per sec\n", trialCount, duration, trialCount / duration); printf("%d tests per trial\n", testCount / trialCount); } #endif asymptote-3.05/LspCpp/third_party/rapidjson/test/valgrind.supp0000644000000000000000000000056115031566105023411 0ustar rootroot{ Suppress wcslen valgrind report 1 Memcheck:Cond fun:__wcslen_sse2 } { Suppress wcslen valgrind report 2 Memcheck:Addr8 fun:__wcslen_sse2 } { Suppress wcslen valgrind report 3 Memcheck:Value8 fun:__wcslen_sse2 } { Suppress wmemcmp valgrind report 4 Memcheck:Addr32 fun:__wmemcmp_avx2_movbe ... fun:*Uri*Parse_UTF16_Std* } asymptote-3.05/LspCpp/third_party/rapidjson/CHANGELOG.md0000644000000000000000000001524215031566105021526 0ustar rootroot# Change Log All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] ## 1.1.0 - 2016-08-25 ### Added * Add GenericDocument ctor overload to specify JSON type (#369) * Add FAQ (#372, #373, #374, #376) * Add forward declaration header `fwd.h` * Add @PlatformIO Library Registry manifest file (#400) * Implement assignment operator for BigInteger (#404) * Add comments support (#443) * Adding coapp definition (#460) * documenttest.cpp: EXPECT_THROW when checking empty allocator (470) * GenericDocument: add implicit conversion to ParseResult (#480) * Use with C++ linkage on Windows ARM (#485) * Detect little endian for Microsoft ARM targets * Check Nan/Inf when writing a double (#510) * Add JSON Schema Implementation (#522) * Add iostream wrapper (#530) * Add Jsonx example for converting JSON into JSONx (a XML format) (#531) * Add optional unresolvedTokenIndex parameter to Pointer::Get() (#532) * Add encoding validation option for Writer/PrettyWriter (#534) * Add Writer::SetMaxDecimalPlaces() (#536) * Support {0, } and {0, m} in Regex (#539) * Add Value::Get/SetFloat(), Value::IsLossLessFloat/Double() (#540) * Add stream position check to reader unit tests (#541) * Add Templated accessors and range-based for (#542) * Add (Pretty)Writer::RawValue() (#543) * Add Document::Parse(std::string), Document::Parse(const char*, size_t length) and related APIs. (#553) * Add move constructor for GenericSchemaDocument (#554) * Add VS2010 and VS2015 to AppVeyor CI (#555) * Add parse-by-parts example (#556, #562) * Support parse number as string (#564, #589) * Add kFormatSingleLineArray for PrettyWriter (#577) * Added optional support for trailing commas (#584) * Added filterkey and filterkeydom examples (#615) * Added npm docs (#639) * Allow options for writing and parsing NaN/Infinity (#641) * Add std::string overload to PrettyWriter::Key() when RAPIDJSON_HAS_STDSTRING is defined (#698) ### Fixed * Fix gcc/clang/vc warnings (#350, #394, #397, #444, #447, #473, #515, #582, #589, #595, #667) * Fix documentation (#482, #511, #550, #557, #614, #635, #660) * Fix emscripten alignment issue (#535) * Fix missing allocator to uses of AddMember in document (#365) * CMake will no longer complain that the minimum CMake version is not specified (#501) * Make it usable with old VC8 (VS2005) (#383) * Prohibit C++11 move from Document to Value (#391) * Try to fix incorrect 64-bit alignment (#419) * Check return of fwrite to avoid warn_unused_result build failures (#421) * Fix UB in GenericDocument::ParseStream (#426) * Keep Document value unchanged on parse error (#439) * Add missing return statement (#450) * Fix Document::Parse(const Ch*) for transcoding (#478) * encodings.h: fix typo in preprocessor condition (#495) * Custom Microsoft headers are necessary only for Visual Studio 2012 and lower (#559) * Fix memory leak for invalid regex (26e69ffde95ba4773ab06db6457b78f308716f4b) * Fix a bug in schema minimum/maximum keywords for 64-bit integer (e7149d665941068ccf8c565e77495521331cf390) * Fix a crash bug in regex (#605) * Fix schema "required" keyword cannot handle duplicated keys (#609) * Fix cmake CMP0054 warning (#612) * Added missing include guards in istreamwrapper.h and ostreamwrapper.h (#634) * Fix undefined behaviour (#646) * Fix buffer overrun using PutN (#673) * Fix rapidjson::value::Get() may returns wrong data (#681) * Add Flush() for all value types (#689) * Handle malloc() fail in PoolAllocator (#691) * Fix builds on x32 platform. #703 ### Changed * Clarify problematic JSON license (#392) * Move Travis to container based infrastructure (#504, #558) * Make whitespace array more compact (#513) * Optimize Writer::WriteString() with SIMD (#544) * x86-64 48-bit pointer optimization for GenericValue (#546) * Define RAPIDJSON_HAS_CXX11_RVALUE_REFS directly in clang (#617) * Make GenericSchemaDocument constructor explicit (#674) * Optimize FindMember when use std::string (#690) ## [1.0.2] - 2015-05-14 ### Added * Add Value::XXXMember(...) overloads for std::string (#335) ### Fixed * Include rapidjson.h for all internal/error headers. * Parsing some numbers incorrectly in full-precision mode (`kFullPrecisionParseFlag`) (#342) * Fix some numbers parsed incorrectly (#336) * Fix alignment of 64bit platforms (#328) * Fix MemoryPoolAllocator::Clear() to clear user-buffer (0691502573f1afd3341073dd24b12c3db20fbde4) ### Changed * CMakeLists for include as a thirdparty in projects (#334, #337) * Change Document::ParseStream() to use stack allocator for Reader (ffbe38614732af8e0b3abdc8b50071f386a4a685) ## [1.0.1] - 2015-04-25 ### Added * Changelog following [Keep a CHANGELOG](https://github.com/olivierlacan/keep-a-changelog) suggestions. ### Fixed * Parsing of some numbers (e.g. "1e-00011111111111") causing assertion (#314). * Visual C++ 32-bit compilation error in `diyfp.h` (#317). ## [1.0.0] - 2015-04-22 ### Added * 100% [Coverall](https://coveralls.io/r/Tencent/rapidjson?branch=master) coverage. * Version macros (#311) ### Fixed * A bug in trimming long number sequence (4824f12efbf01af72b8cb6fc96fae7b097b73015). * Double quote in unicode escape (#288). * Negative zero roundtrip (double only) (#289). * Standardize behavior of `memcpy()` and `malloc()` (0c5c1538dcfc7f160e5a4aa208ddf092c787be5a, #305, 0e8bbe5e3ef375e7f052f556878be0bd79e9062d). ### Removed * Remove an invalid `Document::ParseInsitu()` API (e7f1c6dd08b522cfcf9aed58a333bd9a0c0ccbeb). ## 1.0-beta - 2015-04-8 ### Added * RFC 7159 (#101) * Optional Iterative Parser (#76) * Deep-copy values (#20) * Error code and message (#27) * ASCII Encoding (#70) * `kParseStopWhenDoneFlag` (#83) * `kParseFullPrecisionFlag` (881c91d696f06b7f302af6d04ec14dd08db66ceb) * Add `Key()` to handler concept (#134) * C++11 compatibility and support (#128) * Optimized number-to-string and vice versa conversions (#137, #80) * Short-String Optimization (#131) * Local stream optimization by traits (#32) * Travis & Appveyor Continuous Integration, with Valgrind verification (#24, #242) * Redo all documentation (English, Simplified Chinese) ### Changed * Copyright ownership transferred to THL A29 Limited (a Tencent company). * Migrating from Premake to CMAKE (#192) * Resolve all warning reports ### Removed * Remove other JSON libraries for performance comparison (#180) ## 0.11 - 2012-11-16 ## 0.1 - 2011-11-18 [Unreleased]: https://github.com/Tencent/rapidjson/compare/v1.1.0...HEAD [1.1.0]: https://github.com/Tencent/rapidjson/compare/v1.0.2...v1.1.0 [1.0.2]: https://github.com/Tencent/rapidjson/compare/v1.0.1...v1.0.2 [1.0.1]: https://github.com/Tencent/rapidjson/compare/v1.0.0...v1.0.1 [1.0.0]: https://github.com/Tencent/rapidjson/compare/v1.0-beta...v1.0.0 asymptote-3.05/LspCpp/third_party/rapidjson/license.txt0000644000000000000000000001204015031566105022071 0ustar rootrootTencent is pleased to support the open source community by making RapidJSON available. Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. If you have downloaded a copy of the RapidJSON binary from Tencent, please note that the RapidJSON binary is licensed under the MIT License. If you have downloaded a copy of the RapidJSON source code from Tencent, please note that RapidJSON source code is licensed under the MIT License, except for the third-party components listed below which are subject to different license terms. Your integration of RapidJSON into your own projects may require compliance with the MIT License, as well as the other licenses applicable to the third-party components included within RapidJSON. To avoid the problematic JSON license in your own projects, it's sufficient to exclude the bin/jsonchecker/ directory, as it's the only code under the JSON license. A copy of the MIT License is included in this file. Other dependencies and licenses: Open Source Software Licensed Under the BSD License: -------------------------------------------------------------------- The msinttypes r29 Copyright (c) 2006-2013 Alexander Chemeris All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Open Source Software Licensed Under the JSON License: -------------------------------------------------------------------- json.org Copyright (c) 2002 JSON.org All Rights Reserved. JSON_checker Copyright (c) 2002 JSON.org All Rights Reserved. Terms of the JSON License: --------------------------------------------------- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. The Software shall be used for Good, not Evil. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Terms of the MIT License: -------------------------------------------------------------------- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. asymptote-3.05/LspCpp/third_party/rapidjson/example/0000755000000000000000000000000015031566105021344 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/filterkeydom/0000755000000000000000000000000015031566105024042 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/filterkeydom/filterkeydom.cpp0000644000000000000000000001345515031566105027254 0ustar rootroot// JSON filterkey example which populates filtered SAX events into a Document. // This example parses JSON text from stdin with validation. // During parsing, specified key will be filtered using a SAX handler. // And finally the filtered events are used to populate a Document. // As an example, the document is written to standard output. #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/filereadstream.h" #include "rapidjson/filewritestream.h" #include "rapidjson/error/en.h" #include using namespace rapidjson; // This handler forwards event into an output handler, with filtering the descendent events of specified key. template class FilterKeyHandler { public: typedef char Ch; FilterKeyHandler(OutputHandler& outputHandler, const Ch* keyString, SizeType keyLength) : outputHandler_(outputHandler), keyString_(keyString), keyLength_(keyLength), filterValueDepth_(), filteredKeyCount_() {} bool Null() { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.Null() && EndValue(); } bool Bool(bool b) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.Bool(b) && EndValue(); } bool Int(int i) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.Int(i) && EndValue(); } bool Uint(unsigned u) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.Uint(u) && EndValue(); } bool Int64(int64_t i) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.Int64(i) && EndValue(); } bool Uint64(uint64_t u) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.Uint64(u) && EndValue(); } bool Double(double d) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.Double(d) && EndValue(); } bool RawNumber(const Ch* str, SizeType len, bool copy) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.RawNumber(str, len, copy) && EndValue(); } bool String (const Ch* str, SizeType len, bool copy) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.String (str, len, copy) && EndValue(); } bool StartObject() { if (filterValueDepth_ > 0) { filterValueDepth_++; return true; } else { filteredKeyCount_.push(0); return outputHandler_.StartObject(); } } bool Key(const Ch* str, SizeType len, bool copy) { if (filterValueDepth_ > 0) return true; else if (len == keyLength_ && std::memcmp(str, keyString_, len) == 0) { filterValueDepth_ = 1; return true; } else { ++filteredKeyCount_.top(); return outputHandler_.Key(str, len, copy); } } bool EndObject(SizeType) { if (filterValueDepth_ > 0) { filterValueDepth_--; return EndValue(); } else { // Use our own filtered memberCount SizeType memberCount = filteredKeyCount_.top(); filteredKeyCount_.pop(); return outputHandler_.EndObject(memberCount) && EndValue(); } } bool StartArray() { if (filterValueDepth_ > 0) { filterValueDepth_++; return true; } else return outputHandler_.StartArray(); } bool EndArray(SizeType elementCount) { if (filterValueDepth_ > 0) { filterValueDepth_--; return EndValue(); } else return outputHandler_.EndArray(elementCount) && EndValue(); } private: FilterKeyHandler(const FilterKeyHandler&); FilterKeyHandler& operator=(const FilterKeyHandler&); bool EndValue() { if (filterValueDepth_ == 1) // Just at the end of value after filtered key filterValueDepth_ = 0; return true; } OutputHandler& outputHandler_; const char* keyString_; const SizeType keyLength_; unsigned filterValueDepth_; std::stack filteredKeyCount_; }; // Implements a generator for Document::Populate() template class FilterKeyReader { public: typedef char Ch; FilterKeyReader(InputStream& is, const Ch* keyString, SizeType keyLength) : is_(is), keyString_(keyString), keyLength_(keyLength), parseResult_() {} // SAX event flow: reader -> filter -> handler template bool operator()(Handler& handler) { FilterKeyHandler filter(handler, keyString_, keyLength_); Reader reader; parseResult_ = reader.Parse(is_, filter); return parseResult_; } const ParseResult& GetParseResult() const { return parseResult_; } private: FilterKeyReader(const FilterKeyReader&); FilterKeyReader& operator=(const FilterKeyReader&); InputStream& is_; const char* keyString_; const SizeType keyLength_; ParseResult parseResult_; }; int main(int argc, char* argv[]) { if (argc != 2) { fprintf(stderr, "filterkeydom key < input.json > output.json\n"); return 1; } // Prepare input stream. char readBuffer[65536]; FileReadStream is(stdin, readBuffer, sizeof(readBuffer)); // Prepare Filter FilterKeyReader reader(is, argv[1], static_cast(strlen(argv[1]))); // Populates the filtered events from reader Document document; document.Populate(reader); ParseResult pr = reader.GetParseResult(); if (!pr) { fprintf(stderr, "\nError(%u): %s\n", static_cast(pr.Offset()), GetParseError_En(pr.Code())); return 1; } // Prepare JSON writer and output stream. char writeBuffer[65536]; FileWriteStream os(stdout, writeBuffer, sizeof(writeBuffer)); Writer writer(os); // Write the document to standard output document.Accept(writer); return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/example/filterkey/0000755000000000000000000000000015031566105023342 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/filterkey/filterkey.cpp0000644000000000000000000001154315031566105026050 0ustar rootroot// JSON filterkey example with SAX-style API. // This example parses JSON text from stdin with validation. // During parsing, specified key will be filtered using a SAX handler. // It re-output the JSON content to stdout without whitespace. #include "rapidjson/reader.h" #include "rapidjson/writer.h" #include "rapidjson/filereadstream.h" #include "rapidjson/filewritestream.h" #include "rapidjson/error/en.h" #include using namespace rapidjson; // This handler forwards event into an output handler, with filtering the descendent events of specified key. template class FilterKeyHandler { public: typedef char Ch; FilterKeyHandler(OutputHandler& outputHandler, const Ch* keyString, SizeType keyLength) : outputHandler_(outputHandler), keyString_(keyString), keyLength_(keyLength), filterValueDepth_(), filteredKeyCount_() {} bool Null() { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.Null() && EndValue(); } bool Bool(bool b) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.Bool(b) && EndValue(); } bool Int(int i) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.Int(i) && EndValue(); } bool Uint(unsigned u) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.Uint(u) && EndValue(); } bool Int64(int64_t i) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.Int64(i) && EndValue(); } bool Uint64(uint64_t u) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.Uint64(u) && EndValue(); } bool Double(double d) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.Double(d) && EndValue(); } bool RawNumber(const Ch* str, SizeType len, bool copy) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.RawNumber(str, len, copy) && EndValue(); } bool String (const Ch* str, SizeType len, bool copy) { return filterValueDepth_ > 0 ? EndValue() : outputHandler_.String (str, len, copy) && EndValue(); } bool StartObject() { if (filterValueDepth_ > 0) { filterValueDepth_++; return true; } else { filteredKeyCount_.push(0); return outputHandler_.StartObject(); } } bool Key(const Ch* str, SizeType len, bool copy) { if (filterValueDepth_ > 0) return true; else if (len == keyLength_ && std::memcmp(str, keyString_, len) == 0) { filterValueDepth_ = 1; return true; } else { ++filteredKeyCount_.top(); return outputHandler_.Key(str, len, copy); } } bool EndObject(SizeType) { if (filterValueDepth_ > 0) { filterValueDepth_--; return EndValue(); } else { // Use our own filtered memberCount SizeType memberCount = filteredKeyCount_.top(); filteredKeyCount_.pop(); return outputHandler_.EndObject(memberCount) && EndValue(); } } bool StartArray() { if (filterValueDepth_ > 0) { filterValueDepth_++; return true; } else return outputHandler_.StartArray(); } bool EndArray(SizeType elementCount) { if (filterValueDepth_ > 0) { filterValueDepth_--; return EndValue(); } else return outputHandler_.EndArray(elementCount) && EndValue(); } private: FilterKeyHandler(const FilterKeyHandler&); FilterKeyHandler& operator=(const FilterKeyHandler&); bool EndValue() { if (filterValueDepth_ == 1) // Just at the end of value after filtered key filterValueDepth_ = 0; return true; } OutputHandler& outputHandler_; const char* keyString_; const SizeType keyLength_; unsigned filterValueDepth_; std::stack filteredKeyCount_; }; int main(int argc, char* argv[]) { if (argc != 2) { fprintf(stderr, "filterkey key < input.json > output.json\n"); return 1; } // Prepare JSON reader and input stream. Reader reader; char readBuffer[65536]; FileReadStream is(stdin, readBuffer, sizeof(readBuffer)); // Prepare JSON writer and output stream. char writeBuffer[65536]; FileWriteStream os(stdout, writeBuffer, sizeof(writeBuffer)); Writer writer(os); // Prepare Filter FilterKeyHandler > filter(writer, argv[1], static_cast(strlen(argv[1]))); // JSON reader parse from the input stream, filter handler filters the events, and forward to writer. // i.e. the events flow is: reader -> filter -> writer if (!reader.Parse(is, filter)) { fprintf(stderr, "\nError(%u): %s\n", static_cast(reader.GetErrorOffset()), GetParseError_En(reader.GetParseErrorCode())); return 1; } return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/example/lookaheadparser/0000755000000000000000000000000015031566105024510 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/lookaheadparser/lookaheadparser.cpp0000644000000000000000000002220515031566105030361 0ustar rootroot#include "rapidjson/reader.h" #include "rapidjson/document.h" #include RAPIDJSON_DIAG_PUSH #ifdef __GNUC__ RAPIDJSON_DIAG_OFF(effc++) #endif // This example demonstrates JSON token-by-token parsing with an API that is // more direct; you don't need to design your logic around a handler object and // callbacks. Instead, you retrieve values from the JSON stream by calling // GetInt(), GetDouble(), GetString() and GetBool(), traverse into structures // by calling EnterObject() and EnterArray(), and skip over unwanted data by // calling SkipValue(). When you know your JSON's structure, this can be quite // convenient. // // If you aren't sure of what's next in the JSON data, you can use PeekType() and // PeekValue() to look ahead to the next object before reading it. // // If you call the wrong retrieval method--e.g. GetInt when the next JSON token is // not an int, EnterObject or EnterArray when there isn't actually an object or array // to read--the stream parsing will end immediately and no more data will be delivered. // // After calling EnterObject, you retrieve keys via NextObjectKey() and values via // the normal getters. When NextObjectKey() returns null, you have exited the // object, or you can call SkipObject() to skip to the end of the object // immediately. If you fetch the entire object (i.e. NextObjectKey() returned null), // you should not call SkipObject(). // // After calling EnterArray(), you must alternate between calling NextArrayValue() // to see if the array has more data, and then retrieving values via the normal // getters. You can call SkipArray() to skip to the end of the array immediately. // If you fetch the entire array (i.e. NextArrayValue() returned null), // you should not call SkipArray(). // // This parser uses in-situ strings, so the JSON buffer will be altered during the // parse. using namespace rapidjson; class LookaheadParserHandler { public: bool Null() { st_ = kHasNull; v_.SetNull(); return true; } bool Bool(bool b) { st_ = kHasBool; v_.SetBool(b); return true; } bool Int(int i) { st_ = kHasNumber; v_.SetInt(i); return true; } bool Uint(unsigned u) { st_ = kHasNumber; v_.SetUint(u); return true; } bool Int64(int64_t i) { st_ = kHasNumber; v_.SetInt64(i); return true; } bool Uint64(uint64_t u) { st_ = kHasNumber; v_.SetUint64(u); return true; } bool Double(double d) { st_ = kHasNumber; v_.SetDouble(d); return true; } bool RawNumber(const char*, SizeType, bool) { return false; } bool String(const char* str, SizeType length, bool) { st_ = kHasString; v_.SetString(str, length); return true; } bool StartObject() { st_ = kEnteringObject; return true; } bool Key(const char* str, SizeType length, bool) { st_ = kHasKey; v_.SetString(str, length); return true; } bool EndObject(SizeType) { st_ = kExitingObject; return true; } bool StartArray() { st_ = kEnteringArray; return true; } bool EndArray(SizeType) { st_ = kExitingArray; return true; } protected: LookaheadParserHandler(char* str); void ParseNext(); protected: enum LookaheadParsingState { kInit, kError, kHasNull, kHasBool, kHasNumber, kHasString, kHasKey, kEnteringObject, kExitingObject, kEnteringArray, kExitingArray }; Value v_; LookaheadParsingState st_; Reader r_; InsituStringStream ss_; static const int parseFlags = kParseDefaultFlags | kParseInsituFlag; }; LookaheadParserHandler::LookaheadParserHandler(char* str) : v_(), st_(kInit), r_(), ss_(str) { r_.IterativeParseInit(); ParseNext(); } void LookaheadParserHandler::ParseNext() { if (r_.HasParseError()) { st_ = kError; return; } r_.IterativeParseNext(ss_, *this); } class LookaheadParser : protected LookaheadParserHandler { public: LookaheadParser(char* str) : LookaheadParserHandler(str) {} bool EnterObject(); bool EnterArray(); const char* NextObjectKey(); bool NextArrayValue(); int GetInt(); double GetDouble(); const char* GetString(); bool GetBool(); void GetNull(); void SkipObject(); void SkipArray(); void SkipValue(); Value* PeekValue(); int PeekType(); // returns a rapidjson::Type, or -1 for no value (at end of object/array) bool IsValid() { return st_ != kError; } protected: void SkipOut(int depth); }; bool LookaheadParser::EnterObject() { if (st_ != kEnteringObject) { st_ = kError; return false; } ParseNext(); return true; } bool LookaheadParser::EnterArray() { if (st_ != kEnteringArray) { st_ = kError; return false; } ParseNext(); return true; } const char* LookaheadParser::NextObjectKey() { if (st_ == kHasKey) { const char* result = v_.GetString(); ParseNext(); return result; } if (st_ != kExitingObject) { st_ = kError; return 0; } ParseNext(); return 0; } bool LookaheadParser::NextArrayValue() { if (st_ == kExitingArray) { ParseNext(); return false; } if (st_ == kError || st_ == kExitingObject || st_ == kHasKey) { st_ = kError; return false; } return true; } int LookaheadParser::GetInt() { if (st_ != kHasNumber || !v_.IsInt()) { st_ = kError; return 0; } int result = v_.GetInt(); ParseNext(); return result; } double LookaheadParser::GetDouble() { if (st_ != kHasNumber) { st_ = kError; return 0.; } double result = v_.GetDouble(); ParseNext(); return result; } bool LookaheadParser::GetBool() { if (st_ != kHasBool) { st_ = kError; return false; } bool result = v_.GetBool(); ParseNext(); return result; } void LookaheadParser::GetNull() { if (st_ != kHasNull) { st_ = kError; return; } ParseNext(); } const char* LookaheadParser::GetString() { if (st_ != kHasString) { st_ = kError; return 0; } const char* result = v_.GetString(); ParseNext(); return result; } void LookaheadParser::SkipOut(int depth) { do { if (st_ == kEnteringArray || st_ == kEnteringObject) { ++depth; } else if (st_ == kExitingArray || st_ == kExitingObject) { --depth; } else if (st_ == kError) { return; } ParseNext(); } while (depth > 0); } void LookaheadParser::SkipValue() { SkipOut(0); } void LookaheadParser::SkipArray() { SkipOut(1); } void LookaheadParser::SkipObject() { SkipOut(1); } Value* LookaheadParser::PeekValue() { if (st_ >= kHasNull && st_ <= kHasKey) { return &v_; } return 0; } int LookaheadParser::PeekType() { if (st_ >= kHasNull && st_ <= kHasKey) { return v_.GetType(); } if (st_ == kEnteringArray) { return kArrayType; } if (st_ == kEnteringObject) { return kObjectType; } return -1; } //------------------------------------------------------------------------- int main() { using namespace std; char json[] = " { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null," "\"i\":123, \"pi\": 3.1416, \"a\":[-1, 2, 3, 4, \"array\", []], \"skipArrays\":[1, 2, [[[3]]]], " "\"skipObject\":{ \"i\":0, \"t\":true, \"n\":null, \"d\":123.45 }, " "\"skipNested\":[[[[{\"\":0}, {\"\":[-9.87]}]]], [], []], " "\"skipString\":\"zzz\", \"reachedEnd\":null, \"t\":true }"; LookaheadParser r(json); RAPIDJSON_ASSERT(r.PeekType() == kObjectType); r.EnterObject(); while (const char* key = r.NextObjectKey()) { if (0 == strcmp(key, "hello")) { RAPIDJSON_ASSERT(r.PeekType() == kStringType); cout << key << ":" << r.GetString() << endl; } else if (0 == strcmp(key, "t") || 0 == strcmp(key, "f")) { RAPIDJSON_ASSERT(r.PeekType() == kTrueType || r.PeekType() == kFalseType); cout << key << ":" << r.GetBool() << endl; continue; } else if (0 == strcmp(key, "n")) { RAPIDJSON_ASSERT(r.PeekType() == kNullType); r.GetNull(); cout << key << endl; continue; } else if (0 == strcmp(key, "pi")) { RAPIDJSON_ASSERT(r.PeekType() == kNumberType); cout << key << ":" << r.GetDouble() << endl; continue; } else if (0 == strcmp(key, "a")) { RAPIDJSON_ASSERT(r.PeekType() == kArrayType); r.EnterArray(); cout << key << ":[ "; while (r.NextArrayValue()) { if (r.PeekType() == kNumberType) { cout << r.GetDouble() << " "; } else if (r.PeekType() == kStringType) { cout << r.GetString() << " "; } else { r.SkipArray(); break; } } cout << "]" << endl; } else { cout << key << ":skipped" << endl; r.SkipValue(); } } return 0; } RAPIDJSON_DIAG_POP asymptote-3.05/LspCpp/third_party/rapidjson/example/simpledom/0000755000000000000000000000000015031566105023335 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/simpledom/simpledom.cpp0000644000000000000000000000125515031566105026035 0ustar rootroot// JSON simple example // This example does not handle errors. #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" #include using namespace rapidjson; int main() { // 1. Parse a JSON string into DOM. const char* json = "{\"project\":\"rapidjson\",\"stars\":10}"; Document d; d.Parse(json); // 2. Modify it by DOM. Value& s = d["stars"]; s.SetInt(s.GetInt() + 1); // 3. Stringify the DOM StringBuffer buffer; Writer writer(buffer); d.Accept(writer); // Output {"project":"rapidjson","stars":11} std::cout << buffer.GetString() << std::endl; return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/example/pretty/0000755000000000000000000000000015031566105022673 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/pretty/pretty.cpp0000644000000000000000000000177315031566105024736 0ustar rootroot// JSON pretty formatting example // This example can only handle UTF-8. For handling other encodings, see prettyauto example. #include "rapidjson/reader.h" #include "rapidjson/prettywriter.h" #include "rapidjson/filereadstream.h" #include "rapidjson/filewritestream.h" #include "rapidjson/error/en.h" using namespace rapidjson; int main(int, char*[]) { // Prepare reader and input stream. Reader reader; char readBuffer[65536]; FileReadStream is(stdin, readBuffer, sizeof(readBuffer)); // Prepare writer and output stream. char writeBuffer[65536]; FileWriteStream os(stdout, writeBuffer, sizeof(writeBuffer)); PrettyWriter writer(os); // JSON reader parse from the input stream and let writer generate the output. if (!reader.Parse(is, writer)) { fprintf(stderr, "\nError(%u): %s\n", static_cast(reader.GetErrorOffset()), GetParseError_En(reader.GetParseErrorCode())); return 1; } return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/example/CMakeLists.txt0000644000000000000000000000172615031566105024112 0ustar rootrootcmake_minimum_required(VERSION 2.8) if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif() set(EXAMPLES capitalize condense filterkey filterkeydom jsonx lookaheadparser messagereader parsebyparts pretty prettyauto schemavalidator serialize simpledom simplereader simplepullreader simplewriter sortkeys tutorial) include_directories("../include/") add_definitions(-D__STDC_FORMAT_MACROS) set_property(DIRECTORY PROPERTY COMPILE_OPTIONS ${EXTRA_CXX_FLAGS}) if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") endif() add_executable(archivertest archiver/archiver.cpp archiver/archivertest.cpp) foreach (example ${EXAMPLES}) add_executable(${example} ${example}/${example}.cpp) endforeach() if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") target_link_libraries(parsebyparts pthread) endif() add_custom_target(examples ALL DEPENDS ${EXAMPLES}) asymptote-3.05/LspCpp/third_party/rapidjson/example/capitalize/0000755000000000000000000000000015031566105023471 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/capitalize/capitalize.cpp0000644000000000000000000000502015031566105026317 0ustar rootroot// JSON condenser example // This example parses JSON from stdin with validation, // and re-output the JSON content to stdout with all string capitalized, and without whitespace. #include "rapidjson/reader.h" #include "rapidjson/writer.h" #include "rapidjson/filereadstream.h" #include "rapidjson/filewritestream.h" #include "rapidjson/error/en.h" #include #include using namespace rapidjson; template struct CapitalizeFilter { CapitalizeFilter(OutputHandler& out) : out_(out), buffer_() {} bool Null() { return out_.Null(); } bool Bool(bool b) { return out_.Bool(b); } bool Int(int i) { return out_.Int(i); } bool Uint(unsigned u) { return out_.Uint(u); } bool Int64(int64_t i) { return out_.Int64(i); } bool Uint64(uint64_t u) { return out_.Uint64(u); } bool Double(double d) { return out_.Double(d); } bool RawNumber(const char* str, SizeType length, bool copy) { return out_.RawNumber(str, length, copy); } bool String(const char* str, SizeType length, bool) { buffer_.clear(); for (SizeType i = 0; i < length; i++) buffer_.push_back(static_cast(std::toupper(str[i]))); return out_.String(&buffer_.front(), length, true); // true = output handler need to copy the string } bool StartObject() { return out_.StartObject(); } bool Key(const char* str, SizeType length, bool copy) { return String(str, length, copy); } bool EndObject(SizeType memberCount) { return out_.EndObject(memberCount); } bool StartArray() { return out_.StartArray(); } bool EndArray(SizeType elementCount) { return out_.EndArray(elementCount); } OutputHandler& out_; std::vector buffer_; private: CapitalizeFilter(const CapitalizeFilter&); CapitalizeFilter& operator=(const CapitalizeFilter&); }; int main(int, char*[]) { // Prepare JSON reader and input stream. Reader reader; char readBuffer[65536]; FileReadStream is(stdin, readBuffer, sizeof(readBuffer)); // Prepare JSON writer and output stream. char writeBuffer[65536]; FileWriteStream os(stdout, writeBuffer, sizeof(writeBuffer)); Writer writer(os); // JSON reader parse from the input stream and let writer generate the output. CapitalizeFilter > filter(writer); if (!reader.Parse(is, filter)) { fprintf(stderr, "\nError(%u): %s\n", static_cast(reader.GetErrorOffset()), GetParseError_En(reader.GetParseErrorCode())); return 1; } return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/example/messagereader/0000755000000000000000000000000015031566105024153 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/messagereader/messagereader.cpp0000644000000000000000000000537615031566105027501 0ustar rootroot// Reading a message JSON with Reader (SAX-style API). // The JSON should be an object with key-string pairs. #include "rapidjson/reader.h" #include "rapidjson/error/en.h" #include #include #include using namespace std; using namespace rapidjson; typedef map MessageMap; #if defined(__GNUC__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) #endif #ifdef __clang__ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(switch-enum) #endif struct MessageHandler : public BaseReaderHandler, MessageHandler> { MessageHandler() : messages_(), state_(kExpectObjectStart), name_() {} bool StartObject() { switch (state_) { case kExpectObjectStart: state_ = kExpectNameOrObjectEnd; return true; default: return false; } } bool String(const char* str, SizeType length, bool) { switch (state_) { case kExpectNameOrObjectEnd: name_ = string(str, length); state_ = kExpectValue; return true; case kExpectValue: messages_.insert(MessageMap::value_type(name_, string(str, length))); state_ = kExpectNameOrObjectEnd; return true; default: return false; } } bool EndObject(SizeType) { return state_ == kExpectNameOrObjectEnd; } bool Default() { return false; } // All other events are invalid. MessageMap messages_; enum State { kExpectObjectStart, kExpectNameOrObjectEnd, kExpectValue }state_; std::string name_; }; #if defined(__GNUC__) RAPIDJSON_DIAG_POP #endif #ifdef __clang__ RAPIDJSON_DIAG_POP #endif static void ParseMessages(const char* json, MessageMap& messages) { Reader reader; MessageHandler handler; StringStream ss(json); if (reader.Parse(ss, handler)) messages.swap(handler.messages_); // Only change it if success. else { ParseErrorCode e = reader.GetParseErrorCode(); size_t o = reader.GetErrorOffset(); cout << "Error: " << GetParseError_En(e) << endl;; cout << " at offset " << o << " near '" << string(json).substr(o, 10) << "...'" << endl; } } int main() { MessageMap messages; const char* json1 = "{ \"greeting\" : \"Hello!\", \"farewell\" : \"bye-bye!\" }"; cout << json1 << endl; ParseMessages(json1, messages); for (MessageMap::const_iterator itr = messages.begin(); itr != messages.end(); ++itr) cout << itr->first << ": " << itr->second << endl; cout << endl << "Parse a JSON with invalid schema." << endl; const char* json2 = "{ \"greeting\" : \"Hello!\", \"farewell\" : \"bye-bye!\", \"foo\" : {} }"; cout << json2 << endl; ParseMessages(json2, messages); return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/example/sortkeys/0000755000000000000000000000000015031566105023227 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/sortkeys/sortkeys.cpp0000644000000000000000000000311215031566105025613 0ustar rootroot#include "rapidjson/document.h" #include "rapidjson/filewritestream.h" #include #include #include using namespace rapidjson; using namespace std; static void printIt(const Value &doc) { char writeBuffer[65536]; FileWriteStream os(stdout, writeBuffer, sizeof(writeBuffer)); PrettyWriter writer(os); doc.Accept(writer); cout << endl; } struct NameComparator { bool operator()(const Value::Member &lhs, const Value::Member &rhs) const { return (strcmp(lhs.name.GetString(), rhs.name.GetString()) < 0); } }; int main() { Document d(kObjectType); Document::AllocatorType &allocator = d.GetAllocator(); d.AddMember("zeta", Value().SetBool(false), allocator); d.AddMember("gama", Value().SetString("test string", allocator), allocator); d.AddMember("delta", Value().SetInt(123), allocator); d.AddMember("alpha", Value(kArrayType).Move(), allocator); printIt(d); /* { "zeta": false, "gama": "test string", "delta": 123, "alpha": [] } */ // C++11 supports std::move() of Value so it always have no problem for std::sort(). // Some C++03 implementations of std::sort() requires copy constructor which causes compilation error. // Needs a sorting function only depends on std::swap() instead. #if __cplusplus >= 201103L || (!defined(__GLIBCXX__) && (!defined(_MSC_VER) || _MSC_VER >= 1900)) std::sort(d.MemberBegin(), d.MemberEnd(), NameComparator()); printIt(d); /* { "alpha": [], "delta": 123, "gama": "test string", "zeta": false } */ #endif } asymptote-3.05/LspCpp/third_party/rapidjson/example/tutorial/0000755000000000000000000000000015031566105023207 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/tutorial/tutorial.cpp0000644000000000000000000001415515031566105025564 0ustar rootroot// Hello World example // This example shows basic usage of DOM-style API. #include "rapidjson/document.h" // rapidjson's DOM-style API #include "rapidjson/prettywriter.h" // for stringify JSON #include using namespace rapidjson; using namespace std; int main(int, char*[]) { //////////////////////////////////////////////////////////////////////////// // 1. Parse a JSON text string to a document. const char json[] = " { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } "; printf("Original JSON:\n %s\n", json); Document document; // Default template parameter uses UTF8 and MemoryPoolAllocator. #if 0 // "normal" parsing, decode strings to new buffers. Can use other input stream via ParseStream(). if (document.Parse(json).HasParseError()) return 1; #else // In-situ parsing, decode strings directly in the source string. Source must be string. char buffer[sizeof(json)]; memcpy(buffer, json, sizeof(json)); if (document.ParseInsitu(buffer).HasParseError()) return 1; #endif printf("\nParsing to document succeeded.\n"); //////////////////////////////////////////////////////////////////////////// // 2. Access values in document. printf("\nAccess values in document:\n"); assert(document.IsObject()); // Document is a JSON value represents the root of DOM. Root can be either an object or array. assert(document.HasMember("hello")); assert(document["hello"].IsString()); printf("hello = %s\n", document["hello"].GetString()); // Since version 0.2, you can use single lookup to check the existing of member and its value: Value::MemberIterator hello = document.FindMember("hello"); assert(hello != document.MemberEnd()); assert(hello->value.IsString()); assert(strcmp("world", hello->value.GetString()) == 0); (void)hello; assert(document["t"].IsBool()); // JSON true/false are bool. Can also uses more specific function IsTrue(). printf("t = %s\n", document["t"].GetBool() ? "true" : "false"); assert(document["f"].IsBool()); printf("f = %s\n", document["f"].GetBool() ? "true" : "false"); printf("n = %s\n", document["n"].IsNull() ? "null" : "?"); assert(document["i"].IsNumber()); // Number is a JSON type, but C++ needs more specific type. assert(document["i"].IsInt()); // In this case, IsUint()/IsInt64()/IsUint64() also return true. printf("i = %d\n", document["i"].GetInt()); // Alternative (int)document["i"] assert(document["pi"].IsNumber()); assert(document["pi"].IsDouble()); printf("pi = %g\n", document["pi"].GetDouble()); { const Value& a = document["a"]; // Using a reference for consecutive access is handy and faster. assert(a.IsArray()); for (SizeType i = 0; i < a.Size(); i++) // rapidjson uses SizeType instead of size_t. printf("a[%d] = %d\n", i, a[i].GetInt()); int y = a[0].GetInt(); (void)y; // Iterating array with iterators printf("a = "); for (Value::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) printf("%d ", itr->GetInt()); printf("\n"); } // Iterating object members static const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" }; for (Value::ConstMemberIterator itr = document.MemberBegin(); itr != document.MemberEnd(); ++itr) printf("Type of member %s is %s\n", itr->name.GetString(), kTypeNames[itr->value.GetType()]); //////////////////////////////////////////////////////////////////////////// // 3. Modify values in document. // Change i to a bigger number { uint64_t f20 = 1; // compute factorial of 20 for (uint64_t j = 1; j <= 20; j++) f20 *= j; document["i"] = f20; // Alternate form: document["i"].SetUint64(f20) assert(!document["i"].IsInt()); // No longer can be cast as int or uint. } // Adding values to array. { Value& a = document["a"]; // This time we uses non-const reference. Document::AllocatorType& allocator = document.GetAllocator(); for (int i = 5; i <= 10; i++) a.PushBack(i, allocator); // May look a bit strange, allocator is needed for potentially realloc. We normally uses the document's. // Fluent API a.PushBack("Lua", allocator).PushBack("Mio", allocator); } // Making string values. // This version of SetString() just store the pointer to the string. // So it is for literal and string that exists within value's life-cycle. { document["hello"] = "rapidjson"; // This will invoke strlen() // Faster version: // document["hello"].SetString("rapidjson", 9); } // This version of SetString() needs an allocator, which means it will allocate a new buffer and copy the the string into the buffer. Value author; { char buffer2[10]; int len = sprintf(buffer2, "%s %s", "Milo", "Yip"); // synthetic example of dynamically created string. author.SetString(buffer2, static_cast(len), document.GetAllocator()); // Shorter but slower version: // document["hello"].SetString(buffer, document.GetAllocator()); // Constructor version: // Value author(buffer, len, document.GetAllocator()); // Value author(buffer, document.GetAllocator()); memset(buffer2, 0, sizeof(buffer2)); // For demonstration purpose. } // Variable 'buffer' is unusable now but 'author' has already made a copy. document.AddMember("author", author, document.GetAllocator()); assert(author.IsNull()); // Move semantic for assignment. After this variable is assigned as a member, the variable becomes null. //////////////////////////////////////////////////////////////////////////// // 4. Stringify JSON printf("\nModified JSON with reformatting:\n"); StringBuffer sb; PrettyWriter writer(sb); document.Accept(writer); // Accept() traverses the DOM and generates Handler events. puts(sb.GetString()); return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/example/simplewriter/0000755000000000000000000000000015031566105024072 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/simplewriter/simplewriter.cpp0000644000000000000000000000200215031566105027316 0ustar rootroot#include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" #include using namespace rapidjson; using namespace std; int main() { StringBuffer s; Writer writer(s); writer.StartObject(); // Between StartObject()/EndObject(), writer.Key("hello"); // output a key, writer.String("world"); // follow by a value. writer.Key("t"); writer.Bool(true); writer.Key("f"); writer.Bool(false); writer.Key("n"); writer.Null(); writer.Key("i"); writer.Uint(123); writer.Key("pi"); writer.Double(3.1416); writer.Key("a"); writer.StartArray(); // Between StartArray()/EndArray(), for (unsigned i = 0; i < 4; i++) writer.Uint(i); // all values are elements of the array. writer.EndArray(); writer.EndObject(); // {"hello":"world","t":true,"f":false,"n":null,"i":123,"pi":3.1416,"a":[0,1,2,3]} cout << s.GetString() << endl; return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/example/simplereader/0000755000000000000000000000000015031566105024020 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/simplereader/simplereader.cpp0000644000000000000000000000351215031566105027201 0ustar rootroot#include "rapidjson/reader.h" #include using namespace rapidjson; using namespace std; struct MyHandler { bool Null() { cout << "Null()" << endl; return true; } bool Bool(bool b) { cout << "Bool(" << boolalpha << b << ")" << endl; return true; } bool Int(int i) { cout << "Int(" << i << ")" << endl; return true; } bool Uint(unsigned u) { cout << "Uint(" << u << ")" << endl; return true; } bool Int64(int64_t i) { cout << "Int64(" << i << ")" << endl; return true; } bool Uint64(uint64_t u) { cout << "Uint64(" << u << ")" << endl; return true; } bool Double(double d) { cout << "Double(" << d << ")" << endl; return true; } bool RawNumber(const char* str, SizeType length, bool copy) { cout << "Number(" << str << ", " << length << ", " << boolalpha << copy << ")" << endl; return true; } bool String(const char* str, SizeType length, bool copy) { cout << "String(" << str << ", " << length << ", " << boolalpha << copy << ")" << endl; return true; } bool StartObject() { cout << "StartObject()" << endl; return true; } bool Key(const char* str, SizeType length, bool copy) { cout << "Key(" << str << ", " << length << ", " << boolalpha << copy << ")" << endl; return true; } bool EndObject(SizeType memberCount) { cout << "EndObject(" << memberCount << ")" << endl; return true; } bool StartArray() { cout << "StartArray()" << endl; return true; } bool EndArray(SizeType elementCount) { cout << "EndArray(" << elementCount << ")" << endl; return true; } }; int main() { const char json[] = " { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } "; MyHandler handler; Reader reader; StringStream ss(json); reader.Parse(ss, handler); return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/example/simplepullreader/0000755000000000000000000000000015031566105024715 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/simplepullreader/simplepullreader.cpp0000644000000000000000000000431715031566105030777 0ustar rootroot#include "rapidjson/reader.h" #include #include using namespace rapidjson; using namespace std; // If you can require C++11, you could use std::to_string here template std::string stringify(T x) { std::stringstream ss; ss << x; return ss.str(); } struct MyHandler { const char* type; std::string data; MyHandler() : type(), data() {} bool Null() { type = "Null"; data.clear(); return true; } bool Bool(bool b) { type = "Bool:"; data = b? "true": "false"; return true; } bool Int(int i) { type = "Int:"; data = stringify(i); return true; } bool Uint(unsigned u) { type = "Uint:"; data = stringify(u); return true; } bool Int64(int64_t i) { type = "Int64:"; data = stringify(i); return true; } bool Uint64(uint64_t u) { type = "Uint64:"; data = stringify(u); return true; } bool Double(double d) { type = "Double:"; data = stringify(d); return true; } bool RawNumber(const char* str, SizeType length, bool) { type = "Number:"; data = std::string(str, length); return true; } bool String(const char* str, SizeType length, bool) { type = "String:"; data = std::string(str, length); return true; } bool StartObject() { type = "StartObject"; data.clear(); return true; } bool Key(const char* str, SizeType length, bool) { type = "Key:"; data = std::string(str, length); return true; } bool EndObject(SizeType memberCount) { type = "EndObject:"; data = stringify(memberCount); return true; } bool StartArray() { type = "StartArray"; data.clear(); return true; } bool EndArray(SizeType elementCount) { type = "EndArray:"; data = stringify(elementCount); return true; } private: MyHandler(const MyHandler& noCopyConstruction); MyHandler& operator=(const MyHandler& noAssignment); }; int main() { const char json[] = " { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } "; MyHandler handler; Reader reader; StringStream ss(json); reader.IterativeParseInit(); while (!reader.IterativeParseComplete()) { reader.IterativeParseNext(ss, handler); cout << handler.type << handler.data << endl; } return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/example/archiver/0000755000000000000000000000000015031566105023147 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/archiver/archiver.h0000644000000000000000000000675315031566105025136 0ustar rootroot#ifndef ARCHIVER_H_ #define ARCHIVER_H_ #include #include /** \class Archiver \brief Archiver concept Archiver can be a reader or writer for serialization or deserialization respectively. class Archiver { public: /// \returns true if the archiver is in normal state. false if it has errors. operator bool() const; /// Starts an object Archiver& StartObject(); /// After calling StartObject(), assign a member with a name Archiver& Member(const char* name); /// After calling StartObject(), check if a member presents bool HasMember(const char* name) const; /// Ends an object Archiver& EndObject(); /// Starts an array /// \param size If Archiver::IsReader is true, the size of array is written. Archiver& StartArray(size_t* size = 0); /// Ends an array Archiver& EndArray(); /// Read/Write primitive types. Archiver& operator&(bool& b); Archiver& operator&(unsigned& u); Archiver& operator&(int& i); Archiver& operator&(double& d); Archiver& operator&(std::string& s); /// Write primitive types. Archiver& SetNull(); //! Whether it is a reader. static const bool IsReader; //! Whether it is a writer. static const bool IsWriter; }; */ /// Represents a JSON reader which implements Archiver concept. class JsonReader { public: /// Constructor. /** \param json A non-const source json string for in-situ parsing. \note in-situ means the source JSON string will be modified after parsing. */ JsonReader(const char* json); /// Destructor. ~JsonReader(); // Archive concept operator bool() const { return !mError; } JsonReader& StartObject(); JsonReader& Member(const char* name); bool HasMember(const char* name) const; JsonReader& EndObject(); JsonReader& StartArray(size_t* size = 0); JsonReader& EndArray(); JsonReader& operator&(bool& b); JsonReader& operator&(unsigned& u); JsonReader& operator&(int& i); JsonReader& operator&(double& d); JsonReader& operator&(std::string& s); JsonReader& SetNull(); static const bool IsReader = true; static const bool IsWriter = !IsReader; private: JsonReader(const JsonReader&); JsonReader& operator=(const JsonReader&); void Next(); // PIMPL void* mDocument; ///< DOM result of parsing. void* mStack; ///< Stack for iterating the DOM bool mError; ///< Whether an error has occurred. }; class JsonWriter { public: /// Constructor. JsonWriter(); /// Destructor. ~JsonWriter(); /// Obtains the serialized JSON string. const char* GetString() const; // Archive concept operator bool() const { return true; } JsonWriter& StartObject(); JsonWriter& Member(const char* name); bool HasMember(const char* name) const; JsonWriter& EndObject(); JsonWriter& StartArray(size_t* size = 0); JsonWriter& EndArray(); JsonWriter& operator&(bool& b); JsonWriter& operator&(unsigned& u); JsonWriter& operator&(int& i); JsonWriter& operator&(double& d); JsonWriter& operator&(std::string& s); JsonWriter& SetNull(); static const bool IsReader = false; static const bool IsWriter = !IsReader; private: JsonWriter(const JsonWriter&); JsonWriter& operator=(const JsonWriter&); // PIMPL idiom void* mWriter; ///< JSON writer. void* mStream; ///< Stream buffer. }; #endif // ARCHIVER_H__ asymptote-3.05/LspCpp/third_party/rapidjson/example/archiver/archiver.cpp0000644000000000000000000001572515031566105025470 0ustar rootroot#include "archiver.h" #include #include #include "rapidjson/document.h" #include "rapidjson/prettywriter.h" #include "rapidjson/stringbuffer.h" using namespace rapidjson; struct JsonReaderStackItem { enum State { BeforeStart, //!< An object/array is in the stack but it is not yet called by StartObject()/StartArray(). Started, //!< An object/array is called by StartObject()/StartArray(). Closed //!< An array is closed after read all element, but before EndArray(). }; JsonReaderStackItem(const Value* value, State state) : value(value), state(state), index() {} const Value* value; State state; SizeType index; // For array iteration }; typedef std::stack JsonReaderStack; #define DOCUMENT reinterpret_cast(mDocument) #define STACK (reinterpret_cast(mStack)) #define TOP (STACK->top()) #define CURRENT (*TOP.value) JsonReader::JsonReader(const char* json) : mDocument(), mStack(), mError(false) { mDocument = new Document; DOCUMENT->Parse(json); if (DOCUMENT->HasParseError()) mError = true; else { mStack = new JsonReaderStack; STACK->push(JsonReaderStackItem(DOCUMENT, JsonReaderStackItem::BeforeStart)); } } JsonReader::~JsonReader() { delete DOCUMENT; delete STACK; } // Archive concept JsonReader& JsonReader::StartObject() { if (!mError) { if (CURRENT.IsObject() && TOP.state == JsonReaderStackItem::BeforeStart) TOP.state = JsonReaderStackItem::Started; else mError = true; } return *this; } JsonReader& JsonReader::EndObject() { if (!mError) { if (CURRENT.IsObject() && TOP.state == JsonReaderStackItem::Started) Next(); else mError = true; } return *this; } JsonReader& JsonReader::Member(const char* name) { if (!mError) { if (CURRENT.IsObject() && TOP.state == JsonReaderStackItem::Started) { Value::ConstMemberIterator memberItr = CURRENT.FindMember(name); if (memberItr != CURRENT.MemberEnd()) STACK->push(JsonReaderStackItem(&memberItr->value, JsonReaderStackItem::BeforeStart)); else mError = true; } else mError = true; } return *this; } bool JsonReader::HasMember(const char* name) const { if (!mError && CURRENT.IsObject() && TOP.state == JsonReaderStackItem::Started) return CURRENT.HasMember(name); return false; } JsonReader& JsonReader::StartArray(size_t* size) { if (!mError) { if (CURRENT.IsArray() && TOP.state == JsonReaderStackItem::BeforeStart) { TOP.state = JsonReaderStackItem::Started; if (size) *size = CURRENT.Size(); if (!CURRENT.Empty()) { const Value* value = &CURRENT[TOP.index]; STACK->push(JsonReaderStackItem(value, JsonReaderStackItem::BeforeStart)); } else TOP.state = JsonReaderStackItem::Closed; } else mError = true; } return *this; } JsonReader& JsonReader::EndArray() { if (!mError) { if (CURRENT.IsArray() && TOP.state == JsonReaderStackItem::Closed) Next(); else mError = true; } return *this; } JsonReader& JsonReader::operator&(bool& b) { if (!mError) { if (CURRENT.IsBool()) { b = CURRENT.GetBool(); Next(); } else mError = true; } return *this; } JsonReader& JsonReader::operator&(unsigned& u) { if (!mError) { if (CURRENT.IsUint()) { u = CURRENT.GetUint(); Next(); } else mError = true; } return *this; } JsonReader& JsonReader::operator&(int& i) { if (!mError) { if (CURRENT.IsInt()) { i = CURRENT.GetInt(); Next(); } else mError = true; } return *this; } JsonReader& JsonReader::operator&(double& d) { if (!mError) { if (CURRENT.IsNumber()) { d = CURRENT.GetDouble(); Next(); } else mError = true; } return *this; } JsonReader& JsonReader::operator&(std::string& s) { if (!mError) { if (CURRENT.IsString()) { s = CURRENT.GetString(); Next(); } else mError = true; } return *this; } JsonReader& JsonReader::SetNull() { // This function is for JsonWriter only. mError = true; return *this; } void JsonReader::Next() { if (!mError) { assert(!STACK->empty()); STACK->pop(); if (!STACK->empty() && CURRENT.IsArray()) { if (TOP.state == JsonReaderStackItem::Started) { // Otherwise means reading array item pass end if (TOP.index < CURRENT.Size() - 1) { const Value* value = &CURRENT[++TOP.index]; STACK->push(JsonReaderStackItem(value, JsonReaderStackItem::BeforeStart)); } else TOP.state = JsonReaderStackItem::Closed; } else mError = true; } } } #undef DOCUMENT #undef STACK #undef TOP #undef CURRENT //////////////////////////////////////////////////////////////////////////////// // JsonWriter #define WRITER reinterpret_cast*>(mWriter) #define STREAM reinterpret_cast(mStream) JsonWriter::JsonWriter() : mWriter(), mStream() { mStream = new StringBuffer; mWriter = new PrettyWriter(*STREAM); } JsonWriter::~JsonWriter() { delete WRITER; delete STREAM; } const char* JsonWriter::GetString() const { return STREAM->GetString(); } JsonWriter& JsonWriter::StartObject() { WRITER->StartObject(); return *this; } JsonWriter& JsonWriter::EndObject() { WRITER->EndObject(); return *this; } JsonWriter& JsonWriter::Member(const char* name) { WRITER->String(name, static_cast(strlen(name))); return *this; } bool JsonWriter::HasMember(const char*) const { // This function is for JsonReader only. assert(false); return false; } JsonWriter& JsonWriter::StartArray(size_t*) { WRITER->StartArray(); return *this; } JsonWriter& JsonWriter::EndArray() { WRITER->EndArray(); return *this; } JsonWriter& JsonWriter::operator&(bool& b) { WRITER->Bool(b); return *this; } JsonWriter& JsonWriter::operator&(unsigned& u) { WRITER->Uint(u); return *this; } JsonWriter& JsonWriter::operator&(int& i) { WRITER->Int(i); return *this; } JsonWriter& JsonWriter::operator&(double& d) { WRITER->Double(d); return *this; } JsonWriter& JsonWriter::operator&(std::string& s) { WRITER->String(s.c_str(), static_cast(s.size())); return *this; } JsonWriter& JsonWriter::SetNull() { WRITER->Null(); return *this; } #undef STREAM #undef WRITER asymptote-3.05/LspCpp/third_party/rapidjson/example/archiver/archivertest.cpp0000644000000000000000000001530115031566105026356 0ustar rootroot#include "archiver.h" #include #include ////////////////////////////////////////////////////////////////////////////// // Test1: simple object struct Student { Student() : name(), age(), height(), canSwim() {} Student(const std::string name, unsigned age, double height, bool canSwim) : name(name), age(age), height(height), canSwim(canSwim) {} std::string name; unsigned age; double height; bool canSwim; }; template Archiver& operator&(Archiver& ar, Student& s) { ar.StartObject(); ar.Member("name") & s.name; ar.Member("age") & s.age; ar.Member("height") & s.height; ar.Member("canSwim") & s.canSwim; return ar.EndObject(); } std::ostream& operator<<(std::ostream& os, const Student& s) { return os << s.name << " " << s.age << " " << s.height << " " << s.canSwim; } void test1() { std::string json; // Serialize { Student s("Lua", 9, 150.5, true); JsonWriter writer; writer & s; json = writer.GetString(); std::cout << json << std::endl; } // Deserialize { Student s; JsonReader reader(json.c_str()); reader & s; std::cout << s << std::endl; } } ////////////////////////////////////////////////////////////////////////////// // Test2: std::vector <=> JSON array // // You can map a JSON array to other data structures as well struct Group { Group() : groupName(), students() {} std::string groupName; std::vector students; }; template Archiver& operator&(Archiver& ar, Group& g) { ar.StartObject(); ar.Member("groupName"); ar & g.groupName; ar.Member("students"); size_t studentCount = g.students.size(); ar.StartArray(&studentCount); if (ar.IsReader) g.students.resize(studentCount); for (size_t i = 0; i < studentCount; i++) ar & g.students[i]; ar.EndArray(); return ar.EndObject(); } std::ostream& operator<<(std::ostream& os, const Group& g) { os << g.groupName << std::endl; for (std::vector::const_iterator itr = g.students.begin(); itr != g.students.end(); ++itr) os << *itr << std::endl; return os; } void test2() { std::string json; // Serialize { Group g; g.groupName = "Rainbow"; Student s1("Lua", 9, 150.5, true); Student s2("Mio", 7, 120.0, false); g.students.push_back(s1); g.students.push_back(s2); JsonWriter writer; writer & g; json = writer.GetString(); std::cout << json << std::endl; } // Deserialize { Group g; JsonReader reader(json.c_str()); reader & g; std::cout << g << std::endl; } } ////////////////////////////////////////////////////////////////////////////// // Test3: polymorphism & friend // // Note that friendship is not necessary but make things simpler. class Shape { public: virtual ~Shape() {} virtual const char* GetType() const = 0; virtual void Print(std::ostream& os) const = 0; protected: Shape() : x_(), y_() {} Shape(double x, double y) : x_(x), y_(y) {} template friend Archiver& operator&(Archiver& ar, Shape& s); double x_, y_; }; template Archiver& operator&(Archiver& ar, Shape& s) { ar.Member("x") & s.x_; ar.Member("y") & s.y_; return ar; } class Circle : public Shape { public: Circle() : radius_() {} Circle(double x, double y, double radius) : Shape(x, y), radius_(radius) {} ~Circle() {} const char* GetType() const { return "Circle"; } void Print(std::ostream& os) const { os << "Circle (" << x_ << ", " << y_ << ")" << " radius = " << radius_; } private: template friend Archiver& operator&(Archiver& ar, Circle& c); double radius_; }; template Archiver& operator&(Archiver& ar, Circle& c) { ar & static_cast(c); ar.Member("radius") & c.radius_; return ar; } class Box : public Shape { public: Box() : width_(), height_() {} Box(double x, double y, double width, double height) : Shape(x, y), width_(width), height_(height) {} ~Box() {} const char* GetType() const { return "Box"; } void Print(std::ostream& os) const { os << "Box (" << x_ << ", " << y_ << ")" << " width = " << width_ << " height = " << height_; } private: template friend Archiver& operator&(Archiver& ar, Box& b); double width_, height_; }; template Archiver& operator&(Archiver& ar, Box& b) { ar & static_cast(b); ar.Member("width") & b.width_; ar.Member("height") & b.height_; return ar; } class Canvas { public: Canvas() : shapes_() {} ~Canvas() { Clear(); } void Clear() { for (std::vector::iterator itr = shapes_.begin(); itr != shapes_.end(); ++itr) delete *itr; } void AddShape(Shape* shape) { shapes_.push_back(shape); } void Print(std::ostream& os) { for (std::vector::iterator itr = shapes_.begin(); itr != shapes_.end(); ++itr) { (*itr)->Print(os); std::cout << std::endl; } } private: template friend Archiver& operator&(Archiver& ar, Canvas& c); std::vector shapes_; }; template Archiver& operator&(Archiver& ar, Shape*& shape) { std::string type = ar.IsReader ? "" : shape->GetType(); ar.StartObject(); ar.Member("type") & type; if (type == "Circle") { if (ar.IsReader) shape = new Circle; ar & static_cast(*shape); } else if (type == "Box") { if (ar.IsReader) shape = new Box; ar & static_cast(*shape); } return ar.EndObject(); } template Archiver& operator&(Archiver& ar, Canvas& c) { size_t shapeCount = c.shapes_.size(); ar.StartArray(&shapeCount); if (ar.IsReader) { c.Clear(); c.shapes_.resize(shapeCount); } for (size_t i = 0; i < shapeCount; i++) ar & c.shapes_[i]; return ar.EndArray(); } void test3() { std::string json; // Serialize { Canvas c; c.AddShape(new Circle(1.0, 2.0, 3.0)); c.AddShape(new Box(4.0, 5.0, 6.0, 7.0)); JsonWriter writer; writer & c; json = writer.GetString(); std::cout << json << std::endl; } // Deserialize { Canvas c; JsonReader reader(json.c_str()); reader & c; c.Print(std::cout); } } ////////////////////////////////////////////////////////////////////////////// int main() { test1(); test2(); test3(); } asymptote-3.05/LspCpp/third_party/rapidjson/example/schemavalidator/0000755000000000000000000000000015031566105024512 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/schemavalidator/schemavalidator.cpp0000644000000000000000000002077615031566105030400 0ustar rootroot// Schema Validator example // The example validates JSON text from stdin with a JSON schema specified in the argument. #define RAPIDJSON_HAS_STDSTRING 1 #include "rapidjson/error/en.h" #include "rapidjson/filereadstream.h" #include "rapidjson/schema.h" #include "rapidjson/stringbuffer.h" #include "rapidjson/prettywriter.h" #include #include #include using namespace rapidjson; typedef GenericValue, CrtAllocator > ValueType; // Forward ref static void CreateErrorMessages(const ValueType& errors, size_t depth, const char* context); // Convert GenericValue to std::string static std::string GetString(const ValueType& val) { std::ostringstream s; if (val.IsString()) s << val.GetString(); else if (val.IsDouble()) s << val.GetDouble(); else if (val.IsUint()) s << val.GetUint(); else if (val.IsInt()) s << val.GetInt(); else if (val.IsUint64()) s << val.GetUint64(); else if (val.IsInt64()) s << val.GetInt64(); else if (val.IsBool() && val.GetBool()) s << "true"; else if (val.IsBool()) s << "false"; else if (val.IsFloat()) s << val.GetFloat(); return s.str(); } // Create the error message for a named error // The error object can either be empty or contain at least member properties: // {"errorCode": , "instanceRef": "", "schemaRef": "" } // Additional properties may be present for use as inserts. // An "errors" property may be present if there are child errors. static void HandleError(const char* errorName, const ValueType& error, size_t depth, const char* context) { if (!error.ObjectEmpty()) { // Get error code and look up error message text (English) int code = error["errorCode"].GetInt(); std::string message(GetValidateError_En(static_cast(code))); // For each member property in the error, see if its name exists as an insert in the error message and if so replace with the stringified property value // So for example - "Number '%actual' is not a multiple of the 'multipleOf' value '%expected'." - we would expect "actual" and "expected" members. for (ValueType::ConstMemberIterator insertsItr = error.MemberBegin(); insertsItr != error.MemberEnd(); ++insertsItr) { std::string insertName("%"); insertName += insertsItr->name.GetString(); // eg "%actual" size_t insertPos = message.find(insertName); if (insertPos != std::string::npos) { std::string insertString(""); const ValueType &insert = insertsItr->value; if (insert.IsArray()) { // Member is an array so create comma-separated list of items for the insert string for (ValueType::ConstValueIterator itemsItr = insert.Begin(); itemsItr != insert.End(); ++itemsItr) { if (itemsItr != insert.Begin()) insertString += ","; insertString += GetString(*itemsItr); } } else { insertString += GetString(insert); } message.replace(insertPos, insertName.length(), insertString); } } // Output error message, references, context std::string indent(depth * 2, ' '); std::cout << indent << "Error Name: " << errorName << std::endl; std::cout << indent << "Message: " << message.c_str() << std::endl; std::cout << indent << "Instance: " << error["instanceRef"].GetString() << std::endl; std::cout << indent << "Schema: " << error["schemaRef"].GetString() << std::endl; if (depth > 0) std::cout << indent << "Context: " << context << std::endl; std::cout << std::endl; // If child errors exist, apply the process recursively to each error structure. // This occurs for "oneOf", "allOf", "anyOf" and "dependencies" errors, so pass the error name as context. if (error.HasMember("errors")) { depth++; const ValueType &childErrors = error["errors"]; if (childErrors.IsArray()) { // Array - each item is an error structure - example // "anyOf": {"errorCode": ..., "errors":[{"pattern": {"errorCode\": ...\"}}, {"pattern": {"errorCode\": ...}}] for (ValueType::ConstValueIterator errorsItr = childErrors.Begin(); errorsItr != childErrors.End(); ++errorsItr) { CreateErrorMessages(*errorsItr, depth, errorName); } } else if (childErrors.IsObject()) { // Object - each member is an error structure - example // "dependencies": {"errorCode": ..., "errors": {"address": {"required": {"errorCode": ...}}, "name": {"required": {"errorCode": ...}}} for (ValueType::ConstMemberIterator propsItr = childErrors.MemberBegin(); propsItr != childErrors.MemberEnd(); ++propsItr) { CreateErrorMessages(propsItr->value, depth, errorName); } } } } } // Create error message for all errors in an error structure // Context is used to indicate whether the error structure has a parent 'dependencies', 'allOf', 'anyOf' or 'oneOf' error static void CreateErrorMessages(const ValueType& errors, size_t depth = 0, const char* context = 0) { // Each member property contains one or more errors of a given type for (ValueType::ConstMemberIterator errorTypeItr = errors.MemberBegin(); errorTypeItr != errors.MemberEnd(); ++errorTypeItr) { const char* errorName = errorTypeItr->name.GetString(); const ValueType& errorContent = errorTypeItr->value; if (errorContent.IsArray()) { // Member is an array where each item is an error - eg "type": [{"errorCode": ...}, {"errorCode": ...}] for (ValueType::ConstValueIterator contentItr = errorContent.Begin(); contentItr != errorContent.End(); ++contentItr) { HandleError(errorName, *contentItr, depth, context); } } else if (errorContent.IsObject()) { // Member is an object which is a single error - eg "type": {"errorCode": ... } HandleError(errorName, errorContent, depth, context); } } } int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "Usage: schemavalidator schema.json < input.json\n"); return EXIT_FAILURE; } // Read a JSON schema from file into Document Document d; char buffer[4096]; { FILE *fp = fopen(argv[1], "r"); if (!fp) { printf("Schema file '%s' not found\n", argv[1]); return -1; } FileReadStream fs(fp, buffer, sizeof(buffer)); d.ParseStream(fs); if (d.HasParseError()) { fprintf(stderr, "Schema file '%s' is not a valid JSON\n", argv[1]); fprintf(stderr, "Error(offset %u): %s\n", static_cast(d.GetErrorOffset()), GetParseError_En(d.GetParseError())); fclose(fp); return EXIT_FAILURE; } fclose(fp); } // Then convert the Document into SchemaDocument SchemaDocument sd(d); // Use reader to parse the JSON in stdin, and forward SAX events to validator SchemaValidator validator(sd); Reader reader; FileReadStream is(stdin, buffer, sizeof(buffer)); if (!reader.Parse(is, validator) && reader.GetParseErrorCode() != kParseErrorTermination) { // Schema validator error would cause kParseErrorTermination, which will handle it in next step. fprintf(stderr, "Input is not a valid JSON\n"); fprintf(stderr, "Error(offset %u): %s\n", static_cast(reader.GetErrorOffset()), GetParseError_En(reader.GetParseErrorCode())); } // Check the validation result if (validator.IsValid()) { printf("Input JSON is valid.\n"); return EXIT_SUCCESS; } else { printf("Input JSON is invalid.\n"); StringBuffer sb; validator.GetInvalidSchemaPointer().StringifyUriFragment(sb); fprintf(stderr, "Invalid schema: %s\n", sb.GetString()); fprintf(stderr, "Invalid keyword: %s\n", validator.GetInvalidSchemaKeyword()); fprintf(stderr, "Invalid code: %d\n", validator.GetInvalidSchemaCode()); fprintf(stderr, "Invalid message: %s\n", GetValidateError_En(validator.GetInvalidSchemaCode())); sb.Clear(); validator.GetInvalidDocumentPointer().StringifyUriFragment(sb); fprintf(stderr, "Invalid document: %s\n", sb.GetString()); // Detailed violation report is available as a JSON value sb.Clear(); PrettyWriter w(sb); validator.GetError().Accept(w); fprintf(stderr, "Error report:\n%s\n", sb.GetString()); CreateErrorMessages(validator.GetError()); return EXIT_FAILURE; } } asymptote-3.05/LspCpp/third_party/rapidjson/example/parsebyparts/0000755000000000000000000000000015031566105024063 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/parsebyparts/parsebyparts.cpp0000644000000000000000000001201115031566105027301 0ustar rootroot// Example of parsing JSON to document by parts. // Using C++11 threads // Temporarily disable for clang (older version) due to incompatibility with libstdc++ #if (__cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1700)) && !defined(__clang__) #include "rapidjson/document.h" #include "rapidjson/error/en.h" #include "rapidjson/writer.h" #include "rapidjson/ostreamwrapper.h" #include #include #include #include using namespace rapidjson; template class AsyncDocumentParser { public: AsyncDocumentParser(Document& d) : stream_(*this) , d_(d) , parseThread_() , mutex_() , notEmpty_() , finish_() , completed_() { // Create and execute thread after all member variables are initialized. parseThread_ = std::thread(&AsyncDocumentParser::Parse, this); } ~AsyncDocumentParser() { if (!parseThread_.joinable()) return; { std::unique_lock lock(mutex_); // Wait until the buffer is read up (or parsing is completed) while (!stream_.Empty() && !completed_) finish_.wait(lock); // Automatically append '\0' as the terminator in the stream. static const char terminator[] = ""; stream_.src_ = terminator; stream_.end_ = terminator + 1; notEmpty_.notify_one(); // unblock the AsyncStringStream } parseThread_.join(); } void ParsePart(const char* buffer, size_t length) { std::unique_lock lock(mutex_); // Wait until the buffer is read up (or parsing is completed) while (!stream_.Empty() && !completed_) finish_.wait(lock); // Stop further parsing if the parsing process is completed. if (completed_) return; // Set the buffer to stream and unblock the AsyncStringStream stream_.src_ = buffer; stream_.end_ = buffer + length; notEmpty_.notify_one(); } private: void Parse() { d_.ParseStream(stream_); // The stream may not be fully read, notify finish anyway to unblock ParsePart() std::unique_lock lock(mutex_); completed_ = true; // Parsing process is completed finish_.notify_one(); // Unblock ParsePart() or destructor if they are waiting. } struct AsyncStringStream { typedef char Ch; AsyncStringStream(AsyncDocumentParser& parser) : parser_(parser), src_(), end_(), count_() {} char Peek() const { std::unique_lock lock(parser_.mutex_); // If nothing in stream, block to wait. while (Empty()) parser_.notEmpty_.wait(lock); return *src_; } char Take() { std::unique_lock lock(parser_.mutex_); // If nothing in stream, block to wait. while (Empty()) parser_.notEmpty_.wait(lock); count_++; char c = *src_++; // If all stream is read up, notify that the stream is finish. if (Empty()) parser_.finish_.notify_one(); return c; } size_t Tell() const { return count_; } // Not implemented char* PutBegin() { return 0; } void Put(char) {} void Flush() {} size_t PutEnd(char*) { return 0; } bool Empty() const { return src_ == end_; } AsyncDocumentParser& parser_; const char* src_; //!< Current read position. const char* end_; //!< End of buffer size_t count_; //!< Number of characters taken so far. }; AsyncStringStream stream_; Document& d_; std::thread parseThread_; std::mutex mutex_; std::condition_variable notEmpty_; std::condition_variable finish_; bool completed_; }; int main() { Document d; { AsyncDocumentParser<> parser(d); const char json1[] = " { \"hello\" : \"world\", \"t\" : tr"; //const char json1[] = " { \"hello\" : \"world\", \"t\" : trX"; // For test parsing error const char json2[] = "ue, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.14"; const char json3[] = "16, \"a\":[1, 2, 3, 4] } "; parser.ParsePart(json1, sizeof(json1) - 1); parser.ParsePart(json2, sizeof(json2) - 1); parser.ParsePart(json3, sizeof(json3) - 1); } if (d.HasParseError()) { std::cout << "Error at offset " << d.GetErrorOffset() << ": " << GetParseError_En(d.GetParseError()) << std::endl; return EXIT_FAILURE; } // Stringify the JSON to cout OStreamWrapper os(std::cout); Writer writer(os); d.Accept(writer); std::cout << std::endl; return EXIT_SUCCESS; } #else // Not supporting C++11 #include int main() { std::cout << "This example requires C++11 compiler" << std::endl; } #endif asymptote-3.05/LspCpp/third_party/rapidjson/example/traverseaspointer.cpp0000644000000000000000000000165615031566105025640 0ustar rootroot#include "rapidjson/document.h" #include "rapidjson/filereadstream.h" #include "rapidjson/pointer.h" #include "rapidjson/stringbuffer.h" #include using namespace rapidjson; void traverse(const Value& v, const Pointer& p) { StringBuffer sb; p.Stringify(sb); std::cout << sb.GetString() << std::endl; switch (v.GetType()) { case kArrayType: for (SizeType i = 0; i != v.Size(); ++i) traverse(v[i], p.Append(i)); break; case kObjectType: for (Value::ConstMemberIterator m = v.MemberBegin(); m != v.MemberEnd(); ++m) traverse(m->value, p.Append(m->name.GetString(), m->name.GetStringLength())); break; default: break; } } int main(int, char*[]) { char readBuffer[65536]; FileReadStream is(stdin, readBuffer, sizeof(readBuffer)); Document d; d.ParseStream(is); Pointer root; traverse(d, root); return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/example/serialize/0000755000000000000000000000000015031566105023333 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/serialize/serialize.cpp0000644000000000000000000001074515031566105026035 0ustar rootroot// Serialize example // This example shows writing JSON string with writer directly. #include "rapidjson/prettywriter.h" // for stringify JSON #include #include #include using namespace rapidjson; class Person { public: Person(const std::string& name, unsigned age) : name_(name), age_(age) {} Person(const Person& rhs) : name_(rhs.name_), age_(rhs.age_) {} virtual ~Person(); Person& operator=(const Person& rhs) { name_ = rhs.name_; age_ = rhs.age_; return *this; } protected: template void Serialize(Writer& writer) const { // This base class just write out name-value pairs, without wrapping within an object. writer.String("name"); #if RAPIDJSON_HAS_STDSTRING writer.String(name_); #else writer.String(name_.c_str(), static_cast(name_.length())); // Supplying length of string is faster. #endif writer.String("age"); writer.Uint(age_); } private: std::string name_; unsigned age_; }; Person::~Person() { } class Education { public: Education(const std::string& school, double GPA) : school_(school), GPA_(GPA) {} Education(const Education& rhs) : school_(rhs.school_), GPA_(rhs.GPA_) {} template void Serialize(Writer& writer) const { writer.StartObject(); writer.String("school"); #if RAPIDJSON_HAS_STDSTRING writer.String(school_); #else writer.String(school_.c_str(), static_cast(school_.length())); #endif writer.String("GPA"); writer.Double(GPA_); writer.EndObject(); } private: std::string school_; double GPA_; }; class Dependent : public Person { public: Dependent(const std::string& name, unsigned age, Education* education = 0) : Person(name, age), education_(education) {} Dependent(const Dependent& rhs) : Person(rhs), education_(0) { education_ = (rhs.education_ == 0) ? 0 : new Education(*rhs.education_); } virtual ~Dependent(); Dependent& operator=(const Dependent& rhs) { if (this == &rhs) return *this; delete education_; education_ = (rhs.education_ == 0) ? 0 : new Education(*rhs.education_); return *this; } template void Serialize(Writer& writer) const { writer.StartObject(); Person::Serialize(writer); writer.String("education"); if (education_) education_->Serialize(writer); else writer.Null(); writer.EndObject(); } private: Education *education_; }; Dependent::~Dependent() { delete education_; } class Employee : public Person { public: Employee(const std::string& name, unsigned age, bool married) : Person(name, age), dependents_(), married_(married) {} Employee(const Employee& rhs) : Person(rhs), dependents_(rhs.dependents_), married_(rhs.married_) {} virtual ~Employee(); Employee& operator=(const Employee& rhs) { static_cast(*this) = rhs; dependents_ = rhs.dependents_; married_ = rhs.married_; return *this; } void AddDependent(const Dependent& dependent) { dependents_.push_back(dependent); } template void Serialize(Writer& writer) const { writer.StartObject(); Person::Serialize(writer); writer.String("married"); writer.Bool(married_); writer.String(("dependents")); writer.StartArray(); for (std::vector::const_iterator dependentItr = dependents_.begin(); dependentItr != dependents_.end(); ++dependentItr) dependentItr->Serialize(writer); writer.EndArray(); writer.EndObject(); } private: std::vector dependents_; bool married_; }; Employee::~Employee() { } int main(int, char*[]) { std::vector employees; employees.push_back(Employee("Milo YIP", 34, true)); employees.back().AddDependent(Dependent("Lua YIP", 3, new Education("Happy Kindergarten", 3.5))); employees.back().AddDependent(Dependent("Mio YIP", 1)); employees.push_back(Employee("Percy TSE", 30, false)); StringBuffer sb; PrettyWriter writer(sb); writer.StartArray(); for (std::vector::const_iterator employeeItr = employees.begin(); employeeItr != employees.end(); ++employeeItr) employeeItr->Serialize(writer); writer.EndArray(); puts(sb.GetString()); return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/example/prettyauto/0000755000000000000000000000000015031566105023564 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/prettyauto/prettyauto.cpp0000644000000000000000000000430515031566105026512 0ustar rootroot// JSON pretty formatting example // This example can handle UTF-8/UTF-16LE/UTF-16BE/UTF-32LE/UTF-32BE. // The input firstly convert to UTF8, and then write to the original encoding with pretty formatting. #include "rapidjson/reader.h" #include "rapidjson/prettywriter.h" #include "rapidjson/filereadstream.h" #include "rapidjson/filewritestream.h" #include "rapidjson/encodedstream.h" // NEW #include "rapidjson/error/en.h" #ifdef _WIN32 #include #include #endif using namespace rapidjson; int main(int, char*[]) { #ifdef _WIN32 // Prevent Windows converting between CR+LF and LF _setmode(_fileno(stdin), _O_BINARY); // NEW _setmode(_fileno(stdout), _O_BINARY); // NEW #endif // Prepare reader and input stream. //Reader reader; GenericReader, UTF8<> > reader; // CHANGED char readBuffer[65536]; FileReadStream is(stdin, readBuffer, sizeof(readBuffer)); AutoUTFInputStream eis(is); // NEW // Prepare writer and output stream. char writeBuffer[65536]; FileWriteStream os(stdout, writeBuffer, sizeof(writeBuffer)); #if 1 // Use the same Encoding of the input. Also use BOM according to input. typedef AutoUTFOutputStream OutputStream; // NEW OutputStream eos(os, eis.GetType(), eis.HasBOM()); // NEW PrettyWriter, AutoUTF > writer(eos); // CHANGED #else // You may also use static bound encoding type, such as output to UTF-16LE with BOM typedef EncodedOutputStream,FileWriteStream> OutputStream; // NEW OutputStream eos(os, true); // NEW PrettyWriter, UTF16LE<> > writer(eos); // CHANGED #endif // JSON reader parse from the input stream and let writer generate the output. //if (!reader.Parse(is, writer)) { if (!reader.Parse(eis, writer)) { // CHANGED fprintf(stderr, "\nError(%u): %s\n", static_cast(reader.GetErrorOffset()), GetParseError_En(reader.GetParseErrorCode())); return 1; } return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/example/jsonx/0000755000000000000000000000000015031566105022505 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/jsonx/jsonx.cpp0000644000000000000000000001355415031566105024362 0ustar rootroot// JSON to JSONx conversion example, using SAX API. // JSONx is an IBM standard format to represent JSON as XML. // https://www-01.ibm.com/support/knowledgecenter/SS9H2Y_7.1.0/com.ibm.dp.doc/json_jsonx.html // This example parses JSON text from stdin with validation, // and convert to JSONx format to stdout. // Need compile with -D__STDC_FORMAT_MACROS for defining PRId64 and PRIu64 macros. #include "rapidjson/reader.h" #include "rapidjson/stringbuffer.h" #include "rapidjson/filereadstream.h" #include "rapidjson/filewritestream.h" #include "rapidjson/error/en.h" #include using namespace rapidjson; // For simplicity, this example only read/write in UTF-8 encoding template class JsonxWriter { public: JsonxWriter(OutputStream& os) : os_(os), name_(), level_(0), hasName_(false) { } bool Null() { return WriteStartElement("null", true); } bool Bool(bool b) { return WriteStartElement("boolean") && WriteString(b ? "true" : "false") && WriteEndElement("boolean"); } bool Int(int i) { char buffer[12]; return WriteNumberElement(buffer, sprintf(buffer, "%d", i)); } bool Uint(unsigned i) { char buffer[11]; return WriteNumberElement(buffer, sprintf(buffer, "%u", i)); } bool Int64(int64_t i) { char buffer[21]; return WriteNumberElement(buffer, sprintf(buffer, "%" PRId64, i)); } bool Uint64(uint64_t i) { char buffer[21]; return WriteNumberElement(buffer, sprintf(buffer, "%" PRIu64, i)); } bool Double(double d) { char buffer[30]; return WriteNumberElement(buffer, sprintf(buffer, "%.17g", d)); } bool RawNumber(const char* str, SizeType length, bool) { return WriteStartElement("number") && WriteEscapedText(str, length) && WriteEndElement("number"); } bool String(const char* str, SizeType length, bool) { return WriteStartElement("string") && WriteEscapedText(str, length) && WriteEndElement("string"); } bool StartObject() { return WriteStartElement("object"); } bool Key(const char* str, SizeType length, bool) { // backup key to name_ name_.Clear(); for (SizeType i = 0; i < length; i++) name_.Put(str[i]); hasName_ = true; return true; } bool EndObject(SizeType) { return WriteEndElement("object"); } bool StartArray() { return WriteStartElement("array"); } bool EndArray(SizeType) { return WriteEndElement("array"); } private: bool WriteString(const char* s) { while (*s) os_.Put(*s++); return true; } bool WriteEscapedAttributeValue(const char* s, size_t length) { for (size_t i = 0; i < length; i++) { switch (s[i]) { case '&': WriteString("&"); break; case '<': WriteString("<"); break; case '"': WriteString("""); break; default: os_.Put(s[i]); break; } } return true; } bool WriteEscapedText(const char* s, size_t length) { for (size_t i = 0; i < length; i++) { switch (s[i]) { case '&': WriteString("&"); break; case '<': WriteString("<"); break; default: os_.Put(s[i]); break; } } return true; } bool WriteStartElement(const char* type, bool emptyElement = false) { if (level_ == 0) if (!WriteString("")) return false; if (!WriteString(""); else { level_++; return WriteString(">"); } } bool WriteEndElement(const char* type) { if (!WriteString("")) return false; // For the last end tag, flush the output stream. if (--level_ == 0) os_.Flush(); return true; } bool WriteNumberElement(const char* buffer, int length) { if (!WriteStartElement("number")) return false; for (int j = 0; j < length; j++) os_.Put(buffer[j]); return WriteEndElement("number"); } OutputStream& os_; StringBuffer name_; unsigned level_; bool hasName_; }; int main(int, char*[]) { // Prepare JSON reader and input stream. Reader reader; char readBuffer[65536]; FileReadStream is(stdin, readBuffer, sizeof(readBuffer)); // Prepare JSON writer and output stream. char writeBuffer[65536]; FileWriteStream os(stdout, writeBuffer, sizeof(writeBuffer)); JsonxWriter writer(os); // JSON reader parse from the input stream and let writer generate the output. if (!reader.Parse(is, writer)) { fprintf(stderr, "\nError(%u): %s\n", static_cast(reader.GetErrorOffset()), GetParseError_En(reader.GetParseErrorCode())); return 1; } return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/example/condense/0000755000000000000000000000000015031566105023142 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/example/condense/condense.cpp0000644000000000000000000000176615031566105025456 0ustar rootroot// JSON condenser example // This example parses JSON text from stdin with validation, // and re-output the JSON content to stdout without whitespace. #include "rapidjson/reader.h" #include "rapidjson/writer.h" #include "rapidjson/filereadstream.h" #include "rapidjson/filewritestream.h" #include "rapidjson/error/en.h" using namespace rapidjson; int main(int, char*[]) { // Prepare JSON reader and input stream. Reader reader; char readBuffer[65536]; FileReadStream is(stdin, readBuffer, sizeof(readBuffer)); // Prepare JSON writer and output stream. char writeBuffer[65536]; FileWriteStream os(stdout, writeBuffer, sizeof(writeBuffer)); Writer writer(os); // JSON reader parse from the input stream and let writer generate the output. if (!reader.Parse(is, writer)) { fprintf(stderr, "\nError(%u): %s\n", static_cast(reader.GetErrorOffset()), GetParseError_En(reader.GetParseErrorCode())); return 1; } return 0; } asymptote-3.05/LspCpp/third_party/rapidjson/RapidJSONConfigVersion.cmake.in0000644000000000000000000000072515031566105025551 0ustar rootrootSET(PACKAGE_VERSION "@LIB_VERSION_STRING@") IF (PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) SET(PACKAGE_VERSION_EXACT "true") ENDIF (PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) IF (NOT PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION) SET(PACKAGE_VERSION_COMPATIBLE "true") ELSE (NOT PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION) SET(PACKAGE_VERSION_UNSUITABLE "true") ENDIF (NOT PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION) asymptote-3.05/LspCpp/third_party/rapidjson/contrib/0000755000000000000000000000000015031566105021351 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/contrib/natvis/0000755000000000000000000000000015031566105022655 5ustar rootrootasymptote-3.05/LspCpp/third_party/rapidjson/contrib/natvis/README.md0000644000000000000000000000124615031566105024137 0ustar rootroot# rapidjson.natvis This file can be used as a [Visual Studio Visualizer](https://docs.microsoft.com/en-gb/visualstudio/debugger/create-custom-views-of-native-objects) to aid in visualizing rapidjson structures within the Visual Studio debugger. Natvis visualizers are supported in Visual Studio 2012 and later. To install, copy the file into this directory: `%USERPROFILE%\Documents\Visual Studio 2012\Visualizers` Each version of Visual Studio has a similar directory, it must be copied into each directory to be used with that particular version. In Visual Studio 2015 and later, this can be done without restarting Visual Studio (a new debugging session must be started). asymptote-3.05/LspCpp/third_party/rapidjson/contrib/natvis/rapidjson.natvis0000644000000000000000000000525115031566105026077 0ustar rootroot null true false {(const Ch*)data_.ss.str,na} {(const Ch*)((size_t)data_.s.str & 0x0000FFFFFFFFFFFF),[data_.s.length]na} {data_.n.i.i} {data_.n.u.u} {data_.n.i64} {data_.n.u64} {data_.n.d} Object members={data_.o.size} Array members={data_.a.size} data_.o.size data_.o.capacity data_.o.size (rapidjson::GenericMember<$T1,$T2>*)(((size_t)data_.o.members) & 0x0000FFFFFFFFFFFF) data_.a.size data_.a.capacity data_.a.size (rapidjson::GenericValue<$T1,$T2>*)(((size_t)data_.a.elements) & 0x0000FFFFFFFFFFFF) asymptote-3.05/LspCpp/third_party/rapidjson/contrib/natvis/LICENSE0000644000000000000000000000417715031566105023673 0ustar rootrootThe MIT License (MIT) Copyright (c) 2017 Bart Muzzin Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Derived from: The MIT License (MIT) Copyright (c) 2015 mojmir svoboda Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. asymptote-3.05/LspCpp/third_party/rapidjson/travis-doxygen.sh0000755000000000000000000000633615031566105023243 0ustar rootroot#!/bin/bash # Update Doxygen documentation after push to 'master'. # Author: @pah set -e DOXYGEN_VER=1_8_16 DOXYGEN_URL="https://codeload.github.com/doxygen/doxygen/tar.gz/Release_${DOXYGEN_VER}" : ${GITHUB_REPO:="Tencent/rapidjson"} GITHUB_HOST="github.com" GITHUB_CLONE="git://${GITHUB_HOST}/${GITHUB_REPO}" GITHUB_URL="https://${GITHUB_HOST}/${GITHUB_PUSH-${GITHUB_REPO}}" # if not set, ignore password #GIT_ASKPASS="${TRAVIS_BUILD_DIR}/gh_ignore_askpass.sh" skip() { echo "$@" 1>&2 echo "Exiting..." 1>&2 exit 0 } abort() { echo "Error: $@" 1>&2 echo "Exiting..." 1>&2 exit 1 } # TRAVIS_BUILD_DIR not set, exiting [ -d "${TRAVIS_BUILD_DIR-/nonexistent}" ] || \ abort '${TRAVIS_BUILD_DIR} not set or nonexistent.' # check for pull-requests [ "${TRAVIS_PULL_REQUEST}" = "false" ] || \ skip "Not running Doxygen for pull-requests." # check for branch name [ "${TRAVIS_BRANCH}" = "master" ] || \ skip "Running Doxygen only for updates on 'master' branch (current: ${TRAVIS_BRANCH})." # check for job number # [ "${TRAVIS_JOB_NUMBER}" = "${TRAVIS_BUILD_NUMBER}.1" ] || \ # skip "Running Doxygen only on first job of build ${TRAVIS_BUILD_NUMBER} (current: ${TRAVIS_JOB_NUMBER})." # install doxygen binary distribution doxygen_install() { cd ${TMPDIR-/tmp} curl ${DOXYGEN_URL} -o doxygen.tar.gz tar zxvf doxygen.tar.gz mkdir doxygen_build cd doxygen_build cmake ../doxygen-Release_${DOXYGEN_VER}/ make export PATH="${TMPDIR-/tmp}/doxygen_build/bin:$PATH" cd ../../ } doxygen_run() { cd "${TRAVIS_BUILD_DIR}"; doxygen ${TRAVIS_BUILD_DIR}/build/doc/Doxyfile; doxygen ${TRAVIS_BUILD_DIR}/build/doc/Doxyfile.zh-cn; } gh_pages_prepare() { cd "${TRAVIS_BUILD_DIR}/build/doc"; [ ! -d "html" ] || \ abort "Doxygen target directory already exists." git --version git clone --single-branch -b gh-pages "${GITHUB_CLONE}" html cd html # setup git config (with defaults) git config user.name "${GIT_NAME-travis}" git config user.email "${GIT_EMAIL-"travis@localhost"}" # clean working dir rm -f .git/index git clean -df } gh_pages_commit() { cd "${TRAVIS_BUILD_DIR}/build/doc/html"; echo "rapidjson.org" > CNAME git add --all; git diff-index --quiet HEAD || git commit -m "Automatic doxygen build"; } gh_setup_askpass() { cat > ${GIT_ASKPASS} < ${HOME}/.git-credentials ; \ chmod go-rw ${HOME}/.git-credentials ) ) # push to GitHub git push origin gh-pages } doxygen_install gh_pages_prepare doxygen_run gh_pages_commit gh_pages_push asymptote-3.05/LspCpp/third_party/rapidjson/readme.zh-cn.md0000644000000000000000000002113315031566105022506 0ustar rootroot![RapidJSON logo](doc/logo/rapidjson.png) ![Release version](https://img.shields.io/badge/release-v1.1.0-blue.svg) ## 高效的 C++ JSON è§£æžï¼ç”Ÿæˆå™¨ï¼Œæä¾› SAX åŠ DOM 风格 API Tencent is pleased to support the open source community by making RapidJSON available. Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. * [RapidJSON GitHub](https://github.com/Tencent/rapidjson/) * RapidJSON 文档 * [English](http://rapidjson.org/) * [简体中文](http://rapidjson.org/zh-cn/) * [GitBook](https://www.gitbook.com/book/miloyip/rapidjson/details/zh-cn) å¯ä¸‹è½½ PDF/EPUB/MOBI,但ä¸å« API å‚考手册。 ## Build çŠ¶æ€ | [Linux][lin-link] | [Windows][win-link] | [Coveralls][cov-link] | | :---------------: | :-----------------: | :-------------------: | | ![lin-badge] | ![win-badge] | ![cov-badge] | [lin-badge]: https://travis-ci.org/Tencent/rapidjson.svg?branch=master "Travis build status" [lin-link]: https://travis-ci.org/Tencent/rapidjson "Travis build status" [win-badge]: https://ci.appveyor.com/api/projects/status/l6qulgqahcayidrf/branch/master?svg=true "AppVeyor build status" [win-link]: https://ci.appveyor.com/project/miloyip/rapidjson-0fdqj/branch/master "AppVeyor build status" [cov-badge]: https://coveralls.io/repos/Tencent/rapidjson/badge.svg?branch=master "Coveralls coverage" [cov-link]: https://coveralls.io/r/Tencent/rapidjson?branch=master "Coveralls coverage" ## 简介 RapidJSON 是一个 C++ çš„ JSON è§£æžå™¨åŠç”Ÿæˆå™¨ã€‚å®ƒçš„çµæ„Ÿæ¥è‡ª [RapidXml](http://rapidxml.sourceforge.net/)。 * RapidJSON å°è€Œå…¨ã€‚å®ƒåŒæ—¶æ”¯æŒ SAX å’Œ DOM 风格的 API。SAX è§£æžå™¨åªæœ‰çº¦ 500 行代ç ã€‚ * RapidJSON 快。它的性能å¯ä¸Ž `strlen()` ç›¸æ¯”ã€‚å¯æ”¯æŒ SSE2/SSE4.2 加速。 * RapidJSON 独立。它ä¸ä¾èµ–于 BOOST 等外部库。它甚至ä¸ä¾èµ–于 STL。 * RapidJSON 对内存å‹å¥½ã€‚在大部分 32/64 使œºå™¨ä¸Šï¼Œæ¯ä¸ª JSON 值åªå  16 字节(除字符串外)。它预设使用一个快速的内存分é…器,令分æžå™¨å¯ä»¥ç´§å‡‘地分é…内存。 * RapidJSON 对 Unicode å‹å¥½ã€‚å®ƒæ”¯æŒ UTF-8ã€UTF-16ã€UTF-32 (大端åºï¼å°ç«¯åº),并内部支æŒè¿™äº›ç¼–ç çš„æ£€æµ‹ã€æ ¡éªŒåŠè½¬ç ã€‚例如,RapidJSON å¯ä»¥åœ¨åˆ†æžä¸€ä¸ª UTF-8 文件至 DOM 时,把当中的 JSON 字符串转ç è‡³ UTF-16。它也支æŒä»£ç†å¯¹ï¼ˆsurrogate pairï¼‰åŠ `"\u0000"`(空字符)。 在 [这里](doc/features.zh-cn.md) å¯è¯»å–更多特点。 JSON(JavaScript Object Notation)是一个轻é‡çš„æ•°æ®äº¤æ¢æ ¼å¼ã€‚RapidJSON 应该完全éµä»Ž RFC7159/ECMA-404,并支æŒå¯é€‰çš„æ”¾å®½è¯­æ³•。 关于 JSON 的更多信æ¯å¯å‚考: * [Introducing JSON](http://json.org/) * [RFC7159: The JavaScript Object Notation (JSON) Data Interchange Format](https://tools.ietf.org/html/rfc7159) * [Standard ECMA-404: The JSON Data Interchange Format](https://www.ecma-international.org/publications/standards/Ecma-404.htm) ## v1.1 中的亮点 (2016-8-25) * 加入 [JSON Pointer](doc/pointer.zh-cn.md) åŠŸèƒ½ï¼Œå¯æ›´ç®€å•åœ°è®¿é—®åŠæ›´æ”¹ DOM。 * 加入 [JSON Schema](doc/schema.zh-cn.md) 功能,å¯åœ¨è§£æžæˆ–ç”Ÿæˆ JSON 时进行校验。 * 加入 [放宽的 JSON 语法](doc/dom.zh-cn.md) (注释ã€å°¾éšé€—å·ã€NaN/Infinity) * 使用 [C++11 范围 for 循环](doc/tutorial.zh-cn.md) 去é历 array å’Œ object。 * 在 x86-64 æž¶æž„ä¸‹ï¼Œç¼©å‡æ¯ä¸ª `Value` 的内存开销从 24 字节至 16 字节。 其他改动请å‚考 [change log](CHANGELOG.md). ## 兼容性 RapidJSON 是跨平å°çš„。以下是一些曾测试的平å°ï¼ç¼–译器组åˆï¼š * Visual C++ 2008/2010/2013 在 Windows (32/64-bit) * GNU C++ 3.8.x 在 Cygwin * Clang 3.4 在 Mac OS X (32/64-bit) åŠ iOS * Clang 3.4 在 Android NDK 用户也å¯ä»¥åœ¨ä»–们的平å°ä¸Šç”ŸæˆåŠæ‰§è¡Œå•元测试。 ## 安装 RapidJSON æ˜¯åªæœ‰å¤´æ–‡ä»¶çš„ C++ 库。åªéœ€æŠŠ `include/rapidjson` 目录å¤åˆ¶è‡³ç³»ç»Ÿæˆ–项目的 include 目录中。 RapidJSON ä¾èµ–于以下软件: * [CMake](https://cmake.org/) 作为通用生æˆå·¥å…· * (optional) [Doxygen](http://www.doxygen.org) ç”¨äºŽç”Ÿæˆæ–‡æ¡£ * (optional) [googletest](https://github.com/google/googletest) 用于å•å…ƒåŠæ€§èƒ½æµ‹è¯• ç”Ÿæˆæµ‹è¯•åŠä¾‹å­çš„æ­¥éª¤ï¼š 1. 执行 `git submodule update --init` åŽ»èŽ·å– thirdparty submodules (google test)。 2. 在 rapidjson 目录下,建立一个 `build` 目录。 3. 在 `build` 目录下执行 `cmake ..` 命令以设置生æˆã€‚Windows 用户å¯ä½¿ç”¨ cmake-gui 应用程åºã€‚ 4. 在 Windows 下,编译生æˆåœ¨ build 目录中的 solution。在 Linux 下,于 build 目录è¿è¡Œ `make`。 æˆåŠŸç”ŸæˆåŽï¼Œä½ ä¼šåœ¨ `bin` 的目录下找到编译åŽçš„æµ‹è¯•åŠä¾‹å­å¯æ‰§è¡Œæ–‡ä»¶ã€‚而生æˆçš„æ–‡æ¡£å°†ä½äºŽ build 下的 `doc/html` ç›®å½•ã€‚è¦æ‰§è¡Œæµ‹è¯•,请在 build 下执行 `make test` 或 `ctest`。使用 `ctest -V` 命令å¯èŽ·å–详细的输出。 我们也å¯ä»¥æŠŠç¨‹åºåº“安装至全系统中,åªè¦åœ¨å…·ç®¡ç†æƒé™ä¸‹ä»Ž build 目录执行 `make install` 命令。这样会按系统的å好设置安装所有文件。当安装 RapidJSON åŽï¼Œå…¶ä»–çš„ CMake 项目需è¦ä½¿ç”¨å®ƒæ—¶ï¼Œå¯ä»¥é€šè¿‡åœ¨ `CMakeLists.txt` åŠ å…¥ä¸€å¥ `find_package(RapidJSON)`。 ## 用法一览 此简å•例å­è§£æžä¸€ä¸ª JSON 字符串至一个 document (DOM),对 DOM 作出简å•修改,最终把 DOM 转æ¢ï¼ˆstringify)至 JSON 字符串。 ~~~~~~~~~~cpp // rapidjson/example/simpledom/simpledom.cpp` #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" #include using namespace rapidjson; int main() { // 1. 把 JSON è§£æžè‡³ DOM。 const char* json = "{\"project\":\"rapidjson\",\"stars\":10}"; Document d; d.Parse(json); // 2. 利用 DOM 作出修改。 Value& s = d["stars"]; s.SetInt(s.GetInt() + 1); // 3. 把 DOM 转æ¢ï¼ˆstringifyï¼‰æˆ JSON。 StringBuffer buffer; Writer writer(buffer); d.Accept(writer); // Output {"project":"rapidjson","stars":11} std::cout << buffer.GetString() << std::endl; return 0; } ~~~~~~~~~~ æ³¨æ„æ­¤ä¾‹å­å¹¶æ²¡æœ‰å¤„ç†æ½œåœ¨é”™è¯¯ã€‚ 下图展示执行过程。 ![simpledom](doc/diagram/simpledom.png) 还有许多 [例å­](https://github.com/Tencent/rapidjson/tree/master/example) å¯ä¾›å‚考: * DOM API * [tutorial](https://github.com/Tencent/rapidjson/blob/master/example/tutorial/tutorial.cpp): DOM API 的基本使用方法。 * SAX API * [simplereader](https://github.com/Tencent/rapidjson/blob/master/example/simplereader/simplereader.cpp): 使用 `Reader` è§£æž JSON æ—¶ï¼Œæ‰“å°æ‰€æœ‰ SAX 事件。 * [condense](https://github.com/Tencent/rapidjson/blob/master/example/condense/condense.cpp): 移除 JSON 中所有空白符的命令行工具。 * [pretty](https://github.com/Tencent/rapidjson/blob/master/example/pretty/pretty.cpp): 为 JSON 加入缩进与æ¢è¡Œçš„命令行工具,当中使用了 `PrettyWriter`。 * [capitalize](https://github.com/Tencent/rapidjson/blob/master/example/capitalize/capitalize.cpp): 把 JSON 中所有字符串改为大写的命令行工具。 * [messagereader](https://github.com/Tencent/rapidjson/blob/master/example/messagereader/messagereader.cpp): 使用 SAX API 去解æžä¸€ä¸ª JSON 报文。 * [serialize](https://github.com/Tencent/rapidjson/blob/master/example/serialize/serialize.cpp): 使用 SAX API 去åºåˆ—化 C++ å¯¹è±¡ï¼Œç”Ÿæˆ JSON。 * [jsonx](https://github.com/Tencent/rapidjson/blob/master/example/jsonx/jsonx.cpp): 实现了一个 `JsonxWriter`,它能把 SAX äº‹ä»¶å†™æˆ [JSONx](https://www-01.ibm.com/support/knowledgecenter/SS9H2Y_7.1.0/com.ibm.dp.doc/json_jsonx.html)ï¼ˆä¸€ç§ XML)格å¼ã€‚è¿™ä¸ªä¾‹å­æ˜¯æŠŠ JSON è¾“å…¥è½¬æ¢æˆ JSONx æ ¼å¼çš„命令行工具。 * Schema API * [schemavalidator](https://github.com/Tencent/rapidjson/blob/master/example/schemavalidator/schemavalidator.cpp): 使用 JSON Schema 去校验 JSON 的命令行工具。 * 进阶 * [prettyauto](https://github.com/Tencent/rapidjson/blob/master/example/prettyauto/prettyauto.cpp): [pretty](https://github.com/Tencent/rapidjson/blob/master/example/pretty/pretty.cpp) 的修改版本,å¯è‡ªåЍ处ç†ä»»ä½• UTF ç¼–ç çš„ JSON。 * [parsebyparts](https://github.com/Tencent/rapidjson/blob/master/example/parsebyparts/parsebyparts.cpp): 这例å­ä¸­çš„ `AsyncDocumentParser` 类使用 C++ 线程æ¥é€æ®µè§£æž JSON。 * [filterkey](https://github.com/Tencent/rapidjson/blob/master/example/filterkey/filterkey.cpp): ç§»å–使用者指定的键值的命令行工具。 * [filterkeydom](https://github.com/Tencent/rapidjson/blob/master/example/filterkey/filterkey.cpp): 如上的工具,但展示如何使用生æˆå™¨ï¼ˆgenerator)去填充一个 `Document`。 asymptote-3.05/LspCpp/third_party/rapidjson/RapidJSONConfig.cmake.in0000644000000000000000000000172715031566105024206 0ustar rootroot################################################################################ # CMake minimum version required cmake_minimum_required(VERSION 3.0) ################################################################################ # RapidJSON source dir set( RapidJSON_SOURCE_DIR "@CONFIG_SOURCE_DIR@") ################################################################################ # RapidJSON build dir set( RapidJSON_DIR "@CONFIG_DIR@") ################################################################################ # Compute paths get_filename_component(RapidJSON_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) set( RapidJSON_INCLUDE_DIR "@RapidJSON_INCLUDE_DIR@" ) set( RapidJSON_INCLUDE_DIRS "@RapidJSON_INCLUDE_DIR@" ) message(STATUS "RapidJSON found. Headers: ${RapidJSON_INCLUDE_DIRS}") if(NOT TARGET rapidjson) add_library(rapidjson INTERFACE IMPORTED) set_property(TARGET rapidjson PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${RapidJSON_INCLUDE_DIRS}) endif() asymptote-3.05/LspCpp/third_party/uri/0000755000000000000000000000000015031566776016535 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/include/0000755000000000000000000000000015031566105020142 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/include/network/0000755000000000000000000000000015031566105021633 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/include/network/optional.hpp0000644000000000000000000004025015031566105024172 0ustar rootroot// Copyright 2016 Glyn Matthews. // Copyright (C) 2011 - 2012 Andrzej Krzemienski. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) /** * \file * \brief Contains an implementation of C++17 optional (n3793). * * \sa https://github.com/akrzemi1/Optional * \sa http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3848.html */ #ifndef NETWORK_OPTIONAL_INC #define NETWORK_OPTIONAL_INC #include #include #include #include #include #if !defined(DOXYGEN_SHOULD_SKIP_THIS) #ifdef NDEBUG #define NETWORK_ASSERTED_EXPRESSION(CHECK, EXPR) (EXPR) #else #define NETWORK_ASSERTED_EXPRESSION(CHECK, EXPR) \ ((CHECK) ? (EXPR) : (fail(#CHECK, __FILE__, __LINE__), (EXPR))) inline void fail(const char *, const char *, unsigned) {} #endif // NDEBUG #endif // !defined(DOXYGEN_SHOULD_SKIP_THIS) namespace network { /** * \ingroup optional * \class nullopt_t optional.hpp network/uri.hpp * \brief Disengaged state indicator. * \sa optional */ struct nullopt_t { #if !defined(DOXYGEN_SHOULD_SKIP_THIS) struct init {}; constexpr nullopt_t(init) {} #endif // !defined(DOXYGEN_SHOULD_SKIP_THIS) }; /** * \ingroup optional * \brief Used to indicate a *disengaged* state for optional objects. */ constexpr nullopt_t nullopt{nullopt_t::init{}}; /** * \ingroup optional * \class bad_optional_access optional.hpp network/uri.hpp * \brief Exception thrown when the value member function is called when the * optional object is disengaged. */ class bad_optional_access : public std::logic_error { public: /** * \brief Constructor. * \param what_arg The error message. */ explicit bad_optional_access(const std::string &what_arg) : std::logic_error(what_arg) {} /** * \brief Constructor. * \param what_arg The error message. */ explicit bad_optional_access(const char *what_arg) : std::logic_error(what_arg) {} }; #if !defined(DOXYGEN_SHOULD_SKIP_THIS) namespace details { struct dummy_t {}; template union trivially_destructible_optional_storage { static_assert(std::is_trivially_destructible::value, ""); dummy_t dummy_; T value_; constexpr trivially_destructible_optional_storage() : dummy_{} {} constexpr trivially_destructible_optional_storage(const T &v) : value_{v} {} ~trivially_destructible_optional_storage() = default; }; template union optional_storage { dummy_t dummy_; T value_; constexpr optional_storage() : dummy_{} {} constexpr optional_storage(const T &v) : value_{v} {} ~optional_storage() {} }; template class trivially_destructible_optional_base { public: typedef T value_type; constexpr trivially_destructible_optional_base() noexcept : init_(false), storage_{} {} constexpr trivially_destructible_optional_base(const T &v) : init_(true), storage_{v} {} constexpr trivially_destructible_optional_base(T &&v) : init_(true), storage_{std::move(v)} {} ~trivially_destructible_optional_base() = default; protected: bool init_; optional_storage storage_; }; template class optional_base { public: typedef T value_type; constexpr optional_base() noexcept : init_(false), storage_{} {} constexpr optional_base(const T &v) : init_(true), storage_{v} {} constexpr optional_base(T &&v) : init_(true), storage_{std::move(v)} {} ~optional_base() { if (init_) { storage_.value_.T::~T(); } } protected: bool init_; optional_storage storage_; }; } // namespace details #endif // !defined(DOXYGEN_SHOULD_SKIP_THIS) /** * \ingroup optional * \class optional optional.hpp network/uri.hpp * \brief An implementation of C++17 optional (n3793) */ #if !defined(DOXYGEN_SHOULD_SKIP_THIS) template using optional_base = typename std::conditional::value, details::trivially_destructible_optional_base, details::optional_base>::type; #endif // !defined(DOXYGEN_SHOULD_SKIP_THIS) template #if !defined(DOXYGEN_SHOULD_SKIP_THIS) class optional : optional_base { #else class optional { #endif // !defined(DOXYGEN_SHOULD_SKIP_THIS) typedef optional_base base_type; public: /** * \brief Optional value type. */ typedef T value_type; /** * \brief Constructor. * \post *disengaged*. */ constexpr optional() : optional_base() {} /** * \brief Constructor. * \post *disengaged*. */ constexpr optional(nullopt_t) noexcept : optional_base() {} /** * \brief Copy constructor. * \param other The other optional object. */ optional(const optional &other) { if (other) { ::new (static_cast(ptr())) T(*other); base_type::init_ = true; } } /** * \brief Move constructor. * \param other The other optional object. */ optional(optional &&other) noexcept { if (other) { ::new (static_cast(ptr())) T(std::move(other.storage_.value_)); base_type::init_ = true; } } /** * \brief Constructor. * \param value The value with which to initialize the optional object. * \post *engaged* */ constexpr optional(const T &value) : optional_base(value) {} /** * \brief Constructor. * \param value The value with which to initialize the optional object. * \post *engaged* */ constexpr optional(T &&value) : optional_base(std::move(value)) {} /** * \brief Assignment operator. * \post *disengaged*. * \returns \c *this. */ optional &operator=(nullopt_t) noexcept { if (base_type::init_) { ptr()->T::~T(); } base_type::init_ = false; return *this; } /** * \brief Copy assignment operator. * \param other The other optional object. * \returns \c *this. */ optional &operator=(const optional &other) { if (bool(*this) && !other) { ptr()->T::~T(); base_type::init_ = false; } else if (!(*this) && bool(other)) { ::new (static_cast(ptr())) T(*other); base_type::init_ = true; } else if (bool(*this) && bool(other)) { base_type::storage_.value_ = *other; } return *this; } /** * \brief Move assignment operator. * \param other The other optional object. * \returns \c *this. */ optional &operator=(optional &&other) noexcept { if (bool(*this) && !other) { ptr()->T::~T(); base_type::init_ = false; } else if (!(*this) && bool(other)) { ::new (static_cast(ptr())) T(std::move(*other)); base_type::init_ = true; } else if (bool(*this) && bool(other)) { base_type::storage_.value_ = std::move(*other); } return *this; } /** * \brief Destructor. */ ~optional() = default; /** * \brief Swap function. * \param other The other optional object. */ void swap(optional &other) noexcept { if (bool(*this) && !other) { ::new (static_cast(other.ptr())) T(std::move(**this)); ptr()->T::~T(); std::swap(base_type::init_, other.base_type::init_); } else if (!(*this) && bool(other)) { ::new (static_cast(ptr())) T(std::move(*other)); other.ptr()->T::~T(); std::swap(base_type::init_, other.init_); } else if (bool(*this) && bool(other)) { std::swap(**this, *other); } } /** * \brief Observer. * \pre *engaged* * \returns The underlying optional value. */ constexpr T const *operator->() const { return NETWORK_ASSERTED_EXPRESSION(bool(*this), ptr()); } /** * \brief Observer. * \pre *engaged* * \returns The underlying optional value. */ T *operator->() { return NETWORK_ASSERTED_EXPRESSION(bool(*this), ptr()); } /** * \brief Observer. * \pre *engaged* * \returns The underlying optional value. */ constexpr T const &operator*() const { return NETWORK_ASSERTED_EXPRESSION(bool(*this), base_type::storage_.value_); } /** * \brief Observer. * \pre *engaged* * \returns The underlying optional value. */ T &operator*() { return NETWORK_ASSERTED_EXPRESSION(bool(*this), base_type::storage_.value_); } /** * \brief Operator bool overloads. * \returns \c true if the optional is *engaged*, \c false if it is * *disengaged*. */ constexpr explicit operator bool() const noexcept { return base_type::init_; } /** * \returns The underlying optional value, if \c bool(*this). * \throws A bad_optional_access if \c !*this. */ constexpr T const &value() const { return *this ? base_type::storage_.value_ : (throw bad_optional_access("Uninitialized optional value"), base_type::storage_.value_); } /** * \returns The underlying optional value, if \c bool(*this). * \throws A bad_optional_access if \c !*this. */ T &value() { return *this ? base_type::storage_.value_ : (throw bad_optional_access("Uninitialized optional value"), base_type::storage_.value_); } /** * \returns bool(*this) ? **this : * static_cast(std::forward(v)). \pre \c * std::is_copy_constructible::value is \c true and * std::is_convertible::value is \c true. */ template T value_or(U &&other) const & { static_assert(std::is_copy_constructible::value, "Must be copy constructible."); static_assert(std::is_convertible::value, "U must be convertible to T."); return bool(*this) ? **this : static_cast(std::forward(other)); } /** * \returns bool(*this) ? std::move(**this) : * static_cast(std::forward(v)). \pre * std::is_move_constructible::value is \c true and * std::is_convertible::value is \c true. */ template T value_or(U &&other) && { static_assert(std::is_copy_constructible::value, "Must be copy constructible."); static_assert(std::is_convertible::value, "U must be convertible to T."); return bool(*this) ? std::move(**this) : static_cast(std::forward(other)); } private: T *ptr() { return std::addressof(base_type::storage_.value_); } }; /** * \brief Equality operator. */ template bool operator==(const optional &lhs, const optional &rhs) { if (bool(lhs) != bool(rhs)) { return false; } else if (!bool(lhs)) { return true; } else { return *lhs == *rhs; } } /** * \brief Inequality operator. */ template bool operator!=(const optional &lhs, const optional &rhs) { return !(lhs == rhs); } /** * \brief Comparison operator. */ template bool operator<(const optional &lhs, const optional &rhs) { if (!rhs) { return false; } else if (!lhs) { return true; } else { return *lhs < *rhs; } } /** * \brief Comparison operator. * \returns rhs < lhs. */ template bool operator>(const optional &lhs, const optional &rhs) { return rhs < lhs; } /** * \brief Comparison operator. * \returns !(rhs < lhs). */ template bool operator<=(const optional &lhs, const optional &rhs) { return !(rhs < lhs); } /** * \brief Comparison operator. * \returns !(rhs > lhs). */ template bool operator>=(const optional &lhs, const optional &rhs) { return !(lhs < rhs); } /** * \brief Equality operator. * \returns \c !x. */ template bool operator==(const optional &x, nullopt_t) noexcept { return !x; } /** * \brief Equality operator. * \returns \c !x. */ template bool operator==(nullopt_t, const optional &x) noexcept { return !x; } /** * \brief Inequality operator. * \returns \c bool(x). */ template bool operator!=(const optional &x, nullopt_t) noexcept { return bool(x); } /** * \brief Inequality operator. * \returns \c bool(x). */ template bool operator!=(nullopt_t, const optional &x) noexcept { return bool(x); } /** * \brief Comparison operator. * \returns \c false. */ template bool operator<(const optional &x, nullopt_t) noexcept { return false; } /** * \brief Comparison operator. * \returns \c bool(x). */ template bool operator<(nullopt_t, const optional &x) noexcept { return bool(x); } /** * \brief Comparison operator. * \returns \c !x. */ template bool operator<=(const optional &x, nullopt_t) noexcept { return !x; } /** * \brief Comparison operator. * \returns \c true. */ template bool operator<=(nullopt_t, const optional &x) noexcept { return true; } /** * \brief Comparison operator. * \returns \c bool(x). */ template bool operator>(const optional &x, nullopt_t) noexcept { return bool(x); } /** * \brief Comparison operator. * \returns \c false. */ template bool operator>(nullopt_t, const optional &x) noexcept { return false; } /** * \brief Comparison operator. * \returns \c true. */ template bool operator>=(const optional &x, nullopt_t) noexcept { return true; } /** * \brief Comparison operator. * \returns \c !x. */ template bool operator>=(nullopt_t, const optional &x) noexcept { return !x; } /** * \brief Equality operator. * \returns bool(x) ? *x == v : false. */ template bool operator==(const optional &x, const T &v) { return bool(x) ? *x == v : false; } /** * \brief Equality operator. * \returns bool(x) ? v == *x : false. */ template bool operator==(const T &v, const optional &x) { return bool(x) ? v == *x : false; } /** * \brief Inequality operator. * \returns bool(x) ? !(*x == v) : true. */ template bool operator!=(const optional &x, const T &v) { return bool(x) ? !(*x == v) : true; } /** * \brief Inequality operator. * \returns bool(x) ? !(v == *x) : true. */ template bool operator!=(const T &v, const optional &x) { return bool(x) ? !(v == *x) : true; } /** * \brief Comparison operator. * \returns bool(x) ? *x < v : true. */ template bool operator<(const optional &x, const T &v) { return bool(x) ? *x < v : true; } /** * \brief Comparison operator. * \returns bool(x) ? v < *x : false. */ template bool operator<(const T &v, const optional &x) { return bool(x) ? v < *x : false; } /** * \brief Comparison operator. * \returns bool(x) ? *x < v : true. */ template bool operator>(const optional &x, const T &v) { return bool(x) ? *x < v : true; } /** * \brief Comparison operator. * \returns bool(x) ? v < *x : false. */ template bool operator>(const T &v, const optional &x) { return bool(x) ? v < *x : false; } /** * \brief Comparison operator. * \returns !(x < v). */ template bool operator>=(const optional &x, const T &v) { return !(x < v); } /** * \brief Comparison operator. * \returns !(v < x). */ template bool operator>=(const T &v, const optional &x) { return !(v < x); } /** * \brief Comparison operator. * \returns !(x > v). */ template bool operator<=(const optional &x, const T &v) { return !(x > v); } /** * \brief Comparison operator. * \returns !(v > x). */ template bool operator<=(const T &v, const optional &x) { return !(v > x); } /** * \ingroup optional * \brief Swap function. * \param lhs The first optional object. * \param rhs The second optional object. * * Calls: * \code{.cpp} * lhs.swap(rhs); * \endcode */ template inline void swap(optional &lhs, optional &rhs) noexcept(noexcept(lhs.swap(rhs))) { return lhs.swap(rhs); } /** * \ingroup optional * \brief A helper function to contruct an optional object. * \returns optional::type>(std::forward(value)). */ template inline constexpr optional::type> make_optional( T &&value) { return optional::type>(std::forward(value)); } } // namespace network #endif // NETWORK_OPTIONAL_INC asymptote-3.05/LspCpp/third_party/uri/include/network/uri/0000755000000000000000000000000015031566105022432 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/include/network/uri/config.hpp0000644000000000000000000000107415031566105024412 0ustar rootroot// Copyright (c) Glyn Matthews 2012-2016. // Copyright 2012 Dean Michael Berris // Copyright 2012 Google, Inc. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) /** * \file * \brief Contains macros to configure compiler or platform-specific * workarounds. */ #ifndef NETWORK_URI_CONFIG_INC #define NETWORK_URI_CONFIG_INC #ifdef _MSC_VER #define NETWORK_URI_MSVC _MSC_VER #endif // _MSC_VER #endif // NETWORK_URI_CONFIG_INC asymptote-3.05/LspCpp/third_party/uri/include/network/uri/uri_io.hpp0000644000000000000000000000325615031566105024437 0ustar rootroot// Copyright (c) Glyn Matthews 2011-2016 // Copyright 2012 Dean Michael Berris // Copyright 2012 Google, Inc. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) /** * \file * \brief Defines stream overloads for the uri class. */ #ifndef NETWORK_URI_URI_IO_INC #define NETWORK_URI_URI_IO_INC #include #include #include namespace network { #if !defined(NETWORK_URI_MSVC) template > std::basic_ostream &operator<<( std::basic_ostream &os, const uri &uri_) { return os << uri_.to_string(); } template > std::basic_istream &operator>>( std::basic_istream &is, uri &uri_) { std::basic_string uri_string; is >> uri_string; uri_ = uri(uri_string); return is; } #else inline std::ostream &operator<<(std::ostream &os, const uri &uri_) { return os << uri_.string(); } inline std::wostream &operator<<(std::wostream &os, const uri &uri_) { return os << uri_.wstring(); } inline std::istream &operator>>(std::istream &is, uri &uri_) { std::string uri_string; is >> uri_string; uri_ = uri(uri_string); return is; } inline std::wistream &operator>>(std::wistream &is, uri &uri_) { std::wstring uri_string; is >> uri_string; uri_ = uri(uri_string); return is; } #endif // !defined(NETWORK_URI_MSVC) } // namespace network #endif // NETWORK_URI_URI_IO_INC asymptote-3.05/LspCpp/third_party/uri/include/network/uri/uri_builder.hpp0000644000000000000000000001540515031566105025455 0ustar rootroot// Copyright (c) Glyn Matthews 2012-2016. // Copyright 2012 Dean Michael Berris // Copyright 2012 Google, Inc. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) /** * \file * \brief Contains the definition of the uri_builder. */ #ifndef NETWORK_URI_BUILDER_INC #define NETWORK_URI_BUILDER_INC #include #include #include #include #ifdef NETWORK_URI_MSVC #pragma warning(push) #pragma warning(disable : 4251 4231 4660) #endif namespace network { #if !defined(DOXYGEN_SHOULD_SKIP_THIS) namespace detail { template struct host_converter { uri::string_type operator()(const T &host) const { return detail::translate(host); } }; template struct port_converter { uri::string_type operator()(const T &port) const { return detail::translate(port); } }; template struct port_converter::type>::value>::type> { uri::string_type operator()(std::uint16_t port) const { return std::to_string(port); } }; template struct path_converter { uri::string_type operator()(const T &path) const { return detail::translate(path); } }; } // namespace detail #endif // !defined(DOXYGEN_SHOULD_SKIP_THIS) /** * \ingroup uri * \class uri_builder network/uri/uri_builder.hpp network/uri.hpp * \brief A class that allows complex uri objects to be constructed. * \sa uri */ class uri_builder { #if !defined(DOXYGEN_SHOULD_SKIP_THIS) friend class uri; #endif // !defined(DOXYGEN_SHOULD_SKIP_THIS) uri_builder(const uri_builder &) = delete; uri_builder &operator=(const uri_builder &) = delete; public: /** * \brief The uri_builder string_type. */ using string_type = network::uri::string_type; /** * \brief Constructor. */ uri_builder() = default; /** * \brief Constructor. * \param base A URI that is the base on which a new URI is built. */ explicit uri_builder(const uri &base); /** * \brief Destructor. */ ~uri_builder() noexcept; /** * \brief Adds a new scheme to the uri_builder. * \param scheme The scheme. * \returns \c *this */ template uri_builder &scheme(const Source &scheme) { set_scheme(detail::translate(scheme)); return *this; } /** * \brief Adds a new user info to the uri_builder. * \param user_info The user info. * \returns \c *this */ template uri_builder &user_info(const Source &user_info) { set_user_info(detail::translate(user_info)); return *this; } /** * \brief Clears the URI user_info part. * \returns \c *this */ uri_builder &clear_user_info(); /** * \brief Adds a new host to the uri_builder. * \param host The host. * \returns \c *this */ template uri_builder &host(const Source &host) { detail::host_converter convert; set_host(convert(host)); return *this; } /** * \brief Adds a new port to the uri_builder. * \param port The port. * \returns \c *this */ template uri_builder &port(const Source &port) { detail::port_converter convert; set_port(convert(port)); return *this; } /** * \brief Clears the URI port part. * \returns \c *this */ uri_builder &clear_port(); /** * \brief Adds a new authority to the uri_builder. * \param authority The authority. * \returns \c *this */ template uri_builder &authority(const Source &authority) { set_authority(detail::translate(authority)); return *this; } /** * \brief Sets a new path to the uri_builder. * \param path The path. * \returns \c *this */ template uri_builder &path(const Source &path) { detail::path_converter convert; set_path(convert(path)); return *this; } /** * \brief Clears the URI path part. * \returns \c *this */ uri_builder &clear_path(); /** * \deprecated Use append_query_component * \warning This function's behaviour has changed and percent encoding * of the '=' character is not ignored. * \brief Adds a new query to the uri_builder. * \param query The query. * \returns \c *this * \sa append_query_parameter */ template uri_builder &append_query(const Source &query) { return append_query_component(query); } /** * \brief Appends a new query component to the uri_builder. The * '=' symbol is percent encoded. * \param component The query component. * \returns \c *this * \sa append_query_key_value_pair */ template uri_builder &append_query_component(const Source &component) { append_query_component(detail::translate(component)); return *this; } /** * \brief Adds a new query key/value pair to the uri_builder. * \param key The query parameter key. * \param value The query parameter value. * \returns \c *this */ template uri_builder &append_query_key_value_pair(const Key &key, const Value &value) { append_query_key_value_pair(detail::translate(key), detail::translate(value)); return *this; } /** * \brief Clears the URI query part. * \returns \c *this */ uri_builder &clear_query(); /** * \brief Adds a new fragment to the uri_builder. * \param fragment The fragment. * \returns \c *this */ template uri_builder &fragment(const Source &fragment) { set_fragment(detail::translate(fragment)); return *this; } /** * \brief Clears the URI fragment part. * \returns \c *this */ uri_builder &clear_fragment(); /** * \brief Builds a new uri object. * \returns A valid uri object. * \throws uri_builder_error if the uri_builder is unable to build * a valid URI. * \throws std::bad_alloc If the underlying string cannot be * allocated. */ network::uri uri() const; private: void set_scheme(string_type &&scheme); void set_user_info(string_type &&user_info); void set_host(string_type &&host); void set_port(string_type &&port); void set_authority(string_type &&authority); void set_path(string_type &&path); void append_query_component(string_type &&name); void append_query_key_value_pair(string_type &&key, string_type &&value); void set_fragment(string_type &&fragment); optional scheme_, user_info_, host_, port_, path_, query_, fragment_; }; } // namespace network #ifdef NETWORK_URI_MSVC #pragma warning(pop) #endif #endif // NETWORK_URI_BUILDER_INC asymptote-3.05/LspCpp/third_party/uri/include/network/uri/uri_errors.hpp0000644000000000000000000000463315031566105025344 0ustar rootroot// Copyright 2013-2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_URI_ERRORS_INC #define NETWORK_URI_ERRORS_INC /** * \file * \brief Contains functions and exceptions for URI error handling. */ #include #include #ifdef NETWORK_URI_MSVC #pragma warning(push) #pragma warning(disable : 4251 4231 4660) // Disable C4275 too because it's "essentially noise and can be silenced" // according to Stephen T. Lavavej at Microsoft. See: // https://connect.microsoft.com/VisualStudio/feedback/details/696593/vc-10-vs-2010-basic-string-exports. #pragma warning(disable : 4275) #endif namespace network { #if !defined(DOXYGEN_SHOULD_SKIP_THIS) enum class uri_error { // parser errors invalid_syntax = 1, // builder errors invalid_uri, invalid_scheme, invalid_user_info, invalid_host, invalid_port, invalid_path, invalid_query, invalid_fragment, // encoding errors not_enough_input, non_hex_input, conversion_failed, }; const std::error_category &uri_category(); std::error_code make_error_code(uri_error e); #endif // !defined(DOXYGEN_SHOULD_SKIP_THIS) /** * \class uri_syntax_error uri.hpp network/uri.hpp * \brief An exception thrown by the \c uri constructor when a URI * cannot be parsed. */ class uri_syntax_error : public std::system_error { public: /** * \brief Constructor. */ uri_syntax_error(); /** * \brief Destructor. */ virtual ~uri_syntax_error() noexcept; }; /** * \class uri_builder_error uri.hpp network/uri.hpp * \brief An exception thrown when the \c uri_builder cannot build a * valid URI. */ class uri_builder_error : public std::system_error { public: /** * \brief Constructor. */ uri_builder_error(); /** * \brief Destructor. */ virtual ~uri_builder_error() noexcept; }; /** * \class percent_decoding_error uri.hpp network/uri.hpp * \brief An exception thrown when during percent decoding. */ class percent_decoding_error : public std::system_error { public: /** * \brief Constructor. */ explicit percent_decoding_error(uri_error error); /** * \brief Destructor. */ virtual ~percent_decoding_error() noexcept; }; } // namespace network #ifdef NETWORK_URI_MSVC #pragma warning(pop) #endif #endif // NETWORK_URI_ERRORS_INC asymptote-3.05/LspCpp/third_party/uri/include/network/uri/detail/0000755000000000000000000000000015031566105023674 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/include/network/uri/detail/encode.hpp0000644000000000000000000001052615031566105025646 0ustar rootroot// Copyright (c) Glyn Matthews 2011-2016. // Copyright 2012 Dean Michael Berris // Copyright 2012 Google, Inc. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_URI_ENCODE_INC #define NETWORK_URI_ENCODE_INC #include #include #include #include #include namespace network { namespace detail { template inline CharT hex_to_letter(CharT in) { if ((in >= 0) && (in < 10)) { return in + '0'; } if ((in >= 10) && (in < 16)) { return in - 10 + 'A'; } return in; } template void percent_encode(charT in, OutputIterator &out) { out++ = '%'; out++ = hex_to_letter((in >> 4) & 0x0f); out++ = hex_to_letter(in & 0x0f); } template bool is_unreserved(charT in) { // clang-format off return ((in >= 'a') && (in <= 'z')) || ((in >= 'A') && (in <= 'Z')) || ((in >= '0') && (in <= '9')) || (in == '-') || (in == '.') || (in == '_') || (in == '~'); // clang-format on } template void encode_char(charT in, OutputIterator &out, const char *ignore = "") { if (is_unreserved(in)) { out++ = in; } else { auto first = ignore, last = ignore + std::strlen(ignore); if (std::find(first, last, in) != last) { out++ = in; } else { percent_encode(in, out); } } } template OutputIterator encode_user_info(InputIterator first, InputIterator last, OutputIterator out) { auto it = first; while (it != last) { detail::encode_char(*it, out, ":"); ++it; } return out; } template OutputIterator encode_host(InputIterator first, InputIterator last, OutputIterator out) { auto it = first; while (it != last) { detail::encode_char(*it, out, "[:]"); ++it; } return out; } template OutputIterator encode_port(InputIterator first, InputIterator last, OutputIterator out) { auto it = first; while (it != last) { detail::encode_char(*it, out); ++it; } return out; } template OutputIterator encode_path(InputIterator first, InputIterator last, OutputIterator out) { auto it = first; while (it != last) { detail::encode_char(*it, out, "/.@%;="); ++it; } return out; } template OutputIterator encode_query_component(InputIterator first, InputIterator last, OutputIterator out) { auto it = first; while (it != last) { detail::encode_char(*it, out, "/?"); ++it; } return out; } template OutputIterator encode_fragment(InputIterator first, InputIterator last, OutputIterator out) { auto it = first; while (it != last) { detail::encode_char(*it, out, "/.@&l;=%"); ++it; } return out; } template String encode_user_info(const String &user_info) { String encoded; encode_user_info(std::begin(user_info), std::end(user_info), std::back_inserter(encoded)); return encoded; } template String encode_host(const String &host) { String encoded; encode_host(std::begin(host), std::end(host), std::back_inserter(encoded)); return encoded; } template String encode_port(const String &port) { String encoded; encode_port(std::begin(port), std::end(port), std::back_inserter(encoded)); return encoded; } template String encode_path(const String &path) { String encoded; encode_path(std::begin(path), std::end(path), std::back_inserter(encoded)); return encoded; } template String encode_fragment(const String &fragment) { String encoded; encode_fragment(std::begin(fragment), std::end(fragment), std::back_inserter(encoded)); return encoded; } } // namespace detail } // namespace network #endif // NETWORK_URI_ENCODE_INC asymptote-3.05/LspCpp/third_party/uri/include/network/uri/detail/translate.hpp0000644000000000000000000000441015031566105026401 0ustar rootroot// Copyright (c) Glyn Matthews 2012-2016. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_URI_DETAIL_TRANSLATE_INC #define NETWORK_URI_DETAIL_TRANSLATE_INC #include #include namespace network { namespace detail { template struct translate_impl; template <> struct translate_impl { std::string operator()(const std::string &source) const { return source; } }; template struct translate_impl { std::string operator()(const char *source) const { return source; } }; template <> struct translate_impl { std::string operator()(const char *source) const { return source; } }; template <> struct translate_impl { std::string operator()(const char *source) const { return source; } }; template struct translate_impl { std::string operator()(const char *source) const { return source; } }; template <> struct translate_impl { std::string operator()(const std::wstring &source) const { std::string ret(source.length(), 0); std::transform( source.begin(), source.end(), ret.begin(), [](wchar_t ch) { return static_cast(ch); } ); return ret; } }; template struct translate_impl { std::string operator()(const wchar_t *source) const { translate_impl impl; return impl(source); } }; template struct translate_impl { std::string operator()(const wchar_t *source) const { translate_impl impl; return impl(source); } }; template <> struct translate_impl { std::string operator()(const wchar_t *source) const { translate_impl impl; return impl(source); } }; template <> struct translate_impl { std::string operator()(const wchar_t *source) const { translate_impl impl; return impl(source); } }; template inline std::string translate(const Source &source) { translate_impl impl; return impl(source); } } // namespace detail } // namespace network #endif // NETWORK_URI_DETAIL_TRANSLATE_INC asymptote-3.05/LspCpp/third_party/uri/include/network/uri/detail/uri_parts.hpp0000644000000000000000000000403115031566105026413 0ustar rootroot// Copyright 2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_DETAIL_URI_PARTS_INC #define NETWORK_DETAIL_URI_PARTS_INC #include #include #include #include #include namespace network { namespace detail { class uri_part { public: typedef string_view::value_type value_type; typedef string_view::iterator iterator; typedef string_view::const_iterator const_iterator; typedef string_view::const_pointer const_pointer; typedef string_view::size_type size_type; typedef string_view::difference_type difference_type; uri_part() noexcept = default; uri_part(const_iterator first, const_iterator last) noexcept : first(first), last(last) {} const_iterator begin() const noexcept { return first; } const_iterator end() const noexcept { return last; } bool empty() const noexcept { return first == last; } std::string to_string() const { return std::string(first, last); } const_pointer ptr() const noexcept { assert(first != last); return first; } difference_type length() const noexcept { return last - first; } string_view to_string_view() const noexcept { return string_view(ptr(), length()); } private: const_iterator first, last; }; struct hierarchical_part { hierarchical_part() = default; optional user_info; optional host; optional port; optional path; void clear() { user_info = nullopt; host = nullopt; port = nullopt; path = nullopt; } }; struct uri_parts { uri_parts() = default; optional scheme; hierarchical_part hier_part; optional query; optional fragment; void clear() { scheme = nullopt; hier_part.clear(); query = nullopt; fragment = nullopt; } }; } // namespace detail } // namespace network #endif // NETWORK_DETAIL_URI_PARTS_INC asymptote-3.05/LspCpp/third_party/uri/include/network/uri/detail/decode.hpp0000644000000000000000000000355215031566105025635 0ustar rootroot// Copyright (c) Glyn Matthews 2011-2016. // Copyright 2012 Dean Michael Berris // Copyright 2012 Google, Inc. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_URI_DECODE_INC #define NETWORK_URI_DECODE_INC #include #include #include namespace network { namespace detail { template CharT letter_to_hex(CharT in) { if ((in >= '0') && (in <= '9')) { return in - '0'; } if ((in >= 'a') && (in <= 'f')) { return in + 10 - 'a'; } if ((in >= 'A') && (in <= 'F')) { return in + 10 - 'A'; } throw percent_decoding_error(uri_error::non_hex_input); } template InputIterator decode_char(InputIterator it, charT *out) { assert(*it == '%'); ++it; auto h0 = *it; auto v0 = detail::letter_to_hex(h0); ++it; auto h1 = *it; auto v1 = detail::letter_to_hex(h1); ++it; *out = static_cast((0x10 * v0) + v1); return it; } template OutputIterator decode(InputIterator in_begin, InputIterator in_end, OutputIterator out_begin) { auto it = in_begin; auto out = out_begin; while (it != in_end) { if (*it == '%') { if (std::distance(it, in_end) < 3) { throw percent_decoding_error(uri_error::not_enough_input); } char c = '\0'; it = decode_char(it, &c); *out = c; ++out; } else { *out++ = *it++; } } return out; } template String decode(const String &source) { String unencoded; decode(std::begin(source), std::end(source), std::back_inserter(unencoded)); return unencoded; } } // namespace detail } // namespace network #endif // NETWORK_URI_DECODE_INC asymptote-3.05/LspCpp/third_party/uri/include/network/uri/uri.hpp0000644000000000000000000005275615031566105023761 0ustar rootroot// Copyright 2009-2010 Jeroen Habraken. // Copyright 2009-2017 Dean Michael Berris, Glyn Matthews. // Copyright 2012 Google, Inc. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_URI_INC #define NETWORK_URI_INC /** * \file * \brief Contains the uri class. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef NETWORK_URI_MSVC #pragma warning(push) #pragma warning(disable : 4251 4231 4660) #endif namespace network { /** * \enum uri_comparison_level * \brief Defines the steps on the URI comparison ladder. */ enum class uri_comparison_level { string_comparison, syntax_based, scheme_based, }; /** * \ingroup uri * \class uri_builder network/uri/uri_builder.hpp network/uri.hpp * \brief A class that allows complex uri objects to be constructed. * \sa uri */ class uri_builder; /** * \ingroup uri * \class uri network/uri/uri.hpp network/uri.hpp * \brief A class that parses a URI (Uniform Resource Identifier) * into its component parts. * * This class conforms to a URI as defined by RFC 3986, RFC 3987 and * RFC 2732, including scoped IDs. It provides member functions for * normalizing, comparing and resolving URIs. * * A URI has the syntax: * * \code * [scheme:][user_info@][host][:port][path][?query][#fragment] * \endcode * * Example: * * \code * network::uri instance("http://cpp-netlib.org/"); * assert(instance.is_absolute()); * assert(!instance.is_opaque()); * assert(instance.scheme()); * assert("http" == *instance.scheme()); * assert(instance.host()); * assert("cpp-netlib.org" == *instance.host()); * assert(instance.path()); * assert("/" == *instance.path()); * \endcode */ class uri { #if !defined(DOXYGEN_SHOULD_SKIP_THIS) friend class uri_builder; #endif // !defined(DOXYGEN_SHOULD_SKIP_THIS) public: /** * \brief The URI string_type. */ typedef std::string string_type; /** * \brief A reference to the underlying string_type parts. */ typedef network::string_view string_view; /** * \brief The char traits. */ typedef string_view::traits_type traits_type; /** * \brief The URI const_iterator type. */ typedef string_view::const_iterator const_iterator; /** * \brief The URI iterator type. */ typedef const_iterator iterator; /** * \brief The URI value_type. */ typedef std::iterator_traits::value_type value_type; /** * */ class query_iterator { public: using value_type = std::pair; using difference_type = std::ptrdiff_t; using pointer = const value_type *; using reference = const value_type &; using iterator_category = std::forward_iterator_tag; query_iterator(); explicit query_iterator(optional); query_iterator(const query_iterator &); query_iterator &operator=(const query_iterator &); reference operator++() noexcept; value_type operator++(int) noexcept; reference operator*() const noexcept; pointer operator->() const noexcept; bool operator==(const query_iterator &) const noexcept; inline bool operator!=(const query_iterator &other) const noexcept { return !(*this == other); } private: void swap(query_iterator &) noexcept; void advance_to_next_kvp() noexcept; void assign_kvp() noexcept; void increment() noexcept; optional query_; value_type kvp_; }; /** * \brief Default constructor. */ uri(); /** * \brief Constructor. * \param first The first element in a string sequence. * \param last The end + 1th element in a string sequence. * \throws uri_syntax_error if the sequence is not a valid URI. * \throws std::bad_alloc If the underlying string cannot be allocated. */ template uri(InputIter first, InputIter last) { if (!initialize(string_type(first, last))) { throw uri_syntax_error(); } } #if !defined(DOXYGEN_SHOULD_SKIP_THIS) template explicit uri(InputIter first, InputIter last, std::error_code &ec) { if (!initialize(string_type(first, last))) { ec = make_error_code(uri_error::invalid_syntax); } } #endif // !defined(DOXYGEN_SHOULD_SKIP_THIS) /** * \brief Constructor. * \param source A source string that is to be parsed as a URI. * \throws uri_syntax_error if the source is not a valid URI. * \throws std::bad_alloc If the underlying string cannot be allocated. */ template explicit uri(const Source &source) { if (!initialize(detail::translate(source))) { throw uri_syntax_error(); } } #if !defined(DOXYGEN_SHOULD_SKIP_THIS) template explicit uri(const Source &source, std::error_code &ec) { if (!initialize(detail::translate(source))) { ec = make_error_code(uri_error::invalid_syntax); } } #endif // !defined(DOXYGEN_SHOULD_SKIP_THIS) #if !defined(DOXYGEN_SHOULD_SKIP_THIS) explicit uri(const uri_builder &builder); #endif // !defined(DOXYGEN_SHOULD_SKIP_THIS) /** * \brief Copy constructor. * \throws std::bad_alloc If the underlying string cannot be allocated. */ uri(const uri &other); /** * \brief Move constructor. */ uri(uri &&other) noexcept; /** * \brief Destructor. */ ~uri(); /** * \brief Assignment operator. * \throws std::bad_alloc If the underlying string cannot be allocated. */ uri &operator=(uri other); /** * \brief Swaps one uri object with another. * \param other The other uri object. */ void swap(uri &other) noexcept; /** * \brief Returns an iterator at the first element in the * underlying sequence. * \return An iterator starting at the first element. */ const_iterator begin() const noexcept; /** * \brief Returns an iterator at the end + 1th element in the * underlying sequence. * \return An iterator starting at the end + 1th element. */ const_iterator end() const noexcept; /** * \brief Tests whether this URI has a scheme component. * \return \c true if the URI has a scheme, \c false otherwise. */ bool has_scheme() const noexcept; /** * \brief Returns the URI scheme. * \return The scheme. * \pre has_scheme() */ string_view scheme() const noexcept; /** * \brief Tests whether this URI has a user info component. * \return \c true if the URI has a user info, \c false otherwise. */ bool has_user_info() const noexcept; /** * \brief Returns the URI user info. * \return The user info. * \pre has_user_info() */ string_view user_info() const noexcept; /** * \brief Tests whether this URI has a host component. * \return \c true if the URI has a host, \c false otherwise. */ bool has_host() const noexcept; /** * \brief Returns the URI host. * \return The host. * \pre has_host() */ string_view host() const noexcept; /** * \brief Tests whether this URI has a port component. * \return \c true if the URI has a port, \c false otherwise. */ bool has_port() const noexcept; /** * \brief Returns the URI port. * \return The port. * \pre has_port() */ string_view port() const noexcept; /** * \brief Returns the URI port as an integer. * \return The port number. * \pre has_port() */ template intT port(typename std::is_integral::type * = 0) const { assert(has_port()); auto p = port(); const char *port_first = std::addressof(*p.begin()); char *port_last = 0; return static_cast(std::strtoul(port_first, &port_last, 10)); } /** * \brief Tests whether this URI has a path component. * \return \c true if the URI has a path, \c false otherwise. */ bool has_path() const noexcept; /** * \brief Returns the URI path. * \return The path. * \pre has_path() */ string_view path() const noexcept; /** * \brief Tests whether this URI has a query component. * \return \c true if the URI has a query, \c false otherwise. */ bool has_query() const noexcept; /** * \brief Returns the URI query. * \return The query. * \pre has_query() */ string_view query() const noexcept; /** * \brief Returns an iterator to the first key-value pair in the query * component. * * \return query_iterator. */ query_iterator query_begin() const noexcept; /** * \brief Returns an iterator to the last key-value pair in the query * component. * * \return query_iterator. */ query_iterator query_end() const noexcept; /** * \brief Tests whether this URI has a fragment component. * \return \c true if the URI has a fragment, \c false otherwise. */ bool has_fragment() const noexcept; /** * \brief Returns the URI fragment. * \return The fragment. * \pre has_fragment() */ string_view fragment() const noexcept; /** * \brief Tests whether this URI has a valid authority. * \return \c true if the URI has an authority, \c false otherwise. */ bool has_authority() const noexcept; /** * \brief Returns the URI authority. * \return The authority. */ string_view authority() const noexcept; /** * \brief Returns the URI as a std::basic_string object. * \return A URI string. */ template , class Allocator = std::allocator > std::basic_string to_string( const Allocator &alloc = Allocator()) const { return std::basic_string(begin(), end()); } /** * \brief Returns the URI as a std::string object. * \returns A URI string. */ std::string string() const; /** * \brief Returns the URI as a std::wstring object. * \returns A URI string. */ std::wstring wstring() const; /** * \brief Returns the URI as a std::u16string object. * \returns A URI string. */ std::u16string u16string() const; /** * \brief Returns the URI as a std::u32string object. * \returns A URI string. */ std::u32string u32string() const; /** * \brief Returns the URI as a string_view object. * \returns A URI string view. */ string_view view() const noexcept; /** * \brief Checks if the uri object is empty, i.e. it has no parts. * \returns \c true if there are no parts, \c false otherwise. */ bool empty() const noexcept; /** * \brief Checks if the uri is absolute, i.e. it has a scheme. * \returns \c true if it is absolute, \c false if it is relative. */ bool is_absolute() const noexcept; /** * \brief Checks if the uri is opaque, i.e. if it doesn't have an * authority. * \returns \c true if it is opaque, \c false if it is hierarchical. */ bool is_opaque() const noexcept; /** * \brief Normalizes a uri object at a given level in the * comparison ladder. * \param level The comparison level. * \returns A normalized uri. * \post compare(normalize(uri, level), level) == 0 * \throws std::bad_alloc */ uri normalize(uri_comparison_level level) const; /** * \brief Returns a relative reference against the base URI. * \param base The base URI. * \returns A relative reference of this URI against the base. * \throws std::bad_alloc */ uri make_relative(const uri &base) const; /** * \brief Resolves a relative reference against the given URI. * \param base The base URI to resolve against. * \returns An absolute URI. * \throws std::bad_alloc */ uri resolve(const uri &base) const; /** * \brief Compares this URI against another, corresponding to the * level in the comparison ladder. * \param other The other URI. * \param level The level in the comparison ladder. * \returns \c 0 if the URIs are considered equal, \c -1 if this is * less than other and and 1 if this is greater than * other. */ int compare(const uri &other, uri_comparison_level level) const noexcept; /** * \brief Encodes a sequence according to the rules for encoding a * user info part. * \param first The iterator at first element in the input * sequence. * \param last The iterator at end + 1th element in the input * sequence. * \param out The iterator at the first element in the output * sequence. * \returns The iterator at the end + 1th in the output sequence. */ template static OutputIter encode_user_info(InputIter first, InputIter last, OutputIter out) { return detail::encode_user_info(first, last, out); } /** * \brief Encodes a sequence according to the rules for encoding a * host part. * \param first The iterator at first element in the input * sequence. * \param last The iterator at end + 1th element in the input * sequence. * \param out The iterator at the first element in the output * sequence. * \returns The iterator at the end + 1th in the output sequence. */ template static OutputIter encode_host(InputIter first, InputIter last, OutputIter out) { return detail::encode_host(first, last, out); } /** * \brief Encodes a sequence according to the rules for encoding a * port part. * \param first The iterator at first element in the input * sequence. * \param last The iterator at end + 1th element in the input * sequence. * \param out The iterator at the first element in the output * sequence. * \returns The iterator at the end + 1th in the output sequence. */ template static OutputIter encode_port(InputIter first, InputIter last, OutputIter out) { return detail::encode_port(first, last, out); } /** * \brief Encodes a sequence according to the rules for encoding a * path part. * \param first The iterator at first element in the input * sequence. * \param last The iterator at end + 1th element in the input * sequence. * \param out The iterator at the first element in the output * sequence. * \returns The iterator at the end + 1th in the output sequence. */ template static OutputIter encode_path(InputIter first, InputIter last, OutputIter out) { return detail::encode_path(first, last, out); } /** * \deprecated Avoid using this function * \brief Equivalent to \c encode_query_component * \param first The iterator at first element in the input * sequence. * \param last The iterator at end + 1th element in the input * sequence. * \param out The iterator at the first element in the output * sequence. * \returns The iterator at the end + 1th in the output sequence. * \sa encode_query_commponent * \sa encode_query_key_value_pair */ template static OutputIter encode_query(InputIter first, InputIter last, OutputIter out) { return encode_query_component(first, last, out); } /** * \brief Encodes a sequence according to the rules for encoding a * query component, including the '=' character. * \param first The iterator at first element in the input * sequence. * \param last The iterator at end + 1th element in the input * sequence. * \param out The iterator at the first element in the output * sequence. * \returns The iterator at the end + 1th in the output sequence. */ template static OutputIter encode_query_component(InputIter first, InputIter last, OutputIter out) { return detail::encode_query_component(first, last, out); } /** * \brief Encodes a sequence according to the rules for encoding a * query key value pair. * \param key_first The iterator at first element in the input * sequence. * \param key_last The iterator at end + 1th element in the input * sequence. * \param out The iterator at the first element in the output * sequence. * \returns The iterator at the end + 1th in the output sequence. */ template static OutputIter encode_query_key_value_pair(InputIter key_first, InputIter key_last, InputIter value_first, InputIter value_last, OutputIter out) { out = detail::encode_query_component(key_first, key_last, out); out++ = '='; return detail::encode_query_component(value_first, value_last, out); } /** * \brief Encodes a sequence according to the rules for encoding a * fragment part. * \param first The iterator at first element in the input * sequence. * \param last The iterator at end + 1th element in the input * sequence. * \param out The iterator at the first element in the output * sequence. * \returns The iterator at the end + 1th in the output sequence. */ template static OutputIter encode_fragment(InputIter first, InputIter last, OutputIter out) { return detail::encode_fragment(first, last, out); } /** * \brief Decodes a sequence according to the percent decoding * rules. * \param first The iterator at first element in the input * sequence. * \param last The iterator at end + 1th element in the input * sequence. * \param out The iterator at the first element in the output * sequence. * \returns The iterator at the end + 1th in the output sequence. */ template static OutputIter decode(InputIter first, InputIter last, OutputIter out) { return detail::decode(first, last, out); } private: bool initialize(const string_type &uri); void initialize(optional scheme, optional user_info, optional host, optional port, optional path, optional query, optional fragment); string_type uri_; string_view uri_view_; detail::uri_parts uri_parts_; }; /** * \brief \c uri factory function. * \param first The first element in a string sequence. * \param last The end + 1th element in a string sequence. * \param ec Error code set if the sequence is not a valid URI. */ template inline uri make_uri(InputIter first, InputIter last, std::error_code &ec) { return uri(first, last, ec); } /** * \brief \c uri factory function. * \param source A source string that is to be parsed as a URI. * \param ec Error code set if the source is not a valid URI. */ template inline uri make_uri(const Source &source, std::error_code &ec) { return uri(source, ec); } /** * \brief Swaps one uri object with another. */ void swap(uri &lhs, uri &rhs) noexcept; /** * \brief Equality operator for the \c uri. */ bool operator==(const uri &lhs, const uri &rhs) noexcept; /** * \brief Equality operator for the \c uri. */ bool operator==(const uri &lhs, const char *rhs) noexcept; /** * \brief Equality operator for the \c uri. */ inline bool operator==(const char *lhs, const uri &rhs) noexcept { return rhs == lhs; } /** * \brief Inequality operator for the \c uri. */ inline bool operator!=(const uri &lhs, const uri &rhs) noexcept { return !(lhs == rhs); } /** * \brief Less-than operator for the \c uri. */ bool operator<(const uri &lhs, const uri &rhs) noexcept; /** * \brief Greater-than operator for the \c uri. */ inline bool operator>(const uri &lhs, const uri &rhs) noexcept { return rhs < lhs; } /** * \brief Less-than-or-equal-to operator for the \c uri. */ inline bool operator<=(const uri &lhs, const uri &rhs) noexcept { return !(rhs < lhs); } /** * \brief Greater-than-or-equal-to operator for the \c uri. */ inline bool operator>=(const uri &lhs, const uri &rhs) noexcept { return !(lhs < rhs); } } // namespace network #if !defined(DOXYGEN_SHOULD_SKIP_THIS) namespace std { template <> struct is_error_code_enum : public true_type {}; } // namespace std namespace std { template <> struct hash { std::size_t operator()(const network::uri &uri_) const { std::size_t seed = 0; std::for_each(std::begin(uri_), std::end(uri_), [&seed](network::uri::value_type v) { std::hash hasher; seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); }); return seed; } }; } // namespace std #endif // !defined(DOXYGEN_SHOULD_SKIP_THIS) #ifdef NETWORK_URI_MSVC #pragma warning(pop) #endif #include #endif // NETWORK_URI_INC asymptote-3.05/LspCpp/third_party/uri/include/network/string_view.hpp0000644000000000000000000001706315031566105024713 0ustar rootroot// Copyright 2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_STRING_VIEW_INC #define NETWORK_STRING_VIEW_INC /** * \file * \brief Contains an implementation of C++17 string_view (n3921). */ #include #include #include #include #include namespace network { /** * \class basic_string_view string_view.hpp network/uri/string_view.hpp * \brief An implementation of C++17 string_view (n3921) */ template > class basic_string_view { public: typedef traits traits_type; typedef charT value_type; typedef charT *pointer; typedef const charT *const_pointer; typedef charT &reference; typedef const charT &const_reference; typedef const charT *const_iterator; typedef const_iterator iterator; typedef std::reverse_iterator const_reverse_iterator; typedef const_reverse_iterator reverse_iterator; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; static constexpr size_type npos = size_type(-1); /** * \brief Constructor. */ constexpr basic_string_view() noexcept : data_(nullptr), size_(0) {} /** * \brief Copy constructor. */ constexpr basic_string_view(const basic_string_view &) noexcept = default; /** * \brief Assignment operator. */ basic_string_view &operator=(const basic_string_view &) noexcept = default; /** * \brief Constructor. */ template basic_string_view( const std::basic_string &str) noexcept : data_(str.data()), size_(str.size()) {} /** * \brief Constructor. */ constexpr basic_string_view(const charT *str) : data_(str), size_(traits::length(str)) {} /** * \brief Constructor. */ constexpr basic_string_view(const charT *str, size_type len) : data_(str), size_(len) {} constexpr const_iterator begin() const noexcept { return data_; } constexpr const_iterator end() const noexcept { return data_ + size_; } constexpr const_iterator cbegin() const noexcept { return begin(); } constexpr const_iterator cend() const noexcept { return end(); } const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); } const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); } const_reverse_iterator crbegin() const noexcept { return rbegin(); } const_reverse_iterator crend() const noexcept { return rend(); } constexpr size_type size() const noexcept { return size_; } constexpr size_type length() const noexcept { return size_; } constexpr size_type max_size() const noexcept { return size_; } constexpr bool empty() const noexcept { return size_ == 0; } constexpr const_reference operator[](size_type pos) const { return data_[pos]; } const_reference at(size_type pos) const { if (pos >= size_) { throw std::out_of_range("Index out of range."); } return data_[pos]; } const_reference front() const { return *begin(); } const_reference back() const { auto last = (end()) - 1; return *last; } constexpr const_pointer data() const noexcept { return data_; } void clear() noexcept { data_ = nullptr; size_ = 0; } void remove_prefix(size_type n) { data_ += n; size_ -= n; } void remove_suffix(size_type n) { size_ -= n; } void swap(basic_string_view &s) noexcept { std::swap(data_, s.data_); std::swap(size_, s.size_); } template explicit operator std::basic_string() const { return to_string(); } template > std::basic_string to_string( const Allocator &a = Allocator()) const { return std::basic_string(begin(), end(), a); } size_type copy(charT *s, size_type n, size_type pos = 0) const { size_type rlen = std::min(n, size() - pos); std::copy_n(begin() + pos, rlen, s); return rlen; } constexpr basic_string_view substr(size_type pos = 0, size_type n = npos) const { return basic_string_view(data() + pos, std::min(n, size() - pos)); } constexpr int compare(basic_string_view s) const noexcept { return size() == s.size() ? traits::compare(data(), s.data(), size()) : (size() < s.size() ? (traits::compare(data(), s.data(), size()) > 0 ? 1 : -1) : (traits::compare(data(), s.data(), size()) < 0 ? -1 : 1)); } constexpr int compare(size_type pos1, size_type n1, basic_string_view s) const { return substr(pos1, n1).compare(s); } constexpr int compare(size_type pos1, size_type n1, basic_string_view s, size_type pos2, size_type n2) const { return substr(pos1, n1).compare(s.substr(pos2, n2)); } constexpr int compare(const charT *s) const { return compare(basic_string_view(s)); } constexpr int compare(size_type pos1, size_type n1, const charT *s) const { return substr(pos1, n1).compare(basic_string_view(s)); } constexpr int compare(size_type pos1, size_type n1, const charT *s, size_type n2) const { return substr(pos1, n1).compare(basic_string_view(s, n2)); } private: const_pointer data_; size_type size_; }; /** * \brief Equality operator. * \returns lhs.compare(rhs) == 0. */ template constexpr bool operator==(basic_string_view lhs, basic_string_view rhs) noexcept { return lhs.compare(rhs) == 0; } /** * \brief Inequality operator. * \returns !(lhs == rhs). */ template constexpr bool operator!=(basic_string_view lhs, basic_string_view rhs) noexcept { return !(lhs == rhs); } /** * \brief Comparison operator. * \returns lhs.compare(rhs) < 0. */ template constexpr bool operator<(basic_string_view lhs, basic_string_view rhs) noexcept { return lhs.compare(rhs) < 0; } /** * \brief Comparison operator. * \returns rhs < lhs. */ template constexpr bool operator>(basic_string_view lhs, basic_string_view rhs) noexcept { return rhs < lhs; } /** * \brief Comparison operator. * \returns !(lhs > rhs). */ template constexpr bool operator<=(basic_string_view lhs, basic_string_view rhs) noexcept { return !(lhs > rhs); } /** * \brief Comparison operator. * \returns !(lhs < rhs). */ template constexpr bool operator>=(basic_string_view lhs, basic_string_view rhs) noexcept { return !(lhs < rhs); } /** * \brief Output stream operator. */ template std::basic_ostream &operator<<( std::basic_ostream &os, basic_string_view str) { return os << str.to_string(); } typedef basic_string_view string_view; } // namespace network #endif // NETWORK_STRING_VIEW_INC asymptote-3.05/LspCpp/third_party/uri/include/network/uri.hpp0000644000000000000000000000200715031566105023142 0ustar rootroot// Copyright (c) Glyn Matthews 2012-2016. // Copyright 2012 Dean Michael Berris // Copyright 2012 Google, Inc. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_URI_HPP #define NETWORK_URI_HPP /** * \defgroup uri URI * * This module contains a class encapsulating a URI, a URI builder and * percent encoding and decoding functions. * * \defgroup optional Optional * * This module contains a utility to represent optional values. * * \defgroup string String * * This module contains a class for a non-owning reference to a string. * * \namespace network * * The \c network namespace contains all the classes and functions for * the URI in this library. * * \file * \brief Contains the uri, uri_builder classes and functions * for percent encoding and decoding. */ #include #include #endif // NETWORK_URI_HPP asymptote-3.05/LspCpp/third_party/uri/LICENSE_1_0.txt0000644000000000000000000000247215031566105021006 0ustar rootrootBoost Software License - Version 1.0 - August 17th, 2003 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. asymptote-3.05/LspCpp/third_party/uri/CMakeLists.txt0000644000000000000000000000632215031566105021262 0ustar rootroot# Copyright (c) Glyn Matthews 2012-2017. # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) cmake_minimum_required(VERSION 3.13) project(Uri) option(Uri_BUILD_TESTS "Build the URI tests." ON) option(Uri_BUILD_DOCS "Build the URI documentation." ON) option(Uri_FULL_WARNINGS "Build the library with all warnings turned on." ON) option(Uri_WARNINGS_AS_ERRORS "Treat warnings as errors." ON) option(Uri_USE_STATIC_CRT "Use static C Runtime library (/MT or MTd)." ON) option(Uri_DISABLE_LIBCXX "Disable libc++ (only applies if compiler is clang)" OFF) find_package(Threads REQUIRED) set(CMAKE_VERBOSE_MAKEFILE true) message(STATUS "Configure compiler") message("Using ${CMAKE_CXX_COMPILER_ID}") if (${CMAKE_CXX_COMPILER_ID} MATCHES GNU) INCLUDE(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG(-std=c++11 HAVE_STD11) if (HAVE_STD11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") else() message(FATAL_ERROR "No C++ 11 support (Compiler does not define -std=c++11).") endif() if (Uri_FULL_WARNINGS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") endif() if (Uri_WARNINGS_AS_ERRORS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wno-parentheses") endif() message("C++ Flags: ${CMAKE_CXX_FLAGS} link flags: ${CMAKE_CXX_LINK_FLAGS}") elseif(${CMAKE_CXX_COMPILER_ID} MATCHES Clang) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") if (NOT Uri_DISABLE_LIBCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") endif() if (Uri_FULL_WARNINGS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") endif() if (Uri_WARNINGS_AS_ERRORS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wno-parentheses") endif() message("C++ Flags: ${CMAKE_CXX_FLAGS} link flags: ${CMAKE_CXX_LINK_FLAGS}") endif() if (MSVC) if(DEFINED MSVC_VERSION AND MSVC_VERSION LESS 1900) message(FATAL_ERROR "Requires VS 2015 or later") endif() if (Uri_USE_STATIC_CRT) # Replace dynamic MSVCRT linker flags with static version. foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) if(${flag_var} MATCHES "/MD") string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") endif(${flag_var} MATCHES "/MD") endforeach(flag_var) endif(Uri_USE_STATIC_CRT) add_definitions(-D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_DEPRECATE) endif(MSVC) include_directories(${Uri_SOURCE_DIR}/src ${Uri_SOURCE_DIR}/include) add_subdirectory(src) # Testing if (Uri_BUILD_TESTS) message(STATUS "Configuring tests") enable_testing() add_subdirectory(deps/googletest) add_subdirectory(test) endif() # Documentation if (Uri_BUILD_DOCS) message("Configuring documentation") find_package(Doxygen) if (DOXYGEN_FOUND) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) add_custom_target(doc ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Generating API documentation with Doxygen" VERBATIM) endif() endif() install(DIRECTORY include DESTINATION ".") asymptote-3.05/LspCpp/third_party/uri/src/0000755000000000000000000000000015031566776017324 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/src/CMakeLists.txt0000644000000000000000000000176015031566105022052 0ustar rootroot# Copyright (c) Glyn Matthews 2012-2016. # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) set(Uri_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/uri.cpp ${CMAKE_CURRENT_SOURCE_DIR}/uri_builder.cpp ${CMAKE_CURRENT_SOURCE_DIR}/uri_errors.cpp ${CMAKE_CURRENT_SOURCE_DIR}/detail/uri_parse.cpp ${CMAKE_CURRENT_SOURCE_DIR}/detail/uri_parse_authority.cpp ${CMAKE_CURRENT_SOURCE_DIR}/detail/uri_advance_parts.cpp ${CMAKE_CURRENT_SOURCE_DIR}/detail/uri_normalize.cpp ${CMAKE_CURRENT_SOURCE_DIR}/detail/uri_resolve.cpp ) add_library(network-uri ${Uri_SRCS}) target_link_libraries(network-uri) if(${CMAKE_CXX_COMPILER_ID} MATCHES Clang) if (NOT Uri_DISABLE_LIBCXX) target_link_libraries(network-uri "c++") endif() endif() #propagate sources to parent scope for one-lib-build set(Uri_SRCS ${Uri_SRCS} PARENT_SCOPE) install( TARGETS network-uri ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) asymptote-3.05/LspCpp/third_party/uri/src/detail/0000755000000000000000000000000015031566105020550 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/src/detail/uri_parse_authority.hpp0000644000000000000000000000130615031566105025362 0ustar rootroot// Copyright 2013-2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_DETAIL_URI_PARSE_AUTHORITY_INC #define NETWORK_DETAIL_URI_PARSE_AUTHORITY_INC #include namespace network { namespace detail { bool parse_authority(string_view::const_iterator &first, string_view::const_iterator last, optional &user_info, optional &host, optional &port); } // namespace detail } // namespace network #endif // NETWORK_DETAIL_URI_PARSE_AUTHORITY_INC asymptote-3.05/LspCpp/third_party/uri/src/detail/uri_advance_parts.hpp0000644000000000000000000000117715031566105024760 0ustar rootroot// Copyright 2013-2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_DETAIL_URI_ADVANCE_INC #define NETWORK_DETAIL_URI_ADVANCE_INC #include namespace network { namespace detail { uri_part copy_part(const std::string &part, string_view::const_iterator &it); void advance_parts(string_view uri_view, uri_parts &parts, const uri_parts &existing_parts); } // namespace detail } // namespace network #endif // NETWORK_DETAIL_URI_ADVANCE_INC asymptote-3.05/LspCpp/third_party/uri/src/detail/uri_resolve.cpp0000644000000000000000000000473615031566105023624 0ustar rootroot// Copyright 2013-2016 Glyn Matthews. // Copyright 2013 Hannes Kamecke. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include "uri_resolve.hpp" #include "algorithm_find.hpp" using namespace network::algorithm; using network::uri; using network::string_view; namespace network_detail = network::detail; namespace { // remove_dot_segments inline void remove_last_segment(std::string &path) { while (!path.empty()) { if (path.back() == '/') { path.pop_back(); break; } path.pop_back(); } } inline bool starts_with(std::string const &str, const char *range) { return str.find(range) == 0; } // implementation of http://tools.ietf.org/html/rfc3986#section-5.2.4 static std::string remove_dot_segments(std::string input) { std::string result; while (!input.empty()) { if (starts_with(input, "../")) { input.erase(0, 3); } else if (starts_with(input, "./")) { input.erase(0, 2); } else if (starts_with(input, "/./")) { input.erase(0, 2); input.front() = '/'; } else if (input == "/.") { input.erase(0, 1); input.front() = '/'; } else if (starts_with(input, "/../")) { input.erase(0, 3); remove_last_segment(result); } else if (starts_with(input, "/..")) { input.erase(0, 2); input.front() = '/'; remove_last_segment(result); } else if (all(input, [](char ch) { return ch == '.'; })) { input.clear(); } else { int n = (input.front() == '/') ? 1 : 0; std::string::iterator slash = find_nth(input, '/', n); result.append(std::begin(input), slash); input.erase(std::begin(input), slash); } } return result; } } // namespace std::string network_detail::remove_dot_segments(string_view path) { return ::remove_dot_segments(path.to_string()); } // implementation of http://tools.ietf.org/html/rfc3986#section-5.2.3 std::string network_detail::merge_paths(const uri &base, const uri &reference) { std::string result; if (!base.has_path() || base.path().empty()) { result = "/"; } else { const auto &base_path = base.path(); auto last_slash = algorithm::find_last(base_path, '/'); if (last_slash != base_path.cend()) ++last_slash; result.append(std::begin(base_path), last_slash); } if (reference.has_path()) { result.append(reference.path().to_string()); } return remove_dot_segments(string_view(result)); } asymptote-3.05/LspCpp/third_party/uri/src/detail/uri_parse_authority.cpp0000644000000000000000000000566415031566105025370 0ustar rootroot// Copyright 2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include "uri_parse_authority.hpp" #include #include #include #include "grammar.hpp" namespace network { namespace detail { namespace { enum class authority_state { user_info, host, host_ipv6, port }; } // namespace bool parse_authority(string_view::const_iterator &it, string_view::const_iterator last, optional &user_info, optional &host, optional &port) { auto first = it; auto state = authority_state::user_info; while (it != last) { if (state == authority_state::user_info) { if (is_in(first, last, "@:")) { return false; } if (*it == '@') { user_info = uri_part(first, it); state = authority_state::host; ++it; first = it; continue; } else if (*it == '[') { // this is an IPv6 address state = authority_state::host_ipv6; first = it; continue; } else if (*it == ':') { // this is actually the host, and the next part is expected to be the // port host = uri_part(first, it); state = authority_state::port; ++it; first = it; continue; } } else if (state == authority_state::host) { if (*first == ':') { return false; } if (*it == ':') { host = uri_part(first, it); state = authority_state::port; ++it; first = it; continue; } } else if (state == authority_state::host_ipv6) { if (*first != '[') { return false; } if (*it == ']') { host = uri_part(first, it); ++it; // Then test if the next part is a host, part, or the end of the file if (it == last) { break; } else if (*it == ':') { host = uri_part(first, it); state = authority_state::port; ++it; first = it; } } } else if (state == authority_state::port) { if (*first == '/') { // the port is empty, but valid port = uri_part(first, it); if (!is_valid_port(std::begin(*port))) { return false; } continue; } if (!isdigit(it, last)) { return false; } } ++it; } if (state == authority_state::user_info) { host = uri_part(first, last); } else if (state == authority_state::host) { host = uri_part(first, last); } else if (state == authority_state::host_ipv6) { host = uri_part(first, last); } else if (state == authority_state::port) { port = uri_part(first, last); if (!is_valid_port(std::begin(*port))) { return false; } } return true; } } // namespace detail } // namespace network asymptote-3.05/LspCpp/third_party/uri/src/detail/uri_parse.cpp0000644000000000000000000002425615031566105023256 0ustar rootroot// Copyright 2016-2017 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include "uri_parse.hpp" #include #include #include "grammar.hpp" #include namespace network { namespace detail { namespace { enum class uri_state { scheme, hier_part, query, fragment }; enum class hier_part_state { first_slash, second_slash, authority, host, host_ipv6, port, path }; bool validate_scheme(string_view::const_iterator &it, string_view::const_iterator last) { if (it == last) { return false; } // The first character must be a letter if (!std::isalpha(*it, std::locale("C"))) { return false; } ++it; while (it != last) { if (*it == ':') { break; } else if (!isalnum(it, last) && !is_in(it, last, "+-.")) { return false; } } return true; } bool validate_user_info(string_view::const_iterator it, string_view::const_iterator last) { while (it != last) { if (!is_unreserved(it, last) && !is_pct_encoded(it, last) && !is_sub_delim(it, last) && !is_in(it, last, ":")) { return false; } } return true; } bool set_host_and_port(string_view::const_iterator first, string_view::const_iterator last, string_view::const_iterator last_colon, uri_parts &parts) { if (first >= last_colon) { parts.hier_part.host = uri_part(first, last); } else { auto port_start = last_colon; ++port_start; parts.hier_part.host = uri_part(first, last_colon); if (!is_valid_port(port_start)) { return false; } parts.hier_part.port = uri_part(port_start, last); } return true; } bool validate_fragment(string_view::const_iterator &it, string_view::const_iterator last) { while (it != last) { if (!is_pchar(it, last) && !is_in(it, last, "?/")) { return false; } } return true; } } // namespace bool parse(string_view::const_iterator &it, string_view::const_iterator last, uri_parts &parts) { auto state = uri_state::scheme; auto first = it; if (it == last) { return false; } if (validate_scheme(it, last)) { parts.scheme = uri_part(first, it); // move past the scheme delimiter ++it; state = uri_state::hier_part; } else { return false; } // Hierarchical part auto hp_state = hier_part_state::first_slash; // this is used by the user_info/port auto last_colon = first; while (it != last) { if (hp_state == hier_part_state::first_slash) { if (*it == '/') { hp_state = hier_part_state::second_slash; // set the first iterator in case the second slash is not forthcoming first = it; ++it; continue; } else { hp_state = hier_part_state::path; first = it; } } else if (hp_state == hier_part_state::second_slash) { if (*it == '/') { hp_state = hier_part_state::authority; ++it; first = it; continue; } else { // it's a valid URI, and this is the beginning of the path hp_state = hier_part_state::path; } } else if (hp_state == hier_part_state::authority) { if (is_in(first, last, "@:")) { return false; } // reset the last colon if (first == it) { last_colon = first; } if (*it == '@') { if (!validate_user_info(first, it)) { return false; } parts.hier_part.user_info = uri_part(first, it); hp_state = hier_part_state::host; ++it; first = it; if (*first == '[') { // this is an IPv6 address hp_state = hier_part_state::host_ipv6; } continue; } else if (*it == '[') { // this is an IPv6 address hp_state = hier_part_state::host_ipv6; first = it; continue; } else if (*it == ':') { last_colon = it; } else if (*it == '/') { // we skipped right past the host and port, and are at the path. if (!set_host_and_port(first, it, last_colon, parts)) { return false; } hp_state = hier_part_state::path; first = it; continue; } else if (*it == '?') { // the path is empty, but valid, and the next part is the query if (!set_host_and_port(first, it, last_colon, parts)) { return false; } parts.hier_part.path = uri_part(it, it); state = uri_state::query; ++it; first = it; break; } else if (*it == '#') { // the path is empty, but valid, and the next part is the fragment if (!set_host_and_port(first, it, last_colon, parts)) { return false; } parts.hier_part.path = uri_part(it, it); state = uri_state::fragment; ++it; first = it; break; } } else if (hp_state == hier_part_state::host) { if (*first == ':') { return false; } if (*it == ':') { parts.hier_part.host = uri_part(first, it); hp_state = hier_part_state::port; ++it; first = it; continue; } else if (*it == '/') { parts.hier_part.host = uri_part(first, it); hp_state = hier_part_state::path; first = it; continue; } else if (*it == '?') { // the path is empty, but valid, and the next part is the query parts.hier_part.host = uri_part(first, it); parts.hier_part.path = uri_part(it, it); state = uri_state::query; ++it; first = it; break; } else if (*it == '#') { // the path is empty, but valid, and the next part is the fragment parts.hier_part.host = uri_part(first, it); parts.hier_part.path = uri_part(it, it); state = uri_state::fragment; ++it; first = it; break; } } else if (hp_state == hier_part_state::host_ipv6) { if (*first != '[') { return false; } if (*it == ']') { ++it; // Then test if the next part is a host, part, or the end of the file if (it == last) { break; } else if (*it == ':') { parts.hier_part.host = uri_part(first, it); hp_state = hier_part_state::port; ++it; first = it; } else if (*it == '/') { parts.hier_part.host = uri_part(first, it); hp_state = hier_part_state::path; first = it; } else if (*it == '?') { parts.hier_part.host = uri_part(first, it); parts.hier_part.path = uri_part(it, it); state = uri_state::query; ++it; first = it; break; } else if (*it == '#') { parts.hier_part.host = uri_part(first, it); parts.hier_part.path = uri_part(it, it); state = uri_state::fragment; ++it; first = it; break; } continue; } } else if (hp_state == hier_part_state::port) { if (*first == '/') { // the port is empty, but valid if (!is_valid_port(first)) { return false; } parts.hier_part.port = uri_part(first, it); // the port isn't set, but the path is hp_state = hier_part_state::path; continue; } if (*it == '/') { if (!is_valid_port(first)) { return false; } parts.hier_part.port = uri_part(first, it); hp_state = hier_part_state::path; first = it; continue; } else if (!isdigit(it, last)) { return false; } continue; } else if (hp_state == hier_part_state::path) { if (*it == '?') { parts.hier_part.path = uri_part(first, it); // move past the query delimiter ++it; first = it; state = uri_state::query; break; } else if (*it == '#') { parts.hier_part.path = uri_part(first, it); // move past the fragment delimiter ++it; first = it; state = uri_state::fragment; break; } if (!is_pchar(it, last) && !is_in(it, last, "/")) { return false; } else { continue; } } ++it; } if (state == uri_state::query) { while (it != last) { if (!is_pchar(it, last) && !is_in(it, last, "?/")) { // If this is a fragment, keep going if (*it == '#') { parts.query = uri_part(first, it); // move past the fragment delimiter ++it; first = it; state = uri_state::fragment; break; } else { return false; } } } } if (state == uri_state::fragment) { if (!validate_fragment(it, last)) { return false; } } // we're done! if (state == uri_state::hier_part) { if (hp_state == hier_part_state::authority) { if (first == last) { return false; } if (!set_host_and_port(first, last, last_colon, parts)) { return false; } parts.hier_part.path = uri_part(last, last); } else if (hp_state == hier_part_state::host) { if (first == last) { return false; } if (!set_host_and_port(first, last, last_colon, parts)) { return false; } parts.hier_part.path = uri_part(last, last); } else if (hp_state == hier_part_state::host_ipv6) { if (!set_host_and_port(first, last, last_colon, parts)) { return false; } parts.hier_part.path = uri_part(last, last); } else if (hp_state == hier_part_state::port) { if (!is_valid_port(first)) { return false; } parts.hier_part.port = uri_part(first, last); parts.hier_part.path = uri_part(last, last); } else if (hp_state == hier_part_state::path) { parts.hier_part.path = uri_part(first, last); } } else if (state == uri_state::query) { parts.query = uri_part(first, last); } else if (state == uri_state::fragment) { parts.fragment = uri_part(first, last); } return true; } } // namespace detail } // namespace network asymptote-3.05/LspCpp/third_party/uri/src/detail/uri_resolve.hpp0000644000000000000000000000131215031566105023614 0ustar rootroot// Copyright 2013-2016 Glyn Matthews. // Copyright 2013 Hannes Kamecke. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_DETAIL_RESOLVE_INC #define NETWORK_DETAIL_RESOLVE_INC #include namespace network { namespace detail { // implementation of http://tools.ietf.org/html/rfc3986#section-5.2.4 std::string remove_dot_segments(string_view input); // implementation of http://tools.ietf.org/html/rfc3986#section-5.2.3 std::string merge_paths(const uri &base, const uri &reference); } // namespace detail } // namespace network #endif // NETWORK_DETAIL_RESOLVE_INC asymptote-3.05/LspCpp/third_party/uri/src/detail/algorithm.hpp0000644000000000000000000000406415031566105023253 0ustar rootroot// Copyright 2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_DETAIL_RANGE_INC #define NETWORK_DETAIL_RANGE_INC #include #include #include #include #include #include namespace network { namespace detail { template inline void for_each(Rng &rng, Pred &&pred) { std::for_each(std::begin(rng), std::end(rng), pred); } template inline void transform(Rng &rng, Iter out, Pred &&pred) { std::transform(std::begin(rng), std::end(rng), out, pred); } template inline typename Rng::difference_type distance(Rng &rng) { return std::distance(std::begin(rng), std::end(rng)); } template inline bool equal(const Rng1 &rng1, const Rng2 &rng2) { return std::equal(std::begin(rng1), std::end(rng1), std::begin(rng2)); } template inline void remove_erase_if(Rng &rng, Pred &&pred) { auto first = std::begin(rng), last = std::end(rng); auto it = std::remove_if(first, last, pred); rng.erase(it, last); } inline std::string trim_front(const std::string &str) { auto first = std::begin(str), last = std::end(str); auto it = std::find_if( first, last, [](char ch) { return !std::isspace(ch, std::locale()); }); return std::string(it, last); } inline std::string trim_back(const std::string &str) { using reverse_iterator = std::reverse_iterator; auto first = reverse_iterator(std::end(str)), last = reverse_iterator(std::begin(str)); auto it = std::find_if( first, last, [](char ch) { return !std::isspace(ch, std::locale()); }); std::string result(it, last); std::reverse(std::begin(result), std::end(result)); return result; } inline std::string trim_copy(const std::string &str) { return trim_back(trim_front(str)); } } // namespace detail } // namespace network #endif // NETWORK_DETAIL_RANGE_INC asymptote-3.05/LspCpp/third_party/uri/src/detail/algorithm_find.hpp0000644000000000000000000000410315031566105024245 0ustar rootroot/** * Search algorithms * @author Lobaskin Vasily * @data 31 March 2020 * @copyright Boost Software License, Version 1.0 */ #pragma once #include namespace network { namespace algorithm { template IteratorBegT find_nth(IteratorBegT iteratorBeg, IteratorEndT iteratorEnd, RangeT symbol, std::size_t pos) { static_assert(std::is_same::value, "Iterator types are different"); if (iteratorBeg > iteratorEnd) { std::swap(iteratorBeg, iteratorEnd); } std::size_t currentPos = -1; while (iteratorBeg != iteratorEnd) { if (*iteratorBeg == symbol) { ++currentPos; if (currentPos == pos) break; } ++iteratorBeg; } return iteratorBeg; } template bool all(IteratorBegT iteratorBeg, IteratorEndT iteratorEnd, ConditionT &&condition) { static_assert(std::is_same::value, "Iterator types are different"); if (iteratorBeg > iteratorEnd) { std::swap(iteratorBeg, iteratorEnd); } while (iteratorBeg != iteratorEnd) { if (!condition(*iteratorBeg)) return false; ++iteratorBeg; } return true; } template typename ContainerT::iterator find_nth(ContainerT &str, RangeT symbol, std::size_t pos) { return algorithm::find_nth(str.begin(), str.end(), symbol, pos); } template typename ContainerT::iterator find_last(ContainerT &str, RangeT symbol) { auto iter = algorithm::find_nth(str.rbegin(), str.rend(), symbol, 0); if (iter == str.rend()) { return str.end(); } return (++iter).base(); } template bool all(ContainerT const &container, ConditionT &&condition) { return all(container.cbegin(), container.cend(), std::forward(condition)); } } // namespace algorithm } // namespace networkasymptote-3.05/LspCpp/third_party/uri/src/detail/uri_normalize.cpp0000644000000000000000000000376315031566105024144 0ustar rootroot// Copyright 2013-2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include "uri_normalize.hpp" #include "uri_percent_encode.hpp" #include "algorithm.hpp" #include "algorithm_split.hpp" #include #include using namespace network::algorithm; using network::string_view; using network::uri_comparison_level; namespace network_detail = network::detail; std::string network_detail::normalize_path_segments(string_view path) { std::string result; if (!path.empty()) { std::vector path_segments; split(path_segments, path, '/'); bool last_segment_is_slash = path_segments.back().empty(); std::vector normalized_segments; for (const auto &segment : path_segments) { if (segment.empty() || (segment == ".")) { continue; } else if (segment == "..") { if (normalized_segments.empty()) { throw uri_builder_error(); } normalized_segments.pop_back(); } else { normalized_segments.push_back(segment); } } for (const auto &segment : normalized_segments) { result += "/" + segment; } if (last_segment_is_slash) { result += "/"; } } if (result.empty()) { result = "/"; } return result; } std::string network_detail::normalize_path(string_view path, uri_comparison_level level) { auto result = path.to_string(); if (uri_comparison_level::syntax_based == level) { // case normalization for_each(result, percent_encoded_to_upper()); // % encoding normalization result.erase(detail::decode_encoded_unreserved_chars(std::begin(result), std::end(result)), std::end(result)); // % path segment normalization result = normalize_path_segments(result); } return result; } asymptote-3.05/LspCpp/third_party/uri/src/detail/algorithm_split.hpp0000644000000000000000000000435115031566105024465 0ustar rootroot/** * Search algorithms * @author Lobaskin Vasily * @data 31 March 2020 * @copyright Boost Software License, Version 1.0 */ #include namespace network { namespace algorithm { template ::value>::type * = nullptr> bool split(ContainerT &container, SequenceT const &str, SplitterT symbol) { using PartT = typename ContainerT::value_type; static_assert(std::is_same::value, "Splitter type doesn't match sequence inner type"); std::size_t sequenceStart = 0; for (std::size_t i = 0, len = str.size(); i <= len; ++i) { if (str[i] != symbol && i != len) continue; std::size_t substrLen = i - sequenceStart; if (substrLen > 0) { PartT part{str.cbegin() + sequenceStart, str.cbegin() + i}; container.emplace_back(std::move(part)); } else { container.emplace_back(PartT{}); } sequenceStart = i + 1; } return true; } template ::value>::type * = nullptr> bool split(ContainerT &container, SequenceT const &str, SplitterT splitter) { using PartT = typename ContainerT::value_type; static_assert( std::is_same::value, "Invalid container type, only string is supported"); bool isEqual = false; std::size_t sequenceLen = splitter.size(); std::size_t sequenceStart = 0; for (std::size_t i = 0, len = str.size(); i <= len; ++i) { isEqual = true; for (std::size_t j = 0; j < sequenceLen; ++j) { if (str[i + j] != splitter[j]) { isEqual = false; break; } } if (!isEqual && i != len) continue; std::size_t substrLen = i - sequenceStart; if (substrLen > 0) { PartT part{str.cbegin() + sequenceStart, str.cbegin() + i}; container.emplace_back(std::move(part)); } else { container.emplace_back(PartT{}); } sequenceStart = i + sequenceLen; i += sequenceLen - 1; } return true; } } // namespace algorithm } // namespace network asymptote-3.05/LspCpp/third_party/uri/src/detail/grammar.hpp0000644000000000000000000000576715031566105022726 0ustar rootroot// Copyright 2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_DETAIL_URI_GRAMMAR_INC #define NETWORK_DETAIL_URI_GRAMMAR_INC #include #include #include #include #include namespace network { namespace detail { inline bool isalnum(string_view::const_iterator &it, string_view::const_iterator last) { if (it != last) { if (std::isalnum(*it, std::locale::classic())) { ++it; return true; } } return false; } inline bool isdigit(string_view::const_iterator &it, string_view::const_iterator last) { if (it != last) { if (std::isdigit(*it, std::locale::classic())) { ++it; return true; } } return false; } inline bool is_in(string_view::const_iterator &it, string_view::const_iterator last, const char *chars) { if (it != last) { auto length = std::strlen(chars); for (std::size_t i = 0; i < length; ++i) { if (*it == chars[i]) { ++it; return true; } } } return false; } inline bool is_sub_delim(string_view::const_iterator &it, string_view::const_iterator last) { return is_in(it, last, "!$&'()*+,;="); } inline bool is_ucschar(string_view::const_iterator &it, string_view::const_iterator last) { if (it == last) { return false; } return false; } inline bool is_private(string_view::const_iterator &it, string_view::const_iterator last) { return false; } inline bool is_unreserved(string_view::const_iterator &it, string_view::const_iterator last) { return isalnum(it, last) || is_in(it, last, "-._~"); } inline bool is_pct_encoded(string_view::const_iterator &it, string_view::const_iterator last) { if (it == last) { return false; } string_view::const_iterator it_copy = it; if (*it_copy == '%') { ++it_copy; if (it_copy == last) { return false; } } if (std::isxdigit(*it_copy, std::locale::classic())) { ++it_copy; if (it_copy == last) { return false; } } if (std::isxdigit(*it_copy, std::locale::classic())) { ++it_copy; it = it_copy; return true; } return false; } inline bool is_pchar(string_view::const_iterator &it, string_view::const_iterator last) { return is_unreserved(it, last) || is_pct_encoded(it, last) || is_sub_delim(it, last) || is_in(it, last, ":@") || is_ucschar(it, last); } inline bool is_valid_port(string_view::const_iterator it) { const char *port_first = &(*it); char *port_last = 0; unsigned long value = std::strtoul(port_first, &port_last, 10); return (value < std::numeric_limits::max()); } } // namespace detail } // namespace network #endif // NETWORK_DETAIL_URI_GRAMMAR_INC asymptote-3.05/LspCpp/third_party/uri/src/detail/uri_normalize.hpp0000644000000000000000000000112215031566105024134 0ustar rootroot// Copyright 2013-2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_DETAIL_NORMALIZE_INC #define NETWORK_DETAIL_NORMALIZE_INC #include #include namespace network { namespace detail { std::string normalize_path_segments(string_view path); std::string normalize_path(string_view path, uri_comparison_level level); } // namespace detail } // namespace network #endif // NETWORK_DETAIL_NORMALIZE_INC asymptote-3.05/LspCpp/third_party/uri/src/detail/uri_advance_parts.cpp0000644000000000000000000000441115031566105024745 0ustar rootroot// Copyright 2016-2017 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include "uri_advance_parts.hpp" #include #include #include namespace network_detail = network::detail; using network::string_view; using network::detail::uri_part; namespace { template uri_part copy_part(Iterator first, Iterator last, string_view::const_iterator &it) { auto part_first = it; std::advance(it, std::distance(first, last)); return network_detail::uri_part(part_first, it); } } // namespace uri_part network_detail::copy_part(const std::string &uri, string_view::const_iterator &it) { return ::copy_part(std::begin(uri), std::end(uri), it); } void network_detail::advance_parts(string_view uri_view, uri_parts &parts, const uri_parts &existing_parts) { auto first = std::begin(uri_view); auto it = first; if (auto scheme = existing_parts.scheme) { parts.scheme = ::copy_part(std::begin(*scheme), std::end(*scheme), it); // ignore : for all URIs if (*it == ':') { ++it; } // ignore // for hierarchical URIs if (existing_parts.hier_part.host) { std::advance(it, 2); } } if (auto user_info = existing_parts.hier_part.user_info) { parts.hier_part.user_info = ::copy_part(std::begin(*user_info), std::end(*user_info), it); ++it; // ignore @ } if (auto host = existing_parts.hier_part.host) { parts.hier_part.host = ::copy_part(std::begin(*host), std::end(*host), it); } if (auto port = existing_parts.hier_part.port) { ++it; // ignore : parts.hier_part.port = ::copy_part(std::begin(*port), std::end(*port), it); } if (auto path = existing_parts.hier_part.path) { parts.hier_part.path = ::copy_part(std::begin(*path), std::end(*path), it); } if (auto query = existing_parts.query) { ++it; // ignore ? parts.query = ::copy_part(std::begin(*query), std::end(*query), it); } if (auto fragment = existing_parts.fragment) { ++it; // ignore # parts.fragment = ::copy_part(std::begin(*fragment), std::end(*fragment), it); } } asymptote-3.05/LspCpp/third_party/uri/src/detail/uri_percent_encode.hpp0000644000000000000000000000344615031566105025124 0ustar rootroot// Copyright 2013-2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_DETAIL_URI_PERCENT_ENCODE_INC #define NETWORK_DETAIL_URI_PERCENT_ENCODE_INC #include #include #include #include #include namespace network { namespace detail { inline optional percent_encode(std::string::const_iterator it) { try { char output = '\0'; detail::decode_char(it, &output); return output; } catch (percent_decoding_error &) { return optional(); } } template struct percent_encoded_to_upper { percent_encoded_to_upper() : count(0) {} void operator()(typename String::value_type &c) { if (c == '%') { count = 2; } else if (count > 0) { c = std::toupper(c, std::locale()); --count; } } unsigned count; }; template Iter decode_encoded_unreserved_chars(Iter first, Iter last) { // unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" // clang-format off const auto is_unreserved = [](char c) { return std::isalnum(c, std::locale()) || '-' == c || '.' == c || '_' == c || '~' == c; }; // clang-format on auto it = first, it2 = first; while (it != last) { if (*it == '%') { const auto sfirst = it; const auto opt_char = percent_encode(sfirst); if (opt_char && is_unreserved(*opt_char)) { *it2 = *opt_char; ++it; ++it; } else { *it2 = *it; } } else { *it2 = *it; } ++it; ++it2; } return it2; } } // namespace detail } // namespace network #endif // NETWORK_DETAIL_URI_PERCENT_ENCODE_INC asymptote-3.05/LspCpp/third_party/uri/src/detail/uri_parse.hpp0000644000000000000000000000106315031566105023252 0ustar rootroot// Copyright 2013-2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef NETWORK_DETAIL_URI_PARSE_INC #define NETWORK_DETAIL_URI_PARSE_INC #include namespace network { namespace detail { struct uri_parts; bool parse(string_view::const_iterator &first, string_view::const_iterator last, uri_parts &parts); } // namespace detail } // namespace network #endif // NETWORK_DETAIL_URI_PARSE_INC asymptote-3.05/LspCpp/third_party/uri/src/uri_builder.cpp0000644000000000000000000001020315031566105022313 0ustar rootroot// Copyright (c) Glyn Matthews 2012-2016. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include "network/uri/uri_builder.hpp" #include "detail/uri_normalize.hpp" #include "detail/uri_parse_authority.hpp" #include "detail/algorithm.hpp" namespace network { uri_builder::uri_builder(const network::uri &base_uri) { if (base_uri.has_scheme()) { scheme_ = base_uri.scheme().to_string(); } if (base_uri.has_user_info()) { user_info_ = base_uri.user_info().to_string(); } if (base_uri.has_host()) { host_ = base_uri.host().to_string(); } if (base_uri.has_port()) { port_ = base_uri.port().to_string(); } if (base_uri.has_path()) { path_ = base_uri.path().to_string(); } if (base_uri.has_query()) { query_ = base_uri.query().to_string(); } if (base_uri.has_fragment()) { fragment_ = base_uri.fragment().to_string(); } } uri_builder::~uri_builder() noexcept {} network::uri uri_builder::uri() const { return network::uri(*this); } void uri_builder::set_scheme(string_type &&scheme) { // validate scheme is valid and normalize scheme_ = scheme; detail::transform(*scheme_, std::begin(*scheme_), [](char ch) { return std::tolower(ch, std::locale()); }); } void uri_builder::set_user_info(string_type &&user_info) { user_info_ = string_type(); network::uri::encode_user_info(std::begin(user_info), std::end(user_info), std::back_inserter(*user_info_)); } uri_builder &uri_builder::clear_user_info() { user_info_ = network::nullopt; return *this; } void uri_builder::set_host(string_type &&host) { host_ = string_type(); network::uri::encode_host(std::begin(host), std::end(host), std::back_inserter(*host_)); detail::transform(*host_, std::begin(*host_), [](char ch) { return std::tolower(ch, std::locale()); }); } void uri_builder::set_port(string_type &&port) { port_ = string_type(); network::uri::encode_port(std::begin(port), std::end(port), std::back_inserter(*port_)); } uri_builder &uri_builder::clear_port() { port_ = network::nullopt; return *this; } void uri_builder::set_authority(string_type &&authority) { optional user_info, host, port; uri::string_view view(authority); uri::const_iterator it = std::begin(view), last = std::end(view); detail::parse_authority(it, last, user_info, host, port); if (user_info) { set_user_info(user_info->to_string()); } if (host) { set_host(host->to_string()); } if (port) { set_port(port->to_string()); } } void uri_builder::set_path(string_type &&path) { path_ = string_type(); network::uri::encode_path(std::begin(path), std::end(path), std::back_inserter(*path_)); } uri_builder &uri_builder::clear_path() { path_ = network::nullopt; return *this; } void uri_builder::append_query_component(string_type &&name) { if (!query_) { query_ = string_type(); } else { query_->append("&"); } network::uri::encode_query_component(std::begin(name), std::end(name), std::back_inserter(*query_)); } void uri_builder::append_query_key_value_pair(string_type &&key, string_type &&value) { if (!query_) { query_ = string_type(); } else { query_->push_back('&'); } network::uri::encode_query_key_value_pair(std::begin(key), std::end(key), std::begin(value), std::end(value), std::back_inserter(*query_)); } uri_builder &uri_builder::clear_query() { query_ = network::nullopt; return *this; } void uri_builder::set_fragment(string_type &&fragment) { fragment_ = string_type(); network::uri::encode_fragment(std::begin(fragment), std::end(fragment), std::back_inserter(*fragment_)); } uri_builder &uri_builder::clear_fragment() { fragment_ = network::nullopt; return *this; } } // namespace network asymptote-3.05/LspCpp/third_party/uri/src/uri_errors.cpp0000644000000000000000000000357415031566105022216 0ustar rootroot// Copyright 2013-2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include namespace network { class uri_category_impl : public std::error_category { public: uri_category_impl() = default; virtual ~uri_category_impl() noexcept; virtual const char *name() const noexcept; virtual std::string message(int ev) const; }; uri_category_impl::~uri_category_impl() noexcept {} const char *uri_category_impl::name() const noexcept { static const char name[] = "uri_error"; return name; } std::string uri_category_impl::message(int ev) const { switch (uri_error(ev)) { case uri_error::invalid_syntax: return "Unable to parse URI string."; case uri_error::not_enough_input: return "Percent decoding: Not enough input."; case uri_error::non_hex_input: return "Percent decoding: Non-hex input."; case uri_error::conversion_failed: return "Percent decoding: Conversion failed."; default: break; } return "Unknown URI error."; } const std::error_category &uri_category() { static uri_category_impl uri_category; return uri_category; } std::error_code make_error_code(uri_error e) { return std::error_code(static_cast(e), uri_category()); } uri_syntax_error::uri_syntax_error() : std::system_error(make_error_code(uri_error::invalid_syntax)) {} uri_syntax_error::~uri_syntax_error() noexcept {} uri_builder_error::uri_builder_error() : std::system_error(make_error_code(uri_error::invalid_uri)) {} uri_builder_error::~uri_builder_error() noexcept {} percent_decoding_error::percent_decoding_error(uri_error error) : std::system_error(make_error_code(error)) {} percent_decoding_error::~percent_decoding_error() noexcept {} } // namespace network asymptote-3.05/LspCpp/third_party/uri/src/uri.cpp0000644000000000000000000004371615031566105020624 0ustar rootroot// Copyright 2012-2017 Glyn Matthews. // Copyright 2012 Google, Inc. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include "network/uri/uri.hpp" #include "detail/uri_parse.hpp" #include "detail/uri_advance_parts.hpp" #include "detail/uri_percent_encode.hpp" #include "detail/uri_normalize.hpp" #include "detail/uri_resolve.hpp" #include "detail/algorithm.hpp" namespace network { namespace { // With the parser, we use string_views, which are mutable. However, // there are times (e.g. during normalization), when we want a part // to be mutable. This function returns a pair of // std::string::iterators in the same range as the URI part. // inline std::pair mutable_part( std::string &str, detail::uri_part part) { auto view = string_view(str); auto first_index = std::distance(std::begin(view), std::begin(part)); auto first = std::begin(str); std::advance(first, first_index); auto last_index = std::distance(std::begin(view), std::end(part)); auto last = std::begin(str); std::advance(last, last_index); return std::make_pair(first, last); } // This is a convenience function that converts a part of a // std::string to a string_view. inline string_view to_string_view(const std::string &uri, detail::uri_part part) { if (!part.empty()) { const char *c_str = uri.c_str(); const char *part_begin = &(*(std::begin(part))); std::advance(c_str, std::distance(c_str, part_begin)); return string_view(c_str, std::distance(std::begin(part), std::end(part))); } return string_view(); } inline optional make_arg(optional view) { if (view) { return view->to_string(); } return nullopt; } template inline void ignore(T) {} } // namespace void uri::initialize(optional scheme, optional user_info, optional host, optional port, optional path, optional query, optional fragment) { if (scheme) { uri_.append(*scheme); } if (user_info || host || port) { if (scheme) { uri_.append("://"); } if (user_info) { uri_.append(*user_info); uri_.append("@"); } if (host) { uri_.append(*host); } else { throw uri_builder_error(); } if (port) { uri_.append(":"); uri_.append(*port); } } else { if (scheme) { if (path || query || fragment) { uri_.append(":"); } else { throw uri_builder_error(); } } } if (path) { // if the URI is not opaque and the path is not already prefixed // with a '/', add one. if (host && (!path->empty() && path->front() != '/')) { path = "/" + *path; } uri_.append(*path); } if (query) { uri_.append("?"); uri_.append(*query); } if (fragment) { uri_.append("#"); uri_.append(*fragment); } uri_view_ = string_view(uri_); auto it = std::begin(uri_view_); if (scheme) { uri_parts_.scheme = detail::copy_part(*scheme, it); // ignore : and :// if (*it == ':') { ++it; } if (*it == '/' && *(it + 1) == '/') { it += 2; } } if (user_info) { uri_parts_.hier_part.user_info = detail::copy_part(*user_info, it); ++it; // ignore @ } if (host) { uri_parts_.hier_part.host = detail::copy_part(*host, it); } if (port) { ++it; // ignore : uri_parts_.hier_part.port = detail::copy_part(*port, it); } if (path) { uri_parts_.hier_part.path = detail::copy_part(*path, it); } if (query) { ++it; // ignore ? uri_parts_.query = detail::copy_part(*query, it); } if (fragment) { ++it; // ignore # uri_parts_.fragment = detail::copy_part(*fragment, it); } } uri::uri() : uri_view_(uri_) {} uri::uri(const uri &other) : uri_(other.uri_), uri_view_(uri_) { detail::advance_parts(uri_view_, uri_parts_, other.uri_parts_); } uri::uri(const uri_builder &builder) { initialize(builder.scheme_, builder.user_info_, builder.host_, builder.port_, builder.path_, builder.query_, builder.fragment_); } uri::uri(uri &&other) noexcept : uri_(std::move(other.uri_)), uri_view_(uri_), uri_parts_(std::move(other.uri_parts_)) { detail::advance_parts(uri_view_, uri_parts_, other.uri_parts_); other.uri_.clear(); other.uri_view_ = string_view(other.uri_); other.uri_parts_ = detail::uri_parts(); } uri::~uri() {} uri &uri::operator=(uri other) { other.swap(*this); return *this; } void uri::swap(uri &other) noexcept { uri_.swap(other.uri_); uri_view_ = uri_; other.uri_view_ = other.uri_; const auto this_parts = uri_parts_; uri_parts_.clear(); detail::advance_parts(uri_view_, uri_parts_, other.uri_parts_); other.uri_parts_.clear(); detail::advance_parts(other.uri_view_, other.uri_parts_, this_parts); } uri::const_iterator uri::begin() const noexcept { return uri_view_.begin(); } uri::const_iterator uri::end() const noexcept { return uri_view_.end(); } bool uri::has_scheme() const noexcept { return static_cast(uri_parts_.scheme); } uri::string_view uri::scheme() const noexcept { return has_scheme() ? to_string_view(uri_, *uri_parts_.scheme) : string_view{}; } bool uri::has_user_info() const noexcept { return static_cast(uri_parts_.hier_part.user_info); } uri::string_view uri::user_info() const noexcept { return has_user_info() ? to_string_view(uri_, *uri_parts_.hier_part.user_info) : string_view{}; } bool uri::has_host() const noexcept { return static_cast(uri_parts_.hier_part.host); } uri::string_view uri::host() const noexcept { return has_host() ? to_string_view(uri_, *uri_parts_.hier_part.host) : string_view{}; } bool uri::has_port() const noexcept { return static_cast(uri_parts_.hier_part.port); } uri::string_view uri::port() const noexcept { return has_port() ? to_string_view(uri_, *uri_parts_.hier_part.port) : string_view{}; } bool uri::has_path() const noexcept { return static_cast(uri_parts_.hier_part.path); } uri::string_view uri::path() const noexcept { return has_path() ? to_string_view(uri_, *uri_parts_.hier_part.path) : string_view{}; } bool uri::has_query() const noexcept { return static_cast(uri_parts_.query); } uri::string_view uri::query() const noexcept { return has_query() ? to_string_view(uri_, *uri_parts_.query) : string_view{}; } uri::query_iterator::query_iterator() : query_{}, kvp_{} {} uri::query_iterator::query_iterator(optional query) : query_(query), kvp_{} { if (query_ && query_->empty()) { query_ = nullopt; } else { assign_kvp(); } } uri::query_iterator::query_iterator(const query_iterator &other) : query_(other.query_), kvp_(other.kvp_) {} uri::query_iterator &uri::query_iterator::operator=( const query_iterator &other) { auto tmp(other); swap(tmp); return *this; } uri::query_iterator::reference uri::query_iterator::operator++() noexcept { increment(); return kvp_; } uri::query_iterator::value_type uri::query_iterator::operator++(int) noexcept { auto original = kvp_; increment(); return original; } uri::query_iterator::reference uri::query_iterator::operator*() const noexcept { return kvp_; } uri::query_iterator::pointer uri::query_iterator::operator->() const noexcept { return std::addressof(kvp_); } bool uri::query_iterator::operator==(const query_iterator &other) const noexcept { if (!query_ && !other.query_) { return true; } else if (query_ && other.query_) { // since we're comparing substrings, the address of the first // element in each iterator must be the same return std::addressof(kvp_.first) == std::addressof(other.kvp_.first); } return false; } void uri::query_iterator::swap(query_iterator &other) noexcept { std::swap(query_, other.query_); std::swap(kvp_, other.kvp_); } void uri::query_iterator::advance_to_next_kvp() noexcept { auto first = std::begin(*query_), last = std::end(*query_); auto sep_it = std::find_if( first, last, [](char c) -> bool { return c == '&' || c == ';'; }); if (sep_it != last) { ++sep_it; // skip next separator } // reassign query to the next element query_ = detail::uri_part(sep_it, last); } void uri::query_iterator::assign_kvp() noexcept { auto first = std::begin(*query_), last = std::end(*query_); auto sep_it = std::find_if( first, last, [](char c) -> bool { return c == '&' || c == ';'; }); auto eq_it = std::find_if(first, sep_it, [](char c) -> bool { return c == '='; }); kvp_.first = string_view(std::addressof(*first), std::distance(first, eq_it)); if (eq_it != sep_it) { ++eq_it; // skip '=' symbol } kvp_.second = string_view(std::addressof(*eq_it), std::distance(eq_it, sep_it)); } void uri::query_iterator::increment() noexcept { assert(query_); if (!query_->empty()) { advance_to_next_kvp(); assign_kvp(); } if (query_->empty()) { query_ = nullopt; } } uri::query_iterator uri::query_begin() const noexcept { return has_query() ? uri::query_iterator{uri_parts_.query} : uri::query_iterator{}; } uri::query_iterator uri::query_end() const noexcept { return uri::query_iterator{}; } bool uri::has_fragment() const noexcept { return static_cast(uri_parts_.fragment); } uri::string_view uri::fragment() const noexcept { return has_fragment() ? to_string_view(uri_, *uri_parts_.fragment) : string_view{}; } bool uri::has_authority() const noexcept { return has_host(); } uri::string_view uri::authority() const noexcept { if (!has_host()) { return string_view{}; } auto host = this->host(); auto user_info = string_view{}; if (has_user_info()) { user_info = this->user_info(); } auto port = string_view{}; if (has_port()) { port = this->port(); } auto first = std::begin(host), last = std::end(host); if (has_user_info() && !user_info.empty()) { first = std::begin(user_info); } else if (host.empty() && has_port() && !port.empty()) { first = std::begin(port); --first; // include ':' before port } if (host.empty()) { if (has_port() && !port.empty()) { last = std::end(port); } else if (has_user_info() && !user_info.empty()) { last = std::end(user_info); ++last; // include '@' } } else if (has_port()) { if (port.empty()) { ++last; // include ':' after host } else { last = std::end(port); } } return string_view(first, std::distance(first, last)); } std::string uri::string() const { return uri_; } std::wstring uri::wstring() const { return std::wstring(std::begin(*this), std::end(*this)); } std::u16string uri::u16string() const { return std::u16string(std::begin(*this), std::end(*this)); } std::u32string uri::u32string() const { return std::u32string(std::begin(*this), std::end(*this)); } uri::string_view uri::view() const noexcept { return uri_view_; } bool uri::empty() const noexcept { return uri_.empty(); } bool uri::is_absolute() const noexcept { return has_scheme(); } bool uri::is_opaque() const noexcept { return (is_absolute() && !has_authority()); } uri uri::normalize(uri_comparison_level level) const { string_type normalized(uri_); string_view normalized_view(normalized); detail::uri_parts parts; detail::advance_parts(normalized_view, parts, uri_parts_); if (uri_comparison_level::syntax_based == level) { // All alphabetic characters in the scheme and host are // lower-case... if (parts.scheme) { std::string::iterator first, last; std::tie(first, last) = mutable_part(normalized, *parts.scheme); std::transform(first, last, first, [](char ch) { return std::tolower(ch, std::locale()); }); } // if (parts.hier_part.host) { // std::string::iterator first, last; // std::tie(first, last) = mutable_part(normalized, // *parts.hier_part.host); std::transform(first, last, first, // [](char ch) { return std::tolower(ch, std::locale()); // }); // } // ...except when used in percent encoding detail::for_each(normalized, detail::percent_encoded_to_upper()); // parts are invalidated here // there's got to be a better way of doing this that doesn't // mean parsing again (twice!) normalized.erase(detail::decode_encoded_unreserved_chars( std::begin(normalized), std::end(normalized)), std::end(normalized)); normalized_view = string_view(normalized); // need to parse the parts again as the underlying string has changed const_iterator it = std::begin(normalized_view), last = std::end(normalized_view); bool is_valid = detail::parse(it, last, parts); ignore(is_valid); assert(is_valid); if (parts.hier_part.path) { uri::string_type path = detail::normalize_path_segments( to_string_view(normalized, *parts.hier_part.path)); // put the normalized path back into the uri optional query, fragment; if (parts.query) { query = parts.query->to_string(); } if (parts.fragment) { fragment = parts.fragment->to_string(); } auto path_begin = std::begin(normalized); auto path_range = mutable_part(normalized, *parts.hier_part.path); std::advance(path_begin, std::distance(path_begin, path_range.first)); normalized.erase(path_begin, std::end(normalized)); normalized.append(path); if (query) { normalized.append("?"); normalized.append(*query); } if (fragment) { normalized.append("#"); normalized.append(*fragment); } } } return uri(normalized); } uri uri::make_relative(const uri &other) const { if (is_opaque() || other.is_opaque()) { return other; } if ((!has_scheme() || !other.has_scheme()) || !detail::equal(scheme(), other.scheme())) { return other; } if ((!has_authority() || !other.has_authority()) || !detail::equal(authority(), other.authority())) { return other; } if (!has_path() || !other.has_path()) { return other; } auto path = detail::normalize_path(this->path(), uri_comparison_level::syntax_based); auto other_path = detail::normalize_path(other.path(), uri_comparison_level::syntax_based); optional query, fragment; if (other.has_query()) { query = other.query().to_string(); } if (other.has_fragment()) { fragment = other.fragment().to_string(); } network::uri result; result.initialize(optional(), optional(), optional(), optional(), other_path, query, fragment); return result; } uri uri::resolve(const uri &base) const { // This implementation uses the psuedo-code given in // http://tools.ietf.org/html/rfc3986#section-5.2.2 if (is_absolute() && !is_opaque()) { // throw an exception ? return *this; } if (is_opaque()) { // throw an exception ? return *this; } optional user_info, host, port, path, query, fragment; if (has_authority()) { // g -> http://g if (has_user_info()) { user_info = make_arg(this->user_info()); } if (has_host()) { host = make_arg(this->host()); } if (has_port()) { port = make_arg(this->port()); } if (has_path()) { path = detail::remove_dot_segments(this->path()); } if (has_query()) { query = make_arg(this->query()); } } else { if (!has_path() || this->path().empty()) { if (base.has_path()) { path = make_arg(base.path()); } if (has_query()) { query = make_arg(this->query()); } else if (base.has_query()) { query = make_arg(base.query()); } } else { if (this->path().front() == '/') { path = detail::remove_dot_segments(this->path()); } else { path = detail::merge_paths(base, *this); } if (has_query()) { query = make_arg(this->query()); } } if (base.has_user_info()) { user_info = make_arg(base.user_info()); } if (base.has_host()) { host = make_arg(base.host()); } if (base.has_port()) { port = make_arg(base.port()); } } if (has_fragment()) { fragment = make_arg(this->fragment()); } network::uri result; result.initialize(make_arg(base.scheme()), std::move(user_info), std::move(host), std::move(port), std::move(path), std::move(query), std::move(fragment)); return result; } int uri::compare(const uri &other, uri_comparison_level level) const noexcept { // if both URIs are empty, then we should define them as equal // even though they're still invalid. if (empty() && other.empty()) { return 0; } if (empty()) { return -1; } if (other.empty()) { return 1; } return normalize(level).uri_.compare(other.normalize(level).uri_); } bool uri::initialize(const string_type &uri) { uri_ = detail::trim_copy(uri); if (!uri_.empty()) { uri_view_ = string_view(uri_); const_iterator it = std::begin(uri_view_), last = std::end(uri_view_); bool is_valid = detail::parse(it, last, uri_parts_); return is_valid; } return true; } void swap(uri &lhs, uri &rhs) noexcept { lhs.swap(rhs); } bool operator==(const uri &lhs, const uri &rhs) noexcept { return lhs.view() == rhs.view(); } bool operator==(const uri &lhs, const char *rhs) noexcept { return lhs.view() == string_view{rhs}; } bool operator<(const uri &lhs, const uri &rhs) noexcept { return lhs.view() < rhs.view(); } } // namespace network asymptote-3.05/LspCpp/third_party/uri/test/0000755000000000000000000000000015031566105017476 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/test/uri_parse_scheme_test.cpp0000644000000000000000000000502215031566105024555 0ustar rootroot// Copyright 2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt of copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include "test_uri.hpp" #include "string_utility.hpp" // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) TEST(uri_parse_test, test_valid_scheme) { test::uri uri("http://user@www.example.com:80/path?query#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("http", uri.scheme()); } TEST(uri_parse_test, test_scheme_beginning_with_a_colon) { test::uri uri(":http://user@www.example.com:80/path?query#fragment"); EXPECT_FALSE(uri.parse_uri()); ASSERT_FALSE(uri.has_scheme()); } TEST(uri_parse_test, test_scheme_beginning_with_a_number) { test::uri uri("8http://user@www.example.com:80/path?query#fragment"); EXPECT_FALSE(uri.parse_uri()); } TEST(uri_parse_test, test_scheme_with_a_minus) { test::uri uri("ht-tp://user@www.example.com:80/path?query#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("ht-tp", uri.scheme()); } TEST(uri_parse_test, test_scheme_with_a_plus) { test::uri uri("ht+tp://user@www.example.com:80/path?query#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("ht+tp", uri.scheme()); } TEST(uri_parse_test, test_scheme_with_a_dot) { test::uri uri("ht.tp://user@www.example.com:80/path?query#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("ht.tp", uri.scheme()); } TEST(uri_parse_test, test_scheme_with_a_number) { test::uri uri("http1://user@www.example.com:80/path?query#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("http1", uri.scheme()); } TEST(uri_parse_test, test_scheme_with_an_invalid_character) { test::uri uri("http$://user@www.example.com:80/path?query#fragment"); EXPECT_FALSE(uri.parse_uri()); } TEST(uri_parse_test, test_scheme_with_capital_letters) { test::uri uri("HTTP://user@www.example.com:80/path?query#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("HTTP", uri.scheme()); } TEST(uri_parse_test, test_scheme_with_a_percent) { test::uri uri("ht%tp://user@www.example.com:80/path?query#fragment"); EXPECT_FALSE(uri.parse_uri()); } TEST(uri_parse_test, test_scheme_with_a_valid_percent_encoded_character) { test::uri uri("ht%00tp://user@www.example.com:80/path?query#fragment"); EXPECT_FALSE(uri.parse_uri()); } asymptote-3.05/LspCpp/third_party/uri/test/optional_test.cpp0000644000000000000000000001041215031566105023064 0ustar rootroot// Copyright (c) Glyn Matthews 2016. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include TEST(optional_test, empty_optional) { network::optional opt; ASSERT_FALSE(opt); } TEST(optional_test, empty_optional_constructed_with_nullopt) { network::optional opt{network::nullopt}; ASSERT_FALSE(opt); } TEST(optional_test, empty_optional_string) { network::optional opt{}; ASSERT_FALSE(opt); } TEST(optional_test, empty_optional_string_with_nullopt) { network::optional opt{network::nullopt}; ASSERT_FALSE(opt); } TEST(optional_test, value_constructor) { network::optional opt{42}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, 42); } TEST(optional_test, value_constructor_string) { network::optional opt{"banana"}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, "banana"); } TEST(optional_test, rvalue_ref_constructor) { int value = 42; network::optional opt{std::move(value)}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, 42); } TEST(optional_test, rvalue_ref_constructor_string) { std::string value = "banana"; network::optional opt{std::move(value)}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, "banana"); } TEST(optional_test, nullopt_copy_constructor) { network::optional other{network::nullopt}; network::optional opt{other}; ASSERT_FALSE(opt); } TEST(optional_test, nullopt_move_constructor) { network::optional other{network::nullopt}; network::optional opt{std::move(other)}; ASSERT_FALSE(opt); } TEST(optional_test, value_copy_constructor) { network::optional other{42}; network::optional opt{other}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, 42); } TEST(optional_test, value_move_constructor) { network::optional other{42}; network::optional opt{std::move(other)}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, 42); } TEST(optional_test, value_copy_constructor_string) { network::optional other{"banana"}; network::optional opt{other}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, "banana"); } TEST(optional_test, value_move_constructor_string) { network::optional other{"banana"}; network::optional opt{std::move(other)}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, "banana"); } TEST(optional_test, nullopt_assignment) { network::optional opt(42); opt = network::nullopt; ASSERT_FALSE(opt); } TEST(optional_test, nullopt_assignment_string) { network::optional opt("banana"); opt = network::nullopt; ASSERT_FALSE(opt); } TEST(optional_test, value_copy_assigment) { network::optional opt{}; network::optional other{42}; opt = other; ASSERT_TRUE(opt); ASSERT_EQ(*opt, 42); } TEST(optional_test, value_move_assignment) { network::optional opt{}; network::optional other{42}; opt = std::move(other); ASSERT_TRUE(opt); ASSERT_EQ(*opt, 42); } TEST(optional_test, value_copy_assignment_string) { network::optional opt{}; network::optional other{"banana"}; opt = other; ASSERT_TRUE(opt); ASSERT_EQ(*opt, "banana"); } TEST(optional_test, value_move_assignment_string) { network::optional opt{}; network::optional other{"banana"}; opt = std::move(other); ASSERT_TRUE(opt); ASSERT_EQ(*opt, "banana"); } TEST(optional_test, value_or_reference) { network::optional opt; auto result = opt.value_or("other"); ASSERT_EQ("other", result); } TEST(optional_test, value_or_reference_with_value) { network::optional opt("this"); auto result = opt.value_or("other"); ASSERT_EQ("this", result); } TEST(optional_test, value_or_rvalue_reference) { std::string other("other"); auto result = network::optional().value_or(other); ASSERT_EQ("other", result); } TEST(optional_test, value_or_rvalue_reference_with_value) { std::string other("other"); auto result = network::optional("this").value_or(other); ASSERT_EQ("this", result); } TEST(optional_test, assign_nullopt_to_nullopt) { network::optional opt; opt = network::nullopt; } asymptote-3.05/LspCpp/third_party/uri/test/invalid_urls.txt0000644000000000000000000000107415031566105022734 0ustar rootroothttp:// http://. http://.. http://../ http://? http://?? http://??/ http://# http://## http://##/ http://foo.bar?q=Spaces should be encoded // //a ///a /// http:///a foo.com rdar://1234 h://test http:// shouldfail.com :// should fail http://foo.bar/foo(bar)baz quux ftps://foo.bar/ http://-error-.invalid/ http://a.b--c.de/ http://-a.b.co http://a.b-.co http://0.0.0.0 http://10.1.1.0 http://10.1.1.255 http://224.1.1.1 http://1.1.1.1.1 http://123.123.123 http://3628126748 http://.www.foo.bar/ http://www.foo.bar./ http://.www.foo.bar./ http://10.1.1.1 http://10.1.1.254 asymptote-3.05/LspCpp/third_party/uri/test/uri_stream_test.cpp0000644000000000000000000000261315031566105023415 0ustar rootroot// Copyright 2013-2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt of copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include TEST(uri_stream_test, ostream) { std::ostringstream oss; oss << network::uri("http://www.example.com/"); ASSERT_EQ("http://www.example.com/", oss.str()); } TEST(uri_stream_test, wostream) { std::wostringstream oss; oss << network::uri("http://www.example.com/"); ASSERT_EQ(L"http://www.example.com/", oss.str()); } TEST(uri_stream_test, istream) { std::istringstream iss("http://www.example.com/"); network::uri instance; iss >> instance; ASSERT_EQ("http://www.example.com/", instance); } TEST(uri_stream_test, wistream) { std::wistringstream iss(L"http://www.example.com/"); network::uri instance; iss >> instance; ASSERT_EQ("http://www.example.com/", instance); } TEST(uri_stream_test, DISABLED_istream_invalid_uri) { std::istringstream iss("I am not a valid URI."); network::uri instance; ASSERT_THROW((iss >> instance), network::uri_syntax_error); } TEST(uri_stream_test, DISABLED_wistream_invalid_uri) { std::wistringstream iss(L"I am not a valid URI."); network::uri instance; ASSERT_THROW((iss >> instance), network::uri_syntax_error); } // This is not the full story with istream and exceptions... asymptote-3.05/LspCpp/third_party/uri/test/uri_normalization_test.cpp0000644000000000000000000002107715031566105025015 0ustar rootroot// Copyright (c) Glyn Matthews 2012-2016. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include // Compare the underlying strings because ``normalize`` is used in the // ``uri`` equality operator. TEST(uri_normalization_test, string_comparison) { network::uri instance("http://www.example.com/"); ASSERT_EQ( "http://www.example.com/", instance.normalize(network::uri_comparison_level::string_comparison).string()); } TEST(uri_normalization_test, string_comparison_with_case) { network::uri instance("HTTP://www.example.com/"); ASSERT_EQ( "HTTP://www.example.com/", instance.normalize(network::uri_comparison_level::string_comparison).string()); } TEST(uri_normalization_test, normalize_case_capitalized_scheme) { network::uri instance("HTTP://www.example.com/"); ASSERT_EQ("http://www.example.com/", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, DISABLED_normalize_case_capitalized_host) { network::uri instance("http://WWW.EXAMPLE.COM/"); ASSERT_EQ("http://www.example.com/", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, normalize_percent_encoding) { network::uri instance( "http://www%2Eexample%2Ecom/%7E%66%6F%6F%62%61%72%5F%36%39/"); ASSERT_EQ("http://www.example.com/~foobar_69/", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, normalize_percent_encoding_with_lower_case_elements) { network::uri instance( "http://www%2eexample%2ecom/%7e%66%6f%6f%62%61%72%5f%36%39/"); ASSERT_EQ("http://www.example.com/~foobar_69/", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, normalize_percent_encoding_is_upper_case) { network::uri instance( "HTTP://www%2Eexample%2Ecom/%7E%66%6F%6F%62%61%72%5F%36%39/"); ASSERT_EQ("http://www.example.com/~foobar_69/", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_segmented_add_trailing_slash) { network::uri instance("http://www.example.com"); ASSERT_EQ("http://www.example.com/", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_segmented_dont_add_trailing_slash_if_path_is_not_empty) { network::uri instance("http://www.example.com/path"); ASSERT_EQ("http://www.example.com/path", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_segmented_remove_dot_segments) { network::uri instance("http://www.example.com/a/./b/"); ASSERT_EQ("http://www.example.com/a/b/", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_segmented_remove_double_dot_segments) { network::uri instance("http://www.example.com/a/../b/"); ASSERT_EQ("http://www.example.com/b/", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_segmented_remove_dot_segments_with_percent_encoded_dot) { network::uri instance("http://www.example.com/a/%2E/b/"); ASSERT_EQ("http://www.example.com/a/b/", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_segmented_remove_double_dot_segments_with_percent_encoded_dots) { network::uri instance("http://www.example.com/a/%2E%2E/b/"); ASSERT_EQ("http://www.example.com/b/", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_segmented_remove_double_dot_segments_with_query) { network::uri instance("http://www.example.com/a/../b/?key=value"); ASSERT_EQ("http://www.example.com/b/?key=value", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_segmented_remove_double_dot_segments_with_empty_query) { network::uri instance("http://www.example.com/a/../b/?"); ASSERT_EQ("http://www.example.com/b/?", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_segmented_remove_double_dot_segments_with_fragment) { network::uri instance("http://www.example.com/a/../b/#fragment"); ASSERT_EQ("http://www.example.com/b/#fragment", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_segmented_remove_double_dot_segments_with_empty_fragment) { network::uri instance("http://www.example.com/a/../b/#"); ASSERT_EQ("http://www.example.com/b/#", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_segmented_remove_double_dot_segments_with_query_and_fragment) { network::uri instance("http://www.example.com/a/../b/?key=value#fragment"); ASSERT_EQ("http://www.example.com/b/?key=value#fragment", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_double_dash) { network::uri instance("http://www.example.com//"); ASSERT_EQ("http://www.example.com/", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_triple_dash) { network::uri instance("http://www.example.com///"); ASSERT_EQ("http://www.example.com/", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_depth_below_root) { network::uri instance("http://www.example.com/.."); ASSERT_THROW(instance.normalize(network::uri_comparison_level::syntax_based), std::system_error); } TEST(uri_normalization_test, path_depth_below_root_2) { network::uri instance("http://www.example.com/a/../.."); ASSERT_THROW(instance.normalize(network::uri_comparison_level::syntax_based), std::system_error); } TEST(uri_normalization_test, path_dash_dot_dash) { network::uri instance("http://www.example.com/./"); ASSERT_EQ("http://www.example.com/", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_dash_dot_dash_dot) { network::uri instance("http://www.example.com/./."); ASSERT_EQ("http://www.example.com/", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_percent_encoded_reserved) { // :/?#[]@!$&'()*+,;= network::uri instance( "http://www.example.com/%3a%2f%3f%23%5b%5d%40%21%24%26%27%28%29%2a%2b%2c%3b%3d"); ASSERT_EQ( "http://www.example.com/%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, path_percent_encoded_unreserved) { network::uri instance("http://www.example.com/alpha123%2d%2e%5f%7e"); ASSERT_EQ("http://www.example.com/alpha123-._~", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, query_percent_encoded_reserved) { // :/?#[]@!$&'()*+,;= network::uri instance( "http://www.example.com?foo=%3a%2f%3f%23%5b%5d%40%21%24%26%27%28%29%2a%2b%2c%3b%3d"); ASSERT_EQ( "http://www.example.com/?foo=%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_normalization_test, query_percent_encoded_unreserved) { network::uri instance("http://www.example.com?foo=alpha123%2d%2e%5f%7e"); ASSERT_EQ("http://www.example.com/?foo=alpha123-._~", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_test, path_adjacent_slashes_122) { // https://github.com/cpp-netlib/uri/issues/122 network::uri instance("http://www.example.com/abc//elementary"); ASSERT_EQ("http://www.example.com/abc/elementary", instance.normalize(network::uri_comparison_level::syntax_based).string()); } TEST(uri_test, path_adjacent_slashes_122_part_2) { // https://github.com/cpp-netlib/uri/issues/122 network::uri instance("http://www.example.com/abc//.//../elementary"); ASSERT_EQ("http://www.example.com/elementary", instance.normalize(network::uri_comparison_level::syntax_based).string()); } asymptote-3.05/LspCpp/third_party/uri/test/CMakeLists.txt0000644000000000000000000000201715031566105022236 0ustar rootroot# Copyright (c) Glyn Matthews 2012-2016. # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) include_directories( ${gtest_SOURCE_DIR}/include) set( TESTS uri_parse_test uri_parse_scheme_test uri_parse_path_test uri_test uri_encoding_test uri_normalization_test uri_comparison_test uri_reference_test uri_resolve_test uri_builder_test uri_stream_test optional_test ) foreach (test ${TESTS}) add_executable(${test} ${test}.cpp) add_dependencies(${test} network-uri gtest_main) target_link_libraries(${test} ${CMAKE_THREAD_LIBS_INIT} network-uri gtest_main) if (OPENSSL_FOUND) target_link_libraries(${test} ${OPENSSL_LIBRARIES}) endif() set_target_properties(${test} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${Uri_BINARY_DIR}/tests) add_test(${test} ${Uri_BINARY_DIR}/tests/${test}) endforeach (test) file(GLOB URI_LISTS *.txt) file(COPY ${URI_LISTS} DESTINATION ${Uri_BINARY_DIR}/test) asymptote-3.05/LspCpp/third_party/uri/test/uri_builder_test.cpp0000644000000000000000000005377615031566105023570 0ustar rootroot// Copyright (c) Glyn Matthews 2012-2016. // Copyright 2012 Google, Inc. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include "string_utility.hpp" TEST(builder_test, empty_uri_doesnt_throw) { network::uri_builder builder; ASSERT_NO_THROW(builder.uri()); } TEST(builder_test, empty_uri) { network::uri_builder builder; network::uri instance(builder); ASSERT_TRUE(instance.empty()); } TEST(builder_test, simple_uri_doesnt_throw) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/") ; ASSERT_NO_THROW(builder.uri()); } TEST(builder_test, simple_uri) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/") ; ASSERT_EQ("http://www.example.com/", builder.uri().string()); } TEST(builder_test, simple_uri_has_scheme) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/") ; ASSERT_TRUE(builder.uri().has_scheme()); } TEST(builder_test, simple_uri_scheme_value) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/") ; ASSERT_EQ("http", builder.uri().scheme()); } TEST(builder_test, simple_uri_has_no_user_info) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/") ; ASSERT_FALSE(builder.uri().has_user_info()); } TEST(builder_test, simple_uri_has_host) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/") ; ASSERT_TRUE(builder.uri().has_host()); } TEST(builder_test, simple_uri_host_value) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/") ; ASSERT_EQ("www.example.com", builder.uri().host()); } TEST(builder_test, simple_uri_has_no_port) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/") ; ASSERT_FALSE(builder.uri().has_port()); } TEST(builder_test, simple_uri_has_path) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/") ; ASSERT_TRUE(builder.uri().has_path()); } TEST(builder_test, simple_uri_path_value) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/") ; ASSERT_EQ("/", builder.uri().path()); } TEST(builder_test, simple_uri_has_no_query) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/") ; ASSERT_FALSE(builder.uri().has_query()); } TEST(builder_test, simple_uri_has_no_fragment) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/") ; ASSERT_FALSE(builder.uri().has_fragment()); } TEST(builder_test, simple_opaque_uri_doesnt_throw) { network::uri_builder builder; builder .scheme("mailto") .path("john.doe@example.com") ; ASSERT_NO_THROW(builder.uri()); } TEST(builder_test, simple_opaque_uri) { network::uri_builder builder; builder .scheme("mailto") .path("john.doe@example.com") ; ASSERT_EQ("mailto:john.doe@example.com", builder.uri().string()); } TEST(builder_test, simple_opaque_uri_has_scheme) { network::uri_builder builder; builder .scheme("mailto") .path("john.doe@example.com") ; ASSERT_TRUE(builder.uri().has_scheme()); } TEST(builder_test, simple_opaque_uri_scheme_value) { network::uri_builder builder; builder .scheme("mailto") .path("john.doe@example.com") ; ASSERT_EQ("mailto", builder.uri().scheme()); } TEST(builder_test, relative_hierarchical_uri_doesnt_throw) { network::uri_builder builder; builder .host("www.example.com") .path("/") ; ASSERT_NO_THROW(builder.uri()); } TEST(builder_test, relative_hierarchical_uri) { network::uri_builder builder; builder .host("www.example.com") .path("/") ; ASSERT_EQ("www.example.com/", builder.uri().string()); } TEST(builder_test, relative_opaque_uri_doesnt_throw) { network::uri_builder builder; builder .path("john.doe@example.com") ; ASSERT_NO_THROW(builder.uri()); } TEST(builder_test, relative_opaque_uri) { network::uri_builder builder; builder .path("john.doe@example.com") ; ASSERT_EQ("john.doe@example.com", builder.uri().string()); } TEST(builder_test, full_uri_doesnt_throw) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_NO_THROW(builder.uri()); } TEST(builder_test, full_uri) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_EQ("http://user@www.example.com:80/path?query=value#fragment", builder.uri().string()); } TEST(builder_test, full_uri_has_scheme) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_TRUE(builder.uri().has_scheme()); } TEST(builder_test, full_uri_scheme_value) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_EQ("http", builder.uri().scheme()); } TEST(builder_test, full_uri_has_user_info) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_TRUE(builder.uri().has_user_info()); } TEST(builder_test, full_uri_user_info_value) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_EQ("user", builder.uri().user_info()); } TEST(builder_test, full_uri_has_host) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_TRUE(builder.uri().has_host()); } TEST(builder_test, full_uri_host_value) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_EQ("www.example.com", builder.uri().host()); } TEST(builder_test, full_uri_has_port) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_TRUE(builder.uri().has_port()); } TEST(builder_test, full_uri_has_path) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_TRUE(builder.uri().has_path()); } TEST(builder_test, full_uri_path_value) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_EQ("/path", builder.uri().path()); } TEST(builder_test, full_uri_has_query) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_TRUE(builder.uri().has_query()); } TEST(builder_test, full_uri_query_value) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_EQ("query=value", builder.uri().query()); } TEST(builder_test, full_uri_has_fragment) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_TRUE(builder.uri().has_fragment()); } TEST(builder_test, full_uri_fragment_value) { network::uri_builder builder; builder .scheme("http") .user_info("user") .host("www.example.com") .port("80") .path("/path") .append_query_key_value_pair("query", "value") .fragment("fragment") ; ASSERT_EQ("fragment", builder.uri().fragment()); } TEST(builder_test, relative_uri) { network::uri_builder builder; builder .host("www.example.com") .path("/") ; ASSERT_EQ("www.example.com/", builder.uri().string()); } TEST(builder_test, relative_uri_scheme) { network::uri_builder builder; builder .host("www.example.com") .path("/") ; ASSERT_FALSE(builder.uri().has_scheme()); } TEST(builder_test, authority) { network::uri_builder builder; builder .scheme("http") .authority("www.example.com:8080") .path("/") ; ASSERT_EQ("http://www.example.com:8080/", builder.uri().string()); ASSERT_EQ("www.example.com", builder.uri().host()); ASSERT_EQ("8080", builder.uri().port()); } TEST(builder_test, relative_uri_has_host) { network::uri_builder builder; builder .host("www.example.com") .path("/") ; ASSERT_TRUE(builder.uri().has_host()); } TEST(builder_test, relative_uri_host_value) { network::uri_builder builder; builder .host("www.example.com") .path("/") ; ASSERT_EQ("www.example.com", builder.uri().host()); } TEST(builder_test, relative_uri_has_path) { network::uri_builder builder; builder .host("www.example.com") .path("/") ; ASSERT_TRUE(builder.uri().has_path()); } TEST(builder_test, relative_uri_path_value) { network::uri_builder builder; builder .host("www.example.com") .path("/") ; ASSERT_EQ("/", builder.uri().path()); } TEST(builder_test, build_relative_uri_with_path_query_and_fragment) { network::uri_builder builder; builder .path("/path/") .append_query_key_value_pair("key", "value") .fragment("fragment") ; ASSERT_EQ("/path/", builder.uri().path()); ASSERT_EQ("key=value", builder.uri().query()); ASSERT_EQ("fragment", builder.uri().fragment()); } TEST(builder_test, build_uri_with_capital_scheme) { network::uri_builder builder; builder .scheme("HTTP") .host("www.example.com") .path("/") ; ASSERT_EQ("http://www.example.com/", builder.uri().string()); } TEST(builder_test, build_uri_with_capital_host) { network::uri_builder builder; builder .scheme("http") .host("WWW.EXAMPLE.COM") .path("/") ; ASSERT_EQ("http://www.example.com/", builder.uri().string()); } TEST(builder_test, build_uri_with_unencoded_path) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/A path with spaces") ; ASSERT_EQ("http://www.example.com/A%20path%20with%20spaces", builder.uri().string()); } TEST(builder_test, DISABLED_builder_uri_and_remove_dot_segments_from_path) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/A/./path/") ; ASSERT_EQ("http://www.example.com/A/path/", builder.uri().string()); } TEST(builder_test, build_uri_with_qmark_in_path) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/?/") ; ASSERT_EQ("http://www.example.com/%3F/", builder.uri().string()); } TEST(builder_test, build_uri_with_hash_in_path) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .path("/#/") ; ASSERT_EQ("http://www.example.com/%23/", builder.uri().string()); } TEST(builder_test, simple_port) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .port(8000) .path("/") ; ASSERT_EQ("http://www.example.com:8000/", builder.uri().string()); } TEST(builder_test, build_uri_with_query_item) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .append_query_key_value_pair("a", "1") .path("/") ; ASSERT_EQ("http://www.example.com/?a=1", builder.uri().string()); } TEST(builder_test, build_uri_with_multiple_query_items) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .append_query_key_value_pair("a", "1") .append_query_key_value_pair("b", "2") .path("/") ; ASSERT_EQ("http://www.example.com/?a=1&b=2", builder.uri().string()); } TEST(builder_test, build_uri_with_query_item_with_encoded_chars) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .append_query_key_value_pair("a", "parameter with encoded chars!") .path("/") ; ASSERT_EQ("http://www.example.com/?a=parameter%20with%20encoded%20chars%21", builder.uri().string()); } TEST(builder_test, build_uri_with_multiple_query_items_with_encoded_chars) { network::uri_builder builder; builder .scheme("http") .host("www.example.com") .append_query_key_value_pair("a", "first parameter with encoded chars!") .append_query_key_value_pair("b", "second parameter with encoded chars!") .path("/") ; ASSERT_EQ("http://www.example.com/?a=first%20parameter%20with%20encoded%20chars%21&b=second%20parameter%20with%20encoded%20chars%21", builder.uri().string()); } TEST(builder_test, construct_from_existing_uri) { network::uri instance("http://www.example.com/"); network::uri_builder builder(instance); ASSERT_EQ("http://www.example.com/", builder.uri().string()); } TEST(builder_test, build_from_existing_uri) { network::uri instance("http://www.example.com/"); network::uri_builder builder(instance); builder.append_query_key_value_pair("a", "1").append_query_key_value_pair("b", "2").fragment("fragment"); ASSERT_EQ("http://www.example.com/?a=1&b=2#fragment", builder.uri().string()); } TEST(builder_test, authority_without_port_test) { network::uri_builder builder; builder .scheme("https") .authority("www.example.com") ; ASSERT_EQ("www.example.com", builder.uri().authority()); } TEST(builder_test, authority_with_port_test) { network::uri_builder builder; builder .scheme("https") .authority("www.example.com:") ; ASSERT_EQ("www.example.com:", builder.uri().authority()); } TEST(builder_test, DISABLED_authority_without_host_test) { network::uri_builder builder; builder .scheme("https") .authority(":1234") ; ASSERT_EQ(":1234", builder.uri().authority()); } TEST(builder_test, clear_user_info_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); network::uri_builder builder(instance); builder.clear_user_info(); ASSERT_EQ("http://www.example.com:80/path?query#fragment", builder.uri().string()); } TEST(builder_test, clear_port_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); network::uri_builder builder(instance); builder.clear_port(); ASSERT_EQ("http://user@www.example.com/path?query#fragment", builder.uri().string()); } TEST(builder_test, clear_path_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); network::uri_builder builder(instance); builder.clear_path(); ASSERT_EQ("http://user@www.example.com:80?query#fragment", builder.uri().string()); } TEST(builder_test, clear_query_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); network::uri_builder builder(instance); builder.clear_query(); ASSERT_EQ("http://user@www.example.com:80/path#fragment", builder.uri().string()); } TEST(uri_test, clear_query_params_with_no_query) { network::uri original("http://example.com/path"); network::uri_builder builder(original); builder.clear_query(); } TEST(builder_test, clear_fragment_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); network::uri_builder builder(instance); builder.clear_fragment(); ASSERT_EQ("http://user@www.example.com:80/path?query", builder.uri().string()); } TEST(builder_test, empty_username) { std::string user_info(":"); network::uri_builder builder; builder.scheme("ftp").host("127.0.0.1").user_info(user_info); ASSERT_EQ("ftp://:@127.0.0.1", builder.uri().string()); } TEST(builder_test, path_should_be_prefixed_with_slash) { std::string path("relative"); network::uri_builder builder; builder.scheme("ftp").host("127.0.0.1").path(path); ASSERT_EQ("ftp://127.0.0.1/relative", builder.uri().string()); } TEST(builder_test, path_should_be_prefixed_with_slash_2) { network::uri_builder builder; builder .scheme("ftp").host("127.0.0.1").path("noleadingslash/foo.txt"); ASSERT_EQ("/noleadingslash/foo.txt", builder.uri().path()); } TEST(builder_test, set_multiple_query_with_encoding) { network::uri_builder builder; builder .scheme("http") .host("example.com") .append_query_key_value_pair("q1", "foo bar") .append_query_key_value_pair("q2", "biz baz") ; ASSERT_EQ("http://example.com?q1=foo%20bar&q2=biz%20baz", builder.uri().string()); } TEST(builder_test, non_array_string_literals_should_work) { const char* p = "http"; const char* q = "foo"; network::uri_builder builder; builder .scheme(p) .host("example.com") .path(q) ; ASSERT_EQ("http://example.com/foo", builder.uri()); } TEST(builder_test, non_const_non_array_string_literals_should_work) { const char* p = "http"; const char* q = "foo"; network::uri_builder builder; builder .scheme(const_cast(p)) .host("example.com") .path(const_cast(q)) ; ASSERT_EQ("http://example.com/foo", builder.uri()); } TEST(builder_test, scheme_and_absolute_path) { network::uri_builder builder; builder .scheme("foo") .path("/bar") ; ASSERT_EQ("foo:/bar", builder.uri()); ASSERT_EQ("foo", builder.uri().scheme()); ASSERT_EQ("/bar", builder.uri().path()); } TEST(builder_test, assignment_operator_bug_116) { // https://github.com/cpp-netlib/uri/issues/116 network::uri a("http://a.com:1234"); ASSERT_TRUE(a.has_port()); const network::uri b("http://b.com"); ASSERT_FALSE(b.has_port()); a = b; ASSERT_FALSE(a.has_port()) << a.string(); } TEST(builder_test, construct_from_uri_bug_116) { // https://github.com/cpp-netlib/uri/issues/116 network::uri a("http://a.com:1234"); const network::uri b("http://b.com"); a = b; network::uri_builder ub(a); const network::uri c(ub.uri()); ASSERT_FALSE(c.has_port()) << c.string(); } TEST(builder_test, append_query_value) { network::uri_builder ub(network::uri("http://example.com")); ASSERT_NO_THROW(ub.append_query_component("q")); ASSERT_EQ(network::string_view("q"), ub.uri().query_begin()->first); } TEST(builder_test, append_query_value_encodes_equal_sign) { network::uri_builder ub(network::uri("http://example.com")); ASSERT_NO_THROW(ub.append_query_component("=")); ASSERT_EQ(network::string_view("%3D"), ub.uri().query_begin()->first); } TEST(builder_test, append_query_key_value_pair_encodes_equals_sign) { network::uri_builder ub(network::uri("http://example.com")); ASSERT_NO_THROW(ub.append_query_key_value_pair("q", "=")); ASSERT_EQ(network::string_view("q"), ub.uri().query_begin()->first); ASSERT_EQ(network::string_view("%3D"), ub.uri().query_begin()->second); } TEST(builder_test, append_query_key_value_pair_encodes_number_sign) { network::uri_builder ub(network::uri("http://example.com")); ASSERT_NO_THROW(ub.append_query_key_value_pair("q", "#")); ASSERT_EQ(network::string_view("%23"), ub.uri().query_begin()->second); } TEST(builder_test, append_query_key_value_pair_encodes_percent_sign) { network::uri_builder ub(network::uri("http://example.com")); ASSERT_NO_THROW(ub.append_query_key_value_pair("q", "%")); ASSERT_EQ(network::string_view("%25"), ub.uri().query_begin()->second); } TEST(builder_test, append_query_key_value_pair_encodes_ampersand) { network::uri_builder ub(network::uri("http://example.com")); ASSERT_NO_THROW(ub.append_query_key_value_pair("q", "&")); ASSERT_EQ(network::string_view("%26"), ub.uri().query_begin()->second); } TEST(builder_test, append_query_key_value_pair_does_not_encode_slash) { // https://tools.ietf.org/html/rfc3986#section-3.4 network::uri_builder ub(network::uri("http://example.com")); ASSERT_NO_THROW(ub.append_query_key_value_pair("q", "/")); ASSERT_EQ(network::string_view("/"), ub.uri().query_begin()->second); } TEST(builder_test, append_query_key_value_pair_does_not_encode_qmark) { // https://tools.ietf.org/html/rfc3986#section-3.4 network::uri_builder ub(network::uri("http://example.com")); ASSERT_NO_THROW(ub.append_query_key_value_pair("q", "?")); ASSERT_EQ(network::string_view("?"), ub.uri().query_begin()->second); } TEST(builder_test, build_from_uri_with_encoded_user_info) { network::uri_builder ub(network::uri("http://%40@example.com")); ASSERT_EQ(network::string_view("%40"), ub.uri().user_info()); } TEST(builder_test, build_from_uri_with_encoded_query) { network::uri_builder ub(network::uri("http://example.com?x=%40")); ASSERT_EQ(network::string_view("x=%40"), ub.uri().query()); } TEST(builder_test, build_from_uri_with_encoded_fragment) { network::uri_builder ub(network::uri("http://example.com#%40")); ASSERT_EQ(network::string_view("%40"), ub.uri().fragment()); } asymptote-3.05/LspCpp/third_party/uri/test/test_uri.hpp0000644000000000000000000000400515031566105022044 0ustar rootroot// Copyright 2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt of copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef TEST_URI_INC #define TEST_URI_INC #include #include #include "../src/detail/uri_parse.hpp" using network::detail::parse; using network::detail::uri_part; using network::detail::uri_parts; namespace test { struct uri { explicit uri(const std::string &uri) : uri_(uri), view(uri_) { it = std::begin(view); last = std::end(view); } bool parse_uri() { return parse(it, last, parts); } std::string parsed_till() const { return std::string(std::begin(view), it); } bool has_scheme() const { return static_cast(parts.scheme); } std::string scheme() const { return (*parts.scheme).to_string(); } bool has_user_info() const { return static_cast(parts.hier_part.user_info); } std::string user_info() const { return (*parts.hier_part.user_info).to_string(); } bool has_host() const { return static_cast(parts.hier_part.host); } std::string host() const { return (*parts.hier_part.host).to_string(); } bool has_port() const { return static_cast(parts.hier_part.port); } std::string port() const { return (*parts.hier_part.port).to_string(); } bool has_path() const { return static_cast(parts.hier_part.path); } std::string path() const { return (*parts.hier_part.path).to_string(); } bool has_query() const { return static_cast(parts.query); } std::string query() const { return (*parts.query).to_string(); } bool has_fragment() const { return static_cast(parts.fragment); } std::string fragment() const { return (*parts.fragment).to_string(); } std::string uri_; network::string_view view; network::string_view::const_iterator it, last; uri_parts parts; }; } // namespace test #endif // TEST_URI_INC asymptote-3.05/LspCpp/third_party/uri/test/uri_parse_path_test.cpp0000644000000000000000000000743615031566105024260 0ustar rootroot// Copyright 2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt of copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include "test_uri.hpp" #include "string_utility.hpp" // path = path-abempty ; begins with "/" or is empty // / path-absolute ; begins with "/" but not "//" // / path-noscheme ; begins with a non-colon segment // / path-rootless ; begins with a segment // / path-empty ; zero characters // // path-abempty = *( "/" segment ) // path-absolute = "/" [ segment-nz *( "/" segment ) ] // path-noscheme = segment-nz-nc *( "/" segment ) // path-rootless = segment-nz *( "/" segment ) // path-empty = 0 // // segment = *pchar // segment-nz = 1*pchar // segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" ) // ; non-zero-length segment without any colon ":" // // pchar = unreserved / pct-encoded / sub-delims / ":" / "@" TEST(uri_parse_path_test, test_empty_path) { test::uri uri("http://123.34.23.56"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_path()); EXPECT_TRUE(uri.path().empty()); } TEST(uri_parse_path_test, test_empty_path_with_query) { test::uri uri("http://123.34.23.56?query"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_path()); EXPECT_TRUE(uri.path().empty()); } TEST(uri_parse_path_test, test_empty_path_with_fragment) { test::uri uri("http://123.34.23.56#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_path()); EXPECT_TRUE(uri.path().empty()); } TEST(uri_parse_path_test, test_single_slash) { test::uri uri("http://123.34.23.56/"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/", uri.path()); } TEST(uri_parse_path_test, test_single_slash_with_query) { test::uri uri("http://123.34.23.56/?query"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/", uri.path()); } TEST(uri_parse_path_test, test_single_slash_with_fragment) { test::uri uri("http://123.34.23.56/#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/", uri.path()); } TEST(uri_parse_path_test, test_double_slash_empty_path_empty_everything) { test::uri uri("file://"); EXPECT_FALSE(uri.parse_uri()); } TEST(uri_parse_path_test, test_triple_slash_empty_everything) { test::uri uri("file:///"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/", uri.path()); } TEST(uri_parse_path_test, test_triple_slash_with_path_name) { test::uri uri("file:///path"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/path", uri.path()); } TEST(uri_parse_path_test, test_rootless_1) { test::uri uri("mailto:john.doe@example.com"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("john.doe@example.com", uri.path()); } TEST(uri_parse_path_test, test_invalid_characters_in_path) { test::uri uri("mailto:jo%hn.doe@example.com"); EXPECT_FALSE(uri.parse_uri()); EXPECT_EQ("mailto:jo", uri.parsed_till()); } TEST(uri_parse_path_test, test_valid_percent_encoded_characters_in_path) { test::uri uri("mailto:john.doe@example%F0.com"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("john.doe@example%F0.com", uri.path()); } TEST(uri_parse_path_test, test_invalid_percent_encoded_characters_in_path_1) { test::uri uri("mailto:john.doe@example%G0.com"); EXPECT_FALSE(uri.parse_uri()); EXPECT_EQ("mailto:john.doe@example", uri.parsed_till()); } TEST(uri_parse_path_test, test_invalid_percent_encoded_characters_in_path_2) { test::uri uri("mailto:john.doe@example%0G.com"); EXPECT_FALSE(uri.parse_uri()); EXPECT_EQ("mailto:john.doe@example", uri.parsed_till()); } asymptote-3.05/LspCpp/third_party/uri/test/string_utility.hpp0000644000000000000000000000074315031566105023304 0ustar rootroot// Copyright 2013-2016 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt of copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef URI_TEST_STRING_UTILITY_INC #define URI_TEST_STRING_UTILITY_INC #include namespace network { inline bool operator==(const char *lhs, string_view rhs) { return string_view(lhs) == rhs; } } // namespace network #endif // URI_TEST_STRING_UTILITY_INC asymptote-3.05/LspCpp/third_party/uri/test/uri_test.cpp0000644000000000000000000010102015031566105022032 0ustar rootroot// Copyright 2010 Jeroen Habraken. // Copyright 2009-2017 Dean Michael Berris, Glyn Matthews. // Copyright 2012 Google, Inc. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt of copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include #include "string_utility.hpp" TEST(uri_test, construct_invalid_uri) { EXPECT_THROW(network::uri("I am not a valid URI."), network::uri_syntax_error); } TEST(uri_test, make_invalid_uri) { std::error_code ec; network::uri uri = network::make_uri("I am not a valid URI.", ec); EXPECT_TRUE(static_cast(ec)); } TEST(uri_test, construct_uri_from_char_array) { EXPECT_NO_THROW(network::uri("http://www.example.com/")); } TEST(uri_test, construct_uri_starting_with_ipv4_like) { EXPECT_NO_THROW(network::uri("http://198.51.100.0.example.com/")); } TEST(uri_test, construct_uri_starting_with_ipv4_like_glued) { ASSERT_NO_THROW(network::uri("http://198.51.100.0example.com/")); } TEST(uri_test, construct_uri_like_short_ipv4) { EXPECT_NO_THROW(network::uri("http://198.51.100/")); } TEST(uri_test, construct_uri_like_long_ipv4) { EXPECT_NO_THROW(network::uri("http://198.51.100.0.255/")); } TEST(uri_test, make_uri_from_char_array) { std::error_code ec; network::uri uri = network::make_uri("http://www.example.com/", ec); EXPECT_FALSE(ec); } TEST(uri_test, construct_uri_from_wchar_t_array) { EXPECT_NO_THROW(network::uri(L"http://www.example.com/")); } TEST(uri_test, make_uri_from_wchar_t_array) { std::error_code ec; network::uri uri = network::make_uri(L"http://www.example.com/", ec); EXPECT_FALSE(ec); } TEST(uri_test, construct_uri_from_string) { EXPECT_NO_THROW(network::uri(std::string("http://www.example.com/"))); } TEST(uri_test, make_uri_from_string) { std::error_code ec; network::uri uri = network::make_uri(std::string("http://www.example.com/"), ec); EXPECT_FALSE(ec); } TEST(uri_test, construct_uri_from_wstring) { EXPECT_NO_THROW(network::uri(std::wstring(L"http://www.example.com/"))); } TEST(uri_test, make_uri_from_wstring) { std::error_code ec; network::uri uri = network::make_uri(std::wstring(L"http://www.example.com/"), ec); EXPECT_FALSE(ec); } TEST(uri_test, basic_uri_scheme_test) { network::uri instance("http://www.example.com/"); ASSERT_TRUE(instance.has_scheme()); EXPECT_EQ("http", instance.scheme()); } TEST(uri_test, basic_uri_user_info_test) { network::uri instance("http://www.example.com/"); EXPECT_FALSE(instance.has_user_info()); } TEST(uri_test, basic_uri_host_test) { network::uri instance("http://www.example.com/"); ASSERT_TRUE(instance.has_host()); EXPECT_EQ("www.example.com", instance.host()); } TEST(uri_test, basic_uri_port_test) { network::uri instance("http://www.example.com/"); EXPECT_FALSE(instance.has_port()); } TEST(uri_test, basic_uri_path_test) { network::uri instance("http://www.example.com/"); ASSERT_TRUE(instance.has_path()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, basic_uri_query_test) { network::uri instance("http://www.example.com/"); EXPECT_FALSE(instance.has_query()); } TEST(uri_test, basic_uri_fragment_test) { network::uri instance("http://www.example.com/"); EXPECT_FALSE(instance.has_fragment()); } TEST(uri_test, basic_uri_value_semantics_test) { network::uri original; network::uri assigned; assigned = original; EXPECT_EQ(original, assigned); assigned = network::uri("http://www.example.com/"); EXPECT_NE(original, assigned); network::uri copy(assigned); EXPECT_EQ(copy, assigned); } TEST(uri_test, full_uri_scheme_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); EXPECT_EQ("http", instance.scheme()); } TEST(uri_test, full_uri_user_info_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); EXPECT_EQ("user", instance.user_info()); } TEST(uri_test, full_uri_host_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); EXPECT_EQ("www.example.com", instance.host()); } TEST(uri_test, full_uri_port_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); EXPECT_EQ("80", instance.port()); } TEST(uri_test, full_uri_port_as_int_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); EXPECT_EQ(80, instance.port()); } TEST(uri_test, full_uri_path_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); EXPECT_EQ("/path", instance.path()); } TEST(uri_test, full_uri_query_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); EXPECT_EQ("query", instance.query()); } TEST(uri_test, full_uri_fragment_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); EXPECT_EQ("fragment", instance.fragment()); } TEST(uri_test, full_uri_range_scheme_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); ASSERT_TRUE(instance.has_scheme()); EXPECT_EQ("http", instance.scheme()); } TEST(uri_test, full_uri_range_user_info_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); ASSERT_TRUE(instance.has_user_info()); EXPECT_EQ("user", instance.user_info()); } TEST(uri_test, full_uri_range_host_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); ASSERT_TRUE(instance.has_host()); EXPECT_EQ("www.example.com", instance.host()); } TEST(uri_test, full_uri_range_port_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); ASSERT_TRUE(instance.has_port()); EXPECT_EQ("80", instance.port()); } TEST(uri_test, full_uri_range_path_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); ASSERT_TRUE(instance.has_path()); EXPECT_EQ("/path", instance.path()); } TEST(uri_test, full_uri_range_query_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); ASSERT_TRUE(instance.has_query()); EXPECT_EQ("query", instance.query()); } TEST(uri_test, full_uri_range_fragment_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); ASSERT_TRUE(instance.has_fragment()); EXPECT_EQ("fragment", instance.fragment()); } TEST(uri_test, uri_with_empty_query) { network::uri instance("http://example.com/?"); ASSERT_TRUE(instance.has_query()); EXPECT_EQ("", instance.query()); } TEST(uri_test, mailto_test) { network::uri instance("mailto:john.doe@example.com"); EXPECT_EQ("mailto", instance.scheme()); EXPECT_EQ("john.doe@example.com", instance.path()); } TEST(uri_test, file_test) { network::uri instance("file:///bin/bash"); EXPECT_EQ("file", instance.scheme()); EXPECT_EQ("/bin/bash", instance.path()); } TEST(uri_test, file_path_has_host_bug_98) { network::uri instance("file:///bin/bash"); EXPECT_TRUE(instance.has_scheme()); EXPECT_FALSE(instance.has_user_info()); EXPECT_TRUE(instance.has_host()); EXPECT_FALSE(instance.has_port()); EXPECT_TRUE(instance.has_path()); EXPECT_FALSE(instance.has_query()); EXPECT_FALSE(instance.has_fragment()); } TEST(uri_test, xmpp_test) { network::uri instance("xmpp:example-node@example.com?message;subject=Hello%20World"); EXPECT_EQ("xmpp", instance.scheme()); EXPECT_EQ("example-node@example.com", instance.path()); EXPECT_EQ("message;subject=Hello%20World", instance.query()); } TEST(uri_test, ipv4_address_test) { network::uri instance("http://129.79.245.252/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("129.79.245.252", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv4_loopback_test) { network::uri instance("http://127.0.0.1/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("127.0.0.1", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_address_test_1) { network::uri instance("http://[1080:0:0:0:8:800:200C:417A]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[1080:0:0:0:8:800:200C:417A]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_address_test_2) { network::uri instance("http://[2001:db8:85a3:8d3:1319:8a2e:370:7348]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[2001:db8:85a3:8d3:1319:8a2e:370:7348]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_address_test_3) { network::uri instance("http://[2001:db8:85a3:0:0:8a2e:370:7334]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[2001:db8:85a3:0:0:8a2e:370:7334]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_address_test_4) { network::uri instance("http://[2001:db8:85a3::8a2e:370:7334]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[2001:db8:85a3::8a2e:370:7334]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_address_test_5) { network::uri instance("http://[2001:0db8:0000:0000:0000:0000:1428:57ab]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[2001:0db8:0000:0000:0000:0000:1428:57ab]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_address_test_6) { network::uri instance("http://[2001:0db8:0000:0000:0000::1428:57ab]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[2001:0db8:0000:0000:0000::1428:57ab]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_address_test_7) { network::uri instance("http://[2001:0db8:0:0:0:0:1428:57ab]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[2001:0db8:0:0:0:0:1428:57ab]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_address_test_8) { network::uri instance("http://[2001:0db8:0:0::1428:57ab]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[2001:0db8:0:0::1428:57ab]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_address_test_9) { network::uri instance("http://[2001:0db8::1428:57ab]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[2001:0db8::1428:57ab]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_address_test_10) { network::uri instance("http://[2001:db8::1428:57ab]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[2001:db8::1428:57ab]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_address_test_11) { network::uri instance("http://[::ffff:0c22:384e]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[::ffff:0c22:384e]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_address_test_12) { network::uri instance("http://[fe80::]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[fe80::]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_address_test_13) { network::uri instance("http://[::ffff:c000:280]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[::ffff:c000:280]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_loopback_test) { network::uri instance("http://[::1]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[::1]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_loopback_test_1) { network::uri instance("http://[0000:0000:0000:0000:0000:0000:0000:0001]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[0000:0000:0000:0000:0000:0000:0000:0001]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_v4inv6_test_1) { network::uri instance("http://[::ffff:12.34.56.78]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[::ffff:12.34.56.78]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ipv6_v4inv6_test_2) { network::uri instance("http://[::ffff:192.0.2.128]/"); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("[::ffff:192.0.2.128]", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, ftp_test) { network::uri instance("ftp://john.doe@ftp.example.com/"); EXPECT_EQ("ftp", instance.scheme()); EXPECT_EQ("john.doe", instance.user_info()); EXPECT_EQ("ftp.example.com", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, news_test) { network::uri instance("news:comp.infosystems.www.servers.unix"); EXPECT_EQ("news", instance.scheme()); EXPECT_EQ("comp.infosystems.www.servers.unix", instance.path()); } TEST(uri_test, tel_test) { network::uri instance("tel:+1-816-555-1212"); EXPECT_EQ("tel", instance.scheme()); EXPECT_EQ("+1-816-555-1212", instance.path()); } TEST(uri_test, ldap_test) { network::uri instance("ldap://[2001:db8::7]/c=GB?objectClass?one"); EXPECT_EQ("ldap", instance.scheme()); EXPECT_EQ("[2001:db8::7]", instance.host()); EXPECT_EQ("/c=GB", instance.path()); EXPECT_EQ("objectClass?one", instance.query()); } TEST(uri_test, urn_test) { network::uri instance("urn:oasis:names:specification:docbook:dtd:xml:4.1.2"); EXPECT_EQ("urn", instance.scheme()); EXPECT_EQ("oasis:names:specification:docbook:dtd:xml:4.1.2", instance.path()); } TEST(uri_test, svn_ssh_test) { network::uri instance("svn+ssh://example.com/"); EXPECT_EQ("svn+ssh", instance.scheme()); EXPECT_EQ("example.com", instance.host()); EXPECT_EQ("/", instance.path()); } TEST(uri_test, copy_constructor_test) { network::uri instance("http://www.example.com/"); network::uri copy = instance; EXPECT_EQ(instance, copy); } TEST(uri_test, assignment_test) { network::uri instance("http://www.example.com/"); network::uri copy; copy = instance; EXPECT_EQ(instance, copy); } TEST(uri_test, swap_test) { network::uri original("http://example.com/path/to/file.txt"); network::uri instance("file:///something/different/"); original.swap(instance); ASSERT_TRUE(original.has_scheme()); ASSERT_TRUE(original.has_host()); ASSERT_TRUE(original.has_path()); EXPECT_EQ("file", original.scheme()); EXPECT_EQ("", original.host()); EXPECT_EQ("/something/different/", original.path()); ASSERT_TRUE(instance.has_scheme()); ASSERT_TRUE(instance.has_host()); ASSERT_TRUE(instance.has_path()); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("example.com", instance.host()); EXPECT_EQ("/path/to/file.txt", instance.path()); } TEST(uri_test, authority_test) { network::uri instance("http://user@www.example.com:80/path?query#fragment"); ASSERT_TRUE(instance.has_authority()); EXPECT_EQ("user@www.example.com:80", instance.authority()); } TEST(uri_test, partial_authority_test) { network::uri instance("http://www.example.com/path?query#fragment"); ASSERT_TRUE(instance.has_authority()); EXPECT_EQ("www.example.com", instance.authority()); } TEST(uri_test, range_test) { const std::string url("http://www.example.com/"); network::uri instance(url); EXPECT_TRUE(std::equal(std::begin(instance), std::end(instance), std::begin(url))); } TEST(uri_test, issue_104_test) { // https://github.com/cpp-netlib/cpp-netlib/issues/104 std::unique_ptr instance(new network::uri("http://www.example.com/")); network::uri copy = *instance; instance.reset(); EXPECT_EQ("http", copy.scheme()); } TEST(uri_test, uri_set_test) { std::set uri_set; uri_set.insert(network::uri("http://www.example.com/")); EXPECT_FALSE(uri_set.empty()); EXPECT_EQ(network::uri("http://www.example.com/"), (*std::begin(uri_set))); } TEST(uri_test, uri_unordered_set_test) { std::unordered_set uri_set; uri_set.insert(network::uri("http://www.example.com/")); EXPECT_FALSE(uri_set.empty()); EXPECT_EQ(network::uri("http://www.example.com/"), (*std::begin(uri_set))); } TEST(uri_test, empty_uri) { network::uri instance; EXPECT_TRUE(instance.empty()); } TEST(uri_test, empty_uri_has_no_scheme) { network::uri instance; EXPECT_FALSE(instance.has_scheme()); } TEST(uri_test, empty_uri_has_no_user_info) { network::uri instance; EXPECT_FALSE(instance.has_user_info()); } TEST(uri_test, empty_uri_has_no_host) { network::uri instance; EXPECT_FALSE(instance.has_host()); } TEST(uri_test, empty_uri_has_no_port) { network::uri instance; EXPECT_FALSE(instance.has_port()); } TEST(uri_test, empty_uri_has_no_path) { network::uri instance; EXPECT_FALSE(instance.has_path()); } TEST(uri_test, empty_uri_has_no_query) { network::uri instance; EXPECT_FALSE(instance.has_query()); } TEST(uri_test, empty_uri_has_no_fragment) { network::uri instance; EXPECT_FALSE(instance.has_fragment()); } TEST(uri_test, http_is_absolute) { network::uri instance("http://www.example.com/"); EXPECT_TRUE(instance.is_absolute()); } TEST(uri_test, mailto_has_no_user_info) { network::uri instance("mailto:john.doe@example.com"); EXPECT_FALSE(instance.has_user_info()); } TEST(uri_test, mailto_has_no_host) { network::uri instance("mailto:john.doe@example.com"); EXPECT_FALSE(instance.has_host()); } TEST(uri_test, mailto_has_no_port) { network::uri instance("mailto:john.doe@example.com"); EXPECT_FALSE(instance.has_port()); } TEST(uri_test, mailto_has_no_authority) { network::uri instance("mailto:john.doe@example.com"); EXPECT_FALSE(instance.has_authority()); } TEST(uri_test, http_is_not_opaque) { network::uri instance("http://www.example.com/"); EXPECT_FALSE(instance.is_opaque()); } TEST(uri_test, file_is_not_opaque) { network::uri instance("file:///bin/bash"); EXPECT_FALSE(instance.is_opaque()); } TEST(uri_test, mailto_is_absolute) { network::uri instance("mailto:john.doe@example.com"); EXPECT_TRUE(instance.is_absolute()); } TEST(uri_test, mailto_is_opaque) { network::uri instance("mailto:john.doe@example.com"); EXPECT_TRUE(instance.is_opaque()); } TEST(uri_test, whitespace_no_throw) { EXPECT_NO_THROW(network::uri(" http://www.example.com/ ")); } TEST(uri_test, whitespace_is_trimmed) { network::uri instance(" http://www.example.com/ "); EXPECT_EQ("http://www.example.com/", instance); } TEST(uri_test, unnormalized_invalid_path_doesnt_throw) { EXPECT_NO_THROW(network::uri("http://www.example.com/..")); } TEST(uri_test, unnormalized_invalid_path_is_valid) { network::uri instance("http://www.example.com/.."); EXPECT_TRUE(instance.has_path()); } TEST(uri_test, unnormalized_invalid_path_value) { network::uri instance("http://www.example.com/.."); EXPECT_EQ("/..", instance.path()); } TEST(uri_test, git) { network::uri instance("git://github.com/cpp-netlib/cpp-netlib.git"); EXPECT_EQ("git", instance.scheme()); EXPECT_EQ("github.com", instance.host()); EXPECT_EQ("/cpp-netlib/cpp-netlib.git", instance.path()); } TEST(uri_test, invalid_port_test) { EXPECT_THROW(network::uri("http://123.34.23.56:6662626/"), network::uri_syntax_error); } TEST(uri_test, valid_empty_port_test) { EXPECT_NO_THROW(network::uri("http://123.34.23.56:/")); } TEST(uri_test, empty_port_test) { network::uri instance("http://123.34.23.56:/"); ASSERT_TRUE(instance.has_port()); EXPECT_EQ("", instance.port()); } TEST(uri_test, full_copy_uri_scheme_test) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = origin; EXPECT_EQ("http", instance.scheme()); } TEST(uri_test, full_copy_uri_user_info_test) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = origin; EXPECT_EQ("user", instance.user_info()); } TEST(uri_test, full_copy_uri_host_test) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = origin; EXPECT_EQ("www.example.com", instance.host()); } TEST(uri_test, full_copy_uri_port_test) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = origin; EXPECT_EQ("80", instance.port()); } TEST(uri_test, full_copy_uri_path_test) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = origin; EXPECT_EQ("/path", instance.path()); } TEST(uri_test, full_copy_uri_query_test) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = origin; EXPECT_EQ("query", instance.query()); } TEST(uri_test, full_copy_uri_fragment_test) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = origin; EXPECT_EQ("fragment", instance.fragment()); } TEST(uri_test, full_move_uri_scheme_test) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = std::move(origin); EXPECT_EQ("http", instance.scheme()); } TEST(uri_test, full_move_uri_user_info_test) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = std::move(origin); EXPECT_EQ("user", instance.user_info()); } TEST(uri_test, full_move_uri_host_test) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = std::move(origin); EXPECT_EQ("www.example.com", instance.host()); } TEST(uri_test, full_move_uri_port_test) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = std::move(origin); EXPECT_EQ("80", instance.port()); } TEST(uri_test, full_move_uri_path_test) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = std::move(origin); EXPECT_EQ("/path", instance.path()); } TEST(uri_test, full_move_uri_query_test) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = std::move(origin); EXPECT_EQ("query", instance.query()); } TEST(uri_test, full_move_uri_fragment_test) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = std::move(origin); EXPECT_EQ("fragment", instance.fragment()); } TEST(uri_test, mailto_uri_path) { network::uri origin("mailto:john.doe@example.com?query#fragment"); network::uri instance = origin; EXPECT_EQ("john.doe@example.com", instance.path()); } TEST(uri_test, mailto_uri_query) { network::uri origin("mailto:john.doe@example.com?query#fragment"); network::uri instance = origin; EXPECT_EQ("query", instance.query()); } TEST(uri_test, mailto_uri_fragment) { network::uri origin("mailto:john.doe@example.com?query#fragment"); network::uri instance = origin; EXPECT_EQ("fragment", instance.fragment()); } TEST(uri_test, opaque_uri_with_one_slash) { network::uri instance("scheme:/path/"); EXPECT_TRUE(instance.is_opaque()); } TEST(uri_test, opaque_uri_with_one_slash_scheme) { network::uri instance("scheme:/path/"); EXPECT_EQ("scheme", instance.scheme()); } TEST(uri_test, opaque_uri_with_one_slash_path) { network::uri instance("scheme:/path/"); EXPECT_EQ("/path/", instance.path()); } TEST(uri_test, opaque_uri_with_one_slash_query) { network::uri instance("scheme:/path/?query#fragment"); EXPECT_EQ("query", instance.query()); } TEST(uri_test, opaque_uri_with_one_slash_fragment) { network::uri instance("scheme:/path/?query#fragment"); EXPECT_EQ("fragment", instance.fragment()); } TEST(uri_test, opaque_uri_with_one_slash_copy) { network::uri origin("scheme:/path/"); network::uri instance = origin; EXPECT_TRUE(instance.is_opaque()); } TEST(uri_test, opaque_uri_with_one_slash_copy_query) { network::uri origin("scheme:/path/?query#fragment"); network::uri instance = origin; EXPECT_EQ("query", instance.query()); } TEST(uri_test, opaque_uri_with_one_slash_copy_fragment) { network::uri origin("scheme:/path/?query#fragment"); network::uri instance = origin; EXPECT_EQ("fragment", instance.fragment()); } TEST(uri_test, move_empty_uri_check_scheme) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = std::move(origin); EXPECT_FALSE(origin.has_scheme()); } TEST(uri_test, move_empty_uri_check_user_info) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = std::move(origin); EXPECT_FALSE(origin.has_user_info()); } TEST(uri_test, move_empty_uri_check_host) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = std::move(origin); EXPECT_FALSE(origin.has_host()); } TEST(uri_test, move_empty_uri_check_port) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = std::move(origin); EXPECT_FALSE(origin.has_port()); } TEST(uri_test, move_empty_uri_check_path) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = std::move(origin); EXPECT_FALSE(origin.has_path()); } TEST(uri_test, move_empty_uri_check_query) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = std::move(origin); EXPECT_FALSE(origin.has_query()); } TEST(uri_test, move_empty_uri_check_fragment) { network::uri origin("http://user@www.example.com:80/path?query#fragment"); network::uri instance = std::move(origin); EXPECT_FALSE(origin.has_fragment()); } TEST(uri_test, DISABLED_empty_username_in_user_info) { network::uri instance("ftp://:@localhost"); ASSERT_TRUE(instance.has_user_info()); EXPECT_EQ(":", instance.user_info()); EXPECT_EQ("localhost", instance.host()); } TEST(uri_test, uri_begins_with_a_colon) { EXPECT_THROW(network::uri("://example.com"), network::uri_syntax_error); } TEST(uri_test, uri_begins_with_a_number) { EXPECT_THROW(network::uri("3http://example.com"), network::uri_syntax_error); } TEST(uri_test, uri_scheme_contains_an_invalid_character) { EXPECT_THROW(network::uri("ht%tp://example.com"), network::uri_syntax_error); } TEST(uri_test, default_constructed_assignment_test) { network::uri instance("http://www.example.com/"); instance = network::uri(); // <-- CRASHES HERE EXPECT_TRUE(instance.empty()); } TEST(uri_test, opaque_path_no_double_slash) { network::uri instance("file:/path/to/something/"); ASSERT_TRUE(instance.has_path()); EXPECT_EQ("/path/to/something/", instance.path()); EXPECT_TRUE(instance.is_opaque()); } TEST(uri_test, non_opaque_path_has_double_slash) { network::uri instance("file:///path/to/something/"); ASSERT_TRUE(instance.has_path()); EXPECT_EQ("/path/to/something/", instance.path()); EXPECT_FALSE(instance.is_opaque()); } TEST(uri_test, query_iterator_with_no_query) { network::uri instance("http://example.com/"); ASSERT_FALSE(instance.has_query()); ASSERT_EQ(instance.query_begin(), instance.query_end()); } TEST(uri_test, query_iterator_with_empty_query) { network::uri instance("http://example.com/?"); ASSERT_TRUE(instance.has_query()); EXPECT_EQ("", instance.query()); EXPECT_EQ(instance.query_begin(), instance.query_end()); } TEST(uri_test, query_iterator_with_single_kvp) { network::uri instance("http://example.com/?a=b"); ASSERT_TRUE(instance.has_query()); auto query_it = instance.query_begin(); ASSERT_NE(query_it, instance.query_end()); EXPECT_EQ("a", query_it->first); EXPECT_EQ("b", query_it->second); ++query_it; EXPECT_EQ(query_it, instance.query_end()); } TEST(uri_test, query_iterator_with_two_kvps) { network::uri instance("http://example.com/?a=b&c=d"); ASSERT_TRUE(instance.has_query()); auto query_it = instance.query_begin(); ASSERT_NE(query_it, instance.query_end()); EXPECT_EQ("a", query_it->first); EXPECT_EQ("b", query_it->second); ++query_it; ASSERT_NE(query_it, instance.query_end()); EXPECT_EQ("c", query_it->first); EXPECT_EQ("d", query_it->second); ++query_it; EXPECT_EQ(query_it, instance.query_end()); } TEST(uri_test, query_iterator_with_two_kvps_using_semicolon_separator) { network::uri instance("http://example.com/?a=b;c=d"); ASSERT_TRUE(instance.has_query()); auto query_it = instance.query_begin(); ASSERT_NE(query_it, instance.query_end()); EXPECT_EQ("a", query_it->first); EXPECT_EQ("b", query_it->second); ++query_it; ASSERT_NE(query_it, instance.query_end()); EXPECT_EQ("c", query_it->first); EXPECT_EQ("d", query_it->second); ++query_it; EXPECT_EQ(query_it, instance.query_end()); } TEST(uri_test, query_iterator_with_key_and_no_value) { network::uri instance("http://example.com/?query"); ASSERT_TRUE(instance.has_query()); auto query_it = instance.query_begin(); EXPECT_EQ("query", query_it->first); EXPECT_EQ("", query_it->second); ++query_it; EXPECT_EQ(query_it, instance.query_end()); } TEST(uri_test, query_iterator_with_fragment) { network::uri instance("http://example.com/?a=b;c=d#fragment"); ASSERT_TRUE(instance.has_query()); ASSERT_NE(instance.query_begin(), instance.query_end()); auto query_it = instance.query_begin(); EXPECT_EQ("a", query_it->first); EXPECT_EQ("b", query_it->second); ++query_it; EXPECT_EQ("c", query_it->first); EXPECT_EQ("d", query_it->second); ++query_it; EXPECT_EQ(query_it, instance.query_end()); } TEST(uri_test, copy_assignment_bug_98) { network::uri original("file:///path/to/file.txt"); ASSERT_TRUE(original.has_scheme()); ASSERT_FALSE(original.is_opaque()); ASSERT_TRUE(original.has_host()); ASSERT_TRUE(original.has_path()); network::uri instance; instance = original; ASSERT_TRUE(instance.has_scheme()); ASSERT_TRUE(instance.has_host()); ASSERT_TRUE(instance.has_path()); EXPECT_EQ("file", instance.scheme()); EXPECT_EQ("", instance.host()); EXPECT_EQ("/path/to/file.txt", instance.path()); } TEST(uri_test, copy_assignment_bug_98_2) { network::uri original("file:///path/to/file.txt?query=value#foo"); network::uri instance; instance = original; ASSERT_TRUE(instance.has_scheme()); ASSERT_TRUE(instance.has_path()); ASSERT_TRUE(instance.has_query()); ASSERT_TRUE(instance.has_fragment()); EXPECT_EQ("file", instance.scheme()); EXPECT_EQ("/path/to/file.txt", instance.path()); EXPECT_EQ("query=value", instance.query()); EXPECT_EQ("foo", instance.fragment()); } TEST(uri_test, copy_constructor_bug_98) { network::uri original("file:///path/to/file.txt?query=value#foo"); network::uri instance(original); ASSERT_TRUE(instance.has_scheme()); ASSERT_TRUE(instance.has_path()); ASSERT_TRUE(instance.has_query()); ASSERT_TRUE(instance.has_fragment()); EXPECT_EQ("file", instance.scheme()); EXPECT_EQ("/path/to/file.txt", instance.path()); EXPECT_EQ("query=value", instance.query()); EXPECT_EQ("foo", instance.fragment()); } TEST(uri_test, move_assignment_bug_98) { network::uri original("file:///path/to/file.txt?query=value#foo"); network::uri instance; instance = std::move(original); ASSERT_TRUE(instance.has_scheme()); ASSERT_TRUE(instance.has_path()); ASSERT_TRUE(instance.has_query()); ASSERT_TRUE(instance.has_fragment()); EXPECT_EQ("file", instance.scheme()); EXPECT_EQ("/path/to/file.txt", instance.path()); EXPECT_EQ("query=value", instance.query()); EXPECT_EQ("foo", instance.fragment()); } TEST(uri_test, move_constructor_bug_98) { network::uri original("file:///path/to/file.txt?query=value#foo"); network::uri instance(std::move(original)); ASSERT_TRUE(instance.has_scheme()); ASSERT_TRUE(instance.has_path()); ASSERT_TRUE(instance.has_query()); ASSERT_TRUE(instance.has_fragment()); EXPECT_EQ("file", instance.scheme()); EXPECT_EQ("/path/to/file.txt", instance.path()); EXPECT_EQ("query=value", instance.query()); EXPECT_EQ("foo", instance.fragment()); } TEST(uri_test, http_copy_assignment_bug_98) { network::uri original("http://example.com/path/to/file.txt"); network::uri instance; instance = original; ASSERT_TRUE(instance.has_scheme()); ASSERT_TRUE(instance.has_path()); EXPECT_EQ("http", instance.scheme()); EXPECT_EQ("/path/to/file.txt", instance.path()); } TEST(uri_test, uri_has_host_bug_87) { EXPECT_THROW(network::uri("http://"), network::uri_syntax_error); } TEST(uri_test, uri_has_host_bug_87_2) { EXPECT_THROW(network::uri("http://user@"), network::uri_syntax_error); } TEST(uri_test, uri_has_host_bug_88) { network::uri instance("http://user@host"); ASSERT_TRUE(instance.has_scheme()); ASSERT_TRUE(instance.has_user_info()); ASSERT_TRUE(instance.has_host()); ASSERT_FALSE(instance.has_port()); ASSERT_TRUE(instance.has_path()); ASSERT_FALSE(instance.has_query()); ASSERT_FALSE(instance.has_fragment()); EXPECT_EQ("host", instance.host().to_string()); } TEST(uri_test, uri_has_host_bug_88_2) { network::uri instance("http://user@example.com"); ASSERT_TRUE(instance.has_scheme()); ASSERT_TRUE(instance.has_user_info()); ASSERT_TRUE(instance.has_host()); ASSERT_FALSE(instance.has_port()); ASSERT_TRUE(instance.has_path()); ASSERT_FALSE(instance.has_query()); ASSERT_FALSE(instance.has_fragment()); EXPECT_EQ("example.com", instance.host().to_string()); } TEST(uri_test, assignment_operator_bug_116) { network::uri a("http://a.com:1234"); ASSERT_TRUE(a.has_port()); const network::uri b("http://b.com"); ASSERT_FALSE(b.has_port()); a = b; ASSERT_FALSE(a.has_port()) << a.string() << ", " << a.port(); } asymptote-3.05/LspCpp/third_party/uri/test/uri_comparison_test.cpp0000644000000000000000000000610315031566105024272 0ustar rootroot// Copyright (c) Glyn Matthews 2012-2016. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include TEST(uri_comparison_test, equality_test) { network::uri lhs("http://www.example.com/"); network::uri rhs("http://www.example.com/"); ASSERT_EQ(lhs, rhs); } TEST(uri_comparison_test, equality_test_capitalized_scheme) { network::uri lhs("http://www.example.com/"); network::uri rhs("HTTP://www.example.com/"); ASSERT_NE(lhs.compare(rhs, network::uri_comparison_level::string_comparison), 0); } TEST(uri_comparison_test, equality_test_capitalized_scheme_with_case_normalization) { network::uri lhs("http://www.example.com/"); network::uri rhs("HTTP://www.example.com/"); ASSERT_EQ(lhs.compare(rhs, network::uri_comparison_level::syntax_based), 0); } TEST(uri_comparison_test, DISABLED_equality_test_capitalized_host) { network::uri lhs("http://www.example.com/"); network::uri rhs("http://WWW.EXAMPLE.COM/"); ASSERT_EQ(lhs.compare(rhs, network::uri_comparison_level::syntax_based), 0); } TEST(uri_comparison_test, equality_test_with_single_dot_segment) { network::uri lhs("http://www.example.com/./path"); network::uri rhs("http://www.example.com/path"); ASSERT_EQ(lhs.compare(rhs, network::uri_comparison_level::syntax_based), 0); } TEST(uri_comparison_test, equality_test_with_double_dot_segment) { network::uri lhs("http://www.example.com/1/../2/"); network::uri rhs("http://www.example.com/2/"); ASSERT_EQ(lhs.compare(rhs, network::uri_comparison_level::syntax_based), 0); } TEST(uri_comparison_test, DISABLED_given_example_test) { network::uri lhs("example://a/b/c/%7Bfoo%7D"); network::uri rhs("eXAMPLE://a/./b/../b/%63/%7bfoo%7d"); ASSERT_EQ(lhs.compare(rhs, network::uri_comparison_level::syntax_based), 0); } TEST(uri_comparison_test, equality_empty_lhs) { network::uri lhs; network::uri rhs("http://www.example.com/"); ASSERT_NE(lhs, rhs); } TEST(uri_comparison_test, equality_empty_rhs) { network::uri lhs("http://www.example.com/"); network::uri rhs; ASSERT_NE(lhs, rhs); } TEST(uri_comparison_test, inequality_test) { network::uri lhs("http://www.example.com/"); network::uri rhs("http://www.example.com/"); ASSERT_FALSE(lhs != rhs); } TEST(uri_comparison_test, less_than_test) { // lhs is lexicographically less than rhs network::uri lhs("http://www.example.com/"); network::uri rhs("http://www.example.org/"); ASSERT_LT(lhs, rhs); } TEST(uri_comparison_test, percent_encoded_query_reserved_chars) { network::uri lhs("http://www.example.com?foo=%5cbar"); network::uri rhs("http://www.example.com?foo=%5Cbar"); ASSERT_EQ(lhs.compare(rhs, network::uri_comparison_level::syntax_based), 0); } TEST(uri_comparison_test, percent_encoded_query_unreserved_chars) { network::uri lhs("http://www.example.com?foo=%61%6c%70%68%61%31%32%33%2d%2e%5f%7e"); network::uri rhs("http://www.example.com?foo=alpha123-._~"); ASSERT_EQ(lhs.compare(rhs, network::uri_comparison_level::syntax_based), 0); } asymptote-3.05/LspCpp/third_party/uri/test/uri_resolve_test.cpp0000644000000000000000000002367015031566105023607 0ustar rootroot// Copyright 2012-2016 Glyn Matthews. // Copyright 2013 Hannes Kamecke. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include "string_utility.hpp" using namespace network; struct uri_resolve_test : public ::testing::Test { uri_resolve_test() : base_uri("http://a/b/c/d;p?q") { } uri::string_type resolved(const uri& base, const uri& reference) { return reference.resolve(base).string(); } uri::string_type resolved(const uri& reference) { return resolved(base_uri, reference); } network::uri base_uri; }; TEST_F(uri_resolve_test, is_absolute_uri__returns_other) { ASSERT_EQ("https://www.example.com/", resolved(uri("https://www.example.com/"))); } TEST_F(uri_resolve_test, base_has_empty_path__path_is_ref_path_1) { uri reference = uri_builder().path("g").uri(); ASSERT_EQ("http://a/g", resolved(uri("http://a/"), reference)); } TEST_F(uri_resolve_test, base_has_empty_path__path_is_ref_path_2) { uri reference = uri_builder().path("g/x/y").append_query_key_value_pair("q", "1").fragment("s").uri(); ASSERT_EQ("http://a/g/x/y?q=1#s", resolved(uri("http://a/"), reference)); } // normal examples // http://tools.ietf.org/html/rfc3986#section-5.4.1 TEST_F(uri_resolve_test, remove_dot_segments1) { uri reference = uri_builder().path("./g").uri(); ASSERT_EQ("http://a/b/c/g", resolved(reference)); } TEST_F(uri_resolve_test, base_has_path__path_is_merged_1) { uri reference = uri_builder().path("g/").uri(); ASSERT_EQ("http://a/b/c/g/", resolved(reference)); } TEST_F(uri_resolve_test, base_has_path__path_is_merged_2) { uri reference = uri_builder().path("g").uri(); ASSERT_EQ("http://a/b/c/g", resolved(reference)); } TEST_F(uri_resolve_test, path_starts_with_slash__path_is_ref_path) { uri reference = uri_builder().path("/g").uri(); ASSERT_EQ("http://a/g", resolved(reference)); } TEST_F(uri_resolve_test, path_starts_with_slash_with_query_fragment__path_is_ref_path) { uri reference = uri_builder().path("/g/x").append_query_key_value_pair("y", "z").fragment("s").uri(); ASSERT_EQ("http://a/g/x?y=z#s", resolved(reference)); } TEST_F(uri_resolve_test, DISABLED_has_authority__base_scheme_with_ref_authority) { // ASSERT_EQ("http://g", resolved("//g")); // uri reference = uri_builder().host("g").path("").uri(); uri reference = uri_builder().path("//g").uri(); ASSERT_EQ("http://g", resolved(reference)); } TEST_F(uri_resolve_test, path_is_empty_but_has_query__returns_base_with_ref_query) { uri reference = uri_builder().append_query_key_value_pair("y", "z").uri(); ASSERT_EQ("http://a/b/c/d;p?y=z", resolved(reference)); } TEST_F(uri_resolve_test, path_is_empty_but_has_query_base_no_query__returns_base_with_ref_query) { uri reference = uri_builder().append_query_key_value_pair("y", "z").uri(); ASSERT_EQ("http://a/b/c/d?y=z", resolved(uri("http://a/b/c/d"), reference)); } TEST_F(uri_resolve_test, merge_path_with_query) { uri reference = uri_builder().path("g").append_query_key_value_pair("y", "z").uri(); ASSERT_EQ("http://a/b/c/g?y=z", resolved(reference)); } TEST_F(uri_resolve_test, append_fragment) { uri reference = uri_builder().fragment("s").uri(); ASSERT_EQ("http://a/b/c/d;p?q#s", resolved(reference)); } TEST_F(uri_resolve_test, merge_paths_with_fragment) { uri reference = uri_builder().path("g").fragment("s").uri(); ASSERT_EQ("http://a/b/c/g#s", resolved(reference)); } TEST_F(uri_resolve_test, merge_paths_with_query_and_fragment) { uri reference = uri_builder().path("g").append_query_key_value_pair("y", "z").fragment("s").uri(); ASSERT_EQ("http://a/b/c/g?y=z#s", resolved(reference)); } TEST_F(uri_resolve_test, merge_paths_with_semicolon_1) { uri reference = uri_builder().path(";x").uri(); ASSERT_EQ("http://a/b/c/;x", resolved(reference)); } TEST_F(uri_resolve_test, merge_paths_with_semicolon_2) { uri reference = uri_builder().path("g;x").uri(); ASSERT_EQ("http://a/b/c/g;x", resolved(reference)); } TEST_F(uri_resolve_test, merge_paths_with_semicolon_3) { uri reference = uri_builder().path("g;x").append_query_key_value_pair("y", "z").fragment("s").uri(); ASSERT_EQ("http://a/b/c/g;x?y=z#s", resolved(reference)); } TEST_F(uri_resolve_test, path_is_empty__returns_base) { uri reference = uri_builder().uri(); ASSERT_EQ("http://a/b/c/d;p?q", resolved(reference)); } TEST_F(uri_resolve_test, remove_dot_segments2) { uri reference = uri_builder().path(".").uri(); ASSERT_EQ("http://a/b/c/", resolved(reference)); } TEST_F(uri_resolve_test, remove_dot_segments3) { uri reference = uri_builder().path("./").uri(); ASSERT_EQ("http://a/b/c/", resolved(reference)); } TEST_F(uri_resolve_test, remove_dot_segments4) { uri reference = uri_builder().path("..").uri(); ASSERT_EQ("http://a/b/", resolved(reference)); } TEST_F(uri_resolve_test, remove_dot_segments5) { uri reference = uri_builder().path("../").uri(); ASSERT_EQ("http://a/b/", resolved(reference)); } TEST_F(uri_resolve_test, remove_dot_segments6) { uri reference = uri_builder().path("../g").uri(); ASSERT_EQ("http://a/b/g", resolved(reference)); } TEST_F(uri_resolve_test, remove_dot_segments7) { uri reference = uri_builder().path("../..").uri(); ASSERT_EQ("http://a/", resolved(reference)); } TEST_F(uri_resolve_test, remove_dot_segments8) { uri reference = uri_builder().path("../../").uri(); ASSERT_EQ("http://a/", resolved(reference)); } TEST_F(uri_resolve_test, remove_dot_segments9) { uri reference = uri_builder().path("../../g").uri(); ASSERT_EQ("http://a/g", resolved(reference)); } // abnormal examples // http://tools.ietf.org/html/rfc3986#section-5.4.2 TEST_F(uri_resolve_test, abnormal_example_1) { uri reference = uri_builder().path("../../../g").uri(); ASSERT_EQ("http://a/g", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_2) { uri reference = uri_builder().path("../../../../g").uri(); ASSERT_EQ("http://a/g", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_3) { uri reference = uri_builder().path("/./g").uri(); ASSERT_EQ("http://a/g", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_4) { uri reference = uri_builder().path("/../g").uri(); ASSERT_EQ("http://a/g", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_5) { uri reference = uri_builder().path("g.").uri(); ASSERT_EQ("http://a/b/c/g.", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_6) { uri reference = uri_builder().path(".g").uri(); ASSERT_EQ("http://a/b/c/.g", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_7) { uri reference = uri_builder().path("g..").uri(); ASSERT_EQ("http://a/b/c/g..", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_8) { uri reference = uri_builder().path("..g").uri(); ASSERT_EQ("http://a/b/g", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_9) { uri reference = uri_builder().path("./../g").uri(); ASSERT_EQ("http://a/b/g", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_10) { uri reference = uri_builder().path("./g/.").uri(); ASSERT_EQ("http://a/b/c/g/", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_11) { uri reference = uri_builder().path("g/./h").uri(); ASSERT_EQ("http://a/b/c/g/h", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_12) { uri reference = uri_builder().path("g/../h").uri(); ASSERT_EQ("http://a/b/c/h", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_13) { uri reference = uri_builder().path("g;x=1/./y").uri(); ASSERT_EQ("http://a/b/c/g;x=1/y", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_14) { uri reference = uri_builder().path("g;x=1/../y").uri(); ASSERT_EQ("http://a/b/c/y", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_15) { uri reference = uri_builder().path("g").append_query_component("y/./x").uri(); ASSERT_EQ("http://a/b/c/g?y/./x", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_16) { uri reference = uri_builder().path("g").append_query_component("y/../x").uri(); ASSERT_EQ("http://a/b/c/g?y/../x", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_17) { uri reference = uri_builder().path("g").fragment("s/./x").uri(); ASSERT_EQ("http://a/b/c/g#s/./x", resolved(reference)); } TEST_F(uri_resolve_test, abnormal_example_18) { uri reference = uri_builder().path("g").fragment("s/../x").uri(); ASSERT_EQ("http://a/b/c/g#s/../x", resolved(reference)); } TEST_F(uri_resolve_test, issue_resolve_from_copy) { // https://github.com/cpp-netlib/uri/issues/15 network::uri base("http://a.com/"); network::uri uri("http:/example.com/path/"); network::uri copy = uri; ASSERT_TRUE(copy.is_opaque()); auto result = copy.resolve(base); ASSERT_EQ("http:/example.com/path/", result); } TEST_F(uri_resolve_test, issue_resolve_from_move) { // https://github.com/cpp-netlib/uri/issues/15 network::uri base("http://a.com/"); network::uri uri("http:/example.com/path/"); network::uri copy = std::move(uri); ASSERT_TRUE(copy.is_opaque()); auto result = copy.resolve(base); ASSERT_EQ("http:/example.com/path/", result); } TEST_F(uri_resolve_test, issue_15_resolve_from_copy_with_query) { // https://github.com/cpp-netlib/uri/issues/15 network::uri base("http://a.com/"); network::uri uri("http:/example.com/path/?query#fragment"); network::uri copy = uri; ASSERT_TRUE(copy.is_opaque()); auto result = copy.resolve(base); ASSERT_EQ("query", uri.query()); ASSERT_EQ("query", copy.query()); ASSERT_EQ("query", result.query()); } TEST_F(uri_resolve_test, issue_15_resolve_from_copy_with_fragment) { // https://github.com/cpp-netlib/uri/issues/15 network::uri base("http://a.com/"); network::uri uri("http:/example.com/path/?query#fragment"); network::uri copy = uri; ASSERT_TRUE(copy.is_opaque()); auto result = copy.resolve(base); ASSERT_EQ("fragment", result.fragment()); } asymptote-3.05/LspCpp/third_party/uri/test/uri_reference_test.cpp0000644000000000000000000000517215031566105024063 0ustar rootroot// Copyright (c) Glyn Matthews 2012-2016. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include TEST(uri_make_relative_test, opaque_uri) { network::uri uri_1("mailto:glynos@example.com"); network::uri uri_2("mailto:john.doe@example.com"); ASSERT_EQ(uri_2, uri_1.make_relative(uri_2)); } TEST(uri_make_relative_test, simple_test) { network::uri uri_1("http://www.example.com/"); network::uri uri_2("http://www.example.com/path/"); ASSERT_EQ("/path/", uri_1.make_relative(uri_2)); } TEST(uri_make_relative_test, simple_test_with_different_authority) { network::uri uri_1("http://www.example.com/"); network::uri uri_2("http://www.example.org/path/"); ASSERT_EQ("http://www.example.org/path/", uri_1.make_relative(uri_2)); } TEST(uri_make_relative_test, simple_test_is_relative) { network::uri uri_1("http://www.example.com/"); network::uri uri_2("http://www.example.com/path/"); ASSERT_FALSE(uri_1.make_relative(uri_2).is_absolute()); } TEST(uri_make_relative_test, simple_test_is_hierarchical) { network::uri uri_1("http://www.example.com/"); network::uri uri_2("http://www.example.com/path/"); ASSERT_FALSE(uri_1.make_relative(uri_2).is_opaque()); } TEST(uri_make_relative_test, simple_test_with_query) { network::uri uri_1("http://www.example.com/"); network::uri uri_2("http://www.example.com/path/?key=value"); ASSERT_EQ("/path/?key=value", uri_1.make_relative(uri_2)); } TEST(uri_make_relative_test, simple_test_with_fragment) { network::uri uri_1("http://www.example.com/"); network::uri uri_2("http://www.example.com/path/#fragment"); ASSERT_EQ("/path/#fragment", uri_1.make_relative(uri_2)); } TEST(uri_make_relative_test, make_relative_with_percent_encoding_normalization) { network::uri uri_1("http://www.example.com/"); network::uri uri_2("http://www.example.com/%7E%66%6F%6F%62%61%72%5F%36%39/"); ASSERT_EQ("/~foobar_69/", uri_1.make_relative(uri_2)); } TEST(uri_make_relative_test, make_relative_with_percent_encoding_normalization_with_query) { network::uri uri_1("http://www.example.com/"); network::uri uri_2("http://www.example.com/%7E%66%6F%6F%62%61%72%5F%36%39/?key=value"); ASSERT_EQ("/~foobar_69/?key=value", uri_1.make_relative(uri_2)); } TEST(uri_make_relative_test, make_relative_with_percent_encoding_normalization_with_fragment) { network::uri uri_1("http://www.example.com/"); network::uri uri_2("http://www.example.com/%7E%66%6F%6F%62%61%72%5F%36%39/#fragment"); ASSERT_EQ("/~foobar_69/#fragment", uri_1.make_relative(uri_2)); } asymptote-3.05/LspCpp/third_party/uri/test/uri_parse_test.cpp0000644000000000000000000004362715031566105023246 0ustar rootroot// Copyright 2016-2017 Glyn Matthews. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt of copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include "test_uri.hpp" #include "string_utility.hpp" TEST(uri_parse_test, test_empty_uri) { test::uri uri(""); EXPECT_FALSE(uri.parse_uri()); EXPECT_TRUE(uri.parsed_till().empty()); } TEST(uri_parse_test, test_hierarchical_part_valid_user_info) { test::uri uri("http://user@www.example.com:80/path?query#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_user_info()); EXPECT_EQ("user", uri.user_info()); } TEST(uri_parse_test, test_hierarchical_part_empty_user_info) { test::uri uri("http://@www.example.com:80/path?query#fragment"); EXPECT_FALSE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); } TEST(uri_parse_test, test_hierarchical_part_unset_user_info) { test::uri uri("http://www.example.com:80/path?query#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); } TEST(uri_parse_test, test_hierarchical_part_unset_user_info_and_host) { test::uri uri("http://:80/path?query#fragment"); EXPECT_FALSE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_FALSE(uri.has_host()); } TEST(uri_parse_test, test_hierarchical_part_valid_user_info_and_host) { test::uri uri("http://user@www.example.com:80/path?query#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_user_info()); EXPECT_EQ("user", uri.user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); } TEST(uri_parse_test, test_hierarchical_part_valid_user_info_unset_host) { test::uri uri("http://user@:80/path?query#fragment"); EXPECT_FALSE(uri.parse_uri()); ASSERT_FALSE(uri.has_host()); } TEST(uri_parse_test, test_hierarchical_part_valid_user_info_host_and_port) { test::uri uri("http://user@www.example.com:80/path?query#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_user_info()); EXPECT_EQ("user", uri.user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_TRUE(uri.has_port()); EXPECT_EQ("80", uri.port()); } TEST(uri_parse_test, test_hierarchical_part_empty_user_info_valid_host_and_port) { test::uri uri("http://www.example.com:80/path?query#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_TRUE(uri.has_port()); EXPECT_EQ("80", uri.port()); } TEST(uri_parse_test, test_hierarchical_part_empty_user_info_valid_host_empty_port) { test::uri uri("http://www.example.com/path?query#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_FALSE(uri.has_port()); } TEST(uri_parse_test, test_hierarchical_part_valid_user_info_and_host_empty_port) { test::uri uri("http://user@www.example.com/path?query#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_user_info()); EXPECT_EQ("user", uri.user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_FALSE(uri.has_port()); } TEST(uri_parse_test, test_hierarchical_part_valid_user_info_empty_host_valid_port) { test::uri uri("http://user@:80/path?query#fragment"); EXPECT_FALSE(uri.parse_uri()); } TEST(uri_parse_test, test_hierarchical_part_valid_host_empty_port_empty_path) { test::uri uri("http://www.example.com"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_FALSE(uri.has_port()); ASSERT_TRUE(uri.has_path()); ASSERT_TRUE(uri.path().empty()); } TEST(uri_parse_test, test_hierarchical_part_valid_host_valid_port_empty_path) { test::uri uri("http://www.example.com:80"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_TRUE(uri.has_port()); EXPECT_EQ("80", uri.port()); ASSERT_TRUE(uri.has_path()); ASSERT_TRUE(uri.path().empty()); } TEST(uri_parse_test, test_hierarchical_part_valid_user_odd_digits_port) { test::uri uri("http://user@www.example.com:12345/foo"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_port()); EXPECT_EQ("12345", uri.port()); } TEST(uri_parse_test, test_hierarchical_part_valid_host_port_path) { test::uri uri("http://www.example.com:80/path"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_TRUE(uri.has_port()); EXPECT_EQ("80", uri.port()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/path", uri.path()); } TEST(uri_parse_test, test_hierarchical_part_valid_host_path) { test::uri uri("http://www.example.com/path"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_FALSE(uri.has_port()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/path", uri.path()); } TEST(uri_parse_test, test_hierarchical_part_with_opaque_uri) { test::uri uri("mailto:user@example.com"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("mailto", uri.scheme()); ASSERT_FALSE(uri.has_user_info()); ASSERT_FALSE(uri.has_host()); ASSERT_FALSE(uri.has_port()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("user@example.com", uri.path()); } TEST(uri_parse_test, test_hierarchical_part_valid_host_path_and_query) { test::uri uri("http://www.example.com/path?query"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_FALSE(uri.has_port()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/path", uri.path()); ASSERT_TRUE(uri.has_query()); EXPECT_EQ("query", uri.query()); ASSERT_FALSE(uri.has_fragment()); } TEST(uri_parse_test, test_hierarchical_part_valid_host_path_query_and_fragment) { test::uri uri("http://www.example.com/path?query#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_FALSE(uri.has_port()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/path", uri.path()); ASSERT_TRUE(uri.has_query()); EXPECT_EQ("query", uri.query()); ASSERT_TRUE(uri.has_fragment()); EXPECT_EQ("fragment", uri.fragment()); } TEST(uri_parse_test, test_hierarchical_part_valid_host_path_and_fragment) { test::uri uri("http://www.example.com/path#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_FALSE(uri.has_port()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/path", uri.path()); ASSERT_FALSE(uri.has_query()); ASSERT_TRUE(uri.has_fragment()); EXPECT_EQ("fragment", uri.fragment()); } TEST(uri_parse_test, test_invalid_fragment) { test::uri uri("http://www.example.com/path#%fragment"); EXPECT_FALSE(uri.parse_uri()); } TEST(uri_parse_test, test_valid_fragment_with_pct_encoded_char) { test::uri uri("http://www.example.com/path#%ffragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_fragment()); EXPECT_EQ("%ffragment", uri.fragment()); } TEST(uri_parse_test, test_valid_fragment_with_unreserved_char) { test::uri uri("http://www.example.com/path#fragment-"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_query()); ASSERT_TRUE(uri.has_fragment()); EXPECT_EQ("fragment-", uri.fragment()); } TEST(uri_parse_test, test_invalid_fragment_with_gen_delim) { test::uri uri("http://www.example.com/path#frag#ment"); EXPECT_FALSE(uri.parse_uri()); } TEST(uri_parse_test, test_valid_fragment_with_sub_delim) { test::uri uri("http://www.example.com/path#frag$ment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_query()); ASSERT_TRUE(uri.has_fragment()); EXPECT_EQ("frag$ment", uri.fragment()); } TEST(uri_parse_test, test_valid_fragment_with_forward_slash_and_question_mark) { test::uri uri("http://www.example.com/path#frag/ment?"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_query()); ASSERT_TRUE(uri.has_fragment()); EXPECT_EQ("frag/ment?", uri.fragment()); } TEST(uri_parse_test, test_invalid_query) { test::uri uri("http://www.example.com/path?%query"); EXPECT_FALSE(uri.parse_uri()); } TEST(uri_parse_test, test_valid_query_with_pct_encoded_char) { test::uri uri("http://www.example.com/path?%00query"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_query()); EXPECT_EQ("%00query", uri.query()); ASSERT_FALSE(uri.has_fragment()); } TEST(uri_parse_test, test_valid_query_with_unreserved_char) { test::uri uri("http://www.example.com/path?query-"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_query()); EXPECT_EQ("query-", uri.query()); ASSERT_FALSE(uri.has_fragment()); } TEST(uri_parse_test, test_valid_query_with_sub_delim) { test::uri uri("http://www.example.com/path?qu$ery"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_query()); EXPECT_EQ("qu$ery", uri.query()); ASSERT_FALSE(uri.has_fragment()); } TEST(uri_parse_test, test_invalid_port_with_path) { test::uri uri("http://123.34.23.56:6662626/"); EXPECT_FALSE(uri.parse_uri()); } TEST(uri_parse_test, test_invalid_port) { test::uri uri("http://123.34.23.56:6662626"); EXPECT_FALSE(uri.parse_uri()); } TEST(uri_parse_test, test_empty_port_with_path) { test::uri uri("http://123.34.23.56:/"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_port()); ASSERT_EQ("", uri.port()); } TEST(uri_parse_test, test_empty_port) { test::uri uri("http://123.34.23.56:"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_port()); ASSERT_EQ("", uri.port()); } TEST(uri_parse_test, test_ipv6_address) { test::uri uri("http://[1080:0:0:0:8:800:200C:417A]"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("[1080:0:0:0:8:800:200C:417A]", uri.host()); } TEST(uri_parse_test, test_ipv6_address_with_path) { test::uri uri("http://[1080:0:0:0:8:800:200C:417A]/"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("[1080:0:0:0:8:800:200C:417A]", uri.host()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/", uri.path()); } TEST(uri_parse_test, test_invalid_ipv6_address) { test::uri uri("http://[1080:0:0:0:8:800:200C:417A"); EXPECT_FALSE(!uri.parse_uri()); } TEST(uri_parse_test, test_invalid_ipv6_address_with_path) { test::uri uri("http://[1080:0:0:0:8:800:200C:417A/"); EXPECT_FALSE(!uri.parse_uri()); } TEST(uri_parse_test, test_opaque_uri_with_one_slash) { test::uri uri("scheme:/path/"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("scheme", uri.scheme()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/path/", uri.path()); } TEST(uri_parse_test, test_empty_query) { test::uri uri("http://www.example.com/?"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_query()); EXPECT_EQ("", uri.query()); } TEST(uri_parse_test, test_query_with_empty_path) { test::uri uri("http://www.example.com?query"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("http", uri.scheme()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_FALSE(uri.has_port()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("", uri.path()); ASSERT_TRUE(uri.has_query()); EXPECT_EQ("query", uri.query()); ASSERT_FALSE(uri.has_fragment()); } TEST(uri_parse_test, test_query_with_user_info_and_empty_path) { test::uri uri("http://user@www.example.com?query"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("http", uri.scheme()); ASSERT_TRUE(uri.has_user_info()); EXPECT_EQ("user", uri.user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_FALSE(uri.has_port()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("", uri.path()); ASSERT_TRUE(uri.has_query()); EXPECT_EQ("query", uri.query()); ASSERT_FALSE(uri.has_fragment()); } TEST(uri_parse_test, test_fragment_with_empty_path) { test::uri uri("http://www.example.com#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("http", uri.scheme()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_FALSE(uri.has_port()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("", uri.path()); ASSERT_FALSE(uri.has_query()); ASSERT_TRUE(uri.has_fragment()); EXPECT_EQ("fragment", uri.fragment()); } TEST(uri_parse_test, test_fragment_with_user_info_and_empty_path) { test::uri uri("http://user@www.example.com#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("http", uri.scheme()); ASSERT_TRUE(uri.has_user_info()); EXPECT_EQ("user", uri.user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_FALSE(uri.has_port()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("", uri.path()); ASSERT_FALSE(uri.has_query()); ASSERT_TRUE(uri.has_fragment()); EXPECT_EQ("fragment", uri.fragment()); } TEST(uri_parse_test, test_query_with_empty_path_and_ipv6_address) { test::uri uri("http://[1080:0:0:0:8:800:200C:417A]?query"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("http", uri.scheme()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("[1080:0:0:0:8:800:200C:417A]", uri.host()); ASSERT_FALSE(uri.has_port()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("", uri.path()); ASSERT_TRUE(uri.has_query()); EXPECT_EQ("query", uri.query()); ASSERT_FALSE(uri.has_fragment()); } TEST(uri_parse_test, test_query_with_user_info_empty_path_and_ipv6_address) { test::uri uri("http://user@[1080:0:0:0:8:800:200C:417A]?query"); EXPECT_TRUE(uri.parse_uri()); EXPECT_EQ("http://user@[1080:0:0:0:8:800:200C:417A]?query", uri.parsed_till()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("http", uri.scheme()); ASSERT_TRUE(uri.has_user_info()); EXPECT_EQ("user", uri.user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("[1080:0:0:0:8:800:200C:417A]", uri.host()); ASSERT_FALSE(uri.has_port()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("", uri.path()); ASSERT_TRUE(uri.has_query()); EXPECT_EQ("query", uri.query()); ASSERT_FALSE(uri.has_fragment()); } TEST(uri_parse_test, test_fragment_with_empty_path_and_ipv6_address) { test::uri uri("http://[1080:0:0:0:8:800:200C:417A]#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("http", uri.scheme()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("[1080:0:0:0:8:800:200C:417A]", uri.host()); ASSERT_FALSE(uri.has_port()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("", uri.path()); ASSERT_FALSE(uri.has_query()); ASSERT_TRUE(uri.has_fragment()); EXPECT_EQ("fragment", uri.fragment()); } TEST(uri_parse_test, test_fragment_with_user_info_empty_path_and_ipv6_address) { test::uri uri("http://user@[1080:0:0:0:8:800:200C:417A]#fragment"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("http", uri.scheme()); ASSERT_TRUE(uri.has_user_info()); EXPECT_EQ("user", uri.user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("[1080:0:0:0:8:800:200C:417A]", uri.host()); ASSERT_FALSE(uri.has_port()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("", uri.path()); ASSERT_FALSE(uri.has_query()); ASSERT_TRUE(uri.has_fragment()); EXPECT_EQ("fragment", uri.fragment()); } TEST(uri_parse_test, test_pct_encoded_user_info) { test::uri uri("http://user%3f@www.example.com/"); EXPECT_TRUE(uri.parse_uri()); ASSERT_TRUE(uri.has_scheme()); EXPECT_EQ("http", uri.scheme()); ASSERT_TRUE(uri.has_user_info()); EXPECT_EQ("user%3f", uri.user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("www.example.com", uri.host()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/", uri.path()); } TEST(uri_parse_test, test_file_uri_bug_98) { test::uri uri("file:///bin/bash"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("", uri.host()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/bin/bash", uri.path()); } TEST(uri_parse_test, test_file_uri_bug_98_2) { test::uri uri("file://localhost/bin"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("localhost", uri.host()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/bin", uri.path()); } TEST(uri_parse_test, test_file_uri_bug_98_3) { test::uri uri("file://localhost/bin/bash"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("localhost", uri.host()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/bin/bash", uri.path()); } TEST(uri_parse_test, test_file_uri_bug_98_4) { test::uri uri("file:///bin"); EXPECT_TRUE(uri.parse_uri()); ASSERT_FALSE(uri.has_user_info()); ASSERT_TRUE(uri.has_host()); EXPECT_EQ("", uri.host()); ASSERT_TRUE(uri.has_path()); EXPECT_EQ("/bin", uri.path()); } TEST(uri_parse_test, test_has_host_bug_88) { test::uri uri("http://user@host"); EXPECT_TRUE(uri.parse_uri()); } // http://formvalidation.io/validators/uri/ std::vector create_urls(const std::string &filename) { std::vector urls; std::ifstream ifs(filename); if (!ifs) { throw std::runtime_error("Unable to open file: " + filename); } for (std::string url; std::getline(ifs, url);) { if (url.front() != '#') { urls.push_back(url); } } return urls; } // All valid URLs in the list should pass class test_valid_urls : public ::testing::TestWithParam {}; INSTANTIATE_TEST_CASE_P(uri_parse_test, test_valid_urls, testing::ValuesIn(create_urls("valid_urls.txt"))); TEST_P(test_valid_urls, urls_are_valid) { test::uri uri(GetParam()); EXPECT_TRUE(uri.parse_uri()); } asymptote-3.05/LspCpp/third_party/uri/test/valid_urls.txt0000644000000000000000000000213415031566105022403 0ustar rootroothttp://foo.com/blah_blah http://foo.com/blah_blah/ http://foo.com/blah_blah_(wikipedia) http://foo.com/blah_blah_(wikipedia)_(again) http://www.example.com/wpstyle/?p=364 https://www.example.com/foo/?bar=baz&inga=42&quux http://✪df.ws/123 http://userid:password@example.com:8080 http://userid:password@example.com:8080/ http://userid@example.com http://userid@example.com/ http://userid@example.com:8080 http://userid@example.com:8080/ http://userid:password@example.com http://userid:password@example.com/ http://142.42.1.1/ http://142.42.1.1:8080/ #http://âž¡.ws/䨹 http://⌘.ws http://⌘.ws/ http://foo.com/blah_(wikipedia)#cite-1 http://foo.com/blah_(wikipedia)_blah#cite-1 #http://foo.com/unicode_(✪)_in_parens http://foo.com/(something)?after=parens http://☺.damowmow.com/ http://code.google.com/events/#&product=browser http://j.mp ftp://foo.bar/baz http://foo.bar/?q=Test%20URL-encoded%20stuff http://مثال.إختبار http://例å­.测试 http://उदाहरण.परीकà¥à¤·à¤¾ #http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com http://1337.net http://a.b-c.de http://223.255.255.254 asymptote-3.05/LspCpp/third_party/uri/test/uri_encoding_test.cpp0000644000000000000000000001311715031566105023711 0ustar rootroot// Copyright (c) Glyn Matthews 2011-2016. // Copyright 2012 Google, Inc. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include TEST(uri_encoding_test, encode_user_info_iterator) { const std::string unencoded("!#$&'()*+,/:;=?@[]"); std::string instance; network::uri::encode_user_info(std::begin(unencoded), std::end(unencoded), std::back_inserter(instance)); ASSERT_EQ("%21%23%24%26%27%28%29%2A%2B%2C%2F:%3B%3D%3F%40%5B%5D", instance); } TEST(uri_encoding_test, encode_host_iterator) { const std::string unencoded("!#$&'()*+,/:;=?@[]"); std::string instance; network::uri::encode_host(std::begin(unencoded), std::end(unencoded), std::back_inserter(instance)); ASSERT_EQ("%21%23%24%26%27%28%29%2A%2B%2C%2F:%3B%3D%3F%40[]", instance); } TEST(uri_encoding_test, encode_ipv6_host) { const std::string unencoded("[::1]"); std::string instance; network::uri::encode_host(std::begin(unencoded), std::end(unencoded), std::back_inserter(instance)); ASSERT_EQ("[::1]", instance); } TEST(uri_encoding_test, encode_port_iterator) { const std::string unencoded("!#$&'()*+,/:;=?@[]"); std::string instance; network::uri::encode_port(std::begin(unencoded), std::end(unencoded), std::back_inserter(instance)); ASSERT_EQ("%21%23%24%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D", instance); } TEST(uri_encoding_test, encode_path_iterator) { const std::string unencoded("!#$&'()*+,/:;=?@[]"); std::string instance; network::uri::encode_path(std::begin(unencoded), std::end(unencoded), std::back_inserter(instance)); ASSERT_EQ("%21%23%24%26%27%28%29%2A%2B%2C/%3A;=%3F@%5B%5D", instance); } TEST(uri_encoding_test, encode_query_component_iterator) { const std::string unencoded("!#$&'()*+,/:;=?@[]"); std::string instance; network::uri::encode_query_component( std::begin(unencoded), std::end(unencoded), std::back_inserter(instance)); ASSERT_EQ("%21%23%24%26%27%28%29%2A%2B%2C/%3A%3B%3D?%40%5B%5D", instance); } TEST(uri_encoding_test, encode_fragment_iterator) { const std::string unencoded("!#$&'()*+,/:;=?@[]"); std::string instance; network::uri::encode_fragment( std::begin(unencoded), std::end(unencoded), std::back_inserter(instance)); ASSERT_EQ("%21%23%24&%27%28%29%2A%2B%2C/%3A;=%3F@%5B%5D", instance); } TEST(uri_encoding_test, decode_iterator) { const std::string encoded("%21%23%24%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D"); std::string instance; network::uri::decode(std::begin(encoded), std::end(encoded), std::back_inserter(instance)); ASSERT_EQ("!#$&'()*+,/:;=?@[]", instance); } TEST(uri_encoding_test, decode_iterator_error_1) { const std::string encoded("%"); std::string instance; ASSERT_THROW(network::uri::decode(std::begin(encoded), std::end(encoded), std::back_inserter(instance)), network::percent_decoding_error); } TEST(uri_encoding_test, decode_iterator_error_2) { const std::string encoded("%2"); std::string instance; ASSERT_THROW(network::uri::decode(std::begin(encoded), std::end(encoded), std::back_inserter(instance)), network::percent_decoding_error); } TEST(uri_encoding_test, decode_iterator_error_3) { const std::string encoded("%%%"); std::string instance; ASSERT_THROW(network::uri::decode(std::begin(encoded), std::end(encoded), std::back_inserter(instance)), network::percent_decoding_error); } TEST(uri_encoding_test, decode_iterator_error_4) { const std::string encoded("%2%"); std::string instance; ASSERT_THROW(network::uri::decode(std::begin(encoded), std::end(encoded), std::back_inserter(instance)), network::percent_decoding_error); } TEST(uri_encoding_test, decode_iterator_error_5) { const std::string encoded("%G0"); std::string instance; ASSERT_THROW(network::uri::decode(std::begin(encoded), std::end(encoded), std::back_inserter(instance)), network::percent_decoding_error); } TEST(uri_encoding_test, decode_iterator_error_6) { const std::string encoded("%0G"); std::string instance; ASSERT_THROW(network::uri::decode(std::begin(encoded), std::end(encoded), std::back_inserter(instance)), network::percent_decoding_error); } TEST(uri_encoding_test, decode_iterator_not_an_error_1) { const std::string encoded("%20"); std::string instance; ASSERT_NO_THROW(network::uri::decode(std::begin(encoded), std::end(encoded), std::back_inserter(instance))); } TEST(uri_encoding_test, decode_iterator_not_an_error_2) { const std::string encoded("%80"); std::string instance; ASSERT_NO_THROW(network::uri::decode(std::begin(encoded), std::end(encoded), std::back_inserter(instance))); } TEST(uri_encoding_test, decode_accepts_utf8) { const std::string encoded("%EB%B2%95%EC%A0%95%EB%8F%99"); std::string instance; ASSERT_NO_THROW(network::uri::decode(std::begin(encoded), std::end(encoded), std::back_inserter(instance))); // const std::string unencoded = "법정ë™"; const std::string unencoded = "\xEB\xB2\x95\xEC\xA0\x95\xEB\x8F\x99"; ASSERT_EQ(unencoded, instance); } asymptote-3.05/LspCpp/third_party/uri/README.rst0000644000000000000000000000443015031566105020207 0ustar rootroot.. :Authors: Glyn Matthews .. :Date: Jan 01, 2013 .. :Description: Source code for the cpp-netlib URI class. ################### Deprecation warning ################### This library is still missing some features (including full Unicode support), and does not work on some of the newest compiler versions. Therefore, please prefer to use the `WhatWG URL implementation`_ that is intended to supersede this library. .. _`WhatWG URL implementation`: https://github.com/cpp-netlib/url ################ C++ Network URI ################ .. image:: https://travis-ci.org/cpp-netlib/uri.png?branch=master :target: https://travis-ci.org/cpp-netlib/uri .. image:: https://ci.appveyor.com/api/projects/status/rjt0nbbtdhsjdjv4?svg=true :target: https://ci.appveyor.com/project/glynos/uri-6fkuc .. image:: https://img.shields.io/badge/license-boost-blue.svg :target: https://github.com/cpp-netlib/uri/blob/master/LICENSE_1_0.txt This project contains the source code that was originally meant to track the proposal for a C++ URI at http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3975.html This package provides: * A ``network::uri`` class that implements a generic URI parser, compatible with `RFC 3986`_ and `RFC 3987`_ * Accessors to the underlying URI parts * A range-compatible interface * Methods to normalize and compare URIs * Percent encoding and decoding functions * A URI builder to build consistent URIs from parts, including case, percent encoding and path normalization .. _`RFC 3986`: http://tools.ietf.org/html/rfc3986 .. _`RFC 3987`: http://tools.ietf.org/html/rfc3987 Building the project ==================== Building with ``CMake`` ----------------------- :: $ mkdir _build $ cd _build $ cmake .. $ make -j4 Running the tests with ``CTest`` -------------------------------- :: $ ctest License ======= This library is released under the Boost Software License (please see http://boost.org/LICENSE_1_0.txt or the accompanying LICENSE_1_0.txt file for the full text. Contact ======= Any questions about this library can be addressed to the cpp-netlib `developers mailing list`_. Issues can be filed using Github at http://github.com/cpp-netlib/uri/issues. .. _`developers mailing list`: cpp-netlib@googlegroups.com asymptote-3.05/LspCpp/third_party/uri/CHANGELOG.md0000644000000000000000000000230015031566105020323 0ustar rootroot# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## [1.1.0] - 2018-11-24 ### Fixed - Query percent encoding ## [1.0.4] - 2018-10-21 ### Fixed - Bug in path normalization ## [1.0.3] - 2018-10-18 ### Added - AppVeyor for Visual Studio 2015 ### Fixed - Bug in percent encoding non-ASCII characters - Percent encoding query part ## [1.0.2] - 2018-10-13 ### Fixed - Bug in `string_view` implementation - Incorrect port copy constructor implementation ## [1.0.1] - 2018-08-11 ### Changed - Build defaults to C++11 ### Fixed - Fix to `network::uri_builder` to allow URIs that have a scheme and absolute path - Other minor bug fixes and optimizations ## [1.0.0] - 2018-05-27 ### Added - A class, `network::uri` that models a URI, including URI parsing on construction according to [RFC 3986](https://tools.ietf.org/html/rfc3986) - A class, `network::uri_builder` that allows a user to construct valid URIs - Member functions to allow URI normalization, resolution, and comparison - Support for URI percent encoding asymptote-3.05/LspCpp/third_party/uri/CMakeFiles/0000755000000000000000000000000015031566362020467 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/CMakeFiles/doc.dir/0000755000000000000000000000000015031566362022011 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/CMakeFiles/doc.dir/compiler_depend.make0000644000000000000000000000016115031566362025777 0ustar rootroot# Empty custom commands generated dependencies file for doc. # This may be replaced when dependencies are built. asymptote-3.05/LspCpp/third_party/uri/CMakeFiles/doc.dir/progress.make0000644000000000000000000000002615031566362024512 0ustar rootrootCMAKE_PROGRESS_1 = 1 asymptote-3.05/LspCpp/third_party/uri/CMakeFiles/doc.dir/cmake_clean.cmake0000644000000000000000000000027415031566362025240 0ustar rootrootfile(REMOVE_RECURSE "CMakeFiles/doc" ) # Per-language clean rules from dependency scanning. foreach(lang ) include(CMakeFiles/doc.dir/cmake_clean_${lang}.cmake OPTIONAL) endforeach() asymptote-3.05/LspCpp/third_party/uri/CMakeFiles/doc.dir/compiler_depend.ts0000644000000000000000000000015315031566362025511 0ustar rootroot# CMAKE generated file: DO NOT EDIT! # Timestamp file for custom commands dependencies management for doc. asymptote-3.05/LspCpp/third_party/uri/CMakeFiles/doc.dir/DependInfo.cmake0000644000000000000000000000111115031566362025020 0ustar rootroot # Consider dependencies only in project. set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) # The set of languages for which implicit dependencies are needed: set(CMAKE_DEPENDS_LANGUAGES ) # The set of dependency files which are needed: set(CMAKE_DEPENDS_DEPENDENCY_FILES ) # Targets to which this target links which contain Fortran sources. set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES ) # Targets to which this target links which contain Fortran sources. set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES ) # Fortran module output directory. set(CMAKE_Fortran_TARGET_MODULE_DIR "") asymptote-3.05/LspCpp/third_party/uri/CMakeFiles/progress.marks0000644000000000000000000000000215031566362023362 0ustar rootroot9 asymptote-3.05/LspCpp/third_party/uri/Doxyfile.in0000644000000000000000000022044015031566105020634 0ustar rootroot# Doxyfile 1.7.6.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or sequence of words) that should # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = "C++ Network Library: URI" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = @CMAKE_CURRENT_SOURCE_DIR@/include/ # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding # "class=itcl::class" will allow you to use the command class in the # itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and # unions with only public data fields will be shown inline in the documentation # of the scope in which they are defined (i.e. file, namespace, or group # documentation), provided this scope is documented. If set to NO (the default), # structs, classes, and unions are shown on a separate page (for HTML and Man # pages) or section (for LaTeX and RTF). INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given # their name and scope. Since this can be an expensive process and often the # same symbol appear multiple times in the code, doxygen keeps a cache of # pre-resolved symbols. If the cache is too small doxygen will become slower. # If the cache is too large, memory is wasted. The cache size is given by this # formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. The create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files # containing the references data. This must be a list of .bib files. The # .bib extension is automatically appended if omitted. Using this command # requires the bibtex tool to be installed. See also # http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style # of the bibliography can be controlled using LATEX_BIB_STYLE. To use this # feature you need bibtex and perl available in the search path. CITE_BIB_FILES = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = @CMAKE_CURRENT_SOURCE_DIR@/include # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.hpp # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = @CMAKE_CURRENT_SOURCE_DIR@/include/network/uri/detail # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = *-inl.hpp # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty or if # non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = @CMAKE_CURRENT_SOURCE_DIR@/uri/src/ #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # style sheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the style sheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) # at top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. Since the tabs have the same information as the # navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. # Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the # mathjax.org site, so you can quickly see the result without installing # MathJax, but it is strongly recommended to install a local copy of MathJax # before deployment. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension # names that should be enabled during MathJax rendering. MATHJAX_EXTENSIONS = # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See # http://en.wikipedia.org/wiki/BibTeX for more info. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load style sheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = DOXYGEN_SHOULD_SKIP_THIS # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will use the Helvetica font for all dot files that # doxygen generates. When you want a differently looking font you can specify # the font name using DOT_FONTNAME. You need to make sure dot is able to find # the font, which can be done by putting it in a standard location or by setting # the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the # directory containing the font. DOT_FONTNAME = Helvetica # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the Helvetica font. # If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are svg, png, jpg, or gif. # If left blank png will be used. If you choose svg you need to set # HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # Note that this requires a modern browser other than Internet Explorer. # Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible. Older versions of IE do not have SVG support. INTERACTIVE_SVG = NO # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES asymptote-3.05/LspCpp/third_party/uri/deps/0000755000000000000000000000000015031566105017452 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/deps/README.md0000644000000000000000000001100515031566105020726 0ustar rootroot# GoogleTest ### Announcements #### Live at Head GoogleTest now follows the [Abseil Live at Head philosophy](https://abseil.io/about/philosophy#upgrade-support). We recommend using the latest commit in the `main` branch in your projects. #### Documentation Updates Our documentation is now live on GitHub Pages at https://google.github.io/googletest/. We recommend browsing the documentation on GitHub Pages rather than directly in the repository. #### Release 1.11.0 [Release 1.11.0](https://github.com/google/googletest/releases/tag/release-1.11.0) is now available. #### Coming Soon * We are planning to take a dependency on [Abseil](https://github.com/abseil/abseil-cpp). * More documentation improvements are planned. ## Welcome to **GoogleTest**, Google's C++ test framework! This repository is a merger of the formerly separate GoogleTest and GoogleMock projects. These were so closely related that it makes sense to maintain and release them together. ### Getting Started See the [GoogleTest User's Guide](https://google.github.io/googletest/) for documentation. We recommend starting with the [GoogleTest Primer](https://google.github.io/googletest/primer.html). More information about building GoogleTest can be found at [googletest/README.md](googletest/README.md). ## Features * An [xUnit](https://en.wikipedia.org/wiki/XUnit) test framework. * Test discovery. * A rich set of assertions. * User-defined assertions. * Death tests. * Fatal and non-fatal failures. * Value-parameterized tests. * Type-parameterized tests. * Various options for running the tests. * XML test report generation. ## Supported Platforms GoogleTest requires a codebase and compiler compliant with the C++11 standard or newer. The GoogleTest code is officially supported on the following platforms. Operating systems or tools not listed below are community-supported. For community-supported platforms, patches that do not complicate the code may be considered. If you notice any problems on your platform, please file an issue on the [GoogleTest GitHub Issue Tracker](https://github.com/google/googletest/issues). Pull requests containing fixes are welcome! ### Operating Systems * Linux * macOS * Windows ### Compilers * gcc 5.0+ * clang 5.0+ * MSVC 2015+ **macOS users:** Xcode 9.3+ provides clang 5.0+. ### Build Systems * [Bazel](https://bazel.build/) * [CMake](https://cmake.org/) **Note:** Bazel is the build system used by the team internally and in tests. CMake is supported on a best-effort basis and by the community. ## Who Is Using GoogleTest? In addition to many internal projects at Google, GoogleTest is also used by the following notable projects: * The [Chromium projects](http://www.chromium.org/) (behind the Chrome browser and Chrome OS). * The [LLVM](http://llvm.org/) compiler. * [Protocol Buffers](https://github.com/google/protobuf), Google's data interchange format. * The [OpenCV](http://opencv.org/) computer vision library. ## Related Open Source Projects [GTest Runner](https://github.com/nholthaus/gtest-runner) is a Qt5 based automated test-runner and Graphical User Interface with powerful features for Windows and Linux platforms. [GoogleTest UI](https://github.com/ospector/gtest-gbar) is a test runner that runs your test binary, allows you to track its progress via a progress bar, and displays a list of test failures. Clicking on one shows failure text. GoogleTest UI is written in C#. [GTest TAP Listener](https://github.com/kinow/gtest-tap-listener) is an event listener for GoogleTest that implements the [TAP protocol](https://en.wikipedia.org/wiki/Test_Anything_Protocol) for test result output. If your test runner understands TAP, you may find it useful. [gtest-parallel](https://github.com/google/gtest-parallel) is a test runner that runs tests from your binary in parallel to provide significant speed-up. [GoogleTest Adapter](https://marketplace.visualstudio.com/items?itemName=DavidSchuldenfrei.gtest-adapter) is a VS Code extension allowing to view GoogleTest in a tree view, and run/debug your tests. [C++ TestMate](https://github.com/matepek/vscode-catch2-test-adapter) is a VS Code extension allowing to view GoogleTest in a tree view, and run/debug your tests. [Cornichon](https://pypi.org/project/cornichon/) is a small Gherkin DSL parser that generates stub code for GoogleTest. ## Contributing Changes Please read [`CONTRIBUTING.md`](https://github.com/google/googletest/blob/master/CONTRIBUTING.md) for details on how to contribute to this project. Happy testing! asymptote-3.05/LspCpp/third_party/uri/deps/docs/0000755000000000000000000000000015031566105020402 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/deps/docs/community_created_documentation.md0000644000000000000000000000052615031566105027373 0ustar rootroot# Community-Created Documentation The following is a list, in no particular order, of links to documentation created by the Googletest community. * [Googlemock Insights](https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/googletest/insights.md), by [ElectricRCAircraftGuy](https://github.com/ElectricRCAircraftGuy) asymptote-3.05/LspCpp/third_party/uri/deps/docs/quickstart-cmake.md0000644000000000000000000001167615031566105024207 0ustar rootroot# Quickstart: Building with CMake This tutorial aims to get you up and running with GoogleTest using CMake. If you're using GoogleTest for the first time or need a refresher, we recommend this tutorial as a starting point. If your project uses Bazel, see the [Quickstart for Bazel](quickstart-bazel.md) instead. ## Prerequisites To complete this tutorial, you'll need: * A compatible operating system (e.g. Linux, macOS, Windows). * A compatible C++ compiler that supports at least C++11. * [CMake](https://cmake.org/) and a compatible build tool for building the project. * Compatible build tools include [Make](https://www.gnu.org/software/make/), [Ninja](https://ninja-build.org/), and others - see [CMake Generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html) for more information. See [Supported Platforms](platforms.md) for more information about platforms compatible with GoogleTest. If you don't already have CMake installed, see the [CMake installation guide](https://cmake.org/install). {: .callout .note} Note: The terminal commands in this tutorial show a Unix shell prompt, but the commands work on the Windows command line as well. ## Set up a project CMake uses a file named `CMakeLists.txt` to configure the build system for a project. You'll use this file to set up your project and declare a dependency on GoogleTest. First, create a directory for your project: ``` $ mkdir my_project && cd my_project ``` Next, you'll create the `CMakeLists.txt` file and declare a dependency on GoogleTest. There are many ways to express dependencies in the CMake ecosystem; in this quickstart, you'll use the [`FetchContent` CMake module](https://cmake.org/cmake/help/latest/module/FetchContent.html). To do this, in your project directory (`my_project`), create a file named `CMakeLists.txt` with the following contents: ```cmake cmake_minimum_required(VERSION 3.14) project(my_project) # GoogleTest requires at least C++11 set(CMAKE_CXX_STANDARD 11) include(FetchContent) FetchContent_Declare( googletest URL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip ) # For Windows: Prevent overriding the parent project's compiler/linker settings set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) ``` The above configuration declares a dependency on GoogleTest which is downloaded from GitHub. In the above example, `609281088cfefc76f9d0ce82e1ff6c30cc3591e5` is the Git commit hash of the GoogleTest version to use; we recommend updating the hash often to point to the latest version. For more information about how to create `CMakeLists.txt` files, see the [CMake Tutorial](https://cmake.org/cmake/help/latest/guide/tutorial/index.html). ## Create and run a binary With GoogleTest declared as a dependency, you can use GoogleTest code within your own project. As an example, create a file named `hello_test.cc` in your `my_project` directory with the following contents: ```cpp #include // Demonstrate some basic assertions. TEST(HelloTest, BasicAssertions) { // Expect two strings not to be equal. EXPECT_STRNE("hello", "world"); // Expect equality. EXPECT_EQ(7 * 6, 42); } ``` GoogleTest provides [assertions](primer.md#assertions) that you use to test the behavior of your code. The above sample includes the main GoogleTest header file and demonstrates some basic assertions. To build the code, add the following to the end of your `CMakeLists.txt` file: ```cmake enable_testing() add_executable( hello_test hello_test.cc ) target_link_libraries( hello_test gtest_main ) include(GoogleTest) gtest_discover_tests(hello_test) ``` The above configuration enables testing in CMake, declares the C++ test binary you want to build (`hello_test`), and links it to GoogleTest (`gtest_main`). The last two lines enable CMake's test runner to discover the tests included in the binary, using the [`GoogleTest` CMake module](https://cmake.org/cmake/help/git-stage/module/GoogleTest.html). Now you can build and run your test:
    my_project$ cmake -S . -B build
    -- The C compiler identification is GNU 10.2.1
    -- The CXX compiler identification is GNU 10.2.1
    ...
    -- Build files have been written to: .../my_project/build
    
    my_project$ cmake --build build
    Scanning dependencies of target gtest
    ...
    [100%] Built target gmock_main
    
    my_project$ cd build && ctest
    Test project .../my_project/build
        Start 1: HelloTest.BasicAssertions
    1/1 Test #1: HelloTest.BasicAssertions ........   Passed    0.00 sec
    
    100% tests passed, 0 tests failed out of 1
    
    Total Test time (real) =   0.01 sec
    
    Congratulations! You've successfully built and run a test binary using GoogleTest. ## Next steps * [Check out the Primer](primer.md) to start learning how to write simple tests. * [See the code samples](samples.md) for more examples showing how to use a variety of GoogleTest features. asymptote-3.05/LspCpp/third_party/uri/deps/docs/reference/0000755000000000000000000000000015031566105022340 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/deps/docs/reference/testing.md0000644000000000000000000012546615031566105024355 0ustar rootroot# Testing Reference This page lists the facilities provided by GoogleTest for writing test programs. To use them, include the header `gtest/gtest.h`. ## Macros GoogleTest defines the following macros for writing tests. ### TEST {#TEST}
    TEST(TestSuiteName, TestName) {
      ... statements ...
    }
    
    Defines an individual test named *`TestName`* in the test suite *`TestSuiteName`*, consisting of the given statements. Both arguments *`TestSuiteName`* and *`TestName`* must be valid C++ identifiers and must not contain underscores (`_`). Tests in different test suites can have the same individual name. The statements within the test body can be any code under test. [Assertions](assertions.md) used within the test body determine the outcome of the test. ### TEST_F {#TEST_F}
    TEST_F(TestFixtureName, TestName) {
      ... statements ...
    }
    
    Defines an individual test named *`TestName`* that uses the test fixture class *`TestFixtureName`*. The test suite name is *`TestFixtureName`*. Both arguments *`TestFixtureName`* and *`TestName`* must be valid C++ identifiers and must not contain underscores (`_`). *`TestFixtureName`* must be the name of a test fixture class—see [Test Fixtures](../primer.md#same-data-multiple-tests). The statements within the test body can be any code under test. [Assertions](assertions.md) used within the test body determine the outcome of the test. ### TEST_P {#TEST_P}
    TEST_P(TestFixtureName, TestName) {
      ... statements ...
    }
    
    Defines an individual value-parameterized test named *`TestName`* that uses the test fixture class *`TestFixtureName`*. The test suite name is *`TestFixtureName`*. Both arguments *`TestFixtureName`* and *`TestName`* must be valid C++ identifiers and must not contain underscores (`_`). *`TestFixtureName`* must be the name of a value-parameterized test fixture class—see [Value-Parameterized Tests](../advanced.md#value-parameterized-tests). The statements within the test body can be any code under test. Within the test body, the test parameter can be accessed with the `GetParam()` function (see [`WithParamInterface`](#WithParamInterface)). For example: ```cpp TEST_P(MyTestSuite, DoesSomething) { ... EXPECT_TRUE(DoSomething(GetParam())); ... } ``` [Assertions](assertions.md) used within the test body determine the outcome of the test. See also [`INSTANTIATE_TEST_SUITE_P`](#INSTANTIATE_TEST_SUITE_P). ### INSTANTIATE_TEST_SUITE_P {#INSTANTIATE_TEST_SUITE_P} `INSTANTIATE_TEST_SUITE_P(`*`InstantiationName`*`,`*`TestSuiteName`*`,`*`param_generator`*`)` \ `INSTANTIATE_TEST_SUITE_P(`*`InstantiationName`*`,`*`TestSuiteName`*`,`*`param_generator`*`,`*`name_generator`*`)` Instantiates the value-parameterized test suite *`TestSuiteName`* (defined with [`TEST_P`](#TEST_P)). The argument *`InstantiationName`* is a unique name for the instantiation of the test suite, to distinguish between multiple instantiations. In test output, the instantiation name is added as a prefix to the test suite name *`TestSuiteName`*. The argument *`param_generator`* is one of the following GoogleTest-provided functions that generate the test parameters, all defined in the `::testing` namespace: | Parameter Generator | Behavior | | ------------------- | ---------------------------------------------------- | | `Range(begin, end [, step])` | Yields values `{begin, begin+step, begin+step+step, ...}`. The values do not include `end`. `step` defaults to 1. | | `Values(v1, v2, ..., vN)` | Yields values `{v1, v2, ..., vN}`. | | `ValuesIn(container)` or `ValuesIn(begin,end)` | Yields values from a C-style array, an STL-style container, or an iterator range `[begin, end)`. | | `Bool()` | Yields sequence `{false, true}`. | | `Combine(g1, g2, ..., gN)` | Yields as `std::tuple` *n*-tuples all combinations (Cartesian product) of the values generated by the given *n* generators `g1`, `g2`, ..., `gN`. | The optional last argument *`name_generator`* is a function or functor that generates custom test name suffixes based on the test parameters. The function must accept an argument of type [`TestParamInfo`](#TestParamInfo) and return a `std::string`. The test name suffix can only contain alphanumeric characters and underscores. GoogleTest provides [`PrintToStringParamName`](#PrintToStringParamName), or a custom function can be used for more control: ```cpp INSTANTIATE_TEST_SUITE_P( MyInstantiation, MyTestSuite, ::testing::Values(...), [](const ::testing::TestParamInfo& info) { // Can use info.param here to generate the test suffix std::string name = ... return name; }); ``` For more information, see [Value-Parameterized Tests](../advanced.md#value-parameterized-tests). See also [`GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST`](#GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST). ### TYPED_TEST_SUITE {#TYPED_TEST_SUITE} `TYPED_TEST_SUITE(`*`TestFixtureName`*`,`*`Types`*`)` Defines a typed test suite based on the test fixture *`TestFixtureName`*. The test suite name is *`TestFixtureName`*. The argument *`TestFixtureName`* is a fixture class template, parameterized by a type, for example: ```cpp template class MyFixture : public ::testing::Test { public: ... using List = std::list; static T shared_; T value_; }; ``` The argument *`Types`* is a [`Types`](#Types) object representing the list of types to run the tests on, for example: ```cpp using MyTypes = ::testing::Types; TYPED_TEST_SUITE(MyFixture, MyTypes); ``` The type alias (`using` or `typedef`) is necessary for the `TYPED_TEST_SUITE` macro to parse correctly. See also [`TYPED_TEST`](#TYPED_TEST) and [Typed Tests](../advanced.md#typed-tests) for more information. ### TYPED_TEST {#TYPED_TEST}
    TYPED_TEST(TestSuiteName, TestName) {
      ... statements ...
    }
    
    Defines an individual typed test named *`TestName`* in the typed test suite *`TestSuiteName`*. The test suite must be defined with [`TYPED_TEST_SUITE`](#TYPED_TEST_SUITE). Within the test body, the special name `TypeParam` refers to the type parameter, and `TestFixture` refers to the fixture class. See the following example: ```cpp TYPED_TEST(MyFixture, Example) { // Inside a test, refer to the special name TypeParam to get the type // parameter. Since we are inside a derived class template, C++ requires // us to visit the members of MyFixture via 'this'. TypeParam n = this->value_; // To visit static members of the fixture, add the 'TestFixture::' // prefix. n += TestFixture::shared_; // To refer to typedefs in the fixture, add the 'typename TestFixture::' // prefix. The 'typename' is required to satisfy the compiler. typename TestFixture::List values; values.push_back(n); ... } ``` For more information, see [Typed Tests](../advanced.md#typed-tests). ### TYPED_TEST_SUITE_P {#TYPED_TEST_SUITE_P} `TYPED_TEST_SUITE_P(`*`TestFixtureName`*`)` Defines a type-parameterized test suite based on the test fixture *`TestFixtureName`*. The test suite name is *`TestFixtureName`*. The argument *`TestFixtureName`* is a fixture class template, parameterized by a type. See [`TYPED_TEST_SUITE`](#TYPED_TEST_SUITE) for an example. See also [`TYPED_TEST_P`](#TYPED_TEST_P) and [Type-Parameterized Tests](../advanced.md#type-parameterized-tests) for more information. ### TYPED_TEST_P {#TYPED_TEST_P}
    TYPED_TEST_P(TestSuiteName, TestName) {
      ... statements ...
    }
    
    Defines an individual type-parameterized test named *`TestName`* in the type-parameterized test suite *`TestSuiteName`*. The test suite must be defined with [`TYPED_TEST_SUITE_P`](#TYPED_TEST_SUITE_P). Within the test body, the special name `TypeParam` refers to the type parameter, and `TestFixture` refers to the fixture class. See [`TYPED_TEST`](#TYPED_TEST) for an example. See also [`REGISTER_TYPED_TEST_SUITE_P`](#REGISTER_TYPED_TEST_SUITE_P) and [Type-Parameterized Tests](../advanced.md#type-parameterized-tests) for more information. ### REGISTER_TYPED_TEST_SUITE_P {#REGISTER_TYPED_TEST_SUITE_P} `REGISTER_TYPED_TEST_SUITE_P(`*`TestSuiteName`*`,`*`TestNames...`*`)` Registers the type-parameterized tests *`TestNames...`* of the test suite *`TestSuiteName`*. The test suite and tests must be defined with [`TYPED_TEST_SUITE_P`](#TYPED_TEST_SUITE_P) and [`TYPED_TEST_P`](#TYPED_TEST_P). For example: ```cpp // Define the test suite and tests. TYPED_TEST_SUITE_P(MyFixture); TYPED_TEST_P(MyFixture, HasPropertyA) { ... } TYPED_TEST_P(MyFixture, HasPropertyB) { ... } // Register the tests in the test suite. REGISTER_TYPED_TEST_SUITE_P(MyFixture, HasPropertyA, HasPropertyB); ``` See also [`INSTANTIATE_TYPED_TEST_SUITE_P`](#INSTANTIATE_TYPED_TEST_SUITE_P) and [Type-Parameterized Tests](../advanced.md#type-parameterized-tests) for more information. ### INSTANTIATE_TYPED_TEST_SUITE_P {#INSTANTIATE_TYPED_TEST_SUITE_P} `INSTANTIATE_TYPED_TEST_SUITE_P(`*`InstantiationName`*`,`*`TestSuiteName`*`,`*`Types`*`)` Instantiates the type-parameterized test suite *`TestSuiteName`*. The test suite must be registered with [`REGISTER_TYPED_TEST_SUITE_P`](#REGISTER_TYPED_TEST_SUITE_P). The argument *`InstantiationName`* is a unique name for the instantiation of the test suite, to distinguish between multiple instantiations. In test output, the instantiation name is added as a prefix to the test suite name *`TestSuiteName`*. The argument *`Types`* is a [`Types`](#Types) object representing the list of types to run the tests on, for example: ```cpp using MyTypes = ::testing::Types; INSTANTIATE_TYPED_TEST_SUITE_P(MyInstantiation, MyFixture, MyTypes); ``` The type alias (`using` or `typedef`) is necessary for the `INSTANTIATE_TYPED_TEST_SUITE_P` macro to parse correctly. For more information, see [Type-Parameterized Tests](../advanced.md#type-parameterized-tests). ### FRIEND_TEST {#FRIEND_TEST} `FRIEND_TEST(`*`TestSuiteName`*`,`*`TestName`*`)` Within a class body, declares an individual test as a friend of the class, enabling the test to access private class members. If the class is defined in a namespace, then in order to be friends of the class, test fixtures and tests must be defined in the exact same namespace, without inline or anonymous namespaces. For example, if the class definition looks like the following: ```cpp namespace my_namespace { class MyClass { friend class MyClassTest; FRIEND_TEST(MyClassTest, HasPropertyA); FRIEND_TEST(MyClassTest, HasPropertyB); ... definition of class MyClass ... }; } // namespace my_namespace ``` Then the test code should look like: ```cpp namespace my_namespace { class MyClassTest : public ::testing::Test { ... }; TEST_F(MyClassTest, HasPropertyA) { ... } TEST_F(MyClassTest, HasPropertyB) { ... } } // namespace my_namespace ``` See [Testing Private Code](../advanced.md#testing-private-code) for more information. ### SCOPED_TRACE {#SCOPED_TRACE} `SCOPED_TRACE(`*`message`*`)` Causes the current file name, line number, and the given message *`message`* to be added to the failure message for each assertion failure that occurs in the scope. For more information, see [Adding Traces to Assertions](../advanced.md#adding-traces-to-assertions). See also the [`ScopedTrace` class](#ScopedTrace). ### GTEST_SKIP {#GTEST_SKIP} `GTEST_SKIP()` Prevents further test execution at runtime. Can be used in individual test cases or in the `SetUp()` methods of test environments or test fixtures (classes derived from the [`Environment`](#Environment) or [`Test`](#Test) classes). If used in a global test environment `SetUp()` method, it skips all tests in the test program. If used in a test fixture `SetUp()` method, it skips all tests in the corresponding test suite. Similar to assertions, `GTEST_SKIP` allows streaming a custom message into it. See [Skipping Test Execution](../advanced.md#skipping-test-execution) for more information. ### GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST {#GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST} `GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(`*`TestSuiteName`*`)` Allows the value-parameterized test suite *`TestSuiteName`* to be uninstantiated. By default, every [`TEST_P`](#TEST_P) call without a corresponding [`INSTANTIATE_TEST_SUITE_P`](#INSTANTIATE_TEST_SUITE_P) call causes a failing test in the test suite `GoogleTestVerification`. `GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST` suppresses this failure for the given test suite. ## Classes and types GoogleTest defines the following classes and types to help with writing tests. ### AssertionResult {#AssertionResult} `::testing::AssertionResult` A class for indicating whether an assertion was successful. When the assertion wasn't successful, the `AssertionResult` object stores a non-empty failure message that can be retrieved with the object's `message()` method. To create an instance of this class, use one of the factory functions [`AssertionSuccess()`](#AssertionSuccess) or [`AssertionFailure()`](#AssertionFailure). ### AssertionException {#AssertionException} `::testing::AssertionException` Exception which can be thrown from [`TestEventListener::OnTestPartResult`](#TestEventListener::OnTestPartResult). ### EmptyTestEventListener {#EmptyTestEventListener} `::testing::EmptyTestEventListener` Provides an empty implementation of all methods in the [`TestEventListener`](#TestEventListener) interface, such that a subclass only needs to override the methods it cares about. ### Environment {#Environment} `::testing::Environment` Represents a global test environment. See [Global Set-Up and Tear-Down](../advanced.md#global-set-up-and-tear-down). #### Protected Methods {#Environment-protected} ##### SetUp {#Environment::SetUp} `virtual void Environment::SetUp()` Override this to define how to set up the environment. ##### TearDown {#Environment::TearDown} `virtual void Environment::TearDown()` Override this to define how to tear down the environment. ### ScopedTrace {#ScopedTrace} `::testing::ScopedTrace` An instance of this class causes a trace to be included in every test failure message generated by code in the scope of the lifetime of the `ScopedTrace` instance. The effect is undone with the destruction of the instance. The `ScopedTrace` constructor has the following form: ```cpp template ScopedTrace(const char* file, int line, const T& message) ``` Example usage: ```cpp ::testing::ScopedTrace trace("file.cc", 123, "message"); ``` The resulting trace includes the given source file path and line number, and the given message. The `message` argument can be anything streamable to `std::ostream`. See also [`SCOPED_TRACE`](#SCOPED_TRACE). ### Test {#Test} `::testing::Test` The abstract class that all tests inherit from. `Test` is not copyable. #### Public Methods {#Test-public} ##### SetUpTestSuite {#Test::SetUpTestSuite} `static void Test::SetUpTestSuite()` Performs shared setup for all tests in the test suite. GoogleTest calls `SetUpTestSuite()` before running the first test in the test suite. ##### TearDownTestSuite {#Test::TearDownTestSuite} `static void Test::TearDownTestSuite()` Performs shared teardown for all tests in the test suite. GoogleTest calls `TearDownTestSuite()` after running the last test in the test suite. ##### HasFatalFailure {#Test::HasFatalFailure} `static bool Test::HasFatalFailure()` Returns true if and only if the current test has a fatal failure. ##### HasNonfatalFailure {#Test::HasNonfatalFailure} `static bool Test::HasNonfatalFailure()` Returns true if and only if the current test has a nonfatal failure. ##### HasFailure {#Test::HasFailure} `static bool Test::HasFailure()` Returns true if and only if the current test has any failure, either fatal or nonfatal. ##### IsSkipped {#Test::IsSkipped} `static bool Test::IsSkipped()` Returns true if and only if the current test was skipped. ##### RecordProperty {#Test::RecordProperty} `static void Test::RecordProperty(const std::string& key, const std::string& value)` \ `static void Test::RecordProperty(const std::string& key, int value)` Logs a property for the current test, test suite, or entire invocation of the test program. Only the last value for a given key is logged. The key must be a valid XML attribute name, and cannot conflict with the ones already used by GoogleTest (`name`, `status`, `time`, `classname`, `type_param`, and `value_param`). `RecordProperty` is `public static` so it can be called from utility functions that are not members of the test fixture. Calls to `RecordProperty` made during the lifespan of the test (from the moment its constructor starts to the moment its destructor finishes) are output in XML as attributes of the `` element. Properties recorded from a fixture's `SetUpTestSuite` or `TearDownTestSuite` methods are logged as attributes of the corresponding `` element. Calls to `RecordProperty` made in the global context (before or after invocation of `RUN_ALL_TESTS` or from the `SetUp`/`TearDown` methods of registered `Environment` objects) are output as attributes of the `` element. #### Protected Methods {#Test-protected} ##### SetUp {#Test::SetUp} `virtual void Test::SetUp()` Override this to perform test fixture setup. GoogleTest calls `SetUp()` before running each individual test. ##### TearDown {#Test::TearDown} `virtual void Test::TearDown()` Override this to perform test fixture teardown. GoogleTest calls `TearDown()` after running each individual test. ### TestWithParam {#TestWithParam} `::testing::TestWithParam` A convenience class which inherits from both [`Test`](#Test) and [`WithParamInterface`](#WithParamInterface). ### TestSuite {#TestSuite} Represents a test suite. `TestSuite` is not copyable. #### Public Methods {#TestSuite-public} ##### name {#TestSuite::name} `const char* TestSuite::name() const` Gets the name of the test suite. ##### type_param {#TestSuite::type_param} `const char* TestSuite::type_param() const` Returns the name of the parameter type, or `NULL` if this is not a typed or type-parameterized test suite. See [Typed Tests](../advanced.md#typed-tests) and [Type-Parameterized Tests](../advanced.md#type-parameterized-tests). ##### should_run {#TestSuite::should_run} `bool TestSuite::should_run() const` Returns true if any test in this test suite should run. ##### successful_test_count {#TestSuite::successful_test_count} `int TestSuite::successful_test_count() const` Gets the number of successful tests in this test suite. ##### skipped_test_count {#TestSuite::skipped_test_count} `int TestSuite::skipped_test_count() const` Gets the number of skipped tests in this test suite. ##### failed_test_count {#TestSuite::failed_test_count} `int TestSuite::failed_test_count() const` Gets the number of failed tests in this test suite. ##### reportable_disabled_test_count {#TestSuite::reportable_disabled_test_count} `int TestSuite::reportable_disabled_test_count() const` Gets the number of disabled tests that will be reported in the XML report. ##### disabled_test_count {#TestSuite::disabled_test_count} `int TestSuite::disabled_test_count() const` Gets the number of disabled tests in this test suite. ##### reportable_test_count {#TestSuite::reportable_test_count} `int TestSuite::reportable_test_count() const` Gets the number of tests to be printed in the XML report. ##### test_to_run_count {#TestSuite::test_to_run_count} `int TestSuite::test_to_run_count() const` Get the number of tests in this test suite that should run. ##### total_test_count {#TestSuite::total_test_count} `int TestSuite::total_test_count() const` Gets the number of all tests in this test suite. ##### Passed {#TestSuite::Passed} `bool TestSuite::Passed() const` Returns true if and only if the test suite passed. ##### Failed {#TestSuite::Failed} `bool TestSuite::Failed() const` Returns true if and only if the test suite failed. ##### elapsed_time {#TestSuite::elapsed_time} `TimeInMillis TestSuite::elapsed_time() const` Returns the elapsed time, in milliseconds. ##### start_timestamp {#TestSuite::start_timestamp} `TimeInMillis TestSuite::start_timestamp() const` Gets the time of the test suite start, in ms from the start of the UNIX epoch. ##### GetTestInfo {#TestSuite::GetTestInfo} `const TestInfo* TestSuite::GetTestInfo(int i) const` Returns the [`TestInfo`](#TestInfo) for the `i`-th test among all the tests. `i` can range from 0 to `total_test_count() - 1`. If `i` is not in that range, returns `NULL`. ##### ad_hoc_test_result {#TestSuite::ad_hoc_test_result} `const TestResult& TestSuite::ad_hoc_test_result() const` Returns the [`TestResult`](#TestResult) that holds test properties recorded during execution of `SetUpTestSuite` and `TearDownTestSuite`. ### TestInfo {#TestInfo} `::testing::TestInfo` Stores information about a test. #### Public Methods {#TestInfo-public} ##### test_suite_name {#TestInfo::test_suite_name} `const char* TestInfo::test_suite_name() const` Returns the test suite name. ##### name {#TestInfo::name} `const char* TestInfo::name() const` Returns the test name. ##### type_param {#TestInfo::type_param} `const char* TestInfo::type_param() const` Returns the name of the parameter type, or `NULL` if this is not a typed or type-parameterized test. See [Typed Tests](../advanced.md#typed-tests) and [Type-Parameterized Tests](../advanced.md#type-parameterized-tests). ##### value_param {#TestInfo::value_param} `const char* TestInfo::value_param() const` Returns the text representation of the value parameter, or `NULL` if this is not a value-parameterized test. See [Value-Parameterized Tests](../advanced.md#value-parameterized-tests). ##### file {#TestInfo::file} `const char* TestInfo::file() const` Returns the file name where this test is defined. ##### line {#TestInfo::line} `int TestInfo::line() const` Returns the line where this test is defined. ##### is_in_another_shard {#TestInfo::is_in_another_shard} `bool TestInfo::is_in_another_shard() const` Returns true if this test should not be run because it's in another shard. ##### should_run {#TestInfo::should_run} `bool TestInfo::should_run() const` Returns true if this test should run, that is if the test is not disabled (or it is disabled but the `also_run_disabled_tests` flag has been specified) and its full name matches the user-specified filter. GoogleTest allows the user to filter the tests by their full names. Only the tests that match the filter will run. See [Running a Subset of the Tests](../advanced.md#running-a-subset-of-the-tests) for more information. ##### is_reportable {#TestInfo::is_reportable} `bool TestInfo::is_reportable() const` Returns true if and only if this test will appear in the XML report. ##### result {#TestInfo::result} `const TestResult* TestInfo::result() const` Returns the result of the test. See [`TestResult`](#TestResult). ### TestParamInfo {#TestParamInfo} `::testing::TestParamInfo` Describes a parameter to a value-parameterized test. The type `T` is the type of the parameter. Contains the fields `param` and `index` which hold the value of the parameter and its integer index respectively. ### UnitTest {#UnitTest} `::testing::UnitTest` This class contains information about the test program. `UnitTest` is a singleton class. The only instance is created when `UnitTest::GetInstance()` is first called. This instance is never deleted. `UnitTest` is not copyable. #### Public Methods {#UnitTest-public} ##### GetInstance {#UnitTest::GetInstance} `static UnitTest* UnitTest::GetInstance()` Gets the singleton `UnitTest` object. The first time this method is called, a `UnitTest` object is constructed and returned. Consecutive calls will return the same object. ##### original_working_dir {#UnitTest::original_working_dir} `const char* UnitTest::original_working_dir() const` Returns the working directory when the first [`TEST()`](#TEST) or [`TEST_F()`](#TEST_F) was executed. The `UnitTest` object owns the string. ##### current_test_suite {#UnitTest::current_test_suite} `const TestSuite* UnitTest::current_test_suite() const` Returns the [`TestSuite`](#TestSuite) object for the test that's currently running, or `NULL` if no test is running. ##### current_test_info {#UnitTest::current_test_info} `const TestInfo* UnitTest::current_test_info() const` Returns the [`TestInfo`](#TestInfo) object for the test that's currently running, or `NULL` if no test is running. ##### random_seed {#UnitTest::random_seed} `int UnitTest::random_seed() const` Returns the random seed used at the start of the current test run. ##### successful_test_suite_count {#UnitTest::successful_test_suite_count} `int UnitTest::successful_test_suite_count() const` Gets the number of successful test suites. ##### failed_test_suite_count {#UnitTest::failed_test_suite_count} `int UnitTest::failed_test_suite_count() const` Gets the number of failed test suites. ##### total_test_suite_count {#UnitTest::total_test_suite_count} `int UnitTest::total_test_suite_count() const` Gets the number of all test suites. ##### test_suite_to_run_count {#UnitTest::test_suite_to_run_count} `int UnitTest::test_suite_to_run_count() const` Gets the number of all test suites that contain at least one test that should run. ##### successful_test_count {#UnitTest::successful_test_count} `int UnitTest::successful_test_count() const` Gets the number of successful tests. ##### skipped_test_count {#UnitTest::skipped_test_count} `int UnitTest::skipped_test_count() const` Gets the number of skipped tests. ##### failed_test_count {#UnitTest::failed_test_count} `int UnitTest::failed_test_count() const` Gets the number of failed tests. ##### reportable_disabled_test_count {#UnitTest::reportable_disabled_test_count} `int UnitTest::reportable_disabled_test_count() const` Gets the number of disabled tests that will be reported in the XML report. ##### disabled_test_count {#UnitTest::disabled_test_count} `int UnitTest::disabled_test_count() const` Gets the number of disabled tests. ##### reportable_test_count {#UnitTest::reportable_test_count} `int UnitTest::reportable_test_count() const` Gets the number of tests to be printed in the XML report. ##### total_test_count {#UnitTest::total_test_count} `int UnitTest::total_test_count() const` Gets the number of all tests. ##### test_to_run_count {#UnitTest::test_to_run_count} `int UnitTest::test_to_run_count() const` Gets the number of tests that should run. ##### start_timestamp {#UnitTest::start_timestamp} `TimeInMillis UnitTest::start_timestamp() const` Gets the time of the test program start, in ms from the start of the UNIX epoch. ##### elapsed_time {#UnitTest::elapsed_time} `TimeInMillis UnitTest::elapsed_time() const` Gets the elapsed time, in milliseconds. ##### Passed {#UnitTest::Passed} `bool UnitTest::Passed() const` Returns true if and only if the unit test passed (i.e. all test suites passed). ##### Failed {#UnitTest::Failed} `bool UnitTest::Failed() const` Returns true if and only if the unit test failed (i.e. some test suite failed or something outside of all tests failed). ##### GetTestSuite {#UnitTest::GetTestSuite} `const TestSuite* UnitTest::GetTestSuite(int i) const` Gets the [`TestSuite`](#TestSuite) object for the `i`-th test suite among all the test suites. `i` can range from 0 to `total_test_suite_count() - 1`. If `i` is not in that range, returns `NULL`. ##### ad_hoc_test_result {#UnitTest::ad_hoc_test_result} `const TestResult& UnitTest::ad_hoc_test_result() const` Returns the [`TestResult`](#TestResult) containing information on test failures and properties logged outside of individual test suites. ##### listeners {#UnitTest::listeners} `TestEventListeners& UnitTest::listeners()` Returns the list of event listeners that can be used to track events inside GoogleTest. See [`TestEventListeners`](#TestEventListeners). ### TestEventListener {#TestEventListener} `::testing::TestEventListener` The interface for tracing execution of tests. The methods below are listed in the order the corresponding events are fired. #### Public Methods {#TestEventListener-public} ##### OnTestProgramStart {#TestEventListener::OnTestProgramStart} `virtual void TestEventListener::OnTestProgramStart(const UnitTest& unit_test)` Fired before any test activity starts. ##### OnTestIterationStart {#TestEventListener::OnTestIterationStart} `virtual void TestEventListener::OnTestIterationStart(const UnitTest& unit_test, int iteration)` Fired before each iteration of tests starts. There may be more than one iteration if `GTEST_FLAG(repeat)` is set. `iteration` is the iteration index, starting from 0. ##### OnEnvironmentsSetUpStart {#TestEventListener::OnEnvironmentsSetUpStart} `virtual void TestEventListener::OnEnvironmentsSetUpStart(const UnitTest& unit_test)` Fired before environment set-up for each iteration of tests starts. ##### OnEnvironmentsSetUpEnd {#TestEventListener::OnEnvironmentsSetUpEnd} `virtual void TestEventListener::OnEnvironmentsSetUpEnd(const UnitTest& unit_test)` Fired after environment set-up for each iteration of tests ends. ##### OnTestSuiteStart {#TestEventListener::OnTestSuiteStart} `virtual void TestEventListener::OnTestSuiteStart(const TestSuite& test_suite)` Fired before the test suite starts. ##### OnTestStart {#TestEventListener::OnTestStart} `virtual void TestEventListener::OnTestStart(const TestInfo& test_info)` Fired before the test starts. ##### OnTestPartResult {#TestEventListener::OnTestPartResult} `virtual void TestEventListener::OnTestPartResult(const TestPartResult& test_part_result)` Fired after a failed assertion or a `SUCCEED()` invocation. If you want to throw an exception from this function to skip to the next test, it must be an [`AssertionException`](#AssertionException) or inherited from it. ##### OnTestEnd {#TestEventListener::OnTestEnd} `virtual void TestEventListener::OnTestEnd(const TestInfo& test_info)` Fired after the test ends. ##### OnTestSuiteEnd {#TestEventListener::OnTestSuiteEnd} `virtual void TestEventListener::OnTestSuiteEnd(const TestSuite& test_suite)` Fired after the test suite ends. ##### OnEnvironmentsTearDownStart {#TestEventListener::OnEnvironmentsTearDownStart} `virtual void TestEventListener::OnEnvironmentsTearDownStart(const UnitTest& unit_test)` Fired before environment tear-down for each iteration of tests starts. ##### OnEnvironmentsTearDownEnd {#TestEventListener::OnEnvironmentsTearDownEnd} `virtual void TestEventListener::OnEnvironmentsTearDownEnd(const UnitTest& unit_test)` Fired after environment tear-down for each iteration of tests ends. ##### OnTestIterationEnd {#TestEventListener::OnTestIterationEnd} `virtual void TestEventListener::OnTestIterationEnd(const UnitTest& unit_test, int iteration)` Fired after each iteration of tests finishes. ##### OnTestProgramEnd {#TestEventListener::OnTestProgramEnd} `virtual void TestEventListener::OnTestProgramEnd(const UnitTest& unit_test)` Fired after all test activities have ended. ### TestEventListeners {#TestEventListeners} `::testing::TestEventListeners` Lets users add listeners to track events in GoogleTest. #### Public Methods {#TestEventListeners-public} ##### Append {#TestEventListeners::Append} `void TestEventListeners::Append(TestEventListener* listener)` Appends an event listener to the end of the list. GoogleTest assumes ownership of the listener (i.e. it will delete the listener when the test program finishes). ##### Release {#TestEventListeners::Release} `TestEventListener* TestEventListeners::Release(TestEventListener* listener)` Removes the given event listener from the list and returns it. It then becomes the caller's responsibility to delete the listener. Returns `NULL` if the listener is not found in the list. ##### default_result_printer {#TestEventListeners::default_result_printer} `TestEventListener* TestEventListeners::default_result_printer() const` Returns the standard listener responsible for the default console output. Can be removed from the listeners list to shut down default console output. Note that removing this object from the listener list with [`Release()`](#TestEventListeners::Release) transfers its ownership to the caller and makes this function return `NULL` the next time. ##### default_xml_generator {#TestEventListeners::default_xml_generator} `TestEventListener* TestEventListeners::default_xml_generator() const` Returns the standard listener responsible for the default XML output controlled by the `--gtest_output=xml` flag. Can be removed from the listeners list by users who want to shut down the default XML output controlled by this flag and substitute it with custom one. Note that removing this object from the listener list with [`Release()`](#TestEventListeners::Release) transfers its ownership to the caller and makes this function return `NULL` the next time. ### TestPartResult {#TestPartResult} `::testing::TestPartResult` A copyable object representing the result of a test part (i.e. an assertion or an explicit `FAIL()`, `ADD_FAILURE()`, or `SUCCESS()`). #### Public Methods {#TestPartResult-public} ##### type {#TestPartResult::type} `Type TestPartResult::type() const` Gets the outcome of the test part. The return type `Type` is an enum defined as follows: ```cpp enum Type { kSuccess, // Succeeded. kNonFatalFailure, // Failed but the test can continue. kFatalFailure, // Failed and the test should be terminated. kSkip // Skipped. }; ``` ##### file_name {#TestPartResult::file_name} `const char* TestPartResult::file_name() const` Gets the name of the source file where the test part took place, or `NULL` if it's unknown. ##### line_number {#TestPartResult::line_number} `int TestPartResult::line_number() const` Gets the line in the source file where the test part took place, or `-1` if it's unknown. ##### summary {#TestPartResult::summary} `const char* TestPartResult::summary() const` Gets the summary of the failure message. ##### message {#TestPartResult::message} `const char* TestPartResult::message() const` Gets the message associated with the test part. ##### skipped {#TestPartResult::skipped} `bool TestPartResult::skipped() const` Returns true if and only if the test part was skipped. ##### passed {#TestPartResult::passed} `bool TestPartResult::passed() const` Returns true if and only if the test part passed. ##### nonfatally_failed {#TestPartResult::nonfatally_failed} `bool TestPartResult::nonfatally_failed() const` Returns true if and only if the test part non-fatally failed. ##### fatally_failed {#TestPartResult::fatally_failed} `bool TestPartResult::fatally_failed() const` Returns true if and only if the test part fatally failed. ##### failed {#TestPartResult::failed} `bool TestPartResult::failed() const` Returns true if and only if the test part failed. ### TestProperty {#TestProperty} `::testing::TestProperty` A copyable object representing a user-specified test property which can be output as a key/value string pair. #### Public Methods {#TestProperty-public} ##### key {#key} `const char* key() const` Gets the user-supplied key. ##### value {#value} `const char* value() const` Gets the user-supplied value. ##### SetValue {#SetValue} `void SetValue(const std::string& new_value)` Sets a new value, overriding the previous one. ### TestResult {#TestResult} `::testing::TestResult` Contains information about the result of a single test. `TestResult` is not copyable. #### Public Methods {#TestResult-public} ##### total_part_count {#TestResult::total_part_count} `int TestResult::total_part_count() const` Gets the number of all test parts. This is the sum of the number of successful test parts and the number of failed test parts. ##### test_property_count {#TestResult::test_property_count} `int TestResult::test_property_count() const` Returns the number of test properties. ##### Passed {#TestResult::Passed} `bool TestResult::Passed() const` Returns true if and only if the test passed (i.e. no test part failed). ##### Skipped {#TestResult::Skipped} `bool TestResult::Skipped() const` Returns true if and only if the test was skipped. ##### Failed {#TestResult::Failed} `bool TestResult::Failed() const` Returns true if and only if the test failed. ##### HasFatalFailure {#TestResult::HasFatalFailure} `bool TestResult::HasFatalFailure() const` Returns true if and only if the test fatally failed. ##### HasNonfatalFailure {#TestResult::HasNonfatalFailure} `bool TestResult::HasNonfatalFailure() const` Returns true if and only if the test has a non-fatal failure. ##### elapsed_time {#TestResult::elapsed_time} `TimeInMillis TestResult::elapsed_time() const` Returns the elapsed time, in milliseconds. ##### start_timestamp {#TestResult::start_timestamp} `TimeInMillis TestResult::start_timestamp() const` Gets the time of the test case start, in ms from the start of the UNIX epoch. ##### GetTestPartResult {#TestResult::GetTestPartResult} `const TestPartResult& TestResult::GetTestPartResult(int i) const` Returns the [`TestPartResult`](#TestPartResult) for the `i`-th test part result among all the results. `i` can range from 0 to `total_part_count() - 1`. If `i` is not in that range, aborts the program. ##### GetTestProperty {#TestResult::GetTestProperty} `const TestProperty& TestResult::GetTestProperty(int i) const` Returns the [`TestProperty`](#TestProperty) object for the `i`-th test property. `i` can range from 0 to `test_property_count() - 1`. If `i` is not in that range, aborts the program. ### TimeInMillis {#TimeInMillis} `::testing::TimeInMillis` An integer type representing time in milliseconds. ### Types {#Types} `::testing::Types` Represents a list of types for use in typed tests and type-parameterized tests. The template argument `T...` can be any number of types, for example: ``` ::testing::Types ``` See [Typed Tests](../advanced.md#typed-tests) and [Type-Parameterized Tests](../advanced.md#type-parameterized-tests) for more information. ### WithParamInterface {#WithParamInterface} `::testing::WithParamInterface` The pure interface class that all value-parameterized tests inherit from. A value-parameterized test fixture class must inherit from both [`Test`](#Test) and `WithParamInterface`. In most cases that just means inheriting from [`TestWithParam`](#TestWithParam), but more complicated test hierarchies may need to inherit from `Test` and `WithParamInterface` at different levels. This interface defines the type alias `ParamType` for the parameter type `T` and has support for accessing the test parameter value via the `GetParam()` method: ``` static const ParamType& GetParam() ``` For more information, see [Value-Parameterized Tests](../advanced.md#value-parameterized-tests). ## Functions GoogleTest defines the following functions to help with writing and running tests. ### InitGoogleTest {#InitGoogleTest} `void ::testing::InitGoogleTest(int* argc, char** argv)` \ `void ::testing::InitGoogleTest(int* argc, wchar_t** argv)` \ `void ::testing::InitGoogleTest()` Initializes GoogleTest. This must be called before calling [`RUN_ALL_TESTS()`](#RUN_ALL_TESTS). In particular, it parses the command line for the flags that GoogleTest recognizes. Whenever a GoogleTest flag is seen, it is removed from `argv`, and `*argc` is decremented. No value is returned. Instead, the GoogleTest flag variables are updated. The `InitGoogleTest(int* argc, wchar_t** argv)` overload can be used in Windows programs compiled in `UNICODE` mode. The argument-less `InitGoogleTest()` overload can be used on Arduino/embedded platforms where there is no `argc`/`argv`. ### AddGlobalTestEnvironment {#AddGlobalTestEnvironment} `Environment* ::testing::AddGlobalTestEnvironment(Environment* env)` Adds a test environment to the test program. Must be called before [`RUN_ALL_TESTS()`](#RUN_ALL_TESTS) is called. See [Global Set-Up and Tear-Down](../advanced.md#global-set-up-and-tear-down) for more information. See also [`Environment`](#Environment). ### RegisterTest {#RegisterTest} ```cpp template TestInfo* ::testing::RegisterTest(const char* test_suite_name, const char* test_name, const char* type_param, const char* value_param, const char* file, int line, Factory factory) ``` Dynamically registers a test with the framework. The `factory` argument is a factory callable (move-constructible) object or function pointer that creates a new instance of the `Test` object. It handles ownership to the caller. The signature of the callable is `Fixture*()`, where `Fixture` is the test fixture class for the test. All tests registered with the same `test_suite_name` must return the same fixture type. This is checked at runtime. The framework will infer the fixture class from the factory and will call the `SetUpTestSuite` and `TearDownTestSuite` methods for it. Must be called before [`RUN_ALL_TESTS()`](#RUN_ALL_TESTS) is invoked, otherwise behavior is undefined. See [Registering tests programmatically](../advanced.md#registering-tests-programmatically) for more information. ### RUN_ALL_TESTS {#RUN_ALL_TESTS} `int RUN_ALL_TESTS()` Use this function in `main()` to run all tests. It returns `0` if all tests are successful, or `1` otherwise. `RUN_ALL_TESTS()` should be invoked after the command line has been parsed by [`InitGoogleTest()`](#InitGoogleTest). This function was formerly a macro; thus, it is in the global namespace and has an all-caps name. ### AssertionSuccess {#AssertionSuccess} `AssertionResult ::testing::AssertionSuccess()` Creates a successful assertion result. See [`AssertionResult`](#AssertionResult). ### AssertionFailure {#AssertionFailure} `AssertionResult ::testing::AssertionFailure()` Creates a failed assertion result. Use the `<<` operator to store a failure message: ```cpp ::testing::AssertionFailure() << "My failure message"; ``` See [`AssertionResult`](#AssertionResult). ### StaticAssertTypeEq {#StaticAssertTypeEq} `::testing::StaticAssertTypeEq()` Compile-time assertion for type equality. Compiles if and only if `T1` and `T2` are the same type. The value it returns is irrelevant. See [Type Assertions](../advanced.md#type-assertions) for more information. ### PrintToString {#PrintToString} `std::string ::testing::PrintToString(x)` Prints any value `x` using GoogleTest's value printer. See [Teaching GoogleTest How to Print Your Values](../advanced.md#teaching-googletest-how-to-print-your-values) for more information. ### PrintToStringParamName {#PrintToStringParamName} `std::string ::testing::PrintToStringParamName(TestParamInfo& info)` A built-in parameterized test name generator which returns the result of [`PrintToString`](#PrintToString) called on `info.param`. Does not work when the test parameter is a `std::string` or C string. See [Specifying Names for Value-Parameterized Test Parameters](../advanced.md#specifying-names-for-value-parameterized-test-parameters) for more information. See also [`TestParamInfo`](#TestParamInfo) and [`INSTANTIATE_TEST_SUITE_P`](#INSTANTIATE_TEST_SUITE_P). asymptote-3.05/LspCpp/third_party/uri/deps/docs/reference/mocking.md0000644000000000000000000005075615031566105024326 0ustar rootroot# Mocking Reference This page lists the facilities provided by GoogleTest for creating and working with mock objects. To use them, include the header `gmock/gmock.h`. ## Macros {#macros} GoogleTest defines the following macros for working with mocks. ### MOCK_METHOD {#MOCK_METHOD} `MOCK_METHOD(`*`return_type`*`,`*`method_name`*`, (`*`args...`*`));` \ `MOCK_METHOD(`*`return_type`*`,`*`method_name`*`, (`*`args...`*`), (`*`specs...`*`));` Defines a mock method *`method_name`* with arguments `(`*`args...`*`)` and return type *`return_type`* within a mock class. The parameters of `MOCK_METHOD` mirror the method declaration. The optional fourth parameter *`specs...`* is a comma-separated list of qualifiers. The following qualifiers are accepted: | Qualifier | Meaning | | -------------------------- | -------------------------------------------- | | `const` | Makes the mocked method a `const` method. Required if overriding a `const` method. | | `override` | Marks the method with `override`. Recommended if overriding a `virtual` method. | | `noexcept` | Marks the method with `noexcept`. Required if overriding a `noexcept` method. | | `Calltype(`*`calltype`*`)` | Sets the call type for the method, for example `Calltype(STDMETHODCALLTYPE)`. Useful on Windows. | | `ref(`*`qualifier`*`)` | Marks the method with the given reference qualifier, for example `ref(&)` or `ref(&&)`. Required if overriding a method that has a reference qualifier. | Note that commas in arguments prevent `MOCK_METHOD` from parsing the arguments correctly if they are not appropriately surrounded by parentheses. See the following example: ```cpp class MyMock { public: // The following 2 lines will not compile due to commas in the arguments: MOCK_METHOD(std::pair, GetPair, ()); // Error! MOCK_METHOD(bool, CheckMap, (std::map, bool)); // Error! // One solution - wrap arguments that contain commas in parentheses: MOCK_METHOD((std::pair), GetPair, ()); MOCK_METHOD(bool, CheckMap, ((std::map), bool)); // Another solution - use type aliases: using BoolAndInt = std::pair; MOCK_METHOD(BoolAndInt, GetPair, ()); using MapIntDouble = std::map; MOCK_METHOD(bool, CheckMap, (MapIntDouble, bool)); }; ``` `MOCK_METHOD` must be used in the `public:` section of a mock class definition, regardless of whether the method being mocked is `public`, `protected`, or `private` in the base class. ### EXPECT_CALL {#EXPECT_CALL} `EXPECT_CALL(`*`mock_object`*`,`*`method_name`*`(`*`matchers...`*`))` Creates an [expectation](../gmock_for_dummies.md#setting-expectations) that the method *`method_name`* of the object *`mock_object`* is called with arguments that match the given matchers *`matchers...`*. `EXPECT_CALL` must precede any code that exercises the mock object. The parameter *`matchers...`* is a comma-separated list of [matchers](../gmock_for_dummies.md#matchers-what-arguments-do-we-expect) that correspond to each argument of the method *`method_name`*. The expectation will apply only to calls of *`method_name`* whose arguments match all of the matchers. If `(`*`matchers...`*`)` is omitted, the expectation behaves as if each argument's matcher were a [wildcard matcher (`_`)](matchers.md#wildcard). See the [Matchers Reference](matchers.md) for a list of all built-in matchers. The following chainable clauses can be used to modify the expectation, and they must be used in the following order: ```cpp EXPECT_CALL(mock_object, method_name(matchers...)) .With(multi_argument_matcher) // Can be used at most once .Times(cardinality) // Can be used at most once .InSequence(sequences...) // Can be used any number of times .After(expectations...) // Can be used any number of times .WillOnce(action) // Can be used any number of times .WillRepeatedly(action) // Can be used at most once .RetiresOnSaturation(); // Can be used at most once ``` See details for each modifier clause below. #### With {#EXPECT_CALL.With} `.With(`*`multi_argument_matcher`*`)` Restricts the expectation to apply only to mock function calls whose arguments as a whole match the multi-argument matcher *`multi_argument_matcher`*. GoogleTest passes all of the arguments as one tuple into the matcher. The parameter *`multi_argument_matcher`* must thus be a matcher of type `Matcher>`, where `A1, ..., An` are the types of the function arguments. For example, the following code sets the expectation that `my_mock.SetPosition()` is called with any two arguments, the first argument being less than the second: ```cpp using ::testing::_; using ::testing::Lt; ... EXPECT_CALL(my_mock, SetPosition(_, _)) .With(Lt()); ``` GoogleTest provides some built-in matchers for 2-tuples, including the `Lt()` matcher above. See [Multi-argument Matchers](matchers.md#MultiArgMatchers). The `With` clause can be used at most once on an expectation and must be the first clause. #### Times {#EXPECT_CALL.Times} `.Times(`*`cardinality`*`)` Specifies how many times the mock function call is expected. The parameter *`cardinality`* represents the number of expected calls and can be one of the following, all defined in the `::testing` namespace: | Cardinality | Meaning | | ------------------- | --------------------------------------------------- | | `AnyNumber()` | The function can be called any number of times. | | `AtLeast(n)` | The function call is expected at least *n* times. | | `AtMost(n)` | The function call is expected at most *n* times. | | `Between(m, n)` | The function call is expected between *m* and *n* times, inclusive. | | `Exactly(n)` or `n` | The function call is expected exactly *n* times. If *n* is 0, the call should never happen. | If the `Times` clause is omitted, GoogleTest infers the cardinality as follows: * If neither [`WillOnce`](#EXPECT_CALL.WillOnce) nor [`WillRepeatedly`](#EXPECT_CALL.WillRepeatedly) are specified, the inferred cardinality is `Times(1)`. * If there are *n* `WillOnce` clauses and no `WillRepeatedly` clause, where *n* >= 1, the inferred cardinality is `Times(n)`. * If there are *n* `WillOnce` clauses and one `WillRepeatedly` clause, where *n* >= 0, the inferred cardinality is `Times(AtLeast(n))`. The `Times` clause can be used at most once on an expectation. #### InSequence {#EXPECT_CALL.InSequence} `.InSequence(`*`sequences...`*`)` Specifies that the mock function call is expected in a certain sequence. The parameter *`sequences...`* is any number of [`Sequence`](#Sequence) objects. Expected calls assigned to the same sequence are expected to occur in the order the expectations are declared. For example, the following code sets the expectation that the `Reset()` method of `my_mock` is called before both `GetSize()` and `Describe()`, and `GetSize()` and `Describe()` can occur in any order relative to each other: ```cpp using ::testing::Sequence; Sequence s1, s2; ... EXPECT_CALL(my_mock, Reset()) .InSequence(s1, s2); EXPECT_CALL(my_mock, GetSize()) .InSequence(s1); EXPECT_CALL(my_mock, Describe()) .InSequence(s2); ``` The `InSequence` clause can be used any number of times on an expectation. See also the [`InSequence` class](#InSequence). #### After {#EXPECT_CALL.After} `.After(`*`expectations...`*`)` Specifies that the mock function call is expected to occur after one or more other calls. The parameter *`expectations...`* can be up to five [`Expectation`](#Expectation) or [`ExpectationSet`](#ExpectationSet) objects. The mock function call is expected to occur after all of the given expectations. For example, the following code sets the expectation that the `Describe()` method of `my_mock` is called only after both `InitX()` and `InitY()` have been called. ```cpp using ::testing::Expectation; ... Expectation init_x = EXPECT_CALL(my_mock, InitX()); Expectation init_y = EXPECT_CALL(my_mock, InitY()); EXPECT_CALL(my_mock, Describe()) .After(init_x, init_y); ``` The `ExpectationSet` object is helpful when the number of prerequisites for an expectation is large or variable, for example: ```cpp using ::testing::ExpectationSet; ... ExpectationSet all_inits; // Collect all expectations of InitElement() calls for (int i = 0; i < element_count; i++) { all_inits += EXPECT_CALL(my_mock, InitElement(i)); } EXPECT_CALL(my_mock, Describe()) .After(all_inits); // Expect Describe() call after all InitElement() calls ``` The `After` clause can be used any number of times on an expectation. #### WillOnce {#EXPECT_CALL.WillOnce} `.WillOnce(`*`action`*`)` Specifies the mock function's actual behavior when invoked, for a single matching function call. The parameter *`action`* represents the [action](../gmock_for_dummies.md#actions-what-should-it-do) that the function call will perform. See the [Actions Reference](actions.md) for a list of built-in actions. The use of `WillOnce` implicitly sets a cardinality on the expectation when `Times` is not specified. See [`Times`](#EXPECT_CALL.Times). Each matching function call will perform the next action in the order declared. For example, the following code specifies that `my_mock.GetNumber()` is expected to be called exactly 3 times and will return `1`, `2`, and `3` respectively on the first, second, and third calls: ```cpp using ::testing::Return; ... EXPECT_CALL(my_mock, GetNumber()) .WillOnce(Return(1)) .WillOnce(Return(2)) .WillOnce(Return(3)); ``` The `WillOnce` clause can be used any number of times on an expectation. #### WillRepeatedly {#EXPECT_CALL.WillRepeatedly} `.WillRepeatedly(`*`action`*`)` Specifies the mock function's actual behavior when invoked, for all subsequent matching function calls. Takes effect after the actions specified in the [`WillOnce`](#EXPECT_CALL.WillOnce) clauses, if any, have been performed. The parameter *`action`* represents the [action](../gmock_for_dummies.md#actions-what-should-it-do) that the function call will perform. See the [Actions Reference](actions.md) for a list of built-in actions. The use of `WillRepeatedly` implicitly sets a cardinality on the expectation when `Times` is not specified. See [`Times`](#EXPECT_CALL.Times). If any `WillOnce` clauses have been specified, matching function calls will perform those actions before the action specified by `WillRepeatedly`. See the following example: ```cpp using ::testing::Return; ... EXPECT_CALL(my_mock, GetName()) .WillRepeatedly(Return("John Doe")); // Return "John Doe" on all calls EXPECT_CALL(my_mock, GetNumber()) .WillOnce(Return(42)) // Return 42 on the first call .WillRepeatedly(Return(7)); // Return 7 on all subsequent calls ``` The `WillRepeatedly` clause can be used at most once on an expectation. #### RetiresOnSaturation {#EXPECT_CALL.RetiresOnSaturation} `.RetiresOnSaturation()` Indicates that the expectation will no longer be active after the expected number of matching function calls has been reached. The `RetiresOnSaturation` clause is only meaningful for expectations with an upper-bounded cardinality. The expectation will *retire* (no longer match any function calls) after it has been *saturated* (the upper bound has been reached). See the following example: ```cpp using ::testing::_; using ::testing::AnyNumber; ... EXPECT_CALL(my_mock, SetNumber(_)) // Expectation 1 .Times(AnyNumber()); EXPECT_CALL(my_mock, SetNumber(7)) // Expectation 2 .Times(2) .RetiresOnSaturation(); ``` In the above example, the first two calls to `my_mock.SetNumber(7)` match expectation 2, which then becomes inactive and no longer matches any calls. A third call to `my_mock.SetNumber(7)` would then match expectation 1. Without `RetiresOnSaturation()` on expectation 2, a third call to `my_mock.SetNumber(7)` would match expectation 2 again, producing a failure since the limit of 2 calls was exceeded. The `RetiresOnSaturation` clause can be used at most once on an expectation and must be the last clause. ### ON_CALL {#ON_CALL} `ON_CALL(`*`mock_object`*`,`*`method_name`*`(`*`matchers...`*`))` Defines what happens when the method *`method_name`* of the object *`mock_object`* is called with arguments that match the given matchers *`matchers...`*. Requires a modifier clause to specify the method's behavior. *Does not* set any expectations that the method will be called. The parameter *`matchers...`* is a comma-separated list of [matchers](../gmock_for_dummies.md#matchers-what-arguments-do-we-expect) that correspond to each argument of the method *`method_name`*. The `ON_CALL` specification will apply only to calls of *`method_name`* whose arguments match all of the matchers. If `(`*`matchers...`*`)` is omitted, the behavior is as if each argument's matcher were a [wildcard matcher (`_`)](matchers.md#wildcard). See the [Matchers Reference](matchers.md) for a list of all built-in matchers. The following chainable clauses can be used to set the method's behavior, and they must be used in the following order: ```cpp ON_CALL(mock_object, method_name(matchers...)) .With(multi_argument_matcher) // Can be used at most once .WillByDefault(action); // Required ``` See details for each modifier clause below. #### With {#ON_CALL.With} `.With(`*`multi_argument_matcher`*`)` Restricts the specification to only mock function calls whose arguments as a whole match the multi-argument matcher *`multi_argument_matcher`*. GoogleTest passes all of the arguments as one tuple into the matcher. The parameter *`multi_argument_matcher`* must thus be a matcher of type `Matcher>`, where `A1, ..., An` are the types of the function arguments. For example, the following code sets the default behavior when `my_mock.SetPosition()` is called with any two arguments, the first argument being less than the second: ```cpp using ::testing::_; using ::testing::Lt; using ::testing::Return; ... ON_CALL(my_mock, SetPosition(_, _)) .With(Lt()) .WillByDefault(Return(true)); ``` GoogleTest provides some built-in matchers for 2-tuples, including the `Lt()` matcher above. See [Multi-argument Matchers](matchers.md#MultiArgMatchers). The `With` clause can be used at most once with each `ON_CALL` statement. #### WillByDefault {#ON_CALL.WillByDefault} `.WillByDefault(`*`action`*`)` Specifies the default behavior of a matching mock function call. The parameter *`action`* represents the [action](../gmock_for_dummies.md#actions-what-should-it-do) that the function call will perform. See the [Actions Reference](actions.md) for a list of built-in actions. For example, the following code specifies that by default, a call to `my_mock.Greet()` will return `"hello"`: ```cpp using ::testing::Return; ... ON_CALL(my_mock, Greet()) .WillByDefault(Return("hello")); ``` The action specified by `WillByDefault` is superseded by the actions specified on a matching `EXPECT_CALL` statement, if any. See the [`WillOnce`](#EXPECT_CALL.WillOnce) and [`WillRepeatedly`](#EXPECT_CALL.WillRepeatedly) clauses of `EXPECT_CALL`. The `WillByDefault` clause must be used exactly once with each `ON_CALL` statement. ## Classes {#classes} GoogleTest defines the following classes for working with mocks. ### DefaultValue {#DefaultValue} `::testing::DefaultValue` Allows a user to specify the default value for a type `T` that is both copyable and publicly destructible (i.e. anything that can be used as a function return type). For mock functions with a return type of `T`, this default value is returned from function calls that do not specify an action. Provides the static methods `Set()`, `SetFactory()`, and `Clear()` to manage the default value: ```cpp // Sets the default value to be returned. T must be copy constructible. DefaultValue::Set(value); // Sets a factory. Will be invoked on demand. T must be move constructible. T MakeT(); DefaultValue::SetFactory(&MakeT); // Unsets the default value. DefaultValue::Clear(); ``` ### NiceMock {#NiceMock} `::testing::NiceMock` Represents a mock object that suppresses warnings on [uninteresting calls](../gmock_cook_book.md#uninteresting-vs-unexpected). The template parameter `T` is any mock class, except for another `NiceMock`, `NaggyMock`, or `StrictMock`. Usage of `NiceMock` is analogous to usage of `T`. `NiceMock` is a subclass of `T`, so it can be used wherever an object of type `T` is accepted. In addition, `NiceMock` can be constructed with any arguments that a constructor of `T` accepts. For example, the following code suppresses warnings on the mock `my_mock` of type `MockClass` if a method other than `DoSomething()` is called: ```cpp using ::testing::NiceMock; ... NiceMock my_mock("some", "args"); EXPECT_CALL(my_mock, DoSomething()); ... code that uses my_mock ... ``` `NiceMock` only works for mock methods defined using the `MOCK_METHOD` macro directly in the definition of class `T`. If a mock method is defined in a base class of `T`, a warning might still be generated. `NiceMock` might not work correctly if the destructor of `T` is not virtual. ### NaggyMock {#NaggyMock} `::testing::NaggyMock` Represents a mock object that generates warnings on [uninteresting calls](../gmock_cook_book.md#uninteresting-vs-unexpected). The template parameter `T` is any mock class, except for another `NiceMock`, `NaggyMock`, or `StrictMock`. Usage of `NaggyMock` is analogous to usage of `T`. `NaggyMock` is a subclass of `T`, so it can be used wherever an object of type `T` is accepted. In addition, `NaggyMock` can be constructed with any arguments that a constructor of `T` accepts. For example, the following code generates warnings on the mock `my_mock` of type `MockClass` if a method other than `DoSomething()` is called: ```cpp using ::testing::NaggyMock; ... NaggyMock my_mock("some", "args"); EXPECT_CALL(my_mock, DoSomething()); ... code that uses my_mock ... ``` Mock objects of type `T` by default behave the same way as `NaggyMock`. ### StrictMock {#StrictMock} `::testing::StrictMock` Represents a mock object that generates test failures on [uninteresting calls](../gmock_cook_book.md#uninteresting-vs-unexpected). The template parameter `T` is any mock class, except for another `NiceMock`, `NaggyMock`, or `StrictMock`. Usage of `StrictMock` is analogous to usage of `T`. `StrictMock` is a subclass of `T`, so it can be used wherever an object of type `T` is accepted. In addition, `StrictMock` can be constructed with any arguments that a constructor of `T` accepts. For example, the following code generates a test failure on the mock `my_mock` of type `MockClass` if a method other than `DoSomething()` is called: ```cpp using ::testing::StrictMock; ... StrictMock my_mock("some", "args"); EXPECT_CALL(my_mock, DoSomething()); ... code that uses my_mock ... ``` `StrictMock` only works for mock methods defined using the `MOCK_METHOD` macro directly in the definition of class `T`. If a mock method is defined in a base class of `T`, a failure might not be generated. `StrictMock` might not work correctly if the destructor of `T` is not virtual. ### Sequence {#Sequence} `::testing::Sequence` Represents a chronological sequence of expectations. See the [`InSequence`](#EXPECT_CALL.InSequence) clause of `EXPECT_CALL` for usage. ### InSequence {#InSequence} `::testing::InSequence` An object of this type causes all expectations encountered in its scope to be put in an anonymous sequence. This allows more convenient expression of multiple expectations in a single sequence: ```cpp using ::testing::InSequence; { InSequence seq; // The following are expected to occur in the order declared. EXPECT_CALL(...); EXPECT_CALL(...); ... EXPECT_CALL(...); } ``` The name of the `InSequence` object does not matter. ### Expectation {#Expectation} `::testing::Expectation` Represents a mock function call expectation as created by [`EXPECT_CALL`](#EXPECT_CALL): ```cpp using ::testing::Expectation; Expectation my_expectation = EXPECT_CALL(...); ``` Useful for specifying sequences of expectations; see the [`After`](#EXPECT_CALL.After) clause of `EXPECT_CALL`. ### ExpectationSet {#ExpectationSet} `::testing::ExpectationSet` Represents a set of mock function call expectations. Use the `+=` operator to add [`Expectation`](#Expectation) objects to the set: ```cpp using ::testing::ExpectationSet; ExpectationSet my_expectations; my_expectations += EXPECT_CALL(...); ``` Useful for specifying sequences of expectations; see the [`After`](#EXPECT_CALL.After) clause of `EXPECT_CALL`. asymptote-3.05/LspCpp/third_party/uri/deps/docs/reference/assertions.md0000644000000000000000000005203715031566105025063 0ustar rootroot# Assertions Reference This page lists the assertion macros provided by GoogleTest for verifying code behavior. To use them, include the header `gtest/gtest.h`. The majority of the macros listed below come as a pair with an `EXPECT_` variant and an `ASSERT_` variant. Upon failure, `EXPECT_` macros generate nonfatal failures and allow the current function to continue running, while `ASSERT_` macros generate fatal failures and abort the current function. All assertion macros support streaming a custom failure message into them with the `<<` operator, for example: ```cpp EXPECT_TRUE(my_condition) << "My condition is not true"; ``` Anything that can be streamed to an `ostream` can be streamed to an assertion macro—in particular, C strings and string objects. If a wide string (`wchar_t*`, `TCHAR*` in `UNICODE` mode on Windows, or `std::wstring`) is streamed to an assertion, it will be translated to UTF-8 when printed. ## Explicit Success and Failure {#success-failure} The assertions in this section generate a success or failure directly instead of testing a value or expression. These are useful when control flow, rather than a Boolean expression, determines the test's success or failure, as shown by the following example: ```c++ switch(expression) { case 1: ... some checks ... case 2: ... some other checks ... default: FAIL() << "We shouldn't get here."; } ``` ### SUCCEED {#SUCCEED} `SUCCEED()` Generates a success. This *does not* make the overall test succeed. A test is considered successful only if none of its assertions fail during its execution. The `SUCCEED` assertion is purely documentary and currently doesn't generate any user-visible output. However, we may add `SUCCEED` messages to GoogleTest output in the future. ### FAIL {#FAIL} `FAIL()` Generates a fatal failure, which returns from the current function. Can only be used in functions that return `void`. See [Assertion Placement](../advanced.md#assertion-placement) for more information. ### ADD_FAILURE {#ADD_FAILURE} `ADD_FAILURE()` Generates a nonfatal failure, which allows the current function to continue running. ### ADD_FAILURE_AT {#ADD_FAILURE_AT} `ADD_FAILURE_AT(`*`file_path`*`,`*`line_number`*`)` Generates a nonfatal failure at the file and line number specified. ## Generalized Assertion {#generalized} The following assertion allows [matchers](matchers.md) to be used to verify values. ### EXPECT_THAT {#EXPECT_THAT} `EXPECT_THAT(`*`value`*`,`*`matcher`*`)` \ `ASSERT_THAT(`*`value`*`,`*`matcher`*`)` Verifies that *`value`* matches the [matcher](matchers.md) *`matcher`*. For example, the following code verifies that the string `value1` starts with `"Hello"`, `value2` matches a regular expression, and `value3` is between 5 and 10: ```cpp #include "gmock/gmock.h" using ::testing::AllOf; using ::testing::Gt; using ::testing::Lt; using ::testing::MatchesRegex; using ::testing::StartsWith; ... EXPECT_THAT(value1, StartsWith("Hello")); EXPECT_THAT(value2, MatchesRegex("Line \\d+")); ASSERT_THAT(value3, AllOf(Gt(5), Lt(10))); ``` Matchers enable assertions of this form to read like English and generate informative failure messages. For example, if the above assertion on `value1` fails, the resulting message will be similar to the following: ``` Value of: value1 Actual: "Hi, world!" Expected: starts with "Hello" ``` GoogleTest provides a built-in library of matchers—see the [Matchers Reference](matchers.md). It is also possible to write your own matchers—see [Writing New Matchers Quickly](../gmock_cook_book.md#NewMatchers). The use of matchers makes `EXPECT_THAT` a powerful, extensible assertion. *The idea for this assertion was borrowed from Joe Walnes' Hamcrest project, which adds `assertThat()` to JUnit.* ## Boolean Conditions {#boolean} The following assertions test Boolean conditions. ### EXPECT_TRUE {#EXPECT_TRUE} `EXPECT_TRUE(`*`condition`*`)` \ `ASSERT_TRUE(`*`condition`*`)` Verifies that *`condition`* is true. ### EXPECT_FALSE {#EXPECT_FALSE} `EXPECT_FALSE(`*`condition`*`)` \ `ASSERT_FALSE(`*`condition`*`)` Verifies that *`condition`* is false. ## Binary Comparison {#binary-comparison} The following assertions compare two values. The value arguments must be comparable by the assertion's comparison operator, otherwise a compiler error will result. If an argument supports the `<<` operator, it will be called to print the argument when the assertion fails. Otherwise, GoogleTest will attempt to print them in the best way it can—see [Teaching GoogleTest How to Print Your Values](../advanced.md#teaching-googletest-how-to-print-your-values). Arguments are always evaluated exactly once, so it's OK for the arguments to have side effects. However, the argument evaluation order is undefined and programs should not depend on any particular argument evaluation order. These assertions work with both narrow and wide string objects (`string` and `wstring`). See also the [Floating-Point Comparison](#floating-point) assertions to compare floating-point numbers and avoid problems caused by rounding. ### EXPECT_EQ {#EXPECT_EQ} `EXPECT_EQ(`*`val1`*`,`*`val2`*`)` \ `ASSERT_EQ(`*`val1`*`,`*`val2`*`)` Verifies that *`val1`*`==`*`val2`*. Does pointer equality on pointers. If used on two C strings, it tests if they are in the same memory location, not if they have the same value. Use [`EXPECT_STREQ`](#EXPECT_STREQ) to compare C strings (e.g. `const char*`) by value. When comparing a pointer to `NULL`, use `EXPECT_EQ(`*`ptr`*`, nullptr)` instead of `EXPECT_EQ(`*`ptr`*`, NULL)`. ### EXPECT_NE {#EXPECT_NE} `EXPECT_NE(`*`val1`*`,`*`val2`*`)` \ `ASSERT_NE(`*`val1`*`,`*`val2`*`)` Verifies that *`val1`*`!=`*`val2`*. Does pointer equality on pointers. If used on two C strings, it tests if they are in different memory locations, not if they have different values. Use [`EXPECT_STRNE`](#EXPECT_STRNE) to compare C strings (e.g. `const char*`) by value. When comparing a pointer to `NULL`, use `EXPECT_NE(`*`ptr`*`, nullptr)` instead of `EXPECT_NE(`*`ptr`*`, NULL)`. ### EXPECT_LT {#EXPECT_LT} `EXPECT_LT(`*`val1`*`,`*`val2`*`)` \ `ASSERT_LT(`*`val1`*`,`*`val2`*`)` Verifies that *`val1`*`<`*`val2`*. ### EXPECT_LE {#EXPECT_LE} `EXPECT_LE(`*`val1`*`,`*`val2`*`)` \ `ASSERT_LE(`*`val1`*`,`*`val2`*`)` Verifies that *`val1`*`<=`*`val2`*. ### EXPECT_GT {#EXPECT_GT} `EXPECT_GT(`*`val1`*`,`*`val2`*`)` \ `ASSERT_GT(`*`val1`*`,`*`val2`*`)` Verifies that *`val1`*`>`*`val2`*. ### EXPECT_GE {#EXPECT_GE} `EXPECT_GE(`*`val1`*`,`*`val2`*`)` \ `ASSERT_GE(`*`val1`*`,`*`val2`*`)` Verifies that *`val1`*`>=`*`val2`*. ## String Comparison {#c-strings} The following assertions compare two **C strings**. To compare two `string` objects, use [`EXPECT_EQ`](#EXPECT_EQ) or [`EXPECT_NE`](#EXPECT_NE) instead. These assertions also accept wide C strings (`wchar_t*`). If a comparison of two wide strings fails, their values will be printed as UTF-8 narrow strings. To compare a C string with `NULL`, use `EXPECT_EQ(`*`c_string`*`, nullptr)` or `EXPECT_NE(`*`c_string`*`, nullptr)`. ### EXPECT_STREQ {#EXPECT_STREQ} `EXPECT_STREQ(`*`str1`*`,`*`str2`*`)` \ `ASSERT_STREQ(`*`str1`*`,`*`str2`*`)` Verifies that the two C strings *`str1`* and *`str2`* have the same contents. ### EXPECT_STRNE {#EXPECT_STRNE} `EXPECT_STRNE(`*`str1`*`,`*`str2`*`)` \ `ASSERT_STRNE(`*`str1`*`,`*`str2`*`)` Verifies that the two C strings *`str1`* and *`str2`* have different contents. ### EXPECT_STRCASEEQ {#EXPECT_STRCASEEQ} `EXPECT_STRCASEEQ(`*`str1`*`,`*`str2`*`)` \ `ASSERT_STRCASEEQ(`*`str1`*`,`*`str2`*`)` Verifies that the two C strings *`str1`* and *`str2`* have the same contents, ignoring case. ### EXPECT_STRCASENE {#EXPECT_STRCASENE} `EXPECT_STRCASENE(`*`str1`*`,`*`str2`*`)` \ `ASSERT_STRCASENE(`*`str1`*`,`*`str2`*`)` Verifies that the two C strings *`str1`* and *`str2`* have different contents, ignoring case. ## Floating-Point Comparison {#floating-point} The following assertions compare two floating-point values. Due to rounding errors, it is very unlikely that two floating-point values will match exactly, so `EXPECT_EQ` is not suitable. In general, for floating-point comparison to make sense, the user needs to carefully choose the error bound. GoogleTest also provides assertions that use a default error bound based on Units in the Last Place (ULPs). To learn more about ULPs, see the article [Comparing Floating Point Numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). ### EXPECT_FLOAT_EQ {#EXPECT_FLOAT_EQ} `EXPECT_FLOAT_EQ(`*`val1`*`,`*`val2`*`)` \ `ASSERT_FLOAT_EQ(`*`val1`*`,`*`val2`*`)` Verifies that the two `float` values *`val1`* and *`val2`* are approximately equal, to within 4 ULPs from each other. ### EXPECT_DOUBLE_EQ {#EXPECT_DOUBLE_EQ} `EXPECT_DOUBLE_EQ(`*`val1`*`,`*`val2`*`)` \ `ASSERT_DOUBLE_EQ(`*`val1`*`,`*`val2`*`)` Verifies that the two `double` values *`val1`* and *`val2`* are approximately equal, to within 4 ULPs from each other. ### EXPECT_NEAR {#EXPECT_NEAR} `EXPECT_NEAR(`*`val1`*`,`*`val2`*`,`*`abs_error`*`)` \ `ASSERT_NEAR(`*`val1`*`,`*`val2`*`,`*`abs_error`*`)` Verifies that the difference between *`val1`* and *`val2`* does not exceed the absolute error bound *`abs_error`*. ## Exception Assertions {#exceptions} The following assertions verify that a piece of code throws, or does not throw, an exception. Usage requires exceptions to be enabled in the build environment. Note that the piece of code under test can be a compound statement, for example: ```cpp EXPECT_NO_THROW({ int n = 5; DoSomething(&n); }); ``` ### EXPECT_THROW {#EXPECT_THROW} `EXPECT_THROW(`*`statement`*`,`*`exception_type`*`)` \ `ASSERT_THROW(`*`statement`*`,`*`exception_type`*`)` Verifies that *`statement`* throws an exception of type *`exception_type`*. ### EXPECT_ANY_THROW {#EXPECT_ANY_THROW} `EXPECT_ANY_THROW(`*`statement`*`)` \ `ASSERT_ANY_THROW(`*`statement`*`)` Verifies that *`statement`* throws an exception of any type. ### EXPECT_NO_THROW {#EXPECT_NO_THROW} `EXPECT_NO_THROW(`*`statement`*`)` \ `ASSERT_NO_THROW(`*`statement`*`)` Verifies that *`statement`* does not throw any exception. ## Predicate Assertions {#predicates} The following assertions enable more complex predicates to be verified while printing a more clear failure message than if `EXPECT_TRUE` were used alone. ### EXPECT_PRED* {#EXPECT_PRED} `EXPECT_PRED1(`*`pred`*`,`*`val1`*`)` \ `EXPECT_PRED2(`*`pred`*`,`*`val1`*`,`*`val2`*`)` \ `EXPECT_PRED3(`*`pred`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`)` \ `EXPECT_PRED4(`*`pred`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`)` \ `EXPECT_PRED5(`*`pred`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`,`*`val5`*`)` `ASSERT_PRED1(`*`pred`*`,`*`val1`*`)` \ `ASSERT_PRED2(`*`pred`*`,`*`val1`*`,`*`val2`*`)` \ `ASSERT_PRED3(`*`pred`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`)` \ `ASSERT_PRED4(`*`pred`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`)` \ `ASSERT_PRED5(`*`pred`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`,`*`val5`*`)` Verifies that the predicate *`pred`* returns `true` when passed the given values as arguments. The parameter *`pred`* is a function or functor that accepts as many arguments as the corresponding macro accepts values. If *`pred`* returns `true` for the given arguments, the assertion succeeds, otherwise the assertion fails. When the assertion fails, it prints the value of each argument. Arguments are always evaluated exactly once. As an example, see the following code: ```cpp // Returns true if m and n have no common divisors except 1. bool MutuallyPrime(int m, int n) { ... } ... const int a = 3; const int b = 4; const int c = 10; ... EXPECT_PRED2(MutuallyPrime, a, b); // Succeeds EXPECT_PRED2(MutuallyPrime, b, c); // Fails ``` In the above example, the first assertion succeeds, and the second fails with the following message: ``` MutuallyPrime(b, c) is false, where b is 4 c is 10 ``` Note that if the given predicate is an overloaded function or a function template, the assertion macro might not be able to determine which version to use, and it might be necessary to explicitly specify the type of the function. For example, for a Boolean function `IsPositive()` overloaded to take either a single `int` or `double` argument, it would be necessary to write one of the following: ```cpp EXPECT_PRED1(static_cast(IsPositive), 5); EXPECT_PRED1(static_cast(IsPositive), 3.14); ``` Writing simply `EXPECT_PRED1(IsPositive, 5);` would result in a compiler error. Similarly, to use a template function, specify the template arguments: ```cpp template bool IsNegative(T x) { return x < 0; } ... EXPECT_PRED1(IsNegative, -5); // Must specify type for IsNegative ``` If a template has multiple parameters, wrap the predicate in parentheses so the macro arguments are parsed correctly: ```cpp ASSERT_PRED2((MyPredicate), 5, 0); ``` ### EXPECT_PRED_FORMAT* {#EXPECT_PRED_FORMAT} `EXPECT_PRED_FORMAT1(`*`pred_formatter`*`,`*`val1`*`)` \ `EXPECT_PRED_FORMAT2(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`)` \ `EXPECT_PRED_FORMAT3(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`)` \ `EXPECT_PRED_FORMAT4(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`)` \ `EXPECT_PRED_FORMAT5(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`,`*`val5`*`)` `ASSERT_PRED_FORMAT1(`*`pred_formatter`*`,`*`val1`*`)` \ `ASSERT_PRED_FORMAT2(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`)` \ `ASSERT_PRED_FORMAT3(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`)` \ `ASSERT_PRED_FORMAT4(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`)` \ `ASSERT_PRED_FORMAT5(`*`pred_formatter`*`,`*`val1`*`,`*`val2`*`,`*`val3`*`,`*`val4`*`,`*`val5`*`)` Verifies that the predicate *`pred_formatter`* succeeds when passed the given values as arguments. The parameter *`pred_formatter`* is a *predicate-formatter*, which is a function or functor with the signature: ```cpp testing::AssertionResult PredicateFormatter(const char* expr1, const char* expr2, ... const char* exprn, T1 val1, T2 val2, ... Tn valn); ``` where *`val1`*, *`val2`*, ..., *`valn`* are the values of the predicate arguments, and *`expr1`*, *`expr2`*, ..., *`exprn`* are the corresponding expressions as they appear in the source code. The types `T1`, `T2`, ..., `Tn` can be either value types or reference types; if an argument has type `T`, it can be declared as either `T` or `const T&`, whichever is appropriate. For more about the return type `testing::AssertionResult`, see [Using a Function That Returns an AssertionResult](../advanced.md#using-a-function-that-returns-an-assertionresult). As an example, see the following code: ```cpp // Returns the smallest prime common divisor of m and n, // or 1 when m and n are mutually prime. int SmallestPrimeCommonDivisor(int m, int n) { ... } // Returns true if m and n have no common divisors except 1. bool MutuallyPrime(int m, int n) { ... } // A predicate-formatter for asserting that two integers are mutually prime. testing::AssertionResult AssertMutuallyPrime(const char* m_expr, const char* n_expr, int m, int n) { if (MutuallyPrime(m, n)) return testing::AssertionSuccess(); return testing::AssertionFailure() << m_expr << " and " << n_expr << " (" << m << " and " << n << ") are not mutually prime, " << "as they have a common divisor " << SmallestPrimeCommonDivisor(m, n); } ... const int a = 3; const int b = 4; const int c = 10; ... EXPECT_PRED_FORMAT2(AssertMutuallyPrime, a, b); // Succeeds EXPECT_PRED_FORMAT2(AssertMutuallyPrime, b, c); // Fails ``` In the above example, the final assertion fails and the predicate-formatter produces the following failure message: ``` b and c (4 and 10) are not mutually prime, as they have a common divisor 2 ``` ## Windows HRESULT Assertions {#HRESULT} The following assertions test for `HRESULT` success or failure. For example: ```cpp CComPtr shell; ASSERT_HRESULT_SUCCEEDED(shell.CoCreateInstance(L"Shell.Application")); CComVariant empty; ASSERT_HRESULT_SUCCEEDED(shell->ShellExecute(CComBSTR(url), empty, empty, empty, empty)); ``` The generated output contains the human-readable error message associated with the returned `HRESULT` code. ### EXPECT_HRESULT_SUCCEEDED {#EXPECT_HRESULT_SUCCEEDED} `EXPECT_HRESULT_SUCCEEDED(`*`expression`*`)` \ `ASSERT_HRESULT_SUCCEEDED(`*`expression`*`)` Verifies that *`expression`* is a success `HRESULT`. ### EXPECT_HRESULT_FAILED {#EXPECT_HRESULT_FAILED} `EXPECT_HRESULT_FAILED(`*`expression`*`)` \ `EXPECT_HRESULT_FAILED(`*`expression`*`)` Verifies that *`expression`* is a failure `HRESULT`. ## Death Assertions {#death} The following assertions verify that a piece of code causes the process to terminate. For context, see [Death Tests](../advanced.md#death-tests). These assertions spawn a new process and execute the code under test in that process. How that happens depends on the platform and the variable `::testing::GTEST_FLAG(death_test_style)`, which is initialized from the command-line flag `--gtest_death_test_style`. * On POSIX systems, `fork()` (or `clone()` on Linux) is used to spawn the child, after which: * If the variable's value is `"fast"`, the death test statement is immediately executed. * If the variable's value is `"threadsafe"`, the child process re-executes the unit test binary just as it was originally invoked, but with some extra flags to cause just the single death test under consideration to be run. * On Windows, the child is spawned using the `CreateProcess()` API, and re-executes the binary to cause just the single death test under consideration to be run - much like the `"threadsafe"` mode on POSIX. Other values for the variable are illegal and will cause the death test to fail. Currently, the flag's default value is **`"fast"`**. If the death test statement runs to completion without dying, the child process will nonetheless terminate, and the assertion fails. Note that the piece of code under test can be a compound statement, for example: ```cpp EXPECT_DEATH({ int n = 5; DoSomething(&n); }, "Error on line .* of DoSomething()"); ``` ### EXPECT_DEATH {#EXPECT_DEATH} `EXPECT_DEATH(`*`statement`*`,`*`matcher`*`)` \ `ASSERT_DEATH(`*`statement`*`,`*`matcher`*`)` Verifies that *`statement`* causes the process to terminate with a nonzero exit status and produces `stderr` output that matches *`matcher`*. The parameter *`matcher`* is either a [matcher](matchers.md) for a `const std::string&`, or a regular expression (see [Regular Expression Syntax](../advanced.md#regular-expression-syntax))—a bare string *`s`* (with no matcher) is treated as [`ContainsRegex(s)`](matchers.md#string-matchers), **not** [`Eq(s)`](matchers.md#generic-comparison). For example, the following code verifies that calling `DoSomething(42)` causes the process to die with an error message that contains the text `My error`: ```cpp EXPECT_DEATH(DoSomething(42), "My error"); ``` ### EXPECT_DEATH_IF_SUPPORTED {#EXPECT_DEATH_IF_SUPPORTED} `EXPECT_DEATH_IF_SUPPORTED(`*`statement`*`,`*`matcher`*`)` \ `ASSERT_DEATH_IF_SUPPORTED(`*`statement`*`,`*`matcher`*`)` If death tests are supported, behaves the same as [`EXPECT_DEATH`](#EXPECT_DEATH). Otherwise, verifies nothing. ### EXPECT_DEBUG_DEATH {#EXPECT_DEBUG_DEATH} `EXPECT_DEBUG_DEATH(`*`statement`*`,`*`matcher`*`)` \ `ASSERT_DEBUG_DEATH(`*`statement`*`,`*`matcher`*`)` In debug mode, behaves the same as [`EXPECT_DEATH`](#EXPECT_DEATH). When not in debug mode (i.e. `NDEBUG` is defined), just executes *`statement`*. ### EXPECT_EXIT {#EXPECT_EXIT} `EXPECT_EXIT(`*`statement`*`,`*`predicate`*`,`*`matcher`*`)` \ `ASSERT_EXIT(`*`statement`*`,`*`predicate`*`,`*`matcher`*`)` Verifies that *`statement`* causes the process to terminate with an exit status that satisfies *`predicate`*, and produces `stderr` output that matches *`matcher`*. The parameter *`predicate`* is a function or functor that accepts an `int` exit status and returns a `bool`. GoogleTest provides two predicates to handle common cases: ```cpp // Returns true if the program exited normally with the given exit status code. ::testing::ExitedWithCode(exit_code); // Returns true if the program was killed by the given signal. // Not available on Windows. ::testing::KilledBySignal(signal_number); ``` The parameter *`matcher`* is either a [matcher](matchers.md) for a `const std::string&`, or a regular expression (see [Regular Expression Syntax](../advanced.md#regular-expression-syntax))—a bare string *`s`* (with no matcher) is treated as [`ContainsRegex(s)`](matchers.md#string-matchers), **not** [`Eq(s)`](matchers.md#generic-comparison). For example, the following code verifies that calling `NormalExit()` causes the process to print a message containing the text `Success` to `stderr` and exit with exit status code 0: ```cpp EXPECT_EXIT(NormalExit(), testing::ExitedWithCode(0), "Success"); ``` asymptote-3.05/LspCpp/third_party/uri/deps/docs/reference/actions.md0000644000000000000000000001533015031566105024324 0ustar rootroot# Actions Reference [**Actions**](../gmock_for_dummies.md#actions-what-should-it-do) specify what a mock function should do when invoked. This page lists the built-in actions provided by GoogleTest. All actions are defined in the `::testing` namespace. ## Returning a Value | Action | Description | | :-------------------------------- | :-------------------------------------------- | | `Return()` | Return from a `void` mock function. | | `Return(value)` | Return `value`. If the type of `value` is different to the mock function's return type, `value` is converted to the latter type at the time the expectation is set, not when the action is executed. | | `ReturnArg()` | Return the `N`-th (0-based) argument. | | `ReturnNew(a1, ..., ak)` | Return `new T(a1, ..., ak)`; a different object is created each time. | | `ReturnNull()` | Return a null pointer. | | `ReturnPointee(ptr)` | Return the value pointed to by `ptr`. | | `ReturnRef(variable)` | Return a reference to `variable`. | | `ReturnRefOfCopy(value)` | Return a reference to a copy of `value`; the copy lives as long as the action. | | `ReturnRoundRobin({a1, ..., ak})` | Each call will return the next `ai` in the list, starting at the beginning when the end of the list is reached. | ## Side Effects | Action | Description | | :--------------------------------- | :-------------------------------------- | | `Assign(&variable, value)` | Assign `value` to variable. | | `DeleteArg()` | Delete the `N`-th (0-based) argument, which must be a pointer. | | `SaveArg(pointer)` | Save the `N`-th (0-based) argument to `*pointer`. | | `SaveArgPointee(pointer)` | Save the value pointed to by the `N`-th (0-based) argument to `*pointer`. | | `SetArgReferee(value)` | Assign `value` to the variable referenced by the `N`-th (0-based) argument. | | `SetArgPointee(value)` | Assign `value` to the variable pointed by the `N`-th (0-based) argument. | | `SetArgumentPointee(value)` | Same as `SetArgPointee(value)`. Deprecated. Will be removed in v1.7.0. | | `SetArrayArgument(first, last)` | Copies the elements in source range [`first`, `last`) to the array pointed to by the `N`-th (0-based) argument, which can be either a pointer or an iterator. The action does not take ownership of the elements in the source range. | | `SetErrnoAndReturn(error, value)` | Set `errno` to `error` and return `value`. | | `Throw(exception)` | Throws the given exception, which can be any copyable value. Available since v1.1.0. | ## Using a Function, Functor, or Lambda as an Action In the following, by "callable" we mean a free function, `std::function`, functor, or lambda. | Action | Description | | :---------------------------------- | :------------------------------------- | | `f` | Invoke `f` with the arguments passed to the mock function, where `f` is a callable. | | `Invoke(f)` | Invoke `f` with the arguments passed to the mock function, where `f` can be a global/static function or a functor. | | `Invoke(object_pointer, &class::method)` | Invoke the method on the object with the arguments passed to the mock function. | | `InvokeWithoutArgs(f)` | Invoke `f`, which can be a global/static function or a functor. `f` must take no arguments. | | `InvokeWithoutArgs(object_pointer, &class::method)` | Invoke the method on the object, which takes no arguments. | | `InvokeArgument(arg1, arg2, ..., argk)` | Invoke the mock function's `N`-th (0-based) argument, which must be a function or a functor, with the `k` arguments. | The return value of the invoked function is used as the return value of the action. When defining a callable to be used with `Invoke*()`, you can declare any unused parameters as `Unused`: ```cpp using ::testing::Invoke; double Distance(Unused, double x, double y) { return sqrt(x*x + y*y); } ... EXPECT_CALL(mock, Foo("Hi", _, _)).WillOnce(Invoke(Distance)); ``` `Invoke(callback)` and `InvokeWithoutArgs(callback)` take ownership of `callback`, which must be permanent. The type of `callback` must be a base callback type instead of a derived one, e.g. ```cpp BlockingClosure* done = new BlockingClosure; ... Invoke(done) ...; // This won't compile! Closure* done2 = new BlockingClosure; ... Invoke(done2) ...; // This works. ``` In `InvokeArgument(...)`, if an argument needs to be passed by reference, wrap it inside `std::ref()`. For example, ```cpp using ::testing::InvokeArgument; ... InvokeArgument<2>(5, string("Hi"), std::ref(foo)) ``` calls the mock function's #2 argument, passing to it `5` and `string("Hi")` by value, and `foo` by reference. ## Default Action | Action | Description | | :------------ | :----------------------------------------------------- | | `DoDefault()` | Do the default action (specified by `ON_CALL()` or the built-in one). | {: .callout .note} **Note:** due to technical reasons, `DoDefault()` cannot be used inside a composite action - trying to do so will result in a run-time error. ## Composite Actions | Action | Description | | :----------------------------- | :------------------------------------------ | | `DoAll(a1, a2, ..., an)` | Do all actions `a1` to `an` and return the result of `an` in each invocation. The first `n - 1` sub-actions must return void and will receive a readonly view of the arguments. | | `IgnoreResult(a)` | Perform action `a` and ignore its result. `a` must not return void. | | `WithArg(a)` | Pass the `N`-th (0-based) argument of the mock function to action `a` and perform it. | | `WithArgs(a)` | Pass the selected (0-based) arguments of the mock function to action `a` and perform it. | | `WithoutArgs(a)` | Perform action `a` without any arguments. | ## Defining Actions | Macro | Description | | :--------------------------------- | :-------------------------------------- | | `ACTION(Sum) { return arg0 + arg1; }` | Defines an action `Sum()` to return the sum of the mock function's argument #0 and #1. | | `ACTION_P(Plus, n) { return arg0 + n; }` | Defines an action `Plus(n)` to return the sum of the mock function's argument #0 and `n`. | | `ACTION_Pk(Foo, p1, ..., pk) { statements; }` | Defines a parameterized action `Foo(p1, ..., pk)` to execute the given `statements`. | The `ACTION*` macros cannot be used inside a function or class. asymptote-3.05/LspCpp/third_party/uri/deps/docs/reference/matchers.md0000644000000000000000000004723315031566105024501 0ustar rootroot# Matchers Reference A **matcher** matches a *single* argument. You can use it inside `ON_CALL()` or `EXPECT_CALL()`, or use it to validate a value directly using two macros: | Macro | Description | | :----------------------------------- | :------------------------------------ | | `EXPECT_THAT(actual_value, matcher)` | Asserts that `actual_value` matches `matcher`. | | `ASSERT_THAT(actual_value, matcher)` | The same as `EXPECT_THAT(actual_value, matcher)`, except that it generates a **fatal** failure. | {: .callout .note} **Note:** Although equality matching via `EXPECT_THAT(actual_value, expected_value)` is supported, prefer to make the comparison explicit via `EXPECT_THAT(actual_value, Eq(expected_value))` or `EXPECT_EQ(actual_value, expected_value)`. Built-in matchers (where `argument` is the function argument, e.g. `actual_value` in the example above, or when used in the context of `EXPECT_CALL(mock_object, method(matchers))`, the arguments of `method`) are divided into several categories. All matchers are defined in the `::testing` namespace unless otherwise noted. ## Wildcard Matcher | Description :-------------------------- | :----------------------------------------------- `_` | `argument` can be any value of the correct type. `A()` or `An()` | `argument` can be any value of type `type`. ## Generic Comparison | Matcher | Description | | :--------------------- | :-------------------------------------------------- | | `Eq(value)` or `value` | `argument == value` | | `Ge(value)` | `argument >= value` | | `Gt(value)` | `argument > value` | | `Le(value)` | `argument <= value` | | `Lt(value)` | `argument < value` | | `Ne(value)` | `argument != value` | | `IsFalse()` | `argument` evaluates to `false` in a Boolean context. | | `IsTrue()` | `argument` evaluates to `true` in a Boolean context. | | `IsNull()` | `argument` is a `NULL` pointer (raw or smart). | | `NotNull()` | `argument` is a non-null pointer (raw or smart). | | `Optional(m)` | `argument` is `optional<>` that contains a value matching `m`. (For testing whether an `optional<>` is set, check for equality with `nullopt`. You may need to use `Eq(nullopt)` if the inner type doesn't have `==`.)| | `VariantWith(m)` | `argument` is `variant<>` that holds the alternative of type T with a value matching `m`. | | `Ref(variable)` | `argument` is a reference to `variable`. | | `TypedEq(value)` | `argument` has type `type` and is equal to `value`. You may need to use this instead of `Eq(value)` when the mock function is overloaded. | Except `Ref()`, these matchers make a *copy* of `value` in case it's modified or destructed later. If the compiler complains that `value` doesn't have a public copy constructor, try wrap it in `std::ref()`, e.g. `Eq(std::ref(non_copyable_value))`. If you do that, make sure `non_copyable_value` is not changed afterwards, or the meaning of your matcher will be changed. `IsTrue` and `IsFalse` are useful when you need to use a matcher, or for types that can be explicitly converted to Boolean, but are not implicitly converted to Boolean. In other cases, you can use the basic [`EXPECT_TRUE` and `EXPECT_FALSE`](assertions.md#boolean) assertions. ## Floating-Point Matchers {#FpMatchers} | Matcher | Description | | :------------------------------- | :--------------------------------- | | `DoubleEq(a_double)` | `argument` is a `double` value approximately equal to `a_double`, treating two NaNs as unequal. | | `FloatEq(a_float)` | `argument` is a `float` value approximately equal to `a_float`, treating two NaNs as unequal. | | `NanSensitiveDoubleEq(a_double)` | `argument` is a `double` value approximately equal to `a_double`, treating two NaNs as equal. | | `NanSensitiveFloatEq(a_float)` | `argument` is a `float` value approximately equal to `a_float`, treating two NaNs as equal. | | `IsNan()` | `argument` is any floating-point type with a NaN value. | The above matchers use ULP-based comparison (the same as used in googletest). They automatically pick a reasonable error bound based on the absolute value of the expected value. `DoubleEq()` and `FloatEq()` conform to the IEEE standard, which requires comparing two NaNs for equality to return false. The `NanSensitive*` version instead treats two NaNs as equal, which is often what a user wants. | Matcher | Description | | :------------------------------------------------ | :----------------------- | | `DoubleNear(a_double, max_abs_error)` | `argument` is a `double` value close to `a_double` (absolute error <= `max_abs_error`), treating two NaNs as unequal. | | `FloatNear(a_float, max_abs_error)` | `argument` is a `float` value close to `a_float` (absolute error <= `max_abs_error`), treating two NaNs as unequal. | | `NanSensitiveDoubleNear(a_double, max_abs_error)` | `argument` is a `double` value close to `a_double` (absolute error <= `max_abs_error`), treating two NaNs as equal. | | `NanSensitiveFloatNear(a_float, max_abs_error)` | `argument` is a `float` value close to `a_float` (absolute error <= `max_abs_error`), treating two NaNs as equal. | ## String Matchers The `argument` can be either a C string or a C++ string object: | Matcher | Description | | :---------------------- | :------------------------------------------------- | | `ContainsRegex(string)` | `argument` matches the given regular expression. | | `EndsWith(suffix)` | `argument` ends with string `suffix`. | | `HasSubstr(string)` | `argument` contains `string` as a sub-string. | | `IsEmpty()` | `argument` is an empty string. | | `MatchesRegex(string)` | `argument` matches the given regular expression with the match starting at the first character and ending at the last character. | | `StartsWith(prefix)` | `argument` starts with string `prefix`. | | `StrCaseEq(string)` | `argument` is equal to `string`, ignoring case. | | `StrCaseNe(string)` | `argument` is not equal to `string`, ignoring case. | | `StrEq(string)` | `argument` is equal to `string`. | | `StrNe(string)` | `argument` is not equal to `string`. | | `WhenBase64Unescaped(m)` | `argument` is a base-64 escaped string whose unescaped string matches `m`. | `ContainsRegex()` and `MatchesRegex()` take ownership of the `RE` object. They use the regular expression syntax defined [here](../advanced.md#regular-expression-syntax). All of these matchers, except `ContainsRegex()` and `MatchesRegex()` work for wide strings as well. ## Container Matchers Most STL-style containers support `==`, so you can use `Eq(expected_container)` or simply `expected_container` to match a container exactly. If you want to write the elements in-line, match them more flexibly, or get more informative messages, you can use: | Matcher | Description | | :---------------------------------------- | :------------------------------- | | `BeginEndDistanceIs(m)` | `argument` is a container whose `begin()` and `end()` iterators are separated by a number of increments matching `m`. E.g. `BeginEndDistanceIs(2)` or `BeginEndDistanceIs(Lt(2))`. For containers that define a `size()` method, `SizeIs(m)` may be more efficient. | | `ContainerEq(container)` | The same as `Eq(container)` except that the failure message also includes which elements are in one container but not the other. | | `Contains(e)` | `argument` contains an element that matches `e`, which can be either a value or a matcher. | | `Contains(e).Times(n)` | `argument` contains elements that match `e`, which can be either a value or a matcher, and the number of matches is `n`, which can be either a value or a matcher. Unlike the plain `Contains` and `Each` this allows to check for arbitrary occurrences including testing for absence with `Contains(e).Times(0)`. | | `Each(e)` | `argument` is a container where *every* element matches `e`, which can be either a value or a matcher. | | `ElementsAre(e0, e1, ..., en)` | `argument` has `n + 1` elements, where the *i*-th element matches `ei`, which can be a value or a matcher. | | `ElementsAreArray({e0, e1, ..., en})`, `ElementsAreArray(a_container)`, `ElementsAreArray(begin, end)`, `ElementsAreArray(array)`, or `ElementsAreArray(array, count)` | The same as `ElementsAre()` except that the expected element values/matchers come from an initializer list, STL-style container, iterator range, or C-style array. | | `IsEmpty()` | `argument` is an empty container (`container.empty()`). | | `IsSubsetOf({e0, e1, ..., en})`, `IsSubsetOf(a_container)`, `IsSubsetOf(begin, end)`, `IsSubsetOf(array)`, or `IsSubsetOf(array, count)` | `argument` matches `UnorderedElementsAre(x0, x1, ..., xk)` for some subset `{x0, x1, ..., xk}` of the expected matchers. | | `IsSupersetOf({e0, e1, ..., en})`, `IsSupersetOf(a_container)`, `IsSupersetOf(begin, end)`, `IsSupersetOf(array)`, or `IsSupersetOf(array, count)` | Some subset of `argument` matches `UnorderedElementsAre(`expected matchers`)`. | | `Pointwise(m, container)`, `Pointwise(m, {e0, e1, ..., en})` | `argument` contains the same number of elements as in `container`, and for all i, (the i-th element in `argument`, the i-th element in `container`) match `m`, which is a matcher on 2-tuples. E.g. `Pointwise(Le(), upper_bounds)` verifies that each element in `argument` doesn't exceed the corresponding element in `upper_bounds`. See more detail below. | | `SizeIs(m)` | `argument` is a container whose size matches `m`. E.g. `SizeIs(2)` or `SizeIs(Lt(2))`. | | `UnorderedElementsAre(e0, e1, ..., en)` | `argument` has `n + 1` elements, and under *some* permutation of the elements, each element matches an `ei` (for a different `i`), which can be a value or a matcher. | | `UnorderedElementsAreArray({e0, e1, ..., en})`, `UnorderedElementsAreArray(a_container)`, `UnorderedElementsAreArray(begin, end)`, `UnorderedElementsAreArray(array)`, or `UnorderedElementsAreArray(array, count)` | The same as `UnorderedElementsAre()` except that the expected element values/matchers come from an initializer list, STL-style container, iterator range, or C-style array. | | `UnorderedPointwise(m, container)`, `UnorderedPointwise(m, {e0, e1, ..., en})` | Like `Pointwise(m, container)`, but ignores the order of elements. | | `WhenSorted(m)` | When `argument` is sorted using the `<` operator, it matches container matcher `m`. E.g. `WhenSorted(ElementsAre(1, 2, 3))` verifies that `argument` contains elements 1, 2, and 3, ignoring order. | | `WhenSortedBy(comparator, m)` | The same as `WhenSorted(m)`, except that the given comparator instead of `<` is used to sort `argument`. E.g. `WhenSortedBy(std::greater(), ElementsAre(3, 2, 1))`. | **Notes:** * These matchers can also match: 1. a native array passed by reference (e.g. in `Foo(const int (&a)[5])`), and 2. an array passed as a pointer and a count (e.g. in `Bar(const T* buffer, int len)` -- see [Multi-argument Matchers](#MultiArgMatchers)). * The array being matched may be multi-dimensional (i.e. its elements can be arrays). * `m` in `Pointwise(m, ...)` and `UnorderedPointwise(m, ...)` should be a matcher for `::std::tuple` where `T` and `U` are the element type of the actual container and the expected container, respectively. For example, to compare two `Foo` containers where `Foo` doesn't support `operator==`, one might write: ```cpp MATCHER(FooEq, "") { return std::get<0>(arg).Equals(std::get<1>(arg)); } ... EXPECT_THAT(actual_foos, Pointwise(FooEq(), expected_foos)); ``` ## Member Matchers | Matcher | Description | | :------------------------------ | :----------------------------------------- | | `Field(&class::field, m)` | `argument.field` (or `argument->field` when `argument` is a plain pointer) matches matcher `m`, where `argument` is an object of type _class_. | | `Field(field_name, &class::field, m)` | The same as the two-parameter version, but provides a better error message. | | `Key(e)` | `argument.first` matches `e`, which can be either a value or a matcher. E.g. `Contains(Key(Le(5)))` can verify that a `map` contains a key `<= 5`. | | `Pair(m1, m2)` | `argument` is an `std::pair` whose `first` field matches `m1` and `second` field matches `m2`. | | `FieldsAre(m...)` | `argument` is a compatible object where each field matches piecewise with the matchers `m...`. A compatible object is any that supports the `std::tuple_size`+`get(obj)` protocol. In C++17 and up this also supports types compatible with structured bindings, like aggregates. | | `Property(&class::property, m)` | `argument.property()` (or `argument->property()` when `argument` is a plain pointer) matches matcher `m`, where `argument` is an object of type _class_. The method `property()` must take no argument and be declared as `const`. | | `Property(property_name, &class::property, m)` | The same as the two-parameter version, but provides a better error message. **Notes:** * You can use `FieldsAre()` to match any type that supports structured bindings, such as `std::tuple`, `std::pair`, `std::array`, and aggregate types. For example: ```cpp std::tuple my_tuple{7, "hello world"}; EXPECT_THAT(my_tuple, FieldsAre(Ge(0), HasSubstr("hello"))); struct MyStruct { int value = 42; std::string greeting = "aloha"; }; MyStruct s; EXPECT_THAT(s, FieldsAre(42, "aloha")); ``` * Don't use `Property()` against member functions that you do not own, because taking addresses of functions is fragile and generally not part of the contract of the function. ## Matching the Result of a Function, Functor, or Callback | Matcher | Description | | :--------------- | :------------------------------------------------ | | `ResultOf(f, m)` | `f(argument)` matches matcher `m`, where `f` is a function or functor. | ## Pointer Matchers | Matcher | Description | | :------------------------ | :---------------------------------------------- | | `Address(m)` | the result of `std::addressof(argument)` matches `m`. | | `Pointee(m)` | `argument` (either a smart pointer or a raw pointer) points to a value that matches matcher `m`. | | `Pointer(m)` | `argument` (either a smart pointer or a raw pointer) contains a pointer that matches `m`. `m` will match against the raw pointer regardless of the type of `argument`. | | `WhenDynamicCastTo(m)` | when `argument` is passed through `dynamic_cast()`, it matches matcher `m`. | ## Multi-argument Matchers {#MultiArgMatchers} Technically, all matchers match a *single* value. A "multi-argument" matcher is just one that matches a *tuple*. The following matchers can be used to match a tuple `(x, y)`: Matcher | Description :------ | :---------- `Eq()` | `x == y` `Ge()` | `x >= y` `Gt()` | `x > y` `Le()` | `x <= y` `Lt()` | `x < y` `Ne()` | `x != y` You can use the following selectors to pick a subset of the arguments (or reorder them) to participate in the matching: | Matcher | Description | | :------------------------- | :---------------------------------------------- | | `AllArgs(m)` | Equivalent to `m`. Useful as syntactic sugar in `.With(AllArgs(m))`. | | `Args(m)` | The tuple of the `k` selected (using 0-based indices) arguments matches `m`, e.g. `Args<1, 2>(Eq())`. | ## Composite Matchers You can make a matcher from one or more other matchers: | Matcher | Description | | :------------------------------- | :-------------------------------------- | | `AllOf(m1, m2, ..., mn)` | `argument` matches all of the matchers `m1` to `mn`. | | `AllOfArray({m0, m1, ..., mn})`, `AllOfArray(a_container)`, `AllOfArray(begin, end)`, `AllOfArray(array)`, or `AllOfArray(array, count)` | The same as `AllOf()` except that the matchers come from an initializer list, STL-style container, iterator range, or C-style array. | | `AnyOf(m1, m2, ..., mn)` | `argument` matches at least one of the matchers `m1` to `mn`. | | `AnyOfArray({m0, m1, ..., mn})`, `AnyOfArray(a_container)`, `AnyOfArray(begin, end)`, `AnyOfArray(array)`, or `AnyOfArray(array, count)` | The same as `AnyOf()` except that the matchers come from an initializer list, STL-style container, iterator range, or C-style array. | | `Not(m)` | `argument` doesn't match matcher `m`. | | `Conditional(cond, m1, m2)` | Matches matcher `m1` if `cond` evaluates to true, else matches `m2`.| ## Adapters for Matchers | Matcher | Description | | :---------------------- | :------------------------------------ | | `MatcherCast(m)` | casts matcher `m` to type `Matcher`. | | `SafeMatcherCast(m)` | [safely casts](../gmock_cook_book.md#SafeMatcherCast) matcher `m` to type `Matcher`. | | `Truly(predicate)` | `predicate(argument)` returns something considered by C++ to be true, where `predicate` is a function or functor. | `AddressSatisfies(callback)` and `Truly(callback)` take ownership of `callback`, which must be a permanent callback. ## Using Matchers as Predicates {#MatchersAsPredicatesCheat} | Matcher | Description | | :---------------------------- | :------------------------------------------ | | `Matches(m)(value)` | evaluates to `true` if `value` matches `m`. You can use `Matches(m)` alone as a unary functor. | | `ExplainMatchResult(m, value, result_listener)` | evaluates to `true` if `value` matches `m`, explaining the result to `result_listener`. | | `Value(value, m)` | evaluates to `true` if `value` matches `m`. | ## Defining Matchers | Macro | Description | | :----------------------------------- | :------------------------------------ | | `MATCHER(IsEven, "") { return (arg % 2) == 0; }` | Defines a matcher `IsEven()` to match an even number. | | `MATCHER_P(IsDivisibleBy, n, "") { *result_listener << "where the remainder is " << (arg % n); return (arg % n) == 0; }` | Defines a matcher `IsDivisibleBy(n)` to match a number divisible by `n`. | | `MATCHER_P2(IsBetween, a, b, absl::StrCat(negation ? "isn't" : "is", " between ", PrintToString(a), " and ", PrintToString(b))) { return a <= arg && arg <= b; }` | Defines a matcher `IsBetween(a, b)` to match a value in the range [`a`, `b`]. | **Notes:** 1. The `MATCHER*` macros cannot be used inside a function or class. 2. The matcher body must be *purely functional* (i.e. it cannot have any side effect, and the result must not depend on anything other than the value being matched and the matcher parameters). 3. You can use `PrintToString(x)` to convert a value `x` of any type to a string. 4. You can use `ExplainMatchResult()` in a custom matcher to wrap another matcher, for example: ```cpp MATCHER_P(NestedPropertyMatches, matcher, "") { return ExplainMatchResult(matcher, arg.nested().property(), result_listener); } ``` asymptote-3.05/LspCpp/third_party/uri/deps/docs/samples.md0000644000000000000000000000213615031566105022372 0ustar rootroot# Googletest Samples If you're like us, you'd like to look at [googletest samples.](https://github.com/google/googletest/tree/master/googletest/samples) The sample directory has a number of well-commented samples showing how to use a variety of googletest features. * Sample #1 shows the basic steps of using googletest to test C++ functions. * Sample #2 shows a more complex unit test for a class with multiple member functions. * Sample #3 uses a test fixture. * Sample #4 teaches you how to use googletest and `googletest.h` together to get the best of both libraries. * Sample #5 puts shared testing logic in a base test fixture, and reuses it in derived fixtures. * Sample #6 demonstrates type-parameterized tests. * Sample #7 teaches the basics of value-parameterized tests. * Sample #8 shows using `Combine()` in value-parameterized tests. * Sample #9 shows use of the listener API to modify Google Test's console output and the use of its reflection API to inspect test results. * Sample #10 shows use of the listener API to implement a primitive memory leak checker. asymptote-3.05/LspCpp/third_party/uri/deps/docs/quickstart-bazel.md0000644000000000000000000001212415031566105024211 0ustar rootroot# Quickstart: Building with Bazel This tutorial aims to get you up and running with GoogleTest using the Bazel build system. If you're using GoogleTest for the first time or need a refresher, we recommend this tutorial as a starting point. ## Prerequisites To complete this tutorial, you'll need: * A compatible operating system (e.g. Linux, macOS, Windows). * A compatible C++ compiler that supports at least C++11. * [Bazel](https://bazel.build/), the preferred build system used by the GoogleTest team. See [Supported Platforms](platforms.md) for more information about platforms compatible with GoogleTest. If you don't already have Bazel installed, see the [Bazel installation guide](https://docs.bazel.build/versions/main/install.html). {: .callout .note} Note: The terminal commands in this tutorial show a Unix shell prompt, but the commands work on the Windows command line as well. ## Set up a Bazel workspace A [Bazel workspace](https://docs.bazel.build/versions/main/build-ref.html#workspace) is a directory on your filesystem that you use to manage source files for the software you want to build. Each workspace directory has a text file named `WORKSPACE` which may be empty, or may contain references to external dependencies required to build the outputs. First, create a directory for your workspace: ``` $ mkdir my_workspace && cd my_workspace ``` Next, you’ll create the `WORKSPACE` file to specify dependencies. A common and recommended way to depend on GoogleTest is to use a [Bazel external dependency](https://docs.bazel.build/versions/main/external.html) via the [`http_archive` rule](https://docs.bazel.build/versions/main/repo/http.html#http_archive). To do this, in the root directory of your workspace (`my_workspace/`), create a file named `WORKSPACE` with the following contents: ``` load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "com_google_googletest", urls = ["https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip"], strip_prefix = "googletest-609281088cfefc76f9d0ce82e1ff6c30cc3591e5", ) ``` The above configuration declares a dependency on GoogleTest which is downloaded as a ZIP archive from GitHub. In the above example, `609281088cfefc76f9d0ce82e1ff6c30cc3591e5` is the Git commit hash of the GoogleTest version to use; we recommend updating the hash often to point to the latest version. Now you're ready to build C++ code that uses GoogleTest. ## Create and run a binary With your Bazel workspace set up, you can now use GoogleTest code within your own project. As an example, create a file named `hello_test.cc` in your `my_workspace` directory with the following contents: ```cpp #include // Demonstrate some basic assertions. TEST(HelloTest, BasicAssertions) { // Expect two strings not to be equal. EXPECT_STRNE("hello", "world"); // Expect equality. EXPECT_EQ(7 * 6, 42); } ``` GoogleTest provides [assertions](primer.md#assertions) that you use to test the behavior of your code. The above sample includes the main GoogleTest header file and demonstrates some basic assertions. To build the code, create a file named `BUILD` in the same directory with the following contents: ``` cc_test( name = "hello_test", size = "small", srcs = ["hello_test.cc"], deps = ["@com_google_googletest//:gtest_main"], ) ``` This `cc_test` rule declares the C++ test binary you want to build, and links to GoogleTest (`//:gtest_main`) using the prefix you specified in the `WORKSPACE` file (`@com_google_googletest`). For more information about Bazel `BUILD` files, see the [Bazel C++ Tutorial](https://docs.bazel.build/versions/main/tutorial/cpp.html). Now you can build and run your test:
    my_workspace$ bazel test --test_output=all //:hello_test
    INFO: Analyzed target //:hello_test (26 packages loaded, 362 targets configured).
    INFO: Found 1 test target...
    INFO: From Testing //:hello_test:
    ==================== Test output for //:hello_test:
    Running main() from gmock_main.cc
    [==========] Running 1 test from 1 test suite.
    [----------] Global test environment set-up.
    [----------] 1 test from HelloTest
    [ RUN      ] HelloTest.BasicAssertions
    [       OK ] HelloTest.BasicAssertions (0 ms)
    [----------] 1 test from HelloTest (0 ms total)
    
    [----------] Global test environment tear-down
    [==========] 1 test from 1 test suite ran. (0 ms total)
    [  PASSED  ] 1 test.
    ================================================================================
    Target //:hello_test up-to-date:
      bazel-bin/hello_test
    INFO: Elapsed time: 4.190s, Critical Path: 3.05s
    INFO: 27 processes: 8 internal, 19 linux-sandbox.
    INFO: Build completed successfully, 27 total actions
    //:hello_test                                                     PASSED in 0.1s
    
    INFO: Build completed successfully, 27 total actions
    
    Congratulations! You've successfully built and run a test binary using GoogleTest. ## Next steps * [Check out the Primer](primer.md) to start learning how to write simple tests. * [See the code samples](samples.md) for more examples showing how to use a variety of GoogleTest features. asymptote-3.05/LspCpp/third_party/uri/deps/docs/pkgconfig.md0000644000000000000000000001170615031566105022700 0ustar rootroot## Using GoogleTest from various build systems GoogleTest comes with pkg-config files that can be used to determine all necessary flags for compiling and linking to GoogleTest (and GoogleMock). Pkg-config is a standardised plain-text format containing * the includedir (-I) path * necessary macro (-D) definitions * further required flags (-pthread) * the library (-L) path * the library (-l) to link to All current build systems support pkg-config in one way or another. For all examples here we assume you want to compile the sample `samples/sample3_unittest.cc`. ### CMake Using `pkg-config` in CMake is fairly easy: ```cmake cmake_minimum_required(VERSION 3.0) cmake_policy(SET CMP0048 NEW) project(my_gtest_pkgconfig VERSION 0.0.1 LANGUAGES CXX) find_package(PkgConfig) pkg_search_module(GTEST REQUIRED gtest_main) add_executable(testapp samples/sample3_unittest.cc) target_link_libraries(testapp ${GTEST_LDFLAGS}) target_compile_options(testapp PUBLIC ${GTEST_CFLAGS}) include(CTest) add_test(first_and_only_test testapp) ``` It is generally recommended that you use `target_compile_options` + `_CFLAGS` over `target_include_directories` + `_INCLUDE_DIRS` as the former includes not just -I flags (GoogleTest might require a macro indicating to internal headers that all libraries have been compiled with threading enabled. In addition, GoogleTest might also require `-pthread` in the compiling step, and as such splitting the pkg-config `Cflags` variable into include dirs and macros for `target_compile_definitions()` might still miss this). The same recommendation goes for using `_LDFLAGS` over the more commonplace `_LIBRARIES`, which happens to discard `-L` flags and `-pthread`. ### Help! pkg-config can't find GoogleTest! Let's say you have a `CMakeLists.txt` along the lines of the one in this tutorial and you try to run `cmake`. It is very possible that you get a failure along the lines of: ``` -- Checking for one of the modules 'gtest_main' CMake Error at /usr/share/cmake/Modules/FindPkgConfig.cmake:640 (message): None of the required 'gtest_main' found ``` These failures are common if you installed GoogleTest yourself and have not sourced it from a distro or other package manager. If so, you need to tell pkg-config where it can find the `.pc` files containing the information. Say you installed GoogleTest to `/usr/local`, then it might be that the `.pc` files are installed under `/usr/local/lib64/pkgconfig`. If you set ``` export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig ``` pkg-config will also try to look in `PKG_CONFIG_PATH` to find `gtest_main.pc`. ### Using pkg-config in a cross-compilation setting Pkg-config can be used in a cross-compilation setting too. To do this, let's assume the final prefix of the cross-compiled installation will be `/usr`, and your sysroot is `/home/MYUSER/sysroot`. Configure and install GTest using ``` mkdir build && cmake -DCMAKE_INSTALL_PREFIX=/usr .. ``` Install into the sysroot using `DESTDIR`: ``` make -j install DESTDIR=/home/MYUSER/sysroot ``` Before we continue, it is recommended to **always** define the following two variables for pkg-config in a cross-compilation setting: ``` export PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=yes export PKG_CONFIG_ALLOW_SYSTEM_LIBS=yes ``` otherwise `pkg-config` will filter `-I` and `-L` flags against standard prefixes such as `/usr` (see https://bugs.freedesktop.org/show_bug.cgi?id=28264#c3 for reasons why this stripping needs to occur usually). If you look at the generated pkg-config file, it will look something like ``` libdir=/usr/lib64 includedir=/usr/include Name: gtest Description: GoogleTest (without main() function) Version: 1.11.0 URL: https://github.com/google/googletest Libs: -L${libdir} -lgtest -lpthread Cflags: -I${includedir} -DGTEST_HAS_PTHREAD=1 -lpthread ``` Notice that the sysroot is not included in `libdir` and `includedir`! If you try to run `pkg-config` with the correct `PKG_CONFIG_LIBDIR=/home/MYUSER/sysroot/usr/lib64/pkgconfig` against this `.pc` file, you will get ``` $ pkg-config --cflags gtest -DGTEST_HAS_PTHREAD=1 -lpthread -I/usr/include $ pkg-config --libs gtest -L/usr/lib64 -lgtest -lpthread ``` which is obviously wrong and points to the `CBUILD` and not `CHOST` root. In order to use this in a cross-compilation setting, we need to tell pkg-config to inject the actual sysroot into `-I` and `-L` variables. Let us now tell pkg-config about the actual sysroot ``` export PKG_CONFIG_DIR= export PKG_CONFIG_SYSROOT_DIR=/home/MYUSER/sysroot export PKG_CONFIG_LIBDIR=${PKG_CONFIG_SYSROOT_DIR}/usr/lib64/pkgconfig ``` and running `pkg-config` again we get ``` $ pkg-config --cflags gtest -DGTEST_HAS_PTHREAD=1 -lpthread -I/home/MYUSER/sysroot/usr/include $ pkg-config --libs gtest -L/home/MYUSER/sysroot/usr/lib64 -lgtest -lpthread ``` which contains the correct sysroot now. For a more comprehensive guide to also including `${CHOST}` in build system calls, see the excellent tutorial by Diego Elio Pettenò: asymptote-3.05/LspCpp/third_party/uri/deps/docs/index.md0000644000000000000000000000201215031566105022026 0ustar rootroot# GoogleTest User's Guide ## Welcome to GoogleTest! GoogleTest is Google's C++ testing and mocking framework. This user's guide has the following contents: * [GoogleTest Primer](primer.md) - Teaches you how to write simple tests using GoogleTest. Read this first if you are new to GoogleTest. * [GoogleTest Advanced](advanced.md) - Read this when you've finished the Primer and want to utilize GoogleTest to its full potential. * [GoogleTest Samples](samples.md) - Describes some GoogleTest samples. * [GoogleTest FAQ](faq.md) - Have a question? Want some tips? Check here first. * [Mocking for Dummies](gmock_for_dummies.md) - Teaches you how to create mock objects and use them in tests. * [Mocking Cookbook](gmock_cook_book.md) - Includes tips and approaches to common mocking use cases. * [Mocking Cheat Sheet](gmock_cheat_sheet.md) - A handy reference for matchers, actions, invariants, and more. * [Mocking FAQ](gmock_faq.md) - Contains answers to some mocking-specific questions. asymptote-3.05/LspCpp/third_party/uri/deps/docs/_config.yml0000644000000000000000000000002215031566105022523 0ustar rootroottitle: GoogleTest asymptote-3.05/LspCpp/third_party/uri/deps/docs/gmock_cheat_sheet.md0000644000000000000000000001630415031566105024364 0ustar rootroot# gMock Cheat Sheet ## Defining a Mock Class ### Mocking a Normal Class {#MockClass} Given ```cpp class Foo { ... virtual ~Foo(); virtual int GetSize() const = 0; virtual string Describe(const char* name) = 0; virtual string Describe(int type) = 0; virtual bool Process(Bar elem, int count) = 0; }; ``` (note that `~Foo()` **must** be virtual) we can define its mock as ```cpp #include "gmock/gmock.h" class MockFoo : public Foo { ... MOCK_METHOD(int, GetSize, (), (const, override)); MOCK_METHOD(string, Describe, (const char* name), (override)); MOCK_METHOD(string, Describe, (int type), (override)); MOCK_METHOD(bool, Process, (Bar elem, int count), (override)); }; ``` To create a "nice" mock, which ignores all uninteresting calls, a "naggy" mock, which warns on all uninteresting calls, or a "strict" mock, which treats them as failures: ```cpp using ::testing::NiceMock; using ::testing::NaggyMock; using ::testing::StrictMock; NiceMock nice_foo; // The type is a subclass of MockFoo. NaggyMock naggy_foo; // The type is a subclass of MockFoo. StrictMock strict_foo; // The type is a subclass of MockFoo. ``` {: .callout .note} **Note:** A mock object is currently naggy by default. We may make it nice by default in the future. ### Mocking a Class Template {#MockTemplate} Class templates can be mocked just like any class. To mock ```cpp template class StackInterface { ... virtual ~StackInterface(); virtual int GetSize() const = 0; virtual void Push(const Elem& x) = 0; }; ``` (note that all member functions that are mocked, including `~StackInterface()` **must** be virtual). ```cpp template class MockStack : public StackInterface { ... MOCK_METHOD(int, GetSize, (), (const, override)); MOCK_METHOD(void, Push, (const Elem& x), (override)); }; ``` ### Specifying Calling Conventions for Mock Functions If your mock function doesn't use the default calling convention, you can specify it by adding `Calltype(convention)` to `MOCK_METHOD`'s 4th parameter. For example, ```cpp MOCK_METHOD(bool, Foo, (int n), (Calltype(STDMETHODCALLTYPE))); MOCK_METHOD(int, Bar, (double x, double y), (const, Calltype(STDMETHODCALLTYPE))); ``` where `STDMETHODCALLTYPE` is defined by `` on Windows. ## Using Mocks in Tests {#UsingMocks} The typical work flow is: 1. Import the gMock names you need to use. All gMock symbols are in the `testing` namespace unless they are macros or otherwise noted. 2. Create the mock objects. 3. Optionally, set the default actions of the mock objects. 4. Set your expectations on the mock objects (How will they be called? What will they do?). 5. Exercise code that uses the mock objects; if necessary, check the result using googletest assertions. 6. When a mock object is destructed, gMock automatically verifies that all expectations on it have been satisfied. Here's an example: ```cpp using ::testing::Return; // #1 TEST(BarTest, DoesThis) { MockFoo foo; // #2 ON_CALL(foo, GetSize()) // #3 .WillByDefault(Return(1)); // ... other default actions ... EXPECT_CALL(foo, Describe(5)) // #4 .Times(3) .WillRepeatedly(Return("Category 5")); // ... other expectations ... EXPECT_EQ(MyProductionFunction(&foo), "good"); // #5 } // #6 ``` ## Setting Default Actions {#OnCall} gMock has a **built-in default action** for any function that returns `void`, `bool`, a numeric value, or a pointer. In C++11, it will additionally returns the default-constructed value, if one exists for the given type. To customize the default action for functions with return type `T`, use [`DefaultValue`](reference/mocking.md#DefaultValue). For example: ```cpp // Sets the default action for return type std::unique_ptr to // creating a new Buzz every time. DefaultValue>::SetFactory( [] { return MakeUnique(AccessLevel::kInternal); }); // When this fires, the default action of MakeBuzz() will run, which // will return a new Buzz object. EXPECT_CALL(mock_buzzer_, MakeBuzz("hello")).Times(AnyNumber()); auto buzz1 = mock_buzzer_.MakeBuzz("hello"); auto buzz2 = mock_buzzer_.MakeBuzz("hello"); EXPECT_NE(buzz1, nullptr); EXPECT_NE(buzz2, nullptr); EXPECT_NE(buzz1, buzz2); // Resets the default action for return type std::unique_ptr, // to avoid interfere with other tests. DefaultValue>::Clear(); ``` To customize the default action for a particular method of a specific mock object, use [`ON_CALL`](reference/mocking.md#ON_CALL). `ON_CALL` has a similar syntax to `EXPECT_CALL`, but it is used for setting default behaviors when you do not require that the mock method is called. See [Knowing When to Expect](gmock_cook_book.md#UseOnCall) for a more detailed discussion. ## Setting Expectations {#ExpectCall} See [`EXPECT_CALL`](reference/mocking.md#EXPECT_CALL) in the Mocking Reference. ## Matchers {#MatcherList} See the [Matchers Reference](reference/matchers.md). ## Actions {#ActionList} See the [Actions Reference](reference/actions.md). ## Cardinalities {#CardinalityList} See the [`Times` clause](reference/mocking.md#EXPECT_CALL.Times) of `EXPECT_CALL` in the Mocking Reference. ## Expectation Order By default, expectations can be matched in *any* order. If some or all expectations must be matched in a given order, you can use the [`After` clause](reference/mocking.md#EXPECT_CALL.After) or [`InSequence` clause](reference/mocking.md#EXPECT_CALL.InSequence) of `EXPECT_CALL`, or use an [`InSequence` object](reference/mocking.md#InSequence). ## Verifying and Resetting a Mock gMock will verify the expectations on a mock object when it is destructed, or you can do it earlier: ```cpp using ::testing::Mock; ... // Verifies and removes the expectations on mock_obj; // returns true if and only if successful. Mock::VerifyAndClearExpectations(&mock_obj); ... // Verifies and removes the expectations on mock_obj; // also removes the default actions set by ON_CALL(); // returns true if and only if successful. Mock::VerifyAndClear(&mock_obj); ``` Do not set new expectations after verifying and clearing a mock after its use. Setting expectations after code that exercises the mock has undefined behavior. See [Using Mocks in Tests](gmock_for_dummies.md#using-mocks-in-tests) for more information. You can also tell gMock that a mock object can be leaked and doesn't need to be verified: ```cpp Mock::AllowLeak(&mock_obj); ``` ## Mock Classes gMock defines a convenient mock class template ```cpp class MockFunction { public: MOCK_METHOD(R, Call, (A1, ..., An)); }; ``` See this [recipe](gmock_cook_book.md#UsingCheckPoints) for one application of it. ## Flags | Flag | Description | | :----------------------------- | :---------------------------------------- | | `--gmock_catch_leaked_mocks=0` | Don't report leaked mock objects as failures. | | `--gmock_verbose=LEVEL` | Sets the default verbosity level (`info`, `warning`, or `error`) of Google Mock messages. | asymptote-3.05/LspCpp/third_party/uri/deps/docs/faq.md0000644000000000000000000007231415031566105021502 0ustar rootroot# Googletest FAQ ## Why should test suite names and test names not contain underscore? {: .callout .note} Note: Googletest reserves underscore (`_`) for special purpose keywords, such as [the `DISABLED_` prefix](advanced.md#temporarily-disabling-tests), in addition to the following rationale. Underscore (`_`) is special, as C++ reserves the following to be used by the compiler and the standard library: 1. any identifier that starts with an `_` followed by an upper-case letter, and 2. any identifier that contains two consecutive underscores (i.e. `__`) *anywhere* in its name. User code is *prohibited* from using such identifiers. Now let's look at what this means for `TEST` and `TEST_F`. Currently `TEST(TestSuiteName, TestName)` generates a class named `TestSuiteName_TestName_Test`. What happens if `TestSuiteName` or `TestName` contains `_`? 1. If `TestSuiteName` starts with an `_` followed by an upper-case letter (say, `_Foo`), we end up with `_Foo_TestName_Test`, which is reserved and thus invalid. 2. If `TestSuiteName` ends with an `_` (say, `Foo_`), we get `Foo__TestName_Test`, which is invalid. 3. If `TestName` starts with an `_` (say, `_Bar`), we get `TestSuiteName__Bar_Test`, which is invalid. 4. If `TestName` ends with an `_` (say, `Bar_`), we get `TestSuiteName_Bar__Test`, which is invalid. So clearly `TestSuiteName` and `TestName` cannot start or end with `_` (Actually, `TestSuiteName` can start with `_` -- as long as the `_` isn't followed by an upper-case letter. But that's getting complicated. So for simplicity we just say that it cannot start with `_`.). It may seem fine for `TestSuiteName` and `TestName` to contain `_` in the middle. However, consider this: ```c++ TEST(Time, Flies_Like_An_Arrow) { ... } TEST(Time_Flies, Like_An_Arrow) { ... } ``` Now, the two `TEST`s will both generate the same class (`Time_Flies_Like_An_Arrow_Test`). That's not good. So for simplicity, we just ask the users to avoid `_` in `TestSuiteName` and `TestName`. The rule is more constraining than necessary, but it's simple and easy to remember. It also gives googletest some wiggle room in case its implementation needs to change in the future. If you violate the rule, there may not be immediate consequences, but your test may (just may) break with a new compiler (or a new version of the compiler you are using) or with a new version of googletest. Therefore it's best to follow the rule. ## Why does googletest support `EXPECT_EQ(NULL, ptr)` and `ASSERT_EQ(NULL, ptr)` but not `EXPECT_NE(NULL, ptr)` and `ASSERT_NE(NULL, ptr)`? First of all, you can use `nullptr` with each of these macros, e.g. `EXPECT_EQ(ptr, nullptr)`, `EXPECT_NE(ptr, nullptr)`, `ASSERT_EQ(ptr, nullptr)`, `ASSERT_NE(ptr, nullptr)`. This is the preferred syntax in the style guide because `nullptr` does not have the type problems that `NULL` does. Due to some peculiarity of C++, it requires some non-trivial template meta programming tricks to support using `NULL` as an argument of the `EXPECT_XX()` and `ASSERT_XX()` macros. Therefore we only do it where it's most needed (otherwise we make the implementation of googletest harder to maintain and more error-prone than necessary). Historically, the `EXPECT_EQ()` macro took the *expected* value as its first argument and the *actual* value as the second, though this argument order is now discouraged. It was reasonable that someone wanted to write `EXPECT_EQ(NULL, some_expression)`, and this indeed was requested several times. Therefore we implemented it. The need for `EXPECT_NE(NULL, ptr)` wasn't nearly as strong. When the assertion fails, you already know that `ptr` must be `NULL`, so it doesn't add any information to print `ptr` in this case. That means `EXPECT_TRUE(ptr != NULL)` works just as well. If we were to support `EXPECT_NE(NULL, ptr)`, for consistency we'd have to support `EXPECT_NE(ptr, NULL)` as well. This means using the template meta programming tricks twice in the implementation, making it even harder to understand and maintain. We believe the benefit doesn't justify the cost. Finally, with the growth of the gMock matcher library, we are encouraging people to use the unified `EXPECT_THAT(value, matcher)` syntax more often in tests. One significant advantage of the matcher approach is that matchers can be easily combined to form new matchers, while the `EXPECT_NE`, etc, macros cannot be easily combined. Therefore we want to invest more in the matchers than in the `EXPECT_XX()` macros. ## I need to test that different implementations of an interface satisfy some common requirements. Should I use typed tests or value-parameterized tests? For testing various implementations of the same interface, either typed tests or value-parameterized tests can get it done. It's really up to you the user to decide which is more convenient for you, depending on your particular case. Some rough guidelines: * Typed tests can be easier to write if instances of the different implementations can be created the same way, modulo the type. For example, if all these implementations have a public default constructor (such that you can write `new TypeParam`), or if their factory functions have the same form (e.g. `CreateInstance()`). * Value-parameterized tests can be easier to write if you need different code patterns to create different implementations' instances, e.g. `new Foo` vs `new Bar(5)`. To accommodate for the differences, you can write factory function wrappers and pass these function pointers to the tests as their parameters. * When a typed test fails, the default output includes the name of the type, which can help you quickly identify which implementation is wrong. Value-parameterized tests only show the number of the failed iteration by default. You will need to define a function that returns the iteration name and pass it as the third parameter to INSTANTIATE_TEST_SUITE_P to have more useful output. * When using typed tests, you need to make sure you are testing against the interface type, not the concrete types (in other words, you want to make sure `implicit_cast(my_concrete_impl)` works, not just that `my_concrete_impl` works). It's less likely to make mistakes in this area when using value-parameterized tests. I hope I didn't confuse you more. :-) If you don't mind, I'd suggest you to give both approaches a try. Practice is a much better way to grasp the subtle differences between the two tools. Once you have some concrete experience, you can much more easily decide which one to use the next time. ## I got some run-time errors about invalid proto descriptors when using `ProtocolMessageEquals`. Help! {: .callout .note} **Note:** `ProtocolMessageEquals` and `ProtocolMessageEquiv` are *deprecated* now. Please use `EqualsProto`, etc instead. `ProtocolMessageEquals` and `ProtocolMessageEquiv` were redefined recently and are now less tolerant of invalid protocol buffer definitions. In particular, if you have a `foo.proto` that doesn't fully qualify the type of a protocol message it references (e.g. `message` where it should be `message`), you will now get run-time errors like: ``` ... descriptor.cc:...] Invalid proto descriptor for file "path/to/foo.proto": ... descriptor.cc:...] blah.MyMessage.my_field: ".Bar" is not defined. ``` If you see this, your `.proto` file is broken and needs to be fixed by making the types fully qualified. The new definition of `ProtocolMessageEquals` and `ProtocolMessageEquiv` just happen to reveal your bug. ## My death test modifies some state, but the change seems lost after the death test finishes. Why? Death tests (`EXPECT_DEATH`, etc) are executed in a sub-process s.t. the expected crash won't kill the test program (i.e. the parent process). As a result, any in-memory side effects they incur are observable in their respective sub-processes, but not in the parent process. You can think of them as running in a parallel universe, more or less. In particular, if you use mocking and the death test statement invokes some mock methods, the parent process will think the calls have never occurred. Therefore, you may want to move your `EXPECT_CALL` statements inside the `EXPECT_DEATH` macro. ## EXPECT_EQ(htonl(blah), blah_blah) generates weird compiler errors in opt mode. Is this a googletest bug? Actually, the bug is in `htonl()`. According to `'man htonl'`, `htonl()` is a *function*, which means it's valid to use `htonl` as a function pointer. However, in opt mode `htonl()` is defined as a *macro*, which breaks this usage. Worse, the macro definition of `htonl()` uses a `gcc` extension and is *not* standard C++. That hacky implementation has some ad hoc limitations. In particular, it prevents you from writing `Foo()`, where `Foo` is a template that has an integral argument. The implementation of `EXPECT_EQ(a, b)` uses `sizeof(... a ...)` inside a template argument, and thus doesn't compile in opt mode when `a` contains a call to `htonl()`. It is difficult to make `EXPECT_EQ` bypass the `htonl()` bug, as the solution must work with different compilers on various platforms. ## The compiler complains about "undefined references" to some static const member variables, but I did define them in the class body. What's wrong? If your class has a static data member: ```c++ // foo.h class Foo { ... static const int kBar = 100; }; ``` You also need to define it *outside* of the class body in `foo.cc`: ```c++ const int Foo::kBar; // No initializer here. ``` Otherwise your code is **invalid C++**, and may break in unexpected ways. In particular, using it in googletest comparison assertions (`EXPECT_EQ`, etc) will generate an "undefined reference" linker error. The fact that "it used to work" doesn't mean it's valid. It just means that you were lucky. :-) If the declaration of the static data member is `constexpr` then it is implicitly an `inline` definition, and a separate definition in `foo.cc` is not needed: ```c++ // foo.h class Foo { ... static constexpr int kBar = 100; // Defines kBar, no need to do it in foo.cc. }; ``` ## Can I derive a test fixture from another? Yes. Each test fixture has a corresponding and same named test suite. This means only one test suite can use a particular fixture. Sometimes, however, multiple test cases may want to use the same or slightly different fixtures. For example, you may want to make sure that all of a GUI library's test suites don't leak important system resources like fonts and brushes. In googletest, you share a fixture among test suites by putting the shared logic in a base test fixture, then deriving from that base a separate fixture for each test suite that wants to use this common logic. You then use `TEST_F()` to write tests using each derived fixture. Typically, your code looks like this: ```c++ // Defines a base test fixture. class BaseTest : public ::testing::Test { protected: ... }; // Derives a fixture FooTest from BaseTest. class FooTest : public BaseTest { protected: void SetUp() override { BaseTest::SetUp(); // Sets up the base fixture first. ... additional set-up work ... } void TearDown() override { ... clean-up work for FooTest ... BaseTest::TearDown(); // Remember to tear down the base fixture // after cleaning up FooTest! } ... functions and variables for FooTest ... }; // Tests that use the fixture FooTest. TEST_F(FooTest, Bar) { ... } TEST_F(FooTest, Baz) { ... } ... additional fixtures derived from BaseTest ... ``` If necessary, you can continue to derive test fixtures from a derived fixture. googletest has no limit on how deep the hierarchy can be. For a complete example using derived test fixtures, see [sample5_unittest.cc](https://github.com/google/googletest/blob/master/googletest/samples/sample5_unittest.cc). ## My compiler complains "void value not ignored as it ought to be." What does this mean? You're probably using an `ASSERT_*()` in a function that doesn't return `void`. `ASSERT_*()` can only be used in `void` functions, due to exceptions being disabled by our build system. Please see more details [here](advanced.md#assertion-placement). ## My death test hangs (or seg-faults). How do I fix it? In googletest, death tests are run in a child process and the way they work is delicate. To write death tests you really need to understand how they work—see the details at [Death Assertions](reference/assertions.md#death) in the Assertions Reference. In particular, death tests don't like having multiple threads in the parent process. So the first thing you can try is to eliminate creating threads outside of `EXPECT_DEATH()`. For example, you may want to use mocks or fake objects instead of real ones in your tests. Sometimes this is impossible as some library you must use may be creating threads before `main()` is even reached. In this case, you can try to minimize the chance of conflicts by either moving as many activities as possible inside `EXPECT_DEATH()` (in the extreme case, you want to move everything inside), or leaving as few things as possible in it. Also, you can try to set the death test style to `"threadsafe"`, which is safer but slower, and see if it helps. If you go with thread-safe death tests, remember that they rerun the test program from the beginning in the child process. Therefore make sure your program can run side-by-side with itself and is deterministic. In the end, this boils down to good concurrent programming. You have to make sure that there are no race conditions or deadlocks in your program. No silver bullet - sorry! ## Should I use the constructor/destructor of the test fixture or SetUp()/TearDown()? {#CtorVsSetUp} The first thing to remember is that googletest does **not** reuse the same test fixture object across multiple tests. For each `TEST_F`, googletest will create a **fresh** test fixture object, immediately call `SetUp()`, run the test body, call `TearDown()`, and then delete the test fixture object. When you need to write per-test set-up and tear-down logic, you have the choice between using the test fixture constructor/destructor or `SetUp()/TearDown()`. The former is usually preferred, as it has the following benefits: * By initializing a member variable in the constructor, we have the option to make it `const`, which helps prevent accidental changes to its value and makes the tests more obviously correct. * In case we need to subclass the test fixture class, the subclass' constructor is guaranteed to call the base class' constructor *first*, and the subclass' destructor is guaranteed to call the base class' destructor *afterward*. With `SetUp()/TearDown()`, a subclass may make the mistake of forgetting to call the base class' `SetUp()/TearDown()` or call them at the wrong time. You may still want to use `SetUp()/TearDown()` in the following cases: * C++ does not allow virtual function calls in constructors and destructors. You can call a method declared as virtual, but it will not use dynamic dispatch. It will use the definition from the class the constructor of which is currently executing. This is because calling a virtual method before the derived class constructor has a chance to run is very dangerous - the virtual method might operate on uninitialized data. Therefore, if you need to call a method that will be overridden in a derived class, you have to use `SetUp()/TearDown()`. * In the body of a constructor (or destructor), it's not possible to use the `ASSERT_xx` macros. Therefore, if the set-up operation could cause a fatal test failure that should prevent the test from running, it's necessary to use `abort` and abort the whole test executable, or to use `SetUp()` instead of a constructor. * If the tear-down operation could throw an exception, you must use `TearDown()` as opposed to the destructor, as throwing in a destructor leads to undefined behavior and usually will kill your program right away. Note that many standard libraries (like STL) may throw when exceptions are enabled in the compiler. Therefore you should prefer `TearDown()` if you want to write portable tests that work with or without exceptions. * The googletest team is considering making the assertion macros throw on platforms where exceptions are enabled (e.g. Windows, Mac OS, and Linux client-side), which will eliminate the need for the user to propagate failures from a subroutine to its caller. Therefore, you shouldn't use googletest assertions in a destructor if your code could run on such a platform. ## The compiler complains "no matching function to call" when I use ASSERT_PRED*. How do I fix it? See details for [`EXPECT_PRED*`](reference/assertions.md#EXPECT_PRED) in the Assertions Reference. ## My compiler complains about "ignoring return value" when I call RUN_ALL_TESTS(). Why? Some people had been ignoring the return value of `RUN_ALL_TESTS()`. That is, instead of ```c++ return RUN_ALL_TESTS(); ``` they write ```c++ RUN_ALL_TESTS(); ``` This is **wrong and dangerous**. The testing services needs to see the return value of `RUN_ALL_TESTS()` in order to determine if a test has passed. If your `main()` function ignores it, your test will be considered successful even if it has a googletest assertion failure. Very bad. We have decided to fix this (thanks to Michael Chastain for the idea). Now, your code will no longer be able to ignore `RUN_ALL_TESTS()` when compiled with `gcc`. If you do so, you'll get a compiler error. If you see the compiler complaining about you ignoring the return value of `RUN_ALL_TESTS()`, the fix is simple: just make sure its value is used as the return value of `main()`. But how could we introduce a change that breaks existing tests? Well, in this case, the code was already broken in the first place, so we didn't break it. :-) ## My compiler complains that a constructor (or destructor) cannot return a value. What's going on? Due to a peculiarity of C++, in order to support the syntax for streaming messages to an `ASSERT_*`, e.g. ```c++ ASSERT_EQ(1, Foo()) << "blah blah" << foo; ``` we had to give up using `ASSERT*` and `FAIL*` (but not `EXPECT*` and `ADD_FAILURE*`) in constructors and destructors. The workaround is to move the content of your constructor/destructor to a private void member function, or switch to `EXPECT_*()` if that works. This [section](advanced.md#assertion-placement) in the user's guide explains it. ## My SetUp() function is not called. Why? C++ is case-sensitive. Did you spell it as `Setup()`? Similarly, sometimes people spell `SetUpTestSuite()` as `SetupTestSuite()` and wonder why it's never called. ## I have several test suites which share the same test fixture logic, do I have to define a new test fixture class for each of them? This seems pretty tedious. You don't have to. Instead of ```c++ class FooTest : public BaseTest {}; TEST_F(FooTest, Abc) { ... } TEST_F(FooTest, Def) { ... } class BarTest : public BaseTest {}; TEST_F(BarTest, Abc) { ... } TEST_F(BarTest, Def) { ... } ``` you can simply `typedef` the test fixtures: ```c++ typedef BaseTest FooTest; TEST_F(FooTest, Abc) { ... } TEST_F(FooTest, Def) { ... } typedef BaseTest BarTest; TEST_F(BarTest, Abc) { ... } TEST_F(BarTest, Def) { ... } ``` ## googletest output is buried in a whole bunch of LOG messages. What do I do? The googletest output is meant to be a concise and human-friendly report. If your test generates textual output itself, it will mix with the googletest output, making it hard to read. However, there is an easy solution to this problem. Since `LOG` messages go to stderr, we decided to let googletest output go to stdout. This way, you can easily separate the two using redirection. For example: ```shell $ ./my_test > gtest_output.txt ``` ## Why should I prefer test fixtures over global variables? There are several good reasons: 1. It's likely your test needs to change the states of its global variables. This makes it difficult to keep side effects from escaping one test and contaminating others, making debugging difficult. By using fixtures, each test has a fresh set of variables that's different (but with the same names). Thus, tests are kept independent of each other. 2. Global variables pollute the global namespace. 3. Test fixtures can be reused via subclassing, which cannot be done easily with global variables. This is useful if many test suites have something in common. ## What can the statement argument in ASSERT_DEATH() be? `ASSERT_DEATH(statement, matcher)` (or any death assertion macro) can be used wherever *`statement`* is valid. So basically *`statement`* can be any C++ statement that makes sense in the current context. In particular, it can reference global and/or local variables, and can be: * a simple function call (often the case), * a complex expression, or * a compound statement. Some examples are shown here: ```c++ // A death test can be a simple function call. TEST(MyDeathTest, FunctionCall) { ASSERT_DEATH(Xyz(5), "Xyz failed"); } // Or a complex expression that references variables and functions. TEST(MyDeathTest, ComplexExpression) { const bool c = Condition(); ASSERT_DEATH((c ? Func1(0) : object2.Method("test")), "(Func1|Method) failed"); } // Death assertions can be used anywhere in a function. In // particular, they can be inside a loop. TEST(MyDeathTest, InsideLoop) { // Verifies that Foo(0), Foo(1), ..., and Foo(4) all die. for (int i = 0; i < 5; i++) { EXPECT_DEATH_M(Foo(i), "Foo has \\d+ errors", ::testing::Message() << "where i is " << i); } } // A death assertion can contain a compound statement. TEST(MyDeathTest, CompoundStatement) { // Verifies that at lease one of Bar(0), Bar(1), ..., and // Bar(4) dies. ASSERT_DEATH({ for (int i = 0; i < 5; i++) { Bar(i); } }, "Bar has \\d+ errors"); } ``` ## I have a fixture class `FooTest`, but `TEST_F(FooTest, Bar)` gives me error ``"no matching function for call to `FooTest::FooTest()'"``. Why? Googletest needs to be able to create objects of your test fixture class, so it must have a default constructor. Normally the compiler will define one for you. However, there are cases where you have to define your own: * If you explicitly declare a non-default constructor for class `FooTest` (`DISALLOW_EVIL_CONSTRUCTORS()` does this), then you need to define a default constructor, even if it would be empty. * If `FooTest` has a const non-static data member, then you have to define the default constructor *and* initialize the const member in the initializer list of the constructor. (Early versions of `gcc` doesn't force you to initialize the const member. It's a bug that has been fixed in `gcc 4`.) ## Why does ASSERT_DEATH complain about previous threads that were already joined? With the Linux pthread library, there is no turning back once you cross the line from a single thread to multiple threads. The first time you create a thread, a manager thread is created in addition, so you get 3, not 2, threads. Later when the thread you create joins the main thread, the thread count decrements by 1, but the manager thread will never be killed, so you still have 2 threads, which means you cannot safely run a death test. The new NPTL thread library doesn't suffer from this problem, as it doesn't create a manager thread. However, if you don't control which machine your test runs on, you shouldn't depend on this. ## Why does googletest require the entire test suite, instead of individual tests, to be named *DeathTest when it uses ASSERT_DEATH? googletest does not interleave tests from different test suites. That is, it runs all tests in one test suite first, and then runs all tests in the next test suite, and so on. googletest does this because it needs to set up a test suite before the first test in it is run, and tear it down afterwards. Splitting up the test case would require multiple set-up and tear-down processes, which is inefficient and makes the semantics unclean. If we were to determine the order of tests based on test name instead of test case name, then we would have a problem with the following situation: ```c++ TEST_F(FooTest, AbcDeathTest) { ... } TEST_F(FooTest, Uvw) { ... } TEST_F(BarTest, DefDeathTest) { ... } TEST_F(BarTest, Xyz) { ... } ``` Since `FooTest.AbcDeathTest` needs to run before `BarTest.Xyz`, and we don't interleave tests from different test suites, we need to run all tests in the `FooTest` case before running any test in the `BarTest` case. This contradicts with the requirement to run `BarTest.DefDeathTest` before `FooTest.Uvw`. ## But I don't like calling my entire test suite \*DeathTest when it contains both death tests and non-death tests. What do I do? You don't have to, but if you like, you may split up the test suite into `FooTest` and `FooDeathTest`, where the names make it clear that they are related: ```c++ class FooTest : public ::testing::Test { ... }; TEST_F(FooTest, Abc) { ... } TEST_F(FooTest, Def) { ... } using FooDeathTest = FooTest; TEST_F(FooDeathTest, Uvw) { ... EXPECT_DEATH(...) ... } TEST_F(FooDeathTest, Xyz) { ... ASSERT_DEATH(...) ... } ``` ## googletest prints the LOG messages in a death test's child process only when the test fails. How can I see the LOG messages when the death test succeeds? Printing the LOG messages generated by the statement inside `EXPECT_DEATH()` makes it harder to search for real problems in the parent's log. Therefore, googletest only prints them when the death test has failed. If you really need to see such LOG messages, a workaround is to temporarily break the death test (e.g. by changing the regex pattern it is expected to match). Admittedly, this is a hack. We'll consider a more permanent solution after the fork-and-exec-style death tests are implemented. ## The compiler complains about `no match for 'operator<<'` when I use an assertion. What gives? If you use a user-defined type `FooType` in an assertion, you must make sure there is an `std::ostream& operator<<(std::ostream&, const FooType&)` function defined such that we can print a value of `FooType`. In addition, if `FooType` is declared in a name space, the `<<` operator also needs to be defined in the *same* name space. See [Tip of the Week #49](http://abseil.io/tips/49) for details. ## How do I suppress the memory leak messages on Windows? Since the statically initialized googletest singleton requires allocations on the heap, the Visual C++ memory leak detector will report memory leaks at the end of the program run. The easiest way to avoid this is to use the `_CrtMemCheckpoint` and `_CrtMemDumpAllObjectsSince` calls to not report any statically initialized heap objects. See MSDN for more details and additional heap check/debug routines. ## How can my code detect if it is running in a test? If you write code that sniffs whether it's running in a test and does different things accordingly, you are leaking test-only logic into production code and there is no easy way to ensure that the test-only code paths aren't run by mistake in production. Such cleverness also leads to [Heisenbugs](https://en.wikipedia.org/wiki/Heisenbug). Therefore we strongly advise against the practice, and googletest doesn't provide a way to do it. In general, the recommended way to cause the code to behave differently under test is [Dependency Injection](http://en.wikipedia.org/wiki/Dependency_injection). You can inject different functionality from the test and from the production code. Since your production code doesn't link in the for-test logic at all (the [`testonly`](http://docs.bazel.build/versions/master/be/common-definitions.html#common.testonly) attribute for BUILD targets helps to ensure that), there is no danger in accidentally running it. However, if you *really*, *really*, *really* have no choice, and if you follow the rule of ending your test program names with `_test`, you can use the *horrible* hack of sniffing your executable name (`argv[0]` in `main()`) to know whether the code is under test. ## How do I temporarily disable a test? If you have a broken test that you cannot fix right away, you can add the `DISABLED_` prefix to its name. This will exclude it from execution. This is better than commenting out the code or using `#if 0`, as disabled tests are still compiled (and thus won't rot). To include disabled tests in test execution, just invoke the test program with the `--gtest_also_run_disabled_tests` flag. ## Is it OK if I have two separate `TEST(Foo, Bar)` test methods defined in different namespaces? Yes. The rule is **all test methods in the same test suite must use the same fixture class.** This means that the following is **allowed** because both tests use the same fixture class (`::testing::Test`). ```c++ namespace foo { TEST(CoolTest, DoSomething) { SUCCEED(); } } // namespace foo namespace bar { TEST(CoolTest, DoSomething) { SUCCEED(); } } // namespace bar ``` However, the following code is **not allowed** and will produce a runtime error from googletest because the test methods are using different test fixture classes with the same test suite name. ```c++ namespace foo { class CoolTest : public ::testing::Test {}; // Fixture foo::CoolTest TEST_F(CoolTest, DoSomething) { SUCCEED(); } } // namespace foo namespace bar { class CoolTest : public ::testing::Test {}; // Fixture: bar::CoolTest TEST_F(CoolTest, DoSomething) { SUCCEED(); } } // namespace bar ``` asymptote-3.05/LspCpp/third_party/uri/deps/docs/primer.md0000644000000000000000000004530015031566105022224 0ustar rootroot# Googletest Primer ## Introduction: Why googletest? *googletest* helps you write better C++ tests. googletest is a testing framework developed by the Testing Technology team with Google's specific requirements and constraints in mind. Whether you work on Linux, Windows, or a Mac, if you write C++ code, googletest can help you. And it supports *any* kind of tests, not just unit tests. So what makes a good test, and how does googletest fit in? We believe: 1. Tests should be *independent* and *repeatable*. It's a pain to debug a test that succeeds or fails as a result of other tests. googletest isolates the tests by running each of them on a different object. When a test fails, googletest allows you to run it in isolation for quick debugging. 2. Tests should be well *organized* and reflect the structure of the tested code. googletest groups related tests into test suites that can share data and subroutines. This common pattern is easy to recognize and makes tests easy to maintain. Such consistency is especially helpful when people switch projects and start to work on a new code base. 3. Tests should be *portable* and *reusable*. Google has a lot of code that is platform-neutral; its tests should also be platform-neutral. googletest works on different OSes, with different compilers, with or without exceptions, so googletest tests can work with a variety of configurations. 4. When tests fail, they should provide as much *information* about the problem as possible. googletest doesn't stop at the first test failure. Instead, it only stops the current test and continues with the next. You can also set up tests that report non-fatal failures after which the current test continues. Thus, you can detect and fix multiple bugs in a single run-edit-compile cycle. 5. The testing framework should liberate test writers from housekeeping chores and let them focus on the test *content*. googletest automatically keeps track of all tests defined, and doesn't require the user to enumerate them in order to run them. 6. Tests should be *fast*. With googletest, you can reuse shared resources across tests and pay for the set-up/tear-down only once, without making tests depend on each other. Since googletest is based on the popular xUnit architecture, you'll feel right at home if you've used JUnit or PyUnit before. If not, it will take you about 10 minutes to learn the basics and get started. So let's go! ## Beware of the nomenclature {: .callout .note} _Note:_ There might be some confusion arising from different definitions of the terms _Test_, _Test Case_ and _Test Suite_, so beware of misunderstanding these. Historically, googletest started to use the term _Test Case_ for grouping related tests, whereas current publications, including International Software Testing Qualifications Board ([ISTQB](http://www.istqb.org/)) materials and various textbooks on software quality, use the term _[Test Suite][istqb test suite]_ for this. The related term _Test_, as it is used in googletest, corresponds to the term _[Test Case][istqb test case]_ of ISTQB and others. The term _Test_ is commonly of broad enough sense, including ISTQB's definition of _Test Case_, so it's not much of a problem here. But the term _Test Case_ as was used in Google Test is of contradictory sense and thus confusing. googletest recently started replacing the term _Test Case_ with _Test Suite_. The preferred API is *TestSuite*. The older TestCase API is being slowly deprecated and refactored away. So please be aware of the different definitions of the terms: Meaning | googletest Term | [ISTQB](http://www.istqb.org/) Term :----------------------------------------------------------------------------------- | :---------------------- | :---------------------------------- Exercise a particular program path with specific input values and verify the results | [TEST()](#simple-tests) | [Test Case][istqb test case] [istqb test case]: http://glossary.istqb.org/en/search/test%20case [istqb test suite]: http://glossary.istqb.org/en/search/test%20suite ## Basic Concepts When using googletest, you start by writing *assertions*, which are statements that check whether a condition is true. An assertion's result can be *success*, *nonfatal failure*, or *fatal failure*. If a fatal failure occurs, it aborts the current function; otherwise the program continues normally. *Tests* use assertions to verify the tested code's behavior. If a test crashes or has a failed assertion, then it *fails*; otherwise it *succeeds*. A *test suite* contains one or many tests. You should group your tests into test suites that reflect the structure of the tested code. When multiple tests in a test suite need to share common objects and subroutines, you can put them into a *test fixture* class. A *test program* can contain multiple test suites. We'll now explain how to write a test program, starting at the individual assertion level and building up to tests and test suites. ## Assertions googletest assertions are macros that resemble function calls. You test a class or function by making assertions about its behavior. When an assertion fails, googletest prints the assertion's source file and line number location, along with a failure message. You may also supply a custom failure message which will be appended to googletest's message. The assertions come in pairs that test the same thing but have different effects on the current function. `ASSERT_*` versions generate fatal failures when they fail, and **abort the current function**. `EXPECT_*` versions generate nonfatal failures, which don't abort the current function. Usually `EXPECT_*` are preferred, as they allow more than one failure to be reported in a test. However, you should use `ASSERT_*` if it doesn't make sense to continue when the assertion in question fails. Since a failed `ASSERT_*` returns from the current function immediately, possibly skipping clean-up code that comes after it, it may cause a space leak. Depending on the nature of the leak, it may or may not be worth fixing - so keep this in mind if you get a heap checker error in addition to assertion errors. To provide a custom failure message, simply stream it into the macro using the `<<` operator or a sequence of such operators. See the following example, using the [`ASSERT_EQ` and `EXPECT_EQ`](reference/assertions.md#EXPECT_EQ) macros to verify value equality: ```c++ ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length"; for (int i = 0; i < x.size(); ++i) { EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i; } ``` Anything that can be streamed to an `ostream` can be streamed to an assertion macro--in particular, C strings and `string` objects. If a wide string (`wchar_t*`, `TCHAR*` in `UNICODE` mode on Windows, or `std::wstring`) is streamed to an assertion, it will be translated to UTF-8 when printed. GoogleTest provides a collection of assertions for verifying the behavior of your code in various ways. You can check Boolean conditions, compare values based on relational operators, verify string values, floating-point values, and much more. There are even assertions that enable you to verify more complex states by providing custom predicates. For the complete list of assertions provided by GoogleTest, see the [Assertions Reference](reference/assertions.md). ## Simple Tests To create a test: 1. Use the `TEST()` macro to define and name a test function. These are ordinary C++ functions that don't return a value. 2. In this function, along with any valid C++ statements you want to include, use the various googletest assertions to check values. 3. The test's result is determined by the assertions; if any assertion in the test fails (either fatally or non-fatally), or if the test crashes, the entire test fails. Otherwise, it succeeds. ```c++ TEST(TestSuiteName, TestName) { ... test body ... } ``` `TEST()` arguments go from general to specific. The *first* argument is the name of the test suite, and the *second* argument is the test's name within the test suite. Both names must be valid C++ identifiers, and they should not contain any underscores (`_`). A test's *full name* consists of its containing test suite and its individual name. Tests from different test suites can have the same individual name. For example, let's take a simple integer function: ```c++ int Factorial(int n); // Returns the factorial of n ``` A test suite for this function might look like: ```c++ // Tests factorial of 0. TEST(FactorialTest, HandlesZeroInput) { EXPECT_EQ(Factorial(0), 1); } // Tests factorial of positive numbers. TEST(FactorialTest, HandlesPositiveInput) { EXPECT_EQ(Factorial(1), 1); EXPECT_EQ(Factorial(2), 2); EXPECT_EQ(Factorial(3), 6); EXPECT_EQ(Factorial(8), 40320); } ``` googletest groups the test results by test suites, so logically related tests should be in the same test suite; in other words, the first argument to their `TEST()` should be the same. In the above example, we have two tests, `HandlesZeroInput` and `HandlesPositiveInput`, that belong to the same test suite `FactorialTest`. When naming your test suites and tests, you should follow the same convention as for [naming functions and classes](https://google.github.io/styleguide/cppguide.html#Function_Names). **Availability**: Linux, Windows, Mac. ## Test Fixtures: Using the Same Data Configuration for Multiple Tests {#same-data-multiple-tests} If you find yourself writing two or more tests that operate on similar data, you can use a *test fixture*. This allows you to reuse the same configuration of objects for several different tests. To create a fixture: 1. Derive a class from `::testing::Test` . Start its body with `protected:`, as we'll want to access fixture members from sub-classes. 2. Inside the class, declare any objects you plan to use. 3. If necessary, write a default constructor or `SetUp()` function to prepare the objects for each test. A common mistake is to spell `SetUp()` as **`Setup()`** with a small `u` - Use `override` in C++11 to make sure you spelled it correctly. 4. If necessary, write a destructor or `TearDown()` function to release any resources you allocated in `SetUp()` . To learn when you should use the constructor/destructor and when you should use `SetUp()/TearDown()`, read the [FAQ](faq.md#CtorVsSetUp). 5. If needed, define subroutines for your tests to share. When using a fixture, use `TEST_F()` instead of `TEST()` as it allows you to access objects and subroutines in the test fixture: ```c++ TEST_F(TestFixtureName, TestName) { ... test body ... } ``` Like `TEST()`, the first argument is the test suite name, but for `TEST_F()` this must be the name of the test fixture class. You've probably guessed: `_F` is for fixture. Unfortunately, the C++ macro system does not allow us to create a single macro that can handle both types of tests. Using the wrong macro causes a compiler error. Also, you must first define a test fixture class before using it in a `TEST_F()`, or you'll get the compiler error "`virtual outside class declaration`". For each test defined with `TEST_F()`, googletest will create a *fresh* test fixture at runtime, immediately initialize it via `SetUp()`, run the test, clean up by calling `TearDown()`, and then delete the test fixture. Note that different tests in the same test suite have different test fixture objects, and googletest always deletes a test fixture before it creates the next one. googletest does **not** reuse the same test fixture for multiple tests. Any changes one test makes to the fixture do not affect other tests. As an example, let's write tests for a FIFO queue class named `Queue`, which has the following interface: ```c++ template // E is the element type. class Queue { public: Queue(); void Enqueue(const E& element); E* Dequeue(); // Returns NULL if the queue is empty. size_t size() const; ... }; ``` First, define a fixture class. By convention, you should give it the name `FooTest` where `Foo` is the class being tested. ```c++ class QueueTest : public ::testing::Test { protected: void SetUp() override { q0_.Enqueue(1); q1_.Enqueue(2); q2_.Enqueue(3); } // void TearDown() override {} Queue q0_; Queue q1_; Queue q2_; }; ``` In this case, `TearDown()` is not needed since we don't have to clean up after each test, other than what's already done by the destructor. Now we'll write tests using `TEST_F()` and this fixture. ```c++ TEST_F(QueueTest, IsEmptyInitially) { EXPECT_EQ(q0_.size(), 0); } TEST_F(QueueTest, DequeueWorks) { int* n = q0_.Dequeue(); EXPECT_EQ(n, nullptr); n = q1_.Dequeue(); ASSERT_NE(n, nullptr); EXPECT_EQ(*n, 1); EXPECT_EQ(q1_.size(), 0); delete n; n = q2_.Dequeue(); ASSERT_NE(n, nullptr); EXPECT_EQ(*n, 2); EXPECT_EQ(q2_.size(), 1); delete n; } ``` The above uses both `ASSERT_*` and `EXPECT_*` assertions. The rule of thumb is to use `EXPECT_*` when you want the test to continue to reveal more errors after the assertion failure, and use `ASSERT_*` when continuing after failure doesn't make sense. For example, the second assertion in the `Dequeue` test is `ASSERT_NE(n, nullptr)`, as we need to dereference the pointer `n` later, which would lead to a segfault when `n` is `NULL`. When these tests run, the following happens: 1. googletest constructs a `QueueTest` object (let's call it `t1`). 2. `t1.SetUp()` initializes `t1`. 3. The first test (`IsEmptyInitially`) runs on `t1`. 4. `t1.TearDown()` cleans up after the test finishes. 5. `t1` is destructed. 6. The above steps are repeated on another `QueueTest` object, this time running the `DequeueWorks` test. **Availability**: Linux, Windows, Mac. ## Invoking the Tests `TEST()` and `TEST_F()` implicitly register their tests with googletest. So, unlike with many other C++ testing frameworks, you don't have to re-list all your defined tests in order to run them. After defining your tests, you can run them with `RUN_ALL_TESTS()`, which returns `0` if all the tests are successful, or `1` otherwise. Note that `RUN_ALL_TESTS()` runs *all tests* in your link unit--they can be from different test suites, or even different source files. When invoked, the `RUN_ALL_TESTS()` macro: * Saves the state of all googletest flags. * Creates a test fixture object for the first test. * Initializes it via `SetUp()`. * Runs the test on the fixture object. * Cleans up the fixture via `TearDown()`. * Deletes the fixture. * Restores the state of all googletest flags. * Repeats the above steps for the next test, until all tests have run. If a fatal failure happens the subsequent steps will be skipped. {: .callout .important} > IMPORTANT: You must **not** ignore the return value of `RUN_ALL_TESTS()`, or > you will get a compiler error. The rationale for this design is that the > automated testing service determines whether a test has passed based on its > exit code, not on its stdout/stderr output; thus your `main()` function must > return the value of `RUN_ALL_TESTS()`. > > Also, you should call `RUN_ALL_TESTS()` only **once**. Calling it more than > once conflicts with some advanced googletest features (e.g., thread-safe > [death tests](advanced.md#death-tests)) and thus is not supported. **Availability**: Linux, Windows, Mac. ## Writing the main() Function Most users should _not_ need to write their own `main` function and instead link with `gtest_main` (as opposed to with `gtest`), which defines a suitable entry point. See the end of this section for details. The remainder of this section should only apply when you need to do something custom before the tests run that cannot be expressed within the framework of fixtures and test suites. If you write your own `main` function, it should return the value of `RUN_ALL_TESTS()`. You can start from this boilerplate: ```c++ #include "this/package/foo.h" #include "gtest/gtest.h" namespace my { namespace project { namespace { // The fixture for testing class Foo. class FooTest : public ::testing::Test { protected: // You can remove any or all of the following functions if their bodies would // be empty. FooTest() { // You can do set-up work for each test here. } ~FooTest() override { // You can do clean-up work that doesn't throw exceptions here. } // If the constructor and destructor are not enough for setting up // and cleaning up each test, you can define the following methods: void SetUp() override { // Code here will be called immediately after the constructor (right // before each test). } void TearDown() override { // Code here will be called immediately after each test (right // before the destructor). } // Class members declared here can be used by all tests in the test suite // for Foo. }; // Tests that the Foo::Bar() method does Abc. TEST_F(FooTest, MethodBarDoesAbc) { const std::string input_filepath = "this/package/testdata/myinputfile.dat"; const std::string output_filepath = "this/package/testdata/myoutputfile.dat"; Foo f; EXPECT_EQ(f.Bar(input_filepath, output_filepath), 0); } // Tests that Foo does Xyz. TEST_F(FooTest, DoesXyz) { // Exercises the Xyz feature of Foo. } } // namespace } // namespace project } // namespace my int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } ``` The `::testing::InitGoogleTest()` function parses the command line for googletest flags, and removes all recognized flags. This allows the user to control a test program's behavior via various flags, which we'll cover in the [AdvancedGuide](advanced.md). You **must** call this function before calling `RUN_ALL_TESTS()`, or the flags won't be properly initialized. On Windows, `InitGoogleTest()` also works with wide strings, so it can be used in programs compiled in `UNICODE` mode as well. But maybe you think that writing all those `main` functions is too much work? We agree with you completely, and that's why Google Test provides a basic implementation of main(). If it fits your needs, then just link your test with the `gtest_main` library and you are good to go. {: .callout .note} NOTE: `ParseGUnitFlags()` is deprecated in favor of `InitGoogleTest()`. ## Known Limitations * Google Test is designed to be thread-safe. The implementation is thread-safe on systems where the `pthreads` library is available. It is currently _unsafe_ to use Google Test assertions from two threads concurrently on other systems (e.g. Windows). In most tests this is not an issue as usually the assertions are done in the main thread. If you want to help, you can volunteer to implement the necessary synchronization primitives in `gtest-port.h` for your platform. asymptote-3.05/LspCpp/third_party/uri/deps/docs/gmock_for_dummies.md0000644000000000000000000007102315031566105024420 0ustar rootroot# gMock for Dummies ## What Is gMock? When you write a prototype or test, often it's not feasible or wise to rely on real objects entirely. A **mock object** implements the same interface as a real object (so it can be used as one), but lets you specify at run time how it will be used and what it should do (which methods will be called? in which order? how many times? with what arguments? what will they return? etc). It is easy to confuse the term *fake objects* with mock objects. Fakes and mocks actually mean very different things in the Test-Driven Development (TDD) community: * **Fake** objects have working implementations, but usually take some shortcut (perhaps to make the operations less expensive), which makes them not suitable for production. An in-memory file system would be an example of a fake. * **Mocks** are objects pre-programmed with *expectations*, which form a specification of the calls they are expected to receive. If all this seems too abstract for you, don't worry - the most important thing to remember is that a mock allows you to check the *interaction* between itself and code that uses it. The difference between fakes and mocks shall become much clearer once you start to use mocks. **gMock** is a library (sometimes we also call it a "framework" to make it sound cool) for creating mock classes and using them. It does to C++ what jMock/EasyMock does to Java (well, more or less). When using gMock, 1. first, you use some simple macros to describe the interface you want to mock, and they will expand to the implementation of your mock class; 2. next, you create some mock objects and specify its expectations and behavior using an intuitive syntax; 3. then you exercise code that uses the mock objects. gMock will catch any violation to the expectations as soon as it arises. ## Why gMock? While mock objects help you remove unnecessary dependencies in tests and make them fast and reliable, using mocks manually in C++ is *hard*: * Someone has to implement the mocks. The job is usually tedious and error-prone. No wonder people go great distance to avoid it. * The quality of those manually written mocks is a bit, uh, unpredictable. You may see some really polished ones, but you may also see some that were hacked up in a hurry and have all sorts of ad hoc restrictions. * The knowledge you gained from using one mock doesn't transfer to the next one. In contrast, Java and Python programmers have some fine mock frameworks (jMock, EasyMock, etc), which automate the creation of mocks. As a result, mocking is a proven effective technique and widely adopted practice in those communities. Having the right tool absolutely makes the difference. gMock was built to help C++ programmers. It was inspired by jMock and EasyMock, but designed with C++'s specifics in mind. It is your friend if any of the following problems is bothering you: * You are stuck with a sub-optimal design and wish you had done more prototyping before it was too late, but prototyping in C++ is by no means "rapid". * Your tests are slow as they depend on too many libraries or use expensive resources (e.g. a database). * Your tests are brittle as some resources they use are unreliable (e.g. the network). * You want to test how your code handles a failure (e.g. a file checksum error), but it's not easy to cause one. * You need to make sure that your module interacts with other modules in the right way, but it's hard to observe the interaction; therefore you resort to observing the side effects at the end of the action, but it's awkward at best. * You want to "mock out" your dependencies, except that they don't have mock implementations yet; and, frankly, you aren't thrilled by some of those hand-written mocks. We encourage you to use gMock as * a *design* tool, for it lets you experiment with your interface design early and often. More iterations lead to better designs! * a *testing* tool to cut your tests' outbound dependencies and probe the interaction between your module and its collaborators. ## Getting Started gMock is bundled with googletest. ## A Case for Mock Turtles Let's look at an example. Suppose you are developing a graphics program that relies on a [LOGO](http://en.wikipedia.org/wiki/Logo_programming_language)-like API for drawing. How would you test that it does the right thing? Well, you can run it and compare the screen with a golden screen snapshot, but let's admit it: tests like this are expensive to run and fragile (What if you just upgraded to a shiny new graphics card that has better anti-aliasing? Suddenly you have to update all your golden images.). It would be too painful if all your tests are like this. Fortunately, you learned about [Dependency Injection](http://en.wikipedia.org/wiki/Dependency_injection) and know the right thing to do: instead of having your application talk to the system API directly, wrap the API in an interface (say, `Turtle`) and code to that interface: ```cpp class Turtle { ... virtual ~Turtle() {} virtual void PenUp() = 0; virtual void PenDown() = 0; virtual void Forward(int distance) = 0; virtual void Turn(int degrees) = 0; virtual void GoTo(int x, int y) = 0; virtual int GetX() const = 0; virtual int GetY() const = 0; }; ``` (Note that the destructor of `Turtle` **must** be virtual, as is the case for **all** classes you intend to inherit from - otherwise the destructor of the derived class will not be called when you delete an object through a base pointer, and you'll get corrupted program states like memory leaks.) You can control whether the turtle's movement will leave a trace using `PenUp()` and `PenDown()`, and control its movement using `Forward()`, `Turn()`, and `GoTo()`. Finally, `GetX()` and `GetY()` tell you the current position of the turtle. Your program will normally use a real implementation of this interface. In tests, you can use a mock implementation instead. This allows you to easily check what drawing primitives your program is calling, with what arguments, and in which order. Tests written this way are much more robust (they won't break because your new machine does anti-aliasing differently), easier to read and maintain (the intent of a test is expressed in the code, not in some binary images), and run *much, much faster*. ## Writing the Mock Class If you are lucky, the mocks you need to use have already been implemented by some nice people. If, however, you find yourself in the position to write a mock class, relax - gMock turns this task into a fun game! (Well, almost.) ### How to Define It Using the `Turtle` interface as example, here are the simple steps you need to follow: * Derive a class `MockTurtle` from `Turtle`. * Take a *virtual* function of `Turtle` (while it's possible to [mock non-virtual methods using templates](gmock_cook_book.md#MockingNonVirtualMethods), it's much more involved). * In the `public:` section of the child class, write `MOCK_METHOD();` * Now comes the fun part: you take the function signature, cut-and-paste it into the macro, and add two commas - one between the return type and the name, another between the name and the argument list. * If you're mocking a const method, add a 4th parameter containing `(const)` (the parentheses are required). * Since you're overriding a virtual method, we suggest adding the `override` keyword. For const methods the 4th parameter becomes `(const, override)`, for non-const methods just `(override)`. This isn't mandatory. * Repeat until all virtual functions you want to mock are done. (It goes without saying that *all* pure virtual methods in your abstract class must be either mocked or overridden.) After the process, you should have something like: ```cpp #include "gmock/gmock.h" // Brings in gMock. class MockTurtle : public Turtle { public: ... MOCK_METHOD(void, PenUp, (), (override)); MOCK_METHOD(void, PenDown, (), (override)); MOCK_METHOD(void, Forward, (int distance), (override)); MOCK_METHOD(void, Turn, (int degrees), (override)); MOCK_METHOD(void, GoTo, (int x, int y), (override)); MOCK_METHOD(int, GetX, (), (const, override)); MOCK_METHOD(int, GetY, (), (const, override)); }; ``` You don't need to define these mock methods somewhere else - the `MOCK_METHOD` macro will generate the definitions for you. It's that simple! ### Where to Put It When you define a mock class, you need to decide where to put its definition. Some people put it in a `_test.cc`. This is fine when the interface being mocked (say, `Foo`) is owned by the same person or team. Otherwise, when the owner of `Foo` changes it, your test could break. (You can't really expect `Foo`'s maintainer to fix every test that uses `Foo`, can you?) Generally, you should not define mock classes you don't own. If you must mock such a class owned by others, define the mock class in `Foo`'s Bazel package (usually the same directory or a `testing` sub-directory), and put it in a `.h` and a `cc_library` with `testonly=True`. Then everyone can reference them from their tests. If `Foo` ever changes, there is only one copy of `MockFoo` to change, and only tests that depend on the changed methods need to be fixed. Another way to do it: you can introduce a thin layer `FooAdaptor` on top of `Foo` and code to this new interface. Since you own `FooAdaptor`, you can absorb changes in `Foo` much more easily. While this is more work initially, carefully choosing the adaptor interface can make your code easier to write and more readable (a net win in the long run), as you can choose `FooAdaptor` to fit your specific domain much better than `Foo` does. ## Using Mocks in Tests Once you have a mock class, using it is easy. The typical work flow is: 1. Import the gMock names from the `testing` namespace such that you can use them unqualified (You only have to do it once per file). Remember that namespaces are a good idea. 2. Create some mock objects. 3. Specify your expectations on them (How many times will a method be called? With what arguments? What should it do? etc.). 4. Exercise some code that uses the mocks; optionally, check the result using googletest assertions. If a mock method is called more than expected or with wrong arguments, you'll get an error immediately. 5. When a mock is destructed, gMock will automatically check whether all expectations on it have been satisfied. Here's an example: ```cpp #include "path/to/mock-turtle.h" #include "gmock/gmock.h" #include "gtest/gtest.h" using ::testing::AtLeast; // #1 TEST(PainterTest, CanDrawSomething) { MockTurtle turtle; // #2 EXPECT_CALL(turtle, PenDown()) // #3 .Times(AtLeast(1)); Painter painter(&turtle); // #4 EXPECT_TRUE(painter.DrawCircle(0, 0, 10)); // #5 } ``` As you might have guessed, this test checks that `PenDown()` is called at least once. If the `painter` object didn't call this method, your test will fail with a message like this: ```text path/to/my_test.cc:119: Failure Actual function call count doesn't match this expectation: Actually: never called; Expected: called at least once. Stack trace: ... ``` **Tip 1:** If you run the test from an Emacs buffer, you can hit `` on the line number to jump right to the failed expectation. **Tip 2:** If your mock objects are never deleted, the final verification won't happen. Therefore it's a good idea to turn on the heap checker in your tests when you allocate mocks on the heap. You get that automatically if you use the `gtest_main` library already. **Important note:** gMock requires expectations to be set **before** the mock functions are called, otherwise the behavior is **undefined**. Do not alternate between calls to `EXPECT_CALL()` and calls to the mock functions, and do not set any expectations on a mock after passing the mock to an API. This means `EXPECT_CALL()` should be read as expecting that a call will occur *in the future*, not that a call has occurred. Why does gMock work like that? Well, specifying the expectation beforehand allows gMock to report a violation as soon as it rises, when the context (stack trace, etc) is still available. This makes debugging much easier. Admittedly, this test is contrived and doesn't do much. You can easily achieve the same effect without using gMock. However, as we shall reveal soon, gMock allows you to do *so much more* with the mocks. ## Setting Expectations The key to using a mock object successfully is to set the *right expectations* on it. If you set the expectations too strict, your test will fail as the result of unrelated changes. If you set them too loose, bugs can slip through. You want to do it just right such that your test can catch exactly the kind of bugs you intend it to catch. gMock provides the necessary means for you to do it "just right." ### General Syntax In gMock we use the `EXPECT_CALL()` macro to set an expectation on a mock method. The general syntax is: ```cpp EXPECT_CALL(mock_object, method(matchers)) .Times(cardinality) .WillOnce(action) .WillRepeatedly(action); ``` The macro has two arguments: first the mock object, and then the method and its arguments. Note that the two are separated by a comma (`,`), not a period (`.`). (Why using a comma? The answer is that it was necessary for technical reasons.) If the method is not overloaded, the macro can also be called without matchers: ```cpp EXPECT_CALL(mock_object, non-overloaded-method) .Times(cardinality) .WillOnce(action) .WillRepeatedly(action); ``` This syntax allows the test writer to specify "called with any arguments" without explicitly specifying the number or types of arguments. To avoid unintended ambiguity, this syntax may only be used for methods that are not overloaded. Either form of the macro can be followed by some optional *clauses* that provide more information about the expectation. We'll discuss how each clause works in the coming sections. This syntax is designed to make an expectation read like English. For example, you can probably guess that ```cpp using ::testing::Return; ... EXPECT_CALL(turtle, GetX()) .Times(5) .WillOnce(Return(100)) .WillOnce(Return(150)) .WillRepeatedly(Return(200)); ``` says that the `turtle` object's `GetX()` method will be called five times, it will return 100 the first time, 150 the second time, and then 200 every time. Some people like to call this style of syntax a Domain-Specific Language (DSL). {: .callout .note} **Note:** Why do we use a macro to do this? Well it serves two purposes: first it makes expectations easily identifiable (either by `grep` or by a human reader), and second it allows gMock to include the source file location of a failed expectation in messages, making debugging easier. ### Matchers: What Arguments Do We Expect? When a mock function takes arguments, we may specify what arguments we are expecting, for example: ```cpp // Expects the turtle to move forward by 100 units. EXPECT_CALL(turtle, Forward(100)); ``` Oftentimes you do not want to be too specific. Remember that talk about tests being too rigid? Over specification leads to brittle tests and obscures the intent of tests. Therefore we encourage you to specify only what's necessary—no more, no less. If you aren't interested in the value of an argument, write `_` as the argument, which means "anything goes": ```cpp using ::testing::_; ... // Expects that the turtle jumps to somewhere on the x=50 line. EXPECT_CALL(turtle, GoTo(50, _)); ``` `_` is an instance of what we call **matchers**. A matcher is like a predicate and can test whether an argument is what we'd expect. You can use a matcher inside `EXPECT_CALL()` wherever a function argument is expected. `_` is a convenient way of saying "any value". In the above examples, `100` and `50` are also matchers; implicitly, they are the same as `Eq(100)` and `Eq(50)`, which specify that the argument must be equal (using `operator==`) to the matcher argument. There are many [built-in matchers](reference/matchers.md) for common types (as well as [custom matchers](gmock_cook_book.md#NewMatchers)); for example: ```cpp using ::testing::Ge; ... // Expects the turtle moves forward by at least 100. EXPECT_CALL(turtle, Forward(Ge(100))); ``` If you don't care about *any* arguments, rather than specify `_` for each of them you may instead omit the parameter list: ```cpp // Expects the turtle to move forward. EXPECT_CALL(turtle, Forward); // Expects the turtle to jump somewhere. EXPECT_CALL(turtle, GoTo); ``` This works for all non-overloaded methods; if a method is overloaded, you need to help gMock resolve which overload is expected by specifying the number of arguments and possibly also the [types of the arguments](gmock_cook_book.md#SelectOverload). ### Cardinalities: How Many Times Will It Be Called? The first clause we can specify following an `EXPECT_CALL()` is `Times()`. We call its argument a **cardinality** as it tells *how many times* the call should occur. It allows us to repeat an expectation many times without actually writing it as many times. More importantly, a cardinality can be "fuzzy", just like a matcher can be. This allows a user to express the intent of a test exactly. An interesting special case is when we say `Times(0)`. You may have guessed - it means that the function shouldn't be called with the given arguments at all, and gMock will report a googletest failure whenever the function is (wrongfully) called. We've seen `AtLeast(n)` as an example of fuzzy cardinalities earlier. For the list of built-in cardinalities you can use, see [here](gmock_cheat_sheet.md#CardinalityList). The `Times()` clause can be omitted. **If you omit `Times()`, gMock will infer the cardinality for you.** The rules are easy to remember: * If **neither** `WillOnce()` **nor** `WillRepeatedly()` is in the `EXPECT_CALL()`, the inferred cardinality is `Times(1)`. * If there are *n* `WillOnce()`'s but **no** `WillRepeatedly()`, where *n* >= 1, the cardinality is `Times(n)`. * If there are *n* `WillOnce()`'s and **one** `WillRepeatedly()`, where *n* >= 0, the cardinality is `Times(AtLeast(n))`. **Quick quiz:** what do you think will happen if a function is expected to be called twice but actually called four times? ### Actions: What Should It Do? Remember that a mock object doesn't really have a working implementation? We as users have to tell it what to do when a method is invoked. This is easy in gMock. First, if the return type of a mock function is a built-in type or a pointer, the function has a **default action** (a `void` function will just return, a `bool` function will return `false`, and other functions will return 0). In addition, in C++ 11 and above, a mock function whose return type is default-constructible (i.e. has a default constructor) has a default action of returning a default-constructed value. If you don't say anything, this behavior will be used. Second, if a mock function doesn't have a default action, or the default action doesn't suit you, you can specify the action to be taken each time the expectation matches using a series of `WillOnce()` clauses followed by an optional `WillRepeatedly()`. For example, ```cpp using ::testing::Return; ... EXPECT_CALL(turtle, GetX()) .WillOnce(Return(100)) .WillOnce(Return(200)) .WillOnce(Return(300)); ``` says that `turtle.GetX()` will be called *exactly three times* (gMock inferred this from how many `WillOnce()` clauses we've written, since we didn't explicitly write `Times()`), and will return 100, 200, and 300 respectively. ```cpp using ::testing::Return; ... EXPECT_CALL(turtle, GetY()) .WillOnce(Return(100)) .WillOnce(Return(200)) .WillRepeatedly(Return(300)); ``` says that `turtle.GetY()` will be called *at least twice* (gMock knows this as we've written two `WillOnce()` clauses and a `WillRepeatedly()` while having no explicit `Times()`), will return 100 and 200 respectively the first two times, and 300 from the third time on. Of course, if you explicitly write a `Times()`, gMock will not try to infer the cardinality itself. What if the number you specified is larger than there are `WillOnce()` clauses? Well, after all `WillOnce()`s are used up, gMock will do the *default* action for the function every time (unless, of course, you have a `WillRepeatedly()`.). What can we do inside `WillOnce()` besides `Return()`? You can return a reference using `ReturnRef(`*`variable`*`)`, or invoke a pre-defined function, among [others](gmock_cook_book.md#using-actions). **Important note:** The `EXPECT_CALL()` statement evaluates the action clause only once, even though the action may be performed many times. Therefore you must be careful about side effects. The following may not do what you want: ```cpp using ::testing::Return; ... int n = 100; EXPECT_CALL(turtle, GetX()) .Times(4) .WillRepeatedly(Return(n++)); ``` Instead of returning 100, 101, 102, ..., consecutively, this mock function will always return 100 as `n++` is only evaluated once. Similarly, `Return(new Foo)` will create a new `Foo` object when the `EXPECT_CALL()` is executed, and will return the same pointer every time. If you want the side effect to happen every time, you need to define a custom action, which we'll teach in the [cook book](gmock_cook_book.md). Time for another quiz! What do you think the following means? ```cpp using ::testing::Return; ... EXPECT_CALL(turtle, GetY()) .Times(4) .WillOnce(Return(100)); ``` Obviously `turtle.GetY()` is expected to be called four times. But if you think it will return 100 every time, think twice! Remember that one `WillOnce()` clause will be consumed each time the function is invoked and the default action will be taken afterwards. So the right answer is that `turtle.GetY()` will return 100 the first time, but **return 0 from the second time on**, as returning 0 is the default action for `int` functions. ### Using Multiple Expectations {#MultiExpectations} So far we've only shown examples where you have a single expectation. More realistically, you'll specify expectations on multiple mock methods which may be from multiple mock objects. By default, when a mock method is invoked, gMock will search the expectations in the **reverse order** they are defined, and stop when an active expectation that matches the arguments is found (you can think of it as "newer rules override older ones."). If the matching expectation cannot take any more calls, you will get an upper-bound-violated failure. Here's an example: ```cpp using ::testing::_; ... EXPECT_CALL(turtle, Forward(_)); // #1 EXPECT_CALL(turtle, Forward(10)) // #2 .Times(2); ``` If `Forward(10)` is called three times in a row, the third time it will be an error, as the last matching expectation (#2) has been saturated. If, however, the third `Forward(10)` call is replaced by `Forward(20)`, then it would be OK, as now #1 will be the matching expectation. {: .callout .note} **Note:** Why does gMock search for a match in the *reverse* order of the expectations? The reason is that this allows a user to set up the default expectations in a mock object's constructor or the test fixture's set-up phase and then customize the mock by writing more specific expectations in the test body. So, if you have two expectations on the same method, you want to put the one with more specific matchers **after** the other, or the more specific rule would be shadowed by the more general one that comes after it. {: .callout .tip} **Tip:** It is very common to start with a catch-all expectation for a method and `Times(AnyNumber())` (omitting arguments, or with `_` for all arguments, if overloaded). This makes any calls to the method expected. This is not necessary for methods that are not mentioned at all (these are "uninteresting"), but is useful for methods that have some expectations, but for which other calls are ok. See [Understanding Uninteresting vs Unexpected Calls](gmock_cook_book.md#uninteresting-vs-unexpected). ### Ordered vs Unordered Calls {#OrderedCalls} By default, an expectation can match a call even though an earlier expectation hasn't been satisfied. In other words, the calls don't have to occur in the order the expectations are specified. Sometimes, you may want all the expected calls to occur in a strict order. To say this in gMock is easy: ```cpp using ::testing::InSequence; ... TEST(FooTest, DrawsLineSegment) { ... { InSequence seq; EXPECT_CALL(turtle, PenDown()); EXPECT_CALL(turtle, Forward(100)); EXPECT_CALL(turtle, PenUp()); } Foo(); } ``` By creating an object of type `InSequence`, all expectations in its scope are put into a *sequence* and have to occur *sequentially*. Since we are just relying on the constructor and destructor of this object to do the actual work, its name is really irrelevant. In this example, we test that `Foo()` calls the three expected functions in the order as written. If a call is made out-of-order, it will be an error. (What if you care about the relative order of some of the calls, but not all of them? Can you specify an arbitrary partial order? The answer is ... yes! The details can be found [here](gmock_cook_book.md#OrderedCalls).) ### All Expectations Are Sticky (Unless Said Otherwise) {#StickyExpectations} Now let's do a quick quiz to see how well you can use this mock stuff already. How would you test that the turtle is asked to go to the origin *exactly twice* (you want to ignore any other instructions it receives)? After you've come up with your answer, take a look at ours and compare notes (solve it yourself first - don't cheat!): ```cpp using ::testing::_; using ::testing::AnyNumber; ... EXPECT_CALL(turtle, GoTo(_, _)) // #1 .Times(AnyNumber()); EXPECT_CALL(turtle, GoTo(0, 0)) // #2 .Times(2); ``` Suppose `turtle.GoTo(0, 0)` is called three times. In the third time, gMock will see that the arguments match expectation #2 (remember that we always pick the last matching expectation). Now, since we said that there should be only two such calls, gMock will report an error immediately. This is basically what we've told you in the [Using Multiple Expectations](#MultiExpectations) section above. This example shows that **expectations in gMock are "sticky" by default**, in the sense that they remain active even after we have reached their invocation upper bounds. This is an important rule to remember, as it affects the meaning of the spec, and is **different** to how it's done in many other mocking frameworks (Why'd we do that? Because we think our rule makes the common cases easier to express and understand.). Simple? Let's see if you've really understood it: what does the following code say? ```cpp using ::testing::Return; ... for (int i = n; i > 0; i--) { EXPECT_CALL(turtle, GetX()) .WillOnce(Return(10*i)); } ``` If you think it says that `turtle.GetX()` will be called `n` times and will return 10, 20, 30, ..., consecutively, think twice! The problem is that, as we said, expectations are sticky. So, the second time `turtle.GetX()` is called, the last (latest) `EXPECT_CALL()` statement will match, and will immediately lead to an "upper bound violated" error - this piece of code is not very useful! One correct way of saying that `turtle.GetX()` will return 10, 20, 30, ..., is to explicitly say that the expectations are *not* sticky. In other words, they should *retire* as soon as they are saturated: ```cpp using ::testing::Return; ... for (int i = n; i > 0; i--) { EXPECT_CALL(turtle, GetX()) .WillOnce(Return(10*i)) .RetiresOnSaturation(); } ``` And, there's a better way to do it: in this case, we expect the calls to occur in a specific order, and we line up the actions to match the order. Since the order is important here, we should make it explicit using a sequence: ```cpp using ::testing::InSequence; using ::testing::Return; ... { InSequence s; for (int i = 1; i <= n; i++) { EXPECT_CALL(turtle, GetX()) .WillOnce(Return(10*i)) .RetiresOnSaturation(); } } ``` By the way, the other situation where an expectation may *not* be sticky is when it's in a sequence - as soon as another expectation that comes after it in the sequence has been used, it automatically retires (and will never be used to match any call). ### Uninteresting Calls A mock object may have many methods, and not all of them are that interesting. For example, in some tests we may not care about how many times `GetX()` and `GetY()` get called. In gMock, if you are not interested in a method, just don't say anything about it. If a call to this method occurs, you'll see a warning in the test output, but it won't be a failure. This is called "naggy" behavior; to change, see [The Nice, the Strict, and the Naggy](gmock_cook_book.md#NiceStrictNaggy). asymptote-3.05/LspCpp/third_party/uri/deps/docs/advanced.md0000644000000000000000000025103015031566105022472 0ustar rootroot# Advanced googletest Topics ## Introduction Now that you have read the [googletest Primer](primer.md) and learned how to write tests using googletest, it's time to learn some new tricks. This document will show you more assertions as well as how to construct complex failure messages, propagate fatal failures, reuse and speed up your test fixtures, and use various flags with your tests. ## More Assertions This section covers some less frequently used, but still significant, assertions. ### Explicit Success and Failure See [Explicit Success and Failure](reference/assertions.md#success-failure) in the Assertions Reference. ### Exception Assertions See [Exception Assertions](reference/assertions.md#exceptions) in the Assertions Reference. ### Predicate Assertions for Better Error Messages Even though googletest has a rich set of assertions, they can never be complete, as it's impossible (nor a good idea) to anticipate all scenarios a user might run into. Therefore, sometimes a user has to use `EXPECT_TRUE()` to check a complex expression, for lack of a better macro. This has the problem of not showing you the values of the parts of the expression, making it hard to understand what went wrong. As a workaround, some users choose to construct the failure message by themselves, streaming it into `EXPECT_TRUE()`. However, this is awkward especially when the expression has side-effects or is expensive to evaluate. googletest gives you three different options to solve this problem: #### Using an Existing Boolean Function If you already have a function or functor that returns `bool` (or a type that can be implicitly converted to `bool`), you can use it in a *predicate assertion* to get the function arguments printed for free. See [`EXPECT_PRED*`](reference/assertions.md#EXPECT_PRED) in the Assertions Reference for details. #### Using a Function That Returns an AssertionResult While `EXPECT_PRED*()` and friends are handy for a quick job, the syntax is not satisfactory: you have to use different macros for different arities, and it feels more like Lisp than C++. The `::testing::AssertionResult` class solves this problem. An `AssertionResult` object represents the result of an assertion (whether it's a success or a failure, and an associated message). You can create an `AssertionResult` using one of these factory functions: ```c++ namespace testing { // Returns an AssertionResult object to indicate that an assertion has // succeeded. AssertionResult AssertionSuccess(); // Returns an AssertionResult object to indicate that an assertion has // failed. AssertionResult AssertionFailure(); } ``` You can then use the `<<` operator to stream messages to the `AssertionResult` object. To provide more readable messages in Boolean assertions (e.g. `EXPECT_TRUE()`), write a predicate function that returns `AssertionResult` instead of `bool`. For example, if you define `IsEven()` as: ```c++ testing::AssertionResult IsEven(int n) { if ((n % 2) == 0) return testing::AssertionSuccess(); else return testing::AssertionFailure() << n << " is odd"; } ``` instead of: ```c++ bool IsEven(int n) { return (n % 2) == 0; } ``` the failed assertion `EXPECT_TRUE(IsEven(Fib(4)))` will print: ```none Value of: IsEven(Fib(4)) Actual: false (3 is odd) Expected: true ``` instead of a more opaque ```none Value of: IsEven(Fib(4)) Actual: false Expected: true ``` If you want informative messages in `EXPECT_FALSE` and `ASSERT_FALSE` as well (one third of Boolean assertions in the Google code base are negative ones), and are fine with making the predicate slower in the success case, you can supply a success message: ```c++ testing::AssertionResult IsEven(int n) { if ((n % 2) == 0) return testing::AssertionSuccess() << n << " is even"; else return testing::AssertionFailure() << n << " is odd"; } ``` Then the statement `EXPECT_FALSE(IsEven(Fib(6)))` will print ```none Value of: IsEven(Fib(6)) Actual: true (8 is even) Expected: false ``` #### Using a Predicate-Formatter If you find the default message generated by [`EXPECT_PRED*`](reference/assertions.md#EXPECT_PRED) and [`EXPECT_TRUE`](reference/assertions.md#EXPECT_TRUE) unsatisfactory, or some arguments to your predicate do not support streaming to `ostream`, you can instead use *predicate-formatter assertions* to *fully* customize how the message is formatted. See [`EXPECT_PRED_FORMAT*`](reference/assertions.md#EXPECT_PRED_FORMAT) in the Assertions Reference for details. ### Floating-Point Comparison See [Floating-Point Comparison](reference/assertions.md#floating-point) in the Assertions Reference. #### Floating-Point Predicate-Format Functions Some floating-point operations are useful, but not that often used. In order to avoid an explosion of new macros, we provide them as predicate-format functions that can be used in the predicate assertion macro [`EXPECT_PRED_FORMAT2`](reference/assertions.md#EXPECT_PRED_FORMAT), for example: ```c++ using ::testing::FloatLE; using ::testing::DoubleLE; ... EXPECT_PRED_FORMAT2(FloatLE, val1, val2); EXPECT_PRED_FORMAT2(DoubleLE, val1, val2); ``` The above code verifies that `val1` is less than, or approximately equal to, `val2`. ### Asserting Using gMock Matchers See [`EXPECT_THAT`](reference/assertions.md#EXPECT_THAT) in the Assertions Reference. ### More String Assertions (Please read the [previous](#asserting-using-gmock-matchers) section first if you haven't.) You can use the gMock [string matchers](reference/matchers.md#string-matchers) with [`EXPECT_THAT`](reference/assertions.md#EXPECT_THAT) to do more string comparison tricks (sub-string, prefix, suffix, regular expression, and etc). For example, ```c++ using ::testing::HasSubstr; using ::testing::MatchesRegex; ... ASSERT_THAT(foo_string, HasSubstr("needle")); EXPECT_THAT(bar_string, MatchesRegex("\\w*\\d+")); ``` ### Windows HRESULT assertions See [Windows HRESULT Assertions](reference/assertions.md#HRESULT) in the Assertions Reference. ### Type Assertions You can call the function ```c++ ::testing::StaticAssertTypeEq(); ``` to assert that types `T1` and `T2` are the same. The function does nothing if the assertion is satisfied. If the types are different, the function call will fail to compile, the compiler error message will say that `T1 and T2 are not the same type` and most likely (depending on the compiler) show you the actual values of `T1` and `T2`. This is mainly useful inside template code. **Caveat**: When used inside a member function of a class template or a function template, `StaticAssertTypeEq()` is effective only if the function is instantiated. For example, given: ```c++ template class Foo { public: void Bar() { testing::StaticAssertTypeEq(); } }; ``` the code: ```c++ void Test1() { Foo foo; } ``` will not generate a compiler error, as `Foo::Bar()` is never actually instantiated. Instead, you need: ```c++ void Test2() { Foo foo; foo.Bar(); } ``` to cause a compiler error. ### Assertion Placement You can use assertions in any C++ function. In particular, it doesn't have to be a method of the test fixture class. The one constraint is that assertions that generate a fatal failure (`FAIL*` and `ASSERT_*`) can only be used in void-returning functions. This is a consequence of Google's not using exceptions. By placing it in a non-void function you'll get a confusing compile error like `"error: void value not ignored as it ought to be"` or `"cannot initialize return object of type 'bool' with an rvalue of type 'void'"` or `"error: no viable conversion from 'void' to 'string'"`. If you need to use fatal assertions in a function that returns non-void, one option is to make the function return the value in an out parameter instead. For example, you can rewrite `T2 Foo(T1 x)` to `void Foo(T1 x, T2* result)`. You need to make sure that `*result` contains some sensible value even when the function returns prematurely. As the function now returns `void`, you can use any assertion inside of it. If changing the function's type is not an option, you should just use assertions that generate non-fatal failures, such as `ADD_FAILURE*` and `EXPECT_*`. {: .callout .note} NOTE: Constructors and destructors are not considered void-returning functions, according to the C++ language specification, and so you may not use fatal assertions in them; you'll get a compilation error if you try. Instead, either call `abort` and crash the entire test executable, or put the fatal assertion in a `SetUp`/`TearDown` function; see [constructor/destructor vs. `SetUp`/`TearDown`](faq.md#CtorVsSetUp) {: .callout .warning} WARNING: A fatal assertion in a helper function (private void-returning method) called from a constructor or destructor does not terminate the current test, as your intuition might suggest: it merely returns from the constructor or destructor early, possibly leaving your object in a partially-constructed or partially-destructed state! You almost certainly want to `abort` or use `SetUp`/`TearDown` instead. ## Skipping test execution Related to the assertions `SUCCEED()` and `FAIL()`, you can prevent further test execution at runtime with the `GTEST_SKIP()` macro. This is useful when you need to check for preconditions of the system under test during runtime and skip tests in a meaningful way. `GTEST_SKIP()` can be used in individual test cases or in the `SetUp()` methods of classes derived from either `::testing::Environment` or `::testing::Test`. For example: ```c++ TEST(SkipTest, DoesSkip) { GTEST_SKIP() << "Skipping single test"; EXPECT_EQ(0, 1); // Won't fail; it won't be executed } class SkipFixture : public ::testing::Test { protected: void SetUp() override { GTEST_SKIP() << "Skipping all tests for this fixture"; } }; // Tests for SkipFixture won't be executed. TEST_F(SkipFixture, SkipsOneTest) { EXPECT_EQ(5, 7); // Won't fail } ``` As with assertion macros, you can stream a custom message into `GTEST_SKIP()`. ## Teaching googletest How to Print Your Values When a test assertion such as `EXPECT_EQ` fails, googletest prints the argument values to help you debug. It does this using a user-extensible value printer. This printer knows how to print built-in C++ types, native arrays, STL containers, and any type that supports the `<<` operator. For other types, it prints the raw bytes in the value and hopes that you the user can figure it out. As mentioned earlier, the printer is *extensible*. That means you can teach it to do a better job at printing your particular type than to dump the bytes. To do that, define `<<` for your type: ```c++ #include namespace foo { class Bar { // We want googletest to be able to print instances of this. ... // Create a free inline friend function. friend std::ostream& operator<<(std::ostream& os, const Bar& bar) { return os << bar.DebugString(); // whatever needed to print bar to os } }; // If you can't declare the function in the class it's important that the // << operator is defined in the SAME namespace that defines Bar. C++'s look-up // rules rely on that. std::ostream& operator<<(std::ostream& os, const Bar& bar) { return os << bar.DebugString(); // whatever needed to print bar to os } } // namespace foo ``` Sometimes, this might not be an option: your team may consider it bad style to have a `<<` operator for `Bar`, or `Bar` may already have a `<<` operator that doesn't do what you want (and you cannot change it). If so, you can instead define a `PrintTo()` function like this: ```c++ #include namespace foo { class Bar { ... friend void PrintTo(const Bar& bar, std::ostream* os) { *os << bar.DebugString(); // whatever needed to print bar to os } }; // If you can't declare the function in the class it's important that PrintTo() // is defined in the SAME namespace that defines Bar. C++'s look-up rules rely // on that. void PrintTo(const Bar& bar, std::ostream* os) { *os << bar.DebugString(); // whatever needed to print bar to os } } // namespace foo ``` If you have defined both `<<` and `PrintTo()`, the latter will be used when googletest is concerned. This allows you to customize how the value appears in googletest's output without affecting code that relies on the behavior of its `<<` operator. If you want to print a value `x` using googletest's value printer yourself, just call `::testing::PrintToString(x)`, which returns an `std::string`: ```c++ vector > bar_ints = GetBarIntVector(); EXPECT_TRUE(IsCorrectBarIntVector(bar_ints)) << "bar_ints = " << testing::PrintToString(bar_ints); ``` ## Death Tests In many applications, there are assertions that can cause application failure if a condition is not met. These consistency checks, which ensure that the program is in a known good state, are there to fail at the earliest possible time after some program state is corrupted. If the assertion checks the wrong condition, then the program may proceed in an erroneous state, which could lead to memory corruption, security holes, or worse. Hence it is vitally important to test that such assertion statements work as expected. Since these precondition checks cause the processes to die, we call such tests _death tests_. More generally, any test that checks that a program terminates (except by throwing an exception) in an expected fashion is also a death test. Note that if a piece of code throws an exception, we don't consider it "death" for the purpose of death tests, as the caller of the code could catch the exception and avoid the crash. If you want to verify exceptions thrown by your code, see [Exception Assertions](#ExceptionAssertions). If you want to test `EXPECT_*()/ASSERT_*()` failures in your test code, see ["Catching" Failures](#catching-failures). ### How to Write a Death Test GoogleTest provides assertion macros to support death tests. See [Death Assertions](reference/assertions.md#death) in the Assertions Reference for details. To write a death test, simply use one of the macros inside your test function. For example, ```c++ TEST(MyDeathTest, Foo) { // This death test uses a compound statement. ASSERT_DEATH({ int n = 5; Foo(&n); }, "Error on line .* of Foo()"); } TEST(MyDeathTest, NormalExit) { EXPECT_EXIT(NormalExit(), testing::ExitedWithCode(0), "Success"); } TEST(MyDeathTest, KillProcess) { EXPECT_EXIT(KillProcess(), testing::KilledBySignal(SIGKILL), "Sending myself unblockable signal"); } ``` verifies that: * calling `Foo(5)` causes the process to die with the given error message, * calling `NormalExit()` causes the process to print `"Success"` to stderr and exit with exit code 0, and * calling `KillProcess()` kills the process with signal `SIGKILL`. The test function body may contain other assertions and statements as well, if necessary. Note that a death test only cares about three things: 1. does `statement` abort or exit the process? 2. (in the case of `ASSERT_EXIT` and `EXPECT_EXIT`) does the exit status satisfy `predicate`? Or (in the case of `ASSERT_DEATH` and `EXPECT_DEATH`) is the exit status non-zero? And 3. does the stderr output match `matcher`? In particular, if `statement` generates an `ASSERT_*` or `EXPECT_*` failure, it will **not** cause the death test to fail, as googletest assertions don't abort the process. ### Death Test Naming {: .callout .important} IMPORTANT: We strongly recommend you to follow the convention of naming your **test suite** (not test) `*DeathTest` when it contains a death test, as demonstrated in the above example. The [Death Tests And Threads](#death-tests-and-threads) section below explains why. If a test fixture class is shared by normal tests and death tests, you can use `using` or `typedef` to introduce an alias for the fixture class and avoid duplicating its code: ```c++ class FooTest : public testing::Test { ... }; using FooDeathTest = FooTest; TEST_F(FooTest, DoesThis) { // normal test } TEST_F(FooDeathTest, DoesThat) { // death test } ``` ### Regular Expression Syntax On POSIX systems (e.g. Linux, Cygwin, and Mac), googletest uses the [POSIX extended regular expression](http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html#tag_09_04) syntax. To learn about this syntax, you may want to read this [Wikipedia entry](http://en.wikipedia.org/wiki/Regular_expression#POSIX_Extended_Regular_Expressions). On Windows, googletest uses its own simple regular expression implementation. It lacks many features. For example, we don't support union (`"x|y"`), grouping (`"(xy)"`), brackets (`"[xy]"`), and repetition count (`"x{5,7}"`), among others. Below is what we do support (`A` denotes a literal character, period (`.`), or a single `\\ ` escape sequence; `x` and `y` denote regular expressions.): Expression | Meaning ---------- | -------------------------------------------------------------- `c` | matches any literal character `c` `\\d` | matches any decimal digit `\\D` | matches any character that's not a decimal digit `\\f` | matches `\f` `\\n` | matches `\n` `\\r` | matches `\r` `\\s` | matches any ASCII whitespace, including `\n` `\\S` | matches any character that's not a whitespace `\\t` | matches `\t` `\\v` | matches `\v` `\\w` | matches any letter, `_`, or decimal digit `\\W` | matches any character that `\\w` doesn't match `\\c` | matches any literal character `c`, which must be a punctuation `.` | matches any single character except `\n` `A?` | matches 0 or 1 occurrences of `A` `A*` | matches 0 or many occurrences of `A` `A+` | matches 1 or many occurrences of `A` `^` | matches the beginning of a string (not that of each line) `$` | matches the end of a string (not that of each line) `xy` | matches `x` followed by `y` To help you determine which capability is available on your system, googletest defines macros to govern which regular expression it is using. The macros are: `GTEST_USES_SIMPLE_RE=1` or `GTEST_USES_POSIX_RE=1`. If you want your death tests to work in all cases, you can either `#if` on these macros or use the more limited syntax only. ### How It Works See [Death Assertions](reference/assertions.md#death) in the Assertions Reference. ### Death Tests And Threads The reason for the two death test styles has to do with thread safety. Due to well-known problems with forking in the presence of threads, death tests should be run in a single-threaded context. Sometimes, however, it isn't feasible to arrange that kind of environment. For example, statically-initialized modules may start threads before main is ever reached. Once threads have been created, it may be difficult or impossible to clean them up. googletest has three features intended to raise awareness of threading issues. 1. A warning is emitted if multiple threads are running when a death test is encountered. 2. Test suites with a name ending in "DeathTest" are run before all other tests. 3. It uses `clone()` instead of `fork()` to spawn the child process on Linux (`clone()` is not available on Cygwin and Mac), as `fork()` is more likely to cause the child to hang when the parent process has multiple threads. It's perfectly fine to create threads inside a death test statement; they are executed in a separate process and cannot affect the parent. ### Death Test Styles The "threadsafe" death test style was introduced in order to help mitigate the risks of testing in a possibly multithreaded environment. It trades increased test execution time (potentially dramatically so) for improved thread safety. The automated testing framework does not set the style flag. You can choose a particular style of death tests by setting the flag programmatically: ```c++ GTEST_FLAG_SET(death_test_style, "threadsafe") ``` You can do this in `main()` to set the style for all death tests in the binary, or in individual tests. Recall that flags are saved before running each test and restored afterwards, so you need not do that yourself. For example: ```c++ int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); GTEST_FLAG_SET(death_test_style, "fast"); return RUN_ALL_TESTS(); } TEST(MyDeathTest, TestOne) { GTEST_FLAG_SET(death_test_style, "threadsafe"); // This test is run in the "threadsafe" style: ASSERT_DEATH(ThisShouldDie(), ""); } TEST(MyDeathTest, TestTwo) { // This test is run in the "fast" style: ASSERT_DEATH(ThisShouldDie(), ""); } ``` ### Caveats The `statement` argument of `ASSERT_EXIT()` can be any valid C++ statement. If it leaves the current function via a `return` statement or by throwing an exception, the death test is considered to have failed. Some googletest macros may return from the current function (e.g. `ASSERT_TRUE()`), so be sure to avoid them in `statement`. Since `statement` runs in the child process, any in-memory side effect (e.g. modifying a variable, releasing memory, etc) it causes will *not* be observable in the parent process. In particular, if you release memory in a death test, your program will fail the heap check as the parent process will never see the memory reclaimed. To solve this problem, you can 1. try not to free memory in a death test; 2. free the memory again in the parent process; or 3. do not use the heap checker in your program. Due to an implementation detail, you cannot place multiple death test assertions on the same line; otherwise, compilation will fail with an unobvious error message. Despite the improved thread safety afforded by the "threadsafe" style of death test, thread problems such as deadlock are still possible in the presence of handlers registered with `pthread_atfork(3)`. ## Using Assertions in Sub-routines {: .callout .note} Note: If you want to put a series of test assertions in a subroutine to check for a complex condition, consider using [a custom GMock matcher](gmock_cook_book.md#NewMatchers) instead. This lets you provide a more readable error message in case of failure and avoid all of the issues described below. ### Adding Traces to Assertions If a test sub-routine is called from several places, when an assertion inside it fails, it can be hard to tell which invocation of the sub-routine the failure is from. You can alleviate this problem using extra logging or custom failure messages, but that usually clutters up your tests. A better solution is to use the `SCOPED_TRACE` macro or the `ScopedTrace` utility: ```c++ SCOPED_TRACE(message); ``` ```c++ ScopedTrace trace("file_path", line_number, message); ``` where `message` can be anything streamable to `std::ostream`. `SCOPED_TRACE` macro will cause the current file name, line number, and the given message to be added in every failure message. `ScopedTrace` accepts explicit file name and line number in arguments, which is useful for writing test helpers. The effect will be undone when the control leaves the current lexical scope. For example, ```c++ 10: void Sub1(int n) { 11: EXPECT_EQ(Bar(n), 1); 12: EXPECT_EQ(Bar(n + 1), 2); 13: } 14: 15: TEST(FooTest, Bar) { 16: { 17: SCOPED_TRACE("A"); // This trace point will be included in 18: // every failure in this scope. 19: Sub1(1); 20: } 21: // Now it won't. 22: Sub1(9); 23: } ``` could result in messages like these: ```none path/to/foo_test.cc:11: Failure Value of: Bar(n) Expected: 1 Actual: 2 Google Test trace: path/to/foo_test.cc:17: A path/to/foo_test.cc:12: Failure Value of: Bar(n + 1) Expected: 2 Actual: 3 ``` Without the trace, it would've been difficult to know which invocation of `Sub1()` the two failures come from respectively. (You could add an extra message to each assertion in `Sub1()` to indicate the value of `n`, but that's tedious.) Some tips on using `SCOPED_TRACE`: 1. With a suitable message, it's often enough to use `SCOPED_TRACE` at the beginning of a sub-routine, instead of at each call site. 2. When calling sub-routines inside a loop, make the loop iterator part of the message in `SCOPED_TRACE` such that you can know which iteration the failure is from. 3. Sometimes the line number of the trace point is enough for identifying the particular invocation of a sub-routine. In this case, you don't have to choose a unique message for `SCOPED_TRACE`. You can simply use `""`. 4. You can use `SCOPED_TRACE` in an inner scope when there is one in the outer scope. In this case, all active trace points will be included in the failure messages, in reverse order they are encountered. 5. The trace dump is clickable in Emacs - hit `return` on a line number and you'll be taken to that line in the source file! ### Propagating Fatal Failures A common pitfall when using `ASSERT_*` and `FAIL*` is not understanding that when they fail they only abort the _current function_, not the entire test. For example, the following test will segfault: ```c++ void Subroutine() { // Generates a fatal failure and aborts the current function. ASSERT_EQ(1, 2); // The following won't be executed. ... } TEST(FooTest, Bar) { Subroutine(); // The intended behavior is for the fatal failure // in Subroutine() to abort the entire test. // The actual behavior: the function goes on after Subroutine() returns. int* p = nullptr; *p = 3; // Segfault! } ``` To alleviate this, googletest provides three different solutions. You could use either exceptions, the `(ASSERT|EXPECT)_NO_FATAL_FAILURE` assertions or the `HasFatalFailure()` function. They are described in the following two subsections. #### Asserting on Subroutines with an exception The following code can turn ASSERT-failure into an exception: ```c++ class ThrowListener : public testing::EmptyTestEventListener { void OnTestPartResult(const testing::TestPartResult& result) override { if (result.type() == testing::TestPartResult::kFatalFailure) { throw testing::AssertionException(result); } } }; int main(int argc, char** argv) { ... testing::UnitTest::GetInstance()->listeners().Append(new ThrowListener); return RUN_ALL_TESTS(); } ``` This listener should be added after other listeners if you have any, otherwise they won't see failed `OnTestPartResult`. #### Asserting on Subroutines As shown above, if your test calls a subroutine that has an `ASSERT_*` failure in it, the test will continue after the subroutine returns. This may not be what you want. Often people want fatal failures to propagate like exceptions. For that googletest offers the following macros: Fatal assertion | Nonfatal assertion | Verifies ------------------------------------- | ------------------------------------- | -------- `ASSERT_NO_FATAL_FAILURE(statement);` | `EXPECT_NO_FATAL_FAILURE(statement);` | `statement` doesn't generate any new fatal failures in the current thread. Only failures in the thread that executes the assertion are checked to determine the result of this type of assertions. If `statement` creates new threads, failures in these threads are ignored. Examples: ```c++ ASSERT_NO_FATAL_FAILURE(Foo()); int i; EXPECT_NO_FATAL_FAILURE({ i = Bar(); }); ``` Assertions from multiple threads are currently not supported on Windows. #### Checking for Failures in the Current Test `HasFatalFailure()` in the `::testing::Test` class returns `true` if an assertion in the current test has suffered a fatal failure. This allows functions to catch fatal failures in a sub-routine and return early. ```c++ class Test { public: ... static bool HasFatalFailure(); }; ``` The typical usage, which basically simulates the behavior of a thrown exception, is: ```c++ TEST(FooTest, Bar) { Subroutine(); // Aborts if Subroutine() had a fatal failure. if (HasFatalFailure()) return; // The following won't be executed. ... } ``` If `HasFatalFailure()` is used outside of `TEST()` , `TEST_F()` , or a test fixture, you must add the `::testing::Test::` prefix, as in: ```c++ if (testing::Test::HasFatalFailure()) return; ``` Similarly, `HasNonfatalFailure()` returns `true` if the current test has at least one non-fatal failure, and `HasFailure()` returns `true` if the current test has at least one failure of either kind. ## Logging Additional Information In your test code, you can call `RecordProperty("key", value)` to log additional information, where `value` can be either a string or an `int`. The *last* value recorded for a key will be emitted to the [XML output](#generating-an-xml-report) if you specify one. For example, the test ```c++ TEST_F(WidgetUsageTest, MinAndMaxWidgets) { RecordProperty("MaximumWidgets", ComputeMaxUsage()); RecordProperty("MinimumWidgets", ComputeMinUsage()); } ``` will output XML like this: ```xml ... ... ``` {: .callout .note} > NOTE: > > * `RecordProperty()` is a static member of the `Test` class. Therefore it > needs to be prefixed with `::testing::Test::` if used outside of the > `TEST` body and the test fixture class. > * *`key`* must be a valid XML attribute name, and cannot conflict with the > ones already used by googletest (`name`, `status`, `time`, `classname`, > `type_param`, and `value_param`). > * Calling `RecordProperty()` outside of the lifespan of a test is allowed. > If it's called outside of a test but between a test suite's > `SetUpTestSuite()` and `TearDownTestSuite()` methods, it will be > attributed to the XML element for the test suite. If it's called outside > of all test suites (e.g. in a test environment), it will be attributed to > the top-level XML element. ## Sharing Resources Between Tests in the Same Test Suite googletest creates a new test fixture object for each test in order to make tests independent and easier to debug. However, sometimes tests use resources that are expensive to set up, making the one-copy-per-test model prohibitively expensive. If the tests don't change the resource, there's no harm in their sharing a single resource copy. So, in addition to per-test set-up/tear-down, googletest also supports per-test-suite set-up/tear-down. To use it: 1. In your test fixture class (say `FooTest` ), declare as `static` some member variables to hold the shared resources. 2. Outside your test fixture class (typically just below it), define those member variables, optionally giving them initial values. 3. In the same test fixture class, define a `static void SetUpTestSuite()` function (remember not to spell it as **`SetupTestSuite`** with a small `u`!) to set up the shared resources and a `static void TearDownTestSuite()` function to tear them down. That's it! googletest automatically calls `SetUpTestSuite()` before running the *first test* in the `FooTest` test suite (i.e. before creating the first `FooTest` object), and calls `TearDownTestSuite()` after running the *last test* in it (i.e. after deleting the last `FooTest` object). In between, the tests can use the shared resources. Remember that the test order is undefined, so your code can't depend on a test preceding or following another. Also, the tests must either not modify the state of any shared resource, or, if they do modify the state, they must restore the state to its original value before passing control to the next test. Note that `SetUpTestSuite()` may be called multiple times for a test fixture class that has derived classes, so you should not expect code in the function body to be run only once. Also, derived classes still have access to shared resources defined as static members, so careful consideration is needed when managing shared resources to avoid memory leaks. Here's an example of per-test-suite set-up and tear-down: ```c++ class FooTest : public testing::Test { protected: // Per-test-suite set-up. // Called before the first test in this test suite. // Can be omitted if not needed. static void SetUpTestSuite() { // Avoid reallocating static objects if called in subclasses of FooTest. if (shared_resource_ == nullptr) { shared_resource_ = new ...; } } // Per-test-suite tear-down. // Called after the last test in this test suite. // Can be omitted if not needed. static void TearDownTestSuite() { delete shared_resource_; shared_resource_ = nullptr; } // You can define per-test set-up logic as usual. void SetUp() override { ... } // You can define per-test tear-down logic as usual. void TearDown() override { ... } // Some expensive resource shared by all tests. static T* shared_resource_; }; T* FooTest::shared_resource_ = nullptr; TEST_F(FooTest, Test1) { ... you can refer to shared_resource_ here ... } TEST_F(FooTest, Test2) { ... you can refer to shared_resource_ here ... } ``` {: .callout .note} NOTE: Though the above code declares `SetUpTestSuite()` protected, it may sometimes be necessary to declare it public, such as when using it with `TEST_P`. ## Global Set-Up and Tear-Down Just as you can do set-up and tear-down at the test level and the test suite level, you can also do it at the test program level. Here's how. First, you subclass the `::testing::Environment` class to define a test environment, which knows how to set-up and tear-down: ```c++ class Environment : public ::testing::Environment { public: ~Environment() override {} // Override this to define how to set up the environment. void SetUp() override {} // Override this to define how to tear down the environment. void TearDown() override {} }; ``` Then, you register an instance of your environment class with googletest by calling the `::testing::AddGlobalTestEnvironment()` function: ```c++ Environment* AddGlobalTestEnvironment(Environment* env); ``` Now, when `RUN_ALL_TESTS()` is called, it first calls the `SetUp()` method of each environment object, then runs the tests if none of the environments reported fatal failures and `GTEST_SKIP()` was not called. `RUN_ALL_TESTS()` always calls `TearDown()` with each environment object, regardless of whether or not the tests were run. It's OK to register multiple environment objects. In this suite, their `SetUp()` will be called in the order they are registered, and their `TearDown()` will be called in the reverse order. Note that googletest takes ownership of the registered environment objects. Therefore **do not delete them** by yourself. You should call `AddGlobalTestEnvironment()` before `RUN_ALL_TESTS()` is called, probably in `main()`. If you use `gtest_main`, you need to call this before `main()` starts for it to take effect. One way to do this is to define a global variable like this: ```c++ testing::Environment* const foo_env = testing::AddGlobalTestEnvironment(new FooEnvironment); ``` However, we strongly recommend you to write your own `main()` and call `AddGlobalTestEnvironment()` there, as relying on initialization of global variables makes the code harder to read and may cause problems when you register multiple environments from different translation units and the environments have dependencies among them (remember that the compiler doesn't guarantee the order in which global variables from different translation units are initialized). ## Value-Parameterized Tests *Value-parameterized tests* allow you to test your code with different parameters without writing multiple copies of the same test. This is useful in a number of situations, for example: * You have a piece of code whose behavior is affected by one or more command-line flags. You want to make sure your code performs correctly for various values of those flags. * You want to test different implementations of an OO interface. * You want to test your code over various inputs (a.k.a. data-driven testing). This feature is easy to abuse, so please exercise your good sense when doing it! ### How to Write Value-Parameterized Tests To write value-parameterized tests, first you should define a fixture class. It must be derived from both `testing::Test` and `testing::WithParamInterface` (the latter is a pure interface), where `T` is the type of your parameter values. For convenience, you can just derive the fixture class from `testing::TestWithParam`, which itself is derived from both `testing::Test` and `testing::WithParamInterface`. `T` can be any copyable type. If it's a raw pointer, you are responsible for managing the lifespan of the pointed values. {: .callout .note} NOTE: If your test fixture defines `SetUpTestSuite()` or `TearDownTestSuite()` they must be declared **public** rather than **protected** in order to use `TEST_P`. ```c++ class FooTest : public testing::TestWithParam { // You can implement all the usual fixture class members here. // To access the test parameter, call GetParam() from class // TestWithParam. }; // Or, when you want to add parameters to a pre-existing fixture class: class BaseTest : public testing::Test { ... }; class BarTest : public BaseTest, public testing::WithParamInterface { ... }; ``` Then, use the `TEST_P` macro to define as many test patterns using this fixture as you want. The `_P` suffix is for "parameterized" or "pattern", whichever you prefer to think. ```c++ TEST_P(FooTest, DoesBlah) { // Inside a test, access the test parameter with the GetParam() method // of the TestWithParam class: EXPECT_TRUE(foo.Blah(GetParam())); ... } TEST_P(FooTest, HasBlahBlah) { ... } ``` Finally, you can use the `INSTANTIATE_TEST_SUITE_P` macro to instantiate the test suite with any set of parameters you want. GoogleTest defines a number of functions for generating test parameters—see details at [`INSTANTIATE_TEST_SUITE_P`](reference/testing.md#INSTANTIATE_TEST_SUITE_P) in the Testing Reference. For example, the following statement will instantiate tests from the `FooTest` test suite each with parameter values `"meeny"`, `"miny"`, and `"moe"` using the [`Values`](reference/testing.md#param-generators) parameter generator: ```c++ INSTANTIATE_TEST_SUITE_P(MeenyMinyMoe, FooTest, testing::Values("meeny", "miny", "moe")); ``` {: .callout .note} NOTE: The code above must be placed at global or namespace scope, not at function scope. The first argument to `INSTANTIATE_TEST_SUITE_P` is a unique name for the instantiation of the test suite. The next argument is the name of the test pattern, and the last is the [parameter generator](reference/testing.md#param-generators). You can instantiate a test pattern more than once, so to distinguish different instances of the pattern, the instantiation name is added as a prefix to the actual test suite name. Remember to pick unique prefixes for different instantiations. The tests from the instantiation above will have these names: * `MeenyMinyMoe/FooTest.DoesBlah/0` for `"meeny"` * `MeenyMinyMoe/FooTest.DoesBlah/1` for `"miny"` * `MeenyMinyMoe/FooTest.DoesBlah/2` for `"moe"` * `MeenyMinyMoe/FooTest.HasBlahBlah/0` for `"meeny"` * `MeenyMinyMoe/FooTest.HasBlahBlah/1` for `"miny"` * `MeenyMinyMoe/FooTest.HasBlahBlah/2` for `"moe"` You can use these names in [`--gtest_filter`](#running-a-subset-of-the-tests). The following statement will instantiate all tests from `FooTest` again, each with parameter values `"cat"` and `"dog"` using the [`ValuesIn`](reference/testing.md#param-generators) parameter generator: ```c++ const char* pets[] = {"cat", "dog"}; INSTANTIATE_TEST_SUITE_P(Pets, FooTest, testing::ValuesIn(pets)); ``` The tests from the instantiation above will have these names: * `Pets/FooTest.DoesBlah/0` for `"cat"` * `Pets/FooTest.DoesBlah/1` for `"dog"` * `Pets/FooTest.HasBlahBlah/0` for `"cat"` * `Pets/FooTest.HasBlahBlah/1` for `"dog"` Please note that `INSTANTIATE_TEST_SUITE_P` will instantiate *all* tests in the given test suite, whether their definitions come before or *after* the `INSTANTIATE_TEST_SUITE_P` statement. Additionally, by default, every `TEST_P` without a corresponding `INSTANTIATE_TEST_SUITE_P` causes a failing test in test suite `GoogleTestVerification`. If you have a test suite where that omission is not an error, for example it is in a library that may be linked in for other reasons or where the list of test cases is dynamic and may be empty, then this check can be suppressed by tagging the test suite: ```c++ GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FooTest); ``` You can see [sample7_unittest.cc] and [sample8_unittest.cc] for more examples. [sample7_unittest.cc]: https://github.com/google/googletest/blob/master/googletest/samples/sample7_unittest.cc "Parameterized Test example" [sample8_unittest.cc]: https://github.com/google/googletest/blob/master/googletest/samples/sample8_unittest.cc "Parameterized Test example with multiple parameters" ### Creating Value-Parameterized Abstract Tests In the above, we define and instantiate `FooTest` in the *same* source file. Sometimes you may want to define value-parameterized tests in a library and let other people instantiate them later. This pattern is known as *abstract tests*. As an example of its application, when you are designing an interface you can write a standard suite of abstract tests (perhaps using a factory function as the test parameter) that all implementations of the interface are expected to pass. When someone implements the interface, they can instantiate your suite to get all the interface-conformance tests for free. To define abstract tests, you should organize your code like this: 1. Put the definition of the parameterized test fixture class (e.g. `FooTest`) in a header file, say `foo_param_test.h`. Think of this as *declaring* your abstract tests. 2. Put the `TEST_P` definitions in `foo_param_test.cc`, which includes `foo_param_test.h`. Think of this as *implementing* your abstract tests. Once they are defined, you can instantiate them by including `foo_param_test.h`, invoking `INSTANTIATE_TEST_SUITE_P()`, and depending on the library target that contains `foo_param_test.cc`. You can instantiate the same abstract test suite multiple times, possibly in different source files. ### Specifying Names for Value-Parameterized Test Parameters The optional last argument to `INSTANTIATE_TEST_SUITE_P()` allows the user to specify a function or functor that generates custom test name suffixes based on the test parameters. The function should accept one argument of type `testing::TestParamInfo`, and return `std::string`. `testing::PrintToStringParamName` is a builtin test suffix generator that returns the value of `testing::PrintToString(GetParam())`. It does not work for `std::string` or C strings. {: .callout .note} NOTE: test names must be non-empty, unique, and may only contain ASCII alphanumeric characters. In particular, they [should not contain underscores](faq.md#why-should-test-suite-names-and-test-names-not-contain-underscore) ```c++ class MyTestSuite : public testing::TestWithParam {}; TEST_P(MyTestSuite, MyTest) { std::cout << "Example Test Param: " << GetParam() << std::endl; } INSTANTIATE_TEST_SUITE_P(MyGroup, MyTestSuite, testing::Range(0, 10), testing::PrintToStringParamName()); ``` Providing a custom functor allows for more control over test parameter name generation, especially for types where the automatic conversion does not generate helpful parameter names (e.g. strings as demonstrated above). The following example illustrates this for multiple parameters, an enumeration type and a string, and also demonstrates how to combine generators. It uses a lambda for conciseness: ```c++ enum class MyType { MY_FOO = 0, MY_BAR = 1 }; class MyTestSuite : public testing::TestWithParam> { }; INSTANTIATE_TEST_SUITE_P( MyGroup, MyTestSuite, testing::Combine( testing::Values(MyType::MY_FOO, MyType::MY_BAR), testing::Values("A", "B")), [](const testing::TestParamInfo& info) { std::string name = absl::StrCat( std::get<0>(info.param) == MyType::MY_FOO ? "Foo" : "Bar", std::get<1>(info.param)); absl::c_replace_if(name, [](char c) { return !std::isalnum(c); }, '_'); return name; }); ``` ## Typed Tests Suppose you have multiple implementations of the same interface and want to make sure that all of them satisfy some common requirements. Or, you may have defined several types that are supposed to conform to the same "concept" and you want to verify it. In both cases, you want the same test logic repeated for different types. While you can write one `TEST` or `TEST_F` for each type you want to test (and you may even factor the test logic into a function template that you invoke from the `TEST`), it's tedious and doesn't scale: if you want `m` tests over `n` types, you'll end up writing `m*n` `TEST`s. *Typed tests* allow you to repeat the same test logic over a list of types. You only need to write the test logic once, although you must know the type list when writing typed tests. Here's how you do it: First, define a fixture class template. It should be parameterized by a type. Remember to derive it from `::testing::Test`: ```c++ template class FooTest : public testing::Test { public: ... using List = std::list; static T shared_; T value_; }; ``` Next, associate a list of types with the test suite, which will be repeated for each type in the list: ```c++ using MyTypes = ::testing::Types; TYPED_TEST_SUITE(FooTest, MyTypes); ``` The type alias (`using` or `typedef`) is necessary for the `TYPED_TEST_SUITE` macro to parse correctly. Otherwise the compiler will think that each comma in the type list introduces a new macro argument. Then, use `TYPED_TEST()` instead of `TEST_F()` to define a typed test for this test suite. You can repeat this as many times as you want: ```c++ TYPED_TEST(FooTest, DoesBlah) { // Inside a test, refer to the special name TypeParam to get the type // parameter. Since we are inside a derived class template, C++ requires // us to visit the members of FooTest via 'this'. TypeParam n = this->value_; // To visit static members of the fixture, add the 'TestFixture::' // prefix. n += TestFixture::shared_; // To refer to typedefs in the fixture, add the 'typename TestFixture::' // prefix. The 'typename' is required to satisfy the compiler. typename TestFixture::List values; values.push_back(n); ... } TYPED_TEST(FooTest, HasPropertyA) { ... } ``` You can see [sample6_unittest.cc] for a complete example. [sample6_unittest.cc]: https://github.com/google/googletest/blob/master/googletest/samples/sample6_unittest.cc "Typed Test example" ## Type-Parameterized Tests *Type-parameterized tests* are like typed tests, except that they don't require you to know the list of types ahead of time. Instead, you can define the test logic first and instantiate it with different type lists later. You can even instantiate it more than once in the same program. If you are designing an interface or concept, you can define a suite of type-parameterized tests to verify properties that any valid implementation of the interface/concept should have. Then, the author of each implementation can just instantiate the test suite with their type to verify that it conforms to the requirements, without having to write similar tests repeatedly. Here's an example: First, define a fixture class template, as we did with typed tests: ```c++ template class FooTest : public testing::Test { ... }; ``` Next, declare that you will define a type-parameterized test suite: ```c++ TYPED_TEST_SUITE_P(FooTest); ``` Then, use `TYPED_TEST_P()` to define a type-parameterized test. You can repeat this as many times as you want: ```c++ TYPED_TEST_P(FooTest, DoesBlah) { // Inside a test, refer to TypeParam to get the type parameter. TypeParam n = 0; ... } TYPED_TEST_P(FooTest, HasPropertyA) { ... } ``` Now the tricky part: you need to register all test patterns using the `REGISTER_TYPED_TEST_SUITE_P` macro before you can instantiate them. The first argument of the macro is the test suite name; the rest are the names of the tests in this test suite: ```c++ REGISTER_TYPED_TEST_SUITE_P(FooTest, DoesBlah, HasPropertyA); ``` Finally, you are free to instantiate the pattern with the types you want. If you put the above code in a header file, you can `#include` it in multiple C++ source files and instantiate it multiple times. ```c++ using MyTypes = ::testing::Types; INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); ``` To distinguish different instances of the pattern, the first argument to the `INSTANTIATE_TYPED_TEST_SUITE_P` macro is a prefix that will be added to the actual test suite name. Remember to pick unique prefixes for different instances. In the special case where the type list contains only one type, you can write that type directly without `::testing::Types<...>`, like this: ```c++ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, int); ``` You can see [sample6_unittest.cc] for a complete example. ## Testing Private Code If you change your software's internal implementation, your tests should not break as long as the change is not observable by users. Therefore, **per the black-box testing principle, most of the time you should test your code through its public interfaces.** **If you still find yourself needing to test internal implementation code, consider if there's a better design.** The desire to test internal implementation is often a sign that the class is doing too much. Consider extracting an implementation class, and testing it. Then use that implementation class in the original class. If you absolutely have to test non-public interface code though, you can. There are two cases to consider: * Static functions ( *not* the same as static member functions!) or unnamed namespaces, and * Private or protected class members To test them, we use the following special techniques: * Both static functions and definitions/declarations in an unnamed namespace are only visible within the same translation unit. To test them, you can `#include` the entire `.cc` file being tested in your `*_test.cc` file. (#including `.cc` files is not a good way to reuse code - you should not do this in production code!) However, a better approach is to move the private code into the `foo::internal` namespace, where `foo` is the namespace your project normally uses, and put the private declarations in a `*-internal.h` file. Your production `.cc` files and your tests are allowed to include this internal header, but your clients are not. This way, you can fully test your internal implementation without leaking it to your clients. * Private class members are only accessible from within the class or by friends. To access a class' private members, you can declare your test fixture as a friend to the class and define accessors in your fixture. Tests using the fixture can then access the private members of your production class via the accessors in the fixture. Note that even though your fixture is a friend to your production class, your tests are not automatically friends to it, as they are technically defined in sub-classes of the fixture. Another way to test private members is to refactor them into an implementation class, which is then declared in a `*-internal.h` file. Your clients aren't allowed to include this header but your tests can. Such is called the [Pimpl](https://www.gamedev.net/articles/programming/general-and-gameplay-programming/the-c-pimpl-r1794/) (Private Implementation) idiom. Or, you can declare an individual test as a friend of your class by adding this line in the class body: ```c++ FRIEND_TEST(TestSuiteName, TestName); ``` For example, ```c++ // foo.h class Foo { ... private: FRIEND_TEST(FooTest, BarReturnsZeroOnNull); int Bar(void* x); }; // foo_test.cc ... TEST(FooTest, BarReturnsZeroOnNull) { Foo foo; EXPECT_EQ(foo.Bar(NULL), 0); // Uses Foo's private member Bar(). } ``` Pay special attention when your class is defined in a namespace. If you want your test fixtures and tests to be friends of your class, then they must be defined in the exact same namespace (no anonymous or inline namespaces). For example, if the code to be tested looks like: ```c++ namespace my_namespace { class Foo { friend class FooTest; FRIEND_TEST(FooTest, Bar); FRIEND_TEST(FooTest, Baz); ... definition of the class Foo ... }; } // namespace my_namespace ``` Your test code should be something like: ```c++ namespace my_namespace { class FooTest : public testing::Test { protected: ... }; TEST_F(FooTest, Bar) { ... } TEST_F(FooTest, Baz) { ... } } // namespace my_namespace ``` ## "Catching" Failures If you are building a testing utility on top of googletest, you'll want to test your utility. What framework would you use to test it? googletest, of course. The challenge is to verify that your testing utility reports failures correctly. In frameworks that report a failure by throwing an exception, you could catch the exception and assert on it. But googletest doesn't use exceptions, so how do we test that a piece of code generates an expected failure? `"gtest/gtest-spi.h"` contains some constructs to do this. After #including this header, you can use ```c++ EXPECT_FATAL_FAILURE(statement, substring); ``` to assert that `statement` generates a fatal (e.g. `ASSERT_*`) failure in the current thread whose message contains the given `substring`, or use ```c++ EXPECT_NONFATAL_FAILURE(statement, substring); ``` if you are expecting a non-fatal (e.g. `EXPECT_*`) failure. Only failures in the current thread are checked to determine the result of this type of expectations. If `statement` creates new threads, failures in these threads are also ignored. If you want to catch failures in other threads as well, use one of the following macros instead: ```c++ EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substring); EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substring); ``` {: .callout .note} NOTE: Assertions from multiple threads are currently not supported on Windows. For technical reasons, there are some caveats: 1. You cannot stream a failure message to either macro. 2. `statement` in `EXPECT_FATAL_FAILURE{_ON_ALL_THREADS}()` cannot reference local non-static variables or non-static members of `this` object. 3. `statement` in `EXPECT_FATAL_FAILURE{_ON_ALL_THREADS}()` cannot return a value. ## Registering tests programmatically The `TEST` macros handle the vast majority of all use cases, but there are few where runtime registration logic is required. For those cases, the framework provides the `::testing::RegisterTest` that allows callers to register arbitrary tests dynamically. This is an advanced API only to be used when the `TEST` macros are insufficient. The macros should be preferred when possible, as they avoid most of the complexity of calling this function. It provides the following signature: ```c++ template TestInfo* RegisterTest(const char* test_suite_name, const char* test_name, const char* type_param, const char* value_param, const char* file, int line, Factory factory); ``` The `factory` argument is a factory callable (move-constructible) object or function pointer that creates a new instance of the Test object. It handles ownership to the caller. The signature of the callable is `Fixture*()`, where `Fixture` is the test fixture class for the test. All tests registered with the same `test_suite_name` must return the same fixture type. This is checked at runtime. The framework will infer the fixture class from the factory and will call the `SetUpTestSuite` and `TearDownTestSuite` for it. Must be called before `RUN_ALL_TESTS()` is invoked, otherwise behavior is undefined. Use case example: ```c++ class MyFixture : public testing::Test { public: // All of these optional, just like in regular macro usage. static void SetUpTestSuite() { ... } static void TearDownTestSuite() { ... } void SetUp() override { ... } void TearDown() override { ... } }; class MyTest : public MyFixture { public: explicit MyTest(int data) : data_(data) {} void TestBody() override { ... } private: int data_; }; void RegisterMyTests(const std::vector& values) { for (int v : values) { testing::RegisterTest( "MyFixture", ("Test" + std::to_string(v)).c_str(), nullptr, std::to_string(v).c_str(), __FILE__, __LINE__, // Important to use the fixture type as the return type here. [=]() -> MyFixture* { return new MyTest(v); }); } } ... int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); std::vector values_to_test = LoadValuesFromConfig(); RegisterMyTests(values_to_test); ... return RUN_ALL_TESTS(); } ``` ## Getting the Current Test's Name Sometimes a function may need to know the name of the currently running test. For example, you may be using the `SetUp()` method of your test fixture to set the golden file name based on which test is running. The [`TestInfo`](reference/testing.md#TestInfo) class has this information. To obtain a `TestInfo` object for the currently running test, call `current_test_info()` on the [`UnitTest`](reference/testing.md#UnitTest) singleton object: ```c++ // Gets information about the currently running test. // Do NOT delete the returned object - it's managed by the UnitTest class. const testing::TestInfo* const test_info = testing::UnitTest::GetInstance()->current_test_info(); printf("We are in test %s of test suite %s.\n", test_info->name(), test_info->test_suite_name()); ``` `current_test_info()` returns a null pointer if no test is running. In particular, you cannot find the test suite name in `SetUpTestSuite()`, `TearDownTestSuite()` (where you know the test suite name implicitly), or functions called from them. ## Extending googletest by Handling Test Events googletest provides an **event listener API** to let you receive notifications about the progress of a test program and test failures. The events you can listen to include the start and end of the test program, a test suite, or a test method, among others. You may use this API to augment or replace the standard console output, replace the XML output, or provide a completely different form of output, such as a GUI or a database. You can also use test events as checkpoints to implement a resource leak checker, for example. ### Defining Event Listeners To define a event listener, you subclass either [`testing::TestEventListener`](reference/testing.md#TestEventListener) or [`testing::EmptyTestEventListener`](reference/testing.md#EmptyTestEventListener) The former is an (abstract) interface, where *each pure virtual method can be overridden to handle a test event* (For example, when a test starts, the `OnTestStart()` method will be called.). The latter provides an empty implementation of all methods in the interface, such that a subclass only needs to override the methods it cares about. When an event is fired, its context is passed to the handler function as an argument. The following argument types are used: * UnitTest reflects the state of the entire test program, * TestSuite has information about a test suite, which can contain one or more tests, * TestInfo contains the state of a test, and * TestPartResult represents the result of a test assertion. An event handler function can examine the argument it receives to find out interesting information about the event and the test program's state. Here's an example: ```c++ class MinimalistPrinter : public testing::EmptyTestEventListener { // Called before a test starts. void OnTestStart(const testing::TestInfo& test_info) override { printf("*** Test %s.%s starting.\n", test_info.test_suite_name(), test_info.name()); } // Called after a failed assertion or a SUCCESS(). void OnTestPartResult(const testing::TestPartResult& test_part_result) override { printf("%s in %s:%d\n%s\n", test_part_result.failed() ? "*** Failure" : "Success", test_part_result.file_name(), test_part_result.line_number(), test_part_result.summary()); } // Called after a test ends. void OnTestEnd(const testing::TestInfo& test_info) override { printf("*** Test %s.%s ending.\n", test_info.test_suite_name(), test_info.name()); } }; ``` ### Using Event Listeners To use the event listener you have defined, add an instance of it to the googletest event listener list (represented by class [`TestEventListeners`](reference/testing.md#TestEventListeners) - note the "s" at the end of the name) in your `main()` function, before calling `RUN_ALL_TESTS()`: ```c++ int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); // Gets hold of the event listener list. testing::TestEventListeners& listeners = testing::UnitTest::GetInstance()->listeners(); // Adds a listener to the end. googletest takes the ownership. listeners.Append(new MinimalistPrinter); return RUN_ALL_TESTS(); } ``` There's only one problem: the default test result printer is still in effect, so its output will mingle with the output from your minimalist printer. To suppress the default printer, just release it from the event listener list and delete it. You can do so by adding one line: ```c++ ... delete listeners.Release(listeners.default_result_printer()); listeners.Append(new MinimalistPrinter); return RUN_ALL_TESTS(); ``` Now, sit back and enjoy a completely different output from your tests. For more details, see [sample9_unittest.cc]. [sample9_unittest.cc]: https://github.com/google/googletest/blob/master/googletest/samples/sample9_unittest.cc "Event listener example" You may append more than one listener to the list. When an `On*Start()` or `OnTestPartResult()` event is fired, the listeners will receive it in the order they appear in the list (since new listeners are added to the end of the list, the default text printer and the default XML generator will receive the event first). An `On*End()` event will be received by the listeners in the *reverse* order. This allows output by listeners added later to be framed by output from listeners added earlier. ### Generating Failures in Listeners You may use failure-raising macros (`EXPECT_*()`, `ASSERT_*()`, `FAIL()`, etc) when processing an event. There are some restrictions: 1. You cannot generate any failure in `OnTestPartResult()` (otherwise it will cause `OnTestPartResult()` to be called recursively). 2. A listener that handles `OnTestPartResult()` is not allowed to generate any failure. When you add listeners to the listener list, you should put listeners that handle `OnTestPartResult()` *before* listeners that can generate failures. This ensures that failures generated by the latter are attributed to the right test by the former. See [sample10_unittest.cc] for an example of a failure-raising listener. [sample10_unittest.cc]: https://github.com/google/googletest/blob/master/googletest/samples/sample10_unittest.cc "Failure-raising listener example" ## Running Test Programs: Advanced Options googletest test programs are ordinary executables. Once built, you can run them directly and affect their behavior via the following environment variables and/or command line flags. For the flags to work, your programs must call `::testing::InitGoogleTest()` before calling `RUN_ALL_TESTS()`. To see a list of supported flags and their usage, please run your test program with the `--help` flag. You can also use `-h`, `-?`, or `/?` for short. If an option is specified both by an environment variable and by a flag, the latter takes precedence. ### Selecting Tests #### Listing Test Names Sometimes it is necessary to list the available tests in a program before running them so that a filter may be applied if needed. Including the flag `--gtest_list_tests` overrides all other flags and lists tests in the following format: ```none TestSuite1. TestName1 TestName2 TestSuite2. TestName ``` None of the tests listed are actually run if the flag is provided. There is no corresponding environment variable for this flag. #### Running a Subset of the Tests By default, a googletest program runs all tests the user has defined. Sometimes, you want to run only a subset of the tests (e.g. for debugging or quickly verifying a change). If you set the `GTEST_FILTER` environment variable or the `--gtest_filter` flag to a filter string, googletest will only run the tests whose full names (in the form of `TestSuiteName.TestName`) match the filter. The format of a filter is a '`:`'-separated list of wildcard patterns (called the *positive patterns*) optionally followed by a '`-`' and another '`:`'-separated pattern list (called the *negative patterns*). A test matches the filter if and only if it matches any of the positive patterns but does not match any of the negative patterns. A pattern may contain `'*'` (matches any string) or `'?'` (matches any single character). For convenience, the filter `'*-NegativePatterns'` can be also written as `'-NegativePatterns'`. For example: * `./foo_test` Has no flag, and thus runs all its tests. * `./foo_test --gtest_filter=*` Also runs everything, due to the single match-everything `*` value. * `./foo_test --gtest_filter=FooTest.*` Runs everything in test suite `FooTest` . * `./foo_test --gtest_filter=*Null*:*Constructor*` Runs any test whose full name contains either `"Null"` or `"Constructor"` . * `./foo_test --gtest_filter=-*DeathTest.*` Runs all non-death tests. * `./foo_test --gtest_filter=FooTest.*-FooTest.Bar` Runs everything in test suite `FooTest` except `FooTest.Bar`. * `./foo_test --gtest_filter=FooTest.*:BarTest.*-FooTest.Bar:BarTest.Foo` Runs everything in test suite `FooTest` except `FooTest.Bar` and everything in test suite `BarTest` except `BarTest.Foo`. #### Stop test execution upon first failure By default, a googletest program runs all tests the user has defined. In some cases (e.g. iterative test development & execution) it may be desirable stop test execution upon first failure (trading improved latency for completeness). If `GTEST_FAIL_FAST` environment variable or `--gtest_fail_fast` flag is set, the test runner will stop execution as soon as the first test failure is found. #### Temporarily Disabling Tests If you have a broken test that you cannot fix right away, you can add the `DISABLED_` prefix to its name. This will exclude it from execution. This is better than commenting out the code or using `#if 0`, as disabled tests are still compiled (and thus won't rot). If you need to disable all tests in a test suite, you can either add `DISABLED_` to the front of the name of each test, or alternatively add it to the front of the test suite name. For example, the following tests won't be run by googletest, even though they will still be compiled: ```c++ // Tests that Foo does Abc. TEST(FooTest, DISABLED_DoesAbc) { ... } class DISABLED_BarTest : public testing::Test { ... }; // Tests that Bar does Xyz. TEST_F(DISABLED_BarTest, DoesXyz) { ... } ``` {: .callout .note} NOTE: This feature should only be used for temporary pain-relief. You still have to fix the disabled tests at a later date. As a reminder, googletest will print a banner warning you if a test program contains any disabled tests. {: .callout .tip} TIP: You can easily count the number of disabled tests you have using `grep`. This number can be used as a metric for improving your test quality. #### Temporarily Enabling Disabled Tests To include disabled tests in test execution, just invoke the test program with the `--gtest_also_run_disabled_tests` flag or set the `GTEST_ALSO_RUN_DISABLED_TESTS` environment variable to a value other than `0`. You can combine this with the `--gtest_filter` flag to further select which disabled tests to run. ### Repeating the Tests Once in a while you'll run into a test whose result is hit-or-miss. Perhaps it will fail only 1% of the time, making it rather hard to reproduce the bug under a debugger. This can be a major source of frustration. The `--gtest_repeat` flag allows you to repeat all (or selected) test methods in a program many times. Hopefully, a flaky test will eventually fail and give you a chance to debug. Here's how to use it: ```none $ foo_test --gtest_repeat=1000 Repeat foo_test 1000 times and don't stop at failures. $ foo_test --gtest_repeat=-1 A negative count means repeating forever. $ foo_test --gtest_repeat=1000 --gtest_break_on_failure Repeat foo_test 1000 times, stopping at the first failure. This is especially useful when running under a debugger: when the test fails, it will drop into the debugger and you can then inspect variables and stacks. $ foo_test --gtest_repeat=1000 --gtest_filter=FooBar.* Repeat the tests whose name matches the filter 1000 times. ``` If your test program contains [global set-up/tear-down](#global-set-up-and-tear-down) code, it will be repeated in each iteration as well, as the flakiness may be in it. You can also specify the repeat count by setting the `GTEST_REPEAT` environment variable. ### Shuffling the Tests You can specify the `--gtest_shuffle` flag (or set the `GTEST_SHUFFLE` environment variable to `1`) to run the tests in a program in a random order. This helps to reveal bad dependencies between tests. By default, googletest uses a random seed calculated from the current time. Therefore you'll get a different order every time. The console output includes the random seed value, such that you can reproduce an order-related test failure later. To specify the random seed explicitly, use the `--gtest_random_seed=SEED` flag (or set the `GTEST_RANDOM_SEED` environment variable), where `SEED` is an integer in the range [0, 99999]. The seed value 0 is special: it tells googletest to do the default behavior of calculating the seed from the current time. If you combine this with `--gtest_repeat=N`, googletest will pick a different random seed and re-shuffle the tests in each iteration. ### Distributing Test Functions to Multiple Machines If you have more than one machine you can use to run a test program, you might want to run the test functions in parallel and get the result faster. We call this technique *sharding*, where each machine is called a *shard*. GoogleTest is compatible with test sharding. To take advantage of this feature, your test runner (not part of GoogleTest) needs to do the following: 1. Allocate a number of machines (shards) to run the tests. 1. On each shard, set the `GTEST_TOTAL_SHARDS` environment variable to the total number of shards. It must be the same for all shards. 1. On each shard, set the `GTEST_SHARD_INDEX` environment variable to the index of the shard. Different shards must be assigned different indices, which must be in the range `[0, GTEST_TOTAL_SHARDS - 1]`. 1. Run the same test program on all shards. When GoogleTest sees the above two environment variables, it will select a subset of the test functions to run. Across all shards, each test function in the program will be run exactly once. 1. Wait for all shards to finish, then collect and report the results. Your project may have tests that were written without GoogleTest and thus don't understand this protocol. In order for your test runner to figure out which test supports sharding, it can set the environment variable `GTEST_SHARD_STATUS_FILE` to a non-existent file path. If a test program supports sharding, it will create this file to acknowledge that fact; otherwise it will not create it. The actual contents of the file are not important at this time, although we may put some useful information in it in the future. Here's an example to make it clear. Suppose you have a test program `foo_test` that contains the following 5 test functions: ``` TEST(A, V) TEST(A, W) TEST(B, X) TEST(B, Y) TEST(B, Z) ``` Suppose you have 3 machines at your disposal. To run the test functions in parallel, you would set `GTEST_TOTAL_SHARDS` to 3 on all machines, and set `GTEST_SHARD_INDEX` to 0, 1, and 2 on the machines respectively. Then you would run the same `foo_test` on each machine. GoogleTest reserves the right to change how the work is distributed across the shards, but here's one possible scenario: * Machine #0 runs `A.V` and `B.X`. * Machine #1 runs `A.W` and `B.Y`. * Machine #2 runs `B.Z`. ### Controlling Test Output #### Colored Terminal Output googletest can use colors in its terminal output to make it easier to spot the important information:
    ...
    [----------] 1 test from FooTest
    [ RUN      ] FooTest.DoesAbc
    [       OK ] FooTest.DoesAbc
    [----------] 2 tests from BarTest
    [ RUN      ] BarTest.HasXyzProperty
    [       OK ] BarTest.HasXyzProperty
    [ RUN      ] BarTest.ReturnsTrueOnSuccess
    ... some error messages ...
    [   FAILED ] BarTest.ReturnsTrueOnSuccess
    ...
    [==========] 30 tests from 14 test suites ran.
    [   PASSED ] 28 tests.
    [   FAILED ] 2 tests, listed below:
    [   FAILED ] BarTest.ReturnsTrueOnSuccess
    [   FAILED ] AnotherTest.DoesXyz
    
     2 FAILED TESTS
    
    You can set the `GTEST_COLOR` environment variable or the `--gtest_color` command line flag to `yes`, `no`, or `auto` (the default) to enable colors, disable colors, or let googletest decide. When the value is `auto`, googletest will use colors if and only if the output goes to a terminal and (on non-Windows platforms) the `TERM` environment variable is set to `xterm` or `xterm-color`. #### Suppressing test passes By default, googletest prints 1 line of output for each test, indicating if it passed or failed. To show only test failures, run the test program with `--gtest_brief=1`, or set the GTEST_BRIEF environment variable to `1`. #### Suppressing the Elapsed Time By default, googletest prints the time it takes to run each test. To disable that, run the test program with the `--gtest_print_time=0` command line flag, or set the GTEST_PRINT_TIME environment variable to `0`. #### Suppressing UTF-8 Text Output In case of assertion failures, googletest prints expected and actual values of type `string` both as hex-encoded strings as well as in readable UTF-8 text if they contain valid non-ASCII UTF-8 characters. If you want to suppress the UTF-8 text because, for example, you don't have an UTF-8 compatible output medium, run the test program with `--gtest_print_utf8=0` or set the `GTEST_PRINT_UTF8` environment variable to `0`. #### Generating an XML Report googletest can emit a detailed XML report to a file in addition to its normal textual output. The report contains the duration of each test, and thus can help you identify slow tests. To generate the XML report, set the `GTEST_OUTPUT` environment variable or the `--gtest_output` flag to the string `"xml:path_to_output_file"`, which will create the file at the given location. You can also just use the string `"xml"`, in which case the output can be found in the `test_detail.xml` file in the current directory. If you specify a directory (for example, `"xml:output/directory/"` on Linux or `"xml:output\directory\"` on Windows), googletest will create the XML file in that directory, named after the test executable (e.g. `foo_test.xml` for test program `foo_test` or `foo_test.exe`). If the file already exists (perhaps left over from a previous run), googletest will pick a different name (e.g. `foo_test_1.xml`) to avoid overwriting it. The report is based on the `junitreport` Ant task. Since that format was originally intended for Java, a little interpretation is required to make it apply to googletest tests, as shown here: ```xml ``` * The root `` element corresponds to the entire test program. * `` elements correspond to googletest test suites. * `` elements correspond to googletest test functions. For instance, the following program ```c++ TEST(MathTest, Addition) { ... } TEST(MathTest, Subtraction) { ... } TEST(LogicTest, NonContradiction) { ... } ``` could generate this report: ```xml ... ... ``` Things to note: * The `tests` attribute of a `` or `` element tells how many test functions the googletest program or test suite contains, while the `failures` attribute tells how many of them failed. * The `time` attribute expresses the duration of the test, test suite, or entire test program in seconds. * The `timestamp` attribute records the local date and time of the test execution. * Each `` element corresponds to a single failed googletest assertion. #### Generating a JSON Report googletest can also emit a JSON report as an alternative format to XML. To generate the JSON report, set the `GTEST_OUTPUT` environment variable or the `--gtest_output` flag to the string `"json:path_to_output_file"`, which will create the file at the given location. You can also just use the string `"json"`, in which case the output can be found in the `test_detail.json` file in the current directory. The report format conforms to the following JSON Schema: ```json { "$schema": "http://json-schema.org/schema#", "type": "object", "definitions": { "TestCase": { "type": "object", "properties": { "name": { "type": "string" }, "tests": { "type": "integer" }, "failures": { "type": "integer" }, "disabled": { "type": "integer" }, "time": { "type": "string" }, "testsuite": { "type": "array", "items": { "$ref": "#/definitions/TestInfo" } } } }, "TestInfo": { "type": "object", "properties": { "name": { "type": "string" }, "status": { "type": "string", "enum": ["RUN", "NOTRUN"] }, "time": { "type": "string" }, "classname": { "type": "string" }, "failures": { "type": "array", "items": { "$ref": "#/definitions/Failure" } } } }, "Failure": { "type": "object", "properties": { "failures": { "type": "string" }, "type": { "type": "string" } } } }, "properties": { "tests": { "type": "integer" }, "failures": { "type": "integer" }, "disabled": { "type": "integer" }, "errors": { "type": "integer" }, "timestamp": { "type": "string", "format": "date-time" }, "time": { "type": "string" }, "name": { "type": "string" }, "testsuites": { "type": "array", "items": { "$ref": "#/definitions/TestCase" } } } } ``` The report uses the format that conforms to the following Proto3 using the [JSON encoding](https://developers.google.com/protocol-buffers/docs/proto3#json): ```proto syntax = "proto3"; package googletest; import "google/protobuf/timestamp.proto"; import "google/protobuf/duration.proto"; message UnitTest { int32 tests = 1; int32 failures = 2; int32 disabled = 3; int32 errors = 4; google.protobuf.Timestamp timestamp = 5; google.protobuf.Duration time = 6; string name = 7; repeated TestCase testsuites = 8; } message TestCase { string name = 1; int32 tests = 2; int32 failures = 3; int32 disabled = 4; int32 errors = 5; google.protobuf.Duration time = 6; repeated TestInfo testsuite = 7; } message TestInfo { string name = 1; enum Status { RUN = 0; NOTRUN = 1; } Status status = 2; google.protobuf.Duration time = 3; string classname = 4; message Failure { string failures = 1; string type = 2; } repeated Failure failures = 5; } ``` For instance, the following program ```c++ TEST(MathTest, Addition) { ... } TEST(MathTest, Subtraction) { ... } TEST(LogicTest, NonContradiction) { ... } ``` could generate this report: ```json { "tests": 3, "failures": 1, "errors": 0, "time": "0.035s", "timestamp": "2011-10-31T18:52:42Z", "name": "AllTests", "testsuites": [ { "name": "MathTest", "tests": 2, "failures": 1, "errors": 0, "time": "0.015s", "testsuite": [ { "name": "Addition", "status": "RUN", "time": "0.007s", "classname": "", "failures": [ { "message": "Value of: add(1, 1)\n Actual: 3\nExpected: 2", "type": "" }, { "message": "Value of: add(1, -1)\n Actual: 1\nExpected: 0", "type": "" } ] }, { "name": "Subtraction", "status": "RUN", "time": "0.005s", "classname": "" } ] }, { "name": "LogicTest", "tests": 1, "failures": 0, "errors": 0, "time": "0.005s", "testsuite": [ { "name": "NonContradiction", "status": "RUN", "time": "0.005s", "classname": "" } ] } ] } ``` {: .callout .important} IMPORTANT: The exact format of the JSON document is subject to change. ### Controlling How Failures Are Reported #### Detecting Test Premature Exit Google Test implements the _premature-exit-file_ protocol for test runners to catch any kind of unexpected exits of test programs. Upon start, Google Test creates the file which will be automatically deleted after all work has been finished. Then, the test runner can check if this file exists. In case the file remains undeleted, the inspected test has exited prematurely. This feature is enabled only if the `TEST_PREMATURE_EXIT_FILE` environment variable has been set. #### Turning Assertion Failures into Break-Points When running test programs under a debugger, it's very convenient if the debugger can catch an assertion failure and automatically drop into interactive mode. googletest's *break-on-failure* mode supports this behavior. To enable it, set the `GTEST_BREAK_ON_FAILURE` environment variable to a value other than `0`. Alternatively, you can use the `--gtest_break_on_failure` command line flag. #### Disabling Catching Test-Thrown Exceptions googletest can be used either with or without exceptions enabled. If a test throws a C++ exception or (on Windows) a structured exception (SEH), by default googletest catches it, reports it as a test failure, and continues with the next test method. This maximizes the coverage of a test run. Also, on Windows an uncaught exception will cause a pop-up window, so catching the exceptions allows you to run the tests automatically. When debugging the test failures, however, you may instead want the exceptions to be handled by the debugger, such that you can examine the call stack when an exception is thrown. To achieve that, set the `GTEST_CATCH_EXCEPTIONS` environment variable to `0`, or use the `--gtest_catch_exceptions=0` flag when running the tests. ### Sanitizer Integration The [Undefined Behavior Sanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html), [Address Sanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizer), and [Thread Sanitizer](https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual) all provide weak functions that you can override to trigger explicit failures when they detect sanitizer errors, such as creating a reference from `nullptr`. To override these functions, place definitions for them in a source file that you compile as part of your main binary: ``` extern "C" { void __ubsan_on_report() { FAIL() << "Encountered an undefined behavior sanitizer error"; } void __asan_on_error() { FAIL() << "Encountered an address sanitizer error"; } void __tsan_on_report() { FAIL() << "Encountered a thread sanitizer error"; } } // extern "C" ``` After compiling your project with one of the sanitizers enabled, if a particular test triggers a sanitizer error, googletest will report that it failed. asymptote-3.05/LspCpp/third_party/uri/deps/docs/gmock_cook_book.md0000644000000000000000000043316615031566105024066 0ustar rootroot# gMock Cookbook You can find recipes for using gMock here. If you haven't yet, please read [the dummy guide](gmock_for_dummies.md) first to make sure you understand the basics. {: .callout .note} **Note:** gMock lives in the `testing` name space. For readability, it is recommended to write `using ::testing::Foo;` once in your file before using the name `Foo` defined by gMock. We omit such `using` statements in this section for brevity, but you should do it in your own code. ## Creating Mock Classes Mock classes are defined as normal classes, using the `MOCK_METHOD` macro to generate mocked methods. The macro gets 3 or 4 parameters: ```cpp class MyMock { public: MOCK_METHOD(ReturnType, MethodName, (Args...)); MOCK_METHOD(ReturnType, MethodName, (Args...), (Specs...)); }; ``` The first 3 parameters are simply the method declaration, split into 3 parts. The 4th parameter accepts a closed list of qualifiers, which affect the generated method: * **`const`** - Makes the mocked method a `const` method. Required if overriding a `const` method. * **`override`** - Marks the method with `override`. Recommended if overriding a `virtual` method. * **`noexcept`** - Marks the method with `noexcept`. Required if overriding a `noexcept` method. * **`Calltype(...)`** - Sets the call type for the method (e.g. to `STDMETHODCALLTYPE`), useful in Windows. * **`ref(...)`** - Marks the method with the reference qualification specified. Required if overriding a method that has reference qualifications. Eg `ref(&)` or `ref(&&)`. ### Dealing with unprotected commas Unprotected commas, i.e. commas which are not surrounded by parentheses, prevent `MOCK_METHOD` from parsing its arguments correctly: {: .bad} ```cpp class MockFoo { public: MOCK_METHOD(std::pair, GetPair, ()); // Won't compile! MOCK_METHOD(bool, CheckMap, (std::map, bool)); // Won't compile! }; ``` Solution 1 - wrap with parentheses: {: .good} ```cpp class MockFoo { public: MOCK_METHOD((std::pair), GetPair, ()); MOCK_METHOD(bool, CheckMap, ((std::map), bool)); }; ``` Note that wrapping a return or argument type with parentheses is, in general, invalid C++. `MOCK_METHOD` removes the parentheses. Solution 2 - define an alias: {: .good} ```cpp class MockFoo { public: using BoolAndInt = std::pair; MOCK_METHOD(BoolAndInt, GetPair, ()); using MapIntDouble = std::map; MOCK_METHOD(bool, CheckMap, (MapIntDouble, bool)); }; ``` ### Mocking Private or Protected Methods You must always put a mock method definition (`MOCK_METHOD`) in a `public:` section of the mock class, regardless of the method being mocked being `public`, `protected`, or `private` in the base class. This allows `ON_CALL` and `EXPECT_CALL` to reference the mock function from outside of the mock class. (Yes, C++ allows a subclass to change the access level of a virtual function in the base class.) Example: ```cpp class Foo { public: ... virtual bool Transform(Gadget* g) = 0; protected: virtual void Resume(); private: virtual int GetTimeOut(); }; class MockFoo : public Foo { public: ... MOCK_METHOD(bool, Transform, (Gadget* g), (override)); // The following must be in the public section, even though the // methods are protected or private in the base class. MOCK_METHOD(void, Resume, (), (override)); MOCK_METHOD(int, GetTimeOut, (), (override)); }; ``` ### Mocking Overloaded Methods You can mock overloaded functions as usual. No special attention is required: ```cpp class Foo { ... // Must be virtual as we'll inherit from Foo. virtual ~Foo(); // Overloaded on the types and/or numbers of arguments. virtual int Add(Element x); virtual int Add(int times, Element x); // Overloaded on the const-ness of this object. virtual Bar& GetBar(); virtual const Bar& GetBar() const; }; class MockFoo : public Foo { ... MOCK_METHOD(int, Add, (Element x), (override)); MOCK_METHOD(int, Add, (int times, Element x), (override)); MOCK_METHOD(Bar&, GetBar, (), (override)); MOCK_METHOD(const Bar&, GetBar, (), (const, override)); }; ``` {: .callout .note} **Note:** if you don't mock all versions of the overloaded method, the compiler will give you a warning about some methods in the base class being hidden. To fix that, use `using` to bring them in scope: ```cpp class MockFoo : public Foo { ... using Foo::Add; MOCK_METHOD(int, Add, (Element x), (override)); // We don't want to mock int Add(int times, Element x); ... }; ``` ### Mocking Class Templates You can mock class templates just like any class. ```cpp template class StackInterface { ... // Must be virtual as we'll inherit from StackInterface. virtual ~StackInterface(); virtual int GetSize() const = 0; virtual void Push(const Elem& x) = 0; }; template class MockStack : public StackInterface { ... MOCK_METHOD(int, GetSize, (), (override)); MOCK_METHOD(void, Push, (const Elem& x), (override)); }; ``` ### Mocking Non-virtual Methods {#MockingNonVirtualMethods} gMock can mock non-virtual functions to be used in Hi-perf dependency injection. In this case, instead of sharing a common base class with the real class, your mock class will be *unrelated* to the real class, but contain methods with the same signatures. The syntax for mocking non-virtual methods is the *same* as mocking virtual methods (just don't add `override`): ```cpp // A simple packet stream class. None of its members is virtual. class ConcretePacketStream { public: void AppendPacket(Packet* new_packet); const Packet* GetPacket(size_t packet_number) const; size_t NumberOfPackets() const; ... }; // A mock packet stream class. It inherits from no other, but defines // GetPacket() and NumberOfPackets(). class MockPacketStream { public: MOCK_METHOD(const Packet*, GetPacket, (size_t packet_number), (const)); MOCK_METHOD(size_t, NumberOfPackets, (), (const)); ... }; ``` Note that the mock class doesn't define `AppendPacket()`, unlike the real class. That's fine as long as the test doesn't need to call it. Next, you need a way to say that you want to use `ConcretePacketStream` in production code, and use `MockPacketStream` in tests. Since the functions are not virtual and the two classes are unrelated, you must specify your choice at *compile time* (as opposed to run time). One way to do it is to templatize your code that needs to use a packet stream. More specifically, you will give your code a template type argument for the type of the packet stream. In production, you will instantiate your template with `ConcretePacketStream` as the type argument. In tests, you will instantiate the same template with `MockPacketStream`. For example, you may write: ```cpp template void CreateConnection(PacketStream* stream) { ... } template class PacketReader { public: void ReadPackets(PacketStream* stream, size_t packet_num); }; ``` Then you can use `CreateConnection()` and `PacketReader` in production code, and use `CreateConnection()` and `PacketReader` in tests. ```cpp MockPacketStream mock_stream; EXPECT_CALL(mock_stream, ...)...; .. set more expectations on mock_stream ... PacketReader reader(&mock_stream); ... exercise reader ... ``` ### Mocking Free Functions It is not possible to directly mock a free function (i.e. a C-style function or a static method). If you need to, you can rewrite your code to use an interface (abstract class). Instead of calling a free function (say, `OpenFile`) directly, introduce an interface for it and have a concrete subclass that calls the free function: ```cpp class FileInterface { public: ... virtual bool Open(const char* path, const char* mode) = 0; }; class File : public FileInterface { public: ... bool Open(const char* path, const char* mode) override { return OpenFile(path, mode); } }; ``` Your code should talk to `FileInterface` to open a file. Now it's easy to mock out the function. This may seem like a lot of hassle, but in practice you often have multiple related functions that you can put in the same interface, so the per-function syntactic overhead will be much lower. If you are concerned about the performance overhead incurred by virtual functions, and profiling confirms your concern, you can combine this with the recipe for [mocking non-virtual methods](#MockingNonVirtualMethods). ### Old-Style `MOCK_METHODn` Macros Before the generic `MOCK_METHOD` macro [was introduced in 2018](https://github.com/google/googletest/commit/c5f08bf91944ce1b19bcf414fa1760e69d20afc2), mocks where created using a family of macros collectively called `MOCK_METHODn`. These macros are still supported, though migration to the new `MOCK_METHOD` is recommended. The macros in the `MOCK_METHODn` family differ from `MOCK_METHOD`: * The general structure is `MOCK_METHODn(MethodName, ReturnType(Args))`, instead of `MOCK_METHOD(ReturnType, MethodName, (Args))`. * The number `n` must equal the number of arguments. * When mocking a const method, one must use `MOCK_CONST_METHODn`. * When mocking a class template, the macro name must be suffixed with `_T`. * In order to specify the call type, the macro name must be suffixed with `_WITH_CALLTYPE`, and the call type is the first macro argument. Old macros and their new equivalents:
    Simple
    Old MOCK_METHOD1(Foo, bool(int))
    New MOCK_METHOD(bool, Foo, (int))
    Const Method
    Old MOCK_CONST_METHOD1(Foo, bool(int))
    New MOCK_METHOD(bool, Foo, (int), (const))
    Method in a Class Template
    Old MOCK_METHOD1_T(Foo, bool(int))
    New MOCK_METHOD(bool, Foo, (int))
    Const Method in a Class Template
    Old MOCK_CONST_METHOD1_T(Foo, bool(int))
    New MOCK_METHOD(bool, Foo, (int), (const))
    Method with Call Type
    Old MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int))
    New MOCK_METHOD(bool, Foo, (int), (Calltype(STDMETHODCALLTYPE)))
    Const Method with Call Type
    Old MOCK_CONST_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int))
    New MOCK_METHOD(bool, Foo, (int), (const, Calltype(STDMETHODCALLTYPE)))
    Method with Call Type in a Class Template
    Old MOCK_METHOD1_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int))
    New MOCK_METHOD(bool, Foo, (int), (Calltype(STDMETHODCALLTYPE)))
    Const Method with Call Type in a Class Template
    Old MOCK_CONST_METHOD1_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int))
    New MOCK_METHOD(bool, Foo, (int), (const, Calltype(STDMETHODCALLTYPE)))
    ### The Nice, the Strict, and the Naggy {#NiceStrictNaggy} If a mock method has no `EXPECT_CALL` spec but is called, we say that it's an "uninteresting call", and the default action (which can be specified using `ON_CALL()`) of the method will be taken. Currently, an uninteresting call will also by default cause gMock to print a warning. (In the future, we might remove this warning by default.) However, sometimes you may want to ignore these uninteresting calls, and sometimes you may want to treat them as errors. gMock lets you make the decision on a per-mock-object basis. Suppose your test uses a mock class `MockFoo`: ```cpp TEST(...) { MockFoo mock_foo; EXPECT_CALL(mock_foo, DoThis()); ... code that uses mock_foo ... } ``` If a method of `mock_foo` other than `DoThis()` is called, you will get a warning. However, if you rewrite your test to use `NiceMock` instead, you can suppress the warning: ```cpp using ::testing::NiceMock; TEST(...) { NiceMock mock_foo; EXPECT_CALL(mock_foo, DoThis()); ... code that uses mock_foo ... } ``` `NiceMock` is a subclass of `MockFoo`, so it can be used wherever `MockFoo` is accepted. It also works if `MockFoo`'s constructor takes some arguments, as `NiceMock` "inherits" `MockFoo`'s constructors: ```cpp using ::testing::NiceMock; TEST(...) { NiceMock mock_foo(5, "hi"); // Calls MockFoo(5, "hi"). EXPECT_CALL(mock_foo, DoThis()); ... code that uses mock_foo ... } ``` The usage of `StrictMock` is similar, except that it makes all uninteresting calls failures: ```cpp using ::testing::StrictMock; TEST(...) { StrictMock mock_foo; EXPECT_CALL(mock_foo, DoThis()); ... code that uses mock_foo ... // The test will fail if a method of mock_foo other than DoThis() // is called. } ``` {: .callout .note} NOTE: `NiceMock` and `StrictMock` only affects *uninteresting* calls (calls of *methods* with no expectations); they do not affect *unexpected* calls (calls of methods with expectations, but they don't match). See [Understanding Uninteresting vs Unexpected Calls](#uninteresting-vs-unexpected). There are some caveats though (sadly they are side effects of C++'s limitations): 1. `NiceMock` and `StrictMock` only work for mock methods defined using the `MOCK_METHOD` macro **directly** in the `MockFoo` class. If a mock method is defined in a **base class** of `MockFoo`, the "nice" or "strict" modifier may not affect it, depending on the compiler. In particular, nesting `NiceMock` and `StrictMock` (e.g. `NiceMock >`) is **not** supported. 2. `NiceMock` and `StrictMock` may not work correctly if the destructor of `MockFoo` is not virtual. We would like to fix this, but it requires cleaning up existing tests. Finally, you should be **very cautious** about when to use naggy or strict mocks, as they tend to make tests more brittle and harder to maintain. When you refactor your code without changing its externally visible behavior, ideally you shouldn't need to update any tests. If your code interacts with a naggy mock, however, you may start to get spammed with warnings as the result of your change. Worse, if your code interacts with a strict mock, your tests may start to fail and you'll be forced to fix them. Our general recommendation is to use nice mocks (not yet the default) most of the time, use naggy mocks (the current default) when developing or debugging tests, and use strict mocks only as the last resort. ### Simplifying the Interface without Breaking Existing Code {#SimplerInterfaces} Sometimes a method has a long list of arguments that is mostly uninteresting. For example: ```cpp class LogSink { public: ... virtual void send(LogSeverity severity, const char* full_filename, const char* base_filename, int line, const struct tm* tm_time, const char* message, size_t message_len) = 0; }; ``` This method's argument list is lengthy and hard to work with (the `message` argument is not even 0-terminated). If we mock it as is, using the mock will be awkward. If, however, we try to simplify this interface, we'll need to fix all clients depending on it, which is often infeasible. The trick is to redispatch the method in the mock class: ```cpp class ScopedMockLog : public LogSink { public: ... void send(LogSeverity severity, const char* full_filename, const char* base_filename, int line, const tm* tm_time, const char* message, size_t message_len) override { // We are only interested in the log severity, full file name, and // log message. Log(severity, full_filename, std::string(message, message_len)); } // Implements the mock method: // // void Log(LogSeverity severity, // const string& file_path, // const string& message); MOCK_METHOD(void, Log, (LogSeverity severity, const string& file_path, const string& message)); }; ``` By defining a new mock method with a trimmed argument list, we make the mock class more user-friendly. This technique may also be applied to make overloaded methods more amenable to mocking. For example, when overloads have been used to implement default arguments: ```cpp class MockTurtleFactory : public TurtleFactory { public: Turtle* MakeTurtle(int length, int weight) override { ... } Turtle* MakeTurtle(int length, int weight, int speed) override { ... } // the above methods delegate to this one: MOCK_METHOD(Turtle*, DoMakeTurtle, ()); }; ``` This allows tests that don't care which overload was invoked to avoid specifying argument matchers: ```cpp ON_CALL(factory, DoMakeTurtle) .WillByDefault(Return(MakeMockTurtle())); ``` ### Alternative to Mocking Concrete Classes Often you may find yourself using classes that don't implement interfaces. In order to test your code that uses such a class (let's call it `Concrete`), you may be tempted to make the methods of `Concrete` virtual and then mock it. Try not to do that. Making a non-virtual function virtual is a big decision. It creates an extension point where subclasses can tweak your class' behavior. This weakens your control on the class because now it's harder to maintain the class invariants. You should make a function virtual only when there is a valid reason for a subclass to override it. Mocking concrete classes directly is problematic as it creates a tight coupling between the class and the tests - any small change in the class may invalidate your tests and make test maintenance a pain. To avoid such problems, many programmers have been practicing "coding to interfaces": instead of talking to the `Concrete` class, your code would define an interface and talk to it. Then you implement that interface as an adaptor on top of `Concrete`. In tests, you can easily mock that interface to observe how your code is doing. This technique incurs some overhead: * You pay the cost of virtual function calls (usually not a problem). * There is more abstraction for the programmers to learn. However, it can also bring significant benefits in addition to better testability: * `Concrete`'s API may not fit your problem domain very well, as you may not be the only client it tries to serve. By designing your own interface, you have a chance to tailor it to your need - you may add higher-level functionalities, rename stuff, etc instead of just trimming the class. This allows you to write your code (user of the interface) in a more natural way, which means it will be more readable, more maintainable, and you'll be more productive. * If `Concrete`'s implementation ever has to change, you don't have to rewrite everywhere it is used. Instead, you can absorb the change in your implementation of the interface, and your other code and tests will be insulated from this change. Some people worry that if everyone is practicing this technique, they will end up writing lots of redundant code. This concern is totally understandable. However, there are two reasons why it may not be the case: * Different projects may need to use `Concrete` in different ways, so the best interfaces for them will be different. Therefore, each of them will have its own domain-specific interface on top of `Concrete`, and they will not be the same code. * If enough projects want to use the same interface, they can always share it, just like they have been sharing `Concrete`. You can check in the interface and the adaptor somewhere near `Concrete` (perhaps in a `contrib` sub-directory) and let many projects use it. You need to weigh the pros and cons carefully for your particular problem, but I'd like to assure you that the Java community has been practicing this for a long time and it's a proven effective technique applicable in a wide variety of situations. :-) ### Delegating Calls to a Fake {#DelegatingToFake} Some times you have a non-trivial fake implementation of an interface. For example: ```cpp class Foo { public: virtual ~Foo() {} virtual char DoThis(int n) = 0; virtual void DoThat(const char* s, int* p) = 0; }; class FakeFoo : public Foo { public: char DoThis(int n) override { return (n > 0) ? '+' : (n < 0) ? '-' : '0'; } void DoThat(const char* s, int* p) override { *p = strlen(s); } }; ``` Now you want to mock this interface such that you can set expectations on it. However, you also want to use `FakeFoo` for the default behavior, as duplicating it in the mock object is, well, a lot of work. When you define the mock class using gMock, you can have it delegate its default action to a fake class you already have, using this pattern: ```cpp class MockFoo : public Foo { public: // Normal mock method definitions using gMock. MOCK_METHOD(char, DoThis, (int n), (override)); MOCK_METHOD(void, DoThat, (const char* s, int* p), (override)); // Delegates the default actions of the methods to a FakeFoo object. // This must be called *before* the custom ON_CALL() statements. void DelegateToFake() { ON_CALL(*this, DoThis).WillByDefault([this](int n) { return fake_.DoThis(n); }); ON_CALL(*this, DoThat).WillByDefault([this](const char* s, int* p) { fake_.DoThat(s, p); }); } private: FakeFoo fake_; // Keeps an instance of the fake in the mock. }; ``` With that, you can use `MockFoo` in your tests as usual. Just remember that if you don't explicitly set an action in an `ON_CALL()` or `EXPECT_CALL()`, the fake will be called upon to do it.: ```cpp using ::testing::_; TEST(AbcTest, Xyz) { MockFoo foo; foo.DelegateToFake(); // Enables the fake for delegation. // Put your ON_CALL(foo, ...)s here, if any. // No action specified, meaning to use the default action. EXPECT_CALL(foo, DoThis(5)); EXPECT_CALL(foo, DoThat(_, _)); int n = 0; EXPECT_EQ('+', foo.DoThis(5)); // FakeFoo::DoThis() is invoked. foo.DoThat("Hi", &n); // FakeFoo::DoThat() is invoked. EXPECT_EQ(2, n); } ``` **Some tips:** * If you want, you can still override the default action by providing your own `ON_CALL()` or using `.WillOnce()` / `.WillRepeatedly()` in `EXPECT_CALL()`. * In `DelegateToFake()`, you only need to delegate the methods whose fake implementation you intend to use. * The general technique discussed here works for overloaded methods, but you'll need to tell the compiler which version you mean. To disambiguate a mock function (the one you specify inside the parentheses of `ON_CALL()`), use [this technique](#SelectOverload); to disambiguate a fake function (the one you place inside `Invoke()`), use a `static_cast` to specify the function's type. For instance, if class `Foo` has methods `char DoThis(int n)` and `bool DoThis(double x) const`, and you want to invoke the latter, you need to write `Invoke(&fake_, static_cast(&FakeFoo::DoThis))` instead of `Invoke(&fake_, &FakeFoo::DoThis)` (The strange-looking thing inside the angled brackets of `static_cast` is the type of a function pointer to the second `DoThis()` method.). * Having to mix a mock and a fake is often a sign of something gone wrong. Perhaps you haven't got used to the interaction-based way of testing yet. Or perhaps your interface is taking on too many roles and should be split up. Therefore, **don't abuse this**. We would only recommend to do it as an intermediate step when you are refactoring your code. Regarding the tip on mixing a mock and a fake, here's an example on why it may be a bad sign: Suppose you have a class `System` for low-level system operations. In particular, it does file and I/O operations. And suppose you want to test how your code uses `System` to do I/O, and you just want the file operations to work normally. If you mock out the entire `System` class, you'll have to provide a fake implementation for the file operation part, which suggests that `System` is taking on too many roles. Instead, you can define a `FileOps` interface and an `IOOps` interface and split `System`'s functionalities into the two. Then you can mock `IOOps` without mocking `FileOps`. ### Delegating Calls to a Real Object When using testing doubles (mocks, fakes, stubs, and etc), sometimes their behaviors will differ from those of the real objects. This difference could be either intentional (as in simulating an error such that you can test the error handling code) or unintentional. If your mocks have different behaviors than the real objects by mistake, you could end up with code that passes the tests but fails in production. You can use the *delegating-to-real* technique to ensure that your mock has the same behavior as the real object while retaining the ability to validate calls. This technique is very similar to the [delegating-to-fake](#DelegatingToFake) technique, the difference being that we use a real object instead of a fake. Here's an example: ```cpp using ::testing::AtLeast; class MockFoo : public Foo { public: MockFoo() { // By default, all calls are delegated to the real object. ON_CALL(*this, DoThis).WillByDefault([this](int n) { return real_.DoThis(n); }); ON_CALL(*this, DoThat).WillByDefault([this](const char* s, int* p) { real_.DoThat(s, p); }); ... } MOCK_METHOD(char, DoThis, ...); MOCK_METHOD(void, DoThat, ...); ... private: Foo real_; }; ... MockFoo mock; EXPECT_CALL(mock, DoThis()) .Times(3); EXPECT_CALL(mock, DoThat("Hi")) .Times(AtLeast(1)); ... use mock in test ... ``` With this, gMock will verify that your code made the right calls (with the right arguments, in the right order, called the right number of times, etc), and a real object will answer the calls (so the behavior will be the same as in production). This gives you the best of both worlds. ### Delegating Calls to a Parent Class Ideally, you should code to interfaces, whose methods are all pure virtual. In reality, sometimes you do need to mock a virtual method that is not pure (i.e, it already has an implementation). For example: ```cpp class Foo { public: virtual ~Foo(); virtual void Pure(int n) = 0; virtual int Concrete(const char* str) { ... } }; class MockFoo : public Foo { public: // Mocking a pure method. MOCK_METHOD(void, Pure, (int n), (override)); // Mocking a concrete method. Foo::Concrete() is shadowed. MOCK_METHOD(int, Concrete, (const char* str), (override)); }; ``` Sometimes you may want to call `Foo::Concrete()` instead of `MockFoo::Concrete()`. Perhaps you want to do it as part of a stub action, or perhaps your test doesn't need to mock `Concrete()` at all (but it would be oh-so painful to have to define a new mock class whenever you don't need to mock one of its methods). You can call `Foo::Concrete()` inside an action by: ```cpp ... EXPECT_CALL(foo, Concrete).WillOnce([&foo](const char* str) { return foo.Foo::Concrete(str); }); ``` or tell the mock object that you don't want to mock `Concrete()`: ```cpp ... ON_CALL(foo, Concrete).WillByDefault([&foo](const char* str) { return foo.Foo::Concrete(str); }); ``` (Why don't we just write `{ return foo.Concrete(str); }`? If you do that, `MockFoo::Concrete()` will be called (and cause an infinite recursion) since `Foo::Concrete()` is virtual. That's just how C++ works.) ## Using Matchers ### Matching Argument Values Exactly You can specify exactly which arguments a mock method is expecting: ```cpp using ::testing::Return; ... EXPECT_CALL(foo, DoThis(5)) .WillOnce(Return('a')); EXPECT_CALL(foo, DoThat("Hello", bar)); ``` ### Using Simple Matchers You can use matchers to match arguments that have a certain property: ```cpp using ::testing::NotNull; using ::testing::Return; ... EXPECT_CALL(foo, DoThis(Ge(5))) // The argument must be >= 5. .WillOnce(Return('a')); EXPECT_CALL(foo, DoThat("Hello", NotNull())); // The second argument must not be NULL. ``` A frequently used matcher is `_`, which matches anything: ```cpp EXPECT_CALL(foo, DoThat(_, NotNull())); ``` ### Combining Matchers {#CombiningMatchers} You can build complex matchers from existing ones using `AllOf()`, `AllOfArray()`, `AnyOf()`, `AnyOfArray()` and `Not()`: ```cpp using ::testing::AllOf; using ::testing::Gt; using ::testing::HasSubstr; using ::testing::Ne; using ::testing::Not; ... // The argument must be > 5 and != 10. EXPECT_CALL(foo, DoThis(AllOf(Gt(5), Ne(10)))); // The first argument must not contain sub-string "blah". EXPECT_CALL(foo, DoThat(Not(HasSubstr("blah")), NULL)); ``` Matchers are function objects, and parametrized matchers can be composed just like any other function. However because their types can be long and rarely provide meaningful information, it can be easier to express them with C++14 generic lambdas to avoid specifying types. For example, ```cpp using ::testing::Contains; using ::testing::Property; inline constexpr auto HasFoo = [](const auto& f) { return Property(&MyClass::foo, Contains(f)); }; ... EXPECT_THAT(x, HasFoo("blah")); ``` ### Casting Matchers {#SafeMatcherCast} gMock matchers are statically typed, meaning that the compiler can catch your mistake if you use a matcher of the wrong type (for example, if you use `Eq(5)` to match a `string` argument). Good for you! Sometimes, however, you know what you're doing and want the compiler to give you some slack. One example is that you have a matcher for `long` and the argument you want to match is `int`. While the two types aren't exactly the same, there is nothing really wrong with using a `Matcher` to match an `int` - after all, we can first convert the `int` argument to a `long` losslessly before giving it to the matcher. To support this need, gMock gives you the `SafeMatcherCast(m)` function. It casts a matcher `m` to type `Matcher`. To ensure safety, gMock checks that (let `U` be the type `m` accepts : 1. Type `T` can be *implicitly* cast to type `U`; 2. When both `T` and `U` are built-in arithmetic types (`bool`, integers, and floating-point numbers), the conversion from `T` to `U` is not lossy (in other words, any value representable by `T` can also be represented by `U`); and 3. When `U` is a reference, `T` must also be a reference (as the underlying matcher may be interested in the address of the `U` value). The code won't compile if any of these conditions isn't met. Here's one example: ```cpp using ::testing::SafeMatcherCast; // A base class and a child class. class Base { ... }; class Derived : public Base { ... }; class MockFoo : public Foo { public: MOCK_METHOD(void, DoThis, (Derived* derived), (override)); }; ... MockFoo foo; // m is a Matcher we got from somewhere. EXPECT_CALL(foo, DoThis(SafeMatcherCast(m))); ``` If you find `SafeMatcherCast(m)` too limiting, you can use a similar function `MatcherCast(m)`. The difference is that `MatcherCast` works as long as you can `static_cast` type `T` to type `U`. `MatcherCast` essentially lets you bypass C++'s type system (`static_cast` isn't always safe as it could throw away information, for example), so be careful not to misuse/abuse it. ### Selecting Between Overloaded Functions {#SelectOverload} If you expect an overloaded function to be called, the compiler may need some help on which overloaded version it is. To disambiguate functions overloaded on the const-ness of this object, use the `Const()` argument wrapper. ```cpp using ::testing::ReturnRef; class MockFoo : public Foo { ... MOCK_METHOD(Bar&, GetBar, (), (override)); MOCK_METHOD(const Bar&, GetBar, (), (const, override)); }; ... MockFoo foo; Bar bar1, bar2; EXPECT_CALL(foo, GetBar()) // The non-const GetBar(). .WillOnce(ReturnRef(bar1)); EXPECT_CALL(Const(foo), GetBar()) // The const GetBar(). .WillOnce(ReturnRef(bar2)); ``` (`Const()` is defined by gMock and returns a `const` reference to its argument.) To disambiguate overloaded functions with the same number of arguments but different argument types, you may need to specify the exact type of a matcher, either by wrapping your matcher in `Matcher()`, or using a matcher whose type is fixed (`TypedEq`, `An()`, etc): ```cpp using ::testing::An; using ::testing::Matcher; using ::testing::TypedEq; class MockPrinter : public Printer { public: MOCK_METHOD(void, Print, (int n), (override)); MOCK_METHOD(void, Print, (char c), (override)); }; TEST(PrinterTest, Print) { MockPrinter printer; EXPECT_CALL(printer, Print(An())); // void Print(int); EXPECT_CALL(printer, Print(Matcher(Lt(5)))); // void Print(int); EXPECT_CALL(printer, Print(TypedEq('a'))); // void Print(char); printer.Print(3); printer.Print(6); printer.Print('a'); } ``` ### Performing Different Actions Based on the Arguments When a mock method is called, the *last* matching expectation that's still active will be selected (think "newer overrides older"). So, you can make a method do different things depending on its argument values like this: ```cpp using ::testing::_; using ::testing::Lt; using ::testing::Return; ... // The default case. EXPECT_CALL(foo, DoThis(_)) .WillRepeatedly(Return('b')); // The more specific case. EXPECT_CALL(foo, DoThis(Lt(5))) .WillRepeatedly(Return('a')); ``` Now, if `foo.DoThis()` is called with a value less than 5, `'a'` will be returned; otherwise `'b'` will be returned. ### Matching Multiple Arguments as a Whole Sometimes it's not enough to match the arguments individually. For example, we may want to say that the first argument must be less than the second argument. The `With()` clause allows us to match all arguments of a mock function as a whole. For example, ```cpp using ::testing::_; using ::testing::Ne; using ::testing::Lt; ... EXPECT_CALL(foo, InRange(Ne(0), _)) .With(Lt()); ``` says that the first argument of `InRange()` must not be 0, and must be less than the second argument. The expression inside `With()` must be a matcher of type `Matcher>`, where `A1`, ..., `An` are the types of the function arguments. You can also write `AllArgs(m)` instead of `m` inside `.With()`. The two forms are equivalent, but `.With(AllArgs(Lt()))` is more readable than `.With(Lt())`. You can use `Args(m)` to match the `n` selected arguments (as a tuple) against `m`. For example, ```cpp using ::testing::_; using ::testing::AllOf; using ::testing::Args; using ::testing::Lt; ... EXPECT_CALL(foo, Blah) .With(AllOf(Args<0, 1>(Lt()), Args<1, 2>(Lt()))); ``` says that `Blah` will be called with arguments `x`, `y`, and `z` where `x < y < z`. Note that in this example, it wasn't necessary to specify the positional matchers. As a convenience and example, gMock provides some matchers for 2-tuples, including the `Lt()` matcher above. See [Multi-argument Matchers](reference/matchers.md#MultiArgMatchers) for the complete list. Note that if you want to pass the arguments to a predicate of your own (e.g. `.With(Args<0, 1>(Truly(&MyPredicate)))`), that predicate MUST be written to take a `std::tuple` as its argument; gMock will pass the `n` selected arguments as *one* single tuple to the predicate. ### Using Matchers as Predicates Have you noticed that a matcher is just a fancy predicate that also knows how to describe itself? Many existing algorithms take predicates as arguments (e.g. those defined in STL's `` header), and it would be a shame if gMock matchers were not allowed to participate. Luckily, you can use a matcher where a unary predicate functor is expected by wrapping it inside the `Matches()` function. For example, ```cpp #include #include using ::testing::Matches; using ::testing::Ge; vector v; ... // How many elements in v are >= 10? const int count = count_if(v.begin(), v.end(), Matches(Ge(10))); ``` Since you can build complex matchers from simpler ones easily using gMock, this gives you a way to conveniently construct composite predicates (doing the same using STL's `` header is just painful). For example, here's a predicate that's satisfied by any number that is >= 0, <= 100, and != 50: ```cpp using testing::AllOf; using testing::Ge; using testing::Le; using testing::Matches; using testing::Ne; ... Matches(AllOf(Ge(0), Le(100), Ne(50))) ``` ### Using Matchers in googletest Assertions See [`EXPECT_THAT`](reference/assertions.md#EXPECT_THAT) in the Assertions Reference. ### Using Predicates as Matchers gMock provides a set of built-in matchers for matching arguments with expected values—see the [Matchers Reference](reference/matchers.md) for more information. In case you find the built-in set lacking, you can use an arbitrary unary predicate function or functor as a matcher - as long as the predicate accepts a value of the type you want. You do this by wrapping the predicate inside the `Truly()` function, for example: ```cpp using ::testing::Truly; int IsEven(int n) { return (n % 2) == 0 ? 1 : 0; } ... // Bar() must be called with an even number. EXPECT_CALL(foo, Bar(Truly(IsEven))); ``` Note that the predicate function / functor doesn't have to return `bool`. It works as long as the return value can be used as the condition in in statement `if (condition) ...`. ### Matching Arguments that Are Not Copyable When you do an `EXPECT_CALL(mock_obj, Foo(bar))`, gMock saves away a copy of `bar`. When `Foo()` is called later, gMock compares the argument to `Foo()` with the saved copy of `bar`. This way, you don't need to worry about `bar` being modified or destroyed after the `EXPECT_CALL()` is executed. The same is true when you use matchers like `Eq(bar)`, `Le(bar)`, and so on. But what if `bar` cannot be copied (i.e. has no copy constructor)? You could define your own matcher function or callback and use it with `Truly()`, as the previous couple of recipes have shown. Or, you may be able to get away from it if you can guarantee that `bar` won't be changed after the `EXPECT_CALL()` is executed. Just tell gMock that it should save a reference to `bar`, instead of a copy of it. Here's how: ```cpp using ::testing::Eq; using ::testing::Lt; ... // Expects that Foo()'s argument == bar. EXPECT_CALL(mock_obj, Foo(Eq(std::ref(bar)))); // Expects that Foo()'s argument < bar. EXPECT_CALL(mock_obj, Foo(Lt(std::ref(bar)))); ``` Remember: if you do this, don't change `bar` after the `EXPECT_CALL()`, or the result is undefined. ### Validating a Member of an Object Often a mock function takes a reference to object as an argument. When matching the argument, you may not want to compare the entire object against a fixed object, as that may be over-specification. Instead, you may need to validate a certain member variable or the result of a certain getter method of the object. You can do this with `Field()` and `Property()`. More specifically, ```cpp Field(&Foo::bar, m) ``` is a matcher that matches a `Foo` object whose `bar` member variable satisfies matcher `m`. ```cpp Property(&Foo::baz, m) ``` is a matcher that matches a `Foo` object whose `baz()` method returns a value that satisfies matcher `m`. For example: | Expression | Description | | :--------------------------- | :--------------------------------------- | | `Field(&Foo::number, Ge(3))` | Matches `x` where `x.number >= 3`. | | `Property(&Foo::name, StartsWith("John "))` | Matches `x` where `x.name()` starts with `"John "`. | Note that in `Property(&Foo::baz, ...)`, method `baz()` must take no argument and be declared as `const`. Don't use `Property()` against member functions that you do not own, because taking addresses of functions is fragile and generally not part of the contract of the function. `Field()` and `Property()` can also match plain pointers to objects. For instance, ```cpp using ::testing::Field; using ::testing::Ge; ... Field(&Foo::number, Ge(3)) ``` matches a plain pointer `p` where `p->number >= 3`. If `p` is `NULL`, the match will always fail regardless of the inner matcher. What if you want to validate more than one members at the same time? Remember that there are [`AllOf()` and `AllOfArray()`](#CombiningMatchers). Finally `Field()` and `Property()` provide overloads that take the field or property names as the first argument to include it in the error message. This can be useful when creating combined matchers. ```cpp using ::testing::AllOf; using ::testing::Field; using ::testing::Matcher; using ::testing::SafeMatcherCast; Matcher IsFoo(const Foo& foo) { return AllOf(Field("some_field", &Foo::some_field, foo.some_field), Field("other_field", &Foo::other_field, foo.other_field), Field("last_field", &Foo::last_field, foo.last_field)); } ``` ### Validating the Value Pointed to by a Pointer Argument C++ functions often take pointers as arguments. You can use matchers like `IsNull()`, `NotNull()`, and other comparison matchers to match a pointer, but what if you want to make sure the value *pointed to* by the pointer, instead of the pointer itself, has a certain property? Well, you can use the `Pointee(m)` matcher. `Pointee(m)` matches a pointer if and only if `m` matches the value the pointer points to. For example: ```cpp using ::testing::Ge; using ::testing::Pointee; ... EXPECT_CALL(foo, Bar(Pointee(Ge(3)))); ``` expects `foo.Bar()` to be called with a pointer that points to a value greater than or equal to 3. One nice thing about `Pointee()` is that it treats a `NULL` pointer as a match failure, so you can write `Pointee(m)` instead of ```cpp using ::testing::AllOf; using ::testing::NotNull; using ::testing::Pointee; ... AllOf(NotNull(), Pointee(m)) ``` without worrying that a `NULL` pointer will crash your test. Also, did we tell you that `Pointee()` works with both raw pointers **and** smart pointers (`std::unique_ptr`, `std::shared_ptr`, etc)? What if you have a pointer to pointer? You guessed it - you can use nested `Pointee()` to probe deeper inside the value. For example, `Pointee(Pointee(Lt(3)))` matches a pointer that points to a pointer that points to a number less than 3 (what a mouthful...). ### Testing a Certain Property of an Object Sometimes you want to specify that an object argument has a certain property, but there is no existing matcher that does this. If you want good error messages, you should [define a matcher](#NewMatchers). If you want to do it quick and dirty, you could get away with writing an ordinary function. Let's say you have a mock function that takes an object of type `Foo`, which has an `int bar()` method and an `int baz()` method, and you want to constrain that the argument's `bar()` value plus its `baz()` value is a given number. Here's how you can define a matcher to do it: ```cpp using ::testing::Matcher; class BarPlusBazEqMatcher { public: explicit BarPlusBazEqMatcher(int expected_sum) : expected_sum_(expected_sum) {} bool MatchAndExplain(const Foo& foo, std::ostream* /* listener */) const { return (foo.bar() + foo.baz()) == expected_sum_; } void DescribeTo(std::ostream& os) const { os << "bar() + baz() equals " << expected_sum_; } void DescribeNegationTo(std::ostream& os) const { os << "bar() + baz() does not equal " << expected_sum_; } private: const int expected_sum_; }; Matcher BarPlusBazEq(int expected_sum) { return BarPlusBazEqMatcher(expected_sum); } ... EXPECT_CALL(..., DoThis(BarPlusBazEq(5)))...; ``` ### Matching Containers Sometimes an STL container (e.g. list, vector, map, ...) is passed to a mock function and you may want to validate it. Since most STL containers support the `==` operator, you can write `Eq(expected_container)` or simply `expected_container` to match a container exactly. Sometimes, though, you may want to be more flexible (for example, the first element must be an exact match, but the second element can be any positive number, and so on). Also, containers used in tests often have a small number of elements, and having to define the expected container out-of-line is a bit of a hassle. You can use the `ElementsAre()` or `UnorderedElementsAre()` matcher in such cases: ```cpp using ::testing::_; using ::testing::ElementsAre; using ::testing::Gt; ... MOCK_METHOD(void, Foo, (const vector& numbers), (override)); ... EXPECT_CALL(mock, Foo(ElementsAre(1, Gt(0), _, 5))); ``` The above matcher says that the container must have 4 elements, which must be 1, greater than 0, anything, and 5 respectively. If you instead write: ```cpp using ::testing::_; using ::testing::Gt; using ::testing::UnorderedElementsAre; ... MOCK_METHOD(void, Foo, (const vector& numbers), (override)); ... EXPECT_CALL(mock, Foo(UnorderedElementsAre(1, Gt(0), _, 5))); ``` It means that the container must have 4 elements, which (under some permutation) must be 1, greater than 0, anything, and 5 respectively. As an alternative you can place the arguments in a C-style array and use `ElementsAreArray()` or `UnorderedElementsAreArray()` instead: ```cpp using ::testing::ElementsAreArray; ... // ElementsAreArray accepts an array of element values. const int expected_vector1[] = {1, 5, 2, 4, ...}; EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector1))); // Or, an array of element matchers. Matcher expected_vector2[] = {1, Gt(2), _, 3, ...}; EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector2))); ``` In case the array needs to be dynamically created (and therefore the array size cannot be inferred by the compiler), you can give `ElementsAreArray()` an additional argument to specify the array size: ```cpp using ::testing::ElementsAreArray; ... int* const expected_vector3 = new int[count]; ... fill expected_vector3 with values ... EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector3, count))); ``` Use `Pair` when comparing maps or other associative containers. {% raw %} ```cpp using testing::ElementsAre; using testing::Pair; ... std::map m = {{"a", 1}, {"b", 2}, {"c", 3}}; EXPECT_THAT(m, ElementsAre(Pair("a", 1), Pair("b", 2), Pair("c", 3))); ``` {% endraw %} **Tips:** * `ElementsAre*()` can be used to match *any* container that implements the STL iterator pattern (i.e. it has a `const_iterator` type and supports `begin()/end()`), not just the ones defined in STL. It will even work with container types yet to be written - as long as they follows the above pattern. * You can use nested `ElementsAre*()` to match nested (multi-dimensional) containers. * If the container is passed by pointer instead of by reference, just write `Pointee(ElementsAre*(...))`. * The order of elements *matters* for `ElementsAre*()`. If you are using it with containers whose element order are undefined (e.g. `hash_map`) you should use `WhenSorted` around `ElementsAre`. ### Sharing Matchers Under the hood, a gMock matcher object consists of a pointer to a ref-counted implementation object. Copying matchers is allowed and very efficient, as only the pointer is copied. When the last matcher that references the implementation object dies, the implementation object will be deleted. Therefore, if you have some complex matcher that you want to use again and again, there is no need to build it every time. Just assign it to a matcher variable and use that variable repeatedly! For example, ```cpp using ::testing::AllOf; using ::testing::Gt; using ::testing::Le; using ::testing::Matcher; ... Matcher in_range = AllOf(Gt(5), Le(10)); ... use in_range as a matcher in multiple EXPECT_CALLs ... ``` ### Matchers must have no side-effects {#PureMatchers} {: .callout .warning} WARNING: gMock does not guarantee when or how many times a matcher will be invoked. Therefore, all matchers must be *purely functional*: they cannot have any side effects, and the match result must not depend on anything other than the matcher's parameters and the value being matched. This requirement must be satisfied no matter how a matcher is defined (e.g., if it is one of the standard matchers, or a custom matcher). In particular, a matcher can never call a mock function, as that will affect the state of the mock object and gMock. ## Setting Expectations ### Knowing When to Expect {#UseOnCall} **`ON_CALL`** is likely the *single most under-utilized construct* in gMock. There are basically two constructs for defining the behavior of a mock object: `ON_CALL` and `EXPECT_CALL`. The difference? `ON_CALL` defines what happens when a mock method is called, but doesn't imply any expectation on the method being called. `EXPECT_CALL` not only defines the behavior, but also sets an expectation that the method will be called with the given arguments, for the given number of times (and *in the given order* when you specify the order too). Since `EXPECT_CALL` does more, isn't it better than `ON_CALL`? Not really. Every `EXPECT_CALL` adds a constraint on the behavior of the code under test. Having more constraints than necessary is *baaad* - even worse than not having enough constraints. This may be counter-intuitive. How could tests that verify more be worse than tests that verify less? Isn't verification the whole point of tests? The answer lies in *what* a test should verify. **A good test verifies the contract of the code.** If a test over-specifies, it doesn't leave enough freedom to the implementation. As a result, changing the implementation without breaking the contract (e.g. refactoring and optimization), which should be perfectly fine to do, can break such tests. Then you have to spend time fixing them, only to see them broken again the next time the implementation is changed. Keep in mind that one doesn't have to verify more than one property in one test. In fact, **it's a good style to verify only one thing in one test.** If you do that, a bug will likely break only one or two tests instead of dozens (which case would you rather debug?). If you are also in the habit of giving tests descriptive names that tell what they verify, you can often easily guess what's wrong just from the test log itself. So use `ON_CALL` by default, and only use `EXPECT_CALL` when you actually intend to verify that the call is made. For example, you may have a bunch of `ON_CALL`s in your test fixture to set the common mock behavior shared by all tests in the same group, and write (scarcely) different `EXPECT_CALL`s in different `TEST_F`s to verify different aspects of the code's behavior. Compared with the style where each `TEST` has many `EXPECT_CALL`s, this leads to tests that are more resilient to implementational changes (and thus less likely to require maintenance) and makes the intent of the tests more obvious (so they are easier to maintain when you do need to maintain them). If you are bothered by the "Uninteresting mock function call" message printed when a mock method without an `EXPECT_CALL` is called, you may use a `NiceMock` instead to suppress all such messages for the mock object, or suppress the message for specific methods by adding `EXPECT_CALL(...).Times(AnyNumber())`. DO NOT suppress it by blindly adding an `EXPECT_CALL(...)`, or you'll have a test that's a pain to maintain. ### Ignoring Uninteresting Calls If you are not interested in how a mock method is called, just don't say anything about it. In this case, if the method is ever called, gMock will perform its default action to allow the test program to continue. If you are not happy with the default action taken by gMock, you can override it using `DefaultValue::Set()` (described [here](#DefaultValue)) or `ON_CALL()`. Please note that once you expressed interest in a particular mock method (via `EXPECT_CALL()`), all invocations to it must match some expectation. If this function is called but the arguments don't match any `EXPECT_CALL()` statement, it will be an error. ### Disallowing Unexpected Calls If a mock method shouldn't be called at all, explicitly say so: ```cpp using ::testing::_; ... EXPECT_CALL(foo, Bar(_)) .Times(0); ``` If some calls to the method are allowed, but the rest are not, just list all the expected calls: ```cpp using ::testing::AnyNumber; using ::testing::Gt; ... EXPECT_CALL(foo, Bar(5)); EXPECT_CALL(foo, Bar(Gt(10))) .Times(AnyNumber()); ``` A call to `foo.Bar()` that doesn't match any of the `EXPECT_CALL()` statements will be an error. ### Understanding Uninteresting vs Unexpected Calls {#uninteresting-vs-unexpected} *Uninteresting* calls and *unexpected* calls are different concepts in gMock. *Very* different. A call `x.Y(...)` is **uninteresting** if there's *not even a single* `EXPECT_CALL(x, Y(...))` set. In other words, the test isn't interested in the `x.Y()` method at all, as evident in that the test doesn't care to say anything about it. A call `x.Y(...)` is **unexpected** if there are *some* `EXPECT_CALL(x, Y(...))`s set, but none of them matches the call. Put another way, the test is interested in the `x.Y()` method (therefore it explicitly sets some `EXPECT_CALL` to verify how it's called); however, the verification fails as the test doesn't expect this particular call to happen. **An unexpected call is always an error,** as the code under test doesn't behave the way the test expects it to behave. **By default, an uninteresting call is not an error,** as it violates no constraint specified by the test. (gMock's philosophy is that saying nothing means there is no constraint.) However, it leads to a warning, as it *might* indicate a problem (e.g. the test author might have forgotten to specify a constraint). In gMock, `NiceMock` and `StrictMock` can be used to make a mock class "nice" or "strict". How does this affect uninteresting calls and unexpected calls? A **nice mock** suppresses uninteresting call *warnings*. It is less chatty than the default mock, but otherwise is the same. If a test fails with a default mock, it will also fail using a nice mock instead. And vice versa. Don't expect making a mock nice to change the test's result. A **strict mock** turns uninteresting call warnings into errors. So making a mock strict may change the test's result. Let's look at an example: ```cpp TEST(...) { NiceMock mock_registry; EXPECT_CALL(mock_registry, GetDomainOwner("google.com")) .WillRepeatedly(Return("Larry Page")); // Use mock_registry in code under test. ... &mock_registry ... } ``` The sole `EXPECT_CALL` here says that all calls to `GetDomainOwner()` must have `"google.com"` as the argument. If `GetDomainOwner("yahoo.com")` is called, it will be an unexpected call, and thus an error. *Having a nice mock doesn't change the severity of an unexpected call.* So how do we tell gMock that `GetDomainOwner()` can be called with some other arguments as well? The standard technique is to add a "catch all" `EXPECT_CALL`: ```cpp EXPECT_CALL(mock_registry, GetDomainOwner(_)) .Times(AnyNumber()); // catches all other calls to this method. EXPECT_CALL(mock_registry, GetDomainOwner("google.com")) .WillRepeatedly(Return("Larry Page")); ``` Remember that `_` is the wildcard matcher that matches anything. With this, if `GetDomainOwner("google.com")` is called, it will do what the second `EXPECT_CALL` says; if it is called with a different argument, it will do what the first `EXPECT_CALL` says. Note that the order of the two `EXPECT_CALL`s is important, as a newer `EXPECT_CALL` takes precedence over an older one. For more on uninteresting calls, nice mocks, and strict mocks, read ["The Nice, the Strict, and the Naggy"](#NiceStrictNaggy). ### Ignoring Uninteresting Arguments {#ParameterlessExpectations} If your test doesn't care about the parameters (it only cares about the number or order of calls), you can often simply omit the parameter list: ```cpp // Expect foo.Bar( ... ) twice with any arguments. EXPECT_CALL(foo, Bar).Times(2); // Delegate to the given method whenever the factory is invoked. ON_CALL(foo_factory, MakeFoo) .WillByDefault(&BuildFooForTest); ``` This functionality is only available when a method is not overloaded; to prevent unexpected behavior it is a compilation error to try to set an expectation on a method where the specific overload is ambiguous. You can work around this by supplying a [simpler mock interface](#SimplerInterfaces) than the mocked class provides. This pattern is also useful when the arguments are interesting, but match logic is substantially complex. You can leave the argument list unspecified and use SaveArg actions to [save the values for later verification](#SaveArgVerify). If you do that, you can easily differentiate calling the method the wrong number of times from calling it with the wrong arguments. ### Expecting Ordered Calls {#OrderedCalls} Although an `EXPECT_CALL()` statement defined later takes precedence when gMock tries to match a function call with an expectation, by default calls don't have to happen in the order `EXPECT_CALL()` statements are written. For example, if the arguments match the matchers in the second `EXPECT_CALL()`, but not those in the first and third, then the second expectation will be used. If you would rather have all calls occur in the order of the expectations, put the `EXPECT_CALL()` statements in a block where you define a variable of type `InSequence`: ```cpp using ::testing::_; using ::testing::InSequence; { InSequence s; EXPECT_CALL(foo, DoThis(5)); EXPECT_CALL(bar, DoThat(_)) .Times(2); EXPECT_CALL(foo, DoThis(6)); } ``` In this example, we expect a call to `foo.DoThis(5)`, followed by two calls to `bar.DoThat()` where the argument can be anything, which are in turn followed by a call to `foo.DoThis(6)`. If a call occurred out-of-order, gMock will report an error. ### Expecting Partially Ordered Calls {#PartialOrder} Sometimes requiring everything to occur in a predetermined order can lead to brittle tests. For example, we may care about `A` occurring before both `B` and `C`, but aren't interested in the relative order of `B` and `C`. In this case, the test should reflect our real intent, instead of being overly constraining. gMock allows you to impose an arbitrary DAG (directed acyclic graph) on the calls. One way to express the DAG is to use the [`After` clause](reference/mocking.md#EXPECT_CALL.After) of `EXPECT_CALL`. Another way is via the `InSequence()` clause (not the same as the `InSequence` class), which we borrowed from jMock 2. It's less flexible than `After()`, but more convenient when you have long chains of sequential calls, as it doesn't require you to come up with different names for the expectations in the chains. Here's how it works: If we view `EXPECT_CALL()` statements as nodes in a graph, and add an edge from node A to node B wherever A must occur before B, we can get a DAG. We use the term "sequence" to mean a directed path in this DAG. Now, if we decompose the DAG into sequences, we just need to know which sequences each `EXPECT_CALL()` belongs to in order to be able to reconstruct the original DAG. So, to specify the partial order on the expectations we need to do two things: first to define some `Sequence` objects, and then for each `EXPECT_CALL()` say which `Sequence` objects it is part of. Expectations in the same sequence must occur in the order they are written. For example, ```cpp using ::testing::Sequence; ... Sequence s1, s2; EXPECT_CALL(foo, A()) .InSequence(s1, s2); EXPECT_CALL(bar, B()) .InSequence(s1); EXPECT_CALL(bar, C()) .InSequence(s2); EXPECT_CALL(foo, D()) .InSequence(s2); ``` specifies the following DAG (where `s1` is `A -> B`, and `s2` is `A -> C -> D`): ```text +---> B | A ---| | +---> C ---> D ``` This means that A must occur before B and C, and C must occur before D. There's no restriction about the order other than these. ### Controlling When an Expectation Retires When a mock method is called, gMock only considers expectations that are still active. An expectation is active when created, and becomes inactive (aka *retires*) when a call that has to occur later has occurred. For example, in ```cpp using ::testing::_; using ::testing::Sequence; ... Sequence s1, s2; EXPECT_CALL(log, Log(WARNING, _, "File too large.")) // #1 .Times(AnyNumber()) .InSequence(s1, s2); EXPECT_CALL(log, Log(WARNING, _, "Data set is empty.")) // #2 .InSequence(s1); EXPECT_CALL(log, Log(WARNING, _, "User not found.")) // #3 .InSequence(s2); ``` as soon as either #2 or #3 is matched, #1 will retire. If a warning `"File too large."` is logged after this, it will be an error. Note that an expectation doesn't retire automatically when it's saturated. For example, ```cpp using ::testing::_; ... EXPECT_CALL(log, Log(WARNING, _, _)); // #1 EXPECT_CALL(log, Log(WARNING, _, "File too large.")); // #2 ``` says that there will be exactly one warning with the message `"File too large."`. If the second warning contains this message too, #2 will match again and result in an upper-bound-violated error. If this is not what you want, you can ask an expectation to retire as soon as it becomes saturated: ```cpp using ::testing::_; ... EXPECT_CALL(log, Log(WARNING, _, _)); // #1 EXPECT_CALL(log, Log(WARNING, _, "File too large.")) // #2 .RetiresOnSaturation(); ``` Here #2 can be used only once, so if you have two warnings with the message `"File too large."`, the first will match #2 and the second will match #1 - there will be no error. ## Using Actions ### Returning References from Mock Methods If a mock function's return type is a reference, you need to use `ReturnRef()` instead of `Return()` to return a result: ```cpp using ::testing::ReturnRef; class MockFoo : public Foo { public: MOCK_METHOD(Bar&, GetBar, (), (override)); }; ... MockFoo foo; Bar bar; EXPECT_CALL(foo, GetBar()) .WillOnce(ReturnRef(bar)); ... ``` ### Returning Live Values from Mock Methods The `Return(x)` action saves a copy of `x` when the action is created, and always returns the same value whenever it's executed. Sometimes you may want to instead return the *live* value of `x` (i.e. its value at the time when the action is *executed*.). Use either `ReturnRef()` or `ReturnPointee()` for this purpose. If the mock function's return type is a reference, you can do it using `ReturnRef(x)`, as shown in the previous recipe ("Returning References from Mock Methods"). However, gMock doesn't let you use `ReturnRef()` in a mock function whose return type is not a reference, as doing that usually indicates a user error. So, what shall you do? Though you may be tempted, DO NOT use `std::ref()`: ```cpp using testing::Return; class MockFoo : public Foo { public: MOCK_METHOD(int, GetValue, (), (override)); }; ... int x = 0; MockFoo foo; EXPECT_CALL(foo, GetValue()) .WillRepeatedly(Return(std::ref(x))); // Wrong! x = 42; EXPECT_EQ(42, foo.GetValue()); ``` Unfortunately, it doesn't work here. The above code will fail with error: ```text Value of: foo.GetValue() Actual: 0 Expected: 42 ``` The reason is that `Return(*value*)` converts `value` to the actual return type of the mock function at the time when the action is *created*, not when it is *executed*. (This behavior was chosen for the action to be safe when `value` is a proxy object that references some temporary objects.) As a result, `std::ref(x)` is converted to an `int` value (instead of a `const int&`) when the expectation is set, and `Return(std::ref(x))` will always return 0. `ReturnPointee(pointer)` was provided to solve this problem specifically. It returns the value pointed to by `pointer` at the time the action is *executed*: ```cpp using testing::ReturnPointee; ... int x = 0; MockFoo foo; EXPECT_CALL(foo, GetValue()) .WillRepeatedly(ReturnPointee(&x)); // Note the & here. x = 42; EXPECT_EQ(42, foo.GetValue()); // This will succeed now. ``` ### Combining Actions Want to do more than one thing when a function is called? That's fine. `DoAll()` allow you to do sequence of actions every time. Only the return value of the last action in the sequence will be used. ```cpp using ::testing::_; using ::testing::DoAll; class MockFoo : public Foo { public: MOCK_METHOD(bool, Bar, (int n), (override)); }; ... EXPECT_CALL(foo, Bar(_)) .WillOnce(DoAll(action_1, action_2, ... action_n)); ``` ### Verifying Complex Arguments {#SaveArgVerify} If you want to verify that a method is called with a particular argument but the match criteria is complex, it can be difficult to distinguish between cardinality failures (calling the method the wrong number of times) and argument match failures. Similarly, if you are matching multiple parameters, it may not be easy to distinguishing which argument failed to match. For example: ```cpp // Not ideal: this could fail because of a problem with arg1 or arg2, or maybe // just the method wasn't called. EXPECT_CALL(foo, SendValues(_, ElementsAre(1, 4, 4, 7), EqualsProto( ... ))); ``` You can instead save the arguments and test them individually: ```cpp EXPECT_CALL(foo, SendValues) .WillOnce(DoAll(SaveArg<1>(&actual_array), SaveArg<2>(&actual_proto))); ... run the test EXPECT_THAT(actual_array, ElementsAre(1, 4, 4, 7)); EXPECT_THAT(actual_proto, EqualsProto( ... )); ``` ### Mocking Side Effects {#MockingSideEffects} Sometimes a method exhibits its effect not via returning a value but via side effects. For example, it may change some global state or modify an output argument. To mock side effects, in general you can define your own action by implementing `::testing::ActionInterface`. If all you need to do is to change an output argument, the built-in `SetArgPointee()` action is convenient: ```cpp using ::testing::_; using ::testing::SetArgPointee; class MockMutator : public Mutator { public: MOCK_METHOD(void, Mutate, (bool mutate, int* value), (override)); ... } ... MockMutator mutator; EXPECT_CALL(mutator, Mutate(true, _)) .WillOnce(SetArgPointee<1>(5)); ``` In this example, when `mutator.Mutate()` is called, we will assign 5 to the `int` variable pointed to by argument #1 (0-based). `SetArgPointee()` conveniently makes an internal copy of the value you pass to it, removing the need to keep the value in scope and alive. The implication however is that the value must have a copy constructor and assignment operator. If the mock method also needs to return a value as well, you can chain `SetArgPointee()` with `Return()` using `DoAll()`, remembering to put the `Return()` statement last: ```cpp using ::testing::_; using ::testing::DoAll; using ::testing::Return; using ::testing::SetArgPointee; class MockMutator : public Mutator { public: ... MOCK_METHOD(bool, MutateInt, (int* value), (override)); } ... MockMutator mutator; EXPECT_CALL(mutator, MutateInt(_)) .WillOnce(DoAll(SetArgPointee<0>(5), Return(true))); ``` Note, however, that if you use the `ReturnOKWith()` method, it will override the values provided by `SetArgPointee()` in the response parameters of your function call. If the output argument is an array, use the `SetArrayArgument(first, last)` action instead. It copies the elements in source range `[first, last)` to the array pointed to by the `N`-th (0-based) argument: ```cpp using ::testing::NotNull; using ::testing::SetArrayArgument; class MockArrayMutator : public ArrayMutator { public: MOCK_METHOD(void, Mutate, (int* values, int num_values), (override)); ... } ... MockArrayMutator mutator; int values[5] = {1, 2, 3, 4, 5}; EXPECT_CALL(mutator, Mutate(NotNull(), 5)) .WillOnce(SetArrayArgument<0>(values, values + 5)); ``` This also works when the argument is an output iterator: ```cpp using ::testing::_; using ::testing::SetArrayArgument; class MockRolodex : public Rolodex { public: MOCK_METHOD(void, GetNames, (std::back_insert_iterator>), (override)); ... } ... MockRolodex rolodex; vector names = {"George", "John", "Thomas"}; EXPECT_CALL(rolodex, GetNames(_)) .WillOnce(SetArrayArgument<0>(names.begin(), names.end())); ``` ### Changing a Mock Object's Behavior Based on the State If you expect a call to change the behavior of a mock object, you can use `::testing::InSequence` to specify different behaviors before and after the call: ```cpp using ::testing::InSequence; using ::testing::Return; ... { InSequence seq; EXPECT_CALL(my_mock, IsDirty()) .WillRepeatedly(Return(true)); EXPECT_CALL(my_mock, Flush()); EXPECT_CALL(my_mock, IsDirty()) .WillRepeatedly(Return(false)); } my_mock.FlushIfDirty(); ``` This makes `my_mock.IsDirty()` return `true` before `my_mock.Flush()` is called and return `false` afterwards. If the behavior change is more complex, you can store the effects in a variable and make a mock method get its return value from that variable: ```cpp using ::testing::_; using ::testing::SaveArg; using ::testing::Return; ACTION_P(ReturnPointee, p) { return *p; } ... int previous_value = 0; EXPECT_CALL(my_mock, GetPrevValue) .WillRepeatedly(ReturnPointee(&previous_value)); EXPECT_CALL(my_mock, UpdateValue) .WillRepeatedly(SaveArg<0>(&previous_value)); my_mock.DoSomethingToUpdateValue(); ``` Here `my_mock.GetPrevValue()` will always return the argument of the last `UpdateValue()` call. ### Setting the Default Value for a Return Type {#DefaultValue} If a mock method's return type is a built-in C++ type or pointer, by default it will return 0 when invoked. Also, in C++ 11 and above, a mock method whose return type has a default constructor will return a default-constructed value by default. You only need to specify an action if this default value doesn't work for you. Sometimes, you may want to change this default value, or you may want to specify a default value for types gMock doesn't know about. You can do this using the `::testing::DefaultValue` class template: ```cpp using ::testing::DefaultValue; class MockFoo : public Foo { public: MOCK_METHOD(Bar, CalculateBar, (), (override)); }; ... Bar default_bar; // Sets the default return value for type Bar. DefaultValue::Set(default_bar); MockFoo foo; // We don't need to specify an action here, as the default // return value works for us. EXPECT_CALL(foo, CalculateBar()); foo.CalculateBar(); // This should return default_bar. // Unsets the default return value. DefaultValue::Clear(); ``` Please note that changing the default value for a type can make your tests hard to understand. We recommend you to use this feature judiciously. For example, you may want to make sure the `Set()` and `Clear()` calls are right next to the code that uses your mock. ### Setting the Default Actions for a Mock Method You've learned how to change the default value of a given type. However, this may be too coarse for your purpose: perhaps you have two mock methods with the same return type and you want them to have different behaviors. The `ON_CALL()` macro allows you to customize your mock's behavior at the method level: ```cpp using ::testing::_; using ::testing::AnyNumber; using ::testing::Gt; using ::testing::Return; ... ON_CALL(foo, Sign(_)) .WillByDefault(Return(-1)); ON_CALL(foo, Sign(0)) .WillByDefault(Return(0)); ON_CALL(foo, Sign(Gt(0))) .WillByDefault(Return(1)); EXPECT_CALL(foo, Sign(_)) .Times(AnyNumber()); foo.Sign(5); // This should return 1. foo.Sign(-9); // This should return -1. foo.Sign(0); // This should return 0. ``` As you may have guessed, when there are more than one `ON_CALL()` statements, the newer ones in the order take precedence over the older ones. In other words, the **last** one that matches the function arguments will be used. This matching order allows you to set up the common behavior in a mock object's constructor or the test fixture's set-up phase and specialize the mock's behavior later. Note that both `ON_CALL` and `EXPECT_CALL` have the same "later statements take precedence" rule, but they don't interact. That is, `EXPECT_CALL`s have their own precedence order distinct from the `ON_CALL` precedence order. ### Using Functions/Methods/Functors/Lambdas as Actions {#FunctionsAsActions} If the built-in actions don't suit you, you can use an existing callable (function, `std::function`, method, functor, lambda) as an action. ```cpp using ::testing::_; using ::testing::Invoke; class MockFoo : public Foo { public: MOCK_METHOD(int, Sum, (int x, int y), (override)); MOCK_METHOD(bool, ComplexJob, (int x), (override)); }; int CalculateSum(int x, int y) { return x + y; } int Sum3(int x, int y, int z) { return x + y + z; } class Helper { public: bool ComplexJob(int x); }; ... MockFoo foo; Helper helper; EXPECT_CALL(foo, Sum(_, _)) .WillOnce(&CalculateSum) .WillRepeatedly(Invoke(NewPermanentCallback(Sum3, 1))); EXPECT_CALL(foo, ComplexJob(_)) .WillOnce(Invoke(&helper, &Helper::ComplexJob)) .WillOnce([] { return true; }) .WillRepeatedly([](int x) { return x > 0; }); foo.Sum(5, 6); // Invokes CalculateSum(5, 6). foo.Sum(2, 3); // Invokes Sum3(1, 2, 3). foo.ComplexJob(10); // Invokes helper.ComplexJob(10). foo.ComplexJob(-1); // Invokes the inline lambda. ``` The only requirement is that the type of the function, etc must be *compatible* with the signature of the mock function, meaning that the latter's arguments (if it takes any) can be implicitly converted to the corresponding arguments of the former, and the former's return type can be implicitly converted to that of the latter. So, you can invoke something whose type is *not* exactly the same as the mock function, as long as it's safe to do so - nice, huh? Note that: * The action takes ownership of the callback and will delete it when the action itself is destructed. * If the type of a callback is derived from a base callback type `C`, you need to implicitly cast it to `C` to resolve the overloading, e.g. ```cpp using ::testing::Invoke; ... ResultCallback* is_ok = ...; ... Invoke(is_ok) ...; // This works. BlockingClosure* done = new BlockingClosure; ... Invoke(implicit_cast(done)) ...; // The cast is necessary. ``` ### Using Functions with Extra Info as Actions The function or functor you call using `Invoke()` must have the same number of arguments as the mock function you use it for. Sometimes you may have a function that takes more arguments, and you are willing to pass in the extra arguments yourself to fill the gap. You can do this in gMock using callbacks with pre-bound arguments. Here's an example: ```cpp using ::testing::Invoke; class MockFoo : public Foo { public: MOCK_METHOD(char, DoThis, (int n), (override)); }; char SignOfSum(int x, int y) { const int sum = x + y; return (sum > 0) ? '+' : (sum < 0) ? '-' : '0'; } TEST_F(FooTest, Test) { MockFoo foo; EXPECT_CALL(foo, DoThis(2)) .WillOnce(Invoke(NewPermanentCallback(SignOfSum, 5))); EXPECT_EQ('+', foo.DoThis(2)); // Invokes SignOfSum(5, 2). } ``` ### Invoking a Function/Method/Functor/Lambda/Callback Without Arguments `Invoke()` passes the mock function's arguments to the function, etc being invoked such that the callee has the full context of the call to work with. If the invoked function is not interested in some or all of the arguments, it can simply ignore them. Yet, a common pattern is that a test author wants to invoke a function without the arguments of the mock function. She could do that using a wrapper function that throws away the arguments before invoking an underlining nullary function. Needless to say, this can be tedious and obscures the intent of the test. There are two solutions to this problem. First, you can pass any callable of zero args as an action. Alternatively, use `InvokeWithoutArgs()`, which is like `Invoke()` except that it doesn't pass the mock function's arguments to the callee. Here's an example of each: ```cpp using ::testing::_; using ::testing::InvokeWithoutArgs; class MockFoo : public Foo { public: MOCK_METHOD(bool, ComplexJob, (int n), (override)); }; bool Job1() { ... } bool Job2(int n, char c) { ... } ... MockFoo foo; EXPECT_CALL(foo, ComplexJob(_)) .WillOnce([] { Job1(); }); .WillOnce(InvokeWithoutArgs(NewPermanentCallback(Job2, 5, 'a'))); foo.ComplexJob(10); // Invokes Job1(). foo.ComplexJob(20); // Invokes Job2(5, 'a'). ``` Note that: * The action takes ownership of the callback and will delete it when the action itself is destructed. * If the type of a callback is derived from a base callback type `C`, you need to implicitly cast it to `C` to resolve the overloading, e.g. ```cpp using ::testing::InvokeWithoutArgs; ... ResultCallback* is_ok = ...; ... InvokeWithoutArgs(is_ok) ...; // This works. BlockingClosure* done = ...; ... InvokeWithoutArgs(implicit_cast(done)) ...; // The cast is necessary. ``` ### Invoking an Argument of the Mock Function Sometimes a mock function will receive a function pointer, a functor (in other words, a "callable") as an argument, e.g. ```cpp class MockFoo : public Foo { public: MOCK_METHOD(bool, DoThis, (int n, (ResultCallback1* callback)), (override)); }; ``` and you may want to invoke this callable argument: ```cpp using ::testing::_; ... MockFoo foo; EXPECT_CALL(foo, DoThis(_, _)) .WillOnce(...); // Will execute callback->Run(5), where callback is the // second argument DoThis() receives. ``` {: .callout .note} NOTE: The section below is legacy documentation from before C++ had lambdas: Arghh, you need to refer to a mock function argument but C++ has no lambda (yet), so you have to define your own action. :-( Or do you really? Well, gMock has an action to solve *exactly* this problem: ```cpp InvokeArgument(arg_1, arg_2, ..., arg_m) ``` will invoke the `N`-th (0-based) argument the mock function receives, with `arg_1`, `arg_2`, ..., and `arg_m`. No matter if the argument is a function pointer, a functor, or a callback. gMock handles them all. With that, you could write: ```cpp using ::testing::_; using ::testing::InvokeArgument; ... EXPECT_CALL(foo, DoThis(_, _)) .WillOnce(InvokeArgument<1>(5)); // Will execute callback->Run(5), where callback is the // second argument DoThis() receives. ``` What if the callable takes an argument by reference? No problem - just wrap it inside `std::ref()`: ```cpp ... MOCK_METHOD(bool, Bar, ((ResultCallback2* callback)), (override)); ... using ::testing::_; using ::testing::InvokeArgument; ... MockFoo foo; Helper helper; ... EXPECT_CALL(foo, Bar(_)) .WillOnce(InvokeArgument<0>(5, std::ref(helper))); // std::ref(helper) guarantees that a reference to helper, not a copy of // it, will be passed to the callback. ``` What if the callable takes an argument by reference and we do **not** wrap the argument in `std::ref()`? Then `InvokeArgument()` will *make a copy* of the argument, and pass a *reference to the copy*, instead of a reference to the original value, to the callable. This is especially handy when the argument is a temporary value: ```cpp ... MOCK_METHOD(bool, DoThat, (bool (*f)(const double& x, const string& s)), (override)); ... using ::testing::_; using ::testing::InvokeArgument; ... MockFoo foo; ... EXPECT_CALL(foo, DoThat(_)) .WillOnce(InvokeArgument<0>(5.0, string("Hi"))); // Will execute (*f)(5.0, string("Hi")), where f is the function pointer // DoThat() receives. Note that the values 5.0 and string("Hi") are // temporary and dead once the EXPECT_CALL() statement finishes. Yet // it's fine to perform this action later, since a copy of the values // are kept inside the InvokeArgument action. ``` ### Ignoring an Action's Result Sometimes you have an action that returns *something*, but you need an action that returns `void` (perhaps you want to use it in a mock function that returns `void`, or perhaps it needs to be used in `DoAll()` and it's not the last in the list). `IgnoreResult()` lets you do that. For example: ```cpp using ::testing::_; using ::testing::DoAll; using ::testing::IgnoreResult; using ::testing::Return; int Process(const MyData& data); string DoSomething(); class MockFoo : public Foo { public: MOCK_METHOD(void, Abc, (const MyData& data), (override)); MOCK_METHOD(bool, Xyz, (), (override)); }; ... MockFoo foo; EXPECT_CALL(foo, Abc(_)) // .WillOnce(Invoke(Process)); // The above line won't compile as Process() returns int but Abc() needs // to return void. .WillOnce(IgnoreResult(Process)); EXPECT_CALL(foo, Xyz()) .WillOnce(DoAll(IgnoreResult(DoSomething), // Ignores the string DoSomething() returns. Return(true))); ``` Note that you **cannot** use `IgnoreResult()` on an action that already returns `void`. Doing so will lead to ugly compiler errors. ### Selecting an Action's Arguments {#SelectingArgs} Say you have a mock function `Foo()` that takes seven arguments, and you have a custom action that you want to invoke when `Foo()` is called. Trouble is, the custom action only wants three arguments: ```cpp using ::testing::_; using ::testing::Invoke; ... MOCK_METHOD(bool, Foo, (bool visible, const string& name, int x, int y, (const map>), double& weight, double min_weight, double max_wight)); ... bool IsVisibleInQuadrant1(bool visible, int x, int y) { return visible && x >= 0 && y >= 0; } ... EXPECT_CALL(mock, Foo) .WillOnce(Invoke(IsVisibleInQuadrant1)); // Uh, won't compile. :-( ``` To please the compiler God, you need to define an "adaptor" that has the same signature as `Foo()` and calls the custom action with the right arguments: ```cpp using ::testing::_; using ::testing::Invoke; ... bool MyIsVisibleInQuadrant1(bool visible, const string& name, int x, int y, const map, double>& weight, double min_weight, double max_wight) { return IsVisibleInQuadrant1(visible, x, y); } ... EXPECT_CALL(mock, Foo) .WillOnce(Invoke(MyIsVisibleInQuadrant1)); // Now it works. ``` But isn't this awkward? gMock provides a generic *action adaptor*, so you can spend your time minding more important business than writing your own adaptors. Here's the syntax: ```cpp WithArgs(action) ``` creates an action that passes the arguments of the mock function at the given indices (0-based) to the inner `action` and performs it. Using `WithArgs`, our original example can be written as: ```cpp using ::testing::_; using ::testing::Invoke; using ::testing::WithArgs; ... EXPECT_CALL(mock, Foo) .WillOnce(WithArgs<0, 2, 3>(Invoke(IsVisibleInQuadrant1))); // No need to define your own adaptor. ``` For better readability, gMock also gives you: * `WithoutArgs(action)` when the inner `action` takes *no* argument, and * `WithArg(action)` (no `s` after `Arg`) when the inner `action` takes *one* argument. As you may have realized, `InvokeWithoutArgs(...)` is just syntactic sugar for `WithoutArgs(Invoke(...))`. Here are more tips: * The inner action used in `WithArgs` and friends does not have to be `Invoke()` -- it can be anything. * You can repeat an argument in the argument list if necessary, e.g. `WithArgs<2, 3, 3, 5>(...)`. * You can change the order of the arguments, e.g. `WithArgs<3, 2, 1>(...)`. * The types of the selected arguments do *not* have to match the signature of the inner action exactly. It works as long as they can be implicitly converted to the corresponding arguments of the inner action. For example, if the 4-th argument of the mock function is an `int` and `my_action` takes a `double`, `WithArg<4>(my_action)` will work. ### Ignoring Arguments in Action Functions The [selecting-an-action's-arguments](#SelectingArgs) recipe showed us one way to make a mock function and an action with incompatible argument lists fit together. The downside is that wrapping the action in `WithArgs<...>()` can get tedious for people writing the tests. If you are defining a function (or method, functor, lambda, callback) to be used with `Invoke*()`, and you are not interested in some of its arguments, an alternative to `WithArgs` is to declare the uninteresting arguments as `Unused`. This makes the definition less cluttered and less fragile in case the types of the uninteresting arguments change. It could also increase the chance the action function can be reused. For example, given ```cpp public: MOCK_METHOD(double, Foo, double(const string& label, double x, double y), (override)); MOCK_METHOD(double, Bar, (int index, double x, double y), (override)); ``` instead of ```cpp using ::testing::_; using ::testing::Invoke; double DistanceToOriginWithLabel(const string& label, double x, double y) { return sqrt(x*x + y*y); } double DistanceToOriginWithIndex(int index, double x, double y) { return sqrt(x*x + y*y); } ... EXPECT_CALL(mock, Foo("abc", _, _)) .WillOnce(Invoke(DistanceToOriginWithLabel)); EXPECT_CALL(mock, Bar(5, _, _)) .WillOnce(Invoke(DistanceToOriginWithIndex)); ``` you could write ```cpp using ::testing::_; using ::testing::Invoke; using ::testing::Unused; double DistanceToOrigin(Unused, double x, double y) { return sqrt(x*x + y*y); } ... EXPECT_CALL(mock, Foo("abc", _, _)) .WillOnce(Invoke(DistanceToOrigin)); EXPECT_CALL(mock, Bar(5, _, _)) .WillOnce(Invoke(DistanceToOrigin)); ``` ### Sharing Actions Just like matchers, a gMock action object consists of a pointer to a ref-counted implementation object. Therefore copying actions is also allowed and very efficient. When the last action that references the implementation object dies, the implementation object will be deleted. If you have some complex action that you want to use again and again, you may not have to build it from scratch every time. If the action doesn't have an internal state (i.e. if it always does the same thing no matter how many times it has been called), you can assign it to an action variable and use that variable repeatedly. For example: ```cpp using ::testing::Action; using ::testing::DoAll; using ::testing::Return; using ::testing::SetArgPointee; ... Action set_flag = DoAll(SetArgPointee<0>(5), Return(true)); ... use set_flag in .WillOnce() and .WillRepeatedly() ... ``` However, if the action has its own state, you may be surprised if you share the action object. Suppose you have an action factory `IncrementCounter(init)` which creates an action that increments and returns a counter whose initial value is `init`, using two actions created from the same expression and using a shared action will exhibit different behaviors. Example: ```cpp EXPECT_CALL(foo, DoThis()) .WillRepeatedly(IncrementCounter(0)); EXPECT_CALL(foo, DoThat()) .WillRepeatedly(IncrementCounter(0)); foo.DoThis(); // Returns 1. foo.DoThis(); // Returns 2. foo.DoThat(); // Returns 1 - Blah() uses a different // counter than Bar()'s. ``` versus ```cpp using ::testing::Action; ... Action increment = IncrementCounter(0); EXPECT_CALL(foo, DoThis()) .WillRepeatedly(increment); EXPECT_CALL(foo, DoThat()) .WillRepeatedly(increment); foo.DoThis(); // Returns 1. foo.DoThis(); // Returns 2. foo.DoThat(); // Returns 3 - the counter is shared. ``` ### Testing Asynchronous Behavior One oft-encountered problem with gMock is that it can be hard to test asynchronous behavior. Suppose you had a `EventQueue` class that you wanted to test, and you created a separate `EventDispatcher` interface so that you could easily mock it out. However, the implementation of the class fired all the events on a background thread, which made test timings difficult. You could just insert `sleep()` statements and hope for the best, but that makes your test behavior nondeterministic. A better way is to use gMock actions and `Notification` objects to force your asynchronous test to behave synchronously. ```cpp class MockEventDispatcher : public EventDispatcher { MOCK_METHOD(bool, DispatchEvent, (int32), (override)); }; TEST(EventQueueTest, EnqueueEventTest) { MockEventDispatcher mock_event_dispatcher; EventQueue event_queue(&mock_event_dispatcher); const int32 kEventId = 321; absl::Notification done; EXPECT_CALL(mock_event_dispatcher, DispatchEvent(kEventId)) .WillOnce([&done] { done.Notify(); }); event_queue.EnqueueEvent(kEventId); done.WaitForNotification(); } ``` In the example above, we set our normal gMock expectations, but then add an additional action to notify the `Notification` object. Now we can just call `Notification::WaitForNotification()` in the main thread to wait for the asynchronous call to finish. After that, our test suite is complete and we can safely exit. {: .callout .note} Note: this example has a downside: namely, if the expectation is not satisfied, our test will run forever. It will eventually time-out and fail, but it will take longer and be slightly harder to debug. To alleviate this problem, you can use `WaitForNotificationWithTimeout(ms)` instead of `WaitForNotification()`. ## Misc Recipes on Using gMock ### Mocking Methods That Use Move-Only Types C++11 introduced *move-only types*. A move-only-typed value can be moved from one object to another, but cannot be copied. `std::unique_ptr` is probably the most commonly used move-only type. Mocking a method that takes and/or returns move-only types presents some challenges, but nothing insurmountable. This recipe shows you how you can do it. Note that the support for move-only method arguments was only introduced to gMock in April 2017; in older code, you may find more complex [workarounds](#LegacyMoveOnly) for lack of this feature. Let’s say we are working on a fictional project that lets one post and share snippets called “buzzesâ€. Your code uses these types: ```cpp enum class AccessLevel { kInternal, kPublic }; class Buzz { public: explicit Buzz(AccessLevel access) { ... } ... }; class Buzzer { public: virtual ~Buzzer() {} virtual std::unique_ptr MakeBuzz(StringPiece text) = 0; virtual bool ShareBuzz(std::unique_ptr buzz, int64_t timestamp) = 0; ... }; ``` A `Buzz` object represents a snippet being posted. A class that implements the `Buzzer` interface is capable of creating and sharing `Buzz`es. Methods in `Buzzer` may return a `unique_ptr` or take a `unique_ptr`. Now we need to mock `Buzzer` in our tests. To mock a method that accepts or returns move-only types, you just use the familiar `MOCK_METHOD` syntax as usual: ```cpp class MockBuzzer : public Buzzer { public: MOCK_METHOD(std::unique_ptr, MakeBuzz, (StringPiece text), (override)); MOCK_METHOD(bool, ShareBuzz, (std::unique_ptr buzz, int64_t timestamp), (override)); }; ``` Now that we have the mock class defined, we can use it in tests. In the following code examples, we assume that we have defined a `MockBuzzer` object named `mock_buzzer_`: ```cpp MockBuzzer mock_buzzer_; ``` First let’s see how we can set expectations on the `MakeBuzz()` method, which returns a `unique_ptr`. As usual, if you set an expectation without an action (i.e. the `.WillOnce()` or `.WillRepeatedly()` clause), when that expectation fires, the default action for that method will be taken. Since `unique_ptr<>` has a default constructor that returns a null `unique_ptr`, that’s what you’ll get if you don’t specify an action: ```cpp // Use the default action. EXPECT_CALL(mock_buzzer_, MakeBuzz("hello")); // Triggers the previous EXPECT_CALL. EXPECT_EQ(nullptr, mock_buzzer_.MakeBuzz("hello")); ``` If you are not happy with the default action, you can tweak it as usual; see [Setting Default Actions](#OnCall). If you just need to return a pre-defined move-only value, you can use the `Return(ByMove(...))` action: ```cpp // When this fires, the unique_ptr<> specified by ByMove(...) will // be returned. EXPECT_CALL(mock_buzzer_, MakeBuzz("world")) .WillOnce(Return(ByMove(MakeUnique(AccessLevel::kInternal)))); EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("world")); ``` Note that `ByMove()` is essential here - if you drop it, the code won’t compile. Quiz time! What do you think will happen if a `Return(ByMove(...))` action is performed more than once (e.g. you write `... .WillRepeatedly(Return(ByMove(...)));`)? Come think of it, after the first time the action runs, the source value will be consumed (since it’s a move-only value), so the next time around, there’s no value to move from -- you’ll get a run-time error that `Return(ByMove(...))` can only be run once. If you need your mock method to do more than just moving a pre-defined value, remember that you can always use a lambda or a callable object, which can do pretty much anything you want: ```cpp EXPECT_CALL(mock_buzzer_, MakeBuzz("x")) .WillRepeatedly([](StringPiece text) { return MakeUnique(AccessLevel::kInternal); }); EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("x")); EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("x")); ``` Every time this `EXPECT_CALL` fires, a new `unique_ptr` will be created and returned. You cannot do this with `Return(ByMove(...))`. That covers returning move-only values; but how do we work with methods accepting move-only arguments? The answer is that they work normally, although some actions will not compile when any of method's arguments are move-only. You can always use `Return`, or a [lambda or functor](#FunctionsAsActions): ```cpp using ::testing::Unused; EXPECT_CALL(mock_buzzer_, ShareBuzz(NotNull(), _)).WillOnce(Return(true)); EXPECT_TRUE(mock_buzzer_.ShareBuzz(MakeUnique(AccessLevel::kInternal)), 0); EXPECT_CALL(mock_buzzer_, ShareBuzz(_, _)).WillOnce( [](std::unique_ptr buzz, Unused) { return buzz != nullptr; }); EXPECT_FALSE(mock_buzzer_.ShareBuzz(nullptr, 0)); ``` Many built-in actions (`WithArgs`, `WithoutArgs`,`DeleteArg`, `SaveArg`, ...) could in principle support move-only arguments, but the support for this is not implemented yet. If this is blocking you, please file a bug. A few actions (e.g. `DoAll`) copy their arguments internally, so they can never work with non-copyable objects; you'll have to use functors instead. #### Legacy workarounds for move-only types {#LegacyMoveOnly} Support for move-only function arguments was only introduced to gMock in April of 2017. In older code, you may encounter the following workaround for the lack of this feature (it is no longer necessary - we're including it just for reference): ```cpp class MockBuzzer : public Buzzer { public: MOCK_METHOD(bool, DoShareBuzz, (Buzz* buzz, Time timestamp)); bool ShareBuzz(std::unique_ptr buzz, Time timestamp) override { return DoShareBuzz(buzz.get(), timestamp); } }; ``` The trick is to delegate the `ShareBuzz()` method to a mock method (let’s call it `DoShareBuzz()`) that does not take move-only parameters. Then, instead of setting expectations on `ShareBuzz()`, you set them on the `DoShareBuzz()` mock method: ```cpp MockBuzzer mock_buzzer_; EXPECT_CALL(mock_buzzer_, DoShareBuzz(NotNull(), _)); // When one calls ShareBuzz() on the MockBuzzer like this, the call is // forwarded to DoShareBuzz(), which is mocked. Therefore this statement // will trigger the above EXPECT_CALL. mock_buzzer_.ShareBuzz(MakeUnique(AccessLevel::kInternal), 0); ``` ### Making the Compilation Faster Believe it or not, the *vast majority* of the time spent on compiling a mock class is in generating its constructor and destructor, as they perform non-trivial tasks (e.g. verification of the expectations). What's more, mock methods with different signatures have different types and thus their constructors/destructors need to be generated by the compiler separately. As a result, if you mock many different types of methods, compiling your mock class can get really slow. If you are experiencing slow compilation, you can move the definition of your mock class' constructor and destructor out of the class body and into a `.cc` file. This way, even if you `#include` your mock class in N files, the compiler only needs to generate its constructor and destructor once, resulting in a much faster compilation. Let's illustrate the idea using an example. Here's the definition of a mock class before applying this recipe: ```cpp // File mock_foo.h. ... class MockFoo : public Foo { public: // Since we don't declare the constructor or the destructor, // the compiler will generate them in every translation unit // where this mock class is used. MOCK_METHOD(int, DoThis, (), (override)); MOCK_METHOD(bool, DoThat, (const char* str), (override)); ... more mock methods ... }; ``` After the change, it would look like: ```cpp // File mock_foo.h. ... class MockFoo : public Foo { public: // The constructor and destructor are declared, but not defined, here. MockFoo(); virtual ~MockFoo(); MOCK_METHOD(int, DoThis, (), (override)); MOCK_METHOD(bool, DoThat, (const char* str), (override)); ... more mock methods ... }; ``` and ```cpp // File mock_foo.cc. #include "path/to/mock_foo.h" // The definitions may appear trivial, but the functions actually do a // lot of things through the constructors/destructors of the member // variables used to implement the mock methods. MockFoo::MockFoo() {} MockFoo::~MockFoo() {} ``` ### Forcing a Verification When it's being destroyed, your friendly mock object will automatically verify that all expectations on it have been satisfied, and will generate googletest failures if not. This is convenient as it leaves you with one less thing to worry about. That is, unless you are not sure if your mock object will be destroyed. How could it be that your mock object won't eventually be destroyed? Well, it might be created on the heap and owned by the code you are testing. Suppose there's a bug in that code and it doesn't delete the mock object properly - you could end up with a passing test when there's actually a bug. Using a heap checker is a good idea and can alleviate the concern, but its implementation is not 100% reliable. So, sometimes you do want to *force* gMock to verify a mock object before it is (hopefully) destructed. You can do this with `Mock::VerifyAndClearExpectations(&mock_object)`: ```cpp TEST(MyServerTest, ProcessesRequest) { using ::testing::Mock; MockFoo* const foo = new MockFoo; EXPECT_CALL(*foo, ...)...; // ... other expectations ... // server now owns foo. MyServer server(foo); server.ProcessRequest(...); // In case that server's destructor will forget to delete foo, // this will verify the expectations anyway. Mock::VerifyAndClearExpectations(foo); } // server is destroyed when it goes out of scope here. ``` {: .callout .tip} **Tip:** The `Mock::VerifyAndClearExpectations()` function returns a `bool` to indicate whether the verification was successful (`true` for yes), so you can wrap that function call inside a `ASSERT_TRUE()` if there is no point going further when the verification has failed. Do not set new expectations after verifying and clearing a mock after its use. Setting expectations after code that exercises the mock has undefined behavior. See [Using Mocks in Tests](gmock_for_dummies.md#using-mocks-in-tests) for more information. ### Using Checkpoints {#UsingCheckPoints} Sometimes you might want to test a mock object's behavior in phases whose sizes are each manageable, or you might want to set more detailed expectations about which API calls invoke which mock functions. A technique you can use is to put the expectations in a sequence and insert calls to a dummy "checkpoint" function at specific places. Then you can verify that the mock function calls do happen at the right time. For example, if you are exercising the code: ```cpp Foo(1); Foo(2); Foo(3); ``` and want to verify that `Foo(1)` and `Foo(3)` both invoke `mock.Bar("a")`, but `Foo(2)` doesn't invoke anything, you can write: ```cpp using ::testing::MockFunction; TEST(FooTest, InvokesBarCorrectly) { MyMock mock; // Class MockFunction has exactly one mock method. It is named // Call() and has type F. MockFunction check; { InSequence s; EXPECT_CALL(mock, Bar("a")); EXPECT_CALL(check, Call("1")); EXPECT_CALL(check, Call("2")); EXPECT_CALL(mock, Bar("a")); } Foo(1); check.Call("1"); Foo(2); check.Call("2"); Foo(3); } ``` The expectation spec says that the first `Bar("a")` call must happen before checkpoint "1", the second `Bar("a")` call must happen after checkpoint "2", and nothing should happen between the two checkpoints. The explicit checkpoints make it clear which `Bar("a")` is called by which call to `Foo()`. ### Mocking Destructors Sometimes you want to make sure a mock object is destructed at the right time, e.g. after `bar->A()` is called but before `bar->B()` is called. We already know that you can specify constraints on the [order](#OrderedCalls) of mock function calls, so all we need to do is to mock the destructor of the mock function. This sounds simple, except for one problem: a destructor is a special function with special syntax and special semantics, and the `MOCK_METHOD` macro doesn't work for it: ```cpp MOCK_METHOD(void, ~MockFoo, ()); // Won't compile! ``` The good news is that you can use a simple pattern to achieve the same effect. First, add a mock function `Die()` to your mock class and call it in the destructor, like this: ```cpp class MockFoo : public Foo { ... // Add the following two lines to the mock class. MOCK_METHOD(void, Die, ()); ~MockFoo() override { Die(); } }; ``` (If the name `Die()` clashes with an existing symbol, choose another name.) Now, we have translated the problem of testing when a `MockFoo` object dies to testing when its `Die()` method is called: ```cpp MockFoo* foo = new MockFoo; MockBar* bar = new MockBar; ... { InSequence s; // Expects *foo to die after bar->A() and before bar->B(). EXPECT_CALL(*bar, A()); EXPECT_CALL(*foo, Die()); EXPECT_CALL(*bar, B()); } ``` And that's that. ### Using gMock and Threads {#UsingThreads} In a **unit** test, it's best if you could isolate and test a piece of code in a single-threaded context. That avoids race conditions and dead locks, and makes debugging your test much easier. Yet most programs are multi-threaded, and sometimes to test something we need to pound on it from more than one thread. gMock works for this purpose too. Remember the steps for using a mock: 1. Create a mock object `foo`. 2. Set its default actions and expectations using `ON_CALL()` and `EXPECT_CALL()`. 3. The code under test calls methods of `foo`. 4. Optionally, verify and reset the mock. 5. Destroy the mock yourself, or let the code under test destroy it. The destructor will automatically verify it. If you follow the following simple rules, your mocks and threads can live happily together: * Execute your *test code* (as opposed to the code being tested) in *one* thread. This makes your test easy to follow. * Obviously, you can do step #1 without locking. * When doing step #2 and #5, make sure no other thread is accessing `foo`. Obvious too, huh? * #3 and #4 can be done either in one thread or in multiple threads - anyway you want. gMock takes care of the locking, so you don't have to do any - unless required by your test logic. If you violate the rules (for example, if you set expectations on a mock while another thread is calling its methods), you get undefined behavior. That's not fun, so don't do it. gMock guarantees that the action for a mock function is done in the same thread that called the mock function. For example, in ```cpp EXPECT_CALL(mock, Foo(1)) .WillOnce(action1); EXPECT_CALL(mock, Foo(2)) .WillOnce(action2); ``` if `Foo(1)` is called in thread 1 and `Foo(2)` is called in thread 2, gMock will execute `action1` in thread 1 and `action2` in thread 2. gMock does *not* impose a sequence on actions performed in different threads (doing so may create deadlocks as the actions may need to cooperate). This means that the execution of `action1` and `action2` in the above example *may* interleave. If this is a problem, you should add proper synchronization logic to `action1` and `action2` to make the test thread-safe. Also, remember that `DefaultValue` is a global resource that potentially affects *all* living mock objects in your program. Naturally, you won't want to mess with it from multiple threads or when there still are mocks in action. ### Controlling How Much Information gMock Prints When gMock sees something that has the potential of being an error (e.g. a mock function with no expectation is called, a.k.a. an uninteresting call, which is allowed but perhaps you forgot to explicitly ban the call), it prints some warning messages, including the arguments of the function, the return value, and the stack trace. Hopefully this will remind you to take a look and see if there is indeed a problem. Sometimes you are confident that your tests are correct and may not appreciate such friendly messages. Some other times, you are debugging your tests or learning about the behavior of the code you are testing, and wish you could observe every mock call that happens (including argument values, the return value, and the stack trace). Clearly, one size doesn't fit all. You can control how much gMock tells you using the `--gmock_verbose=LEVEL` command-line flag, where `LEVEL` is a string with three possible values: * `info`: gMock will print all informational messages, warnings, and errors (most verbose). At this setting, gMock will also log any calls to the `ON_CALL/EXPECT_CALL` macros. It will include a stack trace in "uninteresting call" warnings. * `warning`: gMock will print both warnings and errors (less verbose); it will omit the stack traces in "uninteresting call" warnings. This is the default. * `error`: gMock will print errors only (least verbose). Alternatively, you can adjust the value of that flag from within your tests like so: ```cpp ::testing::FLAGS_gmock_verbose = "error"; ``` If you find gMock printing too many stack frames with its informational or warning messages, remember that you can control their amount with the `--gtest_stack_trace_depth=max_depth` flag. Now, judiciously use the right flag to enable gMock serve you better! ### Gaining Super Vision into Mock Calls You have a test using gMock. It fails: gMock tells you some expectations aren't satisfied. However, you aren't sure why: Is there a typo somewhere in the matchers? Did you mess up the order of the `EXPECT_CALL`s? Or is the code under test doing something wrong? How can you find out the cause? Won't it be nice if you have X-ray vision and can actually see the trace of all `EXPECT_CALL`s and mock method calls as they are made? For each call, would you like to see its actual argument values and which `EXPECT_CALL` gMock thinks it matches? If you still need some help to figure out who made these calls, how about being able to see the complete stack trace at each mock call? You can unlock this power by running your test with the `--gmock_verbose=info` flag. For example, given the test program: ```cpp #include "gmock/gmock.h" using testing::_; using testing::HasSubstr; using testing::Return; class MockFoo { public: MOCK_METHOD(void, F, (const string& x, const string& y)); }; TEST(Foo, Bar) { MockFoo mock; EXPECT_CALL(mock, F(_, _)).WillRepeatedly(Return()); EXPECT_CALL(mock, F("a", "b")); EXPECT_CALL(mock, F("c", HasSubstr("d"))); mock.F("a", "good"); mock.F("a", "b"); } ``` if you run it with `--gmock_verbose=info`, you will see this output: ```shell [ RUN ] Foo.Bar foo_test.cc:14: EXPECT_CALL(mock, F(_, _)) invoked Stack trace: ... foo_test.cc:15: EXPECT_CALL(mock, F("a", "b")) invoked Stack trace: ... foo_test.cc:16: EXPECT_CALL(mock, F("c", HasSubstr("d"))) invoked Stack trace: ... foo_test.cc:14: Mock function call matches EXPECT_CALL(mock, F(_, _))... Function call: F(@0x7fff7c8dad40"a",@0x7fff7c8dad10"good") Stack trace: ... foo_test.cc:15: Mock function call matches EXPECT_CALL(mock, F("a", "b"))... Function call: F(@0x7fff7c8dada0"a",@0x7fff7c8dad70"b") Stack trace: ... foo_test.cc:16: Failure Actual function call count doesn't match EXPECT_CALL(mock, F("c", HasSubstr("d")))... Expected: to be called once Actual: never called - unsatisfied and active [ FAILED ] Foo.Bar ``` Suppose the bug is that the `"c"` in the third `EXPECT_CALL` is a typo and should actually be `"a"`. With the above message, you should see that the actual `F("a", "good")` call is matched by the first `EXPECT_CALL`, not the third as you thought. From that it should be obvious that the third `EXPECT_CALL` is written wrong. Case solved. If you are interested in the mock call trace but not the stack traces, you can combine `--gmock_verbose=info` with `--gtest_stack_trace_depth=0` on the test command line. ### Running Tests in Emacs If you build and run your tests in Emacs using the `M-x google-compile` command (as many googletest users do), the source file locations of gMock and googletest errors will be highlighted. Just press `` on one of them and you'll be taken to the offending line. Or, you can just type `C-x`` to jump to the next error. To make it even easier, you can add the following lines to your `~/.emacs` file: ```text (global-set-key "\M-m" 'google-compile) ; m is for make (global-set-key [M-down] 'next-error) (global-set-key [M-up] '(lambda () (interactive) (next-error -1))) ``` Then you can type `M-m` to start a build (if you want to run the test as well, just make sure `foo_test.run` or `runtests` is in the build command you supply after typing `M-m`), or `M-up`/`M-down` to move back and forth between errors. ## Extending gMock ### Writing New Matchers Quickly {#NewMatchers} {: .callout .warning} WARNING: gMock does not guarantee when or how many times a matcher will be invoked. Therefore, all matchers must be functionally pure. See [this section](#PureMatchers) for more details. The `MATCHER*` family of macros can be used to define custom matchers easily. The syntax: ```cpp MATCHER(name, description_string_expression) { statements; } ``` will define a matcher with the given name that executes the statements, which must return a `bool` to indicate if the match succeeds. Inside the statements, you can refer to the value being matched by `arg`, and refer to its type by `arg_type`. The *description string* is a `string`-typed expression that documents what the matcher does, and is used to generate the failure message when the match fails. It can (and should) reference the special `bool` variable `negation`, and should evaluate to the description of the matcher when `negation` is `false`, or that of the matcher's negation when `negation` is `true`. For convenience, we allow the description string to be empty (`""`), in which case gMock will use the sequence of words in the matcher name as the description. For example: ```cpp MATCHER(IsDivisibleBy7, "") { return (arg % 7) == 0; } ``` allows you to write ```cpp // Expects mock_foo.Bar(n) to be called where n is divisible by 7. EXPECT_CALL(mock_foo, Bar(IsDivisibleBy7())); ``` or, ```cpp using ::testing::Not; ... // Verifies that a value is divisible by 7 and the other is not. EXPECT_THAT(some_expression, IsDivisibleBy7()); EXPECT_THAT(some_other_expression, Not(IsDivisibleBy7())); ``` If the above assertions fail, they will print something like: ```shell Value of: some_expression Expected: is divisible by 7 Actual: 27 ... Value of: some_other_expression Expected: not (is divisible by 7) Actual: 21 ``` where the descriptions `"is divisible by 7"` and `"not (is divisible by 7)"` are automatically calculated from the matcher name `IsDivisibleBy7`. As you may have noticed, the auto-generated descriptions (especially those for the negation) may not be so great. You can always override them with a `string` expression of your own: ```cpp MATCHER(IsDivisibleBy7, absl::StrCat(negation ? "isn't" : "is", " divisible by 7")) { return (arg % 7) == 0; } ``` Optionally, you can stream additional information to a hidden argument named `result_listener` to explain the match result. For example, a better definition of `IsDivisibleBy7` is: ```cpp MATCHER(IsDivisibleBy7, "") { if ((arg % 7) == 0) return true; *result_listener << "the remainder is " << (arg % 7); return false; } ``` With this definition, the above assertion will give a better message: ```shell Value of: some_expression Expected: is divisible by 7 Actual: 27 (the remainder is 6) ``` You should let `MatchAndExplain()` print *any additional information* that can help a user understand the match result. Note that it should explain why the match succeeds in case of a success (unless it's obvious) - this is useful when the matcher is used inside `Not()`. There is no need to print the argument value itself, as gMock already prints it for you. {: .callout .note} NOTE: The type of the value being matched (`arg_type`) is determined by the context in which you use the matcher and is supplied to you by the compiler, so you don't need to worry about declaring it (nor can you). This allows the matcher to be polymorphic. For example, `IsDivisibleBy7()` can be used to match any type where the value of `(arg % 7) == 0` can be implicitly converted to a `bool`. In the `Bar(IsDivisibleBy7())` example above, if method `Bar()` takes an `int`, `arg_type` will be `int`; if it takes an `unsigned long`, `arg_type` will be `unsigned long`; and so on. ### Writing New Parameterized Matchers Quickly Sometimes you'll want to define a matcher that has parameters. For that you can use the macro: ```cpp MATCHER_P(name, param_name, description_string) { statements; } ``` where the description string can be either `""` or a `string` expression that references `negation` and `param_name`. For example: ```cpp MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } ``` will allow you to write: ```cpp EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); ``` which may lead to this message (assuming `n` is 10): ```shell Value of: Blah("a") Expected: has absolute value 10 Actual: -9 ``` Note that both the matcher description and its parameter are printed, making the message human-friendly. In the matcher definition body, you can write `foo_type` to reference the type of a parameter named `foo`. For example, in the body of `MATCHER_P(HasAbsoluteValue, value)` above, you can write `value_type` to refer to the type of `value`. gMock also provides `MATCHER_P2`, `MATCHER_P3`, ..., up to `MATCHER_P10` to support multi-parameter matchers: ```cpp MATCHER_Pk(name, param_1, ..., param_k, description_string) { statements; } ``` Please note that the custom description string is for a particular *instance* of the matcher, where the parameters have been bound to actual values. Therefore usually you'll want the parameter values to be part of the description. gMock lets you do that by referencing the matcher parameters in the description string expression. For example, ```cpp using ::testing::PrintToString; MATCHER_P2(InClosedRange, low, hi, absl::StrFormat("%s in range [%s, %s]", negation ? "isn't" : "is", PrintToString(low), PrintToString(hi))) { return low <= arg && arg <= hi; } ... EXPECT_THAT(3, InClosedRange(4, 6)); ``` would generate a failure that contains the message: ```shell Expected: is in range [4, 6] ``` If you specify `""` as the description, the failure message will contain the sequence of words in the matcher name followed by the parameter values printed as a tuple. For example, ```cpp MATCHER_P2(InClosedRange, low, hi, "") { ... } ... EXPECT_THAT(3, InClosedRange(4, 6)); ``` would generate a failure that contains the text: ```shell Expected: in closed range (4, 6) ``` For the purpose of typing, you can view ```cpp MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } ``` as shorthand for ```cpp template FooMatcherPk Foo(p1_type p1, ..., pk_type pk) { ... } ``` When you write `Foo(v1, ..., vk)`, the compiler infers the types of the parameters `v1`, ..., and `vk` for you. If you are not happy with the result of the type inference, you can specify the types by explicitly instantiating the template, as in `Foo(5, false)`. As said earlier, you don't get to (or need to) specify `arg_type` as that's determined by the context in which the matcher is used. You can assign the result of expression `Foo(p1, ..., pk)` to a variable of type `FooMatcherPk`. This can be useful when composing matchers. Matchers that don't have a parameter or have only one parameter have special types: you can assign `Foo()` to a `FooMatcher`-typed variable, and assign `Foo(p)` to a `FooMatcherP`-typed variable. While you can instantiate a matcher template with reference types, passing the parameters by pointer usually makes your code more readable. If, however, you still want to pass a parameter by reference, be aware that in the failure message generated by the matcher you will see the value of the referenced object but not its address. You can overload matchers with different numbers of parameters: ```cpp MATCHER_P(Blah, a, description_string_1) { ... } MATCHER_P2(Blah, a, b, description_string_2) { ... } ``` While it's tempting to always use the `MATCHER*` macros when defining a new matcher, you should also consider implementing the matcher interface directly instead (see the recipes that follow), especially if you need to use the matcher a lot. While these approaches require more work, they give you more control on the types of the value being matched and the matcher parameters, which in general leads to better compiler error messages that pay off in the long run. They also allow overloading matchers based on parameter types (as opposed to just based on the number of parameters). ### Writing New Monomorphic Matchers A matcher of argument type `T` implements the matcher interface for `T` and does two things: it tests whether a value of type `T` matches the matcher, and can describe what kind of values it matches. The latter ability is used for generating readable error messages when expectations are violated. A matcher of `T` must declare a typedef like: ```cpp using is_gtest_matcher = void; ``` and supports the following operations: ```cpp // Match a value and optionally explain into an ostream. bool matched = matcher.MatchAndExplain(value, maybe_os); // where `value` is of type `T` and // `maybe_os` is of type `std::ostream*`, where it can be null if the caller // is not interested in there textual explanation. matcher.DescribeTo(os); matcher.DescribeNegationTo(os); // where `os` is of type `std::ostream*`. ``` If you need a custom matcher but `Truly()` is not a good option (for example, you may not be happy with the way `Truly(predicate)` describes itself, or you may want your matcher to be polymorphic as `Eq(value)` is), you can define a matcher to do whatever you want in two steps: first implement the matcher interface, and then define a factory function to create a matcher instance. The second step is not strictly needed but it makes the syntax of using the matcher nicer. For example, you can define a matcher to test whether an `int` is divisible by 7 and then use it like this: ```cpp using ::testing::Matcher; class DivisibleBy7Matcher { public: using is_gtest_matcher = void; bool MatchAndExplain(int n, std::ostream*) const { return (n % 7) == 0; } void DescribeTo(std::ostream* os) const { *os << "is divisible by 7"; } void DescribeNegationTo(std::ostream* os) const { *os << "is not divisible by 7"; } }; Matcher DivisibleBy7() { return DivisibleBy7Matcher(); } ... EXPECT_CALL(foo, Bar(DivisibleBy7())); ``` You may improve the matcher message by streaming additional information to the `os` argument in `MatchAndExplain()`: ```cpp class DivisibleBy7Matcher { public: bool MatchAndExplain(int n, std::ostream* os) const { const int remainder = n % 7; if (remainder != 0 && os != nullptr) { *os << "the remainder is " << remainder; } return remainder == 0; } ... }; ``` Then, `EXPECT_THAT(x, DivisibleBy7());` may generate a message like this: ```shell Value of: x Expected: is divisible by 7 Actual: 23 (the remainder is 2) ``` {: .callout .tip} Tip: for convenience, `MatchAndExplain()` can take a `MatchResultListener*` instead of `std::ostream*`. ### Writing New Polymorphic Matchers Expanding what we learned above to *polymorphic* matchers is now just as simple as adding templates in the right place. ```cpp class NotNullMatcher { public: using is_gtest_matcher = void; // To implement a polymorphic matcher, we just need to make MatchAndExplain a // template on its first argument. // In this example, we want to use NotNull() with any pointer, so // MatchAndExplain() accepts a pointer of any type as its first argument. // In general, you can define MatchAndExplain() as an ordinary method or // a method template, or even overload it. template bool MatchAndExplain(T* p, std::ostream*) const { return p != nullptr; } // Describes the property of a value matching this matcher. void DescribeTo(std::ostream* os) const { *os << "is not NULL"; } // Describes the property of a value NOT matching this matcher. void DescribeNegationTo(std::ostream* os) const { *os << "is NULL"; } }; NotNullMatcher NotNull() { return NotNullMatcher(); } ... EXPECT_CALL(foo, Bar(NotNull())); // The argument must be a non-NULL pointer. ``` ### Legacy Matcher Implementation Defining matchers used to be somewhat more complicated, in which it required several supporting classes and virtual functions. To implement a matcher for type `T` using the legacy API you have to derive from `MatcherInterface` and call `MakeMatcher` to construct the object. The interface looks like this: ```cpp class MatchResultListener { public: ... // Streams x to the underlying ostream; does nothing if the ostream // is NULL. template MatchResultListener& operator<<(const T& x); // Returns the underlying ostream. std::ostream* stream(); }; template class MatcherInterface { public: virtual ~MatcherInterface(); // Returns true if and only if the matcher matches x; also explains the match // result to 'listener'. virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; // Describes this matcher to an ostream. virtual void DescribeTo(std::ostream* os) const = 0; // Describes the negation of this matcher to an ostream. virtual void DescribeNegationTo(std::ostream* os) const; }; ``` Fortunately, most of the time you can define a polymorphic matcher easily with the help of `MakePolymorphicMatcher()`. Here's how you can define `NotNull()` as an example: ```cpp using ::testing::MakePolymorphicMatcher; using ::testing::MatchResultListener; using ::testing::PolymorphicMatcher; class NotNullMatcher { public: // To implement a polymorphic matcher, first define a COPYABLE class // that has three members MatchAndExplain(), DescribeTo(), and // DescribeNegationTo(), like the following. // In this example, we want to use NotNull() with any pointer, so // MatchAndExplain() accepts a pointer of any type as its first argument. // In general, you can define MatchAndExplain() as an ordinary method or // a method template, or even overload it. template bool MatchAndExplain(T* p, MatchResultListener* /* listener */) const { return p != NULL; } // Describes the property of a value matching this matcher. void DescribeTo(std::ostream* os) const { *os << "is not NULL"; } // Describes the property of a value NOT matching this matcher. void DescribeNegationTo(std::ostream* os) const { *os << "is NULL"; } }; // To construct a polymorphic matcher, pass an instance of the class // to MakePolymorphicMatcher(). Note the return type. PolymorphicMatcher NotNull() { return MakePolymorphicMatcher(NotNullMatcher()); } ... EXPECT_CALL(foo, Bar(NotNull())); // The argument must be a non-NULL pointer. ``` {: .callout .note} **Note:** Your polymorphic matcher class does **not** need to inherit from `MatcherInterface` or any other class, and its methods do **not** need to be virtual. Like in a monomorphic matcher, you may explain the match result by streaming additional information to the `listener` argument in `MatchAndExplain()`. ### Writing New Cardinalities A cardinality is used in `Times()` to tell gMock how many times you expect a call to occur. It doesn't have to be exact. For example, you can say `AtLeast(5)` or `Between(2, 4)`. If the [built-in set](gmock_cheat_sheet.md#CardinalityList) of cardinalities doesn't suit you, you are free to define your own by implementing the following interface (in namespace `testing`): ```cpp class CardinalityInterface { public: virtual ~CardinalityInterface(); // Returns true if and only if call_count calls will satisfy this cardinality. virtual bool IsSatisfiedByCallCount(int call_count) const = 0; // Returns true if and only if call_count calls will saturate this // cardinality. virtual bool IsSaturatedByCallCount(int call_count) const = 0; // Describes self to an ostream. virtual void DescribeTo(std::ostream* os) const = 0; }; ``` For example, to specify that a call must occur even number of times, you can write ```cpp using ::testing::Cardinality; using ::testing::CardinalityInterface; using ::testing::MakeCardinality; class EvenNumberCardinality : public CardinalityInterface { public: bool IsSatisfiedByCallCount(int call_count) const override { return (call_count % 2) == 0; } bool IsSaturatedByCallCount(int call_count) const override { return false; } void DescribeTo(std::ostream* os) const { *os << "called even number of times"; } }; Cardinality EvenNumber() { return MakeCardinality(new EvenNumberCardinality); } ... EXPECT_CALL(foo, Bar(3)) .Times(EvenNumber()); ``` ### Writing New Actions Quickly {#QuickNewActions} If the built-in actions don't work for you, you can easily define your own one. Just define a functor class with a (possibly templated) call operator, matching the signature of your action. ```cpp struct Increment { template T operator()(T* arg) { return ++(*arg); } } ``` The same approach works with stateful functors (or any callable, really): ``` struct MultiplyBy { template T operator()(T arg) { return arg * multiplier; } int multiplier; } // Then use: // EXPECT_CALL(...).WillOnce(MultiplyBy{7}); ``` #### Legacy macro-based Actions Before C++11, the functor-based actions were not supported; the old way of writing actions was through a set of `ACTION*` macros. We suggest to avoid them in new code; they hide a lot of logic behind the macro, potentially leading to harder-to-understand compiler errors. Nevertheless, we cover them here for completeness. By writing ```cpp ACTION(name) { statements; } ``` in a namespace scope (i.e. not inside a class or function), you will define an action with the given name that executes the statements. The value returned by `statements` will be used as the return value of the action. Inside the statements, you can refer to the K-th (0-based) argument of the mock function as `argK`. For example: ```cpp ACTION(IncrementArg1) { return ++(*arg1); } ``` allows you to write ```cpp ... WillOnce(IncrementArg1()); ``` Note that you don't need to specify the types of the mock function arguments. Rest assured that your code is type-safe though: you'll get a compiler error if `*arg1` doesn't support the `++` operator, or if the type of `++(*arg1)` isn't compatible with the mock function's return type. Another example: ```cpp ACTION(Foo) { (*arg2)(5); Blah(); *arg1 = 0; return arg0; } ``` defines an action `Foo()` that invokes argument #2 (a function pointer) with 5, calls function `Blah()`, sets the value pointed to by argument #1 to 0, and returns argument #0. For more convenience and flexibility, you can also use the following pre-defined symbols in the body of `ACTION`: `argK_type` | The type of the K-th (0-based) argument of the mock function :-------------- | :----------------------------------------------------------- `args` | All arguments of the mock function as a tuple `args_type` | The type of all arguments of the mock function as a tuple `return_type` | The return type of the mock function `function_type` | The type of the mock function For example, when using an `ACTION` as a stub action for mock function: ```cpp int DoSomething(bool flag, int* ptr); ``` we have: Pre-defined Symbol | Is Bound To ------------------ | --------------------------------- `arg0` | the value of `flag` `arg0_type` | the type `bool` `arg1` | the value of `ptr` `arg1_type` | the type `int*` `args` | the tuple `(flag, ptr)` `args_type` | the type `std::tuple` `return_type` | the type `int` `function_type` | the type `int(bool, int*)` #### Legacy macro-based parameterized Actions Sometimes you'll want to parameterize an action you define. For that we have another macro ```cpp ACTION_P(name, param) { statements; } ``` For example, ```cpp ACTION_P(Add, n) { return arg0 + n; } ``` will allow you to write ```cpp // Returns argument #0 + 5. ... WillOnce(Add(5)); ``` For convenience, we use the term *arguments* for the values used to invoke the mock function, and the term *parameters* for the values used to instantiate an action. Note that you don't need to provide the type of the parameter either. Suppose the parameter is named `param`, you can also use the gMock-defined symbol `param_type` to refer to the type of the parameter as inferred by the compiler. For example, in the body of `ACTION_P(Add, n)` above, you can write `n_type` for the type of `n`. gMock also provides `ACTION_P2`, `ACTION_P3`, and etc to support multi-parameter actions. For example, ```cpp ACTION_P2(ReturnDistanceTo, x, y) { double dx = arg0 - x; double dy = arg1 - y; return sqrt(dx*dx + dy*dy); } ``` lets you write ```cpp ... WillOnce(ReturnDistanceTo(5.0, 26.5)); ``` You can view `ACTION` as a degenerated parameterized action where the number of parameters is 0. You can also easily define actions overloaded on the number of parameters: ```cpp ACTION_P(Plus, a) { ... } ACTION_P2(Plus, a, b) { ... } ``` ### Restricting the Type of an Argument or Parameter in an ACTION For maximum brevity and reusability, the `ACTION*` macros don't ask you to provide the types of the mock function arguments and the action parameters. Instead, we let the compiler infer the types for us. Sometimes, however, we may want to be more explicit about the types. There are several tricks to do that. For example: ```cpp ACTION(Foo) { // Makes sure arg0 can be converted to int. int n = arg0; ... use n instead of arg0 here ... } ACTION_P(Bar, param) { // Makes sure the type of arg1 is const char*. ::testing::StaticAssertTypeEq(); // Makes sure param can be converted to bool. bool flag = param; } ``` where `StaticAssertTypeEq` is a compile-time assertion in googletest that verifies two types are the same. ### Writing New Action Templates Quickly Sometimes you want to give an action explicit template parameters that cannot be inferred from its value parameters. `ACTION_TEMPLATE()` supports that and can be viewed as an extension to `ACTION()` and `ACTION_P*()`. The syntax: ```cpp ACTION_TEMPLATE(ActionName, HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } ``` defines an action template that takes *m* explicit template parameters and *n* value parameters, where *m* is in [1, 10] and *n* is in [0, 10]. `name_i` is the name of the *i*-th template parameter, and `kind_i` specifies whether it's a `typename`, an integral constant, or a template. `p_i` is the name of the *i*-th value parameter. Example: ```cpp // DuplicateArg(output) converts the k-th argument of the mock // function to type T and copies it to *output. ACTION_TEMPLATE(DuplicateArg, // Note the comma between int and k: HAS_2_TEMPLATE_PARAMS(int, k, typename, T), AND_1_VALUE_PARAMS(output)) { *output = T(std::get(args)); } ``` To create an instance of an action template, write: ```cpp ActionName(v1, ..., v_n) ``` where the `t`s are the template arguments and the `v`s are the value arguments. The value argument types are inferred by the compiler. For example: ```cpp using ::testing::_; ... int n; EXPECT_CALL(mock, Foo).WillOnce(DuplicateArg<1, unsigned char>(&n)); ``` If you want to explicitly specify the value argument types, you can provide additional template arguments: ```cpp ActionName(v1, ..., v_n) ``` where `u_i` is the desired type of `v_i`. `ACTION_TEMPLATE` and `ACTION`/`ACTION_P*` can be overloaded on the number of value parameters, but not on the number of template parameters. Without the restriction, the meaning of the following is unclear: ```cpp OverloadedAction(x); ``` Are we using a single-template-parameter action where `bool` refers to the type of `x`, or a two-template-parameter action where the compiler is asked to infer the type of `x`? ### Using the ACTION Object's Type If you are writing a function that returns an `ACTION` object, you'll need to know its type. The type depends on the macro used to define the action and the parameter types. The rule is relatively simple: | Given Definition | Expression | Has Type | | ----------------------------- | ------------------- | --------------------- | | `ACTION(Foo)` | `Foo()` | `FooAction` | | `ACTION_TEMPLATE(Foo, HAS_m_TEMPLATE_PARAMS(...), AND_0_VALUE_PARAMS())` | `Foo()` | `FooAction` | | `ACTION_P(Bar, param)` | `Bar(int_value)` | `BarActionP` | | `ACTION_TEMPLATE(Bar, HAS_m_TEMPLATE_PARAMS(...), AND_1_VALUE_PARAMS(p1))` | `Bar(int_value)` | `BarActionP` | | `ACTION_P2(Baz, p1, p2)` | `Baz(bool_value, int_value)` | `BazActionP2` | | `ACTION_TEMPLATE(Baz, HAS_m_TEMPLATE_PARAMS(...), AND_2_VALUE_PARAMS(p1, p2))` | `Baz(bool_value, int_value)` | `BazActionP2` | | ... | ... | ... | Note that we have to pick different suffixes (`Action`, `ActionP`, `ActionP2`, and etc) for actions with different numbers of value parameters, or the action definitions cannot be overloaded on the number of them. ### Writing New Monomorphic Actions {#NewMonoActions} While the `ACTION*` macros are very convenient, sometimes they are inappropriate. For example, despite the tricks shown in the previous recipes, they don't let you directly specify the types of the mock function arguments and the action parameters, which in general leads to unoptimized compiler error messages that can baffle unfamiliar users. They also don't allow overloading actions based on parameter types without jumping through some hoops. An alternative to the `ACTION*` macros is to implement `::testing::ActionInterface`, where `F` is the type of the mock function in which the action will be used. For example: ```cpp template class ActionInterface { public: virtual ~ActionInterface(); // Performs the action. Result is the return type of function type // F, and ArgumentTuple is the tuple of arguments of F. // // For example, if F is int(bool, const string&), then Result would // be int, and ArgumentTuple would be std::tuple. virtual Result Perform(const ArgumentTuple& args) = 0; }; ``` ```cpp using ::testing::_; using ::testing::Action; using ::testing::ActionInterface; using ::testing::MakeAction; typedef int IncrementMethod(int*); class IncrementArgumentAction : public ActionInterface { public: int Perform(const std::tuple& args) override { int* p = std::get<0>(args); // Grabs the first argument. return *p++; } }; Action IncrementArgument() { return MakeAction(new IncrementArgumentAction); } ... EXPECT_CALL(foo, Baz(_)) .WillOnce(IncrementArgument()); int n = 5; foo.Baz(&n); // Should return 5 and change n to 6. ``` ### Writing New Polymorphic Actions {#NewPolyActions} The previous recipe showed you how to define your own action. This is all good, except that you need to know the type of the function in which the action will be used. Sometimes that can be a problem. For example, if you want to use the action in functions with *different* types (e.g. like `Return()` and `SetArgPointee()`). If an action can be used in several types of mock functions, we say it's *polymorphic*. The `MakePolymorphicAction()` function template makes it easy to define such an action: ```cpp namespace testing { template PolymorphicAction MakePolymorphicAction(const Impl& impl); } // namespace testing ``` As an example, let's define an action that returns the second argument in the mock function's argument list. The first step is to define an implementation class: ```cpp class ReturnSecondArgumentAction { public: template Result Perform(const ArgumentTuple& args) const { // To get the i-th (0-based) argument, use std::get(args). return std::get<1>(args); } }; ``` This implementation class does *not* need to inherit from any particular class. What matters is that it must have a `Perform()` method template. This method template takes the mock function's arguments as a tuple in a **single** argument, and returns the result of the action. It can be either `const` or not, but must be invocable with exactly one template argument, which is the result type. In other words, you must be able to call `Perform(args)` where `R` is the mock function's return type and `args` is its arguments in a tuple. Next, we use `MakePolymorphicAction()` to turn an instance of the implementation class into the polymorphic action we need. It will be convenient to have a wrapper for this: ```cpp using ::testing::MakePolymorphicAction; using ::testing::PolymorphicAction; PolymorphicAction ReturnSecondArgument() { return MakePolymorphicAction(ReturnSecondArgumentAction()); } ``` Now, you can use this polymorphic action the same way you use the built-in ones: ```cpp using ::testing::_; class MockFoo : public Foo { public: MOCK_METHOD(int, DoThis, (bool flag, int n), (override)); MOCK_METHOD(string, DoThat, (int x, const char* str1, const char* str2), (override)); }; ... MockFoo foo; EXPECT_CALL(foo, DoThis).WillOnce(ReturnSecondArgument()); EXPECT_CALL(foo, DoThat).WillOnce(ReturnSecondArgument()); ... foo.DoThis(true, 5); // Will return 5. foo.DoThat(1, "Hi", "Bye"); // Will return "Hi". ``` ### Teaching gMock How to Print Your Values When an uninteresting or unexpected call occurs, gMock prints the argument values and the stack trace to help you debug. Assertion macros like `EXPECT_THAT` and `EXPECT_EQ` also print the values in question when the assertion fails. gMock and googletest do this using googletest's user-extensible value printer. This printer knows how to print built-in C++ types, native arrays, STL containers, and any type that supports the `<<` operator. For other types, it prints the raw bytes in the value and hopes that you the user can figure it out. [The GoogleTest advanced guide](advanced.md#teaching-googletest-how-to-print-your-values) explains how to extend the printer to do a better job at printing your particular type than to dump the bytes. ## Useful Mocks Created Using gMock ### Mock std::function {#MockFunction} `std::function` is a general function type introduced in C++11. It is a preferred way of passing callbacks to new interfaces. Functions are copiable, and are not usually passed around by pointer, which makes them tricky to mock. But fear not - `MockFunction` can help you with that. `MockFunction` has a mock method `Call()` with the signature: ```cpp R Call(T1, ..., Tn); ``` It also has a `AsStdFunction()` method, which creates a `std::function` proxy forwarding to Call: ```cpp std::function AsStdFunction(); ``` To use `MockFunction`, first create `MockFunction` object and set up expectations on its `Call` method. Then pass proxy obtained from `AsStdFunction()` to the code you are testing. For example: ```cpp TEST(FooTest, RunsCallbackWithBarArgument) { // 1. Create a mock object. MockFunction mock_function; // 2. Set expectations on Call() method. EXPECT_CALL(mock_function, Call("bar")).WillOnce(Return(1)); // 3. Exercise code that uses std::function. Foo(mock_function.AsStdFunction()); // Foo's signature can be either of: // void Foo(const std::function& fun); // void Foo(std::function fun); // 4. All expectations will be verified when mock_function // goes out of scope and is destroyed. } ``` Remember that function objects created with `AsStdFunction()` are just forwarders. If you create multiple of them, they will share the same set of expectations. Although `std::function` supports unlimited number of arguments, `MockFunction` implementation is limited to ten. If you ever hit that limit... well, your callback has bigger problems than being mockable. :-) asymptote-3.05/LspCpp/third_party/uri/deps/docs/gmock_faq.md0000644000000000000000000003520415031566105022657 0ustar rootroot# Legacy gMock FAQ ### When I call a method on my mock object, the method for the real object is invoked instead. What's the problem? In order for a method to be mocked, it must be *virtual*, unless you use the [high-perf dependency injection technique](gmock_cook_book.md#MockingNonVirtualMethods). ### Can I mock a variadic function? You cannot mock a variadic function (i.e. a function taking ellipsis (`...`) arguments) directly in gMock. The problem is that in general, there is *no way* for a mock object to know how many arguments are passed to the variadic method, and what the arguments' types are. Only the *author of the base class* knows the protocol, and we cannot look into his or her head. Therefore, to mock such a function, the *user* must teach the mock object how to figure out the number of arguments and their types. One way to do it is to provide overloaded versions of the function. Ellipsis arguments are inherited from C and not really a C++ feature. They are unsafe to use and don't work with arguments that have constructors or destructors. Therefore we recommend to avoid them in C++ as much as possible. ### MSVC gives me warning C4301 or C4373 when I define a mock method with a const parameter. Why? If you compile this using Microsoft Visual C++ 2005 SP1: ```cpp class Foo { ... virtual void Bar(const int i) = 0; }; class MockFoo : public Foo { ... MOCK_METHOD(void, Bar, (const int i), (override)); }; ``` You may get the following warning: ```shell warning C4301: 'MockFoo::Bar': overriding virtual function only differs from 'Foo::Bar' by const/volatile qualifier ``` This is a MSVC bug. The same code compiles fine with gcc, for example. If you use Visual C++ 2008 SP1, you would get the warning: ```shell warning C4373: 'MockFoo::Bar': virtual function overrides 'Foo::Bar', previous versions of the compiler did not override when parameters only differed by const/volatile qualifiers ``` In C++, if you *declare* a function with a `const` parameter, the `const` modifier is ignored. Therefore, the `Foo` base class above is equivalent to: ```cpp class Foo { ... virtual void Bar(int i) = 0; // int or const int? Makes no difference. }; ``` In fact, you can *declare* `Bar()` with an `int` parameter, and define it with a `const int` parameter. The compiler will still match them up. Since making a parameter `const` is meaningless in the method declaration, we recommend to remove it in both `Foo` and `MockFoo`. That should workaround the VC bug. Note that we are talking about the *top-level* `const` modifier here. If the function parameter is passed by pointer or reference, declaring the pointee or referee as `const` is still meaningful. For example, the following two declarations are *not* equivalent: ```cpp void Bar(int* p); // Neither p nor *p is const. void Bar(const int* p); // p is not const, but *p is. ``` ### I can't figure out why gMock thinks my expectations are not satisfied. What should I do? You might want to run your test with `--gmock_verbose=info`. This flag lets gMock print a trace of every mock function call it receives. By studying the trace, you'll gain insights on why the expectations you set are not met. If you see the message "The mock function has no default action set, and its return type has no default value set.", then try [adding a default action](gmock_cheat_sheet.md#OnCall). Due to a known issue, unexpected calls on mocks without default actions don't print out a detailed comparison between the actual arguments and the expected arguments. ### My program crashed and `ScopedMockLog` spit out tons of messages. Is it a gMock bug? gMock and `ScopedMockLog` are likely doing the right thing here. When a test crashes, the failure signal handler will try to log a lot of information (the stack trace, and the address map, for example). The messages are compounded if you have many threads with depth stacks. When `ScopedMockLog` intercepts these messages and finds that they don't match any expectations, it prints an error for each of them. You can learn to ignore the errors, or you can rewrite your expectations to make your test more robust, for example, by adding something like: ```cpp using ::testing::AnyNumber; using ::testing::Not; ... // Ignores any log not done by us. EXPECT_CALL(log, Log(_, Not(EndsWith("/my_file.cc")), _)) .Times(AnyNumber()); ``` ### How can I assert that a function is NEVER called? ```cpp using ::testing::_; ... EXPECT_CALL(foo, Bar(_)) .Times(0); ``` ### I have a failed test where gMock tells me TWICE that a particular expectation is not satisfied. Isn't this redundant? When gMock detects a failure, it prints relevant information (the mock function arguments, the state of relevant expectations, and etc) to help the user debug. If another failure is detected, gMock will do the same, including printing the state of relevant expectations. Sometimes an expectation's state didn't change between two failures, and you'll see the same description of the state twice. They are however *not* redundant, as they refer to *different points in time*. The fact they are the same *is* interesting information. ### I get a heapcheck failure when using a mock object, but using a real object is fine. What can be wrong? Does the class (hopefully a pure interface) you are mocking have a virtual destructor? Whenever you derive from a base class, make sure its destructor is virtual. Otherwise Bad Things will happen. Consider the following code: ```cpp class Base { public: // Not virtual, but should be. ~Base() { ... } ... }; class Derived : public Base { public: ... private: std::string value_; }; ... Base* p = new Derived; ... delete p; // Surprise! ~Base() will be called, but ~Derived() will not // - value_ is leaked. ``` By changing `~Base()` to virtual, `~Derived()` will be correctly called when `delete p` is executed, and the heap checker will be happy. ### The "newer expectations override older ones" rule makes writing expectations awkward. Why does gMock do that? When people complain about this, often they are referring to code like: ```cpp using ::testing::Return; ... // foo.Bar() should be called twice, return 1 the first time, and return // 2 the second time. However, I have to write the expectations in the // reverse order. This sucks big time!!! EXPECT_CALL(foo, Bar()) .WillOnce(Return(2)) .RetiresOnSaturation(); EXPECT_CALL(foo, Bar()) .WillOnce(Return(1)) .RetiresOnSaturation(); ``` The problem, is that they didn't pick the **best** way to express the test's intent. By default, expectations don't have to be matched in *any* particular order. If you want them to match in a certain order, you need to be explicit. This is gMock's (and jMock's) fundamental philosophy: it's easy to accidentally over-specify your tests, and we want to make it harder to do so. There are two better ways to write the test spec. You could either put the expectations in sequence: ```cpp using ::testing::Return; ... // foo.Bar() should be called twice, return 1 the first time, and return // 2 the second time. Using a sequence, we can write the expectations // in their natural order. { InSequence s; EXPECT_CALL(foo, Bar()) .WillOnce(Return(1)) .RetiresOnSaturation(); EXPECT_CALL(foo, Bar()) .WillOnce(Return(2)) .RetiresOnSaturation(); } ``` or you can put the sequence of actions in the same expectation: ```cpp using ::testing::Return; ... // foo.Bar() should be called twice, return 1 the first time, and return // 2 the second time. EXPECT_CALL(foo, Bar()) .WillOnce(Return(1)) .WillOnce(Return(2)) .RetiresOnSaturation(); ``` Back to the original questions: why does gMock search the expectations (and `ON_CALL`s) from back to front? Because this allows a user to set up a mock's behavior for the common case early (e.g. in the mock's constructor or the test fixture's set-up phase) and customize it with more specific rules later. If gMock searches from front to back, this very useful pattern won't be possible. ### gMock prints a warning when a function without EXPECT_CALL is called, even if I have set its behavior using ON_CALL. Would it be reasonable not to show the warning in this case? When choosing between being neat and being safe, we lean toward the latter. So the answer is that we think it's better to show the warning. Often people write `ON_CALL`s in the mock object's constructor or `SetUp()`, as the default behavior rarely changes from test to test. Then in the test body they set the expectations, which are often different for each test. Having an `ON_CALL` in the set-up part of a test doesn't mean that the calls are expected. If there's no `EXPECT_CALL` and the method is called, it's possibly an error. If we quietly let the call go through without notifying the user, bugs may creep in unnoticed. If, however, you are sure that the calls are OK, you can write ```cpp using ::testing::_; ... EXPECT_CALL(foo, Bar(_)) .WillRepeatedly(...); ``` instead of ```cpp using ::testing::_; ... ON_CALL(foo, Bar(_)) .WillByDefault(...); ``` This tells gMock that you do expect the calls and no warning should be printed. Also, you can control the verbosity by specifying `--gmock_verbose=error`. Other values are `info` and `warning`. If you find the output too noisy when debugging, just choose a less verbose level. ### How can I delete the mock function's argument in an action? If your mock function takes a pointer argument and you want to delete that argument, you can use testing::DeleteArg() to delete the N'th (zero-indexed) argument: ```cpp using ::testing::_; ... MOCK_METHOD(void, Bar, (X* x, const Y& y)); ... EXPECT_CALL(mock_foo_, Bar(_, _)) .WillOnce(testing::DeleteArg<0>())); ``` ### How can I perform an arbitrary action on a mock function's argument? If you find yourself needing to perform some action that's not supported by gMock directly, remember that you can define your own actions using [`MakeAction()`](#NewMonoActions) or [`MakePolymorphicAction()`](#NewPolyActions), or you can write a stub function and invoke it using [`Invoke()`](#FunctionsAsActions). ```cpp using ::testing::_; using ::testing::Invoke; ... MOCK_METHOD(void, Bar, (X* p)); ... EXPECT_CALL(mock_foo_, Bar(_)) .WillOnce(Invoke(MyAction(...))); ``` ### My code calls a static/global function. Can I mock it? You can, but you need to make some changes. In general, if you find yourself needing to mock a static function, it's a sign that your modules are too tightly coupled (and less flexible, less reusable, less testable, etc). You are probably better off defining a small interface and call the function through that interface, which then can be easily mocked. It's a bit of work initially, but usually pays for itself quickly. This Google Testing Blog [post](https://testing.googleblog.com/2008/06/defeat-static-cling.html) says it excellently. Check it out. ### My mock object needs to do complex stuff. It's a lot of pain to specify the actions. gMock sucks! I know it's not a question, but you get an answer for free any way. :-) With gMock, you can create mocks in C++ easily. And people might be tempted to use them everywhere. Sometimes they work great, and sometimes you may find them, well, a pain to use. So, what's wrong in the latter case? When you write a test without using mocks, you exercise the code and assert that it returns the correct value or that the system is in an expected state. This is sometimes called "state-based testing". Mocks are great for what some call "interaction-based" testing: instead of checking the system state at the very end, mock objects verify that they are invoked the right way and report an error as soon as it arises, giving you a handle on the precise context in which the error was triggered. This is often more effective and economical to do than state-based testing. If you are doing state-based testing and using a test double just to simulate the real object, you are probably better off using a fake. Using a mock in this case causes pain, as it's not a strong point for mocks to perform complex actions. If you experience this and think that mocks suck, you are just not using the right tool for your problem. Or, you might be trying to solve the wrong problem. :-) ### I got a warning "Uninteresting function call encountered - default action taken.." Should I panic? By all means, NO! It's just an FYI. :-) What it means is that you have a mock function, you haven't set any expectations on it (by gMock's rule this means that you are not interested in calls to this function and therefore it can be called any number of times), and it is called. That's OK - you didn't say it's not OK to call the function! What if you actually meant to disallow this function to be called, but forgot to write `EXPECT_CALL(foo, Bar()).Times(0)`? While one can argue that it's the user's fault, gMock tries to be nice and prints you a note. So, when you see the message and believe that there shouldn't be any uninteresting calls, you should investigate what's going on. To make your life easier, gMock dumps the stack trace when an uninteresting call is encountered. From that you can figure out which mock function it is, and how it is called. ### I want to define a custom action. Should I use Invoke() or implement the ActionInterface interface? Either way is fine - you want to choose the one that's more convenient for your circumstance. Usually, if your action is for a particular function type, defining it using `Invoke()` should be easier; if your action can be used in functions of different types (e.g. if you are defining `Return(*value*)`), `MakePolymorphicAction()` is easiest. Sometimes you want precise control on what types of functions the action can be used in, and implementing `ActionInterface` is the way to go here. See the implementation of `Return()` in `gmock-actions.h` for an example. ### I use SetArgPointee() in WillOnce(), but gcc complains about "conflicting return type specified". What does it mean? You got this error as gMock has no idea what value it should return when the mock method is called. `SetArgPointee()` says what the side effect is, but doesn't say what the return value should be. You need `DoAll()` to chain a `SetArgPointee()` with a `Return()` that provides a value appropriate to the API being mocked. See this [recipe](gmock_cook_book.md#mocking-side-effects) for more details and an example. ### I have a huge mock class, and Microsoft Visual C++ runs out of memory when compiling it. What can I do? We've noticed that when the `/clr` compiler flag is used, Visual C++ uses 5~6 times as much memory when compiling a mock class. We suggest to avoid `/clr` when compiling native C++ mocks. asymptote-3.05/LspCpp/third_party/uri/deps/docs/_layouts/0000755000000000000000000000000015031566105022241 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/deps/docs/_layouts/default.html0000644000000000000000000000441715031566105024561 0ustar rootroot {% seo %}
    {{ content }}
    asymptote-3.05/LspCpp/third_party/uri/deps/docs/platforms.md0000644000000000000000000000164115031566105022735 0ustar rootroot# Supported Platforms GoogleTest requires a codebase and compiler compliant with the C++11 standard or newer. The GoogleTest code is officially supported on the following platforms. Operating systems or tools not listed below are community-supported. For community-supported platforms, patches that do not complicate the code may be considered. If you notice any problems on your platform, please file an issue on the [GoogleTest GitHub Issue Tracker](https://github.com/google/googletest/issues). Pull requests containing fixes are welcome! ### Operating systems * Linux * macOS * Windows ### Compilers * gcc 5.0+ * clang 5.0+ * MSVC 2015+ **macOS users:** Xcode 9.3+ provides clang 5.0+. ### Build systems * [Bazel](https://bazel.build/) * [CMake](https://cmake.org/) Bazel is the build system used by the team internally and in tests. CMake is supported on a best-effort basis and by the community. asymptote-3.05/LspCpp/third_party/uri/deps/docs/_sass/0000755000000000000000000000000015031566105021512 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/deps/docs/_sass/main.scss0000644000000000000000000000554315031566105023342 0ustar rootroot// Styles for GoogleTest docs website on GitHub Pages. // Color variables are defined in // https://github.com/pages-themes/primer/tree/master/_sass/primer-support/lib/variables $sidebar-width: 260px; body { display: flex; margin: 0; } .sidebar { background: $black; color: $text-white; flex-shrink: 0; height: 100vh; overflow: auto; position: sticky; top: 0; width: $sidebar-width; } .sidebar h1 { font-size: 1.5em; } .sidebar h2 { color: $gray-light; font-size: 0.8em; font-weight: normal; margin-bottom: 0.8em; padding-left: 2.5em; text-transform: uppercase; } .sidebar .header { background: $black; padding: 2em; position: sticky; top: 0; width: 100%; } .sidebar .header a { color: $text-white; text-decoration: none; } .sidebar .nav-toggle { display: none; } .sidebar .expander { cursor: pointer; display: none; height: 3em; position: absolute; right: 1em; top: 1.5em; width: 3em; } .sidebar .expander .arrow { border: solid $white; border-width: 0 3px 3px 0; display: block; height: 0.7em; margin: 1em auto; transform: rotate(45deg); transition: transform 0.5s; width: 0.7em; } .sidebar nav { width: 100%; } .sidebar nav ul { list-style-type: none; margin-bottom: 1em; padding: 0; &:last-child { margin-bottom: 2em; } a { text-decoration: none; } li { color: $text-white; padding-left: 2em; text-decoration: none; } li.active { background: $border-gray-darker; font-weight: bold; } li:hover { background: $border-gray-darker; } } .main { background-color: $bg-gray; width: calc(100% - #{$sidebar-width}); } .main .main-inner { background-color: $white; padding: 2em; } .main .footer { margin: 0; padding: 2em; } .main table th { text-align: left; } .main .callout { border-left: 0.25em solid $white; padding: 1em; a { text-decoration: underline; } &.important { background-color: $bg-yellow-light; border-color: $bg-yellow; color: $black; } &.note { background-color: $bg-blue-light; border-color: $text-blue; color: $text-blue; } &.tip { background-color: $green-000; border-color: $green-700; color: $green-700; } &.warning { background-color: $red-000; border-color: $text-red; color: $text-red; } } .main .good pre { background-color: $bg-green-light; } .main .bad pre { background-color: $red-000; } @media all and (max-width: 768px) { body { flex-direction: column; } .sidebar { height: auto; position: relative; width: 100%; } .sidebar .expander { display: block; } .sidebar nav { height: 0; overflow: hidden; } .sidebar .nav-toggle:checked { & ~ nav { height: auto; } & + .expander .arrow { transform: rotate(-135deg); } } .main { width: 100%; } } asymptote-3.05/LspCpp/third_party/uri/deps/docs/_data/0000755000000000000000000000000015031566105021452 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/deps/docs/_data/navigation.yml0000644000000000000000000000226015031566105024334 0ustar rootrootnav: - section: "Get Started" items: - title: "Supported Platforms" url: "/platforms.html" - title: "Quickstart: Bazel" url: "/quickstart-bazel.html" - title: "Quickstart: CMake" url: "/quickstart-cmake.html" - section: "Guides" items: - title: "GoogleTest Primer" url: "/primer.html" - title: "Advanced Topics" url: "/advanced.html" - title: "Mocking for Dummies" url: "/gmock_for_dummies.html" - title: "Mocking Cookbook" url: "/gmock_cook_book.html" - title: "Mocking Cheat Sheet" url: "/gmock_cheat_sheet.html" - section: "References" items: - title: "Testing Reference" url: "/reference/testing.html" - title: "Mocking Reference" url: "/reference/mocking.html" - title: "Assertions" url: "/reference/assertions.html" - title: "Matchers" url: "/reference/matchers.html" - title: "Actions" url: "/reference/actions.html" - title: "Testing FAQ" url: "/faq.html" - title: "Mocking FAQ" url: "/gmock_faq.html" - title: "Code Samples" url: "/samples.html" - title: "Using pkg-config" url: "/pkgconfig.html" - title: "Community Documentation" url: "/community_created_documentation.html" asymptote-3.05/LspCpp/third_party/uri/deps/CMakeLists.txt0000644000000000000000000000142015031566105022207 0ustar rootroot# Note: CMake support is community-based. The maintainers do not use CMake # internally. cmake_minimum_required(VERSION 3.5) if (POLICY CMP0048) cmake_policy(SET CMP0048 NEW) endif (POLICY CMP0048) project(googletest-distribution) set(GOOGLETEST_VERSION 1.11.0) if(NOT CYGWIN AND NOT MSYS AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL QNX) set(CMAKE_CXX_EXTENSIONS OFF) endif() enable_testing() include(CMakeDependentOption) include(GNUInstallDirs) #Note that googlemock target already builds googletest option(BUILD_GMOCK "Builds the googlemock subproject" ON) option(INSTALL_GTEST "Enable installation of googletest. (Projects embedding googletest may want to turn this OFF.)" ON) if(BUILD_GMOCK) add_subdirectory( googlemock ) else() add_subdirectory( googletest ) endif() asymptote-3.05/LspCpp/third_party/uri/deps/googlemock/0000755000000000000000000000000015031566105021600 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/deps/googlemock/include/0000755000000000000000000000000015031566105023223 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/deps/googlemock/include/gmock/0000755000000000000000000000000015031566105024323 5ustar rootrootasymptote-3.05/LspCpp/third_party/uri/deps/googlemock/include/gmock/gmock-matchers.h0000644000000000000000000062550615031566105027416 0ustar rootroot// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Google Mock - a framework for writing C++ mock classes. // // The MATCHER* family of macros can be used in a namespace scope to // define custom matchers easily. // // Basic Usage // =========== // // The syntax // // MATCHER(name, description_string) { statements; } // // defines a matcher with the given name that executes the statements, // which must return a bool to indicate if the match succeeds. Inside // the statements, you can refer to the value being matched by 'arg', // and refer to its type by 'arg_type'. // // The description string documents what the matcher does, and is used // to generate the failure message when the match fails. Since a // MATCHER() is usually defined in a header file shared by multiple // C++ source files, we require the description to be a C-string // literal to avoid possible side effects. It can be empty, in which // case we'll use the sequence of words in the matcher name as the // description. // // For example: // // MATCHER(IsEven, "") { return (arg % 2) == 0; } // // allows you to write // // // Expects mock_foo.Bar(n) to be called where n is even. // EXPECT_CALL(mock_foo, Bar(IsEven())); // // or, // // // Verifies that the value of some_expression is even. // EXPECT_THAT(some_expression, IsEven()); // // If the above assertion fails, it will print something like: // // Value of: some_expression // Expected: is even // Actual: 7 // // where the description "is even" is automatically calculated from the // matcher name IsEven. // // Argument Type // ============= // // Note that the type of the value being matched (arg_type) is // determined by the context in which you use the matcher and is // supplied to you by the compiler, so you don't need to worry about // declaring it (nor can you). This allows the matcher to be // polymorphic. For example, IsEven() can be used to match any type // where the value of "(arg % 2) == 0" can be implicitly converted to // a bool. In the "Bar(IsEven())" example above, if method Bar() // takes an int, 'arg_type' will be int; if it takes an unsigned long, // 'arg_type' will be unsigned long; and so on. // // Parameterizing Matchers // ======================= // // Sometimes you'll want to parameterize the matcher. For that you // can use another macro: // // MATCHER_P(name, param_name, description_string) { statements; } // // For example: // // MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } // // will allow you to write: // // EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); // // which may lead to this message (assuming n is 10): // // Value of: Blah("a") // Expected: has absolute value 10 // Actual: -9 // // Note that both the matcher description and its parameter are // printed, making the message human-friendly. // // In the matcher definition body, you can write 'foo_type' to // reference the type of a parameter named 'foo'. For example, in the // body of MATCHER_P(HasAbsoluteValue, value) above, you can write // 'value_type' to refer to the type of 'value'. // // We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P$n to // support multi-parameter matchers. // // Describing Parameterized Matchers // ================================= // // The last argument to MATCHER*() is a string-typed expression. The // expression can reference all of the matcher's parameters and a // special bool-typed variable named 'negation'. When 'negation' is // false, the expression should evaluate to the matcher's description; // otherwise it should evaluate to the description of the negation of // the matcher. For example, // // using testing::PrintToString; // // MATCHER_P2(InClosedRange, low, hi, // std::string(negation ? "is not" : "is") + " in range [" + // PrintToString(low) + ", " + PrintToString(hi) + "]") { // return low <= arg && arg <= hi; // } // ... // EXPECT_THAT(3, InClosedRange(4, 6)); // EXPECT_THAT(3, Not(InClosedRange(2, 4))); // // would generate two failures that contain the text: // // Expected: is in range [4, 6] // ... // Expected: is not in range [2, 4] // // If you specify "" as the description, the failure message will // contain the sequence of words in the matcher name followed by the // parameter values printed as a tuple. For example, // // MATCHER_P2(InClosedRange, low, hi, "") { ... } // ... // EXPECT_THAT(3, InClosedRange(4, 6)); // EXPECT_THAT(3, Not(InClosedRange(2, 4))); // // would generate two failures that contain the text: // // Expected: in closed range (4, 6) // ... // Expected: not (in closed range (2, 4)) // // Types of Matcher Parameters // =========================== // // For the purpose of typing, you can view // // MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } // // as shorthand for // // template // FooMatcherPk // Foo(p1_type p1, ..., pk_type pk) { ... } // // When you write Foo(v1, ..., vk), the compiler infers the types of // the parameters v1, ..., and vk for you. If you are not happy with // the result of the type inference, you can specify the types by // explicitly instantiating the template, as in Foo(5, // false). As said earlier, you don't get to (or need to) specify // 'arg_type' as that's determined by the context in which the matcher // is used. You can assign the result of expression Foo(p1, ..., pk) // to a variable of type FooMatcherPk. This // can be useful when composing matchers. // // While you can instantiate a matcher template with reference types, // passing the parameters by pointer usually makes your code more // readable. If, however, you still want to pass a parameter by // reference, be aware that in the failure message generated by the // matcher you will see the value of the referenced object but not its // address. // // Explaining Match Results // ======================== // // Sometimes the matcher description alone isn't enough to explain why // the match has failed or succeeded. For example, when expecting a // long string, it can be very helpful to also print the diff between // the expected string and the actual one. To achieve that, you can // optionally stream additional information to a special variable // named result_listener, whose type is a pointer to class // MatchResultListener: // // MATCHER_P(EqualsLongString, str, "") { // if (arg == str) return true; // // *result_listener << "the difference: " /// << DiffStrings(str, arg); // return false; // } // // Overloading Matchers // ==================== // // You can overload matchers with different numbers of parameters: // // MATCHER_P(Blah, a, description_string1) { ... } // MATCHER_P2(Blah, a, b, description_string2) { ... } // // Caveats // ======= // // When defining a new matcher, you should also consider implementing // MatcherInterface or using MakePolymorphicMatcher(). These // approaches require more work than the MATCHER* macros, but also // give you more control on the types of the value being matched and // the matcher parameters, which may leads to better compiler error // messages when the matcher is used wrong. They also allow // overloading matchers based on parameter types (as opposed to just // based on the number of parameters). // // MATCHER*() can only be used in a namespace scope as templates cannot be // declared inside of a local class. // // More Information // ================ // // To learn more about using these macros, please search for 'MATCHER' // on // https://github.com/google/googletest/blob/master/docs/gmock_cook_book.md // // This file also implements some commonly used argument matchers. More // matchers can be defined by the user implementing the // MatcherInterface interface if necessary. // // See googletest/include/gtest/gtest-matchers.h for the definition of class // Matcher, class MatcherInterface, and others. // IWYU pragma: private, include "gmock/gmock.h" // IWYU pragma: friend gmock/.* #ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ #define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ #include #include #include #include #include #include #include // NOLINT #include #include #include #include #include #include "gmock/internal/gmock-internal-utils.h" #include "gmock/internal/gmock-port.h" #include "gmock/internal/gmock-pp.h" #include "gtest/gtest.h" // MSVC warning C5046 is new as of VS2017 version 15.8. #if defined(_MSC_VER) && _MSC_VER >= 1915 #define GMOCK_MAYBE_5046_ 5046 #else #define GMOCK_MAYBE_5046_ #endif GTEST_DISABLE_MSC_WARNINGS_PUSH_( 4251 GMOCK_MAYBE_5046_ /* class A needs to have dll-interface to be used by clients of class B */ /* Symbol involving type with internal linkage not defined */) namespace testing { // To implement a matcher Foo for type T, define: // 1. a class FooMatcherImpl that implements the // MatcherInterface interface, and // 2. a factory function that creates a Matcher object from a // FooMatcherImpl*. // // The two-level delegation design makes it possible to allow a user // to write "v" instead of "Eq(v)" where a Matcher is expected, which // is impossible if we pass matchers by pointers. It also eases // ownership management as Matcher objects can now be copied like // plain values. // A match result listener that stores the explanation in a string. class StringMatchResultListener : public MatchResultListener { public: StringMatchResultListener() : MatchResultListener(&ss_) {} // Returns the explanation accumulated so far. std::string str() const { return ss_.str(); } // Clears the explanation accumulated so far. void Clear() { ss_.str(""); } private: ::std::stringstream ss_; GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener); }; // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION // and MUST NOT BE USED IN USER CODE!!! namespace internal { // The MatcherCastImpl class template is a helper for implementing // MatcherCast(). We need this helper in order to partially // specialize the implementation of MatcherCast() (C++ allows // class/struct templates to be partially specialized, but not // function templates.). // This general version is used when MatcherCast()'s argument is a // polymorphic matcher (i.e. something that can be converted to a // Matcher but is not one yet; for example, Eq(value)) or a value (for // example, "hello"). template class MatcherCastImpl { public: static Matcher Cast(const M& polymorphic_matcher_or_value) { // M can be a polymorphic matcher, in which case we want to use // its conversion operator to create Matcher. Or it can be a value // that should be passed to the Matcher's constructor. // // We can't call Matcher(polymorphic_matcher_or_value) when M is a // polymorphic matcher because it'll be ambiguous if T has an implicit // constructor from M (this usually happens when T has an implicit // constructor from any type). // // It won't work to unconditionally implicit_cast // polymorphic_matcher_or_value to Matcher because it won't trigger // a user-defined conversion from M to T if one exists (assuming M is // a value). return CastImpl(polymorphic_matcher_or_value, std::is_convertible>{}, std::is_convertible{}); } private: template static Matcher CastImpl(const M& polymorphic_matcher_or_value, std::true_type /* convertible_to_matcher */, std::integral_constant) { // M is implicitly convertible to Matcher, which means that either // M is a polymorphic matcher or Matcher has an implicit constructor // from M. In both cases using the implicit conversion will produce a // matcher. // // Even if T has an implicit constructor from M, it won't be called because // creating Matcher would require a chain of two user-defined conversions // (first to create T from M and then to create Matcher from T). return polymorphic_matcher_or_value; } // M can't be implicitly converted to Matcher, so M isn't a polymorphic // matcher. It's a value of a type implicitly convertible to T. Use direct // initialization to create a matcher. static Matcher CastImpl(const M& value, std::false_type /* convertible_to_matcher */, std::true_type /* convertible_to_T */) { return Matcher(ImplicitCast_(value)); } // M can't be implicitly converted to either Matcher or T. Attempt to use // polymorphic matcher Eq(value) in this case. // // Note that we first attempt to perform an implicit cast on the value and // only fall back to the polymorphic Eq() matcher afterwards because the // latter calls bool operator==(const Lhs& lhs, const Rhs& rhs) in the end // which might be undefined even when Rhs is implicitly convertible to Lhs // (e.g. std::pair vs. std::pair). // // We don't define this method inline as we need the declaration of Eq(). static Matcher CastImpl(const M& value, std::false_type /* convertible_to_matcher */, std::false_type /* convertible_to_T */); }; // This more specialized version is used when MatcherCast()'s argument // is already a Matcher. This only compiles when type T can be // statically converted to type U. template class MatcherCastImpl> { public: static Matcher Cast(const Matcher& source_matcher) { return Matcher(new Impl(source_matcher)); } private: class Impl : public MatcherInterface { public: explicit Impl(const Matcher& source_matcher) : source_matcher_(source_matcher) {} // We delegate the matching logic to the source matcher. bool MatchAndExplain(T x, MatchResultListener* listener) const override { using FromType = typename std::remove_cv::type>::type>::type; using ToType = typename std::remove_cv::type>::type>::type; // Do not allow implicitly converting base*/& to derived*/&. static_assert( // Do not trigger if only one of them is a pointer. That implies a // regular conversion and not a down_cast. (std::is_pointer::type>::value != std::is_pointer::type>::value) || std::is_same::value || !std::is_base_of::value, "Can't implicitly convert from to "); // Do the cast to `U` explicitly if necessary. // Otherwise, let implicit conversions do the trick. using CastType = typename std::conditional::value, T&, U>::type; return source_matcher_.MatchAndExplain(static_cast(x), listener); } void DescribeTo(::std::ostream* os) const override { source_matcher_.DescribeTo(os); } void DescribeNegationTo(::std::ostream* os) const override { source_matcher_.DescribeNegationTo(os); } private: const Matcher source_matcher_; }; }; // This even more specialized version is used for efficiently casting // a matcher to its own type. template class MatcherCastImpl> { public: static Matcher Cast(const Matcher& matcher) { return matcher; } }; // Template specialization for parameterless Matcher. template class MatcherBaseImpl { public: MatcherBaseImpl() = default; template operator ::testing::Matcher() const { // NOLINT(runtime/explicit) return ::testing::Matcher(new typename Derived::template gmock_Impl()); } }; // Template specialization for Matcher with parameters. template